ZGlmZiAtLWdpdCBhLy5jbGFuZy1mb3JtYXQgYi8uY2xhbmctZm9ybWF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MmVlZjgKLS0tIC9kZXYvbnVsbAorKysgYi8uY2xhbmctZm9ybWF0CkBAIC0wLDAgKzEsNTYgQEAKKy0tLQorTGFuZ3VhZ2U6ICAgICAgICBDcHAKKyMgQmFzZWRPblN0eWxlOiAgTExWTQorQWNjZXNzTW9kaWZpZXJPZmZzZXQ6IC0yCitDb25zdHJ1Y3RvckluaXRpYWxpemVySW5kZW50V2lkdGg6IDIKK0FsaWduRXNjYXBlZE5ld2xpbmVzTGVmdDogZmFsc2UKK0FsaWduVHJhaWxpbmdDb21tZW50czogdHJ1ZQorQWxsb3dBbGxQYXJhbWV0ZXJzT2ZEZWNsYXJhdGlvbk9uTmV4dExpbmU6IGZhbHNlCitBbGxvd1Nob3J0QmxvY2tzT25BU2luZ2xlTGluZTogZmFsc2UKK0FsbG93U2hvcnRJZlN0YXRlbWVudHNPbkFTaW5nbGVMaW5lOiBmYWxzZQorQWxsb3dTaG9ydExvb3BzT25BU2luZ2xlTGluZTogZmFsc2UKK0FsbG93U2hvcnRGdW5jdGlvbnNPbkFTaW5nbGVMaW5lOiBJbmxpbmUKK0Fsd2F5c0JyZWFrVGVtcGxhdGVEZWNsYXJhdGlvbnM6IHRydWUKK0Fsd2F5c0JyZWFrQmVmb3JlTXVsdGlsaW5lU3RyaW5nczogdHJ1ZQorQnJlYWtCZWZvcmVCaW5hcnlPcGVyYXRvcnM6IHRydWUKK0JyZWFrQmVmb3JlVGVybmFyeU9wZXJhdG9yczogdHJ1ZQorQnJlYWtDb25zdHJ1Y3RvckluaXRpYWxpemVyc0JlZm9yZUNvbW1hOiBmYWxzZQorQmluUGFja1BhcmFtZXRlcnM6IGZhbHNlCitDb2x1bW5MaW1pdDogICAgIDEwMAorQ29uc3RydWN0b3JJbml0aWFsaXplckFsbE9uT25lTGluZU9yT25lUGVyTGluZTogdHJ1ZQorRGVyaXZlUG9pbnRlckFsaWdubWVudDogZmFsc2UKK0luZGVudENhc2VMYWJlbHM6IGZhbHNlCitJbmRlbnRXcmFwcGVkRnVuY3Rpb25OYW1lczogZmFsc2UKK0luZGVudEZ1bmN0aW9uRGVjbGFyYXRpb25BZnRlclR5cGU6IGZhbHNlCitNYXhFbXB0eUxpbmVzVG9LZWVwOiAxCitLZWVwRW1wdHlMaW5lc0F0VGhlU3RhcnRPZkJsb2NrczogdHJ1ZQorTmFtZXNwYWNlSW5kZW50YXRpb246IE5vbmUKK09iakNTcGFjZUFmdGVyUHJvcGVydHk6IGZhbHNlCitPYmpDU3BhY2VCZWZvcmVQcm90b2NvbExpc3Q6IHRydWUKK1BlbmFsdHlCcmVha0JlZm9yZUZpcnN0Q2FsbFBhcmFtZXRlcjogMTkwCitQZW5hbHR5QnJlYWtDb21tZW50OiAzMDAKK1BlbmFsdHlCcmVha1N0cmluZzogMTAwMDAKK1BlbmFsdHlCcmVha0ZpcnN0TGVzc0xlc3M6IDEyMAorUGVuYWx0eUV4Y2Vzc0NoYXJhY3RlcjogMTAwMDAwMAorUGVuYWx0eVJldHVyblR5cGVPbkl0c093bkxpbmU6IDEyMDAKK1BvaW50ZXJBbGlnbm1lbnQ6IExlZnQKK1NwYWNlc0JlZm9yZVRyYWlsaW5nQ29tbWVudHM6IDEKK0NwcDExQnJhY2VkTGlzdFN0eWxlOiB0cnVlCitTdGFuZGFyZDogICAgICAgIEF1dG8KK0luZGVudFdpZHRoOiAgICAgMgorVGFiV2lkdGg6ICAgICAgICA0CitVc2VUYWI6ICAgICAgICAgIE5ldmVyCitCcmVha0JlZm9yZUJyYWNlczogQXR0YWNoCitTcGFjZXNJblBhcmVudGhlc2VzOiBmYWxzZQorU3BhY2VzSW5BbmdsZXM6ICBmYWxzZQorU3BhY2VJbkVtcHR5UGFyZW50aGVzZXM6IGZhbHNlCitTcGFjZXNJbkNTdHlsZUNhc3RQYXJlbnRoZXNlczogZmFsc2UKK1NwYWNlc0luQ29udGFpbmVyTGl0ZXJhbHM6IHRydWUKK1NwYWNlQmVmb3JlQXNzaWdubWVudE9wZXJhdG9yczogdHJ1ZQorQ29udGludWF0aW9uSW5kZW50V2lkdGg6IDQKK0NvbW1lbnRQcmFnbWFzOiAgJ14gSVdZVSBwcmFnbWE6JworRm9yRWFjaE1hY3JvczogICBbIGZvcmVhY2gsIFFfRk9SRUFDSCwgQk9PU1RfRk9SRUFDSCBdCitTcGFjZUJlZm9yZVBhcmVuczogQ29udHJvbFN0YXRlbWVudHMKK0Rpc2FibGVGb3JtYXQ6ICAgZmFsc2UKKy4uLgorCmRpZmYgLS1naXQgYS8uZG9ja2VyaWdub3JlIGIvLmRvY2tlcmlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDJlY2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvLmRvY2tlcmlnbm9yZQpAQCAtMCwwICsxIEBACisuZ2l0LwpkaWZmIC0tZ2l0IGEvLmVkaXRvcmNvbmZpZyBiLy5lZGl0b3Jjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzYxMTc2MgotLS0gL2Rldi9udWxsCisrKyBiLy5lZGl0b3Jjb25maWcKQEAgLTAsMCArMSwxMTIgQEAKKyMKKyMjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMjCisjIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyMKKyMjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIyB1bmRlciB0aGUgTGljZW5zZS4KKyMjCisjCisKKyMgRWRpdG9yQ29uZmlnOiBodHRwOi8vZWRpdG9yY29uZmlnLm9yZworIyBzZWUgZG9jL2NvZGluZ19zdGFuZGFyZHMubWQKKworcm9vdCA9IHRydWUKKworWypdCitlbmRfb2ZfbGluZSA9IGxmCitjaGFyc2V0ID0gdXRmLTgKK3RyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWUKK2luc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZQorCisjIEFjdGlvblNjcmlwdAorIyBbKi5hc10KKworIyBDCisjIFsqLmNdCisKKyMgQysrCitbKi5jcHBdCitpbmRlbnRfc3R5bGUgPSBzcGFjZQoraW5kZW50X3NpemUgPSAyCisKKyMgQy1TaGFycAorIyBbKi5jc10KKworIyBECisjIFsqLmRdCisKKyMgRXJsYW5nCisjIFsqLmVybF0KKworIyBHby1sYW5nCitbKi5nb10KK2luZGVudF9zdHlsZSA9IHRhYgoraW5kZW50X3NpemUgPSA4CisKKyMgQyBoZWFkZXIgZmlsZXMKKyMgWyouaF0KKworIyBIYXNrZWxsCisjIFsqLmhzXQorCisjIEhheGUKKyMgWyouaHhdCisKKyMgSmF2YQorIyBbKi5qYXZhXQorCisjIEphdmFzY3JpcHQKK1sqLmpzXQoraW5kZW50X3N0eWxlID0gc3BhY2UKK2luZGVudF9zaXplID0gMgorCisjIEpTT04KK1sqLmpzb25dCitpbmRlbnRfc3R5bGUgPSBzcGFjZQoraW5kZW50X3NpemUgPSAyCisKKyMgTHVhCisjIFsqLmx1YV0KKworWyoubWFya2Rvd25dCitpbmRlbnRfc3R5bGUgPSBzcGFjZQordHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2UKKworWyoubWRdCitpbmRlbnRfc3R5bGUgPSBzcGFjZQordHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2UKKworIyBPQ2FtbAorIyBbKi5tbF0KKworIyBEZWxwaGkgUGFzY2FsCisjIFsqLnBhc10KKworIyBQSFAKKyMgWyoucGhwXQorCisjIFBlcmwKKyMgWyoucG1dCisKKyMgUHl0aG9uCisjIFsqLnB5XQorCisjIFJ1YnkKKyMgWyoucmJdCisKKyMgVHlwZXNjcmlwdAorIyBbKi50c10KKworIyBYTUwKKyMgWyoueG1sXQpkaWZmIC0tZ2l0IGEvLmVzbGludGlnbm9yZSBiLy5lc2xpbnRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRlMmRiYQotLS0gL2Rldi9udWxsCisrKyBiLy5lc2xpbnRpZ25vcmUKQEAgLTAsMCArMSw5IEBACisjIFRPRE86IFVzZSBlc2xpbnQgb24ganMgbGliIGFuZCBnZW5lcmF0ZWQgY29kZQorCisjIElnbm9yZSBsaWIvanMgZm9yIG5vdywgd2hpY2ggdXNlcyBqc2hpbnQgY3VycmVudGx5CitsaWIvanMvKgorIyBJZ25vcmUgYWxsIGdlbmVyYXRlZCBjb2RlIGZvciBub3cKKyoqL2dlbi0qCisKKyMgRG9uJ3QgbGludCBuZXN0ZWQgbm9kZV9tb2R1bGVzCisqKi9ub2RlX21vZHVsZXMKZGlmZiAtLWdpdCBhLy5lc2xpbnRyYy5qc29uIGIvLmVzbGludHJjLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFhZTgyMAotLS0gL2Rldi9udWxsCisrKyBiLy5lc2xpbnRyYy5qc29uCkBAIC0wLDAgKzEsMjQgQEAKK3sKKyAgImVudiI6IHsKKyAgICAiZXM2IjogdHJ1ZSwKKyAgICAibm9kZSI6IHRydWUKKyAgfSwKKyAgImV4dGVuZHMiOiBbCisgICAgImVzbGludDpyZWNvbW1lbmRlZCIsCisgICAgInBsdWdpbjpwcmV0dGllci9yZWNvbW1lbmRlZCIKKyAgXSwKKyAgInBhcnNlck9wdGlvbnMiOiB7CisgICAgImVjbWFWZXJzaW9uIjogMjAxNworICB9LAorICAicnVsZXMiOiB7CisgICAgIm5vLWNvbnNvbGUiOiAib2ZmIiwKKyAgICAibm8tdmFyIjogImVycm9yIiwKKyAgICAicHJlZmVyLWNvbnN0IjogImVycm9yIiwKKyAgICAibm8tY29uc3RhbnQtY29uZGl0aW9uIjogWworICAgICAgImVycm9yIiwKKyAgICAgIHsKKyAgICAgICAgImNoZWNrTG9vcHMiOiBmYWxzZQorICAgICAgfQorICAgIF0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvLmdpdGF0dHJpYnV0ZXMgYi8uZ2l0YXR0cmlidXRlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzZhNDU4Ci0tLSAvZGV2L251bGwKKysrIGIvLmdpdGF0dHJpYnV0ZXMKQEAgLTAsMCArMSBAQAorKiB0ZXh0PWF1dG8KZGlmZiAtLWdpdCBhLy5naXRodWIvc3RhbGUueW1sIGIvLmdpdGh1Yi9zdGFsZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkNGFmYgotLS0gL2Rldi9udWxsCisrKyBiLy5naXRodWIvc3RhbGUueW1sCkBAIC0wLDAgKzEsNTkgQEAKKyMgQ29uZmlndXJhdGlvbiBmb3IgcHJvYm90LXN0YWxlIC0gaHR0cHM6Ly9naXRodWIuY29tL3Byb2JvdC9zdGFsZQorCisjIE51bWJlciBvZiBkYXlzIG9mIGluYWN0aXZpdHkgYmVmb3JlIGFuIElzc3VlIG9yIFB1bGwgUmVxdWVzdCBiZWNvbWVzIHN0YWxlCitkYXlzVW50aWxTdGFsZTogNjAKKworIyBOdW1iZXIgb2YgZGF5cyBvZiBpbmFjdGl2aXR5IGJlZm9yZSBhbiBJc3N1ZSBvciBQdWxsIFJlcXVlc3Qgd2l0aCB0aGUgc3RhbGUgbGFiZWwgaXMgY2xvc2VkLgorIyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZS4gSWYgZGlzYWJsZWQsIGlzc3VlcyBzdGlsbCBuZWVkIHRvIGJlIGNsb3NlZCBtYW51YWxseSwgYnV0IHdpbGwgcmVtYWluIG1hcmtlZCBhcyBzdGFsZS4KK2RheXNVbnRpbENsb3NlOiA3CisKKyMgSXNzdWVzIG9yIFB1bGwgUmVxdWVzdHMgd2l0aCB0aGVzZSBsYWJlbHMgd2lsbCBuZXZlciBiZSBjb25zaWRlcmVkIHN0YWxlLiBTZXQgdG8gYFtdYCB0byBkaXNhYmxlCitleGVtcHRMYWJlbHM6CisgIC0gRG8gTm90IE1lcmdlCisgIC0gYmxvY2tlZAorICAtIHBpbm5lZAorICAtIHNlY3VyaXR5CisgIC0gIltTdGF0dXNdIE1heWJlIExhdGVyIgorCisjIFNldCB0byB0cnVlIHRvIGlnbm9yZSBpc3N1ZXMgaW4gYSBwcm9qZWN0IChkZWZhdWx0cyB0byBmYWxzZSkKK2V4ZW1wdFByb2plY3RzOiBmYWxzZQorCisjIFNldCB0byB0cnVlIHRvIGlnbm9yZSBpc3N1ZXMgaW4gYSBtaWxlc3RvbmUgKGRlZmF1bHRzIHRvIGZhbHNlKQorZXhlbXB0TWlsZXN0b25lczogZmFsc2UKKworIyBMYWJlbCB0byB1c2Ugd2hlbiBtYXJraW5nIGFzIHN0YWxlCitzdGFsZUxhYmVsOiB3b250Zml4CisKKyMgQ29tbWVudCB0byBwb3N0IHdoZW4gbWFya2luZyBhcyBzdGFsZS4gU2V0IHRvIGBmYWxzZWAgdG8gZGlzYWJsZQorbWFya0NvbW1lbnQ6ID4KKyAgVGhpcyBpc3N1ZSBoYXMgYmVlbiBhdXRvbWF0aWNhbGx5IG1hcmtlZCBhcyBzdGFsZSBiZWNhdXNlIGl0IGhhcyBub3QgaGFkCisgIHJlY2VudCBhY3Rpdml0eS4gSXQgd2lsbCBiZSBjbG9zZWQgaW4gNyBkYXlzIGlmIG5vIGZ1cnRoZXIgYWN0aXZpdHkgb2NjdXJzLgorICBUaGFuayB5b3UgZm9yIHlvdXIgY29udHJpYnV0aW9ucy4KKworIyBDb21tZW50IHRvIHBvc3Qgd2hlbiByZW1vdmluZyB0aGUgc3RhbGUgbGFiZWwuCit1bm1hcmtDb21tZW50OiA+CisgIFRoaXMgaXNzdWUgaXMgbm8gbG9uZ2VyIHN0YWxlLgorICBUaGFuayB5b3UgZm9yIHlvdXIgY29udHJpYnV0aW9ucy4KKworIyBDb21tZW50IHRvIHBvc3Qgd2hlbiBjbG9zaW5nIGEgc3RhbGUgSXNzdWUgb3IgUHVsbCBSZXF1ZXN0LgorY2xvc2VDb21tZW50OiA+CisgIFRoaXMgaXNzdWUgaGFzIGJlZW4gYXV0b21hdGljYWxseSBjbG9zZWQgZHVlIHRvIGluYWN0aXZpdHkuCisgIFRoYW5rIHlvdSBmb3IgeW91ciBjb250cmlidXRpb25zLgorCisjIExpbWl0IHRoZSBudW1iZXIgb2YgYWN0aW9ucyBwZXIgaG91ciwgZnJvbSAxLTMwLiBEZWZhdWx0IGlzIDMwCitsaW1pdFBlclJ1bjogMzAKKworIyBMaW1pdCB0byBvbmx5IGBpc3N1ZXNgIG9yIGBwdWxsc2AKKyMgb25seTogaXNzdWVzCisKKyMgT3B0aW9uYWxseSwgc3BlY2lmeSBjb25maWd1cmF0aW9uIHNldHRpbmdzIHRoYXQgYXJlIHNwZWNpZmljIHRvIGp1c3QgJ2lzc3Vlcycgb3IgJ3B1bGxzJzoKKyMgcHVsbHM6CisjICAgZGF5c1VudGlsU3RhbGU6IDMwCisjICAgbWFya0NvbW1lbnQ6ID4KKyMgICAgIFRoaXMgcHVsbCByZXF1ZXN0IGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgbWFya2VkIGFzIHN0YWxlIGJlY2F1c2UgaXQgaGFzIG5vdCBoYWQKKyMgICAgIHJlY2VudCBhY3Rpdml0eS4gSXQgd2lsbCBiZSBjbG9zZWQgaWYgbm8gZnVydGhlciBhY3Rpdml0eSBvY2N1cnMuIFRoYW5rIHlvdQorIyAgICAgZm9yIHlvdXIgY29udHJpYnV0aW9ucy4KKworIyBpc3N1ZXM6CisjICAgZXhlbXB0TGFiZWxzOgorIyAgICAgLSBjb25maXJtZWQKZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDgwNTg4ODAuLmIzYTU5MjAgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMSwxNDUgKzEsMjU4IEBACi0vTWFrZWZpbGUKLS9NYWtlZmlsZS5pbgorIyBnZW5lcmljIGlnbm9yZXMKKyoubGEKKyoubG8KKyoubworKi5kZXBzCisqLmRpcnN0YW1wCisqLmxpYnMKKyoubG9nCisqLnRycworKi5zdW8KKyoucHljCisqLmNhY2hlCisqLnVzZXIKKyouaXBjaAorKi5zZGYKKyouamFyCisqLmV4ZQorKi5kbGwKKypfUmVTaGFycGVyKgorKi5vcGVuc2RmCisqLnN3cAorKi5oaQorKn4KK3RhZ3MKKworLipwcm9qZWN0CisuY2xhc3NwYXRoCisuZHViCisuc2V0dGluZ3MKKy5jaGVja3N0eWxlCitqdW5pdCoucHJvcGVydGllcworLmlkZWEKKyouaW1sCisqLmlwcgorKi5pd3MKK2dlbi0qCitNYWtlZmlsZQorTWFrZWZpbGUuaW4KK2FjbG9jYWwubTQKK2FjaW5jbHVkZS5tNAorYXBhY2hlLXRocmlmdC10ZXN0LWxpYnJhcnkKK2F1dG9tNHRlLmNhY2hlCitjbWFrZS0qCitkdWIuc2VsZWN0aW9ucy5qc29uCitsaWJhcGFjaGUtdGhyaWZ0LmEKK25vZGVfbW9kdWxlcworY29tcGlsZQordGVzdC1kcml2ZXIKK2VybF9jcmFzaC5kdW1wCitwcm9qZWN0LmxvY2suanNvbgorCisuc29uYXIKKy5EU19TdG9yZQorLnN2bgorLnZhZ3JhbnQKKy52c2NvZGUKKy52cworCiAvYWNsb2NhbC9saWJ0b29sLm00Ci0vYWNsb2NhbC9sdG9wdGlvbnMubTQKLS9hY2xvY2FsL2x0c3VnYXIubTQKLS9hY2xvY2FsL2x0dmVyc2lvbi5tNAotL2FjbG9jYWwvbHR+b2Jzb2xldGUubTQKLS9hY2xvY2FsLm00Ci0vYXV0b200dGUuY2FjaGUKKy9hY2xvY2FsL2x0Ki5tNAogL2F1dG9zY2FuLmxvZwotL2NvbXBpbGVyL2NwcC8uZGVwcwotL2NvbXBpbGVyL2NwcC9NYWtlZmlsZQotL2NvbXBpbGVyL2NwcC9NYWtlZmlsZS5pbgorL2F1dG9zY2FuLSoubG9nCisvY21ha2VfKgorL2NvbXBpbGVyL2NwcC9jb21waWxlci5WQy5kYgorL2NvbXBpbGVyL2NwcC9jb21waWxlci5WQy5WQy5vcGVuZGIKKy9jb21waWxlci9jcHAvdGVzdC9wbHVnaW4vdF9jcHBfZ2VuZXJhdG9yLmNjCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9jb25zdGFudHMuY3BwCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9jb25zdGFudHMuaAorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fdHlwZXMuY3BwCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5oCisvY29tcGlsZXIvY3BwL3Rlc3QvKnRlc3QKKy9jb21waWxlci9jcHAvdGVzdC90aHJpZnQtZ2VuLSoKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnQtYm9vdHN0cmFwCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL2dlbi5zdGFtcAorL2NvbXBpbGVyL2NwcC9EZWJ1ZworL2NvbXBpbGVyL2NwcC9SZWxlYXNlCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbGlicGFyc2UuYQorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdGwuY2MKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnR5LmNjCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0eS5oaAorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvdmVyc2lvbi5oCiAvY29tcGlsZXIvY3BwL3RocmlmdAotL2NvbXBpbGVyL2NwcC8qLm8KLS9jb21waWxlci9jcHAvKi5hCiAvY29tcGlsZXIvY3BwL3RocmlmdGwuY2MKIC9jb21waWxlci9jcHAvdGhyaWZ0eS5jYworL2NvbXBpbGVyL2NwcC9sZXgueXl0aHJpZnRsLmNjCiAvY29tcGlsZXIvY3BwL3RocmlmdHkuaAotL2NvbXBpbGVyL2NwcC92ZXJzaW9uLmgKKy9jb21waWxlci9jcHAvdGhyaWZ0eS5oaAorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3ZlcnNpb24uaAogL2NvbmZpZy4qCiAvY29uZmlndXJlCiAvY29uZmlndXJlLmxpbmVubwogL2NvbmZpZ3VyZS5zY2FuCisvY29udHJpYi8udmFncmFudC8KKy9jb250cmliL2ZiMzAzL2NvbmZpZy5jYWNoZQorL2NvbnRyaWIvZmIzMDMvY29uZmlnLmxvZworL2NvbnRyaWIvZmIzMDMvY29uZmlnLnN0YXR1cworL2NvbnRyaWIvZmIzMDMvY29uZmlndXJlCisvY29udHJpYi9mYjMwMy9jcHAvbGliZmIzMDMuYQorL2NvbnRyaWIvZmIzMDMvamF2YS9idWlsZC8KKy9jb250cmliL2ZiMzAzL3B5L2J1aWxkLworL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDMvRmFjZWJvb2tTZXJ2aWNlLXJlbW90ZQorL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDMvRmFjZWJvb2tTZXJ2aWNlLnB5CisvY29udHJpYi9mYjMwMy9weS9mYjMwMy9fX2luaXRfXy5weQorL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDMvY29uc3RhbnRzLnB5CisvY29udHJpYi9mYjMwMy9weS9mYjMwMy90dHlwZXMucHkKIC9kZXBjb21wCi0vaWYvTWFrZWZpbGUKLS9pZi9NYWtlZmlsZS5pbgogL2luc3RhbGwtc2gKLS9saWIvTWFrZWZpbGUKLS9saWIvTWFrZWZpbGUuaW4KLS9saWIvY3BwLy5kZXBzCi0vbGliL2NwcC8ubGlicwotL2xpYi9jcHAvTWFrZWZpbGUKLS9saWIvY3BwL01ha2VmaWxlLmluCi0vbGliL2NwcC90ZXN0Ly5kZXBzCi0vbGliL2NwcC90ZXN0Ly5saWJzCi0vbGliL2NwcC90ZXN0L2dlbi1jcHAKLS9saWIvY3BwL3Rlc3QvTWFrZWZpbGUKLS9saWIvY3BwL3Rlc3QvTWFrZWZpbGUuaW4KKy9saWIvY2wvYmFja3BvcnQtdXBkYXRlLnppcAorL2xpYi9jbC9saWIKKy9saWIvY2wvcnVuLXRlc3RzCisvbGliL2NsL3F1aWNrbGlzcC5saXNwCisvbGliL2NsL2V4dGVybmFscy8KKy9saWIvY2wvcnVuLXRlc3RzCisvbGliL2NsL3F1aWNrbGlzcC8KKy9saWIvY3BwL0RlYnVnLworL2xpYi9jcHAvRGVidWctbXQvCisvbGliL2NwcC9SZWxlYXNlLworL2xpYi9jcHAvUmVsZWFzZS1tdC8KKy9saWIvY3BwL3NyYy90aHJpZnQvcXQvbW9jX1RRVGNwU2VydmVyLmNwcAorL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9tb2NfX1RRVGNwU2VydmVyLmNwcAorL2xpYi9jcHAvc3JjL3RocmlmdC9jb25maWcuaAorL2xpYi9jcHAvc3JjL3RocmlmdC9zdGFtcC1oMgogL2xpYi9jcHAvdGVzdC9CZW5jaG1hcmsKIC9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xzVGVzdAorL2xpYi9jcHAvdGVzdC9Bbm5vdGF0aW9uVGVzdAogL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdAorL2xpYi9jcHAvdGVzdC9EZW5zZVByb3RvVGVzdAorL2xpYi9jcHAvdGVzdC9FbnVtVGVzdAogL2xpYi9jcHAvdGVzdC9KU09OUHJvdG9UZXN0CiAvbGliL2NwcC90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0CisvbGliL2NwcC90ZXN0L1NlY3VyaXR5VGVzdAogL2xpYi9jcHAvdGVzdC9TcGVjaWFsaXphdGlvblRlc3QKKy9saWIvY3BwL3Rlc3QvUmVjdXJzaXZlVGVzdAogL2xpYi9jcHAvdGVzdC9SZWZsZWN0aW9uVGVzdAorL2xpYi9jcHAvdGVzdC9SZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QKIC9saWIvY3BwL3Rlc3QvVEZEVHJhbnNwb3J0VGVzdAogL2xpYi9jcHAvdGVzdC9URmlsZVRyYW5zcG9ydFRlc3QKKy9saWIvY3BwL3Rlc3QvVEludGVycnVwdFRlc3QKKy9saWIvY3BwL3Rlc3QvVE5vbmJsb2NraW5nU2VydmVyVGVzdAorL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0CiAvbGliL2NwcC90ZXN0L1RQaXBlZFRyYW5zcG9ydFRlc3QKKy9saWIvY3BwL3Rlc3QvVFNlcnZlckludGVncmF0aW9uVGVzdAorL2xpYi9jcHAvdGVzdC9UU29ja2V0SW50ZXJydXB0VGVzdAogL2xpYi9jcHAvdGVzdC9UcmFuc3BvcnRUZXN0CiAvbGliL2NwcC90ZXN0L1VuaXRUZXN0cwogL2xpYi9jcHAvdGVzdC9abGliVGVzdAorL2xpYi9jcHAvdGVzdC9PcGVuU1NMTWFudWFsSW5pdFRlc3QKKy9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3lfdGVzdAorL2xpYi9jcHAvdGVzdC9saW5rX3Rlc3QKKy9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yX3Rlc3QKIC9saWIvY3BwL3Rlc3QvdGVzdHMueG1sCi0vbGliL2NwcC90ZXN0LyoubGEKLS9saWIvY3BwL3Rlc3QvKi5sbwotL2xpYi9jcHAvdGVzdC8qLm8KIC9saWIvY3BwL2NvbmN1cnJlbmN5X3Rlc3QKLS9saWIvY3BwLyoubwotL2xpYi9jcHAvKi5sYQotL2xpYi9jcHAvKi5sbwogL2xpYi9jcHAvKi5wYwotL2xpYi9jc2hhcnAvVGhyaWZ0LmRsbAorL2xpYi9jcHAveDY0L0RlYnVnLworL2xpYi9jcHAveDY0L0RlYnVnLW10LworL2xpYi9jcHAveDY0L1JlbGVhc2UKKy9saWIvY3BwL3g2NC9SZWxlYXNlLW10CiAvbGliL2NfZ2xpYi8qLmdjZGEKIC9saWIvY19nbGliLyouZ2NubwotL2xpYi9jX2dsaWIvKi5sYQotL2xpYi9jX2dsaWIvKi5sbwogL2xpYi9jX2dsaWIvKi5sb1QKLS9saWIvY19nbGliLyoubwotL2xpYi9jX2dsaWIvLmRlcHMKLS9saWIvY19nbGliLy5saWJzCi0vbGliL2NfZ2xpYi9NYWtlZmlsZS5pbgotL2xpYi9jX2dsaWIvTWFrZWZpbGUKLS9saWIvY19nbGliL3Rlc3QvKi5vCi0vbGliL2NfZ2xpYi90ZXN0LyoubG8KKy9saWIvY19nbGliL3NyYy90aHJpZnQvY29uZmlnLmgKKy9saWIvY19nbGliL3NyYy90aHJpZnQvc3RhbXAtaDMKKy9saWIvY19nbGliL3Rlc3QvKi5nY25vCiAvbGliL2NfZ2xpYi90ZXN0L3Rlc3R3cmFwcGVyLnNoCiAvbGliL2NfZ2xpYi90ZXN0L3Rlc3R3cmFwcGVyLXRlc3QqCi0vbGliL2NfZ2xpYi90ZXN0Ly5kZXBzCi0vbGliL2NfZ2xpYi90ZXN0Ly5saWJzCi0vbGliL2NfZ2xpYi90ZXN0L2dlbi1jcHAvCi0vbGliL2NfZ2xpYi90ZXN0L2dlbi1jX2dsaWIKLS9saWIvY19nbGliL3Rlc3QvTWFrZWZpbGUKLS9saWIvY19nbGliL3Rlc3QvTWFrZWZpbGUuaW4KKy9saWIvY19nbGliL3Rlc3QvdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uCisvbGliL2NfZ2xpYi90ZXN0L3Rlc3RiaW5hcnlwcm90b2NvbAorL2xpYi9jX2dsaWIvdGVzdC90ZXN0Y29tcGFjdHByb3RvY29sCisvbGliL2NfZ2xpYi90ZXN0L3Rlc3RidWZmZXJlZHRyYW5zcG9ydAorL2xpYi9jX2dsaWIvdGVzdC90ZXN0Y29udGFpbmVydGVzdAorL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZGVidWdwcm90bworL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZmR0cmFuc3BvcnQKKy9saWIvY19nbGliL3Rlc3QvdGVzdGZyYW1lZHRyYW5zcG9ydAorL2xpYi9jX2dsaWIvdGVzdC90ZXN0bWVtb3J5YnVmZmVyCisvbGliL2NfZ2xpYi90ZXN0L3Rlc3RvcHRpb25hbHJlcXVpcmVkCisvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXQKKy9saWIvY19nbGliL3Rlc3QvdGVzdHNpbXBsZXNlcnZlcgorL2xpYi9jX2dsaWIvdGVzdC90ZXN0c3RydWN0CisvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0CisvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0Y2xpZW50CisvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0cmFuc3BvcnRzb2NrZXQKKy9saWIvY19nbGliL3Rlc3QvdGVzdHNlcmlhbGl6YXRpb24KIC9saWIvY19nbGliL3RocmlmdGMucGMKIC9saWIvY19nbGliL3RocmlmdF9jX2dsaWIucGMKLS9saWIvY3NoYXJwL01ha2VmaWxlCi0vbGliL2NzaGFycC9NYWtlZmlsZS5pbgotL2xpYi9lcmwvLmdlbmVyYXRlZAorL2xpYi9jc2hhcnAvKiovYmluLworL2xpYi9jc2hhcnAvKiovb2JqLworL2xpYi9jc2hhcnAvc3JjL3BhY2thZ2VzCisvbGliL2QvdGVzdC8qLnBlbQorL2xpYi9kL2xpYnRocmlmdGQqLmEKKy9saWIvZC90ZXN0L2FzeW5jX3Rlc3QKKy9saWIvZC90ZXN0L2NsaWVudF9wb29sX3Rlc3QKKy9saWIvZC90ZXN0L3NlcmlhbGl6YXRpb25fYmVuY2htYXJrCisvbGliL2QvdGVzdC9zdHJlc3NfdGVzdF9zZXJ2ZXIKKy9saWIvZC90ZXN0L3RocmlmdF90ZXN0X2NsaWVudAorL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3Rfc2VydmVyCisvbGliL2QvdGVzdC90cmFuc3BvcnRfdGVzdAorL2xpYi9kL3VuaXR0ZXN0LworL2xpYi9kYXJ0L2NvdmVyYWdlCisvbGliL2RhcnQvKiovLnBhY2thZ2VzCisvbGliL2RhcnQvKiovcGFja2FnZXMKKy9saWIvZGFydC8qKi8ucHViLworL2xpYi9kYXJ0LyoqL3B1YnNwZWMubG9jaworL2xpYi9kZWxwaGkvdGVzdC9za2lwLyoucmVxdWVzdAorL2xpYi9kZWxwaGkvdGVzdC9za2lwLyoucmVzcG9uc2UKKy9saWIvZGVscGhpLyoqLyouaWRlbnRjYWNoZQorL2xpYi9kZWxwaGkvKiovKi5sb2NhbAorL2xpYi9kZWxwaGkvKiovKi5kY3UKKy9saWIvZGVscGhpLyoqLyouMjAwNworL2xpYi9kZWxwaGkvKiovKi5kcHJvagorL2xpYi9kZWxwaGkvKiovY29kZWdlbi8qLmJhdAogL2xpYi9lcmwvLmV1bml0CisvbGliL2VybC8uZ2VuZXJhdGVkCisvbGliL2VybC8ucmViYXIvCisvbGliL2VybC9kZXBzLwogL2xpYi9lcmwvZWJpbgogL2xpYi9lcmwvc3JjL3RocmlmdC5hcHAuc3JjCi0vbGliL2VybC90ZXN0LyouZXJsCisvbGliL2VybC90ZXN0LyouYmVhbQogL2xpYi9lcmwvdGVzdC8qLmhybAorL2xpYi9lcmwvdGVzdC9UaHJpZnRfb21pdF93aXRob3V0LnRocmlmdAorL2xpYi9oYXhlL3Rlc3QvYmluCisvbGliL2hheGUvdGVzdC9kYXRhLnRtcAogL2xpYi9ocy9kaXN0Ci0vbGliL2hzL01ha2VmaWxlCi0vbGliL2hzL01ha2VmaWxlLmluCi0vbGliL2phdmEvTWFrZWZpbGUKLS9saWIvamF2YS9NYWtlZmlsZS5pbgorL2xpYi9qYXZhLy5ncmFkbGUKKy9saWIvamF2YS9hbmRyb2lkLy5ncmFkbGUKIC9saWIvamF2YS9idWlsZAotL2xpYi9qYXZhL2dlbi1qYXZhCi0vbGliL2phdmEvZ2VuLWphdmFiZWFuCi0vbGliL2phdmEvbGlidGhyaWZ0LmphcgorL2xpYi9qYXZhL3RhcmdldAorL2xpYi9qcy9kaXN0CisvbGliL2pzL2RvYwogL2xpYi9qcy90ZXN0L2J1aWxkCi0vbGliL2pzL3Rlc3QvanN0ZXN0LmphcgotL2xpYi9qcy90ZXN0L2dlbi0qCi0vbGliL2pzL3Rlc3QvTWFrZWZpbGUKLS9saWIvanMvdGVzdC9NYWtlZmlsZS5pbgorL2xpYi9uZXRjb3JlLyoqL2JpbgorL2xpYi9uZXRjb3JlLyoqL29iagorL2xpYi9ub2RlanMvY292ZXJhZ2UKKy9saWIvbm9kZWpzL25vZGVfbW9kdWxlcy8KIC9saWIvcGVybC9NQU5JRkVTVAotL2xpYi9wZXJsL01ha2VmaWxlCi0vbGliL3BlcmwvTWFrZWZpbGUuaW4KKy9saWIvcGVybC9NWU1FVEEuanNvbgorL2xpYi9wZXJsL01ZTUVUQS55bWwKIC9saWIvcGVybC9NYWtlZmlsZS1wZXJsLm1rCiAvbGliL3BlcmwvYmxpYgogL2xpYi9wZXJsL3BtX3RvX2JsaWIKLS9saWIvcGVybC90ZXN0L01ha2VmaWxlCi0vbGliL3BlcmwvdGVzdC9NYWtlZmlsZS5pbgotL2xpYi9wZXJsL3Rlc3QvZ2VuLXBlcmwKLS9saWIvcHkvTWFrZWZpbGUKLS9saWIvcHkvTWFrZWZpbGUuaW4KIC9saWIvcHkvYnVpbGQKLS9saWIvcmIvTWFrZWZpbGUKLS9saWIvcmIvTWFrZWZpbGUuaW4KLS9saWIvcmIvYmVuY2htYXJrL2dlbi0qCisvbGliL3B5L3RocmlmdC5lZ2ctaW5mby8KKy9saWIvcmIvR2VtZmlsZS5sb2NrCiAvbGliL3JiL2RlYnVnX3Byb3RvX3Rlc3QKIC9saWIvcmIvLmNvbmZpZwotL2xpYi9yYi9leHQvTWFrZWZpbGUKLS9saWIvcmIvZXh0LyoubwogL2xpYi9yYi9leHQvY29uZnRlc3QuZFNZTS8KIC9saWIvcmIvZXh0L21rbWYubG9nCiAvbGliL3JiL2V4dC90aHJpZnRfbmF0aXZlLmJ1bmRsZQogL2xpYi9yYi9leHQvdGhyaWZ0X25hdGl2ZS5zbwotL2xpYi9yYi9zcGVjL2dlbi0qCi0vbGliL3BocC9NYWtlZmlsZQotL2xpYi9waHAvTWFrZWZpbGUuaW4KLS9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sLy5kZXBzCi0vbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC8ubGlicwotL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvTWFrZWZpbGUKKy9saWIvcmIvdGVzdC8KKy9saWIvcmIvdGhyaWZ0LSouZ2VtCiAvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9NYWtlZmlsZS4qCi0vbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9hY2luY2x1ZGUubTQKLS9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2FjbG9jYWwubTQKLS9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2F1dG9tNHRlLmNhY2hlLwogL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvYnVpbGQvCiAvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcuKgogL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlndXJlCisvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWd1cmUuYWMKIC9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZ3VyZS5pbgogL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvaW5zdGFsbC1zaAogL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvbGlidG9vbApAQCAtMTUwLDQwICsyNjMsMTM0IEBACiAvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmxvCiAvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9ydW4tdGVzdHMucGhwCiAvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wubGEKLS9saWIvZXJsL01ha2VmaWxlCi0vbGliL2VybC9NYWtlZmlsZS5pbgotL2xpYi9lcmwvc3JjL01ha2VmaWxlCi0vbGliL2VybC9zcmMvTWFrZWZpbGUuaW4KKy9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3RtcC1waHAuaW5pCisvbGliL3BocC9zcmMvcGFja2FnZXMvCisvbGliL3BocC90ZXN0L1RFU1QtKi54bWwKKy9saWIvcGhwL3Rlc3QvcGFja2FnZXMvCisvbGliL3B5L2Rpc3QvCisvbGliL2VybC9sb2dzLworL2xpYi9nby9wa2cKKy9saWIvZ28vc3JjCisvbGliL2dvL3Rlc3QvZ29wYXRoLworL2xpYi9nby90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisvbGliL3JzL3RhcmdldC8KKy9saWIvcnMvQ2FyZ28ubG9jaworL2xpYi9ycy90ZXN0L0NhcmdvLmxvY2sKKy9saWIvcnMvdGVzdC90YXJnZXQvCisvbGliL3JzL3Rlc3QvYmluLworL2xpYi9ycy90ZXN0L3NyYy9iYXNlX29uZS5ycworL2xpYi9ycy90ZXN0L3NyYy9iYXNlX3R3by5ycworL2xpYi9ycy90ZXN0L3NyYy9taWRsYXllci5ycworL2xpYi9ycy90ZXN0L3NyYy9yZWN1cnNpdmUucnMKKy9saWIvcnMvdGVzdC9zcmMvdWx0aW1hdGUucnMKKy9saWIvcnMvKi5pbWwKKy9saWIvcnMvKiovKi5pbWwKKy9saWIvc3dpZnQvLmJ1aWxkCiAvbGlidG9vbAogL2x0bWFpbi5zaAogL21pc3NpbmcKKy9ub2RlX21vZHVsZXMvCisvdmVuZG9yLworL2NvbXBvc2VyLmxvY2sKIC9zdGFtcC1oMQotL3Rlc3QvTWFrZWZpbGUKLS90ZXN0L01ha2VmaWxlLmluCi0vdGVzdC9jcHAvLmRlcHMKLS90ZXN0L2NwcC8ubGlicwotL3Rlc3QvY3BwLyoubGEKLS90ZXN0L2NwcC8qLmxvCi0vdGVzdC9jcHAvKi5vCi0vdGVzdC9jcHAvZ2VuLSoKLS90ZXN0L2NwcC9NYWtlZmlsZQotL3Rlc3QvY3BwL01ha2VmaWxlLmluCisvdGVzdC9mZWF0dXJlcy9yZXN1bHRzLmpzb24KKy90ZXN0L3Jlc3VsdHMuanNvbgorL3Rlc3QvY19nbGliL3Rlc3RfY2xpZW50CisvdGVzdC9jX2dsaWIvdGVzdF9zZXJ2ZXIKKy90ZXN0L2NsL1Rlc3RTZXJ2ZXIKKy90ZXN0L2NsL1Rlc3RDbGllbnQKIC90ZXN0L2NwcC9TdHJlc3NUZXN0CiAvdGVzdC9jcHAvU3RyZXNzVGVzdE5vbkJsb2NraW5nCiAvdGVzdC9jcHAvVGVzdENsaWVudAogL3Rlc3QvY3BwL1Rlc3RTZXJ2ZXIKLS90ZXN0L2hzL2dlbi0qCi0vdGVzdC9ocy9NYWtlZmlsZQotL3Rlc3QvaHMvTWFrZWZpbGUuaW4KLS90ZXN0L3B5L01ha2VmaWxlCi0vdGVzdC9weS9NYWtlZmlsZS5pbgotL3Rlc3QvcHkvZ2VuLXB5Ci0vdGVzdC9weS50d2lzdGVkL01ha2VmaWxlCi0vdGVzdC9weS50d2lzdGVkL01ha2VmaWxlLmluCisvdGVzdC9jc2hhcnAvb2JqCisvdGVzdC9jc2hhcnAvYmluCisvdGVzdC9kYXJ0LyoqLy5wYWNrYWdlcworL3Rlc3QvZGFydC8qKi9wYWNrYWdlcworL3Rlc3QvZGFydC8qKi8ucHViLworL3Rlc3QvZGFydC8qKi9wdWJzcGVjLmxvY2sKKy90ZXN0L2xvZy8KKy90ZXN0L3Rlc3QubG9nCisvdGVzdC9lcmwvLmdlbmVyYXRlZAorL3Rlc3QvZXJsLy5yZWJhcgorL3Rlc3QvZXJsL2ViaW4KKy90ZXN0L2dvL2Jpbi8KKy90ZXN0L2dvL1RocmlmdFRlc3QudGhyaWZ0CisvdGVzdC9nby9nb3BhdGgKKy90ZXN0L2dvL3BrZy8KKy90ZXN0L2dvL3NyYy9jb2RlLmdvb2dsZS5jb20vCisvdGVzdC9nby9zcmMvY29tbW9uL21vY2tfaGFuZGxlci5nbworL3Rlc3QvZ28vc3JjL2dpdGh1Yi5jb20vZ29sYW5nLworL3Rlc3QvZ28vc3JjL2dvbGFuZy5vcmcvCisvdGVzdC9nby9zcmMvZ2VuLworL3Rlc3QvZ28vc3JjL3RocmlmdAorL3Rlc3QvaGF4ZS9iaW4KKy90ZXN0L2hzL1Rlc3RDbGllbnQKKy90ZXN0L2hzL1Rlc3RTZXJ2ZXIKKy90ZXN0L3BocC9waHBfZXh0X2Rpci8KIC90ZXN0L3B5LnR3aXN0ZWQvX3RyaWFsX3RlbXAvCi0vdGVzdC9weS50d2lzdGVkL2dlbi1weS50d2lzdGVkLwotL3Rlc3QvcHkudHdpc3RlZC90ZXN0X3N1aXRlLnB5YwotL3Rlc3QvcmIvZ2VuLSoKLS90ZXN0L3JiL01ha2VmaWxlCi0vdGVzdC9yYi9NYWtlZmlsZS5pbgorL3Rlc3QvcmIvR2VtZmlsZS5sb2NrCisvdGVzdC9uZXRjb3JlLyoqL2JpbgorL3Rlc3QvbmV0Y29yZS8qKi9vYmoKKy90ZXN0L25ldGNvcmUvVGhyaWZ0CisvdGVzdC9waHAvcGhwX2V4dF9kaXIvCisvdGVzdC9ycy9DYXJnby5sb2NrCisvdGVzdC9ycy9zcmMvdGhyaWZ0X3Rlc3QucnMKKy90ZXN0L3JzL2Jpbi8KKy90ZXN0L3JzL3RhcmdldC8KKy90ZXN0L3JzLyouaW1sCisvdGVzdC9ycy8qKi8qLmltbAorL2xpYi9jbC9iYWNrcG9ydC11cGRhdGUuemlwCisvbGliL2NsL2xpYgorL3R1dG9yaWFsL2NsL3F1aWNrbGlzcC5saXNwCisvdHV0b3JpYWwvY2wvZXh0ZXJuYWxzLworL3R1dG9yaWFsL2NsL3F1aWNrbGlzcC8KKy90dXRvcmlhbC9jbC9UdXRvcmlhbENsaWVudAorL3R1dG9yaWFsL2NsL1R1dG9yaWFsU2VydmVyCisvdHV0b3JpYWwvY2wvYmFja3BvcnQtdXBkYXRlLnppcAorL3R1dG9yaWFsL2NsL2xpYi8KKy90dXRvcmlhbC9jbC9zaGFyZWQtaW1wbGVtZW50YXRpb24uZmFzbAorL3R1dG9yaWFsL2NsL3R1dG9yaWFsLWltcGxlbWVudGF0aW9uLmZhc2wKKy90dXRvcmlhbC9jcHAvVHV0b3JpYWxDbGllbnQKKy90dXRvcmlhbC9jcHAvVHV0b3JpYWxTZXJ2ZXIKKy90dXRvcmlhbC9jX2dsaWIvdHV0b3JpYWxfY2xpZW50CisvdHV0b3JpYWwvY19nbGliL3R1dG9yaWFsX3NlcnZlcgorL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvb2JqCisvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9iaW4KKy90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L29iagorL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvYmluCisvdHV0b3JpYWwvZC9hc3luY19jbGllbnQKKy90dXRvcmlhbC9kL2NsaWVudAorL3R1dG9yaWFsL2Qvc2VydmVyCisvdHV0b3JpYWwvZGFydC8qKi8ucGFja2FnZXMKKy90dXRvcmlhbC9kYXJ0LyoqL3BhY2thZ2VzCisvdHV0b3JpYWwvZGFydC8qKi8ucHViLworL3R1dG9yaWFsL2RhcnQvKiovcHVic3BlYy5sb2NrCisvdHV0b3JpYWwvZGVscGhpLyoqLyouZHNrCisvdHV0b3JpYWwvZGVscGhpLyoqLyoubG9jYWwKKy90dXRvcmlhbC9kZWxwaGkvKiovKi50dnNjb25maWcKKy90dXRvcmlhbC9kZWxwaGkvKiovZGN1CisvdHV0b3JpYWwvZGVscGhpLyoqLyoubG9jYWwKKy90dXRvcmlhbC9kZWxwaGkvKiovKi5pZGVudGNhY2hlCisvdHV0b3JpYWwvZ28vZ29wYXRoCisvdHV0b3JpYWwvZ28vZ28tdHV0b3JpYWwKKy90dXRvcmlhbC9nby9jYWxjdWxhdG9yLXJlbW90ZQorL3R1dG9yaWFsL2dvL3NyYy9zaGFyZWQKKy90dXRvcmlhbC9nby9zcmMvdHV0b3JpYWwKKy90dXRvcmlhbC9nby9zcmMvZ2l0LmFwYWNoZS5vcmcKKy90dXRvcmlhbC9nby9zcmMvZ29sYW5nLm9yZworL3R1dG9yaWFsL2hheGUvYmluCisvdHV0b3JpYWwvaHMvZGlzdC8KKy90dXRvcmlhbC9qYXZhL2J1aWxkLworL3R1dG9yaWFsL2pzL2J1aWxkLworL3R1dG9yaWFsL25ldGNvcmUvKiovYmluCisvdHV0b3JpYWwvbmV0Y29yZS8qKi9vYmoKKy90dXRvcmlhbC9uZXRjb3JlL1RocmlmdAorL3R1dG9yaWFsL3JzLyouaW1sCisvdHV0b3JpYWwvcnMvc3JjL3NoYXJlZC5ycworL3R1dG9yaWFsL3JzL3NyYy90dXRvcmlhbC5ycworL3R1dG9yaWFsL3JzL2JpbgorL3R1dG9yaWFsL3JzL3RhcmdldAorL3R1dG9yaWFsL3JzL0NhcmdvLmxvY2sKIC95bHdyYXAKKwpkaWZmIC0tZ2l0IGEvLnJ1c3RmbXQudG9tbCBiLy5ydXN0Zm10LnRvbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNhNWFmZAotLS0gL2Rldi9udWxsCisrKyBiLy5ydXN0Zm10LnRvbWwKQEAgLTAsMCArMSw2NCBAQAorbWF4X3dpZHRoID0gMTAwCitoYXJkX3RhYnMgPSBmYWxzZQordGFiX3NwYWNlcyA9IDQKK25ld2xpbmVfc3R5bGUgPSAiQXV0byIKK3VzZV9zbWFsbF9oZXVyaXN0aWNzID0gIkRlZmF1bHQiCitpbmRlbnRfc3R5bGUgPSAiQmxvY2siCit3cmFwX2NvbW1lbnRzID0gZmFsc2UKK2Zvcm1hdF9kb2NfY29tbWVudHMgPSBmYWxzZQorY29tbWVudF93aWR0aCA9IDgwCitub3JtYWxpemVfY29tbWVudHMgPSBmYWxzZQorbm9ybWFsaXplX2RvY19hdHRyaWJ1dGVzID0gZmFsc2UKK2xpY2Vuc2VfdGVtcGxhdGVfcGF0aCA9ICIiCitmb3JtYXRfc3RyaW5ncyA9IGZhbHNlCitmb3JtYXRfbWFjcm9fbWF0Y2hlcnMgPSBmYWxzZQorZm9ybWF0X21hY3JvX2JvZGllcyA9IHRydWUKK2VtcHR5X2l0ZW1fc2luZ2xlX2xpbmUgPSB0cnVlCitzdHJ1Y3RfbGl0X3NpbmdsZV9saW5lID0gdHJ1ZQorZm5fc2luZ2xlX2xpbmUgPSBmYWxzZQord2hlcmVfc2luZ2xlX2xpbmUgPSBmYWxzZQoraW1wb3J0c19pbmRlbnQgPSAiQmxvY2siCitpbXBvcnRzX2xheW91dCA9ICJNaXhlZCIKK21lcmdlX2ltcG9ydHMgPSBmYWxzZQorcmVvcmRlcl9pbXBvcnRzID0gdHJ1ZQorcmVvcmRlcl9tb2R1bGVzID0gdHJ1ZQorcmVvcmRlcl9pbXBsX2l0ZW1zID0gZmFsc2UKK3R5cGVfcHVuY3R1YXRpb25fZGVuc2l0eSA9ICJXaWRlIgorc3BhY2VfYmVmb3JlX2NvbG9uID0gZmFsc2UKK3NwYWNlX2FmdGVyX2NvbG9uID0gdHJ1ZQorc3BhY2VzX2Fyb3VuZF9yYW5nZXMgPSBmYWxzZQorYmlub3Bfc2VwYXJhdG9yID0gIkZyb250IgorcmVtb3ZlX25lc3RlZF9wYXJlbnMgPSB0cnVlCitjb21iaW5lX2NvbnRyb2xfZXhwciA9IHRydWUKK292ZXJmbG93X2RlbGltaXRlZF9leHByID0gZmFsc2UKK3N0cnVjdF9maWVsZF9hbGlnbl90aHJlc2hvbGQgPSAwCitlbnVtX2Rpc2NyaW1fYWxpZ25fdGhyZXNob2xkID0gMAorbWF0Y2hfYXJtX2Jsb2NrcyA9IHRydWUKK2ZvcmNlX211bHRpbGluZV9ibG9ja3MgPSBmYWxzZQorZm5fYXJnc19kZW5zaXR5ID0gIlRhbGwiCiticmFjZV9zdHlsZSA9ICJTYW1lTGluZVdoZXJlIgorY29udHJvbF9icmFjZV9zdHlsZSA9ICJBbHdheXNTYW1lTGluZSIKK3RyYWlsaW5nX3NlbWljb2xvbiA9IHRydWUKK3RyYWlsaW5nX2NvbW1hID0gIlZlcnRpY2FsIgorbWF0Y2hfYmxvY2tfdHJhaWxpbmdfY29tbWEgPSBmYWxzZQorYmxhbmtfbGluZXNfdXBwZXJfYm91bmQgPSAxCitibGFua19saW5lc19sb3dlcl9ib3VuZCA9IDAKK2VkaXRpb24gPSAiMjAxNSIKK21lcmdlX2Rlcml2ZXMgPSB0cnVlCit1c2VfdHJ5X3Nob3J0aGFuZCA9IGZhbHNlCit1c2VfZmllbGRfaW5pdF9zaG9ydGhhbmQgPSBmYWxzZQorZm9yY2VfZXhwbGljaXRfYWJpID0gdHJ1ZQorY29uZGVuc2Vfd2lsZGNhcmRfc3VmZml4ZXMgPSBmYWxzZQorY29sb3IgPSAiQXV0byIKK3JlcXVpcmVkX3ZlcnNpb24gPSAiMS4wLjAiCit1bnN0YWJsZV9mZWF0dXJlcyA9IGZhbHNlCitkaXNhYmxlX2FsbF9mb3JtYXR0aW5nID0gZmFsc2UKK3NraXBfY2hpbGRyZW4gPSBmYWxzZQoraGlkZV9wYXJzZV9lcnJvcnMgPSBmYWxzZQorZXJyb3Jfb25fbGluZV9vdmVyZmxvdyA9IGZhbHNlCitlcnJvcl9vbl91bmZvcm1hdHRlZCA9IGZhbHNlCityZXBvcnRfdG9kbyA9ICJOZXZlciIKK3JlcG9ydF9maXhtZSA9ICJOZXZlciIKK2lnbm9yZSA9IFtdCitlbWl0X21vZGUgPSAiRmlsZXMiCittYWtlX2JhY2t1cCA9IGZhbHNlCmRpZmYgLS1naXQgYS8udHJhdmlzLnltbCBiLy50cmF2aXMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzN2I1ZDUKLS0tIC9kZXYvbnVsbAorKysgYi8udHJhdmlzLnltbApAQCAtMCwwICsxLDE3MyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgYnVpbGQgQXBhY2hlIFRocmlmdCBvbiBUcmF2aXMgQ0kgLSBodHRwczovL3RyYXZpcy1jaS5vcmcvCisKKyMKKyMgRG9ja2VyIEludGVncmF0aW9uCisjIHNlZTogYnVpbGQvZG9ja2VyL1JFQURNRS5tZAorIyAKKworc3VkbzogcmVxdWlyZWQKK2Rpc3Q6IHRydXN0eQorbGFuZ3VhZ2U6IGNwcAorCitzZXJ2aWNlczoKKyAgLSBkb2NrZXIKKworaW5zdGFsbDoKKyAgLSBpZiBbWyBgdW5hbWVgID09ICJMaW51eCIgXV07IHRoZW4gYnVpbGQvZG9ja2VyL3JlZnJlc2guc2g7IGZpCisKK3N0YWdlczoKKyAgLSBkb2NrZXIgICAgIyBkb2NrZXIgaW1hZ2VzCisgIC0gdGhyaWZ0ICAgICMgdGhyaWZ0IGJ1aWxkIGpvYnMKKworZW52OgorICBnbG9iYWw6CisgICAgLSBTQ1JJUFQ9ImNtYWtlLnNoIgorICAgIC0gQlVJTERfQVJHPSIiCisgICAgLSBCVUlMRF9FTlY9Ii1lIENDPWdjYyAtZSBDWFg9ZysrIC1lIFRIUklGVF9DUk9TU1RFU1RfQ09OQ1VSUkVOQ1k9NCIKKyAgICAtIERJU1RSTz11YnVudHUtYmlvbmljCisgICAgLSBCVUlMRF9MSUJTPSJDUFAgQ19HTElCIEhBU0tFTEwgSkFWQSBQWVRIT04gVEVTVElORyBUVVRPUklBTFMiICAjIG9ubHkgbWVhbmluZ2Z1bCBmb3IgQ01ha2UgYnVpbGRzCisgICAgLSBUUkFWSVNfQlVJTERfU1RBR0U9dGVzdAorICAgICMgRE9DS0VSX1JFUE8gKHRoaXMgd29ya3MgZm9yIGFsbCBidWlsZHMgYXMgYSBzb3VyY2UgZm9yIGRvY2tlciBpbWFnZXMgLSB5b3UgY2FuIG92ZXJyaWRlIGZvciBmb3JrIGJ1aWxkcyBpbiB5b3VyIFRyYXZpcyBzZXR0aW5ncykKKyAgICAtIERPQ0tFUl9SRVBPPSJ0aHJpZnQvdGhyaWZ0LWJ1aWxkIgorICAgICMgRE9DS0VSX1VTRVIgKHByb3ZpZGUgaW4geW91ciBUcmF2aXMgc2V0dGluZ3MgaWYgeW91IHdhbnQgdG8gYnVpbGQgYW5kIHVwZGF0ZSBkb2NrZXIgaW1hZ2VzIG9uY2UsIGluc3RlYWQgb2Ygb24gZXZlcnkgam9iKQorICAgICMgRE9DS0VSX1BBU1MgKHNhbWUpCisKK2pvYnM6CisgIGluY2x1ZGU6CisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09IHN0YWdlOiBkb2NrZXIgPT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC0gc3RhZ2U6IGRvY2tlcgorICAgICAgc2NyaXB0OiB0cnVlCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJEb2NrZXIgQnVpbGQgdWJ1bnR1LXhlbmlhbCAxNi4wNCBMVFMiCisgICAgICAgIC0gRElTVFJPPXVidW50dS14ZW5pYWwKKyAgICAgICAgLSBUUkFWSVNfQlVJTERfU1RBR0U9ZG9ja2VyCisgICAgLSBzY3JpcHQ6IHRydWUKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkRvY2tlciBCdWlsZCB1YnVudHUtYmlvbmljIDE4LjA0IExUUyIKKyAgICAgICAgLSBESVNUUk89dWJ1bnR1LWJpb25pYworICAgICAgICAtIFRSQVZJU19CVUlMRF9TVEFHRT1kb2NrZXIKKworICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PSBzdGFnZTogdGhyaWZ0ID09PT09PT09PT09PT09PT09PT09PT09CisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBoYXNlOiBjcm9zcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIGFwYWNoZS90aHJpZnQgb2ZmaWNpYWwgUFIgYnVpbGRzIGNhbiBleGNlZWQgNTAgbWludXRlcyBwZXIgam9iIHNvIGNvbWJpbmUgYWxsIGNyb3NzIHRlc3RzCisgICAgLSBzdGFnZTogdGhyaWZ0CisgICAgICBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGlmOiByZXBvID0gYXBhY2hlL3RocmlmdAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQ3Jvc3MgTGFuZ3VhZ2UgVGVzdHMiCisgICAgICAgIC0gU0NSSVBUPSJjcm9zcy10ZXN0LnNoIgorCisgICAgIyBmb3JrIGJhc2VkIFBSIGJ1aWxkcyBjYW5ub3QgZXhjZWVkIDUwIG1pbnV0ZXMgcGVyIGpvYgorICAgIC0gc3RhZ2U6IHRocmlmdAorICAgICAgc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBpZjogcmVwbyAhPSBhcGFjaGUvdGhyaWZ0CisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDcm9zcyBMYW5ndWFnZSBUZXN0cyAoQmluYXJ5IFByb3RvY29sKSIKKyAgICAgICAgLSBTQ1JJUFQ9ImNyb3NzLXRlc3Quc2giCisgICAgICAgIC0gQlVJTERfQVJHPSItJyhiaW5hcnkpJyIKKworICAgIC0gc3RhZ2U6IHRocmlmdAorICAgICAgc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBpZjogcmVwbyAhPSBhcGFjaGUvdGhyaWZ0CisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDcm9zcyBMYW5ndWFnZSBUZXN0cyAoSGVhZGVyLCBKU09OIFByb3RvY29scykiCisgICAgICAgIC0gU0NSSVBUPSJjcm9zcy10ZXN0LnNoIgorICAgICAgICAtIEJVSUxEX0FSRz0iLScoaGVhZGVyfGpzb24pJyIKKworICAgIC0gc3RhZ2U6IHRocmlmdAorICAgICAgc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBpZjogcmVwbyAhPSBhcGFjaGUvdGhyaWZ0CisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDcm9zcyBMYW5ndWFnZSBUZXN0cyAoQ29tcGFjdCBhbmQgTXVsdGlwbGV4ZWQgUHJvdG9jb2xzKSIKKyAgICAgICAgLSBTQ1JJUFQ9ImNyb3NzLXRlc3Quc2giCisgICAgICAgIC0gQlVJTERfQVJHPSItJyhjb21wYWN0fG11bHRpcGxleGVkKSciCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhhc2U6IHNjYSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgUUEgam9icyBmb3IgY29kZSBhbmFseXRpY3MgYW5kIG1ldHJpY3MKKyAgICAtIHN0YWdlOiB0aHJpZnQKKyAgICAgIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iU3RhdGljIENvZGUgQW5hbHlzaXMiCisgICAgICAgIC0gU0NSSVBUPSJzY2Euc2giCisKKyAgICAjIEMgYW5kIEMrKyB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgIyBBIGJpbmFyeSBjcmFzaGVzIGlmIHVuZGVmaW5lZCBiZWhhdmlvciBvY2N1cnMgYW5kIHByb2R1Y2VzIGEgc3RhY2sgdHJhY2UuCisgICAgIyBweXRob24gaXMgZGlzYWJsZWQsIHNlZTogVEhSSUZULTQzNjAKKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iVUJTYW4iCisgICAgICAgIC0gU0NSSVBUPSJ1YnNhbi5zaCIKKyAgICAgICAgLSBCVUlMRF9BUkc9Ii0td2l0aG91dC1weXRob24gLS13aXRob3V0LXB5MyIKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaGFzZTogYXV0b3Rvb2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBUT0RPOiBSZW1vdmUgdGhlbSBvbmNlIG1pZ3JhdGVkIHRvIENNYWtlCisgICAgLSBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkF1dG90b29scyAoVWJ1bnR1IEJpb25pYykiCisgICAgICAgIC0gU0NSSVBUPSJhdXRvdG9vbHMuc2giCisKKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQXV0b3Rvb2xzIChVYnVudHUgWGVuaWFsKSIKKyAgICAgICAgLSBESVNUUk89dWJ1bnR1LXhlbmlhbAorICAgICAgICAtIFNDUklQVD0iYXV0b3Rvb2xzLnNoIgorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBoYXNlOiBjbWFrZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQ01ha2UiCisKKyAgICAjIEMrKyBzcGVjaWZpYyBvcHRpb25zOiBjb21waWxlciBwbHVnLWluLCB0aHJlYWRpbmcgbW9kZWwKKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQysrIChTdGQgVGhyZWFkKSBhbmQgUGx1Z2luIgorICAgICAgICAtIFNDUklQVD0iY21ha2Uuc2giCisgICAgICAgIC0gQlVJTERfTElCUz0iQ1BQIFRFU1RJTkcgVFVUT1JJQUxTIgorICAgICAgICAtIEJVSUxEX0FSRz0iLURXSVRIX1BMVUdJTj1PTiAtRFdJVEhfU1REVEhSRUFEUz1PTiAtRFdJVEhfUFlUSE9OPU9GRiAtRFdJVEhfQ19HTElCPU9GRiAtRFdJVEhfSkFWQT1PRkYgLURXSVRIX0hBU0tFTEw9T0ZGIgorICAgICAgICAtIEJVSUxEX0VOVj0iLWUgQ0M9Y2xhbmcgLWUgQ1hYPWNsYW5nKysiCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhhc2U6IGRpc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJtYWtlIGRpc3QiCisgICAgICAgIC0gU0NSSVBUPSJtYWtlLWRpc3Quc2giCisKKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iRGViaWFuIFBhY2thZ2VzIgorICAgICAgICAtIFNDUklQVD0iZHBrZy5zaCIKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaGFzZTogY292ZXJpdHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBXZSBidWlsZCB0aGUgY292ZXJpdHkgc2NhbiBidWlsZCBvbmNlIG1vbnRobHkgdXNpbmcgYSB0cmF2aXMgY3JvbiBqb2IKKyAgICAtIGlmOiAoZW52KENPVkVSSVRZX1NDQU5fTk9USUZJQ0FUSU9OX0VNQUlMKSBJUyBwcmVzZW50KSBBTkQgKGJyYW5jaCBJTiAobWFzdGVyKSkgQU5EICh0eXBlIElOIChjcm9uKSkKKyAgICAgIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQ292ZXJpdHkgU2NhbiIKKyAgICAgICAgLSBTQ1JJUFQ9ImNvdnNjYW4uc2giCisgICAgIAorCisgICMjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBoYXNlOiBvc3ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIyBkaXNhYmxlZCBkdWUgdG8gdGhlIHRpbWUgZGVsYXlzIGl0IGltcG9zZXMgb24gYnVpbGQgam9icworICAjIC0gb3M6IG9zeAorICAjICAgb3N4X2ltYWdlOiB4Y29kZTkKKyAgIyAgIHNjcmlwdDogYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNoCisKZGlmZiAtLWdpdCBhL0FwYWNoZVRocmlmdC5udXNwZWMgYi9BcGFjaGVUaHJpZnQubnVzcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZWQyYzYKLS0tIC9kZXYvbnVsbAorKysgYi9BcGFjaGVUaHJpZnQubnVzcGVjCkBAIC0wLDAgKzEsNTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorCis8IS0tCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworICBJbnN0cnVjdGlvbnMgZm9yIGJ1aWxkaW5nIGEgbnVnZXQgcGFja2FnZToKKworICAxLiBPcGVuIFRocmlmdC5zbG4gaW4gbGliXGNzaGFycFxzcmMgYW5kIGJ1aWxkIHRoZSByZWxlYXNlIHZlcnNpb24KKyAgICAgb2YgdGhlICJUaHJpZnQiIGFuZCAiVGhyaWZ0LjQ1IiBwcm9qZWN0cy4KKyAgMi4gT3BlbiBUaHJpZnQuc2xuIGluIGxpYlxuZXRjb3JlIGFuZCBidWlsZCB0aGUgcmVsZWFzZSB2ZXJzaW9uIG9mCisgICAgIHRoZSAiVGhyaWZ0IiBwcm9qZWN0LgorICAzLiBudWdldCBzZXRBcGlLZXkgPHlvdXItYXBpLWtleT4KKyAgMy4gbnVnZXQgcGFjayBBcGFjaGVUaHJpZnQubnVzcGVjIC1TeW1ib2xzIC1TeW1ib2xQYWNrYWdlRm9ybWF0IHNudXBrZworICA0LiBudWdldCBwdXNoIEFwYWNoZVRocmlmdC4xLjAuMC5udXBrZyAtU291cmNlIGh0dHBzOi8vYXBpLm51Z2V0Lm9yZy92My9pbmRleC5qc29uCisgIC0tPgorCis8cGFja2FnZSB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9wYWNrYWdpbmcvMjAxMy8wNS9udXNwZWMueHNkIj4KKyAgPG1ldGFkYXRhPgorICAgIDxpZD5BcGFjaGVUaHJpZnQ8L2lkPgorICAgIDx2ZXJzaW9uPjEuMC4wPC92ZXJzaW9uPgorICAgIDx0aXRsZT5BcGFjaGUgVGhyaWZ0IDEuMC4wPC90aXRsZT4KKyAgICA8YXV0aG9ycz5BcGFjaGUgVGhyaWZ0IERldmVsb3BlcnM8L2F1dGhvcnM+CisgICAgPG93bmVycz5BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvb3duZXJzPgorICAgIDxsaWNlbnNlIHR5cGU9ImV4cHJlc3Npb24iPkFwYWNoZS0yLjA8L2xpY2Vuc2U+CisgICAgPHByb2plY3RVcmw+aHR0cDovL3RocmlmdC5hcGFjaGUub3JnLzwvcHJvamVjdFVybD4KKyAgICA8cmVxdWlyZUxpY2Vuc2VBY2NlcHRhbmNlPnRydWU8L3JlcXVpcmVMaWNlbnNlQWNjZXB0YW5jZT4KKyAgICA8c3VtbWFyeT5BcGFjaGUgVGhyaWZ0IC5ORVQgTGlicmFyeTwvc3VtbWFyeT4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICBDb250YWlucyBydW50aW1lIGxpYnJhcmllcyBmcm9tIGxpYi9jc2hhcnAgZm9yIG5ldDM1IGFuZCBuZXQ0NSBmcmFtZXdvcmtzLCAKKyAgICAgIGFuZCBmcm9tIGxpYi9uZXRjb3JlIGZvciBuZXRzdGFuZGFyZDIuMCBmcmFtZXdvcmsgZGV2ZWxvcG1lbnQuCisgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8cmVwb3NpdG9yeSB0eXBlPSJHaXRIdWIiIHVybD0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQiIGJyYW5jaD0icmVsZWFzZS8xLjAuMCIgLz4KKyAgICA8dGFncz5BcGFjaGUgVGhyaWZ0IFJQQzwvdGFncz4KKyAgPC9tZXRhZGF0YT4KKyAgPGZpbGVzPgorICAgIDxmaWxlIHNyYz0ibGliXGNzaGFycFxzcmNcYmluXFJlbGVhc2VcVGhyaWZ0LioiIHRhcmdldD0ibGliXG5ldDM1IiAvPgorICAgIDxmaWxlIHNyYz0ibGliXGNzaGFycFxzcmNcYmluXFJlbGVhc2VcVGhyaWZ0NDUuKiIgdGFyZ2V0PSJsaWJcbmV0NDUiIC8+CisgICAgPGZpbGUgc3JjPSJsaWJcbmV0Y29yZVxUaHJpZnRcYmluXFJlbGVhc2VcbmV0c3RhbmRhcmQyLjBcKi4qIiB0YXJnZXQ9ImxpYlxuZXRzdGFuZGFyZDIuMCIgLz4KKyAgPC9maWxlcz4KKzwvcGFja2FnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9DSEFOR0VTIGIvQ0hBTkdFUwppbmRleCA0ZjllZTNlLi4yNDRmMGRhIDEwMDY0NAotLS0gYS9DSEFOR0VTCisrKyBiL0NIQU5HRVMKQEAgLTEsMjAwICsxLDI3NTIgQEAKLVRocmlmdCBDaGFuZ2Vsb2cKK0FwYWNoZSBUaHJpZnQgQ2hhbmdlbG9nCiAKLVZlcnNpb24gMC43LjAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaHJpZnQgMC4xMi4wCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgTmV3IExhbmd1YWdlcworICAgICogQ29tbW9uIExJU1AgKGNsKQorICAgICogU3dpZnQKKyAgICAqIFR5cGVzY3JpcHQgKG5vZGV0cykKIAotVEhSSUZULTEyNTIgICBSdWJ5ICAgICAgICAgICAgICAgICBTZWdmYXVsdCBpbiBSdWJ5IGRlc2VyaWFsaXplcgotVEhSSUZULTk0MCAgICBCdWlsZCAgICAgICAgICAgICAgICAnbWFrZSBjaGVjaycgZmFpbHMgaWYgYm9vc3QgaXMgbm90IGluIHRoZSBzdGQgaW5jbHVkZSBhbmQgbGluayBwYXRocyAoQ2hyaXN0aWFuIExhdm9pZSkKLVRIUklGVC0xMDM4ICAgSmF2YSAgICAgICAgICAgICAgICAgR2VuZXJhdGVkIEphdmEgY29kZSBmb3Igc3RydWN0dXJlcyBjb250YWluaW5nIGJpbmFyeSBmaWVsZHMgYXJlIG5vdCBzZXJpYWxpemFibGUgY29ycmVjdGx5Ci1USFJJRlQtMTA5OCAgIFBIUCAgICAgICAgICAgICAgICAgIFVuZGVmaW5lZCBwcm9wZXJ0aWVzIGluIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkJCQotVEhSSUZULTEwNzYgICBFcmxhbmcgICAgICAgICAgICAgICBFcmxhbmcgVGhyaWZ0IHNvY2tldCBzZXJ2ZXIgY2F1c2VzIGphdmEgZnJhbWVkIGNsaWVudCB0byB0aHJvdyAiIm91dCBvZiBzZXF1ZW5jZSIiIGV4Y2VwdGlvbiIJCQotVEhSSUZULTExNzEgICBQZXJsICAgICAgICAgICAgICAgICBQZXJsIHdyaXRlL3JlYWREb3VibGUgYXNzdW1lcyBsaXR0bGUtZW5kaWFuIHBsYXRmb3JtCQkKLVRIUklGVC0xNTEgICAgQyAgICAgICAgICAgICAgICAgICAgVFNTTFNlcnZlclNvY2tldCBhbmQgVFNTTFNvY2tldCBpbXBsZW1lbnRhdGlvbgkJCi1USFJJRlQtMTA2OCAgIFB5dGhvbiAgICAgICAgICAgICAgIFB5dGhvbiBTU0wgU29ja2V0IFN1cHBvcnQJCQotVEhSSUZULTEwMTEgICBBUzMgICAgICAgICAgICAgICAgICBFcnJvciBnZW5lcmF0aW5nIHBhY2thZ2UgaW1wb3J0cyB3aGVuIHVzaW5nIGNsYXNzZXMgZnJvbSBvdGhlciBwYWNrYWdlcwkJCi1USFJJRlQtMTA2OSAgIENvbXBpbGVyIChHZW5lcmFsKSAgIEFkZCBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIHByZXZlbnQgdGhyaWZ0IGZyb20gaW5zZXJ0aW5nIGdlbi0qIGRpcmVjdG9yaWVzCQkKLVRIUklGVC0xMDU1ICAgQyMgICAgICAgICAgICAgICAgICAgY3NoYXJwIFRTZXJ2ZXJTb2NrZXQgYW5kIFRTb2NrZXQgZG8gbm90IGRpc2FibGUgTmFnbGUgdmlhIFNvY2tldC5Ob0RlbGF5ID0gdHJ1ZSBsaWtlIGNwcCBhbmQgamF2YSBkbwkJCi1USFJJRlQtNjM4ICAgIFBIUCAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkVHJhbnNwb3J0ICsgQyBleHRlbnNpb25zIGJsb2NrIHVudGlsIHJlY3YgdGltZW91dCBpcyByZWFjaGVkIG9uIGxhc3QgZnJlYWQgY2FsbAkJCi1USFJJRlQtODY3ICAgIFBIUCAgICAgICAgICAgICAgICAgIFBIUCBhY2NlbGVyYXRvciBtb2R1bGUncyBvdXRwdXQgdHJhbnNwb3J0IGlzIGluY29tcGF0aWJsZSB3aXRoIFRGcmFtZWRUcmFuc3BvcnQJCQotVEhSSUZULTEwNTQgICAgICAgICAgICAgICAgICAgICAgICBleHBsaWNpdCBjYWxsIHRvIFBLR19QUk9HX1BLR19DT05GSUcgaXMgbWlzc2luZyBhbmQgZmlyc3QgdXNlIG9mIFBLR19DSEVDS19NT0RVTEVTIG1heSBub3QgaGFwcGVuCi1USFJJRlQtMTI1ICAgIE9DYW1sICAgICAgICAgICAgICAgIE9DYW1sIGxpYnJhcmllcyBkb24ndCBjb21waWxlIHdpdGggMzItYml0IG9jYW1sCQkKLVRIUklGVC0xMjAwICAgSmF2YVNjcmlwdCAgICAgICAgICAgSlMgY29tcGlsZXIgZ2VuZXJhdGVzIGNvZGUgdGhhdCBjbG9iYmVycyBleGlzdGluZyBuYW1lc3BhY2VzCQkKLVRIUklGVC0xMTAyICAgQnVpbGQgICAgICAgICAgICAgICAgInR5cG8gaW4gY29uZmlndXJlLmFjOiAiIj09IiIgb3BlcmF0b3IgaW4gJ3Rlc3QnIChpbnN0ZWFkIG9mIiInPSIiKSIJCQotVEhSSUZULTk5NCAgICBCdWlsZCAgICAgICAgICAgICAgICBEb24ndCB0cnkgdG8gaW52b2tlIHBocGl6ZSBpZiB3ZSBkb24ndCBoYXZlIGl0CQkKLVRIUklGVC04NjQgICAgQ29tcGlsZXIgKEdlbmVyYWwpICAgZGVmYXVsdCB2YWx1ZSBmYWlscyBpZiBpZGVudGlmaWVyIGlzIGEgc3RydWN0CQkKLVRIUklGVC0xMDIxICAgT0NhbWwgICAgICAgICAgICAgICAgRnJhbWVkIHRyYW5zcG9ydCBzdXBwb3J0IGZvciBPQ2FtbAkJCi1USFJJRlQtMTAzMiAgICAgICAgICAgICAgICAgICAgICAgIG1ha2UgZGlzdCBmYWlscyBkdWUgdG8gY19nbGliIHByb2JsZW0JCQotVEhSSUZULTEwNTcgICBDKysgICAgICAgICAgICAgICAgICBjYXN0cyBpbiBUQmluYXJ5UHJvdG9jb2wudGNjIGNhdXNpbmcgZGVyZWZlcmVuY2luZyB0eXBlLXB1bm5lZCBwb2ludGVyIHdpbGwgYnJlYWsgc3RyaWN0LWFsaWFzaW5nIHJ1bGVzCi1USFJJRlQtMTA1MyAgIEphdmEgICAgICAgICAgICAgICAgIE1ha2UgcmVtb3RlIGNsaWVudCdzIElQIGFkZHJlc3MgYXZhaWxhYmxlIGZvciBhbGwgc29ja2V0IHJlbGF0ZWQgdHJhbnNwb3J0cwkJCi1USFJJRlQtMTAzNiAgIEMrKyAgICAgICAgICAgICAgICAgICJBdXRvLWdlbmVyYXRlZCBDKysgY29kZSBmYWlscyB0byBjb21waWxlIHdpdGggIiItV2Vycm9yIC1XZXh0cmEgLVdhbGwiIiBnKysgY29tcGlsZXIgZmxhZ3MiCQkKLVRIUklGVC0xMDYzICAgVHV0b3JpYWwgICAgICAgICAgICAgRml4IEVybGFuZyBUdXRvcmlhbCBGaWxlcwkJCi1USFJJRlQtNjI1ICAgIEdvICAgICAgICAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciAnR28nCQkKLVRIUklGVC0xMDkzICAgUHl0aG9uICAgICAgICAgICAgICAgc2V2ZXJhbCBidWdzIGluIHB5dGhvbiBUQ29tcGFjdFByb3RvY29sCQkKLVRIUklGVC0xMTAxICAgSmF2YSAgICAgICAgICAgICAgICAgYnl0ZWJ1ZmZlciBsZW5ndGggY2FsY3VsYXRpb24gaW4gVEJpbmFyeVByb3RvY29sIHdyaXRlQmluYXJ5CQkKLVRIUklGVC0xMDk0ICAgUHl0aG9uICAgICAgICAgICAgICAgYnVnIGluIFRDb21wYWN0UHJvdG8gcHl0aG9uIHJlYWRNZXNzYWdlRW5kIG1ldGhvZCBhbmQgdXBkYXRlZCB0ZXN0IGNhc2VzCQkKLVRIUklGVC0xMTAwICAgUHl0aG9uICAgICAgICAgICAgICAgcHl0aG9uIFRTU0xTb2NrZXQgaW1wcm92ZW1lbnRzLCBpbmNsdWRpbmcgY2VydGlmaWNhdGUgdmFsaWRhdGlvbgkJCi1USFJJRlQtMTEwNCAgIEJ1aWxkICAgICAgICAgICAgICAgIElOU1RBTExESVJTIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBjb25maWd1cmUgc2NyaXB0CQkKLVRIUklGVC0xMTAzICAgUHl0aG9uICAgICAgICAgICAgICAgVFpsaWJUcmFuc3BvcnQgZm9yIHB5dGhvbiwgYSB6bGliIGNvbXByZXNzZWQgdHJhbnNwb3J0CQkKLVRIUklGVC0xMTA1ICAgT0NhbWwgICAgICAgICAgICAgICAgT0NhbWwgZ2VuZXJhdG9yIGRvZXMgbm90IHByZWZpeCBtZXRob2RzIG9mIGluY2x1ZGVkIHN0cnVjdHMgd2l0aCB0aGVpciB0eXBlCQkKLVRIUklGVC0xMTA3ICAgUHl0aG9uICAgICAgICAgICAgICAgaW1wcm92ZW1lbnQgZm9yIGNvbXBpbGVyLWdlbmVyYXRlZCBweXRob24gZm9yICdOb25lJyBvYmplY3QgY29tcGFyaXNvbnMJCQotVEhSSUZULTExMDkgICBKYXZhICAgICAgICAgICAgICAgICBEZXBsb3kgZmIzMDMgYWxvbmcgc2lkZSBsaWJ0aHJpZnQgdG8gbWF2ZW4gcmVwbwkJCi1USFJJRlQtMTExMSAgIENvbXBpbGVyIChHZW5lcmFsKSAgIFRoZSBIVE1MIGdlbmVyYXRvciBkb2VzIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHN0cmluZyBhbmQgYmluYXJ5IHR5cGVzCQkKLVRIUklGVC0xMDc0ICAgSmF2YSAgICAgICAgICAgICAgICAgLmtleXN0b3JlIGFuZCAudHJ1c3RzdG9yZSBhcmUgbWlzc2luZyBmcm9tIHRoZSAwLjYuMCBkaXN0cmlidXRpb24JCQotVEhSSUZULTExMTkgICBDIyAgICAgICAgICAgICAgICAgICBUSlNPTlByb3RvY29sIGZhaWxzIHRvIFVURjggZGVjb2RlIHN0cmluZ3MJCQotVEhSSUZULTExMjAgICBDIyAtIENvbXBpbGVyICAgICAgICBwcm90by5Xcml0ZUxpc3RFbmQgYmVpbmcgY2FsbGVkIGluIHRoZSB3cm9uZyBwbGFjZQkJCi1USFJJRlQtMTEyNiAgIEVybGFuZyAgICAgICAgICAgICAgIEV4dGVuZGluZyBzdHJ1Y3RfaW5mbyBmb3IgZXJsYW5nIGJpbmRpbmdzCQkKLVRIUklGVC0xMTMyICAgQyMgICAgICAgICAgICAgICAgICAgRGVzZXJpYWxpemF0aW9uIGVycm9yIGluIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBDIwkJCi1USFJJRlQtMTEzMSAgIEMjICAgICAgICAgICAgICAgICAgIEMjIEpTT04gUHJvdG9jb2wgaXMgdW5hYmxlIHRvIGRlY29kZSBlc2NhcGVkIGNoYXJhY3RlcnMgaW4gc3RyaW5nCQkKLVRIUklGVC0xMTMzICAgVHV0b3JpYWwgICAgICAgICAgICAgSmF2YSBhbmQgSmF2YVNjcmlwdCB0dXRvcmlhbCBpcyBicm9rZW4gc2luY2Ugd2UgaGF2ZSBKYXZhIG1hdmVuIGRlcGxveW1lbnQJCQotVEhSSUZULTExNDAgICBHbGliQyAgICAgICAgICAgICAgICBGcmFtZWQgVHJhbnNwb3J0IENsaWVudCB1c2luZyBDIChHbGliKSBMaWJyYXJ5IGhhbmdzIHdoZW4gY29ubmVjdGluZyB0byBSdWJ5IFNlcnZlcgkJCi1USFJJRlQtMzQyICAgIFBIUCAgICAgICAgICAgICAgICAgIFBIUDogY2FuJ3QgaGF2ZSBzZXRzIG9mIGNvbXBsZXggdHlwZXMJCQotVEhSSUZULTExNDkgICBSdWJ5ICAgICAgICAgICAgICAgICBOb25ibG9ja2luZyBzZXJ2ZXIgZmFpbHMgd2hlbiBjbGllbnQgY29ubmVjdGlvbiBpcyByZXNldAkJCi1USFJJRlQtMzYzICAgIEphdmEgICAgICAgICAgICAgICAgIE1hdmVuIERlcGxveQkJCi1USFJJRlQtMTE1NSAgIEphdmEJCQkJICAgUmVtb3ZlIGxvZzRqIGRlcGVuZGVuY3kgZnJvbSBqYXZhIGNsaWVudAkJCi1USFJJRlQtMTE3MCAgIEphdmEgICAgICAgICAgICAgICAgIFRocmlmdCBHZW5lcmF0ZWQgQ29kZSBhbmQgSmF2YSA1CQkKLVRIUklGVC04MzUgICAgQVMzICAgICAgICAgICAgICAgICAgQmFkIEFTMyBzeW50YXggaW4gY29uc3RydWN0b3JzIHRoYXQgc2V0IGRlZmF1bHQgdmFsdWVzCQkKLVRIUklGVC0xMTc0ICAgQnVpbGQgICAgICAgICAgICAgICAgUHVibGlzaCBhczMgY2xpZW50IGltcGxlbWVudGF0aW9uIHZpYSBNYXZlbiBmb3IgdXNlIGJ5IGZsZXgtbW9qb3MgdXNlcnMJCQotVEhSSUZULTExNzggICBKYXZhICAgICAgICAgICAgICAgICBKYXZhOiBUQmFzZSBzaWduYXR1cmUgc2hvdWxkIGJlIFQgZXh0ZW5kcyBUQmFzZTw/LD8+CQkKLVRIUklGVC0xMDY3ICAgUEhQICAgICAgICAgICAgICAgICAgVG9ucyBvZiBidWdzIGluIHBocCBpbXBsZW1lbnRhdGlvbgkJCi1USFJJRlQtMTE4MiAgIFJ1YnkgICAgICAgICAgICAgICAgIE5hdGl2ZSBkZXNlcmlhbGl6ZXIgc2VnZmF1bHRzIG9uIGluY29ycmVjdCBsaXN0IGVsZW1lbnQgdHlwZQkJCi1USFJJRlQtMTE5MCAgIEphdmEgICAgICAgICAgICAgICAgIHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZCBpbiBUTm9uYmxvY2tpbmdTZXJ2ZXIuamF2YSBzaG91bGQgYmUgQXRvbWljTG9uZyB0byBmaXggRkQgbGVha2FnZSAKLVRIUklGVC0xMTgzICAgUnVieSAgICAgICAgICAgICAgICAgUHVyZS1ydWJ5IENvbXBhY3RQcm90b2NvbCByYWlzZXMgQXJndW1lbnRFcnJvciB3aGVuIGRlc2VyaWFsaXppbmcgdW5kZXIgUnVieSAxLjkJCQotVEhSSUZULTExOTIgICAgICAgICAgICAgICAgICAgICAgICBUeXBvOiBUUHJvdG9jb2wuaCB0ZXN0cyBmb3IgSEFWRV9TWVNfUEFSQU1fSF8JCQotVEhSSUZULTExOTQgICBKYXZhICAgICAgICAgICAgICAgICBKYXZhIGxpYiBkb2VzIG5vdCBpbnN0YWxsIGFydGlmYWN0cyB0byBsb2NhbCBkaXIgY29ycmVjdGx5CQkKLVRIUklGVC0xMjA4ICAgUHl0aG9uICAgICAgICAgICAgICAgcHl0aG9uIFRDb21wYWN0UHJvdG9jb2wucHkgd3JpdGVCb29sIGFuZCByZWFkQm9vbCBub3QgZm9sbG93IHRoZSBjb21wYWN0LXByb3RvLXNwZWMtMi50eHQgc3BlYyAKLVRIUklGVC0xMjExICAgSmF2YSAgICAgICAgICAgICAgICAgV2hlbiB1c2luZyBUSHR0cENsaWVudCwgbm9uIDIwMCByZXNwb25zZXMgbGVhdmUgdGhlIGNvbm5lY3Rpb24gb3BlbgkJCi1USFJJRlQtNjI3ICAgIEMrKyAgICAgICAgICAgICAgICAgIHNob3VsZCBjKysgaGF2ZSBzZXR0ZXJzIGZvciBvcHRpb25hbCBmaWVsZHM/CQkKLVRIUklGVC0xMjE4ICAgR0xpYkMgICAgICAgICAgICAgICAgY19nbGliIHVzZXMgd3JvbmcgbmFtZSBpbiBwa2ctY29uZmlnCQkKLVRIUklGVC0xMTg5ICAgUnVieSAgICAgICAgICAgICAgICAgUnVieSBkZXNlcmlhbGl6ZXIgc3BlZWQgaW1wcm92ZW1lbnRzCQkKLVRIUklGVC0xMjI1ICAgUEhQICAgICAgICAgICAgICAgICAgVENvbXBhY3RQcm90b2NvbCBmb3IgUEhQCQkKLVRIUklGVC0xMjI3ICAgRXJsYW5nICAgICAgICAgICAgICAgRXJsYW5nIGltcGxlbWVudGF0aW9uIG9mIHRocmlmdCBKU09OIHByb3RvY29sCQkKLVRIUklGVC0xMjI4ICAgUEhQICAgICAgICAgICAgICAgICAgVGhlIHBocCBhY2NlbGVyYXRvciBtb2R1bGUgY2FsbHMgZmx1c2ggaW5jb3JyZWN0bHkJCQotVEhSSUZULTEyMzQgICBQeXRob24gICAgICAgICAgICAgICB0aHJpZnQgLS1oZWxwIGlzIG1pc3NpbmcgZG9jIG9uIHB5OnV0ZjhzdHJpbmdzCQkKLVRIUklGVC0xMjM3ICAgSmF2YSAgICAgICAgICAgICAgICAgSmF2YSBmYjMwMyBtaXNzaW5nIHNvbWUgbWV0aG9kcwkJCi1USFJJRlQtMTI0OCAgIEMrKyAgICAgICAgICAgICAgICAgIHBvaW50ZXIgc3VidHJhY3Rpb24gaW4gVE1lbW9yeUJ1ZmZlciByZWxpZXMgb24gdW5kZWZpbmVkIGJlaGF2aW9yCQkKLVRIUklGVC0xMjUzICAgSmF2YSAgICAgICAgICAgICAgICAgQ29kZSBnZW5lcmF0ZWQgZm9yIG1hcHMgaXMgbm90IGNvbXBpbGluZwkJCi1USFJJRlQtMTI1NSAgIEphdmEgICAgICAgICAgICAgICAgIE1pc21hdGNoIG9mIG1ldGhvZCBuYW1lIGJldHdlZW4gSmF2YU1FJ3MgbGliIGFuZCBnZW5lcmF0ZWQgY29kZSAoY29tcGFyZVRvL2NvbXBhcmVPYmplY3RzKQkJCi1USFJJRlQtMTIzOCAgIEphdmFTY3JpcHQgICAgICAgICAgIFRocmlmdCBKUyBjbGllbnQgY2Fubm90IHJlYWQgbWFwIG9mIHN0cnVjdHVyZXMJCQotVEhSSUZULTEyMTMgICAgICAgICAgICAgICAgICAgICAgICBNZW1idWZmZXIgc2hvdWxkIHByb3ZpZGUgYSB3YXkgdG8gZ2V0IGJhY2sgdGhlIGJ1ZmZlcgkJCi1USFJJRlQtMTExNyAgIEphdmFTY3JpcHQgICAgICAgICAgIEphdmFTY3JpcHQgVW5pdCBUZXN0IGRvZXMgbm90IHdvcmsgYW55bW9yZSBiZWNhdXNlIGxpYnRocmlmdCouamFyIHdoZXJlIG1vdmVkIGJ5IE1hdmVuIERlcGxveW1lbnQJCQotVEhSSUZULTExNjQgICBKYXZhU2NyaXB0ICAgICAgICAgICBTZWdtZW50YXRpb24gZmF1bHQgb24gTlVMTCBwb2ludGVyIGluIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdAkJCi1USFJJRlQtNzg4ICAgIFBIUCAgICAgICAgICAgICAgICAgIHRocmlmdF9wcm90b2NvbC5zbzogbXVsdGlnZXQvbXVsdGlnZXRfc2xpY2UgZG9lcyBub3QgaGFuZGxlIG1vcmUgdGhhbiAxNyBrZXlzIGNvcnJlY3RseQkJCi1USFJJRlQtMTIyMiAgIEMrKyAgICAgICAgICAgICAgICAgIFVuaGFuZGxlZCBleGNlcHRpb24gZm9yIFRFdmh0dHBTZXJ2ZXIgcmVxdWVzdAkJCi1USFJJRlQtMTI0MSAgIFBIUCAgICAgICAgICAgICAgICAgIHBocCBuYW1lc3BhY2UgZ2VuZXJhdGlvbgkJCi1USFJJRlQtMTIzNiAgIEVybGFuZyAgICAgICAgICAgICAgIEVybGFuZyBSZWNvbm5lY3RpbmcgVGhyaWZ0IENsaWVudAkJCi1USFJJRlQtMTE1MSAgIEVybGFuZyAgICAgICAgICAgICAgIFByb2R1Y2UgbW9yZSBpbmZvcm1hdGl2ZSBydW50aW1lIGVycm9yIGluIGNhc2Ugb2Ygc2NoZW1hIGFuZCBkYXRhIG1pc21hdGNoIGR1cmluZyBzZXJpYWxpemF0aW9uCQkKLVRIUklGVC0xMTQ2ICAgSmF2YSAgICAgICAgICAgICAgICAgQW5kcm9pZCBJbmNvbXBhdGliaWxpdHkgOiBpbiBBbmRyb2lkIDwgMi4zIGphdmEuaW8uSU9FeGNlcHRpb24gZG9lc24ndCBzdXBwb3J0IGZvciBUaHJvd2FibGUgCi1USFJJRlQtODI2ICAgIFBIUCAgICAgICAgICAgICAgICAgIFBIUCBUU29ja2V0IFdyaXRlIFRpbWVvdXQJCQotVEhSSUZULTI3ICAgICBFcmxhbmcgICAgICAgICAgICAgICBHZW5lcmF0ZWQgZXJsYW5nIHR5cGVzIGRvbid0IGNvbnRhaW4gZGVmYXVsdCB2YWx1ZXMgZm9yIHJlY29yZHMJCQotVEhSSUZULTExNTMgICBDKysgICAgICAgICAgICAgICAgICBIdHRwQ2xpZW50IGRvZXMgbm90IHNwZWNpZnkgdGhlIGNvbm5lY3Rpb24gY2xvc2UgcGFyYW1ldGVyCQkKLVRIUklGVC0xMTU0ICAgQ29jb2EgICAgICAgICAgICAgICAgSHR0cENsaWVudCBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBjb25uZWN0aW9uIGNsb3NlIHBhcmFtZXRlcgkJCi1USFJJRlQtMTA4MSAgIFBIUCAgICAgICAgICAgICAgICAgIFBIUCB0ZXN0cyBicm9rZW4gYW5kIHNvbWV3aGF0IGluY29tcGxldGUJCQotVEhSSUZULTEwNzggICBUZXN0IFN1aXRlICAgICAgICAgICBUaHJpZnRUZXN0LnRocmlmdCBnZW5lcmF0ZXMgaW52YWxpZCBQSFAgbGlicmFyeQkJCi1USFJJRlQtNDQ3ICAgIEphdmEgICAgICAgICAgICAgICAgIE1ha2UgYW4gYWJzdHJhY3QgYmFzZSBDbGllbnQgY2xhc3Mgc28gd2UgY2FuIGdlbmVyYXRlIGxlc3MgY29kZQkJCi1USFJJRlQtMTE4MSAgIEFTMyAgICAgICAgICAgICAgICAgIEFTMyBjb21waWxlciBnZW5lcmF0ZXMgaW5jb3JyZWN0IGNvZGUgZm9yIHNldHRpbmcgZGVmYXVsdCB2YWx1ZXMgaW4gY29uc3RydWN0b3IJCQotVEhSSUZULTk5NyAgICBKYXZhICAgICAgICAgICAgICAgICBVc2luZyB2YWx1ZU9mIGZvciBiYXNlIHR5cGVzIGluIGdldEZpZWxkVmFsdWUJCQotVEhSSUZULTk5OSAgICBQSFAgICAgICAgICAgICAgICAgICBBZGQgVEZvcmtpbmdTZXJ2ZXIJCQotVEhSSUZULTEwNDEgICBKYXZhICAgICAgICAgICAgICAgICBURGVzZXJpYWxpemVyIGhvbGRzIG9udG8gYSByZWZlcmVuY2Ugb2YgdGhlIGFycmF5IGl0IHJlYWRzIGFmdGVyIGl0IGlzIGRvbmUgZGVzZXJpYWxpemluZwkJCi1USFJJRlQtMTA2NSAgIEphdmFTY3JpcHQgICAgICAgICAgIFVuZXhwZWN0ZWQgZXhjZXB0aW9ucyBub3QgcHJvcGVyIGhhbmRsZWQgb24gSlMJCQotVEhSSUZULTk5MyAgICBDKysgICAgICAgICAgICAgICAgICBTb21lIGltcHJvdmVtZW50cyBpbiBDKysgc3R1YnMgZm9yIG9uZXdheSBvcGVyYXRpb25zCQkKLVRIUklGVC0xMDgzICAgUHl0aG9uICAgICAgICAgICAgICAgUHJlZm9ya2luZyBweXRob24gcHJvY2VzcyBwb29sIHNlcnZlcgkJCi1USFJJRlQtMTA5MiAgIFB5dGhvbiAgICAgICAgICAgICAgIGdlbmVyYXRlZCB2YWxpZGF0ZSgpIG1ldGhvZCBoYXMgd3JvbmcgaW5kZW50YXRpb24JCQotVEhSSUZULTEwNTAgICBKYXZhICAgICAgICAgICAgICAgICAiRGVjbGFyaW5nIGFuIGFyZ3VtZW50IG5hbWVkICIibWFuYWdlciIiIHRvIGEgc2VydmljZSBtZXRob2QgcHJvZHVjZXMgY29kZSB0aGF0IGZhaWxzIGNvbXBpbGUgCi1USFJJRlQtMTEwNiAgIEMrKyAgICAgICAgICAgICAgICAgIEMrKyBjb2RlIFRBc3luY1Byb3RvY29sUHJvY2Vzc29yLmggJiBUQXN5bmNCdWZmZXJQcm9jZXNzb3IuaCBkb250IGhhdmUgdmlydHVhbCBmdW5jdGlvbnMgCi1USFJJRlQtMTA4MCAgIEVybGFuZyAgICAgICAgICAgICAgIGVybGFuZyB0ZXN0J3MgJ21ha2UnIGZhaWxzIG9uIE1hYyBPU1gJCQotVEhSSUZULTczMSAgICBKYXZhICAgICAgICAgICAgICAgICBjb25maWd1cmUgZG9lc24ndCBjaGVjayBmb3IgYW50ID49IDEuNwkJCi1USFJJRlQtMTE4MCAgIEFTMyAgICAgICAgICAgICAgICAgIEFTMyBjb21waWxlciBnZW5lcmF0ZXMgdW5jb21waWxhYmxlIGNvZGUgZm9yIGJpbmFyeSB0eXBlcy4JCQotVEhSSUZULTExODcgICBSdWJ5ICAgICAgICAgICAgICAgICBub25ibG9ja2luZ19zZXJ2ZXIgc2h1dGRvd24gcmFjZSB1bmRlciBSdWJ5IDEuOQkJCi1USFJJRlQtMTE5MyAgIFJ1YnkgICAgICAgICAgICAgICAgIFBvdGVudGlhbCBpbmZpbml0ZSBsb29wIGluIG5vbmJsb2NraW5nX3NlcnZlcgkJCi1USFJJRlQtODkxICAgIENvbXBpbGVyIChHZW5lcmFsKSAgIENvbW1lbnRzIGFyZSBub3QgcHJvcGVybHkgaGFuZGxlZCBpbiBzb21lIGNhc2VzCQkKLVRIUklGVC0xMjE2ICAgSmF2YSAgICAgICAgICAgICAgICAgYnVpbGQgSmF2YSBMaWJyYXJ5IGJlaGluZCBhIHByb3h5CQkKLVRIUklGVC0xMTc3ICAgR28gICAgICAgICAgICAgICAgICAgVXBkYXRlIHRocmlmdCB0byByZWZsZWN0IGNoYW5nZXMgaW4gR28ncyBuZXR3b3JraW5nIGxpYnJhcmllcwkJCi1USFJJRlQtMTIyMCAgIEMrKyAgICAgICAgICAgICAgICAgIFRQcm9jZXNzb3I6OnByb2Nlc3MgbmV2ZXIgcmV0dXJucyBmYWxzZQkJCi1USFJJRlQtMTIzMSAgIEMrKyAgICAgICAgICAgICAgICAgIFJlbW92ZSBib2d1cyBpbmNsdWRlCQkKLVRIUklGVC0xMjE3ICAgQysrICAgICAgICAgICAgICAgICAgVXNlIGV2dXRpbF9zb2NrZXRwYWlyIGluc3RlYWQgb2YgcGlwZSAoV2luZG93cyBwb3J0KQkJCi1USFJJRlQtMTIxNSAgIEphdmFTY3JpcHQgICAgICAgICAgIFVuZGVmaW5lZCBwcm9wZXJ0eSBUaGlyZnQgaW4gbGliL2pzL3RocmlmdC5qcwkJCi1USFJJRlQtNDE4ICAgIFJ1YnkgICAgICAgICAgICAgICAgIERvbid0IGRvIHJ1bnRpbWUgc29ydGluZyBvZiBzdHJ1Y3QgZmllbGRzCQkKLVRIUklGVC0xMjQ0ICAgQysrICAgICAgICAgICAgICAgICAgJ3VzaW5nJyB0byBkaXNhbWJpZ3VhdGUgYmV0d2VlbiBmdW5jdGlvbnMgaW4gZGlmZmVyZW50IGJhc2VzIGRvZXMgbm90IGNvbmZvcm0gdG8gQysrIHN0YW5kYXJkCi1USFJJRlQtODkyICAgIEVybGFuZyAgICAgICAgICAgICAgIFJlZmFjdG9yIGVybGFuZyBidWlsZCBzeXN0ZW0gd2l0aCByZWJhcgkJCi1USFJJRlQtNjkwICAgIENvbXBpbGVyIChHZW5lcmFsKSAgIFVwZGF0ZSBUQXBwbGljYXRpb25FeGNlcHRpb24gY29kZXMJCQotVEhSSUZULTExOTkgICBKYXZhICAgICAgICAgICAgICAgICBVbmlvbiBzdHJ1Y3RzIHNob3VsZCBoYXZlIGdlbmVyYXRlZCBtZXRob2RzIHRvIHRlc3Qgd2hldGhlciBhIHNwZWNpZmljIGZpZWxkIGlzIGN1cnJlbnRseSBzZXQJCQotVEhSSUZULTExMyAgICBDb21waWxlciAoR2VuZXJhbCkgICB0by1zdHJpbmcgbWV0aG9kcyBzaG91bGQgb21pdCBvcHRpb25hbCBudWxsIGZpZWxkcyBmcm9tIG91dHB1dAkJCi1USFJJRlQtMTA0OSAgIFB5dGhvbiAgICAgICAgICAgICAgIEFsbG93IGZvciBUU2VydmVyU29ja2V0IHB5dGhvbiBsaWJyYXJ5IHRvIGJpbmQgdG8gYSBzcGVjaWZpYyBob3N0CQkKLVRIUklGVC0xMTUyICAgUEhQICAgICAgICAgICAgICAgICAgVEhSSUZULTExNDQgQXR0cmlidXRlcyBmcm9tIHByaXZhdGUgdG8gcHJvdGVjdGVkCQkKLVRIUklGVC0xMjA3ICAgUnVieSAgICAgICAgICAgICAgICAgIlN1cHBvcnQgREVTVERJUiBvbiAiIm1ha2UgaW5zdGFsbCIiIG9mIHJ1YnkgbGlicyIJCQotVEhSSUZULTExMjMgICBDKysgICAgICAgICAgICAgICAgICBQYXRjaCB0byBjb21waWxlIFRocmlmdCBzZXJ2ZXIgYW5kIGNsaWVudCBmb3IgdmMrKyA5LjAgYW5kIDEwLjAJCQotVEhSSUZULTEwMzEgICBDKysgICAgICAgICAgICAgICAgICBQYXRjaCB0byBjb21waWxlIFRocmlmdCBmb3IgdmMrKyA5LjAgYW5kIDEwLjAJCQotVEhSSUZULTEyMjEgICBDKysgICAgICAgICAgICAgICAgICBSZW1vdmUgU2ltcGxlQ2FsbGJhY2suaAkJCi1USFJJRlQtMTIzMyAgIEMrKyAgICAgICAgICAgICAgICAgIFJlbW92ZSB1bnVzZWQgaW5jbHVkZSBpbiBnZW5lcmF0ZWQgQysrIGNvZGUJCQotVEhSSUZULTEyNDYgICBKYXZhICAgICAgICAgICAgICAgICBJbXByb3ZlIGxvZ2dpbmc6IENoYW5nZSBUTm9uYmxvY2tpbmdTZXJ2ZXIgaW50ZXJuYWxSZWFkIHRvIHRyYWNlIGZyb20gd2FybgkJCi1USFJJRlQtMTI1MSAgIEphdmEgICAgICAgICAgICAgICAgIEdlbmVyYXRlZCBqYXZhIGNvZGUgc2hvdWxkIGluZGljYXRlIHdoaWNoIGZpZWxkcyBhcmUgcmVxdWlyZWQgYW5kIHdoaWNoIGFyZSBvcHRpb25hbAorIyMgRGVwcmVjYXRlZCBMYW5ndWFnZXMKKyAgICAqIENvY29hCisKKyMjIEJyZWFraW5nIENoYW5nZXMgKHNpbmNlIDAuMTEuMCkKKyAgICAqIFtUSFJJRlQtNDUyOV0gLSBSdXN0IGVudW0gdmFyaWFudHMgYXJlIG5vdyBjYW1lbC1jYXNlZCBpbnN0ZWFkIG9mIHVwcGVyY2FzZWQgdG8gY29uZm9ybSB0byBSdXN0IG5hbWluZyBjb252ZW50aW9ucworICAgICogW1RIUklGVC00NDQ4XSAtIFN1cHBvcnQgZm9yIGdvbGFuZyAxLjYgYW5kIGVhcmxpZXIgaGFzIGJlZW4gZHJvcHBlZC4KKyAgICAqIFtUSFJJRlQtNDQ3NF0gLSBQSFAgbm93IHVzZXMgdGhlIFBTUi00IGxvYWRlciBieSBkZWZhdWx0IGluc3RlYWQgb2YgY2xhc3MgbWFwcy4KKyAgICAqIFtUSFJJRlQtNDUzMl0gLSBtZXRob2Qgc2lnbmF0dXJlcyBjaGFuZ2VkIGluIHRoZSBjb21waWxlcidzIHRfb29wX2dlbmVyYXRvci4KKyAgICAqIFtUSFJJRlQtNDY0OF0gLSBUaGUgQyAoR0xpYikgY29tcGlsZXIncyBoYW5kbGluZyBvZiBuYW1lc3BhY2VzIGhhcyBiZWVuIGltcHJvdmVkLgorCisjIyBLbm93biBJc3N1ZXMgKEJsb2NrZXIgb3IgQ3JpdGljYWwpCisgICAgKiBbVEhSSUZULTQwMzddIC0gYnVpbGQ6IHVzZSBhIHNpbmdsZSBidWlsZCBzeXN0ZW0gZm9yIHRocmlmdAorICAgICogW1RIUklGVC00MTE5XSAtIGJ1aWxkOiBib290c3RyYXAuc2ggaXMgbWlzc2luZyBmcm9tIHNvdXJjZSB0YXJiYWxsCisgICAgKiBbVEhSSUZULTMyODldIC0gY3NoYXJwOiBzb2NrZXQgZXhoYXVzdGlvbiBpbiBjc2hhcnAgaW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMzAyOV0gLSBjb2NvYTogR2V0dGVycyBmb3IgZmllbGRzIGRlZmluZWQgd2l0aCB1cHBlcmNhc2UgbmFtZXMgZG8gbm90IHdvcmsKKyAgICAqIFtUSFJJRlQtMzMyNV0gLSBjb2NvYTogRXh0ZW5kZWQgc2VydmljZXMgYXJlbid0IHN1YmNsYXNzZXMgaW4gZ2VuZXJhdGVkIENvY29hCisgICAgKiBbVEhSSUZULTQxMTZdIC0gY29jb2E6IFRocmlmdCBkZS1jYXBpdGFsaXplcyB0aGUgbmFtZSBvZiBJc1NldCBwcm9wZXJ0eSBpbiBDb2NvYQorICAgICogW1RIUklGVC0zODc3XSAtIGNwcDogdGhlIGh0dHAgaW1wbGVtZW50YXRpb24gaXMgbm90IHN0YW5kYXJkOyBpbnRlcm9wIHdpdGggb3RoZXIgbGFuZ3VhZ2VzIGlzIHNwb3R0eSBhdCBiZXN0CisgICAgKiBbVEhSSUZULTQxODBdIC0gY3BwOiBJbXBvc3NpYmxlIHRvIGJ1aWxkIFRocmlmdCBDKysgbGlicmFyeSBmb3IgQW5kcm9pZCAoTkRLKQorICAgICogW1RIUklGVC00Mzg0XSAtIGNwcDogVXNpbmcgbXVsdGlwbGUgYXN5bmMgc2VydmljZXMgc2ltdWx0YW5lb3VzbHkgaXMgbm90IHRocmVhZC1zYWZlCisgICAgKiBbVEhSSUZULTMxMDhdIC0gaGFza2VsbDogRGVmYXVsdGVkIHN0cnVjdCBwYXJhbWV0ZXJzIG9uIGEgc2VydmljZSBnZW5lcmF0ZXMgaW52YWxpZCBIYXNrZWxsCisgICAgKiBbVEhSSUZULTM5OTBdIC0gbm9kZWpzOiBFeGNlcHRpb24gc3dhbGxvd2VkIGJ5IGRlc2VyaWFsaXphdGlvbiBmdW5jdGlvbgorICAgICogW1RIUklGVC00MjE0XSAtIG5vZGVqczogbWFwPGk2NCx2YWx1ZT4ga2V5IHRyZWF0ZWQgYXMgaGV4IHZhbHVlIGluIEphdmFTY3JpcHQKKyAgICAqIFtUSFJJRlQtNDYwMl0gLSBub2RlanM6IEVSUk9SIGluIC4vbm9kZV9tb2R1bGVzL3RocmlmdC9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29ubmVjdGlvbi5qcyBNb2R1bGUgbm90IGZvdW5kOiBFcnJvcjogQ2FuJ3QgcmVzb2x2ZSAnY2hpbGRfcHJvY2VzcycKKyAgICAqIFtUSFJJRlQtNDYzOV0gLSBub2RlanM6IFNlcXVlbmNlIG51bWJlcmluZyBmb3IgbXVsdGlwbGV4ZWQgcHJvdG9jb2wgYnJva2VuCisgICAgKiBbVEhSSUZULTEzMTBdIC0gcGhwOiBzZXF1ZW5jZSBhbmQgcmVjb25uZWN0aW9uIG1hbmFnZW1lbnQgaXNzdWVzCisgICAgKiBbVEhSSUZULTE1MzhdIC0gcGhwOiBFcnJvciBkdXJpbmcgZGVzZXJpYWxpemF0aW9uIGludDY0IG9uIDMyLWJpdCBhcmNoaXRlY3R1cmUKKyAgICAqIFtUSFJJRlQtMTU4MF0gLSBwaHA6IHRocmlmdCB0eXBlIGk2NCBqYXZhIHRvIHBocCBzZXJpYWxpemUvZGVzZXJlYWxpemUgbm90IHdvcmtpbmcKKyAgICAqIFtUSFJJRlQtMTk1MF0gLSBwaHA6IFBIUCBnZXRzIHN0dWNrIGluIGluZmluaXRlIGxvb3AKKyAgICAqIFtUSFJJRlQtMjk1NF0gLSBweXRob246IHNlbmRpbmcgaW50IG9yIGZsb2F0IGluIGEgZG91YmxlIGZpZWxkIGJyZWFrcyB0aGUgY29ubmVjdGlvbgorICAgICogW1RIUklGVC00MDgwXSAtIHB5dGhvbjogdW5peCBzb2NrZXRzIGNhbiBnZXQgc3R1Y2sgZm9yZXZlcgorICAgICogW1RIUklGVC00MjgxXSAtIHB5dGhvbjogZ2VuZXJhdGVkIGNvZGUgaXMgb3V0IG9mIG9yZGVyIGFuZCBjYXVzZXMgbG9hZCBpc3N1ZXMKKyAgICAqIFtUSFJJRlQtNDY3N10gLSBweTM6IFVuaWNvZGVEZWNpZGVFcnJvciBpbiBQeXRob24zCisKKyMjIEJ1aWxkIFByb2Nlc3MKKyAgICAqIFtUSFJJRlQtNDA2N10gLSBXaW5kb3dzIHRocmlmdCBjb21waWxlciBkaXN0cmlidXRlZCBvbiB0aGUgYXBhY2hlIHdlYiBzaXRlIGhhcyBydW50aW1lIGRlcGVuZGVuY2llcworICAgICogW1RIUklGVC00MzA4XSAtIEQgbGFuZ3VhZ2UgZG9ja2VyIGltYWdlcyBuZWVkIGRlbWlvcyBmb3IgbGliZXZlbnQgYW5kIG9wZW5zc2wgZml4ZWQgdG8gcmUtZW5hYmxlIG1ha2UgY3Jvc3Mgb24gZGxhbmcKKyAgICAqIFtUSFJJRlQtNDU3OV0gLSBVc2UgVWJ1bnR1IEJpb25pYyAoMTguMDQgTFRTKSBmb3IgQ0kgYnVpbGRzIGluc3RlYWQgb2YgQXJ0ZnVsICgxNy4xMCkKKyAgICAqIFtUSFJJRlQtNDUwOF0gLSBEZWZpbmUgQ0kgb3BlcmF0aW5nIHN5c3RlbSBjb3ZlcmFnZSBydWxlcyBmb3IgdGhlIHByb2plY3QgYW5kIChob3BlZnVsbHkpIHNpbXBsaWZ5IENJIGEgbGl0dGxlIG1vcmUKKyAgICAqIFtUSFJJRlQtNDM5N10gLSB1YnVudHUgaW5zdGFsbCBpbnN0cnVjdGlvbnMgYnJva2VuIG9uIDE2LjA0CisgICAgKiBbVEhSSUZULTQ1NDVdIC0gQXBwdmV5b3IgYnVpbGRzIGFyZSBmYWlsaW5nIGR1ZSB0byBhIGhhc2tlbGwgLyBjYWJhbCB1cGRhdGUgaW4gY2hvY29sYXRleQorICAgICogW1RIUklGVC00NDUyXSAtIG9wdGltaXplIERvY2tlcmZpbGUgKG9ubHkgb25ldGltZSBhcHQtZ2V0IHVwZGF0ZSkKKyAgICAqIFtUSFJJRlQtNDQ0MF0gLSBybSBgYnVpbGQvZG9ja2VyL3VidW50dS10cnVzdHkvRG9ja2VyZmlsZS5vcmlnYAorICAgICogW1RIUklGVC00MzUyXSAtIFVidW50dSBBcnRmdWwgZG9lc24ndCBhcHBlYXIgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFRocmlmdCBhbmQgSGF4ZSAzLjQuMgorICAgICogW1RIUklGVC00NjY2XSAtIERMYW5nIENsaWVudCBQb29sIFRlc3QgZmFpbHMgc3BvcmFkaWNhbGx5CisgICAgKiBbVEhSSUZULTQ2NzZdIC0gQ0wgdHV0b3JpYWwgYnVpbGQgZmFpbHMgc3BvcmFkaWNhbGx5CisgICAgKiBbVEhSSUZULTQ0NTZdIC0gTWFrZSBoYXhlbGliIGRvd25sb2FkIHF1aWV0IHNvIGl0IGRvZXNuJ3QgYmxvdyB1cCB0aGUgYnVpbGQgbG9nCisgICAgKiBbVEhSSUZULTQ2MDVdIC0gYm9vdHN0cmFwLnNoIGZhaWxzIGlmIGF1dG9tYWtlPTEuMTYuMQorCisjIyBjX2dsaWIKKyAgICAqIFtUSFJJRlQtNDY0OF0gLSBUaGUgQyAoR0xpYikgY29tcGlsZXIncyBoYW5kbGluZyBvZiBuYW1lc3BhY2VzIGhhcyBiZWVuIGltcHJvdmVkLgorICAgICogW1RIUklGVC00NjIyXSAtIGdsaWJDIGNvbXBpbGF0aW9uIGlzc3VlCisgICAgKiBbVEhSSUZULTQ2NzFdIC0gYyBnbGliIGlzIHVuYWJsZSB0byBoYW5kbGUgY2xpZW50IGNsb3NlIHVuZXhwZWN0ZWRseQorCisjIyBjbCAobmV3IGxhbmd1YWdlIHN1cHBvcnQgaW4gMC4xMi4wKQorICAgICogW1RIUklGVC04Ml0gLSBDb21tb24gTGlzcCBzdXBwb3J0CisKKyMjIGNzaGFycAorICAgICogW1RIUklGVC00NTU4XSAtIHJlc2VydmVkIENzaGFycCBrZXl3b3JkcyBhcmUgbm90IGVzY2FwZWQgaW4gc29tZSBjYXNlcworICAgICogW1RIUklGVC00NjM3XSAtIEMjIGFzeW5jIG1vZGUgZ2VuZXJhdGVzIGluY29ycmVjdCBjb2RlIHdpdGggaW5oZXJpdGVkIHNlcnZpY2VzCisgICAgKiBbVEhSSUZULTQ2NzJdIC0gSUFzeW5jUmVzdWx0IHN0eWxlIG1ldGhvZHMgbm90IGJlaW5nIHN1cHBvcnRlZCBieSBjZXJ0YWluIHRyYW5zcG9ydHMgbGVhZHMgdG8gaXNzdWVzIGluIG1peGVkIElTeW5jL0lBc3luYyB1c2UgY2FzZXMKKyAgICAqIFtUSFJJRlQtNDUzOV0gLSBBbGxvdyBUQnVmZmVyZWRUcmFuc3BvcnQgdG8gYmUgdXNlZCBhcyBiYXNlIGNsYXNzCisgICAgKiBbVEhSSUZULTQ1MzVdIC0gWE1MIGRvY3M7IGNvZGUgY2xlYW51cCAodGFicy0+c3BhY2VzOyBTdHJpbmctPnN0cmluZykKKyAgICAqIFtUSFJJRlQtNDQ5Ml0gLSBwcm90ZWN0ZWQgRXhjZXB0aW9uVHlwZSB0eXBlIG1lbWJlciBvZiBUQXBwbGljYXRpb25FeGNlcHRpb24gY2Fubm90IGJlIGFjY2Vzc2VkCisgICAgKiBbVEhSSUZULTQ0NDZdIC0gSlNPTlByb3RvY29sIEJhc2U2NCBFbmNvZGluZyBUcmltcyBQYWRkaW5nCisgICAgKiBbVEhSSUZULTQ0NTVdIC0gTWlzc2luZyBkaXNwb3NlIGNhbGxzIGluIFRocmVhZGVkU2VydmVyICYgVGhyZWFkcG9vbFNlcnZlcgorICAgICogW1RIUklGVC00NjA5XSAtIGtlZXAgSW5uZXJFeGNlcHRpb24gd2hlcmV2ZXIgYXBwcm9wcmlhdGUKKyAgICAqIFtUSFJJRlQtNDY3M10gLSBJQXN5bmNSZXN1bHQgbm90IHN1cHBvcnRlZCBieSBsYXllcmVkIHRyYW5zcG9ydHMgKGJ1ZmZlcmVkL2ZyYW1lZCkKKworIyMgY3BwCisgICAgKiBbVEhSSUZULTQ0NzZdIC0gVHlwZWNhc3RpbmcgcHJvYmxlbSBvbiBsaXN0IGl0ZW1zCisgICAgKiBbVEhSSUZULTQ0NjVdIC0gVE5vbmJsb2NraW5nU2VydmVyIHRocm93aW5nIFRIUklGVCBMT0dHRVI6IFRDb25uZWN0aW9uOjp3b3JrU29ja2V0KCk6IFRIUklGVF9FQUdBSU4gKHVuYXZhaWxhYmxlIHJlc291cmNlcykKKyAgICAqIFtUSFJJRlQtNDY4MF0gLSBUQnVmZmVyVHJhbnNwb3J0cy5oIGRvZXMgbm90IGNvbXBpbGUgdW5kZXIgVmlzdWFsIFN0dWRpbyAyMDE3CisgICAgKiBbVEhSSUZULTQ2MThdIC0gVE5vbmJsb2NraW5nU2VydmVyIGNyYXNoIGJlY2F1c2Ugb2YgbGltaXRhdGlvbiBvZiBzZWxlY3QoKQorICAgICogW1RIUklGVC00NjIwXSAtIFRabGliVHJhbnNwb3J0LmNwcCBkb2Vzbid0IGVuc3VyZSB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSBmb3IgdGhlIHpsaWIgZmx1c2ggbWFya2VyIGluIHRoZSBidWZmZXIuCisgICAgKiBbVEhSSUZULTQ1NzFdIC0gWmVyb01RIGNvbnRyaWIgbGlicmFyeSBuZWVkcyBhIHJlZnJlc2gKKyAgICAqIFtUSFJJRlQtNDU1OV0gLSBUU1NMU2VydmVyU29ja2V0IGluY29ycmVjdGx5IHByaW50cyBlcnJvcnMKKyAgICAqIFtUSFJJRlQtNDU3OF0gLSBNb3ZlIGBUQXN5bmNQcm90b2NvbFByb2Nlc3NvcmAgaW50byBtYWluIHRocmlmdCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTQ0MThdIC0gZXZodHRwX2Nvbm5lY3Rpb25fbmV3IGlzIGRlcHJlY2F0ZWQ7IHVzZSBldmh0dHBfY29ubmVjdGlvbl9iYXNlX25ldworCisjIyBjb21waWxlcgorICAgICogW1RIUklGVC00NjQ0XSAtIENvbXBpbGVyIGNhbm5vdCBiZSBjb21waWxlZCBvbiBtYWNPUyhtYXliZSBhbHNvIG9uIG90aGVyIHBsYXRmb3JtcyB3aXRoIGNsYW5nKQorICAgICogW1RIUklGVC00NTMxXSAtIFRocmlmdCBnZW5lcmF0ZXMgd3JvbmcgUHl0aG9uIGNvZGUgZm9yIGltbXV0YWJsZSBzdHJ1Y3R1cmVzIHdpdGggb3B0aW9uYWwgbWVtYmVycworICAgICogW1RIUklGVC00NTEzXSAtIHRocmlmdCBnZW5lcmF0ZWQgY29kZSBpcyBub3Qgc3RhYmxlIGZvciBjb25zdGFudHMKKyAgICAqIFtUSFJJRlQtNDUzMl0gLSBBdm9pZCB1cGRhdGluZyBUaHJpZnQgY29tcGlsZXIgZ2VuZXJhdGVkIGNvZGUgaWYgdGhlIG91dHB1dCBoYXMgbm90IGNoYW5nZWQKKyAgICAqIFtUSFJJRlQtNDQwMF0gLSBWaXN1YWwgU3R1ZGlvIENvbXBpbGVyIHByb2plY3Qgc2hvdWxkIGxpbmsgcnVudGltZSBzdGF0aWNhbGx5IGluIHJlbGVhc2UgYnVpbGRzCisgICAgKiBbVEhSSUZULTQzOTldIC0gcGx1Z2luLnRocmlmdCB0X2NvbnN0X3ZhbHVlIGlzIG5vdCB1c2VkIGFzIGEgdW5pb24gaW4gQysrIGNvZGUgLS0gZml4IHRoaXMKKyAgICAqIFtUSFJJRlQtNDQ5Nl0gLSBEZWFsaW5nIHdpdGggbGFuZ3VhZ2Uga2V5d29yZHMgaW4gVGhyaWZ0IChlLmcuIHNlcnZpY2UgbWV0aG9kIG5hbWVzKQorICAgICogW1RIUklGVC00MzkzXSAtIHJlcGVhdGVkIHJ1bnMgb2YgY29tcGlsZXIgcHJvZHVjZSBkaWZmZXJlbnQgYmluYXJ5IG91dHB1dCBhdCBwbHVnaW4gaW50ZXJmYWNlCisKKyMjIGRsYW5nCisgICAgKiBbVEhSSUZULTQ0NzhdIC0gVGhyaWZ0IHdpbGwgbm90IGJ1aWxkIHdpdGggZGxhbmcgMi4wNzggb3IgbGF0ZXIKKyAgICAqIFtUSFJJRlQtNDUwM10gLSBkbGFuZyBzZXJ2ZXJzIGxvZ0Vycm9yIG9uIG5vcm1hbCBjbGllbnQgZGlzY29ubmVjdGlvbgorICAgICogW1RIUklGVC00MzA4XSAtIEQgbGFuZ3VhZ2UgZG9ja2VyIGltYWdlcyBuZWVkIGRlbWlvcyBmb3IgbGliZXZlbnQgYW5kIG9wZW5zc2wgZml4ZWQgdG8gcmUtZW5hYmxlIG1ha2UgY3Jvc3Mgb24gZGxhbmcKKworIyMgZGFydAorICAgICogW1RIUklGVC00NjQ2XSAtIEVmZmVjdGl2ZSBEYXJ0IGFuZCBFeGNlcHRpb25zCisgICAgKiBbVEhSSUZULTQ0MzldIC0gU2hvdWxkbid0IGRvd25sb2FkIGRhcnQuZGViIGRpcmVjdGx5LgorCisjIyBkZWxwaGkKKyAgICAqIFtUSFJJRlQtNDU2Ml0gLSBDYWxsaW5nIHdyb25nIGV4Y2VwdGlvbiBDVE9SIGxlYWRzIHRvICJjYWxsIGZhaWxlZDogdW5rbm93biByZXN1bHQiIGluc3RlYWQgb2YgdGhlIHJlYWwgZXhjZXB0aW9uIGJlaW5nIHRocm93bgorICAgICogW1RIUklGVC00NTU0XSAtIHVuY29tcGlsZWFibGUgY29kZSB3aXRoIG1lbWJlciBuYW1lcyB0aGF0IGFyZSBhbHNvIHR5cGVzIHVuZGVyIHNwZWNpZmljIGNvbmRpdGlvbnMKKyAgICAqIFtUSFJJRlQtNDQyMl0gLSBBZGQgQXN5bmMgaW1wbGVtZW50YXRpb24gdmlhIElGdXR1cmUKKyAgICAqIFtUSFJJRlQtNDQ4NV0gLSBQb3NzaWJsZSBpbnZhbGlkIHB0ciBBViB3aXRoIG92ZXJsYXBwZWQgcmVhZC93cml0ZSBvbiBwaXBlcworICAgICogW1RIUklGVC00NTQ5XSAtIFRocmlmdCBleGNlcHRpb25zIHNob3VsZCBkZXJpdmUgZnJvbSBURXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTQ1NDBdIC0gYnVmZmVyZWQgdHJhbnNwb3J0IGJyb2tlbiB3aGVuIHRyeWluZyB0byByZS1vcGVuIGEgZm9ybWVybHkgY2xvc2VkIHRyYW5zcG9ydAorICAgICogW1RIUklGVC00NDczXSAtIE1vdmUgVGhyaWZ0LkNvbnNvbGUucGFzIG91dCBvZiB0aGUgTGlicmFyeQorICAgICogW1RIUklGVC00NDkwXSAtIEFsbG93IGEgZGVmYXVsdCBzZXJ2aWNlIGFzIGZhbGxiYWNrIGZvciBtdWx0aXBsZXggcHJvY2Vzc29ycyBjb25uZWN0ZWQgYnkgb2xkIGNsaWVudHMKKyAgICAqIFtUSFJJRlQtNDQ1NF0gLSBMYXJnZSB3cml0ZXMvcmVhZHMgbWF5IGNhdXNlIHJhbmdlIGNoZWNrIGVycm9ycyBpbiBkZWJ1ZyBtb2RlCisgICAgKiBbVEhSSUZULTQ0NjFdIC0gQ29tcGlsZXIgZGlyZWN0aXZlIHNob3VsZCBtYXRjaCBEZWxwaGkgWEU0CisgICAgKiBbVEhSSUZULTQ0NjJdIC0gRmlyc3QgbGluZSBpbiBDb25zb2xlIGR1cGxpY2F0ZWQKKyAgICAqIFtUSFJJRlQtNDY0Ml0gLSBGUFUgY3RybCB3b3JkIHNldHRpbmdzIG1heSBjYXVzZSBhbiB1bmV4cGVjdGVkICJkZW5vcm1hbGl6ZWQiIGVycm9yCisgICAgKiBbVEhSSUZULTQ1ODldIC0gSFRUUCBjbGllbnQgdGltZW91dHMgYXJlIGEpIGluY29tcGxldGUgYW5kIGIpIG5vdCB1c2VkIGF0IGFsbAorICAgICogW1RIUklGVC00NTkwXSAtIHJ1bm5pbmcgdGhlIHRlc3QgY2xpZW50IHVzaW5nIEhUVFAgdHJhbnNwb3J0IGxlYWRzIHRvICJDb0luaXRpYWxpemUgbm90IGNhbGxlZCIKKworIyMgZXJsYW5nCisgICAgKiBbVEhSSUZULTQ0OTddIC0gRXJsYW5nIHJlY29yZHMgc2hvdWxkIHVzZSBtYXAoKSBmb3IgbWFwIHR5cGUKKyAgICAqIFtUSFJJRlQtNDQ5NV0gLSBFcmxhbmcgcmVjb3JkcyBzaG91bGQgYWxsb3cgJ3VuZGVmaW5lZCcgZm9yIG5vbi1yZXF1aXJlZCBmaWVsZHMKKyAgICAqIFtUSFJJRlQtNDU4MF0gLSBGaXggZXJsYW5nIHR1dG9yaWFsIHVucGFjayBvbiBXaW5kb3dzCisgICAgKiBbVEhSSUZULTQ1ODJdIC0gVWJ1bnR1IFhlbmlhbCBlcmxhbmcgMTguMyAibWFrZSBjaGVjayIgZmFpbHMKKworIyMgZ29sYW5nCisgICAgKiBbVEhSSUZULTQ0NDhdIC0gU3VwcG9ydCBmb3IgZ29sYW5nIDEuNiBhbmQgZWFybGllciBoYXMgYmVlbiBkcm9wcGVkLgorICAgICogW1RIUklGVC00MjUzXSAtIEdvIGdlbmVyYXRvciBhc3NpZ25zIHN0cmluZ3MgdG8gZmllbGQgaW4gY29uc3QgaW5zdGVhZCBvZiBwb2ludGVycy4KKyAgICAqIFtUSFJJRlQtNDU3M10gLSBVbmlvbnMgRmllbGQgQ291bnQgRG9lcyBOb3QgQ29uc2lkZXIgQmluYXJ5CisgICAgKiBbVEhSSUZULTQ0NDddIC0gR29sYW5nOiBQYW5pYyBvbiBwLmMuQ2FsbCB3aGVuIHVzaW5nIGRlcHJlY2F0ZWQgaW5pdGlhbGl6ZXJzCisgICAgKiBbVEhSSUZULTQ2NTBdIC0gUmVxdWlyZWQgZmllbGQgaW5jb3JyZWN0bHkgbWFya2VkIGFzIHNldCB3aGVuIGZpZWxkVHlwZSBkb2VzIG5vdCBtYXRjaAorICAgICogW1RIUklGVC00NDg2XSAtIEdvbGFuZzogLXJlbW90ZS5nbyBjbGllbnQgY2xlYW51cAorICAgICogW1RIUklGVC00NTM3XSAtIFRTaW1wbGVTZXJ2ZXIgY2FuIGV4aXQgQWNjZXB0IGxvb3Agd2l0aCBsb2NrIHN0aWxsIGFjcXVpcmVkCisgICAgKiBbVEhSSUZULTQ1MTZdIC0gQWRkIHN1cHBvcnQgZm9yIGdvIDEuMTAKKyAgICAqIFtUSFJJRlQtNDQyMV0gLSBnb2xhbmcgdGVzdHMgcmVseSBvbiBnb21vY2ssIHdoaWNoIGhhcyBjaGFuZ2UgYmVoYXZpb3VyLCBjYXVzaW5nIHRlc3RzIHRvIGZhaWwKKyAgICAqIFtUSFJJRlQtNDYyNl0gLSBDb21tdW5pY2F0aW9uIGNyYXNoIHdoZW4gdXNpbmcgYmluYXJ5L2NvbXBhY3QgcHJvdG9jb2wgYW5kIHpsaWIgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTQ2NTldIC0gZ29sYW5nIHJhY2UgZGV0ZWN0ZWQgd2hlbiBjbG9zaW5nIGxpc3RlbmVyIHNvY2tldAorCisjIyBoYXNrZWxsCisgICAgKiBbVEhSSUZULTQ2MzRdIC0gSGFza2VsbCBidWlsZHMgd2l0aCBvbGRlciBjYWJhbCBjYW5ub3QgcmVjb25jaWxlIGNvbXBsZXggdmVyc2lvbiByZXF1aXJlbWVudHMKKworIyMgamF2YQorICAgICogW1RIUklGVC00MjU5XSAtIFRocmlmdCBkb2VzIG5vdCBjb21waWxlIGR1ZSB0byBBbnQgTWF2ZW4gdGFzayBlcnJvcnMKKyAgICAqIFtUSFJJRlQtMTQxOF0gLSBDb21waWxpbmcgVGhyaWZ0IGZyb20gc291cmNlOiBDbGFzcyBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Db25kaXRpb25UYXNrIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgbmVzdGVkICJ0eXBlZm91bmQiIGVsZW1lbnQKKyAgICAqIFtUSFJJRlQtNDUzMF0gLSBwcm9wb3NhbDogYWRkIG51bGxhYmlsaXR5IGFubm90YXRpb25zIHRvIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAgICAqIFtUSFJJRlQtNDYxNF0gLSBHZW5lcmF0ZSBtaXNzaW5nIEBOdWxsYWJsZSBhbm5vdGF0aW9ucyBmb3IgSmF2YSBpdGVyYXRvciBnZXR0ZXJzCisgICAgKiBbVEhSSUZULTQ1NTVdIC0gR2V0dGVyIG9mIGJpbmFyeSBmaWVsZCBpbiBKYXZhIGNyZWF0ZXMgdW5uZWNlc3NhcnkgY29weQorICAgICogW1RIUklGVC0zOTgzXSAtIGxpYnRocmlmdCBpcyBkZXBsb3llZCBvbiBjZW50cmFsIHdpdGggcG9tIHBhY2thZ2luZyBpbnN0ZWFkIG9mIGphcgorICAgICogW1RIUklGVC00Mjk0XSAtIEphdmEgQ29uZmlndXJlIEZhaWxzIGZvciBBbnQgPj0gMS4xMAorICAgICogW1RIUklGVC00MTc4XSAtIEphdmEgbGlicmFyaWVzIG1pc3NpbmcgZnJvbSBwYWNrYWdlIHdoZW4gdXNpbmcgY21ha2UKKyAgICAqIFtUSFJJRlQtNDEyMF0gLSBwb20gZmlsZXMgYXJlIG5vdCBnZW5lcmF0ZWQgb3IgcHJvdmlkZWQgaW4gdGhlIGJ1aWxkCisgICAgKiBbVEhSSUZULTE1MDddIC0gTWF2ZW4gY2FuJ3QgZG93bmxvYWQgcmVzb3VyY2UgZnJvbSBjZW50cmFsIHdoZW4gYmVoaW5kIGEgcHJveHkgYW5kIHdvbid0IHVzZSBsb2NhbCByZXBvc2l0b3J5CisgICAgKiBbVEhSSUZULTQ1NTZdIC0gT3B0aW9uYWwgcmV0aHJvdyBvZiB1bmhhbmRsZWQgZXhjZXB0aW9ucyBpbiBqYXZhIHByb2Nlc3NvcgorICAgICogW1RIUklGVC00MzM3XSAtIEFibGUgdG8gc2V0IGtleVN0b3JlIGFuZCB0cnVzdFN0b3JlIGFzIElucHV0U3RyZWFtIGluIHRoZSBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycworICAgICogW1RIUklGVC00NTY2XSAtIFBhc3MgbWVzc2FnZSBvZiB1bmhhbmRsZWQgZXhjZXB0aW9uIHRvIG9wdGlvbmFsIHJldGhyb3cuCisgICAgKiBbVEhSSUZULTQ1MDZdIC0gUmVtb3ZlIGFzc2VydGlvbiBpbiBKYXZhIFNBU0wgY29kZSB0aGF0IHdvdWxkIGJlIGlnbm9yZWQgaW4gcmVsZWFzZSBidWlsZHMKKyAgICAqIFtUSFJJRlQtNDQ3MF0gLSBJbmNsdWRlIHBvcHVsYXIgSURFIGZpbGUgdGVtcGxhdGVzIHRvIGdpdGlnbm9yZQorICAgICogW1RIUklGVC00NDI5XSAtIE1ha2UgVFRocmVhZFBvb2xTZXJ2ZXIuZXhlY3V0b3JTZXJ2aWNlXyBhdmFpbGFibGUgaW4gaW5oZXJpdGVkIGNsYXNzZXMgYW5kIHJlZmFjdG9yIG1ldGhvZHMgdG8gYmUgYWJsZSBjdXN0b21pemF0aW9uCisgICAgKiBbVEhSSUZULTM3NjldIC0gRml4IGxvZ2ljIG9mIFRIUklGVC0yMjY4CisgICAgKiBbVEhSSUZULTQ0OTRdIC0gSW5jcmVhc2UgSmF2YSBTb2NrZXQgQnVmZmVyIFNpemUKKyAgICAqIFtUSFJJRlQtNDQ5OV0gLSBSZW1vdmUgTWFnaWMgTnVtYmVyIEluIFRGSWxlVHJhbnNwb3J0CisKKyMjIGpzCisgICAgKiBbVEhSSUZULTQ0MDZdIC0gSmF2YVNjcmlwdDogVXNlIG1vZGVybiBQcm9taXNlIGltcGxlbWVudGF0aW9ucworICAgICogW1RIUklGVC00NjI1XSAtIGxldCAvIGNvbnN0IHZhcmlhYmxlIGRlY29yYXRvcnMgZm9yIGVzNiBjb21waWxlcgorICAgICogW1RIUklGVC00NjUzXSAtIEVTNiBDbGFzc2VzCisgICAgKiBbVEhSSUZULTQ1OTJdIC0gSlM6IHJlYWRJMzIgcGVyZm9ybWFuY2Ugb24gbGFyZ2UgYXJyYXlzIGlzIHZlcnkgcG9vciBpbiBDaHJvbWUKKyAgICAqIFtUSFJJRlQtNDUwOV0gLSBqcyBhbmQgbm9kZWpzIGxpYnJhcmllcyBuZWVkIHRvIGJlIHJlZnJlc2hlZCB3aXRoIGN1cnJlbnQgbGlicmFyaWVzCisgICAgKiBbVEhSSUZULTQ0MDNdIC0gdGhyaWZ0LmpzOiBJbmNvcnJlY3QgdXNhZ2Ugb2YgJ3RoaXMnIGluIFRXZWJTb2NrZXRUcmFuc3BvcnQuX19vbk9wZW4KKyAgICAqIFtUSFJJRlQtNDQzNl0gLSBEZXNlcmlhbGl6YXRpb24gb2YgbmVzdGVkIGxpc3QgZGlzY2FyZHMgY29udGVudAorICAgICogW1RIUklGVC00NDM3XSAtIEpTIFdlYlNvY2tldCBjbGllbnQgY2FsbGJhY2tzIGludm9rZWQgdHdpY2Ugb24gcGFyYWxsZWwgcmVxdWVzdHMKKyAgICAqIFtUSFJJRlQtNDY3OV0gLSBEdXBsaWNhdGUgZGVjbGFyYXRpb24gb2YgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yIGluIGxpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3Byb3RvY29sLmpzCisgICAgKiBbVEhSSUZULTQ1NTFdIC0gQWRkIHByZXR0aWVyIGZvciBjb25zaXN0ZW50IEpTIGNvZGUgZm9ybWF0dGluZworCisjIyBsdWEKKyAgICAqIFtUSFJJRlQtNDU5MV0gLSBsdWEgY2xpZW50IHVzZXMgdHdvIHdyaXRlKCkgY2FsbHMgcGVyIGZyYW1lZCBtZXNzYWdlIHNlbmQKKyAgICAqIFtUSFJJRlQtMzg2M10gLSBDYW4ndCAibWFrZSBpbnN0YWxsIiBMdWEgTGlicmFyeQorCisjIyBuZXRjb3JlCisgICAgKiBbVEhSSUZULTQ1MjRdIC0gLk5FVCBDb3JlIFNlcnZlciBkb2Vzbid0IGNsb3NlIHByb3Blcmx5IHdoZW4gY2FuY2VsbGVkCisgICAgKiBbVEhSSUZULTQ0MzRdIC0gVXBkYXRlIC5ORVQgQ29yZSBjb21wb25lbnRzLCBhZGQgdGVzdHMgZm9yIC5OZXQgQ29yZSBsaWJyYXJ5IGFuZCAuTmV0IENvcmUgY29tcGlsZXIsIGZpeCBidWdzIGFuZCBidWlsZCBwcm9jZXNzCisgICAgKiBbVEhSSUZULTQ0NDZdIC0gSlNPTlByb3RvY29sIEJhc2U2NCBFbmNvZGluZyBUcmltcyBQYWRkaW5nCisKKyMjIG5vZGUuanMKKyAgICAqIFtUSFJJRlQtNDIyNV0gLSBFcnJvciBoYW5kbGluZyBtYWxmb3JtZWQgYXJndW1lbnRzIGxlYWtzIG1lbW9yeSwgY29ycnVwdHMgdHJhbnNwb3J0IGJ1ZmZlcnMgY2F1c2luZyBuZXh0IFJQQyB0byBmYWlsCisgICAgKiBbVEhSSUZULTM5NTBdIC0gTWVtb3J5IGxlYWsgd2hpbGUgY2FsbGluZyBvbmV3YXkgbWV0aG9kCisgICAgKiBbVEhSSUZULTMxNDNdIC0gYWRkIHR5cGVzY3JpcHQgZGlyZWN0b3J5IHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtNDU2NF0gLSBUQnVmZmVyZWRUcmFuc3BvcnQgY2FuIGxlYXZlIGNvcnJ1cHQgZGF0YSBpbiB0aGUgYnVmZmVyCisgICAgKiBbVEhSSUZULTQ2NDddIC0gTm9kZS5qcyBGaWxlc2VydmVyIHdlYnJvb3QgcGF0aAorICAgICogW1RIUklGVC00NDg5XSAtIFVuaXggZG9tYWluIHNvY2tldCBzdXBwb3J0IGZvciBOb2RlSlMgY2xpZW50CisgICAgKiBbVEhSSUZULTQ0NDNdIC0gbm9kZS5qcyBqc29uX3Byb3RvY29sIHRocm93cyBlcnJvciBpbiBza2lwIGZ1bmN0aW9uCisgICAgKiBbVEhSSUZULTQ2MDRdIC0gTm9kZUpTOiBFeHBvc2UgSW50NjQgZnJvbSBicm93c2VyLmpzIGZvciBjb25zdW1wdGlvbiBieSBicm93c2VyCisgICAgKiBbVEhSSUZULTQ0ODBdIC0gTm9kZUpTIHdhcm5pbmcgb24gYmluYXJ5X3Byb3RvY29sIHdyaXRlTWVzc2FnZUVuZCB3aGVuIHNlcWlkID0gMAorCisjIyBwZXJsCisgICAgKiBbVEhSSUZULTQzODJdIC0gUmVwbGFjZSB0aGUgdXNlIG9mIFBlcmwgSW5kaXJlY3QgT2JqZWN0IFN5bnRheCBjYWxscyB0byBuZXcoKQorICAgICogW1RIUklGVC00NDcxXSAtIFRocmlmdCBDUEFOIHJlbGVhc2UgaXMgbWlzc2luZyBNYWtlZmlsZS5QTCBhbmQgdGhlIGNsaWVudHMgYXJlIHVuYWJsZSB0byBidWlsZCB0aGUgbW9kdWxlCisgICAgKiBbVEhSSUZULTQ0MTZdIC0gUGVybCBDUEFOIFBhY2thZ2luZyBJbXByb3ZlbWVudHMKKworIyMgcGhwCisgICAgKiBbVEhSSUZULTQ0NzRdIC0gUEhQIGdlbmVyYXRvciB1c2UgUFNSLTQgZGVmYXVsdAorICAgICogW1RIUklGVC00NDYzXSAtIFBIUCBnZW5lcmF0ZWQgY29kZSBtYXRjaCBQU1ItMgorICAgICogW1RIUklGVC00MzczXSAtIEV4dGVuZGluZyBUaHJpZnQgY2xhc3MgcmVzdWx0cyBpbiAiQXR0ZW1wdCBzZXJpYWxpemUgZnJvbSBub24tVGhyaWZ0IG9iamVjdCIKKyAgICAqIFtUSFJJRlQtNDM1NF0gLSBUU29ja2V0IGJsb2NrIG9uIHJlYWQKKyAgICAqIFtUSFJJRlQtNDQyM10gLSBtaWdyYXRlIHBocCBsaWJyYXJ5IHRvIHBzci00CisgICAgKiBbVEhSSUZULTQ2NTZdIC0gaW5maW5pdGUgbG9vcCBpbiBsYXRlc3QgUEhQIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtNDQ3N10gLSBUQnVmZmVyZWRUcmFuc3BvcnQgbXVzdCBoYXZlIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTQ0NzVdIC0gbGliL3BocC90ZXN0IHNob3VsZCBiZSBjaGVja2VkIGZvciBQU1ItMgorICAgICogW1RIUklGVC00NDk4XSAtIGFkZCBwaHBjcyBiYWNrCisgICAgKiBbVEhSSUZULTQ0NjBdIC0gcGhwIGxpYnJhcnkgdXNlIFBTUi0yCisgICAgKiBbVEhSSUZULTQ2NDFdIC0gVEN1cmxDbGllbnQgZG9lc24ndCBjaGVjayBmb3IgSFRUUCBzdGF0dXMgY29kZQorICAgICogW1RIUklGVC00NjQ1XSAtIFRDdXJsQ2xpZW50OiBzaG93IGFjdHVhbCBlcnJvciBtZXNzYWdlIHdoZW4gdGhyb3dpbmcgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgICogW1RIUklGVC00Njc0XSAtIEFkZCBzdHJlYW0gY29udGV4dCBzdXBwb3J0IGludG8gUEhQL1RIdHRwQ2xpZW50CisgICAgKiBbVEhSSUZULTQ0NTldIC0gcmVkdWNlIHBocCBsaWJyYXJ5IGRpcmVjdG9yeSBkZXB0aAorCisjIyBweXRob24KKyAgICAqIFtUSFJJRlQtNDY3MF0gLSBUd2lzdGVkLCBzbG90cywgYW5kIHZvaWQgbWV0aG9kIGZhaWxzIHdpdGggIm9iamVjdCBoYXMgbm8gYXR0cmlidXRlICdzdWNjZXNzJyIKKyAgICAqIFtUSFJJRlQtNDQ2NF0gLSBQb3RlbnRpYWxseSBzZXJ2ZXItY3Jhc2hpbmcgdHlwbyBpbiBQeXRob24gVE5vbmJsb2NraW5nU2VydmVyCisgICAgKiBbVEhSSUZULTQ1NDhdIC0gU3VwcG9ydGluZyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBwcm90b2NvbCB3aGVuIHVzaW5nIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBpbiBQeXRob24KKyAgICAqIFtUSFJJRlQtNDU3N10gLSBPdXRkYXRlZCBjaXBoZXIgc3RyaW5nIGluIHB5dGhvbiB1bml0IHRlc3QKKyAgICAqIFtUSFJJRlQtNDUwNV0gLSBweXRob24gYnVpbGQgb24gVmFncmFudCBXaW5kb3dzIGJveGVzIGZhaWxzCisgICAgKiBbVEhSSUZULTQ2MjFdIC0gVEhlYWRlciBmb3IgUHl0aG9uCisgICAgKiBbVEhSSUZULTQ2NjhdIC0gbWFrZSBzb2NrZXQgYmFja2xvZyBjb25maWd1cmFibGUgZm9yIHB5dGhvbgorICAgICogW1RIUklGVC00NTYxXSAtIFB5dGhvbjogY2xlYW51cCBzb2NrZXQgdGltZW91dCBzZXR0aW5ncworCisjIyBydWJ5CisgICAgKiBbVEhSSUZULTQyODldIC0gVGhyaWZ0IFJTcGVjIHRlc3Qgc3VpdGUgZmFpbHMgd2l0aCBSdWJ5IDIuNC54IGR1ZSB0byBGaXhudW0gZGVwcmVjYXRpb24KKyAgICAqIFtUSFJJRlQtNDM0Ml0gLSBTdXBwb3J0IHJ1YnkgcnNwZWMgMworICAgICogW1RIUklGVC00NTI1XSAtIEFkZCBzc2wgc29ja2V0IG9wdGlvbiB0byBydWJ5IGNyb3NzIHRlc3RzCisgICAgKiBbVEhSSUZULTQ0NTBdIC0gQWRkIHNlZWsgc3VwcG9ydCB0byBUQ29tcGFjdElucHV0UHJvdG9jb2wgaW4gUnVzdAorICAgICogW1RIUklGVC00NjMxXSAtIENvZGVnZW4gQ3JlYXRlcyBJbnZhbGlkIFJ1YnkgZm9yIFJlY3Vyc2l2ZSBTdHJ1Y3RzCisgICAgKiBbVEhSSUZULTQ0NzJdIC0gRml4IHRoZSBnZW5zcGVjIGZvciBydWJ5IHNvIGl0IGRvZXMgbm90IGNvbXBsYWluIGFib3V0IGFuIGludmFsaWQgbGljZW5zZQorCisjIyBydXN0CisgICAgKiBbVEhSSUZULTQ2NjJdIC0gUnVzdCBjb25zdCBzdHJpbmcgY2FsbHMgZnVuY3Rpb24gYXQgY29tcGlsZSB0aW1lCisgICAgKiBbVEhSSUZULTQ2NjFdIC0gUnVzdCBlbnVtIG5hbWUgd3JvbmcgY2FzZSBpbiBnZW5lcmF0ZWQgc3RydWN0cworICAgICogW1RIUklGVC00NjE3XSAtIEF2b2lkIGdlbmVyYXRpbmcgY29uZmxpY3Rpbmcgc3RydWN0IG5hbWVzIGluIFJ1c3QgY29kZQorICAgICogW1RIUklGVC00NTI5XSAtIFJ1c3QgZ2VuZXJhdGlvbiBzaG91bGQgaW5jbHVkZSAjIVthbGxvdyhub25fc25ha2VfY2FzZSldIG9yIGZvcmNlIGNvbmZvcm0gdG8gUnVzdCBzdHlsZSBndWlkZWxpbmVzCisgICAgKiBbVEhSSUZULTQzOTBdIC0gUnVzdCBiaW5hcnkgcHJvdG9jb2wgYW5kIGJ1ZmZlcmVkIHRyYW5zcG9ydCBjYW5ub3QgaGFuZGxlIHdyaXRlcyBhYm92ZSA0MDk2IGJ5dGVzCisgICAgKiBbVEhSSUZULTQ0MTldIC0gUnVzdCBmcmFtZWQgdHJhbnNwb3J0IGNhbm5vdCBoYW5kbGUgd3JpdGVzIGFib3ZlIDQwOTYgYnl0ZXMKKyAgICAqIFtUSFJJRlQtNDY1OF0gLSBSdXN0J3MgVEJpbmFyeUlucHV0UHJvdG9jb2wgZmFpbHMgd2hlbiBzdHJpY3QgaXMgZmFsc2UKKyAgICAqIFtUSFJJRlQtNDE4N10gLSBEYXJ0IC0+IFJ1c3QgRnJhbWVkIGNyb3NzIHRlc3RzIGZhaWwKKyAgICAqIFtUSFJJRlQtNDY2NF0gLSBSdXN0IGNhbm5vdCBjcmVhdGUgUmVhZEhhbGYvV3JpdGVIYWxmIHRvIGltcGxlbWVudCBjdXN0b20gdHJhbnBvcnRzCisgICAgKiBbVEhSSUZULTQ2NjVdIC0gS2VlcCBSdXN0IGxpYnJhcnkgdXAtdG8tZGF0ZSBvbiBjcmF0ZXMuaW8KKworIyMgc3dpZnQgKG5ldyBsYW5ndWFnZSBzdXBwb3J0IGluIDAuMTIuMCkKKyAgICAqIFtUSFJJRlQtMzc3M10gLSBTd2lmdCBMaWJyYXJ5CisKKyMjIHRlc3Qgc3VpdGUKKyAgICAqIFtUSFJJRlQtNDUxNV0gLSBHcmFjZWZ1bGx5IHNodXRkb3duIGNyb3NzLXRlc3Qgc2VydmVycyB0byBmdWxseSB0ZXN0IHRlYXJkb3duCisgICAgKiBbVEhSSUZULTQwODVdIC0gQWRkIC5ORVQgQ29yZSB0byB0aGUgbWFrZSBjcm9zcyBzdGFuZGFyZCB0ZXN0IHN1aXRlCisgICAgKiBbVEhSSUZULTQzNThdIC0gQWRkIHVuaXggZG9tYWluIHNvY2tldHMgaW4gcnVieSB0byBjcm9zcyB0ZXN0IC0gY29kZSBleGlzdHMKKworIyMgdHlwZXNjcmlwdCAobmV3IGxhbmd1YWdlIHN1cHBvcnQgaW4gMC4xMi4wKQorICAgICogW1RIUklGVC0zMTQzXSAtIGFkZCB0eXBlc2NyaXB0IGRpcmVjdG9yeSBzdXBwb3J0CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaHJpZnQgMC4xMS4wCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgU3ViLXRhc2sKKyAgICAqIFtUSFJJRlQtMjczM10gLSBFcmxhbmcgY29kaW5nIHN0YW5kYXJkcworICAgICogW1RIUklGVC0yNzQwXSAtIFBlcmwgY29kaW5nIHN0YW5kYXJkcworICAgICogW1RIUklGVC0zNjEwXSAtIFN0cmVhbWxpbmUgZXhjZXB0aW9uIGhhbmRsaW5nIGluIFB5dGhvbiBzZXJ2ZXIgaGFuZGxlcgorICAgICogW1RIUklGVC0zNjg2XSAtIEphdmEgcHJvY2Vzc29yIHNob3VsZCByZXBvcnQgaW50ZXJuYWwgZXJyb3Igb24gdW5jYXVnaHQgZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTQwNDldIC0gU2tpcCgpIHNob3VsZCB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBIG9uIHVua25vd24gZGF0YSB0eXBlcworICAgICogW1RIUklGVC00MDUzXSAtIFNraXAoKSBzaG91bGQgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSBvbiB1bmtub3duIGRhdGEgdHlwZXMKKyAgICAqIFtUSFJJRlQtNDEzNl0gLSBBbGlnbiBpc19iaW5hcnkoKSBtZXRob2Qgd2l0aCBpc19zdHJpbmcoKSB0byBzaW1wbGlmeSB0aG9zZSBjaGVja3MKKyAgICAqIFtUSFJJRlQtNDEzN10gLSBGaXggcmVtYWluaW5nIHVuZGVmaW5lZCBiZWhhdmlvciBpbnZhbGlkIHZwdHIgY2FzdHMgaW4gVGhyaWZ0IENvbXBpbGVyCisgICAgKiBbVEhSSUZULTQxMzhdIC0gRml4IHJlbWFpbmluZyB1bmRlZmluZWQgYmVoYXZpb3IgaW52YWxpZCB2cHRyIGNhc3RzIGluIEMrKyBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTQyOTZdIC0gRml4IFVidW50dSBYZW5pYWwgYnVpbGQgZW52aXJvbm1lbnQgZm9yIHRoZSBweXRob24gbGFuZ3VhZ2UKKyAgICAqIFtUSFJJRlQtNDI5OF0gLSBGaXggVWJ1bnR1IFhlbmlhbCBidWlsZCBlbnZpcm9ubWVudCBmb3IgdGhlIGdvIDEuNiBsYW5ndWFnZQorICAgICogW1RIUklGVC00Mjk5XSAtIEZpeCBVYnVudHUgWGVuaWFsIGJ1aWxkIGVudmlyb25tZW50IGZvciB0aGUgRCBsYW5ndWFnZQorICAgICogW1RIUklGVC00MzAwXSAtIEZpeCBtYWtlIGNyb3NzIGluIFVidW50dSBYZW5pYWwgZG9ja2VyIGVudmlyb25tZW50LCBvbmNlIGFsbCBsYW5ndWFnZSBzdXBwb3J0IGlzc3VlcyBhcmUgZml4ZWQKKyAgICAqIFtUSFJJRlQtNDMwMl0gLSBGaXggVWJ1bnR1IFhlbmlhbCBtYWtlIGNyb3NzIHRlc3RpbmcgZm9yIGx1YSBhbmQgcGhwNworICAgICogW1RIUklGVC00Mzk4XSAtIFVwZGF0ZSBFWFRSQV9ESVNUIGZvciAibWFrZSBkaXN0IgorCisjIyBCdWcKKyAgICAqIFtUSFJJRlQtMzgxXSAtIEZhaWwgZmFzdCBpZiBjb25maWd1cmUgZGV0ZWN0cyBDKysgcHJvYmxlbXMKKyAgICAqIFtUSFJJRlQtMTY3N10gLSBNaW5HVyBzdXBwb3J0IGJyb2tlbgorICAgICogW1RIUklGVC0xODA1XSAtIFRocmlmdCBzaG91bGQgbm90IHN3YWxsb3cgQUxMIGV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtMjAyNl0gLSBGaXggVENvbXBhY3RQcm90b2NvbCA2NCBiaXQgYnVpbGRzCisgICAgKiBbVEhSSUZULTI2NDJdIC0gUmVjdXJzaXZlIHN0cnVjdHMgZG9uJ3Qgd29yayBpbiBweXRob24KKyAgICAqIFtUSFJJRlQtMjg4OV0gLSBzdGFibGUgcmVsZWFzZSAwLjkuMiwgZXJsYW5nIHR1dG9yaWFsIGJyb2tlbgorICAgICogW1RIUklGVC0yOTEzXSAtIFJ1YnkgU2VydmVyIFRocmlmdDo6VGhyZWFkUG9vbFNlcnZlciBzaG91bGQgc2VydmUgaW5zaWRlIGEgdGhyZWFkCisgICAgKiBbVEhSSUZULTI5OThdIC0gTm9kZS5qczogTWlzc2luZyBoZWFkZXIgZnJvbSBodHRwIHJlcXVlc3QKKyAgICAqIFtUSFJJRlQtMzAwMF0gLSAuTkVUIGltcGxlbWVudGF0aW9uIGhhcyB0cm91YmxlIHdpdGggbWl4ZWQgSVAgbW9kZXMKKyAgICAqIFtUSFJJRlQtMzI4MV0gLSBUcmF2aXMgQ0kgYnVpbGQgcGFzc2VkIGJ1dCB0aGUgbG9nIHNheXMgQlVJTEQgRkFJTEVECisgICAgKiBbVEhSSUZULTMzNThdIC0gTWFrZWZpbGU6MTM2MjogKioqIG1pc3Npbmcgc2VwYXJhdG9yLiBTdG9wLgorICAgICogW1RIUklGVC0zNjAwXSAtIE1ha2UgVFR3aXN0ZWQgc2VydmVyIHNlbmQgZXhjZXB0aW9uIG9uIHVuZXhwZWN0ZWQgaGFuZGxlciBlcnJvcgorICAgICogW1RIUklGVC0zNjAyXSAtIE1ha2UgVG9ybmFkbyBzZXJ2ZXIgc2VuZCBleGNlcHRpb24gb24gdW5leHBlY3RlZCBoYW5kbGVyIGVycm9yCisgICAgKiBbVEhSSUZULTM2NTddIC0gRCBURmlsZVdyaXRlclRyYW5zcG9ydCBjbG9zZSBzaG91bGQgdXNlIG5vbi1wcmlvcml0eSBzZW5kCisgICAgKiBbVEhSSUZULTM3MDBdIC0gR28gTWFwIGhhcyB3cm9uZyBkZWZhdWx0IHZhbHVlIHdoZW4gb3B0aW9uYWwKKyAgICAqIFtUSFJJRlQtMzcwM10gLSBVbmlvbnMgRmllbGQgQ291bnQgRG9lcyBOb3QgQ29uc2lkZXIgTWFwL1NldC9MaXN0IEZpZWxkcworICAgICogW1RIUklGVC0zNzMwXSAtIHNlcnZlciBsb2cgZXJyb3IgdHdpY2UKKyAgICAqIFtUSFJJRlQtMzc3OF0gLSBnbyBjbGllbnQgY2FuIG5vdCBwYXNzIG1ldGhvZCBwYXJhbWV0ZXIgdG8gc2VydmVyIG9mIG90aGVyIGxhbmd1YWdlIGlmIG5vIGZpZWxkX2lkIGlzIGdpdmVuCisgICAgKiBbVEhSSUZULTM3ODRdIC0gdGhyaWZ0LW1hdmVuLXBsdWdpbiBnZW5lcmF0ZXMgaW52YWxpZCBpbmNsdWRlIGRpcmVjdG9yaWVzIGZvciBJREwgaW4gZGVwZW5kZW5jeSBKQVJzCisgICAgKiBbVEhSSUZULTM4MDFdIC0gTm9kZSBUaHJpZnQgY2xpZW50IHRocm93cyBleGNlcHRpb24gd2l0aCBtdWx0aXBsZXhlciBhbmQgcmVzcG9uc2VzIHRoYXQgYXJlIGJpZ2dlciB0aGFuIGEgc2luZ2xlIGJ1ZmZlcgorICAgICogW1RIUklGVC0zODIxXSAtIFRNZW1vcnlCdWZmZXIgYnVmZmVyIG1heSBvdmVyZmxvdyB3aGVuIHJlc2l6aW5nCisgICAgKiBbVEhSSUZULTM4MzJdIC0gVGhyaWZ0IHZlcnNpb24gMC45LjMgZXhhbXBsZSBvbiBXaW5kb3dzLCBWaXN1YWwgU3R1ZGlvLCBsaW5raW5nIGVycm9ycyBkdXJpbmcgY29tcGlsaW5nCisgICAgKiBbVEhSSUZULTM4NDddIC0gdGhyaWZ0L2NvbmZpZy5oIGluY2x1ZGVzIGEgI2RlZmluZSBmb3IgVkVSU0lPTiB3aGljaCB3aWxsIGxpa2VseSBjb25mbGljdCB3aXRoIGV4aXN0aW5nIHVzZXIgZW52aXJvbm1lbnQgb3IgY29kZQorICAgICogW1RIUklGVC0zODczXSAtIEZpeCB2YXJpb3VzIGJ1aWxkIHdhcm5pbmdzIHdoZW4gdXNpbmcgVmlzdWFsIFN0dWRpbworICAgICogW1RIUklGVC0zODkxXSAtIFROb25ibG9ja2luZ1NlcnZlciBjb25maWd1cmVkIHdpdGggbW9yZSB0aGFuIG9uZSBJTyB0aHJlYWRzIGRvZXMgbm90IGFsd2F5cyByZXR1cm4gZnJvbSBzZXJ2ZSgpIHVwb24gc3RvcCgpCisgICAgKiBbVEhSSUZULTM4OTJdIC0gVGhyaWZ0IHVzZXMgVExTIFNOSSBleHRlbnNpb24gcHJvdmlkZWQgYnkgT3BlblNTTCBsaWJyYXJ5LiBPbGRlciB2ZXJzaW9uIG9mIE9wZW5TU0woPCAwLjkuOGYpIG1heSBjcmVhdGUgcHJvYmxlbSBiZWNhdXNlIHRoZXkgZG8gbm90IHN1cHBvcnQgJ1NTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZSgpJy4KKyAgICAqIFtUSFJJRlQtMzg5NV0gLSBCdWlsZCBmYWlscyB1c2luZyBKYXZhIDEuOCB3aXRoIEFudCA8IDEuOQorICAgICogW1RIUklGVC0zODk2XSAtIG1hcDxzdHJpbmcsc3RyaW5nPiBkYXRhIHdpdGggbnVtYmVyIHN0cmluZyBrZXkgY2Fubm90IGFjY2VzcyB0aGF0IGRlc2VyaWFsaXplZCBieSBwaHAgZXh0ZW5zaW9uCisgICAgKiBbVEhSSUZULTM5MzhdIC0gUHl0aG9uIFROb25ibG9ja2luZ1NlcnZlciBkb2VzIG5vdCB3b3JrIHdpdGggU1NMCisgICAgKiBbVEhSSUZULTM5NDRdIC0gVFNTTFNvY2tldCBoYXMgZGVhZCBjb2RlIGluIGNoZWNrSGFuZHNoYWtlCisgICAgKiBbVEhSSUZULTM5NDZdIC0gSmF2YSAxLjUgY29tcGF0aWJpbGl0eSBicm9rZW4gZm9yIGJpbmFyeSBmaWVsZHMgKGphdmE1IG9wdGlvbikKKyAgICAqIFtUSFJJRlQtMzk2MF0gLSBJbmhlcml0ZWQgc2VydmljZXMgaW4gTHVhIGdlbmVyYXRvciBhcmUgbm90IG5hbWVkIGNvcnJlY3RseQorICAgICogW1RIUklGVC0zOTYyXSAtIEFudCBidWlsZC54bWwgYnJva2VuIG9uIFdpbmRvd3MgZm9yIEphdmEgbGlicmFyeQorICAgICogW1RIUklGVC0zOTYzXSAtIFRocmlmdC5jYWJhbCBmaWxlbmFtZSBkb2VzIG5vdCBtYXRjaCBtb2R1bGUgbmFtZQorICAgICogW1RIUklGVC0zOTY3XSAtIGdvYmplY3QvZ3BhcmFtLmg6MTY2OjMzOiB3YXJuaW5nOiBlbnVtZXJhdG9yIHZhbHVlIGZvciDigJhHX1BBUkFNX0RFUFJFQ0FURUTigJkgaXMgbm90IGFuIGludGVnZXIgY29uc3RhbnQgZXhwcmVzc2lvbgorICAgICogW1RIUklGVC0zOTY4XSAtIERlc2VyaWFsaXppbmcgZW1wdHkgc3RyaW5nL2JpbmFyeSBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMzk3NF0gLSBVc2luZyBjbGFuZy0zLjggYW5kIFRocmVhZFNhbml0aXplciBvbiB0aGUgY29uY3VycmVuY3lfdGVzdCBjbGFpbXMgYmFkIFBUaHJlYWQgYmVoYXZpb3IKKyAgICAqIFtUSFJJRlQtMzk4NF0gLSBQSFA3IGV4dGVuc2lvbiBjYXVzZXMgc2VnZmF1bHQKKyAgICAqIFtUSFJJRlQtNDAwOF0gLSBicm9rZW4gY2kgZHVlIHRvIHVwc3RyZWFtIGRlcGVuZGVuY3kgdmVyc2lvbmluZyBicmVhaworICAgICogW1RIUklGVC00MDA5XSAtIFVzZSBAaW1wbGVtZW50ZXIgaW5zdGVhZCBvZiBpbXBsZW1lbnRzIGluIFRUd2lzdGVkLnB5CisgICAgKiBbVEhSSUZULTQwMTBdIC0gUS5mY2FsbCBtZXNzaW5nIHVwIHdpdGggKnRoaXMqIHBvaW50ZXIgaW5zaWRlIGNhbGxlZCBmdW5jdGlvbgorICAgICogW1RIUklGVC00MDExXSAtIFNldHMgb2YgVGhyaWZ0IHN0cnVjdHMgZ2VuZXJhdGUgR28gY29kZSB0aGF0IGNhbid0IGJlIHNlcmlhbGl6ZWQgdG8gSlNPTgorICAgICogW1RIUklGVC00MDEyXSAtIFB5dGhvbiBUd2lzdGVkIGltcGxlbWVudGF0aW9uIHVzZXMgaW1wbGVtZW50cywgbm90IGNvbXBhdGlibGUgd2l0aCBQeTMKKyAgICAqIFtUSFJJRlQtNDAxNF0gLSBhbGlnbiBDIyBtZXRhIGRhdGEgaW4gQXNzZW1ibHlJbmZvLmNzCisgICAgKiBbVEhSSUZULTQwMTVdIC0gRml4IHdyb25nbHkgc3BlbGxlZCAiVGhpcmZ0InMKKyAgICAqIFtUSFJJRlQtNDAxNl0gLSB0ZXN0SW5zYW5pdHkoKSBpbXBsIGRvZXMgbm90IGNvbmZvcm0gdG8gdGVzdCBzcGVjIGluIFRocmlmdFRlc3QudGhyaWZ0CisgICAgKiBbVEhSSUZULTQwMjNdIC0gU2tpcCB1bmV4cGVjdGVkIGZpZWxkIHR5cGVzIG9uIHJlYWQvd3JpdGUKKyAgICAqIFtUSFJJRlQtNDAyNF0gLSBTa2lwKCkgc2hvdWxkIHRocm93IG9uIHVua25vd24gZGF0YSB0eXBlcworICAgICogW1RIUklGVC00MDI2XSAtIFRTU0xTb2NrZXQgZG9lc24ndCB3b3JrIHdpdGggUHl0aG9uIDwgMi43LjkKKyAgICAqIFtUSFJJRlQtNDAyOV0gLSBBY2NlbGVyYXRlZCBwcm90b2NvbHMgZG8gbm90IGJ1aWxkIGZyb20gdGhyaWZ0LXB5IDAuMTAuMCBvbiBQeVBJCisgICAgKiBbVEhSSUZULTQwMzFdIC0gR28gcGx1Z2luIGdlbmVyYXRlcyBpbnZhbGlkIGNvZGUgZm9yIGxpc3RzIG9mIHR5cGVkZWYnZWQgYnVpbHQtaW4gdHlwZXMKKyAgICAqIFtUSFJJRlQtNDAzM10gLSBEZWZhdWx0IGJ1aWxkIFdJVEhfUExVR0lOPU9OIGZvciBhbGwgYnVpbGRzIHJlc3VsdHMgaW4gcGFja2FnaW5nIGVycm9ycworICAgICogW1RIUklGVC00MDM0XSAtIENNYWtlIGRvZXNuJ3Qgd29yayB0byBidWlsZCBjb21waWxlciBvbiBNYWNPUworICAgICogW1RIUklGVC00MDM2XSAtIEFkZCAuTkVUIENvcmUgZW52aXJvbm1lbnQvYnVpbGQgc3VwcG9ydCB0byB0aGUgZG9ja2VyIGltYWdlCisgICAgKiBbVEhSSUZULTQwMzhdIC0gc29ja2V0IGNoZWNrOiBjaGVja2luZyBhbiB1bnNpZ25lZCBudW1iZXIgYWdhaW5zdCA+PSAwIG5ldmVyIGZhaWxzCisgICAgKiBbVEhSSUZULTQwNDJdIC0gRXh0cmFjdGlvbkVycm9yIHdoZW4gdXNpbmcgYWNjZWxlcmF0ZWQgdGhyaWZ0IGluIGEgbXVsdGlwcm9jZXNzIHRlc3QKKyAgICAqIFtUSFJJRlQtNDA0M10gLSB0aHJpZnQgcGVybCBkZWJpYW4gcGFja2FnZSBpcyBwbGFjaW5nIGZpbGVzIGluIHRoZSB3cm9uZyBwbGFjZQorICAgICogW1RIUklGVC00MDQ0XSAtIEJ1aWxkIGpvYiAxNyBmYWlsaW5nIG9uIGV2ZXJ5IHB1bGwgcmVxdWVzdDsgaHNwZWMgY29yZSAoaGFza2VsbCkgMi40IGlzc3VlCisgICAgKiBbVEhSSUZULTQwNDZdIC0gTWluR1cgd2l0aCBnY2MgNi4yIGRvZXMgbm90IGNvbXBpbGUgb24gV2luZG93cworICAgICogW1RIUklGVC00MDYwXSAtIFRocmlmdCBwcmludFRvIG9zdHJlYW0gb3ZlcmxvYWQgbWVjaGFuaXNtIGJyZWFrcyBkb3duIHdoZW4gdHlwZXMgYXJlIG5lc3RlZAorICAgICogW1RIUklGVC00MDYyXSAtIFJlbW92ZSBkZWJ1ZyBwcmludCBmcm9tIFRTZXJ2aWNlQ2xpZW50CisgICAgKiBbVEhSSUZULTQwNjVdIC0gRG9jdW1lbnQgUGVybCBGb3JraW5nU2VydmVyIHNpZ25hbCByZXN0cmljdGlvbiBpbXBvc2VkIGJ5IFRIUklGVC0zODQ4IGFuZCByZW1vdmUgdW5uZWNlc3NhcnkgY29kZQorICAgICogW1RIUklGVC00MDY4XSAtIEEgY29kZSBjb21tZW50IGluIEphdmEgU2VydmVyU29ja2V0IGlzIHdyb25nIGFyb3VuZCBhY2NlcHQoKQorICAgICogW1RIUklGVC00MDczXSAtIGVudW0gZmlsZXMgYXJlIHN0aWxsIGJlaW5nIGdlbmVyYXRlZCB3aXRoIHVudXNlZCBpbXBvcnRzCisgICAgKiBbVEhSSUZULTQwNzZdIC0gQXBwdmV5b3IgYnVpbGRzIGZhaWxpbmcgYmVjYXVzZSBhbnQgMS45Ljggd2FzIHJlbW92ZWQgZnJvbSBhcGFjaGUgc2VydmVycworICAgICogW1RIUklGVC00MDc3XSAtIEFJX0FERFJDT05GSUcgcmVkZWZpbmVkIGFmdGVyIHJlY2VudCBjaGFuZ2UgdG8gUGxhdGZvcm1Tb2NrZXQgaGVhZGVyCisgICAgKiBbVEhSSUZULTQwNzldIC0gR2VuZXJhdGVkIHBlcmwgY29kZSB0aGF0IHJldHVybnMgc3RydWN0dXJlcyBmcm9tIGluY2x1ZGVkIHRocmlmdCBmaWxlcyBpcyBtaXNzaW5nIGEgbmVjZXNzYXJ5IHVzZSBjbGF1c2UKKyAgICAqIFtUSFJJRlQtNDA4N10gLSBTcHVyaW91cyBleGNlcHRpb24gZGVzdHJveWluZyBUVGhyZWFkZWRTZXJ2ZXIgYmVjYXVzZSBvZiBpbmNvcnJlY3Qgam9pbigpIGNhbGwKKyAgICAqIFtUSFJJRlQtNDEwMl0gLSBUQnVmZmVyZWRUcmFuc3BvcnQgcGVyZm9ybWFuY2UgaXNzdWUgc2luY2UgMC4xMC4wCisgICAgKiBbVEhSSUZULTQxMDZdIC0gY29uY3VycmVuY3lfdGVzdCBmYWlscyByYW5kb21seQorICAgICogW1RIUklGVC00MTA4XSAtIGNfZ2xpYiB0aHJpZnQgc3NsIGhhcyBtdWx0aXBsZSBidWdzIGFuZCBkZXByZWNhdGVkIGZ1bmN0aW9ucworICAgICogW1RIUklGVC00MTA5XSAtIENvbmZpZ3VyZSBTY3JpcHQgdXNlcyBzdHJpbmcgY29tcGFyaXNvbiBmb3IgdmVyc2lvbnMKKyAgICAqIFtUSFJJRlQtNDEyOV0gLSBDKysgVE5vbmJsb2NraW5nU2VydmVyIGZkIGxlYWsgd2hlbiBmYWlsaW5nIHRvIGRpc3BhdGNoIG5ldyBjb25uZWN0aW9ucworICAgICogW1RIUklGVC00MTMxXSAtIEphdmFzY3JpcHQgd2l0aCBXZWJTb2NrZXQgaGFuZGxlcyBvbmV3YXkgbWV0aG9kcyB3cm9uZworICAgICogW1RIUklGVC00MTM0XSAtIEZpeCByZW1haW5pbmcgdW5kZWZpbmVkIGJlaGF2aW9yIGludmFsaWQgdnB0ciBjYXN0cworICAgICogW1RIUklGVC00MTQwXSAtIFVzZSBvZiBub24tdGhyZWFkLXNhZmUgZnVuY3Rpb24gZ210aW1lKCkKKyAgICAqIFtUSFJJRlQtNDE0MV0gLSBJbnN0YWxsYXRpb24gb2YgaGF4ZSBpbiBkb2NrZXIgZmlsZXMgcmVmZXJzIHRvIGEgcmVkaXJlY3QgbGluayBhbmQgZmFpbHMKKyAgICAqIFtUSFJJRlQtNDE0N10gLSBSdXN0OiBwcm90b2NvbCBzaG91bGQgYWNjZXB0IHRyYW5zcG9ydHMgd2l0aCBub24tc3RhdGljIGxpZmV0aW1lCisgICAgKiBbVEhSSUZULTQxNDhdIC0gW21hdmVuLXRocmlmdC1wbHVnaW5dIGNvbXBpbGUgZXJyb3Igd2hpbGUgaW1wb3J0IGEgdGhyaWZ0IGluIGRlcGVuZGVuY3kgamFyIGZpbGUuCisgICAgKiBbVEhSSUZULTQxNDldIC0gU3lzdGVtLm91dCBwb2xsdXRlcyBsb2cgZmlsZXMgCisgICAgKiBbVEhSSUZULTQxNTRdIC0gUEhQIGNsb3NlKCkgb2YgYSBUU29ja2V0IG5lZWRzIHRvIGNsb3NlIGFueSB0eXBlIG9mIHNvY2tldAorICAgICogW1RIUklGVC00MTU4XSAtIG1pbm9yIGlzc3VlIGluIFJFQURNRS1NU1lTMi5tZAorICAgICogW1RIUklGVC00MTU5XSAtIEJ1aWxkaW5nIHRlc3RzIGZhaWxzIG9uIE1TWVMyIChNaW5HVzY0KSBkdWUgdG8gYSAoc21hbGw/KSBsaW5rZXIgZXJyb3IKKyAgICAqIFtUSFJJRlQtNDE2MF0gLSBUTm9uYmxvY2tpbmcgc2VydmVyIGZpeCB1c2Ugb2YgY2xvc2VkL2ZyZWVkIGNvbm5lY3Rpb25zCisgICAgKiBbVEhSSUZULTQxNjFdIC0gVE5vbkJsb2NraW5nIHNlcnZlciB1c2luZyB1bmluaXRpYWxpemVkIGV2ZW50IGluIGVycm9yIHBhdGhzCisgICAgKiBbVEhSSUZULTQxNjJdIC0gVE5vbkJsb2NraW5nIGhhbmRsaW5nIG9mIFRTb2NrZXRzIGluIGVycm9yIHN0YXRlIGlzIGluY29ycmVjdCBhZnRlciBmZCBpcyBjbG9zZWQKKyAgICAqIFtUSFJJRlQtNDE2NF0gLSBDb3JlIGluIFRTU0xTb2NrZXQgY2xlYW51cE9wZW5TU0wgd2hlbiBkZXN0cm95aW5nIGEgbXV0ZXggdXNlZCBieSBvcGVuc3NsCisgICAgKiBbVEhSSUZULTQxNjVdIC0gQysrIGJ1aWxkIGhhcyBtYW55IHdhcm5pbmdzIHVuZGVyIGMrKzAzIGR1ZSB0byByZWNlbnQgY2hhbmdlcywgY21ha2UgbmVlZHMgYmV0dGVyIHBsYXRmb3JtLWluZGVwZW5kZW50IGxhbmd1YWdlIGxldmVsIGNvbnRyb2wKKyAgICAqIFtUSFJJRlQtNDE2Nl0gLSBSZWNlbnQgZml4IHRvIHJlbW92ZSBib29zdDo6bGV4aWNhbF9jYXN0IHVzYWdlIGJyb2tlIFZTMjAxMAorICAgICogW1RIUklGVC00MTY3XSAtIE1pc3NpbmcgY29tcGlsZSBmbGFnCisgICAgKiBbVEhSSUZULTQxNzBdIC0gU3VwcG9ydCBsdWEgNS4xIG9yIGVhcmxpZXIgcHJvcGVybHkgZm9yIG9iamVjdCBsZW5ndGggZGV0ZXJtaW5hdGlvbgorICAgICogW1RIUklGVC00MTcyXSAtIG5vZGUuanMgdHV0b3JpYWwgY2xpZW50IGRvZXMgbm90IGltcG9ydCBhc3NlcnQsIGNvbm5lY3Rpb24gaXNzdWVzIGFyZSBub3QgaGFuZGxlZCBwcm9wZXJseQorICAgICogW1RIUklGVC00MTc3XSAtIEphdmEgY29tcGlsZXIgcHJvZHVjZXMgZGVlcCBjb3B5IGNvbnN0cnVjdG9yIHRoYXQgY291bGQgbWFrZSBzaGFsbG93IGNvcHkgaW5zdGVhZAorICAgICogW1RIUklGVC00MTg0XSAtIEJ1aWxkaW5nIG9uIEFwcHZleW9yOiBpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSBcTAorICAgICogW1RIUklGVC00MTg1XSAtIGZiMzAzIGNvdW50ZXIgZW5jb2RpbmcgZml4CisgICAgKiBbVEhSSUZULTQxODldIC0gRnJhbWVkL2J1ZmZlcmVkIHRyYW5zcG9ydCBEaXNwb3NlKCkgZG9lcyBub3QgZGlzcG9zZSB0aGUgbmVzdGVkIHRyYW5zcG9ydAorICAgICogW1RIUklGVC00MTkzXSAtIExvd2VyIHRoZSBkZWZhdWx0IG1heFJlYWRCdWZmZXJCeXRlcyBmb3Igbm9uLWJsb2NraW5nIHNlcnZlcnMKKyAgICAqIFtUSFJJRlQtNDE5NV0gLSBDb21waWxhdGlvbiB0byBHTyBwcm9kdWNlcyBicm9rZW4gY29kZQorICAgICogW1RIUklGVC00MTk2XSAtIENhbm5vdCBnZW5lcmF0ZSByZWN1cnNpdmUgUnVzdCB0eXBlcworICAgICogW1RIUklGVC00MjA0XSAtIHR5cG8gaW4gY29tcGFjdCBzcGVjCisgICAgKiBbVEhSSUZULTQyMDZdIC0gU3RyaW5ncyBpbiBjb250YWluZXIgZmllbGRzIGFyZSBub3QgZGVjb2RlZCBwcm9wZXJseSB3aXRoIHB5OmR5bmFtaWMgYW5kIHB5OnV0ZjhzdHJpbmdzCisgICAgKiBbVEhSSUZULTQyMDhdIC0gQyMgTmFtZWRQaXBlc1NlcnZlciBub3QgcmVhbGx5IHdvcmtpbmcgaW4gc29tZSBzY2VuYXJpb3MKKyAgICAqIFtUSFJJRlQtNDIxMV0gLSBGaXggR0Vycm9yIGdsaWIgbWFuYWdlbWVudCB1bmRlciBUaHJpZnQKKyAgICAqIFtUSFJJRlQtNDIxMl0gLSBjX2dsaWIgZmx1c2ggdHJpZXMgdG8gY2xvc2UgU1NMIGV2ZW4gaWYgc29ja2V0IGlzIGludmFsaWQKKyAgICAqIFtUSFJJRlQtNDIxM10gLSBUcmF2aXMgYnVpbGQgZmFpbHMgYXQgY3VybCAtc1NMIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9pbnN0YWxsLnNoIHwgc2gKKyAgICAqIFtUSFJJRlQtNDIxNV0gLSBHb2xhbmcgVFRyYW5zcG9ydEZhY3RvcnkgUGF0dGVybiBTcXVlbGNoZXMgRXJyb3JzCisgICAgKiBbVEhSSUZULTQyMTZdIC0gR29sYW5nIEh0dHAgQ2xpZW50cyBEbyBOb3QgUmVzcGVjdCBVc2VyIE9wdGlvbnMKKyAgICAqIFtUSFJJRlQtNDIxOF0gLSBTZXQgVENQX05PREVMQVkgZm9yIFBIUCBjbGllbnQgc29ja2V0CisgICAgKiBbVEhSSUZULTQyMTldIC0gR29sYW5nIEhUVFAgY2xpZW50cyBjcmVhdGVkIHdpdGggTmlsIGJ1ZmZlcgorICAgICogW1RIUklGVC00MjMxXSAtIFRKU09OUHJvdG9jb2wgdGhyb3dzIHVuZXhwZWN0ZWQgbm9uLVRocmlmdC1leGNlcHRpb24gb24gbnVsbCBzdHJpbmdzCisgICAgKiBbVEhSSUZULTQyMzJdIC0gLi9jb25maWd1cmUgZG9lcyBiYWQgYW50IHZlcnNpb24gY2hlY2sKKyAgICAqIFtUSFJJRlQtNDIzNF0gLSBUcmF2aXMgYnVpbGQgZmFpbHMgY3Jvc3MgbGFuZ3VhZ2UgdGVzdHMgd2l0aCAiVW5zdXBwb3J0ZWQgc2VjdXJpdHkgcHJvdG9jb2wgdHlwZSIKKyAgICAqIFtUSFJJRlQtNDIzN10gLSBHbyBUU2VydmVyU29ja2V0IFJhY2UgQ29uZGl0aW9ucworICAgICogW1RIUklGVC00MjQwXSAtIEdvIFRTaW1wbGVTZXJ2ZXIgZG9lcyBub3QgY2xvc2UgcHJvcGVybHkKKyAgICAqIFtUSFJJRlQtNDI0M10gLSBHbyBUU2ltcGxlU2VydmVyIHJhY2Ugb24gd2FpdCBpbiBTdG9wKCkgbWV0aG9kCisgICAgKiBbVEhSSUZULTQyNDVdIC0gR29sYW5nIFRGcmFtZWRUcmFuc3BvcnQncyB3cml0ZUJ1ZmZlciBpbmNyZWFzZXMgaWYgd3JpdGVzIHRvIHRyYW5zcG9ydCBmYWlsZWQKKyAgICAqIFtUSFJJRlQtNDI0Nl0gLSBTZXF1ZW5jZSBudW1iZXIgbWlzbWF0Y2ggb24gbXVsdGlwbGV4ZWQgY2xpZW50cworICAgICogW1RIUklGVC00MjQ3XSAtIENvbXBpbGUgZmFpbHMgd2l0aCBvcGVuc3NsIDEuMQorICAgICogW1RIUklGVC00MjQ4XSAtIENvbXBpbGUgZmFpbHMgLSBzdHJuY3B5LCBtZW1jbXAsIG1lbXNldCBub3QgZGVjbGFyZWQgaW4gc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5jcHAKKyAgICAqIFtUSFJJRlQtNDI1MV0gLSBKYXZhIEVwb2xsIFNlbGVjdG9yIEJ1ZworICAgICogW1RIUklGVC00MjU3XSAtIFR5cGVzY3JpcHQgYXN5bmMgY2FsbGJhY2tzIGRvIG5vdCBwcm92aWRlIHRoZSBjb3JyZWN0IHR5cGVzCisgICAgKiBbVEhSSUZULTQyNThdIC0gQm9vc3Qvc3RkIHRocmVhZCB3cmFwcGluZyBmYXVsdGluZXNzCisgICAgKiBbVEhSSUZULTQyNjBdIC0gR28gY29udGV4dCBnZW5lcmF0aW9uIGlzc3VlLiBDb250ZXh0IGlzIHBhcmFtZXRlciBpbiBJbnRlcmZhY2Ugbm90IGluIGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTQyNjFdIC0gR28gY29udGV4dCBnZW5lcmF0aW9uIGlzc3VlOiBicmVha2luZyBjaGFuZ2UgaW4gZ2VuZXJhdGVkIGNvZGUgcmVnYXJkaW5nIHRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24gaW50ZXJmYWNlCisgICAgKiBbVEhSSUZULTQyNjJdIC0gSW52YWxpZCBiaW5kaW5nIHRvIEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjQoKSB3aXRoIDY0LWJpdCB0YXJnZXRzCisgICAgKiBbVEhSSUZULTQyNjNdIC0gRml4IHVzZSBhZnRlciBmcmVlIGJ1ZyBmb3IgdGhyb3duIGV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtNDI2Nl0gLSBFcmxhbmcgbGlicmFyeSB0aHJvd3MgZHVyaW5nIHNraXBwaW5nIGZpZWxkcyBvZiBjb21wb3NpdGUgdHlwZSAobWFwcywgbGlzdHMsIHN0cnVjdHMsIHNldHMpCisgICAgKiBbVEhSSUZULTQyNjhdIC0gRXJsYW5nIGxpYnJhcnkgZW1pdHMgZGVidWdnaW5nIG91dHB1dCBpbiB0cmFuc3BvcnQgbGF5ZXIKKyAgICAqIFtUSFJJRlQtNDI3M10gLSBlcmxhbmc6bm93LzA6IERlcHJlY2F0ZWQgQklGLiAKKyAgICAqIFtUSFJJRlQtNDI3NF0gLSBQeXRob24gZmVhdHVyZSB0ZXN0cyBmb3IgU1NML1RMUyBmYWlsaW5nCisgICAgKiBbVEhSSUZULTQyNzldIC0gV3JvbmcgcGF0aCBpbiBpbmNsdWRlIGRpcmVjdGl2ZSBpbiBnZW5lcmF0ZWQgVGhyaWZ0IHNvdXJjZXMKKyAgICAqIFtUSFJJRlQtNDI4M10gLSBUTmFtZWRQaXBlU2VydmVyIHJhY2UgY29uZGl0aW9uIGluIGludGVycnVwdAorICAgICogW1RIUklGVC00Mjg0XSAtIEZpbGUgY29udGFpbnMgYSBOQlNQOiBsaWIvbm9kZWpzL2xpYi90aHJpZnQvd2ViX3NlcnZlci5qcworICAgICogW1RIUklGVC00MjkwXSAtIEMjIG51bGxhYmxlIG9wdGlvbiBnZW5lcmF0ZXMgaW52YWxpZCBjb2RlIGZvciBub24tcmVxdWlyZWQgZW51bSBmaWVsZCB3aXRoIGRlZmF1bHQgdmFsdWUKKyAgICAqIFtUSFJJRlQtNDI5Ml0gLSBUaW1lck1hbmFnZXI6OnJlbW92ZSgpIGlzIG5vdCBpbXBsZW1lbnRlZAorICAgICogW1RIUklGVC00MzA3XSAtIE1ha2Ugc3NsLW9wZW4gdGltZW91dCBlZmZlY3RpdmUgaW4gZ29sYW5nIGNsaWVudAorICAgICogW1RIUklGVC00MzEyXSAtIEVybGFuZyBjbGllbnQgY2Fubm90IGNvbm5lY3QgdG8gUHl0aG9uIHNlcnZlcjogZXhjZXB0aW9uIGVycm9yOiBlY29ubnJlZnVzZWQKKyAgICAqIFtUSFJJRlQtNDMxM10gLSBQcm9ncmFtIGNvZGUgb2YgdGhlIEVybGFuZyB0dXRvcmlhbCBmaWxlcyBjb250YWluIHN5bnRheCBlcnJvcnMKKyAgICAqIFtUSFJJRlQtNDMxNl0gLSBUQnl0ZUJ1ZmZlci5qYXZhIHdpbGwgcmVhZCB0b28gbXVjaCBkYXRhIGlmIGEgcHJldmlvdXMgcmVhZCByZXR1cm5zIGZld2VyIGJ5dGVzIHRoYW4gcmVxdWVzdGVkCisgICAgKiBbVEhSSUZULTQzMTldIC0gY29tbWFuZCBsaW5lIHN3aXRjaCBmb3IgImV2aHR0cCIgaW5jb3JyZWN0bHkgcmVzb2x2ZWQgdG8gYW5vbiBwaXBlcworICAgICogW1RIUklGVC00MzIzXSAtIHJhbmdlIGNoZWNrIGVycm9ycyBvciBOUEUgaW4gZWRnZSBjYXNlcworICAgICogW1RIUklGVC00MzI0XSAtIGZpZWxkIG5hbWVzIGNhbiBjb25mbGljdCB3aXRoIGxvY2FsIHZhcnMgaW4gZ2VuZXJhdGVkIGNvZGUKKyAgICAqIFtUSFJJRlQtNDMyOF0gLSBUcmF2aXMgQ0kgYnVpbGRzIGFyZSB0aW1pbmcgb3V0IChqb2IgMSkgYW5kIGhheGUgYnVpbGRzIGFyZSBmYWlsaW5nIHNpbmNlIDkvMTEKKyAgICAqIFtUSFJJRlQtNDMyOV0gLSBjX2dsaWIgRG9lc24ndCBoYXZlIGEgbXVsdGlwbGV4ZWQgcHJvY2Vzc29yCisgICAgKiBbVEhSSUZULTQzMzFdIC0gQysrOiBUU1NMU29ja2V0cyBidWcgaW4gaGFuZGxpbmcgaHVnZSBtZXNzYWdlcywgYnVnIGluIGhhbmRsaW5nIHBvbGxpbmcKKyAgICAqIFtUSFJJRlQtNDMzMl0gLSBCaW5hcnkgcHJvdG9jb2wgaGFzIG1lbW9yeSBsZWFrcworICAgICogW1RIUklGVC00MzM0XSAtIFBlcmwgaW5kZW50YXRpb24gaW5jb3JyZWN0IHdoZW4gZGVmYXVsdGluZyBmaWVsZCBhdHRyaWJ1dGUgdG8gYSBzdHJ1Y3QKKyAgICAqIFtUSFJJRlQtNDMzOV0gLSBUaHJpZnQgRnJhbWVkIFRyYW5zcG9ydCBpbiBFcmxhbmcgY3Jhc2hlcyBzZXJ2ZXIgd2hlbiBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAqIFtUSFJJRlQtNDM0MF0gLSBFcmxhbmcgZml4IGEgY3Jhc2ggb24gY2xpZW50IGNsb3NlCisgICAgKiBbVEhSSUZULTQzNTVdIC0gSmF2YXNjcmlwdCBpbmRlbnRhdGlvbiBpbmNvcnJlY3Qgd2hlbiBkZWZhdWx0aW5nIGZpZWxkIGF0dHJpYnV0ZSB0byBhIHN0cnVjdAorICAgICogW1RIUklGVC00MzU2XSAtIHRocmlmdF9wcm90b2NvbCBjYWxsIFRyYW5zcG9ydCBjYXVzZSBTZWdtZW50YXRpb24gZmF1bHQKKyAgICAqIFtUSFJJRlQtNDM1OV0gLSBIYXhlIGNvbXBpbGVyIGxvb2tzIGxpa2UgaXQgaXMgcHJvZHVjaW5nIGluY29ycmVjdCBjb2RlIGZvciBtYXAgb3Igc2V0IGtleSB0aGF0IGlzIGJpbmFyeSB0eXBlCisgICAgKiBbVEhSSUZULTQzNjJdIC0gTWlzc2luZyBzaXplLWNoZWNrIGNhbiBsZWFkIHRvIGh1Z2UgbWVtb3J5IGFsbG9jYXRpb24KKyAgICAqIFtUSFJJRlQtNDM2NF0gLSBXZWJzaXRlIGNvbnRyaWJ1dGluZyBndWlkZSBlcnJvbmVvdXNseSByZWNvbW1lbmRzIHN1Ym1pdHRpbmcgcGF0Y2hlcyBpbiBKSVJBCisgICAgKiBbVEhSSUZULTQzNjVdIC0gUGVybCBnZW5lcmF0ZWQgY29kZSB1c2VzIGluZGlyZWN0IG9iamVjdCBzeW50YXgsIHdoaWNoIG9jY2FzaW9uYWxseSBjYXVzZXMgY29tcGlsYXRpb24gZXJyb3JzLgorICAgICogW1RIUklGVC00MzY3XSAtIHB5dGhvbiBUUHJvY2Vzc29yLnByb2Nlc3MgaXMgbWlzc2luZyAic2VsZiIKKyAgICAqIFtUSFJJRlQtNDM3MF0gLSBVYnVudHUgQXJ0ZnVsIGNwcGNoZWNrIGFuZCBmbGFrZTggYXJlIG1vcmUgc3RyaW5nZW50IGFuZCBjYXVzaW5nIFNDQSBidWlsZCBqb2IgZmFpbHVyZXMKKyAgICAqIFtUSFJJRlQtNDM3Ml0gLSBQaXBlIHdyaXRlIG9wZXJhdGlvbnMgYWNyb3NzIGEgbmV0d29yayBhcmUgbGltaXRlZCB0byA2NSw1MzUgYnl0ZXMgcGVyIHdyaXRlLiAKKyAgICAqIFtUSFJJRlQtNDM3NF0gLSBjYW5ub3QgbG9hZCB0aHJpZnRfcHJvdG9jb2wgZHVlIHRvIHVuZGVmaW5lZCBzeW1ib2w6IF9aVFZOMTBfX2N4eGFiaXYxMjBfX3NpX2NsYXNzX3R5cGVfaW5mb0UKKyAgICAqIFtUSFJJRlQtNDM3NV0gLSBUTWVtb3J5IHRocm93IGJhZF9hbGxvYyBkdWUgdG8gY291bnRlciBvdmVyZmxvdworICAgICogW1RIUklGVC00Mzc2XSAtIENvdmVyaXR5IGhpZ2ggaW1wYWN0IGlzc3VlIHJlc29sdXRpb24KKyAgICAqIFtUSFJJRlQtNDM3N10gLSBoYXhlLiBzb2NrZXQgaGFuZGxlcyBsZWFrIGluIFRTaW1wbGVTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtNDM4MV0gLSBXcm9uZyBpc3NldCBiaXRmaWVsZCB2YWx1ZSBhZnRlciB0cmFuc21pc3Npb24KKyAgICAqIFtUSFJJRlQtNDM4NV0gLSBHbyByZW1vdGUgY2xpZW50IC11IGZsYWcgaXMgYnJva2VuCisgICAgKiBbVEhSSUZULTQzOTJdIC0gY29tcGlsZXIvLi4uLi9wbHVnaW4udGhyaWZ0IHN0cnVjdHMgbWlzLW9yZGVyZWQgYmxvd3MgdXAgb2NhbWwgZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTQzOTVdIC0gVW5hYmxlIHRvIGJ1aWxkIGluIHRoZSB1YnVudHUteGVuaWFsIGRvY2tlciBpbWFnZTogY2xhcCAyLjI4IHJlcXVpcmVzIFJ1c3QgMS4yMAorICAgICogW1RIUklGVC00Mzk2XSAtIGluY29uc2lzdGVudCAob3IgcGxhaW4gd3JvbmcpIHZlcnNpb24gbnVtYmVycyBpbiBtYXN0ZXIvdHJ1bmsgCisKKyMjIERvY3VtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtNDE1N10gLSBvdXRkYXRlZCByZWFkbWUgYWJvdXQgSGF4ZSBpbnN0YWxsYXRpb24gb24gTGludXgKKworIyMgSW1wcm92ZW1lbnQKKyAgICAqIFtUSFJJRlQtMTA1XSAtIG1ha2UgYSB0aHJpZnRfc3BlYyBmb3IgYSBzdHJ1Y3R1cmVzIHdpdGggbmVnYXRpdmUgdGFncworICAgICogW1RIUklGVC0yODFdIC0gQ29jb2EgbGlicmFyeSBjb2RlIG5lZWRzIGNvbW1lbnRzLCBiYWRseQorICAgICogW1RIUklGVC03NzVdIC0gcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIGZvciBQZXJsCisgICAgKiBbVEhSSUZULTIyMjFdIC0gR2VuZXJhdGUgYysrIGNvZGUgd2l0aCBzdGQ6OnNoYXJlZF9wdHIgaW5zdGVhZCBvZiBib29zdDo6c2hhcmVkX3B0ci4KKyAgICAqIFtUSFJJRlQtMjM2NF0gLSBPQ2FtbDogVXNlIE9hc2lzIGV4Y2x1c2l2ZWx5IGZvciBidWlsZCBwcm9jZXNzCisgICAgKiBbVEhSSUZULTI1MDRdIC0gVE11bHRpcGxleGVkUHJvY2Vzc29yIHNob3VsZCBhbGxvdyByZWdpc3RlcmluZyBkZWZhdWx0IHByb2Nlc3NvciBjYWxsZWQgaWYgbm8gc2VydmljZSBuYW1lIGlzIHByZXNlbnQKKyAgICAqIFtUSFJJRlQtMzIwN10gLSBFbmFibGUgYnVpbGQgd2l0aCBPcGVuU1NMIDEuMS4wIHNlcmllcworICAgICogW1RIUklGVC0zMjcyXSAtIFBlcmwgU1NMIEF1dGhlbnRpY2F0aW9uIFN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMzM1N10gLSBHZW5lcmF0ZSBFbnVtU2V0L0VudW1NYXAgd2hlcmUgZWxlbWVudHMva2V5cyBhcmUgZW51bXMKKyAgICAqIFtUSFJJRlQtMzM2OV0gLSBJbXBsZW1lbnQgU1NML1RMUyBzdXBwb3J0IG9uIEMgd2l0aCBjX2dsaWIKKyAgICAqIFtUSFJJRlQtMzQ2N10gLSBHbyBNYXBzIGZvciBUaHJpZnQgU2V0cyBTaG91bGQgSGF2ZSBWYWx1ZXMgb2YgVHlwZSBzdHJ1Y3R7fSAKKyAgICAqIFtUSFJJRlQtMzU4MF0gLSBUSGVhZGVyIGZvciBIYXNrZWxsCisgICAgKiBbVEhSSUZULTM2MjddIC0gTWlzc2luZyBiYXNpYyBjb2RlIHN0eWxlIGNvbnNpc3RlbmN5IG9mIEphdmFTY3JpcHQuCisgICAgKiBbVEhSSUZULTM3MDZdIC0gVGhlcmUncyBubyBzdXBwb3J0IGZvciBNdWx0aXBsZXhlZCBwcm90b2NvbCBvbiBjX2dsaWIgbGlicmFyeQorICAgICogW1RIUklGVC0zNzY2XSAtIEFkZCBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgdG8gVFpsaWJUcmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMzc3Nl0gLSBHbyBjb2RlIGZyb20gbXVsdGlwbGUgdGhyaWZ0IGZpbGVzIHdpdGggdGhlIHNhbWUgbmFtZXNwYWNlCisgICAgKiBbVEhSSUZULTM4MjNdIC0gRXNjYXBlIGRvY3VtZW50YXRpb24gd2hpbGUgZ2VuZXJhdGluZyBub24gZXNjYXBlZCBkb2N1bWV0YXRpb24KKyAgICAqIFtUSFJJRlQtMzg1NF0gLSBhbGxvdyB1c2VycyB0byBjbGVhciByZWFkIGJ1ZmZlcnMKKyAgICAqIFtUSFJJRlQtMzg1OV0gLSBVbml4IERvbWFpbiBTb2NrZXQgU3VwcG9ydCBpbiBPYmplY3RpdmUtQworICAgICogW1RIUklGVC0zOTIxXSAtIEMrKyBjb2RlIHNob3VsZCBwcmludCBlbnVtcyBhcyBzdHJpbmdzCisgICAgKiBbVEhSSUZULTM5MjZdIC0gVGhlcmUgc2hvdWxkIGJlIGFuIGVycm9yIGVtaXR0ZWQgd2hlbiBodHRwIHN0YXR1cyBjb2RlIGlzIG5vdCAyMDAgCisgICAgKiBbVEhSSUZULTQwMDddIC0gTWljcm8tb3B0aW1pemF0aW9uIG9mIFRUcmFuc3BvcnQucHkKKyAgICAqIFtUSFJJRlQtNDA0MF0gLSBBZGQgcmVhbCBjYXVzZSBvZiBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgZXJyb3IgdG8gZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTQwNjRdIC0gVXBkYXRlIG5vZGUgbGlicmFyeSBkZXBlbmRlbmNpZXMKKyAgICAqIFtUSFJJRlQtNDA2OV0gLSBBbGwgcGVybCBwYWNrYWdlcyBzaG91bGQgaGF2ZSBwcm9wZXIgbmFtZXNwYWNlLCB2ZXJzaW9uIHN5bnRheCwgYW5kIHVzZSBwcm9wZXIgdGhyaWZ0IGV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtNDA3MV0gLSBDb25zb2xpZGF0ZSB0aGUgVHJhdmlzIENJIGpvYnMgd2hlcmUgcG9zc2libGUgdG8gcHV0IGxlc3Mgc3RyZXNzIG9uIHRoZSBBcGFjaGUgRm91bmRhdGlvbidzIGFsbG9jYXRpb24gb2YgQ0kgYnVpbGQgc2xhdmVzCisgICAgKiBbVEhSSUZULTQwNzJdIC0gQWRkIHRoZSBwb3NzaWJpbGl0eSB0byBzZW5kIGN1c3RvbSBoZWFkZXJzIGluIFRDdXJsQ2xpZW50CisgICAgKiBbVEhSSUZULTQwNzVdIC0gQmV0dGVyIE1pbkdXIHN1cHBvcnQgZm9yIGhlYWRlcnMtb25seSBib29zdCAod2l0aG91dCB0aHJlYWQgbGlicmFyeSkKKyAgICAqIFtUSFJJRlQtNDA4MV0gLSBQcm92aWRlIGEgTWluR1cgNjQtYml0IEFwcHZleW9yIENJIGJ1aWxkIGZvciBiZXR0ZXIgcHVsbCByZXF1ZXN0IHZhbGlkYXRpb24KKyAgICAqIFtUSFJJRlQtNDA4NF0gLSBJbXByb3ZlIFNTTCBzZWN1cml0eSBpbiB0aHJpZnQgYnkgYWRkaW5nIGEgbWFrZSBjcm9zcyBjbGllbnQgdGhhdCBjaGVja3MgdG8gbWFrZSBzdXJlIFNTTHYzIHByb3RvY29sIGNhbm5vdCBiZSBuZWdvdGlhdGVkCisgICAgKiBbVEhSSUZULTQwOTVdIC0gQWRkIG11bHRpcGxleGVkIHByb3RvY29sIHRvIFRyYXZpcyBDSSBmb3IgbWFrZSBjcm9zcworICAgICogW1RIUklGVC00MDk5XSAtIEF1dG8tZGVyaXZlIEhhc2ggZm9yIGdlbmVyYXRlZCBSdXN0IHN0cnVjdHMKKyAgICAqIFtUSFJJRlQtNDExMF0gLSBUaGUgZGViaWFuIGJ1aWxkIGZpbGVzIGRvIG5vdCBwcm9kdWNlIGEgIi1kYmciIHBhY2thZ2UgZm9yIGRlYnVnIHN5bWJvbHMgb2YgbGlidGhyaWZ0MAorICAgICogW1RIUklGVC00MTE0XSAtIFNwYWNlIGFmdGVyICcvLy8nIGluIGRvYyBjb21tZW50cworICAgICogW1RIUklGVC00MTI2XSAtIFZhbGlkYXRlIG9iamVjdHMgaW4gcGhwIGV4dGVuc2lvbgorICAgICogW1RIUklGVC00MTMwXSAtIEVuc3VyZSBBcGFjaGUgSHR0cCBjb25uZWN0aW9uIGlzIHJlbGVhc2VkIGJhY2sgdG8gcG9vbCBhZnRlciB1c2UKKyAgICAqIFtUSFJJRlQtNDE1MV0gLSBUaHJpZnQgTXV0ZXggQ29udGVudGlvbiBQcm9maWxpbmcgKHB0aHJlYWRzKSBzaG91bGQgYmUgZGlzYWJsZWQgYnkgZGVmYXVsdAorICAgICogW1RIUklGVC00MTc2XSAtIEltcGxlbWVudCBhIHRocmVhZGVkIGFuZCB0aHJlYWRwb29sIHNlcnZlciB0eXBlIGZvciBSdXN0CisgICAgKiBbVEhSSUZULTQxODNdIC0gTmFtZWQgcGlwZSBjbGllbnQgYmxvY2tzIGZvcmV2ZXIgb24gT3BlbigpIHdoZW4gdGhlcmUgaXMgbm8gc2VydmVyIGF0IHRoZSBvdGhlciBlbmQKKyAgICAqIFtUSFJJRlQtNDE5MF0gLSBpbXByb3ZlIEMjIFRUaHJlYWRQb29sU2VydmVyIGRlZmF1bHRzCisgICAgKiBbVEhSSUZULTQxOTddIC0gSW1wbGVtZW50IHRyYW5zcGFyZW50IGd6aXAgY29tcHJlc3Npb24gZm9yIEhUVFAgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTQxOThdIC0gUnVieSBzaG91bGQgbG9nIFRocmlmdCBpbnRlcm5hbCBlcnJvcnMgdG8gZ2xvYmFsIGxvZ2dlcgorICAgICogW1RIUklGVC00MjAzXSAtIHRocmlmdCBzZXJ2ZXIgc3RvcCBncmFjZWZ1bGx5CisgICAgKiBbVEhSSUZULTQyMDVdIC0gY19nbGliIGlzIG5vdCBsaW5raW5nIGFnYWluc3QgZ2xpYiArIGdvYmplY3QKKyAgICAqIFtUSFJJRlQtNDIwOV0gLSB3YXJuaW5nIENTMDQxNCBpbiBUW1RMU11TZXJ2ZXJTb2NrZXQuY3MKKyAgICAqIFtUSFJJRlQtNDIxMF0gLSBpbmNsdWRlIFRocmlmdC40NS5jc3Byb2ogaW50byBDSSBydW5zIAorICAgICogW1RIUklGVC00MjE3XSAtIEh0dHBDbGllbnQgc2hvdWxkIHN1cHBvcnQgZ3ppcCBhbmQgZGVmbGF0ZQorICAgICogW1RIUklGVC00MjIyXSAtIFN1cHBvcnQgVW5peCBEb21haW4gU29ja2V0cyBpbiBHb2xhbmcgVFNlcnZlclNvY2tldAorICAgICogW1RIUklGVC00MjMzXSAtIE1ha2UgVEhzSGFTZXJ2ZXIuaW52b2tlciBhdmFpbGFibGUgKGdldCBtZXRob2Qgb25seSkgaW4gaW5oZXJpdGVkIGNsYXNzZXMKKyAgICAqIFtUSFJJRlQtNDIzNl0gLSBTdXBwb3J0IGNvbnRleHQgaW4gZ28gZ2VuZXJhdGVkIGNvZGUuCisgICAgKiBbVEhSSUZULTQyMzhdIC0gSlNPTiBnZW5lcmF0b3I6IG1ha2UgYW5ub3RhdGlvbi1hd2FyZQorICAgICogW1RIUklGVC00MjY5XSAtIERvbid0IGFwcGVuZCAnLicgdG8gRXJsYW5nIG5hbWVzcGFjZSBpZiBpdCBlbmRzIGluICdfJy4KKyAgICAqIFtUSFJJRlQtNDI3MF0gLSBHZW5lcmF0ZSBFcmxhbmcgbWFwcGluZyBmdW5jdGlvbnMgZm9yIGNvbnN0IG1hcHMgYW5kIGxpc3RzCisgICAgKiBbVEhSSUZULTQyNzVdIC0gQWRkIHN1cHBvcnQgZm9yIHpvcGUuaW50ZXJmYWNlIG9ubHksIGFwYXJ0IGZyb20gdHdpc3RlZCBzdXBwb3J0LgorICAgICogW1RIUklGVC00Mjg1XSAtIFB1bGwgZ2VuZXJhdGVkIHNlbmQvcmVjdiBpbnRvIGxpYnJhcnkgdG8gYWxsb3cgYmVoYXZpb3VyIHRvIGJlIGN1c3RvbWlzZWQKKyAgICAqIFtUSFJJRlQtNDI4N10gLSBBZGQgYysrIGNvbXBpbGVyICJub19za2VsZXRvbiIgZmxhZyBvcHRpb24KKyAgICAqIFtUSFJJRlQtNDI4OF0gLSBJbXBsZW1lbnQgbG9nZ2luZyBsZXZlbHMgcHJvcGVybHkgZm9yIG5vZGUuanMKKyAgICAqIFtUSFJJRlQtNDI5NV0gLSBSZWZyZXNoIHRoZSBEb2NrZXIgaW1hZ2UgZmlsZSBzdWl0ZSBmb3IgVWJ1bnR1LCBEZWJpYW4sIGFuZCBDZW50T1MKKyAgICAqIFtUSFJJRlQtNDMwNV0gLSBFbWl0IGRkb2MgZm9yIGdlbmVyYXRlZCBpdGVtcworICAgICogW1RIUklGVC00MzA2XSAtIFRocmlmdCBpbXBvcnRzIG5vdCByZXBsaWNhdGVkIHRvIEQgc2VydmljZSBvdXRwdXQKKyAgICAqIFtUSFJJRlQtNDMxNV0gLSBBZGQgZGVmYXVsdCBtZXNzYWdlIGZvciBUQXBwbGljYXRpb25FeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtNDMxOF0gLSBEZWxwaGkgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzCisgICAgKiBbVEhSSUZULTQzMjVdIC0gU2ltcGxpZnkgYXV0b21ha2UgY3Jvc3MgY29tcGlsYXRpb24gYnkgcmVseWluZyBvbiBvbmUgZ2xvYmFsIFRIUklGVCBjb21waWxlciBwYXRoCisgICAgKiBbVEhSSUZULTQzMjddIC0gSW1wcm92ZSBUaW1lck1hbmFnZXIgQVBJIHRvIGFsbG93IHJlbW92aW5nIHNwZWNpZmljIHRhc2sKKyAgICAqIFtUSFJJRlQtNDMzMF0gLSBBbGxvdyB1bnVzZWQgY3JhdGVzIGluIFJ1c3QgZmlsZXMKKyAgICAqIFtUSFJJRlQtNDMzM10gLSBFcmxhbmcgdHV0b3JpYWwgZXhhbXBsZXMgYXJlIHVzaW5nIGEgZGlmZmVyZW50IHBvcnQgKDk5OTkpCisgICAgKiBbVEhSSUZULTQzNDNdIC0gQ2hhbmdlIENJIGJ1aWxkcyB0byB1c2Ugbm9kZS5qcyA4LnggTFRTIG9uY2UgYXZhaWxhYmxlCisgICAgKiBbVEhSSUZULTQzNDVdIC0gQ3JlYXRlIGEgZG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IHRoYXQgdXNlcyB0aGUgbWluaW11bSBzdXBwb3J0ZWQgbGFuZ3VhZ2UgbGV2ZWxzCisgICAgKiBbVEhSSUZULTQzNDZdIC0gQWxsb3cgWmxpYiB0cmFuc3BvcnQgZmFjdG9yeSB0byB3cmFwIG90aGVyIHRyYW5zcG9ydHMKKyAgICAqIFtUSFJJRlQtNDM0OF0gLSBQZXJsIEhUVFAgQ2xpZW50IGN1c3RvbSBIVFRQIGhlYWRlcnMKKyAgICAqIFtUSFJJRlQtNDM1MF0gLSBVcGRhdGUgbmV0Y29yZSBidWlsZCBmb3IgZG90bmV0IDIuMCBzZGsgYW5kIG1ha2UgY3Jvc3MgdmFsaWRhdGlvbgorICAgICogW1RIUklGVC00MzUxXSAtIFVzZSBUcmF2aXMgQ0kgQnVpbGQgU3RhZ2VzIHRvIG9wdGltaXplIHRoZSBDSSBidWlsZAorICAgICogW1RIUklGVC00MzUzXSAtIGNhbm5vdCByZWFkIHZpYSB0aHJpZnRfcHJvdG9jb2wgYXQgc2VydmVyIHNpZGUKKyAgICAqIFtUSFJJRlQtNDM3OF0gLSBhZGQgc2V0IHN0b3BUaW1lb3V0VW5pdCBtZXRob2QgdG8gVFRocmVhZFBvb2xTZXJ2ZXIKKworIyMgTmV3IEZlYXR1cmUKKyAgICAqIFtUSFJJRlQtNzUwXSAtIEMrKyBDb21waWxlciBWaXJ0dWFsIEZ1bmN0aW9uIE9wdGlvbgorICAgICogW1RIUklGVC0yOTQ1XSAtIEltcGxlbWVudCBzdXBwb3J0IGZvciBSdXN0IGxhbmd1YWdlCisgICAgKiBbVEhSSUZULTM4NTddIC0gdGhyaWZ0IGpzOm5vZGUgY29tcGxpZXIgc3VwcG9ydCBhbiBvYmplY3QgYXMgcGFyYW1ldGVyIG5vdCBhbiBpbnN0YW5jZSBvZiBzdHJ1Y3QKKyAgICAqIFtUSFJJRlQtMzkzM10gLSBQb3J0IG9mZmljaWFsIEMjIC5ORVQgbGlicmFyeSBmb3IgVGhyaWZ0IHRvIEMjIC5ORVQgQ29yZSBsaWJhcnkKKyAgICAqIFtUSFJJRlQtNDAzOV0gLSBVcGRhdGUgb2YgQXBhY2hlIFRocmlmdCAuTmV0IENvcmUgbGliIAorICAgICogW1RIUklGVC00MTEzXSAtIFByb3ZpZGUgYSBidWZmZXIgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcgaW4gbWVtb3J5IGJ5dGUgc3RyZWFtCisKKyMjIFF1ZXN0aW9uCisgICAgKiBbVEhSSUZULTI5NTZdIC0gYXV0b2NvbmYgLSBwb3NzaWJseSB1bmRlZmluZWQgbWFjcm8gLSBBQ19QUk9HX0JJU09OCisgICAgKiBbVEhSSUZULTQyMjNdIC0gQWRkIHN1cHBvcnQgdG8gdGhlIGlzU2VydmluZygpIG1ldGhvZCBmb3IgdGhlIEMrKyBsaWJyYXJ5CisKKyMjIFRhc2sKKyAgICAqIFtUSFJJRlQtMzYyMl0gLSBGaXggZGVwcmVjYXRlZCB1c2VzIG9mIHN0ZDo6YXV0b19wdHIKKyAgICAqIFtUSFJJRlQtNDAyOF0gLSBQbGVhc2UgcmVtb3ZlIFN5c3RlbS5vdXQuZm9ybWF0IGZyb20gdGhlIHNvdXJjZSBjb2RlCisgICAgKiBbVEhSSUZULTQxODZdIC0gQnVpbGQgYW5kIHRlc3QgcnVzdCBjbGllbnQgaW4gVHJhdmlzCisKKyMjIFRlc3QKKyAgICAqIFtUSFJJRlQtNDI2NF0gLSBQSFAgLSBTdXBwb3J0IGJvdGggc2hhcmVkICYgc3RhdGljIGxpbmtpbmcgb2Ygc29ja2V0cyBsaWJyYXJ5CisKKyMjIFdpc2gKKyAgICAqIFtUSFJJRlQtNDM0NF0gLSBEZWZpbmUgYW5kIG1haW50YWluIHRoZSBtaW5pbXVtIGxhbmd1YWdlIGxldmVsIGZvciBhbGwgbGFuZ3VhZ2VzIGluIG9uZSBwbGFjZQorCisJCitUaHJpZnQgMC4xMC4wCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgQnVnCisgICAgKiBbVEhSSUZULTE4NDBdIC0gVGhyaWZ0IEdlbmVyYXRlZCBDb2RlIENhdXNlcyBHbG9iYWwgVmFyaWFibGUgTGVha3MKKyAgICAqIFtUSFJJRlQtMTgyOF0gLSBtb2NfVFFUY3BTZXJ2ZXIuY3BwIHdhcyByZW1vdmVkIGZyb20gc291cmNlIHRyZWUgYnV0IGlzIGluIHRocmlmdC0wLjkuMC50YXIuZ3oKKyAgICAqIFtUSFJJRlQtMTc5MF0gLSBjb2NvYTogRHVwbGljYXRlIGludGVyZmFjZSBkZWZpbml0aW9uIGVycm9yCisgICAgKiBbVEhSSUZULTE3NzZdIC0gVFBpcGVTZXJ2ZXIgc2hvdWxkIGltcGxlbWVudCAibGlzdGVuIiwgc28gdGhhdCBUU2VydmVyRXZlbnRIYW5kbGVyIHByZVNlcnZlIHdpbGwgd29yayByaWdodAorICAgICogW1RIUklGVC0xMzUxXSAtIENvbXBpbGVyIGRvZXMgbm90IGNhcmUgYWJvdXQgYmluYXJ5IHN0cmluZ3MKKyAgICAqIFtUSFJJRlQtMTIyOV0gLSBQeXRob24gZmFzdGJpbmFyeS5jIGNhbiBub3QgaGFuZGxlIHVuaWNvZGUgYXMgZ2VuZXJhdGVkIHB5dGhvbiBjb2RlCisgICAgKiBbVEhSSUZULTc0OV0gLSBDKysgVEJ1ZmZlcmVkVHJhbnNwb3J0cyBkbyBub3QgZmx1c2ggdGhlaXIgYnVmZmVycyBvbiBkZWxldGUKKyAgICAqIFtUSFJJRlQtNzQ3XSAtIEMrKyBUU29ja2V0LT5jbG9zZSBjYWxscyBzaHV0ZG93biBicmVha2luZyBmb3JrZWQgcGFyZW50IHByb2Nlc3MKKyAgICAqIFtUSFJJRlQtNzMyXSAtIHNlcnZlciBleGl0cyBhYm5vcm1hbGx5IHdoZW4gY2xpZW50IGNhbGxzIHNlbmRfeHh4IGZ1bmN0aW9uIHdpdGhvdXQgY2FsbGluZyByZWN2X3h4eCBmdW5jdGlvbgorICAgICogW1RIUklGVC0zOTQyXSAtIFRTU0xTb2NrZXQgZG9lcyBub3QgaG9ub3Igc2VuZCBhbmQgcmVjZWl2ZSB0aW1lb3V0cworICAgICogW1RIUklGVC0zOTQxXSAtIFdpblhQIHZlcnNpb24gb2YgdGhyaWZ0X3BvbGwoKSByZWxpZXMgb24gdW5kZWZpbmVkIGJlaGF2aW9yIGJ5IHBhc3NpbmcgYSBkZXN0cnVjdGVkIHZhcmlhYmxlIHRvIHNlbGVjdCgpCisgICAgKiBbVEhSSUZULTM5NDBdIC0gVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGZpbGUgZm9yIGNvbXBpbGVyIGlzIGJyb2tlbgorICAgICogW1RIUklGVC0zOTQzXSAtIENvdmVyaXR5IFNjYW4gaWRlbnRpZmllZCBzb21lIGhpZ2ggc2V2ZXJpdHkgZGVmZWN0cworICAgICogW1RIUklGVC0zOTI5XSAtIFBIUCAibnNnbG9iYWwiIE9wdGlvbiBSZXN1bHRzIGluIFN5bnRheCBFcnJvciBpbiBHZW5lcmF0ZWQgQ29kZSAoVHJhaWxpbmcgQmFja3NsYXNoKQorICAgICogW1RIUklGVC0zOTM2XSAtIENhbm5vdCBjb21waWxlIDAuMTAuMCBkZXZlbG9wbWVudCB0aXAgd2l0aCBWUzIwMTMgYW5kIGVhcmxpZXIgKHNucHJpbnRmLCB1aW50MzJfdCkKKyAgICAqIFtUSFJJRlQtMzkzNV0gLSBJbmNvcnJlY3Qgc2tpcHBpbmcgb2YgbWFwIGFuZCBzZXQKKyAgICAqIFtUSFJJRlQtMzkyMF0gLSBSdWJ5OiBFbnN1cmluZyB0aGF0IEhUVFAgZmFpbHVyZXMgd2lsbCBjbGVhciB0aGUgaHR0cCB0cmFuc3BvcnQgb3V0YnVmIHZhcgorICAgICogW1RIUklGVC0zOTE5XSAtIEMjIFRUTFNTZXJ2ZXJTb2NrZXQgZG9lcyBub3QgdXNlIGNsaWVudFRpbWVvdXQKKyAgICAqIFtUSFJJRlQtMzkxN10gLSBDaGVjayBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIG1vZHVsZSB2ZXJzaW9uCisgICAgKiBbVEhSSUZULTM5MDldIC0gRml4IGNfZ2xpYiBzdGF0aWMgbGliIENNYWtlIGJ1aWxkCisgICAgKiBbVEhSSUZULTM5MDRdIC0gVHlwbyBpbiBub2RlIHR1dG9yaWFsIGxlYWRzIHRvIHdyb25nIHRyYW5zcG9ydCBiZWluZyB1c2VkCisgICAgKiBbVEhSSUZULTM4NDhdIC0gQXMgYW4gaW1wbGVtZW50ZXIgb2YgYSBwZXJsIHNvY2tldCBzZXJ2ZXIsIEkgZG8gbm90IHdhbnQgdG8gaGF2ZSB0byByZW1lbWJlciB0byBpZ25vcmUgU0lHQ0hMRCBmb3IgaXQgdG8gd29yayBwcm9wZXJseQorICAgICogW1RIUklGVC0zODQ0XSAtIHRocmlmdF9wcm90b2NvbCBjYW5ub3QgY29tcGlsZSBpbiA3LjAuNworICAgICogW1RIUklGVC0zODQzXSAtIGludGVnZXIgaXNzdWVzIHdpdGggSGF4ZSBQSFAgdGFyZ2V0cyBjYXVzZSBaaWdaYWcgZW5jb2RpbmcgdG8gZmFpbAorICAgICogW1RIUklGVC0zODQyXSAtIERhcnQgZ2VuZXJhdGVzIGluY29ycmVjdCBjb2RlIGZvciBhIGNvbnN0IHN0cnVjdAorICAgICogW1RIUklGVC0zODQxXSAtIGRhcnQgY29tcGFjdCBwcm90b2NvbCBpbmNvcnJlY3RseSBzZXJpYWxpemVzL2Rlc2VyaWFsaXplZCBkb3VibGVzCisgICAgKiBbVEhSSUZULTM3MDhdIC0gTmFtZUVycm9yOiBnbG9iYWwgbmFtZSAnVFByb3RvY29sJyBpcyBub3QgZGVmaW5lZAorICAgICogW1RIUklGVC0zNzA0XSAtICJUQ29ubmVjdGVkQ2xpZW50IGRpZWQ6IENvdWxkIG5vdCByZWZpbGwgYnVmZmVyIiBtZXNzYWdlIHNob3duIHdoZW4gdXNpbmcgSFRUUCBTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzY3OF0gLSBGaXggamF2YWRvYyBlcnJvcnMgb24gSkRLIDgKKyAgICAqIFtUSFJJRlQtMzAxNF0gLSBBcHBWZXlvciBzdXBwb3J0CisgICAgKiBbVEhSSUZULTI5OTRdIC0gTm9kZS5qcyBUSlNPTlByb3RvY29sIGNhbm5vdCBiZSB1c2VkIGZvciBvYmplY3Qgc2VyaWFsaXphdGlvbi4KKyAgICAqIFtUSFJJRlQtMjk3NF0gLSB3cml0ZVRvUGFyY2VsIHRocm93cyBOUEUgZm9yIG9wdGlvbmFsIGVudW0gZmllbGRzCisgICAgKiBbVEhSSUZULTI5NDhdIC0gUHl0aG9uIFRKU09OUHJvdG9jb2wgZG9lc24ndCBoYW5kbGUgc3RydWN0cyB3aXRoIGJpbmFyeSBmaWVsZHMgY29udGFpbmluZyBpbnZhbGlkIHVuaWNvZGUuCisgICAgKiBbVEhSSUZULTI4NDVdIC0gQ2hpbGRTZXJ2aWNlLlBsbzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorICAgICogW1RIUklGVC0zMjc2XSAtIEJpbmFyeSBkYXRhIGRvZXMgbm90IGRlY29kZSBjb3JyZWN0bHkgdXNpbmcgdGhlIFRKU09OUHJvdG9jb2wgd2hlbiB0aGUgYmFzZTY0IGVuY29kZWQgZGF0YSBpcyBwYWRkZWQuCisgICAgKiBbVEhSSUZULTMyNTNdIC0gVXNpbmcgbGF0ZXN0IHZlcnNpb24gb2YgRCBnaXZlcyBkZXByZWNhdGlvbiBub3RpY2VzCisgICAgKiBbVEhSSUZULTI4ODNdIC0gVFR3aXN0ZWQucHksIGR1cmluZyBDb25uZWN0aW9uTG9zdCBwcm9jZXNzaW5nOiBleGNlcHRpb25zLlJ1bnRpbWVFcnJvcjogZGljdGlvbmFyeSBjaGFuZ2VkIHNpemUgZHVyaW5nIGl0ZXJhdGlvbgorICAgICogW1RIUklGVC0yMDE5XSAtIFdyaXRpbmcgb24gYSBkaXNjb25uZWN0ZWQgc29ja2V0IG9uIE1hYyBjYXVzZXMgU0lHIFBJUEUKKyAgICAqIFtUSFJJRlQtMjAyMF0gLSBUaHJpZnQgbGlicmFyeSBoYXMgc29tZSBlbXB0eSBmaWxlcyB0aGF0IGhhdmVuJ3QgcmVhbGx5IGJlZW4gZGVsZXRlZAorICAgICogW1RIUklGVC0yMDQ5XSAtIEdvIGNvbXBpbGVyIGRvZXNuJ3QgYnVpbGQgb24gbmF0aXZlIFdpbmRvd3MKKyAgICAqIFtUSFJJRlQtMjAyNF0gLSBUU2VydmVyLmNwcCB3YXJucyBvbiA2NC1iaXQgcGxhdGZvcm1zIGFib3V0IHRydW5jYXRpbmcgYW4gcmxpbV90IGludG8gYW4gaW50CisgICAgKiBbVEhSSUZULTIwMjNdIC0gZ2V0dGltZW9mZGF5IGltcGxlbWVudGF0aW9uIG9uIFdpbmRvd3MgZXJyb3JzIHdoZW4gbm8gdGltZSB6b25lIGlzIHBhc3NlZCBpbi4KKyAgICAqIFtUSFJJRlQtMjAyMl0gLSBDb0IgYW5kIGRlbnNlIGNvZGUgZ2VuZXJhdGlvbiBzdGlsbCB1c2VzIFRSMSBiaW5kLCBldmVuIHRob3VnaCB0aGF0IGRvZXNuJ3Qgd29yayB3aXRoIGNsYW5nCisgICAgKiBbVEhSSUZULTIwMjddIC0gTWlub3IgNjQtYml0IGFuZCBOT01JTk1BWCBpc3N1ZXMgaW4gQysrIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMjE1Nl0gLSBUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBpcyB0aHJvd2luZyBleGNlcHRpb25zIHdpdGggbWlzbGVhZGluZyBpbmZvcm1hdGlvbgorICAgICogW1RIUklGVC0yMTU0XSAtIE1pc3NpbmcgPG9wZXJhdG9yIGJvZHkKKyAgICAqIFtUSFJJRlQtMjE0OF0gLSBUTm9uYmxvY2tpbmdNdWx0aUZldGNoQ2xpZW50IGltcG9ydHMgbG9nNGoKKyAgICAqIFtUSFJJRlQtMjEwM10gLSBbcHl0aG9uXSBTdXBwb3J0IGZvciBTU0wgY2VydGlmaWNhdGVzIHdpdGggU3ViamVjdCBBbHRlcm5hdGl2ZSBOYW1lcworICAgICogW1RIUklGVC0xOTMxXSAtIFNlbmRpbmcgYSBmcmFtZSBzaXplIG9mIHplcm8gdG8gYSBUTm9uYmxvY2tpbmdTZXJ2ZXIgY2F1c2VzIGFuIGFzc2VydGlvbiBmYWlsdXJlCisgICAgKiBbVEhSSUZULTE3NTFdIC0gZGVmaW5pdGlvbiBvZiBpbmNyZWFzZV9tYXhfZmRzIGRvZXNuJ3QgY29tcGlsZSB3aGVuIEhBVkVfU1lTX1JFU09VUkNFX0ggaXMgbm90IGRlZmluZWQKKyAgICAqIFtUSFJJRlQtMTUyMl0gLSBUU2VydmVyU29ja2V0IHBvdGVudGlhbCBtZW1vcnkgbGVhayB3aXRoIGFkZHJpbmZvICpyZXMwCisgICAgKiBbVEhSSUZULTE1NDddIC0gUHJvYmxlbXMgYnVpbGRpbmcgYWdhaW5zdCBzdGF0aWMgbGliZXZlbnQKKyAgICAqIFtUSFJJRlQtMTU0NV0gLSBHZW5lcmF0ZWQgamF2YXNjcmlwdCBjb2RlIHVzZXMgImZvciBpbiIgZm9yIGxvb3Bpbmcgb3ZlciBhcnJheXMKKyAgICAqIFtUSFJJRlQtMTQ4N10gLSBOYW1lc3BhY2UgcHJvYmxlbSwgY29tcGlsZSBmYWlscyBvbiBnZW5lcmF0ZWQgY29kZQorICAgICogW1RIUklGVC0xNDcyXSAtIENvbmZpZ3VyYXRpb24gY29uZmxpY3RzIHdpdGggYm9vc3QgcGxhdGZvcm0gaW5jbHVkZSBoZWFkZXIKKyAgICAqIFtUSFJJRlQtNl0gLSBUaHJpZnQgbGlicmFyaWVzIGFuZCBjb21waWxlciBsYWNrIHZlcnNpb24gbnVtYmVyCisgICAgKiBbVEhSSUZULTE2ODBdIC0gbWFrZSBpbnN0YWxsIHJlcXVpcmVzIEdOVSBtYWtlCisgICAgKiBbVEhSSUZULTM4NjldIC0gRGFydCBUdXRvcmlhbCBidWlsZCBmYWlscyB3aXRoIEVycm9yIDY1IGF0ICJwdWIgZ2V0IgorICAgICogW1RIUklGVC0zODYxXSAtIFRyYXZpcyBDSSBidWlsZHMgYXJlIHRpbWluZyBvdXQgLSBDKytUU2VydmVySW50ZWdyYXRpb25UZXN0IGFwcGVhcnMgdG8gYmUgaGFuZ2luZworICAgICogW1RIUklGVC0zODU1XSAtIEluIHRoZSBnbyBzaW1wbGUgc2VydmVyLCBpZiBTdG9wKCkgaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGl0IGhhbmdzCisgICAgKiBbVEhSSUZULTM4ODVdIC0gUEhQOiBFcnJvciB3aGVuIHJlYWRJNjQgaW4gVENvbXBhY3RQcm90b2NvbAorICAgICogW1RIUklGVC0zODgzXSAtIEdvIFRlc3RBbGxDb25uZWN0aW9uIGNhbiBmYWlsIHdpdGggcG9ydCA5MDkwIGNvbGxpc2lvbgorICAgICogW1RIUklGVC0zODg0XSAtIEZpeCBFcmxhbmcgY29tcGFjdCBwcm90b2NvbCBkb3VibGUgZW5kaWFuZXNzIGFuZCBib29sZWFuIGxpc3QKKyAgICAqIFtUSFJJRlQtMzg4MF0gLSBFcmxhbmcgQ29tcGFjdCBwcm90b2NvbCAtIGJvb2xlYW4gdmFsdWVzIGludmVydGVkCisgICAgKiBbVEhSSUZULTM4NzldIC0gVW5kZWZpbmVkIGV2YWx1YXRpb24gb3JkZXIgY2F1c2VzIGluY29ycmVjdCBwcm9jZXNzaW5nIGluIHRoZSBDKysgbGlicmFyeSBKU09OIHByb3RvY29sCisgICAgKiBbVEhSSUZULTM4NTFdIC0gR29sYW5nIHRocmlmdCBjb250aW51YWxseSBhZGRzIHRoZSB4L3RocmlmdCBjb250ZW50IHR5cGUgCisgICAgKiBbVEhSSUZULTM4NTBdIC0gQWxsIGFwYWNoZSBidWlsZHMgYXJlIGZhaWxpbmcgd2hlbiBpbml0aWF0ZWQgZnJvbSBhIGdpdGh1YiBwdWxsIHJlcXVlc3QKKyAgICAqIFtUSFJJRlQtMzgzN10gLSBUaGlmdCAwLjkuMyBjYW4ndCBiZSBidWlsZCB3aXRoIFF1aWNrQ2hlY2sgMi44LjIgYW5kIHVub3JkZXJlZC1jb250YWluZXJzIDAuMi42CisgICAgKiBbVEhSSUZULTM4MzFdIC0gYnVpbGQgb2YgdGVzdC9jcHAvc3JjL1Rlc3RDbGllbnQuY3BwIGZhaWxzIHdpdGggbmV3ZXIgZ2NjIG9uIHBsYXRmb3JtcyB3aXRoIHVuc2lnbmVkIGNoYXIgZHVlIHRvIG5hcnJvd2luZyBjb252ZXJzaW9ucworICAgICogW1RIUklGVC0zODI3XSAtIHBocCBDb21wYWN0UHJvdG9jb2wgcmVhZEk2NCBmdW5jdGlvbiBoYXMgYnVnLCB3aGVuIHZhbHVlIGhhcyAzMmJpdCB+NjRiaXQsIEV4YW1wbGXvvJp2YWx1ZT0xNDYxNTYzNDU3MDAwIAorICAgICogW1RIUklGVC0zODI1XSAtIEphdmFzY3JpcHQgdGVzdCBkZXBlbmRlbmN5IGlzIG5vIGxvbmdlciBhdmFpbGFibGUKKyAgICAqIFtUSFJJRlQtMzgxNF0gLSBGaXggY29udGVudGlvbiBpbiBUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0CisgICAgKiBbVEhSSUZULTM3OTNdIC0gQXBwdmV5b3IgYnVpbGRzIHJlZmVyZW5jZSBhbiBhbnQgdmVyc2lvbiB0aGF0IGlzIG5vIGxvbmdlciB0aGVyZQorICAgICogW1RIUklGVC0zNzg2XSAtIE5vZGUuanMgVExTIGVtaXRzICdjb25uZWN0JyBiZWZvcmUgY29ubmVjdGlvbiBpcyByZWFkeQorICAgICogW1RIUklGVC0zNzgwXSAtIEZpeCBkYXJ0IGludDY0IHVzYWdlIHdoZW4gY29tcGlsZWQgdG8ganMKKyAgICAqIFtUSFJJRlQtMzc4OV0gLSBOb2RlLmpzIGxhY2tzIGFiaWxpdHkgdG8gZGVzdHJveSBjb25uZWN0aW9uCisgICAgKiBbVEhSSUZULTM3OTZdIC0gVGhlcmUncyBubyAtLWRiZyBmb3IgZGhfc3RyaXAsIG1heWJlIHNvbWVvbmUgaGFzIG1pc3Rha2VuIHRoaXMgZm9yIC0tZGJnLXBhY2thZ2UuCisgICAgKiBbVEhSSUZULTM3OTVdIC0gR2VuZXJhdGVkIGhhc2hWYWx1ZSBtZXRob2QgaW4gU3dpZnQgd2lsbCBvdmVyZmxvdworICAgICogW1RIUklGVC0zNzkwXSAtIEZpeCBEZWxwaGkgbmFtZWQgcGlwZSBjbGllbnQgdG8gdXNlIHRpbWVvdXQgZXZlbiB3aGVuIHBpcGUgZG9lc24ndCB5ZXQgZXhpc3QKKyAgICAqIFtUSFJJRlQtMzc4N10gLSBOb2RlLmpzIENvbm5lY3Rpb24gb2JqZWN0IGRvZXNuJ3QgaGFuZGxlIGVycm9ycyBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMzc5MV0gLSBEZWxwaGkgcGlwZSBjbGllbnQgbWF5IGZhaWwgZXZlbiBpbiBhIG5vbi1lcnJvciBjb25kaXRpb24KKyAgICAqIFtUSFJJRlQtMzc3MV0gLSBUQnVmZmVyZWRUcmFuc3BvcnQgZ2V0cyBpbiBpbnZhbGlkIHN0YXRlIG9uIHJlYWQvd3JpdGUgZXJyb3JzCisgICAgKiBbVEhSSUZULTM3NjRdIC0gUEhQICJtYWtlIGluc3RhbGwiIGRvZXMgbm90IGluc3RhbGwgVE11bHRpcGxleGVkUHJvdG9jb2wucGhwIG5vciBUU2ltcGxlSlNPTlByb3RvY29sLnBocAorICAgICogW1RIUklGVC0zNzY4XSAtIFRUaHJlYWRlZFNlcnZlciBtYXkgY3Jhc2ggaWYgaXQgaXMgZGVzdHJveWVkIGltbWVkaWF0ZWx5IGFmdGVyIGl0IHJldHVybnMgZnJvbSBzZXJ2ZSgpOyBUVGhyZWFkZWRTZXJ2ZXIgZGlzY29ubmVjdHMgY2xpZW50cworICAgICogW1RIUklGVC0zNzY1XSAtIG1lbW9yeSBsZWFrIGluIHB5dGhvbiBjb21wYWN0IHByb3RvY29sIGV4dGVuc2lvbgorICAgICogW1RIUklGVC0zNzU4XSAtIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6Z2V0VHlwZSBhbmQgVFByb3RvY29sRXhjZXB0aW9uOjpnZXRUeXBlIHNob3VsZCBiZSBjb25zdAorICAgICogW1RIUklGVC0zNzYzXSAtIEZpeCBzZXJpYWxpemF0aW9uIG9mIGk2NCBsYXJnZXIgdGhhbiAyXjUzIGZvciBicm93c2VyaWZ5CisgICAgKiBbVEhSSUZULTM3NTldIC0gcmVxdWlyZWQgZmllbGRzIHRoYXQgYXJlIG5pbCBhcmUgc2lsZW50bHkgaWdub3JlZCBvbiB3cml0ZQorICAgICogW1RIUklGVC0zNzUzXSAtIFRTZXJ2ZXJGcmFtZXdvcms6OnN0b3AgbWF5IGZhaWwgdG8gaW50ZXJydXB0IGNvbm5lY3RlZCBjbGllbnRzCisgICAgKiBbVEhSSUZULTM3NTVdIC0gVERlYnVnUHJvdG9jb2w6OndyaXRlU3RyaW5nIGhpdHMgYXNzZXJ0IGluIGlzcHJpbnQgb24gV2luZG93cyB3aXRoIGRlYnVnIENSVAorICAgICogW1RIUklGVC0zNzUxXSAtIENvbXBpbGVyIGFsbG93cyBmaWVsZCBpZHMgdGhhdCBhcmUgdG9vIGxhcmdlIGZvciBnZW5lcmF0ZWQgY29kZQorICAgICogW1RIUklGVC0zNzQ4XSAtIE5vZGUuanMgRGVzZXJpYWxpemF0aW9uIG9mIGxpc3RzIG9mIGxpc3RzIGlzIGJyb2tlbgorICAgICogW1RIUklGVC0zNzYwXSAtIEZpeCBpbnN0YWxsIHBhdGhzIGV0YyBvZiBkZWJpYW4gcGFja2FnZXMgZm9yIHB5IGFuZCBwZXJsCisgICAgKiBbVEhSSUZULTM3NTddIC0gRml4IHZhcmlvdXMgYnVpbGQgd2FybmluZ3Mgb24gV2luZG93cyB3aXRoIFZTMjAxNSBjb21waWxlcgorICAgICogW1RIUklGVC0zNzUwXSAtIE5TQ29weWluZyBjb3B5V2l0aFpvbmU6IGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGNoZWNrIGlzU2V0CisgICAgKiBbVEhSSUZULTM3NDddIC0gRHVwbGljYXRlIG5vZGUuanMgYnVpbGQgb24gVHJhdmlzLUNJCisgICAgKiBbVEhSSUZULTM3NDRdIC0gVGhlIHByZWNpc2lvbiBzaG91bGQgYmUgMTcgKDE2IGJpdHMgbmVlZCBhZnRlciBkb3QpIGFmdGVyIGRvdCBmb3IgZG91YmxlIHR5cGUuCisgICAgKiBbVEhSSUZULTM3NDFdIC0gaGF4ZSB0ZXN0IGlzIGJyb2tlbgorICAgICogW1RIUklGVC0zNzM5XSAtIERlcHJlY2F0aW9uIHdhcm5pbmcgaW4gY29kZWdlbi9iYXNlLmQKKyAgICAqIFtUSFJJRlQtMzczNV0gLSBKU09OIHByb3RvY29sIGxlZnQgaW4gaW5jb3JyZWN0IHN0YXRlIHdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgcmVhZCBvciB3cml0ZSBvcGVyYXRpb25zCisgICAgKiBbVEhSSUZULTM3MzRdIC0gVG8gY29tcGFyZSB0d28gc3RyaW5nIGFzIGxvd2VyY2FzZS4KKyAgICAqIFtUSFJJRlQtMzc0M10gLSBKYXZhIEpTT04gcHJvdG9jb2wgbGVmdCBpbiBpbmNvcnJlY3Qgc3RhdGUgd2hlbiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbnMKKyAgICAqIFtUSFJJRlQtMzczMV0gLSBQZXJsIG11bHRpcGxleCB0ZXN0IGlzIGZsYWt5CisgICAgKiBbVEhSSUZULTM3MjldIC0gUmVzdHJpY3QgcmFrZSB2ZXJzaW9uCisgICAgKiBbVEhSSUZULTM3MjddIC0gSW5jb3JyZWN0IHJlcXVpcmUgcGF0aHMgaW4gTm9kZS5qcyB0dXRvcmlhbAorICAgICogW1RIUklGVC0zNzIzXSAtIEZpeCBMdWEgaW5jbHVkZSBwYXRoCisgICAgKiBbVEhSSUZULTM3MjJdIC0gRml4IGNlcnQgcGF0aCBpbiBDKysgY3Jvc3MgdGVzdHMgZm9yIG5vbi1MaW51eCBwbGF0Zm9ybQorICAgICogW1RIUklGVC0zNzI2XSAtIEZpeCBpbmNvcnJlY3QgY29uZGl0aW9uYWwgaW4gVE11bHRpcGxleGVkUHJvY2Vzc29yLnB5CisgICAgKiBbVEhSSUZULTM3MjVdIC0gU2tpcCBhIGZsYWt5IGNyb3NzIHRlc3QgZW50cnkgKGQtZGFydCBjb21wYWN0IGZyYW1lZC1pcCkKKyAgICAqIFtUSFJJRlQtMzcyNF0gLSBGaXggaW5jb3JyZWN0IHRpbWV2YWwgY29udmVyc2lvbiBpbiBsaWJldmVudC5kCisgICAgKiBbVEhSSUZULTM3MjFdIC0gQ0xPTkUgLSB3aHkgbm90IGFkZCB1bmljb2RlIHN0cmluZ3Mgc3VwcG9ydCB0byBweXRob24gZGlyZWN0bHk/CisgICAgKiBbVEhSSUZULTM3MjBdIC0gVFRjcFNvY2tldFN0cmVhbUltcGwuUmVhZCgpIHJldHVybnMgMCBpZiBub3QgYWxsIHJlcXVlc3RlZCBieXRlcyBjb3VsZCBiZSByZWFkCisgICAgKiBbVEhSSUZULTM3MTldIC0gRGFydCBnZW5lcmF0b3Igc2hvdWxkIHVzZSBsb3dlckNhbWVsQ2FzZSBmb3Igc2VydmljZSBuYW1lcworICAgICogW1RIUklGVC0zOTAyXSAtIFRTb2NrZXQub3BlbiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMzkwMV0gLSBURnJhbWVkVHJhbnNwb3J0Lm9wZW4gdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTM4OTNdIC0gQ29tbWFuZCBpbmplY3Rpb24gaW4gZm9ybWF0X2dvX291dHB1dAorICAgICogW1RIUklGVC0zODA3XSAtIFN3aWZ0IGNvbXBpbGVyIGRvZXMgbm90IGVzY2FwZSByZXNlcnZlZCB3b3JkcworICAgICogW1RIUklGVC0zNzk4XSAtIFRIdHRwQ2xpZW50IGRvZXMgbm90IHVzZSBwcm94eSBmcm9tIGh0dHBfcHJveHksIGh0dHBzX3Byb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcworICAgICogW1RIUklGVC0zODA5XSAtIHdyb25nL3VudXNlZCBCSU5BUlkgdHlwZSBjb2RlCisgICAgKiBbVEhSSUZULTM4MDZdIC0gU3dpZnQgZ2VuZXJhdG9yIGRvZXMgbm90IGhhbmRsZSBzZWxmLXJlZmVycmluZyBzdHJ1Y3RzCisgICAgKiBbVEhSSUZULTM4MDVdIC0gR29sYW5nIHNlcnZlciBzdXNjZXB0aWJsZSB0byBtZW1vcnkgc3Bpa2UgZnJvbSBtYWxmb3JtZWQgbWVzc2FnZQorICAgICogW1RIUklGVC0zNzk3XSAtIEdlbmVyYXRlZCBEZWxwaGkgcHJvY2Vzc29yIHNob3VsZG4ndCBlcnJvciBvdXQgb24gdGltZWQgb3V0IGV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtMzgxM10gLSBBcHB2ZXlvciBidWlsZHMgcmVmZXJlbmNlIGFuIG9wZW5zc2wgdmVyc2lvbiB0aGF0IGlzIG5vIGxvbmdlciB0aGVyZQorICAgICogW1RIUklGVC0zNjU4XSAtIE1pc3NpbmcgZmlsZSBpbiBUSFJJRlQtMzU5OQorICAgICogW1RIUklGVC0zNjQ5XSAtIFB5dGhvbiBUU2FzbENsaWVudFRyYW5zcG9ydCBpbml0aWFsaXplcyBUVHJhbnNwb3J0RXhjZXB0aW9uIGluY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTM2NTBdIC0gaW5jb3JyZWN0IHVuaW9uIHNlcmlhbGl6YXRpb24gCisgICAgKiBbVEhSSUZULTM3MTNdIC0gbGliL2QvdGVzdC90aHJpZnRfdGVzdF9ydW5uZXIuc2ggaXMgZmxha3kgb24gSmVua2lucworICAgICogW1RIUklGVC0zNjY4XSAtIHJhbmdlIGNoZWNrIGVycm9yIGluIGNvbXBhY3QgcHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMzY2M10gLSBDTWFrZSBjcHAgdGVzdCBmYWlscyB0byBidWlsZCBvbiBzeXN0ZW0gd2l0aG91dCB6bGliCisgICAgKiBbVEhSSUZULTM3MTJdIC0gVFRvcm5hZG9TZXJ2ZXIgY2Fubm90IGhhbmRsZSBJUHY2IGFkZHJlc3MKKyAgICAqIFtUSFJJRlQtMzcxMF0gLSBEYXJ0IGdlbmVyYXRvciBkb2VzIG5vdCBjYW1lbCBjYXNlIENvbnN0YW50cyBjbGFzcyBuYW1lcworICAgICogW1RIUklGVC0zNjk3XSAtIERhcnQgZ2VuZXJhdG9yIGRvZXMgbm90IG5hbWUgaW1wb3J0cworICAgICogW1RIUklGVC0zNjkwXSAtIFdvcmsgYXJvdW5kIGRvY2tlciBpbWFnZSBidWlsZCBmYWlsdXJlcyBvbiBUcmF2aXMtQ0kKKyAgICAqIFtUSFJJRlQtMzY4OV0gLSB0aHJpZnRfcmVjb25uZWN0aW5nX2NsaWVudCBzdGFydCBmYWlsZWQgd2hlbiBzZXJ2ZXIgaXMgbm90IGF2YWlsYWJsZQorICAgICogW1RIUklGVC0zNjk1XSAtIEZpeCBEIHRlc3Qgc2NyaXB0cworICAgICogW1RIUklGVC0zNjc1XSAtIFVuaW9uIGlzIG5vdCBzZXJpYWxpemVkIGNvcnJlY3RseSBieSBUaHJpZnQgQyBHbGliCisgICAgKiBbVEhSSUZULTM2NzNdIC0gQVBJIGZhaWxzIHdpdGggc3RkOjpleGNlcHRpb24gYWZ0ZXIgYSB0aW1lb3V0IG9jY3VyZWQgaW4gZWFybGllciBhbnkgQVBJIGNhbGwKKyAgICAqIFtUSFJJRlQtMzcwOV0gLSBDb21tZW50IHN5bnRheCBjYW4gcHJvZHVjZSBicm9rZW4gY29kZQorICAgICogW1RIUklGVC0zNzA1XSAtIEdvIG1hcCBoYXMgaW5jb3JyZWN0IHR5cGVzIHdoZW4gdXNlZCB3aXRoIGZvcndhcmQtZGVmaW5lZCB0eXBlcworICAgICogW1RIUklGVC0zNzAyXSAtIEZpeCBjcm9zcyB0ZXN0cyBmb3IgRGFydCBjb21wYWN0IHByb3RvY29sICgzIGZhaWxpbmcpCisgICAgKiBbVEhSSUZULTM2ODNdIC0gQmFkWWllbGRFcnJvciBpbiB0aHJpZnQgcHk6dG9ybmFkbyBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzY4Ml0gLSBEbyBub3QgcmV1c2UgcmVmdXNlZCBzb2NrZXRzIGluIHRlc3Qgc2NyaXB0cworICAgICogW1RIUklGVC0zNjgxXSAtIEZpeCBEYXJ0IHR1dG9yaWFsIGJ1aWxkCisgICAgKiBbVEhSSUZULTM2ODBdIC0gSmF2YSBhc3luYyBwcm9jZXNzb3IgZmFpbHMgdG8gbm90aWZ5IGVycm9ycyB0byBjbGllbnRzCisgICAgKiBbVEhSSUZULTM3MTRdIC0gVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbiBpcyBub3QgZGVmaW5lZCBpbiBqcy9zcmMvdGhyaWZ0LmpzCisgICAgKiBbVEhSSUZULTM2ODhdIC0gRml4IHNvY2tldCBiaW5kIGZhaWx1cmUgZGV0ZWN0aW9uIG9mIGNyb3NzIHRlc3QKKyAgICAqIFtUSFJJRlQtMzY0MV0gLSBSdWJ5IGNsaWVudCBzaG91bGQgdHJ5IHRvIGNvbm5lY3QgdG8gZXZlcnkgcmVzdWx0IG9mIGdldGFkZHJpbmZvCisgICAgKiBbVEhSSUZULTM2MzVdIC0gRCB0cmFuc3BvcnRfdGVzdCBpcyBmbGFreSBvbiBKZW5raW5zIGFuZCBUcmF2aXMKKyAgICAqIFtUSFJJRlQtMzYxOF0gLSBQeXRob24gVFNTTFNvY2tldCBkZXByZWNhdGlvbiBtZXNzYWdlIHNob3VsZCBwcmludCBjYWxsZXIncyBsb2NhdGlvbgorICAgICogW1RIUklGVC0zMTQ1XSAtIEpTT04gcHJvdG9jb2wgZG9lcyBub3QgaGFuZGxlIGJvb2wgYW5kIGVtcHR5IGNvbnRhaW5lcnMgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTMxNThdIC0gVEJhc2U8VCxGPiNkZWVwQ29weSBzaG91bGQgcmV0dXJuIFQKKyAgICAqIFtUSFJJRlQtMzE1N10gLSBUQmFzZSBzaWduYXR1cmUgc2hvdWxkIGJlIFRCYXNlPFQgZXh0ZW5kcyBUQmFzZTxULEY+LCBGIGV4dGVuZHMgVEZpZWxkSWRFbnVtPgorICAgICogW1RIUklGVC0zMTU2XSAtIE5vZGUgVExTOiBzZXJ2ZXIgZXhlY3V0ZXMgcHJvY2Vzc2luZyBsb2dpYyB0d28gZnVsbCB0aW1lcworICAgICogW1RIUklGVC0zMTU0XSAtIHR1dG9yaWFsL3B5LnRvcm5hZG8gdGhyb3cgRU9GIGV4Y2VwdGlvbgorICAgICogW1RIUklGVC0zMDYzXSAtIEMrKyBidWlsZCAtV3VudXNlZC1wYXJhbWV0ZXIgd2FybmluZ3Mgb24gcHJvY2Vzc29yX3Rlc3QsIFRyYW5zcG9ydFRlc3QKKyAgICAqIFtUSFJJRlQtMzA1Nl0gLSBBZGQgc3RyaW5nL2NvbGxlY3Rpb24gbGVuZ3RoIGxpbWl0cyBmb3IgUHl0aG9uIHByb3RvY29sIHJlYWRlcnMKKyAgICAqIFtUSFJJRlQtMzIzN10gLSBGaXggVE5hbWVkUGlwZVNlcnZlcjo6Y3JlYXRlTmFtZWRQaXBlIG1lbW9yeSBsZWFrCisgICAgKiBbVEhSSUZULTMyMzNdIC0gRml4IEMrKyBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmVXb3JrZXIgd29ya2VyIGpvaW4KKyAgICAqIFtUSFJJRlQtMzIzMl0gLSBDYW5ub3QgZGVzZXJpYWxpemUganNvbiBtZXNzYWdlcyBjcmVhdGVkIHdpdGggZmllbGROYW1lc0FzU3RyaW5nIAorICAgICogW1RIUklGVC0zMjA2XSAtIEZpeCBWaXN1YWwgU3R1ZGlvIGJ1aWxkIGZhaWx1cmUgZHVlICdwdGhyZWFkX3NlbGYnOiBpZGVudGlmaWVyIG5vdCBmb3VuZAorICAgICogW1RIUklGVC0zMjAwXSAtIEpTIGFuZCBub2RlanMgZG8gbm90IGVuY29kZSBKU09OIHByb3RvY29sIGJpbmFyeSBmaWVsZHMgYXMgYmFzZTY0CisgICAgKiBbVEhSSUZULTMxOTldIC0gRXhjZXB0aW9uIGZpZWxkIGhhcyBiYXNpYyBtZXRhZGF0YQorICAgICogW1RIUklGVC0zMTgyXSAtIFRGcmFtZWRUcmFuc3BvcnQgaXMgaW4gYW4gaW52YWxpZCBzdGF0ZSBhZnRlciBmcmFtZSBzaXplIGV4Y2VwdGlvbgorICAgICogW1RIUklGVC0yNTM2XSAtIG5ldyBUU29ja2V0LCB1bmluaXRpYWxpc2VkIHZhbHVlIHJlcG9ydGVkIGJ5IHZhbGdyaW5kCisgICAgKiBbVEhSSUZULTI1MjddIC0gQXBhY2hlIFRocmlmdCBJREwgQ29tcGlsZXIgY29kZSBnZW5lcmF0ZWQgZm9yIE5vZGUuanMgc2hvdWxkIGJlIGpzaGludCBjbGVhbgorICAgICogW1RIUklGVC0yNTE5XSAtICJwcm9jZXNzb3IiIGNsYXNzIGlzIG5vdCBiZWluZyBnZW5lcmF0ZWQKKyAgICAqIFtUSFJJRlQtMjQzMV0gLSBURmlsZVRyYW5zcG9ydFRlc3QgZmFpbHMgd2l0aCAiY2hlY2sgZGVsdGEgPCBYWFggZmFpbGVkIgorICAgICogW1RIUklGVC0yNzA4XSAtIEVybGFuZyBsaWJyYXJ5IGRvZXMgbm90IHN1cHBvcnQgIm9uZXdheSIgbWVzc2FnZSB0eXBlCisgICAgKiBbVEhSSUZULTMzNzddIC0gRGVlcCBjb3B5IGlzIGFjdHVhbGx5IHNoYWxsb3cgd2hlbiB1c2luZyB0eXBlZGVmIG1lbWJlcnMKKyAgICAqIFtUSFJJRlQtMzM3Nl0gLSBDIyBhbmQgUHl0aG9uIEpTT04gcHJvdG9jb2wgZG91YmxlIHZhbHVlcyBsb3NlIHByZWNpc2lvbgorICAgICogW1RIUklGVC0zMzczXSAtIFZhcmlvdXMgZml4ZXMgZm9yIGNyb3NzIHRlc3Qgc2VydmVycyBhbmQgY2xpZW50cworICAgICogW1RIUklGVC0zMzcwXSAtIGVycm5vIGV4dGVybiB2YXJpYWJsZSByZWRlZmluZWQuIE5vdCBjb21waWxpbmcgZm9yIEFuZHJvaWQKKyAgICAqIFtUSFJJRlQtMzM3OV0gLSAgUG90ZW50aWFsIG91dCBvZiByYW5nZSBwYW5pYyBpbiBHbyBKU09OIHByb3RvY29scworICAgICogW1RIUklGVC0zMzcxXSAtIEFic3RyYWN0IG5hbWVzcGFjZSBVbml4IGRvbWFpbiBzb2NrZXRzIGJyb2tlbiBpbiBDKysKKyAgICAqIFtUSFJJRlQtMzM4MF0gLSBub2RlanM6IDAuOS4yIC0+IDAuOS4zIHVwZ3JhZGUgYnJlYWtzIFByb3RvY29sIGFuZCBUcmFuc3BvcnQgcmVxdWlyZXMKKyAgICAqIFtUSFJJRlQtMzM2N10gLSBGaXggYmFkIGxpbmtzIHRvIGNvZGluZ19zdGFuZGFyZHMubWQgIzYzNCAKKyAgICAqIFtUSFJJRlQtMzQwMV0gLSBOZXN0ZWQgY29sbGVjdGlvbnMgZW1pdCBPYmplY3RpdmUtQyBjb2RlIHRoYXQgY2Fubm90IGNvbXBpbGUKKyAgICAqIFtUSFJJRlQtMzQwM10gLSBKU09OIFN0cmluZyByZWFkZXIgZG9lc24ndCByZWNvZ25pemUgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlycworICAgICogW1RIUklGVC0zMzYyXSAtIG1ha2UgY2hlY2sgZmFpbHMgZm9yIEMrKyBhdCB0aGUgU2VjdXJpdHlUZXN0CisgICAgKiBbVEhSSUZULTMzOTVdIC0gQ29jb2EgY29tcGlsZXIgcHJvZHVjZXMgY29ycnVwdCBjb2RlIHdoZW4gYm94aW5nIGVudW1zIGluc2lkZSBtYXAuCisgICAgKiBbVEhSSUZULTMzOTRdIC0gY29tcGlsZXIgZ2VuZXJhdGVzIHVuY29tcGlsYWJsZSBjb2RlCisgICAgKiBbVEhSSUZULTMzODhdIC0gaGFzaCBkb2Vzbid0IHdvcmsgb24gc2V0L2xpc3QKKyAgICAqIFtUSFJJRlQtMzM5MV0gLSBXcm9uZyBib29sIGZvcm1hdHRpbmcgaW4gdGVzdCBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzM5MF0gLSBUVG9ybmFkbyBzZXJ2ZXIgZG9lc24ndCBoYW5kbGUgY2xvc2VkIGNvbm5lY3Rpb25zIHByb3Blcmx5CisgICAgKiBbVEhSSUZULTMzODJdIC0gVEJhc2UgY2xhc3MgZm9yIEMrKyBMaWJyYXJ5CisgICAgKiBbVEhSSUZULTMzOTJdIC0gSmF2YSBUWmxpYlRyYW5zcG9ydCBkb2VzIG5vdCBjbG9zZSBpdHMgd3JhcHBlciBzdHJlYW1zIHVwb24gY2xvc2UoKQorICAgICogW1RIUklGVC0zMzgzXSAtIGk2NCByZWxhdGVkIHdhcm5pbmdzIAorICAgICogW1RIUklGVC0zMzg2XSAtIG1pc2MuIHdhcm5pbmdzIHdpdGggbWFrZSBjaGVjaworICAgICogW1RIUklGVC0zMzg1XSAtIHdhcm5pbmc6IGZvcm1hdCDigJglbHXigJkgZXhwZWN0cyDigJhsb25nIHVuc2lnbmVkIGludOKAmSwgYnV0IGhhcyB0eXBlIOKAmHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXI+OjpzaXplX3R5cGUge2FrYSB1bnNpZ25lZCBpbnR9CisgICAgKiBbVEhSSUZULTMzNTVdIC0gbnBtIFdBUk4gcGFja2FnZS5qc29uIHRocmlmdEAxLjAuMC1kZXYgTm8gbGljZW5zZSBmaWVsZC4KKyAgICAqIFtUSFJJRlQtMzM2MF0gLSBJbXByb3ZlIGNyb3NzIHRlc3Qgc2VydmVycyBhbmQgY2xpZW50cyBmdXJ0aGVyCisgICAgKiBbVEhSSUZULTMzNTldIC0gQmluYXJ5IGZpZWxkIGluY29tcGF0aWJpbGl0aWVzCisgICAgKiBbVEhSSUZULTMzNTRdIC0gRml4IHdvcmQtZXh0cmFjdGlvbiBzdWJzdHIgYnVnIGluIGluaXRpYWxpc20gY29kZQorICAgICogW1RIUklGVC0zMzUwXSAtIFB5dGhvbiBKU09OIHByb3RvY29sIGRvZXMgbm90IGVuY29kZSBiaW5hcnkgYXMgQmFzZTY0CisgICAgKiBbVEhSSUZULTM1NzddIC0gYXNzZXJ0aW9uIGZhaWxlZCBhdCBsaW5lIDUxMiBvZiB0ZXN0Y29udGFpbmVydGVzdC5jCisgICAgKiBbVEhSSUZULTM1NzZdIC0gQm9vc3QgdGVzdCAtLWxvZ19mb3JtYXQgYXJnIGRvZXMgbm90IGFjY2VwdCBsb3dlcmNhc2UKKyAgICAqIFtUSFJJRlQtMzU3NV0gLSBHbyBjb21waWxlciB0cmllcyB0byB1c2UgdW5leHBvcnRlZCBsaWJyYXJ5IG1ldGhvZHMgd2hlbiB1c2luZyByZWFkX3dyaXRlX3ByaXZhdGUKKyAgICAqIFtUSFJJRlQtMzU3NF0gLSBDb2NvYSBnZW5lcmF0b3IgbWFrZXMgdW5jb21waWxhYmxlIGltcG9ydHMKKyAgICAqIFtUSFJJRlQtMzU3MF0gLSBSZW1vdmUgZHVwbGljYXRlIGluc3RhbmNlcyB0aGF0IGFyZSBhZGRlZCBieSB1cHN0cmVhbQorICAgICogW1RIUklGVC0zNTcxXSAtIE1ha2UgZmVhdHVyZSB0ZXN0IHJlc3VsdCBicm93c2FibGUKKyAgICAqIFtUSFJJRlQtMzU2OV0gLSBjX2dsaWIgcHJvdG9jb2xzIGRvIG5vdCBjaGVjayBudW1iZXIgb2YgYnl0ZXMgcmVhZCBieSB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMzU2OF0gLSBUSGVhZGVyIHNlcnZlciBjcmFzaGVzIG9uIHJlYWRTbG93CisgICAgKiBbVEhSSUZULTM1NjddIC0gR0xpYi1HT2JqZWN0LUNSSVRJQ0FMICoqOiBnX29iamVjdF91bnJlZjogYXNzZXJ0aW9uICdHX0lTX09CSkVDVCAob2JqZWN0KScgZmFpbGVkCisgICAgKiBbVEhSSUZULTM1NjZdIC0gQysrL1F0OiBUUVRjcFNlcnZlclRlc3Q6OnRlc3RfY29tbXVuaWNhdGUoKSBpcyBuZXZlciBleGVjdXRlZAorICAgICogW1RIUklGVC0zNTY0XSAtIEMrKy9RdDogcG90ZW50aWFsIGNvcmUgZHVtcCBpbiBUUVRjcFNlcnZlciBpbiBjYXNlIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gVEFzeW5jUHJvY2Vzc29yOjpwcm9jZXNzKCkKKyAgICAqIFtUSFJJRlQtMzU1OF0gLSB0eXBvcyBpbiBjX2dsaWIgdGVzdHMKKyAgICAqIFtUSFJJRlQtMzU1OV0gLSBGaXggYXdrd2FyZCBleHRyYSBzZW1pLWNvbG9ucyB3aXRoIENvY29hIGNvbnRhaW5lciBsaXRlcmFscworICAgICogW1RIUklGVC0zNTU1XSAtICdjb25maWd1cmUnIHNjcmlwdCBkb2VzIG5vdCBob25vciAtLXdpdGgtb3BlbnNzbD08cGF0aD4gZm9yIGxpYmNyeXB0byBmb3IgQk5faW5pdAorICAgICogW1RIUklGVC0zNTU0XSAtIENvbnN0YW50IGRlY2xzIG1heSBsZWFkIHRvICJFcnJvcjogaW50ZXJuYWwgZXJyb3I6IHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZygpIGFscmVhZHkgYWN0aXZlIGZvciBkaWZmZXJlbnQgc3RydWN0IgorICAgICogW1RIUklGVC0zNTUyXSAtIGdsaWJfYyBNZW1vcnkgTGVhaworICAgICogW1RIUklGVC0zNTUxXSAtIFRocmlmdCBwZXJsIGxpYnJhcnkgbWlzc2luZyBwYWNrYWdlIGRlY2xhcmF0aW9uCisgICAgKiBbVEhSSUZULTM1NDldIC0gRXhjZXB0aW9ucyBhcmUgbm90IHByb3Blcmx5IHN0cmluZ2lmaWVkIGluIFBlcmwgbGlicmFyeQorICAgICogW1RIUklGVC0zNTQ2XSAtIE5vZGVKUyBjb2RlIHNob3VsZCBub3QgYmUgbmFtZXNwYWNlZCAoYW5kIGlzIGN1cnJlbnRseSBub3Qgc3RyaWN0LW1vZGUgY29tcGxpYW50KQorICAgICogW1RIUklGVC0zNTQ1XSAtIENvbnRhaW5lciB0eXBlIGxpdGVyYWxzIGRvIG5vdCBjb21waWxlCisgICAgKiBbVEhSSUZULTM1MzhdIC0gUmVtb3ZlIFVuYm91bmRNZXRob2RUeXBlIGluIFRQcm90b2NvbERlY29yYXRvcgorICAgICogW1RIUklGVC0zNTM2XSAtIEVycm9yICdjaGFyJyBkb2VzIG5vdCBjb250YWluIGEgZGVmaW5pdGlvbiBmb3IgJ0lzTG93U3Vycm9nYXRlJyBmb3IgV1A3IHRhcmdldAorICAgICogW1RIUklGVC0zNTM0XSAtIExpbmsgZXJyb3Igd2hlbiBidWlsZGluZyB3aXRoIFF0NQorICAgICogW1RIUklGVC0zNTMzXSAtIENhbiBub3Qgc2VuZCBuaWwgcG9pbnRlciBhcyBzZXJ2aWNlIG1ldGhvZCBhcmd1bWVudAorICAgICogW1RIUklGVC0zNTA3XSAtIFRIdHRwQ2xpZW50IGRvZXMgbm90IHVzZSBwcm94eSBmcm9tIGh0dHBfcHJveHksIGh0dHBzX3Byb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcworICAgICogW1RIUklGVC0zNTAyXSAtIEMrKyBUU2VydmVyU29ja2V0IHBhc3NlcyBzbWFsbCBidWZmZXIgdG8gZ2V0c29ja25hbWUKKyAgICAqIFtUSFJJRlQtMzUwMV0gLSBGb3J3YXJkIHNsYXNoIGluIGNvbW1lbnQgY2F1c2VzIGNvbXBpbGVyIGVycm9yCisgICAgKiBbVEhSSUZULTM0OThdIC0gQysrIGxpYnJhcnkgYXNzdW1lcyBvcHRpb25hbCBmdW5jdGlvbiBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3kgaXMgYXZhaWxhYmxlCisgICAgKiBbVEhSSUZULTM0OTddIC0gQnVpbGQgZmFpbHMgd2l0aCAiaW52YWxpZCB1c2Ugb2YgaW5jb21wbGV0ZSB0eXBlIgorICAgICogW1RIUklGVC0zNDk2XSAtIEMrKzogQ29iIHN0eWxlIGNsaWVudCBmYWlscyB3aGVuIHNlbmRpbmcgYSBjb25zZWN1dGl2ZSByZXF1ZXN0CisgICAgKiBbVEhSSUZULTM0OTNdIC0gbGlidGhyaWZ0IGRvZXMgbm90IGNvbXBpbGUgb24gd2luZG93cyB1c2luZyB2aXN1YWwgc3R1ZGlvCisgICAgKiBbVEhSSUZULTM0ODhdIC0gd2FybmluZzogdW51c2VkIHZhcmlhYmxlICdwcm9ncmFtJworICAgICogW1RIUklGVC0zNDg5XSAtIHdhcm5pbmc6IGRlcHJlY2F0ZWQgY29udmVyc2lvbiBmcm9tIHN0cmluZyBjb25zdGFudCB0byAnY2hhcionIFstV3dyaXRlLXN0cmluZ3NdCisgICAgKiBbVEhSSUZULTM0ODddIC0gRnVsbCBzdXBwb3J0IGZvciBuZXdlciBEZWxwaGkgdmVyc2lvbnMKKyAgICAqIFtUSFJJRlQtMzUyOF0gLSBGaXggd2FybmluZ3MgaW4gdGhyaWZ0LmxsCisgICAgKiBbVEhSSUZULTM1MjddIC0gLWdlbiBweTpkeW5hbWljLHV0ZjhzdHJpbmdzIGlnbm9yZXMgdXRmOHN0cmluZ3Mgb3B0aW9uCisgICAgKiBbVEhSSUZULTM1MjZdIC0gQ29kZSBnZW5lcmF0ZWQgYnkgcHk6dXRmOHN0cmluZ3MgZG9lcyBub3Qgd29yayBmb3IgUHl0aG9uMworICAgICogW1RIUklGVC0zNTI0XSAtIGRjYzMyIHdhcm5pbmcgIlcxMDAwIFN5bWJvbCAnSXNMb3dTdXJyb2dhdGUnIGlzIGRlcHJlY2F0ZWQ6ICdVc2UgVENoYXJIZWxwZXInIiBpbiBUaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMKKyAgICAqIFtUSFJJRlQtMzUyNV0gLSBweTpkeW5hbWljIGZhaWxzIHRvIGhhbmRsZSBiaW5hcnkgbGlzdC9zZXQvbWFwIGVsZW1lbnQKKyAgICAqIFtUSFJJRlQtMzUyMV0gLSBUU2ltcGxlSlNPTlByb3RvY29sVGVzdCBpcyBub3QgZGV0ZXJtaW5pc3RpYyAoZmFpbHMgd2hlbiBydW4gb24gSkRLIDgpCisgICAgKiBbVEhSSUZULTM1MjBdIC0gRGFydCBUU29ja2V0IG9uRXJyb3Igc3RyZWFtIHNob3VsZCBiZSB0eXBlZCBhcyBPYmplY3QKKyAgICAqIFtUSFJJRlQtMzUxOV0gLSBmYXN0YmluYXJ5IGRvZXMgbm90IHdvcmsgd2l0aCAtZ2VuIHB5OnV0ZjhzdHJpbmdzCisgICAgKiBbVEhSSUZULTM1MThdIC0gVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyBmaWxlcyB3ZXJlIG1pc3NpbmcgZm9yIFZpc3VhbCBTdHVkaW8KKyAgICAqIFtUSFJJRlQtMzUxMl0gLSBjX2dsaWI6IEJ1aWxkIGZhaWxzIGR1ZSB0byBtaXNzaW5nIGZlYXR1cmVzLmgKKyAgICAqIFtUSFJJRlQtMzQ4M10gLSBJbmNvcnJlY3QgZW1wdHkgYmluYXJ5IGhhbmRsaW5nIGludHJvZHVjZWQgYnkgVEhSSUZULTMzNTkKKyAgICAqIFtUSFJJRlQtMzQ3OV0gLSBPbmV3YXkgY2FsbHMgc2hvdWxkIG5vdCByZXR1cm4gZXhjZXB0aW9ucyB0byBjbGllbnRzCisgICAgKiBbVEhSSUZULTM0NzhdIC0gUmVzdG9yZSBkcm9wcGVkIG1ldGhvZCB0byBUSHNIYVNlcnZlci5qYXZhCisgICAgKiBbVEhSSUZULTM0NzddIC0gUGFyc2VyIGZhaWxzIG9uIGVudW0gaXRlbSB0aGF0IHN0YXJ0cyB3aXRoICdFJyBsZXR0ZXIgYW5kIGNvbnRpbnVlcyB3aXRoIG51bWJlciAKKyAgICAqIFtUSFJJRlQtMzQ3Nl0gLSBNaXNzaW5nIGluY2x1ZGUgaW4gLi9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwCisgICAgKiBbVEhSSUZULTM0NzRdIC0gRG9ja2VyOiB0aHJpZnQtY29tcGlsZXIKKyAgICAqIFtUSFJJRlQtMzQ3M10gLSBXaGVuICJvcHRpb25hbCcgaXMgdXNlZCB3aXRoIGEgc3RydWN0IG1lbWJlciwgQysrIHNlcnZlciBzZWVtcyB0byBub3QgcmV0dXJuIGl0IGNvcnJlY3RseQorICAgICogW1RIUklGVC0zNDY4XSAtIERhcnQgVFNvY2tldFRyYW5zcG9ydCBvbkVycm9yIGhhbmRsZXIgaXMgdG9vIHJlc3RyaWN0aXZlCisgICAgKiBbVEhSSUZULTM0NTFdIC0gdGhyaWZ0X3Byb3RvY29sIFBIUCBleHRlbnNpb24gbWlzc2luZyBjb25maWcubTQgZmlsZQorICAgICogW1RIUklGVC0zNDU2XSAtIHJvdW5kaW5nIGlzc3VlIGluIHN0YXRpYyBhc3NlcnQKKyAgICAqIFtUSFJJRlQtMzQ1NV0gLSBzdHJ1Y3Qgd3JpdGUgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIGlzIGluY29ycmVjdAorICAgICogW1RIUklGVC0zNDU0XSAtIFB5dGhvbiBUb3JuYWRvIHR1dG9yaWFsIGlzIGJyb2tlbgorICAgICogW1RIUklGVC0zNDYzXSAtIEphdmEgY2FuJ3QgYmUgZGlzYWJsZWQgaW4gQ01ha2UgYnVpbGQKKyAgICAqIFtUSFJJRlQtMzQ1MF0gLSBOUEUgd2hlbiB1c2luZyBTU0wKKyAgICAqIFtUSFJJRlQtMzQ0OV0gLSBUQmFzZUFzeW5jUHJvY2Vzc29yIGZiLnJlc3BvbnNlUmVhZHkoKSBuZXZlciBjYWxsZWQgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgICAqIFtUSFJJRlQtMzQ3MV0gLSBEYXJ0IGdlbmVyYXRvciBkb2VzIG5vdCBoYW5kbGUgdXBwZXJjYXNlIGFyZ3VtZW50IG5hbWVzCisgICAgKiBbVEhSSUZULTM0NzBdIC0gU3BvcmFkaWMgdGltZW91dHMgd2l0aCBwaXBlcworICAgICogW1RIUklGVC0zNDY1XSAtIEdvIENvZGUgV2l0aCBDb21wbGV4IENvbnN0IEluaXRpYWxpemVyIENvbXBpbGF0aW9uIERlcGVuZHMgT24gU3RydWN0IE9yZGVyCisgICAgKiBbVEhSSUZULTM0NjRdIC0gRml4IHNldmVyYWwgZGVmZWN0cyBpbiBjX2dsaWIgY29kZSBnZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtMzQ2Ml0gLSBDb2NvYSBnZW5lcmF0ZXMgSW5jb3JyZWN0ICNpbXBvcnQgaGVhZGVyIG5hbWVzCisgICAgKiBbVEhSSUZULTM0NTNdIC0gcmVtb3ZlIHJhdF9leGNsdWRlCisgICAgKiBbVEhSSUZULTM0MThdIC0gVXNlIG9mIGNpcGhlcnMgaW4gc3NsLndyYXBfc29ja2V0KCkgYnJlYWtzIHB5dGhvbiAyLjYgY29tcGF0aWJpbGl0eQorICAgICogW1RIUklGVC0zNDE3XSAtICJuYW1lc3BhY2UgeHNkIiBpcyBub3QgcmVhbGx5IHdvcmtpbmcKKyAgICAqIFtUSFJJRlQtMzQxM10gLSBUaHJpZnQgY29kZSBnZW5lcmF0aW9uIGJ1ZyBpbiBHbyB3aGVuIGV4dGVuZGluZyBzZXJ2aWNlCisgICAgKiBbVEhSSUZULTM0MjBdIC0gQysrOiBUU1NMU29ja2V0cyBhcmUgbm90IGludGVycnVwdGFibGUKKyAgICAqIFtUSFJJRlQtMzQxNV0gLSBpbmNsdWRlIHVuaXN0ZC5oIGNvbmRpdGlvbmFsbHkKKyAgICAqIFtUSFJJRlQtMzQxNF0gLSAjaW5jbHVkZSA8cHdkLmg+IGluIFRIZWFkZXJUcmFuc3BvcnQuaCBicmVha3Mgd2luZG93cyBidWlsZAorICAgICogW1RIUklGVC0zNDExXSAtIEdvIGdlbmVyYXRlcyByZW1vdGVzIHdpdGggd3JvbmcgcGFja2FnZSBxdWFsaWZpZXJzIHdoZW4gaW5jbHVkaW5nCisgICAgKiBbVEhSSUZULTM0MzBdIC0gR28gVEh0dHBDbGllbnQgZG9lcyBub3QgcmVhZCBIVFRQIHJlc3BvbnNlIGJvZHkgdG8gY29tcGxldGlvbiB3aGVuIGNsb3NpbmcKKyAgICAqIFtUSFJJRlQtMzQyM10gLSBGaXJzdCBjYWxsIHRvIHRocmlmdF90cmFuc3BvcnQ6cmVhZF9leGFjdCBmYWlscyB0byBkaXNwYXRjaCBjb3JyZWN0IGZ1bmN0aW9uCisgICAgKiBbVEhSSUZULTM0MjJdIC0gR28gVFNlcnZlclNvY2tldCBkb2Vzbid0IGNsb3NlIG9uIEludGVycnVwdAorICAgICogW1RIUklGVC0zNDIxXSAtIHJlYmFyIGFzIGRlcGVuZGVuY3kgaW5zdGVhZCBvZiBidW5kbGluZyAod2FzOiAgcmViYXIgZmFpbHMgaWYgUFdEIGNvbnRhaW5zIFVuaWNvZGUpCisgICAgKiBbVEhSSUZULTM0MjhdIC0gR28gdGVzdCBmYWlscyB3aGVuIHJ1bm5pbmcgbWFrZSBjaGVjaworICAgICogW1RIUklGVC0zNDQ1XSAtIFRocm93YWJsZSBtZXNzYWdlcyBhcmUgaGlkZGVuIGZyb20gSlZNIHN0YWNrIHRyYWNlIG91dHB1dAorICAgICogW1RIUklGVC0zNDQzXSAtIFRocmlmdCBpbmNsdWRlIGNhbiBnZW5lcmF0ZSB1bmNvbXBpbGFibGUgY29kZQorICAgICogW1RIUklGVC0zNDQ0XSAtIExhcmdlIDY0IGJpdCBJbnRlZ2VyIGRvZXMgbm90IHByZXNlcnZlIHZhbHVlIHRocm91Z2ggTm9kZS5qcyBKU09OUHJvdG9jb2wgCisgICAgKiBbVEhSSUZULTM0MzZdIC0gbWlzYy4gY3Jvc3MgdGVzdCBpc3N1ZXMgd2l0aCBVVEYtOCBwYXRoIG5hbWVzCisgICAgKiBbVEhSSUZULTM0MzVdIC0gUHV0IGdlbmVyYXRlZCBKYXZhIGNvZGUgZm9yIGZ1bGxjYW1lbCB0ZXN0cyBpbiBhIHNlcGFyYXRlIHBhY2thZ2UvbmFtZXNwYWNlCisgICAgKiBbVEhSSUZULTM0MzNdIC0gRG91YmxlcyBhcmVuJ3QgaW50ZXJwcmV0ZWQgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTM0MzddIC0gTWluZ3ctdzY0IGJ1aWxkIGZhaWwKKyAgICAqIFtUSFJJRlQtMzQzNF0gLSBEYXJ0IGdlbmVyYXRvciBwcm9kdWNlcyBlbXB0eSBuYW1lIGluIHB1YnNwZWMueWFtbCBmb3IgaW5jbHVkZXMgd2l0aG91dCBuYW1lc3BhY2VzCisgICAgKiBbVEhSSUZULTM0MDhdIC0gSlNPTiBnZW5lcmF0b3IgZW1pdHMgaW5jb3JyZWN0IHR5cGVzCisgICAgKiBbVEhSSUZULTM0MDZdIC0gQ29jb2EgY2xpZW50IHNob3VsZCBub3Qgc2NoZWR1bGUgc3RyZWFtcyBvbiBtYWluIHJ1bmxvb3AKKyAgICAqIFtUSFJJRlQtMzQwNF0gLSBKU09OIFN0cmluZyByZWFkZXIgZG9lc24ndCByZWNvZ25pemUgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlyCisgICAgKiBbVEhSSUZULTM2MzZdIC0gRG91YmxlIHByZWNpc2lvbiBpcyBub3QgZnVsbHkgcHJlc2VydmVkIGluIEMrKyBUSlNPTlByb3RvY29sCisgICAgKiBbVEhSSUZULTM2MzJdIC0gY19nbGliIHRlc3RzZXJpYWxpemF0aW9uIGZhaWxzIHdpdGggZ2xpYiBhc3NlcnRpb24KKyAgICAqIFtUSFJJRlQtMzYxOV0gLSBVc2luZyBUaHJpZnQgMC45LjMgd2l0aCBnb29nbGV0ZXN0IG9uIExpbnV4IGdjYyA0LjkgLyBDKysxMQorICAgICogW1RIUklGVC0zNjE3XSAtIENNYWtlIGRvZXMgbm90IGJ1aWxkIGd2L3htbCBnZW5lcmF0b3JzCisgICAgKiBbVEhSSUZULTM2MTVdIC0gRml4IFB5dGhvbiBTU0wgY2xpZW50IHJlc291cmNlIGxlYWsgb24gY29ubmVjdGlvbiBmYWlsdXJlCisgICAgKiBbVEhSSUZULTM2MTZdIC0gbGliL3B5L3Rlc3QvdGVzdF9zc2xzb2NrZXQucHkgaXMgZmxha3kKKyAgICAqIFtUSFJJRlQtMzY0M10gLSBQZXJsIFNTTCBzZXJ2ZXIgY3J1c2hlcyBpZiBhIGNsaWVudCBkaXNjb25uZWN0IHdpdGhvdXQgaGFuZHNoYWtlCisgICAgKiBbVEhSSUZULTM2MzldIC0gQyMgVGhyaWZ0IGxpYnJhcnkgZm9yY2VzIFRMUyAxLjAsIHRod2FydGluZyBUTFMgMS4yIHVzYWdlCisgICAgKiBbVEhSSUZULTM2MzNdIC0gVHJhdmlzICJDIEMrKyAtIEdDQyIgYnVpbGQgd2FzIHVzaW5nIGNsYW5nCisgICAgKiBbVEhSSUZULTM2MzRdIC0gRml4IFB5dGhvbiBUU29ja2V0IHJlc291cmNlIGxlYWsgb24gY29ubmVjdGlvbiBmYWlsdXJlCisgICAgKiBbVEhSSUZULTM2MzBdIC0gRGViaWFuL1VidW50dSBpbnN0YWxsIGRvY3MgbmVlZCBhbiB1cGRhdGUKKyAgICAqIFtUSFJJRlQtMzYyOV0gLSBQYXJzZXIgc2V0cyBleGl0Y29kZSBvbiBlcnJvcnMsIGJ1dCBnZW5lcmF0b3IgZG9lcyBub3QKKyAgICAqIFtUSFJJRlQtMzYwOF0gLSBsaWIvY3BwL3Rlc3QvU2VjdXJpdHlUZXN0IGlzIGZsYWt5IGluIGplbmtpbnMgVGhyaWZ0LXByZWNvbW1pdCBidWlsZC4KKyAgICAqIFtUSFJJRlQtMzYwMV0gLSBCZXR0ZXIgY29uZm9ybWFuY2UgdG8gUEVQOCBmb3IgZ2VuZXJhdGVkIGNvZGUKKyAgICAqIFtUSFJJRlQtMzU5OV0gLSBWYWxpZGF0ZSBjbGllbnQgSVAgYWRkcmVzcyBhZ2FpbnN0IGNlcnQncyBTdWJqZWN0QWx0TmFtZQorICAgICogW1RIUklGVC0zNTk4XSAtIFRCdWZmZXJlZFRyYW5zcG9ydCBkb2Vzbid0IGluc3RhbnRpYXRlIGNsaWVudCBjb25uZWN0aW9uCisgICAgKiBbVEhSSUZULTM1OTddIC0gYG1ha2UgY2hlY2tgIGhhbmdzIGluIGdvIHRlc3RzCisgICAgKiBbVEhSSUZULTM1ODldIC0gRGFydCBnZW5lcmF0b3IgdXNlcyB3cm9uZyBuYW1lIGluIGNvbnN0cnVjdG9yIGZvciB1cHBlcmNhc2UgYXJndW1lbnRzIHdpdGggZGVmYXVsdHMKKyAgICAqIFtUSFJJRlQtMzU4OF0gLSBVc2luZyBUeXBlU2NyaXB0IHdpdGggLS1ub0ltcGxpY2l0QW55IGZhaWxzCisgICAgKiBbVEhSSUZULTM1ODRdIC0gYm9vbGVhbiBmYWxzZSB2YWx1ZSBjYW5ub3QgYmUgdHJhbnNmZXJyZWQKKyAgICAqIFtUSFJJRlQtMzU3OF0gLSBNYWtlIFRIZWFkZXJUcmFuc3BvcnQgZGV0ZWN0IFRDb21wYWN0IGZyYW1lZCBhbmQgdW5mcmFtZWQKKyAgICAqIFtUSFJJRlQtMzMyM10gLSBQeXRob24gbGlicmFyeSBkb2VzIG5vdCBoYW5kbGUgZXNjYXBlZCBmb3J3YXJkIHNsYXNoICgiLyIpIGluIEpTT04KKyAgICAqIFtUSFJJRlQtMzMyMl0gLSBDTWFrZSBnZW5lcmF0ZWQgIm1ha2UgY2hlY2siIGZhaWxlcyBvbiBweXRob25fdGVzdAorICAgICogW1RIUklGVC0zMzIxXSAtIFRocmlmdCBjYW4ndCBiZSBhZGRlZCBhcyBhIHN1YmRpcmVjdG9yeSBvZiBhbm90aGVyIENNYWtlLWJhc2VkIHByb2plY3QKKyAgICAqIFtUSFJJRlQtMzMxNF0gLSBEb3RzIGluIGZpbGUgbmFtZXMgb2YgaW5jbHVkZXMgY2F1c2VzIGRvdHMgaW4gamF2YXNjcmlwdCB2YXJpYWJsZSBuYW1lcworICAgICogW1RIUklGVC0zMzA3XSAtIFNlZ2ZhdWx0IGluIFJ1Ynkgc2VyaWFsaXplcgorICAgICogW1RIUklGVC0zMzA5XSAtIE1pc3NpbmcgVENvbnN0YW50LnBocCBpbiAvbGliL3BocC9NYWtlZmlsZS5hbQorICAgICogW1RIUklGVC0zODEwXSAtIHVucmVzb2x2ZWQgZXh0ZXJuYWwgc3ltYm9sIHB1YmxpYzogdmlydHVhbCB2b2lkIF9fY2RlY2wgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlckZyYW1ld29yazo6c2VydmUodm9pZCkKKyAgICAqIFtUSFJJRlQtMzczNl0gLSBDKysgbGlicmFyeSBidWlsZCBmYWlscyBpZiBPcGVuU1NMIGRvZXMgbm90IHN1cnJwb3QgU1NMdjMKKyAgICAqIFtUSFJJRlQtMzg3OF0gLSBDb21waWxlIGVycm9yIGluIFRTU0xTb2NrZXQuY3BwIHdpdGggbmV3IE9wZW5TU0wgW0NSWVBUT19udW1fbG9ja3NdCisgICAgKiBbVEhSSUZULTM5NDldIC0gbWlzc2luZyBtYWtlIGRpc3QgZW50cnkgZm9yIGNvbXBpbGVyL2NwcC90ZXN0CisgICAgKiBbVEhSSUZULTQ0OV0gLSBUaGUgd2lyZSBmb3JtYXQgb2YgdGhlIEpTT04gUHJvdG9jb2wgbWF5IG5vdCBhbHdheXMgYmUgdmFsaWQgSlNPTiBpZiBpdCBjb250YWlucyBub24tVVRGOCBlbmNvZGVkIHN0cmluZ3MKKyAgICAqIFtUSFJJRlQtMTYyXSAtIFRocmlmdCBzdHJ1Y3R1cmVzIGFyZSB1bmhhc2hhYmxlLCBwcmV2ZW50aW5nIHRoZW0gZnJvbSBiZWluZyB1c2VkIGFzIHNldCBlbGVtZW50cworICAgICogW1RIUklGVC0zOTYxXSAtIFRDb25uZWN0ZWRDbGllbnQgZG9lcyBub3QgdGVybWluYXRlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQgaWYgYW4gZXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcgdGhlIHJlY2VpdmVkIG1lc3NhZ2Ugb2NjdXJlcy4KKyAgICAqIFtUSFJJRlQtMzg4MV0gLSBUcmF2aXMgQ0kgYnVpbGRzIGFyZSBmYWlsaW5nIGR1ZSB0byBkb2NrZXIgZmFpbHVyZXMgKHRocmVlIHJldHJpZXMsIGFuZCBnaXZlcyB1cCkKKyAgICAqIFtUSFJJRlQtMzkzN10gLSBDYW5ub3QgY29tcGlsZSAwLjEwLjAgZGV2ZWxvcG1lbnQgdGlwIHdpdGggZ2NjLTQuNi54CisgICAgKiBbVEhSSUZULTM5NjRdIC0gVW5zdXBwb3J0ZWQgbWVjaGFuaXNtIHR5cGUgPz8/Pz8gZHVlIHRvIGRlcGVuZGVuY3kgb24gZGVmYXVsdCBPUy1kZXBlbmRlbnQgY2hhcnNldAorICAgICogW1RIUklGVC0zMDM4XSAtIFVzZSBvZiB2b2xhdGlsZSBpbiBjcHAgbGlicmFyeQorICAgICogW1RIUklGVC0zMzAxXSAtIEphdmEgZ2VuZXJhdGVkIGNvZGUgdXNlcyBpbXBvcnRzIHRoYXQgY2FuIGxlYWQgdG8gY2xhc3MgbmFtZSBjb2xsaXNpb25zIHdpdGggSURMIGRlZmluZWQgdHlwZXMKKyAgICAqIFtUSFJJRlQtMzM0OF0gLSBQSFAgVENvbXBhY3RQcm90b2NvbCBib29sJmludDY0IHJlYWR2YWx1ZSBidWcKKyAgICAqIFtUSFJJRlQtMzk1NV0gLSBUVGhyZWFkZWRTZXJ2ZXIgTWVtb3J5IExlYWsKKyAgICAqIFtUSFJJRlQtMzgyOV0gLSBUaHJpZnQgZG9lcyBub3QgaW5zdGFsbCBQeXRob24gTGlicmFyaWVzIGlmIFR3aXN0ZWQgaXMgbm90IGluc3RhbGxlZAorICAgICogW1RIUklGVC0zOTMyXSAtIEMrKyBUaHJlYWRNYW5hZ2VyIGhhcyBhIHJhcmUgdGVybWluYXRpb24gcmFjZQorICAgICogW1RIUklGVC0zODI4XSAtIGNtYWtlIGZhaWxzIHdoZW4gQm9vc3RfSU5DTFVERV9ESVJTIChhbmQgb3RoZXIgdmFyaWFibGVzIHBhc3NlZCB0byBpbmNsdWRlX2RpcmVjdG9yaWVzKCkpIGlzIGVtcHR5IAorICAgICogW1RIUklGVC0zOTU4XSAtIENNYWtlIFdJVEhfTVQgb3B0aW9uIGZvciB3aW5kb3dzIHN0YXRpYyBydW50aW1lIGxpbmtpbmcgZG9lcyBub3Qgc3VwcG9ydCB0aGUgY21ha2UgYnVpbGQgdHlwZSBSZWxXaXRoRGViSW5mbworICAgICogW1RIUklGVC0zOTU3XSAtIFRDb25uZWN0ZWRDbGllbnQgZG9lcyBub3QgZGlzY29ubmVjdCBmcm9tIGNsaWVudHMgd2hlbiB0aGVpciB0aW1lb3V0IGlzIHJlYWNoZWQuCisgICAgKiBbVEhSSUZULTM5NTNdIC0gVFNTTFNvY2tldDo6Y2xvc2Ugc2hvdWxkIGhhbmRsZSBleGNlcHRpb25zIGZyb20gd2FpdEZvckV2ZW50IGJlY2F1c2UgaXQgaXMgY2FsbGVkIGJ5IHRoZSBkZXN0cnVjdG9yLgorICAgICogW1RIUklGVC0zOTc3XSAtIFBIUCBleHRlbnNpb24gY3JlYXRlcyB1bmRlZmluZWQgdmFsdWVzIHdoZW4gZGVzZXJpYWxpemluZyBzZXRzCisgICAgKiBbVEhSSUZULTM5NDddIC0gc29ja2FkZHIgdHlwZSBpc24ndCBhbHdheXMgbGFyZ2UgZW5vdWdoIGZvciB0aGUgcmV0dXJuIG9mIGdldHNvY2tuYW1lCisgICAgKiBbVEhSSUZULTI3NTVdIC0gVGhyZWFkU2FuaXRpemVyIHJlcG9ydHMgZGF0YSByYWNlIGluIFRocmVhZE1hbmFnZXI6OkltcGw6OmFkZFdvcmtlcgorICAgICogW1RIUklGVC0zOTQ4XSAtIGVycm5vIGlzIG5vdCB0aGUgY29ycmVjdCBtZXRob2Qgb2YgZ2V0dGluZyB0aGUgZXJyb3IgaW4gd2luZG93cworICAgICogW1RIUklGVC00MDA4XSAtIGJyb2tlbiBjaSBkdWUgdG8gdXBzdHJlYW0gZGVwZW5kZW5jeSB2ZXJzaW9uaW5nIGJyZWFrCisgICAgKiBbVEhSSUZULTM5OTldIC0gRml4IERlYmlhbiAmIFVidW50dSBwYWNrYWdlIGRlcGVuZGVuY2llcworICAgICogW1RIUklGVC0zODg2XSAtIFBIUCBjcm9zcyB0ZXN0IGNsaWVudCByZXR1cm5zIDAgZXZlbiB3aGVuIGZhaWxpbmcKKyAgICAqIFtUSFJJRlQtMzk5N10gLSBidWlsZGluZyB0aHJpZnQgbGlicyBkb2VzIG5vdCBzdXBwb3J0IG5ldyBvcGVuc3NsCisKKyMjIERvY3VtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMzg2N10gLSBTcGVjaWZ5IEJpbmFyeVByb3RvY29sIGFuZCBDb21wYWN0UHJvdG9jb2wKKworIyMgRXBpYworICAgICogW1RIUklGVC0zMDQ5XSAtIEFzIGFuIGlPUyBkZXZlbG9wZXIsIEkgd2FudCBhIGdlbmVyYXRvciBhbmQgbGlicmFyeSB0aGF0IHByb2R1Y2VzIFN3aWZ0IGNvZGUKKyAgICAqIFtUSFJJRlQtMjMzNl0gLSBVVEYtOCBzZW50IGJ5IFBIUCBhcyBKU09OIGlzIG5vdCB1bmRlcnN0b29kIGJ5IFRKc29uUHJvdG9jb2wKKworIyMgSW1wcm92ZW1lbnQKKyAgICAqIFtUSFJJRlQtMTg2N10gLSBQeXRob24gY2xpZW50L3NlcnZlciBzaG91bGQgc3VwcG9ydCBjbGllbnQtc2lkZSBjZXJ0aWZpY2F0ZXMuCisgICAgKiBbVEhSSUZULTEzMTNdIC0gY19nbGliIGNvbXBhY3Qgc3VwcG9ydAorICAgICogW1RIUklGVC0xMzg1XSAtIG1ha2UgaW5zdGFsbCBkb2Vzbid0IGluc3RhbGwgamF2YSBsaWJyYXJ5IGluIHRoZSBzZXR0ZWQgZm9sZGVyCisgICAgKiBbVEhSSUZULTE0MzddIC0gVXBkYXRlIFJQTSBzcGVjCisgICAgKiBbVEhSSUZULTg0N10gLSBUZXN0IEZyYW1ld29yayBoYXJtb25pemF0aW9uIGFjcm9zcyBhbGwgbGFuZ3VhZ2VzCisgICAgKiBbVEhSSUZULTgxOV0gLSBhZGQgRW51bWVyYXRpb24gZm9yIHByb3RvY29sLCB0cmFuc3BvcnQgYW5kIHNlcnZlciB0eXBlcworICAgICogW1RIUklGVC0zOTI3XSAtIEVtaXQgYW4gZXJyb3IgaW5zdGVhZCBvZiB0aHJvdyBhbiBlcnJvciBpbiB0aGUgYXN5bmMgY2FsbGJhY2sKKyAgICAqIFtUSFJJRlQtMzkzMV0gLSBUU2ltcGxlU2VydmVyOiBJZiBwcm9jZXNzIHJlcXVlc3QgZW5jb3VudGVyIFVOS05PV05fTUVUSE9ELCBkb24ndCBjbG9zZSB0cmFuc3BvcnQuCisgICAgKiBbVEhSSUZULTM5MzRdIC0gQXV0b21hdGljYWxseSByZXNvbHZlIE9wZW5TU0wgYmluYXJ5IHZlcnNpb24gb24gV2luZG93cyBDSQorICAgICogW1RIUklGVC0zOTE4XSAtIFJ1biBzdWJzZXQgb2YgbWFrZSBjcm9zcworICAgICogW1RIUklGVC0zOTA4XSAtIFJlbW92ZSByZWR1bmRhbnQgZGVwZW5kZW5jaWVzIGZyb20gRG9ja2VyZmlsZQorICAgICogW1RIUklGVC0zOTA3XSAtIFNraXAgRG9ja2VyIGltYWdlIGJ1aWxkIG9uIENJIHdoZW4gdW5jaGFuZ2VkCisgICAgKiBbVEhSSUZULTM4NjhdIC0gSmF2YSBzdHJ1Y3QgZXF1YWxzIHNob3VsZCBkbyBpZGVudGl0eSBjaGVjayBiZWZvcmUgZmllbGQgY29tcGFyaXNvbgorICAgICogW1RIUklGVC0zODQ5XSAtIFBvcnQgR28gc2VyaWFsaXplciBhbmQgZGVzZXJpYWxpemVyIHRvIGRhcnQKKyAgICAqIFtUSFJJRlQtMjk4OV0gLSBDb21wbGV0ZSBDTWFrZSBidWlsZCBmb3IgQXBhY2hlIFRocmlmdAorICAgICogW1RIUklGVC0yOTgwXSAtIFRocmlmdE1lbW9yeUJ1ZmZlciBkb2Vzbid0IGhhdmUgYSBjb25zdHJ1Y3RvciBvcHRpb24gdG8gdGFrZSBhbiBleGlzdGluZyBidWZmZXIKKyAgICAqIFtUSFJJRlQtMjg1Nl0gLSByZWZhY3RvciBlcmxhbmcgYmFzaWMgdHJhbnNwb3J0cyBhbmQgdW5pZnkgaW50ZXJmYWNlcworICAgICogW1RIUklGVC0yODc3XSAtIE9wdGltaXplIGdlbmVyYXRlZCBoYXNoQ29kZQorICAgICogW1RIUklGVC0yODY5XSAtIEpTT046IHJ1biBzY2hlbWEgdmFsaWRhdGlvbiBmcm9tIHRlc3RzCisgICAgKiBbVEhSSUZULTMxMTJdIC0gW0phdmFdIEFzeW5jTWV0aG9kQ2FsbGJhY2sgc2hvdWxkIGJlIHR5cGVkIGluIGdlbmVyYXRlZCBBc3luY0lmYWNlCisgICAgKiBbVEhSSUZULTMyNjNdIC0gUEhQIGpzb25TZXJpYWxpemUoKSBzaG91bGQgY2FzdCBzY2FsYXIgdHlwZXMKKyAgICAqIFtUSFJJRlQtMjkwNV0gLSBDb2NvYSBjb21waWxlciBzaG91bGQgaGF2ZSBvcHRpb24gdG8gcHJvZHVjZSAibW9kZXJuIiBPYmplY3RpdmUtQworICAgICogW1RIUklGVC0yODIxXSAtIEVuYWJsZSB0aGUgdXNlIG9mIGN1c3RvbSBIVFRQLUhlYWRlciBpbiB0aGUgVHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTIwOTNdIC0gYWRkZWQgdGhlIGFiaWxpdHkgdG8gc2V0IGNvbXByZXNzaW9uIGxldmVsIGluIEMrKyB6bGliIHRyYW5zcG9ydAorICAgICogW1RIUklGVC0yMDg5XSAtIENvbXBpbGVyIGlnbm9yZXMgZHVwbGljYXRlIHR5cGVuYW1lcworICAgICogW1RIUklGVC0yMDU2XSAtIE1vdmVkIGFsbCAjaW5jbHVkZSBjb25maWcuaCBzdGF0ZW1lbnRzIHRvICNpbmNsdWRlIDx0aHJpZnQvY29uZmlnLmg+CisgICAgKiBbVEhSSUZULTIwMzFdIC0gTWFrZSBTT19LRUVQQUxJVkUgY29uZmlndXJhYmxlIGZvciBDKysgbGliCisgICAgKiBbVEhSSUZULTIwMjFdIC0gSW1wcm92ZSBsYXJnZSBiaW5hcnkgcHJvdG9jb2wgc3RyaW5nIHBlcmZvcm1hbmNlCisgICAgKiBbVEhSSUZULTIwMjhdIC0gQ2xlYW51cCB0aHJlYWRpbmcgaGVhZGVycyAvIGxpYnJhcmllcworICAgICogW1RIUklGVC0yMDE0XSAtIENoYW5nZSBDKysgbGliIGluY2x1ZGVzIHRvIHVzZSA8bmFtZXNwYWNlLz4gc3R5bGUgdGhyb3VnaG91dAorICAgICogW1RIUklGVC0yMzEyXSAtIHRyYXZpcy55bWw6IGJ1aWxkIGV2ZXJ5dGhpbmcKKyAgICAqIFtUSFJJRlQtMTkxNV0gLSBNdWx0aXBsZXhpbmcgU2VydmljZXMKKyAgICAqIFtUSFJJRlQtMTczNl0gLSBWaXN1YWwgU3R1ZGlvIHRvcCBsZXZlbCBwcm9qZWN0IGZpbGVzIHdpdGhpbiBtc3ZjCisgICAgKiBbVEhSSUZULTE3MzVdIC0gaW50ZWdyYXRlIHR1dG9yaWFsIGludG8gcmVndWxhciBidWlsZAorICAgICogW1RIUklGVC0xNTMzXSAtIE1ha2UgVFRyYW5zcG9ydCBzaG91bGQgYmUgQ2xvc2VhYmxlCisgICAgKiBbVEhSSUZULTM1XSAtIE1vdmUgbGFuZ3VhZ2UgdGVzdHMgaW50byB0aGVpciBhcHByb3ByaWF0ZSBsaWJyYXJ5IGRpcmVjdG9yeQorICAgICogW1RIUklGVC0xMDc5XSAtIFN1cHBvcnQgaTY0IGluIEFTMworICAgICogW1RIUklGVC0xMTA4XSAtIFNTTCBzdXBwb3J0IGZvciB0aGUgUnVieSBsaWJyYXJ5IAorICAgICogW1RIUklGVC0zODU2XSAtIHVwZGF0ZSBkZWJpYW4gcGFja2FnZSBkZWVwZW5kZW5jaWVzCisgICAgKiBbVEhSSUZULTM4MzNdIC0gaGF4ZSBodHRwIHNlcnZlciBpbXBsZW1lbnRhdGlvbiAoYnkgZW1iZWRpbmcgaW50byBwaHAgd2ViIHNlcnZlcikKKyAgICAqIFtUSFJJRlQtMzgzOV0gLSBQZXJmb3JtYW5jZSBpc3N1ZSB3aXRoIGJpZyBtZXNzYWdlIGRlc2VyaWFsaXphdGlvbiB1c2luZyBwaHAgZXh0ZW5zaW9uCisgICAgKiBbVEhSSUZULTM4MjBdIC0gRXJsYW5nOiBEZXRlY3QgT1RQID49IDE4IHRvIHVzZSBuZXcgdGltZSBjb3JyZWN0aW9uCisgICAgKiBbVEhSSUZULTM4MTZdIC0gUmVkdWNlIGRvY2tlciBidWlsZCBkdXJhdGlvbiBvbiBUcmF2aXMtQ0kKKyAgICAqIFtUSFJJRlQtMzgxNV0gLSBQdXQgYXBwdmV5b3IgZGVwZW5kZW5jeSB2ZXJzaW9ucyB0byBvbmUgcGxhY2UKKyAgICAqIFtUSFJJRlQtMzc4OF0gLSBDb21wYXRpYmlsaXR5IGltcHJvdmVtZW50cyBhbmQgV2luNjQgc3VwcG9ydAorICAgICogW1RIUklGVC0zNzkyXSAtIFRpbWVvdXRzIGZvciBhbm9ueW1vdXMgcGlwZXMgc2hvdWxkIGJlIGNvbmZpZ3VyYWJsZQorICAgICogW1RIUklGVC0zNzk0XSAtIFNwbGl0IERlbHBoaSBhcHBsaWNhdGlvbiwgcHJvdG9jb2wgYW5kIHRyYW5zcG9ydCBleGNlcHRpb24gc3VidHlwZXMgaW50byBzZXBhcmF0ZSBleGNlcHRpb25zCisgICAgKiBbVEhSSUZULTM3NzRdIC0gVGhlIGdlbmVyYXRlZCBjb2RlIHNob3VsZCBoYXZlIGV4Y2VwdGlvbl9uYW1lcyBtZXRhIGluZm8KKyAgICAqIFtUSFJJRlQtMzc2Ml0gLSBGaXggYnVpbGQgd2FybmluZ3MgZm9yIGRlcHJlY2F0ZWQgVGhyaWZ0ICJieXRlIiBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMzc1Nl0gLSBJbXByb3ZlIHJlcXVpcmVkbmVzcyBkb2N1bWVudGF0aW9uCisgICAgKiBbVEhSSUZULTM3NjFdIC0gQWRkIGRlYmlhbiBwYWNrYWdlIGZvciBQeXRob24zCisgICAgKiBbVEhSSUZULTM3NDJdIC0gaGF4ZSBwaHAgY2xpIHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMzczM10gLSBTb2NrZXQgdGltZW91dCBpbXByb3ZlbWVudHMKKyAgICAqIFtUSFJJRlQtMzcyOF0gLSBodHRwIHRyYW5zcG9ydCBmb3IgdGhyaWZ0LWx1YQorICAgICogW1RIUklGVC0zOTA1XSAtIERhcnQgY29tcGlsZXIgZG9lcyBub3QgaW5pdGlhbGl6ZSBib29sLCBpbnQsIGFuZCBkb3VibGUgcHJvcGVydGllcworICAgICogW1RIUklGVC0zOTExXSAtIExvb3NlbiBSdWJ5IGRldiBkZXBlbmRlbmN5IHZlcnNpb24gcmVxdWlyZW1lbnRzCisgICAgKiBbVEhSSUZULTM5MDZdIC0gUnVuIEMjIHRlc3RzIHdpdGggbWFrZSBjaGVjaworICAgICogW1RIUklGVC0zOTAwXSAtIEFkZCBQeXRob24gU1NMIGZsYWdzCisgICAgKiBbVEhSSUZULTM4OTddIC0gUHJvdmlkZSBtZWFuaW5nZnVsIGV4Y2VwdGlvbiB0eXBlIGJhc2VkIG9uIFdlYkV4Y2VwdGlvblN0YXR1cyBpbiBjYXNlIG9mIHRpbWVvdXQKKyAgICAqIFtUSFJJRlQtMzgwOF0gLSBNaXNzaW5nIGBET1VCTEVgIGluIHRocmlmdCB0eXBlIGVudW1lcmF0aW9uCisgICAgKiBbVEhSSUZULTM4MDNdIC0gUmVtb3ZlICJmaWxlIiBhdHRyaWJ1dGUgZnJvbSBYTUwgZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTM2NjBdIC0gQWRkIFY0IG1hcHBlZCBhZGRyZXNzIHRvIHRlc3QgY2xpZW50IGNlcnQncyBhbHRuYW1lCisgICAgKiBbVEhSSUZULTM2NjFdIC0gVXNlIGh0dHBzIHRvIGRvd25sb2FkIG1lY2sgaW4gZXJsYW5nIHRlc3QgYnVpbGQKKyAgICAqIFtUSFJJRlQtMzY1OV0gLSBDaGVjayBjb25maWd1cmUgcmVzdWx0IG9mIENNYWtlIG9uIENJCisgICAgKiBbVEhSSUZULTM2NjddIC0gQWRkIFRMUyBTTkkgc3VwcG9ydCB0byBjbGllbnRzCisgICAgKiBbVEhSSUZULTM2NTFdIC0gTWFrZSBiYWNrcG9ydHMubWF0Y2hfaG9zdG5hbWUgYW5kIGlwYWRkcmVzcyBvcHRpb25hbAorICAgICogW1RIUklGVC0zNjY2XSAtIEJ1aWxkIEQgdHV0b3JpYWwgYXMgcGFydCBvZiBBdXRvdG9vbHMgYnVpbGQKKyAgICAqIFtUSFJJRlQtMzY2NV0gLSBBZGQgRCBsaWJldmVudCBhbmQgT3BlblNTTCB0byBkb2NrZXIgaW1hZ2VzCisgICAgKiBbVEhSSUZULTM2NjRdIC0gUmVtb3ZlIG1kNS5jCisgICAgKiBbVEhSSUZULTM2NjJdIC0gQWRkIEhhc2tlbGwgdG8gZGViaWFuIGRvY2tlciBpbWFnZQorICAgICogW1RIUklGVC0zNzExXSAtIEFkZCBEIHRvIGNyb3NzIGxhbmd1YWdlIHRlc3QKKyAgICAqIFtUSFJJRlQtMzY5MV0gLSBSdW4gZmxha2U4IFB5dGhvbiBzdHlsZSBjaGVjayBvbiBUcmF2aXMtQ0kKKyAgICAqIFtUSFJJRlQtMzY5Ml0gLSAoUmUpZW5hYmxlIEFwcHZleW9yIEMrKyBhbmQgUHl0aG9uIGJ1aWxkCisgICAgKiBbVEhSSUZULTM2NzddIC0gSW1wcm92ZSBDTWFrZSBKYXZhIGJ1aWxkCisgICAgKiBbVEhSSUZULTM2NzldIC0gQWRkIHN0ZG91dCBsb2cgdG8gdGVzdEJpbmFyeSBpbiBKYXZhIHRlc3Qgc2VydmVyCisgICAgKiBbVEhSSUZULTM3MThdIC0gUmVkdWNlIHNpemUgb2YgZG9ja2VyIGltYWdlIGZvciBidWlsZCBlbnZpcm9ubWVudAorICAgICogW1RIUklGVC0zNjk4XSAtIFtUcmF2aXMtQ0ldIEludHJvZHVjZSByZXRyeSB0byBhcHQgY29tbWFuZHMKKyAgICAqIFtUSFJJRlQtMzEyN10gLSBzd2l0Y2ggLXJlY3Vyc2UgdG8gLS1yZWN1cnNlIGFuZCByZXNlcnZlIC1yCisgICAgKiBbVEhSSUZULTMwODddIC0gUGFzcyBvbiBlcnJvcnMgbGlrZSAiY29ubmVjdGlvbiBjbG9zZWQiCisgICAgKiBbVEhSSUZULTMyNDBdIC0gVGhyaWZ0IFB5dGhvbiBjbGllbnQgc2hvdWxkIHN1cHBvcnQgc3ViamVjdEFsdE5hbWUgYW5kIHdpbGRjYXJkIGNlcnRzIGluIFRTU0xTb2NrZXQKKyAgICAqIFtUSFJJRlQtMzIxM10gLSBtYWtlIGNyb3NzIHNob3VsZCBpbmRpY2F0ZSB3aGVuIGl0IHNraXBzIGEga25vd24gZmFpbGluZyB0ZXN0CisgICAgKiBbVEhSSUZULTMyMDhdIC0gRml4IFZpc3VhbCBTdHVkaW8gc29sdXRpb24gYnVpbGQgZmFpbHVyZSBkdWUgdG8gbWlzc2luZyBzb3VyY2UKKyAgICAqIFtUSFJJRlQtMzE4Nl0gLSBBZGQgVFNlcnZlckhUVFAgdG8gR28gbGlicmFyeQorICAgICogW1RIUklGVC0yMzQyXSAtIEFkZCBfX0ZJTEVfXyBhbmQgX19MSU5FX18gdG8gVGhyaWZ0IEMrKyBleGNwZXRpb25zCisgICAgKiBbVEhSSUZULTMzNzJdIC0gQWRkIGRhcnQgZ2VuZXJhdG9yIHRvIFZpc3VhbCBTdHVkaW8gcHJvamVjdAorICAgICogW1RIUklGVC0zMzY2XSAtIFRocmlmdFRlc3QgdG8gaW1wbGVtZW50IHN0YW5kYXJkIHJldHVybiB2YWx1ZXMgCisgICAgKiBbVEhSSUZULTM0MDJdIC0gUHJvdmlkZSBhIHBlcmwgVW5peCBTb2NrZXQgaW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMzM2MV0gLSBJbXByb3ZlIEMjIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzM5M10gLSBJbnRyb2R1Y2UgaTggdG8gcHJvdmlkZSBjb25zaXN0ZW50IHNldCBvZiBUaHJpZnQgSURMIGludGVnZXIgdHlwZXMKKyAgICAqIFtUSFJJRlQtMzMzOV0gLSBTdXBwb3J0IGZvciBkYXRhYmFzZS9zcWwKKyAgICAqIFtUSFJJRlQtMzU2NV0gLSBDKys6IFRbQXN5bmNdUHJvY2Vzc29yOjpnZXRFdmVudEhhbmRsZXIoKSBzaG91bGQgYmUgZGVjbGFyZWQgYXMgY29uc3QgbWVtYmVyIGZ1bmN0aW9ucworICAgICogW1RIUklGVC0zNTYzXSAtIEMrKy9RdDogcmVtb3ZlZCB1c2FnZSBvZiBtYWNybyBRVF9QUkVQRU5EX05BTUVTUEFDRSBhcyBpdCBpc24ndCBjb25zZXF1ZW50bHkgdXNlZCBmb3IgYWxsIHJlZmVyZW5jZXMgdG8gUXQgdHlwZXMuCisgICAgKiBbVEhSSUZULTM1NjJdIC0gUmVtb3ZlZCB1bnVzZWQgVEFzeW5jUHJvY2Vzc29yOjpnZXRBc3luY1NlcnZlcigpCisgICAgKiBbVEhSSUZULTM1NjFdIC0gQysrL1F0OiBtYWtlIHVzZSBvZiBRX0RJU0FCTEVfQ09QWSgpIHRvIGdldCByaWQgb2YgY29weSBjdG9yIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yCisgICAgKiBbVEhSSUZULTM1NTZdIC0gY19nbGliIGZpbGUgZGVzY3JpcHRvciB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMzU0NF0gLSBNYWtlIGNyb3NzIHRlc3QgZmFpbCB3aGVuIHNlcnZlciBwcm9jZXNzIGRpZWQgdW5leHBlY3RlZGx5CisgICAgKiBbVEhSSUZULTM1NDBdIC0gTWFrZSBweXRob24gdHV0b3JpYWwgbW9yZSBpbiBsaW5lIHdpdGggUEVQOAorICAgICogW1RIUklGVC0zNTM1XSAtIERhcnQgZ2VuZXJhdG9yIGFyZ3VtZW50IHRvIHByb2R1Y2UgYSBmaWxlIHN0cnVjdHVyZSB1c2FibGUgaW4gcGFyZW50IGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzUwNV0gLSBFbmhhbmNlIFB5dGhvbiBUU1NMU29ja2V0CisgICAgKiBbVEhSSUZULTM1MDZdIC0gRWxpbWluYXRlIG9sZCBzdHlsZSBjbGFzc2VzIGZyb20gbGlicmFyeSBjb2RlCisgICAgKiBbVEhSSUZULTM1MDNdIC0gRW5hYmxlIHB5OnV0ZjhzdHJpbmcgYnkgZGVmYXVsdAorICAgICogW1RIUklGVC0zNDk5XSAtIEFkZCBwYWNrYWdlX3ByZWZpeCB0byBweXRob24gZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTM0OTVdIC0gTWlub3IgZW5oYW5jZW1lbnRzIGFuZCBmaXhlcyBmb3IgY3Jvc3MgdGVzdAorICAgICogW1RIUklGVC0zNDg2XSAtIEphdmEgZ2VuZXJhdGVkIGBnZXRGaWVsZFZhbHVlYCBpcyBpbmNvbXBhdGlibGUgd2l0aCBgc2V0RmllbGRWYWx1ZWAgZm9yIGJpbmFyeSB2YWx1ZXMuCisgICAgKiBbVEhSSUZULTM0ODRdIC0gQ29uc29saWRhdGUgdGVtcG9yYXJ5IGJ1ZmZlcnMgaW4gSmF2YSdzIFRDb21wYWN0UHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMzUxNl0gLSBBZGQgZmVhdHVyZSB0ZXN0IGZvciBUSGVhZGVyIFRCaW5hcnlQcm90b2NvbCBpbnRlcm9wCisgICAgKiBbVEhSSUZULTM1MTVdIC0gUHl0aG9uIDIuNiBjb21wYXRpYmlsaXR5IGFuZCB0ZXN0IG9uIENJCisgICAgKiBbVEhSSUZULTM1MTRdIC0gUEhQIDcgY29tcGF0aWJsZSB2ZXJzaW9uIG9mIGJpbmFyeSBwcm90b2NvbAorICAgICogW1RIUklGVC0zNDY5XSAtIERvY2tlcjogRGViaWFuIHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMzQxNl0gLSBSZXRpcmUgb2xkICJ4eHhfbmFtZXNwYWNlIiBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgSURMCisgICAgKiBbVEhSSUZULTM0MjZdIC0gQWxpZ24gYXV0b2dlbiBjb21tZW50IGluIFhTRAorICAgICogW1RIUklGVC0zNDI0XSAtIEFkZCBDTWFrZSBhbmRyb2lkIGJ1aWxkIG9wdGlvbgorICAgICogW1RIUklGVC0zNDM5XSAtIFJ1biBtYWtlIGNyb3NzIHVzaW5nIFB5dGhvbjMgd2hlbiBhdmFpbGFibGUKKyAgICAqIFtUSFJJRlQtMzQ0MF0gLSBQeXRob24gbWFrZSBjaGVjayB0YWtlcyB0b28gbXVjaCB0aW1lCisgICAgKiBbVEhSSUZULTM0NDFdIC0gU3RhYmlsaXplIFRyYXZpcy1DSSBidWlsZHMKKyAgICAqIFtUSFJJRlQtMzQzMV0gLSBBdm9pZCAic2NoZW1lcyIgSGFzaE1hcCBsb29rdXBzIGR1cmluZyBzdHJ1Y3QgcmVhZHMvd3JpdGVzCisgICAgKiBbVEhSSUZULTM0MzJdIC0gQWRkIGEgVEJ5dGVCdWZmZXIgdHJhbnNwb3J0IHRvIHRoZSBKYXZhIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzQzOF0gLSBFbmFibGUgcHk6bmV3X3N0eWxlIGJ5IGRlZmF1bHQKKyAgICAqIFtUSFJJRlQtMzQwNV0gLSBHbyBUSHR0cENsaWVudCBtaXN1c2VzIGh0dHAuQ2xpZW50IG9iamVjdHMKKyAgICAqIFtUSFJJRlQtMzYxNF0gLSBJbXByb3ZlIGxvZ2dpbmcgb2YgdGVzdF9zc2xzb2NrZXQucHkKKyAgICAqIFtUSFJJRlQtMzY0N10gLSBGaXggcGhwIGV4dGVuc2lvbiBidWlsZCB3YXJuaW5ncworICAgICogW1RIUklGVC0zNjQyXSAtIFNwZWVkIHVwIGNyb3NzIHRlc3QgcnVubmVyCisgICAgKiBbVEhSSUZULTM2MzddIC0gSW1wbGVtZW50IGNvbXBhY3QgcHJvdG9jb2wgZm9yIGRhcnQKKyAgICAqIFtUSFJJRlQtMzYxM10gLSBQb3J0IFB5dGhvbiBDIGV4dGVuc2lvbiB0byBQeXRob24gMworICAgICogW1RIUklGVC0zNjEyXSAtIEFkZCBQeXRob24gQyBleHRlbnNpb24gZm9yIGNvbXBhY3QgcHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMzYxMV0gLSBBZGQgLS1yZWdleCBmaWx0ZXIgdG8gY3Jvc3MgdGVzdCBydW5uZXIKKyAgICAqIFtUSFJJRlQtMzYzMV0gLSBKU09OIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciBMdWEKKyAgICAqIFtUSFJJRlQtMzYwOV0gLSBSZW1vdmUgb3IgcmVwbGFjZSBUZXN0UG9ydEZpeHR1cmUuaAorICAgICogW1RIUklGVC0zNjA1XSAtIEhhdmUgdGhlIGNvbXBpbGVyIGNvbXBsYWluIGFib3V0IGludmFsaWQgYXJndW1lbnRzIGFuZCBvcHRpb25zCisgICAgKiBbVEhSSUZULTM1OTZdIC0gQmV0dGVyIGNvbmZvcm1hbmNlIHRvIFBFUDgKKyAgICAqIFtUSFJJRlQtMzU4NV0gLSBDb21wYWN0IHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciBMdWEKKyAgICAqIFtUSFJJRlQtMzU4Ml0gLSBFcmxhbmcgbGlicmFyaWVzIHNob3VsZCBoYXZlIHNlcnZpY2UgbWV0YWRhdGEKKyAgICAqIFtUSFJJRlQtMzU3OV0gLSBJbnRyb2R1Y2UgcmV0cnkgdG8gbWFrZSBjcm9zcworICAgICogW1RIUklGVC0zMzA2XSAtIEphdmE6IFRCaW5hcnlQcm90b2NvbDogVXNlIDEgdGVtcCBidWZmZXIgaW5zdGVhZCBvZiBhbGxvY2F0aW5nIDgKKyAgICAqIFtUSFJJRlQtMzkxMF0gLSBEbyBub3QgaW52b2tlIHBpcCBhcyBwYXJ0IG9mIGJ1aWxkIHByb2Nlc3MKKyAgICAqIFtUSFJJRlQtMTg1N10gLSBQeXRob24gMy5YIFN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMTk0NF0gLSBCaW5kaW5nIHRvIHplcm8gcG9ydAorICAgICogW1RIUklGVC0zOTU0XSAtIEVuYWJsZSB0aGUgdXNhZ2Ugb2Ygc3RydWN0cyBjYWxsZWQgIk9iamVjdCIgaW4gSmF2YQorICAgICogW1RIUklGVC0zOTgxXSAtIEVuYWJsZSBhbmFseXplciBzdHJvbmcgbW9kZSBpbiBEYXJ0IGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzk5OF0gLSBEb2N1bWVudCBhYmlsaXR5IHRvIGFkZCBjdXN0b20gdGFncyB0byB0aHJpZnQgc3RydWN0cworICAgICogW1RIUklGVC00MDA2XSAtIEFkZCBhIHJlbW92ZUV2ZW50TGlzdGVuZXIgbWV0aG9kIG9uIFRTb2NrZXQKKworIyMgTmV3IEZlYXR1cmUKKyAgICAqIFtUSFJJRlQtNjQwXSAtIFN1cHBvcnQgZGVwcmVjYXRpb24KKyAgICAqIFtUSFJJRlQtOTQ4XSAtIFNTTCBzb2NrZXQgc3VwcG9ydCBmb3IgUEhQCisgICAgKiBbVEhSSUZULTc2NF0gLSBhZGQgU3VwcG9ydCBmb3IgVmFsYSBsYW5ndWFnZQorICAgICogW1RIUklGVC0zMDQ2XSAtIEFsbG93IFBTUjQgY2xhc3MgbG9hZGluZyBmb3IgZ2VuZXJhdGVkIGNsYXNzZXMgKFBIUCkKKyAgICAqIFtUSFJJRlQtMjExM10gLSBFcmxhbmcgU1NMIFNvY2tldCBTdXBwb3J0CisgICAgKiBbVEhSSUZULTE0ODJdIC0gVW5peCBkb21haW4gc29ja2V0IHN1cHBvcnQgdW5kZXIgUEhQCisgICAgKiBbVEhSSUZULTUxOV0gLSBTdXBwb3J0IGNvbGxlY3Rpb25zIG9mIHR5cGVzIHdpdGhvdXQgaGF2aW5nIHRvIGV4cGxpY2l0bHkgZGVmaW5lIGl0CisgICAgKiBbVEhSSUZULTQ2OF0gLSBSYWNrIE1pZGRsZXdhcmUgQXBwbGljYXRpb24gZm9yIFJhaWxzCisgICAgKiBbVEhSSUZULTE3MDhdIC0gQWRkIGV2ZW50IGhhbmRsZXJzIGZvciBwcm9jZXNzb3IgZXZlbnRzCisgICAgKiBbVEhSSUZULTM4MzRdIC0gRXJsYW5nIG5hbWVzcGFjaW5nIGFuZCBleGNlcHRpb24gbWV0YWRhdGEKKyAgICAqIFtUSFJJRlQtMjUxMF0gLSBJbXBsZW1lbnQgVE5vbmJsb2NraW5nU2VydmVyJ3MgYWJpbGl0eSB0byBsaXN0ZW4gb24gdW5peCBkb21haW4gc29ja2V0cworICAgICogW1RIUklGVC0zMzk3XSAtIEltcGxlbWVudCBUUHJvY2Vzc29yRmFjdG9yeSBpbiBDIyB0byBlbmFibGUgcGVyLWNsaWVudCBwcm9jZXNzb3JzCisgICAgKiBbVEhSSUZULTM1MjNdIC0gWE1MIEdlbmVyYXRvcgorICAgICogW1RIUklGVC0zNTEwXSAtIEFkZCBIdHRwVGFza0FzeW5jSGFuZGxlciBpbXBsZW1lbnRhdGlvbgorICAgICogW1RIUklGVC0zMzE4XSAtIFBIUDogU2ltcGxlSlNPTlByb3RvY29sIEltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTMyOTldIC0gRGFydCBsYW5ndWFnZSBiaW5kaW5ncyBpbiBUaHJpZnQKKyAgICAqIFtUSFJJRlQtMjgzNV0gLSBBZGQgcG9zc2liaWxpdHkgdG8gZGlzdHJpYnV0ZSBnZW5lcmF0b3JzIHNlcGFyYXRlbHkgZnJvbSB0aHJpZnQgY29yZSwgYW5kIGxvYWQgdGhlbSBkeW5hbWljYWxseQorICAgICogW1RIUklGVC0xODRdIC0gQWRkIE9TR2kgTWFuaWZlc3QgaGVhZGVycyB0byB0aGUgbGlidGhyaWZ0IGphdmEgbGlicmFyeSB0byBiZSBhYmxlIHRvIHVzZSBUaHJpZnQgaW4gdGhlIE9TR2kgcnVudGltZQorICAgICogW1RIUklGVC0xNDFdIC0gSWYgYSByZXF1aXJlZCBmaWVsZCBpcyBub3QgcHJlc2VudCBvbiBzZXJpYWxpemF0aW9uLCB0aHJvdyBhbiBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMTg5MV0gLSBBZGQgV2luZG93cyBBTFBDIHRyYW5zcG9ydCB3aGljaCBpcyByaWdodCBjb3VudGVycGFydCBvZiBVbml4IGRvbWFpbiBzb2NrZXRzCisKKyMjIFF1ZXN0aW9uCisgICAgKiBbVEhSSUZULTE4MDhdIC0gVGhlIFRocmlmdCBzdHJ1Y3Qgc2hvdWxkIGJlIGNvbnNpZGVyZWQgc2VsZi1jb250YWluZWQ/CisgICAgKiBbVEhSSUZULTI4OTVdIC0gVHV0b3JpYWwgY3BwCisgICAgKiBbVEhSSUZULTM4NjBdIC0gRWxlcGhhbnQtYmlyZCBhcHBsaWNhdGlvbiBUZXN0IGZhaWxzIGZvciBUaHJpZnQKKyAgICAqIFtUSFJJRlQtMzgxMV0gLSBIVFRQUyBTdXBwb3J0IGZvciBDKysgYXBwbGljYXRpb25zCisgICAgKiBbVEhSSUZULTM1MDldIC0gIm1ha2UgY2hlY2siIGVycm9yCisKKyMjIFN0b3J5CisgICAgKiBbVEhSSUZULTM0NTJdIC0gLnRyYXZpcy55bWw6IE1pZ3JhdGluZyBmcm9tIGxlZ2FjeSB0byBjb250YWluZXItYmFzZWQgaW5mcmFzdHJ1Y3R1cmUKKworIyMgU3ViLXRhc2sKKyAgICAqIFtUSFJJRlQtMTgxMV0gLSBydWJ5IHR1dG9yaWFsIGFzIHBhcnQgb2YgdGhlIHJlZ3VsYXIgYnVpbGQKKyAgICAqIFtUSFJJRlQtMjc3OV0gLSBQSFAgVEpTT05Qcm90b2NvbCBlbmNvZGUgdW5pY29kZSBpbnRvIFVDUy00TEUgd2hpY2ggY2FuJ3QgYmUgcGFyc2VkIGJ5IG90aGVyIGxhbmd1YWdlIGJpbmRpbmdzCisgICAgKiBbVEhSSUZULTIxMTBdIC0gRXJsYW5nOiBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMgb24gYW55IFRyYW5zcG9ydCwgUHJvdG9jb2wgYW5kIFNlcnZlcgorICAgICogW1RIUklGVC0zODUyXSAtIEEgVHJhdmlzLUNJIGpvYiBmYWlscyB3aXRoICJ3cml0ZSBlcnJvciIKKyAgICAqIFtUSFJJRlQtMzc0MF0gLSBGaXggaGF4ZWxpYi5qc29uIGNsYXNzcGF0aCAKKyAgICAqIFtUSFJJRlQtMzY1M10gLSBpbmNvcnJlY3QgdW5pb24gc2VyaWFsaXphdGlvbgorICAgICogW1RIUklGVC0zNjUyXSAtIGluY29ycmVjdCBzZXJpYWxpemF0aW9uIG9mIG9wdGlvbmFscworICAgICogW1RIUklGVC0zNjU1XSAtIGluY29ycmVjdCB1bmlvbiBzZXJpYWxpemF0aW9uCisgICAgKiBbVEhSSUZULTM2NTRdIC0gaW5jb3JyZWN0IHNlcmlhbGl6YXRpb24gb2Ygb3B0aW9uYWxzCisgICAgKiBbVEhSSUZULTM2NTZdIC0gaW5jb3JyZWN0IHNlcmlhbGl6YXRpb24gb2Ygb3B0aW9uYWxzCisgICAgKiBbVEhSSUZULTM2OTldIC0gRml4IGludGVnZXIgbGltaXQgc3ltYm9sIGluY2x1ZGVzIGluIFB5dGhvbiBDIGV4dGVuc2lvbgorICAgICogW1RIUklGVC0zNjkzXSAtIEZpeCBpbmNsdWRlIGlzc3VlIGluIEMrKyBUU1NMU29ja2V0SW50ZXJydXB0VGVzdCBvbiBXaW5kb3dzCisgICAgKiBbVEhSSUZULTM2OTRdIC0gW1dpbmRvd3NdIERpc2FibGUgdGVzdHMgb2YgYSBmZXcgc2VydmVycyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkCisgICAgKiBbVEhSSUZULTM2OTZdIC0gSW5zdGFsbCBwaXAgdG8gQ2VudE9TIERvY2tlciBpbWFnZXMgdG8gZml4IFB5dGhvbiBidWlsZHMKKyAgICAqIFtUSFJJRlQtMzYzOF0gLSBGaXggaGF4ZWxpYi5qc29uCisgICAgKiBbVEhSSUZULTMyNTFdIC0gQWRkIGh0dHAgdHJhbnNwb3J0IGZvciBzZXJ2ZXIgdG8gR28gbGliCisgICAgKiBbVEhSSUZULTI0MjRdIC0gUmVjdXJzaXZlIFR5cGVzCisgICAgKiBbVEhSSUZULTI0MjNdIC0gVEhlYWRlcgorICAgICogW1RIUklGVC0yNDEzXSAtIFB5dGhvbjogVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCisgICAgKiBbVEhSSUZULTI0MDldIC0gSmF2YTogVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCisgICAgKiBbVEhSSUZULTI0MTJdIC0gRDogVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCisgICAgKiBbVEhSSUZULTI0MTFdIC0gQysrOiBVVEYtOCBzZW50IGJ5IFBIUCBhcyBKU09OIGlzIG5vdCB1bmRlcnN0b29kIGJ5IFRKc29uUHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjQxMF0gLSBKYXZhTWU6IFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAorICAgICogW1RIUklGVC0yNjY4XSAtIFRlc3RTdWl0ZTogZGV0YWlsZWQgcmVzdWx0IG9uIHBhc3NlZCB0ZXN0cyBieSBmZWF0dXJlCisgICAgKiBbVEhSSUZULTI2NTldIC0gcHl0aG9uIFRlc3QgU2VydmVyIGZhaWxzIHdoZW4gdGhyb3dpbmcgVEV4Y2VwdGlvbgorICAgICogW1RIUklGVC0zMzk4XSAtIEFkZCBDTWFrZSBidWlsZCAgZm9yIEhhc2tlbGwgbGlicmFyeSBhbmQgdGVzdHMKKyAgICAqIFtUSFJJRlQtMzM5Nl0gLSBEQVJUOiBVVEYtOCBzZW50IGJ5IFBIUCBhcyBKU09OIGlzIG5vdCB1bmRlcnN0b29kIGJ5IFRKc29uUHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMzM2NF0gLSAgIEZpeCBydWJ5IGJpbmFyeSBmaWVsZCBlbmNvZGluZyBpbiBUSlNPTlByb3RvY29sCisgICAgKiBbVEhSSUZULTMzODFdIC0gRml4IGZvciBtaXNjLiBjb2RlZ2VuIGlzc3VlcyB3aXRoIFRIUklGVC0yOTA1CisgICAgKiBbVEhSSUZULTM1NzNdIC0gTm8gcnVsZSB0byBtYWtlIHRhcmdldCBgLi4vLi4vLi4vdGVzdC9jX2dsaWIvc3JjLy5kZXBzL3Rlc3R0aHJpZnR0ZXN0LXRocmlmdF90ZXN0X2hhbmRsZXIuUG8nLgorICAgICogW1RIUklGVC0zNTcyXSAtICJVbmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBiZWhhdmlvciBvZiBhIHNpZ25lZCByaWdodCBzaGlmdCIKKyAgICAqIFtUSFJJRlQtMzU0Ml0gLSBBZGQgbGVuZ3RoIGxpbWl0IHN1cHBvcnQgdG8gSmF2YSB0ZXN0IHNlcnZlcgorICAgICogW1RIUklGVC0zNTM3XSAtIFJlbW92ZSB0aGUgKG5vdyBvYnNvbGV0ZSkgY3NoYXJwOmFzeW5jY3RwIGZsYWcgCisgICAgKiBbVEhSSUZULTM1MzJdIC0gQWRkIGNvbmZpZ3VyYWJsZSBzdHJpbmcgYW5kIGNvbnRhaW5lciByZWFkIHNpemUgbGltaXQgdG8gUHl0aG9uIHByb3RvY29scworICAgICogW1RIUklGVC0zNTMxXSAtIENyZWF0ZSBjcm9zcyBsYW5nIGZlYXR1cmUgdGVzdCBmb3Igc3RyaW5nIGFuZCBjb250YWluZXIgcmVhZCBsZW5ndGggbGltaXQKKyAgICAqIFtUSFJJRlQtMzQ4Ml0gLSBIYXNrZWxsIEpTT04gcHJvdG9jb2wgZG9lcyBub3QgZW5jb2RlIGJpbmFyeSBmaWVsZCBhcyBCYXNlNjQKKyAgICAqIFtUSFJJRlQtMzQyNV0gLSBNaW5vciBmaXhlcyArIHNpbXBsaWZpY2F0aW9uIGZvciBDZW50T1MgRG9ja2VyZmlsZQorICAgICogW1RIUklGVC0zNDQyXSAtIFJ1biBDTWFrZSB0ZXN0cyBvbiBBcHB2ZXlvcgorICAgICogW1RIUklGVC0zNDA5XSAtIE5vZGVKUyBiaW5hcnkgZmllbGQgaXNzdWVzCisgICAgKiBbVEhSSUZULTM2MjFdIC0gRml4IGxpYi9jcHAvdGVzdC9TZWN1cml0eVRlc3QuY3BwIHRvIHVzZSBlcGhlbWVyYWwgcG9ydHMKKyAgICAqIFtUSFJJRlQtMzYyOF0gLSBGaXggbGliL2NwcC90ZXN0L1RTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QuY3BwIHRvIHVzZSBlcGhlbWVyYWwgcG9ydHMKKyAgICAqIFtUSFJJRlQtMzYyNV0gLSBLaWxsIHVudXNlZCAjaW5jbHVkZSAiVGVzdFBvcnRGaXh0dXJlLmgiIGluIGxpYi9jcHAvdGVzdC9UU2VydmVyVHJhbnNwb3J0VGVzdC5jcHAuCisgICAgKiBbVEhSSUZULTM2NDZdIC0gRml4IFB5dGhvbiBleHRlbnNpb24gYnVpbGQgd2FybmluZ3MKKyAgICAqIFtUSFJJRlQtMzYyNl0gLSBGaXggbGliL2NwcC90ZXN0L1RTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcCB0byB1c2UgZXBoZW1lcmFsIHBvcnRzLgorICAgICogW1RIUklGVC0zNjI0XSAtIEZpeCBsaWIvY3BwL3Rlc3QvVFNlcnZlclNvY2tldFRlc3QuY3BwIHRvIHVzZSBlcGhlbWVyYWwgcG9ydHMKKyAgICAqIFtUSFJJRlQtMzYyM10gLSBGaXggRml4IGNwcC9saWIvdGVzdC9UU1NMU29ja2V0SW50ZXJydXB0VGVzdC5jcHAgdG8gdXNlIGVwaGVtZXJhbCBwb3J0cworICAgICogW1RIUklGVC0zNTkyXSAtIEFkZCBiYXNpYyB0ZXN0IGNsaWVudAorICAgICogW1RIUklGVC0zOTgwXSAtIGFkZCBURXh0ZW5kZWRCaW5hcnlQcm90b2NvbC5qYXZhCisKKyMjIFRhc2sKKyAgICAqIFtUSFJJRlQtMTgwMV0gLSBTeW5jIHVwIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBjb2RlcyBhY3Jvc3MgbGFuZ3VhZ2VzIGFuZCB0aHJpZnQgaW1wbGVtZW50YXRpb25zCisgICAgKiBbVEhSSUZULTEyNTldIC0gQXV0b21hdGUgdmVyc2lvbmluZyAKKworIyMgVGVzdAorICAgICogW1RIUklGVC0zNDAwXSAtIEFkZCBFcmxhbmcgdG8gY3Jvc3MgdGVzdAorICAgICogW1RIUklGVC0zNTA0XSAtIEZpeCBGYXN0YmluYXJ5VGVzdC5weQorCisjIyBXaXNoCisgICAgKiBbVEhSSUZULTM5MjNdIC0gTWF5YmUgcmVtb3ZlIEFlcmVvIGZyb20gdGhlICJQb3dlcmVkIGJ5IiBsaXN0CisgICAgKiBbVEhSSUZULTIxNDldIC0gQWRkIGFuIG9wdGlvbiB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIGRlZmF1bHQgb3BlcmF0b3JzCiAKIAotVmVyc2lvbiAwLjYuMAogCi1USFJJRlQtOTQwICAgIEJ1aWxkICAgICAgICAgICAgICAgICdtYWtlIGNoZWNrJyBmYWlscyBpZiBib29zdCBpcyBub3QgaW4gdGhlIHN0ZCBpbmNsdWRlIGFuZCBsaW5rIHBhdGhzIChDaHJpc3RpYW4gTGF2b2llKQotVEhSSUZULTEwMzIgICBCdWlsZCAgICAgICAgICAgICAgICAibWFrZSBkaXN0IiBmYWlscyBkdWUgdG8gY19nbGliIHByb2JsZW0gKE1pY2hhZWwgTHVtKQotVEhSSUZULTEwMDIgICBDIGdsaWIgICAgICAgICAgICAgICBDb2RlU3R5bGU6IHRfY19nbGliX2dlbmVyYXRvci5jYyAoQW5hdG9sIFBvbW96b3YpCi1USFJJRlQtOTc1ICAgIEMgZ2xpYiAgICAgICAgICAgICAgIGxpYi9jX2dsaWIvUkVBRE1FIGlzIG1pc3NpbmcgPT4gYnJlYWtzIG1ha2UgZGlzdCAoTWljaGFlbCBMdW0pCi1USFJJRlQtMTAwMyAgIEMgZ2xpYiAgICAgICAgICAgICAgIFBvbGlzaGluZyBjX2dsaWIgY29kZSAoQW5hdG9sIFBvbW96b3YpCi1USFJJRlQtNTgyICAgIEMgZ2xpYiAgICAgICAgICAgICAgIEMgaW1wbGVtZW50YXRpb24gb2YgVGhyaWZ0IChBbmF0b2wgUG9tb3pvdikKLVRIUklGVC05OTIgICAgQyMgICAgICAgICAgICAgICAgICAgTmFtaW5nIGNvbnZlbnRpb24gaW4gQyMgY29uc3RydWN0b3IgaXMgbm90IGNvbnNpc3RlbnQgd2l0aCBvdGhlciBmaWVsZHMgY2F1c2VzIGNvbXBpbGUgZXJyb3JzIChSb2dlciBNZWllcikKLVRIUklGVC05NzcgICAgQysrICAgICAgICAgICAgICAgICAgSGV4IENvbnZlcnNpb24gQnVnIGluIEMrKyBUSlNPTlByb3RvY29sIChBcmF2aW5kIE5hcmF5YW5hbikKLVRIUklGVC05MjIgICAgQysrICAgICAgICAgICAgICAgICAgVGVtcGxhdGl6ZWQgW2RlXXNlcmlhbGl6YXRpb24gY29kZSBmb3IgQysrIChEYXZpZCBSZWlzcykKLVRIUklGVC05MjMgICAgQysrICAgICAgICAgICAgICAgICAgRXZlbnQtZHJpdmVuIGNsaWVudCBhbmQgc2VydmVyIHN1cHBvcnQgZm9yIEMrKyAoRGF2aWQgUmVpc3MpCi1USFJJRlQtOTI1ICAgIEMrKyAgICAgICAgICAgICAgICAgIFByb3ZpZGUgbmFtZTwtPnZhbHVlIG1hcCBmb3IgZW51bXMgaW4gQysrIChEYXZpZCBSZWlzcykKLVRIUklGVC05MjYgICAgQysrICAgICAgICAgICAgICAgICAgTWlzY2VsbGFuZW91cyBDKysgaW1wcm92ZW1lbnRzIChEYXZpZCBSZWlzcykKLVRIUklGVC05MjggICAgQysrICAgICAgICAgICAgICAgICAgTWFrZSBtb3JlIHN0YXRpc3RpY3MgYXZhaWxhYmxlIGluIEMrKyBzZXJ2ZXJzIChEYXZpZCBSZWlzcykKLVRIUklGVC05MjkgICAgQysrICAgICAgICAgICAgICAgICAgSW1wcm92ZW1lbnRzIHRvIHRoZSBDKysgdGVzdCBzdWl0ZSAoRGF2aWQgUmVpc3MpCi1USFJJRlQtODY4ICAgIENvbXBpbGVyIChHZW5lcmFsKSAgIFJlZmVyZW5jaW5nIGNvbnN0YW50IHZhbHVlcyBkb2Vzbid0IHdvcmsgd2l0aCB3aXRoIHR5cGVkZWYgdHlwZXMgKERhdmlkIFJlaXNzKQotVEhSSUZULTEwMDYgICBHZW5lcmFsICAgICAgICAgICAgICBJbXBvc3NpYmxlIHRvIGNvcnJlY3RseSBxdWFsaWZ5IGFuIGVudW0gY29uc3RhbnQgaW4gYW4gZXh0ZXJuYWwgdGhyaWZ0IGZpbGUgKEJyeWFuIER1eGJ1cnkpCi1USFJJRlQtOTMyICAgIEhhc2tlbGwgICAgICAgICAgICAgIEhhc2tlbGwgdGVzdHMgbmVlZCB0byBiZSBydW4gdGhyb3VnaCAnbWFrZSBjaGVjaycgKGFuZCBwcm9iYWJseSAnY2FiYWwgY2hlY2snKSB0b28gKENocmlzdGlhbiBMYXZvaWUpCi1USFJJRlQtOTMzICAgIEhhc2tlbGwgICAgICAgICAgICAgIEhhc2tlbGwncyBUaHJpZnQuY2FiYWwgaGFzIHdhcm5pbmdzIChDaHJpc3RpYW4gTGF2b2llKQotVEhSSUZULTk0MyAgICBIYXNrZWxsICAgICAgICAgICAgICBTaWxseSByZWFkbWUgdHlwbyBmaXguIChDaHJpc3RpYW4gTGF2b2llKQotVEhSSUZULTk0NCAgICBIYXNrZWxsICAgICAgICAgICAgICBTdXBwb3J0IGFsbCB2ZXJzaW9uLTRzIG9mIGJhc2UgKENocmlzdGlhbiBMYXZvaWUpCi1USFJJRlQtOTUwICAgIEhhc2tlbGwgICAgICAgICAgICAgIEhhc2tlbGwgYmluZGluZ3MgdHJlYXQgJ2J5dGUnIGFzIHVuc2lnbmVkIDgtYml0IGludCAoRGF0YS5Xb3JkLldvcmQ4KSwgamF2YS9jcHAgYXMgc2lnbmVkIChieXRlL2ludDhfdCkuIChDaHJpc3RpYW4gTGF2b2llKQotVEhSSUZULTEwMDkgICBKYXZhICAgICAgICAgICAgICAgICBUVW5pb24gZG9lcyBub3QgY29ycmVjdGx5IGRlZXAgY29weSBhIEJ5dGVCdWZmZXIgKFRha2FzaGkgWW9uZWJheWFzaGkpCi1USFJJRlQtMTAxMyAgIEphdmEgICAgICAgICAgICAgICAgIGdlbmVyYXRlZCBqYXZhIGNvZGUgbWF5IGhhdmUgbmFtZSBjbGFzaGVzIHdpdGggdGhyaWZ0IGxpYnJhcnkgKFBldGVyIFNjaHVsbGVyKQotVEhSSUZULTEwMTUgICBKYXZhICAgICAgICAgICAgICAgICBUVW5pb24gZG9lcyBub3QgaGFuZGxlIEJ5dGVCdWZmZXIgaW4gdG9TdHJpbmcgKFRha2FzaGkgWW9uZWJheWFzaGkpCi1USFJJRlQtMTAzOCAgIEphdmEgICAgICAgICAgICAgICAgIEdlbmVyYXRlZCBKYXZhIGNvZGUgZm9yIHN0cnVjdHVyZXMgY29udGFpbmluZyBiaW5hcnkgZmllbGRzIChvciBjb2xsZWN0aW9ucyB0aGVyZW9mKSBhcmUgbm90IHNlcmlhbGl6YWJsZSAoaW4gdGhlIEphdmEgc2Vuc2UpIGV2ZW4gdGhvdWdoIHRoZXkgaW1wbGVtZW50IGphdmEuaW8uU2VyaWFsaXphYmxlIChNYXRoaWFzIEhlcmJlcnRzKQotVEhSSUZULTEwNiAgICBKYXZhICAgICAgICAgICAgICAgICBUU1NMU2VydmVyU29ja2V0IChOaXJtYWwgUmFuZ2FuYXRoYW4pCi1USFJJRlQtMzc3ICAgIEphdmEgICAgICAgICAgICAgICAgIFRGaWxlVHJhbnNwb3J0IHBvcnQgaW4gSmF2YSAoSm95ZGVlcCBTZW4gU2FybWEpCi1USFJJRlQtNzQ1ICAgIEphdmEgICAgICAgICAgICAgICAgIE1ha2UgaXQgZWFzaWVyIHRvIGluc3RhbnRpYXRlIHNlcnZlcnMgKEJyeWFuIER1eGJ1cnkpCi1USFJJRlQtODYyICAgIEphdmEgICAgICAgICAgICAgICAgIEFzeW5jIGNsaWVudCBpc3N1ZXMgLyBpbXByb3ZlbWVudHMgKE5pbmcgTGlhbmcpCi1USFJJRlQtOTAzICAgIEphdmEgICAgICAgICAgICAgICAgIGN1c3RvbSBUaHJlYWRGYWN0b3J5IGluIFRIc0hhU2VydmVyIChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTkzOSAgICBKYXZhICAgICAgICAgICAgICAgICBvcHRpb25hbCBiaW5hcnkgZmllbGRzIHRocm93IE5QRSBvbiBkZWZhdWx0IGJ5dGVbXSBnZXR0ZXJzIChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTk0NyAgICBKYXZhICAgICAgICAgICAgICAgICBQcm92aWRlIGEgaGVscGVyIG1ldGhvZCB0byBkZXRlcm1pbmUgdGhlIFRQcm90b2NvbCB1c2VkIHRvIHNlcmlhbGl6ZSBzb21lIGRhdGEuIChNYXRoaWFzIEhlcmJlcnRzKQotVEhSSUZULTk1MSAgICBKYXZhICAgICAgICAgICAgICAgICBBZGQgYSBuZXcgaXNTZXJ2aW5nKCkgbWV0aG9kIHRvIFRTZXJ2ZXIgKEJyeWFuIER1eGJ1cnkpCi1USFJJRlQtOTU3ICAgIEphdmEgICAgICAgICAgICAgICAgIFRIc0hhU2VydmVyOiBDaGFuZ2UgYWNjZXNzIG1vZGlmaWVyIG9mIHRoZSBpbnZva2VyIGZpZWxkLiAoQmVuamFtaW4gQ292ZXJzdG9uKQotVEhSSUZULTk1OCAgICBKYXZhICAgICAgICAgICAgICAgICBDaGFuZ2UgYWNjZXNzbW9kaWZlciBvbiB0cmFuc18gZmllbGQgaW4gdGhlIEZyYW1lQnVmZmVyIGNsYXNzIHRvIHB1YmxpYy4gKEJlbmphbWluIENvdmVyc3RvbikKLVRIUklGVC05NTkgICAgSmF2YSAgICAgICAgICAgICAgICAgVFNvY2tldCBzZWVtcyB0byBkbyBpdHMgb3duIGJ1ZmZlcmluZyBpbmVmZmljaWVudGx5IChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTk3MCAgICBKYXZhICAgICAgICAgICAgICAgICBVbmRlciBoZWF2eSBsb2FkLCBUSHR0cENsaWVudCBtYXkgZmFpbCB3aXRoICJ0b28gbWFueSBvcGVuIGZpbGVzIiAoTWF0aGlhcyBIZXJiZXJ0cykKLVRIUklGVC05NzEgICAgSmF2YSAgICAgICAgICAgICAgICAgamF2YSBtb2R1bGUgY2FuJ3QgYmUgY29tcGlsZWQgd2l0aG91dCBpdnkgYW5kIG5ldHdvcmsgY29ubmVjdGlvbiAoUm9nZXIgTWVpZXIpCi1USFJJRlQtODA3ICAgIEphdmFTY3JpcHQgICAgICAgICAgIEphdmFTY3JpcHQ6IEluaXRpYWxpemF0aW9uIG9mIEJhc2UgVHlwZXMgd2l0aCAwIGluc3RlYWQgb2YgbnVsbCAoUm9nZXIgTWVpZXIpCi1USFJJRlQtOTEzICAgIEphdmFTY3JpcHQgICAgICAgICAgIFRlc3QgQ2FzZSBmb3IgVXJsIGVuY29kZWQgc3RyaW5ncyArIHNpbXBsZSBlbmhhbmNlbWVudCB0byBsaWIvanMvdGVzdC9SdW5UZXN0U2VydmVyLnNoIChSb2dlciBNZWllcikKLVRIUklGVC05NjEgICAgSmF2YVNjcmlwdCAgICAgICAgICAgSmF2YVNjcmlwdCBUZXN0U3VpdGUgdXNpbmcgYW50L2l2eSBhbmQgSmF2YSdzIFNlcnZlclRlc3RCYXNlIEhhbmRsZXIgKFJvZ2VyIE1laWVyKQotVEhSSUZULTEwMDUgICBKYXZhICAgICAgICAgICAgICAgICBHaXZlIHVuaW9ucyBieXRlW10gc2lnbmF0dXJlIG1ldGhvZHMgdG8gZ28gYWxvbmcgd2l0aCB0aGVpciBCeXRlQnVmZmVyIGNvdW50ZXJwYXJ0cyAoQnJ5YW4gRHV4YnVyeSkKLVRIUklGVC0xMDA4ICAgSmF2YSAgICAgICAgICAgICAgICAgYnl0ZVtdIGFjY2Vzc29ycyB0aHJvdyBOUEUgb24gdW5zZXQgZmllbGQgKEJyeWFuIER1eGJ1cnkpCi1USFJJRlQtNTE3ICAgIEphdmEgICAgICAgICAgICAgICAgIFRFeGNlcHRpb25zIHRocm93biBieSBzZXJ2ZXIgcmVzdWx0IGluIGNyeXB0aWMgZXJyb3IgbWVzc2FnZSBvbiBjbGllbnQgLSBUcmllZCB0byByZWFkIDQgYnl0ZXMsIGJ1dCBvbmx5IGdvdCAwIGJ5dGVzIChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTk0NiAgICBKYXZhICAgICAgICAgICAgICAgICBBdWdtZW50IEZpZWxkVmFsdWVNZXRhRGF0YSBzbyBpdCBkaWZmZXJlbnRpYXRlcyAnc3RyaW5nJyBhbmQgJ2JpbmFyeScgZmllbGRzLiAoTWF0aGlhcyBIZXJiZXJ0cykKLVRIUklGVC05NDkgICAgSmF2YSAgICAgICAgICAgICAgICAgTW9kaWZ5IHRoZSBURW51bSBpbnRlcmZhY2Ugc28gaXQgZGVmaW5lcyBhIG1ldGhvZCBzaW1pbGFyIHRvIGZpbmRCeVZhbHVlIChNYXRoaWFzIEhlcmJlcnRzKQotVEhSSUZULTk2MCAgICBKYXZhICAgICAgICAgICAgICAgICBhZGQgVGVzdFNlcnZlciwgVGVzdE5vbmJsb2NraW5nU2VydmVyIGFuZCBUZXN0Q2xpZW50IGFnYWluIChSb2dlciBNZWllcikKLVRIUklGVC05NjkgICAgSmF2YSAgICAgICAgICAgICAgICAgSmF2YSBUdXRvcmlhbCBicm9rZW4sIG1vdmUgQ2FsY3VsYXRvckhhbmRsZXIgdG8gYSBzZXBhcmF0ZSBmaWxlIChSb2dlciBNZWllcikKLVRIUklGVC03MSAgICAgTWlzYyAgICAgICAgICAgICAgICAgRGViaWFuIHBhY2thZ2luZyBmb3IgdGhyaWZ0IChSb2dlciBNZWllcikKLVRIUklGVC0xMDIwICAgT0NhbWwgICAgICAgICAgICAgICAgT0NhbWwgY29tcGlsZXIgZ2VuZXJhdGVzIGludmFsaWQgT0NhbWwgKFJpY2hhcmQgTG93KQotVEhSSUZULTM0NyAgICBQSFAgICAgICAgICAgICAgICAgICBQSFAgVFNvY2tldCBUaW1lb3V0IElzc3VlcyAoVHlsZXIgSG9iYnMpCi1USFJJRlQtOTI0ICAgIFBIUCAgICAgICAgICAgICAgICAgIEZpeCBnZW5lcmF0ZWQgcGhwIHN0cnVjdHVyZSBjb25zdGFudHMgKERhdmlkIFJlaXNzKQotVEhSSUZULTkyNyAgICBQSFAgICAgICAgICAgICAgICAgICBBZGQgb3B0aW9uIHRvIG1vZGlmeSB0aGUgUEhQIGluY2x1ZGUgcGF0aCAoRGF2aWQgUmVpc3MpCi1USFJJRlQtOTM1ICAgIFBIUCAgICAgICAgICAgICAgICAgIFBIUCBFeHRlbnNpb24gYWJvcnRzIHRoZSBidWlsZCBpZiBwaHAtY29uZmlnIGlzIG5vdCBpbnN0YWxsZWQgKERhdmlkIFJlaXNzKQotVEhSSUZULTk0MSAgICBQSFAgICAgICAgICAgICAgICAgICBNYWtlIFBIUCBDIEV4dGVuc2lvbiB1c2UgdGhlIGRlZmluZWQgUHJvdG9jb2wgd3JpdGVNZXNzYWdlQmVnaW4gZnVuY3Rpb24gKENocmlzIEdvZmZpbmV0KQotVEhSSUZULTk1NSAgICBQSFAgICAgICAgICAgICAgICAgICBUaHJpZnQgY29tcGlsZXIgZm9yIFdpbmRvd3MgdXNlcyBsb3dlcmNhc2UgbmFtZXMgYW5kIGRpcmVjdG9yaWVzIHdoaWNoIGlzIGluY29uc2lzdGVudCB3aXRoIGNvbXBpbGluZyBvbiBvdGhlciBwbGF0Zm9ybXMgKFJvZ2VyIE1laWVyKQotVEhSSUZULTk3OSAgICBSdWJ5ICAgICAgICAgICAgICAgICBydWJ5IGJpbmRpbmdzIHVzZWQgdG8gd29yayBvbiBqcnVieSAoSmVmZiBIb2RnZXMpCi1USFJJRlQtNTgxICAgIFRlc3QgU3VpdGUgICAgICAgICAgIEFkZCBhIHRlc3RzdWl0ZSBmb3IgdHhUaHJpZnQgKFR3aXN0ZWQpIChFc3RldmUgRmVybmFuZGV6KQotVEhSSUZULTEwMjQgICBUdXRvcmlhbCAgICAgICAgICAgICBBZGQgUHl0aG9uIFR3aXN0ZWQgZXhhbXBsZSB0byB0aGUgVHV0b3JpYWwgKFJvZ2VyIE1laWVyKQotVEhSSUZULTg5MyAgICBUdXRvcmlhbCAgICAgICAgICAgICBhZGQgSmF2YVNjcmlwdCB0byB0aGUgdHV0b3JpYWwgZXhhbXBsZXMgKFJvZ2VyIE1laWVyKQorVGhyaWZ0IDAuOS4zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgQnVnCisgICAgKiBbVEhSSUZULTI0NDFdIC0gQ2Fubm90IHNodXRkb3duIFRUaHJlYWRlZFNlcnZlciB3aGVuIGNsaWVudHMgYXJlIHN0aWxsIGNvbm5lY3RlZAorICAgICogW1RIUklGVC0yNDY1XSAtIFRCaW5hcnlQcm90b2NvbFQgYnJlYWtzIGlmIGNvcGllZC9tb3ZlZAorICAgICogW1RIUklGVC0yNDc0XSAtIHRocmlmdC5oIGNhdXNlcyBhIGNvbXBpbGUgZmFpbHVyZQorICAgICogW1RIUklGVC0yNTQwXSAtIFJ1bm5pbmcgY29uZmlndXJlIGZyb20gb3V0c2lkZSB0aGUgc291cmNlIGRpcmVjdG9yeSBmYWlscworICAgICogW1RIUklGVC0yNTk4XSAtIEFkZCBjaGVjayBmb3IgbWluaW11bSBHbyB2ZXJzaW9uIHRvIGNvbmZpZ3VyZS5hYworICAgICogW1RIUklGVC0yNjQ3XSAtIGNvbXBpbGVyLWhzOiBkb24ndCBkZWNhcGl0YWxpemUgZmllbGQgbmFtZXMsIGRvIGRlY2FwaXRhbGl6ZSBhcmd1bWVudCBiaW5kaW5ncworICAgICogW1RIUklGVC0yNzczXSAtIEdlbmVyYXRlZCBKYXZhIGNvZGUgZm9yICdvbmV3YXknIG1ldGhvZHMgaXMgaW5jb3JyZWN0LgorICAgICogW1RIUklGVC0yNzg5XSAtIFROb25ibG9ja2luZ1NlcnZlciBsZWFrcyBzb2NrZXQgRkQncyB1bmRlciBsb2FkCisgICAgKiBbVEhSSUZULTI2ODJdIC0gVFRocmVhZGVkU2VydmVyIGxlYWtzIHBlci10aHJlYWQgbWVtb3J5CisgICAgKiBbVEhSSUZULTI2NzRdIC0gSmF2YVNjcmlwdDogZGVjbGFyZSBBY2NlcHQ6IGFuZCBDb250ZW50LVR5cGU6IGluIHJlcXVlc3QKKyAgICAqIFtUSFJJRlQtMzA3OF0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQncyBsb2dnZXIgaXMgbm90IG5hbWVkIGFmdGVyIFROb25ibG9ja2luZ1NlcnZlclNvY2tldAorICAgICogW1RIUklGVC0zMDc3XSAtIEMrKyBURmlsZVRyYW5zcG9ydCBpZ25vcmVzIHJldHVybiBjb2RlIGZyb20gZnRydW5jYXRlCisgICAgKiBbVEhSSUZULTMwNjddIC0gQysrIGNwcGNoZWNrIHBlcmZvcm1hbmNlIHJlbGF0ZWQgd2FybmluZ3MKKyAgICAqIFtUSFJJRlQtMzA2Nl0gLSBDKysgVERlbnNlUHJvdG9jb2wgYXNzZXJ0IG1vZGlmaWVzIGluc3RlYWQgb2YgY2hlY2tzCisgICAgKiBbVEhSSUZULTMwNzFdIC0gYm9vdHN0cmFwLnNoIG9uIFVidW50dSAxMi4wNCAoUHJlY2lzZSkgYXV0b21ha2UgZXJyb3IKKyAgICAqIFtUSFJJRlQtMzA2OV0gLSBDKysgVFNlcnZlclNvY2tldCBsZWFrcyBzb2NrZXQgb24gZmNudGwgZ2V0IG9yIHNldCBmbGFncyBlcnJvcgorICAgICogW1RIUklGVC0zMDc5XSAtIFROb25ibG9ja2luZ1NlcnZlclNvY2tldCdzIGxvZ2dlciBpcyBub3QgbmFtZWQgYWZ0ZXIgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0CisgICAgKiBbVEhSSUZULTMwODBdIC0gQysrIFROb25ibG9ja2luZ1NlcnZlciBjb25uZWN0aW9uIGxlYWsgd2hpbGUgYWNjZXB0IGh1Z2UgbnVtYmVyIGNvbm5lY3Rpb25zLgorICAgICogW1RIUklGVC0zMDg2XSAtIEMrKyBWYWxncmluZCBFcnJvciBDbGVhbnVwCisgICAgKiBbVEhSSUZULTMwODVdIC0gdGhyaWZ0X3JlY29ubmVjdGluZ19jbGllbnQgbmV2ZXIgdHJ5IHRvIHJlY29ubmVjdAorICAgICogW1RIUklGVC0zMTIzXSAtIE1pc3NpbmcgaW5jbHVkZSBpbiBjb21waWxlci9jcHAvc3JjL21haW4uaCBicmVha3MgYnVpbGQgaW4gc29tZSBlbnZpcm9ubWVudHMKKyAgICAqIFtUSFJJRlQtMzEyNV0gLSBGaXggdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgaGVhZGVycyBpbiBhdXRvbWFrZSBpbnB1dAorICAgICogW1RIUklGVC0zMTI2XSAtIFBIUCBKU09OIHNlcmlhbGl6ZXIgY29udmVydHMgZW1wdHkgb3IgaW50LWluZGV4ZWQgbWFwcyB0byBsaXN0cworICAgICogW1RIUklGVC0zMTMyXSAtIFByb3Blcmx5IGZvcm1hdCBkYXRlIGluIEphdmEgQEdlbmVyYXRlZCBhbm5vdGF0aW9ucworICAgICogW1RIUklGVC0zMTM3XSAtIFRyYXZpcyBidWlsZCBoYW5ncyBhZnRlciBmYWlsdXJlCisgICAgKiBbVEhSSUZULTMxMzhdIC0gIm1ha2UgY2hlY2siIHBhcmFsbGVsIGV4ZWN1dGlvbiBpcyB1bmRlcm1pbmlzdGljCisgICAgKiBbVEhSSUZULTMxMzldIC0gSlMgbGlicmFyeSB0ZXN0IGlzIGZsYWt5CisgICAgKiBbVEhSSUZULTMxNDBdIC0gQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgSmF2YVNjcmlwdCB0ZXN0IHNlcnZlcgorICAgICogW1RIUklGVC0zMTI0XSAtIFNvbWUgc2lnbmVkL3Vuc2lnbmVkIHdhcm5pbmdzIHdoaWxlIGJ1aWxkaW5nIGNvbXBpbGVyCisgICAgKiBbVEhSSUZULTMxMjhdIC0gR28gZ2VuZXJhdGVkIGNvZGUgcHJvZHVjZXMgbmFtZSBjb2xsaXNpb25zIGJldHdlZW4gc2VydmljZXMKKyAgICAqIFtUSFJJRlQtMzE0Nl0gLSBHcmFwaHZpeiBnZW5lcmF0ZXMgZnVuY3Rpb24gbmFtZSBjb2xsaXNpb25zIGJldHdlZW4gc2VydmljZXMKKyAgICAqIFtUSFJJRlQtMzE0N10gLSBTZWdmYXVsdCB3aGlsZSByZWNlaXZpbmcgZGF0YQorICAgICogW1RIUklGVC0zMTQ4XSAtIE1hcmtkb3duIGxpbmtzIHRvIGNvZGluZ19zdGFuZGFyZHMgYXJlIGRlYWQKKyAgICAqIFtUSFJJRlQtMzA5MF0gLSBjbWFrZSBidWlsZCBpcyBicm9rZW4gb24gTWFjT1NYCisgICAgKiBbVEhSSUZULTMwOTddIC0gY21ha2UgdGFyZ2V0cyB1bmNvbmRpdGlvbmFsbHkgZGVwZW5kIG9uIG9wdGlvbmFsIGxpYnJhcmllcworICAgICogW1RIUklGVC0zMDk0XSAtIG1hc3RlciBhcyBvZiAyMDE1LUFQUi0xMyBmYWlscyAtREJPT1NUX1RIUkVBRFMgY21ha2UgYnVpbGQKKyAgICAqIFtUSFJJRlQtMzA5OV0gLSBjbWFrZSBidWlsZCBpcyBicm9rZW4gb24gRnJlZUJTRAorICAgICogW1RIUklGVC0zMDg5XSAtIEFzc2lnbmluZyBkZWZhdWx0IEVOVU0gdmFsdWVzIHJlc3VsdHMgaW4gbm9uLWNvbXBpbGFibGUgamF2YSBjb2RlIGlmIGphdmEgbmFtZXNwYWNlIGlzIG5vdCBkZWZpbmVkCisgICAgKiBbVEhSSUZULTMwOTNdIC0gbWluZ3cgY29tcGlsZSBmaXhlcyBmb3IgYysrIGxpYnJhcnkgMC45LjIKKyAgICAqIFtUSFJJRlQtMzA5OF0gLSBUaHJpZnQgZG9lcyBub3QgcHJldHR5IHByaW50IGJpbmFyeSB0eXBlZGVmcyB0aGUgd2F5IGl0IGRvZXMgYmluYXJ5IGZpZWxkcworICAgICogW1RIUklGVC0zMDkxXSAtIGNfZ2xpYiBzZXJ2aWNlIG1ldGhvZCBzaG91bGQgcmV0dXJuIHJlc3VsdCBmcm9tIGhhbmRsZXIgbWV0aG9kCisgICAgKiBbVEhSSUZULTMwODhdIC0gVFRocmVhZFBvb2xTZXJ2ZXIgd2l0aCBTYXNsIGF1dGggbWF5IGxlYWsgQ0xPU0VfV0FJVCBzb2NrZXQKKyAgICAqIFtUSFJJRlQtMzEwOV0gLSBDcm9zcyB0ZXN0IGxvZyBmaWxlIGNhbm5vdCBiZSBicm93c2VkIHdoZW4gc2VydmVkIGluIEhUVFAgc2VydmVyCisgICAgKiBbVEhSSUZULTMxMTNdIC0gbTQgQysrMTEgbWFjcm8gaXNzdWUKKyAgICAqIFtUSFJJRlQtMzEwNV0gLSBDKysgbGlidGhyaWZ0bmIgbGlicmFyeSBvbiBXaW5kb3dzIGJ1aWxkIGZhaWx1cmUKKyAgICAqIFtUSFJJRlQtMzExNV0gLSBVbmNvbXBpbGVhYmxlIGNvZGUgZHVlIHRvIG5hbWUgY29sbGlzaW9uIHdpdGggcHJlZGVmaW5lZCB1c2VkIHR5cGVzCisgICAgKiBbVEhSSUZULTMxMTddIC0gSmF2YSBUU1NMVHJhbnNwb3J0RmFjdG9yeSBjYW4ndCBsb2FkIGNlcnRpZmljYXRlcyB3aXRoaW4gSkFSIGFyY2hpdmUKKyAgICAqIFtUSFJJRlQtMzEwMl0gLSBjb3VsZCBub3QgbWFrZSBjaGVjayBmb3IgR28gTGlicmFyeQorICAgICogW1RIUklGVC0zMTIwXSAtIE1pbm9yIHNwZWxsaW5nIGVycm9ycyBhbmQgYW4gb3V0ZGF0ZWQgVVJMCisgICAgKiBbVEhSSUZULTMxMjFdIC0gTGlicnQgZG9lcyBub3QgZXhpc3Qgb24gT1MgWAorICAgICogW1RIUklGVC0zMTUyXSAtIENvbXBpbGVyIGVycm9yIG9uIE1hYyBPU1ggKG1pc3NpbmcgI2luY2x1ZGUgPGNzdGRsaWI+KQorICAgICogW1RIUklGVC0zMTYyXSAtIG1ha2UgZmFpbHMgZm9yIGRtZCAyLjA2NworICAgICogW1RIUklGVC0zMTY0XSAtIFRocmlmdCBDKysgbGlicmFyeSBTU0wgc29ja2V0IGJ5IGRlZmF1bHQgYWxsb3dzIGZvciB1bnNlY3VyZSBTU0x2MyBuZWdvdGlhdGlvbgorICAgICogW1RIUklGVC0zMTY4XSAtIEZpeCBNYXZlbiBQT00KKyAgICAqIFtUSFJJRlQtMzE3MF0gLSBJbml0aWFsaXNtIGNvZGUgaW4gdGhlIEdvIGNvbXBpbGVyIGNhdXNlcyBjaGFvcworICAgICogW1RIUklGVC0zMTY5XSAtIERvIG5vdCBleHBvcnQgdGhyaWZ0LlRlc3RTdHJ1Y3QgYW5kIHRocmlmdC5UZXN0RW51bSBpbiB0aHJpZnQgR28gbGlicmFyeSAKKyAgICAqIFtUSFJJRlQtMzE5MV0gLSBQZXJsIGNvbXBpbGVyIGRvZXMgbm90IGFkZCBzdXBwb3J0IGZvciB1bmV4cGVjdGVkIGV4Y2VwdGlvbiBoYW5kbGluZworICAgICogW1RIUklGVC0zMTc4XSAtIGdsaWIgQyBkb2VzIG5vdCBjb21waWxlCisgICAgKiBbVEhSSUZULTMxODldIC0gUGVybCBTZXJ2ZXJTb2NrZXQgc2hvdWxkIGFsbG93IGEgc3BlY2lmaWMgaW50ZXJmYWNlIHRvIGJlIGxpc3RlbmVkIHRvCisgICAgKiBbVEhSSUZULTMyNTJdIC0gTWlzc2luZyBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmggaW4gY3BwIE1ha2VmaWxlLCBzbyBkb2Vzbid0IGluc3RhbGwKKyAgICAqIFtUSFJJRlQtMzI1NV0gLSBUaHJpZnQgZ2VuZXJhdG9yIGRvZXNuJ3QgZXhjbHVkZSAncGFja2FnZScga2V5d29yZCBmb3IgdGhyaWZ0IHByb3BlcnR5IG5hbWVzIGJyZWFraW5nIGphdmEgYnVpbGRzCisgICAgKiBbVEhSSUZULTMyNjBdIC0gbXVsdGlwbGUgd2FybmluZ3MgaW4gY19nbGliIHR1dG9yaWFsCisgICAgKiBbVEhSSUZULTMyNTZdIC0gU29tZSBEIHRlc3QgdGltaW5ncyBhcmUgdG9vIGFnZ3Jlc3NpdmUgZm9yIHNsb3cgbWFjaGluZXMKKyAgICAqIFtUSFJJRlQtMzI1N10gLSB3YXJuaW5nOiBleHRyYSB0b2tlbnMgYXQgZW5kIG9mICNlbmRpZiBkaXJlY3RpdmUKKyAgICAqIFtUSFJJRlQtMzE4NF0gLSBUaHJpZnQgR28gbGVhdmVzIGZpbGUgZGVzY3JpcHRvcnMgb3BlbgorICAgICogW1RIUklGVC0zMjAzXSAtIERPQVAgLSBwbGVhc2UgZml4ICJPY2FtbCIgPT4gIk9DYW1sIgorICAgICogW1RIUklGVC0zMjEwXSAtICh1bmNvbXBpbGVhYmxlKSBjb2RlIGdlbmVyYXRlZCBmb3Igc2VydmVyIGV2ZW50cyB3aGlsZSBhcmUgZXZlbnRzIG5vdCBlbmFibGVkCisgICAgKiBbVEhSSUZULTMyMTVdIC0gVEpTT05Qcm90b2NvbCAnKGMrKykgdXNlcyAidGhyb3cgbmV3IiB0byB0aHJvdyBleGNlcHRpb25zIGluc3RlYWQgb2YgInRocm93IgorICAgICogW1RIUklGVC0zMjAyXSAtIEFsbG93IEhTSEFTZXJ2ZXIgdG8gY29uZmlndXJlIG1pbiBhbmQgbWF4IHdvcmtlciB0aHJlYWRzIHNlcGFyYXRlbHkuCisgICAgKiBbVEhSSUZULTMyMDVdIC0gVENvbXBhY3RQcm90b2NvbCByZXR1cm4gYSB3cm9uZyBlcnJvciB3aGVuIHRoZSBpby5FT0YgaGFwcGVucworICAgICogW1RIUklGVC0zMjA5XSAtIExHUEwgbWVudGlvbmVkIGluIGxpY2Vuc2UgZmlsZQorICAgICogW1RIUklGVC0zMTk3XSAtIGtlZXBBbGl2ZVRpbWUgaXMgaGFyZCBjb2RlZCBhcyA2MCBzZWMgaW4gVFRocmVhZFBvb2xTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzE5Nl0gLSBNaXNzcGVsbGluZyBpbiBsdWEgVEJpbmFyeVByb3RvY29sIChzdGlyY3RXcml0ZSA9PiBzdHJpY3RXcml0ZSkKKyAgICAqIFtUSFJJRlQtMzE5OF0gLSBBbGxvdyBjb25zdHJ1Y3Rpb24gb2YgVFRyYW5zcG9ydEZhY3Rvcnkgd2l0aCBhIHNwZWNpZmllZCBtYXhMZW5ndGgKKyAgICAqIFtUSFJJRlQtMzE5Ml0gLSBHbyBpbXBvcnQgcGF0aHMgY2hhbmdlZCBpbiAxLjQsIGFuZCBleHBpcmVkIEp1bmUgMQorICAgICogW1RIUklGVC0zMjcxXSAtIENvdWxkIG5vdCBmaW5kIG9yIGxvYWQgbWFpbiBjbGFzcyBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhIG9uIHNvbWUgbm9uLWVuZ2xpc2ggc3lzdGVtcworICAgICogW1RIUklGVC0zMjczXSAtIGNfZ2xpYjogR2VuZXJhdGVkIGNvZGUgdHJpZXMgdG8gY29udmVydCBiZXR3ZWVuIGZ1bmN0aW9uIGFuZCB2b2lkIHBvaW50ZXJzCisgICAgKiBbVEhSSUZULTMyNjRdIC0gRml4IEVybGFuZyAxNiBuYW1lc3BhY2VkIHR5cGVzCisgICAgKiBbVEhSSUZULTMyNzBdIC0gcmV1c2luZyBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uIGNhdXNlIGRpcnR5IFRTb2NrZXQKKyAgICAqIFtUSFJJRlQtMzI2N10gLSBjX2dsaWI6ICJDcml0aWNhbCIgZmFpbHVyZSBkdXJpbmcgdW5pdCB0ZXN0cworICAgICogW1RIUklGVC0zMjc3XSAtIFRIdHRwQ2xpZW50IGxlYWtzIGNvbm5lY3Rpb25zIGlmIGl0J3MgdXNlZCBmb3IgbXVsdGlwbGUgcmVxdWVzdHMKKyAgICAqIFtUSFJJRlQtMzI3OF0gLSBOb2RlSlM6IEZpeCBleGNlcHRpb24gc3RhY2sgdHJhY2VzIGFuZCBuYW1lcworICAgICogW1RIUklGVC0zMjc5XSAtIEZpeCBhIGJ1ZyBpbiByZXRyeV9tYXhfZGVsYXkgKE5vZGVKUykKKyAgICAqIFtUSFJJRlQtMzI4MF0gLSBJbml0aWFsaXplIHJldHJ5IHZhcmlhYmxlcyBvbiBjb25zdHJ1Y3Rpb24KKyAgICAqIFtUSFJJRlQtMzI4M10gLSBjX2dsaWI6IFR1dG9yaWFsIHNlcnZlciBhbHdheXMgZXhpdHMgd2l0aCB3YXJuaW5nCisgICAgKiBbVEhSSUZULTMyODRdIC0gY19nbGliOiBFbXB0eSBzZXJ2aWNlIHByb2R1Y2VzIHVudXNlZC12YXJpYWJsZSB3YXJuaW5nCisgICAgKiBbVEhSSUZULTE5MjVdIC0gY19nbGliIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IGNvbXBpbGUKKyAgICAqIFtUSFJJRlQtMTg0OV0gLSBhZnRlciB0cmFuc3BvcnQtPm9wZW4oKSBvcGVucyBpc09wZW4gcmV0dXJucyB0cnVlIGFuZCBuZXh0IG9wZW4oKSBnb2VzIHRocnUgd2hlbiBpdCBzaGFsbCBub3QKKyAgICAqIFtUSFJJRlQtMTg2Nl0gLSBqYXZhIGNvbXBpbGVyIGdlbmVyYXRlcyBub24tY29tcGlsaW5nIGNvZGUgd2l0aCBjb25zdCdzIGRlZmluZWQgaW4gYSB0aHJpZnQgd2hlbiBuYW1lIGluY2x1ZGVzIG5vbi1pZGVudGlmaWVyIGNoYXJzCisgICAgKiBbVEhSSUZULTE5MzhdIC0gRnVuY3Rpb25SdW5uZXIuaCAtLSB1c2VzIHdyb25nIHBhdGggZm9yIFRocmVhZC5oIHdoZW4gaW5zdGFsbGVkCisgICAgKiBbVEhSSUZULTE4NDRdIC0gUGFzc3dvcmQgc3RyaW5nIG5vdCBjbGVhcmVkCisgICAgKiBbVEhSSUZULTIwMDRdIC0gVGhyaWZ0OjpVbmlvbiB2aW9sYXRlcyA6PT0gbWV0aG9kIGNvbnRyYWN0IGFuZCBjcmFzaGVzCisgICAgKiBbVEhSSUZULTIwNzNdIC0gVGhyaWZ0IEMrKyBUSHR0cENsaWVudCBlcnJvcjogY2Fubm90IHJlZmlsbCBidWZmZXIKKyAgICAqIFtUSFJJRlQtMjEyN10gLSBBdXRvY29uZiBzY3JpcHRpbmcgZG9lcyBub3QgcHJvcGVybHkgYWNjb3VudCBmb3IgY3Jvc3MtY29tcGlsZQorICAgICogW1RIUklGVC0yMTgwXSAtIEludGVnZXIgdHlwZXMgaXNzdWVzIGluIENvY29hIGxpYiBvbiBBUk02NAorICAgICogW1RIUklGVC0yMTg5XSAtIEdvIG5lZWRzICJpc3NldCIgdG8gZnVsbHkgc3VwcG9ydCAidW5pb24iIHR5cGUgKGFuZCBvcHRpb25hbHMpCisgICAgKiBbVEhSSUZULTIxOTJdIC0gYXV0b3Rvb2xzIG9uIFJlZGhhdCBiYXNlZCBzeXN0ZW1zCisgICAgKiBbVEhSSUZULTI1NDZdIC0gY3Jvc3MgbGFuZ3VhZ2UgdGVzdHMgZmFpbHMgYXQgJ1Rlc3RNdWx0aUV4Y2VwdGlvbicgd2hlbiB1c2luZyBub2RlanMgc2VydmVyCisgICAgKiBbVEhSSUZULTI1NDddIC0gbm9kZWpzIHNlcnZlcnMgYW5kIGNsaWVudHMgZmFpbHMgdG8gY29ubmVjdCB3aXRoIGNwcCB1c2luZyBjb21wYWN0IHByb3RvY29sCisgICAgKiBbVEhSSUZULTI1NDhdIC0gTm9kZWpzIHNlcnZlcnMgYW5kIGNsaWVudHMgZG9lcyBub3Qgd29yayBwcm9wZXJseSB3aXRoICAtc3NsCisgICAgKiBbVEhSSUZULTE0NzFdIC0gdG9TdHJpbmcoKSBkb2VzIG5vdCBwcmludCBCeXRlQnVmZmVyIHZhbHVlcyB3aGVuIG5lc3RlZCBpbiBhIExpc3QKKyAgICAqIFtUSFJJRlQtMTIwMV0gLSBnZXRhZGRyaW5mbyByZXNvdXJjZSBsZWFrCisgICAgKiBbVEhSSUZULTYxNV0gLSBUVGhyZWFkUG9vbFNlcnZlciBkb2Vzbid0IGNhbGwgdGFza19kb25lIGFmdGVyIHB1bGxpbmcgdGFza3MgZnJvbSBpdCdzIGNsaWVudHMgcXVldWUKKyAgICAqIFtUSFJJRlQtMTYyXSAtIFRocmlmdCBzdHJ1Y3R1cmVzIGFyZSB1bmhhc2hhYmxlLCBwcmV2ZW50aW5nIHRoZW0gZnJvbSBiZWluZyB1c2VkIGFzIHNldCBlbGVtZW50cworICAgICogW1RIUklGVC04MTBdIC0gQ3Jhc2hlZCBjbGllbnQgb24gVFNvY2tldDo6Y2xvc2UgdW5kZXIgbG9hZHMKKyAgICAqIFtUSFJJRlQtNTU3XSAtIGNoYXJzZXQgcHJvYmxlbSB3aXRoIGZpbGUgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQKKyAgICAqIFtUSFJJRlQtMjMzXSAtIElETCBkb2Vzbid0IHN1cHBvcnQgbmVnYXRpdmUgaGV4IGxpdGVyYWxzCisgICAgKiBbVEhSSUZULTE2NDldIC0gY29udHJpYi96ZXJvbXEgZG9lcyBub3QgYnVpbGQgaW4gMC44LjAKKyAgICAqIFtUSFJJRlQtMTY0Ml0gLSBNaXNjYWxjdWxhdGlvbiBsZWFkIHRvIHRocm93IHVuZXhwZWN0ZWQgIlRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCIob3IgY2FsbGVkICJFQUdBSU4gKHRpbWVkIG91dCkiKSBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMTU4N10gLSBUU29ja2V0OjpzZXRSZWN2VGltZW91dCBlcnJvcgorICAgICogW1RIUklGVC0xMjQ4XSAtIHBvaW50ZXIgc3VidHJhY3Rpb24gaW4gVE1lbW9yeUJ1ZmZlciByZWxpZXMgb24gdW5kZWZpbmVkIGJlaGF2aW9yCisgICAgKiBbVEhSSUZULTE3NzRdIC0gU2FzbCBUcmFuc3BvcnQgY2xpZW50IHdvdWxkIGhhbmcgd2hlbiB0cnlpbmcgdG8gY29ubmVjdCBub24tc2FzbCB0cmFuc3BvcnQgc2VydmVyCisgICAgKiBbVEhSSUZULTE3NTRdIC0gUmFuZ2VFcnJvciBpbiBidWZmZXIgaGFuZGxpbmcKKyAgICAqIFtUSFJJRlQtMTYxOF0gLSBzdGF0aWMgc3RydWN0TWFwIGluIEZpZWxkTWV0YURhdGEgaXMgbm90IHRocmVhZCBzYWZlIGFuZCBjYW4gbGVhZCB0byBkZWFkbG9ja3MKKyAgICAqIFtUSFJJRlQtMjMzNV0gLSB0aHJpZnQgaW5jb21wYXRpYmlsaXR5IHdpdGggcHk6dG9ybmFkbyBhcyBzZXJ2ZXIsIGphdmEgYXMgY2xpZW50CisgICAgKiBbVEhSSUZULTI4MDNdIC0gVENQX0RFRkVSX0FDQ0VQVCBub3Qgc3VwcG9ydGVkIHdpdGggZG9tYWluIHNvY2tldHMKKyAgICAqIFtUSFJJRlQtMjc5OV0gLSBCdWlsZCBQcm9ibGVtKHMpOiBsZDogbGlicmFyeSBub3QgZm91bmQgZm9yIC1sOmxpYmJvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsuYQorICAgICogW1RIUklGVC0yODAxXSAtIEMrKyB0ZXN0IHN1aXRlIGNvbXBpbGF0aW9uIHdhcm5pbmdzCisgICAgKiBbVEhSSUZULTI4MDJdIC0gQysrIHR1dG9yaWFsIGNvbXBpbGF0aW9uIHdhcm5pbmdzCisgICAgKiBbVEhSSUZULTI3OTVdIC0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5jOiAnZGVyZWZlcmVuY2luZyB0eXBlLXB1bm5lZCBwb2ludGVyIHdpbGwgYnJlYWsgc3RyaWN0LWFsaWFzaW5nIHJ1bGVzJworICAgICogW1RIUklGVC0yODE3XSAtIFRTaW1wbGVKU09OUHJvdG9jb2wgcmVhZHMgYmV5b25kIGVuZCBvZiBtZXNzYWdlCisgICAgKiBbVEhSSUZULTI4MjZdIC0gaHRtbDpzdGFuZGFsb25lIHNvbWV0aW1lcyBpZ25vcmVkCisgICAgKiBbVEhSSUZULTI4MjldIC0gU3VwcG9ydCBoYXhlbGliIGluc3RhbGxhdGlvbiB2aWEgZ2l0aHViCisgICAgKiBbVEhSSUZULTI4MjhdIC0gc2xpZ2h0bHkgd3JvbmcgaGVscCBzY3JlZW4gaW5kZW50CisgICAgKiBbVEhSSUZULTI4MzFdIC0gUmVtb3ZlcyBkZWFkIGNvZGUgaW4gd2ViX3NlcnZlci5qcyBpbnRyb2R1Y2VkIGluIFRIUklGVC0yODE5CisgICAgKiBbVEhSSUZULTI4MjNdIC0gQWxsIEpTLXRlc3RzIGFyZSBmYWlsaW5nIHdoZW4gcnVuIHdpdGggZ3J1bnQgdGVzdAorICAgICogW1RIUklGVC0yODI3XSAtIFRocmlmdCAwLjkuMiBmYWlscyB0byBjb21waWxlIG9uIFlvc2VtaXRlIGR1ZSB0byB0cjEvZnVuY3Rpb25hbCBpbmNsdWRlIGluIFByb2Nlc3NvclRlc3QuY3BwCisgICAgKiBbVEhSSUZULTI4NDNdIC0gQXV0b21ha2UgY29uZmlndXJlLmFjIGhhcyBwb3NzaWJsZSB0eXBvIHJlbGF0ZWQgdG8gSmF2YQorICAgICogW1RIUklGVC0yODEzXSAtIG11bHRpcGxlIGhheGUgbGlicmFyeSBmaXhlcy9pbXByb3ZlbWVudHMKKyAgICAqIFtUSFJJRlQtMjgyNV0gLSBTdXBwbHlpbmcgdW5pY29kZSB0byBweXRob24gVGhyaWZ0IGNsaWVudCBjYW4gY2F1c2UgbmV4dCByZXF1ZXN0IGFyZ3VtZW50cyB0byBnZXQgb3ZlcndyaXR0ZW4KKyAgICAqIFtUSFJJRlQtMjg0MF0gLSBDYWJhbCBmaWxlIHBvaW50cyB0byBMSUNFTlNFIGZpbGUgb3V0c2lkZSB0aGUgcGF0aCBvZiB0aGUgSGFza2VsbCBwcm9qZWN0LgorICAgICogW1RIUklGVC0yODE4XSAtIFRyYWlsaW5nIGNvbW1hcyBpbiBhcnJheQorICAgICogW1RIUklGVC0yODMwXSAtIENsZWFuIHVwIGFudCB3YXJuaW5ncyBpbiB0dXRvcmlhbCBkaXIKKyAgICAqIFtUSFJJRlQtMjg0Ml0gLSBFcmxhbmcgdGhyaWZ0IGNsaWVudCBoYXMgaW5maW5pdGUgdGltZW91dAorICAgICogW1RIUklGVC0yODEwXSAtIERvIG5vdCBsZWF2ZSB0aGUgdW5kZXJseWluZyBTZXJ2ZXJTb2NrZXQgb3BlbiBpZiBjb25zdHJ1Y3Rpb24gb2YgVFNlcnZlclNvY2tldCBmYWlscworICAgICogW1RIUklGVC0yODEyXSAtIEdvIHNlcnZlciBhZGRpbmcgcmVkdW5kYW50IGJ1ZmZlcmluZyBsYXllcgorICAgICogW1RIUklGVC0yODM5XSAtIFRGcmFtZWRUcmFuc3BvcnQgcmVhZCBidWcKKyAgICAqIFtUSFJJRlQtMjg0NF0gLSBOb2RlanMgc3VwcG9ydCBicm9rZW4gd2hlbiBydW5uaW5nIHVuZGVyIEJyb3dzZXJpZnkKKyAgICAqIFtUSFJJRlQtMjgxNF0gLSBhcmdzL3Jlc3VsdCBjbGFzc2VzIG5vdCBmb3VuZCB3aGVuIG5vIG5hbWVzcGFjZSBpcyBzZXQKKyAgICAqIFtUSFJJRlQtMjg0N10gLSBmdW5jdGlvbiBJZlZhbHVlKCkgaXMgYSBkdXBsaWNhdGUgb2YgU3lzdGVtLlN0clV0aWxzLklmVGhlbgorICAgICogW1RIUklGVC0yODQ4XSAtIGNlcnRhaW4gRGVscGhpIHRlc3RzIGRvIG5vdCBidWlsZCBpZiBUeXBlUmVnaXN0cnkgaXMgdXNlZAorICAgICogW1RIUklGVC0yODU0XSAtIEdvIFN0cnVjdCB3cml0ZXIgYW5kIHJlYWRlciBsb29zZXMgaW1wb3J0YW50IGVycm9yIGluZm9ybWF0aW9uCisgICAgKiBbVEhSSUZULTI4NThdIC0gRW5hYmxlIGhlYWRlciBmaWVsZCBjYXNlIGluc2Vuc2l0aXZlIG1hdGNoIGluIFRIdHRwU2VydmVyCisgICAgKiBbVEhSSUZULTI4NTddIC0gQyMgZ2VuZXJhdG9yIGNyZWF0ZXMgdW5jb21waWxhYmxlIGNvZGUgZm9yIHN0cnVjdCBjb25zdGFudHMKKyAgICAqIFtUSFJJRlQtMjg2MF0gLSBEZWxwaGkgc2VydmVyIGNsb3NlcyBjb25uZWN0aW9uIG9uIHVuZXhwZWN0ZWQgZXhjZXB0aW9ucworICAgICogW1RIUklGVC0yODY4XSAtIEVuaGFuY2UgZXJyb3IgaGFuZGxpbmcgaW4gdGhlIEdvIGNsaWVudCAKKyAgICAqIFtUSFJJRlQtMjg3OV0gLSBUTWVtb3J5QnVmZmVyOiB1c2luZyBsdWEgc3RyaW5nIGluIHdyb25nIHdheQorICAgICogW1RIUklGVC0yODUxXSAtIFJlbW92ZSBzdHJhbmdlIHB1YmxpYyBQZWVrKCkgZnJvbSBHbyB0cmFuc3BvcnRzCisgICAgKiBbVEhSSUZULTI4NTJdIC0gQmV0dGVyIE9wZW4vSXNPcGVuL0Nsb3NlIGJlaGF2aW9yIGZvciBTdHJlYW1UcmFuc3BvcnQuCisgICAgKiBbVEhSSUZULTI4NzFdIC0gTWlzc2luZyBzZW1pY29sb24gaW4gdGhyaWZ0LmpzCisgICAgKiBbVEhSSUZULTI4NzJdIC0gVGhyZWFkTWFuYWdlciBkZWFkbG9jayBmb3IgdGFzayBleHBpcmF0aW9uCisgICAgKiBbVEhSSUZULTI4ODFdIC0gSGFuZGxlIGVycm9ycyBmcm9tIEFjY2VwdCgpIGNvcnJlY3RseQorICAgICogW1RIUklGVC0yODQ5XSAtIFNwZWxsIGVycm9ycyByZXBvcnRlZCBieSBjb2Rlc3BlbGwgdG9vbAorICAgICogW1RIUklGVC0yODcwXSAtIEMrKyBUSlNPTlByb3RvY29sIHVzaW5nIGxvY2FsZSBkZXBlbmRlbnQgZm9ybWF0dGluZworICAgICogW1RIUklGVC0yODgyXSAtIEx1YSBHZW5lcmF0b3I6IHVzaW5nIHN0cmluZy5sZW4gZnVudGlvbiB0byBnZXQgc3RydWN0KG1hcCxsaXN0LHNldCkgc2l6ZQorICAgICogW1RIUklGVC0yODY0XSAtIEpTT04gZ2VuZXJhdG9yIG1pc3NpbmcgZnJvbSBWaXN1YWwgU3R1ZGlvIGJ1aWxkIHByb2plY3QgCisgICAgKiBbVEhSSUZULTI4NzhdIC0gR28gdmFsaWRhdGlvbiBzdXBwb3J0IG9mIHJlcXVpcmVkIGZpZWxkcworICAgICogW1RIUklGVC0yODczXSAtIFRQaXBlIGFuZCBUUGlwZVNlcnZlciBkb24ndCBjb21waWxlIG9uIFdpbmRvd3Mgd2l0aCBVTklDT0RFIGVuYWJsZWQKKyAgICAqIFtUSFJJRlQtMjg4OF0gLSBpbXBvcnQgb2YgPGxpbWl0cz4gaXMgbWlzc2luZyBpbiBKU09OIGdlbmVyYXRvcgorICAgICogW1RIUklGVC0yOTAwXSAtIFB5dGhvbiBUSHR0cENsaWVudCBkb2VzIG5vdCByZXNldCBzb2NrZXQgdGltZW91dCBvbiBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMjkwN10gLSAnbnRvaGxsJyBtYWNybyByZWRlZmluZWQKKyAgICAqIFtUSFJJRlQtMjg4NF0gLSBNYXAgZG9lcyBub3Qgc2VyaWFsaXplIGNvcnJlY3RseSBmb3IgSlNPTiBwcm90b2NvbCBpbiBHbyBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTI4ODddIC0gLS13aXRoLW9wZW5zc2wgY29uZmlndXJlIGZsYWcgaXMgaWdub3JlZAorICAgICogW1RIUklGVC0yODk0XSAtIFBIUCBqc29uIHNlcmlhbGl6ZXIgc2tpcHMgbWFwcyB3aXRoIGludC9ib29sIGtleXMKKyAgICAqIFtUSFJJRlQtMjkwNF0gLSBqc29uX3Byb3RvY29sX3Rlc3QuZ28gZmFpbHMKKyAgICAqIFtUSFJJRlQtMjkwNl0gLSBsaWJyYXJ5IG5vdCBmb3VuZCBmb3IgLWw6bGliYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yay5hCisgICAgKiBbVEhSSUZULTI4OTBdIC0gYmluYXJ5IGRhdGEgbWF5IGxvc2UgYnl0ZXMgd2l0aCBKU09OIHRyYW5zcG9ydCB1bmRlciBzcGVjaWZpYyBjaXJjdW1zdGFuY2VzCisgICAgKiBbVEhSSUZULTI4OTFdIC0gYmluYXJ5IGRhdGEgbWF5IGNhdXNlIGEgZmFpbHVyZSB3aXRoIEpTT04gdHJhbnNwb3J0IHVuZGVyIHNwZWNpZmljIGNpcmN1bXN0YW5jZXMKKyAgICAqIFtUSFJJRlQtMjkwMV0gLSBGaXggZm9yIGdlbmVyYXRlZCBUeXBlU2NyaXB0IGZ1bmN0aW9ucyArIGluZGVudGF0aW9uIG9mIEphdmFTY3JpcHQgbWFwcworICAgICogW1RIUklGVC0yOTE2XSAtIG1ha2UgY2hlY2sgZmFpbHMgZm9yIEQgbGFuZ3VhZ2UKKyAgICAqIFtUSFJJRlQtMjkxOF0gLSBSYWNlIGNvbmRpdGlvbiBpbiBQeXRob24gVFByb2Nlc3NQb29sU2VydmVyIHRlc3QKKyAgICAqIFtUSFJJRlQtMjkyMF0gLSBFcmxhbmcgVGhyaWZ0IHRlc3QgdXNlcyB3cm9uZyBJREwgZmlsZQorICAgICogW1RIUklGVC0yOTIyXSAtICRUUklBTCBpcyB1c2VkIHdpdGggUHl0aG9uIHRlc3RzIGJ1dCBub3QgdGVzdGVkIGFjY29yZGluZ2x5CisgICAgKiBbVEhSSUZULTI5MTJdIC0gQXV0b3Rvb2wgYnVpbGQgZm9yIEMrKyBRdCBsaWJyYXJ5IGlzIGludmFsaWQKKyAgICAqIFtUSFJJRlQtMjkxNF0gLSBleHBsaWNpdCBkZXBlbmRlbmN5IHRvIEx1YTUuMiBmYWlscyBvbiBzb21lIHN5c3RlbXMKKyAgICAqIFtUSFJJRlQtMjkxMF0gLSBsaWJldmVudCBpcyBub3QgcmVhbGx5IG9wdGlvbmFsCisgICAgKiBbVEhSSUZULTI5MTFdIC0gZml4IGMrKyB2ZXJzaW9uIHplcm9tcSB0cmFuc3BvcnQsIHRoZSBvbGQgdmVyc2lvbiBjYW5ub3Qgd29yaworICAgICogW1RIUklGVC0yOTE1XSAtIEx1YSBnZW5lcmF0b3IgbWlzc2luZyBmcm9tIFZpc3VhbCBTdHVkaW8gYnVpbGQgcHJvamVjdAorICAgICogW1RIUklGVC0yOTE3XSAtICJtYWtlIGNsZWFuIiBicmVha3MgdGVzdC9jX2dsaWIKKyAgICAqIFtUSFJJRlQtMjkxOV0gLSBIYXhlIHRlc3Qgc2VydmVyIHRpbWVvdXQgdG9vIGxhcmdlCisgICAgKiBbVEhSSUZULTI5MjNdIC0gSmF2YVNjcmlwdCBjbGllbnQgYXNzdW1lcyBhIG1lc3NhZ2UgYmVpbmcgd3JpdHRlbgorICAgICogW1RIUklGVC0yOTI0XSAtIFROb25ibG9ja2luZ1NlcnZlciBjcmFzaGVzIHdoZW4gdXNlci1wcm92aWRlZCBldmVudF9iYXNlIGlzIHVzZWQKKyAgICAqIFtUSFJJRlQtMjkyNV0gLSBDTWFrZSBidWlsZCBkb2VzIG5vdCB3b3JrIHdpdGggT3BlblNTTCBub3IgYW55dGhpbmcgaW5zdGFsbGVkIGluIG5vbi1zeXN0ZW0gbG9jYXRpb24KKyAgICAqIFtUSFJJRlQtMjkzMV0gLSBBY2Nlc3MgdG8gdW5kZWNsYXJlZCBzdGF0aWMgcHJvcGVydHk6IFRocmlmdFxQcm90b2NvbFxUUHJvdG9jb2w6OiRUQklOQVJZUFJPVE9DT0xBQ0NFTEVSQVRFRAorICAgICogW1RIUklGVC0yODkzXSAtIENNYWtlIGJ1aWxkIGZhaWxzIHdpdGggYm9vc3QgdGhyZWFkIG9yIHN0ZCB0aHJlYWQKKyAgICAqIFtUSFJJRlQtMjkwMl0gLSBHZW5lcmF0ZWQgY19nbGliIGNvZGUgZG9lcyBub3QgY29tcGlsZSB3aXRoIGNsYW5nCisgICAgKiBbVEhSSUZULTI5MDNdIC0gUXQ0IGxpYnJhcnkgYnVpbHQgd2l0aCBDTWFrZSBkb2VzIG5vdCB3b3JrCisgICAgKiBbVEhSSUZULTI5NDJdIC0gQ1NoYXJwIGdlbmVyYXRlIGludmFsaWQgY29kZSBmb3IgcHJvcGVydHkgbmFtZWQgcmVhZCBvciB3cml0ZQorICAgICogW1RIUklGVC0yOTMyXSAtIE5vZGUuanMgVGhyaWZ0IGNvbm5lY3Rpb24gbGlicmFyaWVzIHRocm93IEV4Y2VwdGlvbnMgaW50byBldmVudCBlbWl0dGVyCisgICAgKiBbVEhSSUZULTI5MzNdIC0gdjAuOS4yOiBkb3VibGVzIGVuY29kZWQgaW4gbm9kZSB3aXRoIGNvbXBhY3QgcHJvdG9jb2wgY2Fubm90IGJlIGRlY29kZWQgYnkgcHl0aG9uCisgICAgKiBbVEhSSUZULTI5MzRdIC0gY3JlYXRlU2VydmVyIHNpZ25hdHVyZSBtaXNtYXRjaAorICAgICogW1RIUklGVC0yOTgxXSAtIElETCB3aXRoIG5vIG5hbWVzcGFjZSBwcm9kdWNlcyB1bnBhcnNhYmxlIFBIUAorICAgICogW1RIUklGVC0yOTk5XSAtIEFkZGl0aW9uIG9mIC5naXRhdHRyaWJ1dGVzIHRleHQgYXV0byBpbiBUSFJJRlQtMjcyNCBjYXVzZXMgbW9kaWZpZWQgZmlsZXMgb24gY2hlY2tvdXQKKyAgICAqIFtUSFJJRlQtMjk0OV0gLSB0eXBvIGluIGNvbXBpbGVyL2NwcC9SRUFETUUubWQKKyAgICAqIFtUSFJJRlQtMjk1N10gLSB3YXJuaW5nOiBzb3VyY2UgZmlsZSAlcyBpcyBpbiBhIHN1YmRpcmVjdG9yeSwgYnV0IG9wdGlvbiAnc3ViZGlyLW9iamVjdHMnIGlzIGRpc2FibGVkCisgICAgKiBbVEhSSUZULTI5NTNdIC0gVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydCBpcyBub3QgU3RvcCgpYWJsZQorICAgICogW1RIUklGVC0yOTYyXSAtIERvY2tlciBUaHJpZnQgZW52IGZvciBkZXZlbG9wbWVudCBhbmQgdGVzdGluZworICAgICogW1RIUklGVC0yOTcxXSAtIEMrKyB0ZXN0IGFuZCB0dXRvcmlhbCBwYXJhbGxlbCBidWlsZCBpcyB1bnN0YWJsZQorICAgICogW1RIUklGVC0yOTcyXSAtIE1pc3NpbmcgYmFja3NsYXNoIGluIGxpYi9jcHAvdGVzdC9NYWtlZmlsZS5hbQorICAgICogW1RIUklGVC0yOTUxXSAtIEZpeCBFcmxhbmcgbmFtZSBjb25mbGljdCB0ZXN0CisgICAgKiBbVEhSSUZULTI5NTVdIC0gVXNpbmcgbGlzdCBvZiB0eXBlZGVmcyBkb2VzIG5vdCBjb21waWxlIG9uIEdvCisgICAgKiBbVEhSSUZULTI5NjBdIC0gbmFtZXNwYWNlIHJlZ3Jlc3Npb24gZm9yIFJ1YnkKKyAgICAqIFtUSFJJRlQtMjk1OV0gLSBub2RlanM6IGZpeCBiaW5hcnkgdW5pdCB0ZXN0cworICAgICogW1RIUklGVC0yOTY2XSAtIG5vZGVqczogRml4IGJhZCByZWZlcmVuY2VzIHRvIFRQcm90b2NvbEV4Y2VwdGlvbiBhbmQgVFByb3RvY29sRXhjZXB0aW9uVHlwZQorICAgICogW1RIUklGVC0yOTcwXSAtIGdydW50LWpzZG9jIGZhaWxzIGR1ZSB0byBkZXBlbmRlbmN5IGlzc3VlcworICAgICogW1RIUklGVC0zMDAxXSAtIEMjIEVxdWFscyBmYWlscyBmb3IgYmluYXJ5IGZpZWxkcyAoYnl0ZVtdKQorICAgICogW1RIUklGVC0zMDAzXSAtIE1pc3NpbmcgTElDRU5TRSBmaWxlIHByZXZlbnRzIHBhY2thZ2UgZnJvbSBiZWluZyBpbnN0YWxsZWQKKyAgICAqIFtUSFJJRlQtMzAwOF0gLSBOb2RlLmpzIHNlcnZlciBkb2VzIG5vdCBmdWxseSBzdXBwb3J0IGV4Y2VwdGlvbgorICAgICogW1RIUklGVC0zMDA3XSAtIFRyYXZpcyBidWlsZCBpcyBicm9rZW4gYmVjYXVzZSBvZiBkaXJlY3RvcnkgY29uZmxpY3QKKyAgICAqIFtUSFJJRlQtMzAwOV0gLSBUU1NMU29ja2V0IGRvZXMgbm90IHVzZSB0aGUgY29ycmVjdCBob3N0bmFtZSAoYnJlYWtzIGNlcnRpZmljYXRlIGNoZWNrcykKKyAgICAqIFtUSFJJRlQtMzAxMV0gLSBDIyB0ZXN0IHNlcnZlciB0ZXN0RXhjZXB0aW9uKCkgbm90IGltcGxlbWVudGVkIGFjY29yZGluZyB0byBzcGVjcworICAgICogW1RIUklGVC0zMDEyXSAtIFRpbWluZyBwcm9ibGVtcyBpbiBOYW1lZFBpcGUgaW1wbGVtZW50YXRpb24gZHVlIHRvIHVubmVjZXNzYXJ5IG9wZW4vY2xvc2UKKyAgICAqIFtUSFJJRlQtMzAxOV0gLSBHb2xhbmcgZ2VuZXJhdG9yIG1pc3NpbmcgZG9jc3RyaW5nIGZvciBzdHJ1Y3RzCisgICAgKiBbVEhSSUZULTMwMjFdIC0gU2VydmljZSByZW1vdGUgdG9vbCBkb2VzIG5vdCBpbXBvcnQgc3R1YiBwYWNrYWdlIHdpdGggcGFja2FnZSBwcmVmaXgKKyAgICAqIFtUSFJJRlQtMzAyNl0gLSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgZG9lcyBub3QgaGF2ZSBhIGNvbnN0cnVjdG9yCisgICAgKiBbVEhSSUZULTMwMjhdIC0gUmVncmVzc2lvbiBjYXVzZWQgYnkgVEhSSUZULTIxODAKKyAgICAqIFtUSFJJRlQtMzAxN10gLSBvcmRlciBvZiBtYXAga2V5L3ZhbHVlIHR5cGVzIGluY29ycmVjdCBmb3Igb25lIENUT1IKKyAgICAqIFtUSFJJRlQtMzAyMF0gLSBDYW5ub3QgY29tcGlsZSB0aHJpZnQgYXMgQysrMDMKKyAgICAqIFtUSFJJRlQtMzAyNF0gLSBVc2VyLUFnZW50ICJCYXR0bGVOZXQiIHVzZWQgaW4gc29tZSBUaHJpZnQgbGlicmFyeSBmaWxlcworICAgICogW1RIUklGVC0zMDQ3XSAtIFVuZXZlbiBjYWxscyB0byBpbmRlbnRfdXAgYW5kIGluZGVudF9kb3duIGluIENvY29hIGdlbmVyYXRvcgorICAgICogW1RIUklGVC0zMDQ4XSAtIE5vZGVKUyBkZWNvZGluZyBvZiBJNjQgaXMgaW5jb25zaXN0ZW50IGFjcm9zcyBwcm90b2NvbHMKKyAgICAqIFtUSFJJRlQtMzA0M10gLSBnbyBjb21waWxlciBnZW5lcmF0b3IgdXNlcyBub24gQysrOTggY29kZQorICAgICogW1RIUklGVC0zMDQ0XSAtIERvY2tlciBSRUFETUUubWQgcGF0aHMgdG8gRG9ja2VyZmlsZXMgYXJlIGluY29ycmVjdAorICAgICogW1RIUklGVC0zMDQwXSAtIGJvd2VyLmpzb24gd3JvbmcgIm1haW4iIHBhdGgKKyAgICAqIFtUSFJJRlQtMzA1MV0gLSBHbyBUaHJpZnQgZ2VuZXJhdG9yIGNyZWF0ZXMgYmFkIGdvIGNvZGUKKyAgICAqIFtUSFJJRlQtMzA1N10gLSBKYXZhIGNvbXBpbGVyIGJ1aWxkIGlzIGJyb2tlbgorICAgICogW1RIUklGVC0zMDYxXSAtIEMrKyBUU1NMU29ja2V0IHNodXRkb3duIGRlbGF5L3Z1bG5lcmFiaWxpdHkKKyAgICAqIFtUSFJJRlQtMzA2Ml0gLSBDKysgVFNlcnZlclNvY2tldCBpbnZhbGlkIHBvcnQgbnVtYmVyIChvdmVyIDk5OTk5OSkgY2F1c2VzIHN0YWNrIGNvcnJ1cHRpb24KKyAgICAqIFtUSFJJRlQtMzA2NV0gLSBVcGRhdGUgbGlidGhyaWZ0IGRlcGVuZGVuY2llcyAoc2xmNGosIGh0dHBjb3JlLCBodHRwY2xpZW50KQorICAgICogW1RIUklGVC0zMjQ0XSAtIFR5cGVTY3JpcHQ6IGZpeCBuYW1lc3BhY2Ugb2YgaW5jbHVkZWQgdHlwZXMKKyAgICAqIFtUSFJJRlQtMzI0Nl0gLSBSZWR1Y2UgdGhlIG51bWJlciBvZiB0cml2aWFsIHdhcm5pbmdzIGluIFdpbmRvd3MgQysrIENNYWtlIGJ1aWxkcworICAgICogW1RIUklGVC0zMjI0XSAtIEZpeCBUTmFtZWRQaXBlU2VydmVyIHVucHJlZGljdGFibGUgYmVoYXZpb3Igb24gYWNjZXB0CisgICAgKiBbVEhSSUZULTMyMzBdIC0gUHl0aG9uIGNvbXBpbGVyIGdlbmVyYXRlcyB3cm9uZyBjb2RlIGlmIHRoZXJlIGlzIGZ1bmN0aW9uIHRocm93aW5nIGEgdHlwZWRlZiBvZiBleGNlcHRpb24gd2l0aCBhbm90aGVyIG5hbWVzcGFjZQorICAgICogW1RIUklGVC0zMjM2XSAtIE1heFNraXBEZXB0aCBuZXZlciBjaGVja2VkCisgICAgKiBbVEhSSUZULTMyMzldIC0gTGltaXQgcmVjdXJzaW9uIGRlcHRoCisgICAgKiBbVEhSSUZULTMyNDFdIC0gZmF0YWwgZXJyb3I6IHJ1bnRpbWU6IGNhbm5vdCBtYXAgcGFnZXMgaW4gYXJlbmEgYWRkcmVzcyBzcGFjZQorICAgICogW1RIUklGVC0zMjQyXSAtIE9TR2kgSW1wb3J0LVBhY2thZ2UgZGlyZWN0aXZlIGlzIG1pc3NpbmcgdGhlIEFwYWNoZSBIVFRQIHBhY2thZ2VzCisgICAgKiBbVEhSSUZULTMyMzRdIC0gTGltaXQgcmVjdXJzaW9uIGRlcHRoCisgICAgKiBbVEhSSUZULTMyMjJdIC0gVHlwZVNjcmlwdDogR2VuZXJhdGVkIEVudW1zIGFyZSBxdW90ZWQKKyAgICAqIFtUSFJJRlQtMzIyOV0gLSB1bmV4cGVjdGVkIFRpbWVvdXQgZXhjZXB0aW9uIHdoZW4gZGVzaXJlZCBieXRlcyBhcmUgb25seSBwYXJ0aWFsbHkgYXZhaWxhYmxlCisgICAgKiBbVEhSSUZULTMyMzFdIC0gQ1BQOiBMaW1pdCByZWN1cnNpb24gZGVwdGggdG8gNjQKKyAgICAqIFtUSFJJRlQtMzIzNV0gLSBMaW1pdCByZWN1cnNpb24gZGVwdGgKKyAgICAqIFtUSFJJRlQtMzE3NV0gLSBmYXN0YmluYXJ5LmMgcHl0aG9uIGRlc2VyaWFsaXplIGNhbiBjYXVzZSBodWdlIGFsbG9jYXRpb25zIGZyb20gZ2FyYmFnZQorICAgICogW1RIUklGVC0zMTc2XSAtIFVuaW9uIGluY29ycmVjdGx5IGltcGxlbWVudHMgPT0KKyAgICAqIFtUSFJJRlQtMzE3N10gLSBGYWlscyB0byBydW4gcmFrZSB0ZXN0CisgICAgKiBbVEhSSUZULTMxODBdIC0gbHVhIHBsdWdpbjogZnJhbWVkIHRyYW5zcG9ydCBkbyBub3Qgd29yaworICAgICogW1RIUklGVC0zMTc5XSAtIGx1YSBwbHVnaW4gY2FudCBjb25uZWN0IHRvIHJlbW90ZSBzZXJ2ZXIgYmVjYXVzZSBmdW5jdGlvbiBsX3NvY2tldF9jcmVhdGVfYW5kX2Nvbm5lY3QgYWx3YXlzIGJpbmQgc29ja2V0IHRvIGxvY2FsaG9zdAorICAgICogW1RIUklGVC0zMjQ4XSAtIFR5cGVTY3JpcHQ6IGFkZGl0aW9uYWwgY29tbWEgaW4gbWV0aG9kIHNpZ25hdHVyZSB3aXRob3V0IHBhcmFtZXRlcnMKKyAgICAqIFtUSFJJRlQtMzMwMl0gLSBHbyBKU09OIHByb3RvY29sIHNob3VsZCBlbmNvZGUgVGhyaWZ0IGJ5dGUgdHlwZSBhcyBzaWduZWQgaW50ZWdlciBzdHJpbmcKKyAgICAqIFtUSFJJRlQtMzI5N10gLSBjX2dsaWI6IGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgaXMgbm90IGdlbmVyYXRlZAorICAgICogW1RIUklGVC0zMjk0XSAtIFRabGliVHJhbnNwb3J0IGZvciBKYXZhIGRvZXMgbm90IHdyaXRlIGRhdGEgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTMyOTZdIC0gR28gY3Jvc3MgdGVzdCBkb2VzIG5vdCBjb25mb3JtIHRvIHNwZWMKKyAgICAqIFtUSFJJRlQtMzI5NV0gLSBDIyBsaWJyYXJ5IGRvZXMgbm90IGJ1aWxkIG9uIE1vbm8gNC4wLjIuNSBvciBsYXRlcgorICAgICogW1RIUklGVC0zMjkzXSAtIEphdmFTY3JpcHQ6IG51bGwgdmFsdWVzIHR1cm4gaW50byBlbXB0eSBzdHJ1Y3RzIGluIGNvbnN0cnVjdG9yCisgICAgKiBbVEhSSUZULTMzMTBdIC0gbGliL2VybC9SRUFETUUubWQgaGFzIGluY29ycmVjdCBmb3JtYXR0aW5nCisgICAgKiBbVEhSSUZULTMzMTldIC0gQ1NoYXJwIHR1dG9yaWFsIHdpbGwgbm90IGJ1aWxkIHVzaW5nIHRoZSAqLnNsbgorICAgICogW1RIUklGVC0zMzM1XSAtIFJ1Ynkgc2VydmVyIGRvZXMgbm90IGhhbmRsZSBwcm9jZXNzb3IgZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTMzMzhdIC0gU3RyYXkgdW5kZXJzY29yZSBpbiBnZW5lcmF0ZWQgZ28gd2hlbiBzZXJ2aWNlIG5hbWUgc3RhcnRzIHdpdGggIk5ldyIKKyAgICAqIFtUSFJJRlQtMzMyNF0gLSBVcGRhdGUgR28gRG9jcyBmb3IgcHVsbGluZyBhbGwgcGFja2FnZXMKKyAgICAqIFtUSFJJRlQtMzM0NV0gLSBDbGllbnRzIGJsb2NrZWQgaW5kZWZpbml0ZWx5IHdoZW4gYSBqYXZhLmxhbmcuRXJyb3IgaXMgdGhyb3duCisgICAgKiBbVEhSSUZULTMzMzJdIC0gbWFrZSBkaXN0IGZhaWxzIG9uIGNsZWFuIGJ1aWxkCisgICAgKiBbVEhSSUZULTMzMjZdIC0gVGVzdHMgZG8gbm90IGNvbXBpbGUgdW5kZXIgKkJTRAorICAgICogW1RIUklGVC0zMzM0XSAtIE1hcmtkb3duIG5vdGF0aW9uIG9mIHByb3RvY29sIHNwZWMgaXMgbWFsZm9ybWVkCisgICAgKiBbVEhSSUZULTMzMzFdIC0gd2FybmluZzogw6LigqzLnGV0eXBlw6LigqzihKIgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZCBpbiB0aGlzIGZ1bmN0aW9uCisgICAgKiBbVEhSSUZULTMzNDldIC0gUHl0aG9uIHNlcnZlciBkb2VzIG5vdCBoYW5kbGUgcHJvY2Vzc29yIGV4Y2VwdGlvbgorICAgICogW1RIUklGVC0zMzQzXSAtIEZpeCBoYXNrZWxsIFJFQURNRQorICAgICogW1RIUklGVC0zMzQwXSAtIFB5dGhvbjogZW5hYmxlIGpzb24gdGVzdHMgYWdhaW4KKyAgICAqIFtUSFJJRlQtMzMxMV0gLSBUb3AgbGV2ZWwgUkVBRE1FLm1kIGhhcyBpbmNvcnJlY3QgZm9ybW1hdGluZworICAgICogW1RIUklGVC0yOTM2XSAtIE1pbm9yIG1lbW9yeSBsZWFrIGluIFNTTAorICAgICogW1RIUklGVC0zMjkwXSAtIFVzaW5nIGZyb20gaW4gdmFyaWFibGUgbmFtZXMgY2F1c2VzIHRoZSBnZW5lcmF0ZWQgUHl0aG9uIGNvZGUgdG8gaGF2ZSBlcnJvcnMKKyAgICAqIFtUSFJJRlQtMzIyNV0gLSBGaXggVFBpcGVTZXJ2ZXIgdW5wcmVkaWN0YWJsZSBiZWhhdmlvciBvbiBpbnRlcnJ1cHQoKQorICAgICogW1RIUklGVC0zMzU0XSAtIEZpeCB3b3JkLWV4dHJhY3Rpb24gc3Vic3RyIGJ1ZyBpbiBpbml0aWFsaXNtIGNvZGUKKyAgICAqIFtUSFJJRlQtMjAwNl0gLSBUQmluYXJ5UHJvdG9jb2wgbWVzc2FnZSBoZWFkZXIgY2FsbCBuYW1lIGxlbmd0aCBpcyBub3QgdmFsaWRhdGVkIGFuZCBjYW4gYmUgdXNlZCB0byBjb3JlIHRoZSBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzMyOV0gLSBDKysgbGlicmFyeSB1bml0IHRlc3RzIGRvbid0IGNvbXBpbGUgYWdhaW5zdCB0aGUgbmV3IGJvb3N0LTEuNTkgdW5pdCB0ZXN0IGZyYW1ld29yaworICAgICogW1RIUklGVC0yNjMwXSAtIHdpbmRvd3M3IDY0Yml0IHBjLiBpcHY0IGFuZCBpcHY2IHBjLmNhbid0IHVzZQorICAgICogW1RIUklGVC0zMzM2XSAtIFRocmlmdCBnZW5lcmF0ZWQgc3RyZWFtaW5nIG9wZXJhdG9ycyBhZGRlZCBpbiAwLjkuMiBjYW5ub3QgYmUgb3ZlcnJpZGRlbgorICAgICogW1RIUklGVC0yNjgxXSAtIENvcmUgb2YgdW53aW5kX2NsZWFudXAKKyAgICAqIFtUSFJJRlQtMzMxN10gLSBjcHAgbmFtZXNwYWNlIG9yZy5hcGFjaGUgaXNzdWUgYXBwZWFycyBpbiAwLjkKKworIyMgRG9jdW1lbnRhdGlvbgorICAgICogW1RIUklGVC0zMjg2XSAtIEFwYWNoZSBBbnQgaXMgYSBuZWNlc3NhcnkgZGVwZW5kZW5jeQorCisjIyBJbXByb3ZlbWVudAorICAgICogW1RIUklGVC0yMjddIC0gQnl0ZVtdIGluIGNvbGxlY3Rpb25zIGFyZW4ndCBwcmV0dHkgcHJpbnRlZCBsaWtlIHJlZ3VsYXIgYmluYXJ5IGZpZWxkcworICAgICogW1RIUklGVC0yNzQ0XSAtIFZhZ3JhbnRmaWxlIGZvciBDZW50b3MgNi41CisgICAgKiBbVEhSSUZULTI2NDRdIC0gSGF4ZSBzdXBwb3J0CisgICAgKiBbVEhSSUZULTI3NTZdIC0gcmVnaXN0ZXIgTWVkaWEgVHlwZSBAIElBTkEKKyAgICAqIFtUSFJJRlQtMzA3Nl0gLSBDb21wYXRpYmlsaXR5IHdpdGggSGF4ZSAzLjIuMAorICAgICogW1RIUklGVC0zMDgxXSAtIEMrKyBDb25zb2xpZGF0ZSBjbGllbnQgcHJvY2Vzc2luZyBsb29wcyBpbiBUU2VydmVycworICAgICogW1RIUklGVC0zMDgzXSAtIEMrKyBDb25zb2xpZGF0ZSBzZXJ2ZXIgcHJvY2Vzc2luZyBsb29wcyBpbiBUU2ltcGxlU2VydmVyLCBUVGhyZWFkZWRTZXJ2ZXIsIFRUaHJlYWRQb29sU2VydmVyCisgICAgKiBbVEhSSUZULTMwODRdIC0gQysrIGFkZCBjb25jdXJyZW50IGNsaWVudCBsaW1pdCB0byB0aHJlYWRlZCBzZXJ2ZXJzCisgICAgKiBbVEhSSUZULTMwNzRdIC0gICAgIEFkZCBjb21waWxlci9jcHAvbGV4Lnl5dGhyaWZ0bC5jYyB0byBnaXRpZ25vcmUuCisgICAgKiBbVEhSSUZULTMxMzRdIC0gUmVtb3ZlIHVzZSBvZiBkZXByZWNhdGVkICJwaGFudG9tLmFyZ3MiCisgICAgKiBbVEhSSUZULTMxMzNdIC0gQWxsb3cgIm1ha2UgY3Jvc3MiIGFuZCAibWFrZSBwcmVjcm9zcyIgdG8gcnVuIHdpdGhvdXQgYnVpbGRpbmcgYWxsIGxhbmd1YWdlcworICAgICogW1RIUklGVC0zMTQyXSAtIE1ha2UgSmF2YVNjcmlwdCB1c2UgZG93bmxvYWRlZCBsaWJyYXJpZXMKKyAgICAqIFtUSFJJRlQtMzE0MV0gLSBJbXByb3ZlIGxvZ2dpbmcgb2YgSmF2YVNjcmlwdCB0ZXN0CisgICAgKiBbVEhSSUZULTMxNDRdIC0gUHJvcG9zYWw6IG1ha2UgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGVudW1zIGluIGdlbmVyYXRlZCBnbyBjb2RlIGxlc3MgdmVyYm9zZQorICAgICogW1RIUklGVC0zMTMwXSAtIFJlbW92ZSB0aGUgbGFzdCB2ZXN0aWdlcyBvZiBUSFJJRlRfT1ZFUkxPQURfSUYgZnJvbSBUSFJJRlQtMTMxNgorICAgICogW1RIUklGVC0zMTMxXSAtIENvbnNvbGlkYXRlIHN1Z2dlc3RlZCBpbXBvcnQgcGF0aCBmb3IgZ28gdGhyaWZ0IGxpYnJhcnkgdG8gZ2l0LmFwYWNoZS5vcmcgaW4gZG9jcyBhbmQgY29kZQorICAgICogW1RIUklGVC0zMDkyXSAtIEdlbmVyYXRlZCBIYXNrZWxsIHR5cGVzIHNob3VsZCBkZXJpdmUgR2VuZXJpYworICAgICogW1RIUklGVC0zMTEwXSAtICBQcmludCBlcnJvciBsb2cgYWZ0ZXIgY3Jvc3MgdGVzdCBmYWlsdXJlcyBvbiBUcmF2aXMKKyAgICAqIFtUSFJJRlQtMzExNF0gLSBVc2luZyBsb2NhbCB0ZW1wIHZhcmlhYmxlcyB0byBub3QgcG9sbHV0ZSB0aGUgZ2xvYmFsIHRhYmxlCisgICAgKiBbVEhSSUZULTMxMDZdIC0gQ01ha2Ugc3VtbWFyeSBzaG91bGQgZ2l2ZSBtb3JlIGluZm9ybWF0aW9uIHdoeSBhIGxpYnJhcnkgaXMgc2V0IHRvIG9mZgorICAgICogW1RIUklGVC0zMTE5XSAtIEphdmEncyBUVGhyZWFkZWRTZWxlY3RvclNlcnZlciBoYXMgaW5kaXN0aW5ndWlzaGFibGUgbG9nIG1lc3NhZ2VzIGluIHJ1bigpCisgICAgKiBbVEhSSUZULTMxMjJdIC0gSmF2YXNjcmlwdCBzdHJ1Y3QgY29uc3RydWN0b3Igc2hvdWxkIHByb3Blcmx5IGluaXRpYWxpemUgc3RydWN0IGFuZCBjb250YWluZXIgbWVtYmVycyBmcm9tIHBsYWluIGpzIGFyZ3VtZW50cworICAgICogW1RIUklGVC0zMTUxXSAtIEZpeCBsaW5rcyB0byBnaXQtd2lwKiAtIHNob3VsZCBiZSBnaXQuYXBhY2hlLm9yZworICAgICogW1RIUklGVC0zMTY3XSAtIFdpbmRvd3MgYnVpbGQgZnJvbSBzb3VyY2UgaW5zdHJ1Y3Rpb25zIG5lZWQgdG8gYmUgcmV2aXNlZAorICAgICogW1RIUklGVC0zMTU1XSAtIG1vdmUgY29udHJpYi9taW5ndzMyLXRvb2xjaGFpbi5jbWFrZSB0byBidWlsZC9jbWFrZS8KKyAgICAqIFtUSFJJRlQtMzE2MF0gLSBNYWtlIGdlbmVyYXRlZCBnbyBlbnVtcyBpbXBsZW1lbnQgVGV4dE1hcnNoYWxsZXIgYW5kIFRleHRVbm1hcnNoYWxsZXIgaW50ZXJmYWNlcworICAgICogW1RIUklGVC0zMTUwXSAtIEFkZCBhbiBvcHRpb24gdG8gdGhyaWZ0IGdvIGdlbmVyYXRvciB0byBtYWtlIFJlYWQgYW5kIFdyaXRlIG1ldGhvZHMgcHJpdmF0ZQorICAgICogW1RIUklGVC0zMTQ5XSAtIE1ha2UgUmVhZEZpZWxkTiBtZXRob2RzIGluIGdlbmVyYXRlZCBHbyBjb2RlIHByaXZhdGUKKyAgICAqIFtUSFJJRlQtMzE3Ml0gLSBBZGQgdHV0b3JpYWwgdG8gVGhyaWZ0IHdlYiBzaXRlCisgICAgKiBbVEhSSUZULTMyMTRdIC0gQWRkIEVybGFuZyBvcHRpb24gZm9yIHVzaW5nIG1hcHMgaW5zdGVhZCBvZiBkaWN0cworICAgICogW1RIUklGVC0zMjAxXSAtIENhcHR1cmUgZ2l0aHViIHRlc3QgYXJ0aWZhY3RzIGZvciBmYWlsZWQgYnVpbGRzCisgICAgKiBbVEhSSUZULTMyNjZdIC0gY19nbGliOiBNdWx0aXBsZSBjb21waWxlciB3YXJuaW5ncyBidWlsZGluZyB1bml0IHRlc3RzCisgICAgKiBbVEhSSUZULTMyODVdIC0gY19nbGliOiBCdWlsZCBsaWJyYXJ5IHdpdGggYWxsIHdhcm5pbmdzIGVuYWJsZWQsIG5vIHdhcm5pbmdzIGdlbmVyYXRlZAorICAgICogW1RIUklGVC0xOTU0XSAtIEFsbG93IGZvciBhIHNlcGFyYXRlIGNvbm5lY3Rpb24gdGltZW91dCB2YWx1ZSAKKyAgICAqIFtUSFJJRlQtMjA5OF0gLSBBZGQgc3VwcG9ydCBmb3IgUXQ1KworICAgICogW1RIUklGVC0yMTk5XSAtIFJlbW92ZSBEZW5zZSBwcm90b2NvbCAod2FzOiBtb3ZlIHRvIENvbnRyaWIpCisgICAgKiBbVEhSSUZULTQwNl0gLSBDKysgVGVzdCBzdWl0ZSBjbGVhbnVwCisgICAgKiBbVEhSSUZULTkwMl0gLSBzb2NrZXQgYW5kIGNvbm5lY3QgdGltZW91dCBpbiBUU29ja2V0IHNob3VsZCBiZSBkaXN0aW5ndWlzaGVkCisgICAgKiBbVEhSSUZULTM4OF0gLSBVc2UgYSBzZXBhcmF0ZSB3aXJlIGZvcm1hdCBmb3IgYXN5bmMgY2FsbHMKKyAgICAqIFtUSFJJRlQtNzI3XSAtIHN1cHBvcnQgbmF0aXZlIEMrKyBsYW5ndWFnZSBzcGVjaWZpYyBleGNlcHRpb24gbWVzc2FnZQorICAgICogW1RIUklGVC0xNzg0XSAtIHBlcC0zMTEwIGNvbXBsaWFuY2UgZm9yIGV4Y2VwdGlvbiBoYW5kbGluZyAKKyAgICAqIFtUSFJJRlQtMTAyNV0gLSBDKysgU2VydmVyU29ja2V0IHNob3VsZCBpbmhlcml0IGZyb20gU29ja2V0IHdpdGggdGhlIG5lY2Vzc2FyeSBDdG9yIHRvIGxpc3RlbiBvbiBjb25uZWN0aW9ucyBmcm9tIGEgc3BlY2lmaWMgaG9zdAorICAgICogW1RIUklGVC0yMjY5XSAtIENhbiBkZXBsb3kgbGlidGhyaWZ0LXNvdXJjZS5qYXIgdG8gbWF2ZW4gY2VudGVyIHJlcG9zaXRvcnkKKyAgICAqIFtUSFJJRlQtMjgwNF0gLSBQdWxsIGFuIGludGVyZmFjZSBvdXQgb2YgVEJhc2VBc3luY1Byb2Nlc3NvcgorICAgICogW1RIUklGVC0yODA2XSAtIG1vcmUgd2hpdGVzcGFjZSBmaXh1cHMKKyAgICAqIFtUSFJJRlQtMjgxMV0gLSBNYWtlIHJlbW90ZSBzb2NrZXQgYWRkcmVzcyBhY2Nlc3NpYmxlCisgICAgKiBbVEhSSUZULTI4MDldIC0gLmdpdGlnbm9yZSB1cGRhdGUgZm9yIGNvbXBpbGVyJ3MgdmlzdWFsIHByb2plY3QKKyAgICAqIFtUSFJJRlQtMjg0Nl0gLSBFeHBvc2UgY2lwaGVycyBwYXJhbWV0ZXIgZnJvbSBzc2wud3JhcF9zb2NrZXQoKQorICAgICogW1RIUklGVC0yODU5XSAtIEpTT04gZ2VuZXJhdG9yOiBvdXRwdXQgY29tcGxldGUgZGVzY3JpcHRvcnMKKyAgICAqIFtUSFJJRlQtMjg2MV0gLSBhZGQgYnVmZmVyZWQgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTI4NjVdIC0gVGVzdCBjYXNlIGZvciBHbzogU2VxSWQgb3V0IG9mIHNlcXVlbmNlCisgICAgKiBbVEhSSUZULTI4NjZdIC0gR28gZ2VuZXJhdG9yIHNvdXJjZSBjb2RlIGlzIGhhcmQgdG8gcmVhZCBhbmQgbWFpbnRhaW4KKyAgICAqIFtUSFJJRlQtMjg4MF0gLSBSZWFkIHRoZSBuZXR3b3JrIGFkZHJlc3MgZnJvbSB0aGUgbGlzdGVuZXIgaWYgYXZhaWxhYmxlLgorICAgICogW1RIUklGVC0yODc1XSAtIFR5cG8gaW4gVERlbnNlUHJvdG9jb2wuaCBjb21tZW50CisgICAgKiBbVEhSSUZULTI4NzRdIC0gVEJpbmFyeVByb3RvY29sICBtZW1iZXIgdmFyaWFibGUgInN0cmluZ19idWZfIiBpcyBuZXZlciB1c2VkLgorICAgICogW1RIUklGVC0yODU1XSAtIE1vdmUgY29udHJpYnV0aW5nLm1kIHRvIHRoZSByb290IG9mIHRoZSByZXBvc2l0b3J5CisgICAgKiBbVEhSSUZULTI4NjJdIC0gRW5hYmxlIFJUVEkgYW5kL29yIGJ1aWxkIG1hY3JvcyBmb3IgZ2VuZXJhdGVkIGNvZGUKKyAgICAqIFtUSFJJRlQtMjg3Nl0gLSAgQWRkIHRlc3QgZm9yIFRIUklGVC0yNTI2IEFzc2lnbm1lbnQgb3BlcmF0b3JzIGFuZCBjb3B5IGNvbnN0cnVjdG9ycyBpbiBjKysgZG9uJ3QgY29weSB0aGUgX19pc3NldCBzdHJ1Y3QKKyAgICAqIFtUSFJJRlQtMjg5N10gLSBHZW5lcmF0ZSAtaXNFcXVhbDogYW5kIC1oYXNoIG1ldGhvZHMKKyAgICAqIFtUSFJJRlQtMjkwOV0gLSBJbXByb3ZlIHRyYXZpcyBidWlsZAorICAgICogW1RIUklGVC0yOTIxXSAtIE1ha2UgRXJsYW5nIGltcGwgcmVhZHkgZm9yIE9UUCAxOCByZWxlYXNlIChkaWN0LzAgYW5kIHNldC8wIGFyZSBkZXByZWNhdGVkKQorICAgICogW1RIUklGVC0yOTI4XSAtIFJlbmFtZSB0aGUgZXJsYW5nIHRlc3Rfc2VydmVyIG1vZHVsZQorICAgICogW1RIUklGVC0yOTQwXSAtIEFsbG93IGluc3RhbGxpbmcgVGhyaWZ0IGZyb20gZ2l0IGFzIE5QTSBtb2R1bGUgYnkgcHJvdmlkaW5nIHBhY2thZ2UuanNvbiBpbiB0b3AgbGV2ZWwgZGlyZWN0b3J5CisgICAgKiBbVEhSSUZULTI5MzddIC0gQWxsb3cgc2V0dGluZyBhIG1heGltdW0gZnJhbWUgc2l6ZSBpbiBURnJhbWVkVHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTI5NzZdIC0gbm9kZWpzOiB4aHIgYW5kIHdlYnNvY2tldCBzdXBwb3J0IGZvciBicm93c2VyaWZ5CisgICAgKiBbVEhSSUZULTI5OTZdIC0gVGVzdCBmb3IgSGF4ZSAzLjEuMyBvciBiZXR0ZXIgCisgICAgKiBbVEhSSUZULTI5NjldIC0gbm9kZWpzOiBEUlkgdXAgbGlicmFyeSB0ZXN0cworICAgICogW1RIUklGVC0yOTczXSAtIFVwZGF0ZSBIYXhlIGxpYiByZWFkbWUgcmVnYXJkaW5nIEhheGUgMy4xLjMKKyAgICAqIFtUSFJJRlQtMjk1Ml0gLSBJbXByb3ZlIGhhbmRsaW5nIG9mIFNlcnZlci5TdG9wKCkgCisgICAgKiBbVEhSSUZULTI5NjRdIC0gbm9kZWpzOiBtb3ZlIHByb3RvY29scyBhbmQgdHJhbnNwb3J0cyBpbnRvIHNlcGFyYXRlIGZpbGVzCisgICAgKiBbVEhSSUZULTI5NjNdIC0gbm9kZWpzIC0gYWRkIHRlc3QgY292ZXJhZ2UKKyAgICAqIFtUSFJJRlQtMzAwNl0gLSBBdHRhY2ggJ29taXRlbXB0eScganNvbiB0YWcgZm9yIG9wdGlvbmFsIGZpZWxkcyBpbiBHbworICAgICogW1RIUklGVC0zMDI3XSAtIEdvIGNvbXBpbGVyIGRvZXMgbm90IGVuc3VyZSBjb21tb24gaW5pdGlhbGlzbXMgaGF2ZSBjb25zaXN0ZW50IGNhc2UKKyAgICAqIFtUSFJJRlQtMzAzMF0gLSBUVGhyZWFkZWRTZXJ2ZXI6IFByb3BlcnR5IGZvciBudW1iZXIgb2YgY2xpZW50VGhyZWFkcworICAgICogW1RIUklGVC0zMDIzXSAtIEdvIGNvbXBpbGVyIGlzIGEgbGl0dGxlIG92ZXJseSBjb25zZXJ2YXRpdmUgd2l0aCBuYW1lcyBvZiBhdHRyaWJ1dGVzCisgICAgKiBbVEhSSUZULTMwMThdIC0gQ29tcGFjdCBwcm90b2NvbCBmb3IgRGVscGhpCisgICAgKiBbVEhSSUZULTMwMjVdIC0gQ2hhbmdlIHB1cmUgSW50IGNvbnN0YW50cyBpbnRvIEBlbnVtcyAod2hlcmUgcG9zc2libGUpCisgICAgKiBbVEhSSUZULTMwMzFdIC0gbWlncmF0ZSAic2hvdWxkU3RvcCIgZmxhZyB0byBUU2VydmVyCisgICAgKiBbVEhSSUZULTMwMjJdIC0gQ29tcGFjdCBwcm90b2NvbCBmb3IgSGF4ZQorICAgICogW1RIUklGVC0zMDQxXSAtIEdlbmVyYXRlIGFzeW5jaHJvbm91cyBjbGllbnRzIGZvciBDb2NvYQorICAgICogW1RIUklGVC0zMDUzXSAtIFBlcmwgU1NMIFNvY2tldCBTdXBwb3J0IChFbmNyeXB0aW9uKQorICAgICogW1RIUklGVC0zMjQ3XSAtIEdlbmVyYXRlIGEgQysrIHRocmVhZC1zYWZlIGNsaWVudAorICAgICogW1RIUklGVC0zMjE3XSAtIFByb3ZpZGUgYSBsaXR0bGUgZW5kaWFuIHZhcmlhbnQgb2YgdGhlIGJpbmFyeSBwcm90b2NvbCBpbiBDKysKKyAgICAqIFtUSFJJRlQtMzIyM10gLSBUeXBlU2NyaXB0OiBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBFbnVtIE1hcHMKKyAgICAqIFtUSFJJRlQtMzIyMF0gLSBPcHRpb24gdG8gc3VwcHJlc3MgQEdlbmVyYXRlZCBBbm5vdGF0aW9uIGVudGlyZWx5CisgICAgKiBbVEhSSUZULTMzMDBdIC0gUmVpbXBsZW1lbnQgVFpsaWJUcmFuc3BvcnQgaW4gSmF2YSB1c2luZyBzdHJlYW1zCisgICAgKiBbVEhSSUZULTMyODhdIC0gY19nbGliOiBCdWlsZCB1bml0IHRlc3RzIHdpdGggYWxsIHdhcm5pbmdzIGVuYWJsZWQsIG5vIHdhcm5pbmdzIGdlbmVyYXRlZAorICAgICogW1RIUklGVC0zMzQ3XSAtIEltcHJvdmUgY3Jvc3MgdGVzdCBzZXJ2ZXJzIGFuZCBjbGllbnRzCisgICAgKiBbVEhSSUZULTMzNDJdIC0gSW1wcm92ZSBydWJ5IGNyb3NzIHRlc3QgY2xpZW50IGFuZCBzZXJ2ZXIgY29tcGF0aWJpbGl0eQorICAgICogW1RIUklGVC0yMjk2XSAtIEFkZCBDKysgQmFzZSBjbGFzcyBmb3Igc2VydmljZQorICAgICogW1RIUklGVC0zMzM3XSAtIEFkZCB0ZXN0Qm9vbCBtZXRob2QgdG8gY3Jvc3MgdGVzdHMKKyAgICAqIFtUSFJJRlQtMzMwM10gLSBEaXNhYmxlIGNvbmN1cnJlbnQgY2FiYWwgam9icyBvbiBUcmF2aXMgdG8gYXZvaWQgR0hDIGNyYXNoCisgICAgKiBbVEhSSUZULTI2MjNdIC0gRG9ja2VyIGNvbnRhaW5lciBmb3IgVGhyaWZ0CisgICAgKiBbVEhSSUZULTMyOThdIC0gdGhyaWZ0IGVuZGlhbiBjb252ZXJ0ZXJzIG1heSBjb25mbGljdCB3aXRoIG90aGVyIGxpYnJhcmllcworICAgICogW1RIUklGVC0xNTU5XSAtIFByb3ZpZGUgbWVtb3J5IHBvb2wgZm9yIFRCaW5hcnlQcm90b2NvbCB0byBlbGltaW5hdGUgbWVtb3J5IGZyYWdtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtNDI0XSAtIFN0ZWFsIFByb3RvY29sQnVmZmVycycgVmFySW50IGltcGxlbWVudGF0aW9uIGZvciBDKysKKworIyMgTmV3IEZlYXR1cmUKKyAgICAqIFtUSFJJRlQtMzA3MF0gLSBBZGQgYWJpbGl0eSB0byBzZXQgdGhlIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaworICAgICogW1RIUklGVC0xOTA5XSAtIEphdmE6IEFkZCBjb21waWxlciBmbGFnIHRvIHVzZSB0aGUgIm9wdGlvbiBwYXR0ZXJuIiBmb3Igb3B0aW9uYWwgZmllbGRzCisgICAgKiBbVEhSSUZULTIwOTldIC0gU3RvcCBUVGhyZWFkUG9vbFNlcnZlciB3aXRoIGFsaXZlIGNvbm5lY3Rpb25zLgorICAgICogW1RIUklGVC0xMjNdIC0gaW1wbGVtZW50IFRabGliVHJhbnNwb3J0IGluIEphdmEKKyAgICAqIFtUSFJJRlQtMjM2OF0gLSBOZXcgb3B0aW9uOiByZXVzZS1vYmplY3RzIGZvciBKYXZhIGdlbmVyYXRvcgorICAgICogW1RIUklGVC0yODM2XSAtIE9wdGlvbmFsbHkgZ2VuZXJhdGUgQysrMTEgTW92ZUNvbnN0cnVjdGlibGUgdHlwZXMKKyAgICAqIFtUSFJJRlQtMjgyNF0gLSBGbGFnIHRvIGRpc2FibGUgaHRtbCBlc2NhcGluZyBkb2N0ZXh0CisgICAgKiBbVEhSSUZULTI4MTldIC0gQWRkIFdlYnNTb2NrZXQgY2xpZW50IHRvIG5vZGUuanMKKyAgICAqIFtUSFJJRlQtMzA1MF0gLSBDbGllbnQgY2VydGlmaWNhdGUgYXV0aGVudGljYXRpb24gZm9yIG5vbi1odHRwIFRMUyBpbiBDIworICAgICogW1RIUklGVC0zMjkyXSAtIEltcGxlbWVudCBUWmxpYlRyYW5zcG9ydCBpbiBHbworCisjIyBRdWVzdGlvbgorICAgICogW1RIUklGVC0yNTgzXSAtIFRocmlmdCBvbiB4UEMgdGFyZ2V0IChTcGVlZEdvYXQpCisgICAgKiBbVEhSSUZULTI1OTJdIC0gdGhyaWZ0IHNlcnZlciB1c2luZyBjX2dsaWIKKyAgICAqIFtUSFJJRlQtMjgzMl0gLSBjX2dsaWI6IEhhbmRsZSBzdHJpbmcgbGlzdHMgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTMxMzZdIC0gdGhyaWZ0IGluc3RhbGxhdGlvbiBwcm9ibGVtIG9uIG1hYworICAgICogW1RIUklGVC0zMzQ2XSAtIGNfZ2xpYjogVHV0b3JpYWxzIGV4YW1wbGUgY3Jhc2hlcyBzYXlpbmcgQ2FsY3VsYXRvci5waW5nIGltcGxlbWVudGF0aW9uIHJldHVybmVkIEZBTFNFIGJ1dCBkaWQgbm90IHNldCBhbiBlcnJvcgorCisjIyBTdWItdGFzaworICAgICogW1RIUklGVC0yNTc4XSAtIE1vdmluZyAnbWFrZSBjcm9zcycgZnJvbSB0ZXN0LnNoIHRvIHRlc3QucHkKKyAgICAqIFtUSFJJRlQtMjczNF0gLSBHbyBjb2Rpbmcgc3RhbmRhcmRzCisgICAgKiBbVEhSSUZULTI3NDhdIC0gQWRkIFZhZ3JhbnRmaWxlIGZvciBDZW50b3MgNi41CisgICAgKiBbVEhSSUZULTI3NTNdIC0gTWlzYy4gSGF4ZSBpbXByb3ZlbWVudHMKKyAgICAqIFtUSFJJRlQtMjY0MF0gLSBDb21wYWN0IFByb3RvY29sIGluIENvY29hCisgICAgKiBbVEhSSUZULTMyNjJdIC0gd2FybmluZzogb3ZlcmZsb3cgaW4gaW1wbGljaXQgY29uc3RhbnQgY29udmVyc2lvbiBpbiBEZW5zZVByb3RvVGVzdC5jcHAKKyAgICAqIFtUSFJJRlQtMzE5NF0gLSBDYW4ndCBidWlsZCB3aXRoIGdvIGVuYWJsZWQuICBnb21vY2sgU0NDIHBhdGggaW5jb3JyZWN0LgorICAgICogW1RIUklGVC0zMjc1XSAtIGNfZ2xpYiB0dXRvcmlhbCB3YXJuaW5ncyBpbiBnZW5lcmF0ZWQgY29kZQorICAgICogW1RIUklGVC0xMTI1XSAtIE11bHRpcGxleGluZyBzdXBwb3J0IGZvciB0aGUgUnVieSBMaWJyYXJ5CisgICAgKiBbVEhSSUZULTI4MDddIC0gUEhQIENvZGUgU3R5bGUKKyAgICAqIFtUSFJJRlQtMjg0MV0gLSBBZGQgY29tcHJlaGVuc2l2ZSBpbnRlZ3JhdGlvbiB0ZXN0cyBmb3IgdGhlIHdob2xlIEdvIHN0YWNrCisgICAgKiBbVEhSSUZULTI4MTVdIC0gSGF4ZTogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMjg4Nl0gLSBJbnRlZ3JhdGUgYmluYXJ5IHR5cGUgaW4gc3RhbmRhcmQgVGhyaWZ0IGNyb3NzIHRlc3QKKyAgICAqIFtUSFJJRlQtMjk0Nl0gLSBFbmhhbmNlIHVzYWJpbGl0eSBvZiBjcm9zcyB0ZXN0IGZyYW1ld29yaworICAgICogW1RIUklGVC0yOTY3XSAtIEFkZCAuZWRpdG9yY29uZmlnIHRvIHJvb3QKKyAgICAqIFtUSFJJRlQtMzAzM10gLSBQZXJsOiBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMgb24gYW55IFRyYW5zcG9ydCwgUHJvdG9jb2wgYW5kIFNlcnZlcgorICAgICogW1RIUklGVC0zMTc0XSAtIEluaXRpYWxpc20gY29kZSBpbiB0aGUgR28gY29tcGlsZXIgZG9lc24ndCBjaGVjayBmaXJzdCB3b3JkCisgICAgKiBbVEhSSUZULTMxOTNdIC0gT3B0aW9uIHRvIHN1cHJlc3MgZGF0ZSB2YWx1ZSBpbiBAR2VuZXJhdGVkIGFubm90YXRpb24KKyAgICAqIFtUSFJJRlQtMzMwNV0gLSBNaXNzaW5nIGRpc3QgZmlsZXMgZm9yIDAuOS4zIHJlbGVhc2UgY2FuZGlkYXRlCisgICAgKiBbVEhSSUZULTMzNDFdIC0gQWRkIHRlc3RCb29sIG1ldGhvZHMKKyAgICAqIFtUSFJJRlQtMzMwOF0gLSBGaXggYnJva2VuIHRlc3QgY2FzZXMgZm9yIDAuOS4zIHJlbGVhc2UgY2FuZGlkYXRlCisKKyMjIFRhc2sKKyAgICAqIFtUSFJJRlQtMjgzNF0gLSBSZW1vdmUgc2VtaS1jb2xvbnMgZnJvbSBweXRob24gY29kZSBnZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtMjg1M10gLSBBZGp1c3QgY29tbWVudHMgbm90IGFwcGx5aW5nIGFueW1vcmUgYWZ0ZXIgVEhSSUZULTI4NTIKKworIyMgVGVzdAorICAgICogW1RIUklGVC0zMjExXSAtIEFkZCBtYWtlIGNyb3NzIHN1cHBvcnQgZm9yIHBocCBUQ29tcGFjdFByb3RvY29sCisKKyMjIFdpc2gKKyAgICAqIFtUSFJJRlQtMjgzOF0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgY2FuIGJpbmQgdG8gcG9ydCAwIChpLmUuLCBnZXQgYW4gT1MtYXNzaWduZWQgcG9ydCkgYnV0IHRoZXJlIGlzIG5vIHdheSB0byBnZXQgdGhlIHBvcnQgbnVtYmVyCiAKIAotVmVyc2lvbiAwLjUuMAogCitUaHJpZnQgMC45LjIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBCdWcKKyAgICAqIFtUSFJJRlQtMjc5M10gLSBHbyBjb21waWxlciBwcm9kdWNlcyB1bmNvbXBpbGFibGUgY29kZQorICAgICogW1RIUklGVC0xNDgxXSAtIFVuaXggZG9tYWluIHNvY2tldHMgaW4gQysrIGRvIG5vdCBzdXBwb3J0IHRoZSBhYnN0cmFjdCBuYW1lc3BhY2UKKyAgICAqIFtUSFJJRlQtMTQ1NV0gLSBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZVN0cmluZyBjYXN0cyBmcm9tIHNpemVfdCB0byB1aW50MzJfdCwgd2hpY2ggaXMgbm90IHNhZmUgb24gNjQtYml0IHBsYXRmb3JtcworICAgICogW1RIUklGVC0xNTc5XSAtIFBIUCBFeHRlbnRpb24gLSBmdW5jdGlvbiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkgbm90IHdvcmtpbmcgZnJvbSBUQmluYXJ5U2VyaWFsaXplcjo6ZGVzZXJpYWxpemUKKyAgICAqIFtUSFJJRlQtMTU4NF0gLSBFcnJvcjogY291bGQgbm90IFNldE1pblRocmVhZHMgaW4gVGhyZWFkUG9vbCBvbiBzaW5nbGUtY29yZSBtYWNoaW5lcworICAgICogW1RIUklGVC0xNjE0XSAtIFRocmlmdCBidWlsZCBmcm9tIHN2biByZXBvIHNvdXJjZXMgZmFpbHMgd2l0aCBhdXRvbWFrZS0xLjEyCisgICAgKiBbVEhSSUZULTEwNDddIC0gcmJfdGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgdHJlYXRzIGFyZyBhcyBzdHJpbmcgd2l0aG91dCBjaGVjaywgc2VnZmF1bHRzIGlmIHlvdSBwYXNzIG5vbi1zdHJpbmcKKyAgICAqIFtUSFJJRlQtMTYzOV0gLSBKYXZhL1B5dGhvbjogU2VyaWFsaXphdGlvbi9EZXNlcmlhbGl6YXRpb24gb2YgZG91YmxlIHR5cGUgdXNpbmcgQ29tcGFjdFByb3RvY29sCisgICAgKiBbVEhSSUZULTE2NDddIC0gTm9kZUpTIEJ1ZmZlcmVkVHJhbnNwb3J0IGRvZXMgbm90IHdvcmsgYmV5b25kIHRoZSBoZWxsby13b3JsZCBleGFtcGxlCisgICAgKiBbVEhSSUZULTIxMzBdIC0gVGhyaWZ0J3MgRCBsaWJyYXJ5L3Rlc3Q6IHBhcnRzIG9mICJtYWtlIGNoZWNrIiBjb2RlIGRvIG5vdCBjb21waWxlIHdpdGggcmVjZW50IGRtZC0yLjA2MiB0aHJvdWdoIGRtZC0yLjA2NGFscGhhCisgICAgKiBbVEhSSUZULTIxNDBdIC0gRXJyb3IgY29tcGlsaW5nIGNwcCB0dXRvcmlhbHMKKyAgICAqIFtUSFJJRlQtMjEzOV0gLSBNU1ZDIDIwMTIgRXJyb3IgLSBDYW5ub3QgY29tcGlsZSBkdWUgdG8gQm9vc3RUaHJlYWRGYWN0b3J5CisgICAgKiBbVEhSSUZULTIxMzhdIC0gcGtnY29uZmlnIGZpbGUgY3JlYXRlZCB3aXRoIHdyb25nIGluY2x1ZGUgcGF0aAorICAgICogW1RIUklGVC0yMTYwXSAtIFdhcm5pbmcgaW4gdGhyaWZ0Lmggd2hlbiBjb21waWxpbmcgd2l0aCAtV3VudXNlZCBhbmQgTkRFQlVHCisgICAgKiBbVEhSSUZULTIxNThdIC0gQ29tcGFjdCwgSlNPTiwgYW5kIFNpbXBsZUpTT04gcHJvdG9jb2xzIGFyZSBub3Qgd29ya2luZyBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMjE2N10gLSBub2RlanMgbGliIHRocm93cyBlcnJvciBpZiBvcHRpb25zIGFyZ3VtZW50IGlzbid0IHBhc3NlZAorICAgICogW1RIUklGVC0yMjg4XSAtIEdvIGltcGwgb2YgVGhyaWZ0IEpTT04gcHJvdG9jb2wgd3JvbmdseSB3cml0ZXMvZXhwZWN0cyB0cnVlL2ZhbHNlIGZvciBib29scworICAgICogW1RIUklGVC0yMTQ3XSAtIFRocmlmdCBJREwgZ3JhbW1hciBhbGxvd3MgZm9yIGRvdHRlZCBpZGVudGlmaWVyIG5hbWVzCisgICAgKiBbVEhSSUZULTIxNDVdIC0gUmFjayBhbmQgVGhpbiBhcmUgbm90IGp1c3QgZGV2ZWxvcG1lbnQgZGVwZW5kZW5jaWVzCisgICAgKiBbVEhSSUZULTIyNjddIC0gU2hvdWxkIGJlIGFibGUgdG8gY2hvb3NlIHNvY2tldCBmYW1pbHkgaW4gUHl0aG9uIFRTb2NrZXQKKyAgICAqIFtUSFJJRlQtMjI3Nl0gLSBqYXZhIHBhdGggaW4gc3BlYyBmaWxlIG5lZWRzIHVwZGF0aW5nCisgICAgKiBbVEhSSUZULTIyODFdIC0gR2VuZXJhdGVkIHNlbmQvcmVjdiBjb2RlIGlnbm9yZXMgZXJyb3JzIHJldHVybmVkIGJ5IHRoZSB1bmRlcmx5aW5nIHByb3RvY29sCisgICAgKiBbVEhSSUZULTIyODBdIC0gVEpTT05Qcm90b2NvbC5GbHVzaCgpIGRvZXMgbm90IHJlYWxseSBmbHVzaCB0aGUgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTIyNzRdIC0gVE5vbmJsb2NraW5nU2VydmVyIGFuZCBUVGhyZWFkZWRTZWxlY3RvclNlcnZlciBkbyBub3QgY2xvc2UgdGhlaXIgY2hhbm5lbCBzZWxlY3RvcnMgb24gZXhpdCBhbmQgbGVhayBmaWxlIGRlc2NyaXB0b3JzCisgICAgKiBbVEhSSUZULTIyNjVdIC0gcGhwIGxpYnJhcnkgZG9lc24ndCBidWlsZAorICAgICogW1RIUklGVC0yMjMyXSAtIElzU2V0KiBicm9rZW4gaW4gR28KKyAgICAqIFtUSFJJRlQtMjI0Nl0gLSBVbnNldCBlbnVtIHZhbHVlIGlzIHByaW50ZWQgYnkgVG9TdHJpbmcoKQorICAgICogW1RIUklGVC0yMjQwXSAtIHRocmlmdC52aW0gKGNvbnRyaWIpIGRvZXMgbm90IGNvcnJlY3RseSBoYW5kbGUgJ3VuaW9uJworICAgICogW1RIUklGVC0yMjQzXSAtIFROb25ibG9ja2luZ1NlcnZlciBpbiB0aHJpZnQgY3Jhc2hlcyB3aGVuIFRGcmFtZWRUcmFuc3BvcnQgb3BlbnMKKyAgICAqIFtUSFJJRlQtMjIzMF0gLSBDYW5ub3QgQnVpbGQgb24gUkhFTC9DZW50b3MvQW1hem9uIExpbnV4IDYueAorICAgICogW1RIUklGVC0yMjQ3XSAtIEdvIGdlbmVyYXRvciBkb2Vzbid0IGRlYWwgd2VsbCB3aXRoIG1hcCBrZXlzIG9mIHR5cGUgYmluYXJ5CisgICAgKiBbVEhSSUZULTIyNTNdIC0gUHl0aG9uIFRvcm5hZG8gVFRvcm5hZG9TZXJ2ZXIgYmFzZSBjbGFzcyBjaGFuZ2UKKyAgICAqIFtUSFJJRlQtMjI2MV0gLSBqYXZhOiBlcnJvcjogdW5tYXBwYWJsZSBjaGFyYWN0ZXIgZm9yIGVuY29kaW5nIEFTQ0lJCisgICAgKiBbVEhSSUZULTIyNTldIC0gQyM6IHVuZXhwZWN0ZWQgbnVsbCBsb2dEZWxlZ2F0ZSgpIHBvaW50ZXIgY2F1c2VzIEFWIGluIFRTZXJ2ZXIuc2VydmUoKQorICAgICogW1RIUklGVC0yMjI1XSAtIFNTTENvbnRleHQgZGVzdHJveSBiZWZvcmUgY2xlYW51cE9wZW5TU0wKKyAgICAqIFtUSFJJRlQtMjIyNF0gLSBUU1NMU29ja2V0LmggYW5kIFRTU0xTZXJ2ZXJTb2NrZXQuaCBzaG91bGQgdXNlIHRoZSBwbGF0ZnJvbXNvY2tldCB0b28KKyAgICAqIFtUSFJJRlQtMjIyOV0gLSB0aHJpZnQgZmFpbGVkIHRvIGJ1aWxkIG9uIE9TWCAxMC45IEdNCisgICAgKiBbVEhSSUZULTIyMjddIC0gVGhyaWZ0IGNvbXBpbGVyIGdlbmVyYXRlcyBzcHVyaW91cyB3YXJuaW5ncyB3aXRoIFhsaW50CisgICAgKiBbVEhSSUZULTIyMTldIC0gVGhyaWZ0IGdlbSBmYWlscyB0byBidWlsZCBvbiBPUyBYIE1hdmVyaWNrcyB3aXRoIDEuOS4zIHJ1YmllcworICAgICogW1RIUklGVC0yMjI2XSAtIFRTZXJ2ZXJTb2NrZXQgLSBrZWVwQWxpdmUgd3JvbmcgaW5pdGlhbGl6YXRpb24gb3JkZXIKKyAgICAqIFtUSFJJRlQtMjI4NV0gLSBUSnNvblByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciBKYXZhIGRvZXNuJ3QgYWxsb3cgYSBzbGFzaCAoLykgdG8gYmUgZXNjYXBlZCAoXC8pCisgICAgKiBbVEhSSUZULTIyMTZdIC0gRXh0cmFuZW91cyBzZW1pY29sb24gaW4gVFByb3RvY29sVXRpbC5oIG1ha2VzIGNsYW5nIG1hZAorICAgICogW1RIUklGVC0yMjE1XSAtIEdlbmVyYXRlZCBIVE1ML0dyYXBodml6IGxpc3RzIHJlZmVyZW5jZWQgZW51bSBpZGVudGlmaWVycyBhcyBVTktOT1dOLgorICAgICogW1RIUklGVC0yMjExXSAtIEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBkb2VzIG5vdCBjb250YWluIG5hbWVzcGFjZSBwcmVmaXguCisgICAgKiBbVEhSSUZULTIyMTBdIC0gbGliL2phdmEgVFNpbXBsZUpTT05Qcm90b2NvbCBjYW4gZW1pdCBpbnZhbGlkIEpTT04KKyAgICAqIFtUSFJJRlQtMjIwOV0gLSBSdWJ5IGdlbmVyYXRvciAtLSBwbGVhc2UgbmFtZXNwYWNlIGNsYXNzZXMKKyAgICAqIFtUSFJJRlQtMjIwMl0gLSBEZWxwaGkgVFNlcnZlckltcGwuRGVmYXVsdExvZ0RlbGVnYXRlIG1heSBzdG9wIHRoZSBzZXJ2ZXIgd2l0aCBJL08tRXJyb3IgMTA1CisgICAgKiBbVEhSSUZULTIyMDFdIC0gVGVybmFyeSBvcGVyYXRvciByZXR1cm5zIGRpZmZlcmVudCB0eXBlcyAoYnVpbGQgZXJyb3IgZm9yIHNvbWUgY29tcGlsZXJzKQorICAgICogW1RIUklGVC0yMjAwXSAtIG5lc3RlZCBzdHJ1Y3RzIGNhdXNlIGdlbmVyYXRlX2ZpbmdlcnByaW50KCkgdG8gc2xvdyBkb3duIGF0IGV4Y2Vzc2l2ZSBDUFUgbG9hZAorICAgICogW1RIUklGVC0yMTk3XSAtIGZpeCBqYXIgb3V0cHV0IGRpcmVjdG9yeSBpbiBycG0gc3BlYyBmaWxlCisgICAgKiBbVEhSSUZULTIxOTZdIC0gRml4IGludmFsaWQgZGVwZW5kZW5jeSBpbiBNYWtlZmlsZS5hbQorICAgICogW1RIUklGVC0yMTk0XSAtIE5vZGU6IE5vdCBhY3R1YWxseSBwcmVwZW5kaW5nIHJlc2lkdWFsIGRhdGEgaW4gVEZyYW1lZFRyYW5zcG9ydC5yZWNlaXZlcgorICAgICogW1RIUklGVC0yMTkzXSAtIEphdmEgY29kZSBnZW5lcmF0b3IgZW1pdHMgc3B1cmlvdXMgc2VtaWNvbG9uIHdoZW4gZGVlcCBjb3B5aW5nIGJpbmFyeSBkYXRhCisgICAgKiBbVEhSSUZULTIxOTFdIC0gRml4IGNoYXJwIEpTT05Qcm90b2NvbC5SZWFkSlNPTkRvdWJsZSAoc3BlY2lmeSBJbnZhcmlhbnRDdWx0dXJlKQorICAgICogW1RIUklGVC0yMjE0XSAtIFN5c3RlbSBoZWFkZXIgc3lzL3BhcmFtLmggaXMgaW5jbHVkZWQgaW5zaWRlIHRoZSBUaHJpZnQgbmFtZXNwYWNlCisgICAgKiBbVEhSSUZULTIxNzhdIC0gVGhyaWZ0IGdlbmVyYXRvciByZXR1cm5zIGVycm9yIGV4aXQgY29kZSBvbiAtLXZlcnNpb24KKyAgICAqIFtUSFJJRlQtMjE3MV0gLSBOb2RlSlMgaW1wbGVtZW50YXRpb24gaGFzIGV4dHJlbWVseSBsb3cgdGVzdCBjb3ZlcmFnZQorICAgICogW1RIUklGVC0yMTgzXSAtIGdlbSBpbnN0YWxsIGZhaWxzIG9uIHpzaAorICAgICogW1RIUklGVC0yMTgyXSAtIHNlZ2ZhdWx0IGluIHJlZ3Jlc3Npb24gdGVzdHMgKEdDIGJ1ZyBpbiByYl90aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSkKKyAgICAqIFtUSFJJRlQtMjE4MV0gLSBvbmV3YXkgY2FsbHMgZG9uJ3Qgd29yayBpbiBOb2RlSlMKKyAgICAqIFtUSFJJRlQtMjE2OV0gLSBKYXZhTUUgVGhyaWZ0IExpYnJhcnkgY2F1c2VzICJqYXZhLmlvLklPRXhjZXB0aW9uOiBObyBSZXNwb25zZSBFbnRyaWVzIEF2YWlsYWJsZSIgYWZ0ZXIgdXNpbmcgdGhlIFRocmlmdCBjbGllbnQgZm9yIHNvbWUgdGltZQorICAgICogW1RIUklGVC0yMTY4XSAtIE5vZGUuanMgYXBwZWFycyBicm9rZW4gKGF0IGxlYXN0LCBleGFtcGxlcyBkb24ndCB3b3JrIGFzIGludGVuZGVkKQorICAgICogW1RIUklGVC0yMjkzXSAtIFRTU0xUcmFuc3BvcnRGYWN0b3J5LmNyZWF0ZVNTTENvbnRleHQoKSBsZWF2ZXMgZmlsZXMgb3BlbgorICAgICogW1RIUklGVC0yMjc5XSAtIFRTZXJpYWxpemVyIG9ubHkgcmV0dXJucyB0aGUgZmlyc3QgMTAyNCBieXRlcyBzZXJpYWxpemVkCisgICAgKiBbVEhSSUZULTIyNzhdIC0gQnVmZmVyZWQgdHJhbnNwb3J0IGRvZXNuJ3Qgc3VwcG9ydCB3cml0ZXMgPiBidWZmZXIgc2l6ZQorICAgICogW1RIUklGVC0yMjc1XSAtIEZpeCBtZW1vcnkgbGVhayBpbiBnb2xhbmcgY29tcGFjdF9wcm90b2NvbC4KKyAgICAqIFtUSFJJRlQtMjI4Ml0gLSBJbmNvcmVjdCBjb2RlIGdlbmVyYXRlZCBmb3Igc29tZSB0eXBlZGVmcworICAgICogW1RIUklGVC0yMDA5XSAtIEdvIHJlZGVjbGFyYXRpb24gZXJyb3IKKyAgICAqIFtUSFJJRlQtMTk2NF0gLSAnSXNzZXQnIGNhdXNlcyBwcm9ibGVtcyB3aXRoIEMjLy5ORVQgc2VyaWFsaXplcnMKKyAgICAqIFtUSFJJRlQtMjAyNl0gLSBGaXggVENvbXBhY3RQcm90b2NvbCA2NCBiaXQgYnVpbGRzCisgICAgKiBbVEhSSUZULTIxMDhdIC0gRml4IFRBc3luY0NsaWVudE1hbmFnZXIgdGltZW91dCByYWNlCisgICAgKiBbVEhSSUZULTIwNjhdIC0gTXVsdGlwbGUgY2FsbHMgZnJvbSBzYW1lIGNvbm5lY3Rpb24gYXJlIG5vdCBwcm9jZXNzZWQgaW4gbm9kZQorICAgICogW1RIUklGVC0xNzUwXSAtIE1ha2UgY29tcGlsZXIgYnVpbGQgY2xlYW5seSB1bmRlciB2aXN1YWwgc3R1ZGlvIDEwCisgICAgKiBbVEhSSUZULTE3NTVdIC0gQ29tbWVudCBwYXJzaW5nIGJ1ZworICAgICogW1RIUklGVC0xNzcxXSAtICJtYWtlIGNoZWNrIiBmYWlscyBvbiB4NjQgZm9yIGxpYmJvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsuYQorICAgICogW1RIUklGVC0xODQxXSAtIE5vZGVKUyBUaHJpZnQgaW5jb3JyZWN0bHkgcGFyc2VzIG5vbi1VVEY4LXN0cmluZyB0eXBlcworICAgICogW1RIUklGVC0xOTA4XSAtIFVzaW5nIHBocCB0aHJpZnRfcHJvdG9jb2wgYWNjZWxlcmF0ZWQgdHJhbnNmZXIgY2F1c2VzIGNvcmUgZHVtcAorICAgICogW1RIUklGVC0xODkyXSAtIFNvY2tldCB0aW1lb3V0cyBhcmUgZGVjbGFyZWQgaW4gbWlsbGktc2Vjb25kcywgYnV0IGFyZSBhY3R1YWxseSBzZXQgaW4gbWljcm8tc2Vjb25kcworICAgICogW1RIUklGVC0yMzAzXSAtIFRCdWZmZXJyZWRUcmFuc3BvcnQgbm90IHByb3Blcmx5IGNsb3NpbmcgdW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMjMxM10gLSBub2RlanMgc2VydmVyIGNyYXNoIGFmdGVyIHByb2Nlc3NpbmcgdGhlIGZpcnN0IHJlcXVlc3Qgd2hlbiB1c2luZyBNdWx0aXBsZXhlZFByb2Nlc3Nvci9GcmFtZWRCdWZmZXIvQmluYXJ5UHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjMxMV0gLSBHbzogaW52YWxpZCBjb2RlIGdlbmVyYXRlZCB3aGVuIGV4Y2VwdGlvbiBuYW1lIGlzIGEgZ28ga2V5d29yZAorICAgICogW1RIUklGVC0yMzA4XSAtIG5vZGU6IFRKU09OUHJvdG9jb2wgcGFyc2UgZXJyb3Igd2hlbiByZWFkaW5nIGZyb20gYnVmZmVyZWQgbWVzc2FnZQorICAgICogW1RIUklGVC0yMzE2XSAtIGNjcDogVEZpbGVUcmFuc3BvcnRUZXN0CisgICAgKiBbVEhSSUZULTIzNTJdIC0gbXN2YyBmYWlsZWQgdG8gY29tcGlsZSB0aHJpZnQgdGVzdHMKKyAgICAqIFtUSFJJRlQtMjMzN10gLSBHb2xhbmcgZG9lcyBub3QgcmVwb3J0IFRJTUVEX09VVCBleGNlcHRpb25zCisgICAgKiBbVEhSSUZULTIzNDBdIC0gR2VuZXJhdGVkIHNlcnZlciBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzZW5kIHJlc3BvbnNlIHR5cGUgRVhDRVBUSU9OIG9uIHRoZSBUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5VTktOT1dOX01FVEhPRCBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMjM1NF0gLSBDb25uZWN0aW9uIGVycm9ycyBjYW4gbGVhZCB0byBjYXNlX2NsYXVzZSBleGNlcHRpb25zCisgICAgKiBbVEhSSUZULTIzMzldIC0gVW5jYXVnaHQgZXhjZXB0aW9uIGluIHRocmlmdCBjIyBkcml2ZXIKKyAgICAqIFtUSFJJRlQtMjM1Nl0gLSBjKysgdGhyaWZ0IGNsaWVudCBub3Qgd29ya2luZyB3aXRoIHNzbCAoU1NMX2Nvbm5lY3QgaGFuZ3MpCisgICAgKiBbVEhSSUZULTIzMzFdIC0gTWlzc2luZyBjYWxsIHRvIFJlYWRTdHJ1Y3RCZWdpbigpIGluIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5SZWFkKCkKKyAgICAqIFtUSFJJRlQtMjMyM10gLSBVbmNvbXBpbGVhYmxlIERlbHBoaSBjb2RlIGdlbmVyYXRlZCBmb3IgdHlwZWRlZidkIHN0cnVjdHMKKyAgICAqIFtUSFJJRlQtMjMyMl0gLSBDb3JyZWN0bHkgc2hvdyB0aGUgbnVtYmVyIG9mIHRpbWVzIEV4ZWN1dG9yU2VydmljZSAoamF2YSkgaGFzIHJlamVjdGVkIHRoZSBjbGllbnQuCisgICAgKiBbVEhSSUZULTIzODldIC0gbmFtZXNwYWNlcyBoYW5kbGVkIHdyb25nbHkgaW4gYWNyaW9uc2NyaXB0IDMuMCBpbXBsZW1lbnRhdGlvbgorICAgICogW1RIUklGVC0yMzg4XSAtIEdvTGFuZyAtIEZpeCBkYXRhIHJhY2VzIGluIHNpbXBsZV9zZXJ2ZXIgYW5kIHNlcnZlcl9zb2NrZXQKKyAgICAqIFtUSFJJRlQtMjM4Nl0gLSBUaHJpZnQgcmVmdXNlcyB0byBsaW5rIHl5bGV4CisgICAgKiBbVEhSSUZULTIzNzVdIC0gRXhjZXNzaXZlIDxicj4ncyBpbiBnZW5lcmF0ZWQgSFRNTAorICAgICogW1RIUklGVC0yMzczXSAtIHdhcm5pbmcgQ1MwNDE0IGluIFRIdHRwQ2xpZW50LmNzOiBwcml2YXRlIGZpZWxkICdUaHJpZnQuVHJhbnNwb3J0LlRIdHRwQ2xpZW50LmNvbm5lY3Rpb24nIGFzc2lnbmVkIGJ1dCBuZXZlciB1c2VkCisgICAgKiBbVEhSSUZULTIzNzJdIC0gdGhyaWZ0L2pzb25fcHJvdG9jb2wuZ286MTYwOiBmdW5jdGlvbiBlbmRzIHdpdGhvdXQgYSByZXR1cm4gc3RhdGVtZW50CisgICAgKiBbVEhSSUZULTIzNzFdIC0gcnVieSBidW5kbGVyIHZlcnNpb24gZmFpbHMgb24gfjEuMy4xLCByZW1vdmUgYW5kIHRha2UgbGF0ZXN0IGF2YWlsCisgICAgKiBbVEhSSUZULTIzNzBdIC0gQ29tcGlsZXIgU0VHRkFVTFRzIGdlbmVyYXRpbmcgSFRNTCBkb2N1bWVudGF0aW9uIGZvciBjb21wbGV4IHN0cnVjcmUKKyAgICAqIFtUSFJJRlQtMjM4NF0gLSBCaW5hcnkgbWFwIGtleXMgcHJvZHVjZSB1bmNvbXBpbGFibGUgY29kZSBpbiBnbworICAgICogW1RIUklGVC0yMzgwXSAtIHVucmVhY2hhYmxlIGNvZGUgKENJRCAxMTc0NTQ2LCBDSUQgMTE3NDY3OSkKKyAgICAqIFtUSFJJRlQtMjM3OF0gLSBzZXJ2aWNlIG1ldGhvZCBhcmd1bWVudHMgb2YgYmluYXJ5IHR5cGUgbGVhZCB0byB1bmNvbXBpbGVhYmxlIEdvIGNvZGUKKyAgICAqIFtUSFJJRlQtMjM2M10gLSBJc3N1ZSB3aXRoIGNoYXJhY3RlciBlbmNvZGluZyBvZiBTdWNjZXNzIHJldHVybmVkIGZyb20gTG9naW4gdXNpbmcgVGhyaWZ0IFByb3h5IGFuZCBOb2RlSlMKKyAgICAqIFtUSFJJRlQtMjM1OV0gLSBUQnVmZmVyZWRUcmFuc3BvcnQgZG9lc24ndCBjbGVhciBpdCdzIGJ1ZmZlciBvbiBhIGZhaWxlZCBmbHVzaCBjYWxsCisgICAgKiBbVEhSSUZULTI0MjhdIC0gUHl0aG9uIDMgc2V0dXAucHkgc3VwcG9ydAorICAgICogW1RIUklGVC0yMzY3XSAtIEJ1aWxkIGZhaWx1cmU6IHN0ZGxpYiBhbmQgYm9vc3QgYm90aCBkZWZpbmUgdWludDY0X3QKKyAgICAqIFtUSFJJRlQtMjM2NV0gLSBDIyBkZWNvZGVzIHRvbyBtYW55IGJpbmFyeSBieXRlcyBmcm9tIEpTT04KKyAgICAqIFtUSFJJRlQtMjQwMl0gLSBieXRlIGNvdW50IG9mIEZyYW1lQnVmZmVyIGluIEFXQUlUSU5HX0NMT1NFIHN0YXRlIGlzIG5vdCBzdWJ0cmFjdGVkIGZyb20gcmVhZEJ1ZmZlckJ5dGVzQWxsb2NhdGVkCisgICAgKiBbVEhSSUZULTIzOTZdIC0gQnVpbGQgRXJyb3Igb24gTWFjT1NYCisgICAgKiBbVEhSSUZULTIzOTVdIC0gdGhyaWZ0IFJ1YnkgZ2VtIHJlcXVpcmVzIGRldmVsb3BtZW50IGRlcGVuZGVuY3kgJ3RoaW4nIHJlZ2FyZGxlc3Mgb2YgZW52aXJvbm1lbnQKKyAgICAqIFtUSFJJRlQtMjQxNF0gLSBjX2dsaWIgZml4IHNldmVyYWwgYnVnLgorICAgICogW1RIUklGVC0yNDIwXSAtIEdvIGFyZ3VtZW50IHBhcnNlciBmb3IgbWV0aG9kcyB3aXRob3V0IGFyZ3VtZW50cyBkb2VzIG5vdCBza2lwIGZpZWxkcworICAgICogW1RIUklGVC0yNDM5XSAtIEJ1ZyBpbiBUUHJvdG9jb2xEZWNvcmF0b3IgQ2xhc3MgY2F1c2VzIHBhcnNpbmcgZXJyb3JzCisgICAgKiBbVEhSSUZULTI0MTldIC0gZ29sYW5nIC0gRml4IGZtdC5FcnJvcmYgaW4gZ2VuZXJhdGVkIGNvZGUKKyAgICAqIFtUSFJJRlQtMjQxOF0gLSBHbyBoYW5kbGVyIGZ1bmN0aW9uIHBhbmljcyBvbiBpbnRlcm5hbCBlcnJvcgorICAgICogW1RIUklGVC0yNDA1XSAtIE5vZGUuanMgTXVsdGlwbGV4ZXIgdGVzdHMgZmFpbCAoc2lsZW50bHkpCisgICAgKiBbVEhSSUZULTI1ODFdIC0gVEZEVHJhbnNwb3J0IGRlc3RydWN0b3Igc2hvdWxkIG5vdCB0aHJvdworICAgICogW1RIUklGVC0yNTc1XSAtIFRocmlmdCBpbmNsdWRlcyBzaWdpbmZvX3Qgd2l0aGluIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbCBuYW1lc3BhY2UKKyAgICAqIFtUSFJJRlQtMjU3N10gLSBURmlsZVRyYW5zcG9ydCAgbWlzc3VzZSBvZiBjbG9zZXNvY2tldCBvbiB3aW5kb3dzIHBsYXRmb3JtCisgICAgKiBbVEhSSUZULTI1NzZdIC0gSW1wbGVtZW50IFRocmlmdC5Qcm90b2NvbC5wcm90b3R5cGUuc2tpcCBtZXRob2QgaW4gSmF2YVNjcmlwdCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTI1ODhdIC0gVGhyaWZ0IGNvbXBpbGVyIGlzIG5vdCBidWlsZGFibGUgaW4gVmlzdWFsIFN0dWRpbyAyMDEwCisgICAgKiBbVEhSSUZULTI1OTRdIC0gSlMgQ29tcGlsZXI6IFNpbmdsZSBxdW90ZXMgYXJlIG5vdCBiZWluZyBlc2NhcGVkIGluIGNvbnN0YW50cy4KKyAgICAqIFtUSFJJRlQtMjU5MV0gLSBURnJhbWVkVHJhbnNwb3J0IGRvZXMgbm90IGhhbmRsZSBwYXlsb2FkcyBzcGxpdCBhY3Jvc3MgcGFja2V0cyBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMjU5OV0gLSBVbmNvbXBpbGVhYmxlIERlbHBoaSBjb2RlIGR1ZSB0byBuYW1pbmcgY29uZmxpY3RzIHdpdGggSURMCisgICAgKiBbVEhSSUZULTI1OTBdIC0gQysrIFZpc3VhbCBTdHVkaW8gc29sdXRpb24gZG9lc24ndCBpbmNsdWRlIE11bHRpcGxleGluZyBzdXBwb3J0CisgICAgKiBbVEhSSUZULTI1OTVdIC0gTm9kZS5qczogRml4IGdsb2JhbCBsZWFrcyBhbmQgY29weS1wYXN0ZSBlcnJvcnMKKyAgICAqIFtUSFJJRlQtMjU2NV0gLSBhdXRvY29uZiBmYWlscyB0byBmaW5kIG1pbmd3LWcrKyBjcm9zcyBjb21waWxlciBvbiB0cmF2aXMgQ0kKKyAgICAqIFtUSFJJRlQtMjU1NV0gLSBleGNlc3NpdmUgInVudXNlZCBmaWVsZCIgY29tbWVudHMKKyAgICAqIFtUSFJJRlQtMjU1NF0gLSBkb3VibGUgaW5pdGlhbGl6YXRpb24gaW4gZ2VuZXJhdGVkIFJlYWQoKSBtZXRob2QKKyAgICAqIFtUSFJJRlQtMjU1MV0gLSBPdXRPZk1lbW9yeUVycm9yICJ1bmFibGUgdG8gY3JlYXRlIG5ldyBuYXRpdmUgdGhyZWFkIiBraWxscyBzZXJ2ZSB0aHJlYWQKKyAgICAqIFtUSFJJRlQtMjU0M10gLSBHZW5lcmF0ZWQgZW51bSB0eXBlIGluIGhhc2tlbGwgc2hvdWxkIGJlIHF1YWxpZmllZAorICAgICogW1RIUklGVC0yNTYwXSAtIFRocmlmdCBjb21waWxlciBnZW5lcmF0b3IgdHJpZXMgdG8gY29uY2F0IGludHMgd2l0aCBzdHJpbmdzIHVzaW5nICsKKyAgICAqIFtUSFJJRlQtMjU1OV0gLSBDZW50b3MgNi41IHVuYWJsZSB0byAibWFrZSIgd2l0aCBUaHJpZnQgMC45LjEKKyAgICAqIFtUSFJJRlQtMjUyNl0gLSBBc3NpZ25tZW50IG9wZXJhdG9ycyBhbmQgY29weSBjb25zdHJ1Y3RvcnMgaW4gYysrIGRvbid0IGNvcHkgdGhlIF9faXNzZXQgc3RydWN0CisgICAgKiBbVEhSSUZULTI0NTRdIC0gY19nbGliOiBUaGVyZSBpcyBubyBnZXRob3N0YnluYW1lX3IoKSBpbiBzb21lIE9TLgorICAgICogW1RIUklGVC0yNDUxXSAtIERvIG5vdCB1c2UgcG9pbnRlcnMgZm9yIG9wdGlvbmFsIGZpZWxkcyB3aXRoIGRlZmF1bHRzLiBEbyBub3Qgd3JpdGUgc3VjaCBmaWVsZHMgaWYgaXRzIHZhbHVlIHNldCB0byBkZWZhdWx0LiBBbHNvLCBkbyBub3QgdXNlIHBvaW50ZXJzIGZvciBhbnkgb3B0aW9uYWwgZmllbGRzIG1hcHBlZCB0byBnbyBtYXAgb3Igc2xpY2UuIGdlbmVyYXRlIEdldCBhY2Nlc3NvcnMKKyAgICAqIFtUSFJJRlQtMjQ1MF0gLSBpbmNsdWRlIEhvd1RvQ29udHJpYnV0ZSBpbiB0aGUgc3JjIHJlcG8KKyAgICAqIFtUSFJJRlQtMjQ0OF0gLSB0aHJpZnQvdGVzdC90ZXN0LnNoIGhhcyBpbmNvcnJlY3QgTm9kZS5qcyB0ZXN0IHBhdGgKKyAgICAqIFtUSFJJRlQtMjQ2MF0gLSB1bm9wZW5lZCBzb2NrZXQgZmQgbXVzdCBiZSBsZXNzIHRoYW4gemVyby4KKyAgICAqIFtUSFJJRlQtMjQ1OV0gLSAtLXZlcnNpb24gc2hvdWxkIG5vdCBleGl0IDEKKyAgICAqIFtUSFJJRlQtMjQ2OF0gLSBUaW1lc3RhbXAgaGFuZGxpbmcKKyAgICAqIFtUSFJJRlQtMjQ2N10gLSBVbmFibGUgdG8gYnVpbGQgY29udHJpYi9mYjMwMyBvbiBPU1ggMTAuOS4yCisgICAgKiBbVEhSSUZULTI0NjZdIC0gSW1wcm9wZXIgZXJyb3IgaGFuZGxpbmcgZm9yIFNTTC9UTFMgY29ubmVjdGlvbnMgdGhhdCBkb24ndCBjb21wbGV0ZSBhIGhhbmRzaGFrZQorICAgICogW1RIUklGVC0yNDYzXSAtIHRlc3QvcHkvUnVuQ2xpZW50U2VydmVyLnB5IGZhaWxzIHNvbWV0aW1lcworICAgICogW1RIUklGVC0yNDU4XSAtIEdlbmVyYXRlZCBnb2xhbmcgc2VydmVyIGNvZGUgZm9yICJvbmV3YXkiIG1ldGhvZHMgaXMgaW5jb3JyZWN0CisgICAgKiBbVEhSSUZULTI0NTZdIC0gVEh0dHBDbGllbnQgZmFpbHMgd2hlbiB1c2luZyBhc3luYyBzdXBwb3J0IG91dHNpZGUgU2lsdmVybGlnaHQKKyAgICAqIFtUSFJJRlQtMjUyNF0gLSBWaXN1YWwgU3R1ZGlvIHByb2plY3QgaXMgbWlzc2luZyBUVGhyZWFkZWRTZXJ2ZXIgZmlsZXMKKyAgICAqIFtUSFJJRlQtMjUyM10gLSBWaXN1YWwgU3R1ZGlvIHByb2plY3QgaXMgbWlzc2luZyBPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCBmaWxlcworICAgICogW1RIUklGVC0yNTIwXSAtIGNwcDpjb2Jfc3R5bGUgZ2VuZXJhdGVzIGluY29ycmVjdCAudGNjIGZpbGUKKyAgICAqIFtUSFJJRlQtMjUwOF0gLSBVbmNvbXBpbGVhYmxlIEMjIGNvZGUgZHVlIHRvIGxhbmd1YWdlIGtleXdvcmRzIGluIElETAorICAgICogW1RIUklGVC0yNTA2XSAtIFVwZGF0ZSBUUHJvdG9jb2xFeGNlcHRpb24gZXJyb3IgY29kZXMgdG8gYmUgdXNlZCBjb25zaXN0ZW50bHkgdGhyb3VnaG91dCB0aGUgbGlicmFyeQorICAgICogW1RIUklGVC0yNTA1XSAtIGdvOiBzdHJ1Y3Qgc2hvdWxkIGFsd2F5cyBiZSBhIHBvaW50ZXIgdG8gYXZvaWQgY29weWluZyBvZiBwb3RlbnRpYWxseSBzaXplLXVuYm91bmRlZCBzdHJ1Y3RzCisgICAgKiBbVEhSSUZULTI1MTVdIC0gVExTIE1ldGhvZCBlcnJvciBkdXJpbmcgbWFrZQorICAgICogW1RIUklGVC0yNTAzXSAtIEMrKzogRml4IG5hbWUgY29sbGlzaW9uIHdoZW4gYSBzdHJ1Y3QgaGFzIGEgbWVtYmVyIG5hbWVkICJ2YWwiCisgICAgKiBbVEhSSUZULTI0NzddIC0gdGhyaWZ0IC0taGVscCB0ZXh0IHdpdGggbWlzcGxhY2VkIGNvbW1hCisgICAgKiBbVEhSSUZULTI0OTJdIC0gdGVzdC9jcHAgZG9lcyBub3QgY29tcGlsZSBvbiBtYWMKKyAgICAqIFtUSFJJRlQtMjUwMF0gLSBzZW5kaW5nIHJhbmRvbSBkYXRhIGNyYXNoZXMgdGhyaWZ0KGdvbGFuZykgc2VydmljZQorICAgICogW1RIUklGVC0yNDc1XSAtIGNfZ2xpYjogYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlIGZ1bmN0aW9uIHJldHVybiBhbHdheXMgVFJVRS4KKyAgICAqIFtUSFJJRlQtMjQ5NV0gLSBKYXZhU2NyaXB0L05vZGUgc3RyaW5nIGNvbnN0YW50cyBsYWNrIHByb3BlciBlc2NhcGluZworICAgICogW1RIUklGVC0yNDkxXSAtIHVuYWJsZSB0byBpbXBvcnQgZ2VuZXJhdGVkIFRocmlmdFRlc3Qgc2VydmljZQorICAgICogW1RIUklGVC0yNDkwXSAtIGNfZ2xpYjogaWYgZmFpbCB0byByZWFkIGEgZXhjZXB0aW9uIGZyb20gc2VydmVyLCBjbGllbnQgbWF5IGJlIG9jY3VycmVkIGRvdWJsZSBmcmVlCisgICAgKiBbVEhSSUZULTI0NzBdIC0gVEh0dHBIYW5kbGVyIHN3YWxsb3dzIGV4Y2VwdGlvbnMgZnJvbSBwcm9jZXNzb3IKKyAgICAqIFtUSFJJRlQtMjUzM10gLSBCb29zdCB2ZXJzaW9uIGluIHJlcXVpcmVtZW50cyBzaG91bGQgYmUgdXBkYXRlZAorICAgICogW1RIUklGVC0yNTMyXSAtIEphdmEgdmVyc2lvbiBpbiBpbnN0YWxsYXRpb24gcmVxdWlyZW1lbnRzIHNob3VsZCBiZSB1cGRhdGVkCisgICAgKiBbVEhSSUZULTI1MjldIC0gVEJ1ZmZlcmVkVHJhbnNwb3J0IHNwbGl0ICBUY3AgZGF0YSBidWcgaW4gbm9kZUpzCisgICAgKiBbVEhSSUZULTI1MzddIC0gUGF0aCBmb3IgImdvIGdldCIgZG9lcyBub3Qgd29yayAocHVsbCByZXF1ZXN0IDExNSkKKyAgICAqIFtUSFJJRlQtMjQ0M10gLSBOb2RlIGZhaWxzIGNyb3NzIGxhbmcgdGVzdHMKKyAgICAqIFtUSFJJRlQtMjQzN10gLSBBdXRob3IgZmllbGRzIGluIFB5dGhvbiBzZXR1cC5weSBtdXN0IGJlIHN0cmluZ3Mgbm90IGxpc3RzLgorICAgICogW1RIUklGVC0yNDM1XSAtIEphdmEgY29tcGlsZXIgZG9lc24ndCBsaWtlIHN0cnVjdCBtZW1iZXIgbmFtZXMgdGhhdCBhcmUgaWRlbnRpY2FsIHRvIGFuIGV4aXN0aW5nIGVudW0gb3Igc3RydWN0IHR5cGUKKyAgICAqIFtUSFJJRlQtMjQzNF0gLSBNaXNzaW5nIG5hbWVzcGFjZSBpbXBvcnQgZm9yIHBocCBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgaW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMjQzMl0gLSBGbGFreSBwYXJhbGxlbCBidWlsZAorICAgICogW1RIUklGVC0yNDMwXSAtIENyYXNoIGR1cmluZyBUVGhyZWFkUG9vbFNlcnZlciBzaHV0ZG93bgorICAgICogW1RIUklGVC02NjddIC0gUGVyaW9kIHNob3VsZCBub3QgYmUgYWxsb3dlZCBpbiBpZGVudGlmaWVyIG5hbWVzCisgICAgKiBbVEhSSUZULTEyMTJdIC0gTWVtYmVycyBjYXBpdGFsIGNhc2UgY29uZmxpY3QKKyAgICAqIFtUSFJJRlQtMjU4NF0gLSBFcnJvciBoYW5kbGVyIG5vdCBsaXN0ZW5lZCBvbiBqYXZhc2NyaXB0IGNsaWVudAorICAgICogW1RIUklGVC0yMjk0XSAtIEluY29ycmVjdCBNYWtlZmlsZSBnZW5lcmF0aW9uCisgICAgKiBbVEhSSUZULTI2MDFdIC0gRml4IHZhZ3JhbnQgdG8gd29yayBhZ2FpbiBmb3IgYnVpbGRzIGFnYWluCisgICAgKiBbVEhSSUZULTIwOTJdIC0gVE5vbmJsb2NraW5nIHNlcnZlciBzaG91bGQgcmVsZWFzZSBoYW5kbGVyIGFzIHNvb24gYXMgY29ubmVjdGlvbiBjbG9zZXMKKyAgICAqIFtUSFJJRlQtMjU1N10gLSBDUzA1NDIgbWVtYmVyIG5hbWVzIGNhbm5vdCBiZSB0aGUgc2FtZSBhcyB0aGVpciBlbmNsb3NpbmcgdHlwZQorICAgICogW1RIUklGVC0yNjA1XSAtIFRTb2NrZXQgd2FybmluZyBvbiBnY2MgNC44LjMKKyAgICAqIFtUSFJJRlQtMjYwN10gLSBUaHJlYWRNYW5hZ2VyLmNwcCB3YXJuaW5nIG9uIGNsYW5nKysgMy40CisgICAgKiBbVEhSSUZULTE5OThdIC0gVENvbXBhY3RQcm90b2NvbC50Y2MgLSBvbmUgbW9yZSB3YXJuaW5nIG9uIFZpc3VhbCAyMDEwCisgICAgKiBbVEhSSUZULTI2MTBdIC0gTVNWQyB3YXJuaW5nIGluIFRTb2NrZXQuY3BwCisgICAgKiBbVEhSSUZULTI2MTRdIC0gVE5vbmJsb2NraW5nU2VydmVyLmNwcCB3YXJuaW5ncyBvbiBNU1ZDCisgICAgKiBbVEhSSUZULTI2MDhdIC0gVE5vbmJsb2NraW5nU2VydmVyLmNwcCB3YXJuaW5ncyBvbiBjbGFuZyAzLjQKKyAgICAqIFtUSFJJRlQtMjYwNl0gLSBUaHJlYWRNYW5hZ2VyLmggd2FybmluZyBpbiBjbGFuZysrIDMuNAorICAgICogW1RIUklGVC0yNjA5XSAtIFRGaWxlVHJhbnNwb3J0LmggdW51c2VkIGZpZWxkIHdhcm5pbmcgKGNsYW5nIDMuNCkKKyAgICAqIFtUSFJJRlQtMjQxNl0gLSBDYW5ub3QgdXNlIFRDb21wYWN0UHJvdG9jb2wgd2l0aCBNU1ZDCisgICAgKiBbVEhSSUZULTE4MDNdIC0gUnVieSBUaHJpZnQgMC45LjAgdHJpZXMgdG8gZW5jb2RlIFVVSUQgdG8gVVRGOCBhbmQgY3Jhc2hlcworICAgICogW1RIUklGVC0yMzg1XSAtIFByb2JsZW0gd2l0aCBnZXRob3N0YnluYW1lMiBkdXJpbmcgbWFrZSBjaGVjaworICAgICogW1RIUklGVC0yMjYyXSAtIHRocmlmdCBzZXJ2ZXIgJ011dGF0ZVJvdycgb3BlcmF0aW9uIGdpdmVzIG5vIGluZGljYXRpb24gb2Ygc3VjY2VzcyAvIGZhaWx1cmUKKyAgICAqIFtUSFJJRlQtMjA0OF0gLSBQcmVmZXIgYm9vbGVhbiBjb250ZXh0IHRvIG51bGxwdHJfdCBjb252ZXJzaW9uCisgICAgKiBbVEhSSUZULTI1MjhdIC0gVGhyaWZ0IEVybGFuZyBMaWJyYXJ5OiBNdWx0aXBsZSB0aHJpZnQgYXBwbGljYXRpb25zIGluIG9uZSBidW5kbGUKKyAgICAqIFtUSFJJRlQtMTk5OV0gLSB3YXJuaW5nIG9uIGdjYyA0Ljcgd2hpbGUgY29tcGlsaW5nIEJvb3N0TXV0ZXguY3BwCisgICAgKiBbVEhSSUZULTIxMDRdIC0gU3RydWN0cyBsb3NlIGJpbmFyeSBkYXRhIHdoZW4gdHJhbnNmZXJyZWQgZnJvbSBzZXJ2ZXIgdG8gY2xpZW50IGluIEphdmEKKyAgICAqIFtUSFJJRlQtMjE4NF0gLSB1bmRlZmluZWQgbWV0aG9kIHJzcGVjX3ZlcmlmeSBmb3IgVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMjM1MV0gLSBQSFAgVENvbXBhY3RQcm90b2NvbCBoYXMgZmFpbHMgdG8gZGVjb2RlIG1lc3NhZ2VzCisgICAgKiBbVEhSSUZULTIwMTZdIC0gUmVzb3VyY2UgTGVhayBpbiB0aHJpZnQgc3RydWN0IHVuZGVyIGNvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9mdW5jdGlvbi5oCisgICAgKiBbVEhSSUZULTIyNzNdIC0gUGxlYXNlIGRlbGV0ZSBvbGQgcmVsZWFzZXMgZnJvbSBtaXJyb3Jpbmcgc3lzdGVtCisgICAgKiBbVEhSSUZULTIyNzBdIC0gRmF1bHR5IGxpYnJhcnkgdmVyc2lvbiBudW1iZXJpbmcgYXQgYnVpbGQgb3IgZG9jdW1lbnRhdGlvbgorICAgICogW1RIUklGVC0yMjAzXSAtIFRlc3RzIGtlZXBpbmcgZmFpbGluZyBvbiBKZW5raW5zIGFuZCBUcmF2aXMgQ0kKKyAgICAqIFtUSFJJRlQtMjM5OV0gLSB0aHJpZnQuZWw6IHJlY29nbml6ZSAiLy8iLXN0eWxlIGNvbW1lbnRzIGluIGVtYWNzIHRocmlmdC1tb2RlCisgICAgKiBbVEhSSUZULTI1ODJdIC0gIkZpbGVUcmFuc3BvcnQgZXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiB0cnlpbmcgdG8gdXNlIEphdmEncyBURmlsZVRyYW5zcG9ydAorICAgICogW1RIUklGVC0xNjgyXSAtIE11bHRpcGxlIHRocmVhZCBjYWxsaW5nIGEgU2VydmljZSBmdW5jdGlvbiB1bnNhZmVseSBjYXVzZXMgbWVzc2FnZSBjb3JydXB0aW9uIGFuZCB0ZXJtaW5hdGVzIHdpdGggQnJva2VuIFBpcGUKKyAgICAqIFtUSFJJRlQtMjM1N10gLSByZWN1cnNlIG9wdGlvbiBoYXMgbm8gZWZmZWN0IHdoZW4gZ2VuZXJhdGluZyBwaHAKKyAgICAqIFtUSFJJRlQtMjI0OF0gLSBHbyBnZW5lcmF0b3IgZG9lc24ndCBkZWFsIHdlbGwgd2l0aCBtYXAga2V5cyBvZiB0eXBlIGJpbmFyeQorICAgICogW1RIUklGVC0yNDI2XSAtIGNsYXJpZnkgSVAgcmlnaHRzIGFuZCBjb250cmlidXRpb25zIGZyb20gZmJ0aHJpZnQKKyAgICAqIFtUSFJJRlQtMjA0MV0gLSBUTm9uYmxvY2tpbmcgc2VydmVyIGNvbXBpbGF0aW9uIG9uIHdpbmRvd3MgKEFSSVRITUVUSUNfUklHSFRfU0hJRlQpCisgICAgKiBbVEhSSUZULTI0MDBdIC0gdGhyaWZ0LmVsOiByZWNvZ25pemUgIi8vIi1zdHlsZSBjb21tZW50cyBpbiBlbWFjcyB0aHJpZnQtbW9kZQorICAgICogW1RIUklGVC0xNzE3XSAtIEZpeCBkZWIgYnVpbGQgaW4gamVua2lucworICAgICogW1RIUklGVC0yMjY2XSAtIFRocmVhZE1hbmFnZXIuaDoyNDoxMDogZmF0YWwgZXJyb3I6ICd0cjEvZnVuY3Rpb25hbCcgZmlsZSBub3QgZm91bmQgb24gTWFjIDEwLjkgKE1hdmVyaWNrcykKKyAgICAqIFtUSFJJRlQtMTMwMF0gLSBUZXN0IGZhaWx1cmVzIHdpdGggcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKQorICAgICogW1RIUklGVC0yNDg3XSAtIFR1dG9yaWFsIHJlcXVpcmVzIHR3byBJREwgZmlsZXMgYnV0IG9ubHkgb25lIGlzIGxpbmtlZCBmcm9tIHRoZSBUaHJpZnQgd2ViIHNpdGUKKyAgICAqIFtUSFJJRlQtMjMyOV0gLSBtaXNzaW5nIHJlbGVhc2UgdGFncyB3aXRoaW4gZ2l0CisgICAgKiBbVEhSSUZULTIzMDZdIC0gY29uY3VyZW50IGNsaWVudCBjYWxscyB3aXRoIG5vZGVqcworICAgICogW1RIUklGVC0yMjIyXSAtIHJ1YnkgZ2VtIGNhbm5vdCBiZSBjb21waWxlZCBvbiBPUyBYIG1hdmVyaWNrcworICAgICogW1RIUklGVC0yMzgxXSAtIGNvZGUgd2hpY2ggZ2VuZXJhdGVkIGJ5IHRocmlmdDIvaGJhc2UudGhyaWZ0IGNvbXBpbGUgZXJyb3IKKyAgICAqIFtUSFJJRlQtMjM5MF0gLSBubyBjbG9zZSBldmVudCB3aGVuIGNvbm5lY3Rpb24gbG9zdAorICAgICogW1RIUklGVC0yMTQ2XSAtIFVuYWJsZSB0byBwYXNzIG11bHRpcGxlICItLWdlbiIgb3B0aW9ucyB0byB0aGUgdGhyaWZ0IGNvbXBpbGVyCisgICAgKiBbVEhSSUZULTI0MzhdIC0gVW5leHBlY3RlZCByZWFkRmllbGRFbmQgY2FsbCBjYXVzZXMgSlNPTiBQYXJzaW5nIGVycm9ycworICAgICogW1RIUklGVC0yNDk4XSAtIEVycm9yIG1lc3NhZ2UgIkludmFsaWQgbWV0aG9kIG5hbWUiIHdoaWxlIHRyeWluZyB0byBjYWxsIEhCYXNlIFRocmlmdCBBUEkKKyAgICAqIFtUSFJJRlQtODQxXSAtIEJ1aWxkIGNydWZ0CisgICAgKiBbVEhSSUZULTI1NzBdIC0gV3JvbmcgVVJMIGdpdmVuIGluIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9kZXZlbG9wZXJzCisgICAgKiBbVEhSSUZULTI2MDRdIC0gRml4IGRlYmlhbiBwYWNrYWdpbmcKKyAgICAqIFtUSFJJRlQtMjYxOF0gLSBVbmlnbm9yZSAvYWNsb2NhbCBmaWxlcyByZXF1aXJlZCBmb3IgYnVpbGQKKyAgICAqIFtUSFJJRlQtMjU2Ml0gLSAuL2NvbmZpZ3VyZSBjcmVhdGUgTWFrZUZpbGUgaW4gbGliL2Qgd2l0aCBlcnJvcnMKKyAgICAqIFtUSFJJRlQtMjU5M10gLSBVbmFibGUgdG8gYnVpbGQgdGhyaWZ0IG9uIHVidW50dS0xMi4wNCAoUHJlY2lzZSkKKyAgICAqIFtUSFJJRlQtMjQ2MV0gLSBDYW4ndCBpbnN0YWxsIHRocmlmdC0wLjguMCBvbiBPUyBYIDEwLjkuMgorICAgICogW1RIUklGVC0yNjAyXSAtIEZpeCBtaXNzaW5nIGRpc3QgZmlsZXMKKyAgICAqIFtUSFJJRlQtMjYyMF0gLSBGaXggcHl0aG9uIHBhY2thZ2luZworICAgICogW1RIUklGVC0yNTQ1XSAtIFRlc3QgQ1BQIGZhaWxzIHRvIGJ1aWxkIChwb3NzaWJseSB0eXBvKQorCisjIyBEb2N1bWVudGF0aW9uCisgICAgKiBbVEhSSUZULTIxNTVdIC0gQWRkaW5nIG9uZSBsaW5lciBndWlkZSB0byByZW5hbWUgdGhlIHZlcnNpb24uaC5pbiBhbmQgcmVuYW1lIHRocmlmdHkuY2MuaAorICAgICogW1RIUklGVC0xOTkxXSAtIEFkZCBleGNlcHRpb25zIHRvIGV4YW1wbGVzCisgICAgKiBbVEhSSUZULTIzMzRdIC0gYWRkIGEgdHV0b3JpYWwgZm9yIG5vZGUgSlMKKyAgICAqIFtUSFJJRlQtMjM5Ml0gLSBBY3Rpb25zY3JpcHQgdHV0b3JpYWwKKyAgICAqIFtUSFJJRlQtMjM4M10gLSBjb250cmliOiBzYW1wbGUgZm9yIGNvbm5lY3RpbmcgVGhyaWZ0IHdpdGggUmVidXMKKyAgICAqIFtUSFJJRlQtMjM4Ml0gLSBjb250cmliOiBzYW1wbGUgZm9yIGNvbm5lY3RpbmcgVGhyaWZ0IHdpdGggU1RPTVAKKworIyMgSW1wcm92ZW1lbnQKKyAgICAqIFtUSFJJRlQtMTQ1N10gLSBDYXBhY2l0eSBvZiBUZnJhbWVkVHJhbnNwb3J0IHdyaXRlIGJ1ZmZlciBpcyBuZXZlciByZXNldAorICAgICogW1RIUklGVC0xMTM1XSAtIE5vZGUuanMgdHV0b3JpYWwKKyAgICAqIFtUSFJJRlQtMTM3MV0gLSBTb2NrZXQgdGltZW91dHMgKFNPX1JDVlRJTUVPIGFuZCBTT19TTkRUSU1FTykgbm90IHN1cHBvcnRlZCBvbiBTb2xhcmlzCisgICAgKiBbVEhSSUZULTIxNDJdIC0gTWlub3IgdHdlYWtzIHRvIHRocmlmdC5lbCBmb3IgYmV0dGVyIGVtYWNzIHBhY2thZ2UgY29tcGF0aWJpbGl0eQorICAgICogW1RIUklGVC0yMjY4XSAtIE1vZGlmeSBUU2FzbFRyYW5zcG9ydCB0byBpZ25vcmUgVENQIGhlYWx0aCBjaGVja3MgZnJvbSBsb2FkYmFsYW5jZXJzCisgICAgKiBbVEhSSUZULTIyNjRdIC0gR2l0SHViIHBhZ2UgaW5jb3JyZWN0bHkgc3RhdGVzIHRoYXQgVGhyaWZ0IGlzIHN0aWxsIGluY3ViYXRpbmcKKyAgICAqIFtUSFJJRlQtMjI2M10gLSBBbHdheXMgZ2VuZXJhdGUgZ29vZCBoYXNoQ29kZSBmb3IgSmF2YQorICAgICogW1RIUklGVC0yMjMzXSAtIEphdmEgY29tcGlsZXIgc2hvdWxkIGRlZmVuc2l2ZWx5IGNvcHkgaXRzIGJpbmFyeSBpbnB1dHMKKyAgICAqIFtUSFJJRlQtMjIzOV0gLSBBZGRyZXNzIEZpbmRCdWdzIGVycm9ycworICAgICogW1RIUklGVC0yMjQ5XSAtIEFkZCBTTVAgQnVpbGQgb3B0aW9uIHRvIHRocmlmdC5zcGVjIChhbmQgdGhyZWUgY29uZmlnIGRlZmluZXMpCisgICAgKiBbVEhSSUZULTIyNTRdIC0gRXhjZXB0aW9ucyBnZW5lcmF0ZWQgYnkgR28gY29tcGlsZXIgc2hvdWxkIGltcGxlbWVudCBlcnJvciBpbnRlcmZhY2UKKyAgICAqIFtUSFJJRlQtMjI2MF0gLSBUaHJpZnQgaW1wb3NlcyB1bm5lZWRlZCBkZXBlbmRlbmN5IG9uIGNvbW1vbnMtbGFuZzMKKyAgICAqIFtUSFJJRlQtMjI1OF0gLSBBZGQgVExTIHYxLjEvMS4yIHN1cHBvcnQgdG8gVFNTTFNvY2tldC5jcHAKKyAgICAqIFtUSFJJRlQtMjIwNV0gLSBOb2RlLmpzIFRlc3QgU2VydmVyIHRvIHN1cHBvcnQgdGVzdC5qcyBKYXZhU2NyaXB0IEJyb3dzZXIgdGVzdCBhbmQgc3VuZHJ5IGZpeGVzCisgICAgKiBbVEhSSUZULTIyMDRdIC0gU1NMIGNsaWVudCBmb3IgdGhlIGNvY29hIGNsaWVudAorICAgICogW1RIUklGVC0yMTcyXSAtIEphdmEgY29tcGlsZXIgYWxsb2NhdGVzIG9wdGlvbmFscyBhcnJheSBmb3IgZXZlcnkgc3RydWN0IHdpdGggYW4gb3B0aW9uYWwgZmllbGQKKyAgICAqIFtUSFJJRlQtMjE4NV0gLSB1c2UgY2FiYWwgaW5zdGVhZCBvZiBydW5oYXNrZWxsIGluIGhhc2tlbGwgbGlicmFyeQorICAgICogW1RIUklGVC0xOTI2XSAtIFBIUCBDb25zdGFudCBHZW5lcmF0aW9uIFJlZmFjdG9yaW5nCisgICAgKiBbVEhSSUZULTIwMjldIC0gUG9ydCBDKysgdGVzdHMgdG8gV2luZG93cworICAgICogW1RIUklGVC0yMDU0XSAtIFRTaW1wbGVGaWxlVHJhbnNwb3J0IC0gSmF2YSBMaWIgaGFzIG5vIHN0cmFpZ2h0IGZvcndhcmQgVFRyYW5zcG9ydCBiYXNlZCBmaWxlIHRyYW5zcG9ydAorICAgICogW1RIUklGVC0yMDQwXSAtICJ1bmluaXRpYWxpemVkIHZhcmlhYmxlIiB3YXJuaW5ncyBvbiBNU1ZDL3dpbmRvd3MKKyAgICAqIFtUSFJJRlQtMjAzNF0gLSBHaXZlIGRldmVsb3BlcnMnIEMrKyBjb2RlIGRpcmVjdCBhY2Nlc3MgdG8gc29ja2V0IEZEcyBvbiBzZXJ2ZXIgc2lkZQorICAgICogW1RIUklGVC0yMDk1XSAtIFVzZSBwcmludCBmdW5jdGlvbiBmb3IgUHl0aG9uIDMgY29tcGF0aWJsaXR5CisgICAgKiBbVEhSSUZULTE4NjhdIC0gTWFrZSB0aGUgVFBDIGJhY2tsb2cgY29uZmlndXJhYmxlIGluIHRoZSBKYXZhIHNlcnZlcnMKKyAgICAqIFtUSFJJRlQtMTgxM10gLSBBZGQgQEdlbmVyYXRlZCBhbm5vdGF0aW9uIHRvIGdlbmVyYXRlZCBjbGFzc2VzCisgICAgKiBbVEhSSUZULTE4MTVdIC0gQ29kZSBnZW5lcmF0b3JzIGxpbmUgYnVmZmVyIG91dHB1dAorICAgICogW1RIUklGVC0yMzA1XSAtIFRGcmFtZWRUcmFuc3BvcnQgZW1wdHkgY29uc3RydWN0b3Igc2hvdWxkIHByb2JhYmx5IGJlIHByaXZhdGUKKyAgICAqIFtUSFJJRlQtMjMwNF0gLSBNb3ZlIGNsaWVudCBhc3NpZ25tZW50cyBmcm9tIGNvbnN0cnV0b3IgaW4gbWV0aG9kCisgICAgKiBbVEhSSUZULTIzMDldIC0gUnVieSAoZ2VtKSAmIFBIUCBSUE0gc3VicGFja2FnZXMKKyAgICAqIFtUSFJJRlQtMjMxOF0gLSBwZXJsOiBkZXBlbmRlbmN5IENsYXNzOjpBY2Nlc3NvciBub3QgY2hlY2tlZAorICAgICogW1RIUklGVC0yMzE3XSAtIGV4Y2x1ZGUgdHV0b3JpYWwgZnJvbSBidWlsZAorICAgICogW1RIUklGVC0yMzIwXSAtIFByb2dyYW0gbGV2ZWwgZG9jdGV4dCBkb2VzIG5vdCBnZXQgYXR0YWNoZWQgYnkgcGFyc2VyCisgICAgKiBbVEhSSUZULTIzNDldIC0gR29sYW5nIC0gaW1wcm92ZSB0dXRvcmlhbAorICAgICogW1RIUklGVC0yMzQ4XSAtIFBIUCBHZW5lcmF0b3I6IGFkZCBhcnJheSB0eXBlaGludCB0byBmdW5jdGlvbnMKKyAgICAqIFtUSFJJRlQtMjM0NF0gLSBjb25maWd1cmUuYWM6IGNvbXBpbGVyLW9ubHkgb3B0aW9uCisgICAgKiBbVEhSSUZULTIzNDNdIC0gR29sYW5nIC0gUmV0dXJuIGEgc2luZ2xlIGVycm9yIGZvciBhbGwgZXhjZXB0aW9ucyBpbnN0ZWFkIG9mIG11bHRpcGxlIHJldHVybiB2YWx1ZXMKKyAgICAqIFtUSFJJRlQtMjM0MV0gLSBFbmFibGUgZ2VuZXJhdGlvbiBvZiBEZWxwaGkgWE1MRG9jIGNvbW1lbnRzIChhLmsuYS4gIkhlbHAgSW5zaWdodCIpCisgICAgKiBbVEhSSUZULTIzNTVdIC0gQWRkIFNTTCBhbmQgV2ViIFNvY2tldCBTdXBwb3J0IHRvIE5vZGUgYW5kIEphdmFTY3JpcHQKKyAgICAqIFtUSFJJRlQtMjM1MF0gLSBBZGQgYXN5bmMgY2FsbHMgdG8gbm9ybWFsIEphdmFTY3JpcHQKKyAgICAqIFtUSFJJRlQtMjMzMF0gLSBHZW5lcmF0ZSBQSFBEb2MgY29tbWVudHMKKyAgICAqIFtUSFJJRlQtMjMzMl0gLSBSUE1CVUlMRDogcnVuIGJvb3RzdHJhcCAoaWYgbmVlZGVkKQorICAgICogW1RIUklGVC0yMzkxXSAtIHNpbXBsZSBzb2NrZXQgdHJhbnNwb3J0IGZvciBhY3Rpb25zY3JpcHQgMy4wCisgICAgKiBbVEhSSUZULTIzNzZdIC0gbm9kZWpzOiBhbGxvdyBQcm9taXNlIHN0eWxlIGNhbGxzIGZvciBjbGllbnQgYW5kIHNlcnZlcgorICAgICogW1RIUklGVC0yMzY5XSAtIEFkZCBzc2wgc3VwcG9ydCBmb3Igbm9kZWpzIGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTI0MDFdIC0gSGFza2VsbCB0dXRvcmlhbCBjb21waWxlcworICAgICogW1RIUklGVC0yNDE3XSAtIEMjIFVuaW9uIGNsYXNzZXMgYXJlIG5vdCBwYXJ0aWFsCisgICAgKiBbVEhSSUZULTI0MTVdIC0gTmFtZWQgcGlwZXMgc2VydmVyIHBlcmZvcm1hbmNlICYgbWVzc2FnZSBtb2RlCisgICAgKiBbVEhSSUZULTI0MDRdIC0gZW1pdCB3YXJuaW5nIG9uICh0eXBpY2FsbHkgaW5lZmZpY2llbnQpIGxpc3Q8Ynl0ZT4KKyAgICAqIFtUSFJJRlQtMjM5OF0gLSBJbXByb3ZlIE5vZGUgU2VydmVyIExpYnJhcnkKKyAgICAqIFtUSFJJRlQtMjM5N10gLSBBZGQgQ09SUyBhbmQgQ1NQIHN1cHBvcnQgZm9yIEphdmFTY3JpcHQgYW5kIE5vZGUuanMgbGlicmFyaWVzCisgICAgKiBbVEhSSUZULTI0MDddIC0gdXNlIG1hcmtkb3duIChyZW5hbWUgUkVBRE1FID0+IFJFQURNRS5tZCkKKyAgICAqIFtUSFJJRlQtMjMwMF0gLSBEIGNvbmZpZ3VyZSBpbmZvIG91dHB1dCBzaG91bGQgZm9sbG93IHNhbWUgZm9ybWF0IGFzIG90aGVyIGxhbmd1YWdlcworICAgICogW1RIUklGVC0yNTc5XSAtIFdpbmRvd3MgQ0Ugc3VwcG9ydAorICAgICogW1RIUklGVC0yNTc0XSAtIENvbXBpbGVyIG9wdGlvbiB0byBnZW5lcmF0ZSBuYW1lc3BhY2UgZGlyZWN0b3JpZXMgZm9yIFJ1YnkKKyAgICAqIFtUSFJJRlQtMjU3MV0gLSBTaW1wbGlmeSBjcm9zcyBjb21waWxhdGlvbiB1c2luZyBDTWFrZQorICAgICogW1RIUklGVC0yNTY5XSAtIEludHJvZHVjZSBmaWxlIHRvIHNwZWNpZnkgdGhpcmQgcGFydHkgbGlicmFyeSBsb2NhdGlvbnMgb24gV2luZG93cworICAgICogW1RIUklGVC0yNTY4XSAtIEltcGxlbWVudCBvd24gY2VydGlmaWNhdGUgaGFuZGxlcgorICAgICogW1RIUklGVC0yNTUyXSAtIGVsaW1pbmF0ZSB3YXJuaW5nIGZyb20gY29uZmlndXJlLmFjCisgICAgKiBbVEhSSUZULTI1NDldIC0gR2VuZXJhdGUganNvbiB0YWcgZm9yIHN0cnVjdCBtZW1iZXJzLiB1c2UgZ28udGFnIGFubm90YXRpb24gdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZ2VuZXJhdGVkIHRhZy4KKyAgICAqIFtUSFJJRlQtMjU0NF0gLSBBZGQgc3VwcG9ydCBmb3Igc29ja2V0IHRyYW5zcG9ydCBmb3IgYyMgbGlicmFyeSB3aGVuIHVzaW5nIFdpbmRvd3MgUGhvbmUgcHJvamVjdHMKKyAgICAqIFtUSFJJRlQtMjQ1M10gLSBoYXNrZWxsIHR1dG9yaWFsOiBmaXggdXAgZGl2aXNpb24gYnkgMCBleGFtcGxlCisgICAgKiBbVEhSSUZULTI0NDldIC0gRW5oYW5jZSB0eXBlZGVmIHN0cnVjdHVyZSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGZvcndhcmRzIGFuZCByZWFsIHR5cGVkZWZzCisgICAgKiBbVEhSSUZULTI0NDZdIC0gVGhlcmUgaXMgbm8gd2F5IHRvIGhhbmRsZSBzZXJ2ZXIgc3RyZWFtIGVycm9ycworICAgICogW1RIUklGVC0yNDU1XSAtIEFsbG93IGNsaWVudCBjZXJ0aWZpY2F0ZXMgdG8gYmUgdXNlZCB3aXRoIFRIdHRwQ2xpZW50CisgICAgKiBbVEhSSUZULTI1MTFdIC0gTm9kZS5qcyBuZWVkcyB0aGUgY29tcGFjdCBwcm90b2NvbAorICAgICogW1RIUklGVC0yNDkzXSAtIE5vZGUuanMgbGliIG5lZWRzIEhUVFAgY2xpZW50CisgICAgKiBbVEhSSUZULTI1MDJdIC0gT3B0aW1pemUgZ28gaW1wbGVtZW50YXRpb25zIG9mIGJpbmFyeSBhbmQgY29tcGFjdCBwcm90b2NvbHMgZm9yIHNwZWVkCisgICAgKiBbVEhSSUZULTI0OTRdIC0gQWRkIGVudW0gdG9TdHJpbmcgaGVscGVyIGZ1bmN0aW9uIGluIGNfZ2xpYgorICAgICogW1RIUklGVC0yNDcxXSAtIE1ha2UgY3BwLnJlZiBhbm5vdGF0aW9uIGxhbmd1YWdlIGFnbm9zdGljCisgICAgKiBbVEhSSUZULTI0OTddIC0gc2VydmVyIGFuZCBjbGllbnQgZm9yIHRlc3QvZ28sIGFsc28gc2V2ZXJhbCBmaXhlcyBhbmQgaW1wcm92ZW1lbnRzCisgICAgKiBbVEhSSUZULTI1MzVdIC0gVEpTT05Qcm90b2NvbCB3aGVuIHNlcmlhbGl6ZWQgeWllbGRzIFRGaWVsZCBpZHMgcmF0aGVyIHRoYW4gbmFtZXMKKyAgICAqIFtUSFJJRlQtMjIyMF0gLSBBZGQgYSBuZXcgc3RydWN0IHN0cnVjdHY/CisgICAgKiBbVEhSSUZULTEzNTJdIC0gVGhyaWZ0IHNlcnZlcgorICAgICogW1RIUklGVC05ODldIC0gUHVzaCBib29zdCBtNCBtYWNyb3MgdXBzdHJlYW0KKyAgICAqIFtUSFJJRlQtMTM0OV0gLSBSZW1vdmUgdW5uZWNlc3NhcnkgcHJpbnQgb3V0cworICAgICogW1RIUklGVC0yNDk2XSAtIHNlcnZlciBhbmQgY2xpZW50IGZvciB0ZXN0L2dvLCBhbHNvIHNldmVyYWwgZml4ZXMgYW5kIGltcHJvdmVtZW50cworICAgICogW1RIUklGVC0xMTE0XSAtIE1hdmVuIHB1Ymxpc2ggc2hvdWxkbid0IHJlcXVpcmUgcGFzc3dvcmRzIGhhcmRjb2RlZCBpbiBzZXR0aW5ncy54bWwKKyAgICAqIFtUSFJJRlQtMjA0M10gLSB2aXN1YWwgMjAxMCB3YXJuaW5ncyAtIHVucmVhY2hhYmxlIGNvZGUKKyAgICAqIFtUSFJJRlQtMTY4M10gLSBJbXBsZW1lbnQgYWx0ZXJuYXRpdmVzIHRvIEphdmFzY3JpcHQgQ2xpZW50IHNpZGUgVHJhbnNwb3J0IHByb3RvY29sLCBqdXN0IGFzIE5QQVBJIGFuZCBXZWJTb2NrZXQuCisgICAgKiBbVEhSSUZULTE3NDZdIC0gcHJvdmlkZSBhIFNQRFggZmlsZQorICAgICogW1RIUklGVC0xNzcyXSAtIFNlcmlhbGl6YXRpb24gZG9lcyBub3QgY2hlY2sgdHlwZXMgb2YgZW1iZWRkZWQgc3RydWN0dXJlcy4KKyAgICAqIFtUSFJJRlQtMjM4N10gLSBub2RlanM6IGV4dGVybmFsIGltcG9ydHMgc2hvdWxkIGJlIGNlbnRyYWxpemVkIGluIGluZGV4LmpzCisgICAgKiBbVEhSSUZULTIwMzddIC0gTW9yZSBnZW5lcmFsIG1hY3JvIFRIUklGVF9VTlVTRURfVkFSSUFCTEUKKworIyMgTmV3IEZlYXR1cmUKKyAgICAqIFtUSFJJRlQtMTAxMl0gLSBUcmFuc3BvcnQgZm9yIERhdGFJbnB1dCBEYXRhT3V0cHV0IGludGVyZmFjZQorICAgICogW1RIUklGVC0yMjU2XSAtIFVzaW5nIGMrKzExL2MrKzB4IHN0ZCBsaWJyYXJ5ICByZXBsYWNlIGJvb3N0IGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMjI1MF0gLSBKU09OIGFuZCBNZW1vcnlCdWZmZXIgZm9yIEphdmFNRQorICAgICogW1RIUklGVC0yMTE0XSAtIFB5dGhvbiBTZXJ2aWNlIFJlbW90ZSBTU0wgT3B0aW9uCisgICAgKiBbVEhSSUZULTE3MTldIC0gU0FTTCBjbGllbnQgc3VwcG9ydCBmb3IgUHl0aG9uCisgICAgKiBbVEhSSUZULTE4OTRdIC0gVGhyaWZ0IG11bHRpLXRocmVhZGVkIGFzeW5jIEphdmEgU2VydmVyIHVzaW5nIEphdmEgNyBBc3luY2hyb25vdXNDaGFubmVsR3JvdXAKKyAgICAqIFtUSFJJRlQtMTg5M10gLSBIVFRQL0pTT04gc2VydmVyL2NsaWVudCBmb3Igbm9kZSBqcworICAgICogW1RIUklGVC0yMzQ3XSAtIEMjIFRMUyBUcmFuc3BvcnQgYmFzZWQgb24gVEhSSUZULTE4MQorICAgICogW1RIUklGVC0yMzc3XSAtIEFsbG93IGFkZGl0aW9uIG9mIGN1c3RvbSBIVFRQIEhlYWRlcnMgdG8gYW4gSFRUUCBUcmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMjQwOF0gLSBOYW1lZCBQaXBlIFRyYW5zcG9ydCBPcHRpb24gZm9yIEMjCisgICAgKiBbVEhSSUZULTI1NzJdIC0gQWRkIHN0cmluZy9jb2xsZWN0aW9uIGxlbmd0aCBsaW1pdCBjaGVja3MgKGZyb20gQysrKSB0byBqYXZhIHByb3RvY29sIHJlYWRlcnMKKyAgICAqIFtUSFJJRlQtMjQ2OV0gLSAiamF2YTpmdWxsY2FtZWwiIG9wdGlvbiB0byBhdXRvbWF0aWNhbGx5IGNhbWVsLWNhc2UgdW5kZXJzY29yZWQgYXR0cmlidXRlIG5hbWVzCisgICAgKiBbVEhSSUZULTc5NV0gLSBJbXBvcnRpbmcgc2VydmljZSBmdW5jdGlvbnMgKHNpbXVsYXRpb24gbXVsdGlwbGUgaW5oZXJpdGFuY2UpCisgICAgKiBbVEhSSUZULTIxNjRdIC0gQWRkIGEgR2V0L1Bvc3QgSHR0cCBTZXJ2ZXIgdG8gTm9kZSBhbG9uZyB3aXRoIGV4YW1wbGVzCisgICAgKiBbVEhSSUZULTIyNTVdIC0gYWRkIFBhcmVudCBDbGFzcyBmb3IgZ2VuZXJhdGVkIFN0cnVjdCBjbGFzcworCisjIyBRdWVzdGlvbgorICAgICogW1RIUklGVC0yNTM5XSAtIFRzb2NrZXQuY3BwIGFkZHJpbmZvIGFpX2ZsYWdzID0gQUlfQUREUkNPTkZJRworICAgICogW1RIUklGVC0yNDQwXSAtIGhvdyB0byBjb25uZWN0IGFzMyB0byBqYXZhIGJ5IHRocmlmdCAsCisgICAgKiBbVEhSSUZULTIzNzldIC0gTWVtbW9yeSBsZWFraW5nIHdoaWxlIHVzaW5nIG11bHRpdGhyZWFkaW5nIGluIEMrKyBzZXJ2ZXIuCisgICAgKiBbVEhSSUZULTIyNzddIC0gVGhyaWZ0OiBpbnN0YWxsaW5nIGZiMzAzIGVycm9yCisgICAgKiBbVEhSSUZULTI1NjddIC0gQ3NoYXJwIHNsb3cgPworICAgICogW1RIUklGVC0yNTczXSAtIHRocmlmdCAwLjkuMiByZWxlYXNlCisKKyMjIFN1Yi10YXNrCisgICAgKiBbVEhSSUZULTk4MV0gLSBjb2NvYTogYWRkIHZlcnNpb24gSW5mbyB0byB0aGUgbGlicmFyeQorICAgICogW1RIUklGVC0yMTMyXSAtIEdvOiBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMgb24gYW55IFRyYW5zcG9ydCwgUHJvdG9jb2wgYW5kIFNlcnZlcgorICAgICogW1RIUklGVC0yMjk5XSAtIFRKc29uUHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIFJ1YnkgZG9lcyBub3QgYWxsb3cgZm9yIGJvdGggcG9zc2libGUgc2xhc2ggKHNvbGlkdXMpIGVuY29kaW5ncworICAgICogW1RIUklGVC0yMjk4XSAtIFRKc29uUHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIEMjIGRvZXMgbm90IGFsbG93IGZvciBib3RoIHBvc3NpYmxlIHNsYXNoIChzb2xpZHVzKSBlbmNvZGluZ3MKKyAgICAqIFtUSFJJRlQtMjI5N10gLSBUSnNvblByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciBEZWxwaGkgZG9lcyBub3QgYWxsb3cgZm9yIGJvdGggcG9zc2libGUgc2xhc2ggKHNvbGlkdXMpIGVuY29kaW5ncworICAgICogW1RIUklGVC0yMjcxXSAtIEphdmFTY3JpcHQ6IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcworICAgICogW1RIUklGVC0yMjUxXSAtIGdvIHRlc3QgZm9yIGNvbXBhY3QgcHJvdG9jb2wgaXMgbm90IHJ1bm5pbmcKKyAgICAqIFtUSFJJRlQtMjE5NV0gLSBEZWxwaGk6IEFkZCBldmVudCBoYW5kbGVycyBmb3Igc2VydmVyIGFuZCBwcm9jZXNzaW5nIGV2ZW50cworICAgICogW1RIUklGVC0yMTc2XSAtIFRTaW1wbGVKU09OUHJvdG9jb2wuUmVhZEZpZWxkQmVnaW4oKSBkb2VzIG5vdCByZXR1cm4gZmllbGQgdHlwZSBhbmQgSUQKKyAgICAqIFtUSFJJRlQtMjE3NV0gLSBXcm9uZyBmaWVsZCB0eXBlIHNldCBmb3IgYmluYXJ5CisgICAgKiBbVEhSSUZULTIxNzRdIC0gRGVzZXJpYWxpemluZyBKU09OIGZhaWxzIGluIHNwZWNpZmljIGNhc2VzCisgICAgKiBbVEhSSUZULTIwNTNdIC0gTm9kZUpTOiBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMKKyAgICAqIFtUSFJJRlQtMTkxNF0gLSBQeXRob246IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcyBvbiBhbnkgVHJhbnNwb3J0LCBQcm90b2NvbCBhbmQgU2VydmVyCisgICAgKiBbVEhSSUZULTE4MTBdIC0gYWRkIHJ1YnkgdG8gdGVzdC90ZXN0LnNoCisgICAgKiBbVEhSSUZULTIzMTBdIC0gUEhQOiBDbGllbnQtc2lkZSBzdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMKKyAgICAqIFtUSFJJRlQtMjM0Nl0gLSBDIzogVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCisgICAgKiBbVEhSSUZULTIzNDVdIC0gRGVscGhpOiBVVEYtOCBzZW50IGJ5IFBIUCBhcyBKU09OIGlzIG5vdCB1bmRlcnN0b29kIGJ5IFRKc29uUHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjMzOF0gLSBGaXJzdCBkb2N0ZXh0IHdyb25nbHkgaW50ZXJwcmV0ZWQgYXMgcHJvZ3JhbSBkb2N0ZXh0IGluIHNvbWUgY2FzZXMKKyAgICAqIFtUSFJJRlQtMjMyNV0gLSBTU0wgdGVzdCBjZXJ0aWZpY2F0ZXMKKyAgICAqIFtUSFJJRlQtMjM1OF0gLSBDKys6IGFkZCBjb21wYWN0IHByb3RvY29sIHRvIGNyb3NzIGxhbmd1YWdlIHRlc3Qgc3VpdGUKKyAgICAqIFtUSFJJRlQtMjQyNV0gLSBQSFA6IFNlcnZlci1zaWRlIHN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcworICAgICogW1RIUklGVC0yNDIxXSAtIFRyZWUvUmVjdXJzaXZlIHN0cnVjdCBzdXBwb3J0IGluIHRocmlmdAorICAgICogW1RIUklGVC0yMjkwXSAtIFVwZGF0ZSBHbyB0dXRvcmlhbCB0byBhbGlnbiB3aXRoIFRIUklGVC0yMjMyCisgICAgKiBbVEhSSUZULTI1NThdIC0gQ1NoYXJwIGNvbXBpbGVyIGdlbmVyYXRvciB0cmllcyB0byBjb25jYXQgaW50cyB3aXRoIHN0cmluZ3MgdXNpbmcgKworICAgICogW1RIUklGVC0yNTA3XSAtIEFkZGl0aW9uYWwgTFVBIFRQcm90b2NvbEV4Y2VwdGlvbiBlcnJvciBjb2RlIG5lZWRlZD8KKyAgICAqIFtUSFJJRlQtMjQ5OV0gLSBDb21waWxlcjogYWxsb3cgYW5ub3RhdGlvbnMgd2l0aG91dCAiPSB2YWx1ZSIKKyAgICAqIFtUSFJJRlQtMjUzNF0gLSBDcm9zcyBsYW5ndWFnZSB0ZXN0IHJlc3VsdHMgc2hvdWxkIHJlY29yZGVkIHRvIGEgc3RhdHVzLm1kIG9yIHN0YXR1cy5odG1sIGZpbGUgYXV0b21hdGljYWxseQorICAgICogW1RIUklGVC02Nl0gLSBKYXZhOiBBbGxvdyBtdWx0aXBsZXhpbmcgbXVsdGlwbGUgc2VydmljZXMgb3ZlciBhIHNpbmdsZSBUQ1AgY29ubmVjdGlvbgorICAgICogW1RIUklGVC0xNjgxXSAtIEFkZCBMdWEgU3VwcG9ydAorICAgICogW1RIUklGVC0xNzI3XSAtIFJ1YnktMS45OiBkYXRhIGxvc3M6ICJiaW5hcnkiIGZpZWxkcyBhcmUgcmUtZW5jb2RlZAorICAgICogW1RIUklGVC0xNzI2XSAtIFJ1YnktMS45OiAiYmluYXJ5IiBmaWVsZHMgYXJlIHJlcHJlc2VudGVkIGJ5IHN0cmluZyB3aG9zZSBlbmNvZGluZyBpcyAiVVRGLTgiCisgICAgKiBbVEhSSUZULTk4OF0gLSBwZXJsOiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5IHZpYSBjb25maWd1cmUKKyAgICAqIFtUSFJJRlQtMzM0XSAtIENvbXBhY3QgUHJvdG9jb2wgZm9yIFBIUAorICAgICogW1RIUklGVC0yNDQ0XSAtIHB1bGwgcmVxdWVzdCA4ODogdGhyaWZ0OiBjbGVhbiB1cCBlbnVtIHZhbHVlIGFzc2lnbm1lbnQKKworIyMgVGFzaworICAgICogW1RIUklGVC0yMjIzXSAtIFNwYW0gbGlua3Mgb24gd2lraQorICAgICogW1RIUklGVC0yNTY2XSAtIFBsZWFzZSBjcmVhdGUgYSBET0FQIGZpbGUgZm9yIHlvdXIgVExQCisgICAgKiBbVEhSSUZULTIyMzddIC0gVXBkYXRlIGFyY2hpdmUgdG8gY29udGFpbiBhbGwgdmVyc2lvbnMKKyAgICAqIFtUSFJJRlQtOTYyXSAtIFR1dG9yaWFsIHBhZ2Ugb24gb3VyIHdlYnNpdGUgaXMgcmVhbGx5IHVuaGVscGZ1bAorCisjIyBUZXN0CisgICAgKiBbVEhSSUZULTIzMjddIC0gbm9kZWpzOiBub2RlanMgdGVzdCBzdWl0ZSBzaG91bGQgYmUgYnVuZGxlZCB3aXRoIHRoZSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTI0NDVdIC0gVEhSSUZULTIzODQgKGNvZGUgZ2VuZXJhdGlvbiBmb3IgZ28gbWFwcyB3aXRoIGJpbmFyeSBrZXlzKSBzaG91bGQgYmUgdGVzdGVkCisgICAgKiBbVEhSSUZULTI1MDFdIC0gQyMgVGhlIHRlc3QgcGFyYW1ldGVycyBmcm9tIHRoZSBUZXN0U2VydmVyIGFuZCBUZXN0Q2xpZW50IGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL3Rlc3QvCisKKyMjIFdpc2gKKyAgICAqIFtUSFJJRlQtMjE5MF0gLSBBZGQgdGhlIEphdmFTY3JpcHQgdGhyaWZ0LmpzIGxpYiB0byB0aGUgQm93ZXIgcmVnaXN0cnkKKyAgICAqIFtUSFJJRlQtMjA3Nl0gLSBib29zdDo6b3B0aW9uYWwgaW5zdGVhZCBvZiBfX2lzc2V0CisKKworCitUaHJpZnQgMC45LjEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBCdWcKKyAgICAqIFtUSFJJRlQtMTQ0MF0gLSBkZWJpYW4gcGFja2FnaW5nOiBtaW5vci1pc2ggcG9saWN5IHByb2JsZW1zCisgICAgKiBbVEhSSUZULTE0MDJdIC0gR2VuZXJhdGVkIFlfdHlwZXMuanMgZG9lcyBub3QgcmVxdWlyZSgpIFhfdHlwZXMuanMgd2hlbiBhbiBpbmNsdWRlIGluIHRoZSBJREwgZmlsZSB3YXMgdXNlZAorICAgICogW1RIUklGVC0xNTUxXSAtIDIgdGhyaWZ0IGZpbGUgZGVmaW5lIG9ubHkgc3RydWN0IChubyBzZXJ2aWNlKSwgb25lIGluY2x1ZGUgYW5vdGhlciwgdGhlIGdlbiBub2RlanMgZmlsZSBkaWRuJ3QgaGF2ZSAicmVxdWlyZXMiIGF0IHRoZSB0b3AKKyAgICAqIFtUSFJJRlQtMTI2NF0gLSBUU29ja2V0Q2xpZW50IGlzIHF1ZXJpZWQgYnkgcnVuIGxvb3AgYWZ0ZXIgZGVhbGxvY2F0aW9uIGluIENvY29hCisgICAgKiBbVEhSSUZULTE2MDBdIC0gVGhyaWZ0IEdvIENvbXBpbGVyIGFuZCBMaWJyYXJ5IG91dCBvZiBkYXRlIHdpdGggR28gMSBSZWxlYXNlLgorICAgICogW1RIUklGVC0xNjAzXSAtIFRocmlmdCBJREwgYWxsb3dzIGZvciBtdWx0aXBsZSBleGNlcHRpb25zLCBhcmdzIG9yIHN0cnVjdCBtZW1iZXIgbmFtZXMgdG8gYmUgdGhlIHNhbWUKKyAgICAqIFtUSFJJRlQtMTA2Ml0gLSBQcm9ibGVtcyB3aXRoIHB5dGhvbiB0dXRvcmlhbHMKKyAgICAqIFtUSFJJRlQtODY0XSAtIGRlZmF1bHQgdmFsdWUgZmFpbHMgaWYgaWRlbnRpZmllciBpcyBhIHN0cnVjdAorICAgICogW1RIUklGVC05MzBdIC0gUnVieSBhbmQgSGFza2VsbCBiaW5kaW5ncyBkb24ndCBwcm9wZXJseSBzdXBwb3J0IERFU1RESVIgKG1ha2VzIHBhY2thZ2luZyBwYWluZnVsKQorICAgICogW1RIUklGVC04MjBdIC0gVGhlIHJlYWRMZW5ndGggYXR0cmlidXRlIG9mIFRCaW5hcnlQcm90b2NvbCBpcyB1c2VkIGFzIGFuIGluc3RhbmNlIHZhcmlhYmxlIGFuZCBpcyBkZWNyZW1lbnRlZCBvbiBlYWNoIGNhbGwgb2YgY2hlY2tSZWFkTGVuZ3RoCisgICAgKiBbVEhSSUZULTE2NDBdIC0gTm9uZSBvZiB0aGUgdHV0b3JpYWxzIGxpbmtlZCBvbiB0aGUgd2Vic2l0ZSBjb250YWluIGNvbnRlbnQKKyAgICAqIFtUSFJJRlQtMTYzN10gLSBOUE0gcmVnaXN0cnkgZG9lcyBub3QgaW5jbHVkZSB2ZXJzaW9uIDAuOAorICAgICogW1RIUklGVC0xNjQ4XSAtIE5vZGVKUyBjbGllbnRzIGFsd2F5cyByZWNlaXZlIDAgZm9yICdkb3VibGUnIHZhbHVlcy4KKyAgICAqIFtUSFJJRlQtMTY2MF0gLSBQeXRob24gVGhyaWZ0IGxpYnJhcnkgY2FuIGJlIGluc3RhbGxlZCB3aXRoIHBpcCBidXQgbm90IGVhc3lfaW5zdGFsbAorICAgICogW1RIUklGVC0xNjU3XSAtIENocm9tZSBicm93c2VyIHNlbmRpbmcgT1BUSU9OUyBtZXRob2QgYmVmb3JlIFBPU1QgaW4geG1sSHR0cFJlcXVlc3QKKyAgICAqIFtUSFJJRlQtMjExOF0gLSBDZXJ0aWZpY2F0ZSBlcnJvciBoYW5kbGluZyBzdGlsbCBpbmNvcnJlY3QKKyAgICAqIFtUSFJJRlQtMjEzN10gLSBSdWJ5IHRlc3QgbGliIGZhaWxzIGplbmtpbnMgYnVpbGQgIzg2NAorICAgICogW1RIUklGVC0yMTM2XSAtIFZhZ3JhbnQgYnVpbGQgbm90IGNvbXBpbGluZyBqYXZhLCBydWJ5LCBwaHAsIGdvIGxpYnMgZHVlIHRvIG1pc3NpbmcgZGVwZW5kZW5jaWVzCisgICAgKiBbVEhSSUZULTIxMzVdIC0gR08gbGliIGxlYXZlcyBiZWhpbmQgdGVzdCBmaWxlcyB0aGF0IGFyZSBhdXRvIGdlbmVyYXRlZAorICAgICogW1RIUklGVC0yMTM0XSAtIG1pbmd3LWNyb3NzLWNvbXBpbGUgc2NyaXB0IGZhaWxpbmcgd2l0aCBzdHJpcCBlcnJvcnMKKyAgICAqIFtUSFJJRlQtMjEzM10gLSBqYXZhIFRlc3RUQmluYXJ5UHJvdG9jb2wuamF2YSB0ZXN0IGZhaWxpbmcKKyAgICAqIFtUSFJJRlQtMjEyNl0gLSBsaWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU1REKiBmaWxlcyBtaXNzaW5nIGZyb20gRElTVAorICAgICogW1RIUklGVC0yMTI1XSAtIGRlYmlhbiBtaXNzaW5nIGZyb20gRElTVAorICAgICogW1RIUklGVC0yMTI0XSAtIC5vLCAuc28sIC5sYSwgLmRlcHMsIC5saWJzLCBnZW4tKiBmaWxlcyBsZWZ0IHR1dG9yaWFscywgdGVzdCBhbmQgbGliL2NwcCB3aGVuIG1ha2luZyBESVNUCisgICAgKiBbVEhSSUZULTIxMjNdIC0gR08gbGliIG1pc3NpbmcgZmlsZXMgaW4gRElTVCBidWlsZAorICAgICogW1RIUklGVC0yMTIxXSAtIENvbXBpbGF0aW9uIGJ1ZyBmb3IgTm9kZS5qcworICAgICogW1RIUklGVC0yMTI5XSAtIHBocCBleHQgbWlzc2luZyBmcm9tIGRpc3QKKyAgICAqIFtUSFJJRlQtMjEyOF0gLSBsaWIgR08gdGVzdHMgZmFpbCB3aXRoIGZ1bmN0IGVuZHMgd2l0aG91dCBhIHJldHVybiBzdGF0ZW1lbnQKKyAgICAqIFtUSFJJRlQtMjI4Nl0gLSBGYWlsZWQgdG8gY29tcGlsZSBUaHJpZnQwLjkuMSB3aXRoIGJvb3N0MS41NSBieSBWUzIwMTAgaWYgc2VsZWN0IERlYnVnLW10Jng2NCBtb2RlLgorICAgICogW1RIUklGVC0xOTczXSAtIFRDb21wYWN0UHJvdG9jb2wgaW4gQyMgbGliIGRvZXMgbm90IHNlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUgbmVnYXRpdmUgaW50MzIgYW5kIGludDY0IG51bWJlciBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMTk5Ml0gLSBjYXN0cyBpbiBUQ29tcGFjdFByb3RvY29sLnRjYyBjYXVzaW5nICJkZXJlZmVyZW5jaW5nIHR5cGUtcHVubmVkIHBvaW50ZXIgd2lsbCBicmVhayBzdHJpY3QtYWxpYXNpbmcgcnVsZXMiIHdhcm5pbmdzIGZyb20gZ2NjCisgICAgKiBbVEhSSUZULTE5MzBdIC0gQyMgZ2VuZXJhdGVzIHVuc2lnbmVkIGJ5dGUgZm9yIFRocmlmdCAiYnl0ZSIgdHlwZQorICAgICogW1RIUklGVC0xOTI5XSAtIFVwZGF0ZSB3ZWJzaXRlIHRvIHVzZSBNaXJyb3JzIGZvciBkb3dubG9hZHMKKyAgICAqIFtUSFJJRlQtMTkyOF0gLSBSYWNlIG1heSBzdGlsbCBleGlzdCBpbiBURmlsZVRyYW5zcG9ydDo6Zmx1c2goKQorICAgICogW1RIUklGVC0xOTM0XSAtIFRhYnMgaW4gRXhhbXBsZSBzZWN0aW9uIG9uIG1haW4gcGFnZSBhcmUgbm90IHdvcmtpbmcKKyAgICAqIFtUSFJJRlQtMTkzM10gLSBEZWxwaGkgZ2VuZXJhdG9yIGNyYXNoZXMgd2hlbiBhIHR5cGVkZWYgcmVmZXJlbmNlcyBhbm90aGVyIHR5cGVkZWYgZnJvbSBhbiBpbmNsdWRlZCBmaWxlCisgICAgKiBbVEhSSUZULTE5NDJdIC0gQmluYXJ5IGFjY2VsZXJhdGVkIGNwcCBleHRlbnNpb24gZG9lcyBub3QgdXNlIFRocmlmdCBuYW1lc3BhY2VzIGZvciBFeGNlcHRpb25zCisgICAgKiBbVEhSSUZULTE5NTldIC0gQyM6IEFkZCBVbmlvbiBUTWVtb3J5QnVmZmVyIHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMTk1OF0gLSBDIzogVXNlIHN0YXRpYyBPYmplY3QuRXF1YWxzIGluc3RlYWQgb2YgLkVxdWFscygpIGNhbGxzIGluIGVxdWFscworICAgICogW1RIUklGVC0xOTU3XSAtIE5vZGVKUyBURnJhbWVkVHJhbnNwb3J0IGFuZCBUQnVmZmVyZWRUcmFuc3BvcnQgcmVhZCBieXRlcyBhcyB1bnNpZ25lZAorICAgICogW1RIUklGVC0xOTU1XSAtIFVuaW9uIFR5cGUgd3JpdGVyIGdlbmVyYXRlZCBpbiBDIyBkb2VzIG5vdCBXcml0ZVN0cnVjdEJlZ2luCisgICAgKiBbVEhSSUZULTE5NTJdIC0gVHJhdmlzIENJCisgICAgKiBbVEhSSUZULTE5NDldIC0gV1A3IGJ1aWxkIGJyb2tlbgorICAgICogW1RIUklGVC0xOTQzXSAtIGRvY3N0cmluZ3MgZm9yIGVudW0gdmFsdWVzIGFyZSBpZ25vcmVkCisgICAgKiBbVEhSSUZULTIwNzBdIC0gSW1wcm9wZXIgYEhleENoYXInIGFuZCAnSGV4VmFsJyBpbXBsZW1lbnRhdGlvbiBpbiBUSlNPTlByb3RvY29sLmNzCisgICAgKiBbVEhSSUZULTIwMTddIC0gUmVzb3VyY2UgTGVhayBpbiB0aHJpZnQgc3RydWN0IHVuZGVyIGNvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9wcm9ncmFtLmgKKyAgICAqIFtUSFJJRlQtMjAzMl0gLSBDIyBjbGllbnQgbGVha3Mgc29ja2V0cy9oYW5kbGVzCisgICAgKiBbVEhSSUZULTE5OTZdIC0gSmF2YU1FIENvbnN0YW50cyBnZW5lcmF0aW9uIGlzIGJyb2tlbiAvIGluY29uc2lzdGVudCB3aXRoIHJlZ3VsYXIgSmF2YSBnZW5lcmF0aW9uCisgICAgKiBbVEhSSUZULTIwMDJdIC0gSGFza2VsbDogVGVzdCB1c2UgRGF0YS5NYXliZSBpbnN0ZWFkIG9mIE1heWJlCisgICAgKiBbVEhSSUZULTIwNTFdIC0gVmFncmFudCBmYWlscyB0byBidWlsZCBlcmxhbmcKKyAgICAqIFtUSFJJRlQtMjA1MF0gLSBWYWdyYW50IEMjIGxpYiBjb21waWxlIGZhaWxzIHdpdGggVEV4Y2VwdGlvbiBtaXNzaW5nCisgICAgKiBbVEhSSUZULTE5NzhdIC0gUnVieTogVGhyaWZ0IHNob3VsZCBhbGxvdyBmb3IgdGhlIFNTTCB2ZXJpZnkgbW9kZSB0byBiZSBzZXQKKyAgICAqIFtUSFJJRlQtMTk4NF0gLSBuYW1lc3BhY2UgY29sbGlzaW9uIGluIHB5dGhvbiBiaW5kaW5ncworICAgICogW1RIUklGVC0xOTg4XSAtIFdoZW4gdHJ5aW5nIHRvIGJ1aWxkIGEgZGViaWFuIHBhY2thZ2UgaXQgZmFpbHMgYXMgdGhlIGZpbGUgTkVXUyBkb2Vzbid0IGV4aXN0CisgICAgKiBbVEhSSUZULTE5NzVdIC0gVEJpbmFyeVByb3RvY29sIENoZWNrTGVuZ3RoIGNhbid0IGJlIHVzZWQgZm9yIGEgY2xpZW50CisgICAgKiBbVEhSSUZULTE5OTVdIC0gJy4nIGFsbG93ZWQgYXQgZW5kIG9mIGlkZW50aWZpZXIgZ2VuZXJhdGVzIG5vbi1jb21waWxhYmxlIGNvZGUKKyAgICAqIFtUSFJJRlQtMjExMl0gLSBFcnJvciBpbiBHbyBnZW5lcmF0b3Igd2hlbiB1c2luZyB0eXBlZGVmcyBpbiBtYXAga2V5cworICAgICogW1RIUklGVC0yMDg4XSAtIFR5cG9zIGluIFRocmlmdCBjb21waWxlciBoZWxwIHRleHQKKyAgICAqIFtUSFJJRlQtMjA4MF0gLSBDIyBtdWx0aXBsZXggcHJvY2Vzc29yIGRvZXMgbm90IGNhdGNoIElPRXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTIwODJdIC0gRXhlY3V0aW5nICJnbWFrZSBjbGVhbiIgaXMgYnJva2VuCisgICAgKiBbVEhSSUZULTIxMDJdIC0gY29uc3RhbnRzIGFyZSBub3QgcmVmZXJlbmNpbmcgdG8gY29ycmVjdCB0eXBlIHdoZW4gaW5jbHVkZWQgZnJvbSBhbm90aGVyIHRocmlmdCBmaWxlCisgICAgKiBbVEhSSUZULTIxMDBdIC0gdHlwZWRlZnMgYXJlIG5vdCBjb3JyZWN0bHkgcmVmZXJlbmNlZCB3aGVuIGluY2x1ZGluZyBmcm9tIG90aGVyIHRocmlmdCBmaWxlcworICAgICogW1RIUklGVC0yMDY2XSAtICdtYWtlIGluc3RhbGwnIGRvZXMgbm90IGluc3RhbGwgdHdvIGhlYWRlcnMgcmVxdWlyZWQgZm9yIEMrKyBiaW5kaW5ncworICAgICogW1RIUklGVC0yMDY1XSAtIE5vdCB2YWxpZCBjb25zdGFudHMgZmlsZW5hbWUgaW4gSmF2YQorICAgICogW1RIUklGVC0yMDQ3XSAtIFRocmlmdC5Qcm90b2NvbC5UQ29tcGFjdFByb3RvY29sLCBpbnRUb1ppZ1phZyBkYXRhIGxvc3QgKFRDb21wYWN0UHJvdG9jb2wuY3MpCisgICAgKiBbVEhSSUZULTIwMzZdIC0gVGhyaWZ0IGdlbSB3YXJucyBhYm91dCBjbGFzcyB2YXJpYWJsZSBhY2Nlc3MgZnJvbSB0b3AgbGV2ZWwKKyAgICAqIFtUSFJJRlQtMjA1N10gLSBWYWdyYW50IGZhaWxzIG9uIHBocCB0ZXN0cworICAgICogW1RIUklGVC0yMTA1XSAtIEdlbmVyYXRlZCBjb2RlIGZvciBkZWZhdWx0IHZhbHVlcyBvZiBjb2xsZWN0aW9ucyBpZ25vcmVzIHRfZmllbGQ6OlRfUkVRVUlSRUQKKyAgICAqIFtUSFJJRlQtMjA5MV0gLSBVbm5lY2Vzc2FyeSAnZnJpZW5kJyBkZWNsYXJhdGlvbiBjYXVzZXMgd2FybmluZyBpbiBUV2luc29ja1NpbmdsZXRvbgorICAgICogW1RIUklGVC0yMDkwXSAtIEdvIGdlbmVyYXRvciwgZml4IGluY2x1ZGluZyBvZiBvdGhlciB0aHJpZnQgZmlsZXMKKyAgICAqIFtUSFJJRlQtMjEwNl0gLSBGaXggc3VwcG9ydCBmb3IgbmFtZXNwYWNlcyBpbiBHTyBnZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtMTc4M10gLSBDIyBkb2Vzbid0IGhhbmRsZSByZXF1aXJlZCBmaWVsZHMgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTE3ODJdIC0gYXN5bmMgb25seSBkZWZpbmVkIGluIHNpbHZlcmxpZ2h0CisgICAgKiBbVEhSSUZULTE3NzldIC0gTWlzc2luZyBwcm9jZXNzX1hYWFggbWV0aG9kIGluIGdlbmVyYXRlZCBUUHJvY2Vzc29yIGltcGxlbWVudGF0aW9uIGZvciBhbGwgJ29uZXdheScgc2VydmljZSBmdW5jdGlvbnMKKyAgICAqIFtUSFJJRlQtMTY5Ml0gLSBTT19SRVVTRUFERFIgYWxsb3dzIGZvciBzb2NrZXQgaGlqYWNraW5nIG9uIFdpbmRvd3MKKyAgICAqIFtUSFJJRlQtMTcyMF0gLSBKUnVieSB0aW1lcyBvdXQgb24gc3VjY2Vzc2Z1bCBjb25uZWN0aW9uCisgICAgKiBbVEhSSUZULTE3MTNdIC0gTmFtZWQgYW5kIEFub255bW91cyBQaXBlIHRyYW5zcG9ydCAoRGVscGhpKQorICAgICogW1RIUklGVC0xNjk5XSAtIE5hdGl2ZSBVbmlvbiNyZWFkIGhhcyBleHRyYSByZWFkX2ZpZWxkX2VuZCBjYWxsCisgICAgKiBbVEhSSUZULTE3NDldIC0gUHl0aG9uIFRTU0xTb2NrZXQgZXJyb3IgaGFuZGxpbmcgb2JzY3VyZXMgYWN0dWFsIGVycm9yCisgICAgKiBbVEhSSUZULTE3NDhdIC0gR3VhcmQgYW5kIFJXR3VhcmQgbWFjcm9zIGRlZmluZWQgaW4gZ2xvYmFsIG5hbWVzcGFjZQorICAgICogW1RIUklGVC0xNzM0XSAtIEZyb250IHdlYnBhZ2UgaXMgc3RpbGwgYWR2ZXJ0aXNpbmcgdjAuOCBhcyBjdXJyZW50IHJlbGVhc2UKKyAgICAqIFtUSFJJRlQtMTcyOV0gLSBDIGdsaWIgcmVmYWN0b3IgbGVmdCBlbXB0eSBmb2xkZXJzIGluIHN2bgorICAgICogW1RIUklGVC0xNzY3XSAtIHVuaW9ucyBjYW4ndCBoYXZlIHJlcXVpcmVkIGZpZWxkcyAoRGVscGhpKQorICAgICogW1RIUklGVC0xNzY1XSAtIEluY29ycmVjdCBlcnJvciBtZXNzYWdlIHByaW50ZWQgZm9yIG51bGwgb3IgbmVnYXRpdmUga2V5cworICAgICogW1RIUklGVC0xNzc4XSAtIENvbmZpZ3VyZSByZXF1aXJlcyBtYW51YWwgaW50ZXJ2ZW50aW9uIGR1ZSB0byB0YXIgZmFpbHVyZQorICAgICogW1RIUklGVC0xNzc3XSAtIFRQaXBlU2VydmVyIGlzIFVOU1RPUFBBQkxFCisgICAgKiBbVEhSSUZULTE3NTNdIC0gTXVsdGlwbGUgQysrIFdpbmRvd3MsIE9TWCwgYW5kIGlPUyBwb3J0YWJpbGl0eSBpc3N1ZXMKKyAgICAqIFtUSFJJRlQtMTc1Nl0gLSAnbWFrZSAtaiA4JyBmYWlscyB3aXRoICJ1bnRlcm1pbmF0ZWQgI2lmZGVmIiBlcnJvcgorICAgICogW1RIUklGVC0xNzczXSAtIFB5dGhvbiBsaWJyYXJ5IHNob3VsZCBydW4gb24gcHl0aG9uIDIuNAorICAgICogW1RIUklGVC0xNzY5XSAtIHVuaW9ucyBjYW4ndCBoYXZlIHJlcXVpcmVkIGZpZWxkcyAoQysrKQorICAgICogW1RIUklGVC0xNzY4XSAtIHVuaW9ucyBjYW4ndCBoYXZlIHJlcXVpcmVkIGZpZWxkcyAoQ29tcGlsZXIpCisgICAgKiBbVEhSSUZULTE2NjZdIC0gaHRvbmxsIHVzYWdlIGluIFRCaW5hcnlQcm90b2NvbC50Y2MgZ2VuZXJhdGVzIHdhcm5pbmcgd2l0aCBNU1ZDMjAxMAorICAgICogW1RIUklGVC0xOTE5XSAtIGxpYnRocmlmdCBkZXBlbmRzIG9uIGh0dHBjb3JlLTQuMS4zIChkaXJlY3RseSkgYW5kIGh0dHBjb3JlLTQuMS40ICh0cmFuc2l0aXZlbHkpCisgICAgKiBbVEhSSUZULTE4NjRdIC0gaW1wbGVtZW50IGV2ZW50IGhhbmRsZXIgZm9yIG5vbi1ibG9ja2luZyBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMTg1OV0gLSBHZW5lcmF0ZWQgZXJyb3IgYysrIGNvZGUgd2l0aCAtb3V0IGFuZCBpbmNsdWRlX3ByZWZpeCBwYXJhbQorICAgICogW1RIUklGVC0xODY5XSAtIFRUaHJlYWRQb29sU2VydmVyIChqYXZhKSBkaWVzIHdoZW4gdGhyZWFkcG9vbCBpcyBjb25zdW1lZAorICAgICogW1RIUklGVC0xODQyXSAtIE1lbW9yeSBsZWFrIHdpdGggUGlwZXMKKyAgICAqIFtUSFJJRlQtMTgzOF0gLSBDYW4ndCBidWlsZCBjb21waWxlciBvbiBPUyBYIGJlY2F1c2Ugb2YgbWlzc2luZyB0aHJpZnR5LmgKKyAgICAqIFtUSFJJRlQtMTg0Nl0gLSBSZXN0b3JlIHNvY2tldC5oIGhlYWRlciB0byBzdXBwb3J0IGJ1aWxkcyB3aXRoIEFuZHJvaWQgTkRLCisgICAgKiBbVEhSSUZULTE4NTBdIC0gbWFrZSBjaGVjayBoYW5ncyBvbiBUU29ja2V0IHRlc3RzIGluIFRyYW5zcG9ydFRlc3QuY3BwCisgICAgKiBbVEhSSUZULTE4NzNdIC0gQmluYXJ5IHByb3RvY29sIGZhY3RvcnkgaWdub3JlcyBzdHJ1Y3QgcmVhZC93cml0ZSBmbGFncworICAgICogW1RIUklGVC0xODcyXSAtIGlzc3VlcyB3aXRoIFRCdWZmZXJlZFRyYW5zcG9ydCBidWZmZXIKKyAgICAqIFtUSFJJRlQtMTkwNF0gLSBJbmNvcnJlY3QgY29kZSBpcyBnZW5lcmF0ZWQgZm9yIHR5cGVkZWZzIHdoaWNoIHVzZSBpbmNsdWRlZCB0eXBlcworICAgICogW1RIUklGVC0xOTAzXSAtIFBIUCBuYW1lc3BhY2VzIGNhdXNlIGJpbmFyeSBwcm90b2NvbHMgdG8gbm90IGJlIHVzZWQKKyAgICAqIFtUSFJJRlQtMTg5NV0gLSBEZWxwaGk6IHJlc2VydmVkIHZhcmlhYmxlIG5hbWUgInJlc3VsdCIgbm90IGRldGVjdGVkIHByb3Blcmx5CisgICAgKiBbVEhSSUZULTE4ODFdIC0gVE5vbmJsb2NraW5nU2VydmVyIGRvZXMgbm90IHJlbGVhc2Ugb3BlbiBjb25uZWN0aW9ucyBvciB0aHJlYWRzIG9uIHNodXRkb3duCisgICAgKiBbVEhSSUZULTE4ODhdIC0gSmF2YSBUaHJpZnQgY2xpZW50IGNhbid0IGNvbm5lY3QgdG8gUHl0aG9uIFRocmlmdCBzZXJ2ZXIgb24gc2FtZSBob3N0CisgICAgKiBbVEhSSUZULTE4MzFdIC0gQnVnIGluIGxpc3QgZGVzZXJpYWxpemVyCisgICAgKiBbVEhSSUZULTE4MjRdIC0gbWFueSBjb21waWxlIHdhcm5pbmcsIGJlY2FzZSBUaHJlYWQuaCBpbmNsdWRlcyBjb25maWcuaAorICAgICogW1RIUklGVC0xODIzXSAtIE1pc3NpbmcgcGFyZW50aGVzaXMgYnJlYWtzICJJU18uLi4iIG1hY3JvIGluIGdlbmVyYXRlZCBjb2RlCisgICAgKiBbVEhSSUZULTE4MDZdIC0gUHl0aG9uIGdlbmVyYXRpb24gYWx3YXlzIHRydW5jYXRlcyBfX2luaXRfXy5weSBmaWxlcworICAgICogW1RIUklGVC0xNzk1XSAtIFJhY2UgY29uZGl0aW9uIGluIFRUaHJlYWRlZFNlcnZlclBvb2wgamF2YSBpbXBsZW1lbnRhdGlvbgorICAgICogW1RIUklGVC0xNzk0XSAtIEMjIGFzeW5jY3RwIGJyb2tlbgorICAgICogW1RIUklGVC0xODA0XSAtIEJpbmFyeStjb21wYWN0IHByb3RvY29sIHNpbmdsZSBieXRlIGVycm9yIGluIFJ1YnkgbGlicmFyeSAoQVJNIGFyY2hpdGVjdHVyZSk6IGNhdXNlZCBieSBkaWZmZXJlbnQgY2hhciBzaWduZWRuZXNzCisgICAgKiBbVEhSSUZULTE4MDBdIC0gRG9jdW1lbnRhdGlvbiB0ZXh0IG5vdCBhbHdheXMgZXNjYXBlZCBjb3JyZWN0bHkgd2hlbiByZW5kZXJlZCB0byBIVE1MCisgICAgKiBbVEhSSUZULTE3ODhdIC0gQyM6IENvbnN0YW50cyBzdGF0aWMgY29uc3RydWN0b3IgZG9lcyBub3QgY29tcGlsZQorICAgICogW1RIUklGVC0xODE2XSAtIE5lZWQgInJlcXVpcmUiIGluY2x1ZGVkIHRocmlmdCBmaWxlcyBpbiAieHh4X3R5cGVzLmpzIgorICAgICogW1RIUklGVC0xOTA3XSAtIENvbXBpbGluZyBuYW1lc3BhY2UgYW5kIHN1Yi1uYW1lc3BhY2UgZGlyZWN0aXZlcyBmb3IgdW5yZWNvZ25pemVkIGdlbmVyYXRvcnMgc2hvdWxkIG9ubHkgYmUgYSB3YXJuaW5nCisgICAgKiBbVEhSSUZULTE5MTNdIC0gc2tpcHBpbmcgdW5rbm93biBmaWVsZHMgaW4gamF2YSB1bmlvbnMKKyAgICAqIFtUSFJJRlQtMjU1M10gLSBDKysgbGlua2VyIGVycm9yIC0gdHJhbnNwb3J0L1RTb2NrZXQKKyAgICAqIFtUSFJJRlQtMjc0XSAtIFRvd2FyZHMgYSB3b3JraW5nIHJlbGVhc2UvdmVyc2lvbmluZyBwcm9jZXNzCisKKyMjIERvY3VtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMTk3MV0gLSBbR3JhcGh2aXpdIEFkZHMgdHV0b3JpYWwvZ2VuZXJhbCBkZXNjcmlwdGlvbiBkb2N1bWVudGF0aW9uCisgICAgKiBbVEhSSUZULTIwMDFdIC0gaHR0cDovL3RocmlmdC5hcGFjaGUub3JnLyBFeGFtcGxlICJDKysgU2VydmVyIiB0YWIgaXMgYnJva2VuCisKKyMjIEltcHJvdmVtZW50CisgICAgKiBbVEhSSUZULTE1NzRdIC0gQXBhY2hlIHByb2plY3QgYnJhbmRpbmcgcmVxdWlyZW1lbnRzOiBET0FQIGZpbGUgW1BBVENIXQorICAgICogW1RIUklGVC0xMzQ3XSAtIFVuaWZ5IHRoZSBleGNlcHRpb25zIHJldHVybmVkIGluIGdlbmVyYXRlZCBHbyBjb2RlCisgICAgKiBbVEhSSUZULTEzNTNdIC0gU3dpdGNoIHRvIHBlcmZvcm1hbmNlIGJyYW5jaCwgZ2V0IHJpZCBvZiBCaW5hcnlQYXJzZXIKKyAgICAqIFtUSFJJRlQtMTYyOV0gLSBSdWJ5IDEuOSBDb21wYXRpYmlsaXR5IGR1cmluZyBUaHJpZnQgY29uZmlndXJlLCBtYWtlLCBpbnN0YWxsCisgICAgKiBbVEhSSUZULTk5MV0gLSBSZWZhY3RvciBIYXNrZWxsIGNvZGUgYW5kIGdlbmVyYXRvcgorICAgICogW1RIUklGVC05OTBdIC0gU2FuaWZ5IGdldHRpbWVvZmRheSB1c2FnZSBjb2RlYmFzZS13aWRlCisgICAgKiBbVEhSSUZULTc5MV0gLSBMZXQgQysrIFRTaW1wbGVTZXJ2ZXIgYmUgZHJpdmVuIGJ5IGFuIGV4dGVybmFsIG1haW4gbG9vcAorICAgICogW1RIUklGVC0yMTE3XSAtIENvY29hIFRCaW5hcnlQcm90b2NvbCBzdHJpY3RXcml0ZSBzaG91bGQgYmUgc2V0IHRvIHRydWUgYnkgZGVmYXVsdAorICAgICogW1RIUklGVC0yMDE0XSAtIENoYW5nZSBDKysgbGliIGluY2x1ZGVzIHRvIHVzZSA8bmFtZXNwYWNlLz4gc3R5bGUgdGhyb3VnaG91dAorICAgICogW1RIUklGVC0xOTcyXSAtIEFkZCBzdXBwb3J0IGZvciBhc3luYyBwcm9jZXNzb3JzCisgICAgKiBbVEhSSUZULTE5NzBdIC0gW0dyYXBodml6XSBBZGRzIG9wdGlvbiB0byByZW5kZXIgZXhjZXB0aW9ucyByZWxhdGlvbnNoaXBzCisgICAgKiBbVEhSSUZULTE5NjZdIC0gU3VwcG9ydCBkaWZmZXJlbnQgZmlsZXMgZm9yIFNTTCBjZXJ0aWZpY2F0ZXMgYW5kIGtleXMKKyAgICAqIFtUSFJJRlQtMTk2NV0gLSBBZGRzIEdyYXBodml6IChncmFwaCBkZXNjcmlwdGlvbiBsYW5ndWFnZSkgZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTE5NTZdIC0gU3dpdGNoIHRvIEFwYWNoZSBDb21tb25zIExhbmcgMworICAgICogW1RIUklGVC0xOTYyXSAtIE11bHRpcGxleCBwcm9jZXNzb3Igc2hvdWxkIHNlbmQgYW55IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBiYWNrIHRvIGNsaWVudAorICAgICogW1RIUklGVC0xOTYwXSAtIG1haW4oKSBkZWNsYXJlcyAyMiB1bnVzZWQgZ2VuIGJvb2xzCisgICAgKiBbVEhSSUZULTE5NTFdIC0gbGlidGhyaWZ0LmphciBoYXMgc291cmNlIGZpbGVzIGluIGl0CisgICAgKiBbVEhSSUZULTE5OTddIC0gQWRkIGFjY2VwdCBiYWNrbG9nIGNvbmZpZ3VyYXRpb24gbWV0aG9kIHRvICBUU2VydmVyU29ja2V0CisgICAgKiBbVEhSSUZULTIwMDNdIC0gRGVwcmVjYXRlIHNlbnVtCisgICAgKiBbVEhSSUZULTIwNTJdIC0gVmFncmFudCBtYWNoaW5lIGltYWdlIGRlZmF1bHRzIHRvIG9ubHkgMzg0TUIgb2YgUkFNCisgICAgKiBbVEhSSUZULTE5ODBdIC0gTW9kZXJuaXplIEdvIHRvb2xpbmcsIGZpeCBnbyBjbGllbnQgbGliYXJ5LgorICAgICogW1RIUklGVC0xOTc3XSAtIEMjIGNvbXBpbGVyIHNob3VsZCBnZW5lcmF0ZSBjb25zdGFudCBmaWxlcyBwcmVmaXhlZCB3aXRoIHRocmlmdCBmaWxlIG5hbWUKKyAgICAqIFtUSFJJRlQtMTk4NV0gLSBhZGQgYSBWYWdyYW50ZmlsZSB0byBidWlsZCBhbmQgdGVzdCBBcGFjaGUgVGhyaWZ0IGZ1bGx5IHJlcHJvZHVjYWJsZQorICAgICogW1RIUklGVC0xOTk0XSAtIERlcHJlY2F0ZSBzbGlzdAorICAgICogW1RIUklGVC0xOTkzXSAtIEZhY3RvcnkgdG8gY3JlYXRlIGluc3RhbmNlcyBmcm9tIGtub3duIChnZW5lcmF0ZWQpIGludGVyZmFjZSB0eXBlcyB3aXRoIERlbHBoaQorICAgICogW1RIUklGVC0yMDgxXSAtIFNwZWNpZmllZCB0aW1lb3V0IHNob3VsZCBiZSB1c2VkIGluIFRTb2NrZXQuT3BlbigpCisgICAgKiBbVEhSSUZULTIwODRdIC0gRGVscGhpOiBBYmlsaXR5IHRvIGNyZWF0ZSBlbnRpdHkgVGhyaWZ0LWdlbmVyYXRlZCBpbnN0YW5jZXMgYmFzZWQgb24gVHlwZUluZm8KKyAgICAqIFtUSFJJRlQtMjA4M10gLSBJbXByb3ZlIHRoZSBnbyBsaWI6IGJ1ZmZlcmVkIFRyYW5zcG9ydCwgc2F2ZSBtZW1vcnkgYWxsb2NhdGlvbiwgaGFuZGxlIGNvbmN1cnJlbnQgcmVxdWVzdAorICAgICogW1RIUklGVC0yMTA5XSAtIFNlY3VyZSBjb25uZWN0aW9ucyBzaG91bGQgYmUgc3VwcG9ydGVkIGluIEdvCisgICAgKiBbVEhSSUZULTIxMDddIC0gbWlub3IgR28gZ2VuZXJhdG9yIGZpeGVzCisgICAgKiBbVEhSSUZULTE2OTVdIC0gYWxsb3cgd2FybmluZy1mcmVlIGNvbXBpbGF0aW9uIGluIFZTIDIwMTIgYW5kIEdOVSA0LjYKKyAgICAqIFtUSFJJRlQtMTczNV0gLSBpbnRlZ3JhdGUgdHV0b3JpYWwgaW50byByZWd1bGFyIGJ1aWxkCisgICAgKiBbVEhSSUZULTE3MTZdIC0gbWF4IGFsbG93ZWQgY29ubmVjdGlvbnMgc2hvdWxkIGJlIFBJUEVfVU5MSU1JVEVEX0lOU1RBTkNFUworICAgICogW1RIUklGVC0xNzE1XSAtIEFsbG93IGV4Y2x1ZGluZyBweXRob24gcGFydHMgd2hlbiBidWlsZGluZyBjb250cmliL2ZiMzAzCisgICAgKiBbVEhSSUZULTE3MzNdIC0gRml4IFJQTSBidWlsZCBpc3N1ZXMgb24gUkhFTDYvT0w2IHN5c3RlbXMKKyAgICAqIFtUSFJJRlQtMTcyOF0gLSBVcGdyYWRhdGlvbiBvZiBodHRwY29tcG9uZW50cworICAgICogW1RIUklGVC0xODc2XSAtIFVzZSBlbnVtIG5hbWVzIGluc3RlYWQgb2YgY2FzdGVkIGludGVnZXJzIGluIGFzc2lnbm1lbnRzCisgICAgKiBbVEhSSUZULTE4NzRdIC0gdGltZW91dCBmb3IgdGhlIHNlcnZlci1zaWRlIGVuZCBvZiBhIG5hbWVkIHBpcGUKKyAgICAqIFtUSFJJRlQtMTg5N10gLSBTdXBwb3J0IHZhbGlkYXRpb24gb2YgcmVxdWlyZWQgZmllbGRzCisgICAgKiBbVEhSSUZULTE4OTZdIC0gQWRkIFRCYXNlIHByb3RvY29sIGZvciBDb2NvYQorICAgICogW1RIUklGVC0xODgwXSAtIE1ha2UgbmFtZWQgcGlwZXMgc2VydmVyIHdvcmsgYXN5bmNocm9ub3VzbHkgKG92ZXJsYXBwZWQpIHRvIGFsbG93IGZvciBjbGVhbiBzZXJ2ZXIgc3RvcHMKKyAgICAqIFtUSFJJRlQtMTg3OF0gLSBBZGQgdGhlIHBvc3NpYmlsaXR5IHRvIHNlbmQgY3VzdG9tIGhlYWRlcnMKKyAgICAqIFtUSFJJRlQtMTg4Ml0gLSBVc2Ugc2luZ2xlIGluY2x1ZGUKKyAgICAqIFtUSFJJRlQtMTc5M10gLSBDIzogVXNlIHN0YXRpYyByZWFkIGluc3RlYWQgb2YgaW5zdGFuY2UgcmVhZAorICAgICogW1RIUklGVC0xNzk5XSAtIE9wdGlvbiB0byBnZW5lcmF0ZSBIVE1MIGluICJzdGFuZGFsb25lIG1vZGUiCisgICAgKiBbVEhSSUZULTE4MTVdIC0gQ29kZSBnZW5lcmF0b3JzIGxpbmUgYnVmZmVyIG91dHB1dAorICAgICogW1RIUklGVC0xODkwXSAtIEMrKzogTWFrZSBuYW1lZCBwaXBlcyBzZXJ2ZXIgd29yayBhc3luY2hyb25vdXNseQorICAgICogW1RIUklGVC00NzRdIC0gR2VuZXJhdGluZyBSdWJ5IG9uIFJhaWxzIGZyaWVuZGx5IGNvZGUKKworIyMgTmV3IEZlYXR1cmUKKyAgICAqIFtUSFJJRlQtODAxXSAtIFByb3ZpZGUgYW4gaW50ZXJhY3RpdmUgc2hlbGwgKGlyYikgd2hlbiBnZW5lcmF0aW5nIHJ1YnkgYmluZGluZ3MKKyAgICAqIFtUSFJJRlQtMjI5Ml0gLSBBbmRyb2lkIExpYnJhcnkgUHJvamVjdAorICAgICogW1RIUklGVC0yMDEyXSAtIE1vZGVybml6aW5nIEdvCisgICAgKiBbVEhSSUZULTE5NjldIC0gQyM6IFRlc3RzIG5vdCBwcm9wZXJseSBsaW5rZWQgZnJvbSB0aGUgc29sdXRpb24KKyAgICAqIFtUSFJJRlQtMTc4NV0gLSBDIzogQWRkIFRNZW1vcnlCdWZmZXIgc2VyaWFsaXplci9kZXNlcmlhbGl6ZXIKKyAgICAqIFtUSFJJRlQtMTc4MF0gLSBBZGQgb3B0aW9uIHRvIGdlbmVyYXRlIG51bGxhYmxlIHZhbHVlcworICAgICogW1RIUklGVC0xNzg2XSAtIEMjIFVuaW9uIFR5cGluZworICAgICogW1RIUklGVC01OTFdIC0gTWFrZSB0aGUgQysrIHJ1bnRpbWUgbGlicmFyeSBiZSBjb21wYXRpYmxlIHdpdGggV2luZG93cyBhbmQgVmlzdWFsIFN0dWRpbworICAgICogW1RIUklGVC01MTRdIC0gQWRkIG9wdGlvbiB0byBjb25maWd1cmUgY29tcGlsZXIgb3V0cHV0IGRpcmVjdG9yeQorCisjIyBRdWVzdGlvbgorICAgICogW1RIUklGVC0xNzY0XSAtIGhvdyB0byBnZXQgdGhlIGNvbnRleHQgb2YgY2xpZW50IHdoZW4gb24gYSBycGMgY2FsbCBpbiBzZXJ2ZXIgc2lkZT8KKyAgICAqIFtUSFJJRlQtMTc5MV0gLSB0aHJpZnQncyBuYW1lc3BhY2UgZGlyZWN0aXZlIHdoZW4gZ2VuZXJhdGluZyBoYXNrZWxsIGNvZGUKKworIyMgU3ViLXRhc2sKKyAgICAqIFtUSFJJRlQtMTU5NF0gLSBKYXZhIHRlc3QgY2xpZW50cyBzaG91bGQgaGF2ZSBhIHJldHVybiBjb2RlcyB0aGF0IHJlZmxlY3Qgd2hldGhlciBpdCBzdWNjZWVkcyBvciBub3QuCisgICAgKiBbVEhSSUZULTE1OTVdIC0gSmF2YSB0ZXN0IHNlcnZlciBzaG91bGQgZm9sbG93IHRoZSBkb2N1bWVudGVkIGJlaGF2aW9yIGFzIG9mIFRIUklGVC0xNTkwCisgICAgKiBbVEhSSUZULTk4Nl0gLSBzdDogYWRkIHZlcnNpb24gSW5mbyB0byB0aGUgbGlicmFyeQorICAgICogW1RIUklGVC05ODVdIC0gcGhwOiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTk4NF0gLSBvY2FtbDogYWRkIHZlcnNpb24gSW5mbyB0byB0aGUgbGlicmFyeQorICAgICogW1RIUklGVC0xOTI0XSAtIERlbHBoaTogSW5jb25zaXN0ZW5jeSBpbiBzZXJpYWxpemF0aW9uIG9mIG9wdGlvbmFsIGZpZWxkcworICAgICogW1RIUklGVC0xOTIyXSAtIEMjOiBJbmNvbnNpc3RlbmN5IGluIHNlcmlhbGl6YXRpb24gb2Ygb3B0aW9uYWwgZmllbGRzCisgICAgKiBbVEhSSUZULTE5NjFdIC0gQyMgdGVzdHMgc2hvdWxkIGJlIGluIGxpYi9jc2hhcnAvdGVzdC8uLi4KKyAgICAqIFtUSFJJRlQtMTgyMl0gLSBQSFAgdW5pdCB0ZXN0IGRvZXMgbm90IHdvcmsKKyAgICAqIFtUSFJJRlQtMTkwMl0gLSBDKys6IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcyBvbiBhbnkgVHJhbnNwb3J0LCBQcm90b2NvbCBhbmQgU2VydmVyCisgICAgKiBbVEhSSUZULTE5MDFdIC0gQyM6IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcyBvbiBhbnkgVHJhbnNwb3J0LCBQcm90b2NvbCBhbmQgU2VydmVyCisgICAgKiBbVEhSSUZULTE4OTldIC0gRGVscGhpOiBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMgb24gYW55IFRyYW5zcG9ydCwgUHJvdG9jb2wgYW5kIFNlcnZlcgorICAgICogW1RIUklGVC01NjNdIC0gU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKworCisKK1RocmlmdCAwLjkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBCdWcKKyAgICAqIFtUSFJJRlQtMTQzOF0gLSBsaWIvY3BwL3NyYy93aW5kb3dzL2NvbmZpZy5oIHNob3VsZCByZWFkIHZlcnNpb24gZnJvbSBjb25maWd1cmUuYWMgcmF0aGVyIHRoYW4gYSAjZGVmaW5lCisgICAgKiBbVEhSSUZULTE0NDZdIC0gQ29tcGlsZSBlcnJvciB3aXRoIERlbHBoaSAyMDA5IGluIGNvbnN0YW50IGluaXRpYWxpemVyCisgICAgKiBbVEhSSUZULTE0NTBdIC0gUHJvYmxlbXMgYnVpbGRpbmcgdGhyaWZ0IDAuOC4wIGZvciBQeXRob24gYW5kIFJ1YnkKKyAgICAqIFtUSFJJRlQtMTQ0OV0gLSBSdWJ5IGNsaWVudCBkb2VzIG5vdCB3b3JrIG9uIHNvbGFyaXMgKD8pCisgICAgKiBbVEhSSUZULTE0NDddIC0gTnVsbHBvaW50ZXJFeGNlcHRpb24gaW4gUHJvY2Vzc0Z1bmN0aW9uLmNsYXNzIDppbiAib25ld2F5IiBtZXRob2QKKyAgICAqIFtUSFJJRlQtMTQzM10gLSBUU2VydmVyU29ja2V0IGZpeCBmb3IgTVNWQworICAgICogW1RIUklGVC0xNDI5XSAtIFRoZSBub25ibG9ja2luZyBzZXJ2ZXJzIGlzIHN1cHBvc2VkIHRvIHVzZSBUcmFuc3BvcnRGYWN0b3J5IHRvIHJlYWQgdGhlIGRhdGEKKyAgICAqIFtUSFJJRlQtMTQyN10gLSBQSFAgbGlicmFyeSB1c2VzIG5vbi1tdWx0aWJ5dGUgc2FmZSBmdW5jdGlvbnMgd2l0aCBtYnN0cmluZyBmdW5jdGlvbiBvdmVybG9hZGluZworICAgICogW1RIUklGVC0xNDIxXSAtIERlYmlhbiBQYWNrYWdlcyBjYW4gbm90IGJlIGJ1aWx0CisgICAgKiBbVEhSSUZULTEzOTRdIC0gVHJlYXRtZW50IG9mIG9wdGlvbmFsIGZpZWxkcyBpcyBub3QgY29uc2lzdGVudCBiZXR3ZWVuIEMrKyBhbmQgSmF2YQorICAgICogW1RIUklGVC0xNTExXSAtIFNlcnZlciB3aXRoIG9uZXdheSBzdXBwb3J0ICggSkFWQSApCisgICAgKiBbVEhSSUZULTE0OTZdIC0gUEhQIGNvbXBpbGVyIG5vdCBuYW1lc3BhY2luZyBlbnVtcworICAgICogW1RIUklGVC0xNDk1XSAtIFBIUCBUZXN0Q2xpZW50IGZhdGFscyBvbiBtaXNzaW5nIGNsYXNzCisgICAgKiBbVEhSSUZULTE1MDhdIC0gVFNlcnZlclNvY2tldCBkb2VzIG5vdCBhbGxvdyBmb3IgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgSVAgYWRkcmVzcyB0byBiaW5kIHRvCisgICAgKiBbVEhSSUZULTE1MDRdIC0gQ29jb2EgR2VuZXJhdG9yIHNob3VsZCB1c2UgbG9jYWwgZmlsZSBpbXBvcnRzIGZvciBiYXNlIFRocmlmdCBoZWFkZXJzCisgICAgKiBbVEhSSUZULTE1MTJdIC0gVGhyaWZ0IHNvY2tldCBzdXBwb3J0IGZvciBXaW5kb3dzIFhQCisgICAgKiBbVEhSSUZULTE1MDJdIC0gVFNpbXBsZVNlcnZlcjo6c2VydmUoKTogRG8gbm90IHByaW50IG91dCBlcnJvciBtZXNzYWdlIGlmIHNlcnZlciB3YXMgc3RvcHBlZC4KKyAgICAqIFtUSFJJRlQtMTUwMV0gLSBQSFAgb2xkIG5hbWVzcGFjZXMgbm90IGdlbmVyYXRlZCBmb3IgZW51bXMKKyAgICAqIFtUSFJJRlQtMTQ4M10gLSBqYXZhIGNvbXBpbGVyIGRvZXMgbm90IGdlbmVyYXRlIHR5cGUgcGFyYW1ldGVycyBmb3Igc2VydmljZXMgaW4gZXh0ZW5kZWQgY2xhdXNlcworICAgICogW1RIUklGVC0xNDc5XSAtIENvbXBpbGVkIFBIUCBwcm9jZXNzIGZ1bmN0aW9ucyBtaXNzaW5nIHdyaXRlTWVzc2FnZUVuZCgpCisgICAgKiBbVEhSSUZULTE0OTJdIC0gZW5hYmxpbmcgY19nbGliIHJlbmRlciB0aHJpZnQgdW51c2FibGUgKGV2ZW4gZm9yIEMrKyBjb2RlKQorICAgICogW1RIUklGVC0xNDkxXSAtIFVuaW5pdGlhbGl6ZSBwcm9jZXNzb3JGYWN0b3J5XyBtZW1iZXIgaW4gVFNlcnZlci5oCisgICAgKiBbVEhSSUZULTE0NzVdIC0gSW5jb21wbGV0ZSByZWNvcmRzIGdlbmVyYXRpb24gZm9yIEVybGFuZworICAgICogW1RIUklGVC0xNDg2XSAtIEphdmFzY3JpcHQgbWFudWFsIHRlc3RzZXJ2ZXIgbm90IHJldHVybmluZyBjb250ZW50IHR5cGVzCisgICAgKiBbVEhSSUZULTE0ODhdIC0gc3JjL2NvbmN1cnJlbmN5L1RocmVhZC5oOjkxOjU4OiBlcnJvcjogaW52YWxpZCBjb252ZXJzaW9uIGZyb20gJ3B0aHJlYWRfdCB7YWthIF9vcGFxdWVfcHRocmVhZF90Kn0nIHRvICdhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZDo6aWRfdCB7YWthIGxvbmcgbG9uZyB1bnNpZ25lZCBpbnR9JyBbLWZwZXJtaXNzaXZlXQorICAgICogW1RIUklGVC0xNDkwXSAtIFdpbmRvd3Mtc3BlY2lmaWMgaGVhZGVyIGZpbGVzIC0gZml4ZXMgJiB0d2Vha3MKKyAgICAqIFtUSFJJRlQtMTUyNl0gLSBVbmlvbiBUdXBsZVNjaGVtZUZhY3RvcnkgcmV0dXJucyBTdGFuZGFyZFNjaGVtZXMKKyAgICAqIFtUSFJJRlQtMTUyN10gLSBHZW5lcmF0ZWQgaW1wbGVtZW50YXRpb24gb2YgdHVwbGVSZWFkU3RydWN0IGluIHVuaW9ucyByZXR1cm4gbnVsbCB3aGVuIHRoZSBzZXRmaWVsZCBpcyB1bnJlY29nbml6ZWQKKyAgICAqIFtUSFJJRlQtMTUyNF0gLSBUTm9uQmxvY2tpbmdTZXJ2ZXIgZG9lcyBub3QgY29tcGlsZSBpbiBWaXN1YWwgU3R1ZGlvIDIwMTAKKyAgICAqIFtUSFJJRlQtMTUyOV0gLSBUdXBsZVByb3RvY29sIGNhbiB1bmludGVudGlvbmFsbHkgaW5jbHVkZSBhbiBleHRyYSBieXRlIGluIGJpdCB2ZWN0b3JzIHdoZW4gbnVtYmVyIG9mIG9wdGlvbmFsIGZpZWxkcyBpcyBhbiBpbnRlZ3JhbCBvZiA4CisgICAgKiBbVEhSSUZULTE0NzNdIC0gSlNPTiBjb250ZXh0IHN0YWNrIG1heSBiZSBsZWZ0IGluIGFuIGluY29ycmVjdCBzdGF0ZSB3aGVuIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9ucworICAgICogW1RIUklGVC0xNDU2XSAtIFN5c3RlbS5OZXQuSHR0cFdlYlJlcXVlc3QnIGRvZXMgbm90IGNvbnRhaW4gYSBkZWZpbml0aW9uIGZvciAnUHJveHknCisgICAgKiBbVEhSSUZULTE0NjhdIC0gTWVtb3J5IGxlYWsgaW4gVFNhc2xTZXJ2ZXJUcmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMTQ2MV0gLSBSZWNlbnQgVE5vbmJsb2NraW5nU2VydmVyIGNoYW5nZXMgYnJva2UgLS1lbmFibGUtYm9vc3R0aHJlYWRzPXllcywgV2luZG93cworICAgICogW1RIUklGVC0xNDYwXSAtIHdoeSBub3QgYWRkIHVuaWNvZGUgc3RyaW5ncyBzdXBwb3J0IHRvIHB5dGhvbiBkaXJlY3RseT8KKyAgICAqIFtUSFJJRlQtMTQ2NF0gLSBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLkZyYW1lQnVmZmVyIFROb25ibG9ja2luZ1RyYW5zcG9ydCBhY2Nlc3NvciBjaGFuZ2VkIGZyb20gcHVibGljIHRvIHByaXZhdGUKKyAgICAqIFtUSFJJRlQtMTQ2N10gLSBQb3NzaWJsZSBBViB3aXRoIGVtcHR5IHN0cmluZ3Mgd2hlbiB1c2luZyBKU09OIHByb3RvY29sCisgICAgKiBbVEhSSUZULTE1MjNdIC0gY2xpZW50VGltZW91dCBub3Qgd29ya2VkIGFzIGV4cGVjdGVkIGluIFRTZXJ2ZXJTb2NrZXQgY3JlYXRlZCBieSBUU1NMVHJhbnNwb3J0RmFjdG9yeQorICAgICogW1RIUklGVC0xNTM3XSAtIFRGcmFtZWRUcmFuc3BvcnQgaXNzdWVzCisgICAgKiBbVEhSSUZULTE1MTldIC0gVGhpcmZ0IEJ1aWxkIEZhaWx1cmUgcmVmZXJlbmNpbmcgcmJfaW50ZXJuMiBzeW1ib2wKKyAgICAqIFtUSFJJRlQtMTUxOF0gLSBHZW5lcmF0ZWQgQysrIGNvZGUgb25seSBzZW5kcyB0aGUgZmlyc3Qgb3B0aW9uYWwgZmllbGQgaW4gdGhlIHdyaXRlKCkgZnVuY3Rpb24gZm9yIGEgc3RydWN0LgorICAgICogW1RIUklGVC0xNTE1XSAtIE5hbWVFcnJvcjogZ2xvYmFsIG5hbWUgJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicgaXMgbm90IGRlZmluZWQKKyAgICAqIFtUSFJJRlQtMTU1NF0gLSBJbmhlcml0ZWQgc2VydmljZSBtZXRob2RzIGFyZSBub3QgcmVzb2x2ZWQgaW4gZGVyaXZlZCBzZXJ2aWNlIGltcGxlbWVudGF0aW9ucworICAgICogW1RIUklGVC0xNTUzXSAtIHRocmlmdCBub2RlanMgc2VydmljZSBzaWRlIGNhbid0IHJlYWQgbWFwIHN0cnVjdHVyZSwga2V5IGFzIGVudW0sIHZhbHVlIGFzIE9iamVjdAorICAgICogW1RIUklGVC0xNTc1XSAtIFR5cG8gaW4gc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmgKKyAgICAqIFtUSFJJRlQtMTMyN10gLSBGaXggU3BlYyBTdWl0ZSB1bmRlciBSdWJ5LTEuOC43ICh3b3JrcyBmb3IgTVJJIFJ1YnktMS45LjIpCisgICAgKiBbVEhSSUZULTEzMjZdIC0gb24gc29tZSBwbGF0Zm9ybXMsICNpbmNsdWRlIDxzdGRpbnQuaD4gaXMgbmVjZXNzYXJ5IHRvIGJlIGluY2x1ZGVkIGluIFRocmlmdC5oCisgICAgKiBbVEhSSUZULTExNTldIC0gVEh0dHBDbGllbnQtPkZsdXNoKCkgaXNzdWUgKGNvbm5lY3Rpb24gdGhydSBwcm94eSkKKyAgICAqIFtUSFJJRlQtMTI3N10gLSBOb2RlLmpzIHNlcmlhbGl6ZXMgZmFsc2UgYm9vbGVhbnMgYXMgbnVsbAorICAgICogW1RIUklGVC0xMjI0XSAtIENhbm5vdCBpbnNlcnQgVVRGLTggdGV4dAorICAgICogW1RIUklGVC0xMjY3XSAtIE5vZGUuanMgY2FuJ3QgdGhyb3cgZXhjZXB0aW9ucy4KKyAgICAqIFtUSFJJRlQtMTMzOF0gLSBEbyBub3QgdXNlIGFuIHVucGF0Y2hlZCBhdXRvY29uZiAyLjY1IHRvIGdlbmVyYXRlIHJlbGVhc2UgdGFyYmFsbAorICAgICogW1RIUklGVC0xMTI4XSAtIE1BQyBPUyBYOiB0aHJpZnQuaCBpbmNvbXBhdGliaWxpdHkgd2l0aCBUaHJpZnQuaAorICAgICogW1RIUklGVC0xNjMxXSAtIEZpeCBDKysgc2VydmVyIGNvbnN0cnVjdG9yIHR5cG9zCisgICAgKiBbVEhSSUZULTE2MDJdIC0gUEhQIEMgRXh0ZW5zaW9uIGlzIG5vdCBDb21wYXRpYmxlIHdpdGggUEhQIDUuNAorICAgICogW1RIUklGVC0xNjEwXSAtIElXZWJQcm94eSBub3QgYXZhaWxhYmxlIG9uIFdQNyBwbGF0Zm9ybQorICAgICogW1RIUklGVC0xNjA2XSAtIFJhY2UgY29uZGl0aW9uIGluIEJvb3N0VGhyZWFkRmFjdG9yeS5jcHAKKyAgICAqIFtUSFJJRlQtMTYwNF0gLSBQeXRob24gZXhjZXB0aW9uIGhhbmRlbGluZyBmb3IgY2hhbmdlcyBmcm9tIFBFUCAzMTEwCisgICAgKiBbVEhSSUZULTE2MDddIC0gSW5jb3JyZWN0IGZpbGUgbW9kZXMgZm9yIHNldmVyYWwgc291cmNlIGZpbGVzCisgICAgKiBbVEhSSUZULTE1ODNdIC0gY19nbGliIGxlYWtzIG1lbW9yeQorICAgICogW1RIUklGVC0xNTgyXSAtIEJhZCBpbmNsdWRlcyBvZiBuZXN0ZWQgdGhyaWZ0IGZpbGVzIGluIGNfZ2xpYgorICAgICogW1RIUklGVC0xNTc4XSAtIENfR0xpYiBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBjb21waWxlCisgICAgKiBbVEhSSUZULTE1OTddIC0gVEpTT05Qcm90b2NvbC5waHAgaXMgbWlzc2luZyBmcm9tIE1ha2VmaWxlLmFtCisgICAgKiBbVEhSSUZULTE1OTFdIC0gRW5hYmxlIFRDUF9OT0RFTEFZIGZvciBydWJ5IGdlbQorICAgICogW1RIUklGVC0xNjI0XSAtIElzc2V0IEdlbmVyYXRlZCBkaWZmZXJlbnRseSBvbiBkaWZmZXJlbnQgcGxhdGZvcm1zCisgICAgKiBbVEhSSUZULTE2MjJdIC0gSW5jb3JyZWN0IHNpemUgcmV0dXJuZWQgb24gcmVhZAorICAgICogW1RIUklGVC0xNjIxXSAtIE1lbW9yeSBsZWFrcworICAgICogW1RIUklGVC0xNjEyXSAtIEJhc2U2NCBlbmNvZGluZyBpcyBicm9rZW4KKyAgICAqIFtUSFJJRlQtMTYyN10gLSBjb21waWxlciBidWlsdCB1c2luZyBjb21waWxlcnMudmN4cHJvaiBjYW5ub3QgYmUgdXNlZCB0byBidWlsZCBzb21lIHRlc3QgLnRocmlmdCBmaWxlcworICAgICogW1RIUklGVC0xNTcxXSAtIFVwZGF0ZSBSdWJ5IEhUVFAgdHJhbnNwb3J0IGZvciByZWNlbnQgUnVieSB2ZXJzaW9ucworICAgICogW1RIUklGVC0xMDIzXSAtIFRocmlmdCBlbmNvZGluZyAgKFVURi04KSBpc3N1ZSB3aXRoIFJ1YnkgMS45LjIKKyAgICAqIFtUSFJJRlQtMTA5MF0gLSBEb2N1bWVudCB0aGUgZ2VuZXJhdGlvbiBvZiBhIGZpbGUgY2FsbGVkICJDb25zdGFudHMuamF2YSIKKyAgICAqIFtUSFJJRlQtMTA4Ml0gLSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydCBzb21ldGltZXMgY2FsbHMgY2xvc2UoKSBvbiBhbiB1bmRlZmluZWQgdmFsdWUKKyAgICAqIFtUSFJJRlQtOTU2XSAtIFB5dGhvbiBtb2R1bGUncyB2ZXJzaW9uIG1ldGEtZGF0YSBzaG91bGQgYmUgdXBkYXRlZAorICAgICogW1RIUklGVC05NzNdIC0gQ29jb2EgbGlicmFyeSB3b24ndCBjb21waWxlIHVzaW5nIGNsYW5nCisgICAgKiBbVEhSSUZULTE2MzJdIC0gcnVieTogZGF0YSBjb3JydXB0aW9uIGluIHRocmlmdF9uYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgTWVtb3J5QnVmZmVyVHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTE2NjVdIC0gVEJpbmFyeVByb3RvY29sOiBleGNlZWRlZCBtZXNzYWdlIGxlbmd0aCByYWlzZXMgZ2VuZXJpYyBURXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTE2NjRdIC0gUmVmZXJlbmNlIHRvIG5vbi1leGlzdGluZyB2YXJpYWJsZSBpbiBidWlsZCBzY3JpcHQKKyAgICAqIFtUSFJJRlQtMTY2M10gLSBKYXZhIFRocmlmdCBzZXJ2ZXIgaXMgbm90IHRocm93aW5nIGV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtMTY2Ml0gLSAicmVtb3ZlT2JqZWN0OiIgc2hvdWxkIGJlICJyZW1vdmVPYnNlcnZlcjoiIGluIFstVFNvY2tldFNlcnZlciBkZWFsbG9jXT8KKyAgICAqIFtUSFJJRlQtMTY0M10gLSBEZW5pYWwgb2YgU2VydmljZSBhdHRhY2sgaW4gVEJpbmFyeVByb3RvY29sLnJlYWRTdHJpbmcKKyAgICAqIFtUSFJJRlQtMTY3NF0gLSBVcGRhdGUgVGhyaWZ0IEQgbGlicmFyeSB0byBiZSBjb21wYXRpYmxlIHdpdGggMi4wNjAKKyAgICAqIFtUSFJJRlQtMTY3M10gLSBSdWJ5IGNvbXBpbGUgZmxhZ3MgZm9yIGV4dGVuc2lvbiBmb3IgbXVsdGkgYXJjaCBidWlsZHMgKG9zIHgpCisgICAgKiBbVEhSSUZULTE2NTVdIC0gQ29uZmlndXJlIHN0aWxsIHRyeWluZyB0byB1c2UgdGhyaWZ0X2dlbmVyYXRvcnMgaW4gb3V0cHV0CisgICAgKiBbVEhSSUZULTE2NTRdIC0gY19nbGliIHRocmlmdF9zb2NrZXRfcmVhZCgpIHJldHVybnMgY29ycnVwdGVkIGRhdGEKKyAgICAqIFtUSFJJRlQtMTY1M10gLSBUVGhyZWFkZWRTZWxlY3RvclNlcnZlciBsZWFrcyBDTE9TRV9XQUlUIHNvY2tldHMKKyAgICAqIFtUSFJJRlQtMTY1OF0gLSBKYXZhIHRocmlmdCBzZXJ2ZXIgaXMgbm90IHRocm93aW5nIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgorICAgICogW1RIUklGVC0xNjU2XSAtIFNldHRpbmcgcHJvcGVyIGhlYWRlcnMgaW4gVEh0dHBTZXJ2ZXIuY3BwIHNvIHRoYXQgIkNyb3NzLU9yaWdpbiBSZXNvdXJjZSBTaGFyaW5nIiBvbiBqcyBjbGllbnQgY2FuIHdvcmsuCisgICAgKiBbVEhSSUZULTE2NTJdIC0gVFNhc2xUcmFuc3BvcnQgZG9lcyBub3QgbG9nIHRoZSBlcnJvciB3aGVuIGtlcmJlcm9zIGF1dGggZmFpbHMKKyAgICAqIFtUSFJJRlQtMjI3Ml0gLSBDTE9ORSAtIERlbmlhbCBvZiBTZXJ2aWNlIGF0dGFjayBpbiBUQmluYXJ5UHJvdG9jb2wucmVhZFN0cmluZworICAgICogW1RIUklGVC0yMDg2XSAtIEludmFsaWQgZ2VuZXJhdGVkIGNvZGUgZm9yIE5vZGUuSlMgd2hlbiB1c2luZyBuYW1lc3BhY2VzCisgICAgKiBbVEhSSUZULTE2ODZdIC0gdF9waHBfZ2VuZXJhdG9yLmNjIHVzZXMgImFuZCIgaW5zdGVhZCBvZiAiJiYiLCBhbmQgY2F1c2VzIGNvbXBpbGVyIGVycm9ycyB3aXRoIFZpc3VhbCBTdHVkaW8KKyAgICAqIFtUSFJJRlQtMTY5M10gLSBsaWJ0aHJpZnQgaGFzIGRlcGVuZGVuY3kgb24gdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBodHRwY29yZQorICAgICogW1RIUklGVC0xNjg5XSAtIGRvbid0IGV4aXQoLTEpIGluIFROb25ibG9ja2luZ1NlcnZlcgorICAgICogW1RIUklGVC0xNjc5XSAtIE5vZGVKUzogcHJvdG9jb2wgcmVhZFN0cmluZygpIHNob3VsZCB0cmVhdCBzdHJpbmcgYXMgdXRmOCwgbm90IGJpbmFyeQorICAgICogW1RIUklGVC0xNzIxXSAtIERpc3QgYnJva2VuIGR1ZSB0byAwLjguMCB0byAwLjkuMCBjaGFuZ2VzCisgICAgKiBbVEhSSUZULTE3MTBdIC0gTWlub3IgaXNzdWVzIGluIHRlc3QgY2FzZSBjb2RlCisgICAgKiBbVEhSSUZULTE3MDldIC0gV2FybmluZyAiQml0d2lzZS1vciBvcGVyYXRvciB1c2VkIG9uIGEgc2lnbi1leHRlbmRlZCBvcGVyYW5kOyBjb25zaWRlciBjYXN0aW5nIHRvIGEgc21hbGxlciB1bnNpZ25lZCB0eXBlIGZpcnN0IiBpbiBUQmluYXJ5UHJvdG9jb2wuY3MgYXQgUmVhZEludDY0KCkKKyAgICAqIFtUSFJJRlQtMTcwN10gLSBbcnVieV0gQWRqdXN0IHNlcnZlcl9zcGVjLnJiIGZvciBSU3BlYyAyLjExLnggYW5kIFJ1YnkgMS45LjMKKyAgICAqIFtUSFJJRlQtMTY3MV0gLSBDb2NvYSBjb2RlIGdlbmVyYXRvciBkb2VzIG5vdCBwdXQga2V5d29yZHMgaW50byBnZW5lcmF0ZWQgbWV0aG9kIGNhbGxzCisgICAgKiBbVEhSSUZULTE2NzBdIC0gSW5jb21wYXRpYmlsaXRpZXMgYmV0d2VlbiBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgYSBUaHJpZnQgaW50ZXJmYWNlCisgICAgKiBbVEhSSUZULTE2NjldIC0gTmFtZUVycm9yOiBnbG9iYWwgbmFtZSAnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyBpcyBub3QgZGVmaW5lZAorICAgICogW1RIUklGVC0xNjY4XSAtIENvbXBpbGUgZXJyb3IgaW4gY29udHJpYi9mYjMwMywgdGhyaWZ0L1REaXNwYXRjaFByb2Nlc3Nvci5oOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisgICAgKiBbVEhSSUZULTE4NDVdIC0gRml4IGNvbXBpbGVyIHdhcm5pbmcgY2F1c2VkIGJ5IGltcGxpY2l0IHN0cmluZyBjb252ZXJzaW9uIHdpdGggWGNvZGUgNC42CisgICAgKiBbVEhSSUZULTMwNF0gLSBCdWlsZGluZyB0aGUgUHl0aG9uIGxpYnJhcnkgcmVxdWlyZXMgZGV2ZWxvcG1lbnQgaGVhZGVycworICAgICogW1RIUklGVC0zNjldIC0gc2V0cyBhbmQgbWFwcyBicmVhayBlcXVhbGl0eQorICAgICogW1RIUklGVC01NTZdIC0gUnVieSBjb21waWxlciBkb2VzIG5vdCBjb3JyZWN0bHkgcmVmZXJyZWQgdG8gdG9wLWxldmVsIG1vZHVsZXMgd2hlbiBhIHN1Ym1vZHVsZSBtYXNrcyB0aGUgdG9wLWxldmVsIG5hbWUKKyAgICAqIFtUSFJJRlQtNDgxXSAtIGluZGVudGF0aW9uIG9mIHJ1YnkgY2xhc3NlcyBpcyBvZmYgYnkgYSBmZXcKKworIyMgSW1wcm92ZW1lbnQKKyAgICAqIFtUSFJJRlQtMTQ5OF0gLSBBbGxvdyBUVGhyZWFkZWRQb29sU2VydmVyLkFyZ3MgdG8gcGFzcyBhIEV4ZWN1dG9yU2VydmljZQorICAgICogW1RIUklGVC0xNDQ0XSAtIEZ1bmN0aW9uUnVubmVyIC0gYWRkIHN5bnRhY3RpYyBzdWdhciB0byBjcmVhdGUgc2hhcmVkX3B0cnMKKyAgICAqIFtUSFJJRlQtMTQ0M10gLSBkZWZpbmUgYSBUUHJvY2Vzc29yIGhlbHBlciBjbGFzcyB0byBpbXBsZW1lbnQgcHJvY2VzcygpCisgICAgKiBbVEhSSUZULTE0NDFdIC0gR2VuZXJhdGUgY29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzIGZvciBleGNlcHRpb24gY2xhc3MgdG8gbGV0IGl0IHVwZGF0ZSBtZXNzYWdlIHByb3BlcnR5IGF1dG9tYXRpY2FsbHkuCisgICAgKiBbVEhSSUZULTE1MjBdIC0gRW1iZWQgdmVyc2lvbiBudW1iZXIgaW4gZXJsYW5nIC5hcHAgZmlsZQorICAgICogW1RIUklGVC0xNDgwXSAtIHB5dGhvbjogcmVtb3ZlIHRhYnMsIGFkanVzdCB3aGl0ZXNwYWNlIGFuZCBhZGRyZXNzIFBFUDggd2FybmluZ3MKKyAgICAqIFtUSFJJRlQtMTQ4NV0gLSBQZXJmb3JtYW5jZTogcGFzcyBsYXJnZSBhbmQvb3IgcmVmY291bnRlZCBhcmd1bWVudHMgYXMgImNvbnN0IgorICAgICogW1RIUklGVC0xNDg0XSAtIEludHJvZHVjZSBwaHB1bml0IHRlc3Qgc3VpdGUKKyAgICAqIFtUSFJJRlQtMTUzMl0gLSBUaGUgdHlwZSBzcGVjaWZpY2F0aW9ucyBpbiB0aGUgZ2VuZXJhdGVkIEVybGFuZyBjb2RlIHNob3VsZCBpbmNsdWRlICJ1bmRlZmluZWQiIHdoZXJlIGl0J3MgdXNlZCBhcyBhIGRlZmF1bHQgdmFsdWUKKyAgICAqIFtUSFJJRlQtMTUzNF0gLSBSZXF1aXJlZCBmaWVsZHMgaW4gdGhlIERlbHBoaSBjb2RlIGdlbmVyYXRvci4KKyAgICAqIFtUSFJJRlQtMTQ2OV0gLSBKYXZhIGlzc2V0IHNwYWNlIG9wdGltaXphdGlvbgorICAgICogW1RIUklGVC0xNDY1XSAtIFZpc2liaWxpdHkgb2YgbWV0aG9kcyBpbiBnZW5lcmF0ZWQgamF2YSBjb2RlCisgICAgKiBbVEhSSUZULTE0NTNdIC0gRG9uJ3QgY2hhbmdlIHR5cGVzIG9mIGFyZ3VtZW50cyB3aGVuIHNlcmlhbGl6aW5nIHdpdGggdGhyaWZ0IHBocCBleHRlbnNpb24KKyAgICAqIFtUSFJJRlQtMTQ1Ml0gLSBnZW5lcmF0ZSBhIHN3YXAoKSBtZXRob2QgZm9yIGFsbCBnZW5lcmF0ZWQgc3RydWN0cworICAgICogW1RIUklGVC0xNDUxXSAtIEZyYW1lZFRyYW5zcG9ydDogUHJldmVudCBpbmZpbml0ZSBsb29wIHdoZW4gd3JpdGluZworICAgICogW1RIUklGVC0xNTIxXSAtIFR3byBwYXRjaGVzIGZvciBtb3JlIFBlcmZvcm1hbmNlCisgICAgKiBbVEhSSUZULTE1NTVdIC0gRGVscGhpIHZlcnNpb24gb2YgdGhlIHR1dG9yaWFsIGNvZGUKKyAgICAqIFtUSFJJRlQtMTUzNV0gLSBXaHkgdGhyaWZ0IGRvbid0IHVzZSB3cmFwcGVkIGNsYXNzIGZvciBvcHRpb25hbCBmaWVsZHMgPworICAgICogW1RIUklGVC0xMjA0XSAtIFJ1YnkgYXV0b2dlbmVyYXRlZCBmaWxlcyBzaG91bGQgcmVxdWlyZSAndGhyaWZ0JyBnZW0KKyAgICAqIFtUSFJJRlQtMTM0NF0gLSBVc2luZyB0aGUgaHR0cGMgbW9kdWxlIGRpcmVjdGx5IHJhdGhlciB0aGFuIHRoZSBkZXByZWNhdGVkIGh0dHAgbGF5ZXIKKyAgICAqIFtUSFJJRlQtMTM0M10gLSBub19hdXRvX2ltcG9ydCBtaW4vMiB0byBhdm9pZCBjb21waWxlIHdhcm5pbmcKKyAgICAqIFtUSFJJRlQtMTM0MF0gLSBBZGQgc3VwcG9ydCBvZiBBUkMgdG8gT2JqZWN0aXZlLUMKKyAgICAqIFtUSFJJRlQtMTYxMV0gLSBJbXByb3ZlZCBjb2RlIGdlbmVyYXRpb24gZm9yIHR5cGVkZWZzCisgICAgKiBbVEhSSUZULTE1OTNdIC0gUGFzcyBvbiBlcnJvcnMgbGlrZSAiY29ubmVjdGlvbiBjbG9zZWQiIHRvIHRoZSBoYW5kbGVyIG1vZHVsZQorICAgICogW1RIUklGVC0xNjE1XSAtIFBIUCBOYW1lc3BhY2UKKyAgICAqIFtUSFJJRlQtMTU2N10gLSBUaHJpZnQvY3BwOiBBbGxvdyBhbHRlcm5hdGUgY2xhc3NlcyB0byBiZSB1c2VkIGZvcgorICAgICogW1RIUklGVC0xMDcyXSAtIE1pc3NpbmcgLSAoaWQpIGluaXRXaXRoU2hhcmVkUHJvY2Vzc29yIGluIFRTaGFyZWRQcm9jZXNzb3JGYWN0b3J5LmgKKyAgICAqIFtUSFJJRlQtMTY1MF0gLSBbcnVieV0gVXBkYXRlIGNsZWFuIGl0ZW1zIGFuZCBzdm46aWdub3JlIGVudHJpZXMgZm9yIE9TIFggYXJ0aWZhY3RzCisgICAgKiBbVEhSSUZULTE2NjFdIC0gW1BBVENIXSBBZGQgLS13aXRoLXF0NCBjb25maWd1cmUgb3B0aW9uCisgICAgKiBbVEhSSUZULTE2NzVdIC0gRG8gd2UgaGF2ZSBhbnkgcGxhbiB0byBzdXBwb3J0IHNjYWxhPworICAgICogW1RIUklGVC0xNjQ1XSAtIFJlcGxhY2UgT2JqZWN0I3RlZSB3aXRoIG1vcmUgY29udmVudGlvbmFsIE9iamVjdCN0YXAgaW4gc3BlY3MKKyAgICAqIFtUSFJJRlQtMTY0NF0gLSBVcGdyYWRlIFJTcGVjIHRvIDIuMTAueCBhbmQgcmVmYWN0b3Igc3BlY3MgYXMgbmVlZGVkCisgICAgKiBbVEhSSUZULTE2NzJdIC0gTW9ub1RvdWNoIChhbmQgTW9ubyBmb3IgQW5kcm9pZCkgY29tcGF0aWJpbGl0eQorICAgICogW1RIUklGVC0xNzAyXSAtIGEgdGhyaWZ0IG1hbnVhbAorICAgICogW1RIUklGVC0xNjk0XSAtIFJlLUVuYWJsZSBzZXJpYWxpemF0aW9uIGZvciBXUDcgU2lsdmVybGlnaHQKKyAgICAqIFtUSFJJRlQtMTY5MV0gLSBTZXJpYWxpemVyL2Rlc2VyaWFsaXplciBzdXBwb3J0IGZvciBEZWxwaGkKKyAgICAqIFtUSFJJRlQtMTY4OF0gLSBVcGRhdGUgSURMIHBhZ2UgbWFya3VwCisgICAgKiBbVEhSSUZULTE3MjVdIC0gVHV0b3JpYWwgd2ViIHBhZ2VzIGZvciBEZWxwaGkgYW5kIEMjCisgICAgKiBbVEhSSUZULTE3MTRdIC0gW3J1YnldIEV4cGxpY2l0bHkgYWRkIENXRCB0byBSdWJ5IHRlc3Rfc3VpdGVzLnJiCisgICAgKiBbVEhSSUZULTMxN10gLSBJc3N1ZXMgd2l0aCBKYXZhIHN0cnVjdCB2YWxpZGF0aW9uCisgICAgKiBbVEhSSUZULTE2NF0gLSBCdWlsZCB3ZWIgdHV0b3JpYWwgb24gSW5jdWJhdG9yIHdlYiBzaXRlCisgICAgKiBbVEhSSUZULTU0MV0gLSBDb2NvYSBjb2RlIGdlbmVyYXRvciBkb2Vzbid0IHB1dCBrZXl3b3JkcyBiZWZvcmUgYWxsIGFyZ3VtZW50cy4KKyAgICAqIFtUSFJJRlQtNjgxXSAtIFRoZSBIVE1MIGdlbmVyYXRvciBkb2VzIG5vdCBoYW5kbGUgSmF2YURvYyBzdHlsZSBjb21tZW50cyB2ZXJ5IHdlbGwKKworIyMgTmV3IEZlYXR1cmUKKyAgICAqIFtUSFJJRlQtMTUwMF0gLSBEIHByb2dyYW1taW5nIGxhbmd1YWdlIHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMTUxMF0gLSBUaGVyZSBzaG91bGQgYmUgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEpzb25Qcm90b2NvbCBmb3IgcnVieQorICAgICogW1RIUklGVC0xMTE1XSAtIHB5dGhvbiBUQmFzZSBjbGFzcyBmb3IgZHluYW1pYyAoZGUpc2VyaWFsaXphdGlvbiwgYW5kIF9fc2xvdHNfXyBvcHRpb24gZm9yIG1lbW9yeSBzYXZpbmdzCisgICAgKiBbVEhSSUZULTE5NTNdIC0gc3VwcG9ydCBmb3IgYXNwLm5ldCBtdmMgMworCisjIyBRdWVzdGlvbgorICAgICogW1RIUklGVC0xMjM1XSAtIEhvdyBjb3VsZCBJIHVzZSBUSHR0cFNlcnZlclRyYW5zcG9ydEZhY3Rvcnkgd2l0aFROb25CbG9ja2luZ1NlcnZlcgorICAgICogW1RIUklGVC0xMzY4XSAtIFROb25ibG9ja2luZ1NlcnZlciB1c2FnZQorICAgICogW1RIUklGVC0xMDYxXSAtIFJlYWQgYW4gaW52YWxpZCBmcmFtZSBzaXplIG9mIDAuIEFyZSB5b3UgdXNpbmcgVEZyYW1lZFRyYW5zcG9ydCBvbiB0aGUgY2xpZW50IHNpZGU/CisgICAgKiBbVEhSSUZULTQ5MV0gLSBSaXBwaW5nIHJhdyBwdGhyZWFkcyBvdXQgb2YgVEZpbGVUcmFuc3BvcnQgYW5kIGFzc29jaWF0ZWQgdGVzdCBpc3N1ZXMKKworIyMgU3ViLXRhc2sKKyAgICAqIFtUSFJJRlQtMTU5Nl0gLSBEZWxwaGk6IFRlc3QgY2xpZW50cyBzaG91bGQgaGF2ZSBhIHJldHVybiBjb2RlcyB0aGF0IHJlZmxlY3Qgd2hldGhlciB0aGV5IHN1Y2NlZWRlZCBvciBub3QKKyAgICAqIFtUSFJJRlQtOTgyXSAtIGphdmFtZTogYWRkIHZlcnNpb24gSW5mbyB0byB0aGUgbGlicmFyeQorICAgICogW1RIUklGVC0xNzIyXSAtIEMjIFdQNyBBc3NlbWJseSBhZGRpdGlvbiBiZWFrcyBtb25vIGJ1aWxkCisgICAgKiBbVEhSSUZULTMzNl0gLSBDb21wYWN0IFByb3RvY29sIGluIEMjCisKKyMjIFRlc3QKKyAgICAqIFtUSFJJRlQtMTYxM10gLSBBZGQgY29kZSBiYWNrIGludG8gZW1wdHkgc291cmNlIGZpbGUgVG9TdHJpbmdUZXN0LmphdmEKKyAgICAqIFtUSFJJRlQtMTcxOF0gLSBJbmNvcnJlY3QgY2hlY2sgaW4gVEZpbGVUcmFuc3BvcnRUZXN0CisKKyMjIFdpc2gKKyAgICAqIFtUSFJJRlQtMTQ2M10gLSBEZWNvdXBsZSBUaHJpZnQgSURMIGZyb20gZ2VuZXJhdG9ycworICAgICogW1RIUklGVC0xNDY2XSAtIFByb3BlciBEb2N1bWVudGF0aW9uIGZvciBUaHJpZnQgQyBHbGliCisgICAgKiBbVEhSSUZULTE1MzldIC0gQnVpbGQgYW5kIGRpc3RyaWJ1dGUgdGhlIGZiMzAzIHB5dGhvbiBsaWJyYXJpZXMgYWxvbmcgd2l0aCB0aHJpZnQKKyAgICAqIFtUSFJJRlQtMTY4NV0gLSBQbGVhc2UgYWRkICJhZXJlby5jb20iIHRvICJQb3dlcmVkIGJ5IEFwYWNoZSBUaHJpZnQiIGxpc3QgaW4gYWJvdXQgcGFnZQorICAgICogW1RIUklGVC0zMzBdIC0gVFByb2Nlc3NvciAtIGFkZGl0aW9uYWwgbWV0aG9kIHRvIGNhbGxlZCB3aGVuIGNvbm5lY3Rpb24gaXMgYnJva2VuCisKKworCitUaHJpZnQgMC44CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgQnVnCisgICAgKiBbVEhSSUZULTE0MzZdIC0gcGlwIGluc3RhbGwgdGhyaWZ0IGZhaWxzIG9uIFdpbmRvd3Mgd2l0aCAiVW5hYmxlIHRvIGZpbmQgdmN2YXJzYWxsLmJhdCIKKyAgICAqIFtUSFJJRlQtMTQzMl0gLSBKYXZhc2NyaXB0IHN0cnVjdCBjb25zdGFudHMgZGVjbGFyZWQgaW4gdGhlIHNhbWUgZmlsZSBhcyB0aGVpciBzdHJ1Y3QgZGVmaW5pdGlvbiB3aWxsIGNhdXNlIGFuIGVycm9yCisgICAgKiBbVEhSSUZULTE0MjhdIC0gc2hhcmVkLnRocmZ0IGRvZXMgbm90IGluY2x1ZGUgbmFtZXNwYWNlIGZvciBwaHAsIHNvIHRocmlmdCBjb21waWxlciBnZW5lcmF0ZSBpbmNvcnJlY3QgbmFtZQorICAgICogW1RIUklGVC0xNDI2XSAtIERpc3QgcGFja2FnZSBtaXNzaW5nIGZpbGVzIGZvciByZWxlYXNlIDAuOAorICAgICogW1RIUklGVC0xNDI1XSAtIFRoZSBOb2RlIHBhY2thZ2UgaXMgaW5jb21wYXRpYmxlIHdpdGggbGF0ZXN0IG5vZGUgKDAuNikgJiBucG0gKDEuMC4yNykKKyAgICAqIFtUSFJJRlQtMTQxNl0gLSBQeXRob24gVW5pdCB0ZXN0IGlzIGJyb2tlbiBvbiBjaQorICAgICogW1RIUklGVC0xNDE5XSAtIEFic3RyYWN0Tm9uQmxvY2tpbmdTZXJ2ZXIgZG9lcyBub3QgY2F0Y2ggZXJyb3JzIHdoZW4gaW52b2tpbmcgdGhlIHByb2Nlc3NvcgorICAgICogW1RIUklGVC0xNDI0XSAtIFJ1Ynkgc3BlY3MgZmFpbCB3aGVuIHJ1biB3aXRoIHJha2UKKyAgICAqIFtUSFJJRlQtMTQyMF0gLSBOb25ibG9ja2luZyBhbmQgSHNIYSBzZXJ2ZXIgc2hvdWxkIG1ha2Ugc3VyZSB0byBjbG9zZSBhbGwgdGhlaXIgc29ja2V0IGNvbm5lY3Rpb25zIHdoZW4gdGhlIHNlbGVjdG9yIGV4aXRzCisgICAgKiBbVEhSSUZULTE0MTNdIC0gR2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgcmVhZCBNYXBFbmQgLyBMaXN0RW5kIC8gU2V0RW5kCisgICAgKiBbVEhSSUZULTE0MDldIC0gTmFtZSBjb25mbGljdCBjaGVjayBkb2VzIG5vdCB3b3JrIHByb3Blcmx5IGZvciBleGNlcHRpb24gb2JqZWN0KERlbHBoaSkuCisgICAgKiBbVEhSSUZULTE0MDhdIC0gRGVscGhpIFRlc3QgU2VydmVyOiBFeGNlcHRpb24gdGVzdCBjYXNlIGZhaWxzIGR1ZSB0byBuYW1pbmcgY29uZmxpY3Qgd2l0aCBlLm1lc3NhZ2UKKyAgICAqIFtUSFJJRlQtMTQwN10gLSBUeXBvIGluIFB5dGhvbiBzb2NrZXQgc2VydmVyIGNhdXNlcyBUaHJpZnQgdG8gZmFpbCB3aGVuIHdlIGVuYWJsZSBhIGdsb2JhbCBzb2NrZXQgdGltb3V0CisgICAgKiBbVEhSSUZULTEzOTddIC0gQ0kgc2VydmVyIGZhaWxzIGR1cmluZyBidWlsZCBkdWUgdG8gdW51c2VkIHBhcmFtZXRlcnMgaW4gZGVscGhpIGdlbmVyYXRvcgorICAgICogW1RIUklGVC0xNDA0XSAtIERlbHBoaSBjb21waWxlciBnZW5lcmF0ZXMgc3RydWN0IHJlYWRlciBjb2RlIHdpdGggcHJvYmxlbS4KKyAgICAqIFtUSFJJRlQtMTQwMF0gLSBSdWJ5IG5hdGl2ZSBleHRlbnNpb24gYWJvcnRzIHdpdGggX19zdGFja19jaGtfZmFpbCBpbiBPU1gKKyAgICAqIFtUSFJJRlQtMTM5OV0gLSBPbmUgb2YgdGhlIFRTZXJ2ZXJJbXBsLkNyZWF0ZSBDVE9ScyBsYWNrcyBpbXBsZW1lbnRhdGlvbgorICAgICogW1RIUklGVC0xMzkwXSAtIERlYmlhbiBwYWNrYWdlcyBidWlsZCBmaXggZm9yIFNxdWVlemUgKGJ1aWxkIGZyb20gdGhlIG9mZmljaWFsICAwLjcuMCB0YXJiYWxsKQorICAgICogW1RIUklGVC0xMzkzXSAtIFRUcmFuc3BvcnRFeGNlcHRpb24ncyB0aHJvd24gZnJvbSBUSHR0cENsaWVudCBjb250YWluIHN1cGVyZmx1b3VzIHNsYXNoZXMgaW4gdGhlIEV4Y2VwdGlvbiBtZXNzYWdlCisgICAgKiBbVEhSSUZULTEzOTJdIC0gRW5hYmxpbmcgYm90aCBuYW1lc3BhY2VzIGFuZCBhdXRvbG9hZGluZyBpbiBnZW5lcmF0ZWQgUEhQIGNvZGUgd29uJ3Qgd29yay4KKyAgICAqIFtUSFJJRlQtMTQwNl0gLSBCdWlsZCBlcnJvciBhZnRlciBhcHBseWluZyBUSFJJRlQtMTM5NQorICAgICogW1RIUklGVC0xNDA1XSAtIERlbHBoaSBjb21waWxlciBkb2VzIG5vdCBnZW5lcmF0ZXMgY29udGFpbmVyIHNlcmlhbGl6ZXIgcHJvcGVybHkuCisgICAgKiBbVEhSSUZULTE0MTFdIC0gamF2YSBnZW5lcmF0b3IgZG9lcyBub3QgcHJvdmlkZSB0eXBlIHBhcmFtZXRlciBmb3IgVEJhc2VQcm9jZXNzb3IKKyAgICAqIFtUSFJJRlQtMTQ3M10gLSBKU09OIGNvbnRleHQgc3RhY2sgbWF5IGJlIGxlZnQgaW4gYW4gaW5jb3JyZWN0IHN0YXRlIHdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgcmVhZCBvciB3cml0ZSBvcGVyYXRpb25zCisgICAgKiBbVEhSSUZULTEzMzFdIC0gUnVieSBsaWJyYXJ5IGRlc2VyaWFsaXplcyBhbiBlbXB0eSBtYXAgdG8gbmlsCisgICAgKiBbVEhSSUZULTEzMzBdIC0gUEhQIE5hbWVzcGFjZXMgbm8gbG9uZ2VyIGdlbmVyYXRlZAorICAgICogW1RIUklGVC0xMzI4XSAtIFRCYXNlSGVscGVyLnRvU3RyaW5nKC4uLikgYXBwZW5kcyBCeXRlQnVmZmVyIGRhdGEgb3V0c2lkZSBvZiB2YWxpZCBidWZmZXIgcmFuZ2UKKyAgICAqIFtUSFJJRlQtMTMyMl0gLSBPQ2FtbCBsaWIgZmFpbCB0byBjb21waWxlOiBUaHJpZnQubWwgbGluZSAzMDUsIGludCB2cyBpbnQzMiBtaXNtYXRjaAorICAgICogW1RIUklGVC0xMTQzXSAtIEJ1aWxkIGRvZXNuJ3QgZGV0ZWN0IGNvcnJlY3QgYXJjaGl0ZWN0dXJlIHR5cGUgb24gNjRiaXQgb3N4CisgICAgKiBbVEhSSUZULTEyMDVdIC0gcG9ydCBzZXJ2ZXIgdW5kdWx5IGZyYWdpbGUgd2l0aCBhcmJpdHJhcnkgaW5wdXQKKyAgICAqIFtUSFJJRlQtMTI3OV0gLSB0eXBlIHNldCBpcyBoYW5kbGVkIGluY29ycmVjdGx5IHdoZW4gd3JpdGluZyBvYmplY3QKKyAgICAqIFtUSFJJRlQtMTI5OF0gLSBTdGFuZGFyZCBzY2hlbWUgZG9lc24ndCByZWFkIG9yIHdyaXRlIG1ldGFkYXRhIGFsb25nIHdpdGggZmllbGQgdmFsdWVzCisgICAgKiBbVEhSSUZULTEyNjVdIC0gQysrIGNvbnRhaW5lciBkZXNlcmlhbGl6ZQorICAgICogW1RIUklGVC0xMjYzXSAtIHB1Ymxpc2ggcnVieSBjbGllbnQgdG8gcnVieWdlbXMKKyAgICAqIFtUSFJJRlQtMTM4NF0gLSBKYXZhIGhlbHAgbWVudSBtaXNzaW5nIG5ld2xpbmUgbmVhciBqYXZhbWUgZmxhZworICAgICogW1RIUklGVC0xMzgyXSAtIEJ1bmRsZSBpbnN0YWxsIGRvZXNub3Qgd29yayBiZWNhdXNlIHRocmlmdCBjcmFzaGVzCisgICAgKiBbVEhSSUZULTEzODFdIC0gVGhyaWZ0IEMrKyBsaWJzIGhhdmUgaW5jb3JyZWN0bHkgdmVyc2lvbmVkIG5hbWVzCisgICAgKiBbVEhSSUZULTEzNTBdIC0gR28gbGlicmFyeSBjb2RlIGRvZXMgbm90IGJ1aWxkIGFzIG9mIHI2MCAobW9zdCByZWNlbnQgcmVsZWFzZSkKKyAgICAqIFtUSFJJRlQtMTM2NV0gLSBUdXBsZVByb3RvY29sI3dyaXRlQml0U2V0IHVuaW50ZW50aW9uYWxseSB3cml0ZXMgYSB2YXJpYWJsZSBsZW5ndGggYnl0ZSBhcnJheQorICAgICogW1RIUklGVC0xMzU5XSAtIC0tZ2VuLWNvYiBjcHA6Y29iX3N0eWxlIGRvZXMgbm90IGNvbXBpbGUgYW55bW9yZQorICAgICogW1RIUklGVC0xMzE5XSAtIE1pc21hdGNoIGJldHdlZW4gaG93IGEgdW5pb24gcmVhZHMgYW5kIHdyaXRlcyBhIGNvbnRhaW5lcgorICAgICogW1RIUklGVC0xMzA5XSAtIGxpYmZiMzAzLTAuNy4wLmphciBtaXNzaW5nIGluIG1hdmVuIHJlcG9zaXRvcnkKKyAgICAqIFtUSFJJRlQtMTIzOF0gLSBUaHJpZnQgSlMgY2xpZW50IGNhbm5vdCByZWFkIG1hcCBvZiBzdHJ1Y3R1cmVzCisgICAgKiBbVEhSSUZULTEyNTRdIC0gQ29kZSBjYW4ndCBiZSBjb21waWxlZCBhZ2FpbnN0IGEgcmVndWxhciBKUkU6IE9iamVjdC5jbG9uZSgpIG92ZXJyaWRlIGhhcyBhIGRpZmZlcmVudCByZXR1cm4gdHlwZQorICAgICogW1RIUklGVC0xMzY3XSAtIE1hYyBPU1ggYnVpbGQgZmFpbHMgd2l0aCAibm8gc3VjaCBmaWxlIHRvIGxvYWQgLS0gc3BlYy9yYWtlL3NwZWN0YXNrIgorICAgICogW1RIUklGVC0xMzU1XSAtIFJ1bm5pbmcgbWFrZSBpbiBsaWIvcmIgZG9lc24ndCBidWlsZCB0aGUgbmF0aXZlIGV4dGVuc2lvbnMKKyAgICAqIFtUSFJJRlQtMTM3MF0gLSBEZWJpYW4gcGFja2FnaW5nIHNob3VsZCBCdWlsZC1EZXBlbmQgb24gbGliZ2xpYjIuMC1kZXYKKyAgICAqIFtUSFJJRlQtMTM0Ml0gLSBDb21waWxhdGlvbiBwcm9ibGVtIG9uIFdpbmRvd3Mgb2YgZmFzdGJpbmFyeS5jCisgICAgKiBbVEhSSUZULTEzNDFdIC0gVFByb3RvY29sLmggZW5kaWFuIGRldGVjdGlvbiB3cm9uZyB3aXRoIGJvb3N0CisgICAgKiBbVEhSSUZULTE1ODNdIC0gY19nbGliIGxlYWtzIG1lbW9yeQorICAgICogW1RIUklGVC0xNTgyXSAtIEJhZCBpbmNsdWRlcyBvZiBuZXN0ZWQgdGhyaWZ0IGZpbGVzIGluIGNfZ2xpYgorICAgICogW1RIUklGVC0xNTc4XSAtIENfR0xpYiBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBjb21waWxlCisgICAgKiBbVEhSSUZULTEwMjddIC0gJ21ha2UgLWogMTYnIGZhaWxzIHdpdGggInVudGVybWluYXRlZCAjaWZkZWYiIGVycm9yCisgICAgKiBbVEhSSUZULTExMjFdIC0gSmF2YSBzZXJ2ZXIgcGVyZm9ybWFuY2UgcmVncmVzc2lvbiBpbiAwLjYKKyAgICAqIFtUSFJJRlQtODU3XSAtIHRlc3RzIHJ1biBieSAibWFrZSBpbnN0YWxsIiBmYWlsIGlmIGdlbmVyYXRvcnMgYXJlIGRpc2FibGVkCisgICAgKiBbVEhSSUZULTM4MF0gLSBVc2Ugc2V0dXB0b29scyBmb3IgcHl0aG9uIGJ1aWxkCisKKyMjIERlcGVuZGVuY3kgdXBncmFkZQorICAgICogW1RIUklGVC0xMjU3XSAtIHRocmlmdCdzIGRlcGVuZGVuY3kgc2NvcGUgb24gamF2YXguc2VydmxldDpzZXJ2bGV0LWFwaSBzaG91bGQgYmUgJ3Byb3ZpZGVkJworCisjIyBJbXByb3ZlbWVudAorICAgICogW1RIUklGVC0xNDQ1XSAtIG1pbm9yIEMrKyBnZW5lcmF0b3IgdmFyaWFibGUgY2xlYW51cAorICAgICogW1RIUklGVC0xNDM1XSAtIG1ha2UgVEV4Y2VwdGlvbi5NZXNzYWdlIHByb3BlcnR5IGNvbmZvcm1hbnQgdG8gdGhlIHVzdWFsIGV4cGVjdGF0aW9ucworICAgICogW1RIUklGVC0xNDMxXSAtIFJlbmFtZSAnc3lzJyBtb2R1bGUgdG8gJ3V0aWwnCisgICAgKiBbVEhSSUZULTEzOTZdIC0gRGVwaGkgZ2VuZXJhdG9yIGhhcyBkZXBlbmRhY3kgb24gYm9vc3QgMS40MiBsYXRlci4KKyAgICAqIFtUSFJJRlQtMTM5NV0gLSBQYXRjaCB0byBwcmV2ZW50IHdhcm5pbmdzIGZvciBpbnRlZ2VyIHR5cGVzIGluIHNvbWUgY2FzZXMKKyAgICAqIFtUSFJJRlQtMTI3NV0gLSAgdGhyaWZ0OiBhbHdheXMgcHJlZml4IG5hbWVzcGFjZXMgd2l0aCAiIDo6IgorICAgICogW1RIUklGVC0xMjc0XSAtICB0aHJpZnQ6IGZhaWwgY29tcGlsYXRpb24gaWYgYW4gdW5leHBlY3RlZCB0b2tlbiBpcworICAgICogW1RIUklGVC0xMjcxXSAtICB0aHJpZnQ6IGZpeCBtaXNzaW5nIG5hbWVzcGFjZSBpbiBnZW5lcmF0ZWQgbG9jYWwKKyAgICAqIFtUSFJJRlQtMTI3MF0gLSAgdGhyaWZ0OiBhZGQgLS1hbGxvdy1uZWcta2V5cyBhcmd1bWVudCB0byBhbGxvdworICAgICogW1RIUklGVC0xMzQ1XSAtIEFsbG93IGJ1aWxkaW5nIHdpdGhvdXQgdGVzdHMKKyAgICAqIFtUSFJJRlQtMTI4Nl0gLSBNb2Rlcm5pemUgdGhlIFRocmlmdCBSdWJ5IExpYnJhcnkgRGV2IEVudmlyb25tZW50CisgICAgKiBbVEhSSUZULTEyODRdIC0gIHRocmlmdDogZml4IHByb2Nlc3NvciBpbmhlcml0YW5jZQorICAgICogW1RIUklGVC0xMjgzXSAtICB0aHJpZnQ6IHdyYXAgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKCkgdG8gODAKKyAgICAqIFtUSFJJRlQtMTI4Ml0gLSBVcGdyYWRlIGh0dHBjbGllbnQgdG8gNC4xLjIgKGZyb20gNC4wLjEpCisgICAgKiBbVEhSSUZULTEyODFdIC0gIGFkZCBAZ2VuZXJhdGVkIHRvIHRoZSBkb2NibG9jaworICAgICogW1RIUklGVC0xMjgwXSAtICBUaHJpZnQ6IEltcHJvdmUgTW9uaXRvciBleGNlcHRpb24tZnJlZSBpbnRlcmZhY2VzCisgICAgKiBbVEhSSUZULTEyNzhdIC0gamF2YWRvYyB3YXJuaW5ncyAtIGNvbXBpbGF0aW9uCisgICAgKiBbVEhSSUZULTEyMjddIC0gRXJsYW5nIGltcGxlbWVudGF0aW9uIG9mIHRocmlmdCBKU09OIHByb3RvY29sCisgICAgKiBbVEhSSUZULTEyOTVdIC0gRHVwbGljYXRlIGluY2x1ZGUgaW4gVFNvY2tldC5jcHAKKyAgICAqIFtUSFJJRlQtMTI5NF0gLSAgdGhyaWZ0OiBmaXggbG9nIG1lc3NhZ2UgdHlwb3MgaW4gVFNpbXBsZVNlcnZlcgorICAgICogW1RIUklGVC0xMjkzXSAtICB0aHJpZnQ6IGltcHJvdmUgaGFuZGxpbmcgb2YgZXhjZXB0aW9ucyB0aHJvd24gYnkKKyAgICAqIFtUSFJJRlQtMTI5Ml0gLSAgdGhyaWZ0OiBzaWxlbmNlIGxvZyBzcGV3IGZyb20gVFRocmVhZGVkU2VydmVyCisgICAgKiBbVEhSSUZULTEyODhdIC0gIEFsbG93IHR5cGVkZWZlZCBleGNlcHRpb25zIGluIHRocm93cyBjbGF1c2VzCisgICAgKiBbVEhSSUZULTEyOTBdIC0gIHRocmlmdDogVE5vbmJsb2NraW5nU2VydmVyOiBjbGVhbiB1cCBzdGF0ZSBpbiB0aGUKKyAgICAqIFtUSFJJRlQtMTI4N10gLSAgdGhyaWZ0OiBzdGFydCByZWZhY3RvcmluZyBzb21lIG9mIHRoZSBDKysgcHJvY2Vzc29yCisgICAgKiBbVEhSSUZULTEyODldIC0gIHRocmlmdDogaW1wbGVtZW50IFROb25ibG9ja2luZ1NlcnZlcjo6c3RvcCgpCisgICAgKiBbVEhSSUZULTEzMDVdIC0gIHRocmlmdDogbWFrZSBUQ29ubmVjdGlvbiBhIHByaXZhdGUgaW5uZXIgY2xhc3Mgb2YKKyAgICAqIFtUSFJJRlQtMTMwNF0gLSAgVE5vbmJsb2NraW5nU2VydmVyOiBwYXNzIGluIHRoZSBjb25uZWN0aW9uIGNvbnRleHQgdG8KKyAgICAqIFtUSFJJRlQtMTMwMl0gLSAgdGhyaWZ0OiByYWlzZSBhbiBleGNlcHRpb24gaWYgc2VuZCgpIHRpbWVzIG91dCBpbgorICAgICogW1RIUklGVC0xMzAxXSAtICB0aHJpZnQ6IGNvbnNvbGlkYXRlIGNvbW1vbiBjb2RlIGluIFROb25ibG9ja2luZ1NlcnZlcgorICAgICogW1RIUklGVC0xMzc3XSAtIGFib3J0IFBIUCBkZXNlcmlhbGl6YXRpb24gb24gdW5rbm93biBmaWVsZCB0eXBlCisgICAgKiBbVEhSSUZULTEzNzldIC0gZml4IHVuaW5pdGlhbGl6ZWQgZW51bSB2YWx1ZXMgaW4gdGhyaWZ0IEMrKyBvYmplY3RzCisgICAgKiBbVEhSSUZULTEzNzZdIC0gTWFrZSBwb3J0IHNwZWNpZmljYXRpb24gb3B0aW9uIGluIHRocmlmdCByZW1vdGUKKyAgICAqIFtUSFJJRlQtMTM3NV0gLSBmaXhlZCBhIGhleCBjaGFyIGNvbnZlcnNpb24gYnVnIGluIFRKU09OUHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMTM3M10gLSBGaXggdXNlci1kZWZpbmVkIGV4Y2VwdGlvbiBnZW5lcmF0aW9uIGluIHRocmlmdCAocHl0aG9uKQorICAgICogW1RIUklGVC0xMzYxXSAtIE9wdGlvbmFsIHJlcGxhY2VtZW50IG9mIHB0aHJlYWQgYnkgYm9vc3Q6OnRocmVhZAorICAgICogW1RIUklGVC0xMzIwXSAtIENvbnNpc3RlbmN5IG9mIGNvbmZpZ3VyZSBnZW5lcmF0ZWQgY29uZmlnLmgKKyAgICAqIFtUSFJJRlQtMTMxN10gLSAgUmVtb3ZlIGNvcHkgY29uc3RydWN0aWJpbGl0eSBmcm9tCisgICAgKiBbVEhSSUZULTEzMTZdIC0gIHRocmlmdDogdXBkYXRlIHNlcnZlciBjbGFzc2VzIHRvIGFjY2VwdAorICAgICogW1RIUklGVC0xMzE1XSAtICB0aHJpZnQ6IGdlbmVyYXRlIHNlcnZlciBpbnRlcmZhY2UgZmFjdG9yeSBjbGFzc2VzCisgICAgKiBbVEhSSUZULTEzMTRdIC0gIHRocmlmdDogYWRkIFRQcm9jZXNzb3JGYWN0b3J5CisgICAgKiBbVEhSSUZULTEzMzVdIC0gIEFkZCBhY2NlcHQgdGltZW91dCB0byBUU2VydmVyU29ja2V0CisgICAgKiBbVEhSSUZULTEzMzRdIC0gIEFkZCBtb3JlIGluZm8gdG8gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTEzMzNdIC0gIE1ha2UgUldHdWFyZCBub3QgY29weWFibGUKKyAgICAqIFtUSFJJRlQtMTMzMl0gLSBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBjbGFzcyB1c2VzIGhhcmQgY29kZWQgdmFsdWUga2V5TWFuYWdlclR5cGU6IFN1blg1MDkKKyAgICAqIFtUSFJJRlQtMTI1MV0gLSBHZW5lcmF0ZWQgamF2YSBjb2RlIHNob3VsZCBpbmRpY2F0ZSB3aGljaCBmaWVsZHMgYXJlIHJlcXVpcmVkIGFuZCB3aGljaCBhcmUgb3B0aW9uYWwKKyAgICAqIFtUSFJJRlQtMTM4N10gLSBCdWlsZCBNU1ZDIGxpYnJhcmllcyB3aXRoIEJvb3N0IFRocmVhZHMgaW5zdGVhZCBvZiBQdGhyZWFkcworICAgICogW1RIUklGVC0xMzM5XSAtIEV4dGVuZCBUdXBsZSBQcm90b2NvbCB0byBUVW5pb25zCisgICAgKiBbVEhSSUZULTEwMzFdIC0gUGF0Y2ggdG8gY29tcGlsZSBUaHJpZnQgZm9yIHZjKysgOS4wIGFuZCAxMC4wCisgICAgKiBbVEhSSUZULTExMzBdIC0gQWRkIHRoZSBhYmlsaXR5IHRvIHNwZWNpZnkgc3ltYm9saWMgZGVmYXVsdCB2YWx1ZSBmb3Igb3B0aW9uYWwgYm9vbGVhbgorICAgICogW1RIUklGVC0xMTIzXSAtIFBhdGNoIHRvIGNvbXBpbGUgVGhyaWZ0IHNlcnZlciBhbmQgY2xpZW50IGZvciB2YysrIDkuMCBhbmQgMTAuMAorICAgICogW1RIUklGVC0zODZdIC0gTWFrZSBpdCBwb3NzaWJsZSB0byBidWlsZCB0aGUgUHl0aG9uIGxpYnJhcnkgd2l0aG91dCB0aGUgZXh0ZW5zaW9uCisKKyMjIE5ldyBGZWF0dXJlCisgICAgKiBbVEhSSUZULTE0MDFdIC0gSlNPTi1wcm90b2NvbCBmb3IgRGVscGhpIFhFIExpYnJhcmllcworICAgICogW1RIUklGVC0xMTY3XSAtIEphdmEgbm9uYmxvY2tpbmcgc2VydmVyIHdpdGggbW9yZSB0aGFuIG9uZSB0aHJlYWQgZm9yIHNlbGVjdCBhbmQgaGFuZGxpbmcgSU8KKyAgICAqIFtUSFJJRlQtMTM2Nl0gLSBEZWxwaGkgZ2VuZXJhdG9yLCBsaXJicmFyeSBhbmQgdW5pdCB0ZXN0LgorICAgICogW1RIUklGVC0xMzU0XSAtIEFkZCByYWtlIHRhc2sgdG8gYnVpbGQganVzdCB0aGUgZ2VtIGZpbGUKKyAgICAqIFtUSFJJRlQtNzY5XSAtIFBsdWdnYWJsZSBTZXJpYWxpemVycworCisjIyBTdWItdGFzaworICAgICogW1RIUklGVC0xNDE1XSAtIGRlbHBoaTogYWRkIHZlcnNpb24gSW5mbyB0byB0aGUgbGlicmFyeQorICAgICogW1RIUklGVC0xMzkxXSAtIEltcHJvdmVkIERlbHBoaSBYRSB0ZXN0IGNhc2VzCisKKworCitUaHJpZnQgMC43CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgQnVnCisgICAgKiBbVEhSSUZULTExNDBdIC0gRnJhbWVkIFRyYW5zcG9ydCBDbGllbnQgdXNpbmcgQyAoR2xpYikgTGlicmFyeSBoYW5ncyB3aGVuIGNvbm5lY3RpbmcgdG8gUnVieSBTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMTE1NF0gLSBIdHRwQ2xpZW50IGRvZXMgbm90IHNwZWNpZnkgdGhlIGNvbm5lY3Rpb24gY2xvc2UgcGFyYW1ldGVyCisgICAgKiBbVEhSSUZULTExNTNdIC0gSHR0cENsaWVudCBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBjb25uZWN0aW9uIGNsb3NlIHBhcmFtZXRlcgorICAgICogW1RIUklGVC0xMTQ5XSAtIE5vbmJsb2NraW5nIHNlcnZlciBmYWlscyB3aGVuIGNsaWVudCBjb25uZWN0aW9uIGlzIHJlc2V0CisgICAgKiBbVEhSSUZULTExNDZdIC0gQW5kcm9pZCBJbmNvbXBhdGliaWxpdHkgOiBpbiBBbmRyb2lkIDwgMi4zIGphdmEuaW8uSU9FeGNlcHRpb24gZG9lc24ndCBzdXBwb3J0IGZvciBUaHJvd2FibGUgcGFyYW1ldGVyIGluIGNvbnN0cnVjdG9yCisgICAgKiBbVEhSSUZULTExMzNdIC0gSmF2YSBhbmQgSmF2YVNjcmlwdCB0dXRvcmlhbCBpcyBicm9rZW4gc2luY2Ugd2UgaGF2ZSBKYXZhIG1hdmVuIGRlcGxveW1lbnQKKyAgICAqIFtUSFJJRlQtMTEzMl0gLSBEZXNlcmlhbGl6YXRpb24gZXJyb3IgaW4gVEFwcGxpY2F0aW9uRXhjZXB0aW9uIEMjCisgICAgKiBbVEhSSUZULTExMzFdIC0gQyMgSlNPTiBQcm90b2NvbCBpcyB1bmFibGUgdG8gZGVjb2RlIGVzY2FwZWQgY2hhcmFjdGVycyBpbiBzdHJpbmcKKyAgICAqIFtUSFJJRlQtMTIwOF0gLSBweXRob24gVENvbXBhY3RQcm90b2NvbC5weSB3cml0ZUJvb2wgYW5kIHJlYWRCb29sIG5vdCBmb2xsb3cgdGhlIGNvbXBhY3QtcHJvdG8tc3BlYy0yLnR4dCBzcGVjIGZvciBDT05UQUlORVJfV1JJVEUsIENPTlRBSU5FUl9SRUFECisgICAgKiBbVEhSSUZULTEyMDBdIC0gSlMgY29tcGlsZXIgZ2VuZXJhdGVzIGNvZGUgdGhhdCBjbG9iYmVycyBleGlzdGluZyBuYW1lc3BhY2VzCisgICAgKiBbVEhSSUZULTExODNdIC0gUHVyZS1ydWJ5IENvbXBhY3RQcm90b2NvbCByYWlzZXMgQXJndW1lbnRFcnJvciB3aGVuIGRlc2VyaWFsaXppbmcgdW5kZXIgUnVieSAxLjkKKyAgICAqIFtUSFJJRlQtMTE4Ml0gLSBOYXRpdmUgZGVzZXJpYWxpemVyIHNlZ2ZhdWx0cyBvbiBpbmNvcnJlY3QgbGlzdCBlbGVtZW50IHR5cGUKKyAgICAqIFtUSFJJRlQtMTE4MV0gLSBBUzMgY29tcGlsZXIgZ2VuZXJhdGVzIGluY29ycmVjdCBjb2RlIGZvciBzZXR0aW5nIGRlZmF1bHQgdmFsdWVzIGluIGNvbnN0cnVjdG9yCisgICAgKiBbVEhSSUZULTEyMzRdIC0gdGhyaWZ0IC0taGVscCBpcyBtaXNzaW5nIGRvYyBvbiBweTp1dGY4c3RyaW5ncworICAgICogW1RIUklGVC0xMTgwXSAtIEFTMyBjb21waWxlciBnZW5lcmF0ZXMgdW5jb21waWxhYmxlIGNvZGUgZm9yIGJpbmFyeSB0eXBlcy4KKyAgICAqIFtUSFJJRlQtMTE5NF0gLSBKYXZhIGxpYiBkb2VzIG5vdCBpbnN0YWxsIGFydGlmYWN0cyB0byBsb2NhbCBkaXIgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTExOTNdIC0gUG90ZW50aWFsIGluZmluaXRlIGxvb3AgaW4gbm9uYmxvY2tpbmdfc2VydmVyCisgICAgKiBbVEhSSUZULTExOTJdIC0gVHlwbzogVFByb3RvY29sLmggdGVzdHMgZm9yIEhBVkVfU1lTX1BBUkFNX0hfCisgICAgKiBbVEhSSUZULTExOTBdIC0gcmVhZEJ1ZmZlckJ5dGVzQWxsb2NhdGVkIGluIFROb25ibG9ja2luZ1NlcnZlci5qYXZhIHNob3VsZCBiZSBBdG9taWNMb25nIHRvIGZpeCBGRCBsZWFrYWdlIGFuZCBnZW5lcmFsIHNlcnZlciBtYWxmdW5jdGlvbgorICAgICogW1RIUklGVC0xMTg3XSAtIG5vbmJsb2NraW5nX3NlcnZlciBzaHV0ZG93biByYWNlIHVuZGVyIFJ1YnkgMS45CisgICAgKiBbVEhSSUZULTExNzhdIC0gSmF2YTogVEJhc2Ugc2lnbmF0dXJlIHNob3VsZCBiZSBUIGV4dGVuZHMgVEJhc2U8Pyw/PgorICAgICogW1RIUklGVC0xMTY0XSAtIFNlZ21lbnRhdGlvbiBmYXVsdCBvbiBOVUxMIHBvaW50ZXIgaW4gdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0CisgICAgKiBbVEhSSUZULTExNzFdIC0gUGVybCB3cml0ZS9yZWFkRG91YmxlIGFzc3VtZXMgbGl0dGxlLWVuZGlhbiBwbGF0Zm9ybQorICAgICogW1RIUklGVC0xMjIyXSAtIFVuaGFuZGxlZCBleGNlcHRpb24gZm9yIFRFdmh0dHBTZXJ2ZXIgcmVxdWVzdAorICAgICogW1RIUklGVC0xMjIwXSAtIFRQcm9jZXNzb3I6OnByb2Nlc3MgbmV2ZXIgcmV0dXJucyBmYWxzZQorICAgICogW1RIUklGVC0xMjg1XSAtIFN0YWJsZSAwLjcuMCBXaW5kb3dzIGNvbXBpbGVyIGV4ZSBhdmFpbGFibGUgb24gdGhlIHdlYnNpZGUgaXMgbm90IHRoZSBnb29kIG9uZQorICAgICogW1RIUklGVC0xMjE4XSAtIGNfZ2xpYiB1c2VzIHdyb25nIG5hbWUgaW4gcGtnLWNvbmZpZworICAgICogW1RIUklGVC0xMjE1XSAtIFVuZGVmaW5lZCBwcm9wZXJ0eSBUaGlyZnQgaW4gbGliL2pzL3RocmlmdC5qcworICAgICogW1RIUklGVC0xMjExXSAtIFdoZW4gdXNpbmcgVEh0dHBDbGllbnQsIG5vbiAyMDAgcmVzcG9uc2VzIGxlYXZlIHRoZSBjb25uZWN0aW9uIG9wZW4KKyAgICAqIFtUSFJJRlQtMTIyOF0gLSBUaGUgcGhwIGFjY2VsZXJhdG9yIG1vZHVsZSBjYWxscyBmbHVzaCBpbmNvcnJlY3RseQorICAgICogW1RIUklGVC0xMzA4XSAtIGxpYmZiMzAzLTAuNy4wLmphciBtaXNzaW5nIGluIG1hdmVuIHJlcG9zaXRvcnkKKyAgICAqIFtUSFJJRlQtMTI1NV0gLSBNaXNtYXRjaCBvZiBtZXRob2QgbmFtZSBiZXR3ZWVuIEphdmFNRSdzIGxpYiBhbmQgZ2VuZXJhdGVkIGNvZGUgKGNvbXBhcmVUby9jb21wYXJlT2JqZWN0cykKKyAgICAqIFtUSFJJRlQtMTI1M10gLSBDb2RlIGdlbmVyYXRlZCBmb3IgbWFwcyBpcyBub3QgY29tcGlsaW5nCisgICAgKiBbVEhSSUZULTEyNTJdIC0gU2VnZmF1bHQgaW4gUnVieSBkZXNlcmlhbGl6ZXIKKyAgICAqIFtUSFJJRlQtMTA5NF0gLSBidWcgaW4gVENvbXBhY3RQcm90byBweXRob24gcmVhZE1lc3NhZ2VFbmQgbWV0aG9kIGFuZCB1cGRhdGVkIHRlc3QgY2FzZXMKKyAgICAqIFtUSFJJRlQtMTA5M10gLSBzZXZlcmFsIGJ1Z3MgaW4gcHl0aG9uIFRDb21wYWN0UHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMTA5Ml0gLSBnZW5lcmF0ZWQgdmFsaWRhdGUoKSBtZXRob2QgaGFzIHdyb25nIGluZGVudGF0aW9uCisgICAgKiBbVEhSSUZULTEwMTFdIC0gRXJyb3IgZ2VuZXJhdGluZyBwYWNrYWdlIGltcG9ydHMgd2hlbiB1c2luZyBjbGFzc2VzIGZyb20gb3RoZXIgcGFja2FnZXMKKyAgICAqIFtUSFJJRlQtMTA1MF0gLSBEZWNsYXJpbmcgYW4gYXJndW1lbnQgbmFtZWQgIm1hbmFnZXIiIHRvIGEgc2VydmljZSBtZXRob2QgcHJvZHVjZXMgY29kZSB0aGF0IGZhaWxzIGNvbXBpbGUgZHVlIHRvIG5hbWUgY29uZmxpY3RzIHdpdGggcHJvdGVjdGVkIGl2YXJzIGluIFRBc3luY0NsaWVudAorICAgICogW1RIUklGVC0xMDc0XSAtIC5rZXlzdG9yZSBhbmQgLnRydXN0c3RvcmUgYXJlIG1pc3NpbmcgZnJvbSB0aGUgMC42LjAgZGlzdHJpYnV0aW9uCisgICAgKiBbVEhSSUZULTEwNjddIC0gVG9ucyBvZiBidWdzIGluIHBocCBpbXBsZW1lbnRhdGlvbgorICAgICogW1RIUklGVC0xMDY1XSAtIFVuZXhwZWN0ZWQgZXhjZXB0aW9ucyBub3QgcHJvcGVyIGhhbmRsZWQgb24gSlMKKyAgICAqIFtUSFJJRlQtMTA3Nl0gLSBFcmxhbmcgVGhyaWZ0IHNvY2tldCBzZXJ2ZXIgaGFzIGEgYnVnIHRoYXQgY2F1c2VzIGphdmEgdGhyaWZ0IGNsaWVudCBvZiBmcmFtZWQgYmluYXJ5IGNsaWVudCB0byB0aHJvdyAib3V0IG9mIHNlcXVlbmNlIiBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMTA1N10gLSBjYXN0cyBpbiBUQmluYXJ5UHJvdG9jb2wudGNjIGNhdXNpbmcgImRlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyIgd2FybmluZ3MgZnJvbSBnY2MKKyAgICAqIFtUSFJJRlQtMTA1NV0gLSBjc2hhcnAgVFNlcnZlclNvY2tldCBhbmQgVFNvY2tldCBkbyBub3QgZGlzYWJsZSBOYWdsZSB2aWEgU29ja2V0Lk5vRGVsYXkgPSB0cnVlIGxpa2UgY3BwIGFuZCBqYXZhIGRvCisgICAgKiBbVEhSSUZULTEwNTRdIC0gZXhwbGljaXQgY2FsbCB0byBQS0dfUFJPR19QS0dfQ09ORklHIGlzIG1pc3NpbmcgYW5kIGZpcnN0IHVzZSBvZiBQS0dfQ0hFQ0tfTU9EVUxFUyBtYXkgbm90IGhhcHBlbiwgY2F1c2VzIG1vbm8gZGV0ZWN0aW9uIHRvIGZhaWwKKyAgICAqIFtUSFJJRlQtMTExN10gLSBKYXZhU2NyaXB0IFVuaXQgVGVzdCBkb2VzIG5vdCB3b3JrIGFueW1vcmUgYmVjYXVzZSBsaWJ0aHJpZnQqLmphciB3aGVyZSBtb3ZlZCBieSBNYXZlbiBEZXBsb3ltZW50CisgICAgKiBbVEhSSUZULTExMTFdIC0gVGhlIEhUTUwgZ2VuZXJhdG9yIGRvZXMgbm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gc3RyaW5nIGFuZCBiaW5hcnkgdHlwZXMKKyAgICAqIFtUSFJJRlQtMTAzMl0gLSAibWFrZSBkaXN0IiBmYWlscyBkdWUgdG8gY19nbGliIHByb2JsZW0KKyAgICAqIFtUSFJJRlQtMTAzNl0gLSBBdXRvLWdlbmVyYXRlZCBDKysgY29kZSBmYWlscyB0byBjb21waWxlIHdpdGggIi1XZXJyb3IgLVdleHRyYSAtV2FsbCIgZysrIGNvbXBpbGVyIGZsYWdzCisgICAgKiBbVEhSSUZULTEwNDFdIC0gVERlc2VyaWFsaXplciBob2xkcyBvbnRvIGEgcmVmZXJlbmNlIG9mIHRoZSBhcnJheSBpdCByZWFkcyBhZnRlciBpdCBpcyBkb25lIGRlc2VyaWFsaXppbmcKKyAgICAqIFtUSFJJRlQtMTEwNl0gLSBDKysgY29kZSBUQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oICYgVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmggZG9udCBoYXZlIHZpcnR1YWwgZnVuY3Rpb25zIGJ1dCBubyB2aXJ0dWFsIGRlc3RydWN0b3IuIENhdXNlcyB3YXJuaW5ncyBvbiAtV2FsbAorICAgICogW1RIUklGVC0xMTA1XSAtIE9DYW1sIGdlbmVyYXRvciBkb2VzIG5vdCBwcmVmaXggbWV0aG9kcyBvZiBpbmNsdWRlZCBzdHJ1Y3RzIHdpdGggdGhlaXIgdHlwZQorICAgICogW1RIUklGVC0xMTA0XSAtIElOU1RBTExESVJTIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBjb25maWd1cmUgc2NyaXB0CisgICAgKiBbVEhSSUZULTExMDJdIC0gdHlwbyBpbiBjb25maWd1cmUuYWM6ICI9PSIgb3BlcmF0b3IgaW4gJ3Rlc3QnIChpbnN0ZWFkIG9mIic9IikKKyAgICAqIFtUSFJJRlQtMTEwMV0gLSBieXRlYnVmZmVyIGxlbmd0aCBjYWxjdWxhdGlvbiBpbiBUQmluYXJ5UHJvdG9jb2wgd3JpdGVCaW5hcnkKKyAgICAqIFtUSFJJRlQtMTA5OF0gLSBVbmRlZmluZWQgcHJvcGVydGllcyBpbiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5CisgICAgKiBbVEhSSUZULTEwODFdIC0gUEhQIHRlc3RzIGJyb2tlbiBhbmQgc29tZXdoYXQgaW5jb21wbGV0ZQorICAgICogW1RIUklGVC0xMDgwXSAtIGVybGFuZyB0ZXN0J3MgJ21ha2UnIGZhaWxzIG9uIE1hYyBPU1gKKyAgICAqIFtUSFJJRlQtMTA3OF0gLSBUaHJpZnRUZXN0LnRocmlmdCBnZW5lcmF0ZXMgaW52YWxpZCBQSFAgbGlicmFyeQorICAgICogW1RIUklGVC0xMTIwXSAtIHByb3RvLldyaXRlTGlzdEVuZCBiZWluZyBjYWxsZWQgaW4gdGhlIHdyb25nIHBsYWNlCisgICAgKiBbVEhSSUZULTExMTldIC0gVEpTT05Qcm90b2NvbCBmYWlscyB0byBVVEY4IGRlY29kZSBzdHJpbmdzCisgICAgKiBbVEhSSUZULTg2N10gLSBQSFAgYWNjZWxlcmF0b3IgbW9kdWxlJ3Mgb3V0cHV0IHRyYW5zcG9ydCBpcyBpbmNvbXBhdGlibGUgd2l0aCBURnJhbWVkVHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTgyNl0gLSBQSFAgVFNvY2tldCBXcml0ZSBUaW1lb3V0CisgICAgKiBbVEhSSUZULTgzNV0gLSBCYWQgQVMzIHN5bnRheCBpbiBjb25zdHJ1Y3RvcnMgdGhhdCBzZXQgZGVmYXVsdCB2YWx1ZXMKKyAgICAqIFtUSFJJRlQtNzg4XSAtIHRocmlmdF9wcm90b2NvbC5zbzogbXVsdGlnZXQvbXVsdGlnZXRfc2xpY2UgZG9lcyBub3QgaGFuZGxlIG1vcmUgdGhhbiAxNyBrZXlzIGNvcnJlY3RseQorICAgICogW1RIUklGVC0xMjVdIC0gT0NhbWwgbGlicmFyaWVzIGRvbid0IGNvbXBpbGUgd2l0aCAzMi1iaXQgb2NhbWwKKyAgICAqIFtUSFJJRlQtMzQyXSAtIFBIUDogY2FuJ3QgaGF2ZSBzZXRzIG9mIGNvbXBsZXggdHlwZXMKKyAgICAqIFtUSFJJRlQtNzMxXSAtIGNvbmZpZ3VyZSBkb2Vzbid0IGNoZWNrIGZvciBhbnQgPj0gMS43CisgICAgKiBbVEhSSUZULTY5MF0gLSBVcGRhdGUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGNvZGVzCisgICAgKiBbVEhSSUZULTYzOF0gLSBCdWZmZXJlZFRyYW5zcG9ydCArIEMgZXh0ZW5zaW9ucyBibG9jayB1bnRpbCByZWN2IHRpbWVvdXQgaXMgcmVhY2hlZCBvbiBsYXN0IGZyZWFkIGNhbGwKKworIyMgRGVwZW5kZW5jeSB1cGdyYWRlCisgICAgKiBbVEhSSUZULTExNzddIC0gVXBkYXRlIHRocmlmdCB0byByZWZsZWN0IGNoYW5nZXMgaW4gR28ncyBuZXR3b3JraW5nIGxpYnJhcmllcworCisjIyBJbXByb3ZlbWVudAorICAgICogW1RIUklGVC0xMTU1XSAtIFJlbW92ZSBsb2c0aiBkZXBlbmRlbmN5IGZyb20gamF2YSBjbGllbnQKKyAgICAqIFtUSFJJRlQtMTE1MV0gLSBQcm9kdWNlIG1vcmUgaW5mb3JtYXRpdmUgcnVudGltZSBlcnJvciBpbiBjYXNlIG9mIHNjaGVtYSBhbmQgZGF0YSBtaXNtYXRjaCBkdXJpbmcgc2VyaWFsaXphdGlvbgorICAgICogW1RIUklGVC0xMjA3XSAtIFN1cHBvcnQgREVTVERJUiBvbiAibWFrZSBpbnN0YWxsIiBvZiBydWJ5IGxpYnMKKyAgICAqIFtUSFJJRlQtMTE5OV0gLSBVbmlvbiBzdHJ1Y3RzIHNob3VsZCBoYXZlIGdlbmVyYXRlZCBtZXRob2RzIHRvIHRlc3Qgd2hldGhlciBhIHNwZWNpZmljIGZpZWxkIGlzIGN1cnJlbnRseSBzZXQKKyAgICAqIFtUSFJJRlQtMTIzM10gLSBSZW1vdmUgdW51c2VkIGluY2x1ZGUgaW4gZ2VuZXJhdGVkIEMrKyBjb2RlCisgICAgKiBbVEhSSUZULTExODldIC0gUnVieSBkZXNlcmlhbGl6ZXIgc3BlZWQgaW1wcm92ZW1lbnRzCisgICAgKiBbVEhSSUZULTExNzBdIC0gVGhyaWZ0IEdlbmVyYXRlZCBDb2RlIGFuZCBKYXZhIDUKKyAgICAqIFtUSFJJRlQtMTE3NF0gLSBQdWJsaXNoIGFzMyBjbGllbnQgaW1wbGVtZW50YXRpb24gdmlhIE1hdmVuIGZvciB1c2UgYnkgZmxleC1tb2pvcyB1c2VycworICAgICogW1RIUklGVC0xMjI1XSAtIFRDb21wYWN0UHJvdG9jb2wgZm9yIFBIUAorICAgICogW1RIUklGVC0xMjIxXSAtIFJlbW92ZSBTaW1wbGVDYWxsYmFjay5oCisgICAgKiBbVEhSSUZULTEyMTddIC0gVXNlIGV2dXRpbF9zb2NrZXRwYWlyIGluc3RlYWQgb2YgcGlwZSAoV2luZG93cyBwb3J0KQorICAgICogW1RIUklGVC0xMjE2XSAtIGJ1aWxkIEphdmEgTGlicmFyeSBiZWhpbmQgYSBwcm94eQorICAgICogW1RIUklGVC0xMjMxXSAtIFJlbW92ZSBib2d1cyBpbmNsdWRlCisgICAgKiBbVEhSSUZULTEyMTNdIC0gTWVtYnVmZmVyIHNob3VsZCBwcm92aWRlIGEgd2F5IHRvIGdldCBiYWNrIHRoZSBidWZmZXIKKyAgICAqIFtUSFJJRlQtMTIzN10gLSBKYXZhIGZiMzAzIG1pc3Npbmcgc29tZSBtZXRob2RzCisgICAgKiBbVEhSSUZULTEwNjNdIC0gRml4IEVybGFuZyBUdXRvcmlhbCBGaWxlcworICAgICogW1RIUklGVC0xMDUzXSAtIE1ha2UgcmVtb3RlIGNsaWVudCdzIElQIGFkZHJlc3MgYXZhaWxhYmxlIGZvciBhbGwgc29ja2V0IHJlbGF0ZWQgdHJhbnNwb3J0cworICAgICogW1RIUklGVC0xMTA5XSAtIERlcGxveSBmYjMwMyBhbG9uZyBzaWRlIGxpYnRocmlmdCB0byBtYXZlbiByZXBvCisgICAgKiBbVEhSSUZULTExMDddIC0gaW1wcm92ZW1lbnQgZm9yIGNvbXBpbGVyLWdlbmVyYXRlZCBweXRob24gZm9yICdOb25lJyBvYmplY3QgY29tcGFyaXNvbnMKKyAgICAqIFtUSFJJRlQtMTA2OV0gLSBBZGQgY29tbWFuZCBsaW5lIG9wdGlvbiB0byBwcmV2ZW50IHRocmlmdCBmcm9tIGluc2VydGluZyBnZW4tKiBkaXJlY3RvcmllcworICAgICogW1RIUklGVC0xMDQ5XSAtIEFsbG93IGZvciBUU2VydmVyU29ja2V0IHB5dGhvbiBsaWJyYXJ5IHRvIGJpbmQgdG8gYSBzcGVjaWZpYyBob3N0CisgICAgKiBbVEhSSUZULTExMjZdIC0gRXh0ZW5kaW5nIHN0cnVjdF9pbmZvIGZvciBlcmxhbmcgYmluZGluZ3MKKyAgICAqIFtUSFJJRlQtMTEwMF0gLSBweXRob24gVFNTTFNvY2tldCBpbXByb3ZlbWVudHMsIGluY2x1ZGluZyBjZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uCisgICAgKiBbVEhSSUZULTk5NF0gLSBEb24ndCB0cnkgdG8gaW52b2tlIHBocGl6ZSBpZiB3ZSBkb24ndCBoYXZlIGl0CisgICAgKiBbVEhSSUZULTk5M10gLSBTb21lIGltcHJvdmVtZW50cyBpbiBDKysgc3R1YnMgZm9yIG9uZXdheSBvcGVyYXRpb25zCisgICAgKiBbVEhSSUZULTk5N10gLSBVc2luZyB2YWx1ZU9mIGZvciBiYXNlIHR5cGVzIGluIGdldEZpZWxkVmFsdWUKKyAgICAqIFtUSFJJRlQtNDE4XSAtIERvbid0IGRvIHJ1bnRpbWUgc29ydGluZyBvZiBzdHJ1Y3QgZmllbGRzCisgICAgKiBbVEhSSUZULTE1MV0gLSBUU1NMU2VydmVyU29ja2V0IGFuZCBUU1NMU29ja2V0IGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTI3XSAtIEdlbmVyYXRlZCBlcmxhbmcgdHlwZXMgZG9uJ3QgY29udGFpbiBkZWZhdWx0IHZhbHVlcyBmb3IgcmVjb3JkcworICAgICogW1RIUklGVC0xMTNdIC0gdG8tc3RyaW5nIG1ldGhvZHMgc2hvdWxkIG9taXQgb3B0aW9uYWwgbnVsbCBmaWVsZHMgZnJvbSBvdXRwdXQKKyAgICAqIFtUSFJJRlQtMzYzXSAtIE1hdmVuIERlcGxveQorICAgICogW1RIUklGVC00NDddIC0gTWFrZSBhbiBhYnN0cmFjdCBiYXNlIENsaWVudCBjbGFzcyBzbyB3ZSBjYW4gZ2VuZXJhdGUgbGVzcyBjb2RlCisgICAgKiBbVEhSSUZULTYyN10gLSBzaG91bGQgYysrIGhhdmUgc2V0dGVycyBmb3Igb3B0aW9uYWwgZmllbGRzPworCisjIyBOZXcgRmVhdHVyZQorICAgICogW1RIUklGVC0xMjM2XSAtIEVybGFuZyBSZWNvbm5lY3RpbmcgVGhyaWZ0IENsaWVudAorICAgICogW1RIUklGVC0xMDIxXSAtIEZyYW1lZCB0cmFuc3BvcnQgc3VwcG9ydCBmb3IgT0NhbWwKKyAgICAqIFtUSFJJRlQtMTA2OF0gLSBQeXRob24gU1NMIFNvY2tldCBTdXBwb3J0CisgICAgKiBbVEhSSUZULTExMDNdIC0gVFpsaWJUcmFuc3BvcnQgZm9yIHB5dGhvbiwgYSB6bGliIGNvbXByZXNzZWQgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTEwODNdIC0gUHJlZm9ya2luZyBweXRob24gcHJvY2VzcyBwb29sIHNlcnZlcgorICAgICogW1RIUklGVC05OTldIC0gQWRkIFRGb3JraW5nU2VydmVyCisKKyMjIFN1Yi10YXNrCisgICAgKiBbVEhSSUZULTExNTJdIC0gQXR0cmlidXRlcyBmcm9tIHByaXZhdGUgdG8gcHJvdGVjdGVkCisgICAgKiBbVEhSSUZULTEwMzhdIC0gR2VuZXJhdGVkIEphdmEgY29kZSBmb3Igc3RydWN0dXJlcyBjb250YWluaW5nIGJpbmFyeSBmaWVsZHMgKG9yIGNvbGxlY3Rpb25zIHRoZXJlb2YpIGFyZSBub3Qgc2VyaWFsaXphYmxlIChpbiB0aGUgSmF2YSBzZW5zZSkgZXZlbiB0aG91Z2ggdGhleSBpbXBsZW1lbnQgamF2YS5pby5TZXJpYWxpemFibGUKKworIyMgVGFzaworICAgICogW1RIUklGVC04OTJdIC0gUmVmYWN0b3IgZXJsYW5nIGJ1aWxkIHN5c3RlbSB3aXRoIHJlYmFyCisKKyMjIFdpc2gKKyAgICAqIFtUSFJJRlQtNjI1XSAtIEFkZCBzdXBwb3J0IGZvciAnR28nCisKKworCitUaHJpZnQgMC42LjEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBCdWcKKyAgICAqIFtUSFJJRlQtMTEzM10gLSBKYXZhIGFuZCBKYXZhU2NyaXB0IHR1dG9yaWFsIGlzIGJyb2tlbiBzaW5jZSB3ZSBoYXZlIEphdmEgbWF2ZW4gZGVwbG95bWVudAorICAgICogW1RIUklGVC0xMTMxXSAtIEMjIEpTT04gUHJvdG9jb2wgaXMgdW5hYmxlIHRvIGRlY29kZSBlc2NhcGVkIGNoYXJhY3RlcnMgaW4gc3RyaW5nCisgICAgKiBbVEhSSUZULTEwNzRdIC0gLmtleXN0b3JlIGFuZCAudHJ1c3RzdG9yZSBhcmUgbWlzc2luZyBmcm9tIHRoZSAwLjYuMCBkaXN0cmlidXRpb24KKworIyMgSW1wcm92ZW1lbnQKKyAgICAqIFtUSFJJRlQtMTEwOV0gLSBEZXBsb3kgZmIzMDMgYWxvbmcgc2lkZSBsaWJ0aHJpZnQgdG8gbWF2ZW4gcmVwbworICAgICogW1RIUklGVC0zNjNdIC0gTWF2ZW4gRGVwbG95CisKKyMjIFF1ZXN0aW9uCisgICAgKiBbVEhSSUZULTEyMDZdIC0gZGlkIHRoZSBUSFJJRlQgMC42LjEgbWVyZ2UgVEhSSUZULTU2MyA/CisKKyMjIFN1Yi10YXNrCisgICAgKiBbVEhSSUZULTExNjNdIC0gSG93IGNhbiBpIHVzZSBtdWx0aSBzZXJ2aWNlIGluIG9uZSBwcm9ncmFtPworCisjIyBUYXNrCisgICAgKiBbVEhSSUZULTExMTJdIC0gQXBwbHkgVEhSSUZULTM2MyB0byAwLjYgYnJhbmNoCisgICAgKiBbVEhSSUZULTExMTNdIC0gQXBwbHkgVEhSSUZULTEwNzQgdG8gMC42IGJyYW5jaAorCisKKworVGhyaWZ0IDAuNgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIEJ1ZworICAgICogW1RIUklGVC0xMDIwXSAtIE9DYW1sIGNvbXBpbGVyIGdlbmVyYXRlcyBpbnZhbGlkIE9DYW1sCisgICAgKiBbVEhSSUZULTEwMTVdIC0gVFVuaW9uIGRvZXMgbm90IGhhbmRsZSBCeXRlQnVmZmVyIGluIHRvU3RyaW5nCisgICAgKiBbVEhSSUZULTEwMTNdIC0gZ2VuZXJhdGVkIGphdmEgY29kZSBtYXkgaGF2ZSBuYW1lIGNsYXNoZXMgd2l0aCB0aHJpZnQgbGlicmFyeQorICAgICogW1RIUklGVC0xMDA5XSAtIFRVbmlvbiBkb2VzIG5vdCBjb3JyZWN0bHkgZGVlcCBjb3B5IGEgQnl0ZUJ1ZmZlcgorICAgICogW1RIUklGVC0xMDMyXSAtICJtYWtlIGRpc3QiIGZhaWxzIGR1ZSB0byBjX2dsaWIgcHJvYmxlbQorICAgICogW1RIUklGVC04NjhdIC0gUmVmZXJlbmNpbmcgY29uc3RhbnQgdmFsdWVzIGRvZXNuJ3Qgd29yayB3aXRoIHdpdGggdHlwZWRlZiB0eXBlcworICAgICogW1RIUklGVC05NzFdIC0gamF2YSBtb2R1bGUgY2FuJ3QgYmUgY29tcGlsZWQgd2l0aG91dCBpdnkgYW5kIG5ldHdvcmsgY29ubmVjdGlvbgorICAgICogW1RIUklGVC05NzBdIC0gVW5kZXIgaGVhdnkgbG9hZCwgVEh0dHBDbGllbnQgbWF5IGZhaWwgd2l0aCAidG9vIG1hbnkgb3BlbiBmaWxlcyIKKyAgICAqIFtUSFJJRlQtOTY5XSAtIEphdmEgVHV0b3JpYWwgYnJva2VuLCBtb3ZlIENhbGN1bGF0b3JIYW5kbGVyIHRvIGEgc2VwYXJhdGUgZmlsZQorICAgICogW1RIUklGVC04MDddIC0gSmF2YVNjcmlwdDogSW5pdGlhbGl6YXRpb24gb2YgQmFzZSBUeXBlcyB3aXRoIDAgaW5zdGVhZCBvZiBudWxsCisgICAgKiBbVEhSSUZULTk1NV0gLSBUaHJpZnQgY29tcGlsZXIgZm9yIFdpbmRvd3MgdXNlcyBsb3dlcmNhc2UgbmFtZXMgYW5kIGRpcmVjdG9yaWVzIHdoaWNoIGlzIGluY29uc2lzdGVudCB3aXRoIGNvbXBpbGluZyBvbiBvdGhlciBwbGF0Zm9ybXMKKyAgICAqIFtUSFJJRlQtOTkyXSAtIE5hbWluZyBjb252ZW50aW9uIGluIEMjIGNvbnN0cnVjdG9yIGlzIG5vdCBjb25zaXN0ZW50IHdpdGggb3RoZXIgZmllbGRzIGNhdXNlcyBjb21waWxlIGVycm9ycworICAgICogW1RIUklGVC0xMDA4XSAtIGJ5dGVbXSBhY2Nlc3NvcnMgdGhyb3cgTlBFIG9uIHVuc2V0IGZpZWxkCisgICAgKiBbVEhSSUZULTEwMDZdIC0gSW1wb3NzaWJsZSB0byBjb3JyZWN0bHkgcXVhbGlmeSBhbiBlbnVtIGNvbnN0YW50IGluIGFuIGV4dGVybmFsIHRocmlmdCBmaWxlCisgICAgKiBbVEhSSUZULTk1MF0gLSBIYXNrZWxsIGJpbmRpbmdzIHRyZWF0ICdieXRlJyBhcyB1bnNpZ25lZCA4LWJpdCBpbnQgKERhdGEuV29yZC5Xb3JkOCksIGphdmEvY3BwIGFzIHNpZ25lZCAoYnl0ZS9pbnQ4X3QpLgorICAgICogW1RIUklGVC05NzVdIC0gbGliL2NfZ2xpYi9SRUFETUUgaXMgbWlzc2luZyA9PiBicmVha3MgbWFrZSBkaXN0CisgICAgKiBbVEhSSUZULTk0NF0gLSBTdXBwb3J0IGFsbCB2ZXJzaW9uLTRzIG9mIGJhc2UKKyAgICAqIFtUSFJJRlQtOTM5XSAtIG9wdGlvbmFsIGJpbmFyeSBmaWVsZHMgdGhyb3cgTlBFIG9uIGRlZmF1bHQgYnl0ZVtdIGdldHRlcnMKKyAgICAqIFtUSFJJRlQtOTM1XSAtIFBIUCBFeHRlbnNpb24gYWJvcnRzIHRoZSBidWlsZCBpZiBwaHAtY29uZmlnIGlzIG5vdCBpbnN0YWxsZWQKKyAgICAqIFtUSFJJRlQtOTMzXSAtIEhhc2tlbGwncyBUaHJpZnQuY2FiYWwgaGFzIHdhcm5pbmdzCisgICAgKiBbVEhSSUZULTkzMl0gLSBIYXNrZWxsIHRlc3RzIG5lZWQgdG8gYmUgcnVuIHRocm91Z2ggJ21ha2UgY2hlY2snIChhbmQgcHJvYmFibHkgJ2NhYmFsIGNoZWNrJykgdG9vCisgICAgKiBbVEhSSUZULTkwNF0gLSBDIyBUU29ja2V0IHNob3VsZCBkaXNhYmxlIG5hZ2xlIGFuZCBsaW5nZXIKKyAgICAqIFtUSFJJRlQtOTQxXSAtIE1ha2UgUEhQIEMgRXh0ZW5zaW9uIHVzZSB0aGUgZGVmaW5lZCBQcm90b2NvbCB3cml0ZU1lc3NhZ2VCZWdpbiBmdW5jdGlvbgorICAgICogW1RIUklGVC05NDBdIC0gJ21ha2UgY2hlY2snIGZhaWxzIGlmIGJvb3N0IGlzIG5vdCBpbiB0aGUgc3RkIGluY2x1ZGUgYW5kIGxpbmsgcGF0aHMKKyAgICAqIFtUSFJJRlQtOTI0XSAtIEZpeCBnZW5lcmF0ZWQgcGhwIHN0cnVjdHVyZSBjb25zdGFudHMKKyAgICAqIFtUSFJJRlQtOTc5XSAtIHJ1YnkgYmluZGluZ3MgdXNlZCB0byB3b3JrIG9uIGpydWJ5CisgICAgKiBbVEhSSUZULTk3N10gLSBIZXggQ29udmVyc2lvbiBCdWcgaW4gQysrIFRKU09OUHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMzQ3XSAtIFBIUCBUU29ja2V0IFRpbWVvdXQgSXNzdWVzCisgICAgKiBbVEhSSUZULTUxN10gLSBURXhjZXB0aW9ucyB0aHJvd24gYnkgc2VydmVyIHJlc3VsdCBpbiBjcnlwdGljIGVycm9yIG1lc3NhZ2Ugb24gY2xpZW50IC0gVHJpZWQgdG8gcmVhZCA0IGJ5dGVzLCBidXQgb25seSBnb3QgMCBieXRlcworCisjIyBJbXByb3ZlbWVudAorICAgICogW1RIUklGVC0xMDI0XSAtIEFkZCBQeXRob24gVHdpc3RlZCBleGFtcGxlIHRvIHRoZSBUdXRvcmlhbAorICAgICogW1RIUklGVC05NThdIC0gQ2hhbmdlIGFjY2Vzc21vZGlmZXIgb24gdHJhbnNfIGZpZWxkIGluIHRoZSBGcmFtZUJ1ZmZlciBjbGFzcyB0byBwdWJsaWMuCisgICAgKiBbVEhSSUZULTk1N10gLSBUSHNIYVNlcnZlcjogQ2hhbmdlIGFjY2VzcyBtb2RpZmllciBvZiB0aGUgaW52b2tlciBmaWVsZC4KKyAgICAqIFtUSFJJRlQtMTAwMl0gLSBDb2RlU3R5bGU6IHRfY19nbGliX2dlbmVyYXRvci5jYworICAgICogW1RIUklGVC0xMDA1XSAtIEdpdmUgdW5pb25zIGJ5dGVbXSBzaWduYXR1cmUgbWV0aG9kcyB0byBnbyBhbG9uZyB3aXRoIHRoZWlyIEJ5dGVCdWZmZXIgY291bnRlcnBhcnRzCisgICAgKiBbVEhSSUZULTk1MV0gLSBBZGQgYSBuZXcgaXNTZXJ2aW5nKCkgbWV0aG9kIHRvIFRTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtOTQzXSAtIFNpbGx5IHJlYWRtZSB0eXBvIGZpeC4KKyAgICAqIFtUSFJJRlQtOTYxXSAtIEphdmFTY3JpcHQgVGVzdFN1aXRlIHVzaW5nIGFudC9pdnkgYW5kIEphdmEncyBTZXJ2ZXJUZXN0QmFzZSBIYW5kbGVyCisgICAgKiBbVEhSSUZULTk2MF0gLSBhZGQgVGVzdFNlcnZlciwgVGVzdE5vbmJsb2NraW5nU2VydmVyIGFuZCBUZXN0Q2xpZW50IGFnYWluCisgICAgKiBbVEhSSUZULTk0OV0gLSBNb2RpZnkgdGhlIFRFbnVtIGludGVyZmFjZSBzbyBpdCBkZWZpbmVzIGEgbWV0aG9kIHNpbWlsYXIgdG8gZmluZEJ5VmFsdWUKKyAgICAqIFtUSFJJRlQtOTQ2XSAtIEF1Z21lbnQgRmllbGRWYWx1ZU1ldGFEYXRhIHNvIGl0IGRpZmZlcmVudGlhdGVzICdzdHJpbmcnIGFuZCAnYmluYXJ5JyBmaWVsZHMuCisgICAgKiBbVEhSSUZULTkwM10gLSBjdXN0b20gVGhyZWFkRmFjdG9yeSBpbiBUSHNIYVNlcnZlcgorICAgICogW1RIUklGVC05MTNdIC0gVGVzdCBDYXNlIGZvciBVcmwgZW5jb2RlZCBzdHJpbmdzICsgc2ltcGxlIGVuaGFuY2VtZW50IHRvIGxpYi9qcy90ZXN0L1J1blRlc3RTZXJ2ZXIuc2gKKyAgICAqIFtUSFJJRlQtOTI2XSAtIE1pc2NlbGxhbmVvdXMgQysrIGltcHJvdmVtZW50cworICAgICogW1RIUklGVC05MjldIC0gSW1wcm92ZW1lbnRzIHRvIHRoZSBDKysgdGVzdCBzdWl0ZQorICAgICogW1RIUklGVC04OTNdIC0gYWRkIEphdmFTY3JpcHQgdG8gdGhlIHR1dG9yaWFsIGV4YW1wbGVzCisgICAgKiBbVEhSSUZULTEwMDNdIC0gUG9saXNoaW5nIGNfZ2xpYiBjb2RlCisgICAgKiBbVEhSSUZULTcxXSAtIERlYmlhbiBwYWNrYWdpbmcgZm9yIHRocmlmdAorCisjIyBOZXcgRmVhdHVyZQorICAgICogW1RIUklGVC0xMDMzXSAtIE5vZGUuanMgbGFuZ3VhZ2UgdGFyZ2V0CisgICAgKiBbVEhSSUZULTk0N10gLSBQcm92aWRlIGEgaGVscGVyIG1ldGhvZCB0byBkZXRlcm1pbmUgdGhlIFRQcm90b2NvbCB1c2VkIHRvIHNlcmlhbGl6ZSBzb21lIGRhdGEuCisgICAgKiBbVEhSSUZULTkyOF0gLSBNYWtlIG1vcmUgc3RhdGlzdGljcyBhdmFpbGFibGUgaW4gQysrIHNlcnZlcnMKKyAgICAqIFtUSFJJRlQtOTIyXSAtIFRlbXBsYXRpemVkIFtkZV1zZXJpYWxpemF0aW9uIGNvZGUgZm9yIEMrKworICAgICogW1RIUklGVC05MjNdIC0gRXZlbnQtZHJpdmVuIGNsaWVudCBhbmQgc2VydmVyIHN1cHBvcnQgZm9yIEMrKworICAgICogW1RIUklGVC05MjVdIC0gUHJvdmlkZSBuYW1lPC0+dmFsdWUgbWFwIGZvciBlbnVtcyBpbiBDKysKKyAgICAqIFtUSFJJRlQtOTI3XSAtIEFkZCBvcHRpb24gdG8gbW9kaWZ5IHRoZSBQSFAgaW5jbHVkZSBwYXRoCisgICAgKiBbVEhSSUZULTM3N10gLSBURmlsZVRyYW5zcG9ydCBwb3J0IGluIEphdmEKKyAgICAqIFtUSFJJRlQtMTA2XSAtIFRTU0xTZXJ2ZXJTb2NrZXQKKyAgICAqIFtUSFJJRlQtNTgyXSAtIEMgaW1wbGVtZW50YXRpb24gb2YgVGhyaWZ0CisgICAgKiBbVEhSSUZULTc0NV0gLSBNYWtlIGl0IGVhc2llciB0byBpbnN0YW50aWF0ZSBzZXJ2ZXJzCisKKyMjIFN1Yi10YXNrCisgICAgKiBbVEhSSUZULTEwMzhdIC0gR2VuZXJhdGVkIEphdmEgY29kZSBmb3Igc3RydWN0dXJlcyBjb250YWluaW5nIGJpbmFyeSBmaWVsZHMgKG9yIGNvbGxlY3Rpb25zIHRoZXJlb2YpIGFyZSBub3Qgc2VyaWFsaXphYmxlIChpbiB0aGUgSmF2YSBzZW5zZSkgZXZlbiB0aG91Z2ggdGhleSBpbXBsZW1lbnQgamF2YS5pby5TZXJpYWxpemFibGUKKworIyMgVGFzaworICAgICogW1RIUklGVC04NjJdIC0gQXN5bmMgY2xpZW50IGlzc3VlcyAvIGltcHJvdmVtZW50cworCisjIyBUZXN0CisgICAgKiBbVEhSSUZULTU4MV0gLSBBZGQgYSB0ZXN0c3VpdGUgZm9yIHR4VGhyaWZ0IChUd2lzdGVkKQorCisKKworVGhyaWZ0IDAuNS4wIC0gSW5jdWJhdGluZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFRIUklGVC01MDUgICBCdWlsZCAgICAgICAgICAgICAgICBNYWtlIGNvbmZpZ3VyZSBnaXZlIGEgc3VtbWFyeSBvZiB0aGUgZW5hYmxlZCBjb21wb25lbnRzIChEYXZpZCBSZWlzcykKIFRIUklGVC01MDYgICBCdWlsZCAgICAgICAgICAgICAgICBBbGxvdyBUaHJpZnQgdG8gYmUgYnVpbHQgd2l0aG91dCB0aGUgQysrIGxpYnJhcnkgKERhdmlkIFJlaXNzKQogVEhSSUZULTg0NCAgIEJ1aWxkICAgICAgICAgICAgICAgIEJ1aWxkIFJlcXVpcmVtZW50cyBzdGF0ZSBhdXRvY29uZiAyLjU5KyBpcyByZXF1aXJlZCwgYnV0IDIuNjArIGlzIG5lZWRlZCAoSGFybGFuIExpZWJlcm1hbi1CZXJnKQpAQCAtMjgzLDggKzI4MzUsOCBAQAogVEhSSUZULTQ1NiAgIFRlc3QgU3VpdGUgICAgICAgICAgIEJhZCBJUCBhZGRyZXNzIHN0cmluZyBpbiB0ZXN0L2NwcC9zcmMvbWFpbi5jcHAgKFJ1c2ggTWFuYmVydCkKIAogCi1WZXJzaW9uIDAuNC4wCi0KK1RocmlmdCAwLjQuMCAtIEluY3ViYXRpbmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBUSFJJRlQtNjUwICAgQnVpbGQgICAgICAgIE1ha2UgQ2hlY2sgZmFpbHMgb24gQ2VudG9zL09TWCB3aXRoIDAuMi4wIHRhcmJhbGwgKEFudGhvbnkgTW9saW5hcm8pCiBUSFJJRlQtNzcwICAgQnVpbGQgICAgICAgIEdldCAnbWFrZSBkaXN0JyB0byB3b3JrIHdpdGhvdXQgZmlyc3QgY29tcGlsaW5nIHNvdXJjZSBjb2RlIChBbnRob255IE1vbGluYXJvKQogVEhSSUZULTE2MCAgIEMjICAgICAgICAgICBDcmVhdGVkIFRIdHRwVHJhbnNwb3J0IGZvciB0aGUgQyMgbGlicmFyeSBiYXNlZCBvbiBXZWJIdHRwUmVxdWVzdCAoTWljaGFlbCBHcmVlbmUpCkBAIC0zMzIsOCArMjg4NCw4IEBACiBUSFJJRlQtNDU5ICAgUnVieSAgICAgICAgIFJ1YnkgaW5zdGFsbGF0aW9uIGFsd2F5cyB0cmllcyB0byB3cml0ZSB0byAvTGlicmFyeS9SdWJ5L3NpdGUgKE1hdHRoaWV1IEltYmVydCkKIAogCi1WZXJzaW9uIDAuMS4wIFJDMSAvIFVucmVsZWFzZWQKLQorVGhyaWZ0IDAuMS4wIC0gSW5jdWJhdGluZyAobm90IHJlbGVhc2VkKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIENvbXBhdGliaWxpdHkgQnJlYWtpbmcgQ2hhbmdlczoKICAgQysrOgogICAgICogSXQncyBxdWl0ZSBwb3NzaWJsZSB0aGF0IHJlZ2VuZXJhdGluZyBjb2RlIGFuZCByZWJ1aWxkaW5nIHdpbGwgYmUKQEAgLTM1MCw4ICsyOTAyLDcgQEAKICAgRXJsYW5nOgogICAgICogR2VuZXJhdGVkIGNvZGUgd2lsbCBoYXZlIHRvIGJlIHJlZ2VuZXJhdGVkLCBhbmQgdGhlIG5ldyBjb2RlIHdpbGwKICAgICAgIGhhdmUgdG8gYmUgZGVwbG95ZWQgYXRvbWljYWxseSB3aXRoIHRoZSBuZXcgbGlicmFyeSBjb2RlIFtUSFJJRlQtMTM2XQotICAKLSAgCisKIE5ldyBGZWF0dXJlcyBhbmQgQnVnIEZpeGVzOgogICBDKys6CiAgICAgKiBTdXBwb3J0IGZvciBUQ29tcGFjdFByb3RvY29sIFtUSFJJRlQtMzMzXQpkaWZmIC0tZ2l0IGEvQ01ha2VMaXN0cy50eHQgYi9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjU3YTY2Ci0tLSAvZGV2L251bGwKKysrIGIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMjQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMy4xKQorCisjIENNYWtlIDMuMSBzdXBwb3J0cyBDKysgc3RhbmRhcmRzIHNlbGVjdGlvbiB3aXRoIENNQUtFX0NYWF9TVEFOREFSRAorIyBJZiB5b3UgbmVlZCBDTWFrZSAzLjErIGZvciBVYnVudHUgMTQuMDQsIHRyeQorIyAgIGh0dHBzOi8vbGF1bmNocGFkLm5ldC9+Z2VvcmdlLWVkaXNvbjU1LythcmNoaXZlL3VidW50dS9jbWFrZS0zLngKKyMgSWYgeW91IG5lZWQgQ01ha2UgMy4xKyBmb3IgZGViaWFuICJqZXNzaWUiLCBnZXQgaXQgZnJvbSBqZXNzaWUtYmFja3BvcnRzCisjIE90aGVyd2lzZQorIyAgIGh0dHA6Ly9jbWFrZS5vcmcKKworcHJvamVjdCgiQXBhY2hlIFRocmlmdCIpCisKK3NldChDTUFLRV9NT0RVTEVfUEFUSCAiJHtDTUFLRV9NT0RVTEVfUEFUSH0iICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vYnVpbGQvY21ha2UiKQorCisjIFRPRE86IGFkZCBgZ2l0IHJldi1wYXJzZSAtLXNob3J0IEhFQURgCisjIFJlYWQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgQXV0b2NvbmYgZmlsZQorZmlsZSAoU1RSSU5HUyAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbmZpZ3VyZS5hYyIgQ09ORklHVVJFX0FDIFJFR0VYICJBQ19JTklUXFwoLipcXCkiICkKKworIyBUaGUgZm9sbG93aW5nIHZhcmlhYmxlIGlzIHVzZWQgaW4gdGhlIHZlcnNpb24uaC5pbiBmaWxlCitzdHJpbmcoUkVHRVggUkVQTEFDRSAiQUNfSU5JVFxcKFxcWy4qXFxdLCBcXFsoWzAtOV0rXFwuWzAtOV0rXFwuWzAtOV0rKC1kZXYpPylcXF1cXCkiICJcXDEiIFBBQ0tBR0VfVkVSU0lPTiAke0NPTkZJR1VSRV9BQ30pCittZXNzYWdlKFNUQVRVUyAiUGFyc2VkIFRocmlmdCBwYWNrYWdlIHZlcnNpb246ICR7UEFDS0FHRV9WRVJTSU9OfSIpCisKKyMgVGhlc2UgYXJlIGludGVybmFsIHRvIENNYWtlCitzdHJpbmcoUkVHRVggUkVQTEFDRSAiKFswLTldK1xcLlswLTldK1xcLlswLTldKykoLWRldik/IiAiXFwxIiB0aHJpZnRfVkVSU0lPTiAke1BBQ0tBR0VfVkVSU0lPTn0pCitzdHJpbmcoUkVHRVggUkVQTEFDRSAiKFswLTldKylcXC5bMC05XStcXC5bMC05XSsiICJcXDEiIHRocmlmdF9WRVJTSU9OX01BSk9SICR7dGhyaWZ0X1ZFUlNJT059KQorc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlswLTldK1xcLihbMC05XSkrXFwuWzAtOV0rIiAiXFwxIiB0aHJpZnRfVkVSU0lPTl9NSU5PUiAke3RocmlmdF9WRVJTSU9OfSkKK3N0cmluZyhSRUdFWCBSRVBMQUNFICJbMC05XStcXC5bMC05XStcXC4oWzAtOV0rKSIgIlxcMSIgdGhyaWZ0X1ZFUlNJT05fUEFUQ0ggJHt0aHJpZnRfVkVSU0lPTn0pCittZXNzYWdlKFNUQVRVUyAiUGFyc2VkIFRocmlmdCB2ZXJzaW9uOiAke3RocmlmdF9WRVJTSU9OfSAoJHt0aHJpZnRfVkVSU0lPTl9NQUpPUn0uJHt0aHJpZnRfVkVSU0lPTl9NSU5PUn0uJHt0aHJpZnRfVkVSU0lPTl9QQVRDSH0pIikKKworIyBTb21lIGRlZmF1bHQgc2V0dGluZ3MKK2luY2x1ZGUoRGVmaW5lQ01ha2VEZWZhdWx0cykKKworIyBCdWlsZCB0aW1lIG9wdGlvbnMgYXJlIGRlZmluZWQgaGVyZQoraW5jbHVkZShEZWZpbmVPcHRpb25zKQoraW5jbHVkZShEZWZpbmVJbnN0YWxsYXRpb25QYXRocykKKworIyBCYXNlZCBvbiB0aGUgb3B0aW9ucyBzZXQgc29tZSBwbGF0Zm9ybSBzcGVjaWZpY3MKK2luY2x1ZGUoRGVmaW5lUGxhdGZvcm1TcGVjaWZjKQorCisjIEdlbmVyYXRlIHRoZSBjb25maWcuaCBmaWxlCitpbmNsdWRlKENvbmZpZ3VyZUNoZWNrcykKKworIyBQYWNrYWdlIGl0CitpbmNsdWRlKENQYWNrQ29uZmlnKQorCisKK2ZpbmRfcGFja2FnZShUaHJlYWRzKQorCitpbmNsdWRlKENUZXN0KQoraWYoQlVJTERfVEVTVElORykKKyAgbWVzc2FnZShTVEFUVVMgIkJ1aWxkaW5nIHdpdGggdW5pdHRlc3RzIikKKworICBlbmFibGVfdGVzdGluZygpCisgICMgRGVmaW5lICJtYWtlIGNoZWNrIiBhcyBhbGlhcyBmb3IgIm1ha2UgdGVzdCIKKyAgYWRkX2N1c3RvbV90YXJnZXQoY2hlY2sgQ09NTUFORCBjdGVzdCkKK2Vsc2UgKCkKKyAgbWVzc2FnZShTVEFUVVMgIkJ1aWxkaW5nIHdpdGhvdXQgdGVzdHMiKQorZW5kaWYgKCkKKworaWYoQlVJTERfQ09NUElMRVIpCisgICAgaWYoTk9UIEVYSVNUUyAke1RIUklGVF9DT01QSUxFUn0pCisgICAgICAgIHNldChUSFJJRlRfQ09NUElMRVIgJDxUQVJHRVRfRklMRTp0aHJpZnQtY29tcGlsZXI+KQorICAgIGVuZGlmKCkKKyAgICBhZGRfc3ViZGlyZWN0b3J5KCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jb21waWxlci9jcHApCitlbHNlaWYoRVhJU1RTICR7VEhSSUZUX0NPTVBJTEVSfSkKKyAgICBhZGRfZXhlY3V0YWJsZSh0aHJpZnQtY29tcGlsZXIgSU1QT1JURUQpCisgICAgc2V0X3Byb3BlcnR5KFRBUkdFVCB0aHJpZnQtY29tcGlsZXIgUFJPUEVSVFkgSU1QT1JURURfTE9DQVRJT04gJHtUSFJJRlRfQ09NUElMRVJ9KQorZW5kaWYoKQorCitpZihCVUlMRF9DUFApCisgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbGliL2NwcCkKKyAgICBpZihCVUlMRF9UVVRPUklBTFMpCisgICAgICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3R1dG9yaWFsL2NwcCkKKyAgICBlbmRpZigpCisgICAgaWYoQlVJTERfVEVTVElORykKKyAgICAgICAgaWYoV0lUSF9MSUJFVkVOVCBBTkQgV0lUSF9aTElCIEFORCBXSVRIX09QRU5TU0wpCisgICAgICAgICAgICBhZGRfc3ViZGlyZWN0b3J5KCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS90ZXN0L2NwcCkKKyAgICAgICAgZWxzZSgpCisgICAgICAgICAgICBtZXNzYWdlKFdBUk5JTkcgImxpYmV2ZW50IGFuZC9vciBaTElCIGFuZC9vciBPcGVuU1NMIG5vdCBmb3VuZCBvciBkaXNhYmxlZDsgd2lsbCBub3QgYnVpbGQgc29tZSB0ZXN0cyIpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCitlbmRpZigpCisKK2lmKEJVSUxEX0NfR0xJQikKKyAgICBhZGRfc3ViZGlyZWN0b3J5KCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9saWIvY19nbGliKQorZW5kaWYoKQorCitpZihCVUlMRF9KQVZBKQorICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2xpYi9qYXZhKQorZW5kaWYoKQorCitpZihCVUlMRF9QWVRIT04pCisgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbGliL3B5KQorICAgIGlmKEJVSUxEX1RFU1RJTkcpCisgICAgICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Rlc3QvcHkpCisgICAgZW5kaWYoKQorZW5kaWYoKQorCitpZihCVUlMRF9IQVNLRUxMKQorICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2xpYi9ocykKKyAgICBpZihCVUlMRF9URVNUSU5HKQorICAgICAgICBhZGRfc3ViZGlyZWN0b3J5KCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS90ZXN0L2hzKQorICAgIGVuZGlmKCkKK2VuZGlmKCkKKworUFJJTlRfQ09ORklHX1NVTU1BUlkoKQpkaWZmIC0tZ2l0IGEvQ09OVFJJQlVUSU5HLm1kIGIvQ09OVFJJQlVUSU5HLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMWQ3MTAKLS0tIC9kZXYvbnVsbAorKysgYi9DT05UUklCVVRJTkcubWQKQEAgLTAsMCArMSwxMTYgQEAKKyMgSG93IHRvIENvbnRyaWJ1dGUgIworCitUaGFuayB5b3UgZm9yIHlvdXIgaW50ZXJlc3QgaW4gY29udHJpYnV0aW5nIHRvIHRoZSBBcGFjaGUgVGhyaWZ0IHByb2plY3QhICBJbmZvcm1hdGlvbiBvbiB3aHkgYW5kIGhvdyB0byBjb250cmlidXRlIGlzIGF2YWlsYWJsZSBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgd2ViIHNpdGUuIEluIHBhcnRpY3VsYXIsIHdlIHJlY29tbWVuZCB0aGUgZm9sbG93aW5nIHRvIGJlY29tZSBhY3F1YWludGVkIHdpdGggQXBhY2hlIENvbnRyaWJ1dGlvbnM6CisKKyAqIFtDb250cmlidXRvcnMgVGVjaCBHdWlkZV0oaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9jb250cmlidXRvcnMpCisgKiBbR2V0IGludm9sdmVkIV0oaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vZ2V0aW52b2x2ZWQuaHRtbCkKKyAqIFtMZWdhbCBhc3BlY3RzIG9uIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucyAoUGF0Y2hlcyldKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sI2NvbnRyaWJ1dGlvbnMpCisKKyMjIEdpdEh1YiBwdWxsIHJlcXVlc3RzICMjCisKK1RoaXMgaXMgdGhlIHByZWZlcnJlZCBtZXRob2Qgb2Ygc3VibWl0dGluZyBjaGFuZ2VzLiAgV2hlbiB5b3Ugc3VibWl0IGEgcHVsbCByZXF1ZXN0IHRocm91Z2ggZ2l0aHViLAoraXQgYWN0aXZhdGVzIHRoZSBjb250aW51b3VzIGludGVncmF0aW9uIChDSSkgYnVpbGQgc3lzdGVtcyBhdCBBcHB2ZXlvciBhbmQgVHJhdmlzIHRvIGJ1aWxkIHlvdXIgY2hhbmdlc3hpCitvbiBhIHZhcmlldHkgb2YgTGludXggYW5kIFdpbmRvd3MgY29uZmlndXJhdGlvbnMgYW5kIHJ1biBhbGwgdGhlIHRlc3Qgc3VpdGVzLiAgRm9sbG93IHRoZXNlIHJlcXVpcmVtZW50cyAKK2ZvciBhIHN1Y2Nlc3NmdWwgcHVsbCByZXF1ZXN0OgorCisgMS4gQWxsIGNvZGUgY2hhbmdlcyByZXF1aXJlIGFuIFtBcGFjaGUgSmlyYSBUSFJJRlQgSXNzdWVdKGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQpIHRpY2tldC4KKworIDEuIEFsbCBwdWxsIHJlcXVlc3RzIHNob3VsZCBjb250YWluIGEgc2luZ2xlIGNvbW1pdCBwZXIgaXNzdWUsIG9yIHdlIHdpbGwgYXNrIHlvdSB0byBzcXVhc2ggaXQuCisgMS4gVGhlIHB1bGwgcmVxdWVzdCB0aXRsZSBtdXN0IGJlZ2luIHdpdGggdGhlIEppcmEgVEhSSUZUIHRpY2tldCBpZGVudGlmaWVyLCBmb3IgZXhhbXBsZToKKworICAgICAgICBUSFJJRlQtOTk5OTogYW4gZXhhbXBsZSBwdWxsIHJlcXVlc3QgdGl0bGUKKyAgICAgICAgCisgMS4gQ29tbWl0IG1lc3NhZ2VzIG11c3QgZm9sbG93IHRoaXMgcGF0dGVybiBmb3IgY29kZSBjaGFuZ2VzIChkZXZpYXRpb25zIHdpbGwgbm90IGJlIG1lcmdlZCk6CisgICAgICAgIAorICAgICAgICBUSFJJRlQtOTk5OTogW3N1bW1hcnkgb2YgZml4LCBvbmUgbGluZSBpZiBwb3NzaWJsZV0KKyAgICAgICAgQ2xpZW50OiBbbGFuZ3VhZ2UocykgYWZmZWN0ZWQsIGNvbW1hIHNlcGFyYXRlZCwgdXNlIGxpYi8gZGlyZWN0b3J5IG5hbWVzIHBsZWFzZV0KKworSW5zdHJ1Y3Rpb25zOgorCisgMS4gQ3JlYXRlIGEgZm9yayBpbiB5b3VyIEdpdEh1YiBhY2NvdW50IG9mIGh0dHA6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQKKyAxLiBDbG9uZSB0aGUgZm9yayB0byB5b3VyIGRldmVsb3BtZW50IHN5c3RlbS4KKyAxLiBDcmVhdGUgYSBicmFuY2ggZm9yIHlvdXIgY2hhbmdlcyAoYmVzdCBwcmFjdGljZSBpcyBpc3N1ZSBhcyBicmFuY2ggbmFtZSwgZS5nLiBUSFJJRlQtOTk5OSkuCisgMS4gTW9kaWZ5IHRoZSBzb3VyY2UgdG8gaW5jbHVkZSB0aGUgaW1wcm92ZW1lbnQvYnVnZml4LCBhbmQ6CisKKyAgICAqIFJlbWVtYmVyIHRvIHByb3ZpZGUgKnRlc3RzKiBmb3IgYWxsIHN1Ym1pdHRlZCBjaGFuZ2VzIQorICAgICogVXNlIHRlc3QtZHJpdmVuIGRldmVsb3BtZW50IChUREQpOiBhZGQgYSB0ZXN0IHRoYXQgd2lsbCBpc29sYXRlIHRoZSBidWcgKmJlZm9yZSogYXBwbHlpbmcgdGhlIGNoYW5nZSB0aGF0IGZpeGVzIGl0LgorICAgICogVmVyaWZ5IHRoYXQgeW91IGZvbGxvdyBbVGhyaWZ0IENvZGluZyBTdGFuZGFyZHNdKC9kb2NzL2NvZGluZ19zdGFuZGFyZHMpICh5b3UgY2FuIHJ1biAnbWFrZSBzdHlsZScsIHdoaWNoIGVuc3VyZXMgcHJvcGVyIGZvcm1hdCBmb3Igc29tZSBsYW5ndWFnZXMpLgorICAgICogWypvcHRpb25hbCpdIFZlcmlmeSB0aGF0IHlvdXIgY2hhbmdlIHdvcmtzIG9uIG90aGVyIHBsYXRmb3JtcyBieSBhZGRpbmcgYSBHaXRIdWIgc2VydmljZSBob29rIHRvIFtUcmF2aXMgQ0ldKGh0dHA6Ly9kb2NzLnRyYXZpcy1jaS5jb20vdXNlci9nZXR0aW5nLXN0YXJ0ZWQvI1N0ZXAtb25lJTNBLVNpZ24taW4pIGFuZCBbQXBwVmV5b3JdKGh0dHA6Ly93d3cuYXBwdmV5b3IuY29tL2RvY3MpLiAgWW91IGNhbiB1c2UgdGhpcyB0ZWNobmlxdWUgdG8gcnVuIHRoZSBUaHJpZnQgQ0kgam9icyBpbiB5b3VyIGFjY291bnQgdG8gY2hlY2sgeW91ciBjaGFuZ2VzIGJlZm9yZSB0aGV5IGFyZSBtYWRlIHB1YmxpYy4gIEV2ZXJ5IEdpdEh1YiBwdWxsIHJlcXVlc3QgaW50byBUaHJpZnQgd2lsbCBydW4gdGhlIGZ1bGwgQ0kgYnVpbGQgYW5kIHRlc3Qgc3VpdGUgb24geW91ciBjaGFuZ2VzLgorCisgMS4gU3F1YXNoIHlvdXIgY2hhbmdlcyB0byBhIHNpbmdsZSBjb21taXQuICBUaGlzIG1haW50YWlucyBjbGVhbiBjaGFuZ2UgaGlzdG9yeS4KKyAxLiBDb21taXQgYW5kIHB1c2ggY2hhbmdlcyB0byB5b3VyIGJyYW5jaCAocGxlYXNlIHVzZSBpc3N1ZSBuYW1lIGFuZCBkZXNjcmlwdGlvbiBhcyBjb21taXQgdGl0bGUsIGUuZy4gIlRIUklGVC05OTk5OiBtYWtlIGl0IHBlcmZlY3QiKSwgd2l0aCB0aGUgYWZmZWN0ZWQgbGFuZ3VhZ2VzIG9uIHRoZSBuZXh0IGxpbmUgb2YgdGhlIGRlc2NyaXB0aW9uLgorIDEuIFVzZSBHaXRIdWIgdG8gY3JlYXRlIGEgcHVsbCByZXF1ZXN0IGdvaW5nIGZyb20geW91ciBicmFuY2ggdG8gYXBhY2hlOm1hc3Rlci4gIEVuc3VyZSB0aGF0IHRoZSBKaXJhIHRpY2tldCBudW1iZXIgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGl0bGUgb2YgeW91ciBwdWxsIHJlcXVlc3QsIHNhbWUgYXMgdGhlIGNvbW1pdCB0aXRsZS4KKyAxLiBXYWl0IGZvciBvdGhlciBjb250cmlidXRvcnMgb3IgY29tbWl0dGVycyB0byByZXZpZXcgeW91ciBuZXcgYWRkaXRpb24sIGFuZCBmb3IgYSBDSSBidWlsZCB0byBjb21wbGV0ZS4KKyAxLiBXYWl0IGZvciBhIGNvbW1pdHRlciB0byBjb21taXQgeW91ciBwYXRjaC4gIFlvdSBjYW4gbnVkZ2UgdGhlIGNvbW1pdHRlcnMgaWYgbmVjZXNzYXJ5IGJ5IHNlbmRpbmcgYSBtZXNzYWdlIHRvIHRoZSBbQXBhY2hlIFRocmlmdCBtYWlsaW5nIGxpc3RdKGh0dHBzOi8vdGhyaWZ0LmFwYWNoZS5vcmcvbWFpbGluZykuCisKKyMjIElmIHlvdSB3YW50IHRvIGJ1aWxkIHRoZSBwcm9qZWN0IGxvY2FsbHkgIyMKKworRm9yIFdpbmRvd3Mgc3lzdGVtcywgc2VlIG91ciBkZXRhaWxlZCBpbnN0cnVjdGlvbnMgb24gdGhlIFtDTWFrZSBSRUFETUVdKC9idWlsZC9jbWFrZS9SRUFETUUubWQpLgorCitGb3IgV2luZG93cyBOYXRpdmUgQysrIGJ1aWxkcywgc2VlIG91ciBkZXRhaWxlZCBpbnN0cnVjdGlvbnMgb24gdGhlIFtXaW5DUFAgUkVBRE1FXSgvYnVpbGQvd2luY3BwL1JFQURNRS5tZCkuCisKK0ZvciB1bml4IHN5c3RlbXMsIHNlZSBvdXIgZGV0YWlsZWQgaW5zdHJ1Y3Rpb25zIG9uIHRoZSBbRG9ja2VyIFJFQURNRV0oL2J1aWxkL2RvY2tlci9SRUFETUUubWQpLgorCisjIyBJZiB5b3Ugd2FudCB0byByZXZpZXcgb3BlbiBpc3N1ZXMuLi4gIyMKKworIDEuIFJldmlldyB0aGUgW0dpdEh1YiBQdWxsIFJlcXVlc3QgQmFja2xvZ10oaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvcHVsbHMpLiAgQ29kZSByZXZpZXdzIGFyZSBvcGVuIHRvIGFsbC4KKyAyLiBSZXZpZXcgdGhlIFtKaXJhIGlzc3VlIHRyYWNrZXJdKGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQpLiAgWW91IGNhbiBzZWFyY2ggZm9yIHRpY2tldHMgcmVsYXRpbmcgdG8gbGFuZ3VhZ2VzIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBvciBjdXJyZW50bHkgdXNpbmcgd2l0aCB0aHJpZnQsIGZvciBleGFtcGxlIGEgSmlyYSBzZWFyY2ggKElzc3VlcyAtPiBTZWFyY2ggRm9yIElzc3VlcykgcXVlcnkgb2YgYGBwcm9qZWN0ID0gVEhSSUZUIEFORCBjb21wb25lbnQgaW4gKCJFcmxhbmcgLSBMaWJyYXJ5IikgYW5kIHN0YXR1cyBub3QgaW4gKHJlc29sdmVkLCBjbG9zZWQpYGAgd2lsbCBsb2NhdGUgYWxsIHRoZSBvcGVuIEVybGFuZyBMaWJyYXJ5IGlzc3Vlcy4KKworIyMgSWYgeW91IGRpc2NvdmVyZWQgYSBkZWZlY3QuLi4gIyMKKworIDEuIENoZWNrIHRvIHNlZSBpZiB0aGUgaXNzdWUgaXMgYWxyZWFkeSBpbiB0aGUgW0ppcmEgaXNzdWUgdHJhY2tlcl0oaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCkuCisgMS4gSWYgbm90LCBjcmVhdGUgYSB0aWNrZXQgZGVzY3JpYmluZyB0aGUgY2hhbmdlIHlvdSdyZSBwcm9wb3NpbmcgaW4gdGhlIEppcmEgaXNzdWUgdHJhY2tlci4KKyAxLiBDb250cmlidXRlIHlvdXIgY29kZSBjaGFuZ2VzIHVzaW5nIHRoZSBHaXRIdWIgcHVsbCByZXF1ZXN0IG1ldGhvZDoKKworIyMgQ29udHJpYnV0aW5nIHZpYSBQYXRjaCAjIworCitTb21lIGNoYW5nZXMgZG8gbm90IHJlcXVpcmUgYSBidWlsZCwgZm9yIGV4YW1wbGUgaW4gZG9jdW1lbnRhdGlvbi4gIEZvciBjaGFuZ2VzIHRoYXQgYXJlIG5vdCBjb2RlIG9yIGJ1aWxkIHJlbGF0ZWQsIHlvdSBjYW4gc3VibWl0IGEgcGF0Y2ggb24gSmlyYSBmb3IgcmV2aWV3LiAgVG8gY3JlYXRlIGEgcGF0Y2ggZnJvbSBjaGFuZ2VzIGluIHlvdXIgbG9jYWwgZGlyZWN0b3J5OgorCisgICAgZ2l0IGRpZmYgPiAuLi9USFJJRlQtTk5OTi5wYXRjaAorCit0aGVuIHdhaXQgZm9yIGNvbnRyaWJ1dG9ycyBvciBjb21taXR0ZXJzIHRvIHJldmlldyB5b3VyIGNoYW5nZXMsIGFuZCB0aGVuIGZvciBhIGNvbW1pdHRlciB0byBhcHBseSB5b3VyIHBhdGNoLgorCisjIyBHaXRIdWIgcmVjaXBlcyBmb3IgUHVsbCBSZXF1ZXN0cyAjIworCitTb21ldGltZXMgY29tbW1pdHRlcnMgbWF5IGFzayB5b3UgdG8gdGFrZSBhY3Rpb25zIGluIHlvdXIgcHVsbCByZXF1ZXN0cy4gIEhlcmUgYXJlIHNvbWUgcmVjaXBlcyB0aGF0IHdpbGwgaGVscCB5b3UgYWNjb21wbGlzaCB0aG9zZSByZXF1ZXN0cy4gIFRoZXNlIGV4YW1wbGVzIGFzc3VtZSB5b3UgYXJlIHdvcmtpbmcgb24gSmlyYSBpc3N1ZSBUSFJJRlQtOTk5OS4gIFlvdSBzaG91bGQgYWxzbyBiZSBmYW1pbGlhciB3aXRoIHRoZSBbdXBzdHJlYW1dKGh0dHBzOi8vaGVscC5naXRodWIuY29tL2FydGljbGVzL3N5bmNpbmctYS1mb3JrLykgcmVwb3NpdG9yeSBjb25jZXB0LgorCisjIyMgU3F1YXNoIHlvdXIgY2hhbmdlcyAjIyMKKworSWYgeW91IGhhdmUgbm90IHN1Ym1pdHRlZCBhIHB1bGwgcmVxdWVzdCB5ZXQsIG9yIGlmIHlvdSBoYXZlIG5vdCB5ZXQgcmViYXNlZCB5b3VyIGV4aXN0aW5nIHB1bGwgcmVxdWVzdCwgeW91IGNhbiBzcXVhc2ggYWxsIHlvdXIgY29tbWl0cyBkb3duIHRvIGEgc2luZ2xlIGNvbW1pdC4gIFRoaXMgbWFrZXMgbGlmZSBlYXNpZXIgZm9yIHRoZSBjb21taXR0ZXJzLiAgSWYgeW91ciBwdWxsIHJlcXVlc3Qgb24gR2l0SHViIGhhcyBtb3JlIHRoYW4gb25lIGNvbW1pdCwgeW91IHNob3VsZCBkbyB0aGlzLgorCisxLiBVc2UgdGhlIGNvbW1hbmQgYGBnaXQgbG9nYGAgdG8gaWRlbnRpZnkgaG93IG1hbnkgY29tbWl0cyB5b3UgbWFkZSBzaW5jZSB5b3UgYmVnYW4uCisyLiBVc2UgdGhlIGNvbW1hbmQgYGBnaXQgcmViYXNlIC1pIEhFQUR+TmBgIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiBjb21taXRzLgorMy4gTGVhdmUgInB1bGwiIGluIHRoZSBmaXJzdCBsaW5lLgorNC4gQ2hhbmdlIGFsbCBvdGhlciBsaW5lcyBmcm9tICJwdWxsIiB0byAiZml4dXAiLgorNS4gQWxsIHlvdXIgY2hhbmdlcyBhcmUgbm93IGluIGEgc2luZ2xlIGNvbW1pdC4KKworSWYgeW91IGFscmVhZHkgaGF2ZSBhIHB1bGwgcmVxdWVzdCBvdXRzdGFuZGluZywgeW91IHdpbGwgbmVlZCB0byBkbyBhICJmb3JjZSBwdXNoIiB0byBvdmVyd3JpdGUgaXQgc2luY2UgeW91IGNoYW5nZWQgeW91ciBjb21taXQgaGlzdG9yeToKKworICAgIGdpdCBwdXNoIC11IG9yaWdpbiBUSFJJRlQtOTk5OSAtLWZvcmNlCisKK0EgbW9yZSBkZXRhaWxlZCB3YWxrdGhyb3VnaCBvZiBhIHNxdWFzaCBjYW4gYmUgZm91bmQgYXQgW0dpdCBSZWFkeV0oaHR0cDovL2dpdHJlYWR5LmNvbS9hZHZhbmNlZC8yMDA5LzAyLzEwL3NxdWFzaGluZy1jb21taXRzLXdpdGgtcmViYXNlLmh0bWwpLgorCisjIyMgUmViYXNlIHlvdXIgcHVsbCByZXF1ZXN0ICMjIworCitJZiB5b3VyIHB1bGwgcmVxdWVzdCBoYXMgYSBjb25mbGljdCB3aXRoIG1hc3RlciwgaXQgbmVlZHMgdG8gYmUgcmViYXNlZDoKKworICAgIGdpdCBjaGVja291dCBUSFJJRlQtOTk5OQorICAgIGdpdCByZWJhc2UgdXBzdHJlYW0gbWFzdGVyCisgICAgICAocmVzb2x2ZSBhbnkgY29uZmxpY3RzLCBtYWtlIHN1cmUgaXQgYnVpbGRzKQorICAgIGdpdCBwdXNoIC11IG9yaWdpbiBUSFJJRlQtOTk5OSAtLWZvcmNlCisKKyMjIyBGaXggYSBiYWQgbWVyZ2UgIyMjCisKK0lmIHlvdXIgcHVsbCByZXF1ZXN0IGNvbnRhaW5zIGNvbW1pdHMgdGhhdCBhcmUgbm90IHlvdXJzLCB0aGVuIHlvdSBzaG91bGQgdXNlIHRoZSBmb2xsb3dpbmcgdGVjaG5pcXVlIHRvIGZpeCB0aGUgYmFkIG1lcmdlIGluIHlvdXIgYnJhbmNoOgorCisgICAgZ2l0IGNoZWNrb3V0IG1hc3RlcgorICAgIGdpdCBwdWxsIHVwc3RyZWFtIG1hc3RlcgorICAgIGdpdCBjaGVja291dCAtYiBUSFJJRlQtOTk5OS10YWtlLTIKKyAgICBnaXQgY2hlcnJ5LXBpY2sgLi4uCisgICAgICAgIChwaWNrIG9ubHkgeW91ciBjb21taXRzIGZyb20geW91ciBvcmlnaW5hbCBwdWxsIHJlcXVlc3QgaW4gYXNjZW5kaW5nIGNocm9ub2xvZ2ljYWwgb3JkZXIpCisgICAgc3F1YXNoIHlvdXIgY2hhbmdlcyB0byBhIHNpbmdsZSBjb21taXQgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSAoc2VlIGFib3ZlKQorICAgIGdpdCBwdXNoIC11IG9yaWdpbiBUSFJJRlQtOTk5OS10YWtlLTI6VEhSSUZULTk5OTkKKworVGhpcyBwcm9jZWR1cmUgd2lsbCBhcHBseSBvbmx5IHlvdXIgY29tbWl0cyBpbiBvcmRlciB0byB0aGUgY3VycmVudCBtYXN0ZXIsIHRoZW4geW91IHdpbGwgc3F1YXNoIHRoZW0gdG8gYSBzaW5nbGUgY29tbWl0LCBhbmQgdGhlbiB5b3UgZm9yY2UgcHVzaCB5b3VyIGxvY2FsIFRIUklGVC05OTk5LXRha2UtMiBpbnRvIHJlbW90ZSBUSFJJRlQtOTk5OSB3aGljaCByZXByZXNlbnRzIHlvdXIgcHVsbCByZXF1ZXN0LCByZXBsYWNpbmcgYWxsIHRoZSBjb21taXRzIHdpdGggdGhlIG5ldyBvbmUuCisKKyAKZGlmZiAtLWdpdCBhL0NPTlRSSUJVVE9SUyBiL0NPTlRSSUJVVE9SUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ5NTRmOC4uMDAwMDAwMAotLS0gYS9DT05UUklCVVRPUlMKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi1DaGFkIFdhbHRlcnMgPGNoYWRAcG93ZXJzZXQuY29tPgotLVRKU09OUHJvdG9jb2wgZm9yIEMrKyBhbmQgSmF2YQotCi1OaXRheSA8bml0YXlqQGdtYWlsLmNvbT4KLS1TdXBwb3J0IGZvciAibWFrZSBjaGVjayIKLQotV2lsbGlhbSBNb3JnYW4gPHdAYWRhcC50dj4KLS1NaXNjZWxsYW5lb3VzIFJ1YnkgaW1wcm92ZW1lbnRzCi0KLUJlbiBNYXVyZXIgPGJtYXVyZXJAYW5kcmV3LmNtdS5lZHU+Ci0tUmVzdHJ1Y3R1cmluZyB0aGUgd2F5IEF1dG9jb25mIGlzIHVzZWQKLQotUGF0cmljayBDb2xsaXNvbiA8cGF0cmlja0Bjb2xsaXNvbi5pZT4KLS1TbWFsbHRhbGsgYmluZGluZ3MKLQotRGF2ZSBTaW1wc29uIDxkYXZlQHBvd2Vyc2V0LmNvbT4KLS1CZXR0ZXIgc3VwcG9ydCBmb3IgY29ubmVjdGlvbiB0cmFja2luZyBpbiB0aGUgQysrIHNlcnZlcgotLU1pc2NlbGxhbmVvdXMgZml4ZXMKLQotSWdvciBBZmFuYXN5ZXYgPGFmYW5AZXZlcm5vdGUuY29tPgotLVBlcmwgSHR0cENsaWVudCBhbmQgYnVnZml4ZXMKLQotVG9kZCBCZXJtYW4gPHRiZXJtYW5AaW1lZW0uY29tPgotLU1pbkdXIHBvcnQgb2YgdGhlIGNvbXBpbGVyCi0tQyMgYmluZGluZ3MKLS1NUyBidWlsZCB0YXNrCi0KLS0tLS0tLS0tLS0tLS0tLS0KLVJlbGVhc2UgMjAwNzA5MTcKLS0tLS0tLS0tLS0tLS0tLS0KLQotRGF2ZSBFbmdiZXJnIDxlbmdiZXJnQGdtYWlsLmNvbT4KLS1KYXZhQmVhbi9KYXZhRG9jIGVuaGFuY2VtZW50cwotCi1BbmRyZXcgTWNHZWFjaGllIDxnZWVjaG9yYW1hQGdtYWlsLmNvbT4KLS1Db2NvYS9PYmplY3RpdmUtQyBzdXBwb3J0Ci0KLUJlbiBNYXVyZXIgPGJtYXVyZXJAYW5kcmV3LmNtdS5lZHU+Ci0tUHl0aG9uIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cywgZmFzdGJpbmFyeSBzdXBwb3J0Ci0KLUFuZHJldyBMdXRvbWlyc2tpIDxhbmR5QGx1dG8udXM+Ci0tQWRkZWQgb3B0aW9uYWwvcmVxdWlyZWQga2V5d29yZHMgZm9yIEMrKyBvYmplY3RzCi0tQWRkZWQgY29tcGFyaXNvbiBvcGVyYXRvcnMgZm9yIEMrKyBzdHJ1Y3RzCi0KLUpvaGFuIE9za2Fyc3NvbiA8am9oYW5Ab2tzYXJzc29uLm51PgotLUphdmEgZmluZGJ1Z3MgY29tcGxpYW5jZSBmaXhlcwotCi1QYXVsIFNhYWIgPHBzQHBvd2Vyc2V0LmNvbT4KLS1JUHY2IHN1cHBvcnQgZm9yIFRTb2NrZXQgaW4gQysrL1B5dGhvbgotCi1LZXZpbiBDbGFyayA8a2V2aW5AcG93ZXJzZXQuY29tPgotLVNpZ25pZmljYW50IG92ZXJoYXVsIG9mIFJ1YnkgY29kZSBnZW5lcmF0aW9uIGFuZCBzZXJ2ZXJzCi0KLVNpbW9uIEZvcm1hbiA8c2Zvcm1hbkBnbWFpbC5jb20+Ci0tVFByb2Nlc3NvckZhY3RvcnkgYWJzdHJhY3Rpb24gZm9yIEphdmEgc2VydmVycwotCi1KYWtlIEx1Y2lhbmkgPGpha2Vyc0BnbWFpbC5jb20+Ci0tUGVybCBjb2RlIGdlbmVyYXRpb24sIGxpYnJhcmllcywgdGVzdCBjb2RlCi0KLURhdmlkIFJlaXNzIDxkcmVpc3NAc3RhbmZvcmQuZWR1PgotLXN0cmluZ3MuaCBpbmNsdWRlIGZpeCBmb3IgYnplcm8KLS1lbmRpYW5uZXNzIGZpeGVzIG9uIFRCaW5hcnlQcm90b2NvbCBkb3VibGUgc2VyaWFsaXphdGlvbgotLWltcHJvdmVkIG50b2hsbCxodG9ubGwgaW1wbGVtZW50YXRpb24KLQotRGFuIExpIDxkdG9AZGV2LmphdmEubmV0PgotLUphdmEgVGVzdFNlcnZlciBhbmQgVHV0b3JpYWwgRml4ZXMKLQotS2V2aW4gS28gPGtldmluLnMua29AZ21haWwuY29tPgotLUZpeCBmb3IgdW5uZWNlc3Nhcnkgc3RkOjpzdHJpbmcgY29weSBjb25zdHJ1Y3Rpb24gaW4gUHJvdG9jb2wvRXhjZXB0aW9uCi0KLVBhdWwgUXVlcm5hIDxwcXVlcm5hQGFwYWNoZS5vcmc+Ci0tQXV0b2NvbmYgZXJyb3IgbWVzc2FnZSBmaXggZm9yIGxpYmV2ZW50IGRldGVjdGlvbgotLWNsb2NrX2dldHRpbWUgaW1wbGVtZW50YXRpb24gZm9yIE9TWAotCi0tLS0tLS0tLS0tLS0tLS0tCi1SZWxlYXNlIDIwMDcwNDAxCi0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9ESVNDTEFJTUVSIGIvRElTQ0xBSU1FUgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU3ZTdlYS4uMDAwMDAwMAotLS0gYS9ESVNDTEFJTUVSCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1BcGFjaGUgVGhyaWZ0IGlzIGFuIGVmZm9ydCB1bmRlcmdvaW5nIGluY3ViYXRpb24gYXQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpLCAKLXNwb25zb3JlZCBieSB0aGUgSW5jdWJhdG9yIFBNQy4gSW5jdWJhdGlvbiBpcyByZXF1aXJlZCBvZiBhbGwgbmV3bHkgYWNjZXB0ZWQgcHJvamVjdHMgCi11bnRpbCBhIGZ1cnRoZXIgcmV2aWV3IGluZGljYXRlcyB0aGF0IHRoZSBpbmZyYXN0cnVjdHVyZSwgY29tbXVuaWNhdGlvbnMsIGFuZCBkZWNpc2lvbiAKLW1ha2luZyBwcm9jZXNzIGhhdmUgc3RhYmlsaXplZCBpbiBhIG1hbm5lciBjb25zaXN0ZW50IHdpdGggb3RoZXIgc3VjY2Vzc2Z1bCBBU0YgcHJvamVjdHMuCi1XaGlsZSBpbmN1YmF0aW9uIHN0YXR1cyBpcyBub3QgbmVjZXNzYXJpbHkgYSByZWZsZWN0aW9uIG9mIHRoZSBjb21wbGV0ZW5lc3Mgb3Igc3RhYmlsaXR5IAotb2YgdGhlIGNvZGUsIGl0IGRvZXMgaW5kaWNhdGUgdGhhdCB0aGUgcHJvamVjdCBoYXMgeWV0IHRvIGJlIGZ1bGx5IGVuZG9yc2VkIGJ5IHRoZSBBU0YuCmRpZmYgLS1naXQgYS9MQU5HVUFHRVMubWQgYi9MQU5HVUFHRVMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhM2NmNQotLS0gL2Rldi9udWxsCisrKyBiL0xBTkdVQUdFUy5tZApAQCAtMCwwICsxLDM1NSBAQAorIyBBcGFjaGUgVGhyaWZ0IExhbmd1YWdlIFN1cHBvcnQgIworCitMYXN0IE1vZGlmaWVkOiAyMDE4LTEyLTE3CisKK0d1aWRhbmNlIEZvcjogMC4xMi4wIG9yIGxhdGVyCisKK1RocmlmdCBzdXBwb3J0cyBtYW55IHByb2dyYW1taW5nIGxhbmd1YWdlcyBhbmQgaGFzIGFuIGltcHJlc3NpdmUgdGVzdCBzdWl0ZSB0aGF0IGV4ZXJjaXNlcyBtb3N0IG9mIHRoZSBsYW5ndWFnZXMsIHByb3RvY29scywgYW5kIHRyYW5zcG9ydHMgdGhhdCByZXByZXNlbnRzIGEgbWF0cml4IG9mIHRob3VzYW5kcyBvZiBwb3NzaWJsZSBjb21iaW5hdGlvbnMuICBFYWNoIGxhbmd1YWdlIHR5cGljYWxseSBoYXMgYSBtaW5pbXVtIHJlcXVpcmVkIHZlcnNpb24gYXMgd2VsbCBhcyBzdXBwb3J0IGxpYnJhcmllcyAtIHNvbWUgbWFuZGF0b3J5IGFuZCBzb21lIG9wdGlvbmFsLiAgQWxsIG9mIHRoaXMgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgYmVsb3cgdG8gaGVscCB5b3UgYXNzZXNzIHdoZXRoZXIgeW91IGNhbiB1c2UgQXBhY2hlIFRocmlmdCB3aXRoIHlvdXIgcHJvamVjdC4gIE9idmlvdXNseSB0aGlzIGlzIGEgY29tcGxleCBtYXRyaXggdG8gbWFpbnRhaW4gYW5kIG1heSBub3QgYmUgY29ycmVjdCBpbiBhbGwgY2FzZXMgLSBpZiB5b3Ugc3BvdCBhbiBlcnJvciBwbGVhc2UgaW5mb3JtIHRoZSBkZXZlbG9wZXJzIHVzaW5nIHRoZSBtYWlsaW5nIGxpc3QuCisKK0FwYWNoZSBUaHJpZnQgaGFzIGEgY2hvaWNlIG9mIHR3byBidWlsZCBzeXN0ZW1zLiAgVGhlIGBhdXRvY29uZmAgYnVpbGQgc3lzdGVtIGlzIHRoZSBtb3N0IGNvbXBsZXRlIGJ1aWxkIGFuZCBpcyB1c2VkIHRvIGJ1aWxkIGFsbCBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLiAgVGhlIGBjbWFrZWAgYnVpbGQgc3lzdGVtIGhhcyBiZWVuIGRlc2lnbmF0ZWQgYnkgdGhlIHByb2plY3QgdG8gcmVwbGFjZSBgYXV0b2NvbmZgIGhvd2V2ZXIgdGhpcyB0cmFuc2l0aW9uIHdpbGwgdGFrZSBxdWl0ZSBzb21lIHRpbWUgdG8gY29tcGxldGUuCisKK1RoZSBMYW5ndWFnZS9MaWJyYXJ5IExldmVscyBpbmRpY2F0ZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB2ZXJzaW9ucyB0aGF0IGFyZSB1c2VkIGluIHRoZSBbY29udGludW91cyBpbnRlZ3JhdGlvbiBlbnZpcm9ubWVudHNdKGJ1aWxkL2RvY2tlci9SRUFETUUubWQpIChBcHB2ZXlvciwgVHJhdmlzKSBmb3IgQXBhY2hlIFRocmlmdC4gIE90aGVyIGxhbmd1YWdlIGxldmVscyBtYXkgYmUgc3VwcG9ydGVkIGZvciBlYWNoIGxhbmd1YWdlLCBob3dldmVyIHRlc3RlZCBsZXNzIHRob3JvdWdobHk7IGNoZWNrIHRoZSBSRUFETUUgZmlsZSBpbnNpZGUgZWFjaCBsaWIgZGlyZWN0b3J5IGZvciBhZGRpdGlvbmFsIGRldGFpbHMuICBOb3RlIHRoYXQgd2hpbGUgYSBsYW5ndWFnZSBtYXkgY29udGFpbiBzdXBwb3J0IGZvciBwcm90b2NvbHMsIHRyYW5zcG9ydHMsIGFuZCBzZXJ2ZXJzLCB0aGUgZXh0ZW50IHRvIHdoaWNoIGVhY2ggaXMgdGVzdGVkIGFzIHBhcnQgb2YgdGhlIG92ZXJhbGwgYnVpbGQgcHJvY2VzcyB2YXJpZXMuICBUaGUgZGVmaW5pdGl2ZSBpbnRlZ3JhdGlvbiB0ZXN0IGZvciB0aGUgcHJvamVjdCBpcyBjYWxsZWQgdGhlICJjcm9zcyIgdGVzdCB3aGljaCBleGVjdXRlcyBhIHRlc3QgbWF0cml4IHdpdGggY2xpZW50cyBhbmQgc2VydmVycyBjb21tdW5pY2F0aW5nIGFjcm9zcyBsYW5ndWFnZXMuCisKKzx0YWJsZSBzdHlsZT0iZm9udC1zaXplOiA2MCU7IHBhZGRpbmc6IDFweDsiPgorPHRoZWFkPgorPHRyPgorPHRoIHJvd3NwYW49Mj5MYW5ndWFnZTwvdGg+Cis8dGggcm93c3Bhbj0yIGFsaWduPWNlbnRlcj5TaW5jZTwvdGg+Cis8dGggY29sc3Bhbj0yIGFsaWduPWNlbnRlcj5CdWlsZCBTeXN0ZW1zPC90aD4KKzx0aCBjb2xzcGFuPTIgYWxpZ249Y2VudGVyPkxhbmcvTGliIExldmVscyAoVGVzdGVkKTwvdGg+Cis8dGggY29sc3Bhbj02IGFsaWduPWNlbnRlcj5Mb3ctTGV2ZWwgVHJhbnNwb3J0czwvdGg+Cis8dGggY29sc3Bhbj0zIGFsaWduPWNlbnRlcj5UcmFuc3BvcnQgV3JhcHBlcnM8L3RoPgorPHRoIGNvbHNwYW49NCBhbGlnbj1jZW50ZXI+UHJvdG9jb2xzPC90aD4KKzx0aCBjb2xzcGFuPTUgYWxpZ249Y2VudGVyPlNlcnZlcnM8L3RoPgorPHRoIHJvd3NwYW49Mj5PcGVuIElzc3VlczwvdGg+Cis8L3RyPgorPHRyPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGg+YXV0b2NvbmY8L3RoPjx0aD5jbWFrZTwvdGg+Cis8IS0tIExhbmcvTGliIExldmVscyAtLS0tLS0tPjx0aD5NaW48L3RoPjx0aD5NYXg8L3RoPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGg+PGEgaHJlZj0iaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5peF9kb21haW5fc29ja2V0Ij5Eb21haW48L2E+PC90aD48dGg+Jm5ic3A7RmlsZSZuYnNwOzwvdGg+PHRoPk1lbW9yeTwvdGg+PHRoPiZuYnNwO1BpcGUmbmJzcDs8L3RoPjx0aD5Tb2NrZXQ8L3RoPjx0aD4mbmJzcDtUTFMmbmJzcDs8L3RoPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGg+RnJhbWVkPC90aD48dGg+Jm5ic3A7aHR0cCZuYnNwOzwvdGg+PHRoPiZuYnNwO3psaWImbmJzcDs8L3RoPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGg+PGEgaHJlZj0iZG9jL3NwZWNzL3RocmlmdC1iaW5hcnktcHJvdG9jb2wubWQiPkJpbmFyeTwvYT48L3RoPjx0aD48YSBocmVmPSJkb2Mvc3BlY3MvdGhyaWZ0LWNvbXBhY3QtcHJvdG9jb2wubWQiPkNvbXBhY3Q8L2E+PC90aD48dGg+Jm5ic3A7SlNPTiZuYnNwOzwvdGg+PHRoPk11bHRpcGxleDwvdGg+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0aD5Gb3JraW5nPC90aD48dGg+Tm9uYmxvY2tpbmc8L3RoPjx0aD5TaW1wbGU8L3RoPjx0aD5UaHJlYWRlZDwvdGg+PHRoPlRocmVhZFBvb2w8L3RoPgorPC90cj4KKzwvdGhlYWQ+Cis8dGJvZHk+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2FzMy9SRUFETUUubWQiPkFjdGlvblNjcmlwdDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4zLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkIGNvbHNwYW49Mj5BY3Rpb25TY3JpcHQgMzwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEzNzIyIj5BY3Rpb25TY3JpcHQ8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2NfZ2xpYi9SRUFETUUubWQiPkMgKGdsaWIpPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjYuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Mi40OC4yPC90ZD48dGQ+Mi41Ni4wPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTM4NTQiPkMgKGdsaWIpPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9jcHAvUkVBRE1FLm1kIj5DKys8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZCBjb2xzcGFuPTI+QysrOTg8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjMxMyI+QysrPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9jc2hhcnAvUkVBRE1FLm1kIj5DIzwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPi5ORVQmbmJzcDszLjUgLyBtb25vJm5ic3A7My4yLjguMDwvdGQ+PHRkPi5ORVQmbmJzcDs0LjYuMSAvIG1vbm8mbmJzcDs0LjYuMi43PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTIzNjIiPkMjICguTkVUKTwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvY29jb2EvUkVBRE1FLm1kIj5Db2NvYTwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkIGNvbHNwYW49Mj51bmtub3duPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTIzOTgiPkNvY29hPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9jbC9SRUFETUUubWQiPkNvbW1vbiBMaXNwPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjEyLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPlNCQ0wgMS40LjU8L3RkPjx0ZD5TQkNMIDEuNC4xNTwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtODIiPkNvbW1vbiBMaXNwPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9kL1JFQURNRS5tZCI+RGxhbmc8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuOS4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4yLjA3NS4xPC90ZD48dGQ+Mi4wODMuMjwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzE3OTA0Ij5EPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9kYXJ0L1JFQURNRS5tZCI+RGFydDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4xMC4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4xLjIyLjE8L3RkPjx0ZD4xLjI0LjM8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMyODAwNiI+RGFydDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvZGVscGhpL1JFQURNRS5tZCI+RGVscGhpPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjguMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+MjAxMDwvdGQ+PHRkPnVua25vd248L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxNjYwMSI+RGVscGhpPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9uZXRjb3JlL1JFQURNRS5tZCI+Lk5FVCBDb3JlPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjExLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjIuMS40PC90ZD48dGQ+Mi4yLjEwMTwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzMxMTc2Ij4uTkVUIENvcmU8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2VybC9SRUFETUUubWQiPkVybGFuZzwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4zLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjE4LjM8L3RkPjx0ZD4yMC4wLjQ8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjM5MCI+RXJsYW5nPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9nby9SRUFETUUubWQiPkdvPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjcuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+MS43LjY8L3RkPjx0ZD4xLjExLjQ8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxNDMwNyI+R288L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2hzL1JFQURNRS5tZCI+SGFza2VsbDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC41LjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjcuMTAuMzwvdGQ+PHRkPjguMC4yPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTI3MDQiPkhhc2tlbGw8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2hheGUvUkVBRE1FLm1kIj5IYXhlPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjkuMzwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+My4yLjE8L3RkPjx0ZD4zLjQuNDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzI0MzQ3Ij5IYXhlPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9qYXZhL1JFQURNRS5tZCI+SmF2YSAoU0UpPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+MS44LjBfMTUxPC90ZD48dGQ+MS44LjBfMTkxPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTIzMTQiPkphdmEgU0U8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2phdmFtZS9SRUFETUUubWQiPkphdmEgKE1FKTwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC41LjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkIGNvbHNwYW49Mj51bmtub3duPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTM3NTkiPkphdmEgTUU8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2pzL1JFQURNRS5tZCI+SmF2YXNjcmlwdDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4zLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkIGNvbHNwYW49Mj51bmtub3duPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTM0MTgiPkphdmFzY3JpcHQ8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2x1YS9SRUFETUUubWQiPkx1YTwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC45LjI8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjUuMS41PC90ZD48dGQ+NS4yLjQ8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMyMjY1OSI+THVhPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9ub2RlanMvUkVBRE1FLm1kIj5ub2RlLmpzPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjYuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Ni54PC90ZD48dGQ+OC54PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTQzMjAiPm5vZGUuanM8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL25vZGV0cy9SRUFETUUubWQiPm5vZGUudHM8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMTIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+My4xLjY8L3RkPjx0ZD48L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9pc3N1ZXMvP2pxbD1wcm9qZWN0JTIwJTNEJTIwVEhSSUZUJTIwQU5EJTIwcmVzb2x1dGlvbiUyMCUzRCUyMFVucmVzb2x2ZWQlMjBhbmQlMjBDb21wb25lbnQlMjBpbiUyMCglMjJUeXBlU2NyaXB0JTIwLSUyMExpYnJhcnklMjIpJTIwT1JERVIlMjBCWSUyMHByaW9yaXR5JTIwREVTQyUyQyUyMHVwZGF0ZWQlMjBERVNDIj5ub2RlLnRzPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9vY2FtbC9SRUFETUUubWQiPk9DYW1sPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQgY29sc3Bhbj0yPjQuMDQuMDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEzNjYwIj5PQ2FtbDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvcGVybC9SRUFETUUubWQiPlBlcmw8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD41LjIyLjE8L3RkPjx0ZD41LjI2LjE8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjMxMiI+UGVybDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvcGhwL1JFQURNRS5tZCI+UEhQPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Ny4wLjIyPC90ZD48dGQ+Ny4yLjEwPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTI0MzEiPlBIUDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvcHkvUkVBRE1FLm1kIj5QeXRob248L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4yLjcuMTIsIDMuNS4yPC90ZD48dGQ+Mi43LjE1cmMxLCAzLjYuNzwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEyMzE1Ij5QeXRob248L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL3JiL1JFQURNRS5tZCI+UnVieTwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjIuMy4xcDExMjwvdGQ+PHRkPjIuNS4xcDU3PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTIzMTYiPlJ1Ynk8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL3JzL1JFQURNRS5tZCI+UnVzdDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4xMS4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4xLjE3LjA8L3RkPjx0ZD4xLjMwLjA8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMzMTQyMCI+UnVzdDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvc3QvUkVBRE1FLm1kIj5TbWFsbHRhbGs8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZCBjb2xzcGFuPTI+dW5rbm93bjwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEzODYxIj5TbWFsbHRhbGs8L2E+PC90ZD4KKzwvdHI+Cis8L3Rib2R5PgorPHRmb290PgorPHRyPgorPHRoIHJvd3NwYW49Mj5MYW5ndWFnZTwvdGg+Cis8dGggcm93c3Bhbj0yIGFsaWduPWNlbnRlcj5TaW5jZTwvdGg+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0aD5hdXRvY29uZjwvdGg+PHRoPmNtYWtlPC90aD4KKzwhLS0gTGFuZy9MaWIgTGV2ZWxzIC0tLS0tLS0+PHRoPk1pbjwvdGg+PHRoPk1heDwvdGg+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0aD48YSBocmVmPSJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vbml4X2RvbWFpbl9zb2NrZXQiPkRvbWFpbjwvYT48L3RoPjwvdGg+PHRoPiZuYnNwO0ZpbGUmbmJzcDs8L3RoPjx0aD5NZW1vcnk8L3RoPjx0aD4mbmJzcDtQaXBlJm5ic3A7PC90aD48dGg+U29ja2V0PC90aD48dGg+Jm5ic3A7VExTJm5ic3A7PC90aD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRoPkZyYW1lZDwvdGg+PHRoPiZuYnNwO2h0dHAmbmJzcDs8L3RoPjx0aD4mbmJzcDt6bGliJm5ic3A7PC90aD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRoPjxhIGhyZWY9ImRvYy9zcGVjcy90aHJpZnQtYmluYXJ5LXByb3RvY29sLm1kIj5CaW5hcnk8L2E+PC90aD48dGg+PGEgaHJlZj0iZG9jL3NwZWNzL3RocmlmdC1jb21wYWN0LXByb3RvY29sLm1kIj5Db21wYWN0PC9hPjwvdGg+PHRoPiZuYnNwO0pTT04mbmJzcDs8L3RoPjx0aD5NdWx0aXBsZXg8L3RoPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGg+Rm9ya2luZzwvdGg+PHRoPk5vbmJsb2NraW5nPC90aD48dGg+U2ltcGxlPC90aD48dGg+VGhyZWFkZWQ8L3RoPjx0aD5UaHJlYWRQb29sPC90aD4KKzx0aCByb3dzcGFuPTI+T3BlbiBJc3N1ZXM8L3RoPgorPC90cj4KKzx0cj4KKzx0aCBjb2xzcGFuPTIgYWxpZ249Y2VudGVyPkJ1aWxkIFN5c3RlbXM8L3RoPgorPHRoIGNvbHNwYW49MiBhbGlnbj1jZW50ZXI+TGFuZy9MaWIgTGV2ZWxzIChUZXN0ZWQpPC90aD4KKzx0aCBjb2xzcGFuPTYgYWxpZ249Y2VudGVyPkxvdy1MZXZlbCBUcmFuc3BvcnRzPC90aD4KKzx0aCBjb2xzcGFuPTMgYWxpZ249Y2VudGVyPlRyYW5zcG9ydCBXcmFwcGVyczwvdGg+Cis8dGggY29sc3Bhbj00IGFsaWduPWNlbnRlcj5Qcm90b2NvbHM8L3RoPgorPHRoIGNvbHNwYW49NSBhbGlnbj1jZW50ZXI+U2VydmVyczwvdGg+Cis8L3RyPgorPC90Zm9vdD4KKzwvdGFibGU+CmRpZmYgLS1naXQgYS9MSUNFTlNFIGIvTElDRU5TRQppbmRleCA5ZDE4OWVmLi4zYjZkN2Q3IDEwMDY0NAotLS0gYS9MSUNFTlNFCisrKyBiL0xJQ0VOU0UKQEAgLTIxNiw2OSArMjE2LDYgQEAKIAogUGxlYXNlIHNlZSBkb2Mvb3RwLWJhc2UtbGljZW5zZS50eHQgZm9yIHRoZSBmdWxsIHRlcm1zIG9mIHRoaXMgbGljZW5zZS4KIAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGhlIGZvbGxvd2luZyBmaWxlcyBjb250YWluIHNvbWUgcG9ydGlvbnMgb2YgY29kZSBjb250cmlidXRlZCB1bmRlcgotdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlIChzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQpLCBhbmQgcmVsaWNlbnNlZAotdW5kZXIgdGhlIEFwYWNoZSAyLjAgTGljZW5zZToKLQotICBjb21waWxlci9jcHAvTWFrZWZpbGUuYW0KLSAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcHlfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MKLSAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL21haW4uY2MKLSAgY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2ZpZWxkLmgKLSAgY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Byb2dyYW0uaAotICBjb21waWxlci9jcHAvc3JjL3BsYXRmb3JtLmgKLSAgY29tcGlsZXIvY3BwL3NyYy90aHJpZnRsLmxsCi0gIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0eS55eQotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEZpZWxkLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RMaXN0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNYXAuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2UuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2VUeXBlLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbC5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xVdGlsLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RTZXQuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFN0cnVjdC5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UVHlwZS5jcwotICBsaWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlci5jcwotICBsaWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcwotICBsaWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3MKLSAgbGliL2NzaGFycC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RocmlmdC5jc3Byb2oKLSAgbGliL2NzaGFycC9zcmMvVGhyaWZ0LnNsbgotICBsaWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5jcwotICBsaWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCi0gIGxpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0QnVpbGQuY3MKLSAgbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRNU0J1aWxkVGFzay5jc3Byb2oKLSAgbGliL3JiL2xpYi90aHJpZnQucmIKLSAgbGliL3N0L1JFQURNRQotICBsaWIvc3QvdGhyaWZ0LnN0Ci0gIHRlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwCi0gIHRlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0Ci0gIHRlc3QvVGhyaWZ0VGVzdC50aHJpZnQKLQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEZvciB0aGUgYWNsb2NhbC9heF9ib29zdF9iYXNlLm00IGFuZCBjb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNCBjb21wb25lbnRzOgogCkBAIC0yODksMzYgKzIyNiwxNCBAQAogIyAgIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRm9yIHRoZSBjb21waWxlci9jcHAvc3JjL21kNS5bY2hdIGNvbXBvbmVudHM6CitGb3IgdGhlIGxpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3BhcnNlLmpzOgogCiAvKgotICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIgQWxhZGRpbiBFbnRlcnByaXNlcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICAganNvbl9wYXJzZS5qcworICAgIDIwMTUtMDUtMDIKKyAgICBQdWJsaWMgRG9tYWluLgorICAgIE5PIFdBUlJBTlRZIEVYUFJFU1NFRCBPUiBJTVBMSUVELiBVU0UgQVQgWU9VUiBPV04gUklTSy4KIAotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgTC4gUGV0ZXIgRGV1dHNjaAotICBnaG9zdEBhbGFkZGluLmNvbQotCi0gKi8KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Gb3IgdGhlIGxpYi9yYi9zZXR1cC5yYjogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgTWluZXJvIEFva2ksCi1saWIvb2NhbWwvT0NhbWxNYWtlZmlsZSBhbmQgbGliL29jYW1sL1JFQURNRS1PQ2FtbE1ha2VmaWxlIGNvbXBvbmVudHM6Ci0gICAgIENvcHlyaWdodCAoQykgMTk5OSAtIDIwMDcgIE1hcmt1cyBNb3R0bAotCi1MaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAyLjEKLShzZWUgZG9jL2xncGwtMi4xLnR4dCBmb3IgdGhlIGZ1bGwgdGVybXMgb2YgdGhpcyBsaWNlbnNlKQorKi8KKyhCeSBEb3VnbGFzIENyb2NrZm9yZCA8ZG91Z2xhc0Bjcm9ja2ZvcmQuY29tPikKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5hbSBiL01ha2VmaWxlLmFtCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggYWJlODdkYS4uNTExNDUyZAotLS0gYS9NYWtlZmlsZS5hbQorKysgYi9NYWtlZmlsZS5hbQpAQCAtMTksMTUgKzE5LDExNyBAQAogCiBBQ0xPQ0FMX0FNRkxBR1MgPSAtSSAuL2FjbG9jYWwKIAotU1VCRElSUyA9IGNvbXBpbGVyL2NwcCBsaWIgdGVzdAoraWYgV0lUSF9QTFVHSU4KKyMgVG8gZW5hYmxlIGJvb3RzdHJhcCwgYnVpbGQgb3JkZXIgaXMgbGliL2NwcCAtPiBjb21waWxlciAtPiBvdGhlcnMKK1NVQkRJUlMgPSBsaWIvY3BwIGNvbXBpbGVyL2NwcCBsaWIKK2lmIFdJVEhfVEVTVFMKK1NVQkRJUlMgKz0gbGliL2NwcC90ZXN0CitlbmRpZgorZWxzZQorU1VCRElSUyA9IGNvbXBpbGVyL2NwcCBsaWIKK2VuZGlmCisKK2lmIFdJVEhfVEVTVFMKK1NVQkRJUlMgKz0gdGVzdAorZW5kaWYKKworaWYgV0lUSF9UVVRPUklBTAorU1VCRElSUyArPSB0dXRvcmlhbAorZW5kaWYKIAogZGlzdC1ob29rOgotCWZpbmQgJChkaXN0ZGlyKSAtdHlwZSBmIFwoIC1pbmFtZSAiLmRlcHMiIC1vciAtaW5hbWUgIi5saWJzIiAtb3IgLWluYW1lICIuZ2l0aWdub3JlIiBcCi0JCS1vciAtaW5hbWUgIi5EU19TdG9yZSIgLW9yIC1pbmFtZSAiLl8qIiBcKSB8IHhhcmdzIHJtIC1yZgorCWZpbmQgJChkaXN0ZGlyKSAtdHlwZSBmIFwoIC1pbmFtZSAiLkRTX1N0b3JlIiAtb3IgLWluYW1lICIuXyoiIC1vciAtaW5hbWUgIi5naXRpZ25vcmUiIFwpIHwgeGFyZ3Mgcm0gLXJmCisJZmluZCAkKGRpc3RkaXIpIC10eXBlIGQgXCggLWluYW1lICIuZGVwcyIgLW9yIC1pbmFtZSAiLmxpYnMiIFwpIHwgeGFyZ3Mgcm0gLXJmCiAJZmluZCAkKGRpc3RkaXIpIC10eXBlIGQgXCggLWluYW1lICIuc3ZuIiAtb3IgLWluYW1lICIuZ2l0IiBcKSB8IHhhcmdzIHJtIC1yZgogCiBwcmludC12ZXJzaW9uOgotCUBlY2hvICQoVkVSU0lPTikKKwlAZWNobyAkKFBBQ0tBR0VfVkVSU0lPTikKIAotRVhUUkFfRElTVCA9IGRvYyB0dXRvcmlhbCBjb250cmliIFwKLSAgICAgICAgICAgICBDT05UUklCVVRPUlMgTElDRU5TRSBDSEFOR0VTIERJU0NMQUlNRVIgTk9USUNFCisuUEhPTlk6IHByZWNyb3NzIGNyb3NzCitwcmVjcm9zcy0lOiBhbGwKKwkkKE1BS0UpIC1DICQqIHByZWNyb3NzCitwcmVjcm9zczogYWxsIHByZWNyb3NzLXRlc3QgcHJlY3Jvc3MtbGliCisKK2VtcHR5IDo9CitzcGFjZSA6PSAkKGVtcHR5KSAkKGVtcHR5KQorY29tbWEgOj0gLAorCitDUk9TU19MQU5HUyA9IEBNQVlCRV9DUFBAIEBNQVlCRV9DX0dMSUJAIEBNQVlCRV9DTEAgQE1BWUJFX0RAIEBNQVlCRV9KQVZBQCBATUFZQkVfQ1NIQVJQQCBATUFZQkVfUFlUSE9OQCBATUFZQkVfUFkzQCBATUFZQkVfUlVCWUAgQE1BWUJFX0hBU0tFTExAIEBNQVlCRV9QRVJMQCBATUFZQkVfUEhQQCBATUFZQkVfR09AIEBNQVlCRV9OT0RFSlNAIEBNQVlCRV9EQVJUQCBATUFZQkVfRVJMQU5HQCBATUFZQkVfTFVBQCBATUFZQkVfUlNAIEBNQVlCRV9ET1RORVRDT1JFQCBATUFZQkVfTk9ERVRTQAorQ1JPU1NfTEFOR1NfQ09NTUFfU0VQQVJBVEVEID0gJChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKENST1NTX0xBTkdTKSkKKworaWYgV0lUSF9QWTMKK0NST1NTX1BZPSQoUFlUSE9OMykKK2Vsc2UKK0NST1NTX1BZPSQoUFlUSE9OKQorZW5kaWYKKworaWYgV0lUSF9QWVRIT04KK2Nyb3NzZmVhdHVyZTogcHJlY3Jvc3MKKwkkKENST1NTX1BZKSB0ZXN0L3Rlc3QucHkgLS1yZXRyeS1jb3VudCA1IC0tZmVhdHVyZXMgLiogLS1za2lwLWtub3duLWZhaWx1cmVzIC0tc2VydmVyICQoQ1JPU1NfTEFOR1NfQ09NTUFfU0VQQVJBVEVEKQorZWxzZQorIyBmZWF0dXJlIHRlc3QgbmVlZHMgcHl0aG9uIGJ1aWxkCitjcm9zc2ZlYXR1cmU6CitlbmRpZgorCitjcm9zcy0lOiBwcmVjcm9zcyBjcm9zc2ZlYXR1cmUKKwkkKENST1NTX1BZKSB0ZXN0L3Rlc3QucHkgLS1yZXRyeS1jb3VudCA1IC0tc2tpcC1rbm93bi1mYWlsdXJlcyAtLXNlcnZlciAkKENST1NTX0xBTkdTX0NPTU1BX1NFUEFSQVRFRCkgLS1jbGllbnQgJChDUk9TU19MQU5HU19DT01NQV9TRVBBUkFURUQpIC0tcmVnZXggIiQqIgorCitjcm9zczogY3Jvc3MtLioKKworVElNRVMgPSAxIDIgMworZmFpbDogcHJlY3Jvc3MKKwkkKENST1NTX1BZKSB0ZXN0L3Rlc3QucHkgfHwgdHJ1ZQorCSQoQ1JPU1NfUFkpIHRlc3QvdGVzdC5weSAtLXVwZGF0ZS1leHBlY3RlZC1mYWlsdXJlcz1vdmVyd3JpdGUKKwkkKGZvcmVhY2ggdmFyLCQoVElNRVMpLHRlc3QvdGVzdC5weSAtcyB8fCB0cnVlO3Rlc3QvdGVzdC5weSAtLXVwZGF0ZS1leHBlY3RlZC1mYWlsdXJlcz1tZXJnZTspCisKK2NvZGVzcGVsbF9za2lwX2ZpbGVzID0gXAorCSouamFyIFwKKwkqLmNsYXNzIFwKKwkqLnNvIFwKKwkqLmEgXAorCSoubGEgXAorCSoubyBcCisJKi5wMTIgXAorCSpPQ2FtbE1ha2VmaWxlIFwKKwkua2V5c3RvcmUgXAorCS50cnVzdHN0b3JlIFwKKwlDSEFOR0VTIFwKKwljb25maWcuc3ViIFwKKwljb25maWd1cmUgXAorCWRlcGNvbXAgXAorCWxpYnRvb2wubTQgXAorCW91dHB1dC4qIFwKKwlyZWJhciBcCisJdGhyaWZ0CisKK3NraXBwZWRfZmlsZXMgPSAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoY29kZXNwZWxsX3NraXBfZmlsZXMpKQorCitzdHlsZS1sb2NhbDoKKwljb2Rlc3BlbGwgLS13cml0ZS1jaGFuZ2VzIC0tc2tpcD0kKHNraXBwZWRfZmlsZXMpIC0tZGlzYWJsZS1jb2xvcnMKKworRVhUUkFfRElTVCA9IFwKKwkuY2xhbmctZm9ybWF0IFwKKwkuZWRpdG9yY29uZmlnIFwKKwkudHJhdmlzLnltbCBcCisJLnJ1c3RmbXQudG9tbCBcCisJLmRvY2tlcmlnbm9yZSBcCisJYXBwdmV5b3IueW1sIFwKKwlib3dlci5qc29uIFwKKwlidWlsZCBcCisJYm9vdHN0cmFwLnNoIFwKKwljbGVhbnVwLnNoIFwKKwlDTWFrZUxpc3RzLnR4dCBcCisJY29tcG9zZXIuanNvbiBcCisJY29udHJpYiBcCisJQ09OVFJJQlVUSU5HLm1kIFwKKwlkZWJpYW4gXAorCWRvYyBcCisJZG9hcC5yZGYgXAorCXBhY2thZ2UuanNvbiBcCisJc29uYXItcHJvamVjdC5wcm9wZXJ0aWVzIFwKKwlMQU5HVUFHRVMubWQgXAorCUxJQ0VOU0UgXAorCUNIQU5HRVMgXAorCU5PVElDRSBcCisJUkVBRE1FLm1kIFwKKwlUaHJpZnQucG9kc3BlYwpkaWZmIC0tZ2l0IGEvTkVXUyBiL05FV1MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZDBjNGMuLjAwMDAwMDAKLS0tIGEvTkVXUworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLVJlbGVhc2UgTm90ZXMgZm9yIFRocmlmdCAyMDA4MDQxMQotCi0uZXF1YWxzIGFuZCAuaGFzaENvZGUoKSBmb3IgSmF2YSBzdHJ1Y3RzIChkZXZlbG9wZWQgYnkgZHJlaXNzKS4KLQotSW1wcm92ZW1lbnRzIHRvIHRoZSBDKysgVFNvY2tldFBvb2wgKGRldmVsb3BlZCBieSBha2hpbCkuCi0KLVBIUCAoZGUpc2VyaWFsaXphdGlvbiBleHRlbnNpb24gKGRldmVsb3BlZCBieSBkd2VhdGhlcmZvcmQpLgotCi1BZGQgZmIzMDMgdG8gY29udHJpYiAoZGV2ZWxvcGVkIGJ5IEZhY2Vib29rKS4KLQotVEpTT05Qcm90b2NvbCBmb3IgQysrIGFuZCBKYXZhIChjb250cmlidXRlZCBieSBDaGFkIFdhbHRlcnMgb2YgUG93ZXJzZXQpLgotCi1TdXBwb3J0IGZvciAibWFrZSBjaGVjayIgYW5kIGJldHRlciB0ZXN0cyAoY29udHJpYnV0ZWQgYnkgTml0YXkpLgotCi1TbWFsbHRhbGsgc3VwcG9ydCAoY29udHJpYnV0ZWQgYnkgUGF0cmljayBDb2xsaXNvbikuCi0KLURhdmUgU2ltcHNvbiA8ZGF2ZUBwb3dlcnNldC5jb20+Ci1CZXR0ZXIgc3VwcG9ydCBmb3IgY29ubmVjdGlvbiB0cmFja2luZyBpbiB0aGUgQysrIHNlcnZlciAoY29udHJpYnV0ZWQgYnkKLURhdmUgU2ltcHNvbiBvZiBQb3dlcnNldCkuCi0KLVBlcmwgSHR0cENsaWVudCAoY29udHJpYnV0ZWQgYnkgSWdvciBBZmFuYXN5ZXYgb2YgRXZlcm5vdGUpLgotCi1DIyBzdXBwb3J0IChjb250cmlidXRlZCBieSBUb2RkIEJlcm1hbiBvZiBpbWVlbSkuCi0KLU1pbkdXIHBvcnQgb2YgdGhlIGNvbXBpbGVyIChjb250cmlidXRlZCBieSBUb2RkIEJlcm1hbiBvZiBpbWVlbSkuCi0KLVRvbnMgb2Ygc21hbGwgaW1wcm92ZW1lbnRzIGFuZCBidWcgZml4ZXMuCi0KLQotUmVsZWFzZSBOb3RlcyBmb3IgVGhyaWZ0IDIwMDcwOTE3Ci0KLVRCaW5hcnlQcm90b2NvbCBub3cgaW5jbHVkZXMgYSBwcm90b2NvbCB2ZXJzaW9uIG51bWJlciBpbiBtZXNzYWdlZC4KLVRoaXMgaXMgYSBub24tYmFja3dhcmRzLWNvbXBhdGlibGUgY2hhbmdlLiAgUGxlYXNlIHNlZSB0aGUKLVRCaW5hcnlQcm90b2NvbCBjb25zdHJ1Y3RvciBmb3Igc3RyaWN0UmVhZF8gYW5kIHN0cmljdFdyaXRlXy4KLQotQWRkIGJpbmFyeSB0eXBlIHRvIHN1cHBvcnQgbm9uLXRleHQgInN0cmluZ3MiIGluIEphdmEuCi0KLVRTb2NrZXRQb29sIGZvciBDKysgKGRldmVsb3BlZCBieSBqc29iZWwpLgotCi1TeW50YXggaGlnaGxpZ2h0aW5nIGZvciB2aW0gYW5kIGVtYWNzIChkZXZlbG9wZWQgYnkgaHpoYW8gYW5kIG1hcnRpbikuCi0KLVBlcmwgc3VwcG9ydCAoY29udHJpYnV0ZWQgYnkgSmFrZSBMdWNpYW5pKS4KLQotRXJsYW5nIHN1cHBvcnQgKGRldmVsb3BlZCBieSBjcGlybykuCi0KLVJ1YnkgQVBJIG92ZXJoYXVsIChjb250cmlidXRlZCBieSBLZXZpbiBDbGFyayBvZiBQb3dlcnNldCkuCi0KLUlQdjYgc3VwcG9ydCBpbiBDKysgYW5kIFB5dGhvbiAoY29udHJpYnV0ZWQgYnkgUGF1bCBTYWFiIG9mIFBvd2Vyc2V0KS4KLQotUmVhZC9Xcml0ZSBsb2NrcyAoZGV2ZWxvcGVkIGJ5IGJveikuCi0KLU9DYW1sIHN1cHBvcnQgKGRldmVsb3BlZCBieSBpcHJvY3RvcikuCi0KLUh1bWFuLXJlYWRhYmxlIHN0cmluZ3MgZnJvbSBUaHJpZnQgc3RydWN0dXJlcyBpbiBDKysgKGRldmVsb3BlZCBieSBkcmVpc3MpLgotCi1IYXNrZWxsIHN1cHBvcnQgKGRldmVsb3BlZCBieSBpcHJvY3RvcikuCi0KLVN1cHBvcnQgZm9yIG9wdGlvbmFsIGZpZWxkcyBpbiBDKysgKGNvbnRyaWJ1dGVkIGJ5IEFuZHkgTHV0b21pcnNreSkuCi0KLVN1cHBvcnQgZm9yIG9wZXJhdG9yPT0gZm9yIFRocmlmdCBzdHJ1Y3R1cmVzIChjb250cmlidXRlZCBieSBBbmR5IEx1dG9taXJza3kpLgotCi1QeXRob24vQyBtb2R1bGUgZm9yIGZhc3QgKGRlKXNlcmlhbGl6YXRpb24gKGNvbnRyaWJ1dGVkIGJ5IEJlbiBNYXVyZXIpLgotCi1MaW1pdGVkIHJlZmxlY3Rpb24gZm9yIEMrKyBzZXJ2aWNlcyAoZGV2ZWxvcGVkIGJ5IGRyZWlzcykuCi0KLVB5dGhvbiBsaWJyYXJ5IGluc3RhbGxhdGlvbiBkZWZhdWx0cyB0byAvdXNyLCBvdmVycmlkZSB3aXRoIFBZX1BSRUZJWC4KLQotU3VwcG9ydCBmb3IgSmF2YWJlYW4tc3R5bGUgSmF2YSBjbGFzc2VzIChjb250cmlidXRlZCBieSBEYXZlIEVuZ2JlcmcpLgotCi1URGVuc2VQcm90b2NvbCBmb3IgQysrIChleHBlcmltZW50YWwgd2F5IHRvIHNocmluayBzdHJ1Y3R1cmVzKQotKGRldmVsb3BlZCBieSBkcmVpc3MpLgotCi1Db2NvYS9PYmplY3RpdmUgQyBzdXBwb3J0IChjb250cmlidXRlZCBieSBBbmRyZXcgTWNHZWFjaGllKS4KLQotVGhyaWZ0IG5vdyBidWlsZHMgd2l0aG91dCBsaWJldmVudC4KLQotVFpsaWJUcmFuc3BvcnQgZm9yIEMrKyAoY29tcHJlc3Mgc2VyaWFsaXplZCBzdHJ1Y3R1cmVzKSAoZGV2ZWxvcGVkIGJ5IGRyZWlzcykuCi0KLVRvbnMgb2Ygc21hbGwgaW1wcm92ZW1lbnRzIGFuZCBidWcgZml4ZXMuCmRpZmYgLS1naXQgYS9OT1RJQ0UgYi9OT1RJQ0UKaW5kZXggYzIzOTk1YS4uOTAyZGM4ZCAxMDA2NDQKLS0tIGEvTk9USUNFCisrKyBiL05PVElDRQpAQCAtMSw1ICsxLDUgQEAKIEFwYWNoZSBUaHJpZnQKLUNvcHlyaWdodCAyMDA2LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorQ29weXJpZ2h0IDIwMDYtMjAxNyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAKIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYXQKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0ZjY1ZS4uMDAwMDAwMAotLS0gYS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotQXBhY2hlIFRocmlmdAotCi1MYXN0IE1vZGlmaWVkOiAyMDEwLU5vdi0wNAotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1JbnRyb2R1Y3Rpb24KLT09PT09PT09PT09PQotCi1UaHJpZnQgaXMgYSBsaWdodHdlaWdodCwgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgc29mdHdhcmUgc3RhY2sgd2l0aCBhbgotYXNzb2NpYXRlZCBjb2RlIGdlbmVyYXRpb24gbWVjaGFuaXNtIGZvciBSUEMuIFRocmlmdCBwcm92aWRlcyBjbGVhbgotYWJzdHJhY3Rpb25zIGZvciBkYXRhIHRyYW5zcG9ydCwgZGF0YSBzZXJpYWxpemF0aW9uLCBhbmQgYXBwbGljYXRpb24KLWxldmVsIHByb2Nlc3NpbmcuIFRoZSBjb2RlIGdlbmVyYXRpb24gc3lzdGVtIHRha2VzIGEgc2ltcGxlIGRlZmluaXRpb24KLWxhbmd1YWdlIGFzIGl0cyBpbnB1dCBhbmQgZ2VuZXJhdGVzIGNvZGUgYWNyb3NzIHByb2dyYW1taW5nIGxhbmd1YWdlcyB0aGF0Ci11c2VzIHRoZSBhYnN0cmFjdGVkIHN0YWNrIHRvIGJ1aWxkIGludGVyb3BlcmFibGUgUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuCi0KLVRocmlmdCBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gc3VwcG9ydCBub24tYXRvbWljIHZlcnNpb24gY2hhbmdlcwotYWNyb3NzIGNsaWVudCBhbmQgc2VydmVyIGNvZGUuCi0KLUZvciBtb3JlIGRldGFpbHMgb24gVGhyaWZ0J3MgZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiwgdGFrZSBhIGdhbmRlciBhdAotdGhlIFRocmlmdCB3aGl0ZXBhcGVyIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIG9yIGF0IHRoZSBSRUFETUUgZmlsZXMKLWluIHlvdXIgcGFydGljdWxhciBzdWJkaXJlY3Rvcnkgb2YgaW50ZXJlc3QuCi0KLUhpZXJhcmNoeQotPT09PT09PT09Ci0KLXRocmlmdC8KLQotICBjb21waWxlci8KLSAgICBDb250YWlucyB0aGUgVGhyaWZ0IGNvbXBpbGVyLCBpbXBsZW1lbnRlZCBpbiBDKysuCi0KLSAgbGliLwotICAgIENvbnRhaW5zIHRoZSBUaHJpZnQgc29mdHdhcmUgbGlicmFyeSBpbXBsZW1lbnRhdGlvbiwgc3ViZGl2aWRlZCBieQotICAgIGxhbmd1YWdlIG9mIGltcGxlbWVudGF0aW9uLgotCi0gICAgY3BwLwotICAgIGphdmEvCi0gICAgcGhwLwotICAgIHB5LwotICAgIHJiLwotCi0gIHRlc3QvCi0KLSAgICBDb250YWlucyBzYW1wbGUgVGhyaWZ0IGZpbGVzIGFuZCB0ZXN0IGNvZGUgYWNyb3NzIHRoZSB0YXJnZXQgcHJvZ3JhbW1pbmcKLSAgICBsYW5ndWFnZXMuCi0KLSAgdHV0b3JpYWwvCi0KLSAgICBDb250YWlucyBhIGJhc2ljIHR1dG9yaWFsIHRoYXQgd2lsbCB0ZWFjaCB5b3UgaG93IHRvIGRldmVsb3Agc29mdHdhcmUKLSAgICB1c2luZyBUaHJpZnQuCi0KLVJlcXVpcmVtZW50cwotPT09PT09PT09PT09Ci0KLVNlZSBodHRwOi8vd2lraS5hcGFjaGUub3JnL3RocmlmdC9UaHJpZnRSZXF1aXJlbWVudHMgZm9yCi1hbiB1cC10by1kYXRlIGxpc3Qgb2YgYnVpbGQgcmVxdWlyZW1lbnRzLgotCi1SZXNvdXJjZXMKLT09PT09PT09PQotCi1Nb3JlIGluZm9ybWF0aW9uIGFib3V0IFRocmlmdCBjYW4gYmUgb2J0YWluZWQgb24gdGhlIFRocmlmdCB3ZWJwYWdlIGF0OgotCi0gICAgIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZwotCi1BY2tub3dsZWRnbWVudHMKLT09PT09PT09PT09PT09PQotCi1UaHJpZnQgd2FzIGluc3BpcmVkIGJ5IHBpbGxhciwgYSBsaWdodHdlaWdodCBSUEMgdG9vbCB3cml0dGVuIGJ5IEFkYW0gRCdBbmdlbG8sCi1hbmQgYWxzbyBieSBHb29nbGUncyBwcm90b2NvbCBidWZmZXJzLgotCi1JbnN0YWxsYXRpb24KLT09PT09PT09PT09PQotCi1JZiB5b3UgYXJlIGJ1aWxkaW5nIGZyb20gdGhlIGZpcnN0IHRpbWUgb3V0IG9mIHRoZSBzb3VyY2UgcmVwb3NpdG9yeSwgeW91IHdpbGwKLW5lZWQgdG8gZ2VuZXJhdGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHRzLiAgKFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBpZiB5b3UKLWRvd25sb2FkZWQgYSB0YXJiYWxsLikgIEZyb20gdGhlIHRvcCBkaXJlY3RvcnksIGRvOgotCi0JLi9ib290c3RyYXAuc2gKLQotT25jZSB0aGUgY29uZmlndXJlIHNjcmlwdHMgYXJlIGdlbmVyYXRlZCwgdGhyaWZ0IGNhbiBiZSBjb25maWd1cmVkLgotRnJvbSB0aGUgdG9wIGRpcmVjdG9yeSwgZG86Ci0KLQkuL2NvbmZpZ3VyZQotCi1Zb3UgbWF5IG5lZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhlIGJvb3N0IGZpbGVzIGV4cGxpY2l0bHkuCi1JZiB5b3UgaW5zdGFsbGVkIGJvb3N0IGluIC91c3IvbG9jYWwsIHlvdSB3b3VsZCBydW4gY29uZmlndXJlIGFzIGZvbGxvd3M6Ci0KLQkuL2NvbmZpZ3VyZSAtLXdpdGgtYm9vc3Q9L3Vzci9sb2NhbAotCi1Ob3RlIHRoYXQgYnkgZGVmYXVsdCB0aGUgdGhyaWZ0IEMrKyBsaWJyYXJ5IGlzIHR5cGljYWxseSBidWlsdCB3aXRoIGRlYnVnZ2luZwotc3ltYm9scyBpbmNsdWRlZC4gSWYgeW91IHdhbnQgdG8gY3VzdG9taXplIHRoZXNlIG9wdGlvbnMgeW91IHNob3VsZCB1c2UgdGhlCi1DWFhGTEFHUyBvcHRpb24gaW4gY29uZmlndXJlLCBhcyBzdWNoOgotCi0gICAgICAgIC4vY29uZmlndXJlIENYWEZMQUdTPSctZyAtTzInCi0gICAgICAgIC4vY29uZmlndXJlIENGTEFHUz0nLWcgLU8yJwotICAgICAgICAuL2NvbmZpZ3VyZSBDUFBGTEFHUz0nLURERUJVR19NWV9GRUFUVVJFJwotCi1SdW4gLi9jb25maWd1cmUgLS1oZWxwIHRvIHNlZSBvdGhlciBjb25maWd1cmF0aW9uIG9wdGlvbnMKLQotUGxlYXNlIGJlIGF3YXJlIHRoYXQgdGhlIFB5dGhvbiBsaWJyYXJ5IHdpbGwgaWdub3JlIHRoZSAtLXByZWZpeCBvcHRpb24KLWFuZCBqdXN0IGluc3RhbGwgd2hlcmV2ZXIgUHl0aG9uJ3MgZGlzdHV0aWxzIHB1dHMgaXQgKHVzdWFsbHkgYWxvbmcKLXRoZSBsaW5lcyBvZiAvdXNyL2xpYi9weXRob25YLlkvc2l0ZS1wYWNrYWdlcy8pLiAgSWYgeW91IG5lZWQgdG8gY29udHJvbAotd2hlcmUgdGhlIFB5dGhvbiBtb2R1bGVzIGFyZSBpbnN0YWxsZWQsIHNldCB0aGUgUFlfUFJFRklYIHZhcmlhYmxlLgotKERFU1RESVIgaXMgcmVzcGVjdGVkIGZvciBQeXRob24gYW5kIEMrKy4pCi0KLU1ha2UgdGhyaWZ0OgotCi0JbWFrZQotCi1Gcm9tIHRoZSB0b3AgZGlyZWN0b3J5LCBiZWNvbWUgc3VwZXJ1c2VyIGFuZCBkbzoKLQotCW1ha2UgaW5zdGFsbAotCi1Ob3RlIHRoYXQgc29tZSBsYW5ndWFnZSBwYWNrYWdlcyBtdXN0IGJlIGluc3RhbGxlZCBtYW51YWxseSB1c2luZyBidWlsZCB0b29scwotYmV0dGVyIHN1aXRlZCB0byB0aG9zZSBsYW5ndWFnZXMgKGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgdGhpcyBhcHBsaWVzCi10byBKYXZhLCBSdWJ5LCBQSFApLgotCi1Mb29rIGZvciB0aGUgUkVBRE1FIGZpbGUgaW4gdGhlIGxpYi88bGFuZ3VhZ2U+LyBmb2xkZXIgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUKLWluc3RhbGxhdGlvbiBvZiBlYWNoIGxhbmd1YWdlIGxpYnJhcnkgcGFja2FnZS4KZGlmZiAtLWdpdCBhL1JFQURNRS5tZCBiL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDllNmUxCi0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTkyIEBACitBcGFjaGUgVGhyaWZ0Cis9PT09PT09PT09PT09CisKK0ludHJvZHVjdGlvbgorPT09PT09PT09PT09CisKK1RocmlmdCBpcyBhIGxpZ2h0d2VpZ2h0LCBsYW5ndWFnZS1pbmRlcGVuZGVudCBzb2Z0d2FyZSBzdGFjayB3aXRoIGFuCithc3NvY2lhdGVkIGNvZGUgZ2VuZXJhdGlvbiBtZWNoYW5pc20gZm9yIHBvaW50LXRvLXBvaW50IFJQQy4gVGhyaWZ0IHByb3ZpZGVzIAorY2xlYW4gYWJzdHJhY3Rpb25zIGZvciBkYXRhIHRyYW5zcG9ydCwgZGF0YSBzZXJpYWxpemF0aW9uLCBhbmQgYXBwbGljYXRpb24KK2xldmVsIHByb2Nlc3NpbmcuIFRoZSBjb2RlIGdlbmVyYXRpb24gc3lzdGVtIHRha2VzIGEgc2ltcGxlIGRlZmluaXRpb24KK2xhbmd1YWdlIGFzIGlucHV0IGFuZCBnZW5lcmF0ZXMgY29kZSBhY3Jvc3MgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIHRoYXQKK3VzZXMgdGhlIGFic3RyYWN0ZWQgc3RhY2sgdG8gYnVpbGQgaW50ZXJvcGVyYWJsZSBSUEMgY2xpZW50cyBhbmQgc2VydmVycy4KKworIVtBcGFjaGUgVGhyaWZ0IExheWVyZWQgQXJjaGl0ZWN0dXJlXShkb2MvaW1hZ2VzL3RocmlmdC1sYXllcnMucG5nKQorCitUaHJpZnQgbWFrZXMgaXQgZWFzeSBmb3IgcHJvZ3JhbXMgd3JpdHRlbiBpbiBkaWZmZXJlbnQgcHJvZ3JhbW1pbmcKK2xhbmd1YWdlcyB0byBzaGFyZSBkYXRhIGFuZCBjYWxsIHJlbW90ZSBwcm9jZWR1cmVzLiAgV2l0aCBzdXBwb3J0IAorZm9yIFsyNSBwcm9ncmFtbWluZyBsYW5ndWFnZXNdKExBTkdVQUdFUy5tZCksIGNoYW5jZXMgYXJlIFRocmlmdCAKK3N1cHBvcnRzIHRoZSBsYW5ndWFnZXMgdGhhdCB5b3UgY3VycmVudGx5IHVzZS4KKworVGhyaWZ0IGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBzdXBwb3J0IG5vbi1hdG9taWMgdmVyc2lvbiBjaGFuZ2VzCithY3Jvc3MgY2xpZW50IGFuZCBzZXJ2ZXIgY29kZS4KKworRm9yIG1vcmUgZGV0YWlscyBvbiBUaHJpZnQncyBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uLCBzZWUgdGhlIFRocmlmdAord2hpdGVwYXBlciBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgb3IgYXQgdGhlIFJFQURNRS5tZCBmaWxlCitpbiB5b3VyIHBhcnRpY3VsYXIgc3ViZGlyZWN0b3J5IG9mIGludGVyZXN0LgorCitTdGF0dXMKKz09PT09PQorCit8IEJyYW5jaCB8IFRyYXZpcyB8IEFwcHZleW9yIHwgQ292ZXJpdHkgU2NhbiB8IGNvZGVjb3YuaW8gfCBXZWJzaXRlIHwKK3wgOi0tLS0tIHwgOi0tLS0tIHwgOi0tLS0tLS0gfCA6LS0tLS0tLS0tLS0tIHwgOi0tLS0tLS0tLSB8IDotLS0tLS0gfAorfCBbYG1hc3RlcmBdKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L3RyZWUvbWFzdGVyKSB8IFshW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2FwYWNoZS90aHJpZnQuc3ZnP2JyYW5jaD1tYXN0ZXIpXShodHRwczovL3RyYXZpcy1jaS5vcmcvYXBhY2hlL3RocmlmdCkgfCBbIVtCdWlsZCBzdGF0dXNdKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL2FwaS9wcm9qZWN0cy9zdGF0dXMvZ2l0aHViL2FwYWNoZS90aHJpZnQ/YnJhbmNoPW1hc3RlciZzdmc9dHJ1ZSldKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3QvQXBhY2hlU29mdHdhcmVGb3VuZGF0aW9uL3RocmlmdC9oaXN0b3J5KSB8IFshW0NvdmVyaXR5IFNjYW4gQnVpbGQgU3RhdHVzXShodHRwczovL3NjYW4uY292ZXJpdHkuY29tL3Byb2plY3RzLzEzNDUvYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9zY2FuLmNvdmVyaXR5LmNvbS9wcm9qZWN0cy90aHJpZnQpIHwgfCBbIVtXZWJzaXRlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL29mZmljaWFsLXdlYnNpdGUtYnJpZ2h0Z3JlZW4uc3ZnKV0oaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZy8pIHwKKworUmVsZWFzZXMKKz09PT09PT09CisKK1RocmlmdCBkb2VzIG5vdCBtYWludGFpbiBhIHNwZWNpZmljIHJlbGVhc2UgY2FsZW5kYXIgYXQgdGhpcyB0aW1lLiAgCisKK1dlIHN0cml2ZSB0byByZWxlYXNlIHR3aWNlIHllYXJseS4gIERvd25sb2FkIHRoZSBbY3VycmVudCByZWxlYXNlXShodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvZG93bmxvYWQpLgorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitQcm9qZWN0IEhpZXJhcmNoeQorPT09PT09PT09PT09PT09PT0KKwordGhyaWZ0LworCisgIGNvbXBpbGVyLworCisgICAgQ29udGFpbnMgdGhlIFRocmlmdCBjb21waWxlciwgaW1wbGVtZW50ZWQgaW4gQysrLgorCisgIGxpYi8KKworICAgIENvbnRhaW5zIHRoZSBUaHJpZnQgc29mdHdhcmUgbGlicmFyeSBpbXBsZW1lbnRhdGlvbiwgc3ViZGl2aWRlZCBieQorICAgIGxhbmd1YWdlIG9mIGltcGxlbWVudGF0aW9uLgorCisgICAgY3BwLworICAgIGdvLworICAgIGphdmEvCisgICAgcGhwLworICAgIHB5LworICAgIHJiLworICAgIC4uLgorCisgIHRlc3QvCisKKyAgICBDb250YWlucyBzYW1wbGUgVGhyaWZ0IGZpbGVzIGFuZCB0ZXN0IGNvZGUgYWNyb3NzIHRoZSB0YXJnZXQgcHJvZ3JhbW1pbmcKKyAgICBsYW5ndWFnZXMuCisKKyAgdHV0b3JpYWwvCisKKyAgICBDb250YWlucyBhIGJhc2ljIHR1dG9yaWFsIHRoYXQgd2lsbCB0ZWFjaCB5b3UgaG93IHRvIGRldmVsb3Agc29mdHdhcmUKKyAgICB1c2luZyBUaHJpZnQuCisKK0RldmVsb3BtZW50Cis9PT09PT09PT09PQorCitUbyBidWlsZCB0aGUgc2FtZSB3YXkgVHJhdmlzIENJIGJ1aWxkcyB0aGUgcHJvamVjdCB5b3Ugc2hvdWxkIHVzZSBkb2NrZXIuCitXZSBoYXZlIFtjb21wcmVoZW5zaXZlIGJ1aWxkaW5nIGluc3RydWN0aW9ucyBmb3IgZG9ja2VyXShidWlsZC9kb2NrZXIvUkVBRE1FLm1kKS4KKworUmVxdWlyZW1lbnRzCis9PT09PT09PT09PT0KKworU2VlIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9kb2NzL2luc3RhbGwgZm9yIGEgbGlzdCBvZiBidWlsZCByZXF1aXJlbWVudHMgKG1heSBiZSBzdGFsZSkuICBBbHRlcm5hdGl2ZWx5IHNlZSB0aGUgZG9ja2VyIGJ1aWxkIGVudmlyb25tZW50cyBmb3IgYSBsaXN0IG9mIHByZXJlcXVpc2l0ZXMuCisKK1Jlc291cmNlcworPT09PT09PT09CisKK01vcmUgaW5mb3JtYXRpb24gYWJvdXQgVGhyaWZ0IGNhbiBiZSBvYnRhaW5lZCBvbiB0aGUgVGhyaWZ0IHdlYnBhZ2UgYXQ6CisKKyAgICAgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCisKK0Fja25vd2xlZGdtZW50cworPT09PT09PT09PT09PT09CisKK1RocmlmdCB3YXMgaW5zcGlyZWQgYnkgcGlsbGFyLCBhIGxpZ2h0d2VpZ2h0IFJQQyB0b29sIHdyaXR0ZW4gYnkgQWRhbSBEJ0FuZ2VsbywKK2FuZCBhbHNvIGJ5IEdvb2dsZSdzIHByb3RvY29sIGJ1ZmZlcnMuCisKK0luc3RhbGxhdGlvbgorPT09PT09PT09PT09CisKK0lmIHlvdSBhcmUgYnVpbGRpbmcgZnJvbSB0aGUgZmlyc3QgdGltZSBvdXQgb2YgdGhlIHNvdXJjZSByZXBvc2l0b3J5LCB5b3Ugd2lsbAorbmVlZCB0byBnZW5lcmF0ZSB0aGUgY29uZmlndXJlIHNjcmlwdHMuICAoVGhpcyBpcyBub3QgbmVjZXNzYXJ5IGlmIHlvdQorZG93bmxvYWRlZCBhIHRhcmJhbGwuKSAgRnJvbSB0aGUgdG9wIGRpcmVjdG9yeSwgZG86CisKKyAgICAuL2Jvb3RzdHJhcC5zaAorCitPbmNlIHRoZSBjb25maWd1cmUgc2NyaXB0cyBhcmUgZ2VuZXJhdGVkLCB0aHJpZnQgY2FuIGJlIGNvbmZpZ3VyZWQuCitGcm9tIHRoZSB0b3AgZGlyZWN0b3J5LCBkbzoKKworICAgIC4vY29uZmlndXJlCisKK1lvdSBtYXkgbmVlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgYm9vc3QgZmlsZXMgZXhwbGljaXRseS4KK0lmIHlvdSBpbnN0YWxsZWQgYm9vc3QgaW4gL3Vzci9sb2NhbCwgeW91IHdvdWxkIHJ1biBjb25maWd1cmUgYXMgZm9sbG93czoKKworICAgIC4vY29uZmlndXJlIC0td2l0aC1ib29zdD0vdXNyL2xvY2FsCisKK05vdGUgdGhhdCBieSBkZWZhdWx0IHRoZSB0aHJpZnQgQysrIGxpYnJhcnkgaXMgdHlwaWNhbGx5IGJ1aWx0IHdpdGggZGVidWdnaW5nCitzeW1ib2xzIGluY2x1ZGVkLiBJZiB5b3Ugd2FudCB0byBjdXN0b21pemUgdGhlc2Ugb3B0aW9ucyB5b3Ugc2hvdWxkIHVzZSB0aGUKK0NYWEZMQUdTIG9wdGlvbiBpbiBjb25maWd1cmUsIGFzIHN1Y2g6CisKKyAgICAuL2NvbmZpZ3VyZSBDWFhGTEFHUz0nLWcgLU8yJworICAgIC4vY29uZmlndXJlIENGTEFHUz0nLWcgLU8yJworICAgIC4vY29uZmlndXJlIENQUEZMQUdTPSctRERFQlVHX01ZX0ZFQVRVUkUnCisKK1RvIGVuYWJsZSBnY292IHJlcXVpcmVkIG9wdGlvbnMgLWZwcm9maWxlLWFyY3MgLWZ0ZXN0LWNvdmVyYWdlIGVuYWJsZSB0aGVtOgorCisgICAgLi9jb25maWd1cmUgIC0tZW5hYmxlLWNvdmVyYWdlCisKK1J1biAuL2NvbmZpZ3VyZSAtLWhlbHAgdG8gc2VlIG90aGVyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworCitQbGVhc2UgYmUgYXdhcmUgdGhhdCB0aGUgUHl0aG9uIGxpYnJhcnkgd2lsbCBpZ25vcmUgdGhlIC0tcHJlZml4IG9wdGlvbgorYW5kIGp1c3QgaW5zdGFsbCB3aGVyZXZlciBQeXRob24ncyBkaXN0dXRpbHMgcHV0cyBpdCAodXN1YWxseSBhbG9uZwordGhlIGxpbmVzIG9mIC91c3IvbGliL3B5dGhvblguWS9zaXRlLXBhY2thZ2VzLykuICBJZiB5b3UgbmVlZCB0byBjb250cm9sCit3aGVyZSB0aGUgUHl0aG9uIG1vZHVsZXMgYXJlIGluc3RhbGxlZCwgc2V0IHRoZSBQWV9QUkVGSVggdmFyaWFibGUuCisoREVTVERJUiBpcyByZXNwZWN0ZWQgZm9yIFB5dGhvbiBhbmQgQysrLikKKworTWFrZSB0aHJpZnQ6CisKKwltYWtlCisKK0Zyb20gdGhlIHRvcCBkaXJlY3RvcnksIGJlY29tZSBzdXBlcnVzZXIgYW5kIGRvOgorCisJbWFrZSBpbnN0YWxsCisKK05vdGUgdGhhdCBzb21lIGxhbmd1YWdlIHBhY2thZ2VzIG11c3QgYmUgaW5zdGFsbGVkIG1hbnVhbGx5IHVzaW5nIGJ1aWxkIHRvb2xzCitiZXR0ZXIgc3VpdGVkIHRvIHRob3NlIGxhbmd1YWdlcyAoYXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLCB0aGlzIGFwcGxpZXMKK3RvIEphdmEsIFJ1YnksIFBIUCkuCisKK0xvb2sgZm9yIHRoZSBSRUFETUUubWQgZmlsZSBpbiB0aGUgbGliLzxsYW5ndWFnZT4vIGZvbGRlciBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZQoraW5zdGFsbGF0aW9uIG9mIGVhY2ggbGFuZ3VhZ2UgbGlicmFyeSBwYWNrYWdlLgorCitUZXN0aW5nCis9PT09PT09CisKK1RoZXJlIGFyZSBhIGxhcmdlIG51bWJlciBvZiBjbGllbnQgbGlicmFyeSB0ZXN0cyB0aGF0IGNhbiBhbGwgYmUgcnVuCitmcm9tIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorCisgICAgICAgICAgbWFrZSAtayBjaGVjaworCitUaGlzIHdpbGwgbWFrZSBhbGwgb2YgdGhlIGxpYnJhcmllcyAoYXMgbmVjZXNzYXJ5KSwgYW5kIHJ1biB0aHJvdWdoCit0aGUgdW5pdCB0ZXN0cyBkZWZpbmVkIGluIGVhY2ggb2YgdGhlIGNsaWVudCBsaWJyYXJpZXMuIElmIGEgc2luZ2xlCitsYW5ndWFnZSBmYWlscywgdGhlIG1ha2UgY2hlY2sgd2lsbCBjb250aW51ZSBvbiBhbmQgcHJvdmlkZSBhIHN5bm9wc2lzCithdCB0aGUgZW5kLgorCitUbyBydW4gdGhlIGNyb3NzLWxhbmd1YWdlIHRlc3Qgc3VpdGUsIHBsZWFzZSBydW46CisKKyAgICAgICAgICBtYWtlIGNyb3NzCisKK1RoaXMgd2lsbCBydW4gYSBzZXQgb2YgdGVzdHMgdGhhdCB1c2UgZGlmZmVyZW50IGxhbmd1YWdlIGNsaWVudHMgYW5kCitzZXJ2ZXJzLgorCisKZGlmZiAtLWdpdCBhL1RocmlmdC1zd2lmdDMucG9kc3BlYyBiL1RocmlmdC1zd2lmdDMucG9kc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjZjMDBiCi0tLSAvZGV2L251bGwKKysrIGIvVGhyaWZ0LXN3aWZ0My5wb2RzcGVjCkBAIC0wLDAgKzEsMTYgQEAKK1BvZDo6U3BlYy5uZXcgZG8gfHN8CisgIHMubmFtZSAgICAgICAgICA9ICJUaHJpZnQtc3dpZnQzIgorICBzLnZlcnNpb24gICAgICAgPSAiMS4wLjAiCisgIHMuc3VtbWFyeSAgICAgICA9ICJBcGFjaGUgVGhyaWZ0IGlzIGEgbGlnaHR3ZWlnaHQsIGxhbmd1YWdlLWluZGVwZW5kZW50IHNvZnR3YXJlIHN0YWNrIHdpdGggYW4gYXNzb2NpYXRlZCBjb2RlIGdlbmVyYXRpb24gbWVjaGFuaXNtIGZvciBSUEMuIgorICBzLmRlc2NyaXB0aW9uICAgPSA8PC1ERVNDCitUaGUgQXBhY2hlIFRocmlmdCBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIG5ldHdvcmtlZCBzZXJ2aWNlcyBkZXZlbG9wbWVudCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseSBiZXR3ZWVuIG1hbnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLgorICAgICAgICAgICAgICAgICAgICBERVNDCisgIHMuaG9tZXBhZ2UgICAgICA9ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciCisgIHMubGljZW5zZSAgICAgICA9IHsgOnR5cGUgPT4gJ0FwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCcsIDp1cmwgPT4gJ2h0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAnIH0KKyAgcy5hdXRob3IgICAgICAgID0geyAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIiA9PiAiZGV2QHRocmlmdC5hcGFjaGUub3JnIiB9CisgIHMuaW9zLmRlcGxveW1lbnRfdGFyZ2V0ID0gJzkuMCcKKyAgcy5vc3guZGVwbG95bWVudF90YXJnZXQgPSAnMTAuMTAnCisgIHMucmVxdWlyZXNfYXJjICA9IHRydWUKKyAgcy5zb3VyY2UgICAgICAgID0geyA6Z2l0ID0+ICJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiLCA6dGFnID0+ICJ2MS4wLjAiIH0KKyAgcy5zb3VyY2VfZmlsZXMgID0gImxpYi9zd2lmdC9Tb3VyY2VzLyouc3dpZnQiCitlbmQKZGlmZiAtLWdpdCBhL1RocmlmdC5wb2RzcGVjIGIvVGhyaWZ0LnBvZHNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQwNmVlYwotLS0gL2Rldi9udWxsCisrKyBiL1RocmlmdC5wb2RzcGVjCkBAIC0wLDAgKzEsMTggQEAKK1BvZDo6U3BlYy5uZXcgZG8gfHN8CisgIHMubmFtZSAgICAgICAgICA9ICJUaHJpZnQiCisgIHMudmVyc2lvbiAgICAgICA9ICIxLjAuMCIKKyAgcy5zdW1tYXJ5ICAgICAgID0gIkFwYWNoZSBUaHJpZnQgaXMgYSBsaWdodHdlaWdodCwgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgc29mdHdhcmUgc3RhY2sgd2l0aCBhbiBhc3NvY2lhdGVkIGNvZGUgZ2VuZXJhdGlvbiBtZWNoYW5pc20gZm9yIFJQQy4iCisgIHMuZGVzY3JpcHRpb24gICA9IDw8LURFU0MKK1RoZSBBcGFjaGUgVGhyaWZ0IHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNvZnR3YXJlIGZyYW1ld29yayBmb3IgbmV0d29ya2VkIHNlcnZpY2VzIGRldmVsb3BtZW50IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5IGJldHdlZW4gbWFueSBwcm9ncmFtbWluZyBsYW5ndWFnZXMuCisgICAgICAgICAgICAgICAgICAgIERFU0MKKyAgcy5ob21lcGFnZSAgICAgID0gImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKKyAgcy5saWNlbnNlICAgICAgID0geyA6dHlwZSA9PiAnQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wJywgOnVybCA9PiAnaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCcgfQorICBzLmF1dGhvciAgICAgICAgPSB7ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMiID0+ICJkZXZAdGhyaWZ0LmFwYWNoZS5vcmciIH0KKyAgcy5yZXF1aXJlc19hcmMgID0gdHJ1ZQorICBzLmlvcy5kZXBsb3ltZW50X3RhcmdldCA9ICc3LjAnCisgIHMub3N4LmRlcGxveW1lbnRfdGFyZ2V0ID0gJzEwLjgnCisgIHMuaW9zLmZyYW1ld29yayA9ICdDRk5ldHdvcmsnCisgIHMub3N4LmZyYW1ld29yayA9ICdDb3JlU2VydmljZXMnCisgIHMuc291cmNlICAgICAgICA9IHsgOmdpdCA9PiAiaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IiwgOnRhZyA9PiAidjEuMC4wIiB9CisgIHMuc291cmNlX2ZpbGVzICA9ICdsaWIvY29jb2Evc3JjLyoqLyoue2gsbSxzd2lmdH0nCitlbmQKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYWNfcHJvZ19iaXNvbi5tNCBiL2FjbG9jYWwvYWNfcHJvZ19iaXNvbi5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDExOThiCi0tLSAvZGV2L251bGwKKysrIGIvYWNsb2NhbC9hY19wcm9nX2Jpc29uLm00CkBAIC0wLDAgKzEsNTQgQEAKK2RubAorZG5sIENoZWNrIEJpc29uIHZlcnNpb24KK2RubCBBQ19QUk9HX0JJU09OKFtNSU5fVkVSU0lPTj0yLjRdKQorZG5sCitkbmwgV2lsbCBkZWZpbmUgQklTT05fVVNFX1BBUlNFUl9IX0VYVEVOU0lPTiBpZiBBdXRvbWFrZSBpcyA8IDEuMTEKK2RubCBmb3IgdXNlIHdpdGggLmggaW5jbHVkZXMuCitkbmwKKworQUNfREVGVU4oW0FDX1BST0dfQklTT05dLCBbCitpZiB0ZXN0ICJ4JDEiID0gIngiIDsgdGhlbgorICBiaXNvbl9yZXF1aXJlZF92ZXJzaW9uPSIyLjQiCitlbHNlCisgIGJpc29uX3JlcXVpcmVkX3ZlcnNpb249IiQxIgorZmkKKworQUNfQ0hFQ0tfUFJPRyhoYXZlX3Byb2dfYmlzb24sIFtiaXNvbl0sIFt5ZXNdLFtub10pCisKK0FDX0RFRklORV9VTlFVT1RFRChbQklTT05fVkVSU0lPTl0sIFswLjBdLCBbQmlzb24gdmVyc2lvbiBpZiBiaXNvbiBpcyBub3QgYXZhaWxhYmxlXSkKKworI0RvIG5vdCB1c2UgKi5oIGV4dGVuc2lvbiBmb3IgcGFyc2VyIGhlYWRlciBmaWxlcywgdXNlIG5ld2VyICouaGgKK2Jpc29uX3VzZV9wYXJzZXJfaF9leHRlbnNpb249ZmFsc2UKKworaWYgdGVzdCAiJGhhdmVfcHJvZ19iaXNvbiIgPSAieWVzIiA7IHRoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgYmlzb24gdmVyc2lvbiA+PSAkYmlzb25fcmVxdWlyZWRfdmVyc2lvbl0pCisgIGJpc29uX3ZlcnNpb249YGJpc29uIC0tdmVyc2lvbiB8IGhlYWQgLW4gMSB8IGN1dCAnLWQgJyAtZiA0YAorICBBQ19ERUZJTkVfVU5RVU9URUQoW0JJU09OX1ZFUlNJT05dLCBbJGJpc29uX3ZlcnNpb25dLCBbRGVmaW5lcyBiaXNvbiB2ZXJzaW9uXSkKKyAgaWYgdGVzdCAiJGJpc29uX3ZlcnNpb24iIFw8ICIkYmlzb25fcmVxdWlyZWRfdmVyc2lvbiIgOyB0aGVuCisgICAgQklTT049OgorICAgIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICBBQ19NU0dfRVJST1IoW0Jpc29uIHZlcnNpb24gJGJpc29uX3JlcXVpcmVkX3ZlcnNpb24gb3IgaGlnaGVyIG11c3QgYmUgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0hXSkKKyAgZWxzZQorICAgIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgQklTT049Ymlzb24KKyAgICBBQ19TVUJTVChCSVNPTikKKworICAgICNWZXJpZnkgYXV0b21ha2UgdmVyc2lvbiAxLjExIGhlYWRlcnMgZm9yIHl5IGZpbGVzIGFyZSAuaCwgPiAxLjEyIHVzZXMgLmhoCisgICAgYXV0b21ha2VfdmVyc2lvbj1gYXV0b21ha2UgLS12ZXJzaW9uIHwgaGVhZCAtbiAxIHwgY3V0ICctZCAnIC1mIDRgCisgICAgQUNfREVGSU5FX1VOUVVPVEVEKFtBVVRPTUFLRV9WRVJTSU9OXSwgWyRhdXRvbWFrZV92ZXJzaW9uXSwgW0RlZmluZXMgYXV0b21ha2UgdmVyc2lvbl0pCisKKyAgICBpZiB0ZXN0ICIkYXV0b21ha2VfdmVyc2lvbiIgXDwgIjEuMTIiIDsgdGhlbgorICAgICAgI1VzZSAqLmggZXh0ZW5zaW9uIGZvciBwYXJzZXIgaGVhZGVyIGZpbGUKKyAgICAgIGJpc29uX3VzZV9wYXJzZXJfaF9leHRlbnNpb249dHJ1ZQorICAgICAgZWNobyAiQXV0b21ha2UgdmVyc2lvbiA8IDEuMTIiCisgICAgICBBQ19ERUZJTkUoW0JJU09OX1VTRV9QQVJTRVJfSF9FWFRFTlNJT05dLCBbMV0sIFtVc2UgKi5oIGV4dGVuc2lvbiBmb3IgcGFyc2VyIGhlYWRlciBmaWxlXSkKKyAgICBmaQorICBmaQorZWxzZQorICBCSVNPTj06CisgIEFDX01TR19SRVNVTFQoW05PXSkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKFtCSVNPTl9VU0VfUEFSU0VSX0hfRVhURU5TSU9OXSwgW3Rlc3QgeCRiaXNvbl91c2VfcGFyc2VyX2hfZXh0ZW5zaW9uID0geHRydWVdKQorQUNfU1VCU1QoQklTT04pCitdKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9ib29zdF9iYXNlLm00IGIvYWNsb2NhbC9heF9ib29zdF9iYXNlLm00CmluZGV4IDU4OTRkMGMuLmQ1NDAzOTUgMTAwNjQ0Ci0tLSBhL2FjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNAorKysgYi9hY2xvY2FsL2F4X2Jvb3N0X2Jhc2UubTQKQEAgLTEsMTcgKzEsMTkgQEAKLSMjIyMjIGh0dHA6Ly9hdXRvY29uZi1hcmNoaXZlLmNyeXAudG8vYXhfYm9vc3RfYmFzZS5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9ib29zdF9iYXNlLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjCiAjIFNZTk9QU0lTCiAjCi0jICAgQVhfQk9PU1RfQkFTRShbTUlOSU1VTS1WRVJTSU9OXSkKKyMgICBBWF9CT09TVF9CQVNFKFtNSU5JTVVNLVZFUlNJT05dLCBbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQogIwogIyBERVNDUklQVElPTgogIwogIyAgIFRlc3QgZm9yIHRoZSBCb29zdCBDKysgbGlicmFyaWVzIG9mIGEgcGFydGljdWxhciB2ZXJzaW9uIChvciBuZXdlcikKICMKLSMgICBJZiBubyBwYXRoIHRvIHRoZSBpbnN0YWxsZWQgYm9vc3QgbGlicmFyeSBpcyBnaXZlbiB0aGUgbWFjcm8KLSMgICBzZWFyY2hzIHVuZGVyIC91c3IsIC91c3IvbG9jYWwsIC9vcHQgYW5kIC9vcHQvbG9jYWwgYW5kIGV2YWx1YXRlcwotIyAgIHRoZSAkQk9PU1RfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gRnVydGhlciBkb2N1bWVudGF0aW9uIGlzCi0jICAgYXZhaWxhYmxlIGF0IDxodHRwOi8vcmFuZHNwcmluZ2VyLmRlL2Jvb3N0L2luZGV4Lmh0bWw+LgorIyAgIElmIG5vIHBhdGggdG8gdGhlIGluc3RhbGxlZCBib29zdCBsaWJyYXJ5IGlzIGdpdmVuIHRoZSBtYWNybyBzZWFyY2hzCisjICAgdW5kZXIgL3VzciwgL3Vzci9sb2NhbCwgL29wdCBhbmQgL29wdC9sb2NhbCBhbmQgZXZhbHVhdGVzIHRoZQorIyAgICRCT09TVF9ST09UIGVudmlyb25tZW50IHZhcmlhYmxlLiBGdXJ0aGVyIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGF0CisjICAgPGh0dHA6Ly9yYW5kc3ByaW5nZXIuZGUvYm9vc3QvaW5kZXguaHRtbD4uCiAjCiAjICAgVGhpcyBtYWNybyBjYWxsczoKICMKQEAgLTIxLDE4NyArMjMsMjc5IEBACiAjCiAjICAgICBIQVZFX0JPT1NUCiAjCi0jIExBU1QgTU9ESUZJQ0FUSU9OCisjIExJQ0VOU0UKICMKLSMgICAyMDA3LTA3LTI4Ci0jICAgTW9kaWZpZWQgZm9yIHVzZSBpbiBUaHJpZnQKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggVGhvbWFzIFBvcnNjaGJlcmcgPHRob21hc0ByYW5kc3ByaW5nZXIuZGU+CisjICAgQ29weXJpZ2h0IChjKSAyMDA5IFBldGVyIEFkb2xwaHMKICMKLSMgQ09QWUxFRlQKLSMKLSMgICBDb3B5cmlnaHQgKGMpIDIwMDcgVGhvbWFzIFBvcnNjaGJlcmcgPHRob21hc0ByYW5kc3ByaW5nZXIuZGU+Ci0jCi0jICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0Ci0jICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkCi0jICAgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQorIyAgIHdhcnJhbnR5LgorCisjc2VyaWFsIDQ1CisKKyMgZXhhbXBsZSBib29zdCBwcm9ncmFtIChuZWVkIHRvIHBhc3MgdmVyc2lvbikKK200X2RlZmluZShbX0FYX0JPT1NUX0JBU0VfUFJPR1JBTV0sCisgICAgICAgICAgW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorXV0sW1sKKyh2b2lkKSAoKHZvaWQpc2l6ZW9mKGNoYXJbMSAtIDIqISEoKEJPT1NUX1ZFUlNJT04pIDwgKCQxKSldKSk7CitdXSldKQogCiBBQ19ERUZVTihbQVhfQk9PU1RfQkFTRV0sCiBbCiBBQ19BUkdfV0lUSChbYm9vc3RdLAotCUFTX0hFTFBfU1RSSU5HKFstLXdpdGgtYm9vc3RAPDpAPURJUkA6PkBdLCBbdXNlIGJvb3N0IChkZWZhdWx0IGlzIHllcykgLSBpdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5IHRoZSByb290IGRpcmVjdG9yeSBmb3IgYm9vc3QgKG9wdGlvbmFsKV0pLAotCVsKLSAgICBpZiB0ZXN0ICIkd2l0aHZhbCIgPSAibm8iOyB0aGVuCi0JCXdhbnRfYm9vc3Q9Im5vIgotICAgIGVsaWYgdGVzdCAiJHdpdGh2YWwiID0gInllcyI7IHRoZW4KLSAgICAgICAgd2FudF9ib29zdD0ieWVzIgotICAgICAgICBhY19ib29zdF9wYXRoPSIiCi0gICAgZWxzZQotCSAgICB3YW50X2Jvb3N0PSJ5ZXMiCi0gICAgICAgIGFjX2Jvb3N0X3BhdGg9IiR3aXRodmFsIgotCWZpCisgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWJvb3N0QDw6QD1BUkdAOj5AXSwKKyAgICBbdXNlIEJvb3N0IGxpYnJhcnkgZnJvbSBhIHN0YW5kYXJkIGxvY2F0aW9uIChBUkc9eWVzKSwKKyAgICAgZnJvbSB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIChBUkc9PHBhdGg+KSwKKyAgICAgb3IgZGlzYWJsZSBpdCAoQVJHPW5vKQorICAgICBAPDpAQVJHPXllc0A6PkAgXSldLAorICAgIFsKKyAgICAgQVNfQ0FTRShbJHdpdGh2YWxdLAorICAgICAgIFtub10sW3dhbnRfYm9vc3Q9Im5vIjtfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoPSIiXSwKKyAgICAgICBbeWVzXSxbd2FudF9ib29zdD0ieWVzIjtfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoPSIiXSwKKyAgICAgICBbd2FudF9ib29zdD0ieWVzIjtfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoPSIkd2l0aHZhbCJdKQogICAgIF0sCiAgICAgW3dhbnRfYm9vc3Q9InllcyJdKQogCi1pZiB0ZXN0ICJ4JHdhbnRfYm9vc3QiID0gInh5ZXMiOyB0aGVuCi0JYm9vc3RfbGliX3ZlcnNpb25fcmVxPWlmZWxzZShbJDFdLCAsMS4yMC4wLCQxKQotCWJvb3N0X2xpYl92ZXJzaW9uX3JlcV9zaG9ydGVuPWBleHByICRib29zdF9saWJfdmVyc2lvbl9yZXEgOiAnXChbWzAtOV1dKlwuW1swLTldXSpcKSdgCi0JYm9vc3RfbGliX3ZlcnNpb25fcmVxX21ham9yPWBleHByICRib29zdF9saWJfdmVyc2lvbl9yZXEgOiAnXChbWzAtOV1dKlwpJ2AKLQlib29zdF9saWJfdmVyc2lvbl9yZXFfbWlub3I9YGV4cHIgJGJvb3N0X2xpYl92ZXJzaW9uX3JlcSA6ICdbWzAtOV1dKlwuXChbWzAtOV1dKlwpJ2AKLQlib29zdF9saWJfdmVyc2lvbl9yZXFfc3ViX21pbm9yPWBleHByICRib29zdF9saWJfdmVyc2lvbl9yZXEgOiAnW1swLTldXSpcLltbMC05XV0qXC5cKFtbMC05XV0qXCknYAotCWlmIHRlc3QgIngkYm9vc3RfbGliX3ZlcnNpb25fcmVxX3N1Yl9taW5vciIgPSAieCIgOyB0aGVuCi0JCWJvb3N0X2xpYl92ZXJzaW9uX3JlcV9zdWJfbWlub3I9IjAiCi0gICAgCWZpCi0JV0FOVF9CT09TVF9WRVJTSU9OPWBleHByICRib29zdF9saWJfdmVyc2lvbl9yZXFfbWFqb3IgXCogMTAwMDAwIFwrICAkYm9vc3RfbGliX3ZlcnNpb25fcmVxX21pbm9yIFwqIDEwMCBcKyAkYm9vc3RfbGliX3ZlcnNpb25fcmVxX3N1Yl9taW5vcmAKLQlBQ19NU0dfQ0hFQ0tJTkcoZm9yIGJvb3N0bGliID49ICRib29zdF9saWJfdmVyc2lvbl9yZXEpCi0Jc3VjY2VlZGVkPW5vCiAKLQlkbmwgZmlyc3Qgd2UgY2hlY2sgdGhlIHN5c3RlbSBsb2NhdGlvbiBmb3IgYm9vc3QgbGlicmFyaWVzCi0JZG5sIHRoaXMgbG9jYXRpb24gaXN0IGNob3NlbiBpZiBib29zdCBsaWJyYXJpZXMgYXJlIGluc3RhbGxlZCB3aXRoIHRoZSAtLWxheW91dD1zeXN0ZW0gb3B0aW9uCi0JZG5sIG9yIGlmIHlvdSBpbnN0YWxsIGJvb3N0IHdpdGggUlBNCi0JaWYgdGVzdCAiJGFjX2Jvb3N0X3BhdGgiICE9ICIiOyB0aGVuCi0JCUJPT1NUX0xERkxBR1M9Ii1MJGFjX2Jvb3N0X3BhdGgvbGliIgotCQlCT09TVF9DUFBGTEFHUz0iLUkkYWNfYm9vc3RfcGF0aC9pbmNsdWRlIgotCQlCT09TVF9ST09UX1BBVEg9IiRhY19ib29zdF9wYXRoIgotCWVsc2UKLQkJZm9yIGFjX2Jvb3N0X3BhdGhfdG1wIGluIC91c3IgL3Vzci9sb2NhbCAvb3B0IC9vcHQvbG9jYWwgOyBkbwotCQkJaWYgdGVzdCAtZCAiJGFjX2Jvb3N0X3BhdGhfdG1wL2luY2x1ZGUvYm9vc3QiICYmIHRlc3QgLXIgIiRhY19ib29zdF9wYXRoX3RtcC9pbmNsdWRlL2Jvb3N0IjsgdGhlbgotCQkJCUJPT1NUX0xERkxBR1M9Ii1MJGFjX2Jvb3N0X3BhdGhfdG1wL2xpYiIKLQkJCQlCT09TVF9DUFBGTEFHUz0iLUkkYWNfYm9vc3RfcGF0aF90bXAvaW5jbHVkZSIKLQkJCQlCT09TVF9ST09UX1BBVEg9IiRhY19ib29zdF9wYXRoX3RtcCIKLQkJCQlicmVhazsKLQkJCWZpCi0JCWRvbmUKLQlmaQorQUNfQVJHX1dJVEgoW2Jvb3N0LWxpYmRpcl0sCisgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWJvb3N0LWxpYmRpcj1MSUJfRElSXSwKKyAgICBbRm9yY2UgZ2l2ZW4gZGlyZWN0b3J5IGZvciBib29zdCBsaWJyYXJpZXMuCisgICAgIE5vdGUgdGhhdCB0aGlzIHdpbGwgb3ZlcnJpZGUgbGlicmFyeSBwYXRoIGRldGVjdGlvbiwKKyAgICAgc28gdXNlIHRoaXMgcGFyYW1ldGVyIG9ubHkgaWYgZGVmYXVsdCBsaWJyYXJ5IGRldGVjdGlvbiBmYWlscworICAgICBhbmQgeW91IGtub3cgZXhhY3RseSB3aGVyZSB5b3VyIGJvb3N0IGxpYnJhcmllcyBhcmUgbG9jYXRlZC5dKV0sCisgIFsKKyAgIEFTX0lGKFt0ZXN0IC1kICIkd2l0aHZhbCJdLAorICAgICAgICAgW19BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoPSIkd2l0aHZhbCJdLAorICAgIFtBQ19NU0dfRVJST1IoWy0td2l0aC1ib29zdC1saWJkaXIgZXhwZWN0ZWQgZGlyZWN0b3J5IG5hbWVdKV0pCisgIF0sCisgIFtfQVhfQk9PU1RfQkFTRV9ib29zdF9saWJfcGF0aD0iIl0pCiAKLQlDUFBGTEFHU19TQVZFRD0iJENQUEZMQUdTIgotCUNQUEZMQUdTPSIkQ1BQRkxBR1MgJEJPT1NUX0NQUEZMQUdTIgotCWV4cG9ydCBDUFBGTEFHUworQk9PU1RfTERGTEFHUz0iIgorQk9PU1RfQ1BQRkxBR1M9IiIKK0FTX0lGKFt0ZXN0ICJ4JHdhbnRfYm9vc3QiID0gInh5ZXMiXSwKKyAgICAgIFtfQVhfQk9PU1RfQkFTRV9SVU5ERVRFQ1QoWyQxXSxbJDJdLFskM10pXSkKK0FDX1NVQlNUKEJPT1NUX0NQUEZMQUdTKQorQUNfU1VCU1QoQk9PU1RfTERGTEFHUykKK10pCiAKLQlMREZMQUdTX1NBVkVEPSIkTERGTEFHUyIKLQlMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfTERGTEFHUyIKLQlleHBvcnQgTERGTEFHUwogCi0JZXhwb3J0IEJPT1NUX1JPT1RfUEFUSAorIyBjb252ZXJ0IGEgdmVyc2lvbiBzdHJpbmcgaW4gJDIgdG8gbnVtZXJpYyBhbmQgYWZmZWN0IHRvIHBvbHltb3JwaGljIHZhciAkMQorQUNfREVGVU4oW19BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05dLFsKKyAgQVNfSUYoW3Rlc3QgIngkMiIgPSAieCJdLFtfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcT0iMS4yMC4wIl0sW19BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxPSIkMiJdKQorICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9zaG9ydGVuPWBleHByICRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcSA6ICdcKFtbMC05XV0qXC5bWzAtOV1dKlwpJ2AKKyAgX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfbWFqb3I9YGV4cHIgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxIDogJ1woW1swLTldXSpcKSdgCisgIEFTX0lGKFt0ZXN0ICJ4JF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21ham9yIiA9ICJ4Il0sCisgICAgICAgIFtBQ19NU0dfRVJST1IoW1lvdSBzaG91bGQgYXQgbGVhc3Qgc3BlY2lmeSBsaWJib29zdCBtYWpvciB2ZXJzaW9uXSldKQorICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9taW5vcj1gZXhwciAkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXEgOiAnW1swLTldXSpcLlwoW1swLTldXSpcKSdgCisgIEFTX0lGKFt0ZXN0ICJ4JF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21pbm9yIiA9ICJ4Il0sCisgICAgICAgIFtfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9taW5vcj0iMCJdKQorICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9zdWJfbWlub3I9YGV4cHIgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxIDogJ1tbMC05XV0qXC5bWzAtOV1dKlwuXChbWzAtOV1dKlwpJ2AKKyAgQVNfSUYoW3Rlc3QgIlgkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfc3ViX21pbm9yIiA9ICJYIl0sCisgICAgICAgIFtfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9zdWJfbWlub3I9IjAiXSkKKyAgX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9SRVQ9YGV4cHIgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21ham9yIFwqIDEwMDAwMCBcKyAgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21pbm9yIFwqIDEwMCBcKyAkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfc3ViX21pbm9yYAorICBBU19WQVJfU0VUKCQxLCRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX1JFVCkKK10pCiAKLQlBQ19MQU5HX1BVU0goQysrKQotICAgICAJQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotCUAlOkBpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KLQldXSwgW1sKLQkjaWYgQk9PU1RfVkVSU0lPTiA+PSAkV0FOVF9CT09TVF9WRVJTSU9OCi0JLy8gRXZlcnl0aGluZyBpcyBva2F5Ci0JI2Vsc2UKLQkjICBlcnJvciBCb29zdCB2ZXJzaW9uIGlzIHRvbyBvbGQKLQkjZW5kaWYKLQldXSldLFsKK2RubCBSdW4gdGhlIGRldGVjdGlvbiBvZiBib29zdCBzaG91bGQgYmUgcnVuIG9ubHkgaWYgJHdhbnRfYm9vc3QKK0FDX0RFRlVOKFtfQVhfQk9PU1RfQkFTRV9SVU5ERVRFQ1RdLFsKKyAgICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OKFdBTlRfQk9PU1RfVkVSU0lPTixbJDFdKQorICAgIHN1Y2NlZWRlZD1ubworCisKKyAgICBBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pCisgICAgZG5sIE9uIDY0LWJpdCBzeXN0ZW1zIGNoZWNrIGZvciBzeXN0ZW0gbGlicmFyaWVzIGluIGJvdGggbGliNjQgYW5kIGxpYi4KKyAgICBkbmwgVGhlIGZvcm1lciBpcyBzcGVjaWZpZWQgYnkgRkhTLCBidXQgZS5nLiBEZWJpYW4gZG9lcyBub3QgYWRoZXJlIHRvCisgICAgZG5sIHRoaXMgKGFzIGl0IHJpc2VzIHByb2JsZW1zIGZvciBnZW5lcmljIG11bHRpLWFyY2ggc3VwcG9ydCkuCisgICAgZG5sIFRoZSBsYXN0IGVudHJ5IGluIHRoZSBsaXN0IGlzIGNob3NlbiBieSBkZWZhdWx0IHdoZW4gbm8gbGlicmFyaWVzCisgICAgZG5sIGFyZSBmb3VuZCwgZS5nLiB3aGVuIG9ubHkgaGVhZGVyLW9ubHkgbGlicmFyaWVzIGFyZSBpbnN0YWxsZWQhCisgICAgQVNfQ0FTRShbJHtob3N0X2NwdX1dLAorICAgICAgW3g4Nl82NF0sW2xpYnN1YmRpcnM9ImxpYjY0IGxpYngzMiBsaWIgbGliNjQiXSwKKyAgICAgIFtwcGM2NHxwb3dlcnBjNjR8czM5MHh8c3BhcmM2NHxhYXJjaDY0fHBwYzY0bGV8cG93ZXJwYzY0bGV8cmlzY3Y2NF0sW2xpYnN1YmRpcnM9ImxpYjY0IGxpYiBsaWI2NCJdLAorICAgICAgW2xpYnN1YmRpcnM9ImxpYiJdCisgICAgKQorCisgICAgZG5sIGFsbG93IGZvciByZWFsIG11bHRpLWFyY2ggcGF0aHMgZS5nLiAvdXNyL2xpYi94ODZfNjQtbGludXgtZ251LiBHaXZlCisgICAgZG5sIHRoZW0gcHJpb3JpdHkgb3ZlciB0aGUgb3RoZXIgcGF0aHMgc2luY2UsIGlmIGxpYnMgYXJlIGZvdW5kIHRoZXJlLCB0aGV5CisgICAgZG5sIGFyZSBhbG1vc3QgYXNzdXJlZGx5IHRoZSBvbmVzIGRlc2lyZWQuCisgICAgQVNfQ0FTRShbJHtob3N0X2NwdX1dLAorICAgICAgW2k/ODZdLFttdWx0aWFyY2hfbGlic3ViZGlyPSJsaWIvaTM4Ni0ke2hvc3Rfb3N9Il0sCisgICAgICBbbXVsdGlhcmNoX2xpYnN1YmRpcj0ibGliLyR7aG9zdF9jcHV9LSR7aG9zdF9vc30iXQorICAgICkKKworICAgIGRubCBmaXJzdCB3ZSBjaGVjayB0aGUgc3lzdGVtIGxvY2F0aW9uIGZvciBib29zdCBsaWJyYXJpZXMKKyAgICBkbmwgdGhpcyBsb2NhdGlvbiBpc3QgY2hvc2VuIGlmIGJvb3N0IGxpYnJhcmllcyBhcmUgaW5zdGFsbGVkIHdpdGggdGhlIC0tbGF5b3V0PXN5c3RlbSBvcHRpb24KKyAgICBkbmwgb3IgaWYgeW91IGluc3RhbGwgYm9vc3Qgd2l0aCBSUE0KKyAgICBBU19JRihbdGVzdCAieCRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIiAhPSAieCJdLFsKKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgYm9vc3RsaWIgPj0gJDEgKCRXQU5UX0JPT1NUX1ZFUlNJT04pIGluY2x1ZGVzIGluICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9pbmNsdWRlIl0pCisgICAgICAgICBBU19JRihbdGVzdCAtZCAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvaW5jbHVkZSIgJiYgdGVzdCAtciAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvaW5jbHVkZSJdLFsKKyAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKKyAgICAgICAgICAgQk9PU1RfQ1BQRkxBR1M9Ii1JJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvaW5jbHVkZSIKKyAgICAgICAgICAgZm9yIF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wIGluICRtdWx0aWFyY2hfbGlic3ViZGlyICRsaWJzdWJkaXJzOyBkbworICAgICAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGJvb3N0bGliID49ICQxICgkV0FOVF9CT09TVF9WRVJTSU9OKSBsaWIgcGF0aCBpbiAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wIl0pCisgICAgICAgICAgICAgICAgQVNfSUYoW3Rlc3QgLWQgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoLyRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcCIgJiYgdGVzdCAtciAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wIiBdLFsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9MREZMQUdTPSItTCRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoLyRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcCI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBdLAorICAgICAgW0FDX01TR19SRVNVTFQoW25vXSldKQorICAgICAgICAgICBkb25lXSxbCisgICAgICBBQ19NU0dfUkVTVUxUKFtub10pXSkKKyAgICBdLFsKKyAgICAgICAgaWYgdGVzdCBYIiRjcm9zc19jb21waWxpbmciID0gWHllczsgdGhlbgorICAgICAgICAgICAgc2VhcmNoX2xpYnN1YmRpcnM9JG11bHRpYXJjaF9saWJzdWJkaXIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2VhcmNoX2xpYnN1YmRpcnM9IiRtdWx0aWFyY2hfbGlic3ViZGlyICRsaWJzdWJkaXJzIgorICAgICAgICBmaQorICAgICAgICBmb3IgX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAgaW4gL3VzciAvdXNyL2xvY2FsIC9vcHQgL29wdC9sb2NhbCA7IGRvCisgICAgICAgICAgICBpZiB0ZXN0IC1kICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAvaW5jbHVkZS9ib29zdCIgJiYgdGVzdCAtciAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wL2luY2x1ZGUvYm9vc3QiIDsgdGhlbgorICAgICAgICAgICAgICAgIGZvciBsaWJzdWJkaXIgaW4gJHNlYXJjaF9saWJzdWJkaXJzIDsgZG8KKyAgICAgICAgICAgICAgICAgICAgaWYgbHMgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcC8kbGlic3ViZGlyL2xpYmJvb3N0XyIqID4vZGV2L251bGwgMj4mMSA7IHRoZW4gYnJlYWs7IGZpCisgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgIEJPT1NUX0xERkxBR1M9Ii1MJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wLyRsaWJzdWJkaXIiCisgICAgICAgICAgICAgICAgQk9PU1RfQ1BQRkxBR1M9Ii1JJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wL2luY2x1ZGUiCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBmaQorICAgICAgICBkb25lCisgICAgXSkKKworICAgIGRubCBvdmVyd3JpdGUgbGQgZmxhZ3MgaWYgd2UgaGF2ZSByZXF1aXJlZCBzcGVjaWFsIGRpcmVjdG9yeSB3aXRoCisgICAgZG5sIC0td2l0aC1ib29zdC1saWJkaXIgcGFyYW1ldGVyCisgICAgQVNfSUYoW3Rlc3QgIngkX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGgiICE9ICJ4Il0sCisgICAgICAgICAgW0JPT1NUX0xERkxBR1M9Ii1MJF9BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoIl0pCisKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBib29zdGxpYiA+PSAkMSAoJFdBTlRfQk9PU1RfVkVSU0lPTildKQorICAgIENQUEZMQUdTX1NBVkVEPSIkQ1BQRkxBR1MiCisgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAkQk9PU1RfQ1BQRkxBR1MiCisgICAgZXhwb3J0IENQUEZMQUdTCisKKyAgICBMREZMQUdTX1NBVkVEPSIkTERGTEFHUyIKKyAgICBMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfTERGTEFHUyIKKyAgICBleHBvcnQgTERGTEFHUworCisgICAgQUNfUkVRVUlSRShbQUNfUFJPR19DWFhdKQorICAgIEFDX0xBTkdfUFVTSChDKyspCisgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtfQVhfQk9PU1RfQkFTRV9QUk9HUkFNKCRXQU5UX0JPT1NUX1ZFUlNJT04pXSxbCiAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQotCXN1Y2NlZWRlZD15ZXMKLQlmb3VuZF9zeXN0ZW09eWVzCi0gICAgICAgCV0sWwotICAgICAgIAldKQotCUFDX0xBTkdfUE9QKFtDKytdKQorICAgIHN1Y2NlZWRlZD15ZXMKKyAgICBmb3VuZF9zeXN0ZW09eWVzCisgICAgICAgIF0sWworICAgICAgICBdKQorICAgIEFDX0xBTkdfUE9QKFtDKytdKQogCiAKIAotCWRubCBpZiB3ZSBmb3VuZCBubyBib29zdCB3aXRoIHN5c3RlbSBsYXlvdXQgd2Ugc2VhcmNoIGZvciBib29zdCBsaWJyYXJpZXMKLQlkbmwgYnVpbHQgYW5kIGluc3RhbGxlZCB3aXRob3V0IHRoZSAtLWxheW91dD1zeXN0ZW0gb3B0aW9uIG9yIGZvciBhIHN0YWdlZChub3QgaW5zdGFsbGVkKSB2ZXJzaW9uCi0JaWYgdGVzdCAieCRzdWNjZWVkZWQiICE9ICJ4eWVzIjsgdGhlbgotCQlfdmVyc2lvbj0wCi0JCWlmIHRlc3QgIiRhY19ib29zdF9wYXRoIiAhPSAiIjsgdGhlbgotICAgICAgICAgICAgICAgCQlCT09TVF9MREZMQUdTPSItTCRhY19ib29zdF9wYXRoL2xpYiIKLQkJCWlmIHRlc3QgLWQgIiRhY19ib29zdF9wYXRoIiAmJiB0ZXN0IC1yICIkYWNfYm9vc3RfcGF0aCI7IHRoZW4KLQkJCQlmb3IgaSBpbiBgbHMgLWQgJGFjX2Jvb3N0X3BhdGgvaW5jbHVkZS9ib29zdC0qIDI+L2Rldi9udWxsYDsgZG8KLQkJCQkJX3ZlcnNpb25fdG1wPWBlY2hvICRpIHwgc2VkICJzIyRhY19ib29zdF9wYXRoIyMiIHwgc2VkICdzL1wvaW5jbHVkZVwvYm9vc3QtLy8nIHwgc2VkICdzL18vLi8nYAotCQkJCQlWX0NIRUNLPWBleHByICRfdmVyc2lvbl90bXAgXD4gJF92ZXJzaW9uYAotCQkJCQlpZiB0ZXN0ICIkVl9DSEVDSyIgPSAiMSIgOyB0aGVuCi0JCQkJCQlfdmVyc2lvbj0kX3ZlcnNpb25fdG1wCi0JCQkJCWZpCi0JCQkJCVZFUlNJT05fVU5ERVJTQ09SRT1gZWNobyAkX3ZlcnNpb24gfCBzZWQgJ3MvXC4vXy8nYAotCQkJCQlCT09TVF9DUFBGTEFHUz0iLUkkYWNfYm9vc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSRWRVJTSU9OX1VOREVSU0NPUkUiCi0JCQkJZG9uZQotCQkJZmkKLQkJZWxzZQotCQkJZm9yIGFjX2Jvb3N0X3BhdGggaW4gL3VzciAvdXNyL2xvY2FsIC9vcHQgL29wdC9sb2NhbCA7IGRvCi0JCQkJaWYgdGVzdCAtZCAiJGFjX2Jvb3N0X3BhdGgiICYmIHRlc3QgLXIgIiRhY19ib29zdF9wYXRoIjsgdGhlbgotCQkJCQlmb3IgaSBpbiBgbHMgLWQgJGFjX2Jvb3N0X3BhdGgvaW5jbHVkZS9ib29zdC0qIDI+L2Rldi9udWxsYDsgZG8KLQkJCQkJCV92ZXJzaW9uX3RtcD1gZWNobyAkaSB8IHNlZCAicyMkYWNfYm9vc3RfcGF0aCMjIiB8IHNlZCAncy9cL2luY2x1ZGVcL2Jvb3N0LS8vJyB8IHNlZCAncy9fLy4vJ2AKLQkJCQkJCVZfQ0hFQ0s9YGV4cHIgJF92ZXJzaW9uX3RtcCBcPiAkX3ZlcnNpb25gCi0JCQkJCQlpZiB0ZXN0ICIkVl9DSEVDSyIgPSAiMSIgOyB0aGVuCi0JCQkJCQkJX3ZlcnNpb249JF92ZXJzaW9uX3RtcAotCSAgICAgICAgICAgICAgIAkJCQkJYmVzdF9wYXRoPSRhY19ib29zdF9wYXRoCi0JCQkJCQlmaQotCQkJCQlkb25lCi0JCQkJZmkKLQkJCWRvbmUKLQotCQkJVkVSU0lPTl9VTkRFUlNDT1JFPWBlY2hvICRfdmVyc2lvbiB8IHNlZCAncy9cLi9fLydgCi0JCQlCT09TVF9DUFBGTEFHUz0iLUkkYmVzdF9wYXRoL2luY2x1ZGUvYm9vc3QtJFZFUlNJT05fVU5ERVJTQ09SRSIKLQkJCUJPT1NUX0xERkxBR1M9Ii1MJGJlc3RfcGF0aC9saWIiCi0JCQlCT09TVF9ST09UX1BBVEg9IiRiZXN0X3BhdGgiCi0KLQkgICAgCQlpZiB0ZXN0ICJ4JEJPT1NUX1JPT1QiICE9ICJ4IjsgdGhlbgotCQkJCWlmIHRlc3QgLWQgIiRCT09TVF9ST09UIiAmJiB0ZXN0IC1yICIkQk9PU1RfUk9PVCIgJiYgdGVzdCAtZCAiJEJPT1NUX1JPT1Qvc3RhZ2UvbGliIiAmJiB0ZXN0IC1yICIkQk9PU1RfUk9PVC9zdGFnZS9saWIiOyB0aGVuCi0JCQkJCXZlcnNpb25fZGlyPWBleHByIC8vJEJPT1NUX1JPT1QgOiAnLiovXCguKlwpJ2AKLQkJCQkJc3RhZ2VfdmVyc2lvbj1gZWNobyAkdmVyc2lvbl9kaXIgfCBzZWQgJ3MvYm9vc3RfLy8nIHwgc2VkICdzL18vLi9nJ2AKLQkJCSAgICAgICAgCXN0YWdlX3ZlcnNpb25fc2hvcnRlbj1gZXhwciAkc3RhZ2VfdmVyc2lvbiA6ICdcKFtbMC05XV0qXC5bWzAtOV1dKlwpJ2AKLQkJCQkJVl9DSEVDSz1gZXhwciAkc3RhZ2VfdmVyc2lvbl9zaG9ydGVuIFw+XD0gJF92ZXJzaW9uYAotCQkJCSAgICAgICAgaWYgdGVzdCAiJFZfQ0hFQ0siID0gIjEiIDsgdGhlbgotCQkJCQkJQUNfTVNHX05PVElDRShXZSB3aWxsIHVzZSBhIHN0YWdlZCBib29zdCBsaWJyYXJ5IGZyb20gJEJPT1NUX1JPT1QpCi0JCQkJCQlCT09TVF9DUFBGTEFHUz0iLUkkQk9PU1RfUk9PVCIKLQkJCQkJCUJPT1NUX0xERkxBR1M9Ii1MJEJPT1NUX1JPT1Qvc3RhZ2UvbGliIgotCQkJCQkJQk9PU1RfUk9PVF9QQVRIPSIkQk9PU1RfUk9PVCIKLQkJCQkJZmkKLQkJCQlmaQotCSAgICAJCWZpCi0JCWZpCi0KLQkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAkQk9PU1RfQ1BQRkxBR1MiCi0JCWV4cG9ydCBDUFBGTEFHUwotCQlMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfTERGTEFHUyIKLQkJZXhwb3J0IExERkxBR1MKLQkJZXhwb3J0IEJPT1NUX1JPT1RfUEFUSAotCi0JCUFDX0xBTkdfUFVTSChDKyspCi0JICAgICAJQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotCQlAJTpAaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+Ci0JCV1dLCBbWwotCQkjaWYgQk9PU1RfVkVSU0lPTiA+PSAkV0FOVF9CT09TVF9WRVJTSU9OCi0JCS8vIEV2ZXJ5dGhpbmcgaXMgb2theQotCQkjZWxzZQotCQkjICBlcnJvciBCb29zdCB2ZXJzaW9uIGlzIHRvbyBvbGQKLQkJI2VuZGlmCi0JCV1dKV0sWwotICAgICAgICAJQUNfTVNHX1JFU1VMVCh5ZXMpCi0JCXN1Y2NlZWRlZD15ZXMKLQkJZm91bmRfc3lzdGVtPXllcwotICAgICAgIAkJXSxbCi0JICAgICAgIAldKQotCQlBQ19MQU5HX1BPUChbQysrXSkKLQlmaQotCi0JaWYgdGVzdCAiJHN1Y2NlZWRlZCIgIT0gInllcyIgOyB0aGVuCi0JCWlmIHRlc3QgIiRfdmVyc2lvbiIgPSAiMCIgOyB0aGVuCi0JCQlBQ19NU0dfV0FSTihbW1dlIGNvdWxkIG5vdCBkZXRlY3QgdGhlIGJvb3N0IGxpYnJhcmllcyAodmVyc2lvbiAkYm9vc3RfbGliX3ZlcnNpb25fcmVxX3Nob3J0ZW4gb3IgaGlnaGVyKS4gSWYgeW91IGhhdmUgYSBzdGFnZWQgYm9vc3QgbGlicmFyeSAoc3RpbGwgbm90IGluc3RhbGxlZCkgcGxlYXNlIHNwZWNpZnkgXCRCT09TVF9ST09UIGluIHlvdXIgZW52aXJvbm1lbnQgYW5kIGRvIG5vdCBnaXZlIGEgUEFUSCB0byAtLXdpdGgtYm9vc3Qgb3B0aW9uLiAgSWYgeW91IGFyZSBzdXJlIHlvdSBoYXZlIGJvb3N0IGluc3RhbGxlZCwgdGhlbiBjaGVjayB5b3VyIHZlcnNpb24gbnVtYmVyIGxvb2tpbmcgaW4gPGJvb3N0L3ZlcnNpb24uaHBwPi4gU2VlIGh0dHA6Ly9yYW5kc3ByaW5nZXIuZGUvYm9vc3QgZm9yIG1vcmUgZG9jdW1lbnRhdGlvbi5dXSkKLQkJZWxzZQotCQkJQUNfTVNHX1dBUk4oW1lvdXIgYm9vc3QgbGlicmFyaWVzIHNlZW1zIHRvIG9sZCAodmVyc2lvbiAkX3ZlcnNpb24pLl0pCi0JCWZpCi0JZWxzZQotCQlBQ19TVUJTVChCT09TVF9DUFBGTEFHUykKLQkJQUNfU1VCU1QoQk9PU1RfTERGTEFHUykKLQkJQUNfU1VCU1QoQk9PU1RfUk9PVF9QQVRIKQotCQlBQ19ERUZJTkUoSEFWRV9CT09TVCwsW2RlZmluZSBpZiB0aGUgQm9vc3QgbGlicmFyeSBpcyBhdmFpbGFibGVdKQotCWZpCi0KKyAgICBkbmwgaWYgd2UgZm91bmQgbm8gYm9vc3Qgd2l0aCBzeXN0ZW0gbGF5b3V0IHdlIHNlYXJjaCBmb3IgYm9vc3QgbGlicmFyaWVzCisgICAgZG5sIGJ1aWx0IGFuZCBpbnN0YWxsZWQgd2l0aG91dCB0aGUgLS1sYXlvdXQ9c3lzdGVtIG9wdGlvbiBvciBmb3IgYSBzdGFnZWQobm90IGluc3RhbGxlZCkgdmVyc2lvbgorICAgIGlmIHRlc3QgIngkc3VjY2VlZGVkIiAhPSAieHllcyIgOyB0aGVuCiAgICAgICAgIENQUEZMQUdTPSIkQ1BQRkxBR1NfU0FWRUQiCi0gICAgICAgCUxERkxBR1M9IiRMREZMQUdTX1NBVkVEIgotZmkKKyAgICAgICAgTERGTEFHUz0iJExERkxBR1NfU0FWRUQiCisgICAgICAgIEJPT1NUX0NQUEZMQUdTPQorICAgICAgICBpZiB0ZXN0IC16ICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGgiIDsgdGhlbgorICAgICAgICAgICAgQk9PU1RfTERGTEFHUz0KKyAgICAgICAgZmkKKyAgICAgICAgX3ZlcnNpb249MAorICAgICAgICBpZiB0ZXN0IC1uICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCIgOyB0aGVuCisgICAgICAgICAgICBpZiB0ZXN0IC1kICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCIgJiYgdGVzdCAtciAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgiOyB0aGVuCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gYGxzIC1kICRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2luY2x1ZGUvYm9vc3QtKiAyPi9kZXYvbnVsbGA7IGRvCisgICAgICAgICAgICAgICAgICAgIF92ZXJzaW9uX3RtcD1gZWNobyAkaSB8IHNlZCAicyMkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCMjIiB8IHNlZCAncy9cL2luY2x1ZGVcL2Jvb3N0LS8vJyB8IHNlZCAncy9fLy4vJ2AKKyAgICAgICAgICAgICAgICAgICAgVl9DSEVDSz1gZXhwciAkX3ZlcnNpb25fdG1wIFw+ICRfdmVyc2lvbmAKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAieCRWX0NIRUNLIiA9ICJ4MSIgOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBfdmVyc2lvbj0kX3ZlcnNpb25fdG1wCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIFZFUlNJT05fVU5ERVJTQ09SRT1gZWNobyAkX3ZlcnNpb24gfCBzZWQgJ3MvXC4vXy8nYAorICAgICAgICAgICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSRWRVJTSU9OX1VOREVSU0NPUkUiCisgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgIGRubCBpZiBub3RoaW5nIGZvdW5kIHNlYXJjaCBmb3IgbGF5b3V0IHVzZWQgaW4gV2luZG93cyBkaXN0cmlidXRpb25zCisgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJEJPT1NUX0NQUEZMQUdTIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1kICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9ib29zdCIgJiYgdGVzdCAtciAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvYm9vc3QiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCIKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGRubCBpZiB3ZSBmb3VuZCBzb21ldGhpbmcgYW5kIEJPT1NUX0xERkxBR1Mgd2FzIHVuc2V0IGJlZm9yZQorICAgICAgICAgICAgICAgIGRubCAoYmVjYXVzZSAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoIiA9ICIiKSwgc2V0IGl0IGhlcmUuCisgICAgICAgICAgICAgICAgaWYgdGVzdCAtbiAiJEJPT1NUX0NQUEZMQUdTIiAmJiB0ZXN0IC16ICIkQk9PU1RfTERGTEFHUyI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgZm9yIGxpYnN1YmRpciBpbiAkbGlic3ViZGlycyA7IGRvCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBscyAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvJGxpYnN1YmRpci9saWJib29zdF8iKiA+L2Rldi9udWxsIDI+JjEgOyB0aGVuIGJyZWFrOyBmaQorICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgIEJPT1NUX0xERkxBR1M9Ii1MJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvJGxpYnN1YmRpciIKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciICE9ICJ4eWVzIiA7IHRoZW4KKyAgICAgICAgICAgICAgICBmb3IgX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCBpbiAvdXNyIC91c3IvbG9jYWwgL29wdCAvb3B0L2xvY2FsIDsgZG8KKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtZCAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgiICYmIHRlc3QgLXIgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIiA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIGBscyAtZCAkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSogMj4vZGV2L251bGxgOyBkbworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92ZXJzaW9uX3RtcD1gZWNobyAkaSB8IHNlZCAicyMkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCMjIiB8IHNlZCAncy9cL2luY2x1ZGVcL2Jvb3N0LS8vJyB8IHNlZCAncy9fLy4vJ2AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWX0NIRUNLPWBleHByICRfdmVyc2lvbl90bXAgXD4gJF92ZXJzaW9uYAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkVl9DSEVDSyIgPSAieDEiIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdmVyc2lvbj0kX3ZlcnNpb25fdG1wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfcGF0aD0kX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZG9uZQorCisgICAgICAgICAgICAgICAgVkVSU0lPTl9VTkRFUlNDT1JFPWBlY2hvICRfdmVyc2lvbiB8IHNlZCAncy9cLi9fLydgCisgICAgICAgICAgICAgICAgQk9PU1RfQ1BQRkxBR1M9Ii1JJGJlc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSRWRVJTSU9OX1VOREVSU0NPUkUiCisgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoIiA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgZm9yIGxpYnN1YmRpciBpbiAkbGlic3ViZGlycyA7IGRvCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBscyAiJGJlc3RfcGF0aC8kbGlic3ViZGlyL2xpYmJvb3N0XyIqID4vZGV2L251bGwgMj4mMSA7IHRoZW4gYnJlYWs7IGZpCisgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgQk9PU1RfTERGTEFHUz0iLUwkYmVzdF9wYXRoLyRsaWJzdWJkaXIiCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRCT09TVF9ST09UIiA7IHRoZW4KKyAgICAgICAgICAgICAgICBmb3IgbGlic3ViZGlyIGluICRsaWJzdWJkaXJzIDsgZG8KKyAgICAgICAgICAgICAgICAgICAgaWYgbHMgIiRCT09TVF9ST09UL3N0YWdlLyRsaWJzdWJkaXIvbGliYm9vc3RfIiogPi9kZXYvbnVsbCAyPiYxIDsgdGhlbiBicmVhazsgZmkKKyAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgaWYgdGVzdCAtZCAiJEJPT1NUX1JPT1QiICYmIHRlc3QgLXIgIiRCT09TVF9ST09UIiAmJiB0ZXN0IC1kICIkQk9PU1RfUk9PVC9zdGFnZS8kbGlic3ViZGlyIiAmJiB0ZXN0IC1yICIkQk9PU1RfUk9PVC9zdGFnZS8kbGlic3ViZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uX2Rpcj1gZXhwciAvLyRCT09TVF9ST09UIDogJy4qL1woLipcKSdgCisgICAgICAgICAgICAgICAgICAgIHN0YWdlX3ZlcnNpb249YGVjaG8gJHZlcnNpb25fZGlyIHwgc2VkICdzL2Jvb3N0Xy8vJyB8IHNlZCAncy9fLy4vZydgCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZV92ZXJzaW9uX3Nob3J0ZW49YGV4cHIgJHN0YWdlX3ZlcnNpb24gOiAnXChbWzAtOV1dKlwuW1swLTldXSpcKSdgCisgICAgICAgICAgICAgICAgICAgIFZfQ0hFQ0s9YGV4cHIgJHN0YWdlX3ZlcnNpb25fc2hvcnRlbiBcPlw9ICRfdmVyc2lvbmAKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAieCRWX0NIRUNLIiA9ICJ4MSIgJiYgdGVzdCAteiAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoIiA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFDX01TR19OT1RJQ0UoV2Ugd2lsbCB1c2UgYSBzdGFnZWQgYm9vc3QgbGlicmFyeSBmcm9tICRCT09TVF9ST09UKQorICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfQ1BQRkxBR1M9Ii1JJEJPT1NUX1JPT1QiCisgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9MREZMQUdTPSItTCRCT09TVF9ST09UL3N0YWdlLyRsaWJzdWJkaXIiCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGZpCisgICAgICAgIGZpCisKKyAgICAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAkQk9PU1RfQ1BQRkxBR1MiCisgICAgICAgIGV4cG9ydCBDUFBGTEFHUworICAgICAgICBMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfTERGTEFHUyIKKyAgICAgICAgZXhwb3J0IExERkxBR1MKKworICAgICAgICBBQ19MQU5HX1BVU0goQysrKQorICAgICAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW19BWF9CT09TVF9CQVNFX1BST0dSQU0oJFdBTlRfQk9PU1RfVkVSU0lPTildLFsKKyAgICAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICAgICBzdWNjZWVkZWQ9eWVzCisgICAgICAgIGZvdW5kX3N5c3RlbT15ZXMKKyAgICAgICAgICAgIF0sWworICAgICAgICAgICAgXSkKKyAgICAgICAgQUNfTEFOR19QT1AoW0MrK10pCisgICAgZmkKKworICAgIGlmIHRlc3QgIngkc3VjY2VlZGVkIiAhPSAieHllcyIgOyB0aGVuCisgICAgICAgIGlmIHRlc3QgIngkX3ZlcnNpb24iID0gIngwIiA7IHRoZW4KKyAgICAgICAgICAgIEFDX01TR19OT1RJQ0UoW1tXZSBjb3VsZCBub3QgZGV0ZWN0IHRoZSBib29zdCBsaWJyYXJpZXMgKHZlcnNpb24gJDEgb3IgaGlnaGVyKS4gSWYgeW91IGhhdmUgYSBzdGFnZWQgYm9vc3QgbGlicmFyeSAoc3RpbGwgbm90IGluc3RhbGxlZCkgcGxlYXNlIHNwZWNpZnkgXCRCT09TVF9ST09UIGluIHlvdXIgZW52aXJvbm1lbnQgYW5kIGRvIG5vdCBnaXZlIGEgUEFUSCB0byAtLXdpdGgtYm9vc3Qgb3B0aW9uLiAgSWYgeW91IGFyZSBzdXJlIHlvdSBoYXZlIGJvb3N0IGluc3RhbGxlZCwgdGhlbiBjaGVjayB5b3VyIHZlcnNpb24gbnVtYmVyIGxvb2tpbmcgaW4gPGJvb3N0L3ZlcnNpb24uaHBwPi4gU2VlIGh0dHA6Ly9yYW5kc3ByaW5nZXIuZGUvYm9vc3QgZm9yIG1vcmUgZG9jdW1lbnRhdGlvbi5dXSkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQUNfTVNHX05PVElDRShbWW91ciBib29zdCBsaWJyYXJpZXMgc2VlbXMgdG8gb2xkICh2ZXJzaW9uICRfdmVyc2lvbikuXSkKKyAgICAgICAgZmkKKyAgICAgICAgIyBleGVjdXRlIEFDVElPTi1JRi1OT1QtRk9VTkQgKGlmIHByZXNlbnQpOgorICAgICAgICBpZmVsc2UoWyQzXSwgLCA6LCBbJDNdKQorICAgIGVsc2UKKyAgICAgICAgQUNfREVGSU5FKEhBVkVfQk9PU1QsLFtkZWZpbmUgaWYgdGhlIEJvb3N0IGxpYnJhcnkgaXMgYXZhaWxhYmxlXSkKKyAgICAgICAgIyBleGVjdXRlIEFDVElPTi1JRi1GT1VORCAoaWYgcHJlc2VudCk6CisgICAgICAgIGlmZWxzZShbJDJdLCAsIDosIFskMl0pCisgICAgZmkKKworICAgIENQUEZMQUdTPSIkQ1BQRkxBR1NfU0FWRUQiCisgICAgTERGTEFHUz0iJExERkxBR1NfU0FWRUQiCiAKIF0pCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2NoZWNrX29wZW5zc2wubTQgYi9hY2xvY2FsL2F4X2NoZWNrX29wZW5zc2wubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhlNDhjYgotLS0gL2Rldi9udWxsCisrKyBiL2FjbG9jYWwvYXhfY2hlY2tfb3BlbnNzbC5tNApAQCAtMCwwICsxLDEyNCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9jaGVja19vcGVuc3NsLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfQ0hFQ0tfT1BFTlNTTChbYWN0aW9uLWlmLWZvdW5kWywgYWN0aW9uLWlmLW5vdC1mb3VuZF1dKQorIworIyBERVNDUklQVElPTgorIworIyAgIExvb2sgZm9yIE9wZW5TU0wgaW4gYSBudW1iZXIgb2YgZGVmYXVsdCBzcG90cywgb3IgaW4gYSB1c2VyLXNlbGVjdGVkCisjICAgc3BvdCAodmlhIC0td2l0aC1vcGVuc3NsKS4gIFNldHMKKyMKKyMgICAgIE9QRU5TU0xfSU5DTFVERVMgdG8gdGhlIGluY2x1ZGUgZGlyZWN0aXZlcyByZXF1aXJlZAorIyAgICAgT1BFTlNTTF9MSUJTIHRvIHRoZSAtbCBkaXJlY3RpdmVzIHJlcXVpcmVkCisjICAgICBPUEVOU1NMX0xERkxBR1MgdG8gdGhlIC1MIG9yIC1SIGZsYWdzIHJlcXVpcmVkCisjCisjICAgYW5kIGNhbGxzIEFDVElPTi1JRi1GT1VORCBvciBBQ1RJT04tSUYtTk9ULUZPVU5EIGFwcHJvcHJpYXRlbHkKKyMKKyMgICBUaGlzIG1hY3JvIHNldHMgT1BFTlNTTF9JTkNMVURFUyBzdWNoIHRoYXQgc291cmNlIGZpbGVzIHNob3VsZCB1c2UgdGhlCisjICAgb3BlbnNzbC8gZGlyZWN0b3J5IGluIGluY2x1ZGUgZGlyZWN0aXZlczoKKyMKKyMgICAgICNpbmNsdWRlIDxvcGVuc3NsL2htYWMuaD4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAwOSwyMDEwIFptYW5kYSBJbmMuIDxodHRwOi8vd3d3LnptYW5kYS5jb20vPgorIyAgIENvcHlyaWdodCAoYykgMjAwOSwyMDEwIER1c3RpbiBKLiBNaXRjaGVsbCA8ZHVzdGluQHptYW5kYS5jb20+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQorIyAgIHdhcnJhbnR5LgorCisjc2VyaWFsIDEwCisKK0FVX0FMSUFTKFtDSEVDS19TU0xdLCBbQVhfQ0hFQ0tfT1BFTlNTTF0pCitBQ19ERUZVTihbQVhfQ0hFQ0tfT1BFTlNTTF0sIFsKKyAgICBmb3VuZD1mYWxzZQorICAgIEFDX0FSR19XSVRIKFtvcGVuc3NsXSwKKyAgICAgICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtb3BlbnNzbD1ESVJdLAorICAgICAgICAgICAgW3Jvb3Qgb2YgdGhlIE9wZW5TU0wgZGlyZWN0b3J5XSldLAorICAgICAgICBbCisgICAgICAgICAgICBjYXNlICIkd2l0aHZhbCIgaW4KKyAgICAgICAgICAgICIiIHwgeSB8IHllIHwgeWVzIHwgbiB8IG5vKQorICAgICAgICAgICAgQUNfTVNHX0VSUk9SKFtJbnZhbGlkIC0td2l0aC1vcGVuc3NsIHZhbHVlXSkKKyAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICopIHNzbGRpcnM9IiR3aXRodmFsIgorICAgICAgICAgICAgICA7OworICAgICAgICAgICAgZXNhYworICAgICAgICBdLCBbCisgICAgICAgICAgICAjIGlmIHBrZy1jb25maWcgaXMgaW5zdGFsbGVkIGFuZCBvcGVuc3NsIGhhcyBpbnN0YWxsZWQgYSAucGMgZmlsZSwKKyAgICAgICAgICAgICMgdGhlbiB1c2UgdGhhdCBpbmZvcm1hdGlvbiBhbmQgZG9uJ3Qgc2VhcmNoIHNzbGRpcnMKKyAgICAgICAgICAgIEFDX0NIRUNLX1RPT0woW1BLR19DT05GSUddLCBbcGtnLWNvbmZpZ10pCisgICAgICAgICAgICBpZiB0ZXN0IHgiJFBLR19DT05GSUciICE9IHgiIjsgdGhlbgorICAgICAgICAgICAgICAgIE9QRU5TU0xfTERGTEFHUz1gJFBLR19DT05GSUcgb3BlbnNzbCAtLWxpYnMtb25seS1MIDI+L2Rldi9udWxsYAorICAgICAgICAgICAgICAgIGlmIHRlc3QgJD8gPSAwOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIE9QRU5TU0xfTElCUz1gJFBLR19DT05GSUcgb3BlbnNzbCAtLWxpYnMtb25seS1sIDI+L2Rldi9udWxsYAorICAgICAgICAgICAgICAgICAgICBPUEVOU1NMX0lOQ0xVREVTPWAkUEtHX0NPTkZJRyBvcGVuc3NsIC0tY2ZsYWdzLW9ubHktSSAyPi9kZXYvbnVsbGAKKyAgICAgICAgICAgICAgICAgICAgZm91bmQ9dHJ1ZQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAjIG5vIHN1Y2ggbHVjazsgdXNlIHNvbWUgZGVmYXVsdCBzc2xkaXJzCisgICAgICAgICAgICBpZiAhICRmb3VuZDsgdGhlbgorICAgICAgICAgICAgICAgIHNzbGRpcnM9Ii91c3IvbG9jYWwvc3NsIC91c3IvbGliL3NzbCAvdXNyL3NzbCAvdXNyL3BrZyAvdXNyL2xvY2FsIC91c3IiCisgICAgICAgICAgICBmaQorICAgICAgICBdCisgICAgICAgICkKKworCisgICAgIyBub3RlIHRoYXQgd2UgI2luY2x1ZGUgPG9wZW5zc2wvZm9vLmg+LCBzbyB0aGUgT3BlblNTTCBoZWFkZXJzIGhhdmUgdG8gYmUgaW4KKyAgICAjIGFuICdvcGVuc3NsJyBzdWJkaXJlY3RvcnkKKworICAgIGlmICEgJGZvdW5kOyB0aGVuCisgICAgICAgIE9QRU5TU0xfSU5DTFVERVM9CisgICAgICAgIGZvciBzc2xkaXIgaW4gJHNzbGRpcnM7IGRvCisgICAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBvcGVuc3NsL3NzbC5oIGluICRzc2xkaXJdKQorICAgICAgICAgICAgaWYgdGVzdCAtZiAiJHNzbGRpci9pbmNsdWRlL29wZW5zc2wvc3NsLmgiOyB0aGVuCisgICAgICAgICAgICAgICAgT1BFTlNTTF9JTkNMVURFUz0iLUkkc3NsZGlyL2luY2x1ZGUiCisgICAgICAgICAgICAgICAgT1BFTlNTTF9MREZMQUdTPSItTCRzc2xkaXIvbGliIgorICAgICAgICAgICAgICAgIE9QRU5TU0xfTElCUz0iLWxzc2wgLWxjcnlwdG8iCisgICAgICAgICAgICAgICAgZm91bmQ9dHJ1ZQorICAgICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgICAgICAgICBmaQorICAgICAgICBkb25lCisKKyAgICAgICAgIyBpZiB0aGUgZmlsZSB3YXNuJ3QgZm91bmQsIHdlbGwsIGdvIGFoZWFkIGFuZCB0cnkgdGhlIGxpbmsgYW55d2F5IC0tIG1heWJlCisgICAgICAgICMgaXQgd2lsbCBqdXN0IHdvcmshCisgICAgZmkKKworICAgICMgdHJ5IHRoZSBwcmVwcm9jZXNzb3IgYW5kIGxpbmtlciB3aXRoIG91ciBuZXcgZmxhZ3MsCisgICAgIyBiZWluZyBjYXJlZnVsIG5vdCB0byBwb2xsdXRlIHRoZSBnbG9iYWwgTElCUywgTERGTEFHUywgYW5kIENQUEZMQUdTCisKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgY29tcGlsaW5nIGFuZCBsaW5raW5nIGFnYWluc3QgT3BlblNTTCB3b3Jrc10pCisgICAgZWNobyAiVHJ5aW5nIGxpbmsgd2l0aCBPUEVOU1NMX0xERkxBR1M9JE9QRU5TU0xfTERGTEFHUzsiIFwKKyAgICAgICAgIk9QRU5TU0xfTElCUz0kT1BFTlNTTF9MSUJTOyBPUEVOU1NMX0lOQ0xVREVTPSRPUEVOU1NMX0lOQ0xVREVTIiA+JkFTX01FU1NBR0VfTE9HX0ZECisKKyAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisgICAgc2F2ZV9DUFBGTEFHUz0iJENQUEZMQUdTIgorICAgIExERkxBR1M9IiRMREZMQUdTICRPUEVOU1NMX0xERkxBR1MiCisgICAgTElCUz0iJE9QRU5TU0xfTElCUyAkTElCUyIKKyAgICBDUFBGTEFHUz0iJE9QRU5TU0xfSU5DTFVERVMgJENQUEZMQUdTIgorICAgIEFDX0xJTktfSUZFTFNFKAorICAgICAgICBbQUNfTEFOR19QUk9HUkFNKFsjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD5dLCBbU1NMX25ldyhOVUxMKV0pXSwKKyAgICAgICAgWworICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKKyAgICAgICAgICAgICQxCisgICAgICAgIF0sIFsKKyAgICAgICAgICAgIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICAgICAgICAgICQyCisgICAgICAgIF0pCisgICAgQ1BQRkxBR1M9IiRzYXZlX0NQUEZMQUdTIgorICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisgICAgTElCUz0iJHNhdmVfTElCUyIKKworICAgIEFDX1NVQlNUKFtPUEVOU1NMX0lOQ0xVREVTXSkKKyAgICBBQ19TVUJTVChbT1BFTlNTTF9MSUJTXSkKKyAgICBBQ19TVUJTVChbT1BFTlNTTF9MREZMQUdTXSkKK10pCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2NvbXBhcmVfdmVyc2lvbi5tNCBiL2FjbG9jYWwvYXhfY29tcGFyZV92ZXJzaW9uLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOGUyMDgKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsL2F4X2NvbXBhcmVfdmVyc2lvbi5tNApAQCAtMCwwICsxLDE3NyBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2NvbXBhcmVfdmVyc2lvbi5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0NPTVBBUkVfVkVSU0lPTihWRVJTSU9OX0EsIE9QLCBWRVJTSU9OX0IsIFtBQ1RJT04tSUYtVFJVRV0sIFtBQ1RJT04tSUYtRkFMU0VdKQorIworIyBERVNDUklQVElPTgorIworIyAgIFRoaXMgbWFjcm8gY29tcGFyZXMgdHdvIHZlcnNpb24gc3RyaW5ncy4gRHVlIHRvIHRoZSB2YXJpb3VzIG51bWJlciBvZgorIyAgIG1pbm9yLXZlcnNpb24gbnVtYmVycyB0aGF0IGNhbiBleGlzdCwgYW5kIHRoZSBmYWN0IHRoYXQgc3RyaW5nCisjICAgY29tcGFyaXNvbnMgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggbnVtZXJpYyBjb21wYXJpc29ucywgdGhpcyBpcyBub3QKKyMgICBuZWNlc3NhcmlseSB0cml2aWFsIHRvIGRvIGluIGEgYXV0b2NvbmYgc2NyaXB0LiBUaGlzIG1hY3JvIG1ha2VzIGRvaW5nCisjICAgdGhlc2UgY29tcGFyaXNvbnMgZWFzeS4KKyMKKyMgICBUaGUgc2l4IGJhc2ljIGNvbXBhcmlzb25zIGFyZSBhdmFpbGFibGUsIGFzIHdlbGwgYXMgY2hlY2tpbmcgZXF1YWxpdHkKKyMgICBsaW1pdGVkIHRvIGEgY2VydGFpbiBudW1iZXIgb2YgbWlub3ItdmVyc2lvbiBsZXZlbHMuCisjCisjICAgVGhlIG9wZXJhdG9yIE9QIGRldGVybWluZXMgd2hhdCB0eXBlIG9mIGNvbXBhcmlzb24gdG8gZG8sIGFuZCBjYW4gYmUgb25lCisjICAgb2Y6CisjCisjICAgIGVxICAtIGVxdWFsICh0ZXN0IEEgPT0gQikKKyMgICAgbmUgIC0gbm90IGVxdWFsICh0ZXN0IEEgIT0gQikKKyMgICAgbGUgIC0gbGVzcyB0aGFuIG9yIGVxdWFsICh0ZXN0IEEgPD0gQikKKyMgICAgZ2UgIC0gZ3JlYXRlciB0aGFuIG9yIGVxdWFsICh0ZXN0IEEgPj0gQikKKyMgICAgbHQgIC0gbGVzcyB0aGFuICh0ZXN0IEEgPCBCKQorIyAgICBndCAgLSBncmVhdGVyIHRoYW4gKHRlc3QgQSA+IEIpCisjCisjICAgQWRkaXRpb25hbGx5LCB0aGUgZXEgYW5kIG5lIG9wZXJhdG9yIGNhbiBoYXZlIGEgbnVtYmVyIGFmdGVyIGl0IHRvIGxpbWl0CisjICAgdGhlIHRlc3QgdG8gdGhhdCBudW1iZXIgb2YgbWlub3IgdmVyc2lvbnMuCisjCisjICAgIGVxMCAtIGVxdWFsIHVwIHRvIHRoZSBsZW5ndGggb2YgdGhlIHNob3J0ZXIgdmVyc2lvbgorIyAgICBuZTAgLSBub3QgZXF1YWwgdXAgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc2hvcnRlciB2ZXJzaW9uCisjICAgIGVxTiAtIGVxdWFsIHVwIHRvIE4gc3ViLXZlcnNpb24gbGV2ZWxzCisjICAgIG5lTiAtIG5vdCBlcXVhbCB1cCB0byBOIHN1Yi12ZXJzaW9uIGxldmVscworIworIyAgIFdoZW4gdGhlIGNvbmRpdGlvbiBpcyB0cnVlLCBzaGVsbCBjb21tYW5kcyBBQ1RJT04tSUYtVFJVRSBhcmUgcnVuLAorIyAgIG90aGVyd2lzZSBzaGVsbCBjb21tYW5kcyBBQ1RJT04tSUYtRkFMU0UgYXJlIHJ1bi4gVGhlIGVudmlyb25tZW50CisjICAgdmFyaWFibGUgJ2F4X2NvbXBhcmVfdmVyc2lvbicgaXMgYWx3YXlzIHNldCB0byBlaXRoZXIgJ3RydWUnIG9yICdmYWxzZScKKyMgICBhcyB3ZWxsLgorIworIyAgIEV4YW1wbGVzOgorIworIyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1LjddLFtsdF0sWzMuMTUuOF0pCisjICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTVdLFtsdF0sWzMuMTUuOF0pCisjCisjICAgd291bGQgYm90aCBiZSB0cnVlLgorIworIyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1LjddLFtlcV0sWzMuMTUuOF0pCisjICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTVdLFtndF0sWzMuMTUuOF0pCisjCisjICAgd291bGQgYm90aCBiZSBmYWxzZS4KKyMKKyMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNS43XSxbZXEyXSxbMy4xNS44XSkKKyMKKyMgICB3b3VsZCBiZSB0cnVlIGJlY2F1c2UgaXQgaXMgb25seSBjb21wYXJpbmcgdHdvIG1pbm9yIHZlcnNpb25zLgorIworIyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1LjddLFtlcTBdLFszLjE1XSkKKyMKKyMgICB3b3VsZCBiZSB0cnVlIGJlY2F1c2UgaXQgaXMgb25seSBjb21wYXJpbmcgdGhlIGxlc3NlciBudW1iZXIgb2YgbWlub3IKKyMgICB2ZXJzaW9ucyBvZiB0aGUgdHdvIHZhbHVlcy4KKyMKKyMgICBOb3RlOiBUaGUgY2hhcmFjdGVycyB0aGF0IHNlcGFyYXRlIHRoZSB2ZXJzaW9uIG51bWJlcnMgZG8gbm90IG1hdHRlci4gQW4KKyMgICBlbXB0eSBzdHJpbmcgaXMgdGhlIHNhbWUgYXMgdmVyc2lvbiAwLiBPUCBpcyBldmFsdWF0ZWQgYnkgYXV0b2NvbmYsIG5vdAorIyAgIGNvbmZpZ3VyZSwgc28gbXVzdCBiZSBhIHN0cmluZywgbm90IGEgdmFyaWFibGUuCisjCisjICAgVGhlIGF1dGhvciB3b3VsZCBsaWtlIHRvIGFja25vd2xlZGdlIEd1aWRvIERyYWhlaW0gd2hvc2UgYWR2aWNlIGFib3V0CisjICAgdGhlIG00X2Nhc2UgYW5kIG00X2lmdmFsbiBmdW5jdGlvbnMgbWFrZSB0aGlzIG1hY3JvIG9ubHkgaW5jbHVkZSB0aGUKKyMgICBwb3J0aW9ucyBuZWNlc3NhcnkgdG8gcGVyZm9ybSB0aGUgc3BlY2lmaWMgY29tcGFyaXNvbiBzcGVjaWZpZWQgYnkgdGhlCisjICAgT1AgYXJndW1lbnQgaW4gdGhlIGZpbmFsIGNvbmZpZ3VyZSBzY3JpcHQuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggVGltIFRvb2xhbiA8dG9vbGFuQGVsZS51cmkuZWR1PgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorIyAgIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZQorIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKKyMgICB3YXJyYW50eS4KKworI3NlcmlhbCAxMgorCitkbmwgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworQUNfREVGVU4oW0FYX0NPTVBBUkVfVkVSU0lPTl0sIFsKKyAgQUNfUkVRVUlSRShbQUNfUFJPR19BV0tdKQorCisgICMgVXNlZCB0byBpbmRpY2F0ZSB0cnVlIG9yIGZhbHNlIGNvbmRpdGlvbgorICBheF9jb21wYXJlX3ZlcnNpb249ZmFsc2UKKworICAjIENvbnZlcnQgdGhlIHR3byB2ZXJzaW9uIHN0cmluZ3MgdG8gYmUgY29tcGFyZWQgaW50byBhIGZvcm1hdCB0aGF0CisgICMgYWxsb3dzIGEgc2ltcGxlIHN0cmluZyBjb21wYXJpc29uLiAgVGhlIGVuZCByZXN1bHQgaXMgdGhhdCBhIHZlcnNpb24KKyAgIyBzdHJpbmcgb2YgdGhlIGZvcm0gMS4xMi41LXI2MTcgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlIGZvcm0KKyAgIyAwMDAxMDAxMjAwMDUwNjE3LiAgSW4gb3RoZXIgd29yZHMsIGVhY2ggbnVtYmVyIGlzIHplcm8gcGFkZGVkIHRvIGZvdXIKKyAgIyBkaWdpdHMsIGFuZCBub24gZGlnaXRzIGFyZSByZW1vdmVkLgorICBBU19WQVJfUFVTSERFRihbQV0sW2F4X2NvbXBhcmVfdmVyc2lvbl9BXSkKKyAgQT1gZWNobyAiJDEiIHwgc2VkIC1lICdzL1woW1swLTldXSpcKS9aXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1pcKFtbMC05XV1cKVovWjBcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVtbMC05XV1cKVovWjBcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVtbMC05XV1bWzAtOV1dXClaL1owXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1tbXjAtOV1dLy9nJ2AKKworICBBU19WQVJfUFVTSERFRihbQl0sW2F4X2NvbXBhcmVfdmVyc2lvbl9CXSkKKyAgQj1gZWNobyAiJDMiIHwgc2VkIC1lICdzL1woW1swLTldXSpcKS9aXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1pcKFtbMC05XV1cKVovWjBcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVtbMC05XV1cKVovWjBcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVtbMC05XV1bWzAtOV1dXClaL1owXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1tbXjAtOV1dLy9nJ2AKKworICBkbmwgIyBJbiB0aGUgY2FzZSBvZiBsZSwgZ2UsIGx0LCBhbmQgZ3QsIHRoZSBzdHJpbmdzIGFyZSBzb3J0ZWQgYXMgbmVjZXNzYXJ5CisgIGRubCAjIHRoZW4gdGhlIGZpcnN0IGxpbmUgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLgorICBkbmwgIyBUaGUgc2VkIHJpZ2h0IGFmdGVyIHRoZSBlY2hvIGlzIHRvIHJlbW92ZSBhbnkgaW5kZW50ZWQgd2hpdGUgc3BhY2UuCisgIG00X2Nhc2UobTRfdG9sb3dlcigkMiksCisgIFtsdF0sWworICAgIGF4X2NvbXBhcmVfdmVyc2lvbj1gZWNobyAieCRBCit4JEIiIHwgc2VkICdzL14gKi8vJyB8IHNvcnQgLXIgfCBzZWQgInMveCR7QX0vZmFsc2UvO3MveCR7Qn0vdHJ1ZS87MXEiYAorICBdLAorICBbZ3RdLFsKKyAgICBheF9jb21wYXJlX3ZlcnNpb249YGVjaG8gIngkQQoreCRCIiB8IHNlZCAncy9eICovLycgfCBzb3J0IHwgc2VkICJzL3gke0F9L2ZhbHNlLztzL3gke0J9L3RydWUvOzFxImAKKyAgXSwKKyAgW2xlXSxbCisgICAgYXhfY29tcGFyZV92ZXJzaW9uPWBlY2hvICJ4JEEKK3gkQiIgfCBzZWQgJ3MvXiAqLy8nIHwgc29ydCB8IHNlZCAicy94JHtBfS90cnVlLztzL3gke0J9L2ZhbHNlLzsxcSJgCisgIF0sCisgIFtnZV0sWworICAgIGF4X2NvbXBhcmVfdmVyc2lvbj1gZWNobyAieCRBCit4JEIiIHwgc2VkICdzL14gKi8vJyB8IHNvcnQgLXIgfCBzZWQgInMveCR7QX0vdHJ1ZS87cy94JHtCfS9mYWxzZS87MXEiYAorICBdLFsKKyAgICBkbmwgU3BsaXQgdGhlIG9wZXJhdG9yIGZyb20gdGhlIHN1YnZlcnNpb24gY291bnQgaWYgcHJlc2VudC4KKyAgICBtNF9ibWF0Y2gobTRfc3Vic3RyKCQyLDIpLAorICAgIFswXSxbCisgICAgICAjIEEgY291bnQgb2YgemVybyBtZWFucyB1c2UgdGhlIGxlbmd0aCBvZiB0aGUgc2hvcnRlciB2ZXJzaW9uLgorICAgICAgIyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIEEgYW5kIEIuCisgICAgICBheF9jb21wYXJlX3ZlcnNpb25fbGVuX0E9YGVjaG8gIiRBIiB8ICRBV0sgJ3twcmludChsZW5ndGgpfSdgCisgICAgICBheF9jb21wYXJlX3ZlcnNpb25fbGVuX0I9YGVjaG8gIiRCIiB8ICRBV0sgJ3twcmludChsZW5ndGgpfSdgCisKKyAgICAgICMgU2V0IEEgdG8gbm8gbW9yZSB0aGFuIEIncyBsZW5ndGggYW5kIEIgdG8gbm8gbW9yZSB0aGFuIEEncyBsZW5ndGguCisgICAgICBBPWBlY2hvICIkQSIgfCBzZWQgInMvXCguXHskYXhfY29tcGFyZV92ZXJzaW9uX2xlbl9CXH1cKS4qL1wxLyJgCisgICAgICBCPWBlY2hvICIkQiIgfCBzZWQgInMvXCguXHskYXhfY29tcGFyZV92ZXJzaW9uX2xlbl9BXH1cKS4qL1wxLyJgCisgICAgXSwKKyAgICBbWzAtOV0rXSxbCisgICAgICAjIEEgY291bnQgZ3JlYXRlciB0aGFuIHplcm8gbWVhbnMgdXNlIG9ubHkgdGhhdCBtYW55IHN1YnZlcnNpb25zCisgICAgICBBPWBlY2hvICIkQSIgfCBzZWQgInMvXChcKFtbMC05XV1cezRcfVwpXHttNF9zdWJzdHIoJDIsMilcfVwpLiovXDEvImAKKyAgICAgIEI9YGVjaG8gIiRCIiB8IHNlZCAicy9cKFwoW1swLTldXVx7NFx9XClce200X3N1YnN0cigkMiwyKVx9XCkuKi9cMS8iYAorICAgIF0sCisgICAgWy4rXSxbCisgICAgICBBQ19XQVJOSU5HKAorICAgICAgICBbaWxsZWdhbCBPUCBudW1lcmljIHBhcmFtZXRlcjogJDJdKQorICAgIF0sW10pCisKKyAgICAjIFBhZCB6ZXJvcyBhdCBlbmQgb2YgbnVtYmVycyB0byBtYWtlIHNhbWUgbGVuZ3RoLgorICAgIGF4X2NvbXBhcmVfdmVyc2lvbl90bXBfQT0iJEFgZWNobyAkQiB8IHNlZCAncy8uLzAvZydgIgorICAgIEI9IiRCYGVjaG8gJEEgfCBzZWQgJ3MvLi8wL2cnYCIKKyAgICBBPSIkYXhfY29tcGFyZV92ZXJzaW9uX3RtcF9BIgorCisgICAgIyBDaGVjayBmb3IgZXF1YWxpdHkgb3IgaW5lcXVhbGl0eSBhcyBuZWNlc3NhcnkuCisgICAgbTRfY2FzZShtNF90b2xvd2VyKG00X3N1YnN0cigkMiwwLDIpKSwKKyAgICBbZXFdLFsKKyAgICAgIHRlc3QgIngkQSIgPSAieCRCIiAmJiBheF9jb21wYXJlX3ZlcnNpb249dHJ1ZQorICAgIF0sCisgICAgW25lXSxbCisgICAgICB0ZXN0ICJ4JEEiICE9ICJ4JEIiICYmIGF4X2NvbXBhcmVfdmVyc2lvbj10cnVlCisgICAgXSxbCisgICAgICBBQ19XQVJOSU5HKFtpbGxlZ2FsIE9QIHBhcmFtZXRlcjogJDJdKQorICAgIF0pCisgIF0pCisKKyAgQVNfVkFSX1BPUERFRihbQV0pZG5sCisgIEFTX1ZBUl9QT1BERUYoW0JdKWRubAorCisgIGRubCAjIEV4ZWN1dGUgQUNUSU9OLUlGLVRSVUUgLyBBQ1RJT04tSUYtRkFMU0UuCisgIGlmIHRlc3QgIiRheF9jb21wYXJlX3ZlcnNpb24iID0gInRydWUiIDsgdGhlbgorICAgIG00X2lmdmFsbihbJDRdLFskNF0sWzpdKWRubAorICAgIG00X2lmdmFsbihbJDVdLFtlbHNlICQ1XSlkbmwKKyAgZmkKK10pIGRubCBBWF9DT01QQVJFX1ZFUlNJT04KZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfY3h4X2NvbXBpbGVfc3RkY3h4Lm00IGIvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHgubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5ZWFlZAotLS0gL2Rldi9udWxsCisrKyBiL2FjbG9jYWwvYXhfY3h4X2NvbXBpbGVfc3RkY3h4Lm00CkBAIC0wLDAgKzEsOTQ4IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2N4eF9jb21waWxlX3N0ZGN4eC5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0NYWF9DT01QSUxFX1NURENYWChWRVJTSU9OLCBbZXh0fG5vZXh0XSwgW21hbmRhdG9yeXxvcHRpb25hbF0pCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgQ2hlY2sgZm9yIGJhc2VsaW5lIGxhbmd1YWdlIGNvdmVyYWdlIGluIHRoZSBjb21waWxlciBmb3IgdGhlIHNwZWNpZmllZAorIyAgIHZlcnNpb24gb2YgdGhlIEMrKyBzdGFuZGFyZC4gIElmIG5lY2Vzc2FyeSwgYWRkIHN3aXRjaGVzIHRvIENYWCBhbmQKKyMgICBDWFhDUFAgdG8gZW5hYmxlIHN1cHBvcnQuICBWRVJTSU9OIG1heSBiZSAnMTEnIChmb3IgdGhlIEMrKzExIHN0YW5kYXJkKQorIyAgIG9yICcxNCcgKGZvciB0aGUgQysrMTQgc3RhbmRhcmQpLgorIworIyAgIFRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHNwZWNpZmllZCwgaW5kaWNhdGVzIHdoZXRoZXIgeW91IGluc2lzdCBvbiBhbgorIyAgIGV4dGVuZGVkIG1vZGUgKGUuZy4gLXN0ZD1nbnUrKzExKSBvciBhIHN0cmljdCBjb25mb3JtYW5jZSBtb2RlIChlLmcuCisjICAgLXN0ZD1jKysxMSkuICBJZiBuZWl0aGVyIGlzIHNwZWNpZmllZCwgeW91IGdldCB3aGF0ZXZlciB3b3Jrcywgd2l0aAorIyAgIHByZWZlcmVuY2UgZm9yIGFuIGV4dGVuZGVkIG1vZGUuCisjCisjICAgVGhlIHRoaXJkIGFyZ3VtZW50LCBpZiBzcGVjaWZpZWQgJ21hbmRhdG9yeScgb3IgaWYgbGVmdCB1bnNwZWNpZmllZCwKKyMgICBpbmRpY2F0ZXMgdGhhdCBiYXNlbGluZSBzdXBwb3J0IGZvciB0aGUgc3BlY2lmaWVkIEMrKyBzdGFuZGFyZCBpcworIyAgIHJlcXVpcmVkIGFuZCB0aGF0IHRoZSBtYWNybyBzaG91bGQgZXJyb3Igb3V0IGlmIG5vIG1vZGUgd2l0aCB0aGF0CisjICAgc3VwcG9ydCBpcyBmb3VuZC4gIElmIHNwZWNpZmllZCAnb3B0aW9uYWwnLCB0aGVuIGNvbmZpZ3VyYXRpb24gcHJvY2VlZHMKKyMgICByZWdhcmRsZXNzLCBhZnRlciBkZWZpbmluZyBIQVZFX0NYWCR7VkVSU0lPTn0gaWYgYW5kIG9ubHkgaWYgYQorIyAgIHN1cHBvcnRpbmcgbW9kZSBpcyBmb3VuZC4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAwOCBCZW5qYW1pbiBLb3NuaWsgPGJrb3pAcmVkaGF0LmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTIgWmFjayBXZWluYmVyZyA8emFja3dAcGFuaXguY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxMyBSb3kgU3RvZ25lciA8cm95c3RnbnJAaWNlcy51dGV4YXMuZWR1PgorIyAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxNSBHb29nbGUgSW5jLjsgY29udHJpYnV0ZWQgYnkgQWxleGV5IFNva29sb3YgPHNva29sb3ZAZ29vZ2xlLmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTUgUGF1bCBOb3JtYW4gPHBlbm9ybWFuQG1hYy5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDE1IE1vcml0eiBLbGFtbWxlciA8bW9yaXR6QGtsYW1tbGVyLmV1PgorIyAgIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOCBLcnplc2ltaXIgTm93YWsgPHFkbGFjekBnbWFpbC5jb20+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKKyMgICB3YXJyYW50eS4KKworI3NlcmlhbCAxMAorCitkbmwgIFRoaXMgbWFjcm8gaXMgYmFzZWQgb24gdGhlIGNvZGUgZnJvbSB0aGUgQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExIG1hY3JvCitkbmwgIChzZXJpYWwgdmVyc2lvbiBudW1iZXIgMTMpLgorCitBQ19ERUZVTihbQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXSwgW2RubAorICBtNF9pZihbJDFdLCBbMTFdLCBbYXhfY3h4X2NvbXBpbGVfYWx0ZXJuYXRpdmVzPSIxMSAweCJdLAorICAgICAgICBbJDFdLCBbMTRdLCBbYXhfY3h4X2NvbXBpbGVfYWx0ZXJuYXRpdmVzPSIxNCAxeSJdLAorICAgICAgICBbJDFdLCBbMTddLCBbYXhfY3h4X2NvbXBpbGVfYWx0ZXJuYXRpdmVzPSIxNyAxeiJdLAorICAgICAgICBbbTRfZmF0YWwoW2ludmFsaWQgZmlyc3QgYXJndW1lbnQgYCQxJyB0byBBWF9DWFhfQ09NUElMRV9TVERDWFhdKV0pZG5sCisgIG00X2lmKFskMl0sIFtdLCBbXSwKKyAgICAgICAgWyQyXSwgW2V4dF0sIFtdLAorICAgICAgICBbJDJdLCBbbm9leHRdLCBbXSwKKyAgICAgICAgW200X2ZhdGFsKFtpbnZhbGlkIHNlY29uZCBhcmd1bWVudCBgJDInIHRvIEFYX0NYWF9DT01QSUxFX1NURENYWF0pXSlkbmwKKyAgbTRfaWYoWyQzXSwgW10sIFtheF9jeHhfY29tcGlsZV9jeHgkMV9yZXF1aXJlZD10cnVlXSwKKyAgICAgICAgWyQzXSwgW21hbmRhdG9yeV0sIFtheF9jeHhfY29tcGlsZV9jeHgkMV9yZXF1aXJlZD10cnVlXSwKKyAgICAgICAgWyQzXSwgW29wdGlvbmFsXSwgW2F4X2N4eF9jb21waWxlX2N4eCQxX3JlcXVpcmVkPWZhbHNlXSwKKyAgICAgICAgW200X2ZhdGFsKFtpbnZhbGlkIHRoaXJkIGFyZ3VtZW50IGAkMycgdG8gQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXSldKQorICBBQ19MQU5HX1BVU0goW0MrK10pZG5sCisgIGFjX3N1Y2Nlc3M9bm8KKworICBtNF9pZihbJDJdLCBbbm9leHRdLCBbXSwgW2RubAorICBpZiB0ZXN0IHgkYWNfc3VjY2VzcyA9IHhubzsgdGhlbgorICAgIGZvciBhbHRlcm5hdGl2ZSBpbiAke2F4X2N4eF9jb21waWxlX2FsdGVybmF0aXZlc307IGRvCisgICAgICBzd2l0Y2g9Ii1zdGQ9Z251Kyske2FsdGVybmF0aXZlfSIKKyAgICAgIGNhY2hldmFyPUFTX1RSX1NIKFtheF9jdl9jeHhfY29tcGlsZV9jeHgkMV8kc3dpdGNoXSkKKyAgICAgIEFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgJENYWCBzdXBwb3J0cyBDKyskMSBmZWF0dXJlcyB3aXRoICRzd2l0Y2gsCisgICAgICAgICAgICAgICAgICAgICAkY2FjaGV2YXIsCisgICAgICAgIFthY19zYXZlX0NYWD0iJENYWCIKKyAgICAgICAgIENYWD0iJENYWCAkc3dpdGNoIgorICAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5XyQxXSldLAorICAgICAgICAgIFtldmFsICRjYWNoZXZhcj15ZXNdLAorICAgICAgICAgIFtldmFsICRjYWNoZXZhcj1ub10pCisgICAgICAgICBDWFg9IiRhY19zYXZlX0NYWCJdKQorICAgICAgaWYgZXZhbCB0ZXN0IHhcJCRjYWNoZXZhciA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQ1hYPSIkQ1hYICRzd2l0Y2giCisgICAgICAgIGlmIHRlc3QgLW4gIiRDWFhDUFAiIDsgdGhlbgorICAgICAgICAgIENYWENQUD0iJENYWENQUCAkc3dpdGNoIgorICAgICAgICBmaQorICAgICAgICBhY19zdWNjZXNzPXllcworICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpXSkKKworICBtNF9pZihbJDJdLCBbZXh0XSwgW10sIFtkbmwKKyAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KKyAgICBkbmwgSFAncyBhQ0MgbmVlZHMgK3N0ZD1jKysxMSBhY2NvcmRpbmcgdG86CisgICAgZG5sIGh0dHA6Ly9oMjEwMDcud3d3Mi5ocC5jb20vcG9ydGFsL2Rvd25sb2FkL2ZpbGVzL3VucHJvdC9hQ3h4L1BERl9SZWxlYXNlX05vdGVzLzc2OTE0OS0wMDEucGRmCisgICAgZG5sIENyYXkncyBjcmF5Q0MgbmVlZHMgIi1oIHN0ZD1jKysxMSIKKyAgICBmb3IgYWx0ZXJuYXRpdmUgaW4gJHtheF9jeHhfY29tcGlsZV9hbHRlcm5hdGl2ZXN9OyBkbworICAgICAgZm9yIHN3aXRjaCBpbiAtc3RkPWMrKyR7YWx0ZXJuYXRpdmV9ICtzdGQ9YysrJHthbHRlcm5hdGl2ZX0gIi1oIHN0ZD1jKyske2FsdGVybmF0aXZlfSI7IGRvCisgICAgICAgIGNhY2hldmFyPUFTX1RSX1NIKFtheF9jdl9jeHhfY29tcGlsZV9jeHgkMV8kc3dpdGNoXSkKKyAgICAgICAgQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciAkQ1hYIHN1cHBvcnRzIEMrKyQxIGZlYXR1cmVzIHdpdGggJHN3aXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgJGNhY2hldmFyLAorICAgICAgICAgIFthY19zYXZlX0NYWD0iJENYWCIKKyAgICAgICAgICAgQ1hYPSIkQ1hYICRzd2l0Y2giCisgICAgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV8kMV0pXSwKKyAgICAgICAgICAgIFtldmFsICRjYWNoZXZhcj15ZXNdLAorICAgICAgICAgICAgW2V2YWwgJGNhY2hldmFyPW5vXSkKKyAgICAgICAgICAgQ1hYPSIkYWNfc2F2ZV9DWFgiXSkKKyAgICAgICAgaWYgZXZhbCB0ZXN0IHhcJCRjYWNoZXZhciA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICBDWFg9IiRDWFggJHN3aXRjaCIKKyAgICAgICAgICBpZiB0ZXN0IC1uICIkQ1hYQ1BQIiA7IHRoZW4KKyAgICAgICAgICAgIENYWENQUD0iJENYWENQUCAkc3dpdGNoIgorICAgICAgICAgIGZpCisgICAgICAgICAgYWNfc3VjY2Vzcz15ZXMKKyAgICAgICAgICBicmVhaworICAgICAgICBmaQorICAgICAgZG9uZQorICAgICAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4eWVzOyB0aGVuCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmldKQorICBBQ19MQU5HX1BPUChbQysrXSkKKyAgaWYgdGVzdCB4JGF4X2N4eF9jb21waWxlX2N4eCQxX3JlcXVpcmVkID0geHRydWU7IHRoZW4KKyAgICBpZiB0ZXN0IHgkYWNfc3VjY2VzcyA9IHhubzsgdGhlbgorICAgICAgQUNfTVNHX0VSUk9SKFsqKiogQSBjb21waWxlciB3aXRoIHN1cHBvcnQgZm9yIEMrKyQxIGxhbmd1YWdlIGZlYXR1cmVzIGlzIHJlcXVpcmVkLl0pCisgICAgZmkKKyAgZmkKKyAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KKyAgICBIQVZFX0NYWCQxPTAKKyAgICBBQ19NU0dfTk9USUNFKFtObyBjb21waWxlciB3aXRoIEMrKyQxIHN1cHBvcnQgd2FzIGZvdW5kXSkKKyAgZWxzZQorICAgIEhBVkVfQ1hYJDE9MQorICAgIEFDX0RFRklORShIQVZFX0NYWCQxLDEsCisgICAgICAgICAgICAgIFtkZWZpbmUgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGJhc2ljIEMrKyQxIHN5bnRheF0pCisgIGZpCisgIEFDX1NVQlNUKEhBVkVfQ1hYJDEpCitdKQorCisKK2RubCAgVGVzdCBib2R5IGZvciBjaGVja2luZyBDKysxMSBzdXBwb3J0CisKK200X2RlZmluZShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV8xMV0sCisgIF9BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzExCispCisKKworZG5sICBUZXN0IGJvZHkgZm9yIGNoZWNraW5nIEMrKzE0IHN1cHBvcnQKKworbTRfZGVmaW5lKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5XzE0XSwKKyAgX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTEKKyAgX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTQKKykKKworbTRfZGVmaW5lKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5XzE3XSwKKyAgX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTEKKyAgX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTQKKyAgX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTcKKykKKworZG5sICBUZXN0cyBmb3IgbmV3IGZlYXR1cmVzIGluIEMrKzExCisKK200X2RlZmluZShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTFdLCBbWworCisvLyBJZiB0aGUgY29tcGlsZXIgYWRtaXRzIHRoYXQgaXQgaXMgbm90IHJlYWR5IGZvciBDKysxMSwgd2h5IHRvcnR1cmUgaXQ/CisvLyBIb3BlZnVsbHksIHRoaXMgd2lsbCBzcGVlZCB1cCB0aGUgdGVzdC4KKworI2lmbmRlZiBfX2NwbHVzcGx1cworCisjZXJyb3IgIlRoaXMgaXMgbm90IGEgQysrIGNvbXBpbGVyIgorCisjZWxpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKworI2Vycm9yICJUaGlzIGlzIG5vdCBhIEMrKzExIGNvbXBpbGVyIgorCisjZWxzZQorCituYW1lc3BhY2UgY3h4MTEKK3sKKworICBuYW1lc3BhY2UgdGVzdF9zdGF0aWNfYXNzZXJ0CisgIHsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBjaGVjaworICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGludCkgPD0gc2l6ZW9mKFQpLCAibm90IGJpZyBlbm91Z2giKTsKKyAgICB9OworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9maW5hbF9vdmVycmlkZQorICB7CisKKyAgICBzdHJ1Y3QgQmFzZQorICAgIHsKKyAgICAgIHZpcnR1YWwgdm9pZCBmKCkge30KKyAgICB9OworCisgICAgc3RydWN0IERlcml2ZWQgOiBwdWJsaWMgQmFzZQorICAgIHsKKyAgICAgIHZpcnR1YWwgdm9pZCBmKCkgb3ZlcnJpZGUge30KKyAgICB9OworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9kb3VibGVfcmlnaHRfYW5nbGVfYnJhY2tldHMKKyAgeworCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBUID4KKyAgICBzdHJ1Y3QgY2hlY2sge307CisKKyAgICB0eXBlZGVmIGNoZWNrPHZvaWQ+IHNpbmdsZV90eXBlOworICAgIHR5cGVkZWYgY2hlY2s8Y2hlY2s8dm9pZD4+IGRvdWJsZV90eXBlOworICAgIHR5cGVkZWYgY2hlY2s8Y2hlY2s8Y2hlY2s8dm9pZD4+PiB0cmlwbGVfdHlwZTsKKyAgICB0eXBlZGVmIGNoZWNrPGNoZWNrPGNoZWNrPGNoZWNrPHZvaWQ+Pj4+IHF1YWRydXBsZV90eXBlOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9kZWNsdHlwZQorICB7CisKKyAgICBpbnQKKyAgICBmKCkKKyAgICB7CisgICAgICBpbnQgYSA9IDE7CisgICAgICBkZWNsdHlwZShhKSBiID0gMjsKKyAgICAgIHJldHVybiBhICsgYjsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3R5cGVfZGVkdWN0aW9uCisgIHsKKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyID4KKyAgICBzdHJ1Y3QgaXNfc2FtZQorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7CisgICAgfTsKKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgVCA+CisgICAgc3RydWN0IGlzX3NhbWU8VCwgVD4KKyAgICB7CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7CisgICAgfTsKKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyID4KKyAgICBhdXRvCisgICAgYWRkKFQxIGExLCBUMiBhMikgLT4gZGVjbHR5cGUoYTEgKyBhMikKKyAgICB7CisgICAgICByZXR1cm4gYTEgKyBhMjsKKyAgICB9CisKKyAgICBpbnQKKyAgICB0ZXN0KGNvbnN0IGludCBjLCB2b2xhdGlsZSBpbnQgdikKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZSgwKT46OnZhbHVlID09IHRydWUsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKGMpPjo6dmFsdWUgPT0gZmFsc2UsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKHYpPjo6dmFsdWUgPT0gZmFsc2UsICIiKTsKKyAgICAgIGF1dG8gYWMgPSBjOworICAgICAgYXV0byBhdiA9IHY7CisgICAgICBhdXRvIHN1bWkgPSBhYyArIGF2ICsgJ3gnOworICAgICAgYXV0byBzdW1mID0gYWMgKyBhdiArIDEuMDsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKGFjKT46OnZhbHVlID09IHRydWUsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKGF2KT46OnZhbHVlID09IHRydWUsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKHN1bWkpPjo6dmFsdWUgPT0gdHJ1ZSwgIiIpOworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCwgZGVjbHR5cGUoc3VtZik+Ojp2YWx1ZSA9PSBmYWxzZSwgIiIpOworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCwgZGVjbHR5cGUoYWRkKGMsIHYpKT46OnZhbHVlID09IHRydWUsICIiKTsKKyAgICAgIHJldHVybiAoc3VtZiA+IDAuMCkgPyBzdW1pIDogYWRkKGMsIHYpOworICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3Rfbm9leGNlcHQKKyAgeworCisgICAgaW50IGYoKSB7IHJldHVybiAwOyB9CisgICAgaW50IGcoKSBub2V4Y2VwdCB7IHJldHVybiAwOyB9CisKKyAgICBzdGF0aWNfYXNzZXJ0KG5vZXhjZXB0KGYoKSkgPT0gZmFsc2UsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG5vZXhjZXB0KGcoKSkgPT0gdHJ1ZSwgIiIpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9jb25zdGV4cHIKKyAgeworCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBDaGFyVCA+CisgICAgdW5zaWduZWQgbG9uZyBjb25zdGV4cHIKKyAgICBzdHJsZW5fY19yKGNvbnN0IENoYXJUICpjb25zdCBzLCBjb25zdCB1bnNpZ25lZCBsb25nIGFjYykgbm9leGNlcHQKKyAgICB7CisgICAgICByZXR1cm4gKnMgPyBzdHJsZW5fY19yKHMgKyAxLCBhY2MgKyAxKSA6IGFjYzsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIENoYXJUID4KKyAgICB1bnNpZ25lZCBsb25nIGNvbnN0ZXhwcgorICAgIHN0cmxlbl9jKGNvbnN0IENoYXJUICpjb25zdCBzKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIHJldHVybiBzdHJsZW5fY19yKHMsIDBVTCk7CisgICAgfQorCisgICAgc3RhdGljX2Fzc2VydChzdHJsZW5fYygiIikgPT0gMFVMLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdHJsZW5fYygiMSIpID09IDFVTCwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3RybGVuX2MoImV4YW1wbGUiKSA9PSA3VUwsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0cmxlbl9jKCJhbm90aGVyXDBleGFtcGxlIikgPT0gN1VMLCAiIik7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3J2YWx1ZV9yZWZlcmVuY2VzCisgIHsKKworICAgIHRlbXBsYXRlIDwgaW50IE4gPgorICAgIHN0cnVjdCBhbnN3ZXIKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3RleHByIGludCB2YWx1ZSA9IE47CisgICAgfTsKKworICAgIGFuc3dlcjwxPiBmKGludCYpICAgICAgIHsgcmV0dXJuIGFuc3dlcjwxPigpOyB9CisgICAgYW5zd2VyPDI+IGYoY29uc3QgaW50JikgeyByZXR1cm4gYW5zd2VyPDI+KCk7IH0KKyAgICBhbnN3ZXI8Mz4gZihpbnQmJikgICAgICB7IHJldHVybiBhbnN3ZXI8Mz4oKTsgfQorCisgICAgdm9pZAorICAgIHRlc3QoKQorICAgIHsKKyAgICAgIGludCBpID0gMDsKKyAgICAgIGNvbnN0IGludCBjID0gMDsKKyAgICAgIHN0YXRpY19hc3NlcnQoZGVjbHR5cGUoZihpKSk6OnZhbHVlID09IDEsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoZGVjbHR5cGUoZihjKSk6OnZhbHVlID09IDIsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoZGVjbHR5cGUoZigwKSk6OnZhbHVlID09IDMsICIiKTsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3VuaWZvcm1faW5pdGlhbGl6YXRpb24KKyAgeworCisgICAgc3RydWN0IHRlc3QKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3QgaW50IHplcm8ge307CisgICAgICBzdGF0aWMgY29uc3QgaW50IG9uZSB7MX07CisgICAgfTsKKworICAgIHN0YXRpY19hc3NlcnQodGVzdDo6emVybyA9PSAwLCAiIik7CisgICAgc3RhdGljX2Fzc2VydCh0ZXN0OjpvbmUgPT0gMSwgIiIpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9sYW1iZGFzCisgIHsKKworICAgIHZvaWQKKyAgICB0ZXN0MSgpCisgICAgeworICAgICAgYXV0byBsYW1iZGExID0gW10oKXt9OworICAgICAgYXV0byBsYW1iZGEyID0gbGFtYmRhMTsKKyAgICAgIGxhbWJkYTEoKTsKKyAgICAgIGxhbWJkYTIoKTsKKyAgICB9CisKKyAgICBpbnQKKyAgICB0ZXN0MigpCisgICAgeworICAgICAgYXV0byBhID0gW10oaW50IGksIGludCBqKXsgcmV0dXJuIGkgKyBqOyB9KDEsIDIpOworICAgICAgYXV0byBiID0gW10oKSAtPiBpbnQgeyByZXR1cm4gJzAnOyB9KCk7CisgICAgICBhdXRvIGMgPSBbPV0oKXsgcmV0dXJuIGEgKyBiOyB9KCk7CisgICAgICBhdXRvIGQgPSBbJl0oKXsgcmV0dXJuIGM7IH0oKTsKKyAgICAgIGF1dG8gZSA9IFthLCAmYl0oaW50IHgpIG11dGFibGUgeworICAgICAgICBjb25zdCBhdXRvIGlkZW50aXR5ID0gW10oaW50IHkpeyByZXR1cm4geTsgfTsKKyAgICAgICAgZm9yIChhdXRvIGkgPSAwOyBpIDwgYTsgKytpKQorICAgICAgICAgIGEgKz0gYi0tOworICAgICAgICByZXR1cm4geCArIGlkZW50aXR5KGEgKyBiKTsKKyAgICAgIH0oMCk7CisgICAgICByZXR1cm4gYSArIGIgKyBjICsgZCArIGU7CisgICAgfQorCisgICAgaW50CisgICAgdGVzdDMoKQorICAgIHsKKyAgICAgIGNvbnN0IGF1dG8gbnVsbGFyeSA9IFtdKCl7IHJldHVybiAwOyB9OworICAgICAgY29uc3QgYXV0byB1bmFyeSA9IFtdKGludCB4KXsgcmV0dXJuIHg7IH07CisgICAgICB1c2luZyBudWxsYXJ5X3QgPSBkZWNsdHlwZShudWxsYXJ5KTsKKyAgICAgIHVzaW5nIHVuYXJ5X3QgPSBkZWNsdHlwZSh1bmFyeSk7CisgICAgICBjb25zdCBhdXRvIGhpZ2hlcjFzdCA9IFtdKG51bGxhcnlfdCBmKXsgcmV0dXJuIGYoKTsgfTsKKyAgICAgIGNvbnN0IGF1dG8gaGlnaGVyMm5kID0gW3VuYXJ5XShudWxsYXJ5X3QgZjEpeworICAgICAgICByZXR1cm4gW3VuYXJ5LCBmMV0odW5hcnlfdCBmMil7IHJldHVybiBmMih1bmFyeShmMSgpKSk7IH07CisgICAgICB9OworICAgICAgcmV0dXJuIGhpZ2hlcjFzdChudWxsYXJ5KSArIGhpZ2hlcjJuZChudWxsYXJ5KSh1bmFyeSk7CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF92YXJpYWRpY190ZW1wbGF0ZXMKKyAgeworCisgICAgdGVtcGxhdGUgPGludC4uLj4KKyAgICBzdHJ1Y3Qgc3VtOworCisgICAgdGVtcGxhdGUgPGludCBOMCwgaW50Li4uIE4xdG9OPgorICAgIHN0cnVjdCBzdW08TjAsIE4xdG9OLi4uPgorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYXV0byB2YWx1ZSA9IE4wICsgc3VtPE4xdG9OLi4uPjo6dmFsdWU7CisgICAgfTsKKworICAgIHRlbXBsYXRlIDw+CisgICAgc3RydWN0IHN1bTw+CisgICAgeworICAgICAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIHZhbHVlID0gMDsKKyAgICB9OworCisgICAgc3RhdGljX2Fzc2VydChzdW08Pjo6dmFsdWUgPT0gMCwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3VtPDE+Ojp2YWx1ZSA9PSAxLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdW08MjM+Ojp2YWx1ZSA9PSAyMywgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3VtPDEsIDI+Ojp2YWx1ZSA9PSAzLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdW08NSwgNSwgMTE+Ojp2YWx1ZSA9PSAyMSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3VtPDIsIDMsIDUsIDcsIDExLCAxMz46OnZhbHVlID09IDQxLCAiIik7CisKKyAgfQorCisgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTM3MjgxODQvdGVtcGxhdGUtYWxpYXNlcy1hbmQtc2ZpbmFlCisgIC8vIENsYW5nIDMuMSBmYWlscyB3aXRoIGhlYWRlcnMgb2YgbGlic3RkKysgNC44LjMgd2hlbiB1c2luZyBzdGQ6OmZ1bmN0aW9uCisgIC8vIGJlY2F1c2Ugb2YgdGhpcy4KKyAgbmFtZXNwYWNlIHRlc3RfdGVtcGxhdGVfYWxpYXNfc2ZpbmFlCisgIHsKKworICAgIHN0cnVjdCBmb28ge307CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHVzaW5nIG1lbWJlciA9IHR5cGVuYW1lIFQ6Om1lbWJlcl90eXBlOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICB2b2lkIGZ1bmMoLi4uKSB7fQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICB2b2lkIGZ1bmMobWVtYmVyPFQ+Kikge30KKworICAgIHZvaWQgdGVzdCgpOworCisgICAgdm9pZCB0ZXN0KCkgeyBmdW5jPGZvbz4oMCk7IH0KKworICB9CisKK30gIC8vIG5hbWVzcGFjZSBjeHgxMQorCisjZW5kaWYgIC8vIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKworXV0pCisKKworZG5sICBUZXN0cyBmb3IgbmV3IGZlYXR1cmVzIGluIEMrKzE0CisKK200X2RlZmluZShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTRdLCBbWworCisvLyBJZiB0aGUgY29tcGlsZXIgYWRtaXRzIHRoYXQgaXQgaXMgbm90IHJlYWR5IGZvciBDKysxNCwgd2h5IHRvcnR1cmUgaXQ/CisvLyBIb3BlZnVsbHksIHRoaXMgd2lsbCBzcGVlZCB1cCB0aGUgdGVzdC4KKworI2lmbmRlZiBfX2NwbHVzcGx1cworCisjZXJyb3IgIlRoaXMgaXMgbm90IGEgQysrIGNvbXBpbGVyIgorCisjZWxpZiBfX2NwbHVzcGx1cyA8IDIwMTQwMkwKKworI2Vycm9yICJUaGlzIGlzIG5vdCBhIEMrKzE0IGNvbXBpbGVyIgorCisjZWxzZQorCituYW1lc3BhY2UgY3h4MTQKK3sKKworICBuYW1lc3BhY2UgdGVzdF9wb2x5bW9ycGhpY19sYW1iZGFzCisgIHsKKworICAgIGludAorICAgIHRlc3QoKQorICAgIHsKKyAgICAgIGNvbnN0IGF1dG8gbGFtYmRhID0gW10oYXV0byYmLi4uIGFyZ3MpeworICAgICAgICBjb25zdCBhdXRvIGlzdGlueSA9IFtdKGF1dG8geCl7CisgICAgICAgICAgcmV0dXJuIChzaXplb2YoeCkgPT0gMVVMKSA/IDEgOiAwOworICAgICAgICB9OworICAgICAgICBjb25zdCBpbnQgYXJldGlueVtdID0geyBpc3RpbnkoYXJncykuLi4gfTsKKyAgICAgICAgcmV0dXJuIGFyZXRpbnlbMF07CisgICAgICB9OworICAgICAgcmV0dXJuIGxhbWJkYSgxLCAxTCwgMS4wZiwgJzEnKTsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2JpbmFyeV9saXRlcmFscworICB7CisKKyAgICBjb25zdGV4cHIgYXV0byBpdmlpID0gMGIwMDAwMDAwMDAwMTAxMDEwOworICAgIHN0YXRpY19hc3NlcnQoaXZpaSA9PSA0MiwgIndyb25nIHZhbHVlIik7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2dlbmVyYWxpemVkX2NvbnN0ZXhwcgorICB7CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIENoYXJUID4KKyAgICBjb25zdGV4cHIgdW5zaWduZWQgbG9uZworICAgIHN0cmxlbl9jKGNvbnN0IENoYXJUICpjb25zdCBzKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIGF1dG8gbGVuZ3RoID0gMFVMOworICAgICAgZm9yIChhdXRvIHAgPSBzOyAqcDsgKytwKQorICAgICAgICArK2xlbmd0aDsKKyAgICAgIHJldHVybiBsZW5ndGg7CisgICAgfQorCisgICAgc3RhdGljX2Fzc2VydChzdHJsZW5fYygiIikgPT0gMFVMLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdHJsZW5fYygieCIpID09IDFVTCwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3RybGVuX2MoInRlc3QiKSA9PSA0VUwsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0cmxlbl9jKCJhbm90aGVyXDB0ZXN0IikgPT0gN1VMLCAiIik7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2xhbWJkYV9pbml0X2NhcHR1cmUKKyAgeworCisgICAgaW50CisgICAgdGVzdCgpCisgICAgeworICAgICAgYXV0byB4ID0gMDsKKyAgICAgIGNvbnN0IGF1dG8gbGFtYmRhMSA9IFthID0geF0oaW50IGIpeyByZXR1cm4gYSArIGI7IH07CisgICAgICBjb25zdCBhdXRvIGxhbWJkYTIgPSBbYSA9IGxhbWJkYTEoeCldKCl7IHJldHVybiBhOyB9OworICAgICAgcmV0dXJuIGxhbWJkYTIoKTsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2RpZ2l0X3NlcGFyYXRvcnMKKyAgeworCisgICAgY29uc3RleHByIGF1dG8gdGVuX21pbGxpb24gPSAxMDAnMDAwJzAwMDsKKyAgICBzdGF0aWNfYXNzZXJ0KHRlbl9taWxsaW9uID09IDEwMDAwMDAwMCwgIiIpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9yZXR1cm5fdHlwZV9kZWR1Y3Rpb24KKyAgeworCisgICAgYXV0byBmKGludCYgeCkgeyByZXR1cm4geDsgfQorICAgIGRlY2x0eXBlKGF1dG8pIGcoaW50JiB4KSB7IHJldHVybiB4OyB9CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiA+CisgICAgc3RydWN0IGlzX3NhbWUKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3RleHByIGF1dG8gdmFsdWUgPSBmYWxzZTsKKyAgICB9OworCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBUID4KKyAgICBzdHJ1Y3QgaXNfc2FtZTxULCBUPgorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYXV0byB2YWx1ZSA9IHRydWU7CisgICAgfTsKKworICAgIGludAorICAgIHRlc3QoKQorICAgIHsKKyAgICAgIGF1dG8geCA9IDA7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZShmKHgpKT46OnZhbHVlLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50JiwgZGVjbHR5cGUoZyh4KSk+Ojp2YWx1ZSwgIiIpOworICAgICAgcmV0dXJuIHg7CisgICAgfQorCisgIH0KKworfSAgLy8gbmFtZXNwYWNlIGN4eDE0CisKKyNlbmRpZiAgLy8gX19jcGx1c3BsdXMgPj0gMjAxNDAyTAorCitdXSkKKworCitkbmwgIFRlc3RzIGZvciBuZXcgZmVhdHVyZXMgaW4gQysrMTcKKworbTRfZGVmaW5lKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5X25ld19pbl8xN10sIFtbCisKKy8vIElmIHRoZSBjb21waWxlciBhZG1pdHMgdGhhdCBpdCBpcyBub3QgcmVhZHkgZm9yIEMrKzE3LCB3aHkgdG9ydHVyZSBpdD8KKy8vIEhvcGVmdWxseSwgdGhpcyB3aWxsIHNwZWVkIHVwIHRoZSB0ZXN0LgorCisjaWZuZGVmIF9fY3BsdXNwbHVzCisKKyNlcnJvciAiVGhpcyBpcyBub3QgYSBDKysgY29tcGlsZXIiCisKKyNlbGlmIF9fY3BsdXNwbHVzIDwgMjAxNzAzTAorCisjZXJyb3IgIlRoaXMgaXMgbm90IGEgQysrMTcgY29tcGlsZXIiCisKKyNlbHNlCisKKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK25hbWVzcGFjZSBjeHgxNworeworCisgIG5hbWVzcGFjZSB0ZXN0X2NvbnN0ZXhwcl9sYW1iZGFzCisgIHsKKworICAgIGNvbnN0ZXhwciBpbnQgZm9vID0gW10oKXtyZXR1cm4gNDI7fSgpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdDo6bmVzdGVkX25hbWVzcGFjZTo6ZGVmaW5pdGlvbnMKKyAgeworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9mb2xkX2V4cHJlc3Npb24KKyAgeworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJncz4KKyAgICBpbnQgbXVsdGlwbHkoQXJncy4uLiBhcmdzKQorICAgIHsKKyAgICAgIHJldHVybiAoYXJncyAqIC4uLiAqIDEpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+CisgICAgYm9vbCBhbGwoQXJncy4uLiBhcmdzKQorICAgIHsKKyAgICAgIHJldHVybiAoYXJncyAmJiAuLi4pOworICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZXh0ZW5kZWRfc3RhdGljX2Fzc2VydAorICB7CisKKyAgICBzdGF0aWNfYXNzZXJ0ICh0cnVlKTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfYXV0b19icmFjZV9pbml0X2xpc3QKKyAgeworCisgICAgYXV0byBmb28gPSB7NX07CisgICAgYXV0byBiYXIgezV9OworCisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8c3RkOjppbml0aWFsaXplcl9saXN0PGludD4sIGRlY2x0eXBlKGZvbyk+Ojp2YWx1ZSk7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8aW50LCBkZWNsdHlwZShiYXIpPjo6dmFsdWUpOworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfdHlwZW5hbWVfaW5fdGVtcGxhdGVfdGVtcGxhdGVfcGFyYW1ldGVyCisgIHsKKworICAgIHRlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lPiB0eXBlbmFtZSBYPiBzdHJ1Y3QgRDsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZmFsbHRocm91Z2hfbm9kaXNjYXJkX21heWJlX3VudXNlZF9hdHRyaWJ1dGVzCisgIHsKKworICAgIGludCBmMSgpCisgICAgeworICAgICAgcmV0dXJuIDQyOworICAgIH0KKworICAgIFtbbm9kaXNjYXJkXV0gaW50IGYyKCkKKyAgICB7CisgICAgICBbW21heWJlX3VudXNlZF1dIGF1dG8gdW51c2VkID0gZjEoKTsKKworICAgICAgc3dpdGNoIChmMSgpKQorICAgICAgeworICAgICAgY2FzZSAxNzoKKyAgICAgICAgZjEoKTsKKyAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgY2FzZSA0MjoKKyAgICAgICAgZjEoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmMSgpOworICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZXh0ZW5kZWRfYWdncmVnYXRlX2luaXRpYWxpemF0aW9uCisgIHsKKworICAgIHN0cnVjdCBiYXNlMQorICAgIHsKKyAgICAgIGludCBiMSwgYjIgPSA0MjsKKyAgICB9OworCisgICAgc3RydWN0IGJhc2UyCisgICAgeworICAgICAgYmFzZTIoKSB7CisgICAgICAgIGIzID0gNDI7CisgICAgICB9CisgICAgICBpbnQgYjM7CisgICAgfTsKKworICAgIHN0cnVjdCBkZXJpdmVkIDogYmFzZTEsIGJhc2UyCisgICAgeworICAgICAgICBpbnQgZDsKKyAgICB9OworCisgICAgZGVyaXZlZCBkMSB7ezEsIDJ9LCB7fSwgNH07ICAvLyBmdWxsIGluaXRpYWxpemF0aW9uCisgICAgZGVyaXZlZCBkMiB7e30sIHt9LCA0fTsgICAgICAvLyB2YWx1ZS1pbml0aWFsaXplZCBiYXNlcworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9nZW5lcmFsX3JhbmdlX2Jhc2VkX2Zvcl9sb29wCisgIHsKKworICAgIHN0cnVjdCBpdGVyCisgICAgeworICAgICAgaW50IGk7CisKKyAgICAgIGludCYgb3BlcmF0b3IqICgpCisgICAgICB7CisgICAgICAgIHJldHVybiBpOworICAgICAgfQorCisgICAgICBjb25zdCBpbnQmIG9wZXJhdG9yKiAoKSBjb25zdAorICAgICAgeworICAgICAgICByZXR1cm4gaTsKKyAgICAgIH0KKworICAgICAgaXRlciYgb3BlcmF0b3IrKygpCisgICAgICB7CisgICAgICAgICsraTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorICAgIH07CisKKyAgICBzdHJ1Y3Qgc2VudGluZWwKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICB9OworCisgICAgYm9vbCBvcGVyYXRvcj09IChjb25zdCBpdGVyJiBpLCBjb25zdCBzZW50aW5lbCYgcykKKyAgICB7CisgICAgICByZXR1cm4gaS5pID09IHMuaTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0gKGNvbnN0IGl0ZXImIGksIGNvbnN0IHNlbnRpbmVsJiBzKQorICAgIHsKKyAgICAgIHJldHVybiAhKGkgPT0gcyk7CisgICAgfQorCisgICAgc3RydWN0IHJhbmdlCisgICAgeworICAgICAgaXRlciBiZWdpbigpIGNvbnN0CisgICAgICB7CisgICAgICAgIHJldHVybiB7MH07CisgICAgICB9CisKKyAgICAgIHNlbnRpbmVsIGVuZCgpIGNvbnN0CisgICAgICB7CisgICAgICAgIHJldHVybiB7NX07CisgICAgICB9CisgICAgfTsKKworICAgIHZvaWQgZigpCisgICAgeworICAgICAgcmFuZ2UgciB7fTsKKworICAgICAgZm9yIChhdXRvIGkgOiByKQorICAgICAgeworICAgICAgICBbW21heWJlX3VudXNlZF1dIGF1dG8gdiA9IGk7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9sYW1iZGFfY2FwdHVyZV9hc3Rlcmlza190aGlzX2J5X3ZhbHVlCisgIHsKKworICAgIHN0cnVjdCB0CisgICAgeworICAgICAgaW50IGk7CisgICAgICBpbnQgZm9vKCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIFsqdGhpc10oKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0oKTsKKyAgICAgIH0KKyAgICB9OworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9lbnVtX2NsYXNzX2NvbnN0cnVjdGlvbgorICB7CisKKyAgICBlbnVtIGNsYXNzIGJ5dGUgOiB1bnNpZ25lZCBjaGFyCisgICAge307CisKKyAgICBieXRlIGZvbyB7NDJ9OworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9jb25zdGV4cHJfaWYKKyAgeworCisgICAgdGVtcGxhdGUgPGJvb2wgY29uZD4KKyAgICBpbnQgZiAoKQorICAgIHsKKyAgICAgIGlmIGNvbnN0ZXhwcihjb25kKQorICAgICAgeworICAgICAgICByZXR1cm4gMTM7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHJldHVybiA0MjsKKyAgICAgIH0KKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3NlbGVjdGlvbl9zdGF0ZW1lbnRfd2l0aF9pbml0aWFsaXplcgorICB7CisKKyAgICBpbnQgZigpCisgICAgeworICAgICAgcmV0dXJuIDEzOworICAgIH0KKworICAgIGludCBmMigpCisgICAgeworICAgICAgaWYgKGF1dG8gaSA9IGYoKTsgaSA+IDApCisgICAgICB7CisgICAgICAgIHJldHVybiAzOworICAgICAgfQorCisgICAgICBzd2l0Y2ggKGF1dG8gaSA9IGYoKTsgaSArIDQpCisgICAgICB7CisgICAgICBjYXNlIDE3OgorICAgICAgICByZXR1cm4gMjsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF90ZW1wbGF0ZV9hcmd1bWVudF9kZWR1Y3Rpb25fZm9yX2NsYXNzX3RlbXBsYXRlcworICB7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIHN0cnVjdCBwYWlyCisgICAgeworICAgICAgcGFpciAoVDEgcDEsIFQyIHAyKQorICAgICAgICA6IG0xIHtwMX0sCisgICAgICAgICAgbTIge3AyfQorICAgICAge30KKworICAgICAgVDEgbTE7CisgICAgICBUMiBtMjsKKyAgICB9OworCisgICAgdm9pZCBmKCkKKyAgICB7CisgICAgICBbW21heWJlX3VudXNlZF1dIGF1dG8gcCA9IHBhaXJ7MTMsIDQydX07CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9ub25fdHlwZV9hdXRvX3RlbXBsYXRlX3BhcmFtZXRlcnMKKyAgeworCisgICAgdGVtcGxhdGUgPGF1dG8gbj4KKyAgICBzdHJ1Y3QgQgorICAgIHt9OworCisgICAgQjw1PiBiMTsKKyAgICBCPCdhJz4gYjI7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3N0cnVjdHVyZWRfYmluZGluZ3MKKyAgeworCisgICAgaW50IGFyclsyXSA9IHsgMSwgMiB9OworICAgIHN0ZDo6cGFpcjxpbnQsIGludD4gcHIgPSB7IDEsIDIgfTsKKworICAgIGF1dG8gZjEoKSAtPiBpbnQoJilbMl0KKyAgICB7CisgICAgICByZXR1cm4gYXJyOworICAgIH0KKworICAgIGF1dG8gZjIoKSAtPiBzdGQ6OnBhaXI8aW50LCBpbnQ+JgorICAgIHsKKyAgICAgIHJldHVybiBwcjsKKyAgICB9CisKKyAgICBzdHJ1Y3QgUworICAgIHsKKyAgICAgIGludCB4MSA6IDI7CisgICAgICB2b2xhdGlsZSBkb3VibGUgeTE7CisgICAgfTsKKworICAgIFMgZjMoKQorICAgIHsKKyAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICBhdXRvIFsgeDEsIHkxIF0gPSBmMSgpOworICAgIGF1dG8mIFsgeHIxLCB5cjEgXSA9IGYxKCk7CisgICAgYXV0byBbIHgyLCB5MiBdID0gZjIoKTsKKyAgICBhdXRvJiBbIHhyMiwgeXIyIF0gPSBmMigpOworICAgIGNvbnN0IGF1dG8gWyB4MywgeTMgXSA9IGYzKCk7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2V4Y2VwdGlvbl9zcGVjX3R5cGVfc3lzdGVtCisgIHsKKworICAgIHN0cnVjdCBHb29kIHt9OworICAgIHN0cnVjdCBCYWQge307CisKKyAgICB2b2lkIGcxKCkgbm9leGNlcHQ7CisgICAgdm9pZCBnMigpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBCYWQKKyAgICBmKFQqLCBUKik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgR29vZAorICAgIGYoVDEqLCBUMiopOworCisgICAgc3RhdGljX2Fzc2VydCAoc3RkOjppc19zYW1lX3Y8R29vZCwgZGVjbHR5cGUoZihnMSwgZzIpKT4pOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9pbmxpbmVfdmFyaWFibGVzCisgIHsKKworICAgIHRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgZihUKQorICAgIHt9CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgVCBnKFQpCisgICAgeworICAgICAgcmV0dXJuIFR7fTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTw+IGlubGluZSB2b2lkIGY8PihpbnQpCisgICAge30KKworICAgIHRlbXBsYXRlPD4gaW50IGc8PihpbnQpCisgICAgeworICAgICAgcmV0dXJuIDU7CisgICAgfQorCisgIH0KKworfSAgLy8gbmFtZXNwYWNlIGN4eDE3CisKKyNlbmRpZiAgLy8gX19jcGx1c3BsdXMgPCAyMDE3MDNMCisKK11dKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHhfMTEubTQgYi9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzMzZmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHhfMTEubTQKQEAgLTAsMCArMSwzOSBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExKFtleHR8bm9leHRdLCBbbWFuZGF0b3J5fG9wdGlvbmFsXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBDaGVjayBmb3IgYmFzZWxpbmUgbGFuZ3VhZ2UgY292ZXJhZ2UgaW4gdGhlIGNvbXBpbGVyIGZvciB0aGUgQysrMTEKKyMgICBzdGFuZGFyZDsgaWYgbmVjZXNzYXJ5LCBhZGQgc3dpdGNoZXMgdG8gQ1hYIGFuZCBDWFhDUFAgdG8gZW5hYmxlCisjICAgc3VwcG9ydC4KKyMKKyMgICBUaGlzIG1hY3JvIGlzIGEgY29udmVuaWVuY2UgYWxpYXMgZm9yIGNhbGxpbmcgdGhlIEFYX0NYWF9DT01QSUxFX1NURENYWAorIyAgIG1hY3JvIHdpdGggdGhlIHZlcnNpb24gc2V0IHRvIEMrKzExLiAgVGhlIHR3byBvcHRpb25hbCBhcmd1bWVudHMgYXJlCisjICAgZm9yd2FyZGVkIGxpdGVyYWxseSBhcyB0aGUgc2Vjb25kIGFuZCB0aGlyZCBhcmd1bWVudCByZXNwZWN0aXZlbHkuCisjICAgUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEFYX0NYWF9DT01QSUxFX1NURENYWCBtYWNybyBmb3IKKyMgICBtb3JlIGluZm9ybWF0aW9uLiAgSWYgeW91IHdhbnQgdG8gdXNlIHRoaXMgbWFjcm8sIHlvdSBhbHNvIG5lZWQgdG8KKyMgICBkb3dubG9hZCB0aGUgYXhfY3h4X2NvbXBpbGVfc3RkY3h4Lm00IGZpbGUuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggQmVuamFtaW4gS29zbmlrIDxia296QHJlZGhhdC5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDEyIFphY2sgV2VpbmJlcmcgPHphY2t3QHBhbml4LmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTMgUm95IFN0b2duZXIgPHJveXN0Z25yQGljZXMudXRleGFzLmVkdT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTUgR29vZ2xlIEluYy47IGNvbnRyaWJ1dGVkIGJ5IEFsZXhleSBTb2tvbG92IDxzb2tvbG92QGdvb2dsZS5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDE1IFBhdWwgTm9ybWFuIDxwZW5vcm1hbkBtYWMuY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxNSBNb3JpdHogS2xhbW1sZXIgPG1vcml0ekBrbGFtbWxlci5ldT4KKyMKKyMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKKyMgICBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UKKyMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CisjICAgd2FycmFudHkuCisKKyNzZXJpYWwgMTgKKworQVhfUkVRVUlSRV9ERUZJTkVEKFtBWF9DWFhfQ09NUElMRV9TVERDWFhdKQorQUNfREVGVU4oW0FYX0NYWF9DT01QSUxFX1NURENYWF8xMV0sIFtBWF9DWFhfQ09NUElMRV9TVERDWFgoWzExXSwgWyQxXSwgWyQyXSldKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9kbWQubTQgYi9hY2xvY2FsL2F4X2RtZC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2I4NGIwCi0tLSAvZGV2L251bGwKKysrIGIvYWNsb2NhbC9heF9kbWQubTQKQEAgLTAsMCArMSwxMDcgQEAKK2RubCBAc3lub3BzaXMgQVhfRE1ECitkbmwKK2RubCBUZXN0IGZvciB0aGUgcHJlc2VuY2Ugb2YgYSBETUQtY29tcGF0aWJsZSBEMiBjb21waWxlciwgYW5kIChvcHRpb25hbGx5KQorZG5sIHNwZWNpZmllZCBtb2R1bGVzIG9uIHRoZSBpbXBvcnQgcGF0aC4KK2RubAorZG5sIElmICJETUQiIGlzIGRlZmluZWQgaW4gdGhlIGVudmlyb25tZW50LCB0aGF0IHdpbGwgYmUgdGhlIG9ubHkKK2RubCBkbWQgY29tbWFuZCB0ZXN0ZWQuIE90aGVyd2lzZSwgYSBoYXJkLWNvZGVkIGxpc3Qgd2lsbCBiZSB1c2VkLgorZG5sCitkbmwgQWZ0ZXIgQVhfRE1EIHJ1bnMsIHRoZSBzaGVsbCB2YXJpYWJsZXMgInN1Y2Nlc3MiIGFuZCAiYXhfZG1kIiBhcmUgc2V0IHRvCitkbmwgInllcyIgb3IgIm5vIiwgYW5kICJETUQiIGlzIHNldCB0byB0aGUgYXBwcm9wcmlhdGUgY29tbWFuZC4gRnVydGhlcm1vcmUsCitkbmwgImRtZF9vcHRsaW5rIiB3aWxsIGJlIHNldCB0byAieWVzIiBvciAibm8iIGRlcGVuZGluZyBvbiB3aGV0aGVyIE9QVExJTksgaXMKK2RubCB1c2VkIGFzIHRoZSBsaW5rZXIgKERNRC9XaW5kb3dzKSwgYW5kICJkbWRfb2ZfZGlyc2VwIiB3aWxsIGJlIHNldCB0byB0aGUKK2RubCBkaXJlY3Rvcnkgc2VwYXJhdG9yIHRvIHVzZSB3aGVuIHBhc3NpbmcgLW9mIHRvIERNRCAoT1BUTElOSyByZXF1aXJlcyBhCitkbmwgYmFja3NsYXNoKS4KK2RubAorZG5sIEFYX0NIRUNLX0RfTU9EVUxFIG11c3QgYmUgcnVuIGFmdGVyIEFYX0RNRC4gSXQgdGVzdHMgZm9yIHRoZSBwcmVzZW5jZSBvZiBhCitkbmwgbW9kdWxlIGluIHRoZSBpbXBvcnQgcGF0aCBvZiB0aGUgY2hvc2VuIGNvbXBpbGVyLCBhbmQgc2V0cyB0aGUgc2hlbGwKK2RubCB2YXJpYWJsZSAic3VjY2VzcyIgdG8gInllcyIgb3IgIm5vIi4KK2RubAorZG5sIEBjYXRlZ29yeSBECitkbmwgQHZlcnNpb24gMjAxMS0wNS0zMQorZG5sIEBsaWNlbnNlIEFsbFBlcm1pc3NpdmUKK2RubAorZG5sIENvcHlyaWdodCAoQykgMjAwOSBEYXZpZCBSZWlzcworZG5sIENvcHlyaWdodCAoQykgMjAxMSBEYXZpZCBOYWRsaW5nZXIKK2RubCBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorZG5sIGFyZSBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodAorZG5sIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4KKworCitBQ19ERUZVTihbQVhfRE1EXSwKKyAgICAgICAgIFsKKyAgICAgICAgICBkbmwgSGFyZC1jb2RlZCBkZWZhdWx0IGNvbW1hbmRzIHRvIHRlc3QuCisgICAgICAgICAgRE1EX1BST0dTPSJkbWQsZ2RtZCxsZG1kIgorCisgICAgICAgICAgZG5sIEFsbG93IHRoZSB1c2VyIHRvIHNwZWNpZnkgYW4gYWx0ZXJuYXRpdmUuCisgICAgICAgICAgaWYgdGVzdCAtbiAiJERNRCIgOyB0aGVuCisgICAgICAgICAgICBETURfUFJPR1M9IiRETUQiCisgICAgICAgICAgZmkKKworICAgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgRE1EKQorCisgICAgICAgICAgIyBzdGQuYWxnb3JpdGhtIGFzIGEgcXVpY2sgd2F5IHRvIGNoZWNrIGZvciBEMi9QaG9ib3MuCisgICAgICAgICAgZWNobyAiaW1wb3J0IHN0ZC5hbGdvcml0aG07IHZvaWQgbWFpbigpIHt9IiA+IGNvbmZpZ3Rlc3RfYXhfZG1kLmQKKyAgICAgICAgICBzdWNjZXNzPW5vCisgICAgICAgICAgb0lGUz0iJElGUyIKKworICAgICAgICAgIElGUz0iLCIKKyAgICAgICAgICBmb3IgRE1EIGluICRETURfUFJPR1MgOyBkbworICAgICAgICAgICAgSUZTPSIkb0lGUyIKKworICAgICAgICAgICAgZWNobyAiUnVubmluZyBcIiRETUQgY29uZmlndGVzdF9heF9kbWQuZFwiIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICAgICAgICBpZiAkRE1EIGNvbmZpZ3Rlc3RfYXhfZG1kLmQgPiZBU19NRVNTQUdFX0xPR19GRCAyPiYxIDsgdGhlbgorICAgICAgICAgICAgICBzdWNjZXNzPXllcworICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZmkKKyAgICAgICAgICBkb25lCisKKyAgICAgICAgICBpZiB0ZXN0ICIkc3VjY2VzcyIgIT0gInllcyIgOyB0aGVuCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQorICAgICAgICAgICAgRE1EPSIiCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgICAgICAgZmkKKworICAgICAgICAgIGF4X2RtZD0iJHN1Y2Nlc3MiCisKKyAgICAgICAgICAjIFRlc3Qgd2hldGhlciBPUFRMSU5LIGlzIHVzZWQgYnkgdHJ5aW5nIGlmIERNRCBhY2NlcHRzIC1MLz8gd2l0aG91dAorICAgICAgICAgICMgZXJyb3Jpbmcgb3V0LgorICAgICAgICAgIGlmIHRlc3QgIiRzdWNjZXNzIiA9PSAieWVzIiA7IHRoZW4KKyAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyh3aGV0aGVyIERNRCB1c2VzIE9QVExJTkspCisgICAgICAgICAgICBlY2hvICJSdW5uaW5nIFzigJ0kRE1EIC1MLz8gY29uZmlndGVzdF9heF9kbWQuZFwiIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICAgICAgICBpZiAkRE1EIC1MLz8gY29uZmlndGVzdF9heF9kbWQuZCA+JkFTX01FU1NBR0VfTE9HX0ZEIDI+JjEgOyB0aGVuCisgICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICAgICAgICAgICBkbWRfb3B0bGluaz0ieWVzIgorCisgICAgICAgICAgICAgICMgVGhpcyBhY3R1YWxseSBwcm9kdWNlcyBkb3VibGUgc2xhc2hlcyBpbiB0aGUgZmluYWwgY29uZmlndXJlCisgICAgICAgICAgICAgICMgb3V0cHV0LCBidXQgYXQgbGVhc3QgaXQgd29ya3MuCisgICAgICAgICAgICAgIGRtZF9vZl9kaXJzZXA9IlxcXFwiCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIEFDX01TR19SRVNVTFQobm8pCisgICAgICAgICAgICAgIGRtZF9vcHRsaW5rPSJubyIKKyAgICAgICAgICAgICAgZG1kX29mX2RpcnNlcD0iLyIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKworICAgICAgICAgIHJtIC1mIGNvbmZpZ3Rlc3RfYXhfZG1kKgorICAgICAgICAgXSkKKworCitBQ19ERUZVTihbQVhfQ0hFQ0tfRF9NT0RVTEVdLAorICAgICAgICAgWworICAgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgRCBtb2R1bGUgWyQxXSkKKworICAgICAgICAgIGVjaG8gImltcG9ydCAkMTsgdm9pZCBtYWluKCkge30iID4gY29uZmlndGVzdF9heF9kbWQuZAorCisgICAgICAgICAgZWNobyAiUnVubmluZyBcIiRETUQgY29uZmlndGVzdF9heF9kbWQuZFwiIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICAgICAgaWYgJERNRCAtYyBjb25maWd0ZXN0X2F4X2RtZC5kID4mQVNfTUVTU0FHRV9MT0dfRkQgMj4mMSA7IHRoZW4KKyAgICAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICAgICAgICAgc3VjY2Vzcz15ZXMKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQorICAgICAgICAgICAgc3VjY2Vzcz1ubworICAgICAgICAgIGZpCisKKyAgICAgICAgICBybSAtZiBjb25maWd0ZXN0X2F4X2RtZCoKKyAgICAgICAgIF0pCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2phdmFjX2FuZF9qYXZhLm00IGIvYWNsb2NhbC9heF9qYXZhY19hbmRfamF2YS5tNAppbmRleCBmZGI0YmYwLi4wMjAzOTYwIDEwMDY0NAotLS0gYS9hY2xvY2FsL2F4X2phdmFjX2FuZF9qYXZhLm00CisrKyBiL2FjbG9jYWwvYXhfamF2YWNfYW5kX2phdmEubTQKQEAgLTcsNyArNyw3IEBACiBkbmwgamF2YSBjb21tYW5kIHRlc3RlZC4gIE90aGVyd2lzZSwgYSBoYXJkLWNvZGVkIGxpc3Qgd2lsbCBiZSB1c2VkLgogZG5sIFNpbWlsYXJseSBmb3IgIkpBVkFDIi4KIGRubAotZG5sIEFYX0pBVkFDX0FORF9KQVZBIGRvZXMgbm90IGN1cnJlbmx5IHN1cHBvcnQgdGVzdGluZyBmb3IgYSBwYXJ0aWN1bGFyCitkbmwgQVhfSkFWQUNfQU5EX0pBVkEgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgdGVzdGluZyBmb3IgYSBwYXJ0aWN1bGFyCiBkbmwgSmF2YSB2ZXJzaW9uLCB0ZXN0aW5nIGZvciBvbmx5IG9uZSBvZiAiamF2YSIgYW5kICJqYXZhYyIsIG9yCiBkbmwgY29tcGlsaW5nIG9yIHJ1bm5pbmcgdXNlci1wcm92aWRlZCBKYXZhIGNvZGUuCiBkbmwKQEAgLTU3LDYgKzU3LDEwIEBACiAgICAgICAgICAgICBlY2hvICJSdW5uaW5nIFwiJEpBVkFDIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuamF2YVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZECiAgICAgICAgICAgICBpZiAkSkFWQUMgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YS5qYXZhID4mQVNfTUVTU0FHRV9MT0dfRkQgMj4mMSA7IHRoZW4KIAorICAgICAgICAgICAgICAjIHByZXZlbnQgJEpBVkEgVk0gaXNzdWVzIHdpdGggVVRGLTggcGF0aCBuYW1lcyAoVEhSSUZULTMyNzEpCisgICAgICAgICAgICAgIG9MQ19BTEw9IiRMQ19BTEwiCisgICAgICAgICAgICAgIExDX0FMTD0iIgorCiAgICAgICAgICAgICAgIElGUz0iLCIKICAgICAgICAgICAgICAgZm9yIEpBVkEgaW4gJEpBVkFfUFJPR1MgOyBkbwogICAgICAgICAgICAgICAgIElGUz0iJG9JRlMiCkBAIC02OSw2ICs3MywxMCBAQAogCiAgICAgICAgICAgICAgIGRvbmUKIAorICAgICAgICAgICAgICAjIHJlc3RvcmUgTENfQUxMCisgICAgICAgICAgICAgIExDX0FMTD0iJG9MQ19BTEwiCisgICAgICAgICAgICAgIG9MQ19BTEw9IiIKKwogICAgICAgICAgICAgZmkKIAogICAgICAgICAgIGRvbmUKQEAgLTExMCw3ICsxMTgsNyBAQAogQUNfREVGVU4oW0FYX0NIRUNLX0FOVF9WRVJTSU9OXSwKICAgICAgICAgIFsKICAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGFudCB2ZXJzaW9uID4gJDIpCi0gICAgICAgICAgQU5UX1ZBTElEPWBleHByICQoJDEgLXZlcnNpb24gMj4vZGV2L251bGwgfCBzZWQgLW4gJ3MvLip2ZXJzaW9uIFwoQDw6QDAtOVwuQDo+QCpcKS4qL1wxL3AnKSBcPj0gJDJgCisgICAgICAgICAgQU5UX1ZBTElEPWBleHByICJ4JChwcmludGYgIiQyXG4kKCQxIC12ZXJzaW9uIDI+L2Rldi9udWxsIHwgc2VkIC1uICdzLy4qdmVyc2lvbiBcKEA8OkAwLTlcLkA6PkAqXCkuKi9cMS9wJykiIHwgc29ydCAtdCAnLicgLWsgMSwxIC1rIDIsMiAtayAzLDMgLWcgfCBzZWQgLW4gMXApIiA9ICJ4JDIiYAogICAgICAgICAgIGlmIHRlc3QgIngkQU5UX1ZBTElEIiA9ICJ4MSIgOyB0aGVuCiAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKICAgICAgICAgICBlbHNlCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2xpYl9ldmVudC5tNCBiL2FjbG9jYWwvYXhfbGliX2V2ZW50Lm00CmluZGV4IDkxZGU4MjguLmQ0ZGNkYzkgMTAwNjQ0Ci0tLSBhL2FjbG9jYWwvYXhfbGliX2V2ZW50Lm00CisrKyBiL2FjbG9jYWwvYXhfbGliX2V2ZW50Lm00CkBAIC03NSw3ICs3NSw3IEBACiAgICAgICAgICAgQUNfTEFOR19QVVNIKFtDXSkKICAgICAgICAgICBkbmwgVGhpcyBjYW4gYmUgY2hhbmdlZCB0byBBQ19MSU5LX0lGRUxTRSBpZiB5b3UgYXJlIGNyb3NzLWNvbXBpbGluZywKICAgICAgICAgICBkbmwgYnV0IHRoZW4gdGhlIHZlcnNpb24gY2Fubm90IGJlIGNoZWNrZWQuCi0gICAgICAgICAgQUNfUlVOX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisgICAgICAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwogICAgICAgICAgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICAgICAgICAgICAjaW5jbHVkZSA8ZXZlbnQuaD4KICAgICAgICAgICBdXSwgW1sKQEAgLTE0MSw3ICsxNDEsNyBAQAogCiAgICAgICAgICAgZG5sIEFsbG93IHNlYXJjaCBwYXRoIHRvIGJlIG92ZXJyaWRkZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KICAgICAgICAgICBBQ19BUkdfV0lUSChbbGliZXZlbnRdLAotICAgICAgICAgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtbGliZXZlbnRAPDpAPURJUkA6PkBdLCBbdXNlIGxpYmV2ZW50IChkZWZhdWx0IGlzIHllcykgLSBpdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5IGFuIGFsdGVybmF0ZSByb290IGRpcmVjdG9yeSBmb3IgbGliZXZlbnRdKSwKKyAgICAgICAgICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS13aXRoLWxpYmV2ZW50QDw6QD1ESVJAOj5AXSwgW3VzZSBsaWJldmVudCBbZGVmYXVsdD15ZXNdLiBPcHRpb25hbGx5IHNwZWNpZnkgdGhlIHJvb3QgcHJlZml4IGRpciB3aGVyZSBsaWJldmVudCBpcyBpbnN0YWxsZWRdKSwKICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkd2l0aHZhbCIgPSAieG5vIjsgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnRfbGliZXZlbnQ9Im5vIgpAQCAtMTY1LDcgKzE2NSw3IEBACiAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkYXhfbGliZXZlbnRfcGF0aCI7IHRoZW4KICAgICAgICAgICAgICAgQVhfTElCX0VWRU5UX0RPX0NIRUNLCiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGZvciBheF9saWJldmVudF9wYXRoIGluICIiIC91c3IgL3Vzci9sb2NhbCAvb3B0IC9vcHQvbG9jYWwgL29wdC9saWJldmVudCAiJExJQkVWRU5UX1JPT1QiIDsgZG8KKyAgICAgICAgICAgICAgZm9yIGF4X2xpYmV2ZW50X3BhdGggaW4gIiIgJGx0X3N5c3Jvb3QvdXNyICRsdF9zeXNyb290L3Vzci9sb2NhbCAkbHRfc3lzcm9vdC9vcHQgJGx0X3N5c3Jvb3Qvb3B0L2xvY2FsICRsdF9zeXNyb290L29wdC9saWJldmVudCAiJExJQkVWRU5UX1JPT1QiIDsgZG8KICAgICAgICAgICAgICAgICBBWF9MSUJfRVZFTlRfRE9fQ0hFQ0sKICAgICAgICAgICAgICAgICBpZiB0ZXN0ICIkc3VjY2VzcyIgPSAieWVzIjsgdGhlbgogICAgICAgICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2xpYl96bGliLm00IGIvYWNsb2NhbC9heF9saWJfemxpYi5tNAppbmRleCA4YzEwYWI0Li5iZGI5ZTExIDEwMDY0NAotLS0gYS9hY2xvY2FsL2F4X2xpYl96bGliLm00CisrKyBiL2FjbG9jYWwvYXhfbGliX3psaWIubTQKQEAgLTczLDcgKzczLDcgQEAKICAgICAgICAgICAjICAgKGRlZmluZWQgaW4gdGhlIGxpYnJhcnkpLgogICAgICAgICAgIEFDX0xBTkdfUFVTSChbQ10pCiAgICAgICAgICAgZG5sIFRoaXMgY2FuIGJlIGNoYW5nZWQgdG8gQUNfTElOS19JRkVMU0UgaWYgeW91IGFyZSBjcm9zcy1jb21waWxpbmcuCi0gICAgICAgICAgQUNfUlVOX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisgICAgICAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwogICAgICAgICAgICNpbmNsdWRlIDx6bGliLmg+CiAgICAgICAgICAgI2lmIFpMSUJfVkVSTlVNID49IDB4JFdBTlRfWkxJQl9WRVJTSU9OCiAgICAgICAgICAgI2Vsc2UKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfbHVhLm00IGIvYWNsb2NhbC9heF9sdWEubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkyMDE2NwotLS0gL2Rldi9udWxsCisrKyBiL2FjbG9jYWwvYXhfbHVhLm00CkBAIC0wLDAgKzEsNjY0IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgICAgICAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfbHVhLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfUFJPR19MVUFbKFtNSU5JTVVNLVZFUlNJT05dLCBbVE9PLUJJRy1WRVJTSU9OXSwgW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSldCisjICAgQVhfTFVBX0hFQURFUlNbKFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pXQorIyAgIEFYX0xVQV9MSUJTWyhbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKV0KKyMgICBBWF9MVUFfUkVBRExJTkVbKFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pXQorIworIyBERVNDUklQVElPTgorIworIyAgIERldGVjdCBhIEx1YSBpbnRlcnByZXRlciwgb3B0aW9uYWxseSBzcGVjaWZ5aW5nIGEgbWluaW11bSBhbmQgbWF4aW11bQorIyAgIHZlcnNpb24gbnVtYmVyLiBTZXQgdXAgaW1wb3J0YW50IEx1YSBwYXRocywgc3VjaCBhcyB0aGUgZGlyZWN0b3JpZXMgaW4KKyMgICB3aGljaCB0byBpbnN0YWxsIHNjcmlwdHMgYW5kIG1vZHVsZXMgKHNoYXJlZCBsaWJyYXJpZXMpLgorIworIyAgIEFsc28gZGV0ZWN0IEx1YSBoZWFkZXJzIGFuZCBsaWJyYXJpZXMuIFRoZSBMdWEgdmVyc2lvbiBjb250YWluZWQgaW4gdGhlCisjICAgaGVhZGVyIGlzIGNoZWNrZWQgdG8gbWF0Y2ggdGhlIEx1YSBpbnRlcnByZXRlciB2ZXJzaW9uIGV4YWN0bHkuIFdoZW4KKyMgICBzZWFyY2hpbmcgZm9yIEx1YSBsaWJyYXJpZXMsIHRoZSB2ZXJzaW9uIG51bWJlciBpcyB1c2VkIGFzIGEgc3VmZml4LgorIyAgIFRoaXMgaXMgZG9uZSB3aXRoIHRoZSBnb2FsIG9mIHN1cHBvcnRpbmcgbXVsdGlwbGUgTHVhIGluc3RhbGxzICg1LjEsCisjICAgNS4yLCBhbmQgNS4zIHNpZGUtYnktc2lkZSkuCisjCisjICAgQSBub3RlIG9uIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyB2ZXJzaW9uczogVGhpcyBmaWxlIGhhcyBiZWVuCisjICAgbW9zdGx5IHJld3JpdHRlbiBmb3Igc2VyaWFsIDE4LiBNb3N0IGRldmVsb3BlcnMgc2hvdWxkIGJlIGFibGUgdG8gdXNlCisjICAgdGhlc2UgbWFjcm9zIHdpdGhvdXQgbmVlZGluZyB0byBtb2RpZnkgY29uZmlndXJlLmFjLiBDYXJlIGhhcyBiZWVuIHRha2VuCisjICAgdG8gcHJlc2VydmUgZWFjaCBtYWNybydzIGJlaGF2aW9yLCBidXQgdGhlcmUgYXJlIHNvbWUgZGlmZmVyZW5jZXM6CisjCisjICAgMSkgQVhfV0lUSF9MVUEgaXMgZGVwcmVjYXRlZDsgaXQgbm93IGV4cGFuZHMgdG8gdGhlIGV4YWN0IHNhbWUgdGhpbmcgYXMKKyMgICBBWF9QUk9HX0xVQSB3aXRoIG5vIGFyZ3VtZW50cy4KKyMKKyMgICAyKSBBWF9MVUFfSEVBREVSUyBub3cgY2hlY2tzIHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyIGRlZmluZWQgaW4gbHVhLmgKKyMgICBtYXRjaGVzIHRoZSBpbnRlcnByZXRlciB2ZXJzaW9uLiBBWF9MVUFfSEVBREVSU19WRVJTSU9OIGlzIHRoZXJlZm9yZQorIyAgIHVubmVjZXNzYXJ5LCBzbyBpdCBpcyBkZXByZWNhdGVkIGFuZCBkb2VzIG5vdCBleHBhbmQgdG8gYW55dGhpbmcuCisjCisjICAgMykgVGhlIGNvbmZpZ3VyZSBmbGFnIC0td2l0aC1sdWEtc3VmZml4IG5vIGxvbmdlciBleGlzdHM7IHRoZSB1c2VyCisjICAgc2hvdWxkIGluc3RlYWQgc3BlY2lmeSB0aGUgTFVBIHByZWNpb3VzIHZhcmlhYmxlIG9uIHRoZSBjb21tYW5kIGxpbmUuCisjICAgU2VlIHRoZSBBWF9QUk9HX0xVQSBkZXNjcmlwdGlvbiBmb3IgZGV0YWlscy4KKyMKKyMgICBQbGVhc2UgcmVhZCB0aGUgbWFjcm8gZGVzY3JpcHRpb25zIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uLgorIworIyAgIFRoaXMgZmlsZSB3YXMgaW5zcGlyZWQgYnkgQW5kcmV3IERhbGtlJ3MgYW5kIEphbWVzIEhlbnN0cmlkZ2UncworIyAgIHB5dGhvbi5tNCBhbmQgVG9tIFBheW5lJ3MsIE1hdHRoaWV1IE1veSdzLCBhbmQgUmV1YmVuIFRob21hcydzIGF4X2x1YS5tNAorIyAgIChzZXJpYWwgMTcpLiBCYXNpY2FsbHksIHRoaXMgZmlsZSBpcyBhIG1hc2gtdXAgb2YgdGhvc2UgdHdvIGZpbGVzLiBJCisjICAgbGlrZSB0byB0aGluayBpdCBjb21iaW5lcyB0aGUgYmVzdCBvZiB0aGUgdHdvIQorIworIyAgIEFYX1BST0dfTFVBOiBTZWFyY2ggZm9yIHRoZSBMdWEgaW50ZXJwcmV0ZXIsIGFuZCBzZXQgdXAgaW1wb3J0YW50IEx1YQorIyAgIHBhdGhzLiBBZGRzIHByZWNpb3VzIHZhcmlhYmxlIExVQSwgd2hpY2ggbWF5IGNvbnRhaW4gdGhlIHBhdGggb2YgdGhlIEx1YQorIyAgIGludGVycHJldGVyLiBJZiBMVUEgaXMgYmxhbmssIHRoZSB1c2VyJ3MgcGF0aCBpcyBzZWFyY2hlZCBmb3IgYW4KKyMgICBzdWl0YWJsZSBpbnRlcnByZXRlci4KKyMKKyMgICBJZiBNSU5JTVVNLVZFUlNJT04gaXMgc3VwcGxpZWQsIHRoZW4gb25seSBMdWEgaW50ZXJwcmV0ZXJzIHdpdGggYQorIyAgIHZlcnNpb24gbnVtYmVyIGdyZWF0ZXIgb3IgZXF1YWwgdG8gTUlOSU1VTS1WRVJTSU9OIHdpbGwgYmUgYWNjZXB0ZWQuIElmCisjICAgVE9PLUJJRy1WRVJTSU9OIGlzIGFsc28gc3VwcGxpZWQsIHRoZW4gb25seSBMdWEgaW50ZXJwcmV0ZXJzIHdpdGggYQorIyAgIHZlcnNpb24gbnVtYmVyIGdyZWF0ZXIgb3IgZXF1YWwgdG8gTUlOSU1VTS1WRVJTSU9OIGFuZCBsZXNzIHRoYW4KKyMgICBUT08tQklHLVZFUlNJT04gd2lsbCBiZSBhY2NlcHRlZC4KKyMKKyMgICBUaGUgTHVhIHZlcnNpb24gbnVtYmVyLCBMVUFfVkVSU0lPTiwgaXMgZm91bmQgZnJvbSB0aGUgaW50ZXJwcmV0ZXIsIGFuZAorIyAgIHN1YnN0aXR1dGVkLiBMVUFfUExBVEZPUk0gaXMgYWxzbyBmb3VuZCwgYnV0IG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIChubworIyAgIHN0YW5kYXJkIHJlcHJlc2VudGF0aW9uKS4KKyMKKyMgICBGaW5hbGx5LCB0aGUgbWFjcm8gZmluZHMgZm91ciBwYXRoczoKKyMKKyMgICAgIGx1YWRpciAgICAgICAgICAgICBEaXJlY3RvcnkgdG8gaW5zdGFsbCBMdWEgc2NyaXB0cy4KKyMgICAgIHBrZ2x1YWRpciAgICAgICAgICAkbHVhZGlyLyRQQUNLQUdFCisjICAgICBsdWFleGVjZGlyICAgICAgICAgRGlyZWN0b3J5IHRvIGluc3RhbGwgTHVhIG1vZHVsZXMuCisjICAgICBwa2dsdWFleGVjZGlyICAgICAgJGx1YWV4ZWNkaXIvJFBBQ0tBR0UKKyMKKyMgICBUaGVzZSBwYXRocyBhcmUgZm91bmQgYmFzZWQgb24gJHByZWZpeCwgJGV4ZWNfcHJlZml4LCBMdWEncworIyAgIHBhY2thZ2UucGF0aCwgYW5kIHBhY2thZ2UuY3BhdGguIFRoZSBmaXJzdCBwYXRoIG9mIHBhY2thZ2UucGF0aAorIyAgIGJlZ2lubmluZyB3aXRoICRwcmVmaXggaXMgc2VsZWN0ZWQgYXMgbHVhZGlyLiBUaGUgZmlyc3QgcGF0aCBvZgorIyAgIHBhY2thZ2UuY3BhdGggYmVnaW5uaW5nIHdpdGggJGV4ZWNfcHJlZml4IGlzIHVzZWQgYXMgbHVhZXhlY2Rpci4gVGhpcworIyAgIHNob3VsZCB3b3JrIG9uIGFsbCByZWFzb25hYmxlIEx1YSBpbnN0YWxsYXRpb25zLiBJZiBhIHBhdGggY2Fubm90IGJlCisjICAgZGV0ZXJtaW5lZCwgYSBkZWZhdWx0IHBhdGggaXMgdXNlZC4gT2YgY291cnNlLCB0aGUgdXNlciBjYW4gb3ZlcnJpZGUKKyMgICB0aGVzZSBsYXRlciB3aGVuIGludm9raW5nIG1ha2UuCisjCisjICAgICBsdWFkaXIgICAgICAgICAgICAgRGVmYXVsdDogJHByZWZpeC9zaGFyZS9sdWEvJExVQV9WRVJTSU9OCisjICAgICBsdWFleGVjZGlyICAgICAgICAgRGVmYXVsdDogJGV4ZWNfcHJlZml4L2xpYi9sdWEvJExVQV9WRVJTSU9OCisjCisjICAgVGhlc2UgZGlyZWN0b3JpZXMgY2FuIGJlIHVzZWQgYnkgQXV0b21ha2UgYXMgaW5zdGFsbCBkZXN0aW5hdGlvbnMuIFRoZQorIyAgIHZhcmlhYmxlIG5hbWUgbWludXMgJ2RpcicgbmVlZHMgdG8gYmUgdXNlZCBhcyBhIHByZWZpeCB0byB0aGUKKyMgICBhcHByb3ByaWF0ZSBBdXRvbWFrZSBwcmltYXJ5LCBlLmcuIGx1YV9TQ1JJUFMgb3IgbHVhZXhlY19MSUJSQVJJRVMuCisjCisjICAgSWYgYW4gYWNjZXB0YWJsZSBMdWEgaW50ZXJwcmV0ZXIgaXMgZm91bmQsIHRoZW4gQUNUSU9OLUlGLUZPVU5EIGlzCisjICAgcGVyZm9ybWVkLCBvdGhlcndpc2UgQUNUSU9OLUlGLU5PVC1GT1VORCBpcyBwcmVmb3JtZWQuIElmIEFDVElPTi1JRi1OT1QtCisjICAgRk9VTkQgaXMgYmxhbmssIHRoZW4gaXQgd2lsbCBkZWZhdWx0IHRvIHByaW50aW5nIGFuIGVycm9yLiBUbyBwcmV2ZW50CisjICAgdGhlIGRlZmF1bHQgYmVoYXZpb3IsIGdpdmUgJzonIGFzIGFuIGFjdGlvbi4KKyMKKyMgICBBWF9MVUFfSEVBREVSUzogU2VhcmNoIGZvciBMdWEgaGVhZGVycy4gUmVxdWlyZXMgdGhhdCBBWF9QUk9HX0xVQSBiZQorIyAgIGV4cGFuZGVkIGJlZm9yZSB0aGlzIG1hY3JvLiBBZGRzIHByZWNpb3VzIHZhcmlhYmxlIExVQV9JTkNMVURFLCB3aGljaAorIyAgIG1heSBjb250YWluIEx1YSBzcGVjaWZpYyBpbmNsdWRlIGZsYWdzLCBlLmcuIC1JL3Vzci9pbmNsdWRlL2x1YTUuMS4gSWYKKyMgICBMVUFfSU5DTFVERSBpcyBibGFuaywgdGhlbiB0aGlzIG1hY3JvIHdpbGwgYXR0ZW1wdCB0byBmaW5kIHN1aXRhYmxlCisjICAgZmxhZ3MuCisjCisjICAgTFVBX0lOQ0xVREUgY2FuIGJlIHVzZWQgYnkgQXV0b21ha2UgdG8gY29tcGlsZSBMdWEgbW9kdWxlcyBvcgorIyAgIGV4ZWN1dGFibGVzIHdpdGggZW1iZWRkZWQgaW50ZXJwcmV0ZXJzLiBUaGUgKl9DUFBGTEFHUyB2YXJpYWJsZXMgc2hvdWxkCisjICAgYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLCBlLmcuIG15cHJvZ19DUFBGTEFHUyA9ICQoTFVBX0lOQ0xVREUpLgorIworIyAgIFRoaXMgbWFjcm8gc2VhcmNoZXMgZm9yIHRoZSBoZWFkZXIgbHVhLmggKGFuZCBvdGhlcnMpLiBUaGUgc2VhcmNoIGlzCisjICAgcGVyZm9ybWVkIHdpdGggYSBjb21iaW5hdGlvbiBvZiBDUFBGTEFHUywgQ1BBVEgsIGV0YywgYW5kIExVQV9JTkNMVURFLgorIyAgIElmIHRoZSBzZWFyY2ggaXMgdW5zdWNjZXNzZnVsLCB0aGVuIHNvbWUgY29tbW9uIGRpcmVjdG9yaWVzIGFyZSB0cmllZC4KKyMgICBJZiB0aGUgaGVhZGVycyBhcmUgdGhlbiBmb3VuZCwgdGhlbiBMVUFfSU5DTFVERSBpcyBzZXQgYWNjb3JkaW5nbHkuCisjCisjICAgVGhlIHBhdGhzIGF1dG9tYXRpY2FsbHkgc2VhcmNoZWQgYXJlOgorIworIyAgICAgKiAvdXNyL2luY2x1ZGUvbHVhWC5ZCisjICAgICAqIC91c3IvaW5jbHVkZS9sdWEvWC5ZCisjICAgICAqIC91c3IvaW5jbHVkZS9sdWFYWQorIyAgICAgKiAvdXNyL2xvY2FsL2luY2x1ZGUvbHVhWC5ZCisjICAgICAqIC91c3IvbG9jYWwvaW5jbHVkZS9sdWEtWC5ZCisjICAgICAqIC91c3IvbG9jYWwvaW5jbHVkZS9sdWEvWC5ZCisjICAgICAqIC91c3IvbG9jYWwvaW5jbHVkZS9sdWFYWQorIworIyAgIChXaGVyZSBYLlkgaXMgdGhlIEx1YSB2ZXJzaW9uIG51bWJlciwgZS5nLiA1LjEuKQorIworIyAgIFRoZSBMdWEgdmVyc2lvbiBudW1iZXIgZm91bmQgaW4gdGhlIGhlYWRlcnMgaXMgYWx3YXlzIGNoZWNrZWQgdG8gbWF0Y2gKKyMgICB0aGUgTHVhIGludGVycHJldGVyJ3MgdmVyc2lvbiBudW1iZXIuIEx1YSBoZWFkZXJzIHdpdGggbWlzbWF0Y2hlZAorIyAgIHZlcnNpb24gbnVtYmVycyBhcmUgbm90IGFjY2VwdGVkLgorIworIyAgIElmIGhlYWRlcnMgYXJlIGZvdW5kLCB0aGVuIEFDVElPTi1JRi1GT1VORCBpcyBwZXJmb3JtZWQsIG90aGVyd2lzZQorIyAgIEFDVElPTi1JRi1OT1QtRk9VTkQgaXMgcGVyZm9ybWVkLiBJZiBBQ1RJT04tSUYtTk9ULUZPVU5EIGlzIGJsYW5rLCB0aGVuCisjICAgaXQgd2lsbCBkZWZhdWx0IHRvIHByaW50aW5nIGFuIGVycm9yLiBUbyBwcmV2ZW50IHRoZSBkZWZhdWx0IGJlaGF2aW9yLAorIyAgIHNldCB0aGUgYWN0aW9uIHRvICc6Jy4KKyMKKyMgICBBWF9MVUFfTElCUzogU2VhcmNoIGZvciBMdWEgbGlicmFyaWVzLiBSZXF1aXJlcyB0aGF0IEFYX1BST0dfTFVBIGJlCisjICAgZXhwYW5kZWQgYmVmb3JlIHRoaXMgbWFjcm8uIEFkZHMgcHJlY2lvdXMgdmFyaWFibGUgTFVBX0xJQiwgd2hpY2ggbWF5CisjICAgY29udGFpbiBMdWEgc3BlY2lmaWMgbGlua2VyIGZsYWdzLCBlLmcuIC1sbHVhNS4xLiBJZiBMVUFfTElCIGlzIGJsYW5rLAorIyAgIHRoZW4gdGhpcyBtYWNybyB3aWxsIGF0dGVtcHQgdG8gZmluZCBzdWl0YWJsZSBmbGFncy4KKyMKKyMgICBMVUFfTElCIGNhbiBiZSB1c2VkIGJ5IEF1dG9tYWtlIHRvIGxpbmsgTHVhIG1vZHVsZXMgb3IgZXhlY3V0YWJsZXMgd2l0aAorIyAgIGVtYmVkZGVkIGludGVycHJldGVycy4gVGhlICpfTElCQUREIGFuZCAqX0xEQUREIHZhcmlhYmxlcyBzaG91bGQgYmUgdXNlZAorIyAgIGZvciB0aGlzIHB1cnBvc2UsIGUuZy4gbXltb2RfTElCQUREID0gJChMVUFfTElCKS4KKyMKKyMgICBUaGlzIG1hY3JvIHNlYXJjaGVzIGZvciB0aGUgTHVhIGxpYnJhcnkuIE1vcmUgdGVjaG5pY2FsbHksIGl0IHNlYXJjaGVzCisjICAgZm9yIGEgbGlicmFyeSBjb250YWluaW5nIHRoZSBmdW5jdGlvbiBsdWFfbG9hZC4gVGhlIHNlYXJjaCBpcyBwZXJmb3JtZWQKKyMgICB3aXRoIGEgY29tYmluYXRpb24gb2YgTElCUywgTElCUkFSWV9QQVRILCBhbmQgTFVBX0xJQi4KKyMKKyMgICBJZiB0aGUgc2VhcmNoIGRldGVybWluZXMgdGhhdCBzb21lIGxpbmtlciBmbGFncyBhcmUgbWlzc2luZywgdGhlbiB0aG9zZQorIyAgIGZsYWdzIHdpbGwgYmUgYWRkZWQgdG8gTFVBX0xJQi4KKyMKKyMgICBJZiBsaWJyYXJpZXMgYXJlIGZvdW5kLCB0aGVuIEFDVElPTi1JRi1GT1VORCBpcyBwZXJmb3JtZWQsIG90aGVyd2lzZQorIyAgIEFDVElPTi1JRi1OT1QtRk9VTkQgaXMgcGVyZm9ybWVkLiBJZiBBQ1RJT04tSUYtTk9ULUZPVU5EIGlzIGJsYW5rLCB0aGVuCisjICAgaXQgd2lsbCBkZWZhdWx0IHRvIHByaW50aW5nIGFuIGVycm9yLiBUbyBwcmV2ZW50IHRoZSBkZWZhdWx0IGJlaGF2aW9yLAorIyAgIHNldCB0aGUgYWN0aW9uIHRvICc6Jy4KKyMKKyMgICBBWF9MVUFfUkVBRExJTkU6IFNlYXJjaCBmb3IgcmVhZGxpbmUgaGVhZGVycyBhbmQgbGlicmFyaWVzLiBSZXF1aXJlcyB0aGUKKyMgICBBWF9MSUJfUkVBRExJTkUgbWFjcm8sIHdoaWNoIGlzIHByb3ZpZGVkIGJ5IGF4X2xpYl9yZWFkbGluZS5tNCBmcm9tIHRoZQorIyAgIEF1dG9jb25mIEFyY2hpdmUuCisjCisjICAgSWYgYSByZWFkbGluZSBjb21wYXRpYmxlIGxpYnJhcnkgaXMgZm91bmQsIHRoZW4gQUNUSU9OLUlGLUZPVU5EIGlzCisjICAgcGVyZm9ybWVkLCBvdGhlcndpc2UgQUNUSU9OLUlGLU5PVC1GT1VORCBpcyBwZXJmb3JtZWQuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMTUgUmV1YmVuIFRob21hcyA8cnJ0QHNjM2Qub3JnPgorIyAgIENvcHlyaWdodCAoYykgMjAxNCBUaW0gUGVya2lucyA8dHByazc3QGdtYWlsLmNvbT4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyMgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsCisjICAgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyAgIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIworIyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSByZXNwZWN0aXZlIEF1dG9jb25mIE1hY3JvJ3MgY29weXJpZ2h0IG93bmVyCisjICAgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IHRoZSBjb25maWd1cmUKKyMgICBzY3JpcHRzIHRoYXQgYXJlIHRoZSBvdXRwdXQgb2YgQXV0b2NvbmYgd2hlbiBwcm9jZXNzaW5nIHRoZSBNYWNyby4gWW91CisjICAgbmVlZCBub3QgZm9sbG93IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugd2hlbiB1c2luZworIyAgIG9yIGRpc3RyaWJ1dGluZyBzdWNoIHNjcmlwdHMsIGV2ZW4gdGhvdWdoIHBvcnRpb25zIG9mIHRoZSB0ZXh0IG9mIHRoZQorIyAgIE1hY3JvIGFwcGVhciBpbiB0aGVtLiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgZG9lcyBnb3Zlcm4KKyMgICBhbGwgb3RoZXIgdXNlIG9mIHRoZSBtYXRlcmlhbCB0aGF0IGNvbnN0aXR1dGVzIHRoZSBBdXRvY29uZiBNYWNyby4KKyMKKyMgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwgYXBwbGllcyB0byB2ZXJzaW9ucyBvZiB0aGUgQXV0b2NvbmYKKyMgICBNYWNybyByZWxlYXNlZCBieSB0aGUgQXV0b2NvbmYgQXJjaGl2ZS4gV2hlbiB5b3UgbWFrZSBhbmQgZGlzdHJpYnV0ZSBhCisjICAgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgQXV0b2NvbmYgTWFjcm8sIHlvdSBtYXkgZXh0ZW5kIHRoaXMgc3BlY2lhbAorIyAgIGV4Y2VwdGlvbiB0byB0aGUgR1BMIHRvIGFwcGx5IHRvIHlvdXIgbW9kaWZpZWQgdmVyc2lvbiBhcyB3ZWxsLgorCisjc2VyaWFsIDQwCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitkbmwgQVhfUFJPR19MVUEoW01JTklNVU0tVkVSU0lPTl0sIFtUT08tQklHLVZFUlNJT05dLAorZG5sICAgICAgICAgICAgIFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQUNfREVGVU4oW0FYX1BST0dfTFVBXSwKK1sKKyAgZG5sIENoZWNrIGZvciByZXF1aXJlZCB0b29scy4KKyAgQUNfUkVRVUlSRShbQUNfUFJPR19HUkVQXSkKKyAgQUNfUkVRVUlSRShbQUNfUFJPR19TRURdKQorCisgIGRubCBNYWtlIExVQSBhIHByZWNpb3VzIHZhcmlhYmxlLgorICBBQ19BUkdfVkFSKFtMVUFdLCBbVGhlIEx1YSBpbnRlcnByZXRlciwgZS5nLiAvdXNyL2Jpbi9sdWE1LjFdKQorCisgIGRubCBGaW5kIGEgTHVhIGludGVycHJldGVyLgorICBtNF9kZWZpbmVfZGVmYXVsdChbX0FYX0xVQV9JTlRFUlBSRVRFUl9MSVNUXSwKKyAgICBbbHVhIGx1YTUuMyBsdWE1MyBsdWE1LjIgbHVhNTIgbHVhNS4xIGx1YTUxIGx1YTUwXSkKKworICBtNF9pZihbJDFdLCBbXSwKKyAgWyBkbmwgTm8gdmVyc2lvbiBjaGVjayBpcyBuZWVkZWQuIEZpbmQgYW55IEx1YSBpbnRlcnByZXRlci4KKyAgICBBU19JRihbdGVzdCAieCRMVUEiID0gJ3gnXSwKKyAgICAgIFtBQ19QQVRIX1BST0dTKFtMVUFdLCBbX0FYX0xVQV9JTlRFUlBSRVRFUl9MSVNUXSwgWzpdKV0pCisgICAgYXhfZGlzcGxheV9MVUE9J2x1YScKKworICAgIEFTX0lGKFt0ZXN0ICJ4JExVQSIgIT0gJ3g6J10sCisgICAgICBbIGRubCBBdCBsZWFzdCBjaGVjayBpZiB0aGlzIGlzIGEgTHVhIGludGVycHJldGVyLgorICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmICRMVUEgaXMgYSBMdWEgaW50ZXJwcmV0ZXJdKQorICAgICAgICBfQVhfTFVBX0NIS19JU19JTlRSUChbJExVQV0sCisgICAgICAgICAgW0FDX01TR19SRVNVTFQoW3llc10pXSwKKyAgICAgICAgICBbIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICAgICAgICAgIEFDX01TR19FUlJPUihbbm90IGEgTHVhIGludGVycHJldGVyXSkKKyAgICAgICAgICBdKQorICAgICAgXSkKKyAgXSwKKyAgWyBkbmwgQSB2ZXJzaW9uIGNoZWNrIGlzIG5lZWRlZC4KKyAgICBBU19JRihbdGVzdCAieCRMVUEiICE9ICd4J10sCisgICAgWyBkbmwgQ2hlY2sgaWYgdGhpcyBpcyBhIEx1YSBpbnRlcnByZXRlci4KKyAgICAgIEFDX01TR19DSEVDS0lORyhbaWYgJExVQSBpcyBhIEx1YSBpbnRlcnByZXRlcl0pCisgICAgICBfQVhfTFVBX0NIS19JU19JTlRSUChbJExVQV0sCisgICAgICAgIFtBQ19NU0dfUkVTVUxUKFt5ZXNdKV0sCisgICAgICAgIFsgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgICAgIEFDX01TR19FUlJPUihbbm90IGEgTHVhIGludGVycHJldGVyXSkKKyAgICAgICAgXSkKKyAgICAgIGRubCBDaGVjayB0aGUgdmVyc2lvbi4KKyAgICAgIG00X2lmKFskMl0sIFtdLAorICAgICAgICBbX2F4X2NoZWNrX3RleHQ9IndoZXRoZXIgJExVQSB2ZXJzaW9uID49ICQxIl0sCisgICAgICAgIFtfYXhfY2hlY2tfdGV4dD0id2hldGhlciAkTFVBIHZlcnNpb24gPj0gJDEsIDwgJDIiXSkKKyAgICAgIEFDX01TR19DSEVDS0lORyhbJF9heF9jaGVja190ZXh0XSkKKyAgICAgIF9BWF9MVUFfQ0hLX1ZFUihbJExVQV0sIFskMV0sIFskMl0sCisgICAgICAgIFtBQ19NU0dfUkVTVUxUKFt5ZXNdKV0sCisgICAgICAgIFsgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgICAgIEFDX01TR19FUlJPUihbdmVyc2lvbiBpcyBvdXQgb2YgcmFuZ2UgZm9yIHNwZWNpZmllZCBMVUFdKV0pCisgICAgICBheF9kaXNwbGF5X0xVQT0kTFVBCisgICAgXSwKKyAgICBbIGRubCBUcnkgZWFjaCBpbnRlcnByZXRlciB1bnRpbCB3ZSBmaW5kIG9uZSB0aGF0IHNhdGlzZmllcyBWRVJTSU9OLgorICAgICAgbTRfaWYoWyQyXSwgW10sCisgICAgICAgIFtfYXhfY2hlY2tfdGV4dD0iZm9yIGEgTHVhIGludGVycHJldGVyIHdpdGggdmVyc2lvbiA+PSAkMSJdLAorICAgICAgICBbX2F4X2NoZWNrX3RleHQ9ImZvciBhIEx1YSBpbnRlcnByZXRlciB3aXRoIHZlcnNpb24gPj0gJDEsIDwgJDIiXSkKKyAgICAgIEFDX0NBQ0hFX0NIRUNLKFskX2F4X2NoZWNrX3RleHRdLAorICAgICAgICBbYXhfY3ZfcGF0aGxlc3NfTFVBXSwKKyAgICAgICAgWyBmb3IgYXhfY3ZfcGF0aGxlc3NfTFVBIGluIF9BWF9MVUFfSU5URVJQUkVURVJfTElTVCBub25lOyBkbworICAgICAgICAgICAgdGVzdCAieCRheF9jdl9wYXRobGVzc19MVUEiID0gJ3hub25lJyAmJiBicmVhaworICAgICAgICAgICAgX0FYX0xVQV9DSEtfSVNfSU5UUlAoWyRheF9jdl9wYXRobGVzc19MVUFdLCBbXSwgW2NvbnRpbnVlXSkKKyAgICAgICAgICAgIF9BWF9MVUFfQ0hLX1ZFUihbJGF4X2N2X3BhdGhsZXNzX0xVQV0sIFskMV0sIFskMl0sIFticmVha10pCisgICAgICAgICAgZG9uZQorICAgICAgICBdKQorICAgICAgZG5sIFNldCAkTFVBIHRvIHRoZSBhYnNvbHV0ZSBwYXRoIG9mICRheF9jdl9wYXRobGVzc19MVUEuCisgICAgICBBU19JRihbdGVzdCAieCRheF9jdl9wYXRobGVzc19MVUEiID0gJ3hub25lJ10sCisgICAgICAgIFtMVUE9JzonXSwKKyAgICAgICAgW0FDX1BBVEhfUFJPRyhbTFVBXSwgWyRheF9jdl9wYXRobGVzc19MVUFdKV0pCisgICAgICBheF9kaXNwbGF5X0xVQT0kYXhfY3ZfcGF0aGxlc3NfTFVBCisgICAgXSkKKyAgXSkKKworICBBU19JRihbdGVzdCAieCRMVUEiID0gJ3g6J10sCisgIFsgZG5sIFJ1biBhbnkgdXNlci1zcGVjaWZpZWQgYWN0aW9uLCBvciBhYm9ydC4KKyAgICBtNF9kZWZhdWx0KFskNF0sIFtBQ19NU0dfRVJST1IoW2Nhbm5vdCBmaW5kIHN1aXRhYmxlIEx1YSBpbnRlcnByZXRlcl0pXSkKKyAgXSwKKyAgWyBkbmwgUXVlcnkgTHVhIGZvciBpdHMgdmVyc2lvbiBudW1iZXIuCisgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkYXhfZGlzcGxheV9MVUEgdmVyc2lvbl0sCisgICAgICBbYXhfY3ZfbHVhX3ZlcnNpb25dLAorICAgICAgWyBkbmwgR2V0IHRoZSBpbnRlcnByZXRlciB2ZXJzaW9uIGluIFguWSBmb3JtYXQuIFRoaXMgc2hvdWxkIHdvcmsgZm9yCisgICAgICAgIGRubCBpbnRlcnByZXRlcnMgdmVyc2lvbiA1LjAgYW5kIGJleW9uZC4KKyAgICAgICAgYXhfY3ZfbHVhX3ZlcnNpb249W2AkTFVBIC1lICcKKyAgICAgICAgICAtLSByZXR1cm4gYSB2ZXJzaW9uIG51bWJlciBpbiBYLlkgZm9ybWF0CisgICAgICAgICAgbG9jYWwgXywgXywgdmVyID0gc3RyaW5nLmZpbmQoX1ZFUlNJT04sICJeTHVhICglZCslLiVkKykiKQorICAgICAgICAgIHByaW50KHZlciknYF0KKyAgICAgIF0pCisgICAgQVNfSUYoW3Rlc3QgIngkYXhfY3ZfbHVhX3ZlcnNpb24iID0gJ3gnXSwKKyAgICAgIFtBQ19NU0dfRVJST1IoW2ludmFsaWQgTHVhIHZlcnNpb24gbnVtYmVyXSldKQorICAgIEFDX1NVQlNUKFtMVUFfVkVSU0lPTl0sIFskYXhfY3ZfbHVhX3ZlcnNpb25dKQorICAgIEFDX1NVQlNUKFtMVUFfU0hPUlRfVkVSU0lPTl0sIFtgZWNobyAiJExVQV9WRVJTSU9OIiB8ICRTRUQgJ3N8XC58fCdgXSkKKworICAgIGRubCBUaGUgZm9sbG93aW5nIGNoZWNrIGlzIG5vdCBzdXBwb3J0ZWQ6CisgICAgZG5sIEF0IHRpbWVzIChsaWtlIHdoZW4gYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcykgeW91IG1heSB3YW50IHRvIGtub3cKKyAgICBkbmwgd2hpY2ggT1MgcGxhdGZvcm0gTHVhIHRoaW5rcyB0aGlzIGlzLgorICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgJGF4X2Rpc3BsYXlfTFVBIHBsYXRmb3JtXSwKKyAgICAgIFtheF9jdl9sdWFfcGxhdGZvcm1dLAorICAgICAgW2F4X2N2X2x1YV9wbGF0Zm9ybT1bYCRMVUEgLWUgJ3ByaW50KCJ1bmtub3duIiknYF1dKQorICAgIEFDX1NVQlNUKFtMVUFfUExBVEZPUk1dLCBbJGF4X2N2X2x1YV9wbGF0Zm9ybV0pCisKKyAgICBkbmwgVXNlIHRoZSB2YWx1ZXMgb2YgJHByZWZpeCBhbmQgJGV4ZWNfcHJlZml4IGZvciB0aGUgY29ycmVzcG9uZGluZworICAgIGRubCB2YWx1ZXMgb2YgTFVBX1BSRUZJWCBhbmQgTFVBX0VYRUNfUFJFRklYLiBUaGVzZSBhcmUgbWFkZSBkaXN0aW5jdAorICAgIGRubCB2YXJpYWJsZXMgc28gdGhleSBjYW4gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkIGJlLiBIb3dldmVyLCB0aGUgZ2VuZXJhbAorICAgIGRubCBjb25zZW5zdXMgaXMgdGhhdCB5b3Ugc2hvdWxkbid0IG5lZWQgdGhpcyBhYmlsaXR5LgorICAgIEFDX1NVQlNUKFtMVUFfUFJFRklYXSwgWycke3ByZWZpeH0nXSkKKyAgICBBQ19TVUJTVChbTFVBX0VYRUNfUFJFRklYXSwgWycke2V4ZWNfcHJlZml4fSddKQorCisgICAgZG5sIEx1YSBwcm92aWRlcyBubyB3YXkgdG8gcXVlcnkgdGhlIHNjcmlwdCBkaXJlY3RvcnksIGFuZCBpbnN0ZWFkCisgICAgZG5sIHByb3ZpZGVzIExVQV9QQVRILiBIb3dldmVyLCB3ZSBzaG91bGQgYmUgYWJsZSB0byBtYWtlIGEgc2FmZSBlZHVjYXRlZAorICAgIGRubCBndWVzcy4gSWYgdGhlIGJ1aWx0LWluIHNlYXJjaCBwYXRoIGNvbnRhaW5zIGEgZGlyZWN0b3J5IHdoaWNoIGlzCisgICAgZG5sIHByZWZpeGVkIGJ5ICRwcmVmaXgsIHRoZW4gd2UgY2FuIHN0b3JlIHNjcmlwdHMgdGhlcmUuIFRoZSBmaXJzdAorICAgIGRubCBtYXRjaGluZyBwYXRoIHdpbGwgYmUgdXNlZC4KKyAgICBBQ19DQUNIRV9DSEVDSyhbZm9yICRheF9kaXNwbGF5X0xVQSBzY3JpcHQgZGlyZWN0b3J5XSwKKyAgICAgIFtheF9jdl9sdWFfbHVhZGlyXSwKKyAgICAgIFsgQVNfSUYoW3Rlc3QgIngkcHJlZml4IiA9ICd4Tk9ORSddLAorICAgICAgICAgIFtheF9sdWFfcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeF0sCisgICAgICAgICAgW2F4X2x1YV9wcmVmaXg9JHByZWZpeF0pCisKKyAgICAgICAgZG5sIEluaXRpYWxpemUgdG8gdGhlIGRlZmF1bHQgcGF0aC4KKyAgICAgICAgYXhfY3ZfbHVhX2x1YWRpcj0iJExVQV9QUkVGSVgvc2hhcmUvbHVhLyRMVUFfVkVSU0lPTiIKKworICAgICAgICBkbmwgVHJ5IHRvIGZpbmQgYSBwYXRoIHdpdGggdGhlIHByZWZpeC4KKyAgICAgICAgX0FYX0xVQV9GTkRfUFJGWF9QVEgoWyRMVUFdLCBbJGF4X2x1YV9wcmVmaXhdLCBbc2NyaXB0XSkKKyAgICAgICAgQVNfSUYoW3Rlc3QgIngkYXhfbHVhX3ByZWZpeGVkX3BhdGgiICE9ICd4J10sCisgICAgICAgIFsgZG5sIEZpeCB0aGUgcHJlZml4LgorICAgICAgICAgIF9heF9zdHJpcF9wcmVmaXg9YGVjaG8gIiRheF9sdWFfcHJlZml4IiB8ICRTRUQgJ3N8LnwufGcnYAorICAgICAgICAgIGF4X2N2X2x1YV9sdWFkaXI9YGVjaG8gIiRheF9sdWFfcHJlZml4ZWRfcGF0aCIgfCBcCisgICAgICAgICAgICAkU0VEICJzfF4kX2F4X3N0cmlwX3ByZWZpeHwkTFVBX1BSRUZJWHwiYAorICAgICAgICBdKQorICAgICAgXSkKKyAgICBBQ19TVUJTVChbbHVhZGlyXSwgWyRheF9jdl9sdWFfbHVhZGlyXSkKKyAgICBBQ19TVUJTVChbcGtnbHVhZGlyXSwgW1wke2x1YWRpcn0vJFBBQ0tBR0VdKQorCisgICAgZG5sIEx1YSBwcm92aWRlcyBubyB3YXkgdG8gcXVlcnkgdGhlIG1vZHVsZSBkaXJlY3RvcnksIGFuZCBpbnN0ZWFkCisgICAgZG5sIHByb3ZpZGVzIExVQV9QQVRILiBIb3dldmVyLCB3ZSBzaG91bGQgYmUgYWJsZSB0byBtYWtlIGEgc2FmZSBlZHVjYXRlZAorICAgIGRubCBndWVzcy4gSWYgdGhlIGJ1aWx0LWluIHNlYXJjaCBwYXRoIGNvbnRhaW5zIGEgZGlyZWN0b3J5IHdoaWNoIGlzCisgICAgZG5sIHByZWZpeGVkIGJ5ICRleGVjX3ByZWZpeCwgdGhlbiB3ZSBjYW4gc3RvcmUgbW9kdWxlcyB0aGVyZS4gVGhlIGZpcnN0CisgICAgZG5sIG1hdGNoaW5nIHBhdGggd2lsbCBiZSB1c2VkLgorICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgJGF4X2Rpc3BsYXlfTFVBIG1vZHVsZSBkaXJlY3RvcnldLAorICAgICAgW2F4X2N2X2x1YV9sdWFleGVjZGlyXSwKKyAgICAgIFsgQVNfSUYoW3Rlc3QgIngkZXhlY19wcmVmaXgiID0gJ3hOT05FJ10sCisgICAgICAgICAgW2F4X2x1YV9leGVjX3ByZWZpeD0kYXhfbHVhX3ByZWZpeF0sCisgICAgICAgICAgW2F4X2x1YV9leGVjX3ByZWZpeD0kZXhlY19wcmVmaXhdKQorCisgICAgICAgIGRubCBJbml0aWFsaXplIHRvIHRoZSBkZWZhdWx0IHBhdGguCisgICAgICAgIGF4X2N2X2x1YV9sdWFleGVjZGlyPSIkTFVBX0VYRUNfUFJFRklYL2xpYi9sdWEvJExVQV9WRVJTSU9OIgorCisgICAgICAgIGRubCBUcnkgdG8gZmluZCBhIHBhdGggd2l0aCB0aGUgcHJlZml4LgorICAgICAgICBfQVhfTFVBX0ZORF9QUkZYX1BUSChbJExVQV0sCisgICAgICAgICAgWyRheF9sdWFfZXhlY19wcmVmaXhdLCBbbW9kdWxlXSkKKyAgICAgICAgQVNfSUYoW3Rlc3QgIngkYXhfbHVhX3ByZWZpeGVkX3BhdGgiICE9ICd4J10sCisgICAgICAgIFsgZG5sIEZpeCB0aGUgcHJlZml4LgorICAgICAgICAgIF9heF9zdHJpcF9wcmVmaXg9YGVjaG8gIiRheF9sdWFfZXhlY19wcmVmaXgiIHwgJFNFRCAnc3wufC58ZydgCisgICAgICAgICAgYXhfY3ZfbHVhX2x1YWV4ZWNkaXI9YGVjaG8gIiRheF9sdWFfcHJlZml4ZWRfcGF0aCIgfCBcCisgICAgICAgICAgICAkU0VEICJzfF4kX2F4X3N0cmlwX3ByZWZpeHwkTFVBX0VYRUNfUFJFRklYfCJgCisgICAgICAgIF0pCisgICAgICBdKQorICAgIEFDX1NVQlNUKFtsdWFleGVjZGlyXSwgWyRheF9jdl9sdWFfbHVhZXhlY2Rpcl0pCisgICAgQUNfU1VCU1QoW3BrZ2x1YWV4ZWNkaXJdLCBbXCR7bHVhZXhlY2Rpcn0vJFBBQ0tBR0VdKQorCisgICAgZG5sIFJ1biBhbnkgdXNlciBzcGVjaWZpZWQgYWN0aW9uLgorICAgICQzCisgIF0pCitdKQorCitkbmwgQVhfV0lUSF9MVUEgaXMgbm93IHRoZSBzYW1lIHRoaW5nIGFzIEFYX1BST0dfTFVBLgorQUNfREVGVU4oW0FYX1dJVEhfTFVBXSwKK1sKKyAgQUNfTVNHX1dBUk4oW1skMCBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIEFYX1BST0dfTFVBIGluc3RlYWRdXSkKKyAgQVhfUFJPR19MVUEKK10pCisKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBfQVhfTFVBX0NIS19JU19JTlRSUChQUk9HLCBbQUNUSU9OLUlGLVRSVUVdLCBbQUNUSU9OLUlGLUZBTFNFXSkKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitBQ19ERUZVTihbX0FYX0xVQV9DSEtfSVNfSU5UUlBdLAorWworICBkbmwgQSBtaW5pbWFsIEx1YSBmYWN0b3JpYWwgdG8gcHJvdmUgdGhpcyBpcyBhbiBpbnRlcnByZXRlci4gVGhpcyBzaG91bGQgd29yaworICBkbmwgZm9yIEx1YSBpbnRlcnByZXRlcnMgdmVyc2lvbiA1LjAgYW5kIGJleW9uZC4KKyAgX2F4X2x1YV9mYWN0b3JpYWw9W2AkMSAyPi9kZXYvbnVsbCAtZSAnCisgICAgLS0gYSBzaW1wbGUgZmFjdG9yaWFsCisgICAgZnVuY3Rpb24gZmFjdCAobikKKyAgICAgIGlmIG4gPT0gMCB0aGVuCisgICAgICAgIHJldHVybiAxCisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBuICogZmFjdChuLTEpCisgICAgICBlbmQKKyAgICBlbmQKKyAgICBwcmludCgiZmFjdCg1KSBpcyAiIC4uIGZhY3QoNSkpJ2BdCisgIEFTX0lGKFt0ZXN0ICIkX2F4X2x1YV9mYWN0b3JpYWwiID0gJ2ZhY3QoNSkgaXMgMTIwJ10sCisgICAgWyQyXSwgWyQzXSkKK10pCisKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBfQVhfTFVBX0NIS19WRVIoUFJPRywgTUlOSU1VTS1WRVJTSU9OLCBbVE9PLUJJRy1WRVJTSU9OXSwKK2RubCAgICAgICAgICAgICAgICAgW0FDVElPTi1JRi1UUlVFXSwgW0FDVElPTi1JRi1GQUxTRV0pCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQUNfREVGVU4oW19BWF9MVUFfQ0hLX1ZFUl0sCitbCisgIGRubCBDaGVjayB0aGF0IHRoZSBMdWEgdmVyc2lvbiBpcyB3aXRoaW4gdGhlIGJvdW5kcy4gT25seSB0aGUgbWFqb3IgYW5kIG1pbm9yCisgIGRubCB2ZXJzaW9uIG51bWJlcnMgYXJlIGNvbnNpZGVyZWQuIFRoaXMgc2hvdWxkIHdvcmsgZm9yIEx1YSBpbnRlcnByZXRlcnMKKyAgZG5sIHZlcnNpb24gNS4wIGFuZCBiZXlvbmQuCisgIF9heF9sdWFfZ29vZF92ZXJzaW9uPVtgJDEgLWUgJworICAgIC0tIGEgc2NyaXB0IHRvIGNvbXBhcmUgdmVyc2lvbnMKKyAgICBmdW5jdGlvbiB2ZXJzdHIybnVtKHZlcnN0cikKKyAgICAgIGxvY2FsIF8sIF8sIG1ham9ydmVyLCBtaW5vcnZlciA9IHN0cmluZy5maW5kKHZlcnN0ciwgIl4oJWQrKSUuKCVkKykiKQorICAgICAgaWYgbWFqb3J2ZXIgYW5kIG1pbm9ydmVyIHRoZW4KKyAgICAgICAgcmV0dXJuIHRvbnVtYmVyKG1ham9ydmVyKSAqIDEwMCArIHRvbnVtYmVyKG1pbm9ydmVyKQorICAgICAgZW5kCisgICAgZW5kCisgICAgbG9jYWwgbWludmVyID0gdmVyc3RyMm51bSgiJDIiKQorICAgIGxvY2FsIF8sIF8sIHRyaW12ZXIgPSBzdHJpbmcuZmluZChfVkVSU0lPTiwgIl5MdWEgKC4qKSIpCisgICAgbG9jYWwgdmVyID0gdmVyc3RyMm51bSh0cmltdmVyKQorICAgIGxvY2FsIG1heHZlciA9IHZlcnN0cjJudW0oIiQzIikgb3IgMWU5CisgICAgaWYgbWludmVyIDw9IHZlciBhbmQgdmVyIDwgbWF4dmVyIHRoZW4KKyAgICAgIHByaW50KCJ5ZXMiKQorICAgIGVsc2UKKyAgICAgIHByaW50KCJubyIpCisgICAgZW5kJ2BdCisgICAgQVNfSUYoW3Rlc3QgIngkX2F4X2x1YV9nb29kX3ZlcnNpb24iID0gInh5ZXMiXSwKKyAgICAgIFskNF0sIFskNV0pCitdKQorCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitkbmwgX0FYX0xVQV9GTkRfUFJGWF9QVEgoUFJPRywgUFJFRklYLCBTQ1JJUFQtT1ItTU9EVUxFLURJUikKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitBQ19ERUZVTihbX0FYX0xVQV9GTkRfUFJGWF9QVEhdLAorWworICBkbmwgR2V0IHRoZSBzY3JpcHQgb3IgbW9kdWxlIGRpcmVjdG9yeSBieSBxdWVyeWluZyB0aGUgTHVhIGludGVycHJldGVyLAorICBkbmwgZmlsdGVyaW5nIG9uIHRoZSBnaXZlbiBwcmVmaXgsIGFuZCBzZWxlY3RpbmcgdGhlIHNoYWxsb3dlc3QgcGF0aC4gSWYgbm8KKyAgZG5sIHBhdGggaXMgZm91bmQgbWF0Y2hpbmcgdGhlIHByZWZpeCwgdGhlIHJlc3VsdCB3aWxsIGJlIGFuIGVtcHR5IHN0cmluZy4KKyAgZG5sIFRoZSB0aGlyZCBhcmd1bWVudCBkZXRlcm1pbmVzIHRoZSB0eXBlIG9mIHNlYXJjaCwgaXQgY2FuIGJlICdzY3JpcHQnIG9yCisgIGRubCAnbW9kdWxlJy4gU3VwcGx5aW5nICdzY3JpcHQnIHdpbGwgcGVyZm9ybSB0aGUgc2VhcmNoIHdpdGggcGFja2FnZS5wYXRoCisgIGRubCBhbmQgTFVBX1BBVEgsIGFuZCBzdXBwbHlpbmcgJ21vZHVsZScgd2lsbCBzZWFyY2ggd2l0aCBwYWNrYWdlLmNwYXRoIGFuZAorICBkbmwgTFVBX0NQQVRILiBUaGlzIGlzIGRvbmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBMdWEgNS4wLgorCisgIGF4X2x1YV9wcmVmaXhlZF9wYXRoPVtgJDEgLWUgJworICAgIC0tIGdldCB0aGUgcGF0aCBiYXNlZCBvbiBzZWFyY2ggdHlwZQorICAgIGxvY2FsIHNlYXJjaHR5cGUgPSAiJDMiCisgICAgbG9jYWwgcGF0aHMgPSAiIgorICAgIGlmIHNlYXJjaHR5cGUgPT0gInNjcmlwdCIgdGhlbgorICAgICAgcGF0aHMgPSAocGFja2FnZSBhbmQgcGFja2FnZS5wYXRoKSBvciBMVUFfUEFUSAorICAgIGVsc2VpZiBzZWFyY2h0eXBlID09ICJtb2R1bGUiIHRoZW4KKyAgICAgIHBhdGhzID0gKHBhY2thZ2UgYW5kIHBhY2thZ2UuY3BhdGgpIG9yIExVQV9DUEFUSAorICAgIGVuZAorICAgIC0tIHNlYXJjaCBmb3IgdGhlIHByZWZpeAorICAgIGxvY2FsIHByZWZpeCA9ICInJDInIgorICAgIGxvY2FsIG1pbnBhdGggPSAiIgorICAgIGxvY2FsIG1pbmRlcHRoID0gMWU5CisgICAgc3RyaW5nLmdzdWIocGF0aHMsICIoQDw6QF47QDo+QCspIiwKKyAgICAgIGZ1bmN0aW9uIChwYXRoKQorICAgICAgICBwYXRoID0gc3RyaW5nLmdzdWIocGF0aCwgIiU/LiokIiwgIiIpCisgICAgICAgIHBhdGggPSBzdHJpbmcuZ3N1YihwYXRoLCAiL0A8OkBeL0A6PkAqJCIsICIiKQorICAgICAgICBpZiBzdHJpbmcuZmluZChwYXRoLCBwcmVmaXgpIHRoZW4KKyAgICAgICAgICBsb2NhbCBkZXB0aCA9IHN0cmluZy5sZW4oc3RyaW5nLmdzdWIocGF0aCwgIkA8OkBeL0A6PkAiLCAiIikpCisgICAgICAgICAgaWYgZGVwdGggPCBtaW5kZXB0aCB0aGVuCisgICAgICAgICAgICBtaW5wYXRoID0gcGF0aAorICAgICAgICAgICAgbWluZGVwdGggPSBkZXB0aAorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZCkKKyAgICBwcmludChtaW5wYXRoKSdgXQorXSkKKworCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIEFYX0xVQV9IRUFERVJTKFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQUNfREVGVU4oW0FYX0xVQV9IRUFERVJTXSwKK1sKKyAgZG5sIENoZWNrIGZvciBMVUFfVkVSU0lPTi4KKyAgQUNfTVNHX0NIRUNLSU5HKFtpZiBMVUFfVkVSU0lPTiBpcyBkZWZpbmVkXSkKKyAgQVNfSUYoW3Rlc3QgIngkTFVBX1ZFUlNJT04iICE9ICd4J10sCisgICAgW0FDX01TR19SRVNVTFQoW3llc10pXSwKKyAgICBbIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICAgIEFDX01TR19FUlJPUihbY2Fubm90IGNoZWNrIEx1YSBoZWFkZXJzIHdpdGhvdXQga25vd2luZyBMVUFfVkVSU0lPTl0pCisgICAgXSkKKworICBkbmwgTWFrZSBMVUFfSU5DTFVERSBhIHByZWNpb3VzIHZhcmlhYmxlLgorICBBQ19BUkdfVkFSKFtMVUFfSU5DTFVERV0sIFtUaGUgTHVhIGluY2x1ZGVzLCBlLmcuIC1JL3Vzci9pbmNsdWRlL2x1YTUuMV0pCisKKyAgZG5sIFNvbWUgZGVmYXVsdCBkaXJlY3RvcmllcyB0byBzZWFyY2guCisgIExVQV9TSE9SVF9WRVJTSU9OPWBlY2hvICIkTFVBX1ZFUlNJT04iIHwgJFNFRCAnc3xcLnx8J2AKKyAgbTRfZGVmaW5lX2RlZmF1bHQoW19BWF9MVUFfSU5DTFVERV9MSVNUXSwKKyAgICBbIC91c3IvaW5jbHVkZS9sdWEkTFVBX1ZFUlNJT04gXAorICAgICAgL3Vzci9pbmNsdWRlL2x1YS0kTFVBX1ZFUlNJT04gXAorICAgICAgL3Vzci9pbmNsdWRlL2x1YS8kTFVBX1ZFUlNJT04gXAorICAgICAgL3Vzci9pbmNsdWRlL2x1YSRMVUFfU0hPUlRfVkVSU0lPTiBcCisgICAgICAvdXNyL2xvY2FsL2luY2x1ZGUvbHVhJExVQV9WRVJTSU9OIFwKKyAgICAgIC91c3IvbG9jYWwvaW5jbHVkZS9sdWEtJExVQV9WRVJTSU9OIFwKKyAgICAgIC91c3IvbG9jYWwvaW5jbHVkZS9sdWEvJExVQV9WRVJTSU9OIFwKKyAgICAgIC91c3IvbG9jYWwvaW5jbHVkZS9sdWEkTFVBX1NIT1JUX1ZFUlNJT04gXAorICAgIF0pCisKKyAgZG5sIFRyeSB0byBmaW5kIHRoZSBoZWFkZXJzLgorICBfYXhfbHVhX3NhdmVkX2NwcGZsYWdzPSRDUFBGTEFHUworICBDUFBGTEFHUz0iJENQUEZMQUdTICRMVUFfSU5DTFVERSIKKyAgQUNfQ0hFQ0tfSEVBREVSUyhbbHVhLmggbHVhbGliLmggbGF1eGxpYi5oIGx1YWNvbmYuaF0pCisgIENQUEZMQUdTPSRfYXhfbHVhX3NhdmVkX2NwcGZsYWdzCisKKyAgZG5sIFRyeSBzb21lIG90aGVyIGRpcmVjdG9yaWVzIGlmIExVQV9JTkNMVURFIHdhcyBub3Qgc2V0LgorICBBU19JRihbdGVzdCAieCRMVUFfSU5DTFVERSIgPSAneCcgJiYKKyAgICAgICAgIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2x1YV9oIiAhPSAneHllcyddLAorICAgIFsgZG5sIFRyeSBzb21lIGNvbW1vbiBpbmNsdWRlIHBhdGhzLgorICAgICAgZm9yIF9heF9pbmNsdWRlX3BhdGggaW4gX0FYX0xVQV9JTkNMVURFX0xJU1Q7IGRvCisgICAgICAgIHRlc3QgISAtZCAiJF9heF9pbmNsdWRlX3BhdGgiICYmIGNvbnRpbnVlCisKKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgTHVhIGhlYWRlcnMgaW5dKQorICAgICAgICBBQ19NU0dfUkVTVUxUKFskX2F4X2luY2x1ZGVfcGF0aF0pCisKKyAgICAgICAgQVNfVU5TRVQoW2FjX2N2X2hlYWRlcl9sdWFfaF0pCisgICAgICAgIEFTX1VOU0VUKFthY19jdl9oZWFkZXJfbHVhbGliX2hdKQorICAgICAgICBBU19VTlNFVChbYWNfY3ZfaGVhZGVyX2xhdXhsaWJfaF0pCisgICAgICAgIEFTX1VOU0VUKFthY19jdl9oZWFkZXJfbHVhY29uZl9oXSkKKworICAgICAgICBfYXhfbHVhX3NhdmVkX2NwcGZsYWdzPSRDUFBGTEFHUworICAgICAgICBDUFBGTEFHUz0iJENQUEZMQUdTIC1JJF9heF9pbmNsdWRlX3BhdGgiCisgICAgICAgIEFDX0NIRUNLX0hFQURFUlMoW2x1YS5oIGx1YWxpYi5oIGxhdXhsaWIuaCBsdWFjb25mLmhdKQorICAgICAgICBDUFBGTEFHUz0kX2F4X2x1YV9zYXZlZF9jcHBmbGFncworCisgICAgICAgIEFTX0lGKFt0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9sdWFfaCIgPSAneHllcyddLAorICAgICAgICAgIFsgTFVBX0lOQ0xVREU9Ii1JJF9heF9pbmNsdWRlX3BhdGgiCisgICAgICAgICAgICBicmVhaworICAgICAgICAgIF0pCisgICAgICBkb25lCisgICAgXSkKKworICBBU19JRihbdGVzdCAieCRhY19jdl9oZWFkZXJfbHVhX2giID0gJ3h5ZXMnXSwKKyAgICBbIGRubCBNYWtlIGEgcHJvZ3JhbSB0byBwcmludCBMVUFfVkVSU0lPTiBkZWZpbmVkIGluIHRoZSBoZWFkZXIuCisgICAgICBkbmwgVE9ETyBJdCB3b3VsZCBiZSByZWFsbHkgbmljZSBpZiB3ZSBjb3VsZCBkbyB0aGlzIHdpdGhvdXQgY29tcGlsaW5nIGEKKyAgICAgIGRubCBwcm9ncmFtLCB0aGVuIGl0IHdvdWxkIHdvcmsgd2hlbiBjcm9zcyBjb21waWxpbmcuIEJ1dCBJJ20gbm90IHN1cmUgaG93CisgICAgICBkbmwgdG8gZG8gdGhpcyByZWxpYWJseS4gRm9yIG5vdywgYXNzdW1lIHZlcnNpb25zIG1hdGNoIHdoZW4gY3Jvc3MgY29tcGlsaW5nLgorCisgICAgICBBU19JRihbdGVzdCAieCRjcm9zc19jb21waWxpbmciICE9ICd4eWVzJ10sCisgICAgICAgIFsgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMdWEgaGVhZGVyIHZlcnNpb25dLAorICAgICAgICAgICAgW2F4X2N2X2x1YV9oZWFkZXJfdmVyc2lvbl0sCisgICAgICAgICAgICBbIF9heF9sdWFfc2F2ZWRfY3BwZmxhZ3M9JENQUEZMQUdTCisgICAgICAgICAgICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgJExVQV9JTkNMVURFIgorICAgICAgICAgICAgICBBQ19SVU5fSUZFTFNFKAorICAgICAgICAgICAgICAgIFsgQUNfTEFOR19TT1VSQ0UoW1sKKyNpbmNsdWRlIDxsdWEuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikKK3sKKyAgaWYoYXJnYyA+IDEpIHByaW50ZigiJXMiLCBMVUFfVkVSU0lPTik7CisgIGV4aXQoRVhJVF9TVUNDRVNTKTsKK30KK11dKQorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgWyBheF9jdl9sdWFfaGVhZGVyX3ZlcnNpb249YC4vY29uZnRlc3QkRVhFRVhUIHAgfCBcCisgICAgICAgICAgICAgICAgICAgICRTRUQgLW4gInN8Xkx1YSBcKEA8OkAwLTlAOj5AXHsxLFx9XC5APDpAMC05QDo+QFx7MSxcfVwpLlx7MCxcfXxcMXxwImAKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIFtheF9jdl9sdWFfaGVhZGVyX3ZlcnNpb249J3Vua25vd24nXSkKKyAgICAgICAgICAgICAgQ1BQRkxBR1M9JF9heF9sdWFfc2F2ZWRfY3BwZmxhZ3MKKyAgICAgICAgICAgIF0pCisKKyAgICAgICAgICBkbmwgQ29tcGFyZSB0aGlzIHRvIHRoZSBwcmV2aW91c2x5IGZvdW5kIExVQV9WRVJTSU9OLgorICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbaWYgTHVhIGhlYWRlciB2ZXJzaW9uIG1hdGNoZXMgJExVQV9WRVJTSU9OXSkKKyAgICAgICAgICBBU19JRihbdGVzdCAieCRheF9jdl9sdWFfaGVhZGVyX3ZlcnNpb24iID0gIngkTFVBX1ZFUlNJT04iXSwKKyAgICAgICAgICAgIFsgQUNfTVNHX1JFU1VMVChbeWVzXSkKKyAgICAgICAgICAgICAgYXhfaGVhZGVyX3ZlcnNpb25fbWF0Y2g9J3llcycKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICBbIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICAgICAgICAgICAgYXhfaGVhZGVyX3ZlcnNpb25fbWF0Y2g9J25vJworICAgICAgICAgICAgXSkKKyAgICAgICAgXSwKKyAgICAgICAgWyBBQ19NU0dfV0FSTihbY3Jvc3MgY29tcGlsaW5nIHNvIGFzc3VtaW5nIGhlYWRlciB2ZXJzaW9uIG51bWJlciBtYXRjaGVzXSkKKyAgICAgICAgICBheF9oZWFkZXJfdmVyc2lvbl9tYXRjaD0neWVzJworICAgICAgICBdKQorICAgIF0pCisKKyAgZG5sIFdhcyBMVUFfSU5DTFVERSBzcGVjaWZpZWQ/CisgIEFTX0lGKFt0ZXN0ICJ4JGF4X2hlYWRlcl92ZXJzaW9uX21hdGNoIiAhPSAneHllcycgJiYKKyAgICAgICAgIHRlc3QgIngkTFVBX0lOQ0xVREUiICE9ICd4J10sCisgICAgW0FDX01TR19FUlJPUihbY2Fubm90IGZpbmQgaGVhZGVycyBmb3Igc3BlY2lmaWVkIExVQV9JTkNMVURFXSldKQorCisgIGRubCBUZXN0IHRoZSBmaW5hbCByZXN1bHQgYW5kIHJ1biB1c2VyIGNvZGUuCisgIEFTX0lGKFt0ZXN0ICJ4JGF4X2hlYWRlcl92ZXJzaW9uX21hdGNoIiA9ICd4eWVzJ10sIFskMV0sCisgICAgW200X2RlZmF1bHQoWyQyXSwgW0FDX01TR19FUlJPUihbY2Fubm90IGZpbmQgTHVhIGluY2x1ZGVzXSldKV0pCitdKQorCitkbmwgQVhfTFVBX0hFQURFUlNfVkVSU0lPTiBubyBsb25nZXIgZXhpc3RzLCB1c2UgQVhfTFVBX0hFQURFUlMuCitBQ19ERUZVTihbQVhfTFVBX0hFQURFUlNfVkVSU0lPTl0sCitbCisgIEFDX01TR19XQVJOKFtbJDAgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBBWF9MVUFfSEVBREVSUyBpbnN0ZWFkXV0pCitdKQorCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitkbmwgQVhfTFVBX0xJQlMoW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSkKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitBQ19ERUZVTihbQVhfTFVBX0xJQlNdLAorWworICBkbmwgVE9ETyBTaG91bGQgdGhpcyBtYWNybyBhbHNvIGNoZWNrIHZhcmlvdXMgLUwgZmxhZ3M/CisKKyAgZG5sIENoZWNrIGZvciBMVUFfVkVSU0lPTi4KKyAgQUNfTVNHX0NIRUNLSU5HKFtpZiBMVUFfVkVSU0lPTiBpcyBkZWZpbmVkXSkKKyAgQVNfSUYoW3Rlc3QgIngkTFVBX1ZFUlNJT04iICE9ICd4J10sCisgICAgW0FDX01TR19SRVNVTFQoW3llc10pXSwKKyAgICBbIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICAgIEFDX01TR19FUlJPUihbY2Fubm90IGNoZWNrIEx1YSBsaWJzIHdpdGhvdXQga25vd2luZyBMVUFfVkVSU0lPTl0pCisgICAgXSkKKworICBkbmwgTWFrZSBMVUFfTElCIGEgcHJlY2lvdXMgdmFyaWFibGUuCisgIEFDX0FSR19WQVIoW0xVQV9MSUJdLCBbVGhlIEx1YSBsaWJyYXJ5LCBlLmcuIC1sbHVhNS4xXSkKKworICBBU19JRihbdGVzdCAieCRMVUFfTElCIiAhPSAneCddLAorICBbIGRubCBDaGVjayB0aGF0IExVQV9MSUJTIHdvcmtzLgorICAgIF9heF9sdWFfc2F2ZWRfbGlicz0kTElCUworICAgIExJQlM9IiRMSUJTICRMVUFfTElCIgorICAgIEFDX1NFQVJDSF9MSUJTKFtsdWFfbG9hZF0sIFtdLAorICAgICAgW19heF9mb3VuZF9sdWFfbGlicz0neWVzJ10sCisgICAgICBbX2F4X2ZvdW5kX2x1YV9saWJzPSdubyddKQorICAgIExJQlM9JF9heF9sdWFfc2F2ZWRfbGlicworCisgICAgZG5sIENoZWNrIHRoZSByZXN1bHQuCisgICAgQVNfSUYoW3Rlc3QgIngkX2F4X2ZvdW5kX2x1YV9saWJzIiAhPSAneHllcyddLAorICAgICAgW0FDX01TR19FUlJPUihbY2Fubm90IGZpbmQgbGlicyBmb3Igc3BlY2lmaWVkIExVQV9MSUJdKV0pCisgIF0sCisgIFsgZG5sIEZpcnN0IHNlYXJjaCBmb3IgZXh0cmEgbGlicy4KKyAgICBfYXhfbHVhX2V4dHJhX2xpYnM9JycKKworICAgIF9heF9sdWFfc2F2ZWRfbGlicz0kTElCUworICAgIExJQlM9IiRMSUJTICRMVUFfTElCIgorICAgIEFDX1NFQVJDSF9MSUJTKFtleHBdLCBbbV0pCisgICAgQUNfU0VBUkNIX0xJQlMoW2Rsb3Blbl0sIFtkbF0pCisgICAgTElCUz0kX2F4X2x1YV9zYXZlZF9saWJzCisKKyAgICBBU19JRihbdGVzdCAieCRhY19jdl9zZWFyY2hfZXhwIiAhPSAneG5vJyAmJgorICAgICAgICAgICB0ZXN0ICJ4JGFjX2N2X3NlYXJjaF9leHAiICE9ICd4bm9uZSByZXF1aXJlZCddLAorICAgICAgW19heF9sdWFfZXh0cmFfbGlicz0iJF9heF9sdWFfZXh0cmFfbGlicyAkYWNfY3Zfc2VhcmNoX2V4cCJdKQorCisgICAgQVNfSUYoW3Rlc3QgIngkYWNfY3Zfc2VhcmNoX2Rsb3BlbiIgIT0gJ3hubycgJiYKKyAgICAgICAgICAgdGVzdCAieCRhY19jdl9zZWFyY2hfZGxvcGVuIiAhPSAneG5vbmUgcmVxdWlyZWQnXSwKKyAgICAgIFtfYXhfbHVhX2V4dHJhX2xpYnM9IiRfYXhfbHVhX2V4dHJhX2xpYnMgJGFjX2N2X3NlYXJjaF9kbG9wZW4iXSkKKworICAgIGRubCBUcnkgdG8gZmluZCB0aGUgTHVhIGxpYnMuCisgICAgX2F4X2x1YV9zYXZlZF9saWJzPSRMSUJTCisgICAgTElCUz0iJExJQlMgJExVQV9MSUIiCisgICAgQUNfU0VBUkNIX0xJQlMoW2x1YV9sb2FkXSwKKyAgICAgIFsgbHVhJExVQV9WRVJTSU9OIFwKKyAgICAgICAgbHVhJExVQV9TSE9SVF9WRVJTSU9OIFwKKyAgICAgICAgbHVhLSRMVUFfVkVSU0lPTiBcCisgICAgICAgIGx1YS0kTFVBX1NIT1JUX1ZFUlNJT04gXAorICAgICAgICBsdWEgXAorICAgICAgXSwKKyAgICAgIFtfYXhfZm91bmRfbHVhX2xpYnM9J3llcyddLAorICAgICAgW19heF9mb3VuZF9sdWFfbGlicz0nbm8nXSwKKyAgICAgIFskX2F4X2x1YV9leHRyYV9saWJzXSkKKyAgICBMSUJTPSRfYXhfbHVhX3NhdmVkX2xpYnMKKworICAgIEFTX0lGKFt0ZXN0ICJ4JGFjX2N2X3NlYXJjaF9sdWFfbG9hZCIgIT0gJ3hubycgJiYKKyAgICAgICAgICAgdGVzdCAieCRhY19jdl9zZWFyY2hfbHVhX2xvYWQiICE9ICd4bm9uZSByZXF1aXJlZCddLAorICAgICAgW0xVQV9MSUI9IiRhY19jdl9zZWFyY2hfbHVhX2xvYWQgJF9heF9sdWFfZXh0cmFfbGlicyJdKQorICBdKQorCisgIGRubCBUZXN0IHRoZSByZXN1bHQgYW5kIHJ1biB1c2VyIGNvZGUuCisgIEFTX0lGKFt0ZXN0ICJ4JF9heF9mb3VuZF9sdWFfbGlicyIgPSAneHllcyddLCBbJDFdLAorICAgIFttNF9kZWZhdWx0KFskMl0sIFtBQ19NU0dfRVJST1IoW2Nhbm5vdCBmaW5kIEx1YSBsaWJzXSldKV0pCitdKQorCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitkbmwgQVhfTFVBX1JFQURMSU5FKFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQUNfREVGVU4oW0FYX0xVQV9SRUFETElORV0sCitbCisgIEFYX0xJQl9SRUFETElORQorICBBU19JRihbdGVzdCAieCRhY19jdl9oZWFkZXJfcmVhZGxpbmVfcmVhZGxpbmVfaCIgIT0gJ3gnICYmCisgICAgICAgICB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9yZWFkbGluZV9oaXN0b3J5X2giICE9ICd4J10sCisgICAgWyBMVUFfTElCU19DRkxBR1M9Ii1ETFVBX1VTRV9SRUFETElORSAkTFVBX0xJQlNfQ0ZMQUdTIgorICAgICAgJDEKKyAgICBdLAorICAgIFskMl0pCitdKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9wcm9nX2RvdG5ldGNvcmVfdmVyc2lvbi5tNCBiL2FjbG9jYWwvYXhfcHJvZ19kb3RuZXRjb3JlX3ZlcnNpb24ubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJjNzQ5NQotLS0gL2Rldi9udWxsCisrKyBiL2FjbG9jYWwvYXhfcHJvZ19kb3RuZXRjb3JlX3ZlcnNpb24ubTQKQEAgLTAsMCArMSw2MSBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfcHJvZ19kb3RuZXRjb3JlX3ZlcnNpb24uaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfUFJPR19ET1RORVRDT1JFX1ZFUlNJT04oW1ZFUlNJT05dLFtBQ1RJT04tSUYtVFJVRV0sW0FDVElPTi1JRi1GQUxTRV0pCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgTWFrZXMgc3VyZSB0aGF0IC5ORVQgQ29yZSBzdXBwb3J0cyB0aGUgdmVyc2lvbiBpbmRpY2F0ZWQuIElmIHRydWUgdGhlCisjICAgc2hlbGwgY29tbWFuZHMgaW4gQUNUSU9OLUlGLVRSVUUgYXJlIGV4ZWN1dGVkLiBJZiBub3QgdGhlIHNoZWxsIGNvbW1hbmRzCisjICAgaW4gQUNUSU9OLUlGLUZBTFNFIGFyZSBydW4uIFRoZSAkZG90bmV0Y29yZV92ZXJzaW9uIHZhcmlhYmxlIHdpbGwgYmUKKyMgICBmaWxsZWQgd2l0aCB0aGUgZGV0ZWN0ZWQgdmVyc2lvbi4KKyMKKyMgICBUaGlzIG1hY3JvIHVzZXMgdGhlICRET1RORVRDT1JFIHZhcmlhYmxlIHRvIHBlcmZvcm0gdGhlIGNoZWNrLiBJZgorIyAgICRET1RORVRDT1JFIGlzIG5vdCBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIG1hY3JvLCB0aGUgbWFjcm8gd2lsbCBmYWlsLgorIworIyAgIEV4YW1wbGU6CisjCisjICAgICBBQ19QQVRIX1BST0coW0RPVE5FVENPUkVdLFtkb3RuZXRdKQorIyAgICAgQUNfUFJPR19ET1RORVRDT1JFX1ZFUlNJT04oWzEuMC4yXSxbIC4uLiBdLFsgLi4uIF0pCisjCisjICAgU2VhcmNoZXMgZm9yIC5ORVQgQ29yZSwgdGhlbiBjaGVja3MgaWYgYXQgbGVhc3QgdmVyc2lvbiAxLjAuMiBpcworIyAgIHByZXNlbnQuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMTYgSmVucyBHZXllciA8amVuc2dAYXBhY2hlLm9yZz4KKyMKKyMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKKyMgICBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UKKyMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CisjICAgd2FycmFudHkuCisKKyNzZXJpYWwgMgorCitBQ19ERUZVTihbQVhfUFJPR19ET1RORVRDT1JFX1ZFUlNJT05dLFsKKyAgICBBQ19SRVFVSVJFKFtBQ19QUk9HX1NFRF0pCisKKyAgICBBU19JRihbdGVzdCAtbiAiJERPVE5FVENPUkUiXSxbCisgICAgICAgIGF4X2RvdG5ldGNvcmVfdmVyc2lvbj0iJDEiCisKKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgLk5FVCBDb3JlIHZlcnNpb25dKQorICAgICAgICBkb3RuZXRjb3JlX3ZlcnNpb249YCRET1RORVRDT1JFIC0tdmVyc2lvbiAyPiYxIHwgJFNFRCAtZSAncy9cKEA8OkAwLTlAOj5AKlwuQDw6QDAtOUA6PkAqXC5APDpAMC05QDo+QCpcKVwoLipcKS9cMS8nYAorICAgICAgICBBQ19NU0dfUkVTVUxUKCRkb3RuZXRjb3JlX3ZlcnNpb24pCisKKwkgICAgQUNfU1VCU1QoW0RPVE5FVENPUkVfVkVSU0lPTl0sWyRkb3RuZXRjb3JlX3ZlcnNpb25dKQorCisgICAgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbJGF4X2RvdG5ldGNvcmVfdmVyc2lvbl0sW2xlXSxbJGRvdG5ldGNvcmVfdmVyc2lvbl0sWworCSAgICA6CisgICAgICAgICAgICAkMgorICAgICAgICBdLFsKKwkgICAgOgorICAgICAgICAgICAgJDMKKyAgICAgICAgXSkKKyAgICBdLFsKKyAgICAgICAgQUNfTVNHX1dBUk4oW2NvdWxkIG5vdCBmaW5kIC5ORVQgQ29yZV0pCisgICAgICAgICQzCisgICAgXSkKK10pCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X3Byb2dfaGF4ZV92ZXJzaW9uLm00IGIvYWNsb2NhbC9heF9wcm9nX2hheGVfdmVyc2lvbi5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2FjYzY3Ci0tLSAvZGV2L251bGwKKysrIGIvYWNsb2NhbC9heF9wcm9nX2hheGVfdmVyc2lvbi5tNApAQCAtMCwwICsxLDYwIEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9wcm9nX2hheGVfdmVyc2lvbi5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX1BST0dfSEFYRV9WRVJTSU9OKFtWRVJTSU9OXSxbQUNUSU9OLUlGLVRSVUVdLFtBQ1RJT04tSUYtRkFMU0VdKQorIworIyBERVNDUklQVElPTgorIworIyAgIE1ha2VzIHN1cmUgdGhhdCBoYXhlIHN1cHBvcnRzIHRoZSB2ZXJzaW9uIGluZGljYXRlZC4gSWYgdHJ1ZSB0aGUgc2hlbGwKKyMgICBjb21tYW5kcyBpbiBBQ1RJT04tSUYtVFJVRSBhcmUgZXhlY3V0ZWQuIElmIG5vdCB0aGUgc2hlbGwgY29tbWFuZHMgaW4KKyMgICBBQ1RJT04tSUYtRkFMU0UgYXJlIHJ1bi4gVGhlICRIQVhFX1ZFUlNJT04gdmFyaWFibGUgd2lsbCBiZSBmaWxsZWQgd2l0aAorIyAgIHRoZSBkZXRlY3RlZCB2ZXJzaW9uLgorIworIyAgIFRoaXMgbWFjcm8gdXNlcyB0aGUgJEhBWEUgdmFyaWFibGUgdG8gcGVyZm9ybSB0aGUgY2hlY2suIElmICRIQVhFIGlzIG5vdAorIyAgIHNldCBwcmlvciB0byBjYWxsaW5nIHRoaXMgbWFjcm8sIHRoZSBtYWNybyB3aWxsIGZhaWwuCisjCisjICAgRXhhbXBsZToKKyMKKyMgICAgIEFDX1BBVEhfUFJPRyhbSEFYRV0sW2hheGVdKQorIyAgICAgQUNfUFJPR19IQVhFX1ZFUlNJT04oWzMuMS4zXSxbIC4uLiBdLFsgLi4uIF0pCisjCisjICAgU2VhcmNoZXMgZm9yIEhheGUsIHRoZW4gY2hlY2tzIGlmIGF0IGxlYXN0IHZlcnNpb24gMy4xLjMgaXMgcHJlc2VudC4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAxNSBKZW5zIEdleWVyIDxqZW5zZ0BhcGFjaGUub3JnPgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorIyAgIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZQorIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKKyMgICB3YXJyYW50eS4KKworI3NlcmlhbCAyCisKK0FDX0RFRlVOKFtBWF9QUk9HX0hBWEVfVkVSU0lPTl0sWworICAgIEFDX1JFUVVJUkUoW0FDX1BST0dfU0VEXSkKKworICAgIEFTX0lGKFt0ZXN0IC1uICIkSEFYRSJdLFsKKyAgICAgICAgYXhfaGF4ZV92ZXJzaW9uPSIkMSIKKworICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBoYXhlIHZlcnNpb25dKQorICAgICAgICBoYXhlX3ZlcnNpb249YCRIQVhFIC12ZXJzaW9uIDI+JjEgfCAkU0VEIC1lICdzL14uKiBcKCBAPDpAMC05QDo+QCpcLkA8OkAwLTlAOj5AKlwuQDw6QDAtOUA6PkAqXCkgLiovXDEvJ2AKKyAgICAgICAgQUNfTVNHX1JFU1VMVCgkaGF4ZV92ZXJzaW9uKQorCisJICAgIEFDX1NVQlNUKFtIQVhFX1ZFUlNJT05dLFskaGF4ZV92ZXJzaW9uXSkKKworICAgICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWyRheF9oYXhlX3ZlcnNpb25dLFtsZV0sWyRoYXhlX3ZlcnNpb25dLFsKKwkgICAgOgorICAgICAgICAgICAgJDIKKyAgICAgICAgXSxbCisJICAgIDoKKyAgICAgICAgICAgICQzCisgICAgICAgIF0pCisgICAgXSxbCisgICAgICAgIEFDX01TR19XQVJOKFtjb3VsZCBub3QgZmluZCBIYXhlXSkKKyAgICAgICAgJDMKKyAgICBdKQorXSkKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfcHJvZ19wZXJsX21vZHVsZXMubTQgYi9hY2xvY2FsL2F4X3Byb2dfcGVybF9tb2R1bGVzLm00CmluZGV4IDExYTMyNmMuLjcwYjMyMzAgMTAwNjQ0Ci0tLSBhL2FjbG9jYWwvYXhfcHJvZ19wZXJsX21vZHVsZXMubTQKKysrIGIvYWNsb2NhbC9heF9wcm9nX3BlcmxfbW9kdWxlcy5tNApAQCAtMSw1ICsxLDUgQEAKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfcHJvZ19wZXJsX21vZHVsZXMuaHRtbAorIyAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9wcm9nX3BlcmxfbW9kdWxlcy5odG1sCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIwogIyBTWU5PUFNJUwpAQCAtMzIsNyArMzIsNyBAQAogIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKICMgICB3YXJyYW50eS4KIAotI3NlcmlhbCA3Cisjc2VyaWFsIDgKIAogQVVfQUxJQVMoW0FDX1BST0dfUEVSTF9NT0RVTEVTXSwgW0FYX1BST0dfUEVSTF9NT0RVTEVTXSkKIEFDX0RFRlVOKFtBWF9QUk9HX1BFUkxfTU9EVUxFU10sW2RubApkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9zaWduZWRfcmlnaHRfc2hpZnQubTQgYi9hY2xvY2FsL2F4X3NpZ25lZF9yaWdodF9zaGlmdC5tNAppbmRleCAwMTk1MjMzLi45YzNjZWI3IDEwMDY0NAotLS0gYS9hY2xvY2FsL2F4X3NpZ25lZF9yaWdodF9zaGlmdC5tNAorKysgYi9hY2xvY2FsL2F4X3NpZ25lZF9yaWdodF9zaGlmdC5tNApAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgICAgICAgQUNfREVGSU5FKFtMT0dJQ0FMX1JJR0hUX1NISUZUXSwgMiwgW1Bvc3NpYmxlIHZhbHVlIGZvciBTSUdORURfUklHSFRfU0hJRlRfSVNdKQogICAgICAgICAgIEFDX0RFRklORShbVU5LTk9XTl9SSUdIVF9TSElGVF0sIDMsIFtQb3NzaWJsZSB2YWx1ZSBmb3IgU0lHTkVEX1JJR0hUX1NISUZUX0lTXSkKIAotICAgICAgICAgIGlmIHRlc3QgIiRzdWNjZXNzX2FyaXRobWV0aWMiID0gInllcyIgJiYgdGVzdCAiJHN1Y2Nlc3NfbG9naWNhIiA9ICJ5ZXMiIDsgdGhlbgorICAgICAgICAgIGlmIHRlc3QgIiRzdWNjZXNzX2FyaXRobWV0aWMiID0gInllcyIgJiYgdGVzdCAiJHN1Y2Nlc3NfbG9naWNhbCIgPSAieWVzIiA7IHRoZW4KICAgICAgICAgICAgIEFDX01TR19FUlJPUigiUmlnaHQgc2hpZnQgYXBwZWFycyB0byBiZSBib3RoIGFyaXRobWV0aWMgYW5kIGxvZ2ljYWwhIikKICAgICAgICAgICBlbGlmIHRlc3QgIiRzdWNjZXNzX2FyaXRobWV0aWMiID0gInllcyIgOyB0aGVuCiAgICAgICAgICAgICBheF9zaWduZWRfcmlnaHRfc2hpZnQ9YXJpdGhtZXRpYwpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF90aHJpZnRfaW50ZXJuYWwubTQgYi9hY2xvY2FsL2F4X3RocmlmdF9pbnRlcm5hbC5tNAppbmRleCBhODRjYjllLi44YzBlM2NiIDEwMDY0NAotLS0gYS9hY2xvY2FsL2F4X3RocmlmdF9pbnRlcm5hbC5tNAorKysgYi9hY2xvY2FsL2F4X3RocmlmdF9pbnRlcm5hbC5tNApAQCAtMTUsMjEgKzE1LDYgQEAKIGRubCBhcmUgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQKIGRubCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuCiAKLUFDX0RFRlVOKFtBWF9USFJJRlRfR0VOXSwKLSAgICAgICAgIFsKLSAgICAgICAgICBBQ19BUkdfRU5BQkxFKFtnZW4tJDFdLAotICAgICAgICAgICAgICAgICAgICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWdlbi0kMV0sIFtlbmFibGUgdGhlICQyIGNvbXBpbGVyIEA8OkBkZWZhdWx0PSQzQDo+QF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgW2F4X3RocmlmdF9nZW5fJDE9IiRlbmFibGV2YWwiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFtheF90aHJpZnRfZ2VuXyQxPSQzXQotICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgIGlmIHRlc3QgIngkYXhfdGhyaWZ0X2dlbl8kMSIgPSAieHllcyIgOyB0aGVuCi0gICAgICAgICAgICB0aHJpZnRfZ2VuZXJhdG9ycz0iJHRocmlmdF9nZW5lcmF0b3JzICQxIgotICAgICAgICAgIGZpCi0gICAgICAgICAgZG5sIEknZCBsaWtlIHRvIHJ1biB0aGUgQU1fQ09ORElUSU9OQUwgaGVyZSwgYnV0IGF1dG9tYWtlIGxpa2VzCi0gICAgICAgICAgZG5sIGFsbCBBTV9DT05ESVRJT05BTHMgdG8gYmUgbmljZSBhbmQgZXhwbGljaXQgaW4gY29uZmlndXJlLmFjLgotICAgICAgICAgIGRubCBBTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl8kMV0sIFt0ZXN0ICIkYXhfdGhyaWZ0X2dlbl8kMSIgPSAieWVzIl0pCi0gICAgICAgICBdKQotCiBBQ19ERUZVTihbQVhfVEhSSUZUX0xJQl0sCiAgICAgICAgICBbCiAgICAgICAgICAgQUNfQVJHX1dJVEgoJDEsCmRpZmYgLS1naXQgYS9hcHB2ZXlvci55bWwgYi9hcHB2ZXlvci55bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTAyMTQ3OQotLS0gL2Rldi9udWxsCisrKyBiL2FwcHZleW9yLnltbApAQCAtMCwwICsxLDExMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgYnVpbGQgQXBhY2hlIFRocmlmdCBvbiBBcHBWZXlvciAtIGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tCisKK3ZlcnNpb246ICcxLjAuMC57YnVpbGR9JworCitzaGFsbG93X2Nsb25lOiB0cnVlCisKK29zOgorICAtIFZpc3VhbCBTdHVkaW8gMjAxNworCittYXRyaXg6CisgIGFsbG93X2ZhaWx1cmVzOgorICAgICAgLSBQUk9GSUxFOiBDWUdXSU4KKyAgZmFzdF9maW5pc2g6IHRydWUKKworZW52aXJvbm1lbnQ6CisgIG1hdHJpeDoKKyAgIC0gUFJPRklMRTogTVNWQzIwMTcKKyAgICAgUExBVEZPUk06IHg2NAorICAgICBDT05GSUdVUkFUSU9OOiBSZWxlYXNlCisgICAgIEJPT1NUX1ZFUlNJT046IDEuNjUuMQorICAgICBMSUJFVkVOVF9WRVJTSU9OOiAyLjEuOAorICAgICBQWVRIT05fVkVSU0lPTjogMy42CisgICAgIFFUX1ZFUlNJT046IDUuMTAKKyAgICAgWkxJQl9WRVJTSU9OOiAxLjIuMTEKKyAgICAgRElTQUJMRURfVEVTVFM6IFN0cmVzc1Rlc3ROb25CbG9ja2luZworCisgICAtIFBST0ZJTEU6IE1TVkMyMDEzCisgICAgIFBMQVRGT1JNOiB4ODYKKyAgICAgQ09ORklHVVJBVElPTjogUmVsZWFzZQorICAgICBCT09TVF9WRVJTSU9OOiAxLjU4LjAKKyAgICAgTElCRVZFTlRfVkVSU0lPTjogMi4wLjIyCisgICAgIFBZVEhPTl9WRVJTSU9OOiAzLjUKKyAgICAgUVRfVkVSU0lPTjogNS44CisgICAgIFpMSUJfVkVSU0lPTjogMS4yLjgKKyAgICAgRElTQUJMRURfVEVTVFM6IFN0cmVzc1Rlc3ROb25CbG9ja2luZworICAgICBBUFBWRVlPUl9CVUlMRF9XT1JLRVJfSU1BR0U6IFZpc3VhbCBTdHVkaW8gMjAxNQorCisgICAtIFBST0ZJTEU6IE1JTkdXCisgICAgIFBMQVRGT1JNOiB4NjQKKyAgICAgQ09ORklHVVJBVElPTjogUmVsV2l0aERlYkluZm8KKyAgICAgRElTQUJMRURfVEVTVFM6IFN0cmVzc1Rlc3ROb25CbG9ja2luZworCisgICAtIFBST0ZJTEU6IENZR1dJTgorICAgICBQTEFURk9STTogeDg2CisgICAgIENPTkZJR1VSQVRJT046IFJlbFdpdGhEZWJJbmZvCisgICAgIERJU0FCTEVEX1RFU1RTOiAoWmxpYlRlc3R8T3BlblNTTE1hbnVhbEluaXRUZXN0fFROb25ibG9ja2luZ1NlcnZlclRlc3R8U3RyZXNzVGVzdE5vbkJsb2NraW5nKQorCisjICAtIFBST0ZJTEU6IENZR1dJTgorIyAgICBQTEFURk9STTogeDY0CisjICAgIENPTkZJR1VSQVRJT046IFJlbFdpdGhEZWJJbmZvCisjICAgIERJU0FCTEVEX1RFU1RTOiAoWmxpYlRlc3R8T3BlblNTTE1hbnVhbEluaXRUZXN0fFROb25ibG9ja2luZ1NlcnZlclRlc3R8U3RyZXNzVGVzdE5vbkJsb2NraW5nKQorCitpbnN0YWxsOgorICAtIGNkICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCisgIC0gY2FsbCBidWlsZFxhcHB2ZXlvclwlUFJPRklMRTp+MCw0JS1hcHB2ZXlvci1pbnN0YWxsLmJhdAorICAtIHJlZnJlc2hlbnYKKworYnVpbGRfc2NyaXB0OgorICAtIGNkICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCisgIC0gY2FsbCBidWlsZFxhcHB2ZXlvclwlUFJPRklMRTp+MCw0JS1hcHB2ZXlvci1idWlsZC5iYXQKKwordGVzdF9zY3JpcHQ6CisgIC0gY2QgJUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKKyAgLSBjYWxsIGJ1aWxkXGFwcHZleW9yXCVQUk9GSUxFOn4wLDQlLWFwcHZleW9yLXRlc3QuYmF0CisKKworIyBhcnRpZmFjdCBjYXB0dXJlIGRpc2FibGVkIGFzIGl0IG1pZ2h0IGluY3JlYXNlIHNlcnZpY2UgY29zdCBmb3IgbGl0dGxlIGdhaW46CisjCisjIGFydGlmYWN0czoKKyMgIC0gcGF0aDogbG9jYWwtdGhyaWZ0LWluc3QKKyMgICAgbmFtZTogY21ha2UgaW5zdGFsbGVkIGNvbnRlbnQKKyMgICAgdHlwZTogemlwCisjCisjICAtIHBhdGg6IGxvY2FsLXRocmlmdC1idWlsZFxUZXN0aW5nCisjICAgIG5hbWU6IGN0ZXN0IG91dHB1dAorIyAgICB0eXBlOiB6aXAKKworIyBSRFAgc3VwcG9ydDogdXNlIG9uZSBvciB0aGUgb3RoZXIuLi4KKyMKKyMgZW5hYmxlcyBSRFAgZm9yIGVhY2ggYnVpbGQgam9iIHNvIHlvdSBjYW4gaW5zcGVjdCB0aGUgZW52aXJvbm1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgam9iOgorIyBpbml0OgorIyAgLSBwczogaWV4ICgobmV3LW9iamVjdCBuZXQud2ViY2xpZW50KS5Eb3dubG9hZFN0cmluZygnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2FwcHZleW9yL2NpL21hc3Rlci9zY3JpcHRzL2VuYWJsZS1yZHAucHMxJykpCisjCisjIGVuYWJsZXMgUkRQIGF0IHRoZSBlbmQgb2YgdGhlIGJ1aWxkIGpvYiBzbyB5b3UgY2FuIGxvZ2luIGFuZCByZS1ydW4KKyMgY29tbWFuZHMgdG8gc2VlIHdoeSBzb21ldGhpbmcgZmFpbGVkLi4uCisjb25fZmluaXNoOgorIyAgLSBwczogJGJsb2NrUmRwID0gJHRydWU7IGlleCAoKG5ldy1vYmplY3QgbmV0LndlYmNsaWVudCkuRG93bmxvYWRTdHJpbmcoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hcHB2ZXlvci9jaS9tYXN0ZXIvc2NyaXB0cy9lbmFibGUtcmRwLnBzMScpKQorIworIyBhbHNvIG5lZWQ6CisjIGVudmlyb25tZW50OgorIyAgIEFQUFZFWU9SX1JEUF9QQVNTV09SRDogdGhyMUZUMjM0NSR4eXpaCmRpZmYgLS1naXQgYS9ib290c3RyYXAuc2ggYi9ib290c3RyYXAuc2gKaW5kZXggMGMyYjg4Ni4uMjQ1MmVlYSAxMDA3NTUKLS0tIGEvYm9vdHN0cmFwLnNoCisrKyBiL2Jvb3RzdHJhcC5zaApAQCAtMzgsOSArMzgsMjQgQEAKICAgZXhpdCAxCiBmaQogCitmb3JtYXRfdmVyc2lvbiAoKSB7CisgICAgcHJpbnRmICIlMDNkJTAzZCUwM2QlMDNkIiAkKGVjaG8gJDEgfCB0ciAnLicgJyAnKTsKK30KKworIyB3ZSByZXF1aXJlIGF1dG9tYWtlIDEuMTMgb3IgbGF0ZXIKKyMgY2hlY2sgbXVzdCBoYXBwZW4gZXh0ZXJuYWxseSBkdWUgdG8gdXNlIG9mIG5ld2VyIG1hY3JvCitBVVRPTUFLRV9WRVJTSU9OPWBhdXRvbWFrZSAtLXZlcnNpb24gfCBncmVwIGF1dG9tYWtlIHwgZWdyZXAgLW8gJyhbMC05XXsxLH1cLikrWzAtOV17MSx9J2AKK2lmICBbICQoZm9ybWF0X3ZlcnNpb24gJEFVVE9NQUtFX1ZFUlNJT04pIC1sdCAkKGZvcm1hdF92ZXJzaW9uIDEuMTMpIF07IHRoZW4KKyAgZWNobyA+JjIgImF1dG9tYWtlIHZlcnNpb24gJEFVVE9NQUtFX1ZFUlNJT04gaXMgdG9vIG9sZCAobmVlZCAxLjEzIG9yIGxhdGVyKSIKKyAgZXhpdCAxCitmaQorCitzZXQgLWUKIGF1dG9zY2FuCiAkTElCVE9PTElaRSAtLWNvcHkgLS1hdXRvbWFrZQogYWNsb2NhbCAtSSAuL2FjbG9jYWwKIGF1dG9oZWFkZXIKK3NlZCAnL3VuZGVmIFZFUlNJT04vZCcgY29uZmlnLmhpbiA+IGNvbmZpZy5oaW4yCittdiBjb25maWcuaGluMiBjb25maWcuaGluCiBhdXRvY29uZgogYXV0b21ha2UgLS1jb3B5IC0tYWRkLW1pc3NpbmcgLS1mb3JlaWduCmRpZmYgLS1naXQgYS9ib3dlci5qc29uIGIvYm93ZXIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTNiOGNiCi0tLSAvZGV2L251bGwKKysrIGIvYm93ZXIuanNvbgpAQCAtMCwwICsxLDE1IEBACit7CisgICJuYW1lIjogInRocmlmdCIsCisgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgImhvbWVwYWdlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCIsCisgICJhdXRob3JzIjogWworICAgICJBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IgorICBdLAorICAiZGVzY3JpcHRpb24iOiAiQXBhY2hlIFRocmlmdCIsCisgICJtYWluIjogImxpYi9qcy9zcmMvdGhyaWZ0LmpzIiwKKyAgImtleXdvcmRzIjogWworICAgICJ0aHJpZnQiCisgIF0sCisgICJsaWNlbnNlIjogIkFwYWNoZSB2MiIsCisgICJpZ25vcmUiOiBbXQorfQpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci1idWlsZC5iYXQgYi9idWlsZC9hcHB2ZXlvci9DWUdXLWFwcHZleW9yLWJ1aWxkLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjI2MjIyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci1idWlsZC5iYXQKQEAgLTAsMCArMSwzNiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfYnVpbGQuYmF0ICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworU0VUIENNQUtFQVJHUz1eCisgIC1HJyVHRU5FUkFUT1IlJyBeCisgIC1EQ01BS0VfQlVJTERfVFlQRT0lQ09ORklHVVJBVElPTiUgXgorICAtRENNQUtFX0lOU1RBTExfUFJFRklYPSVJTlNURElSJSBeCisgIC1EQ01BS0VfQ1hYX0VYVEVOU0lPTlM9T04gXgorICAtRENNQUtFX0NYWF9GTEFHUz0iLURfR05VX1NPVVJDRSIgXgorICAtRENNQUtFX0NYWF9TVEFOREFSRD0xMSBeCisgIC1EV0lUSF9QWVRIT049T0ZGIF4KKyAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIF4KKyAgLURXSVRIX1NUQVRJQ19MSUI9T04gXgorICAtRFdJVEhfU1REVEhSRUFEUz1PTgorCitARUNITyBPTgorJUJBU0glIC1sYyAibWtkaXIgLXAgJUJVSUxERElSJSAmJiBjZCAlQlVJTERESVIlICYmIGNtYWtlLmV4ZSAlU1JDRElSJSAlQ01BS0VBUkdTJSAmJiBjbWFrZSAtLWJ1aWxkIC4gLS1jb25maWcgJUNPTkZJR1VSQVRJT04lIC0tdGFyZ2V0IGluc3RhbGwiIHx8IEVYSVQgL0IKK0BFQ0hPIE9GRgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci1pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkYjdkNAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItaW5zdGFsbC5iYXQKQEAgLTAsMCArMSwzNCBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEFwcHZleW9yIGluc3RhbGwgc2NyaXB0IGZvciBDWUdXSU4KKzo6IEluc3RhbGxzIHRoaXJkIHBhcnR5IHBhY2thZ2VzIHdlIG5lZWQgZm9yIGEgY21ha2UgYnVpbGQKKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfaW5zdGFsbC5iYXQgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3Nob3dlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCis6OgorOjogSW5zdGFsbCBhcHQtY3lnIGZvciBwYWNrYWdlIG1hbmFnZW1lbnQKKzo6CisKKyVCQVNIJSAtbGMgIndnZXQgcmF3Z2l0LmNvbS90cmFuc2NvZGUtb3Blbi9hcHQtY3lnL21hc3Rlci9hcHQtY3lnICYmIGluc3RhbGwgYXB0LWN5ZyAvYmluICYmIHJtIC1mIGFwdC1jeWciIHx8IEVYSVQgL0IKKyVCQVNIJSAtbGMgImFwdC1jeWcgdXBkYXRlIiB8fCBFWElUIC9CCislQkFTSCUgLWxjICJhcHQtY3lnIGluc3RhbGwgYmlzb24gY21ha2UgZmxleCBnY2MtZysrIGxpYmJvb3N0LWRldmVsIGxpYmV2ZW50LWRldmVsIG1ha2Ugb3BlbnNzbC1kZXZlbCB6bGliLWRldmVsIgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci10ZXN0LmJhdCBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItdGVzdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2N2Y5YgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItdGVzdC5iYXQKQEAgLTAsMCArMSwyMSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfdGVzdC5iYXQgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICB8fCBFWElUIC9CCisKKyVCQVNIJSAtbGMgImNkICVCVUlMRERJUiUgJiYgY3Rlc3QuZXhlIC1DICVDT05GSUdVUkFUSU9OJSAtLXRpbWVvdXQgMzAwIC1WViAtRSAnJURJU0FCTEVEX1RFU1RTJSciIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTUlORy1hcHB2ZXlvci1idWlsZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM3YTk1YQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItYnVpbGQuYmF0CkBAIC0wLDAgKzEsMzYgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2J1aWxkLmJhdCAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK1NFVCBDTUFLRUFSR1M9XgorICAtRyclR0VORVJBVE9SJScgXgorICAtRENNQUtFX0JVSUxEX1RZUEU9JUNPTkZJR1VSQVRJT04lIF4KKyAgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD0lSU5TVERJUiUgXgorICAtRENNQUtFX01BS0VfUFJPR1JBTT0vbWluZ3clTk9STV9QTEFURk9STSUvYmluL21pbmd3MzItbWFrZSBeCisgIC1EQ01BS0VfQ19DT01QSUxFUj0vbWluZ3clTk9STV9QTEFURk9STSUvYmluL2djYy5leGUgXgorICAtRENNQUtFX0NYWF9DT01QSUxFUj0vbWluZ3clTk9STV9QTEFURk9STSUvYmluL2crKy5leGUgXgorICAtRE9QRU5TU0xfUk9PVF9ESVI9L21pbmd3JU5PUk1fUExBVEZPUk0lIF4KKyAgLURXSVRIX1BZVEhPTj1PRkYgXgorICAtRFdJVEhfU0hBUkVEX0xJQj1PRkYgXgorICAtRFdJVEhfU1RBVElDX0xJQj1PTgorCitARUNITyBPTgorJUJBU0glIC1sYyAibWtkaXIgLXAgJUJVSUxERElSJSAmJiBjZCAlQlVJTERESVIlICYmIGNtYWtlLmV4ZSAlU1JDRElSJSAlQ01BS0VBUkdTJSAmJiBjbWFrZSAtLWJ1aWxkIC4gLS1jb25maWcgJUNPTkZJR1VSQVRJT04lIC0tdGFyZ2V0IGluc3RhbGwiIHx8IEVYSVQgL0IKK0BFQ0hPIE9GRgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTUlORy1hcHB2ZXlvci1pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA2OWIwNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItaW5zdGFsbC5iYXQKQEAgLTAsMCArMSw0NSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEFwcHZleW9yIGluc3RhbGwgc2NyaXB0IGZvciBNSU5HVyBvbiBNU1lTMgorOjogSW5zdGFsbHMgdGhpcmQgcGFydHkgcGFja2FnZXMgd2UgbmVlZCBmb3IgYSBjbWFrZSBidWlsZAorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl9pbnN0YWxsLmJhdCAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2hvd2Vudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK1NFVCBQQUNLQUdFUz1eCisgIC0tbmVlZGVkIC1TIGJpc29uIGZsZXggbWFrZSBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1ib29zdCBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1jbWFrZSBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1saWJldmVudCBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1vcGVuc3NsIF4KKyAgbWluZ3ctdzY0LSVNSU5HV1BMQVQlLXRvb2xjaGFpbiBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS16bGliCisKKzo6bWluZ3ctdzY0LSVNSU5HV1BMQVQlLXF0NSA6IFdBWSB0b28gbGFyZ2UgKDFHQiBkb3dubG9hZCEpIC0gdGVzdGVkIGluIGN5Z3dpbiBidWlsZHMgYW55d2F5CisKKzo6IFJlbW92ZSBvbGQgcGFja2FnZXMgdGhhdCBubyBsb25nZXIgZXhpc3QgdG8gYXZvaWQgYW4gZXJyb3IKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAtLXJlbW92ZSBsaWJjYXRnZXRzIGNhdGdldHMgfHwgdHJ1ZSIgfHwgRVhJVCAvQgorCis6OiBVcGdyYWRlIHRoaW5ncworJUJBU0glIC1sYyAicGFjbWFuIC0tbm9jb25maXJtIC1TeXUgJUlHTk9SRSUiICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCislQkFTSCUgLWxjICJwYWNtYW4gLS1ub2NvbmZpcm0gLVN1ICVJR05PUkUlIiAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAlUEFDS0FHRVMlIiAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItdGVzdC5iYXQgYi9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLXRlc3QuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OWMxZmYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLXRlc3QuYmF0CkBAIC0wLDAgKzEsMjIgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfdGVzdC5iYXQgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICB8fCBFWElUIC9CCisKKyVCQVNIJSAtbGMgImNkICVCVUlMRERJUiUgJiYgY3Rlc3QuZXhlIC1DICVDT05GSUdVUkFUSU9OJSAtLXRpbWVvdXQgMzAwIC1WViAtRSAnJURJU0FCTEVEX1RFU1RTJSciIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci1idWlsZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRiOTJhMgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItYnVpbGQuYmF0CkBAIC0wLDAgKzEsNDcgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2J1aWxkLmJhdCAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitNS0RJUiAiJUJVSUxERElSJSIgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NEICIlQlVJTERESVIlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitARUNITyBPTgorICBjbWFrZSAiJVNSQ0RJUiUiIF4KKyAgICAtRyIlR0VORVJBVE9SJSIgXgorCS1EQklTT05fRVhFQ1VUQUJMRT1DOlxQcm9ncmFtRGF0YVxjaG9jb2xhdGV5XGxpYlx3aW5mbGV4Ymlzb24zXHRvb2xzXHdpbl9iaXNvbi5leGUgXgorICAgIC1EQk9PU1RfUk9PVD0iJUJPT1NUX1JPT1QlIiBeCisgICAgLURCT09TVF9MSUJSQVJZRElSPSIlQk9PU1RfTElCUkFSWURJUiUiIF4KKyAgICAtRENNQUtFX0JVSUxEX1RZUEU9IiVDT05GSUdVUkFUSU9OJSIgXgorICAgIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9IiVJTlNURElSJSIgXgorCS1ERkxFWF9FWEVDVVRBQkxFPUM6XFByb2dyYW1EYXRhXGNob2NvbGF0ZXlcbGliXHdpbmZsZXhiaXNvbjNcdG9vbHNcd2luX2ZsZXguZXhlIF4KKyAgICAtRElOVFRZUEVTX1JPT1Q9IiVXSU4zUCVcbXNpbnR0eXBlcyIgXgorICAgIC1ETElCRVZFTlRfUk9PVD0iJVdJTjNQJVxsaWJldmVudC0lTElCRVZFTlRfVkVSU0lPTiUtc3RhYmxlIiBeCisgICAgLURPUEVOU1NMX1JPT1RfRElSPSIlT1BFTlNTTF9ST09UJSIgXgorICAgIC1ET1BFTlNTTF9VU0VfU1RBVElDX0xJQlM9T0ZGIF4KKyAgICAtRFpMSUJfTElCUkFSWT0iJVdJTjNQJVx6bGliLWluc3RcbGliXHpsaWIlWkxJQl9MSUJfU1VGRklYJS5saWIiIF4KKyAgICAtRFpMSUJfUk9PVD0iJVdJTjNQJVx6bGliLWluc3QiIF4KKyAgICAtRFdJVEhfUFlUSE9OPSVXSVRIX1BZVEhPTiUgXgorICAgIC1EV0lUSF8lVEhSRUFETU9ERUwlVEhSRUFEUz1PTiBeCisgICAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIF4KKyAgICAtRFdJVEhfU1RBVElDX0xJQj1PTiAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQEVDSE8gT0ZGCisKK2NtYWtlIC0tYnVpbGQgLiBeCisgIC0tY29uZmlnICIlQ09ORklHVVJBVElPTiUiIF4KKyAgLS10YXJnZXQgSU5TVEFMTCAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci1pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk3M2QyOQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItaW5zdGFsbC5iYXQKQEAgLTAsMCArMSw1OSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEFwcHZleW9yIGluc3RhbGwgc2NyaXB0IGZvciBNU1ZDCis6OiBJbnN0YWxscyAob3IgYnVpbGRzKSB0aGlyZCBwYXJ0eSBwYWNrYWdlcyB3ZSBuZWVkCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfaW5zdGFsbC5iYXQgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zaG93ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorTUtESVIgIiVXSU4zUCUiICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitjaG9jbyBmZWF0dXJlIGVuYWJsZSAtbiBhbGxvd0dsb2JhbENvbmZpcm1hdGlvbiB8fCBFWElUIC9CCisKKzo6IFRoaW5ncyB0byBpbnN0YWxsIHdoZW4gTk9UIHJ1bm5pbmcgaW4gYXBwdmV5b3I6CitJRiAiJUFQUFZFWU9SX0JVSUxEX0lEJSIgPT0gIiIgKAorICAgIGN1cCAteSBjaG9jb2xhdGV5ICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorICAgIGNpbnN0IC15IGN1cmwgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorICAgIGNpbnN0IC15IDd6aXAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorICAgIGNpbnN0IC15IHB5dGhvbjMgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorICAgIGNpbnN0IC15IG9wZW5zc2wubGlnaHQgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorKQorCitjaW5zdCAteSBqZGs4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitjaW5zdCAteSB3aW5mbGV4Ymlzb24zICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IHpsaWIgLSBub3QgYXZhaWxhYmxlIHRocm91Z2ggY2hvY29sYXRleQorQ0QgIiVBUFBWRVlPUl9TQ1JJUFRTJSIgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorY2FsbCBidWlsZC16bGliLmJhdCAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCis6OiBsaWJldmVudCAtIG5vdCBhdmFpbGFibGUgdGhyb3VnaCBjaG9jb2xhdGV5CitDRCAiJUFQUFZFWU9SX1NDUklQVFMlIiAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitjYWxsIGJ1aWxkLWxpYmV2ZW50LmJhdCAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IHB5dGhvbiBwYWNrYWdlcyAoY29ycmVjdCBwYXRoIHRvIHBpcCBzZXQgaW4gY2xfc2V0ZW52LmJhdCkKK3BpcC5leGUgXgorICAgIGluc3RhbGwgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBeCisgICAgICAgICAgICBpcGFkZHJlc3MgXgorICAgICAgICAgICAgc2l4IF4KKyAgICAgICAgICAgIHRvcm5hZG8gXgorICAgICAgICAgICAgdHdpc3RlZCAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitjaW5zdCAteSBnaGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9NU1ZDLWFwcHZleW9yLXRlc3QuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci10ZXN0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTk0NTc5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci10ZXN0LmJhdApAQCAtMCwwICsxLDMyIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPTgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX3Rlc3QuYmF0ICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0QgIiVCVUlMRERJUiUiICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworRElSIEM6XGxpYnJhcmllcworRElSIEM6XGxpYnJhcmllc1xib29zdF8xXzU5XzAKK0RJUiBDOlxsaWJyYXJpZXNcYm9vc3RfMV82MF8wCitESVIgQzpcbGlicmFyaWVzXGJvb3N0XzFfNjJfMAorRElSIEM6XGxpYnJhcmllc1xib29zdF8xXzYzXzAKK0RJUiBDOlxsaWJyYXJpZXNcYm9vc3RfMV82NF8wCisKKzo6IEFkZCBkaXJlY3RvcmllcyB0byB0aGUgcGF0aCB0byBmaW5kIERMTHMgb2YgdGhpcmQgcGFydHkgbGlicmFyaWVzIHNvIHRlc3RzIHJ1biBwcm9wZXJseSEKK1NFVCBQQVRIPSVCT09TVF9MSUJSQVJZRElSOi89XCU7JU9QRU5TU0xfUk9PVCVcYmluOyVXSU4zUCVcemxpYi1pbnN0XGJpbjslUEFUSCUKKworY3Rlc3QgLUMgJUNPTkZJR1VSQVRJT04lIC0tdGltZW91dCAzMDAgLVZWIC1FICIoJURJU0FCTEVEX1RFU1RTJSkiIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci1idWlsZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQwMTcyOQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItYnVpbGQuYmF0CkBAIC0wLDAgKzEsNDggQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2J1aWxkLmJhdCAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK1NFVCBCQVNIPUM6XG1zeXM2NFx1c3JcYmluXGJhc2gKK1NFVCBDTUFLRT0vYy9tc3lzNjQvbWluZ3c2NC9iaW4vY21ha2UuZXhlCisKK0BFQ0hPIE9OCitTRVQgQ01BS0VBUkdTPS1HXCIlR0VORVJBVE9SJVwiIF4KKyAgLURCb29zdF9ERUJVRz1PTiBeCisgIC1EQm9vc3RfTkFNRVNQQUNFPWxpYmJvb3N0IF4KKyAgLURCT09TVF9JTkNMVURFRElSPSVCT09TVF9JTkNMVURFRElSJSBeCisgIC1EQk9PU1RfTElCUkFSWURJUj0lQk9PU1RfTElCUkFSWURJUiUgXgorICAtRENNQUtFX0JVSUxEX1RZUEU9JUNPTkZJR1VSQVRJT04lIF4KKyAgLURDTUFLRV9DX0NPTVBJTEVSPWdjYy5leGUgXgorICAtRENNQUtFX0NYWF9DT01QSUxFUj1nKysuZXhlIF4KKyAgLURDTUFLRV9NQUtFX1BST0dSQU09bWFrZS5leGUgXgorICAtRENNQUtFX0lOU1RBTExfUFJFRklYPSVJTlNURElSX01TWVMlIF4KKyAgLURMSUJFVkVOVF9ST09UPSVMSUJFVkVOVF9ST09UJSBeCisgIC1ET1BFTlNTTF9MSUJSQVJJRVM9JU9QRU5TU0xfTElCUkFSSUVTJSBeCisgIC1ET1BFTlNTTF9ST09UX0RJUj0lT1BFTlNTTF9ST09UJSBeCisgIC1ET1BFTlNTTF9VU0VfU1RBVElDX0xJQlM9T04gXgorICAtRFdJVEhfQk9PU1RfU1RBVElDPU9OIF4KKyAgLURXSVRIX0pBVkE9T0ZGIF4KKyAgLURXSVRIX0xJQkVWRU5UPU9OIF4KKyAgLURXSVRIX1BZVEhPTj0lV0lUSF9QWVRIT04lIF4KKyAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIF4KKyAgLURXSVRIX1NUQVRJQ19MSUI9T04KKworJUJBU0glIC1sYyAibWtkaXIgJUJVSUxERElSX01TWVMlICYmIGNkICVCVUlMRERJUl9NU1lTJSAmJiAlQ01BS0UlICVTUkNESVJfTVNZUyUgJUNNQUtFQVJHUyUgJiYgJUNNQUtFJSAtLWJ1aWxkIC4gLS1jb25maWcgJUNPTkZJR1VSQVRJT04lIC0tdGFyZ2V0IGluc3RhbGwiIHx8IEVYSVQgL0IKK0BFQ0hPIE9GRgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci1pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxOGRmMwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItaW5zdGFsbC5iYXQKQEAgLTAsMCArMSw0OCBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEFwcHZleW9yIGluc3RhbGwgc2NyaXB0IGZvciBNU1lTCis6OiBJbnN0YWxscyAob3IgYnVpbGRzKSB0aGlyZCBwYXJ0eSBwYWNrYWdlcyB3ZSBuZWVkCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2luc3RhbGwuYmF0ICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zaG93ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjogV2UncmUgZ29pbmcgdG8ga2VlcCBib29zdCBhdCBhIHZlcnNpb24gY21ha2UgdW5kZXJzdGFuZHMKK1NFVCBCT09TVFBLRz1taW5ndy13NjQteDg2XzY0LWJvb3N0LTEuNjQuMC0zLWFueS5wa2cudGFyLnh6CitTRVQgSUdOT1JFPS0taWdub3JlIG1pbmd3LXc2NC14ODZfNjQtYm9vc3QKKworU0VUIFBBQ0tBR0VTPV4KKyAgLS1uZWVkZWQgLVMgYmlzb24gZmxleCBtYWtlIF4KKyAgbWluZ3ctdzY0LXg4Nl82NC1jbWFrZSBeCisgIG1pbmd3LXc2NC14ODZfNjQtbGliZXZlbnQgXgorICBtaW5ndy13NjQteDg2XzY0LW9wZW5zc2wgXgorICBtaW5ndy13NjQteDg2XzY0LXRvb2xjaGFpbiBeCisgIG1pbmd3LXc2NC14ODZfNjQtemxpYgorCislQkFTSCUgLWxjICJwYWNtYW4gLS1ub2NvbmZpcm0gLVN5dSAlSUdOT1JFJSIgfHwgRVhJVCAvQgorJUJBU0glIC1sYyAicGFjbWFuIC0tbm9jb25maXJtIC1TdSAlSUdOT1JFJSIgIHx8IEVYSVQgL0IKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAlUEFDS0FHRVMlIiAgICB8fCBFWElUIC9CCisKKzo6IEluc3RhbGwgYSBzbGlnaHRseSBvbGRlciBib29zdCAoMS42NC4wKSBhcyBjbWFrZSAzLjEwCis6OiBkb2VzIG5vdCBoYXZlIGJ1aWx0LWluIGRlcGVuZGVuY2llcyBmb3IgYm9vc3QgMS42Ni4wIHlldAorOjogLS0gdGhpcyBjdXRzIGRvd24gb24gYnVpbGQgd2FybmluZyBvdXRwdXQgLS0KKyVCQVNIJSAtbGMgIndnZXQgaHR0cDovL3JlcG8ubXN5czIub3JnL21pbmd3L3g4Nl82NC8lQk9PU1RQS0clICYmIHBhY21hbiAtLW5vY29uZmlybSAtLW5lZWRlZCAtVSAlQk9PU1RQS0clICYmIHJtICVCT09TVFBLRyUiIHx8IEVYSVQgL0IKKwpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci10ZXN0LmJhdCBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItdGVzdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzN2VjNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItdGVzdC5iYXQKQEAgLTAsMCArMSwyNiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl90ZXN0LmJhdCAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NEICIlQlVJTERESVIlIiAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IHJhbmRvbWx5IGZhaWxzIG9uIG1pbmd3OyBzZWUgSmlyYSBUSFJJRlQtNDEwNgorU0VUIERJU0FCTEVEX1RFU1RTPWNvbmN1cnJlbmN5X3Rlc3QKKworJUJBU0glIC1sYyAiY2QgJUJVSUxERElSX01TWVMlICYmIGN0ZXN0LmV4ZSAtQyAlQ09ORklHVVJBVElPTiUgLS10aW1lb3V0IDMwMCAtVlYgLUUgJyglRElTQUJMRURfVEVTVFMlKSciIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL1JFQURNRS5tZCBiL2J1aWxkL2FwcHZleW9yL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTJhYTMwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzQgQEAKKzwhLS0tCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKyMgQXBwdmV5b3IgQnVpbGQKKworQXBwdmV5b3IgaXMgY2FwYWJsZSBvZiBidWlsZGluZyBNU1ZDIDIwMTAgdGhyb3VnaCAyMDE1IGFzIHdlbGwgYXMKK2hhdmluZyB0aGUgbGF0ZXN0IE1TWVMyL01pbkdXIDY0LWJpdCBlbnZpcm9ubWVudC4gIEl0IGhhcyBtYW55IHZlcnNpb25zCitvZiBib29zdCBhbmQgcHl0aG9uIGluc3RhbGxlZCBhcyB3ZWxsLiAgU2VlIHdoYXQgYXBwdmV5b3IgaGFzCitbaW5zdGFsbGVkIG9uIGJ1aWxkIHdvcmtlcnNdKGh0dHBzOi8vd3d3LmFwcHZleW9yLmNvbS9kb2NzL2luc3RhbGxlZC1zb2Z0d2FyZS8pLgorCitXZSBydW4gYSBtYXRyaXggYnVpbGQgb24gQXBwdmV5b3IgYW5kIGJ1aWxkIHRoZSBmb2xsb3dpbmcgY29tYmluYXRpb25zOgorCisqIE1pbkdXIHg2NCAoZ2NjIDYuMy4wKQorKiBNU1ZDIDIwMTAgeDg2LCBhbiBvbGRlciBib29zdCwgYW4gb2xkZXIgcHl0aG9uCisqIE1TVkMgMjAxNSB4ODYveDY0LCB0aGUgbGF0ZXN0IGJvb3N0LCB0aGUgbGF0ZXN0IHB5dGhvbgorKiBNU1lTMiB4NjQgKGdjYyA2LjMuMCkgLSB0aGlzIGlzIGEgd29yayBpbiBwcm9ncmVzcworCitUaGUgQXBwdmV5b3Igc2NyaXB0IHRha2VzIHRoZSBmaXJzdCBmb3VyIGxldHRlcnMgZnJvbSB0aGUgUFJPRklMRSBzcGVjaWZpZWQgaW4KK3RoZSBlbnZpcm9ubWVudCBzdGFuemEgYW5kIHJ1bnMgdGhlc2Ugc2NyaXB0cyBpbiBvcmRlcjoKKworPz8/Py1hcHB2ZXlvci1pbnN0YWxsLmJhdCB3aWxsIGluc3RhbGwgdGhpcmQgcGFydHkgbGlicmFyaWVzIGFuZCBzZXQgdXAgdGhlIGVudmlyb25tZW50Cis/Pz8/LWFwcHZleW9yLWJ1aWxkLmJhdCB3aWxsIGJ1aWxkIHdpdGggY21ha2UKKz8/Pz8tYXBwdmV5b3ItdGVzdC5iYXQgd2lsbCBydW4gY3Rlc3QKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2J1aWxkLWxpYmV2ZW50LmJhdCBiL2J1aWxkL2FwcHZleW9yL2J1aWxkLWxpYmV2ZW50LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGI2MzViCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvYnVpbGQtbGliZXZlbnQuYmF0CkBAIC0wLDAgKzEsMzcgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworU0VUIFVSTEZJTEU9bGliZXZlbnQtJUxJQkVWRU5UX1ZFUlNJT04lLXN0YWJsZS50YXIuZ3oKK1NFVCBVUkw9aHR0cHM6Ly9naXRodWIuY29tL2xpYmV2ZW50L2xpYmV2ZW50L3JlbGVhc2VzL2Rvd25sb2FkL3JlbGVhc2UtJUxJQkVWRU5UX1ZFUlNJT04lLXN0YWJsZS8lVVJMRklMRSUKKworOjogRG93bmxvYWQgLSBzdXBwb3J0IHJ1bm5pbmcgYSBsb2NhbCBidWlsZCBvciBhIGJ1aWxkIGluIGFwcHZleW9yCitDRCAiJVdJTjNQJSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorSUYgIiVBUFBWRVlPUl9CVUlMRF9JRCUiID09ICIiICgKKyAgICBjdXJsIC1MIC1mIC1vICIlVVJMRklMRSUiICIlVVJMJSIKKykgRUxTRSAoCisgICAgYXBwdmV5b3IgRG93bmxvYWRGaWxlICIlVVJMJSIKKykKKzd6IHggIiVVUkxGSUxFJSIgLXNvIHwgN3ogeCAtc2kgLXR0YXIgPiBudWwgICAgICB8fCBFWElUIC9CCitDRCAibGliZXZlbnQtJUxJQkVWRU5UX1ZFUlNJT04lLXN0YWJsZSIgICAgICAgICAgfHwgRVhJVCAvQgorbm1ha2UgLWYgTWFrZWZpbGUubm1ha2Ugc3RhdGljX2xpYnMgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjogaW4gbGliZXZlbnQgMi4wIHRoZXJlIGlzIG5vIG5tYWtlIHN1YmRpcmVjdG9yeSBpbiBXSU4zMi1Db2RlLCBidXQgaW4gMi4xIHRoZXJlIGlzCitta2RpciBsaWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorbW92ZSAqLmxpYiBsaWJcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK21vdmUgV0lOMzItQ29kZVxldmVudDJcKiBpbmNsdWRlXGV2ZW50MlwgICAgICAgICB8fCBtb3ZlIFdJTjMyLUNvZGVcbm1ha2VcZXZlbnQyXCogaW5jbHVkZVxldmVudDJcIHx8IEVYSVQgL0IKK21vdmUgKi5oIGluY2x1ZGVcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK0VORExPQ0FMCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9idWlsZC16bGliLmJhdCBiL2J1aWxkL2FwcHZleW9yL2J1aWxkLXpsaWIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTU3MjYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9idWlsZC16bGliLmJhdApAQCAtMCwwICsxLDU2IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK1NFVCBQQUNLQUdFPXpsaWItJVpMSUJfVkVSU0lPTiUKK1NFVCBCVUlMRERJUj0lV0lOM1AlXHpsaWItYnVpbGQKK1NFVCBJTlNURElSPSVXSU4zUCVcemxpYi1pbnN0CitTRVQgU1JDRElSPSVXSU4zUCVcJVBBQ0tBR0UlCitTRVQgVVJMRklMRT0lUEFDS0FHRSUudGFyLmd6CisKKzo6IFRoaXMgYWxsb3dzIHVzIHRvIHRvbGVyYXRlIHdoZW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBpcyBhcmNoaXZlZAorU0VUIFVSTD1odHRwOi8vemxpYi5uZXQvJVVSTEZJTEUlCitTRVQgRlVSTD1odHRwOi8vemxpYi5uZXQvZm9zc2lscy8lVVJMRklMRSUKKworOjogRG93bmxvYWQgLSBzdXBwb3J0IHJ1bm5pbmcgYSBsb2NhbCBidWlsZCBvciBhIGJ1aWxkIGluIGFwcHZleW9yCitDRCAiJVdJTjNQJSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0lGICIlQVBQVkVZT1JfQlVJTERfSUQlIiA9PSAiIiAoCisgICAgY3VybCAtTCAtZiAtbyAiJVVSTEZJTEUlIiAiJVVSTCUiCisgICAgSUYgRVJST1JMRVZFTCAxICgKKyAgICAgICAgY3VybCAtTCAtZiAtbyAiJVVSTEZJTEUlIiAiJUZVUkwlIgorICAgICkKKykgRUxTRSAoCisgICAgYXBwdmV5b3IgRG93bmxvYWRGaWxlICIlVVJMJSIKKyAgICBJRiBFUlJPUkxFVkVMIDEgKAorICAgICAgICBhcHB2ZXlvciBEb3dubG9hZEZpbGUgIiVGVVJMJSIgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisgICAgKQorKQorN3ogeCAiJVVSTEZJTEUlIiAtc28gfCA3eiB4IC1zaSAtdHRhciA+IG51bCAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IEdlbmVyYXRlCitNS0RJUiAiJUJVSUxERElSJSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NEICIlQlVJTERESVIlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorY21ha2UgIiVTUkNESVIlIiBeCisgICAgICAtRyJOTWFrZSBNYWtlZmlsZXMiIF4KKyAgICAgIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9IiVJTlNURElSJSIgXgorICAgICAgLURDTUFLRV9CVUlMRF9UWVBFPSIlQ09ORklHVVJBVElPTiUiICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IEJ1aWxkCitubWFrZSAvZk1ha2VmaWxlIGluc3RhbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0lGICIlQ09ORklHVVJBVElPTiUiID09ICJEZWJ1ZyIgKAorICAgIENPUFkgIiVCVUlMRERJUiVcemxpYmQucGRiIiAiJUlOU1RESVIlXGJpblwiICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCispCisKK0VORExPQ0FMCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfYXBhY2hlX3RocmlmdC5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfYXBhY2hlX3RocmlmdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmMmEyYQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl9hcGFjaGVfdGhyaWZ0LmJhdApAQCAtMCwwICsxLDI0IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OiBBIHZpc3VhbCBpbmRpY2F0b3IgaW4gYSBsYXJnZSBsb2cgaGVscHMgeW91IGxvY2F0ZSB0aGluZ3Mgd2hlbiBzY2FubmluZworOjogaHR0cDovL3d3dy5wYXRvcmprLmNvbS9zb2Z0d2FyZS90YWFnLyNwPWRpc3BsYXkmZj1TbWFsbCUyMFNsYW50JnQ9QXBhY2hlJTIwVGhyaWZ0CisKK0VDSE8vCitFQ0hPICAgIF9fXyAgICAgICAgICAgICAgICAgX18gICAgICAgICBfX19fX19fXyAgICAgICBfIF9fX19fCitFQ0hPICAgLyBfIHwgX19fICBfX18gX19fX18vIC8gIF9fXyAgIC9fICBfXy8gLyAgX19fXyhfKSBfLyAvXworRUNITyAgLyBfXyB8LyBfIFwvIF8gYC8gX18vIF8gXC8gLV8pICAgLyAvIC8gXyBcLyBfXy8gLyBfLyBfXy8KK0VDSE8gL18vIHxfLyAuX18vXF8sXy9cX18vXy8vXy9cX18vICAgL18vIC9fLy9fL18vIC9fL18vIFxfXy8KK0VDSE8gICAgICAvXy8KK0VDSE8vCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2J1aWxkLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDI3MmYzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2J1aWxkLmJhdApAQCAtMCwwICsxLDIzIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OiBBIHZpc3VhbCBpbmRpY2F0b3IgaW4gYSBsYXJnZSBsb2cgaGVscHMgeW91IGxvY2F0ZSB0aGluZ3Mgd2hlbiBzY2FubmluZworOjogaHR0cDovL3d3dy5wYXRvcmprLmNvbS9zb2Z0d2FyZS90YWFnLyNwPWRpc3BsYXkmZj1TbWFsbCUyMFNsYW50JnQ9QnVpbGQKKworRUNITy8KK0VDSE8gICAgX19fICAgICAgIF8gX18gICBfXworRUNITyAgIC8gXyApX18gX18oXykgL19fLyAvCitFQ0hPICAvIF8gIC8gLy8gLyAvIC8gXyAgLyAgICAgQEBAIEJVSUxECitFQ0hPIC9fX19fL1xfLF8vXy9fL1xfLF8vCitFQ0hPLwpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2luc3RhbGwuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2luc3RhbGwuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZTNkYTIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfaW5zdGFsbC5iYXQKQEAgLTAsMCArMSwyMyBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjogQSB2aXN1YWwgaW5kaWNhdG9yIGluIGEgbGFyZ2UgbG9nIGhlbHBzIHlvdSBsb2NhdGUgdGhpbmdzIHdoZW4gc2Nhbm5pbmcKKzo6IGh0dHA6Ly93d3cucGF0b3Jqay5jb20vc29mdHdhcmUvdGFhZy8jcD1kaXNwbGF5JmY9U21hbGwlMjBTbGFudCZ0PUluc3RhbGwKKworRUNITy8KK0VDSE8gICAgX19fXyAgICAgICAgIF9fICAgICAgIF9fX18KK0VDSE8gICAvICBfL19fICBfX18gLyAvX19fXyBfLyAvIC8KK0VDSE8gIF8vIC8vIF8gXChfLV48LyBfXy8gXyBcLyAvIC8gICAgIEBAQCBJTlNUQUxMCitFQ0hPIC9fX18vXy8vXy9fX18vXF9fL1xfLF8vXy9fLworRUNITy8KZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl90ZXN0LmJhdCBiL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl90ZXN0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGUyZDEwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX3Rlc3QuYmF0CkBAIC0wLDAgKzEsMjMgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKKzo6IEEgdmlzdWFsIGluZGljYXRvciBpbiBhIGxhcmdlIGxvZyBoZWxwcyB5b3UgbG9jYXRlIHRoaW5ncyB3aGVuIHNjYW5uaW5nCis6OiBodHRwOi8vd3d3LnBhdG9yamsuY29tL3NvZnR3YXJlL3RhYWcvI3A9ZGlzcGxheSZmPVNtYWxsJTIwU2xhbnQmdD1UZXN0CisKK0VDSE8vCitFQ0hPICBfX19fX18gICAgICAgIF9fCitFQ0hPIC9fICBfXy9fXyBfX18gLyAvXworRUNITyAgLyAvIC8gLV9efF8tXjwvIF9fLyAgICAgQEBAIFRFU1QKK0VDSE8gL18vICBcX18vX19fL1xfXy8KK0VDSE8vCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9zZXRjb21waWxlci5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9zZXRjb21waWxlci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzZmZjNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX3NldGNvbXBpbGVyLmJhdApAQCAtMCwwICsxLDYzIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OgorOjogRGV0ZWN0IHRoZSBjb21waWxlciBlZGl0aW9uIHdlJ3JlIGJ1aWxkaW5nIGluLgorOjogU2V0IHRoZSBDT01QSUxFUiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvbmUgb2Y6Cis6OiAgIGdjYyAgID0gTWluR1cgLyBNU1lTMiBhbmQgZ2NjIHRvb2xjaGFpbgorOjogICB2YzEwMCA9IFZpc3VhbCBTdHVkaW8gMjAxMAorOjogICB2YzExMCA9IFZpc3VhbCBTdHVkaW8gMjAxMgorOjogICB2YzEyMCA9IFZpc3VhbCBTdHVkaW8gMjAxMworOjogICB2YzE0MCA9IFZpc3VhbCBTdHVkaW8gMjAxNQorOjogICB2YzE0MSA9IFZpc3VhbCBTdHVkaW8gMjAxNworOjoKKzo6IEhvbm9ycyBhbnkgZXhpc3RpbmcgQ09NUElMRVIgZW52aXJvbm1lbnQgdmFyaWFibGUKKzo6ICAgc2V0dGluZyBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nIGl0LCB0byBhbGxvdyBpdAorOjogICB0byBiZSBmb3JjZWQgaWYgbmVlZGVkLgorOjoKKzo6IFNldHMgRVJST1JMRVZFTCB0byAwIGlmIENPTVBJTEVSIGNhbiBiZSBkZXRlcm1pbmVkLAorOjogICAgICAgICAgICAgICAgIHRvIDEgaWYgaXQgY2Fubm90LgorOjoKKworSUYgREVGSU5FRCBDT01QSUxFUiAoCisgIEVDSE8gW3dhcm4gXSB1c2luZyBleGlzdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBDT01QSUxFUgorICBFWElUIC9CIDAKKykKKworSUYgTk9UICIlUFJPRklMRTp+MCw0JSIgPT0gIk1TVkMiICgKKyAgU0VUIENPTVBJTEVSPWdjYworKSBFTFNFICgKKyAgQ0FMTCA6Q0hFQ0sgMTYKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgKFNFVCBDT01QSUxFUj12YzEwMCkKKyAgQ0FMTCA6Q0hFQ0sgMTcKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgKFNFVCBDT01QSUxFUj12YzExMCkKKyAgQ0FMTCA6Q0hFQ0sgMTgKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgKFNFVCBDT01QSUxFUj12YzEyMCkKKyAgQ0FMTCA6Q0hFQ0sgMTkuMAorICBJRiAhRVJST1JMRVZFTCEgPT0gMCAoU0VUIENPTVBJTEVSPXZjMTQwKQorICBDQUxMIDpDSEVDSyAxOS4xCisgIElGICFFUlJPUkxFVkVMISA9PSAwIChTRVQgQ09NUElMRVI9dmMxNDEpCispCisKK0lGIE5PVCBERUZJTkVEIENPTVBJTEVSICgKKyAgRUNITyBbZXJyb3JdIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGNvbXBpbGVyIGVkaXRpb24KKyAgRVhJVCAvQiAxCispCisKK0VDSE8gW2luZm8gXSBkZXRlY3RlZCBjb21waWxlciBlZGl0aW9uICAgICVDT01QSUxFUiUKK0VYSVQgL0IgMAorCis6Q0hFQ0sKK2NsIC8/IDI+JjEgfCBmaW5kc3RyIC9DOiJWZXJzaW9uICUxJSIgPiBudWwKK0VYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2NsX3NldGVudi5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9zZXRlbnYuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMzM2NmQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9jbF9zZXRlbnYuYmF0CkBAIC0wLDAgKzEsMTIxIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPRkYKKworSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDEyIiAoCisgIENBTEwgIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTEuMFxWQ1x2Y3ZhcnNhbGwuYmF0IiAlUExBVEZPUk0lCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDEzIiAoCisgIENBTEwgIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTIuMFxWQ1x2Y3ZhcnNhbGwuYmF0IiAlUExBVEZPUk0lCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDE1IiAoCisgIENBTEwgIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTQuMFxWQ1x2Y3ZhcnNhbGwuYmF0IiAlUExBVEZPUk0lCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDE3IiAoCisgIENBTEwgOlNFVFVQTkVXRVJNU1ZDICAgIHx8IEVYSVQgL0IKKykgRUxTRSBJRiAiJVBST0ZJTEUlIiA9PSAiTUlOR1ciICgKKyAgUkVNIFN1cHBvcnRlZCwgbm90aGluZyBzcGVjaWFsIHRvIGRvIGhlcmUuCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIkNZR1dJTiIgKAorICBSRU0gU3VwcG9ydGVkLCBub3RoaW5nIHNwZWNpYWwgdG8gZG8gaGVyZS4KKykgRUxTRSAoCisgIEVDSE8gVW5zdXBwb3J0ZWQgUFJPRklMRT0lUFJPRklMRSUgb3IgUExBVEZPUk09JVBMQVRGT1JNJQorICBFWElUIC9CIDEKKykKKworQ0FMTCBjbF9zZXRjb21waWxlci5iYXQgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGdlbmVyYXRvci5iYXQgIHx8IEVYSVQgL0IKKworU0VUIEFQUFZFWU9SX1NDUklQVFM9JUFQUFZFWU9SX0JVSUxEX0ZPTERFUiVcYnVpbGRcYXBwdmV5b3IKK1NFVCBCVUlMRERJUj0lQVBQVkVZT1JfQlVJTERfRk9MREVSJVwuLlxidWlsZFwlUFJPRklMRSVcJVBMQVRGT1JNJQorU0VUIElOU1RESVI9JUFQUFZFWU9SX0JVSUxEX0ZPTERFUiVcLi5cYnVpbGRcJVBST0ZJTEUlXCVQTEFURk9STSUKK1NFVCBTUkNESVI9JUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKKworOjogUExBVEZPUk0gaXMgeDY0IG9yIHg4NgorOjogTk9STV9QTEFURk9STSBpcyA2NCBvciAzMgorU0VUIE5PUk1fUExBVEZPUk09JVBMQVRGT1JNOn4tMiwyJQorSUYgIiVOT1JNX1BMQVRGT1JNJSIgPT0gIjg2IiAoU0VUIE5PUk1fUExBVEZPUk09MzIpCisKK0lGICIlUFJPRklMRTp+MCw0JSIgPT0gIk1TVkMiICgKKworICA6OiBGaW5kQm9vc3QgbmVlZHMgZm9yd2FyZCBzbGFzaGVzIHNvIGNtYWtlIGRvZXNuJ3Qgc2VlIHNvbWV0aGluZyBhcyBhbiBlc2NhcGVkIGNoYXJhY3RlcgorICBTRVQgQk9PU1RfUk9PVD1DOi9MaWJyYXJpZXMvYm9vc3RfJUJPT1NUX1ZFUlNJT046Lj1fJQorICBTRVQgQk9PU1RfTElCUkFSWURJUj0hQk9PU1RfUk9PVCEvbGliJU5PUk1fUExBVEZPUk0lLW1zdmMtJUNPTVBJTEVSOn4tMywyJS4lQ09NUElMRVI6fi0xLDElCisgIFNFVCBPUEVOU1NMX1JPT1Q9QzpcT3BlblNTTC1XaW4lTk9STV9QTEFURk9STSUKKyAgU0VUIFdJTjNQPSVBUFBWRVlPUl9CVUlMRF9GT0xERVIlXHRoaXJkcGFydHkKKworICBTRVQgVEhSRUFETU9ERUw9U1RECisKKyAgSUYgIiVQWVRIT05fVkVSU0lPTiUiID09ICIiICgKKyAgICBTRVQgV0lUSF9QWVRIT049T0ZGCisgICkgRUxTRSAoCisgICAgU0VUIFdJVEhfUFlUSE9OPU9OCisgICAgSUYgL2kgIiVQTEFURk9STSUiID09ICJ4NjQiIFNFVCBQVEVYVD0teDY0CisgICAgU0VUIFBBVEg9QzpcUHl0aG9uJVBZVEhPTl9WRVJTSU9OOi49JSFQVEVYVCFcc2NyaXB0cztDOlxQeXRob24lUFlUSE9OX1ZFUlNJT046Lj0lIVBURVhUITshUEFUSCEKKyAgKQorICBJRiAiJUNPTkZJR1VSQVRJT04lIiA9PSAiRGVidWciIChTRVQgWkxJQl9MSUJfU1VGRklYPWQpCisKKyAgSUYgTk9UICIlUVRfVkVSU0lPTiUiID09ICIiICgKKyAgICBJRiAvaSAiJVBMQVRGT1JNJSIgPT0gIng2NCIgU0VUIFFURVhUPV82NAorICAgIFNFVCBQQVRIPUM6XFF0XCVRVF9WRVJTSU9OJVwlUFJPRklMRSUhUVRFWFQhXGJpbjshUEFUSCEKKyAgKQorCispIEVMU0UgSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiTUlORyIgKAorCisgIDo6IFBMQVRGT1JNID0geDg2IG1lYW5zIE1JTkdXUExBVCBpNjg2CisgIDo6IFBMQVRGT1JNID0geDY0IG1lYW5zIE1JTkdXUExBVCB4ODZfNjQKKyAgU0VUIE1JTkdXUExBVD14ODZfNjQKKyAgSUYgIiVQTEFURk9STSUiID09ICJ4ODYiIChTRVQgTUlOR1dQTEFUPWk2ODYpCisKKyAgU0VUIEJBU0g9QzpcbXN5czY0XHVzclxiaW5cYmFzaC5leGUKKyAgIUJBU0ghIC1sYyAic2VkIC1pICcvZXhwb3J0IFBBVEg9XC9taW5ndzMyXC9iaW4vZCcgfi8uYmFzaF9wcm9maWxlICYmIHNlZCAtaSAnL2V4cG9ydCBQQVRIPVwvbWluZ3c2NFwvYmluL2QnIH4vLmJhc2hfcHJvZmlsZSAmJiBlY2hvICdleHBvcnQgUEFUSD0vbWluZ3clTk9STV9QTEFURk9STSUvYmluOiRQQVRIJyA+PiB+Ly5iYXNoX3Byb2ZpbGUiIHx8IEVYSVQgL0IKKworICBTRVQgQlVJTERESVI9JUJVSUxERElSOlw9LyUKKyAgU0VUIEJVSUxERElSPS9jIUJVSUxERElSOn4yIQorICBTRVQgSU5TVERJUj0lSU5TVERJUjpcPS8lCisgIFNFVCBJTlNURElSPS9jIUlOU1RESVI6fjIhCisgIFNFVCBTUkNESVI9JVNSQ0RJUjpcPS8lCisgIFNFVCBTUkNESVI9L2MhU1JDRElSOn4yIQorCispIEVMU0UgSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiQ1lHVyIgKAorCisgIFNFVCBDWUdXSU5ST09UPUM6XGN5Z3dpbgorICBJRiAiJVBMQVRGT1JNJSIgPT0gIng2NCIgKFNFVCBDWUdXSU5ST09UPSFDWUdXSU5ST09UITY0KQorCisgIFNFVCBCQVNIPSFDWUdXSU5ST09UIVxiaW5cYmFzaC5leGUKKyAgU0VUIFNFVFVQPSFDWUdXSU5ST09UIVxzZXR1cC14ODYKKyAgSUYgIiVQTEFURk9STSUiID09ICJ4NjQiIChTRVQgU0VUVVA9IVNFVFVQIV82NCkKKyAgU0VUIFNFVFVQPSFTRVRVUCEuZXhlCisKKyAgU0VUIEJVSUxERElSPSVCVUlMRERJUjpcPS8lCisgIFNFVCBCVUlMRERJUj0vY3lnZHJpdmUvYyFCVUlMRERJUjp+MiEKKyAgU0VUIElOU1RESVI9JUlOU1RESVI6XD0vJQorICBTRVQgSU5TVERJUl9DWUc9L2N5Z2RyaXZlL2MhSU5TVERJUjp+MiEKKyAgU0VUIFNSQ0RJUj0lU1JDRElSOlw9LyUKKyAgU0VUIFNSQ0RJUj0vY3lnZHJpdmUvYyFTUkNESVI6fjIhCisKKykKKworR09UTyA6RU9GCisKKzpTRVRVUE5FV0VSTVNWQworICBGT1IgL0YgIlVTRUJBQ0tRIFRPS0VOUz0qIiAlJWkgSU4gKGBjYWxsICIlUHJvZ3JhbUZpbGVzKHg4NiklXE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvXEluc3RhbGxlclx2c3doZXJlLmV4ZSIgLXZlcnNpb24gIlsxNS4wLDE2LjApIiAtcHJvcGVydHkgaW5zdGFsbGF0aW9uUGF0aGApIERPICgKKyAgICBJRiAiJU1TVkNST09UJSIgPT0gIiIgKFNFVCBNU1ZDUk9PVD0lJWkpCisgICkKKyAgU0VUIE1TVkNQTEFUPXg4NgorICBJRiAiJVBMQVRGT1JNJSIgPT0gIng2NCIgKFNFVCBNU1ZDUExBVD1hbWQ2NCkKKworICBTRVQgQ1VSUkVOVERJUj0lQ0QlCisgIENBTEwgIiFNU1ZDUk9PVCFcQ29tbW9uN1xUb29sc1xWc0RldkNtZC5iYXQiIC1hcmNoPSFNU1ZDUExBVCEgfHwgRVhJVCAvQgorICBDRCAlQ1VSUkVOVERJUiUKKyAgRVhJVCAvQgorCis6RU9GCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9zZXRnZW5lcmF0b3IuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfc2V0Z2VuZXJhdG9yLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWI2ZmYzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfc2V0Z2VuZXJhdG9yLmJhdApAQCAtMCwwICsxLDc5IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OgorOjogRGV0ZWN0IHRoZSBjb21waWxlciBlZGl0aW9uIHdlJ3JlIGJ1aWxkaW5nIGluIGFuZCB0aGVuCis6OiBzZXQgdGhlIEdFTkVSQVRPUiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvbmUgb2Y6Cis6OgorOjogIFZpc3VhbCBTdHVkaW8gMTUgMjAxNyBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDE3IHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDE0IDIwMTUgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxNSBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIkFSTSIuCis6OiAgVmlzdWFsIFN0dWRpbyAxMiAyMDEzIFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTMgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJBUk0iLgorOjogIFZpc3VhbCBTdHVkaW8gMTEgMjAxMiBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDEyIHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDEwIDIwMTAgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxMCBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIklBNjQiLgorOjogIE1pbkdXIE1ha2VmaWxlcyAgICAgICAgICAgICAgPSBHZW5lcmF0ZXMgbWFrZWZpbGVzIGZvciBNaW5HVworOjogIE1TWVMgTWFrZWZpbGVzICAgICAgICAgICAgICAgPSBHZW5lcmF0ZXMgbWFrZWZpbGVzIGZvciBNU1lTCis6OiAgVW5peCBNYWtlZmlsZXMgICAgICAgICAgICAgICA9IEdlbmVyYXRlcyBtYWtlZmlsZXMgZm9yIENZR1dJTgorOjoKKzo6IEhvbm9ycyBhbnkgZXhpc3RpbmcgR0VORVJBVE9SIGVudmlyb25tZW50IHZhcmlhYmxlCis6OiAgIHNldHRpbmcgaW5zdGVhZCBvZiBvdmVyd3JpdGluZyBpdCwgdG8gYWxsb3cgaXQKKzo6ICAgdG8gYmUgZm9yY2VkIGlmIG5lZWRlZC4KKzo6Cis6OiBTZXRzIEVSUk9STEVWRUwgdG8gMCBpZiBHRU5FUkFUT1IgY2FuIGJlIGRldGVybWluZWQsCis6OiAgICAgICAgICAgICAgICAgdG8gMSBpZiBpdCBjYW5ub3QuCis6OgorCitJRiBERUZJTkVEIEdFTkVSQVRPUiAoCisgIEVDSE8gW3dhcm4gXSB1c2luZyBleGlzdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBHRU5FUkFUT1IKKyAgRVhJVCAvQiAwCispCisKKworSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiTUlORyIgKAorICBTRVQgR0VORVJBVE9SPU1pbkdXIE1ha2VmaWxlcworCispIEVMU0UgSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiQ1lHVyIgKAorICBTRVQgR0VORVJBVE9SPVVuaXggTWFrZWZpbGVzCisKKykgRUxTRSBJRiAiJVBST0ZJTEU6fjAsNCUiID09ICJNU1lTIiAoCisgIFNFVCBHRU5FUkFUT1I9TVNZUyBNYWtlZmlsZXMKKykgRUxTRSAoCisgIElGIC9pICIlUExBVEZPUk0lIiA9PSAieDY0IiBTRVQgR0VOQVJDSD0gV2luNjQKKyAgQ0FMTCA6Q0hFQ0sgMTYKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDEwIDIwMTAhR0VOQVJDSCEKKyAgQ0FMTCA6Q0hFQ0sgMTcKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDExIDIwMTIhR0VOQVJDSCEKKyAgQ0FMTCA6Q0hFQ0sgMTgKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDEyIDIwMTMhR0VOQVJDSCEKKyAgQ0FMTCA6Q0hFQ0sgMTkuMAorICBJRiAhRVJST1JMRVZFTCEgPT0gMCBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTQgMjAxNSFHRU5BUkNIIQorICBDQUxMIDpDSEVDSyAxOS4xCisgIElGICFFUlJPUkxFVkVMISA9PSAwIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxNSAyMDE3IUdFTkFSQ0ghCispCisKK0lGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiAoCisgIEVDSE8gW2Vycm9yXSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBDTWFrZSBnZW5lcmF0b3IgdG8gdXNlCisgIEVYSVQgL0IgMQorKQorCitFQ0hPIFtpbmZvIF0gdXNpbmcgQ01ha2UgZ2VuZXJhdG9yICAgICAgICAlR0VORVJBVE9SJQorRVhJVCAvQiAwCisKKzpDSEVDSworY2wgLz8gMj4mMSB8IGZpbmRzdHIgL0M6IlZlcnNpb24gJTElIiA+IG51bAorRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvY2xfc2hvd2Vudi5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9zaG93ZW52LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzBhNDkwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfc2hvd2Vudi5iYXQKQEAgLTAsMCArMSw2MyBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworRUNITy8KK0VDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiTVNWQyIgKAorRUNITyBWZXJzaW9ucworRUNITyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFQ0hPIGJvb3N0ICAgICAgICAgICAgICAgICA9ICVCT09TVF9WRVJTSU9OJQorRUNITyBsaWJldmVudCAgICAgICAgICAgICAgPSAlTElCRVZFTlRfVkVSU0lPTiUKK0VDSE8gcHl0aG9uICAgICAgICAgICAgICAgID0gJVBZVEhPTl9WRVJTSU9OJQorRUNITyBxdCAgICAgICAgICAgICAgICAgICAgPSAlUVRfVkVSU0lPTiUKK0VDSE8gemxpYiAgICAgICAgICAgICAgICAgID0gJVpMSUJfVkVSU0lPTiUKK0VDSE8vCispCitFQ0hPIEFwcHZleW9yIFZhcmlhYmxlcworRUNITyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFQ0hPIEFQUFZFWU9SX0JVSUxEX0ZPTERFUiA9ICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCitFQ0hPIENPTkZJR1VSQVRJT04gICAgICAgICA9ICVDT05GSUdVUkFUSU9OJQorRUNITyBQTEFURk9STSAgICAgICAgICAgICAgPSAlUExBVEZPUk0lCitFQ0hPIFBST0ZJTEUgICAgICAgICAgICAgICA9ICVQUk9GSUxFJQorRUNITy8KK0VDSE8gT3VyIFZhcmlhYmxlcworRUNITyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFQ0hPIEFQUFZFWU9SX1NDUklQVFMgICAgICA9ICVBUFBWRVlPUl9TQ1JJUFRTJQorRUNITyBCQVNIICAgICAgICAgICAgICAgICAgPSAlQkFTSCUKK0VDSE8gQk9PU1RfUk9PVCAgICAgICAgICAgID0gJUJPT1NUX1JPT1QlCitFQ0hPIEJPT1NUX0lOQ0xVREVESVIgICAgICA9ICVCT09TVF9JTkNMVURFRElSJQorRUNITyBCT09TVF9MSUJSQVJZRElSICAgICAgPSAlQk9PU1RfTElCUkFSWURJUiUKK0VDSE8gQlVJTERESVIgICAgICAgICAgICAgID0gJUJVSUxERElSJQorRUNITyBDT01QSUxFUiAgICAgICAgICAgICAgPSAlQ09NUElMRVIlCitFQ0hPIEdFTkVSQVRPUiAgICAgICAgICAgICA9ICVHRU5FUkFUT1IlCitFQ0hPIElOU1RESVIgICAgICAgICAgICAgICA9ICVJTlNURElSJQorRUNITyBKQVZBX0hPTUUgICAgICAgICAgICAgPSAlSkFWQV9IT01FJQorRUNITyBPUEVOU1NMX1JPT1QgICAgICAgICAgPSAlT1BFTlNTTF9ST09UJQorRUNITyBTRVRVUCAgICAgICAgICAgICAgICAgPSAlU0VUVVAlCitFQ0hPIFNSQ0RJUiAgICAgICAgICAgICAgICA9ICVTUkNESVIlCitFQ0hPIFdJTjNQICAgICAgICAgICAgICAgICA9ICVXSU4zUCUKK0VDSE8gV0lUSF9QWVRIT04gICAgICAgICAgID0gJVdJVEhfUFlUSE9OJQorRUNITyBaTElCX1NUQVRJQ19TVUZGSVggICAgPSAlWkxJQl9TVEFUSUNfU1VGRklYJQorSUYgTk9UICIlUFJPRklMRTp+MCw0JSIgPT0gIk1TVkMiICgKKyAgRUNITy8KKyAgRUNITyBVTklYeSBQQVRICisgIEVDSE8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAlQkFTSCUgLWxjICJlY2hvICRQQVRIIgorKQorRUNITy8KK0VDSE8gV2luZG93cyBQQVRICitFQ0hPIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VDSE8gJVBBVEglCitFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0VDSE8vCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9zaW11bGF0ZS1hcHB2ZXlvci5iYXQgYi9idWlsZC9hcHB2ZXlvci9zaW11bGF0ZS1hcHB2ZXlvci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3NGY0MAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL3NpbXVsYXRlLWFwcHZleW9yLmJhdApAQCAtMCwwICsxLDM1IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OgorOjogSGVscHMgYnVpbGQgdGhyaWZ0IGJ5IHByZXRlbmRpbmcgdG8gYmUgYXBwdmV5b3IKKzo6IFVzYWdlOgorOjogICBjZCBidWlsZFxhcHB2ZXlvcgorOjogICBzaW11bGF0ZS1hcHB2ZXlvci5iYXQgW0RlYnVnfFJlbGVhc2VdIFt4ODZ8eDY0XSBbQ1lHV0lOfE1JTkdXfE1TVkMyMDE/XQorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK1NFVCBBUFBWRVlPUl9CVUlMRF9GT0xERVI9JX5kcDAuLlwuLgorU0VUIENPTkZJR1VSQVRJT049JTEKK1NFVCBQTEFURk9STT0lMgorU0VUIFBST0ZJTEU9JTMKKworQ0QgJUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKK0NBTEwgYnVpbGRcYXBwdmV5b3JcJVBST0ZJTEU6fjAsNCUtYXBwdmV5b3ItaW5zdGFsbC5iYXQgfHwgRVhJVCAvQgorQ0QgJUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKK0NBTEwgYnVpbGRcYXBwdmV5b3JcJVBST0ZJTEU6fjAsNCUtYXBwdmV5b3ItYnVpbGQuYmF0ICAgfHwgRVhJVCAvQgorQ0QgJUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKK0NBTEwgYnVpbGRcYXBwdmV5b3JcJVBST0ZJTEU6fjAsNCUtYXBwdmV5b3ItdGVzdC5iYXQKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0NQYWNrQ29uZmlnLmNtYWtlIGIvYnVpbGQvY21ha2UvQ1BhY2tDb25maWcuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjMWI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0NQYWNrQ29uZmlnLmNtYWtlCkBAIC0wLDAgKzEsNjggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKKyNUT0RPOiBTaG91bGQgd2UgYnVuZGxlIHN5c3RlbSBsaWJyYXJpZXMgZm9yIERMTHM/CisjaW5jbHVkZShJbnN0YWxsUmVxdWlyZWRTeXN0ZW1MaWJyYXJpZXMpCisKKyMgRm9yIGhlbHAgdGFrZSBhIGxvb2sgYXQ6CisjIGh0dHA6Ly93d3cuY21ha2Uub3JnL1dpa2kvQ01ha2U6Q1BhY2tDb25maWd1cmF0aW9uCisKKyMjIyBnZW5lcmFsIHNldHRpbmdzCitzZXQoQ1BBQ0tfUEFDS0FHRV9OQU1FICJ0aHJpZnQiKQorc2V0KENQQUNLX1BBQ0tBR0VfVkVSU0lPTiAiJHtQQUNLQUdFX1ZFUlNJT059IikKK3NldChDUEFDS19QQUNLQUdFX0RFU0NSSVBUSU9OX1NVTU1BUlkgIkFwYWNoZSBUaHJpZnQiKQorc2V0KENQQUNLX1BBQ0tBR0VfREVTQ1JJUFRJT05fRklMRSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L1JFQURNRS5tZCIpCitzZXQoQ1BBQ0tfUkVTT1VSQ0VfRklMRV9MSUNFTlNFICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vTElDRU5TRSIpCitzZXQoQ1BBQ0tfUEFDS0FHRV9WRU5ET1IgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIikKK3NldChDUEFDS19QQUNLQUdFX0NPTlRBQ1QgImRldkB0aHJpZnQuYXBhY2hlLm9yZyIpCitzZXQoQ1BBQ0tfUEFDS0FHRV9JTlNUQUxMX0RJUkVDVE9SWSAiJHtDUEFDS19QQUNLQUdFX05BTUV9IikKK3NldChDUEFDS19TWVNURU1fTkFNRSAiJHtDTUFLRV9TWVNURU1fTkFNRX0iKQorCisjIyMgdmVyc2lvbnMKK3NldChDUEFDS19QQUNLQUdFX1ZFUlNJT05fTUFKT1IgJHt0aHJpZnRfVkVSU0lPTl9NQUpPUn0pCitzZXQoQ1BBQ0tfUEFDS0FHRV9WRVJTSU9OX01JTk9SICR7dGhyaWZ0X1ZFUlNJT05fTUlOT1J9KQorc2V0KENQQUNLX1BBQ0tBR0VfVkVSU0lPTl9QQVRDSCAke3RocmlmdF9WRVJTSU9OX1BBVENIfSkKKworIyMjIHNvdXJjZSBnZW5lcmF0b3IKK3NldChDUEFDS19TT1VSQ0VfR0VORVJBVE9SICJUR1oiKQorc2V0KENQQUNLX1NPVVJDRV9JR05PUkVfRklMRVMgIn4kO1suXXN3cCQ7L1suXXN2bi87L1suXWdpdC87LmdpdGlnbm9yZTsvYnVpbGQvO3RhZ3M7Y3Njb3BlLioiKQorc2V0KENQQUNLX1NPVVJDRV9QQUNLQUdFX0ZJTEVfTkFNRSAiJHtDUEFDS19QQUNLQUdFX05BTUV9LSR7Q1BBQ0tfUEFDS0FHRV9WRVJTSU9OfSIpCisKKyMjIyB6aXAgZ2VuZXJhdG9yCitzZXQoQ1BBQ0tfR0VORVJBVE9SICJaSVAiKQorc2V0KENQQUNLX1BBQ0tBR0VfSU5TVEFMTF9ESVJFQ1RPUlkgInRocmlmdCIpCisKKworaWYoQ01BS0VfU1lTVEVNX05BTUUgU1RSRVFVQUwgIldpbmRvd3MiKQorICAgIHNldChDUEFDS19HRU5FUkFUT1IgIk5TSVMiKQorICAgIHNldChDUEFDS19OU0lTX0hFTFBfTElOSyAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIikKKyAgICBzZXQoQ1BBQ0tfTlNJU19NRU5VX0xJTktTCisgICAgICAgICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciICJBcGFjaGUgVGhyaWZ0IC0gV2ViIFNpdGUiCisgICAgICAgICJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCIgIkFwYWNoZSBUaHJpZnQgLSBJc3N1ZXMiKQorICAgIHNldChDUEFDS19OU0lTX0NPTlRBQ1QgJHtDUEFDS19QQUNLQUdFX0NPTlRBQ1R9KQorICAgIHNldChDUEFDS19OU0lTX01PRElGWV9QQVRIICJPTiIpCisgICAgc2V0KENQQUNLX1BBQ0tBR0VfSU5TVEFMTF9ESVJFQ1RPUlkgIiR7Q1BBQ0tfUEFDS0FHRV9OQU1FfSIpCitlbHNlKCkKKyAgICBzZXQoQ1BBQ0tfR0VORVJBVE9SICJERUIiICkKKyAgICBzZXQoQ1BBQ0tfREVCSUFOX1BBQ0tBR0VfTUFJTlRBSU5FUiAke0NQQUNLX1BBQ0tBR0VfQ09OVEFDVH0pCitlbmRpZigpCisKKworaW5jbHVkZShDUGFjaykKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0NvbmZpZ3VyZUNoZWNrcy5jbWFrZSBiL2J1aWxkL2NtYWtlL0NvbmZpZ3VyZUNoZWNrcy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTdiZmUwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvQ29uZmlndXJlQ2hlY2tzLmNtYWtlCkBAIC0wLDAgKzEsNzkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbmNsdWRlKENoZWNrRnVuY3Rpb25FeGlzdHMpCitpbmNsdWRlKENoZWNrSW5jbHVkZUZpbGUpCitpbmNsdWRlKENoZWNrSW5jbHVkZUZpbGVzKQoraW5jbHVkZShDaGVja1N5bWJvbEV4aXN0cykKKworaWYgKEludHR5cGVzX0ZPVU5EKQorICAjIFRoaXMgYWxsb3dzIHRoZSBpbnR0eXBlcy5oIGFuZCBzdGRpbnQuaCBjaGVja3MgdG8gc3VjY2VlZCBvbiBwbGF0Zm9ybXMgdGhhdAorICAjIGRvIG5vdCBuYXRpdmVseSBwcm92aWRlIHRoZXJlLgorICBzZXQgKENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7SU5UVFlQRVNfSU5DTFVERV9ESVJTfSkKK2VuZGlmICgpCisKK2NoZWNrX2luY2x1ZGVfZmlsZShhcnBhL2luZXQuaCBIQVZFX0FSUEFfSU5FVF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKGZjbnRsLmggSEFWRV9GQ05UTF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKGdldG9wdC5oIEhBVkVfR0VUT1BUX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoaW50dHlwZXMuaCBIQVZFX0lOVFRZUEVTX0gpCitjaGVja19pbmNsdWRlX2ZpbGUobmV0ZGIuaCBIQVZFX05FVERCX0gpCitjaGVja19pbmNsdWRlX2ZpbGUobmV0aW5ldC9pbi5oIEhBVkVfTkVUSU5FVF9JTl9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHNpZ25hbC5oIEhBVkVfU0lHTkFMX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3RkaW50LmggSEFWRV9TVERJTlRfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZSh1bmlzdGQuaCBIQVZFX1VOSVNURF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHB0aHJlYWQuaCBIQVZFX1BUSFJFQURfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvaW9jdGwuaCBIQVZFX1NZU19JT0NUTF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9wYXJhbS5oIEhBVkVfU1lTX1BBUkFNX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3Jlc291cmNlLmggSEFWRV9TWVNfUkVTT1VSQ0VfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvc29ja2V0LmggSEFWRV9TWVNfU09DS0VUX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3N0YXQuaCBIQVZFX1NZU19TVEFUX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3RpbWUuaCBIQVZFX1NZU19USU1FX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3VuLmggSEFWRV9TWVNfVU5fSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShwb2xsLmggSEFWRV9QT0xMX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3BvbGwuaCBIQVZFX1NZU19QT0xMX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3NlbGVjdC5oIEhBVkVfU1lTX1NFTEVDVF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHNjaGVkLmggSEFWRV9TQ0hFRF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN0cmluZy5oIEhBVkVfU1RSSU5HX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3RyaW5ncy5oIEhBVkVfU1RSSU5HU19IKQorCitjaGVja19mdW5jdGlvbl9leGlzdHMoZ2V0aG9zdGJ5bmFtZSBIQVZFX0dFVEhPU1RCWU5BTUUpCitjaGVja19mdW5jdGlvbl9leGlzdHMoZ2V0aG9zdGJ5bmFtZV9yIEhBVkVfR0VUSE9TVEJZTkFNRV9SKQorY2hlY2tfZnVuY3Rpb25fZXhpc3RzKHN0cmVycm9yX3IgSEFWRV9TVFJFUlJPUl9SKQorY2hlY2tfZnVuY3Rpb25fZXhpc3RzKHNjaGVkX2dldF9wcmlvcml0eV9tYXggSEFWRV9TQ0hFRF9HRVRfUFJJT1JJVFlfTUFYKQorY2hlY2tfZnVuY3Rpb25fZXhpc3RzKHNjaGVkX2dldF9wcmlvcml0eV9taW4gSEFWRV9TQ0hFRF9HRVRfUFJJT1JJVFlfTUlOKQorCitpbmNsdWRlKENoZWNrQ1NvdXJjZUNvbXBpbGVzKQoraW5jbHVkZShDaGVja0NYWFNvdXJjZUNvbXBpbGVzKQorCitjaGVja19jeHhfc291cmNlX2NvbXBpbGVzKAorICAiCisgICNpbmNsdWRlIDxzdHJpbmcuaD4KKyAgaW50IG1haW4oKXtjaGFyIGI7Y2hhciAqYSA9IHN0cmVycm9yX3IoMCwgJmIsIDApOyByZXR1cm4oMCk7fQorICAiCisgIFNUUkVSUk9SX1JfQ0hBUl9QKQorCisKK3NldChQQUNLQUdFICR7UEFDS0FHRV9OQU1FfSkKK3NldChQQUNLQUdFX1NUUklORyAiJHtQQUNLQUdFX05BTUV9ICR7UEFDS0FHRV9WRVJTSU9OfSIpCitzZXQoVkVSU0lPTiAke3RocmlmdF9WRVJTSU9OfSkKKworIyBnZW5lcmF0ZSBhIGNvbmZpZy5oIGZpbGUKK2NvbmZpZ3VyZV9maWxlKCIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vYnVpbGQvY21ha2UvY29uZmlnLmguaW4iICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L2NvbmZpZy5oIikKKworaW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IikKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0RlZmluZUNNYWtlRGVmYXVsdHMuY21ha2UgYi9idWlsZC9jbWFrZS9EZWZpbmVDTWFrZURlZmF1bHRzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMjU1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9EZWZpbmVDTWFrZURlZmF1bHRzLmNtYWtlCkBAIC0wLDAgKzEsOTAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKKyMgQWx3YXlzIGluY2x1ZGUgc3JjZGlyIGFuZCBidWlsZGRpciBpbiBpbmNsdWRlIHBhdGgKKyMgVGhpcyBzYXZlcyB0eXBpbmcgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUll9IGluCisjIGFib3V0IGV2ZXJ5IHN1YmRpcgorIyBzaW5jZSBjbWFrZSAyLjQuMAorc2V0KENNQUtFX0lOQ0xVREVfQ1VSUkVOVF9ESVIgT04pCisKKyMgUHV0IHRoZSBpbmNsdWRlIGRpcnMgd2hpY2ggYXJlIGluIHRoZSBzb3VyY2Ugb3IgYnVpbGQgdHJlZQorIyBiZWZvcmUgYWxsIG90aGVyIGluY2x1ZGUgZGlycywgc28gdGhlIGhlYWRlcnMgaW4gdGhlIHNvdXJjZXMKKyMgYXJlIHByZWZlcnJlZCBvdmVyIHRoZSBhbHJlYWR5IGluc3RhbGxlZCBvbmVzCisjIHNpbmNlIGNtYWtlIDIuNC4xCitzZXQoQ01BS0VfSU5DTFVERV9ESVJFQ1RPUklFU19QUk9KRUNUX0JFRk9SRSBPTikKKworIyBVc2UgY29sb3JlZCBvdXRwdXQKKyMgc2luY2UgY21ha2UgMi40LjAKK3NldChDTUFLRV9DT0xPUl9NQUtFRklMRSBPTikKKworIyBEZWZpbmUgdGhlIGdlbmVyaWMgdmVyc2lvbiBvZiB0aGUgbGlicmFyaWVzIGhlcmUKK3NldChHRU5FUklDX0xJQl9WRVJTSU9OICIxLjAuMCIpCitzZXQoR0VORVJJQ19MSUJfU09WRVJTSU9OICIwIikKKworIyBTZXQgdGhlIGRlZmF1bHQgYnVpbGQgdHlwZSB0byByZWxlYXNlIHdpdGggZGVidWcgaW5mbworaWYgKE5PVCBDTUFLRV9CVUlMRF9UWVBFKQorICBzZXQoQ01BS0VfQlVJTERfVFlQRSBSZWxXaXRoRGViSW5mbworICAgIENBQ0hFIFNUUklORworICAgICAgIkNob29zZSB0aGUgdHlwZSBvZiBidWlsZCwgb3B0aW9ucyBhcmU6IE5vbmUgRGVidWcgUmVsZWFzZSBSZWxXaXRoRGViSW5mbyBNaW5TaXplUmVsLiIKKyAgKQorZW5kaWYgKE5PVCBDTUFLRV9CVUlMRF9UWVBFKQorCisjIENyZWF0ZSB0aGUgY29tcGlsZSBjb21tYW5kIGRhdGFiYXNlIGZvciBjbGFuZyBieSBkZWZhdWx0CitzZXQoQ01BS0VfRVhQT1JUX0NPTVBJTEVfQ09NTUFORFMgT04pCisKKyMgUHV0IHRoZSBsaWJyYXJpZXMgYW5kIGJpbmFyaWVzIHRoYXQgZ2V0IGJ1aWx0IGludG8gZGlyZWN0b3JpZXMgYXQgdGhlCisjIHRvcCBvZiB0aGUgYnVpbGQgdHJlZSByYXRoZXIgdGhhbiBpbiBoYXJkLXRvLWZpbmQgbGVhZgorIyBkaXJlY3Rvcmllcy4gVGhpcyBzaW1wbGlmaWVzIG1hbnVhbCB0ZXN0aW5nIGFuZCB0aGUgdXNlIG9mIHRoZSBidWlsZAorIyB0cmVlIHJhdGhlciB0aGFuIGluc3RhbGxlZCB0aHJpZnQgbGlicmFyaWVzLgorc2V0KENNQUtFX0xJQlJBUllfT1VUUFVUX0RJUkVDVE9SWSAke0NNQUtFX0JJTkFSWV9ESVJ9L2xpYikKK3NldChDTUFLRV9BUkNISVZFX09VVFBVVF9ESVJFQ1RPUlkgJHtDTUFLRV9CSU5BUllfRElSfS9saWIpCitzZXQoQ01BS0VfUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZICR7Q01BS0VfQklOQVJZX0RJUn0vYmluKQorCisjCisjICJycGF0aCIgc3VwcG9ydC4KKyMgU2VlIGh0dHA6Ly93d3cuaXRrLm9yZy9XaWtpL2luZGV4LnBocD90aXRsZT1DTWFrZV9SUEFUSF9oYW5kbGluZworIworIyBPbiBNYWNPU1gsIGZvciBzaGFyZWQgbGlicmFyaWVzLCBlbmFibGUgcnBhdGggc3VwcG9ydC4KK3NldChDTUFLRV9NQUNPU1hfUlBBVEggVFJVRSkKKyMKKyMgT24gYW55IE9TLCBmb3IgZXhlY3V0YWJsZXMsIGFsbG93IGxpbmtpbmcgd2l0aCBzaGFyZWQgbGlicmFyaWVzIGluIG5vbi1zeXN0ZW0KKyMgbG9jYXRpb25zIGFuZCBydW5uaW5nIHRoZSBleGVjdXRhYmxlcyB3aXRob3V0IExEX1BSRUxPQUQgb3Igc2ltaWxhci4KKyMgVGhpcyByZXF1aXJlcyB0aGUgbGlicmFyeSB0byBiZSBidWlsdCB3aXRoIHJwYXRoIHN1cHBvcnQuCitzZXQoQ01BS0VfSU5TVEFMTF9SUEFUSF9VU0VfTElOS19QQVRIIFRSVUUpCisKKyMKKyMgQysrIExhbmd1YWdlIExldmVsIERlZmF1bHRzIC0gdGhpcyBkZXBlbmRzIG9uIHRoZSBjb21waWxlciBjYXBhYmlsaXRpZXMKKyMKK2lmIChOT1QgREVGSU5FRCBDTUFLRV9DWFhfU1RBTkRBUkQpCisgIHNldChDTUFLRV9DWFhfU1RBTkRBUkQgMTEpICMgQysrMTEKKyAgbWVzc2FnZShTVEFUVVMgIlNldHRpbmcgQysrMTEgYXMgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgbGV2ZWwuIikKKyAgbWVzc2FnZShTVEFUVVMgIlRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgQysrIGxhbmd1YWdlIGxldmVsLCBzZXQgQ01BS0VfQ1hYX1NUQU5EQVJEIikKK2VuZGlmKCkKKworaWYgKENNQUtFX0NYWF9TVEFOREFSRCBFUVVBTCA5OCkKKyAgbWVzc2FnZShGQVRBTF9FUlJPUiAib25seSBDKysxMSBvciBhYm92ZSBDKysgc3RhbmRhcmQgaXMgc3VwcG9ydGVkIikKK2Vsc2VpZiAoQ01BS0VfQ1hYX1NUQU5EQVJEIEVRVUFMIDExKQorICAjIHNob3VsZCBub3QgZmFsbGJhY2sgdG8gQysrOTgKKyAgc2V0KENNQUtFX0NYWF9TVEFOREFSRF9SRVFVSVJFRCBPTikKK2VuZGlmKCkKKworaWYgKE5PVCBERUZJTkVEIENNQUtFX0NYWF9FWFRFTlNJT05TKQorICBzZXQoQ01BS0VfQ1hYX0VYVEVOU0lPTlMgT0ZGKSAgICAgICAgIyB1c2Ugc3RhbmRhcmRzIGNvbXBsaWFudCBsYW5ndWFnZSBsZXZlbCBmb3IgcG9ydGFiaWxpdHkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0RlZmluZUluc3RhbGxhdGlvblBhdGhzLmNtYWtlIGIvYnVpbGQvY21ha2UvRGVmaW5lSW5zdGFsbGF0aW9uUGF0aHMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIyZjBmNgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0RlZmluZUluc3RhbGxhdGlvblBhdGhzLmNtYWtlCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKKyMgRGVmaW5lIHRoZSBkZWZhdWx0IGluc3RhbGwgcGF0aHMKK3NldChCSU5fSU5TVEFMTF9ESVIgImJpbiIgQ0FDSEUgUEFUSCAiVGhlIGJpbmFyeSBpbnN0YWxsIGRpciAoZGVmYXVsdDogYmluKSIpCitzZXQoTElCX0lOU1RBTExfRElSICJsaWIke0xJQl9TVUZGSVh9IiBDQUNIRSBQQVRIICJUaGUgbGlicmFyeSBpbnN0YWxsIGRpciAoZGVmYXVsdDogbGliJHtMSUJfU1VGRklYfSkiKQorc2V0KElOQ0xVREVfSU5TVEFMTF9ESVIgImluY2x1ZGUiIENBQ0hFIFBBVEggIlRoZSBsaWJyYXJ5IGluc3RhbGwgZGlyIChkZWZhdWx0OiBpbmNsdWRlKSIpCitzZXQoQ01BS0VfSU5TVEFMTF9ESVIgImNtYWtlIiBDQUNIRSBQQVRIICJUaGUgc3ViZGlyZWN0b3J5IHRvIGluc3RhbGwgY21ha2UgY29uZmlnIGZpbGVzIChkZWZhdWx0OiBjbWFrZSkiKQorc2V0KERPQ19JTlNUQUxMX0RJUiAic2hhcmUvZG9jIiBDQUNIRSBQQVRIICJUaGUgc3ViZGlyZWN0b3J5IHRvIGluc3RhbGwgZG9jdW1lbnRhdGlvbiBmaWxlcyAoZGVmYXVsdDogc2hhcmUvZG9jKSIpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9EZWZpbmVPcHRpb25zLmNtYWtlIGIvYnVpbGQvY21ha2UvRGVmaW5lT3B0aW9ucy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWZmNTNjCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRGVmaW5lT3B0aW9ucy5jbWFrZQpAQCAtMCwwICsxLDIwNCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworaW5jbHVkZShDTWFrZURlcGVuZGVudE9wdGlvbikKKworc2V0KFRIUklGVF9DT01QSUxFUiAiIiBDQUNIRSBGSUxFUEFUSCAiRXh0ZXJuYWwgVGhyaWZ0IGNvbXBpbGVyIHRvIHVzZSBkdXJpbmcgYnVpbGQiKQorCisjIEFkZGl0aW9uYWwgY29tcG9uZW50cworb3B0aW9uKEJVSUxEX0NPTVBJTEVSICJCdWlsZCBUaHJpZnQgY29tcGlsZXIiIE9OKQorCitpZihCVUlMRF9DT01QSUxFUiBPUiBFWElTVFMgJHtUSFJJRlRfQ09NUElMRVJ9KQorICAgIHNldChIQVZFX0NPTVBJTEVSIE9OKQorZW5kaWYoKQorQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9URVNUSU5HICJCdWlsZCB3aXRoIHVuaXQgdGVzdHMiIE9OICJIQVZFX0NPTVBJTEVSIiBPRkYpCitDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEJVSUxEX0VYQU1QTEVTICJCdWlsZCBleGFtcGxlcyIgT04gIkhBVkVfQ09NUElMRVIiIE9GRikKK0NNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfVFVUT1JJQUxTICJCdWlsZCBUaHJpZnQgdHV0b3JpYWxzIiBPTiAiSEFWRV9DT01QSUxFUiIgT0ZGKQorb3B0aW9uKEJVSUxEX0xJQlJBUklFUyAiQnVpbGQgVGhyaWZ0IGxpYnJhcmllcyIgT04pCisKKyMgTGlicmFyaWVzIHRvIGJ1aWxkCisKKyMgRWFjaCBsYW5ndWFnZSBsaWJyYXJ5IGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkIHVzaW5nIHRoZSBXSVRIXzxMQU5HPiBmbGFnLgorIyBCeSBkZWZhdWx0IENNYWtlIGNoZWNrcyBpZiB0aGUgcmVxdWlyZWQgZGVwZW5kZW5jaWVzIGZvciBhIGxhbmd1YWdlIGFyZSBwcmVzZW50CisjIGFuZCBlbmFibGVzIHRoZSBsaWJyYXJ5IGlmIGFsbCBhcmUgZm91bmQuIFRoaXMgbWVhbnMgdGhlIGRlZmF1bHQgaXMgdG8gYnVpbGQgYXMKKyMgbXVjaCBhcyBwb3NzaWJsZSBidXQgbGVhdmluZyBvdXQgbGlicmFyaWVzIGlmIHRoZWlyIGRlcGVuZGVuY2llcyBhcmUgbm90IG1ldC4KKworb3B0aW9uKFdJVEhfQk9PU1RfU1RBVElDICJCdWlsZCB3aXRoIEJvb3N0IHN0YXRpYyBsaW5rIGxpYnJhcnkiIE9GRikKK3NldChCb29zdF9VU0VfU1RBVElDX0xJQlMgJHtXSVRIX0JPT1NUX1NUQVRJQ30pCitpZiAoTk9UIFdJVEhfQk9PU1RfU1RBVElDKQorICAgIGFkZF9kZWZpbml0aW9ucygtREJPT1NUX0FMTF9EWU5fTElOSykKKyAgICBhZGRfZGVmaW5pdGlvbnMoLURCT09TVF9URVNUX0RZTl9MSU5LKQorZW5kaWYoKQorCisjIEMrKworb3B0aW9uKFdJVEhfQ1BQICJCdWlsZCBDKysgVGhyaWZ0IGxpYnJhcnkiIE9OKQoraWYoV0lUSF9DUFApCisgICAgZmluZF9wYWNrYWdlKEJvb3N0IDEuNTMgUVVJRVQpCisgICAgIyBOT1RFOiBDdXJyZW50bHkgdGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBDKysgc3BlY2lmaWMsCisgICAgIyBidXQgaW4gZnV0dXJlIG90aGVyIGxpYnJhcmllcyBtaWdodCByZXVzZSB0aGVtLgorICAgICMgU28gdGhleSBhcmUgbm90IGRlcGVuZGVudCBvbiBXSVRIX0NQUCBidXQgc2V0dGluZyB0aGVtIHdpdGhvdXQgV0lUSF9DUFAgY3VycmVudGx5CisgICAgIyBoYXMgbm8gZWZmZWN0LgorICAgIGlmKFpMSUJfTElCUkFSWSkKKyAgICAgICAgIyBGaW5kWkxJQi5jbWFrZSBkb2VzIG5vdCBub3JtYWxpemUgcGF0aCBzbyB3ZSBuZWVkIHRvIGRvIGl0IG91cnNlbHZlcy4KKyAgICAgICAgZmlsZShUT19DTUFLRV9QQVRIICR7WkxJQl9MSUJSQVJZfSBaTElCX0xJQlJBUlkpCisgICAgZW5kaWYoKQorICAgIGZpbmRfcGFja2FnZShaTElCIFFVSUVUKQorICAgIENNQUtFX0RFUEVOREVOVF9PUFRJT04oV0lUSF9aTElCICJCdWlsZCB3aXRoIFpMSUIgc3VwcG9ydCIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJaTElCX0ZPVU5EIiBPRkYpCisgICAgZmluZF9wYWNrYWdlKExpYmV2ZW50IFFVSUVUKQorICAgIENNQUtFX0RFUEVOREVOVF9PUFRJT04oV0lUSF9MSUJFVkVOVCAiQnVpbGQgd2l0aCBsaWJldmVudCBzdXBwb3J0IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpYmV2ZW50X0ZPVU5EIiBPRkYpCisgICAgZmluZF9wYWNrYWdlKFF0NCBRVUlFVCBDT01QT05FTlRTIFF0Q29yZSBRdE5ldHdvcmspCisgICAgQ01BS0VfREVQRU5ERU5UX09QVElPTihXSVRIX1FUNCAiQnVpbGQgd2l0aCBRdDQgc3VwcG9ydCIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJRVDRfRk9VTkQiIE9GRikKKyAgICBmaW5kX3BhY2thZ2UoUXQ1IFFVSUVUIENPTVBPTkVOVFMgQ29yZSBOZXR3b3JrKQorICAgIENNQUtFX0RFUEVOREVOVF9PUFRJT04oV0lUSF9RVDUgIkJ1aWxkIHdpdGggUXQ1IHN1cHBvcnQiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiUXQ1X0ZPVU5EIiBPRkYpCisgICAgaWYoJHtXSVRIX1FUNH0gQU5EICR7V0lUSF9RVDV9IEFORCAke0NNQUtFX01BSk9SX1ZFUlNJT059IExFU1MgMykKKyAgICAgICMgY21ha2UgPCAzLjAuMCBjYXVzZXMgY29uZmxpY3Qgd2hlbiBidWlsZGluZyBib3RoIFF0NCBhbmQgUXQ1CisgICAgICBzZXQoV0lUSF9RVDQgT0ZGKQorICAgIGVuZGlmKCkKKyAgICBmaW5kX3BhY2thZ2UoT3BlblNTTCBRVUlFVCkKKyAgICBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKFdJVEhfT1BFTlNTTCAiQnVpbGQgd2l0aCBPcGVuU1NMIHN1cHBvcnQiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiT1BFTlNTTF9GT1VORCIgT0ZGKQorICAgIG9wdGlvbihXSVRIX1NURFRIUkVBRFMgIkJ1aWxkIHdpdGggQysrIHN0ZDo6dGhyZWFkIHN1cHBvcnQiIE9OKQorZW5kaWYoKQorQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9DUFAgIkJ1aWxkIEMrKyBsaWJyYXJ5IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAiQlVJTERfTElCUkFSSUVTO1dJVEhfQ1BQO0Jvb3N0X0ZPVU5EIiBPRkYpCitDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKFdJVEhfUExVR0lOICJCdWlsZCBjb21waWxlciBwbHVnaW4gc3VwcG9ydCIgT0ZGCisgICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9DT01QSUxFUjtCVUlMRF9DUFAiIE9GRikKKworIyBDIEdMaWIKK29wdGlvbihXSVRIX0NfR0xJQiAiQnVpbGQgQyAoR0xpYikgVGhyaWZ0IGxpYnJhcnkiIE9OKQoraWYoV0lUSF9DX0dMSUIpCisgICAgZmluZF9wYWNrYWdlKEdMSUIgUVVJRVQgQ09NUE9ORU5UUyBnb2JqZWN0KQorZW5kaWYoKQorQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9DX0dMSUIgIkJ1aWxkIEMgKEdMaWIpIGxpYnJhcnkiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9MSUJSQVJJRVM7V0lUSF9DX0dMSUI7R0xJQl9GT1VORCIgT0ZGKQorCitpZihCVUlMRF9DUFApCisgICAgc2V0KGJvb3N0X2NvbXBvbmVudHMpCisgICAgaWYoQlVJTERfVEVTVElORykKKyAgICAgICAgbGlzdChBUFBFTkQgYm9vc3RfY29tcG9uZW50cyBzeXN0ZW0gdGhyZWFkKQorICAgIGVuZGlmKCkKKyAgICBpZihCVUlMRF9URVNUSU5HKQorICAgICAgICBsaXN0KEFQUEVORCBib29zdF9jb21wb25lbnRzIHVuaXRfdGVzdF9mcmFtZXdvcmsgZmlsZXN5c3RlbSBjaHJvbm8gcHJvZ3JhbV9vcHRpb25zKQorICAgIGVuZGlmKCkKKyAgICBpZihib29zdF9jb21wb25lbnRzKQorICAgICAgICBmaW5kX3BhY2thZ2UoQm9vc3QgMS41MyBSRVFVSVJFRCBDT01QT05FTlRTICR7Ym9vc3RfY29tcG9uZW50c30pCisgICAgZW5kaWYoKQorZWxzZWlmKEJVSUxEX0NfR0xJQiBBTkQgQlVJTERfVEVTVElORykKKyAgICBmaW5kX3BhY2thZ2UoQm9vc3QgMS41MyBSRVFVSVJFRCkKK2VuZGlmKCkKKworIyBKYXZhCitvcHRpb24oV0lUSF9KQVZBICJCdWlsZCBKYXZhIFRocmlmdCBsaWJyYXJ5IiBPTikKK2lmKEFORFJPSUQpCisgICAgZmluZF9wYWNrYWdlKEdyYWRsZSBRVUlFVCkKKyAgICBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEJVSUxEX0pBVkEgIkJ1aWxkIEphdmEgbGlicmFyeSIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9MSUJSQVJJRVM7V0lUSF9KQVZBO0dSQURMRV9GT1VORCIgT0ZGKQorZWxzZSgpCisgICAgZmluZF9wYWNrYWdlKEdyYWRsZXcgUVVJRVQpCisgICAgZmluZF9wYWNrYWdlKEphdmEgUVVJRVQpCisgICAgQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9KQVZBICJCdWlsZCBKYXZhIGxpYnJhcnkiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlVJTERfTElCUkFSSUVTO1dJVEhfSkFWQTtKQVZBX0ZPVU5EO0dSQURMRVdfRk9VTkQiIE9GRikKK2VuZGlmKCkKKworIyBQeXRob24KK29wdGlvbihXSVRIX1BZVEhPTiAiQnVpbGQgUHl0aG9uIFRocmlmdCBsaWJyYXJ5IiBPTikKK2ZpbmRfcGFja2FnZShQeXRob25JbnRlcnAgUVVJRVQpICMgZm9yIFB5dGhvbiBleGVjdXRhYmxlCitmaW5kX3BhY2thZ2UoUHl0aG9uTGlicyBRVUlFVCkgIyBmb3IgUHl0aG9uLmgKK0NNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfUFlUSE9OICJCdWlsZCBQeXRob24gbGlicmFyeSIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgIkJVSUxEX0xJQlJBUklFUztXSVRIX1BZVEhPTjtQWVRIT05MSUJTX0ZPVU5EIiBPRkYpCisKKyMgSGFza2VsbAorb3B0aW9uKFdJVEhfSEFTS0VMTCAiQnVpbGQgSGFza2VsbCBUaHJpZnQgbGlicmFyeSIgT04pCitmaW5kX3BhY2thZ2UoR0hDIFFVSUVUKQorZmluZF9wYWNrYWdlKENhYmFsIFFVSUVUKQorQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9IQVNLRUxMICJCdWlsZCBHSEMgbGlicmFyeSIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgIkJVSUxEX0xJQlJBUklFUztXSVRIX0hBU0tFTEw7R0hDX0ZPVU5EO0NBQkFMX0ZPVU5EIiBPRkYpCisKKyMgQ29tbW9uIGxpYnJhcnkgb3B0aW9ucworb3B0aW9uKFdJVEhfU0hBUkVEX0xJQiAiQnVpbGQgc2hhcmVkIGxpYnJhcmllcyIgT04pCitvcHRpb24oV0lUSF9TVEFUSUNfTElCICJCdWlsZCBzdGF0aWMgbGlicmFyaWVzIiBPTikKK2lmIChOT1QgV0lUSF9TSEFSRURfTElCIEFORCBOT1QgV0lUSF9TVEFUSUNfTElCKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkNhbm5vdCBidWlsZCB3aXRoIGJvdGggc2hhcmVkIGFuZCBzdGF0aWMgb3V0cHV0cyBkaXNhYmxlZCEiKQorZW5kaWYoKQorCisjTk9URTogQysrIGNvbXBpbGVyIG9wdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGxpYi9jcHAvQ01ha2VMaXN0cy50eHQKKworIyBWaXN1YWwgU3R1ZGlvIG9ubHkgb3B0aW9ucworaWYoTVNWQykKK29wdGlvbihXSVRIX01UICJCdWlsZCB1c2luZyBNVCBpbnN0ZWFkIG9mIE1EIChNU1ZDIG9ubHkpIiBPRkYpCitlbmRpZihNU1ZDKQorCittYWNybyhNRVNTQUdFX0RFUCBmbGFnIHN1bW1hcnkpCitpZihOT1QgJHtmbGFnfSkKKyAgbWVzc2FnZShTVEFUVVMgIiAgIC0gJHtzdW1tYXJ5fSIpCitlbmRpZigpCitlbmRtYWNybyhNRVNTQUdFX0RFUCBmbGFnIHN1bW1hcnkpCisKK21hY3JvKFBSSU5UX0NPTkZJR19TVU1NQVJZKQorbWVzc2FnZShTVEFUVVMgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKQorbWVzc2FnZShTVEFUVVMgIlRocmlmdCB2ZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3RocmlmdF9WRVJTSU9OfSAoJHt0aHJpZnRfVkVSU0lPTl9NQUpPUn0uJHt0aHJpZnRfVkVSU0lPTl9NSU5PUn0uJHt0aHJpZnRfVkVSU0lPTl9QQVRDSH0pIikKK21lc3NhZ2UoU1RBVFVTICJUaHJpZnQgcGFja2FnZSB2ZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgJHtQQUNLQUdFX1ZFUlNJT059IikKK21lc3NhZ2UoU1RBVFVTICJCdWlsZCBjb25maWd1cmF0aW9uIFN1bW1hcnkiKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgVGhyaWZ0IGNvbXBpbGVyOiAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0NPTVBJTEVSfSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBjb21waWxlciBwbHVnaW4gc3VwcG9ydDogICAgICAgICAgICAgICR7V0lUSF9QTFVHSU59IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggdW5pdCB0ZXN0czogICAgICAgICAgICAgICAgICAgICAgJHtCVUlMRF9URVNUSU5HfSIpCitNRVNTQUdFX0RFUChIQVZFX0NPTVBJTEVSICJEaXNhYmxlZCBiZWNhdXNlIEJVSUxEX1RIUklGVD1PRkYgYW5kIG5vIHZhbGlkIFRIUklGVF9DT01QSUxFUiBpcyBnaXZlbiIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBleGFtcGxlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfRVhBTVBMRVN9IikKK01FU1NBR0VfREVQKEhBVkVfQ09NUElMRVIgIkRpc2FibGVkIGJlY2F1c2UgQlVJTERfVEhSSUZUPU9GRiBhbmQgbm8gdmFsaWQgVEhSSUZUX0NPTVBJTEVSIGlzIGdpdmVuIikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIFRocmlmdCBsaWJyYXJpZXM6ICAgICAgICAgICAgICAgICAgICAgJHtCVUlMRF9MSUJSQVJJRVN9IikKK21lc3NhZ2UoU1RBVFVTICIgTGFuZ3VhZ2UgbGlicmFyaWVzOiIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBDKysgbGlicmFyeTogICAgICAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfQ1BQfSIpCitNRVNTQUdFX0RFUChXSVRIX0NQUCAiRGlzYWJsZWQgYnkgV0lUSF9DUFA9T0ZGIikKK01FU1NBR0VfREVQKEJvb3N0X0ZPVU5EICJCb29zdCBoZWFkZXJzIG1pc3NpbmciKQorbWVzc2FnZShTVEFUVVMgIiAgICBDKysgTGFuZ3VhZ2UgTGV2ZWw6ICAgICAgICAgICAgICAgICAgICAgICAke0NYWF9MQU5HVUFHRV9MRVZFTH0iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgQyAoR0xpYikgbGlicmFyeTogICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0NfR0xJQn0iKQorTUVTU0FHRV9ERVAoV0lUSF9DX0dMSUIgIkRpc2FibGVkIGJ5IFdJVEhfQ19HTElCPU9GRiIpCitNRVNTQUdFX0RFUChHTElCX0ZPVU5EICJHTGliIG1pc3NpbmciKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgSmF2YSBsaWJyYXJ5OiAgICAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0pBVkF9IikKK01FU1NBR0VfREVQKFdJVEhfSkFWQSAiRGlzYWJsZWQgYnkgV0lUSF9KQVZBPU9GRiIpCitpZihBTkRST0lEKQorICAgIE1FU1NBR0VfREVQKEdSQURMRV9GT1VORCAiR3JhZGxlIG1pc3NpbmciKQorZWxzZSgpCisgICAgTUVTU0FHRV9ERVAoSkFWQV9GT1VORCAiSmF2YSBSdW50aW1lIG1pc3NpbmciKQorICAgIE1FU1NBR0VfREVQKEdSQURMRVdfRk9VTkQgIkdyYWRsZSBXcmFwcGVyIG1pc3NpbmciKQorZW5kaWYoKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgUHl0aG9uIGxpYnJhcnk6ICAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX1BZVEhPTn0iKQorTUVTU0FHRV9ERVAoV0lUSF9QWVRIT04gIkRpc2FibGVkIGJ5IFdJVEhfUFlUSE9OPU9GRiIpCitNRVNTQUdFX0RFUChQWVRIT05MSUJTX0ZPVU5EICJQeXRob24gbGlicmFyaWVzIG1pc3NpbmciKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgSGFza2VsbCBsaWJyYXJ5OiAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0hBU0tFTEx9IikKK01FU1NBR0VfREVQKFdJVEhfSEFTS0VMTCAiRGlzYWJsZWQgYnkgV0lUSF9IQVNLRUxMPU9GRiIpCitNRVNTQUdFX0RFUChHSENfRk9VTkQgIkdIQyBtaXNzaW5nIikKK01FU1NBR0VfREVQKENBQkFMX0ZPVU5EICJDYWJhbCBtaXNzaW5nIikKK21lc3NhZ2UoU1RBVFVTICIgTGlicmFyeSBmZWF0dXJlczoiKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgc2hhcmVkIGxpYnJhcmllczogICAgICAgICAgICAgICAgICAgICAke1dJVEhfU0hBUkVEX0xJQn0iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgc3RhdGljIGxpYnJhcmllczogICAgICAgICAgICAgICAgICAgICAke1dJVEhfU1RBVElDX0xJQn0iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBCb29zdCBzdGF0aWMgbGluayBsaWJyYXJ5OiAgICAgICAke1dJVEhfQk9PU1RfU1RBVElDfSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIEMrKyBzdGQ6OnRocmVhZCBzdXBwb3J0OiAgICAgICAgICR7V0lUSF9TVERUSFJFQURTfSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIGxpYmV2ZW50IHN1cHBvcnQ6ICAgICAgICAgICAgICAgICR7V0lUSF9MSUJFVkVOVH0iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBPcGVuU1NMIHN1cHBvcnQ6ICAgICAgICAgICAgICAgICAke1dJVEhfT1BFTlNTTH0iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBRdDQgc3VwcG9ydDogICAgICAgICAgICAgICAgICAgICAke1dJVEhfUVQ0fSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIFF0NSBzdXBwb3J0OiAgICAgICAgICAgICAgICAgICAgICR7V0lUSF9RVDV9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggWkxJQiBzdXBwb3J0OiAgICAgICAgICAgICAgICAgICAgJHtXSVRIX1pMSUJ9IikKK21lc3NhZ2UoU1RBVFVTICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIikKK2VuZG1hY3JvKFBSSU5UX0NPTkZJR19TVU1NQVJZKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRGVmaW5lUGxhdGZvcm1TcGVjaWZjLmNtYWtlIGIvYnVpbGQvY21ha2UvRGVmaW5lUGxhdGZvcm1TcGVjaWZjLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMTEyYjYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9EZWZpbmVQbGF0Zm9ybVNwZWNpZmMuY21ha2UKQEAgLTAsMCArMSwxMTggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIFVuY29tbWVudCB0aGlzIHRvIHNob3cgc29tZSBiYXNpYyBjbWFrZSB2YXJpYWJsZXMgYWJvdXQgcGxhdGZvcm1zCisjIGluY2x1ZGUgKE5ld1BsYXRmb3JtRGVidWcpCisKKyMgVmlzdWFsIFN0dWRpbyBzcGVjaWZpYyBvcHRpb25zCitpZihNU1ZDKQorICAgICNGb3IgdmlzdWFsIHN0dWRpbyB0aGUgbGlicmFyeSBuYW1pbmcgaXMgYXMgZm9sbG93aW5nOgorICAgICMgRHluYW1pYyBsaWJyYXJpZXM6CisgICAgIyAgLSB0aHJpZnQuZGxsICBmb3IgcmVsZWFzZSBsaWJyYXJ5CisgICAgIyAgLSB0aHJpZnRkLmRsbCBmb3IgZGVidWcgbGlicmFyeQorICAgICMKKyAgICAjIFN0YXRpYyBsaWJyYXJpZXM6CisgICAgIyAgLSB0aHJpZnRtZC5saWIgZm9yIC9NRCByZWxlYXNlIGJ1aWxkCisgICAgIyAgLSB0aHJpZnRtdC5saWIgZm9yIC9NVCByZWxlYXNlIGJ1aWxkCisgICAgIworICAgICMgIC0gdGhyaWZ0bWRkLmxpYiBmb3IgL01EIGRlYnVnIGJ1aWxkCisgICAgIyAgLSB0aHJpZnRtdGQubGliIGZvciAvTVQgZGVidWcgYnVpbGQKKyAgICAjCisgICAgIyB0aGUgc2FtZSBob2xkcyBmb3Igb3RoZXIgbGlicmFyaWVzIGxpa2UgbGlidGhyaWZ0eiBldGMuCisKKyAgICAjIEZvciBEZWJ1ZyBidWlsZCB0eXBlcywgYXBwZW5kIGEgImQiIHRvIHRoZSBsaWJyYXJ5IG5hbWVzLgorICAgIHNldChDTUFLRV9ERUJVR19QT1NURklYICJkIiBDQUNIRSBTVFJJTkcgIlNldCBkZWJ1ZyBsaWJyYXJ5IHBvc3RmaXgiIEZPUkNFKQorICAgIHNldChDTUFLRV9SRUxFQVNFX1BPU1RGSVggIiIgQ0FDSEUgU1RSSU5HICJTZXQgcmVsZWFzZSBsaWJyYXJ5IHBvc3RmaXgiIEZPUkNFKQorICAgIHNldChDTUFLRV9SRUxXSVRIREVCSU5GT19QT1NURklYICIiIENBQ0hFIFNUUklORyAiU2V0IHJlbGVhc2UgbGlicmFyeSBwb3N0Zml4IiBGT1JDRSkKKworICAgICMgQnVpbGQgdXNpbmcgL01UIG9wdGlvbiBpbnN0ZWFkIG9mIC9NRCBpZiB0aGUgV0lUSF9NVCBvcHRpb25zIGlzIHNldAorICAgIGlmKFdJVEhfTVQpCisgICAgICAgIHNldChDb21waWxlckZsYWdzCisgICAgICAgICAgICAgICAgQ01BS0VfQ1hYX0ZMQUdTCisgICAgICAgICAgICAgICAgQ01BS0VfQ1hYX0ZMQUdTX0RFQlVHCisgICAgICAgICAgICAgICAgQ01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0UKKyAgICAgICAgICAgICAgICBDTUFLRV9DWFhfRkxBR1NfUkVMV0lUSERFQklORk8KKyAgICAgICAgICAgICAgICBDTUFLRV9DX0ZMQUdTCisgICAgICAgICAgICAgICAgQ01BS0VfQ19GTEFHU19ERUJVRworICAgICAgICAgICAgICAgIENNQUtFX0NfRkxBR1NfUkVMRUFTRQorICAgICAgICAgICAgICAgIENNQUtFX0NfRkxBR1NfUkVMV0lUSERFQklORk8KKyAgICAgICAgICAgICAgICApCisgICAgICAgIGZvcmVhY2goQ29tcGlsZXJGbGFnICR7Q29tcGlsZXJGbGFnc30pCisgICAgICAgICAgc3RyaW5nKFJFUExBQ0UgIi9NRCIgIi9NVCIgJHtDb21waWxlckZsYWd9ICIkeyR7Q29tcGlsZXJGbGFnfX0iKQorICAgICAgICBlbmRmb3JlYWNoKCkKKyAgICAgICAgc2V0KFNUQVRJQ19QT1NURklYICJtdCIgQ0FDSEUgU1RSSU5HICJTZXQgc3RhdGljIGxpYnJhcnkgcG9zdGZpeCIgRk9SQ0UpCisgICAgZWxzZShXSVRIX01UKQorICAgICAgICBzZXQoU1RBVElDX1BPU1RGSVggIm1kIiBDQUNIRSBTVFJJTkcgIlNldCBzdGF0aWMgbGlicmFyeSBwb3N0Zml4IiBGT1JDRSkKKyAgICBlbmRpZihXSVRIX01UKQorCisgICAgIyBEaXNhYmxlIGJvb3N0IGF1dG8gbGlua2luZyBwcmFnbWFzIC0gY21ha2UgaW5jbHVkZXMgdGhlIHJpZ2h0IGZpbGVzCisgICAgYWRkX2RlZmluaXRpb25zKCItREJPT1NUX0FMTF9OT19MSUIiKQorCisgICAgIyBXaW5kb3dzIGJ1aWxkIGRvZXMgbm90IGtub3cgaG93IHRvIG1ha2UgYSBzaGFyZWQgbGlicmFyeSB5ZXQKKyAgICAjIGFzIHRoZXJlIGFyZSBubyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgb3IgZXhwb3J0cyBmaWxlcyBpbiB0aGUgcHJvamVjdC4KKyAgICBpZiAoV0lUSF9TSEFSRURfTElCKQorICAgICAgbWVzc2FnZSAoRkFUQUxfRVJST1IgIldpbmRvd3MgYnVpbGQgZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyeSBvdXRwdXQgeWV0LCBwbGVhc2Ugc2V0IC1EV0lUSF9TSEFSRURfTElCPW9mZiIpCisgICAgZW5kaWYoKQorCisgICAgYWRkX2RlZmluaXRpb25zKCIvTVAiKSAjIHBhcmFsbGVsIGJ1aWxkCisgICAgYWRkX2RlZmluaXRpb25zKCIvVzMiKSAjIHdhcm5pbmcgbGV2ZWwgMworCisgICAgIyBWUzIwMTAgZG9lcyBub3QgcHJvdmlkZSBpbnR0eXBlcyB3aGljaCB3ZSBuZWVkIGZvciAiUFJJZDY0IiB1c2VkIGluIG1hbnkgcGxhY2VzCisgICAgZmluZF9wYWNrYWdlKEludHR5cGVzKQorICAgIGlmIChJbnR0eXBlc19GT1VORCkKKyAgICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtJTlRUWVBFU19JTkNMVURFX0RJUlN9KQorICAgICAgIyBPcGVuU1NMIGNvbmZsaWN0cyB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIFBSSWQ2NCB1bmxlc3MgaXQgaXMgZGVmaW5lZCBmaXJzdAorICAgICAgYWRkX2RlZmluaXRpb25zKCIvRklpbnR0eXBlcy5oIikKKyAgICBlbmRpZiAoKQorZWxzZWlmKFVOSVgpCisgIGZpbmRfcHJvZ3JhbSggTUVNT1JZQ0hFQ0tfQ09NTUFORCB2YWxncmluZCApCisgIHNldCggTUVNT1JZQ0hFQ0tfQ09NTUFORF9PUFRJT05TICItLWdlbi1zdXBwcmVzc2lvbnM9YWxsIC0tbGVhay1jaGVjaz1mdWxsIiApCisgIHNldCggTUVNT1JZQ0hFQ0tfU1VQUFJFU1NJT05TX0ZJTEUgIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L3ZhbGdyaW5kLnN1cHByZXNzIiApCitlbmRpZigpCisKK2FkZF9kZWZpbml0aW9ucygiLURfX1NURENfRk9STUFUX01BQ1JPUyIpCithZGRfZGVmaW5pdGlvbnMoIi1EX19TVERDX0xJTUlUX01BQ1JPUyIpCisKKyMgV0lUSF8qVEhSRUFEUyBzZWxlY3RzIHdoaWNoIHRocmVhZGluZyBsaWJyYXJ5IHRvIHVzZQoraWYoV0lUSF9TVERUSFJFQURTKQorICBhZGRfZGVmaW5pdGlvbnMoIi1EVVNFX1NURF9USFJFQUQ9MSIpCitlbmRpZigpCisKKyMgQysrIExhbmd1YWdlIExldmVsCitzZXQoQ1hYX0xBTkdVQUdFX0xFVkVMICJDKyske0NNQUtFX0NYWF9TVEFOREFSRH0iKQoraWYgKENNQUtFX0NYWF9TVEFOREFSRF9SRVFVSVJFRCkKKyAgc3RyaW5nKENPTkNBVCBDWFhfTEFOR1VBR0VfTEVWRUwgIiR7Q1hYX0xBTkdVQUdFX0xFVkVMfSBbY29tcGlsZXIgbXVzdCBzdXBwb3J0IGl0XSIpCitlbHNlKCkKKyAgc3RyaW5nKENPTkNBVCBDWFhfTEFOR1VBR0VfTEVWRUwgIiR7Q1hYX0xBTkdVQUdFX0xFVkVMfSBbZmFsbGJhY2sgdG8gZWFybGllciBpZiBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IGl0XSIpCitlbmRpZigpCitpZiAoQ01BS0VfQ1hYX0VYVEVOU0lPTlMpCisgIHN0cmluZyhDT05DQVQgQ1hYX0xBTkdVQUdFX0xFVkVMICIke0NYWF9MQU5HVUFHRV9MRVZFTH0gW3dpdGggY29tcGlsZXItc3BlY2lmaWMgZXh0ZW5zaW9uc10iKQorZW5kaWYoKQorCitpZiAoQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIE1BVENIRVMgIkNsYW5nIikKKyAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1Xbm8tZGVwcmVjYXRlZC1yZWdpc3RlciIpCitlbmRpZigpCisKKyMgQnVpbGRpbmcgV0lUSF9QTFVHSU4gcmVxdWlyZXMgYm9vc3QgbWVtb3J5IG9wZXJhdGlvbnMsIGZvciBub3csIGFuZCBnY2MgPj0gNC44CitpZiAoV0lUSF9QTFVHSU4pCisgIGlmIChDTUFLRV9DWFhfQ09NUElMRVJfSUQgTUFUQ0hFUyAiR05VIiBBTkQgQ01BS0VfQ1hYX0NPTVBJTEVSX1ZFUlNJT04gVkVSU0lPTl9MRVNTICI0LjgiKQorICAgIG1lc3NhZ2UoU0VORF9FUlJPUiAiVGhyaWZ0IGNvbXBpbGVyIHBsdWctaW4gc3VwcG9ydCBpcyBub3QgcG9zc2libGUgd2l0aCBvbGRlciBnY2MgKCA8IDQuOCApIGNvbXBpbGVyIikKKyAgZW5kaWYoKQorZW5kaWYoKQorCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9GaW5kQW50LmNtYWtlIGIvYnVpbGQvY21ha2UvRmluZEFudC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjAzNzFkCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRmluZEFudC5jbWFrZQpAQCAtMCwwICsxLDMwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCisjICBBTlRfRk9VTkQgLSBzeXN0ZW0gaGFzIEFudAorIyAgQW50X0VYRUNVVEFCTEUgLSB0aGUgQW50IGV4ZWN1dGFibGUKKyMKKyMgSXQgd2lsbCBzZWFyY2ggdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEFOVF9IT01FIGlmIGl0IGlzIHNldAorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorCitmaW5kX3Byb2dyYW0oQW50X0VYRUNVVEFCTEUgTkFNRVMgYW50IFBBVEhTICRFTlZ7QU5UX0hPTUV9L2JpbikKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhBbnQgREVGQVVMVF9NU0cgQW50X0VYRUNVVEFCTEUpCittYXJrX2FzX2FkdmFuY2VkKEFudF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRmluZENhYmFsLmNtYWtlIGIvYnVpbGQvY21ha2UvRmluZENhYmFsLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZDMzN2IKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9GaW5kQ2FiYWwuY21ha2UKQEAgLTAsMCArMSwzMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworIyAgQ2FiYWxfRk9VTkQgLSBzeXN0ZW0gaGFzIENhYmFsCisjICBDYWJhbCAtIHRoZSBDYWJhbCBleGVjdXRhYmxlCisjCisjIEl0IHdpbGwgc2VhcmNoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBDQUJBTF9IT01FIGlmIGl0IGlzIHNldAorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorCitmaW5kX3Byb2dyYW0oQ0FCQUwgTkFNRVMgY2FiYWwgUEFUSFMgJEVOVntIT01FfS8uY2FiYWwvYmluICRFTlZ7Q0FCQUxfSE9NRX0vYmluKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKENBQkFMIERFRkFVTFRfTVNHIENBQkFMKQorbWFya19hc19hZHZhbmNlZChDQUJBTCkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0ZpbmRHSEMuY21ha2UgYi9idWlsZC9jbWFrZS9GaW5kR0hDLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NzM4NDcKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9GaW5kR0hDLmNtYWtlCkBAIC0wLDAgKzEsMzYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKKyMgIEdIQ19GT1VORCAtIHN5c3RlbSBoYXMgR0hDCisjICBHSEMgLSB0aGUgR0hDIGV4ZWN1dGFibGUKKyMgIFJVTl9IQVNLRUxMX0ZPVU5EIC0gc3lzdGVtIGhhcyBydW5oYXNrZWxsCisjICBSVU5fSEFTS0VMTCAtIHRoZSBydW5oYXNrZWxsIGV4ZWN1dGFibGUKKyMKKyMgSXQgd2lsbCBzZWFyY2ggdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEdIQ19IT01FIGlmIGl0IGlzIHNldAorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorCitmaW5kX3Byb2dyYW0oR0hDIE5BTUVTIGdoYyBQQVRIUyAkRU5We0dIQ19IT01FfS9iaW4pCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoR0hDIERFRkFVTFRfTVNHIEdIQykKK21hcmtfYXNfYWR2YW5jZWQoR0hDKQorCitmaW5kX3Byb2dyYW0oUlVOX0hBU0tFTEwgTkFNRVMgcnVuaGFza2VsbCBQQVRIUyAkRU5We0dIQ19IT01FfS9iaW4pCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoUlVOX0hBU0tFTEwgREVGQVVMVF9NU0cgUlVOX0hBU0tFTEwpCittYXJrX2FzX2FkdmFuY2VkKFJVTl9IQVNLRUxMKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRmluZEdMSUIuY21ha2UgYi9idWlsZC9jbWFrZS9GaW5kR0xJQi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2JlNDMzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRmluZEdMSUIuY21ha2UKQEAgLTAsMCArMSwxMjIgQEAKKyMgLSBUcnkgdG8gZmluZCBHbGliIGFuZCBpdHMgY29tcG9uZW50cyAoZ2lvLCBnb2JqZWN0IGV0YykKKyMgT25jZSBkb25lLCB0aGlzIHdpbGwgZGVmaW5lCisjCisjICBHTElCX0ZPVU5EIC0gc3lzdGVtIGhhcyBHbGliCisjICBHTElCX0lOQ0xVREVfRElSUyAtIHRoZSBHbGliIGluY2x1ZGUgZGlyZWN0b3JpZXMKKyMgIEdMSUJfTElCUkFSSUVTIC0gbGluayB0aGVzZSB0byB1c2UgR2xpYgorIworIyBPcHRpb25hbGx5LCB0aGUgQ09NUE9ORU5UUyBrZXl3b3JkIGNhbiBiZSBwYXNzZWQgdG8gZmluZF9wYWNrYWdlKCkKKyMgYW5kIEdsaWIgY29tcG9uZW50cyBjYW4gYmUgbG9va2VkIGZvci4gIEN1cnJlbnRseSwgdGhlIGZvbGxvd2luZworIyBjb21wb25lbnRzIGNhbiBiZSB1c2VkLCBhbmQgdGhleSBkZWZpbmUgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgaWYKKyMgZm91bmQ6CisjCisjICBnaW86ICAgICAgICAgICAgIEdMSUJfR0lPX0xJQlJBUklFUworIyAgZ29iamVjdDogICAgICAgICBHTElCX0dPQkpFQ1RfTElCUkFSSUVTCisjICBnbW9kdWxlOiAgICAgICAgIEdMSUJfR01PRFVMRV9MSUJSQVJJRVMKKyMgIGd0aHJlYWQ6ICAgICAgICAgR0xJQl9HVEhSRUFEX0xJQlJBUklFUworIworIyBOb3RlIHRoYXQgdGhlIHJlc3BlY3RpdmUgX0lOQ0xVREVfRElSIHZhcmlhYmxlcyBhcmUgbm90IHNldCwgc2luY2UKKyMgYWxsIGhlYWRlcnMgYXJlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBHTElCX0lOQ0xVREVfRElSUy4KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEyIFJhcGhhZWwgS3VibyBkYSBDb3N0YSA8cmFrdWNvQHdlYmtpdC5vcmc+CisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTCisjIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgSVRTCisjIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorIyBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOworIyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyMgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKKyMgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgorIyBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworZmluZF9wYWNrYWdlKFBrZ0NvbmZpZykKK3BrZ19jaGVja19tb2R1bGVzKFBDX0dMSUIgUVVJRVQgZ2xpYi0yLjApCisKK2ZpbmRfbGlicmFyeShHTElCX0xJQlJBUklFUworICAgIE5BTUVTIGdsaWItMi4wCisgICAgSElOVFMgJHtQQ19HTElCX0xJQkRJUn0KKyAgICAgICAgICAke1BDX0dMSUJfTElCUkFSWV9ESVJTfQorKQorCisjIEZpbGVzIGluIGdsaWIncyBtYWluIGluY2x1ZGUgcGF0aCBtYXkgaW5jbHVkZSBnbGliY29uZmlnLmgsIHdoaWNoLAorIyBmb3Igc29tZSBvZGQgcmVhc29uLCBpcyBub3JtYWxseSBpbiAkTElCRElSL2dsaWItMi4wL2luY2x1ZGUuCitnZXRfZmlsZW5hbWVfY29tcG9uZW50KF9HTElCX0xJQlJBUllfRElSICR7R0xJQl9MSUJSQVJJRVN9IFBBVEgpCitmaW5kX3BhdGgoR0xJQkNPTkZJR19JTkNMVURFX0RJUgorICAgIE5BTUVTIGdsaWJjb25maWcuaAorICAgIEhJTlRTICR7UENfTElCRElSfSAke1BDX0xJQlJBUllfRElSU30gJHtfR0xJQl9MSUJSQVJZX0RJUn0KKyAgICAgICAgICAke1BDX0dMSUJfSU5DTFVERURJUn0gJHtQQ19HTElCX0lOQ0xVREVfRElSU30KKyAgICBQQVRIX1NVRkZJWEVTIGdsaWItMi4wL2luY2x1ZGUKKykKKworZmluZF9wYXRoKEdMSUJfSU5DTFVERV9ESVIKKyAgICBOQU1FUyBnbGliLmgKKyAgICBISU5UUyAke1BDX0dMSUJfSU5DTFVERURJUn0KKyAgICAgICAgICAke1BDX0dMSUJfSU5DTFVERV9ESVJTfQorICAgIFBBVEhfU1VGRklYRVMgZ2xpYi0yLjAKKykKKworc2V0KEdMSUJfSU5DTFVERV9ESVJTICR7R0xJQl9JTkNMVURFX0RJUn0gJHtHTElCQ09ORklHX0lOQ0xVREVfRElSfSkKKworaWYoR0xJQkNPTkZJR19JTkNMVURFX0RJUikKKyAgICAjIFZlcnNpb24gZGV0ZWN0aW9uCisgICAgZmlsZShSRUFEICIke0dMSUJDT05GSUdfSU5DTFVERV9ESVJ9L2dsaWJjb25maWcuaCIgR0xJQkNPTkZJR19IX0NPTlRFTlRTKQorICAgIHN0cmluZyhSRUdFWCBNQVRDSCAiI2RlZmluZSBHTElCX01BSk9SX1ZFUlNJT04gKFswLTldKykiIF9kdW1teSAiJHtHTElCQ09ORklHX0hfQ09OVEVOVFN9IikKKyAgICBzZXQoR0xJQl9WRVJTSU9OX01BSk9SICIke0NNQUtFX01BVENIXzF9IikKKyAgICBzdHJpbmcoUkVHRVggTUFUQ0ggIiNkZWZpbmUgR0xJQl9NSU5PUl9WRVJTSU9OIChbMC05XSspIiBfZHVtbXkgIiR7R0xJQkNPTkZJR19IX0NPTlRFTlRTfSIpCisgICAgc2V0KEdMSUJfVkVSU0lPTl9NSU5PUiAiJHtDTUFLRV9NQVRDSF8xfSIpCisgICAgc3RyaW5nKFJFR0VYIE1BVENIICIjZGVmaW5lIEdMSUJfTUlDUk9fVkVSU0lPTiAoWzAtOV0rKSIgX2R1bW15ICIke0dMSUJDT05GSUdfSF9DT05URU5UU30iKQorICAgIHNldChHTElCX1ZFUlNJT05fTUlDUk8gIiR7Q01BS0VfTUFUQ0hfMX0iKQorICAgIHNldChHTElCX1ZFUlNJT04gIiR7R0xJQl9WRVJTSU9OX01BSk9SfS4ke0dMSUJfVkVSU0lPTl9NSU5PUn0uJHtHTElCX1ZFUlNJT05fTUlDUk99IikKK2VuZGlmKCkKKworIyBBZGRpdGlvbmFsIEdsaWIgY29tcG9uZW50cy4gIFdlIG9ubHkgbG9vayBmb3IgbGlicmFyaWVzLCBhcyBub3QgYWxsIG9mIHRoZW0KKyMgaGF2ZSBjb3JyZXNwb25kaW5nIGhlYWRlcnMgYW5kIGFsbCBoZWFkZXJzIGFyZSBpbnN0YWxsZWQgYWxvbmdzaWRlIHRoZSBtYWluCisjIGdsaWIgb25lcy4KK2ZvcmVhY2ggKF9jb21wb25lbnQgJHtHTElCX0ZJTkRfQ09NUE9ORU5UU30pCisgICAgaWYgKCR7X2NvbXBvbmVudH0gU1RSRVFVQUwgImdpbyIpCisgICAgICAgIGZpbmRfbGlicmFyeShHTElCX0dJT19MSUJSQVJJRVMgTkFNRVMgZ2lvLTIuMCBISU5UUyAke19HTElCX0xJQlJBUllfRElSfSkKKyAgICAgICAgc2V0KEFERElUSU9OQUxfUkVRVUlSRURfVkFSUyAke0FERElUSU9OQUxfUkVRVUlSRURfVkFSU30gR0xJQl9HSU9fTElCUkFSSUVTKQorICAgIGVsc2VpZiAoJHtfY29tcG9uZW50fSBTVFJFUVVBTCAiZ29iamVjdCIpCisgICAgICAgIGZpbmRfbGlicmFyeShHTElCX0dPQkpFQ1RfTElCUkFSSUVTIE5BTUVTIGdvYmplY3QtMi4wIEhJTlRTICR7X0dMSUJfTElCUkFSWV9ESVJ9KQorICAgICAgICBzZXQoQURESVRJT05BTF9SRVFVSVJFRF9WQVJTICR7QURESVRJT05BTF9SRVFVSVJFRF9WQVJTfSBHTElCX0dPQkpFQ1RfTElCUkFSSUVTKQorICAgIGVsc2VpZiAoJHtfY29tcG9uZW50fSBTVFJFUVVBTCAiZ21vZHVsZSIpCisgICAgICAgIGZpbmRfbGlicmFyeShHTElCX0dNT0RVTEVfTElCUkFSSUVTIE5BTUVTIGdtb2R1bGUtMi4wIEhJTlRTICR7X0dMSUJfTElCUkFSWV9ESVJ9KQorICAgICAgICBzZXQoQURESVRJT05BTF9SRVFVSVJFRF9WQVJTICR7QURESVRJT05BTF9SRVFVSVJFRF9WQVJTfSBHTElCX0dNT0RVTEVfTElCUkFSSUVTKQorICAgIGVsc2VpZiAoJHtfY29tcG9uZW50fSBTVFJFUVVBTCAiZ3RocmVhZCIpCisgICAgICAgIGZpbmRfbGlicmFyeShHTElCX0dUSFJFQURfTElCUkFSSUVTIE5BTUVTIGd0aHJlYWQtMi4wIEhJTlRTICR7X0dMSUJfTElCUkFSWV9ESVJ9KQorICAgICAgICBzZXQoQURESVRJT05BTF9SRVFVSVJFRF9WQVJTICR7QURESVRJT05BTF9SRVFVSVJFRF9WQVJTfSBHTElCX0dUSFJFQURfTElCUkFSSUVTKQorICAgIGVsc2VpZiAoJHtfY29tcG9uZW50fSBTVFJFUVVBTCAiZ2lvLXVuaXgiKQorICAgICAgICAjIGdpby11bml4IGlzIGNvbXBpbGVkIGFzIHBhcnQgb2YgdGhlIGdpbyBsaWJyYXJ5LCBidXQgdGhlIGluY2x1ZGUgcGF0aHMKKyAgICAgICAgIyBhcmUgc2VwYXJhdGUgZnJvbSB0aGUgc2hhcmVkIGdsaWIgb25lcy4gU2luY2UgdGhpcyBpcyBjdXJyZW50bHkgb25seSB1c2VkCisgICAgICAgICMgYnkgV2ViS2l0R1RLKyB3ZSBkb24ndCBnbyB0byBleHRyYW9yZGluYXJ5IG1lYXN1cmVzIGJleW9uZCBwa2ctY29uZmlnLgorICAgICAgICBwa2dfY2hlY2tfbW9kdWxlcyhHSU9fVU5JWCBRVUlFVCBnaW8tdW5peC0yLjApCisgICAgZW5kaWYgKCkKK2VuZGZvcmVhY2ggKCkKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK0ZJTkRfUEFDS0FHRV9IQU5ETEVfU1RBTkRBUkRfQVJHUyhHTElCIFJFUVVJUkVEX1ZBUlMgR0xJQl9JTkNMVURFX0RJUlMgR0xJQl9MSUJSQVJJRVMgJHtBRERJVElPTkFMX1JFUVVJUkVEX1ZBUlN9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJTSU9OX1ZBUiAgIEdMSUJfVkVSU0lPTikKKworbWFya19hc19hZHZhbmNlZCgKKyAgICBHTElCQ09ORklHX0lOQ0xVREVfRElSCisgICAgR0xJQl9HSU9fTElCUkFSSUVTCisgICAgR0xJQl9HSU9fVU5JWF9MSUJSQVJJRVMKKyAgICBHTElCX0dNT0RVTEVfTElCUkFSSUVTCisgICAgR0xJQl9HT0JKRUNUX0xJQlJBUklFUworICAgIEdMSUJfR1RIUkVBRF9MSUJSQVJJRVMKKyAgICBHTElCX0lOQ0xVREVfRElSCisgICAgR0xJQl9JTkNMVURFX0RJUlMKKyAgICBHTElCX0xJQlJBUklFUworKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRmluZEdyYWRsZS5jbWFrZSBiL2J1aWxkL2NtYWtlL0ZpbmRHcmFkbGUuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg0NWQ2OQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0ZpbmRHcmFkbGUuY21ha2UKQEAgLTAsMCArMSwzMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworIyAgR1JBRExFX0ZPVU5EIC0gc3lzdGVtIGhhcyBHcmFkbGUKKyMgIEdSQURMRV9FWEVDVVRBQkxFIC0gdGhlIEdyYWRsZSBleGVjdXRhYmxlCisjCisjIEl0IHdpbGwgc2VhcmNoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBBTlRfSE9NRSBpZiBpdCBpcyBzZXQKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKKworZmluZF9wcm9ncmFtKEdSQURMRV9FWEVDVVRBQkxFIE5BTUVTIGdyYWRsZSBQQVRIUyAkRU5We0dSQURMRV9IT01FfS9iaW4gTk9fQ01BS0VfRklORF9ST09UX1BBVEgpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoR3JhZGxlIERFRkFVTFRfTVNHIEdSQURMRV9FWEVDVVRBQkxFKQorbWFya19hc19hZHZhbmNlZChHUkFETEVfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0ZpbmRHcmFkbGV3LmNtYWtlIGIvYnVpbGQvY21ha2UvRmluZEdyYWRsZXcuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdiYjk5OAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0ZpbmRHcmFkbGV3LmNtYWtlCkBAIC0wLDAgKzEsMzYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKKyMgIEdSQURMRVdfRk9VTkQgLSBzeXN0ZW0gaGFzIEdyYWRsZXcKKyMgIEdSQURMRVdfRVhFQ1VUQUJMRSAtIHRoZSBHcmFkbGV3IGV4ZWN1dGFibGUKKyMKKyMgSXQgd2lsbCBzZWFyY2ggdGhlIGxvY2F0aW9uIENNQUtFX1NPVVJDRV9ESVIvbGliL2phdmEKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKKworZmluZF9wcm9ncmFtKEdSQURMRVdfRVhFQ1VUQUJMRSBncmFkbGV3IFBBVEhTICR7Q01BS0VfU09VUkNFX0RJUn0vbGliL2phdmEgTk9fREVGQVVMVF9QQVRIIE5PX0NNQUtFX0ZJTkRfUk9PVF9QQVRIKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKEdyYWRsZXcgREVGQVVMVF9NU0cgR1JBRExFV19FWEVDVVRBQkxFKQorbWFya19hc19hZHZhbmNlZChHUkFETEVXX0VYRUNVVEFCTEUpCisKKyMgQnVnZ3kgZmluZF9wcm9ncmFtIGNhbm5vdCBmaW5kIGdyYWRsZXcuYmF0IHdoZW4gZ3JhZGxldyBpcyBhdCB0aGUgc2FtZSBwYXRoCisjIGFuZCBldmVuIGJ1Z2dpZXIgY3Rlc3Qgd2lsbCBub3QgZXhlY3V0ZSBncmFkbGV3LmJhdCB3aGVuIGdyYWRsZXcgaXMgZ2l2ZW4uCitpZihDTUFLRV9IT1NUX1dJTjMyKQorICAgIHN0cmluZyhSRUdFWCBSRVBMQUNFICIoLitncmFkbGV3KSQiICJcXDEuYmF0IiBHUkFETEVXX0VYRUNVVEFCTEUgJHtHUkFETEVXX0VYRUNVVEFCTEV9KQorZW5kaWYoQ01BS0VfSE9TVF9XSU4zMikKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0ZpbmRJbnR0eXBlcy5jbWFrZSBiL2J1aWxkL2NtYWtlL0ZpbmRJbnR0eXBlcy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjYxZjc4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRmluZEludHR5cGVzLmNtYWtlCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIGZpbmQgbXNpbnR0eXBlcyBvbiBjb21waWxlcnMgdGhhdCBkb24ndCBwcm92aWRlIGl0LCBmb3IgZXhhbXBsZQorIyAgIFZTMjAxMAorCisjIFVzYWdlOiAKKyMgUHJvdmlkZSBJTlRUWVBFU19ST09UIGlmIHlvdSBuZWVkIGl0CisjIFJlc3VsdDogSU5UVFlQRVNfSU5DTFVERV9ESVJTLCB3aGVyZSB0byBmaW5kIGludHR5cGVzLmgKKyMgUmVzdWx0OiBJbnR0eXBlc19GT1VORCwgSWYgZmFsc2UsIGludHR5cGVzLmggd2FzIG5vdCBmb3VuZAorCitmaW5kX3BhdGgoSU5UVFlQRVNfSU5DTFVERV9ESVJTIGludHR5cGVzLmggSElOVFMgJHtJTlRUWVBFU19ST09UfSkKK2lmIChJTlRUWVBFU19JTkNMVURFX0RJUlMpCisgIHNldChJbnR0eXBlc19GT1VORCBUUlVFKQorZWxzZSAoKQorICBzZXQoSW50dHlwZXNfRk9VTkQgRkFMU0UpCisgIGlmIChJbnR0eXBlc19GSU5EX1JFUVVJUkVEKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkNvdWxkIE5PVCBmaW5kIGludHR5cGVzLmgiKQorICBlbmRpZiAoKQorICBtZXNzYWdlKFNUQVRVUyAiaW50dHlwZXMuaCBOT1QgZm91bmQiKQorZW5kaWYgKCkKKworbWFya19hc19hZHZhbmNlZCgKKyAgSU5UVFlQRVNfSU5DTFVERV9ESVJTCispCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9GaW5kTGliZXZlbnQuY21ha2UgYi9idWlsZC9jbWFrZS9GaW5kTGliZXZlbnQuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM2YTA3OAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0ZpbmRMaWJldmVudC5jbWFrZQpAQCAtMCwwICsxLDQ1IEBACisjIGZpbmQgTGliRXZlbnQKKyMgYW4gZXZlbnQgbm90aWZpY2F0aW9uIGxpYnJhcnkgKGh0dHA6Ly9saWJldmVudC5vcmcvKQorIworIyBVc2FnZTogCisjIExJQkVWRU5UX0lOQ0xVREVfRElSUywgd2hlcmUgdG8gZmluZCBMaWJFdmVudCBoZWFkZXJzCisjIExJQkVWRU5UX0xJQlJBUklFUywgTGliRXZlbnQgbGlicmFyaWVzCisjIExpYmV2ZW50X0ZPVU5ELCBJZiBmYWxzZSwgZG8gbm90IHRyeSB0byB1c2UgbGliZXZlbnQKKworc2V0KExJQkVWRU5UX1JPT1QgQ0FDSEUgUEFUSCAiUm9vdCBkaXJlY3Rvcnkgb2YgbGliZXZlbnQgaW5zdGFsbGF0aW9uIikKK3NldChMaWJFdmVudF9FWFRSQV9QUkVGSVhFUyAvdXNyL2xvY2FsIC9vcHQvbG9jYWwgIiRFTlZ7SE9NRX0iICR7TElCRVZFTlRfUk9PVH0pCitmb3JlYWNoKHByZWZpeCAke0xpYkV2ZW50X0VYVFJBX1BSRUZJWEVTfSkKKyAgbGlzdChBUFBFTkQgTGliRXZlbnRfSU5DTFVERV9QQVRIUyAiJHtwcmVmaXh9L2luY2x1ZGUiKQorICBsaXN0KEFQUEVORCBMaWJFdmVudF9MSUJSQVJJRVNfUEFUSFMgIiR7cHJlZml4fS9saWIiKQorZW5kZm9yZWFjaCgpCisKKyMgTG9va2luZyBmb3IgImV2ZW50LmgiIHdpbGwgZmluZCB0aGUgUGxhdGZvcm0gU0RLIGluY2x1ZGUgZGlyIG9uIHdpbmRvd3MKKyMgc28gd2UgYWxzbyBsb29rIGZvciBhIHBlZXIgaGVhZGVyIGxpa2UgZXZodHRwLmggdG8gZ2V0IHRoZSByaWdodCBwYXRoCitmaW5kX3BhdGgoTElCRVZFTlRfSU5DTFVERV9ESVJTIGV2aHR0cC5oIGV2ZW50LmggUEFUSFMgJHtMaWJFdmVudF9JTkNMVURFX1BBVEhTfSkKKworIyAibGliIiBwcmVmaXggaXMgbmVlZGVkIG9uIFdpbmRvd3MgaW4gc29tZSBjYXNlcworIyBuZXdlciB2ZXJzaW9ucyBvZiBsaWJldmVudCB1c2UgdGhyZWUgbGlicmFyaWVzCitmaW5kX2xpYnJhcnkoTElCRVZFTlRfTElCUkFSSUVTIE5BTUVTIGV2ZW50IGV2ZW50X2NvcmUgZXZlbnRfZXh0cmEgbGliZXZlbnQgUEFUSFMgJHtMaWJFdmVudF9MSUJSQVJJRVNfUEFUSFN9KQorCitpZiAoTElCRVZFTlRfTElCUkFSSUVTIEFORCBMSUJFVkVOVF9JTkNMVURFX0RJUlMpCisgIHNldChMaWJldmVudF9GT1VORCBUUlVFKQorICBzZXQoTElCRVZFTlRfTElCUkFSSUVTICR7TElCRVZFTlRfTElCUkFSSUVTfSkKK2Vsc2UgKCkKKyAgc2V0KExpYmV2ZW50X0ZPVU5EIEZBTFNFKQorZW5kaWYgKCkKKworaWYgKExpYmV2ZW50X0ZPVU5EKQorICBpZiAoTk9UIExpYmV2ZW50X0ZJTkRfUVVJRVRMWSkKKyAgICBtZXNzYWdlKFNUQVRVUyAiRm91bmQgbGliZXZlbnQ6ICR7TElCRVZFTlRfTElCUkFSSUVTfSIpCisgIGVuZGlmICgpCitlbHNlICgpCisgIGlmIChMaWJFdmVudF9GSU5EX1JFUVVJUkVEKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkNvdWxkIE5PVCBmaW5kIGxpYmV2ZW50LiIpCisgIGVuZGlmICgpCisgIG1lc3NhZ2UoU1RBVFVTICJsaWJldmVudCBOT1QgZm91bmQuIikKK2VuZGlmICgpCisKK21hcmtfYXNfYWR2YW5jZWQoCisgICAgTElCRVZFTlRfTElCUkFSSUVTCisgICAgTElCRVZFTlRfSU5DTFVERV9ESVJTCisgICkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL05ld1BsYXRmb3JtRGVidWcuY21ha2UgYi9idWlsZC9jbWFrZS9OZXdQbGF0Zm9ybURlYnVnLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNGQzMDIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9OZXdQbGF0Zm9ybURlYnVnLmNtYWtlCkBAIC0wLDAgKzEsNDQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjIEZvciBkZWJ1Z2dpbmcgbmV3IHBsYXRmb3JtcywganVzdCB0byBzZWUgd2hhdCBzb21lIGVudmlyb25tZW50IGZsYWdzIGFyZS4uLgorIworbWFjcm8oU0hPV0ZMQUcgZmxhZykKKyAgbWVzc2FnZShTVEFUVVMgIiR7ZmxhZ30gPSAkeyR7ZmxhZ319IikKK2VuZG1hY3JvKFNIT1dGTEFHKQorCitzZXQoTkVXUExBVEZPUk1ERUJVRyBPTikKKworaWYoTkVXUExBVEZPUk1ERUJVRykKKyAgU0hPV0ZMQUcoIkFQUExFIikKKyAgU0hPV0ZMQUcoIkJPUkxBTkQiKQorICBTSE9XRkxBRygiQ01BS0VfQ19DT01QSUxFUl9JRCIpCisgIFNIT1dGTEFHKCJDTUFLRV9DWFhfQ09NUElMRVJfSUQiKQorICBTSE9XRkxBRygiQ01BS0VfQ09NUElMRVJfSVNfR05VQ0MiKQorICBTSE9XRkxBRygiQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYIikKKyAgU0hPV0ZMQUcoIkNZR1dJTiIpCisgIFNIT1dGTEFHKCJNSU5HVyIpCisgIFNIT1dGTEFHKCJNU1ZDIikKKyAgU0hPV0ZMQUcoIk1TVkNfVkVSU0lPTiIpCisgIFNIT1dGTEFHKCJNU1lTIikKKyAgU0hPV0ZMQUcoIlVOSVgiKQorICBTSE9XRkxBRygiV0FUQ09NIikKKyAgU0hPV0ZMQUcoIldJTjMyIikKK2VuZGlmKE5FV1BMQVRGT1JNREVCVUcpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9SRUFETUUtTVNZUzIubWQgYi9idWlsZC9jbWFrZS9SRUFETUUtTVNZUzIubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjYWQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL1JFQURNRS1NU1lTMi5tZApAQCAtMCwwICsxLDYzIEBACis8IS0tLQorTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCisjIEJ1aWxkaW5nIHRocmlmdCBvbiBXaW5kb3dzIChNaW5HVzY0L01TWVMyKQorCitUaHJpZnQgdXNlcyBjbWFrZSB0byBtYWtlIGl0IGVhc2llciB0byBidWlsZCB0aGUgcHJvamVjdCBvbiBtdWx0aXBsZSBwbGF0Zm9ybXMsIGhvd2V2ZXIgdG8gYnVpbGQgYSBmdWxseSBmdW5jdGlvbmFsIGFuZCBwcm9kdWN0aW9uIHJlYWR5IHRocmlmdCBvbiBXaW5kb3dzIHJlcXVpcmVzIGEgbnVtYmVyIG9mIHRoaXJkIHBhcnR5IGxpYnJhcmllcyB0byBiZSBvYnRhaW5lZC4gIE9uY2UgdGhpcmQgcGFydHkgbGlicmFyaWVzIGFyZSByZWFkeSwgdGhlIHJpZ2h0IGNvbWJpbmF0aW9uIG9mIG9wdGlvbnMgbXVzdCBiZSBwYXNzZWQgdG8gY21ha2UgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGNvcnJlY3QgZW52aXJvbm1lbnQuCisKKz4gTm90ZTogbGliZXZlbnQgYW5kIGxpYmV2ZW50LWRldmVsIGRvIG5vdCB3b3JrIHdpdGggdGhpcyB0b29sY2hhaW4gYXMgdGhleSBkbyBub3QgcHJvcGVybHkgZGV0ZWN0IG1pbmd3NjQgYW5kIGV4cGVjdCBzb21lIGhlYWRlcnMgdG8gZXhpc3QgdGhhdCBkbyBub3QsIHNvIHRoZSBub24tYmxvY2tpbmcgc2VydmVyIGlzIG5vdCBjdXJyZW50bHkgYnVpbHQgaW50byB0aGlzIHNvbHV0aW9uLgorCisjIyBNU1lTMgorCitEb3dubG9hZCBhbmQgZnVsbHkgdXBncmFkZSBtc3lzMiBmb2xsb3dpbmcgdGhlIGluc3RydWN0aW9ucyBhdDoKKworICAgIGh0dHBzOi8vbXN5czIuZ2l0aHViLmlvLworCitJbnN0YWxsIHRoZSBuZWNlc3NhcnkgdG9vbGNoYWluIGl0ZW1zIGZvciBDKys6CisKKyAgICAkIHBhY21hbiAtLW5lZWRlZCAtUyBiaXNvbiBmbGV4IG1ha2UgbWluZ3ctdzY0LXg4Nl82NC1vcGVuc3NsIFwKKyAgICAgICAgICAgICAgICBtaW5ndy13NjQteDg2XzY0LWJvb3N0IG1pbmd3LXc2NC14ODZfNjQtY21ha2UgXAorICAgICAgICAgICAgICAgIG1pbmd3LXc2NC14ODZfNjQtdG9vbGNoYWluIG1pbmd3LXc2NC14ODZfNjQtemxpYgorCitVcGRhdGUgeW91ciBtc3lzMiBiYXNoIHBhdGggdG8gaW5jbHVkZSAvbWluZ3c2NC9iaW4gYnkgYWRkaW5nIGEgbGluZSB0byB5b3VyIH4vLmJhc2hfcHJvZmlsZXMgdXNpbmcgdGhpcyBjb21tYW5kOgorCisgICAgZWNobyAiZXhwb3J0IFBBVEg9L21pbmd3NjQvYmluOlwkUEFUSCIgPj4gfi8uYmFzaF9wcm9maWxlCisKK0FmdGVyIHRoYXQsIGNsb3NlIHlvdXIgc2hlbGwgYW5kIG9wZW4gYSBuZXcgb25lLgorCitVc2UgY21ha2UgdG8gY3JlYXRlIGEgTWluR1cgbWFrZWZpbGUsIG91dCBvZiB0cmVlIChhc3N1bWVzIHlvdSBhcmUgaW4gdGhlIHRvcCBsZXZlbCBvZiB0aGUgdGhyaWZ0IHNvdXJjZSB0cmVlKToKKworICAgIG1rZGlyIC4uL3RocmlmdC1idWlsZAorICAgIGNkIC4uL3RocmlmdC1idWlsZAorICAgIGNtYWtlIC1HIk1pbkdXIE1ha2VmaWxlcyIgLURDTUFLRV9NQUtFX1BST0dSQU09L21pbmd3NjQvYmluL21pbmd3MzItbWFrZSBcCisgICAgICAgLURDTUFLRV9DX0NPTVBJTEVSPXg4Nl82NC13NjQtbWluZ3czMi1nY2MuZXhlIFwKKyAgICAgICAtRENNQUtFX0NYWF9DT01QSUxFUj14ODZfNjQtdzY0LW1pbmd3MzItZysrLmV4ZSBcCisgICAgICAgLURXSVRIX0xJQkVWRU5UPU9GRiBcCisgICAgICAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIC1EV0lUSF9TVEFUSUNfTElCPU9OIFwKKyAgICAgICAtRFdJVEhfSkFWQT1PRkYgLURXSVRIX1BZVEhPTj1PRkYgLURXSVRIX1BFUkw9T0ZGIFwKKyAgICAgICAuLi90aHJpZnQKKworQnVpbGQgdGhyaWZ0IChpbnNpZGUgdGhyaWZ0LWJ1aWxkKToKKworICAgIGNtYWtlIC0tYnVpbGQgLgorCitSdW4gdGhlIHRlc3RzIChpbnNpZGUgdGhyaWZ0LWJ1aWxkKToKKworICAgIGN0ZXN0CisKKz4gSWYgeW91IHJ1biBpbnRvIGlzc3VlcywgY2hlY2sgQXBhY2hlIEppcmEgVEhSSUZULTQwNDYgZm9yIHBhdGNoZXMgcmVsYXRpbmcgdG8gTWluR1c2NC9NU1lTMiBidWlsZHMuCisKKyMjIFRlc3RlZCBXaXRoCisKK21zeXMyIDY0LWJpdCAyMDE2LTEwLTI2IGRpc3RyaWJ1dGlvbgpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvUkVBRE1FLm1kIGIvYnVpbGQvY21ha2UvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YzEyOGIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9SRUFETUUubWQKQEAgLTAsMCArMSw2MCBAQAorIyBBcGFjaGUgVGhyaWZ0IC0gQ01ha2UgYnVpbGQKKworIyMgR29hbAorRXh0ZW5kIEFwYWNoZSBUaHJpZnQncyAqbWFrZSBjcm9zcyogYXBwcm9hY2ggdG8gdGhlIGJ1aWxkIHN5c3RlbS4KKworRHVlIHRvIGdyb3dpbmcgdGhlIGZpZWxkIG9mIG9wZXJhdGluZyBzeXN0ZW0gc3VwcG9ydCwgYSBwcm9wZXIgZXhlY3V0YWJsZQorYW5kIGxpYnJhcnkgZGV0ZWN0aW9uIG1lY2hhbmlzbSBydW5uaW5nIG9uIGFzIG11Y2ggcGxhdGZvcm1zIGFzIHBvc3NpYmxlCitiZWNvbWVzIHJlcXVpcmVkLiBUaGUgb3RoZXIgYXNwZWN0IHRvIHNpbXBsaWZ5IHRoZSByZWxlYXNlIHByb2Nlc3MgYW5kCitwYWNrYWdlIGdlbmVyYXRpb24gcHJvY2Vzcy4KKworQXMgbmljZSBzaWRlIGJlbmVmaXQgb2YgQ01ha2UgaXMgdGhlIGdlbmVyYXRpb24gb2YgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQKK3NwZWNpZmljIHNvdWx0aW9uIGZpbGVzLiA9PiBObyBzb2x1dGlvbiBmaWxlcyB3aXRoaW4gc291cmNlIHRyZWUuCisKKworIyMgVXNhZ2UKK2p1c3QgZG8gdGhpczoKKworICAgIG1rZGlyIGNtYWtlLWJ1aWxkICYmIGNkIGNtYWtlLWJ1aWxkCisgICAgY21ha2UgLi4KKworaWYgeW91IHVzZSBhIHNwZWNpZmljIHRvb2xjaGFpbiBwYXNzIGl0IHRvIGNtYWtlLCB0aGUgc2FtZSBmb3Igb3B0aW9uczoKKworICAgIGNtYWtlIC1EQ01BS0VfVE9PTENIQUlOX0ZJTEU9Li4vYnVpbGQvY21ha2UvbWluZ3czMi10b29sY2hhaW4uY21ha2UgLi4KKyAgICBjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Y2xhbmctMy41IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWNsYW5nKystMy41IC4uCisgICAgY21ha2UgLURUSFJJRlRfQ09NUElMRVJfSFM9T0ZGIC4uCisgICAgY21ha2UgLURXSVRIX1pMSUI9T04gLi4KKworb3Igb24gV2luZG93cworCisgICAgY21ha2UgLUcgIlZpc3VhbCBTdHVkaW8gMTIgMjAxMyBXaW42NCIgXAorICAgIC1EQk9PU1RfUk9PVD1DOi8zcmRwYXJ0eS9ib29zdF8xXzU4XzAgXAorICAgIC1EWkxJQl9ST09UPUM6LzNyZHBhcnR5L3psaWIxMjgtZGxsIFwKKyAgICAtRFdJVEhfU0hBUkVEX0xJQj1vZmYgLi4KKworYW5kIG9wZW4gdGhlIGRldmVsb3BtZW50IGVudmlyb25tZW50IHlvdSBsaWtlIHdpdGggdGhlIHNvbHV0aW9uIG9yIGRvIHRoaXM6CisKKyAgICBtYWtlCisgICAgbWFrZSBjaGVjaworICAgIG1ha2UgY3Jvc3MKKyAgICBtYWtlIGRpc3QKKwordG8gZ2VuZXJhdGUgYW4gaW5zdGFsbGVyIGFuZCBkaXN0cmlidXRpb24gcGFja2FnZSBkbyB0aGlzOgorCisgICAgY3BhY2sKKworIyMgVE9ETworKiBnaXQgaGFzaCBvciB0YWcgYmFzZWQgdmVyc2lvbmluZyBkZXBlbmRpbmcgb24gc291cmNlIHN0YXRlCisqIGJ1aWxkIHR1dG9yaWFsCisqIGJ1aWxkIHRlc3QKKyogd2l0aC93aXRob3V0IGxhbmd1YWdlIGxpYi88bGFuZz4vCisqIGVuYWJsZS9kaXNhYmxlCisqIG1ha2UgY3Jvc3MKKyogbWFrZSBkaXN0IChjcmVhdGUgYW4gYWxpYXMgdG8gbWFrZSBwYWNrYWdlX3NvdXJjZSkKKyogbWFrZSBkb2MKKyogY3BhY2sgKEMrKyBhbmQgbWFrZSBkaXN0IG9ubHkgPykKKyAgKiB0aHJpZnQtY29tcGlsZXIKKyAgKiBsaWJ0aHJpZnQKKyAgKiB0dXRvcmlhbAorICAqIHRlc3QKKyogbWVyZ2UgaW50byAvUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9UaHJpZnRNYWNyb3MuY21ha2UgYi9idWlsZC9jbWFrZS9UaHJpZnRNYWNyb3MuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgzN2Y5NAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL1RocmlmdE1hY3Jvcy5jbWFrZQpAQCAtMCwwICsxLDEwNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworc2V0KENNQUtFX0RFQlVHX1BPU1RGSVggImQiIENBQ0hFIFNUUklORyAiU2V0IGRlYnVnIGxpYnJhcnkgcG9zdGZpeCIgRk9SQ0UpCisKKworbWFjcm8oQUREX0xJQlJBUllfVEhSSUZUIG5hbWUpCisKK2lmKFdJVEhfU0hBUkVEX0xJQikKKyAgICBhZGRfbGlicmFyeSgke25hbWV9IFNIQVJFRCAke0FSR059KQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcygke25hbWV9IFBST1BFUlRJRVMKKyAgICAgICAgT1VUUFVUX05BTUUgJHtuYW1lfQorICAgICAgICBWRVJTSU9OICR7dGhyaWZ0X1ZFUlNJT059CisgICAgICAgIFNPVkVSU0lPTiAke3RocmlmdF9WRVJTSU9OfSApCisgICAgI3NldF90YXJnZXRfcHJvcGVydGllcygke25hbWV9IFBST1BFUlRJRVMgUFVCTElDX0hFQURFUiAiJHt0aHJpZnRjcHBfSEVBREVSU30iKQorICAgIGluc3RhbGwoVEFSR0VUUyAke25hbWV9CisgICAgICAgIFJVTlRJTUUgREVTVElOQVRJT04gIiR7QklOX0lOU1RBTExfRElSfSIKKyAgICAgICAgTElCUkFSWSBERVNUSU5BVElPTiAiJHtMSUJfSU5TVEFMTF9ESVJ9IgorICAgICAgICBBUkNISVZFIERFU1RJTkFUSU9OICIke0xJQl9JTlNUQUxMX0RJUn0iCisgICAgICAgIFBVQkxJQ19IRUFERVIgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0iKQorZW5kaWYoKQorCitpZihXSVRIX1NUQVRJQ19MSUIpCisgICAgYWRkX2xpYnJhcnkoJHtuYW1lfV9zdGF0aWMgU1RBVElDICR7QVJHTn0pCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7bmFtZX1fc3RhdGljIFBST1BFUlRJRVMKKyAgICAgICAgT1VUUFVUX05BTUUgJHtuYW1lfSR7U1RBVElDX1BPU1RGSVh9CisgICAgICAgIFZFUlNJT04gJHt0aHJpZnRfVkVSU0lPTn0KKyAgICAgICAgU09WRVJTSU9OICR7dGhyaWZ0X1ZFUlNJT059ICkKKyAgICBpbnN0YWxsKFRBUkdFVFMgJHtuYW1lfV9zdGF0aWMKKyAgICAgICAgUlVOVElNRSBERVNUSU5BVElPTiAiJHtCSU5fSU5TVEFMTF9ESVJ9IgorICAgICAgICBMSUJSQVJZIERFU1RJTkFUSU9OICIke0xJQl9JTlNUQUxMX0RJUn0iCisgICAgICAgIEFSQ0hJVkUgREVTVElOQVRJT04gIiR7TElCX0lOU1RBTExfRElSfSIKKyAgICAgICAgUFVCTElDX0hFQURFUiBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfSIpCitlbmRpZigpCisKK2VuZG1hY3JvKEFERF9MSUJSQVJZX1RIUklGVCkKKworCittYWNybyhUQVJHRVRfSU5DTFVERV9ESVJFQ1RPUklFU19USFJJRlQgbmFtZSkKKworaWYoV0lUSF9TSEFSRURfTElCKQorICAgIHRhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKCR7bmFtZX0gJHtBUkdOfSkKK2VuZGlmKCkKKworaWYoV0lUSF9TVEFUSUNfTElCKQorICAgIHRhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKCR7bmFtZX1fc3RhdGljICR7QVJHTn0pCitlbmRpZigpCisKK2VuZG1hY3JvKFRBUkdFVF9JTkNMVURFX0RJUkVDVE9SSUVTX1RIUklGVCkKKworCittYWNybyhUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUIG5hbWUpCisKK2lmKFdJVEhfU0hBUkVEX0xJQikKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHtuYW1lfSAke0FSR059KQorZW5kaWYoKQorCitpZihXSVRIX1NUQVRJQ19MSUIpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7bmFtZX1fc3RhdGljICR7QVJHTn0pCitlbmRpZigpCisKK2VuZG1hY3JvKFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQpCisKKworbWFjcm8oTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZIHRhcmdldCBsaWJuYW1lKQorCitpZiAoV0lUSF9TSEFSRURfTElCKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke3RhcmdldH0gJHtsaWJuYW1lfSkKK2Vsc2VpZiAoV0lUSF9TVEFUSUNfTElCKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke3RhcmdldH0gJHtsaWJuYW1lfV9zdGF0aWMpCitlbHNlKCkKKyAgICBtZXNzYWdlKEZBVEFMICJOb3QgbGlua2luZyB3aXRoIHNoYXJlZCBvciBzdGF0aWMgbGlicmFyaWVzPyIpCitlbmRpZigpCisKK2VuZG1hY3JvKExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSkKKworCittYWNybyhUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkgdGFyZ2V0IGxpYm5hbWUpCisKK2lmKFdJVEhfU0hBUkVEX0xJQikKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHt0YXJnZXR9ICR7QVJHTn0gJHtsaWJuYW1lfSkKK2VuZGlmKCkKKworaWYoV0lUSF9TVEFUSUNfTElCKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke3RhcmdldH1fc3RhdGljICR7QVJHTn0gJHtsaWJuYW1lfV9zdGF0aWMpCitlbmRpZigpCisKK2VuZG1hY3JvKFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlRfQUdBSU5TVF9USFJJRlRfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL2FuZHJvaWQtdG9vbGNoYWluLmNtYWtlIGIvYnVpbGQvY21ha2UvYW5kcm9pZC10b29sY2hhaW4uY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmM2QwMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL2FuZHJvaWQtdG9vbGNoYWluLmNtYWtlCkBAIC0wLDAgKzEsMjYgQEAKK3NldChBTkRST0lEX05ESyAiL29wdC9hbmRyb2lkLW5kayIgQ0FDSEUpCitzZXQoQU5EUk9JRF9QTEFURk9STSAiYW5kcm9pZC0xNSIgQ0FDSEUpCitzZXQoQU5EUk9JRF9BUkNIICJhcmNoLWFybSIgQ0FDSEUpCitzZXQoQU5EUk9JRF9UT09MX0FSQ0ggImFuZHJvaWQtYXJtIiBDQUNIRSkKK3NldChBTkRST0lEX0NQVSAiYXJtZWFiaS12N2EiIENBQ0hFKQorc2V0KEFORFJPSURfR0NDX1ZFUlNJT04gNC45IENBQ0hFKQorc2V0KEhPU1RfQVJDSCBsaW51eC14ODZfNjQgQ0FDSEUpCisKK3NldChDTUFLRV9TWVNURU1fTkFNRSBBbmRyb2lkKQorc2V0KEFORFJPSURfU1lTUk9PVCAiJHtBTkRST0lEX05ES30vcGxhdGZvcm1zLyR7QU5EUk9JRF9QTEFURk9STX0vJHtBTkRST0lEX0FSQ0h9IikKK3NldChBTkRST0lEX1RSSVBMRVQgYXJtLWxpbnV4LWFuZHJvaWRlYWJpKQorc2V0KEFORFJPSURfU1RMICIke0FORFJPSURfTkRLfS9zb3VyY2VzL2N4eC1zdGwvZ251LWxpYnN0ZCsrLyR7QU5EUk9JRF9HQ0NfVkVSU0lPTn0iKQorCitzZXQoX0NPTVBJTEVSX1JPT1QgJHtBTkRST0lEX05ES30vcHJlYnVpbHQvJHtBTkRST0lEX1RSSVBMRVR9LSR7QU5EUk9JRF9HQ0NfVkVSU0lPTn0vcHJlYnVpbHQvJHtIT1NUX0FSQ0h9KQorc2V0KENNQUtFX0NfQ09NUElMRVIgJHtfQ09NUElMRVJfUk9PVH0vYmluLyR7QU5EUk9JRF9UUklQTEVUfS1nY2MpCitzZXQoQ01BS0VfQ1hDWF9DT01QSUxFUiAke19DT01QSUxFUl9ST09UfS9iaW4vJHtBTkRST0lEX1RSSVBMRVR9LWcrKykKKworaW5jbHVkZV9kaXJlY3RvcmllcygKKyAgICAke0FORFJPSURfU1RMfS9pbmNsdWRlCisgICAgJHtBTkRST0lEX1NUTH0vbGlicy8ke0FORFJPSURfQ1BVfS9pbmNsdWRlKQorCitzZXQoQ01BS0VfRklORF9ST09UX1BBVEggJHtBTkRST0lEX1NZU1JPT1R9KQorCitzZXQoQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9QUk9HUkFNIE5FVkVSKQorc2V0KENNQUtFX0ZJTkRfUk9PVF9QQVRIX01PREVfTElCUkFSWSBPTkxZKQorc2V0KENNQUtFX0ZJTkRfUk9PVF9QQVRIX01PREVfSU5DTFVERSBPTkxZKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvY29uZmlnLmguaW4gYi9idWlsZC9jbWFrZS9jb25maWcuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjBhZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvY29uZmlnLmguaW4KQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyogY29uZmlnLmggZ2VuZXJhdGVkIGJ5IENNYWtlIGZyb20gY29uZmlnLmguaW4gKi8KKworI2lmbmRlZiBDT05GSUdfSAorI2RlZmluZSBDT05GSUdfSAorCisKKy8qIE5hbWUgb2YgcGFja2FnZSAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0UgIiR7UEFDS0FHRX0iCisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICIke1BBQ0tBR0VfQlVHUkVQT1JUfSIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0VfTkFNRSAiJHtQQUNLQUdFX05BTUV9IgorCisvKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjY21ha2VkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICIke1BBQ0tBR0VfVEFSTkFNRX0iCisKKy8qIERlZmluZSB0byB0aGUgaG9tZSBwYWdlIGZvciB0aGlzIHBhY2thZ2UuICovCisjY21ha2VkZWZpbmUgUEFDS0FHRV9VUkwgIiR7UEFDS0FHRV9VUkx9IgorCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiR7UEFDS0FHRV9WRVJTSU9OfSIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1NUUklORyAiJHtQQUNLQUdFX1NUUklOR30iCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBERUZJTkVTICoqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERlZmluZSBpZiB0aGUgQUlfQUREUkNPTkZJRyBzeW1ib2wgaXMgdW5hdmFpbGFibGUgKi8KKyNjbWFrZWRlZmluZSBBSV9BRERSQ09ORklHIDAKKworLyogUG9zc2libGUgdmFsdWUgZm9yIFNJR05FRF9SSUdIVF9TSElGVF9JUyAqLworLyogVE9ETzogVGhpcyBpcyBqdXN0IHNldCB0byAxIGZvciB0aGUgbW9tZW50CisgICBwb3J0IHRoZSBtYWNybyBhY2xvY2FsL2F4X3NpZ25lZF9yaWdodF9zaGlmdC5tNCB0byBDTWFrZSB0byBtYWtlIHRoaXMgd29yayAqLworI2RlZmluZSBBUklUSE1FVElDX1JJR0hUX1NISUZUIDEKKworLyogSW5kaWNhdGVzIHRoZSBlZmZlY3Qgb2YgdGhlIHJpZ2h0IHNoaWZ0IG9wZXJhdG9yIG9uIG5lZ2F0aXZlIHNpZ25lZAorICAgaW50ZWdlcnMgKi8KKy8qIFRPRE86IFRoaXMgaXMganVzdCBzZXQgdG8gMSBmb3IgdGhlIG1vbWVudCAqLworI2RlZmluZSBTSUdORURfUklHSFRfU0hJRlRfSVMgMQorCisvKiBVc2UgKi5oIGV4dGVuc2lvbiBmb3IgcGFyc2VyIGhlYWRlciBmaWxlICovCisvKiBUT0RPOiBUaGlzIG1pZ2h0IG5vdyBiZSBuZWNlc3NhcnkgYW55bW9yZSBhcyBpdCBpcyBzZXQgb25seSBmb3IgYXV0b21ha2UgPCAxLjExCisgICBzZWU6IGFjbG9jYWwvYWNfcHJvZ19iaXNvbi5tNCAqLworI2NtYWtlZGVmaW5lIEJJU09OX1VTRV9QQVJTRVJfSF9FWFRFTlNJT04gMQorCisvKiByZXBsYWNlcyBQT1NJWCBwdGhyZWFkIGJ5IHN0ZDo6dGhyZWFkICovCisjY21ha2VkZWZpbmUgVVNFX1NURF9USFJFQUQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiBzdHJlcnJvcl9yIHJldHVybnMgY2hhciAqLiAqLworI2NtYWtlZGVmaW5lIFNUUkVSUk9SX1JfQ0hBUl9QIDEKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogSEVBREVSIEZJTEVTICoqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8YXJwYS9pbmV0Lmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfQVJQQV9JTkVUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfRkNOVExfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRkYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX05FVERCX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldGluZXQvaW4uaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9ORVRJTkVUX0lOX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHNpZ25hbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NJR05BTF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfVU5JU1REX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHB0aHJlYWQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9QVEhSRUFEX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9pb2N0bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19JT0NUTF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Jlc291cmNlLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1JFU09VUkNFX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zb2NrZXQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfU09DS0VUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3VuLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1VOX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHBvbGwuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9QT0xMX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wb2xsLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1BPTExfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NlbGVjdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19TRUxFQ1RfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfVElNRV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzY2hlZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NDSEVEX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBGVU5DVElPTlMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGhvc3RieW5hbWUnIGZ1bmN0aW9uLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfR0VUSE9TVEJZTkFNRSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0aG9zdGJ5bmFtZV9yJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0dFVEhPU1RCWU5BTUVfUiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZXJyb3JfcicgZnVuY3Rpb24uICovCisjY21ha2VkZWZpbmUgSEFWRV9TVFJFUlJPUl9SIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4JyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NDSEVEX0dFVF9QUklPUklUWV9NQVggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNjaGVkX2dldF9wcmlvcml0eV9taW4nIGZ1bmN0aW9uLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU0NIRURfR0VUX1BSSU9SSVRZX01JTiAxCisKKworLyogRGVmaW5lIHRvIDEgaWYgc3RyZXJyb3JfciByZXR1cm5zIGNoYXIgKi4gKi8KKyNjbWFrZWRlZmluZSBTVFJFUlJPUl9SX0NIQVJfUCAxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvbWluZ3czMi10b29sY2hhaW4uY21ha2UgYi9idWlsZC9jbWFrZS9taW5ndzMyLXRvb2xjaGFpbi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjRjMGViCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvbWluZ3czMi10b29sY2hhaW4uY21ha2UKQEAgLTAsMCArMSwyNCBAQAorIyBDTWFrZSBtaW5ndzMyIGNyb3NzIGNvbXBpbGUgdG9vbGNoYWluIGZpbGUKKworIyB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IG9wZXJhdGluZyBzeXN0ZW0KK1NFVChDTUFLRV9TWVNURU1fTkFNRSBXaW5kb3dzKQorCisjIHdoaWNoIGNvbXBpbGVycyB0byB1c2UgZm9yIEMgYW5kIEMrKworU0VUKENNQUtFX0NfQ09NUElMRVIgaTU4Ni1taW5ndzMybXN2Yy1nY2MpCitTRVQoQ01BS0VfQ1hYX0NPTVBJTEVSIGk1ODYtbWluZ3czMm1zdmMtZysrKQorU0VUKENNQUtFX1JDX0NPTVBJTEVSIGk1ODYtbWluZ3czMm1zdmMtd2luZHJlcykKKworIyBoZXJlIGlzIHRoZSB0YXJnZXQgZW52aXJvbm1lbnQgbG9jYXRlZAorU0VUKENNQUtFX0ZJTkRfUk9PVF9QQVRIIC91c3IvaTU4Ni1taW5ndzMybXN2YykKKworIyBhZGp1c3QgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIHRoZSBGSU5EX1hYWCgpIGNvbW1hbmRzOgorIyBzZWFyY2ggaGVhZGVycyBhbmQgbGlicmFyaWVzIGluIHRoZSB0YXJnZXQgZW52aXJvbm1lbnQsIHNlYXJjaAorIyBwcm9ncmFtcyBpbiB0aGUgaG9zdCBlbnZpcm9ubWVudAorc2V0KENNQUtFX0ZJTkRfUk9PVF9QQVRIX01PREVfUFJPR1JBTSBORVZFUikKK3NldChDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX0xJQlJBUlkgT05MWSkKK3NldChDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX0lOQ0xVREUgT05MWSkKKworc2V0KEJVSUxEX1NIQVJFRF9MSUJTIE9GRikKK1NFVChDTUFLRV9FWEVfTElOS0VSX0ZMQUdTICItc3RhdGljIikKK3NldChDTUFLRV9DX0ZMQUdTICR7Q01BS0VfQ19GTEFHU30gIi1zdGF0aWMtbGliZ2NjIikKK3NldChDTUFLRV9DWFhfRkxBR1MgJHtDTUFLRV9DWFhfRkxBR1N9ICItc3RhdGljLWxpYnN0ZGMrKyIpCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvUkVBRE1FLm1kIGIvYnVpbGQvZG9ja2VyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjZkNjkwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL1JFQURNRS5tZApAQCAtMCwwICsxLDE5OCBAQAorIyBEb2NrZXIgSW50ZWdyYXRpb24gIworCitEdWUgdG8gdGhlIGxhcmdlIG51bWJlciBvZiBsYW5ndWFnZXMgc3VwcG9ydGVkIGJ5IEFwYWNoZSBUaHJpZnQsCitkb2NrZXIgY29udGFpbmVycyBhcmUgdXNlZCB0byBidWlsZCBhbmQgdGVzdCB0aGUgcHJvamVjdCBvbiBhCit2YXJpZXR5IG9mIHBsYXRmb3JtcyB0byBwcm92aWRlIG1heGltdW0gdGVzdCBjb3ZlcmFnZS4KKworIyMgQXBwdmV5b3IgSW50ZWdyYXRpb24gIyMKKworQXQgdGhpcyB0aW1lIHRoZSBBcHB2ZXlvciBzY3JpcHRzIGRvIG5vdCB1c2UgZG9ja2VyIGNvbnRhaW5lcnMuCitPbmNlIE1pY3Jvc29mdCBzdXBwb3J0cyBWaXN1YWwgU3R1ZGlvIEJ1aWxkIFRvb2xzIHJ1bm5pbmcgaW5zaWRlCituYW5vIGNvbnRhaW5lcnMgKGluc3RlYWQgb2YgQ29yZSwgd2hpY2ggaXMgaHVnZSkgdGhlbiB3ZSB3aWxsCitjb25zaWRlciB1c2luZyBjb250YWluZXJzIGZvciB0aGUgV2luZG93cyBidWlsZHMgYXMgd2VsbC4KKworIyMgVHJhdmlzIENJIEludGVncmF0aW9uICMjCisKK1RoZSBUcmF2aXMgQ0kgc2NyaXB0cyB1c2UgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kCitsb2dpYyB0byBkZXRlcm1pbmUgdGhlaXIgYmVoYXZpb3I6CisKKyMjIyBFbnZpcm9ubWVudCBWYXJpYWJsZXMgIyMjCisKK3wgVmFyaWFibGUgfCBEZWZhdWx0IHwgVXNhZ2UgfAorfCAtLS0tLS0tLSB8IC0tLS0tIHwgLS0tLS0tLSB8Cit8IGBESVNUUk9gIHwgYHVidW50dS1iaW9uaWNgIHwgU2V0IGJ5IHZhcmlvdXMgYnVpbGQgam9icyBpbiBgLnRyYXZpcy55bWxgIHRvIHJ1biBidWlsZHMgaW4gZGlmZmVyZW50IGNvbnRhaW5lcnMuICBOb3QgaW50ZW5kZWQgdG8gYmUgc2V0IGV4dGVybmFsbHkufAorfCBgRE9DS0VSX1JFUE9gIHwgYHRocmlmdC90aHJpZnQtYnVpbGRgIHwgVGhlIG5hbWUgb2YgdGhlIERvY2tlciBIdWIgcmVwb3NpdG9yeSB0byBvYnRhaW4gYW5kIHN0b3JlIGRvY2tlciBpbWFnZXMuIHwKK3wgYERPQ0tFUl9VU0VSYCB8IGA8bm9uZT5gIHwgVGhlIERvY2tlciBIdWIgYWNjb3VudCBuYW1lIGNvbnRhaW5pbmcgdGhlIHJlcG9zaXRvcnkuIHwKK3wgYERPQ0tFUl9QQVNTYCB8IGA8bm9uZT5gIHwgVGhlIERvY2tlciBIdWIgYWNjb3VudCBwYXNzd29yZCB0byB1c2Ugd2hlbiBwdXNoaW5nIG5ldyB0YWdzLiB8CisKK0ZvciBleGFtcGxlLCB0aGUgZGVmYXVsdCBkb2NrZXIgaW1hZ2UgdGhhdCBpcyB1c2VkIGluIGJ1aWxkcyBpZiBubyBvdmVycmlkZXMgYXJlIHNwZWNpZmllZCB3b3VsZCBiZTogYHRocmlmdC90aHJpZnQtYnVpbGQ6dWJ1bnR1LWJpb25pY2AKKworIyMjIEZvcmtzICMjIworCitJZiB5b3UgaGF2ZSBmb3JrZWQgdGhlIEFwYWNoZSBUaHJpZnQgcmVwb3NpdG9yeSBhbmQgeW91IHdvdWxkIGxpa2UKK3RvIHVzZSB5b3VyIG93biBEb2NrZXIgSHViIGFjY291bnQgdG8gc3RvcmUgdGhyaWZ0IGJ1aWxkIGltYWdlcywKK3lvdSBjYW4gdXNlIHRoZSBUcmF2aXMgQ0kgd2ViIGludGVyZmFjZSB0byBzZXQgdGhlIGBET0NLRVJfVVNFUmAsCitgRE9DS0VSX1BBU1NgLCBhbmQgYERPQ0tFUl9SRVBPYCB2YXJpYWJsZXMgaW4gYSBzZWN1cmUgbWFubmVyLgorWW91ciBmb3JrIGJ1aWxkcyB3aWxsIHRoZW4gcHVsbCwgcHVzaCwgYW5kIHRhZyB0aGUgZG9ja2VyIGltYWdlcworaW4geW91ciBhY2NvdW50LgorCisjIyMgTG9naWMgIyMjCisKK1RoZSBUcmF2aXMgQ0kgYnVpbGQgcnVucyBpbiB0d28gcGhhc2VzIC0gZmlyc3QgdGhlIGRvY2tlciBpbWFnZXMgYXJlIHJlYnVpbHQKK2ZvciBlYWNoIG9mIHRoZSBzdXBwb3J0ZWQgY29udGFpbmVycyBpZiB0aGV5IGRvIG5vdCBtYXRjaCB0aGUgRG9ja2VyZmlsZSB0aGF0Cit3YXMgdXNlZCB0byBidWlsZCB0aGUgbW9zdCByZWNlbnQgdGFnLiAgSWYgYSBgRE9DS0VSX1BBU1NgIGVudmlyb25tZW50Cit2YXJpYWJsZSBpcyBzcGVjaWZpZWQsIHRoZSBkb2NrZXIgc3RhZ2UgYnVpbGRzIHdpbGwgYXR0ZW1wdCB0byBsb2cgaW50bworRG9ja2VyIEh1YiBhbmQgcHVzaCB0aGUgcmVzdWx0aW5nIHRhZ3MuCisKKyMjIFN1cHBvcnRlZCBDb250YWluZXJzICMjCisKK1RoZSBUcmF2aXMgQ0kgKGNvbnRpbnVvdXMgaW50ZWdyYXRpb24pIGJ1aWxkcyB1c2UgdGhlIFVidW50dSBCaW9uaWMKKygxOC4wNCBMVFMpIGFuZCBYZW5pYWwgKDE2LjA0IExUUykgaW1hZ2VzIHRvIG1heGltaXplIGxhbmd1YWdlIGxldmVsCitjb3ZlcmFnZS4KKworIyMjIFVidW50dSAjIyMKKworKiBiaW9uaWMgKHN0YWJsZSwgY3VycmVudCkKKyogYXJ0ZnVsIChwcmV2aW91cyBzdGFibGUpCisqIHhlbmlhbCAobGVnYWN5KQorCisjIyBVbnN1cHBvcnRlZCBDb250YWluZXJzICMjCisKK1RoZXNlIGNvbnRhaW5lcnMgbWF5IGJlIGluIHZhcmlvdXMgc3RhdGVzLCBhbmQgbWF5IG5vdCBidWlsZCBldmVyeXRoaW5nLgorVGhleSBjYW4gYmUgZm91bmQgaW4gdGhlIGBvbGQvYCBzdWJkaXJlY3RvcnkuCisKKyMjIyBDZW50T1MgIyMjCisqIDcuMworICAqIG1ha2UgY2hlY2sgaW4gbGliL3B5IG1heSBoYW5nIGluIHRlc3Rfc3Nsc29ja2V0IC0gcm9vdCBjYXVzZSB1bmtub3duCisKKyMjIyBEZWJpYW4gIyMjCisKKyogamVzc2llCisqIHN0cmV0Y2gKKyAgKiBtYWtlIGNoZWNrIGluIGxpYi9jcHAgZmFpbHMgZHVlIHRvIGh0dHBzOi8vc3ZuLmJvb3N0Lm9yZy90cmFjMTAvdGlja2V0LzEyNTA3CisKKyMjIEJ1aWxkaW5nIGxpa2UgVHJhdmlzIENJIGRvZXMsIGxvY2FsbHkgIyMKKworV2UgcmVjb21tZW5kIHlvdSBidWlsZCBsb2NhbGx5IHRoZSBzYW1lIHdheSBUcmF2aXMgQ0kgZG9lcywgc28gdGhhdCB3aGVuIHlvdQorc3VibWl0IHlvdXIgcHVsbCByZXF1ZXN0IHlvdSB3aWxsIHJ1biBpbnRvIGZld2VyIHN1cnByaXNlcy4gIFRvIG1ha2UgaXQgYQorbGl0dGxlIGVhc2llciwgcHV0IHRoZSBmb2xsb3dpbmcgaW50byB5b3VyIGB+Ly5iYXNoX2FsaWFzZXNgIGZpbGU6CisKKyAgICAjIEtpbGwgYWxsIHJ1bm5pbmcgY29udGFpbmVycy4KKyAgICBhbGlhcyBkb2NrZXJraWxsYWxsPSdkb2NrZXIga2lsbCAkKGRvY2tlciBwcyAtcSknCisKKyAgICAjIERlbGV0ZSBhbGwgc3RvcHBlZCBjb250YWluZXJzLgorICAgIGFsaWFzIGRvY2tlcmNsZWFuYz0ncHJpbnRmICJcbj4+PiBEZWxldGluZyBzdG9wcGVkIGNvbnRhaW5lcnNcblxuIiAmJiBkb2NrZXIgcm0gJChkb2NrZXIgcHMgLWEgLXEpJworCisgICAgIyBEZWxldGUgYWxsIHVudGFnZ2VkIGltYWdlcy4KKyAgICBhbGlhcyBkb2NrZXJjbGVhbmk9J3ByaW50ZiAiXG4+Pj4gRGVsZXRpbmcgdW50YWdnZWQgaW1hZ2VzXG5cbiIgJiYgZG9ja2VyIHJtaSAkKGRvY2tlciBpbWFnZXMgLXEgLWYgZGFuZ2xpbmc9dHJ1ZSknCisKKyAgICAjIERlbGV0ZSBhbGwgc3RvcHBlZCBjb250YWluZXJzIGFuZCB1bnRhZ2dlZCBpbWFnZXMuCisgICAgYWxpYXMgZG9ja2VyY2xlYW49J2RvY2tlcmNsZWFuYyB8fCB0cnVlICYmIGRvY2tlcmNsZWFuaScKKworICAgICMgQnVpbGQgYSB0aHJpZnQgZG9ja2VyIGltYWdlIChydW4gZnJvbSB0b3AgbGV2ZWwgb2YgZ2l0IHJlcG8pOiBhcmd1bWVudCAjMSBpcyBpbWFnZSB0eXBlICh1YnVudHUsIGNlbnRvcywgZXRjKS4KKyAgICBmdW5jdGlvbiBkb2NrZXJidWlsZAorICAgIHsKKyAgICAgIGRvY2tlciBidWlsZCAtdCAkMSBidWlsZC9kb2NrZXIvJDEKKyAgICB9CisKKyAgICAjIFJ1biBhIHRocmlmdCBkb2NrZXIgaW1hZ2U6IGFyZ3VtZW50ICMxIGlzIGltYWdlIHR5cGUgKHVidW50dSwgY2VudG9zLCBldGMpLgorICAgIGZ1bmN0aW9uIGRvY2tlcnJ1bgorICAgIHsKKyAgICAgIGRvY2tlciBydW4gLXYgJChwd2QpOi90aHJpZnQvc3JjIC1pdCAkMSAvYmluL2Jhc2gKKyAgICB9CisKK1RoZW4sIHRvIHB1bGwgZG93biB0aGUgY3VycmVudCBpbWFnZSBiZWluZyB1c2VkIHRvIGJ1aWxkICh0aGUgc2FtZSB3YXkKK1RyYXZpcyBDSSBkb2VzIGl0KSAtIGlmIGl0IGlzIG91dCBvZiBkYXRlIGluIGFueSB3YXkgaXQgd2lsbCBidWlsZCBhCituZXcgb25lIGZvciB5b3U6CisKKyAgICB0aHJpZnQkIERPQ0tFUl9SRVBPPXRocmlmdC90aHJpZnQtYnVpbGQgRElTVFJPPXVidW50dS1iaW9uaWMgYnVpbGQvZG9ja2VyL3JlZnJlc2guc2gKKworVG8gcnVuIGFsbCB1bml0IHRlc3RzIChqdXN0IGxpa2UgVHJhdmlzIENJIGRvZXMpOgorCisgICAgdGhyaWZ0JCBkb2NrZXJydW4gdWJ1bnR1LWJpb25pYworICAgIHJvb3RAOGNhZjU2YjBjZTdiOi90aHJpZnQvc3JjIyBidWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2gKKworVG8gcnVuIHRoZSBjcm9zcyB0ZXN0cyAoanVzdCBsaWtlIFRyYXZpcyBDSSBkb2VzKToKKworICAgIHRocmlmdCQgZG9ja2VycnVuIHVidW50dS1iaW9uaWMKKyAgICByb290QDhjYWY1NmIwY2U3YjovdGhyaWZ0L3NyYyMgYnVpbGQvZG9ja2VyL3NjcmlwdHMvY3Jvc3MtdGVzdC5zaAorCitXaGVuIHlvdSBhcmUgZG9uZSwgeW91IHdhbnQgdG8gY2xlYW4gdXAgb2NjYXNpb25hbGx5IHNvIHRoYXQgZG9ja2VyIGlzbid0IHVzaW5nIGxvdHMgb2YgZXh0cmEgZGlzayBzcGFjZToKKworICAgIHRocmlmdCQgZG9ja2VyY2xlYW4KKworWW91IG5lZWQgdG8gcnVuIHRoZSBkb2NrZXIgY29tbWFuZHMgZnJvbSB0aGUgcm9vdCBvZiB0aGUgbG9jYWwgY2xvbmUgb2YgdGhlCit0aHJpZnQgZ2l0IHJlcG9zaXRvcnkgZm9yIHRoZW0gdG8gd29yay4KKworV2hlbiB5b3UgYXJlIGRvbmUgaW4gdGhlIHJvb3QgZG9ja2VyIHNoZWxsIHlvdSBjYW4gYGV4aXRgIHRvIGdvIGJhY2sgdG8KK3lvdXIgdXNlciBob3N0IHNoZWxsLiAgT25jZSB0aGUgdW5pdCB0ZXN0cyBhbmQgY3Jvc3MgdGVzdCBwYXNzZXMgbG9jYWxseSwKK3N1Ym1pdCB0aGUgY2hhbmdlcywgYW5kIGlmIGRlc2lyZWQgc3F1YXNoIHRoZSBwdWxsIHJlcXVlc3QgdG8gb25lIGNvbW1pdAordG8gbWFrZSBpdCBlYXNpZXIgdG8gbWVyZ2UgKHRoZSBjb21taXR0ZXJzIGNhbiBzcXVhc2ggYXQgY29tbWl0IHRpbWUgbm93Cit0aGF0IEdpdEh1YiBpcyB0aGUgbWFzdGVyIHJlcG9zaXRvcnkpLiAgTm93IHlvdSBhcmUgYnVpbGRpbmcgbGlrZSBUcmF2aXMgQ0kgZG9lcyEKKworIyMgUmF3IENvbW1hbmRzIGZvciBCdWlsZGluZyB3aXRoIERvY2tlciAjIworCitJZiB5b3UgZG8gbm90IHdhbnQgdG8gdXNlIHRoZSBzYW1lIHNjcmlwdHMgVHJhdmlzIENJIGRvZXMsIHlvdSBjYW4gZG8gaXQgbWFudWFsbHk6CisKK0J1aWxkIHRoZSBpbWFnZToKKworICAgIHRocmlmdCQgZG9ja2VyIGJ1aWxkIC10IHRocmlmdCBidWlsZC9kb2NrZXIvdWJ1bnR1LWJpb25pYworCitPcGVuIGEgY29tbWFuZCBwcm9tcHQgaW4gdGhlIGltYWdlOgorCisgICAgdGhyaWZ0JCBkb2NrZXIgcnVuIC12ICQocHdkKTovdGhyaWZ0L3NyYyAtaXQgdGhyaWZ0IC9iaW4vYmFzaAorCisjIyBDb3JlIFRvb2wgVmVyc2lvbnMgcGVyIERvY2tlcmZpbGUgIyMKKworTGFzdCB1cGRhdGVkOiBPY3RvYmVyIDEsIDIwMTcKKworfCBUb29sICAgICAgfCB1YnVudHUteGVuaWFsIHwgdWJ1bnR1LWJpb25pYyB8IE5vdGVzIHwKK3wgOi0tLS0tLS0tIHwgOi0tLS0tLS0tLS0tLSB8IDotLS0tLS0tLS0tLS0gfCA6LS0tLSB8Cit8IGFudCAgICAgICB8IDEuOS42ICAgICAgICAgfCAxLjEwLjMgICAgICAgIHwgICAgICAgfAorfCBhdXRvY29uZiAgfCAyLjY5ICAgICAgICAgIHwgMi42OSAgICAgICAgICB8ICAgICAgIHwKK3wgYXV0b21ha2UgIHwgMS4xNSAgICAgICAgICB8IDEuMTUuMSAgICAgICAgfCAgICAgICB8Cit8IGJpc29uICAgICB8IDMuMC40ICAgICAgICAgfCAzLjAuNCAgICAgICAgIHwgICAgICAgfAorfCBib29zdCAgICAgfCAxLjU4LjAgICAgICAgIHwgMS42NS4xICAgICAgICB8ICAgICAgIHwKK3wgY21ha2UgICAgIHwgMy41LjEgICAgICAgICB8IDMuMTAuMiAgICAgICAgfCAgICAgICB8Cit8IGNwcGNoZWNrICB8IDEuNzIgICAgICAgICAgfCAxLjgyICAgICAgICAgIHwgICAgICAgfAorfCBmbGV4ICAgICAgfCAyLjYuMCAgICAgICAgIHwgMi42LjQgICAgICAgICB8ICAgICAgIHwKK3wgbGliYzYgICAgIHwgMi4yMyAgICAgICAgICB8IDIuMjcgICAgICAgICAgfCBnbGliYyB8Cit8IGxpYmV2ZW50ICB8IDIuMC4yMSAgICAgICAgfCAyLjEuOCAgICAgICAgIHwgICAgICAgfAorfCBsaWJzdGRjKysgfCA1LjQuMCAgICAgICAgIHwgNy4zLjAgICAgICAgICB8ICAgICAgIHwKK3wgbWFrZSAgICAgIHwgNC4xICAgICAgICAgICB8IDQuMSAgICAgICAgICAgfCAgICAgICB8Cit8IG9wZW5zc2wgICB8IDEuMC4yZyAgICAgICAgfCAxLjEuMGcgICAgICAgIHwgICAgICAgfAorfCBxdDUgICAgICAgfCA1LjUuMSAgICAgICAgIHwgNS45LjUgICAgICAgICB8ICAgICAgIHwKKworIyMgQ29tcGlsZXIvTGFuZ3VhZ2UgVmVyc2lvbnMgcGVyIERvY2tlcmZpbGUgIyMKKworfCBMYW5ndWFnZSAgfCB1YnVudHUteGVuaWFsIHwgdWJ1bnR1LWJpb25pYyB8IE5vdGVzIHwKK3wgOi0tLS0tLS0tIHwgOi0tLS0tLS0tLS0tLSB8IDotLS0tLS0tLS0tLS0gfCA6LS0tLSB8Cit8IGFzIG9mICAgICB8IE1hciAwNiwgMjAxOCAgfCBKYW4gNCwgMjAxOSAgIHwgICAgICAgfAorfCBhczMgICAgICAgfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8IE5vdCBpbiBDSSB8Cit8IEMrKyBnY2MgICB8IDUuNC4wICAgICAgICAgfCA3LjMuMCAgICAgICAgIHwgICAgICAgfAorfCBDKysgY2xhbmcgfCAzLjggICAgICAgICAgIHwgNi4wICAgICAgICAgICB8ICAgICAgIHwKK3wgQyMgKG1vbm8pIHwgNC4yLjEuMCAgICAgICB8IDQuNi4yLjcgICAgICAgfCAgICAgICB8Cit8IGNfZ2xpYiAgICB8IDIuNDguMiAgICAgICAgfCAyLjU2LjAgICAgICAgIHwgICAgICAgfAorfCBjbCAoc2JjbCkgfCAgICAgICAgICAgICAgIHwgMS40LjE1ICAgICAgICB8ICAgICAgIHwKK3wgY29jb2EgICAgIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCBOb3QgaW4gQ0kgfAorfCBkICAgICAgICAgfCAyLjA3NS4xICAgICAgIHwgMi4wODMuMSAgICAgICB8ICAgICAgIHwKK3wgZGFydCAgICAgIHwgMS4yMi4xICAgICAgICB8IDEuMjQuMyAgICAgICAgfCAgICAgICB8Cit8IGRlbHBoaSAgICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgTm90IGluIENJIHwKK3wgZG90bmV0ICAgIHwgMi4xLjQgICAgICAgICB8IDIuMi4xMDEgICAgICAgfCAgICAgICB8Cit8IGVybGFuZyAgICB8IDE4LjMgICAgICAgICAgfCAyMC4yLjIgICAgICAgIHwgICAgICAgfAorfCBnbyAgICAgICAgfCAxLjcuNiAgICAgICAgIHwgMS4xMS40ICAgICAgICB8ICAgICAgIHwKK3wgaGFza2VsbCAgIHwgNy4xMC4zICAgICAgICB8IDguMC4yICAgICAgICAgfCAgICAgICB8Cit8IGhheGUgICAgICB8IDMuMi4xICAgICAgICAgfCAzLjQuNCAgICAgICAgIHwgVEhSSUZULTQzNTI6IGF2b2lkIDMuNC4yIHwKK3wgamF2YSAgICAgIHwgMS44LjBfMTUxICAgICB8IDEuOC4wXzE5MSAgICAgfCAgICAgICB8Cit8IGpzICAgICAgICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgVW5zdXJlIGhvdyB0byBsb29rIGZvciB2ZXJzaW9uIGluZm8/IHwKK3wgbHVhICAgICAgIHwgNS4yLjQgICAgICAgICB8IDUuMi40ICAgICAgICAgfCBMdWEgNS4zOiBzZWUgVEhSSUZULTQzODYgfAorfCBub2RlanMgICAgfCA2LjEzLjAgICAgICAgIHwgOC4xNS4wICAgICAgICB8ICAgICAgIHwKK3wgb2NhbWwgICAgIHwgICAgICAgICAgICAgICB8IDQuMDUuMCAgICAgICAgfCBUSFJJRlQtNDUxNzogb2NhbWwgNC4wMi4zIG9uIHhlbmlhbCBhcHBlYXJzIGJyb2tlbiB8Cit8IHBlcmwgICAgICB8IDUuMjIuMSAgICAgICAgfCA1LjI2LjEgICAgICAgIHwgICAgICAgfAorfCBwaHAgICAgICAgfCA3LjAuMjIgICAgICAgIHwgNy4yLjEwICAgICAgICB8ICAgICAgIHwKK3wgcHl0aG9uICAgIHwgMi43LjEyICAgICAgICB8IDIuNy4xNXJjMSAgICAgfCAgICAgICB8Cit8IHB5dGhvbjMgICB8IDMuNS4yICAgICAgICAgfCAzLjYuNyAgICAgICAgIHwgICAgICAgfAorfCBydWJ5ICAgICAgfCAyLjMuMXAxMTIgICAgIHwgMi41LjFwNTcgICAgICB8ICAgICAgIHwKK3wgcnVzdCAgICAgIHwgMS4xNy4wICAgICAgICB8IDEuMzAuMCAgICAgICAgfCAgICAgICB8Cit8IHNtYWxsdGFsayB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgTm90IGluIENJIHwKK3wgc3dpZnQgICAgIHwgICAgICAgICAgICAgICB8IDQuMi4xICAgICAgICAgfCAgICAgICB8CmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvb2xkL1ZhZ3JhbnRmaWxlIGIvYnVpbGQvZG9ja2VyL29sZC9WYWdyYW50ZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWFjNmU2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL29sZC9WYWdyYW50ZmlsZQpAQCAtMCwwICsxLDU5IEBACisjIC0qLSBtb2RlOiBydWJ5IC0qLQorIyB2aTogc2V0IGZ0PXJ1YnkgOgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEJhc2Ugc3lzdGVtIGJvb3RzdHJhcCBzY3JpcHQKKyRib290c3RyYXBfc2NyaXB0ID0gPDxfX0JPT1RTVFJBUF9fCitlY2hvICJQcm92aXNpb25pbmcgZGVmYXVsdHMiCisKK3N1ZG8gYXB0LWdldCB1cGRhdGUgLXkKK3N1ZG8gYXB0LWdldCB1cGdyYWRlIC15CisKKyMgSW5zdGFsbCBkZWZhdWx0IHBhY2thZ2VzCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAteSBidWlsZC1lc3NlbnRpYWwgY3VybCBnaXQKKworIyBJbnN0YWxsIGxhdGVzdCBEb2NrZXIgdmVyc2lvbgorc3VkbyBjdXJsIC1zU0wgaHR0cHM6Ly9nZXQuZG9ja2VyLmlvL2dwZyB8IHN1ZG8gYXB0LWtleSBhZGQgLQorc3VkbyBlY2hvICJkZWIgaHR0cDovL2dldC5kb2NrZXIuaW8vdWJ1bnR1IGRvY2tlciBtYWluIiA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RvY2tlci5saXN0CitzdWRvIGFwdC1nZXQgdXBkYXRlIC15CitzdWRvIGFwdC1nZXQgaW5zdGFsbCAteSBsaW51eC1pbWFnZS1leHRyYS1gdW5hbWUgLXJgIGF1ZnMtdG9vbHMKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC15IGx4Yy1kb2NrZXIKKworZWNobyAiRmluaXNoZWQgcHJvdmlzaW9uaW5nIGRlZmF1bHRzIgorX19CT09UU1RSQVBfXworCitWYWdyYW50LmNvbmZpZ3VyZSgiMiIpIGRvIHxjb25maWd8CisgIGNvbmZpZy52bS5ib3ggPSAidHJ1c3R5NjQiCisgIGNvbmZpZy52bS5ib3hfdXJsID0gImh0dHBzOi8vY2xvdWQtaW1hZ2VzLnVidW50dS5jb20vdmFncmFudC90cnVzdHkvY3VycmVudC90cnVzdHktc2VydmVyLWNsb3VkaW1nLWFtZDY0LXZhZ3JhbnQtZGlzazEuYm94IgorICBjb25maWcuc3NoLmZvcndhcmRfYWdlbnQgPSB0cnVlCisKKyAgY29uZmlnLnZtLnByb3ZpZGVyIDp2aXJ0dWFsYm94IGRvIHx2Ym94fAorICAgIHZib3guY3VzdG9taXplIFsibW9kaWZ5dm0iLCA6aWQsICItLW1lbW9yeSIsICIxMDI0Il0KKyAgICB2Ym94LmN1c3RvbWl6ZSBbIm1vZGlmeXZtIiwgOmlkLCAiLS1jcHVzIiwgIjIiXQorICBlbmQKKworICAjIFNldHVwIHRoZSBkZWZhdWx0IGJvb3RzdHJhcCBzY3JpcHQgZm9yIG91ciB1YnVudHUgYmFzZSBib3ggaW1hZ2UKKyAgY29uZmlnLnZtLnByb3Zpc2lvbiAic2hlbGwiLCBpbmxpbmU6ICRib290c3RyYXBfc2NyaXB0CisKKyAgIyBTZXR1cCB0aGUgY3VzdG9tIGRvY2tlciBpbWFnZSBmcm9tIG91ciBVYnVudHUgRG9ja2VyZmlsZQorICBjb25maWcudm0ucHJvdmlzaW9uICJkb2NrZXIiIGRvIHxkfAorICAgIGQuYnVpbGRfaW1hZ2UgIi92YWdyYW50L3VidW50dSIsIGFyZ3M6ICItdCB0aHJpZnQiCisgIGVuZAorCisgICMgU2V0dXAgdGhlIGN1c3RvbSBkb2NrZXIgaW1hZ2UgZnJvbSBvdXIgQ2VudG9zIERvY2tlcmZpbGUKKyAgI2NvbmZpZy52bS5wcm92aXNpb24gImRvY2tlciIgZG8gfGR8CisgICMgIGQuYnVpbGRfaW1hZ2UgIi92YWdyYW50L2NlbnRvcyIsIGFyZ3M6ICItdCB0aHJpZnQtY2VudG9zIgorICAjZW5kCisKK2VuZApkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL29sZC9jZW50b3MtNy4zL0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvb2xkL2NlbnRvcy03LjMvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTZiYmFhCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL29sZC9jZW50b3MtNy4zL0RvY2tlcmZpbGUKQEAgLTAsMCArMSwxOTkgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgQ2VudE9TCisjCisjIEtub3duIG1pc3NpbmcgY2xpZW50IGxpYnJhcmllczoKKyMgIC0gZG90bmV0ICh3aWxsIHVwZGF0ZSB0byAyLjAuMCBzZXBhcmF0ZWx5KQorIyAgLSBoYXhlIChub3QgaW4gY2VudG9zKQorCitGUk9NIGNlbnRvczo3LjMuMTYxMQorTUFJTlRBSU5FUiBBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CisKK1JVTiB5dW0gaW5zdGFsbCAteSBlcGVsLXJlbGVhc2UKKworIyBHZW5lcmFsIGRlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIGF1dG9jb25mIFwKKyAgICAgIGJpc29uIFwKKyAgICAgIGJpc29uLWRldmVsIFwKKyAgICAgIGNsYW5nIFwKKyAgICAgIGNsYW5nLWFuYWx5emVyIFwKKyAgICAgIGNtYWtlMyBcCisgICAgICBjdXJsIFwKKyAgICAgIGZsZXggXAorICAgICAgZ2NjIFwKKyAgICAgIGdjYy1jKysgXAorICAgICAgZ2RiIFwKKyAgICAgIGdpdCBcCisgICAgICBsaWJ0b29sIFwKKyAgICAgIG00IFwKKyAgICAgIG1ha2UgXAorICAgICAgdGFyIFwKKyAgICAgIHVuemlwIFwKKyAgICAgIHZhbGdyaW5kIFwKKyAgICAgIHdnZXQgJiYgXAorICAgICAgbG4gLXMgL3Vzci9iaW4vY21ha2UzIC91c3IvYmluL2NtYWtlICYmIFwKKyAgICAgIGxuIC1zIC91c3IvYmluL2NwYWNrMyAvdXNyL2Jpbi9jcGFjayAmJiBcCisgICAgICBsbiAtcyAvdXNyL2Jpbi9jdGVzdDMgL3Vzci9iaW4vY3Rlc3QKKworIyBDKysgZGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgYm9vc3QtZGV2ZWwtc3RhdGljIFwKKyAgICAgIHpsaWItZGV2ZWwgXAorICAgICAgb3BlbnNzbC1kZXZlbCBcCisgICAgICBsaWJldmVudC1kZXZlbCAmJiBcCisgICAgY2QgL3Vzci9saWI2NCAmJiBcCisgICAgbG4gLXMgbGliYm9vc3RfdGhyZWFkLW10LmEgbGliYm9vc3RfdGhyZWFkLmEKKworIyBDIyBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBtb25vLWNvcmUgXAorICAgICAgbW9uby1kZXZlbCBcCisgICAgICBtb25vLXdlYi1kZXZlbCBcCisgICAgICBtb25vLWV4dHJhcworCisjIEQgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgaHR0cDovL2Rvd25sb2Fkcy5kbGFuZy5vcmcvcmVsZWFzZXMvMi54LzIuMDc2LjAvZG1kLTIuMDc2LjAtMC5mZWRvcmEueDg2XzY0LnJwbSB4ZGctdXRpbHMKK1JVTiBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL29wZW5zc2wvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3MvbGliZXZlbnQvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIG1rZGlyIC1wIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcyAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvZGVpbW9zLyogb3BlbnNzbC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL0MvKiBvcGVuc3NsLW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBsaWJldmVudC1tYXN0ZXIgb3BlbnNzbC1tYXN0ZXIKKworIyBEYXJ0CitSVU4gY2QgL3Vzci9sb2NhbCAmJiBcCisgICAgd2dldCAtcSBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZGFydC1hcmNoaXZlL2NoYW5uZWxzL3N0YWJsZS9yZWxlYXNlLzEuMjQuMi9zZGsvZGFydHNkay1saW51eC14NjQtcmVsZWFzZS56aXAgJiYgXAorICAgIHVuemlwIC1xIGRhcnRzZGstbGludXgteDY0LXJlbGVhc2UuemlwICYmIFwKKyAgICBybSBkYXJ0c2RrLWxpbnV4LXg2NC1yZWxlYXNlLnppcAorRU5WIFBBVEggL3Vzci9sb2NhbC9kYXJ0LXNkay9iaW46JFBBVEgKKworIyBFcmxhbmcgRGVwZW5kZW5jaWVzCitSVU4gY3VybCAtc1NMIGh0dHA6Ly9wYWNrYWdlcy5lcmxhbmctc29sdXRpb25zLmNvbS9ycG0vY2VudG9zL2VybGFuZ19zb2x1dGlvbnMucmVwbyAtbyAvZXRjL3l1bS5yZXBvcy5kL2VybGFuZ19zb2x1dGlvbnMucmVwbyAmJiBcCisgICAgeXVtIGluc3RhbGwgLXkgXAorICAgICAgZXJsYW5nLWtlcm5lbCBcCisgICAgICBlcmxhbmctZXJ0cyBcCisgICAgICBlcmxhbmctc3RkbGliIFwKKyAgICAgIGVybGFuZy1ldW5pdCBcCisgICAgICBlcmxhbmctcmViYXIgXAorICAgICAgZXJsYW5nLXRvb2xzCisKKyMgR0xpYkMgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgZ2xpYjItZGV2ZWwKKworIyBHbyBEZXBlbmRlbmNpZXMKK1JVTiBjdXJsIC1zU0wgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2dvbGFuZy9nbzEuOS5saW51eC1hbWQ2NC50YXIuZ3ogfCB0YXIgLUMgL3Vzci9sb2NhbC8gLXh6CitFTlYgUEFUSCAvdXNyL2xvY2FsL2dvL2JpbjokUEFUSAorCisjIEhhc2tlbGwgRGVwZW5kZW5jaWVzCitSVU4geXVtIC15IGluc3RhbGwgaGFza2VsbC1wbGF0Zm9ybQorCisjIEhheGUgRGVwZW5kZW5jaWVzCisjIE5vdCBpbiBkZWJpYW4vc3RyZXRjaAorCisjIEphdmEgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgYW50IFwKKyAgICAgIGp1bml0IFwKKyAgICAgIGFudC1qdW5pdCBcCisgICAgICBqYXZhLTEuOC4wLW9wZW5qZGstZGV2ZWwKKworIyBMdWEgRGVwZW5kZW5jaWVzCisjIEx1YSBpbiBlcGVsIGlzIHRvbyBvbGQgKDUuMS40LCBuZWVkIDUuMikgc28gd2UgZ2V0IHRoZSBsYXRlc3QKK1JVTiB5dW0gaW5zdGFsbCAteSByZWFkbGluZS1kZXZlbCAmJiBcCisgICAgd2dldCAtcSBodHRwOi8vd3d3Lmx1YS5vcmcvZnRwL2x1YS01LjMuNC50YXIuZ3ogJiYgXAorICAgIHRhciB4emYgbHVhLTUuMy40LnRhci5neiAmJiBcCisgICAgY2QgbHVhLTUuMy40ICYmIFwKKyAgICBzZWQgLWkgJ3MvQ0ZMQUdTPSAvQ0ZMQUdTPSAtZlBJQyAvZycgc3JjL01ha2VmaWxlICYmIFwKKyAgICBtYWtlIGxpbnV4ICYmIFwKKyAgICBtYWtlIGluc3RhbGwgJiYgXAorICAgIGNkIC4uICYmIFwKKyAgICBybSAtcmYgbHVhLTUqCisKKyMgTWluR1cgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgbWluZ3czMi1iaW51dGlscyBcCisgICAgICBtaW5ndzMyLWNydCBcCisgICAgICBtaW5ndzMyLW5zaXMKKworIyBOb2RlLmpzIERlcGVuZGVuY2llcworIyBXb3JrIGFyb3VuZCBlcGVsIGlzc3VlIHdoZXJlIHRoZXkgcmVtb3ZlZCBodHRwLXBhcnNlciB0aGF0IG5vZGVqcyBkZXBlbmRzIG9uIQorUlVOIHl1bSAteSBpbnN0YWxsIGh0dHBzOi8vb3BlbnNvdXJjZS5lbmRhLmV1L3BhY2thZ2VzL2h0dHAtcGFyc2VyLTIuNy4xLTMuZWw3Lng4Nl82NC5ycG0KK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBub2RlanMgXAorICAgICAgbnBtCisKKyMgT2NhbWwgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgb2NhbWwgXAorICAgICAgb2NhbWwtb2NhbWxkb2MgJiYgXAorICAgIHdnZXQgLXEgaHR0cHM6Ly9yYXcuZ2l0aHViLmNvbS9vY2FtbC9vcGFtL21hc3Rlci9zaGVsbC9vcGFtX2luc3RhbGxlci5zaCAtTyAtIHwgc2ggLXMgL3Vzci9sb2NhbC9iaW4gJiYgXAorICAgIG9wYW0gaW5pdCAtLXllcyAmJiBcCisgICAgb3BhbSBpbnN0YWxsIC0teWVzIG9hc2lzICYmIFwKKyAgICBlY2hvICcuIC9yb290Ly5vcGFtL29wYW0taW5pdC9pbml0LnNoID4gL2Rldi9udWxsIDI+IC9kZXYvbnVsbCB8fCB0cnVlJyA+PiB+Ly5iYXNocmMKKworIyBQZXJsIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIHBlcmwgXAorICAgICAgcGVybC12ZXJzaW9uIFwKKyAgICAgIHBlcmwtQml0LVZlY3RvciBcCisgICAgICBwZXJsLUNsYXNzLUFjY2Vzc29yIFwKKyAgICAgIHBlcmwtRXh0VXRpbHMtTWFrZU1ha2VyIFwKKyAgICAgIHBlcmwtVGVzdC1TaW1wbGUgXAorICAgICAgcGVybC1JTy1Tb2NrZXQtU1NMIFwKKyAgICAgIHBlcmwtTmV0LVNTTGVheSBcCisgICAgICBwZXJsLUNyeXB0LVNTTGVheQorCisjIFBIUCBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBwaHAgXAorICAgICAgcGhwLWRldmVsIFwKKyAgICAgIHBocC1wZWFyIFwKKyAgICAgIHJlMmMgXAorICAgICAgcGhwLXBocHVuaXQtUEhQVW5pdCBcCisgICAgICBiemlwMgorCisjIFB5dGhvbiBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBweXRob24gXAorICAgICAgcHl0aG9uLWRldmVsIFwKKyAgICAgIHB5dGhvbi1waXAgXAorICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uMzQgXAorICAgICAgcHl0aG9uMzQtZGV2ZWwgXAorICAgICAgcHl0aG9uMzQtcGlwIFwKKyAgICAgIHB5dGhvbjM0LXNldHVwdG9vbHMKK1JVTiBwaXAyIGluc3RhbGwgLS11cGdyYWRlIHBpcAorUlVOIHBpcDIgaW5zdGFsbCAtLXVwZ3JhZGUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBpcGFkZHJlc3Mgc2V0dXB0b29scyBzaXggdG9ybmFkbyB0b3JuYWRvLXRlc3RpbmcgdHdpc3RlZCB2aXJ0dWFsZW52IHpvcGUtaW50ZXJmYWNlCitSVU4gcGlwMyBpbnN0YWxsIC0tdXBncmFkZSBwaXAKK1JVTiBwaXAzIGluc3RhbGwgLS11cGdyYWRlIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgaXBhZGRyZXNzIHNldHVwdG9vbHMgc2l4IHRvcm5hZG8gdG9ybmFkby10ZXN0aW5nIHR3aXN0ZWQgdmlydHVhbGVudiB6b3BlLWludGVyZmFjZQorCisjIFJ1YnkgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgcnVieSBcCisgICAgICBydWJ5LWRldmVsIFwKKyAgICAgIHJ1YnlnZW1zICYmIFwKKyAgICBnZW0gaW5zdGFsbCBidW5kbGVyIHJha2UKKworIyBSdXN0CitSVU4gY3VybCBodHRwczovL3NoLnJ1c3R1cC5ycyAtc1NmIHwgc2ggLXMgLS0gLXkgLS1kZWZhdWx0LXRvb2xjaGFpbiAxLjE3LjAKK0VOViBQQVRIIC9yb290Ly5jYXJnby9iaW46JFBBVEgKKworIyBDbGVhbiB1cAorUlVOIHJtIC1yZiAvdG1wLyogJiYgXAorICAgIHl1bSBjbGVhbiBhbGwKKworRU5WIFRIUklGVF9ST09UIC90aHJpZnQKK1JVTiBta2RpciAtcCAkVEhSSUZUX1JPT1Qvc3JjCitDT1BZIERvY2tlcmZpbGUgJFRIUklGVF9ST09ULworV09SS0RJUiAkVEhSSUZUX1JPT1Qvc3JjCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvb2xkL2RlYmlhbi1qZXNzaWUvRG9ja2VyZmlsZSBiL2J1aWxkL2RvY2tlci9vbGQvZGViaWFuLWplc3NpZS9Eb2NrZXJmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYzc0ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvb2xkL2RlYmlhbi1qZXNzaWUvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDIwNCBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEFwYWNoZSBUaHJpZnQgRG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IGZvciBEZWJpYW4KKyMKKyMgS25vd24gbWlzc2luZyBjbGllbnQgbGlicmFyaWVzOgorIyAgLSBkb3RuZXRjb3JlCisjICAtIHJ1c3QKKworRlJPTSBidWlsZHBhY2stZGVwczpqZXNzaWUtc2NtCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KKworRU5WIERFQklBTl9GUk9OVEVORCBub25pbnRlcmFjdGl2ZQorCisjIEFkZCBhcHQgc291cmNlcworIyBqZXNzaWUtYmFja3BvcnRzIGZvciBjbWFrZSBhbmQgc29tZSBydWJ5IGJpdHMKK1JVTiBlY2hvICJkZWIgaHR0cDovL2Z0cC5kZWJpYW4ub3JnL2RlYmlhbiBqZXNzaWUtYmFja3BvcnRzIG1haW4iID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvamVzc2llLWJhY2twb3J0cy5saXN0CisKKyMgRGFydAorUlVOIGN1cmwgaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9saW51eC9saW51eF9zaWduaW5nX2tleS5wdWIgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBjdXJsIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC5kYXJ0bGFuZy5vcmcvbGludXgvZGViaWFuL2RhcnRfc3RhYmxlLmxpc3QgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0ICYmIFwKKyAgICBzZWQgLWkgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGFydF9zdGFibGUubGlzdCAtZSAncy9odHRwczovaHR0cDovZycKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHZW5lcmFsIGRlcGVuZGVuY2llc2AgXAorICAgICAgYmlzb24gXAorICAgICAgYnVpbGQtZXNzZW50aWFsIFwKKyAgICAgIGNsYW5nIFwKKyAgICAgIGRlYmhlbHBlciBcCisgICAgICBmbGV4IFwKKyAgICAgIHBrZy1jb25maWcgJiYgXAorICAgIGFwdC1nZXQgLXQgamVzc2llLWJhY2twb3J0cyBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIGNtYWtlCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQysrIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYm9vc3QtZGV2IFwKKyAgICAgIGxpYmJvb3N0LWZpbGVzeXN0ZW0tZGV2IFwKKyAgICAgIGxpYmJvb3N0LXByb2dyYW0tb3B0aW9ucy1kZXYgXAorICAgICAgbGliYm9vc3Qtc3lzdGVtLWRldiBcCisgICAgICBsaWJib29zdC10ZXN0LWRldiBcCisgICAgICBsaWJib29zdC10aHJlYWQtZGV2IFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHF0NS1kZWZhdWx0IFwKKyAgICAgIHF0YmFzZTUtZGV2IFwKKyAgICAgIHF0YmFzZTUtZGV2LXRvb2xzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSmF2YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGFudCBcCisgICAgICBhbnQtb3B0aW9uYWwgXAorICAgICAgb3Blbmpkay03LWpkayBcCisgICAgICBtYXZlbgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbiBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbi1hbGwgXAorICAgICAgcHl0aG9uLWFsbC1kYmcgXAorICAgICAgcHl0aG9uLWFsbC1kZXYgXAorICAgICAgcHl0aG9uLXBpcCBcCisgICAgICBweXRob24tc2V0dXB0b29scyBcCisgICAgICBweXRob24tdHdpc3RlZCBcCisgICAgICBweXRob24tem9wZS5pbnRlcmZhY2UgXAorICAgICAgcHl0aG9uMy1hbGwgXAorICAgICAgcHl0aG9uMy1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRldiBcCisgICAgICBweXRob24zLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uMy1waXAKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdWJ5IGRlcGVuZGVuY2llc2AgXAorICAgICAgcnVieSBcCisgICAgICBydWJ5LWRldiBcCitgIyBQZXJsIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYml0LXZlY3Rvci1wZXJsIFwKKyAgICAgIGxpYmNsYXNzLWFjY2Vzc29yLWNsYXNzLXBlcmwgXAorICAgICAgbGliY3J5cHQtc3NsZWF5LXBlcmwgXAorICAgICAgbGliaW8tc29ja2V0LXNzbC1wZXJsIFwKKyAgICAgIGxpYm5ldC1zc2xlYXktcGVybAorCitSVU4gYXB0LWdldCAtdCBqZXNzaWUtYmFja3BvcnRzIGluc3RhbGwgLXkgcnVieS1idW5kbGVyCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBocCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHBocDUgXAorICAgICAgcGhwNS1kZXYgXAorICAgICAgcGhwNS1jbGkgXAorICAgICAgcGhwLXBlYXIgXAorICAgICAgcmUyYyBcCisgICAgICBwaHB1bml0IFwKK2AjIEdsaWJDIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliZ2xpYjIuMC1kZXYKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBFcmxhbmcgZGVwZW5kZW5jaWVzYCBcCisgICAgICBlcmxhbmctYmFzZSBcCisgICAgICBlcmxhbmctZXVuaXQgXAorICAgICAgZXJsYW5nLWRldiBcCisgICAgICBlcmxhbmctdG9vbHMgXAorICAgICAgcmViYXIKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXNrZWxsIGRlcGVuZGVuY2llc2AgXAorICAgICAgZ2hjIFwKKyAgICAgIGNhYmFsLWluc3RhbGwgXAorYCMgSGF4ZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG5la28gXAorICAgICAgbmVrby1kZXYgXAorICAgICAgbGlibmVrbzAKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBOb2RlLmpzIGRlcGVuZGVuY2llc2AgXAorICAgICAgbm9kZWpzIFwKKyAgICAgIG5vZGVqcy1kZXYgXAorICAgICAgbm9kZWpzLWxlZ2FjeSBcCisgICAgICBucG0KKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBDU2hhcnAgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJtb25vLXN5c3RlbS13ZWIyLjAtY2lsIFwKKyAgICAgIG1vbm8tZGV2ZWwKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEIGRlcGVuZGVuY2llc2AgXAorICAgICAgeGRnLXV0aWxzIFwKK2AjIERhcnQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkYXJ0IFwKK2AjIEx1YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGx1YTUuMiBcCisgICAgICBsdWE1LjItZGV2IFwKK2AjIE1pbkdXIGRlcGVuZGVuY2llc2AgXAorICAgICAgbWluZ3czMiBcCisgICAgICBtaW5ndzMyLWJpbnV0aWxzIFwKK2AjICAgICAgbWluZ3czMi1ydW50aW1lYCBcCisgICAgICBuc2lzIFwKK2AjIENsZWFuIHVwYCBcCisgICAgJiYgcm0gLXJmIC92YXIvY2FjaGUvYXB0LyogJiYgXAorICAgIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKiAmJiBcCisgICAgcm0gLXJmIC90bXAvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvdG1wLyoKKworIyBSdWJ5CitSVU4gZ2VtIGluc3RhbGwgYnVuZGxlciAtLW5vLXJpIC0tbm8tcmRvYworCisjIFB5dGhvbiBvcHRpb25hbCBkZXBlbmRlbmNpZXMKK1JVTiBwaXAyIGluc3RhbGwgLVUgaXBhZGRyZXNzIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgdG9ybmFkbworUlVOIHBpcDMgaW5zdGFsbCAtVSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIHRvcm5hZG8KKworIyBHbworUlVOIGN1cmwgLXNTTCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZ29sYW5nL2dvMS40LjMubGludXgtYW1kNjQudGFyLmd6IHwgdGFyIC1DIC91c3IvbG9jYWwvIC14egorRU5WIFBBVEggL3Vzci9sb2NhbC9nby9iaW46JFBBVEgKKworIyBIYXhlCitSVU4gbWtkaXIgLXAgL3Vzci9saWIvaGF4ZSAmJiBcCisgICAgd2dldCAtTyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL3JlbGVhc2VzL2Rvd25sb2FkLzMuMi4xL2hheGUtMy4yLjEtbGludXg2NC50YXIuZ3ogfCBcCisgICAgdGFyIC1DIC91c3IvbGliL2hheGUgLS1zdHJpcC1jb21wb25lbnRzPTEgLXh6ICYmIFwKKyAgICBsbiAtcyAvdXNyL2xpYi9oYXhlL2hheGUgL3Vzci9iaW4vaGF4ZSAmJiBcCisgICAgbG4gLXMgL3Vzci9saWIvaGF4ZS9oYXhlbGliIC91c3IvYmluL2hheGVsaWIgJiYgXAorICAgIG1rZGlyIC1wIC91c3IvbGliL2hheGUvbGliICAmJiBcCisgICAgY2htb2QgLVIgNzc3IC91c3IvbGliL2hheGUvbGliICYmIFwKKyAgICBoYXhlbGliIHNldHVwIC91c3IvbGliL2hheGUvbGliICYmIFwKKyAgICBoYXhlbGliIGluc3RhbGwgaHhjcHAKKworIyBECitSVU4gY3VybCAtc1NMIGh0dHA6Ly9kb3dubG9hZHMuZGxhbmcub3JnL3JlbGVhc2VzLzIueC8yLjA3MC4wL2RtZF8yLjA3MC4wLTBfYW1kNjQuZGViIC1vIC90bXAvZG1kXzIuMDcwLjAtMF9hbWQ2NC5kZWIgJiYgXAorICAgIGRwa2cgLWkgL3RtcC9kbWRfMi4wNzAuMC0wX2FtZDY0LmRlYiAmJiBcCisgICAgcm0gL3RtcC9kbWRfMi4wNzAuMC0wX2FtZDY0LmRlYiAmJiBcCisgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsL2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL2xpYmV2ZW50L2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBta2RpciAtcCAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQyAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL2RlaW1vcy8qIG9wZW5zc2wtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9DLyogb3BlbnNzbC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgbGliZXZlbnQtbWFzdGVyIG9wZW5zc2wtbWFzdGVyICYmIFwKKyAgICBlY2hvICdnY2MgLVdsLC0tbm8tYXMtbmVlZGVkICQqJyA+IC91c3IvbG9jYWwvYmluL2djYy1kbWQgJiYgXAorICAgIGNobW9kIDc1NSAvdXNyL2xvY2FsL2Jpbi9nY2MtZG1kICYmIFwKKyAgICBlY2hvICdDQz0vdXNyL2xvY2FsL2Jpbi9nY2MtZG1kJyA+PiAvZXRjL2RtZC5jb25mCisKKyMgRGFydAorRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKKworIyBPQ2FtbAorUlVOIGVjaG8gJ2RlYiBodHRwOi8vcHBhLmxhdW5jaHBhZC5uZXQvYXZzbS9wcGEvdWJ1bnR1IHRydXN0eSBtYWluJyA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2F2c20tb2ZmaWNpYWwtb2NhbWwubGlzdCAmJiBcCisgICAgZ3BnIC0ta2V5c2VydmVyIGtleXNlcnZlci51YnVudHUuY29tIC0tcmVjdiA2MTcwN0IwOSAmJiBcCisgICAgZ3BnIC0tZXhwb3J0IC0tYXJtb3IgNjE3MDdCMDkgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBhcHQtZ2V0IHVwZGF0ZSAmJiBcCisgICAgYXB0LWdldCBpbnN0YWxsIC15IG9jYW1sIG9wYW0gJiYgXAorICAgIG9wYW0gaW5pdCAmJiBcCisgICAgb3BhbSBpbnN0YWxsIG9hc2lzCisKKyMgRm9yY2UgdXRmOCBsb2NhbGUgdG8gc3VjY2Vzc2Z1bGx5IGJ1aWxkIEhhc2tlbGwgdGYtcmFuZG9tCitFTlYgTENfQUxMIEMuVVRGLTgKKworRU5WIFRIUklGVF9ST09UIC90aHJpZnQKK1JVTiBta2RpciAtcCAkVEhSSUZUX1JPT1Qvc3JjCitDT1BZIERvY2tlcmZpbGUgJFRIUklGVF9ST09ULworV09SS0RJUiAkVEhSSUZUX1JPT1Qvc3JjCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvb2xkL2RlYmlhbi1zdHJldGNoL0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvb2xkL2RlYmlhbi1zdHJldGNoL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAzZWVjZAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9vbGQvZGViaWFuLXN0cmV0Y2gvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDIzMSBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEFwYWNoZSBUaHJpZnQgRG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IGZvciBEZWJpYW4gU3RyZXRjaAorIworIyBLbm93biBpc3N1ZXM6CisjIC0gZDogZGVpbW9zIGZvciBsaWJldmVudCBhbmQgb3BlbnNzbCBkaXNhYmxlZCAtIGJ1aWxkIGVycm9ycworIyAtIGRvdG5ldGNvcmUsIGJlY2F1c2UgbmV0Y29yZSBpcyBmb3IgMS4wLjAtcHJldmlldyBhbmQgMi4wLjAgaXMgb3V0CisjIC0gcnVzdDogY2FyZ28gbm90IGluIGRlYmlhbiByZXBvIC0gcGVyaGFwcyBub3QgbmVlZGVkPworCitGUk9NIGJ1aWxkcGFjay1kZXBzOnN0cmV0Y2gtc2NtCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KKworRU5WIERFQklBTl9GUk9OVEVORCBub25pbnRlcmFjdGl2ZQorCisjIyMgQWRkIGFwdCByZXBvcworCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIGFwdCBhcHQtdHJhbnNwb3J0LWh0dHBzIGN1cmwgd2dldCBhcHQtdXRpbHMKKworIyBECitSVU4gd2dldCBodHRwOi8vbWFzdGVyLmRsLnNvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L2QtYXB0L2ZpbGVzL2QtYXB0Lmxpc3QgLU8gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZC1hcHQubGlzdCAmJiBcCisgICAgYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCAteSAtLWFsbG93LXVuYXV0aGVudGljYXRlZCBpbnN0YWxsIC0tcmVpbnN0YWxsIGQtYXB0LWtleXJpbmcKKworIyBEYXJ0CitSVU4gY3VybCBodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2xpbnV4L2xpbnV4X3NpZ25pbmdfa2V5LnB1YiB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGN1cmwgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkLmRhcnRsYW5nLm9yZy9saW51eC9kZWJpYW4vZGFydF9zdGFibGUubGlzdCA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QgJiYgXAorICAgIHNlZCAtaSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0IC1lICdzL2h0dHBzOi9odHRwOi9nJworCisjIGRvdG5ldCAoY29yZSkgMi4wLjAgLSBwcm9qZWN0IGlzbid0IHJlYWR5IGZvciB0aGlzIHlldDoKKyMgUlVOIGN1cmwgaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL2tleXMvbWljcm9zb2Z0LmFzYyB8IGdwZyAtLWRlYXJtb3IgPiAvZXRjL2FwdC90cnVzdGVkLmdwZy5kL21pY3Jvc29mdC5ncGcgJiYgXAorIyAgICAgZWNobyAiZGViIFthcmNoPWFtZDY0XSBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20vcmVwb3MvbWljcm9zb2Z0LXVidW50dS14ZW5pYWwtcHJvZCB4ZW5pYWwgbWFpbiIgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kb3RuZXRkZXYubGlzdAorCisjIG5vZGUuanMgKHRoaXMgc3RlcCBydW5zIGFwdC1nZXQgdXBkYXRlIGludGVybmFsbHkpCitSVU4gY3VybCAtc0wgaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vc2V0dXBfOC54IHwgYmFzaAorCisKKyMjIyBpbnN0YWxsIGdlbmVyYWwgZGVwZW5kZW5jaWVzCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdlbmVyYWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBiYXNoLWNvbXBsZXRpb24gXAorICAgICAgYmlzb24gXAorICAgICAgYnVpbGQtZXNzZW50aWFsIFwKKyAgICAgIGNsYW5nIFwKKyAgICAgIGNtYWtlIFwKKyAgICAgIGRlYmhlbHBlciBcCisgICAgICBmbGV4IFwKKyAgICAgIGdkYiBcCisgICAgICBuaW5qYS1idWlsZCBcCisgICAgICBwa2ctY29uZmlnIFwKKyAgICAgIHZhbGdyaW5kIFwKKyAgICAgIHZpbQorCisKKyMjIyBsYW5ndWFnZXMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBDKysgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJib29zdC1kZXYgXAorICAgICAgbGliYm9vc3QtZmlsZXN5c3RlbS1kZXYgXAorICAgICAgbGliYm9vc3QtcHJvZ3JhbS1vcHRpb25zLWRldiBcCisgICAgICBsaWJib29zdC1zeXN0ZW0tZGV2IFwKKyAgICAgIGxpYmJvb3N0LXRlc3QtZGV2IFwKKyAgICAgIGxpYmJvb3N0LXRocmVhZC1kZXYgXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgcXQ1LWRlZmF1bHQgXAorICAgICAgcXRiYXNlNS1kZXYgXAorICAgICAgcXRiYXNlNS1kZXYtdG9vbHMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBjc2hhcnAgKG1vbm8pIGRlcGVuZGVuY2llc2AgXAorICAgICAgbW9uby1kZXZlbAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkbWQtYmluIFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHhkZy11dGlscworIyBsaWJldmVudCBkZWltb3MgZGlzYWJsZWQgLSBidWlsZCBlcnJvcnMKKyMgUlVOIG1rZGlyIC1wIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcyAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DICYmIFwKKyMgICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3MvbGliZXZlbnQvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorIyAgICAgbXYgbGliZXZlbnQtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorIyAgICAgbXYgbGliZXZlbnQtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisjICAgICBybSAtcmYgbGliZXZlbnQtbWFzdGVyCisjIG9wZW5zc2wgZGVpbW9zIGRvZXNuJ3Qgd29yayB3aXRoIG9wZW5zc2wtMS4xLjAgLSBkaXNhYmxpbmcgaXQgZm9yIG5vdzoKKyMgUlVOIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3Mvb3BlbnNzbC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisjICAgICBtdiBvcGVuc3NsLW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyMgICAgIG12IG9wZW5zc2wtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisjICAgICBybSAtcmYgb3BlbnNzbC1tYXN0ZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEYXJ0IGRlcGVuZGVuY2llc2AgXAorICAgICAgZGFydAorRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKKworIyBwcm9qZWN0IGlzbid0IHJlYWR5IGZvciB0aGlzIHF1aXRlIHlldDoKKyMgUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisjIGAjIGRvdG5ldCBjb3JlIGRlcGVuZGVuY2llc2AgXAorIyAgICAgICBkb3RuZXQtc2RrLTIuMC4wCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRXJsYW5nIGRlcGVuZGVuY2llc2AgXAorICAgICAgZXJsYW5nLWJhc2UgXAorICAgICAgZXJsYW5nLWV1bml0IFwKKyAgICAgIGVybGFuZy1kZXYgXAorICAgICAgZXJsYW5nLXRvb2xzIFwKKyAgICAgIHJlYmFyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2xpYkMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJnbGliMi4wLWRldgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGdvbGFuZyAoZ28pIGRlcGVuZGVuY2llc2AgXAorICAgICAgZ29sYW5nLWdvCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGFza2VsbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGdoYyBcCisgICAgICBjYWJhbC1pbnN0YWxsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGF4ZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGhheGUgXAorICAgICAgbmVrbyBcCisgICAgICBuZWtvLWRldgorUlVOIGhheGVsaWIgc2V0dXAgLS1hbHdheXMgL3Vzci9zaGFyZS9oYXhlL2xpYiAmJiBcCisgICAgaGF4ZWxpYiBpbnN0YWxsIC0tYWx3YXlzIGh4Y3BwCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSmF2YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGFudCBcCisgICAgICBhbnQtb3B0aW9uYWwgXAorICAgICAgb3Blbmpkay04LWpkayBcCisgICAgICBtYXZlbgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEx1YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGx1YTUuMiBcCisgICAgICBsdWE1LjItZGV2CisjIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL2x1YTUuMy8rYnVnLzE3MDcyMTIKKyMgc2FtZSBmb3IgZGViaWFuIHN0cmV0Y2gKKyMgbHVhNS4zIGRvZXMgbm90IGluc3RhbGwgYWx0ZXJuYXRpdmVzIHNvIHN0aWNrIHdpdGggNS4yIGhlcmUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBOb2RlLmpzIGRlcGVuZGVuY2llc2AgXAorICAgICAgbm9kZWpzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgT0NhbWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBvY2FtbCBcCisgICAgICBvcGFtICYmIFwKKyAgICBvcGFtIGluaXQgLS15ZXMgJiYgXAorICAgIG9wYW0gaW5zdGFsbCAtLXllcyBvYXNpcworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBlcmwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJiaXQtdmVjdG9yLXBlcmwgXAorICAgICAgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybCBcCisgICAgICBsaWJjcnlwdC1zc2xlYXktcGVybCBcCisgICAgICBsaWJpby1zb2NrZXQtc3NsLXBlcmwgXAorICAgICAgbGlibmV0LXNzbGVheS1wZXJsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGhwIGRlcGVuZGVuY2llc2AgXAorICAgICAgcGhwNy4wIFwKKyAgICAgIHBocDcuMC1jbGkgXAorICAgICAgcGhwNy4wLWRldiBcCisgICAgICBwaHAtcGVhciBcCisgICAgICByZTJjIFwKKyAgICAgIHBocHVuaXQKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQeXRob24gZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24tYWxsIFwKKyAgICAgIHB5dGhvbi1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbi1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbi1iYWNrcG9ydHMuc3NsLW1hdGNoLWhvc3RuYW1lIFwKKyAgICAgIHB5dGhvbi1pcGFkZHJlc3MgXAorICAgICAgcHl0aG9uLXBpcCBcCisgICAgICBweXRob24tc2V0dXB0b29scyBcCisgICAgICBweXRob24tc2l4IFwKKyAgICAgIHB5dGhvbi10b3JuYWRvIFwKKyAgICAgIHB5dGhvbi10d2lzdGVkIFwKKyAgICAgIHB5dGhvbi13aGVlbCBcCisgICAgICBweXRob24tem9wZS5pbnRlcmZhY2UgXAorICAgICAgcHl0aG9uMy1hbGwgXAorICAgICAgcHl0aG9uMy1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRldiBcCisgICAgICBweXRob24zLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uMy1zaXggXAorICAgICAgcHl0aG9uMy10b3JuYWRvIFwKKyAgICAgIHB5dGhvbjMtdHdpc3RlZCBcCisgICAgICBweXRob24zLXdoZWVsIFwKKyAgICAgIHB5dGhvbjMtem9wZS5pbnRlcmZhY2UgJiYgXAorICAgIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVieSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHJ1YnkgXAorICAgICAgcnVieS1kZXYgXAorICAgICAgcnVieS1idW5kbGVyCitSVU4gZ2VtIGluc3RhbGwgYnVuZGxlciAtLW5vLXJpIC0tbm8tcmRvYworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1c3QgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydXN0YworCisjIFVwZGF0ZSBhbnl0aGluZyBlbHNlIGxlZnQgaGFuZ2luZworUlVOIGFwdC1nZXQgZGlzdC11cGdyYWRlIC15CisKKyMgQ2xlYW4gdXAKK1JVTiBybSAtcmYgL3Zhci9jYWNoZS9hcHQvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qICYmIFwKKyAgICBybSAtcmYgL3RtcC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci90bXAvKgorCitFTlYgVEhSSUZUX1JPT1QgL3RocmlmdAorUlVOIG1rZGlyIC1wICRUSFJJRlRfUk9PVC9zcmMKK0NPUFkgRG9ja2VyZmlsZSAkVEhSSUZUX1JPT1QvCitXT1JLRElSICRUSFJJRlRfUk9PVC9zcmMKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9vbGQvdWJ1bnR1LXRydXN0eS9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL29sZC91YnVudHUtdHJ1c3R5L0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlNGQzYgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9vbGQvdWJ1bnR1LXRydXN0eS9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMjQ0IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMKKyMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIFVidW50dSBUcnVzdHkKKyMgVXNpbmcgYWxsIHN0b2NrIFVidW50dSBUcnVzdHkgcGFja2FnaW5nIGV4Y2VwdCBmb3I6CisjIC0gZDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dSBzbyB3ZSdyZSBpbnN0YWxsaW5nIDIuMDcwLjAKKyMgLSBkYXJ0OiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1IHNvIHdlJ3JlIGluc3RhbGxpbmcgMS4yMC4xCisjIC0gZG90bmV0Y29yZSwgZGlzYWJsZWQgYmVjYXVzZSBuZXRjb3JlIGlzIGZvciAxLjAuMC1wcmV2aWV3IGFuZCAyLjAuMCBpcyBvdXQKKyMgLSBoYXhlLCBkaXNhYmxlZCBiZWNhdXNlIHRoZSBkaXN0cm8gY29tZXMgd2l0aCAzLjAuMCBhbmQgaXQgY29yZXMgd2hpbGUgaW5zdGFsbGluZworIyAtIG5vZGUuanMsIGRpc2FibGVkIGJlY2F1c2UgaXQgaXMgYXQgMC4xMC4wIGluIHRoZSBkaXN0cm8gd2hpY2ggaXMgdG9vIG9sZCAobmVlZCA0KykKKyMgLSBvY2FtbCwgZGlzYWJsZWQgYmVjYXVzZSBpdCBmYWlscyB0byBpbnN0YWxsIHByb3Blcmx5CisjCisKK0ZST00gYnVpbGRwYWNrLWRlcHM6dHJ1c3R5LXNjbQorTUFJTlRBSU5FUiBBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CitFTlYgREVCSUFOX0ZST05URU5EIG5vbmludGVyYWN0aXZlCisKKyMjIyBBZGQgYXB0IHJlcG9zCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBcCisgICAgYXB0LWdldCBkaXN0LXVwZ3JhZGUgLXkgJiYgXAorICAgIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisgICAgICBhcHQgXAorICAgICAgYXB0LXRyYW5zcG9ydC1odHRwcyBcCisgICAgICBhcHQtdXRpbHMgXAorICAgICAgY3VybCBcCisgICAgICBkaXJtbmdyIFwKKyAgICAgIHNvZnR3YXJlLXByb3BlcnRpZXMtY29tbW9uIFwKKyAgICAgIHdnZXQKKworIyBECitSVU4gYXB0LWtleSBhZHYgLS1rZXlzZXJ2ZXIga2V5c2VydmVyLnVidW50dS5jb20gLS1yZWN2LWtleXMgRUJDRjk3NUU1QkEyNEQ1RSAmJiBcCisgICAgICAgIHdnZXQgaHR0cDovL21hc3Rlci5kbC5zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9kLWFwdC9maWxlcy9kLWFwdC5saXN0IC1PIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2QtYXB0Lmxpc3QgJiYgXAorICAgICAgICB3Z2V0IC1xTyAtIGh0dHBzOi8vZGxhbmcub3JnL2Qta2V5cmluZy5ncGcgfCBhcHQta2V5IGFkZCAtCisKKyMgRGFydAorUlVOIGN1cmwgaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9saW51eC9saW51eF9zaWduaW5nX2tleS5wdWIgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICAgICAgY3VybCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQuZGFydGxhbmcub3JnL2xpbnV4L2RlYmlhbi9kYXJ0X3N0YWJsZS5saXN0ID4gXAorICAgICAgICAgIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHZW5lcmFsIGRlcGVuZGVuY2llc2AgXAorICAgICAgYmFzaC1jb21wbGV0aW9uIFwKKyAgICAgIGJpc29uIFwKKyAgICAgIGJ1aWxkLWVzc2VudGlhbCBcCisgICAgICBjbGFuZyBcCisgICAgICBjbWFrZSBcCisgICAgICBkZWJoZWxwZXIgXAorICAgICAgZmxleCBcCisgICAgICBnZGIgXAorICAgICAgbGx2bSBcCisgICAgICBuaW5qYS1idWlsZCBcCisgICAgICBwa2ctY29uZmlnIFwKKyAgICAgIHZhbGdyaW5kIFwKKyAgICAgIHZpbQorRU5WIFBBVEggL3Vzci9saWIvbGx2bS0zLjgvYmluOiRQQVRICisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQysrIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYm9vc3QtYWxsLWRldiBcCisgICAgICBsaWJldmVudC1kZXYgXAorICAgICAgbGlic3NsLWRldiBcCisgICAgICBxdDUtZGVmYXVsdCBcCisgICAgICBxdGJhc2U1LWRldiBcCisgICAgICBxdGJhc2U1LWRldi10b29scworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGNzaGFycCAobW9ubykgZGVwZW5kZW5jaWVzYCBcCisgICAgICBtb25vLWRldmVsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRtZC1iaW49Mi4wNzAuMi0wIFwKKyAgICAgIGxpYnBob2JvczItZGV2PTIuMDcwLjItMCBcCisgICAgICBkdWIgXAorICAgICAgZGZtdCBcCisgICAgICBkc2Nhbm5lciBcCisgICAgICB4ZGctdXRpbHMKK1JVTiBta2RpciAtcCAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQyAmJiBcCisgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9saWJldmVudC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBsaWJldmVudC1tYXN0ZXIKK1JVTiBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL29wZW5zc2wvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIG12IG9wZW5zc2wtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IG9wZW5zc2wtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIG9wZW5zc2wtbWFzdGVyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRGFydCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRhcnQ9MS4yMC4xLTEKK0VOViBQQVRIIC91c3IvbGliL2RhcnQvYmluOiRQQVRICisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRXJsYW5nIGRlcGVuZGVuY2llc2AgXAorICAgICAgZXJsYW5nLWJhc2UgXAorICAgICAgZXJsYW5nLWV1bml0IFwKKyAgICAgIGVybGFuZy1kZXYgXAorICAgICAgZXJsYW5nLXRvb2xzIFwKKyAgICAgIHJlYmFyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2xpYkMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJnbGliMi4wLWRldgorCisjIGdvbGFuZworRU5WIEdPTEFOR19WRVJTSU9OIDEuNy42CitFTlYgR09MQU5HX0RPV05MT0FEX1VSTCBodHRwczovL2dvbGFuZy5vcmcvZGwvZ28kR09MQU5HX1ZFUlNJT04ubGludXgtYW1kNjQudGFyLmd6CitFTlYgR09MQU5HX0RPV05MT0FEX1NIQTI1NiBhZDU4MDhiZjQyYjAxNGMyMmRkNzY0NjQ1OGY2MzEzODUwMDMwNDlkZWQwYmI2YWYyZWZjN2YxZjc5ZmEyOWVhCitSVU4gY3VybCAtZnNTTCAiJEdPTEFOR19ET1dOTE9BRF9VUkwiIC1vIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgZWNobyAiJEdPTEFOR19ET1dOTE9BRF9TSEEyNTYgIGdvbGFuZy50YXIuZ3oiIHwgc2hhMjU2c3VtIC1jIC0gJiYgXAorICAgICAgdGFyIC1DIC91c3IvbG9jYWwgLXh6ZiBnb2xhbmcudGFyLmd6ICYmIFwKKyAgICAgIGxuIC1zIC91c3IvbG9jYWwvZ28vYmluL2dvIC91c3IvbG9jYWwvYmluICYmIFwKKyAgICAgIHJtIGdvbGFuZy50YXIuZ3oKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXNrZWxsIGRlcGVuZGVuY2llc2AgXAorICAgICAgZ2hjIFwKKyAgICAgIGNhYmFsLWluc3RhbGwKKworIyBkaXNhYmxlZCBiZWNhdXNlIGl0IGNvcmVzIHdoaWxlIGluc3RhbGxpbmcKKyMgUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisjIGAjIEhheGUgZGVwZW5kZW5jaWVzYCBcCisjICAgICAgIGhheGUgXAorIyAgICAgICBuZWtvIFwKKyMgICAgICAgbmVrby1kZXYgJiYgXAorIyAgICAgaGF4ZWxpYiBzZXR1cCAvdXNyL3NoYXJlL2hheGUvbGliICYmIFwKKyMgICAgIGhheGVsaWIgaW5zdGFsbCBoeGNwcCAzLjIuMTAyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSmF2YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGFudCBcCisgICAgICBhbnQtb3B0aW9uYWwgXAorICAgICAgb3Blbmpkay03LWpkayBcCisgICAgICBtYXZlbgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEx1YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGx1YTUuMSBcCisgICAgICBsdWE1LjEtZGV2CisKKyMgZGlzYWJsZWQgYmVjYXVzZSBpdCBpcyB0b28gb2xkCisjIFJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorIyBgIyBOb2RlLmpzIGRlcGVuZGVuY2llc2AgXAorIyAgICAgICBub2RlanMgXAorIyAgICAgICBucG0KKworIyBkaXNhYmxlZCBiZWNhdXNlIGl0IGZhaWxzIHRvIGluc3RhbGwgcHJvcGVybHkKKyMgUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisjIGAjIE9DYW1sIGRlcGVuZGVuY2llc2AgXAorIyAgICAgICBvY2FtbCBcCisjICAgICAgIG9wYW0gJiYgXAorIyAgICAgb3BhbSBpbml0IC0teWVzICYmIFwKKyMgICAgIG9wYW0gaW5zdGFsbCAtLXllcyBvYXNpcworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBlcmwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJiaXQtdmVjdG9yLXBlcmwgXAorICAgICAgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybCBcCisgICAgICBsaWJjcnlwdC1zc2xlYXktcGVybCBcCisgICAgICBsaWJpby1zb2NrZXQtc3NsLXBlcmwgXAorICAgICAgbGlibmV0LXNzbGVheS1wZXJsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGhwIGRlcGVuZGVuY2llc2AgXAorICAgICAgcGhwNSBcCisgICAgICBwaHA1LWNsaSBcCisgICAgICBwaHA1LWRldiBcCisgICAgICBwaHAtcGVhciBcCisgICAgICByZTJjICYmIFwKKyAgICAgIHdnZXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvaW5zdGFsbGVyIC1PIC0gLXEgfCBwaHAgLS0gLS1xdWlldCAtLWluc3RhbGwtZGlyPS91c3IvbG9jYWwvYmluLyAtLWZpbGVuYW1lPWNvbXBvc2VyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUHl0aG9uIGRlcGVuZGVuY2llc2AgXAorICAgICAgcHl0aG9uLWFsbCBcCisgICAgICBweXRob24tYWxsLWRiZyBcCisgICAgICBweXRob24tYWxsLWRldiBcCisgICAgICBweXRob24tcGlwIFwKKyAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbi1zaXggXAorICAgICAgcHl0aG9uLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uLXdoZWVsIFwKKyAgICAgIHB5dGhvbi16b3BlLmludGVyZmFjZSBcCisgICAgICBweXRob24zLWFsbCBcCisgICAgICBweXRob24zLWFsbC1kYmcgXAorICAgICAgcHl0aG9uMy1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbjMtcGlwIFwKKyAgICAgIHB5dGhvbjMtc2V0dXB0b29scyBcCisgICAgICBweXRob24zLXNpeCBcCisgICAgICBweXRob24zLXdoZWVsIFwKKyAgICAgIHB5dGhvbjMtem9wZS5pbnRlcmZhY2UgJiYgXAorICAgIHBpcCBpbnN0YWxsIC1VIGlwYWRkcmVzcyBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIHRvcm5hZG8gJiYgXAorICAgIHBpcDMgaW5zdGFsbCAtVSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIHRvcm5hZG8KKyMgaW5zdGFsbGluZyB0b3JuYWRvIGJ5IHBpcC9waXAzIGluc3RlYWQgb2YgZGViaWFuIHBhY2thZ2UKKyMgaWYgd2UgaW5zdGFsbCB0aGUgZGViaWFuIHBhY2thZ2UsIHRoZSBidWlsZCBmYWlscyBpbiBweTIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdWJ5IGRlcGVuZGVuY2llc2AgXAorICAgICAgcnVieSBcCisgICAgICBydWJ5LWRldiBcCisgICAgICBydWJ5LWJ1bmRsZXIKK1JVTiBnZW0gaW5zdGFsbCBidW5kbGVyIC0tbm8tcmkgLS1uby1yZG9jCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVzdCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGNhcmdvIFwKKyAgICAgIHJ1c3RjCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgU3RhdGljIENvZGUgQW5hbHlzaXMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBjcHBjaGVjayBcCisgICAgICBzbG9jY291bnQgJiYgXAorICAgIHBpcCBpbnN0YWxsIGZsYWtlOAorCisjIEluc3RhbGwgQm91bmN5Q2FzdGxlIHByb3ZpZGVyIHRvIGZpeCBKYXZhIGJ1aWxkcyBpc3N1ZXMgd2l0aCBKREsgNworIyBCdWlsZHMgYWNjZXNzaW5nIHJlcG90ZSByZXBvc2l0b3JpZXMgZmFpbCBhcyBzZWVuIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS90cmF2aXMtY2kvdHJhdmlzLWNpL2lzc3Vlcy84NTAzCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEJvdW5jeUNhc3RsZSBKQ0UgUHJvdmlkZXIgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJiY3Byb3YtamF2YSAmJiBcCisgICAgbG4gLXMgL3Vzci9zaGFyZS9qYXZhL2JjcHJvdi5qYXIgL3Vzci9saWIvanZtL2phdmEtNy1vcGVuamRrLWFtZDY0L2pyZS9saWIvZXh0L2JjcHJvdi5qYXIgJiYgXAorICAgIGF3ayAtRiAuIC12IE9GUz0uICdCRUdJTntuPTJ9L15zZWN1cml0eVwucHJvdmlkZXIvIHtzcGxpdCgkMywgcG9zQW5kRXF1YWxzLCAiPSIpOyQzPW4rKyI9InBvc0FuZEVxdWFsc1syXTtwcmludDtuZXh0fSAxJyAvZXRjL2phdmEtNy1vcGVuamRrL3NlY3VyaXR5L2phdmEuc2VjdXJpdHkgPiAvdG1wL2phdmEuc2VjdXJpdHkgJiYgXAorICBlY2hvICJzZWN1cml0eS5wcm92aWRlci4xPW9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkJvdW5jeUNhc3RsZVByb3ZpZGVyIiA+PiAvdG1wL2phdmEuc2VjdXJpdHkgJiYgXAorICBtdiAvdG1wL2phdmEuc2VjdXJpdHkgL2V0Yy9qYXZhLTctb3Blbmpkay9zZWN1cml0eS9qYXZhLnNlY3VyaXR5CisKKyMgQ2xlYW4gdXAKK1JVTiBybSAtcmYgL3Zhci9jYWNoZS9hcHQvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qICYmIFwKKyAgICBybSAtcmYgL3RtcC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci90bXAvKgorCitFTlYgVEhSSUZUX1JPT1QgL3RocmlmdAorUlVOIG1rZGlyIC1wICRUSFJJRlRfUk9PVC9zcmMKK0NPUFkgRG9ja2VyZmlsZSAkVEhSSUZUX1JPT1QvCitXT1JLRElSICRUSFJJRlRfUk9PVC9zcmMKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9yZWZyZXNoLnNoIGIvYnVpbGQvZG9ja2VyL3JlZnJlc2guc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDhjYmM5MQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9yZWZyZXNoLnNoCkBAIC0wLDAgKzEsODIgQEAKKyMhL2Jpbi9iYXNoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyBUaGUgYnVpbGQgaGFzIHR3byBzdGFnZXM6ICJkb2NrZXIiIGFuZCAidGVzdCIKKyMgVGhlICJkb2NrZXIiIHN0YWdlIGlzIG1lYW50IHRvIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZXMKKyMgICBpZiBuZWVkZWQuICBJZiB3ZSBjYW5ub3QgcHVzaCB0aGF0IHJlc3VsdCBob3dldmVyIHRoZW4KKyMgICB0aGVyZSBpcyBubyByZWFzb24gdG8gZG8gYW55dGhpbmcuCisjIFRoZSAidGVzdCIgc3RhZ2UgaXMgYW4gYWN0dWFsIHRlc3Qgam9iLiAgRXZlbiBpZiB0aGUgZG9ja2VyCisjICAgaW1hZ2UgZG9lc24ndCBtYXRjaCB3aGF0J3MgaW4gdGhlIHJlcG8sIHdlIHN0aWxsIGJ1aWxkCisjICAgdGhlIGltYWdlIHNvIHRoZSBidWlsZCBqb2IgY2FuIHJ1biBwcm9wZXJseS4KKyMKKworc2V0IC1lCisKK1NDUklQVF9ESVI9IiQoY2QgIiQoZGlybmFtZSAiJHtCQVNIX1NPVVJDRVswXX0iKSIgJiYgcHdkKSIKK0RPQ0tFUl9UQUc9JERPQ0tFUl9SRVBPOiRESVNUUk8KKworZnVuY3Rpb24gZG9ja2VyZmlsZV9jaGFuZ2VkIHsKKyAgIyBpbWFnZSBtYXkgbm90IGV4aXN0IHlldCwgc28gd2UgaGF2ZSB0byBsZXQgaXQgZmFpbCBzaWxlbnRseToKKyAgZG9ja2VyIHB1bGwgJERPQ0tFUl9UQUcgfHwgdHJ1ZQorICBkb2NrZXIgcnVuICRET0NLRVJfVEFHIGJhc2ggLWMgJ2NkIC4uICYmIHNoYTUxMnN1bSBEb2NrZXJmaWxlJyA+IC5Eb2NrZXJmaWxlLnNoYTUxMgorICBzaGE1MTJzdW0gLWMgLkRvY2tlcmZpbGUuc2hhNTEyCit9CisKKyMKKyMgSWYgdGhpcyBidWlsZCBoYXMgbm8gRE9DS0VSX1BBU1MgYW5kIGl0IGlzIGluIHRoZSBkb2NrZXIgc3RhZ2UKKyMgdGhlbiB0aGVyZSdzIG5vIHJlYXNvbiB0byBkbyBhbnkgcHJvY2Vzc2luZyBiZWNhdXNlIHdlIGNhbm5vdAorIyBwdXNoIHRoZSByZXN1bHQgaWYgdGhlIERvY2tlcmZpbGUgY2hhbmdlZC4gIAorIworCitpZiBbWyAiJFRSQVZJU19CVUlMRF9TVEFHRSIgPT0gImRvY2tlciIgXV0gJiYgW1sgLXogIiRET0NLRVJfUEFTUyIgXV07IHRoZW4KKyAgZWNobyBEZXRlY3RlZCBkb2NrZXIgc3RhZ2UgYnVpbGQgYW5kIG5vIGRlZmluZWQgRE9DS0VSX1BBU1MsIHRoaXMgYnVpbGQgam9iIHdpbGwgYmUgc2tpcHBlZC4KKyAgZWNobyBTdWJzZXF1ZW50IGpvYnMgaW4gdGhlIHRlc3Qgc3RhZ2UgbWF5IGVhY2ggcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlLgorICBleGl0IDAKK2ZpCisKKworcHVzaGQgJHtTQ1JJUFRfRElSfS8kRElTVFJPCitpZiBkb2NrZXJmaWxlX2NoYW5nZWQ7IHRoZW4KKyAgZWNobyBEb2NrZXJmaWxlIGhhcyBub3QgY2hhbmdlZC4gIE5vIG5lZWQgdG8gcmVidWlsZC4KKyAgZXhpdCAwCitlbHNlCisgIGVjaG8gRG9ja2VyZmlsZSBoYXMgY2hhbmdlZC4KK2ZpCitwb3BkCisKKyMKKyMgRG9ja2VyZmlsZSBoYXMgY2hhbmdlZCAtIHJlYnVpbGQgaXQgZm9yIHRoZSBjdXJyZW50IGJ1aWxkIGpvYi4KKyMgSWYgaXQgaXMgYSAiZG9ja2VyIiBzdGFnZSBidWlsZCB0aGVuIHdlIHdhbnQgdG8gcHVzaCBpdCBiYWNrCisjIHRvIHRoZSBET0NLRVJfUkVQTy4gIElmIGl0IGlzIGEgInRlc3QiIHN0YWdlIGJ1aWxkIHRoZW4gd2UgZG8KKyMgbm90LiAgSWYgbm9ib2R5IGRlZmluZWQgYSBET0NLRVJfUEFTUyB0aGVuIGl0IGRvZXNuJ3QgbWF0dGVyLgorIworCitlY2hvIFJlYnVpbGRpbmcgZG9ja2VyIGltYWdlICRESVNUUk8KK2RvY2tlciBidWlsZCAtLXRhZyAkRE9DS0VSX1RBRyBidWlsZC9kb2NrZXIvJERJU1RSTworCitpZiBbWyAiJFRSQVZJU19CVUlMRF9TVEFHRSIgPT0gImRvY2tlciIgXV0gJiYgW1sgISAteiAiJERPQ0tFUl9VU0VSIiBdXSAmJiBbWyAhIC16ICIkRE9DS0VSX1BBU1MiIF1dOyB0aGVuIAorICBlY2hvIFB1c2hpbmcgZG9ja2VyIGltYWdlICRET0NLRVJfVEFHCisgIGRvY2tlciBsb2dpbiAtdSAkRE9DS0VSX1VTRVIgLXAgJERPQ0tFUl9QQVNTCisgIGRvY2tlciBwdXNoICRET0NLRVJfVEFHCitlbHNlCisgIGVjaG8gTm90IHB1c2hpbmcgZG9ja2VyIGltYWdlOiBlaXRoZXIgbm90IGEgZG9ja2VyIHN0YWdlIGJ1aWxkIGpvYiwgb3Igb25lIG9mIERPQ0tFUl9VU0VSIG9yIERPQ0tFUl9QQVNTIGlzIHVuZGVmaW5lZC4KK2ZpCisKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9ydW4uc2ggYi9idWlsZC9kb2NrZXIvcnVuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFmZTE5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvcnVuLnNoCkBAIC0wLDAgKzEsMzAgQEAKKyMhL2Jpbi9iYXNoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc2V0IC1lCisKK1NDUklQVF9ESVI9IiQoY2QgIiQoZGlybmFtZSAiJHtCQVNIX1NPVVJDRVswXX0iKSIgJiYgcHdkKSIKK0RPQ0tFUl9UQUc9JERPQ0tFUl9SRVBPOiRESVNUUk8KKworcHJpbnRlbnYgfCBzb3J0CisKK2RvY2tlciBydW4gLS1uZXQ9aG9zdCAtZSBCVUlMRF9MSUJTPSIkQlVJTERfTElCUyIgJEJVSUxEX0VOViAtdiAkKHB3ZCk6L3RocmlmdC9zcmMgXAorCS1pdCAkRE9DS0VSX1RBRyBidWlsZC9kb2NrZXIvc2NyaXB0cy8kU0NSSVBUICRCVUlMRF9BUkcKKwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgzODhmNzIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2gKQEAgLTAsMCArMSw2IEBACisjIS9iaW4vc2gKK3NldCAtZXYKKworLi9ib290c3RyYXAuc2gKKy4vY29uZmlndXJlICQqCittYWtlIGNoZWNrIC1qMwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY21ha2Uuc2ggYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9jbWFrZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jY2MzMTFlCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY21ha2Uuc2gKQEAgLTAsMCArMSwyMyBAQAorIyEvYmluL3NoCitzZXQgLWV2CisKK0NNQUtFX0ZMQUdTPSQqCitNQUtFUFJPRz1tYWtlCisKK2lmIG5pbmphIC0tdmVyc2lvbiAgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIE1BS0VQUk9HPW5pbmphCisgIENNQUtFX0ZMQUdTPSItR05pbmphICRDTUFLRV9GTEFHUyIKK2ZpCisKK21rZGlyIC1wIGNtYWtlX2J1aWxkICYmIGNkIGNtYWtlX2J1aWxkCitjbWFrZSAkQ01BS0VfRkxBR1MgLi4KK2ZvciBMSUIgaW4gJEJVSUxEX0xJQlM7IGRvCisgIGlmICEgZ3JlcCAiXkJVSUxEXyR7TElCfTpCT09MPU9OJCIgQ01ha2VDYWNoZS50eHQgOyB0aGVuCisgICAgZWNobyAiZmFpbGVkIHRvIGNvbmZpZ3VyZSAkTElCIgorICAgIGV4aXQgMQorICBmaQorZG9uZQorJE1BS0VQUk9HIC1qMworY3BhY2sKK2N0ZXN0IC1WViAtRSAiKHB5dGhvbl90ZXN0KSIKKyMgZGlzYWJsZWQgY21ha2UgcHl0aG9uX3Rlc3QgZm9yIG5vdyBzaW5jZSBpdCBmYWlscyBpbiB0cmF2aXMgdW5kZXIgY2VudG9zCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvc2NyaXB0cy9jb3ZzY2FuLnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY292c2Nhbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYjNmMjgzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY292c2Nhbi5zaApAQCAtMCwwICsxLDUwIEBACisjCisjIENvdmVyaXR5IFNjYW4gVHJhdmlzIGJ1aWxkIHNjcmlwdAorIyBUbyBydW4gdGhpcyBpbnRlcmFjdGl2ZWx5LCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB5b3Vyc2VsZiwKKyMgYW5kIHJ1biB0aGlzIGluc2lkZSBhIGRvY2tlciBjb250YWluZXIuCisjCisjIENvbW1hbmQtTGluZSBBcmd1bWVudHMKKyMKKyMgLS1za2lwZG93bmxvYWQgICB0byBza2lwIHJlLWRvd25sb2FkaW5nIHRoZSBDb3Zlcml0eSBTY2FuIGJ1aWxkIHBhY2thZ2UgKGxhcmdlKQorIworIyBFbnZpcm9ubWVudCBWYXJpYWJsZXMgKHJlcXVpcmVkKQorIworIyBDT1ZFUklUWV9TQ0FOX05PVElGSUNBVElPTl9FTUFJTCAgLSBlbWFpbCBhZGRyZXNzIHRvIG5vdGlmeQorIyBDT1ZFUklUWV9TQ0FOX1RPS0VOICAgICAgICAgICAgICAgLSB0aGUgQ292ZXJpdHkgU2NhbiB0b2tlbiAoc2hvdWxkIGJlIHNlY3VyZSkKKyMKKyMgRW52aXJvbm1lbnQgVmFyaWFibGVzIChkZWZhdWx0ZWQpCisjCisjIENPVkVSSVRZX1NDQU5fQlVJTERfQ09NTUFORCAgICAgICAtIGRlZmF1bHRzIHRvICJidWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2giCisjIENPVkVSSVRZX1NDQU5fREVTQ1JJUFRJT04gICAgICAgICAtIGRlZmF1bHRzIHRvIFRSQVZJU19CUkFOQ0ggb3IgIm1hc3RlciIgaWYgZW1wdHkKKyMgQ09WRVJJVFlfU0NBTl9QUk9KRUNUICAgICAgICAgICAgIC0gZGVmYXVsdHMgdG8gInRocmlmdCIKKworc2V0IC1leAorCitDT1ZFUklUWV9TQ0FOX0JVSUxEX0NPTU1BTkQ9JHtDT1ZFUklUWV9TQ0FOX0JVSUxEX0NPTU1BTkQ6LWJ1aWxkL2RvY2tlci9zY3JpcHRzL2F1dG90b29scy5zaH0KK0NPVkVSSVRZX1NDQU5fREVTQ1JJUFRJT049JHtDT1ZFUklUWV9TQ0FOX0RFU0NSSVBUSU9OOi0ke1RSQVZJU19CUkFOQ0g6LW1hc3Rlcn19CitDT1ZFUklUWV9TQ0FOX1BST0pFQ1Q9JHtDT1ZFUklUWV9TQ0FOX1BST0pFQ1Q6LXRocmlmdH0KKworIyBkb3dubG9hZCB0aGUgY292ZXJpdHkgc2NhbiBwYWNrYWdlCisKK3B1c2hkIC90bXAKK2lmIFtbICIkMSIgIT0gIi0tc2tpcGRvd25sb2FkIiBdXTsgdGhlbgorICBybSAtcmYgY292ZXJpdHlfdG9vbC50Z3ogY292LWFuYWx5c2lzKgorICB3Z2V0IGh0dHBzOi8vc2Nhbi5jb3Zlcml0eS5jb20vZG93bmxvYWQvbGludXg2NCAtLXBvc3QtZGF0YSAidG9rZW49JENPVkVSSVRZX1NDQU5fVE9LRU4mcHJvamVjdD0kQ09WRVJJVFlfU0NBTl9QUk9KRUNUIiAtTyBjb3Zlcml0eV90b29sLnRnegorICB0YXIgeHpmIGNvdmVyaXR5X3Rvb2wudGd6CitmaQorQ09WQklOPSQoZWNobyAkKHB3ZCkvY292LWFuYWx5c2lzKi9iaW4pCitleHBvcnQgUEFUSD0kQ09WQklOOiRQQVRICitwb3BkCisKKyMgYnVpbGQgdGhlIHByb2plY3Qgd2l0aCBjb3Zlcml0eSBzY2FuCisKK3JtIC1yZiBjb3YtaW50LworY292LWJ1aWxkIC0tZGlyIGNvdi1pbnQgJENPVkVSSVRZX1NDQU5fQlVJTERfQ09NTUFORAordGFyIGNKZiBjb3YtaW50LnRhci54eiBjb3YtaW50LworY3VybCAtLWZvcm0gdG9rZW49IiRDT1ZFUklUWV9TQ0FOX1RPS0VOIiBcCisgICAgIC0tZm9ybSBlbWFpbD0iJENPVkVSSVRZX1NDQU5fTk9USUZJQ0FUSU9OX0VNQUlMIiBcCisgICAgIC0tZm9ybSBmaWxlPUBjb3YtaW50LnRhci54eiBcCisgICAgIC0tZm9ybSB2ZXJzaW9uPSIkKGdpdCBkZXNjcmliZSAtLXRhZ3MpIiBcCisgICAgIC0tZm9ybSBkZXNjcmlwdGlvbj0iJENPVkVSSVRZX1NDQU5fREVTQ1JJUFRJT04iIFwKKyAgICAgaHR0cHM6Ly9zY2FuLmNvdmVyaXR5LmNvbS9idWlsZHM/cHJvamVjdD0iJENPVkVSSVRZX1NDQU5fUFJPSkVDVCIKKwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY3Jvc3MtdGVzdC5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2Nyb3NzLXRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDM1ODFhNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2Nyb3NzLXRlc3Quc2gKQEAgLTAsMCArMSwxNiBAQAorIyEvYmluL3NoCitzZXQgLWV2CisKKy4vYm9vdHN0cmFwLnNoCisuL2NvbmZpZ3VyZSAtLWVuYWJsZS10dXRvcmlhbD1ubworbWFrZSAtajMgcHJlY3Jvc3MKKworc2V0ICtlCittYWtlIGNyb3NzJDEKKworUkVUPSQ/CitpZiBbICRSRVQgLW5lIDAgXTsgdGhlbgorICBjYXQgdGVzdC9sb2cvdW5leHBlY3RlZF9mYWlsdXJlcy5sb2cKK2ZpCisKK2V4aXQgJFJFVApkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvZHBrZy5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2Rwa2cuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2JhMGNkNAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2Rwa2cuc2gKQEAgLTAsMCArMSw1IEBACisjIS9iaW4vc2gKK3NldCAtZXYKKworZHBrZy1idWlsZHBhY2thZ2UgLXRjIC11cyAtdWMKK2xzIC1hbCAuLgpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvbWFrZS1kaXN0LnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvbWFrZS1kaXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVhMzY4MWUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9tYWtlLWRpc3Quc2gKQEAgLTAsMCArMSw5IEBACisjIS9iaW4vc2gKK3NldCAtZXYKKworLi9ib290c3RyYXAuc2gKKy4vY29uZmlndXJlICQqCittYWtlIGRpc3QKK3RhciB4dmYgdGhyaWZ0LSoudGFyLmd6CitjZCB0aHJpZnQtKgorLi9idWlsZC9kb2NrZXIvc2NyaXB0cy9jbWFrZS5zaApkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvc2NhLnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvc2NhLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE2ZDU4MjYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9zY2Euc2gKQEAgLTAsMCArMSw2NiBAQAorIyEvYmluL2Jhc2gKK3NldCAtZXYKKworIworIyBHZW5lcmF0ZSB0aHJpZnQgZmlsZXMgc28gdGhlIHN0YXRpYyBjb2RlIGFuYWx5c2lzIGluY2x1ZGVzIGFuIGFuYWx5c2lzCisjIG9mIHRoZSBmaWxlcyB0aGUgdGhyaWZ0IGNvbXBpbGVyIHNwaXRzIG91dC4gIElmIHJ1bm5pbmcgaW50ZXJhY3RpdmVseQorIyBzZXQgdGhlIE5PQlVJTEQgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gc2tpcCB0aGUgYm9vdC9jb25maWcvbWFrZSBwaGFzZS4KKyMKKworaWYgW1sgLXogIiROT0JVSUxEIiBdXTsgdGhlbgorICAuL2Jvb3RzdHJhcC5zaAorICAuL2NvbmZpZ3VyZSAtLWVuYWJsZS10dXRvcmlhbD1ubworICBtYWtlIC1qMyBwcmVjcm9zcworZmkKKworIworIyBDL0MrKyBzdGF0aWMgY29kZSBhbmFseXNpcyB3aXRoIGNwcGNoZWNrCisjIGFkZCAtLWVycm9yLWV4aXRjb2RlPTEgdG8gLS1lbmFibGU9YWxsIGFzIHNvb24gYXMgZXZlcnl0aGluZyBpcyBmaXhlZAorIworIyBQeXRob24gY29kZSBzdHlsZSBjaGVjayB3aXRoIGZsYWtlOAorIworIyBzZWFyY2ggZm9yIFRPRE8gZXRjIHdpdGhpbiBzb3VyY2UgdHJlZQorIyBzb21lIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGNvZGUgYmFzZQorIyBzb21lIGluZm8gYWJvdXQgdGhlIGJ1aWxkIG1hY2hpbmUKKworIyBDb21waWxlciBjcHBjaGVjayAoQWxsKQorY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tZW5hYmxlPWFsbCAtajIgY29tcGlsZXIvY3BwL3NyYworCisjIEMrKyBjcHBjaGVjayAoQWxsKQorY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tZW5hYmxlPWFsbCAtajIgbGliL2NwcC9zcmMgbGliL2NwcC90ZXN0IHRlc3QvY3BwIHR1dG9yaWFsL2NwcAorCisjIEMgR2xpYiBjcHBjaGVjayAoQWxsKQorY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tZW5hYmxlPWFsbCAtajIgbGliL2NfZ2xpYi9zcmMgbGliL2NfZ2xpYi90ZXN0IHRlc3QvY19nbGliL3NyYyB0dXRvcmlhbC9jX2dsaWIKKworIyBTaWxlbnQgZXJyb3IgY2hlY2tzCisjIFNlZSBUSFJJRlQtNDM3MSA6IGZsZXggZ2VuZXJhdGVkIGNvZGUgdHJpZ2dlcnMgInBvc3NpYmxlIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jZSIgaW4geXlfaW5pdF9idWZmZXIKK2NwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLXN1cHByZXNzPSIqOnRocmlmdC90aHJpZnRsLmNjIiAtLWVycm9yLWV4aXRjb2RlPTEgLWoyIGNvbXBpbGVyL2NwcC9zcmMKK2NwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLWVycm9yLWV4aXRjb2RlPTEgLWoyIGxpYi9jcHAvc3JjIGxpYi9jcHAvdGVzdCB0ZXN0L2NwcCB0dXRvcmlhbC9jcHAKK2NwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLWVycm9yLWV4aXRjb2RlPTEgLWoyIGxpYi9jX2dsaWIvc3JjIGxpYi9jX2dsaWIvdGVzdCB0ZXN0L2NfZ2xpYi9zcmMgdHV0b3JpYWwvY19nbGliCisKKyMgUHl0aG9uIGNvZGUgc3R5bGUKK2ZsYWtlOCAtLWlnbm9yZT1XNTA0LEU1MDEgbGliL3B5CitmbGFrZTggLS1leGNsdWRlPXR1dG9yaWFsL3B5L2J1aWxkIHR1dG9yaWFsL3B5CisjIFRIUklGVC00MzcxIDogZ2VuZXJhdGVkIGZpbGVzIGFyZSBleGNsdWRlZCBiZWNhdXNlIHRoZXkgaGF2ZW4ndCBiZWVuIHNjcnViYmVkIHlldAorZmxha2U4IC0taWdub3JlPUU1MDEgLS1leGNsdWRlPSIqL2dlbi1weSovKiIsdGVzdC9weS9idWlsZCB0ZXN0L3B5CitmbGFrZTggdGVzdC9weS50d2lzdGVkCitmbGFrZTggdGVzdC9weS50b3JuYWRvCitmbGFrZTggLS1pZ25vcmU9RTUwMSB0ZXN0L3Rlc3QucHkKK2ZsYWtlOCAtLWlnbm9yZT1FNTAxLEU3MjIgdGVzdC9jcm9zc3J1bm5lcgorZmxha2U4IHRlc3QvZmVhdHVyZXMKKworIyBQSFAgY29kZSBzdHlsZQorY29tcG9zZXIgaW5zdGFsbCAtLXF1aWV0CisuL3ZlbmRvci9iaW4vcGhwY3MKKworIyBUT0RPIGV0YworZWNobyBGSVhNRXM6IGBncmVwIC1yIEZJWE1FICogfCB3YyAtbGAKK2VjaG8gIEhBQ0tzOiBgZ3JlcCAtciBIQUNLICogfCB3YyAtbGAKK2VjaG8gIFRPRE9zOiBgZ3JlcCAtciBUT0RPICogfCB3YyAtbGAKKworIyBMb0MKK3Nsb2Njb3VudCAuCisKKyMgU3lzdGVtIEluZm8KK2Rwa2cgLWwKK3VuYW1lIC1hCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvc2NyaXB0cy91YnNhbi5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL3Vic2FuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY1MGRiYTAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvc2NyaXB0cy91YnNhbi5zaApAQCAtMCwwICsxLDMwIEBACisjIS9iaW4vc2gKKworc2V0IC1lCisKKyMgV3JhcHMgYXV0b3Rvb2xzLnNoLCBidXQgZWFjaCBiaW5hcnkgY3Jhc2hlcyBpZiBpdCBleGhpYml0cyB1bmRlZmluZWQgYmVoYXZpb3IuIAorIyBTZXQgdGhlIHVuZGVmaW5lZCBiZWhhdmlvciBmbGFncy4gVGhpcyBjcmFzaGVzIG9uIGFsbCB1bmRlZmluZWQgYmVoYXZpb3IgZXhjZXB0IGZvcgorIyB1bmRlZmluZWQgY2FzdGluZywgYWthICJ2cHRyIi4KKyMgVE9ETzogZml4IHVuZGVmaW5lZCB2cHRyIGJlaGF2aW9yIGFuZCB0dXJuIHRoaXMgb3B0aW9uIGJhY2sgb24uCisKK2V4cG9ydCBDRkxBR1M9Ii1mc2FuaXRpemU9dW5kZWZpbmVkIC1mbm8tc2FuaXRpemUtcmVjb3Zlcj11bmRlZmluZWQgLU8wIC1nZ2RiMyAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciIKK2V4cG9ydCBDWFhGTEFHUz0iJHtDRkxBR1N9IgorZXhwb3J0IExERkxBR1M9Ii1sdWJzYW4iCitleHBvcnQgVUJTQU5fT1BUSU9OUz1wcmludF9zdGFja3RyYWNlPTEKKworIworIyB3b3JrIGFyb3VuZCBodHRwczovL3N2bi5ib29zdC5vcmcvdHJhYzEwL3RpY2tldC8xMTYzMiBpZiBwcmVzZW50CisjCisKK3NlZCAtaSAncy8sIHN0cmVhbV90KHJkYnVmKCkpIC8sIHN0cmVhbV90KHBiYXNlX3R5cGU6Om1lbWJlci5nZXQoKSkvZycgL3Vzci9pbmNsdWRlL2Jvb3N0L2Zvcm1hdC9hbHRfc3N0cmVhbS5ocHAKKworIyBsbHZtLXN5bWJvbGl6ZXIgbXVzdCBiZSBvbiBQQVRIIHRvIGdldCBhIHN0YWNrIHRyYWNlIG9uIGVycm9yCisKK0NMQU5HX1BBVEg9IiQobWt0ZW1wIC1kKSIKK3RyYXAgInJtIC1yZiAke0NMQU5HX1BBVEh9IiBFWElUCitsbiAtcyAiJCh3aGVyZWlzIGxsdm0tc3ltYm9saXplci00LjAgIHwgcmV2IHwgY3V0IC1kICcgJyAtZiAxIHwgcmV2KSIgXAorICAiJHtDTEFOR19QQVRIfS9sbHZtLXN5bWJvbGl6ZXIiCitleHBvcnQgUEFUSD0iJHtDTEFOR19QQVRIfToke1BBVEh9IgorbGx2bS1zeW1ib2xpemVyIC12ZXJzaW9uCisKK2J1aWxkL2RvY2tlci9zY3JpcHRzL2F1dG90b29scy5zaCAkKgpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3VidW50dS1hcnRmdWwvRG9ja2VyZmlsZSBiL2J1aWxkL2RvY2tlci91YnVudHUtYXJ0ZnVsL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlODRkMQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci91YnVudHUtYXJ0ZnVsL0RvY2tlcmZpbGUKQEAgLTAsMCArMSwyNzAgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgVWJ1bnR1IEFydGZ1bAorIyBVc2luZyBhbGwgc3RvY2sgVWJ1bnR1IEFydGZ1bCBwYWNrYWdpbmcgZXhjZXB0IGZvcjoKKyMgLSBjcHA6IHN0b2NrIGJvb3N0IDEuNjIgaW4gYXJ0ZnVsIGhhcyBhIG5hc3R5IGJ1ZyBzbyB3ZSB1c2Ugc3RvY2sgYm9vc3QgMS42MworIyAtIGQ6IGRtZCBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1CisjIC0gZGFydDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dS4gUGlubmVkIHRvIGxhc3QgMS54IHJlbGVhc2UKKyMgLSBkb3RuZXQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUKKyMgLSBoYXhlOiB2ZXJzaW9uIDMuNC4yIHRoYXQgY29tZXMgd2l0aCBVYnVudHUgY29yZXMgaW4gb3VyIENJIGJ1aWxkCisjIC0gZ286IGFydGZ1bCBjb21lcyB3aXRoIDEuOSwgd2Ugd2FudCB0aGUgbGF0ZXN0IChzdXBwb3J0ZWQpCisjIC0gbm9kZWpzOiB3YW50IHY4LCBhcnRmdWwgY29tZXMgd2l0aCB2NgorIworCitGUk9NIGJ1aWxkcGFjay1kZXBzOmFydGZ1bC1zY20KK01BSU5UQUlORVIgQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorRU5WIERFQklBTl9GUk9OVEVORCBub25pbnRlcmFjdGl2ZQorCisjIyMgQWRkIGFwdCByZXBvcworCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgXAorICAgIGFwdC1nZXQgZGlzdC11cGdyYWRlIC15ICYmIFwKKyAgICBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorICAgICAgYXB0IFwKKyAgICAgIGFwdC10cmFuc3BvcnQtaHR0cHMgXAorICAgICAgYXB0LXV0aWxzIFwKKyAgICAgIGN1cmwgXAorICAgICAgZGlybW5nciBcCisgICAgICBzb2Z0d2FyZS1wcm9wZXJ0aWVzLWNvbW1vbiBcCisgICAgICB3Z2V0CisKKyMgY3NoYXJwIChtb25vKSAtIGlmIHdlIGV2ZXIgd2FudCBhIGxhdGVyIHZlcnNpb24KKyMgUlVOIGVjaG8gImRlYiBodHRwOi8vZG93bmxvYWQubW9uby1wcm9qZWN0LmNvbS9yZXBvL2RlYmlhbiB4ZW5pYWwgbWFpbiIgfCB0ZWUgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbW9uby5saXN0ICYmIFwKKyMgICAgIGFwdC1rZXkgYWR2IC0ta2V5c2VydmVyIGtleXNlcnZlci51YnVudHUuY29tIC0tcmVjdi1rZXlzIEE2QTE5QjM4RDNEODMxRUYKKworIyBEYXJ0CitSVU4gY3VybCBodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2xpbnV4L2xpbnV4X3NpZ25pbmdfa2V5LnB1YiB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGN1cmwgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkLmRhcnRsYW5nLm9yZy9saW51eC9kZWJpYW4vZGFydF9zdGFibGUubGlzdCA+IFwKKyAgICAgIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QKK0VOViBEQVJUX1ZFUlNJT04gMS4yNC4zLTEKKworIyBkb3RuZXQgKG5ldGNvcmUpCitSVU4gY3VybCBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20va2V5cy9taWNyb3NvZnQuYXNjIHwgZ3BnIC0tZGVhcm1vciA+IC9ldGMvYXB0L3RydXN0ZWQuZ3BnLmQvbWljcm9zb2Z0LmdwZyAmJiBcCisgICAgZWNobyAiZGViIFthcmNoPWFtZDY0XSBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20vcmVwb3MvbWljcm9zb2Z0LXVidW50dS1hcnRmdWwtcHJvZCBhcnRmdWwgbWFpbiIgPiBcCisgICAgICAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kb3RuZXRkZXYubGlzdAorCisjIGhheGUgKGh0dHBzOi8vaGF4ZS5vcmcvZG93bmxvYWQvbGludXgvKQorUlVOIGFkZC1hcHQtcmVwb3NpdG9yeSBwcGE6aGF4ZS9yZWxlYXNlcyAteQorCisjIG5vZGUuanMKK1JVTiBjdXJsIC1zTCBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9ncGdrZXkvbm9kZXNvdXJjZS5ncGcua2V5IHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgZWNobyAiZGViIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL25vZGVfOC54IGFydGZ1bCBtYWluIiB8IHRlZSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9ub2Rlc291cmNlLmxpc3QKKworIyMjIGluc3RhbGwgZ2VuZXJhbCBkZXBlbmRlbmNpZXMKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2VuZXJhbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGJhc2gtY29tcGxldGlvbiBcCisgICAgICBiaXNvbiBcCisgICAgICBidWlsZC1lc3NlbnRpYWwgXAorICAgICAgY2xhbmcgXAorICAgICAgY21ha2UgXAorICAgICAgZGViaGVscGVyIFwKKyAgICAgIGZsZXggXAorICAgICAgZ2RiIFwKKyAgICAgIGxsdm0gXAorICAgICAgbmluamEtYnVpbGQgXAorICAgICAgcGtnLWNvbmZpZyBcCisgICAgICB2YWxncmluZCBcCisgICAgICB2aW0KK0VOViBQQVRIIC91c3IvbGliL2xsdm0tMy44L2JpbjokUEFUSAorCisjIGJvb3N0LTEuNjIgaGFzIGEgdGVycmlibGUgYnVnIGluIGJvb3N0Ojp0ZXN0LCBzZWUgaHR0cHM6Ly9zdm4uYm9vc3Qub3JnL3RyYWMxMC90aWNrZXQvMTI1MDcKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQysrIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYm9vc3QxLjYzLWFsbC1kZXYgXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgcXQ1LWRlZmF1bHQgXAorICAgICAgcXRiYXNlNS1kZXYgXAorICAgICAgcXRiYXNlNS1kZXYtdG9vbHMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBjc2hhcnAgKG1vbm8pIGRlcGVuZGVuY2llc2AgXAorICAgICAgbW9uby1kZXZlbAorCitFTlYgU0JDTF9WRVJTSU9OIDEuNC41CitSVU4gXAorYCMgQ29tbW9uIExpc3AgKHNiY2wpIGRlcGVuZGVuY2llc2AgXAorICAgIGN1cmwgLS12ZXJzaW9uICYmIFwKKyAgICBjdXJsIC1PIC1KIC1MIGh0dHBzOi8va2VudC5kbC5zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zYmNsL3NiY2wvJHtTQkNMX1ZFUlNJT059L3NiY2wtJHtTQkNMX1ZFUlNJT059LXg4Ni02NC1saW51eC1iaW5hcnkudGFyLmJ6MiAmJiBcCisgICAgdGFyIHhqZiBzYmNsLSR7U0JDTF9WRVJTSU9OfS14ODYtNjQtbGludXgtYmluYXJ5LnRhci5iejIgJiYgXAorICAgIGNkIHNiY2wtJHtTQkNMX1ZFUlNJT059LXg4Ni02NC1saW51eCAmJiBcCisgICAgLi9pbnN0YWxsLnNoICYmIFwKKyAgICBzYmNsIC0tdmVyc2lvbiAmJiBcCisgICAgcm0gLXJmIHNiY2wqCisKK0VOViBEX1ZFUlNJT04gICAgIDIuMDgwLjAKK0VOViBETURfREVCICAgICAgIGRtZF8yLjA4MC4wLTBfYW1kNjQuZGViCitSVU4gXAorYCMgRCBkZXBlbmRlbmNpZXNgIFwKKyAgICB3Z2V0IC1xIGh0dHA6Ly9kb3dubG9hZHMuZGxhbmcub3JnL3JlbGVhc2VzLzIueC8ke0RfVkVSU0lPTn0vJHtETURfREVCfSAmJiBcCisgICAgZHBrZyAtLWluc3RhbGwgJHtETURfREVCfSAmJiBcCisgICAgcm0gLWYgJHtETURfREVCfSAmJiBcCisgICAgbWtkaXIgLXAgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MgJiYgXAorICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3MvbGliZXZlbnQvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgbGliZXZlbnQtbWFzdGVyICYmIFwKKyAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL29wZW5zc2wvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIG12IG9wZW5zc2wtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IG9wZW5zc2wtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIG9wZW5zc2wtbWFzdGVyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorICAgICAgYCMgRGFydCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRhcnQ9JERBUlRfVkVSU0lPTgorRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBkb3RuZXQgY29yZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRvdG5ldC1zZGstMi4xLjQKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBFcmxhbmcgZGVwZW5kZW5jaWVzYCBcCisgICAgICBlcmxhbmctYmFzZSBcCisgICAgICBlcmxhbmctZXVuaXQgXAorICAgICAgZXJsYW5nLWRldiBcCisgICAgICBlcmxhbmctdG9vbHMgXAorICAgICAgcmViYXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHbGliQyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmdsaWIyLjAtZGV2CisKKyMgZ29sYW5nCitFTlYgR09MQU5HX1ZFUlNJT04gMS4xMAorRU5WIEdPTEFOR19ET1dOTE9BRF9VUkwgaHR0cHM6Ly9nb2xhbmcub3JnL2RsL2dvJEdPTEFOR19WRVJTSU9OLmxpbnV4LWFtZDY0LnRhci5negorRU5WIEdPTEFOR19ET1dOTE9BRF9TSEEyNTYgYjVhNjQzMzVmMTQ5MDI3N2I1ODU4MzJkMWY2YzdmOGM2YzExMjA2Y2JhNWNkM2Y3NzFkY2I4N2I5OGFkMWEzMworUlVOIGN1cmwgLWZzU0wgIiRHT0xBTkdfRE9XTkxPQURfVVJMIiAtbyBnb2xhbmcudGFyLmd6ICYmIFwKKyAgICAgIGVjaG8gIiRHT0xBTkdfRE9XTkxPQURfU0hBMjU2ICBnb2xhbmcudGFyLmd6IiB8IHNoYTI1NnN1bSAtYyAtICYmIFwKKyAgICAgICAgICAgIHRhciAtQyAvdXNyL2xvY2FsIC14emYgZ29sYW5nLnRhci5neiAmJiBcCisgICAgICAgICAgICAgICAgICBsbiAtcyAvdXNyL2xvY2FsL2dvL2Jpbi9nbyAvdXNyL2xvY2FsL2JpbiAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICBybSBnb2xhbmcudGFyLmd6CisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGFza2VsbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGdoYyBcCisgICAgICBjYWJhbC1pbnN0YWxsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGF4ZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGhheGUgXAorICAgICAgbmVrbyBcCisgICAgICBuZWtvLWRldiAmJiBcCisgICAgaGF4ZWxpYiBzZXR1cCAtLWFsd2F5cyAvdXNyL3NoYXJlL2hheGUvbGliICYmIFwKKyAgICBoYXhlbGliIGluc3RhbGwgLS1hbHdheXMgaHhjcHAgMj4mMSA+IC9kZXYvbnVsbAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEphdmEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBhbnQgXAorICAgICAgYW50LW9wdGlvbmFsIFwKKyAgICAgIG9wZW5qZGstOC1qZGsgXAorICAgICAgbWF2ZW4KKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBMdWEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsdWE1LjIgXAorICAgICAgbHVhNS4yLWRldgorIyBodHRwczovL2J1Z3MubGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9sdWE1LjMvK2J1Zy8xNzA3MjEyCisjIGx1YTUuMyBkb2VzIG5vdCBpbnN0YWxsIGFsdGVybmF0aXZlcyEKKyMgbmVlZCB0byB1cGRhdGUgb3VyIGx1YXNvY2tldCBjb2RlLCBsdWEgZG9lc24ndCBoYXZlIGx1YUxfb3BlbmxpYiBhbnkgbW9yZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE5vZGUuanMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBub2RlanMKKworIyBUZXN0IGRlcGVuZGVuY2llcyBmb3IgcnVubmluZyBwdXBwZXRlZXIKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSlMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJ4c3MxCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgT0NhbWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBvY2FtbCBcCisgICAgICBvcGFtICYmIFwKKyAgICBvcGFtIGluaXQgLS15ZXMgJiYgXAorICAgIG9wYW0gaW5zdGFsbCAtLXllcyBvYXNpcworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBlcmwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJiaXQtdmVjdG9yLXBlcmwgXAorICAgICAgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybCBcCisgICAgICBsaWJjcnlwdC1zc2xlYXktcGVybCBcCisgICAgICBsaWJpby1zb2NrZXQtc3NsLXBlcmwgXAorICAgICAgbGlibmV0LXNzbGVheS1wZXJsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGhwIGRlcGVuZGVuY2llc2AgXAorICAgICAgcGhwIFwKKyAgICAgIHBocC1jbGkgXAorICAgICAgcGhwLWRldiBcCisgICAgICBwaHAtcGVhciBcCisgICAgICByZTJjIFwKKyAgICAgIGNvbXBvc2VyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUHl0aG9uIGRlcGVuZGVuY2llc2AgXAorICAgICAgcHl0aG9uLWFsbCBcCisgICAgICBweXRob24tYWxsLWRiZyBcCisgICAgICBweXRob24tYWxsLWRldiBcCisgICAgICBweXRob24taXBhZGRyZXNzIFwKKyAgICAgIHB5dGhvbi1waXAgXAorICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uLXNpeCBcCisgICAgICBweXRob24tdG9ybmFkbyBcCisgICAgICBweXRob24tdHdpc3RlZCBcCisgICAgICBweXRob24td2hlZWwgXAorICAgICAgcHl0aG9uLXpvcGUuaW50ZXJmYWNlICYmIFwKKyAgIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUHl0aG9uMyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbjMtYWxsIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRiZyBcCisgICAgICBweXRob24zLWFsbC1kZXYgXAorICAgICAgcHl0aG9uMy1waXAgXAorICAgICAgcHl0aG9uMy1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbjMtc2l4IFwKKyAgICAgIHB5dGhvbjMtdG9ybmFkbyBcCisgICAgICBweXRob24zLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uMy13aGVlbCBcCisgICAgICBweXRob24zLXpvcGUuaW50ZXJmYWNlCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVieSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHJ1YnkgXAorICAgICAgcnVieS1kZXYgXAorICAgICAgcnVieS1idW5kbGVyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVzdCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGNhcmdvIFwKKyAgICAgIHJ1c3RjCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgU3RhdGljIENvZGUgQW5hbHlzaXMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBjcHBjaGVjayBcCisgICAgICBzbG9jY291bnQgJiYgXAorICAgIHBpcCBpbnN0YWxsIGZsYWtlOAorCisjIENsZWFuIHVwCitSVU4gcm0gLXJmIC92YXIvY2FjaGUvYXB0LyogJiYgXAorICAgIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKiAmJiBcCisgICAgcm0gLXJmIC90bXAvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvdG1wLyoKKworRU5WIFRIUklGVF9ST09UIC90aHJpZnQKK1JVTiBta2RpciAtcCAkVEhSSUZUX1JPT1Qvc3JjCitDT1BZIERvY2tlcmZpbGUgJFRIUklGVF9ST09ULworV09SS0RJUiAkVEhSSUZUX1JPT1Qvc3JjCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvdWJ1bnR1LWJpb25pYy9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL3VidW50dS1iaW9uaWMvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2M5OWE5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3VidW50dS1iaW9uaWMvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDI3OSBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjCisjIEFwYWNoZSBUaHJpZnQgRG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IGZvciBVYnVudHUgQmlvbmljCisjIFVzaW5nIGFsbCBzdG9jayBVYnVudHUgQmlvbmljIHBhY2thZ2luZyBleGNlcHQgZm9yOgorIyAtIGNsOiB3YW50IGxhdGVzdAorIyAtIGQ6IGRtZCBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1CisjIC0gZGFydDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dS4gUGlubmVkIHRvIGxhc3QgMS54IHJlbGVhc2UKKyMgLSBkb3RuZXQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUKKyMgLSBnbzogd2FudCBsYXRlc3QKKyMgLSBub2RlanM6IHdhbnQgdjgsIGJpb25pYyBjb21lcyB3aXRoIHY2CisjCisKK0ZST00gYnVpbGRwYWNrLWRlcHM6YmlvbmljLXNjbQorTUFJTlRBSU5FUiBBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CitFTlYgREVCSUFOX0ZST05URU5EIG5vbmludGVyYWN0aXZlCisKKyMjIyBBZGQgYXB0IHJlcG9zCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBcCisgICAgYXB0LWdldCBkaXN0LXVwZ3JhZGUgLXkgJiYgXAorICAgIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisgICAgICBhcHQgXAorICAgICAgYXB0LXRyYW5zcG9ydC1odHRwcyBcCisgICAgICBhcHQtdXRpbHMgXAorICAgICAgY3VybCBcCisgICAgICBkaXJtbmdyIFwKKyAgICAgIHNvZnR3YXJlLXByb3BlcnRpZXMtY29tbW9uIFwKKyAgICAgIHdnZXQKKworIyBjc2hhcnAgKG1vbm8pIC0gaWYgd2UgZXZlciB3YW50IGEgbGF0ZXIgdmVyc2lvbgorIyBSVU4gZWNobyAiZGViIGh0dHA6Ly9kb3dubG9hZC5tb25vLXByb2plY3QuY29tL3JlcG8vZGViaWFuIHhlbmlhbCBtYWluIiB8IHRlZSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9tb25vLmxpc3QgJiYgXAorIyAgICAgYXB0LWtleSBhZHYgLS1rZXlzZXJ2ZXIga2V5c2VydmVyLnVidW50dS5jb20gLS1yZWN2LWtleXMgQTZBMTlCMzhEM0Q4MzFFRgorCisjIERhcnQKK1JVTiBjdXJsIGh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vbGludXgvbGludXhfc2lnbmluZ19rZXkucHViIHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgY3VybCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQuZGFydGxhbmcub3JnL2xpbnV4L2RlYmlhbi9kYXJ0X3N0YWJsZS5saXN0ID4gXAorICAgICAgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGFydF9zdGFibGUubGlzdAorRU5WIERBUlRfVkVSU0lPTiAxLjI0LjMtMQorCisjIGRvdG5ldCAobmV0Y29yZSkKK1JVTiBjdXJsIGh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9rZXlzL21pY3Jvc29mdC5hc2MgfCBncGcgLS1kZWFybW9yID4gL2V0Yy9hcHQvdHJ1c3RlZC5ncGcuZC9taWNyb3NvZnQuZ3BnICYmIFwKKyAgICB3Z2V0IC1xIC1PIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL21pY3Jvc29mdC1wcm9kLmxpc3QgaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL2NvbmZpZy91YnVudHUvMTguMDQvcHJvZC5saXN0ICYmIFwKKyAgICBjaG93biByb290OnJvb3QgL2V0Yy9hcHQvdHJ1c3RlZC5ncGcuZC9taWNyb3NvZnQuZ3BnICYmIFwKKyAgICBjaG93biByb290OnJvb3QgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbWljcm9zb2Z0LXByb2QubGlzdAorCisjIG5vZGUuanMKK1JVTiBjdXJsIC1zTCBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9ncGdrZXkvbm9kZXNvdXJjZS5ncGcua2V5IHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgZWNobyAiZGViIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL25vZGVfOC54IGJpb25pYyBtYWluIiB8IHRlZSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9ub2Rlc291cmNlLmxpc3QKKworIyMjIGluc3RhbGwgZ2VuZXJhbCBkZXBlbmRlbmNpZXMKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2VuZXJhbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGJhc2gtY29tcGxldGlvbiBcCisgICAgICBiaXNvbiBcCisgICAgICBidWlsZC1lc3NlbnRpYWwgXAorICAgICAgY2xhbmcgXAorICAgICAgY21ha2UgXAorICAgICAgZGViaGVscGVyIFwKKyAgICAgIGZsZXggXAorICAgICAgZ2RiIFwKKyAgICAgIGxsdm0gXAorICAgICAgbmluamEtYnVpbGQgXAorICAgICAgcGtnLWNvbmZpZyBcCisgICAgICB2YWxncmluZCBcCisgICAgICB2aW0KK0VOViBQQVRIIC91c3IvbGliL2xsdm0tNi4wL2JpbjokUEFUSAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEMrKyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJvb3N0LWFsbC1kZXYgXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgcXQ1LWRlZmF1bHQgXAorICAgICAgcXRiYXNlNS1kZXYgXAorICAgICAgcXRiYXNlNS1kZXYtdG9vbHMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBjc2hhcnAgKG1vbm8pIGRlcGVuZGVuY2llc2AgXAorICAgICAgbW9uby1kZXZlbAorCitFTlYgU0JDTF9WRVJTSU9OIDEuNC4xNQorUlVOIFwKK2AjIENvbW1vbiBMaXNwIChzYmNsKSBkZXBlbmRlbmNpZXNgIFwKKyAgICBjdXJsIC0tdmVyc2lvbiAmJiBcCisgICAgY3VybCAtbyBzYmNsLSR7U0JDTF9WRVJTSU9OfS14ODYtNjQtbGludXgtYmluYXJ5LnRhci5iejIgLUogLUwgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvc2JjbC9maWxlcy9zYmNsLyR7U0JDTF9WRVJTSU9OfS9zYmNsLSR7U0JDTF9WRVJTSU9OfS14ODYtNjQtbGludXgtYmluYXJ5LnRhci5iejIvZG93bmxvYWQ/dXNlX21pcnJvcj1tYW5hZ2Vkd2F5IyAmJiBcCisgICAgdGFyIHhqZiBzYmNsLSR7U0JDTF9WRVJTSU9OfS14ODYtNjQtbGludXgtYmluYXJ5LnRhci5iejIgJiYgXAorICAgIGNkIHNiY2wtJHtTQkNMX1ZFUlNJT059LXg4Ni02NC1saW51eCAmJiBcCisgICAgLi9pbnN0YWxsLnNoICYmIFwKKyAgICBzYmNsIC0tdmVyc2lvbiAmJiBcCisgICAgY2QgLi4gJiYgXAorICAgIHJtIC1yZiBzYmNsKgorCitFTlYgRF9WRVJTSU9OICAgICAyLjA4My4xCitFTlYgRE1EX0RFQiAgICAgICBkbWRfMi4wODMuMS0wX2FtZDY0LmRlYgorUlVOIFwKK2AjIEQgZGVwZW5kZW5jaWVzYCBcCisgICAgd2dldCAtcSBodHRwOi8vZG93bmxvYWRzLmRsYW5nLm9yZy9yZWxlYXNlcy8yLngvJHtEX1ZFUlNJT059LyR7RE1EX0RFQn0gJiYgXAorICAgIGRwa2cgLS1pbnN0YWxsICR7RE1EX0RFQn0gJiYgXAorICAgIHJtIC1mICR7RE1EX0RFQn0gJiYgXAorICAgIG1rZGlyIC1wIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcyAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DICYmIFwKKyAgICBnaXQgY2xvbmUgLWIgJ3YyLjAuMisyLjAuMTYnIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9saWJldmVudC5naXQgZGVpbW9zLWxpYmV2ZW50LTIuMCAmJiBcCisgICAgbXYgZGVpbW9zLWxpYmV2ZW50LTIuMC9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBkZWltb3MtbGliZXZlbnQtMi4wL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIGRlaW1vcy1saWJldmVudC0yLjAgJiYgXAorICAgIGdpdCBjbG9uZSAtYiAndjIuMC4wKzEuMS4waCcgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL29wZW5zc2wuZ2l0IGRlaW1vcy1vcGVuc3NsLTEuMS4waCAmJiBcCisgICAgbXYgZGVpbW9zLW9wZW5zc2wtMS4xLjBoL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IGRlaW1vcy1vcGVuc3NsLTEuMS4waC9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBkZWltb3Mtb3BlbnNzbC0xLjEuMGgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisgICAgICBgIyBEYXJ0IGRlcGVuZGVuY2llc2AgXAorICAgICAgZGFydD0kREFSVF9WRVJTSU9OCitFTlYgUEFUSCAvdXNyL2xpYi9kYXJ0L2JpbjokUEFUSAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGRvdG5ldCBjb3JlIGRlcGVuZGVuY2llc2AgXAorICAgICAgZG90bmV0LXNkay0yLjIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBFcmxhbmcgZGVwZW5kZW5jaWVzYCBcCisgICAgICBlcmxhbmctYmFzZSBcCisgICAgICBlcmxhbmctZXVuaXQgXAorICAgICAgZXJsYW5nLWRldiBcCisgICAgICBlcmxhbmctdG9vbHMgXAorICAgICAgcmViYXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHbGliQyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmdsaWIyLjAtZGV2CisKKyMgZ29sYW5nCitFTlYgR09MQU5HX1ZFUlNJT04gMS4xMS40CitFTlYgR09MQU5HX0RPV05MT0FEX1VSTCBodHRwczovL2dvbGFuZy5vcmcvZGwvZ28kR09MQU5HX1ZFUlNJT04ubGludXgtYW1kNjQudGFyLmd6CitFTlYgR09MQU5HX0RPV05MT0FEX1NIQTI1NiBmYjI2YzMwZTZhMDRhZDkzN2JiYzY1N2ExYjViYmE5MmY4MDA5NmFmMWU4ZWU2ZGE2NDMwYzA0NWE4ZGIzYTViCitSVU4gY3VybCAtZnNTTCAiJEdPTEFOR19ET1dOTE9BRF9VUkwiIC1vIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgZWNobyAiJEdPTEFOR19ET1dOTE9BRF9TSEEyNTYgIGdvbGFuZy50YXIuZ3oiIHwgc2hhMjU2c3VtIC1jIC0gJiYgXAorICAgICAgICAgICAgdGFyIC1DIC91c3IvbG9jYWwgLXh6ZiBnb2xhbmcudGFyLmd6ICYmIFwKKyAgICAgICAgICAgICAgICAgIGxuIC1zIC91c3IvbG9jYWwvZ28vYmluL2dvIC91c3IvbG9jYWwvYmluICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJtIGdvbGFuZy50YXIuZ3oKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXNrZWxsIGRlcGVuZGVuY2llc2AgXAorICAgICAgZ2hjIFwKKyAgICAgIGNhYmFsLWluc3RhbGwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXhlIGRlcGVuZGVuY2llc2AgXAorICAgICAgaGF4ZSBcCisgICAgICBuZWtvIFwKKyAgICAgIG5la28tZGV2ICYmIFwKKyAgICBoYXhlbGliIHNldHVwIC0tYWx3YXlzIC91c3Ivc2hhcmUvaGF4ZS9saWIgJiYgXAorICAgIGhheGVsaWIgaW5zdGFsbCAtLWFsd2F5cyBoeGNwcCAyPiYxID4gL2Rldi9udWxsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSmF2YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGFudCBcCisgICAgICBhbnQtb3B0aW9uYWwgXAorICAgICAgb3Blbmpkay04LWpkayBcCisgICAgICBtYXZlbiAmJiBcCisgICAgdXBkYXRlLWFsdGVybmF0aXZlcyAtLXNldCBqYXZhIC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NC9qcmUvYmluL2phdmEKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBMdWEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsdWE1LjIgXAorICAgICAgbHVhNS4yLWRldgorIyBodHRwczovL2J1Z3MubGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9sdWE1LjMvK2J1Zy8xNzA3MjEyCisjIGx1YTUuMyBkb2VzIG5vdCBpbnN0YWxsIGFsdGVybmF0aXZlcyEKKyMgbmVlZCB0byB1cGRhdGUgb3VyIGx1YXNvY2tldCBjb2RlLCBsdWEgZG9lc24ndCBoYXZlIGx1YUxfb3BlbmxpYiBhbnkgbW9yZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE5vZGUuanMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBub2RlanMKKworIyBUZXN0IGRlcGVuZGVuY2llcyBmb3IgcnVubmluZyBwdXBwZXRlZXIKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSlMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJ4c3MxCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgT0NhbWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBvY2FtbCBcCisgICAgICBvcGFtICYmIFwKKyAgICBvcGFtIGluaXQgLS15ZXMgJiYgXAorICAgIG9wYW0gaW5zdGFsbCAtLXllcyBvYXNpcworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBlcmwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJiaXQtdmVjdG9yLXBlcmwgXAorICAgICAgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybCBcCisgICAgICBsaWJjcnlwdC1zc2xlYXktcGVybCBcCisgICAgICBsaWJpby1zb2NrZXQtc3NsLXBlcmwgXAorICAgICAgbGlibmV0LXNzbGVheS1wZXJsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGhwIGRlcGVuZGVuY2llc2AgXAorICAgICAgcGhwIFwKKyAgICAgIHBocC1jbGkgXAorICAgICAgcGhwLWRldiBcCisgICAgICBwaHAtcGVhciBcCisgICAgICByZTJjIFwKKyAgICAgIGNvbXBvc2VyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUHl0aG9uIGRlcGVuZGVuY2llc2AgXAorICAgICAgcHl0aG9uLWFsbCBcCisgICAgICBweXRob24tYWxsLWRiZyBcCisgICAgICBweXRob24tYWxsLWRldiBcCisgICAgICBweXRob24taXBhZGRyZXNzIFwKKyAgICAgIHB5dGhvbi1waXAgXAorICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uLXNpeCBcCisgICAgICBweXRob24tdG9ybmFkbyBcCisgICAgICBweXRob24tdHdpc3RlZCBcCisgICAgICBweXRob24td2hlZWwgXAorICAgICAgcHl0aG9uLXpvcGUuaW50ZXJmYWNlICYmIFwKKyAgIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUHl0aG9uMyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbjMtYWxsIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRiZyBcCisgICAgICBweXRob24zLWFsbC1kZXYgXAorICAgICAgcHl0aG9uMy1waXAgXAorICAgICAgcHl0aG9uMy1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbjMtc2l4IFwKKyAgICAgIHB5dGhvbjMtdG9ybmFkbyBcCisgICAgICBweXRob24zLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uMy13aGVlbCBcCisgICAgICBweXRob24zLXpvcGUuaW50ZXJmYWNlCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVieSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHJ1YnkgXAorICAgICAgcnVieS1kZXYgXAorICAgICAgcnVieS1idW5kbGVyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVzdCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGNhcmdvIFwKKyAgICAgIHJ1c3RjCisKKyMgU3dpZnQgb24gTGludXggZm9yIGNyb3NzIHRlc3RzCitSVU4gY2QgLyAmJiBcCisgICAgd2dldCAtLXF1aWV0IGh0dHBzOi8vc3dpZnQub3JnL2J1aWxkcy9zd2lmdC00LjIuMS1yZWxlYXNlL3VidW50dTE4MDQvc3dpZnQtNC4yLjEtUkVMRUFTRS9zd2lmdC00LjIuMS1SRUxFQVNFLXVidW50dTE4LjA0LnRhci5neiAmJiBcCisgICAgdGFyIHhmIHN3aWZ0LTQuMi4xLVJFTEVBU0UtdWJ1bnR1MTguMDQudGFyLmd6IC0tc3RyaXAtY29tcG9uZW50cz0xICYmIFwKKyAgICBybSBzd2lmdC00LjIuMS1SRUxFQVNFLXVidW50dTE4LjA0LnRhci5neiAmJiBcCisgICAgc3dpZnQgLS12ZXJzaW9uCisKKyMgY3BwY2hlY2stMS44MiBoYXMgYSBuYXN0eSBjcHAgcGFyc2VyIGJ1Zywgc28gd2UncmUgdXNpbmcgc29tZXRoaW5nIG5ld2VyCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFN0YXRpYyBDb2RlIEFuYWx5c2lzIGRlcGVuZGVuY2llc2AgXAorICAgICAgY3BwY2hlY2sgXAorICAgICAgc2xvY2NvdW50ICYmIFwKKyAgICBwaXAgaW5zdGFsbCBmbGFrZTggJiYgXAorICAgIHdnZXQgLXEgImh0dHBzOi8vbGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9jcHBjaGVjay8xLjgzLTIvK2J1aWxkLzE0ODc0NzAzLytmaWxlcy9jcHBjaGVja18xLjgzLTJfYW1kNjQuZGViIiAmJiBcCisgICAgZHBrZyAtaSBjcHBjaGVja18xLjgzLTJfYW1kNjQuZGViICYmIFwKKyAgICBybSBjcHBjaGVja18xLjgzLTJfYW1kNjQuZGViCisKKyMgQ2xlYW4gdXAKK1JVTiBybSAtcmYgL3Zhci9jYWNoZS9hcHQvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qICYmIFwKKyAgICBybSAtcmYgL3RtcC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci90bXAvKgorCitFTlYgVEhSSUZUX1JPT1QgL3RocmlmdAorUlVOIG1rZGlyIC1wICRUSFJJRlRfUk9PVC9zcmMKK0NPUFkgRG9ja2VyZmlsZSAkVEhSSUZUX1JPT1QvCitXT1JLRElSICRUSFJJRlRfUk9PVC9zcmMKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci91YnVudHUteGVuaWFsL0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvdWJ1bnR1LXhlbmlhbC9Eb2NrZXJmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNzJiNGQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvdWJ1bnR1LXhlbmlhbC9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMjcxIEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMKKyMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIFVidW50dSBYZW5pYWwKKyMgVXNpbmcgYWxsIHN0b2NrIFVidW50dSBYZW5pYWwgcGFja2FnaW5nIGV4Y2VwdCBmb3I6CisjIC0gZDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dSBzbyB3ZSdyZSBpbnN0YWxsaW5nIDIuMDc1LjEgZm9yIGNvdmVyYWdlCisjIC0gZGFydDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dSBzbyB3ZSdyZSBpbnN0YWxsaW5nIDEuMjIuMSBmb3IgY292ZXJhZ2UKKyMgLSBkb3RuZXQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUKKyMgLSBnbzogWGVuaWFsIGNvbWVzIHdpdGggMS42LCBidXQgd2UgbmVlZCAxLjcgb3IgbGF0ZXIKKyMgLSBub2RlanM6IFhlbmlhbCBjb21lcyB3aXRoIDQuMi42IHdoaWNoIGV4aXRzIExUUyBBcHJpbCAyMDE4LCBzbyB3ZSdyZSBpbnN0YWxsaW5nIDYueAorIyAtIG9jYW1sOiBjYXVzZXMgc3RhY2sgb3ZlcmZsb3cgZXJyb3IsIGp1c3Qgc3RhcnRlZCBNYXJjaCAyMDE4IG5vdCBzdXJlIHdoeQorIworCitGUk9NIGJ1aWxkcGFjay1kZXBzOnhlbmlhbC1zY20KK01BSU5UQUlORVIgQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorRU5WIERFQklBTl9GUk9OVEVORCBub25pbnRlcmFjdGl2ZQorCisjIyMgQWRkIGFwdCByZXBvcworCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgXAorICAgIGFwdC1nZXQgZGlzdC11cGdyYWRlIC15ICYmIFwKKyAgICBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorICAgICAgYXB0IFwKKyAgICAgIGFwdC10cmFuc3BvcnQtaHR0cHMgXAorICAgICAgYXB0LXV0aWxzIFwKKyAgICAgIGN1cmwgXAorICAgICAgc29mdHdhcmUtcHJvcGVydGllcy1jb21tb24gXAorICAgICAgd2dldAorCisjIGNzaGFycCAobW9ubykKKyMgUlVOIGVjaG8gImRlYiBodHRwOi8vZG93bmxvYWQubW9uby1wcm9qZWN0LmNvbS9yZXBvL2RlYmlhbiB4ZW5pYWwgbWFpbiIgfCB0ZWUgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbW9uby5saXN0ICYmIFwKKyMgICAgIGFwdC1rZXkgYWR2IC0ta2V5c2VydmVyIGtleXNlcnZlci51YnVudHUuY29tIC0tcmVjdi1rZXlzIEE2QTE5QjM4RDNEODMxRUYKKworIyBECitSVU4gYXB0LWtleSBhZHYgLS1rZXlzZXJ2ZXIga2V5c2VydmVyLnVidW50dS5jb20gLS1yZWN2LWtleXMgRUJDRjk3NUU1QkEyNEQ1RSAmJiBcCisgICAgd2dldCBodHRwOi8vbWFzdGVyLmRsLnNvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L2QtYXB0L2ZpbGVzL2QtYXB0Lmxpc3QgLU8gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZC1hcHQubGlzdCAmJiBcCisgICAgd2dldCAtcU8gLSBodHRwczovL2RsYW5nLm9yZy9kLWtleXJpbmcuZ3BnIHwgYXB0LWtleSBhZGQgLQorCisjIERhcnQKK1JVTiBjdXJsIGh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vbGludXgvbGludXhfc2lnbmluZ19rZXkucHViIHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgY3VybCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQuZGFydGxhbmcub3JnL2xpbnV4L2RlYmlhbi9kYXJ0X3N0YWJsZS5saXN0ID4gXAorICAgICAgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGFydF9zdGFibGUubGlzdAorRU5WIERBUlRfVkVSU0lPTiAxLjIyLjEtMQorCisjIGRvdG5ldCAoY29yZSkKK1JVTiBjdXJsIGh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9rZXlzL21pY3Jvc29mdC5hc2MgfCBncGcgLS1kZWFybW9yID4gL2V0Yy9hcHQvdHJ1c3RlZC5ncGcuZC9taWNyb3NvZnQuZ3BnICYmIFwKKyAgICBlY2hvICJkZWIgW2FyY2g9YW1kNjRdIGh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9yZXBvcy9taWNyb3NvZnQtdWJ1bnR1LXhlbmlhbC1wcm9kIHhlbmlhbCBtYWluIiA+IFwKKyAgICAgIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RvdG5ldGRldi5saXN0CisKKyMgbm9kZS5qcworUlVOIGN1cmwgLXNMIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL2dwZ2tleS9ub2Rlc291cmNlLmdwZy5rZXkgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBlY2hvICJkZWIgaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vbm9kZV82LnggeGVuaWFsIG1haW4iIHwgdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL25vZGVzb3VyY2UubGlzdAorCisjIyMgaW5zdGFsbCBnZW5lcmFsIGRlcGVuZGVuY2llcworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHZW5lcmFsIGRlcGVuZGVuY2llc2AgXAorICAgICAgYmFzaC1jb21wbGV0aW9uIFwKKyAgICAgIGJpc29uIFwKKyAgICAgIGJ1aWxkLWVzc2VudGlhbCBcCisgICAgICBjbGFuZyBcCisgICAgICBjbWFrZSBcCisgICAgICBkZWJoZWxwZXIgXAorICAgICAgZmxleCBcCisgICAgICBnZGIgXAorICAgICAgbGx2bSBcCisgICAgICBuaW5qYS1idWlsZCBcCisgICAgICBwa2ctY29uZmlnIFwKKyAgICAgIHZhbGdyaW5kIFwKKyAgICAgIHZpbQorRU5WIFBBVEggL3Vzci9saWIvbGx2bS0zLjgvYmluOiRQQVRICisKKyMjIyBsYW5ndWFnZXMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBDKysgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJib29zdC1kZXYgXAorICAgICAgbGliYm9vc3QtZmlsZXN5c3RlbS1kZXYgXAorICAgICAgbGliYm9vc3QtcHJvZ3JhbS1vcHRpb25zLWRldiBcCisgICAgICBsaWJib29zdC1zeXN0ZW0tZGV2IFwKKyAgICAgIGxpYmJvb3N0LXRlc3QtZGV2IFwKKyAgICAgIGxpYmJvb3N0LXRocmVhZC1kZXYgXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgcXQ1LWRlZmF1bHQgXAorICAgICAgcXRiYXNlNS1kZXYgXAorICAgICAgcXRiYXNlNS1kZXYtdG9vbHMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBjc2hhcnAgKG1vbm8pIGRlcGVuZGVuY2llc2AgXAorICAgICAgbW9uby1kZXZlbAorCitFTlYgRF9WRVJTSU9OIDIuMDc1LjEtMAorUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLWFsbG93LXVuYXV0aGVudGljYXRlZCAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEIGRlcGVuZGVuY2llc2AgXAorICAgICAgZG1kLWJpbj0kRF9WRVJTSU9OIFwKKyAgICAgIGxpYnBob2JvczItZGV2PSREX1ZFUlNJT04gXAorICAgICAgZHViPTEuNi4wLTAgXAorICAgICAgZGZtdCBcCisgICAgICBkc2Nhbm5lciBcCisgICAgICBsaWJldmVudC1kZXYgXAorICAgICAgbGlic3NsLWRldiBcCisgICAgICB4ZGctdXRpbHMKK1JVTiBta2RpciAtcCAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQyAmJiBcCisgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9saWJldmVudC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBsaWJldmVudC1tYXN0ZXIKK1JVTiBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL29wZW5zc2wvYXJjaGl2ZS92MS4xLjYrMS4wLjFnLnRhci5neiB8IHRhciB4eiAmJiBcCisgICAgbXYgb3BlbnNzbC0xLjEuNi0xLjAuMWcvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgb3BlbnNzbC0xLjEuNi0xLjAuMWcvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgb3BlbnNzbC0xLjEuNi0xLjAuMWcKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEYXJ0IGRlcGVuZGVuY2llc2AgXAorICAgICAgZGFydD0kREFSVF9WRVJTSU9OCitFTlYgUEFUSCAvdXNyL2xpYi9kYXJ0L2JpbjokUEFUSAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGRvdG5ldCBjb3JlIGRlcGVuZGVuY2llc2AgXAorICAgICAgZG90bmV0LXNkay0yLjEuNAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEVybGFuZyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGVybGFuZy1iYXNlIFwKKyAgICAgIGVybGFuZy1ldW5pdCBcCisgICAgICBlcmxhbmctZGV2IFwKKyAgICAgIGVybGFuZy10b29scyBcCisgICAgICByZWJhcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdsaWJDIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliZ2xpYjIuMC1kZXYKKworIyBnb2xhbmcKK0VOViBHT0xBTkdfVkVSU0lPTiAxLjcuNgorRU5WIEdPTEFOR19ET1dOTE9BRF9VUkwgaHR0cHM6Ly9nb2xhbmcub3JnL2RsL2dvJEdPTEFOR19WRVJTSU9OLmxpbnV4LWFtZDY0LnRhci5negorRU5WIEdPTEFOR19ET1dOTE9BRF9TSEEyNTYgYWQ1ODA4YmY0MmIwMTRjMjJkZDc2NDY0NThmNjMxMzg1MDAzMDQ5ZGVkMGJiNmFmMmVmYzdmMWY3OWZhMjllYQorUlVOIGN1cmwgLWZzU0wgIiRHT0xBTkdfRE9XTkxPQURfVVJMIiAtbyBnb2xhbmcudGFyLmd6ICYmIFwKKyAgICAgIGVjaG8gIiRHT0xBTkdfRE9XTkxPQURfU0hBMjU2ICBnb2xhbmcudGFyLmd6IiB8IHNoYTI1NnN1bSAtYyAtICYmIFwKKyAgICAgIHRhciAtQyAvdXNyL2xvY2FsIC14emYgZ29sYW5nLnRhci5neiAmJiBcCisgICAgICBsbiAtcyAvdXNyL2xvY2FsL2dvL2Jpbi9nbyAvdXNyL2xvY2FsL2JpbiAmJiBcCisgICAgICBybSBnb2xhbmcudGFyLmd6CisKKyMgZHVlIHRvIGEgYnVnIGluIGNhYmFsIGluIHhlbmlhbCAoY2FiYWwtaW5zdGFsbCBwYWNrYWdlKSB3ZSBwdWxsIGluIGFub3RoZXI6CitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhhc2tlbGwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBnaGMgJiYgXAorICAgIGNkIC90bXAgJiYgXAorICAgIHdnZXQgLXEgaHR0cHM6Ly93d3cuaGFza2VsbC5vcmcvY2FiYWwvcmVsZWFzZS9jYWJhbC1pbnN0YWxsLTEuMjQuMC4yL2NhYmFsLWluc3RhbGwtMS4yNC4wLjIteDg2XzY0LXVua25vd24tbGludXgudGFyLmd6ICYmIFwKKyAgICB0YXIgeHpmIGNhYmFsLWluc3RhbGwtMS4yNC4wLjIteDg2XzY0LXVua25vd24tbGludXgudGFyLmd6ICYmIFwKKyAgICBmaW5kIGRpc3QtbmV3c3R5bGUvIC10eXBlIGYgLW5hbWUgY2FiYWwgLWV4ZWMgbXYge30gL3Vzci9iaW4gXDsgJiYgXAorICAgIHJtIC1yZiAvdG1wL2NhYmFsKiAmJiBcCisgICAgY2FiYWwgLS12ZXJzaW9uCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGF4ZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGhheGUgXAorICAgICAgbmVrbyBcCisgICAgICBuZWtvLWRldiBcCisgICAgICBsaWJuZWtvMCAmJiBcCisgICAgaGF4ZWxpYiBzZXR1cCAtLWFsd2F5cyAvdXNyL3NoYXJlL2hheGUvbGliICYmIFwKKyAgICBoYXhlbGliIGluc3RhbGwgLS1hbHdheXMgaHhjcHAgMy40LjY0IDI+JjEgPiAvZGV2L251bGwKKyMgbm90ZTogaHhjcHAgMy40LjE4NSAobGF0ZXN0KSBubyBsb25nZXIgc2hpcHMgc3RhdGljIGxpYnJhcmllcywgYW5kIGNhdXNlZCBhIGJ1aWxkIGZhaWx1cmUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKYXZhIGRlcGVuZGVuY2llc2AgXAorICAgICAgYW50IFwKKyAgICAgIGFudC1vcHRpb25hbCBcCisgICAgICBvcGVuamRrLTgtamRrIFwKKyAgICAgIG1hdmVuCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTHVhIGRlcGVuZGVuY2llc2AgXAorICAgICAgbHVhNS4yIFwKKyAgICAgIGx1YTUuMi1kZXYKKyMgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2UvbHVhNS4zLytidWcvMTcwNzIxMgorIyBsdWE1LjMgZG9lcyBub3QgaW5zdGFsbCBhbHRlcm5hdGl2ZXMgc28gc3RpY2sgd2l0aCA1LjIgaGVyZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE5vZGUuanMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBub2RlanMKKworIyBUZXN0IGRlcGVuZGVuY2llcyBmb3IgcnVubmluZyBwdXBwZXRlZXIKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSlMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJ4c3MxIFwKKyAgICAgIGxpYmF0ay1icmlkZ2UyLjAtMCBcCisgICAgICBsaWJndGstMy0wCisKKyMgVEhSSUZULTQ1MTc6IGNhdXNlcyBzdGFjayBvdmVyZmxvd3M7IHZlcnNpb24gdG9vIG9sZDsgc2tpcCBvY2FtbCBpbiB4ZW5pYWwKKyMgUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisjIGAjIE9DYW1sIGRlcGVuZGVuY2llc2AgXAorIyAgICAgICBvY2FtbCBcCisjICAgICAgIG9wYW0gJiYgXAorIyAgICAgb3BhbSBpbml0IC0teWVzICYmIFwKKyMgICAgIG9wYW0gaW5zdGFsbCAtLXllcyBvYXNpcworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBlcmwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJiaXQtdmVjdG9yLXBlcmwgXAorICAgICAgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybCBcCisgICAgICBsaWJjcnlwdC1zc2xlYXktcGVybCBcCisgICAgICBsaWJpby1zb2NrZXQtc3NsLXBlcmwgXAorICAgICAgbGlibmV0LXNzbGVheS1wZXJsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGhwIGRlcGVuZGVuY2llc2AgXAorICAgICAgcGhwNy4wIFwKKyAgICAgIHBocDcuMC1jbGkgXAorICAgICAgcGhwNy4wLWRldiBcCisgICAgICBwaHAtcGVhciBcCisgICAgICByZTJjIFwKKyAgICAgIGNvbXBvc2VyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUHl0aG9uIGRlcGVuZGVuY2llc2AgXAorICAgICAgcHl0aG9uLWFsbCBcCisgICAgICBweXRob24tYWxsLWRiZyBcCisgICAgICBweXRob24tYWxsLWRldiBcCisgICAgICBweXRob24tYmFja3BvcnRzLnNzbC1tYXRjaC1ob3N0bmFtZSBcCisgICAgICBweXRob24taXBhZGRyZXNzIFwKKyAgICAgIHB5dGhvbi1waXAgXAorICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uLXNpeCBcCisgICAgICBweXRob24tdG9ybmFkbyBcCisgICAgICBweXRob24tdHdpc3RlZCBcCisgICAgICBweXRob24td2hlZWwgXAorICAgICAgcHl0aG9uLXpvcGUuaW50ZXJmYWNlIFwKKyAgICAgIHB5dGhvbjMtYWxsIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRiZyBcCisgICAgICBweXRob24zLWFsbC1kZXYgXAorICAgICAgcHl0aG9uMy1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbjMtc2l4IFwKKyAgICAgIHB5dGhvbjMtdG9ybmFkbyBcCisgICAgICBweXRob24zLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uMy13aGVlbCBcCisgICAgICBweXRob24zLXpvcGUuaW50ZXJmYWNlICYmIFwKKyAgICBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1YnkgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydWJ5IFwKKyAgICAgIHJ1YnktZGV2IFwKKyAgICAgIHJ1YnktYnVuZGxlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1c3QgZGVwZW5kZW5jaWVzYCBcCisgICAgICBjYXJnbyBcCisgICAgICBydXN0YworCisjIENsZWFuIHVwCitSVU4gcm0gLXJmIC92YXIvY2FjaGUvYXB0LyogJiYgXAorICAgIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKiAmJiBcCisgICAgcm0gLXJmIC90bXAvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvdG1wLyoKKworRU5WIERPVE5FVF9DTElfVEVMRU1FVFJZX09QVE9VVCAxCitFTlYgVEhSSUZUX1JPT1QgL3RocmlmdAorUlVOIG1rZGlyIC1wICRUSFJJRlRfUk9PVC9zcmMKK0NPUFkgRG9ja2VyZmlsZSAkVEhSSUZUX1JPT1QvCitXT1JLRElSICRUSFJJRlRfUk9PVC9zcmMKZGlmZiAtLWdpdCBhL2J1aWxkL2ZpeGNoYW5nZXMuc2ggYi9idWlsZC9maXhjaGFuZ2VzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZjNTdiNTQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9maXhjaGFuZ2VzLnNoCkBAIC0wLDAgKzEsMzkgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyBmaXhjaGFuZ2VzIHdpbGwgdGFrZSBhIGZpbGUgYXMgaW5wdXQgYW5kIGxvb2sgZm9yIHRleHQgbWF0Y2hpbmcKKyMgdGhlIHBhdHRlcm4gW1RIUklGVC1ubm5uXSAodGhlIG51bWJlciBvZiBkaWdpdHMgaXMgbm90IGltcG9ydGFudCkKKyMgd2hpY2ggaXMgbm90IGEgbWFya2Rvd24gbGluaywgYW5kIGNoYW5nZSBpdCB0byBiZSBhIG1hcmtkb3duIGxpbmsuCisjIFRoZSB0b29sIHdyaXRlcyB0byBzdGRvdXQgc28geW91IGNhbiByZWRpcmVjdCBpdCB0byBhIHRlbXBvcmFyeQorIyBmaWxlIGFuZCB0aGVuIGNvbXBhcmUgYWdhaW5zdCB0aGUgb3JpZ2luYWwgZmlsZSBiZWZvcmUgcmVwbGFjaW5nCisjIGl0LgorIworIyBUaGlzIHRvb2wgd2FzIGRldmVsb3BlZCBhZnRlciB0aGUgMC4xMi4wIHJlbGVhc2UgdG8gYXNzaXN0IHdpdGgKKyMgZ2VuZXJhdGlvbiBvZiBDSEFOR0VTLm1kIGNvbnRlbnQuCisjCisKK3doaWxlIElGUz0nJyByZWFkIC1yIGxpbmUgfHwgW1sgLW4gIiRsaW5lIiBdXTsgZG8KKyAgICBpZiBbWyAiJGxpbmUiID1+IF4oLiopXFsoVEhSSUZULVtbOmRpZ2l0Ol1dKylcXVteXChdKC4qKSQgXV07IHRoZW4KKyAgICAgICAgZWNobyAiJHtCQVNIX1JFTUFUQ0hbMV19WyR7QkFTSF9SRU1BVENIWzJdfV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS8ke0JBU0hfUkVNQVRDSFsyXX0pICR7QkFTSF9SRU1BVENIWzNdfSIKKyAgICBlbHNlCisgICAgICAgIGVjaG8gIiRsaW5lIgorICAgIGZpCitkb25lIDwgIiQxIgpkaWZmIC0tZ2l0IGEvYnVpbGQvdmVyYWxpZ24uc2ggYi9idWlsZC92ZXJhbGlnbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MTc0NGI0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvdmVyYWxpZ24uc2gKQEAgLTAsMCArMSwzMTMgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjIFRoZSB2ZXJhbGlnbiBzY3JpcHQgc2V0cyB0aGUgYXBwcm9wcmlhdGUgdmVyc2lvbnMgaW4gYWxsIG9mCisjIHRoZSBwYWNrYWdlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIGFsbCBvZiB0aGUgc3VwcG9ydGVkCisjIGxhbmd1YWdlcy4gIEl0IGlzIHVzZWQgdG8gcHJlcGFyZSBhIHJlbGVhc2Ugb3IgbW92ZSBtYXN0ZXIKKyMgZm9yd2FyZCB0byB0aGUgbmV4dCBhbnRpY2lwYXRlZCB2ZXJzaW9uLgorIworIyBVU0FHRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB1c2FnZTogdmVyYWxpZ24uc2ggPG9sZFZlcnNpb24+IDxuZXdWZXJzaW9uPgorIworIyBFWEFNUExFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICQgLi92ZXJhbGlnbi5zaCAwLjEyLjAgMS4wLjAKKyMgJCAuL3ZlcmFsaWduLnNoIDEuMC4wIDEuMS4wCisjCisjIElNUE9SVEFOVCBVU0FHRSBOT1RFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgRFJZUlVOIHRvIGhhdmUgdGhlIHNjcmlwdAorIyBwcmludCBvdXQgYWxsIG1hdGNoZXMgdG8gdGhlIG9sZFZlcnNpb24gaGlsaWdodGVkIHNvIHRoYXQKKyMgeW91IGNhbiB2ZXJpZnkgaXQgd2lsbCBjaGFuZ2UgdGhlIHJpZ2h0IHRoaW5ncy4KKyMKKworZGVjbGFyZSAtQSBGSUxFUworCisjIFRoZXNlIGZpbGVzIHJlcXVpcmUgYSBtYW51YWwgdG91Y2g6CitGSUxFU1tDSEFOR0VTLm1kXT1tYW51YWwKK0ZJTEVTW2RlYmlhbi9jaGFuZ2Vsb2ddPW1hbnVhbAorRklMRVNbZG9hcC5yZGZdPW1hbnVhbAorCisjIFRoZXNlIGZpbGVzIGNhbiBiZSB1cGRhdGVkIGF1dG9tYXRpY2FsbHk6CitGSUxFU1tBcGFjaGVUaHJpZnQubnVzcGVjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tUaHJpZnQtc3dpZnQzLnBvZHNwZWNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW1RocmlmdC5wb2RzcGVjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1thcHB2ZXlvci55bWxdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2Jvd2VyLmpzb25dPWpzb25SZXBsYWNlCitGSUxFU1tidWlsZC9jbWFrZS9EZWZpbmVDTWFrZURlZmF1bHRzLmNtYWtlXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tjb25maWd1cmUuYWNdPWNvbmZpZ3VyZVJlcGxhY2UKK0ZJTEVTW2NvbnRyaWIvdGhyaWZ0LnNwZWNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jb2NvYS9zcmMvVGhyaWZ0LmhdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0TVNCdWlsZFRhc2suY3Nwcm9qXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL3NyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC9zcmMvVGhyaWZ0LmNzcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4Q2xpZW50LmNzcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL011bHRpcGxleFNlcnZlci5jc3Byb2pdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2Qvc3JjL3RocmlmdC9iYXNlLmRdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9kYXJ0L3B1YnNwZWMueWFtbF09cHVic3BlY1JlcGxhY2UKK0ZJTEVTW2xpYi9kZWxwaGkvc3JjL1RocmlmdC5wYXNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9lcmwvc3JjL3RocmlmdC5hcHAuc3JjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvaGF4ZS9oYXhlbGliLmpzb25dPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9ocy90aHJpZnQuY2FiYWxdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9qYXZhL2dyYWRsZS5wcm9wZXJ0aWVzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvanMvcGFja2FnZS5qc29uXT1qc29uUmVwbGFjZQorRklMRVNbbGliL2pzL3NyYy90aHJpZnQuanNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9sdWEvVGhyaWZ0Lmx1YV09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL25ldGNvcmUvVGhyaWZ0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEh0dHBDbGllbnRUcmFuc3BvcnQuY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9vY2FtbC9fb2FzaXNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9wZXJsL2xpYi9UaHJpZnQucG1dPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9weS9zZXR1cC5weV09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL3JiL3RocmlmdC5nZW1zcGVjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvcnMvQ2FyZ28udG9tbF09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL3N0L3BhY2thZ2UueG1sXT1zaW1wbGVSZXBsYWNlCitGSUxFU1twYWNrYWdlLmpzb25dPWpzb25SZXBsYWNlCitGSUxFU1tzb25hci1wcm9qZWN0LnByb3BlcnRpZXNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW3Rlc3QvY3NoYXJwL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0ZXN0L2NzaGFycC9UaHJpZnRUZXN0LmNzcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L3B1YnNwZWMueWFtbF09cHVic3BlY1JlcGxhY2UKK0ZJTEVTW3Rlc3QvZXJsL3NyYy90aHJpZnRfdGVzdC5hcHAuc3JjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9kYXJ0L2NsaWVudC9wdWJzcGVjLnlhbWxdPXB1YnNwZWNSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50L3B1YnNwZWMueWFtbF09cHVic3BlY1JlcGxhY2UKK0ZJTEVTW3R1dG9yaWFsL2RhcnQvc2VydmVyL3B1YnNwZWMueWFtbF09cHVic3BlY1JlcGxhY2UKK0ZJTEVTW3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwcm9qXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvaHMvVGhyaWZ0VHV0b3JpYWwuY2FiYWxdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW3R1dG9yaWFsL29jYW1sL19vYXNpc109c2ltcGxlUmVwbGFjZQorCitpZiBbICEgLWYgIkNIQU5HRVMiIF07IHRoZW4KKyAgICA+JjIgZWNobyAiZXJyb3I6IHJ1biB2ZXJhbGlnbi5zaCB3aGlsZSBpbiB0aGUgdGhyaWZ0IHJvb3QgZGlyZWN0b3J5IgorICAgIGV4aXQgMQorZmkKKworaWYgWyAkIyAtbmUgMiBdOyB0aGVuCisgICAgPiYyIGVjaG8gInVzYWdlOiB2ZXJhbGlnbi5zaCA8b2xkVmVyc2lvbj4gPG5ld1ZlcnNpb24+IgorICAgIGV4aXQgMQorZmkKKworanEgLS12ZXJzaW9uIDE+L2Rldi9udWxsIDI+L2Rldi9udWxsCitpZiBbICQ/IC1uZSAwIF07IHRoZW4KKyAgICA+JjIgZWNobyAiZXJyb3I6IHRoZSAnanEnIHBhY2thZ2UgaXMgbm90IGluc3RhbGxlZCIKKyAgICBleGl0IDEKK2ZpCisKKyMKKyMgdmFsaWRhdGVWZXJzaW9uOiBjaGVjayB0aGF0IGEgdmVyc2lvbiBtYXRjaGVzIHRoZSBtYWpvci5taW5vci5wYXRjaAorIyAgIGZvcm1hdCB3aGljaCBpcyB0aGUgbG93ZXN0IGNvbW1vbiBkZW5vbWluYXRvciBzdXBwb3J0ZWQgYnkgYWxsCisjICAgcHJvamVjdCBzeXN0ZW1zLgorIyBccGFyYW0gJDEgdGhlIHZlcnNpb24KKyMgXHJldHVybnMgMCBpZiB0aGUgdmVyc2lvbiBpcyBjb21wbGlhbnQKKyMKK2Z1bmN0aW9uIHZhbGlkYXRlVmVyc2lvbgoreworICAgIGxvY2FsIHJlc3VsdAorICAgIGxvY2FsIHZhbGlkCisgICAgdmFsaWQ9JChlY2hvICIkMSIgfCBzZWQgJy9eW1s6ZGlnaXQ6XV1cK1wuW1s6ZGlnaXQ6XV1cK1wuW1s6ZGlnaXQ6XV1cKyQvIXtxMjJ9JykKKyAgICByZXN1bHQ9JD8KKyAgICBpZiBbICRyZXN1bHQgLWVxIDIyIF07IHRoZW4KKyAgICAgICAgPiYyIGVjaG8gImVycm9yOiB2ZXJzaW9uICckMScgZG9lcyBub3QgY29uZm9ybSB0byB0aGUgcmVxdWlyZWQgbWFqb3IubWlub3IucGF0Y2ggZm9ybWF0IgorICAgICAgICByZXR1cm4gJHtyZXN1bHR9CisgICAgZmkKK30KKworT0xEVkVSU0lPTj0kMQorTkVXVkVSU0lPTj0kMgordmFsaWRhdGVWZXJzaW9uICIke09MRFZFUlNJT059IiB8fCBleGl0ICQ/Cit2YWxpZGF0ZVZlcnNpb24gIiR7TkVXVkVSU0lPTn0iIHx8IGV4aXQgJD8KKworIworIyBlc2NhcGVWZXJzaW9uOiBlc2NhcGUgdGhlIHZlcnNpb24gZm9yIHVzZSBhcyBhIHNlZCBzZWFyY2gKKyMgXHBhcmFtICQxIHRoZSB2ZXJzaW9uIHRvIGVzY2FwZQorIyBcb3V0cHV0IHRoZSBlc2NhcGVkIHN0cmluZworIyBccmV0dXJucyAwCisjIFxleGFtcGxlIFZFUlNFQVJDSD0kKGVzY2FwZVZlcnNpb24gIlsxLjAuMF0iKTsgZWNobyAkVkVSU0VBUkNIOyA9PiAiXFsxXC4wXC4wXF0iCisjCitmdW5jdGlvbiBlc2NhcGVWZXJzaW9uCit7CisgICAgZWNobyAiJChlY2hvICQxIHwgc2VkICdzL1wuL1xcLi9nJyB8IHNlZCAncy9cWy9cXFxbL2cnIHwgc2VkICdzL1xdL1xcXF0vZycpIgorfQorCisjIFNldCB1cCB2ZXJib3NlIGhpbGlnaHRpbmcgaWYgcnVubmluZyBpbnRlcmFjdGl2ZQoraWYgWyAiJCh0cHV0IGNvbG9ycykiIC1uZSAwIF07IHRoZW4KKyAgICByZXZlcnNlPSQodHB1dCByZXYpCisgICAgcmVkPSQodHB1dCBzZXRhZiAxKQorICAgIGdyZWVuPSQodHB1dCBzZXRhZiAyKQorICAgIHllbGxvdz0kKHRwdXQgc2V0YWYgMykKKyAgICBub3JtYWw9JCh0cHV0IHNncjApCitmaQorCitkZWNsYXJlIC1BIE1BTlVBTAorCisjCisjIG1hbnVhbDogbm90ZSB0aGF0IHVwZGF0ZSBvZiBzYWlkIGZpbGUgaXMgbWFudWFsCisjIFxwYXJhbSAkMSBmaWxlbmFtZSB0byBkbyByZXBsYWNlbWVudHMgb24KKyMgXHJldHVybnMgMAorIworZnVuY3Rpb24gbWFudWFsCit7CisgICAgTUFOVUFMWyIkMSJdPSIiCisgICAgcmV0dXJuIDAKK30KKworIworIyBjb25maWd1cmVSZXBsYWNlOiByZXBsYWNlIHRoZSBBQ19JTklUIGZpZWxkIGluIGNvbmZpZ3VyZS5hYworIyBccGFyYW0gJDEgZmlsZW5hbWUgdG8gZG8gcmVwbGFjZW1lbnRzIG9uCisjIFxyZXR1cm5zIDAgb24gc3VjY2VzcworIworCitmdW5jdGlvbiBjb25maWd1cmVSZXBsYWNlCit7CisgICAgcmVwbGFjZSAiJDEiICJbdGhyaWZ0XSwgWyR7T0xEVkVSU0lPTn1dIiAiW3RocmlmdF0sIFske05FV1ZFUlNJT059XSIKK30KKworIworIyBqc29uUmVwbGFjZTogcmVwbGFjZSBhIHNwZWNpZmljIHZlcnNpb24gZmllbGQgaW4gYSBKU09OIGZpbGUKKyMgICBtdXN0IGJlIGEgdG9wIGxldmVsICJ2ZXJzaW9uIiBmaWVsZCBpbiB0aGUganNvbiBzdHJ1Y3R1cmUKKyMgXHBhcmFtICQxIGZpbGVuYW1lIHRvIGRvIHJlcGxhY2VtZW50cyBvbgorIyBccmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyMKKworZnVuY3Rpb24ganNvblJlcGxhY2UKK3sKKyAgICBsb2NhbCByZXN1bHQKKyAgICBsb2NhbCBvdXRwdXQKKyAgICBpZiBbICEgLXogIiREUllSVU4iIF07IHRoZW4KKyAgICAgICAgb3V0cHV0PSQoanEgLWUgIi52ZXJzaW9uIiAiJDEiKQorICAgIGVsc2UKKyAgICAgICAgb3V0cHV0PSQoanEgLWUgIi52ZXJzaW9uID0gXCIke05FV1ZFUlNJT059XCIiICIkMSIgPiB0bXAuJCQuanNvbiAmJiBtdiB0bXAuJCQuanNvbiAiJDEiKQorICAgIGZpCisgICAgcmVzdWx0PSQ/CisgICAgaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisgICAgICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCAke3JlZH1FUlJPUiR7bm9ybWFsfTogdmVyc2lvbiB0YWcgbm90IGZvdW5kIiAiJDEiICIkY291bnQiCisgICAgICAgIGVjaG8KKyAgICAgICAgcmV0dXJuIDEKKyAgICBlbGlmIFsgISAteiAiJERSWVJVTiIgXTsgdGhlbgorICAgICAgICBvdXRwdXQ9JHtvdXRwdXQlXCJ9CisgICAgICAgIG91dHB1dD0ke291dHB1dCNcIn0KKyAgICAgICAgcHJpbnRmICIlLTYwcyB8ICU1ZCB8IE1BVENIRVM6ICAgdmVyc2lvbjogXCIke3JldmVyc2V9JHtncmVlbn0ke291dHB1dH0ke25vcm1hbH1cIiIgIiQxIiAxCisgICAgICAgIGVjaG8KKyAgICAgICAgcmV0dXJuIDAKKyAgICBmaQorICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCAke2dyZWVufU9LJHtub3JtYWx9IiAiJDEiIDEKKyAgICBlY2hvCisgICAgcmV0dXJuIDAKK30KKworIworIyBwdWJzcGVjUmVwbGFjZTogcmVwbGFjZSBhIHNwZWNpZmljIHZlcnNpb24gZmllbGQgaW4gYSBZQU1MIGZpbGUKKyMgICBtdXN0IGJlIGEgdG9wIGxldmVsICJ2ZXJzaW9uIiBmaWVsZCBpbiB0aGUgeWFtbCBzdHJ1Y3R1cmUKKyMgICBkaWQgbm90IGZpbmQgYSBwYWNrYWdlIHRoYXQgcHJlc2VydmVzIGNvbW1lbnRzIHNvIHRoaXMgaXMKKyMgICBzb21ld2hhdCBicmFpbi1kZWFkLCBidXQgaXQgZ2V0cyB0aGUgam9iIGRvbmUKKyMgXHBhcmFtICQxIGZpbGVuYW1lIHRvIGRvIHJlcGxhY2VtZW50cyBvbgorIyBccmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyMKKworZnVuY3Rpb24gcHVic3BlY1JlcGxhY2UKK3sKKyAgICByZXBsYWNlICIkMSIgInZlcnNpb246ICR7T0xEVkVSU0lPTn0iICJ2ZXJzaW9uOiAke05FV1ZFUlNJT059IgorfQorCisjCisjIHJlcGxhY2U6IHJlcGxhY2Ugb2NjdXJyZW5jZXMgb2Ygb25lIHN0cmluZyB3aXRoIGFub3RoZXIKKyMgICAgIHRoZSBmaWxlIHNwZWNpZmllZCBtdXN0IGNvbnRhaW4gdGhlIG9sZCBzdHJpbmcgYXQgbGVhc3Qgb25jZQorIyAgICAgaW4gb3JkZXIgdG8gYmUgc3VjY2Vzc2Z1bC4KKyMgXHBhcmFtICQxIGZpbGVuYW1lIHRvIGRvIHJlcGxhY2VtZW50cyBvbgorIyBccGFyYW0gJDIgdGhlICJvbGQiIHN0cmluZyB0byBiZSByZXBsYWNlZAorIyBccGFyYW0gJDMgdGhlICJuZXciIHN0cmlpbmcgdG8gcmVwbGFjZSBpdCB3aXRoCisjIFxyZXR1cm5zIDAgb24gc3VjY2VzcworIworZnVuY3Rpb24gcmVwbGFjZQoreworICAgIGxvY2FsIHJlc3VsdAorICAgIGxvY2FsIG91dHB1dAorICAgIGxvY2FsIG9sZFN0cmluZz0iJDIiCisgICAgbG9jYWwgbmV3U3RyaW5nPSIkMyIKKyAgICBsb2NhbCBvbGRSZWdleD0kKGVzY2FwZVZlcnNpb24gIiR7b2xkU3RyaW5nfSIpCisgICAgbG9jYWwgY291bnQ9JChncmVwIC1FYyAiJHtvbGRSZWdleH0iICIkMSIpCisgICAgbG9jYWwgdmVyYm9zZQorICAgIGlmIFsgJGNvdW50IC1lcSAwIF07IHRoZW4KKyAgICAgICAgcHJpbnRmICIlLTYwcyB8ICU1ZCB8ICR7cmVkfU5PVCBGT1VORCR7bm9ybWFsfTogJHtvbGRTdHJpbmd9IiAiJDEiIDAKKyAgICAgICAgZWNobworICAgICAgICByZXR1cm4gMQorICAgIGVsaWYgWyAhIC16ICIkRFJZUlVOIiBdOyB0aGVuCisgICAgICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCBNQVRDSEVTOiIgIiQxIiAiJGNvdW50IgorICAgICAgICBlY2hvCisgICAgICAgIHdoaWxlIHJlYWQgLXIgbGluZTsgZG8KKyAgICAgICAgICAgIGVjaG8gIiA+ICQoZWNobyAiJGxpbmUiIHwgc2VkICJzLyR7b2xkUmVnZXh9LyR7cmV2ZXJzZX0ke2dyZWVufSR7b2xkU3RyaW5nfSR7bm9ybWFsfS9nIikiCisgICAgICAgIGRvbmUgPCA8KGdyZXAgLUUgIiR7b2xkUmVnZXh9IiAiJDEiKQorICAgICAgICByZXR1cm4gMAorICAgIGZpCisgICAgb3V0cHV0PSQoc2VkIC1pICJzLyR7b2xkUmVnZXh9LyR7bmV3U3RyaW5nfS9nIiAiJDEiKQorICAgIHJlc3VsdD0kPworICAgIGlmIFsgJHJlc3VsdCAtbmUgMCBdOyB0aGVuCisgICAgICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCAke3JlZH1FUlJPUiR7bm9ybWFsfTogJXMiICIkMSIgIiRjb3VudCIgIiRvdXRwdXQiCisgICAgICAgIGVjaG8KKyAgICAgICAgcmV0dXJuIDEKKyAgICBmaQorICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCAke2dyZWVufU9LJHtub3JtYWx9IiAiJDEiICIkY291bnQiCisgICAgZWNobworICAgIHJldHVybiAwCit9CisKKyMKKyMgc2ltcGxlUmVwbGFjZTogcmVwbGFjZSBvY2N1cnJlbmNlcyBvZiAke09MRFZFUlNJT059IHdpdGggJHtORVdWRVJTSU9OfQorIyAgICAgdGhlIGZpbGUgc3BlY2lmaWVkIG11c3QgY29udGFpbiBPTERWRVJTSU9OIGF0IGxlYXN0IG9uY2UKKyMgICAgIGluIG9yZGVyIHRvIGJlIHN1Y2Nlc3NmdWwuCisjIFxwYXJhbSAkMSBmaWxlbmFtZSB0byBkbyByZXBsYWNlbWVudHMgb24KKyMgXHBhcmFtICQyIHRoZSAib2xkIiBzdHJpbmcgdG8gYmUgcmVwbGFjZWQKKyMgXHBhcmFtICQzIHRoZSAibmV3IiBzdHJpaW5nIHRvIHJlcGxhY2UgaXQgd2l0aAorIyBccmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyMKK2Z1bmN0aW9uIHNpbXBsZVJlcGxhY2UKK3sKKyAgICByZXBsYWNlICIkMSIgIiR7T0xEVkVSU0lPTn0iICIke05FV1ZFUlNJT059IgorfQorCitlY2hvICIiCitlY2hvICJBcGFjaGUgVGhyaWZ0IFZlcnNpb24gQWxpZ25tZW50IFRvb2wiCitlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCitlY2hvICIiCitlY2hvICJQcmV2aW91cyBWZXJzaW9uOiAke09MRFZFUlNJT059IgorZWNobyAiICAgICBOZXcgVmVyc2lvbjogJHtORVdWRVJTSU9OfSIKK2VjaG8gIiIKK2VjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorZWNobyAiRmlsZW5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ291bnQgfCBTdGF0dXMgICAgICAgICAgICAgICAiCitlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKworZm9yIGZpbGUgaW4gJChlY2hvICIkeyFGSUxFU1tAXX0iIHwgc29ydCk7IGRvCisgICAgJHtGSUxFU1skZmlsZV19ICRmaWxlIHx8IGV4aXQgJD8KK2RvbmUKKworZWNobworZWNobyAiRmlsZXMgdGhhdCBtdXN0IGJlIG1vZGlmaWVkIG1hbnVhbGx5OiIKK2VjaG8KK2ZvciBtYW51IGluICQoZWNobyAiJHshTUFOVUFMW0BdfSIgfCBzb3J0KTsgZG8KKyAgICBlY2hvICIgPiAke3llbGxvd30ke21hbnV9JHtub3JtYWx9IgorZG9uZQorCitleGl0IDAKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9SRUFETUUubWQgYi9idWlsZC93aW5jcHAvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMzE3ODAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC93aW5jcHAvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjE5IEBACis8IS0tLQorTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCisjIEJ1aWxkaW5nIHRocmlmdCBvbiBXaW5kb3dzIChOYXRpdmUpCisKK1RocmlmdCB1c2VzIGNtYWtlIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGJ1aWxkIHRoZSBwcm9qZWN0IG9uIG11bHRpcGxlIHBsYXRmb3JtcywgaG93ZXZlciB0byBidWlsZCBhIGZ1bGx5IGZ1bmN0aW9uYWwgYW5kIHByb2R1Y3Rpb24gcmVhZHkgdGhyaWZ0IG9uIFdpbmRvd3MgcmVxdWlyZXMgYSBudW1iZXIgb2YgdGhpcmQgcGFydHkgbGlicmFyaWVzIHRvIGJlIG9idGFpbmVkIG9yIGJ1aWx0LiAgT25jZSB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgYXJlIHJlYWR5LCB0aGUgcmlnaHQgY29tYmluYXRpb24gb2Ygb3B0aW9ucyBtdXN0IGJlIHBhc3NlZCB0byBjbWFrZSBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgY29ycmVjdCBlbnZpcm9ubWVudC4KKworIyMgU3VtbWFyeQorCitUaGVzZSBpbnN0cnVjdGlvbnMgd2lsbCBoZWxwIHlvdSBidWlsZCB0aHJpZnQgZm9yIHdpbmRvd3MgdXNpbmcgVmlzdWFsCitTdHVkaW8gMjAxMCBvciBsYXRlci4gIFRoZSBjb250cmlidXRlZCBiYXRjaCBmaWxlcyB3aWxsIGhlbHAgeW91IGJ1aWxkCit0aGUgdGhpcmQgcGFydHkgbGlicmFyaWVzIG5lZWRlZCBmb3IgY29tcGxldGUgdGhyaWZ0IGZ1bmN0aW9uYWxpdHkgYXMKK3dlbGwgYXMgdGhyaWZ0IGl0c2VsZi4KKworVGhlc2UgaW5zdHJ1Y3Rpb25zIGZvbGxvdyBhIGRpcmVjdG9yeSBsYXlvdXQgdGhhdCBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmc6CisKKyAgICB3b3Jrc3BhY2VcCisgICAgICBidWlsZFwgICAgICAgLSB0aGlzIGlzIHdoZXJlIHRoZSBvdXQtb2YtdHJlZSB0aHJpZnQgY21ha2UgYnVpbGRzIGFyZSBnZW5lcmF0ZWQKKyAgICAgIGRpc3RcICAgICAgICAtIHRoaXMgaXMgd2hlcmUgdGhlIHRocmlmdCBidWlsZCByZXN1bHRzIGVuZCB1cAorICAgICAgdGhpcmRwYXJ0eVwgIC0gdGhpcyBpcyB3aGVyZSBhbGwgdGhpcmQgcGFydHkgYmluYXJpZXMgYW5kIGxpYnJhcmllcyBsaXZlCisgICAgICAgIGJ1aWxkXCAgICAgICAtIHRoaXMgaXMgd2hlcmUgYWxsIHRoaXJkIHBhcnR5IG91dC1vZi10cmVlIGJ1aWxkcyBhcmUgZ2VuZXJhdGVkCisgICAgICAgICAgICAgICAgICAgICAgIChleGNlcHQgZm9yIG9wZW5zc2wsIHdoaWNoIG9ubHkgYnVpbGRzIGluLXRyZWUpCisgICAgICAgIGRpc3RcICAgICAgICAtIHRoaXMgaXMgd2hlcmUgYWxsIHRoaXJkIHBhcnR5IGRpc3RyaWJ1dGlvbnMgZW5kIHVwCisgICAgICAgIHNyY1wgICAgICAgICAtIHRoaXMgaXMgd2hlcmUgYWxsIHRoaXJkIHBhcnR5IHNvdXJjZSBwcm9qZWN0cyBsaXZlCisgICAgICBzY3JpcHRzXCAgICAgLSBiYXRjaCBmaWxlcyB1c2VkIHRvIHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIGJ1aWxkcworICAgICAgdGhyaWZ0XCAgICAgIC0gdGhpcyBpcyB3aGVyZSB0aGUgdGhyaWZ0IHNvdXJjZSBwcm9qZWN0IGxpdmVzCisKK0NyZWF0ZSBhICJ3b3Jrc3BhY2UiIGRpcmVjdG9yeSBzb21ld2hlcmUgb24geW91ciBzeXN0ZW0gYW5kIHRoZW4gY29weSB0aGUgY29udGVudHMgb2YgdGhpcworZGlyZWN0b3J5IHRvIHRoZXJlLCB0aGVuIGNsb25lIG9yIHVucGFjayB0aHJpZnQgaW50byBgd29ya3NwYWNlXHRocmlmdGAuCisKKyMjIFRoaXJkIFBhcnR5IExpYnJhcmllcworCitCYXRjaCBzY3JpcHRzIGFyZSBwcm92aWRlZCB0byBidWlsZCBzb21lIHRoaXJkIHBhcnR5IGxpYnJhcmllcy4gIFlvdSBtdXN0IGRvd25sb2FkIHRoZW0gYW5kIHBsYWNlIHRoZW0gaW50byB0aGUgZGlyZWN0b3J5IG5vdGVkIGZvciBlYWNoLiAgWW91IGNhbiB1c2UgZGlmZmVyZW50IHZlcnNpb25zIGlmIHlvdSBwcmVmZXI7IHRoZXNlIGluc3RydWN0aW9ucyB3ZXJlIG1hZGUgd2l0aCB0aGUgdmVyc2lvbnMgbGlzdGVkLiAgCisKKz4gVElQOiBUbyBtb2RpZnkgdGhlIHZlcnNpb25zIHVzZWQgaW4gdGhlIGJhdGNoIHNjcmlwdHMsIGxvb2sgaW4gc2NyaXB0c1x0cHZlcnNpb25zLmJhdC4KKworQnVpbGQgdGhlbSBpbiB0aGUgb3JkZXIgbGlzdGVkIHRvIHNhdGlzZnkgdGhlaXIgZGVwZW5kZW5jaWVzLgorCisjIyMgd2luZmxleGJpc29uCisKKyAgICAgICAgc291cmNlOiB3ZWIgc2l0ZQorICAgICAgbG9jYXRpb246IGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3dpbmZsZXhiaXNvbi9maWxlcy93aW5fZmxleF9iaXNvbi1sYXRlc3QuemlwL2Rvd25sb2FkCisgICAgICAgdmVyc2lvbjogImxhdGVzdCIKKyAgICAgZGlyZWN0b3J5OiB3b3Jrc3BhY2VcdGhpcmRwYXJ0eVxkaXN0XHdpbmZsZXhiaXNvbgorCitUaGlzIHBhY2thZ2UgaXMgcmVxdWlyZWQgdG8gYnVpbGQgdGhlIGNvbXBpbGVyLiAgVGhpcyB0aGlyZCBwYXJ0eSBwYWNrYWdlIGRvZXMgbm90IG5lZWQgdG8gYmUgYnVpbHQgYXMgaXQgaXMgYSBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIHRoZSAiYmlzb24iIGFuZCAiZmxleCIgdG9vbHMgbm9ybWFsbHkgZm91bmQgb24gVW5peCBib3hlcy4KKworPiBUSVA6IElmIHlvdSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGJ1aWxkaW5nIHRoZSBjb21waWxlciwgeW91IGNhbiBza2lwIHRoZSByZW1haW5pbmcgdGhpcmQgcGFydHkgbGlicmFyaWVzLgorCisjIyMgemxpYgorCisgICAgICAgIHNvdXJjZTogd2ViIHNpdGUKKyAgICAgIGxvY2F0aW9uOiBodHRwOi8vemxpYi5uZXQvCisgICAgICAgdmVyc2lvbjogMS4yLjkKKyAgICAgZGlyZWN0b3J5OiB3b3Jrc3BhY2VcdGhpcmRwYXJ0eVxzcmNcemxpYi0xLjIuOQorCitUbyBidWlsZCwgb3BlbiB0aGUgYXBwcm9wcmlhdGUgVmlzdWFsIFN0dWRpbyBjb21tYW5kIHByb21wdCBhbmQgdGhlbiBydW4gCit0aGUgYnVpbGQtemxpYi5iYXQgc2NyaXB0IGluIHRoaXJkcGFydHlcc3JjLgorIAorIyMjIG9wZW5zc2wKKworICAgICAgICBzb3VyY2U6IHdlYiBzaXRlCisgICAgICBsb2NhdGlvbjogaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvCisgICAgICAgdmVyc2lvbjogMS4xLjBjCisgICAgIGRpcmVjdG9yeTogd29ya3NwYWNlXHRoaXJkcGFydHlcc3JjXG9wZW5zc2wtMS4xLjBjCisgICAgZGVwZW5kcy1vbjogemxpYgorCitJZiB5b3UgYXJlIHVzaW5nIG9wZW5zc2wtMS4xLjAgb3IgbGF0ZXIsIHRoZXkgY2hhbmdlZCBzdGF0aWMgYnVpbGRzIHRvIHVzZSBNaWNyb3NvZnQgU3RhdGljIFJUTCBmb3IgcmVsZWFzZSBidWlsZHMuICB6bGliIGJ5IGRlZmF1bHQgdXNlcyBhIGR5bmFtaWMgcnVudGltZSwgYXMgZG9lcyBsaWJldmVudC4gIEVkaXQgdGhlIGZpbGUgQ29uZmlndXJhdGlvbnMvMTAtbWFpbi5jb25mIGFuZCByZXBsYWNlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciAiVkMtbm9DRS1jb21tb24iIHdpdGggd2hhdCBhcHBlYXJzIGJlbG93IHRvIG1ha2Ugb3BlbnNzbCBidWlsZCB3aXRoIGR5bmFtaWMgcnVudGltZSBpbnN0ZWFkOgorCisgICAgIlZDLW5vQ0UtY29tbW9uIiA9PiB7CisgICAgICAgIGluaGVyaXRfZnJvbSAgICAgPT4gWyAiVkMtY29tbW9uIiBdLAorICAgICAgICB0ZW1wbGF0ZSAgICAgICAgID0+IDEsCisgICAgICAgIGNmbGFncyAgICAgICAgICAgPT4gYWRkKHBpY2tlcihkZWZhdWx0ID0+ICItRFVOSUNPREUgLURfVU5JQ09ERSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyAgID0+ICIvTURkIC9PZCAtRERFQlVHIC1EX0RFQlVHIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UgPT4gIi9NRCAvTzIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpLAorICAgICAgICBiaW5fY2ZsYWdzICAgICAgID0+IGFkZChwaWNrZXIoZGVidWcgICA9PiAiL01EZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlID0+ICIvTUQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSwKKyAgICAgICAgYmluX2xmbGFncyAgICAgICA9PiBhZGQoIi9zdWJzeXN0ZW06Y29uc29sZSAvb3B0OnJlZiIpLAorICAgICAgICBleF9saWJzICAgICAgICAgID0+IGFkZChzdWIgeworICAgICAgICAgICAgbXkgQGV4X2xpYnMgPSAoKTsKKyAgICAgICAgICAgIHB1c2ggQGV4X2xpYnMsICd3czJfMzIubGliJyB1bmxlc3MgJGRpc2FibGVke3NvY2t9OworICAgICAgICAgICAgcHVzaCBAZXhfbGlicywgJ2dkaTMyLmxpYiBhZHZhcGkzMi5saWIgY3J5cHQzMi5saWIgdXNlcjMyLmxpYic7CisgICAgICAgICAgICByZXR1cm4gam9pbigiICIsIEBleF9saWJzKTsKKyAgICAgICAgfSksCisgICAgfSwKKworVG8gYnVpbGQsIG9wZW4gdGhlIGFwcHJvcHJpYXRlIFZpc3VhbCBTdHVkaW8gY29tbWFuZCBwcm9tcHQgYW5kIHRoZW4gcnVuIAordGhlIGJ1aWxkLW9wZW5zc2wuYmF0IHNjcmlwdCBpbiB0aGlyZHBhcnR5XHNyYy4KKworIyMjIGxpYmV2ZW50CisKKyAgICAgICAgc291cmNlOiBnaXQKKyAgICAgIGxvY2F0aW9uOiBodHRwczovL2dpdGh1Yi5jb20vbm1hdGhld3Nvbi9MaWJldmVudC5naXQKKyAgICAgICAgICAgdXNlOiBjb21taXQgMzgyMWNjYTFhNjM3ZjRkYTQwOTljOTM0M2U3MzI2ZGEwMGY2OTgxYyBvciBsYXRlcgorICAgICAgICAgIGRhdGU6IEZyaSBEZWMgMjMgMTY6MTk6MzUgMjAxNiArMDgwMCBvciBsYXRlcgorICAgICAgIHZlcnNpb246IGNvcnJlc3BvbmRzIHRvIDIuMS43cmMgKyBwYXRjaGVzCisgICAgIGRpcmVjdG9yeTogd29ya3NwYWNlXHRoaXJkcGFydHlcc3JjXGxpYmV2ZW50LTIuMS43cmMyCisgICAgZGVwZW5kcy1vbjogb3BlbnNzbCwgemxpYgorCitUbyBidWlsZCwgb3BlbiB0aGUgYXBwcm9wcmlhdGUgVmlzdWFsIFN0dWRpbyBjb21tYW5kIHByb21wdCBhbmQgdGhlbiBydW4gCit0aGUgYnVpbGQtbGliZXZlbnQuYmF0IHNjcmlwdCBpbiB0aGlyZHBhcnR5XHNyYy4KKworIyMjIG1zaW50dHlwZXMKKworICAgICAgICBzb3VyY2U6IHdlYiBzaXRlCisgICAgICBsb2NhdGlvbjogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vYXJjaGl2ZS9wL21zaW50dHlwZXMvZG93bmxvYWRzCisgICAgICAgdmVyc2lvbjogMjYKKyAgICAgZGlyZWN0b3J5OiB3b3Jrc3BhY2VcdGhpcmRwYXJ0eVxkaXN0XG1zaW50dHlwZXMKKworPiBUSVA6IFRoaXMgaXMgb25seSBuZWNlc3NhcnkgZm9yIFZpc3VhbCBTdHVkaW8gMjAxMCwgd2hpY2ggZGlkIG5vdCBpbmNsdWRlIGFuIDxpbnR0eXBlcy5oPiBoZWFkZXIuCisKK1RoaXMgdGhpcmQgcGFydHkgcGFja2FnZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGJ1aWx0IGFzIGl0IGlzIGEgZGlzdHJpYnV0aW9uIG9mIGhlYWRlciBmaWxlcy4KKworIyMjIGJvb3N0CisKKyAgICAgICAgc291cmNlOiB3ZWIgc2l0ZQorICAgICAgbG9jYXRpb246IGh0dHA6Ly9ib29zdC50ZWVrczk5LmNvbS8KKyAgICAgICB2ZXJzaW9uOiAxXzYyXzAKKyAgICAgZGlyZWN0b3J5OiB3b3Jrc3BhY2VcdGhpcmRwYXJ0eVxkaXN0XGJvb3N0XzFfNjJfMAorCitUaGUgcHJlLWJ1aWx0IGJpbmFyeSB2ZXJzaW9ucyBvZiBib29zdCBjb21lIGluIHNlbGYtdW5wYWNraW5nIGV4ZWN1dGFibGVzLiAgUnVuIGVhY2ggb2YgdGhlIG9uZXMgeW91IGFyZSBpbnRlcmVzdGVkIGluIGFuZCBwb2ludCB0aGVtIGF0IHRoZSBzYW1lIHRoaXJkcGFydHkgZGlzdCBkaXJlY3RvcnkuCisKKyMjIEJ1aWxkaW5nIGEgUHJvZHVjdGlvbiB0aHJpZnQgQ29tcGlsZXIKKworIyMjIFByZXJlcXVpc2l0ZXMKKworKiBDTWFrZS0yLjguMTIuMiBvciBsYXRlcgorKiBWaXN1YWwgU3R1ZGlvIDIwMTAgb3IgbGF0ZXIKKyogdGhyaWZ0IHNvdXJjZSBwbGFjZWQgaW50byB3b3Jrc3BhY2VcdGhyaWZ0CisqIHdpbmZsZXhiaXNvbiBwbGFjZWQgaW50byB3b3Jrc3BhY2VcdGhpcmRwYXJ0eVxkaXN0CisKKyMjIyBJbnN0cnVjdGlvbnMKKworQnkgZm9sbG93aW5nIHRoZXNlIGluc3RydWN0aW9ucyB5b3Ugd2lsbCBlbmQgdXAgd2l0aCBhIHJlbGVhc2UgbW9kZSB0aHJpZnQgY29tcGlsZXIgdGhhdCBpcyBzdWl0YWJsZSBmb3IgZGlzdHJpYnV0aW9uIGFzIGl0IGhhcyBubyBleHRlcm5hbCBkZXBlbmRlbmNpZXMuICAKKworMS4gT3BlbiB0aGUgYXBwcm9wcmlhdGUgVmlzdWFsIFN0dWRpbyBDb21tYW5kIFByb21wdC4KKzIuIGBjZCB3b3Jrc3BhY2VgCiszLiBgYnVpbGQtdGhyaWZ0LWNvbXBpbGVyLmJhdGAKKworVGhlIGJhdGNoIGZpbGUgdXNlcyBDTWFrZSB0byBnZW5lcmF0ZSBhbiBvdXQtb2YtdHJlZSBidWlsZCBkaXJlY3RvcnkgaW4gYHdvcmtzcGFjZVxidWlsZGAgYW5kIHRoZW4gYnVpbGRzIHRoZSBjb21waWxlci4gIFRoZSByZXN1bHRpbmcgYHRocmlmdC5leGVgIHByb2dyYW0gaXMgcGxhY2VkIGludG8gYHdvcmtzcGFjZVxkaXN0YCBpbiBhIHBhdGggdGhhdCBkZXBlbmRzIG9uIHlvdXIgY29tcGlsZXIgdmVyc2lvbiBhbmQgcGxhdGZvcm0uICBGb3IgZXhhbXBsZSwgaWYgeW91IHVzZSBhIFZpc3VhbCBTdHVkaW8gMjAxMCB4NjQgQ29tbWFuZCBQcm9tcHQsIHRoZSBjb21waWxlciB3aWxsIGJlIHBsYWNlZCBpbnRvIGB3b3Jrc3BhY2VcZGlzdFx0aHJpZnQtY29tcGlsZXItZGV2XHZjMTAwXHg2NFxSZWxlYXNlXHRocmlmdC5leGVgCisKKyMjIyMgRGV0YWlscworCitUaGlzIHNlY3Rpb24gaXMgZm9yIHRob3NlIHdobyBhcmUgY3VyaW91cyBhYm91dCB0aGUgQ01ha2Ugb3B0aW9ucyB1c2VkIGluIHRoZSBidWlsZCBwcm9jZXNzLgorCitDTWFrZSB0YWtlcyB0aGUgc291cmNlIHRyZWUgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGFuZCB1c2VzIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIGZvciBjb25maWd1cmF0aW9uLiAgVGhlIGJhdGNoIGZpbGUgYGJ1aWxkLXRocmlmdC1jb21waWxlcmAgZXNzZW50aWFsbHkgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKKworICAgIEM6XD4gQ0Qgd29ya3NwYWNlXGJ1aWxkCisgICAgQzpcd29ya3NwYWNlXGJ1aWxkPiAiQzpcUHJvZ3JhbSBGaWxlc1xDTWFrZVxiaW5cY21ha2UuZXhlIiAuLlx0aHJpZnQgCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EQklTT05fRVhFQ1VUQUJMRT0uLlx0aGlyZHBhcnR5XGRpc3Rcd2luZmxleGJpc29uXHdpbl9iaXNvbi5leGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURGTEVYX0VYRUNVVEFCTEU9Li5cdGhpcmRwYXJ0eVxkaXN0XHdpbmZsZXhiaXNvblx3aW5fZmxleC5leGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURXSVRIX01UPU9OCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EV0lUSF9TSEFSRURfTElCPU9GRgorICAgICAgICAgICAgICAgICAgICAgICAgICAtRyJOTWFrZSBNYWtlZmlsZXMiCisgICAgQzpcd29ya3NwYWNlXGJ1aWxkPiBOTUFLRSAvRk1ha2VmaWxlIHRocmlmdC1jb21waWxlcgorCitXSVRIX01UIGNvbnRyb2xzIHRoZSBkeW5hbWljIG9yIHN0YXRpYyBydW50aW1lIGxpYnJhcnkgc2VsZWN0aW9uLiAgVG8gYnVpbGQgYSBwcm9kdWN0aW9uIGNvbXBpbGVyLCB0aGUgdGhyaWZ0IHByb2plY3QgcmVjb21tZW5kcyB1c2luZyB0aGUgc3RhdGljIHJ1bnRpbWUgbGlicmFyeSB0byBtYWtlIHRoZSBleGVjdXRhYmxlIHBvcnRhYmxlLiAgVGhlIGJhdGNoIGZpbGUgc2V0cyB0aGlzLgorCitZb3UgY2FuIGJ1aWxkIGEgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGZpbGUgYnkgZm9sbG93aW5nIHRoZSBleGFtcGxlIGJ1dCBzdWJzdGl0dXRpbmcgYSBkaWZmZXJlbnQgZ2VuZXJhdG9yIGZvciB0aGUgIi1HIiBvcHRpb24uICBSdW4gYGNtYWtlLmV4ZSAtLWhlbHBgIGZvciBhIGxpc3Qgb2YgZ2VuZXJhdG9ycy4gIFR5cGljYWxseSwgdGhpcyBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBvbiBXaW5kb3dzIChvbWl0ICJXaW42NCIgdG8gYnVpbGQgMzItYml0IGluc3RlYWQpOgorCisqICJWaXN1YWwgU3R1ZGlvIDEwIDIwMTAgV2luNjQiCisqICJWaXN1YWwgU3R1ZGlvIDExIDIwMTIgV2luNjQiCisqICJWaXN1YWwgU3R1ZGlvIDEyIDIwMTMgV2luNjQiCisqICJWaXN1YWwgU3R1ZGlvIDE0IDIwMTUgV2luNjQiCisqICJWaXN1YWwgU3R1ZGlvIDE1IDIwMTcgV2luNjQiCisKK0ZvciBleGFtcGxlIHlvdSBjYW4gYnVpbGQgdXNpbmcgYSBWaXN1YWwgU3R1ZGlvIHNvbHV0aW9uIGZpbGUgb24gdGhlIGNvbW1hbmQgbGluZSBieSBkb2luZzoKKworICAgIEM6XD4gQ0Qgd29ya3NwYWNlXGJ1aWxkCisgICAgQzpcd29ya3NwYWNlXGJ1aWxkPiAiQzpcUHJvZ3JhbSBGaWxlc1xDTWFrZVxiaW5cY21ha2UuZXhlIiAuLlx0aHJpZnQgCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EQklTT05fRVhFQ1VUQUJMRT0uLlx0aGlyZHBhcnR5XGRpc3Rcd2luZmxleGJpc29uXHdpbl9iaXNvbi5leGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURGTEVYX0VYRUNVVEFCTEU9Li5cdGhpcmRwYXJ0eVxkaXN0XHdpbmZsZXhiaXNvblx3aW5fZmxleC5leGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURXSVRIX01UPU9OCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EV0lUSF9TSEFSRURfTElCPU9GRgorICAgICAgICAgICAgICAgICAgICAgICAgICAtRyJWaXN1YWwgU3R1ZGlvIDE0IDIwMTUgV2luNjQiCisgICAgQzpcd29ya3NwYWNlXGJ1aWxkPiBNU0JVSUxEICJBcGFjaGUgVGhyaWZ0LnNsbiIgL3A6Q29uZmlndXJhdGlvbj1SZWxlYXNlIC9wOlBsYXRmb3JtPXg2NCAvdDp0aHJpZnQtY29tcGlsZXIKKworWW91IGNhbiBhbHNvIGRvdWJsZS1jbGljayBvbiB0aGUgc29sdXRpb24gZmlsZSB0byBicmluZyBpdCB1cCBpbiBWaXN1YWwgU3R1ZGlvIGFuZCBidWlsZCBvciBkZWJ1ZyBpbnRlcmFjdGl2ZWx5IGZyb20gdGhlcmUuCisKKyMjIEJ1aWxkaW5nIHRoZSB0aHJpZnQgQysrIFJ1bi1UaW1lIExpYnJhcnkKKworVGhlc2UgaW5zdHJ1Y3Rpb25zIGFyZSBzaW1pbGFyIHRvIHRoZSBjb21waWxlciBidWlsZCBob3dldmVyIHRoZXJlIGFyZSBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyBvbiB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgdG8gYnVpbGQgYSBmZWF0dXJlLWNvbXBsZXRlIHJ1bnRpbWUuICBUaGUgcmVzdWx0aW5nIHN0YXRpYyBsaW5rIGxpYnJhcnkgZm9yIHRocmlmdCB1c2VzIGEgZHluYW1pYyBNaWNyb3NvZnQgcnVudGltZS4KKworMS4gT3BlbiB0aGUgZGVzaXJlZCBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0LgorMi4gYGNkIHdvcmtzcGFjZWAKKzMuIGBidWlsZC10aHJpZnQuYmF0YAorCitUaHJpZnQgZGVwZW5kcyBvbiBib29zdCwgbGliZXZlbnQsIG9wZW5zc2wsIGFuZCB6bGliIGluIG9yZGVyIHRvIGJ1aWxkIHdpdGggYWxsIHNlcnZlciBhbmQgdHJhbnNwb3J0IHR5cGVzLiAgVG8gdXNlIGxhdGVyIHZlcnNpb25zIG9mIGJvb3N0IGxpa2UgMS42MiB5b3Ugd2lsbCBuZWVkIGEgcmVjZW50IHZlcnNpb24gb2YgY21ha2UgKGF0IGxlYXN0IDMuNykuCisKK1RoZSBidWlsZC10aHJpZnQgc2NyaXB0IGhhcyBvcHRpb25zIHRvIGJ1aWxkIGRlYnVnIG9yIHJlbGVhc2UgYW5kIHRvIG9wdGlvbmFsbHkgZGlzYWJsZSBhbnkgb2YgdGhlIGdlbmVyYXRpb24gKGNtYWtlKSwgYnVpbGQsIG9yIHRlc3QgcGhhc2VzLiAgQnkgZGVmYXVsdCwgdGhlIGJhdGNoIGZpbGUgd2lsbCBnZW5lcmF0ZSBhbiBvdXQtb2YtdHJlZSBidWlsZCBkaXJlY3RvcnkgaW5zaWRlIGB3b3Jrc3BhY2VcYnVpbGRgLCB0aGVuIHBlcmZvcm0gYSByZWxlYXNlIGJ1aWxkLCB0aGVuIHJ1biB0aGUgdW5pdCB0ZXN0cy4gIFRoZSBiYXRjaCBmaWxlIGFjY2VwdHMgc29tZSBvcHRpb24gZmxhZ3MgdG8gY29udHJvbCBpdHMgYmVoYXZpb3I6CisKKyAgICA6OiBGbGFncyB5b3UgY2FuIHVzZSB0byBjaGFuZ2UgdGhpcyBiZWhhdmlvcjoKKyAgICA6OgorICAgIDo6ICAgL0RFQlVHICAgICAgICAgICAgLSBpZiBidWlsZGluZywgcGVyZm9ybSBhIGRlYnVnIGJ1aWxkIGluc3RlYWQKKyAgICA6OiAgIC9OT0dFTkVSQVRFICAgICAgIC0gc2tpcCBjbWFrZSBnZW5lcmF0aW9uIC0gdXNlZnVsIGlmIHlvdQorICAgIDo6ICAgICAgICAgICAgICAgICAgICAgICBoYXZlIGFscmVhZHkgZ2VuZXJhdGVkIGEgc29sdXRpb24gYW5kIGp1c3QKKyAgICA6OiAgICAgICAgICAgICAgICAgICAgICAgd2FudCB0byBidWlsZAorICAgIDo6ICAgL05PQlVJTEQgICAgICAgICAgLSBza2lwIGNtYWtlIGJ1aWxkIC0gdXNlZnVsIGlmIHlvdSBqdXN0CisgICAgOjogICAgICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gZ2VuZXJhdGUgYSBzb2x1dGlvbgorICAgIDo6ICAgL05PVEVTVCAgICAgICAgICAgLSBza2lwIGN0ZXN0IGV4ZWN1dGlvbgorCitGb3IgZXhhbXBsZSBpZiB5b3Ugd2FudCB0byBnZW5lcmF0ZSB0aGUgY21ha2UgZW52aXJvbm1lbnQgd2l0aG91dCBidWlsZGluZyBvciBydW5uaW5nIHRlc3RzOgorCisgICAgQzpcd29ya3NwYWNlPiBidWlsZC10aHJpZnQuYmF0IC9OT0JVSUxEIC9OT1RFU1QKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9idWlsZC10aHJpZnQtY29tcGlsZXIuYmF0IGIvYnVpbGQvd2luY3BwL2J1aWxkLXRocmlmdC1jb21waWxlci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiNDJhOAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC9idWlsZC10aHJpZnQtY29tcGlsZXIuYmF0CkBAIC0wLDAgKzEsNzkgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBQcm9kdWNlcyBhIHByb2R1Y3Rpb24gdGhyaWZ0IGNvbXBpbGVyIHN1aXRhYmxlIGZvciByZWRpc3RyaWJ1dGlvbi4KKzo6IFRoZSBjb21waWxlciBpcyBsaW5rZWQgdG8gcnVudGltZSBzdGF0aWNhbGx5IGZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LgorOjogQXNzdW1lcyB0aGUgdGhpcmRwYXJ0eSBmaWxlcyBmb3IgIndpbmZsZXhiaXNvbiIgaGF2ZSBiZWVuIHBsYWNlZAorOjogYWNjb3JkaW5nIHRvIHRoZSBSRUFETUUubWQgaW5zdHJ1Y3Rpb25zLgorOjoKKzo6IE9wZW4gYSBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0IG9mIHlvdXIgY2hvb3NpbmcgYW5kIHRoZW4KKzo6IHJ1biB0aGlzIHNjcmlwdC4gIAorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworSUYgTk9UIERFRklORUQgUEFDS0FHRV9OQU1FICAgIFNFVCBQQUNLQUdFX05BTUU9dGhyaWZ0CitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX1ZFUlNJT04gU0VUIFBBQ0tBR0VfVkVSU0lPTj1kZXYKK0lGIE5PVCBERUZJTkVEIFNPVVJDRV9ESVIgICAgICBTRVQgU09VUkNFRElSPSV+ZHAwJVBBQ0tBR0VfTkFNRSUKK0lGIE5PVCBERUZJTkVEIFdJTjNQX1JPT1QgICAgICBTRVQgV0lOM1BfUk9PVD0lfmRwMHRoaXJkcGFydHkKKworOjogU2V0IENPTVBJTEVSIHRvICh2YzEwMCAtIHZjMTQwKSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgc2NyaXB0c1xjbF9zZXRjb21waWxlci5iYXQgfHwgRVhJVCAvQgorCis6OiBTZXQgQVJDSCB0byBlaXRoZXIgd2luMzIgb3IgeDY0IGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCBzY3JpcHRzXGNsX3NldGFyY2guYmF0IHx8IEVYSVQgL0IKKworOjogU2V0IEdFTkVSQVRPUiBmb3IgQ01ha2UgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIHNjcmlwdHNcY2xfc2V0Z2VuZXJhdG9yLmJhdCB8fCBFWElUIC9CCisKK0lGIE5PVCBERUZJTkVEIEJVSUxEVFlQRSAoCisgIFNFVCBCVUlMRFRZUEU9UmVsZWFzZQorKQorCisgIFNFVCBCVUlMRERJUj0lfmRwMGJ1aWxkXCVQQUNLQUdFX05BTUUlLWNvbXBpbGVyXCVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcCisgIFNFVCBPVVRESVI9JX5kcDBkaXN0XCVQQUNLQUdFX05BTUUlLWNvbXBpbGVyLSVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCVCVUlMRFRZUEUlXAorICBTRVQgQk9PU1RfTElCRElSPWxpYiVBUkNIOn4tMiwyJS1tc3ZjLSVDT01QSUxFUjp+LTMsMiUuMAorICBJRiAiJUJVSUxEVFlQRSUiID09ICJEZWJ1ZyIgKFNFVCBaTElCX1NUQVRJQ19TVUZGSVg9ZCkKKworICBFQ0hPLworICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITyAgICAgQ29uZmlndXJhdGlvbjogJVBBQ0tBR0VfTkFNRSUgJVBBQ0tBR0VfVkVSU0lPTiUgJUNPTVBJTEVSJTolQVJDSCU6JUJVSUxEVFlQRSUgIiVHRU5FUkFUT1IlIgorSUYgREVGSU5FRCBDT01QSUxFUk9OTFkgKAorICBFQ0hPICAgICAgICAgICAgICAgICAgICBDT01QSUxFUiBPTkxZCispCisgIEVDSE8gICBCdWlsZCBEaXJlY3Rvcnk6ICVCVUlMRERJUiUKKyAgRUNITyBJbnN0YWxsIERpcmVjdG9yeTogJU9VVERJUiUKKyAgRUNITyAgU291cmNlIERpcmVjdG9yeTogJVNPVVJDRURJUiUKKyAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEVDSE8vCisKKyAgTUtESVIgIiVCVUlMRERJUiUiCisgIENEICIlQlVJTERESVIlIiB8fCBFWElUIC9CCisKKyAgQ01BS0UuRVhFICV+ZHAwdGhyaWZ0IF4KKyAgICAtRyIlR0VORVJBVE9SJSIgXgorICAgIC1EQklTT05fRVhFQ1VUQUJMRT0lV0lOM1BfUk9PVCVcZGlzdFx3aW5mbGV4Ymlzb25cd2luX2Jpc29uLmV4ZSBeCisgICAgLURDTUFLRV9CVUlMRF9UWVBFPSVCVUlMRFRZUEUlIF4KKyAgICAtREZMRVhfRVhFQ1VUQUJMRT0lV0lOM1BfUk9PVCVcZGlzdFx3aW5mbGV4Ymlzb25cd2luX2ZsZXguZXhlIF4KKyAgICAtRFdJVEhfTVQ9T04gXgorICAgIC1EV0lUSF9TSEFSRURfTElCPU9GRiB8fCBFWElUIC9CCisKKyAgQ0QgJUJVSUxERElSJQorCisgIENNQUtFLkVYRSAtLWJ1aWxkIC4gLS1jb25maWcgJUJVSUxEVFlQRSUgLS10YXJnZXQgdGhyaWZ0LWNvbXBpbGVyIHx8IEVYSVQgL0IKKyAgWENPUFkgL0YgL1kgJUJVSUxERElSJVxiaW5cJUJVSUxEVFlQRSVcdGhyaWZ0LmV4ZSAlT1VURElSJQorCitFTkRMT0NBTAorRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL2J1aWxkLXRocmlmdC5iYXQgYi9idWlsZC93aW5jcHAvYnVpbGQtdGhyaWZ0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODY3YWNmCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL2J1aWxkLXRocmlmdC5iYXQKQEAgLTAsMCArMSwxNjMgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBHZW5lcmF0ZXMgYSBWaXN1YWwgU3R1ZGlvIHNvbHV0aW9uIGZvciB0aHJpZnQgYW5kIHRoZW4gYnVpbGRzIGl0LgorOjogQXNzdW1lcyB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgaGF2ZSBiZWVuIGJ1aWx0IG9yIHBsYWNlZCBhbHJlYWR5LgorOjoKKzo6IE9wZW4gYSBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0IG9mIHlvdXIgY2hvb3NpbmcgYW5kIHRoZW4KKzo6IHJ1biB0aGlzIHNjcmlwdC4gIAorOjoKKzo6IE5vcm1hbGx5IHRoZSBzY3JpcHQgd2lsbCBydW4gY21ha2UgdG8gZ2VuZXJhdGUgYSBzb2x1dGlvbiwgdGhlbgorOjogcGVyZm9ybSBhIGJ1aWxkLCB0aGVuIHJ1biB0ZXN0cyBvbiB0aGUgY29tcGxldGUgdGhyaWZ0IGxpYnJhcnkKKzo6IGluIHJlbGVhc2UgbW9kZS4KKzo6Cis6OiBGbGFncyB5b3UgY2FuIHVzZSB0byBjaGFuZ2UgdGhpcyBiZWhhdmlvcjoKKzo6Cis6OiAgIC9ERUJVRyAgICAgICAgICAgIC0gZGVidWcgaW5zdGVhZCBvZiByZWxlYXNlCis6OiAgIC9JREUgICAgICAgICAgICAgIC0gbGF1bmNoIFZpc3VhbCBTdHVkaW8gd2l0aCBhIHBhdGggc2V0Cis6OiAgICAgICAgICAgICAgICAgICAgICAgdXAgY29ycmVjdGx5IHRvIHJ1biB0ZXN0cyBpbnN0ZWFkIG9mCis6OiAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWluZyBhbnkgb3RoZXIgYWN0aW9ucywgaS5lLgorOjogICAgICAgICAgICAgICAgICAgICAgIGltcGxpZXMgc2V0dGluZyB0aGUgbmV4dCB0aHJlZSBmbGFncworOjogICAvTk9HRU5FUkFURSAgICAgICAtIHNraXAgY21ha2UgZ2VuZXJhdGlvbiAtIHVzZWZ1bCBpZiB5b3UKKzo6ICAgICAgICAgICAgICAgICAgICAgICBoYXZlIGFscmVhZHkgZ2VuZXJhdGVkIGEgc29sdXRpb24gYW5kIGp1c3QKKzo6ICAgICAgICAgICAgICAgICAgICAgICB3YW50IHRvIGJ1aWxkCis6OiAgIC9OT0JVSUxEICAgICAgICAgIC0gc2tpcCBjbWFrZSBidWlsZCAtIHVzZWZ1bCBpZiB5b3UganVzdAorOjogICAgICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gZ2VuZXJhdGUgYSBzb2x1dGlvbgorOjogICAvTk9URVNUICAgICAgICAgICAtIHNraXAgY3Rlc3QgZXhlY3V0aW9uCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworOjogU2V0cyB2YXJpYWJsZXMgZm9yIHRoaXJkIHBhcnR5IHZlcnNpb25zIHVzZWQgaW4gYnVpbGQKK0NBTEwgc2NyaXB0c1x0cHZlcnNpb25zLmJhdCB8fCBFWElUIC9CCisKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfTkFNRSAgICBTRVQgUEFDS0FHRV9OQU1FPXRocmlmdAorSUYgTk9UIERFRklORUQgUEFDS0FHRV9WRVJTSU9OIFNFVCBQQUNLQUdFX1ZFUlNJT049ZGV2CitJRiBOT1QgREVGSU5FRCBTT1VSQ0VfRElSICAgICAgU0VUIFNPVVJDRURJUj0lfmRwMCVQQUNLQUdFX05BTUUlCitJRiBOT1QgREVGSU5FRCBXSU4zUF9ST09UICAgICAgU0VUIFdJTjNQX1JPT1Q9JX5kcDB0aGlyZHBhcnR5CisKKzo6IFNldCBDT01QSUxFUiB0byAodmMxMDAgLSB2YzE0MCkgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIHNjcmlwdHNcY2xfc2V0Y29tcGlsZXIuYmF0IHx8IEVYSVQgL0IKKworOjogU2V0IEFSQ0ggdG8gZWl0aGVyIHdpbjMyIG9yIHg2NCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgc2NyaXB0c1xjbF9zZXRhcmNoLmJhdCB8fCBFWElUIC9CCisKKzo6IFNldCBHRU5FUkFUT1IgZm9yIENNYWtlIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCBzY3JpcHRzXGNsX3NldGdlbmVyYXRvci5iYXQgfHwgRVhJVCAvQgorCis6OiBEZWZhdWx0cworCitJRiBOT1QgREVGSU5FRCBCVUlMRFRZUEUgU0VUIEJVSUxEVFlQRT1SZWxlYXNlCitTRVQgT1BUX0lERT0wCitTRVQgT1BUX0JVSUxEPTEKK1NFVCBPUFRfR0VORVJBVEU9MQorU0VUIE9QVF9URVNUPTEKKworOjogQXBwbHkgRmxhZ3MKKworSUYgL0kgIiUxIiA9PSAiL0RFQlVHIiAgICAgICAgU0VUIEJVSUxEVFlQRT1EZWJ1ZworSUYgL0kgIiUyIiA9PSAiL0RFQlVHIiAgICAgICAgU0VUIEJVSUxEVFlQRT1EZWJ1ZworSUYgL0kgIiUzIiA9PSAiL0RFQlVHIiAgICAgICAgU0VUIEJVSUxEVFlQRT1EZWJ1ZworSUYgL0kgIiUxIiA9PSAiL0lERSIgICAgICAgICAgU0VUIE9QVF9JREU9MQorSUYgL0kgIiUyIiA9PSAiL0lERSIgICAgICAgICAgU0VUIE9QVF9JREU9MQorSUYgL0kgIiUzIiA9PSAiL0lERSIgICAgICAgICAgU0VUIE9QVF9JREU9MQorSUYgL0kgIiUxIiA9PSAiL05PQlVJTEQiICAgICAgU0VUIE9QVF9CVUlMRD0wCitJRiAvSSAiJTIiID09ICIvTk9CVUlMRCIgICAgICBTRVQgT1BUX0JVSUxEPTAKK0lGIC9JICIlMyIgPT0gIi9OT0JVSUxEIiAgICAgIFNFVCBPUFRfQlVJTEQ9MAorSUYgL0kgIiUxIiA9PSAiL05PR0VORVJBVEUiICAgU0VUIE9QVF9HRU5FUkFURT0wCitJRiAvSSAiJTIiID09ICIvTk9HRU5FUkFURSIgICBTRVQgT1BUX0dFTkVSQVRFPTAKK0lGIC9JICIlMyIgPT0gIi9OT0dFTkVSQVRFIiAgIFNFVCBPUFRfR0VORVJBVEU9MAorSUYgL0kgIiUxIiA9PSAiL05PVEVTVCIgICAgICAgU0VUIE9QVF9URVNUPTAKK0lGIC9JICIlMiIgPT0gIi9OT1RFU1QiICAgICAgIFNFVCBPUFRfVEVTVD0wCitJRiAvSSAiJTMiID09ICIvTk9URVNUIiAgICAgICBTRVQgT1BUX1RFU1Q9MAorCitJRiAlT1BUX0lERSUgPT0gMSAoCisgIFNFVCBPUFRfR0VORVJBVEU9MAorICBTRVQgT1BUX0JVSUxEPTAKKyAgU0VUIE9QVF9URVNUPTAKKykKKworICBTRVQgQlVJTERESVI9JX5kcDBidWlsZFwlUEFDS0FHRV9OQU1FJVwlUEFDS0FHRV9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwKKyAgU0VUIE9VVERJUj0lfmRwMGRpc3RcJVBBQ0tBR0VfTkFNRSUtJVBBQ0tBR0VfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcJUJVSUxEVFlQRSVcCisgIFNFVCBCT09TVF9MSUJESVI9bGliJUFSQ0g6fi0yLDIlLW1zdmMtJUNPTVBJTEVSOn4tMywyJS4wCisgIElGICIlQlVJTERUWVBFJSIgPT0gIkRlYnVnIiAoU0VUIFpMSUJfU1RBVElDX1NVRkZJWD1kKQorCisgIEVDSE8vCisgIEVDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBFQ0hPICAgICBDb25maWd1cmF0aW9uOiAlUEFDS0FHRV9OQU1FJSAlUEFDS0FHRV9WRVJTSU9OJSAlQ09NUElMRVIlOiVBUkNIJTolQlVJTERUWVBFJSAiJUdFTkVSQVRPUiUiCitJRiBERUZJTkVEIENPTVBJTEVST05MWSAoCisgIEVDSE8gICAgICAgICAgICAgICAgICAgIENPTVBJTEVSIE9OTFkKKykKKyAgRUNITyAgIEJ1aWxkIERpcmVjdG9yeTogJUJVSUxERElSJQorICBFQ0hPIEluc3RhbGwgRGlyZWN0b3J5OiAlT1VURElSJQorICBFQ0hPICBTb3VyY2UgRGlyZWN0b3J5OiAlU09VUkNFRElSJQorICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITy8KKworSUYgJU9QVF9JREUlID09IDEgKAorCisgIENBTEwgOlNFVFJVTlBBVEggfHwgRVhJVCAvQgorICBDQUxMIERFVkVOViAiIUJVSUxERElSIUFwYWNoZSBUaHJpZnQuc2xuIiB8fCBFWElUIC9CCisgIEVYSVQgL0IKKyAgCispCisKKyAgTUtESVIgIiVCVUlMRERJUiUiCisgIENEICIlQlVJTERESVIlIiB8fCBFWElUIC9CCisKK0lGICVPUFRfR0VORVJBVEUlID09IDEgKAorCisgIENNQUtFLkVYRSAlfmRwMHRocmlmdCBeCisgICAgLUciJUdFTkVSQVRPUiUiIF4KKyAgICAtREJJU09OX0VYRUNVVEFCTEU9JVdJTjNQX1JPT1QlXGRpc3Rcd2luZmxleGJpc29uXHdpbl9iaXNvbi5leGUgXgorICAgIC1EQk9PU1RfUk9PVD0lV0lOM1BfUk9PVCVcZGlzdFxib29zdF8lVFBfQk9PU1RfVkVSU0lPTiUgXgorICAgIC1EQk9PU1RfTElCUkFSWURJUj0lV0lOM1BfUk9PVCVcZGlzdFxib29zdF8lVFBfQk9PU1RfVkVSU0lPTiVcJUJPT1NUX0xJQkRJUiUgXgorICAgIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9JU9VVERJUiUgXgorICAgIC1EQ01BS0VfQlVJTERfVFlQRT0lQlVJTERUWVBFJSBeCisgICAgLURGTEVYX0VYRUNVVEFCTEU9JVdJTjNQX1JPT1QlXGRpc3Rcd2luZmxleGJpc29uXHdpbl9mbGV4LmV4ZSBeCisgICAgLURJTlRUWVBFU19ST09UPSVXSU4zUF9ST09UJVxkaXN0XG1zaW50dHlwZXMgXgorICAgIC1ETElCRVZFTlRfUk9PVD0lV0lOM1BfUk9PVCVcZGlzdFxsaWJldmVudC0lVFBfTElCRVZFTlRfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcJUJVSUxEVFlQRSUgXgorICAgIC1ET1BFTlNTTF9ST09UX0RJUj0lV0lOM1BfUk9PVCVcZGlzdFxvcGVuc3NsLSVUUF9PUEVOU1NMX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCVCVUlMRFRZUEUlXGR5bmFtaWMgXgorICAgIC1ET1BFTlNTTF9VU0VfU1RBVElDX0xJQlM9T0ZGIF4KKyAgICAtRFpMSUJfTElCUkFSWT0lV0lOM1BfUk9PVCVcZGlzdFx6bGliLSVUUF9aTElCX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXGxpYlx6bGliJVpMSUJfTElCX1NVRkZJWCUubGliIF4KKyAgICAtRFpMSUJfUk9PVD0lV0lOM1BfUk9PVCVcZGlzdFx6bGliLSVUUF9aTElCX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glIF4KKyAgICAtRFdJVEhfU0hBUkVEX0xJQj1PRkYgXgorICAgIC1EV0lUSF9TVEFUSUNfTElCPU9OIHx8IEVYSVQgL0IKKworKQorCitJRiAlT1BUX0JVSUxEJSA9PSAxICgKKworICBDRCAlQlVJTERESVIlCisgIENNQUtFLkVYRSAtLWJ1aWxkIC4gLS1jb25maWcgJUJVSUxEVFlQRSUgLS10YXJnZXQgSU5TVEFMTCB8fCBFWElUIC9CCisKKykKKworSUYgJU9QVF9URVNUJSA9PSAxICgKKworICBDQUxMIDpTRVRSVU5QQVRIIHx8IEVYSVQgL0IKKyAgQ01BS0UuRVhFIC0tYnVpbGQgLiAtLWNvbmZpZyAlQlVJTERUWVBFJSAtLXRhcmdldCBSVU5fVEVTVFMgfHwgRVhJVCAvQgorICAKKykKKworOlNFVFJVTlBBVEgKKyAgU0VUIFBBVEg9IVBBVEghOyVXSU4zUF9ST09UJVxkaXN0XGJvb3N0XyVUUF9CT09TVF9WRVJTSU9OJVwlQk9PU1RfTElCRElSJQorICBTRVQgUEFUSD0hUEFUSCE7JVdJTjNQX1JPT1QlXGRpc3Rcb3BlbnNzbC0lVFBfT1BFTlNTTF9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwlQlVJTERUWVBFJVxkeW5hbWljXGJpbgorICBTRVQgUEFUSD0hUEFUSCE7JVdJTjNQX1JPT1QlXGRpc3RcemxpYi0lVFBfWkxJQl9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVxiaW4KKyAgRVhJVCAvQgorCitFTkRMT0NBTAorRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL3NjcmlwdHMvY2xfc2V0YXJjaC5iYXQgYi9idWlsZC93aW5jcHAvc2NyaXB0cy9jbF9zZXRhcmNoLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTcwYTFlCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL3NjcmlwdHMvY2xfc2V0YXJjaC5iYXQKQEAgLTAsMCArMSw0NyBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OiAKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6IAorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OiAKKworOjoKKzo6IERldGVjdCB0aGUgYXJjaGl0ZWN0dXJlIHdlJ3JlIGJ1aWxkaW5nIGZvci4KKzo6IFNldCB0aGUgQVJDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvbmUgb2Y6Cis6OiAgIHdpbjMyCis6OiAgIHg2NAorOjoKKzo6IEhvbm9ycyBhbnkgZXhpc3RpbmcgQVJDSCBlbnZpcm9ubWVudCB2YXJpYWJsZQorOjogICBzZXR0aW5nIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgaXQsIHRvIGFsbG93IGl0Cis6OiAgIHRvIGJlIGZvcmNlZCBpZiBuZWVkZWQuCis6OgorOjogU2V0cyBFUlJPUkxFVkVMIHRvIDAgaWYgQVJDSCBjYW4gYmUgZGV0ZXJtaW5lZCwKKzo6ICAgICAgICAgICAgICAgICB0byAxIGlmIGl0IGNhbm5vdC4KKzo6CisKK0lGIERFRklORUQgQVJDSCAoCisgIEVDSE8gW3dhcm4gXSB1c2luZyBleGlzdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBBUkNICisgIEVYSVQgL0IgMAorKQorCitDQUxMIDpDSEVDSyB4NjQKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChTRVQgQVJDSD14NjQpIEVMU0UgKFNFVCBBUkNIPXdpbjMyKQorCitJRiBOT1QgREVGSU5FRCBBUkNIICgKKyAgRUNITyBbZXJyb3JdIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUKKyAgRVhJVCAvQiAxCispCisKK0VDSE8gW2luZm8gXSBkZXRlY3RlZCB0YXJnZXQgYXJjaGl0ZWN0dXJlICVBUkNIJQorRVhJVCAvQiAwCisKKzpDSEVDSworY2wgLz8gMj4mMSB8IGZpbmRzdHIgL0M6IiBmb3IgJTElIiA+IG51bAorRVhJVCAvQiAlRVJST1JMRVZFTCUKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGNvbXBpbGVyLmJhdCBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGNvbXBpbGVyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDA1ZDc2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL3NjcmlwdHMvY2xfc2V0Y29tcGlsZXIuYmF0CkBAIC0wLDAgKzEsNTggQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBEZXRlY3QgdGhlIGNvbXBpbGVyIGVkaXRpb24gd2UncmUgYnVpbGRpbmcgaW4uCis6OiBTZXQgdGhlIENPTVBJTEVSIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG9uZSBvZjoKKzo6ICAgdmMxMDAgPSBWaXN1YWwgU3R1ZGlvIDIwMTAKKzo6ICAgdmMxMTAgPSBWaXN1YWwgU3R1ZGlvIDIwMTIKKzo6ICAgdmMxMjAgPSBWaXN1YWwgU3R1ZGlvIDIwMTMKKzo6ICAgdmMxNDAgPSBWaXN1YWwgU3R1ZGlvIDIwMTUKKzo6ICAgdmMxNTAgPSBWaXN1YWwgU3R1ZGlvIDIwMTcKKzo6Cis6OiBIb25vcnMgYW55IGV4aXN0aW5nIENPTVBJTEVSIGVudmlyb25tZW50IHZhcmlhYmxlCis6OiAgIHNldHRpbmcgaW5zdGVhZCBvZiBvdmVyd3JpdGluZyBpdCwgdG8gYWxsb3cgaXQKKzo6ICAgdG8gYmUgZm9yY2VkIGlmIG5lZWRlZC4KKzo6Cis6OiBTZXRzIEVSUk9STEVWRUwgdG8gMCBpZiBDT01QSUxFUiBjYW4gYmUgZGV0ZXJtaW5lZCwKKzo6ICAgICAgICAgICAgICAgICB0byAxIGlmIGl0IGNhbm5vdC4KKzo6CisKK0lGIERFRklORUQgQ09NUElMRVIgKAorICBFQ0hPIFt3YXJuIF0gdXNpbmcgZXhpc3RpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgQ09NUElMRVIKKyAgRVhJVCAvQiAwCispCisKK0NBTEwgOkNIRUNLIDE2CitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgQ09NUElMRVIgU0VUIENPTVBJTEVSPXZjMTAwKQorQ0FMTCA6Q0hFQ0sgMTcKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBDT01QSUxFUiBTRVQgQ09NUElMRVI9dmMxMTApCitDQUxMIDpDSEVDSyAxOAorSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIENPTVBJTEVSIFNFVCBDT01QSUxFUj12YzEyMCkKK0NBTEwgOkNIRUNLIDE5LjAwCitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgQ09NUElMRVIgU0VUIENPTVBJTEVSPXZjMTQwKQorQ0FMTCA6Q0hFQ0sgMTkuMTAKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBDT01QSUxFUiBTRVQgQ09NUElMRVI9dmMxNTApCisKK0lGIE5PVCBERUZJTkVEIENPTVBJTEVSICgKKyAgRUNITyBbZXJyb3JdIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGNvbXBpbGVyIGVkaXRpb24KKyAgRVhJVCAvQiAxCispCisKK0VDSE8gW2luZm8gXSBkZXRlY3RlZCBjb21waWxlciBlZGl0aW9uICAgICVDT01QSUxFUiUKK0VYSVQgL0IgMAorCis6Q0hFQ0sKK2NsIC8/IDI+JjEgfCBmaW5kc3RyIC9DOiJWZXJzaW9uICUxJS4iID4gbnVsCitFWElUIC9CICVFUlJPUkxFVkVMJQpkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL3NjcmlwdHMvY2xfc2V0Z2VuZXJhdG9yLmJhdCBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGdlbmVyYXRvci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFlMjc0MgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGdlbmVyYXRvci5iYXQKQEAgLTAsMCArMSw2OSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OiAKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6IAorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OiAKKworOjoKKzo6IERldGVjdCB0aGUgY29tcGlsZXIgZWRpdGlvbiB3ZSdyZSBidWlsZGluZyBpbiBhbmQgdGhlbiAKKzo6IHNldCB0aGUgR0VORVJBVE9SIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG9uZSBvZjoKKzo6Cis6OiAgVmlzdWFsIFN0dWRpbyAxNSAyMDE3IFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTcgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJBUk0iLgorOjogIFZpc3VhbCBTdHVkaW8gMTQgMjAxNSBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDE1IHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDEyIDIwMTMgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxMyBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIkFSTSIuCis6OiAgVmlzdWFsIFN0dWRpbyAxMSAyMDEyIFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTIgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJBUk0iLgorOjogIFZpc3VhbCBTdHVkaW8gMTAgMjAxMCBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDEwIHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiSUE2NCIuCis6OgorOjogSG9ub3JzIGFueSBleGlzdGluZyBHRU5FUkFUT1IgZW52aXJvbm1lbnQgdmFyaWFibGUKKzo6ICAgc2V0dGluZyBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nIGl0LCB0byBhbGxvdyBpdAorOjogICB0byBiZSBmb3JjZWQgaWYgbmVlZGVkLgorOjoKKzo6IFNldHMgRVJST1JMRVZFTCB0byAwIGlmIEdFTkVSQVRPUiBjYW4gYmUgZGV0ZXJtaW5lZCwKKzo6ICAgICAgICAgICAgICAgICB0byAxIGlmIGl0IGNhbm5vdC4KKzo6Cis6OiBSZXF1aXJlcyBjbF9zZXRhcmNoLmJhdCB0byBoYXZlIGJlZW4gZXhlY3V0ZWQgb3IgdGhlIEFSQ0ggZW52aXJvbm1lbnQKKzo6IHZhcmlhYmxlIHRvIGJlIHNldC4KKzo6CisKK0lGICIlQVJDSCUiID09ICJ4NjQiIChTRVQgR0VOQVJDSD0gV2luNjQpCisKK0lGIERFRklORUQgR0VORVJBVE9SICgKKyAgRUNITyBbd2FybiBdIHVzaW5nIGV4aXN0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlIEdFTkVSQVRPUgorICBFWElUIC9CIDAKKykKKworQ0FMTCA6Q0hFQ0sgMTYKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDEwIDIwMTAlR0VOQVJDSCUpCitDQUxMIDpDSEVDSyAxNworSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTEgMjAxMiVHRU5BUkNIJSkKK0NBTEwgOkNIRUNLIDE4CitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgR0VORVJBVE9SIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxMiAyMDEzJUdFTkFSQ0glKQorQ0FMTCA6Q0hFQ0sgMTkuMDAKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDE0IDIwMTUlR0VOQVJDSCUpCitDQUxMIDpDSEVDSyAxOS4xMAorSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTUgMjAxNyVHRU5BUkNIJSkKKworSUYgTk9UIERFRklORUQgR0VORVJBVE9SICgKKyAgRUNITyBbZXJyb3JdIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIENNYWtlIGdlbmVyYXRvciB0byB1c2UKKyAgRVhJVCAvQiAxCispCisKK0VDSE8gW2luZm8gXSB1c2luZyBDTWFrZSBnZW5lcmF0b3IgICAgICAgICVHRU5FUkFUT1IlCitFWElUIC9CIDAKKworOkNIRUNLCitjbCAvPyAyPiYxIHwgZmluZHN0ciAvQzoiVmVyc2lvbiAlMSUuIiA+IG51bAorRVhJVCAvQiAlRVJST1JMRVZFTCUKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9zY3JpcHRzL3RwdmVyc2lvbnMuYmF0IGIvYnVpbGQvd2luY3BwL3NjcmlwdHMvdHB2ZXJzaW9ucy5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgwYzg2OAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL3RwdmVyc2lvbnMuYmF0CkBAIC0wLDAgKzEsMjQgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBTZXQgdGhlIHZlcnNpb25zIG9mIHRoaXJkIHBhcnR5IGxpYnJhcmllcyB0byB1c2UuCis6OgorCitJRiBOT1QgREVGSU5FRCBUUF9CT09TVF9WRVJTSU9OICAgIFNFVCBUUF9CT09TVF9WRVJTSU9OPTFfNjJfMAorSUYgTk9UIERFRklORUQgVFBfTElCRVZFTlRfVkVSU0lPTiBTRVQgVFBfTElCRVZFTlRfVkVSU0lPTj0yLjEuN3JjMgorSUYgTk9UIERFRklORUQgVFBfT1BFTlNTTF9WRVJTSU9OICBTRVQgVFBfT1BFTlNTTF9WRVJTSU9OPTEuMS4wYworSUYgTk9UIERFRklORUQgVFBfWkxJQl9WRVJTSU9OICAgICBTRVQgVFBfWkxJQl9WRVJTSU9OPTEuMi45CisKK0VYSVQgL0IgMApkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL3RoaXJkcGFydHkvc3JjL2J1aWxkLWxpYmV2ZW50LmJhdCBiL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC1saWJldmVudC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmNTA1YwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC1saWJldmVudC5iYXQKQEAgLTAsMCArMSw4NiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OiAKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6IAorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OiAKKworOjoKKzo6IEJ1aWxkIHNjcmlwdCBmb3IgbGliZXZlbnQgb24gd2luZG93cworOjogVXNlIGxpYmV2ZW50IG1hc3RlciBmcm9tIGdpdGh1YiB3aGljaCBoYXMgY21ha2UgaW50ZWdyYXRpb24KKzo6IFVzZXMgdGhlIGVudmlyb25tZW50IHNldCB1cCBieSBhIFZpc3VhbCBTdHVkaW8gQ29tbWFuZCBQcm9tcHQgc2hvcnRjdXQKKzo6IHRvIHRhcmdldCBhIHNwZWNpZmljIGFyY2hpdGVjdHVyZSBhbmQgY29tcGlsZXIKKzo6Cis6OiBDcmVhdGVzIGEgc3RhdGljIGxpbmsgbGlicmFyeS4KKzo6IExpbmtzIGFnYWluc3QgT3BlblNTTCBhbmQgemxpYiBzdGF0aWNhbGx5LgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKKzo6IFNldHMgdmFyaWFibGVzIGZvciB0aGlyZCBwYXJ0eSB2ZXJzaW9ucyB1c2VkIGluIGJ1aWxkCitDQUxMIC4uXC4uXHNjcmlwdHNcdHB2ZXJzaW9ucy5iYXQgfHwgRVhJVCAvQgorCis6OiB1c2UgImJ1aWxkLWxpYmV2ZW50LmJhdCAveWVzIiB0byBza2lwIHRoZSBxdWVzdGlvbiBwYXJ0CitJRiAvSSAiJTEiID09ICIvWUVTIiAgICAgICAgICAgU0VUIE5PQVNLPTEKKworOjogU2V0IENPTVBJTEVSIHRvICh2YzEwMCAtIHZjMTQwKSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgLi5cLi5cc2NyaXB0c1xjbF9zZXRjb21waWxlci5iYXQgfHwgRVhJVCAvQgorCis6OiBTZXQgQVJDSCB0byBlaXRoZXIgd2luMzIgb3IgeDY0IGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCAuLlwuLlxzY3JpcHRzXGNsX3NldGFyY2guYmF0IHx8IEVYSVQgL0IKKworSUYgTk9UIERFRklORUQgR0VORVJBVE9SICAgICAgIFNFVCBHRU5FUkFUT1I9Tk1ha2UgTWFrZWZpbGVzCitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX05BTUUgICAgU0VUIFBBQ0tBR0VfTkFNRT1saWJldmVudAorSUYgTk9UIERFRklORUQgUEFDS0FHRV9WRVJTSU9OIFNFVCBQQUNLQUdFX1ZFUlNJT049JVRQX0xJQkVWRU5UX1ZFUlNJT04lCitJRiBOT1QgREVGSU5FRCBTT1VSQ0VESVIgICAgICAgU0VUIFNPVVJDRURJUj0lfmRwMCVQQUNLQUdFX05BTUUlLSVQQUNLQUdFX1ZFUlNJT04lCitJRiBOT1QgREVGSU5FRCBXSU4zUF9ST09UICAgICAgU0VUIFdJTjNQX1JPT1Q9JX5kcDAuLgorCitGT1IgJSVYIElOICgKKyAgRGVidWcgCisgIFJlbGVhc2UKKykgRE8gKAorICBTRVQgQlVJTERUWVBFPSUlWAorICBTRVQgQlVJTERESVI9JVdJTjNQX1JPT1QlXGJ1aWxkXCVQQUNLQUdFX05BTUUlXCVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCFCVUlMRFRZUEUhCisgIFNFVCBPVVRESVI9JVdJTjNQX1JPT1QlXGRpc3RcJVBBQ0tBR0VfTkFNRSUtJVBBQ0tBR0VfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcIUJVSUxEVFlQRSEKKworICBJRiAiIUJVSUxEVFlQRSEiID09ICJEZWJ1ZyIgKFNFVCBaTElCX0xJQl9TVUZGSVg9ZCkKKworICBTRVQgQ01BS0VfREVGUz1eCisgICAtREVWRU5UX19ESVNBQkxFX1NBTVBMRVM9T04gXgorICAgLURFVkVOVF9fRElTQUJMRV9URVNUUz1PTiBeCisgICAtRE9QRU5TU0xfVVNFX1NUQVRJQ19MSUJTPU9GRiBeCisgICAtRE9QRU5TU0xfUk9PVF9ESVI9JVdJTjNQX1JPT1QlXGRpc3Rcb3BlbnNzbC0lVFBfT1BFTlNTTF9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwhQlVJTERUWVBFIVxkeW5hbWljIF4KKyAgIC1EWkxJQl9MSUJSQVJZPSVXSU4zUF9ST09UJVxkaXN0XHpsaWItJVRQX1pMSUJfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcbGliXHpsaWIhWkxJQl9MSUJfU1VGRklYIS5saWIgXgorICAgLURaTElCX1JPT1Q9JVdJTjNQX1JPT1QlXGRpc3RcemxpYi0lVFBfWkxJQl9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJQorCisgIEVDSE8vCisgIEVDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBFQ0hPICAgICAgICAgIEJ1aWxkaW5nOiAlUEFDS0FHRV9OQU1FJSB2JVBBQ0tBR0VfVkVSU0lPTiUgJUNPTVBJTEVSJTolQVJDSCU6IUJVSUxEVFlQRSEgIiVHRU5FUkFUT1IlIgorICBFQ0hPIENNYWtlIERlZmluaXRpb25zOiAhQ01BS0VfREVGUyEKKyAgRUNITyAgIEJ1aWxkIERpcmVjdG9yeTogIUJVSUxERElSIQorICBFQ0hPIEluc3RhbGwgRGlyZWN0b3J5OiAhT1VURElSIQorICBFQ0hPICBTb3VyY2UgRGlyZWN0b3J5OiAlU09VUkNFRElSJQorICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITy8KKworICBJRiBOT1QgREVGSU5FRCBOT0FTSyAoCisgICAgQ0hPSUNFIC9NICJEbyB5b3Ugd2FudCB0byBidWlsZCB0aGlzIGNvbmZpZ3VyYXRpb24/ICIgL2MgWU4KKyAgICBJRiAhRVJST1JMRVZFTCEgTkVRIDEgKEVYSVQgL0IgIUVSUk9STEVWRUwhKQorICApCisgIAorICBNS0RJUiAiIUJVSUxERElSISIKKyAgQ0QgIiFCVUlMRERJUiEiIHx8IEVYSVQgL0IKKworICBDTUFLRS5FWEUgLUciJUdFTkVSQVRPUiUiIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9IU9VVERJUiEgLURDTUFLRV9CVUlMRF9UWVBFPSFCVUlMRFRZUEUhICFDTUFLRV9ERUZTISAiJVNPVVJDRURJUiUiIHx8IEVYSVQgL0IKKyAgTk1BS0UgL2ZNYWtlZmlsZSBpbnN0YWxsIHx8IEVYSVQgL0IKKykKKworRU5ETE9DQUwKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC1vcGVuc3NsLmJhdCBiL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC1vcGVuc3NsLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjI3MGYwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL3RoaXJkcGFydHkvc3JjL2J1aWxkLW9wZW5zc2wuYmF0CkBAIC0wLDAgKzEsMTA2IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6IAorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjogCis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6IAorCis6OgorOjogQnVpbGQgc2NyaXB0IGZvciBvcGVuc3NsIG9uIHdpbmRvd3MKKzo6IG9wZW5zc2wgdXNlcyBhbiBpbi10cmVlIGJ1aWxkIHNvIHlvdSBoYXZlIHRvIGNsZWFuIGJldHdlZW4gZWFjaCBvbmUKKzo6Cis6OiBVc2VzIHRoZSBlbnZpcm9ubWVudCBzZXQgdXAgYnkgYSBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0IHNob3J0Y3V0Cis6OiB0byB0YXJnZXQgYSBzcGVjaWZpYyBhcmNoaXRlY3R1cmUgYW5kIGNvbXBpbGVyCis6OgorOjogSWYgeW91IHVzZSBMYXZhc29mdCBBZC1Bd2FyZSwgZGlzYWJsZSBpdCBmb3IgdGhpcyBidWlsZC4gIEl0IGJsb2NrcyB0aGUgY3JlYXRpb24KKzo6IG9mIGFueSBmaWxlIG5hbWVkICJjbGllbnRoZWxsb3Rlc3QuZXhlIiBmb3Igd2hhdGV2ZXIgcmVhc29uLCB3aGljaCBicmVha3MgdGhlIGJ1aWxkLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKKzo6IFNldHMgdmFyaWFibGVzIGZvciB0aGlyZCBwYXJ0eSB2ZXJzaW9ucyB1c2VkIGluIGJ1aWxkCitDQUxMIC4uXC4uXHNjcmlwdHNcdHB2ZXJzaW9ucy5iYXQgfHwgRVhJVCAvQgorCis6OiB1c2UgImJ1aWxkLW9wZW5zc2wuYmF0IC95ZXMiIHRvIHNraXAgdGhlIHF1ZXN0aW9uIHBhcnQKK0lGIC9JICIlMSIgPT0gIi9ZRVMiICAgICAgICAgICBTRVQgTk9BU0s9MQorCitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX05BTUUgICAgU0VUIFBBQ0tBR0VfTkFNRT1vcGVuc3NsCitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX1ZFUlNJT04gU0VUIFBBQ0tBR0VfVkVSU0lPTj0lVFBfT1BFTlNTTF9WRVJTSU9OJQorSUYgTk9UIERFRklORUQgU09VUkNFRElSICAgICAgIFNFVCBTT1VSQ0VESVI9JX5kcDAlUEFDS0FHRV9OQU1FJS0lUEFDS0FHRV9WRVJTSU9OJQorSUYgTk9UIERFRklORUQgV0lOM1BfUk9PVCAgICAgIFNFVCBXSU4zUF9ST09UPSV+ZHAwLi4KKworOjogU2V0IENPTVBJTEVSIHRvICh2YzEwMCAtIHZjMTQwKSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgLi5cLi5cc2NyaXB0c1xjbF9zZXRjb21waWxlci5iYXQgfHwgRVhJVCAvQgorCis6OiBTZXQgQVJDSCB0byBlaXRoZXIgd2luMzIgb3IgeDY0IGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCAuLlwuLlxzY3JpcHRzXGNsX3NldGFyY2guYmF0IHx8IEVYSVQgL0IKKworSUYgIiVBUkNIJSIgPT0gIng2NCIgKAorICBTRVQgVE9ETz1kZWJ1Zy1WQy1XSU42NEEgVkMtV0lONjRBCispIEVMU0UgKAorICBTRVQgVE9ETz1kZWJ1Zy1WQy1XSU4zMiBWQy1XSU4zMgorKQorCitGT1IgJSVYIElOICggIVRPRE8hICkgRE8gKAorICBTRVQgQlVJTERUWVBFPSUlWAorICBGT1IgJSVZIElOICgKKyAgICBudAorICAgIG50ZGxsCisgICkgRE8gKAorICAgIFNFVCBMSUJUWVBFPSUlWQorCisgICAgSUYgIiFCVUlMRFRZUEU6fjAsNiEiID09ICJkZWJ1Zy0iICgKKyAgICAgIFNFVCBPVVRCVUlMRFRZUEU9ZGVidWcKKyAgICAgIFNFVCBaTElCTElCU1VGRklYPWQKKyAgICApIEVMU0UgKAorICAgICAgU0VUIE9VVEJVSUxEVFlQRT1yZWxlYXNlCisgICAgICBTRVQgWkxJQkxJQlNVRkZJWD0KKyAgICApCisKKyAgICBJRiAiIUxJQlRZUEUhIiA9PSAibnRkbGwiICgKKyAgICAgIFNFVCBCVUlMRF9PUFRJT05TPXNoYXJlZAorICAgICAgU0VUIE9VVExJQlRZUEU9ZHluYW1pYworICAgICAgU0VUIFpMSUJMSUI9emxpYiFaTElCTElCU1VGRklYIQorICAgICAgU0VUIFpMSUJPUFQ9emxpYi1keW5hbWljCisgICAgKSBFTFNFICgKKyAgICAgIFNFVCBCVUlMRF9PUFRJT05TPW5vLXNoYXJlZAorICAgICAgU0VUIE9VVExJQlRZUEU9c3RhdGljCisgICAgICBTRVQgWkxJQkxJQj16bGlic3RhdGljIVpMSUJMSUJTVUZGSVghLmxpYgorICAgICAgU0VUIFpMSUJPUFQ9emxpYgorICAgICkKKworICAgIFNFVCBMSUI9JX5kcDAuLlxkaXN0XHpsaWItJVRQX1pMSUJfVkVSU0lPTiVcIUNPTVBJTEVSIVwhQVJDSCFcbGliOyFMSUIhCisgICAgU0VUIEJVSUxEX09QVElPTlM9IUJVSUxEX09QVElPTlMhIG5vLWFzbSBuby11bml0LXRlc3QgIVpMSUJPUFQhIC0tb3BlbnNzbGRpcj1zc2wgLS13aXRoLXpsaWItaW5jbHVkZT0lfmRwMC4uXGRpc3RcemxpYi0lVFBfWkxJQl9WRVJTSU9OJVwhQ09NUElMRVIhXCFBUkNIIVxpbmNsdWRlIC0td2l0aC16bGliLWxpYj0hWkxJQkxJQiEKKyAgICBTRVQgT1VURElSPSVXSU4zUF9ST09UJVxkaXN0XCVQQUNLQUdFX05BTUUlLSVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCFPVVRCVUlMRFRZUEUhXCFPVVRMSUJUWVBFIQorCisgICAgRUNITy8KKyAgICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBFQ0hPICAgICAgICAgIEJ1aWxkaW5nOiAlUEFDS0FHRV9OQU1FJSAlUEFDS0FHRV9WRVJTSU9OJSAlQ09NUElMRVIlOiVBUkNIJTohT1VUQlVJTERUWVBFITohT1VUTElCVFlQRSEgWyFCVUlMRFRZUEUhXQorICAgIEVDSE8gQ29uZmlndXJlIE9wdGlvbnM6ICFCVUlMRF9PUFRJT05TIQorICAgIEVDSE8gSW5zdGFsbCBEaXJlY3Rvcnk6ICFPVVRESVIhCisgICAgRUNITyAgU291cmNlIERpcmVjdG9yeTogJVNPVVJDRURJUiUKKyAgICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBFQ0hPLworCisgICAgSUYgTk9UIERFRklORUQgTk9BU0sgKAorICAgICAgQ0hPSUNFIC9NICJEbyB5b3Ugd2FudCB0byBidWlsZCB0aGlzIGNvbmZpZ3VyYXRpb24/ICIgL2MgWU4KKyAgICAgIElGICFFUlJPUkxFVkVMISBORVEgMSAoRVhJVCAvQiAhRVJST1JMRVZFTCEpCisgICAgKQorCisgICAgQ0QgJVNPVVJDRURJUiUgfHwgRVhJVCAvQgorICAgIHBlcmwgQ29uZmlndXJlICFCVUlMRFRZUEUhIC0tcHJlZml4PSIhT1VURElSISIgIUJVSUxEX09QVElPTlMhIHx8IEVYSVQgL0IKKyAgICBOTUFLRSAvRk1ha2VmaWxlIGluc3RhbGxfc3cgfHwgRVhJVCAvQgorICAgIE5NQUtFIC9GTWFrZWZpbGUgY2xlYW4gfHwgRVhJVCAvQgorICApCispCisKK0VORExPQ0FMCitFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtemxpYi5iYXQgYi9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtemxpYi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyNzIzMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC16bGliLmJhdApAQCAtMCwwICsxLDc1IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6IAorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjogCis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6IAorCis6OgorOjogQnVpbGQgc2NyaXB0IGZvciB6bGliIG9uIHdpbmRvd3MuCis6OiBVc2VzIHRoZSBlbnZpcm9ubWVudCBzZXQgdXAgYnkgYSBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0IHNob3J0Y3V0Cis6OiB0byB0YXJnZXQgYSBzcGVjaWZpYyBhcmNoaXRlY3R1cmUgYW5kIGNvbXBpbGVyLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKKzo6IFNldHMgdmFyaWFibGVzIGZvciB0aGlyZCBwYXJ0eSB2ZXJzaW9ucyB1c2VkIGluIGJ1aWxkCitDQUxMIC4uXC4uXHNjcmlwdHNcdHB2ZXJzaW9ucy5iYXQgfHwgRVhJVCAvQgorCis6OiB1c2UgImJ1aWxkLXpsaWIuYmF0IC95ZXMiIHRvIHNraXAgdGhlIHF1ZXN0aW9uIHBhcnQKK0lGIC9JICIlMSIgPT0gIi9ZRVMiICAgICAgICAgICBTRVQgTk9BU0s9MQorCitJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgICAgICAgU0VUIEdFTkVSQVRPUj1OTWFrZSBNYWtlZmlsZXMKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfTkFNRSAgICBTRVQgUEFDS0FHRV9OQU1FPXpsaWIKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfVkVSU0lPTiBTRVQgUEFDS0FHRV9WRVJTSU9OPSVUUF9aTElCX1ZFUlNJT04lCitJRiBOT1QgREVGSU5FRCBTT1VSQ0VfRElSICAgICAgU0VUIFNPVVJDRURJUj0lfmRwMCVQQUNLQUdFX05BTUUlLSVQQUNLQUdFX1ZFUlNJT04lCitJRiBOT1QgREVGSU5FRCBXSU4zUF9ST09UICAgICAgU0VUIFdJTjNQX1JPT1Q9JX5kcDAuLgorCis6OiBTZXQgQ09NUElMRVIgdG8gKHZjMTAwIC0gdmMxNDApIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCAuLlwuLlxzY3JpcHRzXGNsX3NldGNvbXBpbGVyLmJhdCB8fCBFWElUIC9CCisKKzo6IFNldCBBUkNIIHRvIGVpdGhlciB3aW4zMiBvciB4NjQgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIC4uXC4uXHNjcmlwdHNcY2xfc2V0YXJjaC5iYXQgfHwgRVhJVCAvQgorCitGT1IgJSVYIElOICgKKyAgRGVidWcgCisgIFJlbGVhc2UKKykgRE8gKAorICBTRVQgQlVJTERUWVBFPSUlWAorICBTRVQgQlVJTERESVI9JVdJTjNQX1JPT1QlXGJ1aWxkXCVQQUNLQUdFX05BTUUlXCVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCFCVUlMRFRZUEUhCisgIFNFVCBPVVRESVI9JVdJTjNQX1JPT1QlXGRpc3RcJVBBQ0tBR0VfTkFNRSUtJVBBQ0tBR0VfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCUKKworICBFQ0hPLworICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITyAgICAgICAgICBCdWlsZGluZzogJVBBQ0tBR0VfTkFNRSUgdiVQQUNLQUdFX1ZFUlNJT04lICVDT01QSUxFUiU6JUFSQ0glOiFCVUlMRFRZUEUhICIlR0VORVJBVE9SJSIKKyAgRUNITyAgIEJ1aWxkIERpcmVjdG9yeTogIUJVSUxERElSIQorICBFQ0hPIEluc3RhbGwgRGlyZWN0b3J5OiAhT1VURElSIQorICBFQ0hPICBTb3VyY2UgRGlyZWN0b3J5OiAlU09VUkNFRElSJQorICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITy8KKworICBJRiBOT1QgREVGSU5FRCBOT0FTSyAoCisgICAgQ0hPSUNFIC9NICJEbyB5b3Ugd2FudCB0byBidWlsZCB0aGlzIGNvbmZpZ3VyYXRpb24/ICIgL2MgWU4KKyAgICBJRiAhRVJST1JMRVZFTCEgTkVRIDEgKEVYSVQgL0IgIUVSUk9STEVWRUwhKQorICApCisKKyAgTUtESVIgIiFCVUlMRERJUiEiCisgIENEICIhQlVJTERESVIhIiB8fCBFWElUIC9CCisKKyAgQ01BS0UuRVhFIC1HIiVHRU5FUkFUT1IlIiAtRENNQUtFX0lOU1RBTExfUFJFRklYPSFPVVRESVIhIC1EQ01BS0VfQlVJTERfVFlQRT0hQlVJTERUWVBFISAiJVNPVVJDRURJUiUiIHx8IEVYSVQgL0IKKyAgTk1BS0UgL2ZNYWtlZmlsZSBpbnN0YWxsIHx8IEVYSVQgL0IKKworICBJRiAiIUJVSUxEVFlQRSEiID09ICJEZWJ1ZyIgKAorICAgIENPUFkgIiFCVUlMRERJUiFcemxpYmQucGRiIiAiIU9VVERJUiFcYmluXCIgfHwgRVhJVCAvQgorICApCispCisKK0VORExPQ0FMCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvQ01ha2VMaXN0cy50eHQgYi9jb21waWxlci9jcHAvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRmNzkwZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDIyMSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44LjEyKQorCitjb25maWd1cmVfZmlsZSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjL3RocmlmdC92ZXJzaW9uLmguaW4gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC92ZXJzaW9uLmgpCitpZihNU1ZDKQorICAgICMgVGhlIHdpbmZsZXhiaXNvbiBnZW5lcmF0b3Igb3V0cHV0cyBzb21lIG1hY3JvcyB0aGF0IGNvbmZsaWN0IHdpdGggdGhlIFZpc3VhbCBTdHVkaW8gMjAxMCBjb3B5IG9mIHN0ZGludC5oCisgICAgIyBUaGlzIG1pZ2h0IGJlIGZpeGVkIGluIGxhdGVyIHZlcnNpb25zIG9mIFZpc3VhbCBTdHVkaW8sIGJ1dCBhbiBlYXN5IHNvbHV0aW9uIGlzIHRvIGluY2x1ZGUgc3RkaW50LmggZmlyc3QKKyAgICBpZihIQVZFX1NURElOVF9IKQorICAgICAgICBhZGRfZGVmaW5pdGlvbnMoLURfX1NURENfRk9STUFUX01BQ1JPUykKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC1EX19TVERDX0xJTUlUX01BQ1JPUykKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC9GSSJzdGRpbnQuaCIpCisgICAgZW5kaWYoSEFWRV9TVERJTlRfSCkKK2VuZGlmKCkKKworZmluZF9wYWNrYWdlKEZMRVggUkVRVUlSRUQpCitmaW5kX3BhY2thZ2UoQklTT04gUkVRVUlSRUQpCisKKyMgY3JlYXRlIGRpcmVjdG9yeSBmb3IgdGhyaWZ0eSBhbmQgdGhyaWZ0bAorZmlsZShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0LykKKworIyBDcmVhdGUgZmxleCBhbmQgYmlzb24gZmlsZXMgYW5kIGJ1aWxkIHRoZSBsaWIgcGFyc2Ugc3RhdGljIGxpYnJhcnkKK0JJU09OX1RBUkdFVCh0aHJpZnR5ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3RocmlmdHkueXkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnR5LmNjKQorRkxFWF9UQVJHRVQodGhyaWZ0bCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjL3RocmlmdC90aHJpZnRsLmxsICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0bC5jYykKK0FERF9GTEVYX0JJU09OX0RFUEVOREVOQ1kodGhyaWZ0bCB0aHJpZnR5KQorCitzZXQocGFyc2VfU09VUkNFUworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5jYworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0bC5jYworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5oaAorKQorCithZGRfbGlicmFyeShwYXJzZSBTVEFUSUMgJHtwYXJzZV9TT1VSQ0VTfSkKKworIyBDcmVhdGUgdGhlIHRocmlmdCBjb21waWxlcgorc2V0KGNvbXBpbGVyX2NvcmUKKyAgICBzcmMvdGhyaWZ0L2NvbW1vbi5jYworICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MKKyAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5jYworICAgIHNyYy90aHJpZnQvcGFyc2UvcGFyc2UuY2MKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3ZlcnNpb24uaAorKQorCitzZXQodGhyaWZ0LWNvbXBpbGVyX1NPVVJDRVMKKyAgICBzcmMvdGhyaWZ0L21haW4uY2MKKyAgICBzcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuY3BwCispCisKK3NldCh0aHJpZnRfY29tcGlsZXJfTEFOR1MKKykKKworIyBUaGlzIG1hY3JvIGFkZHMgYW4gb3B0aW9uIFRIUklGVF9DT01QSUxFUl8ke05BTUV9CisjIHRoYXQgYWxsb3dzIGVuYWJsaW5nIG9yIGRpc2FibGluZyBjZXJ0YWluIGxhbmd1YWdlcworbWFjcm8oVEhSSUZUX0FERF9DT01QSUxFUiBuYW1lIGRlc2NyaXB0aW9uIGluaXRpYWwpCisgICAgc3RyaW5nKFRPVVBQRVIgIlRIUklGVF9DT01QSUxFUl8ke25hbWV9IiBlbmFibGVyKQorICAgIHNldChzcmMgInNyYy90aHJpZnQvZ2VuZXJhdGUvdF8ke25hbWV9X2dlbmVyYXRvci5jYyIpCisgICAgb3B0aW9uKCR7ZW5hYmxlcn0gJHtkZXNjcmlwdGlvbn0gJHtpbml0aWFsfSkKKyAgICBpZigke2VuYWJsZXJ9KQorICAgICAgICBsaXN0KEFQUEVORCB0aHJpZnQtY29tcGlsZXJfU09VUkNFUyAke3NyY30pCisgICAgICAgIGxpc3QoQVBQRU5EIHRocmlmdF9jb21waWxlcl9MQU5HUyAke25hbWV9KQorICAgIGVuZGlmKCkKK2VuZG1hY3JvKCkKKworIyBUaGUgZm9sbG93aW5nIGNvbXBpbGVyIGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkCitUSFJJRlRfQUREX0NPTVBJTEVSKGNfZ2xpYiAgIkVuYWJsZSBjb21waWxlciBmb3IgQyB3aXRoIEdsaWIiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihjcHAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEMrKyIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGphdmEgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSmF2YSIgICBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoYXMzICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBBY3Rpb25TY3JpcHQgMyIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGRhcnQgICAgIkVuYWJsZSBjb21waWxlciBmb3IgRGFydCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGhheGUgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSGF4ZSIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGNzaGFycCAgIkVuYWJsZSBjb21waWxlciBmb3IgQyMiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihuZXRjb3JlICJFbmFibGUgY29tcGlsZXIgZm9yIC5ORVQgQ29yZSIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHB5ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUHl0aG9uIDIuMCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHJiICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUnVieSIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHBlcmwgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUGVybCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHBocCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUEhQIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoZXJsICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBFcmxhbmciIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihjb2NvYSAgICJFbmFibGUgY29tcGlsZXIgZm9yIENvY29hIE9iamVjdGl2ZS1DIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoc3dpZnQgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDb2NvYSBTd2lmdCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHN0ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgU21hbGx0YWxrIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIob2NhbWwgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBPQ2FtbCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGhzICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSGFza2VsbCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHhzZCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgWFNEIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoaHRtbCAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBIVE1MIERvY3VtZW50YXRpb24iIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihqcyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEphdmFTY3JpcHQiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihqc29uICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEpTT04iIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihqYXZhbWUgICJFbmFibGUgY29tcGlsZXIgZm9yIEphdmEgTUUiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihkZWxwaGkgICJFbmFibGUgY29tcGlsZXIgZm9yIERlbHBoaSIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGdvICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgR28iIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihkICAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEQiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihsdWEgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEx1YSIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGd2ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgR3JhcGhWaXoiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihycyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFJ1c3QiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUih4bWwgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFhNTCIgT04pCisKKyMgVGhyaWZ0IGlzIGxvb2tpbmcgZm9yIGluY2x1ZGUgZmlsZXMgaW4gdGhlIHNyYyBkaXJlY3RvcnkKKyMgd2UgYWxzbyBhZGQgdGhlIGN1cnJlbnQgYmluYXJ5IGRpcmVjdG9yeSBmb3IgZ2VuZXJhdGVkIGZpbGVzCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSBzcmMpCisKK2lmKE5PVCBERUZJTkVEIFdJVEhfUExVR0lOIE9SIE5PVCAke1dJVEhfUExVR0lOfSkKKyAgICBsaXN0KEFQUEVORCB0aHJpZnQtY29tcGlsZXJfU09VUkNFUyAke2NvbXBpbGVyX2NvcmV9KQorZW5kaWYoKQorCithZGRfZXhlY3V0YWJsZSh0aHJpZnQtY29tcGlsZXIgJHt0aHJpZnQtY29tcGlsZXJfU09VUkNFU30pCisKK2lmKCR7V0lUSF9QTFVHSU59KQorICAgIGFkZF9leGVjdXRhYmxlKHRocmlmdC1ib290c3RyYXAgJHtjb21waWxlcl9jb3JlfQorICAgICAgICBzcmMvdGhyaWZ0L21haW4uY2MKKyAgICAgICAgc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcAorICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYworICAgICkKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXModGhyaWZ0LWJvb3RzdHJhcCBwYXJzZSkKKworICAgIHNldChQTFVHSU5fR0VOX1NPVVJDRVMKKyAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC9wbHVnaW4vcGx1Z2luX3R5cGVzLmgKKyAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC9wbHVnaW4vcGx1Z2luX3R5cGVzLmNwcAorICAgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3BsdWdpbi9wbHVnaW5fY29uc3RhbnRzLmgKKyAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC9wbHVnaW4vcGx1Z2luX2NvbnN0YW50cy5jcHAKKyAgICApCisKKyAgICBmaWxlKE1BS0VfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvcGx1Z2luKQorICAgIGFkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgJHtQTFVHSU5fR0VOX1NPVVJDRVN9CisgICAgICAgIERFUEVORFMgdGhyaWZ0LWJvb3RzdHJhcCBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4udGhyaWZ0CisgICAgICAgIENPTU1BTkQgdGhyaWZ0LWJvb3RzdHJhcCAtZ2VuIGNwcAorICAgICAgICAtb3V0ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvcGx1Z2luCisgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4udGhyaWZ0CisgICAgKQorCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9saWIvY3BwL3NyYykKKworICAgIGluY2x1ZGUoVGhyaWZ0TWFjcm9zKQorICAgIEFERF9MSUJSQVJZX1RIUklGVCh0aHJpZnRjCisgICAgICAgICR7Y29tcGlsZXJfY29yZX0KKyAgICAgICAgJHtQTFVHSU5fR0VOX1NPVVJDRVN9CisgICAgICAgIHNyYy90aHJpZnQvbG9nZ2luZy5jYworICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmNjCisgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5jYworICAgICkKKyAgICBUQVJHRVRfSU5DTFVERV9ESVJFQ1RPUklFU19USFJJRlQodGhyaWZ0YyBQVUJMSUMgJHtCb29zdF9JTkNMVURFX0RJUlN9KQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlRfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0aHJpZnRjIHRocmlmdCBQVUJMSUMpCisgICAgdGFyZ2V0X2NvbXBpbGVfZGVmaW5pdGlvbnModGhyaWZ0LWNvbXBpbGVyIFBVQkxJQyBUSFJJRlRfRU5BQkxFX1BMVUdJTikKKyAgICBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGhyaWZ0LWNvbXBpbGVyIHRocmlmdGMpCitlbmRpZigpCisKK3NldF90YXJnZXRfcHJvcGVydGllcyh0aHJpZnQtY29tcGlsZXIgUFJPUEVSVElFUyBSVU5USU1FX09VVFBVVF9ESVJFQ1RPUlkgYmluLykKK3NldF90YXJnZXRfcHJvcGVydGllcyh0aHJpZnQtY29tcGlsZXIgUFJPUEVSVElFUyBPVVRQVVRfTkFNRSB0aHJpZnQpCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0aHJpZnQtY29tcGlsZXIgcGFyc2UpCisKK2luc3RhbGwoVEFSR0VUUyB0aHJpZnQtY29tcGlsZXIgREVTVElOQVRJT04gYmluKQorCitpZigke1dJVEhfUExVR0lOfSkKKyAgIyBJbnN0YWxsIHRoZSBoZWFkZXJzCisgIGluc3RhbGwoRklMRVMKKyAgICAgICJzcmMvdGhyaWZ0L2NvbW1vbi5oIgorICAgICAgInNyYy90aHJpZnQvZ2xvYmFscy5oIgorICAgICAgInNyYy90aHJpZnQvbG9nZ2luZy5oIgorICAgICAgInNyYy90aHJpZnQvbWFpbi5oIgorICAgICAgInNyYy90aHJpZnQvcGxhdGZvcm0uaCIKKyAgICAgICIke0NNQUtFX0JJTkFSWV9ESVJ9L2NvbXBpbGVyL2NwcC90aHJpZnQvdmVyc2lvbi5oIgorICAgICAgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdGhyaWZ0IikKKyAgaW5zdGFsbChGSUxFUworICAgICAgInNyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5oIgorICAgICAgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdGhyaWZ0L2F1ZGl0IikKKyAgaW5zdGFsbChGSUxFUworICAgICAgInNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKyAgICAgICJzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgiCisgICAgICAic3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmgiCisgICAgICAic3JjL3RocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKyAgICAgIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L3RocmlmdC9nZW5lcmF0ZSIpCisgIGluc3RhbGwoRklMRVMKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2NvbnN0LmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2NvbnN0X3ZhbHVlLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9kb2MuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfZW51bS5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9lbnVtX3ZhbHVlLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2ZpZWxkLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2Z1bmN0aW9uLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2xpc3QuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfbWFwLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9zZXQuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorICAgICAgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdGhyaWZ0L3BhcnNlIikKKyAgaW5zdGFsbChGSUxFUworICAgICAgInNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5oIgorICAgICAgInNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BsdWdpbi90eXBlX3V0aWwuaCIKKyAgICAgIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L3RocmlmdC9wbHVnaW4iKQoraWYoTVNWQykKKyAgaW5zdGFsbChGSUxFUworICAgICAgInNyYy90aHJpZnQvd2luZG93cy9jb25maWcuaCIKKyAgICAgIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L3RocmlmdC93aW5kb3dzIikKK2VuZGlmKCkKK2VuZGlmKCkKKworaWYoQlVJTERfVEVTVElORykKKyAgICBhZGRfc3ViZGlyZWN0b3J5KHRlc3QpCitlbmRpZigpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvTWFrZWZpbGUuYW0gYi9jb21waWxlci9jcHAvTWFrZWZpbGUuYW0KaW5kZXggZmFhYWMyNS4uMGI4ZWYyZSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL01ha2VmaWxlLmFtCisrKyBiL2NvbXBpbGVyL2NwcC9NYWtlZmlsZS5hbQpAQCAtMjEsMTE2ICsyMSwxODcgQEAKICMgUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKICMgZGV0YWlscy4KIAotQU1fWUZMQUdTID0gLWQKLUJVSUxUX1NPVVJDRVMgPQorQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzCisKKyMgTm90ZSBvbiB3aHkgd2UgaGF2ZSBzcmMvdGhyaWZ0IGFuZCBzcmMvdGhyaWZ0L3BsdWdpbiBkaXJlY3RvcmllczoKKyMgU2luY2UgQXV0b21ha2Ugc3VwcG9ydHMgb25seSBvbmUgc2V0IG9mIEJVSUxUX1NPVVJDRVMgcGVyIGZpbGUgYW5kIGRvZXMgbm90IGFsbG93CisjIFNVQkRJUlMgYnVpbHQgYmVmb3JlIEJVSUxUX1NPVVJDRVMsIHdlIGVuZCB1cCBzZXBhcmF0ZSBNYWtlZmlsZS5hbSBmb3IgZWFjaCBzb3VyY2UKKyMgY29kZSBnZW5lcmF0aW9uLCBpLmUuIGxleC15YWNjIGFuZCBUaHJpZnQsIHRvIGFjaGlldmUgc3RhYmxlIHBhcmFsbGVsIG1ha2UuCisKK1NVQkRJUlMgPSBzcmMgc3JjL3RocmlmdC9wbHVnaW4gLgoraWYgV0lUSF9URVNUUworU1VCRElSUyArPSB0ZXN0CitlbmRpZgogCiBiaW5fUFJPR1JBTVMgPSB0aHJpZnQKIAotbm9pbnN0X0xJQlJBUklFUyA9IGxpYnBhcnNlLmEKLQogdGhyaWZ0X09CSkRJUiA9IG9iagogCi10aHJpZnRfU09VUkNFUyA9IHNyYy9tYWluLmNjIFwKLSAgICAgICAgICAgICAgICAgc3JjL21kNS5jIFwKLSAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmggXAotICAgICAgICAgICAgICAgICBzcmMvZ2xvYmFscy5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL21haW4uaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wbGF0Zm9ybS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL21kNS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfZG9jLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF90eXBlLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9iYXNlX3R5cGUuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2VudW0uaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2VudW1fdmFsdWUuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X3R5cGVkZWYuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2NvbnRhaW5lci5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfbGlzdC5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3Rfc2V0LmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9tYXAuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X3N0cnVjdC5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfZmllbGQuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X3NlcnZpY2UuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2Z1bmN0aW9uLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9wcm9ncmFtLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9zY29wZS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfY29uc3QuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2NvbnN0X3ZhbHVlLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvcGFyc2UuY2MgXAotICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaAorcGx1Z2luX2dlbiA9IHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5oIFwKKyAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fdHlwZXMuY3BwIFwKKyAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fY29uc3RhbnRzLmggXAorICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9jb25zdGFudHMuY3BwCiAKLWlmIFRIUklGVF9HRU5fY19nbGliCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9jX2dsaWJfZ2VuZXJhdG9yLmNjCi1lbmRpZgotaWYgVEhSSUZUX0dFTl9jcHAKLXRocmlmdF9TT1VSQ0VTICs9IHNyYy9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX2phdmEKLXRocmlmdF9TT1VSQ0VTICs9IHNyYy9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjCi1lbmRpZgotaWYgVEhSSUZUX0dFTl9hczMKLXRocmlmdF9TT1VSQ0VTICs9IHNyYy9nZW5lcmF0ZS90X2FzM19nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX2NzaGFycAotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYwotZW5kaWYKLWlmIFRIUklGVF9HRU5fcHkKLXRocmlmdF9TT1VSQ0VTICs9IHNyYy9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYwotZW5kaWYKLWlmIFRIUklGVF9HRU5fcmIKLXRocmlmdF9TT1VSQ0VTICs9IHNyYy9nZW5lcmF0ZS90X3JiX2dlbmVyYXRvci5jYwotZW5kaWYKLWlmIFRIUklGVF9HRU5fcGVybAotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfcGVybF9nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX3BocAotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYwotZW5kaWYKLWlmIFRIUklGVF9HRU5fZXJsCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjCi1lbmRpZgotaWYgVEhSSUZUX0dFTl9jb2NvYQotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfY29jb2FfZ2VuZXJhdG9yLmNjCi1lbmRpZgotaWYgVEhSSUZUX0dFTl9zdAotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3Rfc3RfZ2VuZXJhdG9yLmNjCi1lbmRpZgotaWYgVEhSSUZUX0dFTl9vY2FtbAotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjCi1lbmRpZgotaWYgVEhSSUZUX0dFTl9ocwotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjCi1lbmRpZgotaWYgVEhSSUZUX0dFTl94c2QKLXRocmlmdF9TT1VSQ0VTICs9IHNyYy9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX2h0bWwKLXRocmlmdF9TT1VSQ0VTICs9IHNyYy9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmNjCi1lbmRpZgotaWYgVEhSSUZUX0dFTl9qcwotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfanNfZ2VuZXJhdG9yLmNjCi1lbmRpZgotaWYgVEhSSUZUX0dFTl9qYXZhbWUKLXRocmlmdF9TT1VSQ0VTICs9IHNyYy9nZW5lcmF0ZS90X2phdmFtZV9nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX2dvCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9nb19nZW5lcmF0b3IuY2MKLWVuZGlmCitjb21waWxlcl9jb3JlID0gIHNyYy90aHJpZnQvY29tbW9uLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbW1vbi5jYyBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dsb2JhbHMuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGxhdGZvcm0uaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvbG9nZ2luZy5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2RvYy5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3R5cGUuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9lbnVtLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZW51bV92YWx1ZS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmNjIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2xpc3QuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9zZXQuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9tYXAuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9zdHJ1Y3QuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9maWVsZC5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3NlcnZpY2UuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9mdW5jdGlvbi5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3Byb2dyYW0uaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9zY29wZS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0LmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvcGFyc2UuY2MgXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmggCisKK3RocmlmdF9TT1VSQ0VTID0gc3JjL3RocmlmdC9tYWluLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L21haW4uY2MgXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuY3BwIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmgKKworIyBTcGVjaWZpYyBjbGllbnQgZ2VuZXJhdG9yIHNvdXJjZQordGhyaWZ0X1NPVVJDRVMgKz0gc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NfZ2xpYl9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc29uX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZGFydF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2hheGVfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaCBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcHlfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3N3aWZ0X2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3RfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2hzX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfeG1sX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2pzX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfamF2YW1lX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZGVscGhpX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ29fZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9ndl9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9sdWFfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9yc19nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NsX2dlbmVyYXRvci5jYwogCiB0aHJpZnRfQ1BQRkxBR1MgPSAtSSQoc3JjZGlyKS9zcmMKLXRocmlmdF9DWFhGTEFHUyA9IC1XYWxsCi10aHJpZnRfTERBREQgPSBATEVYTElCQCBsaWJwYXJzZS5hCit0aHJpZnRfQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYyAtV2Vycm9yCit0aHJpZnRfTERBREQgPSBATEVYTElCQCBzcmMvdGhyaWZ0L2xpYnBhcnNlLmEKIAotbGlicGFyc2VfYV9DUFBGTEFHUyA9IC1JJChzcmNkaXIpL3NyYwotbGlicGFyc2VfYV9DWFhGTEFHUyA9IC1XYWxsIC1Xbm8tc2lnbi1jb21wYXJlIC1Xbm8tdW51c2VkCitpZiAhV0lUSF9QTFVHSU4KK3RocmlmdF9TT1VSQ0VTICs9ICQoY29tcGlsZXJfY29yZSkKK2Vsc2UKIAotbGlicGFyc2VfYV9TT1VSQ0VTID0gc3JjL3RocmlmdHkueXkgXAotICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdGwubGwKK2xpYl9MVExJQlJBUklFUyA9IGxpYnRocmlmdGMubGEKIAotRVhUUkFfRElTVCA9IFJFQURNRQordGhyaWZ0X0NQUEZMQUdTICs9IC1EVEhSSUZUX0VOQUJMRV9QTFVHSU49MQordGhyaWZ0X0xEQUREICs9IGxpYnRocmlmdGMubGEKKworbm9kaXN0X2xpYnRocmlmdGNfbGFfU09VUkNFUyA9ICQocGx1Z2luX2dlbikKK2xpYnRocmlmdGNfbGFfU09VUkNFUyA9ICQoY29tcGlsZXJfY29yZSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vdHlwZV91dGlsLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmNjIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmNjIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi50aHJpZnQgXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9sb2dnaW5nLmNjCisKKworbGlidGhyaWZ0Y19sYV9DUFBGTEFHUyA9IC1JJChzcmNkaXIpL3NyYyAtSXNyYyAtSSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL3NyYyAtRFRIUklGVF9FTkFCTEVfUExVR0lOPTEKK2xpYnRocmlmdGNfbGFfQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYworbGlidGhyaWZ0Y19sYV9MSUJBREQgPSAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEKKworaW5jbHVkZV90aHJpZnRkaXIgPSAkKGluY2x1ZGVkaXIpL3RocmlmdAoraW5jbHVkZV90aHJpZnRfSEVBREVSUyA9IHNyYy90aHJpZnQvY29tbW9uLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2xvYmFscy5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2xvZ2dpbmcuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9tYWluLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGxhdGZvcm0uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC92ZXJzaW9uLmgKKworaW5jbHVkZV9hdWRpdGRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3dpbmRvd3MKK2luY2x1ZGVfYXVkaXRfSEVBREVSUyA9IHNyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5oCisKK2luY2x1ZGVfZ2VuZXJhdGVkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9nZW5lcmF0ZQoraW5jbHVkZV9nZW5lcmF0ZV9IRUFERVJTID0gc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5oIAorCitpbmNsdWRlX3BhcnNlZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvcGFyc2UKK2luY2x1ZGVfcGFyc2VfSEVBREVSUyA9IHNyYy90aHJpZnQvcGFyc2UvdF9zZXJ2aWNlLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3Byb2dyYW0uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZmllbGQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9zZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZW51bV92YWx1ZS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9jb25zdC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9saXN0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X21hcC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9jb250YWluZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2VudW0uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9kb2MuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmgKKworaW5jbHVkZV9wbHVnaW5kaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9wbHVnaW4KK2luY2x1ZGVfcGx1Z2luX0hFQURFUlMgPSBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vdHlwZV91dGlsLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuaAorCitpbmNsdWRlX3dpbmRvd3NkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS93aW5kb3dzCitpbmNsdWRlX3dpbmRvd3NfSEVBREVSUyA9IHNyYy90aHJpZnQvd2luZG93cy9jb25maWcuaAorZW5kaWYKKworV0lORE9XU19ESVNUID0gXAorICAgICAgICAgICAgIGNvbXBpbGVyLnNsbiBcCisgICAgICAgICAgICAgY29tcGlsZXIudmN4cHJvaiBcCisgICAgICAgICAgICAgY29tcGlsZXIudmN4cHJvai5maWx0ZXJzCisKK0VYVFJBX0RJU1QgPSBcCisgICAgICAgICAgICAgY29kaW5nX3N0YW5kYXJkcy5tZCBcCisgICAgICAgICAgICAgUkVBRE1FLm1kIFwKKyAgICAgICAgICAgICBDTWFrZUxpc3RzLnR4dCBcCisgICAgICAgICAgICAgdGVzdCBcCisgICAgICAgICAgICAgJChXSU5ET1dTX0RJU1QpCiAKIGNsZWFuLWxvY2FsOgotCSQoUk0pIHRocmlmdGwuY2MgdGhyaWZ0eS5jYyB0aHJpZnR5LmggdmVyc2lvbi5oCisJJChSTSkgdmVyc2lvbi5oICQocGx1Z2luX2dlbikKIAotc3JjL21haW4uY2M6IHZlcnNpb24uaAorc3JjL3RocmlmdC9tYWluLmNjOiBzcmMvdGhyaWZ0L3ZlcnNpb24uaAorCitzdHlsZS1sb2NhbDoKKyAgJChDUFBTVFlMRV9DTUQpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvUkVBRE1FIGIvY29tcGlsZXIvY3BwL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIxMDBhOC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotVGhyaWZ0IENvZGUgQ29tcGlsZXIKLQotTGljZW5zZQotPT09PT09PQotCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLQotVGhyaWZ0IENvZGUgQ29tcGlsZXIKLT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgY29tcGlsZXIgdGFrZXMgdGhyaWZ0IGZpbGVzIGFzIGlucHV0IGFuZCBnZW5lcmF0ZXMgb3V0cHV0IGNvZGUgYWNyb3NzCi12YXJpb3VzIHByb2dyYW1taW5nIGxhbmd1YWdlcy4gVG8gYnVpbGQgYW5kIGluc3RhbGwgaXQsIGRvIHRoaXM6Ci0KLSAgLi9ib290c3RyYXAuc2gKLSAgLi9jb25maWd1cmUKLSAgbWFrZQotICBzdWRvIG1ha2UgaW5zdGFsbAotCi1JdCByZXF1aXJlcyBzb21lIGZvcm0gb2YgTEVYIGFuZCBZQUNDIHRvIGJlIGluc3RhbGxlZCwgd2hpY2ggc2hvdWxkIGJlCi1waWNrZWQgdXAgYnkgYXV0b2NvbmYuCi0KLU5vdCBtdWNoIGVsc2UgdG8gcmVwb3J0IGhlcmUuIFlvdSdsbCBoYXZlIHRvIGxvb2sgYXQgdGhlIGNvZGUgdG8gZ2V0IHlvdXIKLXF1ZXN0aW9ucyBhbnN3ZXJlZC4gT3IganVzdCBydW4gdGhlIGV4ZWN1dGFibGUgYWZ0ZXIgeW91IGJ1aWxkIGFuZCB0YWtlCi1hIGxvb2sgYXQgdGhlIHVzYWdlIG1lc3NhZ2UuCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvUkVBRE1FLm1kIGIvY29tcGlsZXIvY3BwL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmVhYzlmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL1JFQURNRS5tZApAQCAtMCwwICsxLDE3NSBAQAorIyBCdWlsZCBUaHJpZnQgSURMIGNvbXBpbGVyIHVzaW5nIENNYWtlCisKKzwhLS0gVE9DIC0tPgorCistIFtCdWlsZCBUaHJpZnQgSURMIGNvbXBpbGVyIHVzaW5nIENNYWtlXSgjYnVpbGQtdGhyaWZ0LWlkbC1jb21waWxlci11c2luZy1jbWFrZSkKKyAgICAtIFtCdWlsZCBvbiBVbml4LWxpa2UgU3lzdGVtXSgjYnVpbGQtb24tdW5peC1saWtlLXN5c3RlbSkKKyAgICAgICAgLSBbUHJlcmVxdWlzaXRlc10oI3ByZXJlcXVpc2l0ZXMpCisgICAgICAgIC0gW0J1aWxkIHVzaW5nIENNYWtlXSgjYnVpbGQtdXNpbmctY21ha2UpCisgICAgICAgICAgICAtIFtCdWlsZCB3aXRoIEVjbGlwc2UgSURFXSgjYnVpbGQtd2l0aC1lY2xpcHNlLWlkZSkKKyAgICAgICAgICAgIC0gW0J1aWxkIHdpdGggWENvZGUgSURFIGluIE1hY09TXSgjYnVpbGQtd2l0aC14Y29kZS1pZGUtaW4tbWFjb3MpCisgICAgICAgICAgICAtIFtVc2FnZSBvZiBvdGhlciBJREVzXSgjdXNhZ2Utb2Ytb3RoZXItaWRlcykKKyAgICAtIFtCdWlsZCBvbiBXaW5kb3dzXSgjYnVpbGQtb24td2luZG93cykKKyAgICAgICAgLSBbUHJlcmVxdWlzaXRlc10oI3ByZXJlcXVpc2l0ZXMtMSkKKyAgICAgICAgLSBbQnVpbGQgdXNpbmcgR2l0IEJhc2hdKCNidWlsZC11c2luZy1naXQtYmFzaCkKKyAgICAgICAgLSBbVXNpbmcgVmlzdWFsIFN0dWRpbyBhbmQgV2luIGZsZXgtYmlzb25dKCN1c2luZy12aXN1YWwtc3R1ZGlvLWFuZC13aW4tZmxleC1iaXNvbikKKyAgICAgICAgLSBbQ3Jvc3MgY29tcGlsZSB1c2luZyBtaW5ndzMyIGFuZCBnZW5lcmF0ZSBhIFdpbmRvd3MgSW5zdGFsbGVyIHdpdGggQ1BhY2tdKCNjcm9zcy1jb21waWxlLXVzaW5nLW1pbmd3MzItYW5kLWdlbmVyYXRlLWEtd2luZG93cy1pbnN0YWxsZXItd2l0aC1jcGFjaykKKy0gW090aGVyIGNhc2VzXSgjb3RoZXItY2FzZXMpCisgICAgLSBbQnVpbGRpbmcgdGhlIFRocmlmdCBJREwgY29tcGlsZXIgaW4gV2luZG93cyB3aXRob3V0IENNYWtlXSgjYnVpbGRpbmctdGhlLXRocmlmdC1pZGwtY29tcGlsZXItaW4td2luZG93cy13aXRob3V0LWNtYWtlKQorLSBbVW5pdCB0ZXN0cyBmb3IgY29tcGlsZXJdKCN1bml0LXRlc3RzLWZvci1jb21waWxlcikKKyAgICAtIFtVc2luZyBib29zdCB0ZXN0XSgjdXNpbmctYm9vc3QtdGVzdCkKKyAgICAtIFtVc2luZyBDYXRjaCBDKysgdGVzdCBsaWJyYXJ5XSgjdXNpbmctY2F0Y2gtYy10ZXN0LWxpYnJhcnkpCistIFtIYXZlIGEgSGFwcHkgZnJlZSB0aW1lIGFuZCBob2xpZGF5c10oI2hhdmUtYS1oYXBweS1mcmVlLXRpbWUtYW5kLWhvbGlkYXlzKQorCis8IS0tIC9UT0MgLS0+CisKKyMjIEJ1aWxkIG9uIFVuaXgtbGlrZSBTeXN0ZW0KKworIyMjIFByZXJlcXVpc2l0ZXMKKy0gSW5zdGFsbCBDTWFrZQorLSBJbnN0YWxsIGZsZXggYW5kIGJpc29uCisKKyMjIyBCdWlsZCB1c2luZyBDTWFrZQorCistIEdvIHRvICoqdGhyaWZ0XGNvbXBpbGVyXGNwcCoqCistIFVzZSB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHVzaW5nIGNtYWtlOgorCitgYGAKK21rZGlyIGNtYWtlLWJ1aWxkICYmIGNkIGNtYWtlLWJ1aWxkCitjbWFrZSAuLgorbWFrZQorYGBgCisKKyMjIyMgQnVpbGQgd2l0aCBFY2xpcHNlIElERQorCistIEdvIHRvICoqdGhyaWZ0XGNvbXBpbGVyXGNwcCoqCistIFVzZSB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHVzaW5nIGNtYWtlOgorCitgYGAKK21rZGlyIGNtYWtlLWVjICYmIGNkIGNtYWtlLWVjCitjbWFrZSAtRyAiRWNsaXBzZSBDRFQ0IC0gVW5peCBNYWtlZmlsZXMiIC4uCittYWtlCitgYGAKKworTm93IG9wZW4gdGhlIGZvbGRlciBjbWFrZS1lYyB1c2luZyBlY2xpcHNlLgorCisjIyMjIEJ1aWxkIHdpdGggWENvZGUgSURFIGluIE1hY09TCisKKy0gSW5zdGFsbC91cGRhdGUgZmxleCwgYmlzb24gYW5kIGNtYWtlIHdpdGggYnJldworCitgYGAKK2JyZXcgaW5zdGFsbCBjbWFrZQorYnJldyBpbnN0YWxsIGJpc29uCitgYGAKKworLSBHbyB0byAqKnRocmlmdFxjb21waWxlclxjcHAqKgorLSBSdW4gY29tbWFuZHMgaW4gY29tbWFuZCBsaW5lOgorCitgYGAKK21rZGlyIGNtYWtlLWJ1aWxkICYmIGNkIGNtYWtlLWJ1aWxkCitjbWFrZSAtRyAiWGNvZGUiIC1EV0lUSF9QTFVHSU49T0ZGIC4uCitjbWFrZSAtLWJ1aWxkIC4KK2BgYAorCisjIyMjIFVzYWdlIG9mIG90aGVyIElERXMKKworUGxlYXNlIGNoZWNrIGxpc3Qgb2Ygc3VwcG9ydGVkIElERSAKKworYGBgCitjbWFrZSAtLWhlbHAKK2BgYAorCisjIyBCdWlsZCBvbiBXaW5kb3dzCisKKyMjIyBQcmVyZXF1aXNpdGVzCistIEluc3RhbGwgQ01ha2UgLSBodHRwczovL2NtYWtlLm9yZy9kb3dubG9hZC8KKy0gSW4gY2FzZSBpZiB5b3Ugd2FudCB0byBidWlsZCB3aXRob3V0IEdpdCBCYXNoIC0gaW5zdGFsbCB3aW5mbGV4Ymlzb24gLSBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy93aW5mbGV4Ymlzb24vCistIEluIGNhc2UgaWYgeW91IHdhbnQgdG8gYnVpbGQgd2l0aCBWaXN1YWwgU3R1ZGlvIC0gaW5zdGFsbCBWaXN1YWwgU3R1ZGlvIAorICAtIEJldHRlciB0byB1c2UgdGhlIGxhdGVzdCBzdGFibGUgVmlzdWFsIFN0dWRpbyBDb21tdW5pdHkgRWRpdGlvbiAtIGh0dHBzOi8vd3d3LnZpc3VhbHN0dWRpby5jb20vdnMvd2hhdHNuZXcvIChlbnN1cmUgdGhhdCB5b3UgaW5zdGFsbGVkIHdvcmtsb2FkICJEZXNrdG9wIERldmVsb3BtZW50IHdpdGggQysrIiBmb3IgVlMyMDE3KSAtIE1pY3Jvc29mdCBhZGRlZCBzb21lIHN1cHBvcnQgZm9yIENNYWtlIGFuZCBpbXByb3ZpbmcgaXQgaW4gVmlzdWFsIFN0dWRpbworCisjIyMgQnVpbGQgdXNpbmcgR2l0IEJhc2gKKworR2l0IEJhc2ggcHJvdmlkZXMgZmxleCBhbmQgYmlzb24KKworLSBHbyB0byAqKnRocmlmdFxjb21waWxlclxjcHAqKgorLSBVc2UgdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB1c2luZyBjbWFrZToKKworYGBgCitta2RpciBjbWFrZS12cyAmJiBjZCBjbWFrZS12cworY21ha2UgLURXSVRIX1NIQVJFRF9MSUI9b2ZmIC4uCitjbWFrZSAtLWJ1aWxkIC4KK2BgYAorCisjIyMgVXNpbmcgVmlzdWFsIFN0dWRpbyBhbmQgV2luIGZsZXgtYmlzb24KKworLSBHZW5lcmF0ZSBhIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBmb3IgdmVyc2lvbiBvZiBWaXN1YWwgU3R1ZGlvIHdoaWNoIHlvdSBoYXZlICgqKmNtYWtlIC0taGVscCoqIGNhbiBzaG93IGxpc3Qgb2Ygc3VwcG9ydGFibGUgVlMgdmVyc2lvbnMpOgorLSBSdW4gY29tbWFuZHMgaW4gY29tbWFuZCBsaW5lOgorYGBgCitta2RpciBjbWFrZS12cworY2QgY21ha2UtdnMKK2NtYWtlIC1HICJWaXN1YWwgU3R1ZGlvIDE1IDIwMTciIC1EV0lUSF9QTFVHSU49T0ZGIC4uCitgYGAKKy0gTm93IG9wZW4gdGhlIGZvbGRlciBjbWFrZS12cyB1c2luZyBWaXN1YWwgU3R1ZGlvLgorCisjIyMgQ3Jvc3MgY29tcGlsZSB1c2luZyBtaW5ndzMyIGFuZCBnZW5lcmF0ZSBhIFdpbmRvd3MgSW5zdGFsbGVyIHdpdGggQ1BhY2sKKworYGBgCitta2RpciBjbWFrZS1taW5ndzMyICYmIGNkIGNtYWtlLW1pbmd3MzIKK2NtYWtlIC1EQ01BS0VfVE9PTENIQUlOX0ZJTEU9Li4vYnVpbGQvY21ha2UvbWluZ3czMi10b29sY2hhaW4uY21ha2UgLURCVUlMRF9DT01QSUxFUj1PTiAtREJVSUxEX0xJQlJBUklFUz1PRkYgLURCVUlMRF9URVNUSU5HPU9GRiAtREJVSUxEX0VYQU1QTEVTPU9GRiAuLgorY3BhY2sKK2BgYAorCisjIE90aGVyIGNhc2VzCisKKyMjIEJ1aWxkaW5nIHRoZSBUaHJpZnQgSURMIGNvbXBpbGVyIGluIFdpbmRvd3Mgd2l0aG91dCBDTWFrZQorCitJZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgQ01ha2UgeW91IGNhbiB1c2UgdGhlIGFscmVhZHkgYXZhaWxhYmxlIFZpc3VhbCBTdHVkaW8gMjAxMCBzb2x1dGlvbi4KKworVGhlIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBjb250YWlucyBwcmUtYnVpbGQgY29tbWFuZHMgdG8gZ2VuZXJhdGUgdGhlIHRocmlmdGwuY2MsIHRocmlmdHkuY2MgYW5kIHRocmlmdHkuaGggZmlsZXMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBidWlsZCB0aGUgY29tcGlsZXIuIAorCitUaGVzZSBkZXBlbmQgb24gYmlzb24sIGZsZXggYW5kIHRoZWlyIGRlcGVuZGVuY2llcyB0byB3b3JrIHByb3Blcmx5LgorCitEb3dubG9hZCBmbGV4ICYgYmlzb24gYXMgZGVzY3JpYmVkIGFib3ZlLiAKKworUGxhY2UgdGhlc2UgYmluYXJpZXMgc29tZXdoZXJlIGluIHRoZSBwYXRoIGFuZCByZW5hbWUgd2luX2ZsZXguZXhlIGFuZCB3aW5fYmlzb24uZXhlIHRvIGZsZXguZXhlIGFuZCBiaXNvbi5leGUgcmVzcGVjdGl2ZWx5LgorCitJZiB0aGlzIGRvZXNuJ3Qgd29yayBvbiBhIHN5c3RlbSwgdHJ5IHRoZXNlIG1hbnVhbCBwcmUtYnVpbGQgc3RlcHMuCisKK09wZW4gY29tcGlsZXIuc2xuIGFuZCByZW1vdmUgdGhlIFByZS1idWlsZCBjb21tYW5kcyB1bmRlciB0aGUgcHJvamVjdCdzOiBQcm9wZXJ0aWVzIC0+IEJ1aWxkIEV2ZW50cyAtPiBQcmUtQnVpbGQgRXZlbnRzLgorCitGcm9tIGEgY29tbWFuZCBwcm9tcHQ6CitgYGAKK2NkIHRocmlmdC9jb21waWxlci9jcHAKK2ZsZXggLW8gc3JjXHRocmlmdFx0aHJpZnRsLmNjIHNyY1x0aHJpZnRcdGhyaWZ0bC5sbAorYGBgCitJbiB0aGUgZ2VuZXJhdGVkIHRocmlmdGwuY2MsIGNvbW1lbnQgb3V0ICNpbmNsdWRlIDx1bmlzdGQuaD4KKworUGxhY2UgYSBjb3B5IG9mIGJpc29uLnNpbXBsZSBpbiB0aHJpZnQvY29tcGlsZXIvY3BwCitgYGAKK2Jpc29uIC15IC1vICJzcmMvdGhyaWZ0L3RocmlmdHkuY2MiIC0tZGVmaW5lcyBzcmMvdGhyaWZ0L3RocmlmdHkueXkKK21vdmUgc3JjXHRocmlmdFx0aHJpZnR5LmNjLmhoICBzcmNcdGhyaWZ0XHRocmlmdHkuaGgKK2BgYAorCitCaXNvbiBtaWdodCBnZW5lcmF0ZSB0aGUgeWFjYyBoZWFkZXIgZmlsZSAidGhyaWZ0eS5jYy5oIiB3aXRoIGp1c3Qgb25lIGggIi5oIiBleHRlbnNpb247IGluIHRoaXMgY2FzZSB5b3UnbGwgaGF2ZSB0byByZW5hbWUgdG8gInRocmlmdHkuaCIuCisKK2BgYAorbW92ZSBzcmNcdGhyaWZ0XHZlcnNpb24uaC5pbiBzcmNcdGhyaWZ0XHZlcnNpb24uaAorYGBgCisKK0Rvd25sb2FkIGludHR5cGVzLmggZnJvbSB0aGUgaW50ZXJ3ZWJzIGFuZCBwbGFjZSBpdCBpbiBhbiBpbmNsdWRlIHBhdGgKK2xvY2F0aW9uIChlLmcuIHRocmlmdC9jb21waWxlci9jcHAvc3JjKS4KKworQnVpbGQgdGhlIGNvbXBpbGVyIGluIFZpc3VhbCBTdHVkaW8uCisKKyMgVW5pdCB0ZXN0cyBmb3IgY29tcGlsZXIKKworIyMgVXNpbmcgYm9vc3QgdGVzdAorLSBwbHMgY2hlY2sgKip0ZXN0KiogZm9sZGVyCisKKyMjIFVzaW5nIENhdGNoIEMrKyB0ZXN0IGxpYnJhcnkKKworQWRkZWQgZ2VuZXJpYyB3YXkgdG8gY292ZXIgY29kZSBieSB0ZXN0cyBmb3IgbWFueSBsYW5ndWFnZXMgKHlvdSBqdXN0IG5lZWQgdG8gbWFrZSBhIGNvcnJlY3QgaGVhZGVyIGZpbGUgZm9yIGdlbmVyYXRvciBmb3IgeW91ciBsYW5ndWFnZSAtIGV4YW1wbGUgaW4gKipuZXRjb3JlKiogaW1wbGVtZW50YXRpb24pCisKKy0gcGxzIGNoZWNrICoqdGVzdHMqKiBmb2xkZXIKKworIyBIYXZlIGEgSGFwcHkgZnJlZSB0aW1lIGFuZCBob2xpZGF5cyAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2NvbXBpbGVyL2NwcC9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMDg5NDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxLDQgQEAKKyMjIENvbXBpbGVyIENvZGluZyBTdGFuZGFyZHMKKworICogV2hlbiBtYWtpbmcgc21hbGwgY2hhbmdlIC8gYnVnZml4IC0gZm9sbG93IHN0eWxlIGFzIHNlZW4gaW4gbmVhcmJ5IGNvZGUuCisgKiBXaGVuIG1ha2luZyBtYWpvciByZWZhY3RvciBhbmQgLyBvciBhZGRpbmcgbmV3IGZlYXR1cmUgLSBmb2xsb3cgc3R5bGUgZm9yIEMrKyBsaWJyYXJ5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnNsbiBiL2NvbXBpbGVyL2NwcC9jb21waWxlci5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ5NjFhYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9jb21waWxlci5zbG4KQEAgLTAsMCArMSwyMCBAQAor77u/CitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMS4wMAorIyBWaXN1YWwgU3R1ZGlvIDIwMTAKK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiY29tcGlsZXIiLCAiY29tcGlsZXIudmN4cHJvaiIsICJ7ODk5NzVBMUEtRjc5OS00NTU2LTk4QjgtNjRFMzBBQjM5QTkwfSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfFdpbjMyID0gRGVidWd8V2luMzIKKwkJUmVsZWFzZXxXaW4zMiA9IFJlbGVhc2V8V2luMzIKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJezg5OTc1QTFBLUY3OTktNDU1Ni05OEI4LTY0RTMwQUIzOUE5MH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJezg5OTc1QTFBLUY3OTktNDU1Ni05OEI4LTY0RTMwQUIzOUE5MH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXs4OTk3NUExQS1GNzk5LTQ1NTYtOThCOC02NEUzMEFCMzlBOTB9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7ODk5NzVBMUEtRjc5OS00NTU2LTk4QjgtNjRFMzBBQjM5QTkwfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2ogYi9jb21waWxlci9jcHAvY29tcGlsZXIudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjI4YjU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2oKQEAgLTAsMCArMSwyNTAgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPgorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfHg2NCI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8V2luMzIiPgorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXx4NjQiPgorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhdWRpdFx0X2F1ZGl0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbW1vbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2dlbmVyYXRvci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2dlbmVyYXRvcl9yZWdpc3RyeS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X29vcF9nZW5lcmF0b3IuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9odG1sX2dlbmVyYXRvci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnbG9iYWxzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XG1haW4uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9iYXNlX3R5cGUuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9jb25zdC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2NvbnN0X3ZhbHVlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfY29udGFpbmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfZG9jLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfZW51bS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2VudW1fdmFsdWUuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9maWVsZC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2Z1bmN0aW9uLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfbGlzdC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X21hcC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3Byb2dyYW0uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9zY29wZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3NlcnZpY2UuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9zZXQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9zdHJ1Y3QuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF90eXBlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfdHlwZWRlZi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwbGF0Zm9ybS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0aHJpZnR5LmhoIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXGNvbmZpZy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx2ZXJzaW9uLmgiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhdWRpdFx0X2F1ZGl0LmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29tbW9uLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2FzM19nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfY29jb2FfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2NwcF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfY3NoYXJwX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9uZXRjb3JlX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9jX2dsaWJfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2RfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2RhcnRfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2RlbHBoaV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZXJsX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZ29fZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2d2X2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9oYXhlX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9oc19nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfaHRtbF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfamF2YW1lX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9qYXZhX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9qc19nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfanNvbl9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfbHVhX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9vY2FtbF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfcGVybF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfcGhwX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9weV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfcmJfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3JzX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9zdF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfc3dpZnRfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3htbF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfeHNkX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcbWFpbi5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VccGFyc2UuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfdHlwZWRlZi5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdGhyaWZ0bC5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdGhyaWZ0eS5jYyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPE5vbmUgSW5jbHVkZT0ic3JjXHRocmlmdFx0aHJpZnRsLmxsIiAvPgorICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnRcdGhyaWZ0eS55eSIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4KKyAgICA8UHJvamVjdEd1aWQ+ezg5OTc1QTFBLUY3OTktNDU1Ni05OEI4LTY0RTMwQUIzOUE5MH08L1Byb2plY3RHdWlkPgorICAgIDxLZXl3b3JkPldpbjMyUHJvajwvS2V5d29yZD4KKyAgICA8Um9vdE5hbWVzcGFjZT5jb21waWxlcjwvUm9vdE5hbWVzcGFjZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPnRydWU8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+dHJ1ZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+ZmFsc2U8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz5mYWxzZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD50cnVlPC9MaW5rSW5jcmVtZW50YWw+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x3aW5kb3dzXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgICAgPFRhcmdldE5hbWU+dGhyaWZ0PC9UYXJnZXROYW1lPgorICAgIDxFeGVjdXRhYmxlUGF0aD4kKEV4ZWN1dGFibGVQYXRoKTtDOlxQcm9ncmFtIEZpbGVzICh4ODYpXEdpdFxiaW48L0V4ZWN1dGFibGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD50cnVlPC9MaW5rSW5jcmVtZW50YWw+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x3aW5kb3dzXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgICAgPFRhcmdldE5hbWU+dGhyaWZ0PC9UYXJnZXROYW1lPgorICAgIDxFeGVjdXRhYmxlUGF0aD4kKEV4ZWN1dGFibGVQYXRoKTtDOlxQcm9ncmFtIEZpbGVzICh4ODYpXEdpdFxiaW48L0V4ZWN1dGFibGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxMaW5rSW5jcmVtZW50YWw+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHdpbmRvd3NcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgICA8VGFyZ2V0TmFtZT50aHJpZnQ8L1RhcmdldE5hbWU+CisgICAgPEV4ZWN1dGFibGVQYXRoPiQoRXhlY3V0YWJsZVBhdGgpO0M6XFByb2dyYW0gRmlsZXMgKHg4NilcR2l0XGJpbjwvRXhlY3V0YWJsZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPgorICAgIDxMaW5rSW5jcmVtZW50YWw+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHdpbmRvd3NcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgICA8VGFyZ2V0TmFtZT50aHJpZnQ8L1RhcmdldE5hbWU+CisgICAgPEV4ZWN1dGFibGVQYXRoPiQoRXhlY3V0YWJsZVBhdGgpO0M6XFByb2dyYW0gRmlsZXMgKHg4NilcR2l0XGJpbjwvRXhlY3V0YWJsZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtNSU5HVztZWV9OT19VTklTVERfSDtfREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz50aHJpZnRcd2luZG93c1xjb25maWcuaDwvRm9yY2VkSW5jbHVkZUZpbGVzPgorICAgICAgPENvbXBpbGVBcz5Db21waWxlQXNDcHA8L0NvbXBpbGVBcz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgPC9MaW5rPgorICAgIDxQcmVCdWlsZEV2ZW50PgorICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXFx0aHJpZnRcXHRocmlmdGwuY2MiIHNyYy90aHJpZnQvdGhyaWZ0bC5sbCAmYW1wOyZhbXA7IGJpc29uIC15IC1vICJzcmNcXHRocmlmdFxcdGhyaWZ0eS5jYyIgLS1kZWZpbmVzPSJzcmNcXHRocmlmdFxcdGhyaWZ0eS5oaCIgc3JjL3RocmlmdC90aHJpZnR5Lnl5PC9Db21tYW5kPgorICAgIDwvUHJlQnVpbGRFdmVudD4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtNSU5HVztZWV9OT19VTklTVERfSDtfREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz50aHJpZnRcd2luZG93c1xjb25maWcuaDwvRm9yY2VkSW5jbHVkZUZpbGVzPgorICAgICAgPENvbXBpbGVBcz5Db21waWxlQXNDcHA8L0NvbXBpbGVBcz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgPC9MaW5rPgorICAgIDxQcmVCdWlsZEV2ZW50PgorICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXFx0aHJpZnRcXHRocmlmdGwuY2MiIHNyYy90aHJpZnQvdGhyaWZ0bC5sbCAmYW1wOyZhbXA7IGJpc29uIC15IC1vICJzcmNcXHRocmlmdFxcdGhyaWZ0eS5jYyIgLS1kZWZpbmVzPSJzcmNcXHRocmlmdFxcdGhyaWZ0eS5oaCIgc3JjL3RocmlmdC90aHJpZnR5Lnl5PC9Db21tYW5kPgorICAgIDwvUHJlQnVpbGRFdmVudD4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtNSU5HVztZWV9OT19VTklTVERfSDtOREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz50aHJpZnRcd2luZG93c1xjb25maWcuaDwvRm9yY2VkSW5jbHVkZUZpbGVzPgorICAgICAgPENvbXBpbGVBcz5Db21waWxlQXNDcHA8L0NvbXBpbGVBcz4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+CisgICAgPC9MaW5rPgorICAgIDxQcmVCdWlsZEV2ZW50PgorICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXFx0aHJpZnRcXHRocmlmdGwuY2MiIHNyYy90aHJpZnQvdGhyaWZ0bC5sbCAmYW1wOyZhbXA7IGJpc29uIC15IC1vICJzcmNcXHRocmlmdFxcdGhyaWZ0eS5jYyIgLS1kZWZpbmVzPSJzcmNcXHRocmlmdFxcdGhyaWZ0eS5oaCIgc3JjL3RocmlmdC90aHJpZnR5Lnl5PC9Db21tYW5kPgorICAgIDwvUHJlQnVpbGRFdmVudD4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TUlOR1c7WVlfTk9fVU5JU1REX0g7TkRFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxGb3JjZWRJbmNsdWRlRmlsZXM+dGhyaWZ0XHdpbmRvd3NcY29uZmlnLmg8L0ZvcmNlZEluY2x1ZGVGaWxlcz4KKyAgICAgIDxDb21waWxlQXM+Q29tcGlsZUFzQ3BwPC9Db21waWxlQXM+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgorICAgIDwvTGluaz4KKyAgICA8UHJlQnVpbGRFdmVudD4KKyAgICAgIDxDb21tYW5kPmZsZXggLW8gInNyY1xcdGhyaWZ0XFx0aHJpZnRsLmNjIiBzcmMvdGhyaWZ0L3RocmlmdGwubGwgJmFtcDsmYW1wOyBiaXNvbiAteSAtbyAic3JjXFx0aHJpZnRcXHRocmlmdHkuY2MiIC0tZGVmaW5lcz0ic3JjXFx0aHJpZnRcXHRocmlmdHkuaGgiIHNyYy90aHJpZnQvdGhyaWZ0eS55eTwvQ29tbWFuZD4KKyAgICA8L1ByZUJ1aWxkRXZlbnQ+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4KKyAgPC9JbXBvcnRHcm91cD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvY29tcGlsZXIudmN4cHJvai5maWx0ZXJzIGIvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2ouZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTY4NjViCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2ouZmlsdGVycwpAQCAtMCwwICsxLDE5OSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xhdWRpdFx0X2F1ZGl0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9nZW5lcmF0b3IuaCI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9vb3BfZ2VuZXJhdG9yLmgiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfaHRtbF9nZW5lcmF0b3IuaCI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcZ2xvYmFscy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXG1haW4uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2Jhc2VfdHlwZS5oIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2NvbnN0LmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfY29uc3RfdmFsdWUuaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9jb250YWluZXIuaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9kb2MuaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9lbnVtLmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfZW51bV92YWx1ZS5oIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2ZpZWxkLmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfZnVuY3Rpb24uaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9saXN0LmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfbWFwLmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfcHJvZ3JhbS5oIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X3Njb3BlLmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfc2VydmljZS5oIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X3NldC5oIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X3N0cnVjdC5oIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X3R5cGUuaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF90eXBlZGVmLmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBsYXRmb3JtLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0eS5oaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x3aW5kb3dzXGNvbmZpZy5oIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHdpbmRvd3NcdmVyc2lvbi5oIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8RmlsdGVyIEluY2x1ZGU9IndpbmRvd3MiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2FlOWQwYTE1LTU3YWUtNGYwMS04N2E0LTgxZjc5MDI0OWI4M308L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJwYXJzZSI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NWRmMDE2YmItNTkxYi00MjBhLWE1MzUtNDMzMGQ5MTg3ZmJmfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9ImdlbmVyYXRlIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPntiNWM2MjZhZi1hZmE1LTQzM2MtOGUxMC1lZTczNDUzM2NiNjh9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xhdWRpdFx0X2F1ZGl0LmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfYXMzX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9jb2NvYV9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfY3BwX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9jc2hhcnBfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2NfZ2xpYl9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZF9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZGFydF9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZGVscGhpX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9lcmxfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9nb19nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZ3ZfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2hheGVfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2hzX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9odG1sX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9qYXZhbWVfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2phdmFfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2pzX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9vY2FtbF9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfcGVybF9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfcGhwX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9weV9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfcmJfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3JzX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9zdF9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfc3dpZnRfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3hzZF9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfeG1sX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcbWFpbi5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xwYXJzZVxwYXJzZS5jYyI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0bC5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnR5LmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfdHlwZWRlZi5jYyI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9qc29uX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9sdWFfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPE5vbmUgSW5jbHVkZT0ic3JjXHRocmlmdGwubGwiIC8+CisgICAgPE5vbmUgSW5jbHVkZT0ic3JjXHRocmlmdHkueXkiIC8+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9NYWtlZmlsZS5hbSBiL2NvbXBpbGVyL2NwcC9zcmMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMyYzVjYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4NyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjCisjIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisjIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisjIGRldGFpbHMuCisKK0FVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cworCitBTV9ZRkxBR1MgPSAtZAorCitCVUlMVF9TT1VSQ0VTID0gdGhyaWZ0L3RocmlmdHkuY2MKKworbm9pbnN0X0xJQlJBUklFUyA9IHRocmlmdC9saWJwYXJzZS5hCisKK3RocmlmdF9saWJwYXJzZV9hX0NQUEZMQUdTID0gLUkkKHNyY2RpcikKK3RocmlmdF9saWJwYXJzZV9hX0NYWEZMQUdTID0gLVdhbGwgLVduby1zaWduLWNvbXBhcmUgLVduby11bnVzZWQKKwordGhyaWZ0X2xpYnBhcnNlX2FfU09VUkNFUyA9IHRocmlmdC90aHJpZnR5Lnl5IFwKKyAgICAgICAgICAgICAgICAgICAgIHRocmlmdC90aHJpZnRsLmxsCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIHRocmlmdC90aHJpZnRsLmNjIHRocmlmdC90aHJpZnR5LmNjIHRocmlmdC90aHJpZnR5LmggdGhyaWZ0L3RocmlmdHkuaGgKKworaWYgV0lUSF9QTFVHSU4KK25vaW5zdF9QUk9HUkFNUyA9IHRocmlmdC90aHJpZnQtYm9vdHN0cmFwCisKK3RocmlmdF90aHJpZnRfYm9vdHN0cmFwX1NPVVJDRVMgPSBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9jb21tb24uaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9jb21tb24uY2MgXAorICAgICAgICAgICAgICAgICB0aHJpZnQvYXVkaXQvdF9hdWRpdC5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuY3BwIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvZ2xvYmFscy5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BsYXRmb3JtLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvbG9nZ2luZy5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfZG9jLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF90eXBlLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X2VudW0uaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X2VudW1fdmFsdWUuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X3R5cGVkZWYuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X3R5cGVkZWYuY2MgXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9jb250YWluZXIuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X2xpc3QuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X3NldC5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfbWFwLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9zdHJ1Y3QuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X2ZpZWxkLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9zZXJ2aWNlLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9mdW5jdGlvbi5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X2NvbnN0LmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9jb25zdF92YWx1ZS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3BhcnNlLmNjIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3dpbmRvd3MvY29uZmlnLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvdmVyc2lvbi5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9tYWluLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvbWFpbi5jYworCittYWluLmNjOiB2ZXJzaW9uLmgKKwordGhyaWZ0X3RocmlmdF9ib290c3RyYXBfQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYwordGhyaWZ0X3RocmlmdF9ib290c3RyYXBfTERBREQgPSBATEVYTElCQCB0aHJpZnQvbGlicGFyc2UuYQorZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9hczNfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2FzM19nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NTE0ZjEuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2FzM19nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNjk3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGNjdHlwZT4KLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3RkZXhjZXB0PgotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBBUzMgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X2FzM19nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfYXMzX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0gICAgCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImJpbmRhYmxlIik7Ci0gICAgYmluZGFibGVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotICAgIAotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWFzMyI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotCi0gIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGluX3N0YXRpYywgYm9vbCBkZWZ2YWw9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSwgYm9vbCBpbl9jbGFzcz1mYWxzZSwgYm9vbCBpc19yZXN1bHQ9ZmFsc2UpOwotICAvL3JlbW92ZWQgLS0gZXF1YWxpdHksY29tcGFyZV90bwotICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2FzM192YWxpZGF0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBiaW5kYWJsZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfYXMzX21ldGFfZGF0YV9tYXAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2FzM190eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLCBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKLSAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9hczNfYmVhbl9ib2lsZXJwbGF0ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGJpbmRhYmxlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkKTsKLSAgdm9pZCBnZW5lcmF0ZV9pc3NldF9zZXQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOwotICAvL3JlbW92ZWQgc3RkOjpzdHJpbmcgaXNzZXRfZmllbGRfaWQodF9maWVsZCogZmllbGQpOwotICAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlciAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAgKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIAotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0ICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50ICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9hczNfZG9jICAgICAgICAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqICAgICB0ZG9jKTsKLQotICB2b2lkIGdlbmVyYXRlX2FzM19kb2MgICAgICAgICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZG9jKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgYXMzX3BhY2thZ2UoKTsKLSAgc3RkOjpzdHJpbmcgYXMzX3R5cGVfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyBhczNfdGhyaWZ0X2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nJiBpbXBvcnRzKTsgCi0gIHN0ZDo6c3RyaW5nIGFzM190aHJpZnRfZ2VuX2ltcG9ydHModF9zZXJ2aWNlKiB0c2VydmljZSk7IAotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXI9ZmFsc2UsIGJvb2wgaW5faW5pdD1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXI9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0PWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpOwotCi0gIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7Ci0gICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLQotICAgIHJldHVybgotICAgICAgdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8Ci0gICAgICB0dHlwZS0+aXNfc3RydWN0KCkgfHwKLSAgICAgIHR0eXBlLT5pc194Y2VwdGlvbigpIHx8Ci0gICAgICB0dHlwZS0+aXNfc3RyaW5nKCk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBjb25zdGFudF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOwotCi0gcHJpdmF0ZToKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIHBhY2thZ2VfbmFtZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOwotICAKLSAgYm9vbCBiaW5kYWJsZV87CQotfTsKLQotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBwYWNrYWdlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImFzMyIpOwotCi0gIHN0cmluZyBkaXIgPSBwYWNrYWdlX25hbWVfOwotICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKTsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gICAgZGlyID0gZGlyLnN1YnN0cihsb2MrMSk7Ci0gIH0KLSAgaWYgKGRpci5zaXplKCkgPiAwKSB7Ci0gICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOwotICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgfQotCi0gIHBhY2thZ2VfZGlyXyA9IHN1YmRpcjsKLX0KLQotLyoqCi0gKiBQYWNrYWdlcyB0aGUgZ2VuZXJhdGVkIGZpbGUKLSAqCi0gKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgcGFja2FnZSwgaS5lLiAicGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdGRlbW87IgotICovCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphczNfcGFja2FnZSgpIHsKLSAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXyArICIgIjsKLSAgfQotICByZXR1cm4gIiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIGFzMyBpbXBvcnRzCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgZm9yIEFzMyB0eXBlcyB0aGF0IGFyZSB1c2VkIGluIGhlcmUKLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXMzX3R5cGVfaW1wb3J0cygpIHsKLSAgcmV0dXJuCi0gICAgc3RyaW5nKCkgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuU2V0O1xuIiArCi0gICAgImltcG9ydCBmbGFzaC51dGlscy5CeXRlQXJyYXk7XG4iICsKLSAgICAiaW1wb3J0IGZsYXNoLnV0aWxzLkRpY3Rpb25hcnk7XG5cbiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIGFzMyBpbXBvcnRzCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aHJpZnQKLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXMzX3RocmlmdF9pbXBvcnRzKCkgewotICByZXR1cm4KLSAgICBzdHJpbmcoKSArCi0gICAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qO1xuIiArCi0gICAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjtcbiIgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjtcblxuIjsKLX0KLQotLyoqCi0gKiBQcmludHMgaW1wb3J0cyBuZWVkZWQgZm9yIGEgZ2l2ZW4gdHlwZQotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgYSBnaXZlbiB0X3N0cnVjdAotICovCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcmIGltcG9ydHMpIHsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIC8vRm9yIGVhY2ggdHlwZSBjaGVjayBpZiBpdCBpcyBmcm9tIGEgZGlmZmVybmV0IG5hbWVzcGFjZQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfcHJvZ3JhbSgpOwotICAgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJhczMiKTsKLSAgICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7Ci0gICAgICAgIGlmIChpbXBvcnRzLmZpbmQocGFja2FnZSArICIuIiArICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkgPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAgICAgaW1wb3J0cy5hcHBlbmQoImltcG9ydCAiICsgcGFja2FnZSArICIuIiArICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSArICI7XG4iKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gaW1wb3J0czsgIAotfQotCi0KLS8qKgotICogUHJpbnRzIGltcG9ydHMgbmVlZGVkIGZvciBhIGdpdmVuIHR5cGUKLSAqCi0gKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGEgZ2l2ZW4gdF9zZXJ2aWNlCi0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM190aHJpZnRfZ2VuX2ltcG9ydHModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgaW1wb3J0czsKLSAgY29uc3QgdmVjdG9yPHRfZnVuY3Rpb24qPiYgZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vRm9yIGVhY2ggdHlwZSBjaGVjayBpZiBpdCBpcyBmcm9tIGEgZGlmZmVybmV0IG5hbWVzcGFjZQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X3Byb2dyYW0oKTsKLSAgICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiYXMzIik7Ci0gICAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgewotICAgICAgICBpZiAoaW1wb3J0cy5maW5kKHBhY2thZ2UgKyAiLiIgKyAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkpID09IHN0cmluZzo6bnBvcykgewotICAgICAgICAgIGltcG9ydHMuYXBwZW5kKCJpbXBvcnQgIiArIHBhY2thZ2UgKyAiLiIgKyAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkgKyAiO1xuIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKCgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSwgaW1wb3J0cyk7CSAgICAKLSAgICBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKCgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLCBpbXBvcnRzKTsJICAgIAotCi0gIH0KLSAKLSAgcmV0dXJuIGltcG9ydHM7Ci0KLX0KLQotLyoqCi0gKiBOb3RoaW5nIGluIEFzMwotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkge30KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIEFzMywgc2luY2UgaXQgZG9lcwotICogbm90IHN1cHBvcnQgYXJiaXRyYXJ5IG5hbWUgcmVwbGFjZW1lbnRzLCBhbmQgaXQnZCBiZSBhIHdhY2t5IHdhc3RlCi0gKiBvZiBvdmVyaGVhZCB0byBtYWtlIHdyYXBwZXIgY2xhc3Nlcy4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gICh2b2lkKSB0dHlwZWRlZjsKLX0KLQotLyoqCi0gKiBFbnVtcyBhcmUgYSBjbGFzcyB3aXRoIGEgc2V0IG9mIHN0YXRpYyBjb25zdGFudHMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfZW51bV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIisodGVudW0tPmdldF9uYW1lKCkpKyIuYXMiOwotICBvZnN0cmVhbSBmX2VudW07Ci0gIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lLmNfc3RyKCkpOwotCi0gIC8vIENvbW1lbnQgYW5kIHBhY2thZ2UgaXQKLSAgZl9lbnVtIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBhczNfcGFja2FnZSgpIDw8IGVuZGw7Ci0gIAotICBzY29wZV91cChmX2VudW0pOwotICAvLyBBZGQgYXMzIGltcG9ydHMKLSAgZl9lbnVtIDw8IHN0cmluZygpICsKLSAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5TZXQ7IiA8PCBlbmRsIDw8Ci0gICJpbXBvcnQgZmxhc2gudXRpbHMuRGljdGlvbmFyeTsiIDw8IGVuZGw7Ci0gIAotICBpbmRlbnQoZl9lbnVtKSA8PAotICAgICJwdWJsaWMgY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiICI7Ci0gIHNjb3BlX3VwKGZfZW51bSk7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgaW5kZW50KGZfZW51bSkgPDwKLSAgICAgICJwdWJsaWMgc3RhdGljIGNvbnN0ICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAiOmludCA9ICIgPDwgdmFsdWUgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgCi0gIC8vIENyZWF0ZSBhIHN0YXRpYyBTZXQgd2l0aCBhbGwgdmFsaWQgdmFsdWVzIGZvciB0aGlzIGVudW0KLSAgZl9lbnVtIDw8IGVuZGw7Ci0gIAotICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyBjb25zdCBWQUxJRF9WQUxVRVM6U2V0ID0gbmV3IFNldCgiOwotICBpbmRlbnRfdXAoKTsKLSAgYm9vbCBmaXJzdFZhbHVlID0gdHJ1ZTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAvLyBwb3B1bGF0ZSBzZXQKLSAgICBmX2VudW0gPDwgKGZpcnN0VmFsdWUgPyAiIiA6ICIsICIpIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBmaXJzdFZhbHVlID0gZmFsc2U7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9lbnVtIDw8ICIpOyIgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyBjb25zdCBWQUxVRVNfVE9fTkFNRVM6RGljdGlvbmFyeSA9IG5ldyBEaWN0aW9uYXJ5KCk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKGZfZW51bSk7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW5kZW50KGZfZW51bSkgPDwgIlZBTFVFU19UT19OQU1FU1siIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXSA9IFwiIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiOyIgPDwgZW5kbDsKLSAgfQotICBmX2VudW0gPDwgZW5kbDsKLSAgCi0gIHNjb3BlX2Rvd24oZl9lbnVtKTsKLQotICBzY29wZV9kb3duKGZfZW51bSk7IC8vIGVuZCBjbGFzcwotICAKLSAgc2NvcGVfZG93bihmX2VudW0pOyAvLyBlbmQgcGFja2FnZQotICAKLSAgZl9lbnVtLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7Ci0gIGlmIChjb25zdHMuZW1wdHkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfKyIvQ29uc3RhbnRzLmFzIjsKLSAgb2ZzdHJlYW0gZl9jb25zdHM7Ci0gIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl9jb25zdHMgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpOwotICAKLSAgc2NvcGVfdXAoZl9jb25zdHMpOwotICBmX2NvbnN0cyA8PCBlbmRsOwotICAKLSAgZl9jb25zdHMgPDwgYXMzX3R5cGVfaW1wb3J0cygpOwotCi0gCi0gIAotICBpbmRlbnQoZl9jb25zdHMpIDw8Ci0gICAgInB1YmxpYyBjbGFzcyBDb25zdGFudHMgeyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9jb25zdHMpIDw8Ci0gICAgIn0iIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24oZl9jb25zdHMpOwotICBmX2NvbnN0cy5jbG9zZSgpOwotfQotCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBpbl9zdGF0aWMsIGJvb2wgZGVmdmFsKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICAKLSAgaW5kZW50KG91dCk7Ci0gIGlmICghZGVmdmFsKSB7Ci0gICAgb3V0IDw8Ci0gICAgKGluX3N0YXRpYyA/ICJ2YXIgIiA6ICJwdWJsaWMgc3RhdGljIGNvbnN0ICIpOwotICB9Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKLSAgICBvdXQgPDwgbmFtZTsKLSAgICBpZiAoIWRlZnZhbCkgewotICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7Ci0gICAgfQotICAgIG91dCA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIG91dCA8PCBuYW1lOwotICAgIGlmKCFkZWZ2YWwpIHsKLSAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOwotICAgIH0KLSAgICBvdXQgPDwgIiA9ICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpOnZvaWQgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iOwotICAgICAgb3V0IDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8IG5hbWU7Ci0gICAgaWYoIWRlZnZhbCl7Ci0gICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKLSAgICB9Ci0gICAgb3V0IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IGZ1bmN0aW9uKCk6dm9pZCB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSgpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8IG5hbWU7Ci0gICAgaWYoIWRlZnZhbCkgewotICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7Ci0gICAgfQotICAgIG91dCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpOnZvaWQgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiIgPDwgKHR5cGUtPmlzX2xpc3QoKSA/ICJwdXNoIiA6ICJhZGQiKSA8PCAiKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSgpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci19Ci0KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvZnN0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICAodm9pZCkgbmFtZTsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7Ci0gIAotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgcmVuZGVyIDw8ICIoYnl0ZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICByZW5kZXIgPDwgIihzaG9ydCkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiTCI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgICAgICByZW5kZXIgPDwgIihkb3VibGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOwotICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUpOwotICAgIHJlbmRlciA8PCB0OwotICB9Ci0gIAotICByZXR1cm4gcmVuZGVyLnN0cigpOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBhIGNsYXNzCi0gKiB3aXRoIGRhdGEgbWVtYmVycywgcmVhZCgpLCB3cml0ZSgpLCBhbmQgYW4gaW5uZXIgSXNzZXQgY2xhc3MuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfYXMzX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9hczNfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLQotLyoqCi0gKiBBczMgc3RydWN0IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gcGFja2FnZV9kaXJfKyIvIisodHN0cnVjdC0+Z2V0X25hbWUoKSkrIi5hcyI7Ci0gIG9mc3RyZWFtIGZfc3RydWN0OwotICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zdHJ1Y3QgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICBhczNfcGFja2FnZSgpOwotICAKLSAgc2NvcGVfdXAoZl9zdHJ1Y3QpOwotICBmX3N0cnVjdCA8PCBlbmRsOwotICAKLSAgc3RyaW5nIGltcG9ydHM7Ci0KLSAgZl9zdHJ1Y3QgPDwKLSAgICBhczNfdHlwZV9pbXBvcnRzKCkgPDwKLSAgICBhczNfdGhyaWZ0X2ltcG9ydHMoKSA8PCAKLSAgICBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzdHJ1Y3QsIGltcG9ydHMpIDw8IGVuZGw7Ci0gIAotICBpZiAoYmluZGFibGVfICYmICEgaXNfZXhjZXB0aW9uKSB7Ci0gICAgZl9zdHJ1Y3QgPDwgImltcG9ydCBmbGFzaC5ldmVudHMuRXZlbnQ7IiA8PCBlbmRsIDw8Ci0gICAgImltcG9ydCBmbGFzaC5ldmVudHMuRXZlbnREaXNwYXRjaGVyOyIgPDwgZW5kbCA8PAotICAgICJpbXBvcnQgbXguZXZlbnRzLlByb3BlcnR5Q2hhbmdlRXZlbnQ7IiA8PCBlbmRsOwotICB9Ci0gIAotICBnZW5lcmF0ZV9hczNfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leGNlcHRpb24pOwotICAKLSAgc2NvcGVfZG93bihmX3N0cnVjdCk7IC8vIGVuZCBvZiBwYWNrYWdlCi0gIGZfc3RydWN0LmNsb3NlKCk7Ci19Ci0KLS8qKgotICogQXMzIHN0cnVjdCBkZWZpbml0aW9uLiBUaGlzIGhhcyB2YXJpb3VzIHBhcmFtZXRlcnMsIGFzIGl0IGNvdWxkIGJlCi0gKiBnZW5lcmF0ZWQgc3RhbmRhbG9uZSBvciBpbnNpZGUgYW5vdGhlciBjbGFzcyBhcyBhIGhlbHBlci4gSWYgaXQKLSAqIGlzIGEgaGVscGVyIHRoYW4gaXQgaXMgYSBzdGF0aWMgY2xhc3MuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/Ci0gKiBAcGFyYW0gaW5fY2xhc3MgICAgIElmIGluc2lkZSBhIGNsYXNzLCBuZWVkcyB0byBiZSBzdGF0aWMgY2xhc3MKLSAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLSAgZ2VuZXJhdGVfYXMzX2RvYyhvdXQsIHRzdHJ1Y3QpOwotCi0gIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKLSAgYm9vbCBiaW5kYWJsZSA9ICEgaXNfZXhjZXB0aW9uICYmICEgaW5fY2xhc3MgJiYgYmluZGFibGVfOwotCi0gIGluZGVudChvdXQpIDw8IChpbl9jbGFzcyA/ICIiIDogInB1YmxpYyAiKSA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PAotICAgICAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgIjsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICJleHRlbmRzIEVycm9yICI7Ci0gIH0KLSAgZWxzZSBpZiAoYmluZGFibGUpIHsKLSAgICBvdXQgPDwgImV4dGVuZHMgRXZlbnREaXNwYXRjaGVyICI7Ci0gIH0KLSAgb3V0IDw8ICJpbXBsZW1lbnRzIFRCYXNlICI7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJwcml2YXRlIHN0YXRpYyBjb25zdCBTVFJVQ1RfREVTQzpUU3RydWN0ID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7Ci0KLSAgLy8gTWVtYmVycyBhcmUgcHVibGljIGZvciAtYXMzLCBwcml2YXRlIGZvciAtYXMzYmVhbgotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInByaXZhdGUgc3RhdGljIGNvbnN0ICIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8Ci0gICAgICAiX0ZJRUxEX0RFU0M6VEZpZWxkID0gbmV3IFRGaWVsZChcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGdlbmVyYXRlX2FzM19kb2Mob3V0LCAqbV9pdGVyKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSB2YXIgXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpICsgIjoiICsgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBjb25zdCAiIDw8IHVwY2FzZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOmludCA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgCi0gIG91dCA8PCBlbmRsOwotICAKLSAgLy8gSW5uZXIgSXNzZXQgY2xhc3MKLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpewotICAgICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgICAicHJpdmF0ZSB2YXIgX19pc3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOkJvb2xlYW4gPSBmYWxzZTsiIDw8ICBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gIH0KLSAgCi0gIG91dCA8PCBlbmRsOwotICAKLSAgZ2VuZXJhdGVfYXMzX21ldGFfZGF0YV9tYXAob3V0LCB0c3RydWN0KTsKLSAgCi0gIC8vIFN0YXRpYyBpbml0aWFsaXplciB0byBwb3B1bGF0ZSBnbG9iYWwgY2xhc3MgdG8gc3RydWN0IG1ldGFkYXRhIG1hcAotICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJGaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIsIG1ldGFEYXRhTWFwKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgotICBpbmRlbnQob3V0KSA8PAotICAicHVibGljIGZ1bmN0aW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKS0+Z2V0X2ludGVnZXIoKSA8PCAiOyIgPDwKLSAgICAgIGVuZGw7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIAotICBnZW5lcmF0ZV9hczNfYmVhbl9ib2lsZXJwbGF0ZShvdXQsIHRzdHJ1Y3QsIGJpbmRhYmxlKTsKLSAgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9hczNfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBpZiAoaXNfcmVzdWx0KSB7Ci0gICAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2VuZXJhdGVfYXMzX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfQotICBnZW5lcmF0ZV9hczNfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCwgYmluZGFibGUpOwotICBnZW5lcmF0ZV9hczNfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gcmVhZChpcHJvdDpUUHJvdG9jb2wpOnZvaWQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcyBhbmQgcmVhZCBzdHJ1Y3QgaGVhZGVyCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ2YXIgZmllbGQ6VEZpZWxkOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gICAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhawotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RPUCkgeyAiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJicmVhazsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIn0iIDw8IGVuZGw7Ci0KLSAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAic3dpdGNoIChmaWVsZC5pZCkiIDw8IGVuZGw7Ci0KLSAgICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgImlmIChmaWVsZC50eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKLSAgICAgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgKmZfaXRlcik7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGw7Ci0KLSAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaXByb3QucmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbCA8PCBlbmRsOwotICAgIAotICAgIC8vIGluIG5vbi1iZWFucyBzdHlsZSwgY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZQotICAgIC8vICh3aGljaCBjYW4gYmUgY2hlY2tlZCBoZXJlIGJ1dCBub3QgaW4gdGhlIGdlbmVyYWwgdmFsaWRhdGUgbWV0aG9kKQotICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlLCB3aGljaCBjYW4ndCBiZSBjaGVja2VkIGluIHRoZSB2YWxpZGF0ZSBtZXRob2QiIDw8IGVuZGw7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEICYmICF0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICghX19pc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yLlVOS05PV04sIFwiUmVxdWlyZWQgZmllbGQgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIHdhcyBub3QgZm91bmQgaW4gc2VyaWFsaXplZCBkYXRhISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCi0gICAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLy8gZ2VuZXJhdGVzIGFzMyBtZXRob2QgdG8gcGVyZm9ybSB2YXJpb3VzIGNoZWNrcwotLy8gKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpewotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHZhbGlkYXRlKCk6dm9pZCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsgIAotICAKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3IuVU5LTk9XTiwgXCJSZXF1aXJlZCBmaWVsZCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgd2FzIG5vdCBwcmVzZW50ISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIvLyBhbGFzLCB3ZSBjYW5ub3QgY2hlY2sgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIGJlY2F1c2UgaXQncyBhIHByaW1pdGl2ZSBhbmQgeW91IGNob3NlIHRoZSBub24tYmVhbnMgZ2VuZXJhdG9yLiIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIC8vIGNoZWNrIHRoYXQgZmllbGRzIG9mIHR5cGUgZW51bSBoYXZlIHZhbGlkIHZhbHVlcwotICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIHRoYXQgZmllbGRzIG9mIHR5cGUgZW51bSBoYXZlIHZhbGlkIHZhbHVlcyIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKLSAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgICAvLyBpZiBmaWVsZCBpcyBhbiBlbnVtLCBjaGVjayB0aGF0IGl0cyB2YWx1ZSBpcyB2YWxpZAotICAgIGlmICh0eXBlLT5pc19lbnVtKCkpewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiICYmICEiIDw8IGdldF9lbnVtX2NsYXNzX25hbWUodHlwZSkgPDwgIi5WQUxJRF9WQUxVRVMuY29udGFpbnMoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKSl7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yLlVOS05PV04sIFwiVGhlIGZpZWxkICciIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICInIGhhcyBiZWVuIGFzc2lnbmVkIHRoZSBpbnZhbGlkIHZhbHVlIFwiICsgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSAKLSAgfSAgCi0gIAotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIHdyaXRlKG9wcm90OlRQcm90b2NvbCk6dm9pZCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCi0gIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QsCi0gKiB3aGljaCBpcyBhIGZ1bmN0aW9uIHJlc3VsdC4gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4KLSAqIGlmIHRoZXkgYXJlIHNldCBpbiB0aGUgSXNzZXQgYXJyYXksIGFuZCBvbmx5IG9uZSBvZiB0aGVtCi0gKiBjYW4gYmUgc2V0IGF0IGEgdGltZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUob3Byb3Q6VFByb3RvY29sKTp2b2lkIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIG91dCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgIiBlbHNlIGlmICI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIodGhpcy4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICAKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICB9Ci0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgZmllbGRfbmFtZSwgc3RyaW5nIGNhcF9uYW1lKSB7Ci0gICh2b2lkKSB0eXBlOwotICAodm9pZCkgY2FwX25hbWU7Ci0gIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0cmluZyBmaWVsZF9uYW1lLCBzdHJpbmcgY2FwX25hbWUpIHsKLSAgKHZvaWQpIHR5cGU7Ci0gICh2b2lkKSBjYXBfbmFtZTsKLSAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZSA9PSBudWxsKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB1bnNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IHZhbHVlOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotCi0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBnZXR0ZXJfc3RyZWFtOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gc2V0dGVyX3N0cmVhbTsKLQotICAvLyBidWlsZCB1cCB0aGUgYm9kaWVzIG9mIGJvdGggdGhlIGdldHRlciBhbmQgc2V0dGVyIGF0IG9uY2UKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOwotICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhnZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0KLSAgLy8gY3JlYXRlIHRoZSBzZXR0ZXIKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBzZXRGaWVsZFZhbHVlKGZpZWxkSUQ6aW50LCB2YWx1ZToqKTp2b2lkIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7Ci0KLSAgb3V0IDw8IHNldHRlcl9zdHJlYW0uc3RyKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIGNyZWF0ZSB0aGUgZ2V0dGVyCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0RmllbGRWYWx1ZShmaWVsZElEOmludCk6KiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSB7IiA8PCBlbmRsOwotCi0gIG91dCA8PCBnZXR0ZXJfc3RyZWFtLnN0cigpOwotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vLyBDcmVhdGVzIGEgZ2VuZXJpYyBpc1NldCBtZXRob2QgdGhhdCB0YWtlcyB0aGUgZmllbGQgbnVtYmVyIGFzIGFyZ3VtZW50Ci12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCl7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBjcmVhdGUgdGhlIGlzU2V0IG1ldGhvZAotICBpbmRlbnQob3V0KSA8PCAiLy8gUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gaXNTZXQoZmllbGRJRDppbnQpOkJvb2xlYW4geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2V0IG9mIEFzMyBCZWFuIGJvaWxlcnBsYXRlIGZ1bmN0aW9ucyAoc2V0dGVycywgZ2V0dGVycywgZXRjLikKLSAqIGZvciB0aGUgZ2l2ZW4gc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX2JlYW5fYm9pbGVycGxhdGUob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGJpbmRhYmxlKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOwotICAgICAgICAKLSAgICAvLyBTaW1wbGUgZ2V0dGVyCi0gICAgZ2VuZXJhdGVfYXMzX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGdldCAiIDw8IGZpZWxkX25hbWUgPDwgIigpOiIgPDwKLSAgICAgIHR5cGVfbmFtZSh0eXBlKSA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLl8iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIAotICAgIC8vIFNpbXBsZSBzZXR0ZXIKLSAgICBnZW5lcmF0ZV9hczNfZG9jKG91dCwgZmllbGQpOwotICAgIHN0ZDo6c3RyaW5nIHByb3BOYW1lID0gdG1wKCJ0aHJpZnRQcm9wZXJ0eUNoYW5nZSIpOwotICAgIGlmIChiaW5kYWJsZSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIltCaW5kYWJsZShldmVudD1cIiIgPDwgcHJvcE5hbWUgPDwgIlwiKV0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gc2V0ICIgPDwgZmllbGRfbmFtZSA8PCAiKCIgPDwgZmllbGRfbmFtZQotICAgICAgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKTp2b2lkIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInRoaXMuXyIgPDwgZmllbGRfbmFtZSA8PCAiID0gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PAotICAgIGVuZGw7Ci0gICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgZmllbGQpOwotICAgIAotICAgIGlmIChiaW5kYWJsZSkgewotICAgICAgLy8gV2UgaGF2ZSB0byB1c2UgYSBjdXN0b20gZXZlbnQgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQsIGJlY2F1c2UgaWYgeW91IHVzZSB0aGUgZGVmYXVsdCwKLSAgICAgIC8vIHRoZSBzZXR0ZXIgb25seSBnZXRzIGNhbGxlZCBpZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQgLSB0aGlzIG1lYW5zIGNhbGxpbmcgZm9vLnNldEludFZhbHVlKDApCi0gICAgICAvLyB3aWxsIG5vdCBjYXVzZSBmb28uaXNJbnRWYWx1ZVNldCgpIHRvIHJldHVybiB0cnVlIHNpbmNlIHRoZSB2YWx1ZSBvZiBmb28uX2ludFZhbHVlIHdhc24ndCBjaGFuZ2VkCi0gICAgICAvLyBzbyB0aGUgc2V0dGVyIHdhcyBuZXZlciBjYWxsZWQuCi0gICAgICBpbmRlbnQob3V0KSA8PCAiZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCIiIDw8IHByb3BOYW1lIDw8ICJcIikpOyIgPDwgZW5kbDsKLSAgICAgIAotICAgICAgLy8gSG93ZXZlciwgaWYgeW91IGp1c3QgdXNlIGEgY3VzdG9tIGV2ZW50LCB0aGVuIGNvbGxlY3Rpb25zIHdvbid0IGJlIGFibGUgdG8gZGV0ZWN0IHdoZW4gZWxlbWVudHMKLSAgICAgIC8vIGluIHRoZSBjb2xsZWN0aW9ucyBoYXZlIGNoYW5nZWQgc2luY2UgdGhleSBsaXN0ZWQgZm9yIFByb3BlcnR5Q2hhbmdlRXZlbnRzLiAgU28sIHdlIGRpc3BhdGNoIGJvdGguCi0gICAgICBpbmRlbnQob3V0KSA8PCAiZGlzcGF0Y2hFdmVudChuZXcgUHJvcGVydHlDaGFuZ2VFdmVudChQcm9wZXJ0eUNoYW5nZUV2ZW50LlBST1BFUlRZX0NIQU5HRSkpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIAotICAgIC8vIFVuc2V0dGVyCi0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB1bnNldCIgPDwgY2FwX25hbWUgPDwgIigpOnZvaWQgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIAotICAgIC8vIGlzU2V0IG1ldGhvZAotICAgIGluZGVudChvdXQpIDw8ICIvLyBSZXR1cm5zIHRydWUgaWYgZmllbGQgIiA8PCBmaWVsZF9uYW1lIDw8ICIgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gaXMiIDw8IGdldF9jYXBfbmFtZSgic2V0IikgPDwgY2FwX25hbWUgPDwgIigpOkJvb2xlYW4geyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiICE9IG51bGw7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRvU3RyaW5nKCkgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X3Rvc3RyaW5nKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGJpbmRhYmxlKSB7Ci0gIC8vIElmIGl0J3MgYmluZGFibGUsIGl0IGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHNvIHRvU3RyaW5nIGlzIGFuIG92ZXJyaWRlLgotICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8IChiaW5kYWJsZSA/ICJvdmVycmlkZSAiIDogIiIpIDw8ICJmdW5jdGlvbiB0b1N0cmluZygpOlN0cmluZyB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAidmFyIHJldDpTdHJpbmcgPSBuZXcgU3RyaW5nKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmlyc3Q6Qm9vbGVhbiA9IHRydWU7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICBpZihjb3VsZF9iZV91bnNldCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKLQotICAgIGlmICghZmlyc3QpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIWZpcnN0KSByZXQgKz0gIFwiLCBcIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiOyIgPDwgZW5kbDsKLSAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwibnVsbFwiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICAKLSAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKShmaWVsZC0+Z2V0X3R5cGUoKSkpLT5pc19iaW5hcnkoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwiQklOQVJZXCI7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZihmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lOlN0cmluZyA9ICIgPDwgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIi5WQUxVRVNfVE9fTkFNRVNbdGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXTsiPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWUgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCIgKFwiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgInJldCArPSB0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCIpXCI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gdGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJmaXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKLQotICAgIGlmKGNvdWxkX2JlX3Vuc2V0KSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGZpcnN0ID0gZmFsc2U7Ci0gIH0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInJldCArPSBcIilcIjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIHJldDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0YXRpYyBtYXAgd2l0aCBtZXRhIGRhdGEgdG8gc3RvcmUgaW5mb3JtYXRpb24gc3VjaCBhcyBmaWVsZElEIHRvCi0gKiBmaWVsZE5hbWUgbWFwcGluZwotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX21ldGFfZGF0YV9tYXAob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBTdGF0aWMgTWFwIHdpdGggZmllbGRJRCAtPiBGaWVsZE1ldGFEYXRhIG1hcHBpbmdzCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIGNvbnN0IG1ldGFEYXRhTWFwOkRpY3Rpb25hcnkgPSBuZXcgRGljdGlvbmFyeSgpOyIgPDwgZW5kbDsKLQotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICAvLyBQb3B1bGF0ZSBtYXAKLSAgICBzY29wZV91cChvdXQpOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibWV0YURhdGFNYXBbIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICJdID0gbmV3IEZpZWxkTWV0YURhdGEoXCIiIDw8IGZpZWxkX25hbWUgPDwgIlwiLCAiOwotCi0gICAgICAvLyBTZXQgZmllbGQgcmVxdWlyZW1lbnQgdHlwZSAocmVxdWlyZWQsIG9wdGlvbmFsLCBldGMuKQotICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5SRVFVSVJFRCwgIjsKLSAgICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgIjsKLSAgICAgIH0KLQotICAgICAgLy8gQ3JlYXRlIHZhbHVlIG1ldGEgZGF0YSAgICAKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICAgIG91dCAgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLX0KLQotLyoqIAotICogUmV0dXJucyBhIHN0cmluZyB3aXRoIHRoZSBhczMgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRocmlmdCB0eXBlCi0gKiAoZS5nLiBmb3IgdGhlIHR5cGUgc3RydWN0IGl0IHJldHVybnMgIlRUeXBlLlNUUlVDVCIpCi0gKi8KLXN0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2FzM190eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpIHsKLSAgaWYgKHR5cGUtPmlzX2xpc3QoKSl7Ci0gICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGUuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGUuU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICByZXR1cm4gZ2V0X2FzM190eXBlX3N0cmluZygoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEICAgOiByZXR1cm4gICAgICAiVFR5cGUuVk9JRCI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcgOiByZXR1cm4gICAgIlRUeXBlLlNUUklORyI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MICAgOiByZXR1cm4gICAgICAiVFR5cGUuQk9PTCI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFICAgOiByZXR1cm4gICAgICAiVFR5cGUuQllURSI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTYgICAgOiByZXR1cm4gICAgICAgIlRUeXBlLkkxNiI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzIgICAgOiByZXR1cm4gICAgICAgIlRUeXBlLkkzMiI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQgICAgOiByZXR1cm4gICAgICAgIlRUeXBlLkk2NCI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUgOiByZXR1cm4gICAgIlRUeXBlLkRPVUJMRSI7IGJyZWFrOwotICAgICAgZGVmYXVsdCA6IHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIlwiIHBhc3NlZCB0byB0X2FzM19nZW5lcmF0b3I6OmdldF9hczNfdHlwZV9zdHJpbmchIik7IGJyZWFrOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCi0gICAgfQotICB9IGVsc2UgewotICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIlwiIHBhc3NlZCB0byB0X2FzM19nZW5lcmF0b3I6OmdldF9hczNfdHlwZV9zdHJpbmchIik7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKLSAgfQotfQotCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKXsKLSAgb3V0IDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKXsKLSAgICBpbmRlbnQob3V0KSA8PCAibmV3IFN0cnVjdE1ldGFEYXRhKFRUeXBlLlNUUlVDVCwgIiA8PCB0eXBlX25hbWUodHlwZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpewotICAgIGlmICh0eXBlLT5pc19saXN0KCkpewotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBMaXN0TWV0YURhdGEoVFR5cGUuTElTVCwgIjsKLSAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7ICAgIAotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsgICAKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKXsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgU2V0TWV0YURhdGEoVFR5cGUuU0VULCAiOwotICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsgICAgCi0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOyAKLSAgICB9IGVsc2V7IC8vIG1hcAotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBNYXBNZXRhRGF0YShUVHlwZS5NQVAsICI7Ci0gICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGtleV90eXBlKTsKLSAgICAgIG91dCA8PCAiLCAiOwotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgdmFsX3R5cGUpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAibmV3IEZpZWxkVmFsdWVNZXRhRGF0YSgiIDw8IGdldF9hczNfdHlwZV9zdHJpbmcodHlwZSk7Ci0gIH0KLSAgb3V0IDw8ICIpIjsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLiBJbiBDKyssIHRoaXMgY29tcHJpc2VzIGFuIGVudGlyZWx5IHNlcGFyYXRlCi0gKiBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlLiBUaGUgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgbWV0aG9kcyBhbmQgaW5jbHVkZXMKLSAqIHRoZSBkYXRhIHR5cGVzIGRlZmluZWQgaW4gdGhlIG1haW4gaGVhZGVyIGZpbGUsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24KLSAqIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBiYXNpYyBwcmludGVyIGFuZCBkZWZhdWx0IGludGVyZmFjZXMuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBNYWtlIGludGVyZmFjZSBmaWxlCi0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrc2VydmljZV9uYW1lXysiLmFzIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpOwotICAKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIAotICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwKLSAgICBhczNfdHlwZV9pbXBvcnRzKCkgPDwKLSAgICBhczNfdGhyaWZ0X2ltcG9ydHMoKSA8PAotICAgIGFzM190aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8uY2xvc2UoKTsKLSAgCi0gIC8vIE5vdyBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbi9jbGllbnQgZmlsZQotICBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrc2VydmljZV9uYW1lXysiSW1wbC5hcyI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLSAgCi0gIGZfc2VydmljZV8gPDwKLSAgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKLSAgCi0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8Ci0gIGFzM190eXBlX2ltcG9ydHMoKSA8PAotICBhczNfdGhyaWZ0X2ltcG9ydHMoKSA8PAotICBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKSA8PCBlbmRsOwotICAKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAKLSAgZl9zZXJ2aWNlXyA8PCBhczNfdHlwZV9pbXBvcnRzKCk7Ci0gIGZfc2VydmljZV8gPDwgYXMzX3RocmlmdF9pbXBvcnRzKCk7Ci0gIGZfc2VydmljZV8gPDwgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSk7Ci0gIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi4qOyIgPDwgZW5kbDsKLSAgCi0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gIAotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci0gIAotICAvLyBOb3cgbWFrZSB0aGUgcHJvY2Vzc29yL3NlcnZlciBmaWxlCi0gIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIitzZXJ2aWNlX25hbWVfKyJQcm9jZXNzb3IuYXMiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0gIAotICBmX3NlcnZpY2VfIDw8Ci0gIGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7Ci0gIAotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgCi0gIGZfc2VydmljZV8gPDwgZW5kbCA8PAotICBhczNfdHlwZV9pbXBvcnRzKCkgPDwKLSAgYXMzX3RocmlmdF9pbXBvcnRzKCkgPDwKLSAgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSkgPDwgZW5kbDsKLSAgCi0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgCi0gIGZfc2VydmljZV8gPDwgYXMzX3R5cGVfaW1wb3J0cygpOwotICBmX3NlcnZpY2VfIDw8IGFzM190aHJpZnRfaW1wb3J0cygpOwotICBmX3NlcnZpY2VfIDw8IGFzM190aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpIDw8ZW5kbDsKLSAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLio7IiA8PCBlbmRsOwotICAKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLSAgICAKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHM7Ci0gIH0KLQotICBnZW5lcmF0ZV9hczNfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgZXh0ZW5kc19pZmFjZSA8PAotICAgICIgeyIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfYXMzX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25FcnJvcihFcnJvcik6dm9pZDsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvblN1Y2Nlc3MoKTp2b2lkOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25FcnJvcihFcnJvcik6dm9pZDsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvblN1Y2Nlc3MoIiA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiKTp2b2lkOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwKLSAgICAgIGVuZGwgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgYXJncyBhbmQgcmV0dXJuIHR5cGVzCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiSW1wbCI7Ci0gIH0KLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSW1wbCIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIiBpbXBsZW1lbnRzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJbXBsIiA8PCAiKGlwcm90OlRQcm90b2NvbCwgb3Byb3Q6VFByb3RvY29sPW51bGwpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJpcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKG9wcm90ID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfID0gaXByb3Q7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfID0gb3Byb3Q7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInN1cGVyKGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOwotICB9Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCB2YXIgaXByb3RfOlRQcm90b2NvbDsiICA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIHZhciBvcHJvdF86VFByb3RvY29sOyIgIDw8IGVuZGwgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgdmFyIHNlcWlkXzppbnQ7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljIGZ1bmN0aW9uIGdldElucHV0UHJvdG9jb2woKTpUUHJvdG9jb2wiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicmV0dXJuIHRoaXMuaXByb3RfOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyBmdW5jdGlvbiBnZXRPdXRwdXRQcm90b2NvbCgpOlRQcm90b2NvbCIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJyZXR1cm4gdGhpcy5vcHJvdF87IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIH0KLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25FcnJvcihFcnJvcik6dm9pZDsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvblN1Y2Nlc3MoKTp2b2lkOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25FcnJvcihFcnJvcik6dm9pZDsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvblN1Y2Nlc3MoIiA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiKTp2b2lkOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLQotICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgCi0gICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCBUTWVzc2FnZVR5cGUuQ0FMTCwgc2VxaWRfKSk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidmFyIGFyZ3M6IiA8PCBhcmdzbmFtZSA8PCAiID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUob3Byb3RfKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLSAgICAKLSAgICBpZiAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5nZXRUcmFuc3BvcnQoKS5mbHVzaChmdW5jdGlvbihlcnJvcjpFcnJvcik6dm9pZCB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoZXJyb3IgIT0gbnVsbCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKGVycm9yKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidmFyIG1zZzpUTWVzc2FnZSA9IGlwcm90Xy5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB2YXIgeDpUQXBwbGljYXRpb25FcnJvciA9IFRBcHBsaWNhdGlvbkVycm9yLnJlYWQoaXByb3RfKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoeCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZhciByZXN1bHQgOiIgPDwgcmVzdWx0bmFtZSA8PCAiID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQucmVhZChpcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgKG9uU3VjY2VzcyAhPSBudWxsKSBvblN1Y2Nlc3MocmVzdWx0LnN1Y2Nlc3MpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIGlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAob25TdWNjZXNzICE9IG51bGwpIG9uU3VjY2VzcygpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgCi0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihuZXcgVEFwcGxpY2F0aW9uRXJyb3IoVEFwcGxpY2F0aW9uRXJyb3IuTUlTU0lOR19SRVNVTFQsIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoZTpURXJyb3IpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihlKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAKLSAgICAgIAotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgIn0pOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJ9IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRXh0ZW5kcyBzdHVmZgotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICJQcm9jZXNzb3IiOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICIgaW1wbGVtZW50cyBUUHJvY2Vzc29yIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IoaWZhY2U6IiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic3VwZXIoaWZhY2UpOyIgPDwgZW5kbDsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmYWNlXyA9IGlmYWNlOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJQUk9DRVNTX01BUFtcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl0gPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicHJpdmF0ZSB2YXIgaWZhY2VfOiIgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIjsiIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgY29uc3QgUFJPQ0VTU19NQVA6RGljdGlvbmFyeSA9IG5ldyBEaWN0aW9uYXJ5KCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLSAgc3RyaW5nIG92ZXJyaWRlID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgICBvdmVycmlkZSA9ICJvdmVycmlkZSAiOwotICB9Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCBvdmVycmlkZSA8PCAicHVibGljIGZ1bmN0aW9uIHByb2Nlc3MoaXByb3Q6VFByb3RvY29sLCBvcHJvdDpUUHJvdG9jb2wpOkJvb2xlYW4iIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwKLSAgaW5kZW50KCkgPDwgInZhciBtc2c6VE1lc3NhZ2UgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZSwgd2FzIHRoZSBzZXFpZCBldGMuIGxlZ2l0PwotICAvLyBBUy0gSWYgYWxsIG1ldGhvZCBpcyBvbmV3YXk6Ci0gIC8vIGRvIHlvdSBoYXZlIGFuIG9wcm90PwotICAvLyBkbyB5b3UgeW91IG5lZWQgbnVsbGNoZWNrPwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInZhciBmbjpGdW5jdGlvbiA9IFBST0NFU1NfTUFQW21zZy5uYW1lXTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKGZuID09IG51bGwpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIFRUeXBlLlNUUlVDVCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB2YXIgeDpUQXBwbGljYXRpb25FcnJvciA9IG5ldyBUQXBwbGljYXRpb25FcnJvcihUQXBwbGljYXRpb25FcnJvci5VTktOT1dOX01FVEhPRCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIrbXNnLm5hbWUrXCInXCIpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgeC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJmbi5jYWxsKHRoaXMsbXNnLnNlcWlkLCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgfQotCi0gIGdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpIHRzZXJ2aWNlOwotICAvLyBPcGVuIGNsYXNzCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAicHJpdmF0ZSBmdW5jdGlvbiAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCk6RnVuY3Rpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gT3BlbiBmdW5jdGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicmV0dXJuIGZ1bmN0aW9uKHNlcWlkOmludCwgaXByb3Q6VFByb3RvY29sLCBvcHJvdDpUUHJvdG9jb2wpOnZvaWQiCi0gICAgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ2YXIgYXJnczoiPDwgYXJnc25hbWUgPDwgIiA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdDoiIDw8IHJlc3VsdG5hbWUgPDwgIiA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKXsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAiaWZhY2VfLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9IAotICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiLy8gc29ycnkgdGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCB5ZXQiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IEVycm9yKFwiVGhpcyBpcyBub3QgeWV0IHN1cHBvcnRlZFwiKTsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBTZXQgaXNzZXQgb24gc3VjY2VzcyBmaWVsZAotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpICYmICF0eXBlX2Nhbl9iZV9udWxsKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCJzdWNjZXNzIikgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICgiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAodGg6RXJyb3IpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInRyYWNlKFwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIHRoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ2YXIgeDpUQXBwbGljYXRpb25FcnJvciA9IG5ldyBUQXBwbGljYXRpb25FcnJvcihUQXBwbGljYXRpb25FcnJvci5JTlRFUk5BTF9FUlJPUiwgXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgICAvLyBDbG9zZSBjbGFzcwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIGZ1bmN0aW9uCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBDbG9zZSBjbGFzcwotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKiBAcGFyYW0gcHJlZml4IFRoZSB2YXJpYWJsZSBuYW1lIG9yIGNvbnRhaW5lciBmb3IgdGhpcyBmaWVsZAotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgbmFtZSA8PCAiID0gaXByb3QuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArCi0gICAgICAgICAgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIG91dCA8PCAicmVhZEJpbmFyeSgpOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCk7IjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEFzMyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7Ci0gICAgfQotICAgIG91dCA8PAotICAgICAgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBpbnZva2VzIHJlYWQoKQotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBzdHJpbmcgb2JqOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvYmogPSB0bXAoIl9tYXAiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvYmogPSB0bXAoIl9zZXQiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbGlzdCIpOwotICB9Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICI6VE1hcCA9IGlwcm90LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICI6VFNldCA9IGlwcm90LnJlYWRTZXRCZWdpbigpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG9iaiA8PCAiOlRMaXN0ID0gaXByb3QucmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpCi0gICAgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKQotICAgIC8vIHNpemUgdGhlIGNvbGxlY3Rpb24gY29ycmVjdGx5Ci0gICAgPDwgIigiCi0gICAgPDwgIik7IiA8PCBlbmRsOwotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgImZvciAodmFyICIgPDwgaSA8PCAiOmludCA9IDA7ICIgPDwKLSAgICBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLnNpemUiIDw8ICI7ICIgPDwKLSAgICAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKLSAgICB9Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwotICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIucHVzaCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93Ci0gICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQXMzIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi53cml0ZShvcHJvdCk7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgd3JpdGluZyBpdHMgc2l6ZSB0aGVuIHRoZSBlbGVtZW50cy4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgIFRoZSB0eXBlIG9mIGNvbnRhaW5lcgotICogQHBhcmFtIHByZWZpeCBTdHJpbmcgcHJlZml4IGZvciBmaWVsZHMKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9rZXkiKTsKLSAgICBzdHJpbmcgY291bnRlciA9IHRtcCgiX3NpemVDb3VudGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IGNvdW50ZXIgPDwgIjppbnQgPSAwOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yICh2YXIgIiA8PCBpdGVyIDw8ICI6KiBpbiAiIDw8IHByZWZpeCA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgY291bnRlciA8PCArIisrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlTWFwQmVnaW4obmV3IFRNYXAoIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICBjb3VudGVyIDw8ICIpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZVNldEJlZ2luKG5ldyBUU2V0KCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgcHJlZml4IDw8ICIuc2l6ZSkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgVExpc3QoIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgcHJlZml4IDw8ICIubGVuZ3RoKSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIGl0ZXIgPSB0bXAoImVsZW0iKTsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yICh2YXIgIiA8PCBpdGVyIDw8ICI6KiBpbiAiIDw8IHByZWZpeCA8PCAiKSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3IgZWFjaCAodmFyICIgPDwgaXRlciA8PCAiOiogaW4gIiA8PCBwcmVmaXggPDwgIi50b0FycmF5KCkpIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3IgZWFjaCAodmFyICIgPDwgaXRlciA8PCAiOiogaW4gIiA8PCBwcmVmaXggPDwgIikiOwotICB9Ci0KLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICAgIH0KLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCkgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIG1hcCArICJbIiArIGl0ZXIgKyAiXSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFJldHVybnMgYSBBczMgdHlwZSBuYW1lCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKiBAcGFyYW0gY29udGFpbmVyIElzIHRoZSB0eXBlIGdvaW5nIGluc2lkZSBhIGNvbnRhaW5lcj8KLSAqIEByZXR1cm4gQXMzIHR5cGUgbmFtZSwgaS5lLiBIYXNoTWFwPEtleSxWYWx1ZT4KLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY29udGFpbmVyLCBib29sIGluX2luaXQpIHsKLSAgKHZvaWQpIGluX2luaXQ7Ci0gIC8vIEluIEFzMyB0eXBlZGVmcyBhcmUganVzdCByZXNvbHZlZCB0byB0aGVpciByZWFsIHR5cGUKLSAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLSAgc3RyaW5nIHByZWZpeDsKLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUsIGluX2NvbnRhaW5lcik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiaW50IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIkRpY3Rpb25hcnkiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiU2V0IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJBcnJheSI7Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgbmFtZXNwYWNpbmcKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiYXMzIik7Ci0gICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBwYWNrYWdlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIEFTMyB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgotICoKLSAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCi0gKiBAcGFyYW0gY29udGFpbmVyIElzIGl0IGdvaW5nIGluIGEgQXMzIGNvbnRhaW5lcj8KLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIpIHsKLSAgKHZvaWQpIGluX2NvbnRhaW5lcjsKLSAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7Ci0KLSAgc3dpdGNoICh0YmFzZSkgewotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgcmV0dXJuICJ2b2lkIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICByZXR1cm4gIkJ5dGVBcnJheSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAiU3RyaW5nIjsKLSAgICB9Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICByZXR1cm4gIkJvb2xlYW4iOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICByZXR1cm4gImludCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgIHRocm93ICJpNjQgaXMgbm90IHlldCBzdXBwb3J0ZWQgaW4gYXMzIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgcmV0dXJuICJOdW1iZXIiOwotICBkZWZhdWx0OgotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQysrIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgfQotfQotCi0vKioKLSAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCkgewotICAvLyBUT0RPKG1jc2xlZSk6IGRvIHdlIGV2ZXIgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZD8KLSAgc3RyaW5nIHJlc3VsdCA9ICJ2YXIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICI6IiArIHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIG9mc3RyZWFtIGR1bW15OwotICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdCArICI7IjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRzID0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOwotICBpZiAoISB0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaWYgKGFyZ3VtZW50cyAhPSAiIikgewotICAgICAgYXJndW1lbnRzICs9ICIsICI7Ci0gICAgfQotICAgIGFyZ3VtZW50cyArPSAib25FcnJvcjpGdW5jdGlvbiwgb25TdWNjZXNzOkZ1bmN0aW9uIjsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICJmdW5jdGlvbiAiICsgCi0gICAgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgYXJndW1lbnRzICsgIik6dm9pZCI7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGNvbW1hIHNlcGFyYXRlZCBmaWVsZCBsaXN0LCB3aXRoIHR5cGUgbmFtZXMKLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIjoiICsgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGUuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGUuU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkxJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIEFwcGxpZXMgdGhlIGNvcnJlY3Qgc3R5bGUgdG8gYSBzdHJpbmcgYmFzZWQgb24gdGhlIHZhbHVlIG9mIG5vY2FtZWxfc3R5bGVfCi0gKi8KLXN0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpewotICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmNvbnN0YW50X25hbWUoc3RyaW5nIG5hbWUpIHsKLSAgc3RyaW5nIGNvbnN0YW50X25hbWU7Ci0KLSAgYm9vbCBpc19maXJzdCA9IHRydWU7Ci0gIGJvb2wgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBmYWxzZTsKLSAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIGl0ZXIgPSBuYW1lLmJlZ2luKCk7IGl0ZXIgIT0gbmFtZS5lbmQoKTsgKytpdGVyKSB7Ci0gICAgc3RyaW5nOjp2YWx1ZV90eXBlIGNoYXJhY3RlciA9ICgqaXRlcik7Ci0KLSAgICBib29sIGlzX3VwcGVyID0gaXN1cHBlcihjaGFyYWN0ZXIpOwotCi0gICAgaWYgKGlzX3VwcGVyICYmICFpc19maXJzdCAmJiAhd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIpIHsKLSAgICAgIGNvbnN0YW50X25hbWUgKz0gJ18nOwotICAgIH0KLSAgICBjb25zdGFudF9uYW1lICs9IHRvdXBwZXIoY2hhcmFjdGVyKTsKLQotICAgIGlzX2ZpcnN0ID0gZmFsc2U7Ci0gICAgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBpc191cHBlcjsKLSAgfQotCi0gIHJldHVybiBjb25zdGFudF9uYW1lOwotfQotCi0vKioKLSAqIEVtaXRzIGEgQXMzRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0Ci0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfZG9jKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jKSB7Ci0gIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAiLyoqXG4iLAotICAgICAgIiAqICIsIHRkb2MtPmdldF9kb2MoKSwKLSAgICAgICIgKi9cbiIpOwotICB9Ci19Ci0KLS8qKgotICogRW1pdHMgYSBBczNEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19kb2Mob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgewotICAgIHN0cmluZ3N0cmVhbSBzczsKLSAgICBzcyA8PCB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOwotICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKLSAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IHAtPmdldF9uYW1lKCk7Ci0gICAgICBpZiAocC0+aGFzX2RvYygpKSB7Ci0gICAgICAgIHNzIDw8ICIgIiA8PCBwLT5nZXRfZG9jKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAgICIvKipcbiIsCi0gICAgICAiICogIiwgc3Muc3RyKCksCi0gICAgICAiICovXG4iKTsKLSAgfQotfQotCi1zdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKSB7Ci0gIHJldHVybiBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZC0+Z2V0X25hbWUoKSk7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgewotICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOwotfQotCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfc2V0KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7Ci0gIGlmICghdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0XyIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOwotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpIHsKLSAgc3RyaW5nIHBhY2thZ2UgPSAiIjsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImFzMyIpICsgIi4iOwotICB9Ci0gIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihhczMsICJBUzMiLAotIiAgICBiaW5kYWJsZTogICAgICAgICAgQWRkIFtiaW5kYWJsZV0gbWV0YWRhdGEgdG8gYWxsIHRoZSBzdHJ1Y3QgY2xhc3Nlcy5cbiIKLSkKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NfZ2xpYl9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY19nbGliX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmYzcwMi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY19nbGliX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDI4MzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgotICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKLSAqIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotc3RyaW5nIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzdHJpbmcgbmFtZSk7Ci1zdHJpbmcgdG9fdXBwZXJfY2FzZShzdHJpbmcgbmFtZSk7Ci1zdHJpbmcgdG9fbG93ZXJfY2FzZShzdHJpbmcgbmFtZSk7Ci0KLS8qKgotICogQyBjb2RlIGdlbmVyYXRvciwgdXNpbmcgZ2xpYiBmb3IgQyB0eXBpbmcuCi0gKi8KLWNsYXNzIHRfY19nbGliX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLQotICAvKiBjb25zdHJ1Y3RvciAqLwotICB0X2NfZ2xpYl9nZW5lcmF0b3IodF9wcm9ncmFtICpwcm9ncmFtLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiAmcGFyc2VkX29wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcgJm9wdGlvbl9zdHJpbmcpIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICAodm9pZCkgcGFyc2VkX29wdGlvbnM7Ci0gICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0gICAgLyogc2V0IHRoZSBvdXRwdXQgZGlyZWN0b3J5ICovCi0gICAgdGhpcy0+b3V0X2Rpcl9iYXNlXyA9ICJnZW4tY19nbGliIjsKLQotICAgIC8qIHNldCB0aGUgbmFtZXNwYWNlICovCi0gICAgdGhpcy0+bnNwYWNlID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImNfZ2xpYiIpOwotCi0gICAgaWYgKHRoaXMtPm5zcGFjZS5lbXB0eSgpKSB7Ci0gICAgICB0aGlzLT5uc3BhY2UgPSAiIjsKLSAgICAgIHRoaXMtPm5zcGFjZV91ID0gIiI7Ci0gICAgICB0aGlzLT5uc3BhY2VfdWMgPSAiIjsKLSAgICAgIHRoaXMtPm5zcGFjZV9sYyA9ICIiOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiByZXBsYWNlIGRvdHMgd2l0aCB1bmRlcnNjb3JlcyAqLwotICAgICAgY2hhciAqdG1wID0gc3RyZHVwKHRoaXMtPm5zcGFjZS5jX3N0cigpKTsKLSAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgc3RybGVuKHRtcCk7IGkrKykgewotICAgICAgICBpZiAodG1wW2ldID09ICcuJykgewotICAgICAgICAgIHRtcFtpXSA9ICdfJzsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgdGhpcy0+bnNwYWNlID0gc3RyaW5nKHRtcCwgc3RybGVuKHRtcCkpOwotICAgICAgZnJlZSh0bXApOwotCi0gICAgICAvKiBjbGVhbiB1cCB0aGUgbmFtZXNwYWNlIGZvciBDLgotICAgICAgICogQW4gaW5wdXQgb2YgJ25hbWVzcGFjZSBmb28nIHNob3VsZCByZXN1bHQgaW46Ci0gICAgICAgKiAgLSBuc3BhY2UgPSBmb28gICAgICAgLSBmb3IgdGhyaWZ0IG9iamVjdHMgYW5kIHR5cGVkZWZzCi0gICAgICAgKiAgLSBuc3BhY2VfdSA9IEZvbyAgICAgLSBmb3IgaW50ZXJuYWwgR09iamVjdCBwcmVmaXhlcwotICAgICAgICogIC0gbnNwYWNlX3VjID0gRk9PXyAgIC0gZm9yIG1hY3JvIHByZWZpeGVzCi0gICAgICAgKiAgLSBuc3BhY2VfbGMgPSBmb29fICAgLSBmb3IgZmlsZW5hbWUgYW5kIG1ldGhvZCBwcmVmaXhlcwotICAgICAgICogVGhlIHVuZGVyc2NvcmVzIGFyZSB0aGVyZSBzaW5jZSB1YyBhbmQgbGMgc3RyaW5ncyBhcmUgdXNlZCBhcyBmaWxlIGFuZAotICAgICAgICogdmFyaWFibGUgcHJlZml4ZXMuCi0gICAgICAgKi8KLSAgICAgIHRoaXMtPm5zcGFjZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHRoaXMtPm5zcGFjZSk7Ci0gICAgICB0aGlzLT5uc3BhY2VfdWMgPSB0b191cHBlcl9jYXNlKHRoaXMtPm5zcGFjZV91KSArICJfIjsKLSAgICAgIHRoaXMtPm5zcGFjZV9sYyA9IHRvX2xvd2VyX2Nhc2UodGhpcy0+bnNwYWNlX3UpICsgIl8iOwotICAgIH0KLSAgfQotCi0gIC8qIGluaXRpYWxpemF0aW9uIGFuZCBkZXN0cnVjdGlvbiAqLwotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyogZ2VuZXJhdGlvbiBmdW5jdGlvbnMgKi8KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiAqdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtICp0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0ICo+IGNvbnN0cyk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0ICp0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSAqdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0ICp0c3RydWN0KTsKLQotIHByaXZhdGU6Ci0KLSAgLyogZmlsZSBzdHJlYW1zICovCi0gIG9mc3RyZWFtIGZfdHlwZXNfOwotICBvZnN0cmVhbSBmX3R5cGVzX2ltcGxfOwotICBvZnN0cmVhbSBmX2hlYWRlcl87Ci0gIG9mc3RyZWFtIGZfc2VydmljZV87Ci0KLSAgLyogbmFtZXNwYWNlIHZhcmlhYmxlcyAqLwotICBzdHJpbmcgbnNwYWNlOwotICBzdHJpbmcgbnNwYWNlX3U7Ci0gIHN0cmluZyBuc3BhY2VfdWM7Ci0gIHN0cmluZyBuc3BhY2VfbGM7Ci0KLSAgLyogaGVscGVyIGZ1bmN0aW9ucyAqLwotICBib29sIGlzX2NvbXBsZXhfdHlwZSh0X3R5cGUgKnR0eXBlKTsKLSAgc3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWY9ZmFsc2UsIGJvb2wgaXNfY29uc3Q9ZmFsc2UpOwotICBzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUgKnR5cGUpOwotICBzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSAqdHlwZSk7Ci0gIHN0cmluZyBjb25zdGFudF92YWx1ZShzdHJpbmcgbmFtZSwgdF90eXBlICp0eXBlLCB0X2NvbnN0X3ZhbHVlICp2YWx1ZSk7Ci0gIHN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiAqdGZ1bmN0aW9uKTsKLSAgc3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QgKnRzdHJ1Y3QpOwotICBzdHJpbmcgeGNlcHRpb25fbGlzdCh0X3N0cnVjdCAqdHN0cnVjdCk7Ci0gIHN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQgKnRmaWVsZCwgYm9vbCBpbml0PWZhbHNlLCBib29sIHBvaW50ZXI9ZmFsc2UsIGJvb2wgY29uc3RhbnQ9ZmFsc2UsIGJvb2wgcmVmZXJlbmNlPWZhbHNlKTsKLQotICAvKiBnZW5lcmF0aW9uIGZ1bmN0aW9ucyAqLwotICB2b2lkIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKHN0cmluZyBuYW1lLCB0X3R5cGUgKnR5cGUsIHRfY29uc3RfdmFsdWUgKnZhbHVlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9vYmplY3QodF9zdHJ1Y3QgKnRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0gJm91dCwgdF9zdHJ1Y3QgKnRzdHJ1Y3QsIHN0cmluZyB0aGlzX25hbWUsIHN0cmluZyB0aGlzX2dldD0iIiwgYm9vbCBpc19mdW5jdGlvbj10cnVlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtICZvdXQsIHRfc3RydWN0ICp0c3RydWN0LCBzdHJpbmcgdGhpc19uYW1lLCBzdHJpbmcgdGhpc19nZXQ9IiIsIGJvb2wgaXNfZnVuY3Rpb249dHJ1ZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwgdF9maWVsZCAqdGZpZWxkLCBzdHJpbmcgcHJlZml4LCBzdHJpbmcgc3VmZml4LCBpbnQgZXJyb3JfcmV0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsIHRfc3RydWN0ICp0c3RydWN0LCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsIHRfdHlwZSAqdHR5cGUsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LCB0X21hcCAqdG1hcCwgc3RyaW5nIGtleSwgc3RyaW5nIHZhbHVlLCBpbnQgZXJyb3JfcmV0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwgdF9zZXQgKnRzZXQsIHN0cmluZyBlbGVtZW50LCBpbnQgZXJyb3JfcmV0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsIHRfbGlzdCAqdGxpc3QsIHN0cmluZyBsaXN0LCBzdHJpbmcgaW5kZXgsIGludCBlcnJvcl9yZXQpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwgdF9maWVsZCAqdGZpZWxkLCBzdHJpbmcgcHJlZml4LCBzdHJpbmcgc3VmZml4LCBpbnQgZXJyb3JfcmV0KTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwgdF9zdHJ1Y3QgKnRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LCB0X3R5cGUgKnR0eXBlLCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LCB0X21hcCAqdG1hcCwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwgdF9zZXQgKnRzZXQsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSAmb3V0LCB0X2xpc3QgKnRsaXN0LCBzdHJpbmcgcHJlZml4LCBzdHJpbmcgaW5kZXgsIGludCBlcnJvcl9yZXQpOwotCi0gIHN0cmluZyBnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUodF90eXBlICogdHR5cGUpOwotICBzdHJpbmcgZ2VuZXJhdGVfbmV3X2FycmF5X2Zyb21fdHlwZSh0X3R5cGUgKiB0dHlwZSk7IAotfTsKLQotLyoqCi0gKiBQcmVwYXJlIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUKLSAqIG91dHB1dCBzdHJlYW1zLgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8qIGNyZWF0ZSBvdXRwdXQgZGlyZWN0b3J5ICovCi0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIHByb2dyYW1fbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHByb2dyYW1fbmFtZV8pOwotICBzdHJpbmcgcHJvZ3JhbV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShwcm9ncmFtX25hbWVfdSk7Ci0gIHN0cmluZyBwcm9ncmFtX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKHByb2dyYW1fbmFtZV91KTsKLQotICAvKiBjcmVhdGUgb3V0cHV0IGZpbGVzICovCi0gIHN0cmluZyBmX3R5cGVzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgdGhpcy0+bnNwYWNlX2xjCi0gICAgICAgICAgICAgICAgICAgICAgICArIHByb2dyYW1fbmFtZV9sYyArICJfdHlwZXMuaCI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotICBzdHJpbmcgZl90eXBlc19pbXBsX25hbWUgPSBnZXRfb3V0X2RpcigpICsgdGhpcy0+bnNwYWNlX2xjCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvZ3JhbV9uYW1lX2xjICsgIl90eXBlcy5jIjsKLSAgZl90eXBlc19pbXBsXy5vcGVuKGZfdHlwZXNfaW1wbF9uYW1lLmNfc3RyKCkpOwotCi0gIC8qIGFkZCB0aHJpZnQgYm9pbGVycGxhdGUgaGVhZGVycyAqLwotICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKLSAgZl90eXBlc19pbXBsXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKLQotICAvKiBpbmNsdWRlIGluY2x1c2lvbiBndWFyZCAqLwotICBmX3R5cGVzXyA8PCAKLSAgICAiI2lmbmRlZiAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBwcm9ncmFtX25hbWVfdWMgPDwgIl9UWVBFU19IIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgcHJvZ3JhbV9uYW1lX3VjIDw8ICJfVFlQRVNfSCIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLyogaW5jbHVkZSBiYXNlIHR5cGVzICovCi0gIGZfdHlwZXNfIDw8Ci0gICAgIi8qIGJhc2UgaW5jbHVkZXMgKi8iIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+IiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDx0aHJpZnRfc3RydWN0Lmg+IiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDxwcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4iIDw8IGVuZGw7Ci0KLSAgLyogaW5jbHVkZSBvdGhlciB0aHJpZnQgaW5jbHVkZXMgKi8KLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSAqPiAmaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICBmX3R5cGVzXyA8PAotICAgICAgIi8qIG90aGVyIHRocmlmdCBpbmNsdWRlcyAqLyIgPDwgZW5kbCA8PAotICAgICAgIiNpbmNsdWRlIFwiIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAiX3R5cGVzLmhcIiIgPDwgZW5kbDsKLSAgfQotICBmX3R5cGVzXyA8PCBlbmRsOwotCi0gIC8qIGluY2x1ZGUgY3VzdG9tIGhlYWRlcnMgKi8KLSAgY29uc3QgdmVjdG9yPHN0cmluZz4gJmNfaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2NfaW5jbHVkZXMoKTsKLSAgZl90eXBlc18gPDwgIi8qIGN1c3RvbSB0aHJpZnQgaW5jbHVkZXMgKi8iIDw8IGVuZGw7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY19pbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIGlmIChjX2luY2x1ZGVzW2ldWzBdID09ICc8JykgewotICAgICAgZl90eXBlc18gPDwKLSAgICAgICAgIiNpbmNsdWRlICIgPDwgY19pbmNsdWRlc1tpXSA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3R5cGVzXyA8PAotICAgICAgICAiI2luY2x1ZGUgXCIiIDw8IGNfaW5jbHVkZXNbaV0gPDwgIlwiIiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBmX3R5cGVzXyA8PCBlbmRsOwotCi0gIC8vIGluY2x1ZGUgdGhlIHR5cGVzIGZpbGUKLSAgZl90eXBlc19pbXBsXyA8PAotICAgIGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgXCIiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBwcm9ncmFtX25hbWVfdSA8PCAKLSAgICAgICAgIl90eXBlcy5oXCIiIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPHRocmlmdC5oPiIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl90eXBlc18gPDwKLSAgICAiLyogYmVnaW4gdHlwZXMgKi8iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiAgRmluaXNoIHVwIGdlbmVyYXRpb24gYW5kIGNsb3NlIGFsbCBmaWxlIHN0cmVhbXMuCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIHN0cmluZyBwcm9ncmFtX25hbWVfdWMgPSB0b191cHBlcl9jYXNlIAotICAgIChpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocHJvZ3JhbV9uYW1lXykpOwotCi0gIC8qIGVuZCB0aGUgaGVhZGVyIGluY2x1c2lvbiBndWFyZCAqLwotICBmX3R5cGVzXyA8PAotICAgICIjZW5kaWYgLyogIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgcHJvZ3JhbV9uYW1lX3VjIDw8ICJfVFlQRVNfSCAqLyIgPDwgZW5kbDsKLQotICAvKiBjbG9zZSBvdXRwdXQgZmlsZSAqLwotICBmX3R5cGVzXy5jbG9zZSgpOwotICBmX3R5cGVzX2ltcGxfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgVGhyaWZ0IHR5cGVkZWYgaW4gQyBjb2RlLiAgRm9yIGV4YW1wbGU6Ci0gKiAKLSAqIFRocmlmdDogCi0gKiB0eXBlZGVmIG1hcDxpMzIsaTMyPiBTb21lTWFwCi0gKiAKLSAqIEM6IAotICogdHlwZWRlZiBHSGFzaFRhYmxlICogVGhyaWZ0U29tZU1hcDsKLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICBmX3R5cGVzXyA8PAotICAgIGluZGVudCgpIDw8ICJ0eXBlZGVmICIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpLCB0cnVlKSA8PAotICAgICAgICAiICIgPDwgdGhpcy0+bnNwYWNlIDw8IHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19IAotCi0vKioKLSAqIEdlbmVyYXRlcyBhIEMgZW51bWVyYXRpb24uICBGb3IgZXhhbXBsZToKLSAqCi0gKiBUaHJpZnQ6Ci0gKiBlbnVtIE15RW51bSB7Ci0gKiAgIE9ORSA9IDEsCi0gKiAgIFRXTwotICogfQotICoKLSAqIEM6Ci0gKiBlbnVtIF9UaHJpZnRNeUVudW0gewotICogICBUSFJJRlRfTVlfRU5VTV9PTkUgPSAxLAotICogICBUSFJJRlRfTVlfRU5VTV9UV08KLSAqIH07Ci0gKiB0eXBlZGVmIGVudW0gX1RocmlmdE15RW51bSBUaHJpZnRNeUVudW07Ci0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSAqdGVudW0pIHsKLSAgc3RyaW5nIG5hbWUgPSB0ZW51bS0+Z2V0X25hbWUoKTsKLSAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKSk7Ci0KLSAgZl90eXBlc18gPDwKLSAgICBpbmRlbnQoKSA8PCAiZW51bSBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSAqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlICo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotCi0gIC8qIG91dHB1dCBlYWNoIG9mIHRoZSBlbnVtZXJhdGlvbiBlbGVtZW50cyAqLwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl90eXBlc18gPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl90eXBlc18gPDwKLSAgICAgIGluZGVudCgpIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgaWYgKCgqY19pdGVyKS0+aGFzX3ZhbHVlKCkpIHsKLSAgICAgIGZfdHlwZXNfIDw8Ci0gICAgICAgICIgPSAiIDw8ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl90eXBlc18gPDwKLSAgICBlbmRsIDw8Ci0gICAgIn07IiA8PCBlbmRsIDw8Ci0gICAgInR5cGVkZWYgZW51bSBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiICIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBUaHJpZnQgY29uc3RhbnRzIGluIEMgY29kZS4KLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyAodmVjdG9yPHRfY29uc3QgKj4gY29uc3RzKSB7Ci0gIGZfdHlwZXNfIDw8ICIvKiBjb25zdGFudHMgKi8iIDw8IGVuZGw7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgIi8qIGNvbnN0YW50cyAqLyIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9jb25zdCAqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lKTsKLSAgICBzdHJpbmcgbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UobmFtZSk7Ci0gICAgdF90eXBlICp0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIHRfY29uc3RfdmFsdWUgKnZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLQotICAgIGZfdHlwZXNfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICIgIiA8PAotICAgICAgICAgIGNvbnN0YW50X3ZhbHVlIChuYW1lX2xjLCB0eXBlLCB2YWx1ZSkgPDwgZW5kbDsKLQotICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyIChuYW1lX2xjLCB0eXBlLCB2YWx1ZSk7Ci0gIH0KLQotICBmX3R5cGVzXyA8PCBlbmRsOwotICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgVGhyaWZ0IHN0cnVjdHMgaW4gQyBjb2RlLCBhcyBHT2JqZWN0cy4gIEV4YW1wbGU6Ci0gKgotICogVGhyaWZ0OgotICogc3RydWN0IEJvbmsKLSAqIHsKLSAqICAgMTogc3RyaW5nIG1lc3NhZ2UsCi0gKiAgIDI6IGkzMiB0eXBlCi0gKiB9Ci0gKgotICogQyBHT2JqZWN0IGluc3RhbmNlIGhlYWRlcjoKLSAqIHN0cnVjdCBfVGhyaWZ0Qm9uawotICogewotICogICBHT2JqZWN0IHBhcmVudDsKLSAqCi0gKiAgIGdjaGFyICogbWVzc2FnZTsKLSAqICAgZ2ludDMyIHR5cGU7Ci0gKiB9OwotICogdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEJvbmsgVGhyaWZ0Qm9uawotICogLy8gLi4uIGFkZGl0aW9uYWwgR09iamVjdCBib2lsZXJwbGF0ZSAuLi4KLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCAodF9zdHJ1Y3QgKnRzdHJ1Y3QpIHsKLSAgZl90eXBlc18gPDwgIi8qIHN0cnVjdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfb2JqZWN0KHRzdHJ1Y3QpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIEMgY29kZSB0byByZXByZXNlbnQgVGhyaWZ0IHNlcnZpY2VzLiAgQ3JlYXRlcyBhIG5ldyBHT2JqZWN0Ci0gKiB3aGljaCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlIHNlcnZpY2UuCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlICh0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBzdmNuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModHNlcnZpY2UtPmdldF9uYW1lKCkpOwotICBzdHJpbmcgc3ZjbmFtZV91YyA9IHRoaXMtPm5zcGFjZV91YyArIHRvX3VwcGVyX2Nhc2Uoc3ZjbmFtZV91KTsKLSAgc3RyaW5nIGZpbGVuYW1lID0gdGhpcy0+bnNwYWNlX2xjICsgdG9fbG93ZXJfY2FzZShzdmNuYW1lX3UpOwotCi0gIC8vIG1ha2Ugb3V0cHV0IGZpbGVzCi0gIHN0cmluZyBmX2hlYWRlcl9uYW1lID0gZ2V0X291dF9kaXIoKSArIGZpbGVuYW1lICsgIi5oIjsKLSAgZl9oZWFkZXJfLm9wZW4oZl9oZWFkZXJfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgcHJvZ3JhbV9uYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocHJvZ3JhbV9uYW1lXyk7Ci0gIHN0cmluZyBwcm9ncmFtX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKHByb2dyYW1fbmFtZV91KTsKLQotICAvLyBhZGQgaGVhZGVyIGZpbGUgYm9pbGVycGxhdGUKLSAgZl9oZWFkZXJfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCk7Ci0KLSAgLy8gYWRkIGFuIGluY2x1c2lvbiBndWFyZAotICBmX2hlYWRlcl8gPDwKLSAgICAiI2lmbmRlZiAiIDw8IHN2Y25hbWVfdWMgPDwgIl9IIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCBzdmNuYW1lX3VjIDw8ICJfSCIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gYWRkIHN0YW5kYXJkIGluY2x1ZGVzCi0gIGZfaGVhZGVyXyA8PAotICAgICIjaW5jbHVkZSBcIiIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHByb2dyYW1fbmFtZV9sYyA8PCAiX3R5cGVzLmhcIiIgPDwgZW5kbDsKLQotICAvLyBpZiB3ZSBhcmUgaW5oZXJpdGluZyBmcm9tIGFub3RoZXIgc2VydmljZSwgaW5jbHVkZSBpdHMgaGVhZGVyCi0gIHRfc2VydmljZSAqZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gIGlmIChleHRlbmRzX3NlcnZpY2UgIT0gTlVMTCkgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgIiNpbmNsdWRlIFwiIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpKSkgPDwgIi5oXCIiIDw8IGVuZGw7Ci0gIH0KLSAgZl9oZWFkZXJfIDw8IGVuZGw7Ci0KLSAgLy8gY3JlYXRlIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uCi0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBmaWxlbmFtZSArICIuYyI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICAvLyBhZGQgdGhlIGJvaWxlcnBsYWNlIGhlYWRlcgotICBmX3NlcnZpY2VfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCk7Ci0KLSAgLy8gaW5jbHVkZSB0aGUgaGVhZGVycwotICBmX3NlcnZpY2VfIDw8Ci0gICAgIiNpbmNsdWRlIDxzdHJpbmcuaD4iIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPHRocmlmdC5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8dGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSBcIiIgPDwgZmlsZW5hbWUgPDwgIi5oXCIiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIGdlbmVyYXRlIHRoZSBjbGllbnQgb2JqZWN0cwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAodHNlcnZpY2UpOwotCi0gIC8vIGdlbmVyYXRlIHRoZSBzZXJ2ZXIgb2JqZWN0cwotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlciAodHNlcnZpY2UpOwotCi0gIC8vIGVuZCB0aGUgaGVhZGVyIGluY2x1c2lvbiBndWFyZAotICBmX2hlYWRlcl8gPDwKLSAgICAiI2VuZGlmIC8qICIgPDwgc3ZjbmFtZV91YyA8PCAiX0ggKi8iIDw8IGVuZGw7Ci0KLSAgLy8gY2xvc2UgdGhlIGZpbGVzCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLSAgZl9oZWFkZXJfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICoKLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCAqdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7Ci0gIHN0cmluZyBuYW1lX2xjID0gdG9fbG93ZXJfY2FzZShuYW1lX3UpOwotICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UobmFtZV91KTsKLQotICBnZW5lcmF0ZV9vYmplY3QodHN0cnVjdCk7Ci0KLSAgZl90eXBlc18gPDwgIi8qIGV4Y2VwdGlvbiAqLyIgPDwgZW5kbCA8PAotICAgICJ0eXBlZGVmIGVudW0iIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbCA8PAotICAgICIgICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIl9FUlJPUl9DT0RFLCIgPDwgZW5kbCA8PAotICAgICJ9ICIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkVycm9yOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiR1F1YXJrICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9lcnJvcl9xdWFyayAodm9pZCk7IiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiX0VSUk9SICgiIDw8Ci0gICAgICB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYyA8PCAiX2Vycm9yX3F1YXJrKCkpIiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl90eXBlc19pbXBsXyA8PAotICAgICIvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gZm9yIGV4Y2VwdGlvbnMgKi8iIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfRVJST1JfRE9NQUlOIFwiIiA8PAotICAgICAgICB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYyA8PCAiX2Vycm9yX3F1YXJrXCIiIDw8IGVuZGwgPDwKLSAgICAiR1F1YXJrIiA8PCBlbmRsIDw8Ci0gICAgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9lcnJvcl9xdWFyayAodm9pZCkiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbCA8PAotICAgICIgIHJldHVybiBnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZyAoIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PAotICAgICAgICAiX0VSUk9SX0RPTUFJTik7IiA8PCBlbmRsIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioKLSAqIEhFTFBFUiBGVU5DVElPTlMgKgotICoqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIFJldHVybnMgdHJ1ZSBpZiB0dHlwZSBpcyBub3QgYSBwcmltaXRpdmUuCi0gKi8KLWJvb2wgdF9jX2dsaWJfZ2VuZXJhdG9yOjppc19jb21wbGV4X3R5cGUodF90eXBlICp0dHlwZSkgewotICB0dHlwZSA9IGdldF90cnVlX3R5cGUgKHR0eXBlKTsKLQotICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpCi0gICAgICAgICB8fCB0dHlwZS0+aXNfc3RydWN0KCkKLSAgICAgICAgIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpCi0gICAgICAgICB8fCAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpCi0gICAgICAgICAgICAgJiYgKCgodF9iYXNlX3R5cGUgKikgdHR5cGUpLT5nZXRfYmFzZSgpCi0gICAgICAgICAgICAgICAgICA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpKTsKLX0KLQotCi0vKioKLSAqIE1hcHMgYSBUaHJpZnQgdF90eXBlIHRvIGEgQyB0eXBlLgotICovCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjp0eXBlX25hbWUgKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZiwgYm9vbCBpc19jb25zdCkgewotICAodm9pZCkgaW5fdHlwZWRlZjsKLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyBibmFtZSA9IGJhc2VfdHlwZV9uYW1lICgodF9iYXNlX3R5cGUgKikgdHR5cGUpOwotCi0gICAgaWYgKGlzX2NvbnN0KSB7Ci0gICAgICByZXR1cm4gImNvbnN0ICIgKyBibmFtZTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGJuYW1lOwotICAgIH0KLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBzdHJpbmcgY25hbWU7Ci0KLSAgICB0X2NvbnRhaW5lciAqdGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciAqKSB0dHlwZTsKLSAgICBpZiAodGNvbnRhaW5lci0+aGFzX2NwcF9uYW1lKCkpIHsKLSAgICAgIGNuYW1lID0gdGNvbnRhaW5lci0+Z2V0X2NwcF9uYW1lKCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGNuYW1lID0gIkdIYXNoVGFibGUgKiI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIC8vIHNpbmNlIGEgc2V0IHJlcXVpcmVzIHVuaXF1ZSBlbGVtZW50cywgdXNlIGEgR0hhc2hUYWJsZSwgYW5kCi0gICAgICAvLyBwb3B1bGF0ZSB0aGUga2V5cyBhbmQgdmFsdWVzIHdpdGggdGhlIHNhbWUgZGF0YSwgdXNpbmcga2V5cyBmb3IKLSAgICAgIC8vIHRoZSBhY3R1YWwgd3JpdGVzIGFuZCByZWFkcy4KLSAgICAgIC8vIFRPRE86IGRpc2N1c3Mgd2hldGhlciBvciBub3QgdG8gaW1wbGVtZW50IFRTZXQsIFRIYXNoU2V0IG9yIEdIYXNoU2V0Ci0gICAgICBjbmFtZSA9ICJHSGFzaFRhYmxlICoiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgLy8gVE9ETzogaW52ZXN0aWdhdGUgb3RoZXIgaW1wbGVtZW50YXRpb25zIGJlc2lkZXMgR1B0ckFycmF5Ci0gICAgICBjbmFtZSA9ICJHUHRyQXJyYXkgKiI7Ci0gICAgICB0X3R5cGUgKmV0eXBlID0gKCh0X2xpc3QgKikgdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICBpZiAoZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlICopIGV0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIjsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgICAgY25hbWUgPSAiR0FycmF5ICoiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBhcnJheSBpbmZvIGZvciB0eXBlIjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmIChpc19jb25zdCkgewotICAgICAgcmV0dXJuICJjb25zdCAiICsgY25hbWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBjbmFtZTsKLSAgICB9Ci0gIH0KLQotICAvLyBjaGVjayBmb3IgYSBuYW1lc3BhY2UKLSAgc3RyaW5nIHBuYW1lID0gdGhpcy0+bnNwYWNlICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKGlzX2NvbXBsZXhfdHlwZSAodHR5cGUpKSB7Ci0gICAgcG5hbWUgKz0gIiAqIjsKLSAgfQotCi0gIGlmIChpc19jb25zdCkgewotICAgIHJldHVybiAiY29uc3QgIiArIHBuYW1lOwotICB9IGVsc2UgewotICAgIHJldHVybiBwbmFtZTsKLSAgfQotfQotCi0vKioKLSAqIE1hcHMgYSBUaHJpZnQgcHJpbWl0aXZlIHRvIGEgQyBwcmltaXRpdmUuCi0gKi8KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlICp0eXBlKSB7Ci0gIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOwotCi0gIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICByZXR1cm4gInZvaWQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgIHJldHVybiAiR0J5dGVBcnJheSAqIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAiZ2NoYXIgKiI7Ci0gICAgICB9Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJnYm9vbGVhbiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJnaW50OCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gImdpbnQxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gImdpbnQzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gImdpbnQ2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gImdkb3VibGUiOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMgYmFzZSB0eXBlIG5hbWUgZm9yIGJhc2UgdHlwZSAiCi0gICAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSAodGJhc2UpOwotICB9Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIG1lbWJlciBvZiB0aGUgVGhyaWZ0VHlwZSBDIGVudW1lcmF0aW9uIGluIHRocmlmdF9wcm90b2NvbC5oCi0gKiBmb3IgYSBUaHJpZnQgdHlwZS4KLSAqLwotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtICh0X3R5cGUgKnR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUgKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlICopIHR5cGUpLT5nZXRfYmFzZSgpOwotCi0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmV0dXJuICJUX1NUUklORyI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJldHVybiAiVF9CT09MIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgcmV0dXJuICJUX0JZVEUiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIHJldHVybiAiVF9JMTYiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIHJldHVybiAiVF9JMzIiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJldHVybiAiVF9JNjQiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJldHVybiAiVF9ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRfSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgIHJldHVybiAiVF9TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRfU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVF9NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUX1NFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUX0xJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0KLS8qKgotICogUmV0dXJucyBDIGNvZGUgdGhhdCByZXByZXNlbnRzIGEgVGhyaWZ0IGNvbnN0YW50LgotICovCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpjb25zdGFudF92YWx1ZShzdHJpbmcgbmFtZSwgdF90eXBlICp0eXBlLCB0X2NvbnN0X3ZhbHVlICp2YWx1ZSkgewotICBvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAvKiBwcmltaXRpdmVzICovCi0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJlbmRlciA8PCAiXCIiICsgdmFsdWUtPmdldF9zdHJpbmcoKSArICJcIiI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSAhPSAwKSA/IDEgOiAwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiCi0gICAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lICh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJlbmRlciA8PCAiKCIgPDwgdHlwZV9uYW1lICh0eXBlKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0eXBlLT5pc19saXN0KCkKLSAgICAgICAgICAgICB8fCB0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19tYXAoKSkgewotICAgIHJlbmRlciA8PCAiKCIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8Ci0gICAgICB0b19sb3dlcl9jYXNlKG5hbWUpIDw8ICJfY29uc3RhbnQoKSkiOwotICB9IGVsc2UgewotICAgIHJlbmRlciA8PCAiTlVMTCAvKiBub3Qgc3VwcG9ydGVkICovIjsKLSAgfQotCi0gIHJldHVybiByZW5kZXIuc3RyKCk7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7Ci0gIHRfc3RydWN0KiBhcmdsaXN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICB0X3N0cnVjdCogeGxpc3QgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgc3RyaW5nIGZuYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7Ci0KLSAgYm9vbCBoYXNfcmV0dXJuID0gIXR0eXBlLT5pc192b2lkKCk7Ci0gIGJvb2wgaGFzX2FyZ3MgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOwotICBib29sIGhhc194Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLSAgcmV0dXJuCi0gICAgImdib29sZWFuICIgKyB0aGlzLT5uc3BhY2VfbGMgKyBmbmFtZSArICIgKCIgKyB0aGlzLT5uc3BhY2UKLSAgICArIHNlcnZpY2VfbmFtZV8gKyAiSWYgKiBpZmFjZSIKLSAgICArIChoYXNfcmV0dXJuID8gIiwgIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiKiBfcmV0dXJuIiA6ICIiKQotICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QgKGFyZ2xpc3QpKSkgCi0gICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0ICh4bGlzdCkpKQotICAgICsgIiwgR0Vycm9yICoqIGVycm9yKSI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqIEByZXR1cm4gQ29tbWEgc2VwZWFyYXRlZCBsaXN0IG9mIGFsbCBmaWVsZCBuYW1lcyBpbiB0aGF0IHN0cnVjdAotICovCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0ICh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIHRydWUpICsgIiAiICsKLSAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmVuZGVycyBtdXRhYmxlIGV4Y2VwdGlvbiBsaXN0cwotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICogQHJldHVybiBDb21tYSBzZXBlYXJhdGVkIGxpc3Qgb2YgYWxsIGZpZWxkIG5hbWVzIGluIHRoYXQgc3RydWN0Ci0gKi8KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OnhjZXB0aW9uX2xpc3QgKHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIiogIiArCi0gICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qKgotICogRGVjbGFyZXMgYSBmaWVsZCwgaW5jbHVkaW5nIGFueSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24uCi0gKi8KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCAqdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb25zdGFudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWZlcmVuY2UpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBpZiAoY29uc3RhbnQpIHsKLSAgICByZXN1bHQgKz0gImNvbnN0ICI7Ci0gIH0KLSAgcmVzdWx0ICs9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICBpZiAocG9pbnRlcikgewotICAgIHJlc3VsdCArPSAiKiI7Ci0gIH0KLSAgaWYgKHJlZmVyZW5jZSkgewotICAgIHJlc3VsdCArPSAiKiI7Ci0gIH0KLSAgcmVzdWx0ICs9ICIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlICopIHR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIHJlc3VsdCArPSAiID0gKGdkb3VibGUpIDAiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICByZXN1bHQgKz0gIiA9IE5VTEwiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyBpbnRpYWxpemVyIGZvciBiYXNlIHR5cGUgIgotICAgICAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lICh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gKCIgKyB0eXBlX25hbWUgKHR5cGUpICsgIikgMCI7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFyZWZlcmVuY2UpIHsKLSAgICByZXN1bHQgKz0gIjsiOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgQyBjb2RlIHRoYXQgaW5pdGlhbGl6ZXMgY29tcGxleCBjb25zdGFudHMuCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcihzdHJpbmcgbmFtZSwgdF90eXBlICp0eXBlLCB0X2NvbnN0X3ZhbHVlICp2YWx1ZSkgewotICBzdHJpbmcgbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOwotICBzdHJpbmcgbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UobmFtZV91KTsKLSAgc3RyaW5nIHR5cGVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0eXBlLT5nZXRfbmFtZSgpKTsKLSAgc3RyaW5nIHR5cGVfdWMgPSB0b191cHBlcl9jYXNlKHR5cGVfdSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCAqPiAmZmllbGRzID0gKCh0X3N0cnVjdCAqKSB0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCAqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlICosIHRfY29uc3RfdmFsdWUgKj4gJnZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUgKiwgdF9jb25zdF92YWx1ZSAqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIG9zdHJpbmdzdHJlYW0gaW5pdGlhbGl6ZXJzOwotCi0gICAgLy8gaW5pdGlhbGl6ZSBhbnkgY29uc3RhbnRzIHRoYXQgbWF5IGJlIHJlZmVyZW5jZWQgYnkgdGhpcyBpbml0aWFsaXplcgotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUgKmZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgc3RyaW5nIGZpZWxkX25hbWUgPSAiIjsKLQotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICAgIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIgotICAgICAgICAgICAgICArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIGZpZWxkX25hbWUgPSB0bXAgKGZpZWxkX25hbWUpOwotCi0gICAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplciAobmFtZSArICJfY29uc3RhbnRfIiArIGZpZWxkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5pdGlhbGl6ZXJzIDw8Ci0gICAgICAgICIgICAgY29uc3RhbnQtPiIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSAiIDw8Ci0gICAgICAgIGNvbnN0YW50X3ZhbHVlIChuYW1lICsgIl9jb25zdGFudF8iICsgZmllbGRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgICAiICAgIGNvbnN0YW50LT5fX2lzc2V0XyIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8Ci0gICAgICAgICIgPSBUUlVFOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBpbXBsZW1lbnQgdGhlIGluaXRpYWxpemVyCi0gICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgInN0YXRpYyAiIDw8IHRoaXMtPm5zcGFjZSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIgKiIgPDwgZW5kbCA8PAotICAgICAgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9jb25zdGFudCAodm9pZCkiIDw8IGVuZGwgPDwKLSAgICAgICJ7IiA8PCBlbmRsIDw8Ci0gICAgICAiICBzdGF0aWMgIiA8PCB0aGlzLT5uc3BhY2UgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PAotICAgICAgICAgICIgKmNvbnN0YW50ID0gTlVMTDsiIDw8IGVuZGwgPDwKLSAgICAgICIgIGlmIChjb25zdGFudCA9PSBOVUxMKSIgPDwgZW5kbCA8PAotICAgICAgIiAgeyIgPDwgZW5kbCA8PAotICAgICAgIiAgICBjb25zdGFudCA9IGdfb2JqZWN0X25ldyAoIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PAotICAgICAgICAgIHR5cGVfdWMgPDwgIiwgTlVMTCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbml0aWFsaXplcnMuc3RyKCkgPDwgZW5kbCA8PAotICAgICAgIiAgfSIgPDwgZW5kbCA8PAotICAgICAgIiAgcmV0dXJuIGNvbnN0YW50OyIgPDwgZW5kbCA8PAotICAgICAgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGxpc3RfdHlwZSA9ICJHUHRyQXJyYXkgKiI7Ci0gICAgc3RyaW5nIGxpc3RfaW5pdGlhbGl6ZXIgPSAiZ19wdHJfYXJyYXlfbmV3KCkiOwotICAgIHN0cmluZyBsaXN0X2FwcGVuZGVyID0gImdfcHRyX2FycmF5X2FkZCI7Ci0gICAgYm9vbCBsaXN0X3ZhcmlhYmxlID0gZmFsc2U7Ci0KLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIG9zdHJpbmdzdHJlYW0gaW5pdGlhbGl6ZXJzOwotCi0gICAgaWYgKGV0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgZXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgbGlzdF90eXBlID0gIkdBcnJheSAqIjsKLSAgICAgICAgICBsaXN0X2luaXRpYWxpemVyID0gZ2VuZXJhdGVfbmV3X2FycmF5X2Zyb21fdHlwZSAoZXR5cGUpOwotICAgICAgICAgIGxpc3RfYXBwZW5kZXIgPSAiZ19hcnJheV9hcHBlbmRfdmFsIjsKLSAgICAgICAgICBsaXN0X3ZhcmlhYmxlID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBhcnJheSBpbmZvIGZvciB0eXBlIjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGZuYW1lID0gdG1wIChuYW1lKTsKLQotICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIgKGZuYW1lLCBldHlwZSwgKCp2X2l0ZXIpKTsKLSAgICAgIGlmIChsaXN0X3ZhcmlhYmxlKSB7Ci0gICAgICAgIGluaXRpYWxpemVycyA8PAotICAgICAgICAgICIgICAgIiA8PCB0eXBlX25hbWUgKGV0eXBlKSA8PCAiICIgPDwgZm5hbWUgPDwgIiA9ICIgPDwKLSAgICAgICAgICAgIGNvbnN0YW50X3ZhbHVlIChmbmFtZSwgKHRfdHlwZSAqKSBldHlwZSwgKCp2X2l0ZXIpKSA8PCAiOyIgPDwKLSAgICAgICAgICAgICAgICBlbmRsIDw8Ci0gICAgICAgICAgIiAgICAiIDw8IGxpc3RfYXBwZW5kZXIgPDwgIihjb25zdGFudCwgIiA8PCBmbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbml0aWFsaXplcnMgPDwKLSAgICAgICAgICAiICAgICIgPDwgbGlzdF9hcHBlbmRlciA8PCAiKGNvbnN0YW50LCAiIDw8Ci0gICAgICAgICAgY29uc3RhbnRfdmFsdWUgKGZuYW1lLCAodF90eXBlICopIGV0eXBlLCAoKnZfaXRlcikpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgICAic3RhdGljICIgPDwgbGlzdF90eXBlIDw8IGVuZGwgPDwKLSAgICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsIDw8Ci0gICAgICAieyIgPDwgZW5kbCA8PAotICAgICAgIiAgc3RhdGljICIgPDwgbGlzdF90eXBlIDw8ICIgY29uc3RhbnQgPSBOVUxMOyIgPDwgZW5kbCA8PAotICAgICAgIiAgaWYgKGNvbnN0YW50ID09IE5VTEwpIiA8PCBlbmRsIDw8Ci0gICAgICAiICB7IiA8PCBlbmRsIDw8Ci0gICAgICAiICAgIGNvbnN0YW50ID0gIiA8PCBsaXN0X2luaXRpYWxpemVyIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbml0aWFsaXplcnMuc3RyKCkgPDwgZW5kbCA8PAotICAgICAgIiAgfSIgPDwgZW5kbCA8PAotICAgICAgIiAgcmV0dXJuIGNvbnN0YW50OyIgPDwgZW5kbCA8PAotICAgICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlICpldHlwZSA9ICgodF9zZXQgKikgdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSAqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIG9zdHJpbmdzdHJlYW0gaW5pdGlhbGl6ZXJzOwotCi0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBmbmFtZSA9IHRtcCAobmFtZSk7Ci0gICAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplciAoZm5hbWUsIGV0eXBlLCAoKnZfaXRlcikpOwotICAgICAgaW5pdGlhbGl6ZXJzIDw8Ci0gICAgICAgICIgICAgIiA8PCB0eXBlX25hbWUgKGV0eXBlKSA8PCAiICIgPDwgZm5hbWUgPDwgIiA9ICIgPDwKLSAgICAgICAgICBjb25zdGFudF92YWx1ZSAoZm5hbWUsICh0X3R5cGUgKikgZXR5cGUsICgqdl9pdGVyKSkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgIiAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChjb25zdGFudCwgJiIgPDwgZm5hbWUgPDwgIiwgJiIgPDwgZm5hbWUgPDwKLSAgICAgICAgIik7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgICJzdGF0aWMgR0hhc2hUYWJsZSAqIiA8PCBlbmRsIDw8Ci0gICAgICB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYyA8PCAiX2NvbnN0YW50ICh2b2lkKSIgPDwgZW5kbCA8PAotICAgICAgInsiIDw8IGVuZGwgPDwKLSAgICAgICIgIHN0YXRpYyBHSGFzaFRhYmxlICpjb25zdGFudCA9IE5VTEw7IiA8PCBlbmRsIDw8Ci0gICAgICAiICBpZiAoY29uc3RhbnQgPT0gTlVMTCkiIDw8IGVuZGwgPDwKLSAgICAgICIgIHsiIDw8IGVuZGwgPDwKLSAgICAgICIgICAgY29uc3RhbnQgPSBnX2hhc2hfdGFibGVfbmV3IChOVUxMLCBOVUxMKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluaXRpYWxpemVycy5zdHIoKSA8PCBlbmRsIDw8Ci0gICAgICAiICB9IiA8PCBlbmRsIDw8Ci0gICAgICAiICByZXR1cm4gY29uc3RhbnQ7IiA8PCBlbmRsIDw8Ci0gICAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7IAotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlICprdHlwZSA9ICgodF9tYXAgKikgdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSAqdnR5cGUgPSAoKHRfbWFwICopIHR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSAqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIG9zdHJpbmdzdHJlYW0gaW5pdGlhbGl6ZXJzOwotCi0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBmbmFtZSA9IHRtcCAobmFtZSk7Ci0gICAgICBzdHJpbmcga25hbWUgPSBmbmFtZSArICJrZXkiOwotICAgICAgc3RyaW5nIHZuYW1lID0gZm5hbWUgKyAidmFsIjsKLSAgICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyIChrbmFtZSwga3R5cGUsICgqdl9pdGVyKSk7Ci0gICAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplciAodm5hbWUsIHZ0eXBlLCAoKnZfaXRlcikpOwotCi0gICAgICBpbml0aWFsaXplcnMgPDwKLSAgICAgICAgIiAgICAiIDw8IHR5cGVfbmFtZSAoa3R5cGUpIDw8ICIgIiA8PCBrbmFtZSA8PCAiID0gIiA8PAotICAgICAgICAgIGNvbnN0YW50X3ZhbHVlIChrbmFtZSwgKHRfdHlwZSAqKSBrdHlwZSwgKCp2X2l0ZXIpKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgICAiICAgICIgPDwgdHlwZV9uYW1lICh2dHlwZSkgPDwgIiAiIDw8IHZuYW1lIDw8ICIgPSAiIDw8Ci0gICAgICAgICAgY29uc3RhbnRfdmFsdWUgKHZuYW1lLCAodF90eXBlICopIHZ0eXBlLCAoKnZfaXRlcikpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICAgICIgICAgZ19oYXNoX3RhYmxlX2luc2VydCAoY29uc3RhbnQsICYiIDw8IGZuYW1lIDw8ICIsICYiIDw8IGZuYW1lIDw8Ci0gICAgICAgICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgICAic3RhdGljIEdIYXNoVGFibGUgKiIgPDwgZW5kbCA8PAotICAgICAgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9jb25zdGFudCAodm9pZCkiIDw8IGVuZGwgPDwKLSAgICAgICJ7IiA8PCBlbmRsIDw8Ci0gICAgICAiICBzdGF0aWMgR0hhc2hUYWJsZSAqY29uc3RhbnQgPSBOVUxMOyIgPDwgZW5kbCA8PAotICAgICAgIiAgaWYgKGNvbnN0YW50ID09IE5VTEwpIiA8PCBlbmRsIDw8Ci0gICAgICAiICB7IiA8PCBlbmRsIDw8Ci0gICAgICAiICAgIGNvbnN0YW50ID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbml0aWFsaXplcnMuc3RyKCkgPDwgZW5kbCA8PAotICAgICAgIiAgfSIgPDwgZW5kbCA8PAotICAgICAgIiAgcmV0dXJuIGNvbnN0YW50OyIgPDwgZW5kbCA8PAotICAgICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IHJlcHJlc2VudHMgYSBUaHJpZnQgc2VydmljZSBjbGllbnQuCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7Ci0gIC8qIGdldCBzb21lIEMgZnJpZW5kbHkgc2VydmljZSBuYW1lcyAqLwotICBzdHJpbmcgc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9uYW1lXykpOwotICBzdHJpbmcgc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShzZXJ2aWNlX25hbWVfbGMpOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBjbGllbnQgaW50ZXJmYWNlIGR1bW15IG9iamVjdCBpbiB0aGUgaGVhZGVyLgotICBmX2hlYWRlcl8gPDwKLSAgICAiLyogIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgc2VydmljZSBpbnRlcmZhY2UgKi8iIDw8IGVuZGwgPDwKLSAgICAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmICIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmOyAiIDw8Ci0gICAgICAgICIgLyogZHVtbXkgb2JqZWN0ICovIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgY2xpZW50IGludGVyZmFjZSBvYmplY3QgaW4gdGhlIGhlYWRlci4KLSAgZl9oZWFkZXJfIDw8Ci0gICAgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbCA8PAotICAgICIgIEdUeXBlSW50ZXJmYWNlIHBhcmVudDsiIDw8IGVuZGwgPDwKLSAgZW5kbDsKLQotICAvKiB3cml0ZSBvdXQgdGhlIGZ1bmN0aW9ucyBmb3IgdGhpcyBpbnRlcmZhY2UgKi8KLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIC8qIG1ha2UgdGhlIGZ1bmN0aW9uIG5hbWUgQyBmcmllbmRseSAqLwotICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgdF90eXBlICp0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICB0X3N0cnVjdCAqYXJnbGlzdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICB0X3N0cnVjdCAqeGxpc3QgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICBib29sIGhhc19yZXR1cm4gPSAhdHR5cGUtPmlzX3ZvaWQoKTsKLSAgICBib29sIGhhc19hcmdzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLSAgICBib29sIGhhc194Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLQotICAgIHN0cmluZyBwYXJhbXMgPSAiKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICppZmFjZSIKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUgKHR0eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCi0gICAgICAgICAgICAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QgKGFyZ2xpc3QpKSkKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0ICh4bGlzdCkpKQotICAgICAgICAgICAgICAgICAgICArICIsIEdFcnJvciAqKmVycm9yKSI7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICJnYm9vbGVhbiAoKiIgPDwgZnVubmFtZSA8PCAiKSAiIDw8IHBhcmFtcyA8PCAiOyIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGZfaGVhZGVyXyA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UgIiA8PAotICAgICAgICB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2U7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBnZW5lcmF0ZSBhbGwgdGhlIGludGVyZmFjZSBib2lsZXJwbGF0ZQotICBmX2hlYWRlcl8gPDwKLSAgICAiR1R5cGUgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8Ci0gICAgICAgICJfaWZfZ2V0X3R5cGUgKHZvaWQpOyIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYgIiA8PAotICAgICAgICAiKCIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2dldF90eXBlKCkpIiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYob2JqKSAiIDw8Ci0gICAgICAgICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGLCAiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZikpIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYob2JqKSAiIDw8Ci0gICAgICAgICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmosICIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYpKSIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PAotICAgICAgICAiX0lGX0dFVF9JTlRFUkZBQ0UoaW5zdCkgKEdfVFlQRV9JTlNUQU5DRV9HRVRfSU5URVJGQUNFICgoaW5zdCksICIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYsICIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlKSkiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIHdyaXRlIG91dCBhbGwgdGhlIGludGVyZmFjZSBmdW5jdGlvbiBwcm90b3R5cGVzCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgLyogbWFrZSB0aGUgZnVuY3Rpb24gbmFtZSBDIGZyaWVuZGx5ICovCi0gICAgc3RyaW5nIGZ1bm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB0X3R5cGUgKnR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgIHRfc3RydWN0ICphcmdsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIHRfc3RydWN0ICp4bGlzdCA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgIGJvb2wgaGFzX3JldHVybiA9ICF0dHlwZS0+aXNfdm9pZCgpOwotICAgIGJvb2wgaGFzX2FyZ3MgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOwotICAgIGJvb2wgaGFzX3hjZXB0aW9ucyA9IHhsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOwotCi0gICAgc3RyaW5nIHBhcmFtcyA9ICIoIiArIHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSWYgKmlmYWNlIgotICAgICAgICAgICAgICAgICAgICArIChoYXNfcmV0dXJuID8gIiwgIiArIHR5cGVfbmFtZSAodHR5cGUpICsgIiogX3JldHVybiIgOiAiIikKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX2FyZ3MgPyAiIiA6ICgiLCAiICsgYXJndW1lbnRfbGlzdCAoYXJnbGlzdCkpKQotICAgICAgICAgICAgICAgICAgICArIChoYXNfeGNlcHRpb25zID8gIiIgOiAoIiwgIiArIHhjZXB0aW9uX2xpc3QgKHhsaXN0KSkpCi0gICAgICAgICAgICAgICAgICAgICsgIiwgR0Vycm9yICoqZXJyb3IpIjsKLQotICAgIGZfaGVhZGVyXyA8PCAiZ2Jvb2xlYW4gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8Ci0gICAgICAgICAgICAgICAgICJfaWZfIiA8PCBmdW5uYW1lIDw8ICIgIiA8PCBwYXJhbXMgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9oZWFkZXJfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGNsaWVudCBvYmplY3QgaW5zdGFuY2UgZGVmaW5pdGlvbiBpbiB0aGUgaGVhZGVyLgotICBmX2hlYWRlcl8gPDwKLSAgICAiLyogIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgc2VydmljZSBjbGllbnQgKi8iIDw8IGVuZGwgPDwKLSAgICAic3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbCA8PAotICAgICIgIEdPYmplY3QgcGFyZW50OyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiICBUaHJpZnRQcm90b2NvbCAqaW5wdXRfcHJvdG9jb2w7IiA8PCBlbmRsIDw8Ci0gICAgIiAgVGhyaWZ0UHJvdG9jb2wgKm91dHB1dF9wcm90b2NvbDsiIDw8IGVuZGwgPDwKLSAgICAifTsiIDw8IGVuZGwgPDwKLSAgICAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCAiIDw8Ci0gICAgICB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50OyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGNsYXNzIGRlZmluaXRpb24gaW4gdGhlIGhlYWRlci4KLSAgZl9oZWFkZXJfIDw8Ci0gICAgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbCA8PAotICAgICIgIEdPYmplY3RDbGFzcyBwYXJlbnQ7IiA8PCBlbmRsIDw8Ci0gICAgIn07IiA8PCBlbmRsIDw8Ci0gICAgInR5cGVkZWYgc3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnRDbGFzcyAiIDw8Ci0gICAgICB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3M7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBDcmVhdGUgYWxsIHRoZSBHT2JqZWN0IGJvaWxlcnBsYXRlCi0gIGZfaGVhZGVyXyA8PAotICAgICJHVHlwZSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgCi0gICAgICAgICJfY2xpZW50X2dldF90eXBlICh2b2lkKTsiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCAiIDw8Ci0gICAgICAgICIoIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X2dldF90eXBlKCkpIiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UKG9iaikgIiA8PAotICAgICAgICAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgIiA8PCAKLSAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5ULCAiIDw8IAotICAgICAgICB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50KSkiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlRfQ0xBU1MoYykgIiA8PCAKLSAgICAgICAgIihHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCAiIDw8IAotICAgICAgICB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQsICIgPDwgCi0gICAgICAgIHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnRDbGFzcykpIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSVNfQ0xJRU5UKG9iaikgIiA8PAotICAgICAgICAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgIiA8PCAKLSAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UKSkiIDw8IGVuZGwgPDwgCi0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8Ci0gICAgICAgICJfSVNfQ0xJRU5UX0NMQVNTKGMpICIgPDwgIihHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAiIDw8IAotICAgICAgICB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQpKSIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PAotICAgICAgICAiX0NMSUVOVF9HRVRfQ0xBU1Mob2JqKSAiIDw8ICIoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICIgPDwgCi0gICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCwgIiA8PAotICAgICAgICB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MpKSIgPDwgZW5kbCA8PCAKLSAgICBlbmRsOwotCi0gIC8qIHdyaXRlIG91dCB0aGUgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIC8qIG1ha2UgdGhlIGZ1bmN0aW9uIG5hbWUgQyBmcmllbmRseSAqLwotICAgIHN0cmluZyBmdW5uYW1lID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSk7Ci0KLSAgICB0X2Z1bmN0aW9uIHNlcnZpY2VfZnVuY3Rpb24gKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZyAoIl9jbGllbnRfIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZnVubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUgKCZzZXJ2aWNlX2Z1bmN0aW9uKSA8PCAiOyIgPDwgZW5kbDsKLQotICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbiAoZ190eXBlX3ZvaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMgKyBzdHJpbmcgKCJfY2xpZW50X3NlbmRfIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZnVubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7Ci0gICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlICgmc2VuZF9mdW5jdGlvbikgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgICAvLyBpbXBsZW1lbnQgcmVjdiBpZiBub3QgYSBvbmV3YXkgc2VydmljZQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzIChwcm9ncmFtXyk7Ci0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24gKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nICgiX2NsaWVudF9yZWN2XyIpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZ1bm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSAoJnJlY3ZfZnVuY3Rpb24pIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGZfaGVhZGVyXyA8PCBlbmRsOwotICAvLyBlbmQgb2YgaGVhZGVyIGNvZGUKLQotICAvLyBHZW5lcmF0ZSBpbnRlcmZhY2UgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIC8qIG1ha2UgdGhlIGZ1bmN0aW9uIG5hbWUgQyBmcmllbmRseSAqLwotICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgdF90eXBlICp0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICB0X3N0cnVjdCAqYXJnbGlzdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICB0X3N0cnVjdCAqeGxpc3QgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICBib29sIGhhc19yZXR1cm4gPSAhdHR5cGUtPmlzX3ZvaWQoKTsKLSAgICBib29sIGhhc19hcmdzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLSAgICBib29sIGhhc194Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLQotICAgIHN0cmluZyBwYXJhbXMgPSAiKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICppZmFjZSIKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUgKHR0eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCi0gICAgICAgICAgICAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QgKGFyZ2xpc3QpKSkKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0ICh4bGlzdCkpKQotICAgICAgICAgICAgICAgICAgICArICIsIEdFcnJvciAqKmVycm9yKSI7Ci0KLSAgICBzdHJpbmcgcGFyYW1zX3dpdGhvdXRfdHlwZSA9IHN0cmluZygiaWZhY2UsICIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChoYXNfcmV0dXJuID8gIl9yZXR1cm4sICIgOiAiIik7Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCAqPiYgZmllbGRzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCAqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyX2ZpZWxkOwotICAgIGZvciAoZl9pdGVyX2ZpZWxkID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlcl9maWVsZCAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyX2ZpZWxkKSB7Ci0gICAgICBwYXJhbXNfd2l0aG91dF90eXBlICs9ICgqZl9pdGVyX2ZpZWxkKS0+Z2V0X25hbWUoKTsgCi0gICAgICBwYXJhbXNfd2l0aG91dF90eXBlICs9ICIsICI7Ci0gICAgfQotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQgKj4mIHhjZXB0aW9ucyA9IHhsaXN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkICo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIHBhcmFtc193aXRob3V0X3R5cGUgKz0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgcGFyYW1zX3dpdGhvdXRfdHlwZSArPSAiLCAiOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJnYm9vbGVhbiIgPDwgZW5kbCA8PAotICAgICAgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmXyIgPDwgZnVubmFtZSA8PCAiICIgPDwKLSAgICAgICAgICBwYXJhbXMgPDwgZW5kbCA8PAotICAgICAgInsiIDw8IGVuZGwgPDwgCi0gICAgICAiICByZXR1cm4gIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8Ci0gICAgICAgICAgIl9JRl9HRVRfSU5URVJGQUNFIChpZmFjZSktPiIgPDwgZnVubmFtZSA8PCAiICgiIDw8Ci0gICAgICAgICAgcGFyYW1zX3dpdGhvdXRfdHlwZSA8PCAiZXJyb3IpOyIgPDwgZW5kbCA8PAotICAgICAgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBpbnRlcmZhY2UgYm9pbGVycGxhdGUKLSAgZl9zZXJ2aWNlXyA8PAotICAgICJHVHlwZSIgPDwgZW5kbCA8PAotICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl9nZXRfdHlwZSAodm9pZCkiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbCA8PAotICAgICIgIHN0YXRpYyBHVHlwZSB0eXBlID0gMDsiIDw8IGVuZGwgPDwKLSAgICAiICBpZiAodHlwZSA9PSAwKSIgPDwgZW5kbCA8PAotICAgICIgIHsiIDw8IGVuZGwgPDwKLSAgICAiICAgIHN0YXRpYyBjb25zdCBHVHlwZUluZm8gdHlwZV9pbmZvID0iIDw8IGVuZGwgPDwKLSAgICAiICAgIHsiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgc2l6ZW9mICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSksIiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgIiAgICAgIE5VTEwsICAvKiBiYXNlX2luaXQgKi8iIDw8IGVuZGwgPDwKLSAgICAiICAgICAgTlVMTCAgLyogYmFzZV9maW5hbGl6ZSAqLyIgPDwgZW5kbCA8PAotICAgICIgICAgfTsiIDw8IGVuZGwgPDwKLSAgICAiICAgIHR5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljIChHX1RZUEVfSU5URVJGQUNFLCIgPDwgZW5kbCA8PAotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PAotICAgICAgICAiSWZcIiwiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZV9pbmZvLCAwKTsiIDw8IGVuZGwgPDwKLSAgICAiICB9IiA8PCBlbmRsIDw8Ci0gICAgIiAgcmV0dXJuIHR5cGU7IiA8PCBlbmRsIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBib2lsZXJwbGF0ZQotICBmX3NlcnZpY2VfIDw8Ci0gICAgInN0YXRpYyB2b2lkICIgPDwgZW5kbCA8PAotICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwKLSAgICAgICAgIl9pZl9pbnRlcmZhY2VfaW5pdCAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PAotICAgICAgICAiSWZJbnRlcmZhY2UgKmlmYWNlKTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIkdfREVGSU5FX1RZUEVfV0lUSF9DT0RFICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8Ci0gICAgICAiQ2xpZW50LCAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnQsIiA8PCBlbmRsIDw8Ci0gICAgICAiICAgICAgICAgICAgICAgICAgICAgICBHX1RZUEVfT0JKRUNULCAiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoIiA8PAotICAgICAgICB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiwiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA8PAotICAgICAgICB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQpKTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBwcm9wZXJ0aWVzCi0gIGZfc2VydmljZV8gPDwKLSAgICAiZW51bSBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50UHJvcGVydGllcyIgPDwgZW5kbCA8PAotICAgICJ7IiA8PCBlbmRsIDw8Ci0gICAgIiAgUFJPUF8wLCIgPDwgZW5kbCA8PAotICAgICIgIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8Ci0gICAgICAgICJfQ0xJRU5UX0lOUFVUX1BST1RPQ09MLCIgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICIgIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8Ci0gICAgICAgICJfQ0xJRU5UX09VVFBVVF9QUk9UT0NPTCIgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICBlbmRsOwotCi0gIC8vIGdlbmVyYXRlIHByb3BlcnR5IHNldHRlcgotICBmX3NlcnZpY2VfIDw8Ci0gICAgInZvaWQiIDw8IGVuZGwgPDwKLSAgICB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X3NldF9wcm9wZXJ0eSAoIiA8PAotICAgICAgICAiR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwgY29uc3QgR1ZhbHVlICp2YWx1ZSwgIiA8PAotICAgICAgICAiR1BhcmFtU3BlYyAqcHNwZWMpIiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGwgPDwKLSAgICAiICAiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgKmNsaWVudCA9ICIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCAob2JqZWN0KTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiAgc3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGwgPDwKLSAgICAiICB7IiA8PCBlbmRsIDw8Ci0gICAgIiAgICBjYXNlIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8Ci0gICAgICAgICJfQ0xJRU5UX0lOUFVUX1BST1RPQ09MOiIgPDwgZW5kbCA8PAotICAgICIgICAgICBjbGllbnQtPmlucHV0X3Byb3RvY29sID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7IiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIGJyZWFrOyIgPDwgZW5kbCA8PAotICAgICIgICAgY2FzZSBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PAotICAgICAgICAiX0NMSUVOVF9PVVRQVVRfUFJPVE9DT0w6IiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIGNsaWVudC0+b3V0cHV0X3Byb3RvY29sID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7IiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIGJyZWFrOyIgPDwgZW5kbCA8PAotICAgICIgIH0iIDw8IGVuZGwgPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICBlbmRsOwotCi0gIC8vIGdlbmVyYXRlIHByb3BlcnR5IGdldHRlcgotICBmX3NlcnZpY2VfIDw8Ci0gICAgInZvaWQiIDw8IGVuZGwgPDwKLSAgICB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X2dldF9wcm9wZXJ0eSAoIiA8PAotICAgICAgICAiR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwgR1ZhbHVlICp2YWx1ZSwgIiA8PAotICAgICAgICAiR1BhcmFtU3BlYyAqcHNwZWMpIiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGwgPDwKLSAgICAiICAiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgKmNsaWVudCA9ICIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCAob2JqZWN0KTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiAgc3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGwgPDwKLSAgICAiICB7IiA8PCBlbmRsIDw8Ci0gICAgIiAgICBjYXNlIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8Ci0gICAgICAgICJfQ0xJRU5UX0lOUFVUX1BST1RPQ09MOiIgPDwgZW5kbCA8PAotICAgICIgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBjbGllbnQtPmlucHV0X3Byb3RvY29sKTsiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgYnJlYWs7IiA8PCBlbmRsIDw8Ci0gICAgIiAgICBjYXNlIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8Ci0gICAgICAgICJfQ0xJRU5UX09VVFBVVF9QUk9UT0NPTDoiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgY2xpZW50LT5vdXRwdXRfcHJvdG9jb2wpOyIgPDwgZW5kbCA8PAotICAgICIgICAgICBicmVhazsiIDw8IGVuZGwgPDwKLSAgICAiICB9IiA8PCBlbmRsIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgZW5kbDsKLQotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7Ci0KLSAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcyBhbmQgZXhjZXB0aW9ucwotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotCi0gICAgLy8gRnVuY3Rpb24gZm9yIHNlbmRpbmcKLSAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24gKGdfdHlwZV92b2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nICgiX2NsaWVudF9zZW5kXyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZ1bm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOwotCi0gICAgLy8gT3BlbiB0aGUgc2VuZCBmdW5jdGlvbgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgZnVuY3Rpb25fc2lnbmF0dXJlICgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJnaW50MzIgY3NlcWlkID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJUaHJpZnRQcm90b2NvbCAqIHByb3RvY29sID0gIiA8PCAKLSAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAKLSAgICAgICAgIl9DTElFTlQgKGlmYWNlKS0+b3V0cHV0X3Byb3RvY29sOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsIFwiIiA8PAotICAgICAgICBuYW1lIDw8ICJcIiwgVF9DQUxMLCBjc2VxaWQsIGVycm9yKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotCi0gICAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlciAoZl9zZXJ2aWNlXywgYXJnX3N0cnVjdCwgIiIsICIiLCBmYWxzZSk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PAotICAgICAgICAiaWYgKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIGVycm9yKSA8IDApIiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PAotICAgICAgICAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PAotICAgICAgICAiaWYgKCF0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoIChwcm90b2NvbC0+dHJhbnNwb3J0LCBlcnJvcikpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PAotICAgICAgICAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PAotICAgICAgICAiaWYgKCF0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwgZXJyb3IpKSIgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwKLSAgICAgICAgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgCi0gICAgICAgICJyZXR1cm4gVFJVRTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIC8vIEdlbmVyYXRlIHJlY3YgZnVuY3Rpb24gb25seSBpZiBub3QgYW4gYXN5bmMgZnVuY3Rpb24KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHRfc3RydWN0IG5vYXJncyAocHJvZ3JhbV8pOwotICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0cmluZyAoIl9jbGllbnRfcmVjdl8iKSArIGZ1bm5hbWUsICZub2FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICBmdW5jdGlvbl9zaWduYXR1cmUgKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiZ2ludDMyIHJzZXFpZDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImdjaGFyICogZm5hbWU7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJUaHJpZnRNZXNzYWdlVHlwZSBtdHlwZTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIlRocmlmdFByb3RvY29sICogcHJvdG9jb2wgPSAiIDw8IAotICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwKLSAgICAgICAgICAgICAgICAgICAgICAiX0NMSUVOVCAoaWZhY2UpLT5pbnB1dF9wcm90b2NvbDsiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gIiA8PCAKLSAgICAgICAgICAgICAgICAgICAgICAiKHByb3RvY29sLCAmZm5hbWUsICZtdHlwZSwgJnJzZXFpZCwgZXJyb3IpIDwgMCkiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChtdHlwZSA9PSBUX0VYQ0VQVElPTikgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqeGNlcHRpb24gPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgTlVMTCk7IiA8PCBlbmRsIDw8Ci0KLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyaWZ0X3N0cnVjdF9yZWFkIChUSFJJRlRfU1RSVUNUICh4Y2VwdGlvbiksIHByb3RvY29sLCBOVUxMKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBOVUxMKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwgTlVMTCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUiwgeGNlcHRpb24tPnR5cGUsIFwiYXBwbGljYXRpb24gZXJyb3I6ICVzXCIsIHhjZXB0aW9uLT5tZXNzYWdlKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSBlbHNlIGlmIChtdHlwZSAhPSBUX1JFUExZKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlmIChmbmFtZSkgZ19mcmVlIChmbmFtZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgVF9TVFJVQ1QsIE5VTEwpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIE5VTEwpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChwcm90b2NvbC0+dHJhbnNwb3J0LCBOVUxMKTsiIDw8IGVuZGwgPDwgCi0gICAgICAgIGluZGVudCgpIDw8ICIgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUiwgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9JTlZBTElEX01FU1NBR0VfVFlQRSwgXCJpbnZhbGlkIG1lc3NhZ2UgdHlwZSAlZCwgZXhwZWN0ZWQgVF9SRVBMWVwiLCBtdHlwZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSBpZiAoc3RybmNtcCAoZm5hbWUsIFwiIiA8PCBuYW1lIDw8ICJcIiwgIiA8PCBuYW1lLmxlbmd0aCgpIDw8ICIpICE9IDApIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBUX1NUUlVDVCwgTlVMTCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgZXJyb3IpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChwcm90b2NvbC0+dHJhbnNwb3J0LCBlcnJvcik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUiwgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9XUk9OR19NRVRIT0RfTkFNRSwgXCJ3cm9uZyBtZXRob2QgbmFtZSAlcywgZXhwZWN0ZWQgIiA8PCBuYW1lIDw8ICJcIiwgZm5hbWUpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbCA8PCAKLSAgICAgICAgZW5kbDsKLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gICAgICB7Ci0gICAgICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgICAgIHRfZmllbGQgc3VjY2VzcygoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksICIqX3JldHVybiIsIDApOwotICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhZGQgcmVhZGVycyBmb3IgZXhjZXB0aW9ucywgZGVyZWZlcmVuY2luZyB0aGUgcG9pbnRlci4KLSAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgeF9pdGVyKyspIHsKLSAgICAgICAgICB0X2ZpZWxkICp4Y2VwdGlvbiA9IG5ldyB0X2ZpZWxkKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIqIiArICgqeF9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqeF9pdGVyKS0+Z2V0X2tleSgpKTsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kICh4Y2VwdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyIChmX3NlcnZpY2VfLCAmcmVzdWx0LCAiIiwgIiIsIGZhbHNlKTsKLSAgICAgIH0KLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgZXJyb3IpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoIXRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKHByb3RvY29sLT50cmFuc3BvcnQsIGVycm9yKSkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotCi0gICAgICAvLyBjb3B5IG92ZXIgYW55IHRocm93IGV4Y2VwdGlvbnMgYW5kIHJldHVybiBmYWlsdXJlCi0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyB4X2l0ZXIrKykgewotICAgICAgICBmX3NlcnZpY2VfIDw8IAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoKiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgZ19zZXRfZXJyb3IgKGVycm9yLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PAotICAgICAgICAgICAgICB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkpIDw8Ci0gICAgICAgICAgICAgICJfRVJST1IsICIgPDwKLSAgICAgICAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8Ci0gICAgICAgICAgICAgIHRvX3VwcGVyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSkgPDwKLSAgICAgICAgICAgICAgIl9FUlJPUl9DT0RFLCBcIiIgPDwgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8IAotICAgICAgICAgICAgICAiXCIpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIFRSVUU7IiA8PCBlbmRsOwotICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgdF9mdW5jdGlvbiBzZXJ2aWNlX2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJpbmcgKCJfY2xpZW50XyIpICsgZnVubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgIGZ1bmN0aW9uX3NpZ25hdHVyZSAoJnNlcnZpY2VfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAvLyB3cmFwIGVhY2ggZnVuY3Rpb24KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKCEiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwKLSAgICAgICAgICAgICAgICAgICAiX2NsaWVudF9zZW5kXyIgPDwgZnVubmFtZSA8PAotICAgICAgIiAoaWZhY2UiOwotCi0gICAgLy8gRGVjbGFyZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQgKj4gJmZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQgKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIsICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIiwgZXJyb3IpKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbDsKLQotICAgIC8vIGlmIG5vdCBvbmV3YXksIGltcGxlbWVudCByZWN2Ci0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdHJpbmcgcmV0ID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgPyAiIiA6ICJfcmV0dXJuLCAiOwotCi0gICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCAqPiYgeGNlcHRpb25zID0KLSAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkICo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICByZXQgKz0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgICByZXQgKz0gIiwgIjsKLSAgICAgIH0KLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCEiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwKLSAgICAgICAgICAiX2NsaWVudF9yZWN2XyIgPDwgZnVubmFtZSA8PAotICAgICAgICAgICIgKGlmYWNlLCAiIDw8IHJldCA8PCAiZXJyb3IpKSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIHJldHVybiBUUlVFIHdoaWNoIG1lYW5zIGFsbCBmdW5jdGlvbnMgd2VyZSBjYWxsZWQgT0sKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBUUlVFOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgfQotCi0gIC8vIGNyZWF0ZSB0aGUgaW50ZXJmYWNlIGluaXRpYWxpemVyCi0gIGZfc2VydmljZV8gPDwKLSAgICAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwKLSAgICB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQgKCIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlICppZmFjZSkiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAvKiBtYWtlIHRoZSBmdW5jdGlvbiBuYW1lIEMgZnJpZW5kbHkgKi8KLSAgICBzdHJpbmcgZnVubmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZfaXRlciktPmdldF9uYW1lKCkpOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgIiAgaWZhY2UtPiIgPDwgZnVubmFtZSA8PCAiID0gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8Ci0gICAgICAgICJfY2xpZW50XyIgPDwgZnVubmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIGNyZWF0ZSB0aGUgY2xpZW50IGluc3RhbmNlIGluaXRpYWxpemVyCi0gIGZfc2VydmljZV8gPDwKLSAgICAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwKLSAgICB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X2luaXQgKCIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCAqY2xpZW50KSIgPDwgZW5kbCA8PAotICAgICJ7IiA8PCBlbmRsIDw8Ci0gICAgIiAgY2xpZW50LT5pbnB1dF9wcm90b2NvbCA9IE5VTEw7IiA8PCBlbmRsIDw8Ci0gICAgIiAgY2xpZW50LT5vdXRwdXRfcHJvdG9jb2wgPSBOVUxMOyIgPDwgZW5kbCA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBjcmVhdGUgdGhlIGNsaWVudCBjbGFzcyBpbml0aWFsaXplcgotICBmX3NlcnZpY2VfIDw8Ci0gICAgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8Ci0gICAgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9jbGFzc19pbml0ICgiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnRDbGFzcyAqY2xzKSIgPDwgZW5kbCA8PAotICAgICJ7IiA8PCBlbmRsIDw8Ci0gICAgIiAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7IiA8PCBlbmRsIDw8Ci0gICAgIiAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYzsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwKLSAgICAgICAgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X3NldF9wcm9wZXJ0eTsiIDw8IGVuZGwgPDwKLSAgICAiICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PAotICAgICAgICBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfZ2V0X3Byb3BlcnR5OyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX29iamVjdCAoXCJpbnB1dF9wcm90b2NvbFwiLCIgPDwgZW5kbCA8PAotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImlucHV0IHByb3RvY29sIChjb25zdHJ1Y3QpXCIsIiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU2V0IHRoZSBjbGllbnQgaW5wdXQgcHJvdG9jb2xcIiwiIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfUFJPVE9DT0wsIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsiIDw8IGVuZGwgPDwKLSAgICAiICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCIgPDwgZW5kbCA8PAotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwKLSAgICAgICAgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UX0lOUFVUX1BST1RPQ09MLCBwYXJhbV9zcGVjKTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19vYmplY3QgKFwib3V0cHV0X3Byb3RvY29sXCIsIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3V0cHV0IHByb3RvY29sIChjb25zdHJ1Y3QpXCIsIiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU2V0IHRoZSBjbGllbnQgb3V0cHV0IHByb3RvY29sXCIsIiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MLCIgPDwgZW5kbCA8PAotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7IiA8PCBlbmRsIDw8Ci0gICAgIiAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8Ci0gICAgICAgIHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVF9PVVRQVVRfUFJPVE9DT0wsIHBhcmFtX3NwZWMpOyIgPDwgZW5kbCA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgQyBjb2RlIHRoYXQgcmVwcmVzZW50cyBhIFRocmlmdCBzZXJ2aWNlIHNlcnZlci4KLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyICh0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7Ci0gICh2b2lkKSB0c2VydmljZTsKLSAgLyogZ2V0IHNvbWUgQyBmcmllbmRseSBzZXJ2aWNlIG5hbWVzICovCi0gIHN0cmluZyBzZXJ2aWNlX25hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX25hbWVfKTsKLSAgc3RyaW5nIHNlcnZpY2VfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2Uoc2VydmljZV9uYW1lX3UpOwotCi0gIC8vIHdyaXRlIHRoZSBzZXJ2ZXIgb2JqZWN0IGluc3RhbmNlIGRlZmluaXRpb24gaW4gdGhlIGhlYWRlci4KLSAgLy8gVE9ETzogaW1wbGVtZW50IGFmdGVyIGltcGxlbWVudCBUU2VydmVyIGFuZCBUUHJvY2Vzc29yCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIEMgY29kZSB0byByZXByZXNlbnQgYSBUSHJpZnQgc3RydWN0dXJlIGFzIGEgR09iamVjdC4KLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX29iamVjdCh0X3N0cnVjdCAqdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7Ci0gIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lX3UpOwotCi0gIC8vIHdyaXRlIHRoZSBpbnN0YW5jZSBkZWZpbml0aW9uCi0gIGZfdHlwZXNfIDw8Ci0gICAgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCBlbmRsIDw8Ci0gICAgInsgIiA8PCBlbmRsIDw8Ci0gICAgIiAgVGhyaWZ0U3RydWN0IHBhcmVudDsgIiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICIgIC8qIHB1YmxpYyAqLyIgPDwgZW5kbDsKLQotICAvLyBmb3IgZWFjaCBmaWVsZCwgYWRkIGEgbWVtYmVyIHZhcmlhYmxlCi0gIGJvb2wgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOwotICB2ZWN0b3I8dF9maWVsZCAqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCAqPiAmbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUgKnQgPSBnZXRfdHJ1ZV90eXBlICgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIGZfdHlwZXNfIDw8Ci0gICAgICAiICAiIDw8IHR5cGVfbmFtZSAodCkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IHRydWU7Ci0gICAgICBmX3R5cGVzXyA8PAotICAgICAgICAiICBnYm9vbGVhbiBfX2lzc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIC8vIGNsb3NlIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiBhbmQgY3JlYXRlIGEgdHlwZWRlZgotICBmX3R5cGVzXyA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiICIgPDwgCi0gICAgICAgIHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotCi0gIC8vIHdyaXRlIHRoZSBjbGFzcyBkZWZpbml0aW9uCi0gIGZfdHlwZXNfIDw8Ci0gICAgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbCA8PAotICAgICIgIFRocmlmdFN0cnVjdENsYXNzIHBhcmVudDsiIDw8IGVuZGwgPDwKLSAgICAifTsiIDw8IGVuZGwgPDwKLSAgICAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkNsYXNzICIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkNsYXNzOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gd3JpdGUgdGhlIHN0YW5kYXJkIEdPYmplY3QgYm9pbGVycGxhdGUKLSAgZl90eXBlc18gPDwKLSAgICAiR1R5cGUgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfZ2V0X3R5cGUgKHZvaWQpOyIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgbmFtZV91YyA8PCAiICgiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9nZXRfdHlwZSgpKSIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgbmFtZV91YyA8PCAiLCAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIpKSIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIl9UWVBFXyIgPDwgbmFtZV91YyA8PCAiLCAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIgPDwgbmFtZV91YyA8PCAiKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBuYW1lX3VjIDw8ICIpKSIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IG5hbWVfdWMgPDwgIl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBuYW1lX3VjIDw8ICIpKSIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgbmFtZV91YyA8PCAiLCAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBzdGFydCB3cml0aW5nIHRoZSBvYmplY3QgaW1wbGVtZW50YXRpb24gLmMgZmlsZQotICAvLyBnZW5lcmF0ZSBzdHJ1Y3QgSS9PIG1ldGhvZHMKLSAgc3RyaW5nIHRoaXNfZ2V0ID0gdGhpcy0+bnNwYWNlICsgbmFtZSArICIgKiB0aGlzX29iamVjdCA9ICIgCi0gICAgICAgICAgICAgICAgICAgICsgdGhpcy0+bnNwYWNlX3VjICsgbmFtZV91YyArICIob2JqZWN0KTsiOwotICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyIChmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCAidGhpc19vYmplY3QtPiIsIHRoaXNfZ2V0KTsKLSAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlciAoZl90eXBlc19pbXBsXywgdHN0cnVjdCwgInRoaXNfb2JqZWN0LT4iLCB0aGlzX2dldCk7Ci0KLSAgLy8gZ2VuZXJhdGUgdGhlIGluc3RhbmNlIGluaXQgZnVuY3Rpb24KLSAgZl90eXBlc19pbXBsXyA8PAotICAgICJ2b2lkICIgPDwgZW5kbCA8PAotICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9pbnN0YW5jZV9pbml0ICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIgKiBvYmplY3QpIiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGw7Ci0KLSAgLy8gc2F0aXNmeSBjb21waWxlcnMgd2l0aCAtV2FsbCB0dXJuZWQgb24KLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAiLyogc2F0aXNmeSAtV2FsbCAqLyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChvYmplY3QpOyIgPDwgZW5kbDsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSAoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIC8vIG9ubHkgaGF2ZSBpbml0J3MgZm9yIGJhc2UgdHlwZXMKLSAgICAgIHN0cmluZyBkdmFsID0gIiA9ICI7Ci0gICAgICBpZiAodC0+aXNfZW51bSgpKSB7Ci0gICAgICAgIGR2YWwgKz0gIigiICsgdHlwZV9uYW1lICh0KSArICIpIjsKLSAgICAgIH0KLSAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICAgIGlmIChjdiAhPSBOVUxMKSB7Ci0gICAgICAgIGR2YWwgKz0gY29uc3RhbnRfdmFsdWUgKCIiLCB0LCBjdik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBkdmFsICs9IHQtPmlzX3N0cmluZygpID8gIk5VTEwiIDogIjAiOwotICAgICAgfQotICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGR2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSkgewotICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBzdHJpbmcgdHlwZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZQotICAgICAgICAoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkpOwotICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gZ19vYmplY3RfbmV3ICgiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHR5cGVfbmFtZV91YyA8PCAiLCBOVUxMKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAib2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodC0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgICBpZiAodC0+aXNfbWFwKCkgfHwgdC0+aXNfc2V0KCkpIHsKLSAgICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKLSAgICAgICAgdF90eXBlICpldHlwZSA9ICgodF9saXN0ICopIHQpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICAgIHN0cmluZyBpbml0X2Z1bmN0aW9uID0gImdfcHRyX2FycmF5X25ldygpIjsKLQotICAgICAgICBpZiAoZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgZXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOwotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICAgIGluaXRfZnVuY3Rpb24gPSBnZW5lcmF0ZV9uZXdfYXJyYXlfZnJvbV90eXBlIChldHlwZSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBhcnJheSBpbmZvIGZvciB0eXBlIjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSAiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9mdW5jdGlvbiA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgIH0KLQotICAgIC8qIGlmIG5vdCByZXF1aXJlZCwgaW5pdGlhbGl6ZSB0aGUgX19pc3NldCB2YXJpYWJsZSAqLwotICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+X19pc3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gRkFMU0U7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgIn0iIDw8IGVuZGwgPDwKLSAgZW5kbDsKLQotICAvKiBjcmVhdGUgdGhlIGRlc3RydWN0b3IgKi8KLSAgZl90eXBlc19pbXBsXyA8PAotICAgICJ2b2lkICIgPDwgZW5kbCA8PAotICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KSIgPDwgZW5kbCA8PAotICAgICJ7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgaW5kZW50KCkgPDwKLSAgICB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiICp0b2JqZWN0ID0gIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwKLSAgICBuYW1lX3VjIDw8ICIgKG9iamVjdCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl90eXBlc19pbXBsXyA8PAotICAgIGluZGVudCgpIDw8ICIvKiBzYXRpc2Z5IC1XYWxsIGluIGNhc2Ugd2UgZG9uJ3QgdXNlIHRvYmplY3QgKi8iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHRvYmplY3QpOyIgPDwgZW5kbDsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSAoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAodC0+aXNfY29udGFpbmVyKCkpIHsgCi0gICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIGlmICh0LT5pc19tYXAoKSB8fCB0LT5pc19zZXQoKSkgewotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImdfaGFzaF90YWJsZV91bnJlZiAodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIHRfdHlwZSAqZXR5cGUgPSAoKHRfbGlzdCAqKSB0KS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgICBzdHJpbmcgZGVzdHJ1Y3Rvcl9mdW5jdGlvbiA9ICJnX3B0cl9hcnJheV9mcmVlIjsKLQotICAgICAgICBpZiAoZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgZXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOwotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjogICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICAgICAgZGVzdHJ1Y3Rvcl9mdW5jdGlvbiA9ICJnX2FycmF5X2ZyZWUiOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8IGRlc3RydWN0b3JfZnVuY3Rpb24gPDwgIiAodG9iamVjdC0+IiA8PCBuYW1lIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICIsIEZBTFNFKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl90eXBlc19pbXBsXyA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotCi0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAidm9pZCAiIDw8IGVuZGwgPDwKLSAgICB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfY2xhc3NfaW5pdCAoVGhyaWZ0U3RydWN0Q2xhc3MgKiBjbHMpIiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfdHlwZXNfaW1wbF8gPDwgICAKLSAgICBpbmRlbnQoKSA8PCAiR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9ICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2ZpbmFsaXplOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJjbHMtPnJlYWQgPSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9yZWFkOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJjbHMtPndyaXRlID0gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfd3JpdGU7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLQotICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgIkdUeXBlIiA8PCBlbmRsIDw8Ci0gICAgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2dldF90eXBlICh2b2lkKSIgPDwgZW5kbCA8PAotICAgICJ7IiA8PCBlbmRsIDw8Ci0gICAgIiAgc3RhdGljIEdUeXBlIHR5cGUgPSAwOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiICBpZiAodHlwZSA9PSAwKSAiIDw8IGVuZGwgPDwKLSAgICAiICB7IiA8PCBlbmRsIDw8Ci0gICAgIiAgICBzdGF0aWMgY29uc3QgR1R5cGVJbmZvIHR5cGVfaW5mbyA9ICIgPDwgZW5kbCA8PAotICAgICIgICAgeyIgPDwgZW5kbCA8PAotICAgICIgICAgICBzaXplb2YgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkNsYXNzKSwiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgTlVMTCwgLyogYmFzZV9pbml0ICovIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIE5VTEwsIC8qIGJhc2VfZmluYWxpemUgKi8iIDw8IGVuZGwgPDwKLSAgICAiICAgICAgKEdDbGFzc0luaXRGdW5jKSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9jbGFzc19pbml0LCIgPDwgZW5kbCA8PAotICAgICIgICAgICBOVUxMLCAvKiBjbGFzc19maW5hbGl6ZSAqLyIgPDwgZW5kbCA8PAotICAgICIgICAgICBOVUxMLCAvKiBjbGFzc19kYXRhICovIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIHNpemVvZiAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiKSwiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgMCwgLyogbl9wcmVhbGxvY3MgKi8iIDw8IGVuZGwgPDwKLSAgICAiICAgICAgKEdJbnN0YW5jZUluaXRGdW5jKSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9pbnN0YW5jZV9pbml0LCIgPDwgZW5kbCA8PAotICAgICIgICAgICBOVUxMLCAvKiB2YWx1ZV90YWJsZSAqLyIgPDwgZW5kbCA8PAotICAgICIgICAgfTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiAgICB0eXBlID0gZ190eXBlX3JlZ2lzdGVyX3N0YXRpYyAoVEhSSUZUX1RZUEVfU1RSVUNULCAiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIlR5cGVcIiwiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZV9pbmZvLCAwKTsiIDw8IGVuZGwgPDwKLSAgICAiICB9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICIgIHJldHVybiB0eXBlOyIgPDwgZW5kbCA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgZnVuY3Rpb25zIHRvIHdyaXRlIFRocmlmdCBzdHJ1Y3R1cmVzIHRvIGEgc3RyZWFtLgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3dyaXRlciAob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCAqdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX2dldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2Z1bmN0aW9uKSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgc3RyaW5nIG5hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKLSAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKG5hbWVfdSk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQgKj4gJmZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3RvciA8dF9maWVsZCAqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBpbnQgZXJyb3JfcmV0ID0gMDsKLQotICBpZiAoaXNfZnVuY3Rpb24pIHsKLSAgICBlcnJvcl9yZXQgPSAtMTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImdpbnQzMiIgPDwgZW5kbCA8PAotICAgICAgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PAotICAgICAgIl93cml0ZSAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpIiA8PCBlbmRsOwotICB9Ci0gIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiZ2ludDMyIHJldDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZ2ludDMyIHhmZXIgPSAwOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgdGhpc19nZXQgPDwgZW5kbDsKLSAgLy8gc2F0aXNmeSAtV2FsbCBpbiB0aGUgY2FzZSBvZiBhbiBlbXB0eSBzdHJ1Y3QKLSAgaWYgKCF0aGlzX2dldC5lbXB0eSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIlRIUklGVF9VTlVTRURfVkFSICh0aGlzX29iamVjdCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsIFwiIiA8PCBuYW1lIDw8ICJcIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXNfb2JqZWN0LT5fX2lzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gVFJVRSkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0gCi0KLSAgICBvdXQgPDwKLSAgICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgIiA8PAotICAgICAiXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIgPDwKLSAgICAgdHlwZV90b19lbnVtICgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAob3V0LCAqZl9pdGVyLCB0aGlzX25hbWUsICIiLCBlcnJvcl9yZXQpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOwotCi0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvLyB3cml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGlmIChpc19mdW5jdGlvbikgewotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4geGZlcjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSB0byByZWFkIFRocmlmdCBzdHJ1Y3R1cmVzIGZyb20gYSBzdHJlYW0uCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCAqdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19nZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2Z1bmN0aW9uKSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgc3RyaW5nIG5hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKLSAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKG5hbWVfdSk7Ci0gIGludCBlcnJvcl9yZXQgPSAwOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCAqPiAmZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yIDx0X2ZpZWxkICo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaWYgKGlzX2Z1bmN0aW9uKSB7Ci0gICAgZXJyb3JfcmV0ID0gLTE7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIvKiByZWFkcyBhICIgPDwgbmFtZV91IDw8ICIgb2JqZWN0ICovIiA8PCBlbmRsIDw8Ci0gICAgICAiZ2ludDMyIiA8PCBlbmRsIDw8Ci0gICAgICB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8Ci0gICAgICAgICAgIl9yZWFkIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gZGVjbGFyZSBzdGFjayB0ZW1wIHZhcmlhYmxlcwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiZ2ludDMyIHJldDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZ2ludDMyIHhmZXIgPSAwOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJnY2hhciAqbmFtZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiVGhyaWZ0VHlwZSBmdHlwZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZ2ludDE2IGZpZDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBsZW4gPSAwOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJncG9pbnRlciBkYXRhID0gTlVMTDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCB0aGlzX2dldCA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJnYm9vbGVhbiBpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gRkFMU0U7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIG91dCA8PCBlbmRsOwotCi0gIC8vIHNhdGlzZnkgLVdhbGwgaW4gY2FzZSB3ZSBkb24ndCB1c2Ugc29tZSB2YXJpYWJsZXMKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIi8qIHNhdGlzZnkgLVdhbGwgaW4gY2FzZSB0aGVzZSBhcmVuJ3QgdXNlZCAqLyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAobGVuKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKGRhdGEpOyIgPDwgZW5kbDsKLQotICBpZiAoIXRoaXNfZ2V0LmVtcHR5KCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSICh0aGlzX29iamVjdCk7IiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCBlbmRsOwotCi0gIC8vIHJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RydWN0dXJlIG1hcmtlcgotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiLyogcmVhZCB0aGUgc3RydWN0IGJlZ2luIG1hcmtlciAqLyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAobmFtZSkgZ19mcmVlIChuYW1lKTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIHJlYWQgdGhlIHN0cnVjdCBmaWVsZHMKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIHN0cnVjdCBmaWVsZHMgKi8iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAid2hpbGUgKDEpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIC8vIHJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiLyogcmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgZmllbGQgKi8iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCAmZnR5cGUsICZmaWQsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gY2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICIvKiBicmVhayBpZiB3ZSBnZXQgYSBTVE9QIGZpZWxkICovIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIChmdHlwZSA9PSBUX1NUT1ApIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gc3dpdGNoIGRlcGVuZGluZyBvbiB0aGUgZmllbGQgdHlwZQotICBpbmRlbnQob3V0KSA8PAotICAgICJzd2l0Y2ggKGZpZCkiIDw8IGVuZGw7Ci0KLSAgLy8gc3RhcnQgc3dpdGNoCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgLy8gZ2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIHR5cGVzCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpZiAoZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0gKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ7IiA8PCBlbmRsOwotCi0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICAvLyBnZW5lcmF0ZSBkZXNlcmlhbGl6ZSBmaWVsZAotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkIChvdXQsICpmX2l0ZXIsIHRoaXNfbmFtZSwgIiIsIGVycm9yX3JldCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZnR5cGUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIC8vIGNyZWF0ZSB0aGUgZGVmYXVsdCBjYXNlCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBmdHlwZSwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGw7Ci0KLSAgLy8gZW5kIHN3aXRjaAotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgLy8gcmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7Ci0KLSAgLy8gZW5kIHdoaWxlIGxvb3AKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICAvLyByZWFkIHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gaWYgYSByZXF1aXJlZCBmaWVsZCBpcyBtaXNzaW5nLCB0aHJvdyBhbiBlcnJvcgotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICghaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfSU5WQUxJRF9EQVRBLCIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgXCJtaXNzaW5nIGZpZWxkXCIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gLTE7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGlzX2Z1bmN0aW9uKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJyZXR1cm4geGZlcjsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBlbmQgdGhlIGZ1bmN0aW9uL3N0cnVjdHVyZQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkICp0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKLSAgdF90eXBlICp0eXBlID0gZ2V0X3RydWVfdHlwZSAodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgKyBzdWZmaXg7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgKG91dCwgKHRfc3RydWN0ICopIHR5cGUsIG5hbWUsIGVycm9yX3JldCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyIChvdXQsIHR5cGUsIG5hbWUsIGVycm9yX3JldCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV8iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSAqKSB0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiCi0gICAgICAgICAgICAgICAgKyBuYW1lOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgb3V0IDw8ICJib29sIChwcm90b2NvbCwgIiA8PCBuYW1lOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgb3V0IDw8ICJieXRlIChwcm90b2NvbCwgIiA8PCBuYW1lOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBvdXQgPDwgImkxNiAocHJvdG9jb2wsICIgPDwgbmFtZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgb3V0IDw8ICJpMzIgKHByb3RvY29sLCAiIDw8IG5hbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIG91dCA8PCAiaTY0IChwcm90b2NvbCwgIiA8PCBuYW1lOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBvdXQgPDwgImRvdWJsZSAocHJvdG9jb2wsICIgPDwgbmFtZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUgKikgdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgICBvdXQgPDwgImJpbmFyeSAocHJvdG9jb2wsICgoR0J5dGVBcnJheSAqKSAiIDw8IG5hbWUgPDwKLSAgICAgICAgICAgICAgICAgICAiKS0+ZGF0YSwgKChHQnl0ZUFycmF5ICopICIgPDwgbmFtZSA8PAotICAgICAgICAgICAgICAgICAgICIpLT5sZW4iOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQgPDwgInN0cmluZyAocHJvdG9jb2wsICIgPDwgbmFtZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIHdyaXRlciBmb3IgYmFzZSB0eXBlICIKLSAgICAgICAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSAodGJhc2UpICsgbmFtZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJpMzIgKHByb3RvY29sLCAoZ2ludDMyKSAiIDw8IG5hbWU7Ci0gICAgfQotICAgIG91dCA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYgKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICAgbmFtZS5jX3N0cigpLCB0eXBlX25hbWUgKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCAqdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUICgiIDw8IHByZWZpeCA8PCAiKSwgcHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlICp0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBsZW5ndGggPSAiZ19oYXNoX3RhYmxlX3NpemUgKChHSGFzaFRhYmxlICopICIgKyBwcmVmaXggKyAiKSI7Ci0gICAgdF90eXBlICp0a2V5ID0gKCh0X21hcCAqKSB0dHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSAqdHZhbCA9ICgodF9tYXAgKikgdHR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBzdHJpbmcgdGtleV9uYW1lID0gdHlwZV9uYW1lICh0a2V5KTsKLSAgICBzdHJpbmcgdHZhbF9uYW1lID0gdHlwZV9uYW1lICh0dmFsKTsKLSAgICBzdHJpbmcgdGtleV9wdHIgPSB0a2V5LT5pc19zdHJpbmcoKSB8fCAhdGtleS0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKLSAgICBzdHJpbmcgdHZhbF9wdHIgPSB0dmFsLT5pc19zdHJpbmcoKSB8fCAhdHZhbC0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKLQotICAgIC8qCi0gICAgICogU29tZSB1Z2xpbmVzcyBoZXJlLiAgVG8gbWF4aW1pemUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHdlCi0gICAgICogYXZvaWQgdXNpbmcgR0hhc2hUYWJsZUl0ZXIgYW5kIGluc3RlYWQgZ2V0IGEgR0xpc3Qgb2YgYWxsIGtleXMsCi0gICAgICogdGhlbiBjb3B5IGl0IGludG8gYSBhcnJheSBvbiB0aGUgc3RhY2ssIGFuZCBmcmVlIGl0LgotICAgICAqIFRoaXMgaXMgYmVjYXVzZSB3ZSBtYXkgZXhpdCBlYXJseSBiZWZvcmUgd2UgZ2V0IGEgY2hhbmNlIHRvIGZyZWUgdGhlCi0gICAgICogR0xpc3QuCi0gICAgICovCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgIiA8PAotICAgICAgICAgICAgICAgICAgIHR5cGVfdG9fZW51bSAodGtleSkgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0gKHR2YWwpIDw8Ci0gICAgICAgICAgICAgICAgICAgIiwgKGdpbnQzMikgIiA8PCBsZW5ndGggPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJHTGlzdCAqa2V5X2xpc3QgPSBOVUxMLCAqaXRlciA9IE5VTEw7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCB0a2V5X25hbWUgPDwgdGtleV9wdHIgPDwgIiBrZXk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCB0dmFsX25hbWUgPDwgdHZhbF9wdHIgPDwgIiB2YWx1ZTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJnX2hhc2hfdGFibGVfZm9yZWFjaCAoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXggPDwgCi0gICAgICAgICAgICAgICAgICAgIiwgdGhyaWZ0X2hhc2hfdGFibGVfZ2V0X2tleXMsICZrZXlfbGlzdCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCB0a2V5X25hbWUgPDwgdGtleV9wdHIgPDwKLSAgICAgICAgICAgICAgICAgICAiIGtleXNbZ19saXN0X2xlbmd0aCAoa2V5X2xpc3QpXTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpbnQgaT0wLCBrZXlfY291bnQgPSBnX2xpc3RfbGVuZ3RoIChrZXlfbGlzdCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PAotICAgICAgICAiZm9yIChpdGVyID0gZ19saXN0X2ZpcnN0IChrZXlfbGlzdCk7IGl0ZXI7IGl0ZXIgPSBpdGVyLT5uZXh0KSIgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGtleXNbaSsrXSA9ICgiIDw8IHRrZXlfbmFtZSA8PCB0a2V5X3B0ciA8PAotICAgICAgICAgICAgICAgICAgICIpIGl0ZXItPmRhdGE7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImdfbGlzdF9mcmVlIChrZXlfbGlzdCk7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZm9yIChpID0gMDsgaSA8IGtleV9jb3VudDsgKytpKSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAia2V5ID0ga2V5c1tpXTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ2YWx1ZSA9ICgiIDw8IHR2YWxfbmFtZSA8PCB0dmFsX3B0ciA8PAotICAgICAgICAgICAgICAgICAgICIpIGdfaGFzaF90YWJsZV9sb29rdXAgKCgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeCA8PAotICAgICAgICAgICAgICAgICAgICIpLCAoZ3BvaW50ZXIpIGtleSk7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAob3V0LCAodF9tYXAgKikgdHR5cGUsIHRrZXlfcHRyICsgIiBrZXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHZhbF9wdHIgKyAiIHZhbHVlIiwgZXJyb3JfcmV0KTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIGxlbmd0aCA9ICJnX2hhc2hfdGFibGVfc2l6ZSAoKEdIYXNoVGFibGUgKikgIiArIHByZWZpeCArICIpIjsKLSAgICB0X3R5cGUgKnRlbGVtID0gKCh0X3NldCAqKSB0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBzdHJpbmcgdGVsZW1fbmFtZSA9IHR5cGVfbmFtZSAodGVsZW0pOwotICAgIHN0cmluZyB0ZWxlbV9wdHIgPSB0ZWxlbS0+aXNfc3RyaW5nKCkgfHwgIXRlbGVtLT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAocHJvdG9jb2wsICIgPDwKLSAgICAgICAgICAgICAgICAgICB0eXBlX3RvX2VudW0gKHRlbGVtKSA8PCAiLCAoZ2ludDMyKSAiIDw8IGxlbmd0aCA8PAotICAgICAgICAgICAgICAgICAgICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiR0xpc3QgKmtleV9saXN0ID0gTlVMTCwgKml0ZXIgPSBOVUxMOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgdGVsZW1fbmFtZSA8PCB0ZWxlbV9wdHIgPDwgIiBlbGVtOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImdwb2ludGVyIHZhbHVlOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImdfaGFzaF90YWJsZV9mb3JlYWNoICgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeCA8PAotICAgICAgICAgICAgICAgICAgICIsIHRocmlmdF9oYXNoX3RhYmxlX2dldF9rZXlzLCAma2V5X2xpc3QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgdGVsZW1fbmFtZSA8PCB0ZWxlbV9wdHIgPDwgImtleXNbZ19saXN0X2xlbmd0aCAoa2V5X2xpc3QpXTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpbnQgaT0wLCBrZXlfY291bnQgPSBnX2xpc3RfbGVuZ3RoIChrZXlfbGlzdCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZm9yIChpdGVyID0gZ19saXN0X2ZpcnN0IChrZXlfbGlzdCk7IGl0ZXI7IGl0ZXIgPSBpdGVyLT5uZXh0KSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGtleXNbaSsrXSA9ICgiIDw8IHRlbGVtX25hbWUgPDwgdGVsZW1fcHRyIDw8ICIpIGl0ZXItPmRhdGE7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImdfbGlzdF9mcmVlIChrZXlfbGlzdCk7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZm9yIChpPTA7IGk8a2V5X2NvdW50OyArK2kpIiA8PCBlbmRsOwotCi0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJlbGVtID0ga2V5c1tpXTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ2YWx1ZSA9IChncG9pbnRlcikgZ19oYXNoX3RhYmxlX2xvb2t1cCAoKChHSGFzaFRhYmxlICopICIgPDwKLSAgICAgICAgICAgICAgICAgICBwcmVmaXggPDwgIiksIChncG9pbnRlcikgZWxlbSk7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudCAob3V0LCAodF9zZXQgKikgdHR5cGUsIHRlbGVtX3B0ciArICJlbGVtIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3JldCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBzdHJpbmcgbGVuZ3RoID0gcHJlZml4ICsgIi0+bGVuIjsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgIiA8PAotICAgICAgICAgICAgICAgICAgIHR5cGVfdG9fZW51bSAoKCh0X2xpc3QgKikgdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8Ci0gICAgICAgICAgICAgICAgICAgIiwgKGdpbnQzMikgIiA8PCBsZW5ndGggPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJndWludCBpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImZvciAoaT0wOyBpPCIgPDwgbGVuZ3RoIDw8ICI7IGkrKykiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKG91dCwgKHRfbGlzdCAqKSB0dHlwZSwgcHJlZml4LCAiaSIsIGVycm9yX3JldCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCAqdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7Ci0gIHRfZmllbGQga2ZpZWxkICh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkIChvdXQsICZrZmllbGQsICIiLCAiIiwgZXJyb3JfcmV0KTsKLQotICB0X2ZpZWxkIHZmaWVsZCAodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbHVlKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkIChvdXQsICZ2ZmllbGQsICIiLCAiIiwgZXJyb3JfcmV0KTsKLX0KLQotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCAqdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKLSAgdF9maWVsZCBlZmllbGQgKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbWVudCk7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAob3V0LCAmZWZpZWxkLCAiIiwgIiIsIGVycm9yX3JldCk7Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QgKnRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7Ci0gIHRfdHlwZSAqdHR5cGUgPSB0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpOwotCi0gIC8vIGNhc3QgdG8gbm9uLWNvbnN0Ci0gIHN0cmluZyBuYW1lID0gImdfcHRyX2FycmF5X2luZGV4ICgoR1B0ckFycmF5ICopICIgKyBsaXN0ICsgIiwgIgotICAgICAgICAgICAgICAgICsgaW5kZXggKyAiKSI7Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlICopIHR0eXBlKS0+Z2V0X2Jhc2UoKTsgCi0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgYXJyYXkgdHlwZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBuYW1lID0gImdfYXJyYXlfaW5kZXggKCIgKyBsaXN0ICsgIiwgZ2Jvb2xlYW4sICIgKyBpbmRleCArICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG5hbWUgPSAiZ19hcnJheV9pbmRleCAoIiArIGxpc3QgKyAiLCBnaW50OCwgIiArIGluZGV4ICsgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBuYW1lID0gImdfYXJyYXlfaW5kZXggKCIgKyBsaXN0ICsgIiwgZ2ludDE2LCAiICsgaW5kZXggKyAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG5hbWUgPSAiZ19hcnJheV9pbmRleCAoIiArIGxpc3QgKyAiLCBnaW50MzIsICIgKyBpbmRleCArICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgbmFtZSA9ICJnX2FycmF5X2luZGV4ICgiICsgbGlzdCArICIsIGdpbnQ2NCwgIiArIGluZGV4ICsgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBuYW1lID0gImdfYXJyYXlfaW5kZXggKCIgKyBsaXN0ICsgIiwgZ2RvdWJsZSwgIiArIGluZGV4ICsgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7Ci0gICAgfQotICB9Ci0KLSAgdF9maWVsZCBlZmllbGQgKHR0eXBlLCBuYW1lKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkIChvdXQsICZlZmllbGQsICIiLCAiIiwgZXJyb3JfcmV0KTsKLX0KLQotLyogZGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkICp0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKLSAgdF90eXBlICp0eXBlID0gZ2V0X3RydWVfdHlwZSAodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgKyBzdWZmaXg7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgKG91dCwgKHRfc3RydWN0ICopIHR5cGUsIG5hbWUsIGVycm9yX3JldCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgKG91dCwgdHlwZSwgbmFtZSwgZXJyb3JfcmV0KTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlICopIHR5cGUpLT5nZXRfYmFzZSgpOwotCi0gICAgaW5kZW50KG91dCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfIjsKLQotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSAqKSB0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgImJpbmFyeSAocHJvdG9jb2wsICZkYXRhLCAmbGVuIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgInN0cmluZyAocHJvdG9jb2wsICYiIDw8IG5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAiYm9vbCAocHJvdG9jb2wsICYiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgImJ5dGUgKHByb3RvY29sLCAmIiA8PCBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgImkxNiAocHJvdG9jb2wsICYiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAiaTMyIChwcm90b2NvbCwgJiIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJpNjQgKHByb3RvY29sLCAmIiA8PCBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgImRvdWJsZSAocHJvdG9jb2wsICYiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIHJlYWRlciBmb3IgYmFzZSB0eXBlICIKLSAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSAodGJhc2UpICsgbmFtZTsKLSAgICB9Ci0gICAgb3V0IDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7Ci0KLSAgICAvLyBsb2FkIHRoZSBieXRlIGFycmF5IHdpdGggdGhlIGRhdGEKLSAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HCi0gICAgICAgICYmICgodF9iYXNlX3R5cGUgKikgdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBnX2J5dGVfYXJyYXlfbmV3KCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImdfYnl0ZV9hcnJheV9hcHBlbmQgKCIgPDwgbmFtZSA8PCAiLCAoZ3VpbnQ4ICopIGRhdGEsIChndWludCkgbGVuKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiZ19mcmVlIChkYXRhKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHN0cmluZyB0ID0gdG1wICgiZWNhc3QiKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJnaW50MzIgIiA8PCB0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmIiA8PCB0IDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSAoIiA8PCB0eXBlX25hbWUgKHR5cGUpIDw8ICIpIiA8PCB0IDw8ICI7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZiAoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUgKHR5cGUpLmNfc3RyKCkpOwotICB9Ci0KLSAgLy8gaWYgdGhlIHR5cGUgaXMgbm90IHJlcXVpcmVkIGFuZCB0aGlzIGlzIGEgdGhyaWZ0IHN0cnVjdCAobm8gcHJlZml4KSwKLSAgLy8gc2V0IHRoZSBpc3NldCB2YXJpYWJsZS4gIGlmIHRoZSB0eXBlIGlzIHJlcXVpcmVkLCB0aGVuIHNldCB0aGUKLSAgLy8gbG9jYWwgdmFyaWFibGUgaW5kaWNhdGluZyB0aGUgdmFsdWUgd2FzIHNldCwgc28gdGhhdCB3ZSBjYW4gZG8gICAgLy8gdmFsaWRhdGlvbiBsYXRlci4KLSAgaWYgKHRmaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQgJiYgcHJlZml4ICE9ICIiKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJfX2lzc2V0XyIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8IHN1ZmZpeCA8PCAiID0gVFJVRTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCAmJiBwcmVmaXggIT0gIiIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXNzZXRfIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IFRSVUU7IiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QgKnRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKLSAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0c3RydWN0LT5nZXRfbmFtZSgpKSk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gZ19vYmplY3RfbmV3ICgiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IG5hbWVfdWMgPDwgIiwgTlVMTCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3N0cnVjdF9yZWFkIChUSFJJRlRfU1RSVUNUICgiIDw8IHByZWZpeCA8PCAiKSwgcHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgKG9mc3RyZWFtICZvdXQsIHRfdHlwZSAqdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBzaXplOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIlRocmlmdFR5cGUga2V5X3R5cGU7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiVGhyaWZ0VHlwZSB2YWx1ZV90eXBlOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIG1hcCBiZWdpbiBtYXJrZXIgKi8iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsICZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsICZzaXplLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLQotICAgIC8vIGl0ZXJhdGUgb3ZlciBtYXAgZWxlbWVudHMKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIvKiBpdGVyYXRlIHRocm91Z2ggZWFjaCBvZiB0aGUgbWFwJ3MgZmllbGRzICovIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgKG91dCwgKHRfbWFwICopIHR0eXBlLCBwcmVmaXgsIGVycm9yX3JldCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotICAKLSAgICAvLyByZWFkIG1hcCBlbmQKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIvKiByZWFkIHRoZSBtYXAgZW5kIG1hcmtlciAqLyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImd1aW50MzIgc2l6ZTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9iZWdpbiAocHJvdG9jb2wsICZlbGVtZW50X3R5cGUsICZzaXplLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLQotICAgIC8vIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIvKiBpdGVyYXRlIHRocm91Z2ggdGhlIHNldCBlbGVtZW50cyAqLyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImd1aW50MzIgaTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpKSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQgKG91dCwgKHRfc2V0ICopIHR0eXBlLCBwcmVmaXgsIGVycm9yX3JldCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgLy8gcmVhZCBzZXQgZW5kCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImd1aW50MzIgc2l6ZTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLCAmc2l6ZSwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIvKiBpdGVyYXRlIHRocm91Z2ggbGlzdCBlbGVtZW50cyAqLyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImd1aW50MzIgaTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChvdXQsICh0X2xpc3QgKikgdHR5cGUsIHByZWZpeCwgImkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfcmV0KTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8IAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCAqdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKLSAgdF90eXBlICp0a2V5ID0gdG1hcC0+Z2V0X2tleV90eXBlKCk7Ci0gIHRfdHlwZSAqdHZhbCA9IHRtYXAtPmdldF92YWxfdHlwZSgpOwotICBzdHJpbmcgdGtleV9uYW1lID0gdHlwZV9uYW1lICh0a2V5KTsKLSAgc3RyaW5nIHR2YWxfbmFtZSA9IHR5cGVfbmFtZSAodHZhbCk7Ci0gIHN0cmluZyB0a2V5X3B0ciA9IHRrZXktPmlzX3N0cmluZygpIHx8ICF0a2V5LT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOwotICBzdHJpbmcgdHZhbF9wdHIgPSB0dmFsLT5pc19zdHJpbmcoKSB8fCAhdHZhbC0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKLQotICBzdHJpbmcga2V5bmFtZSA9IHRtcCgia2V5Iik7Ci0gIHN0cmluZyB2YWxuYW1lID0gdG1wKCJ2YWwiKTsKLQotICBpZiAodGtleS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IHRrZXlfbmFtZSA8PCB0a2V5X3B0ciA8PCAiICIgPDwga2V5bmFtZSA8PCAiID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgdGtleV9uYW1lIDw8IHRrZXlfcHRyIDw8ICIgIiA8PCBrZXluYW1lIDw8ICh0a2V5X3B0ciAhPSAiIiA/ICIgPSBnX25ldyAoIiArIHRrZXlfbmFtZSArICIsIDEpIiA6ICIiKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICh0dmFsLT5pc19tYXAoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgdHZhbF9uYW1lIDw8IHR2YWxfcHRyIDw8ICIgIiA8PCB2YWxuYW1lIDw8ICIgPSBnX2hhc2hfdGFibGVfbmV3IChOVUxMLCBOVUxMKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCB0dmFsX25hbWUgPDwgdHZhbF9wdHIgPDwgIiAiIDw8IHZhbG5hbWUgPDwgKHR2YWxfcHRyICE9ICIiID8gIiA9IGdfbmV3ICgiICsgdHZhbF9uYW1lICsgIiwgMSkiIDogIiIpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gZGVzZXJpYWxpemUgdGhlIGZpZWxkcyBvZiB0aGUgbWFwIGVsZW1lbnQKLSAgdF9maWVsZCBma2V5ICh0a2V5LCB0a2V5X3B0ciArIGtleW5hbWUpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAob3V0LCAmZmtleSwgIiIsICIiLCBlcnJvcl9yZXQpOwotICB0X2ZpZWxkIGZ2YWwgKHR2YWwsIHR2YWxfcHRyICsgdmFsbmFtZSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkIChvdXQsICZmdmFsLCAiIiwgIiIsIGVycm9yX3JldCk7Ci0KLSAgLy8gaW5zZXJ0IGludG8gdGhlIGhhc2h0YWJsZS4gIGlmIHRoZSBmaWVsZCBpcyBub3QgYSBwb2ludGVyLCB0aGVuIHVzZQotICAvLyB0aGUgYWRkcmVzcyBvZiB0aGUgb2JqZWN0LgotICBpbmRlbnQob3V0KSA8PAotICAgICJnX2hhc2hfdGFibGVfaW5zZXJ0ICgoR0hhc2hUYWJsZSAqKSIgPDwgcHJlZml4IDw8ICIsIChncG9pbnRlcikgIiA8PCAodGtleV9wdHIgIT0gIiIgPyAiIiA6ICImIikgPDwga2V5bmFtZSA8PCAiLCAoZ3BvaW50ZXIpICIgPDwgKHR2YWxfcHRyICE9ICIiID8gIiIgOiAiJiIpIDw8IHZhbG5hbWUgPDwgIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCAqdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKLSAgdF90eXBlICp0ZWxlbSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKLSAgc3RyaW5nIHRlbGVtX25hbWUgPSB0eXBlX25hbWUgKHRlbGVtKTsKLSAgc3RyaW5nIHRlbGVtX3B0ciA9IHRlbGVtLT5pc19zdHJpbmcoKSB8fCAhdGVsZW0tPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7Ci0KLSAgaWYgKHRlbGVtLT5pc19tYXAoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgdGVsZW1fbmFtZSA8PCB0ZWxlbV9wdHIgPDwgIiBlbGVtID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgdGVsZW1fbmFtZSA8PCB0ZWxlbV9wdHIgPDwgIiBlbGVtIiA8PCAodGVsZW1fcHRyICE9ICIiID8gIiA9IGdfbmV3ICgiICsgdGVsZW1fbmFtZSArICIsIDEpIiA6ICIiKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIHRfZmllbGQgZmVsZW0gKHRlbGVtLCB0ZWxlbV9wdHIgKyAiZWxlbSIpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAob3V0LCAmZmVsZW0sICIiLCAiIiwgZXJyb3JfcmV0KTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJnX2hhc2hfdGFibGVfaW5zZXJ0ICgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeCA8PCAiLCAoZ3BvaW50ZXIpIGVsZW0sIChncG9pbnRlcikgMSk7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCAqdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewotICAodm9pZCkgaW5kZXg7Ci0gIHN0cmluZyBlbGVtID0gdG1wICgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSAodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCAoJmZlbGVtLCB0cnVlKSA8PCBlbmRsOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAob3V0LCAmZmVsZW0sICIiLCAiIiwgZXJyb3JfcmV0KTsKLQotICBpbmRlbnQob3V0KTsKLQotICB0X3R5cGUgKnR0eXBlID0gdGxpc3QtPmdldF9lbGVtX3R5cGUoKTsKLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlICopIHR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBvdXQgPDwgImdfcHRyX2FycmF5X2FkZCAoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAiZ19hcnJheV9hcHBlbmRfdmFsICgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotICAgICAgICByZXR1cm47Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGFycmF5IGluZm8gZm9yIHR5cGUiOwotICAgIH0KLSAgfQotICBvdXQgPDwgImdfcHRyX2FycmF5X2FkZCAoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlICh0X3R5cGUgKiB0dHlwZSkgewotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGhhc2ggdHlwZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZXR1cm4gImdfaGFzaF90YWJsZV9uZXcgKHRocmlmdF9nYm9vbGVhbl9oYXNoLCB0aHJpZnRfZ2Jvb2xlYW5fZXF1YWwpOyI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIHJldHVybiAiZ19oYXNoX3RhYmxlX25ldyAodGhyaWZ0X2dpbnQ4X2hhc2gsIHRocmlmdF9naW50OF9lcXVhbCk7IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICByZXR1cm4gImdfaGFzaF90YWJsZV9uZXcgKHRocmlmdF9naW50MTZfaGFzaCwgdGhyaWZ0X2dpbnQxNl9lcXVhbCk7IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICByZXR1cm4gImdfaGFzaF90YWJsZV9uZXcgKHRocmlmdF9naW50MzJfaGFzaCwgdGhyaWZ0X2dpbnQzMl9lcXVhbCk7IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXR1cm4gImdfaGFzaF90YWJsZV9uZXcgKHRocmlmdF9naW50NjRfaGFzaCwgdGhyaWZ0X2dpbnQ2NF9lcXVhbCk7IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXR1cm4gImdfaGFzaF90YWJsZV9uZXcgKHRocmlmdF9nZG91YmxlX2hhc2gsIHRocmlmdF9nZG91YmxlX2VxdWFsKTsiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJldHVybiAiZ19oYXNoX3RhYmxlX25ldyAoZ19zdHJfaGFzaCwgZ19zdHJfZXF1YWwpOyI7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGhhc2ggdGFibGUgaW5mbyBmb3IgdHlwZSI7Ci0gICAgfQotICB9Ci0gIHJldHVybiAiZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7IjsKLX0KLQotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV3X2FycmF5X2Zyb21fdHlwZSh0X3R5cGUgKiB0dHlwZSkgewotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmV0dXJuICJnX2FycmF5X25ldyAoMCwgMSwgc2l6ZW9mIChnYm9vbGVhbikpOyI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIHJldHVybiAiZ19hcnJheV9uZXcgKDAsIDEsIHNpemVvZiAoZ2ludDgpKTsiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIHJldHVybiAiZ19hcnJheV9uZXcgKDAsIDEsIHNpemVvZiAoZ2ludDE2KSk7IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICByZXR1cm4gImdfYXJyYXlfbmV3ICgwLCAxLCBzaXplb2YgKGdpbnQzMikpOyI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmV0dXJuICJnX2FycmF5X25ldyAoMCwgMSwgc2l6ZW9mIChnaW50NjQpKTsiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJldHVybiAiZ19hcnJheV9uZXcgKDAsIDEsIHNpemVvZiAoZ2RvdWJsZSkpOyI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmV0dXJuICJnX3B0cl9hcnJheV9uZXcoKTsiOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBhcnJheSBpbmZvIGZvciB0eXBlIjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuICJnX3B0cl9hcnJheV9uZXcoKTsiOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFVUSUxJVFkgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogVXBwZXIgY2FzZSBhIHN0cmluZy4gIFdyYXBzIGJvb3N0J3Mgc3RyaW5nIHV0aWxpdHkuCi0gKi8KLXN0cmluZyB0b191cHBlcl9jYXNlKHN0cmluZyBuYW1lKSB7Ci0gIHN0cmluZyBzIChuYW1lKTsKLSAgc3RkOjp0cmFuc2Zvcm0gKHMuYmVnaW4oKSwgcy5lbmQoKSwgcy5iZWdpbigpLCA6OnRvdXBwZXIpOwotICByZXR1cm4gczsKLS8vICByZXR1cm4gYm9vc3Q6OnRvX3VwcGVyX2NvcHkgKG5hbWUpOwotfQotCi0vKioKLSAqIExvd2VyIGNhc2UgYSBzdHJpbmcuICBXcmFwcyBib29zdCdzIHN0cmluZyB1dGlsaXR5LgotICovCi1zdHJpbmcgdG9fbG93ZXJfY2FzZShzdHJpbmcgbmFtZSkgewotICBzdHJpbmcgcyAobmFtZSk7Ci0gIHN0ZDo6dHJhbnNmb3JtIChzLmJlZ2luKCksIHMuZW5kKCksIHMuYmVnaW4oKSwgOjp0b2xvd2VyKTsKLSAgcmV0dXJuIHM7Ci0vLyAgcmV0dXJuIGJvb3N0Ojp0b19sb3dlcl9jb3B5IChuYW1lKTsKLX0KLQotLyoqCi0gKiBNYWtlcyBhIHN0cmluZyBmcmllbmRseSB0byBDIGNvZGUgc3RhbmRhcmRzIGJ5IGxvd2VyY2FzaW5nIGFuZCBhZGRpbmcKLSAqIHVuZGVyc2NvcmVzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3Rlci4gIEZvciBleGFtcGxlOgotICoKLSAqIElucHV0OiAiWm9tZ0NhbWVsQ2FzZSIKLSAqIE91dHB1dDogInpvbWdfY2FtZWxfY2FzZSIKLSAqLwotc3RyaW5nIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzdHJpbmcgbmFtZSkgewotICBzdHJpbmcgcmV0OwotICBjb25zdCBjaGFyICp0bXAgPSBuYW1lLmNfc3RyKCk7Ci0gIGludCBwb3MgPSAwOwotCi0gIC8qIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXNuJ3QgdW5kZXJzY29yZWQgaWYgdXBwZXJjYXNlLCBqdXN0IGxvd2VyY2FzZWQgKi8KLSAgcmV0ICs9IHRvbG93ZXIgKHRtcFtwb3NdKTsKLSAgcG9zKys7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSBwb3M7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKLSAgICBjaGFyIGxjID0gdG9sb3dlciAodG1wW2ldKTsgCi0gICAgaWYgKGxjICE9IHRtcFtpXSkgewotICAgICAgcmV0ICs9ICdfJzsKLSAgICB9Ci0gICAgcmV0ICs9IGxjOwotICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogcmVnaXN0ZXIgdGhpcyBnZW5lcmF0b3Igd2l0aCB0aGUgbWFpbiBwcm9ncmFtICovCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGNfZ2xpYiwgIkMsIHVzaW5nIEdMaWIiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY29jb2FfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjUzN2FjLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIE9iamVjdGl2ZS1DIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqIG1vc3RseSBjb3B5L3Bhc3RpbmcvdHdlYWtpbmcgZnJvbSBtY3NsZWUncyB3b3JrLgotICovCi1jbGFzcyB0X2NvY29hX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9jb2NvYV9nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotICAgIAotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJsb2dfdW5leHBlY3RlZCIpOwotICAgIGxvZ191bmV4cGVjdGVkXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsgICAgCi0gICAgCi0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tY29jb2EiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLQotICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb250YWluZXJpemVfaXQ9ZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uPWZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSwgYm9vbCBpc19yZXN1bHQ9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0aWFsaXplcl9zaWduYXR1cmUoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0X3dpdGhfY29kZXJfbWV0aG9kKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9lbmNvZGVfd2l0aF9jb2Rlcl9tZXRob2Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2RlY2xhcmF0aW9ucyhzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfaW1wbGVtZW50YXRpb25zKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZGVzY3JpcHRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfcHJvdG9jb2wgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW50ZXJmYWNlIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2Vfc2VydmVyX2ludGVyZmFjZSAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbXBsZW1lbnRhdGlvbiAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uICAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZE5hbWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0ICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkTmFtZT0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50ICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBsaXN0TmFtZSk7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIGNvY29hX3ByZWZpeCgpOwotICBzdGQ6OnN0cmluZyBjb2NvYV9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIGNvY29hX3RocmlmdF9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGNsYXNzX3JlZj1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9wcm9wZXJ0eSh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZm9ybWF0X3N0cmluZ19mb3JfdHlwZSh0X3R5cGUqIHR5cGUpOwotICBzdGQ6OnN0cmluZyBjYWxsX2ZpZWxkX3NldHRlcih0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIGZpZWxkTmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIGNvbnRhaW5lcml6ZSh0X3R5cGUgKiB0dHlwZSwgc3RkOjpzdHJpbmcgZmllbGROYW1lKTsKLSAgc3RkOjpzdHJpbmcgZGVjb250YWluZXJpemUodF9maWVsZCAqIHRmaWVsZCwgc3RkOjpzdHJpbmcgZmllbGROYW1lKTsKLQotICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgewotICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0KLSAgICByZXR1cm4KLSAgICAgIHR0eXBlLT5pc19jb250YWluZXIoKSB8fAotICAgICAgdHR5cGUtPmlzX3N0cnVjdCgpIHx8Ci0gICAgICB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fAotICAgICAgdHR5cGUtPmlzX3N0cmluZygpOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIHN0ZDo6c3RyaW5nIGNvY29hX3ByZWZpeF87Ci0gIHN0ZDo6c3RyaW5nIGNvbnN0YW50c19kZWNsYXJhdGlvbnNfOwotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpvZnN0cmVhbSBmX2hlYWRlcl87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9pbXBsXzsKLQotICBib29sIGxvZ191bmV4cGVjdGVkXzsKLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBjb2NvYV9wcmVmaXhfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImNvY29hIik7Ci0KLSAgLy8gd2UgaGF2ZSBhIC5oIGhlYWRlciBmaWxlLi4uCi0gIHN0cmluZyBmX2hlYWRlcl9uYW1lID0gcHJvZ3JhbV9uYW1lXysiLmgiOwotICBzdHJpbmcgZl9oZWFkZXJfZnVsbG5hbWUgPSBnZXRfb3V0X2RpcigpK2ZfaGVhZGVyX25hbWU7Ci0gIGZfaGVhZGVyXy5vcGVuKGZfaGVhZGVyX2Z1bGxuYW1lLmNfc3RyKCkpOwotCi0gIGZfaGVhZGVyXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgZW5kbDsKLQotICBmX2hlYWRlcl8gPDwKLSAgICBjb2NvYV9pbXBvcnRzKCkgPDwKLSAgICBjb2NvYV90aHJpZnRfaW1wb3J0cygpOwotCi0gIC8vIC4uLmFuZCBhIC5tIGltcGxlbWVudGF0aW9uIGZpbGUKLSAgc3RyaW5nIGZfaW1wbF9uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyIubSI7Ci0gIGZfaW1wbF8ub3BlbihmX2ltcGxfbmFtZS5jX3N0cigpKTsKLQotICBmX2ltcGxfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBlbmRsOwotCi0gIGZfaW1wbF8gPDwKLSAgICBjb2NvYV9pbXBvcnRzKCkgPDwKLSAgICBjb2NvYV90aHJpZnRfaW1wb3J0cygpIDw8Ci0gICAgIiNpbXBvcnQgXCIiIDw8IGZfaGVhZGVyX25hbWUgPDwgIlwiIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBDb2NvYSBpbXBvcnRzCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgZm9yIENvY29hIGxpYnJhcmllcwotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmNvY29hX2ltcG9ydHMoKSB7Ci0gIHJldHVybgotICAgIHN0cmluZygpICsKLSAgICAiI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+XG4iICsKLSAgICAiXG4iOwotfQotCi0vKioKLSAqIFByaW50cyB0aHJpZnQgcnVudGltZSBpbXBvcnRzCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aHJpZnQgcnVudGltZQotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmNvY29hX3RocmlmdF9pbXBvcnRzKCkgewotICBzdHJpbmcgcmVzdWx0ID0gc3RyaW5nKCkgKwotICAgICIjaW1wb3J0IDxUUHJvdG9jb2wuaD5cbiIgKwotICAgICIjaW1wb3J0IDxUQXBwbGljYXRpb25FeGNlcHRpb24uaD5cbiIgKwotICAgICIjaW1wb3J0IDxUUHJvdG9jb2xVdGlsLmg+XG4iICsKLSAgICAiI2ltcG9ydCA8VFByb2Nlc3Nvci5oPlxuIiArCi0gICAgIlxuIjsKLQotICAvLyBJbmNsdWRlIG90aGVyIFRocmlmdCBpbmNsdWRlcwotICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgcmVzdWx0ICs9ICIjaW1wb3J0IFwiIiArIGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpICsgIi5oXCIiICsgIlxuIjsKLSAgfQotICByZXN1bHQgKz0gIlxuIjsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qKgotICogRmluaXNoIHVwIGdlbmVyYXRpb24uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpCi17Ci0gIC8vIHN0aWNrIG91ciBjb25zdGFudHMgZGVjbGFyYXRpb25zIGF0IHRoZSBlbmQgb2YgdGhlIGhlYWRlciBmaWxlCi0gIC8vIHNpbmNlIHRoZXkgcmVmZXIgdG8gdGhpbmdzIHdlIGFyZSBkZWZpbmluZy4KLSAgZl9oZWFkZXJfIDw8IGNvbnN0YW50c19kZWNsYXJhdGlvbnNfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBqdXN0IGEgc2ltcGxlIDEtbGluZXIgaW4gb2JqZWN0aXZlLWMKLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgInR5cGVkZWYgIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8ICIgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gSW4gT2JqZWN0aXZlLUMsIHRoaXMgaXMKLSAqIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIHRoZSB0aHJpZnQgZGVmaW5pdGlvbiBpdHNlbGYsIHVzaW5nIHRoZQotICogZW51bSBrZXl3b3JkIGluIE9iamVjdGl2ZS1DLiAgRm9yIG5hbWVzcGFjZSBwdXJwb3NlcywgdGhlIG5hbWUgb2YKLSAqIHRoZSBlbnVtIHBsdXMgYW4gdW5kZXJzY29yZSBpcyBwcmVmaXhlZCBvbnRvIGVhY2ggZWxlbWVudC4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAiZW51bSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJfIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICAiID0gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgZW5kbCA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4gIFByaW1pdGl2ZSB2YWx1ZXMKLSAqIGNvdWxkIGhhdmUgYmVlbiBwbGFjZWQgb3V0c2lkZSB0aGlzIGNsYXNzLCBidXQgSSBqdXN0IHB1dAotICogZXZlcnl0aGluZyBpbiBmb3IgY29uc2lzdGVuY3kuCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb25zdF9pbnRlcmZhY2U7Ci0gIHN0cmluZyBjb25zdGFudHNfY2xhc3NfbmFtZSA9IGNvY29hX3ByZWZpeF8gKyBwcm9ncmFtX25hbWVfICsgIkNvbnN0YW50cyI7Ci0KLSAgY29uc3RfaW50ZXJmYWNlIDw8ICJAaW50ZXJmYWNlICIgPDwgY29uc3RhbnRzX2NsYXNzX25hbWUgPDwgIiA6IE5TT2JqZWN0ICI7Ci0gIHNjb3BlX3VwKGNvbnN0X2ludGVyZmFjZSk7Ci0gIHNjb3BlX2Rvd24oY29uc3RfaW50ZXJmYWNlKTsKLQotICAvLyBnZXR0ZXIgbWV0aG9kIGZvciBlYWNoIGNvbnN0YW50IGRlZmluZWQuCi0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7Ci0gICAgY29uc3RfaW50ZXJmYWNlIDw8Ci0gICAgICAiKyAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikgIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgY29uc3RfaW50ZXJmYWNlIDw8ICJAZW5kIjsKLQotICAvLyB0aGlzIGdldHMgc3BpdCBpbnRvIHRoZSBoZWFkZXIgZmlsZSBpbiA6OmNsb3NlX2dlbmVyYXRvcgotICBjb25zdGFudHNfZGVjbGFyYXRpb25zXyA9IGNvbnN0X2ludGVyZmFjZS5zdHIoKTsKLQotICAvLyBzdGF0aWMgdmFyaWFibGVzIGluIHRoZSAubSBob2xkIGFsbCBjb25zdGFudCB2YWx1ZXMKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7Ci0gICAgZl9pbXBsXyA8PAotICAgICAgInN0YXRpYyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgY29jb2FfcHJlZml4XyA8PCBuYW1lOwotICAgIGlmICghdHlwZS0+aXNfY29udGFpbmVyKCkgJiYgIXR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgICBmX2ltcGxfIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCB0eXBlLCAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKLSAgICB9Ci0gICAgZl9pbXBsXyA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBmX2ltcGxfIDw8IGVuZGw7Ci0KLSAgZl9pbXBsXyA8PCAiQGltcGxlbWVudGF0aW9uICIgPDwgY29uc3RhbnRzX2NsYXNzX25hbWUgPDwgZW5kbDsKLQotICAvLyBpbml0aWFsaXplIGNvbXBsZXggY29uc3RhbnRzIHdoZW4gdGhlIGNsYXNzIGlzIGxvYWRlZAotICBmX2ltcGxfIDw8ICIrICh2b2lkKSBpbml0aWFsaXplICI7Ci0gIHNjb3BlX3VwKGZfaW1wbF8pOwotCi0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaWYgKCgqY19pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfY29udGFpbmVyKCkgfHwKLSAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc19zdHJ1Y3QoKSkgewotICAgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBmX2ltcGxfIDw8IGluZGVudCgpIDw8IGNvY29hX3ByZWZpeF8gPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKLSAgICAgIGZfaW1wbF8gPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIHNjb3BlX2Rvd24oZl9pbXBsXyk7Ci0KLSAgLy8gZ2V0dGVyIG1ldGhvZCBmb3IgZWFjaCBjb25zdGFudAotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICBmX2ltcGxfIDw8Ci0gICAgICAiKyAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikgIiA8PCBuYW1lOwotICAgIHNjb3BlX3VwKGZfaW1wbF8pOwotICAgIGluZGVudChmX2ltcGxfKSA8PCAicmV0dXJuICIgPDwgY29jb2FfcHJlZml4XyA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9pbXBsXyk7Ci0gIH0KLQotICBmX2ltcGxfIDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIGEgY2xhc3MKLSAqIHdpdGggcHJvdGVjdGVkIGRhdGEgbWVtYmVycywgcmVhZCgpLCB3cml0ZSgpLCBhbmQgZ2V0dGVycyBhbmQgc2V0dGVycy4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2UoZl9oZWFkZXJfLCB0c3RydWN0LCBmYWxzZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIE5TRXhjZXB0aW9uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShmX2hlYWRlcl8sIHR4Y2VwdGlvbiwgdHJ1ZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0eGNlcHRpb24sIHRydWUpOwotfQotCi0KLS8qKgotICogR2VuZXJhdGUgdGhlIGludGVyZmFjZSBmb3IgYSBzdHJ1Y3QKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBvdXQgPDwgIkBpbnRlcmZhY2UgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA6ICI7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAiTlNFeGNlcHRpb24gIjsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwgIk5TT2JqZWN0ICI7Ci0gIH0KLSAgb3V0IDw8ICI8TlNDb2Rpbmc+ICI7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICAvLyBtZW1iZXJzIGFyZSBwcm90ZWN0ZWQuICB0aGlzIGlzIHJlZHVuZGFudCwgYnV0IGV4cGxpY2l0LgotICAvLyAgZl9oZWFkZXJfIDw8IGVuZGwgPDwgIkBwcm90ZWN0ZWQ6IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotCi0gIC8vIG1lbWJlciB2YXJpYWxiZXMKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoKm1faXRlcikgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICAvLyBpc3NldCBmaWVsZHMKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiQk9PTCBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJfaXNzZXQ7IiA8PCAgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIC8vIHByb3BlcnRpZXMKLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIG91dCA8PCAiI2lmIFRBUkdFVF9PU19JUEhPTkUgfHwgKE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQgPj0gTUFDX09TX1hfVkVSU0lPTl8xMF81KSIgPDwgZW5kbDsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9wcm9wZXJ0eSgqbV9pdGVyKSA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgIiNlbmRpZiIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gaW5pdGlhbGl6ZXIgZm9yIGFsbCBmaWVsZHMKLSAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdGlhbGl6ZXJfc2lnbmF0dXJlKG91dCwgdHN0cnVjdCk7Ci0gICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCBlbmRsOwotCi0gIC8vIHJlYWQgYW5kIHdyaXRlCi0gIG91dCA8PCAiLSAodm9pZCkgcmVhZDogKGlkIDxUUHJvdG9jb2w+KSBpblByb3RvY29sOyIgPDwgZW5kbDsKLSAgb3V0IDw8ICItICh2b2lkKSB3cml0ZTogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbDsiIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotCi0gIC8vIGdldHRlcnMgYW5kIHNldHRlcnMKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2RlY2xhcmF0aW9ucyhvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0KLSAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZSBzaWduYXR1cmUgZm9yIGluaXRpYWxpemVyIG9mIHN0cnVjdCB3aXRoIGEgcGFyYW1ldGVyIGZvcgotICogZWFjaCBmaWVsZC4KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRpYWxpemVyX3NpZ25hdHVyZShvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgaW5kZW50KG91dCkgPDwgIi0gKGlkKSBpbml0V2l0aCI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKSB7Ci0gICAgaWYgKG1faXRlciA9PSBtZW1iZXJzLmJlZ2luKCkpIHsKLSAgICAgIG91dCA8PCBjYXBpdGFsaXplKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIG91dCA8PCAiOiAoIiA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSAiIDw8Ci0gICAgICAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgKyttX2l0ZXI7Ci0gICAgaWYgKG1faXRlciAhPSBtZW1iZXJzLmVuZCgpKSB7Ci0gICAgICBvdXQgPDwgIiAiOwotICAgIH0KLSAgfQotfQotCi0KLS8qKgotICogR2VuZXJhdGUgZ2V0dGVyIGFuZCBzZXR0ZXIgZGVjbGFyYXRpb25zIGZvciBhbGwgZmllbGRzLCBwbHVzIGFuCi0gKiBJc1NldCBnZXR0ZXIuCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9maWVsZF9hY2Nlc3Nvcl9kZWNsYXJhdGlvbnMob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gICh2b2lkKSBpc19leGNlcHRpb247Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKCIgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgIiA8PCBkZWNhcGl0YWxpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKHZvaWQpIHNldCIgPDwgY2FwaXRhbGl6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8Ci0gICAgICAiOiAoIiA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKEJPT0wpICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJJc1NldDsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotfQotCi0KLS8qKgotICogR2VuZXJhdGUgdGhlIGluaXRXaXRoQ29kZXIgbWV0aG9kIGZvciB0aGlzIHN0cnVjdCBzbyBpdCdzIGNvbXBhdGlibGUgd2l0aAotICogdGhlIE5TQ29kaW5nIHByb3RvY29sCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0X3dpdGhfY29kZXJfbWV0aG9kKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSAKLXsKLSAgaW5kZW50KG91dCkgPDwgIi0gKGlkKSBpbml0V2l0aENvZGVyOiAoTlNDb2RlciAqKSBkZWNvZGVyIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgLy8gTlNFeGNlcHRpb25zIGNvbmZvcm0gdG8gTlNDb2RpbmcsIHNvIHdlIGNhbiBjYWxsIHN1cGVyCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRXaXRoQ29kZXI6IGRlY29kZXJdOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOwotICB9Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKFtkZWNvZGVyIGNvbnRhaW5zVmFsdWVGb3JLZXk6IEBcIiI8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwiXCJdKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIjsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgCi0gICAgewotICAgICAgb3V0IDw8ICJbW2RlY29kZXIgZGVjb2RlT2JqZWN0Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdIHJldGFpbl07IiA8PCBlbmRsOwotICAgIH0KLSAgICBlbHNlIGlmICh0LT5pc19lbnVtKCkpIAotICAgIHsKLSAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsgICAgICAKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSAqKSB0KS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUJvb2xGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOyAgICAgIAotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVJbnRGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOyAgICAgIAotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUludEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7ICAgICAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50MzJGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOyAgICAgIAotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUludDY0Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsgICAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVEb3VibGVGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOyAgICAgIAotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAgICAKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGRvbid0IGtub3cgaG93IHRvIGRlY29kZSB0aHJpZnQgdHlwZTogIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX2lzc2V0ID0gWUVTOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLSAgCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGY7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGUgdGhlIGVuY29kZVdpdGhDb2RlciBtZXRob2QgZm9yIHRoaXMgc3RydWN0IHNvIGl0J3MgY29tcGF0aWJsZSB3aXRoCi0gKiB0aGUgTlNDb2RpbmcgcHJvdG9jb2wKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2VuY29kZV93aXRoX2NvZGVyX21ldGhvZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIAotewotICBpbmRlbnQob3V0KSA8PCAiLSAodm9pZCkgZW5jb2RlV2l0aENvZGVyOiAoTlNDb2RlciAqKSBlbmNvZGVyIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgLy8gTlNFeGNlcHRpb25zIGNvbmZvcm0gdG8gTlNDb2RpbmcsIHNvIHdlIGNhbiBjYWxsIHN1cGVyCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbc3VwZXIgZW5jb2RlV2l0aENvZGVyOiBlbmNvZGVyXTsiIDw8IGVuZGw7Ci0gIH0KLSAgCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIAotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF9fIjw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCJfaXNzZXQpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgLy9vdXQgPDwgaW5kZW50KCkgPDwgIl9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICI7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIAotICAgIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlT2JqZWN0OiBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZWxzZSBpZiAodC0+aXNfZW51bSgpKSAKLSAgICB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUludDogX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgdCktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKQotICAgICAgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVCb29sOiBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50OiBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVJbnQ6IF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUludDMyOiBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVJbnQ2NDogX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlRG91YmxlOiBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDogICAgCi0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBkb24ndCBrbm93IGhvdyB0byBlbmNvZGUgdGhyaWZ0IHR5cGU6ICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLSAgCi0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZSBzdHJ1Y3QgaW1wbGVtZW50YXRpb24uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/Ci0gKiBAcGFyYW0gaXNfcmVzdWx0ICAgIElmIHRoaXMgaXMgYSByZXN1bHQgaXQgbmVlZHMgYSBkaWZmZXJlbnQgd3JpdGVyCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gZXhjZXB0aW9ucyBuZWVkIHRvIGNhbGwgdGhlIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgb24gTlNFeGNlcHRpb24KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoaWQpIGluaXQiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBbc3VwZXIgaW5pdFdpdGhOYW1lOiBAXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwKLSAgICAgICAgIlwiIHJlYXNvbjogQFwidW5rbm93blwiIHVzZXJJbmZvOiBuaWxdOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIC8vIGluaXRpYWxpemVyIHdpdGggYWxsIGZpZWxkcyBhcyBwYXJhbXMKLSAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdGlhbGl6ZXJfc2lnbmF0dXJlKG91dCwgdHN0cnVjdCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc2VsZiBpbml0XTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZiA9IFtzdXBlciBpbml0XTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiOwotICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKLSAgICAgICAgb3V0IDw8ICJbIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiByZXRhaW5dOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIl9pc3NldCA9IFlFUzsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZjsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotICB9Ci0gIAotICAvLyBpbml0V2l0aENvZGVyIGZvciBOU0NvZGluZwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdF93aXRoX2NvZGVyX21ldGhvZChvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gIC8vIGVuY29kZVdpdGhDb2RlciBmb3IgTlNDb2RpbmcKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2VuY29kZV93aXRoX2NvZGVyX21ldGhvZChvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7ICAKLQotICAvLyBkZWFsbG9jCi0gIGlmICghbWVtYmVycy5lbXB0eSgpKSB7Ci0gICAgb3V0IDw8ICItICh2b2lkKSBkZWFsbG9jIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiW19fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiByZWxlYXNlXTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbc3VwZXIgZGVhbGxvY107IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLSAgfQotCi0gIC8vIHRoZSByZXN0IG9mIHRoZSBtZXRob2RzCi0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9maWVsZF9hY2Nlc3Nvcl9pbXBsZW1lbnRhdGlvbnMob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGlmIChpc19yZXN1bHQpIHsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfQotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZGVzY3JpcHRpb24ob3V0LCB0c3RydWN0KTsKLQotICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwKLSAgICAiLSAodm9pZCkgcmVhZDogKGlkIDxUUHJvdG9jb2w+KSBpblByb3RvY29sIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMKLSAgaW5kZW50KG91dCkgPDwgIk5TU3RyaW5nICogZmllbGROYW1lOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImludCBmaWVsZFR5cGU7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiaW50IGZpZWxkSUQ7IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiW2luUHJvdG9jb2wgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTogTlVMTF07IiA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PAotICAgICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiW2luUHJvdG9jb2wgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOiAmZmllbGROYW1lIHR5cGU6ICZmaWVsZFR5cGUgZmllbGRJRDogJmZpZWxkSURdOyIgPDwgZW5kbDsKLQotICAgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlmIChmaWVsZFR5cGUgPT0gVFR5cGVfU1RPUCkgeyAiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJicmVhazsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIn0iIDw8IGVuZGw7Ci0KLSAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAic3dpdGNoIChmaWVsZElEKSIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJpZiAoZmllbGRUeXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAiZmllbGRWYWx1ZSIpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCBjYWxsX2ZpZWxkX3NldHRlcigqZl9pdGVyLCAiZmllbGRWYWx1ZSIpIDw8IGVuZGw7Ci0gICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gYWxsb2NhdGVkIGZpZWxkLCByZWxlYXNlIGl0IHNpbmNlIHRoZSBzdHJ1Y3QKLSAgICAgICAgLy8gaXMgbm93IHJldGFpbmluZyBpdAotICAgICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICAgICAgLy8gZGVzZXJpYWxpemVkIHN0cmluZ3MgYXJlIGF1dG9yZWxlYXNlLCBzbyBkb24ndCByZWxlYXNlIHRoZW0KLSAgICAgICAgICBpZiAoIShnZXRfdHJ1ZV90eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3N0cmluZygpKSkgewotICAgICAgICAgICAgaW5kZW50KG91dCkgPDwgIltmaWVsZFZhbHVlIHJlbGVhc2VdOyIgPDwgZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbDsKLSAgICAgICAgaWYgKGxvZ191bmV4cGVjdGVkXykgewotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU0xvZyhAXCIlczogZmllbGQgSUQgJWkgaGFzIHVuZXhwZWN0ZWQgdHlwZSAlaS4gIFNraXBwaW5nLlwiLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBmaWVsZElELCBmaWVsZFR5cGUpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGZpZWxkVHlwZSBvblByb3RvY29sOiBpblByb3RvY29sXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gICAgICBpZiAobG9nX3VuZXhwZWN0ZWRfKSB7Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU0xvZyhAXCIlczogdW5leHBlY3RlZCBmaWVsZCBJRCAlaSB3aXRoIHR5cGUgJWkuICBTa2lwcGluZy5cIiwgX19QUkVUVFlfRlVOQ1RJT05fXywgZmllbGRJRCwgZmllbGRUeXBlKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGZpZWxkVHlwZSBvblByb3RvY29sOiBpblByb3RvY29sXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsOwotCi0gICAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIltpblByb3RvY29sIHJlYWRGaWVsZEVuZF07IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiW2luUHJvdG9jb2wgcmVhZFN0cnVjdEVuZF07IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIi0gKHZvaWQpIHdyaXRlOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOiBAXCIiIDw8IG5hbWUgPDwgIlwiXTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoX18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX2lzc2V0KSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKF9fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBuaWwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAXCIiIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwKLSAgICAgICIgZmllbGRJRDogIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiXTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJfXyIrKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiW291dFByb3RvY29sIHdyaXRlRmllbGRFbmRdOyIgPDwgZW5kbDsKLQotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZFN0b3BdOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RFbmRdOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwgd2hpY2gKLSAqIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbiBpZiB0aGV5IGFyZQotICogc2V0LCBhbmQgb25seSBvbmUgb2YgdGhlbSBjYW4gYmUgc2V0IGF0IGEgdGltZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X3Jlc3VsdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICItICh2b2lkKSB3cml0ZTogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogQFwiIiA8PCBuYW1lIDw8ICJcIl07IiA8PCBlbmRsOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIG91dCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgIiBlbHNlIGlmICI7Ci0gICAgfQotCi0gICAgb3V0IDw8Ci0gICAgICAiKF9fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl9pc3NldCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKF9fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBuaWwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAXCIiIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwKLSAgICAgICIgZmllbGRJRDogIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiXTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJfXyIrKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiW291dFByb3RvY29sIHdyaXRlRmllbGRFbmRdOyIgPDwgZW5kbDsKLQotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IjsKLSAgfQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkU3RvcF07IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZVN0cnVjdEVuZF07IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBwcm9wZXJ0eSBhY2Nlc3NvciBtZXRob2RzIGZvciBhbGwgZmllbGRzIGluIHRoZSBzdHJ1Y3QuCi0gKiBnZXR0ZXIsIHNldHRlciwgaXNzZXQgZ2V0dGVyLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfaW1wbGVtZW50YXRpb25zKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICAodm9pZCkgaXNfZXhjZXB0aW9uOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGZpZWxkX25hbWU7Ci0gICAgY2FwX25hbWVbMF0gPSB0b3VwcGVyKGNhcF9uYW1lWzBdKTsKLQotICAgIC8vIFNpbXBsZSBnZXR0ZXIKLSAgICBpbmRlbnQob3V0KSA8PCAiLSAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikgIjsKLSAgICBvdXQgPDwgZmllbGRfbmFtZSA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9fIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIFtbX18iIDw8IGZpZWxkX25hbWUgPDwgIiByZXRhaW5dIGF1dG9yZWxlYXNlXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIFNpbXBsZSBzZXR0ZXIKLSAgICBpbmRlbnQob3V0KSA8PCAiLSAodm9pZCkgc2V0IiA8PCBjYXBfbmFtZSA8PCAiOiAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwKLSAgICAgICIpICIgPDwgZmllbGRfbmFtZSA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX18iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGZpZWxkX25hbWUgPDwgIiByZXRhaW5dOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbX18iIDw8IGZpZWxkX25hbWUgPDwgIiByZWxlYXNlXTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX18iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgIl9fIiA8PCBmaWVsZF9uYW1lIDw8ICJfaXNzZXQgPSBZRVM7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIElzU2V0Ci0gICAgaW5kZW50KG91dCkgPDwgIi0gKEJPT0wpICIgPDwgZmllbGRfbmFtZSA8PCAiSXNTZXQgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9fIiA8PCBmaWVsZF9uYW1lIDw8ICJfaXNzZXQ7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIFVuc2V0dGVyIC0gZG8gd2UgbmVlZCB0aGlzPwotICAgIGluZGVudChvdXQpIDw8ICItICh2b2lkKSB1bnNldCIgPDwgY2FwX25hbWUgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiW19fIiA8PCBmaWVsZF9uYW1lIDw8ICIgcmVsZWFzZV07IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIl9fIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBuaWw7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAiX18iIDw8IGZpZWxkX25hbWUgPDwgIl9pc3NldCA9IE5POyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBkZXNjcmlwdGlvbiBtZXRob2QgZm9yIHRoZSBnaXZlbiBzdHJ1Y3QKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2Rlc2NyaXB0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIi0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJOU011dGFibGVTdHJpbmcgKiBtcyA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nV2l0aFN0cmluZzogQFwiIiA8PAotICAgIHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIl07IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgaW5kZW50KG91dCkgPDwgIlttcyBhcHBlbmRTdHJpbmc6IEBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCJdOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIlttcyBhcHBlbmRTdHJpbmc6IEBcIiwiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIlttcyBhcHBlbmRGb3JtYXQ6IEBcIiIgPDwgZm9ybWF0X3N0cmluZ19mb3JfdHlwZSh0dHlwZSkgPDwgIlwiLCBfXyIgPDwKLSAgICAgICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXTsiIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIlttcyBhcHBlbmRTdHJpbmc6IEBcIilcIl07IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aFN0cmluZzogbXNdOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gIEluIE9iamVjdGl2ZS1DIHRoaXMgY29uc2lzdHMgb2YgYQotICogcHJvdG9jb2wgZGVmaW5pdGlvbiwgYSBjbGllbnQgaW50ZXJmYWNlIGFuZCBhIGNsaWVudCBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9wcm90b2NvbChmX2hlYWRlcl8sIHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW50ZXJmYWNlKGZfaGVhZGVyXywgdHNlcnZpY2UpOwotICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbnRlcmZhY2UoZl9oZWFkZXJfLCB0c2VydmljZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHNlcnZpY2UpOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIHN0cnVjdHMgZm9yIGFsbCB0aGUgc2VydmljZSByZXR1cm4gdHlwZXMKLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2UoZl9pbXBsXywgdHMsIGZhbHNlKTsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHMsIGZhbHNlLCBmYWxzZSk7ICAKLSAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICByZXR1cm4gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOwotICB9IGVsc2UgewotICAgIHJldHVybiBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7Ci0gIH0KLX0KLQotCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICByZXR1cm4gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIGNyZWF0ZSBhIHJlc3VsdCBzdHJ1Y3Qgd2l0aCBhIHN1Y2Nlc3MgZmllbGQgb2YgdGhlIHJldHVybiB0eXBlLAotICAvLyBhbmQgYSBmaWVsZCBmb3IgZWFjaCB0eXBlIG9mIGV4Y2VwdGlvbiB0aHJvd24KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRmdW5jdGlvbikpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgLy8gZ2VuZXJhdGUgdGhlIHJlc3VsdCBzdHJ1Y3QKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShmX2ltcGxfLCAmcmVzdWx0LCBmYWxzZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSk7ICAKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgcHJvdG9jb2wgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBwcm90b2NvbCBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3Byb3RvY29sKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgb3V0IDw8ICJAcHJvdG9jb2wgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgPE5TT2JqZWN0PiIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBvdXQgPDwgIi0gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8Ci0gICAgICAiICAvLyB0aHJvd3MgIjsKLSAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgb3V0IDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpICsgIiwgIjsKLSAgICB9Ci0gICAgb3V0IDw8ICJURXhjZXB0aW9uIiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbnRlcmZhY2Uob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkNsaWVudCA6IE5TT2JqZWN0IDwiIDw8Ci0gICAgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPiAiOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWQgPFRQcm90b2NvbD4gaW5Qcm90b2NvbDsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWQgPFRQcm90b2NvbD4gb3V0UHJvdG9jb2w7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGhQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbDsiIDw8IGVuZGw7Ci0gIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoSW5Qcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBpblByb3RvY29sIG91dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sOyIgPDwgZW5kbDsKLSAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBpbnRlcmZhY2UgZGVmaW5pdGlvbi4gSW4gb3RoZXIgd29yZHMsIHRoZSBUUHJvY2VzcyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlCi0gKiBzZXJ2aWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbnRlcmZhY2Uob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciA6IE5TT2JqZWN0IDxUUHJvY2Vzc29yPiAiOwotICAKLSAgc2NvcGVfdXAob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpZCA8IiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8Ij4gbVNlcnZpY2U7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TRGljdGlvbmFyeSAqIG1NZXRob2RNYXA7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIAotICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aCIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIjogKGlkIDwiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIj4pIHNlcnZpY2U7IiA8PCBlbmRsOwotICBvdXQgPDwgIi0gKGlkPCI8PGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIj4pIHNlcnZpY2U7IiA8PCBlbmRsOwotCi0gIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgaW1wbGVtZW50YXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbXBsZW1lbnRhdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBvdXQgPDwgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkNsaWVudCIgPDwgZW5kbDsKLQotICAvLyBpbml0aWFsaXplcnMKLSAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGhQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbCIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gW3NlbGYgaW5pdFdpdGhJblByb3RvY29sOiBwcm90b2NvbCBvdXRQcm90b2NvbDogcHJvdG9jb2xdOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aEluUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgYW5JblByb3RvY29sIG91dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIGFuT3V0UHJvdG9jb2wiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpblByb3RvY29sID0gW2FuSW5Qcm90b2NvbCByZXRhaW5dOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJvdXRQcm90b2NvbCA9IFthbk91dFByb3RvY29sIHJldGFpbl07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICAvLyBkZWFsbG9jCi0gIG91dCA8PCAiLSAodm9pZCkgZGVhbGxvYyIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJbaW5Qcm90b2NvbCByZWxlYXNlXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHJlbGVhc2VdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJbc3VwZXIgZGVhbGxvY107IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIC8vIGdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7Ci0KLSAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiLSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgZnVubmFtZSA8PCAiXCIiIDw8Ci0gICAgICAiIHR5cGU6IFRNZXNzYWdlVHlwZV9DQUxMIiA8PAotICAgICAgIiBzZXF1ZW5jZUlEOiAwXTsiIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOiBAXCIiIDw8IGFyZ3NuYW1lIDw8ICJcIl07IiA8PCBlbmRsOwotCi0gICAgLy8gd3JpdGUgb3V0IGZ1bmN0aW9uIHBhcmFtZXRlcnMKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBzdHJpbmcgZmllbGROYW1lID0gKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBmaWVsZE5hbWUgPDwgIiAhPSBuaWwpIjsKLSAgICAgICAgc2NvcGVfdXAob3V0KTsKLSAgICAgIH0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAXCIiIDw8IGZpZWxkTmFtZSA8PCAiXCIiCi0gICAgICAgICIgdHlwZTogIiA8PCB0eXBlX3RvX2VudW0oKCpmbGRfaXRlciktPmdldF90eXBlKCkpIDw8Ci0gICAgICAgICIgZmllbGRJRDogIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X2tleSgpIDw8ICJdOyIgPDwgZW5kbDsKLQotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZsZF9pdGVyLCBmaWVsZE5hbWUpOwotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkRW5kXTsiIDw8IGVuZGw7Ci0KLSAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRTdG9wXTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlU3RydWN0RW5kXTsiIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVNZXNzYWdlRW5kXTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJbW291dFByb3RvY29sIHRyYW5zcG9ydF0gZmx1c2hdOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIi0gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICAvLyBUT0RPKG1jc2xlZSk6IE1lc3NhZ2UgdmFsaWRhdGlvbiBoZXJlLCB3YXMgdGhlIHNlcWlkIGV0YyBvaz8KLQotICAgICAgLy8gY2hlY2sgZm9yIGFuIGV4Y2VwdGlvbgotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpbnQgbXNnVHlwZSA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTogbmlsIHR5cGU6ICZtc2dUeXBlIHNlcXVlbmNlSUQ6IE5VTExdOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG1zZ1R5cGUgPT0gVE1lc3NhZ2VUeXBlX0VYQ0VQVElPTikgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24gKiB4ID0gW1RBcHBsaWNhdGlvbkV4Y2VwdGlvbiByZWFkOiBpblByb3RvY29sXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmRdOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBAdGhyb3cgeDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAgIC8vIEZJWE1FIC0gY291bGQgb3B0aW1pemUgaGVyZSB0byByZWR1Y2UgY3JlYXRpb24gb2YgdGVtcG9yYXJ5IG9iamVjdHMuCi0gICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUoKmZfaXRlcik7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgY29jb2FfcHJlZml4XyA8PCByZXN1bHRuYW1lIDw8ICIgKiByZXN1bHQgPSBbW1siIDw8IGNvY29hX3ByZWZpeF8gPDwKLSAgICAgICAgcmVzdWx0bmFtZSA8PCAiIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIltyZXN1bHQgcmVhZDogaW5Qcm90b2NvbF07IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIltpblByb3RvY29sIHJlYWRNZXNzYWdlRW5kXTsiIDw8IGVuZGw7Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKFtyZXN1bHQgc3VjY2Vzc0lzU2V0XSkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBbcmVzdWx0IHN1Y2Nlc3NdOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKFtyZXN1bHQgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0XSkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIEB0aHJvdyBbcmVzdWx0ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBJZiB5b3UgZ2V0IGhlcmUgaXQncyBhbiBleGNlcHRpb24sIHVubGVzcyBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIkB0aHJvdyBbVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhUeXBlOiBUQXBwbGljYXRpb25FeGNlcHRpb25fTUlTU0lOR19SRVNVTFQiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IEBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiXTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICItICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIltzZWxmIHNlbmRfIiA8PCBmdW5uYW1lOwotCi0gICAgLy8gRGVjbGFyZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICIgIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBvdXQgPDwgIl07IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIG91dCA8PCAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwKLSAgICAgICAgIltzZWxmIHJlY3ZfIiA8PCBmdW5uYW1lIDw8ICJdOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGltcGxlbWVudGF0aW9uLiAgSW4gb3RoZXIgd29yZHMgdGhlIGFjdHVhbCBUUHJvY2Vzc29yIGltcGxlbWVudGF0aW9uCi0gKiBmb3IgdGhlIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbXBsZW1lbnRhdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBvdXQgPDwgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIAotICAvLyBpbml0aWFsaXplcgotICBvdXQgPDwgZW5kbDsKLSAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGgiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI6IChpZCA8IiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+KSBzZXJ2aWNlIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghc2VsZikgeyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBuaWw7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAibVNlcnZpY2UgPSBbc2VydmljZSByZXRhaW5dOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJtTWV0aG9kTWFwID0gW1tOU011dGFibGVEaWN0aW9uYXJ5IGRpY3Rpb25hcnldIHJldGFpbl07IiA8PCBlbmRsOwotICAKLSAgLy8gZ2VuZXJhdGUgbWV0aG9kIG1hcCBmb3Igcm91dGluZyBpbmNvbWluZyBjYWxscwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBzY29wZV91cChvdXQpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiU0VMIHMgPSBAc2VsZWN0b3IocHJvY2Vzc18iIDw8IGZ1bm5hbWUgPDwgIl93aXRoU2VxdWVuY2VJRDppblByb3RvY29sOm91dFByb3RvY29sOik7IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNNZXRob2RTaWduYXR1cmUgKiBzaWcgPSBbc2VsZiBtZXRob2RTaWduYXR1cmVGb3JTZWxlY3Rvcjogc107IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNJbnZvY2F0aW9uICogaW52b2NhdGlvbiA9IFtOU0ludm9jYXRpb24gaW52b2NhdGlvbldpdGhNZXRob2RTaWduYXR1cmU6IHNpZ107IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2ludm9jYXRpb24gc2V0U2VsZWN0b3I6IHNdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltpbnZvY2F0aW9uIHJldGFpbkFyZ3VtZW50c107IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW21NZXRob2RNYXAgc2V0VmFsdWU6IGludm9jYXRpb24gZm9yS2V5OiBAXCIiIDw8IGZ1bm5hbWUgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGY7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIAotICAvLyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgJ3NlcnZpY2UnIG1ldGhvZCB3aGljaCByZXR1cm5zIHRoZSBzZXJ2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0gIC8vIHByb2Nlc3NvcgotICBvdXQgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICItIChpZDwiPDxjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+KSBzZXJ2aWNlIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gW1ttU2VydmljZSByZXRhaW5dIGF1dG9yZWxlYXNlXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgCi0gIC8vIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUUHJvY2VzcyBtZXRob2QsIHdoaWNoIGRpc3BhdGNoZXMgdGhlIGluY29taW5nIGNhbGwgdXNpbmcgdGhlIG1ldGhvZCBtYXAKLSAgb3V0IDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoQk9PTCkgcHJvY2Vzc09uSW5wdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBpblByb3RvY29sIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgb3V0UHJvdG9jb2wiIDw8ZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNTdHJpbmcgKiBtZXNzYWdlTmFtZTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpbnQgbWVzc2FnZVR5cGU7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaW50IHNlcUlEOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpblByb3RvY29sIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOiAmbWVzc2FnZU5hbWUiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJm1lc3NhZ2VUeXBlIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6ICZzZXFJRF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNJbnZvY2F0aW9uICogaW52b2NhdGlvbiA9IFttTWV0aG9kTWFwIHZhbHVlRm9yS2V5OiBtZXNzYWdlTmFtZV07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaWYgKGludm9jYXRpb24gPT0gbmlsKSB7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogVFR5cGVfU1RSVUNUIG9uUHJvdG9jb2w6IGluUHJvdG9jb2xdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmRdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uICogeCA9IFtUQXBwbGljYXRpb25FeGNlcHRpb24gZXhjZXB0aW9uV2l0aFR5cGU6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9VTktOT1dOX01FVEhPRCByZWFzb246IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OiBAXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnJUAnXCIsIG1lc3NhZ2VOYW1lXV07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBbb3V0UHJvdG9jb2wgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTogbWVzc2FnZU5hbWUiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBUTWVzc2FnZVR5cGVfRVhDRVBUSU9OIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogc2VxSURdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgW3ggd3JpdGU6IG91dFByb3RvY29sXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIFtvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VFbmRdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgW1tvdXRQcm90b2NvbCB0cmFuc3BvcnRdIGZsdXNoXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBZRVM7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIC8vIE5TSW52b2NhdGlvbiBkb2VzIG5vdCBjb25mb3JtIHRvIE5TQ29weWluZyBwcm90b2NvbCIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIE5TSW52b2NhdGlvbiAqIGkgPSBbTlNJbnZvY2F0aW9uIGludm9jYXRpb25XaXRoTWV0aG9kU2lnbmF0dXJlOiBbaW52b2NhdGlvbiBtZXRob2RTaWduYXR1cmVdXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRTZWxlY3RvcjogW2ludm9jYXRpb24gc2VsZWN0b3JdXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRBcmd1bWVudDogJnNlcUlEIGF0SW5kZXg6IDJdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIHNldEFyZ3VtZW50OiAmaW5Qcm90b2NvbCBhdEluZGV4OiAzXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRBcmd1bWVudDogJm91dFByb3RvY29sIGF0SW5kZXg6IDRdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIHNldFRhcmdldDogc2VsZl07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgaW52b2tlXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gWUVTOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAKLSAgLy8gZ2VuZXJhdGUgYSBwcm9jZXNzX1hYWFggbWV0aG9kIGZvciBlYWNoIHNlcnZpY2UgZnVuY3Rpb24sIHdoaWNoIHJlYWRzIGFyZ3MsIGNhbGxzIHRoZSBzZXJ2aWNlLCBhbmQgd3JpdGVzIHJlc3VsdHMKLSAgZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICItICh2b2lkKSBwcm9jZXNzXyIgPDwgZnVubmFtZSA8PCAiX3dpdGhTZXF1ZW5jZUlEOiAoaW50MzJfdCkgc2VxSUQgaW5Qcm90b2NvbDogKGlkPFRQcm90b2NvbD4pIGluUHJvdG9jb2wgb3V0UHJvdG9jb2w6IChpZDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIHN0cmluZyBhcmdzdHlwZSA9IGNvY29hX3ByZWZpeF8gKyBmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSgqZl9pdGVyKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgYXJnc3R5cGUgPDwgIiAqIGFyZ3MgPSBbWyIgPDwgYXJnc3R5cGUgPDwgIiBhbGxvY10gaW5pdF07IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2FyZ3MgcmVhZDogaW5Qcm90b2NvbF07IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmRdOyIgPDwgZW5kbDsKLSAgICAKLSAgICBzdHJpbmcgcmVzdWx0dHlwZSA9IGNvY29hX3ByZWZpeF8gKyBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKCpmX2l0ZXIpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZXN1bHR0eXBlIDw8ICIgKiByZXN1bHQgPSBbWyIgPDwgcmVzdWx0dHlwZSA8PCAiIGFsbG9jXSBpbml0XTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBtYWtlIHRoZSBjYWxsIHRvIHRoZSBhY3R1YWwgc2VydmljZSBvYmplY3QKLSAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgb3V0IDw8ICJbcmVzdWx0IHNldFN1Y2Nlc3M6ICI7Ci0gICAgfQotICAgIG91dCA8PCAiW21TZXJ2aWNlICIgPDwgZnVubmFtZTsKLSAgICAvLyBzdXBwbHlpbmcgYXJndW1lbnRzCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgc3RyaW5nIGZpZWxkTmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgb3V0IDw8ICI6IFthcmdzICIgPDwgZmllbGROYW1lIDw8ICJdIjsKLSAgICB9Ci0gICAgb3V0IDw8ICJdIjsKLSAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICBvdXQgPDwgIl0iOwotICAgIH0KLSAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgCi0gICAgLy8gd3JpdGUgb3V0IHRoZSByZXN1bHQKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOiBAXCIiIDw8IGZ1bm5hbWUgPDwgIlwiIiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFRNZXNzYWdlVHlwZV9SRVBMWSIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiBzZXFJRF07IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW3Jlc3VsdCB3cml0ZTogb3V0UHJvdG9jb2xdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VFbmRdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltbb3V0UHJvdG9jb2wgdHJhbnNwb3J0XSBmbHVzaF07IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW3Jlc3VsdCByZWxlYXNlXTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbYXJncyByZWxlYXNlXTsiIDw8IGVuZGw7Ci0gICAgCi0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0gIAotICAvLyBkZWFsbG9jCi0gIG91dCA8PCBlbmRsOwotICBvdXQgPDwgIi0gKHZvaWQpIGRlYWxsb2MiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW21TZXJ2aWNlIHJlbGVhc2VdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJbbU1ldGhvZE1hcCByZWxlYXNlXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW3N1cGVyIGRlYWxsb2NdOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKLSAqIEBwYXJhbSBmaWVsZE5hbWUgVGhlIHZhcmlhYmxlIG5hbWUgZm9yIHRoaXMgZmllbGQKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGROYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIGZpZWxkTmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgIHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgZmllbGROYW1lIDw8ICIgPSBbaW5Qcm90b2NvbCAiOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsKLSAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnldOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nXTsiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgInJlYWRCb29sXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZV07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTE2XTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgInJlYWRJMzJdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAicmVhZEk2NF07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gT2JqZWN0aXZlLUMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgInJlYWRJMzJdOyI7Ci0gICAgfQotICAgIG91dCA8PAotICAgICAgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBhbGxvY2F0ZXMgdGhlIHN0cnVjdCBhbmQgaW52b2tlcyByZWFkOgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCBmaWVsZE5hbWUgPDwgIiA9IFtbIiA8PAotICAgIHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlKSA8PCAiIGFsbG9jXSBpbml0XTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJbIiA8PCBmaWVsZE5hbWUgPDwgIiByZWFkOiBpblByb3RvY29sXTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKLSAgaW5kZW50KG91dCkgPDwgImludCAiIDw8IHNpemUgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KQotICAgICAgPDwgIltpblByb3RvY29sIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6IE5VTEwgdmFsdWVUeXBlOiBOVUxMIHNpemU6ICYiIDw8Ci0gICAgICBzaXplIDw8ICJdOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiTlNNdXRhYmxlRGljdGlvbmFyeSAqICIgPDwgZmllbGROYW1lIDw8Ci0gICAgICAiID0gW1tOU011dGFibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiAiIDw8IHNpemUgPDwgIl07IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpCi0gICAgICA8PCAiW2luUHJvdG9jb2wgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6IE5VTEwgc2l6ZTogJiIgPDwgc2l6ZSA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIk5TTXV0YWJsZVNldCAqICIgPDwgZmllbGROYW1lIDw8Ci0gICAgICAiID0gW1tOU011dGFibGVTZXQgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6ICIgPDwgc2l6ZSA8PCAiXTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpCi0gICAgICA8PCAiW2luUHJvdG9jb2wgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiBOVUxMIHNpemU6ICYiIDw8IHNpemUgPDwgIl07IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJOU011dGFibGVBcnJheSAqICIgPDwgZmllbGROYW1lIDw8Ci0gICAgICAiID0gW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTogIiA8PCBzaXplIDw8ICJdOyIgPDwgZW5kbDsKLSAgfQotICAvLyBGSVhNRSAtIHRoZSBjb2RlIGFib3ZlIGRvZXMgbm90IHZlcmlmeSB0aGF0IHRoZSBlbGVtZW50IHR5cGVzIG9mCi0gIC8vIHRoZSBjb250YWluZXJzIGJlaW5nIHJlYWQgbWF0Y2ggdGhlIGVsZW1lbnQgdHlwZXMgb2YgdGhlCi0gIC8vIGNvbnRhaW5lcnMgd2UgYXJlIHJlYWRpbmcgaW50by4gIERvZXMgdGhhdCBtYXR0ZXI/Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgaW5kZW50KG91dCkgPDwgImludCAiIDw8IGkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZm9yICgiIDw8IGkgPDwgIiA9IDA7ICIgPDwKLSAgICBpIDw8ICIgPCAiIDw8IHNpemUgPDwgIjsgIiA8PAotICAgICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGZpZWxkTmFtZSk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgZmllbGROYW1lKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBmaWVsZE5hbWUpOwotICAgIH0KLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJbaW5Qcm90b2NvbCByZWFkTWFwRW5kXTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIltpblByb3RvY29sIHJlYWRTZXRFbmRdOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIltpblByb3RvY29sIHJlYWRMaXN0RW5kXTsiIDw8IGVuZGw7Ci0gIH0KLQotfQotCi0KLS8qKgotICogVGFrZSBhIHZhcmlhYmxlIG9mIGEgZ2l2ZW4gdHlwZSBhbmQgd3JhcCBpdCBpbiBjb2RlIHRvIG1ha2UgaXQKLSAqIHN1aXRhYmxlIGZvciBwdXR0aW5nIGludG8gYSBjb250YWluZXIsIGlmIG5lY2Vzc2FyeS4gIEJhc2ljYWxseSwKLSAqIHdyYXAgc2NhbGVyIHByaW1pdGl2ZXMgaW4gTlNOdW1iZXIgb2JqZWN0cy4KLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpjb250YWluZXJpemUodF90eXBlICogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKQotewotICAvLyBGSVhNRSAtIG9wdGltaXplIGhlcmUgdG8gYXZvaWQgYXV0b3JlbGVhc2UgcG9vbD8KLSAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLSAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIltOU051bWJlciBudW1iZXJXaXRoSW50OiAiICsgZmllbGROYW1lICsgIl0iOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJjYW4ndCBjb250YWluZXJpemUgdm9pZCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJbTlNOdW1iZXIgbnVtYmVyV2l0aEJvb2w6ICIgKyBmaWVsZE5hbWUgKyAiXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJbTlNOdW1iZXIgbnVtYmVyV2l0aFVuc2lnbmVkQ2hhcjogIiArIGZpZWxkTmFtZSArICJdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiW05TTnVtYmVyIG51bWJlcldpdGhTaG9ydDogIiArIGZpZWxkTmFtZSArICJdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiW05TTnVtYmVyIG51bWJlcldpdGhMb25nOiAiICsgZmllbGROYW1lICsgIl0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJbTlNOdW1iZXIgbnVtYmVyV2l0aExvbmdMb25nOiAiICsgZmllbGROYW1lICsgIl0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJbTlNOdW1iZXIgbnVtYmVyV2l0aERvdWJsZTogIiArIGZpZWxkTmFtZSArICJdIjsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gZG8gbm90aGluZwotICByZXR1cm4gZmllbGROYW1lOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAgZWxlbWVudAotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwotICB0X3R5cGUqIGtleVR5cGUgPSB0bWFwLT5nZXRfa2V5X3R5cGUoKTsKLSAgdF90eXBlKiB2YWxUeXBlID0gdG1hcC0+Z2V0X3ZhbF90eXBlKCk7Ci0gIHRfZmllbGQgZmtleShrZXlUeXBlLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodmFsVHlwZSwgdmFsKTsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5LCBrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIlsiIDw8IGZpZWxkTmFtZSA8PCAiIHNldE9iamVjdDogIiA8PCBjb250YWluZXJpemUodmFsVHlwZSwgdmFsKSA8PAotICAgICIgZm9yS2V5OiAiIDw8IGNvbnRhaW5lcml6ZShrZXlUeXBlLCBrZXkpIDw8ICJdOyIgPDwgZW5kbDsKLQotICBpZiAodHlwZV9jYW5fYmVfbnVsbChrZXlUeXBlKSkgewotICAgIGlmICghKGdldF90cnVlX3R5cGUoa2V5VHlwZSktPmlzX3N0cmluZygpKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGNvbnRhaW5lcml6ZShrZXlUeXBlLCBrZXkpIDw8ICIgcmVsZWFzZV07IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGlmICh0eXBlX2Nhbl9iZV9udWxsKHZhbFR5cGUpKSB7Ci0gICAgaWYgKCEoZ2V0X3RydWVfdHlwZSh2YWxUeXBlKS0+aXNfc3RyaW5nKCkpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgY29udGFpbmVyaXplKHZhbFR5cGUsIHZhbCkgPDwgIiByZWxlYXNlXTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF90eXBlKiB0eXBlID0gdHNldC0+Z2V0X2VsZW1fdHlwZSgpOwotICB0X2ZpZWxkIGZlbGVtKHR5cGUsIGVsZW0pOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJbIiA8PCBmaWVsZE5hbWUgPDwgIiBhZGRPYmplY3Q6ICIgPDwgY29udGFpbmVyaXplKHR5cGUsIGVsZW0pIDw8ICJdOyIgPDwgZW5kbDsKLQotICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgIC8vIGRlc2VyaWFsaXplZCBzdHJpbmdzIGFyZSBhdXRvcmVsZWFzZSwgc28gZG9uJ3QgcmVsZWFzZSB0aGVtCi0gICAgaWYgKCEoZ2V0X3RydWVfdHlwZSh0eXBlKS0+aXNfc3RyaW5nKCkpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgY29udGFpbmVyaXplKHR5cGUsIGVsZW0pIDw8ICIgcmVsZWFzZV07IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfdHlwZSogdHlwZSA9IHRsaXN0LT5nZXRfZWxlbV90eXBlKCk7Ci0gIHRfZmllbGQgZmVsZW0odHlwZSwgZWxlbSk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIlsiIDw8IGZpZWxkTmFtZSA8PCAiIGFkZE9iamVjdDogIiA8PCBjb250YWluZXJpemUodHlwZSwgZWxlbSkgPDwgIl07IiA8PCBlbmRsOwotCi0gIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgaWYgKCEoZ2V0X3RydWVfdHlwZSh0eXBlKS0+aXNfc3RyaW5nKCkpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgY29udGFpbmVyaXplKHR5cGUsIGVsZW0pIDw8ICIgcmVsZWFzZV07IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIGZpZWxkTmFtZSBOYW1lIHRvIG9mIHRoZSB2YXJpYWJsZSBob2xkaW5nIHRoZSBmaWVsZAotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZE5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGROYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIltvdXRQcm90b2NvbCAiOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93Ci0gICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBmaWVsZE5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5OiAiIDw8IGZpZWxkTmFtZSA8PCAiXTsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmc6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sOiAiIDw8IGZpZWxkTmFtZSA8PCAiXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGU6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTY6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzI6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJNjQ6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGU6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKYXZhIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJ3cml0ZUkzMjogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gZmllbGROYW1lIE5hbWUgb2YgdmFyaWFibGUgaG9sZGluZyBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICAodm9pZCkgdHN0cnVjdDsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIlsiIDw8IGZpZWxkTmFtZSA8PCAiIHdyaXRlOiBvdXRQcm90b2NvbF07IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgd3JpdGluZyBpdHMgc2l6ZSB0aGVuIHRoZSBlbGVtZW50cy4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgIFRoZSB0eXBlIG9mIGNvbnRhaW5lcgotICogQHBhcmFtIGZpZWxkTmFtZSBOYW1lIG9mIHZhcmlhYmxlIGhvbGRpbmcgY29udGFpbmVyCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIltvdXRQcm90b2NvbCB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6ICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiIHZhbHVlVHlwZTogIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIgc2l6ZTogWyIgPDwKLSAgICAgIGZpZWxkTmFtZSA8PCAiIGNvdW50XV07IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiW291dFByb3RvY29sIHdyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGU6ICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiBzaXplOiBbIiA8PAotICAgICAgZmllbGROYW1lIDw8ICIgY291bnRdXTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiW291dFByb3RvY29sIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiIHNpemU6IFsiIDw8Ci0gICAgICBmaWVsZE5hbWUgPDwgIiBjb3VudF1dOyIgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOwotICBzdHJpbmcga2V5OwotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAga2V5ID0gdG1wKCJrZXkiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiTlNFbnVtZXJhdG9yICogIiA8PCBpdGVyIDw8ICIgPSBbIiA8PCBmaWVsZE5hbWUgPDwgIiBrZXlFbnVtZXJhdG9yXTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImlkICIgPDwga2V5IDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAoKCIgPDwga2V5IDw8ICIgPSBbIiA8PCBpdGVyIDw8ICIgbmV4dE9iamVjdF0pKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBrZXkgPSB0bXAoIm9iaiIpOwotICAgIGluZGVudChvdXQpIDw8ICJOU0VudW1lcmF0b3IgKiAiIDw8IGl0ZXIgPDwgIiA9IFsiIDw8IGZpZWxkTmFtZSA8PCAiIG9iamVjdEVudW1lcmF0b3JdOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWQgIiA8PCBrZXkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIndoaWxlICgoIiA8PCBrZXkgPDwgIiA9IFsiIDw8IGl0ZXIgPDwgIiBuZXh0T2JqZWN0XSkpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBrZXkgPSB0bXAoImkiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaW50ICIgPDwga2V5IDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yICgiIDw8IGtleSA8PCAiID0gMDsgIiA8PCBrZXkgPDwgIiA8IFsiIDw8IGZpZWxkTmFtZSA8PCAiIGNvdW50XTsgIiA8PCBrZXkgPDwgIisrKSIgPDwgZW5kbDsKLSAgfQotCi0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtleSwgZmllbGROYW1lKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwga2V5KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwga2V5LCBmaWVsZE5hbWUpOwotICAgIH0KLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJbb3V0UHJvdG9jb2wgd3JpdGVNYXBFbmRdOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIltvdXRQcm90b2NvbCB3cml0ZVNldEVuZF07IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIltvdXRQcm90b2NvbCB3cml0ZUxpc3RFbmRdOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0vKioKLSAqIEdpdmVuIGEgZmllbGQgdmFyaWFibGUgbmFtZSwgd3JhcCBpdCBpbiBjb2RlIHRoYXQgY29udmVydHMgaXQgdG8gYQotICogcHJpbWl0aXZlIHR5cGUsIGlmIG5lY2Vzc2FyeS4KLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpkZWNvbnRhaW5lcml6ZSh0X2ZpZWxkICogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKQotewotICB0X3R5cGUgKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlsiICsgZmllbGROYW1lICsgIiBpbnRWYWx1ZV0iOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJjYW4ndCBkZWNvbnRhaW5lcml6ZSB2b2lkIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlsiICsgZmllbGROYW1lICsgIiBib29sVmFsdWVdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlsiICsgZmllbGROYW1lICsgIiB1bnNpZ25lZENoYXJWYWx1ZV0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJbIiArIGZpZWxkTmFtZSArICIgc2hvcnRWYWx1ZV0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJbIiArIGZpZWxkTmFtZSArICIgbG9uZ1ZhbHVlXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlsiICsgZmllbGROYW1lICsgIiBsb25nTG9uZ1ZhbHVlXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlsiICsgZmllbGROYW1lICsgIiBkb3VibGVWYWx1ZV0iOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvLyBkbyBub3RoaW5nCi0gIHJldHVybiBmaWVsZE5hbWU7Ci19Ci0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXBOYW1lKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCBkZWNvbnRhaW5lcml6ZSgma2ZpZWxkLCBrZXkpKTsKLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksICJbIiArIG1hcE5hbWUgKyAiIG9iamVjdEZvcktleTogIiArIGtleSArICJdIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsIGRlY29udGFpbmVyaXplKCZ2ZmllbGQsIHZmaWVsZC5nZXRfbmFtZSgpKSk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbWVudE5hbWUpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCBkZWNvbnRhaW5lcml6ZSgmZWZpZWxkLCBlbGVtZW50TmFtZSkpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGxpc3ROYW1lKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksICJbIiArIGxpc3ROYW1lICsgIiBvYmplY3RBdEluZGV4OiAiICsgaW5kZXggKyAiXSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCBkZWNvbnRhaW5lcml6ZSgmZWZpZWxkLCBlZmllbGQuZ2V0X25hbWUoKSkpOwotfQotCi0KLS8qKgotICogUmV0dXJucyBhbiBPYmplY3RpdmUtQyBuYW1lCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKiBAcGFyYW0gY2xhc3NfcmVmIERvIHdlIHdhbnQgYSBDbGFzcyByZWZlcmVuY2UgaXN0ZWFkIG9mIGEgdHlwZSByZWZlcmVuY2U/Ci0gKiBAcmV0dXJuIEphdmEgdHlwZSBuYW1lLCBpLmUuIEhhc2hNYXA8S2V5LFZhbHVlPgotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGNsYXNzX3JlZikgewotICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHJldHVybiBjb2NvYV9wcmVmaXhfICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgcmVzdWx0OwotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gImludCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmVzdWx0ID0gIk5TRGljdGlvbmFyeSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmVzdWx0ID0gIk5TU2V0IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmVzdWx0ID0gIk5TQXJyYXkiOwotICB9IGVsc2UgewotICAgIC8vIENoZWNrIGZvciBwcmVmaXgKLSAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgICBpZiAocHJvZ3JhbSAhPSBOVUxMKSB7Ci0gICAgICByZXN1bHQgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjb2NvYSIpICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCA9IHR0eXBlLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgfQotCi0gIGlmICghY2xhc3NfcmVmKSB7Ci0gICAgcmVzdWx0ICs9ICIgKiI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBPYmplY3RpdmUtQyB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgotICoKLSAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUpIHsKLSAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7Ci0KLSAgc3dpdGNoICh0YmFzZSkgewotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgcmV0dXJuICJ2b2lkIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICByZXR1cm4gIk5TRGF0YSAqIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICJOU1N0cmluZyAqIjsKLSAgICB9Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICByZXR1cm4gIkJPT0wiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgcmV0dXJuICJ1aW50OF90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgcmV0dXJuImludDE2X3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICByZXR1cm4gImludDMyX3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICByZXR1cm4iaW50NjRfdCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgIHJldHVybiAiZG91YmxlIjsKLSAgZGVmYXVsdDoKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIG9iamVjdGl2ZS1jIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgfQotfQotCi0KLS8qKgotICogU3BpdCBvdXQgY29kZSB0aGF0IGV2YWx1YXRlcyB0byB0aGUgc3BlY2lmaWVkIGNvbnN0YW50IHZhbHVlLgotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb250YWluZXJpemVfaXQpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJlbmRlciA8PCAiQFwiIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAiWUVTIiA6ICJOTyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZW5kZXIgPDwgIltbIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSkgPDwgIiBhbGxvY10gaW5pdFdpdGgiOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgcmVuZGVyIDw8IGNhcGl0YWxpemUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKTsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCAiICIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgcmVuZGVyIDw8ICI6ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0gICAgcmVuZGVyIDw8ICJdIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJlbmRlciA8PCAiW1tOU0RpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoT2JqZWN0c0FuZEtleXM6ICI7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QsIHRydWUpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQsIHRydWUpOwotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIHJlbmRlciA8PCB2YWwgPDwgIiwgIiA8PCBrZXk7Ci0gICAgfQotICAgIHJlbmRlciA8PCAiLCBuaWxdIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZW5kZXIgPDwgIltbTlNBcnJheSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOiAiOwotICAgIHRfdHlwZSAqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCAiLCAiOwotICAgICAgfQotICAgICAgcmVuZGVyIDw8IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCBldHlwZSwgKnZfaXRlciwgdHJ1ZSk7Ci0gICAgfQotICAgIHJlbmRlciA8PCAiLCBuaWxdIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJlbmRlciA8PCAiW1tOU1NldCBhbGxvY10gaW5pdFdpdGhPYmplY3RzOiAiOwotICAgIHRfdHlwZSAqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVuZGVyIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICByZW5kZXIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIGV0eXBlLCAqdl9pdGVyLCB0cnVlKTsKLSAgICB9Ci0gICAgcmVuZGVyIDw8ICIsIG5pbF0iOwotICB9IGVsc2UgewotICAgIHRocm93ICJkb24ndCBrbm93IGhvdyB0byByZW5kZXIgY29uc3RhbnQgZm9yIHR5cGU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKGNvbnRhaW5lcml6ZV9pdCkgewotICAgIHJldHVybiBjb250YWluZXJpemUodHlwZSwgcmVuZGVyLnN0cigpKTsKLSAgfQotCi0gIHJldHVybiByZW5kZXIuc3RyKCk7Ci19Ci0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLgotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkKSB7Ci0gIHJldHVybiB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSArICIgX18iICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIjsiOwotfQotCi0vKioKLSAqIERlY2xhcmVzIGFuIE9iamVjdGl2ZS1DIDIuMCBwcm9wZXJ0eS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBkZWNsYXJlIGEgcHJvcGVydHkgZm9yCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZGVjbGFyZV9wcm9wZXJ0eSh0X2ZpZWxkKiB0ZmllbGQpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLSAgcmVuZGVyIDw8ICJAcHJvcGVydHkgKG5vbmF0b21pYywgIjsKLQotICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0ZmllbGQtPmdldF90eXBlKCkpKQotICAgIHJlbmRlciA8PCAicmV0YWluLCAiOwotICAKLSAgcmVuZGVyIDw8ICJnZXR0ZXI9IiA8PCBkZWNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKSA8PAotICAgICIsIHNldHRlcj1zZXQiIDw8IGNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKSArICI6KSAiIDw8Ci0gICAgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyI7Ci0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwotICBzdGQ6OnN0cmluZyByZXN1bHQgPQotICAgICIoIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiKSAiICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qKgotICogUmVuZGVycyBhIGNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIHR5cGVzIGFuZCBuYW1lcywgc3VpdGFibGUgZm9yIGFuCi0gKiBvYmplY3RpdmUtYyBwYXJhbWV0ZXIgbGlzdAotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gIjogKCIgKyB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIpICIgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGFuIE9iamVjdGl2ZS1DIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZV9TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGVfQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZV9CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGVfSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGVfSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGVfSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGVfRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZV9JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlX1NUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlX01BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlX1NFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZV9MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotCi0vKioKLSAqIFJldHVybnMgYSBmb3JtYXQgc3RyaW5nIHNwZWNpZmllciBmb3IgdGhlIHN1cHBsaWVkIHBhcnNlIHR5cGUuCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6Zm9ybWF0X3N0cmluZ19mb3JfdHlwZSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlxcXCIlQFxcXCIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiJWkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiJWkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICIlaGkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICIlaSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIiVxaSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIiVmIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICIlaSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiJUAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICIlQCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIiVAIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIiVAIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gZm9ybWF0X3N0cmluZ19mb3JfdHlwZTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjYWxsIHRvIGEgZmllbGQncyBzZXR0ZXIuCi0gKgotICogQHBhcmFtIHRmaWVsZCBGaWVsZCB0aGUgc2V0dGVyIGlzIGJlaW5nIGNhbGxlZCBvbgotICogQHBhcmFtIGZpZWxkTmFtZSBOYW1lIG9mIHZhcmlhYmxlIHRvIHBhc3MgdG8gc2V0dGVyCi0gKi8KLQotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpjYWxsX2ZpZWxkX3NldHRlcih0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgcmV0dXJuICJbc2VsZiBzZXQiICsgY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpICsgIjogIiArIGZpZWxkTmFtZSArICJdOyI7Ci19Ci0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihjb2NvYSwgIkNvY29hIiwKLSIgICAgbG9nX3VuZXhwZWN0ZWQ6ICBMb2cgZXZlcnkgdGltZSBhbiB1bmV4cGVjdGVkIGZpZWxkIElEIG9yIHR5cGUgaXMgZW5jb3VudGVyZWQuXG4iCi0pCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ3MjY0NGUuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MTYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCi0gKiBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxjYXNzZXJ0PgotCi0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBDKysgY29kZSBnZW5lcmF0b3IuIFRoaXMgaXMgbGVnaXRpbWFjeSBpbmNhcm5hdGUuCi0gKgotICovCi1jbGFzcyB0X2NwcF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfY3BwX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgicHVyZV9lbnVtcyIpOwotICAgIGdlbl9wdXJlX2VudW1zXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJkZW5zZSIpOwotICAgIGdlbl9kZW5zZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiaW5jbHVkZV9wcmVmaXgiKTsKLSAgICB1c2VfaW5jbHVkZV9wcmVmaXhfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImNvYl9zdHlsZSIpOwotICAgIGdlbl9jb2Jfc3R5bGVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoIm5vX2NsaWVudF9jb21wbGV0aW9uIik7Ci0gICAgZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJ0ZW1wbGF0ZXMiKTsKLSAgICBnZW5fdGVtcGxhdGVzXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWNwcCI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gICAgZ2VuZXJhdGVfY3BwX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci0gIH0KLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gICAgZ2VuZXJhdGVfY3BwX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotICB9Ci0gIHZvaWQgZ2VuZXJhdGVfY3BwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLQotICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24gICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uPWZhbHNlLCBib29sIHBvaW50ZXJzPWZhbHNlLCBib29sIHJlYWQ9dHJ1ZSwgYm9vbCB3cml0ZT10cnVlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfZmluZ2VycHJpbnQgICAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19kZWZpbml0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycz1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3dyaXRlciAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgcG9pbnRlcnM9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9yZXN1bHRfd3JpdGVyIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzPWZhbHNlKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbnVsbCAgICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbXVsdGlmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgICAgKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IgKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9za2VsZXRvbiAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdHlsZSwgYm9vbCBzcGVjaWFsaXplZD1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyAgKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9hc3luY19za2VsZXRvbiAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3VmZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHVzaF9iYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaW5kZXgpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdWZmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2NhbGwgICAgICAgICAgICAob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBhcmdfcHJlZml4KTsKLSAgLyoKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX3ByZWZpeChzdGQ6OnN0cmluZyBucyk7Ci0gIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9vcGVuKHN0ZDo6c3RyaW5nIG5zKTsKLSAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX2Nsb3NlKHN0ZDo6c3RyaW5nIG5zKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZj1mYWxzZSwgYm9vbCBhcmc9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSwgYm9vbCBwb2ludGVyPWZhbHNlLCBib29sIGNvbnN0YW50PWZhbHNlLCBib29sIHJlZmVyZW5jZT1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHN0eWxlLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsIGJvb2wgbmFtZV9wYXJhbXM9dHJ1ZSk7Ci0gIHN0ZDo6c3RyaW5nIGNvYl9mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsIGJvb2wgbmFtZV9wYXJhbXM9dHJ1ZSk7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgbmFtZV9wYXJhbXM9dHJ1ZSwgYm9vbCBzdGFydF9jb21tYT1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgbG9jYWxfcmVmbGVjdGlvbl9uYW1lKGNvbnN0IGNoYXIqLCB0X3R5cGUqIHR0eXBlLCBib29sIGV4dGVybmFsPWZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2VudW1fY29uc3RhbnRfbGlzdChzdGQ6Om9mc3RyZWFtJiBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGNvbnN0YW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWZmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV92YWx1ZXMpOwotCi0gIC8vIFRoZXNlIGhhbmRsZXMgY2hlY2tpbmcgZ2VuX2RlbnNlXyBhbmQgY2hlY2tpbmcgZm9yIGR1cGxpY2F0ZXMuCi0gIHZvaWQgZ2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIGJvb2wgaXNfZGVmaW5pdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbl9wb2ludGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSk7Ci0KLSAgYm9vbCBpc19jb21wbGV4X3R5cGUodF90eXBlKiB0dHlwZSkgewotICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0KLSAgICByZXR1cm4KLSAgICAgIHR0eXBlLT5pc19jb250YWluZXIoKSB8fAotICAgICAgdHR5cGUtPmlzX3N0cnVjdCgpIHx8Ci0gICAgICB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fAotICAgICAgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykpOwotICB9Ci0KLSAgdm9pZCBzZXRfdXNlX2luY2x1ZGVfcHJlZml4KGJvb2wgdXNlX2luY2x1ZGVfcHJlZml4KSB7Ci0gICAgdXNlX2luY2x1ZGVfcHJlZml4XyA9IHVzZV9pbmNsdWRlX3ByZWZpeDsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGluY2x1ZGUgcHJlZml4IHRvIHVzZSBmb3IgYSBmaWxlIGdlbmVyYXRlZCBieSBwcm9ncmFtLCBvciB0aGUKLSAgICogZW1wdHkgc3RyaW5nIGlmIG5vIGluY2x1ZGUgcHJlZml4IHNob3VsZCBiZSB1c2VkLgotICAgKi8KLSAgc3RkOjpzdHJpbmcgZ2V0X2luY2x1ZGVfcHJlZml4KGNvbnN0IHRfcHJvZ3JhbSYgcHJvZ3JhbSkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIHB1cmUgZW51bXMgZm9yIFRocmlmdCBlbnVtcywgaW5zdGVhZCBvZiB3cmFwcGVyIGNsYXNzZXMuCi0gICAqLwotICBib29sIGdlbl9wdXJlX2VudW1zXzsKLQotICAvKioKLSAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgbG9jYWwgcmVmbGVjdGlvbiBtZXRhZGF0YSBmb3IgVERlbnNlUHJvdG9jb2wuCi0gICAqLwotICBib29sIGdlbl9kZW5zZV87Ci0KLSAgLyoqCi0gICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIHRlbXBsYXRpemVkIHJlYWRlci93cml0ZXIgbWV0aG9kcy4KLSAgICovCi0gIGJvb2wgZ2VuX3RlbXBsYXRlc187Ci0KLSAgLyoqCi0gICAqIFRydWUgaWYgd2Ugc2hvdWxkIHVzZSBhIHBhdGggcHJlZml4IGluIG91ciAjaW5jbHVkZSBzdGF0ZW1lbnRzIGZvciBvdGhlcgotICAgKiB0aHJpZnQtZ2VuZXJhdGVkIGhlYWRlciBmaWxlcy4KLSAgICovCi0gIGJvb2wgdXNlX2luY2x1ZGVfcHJlZml4XzsKLQotICAvKioKLSAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgIkNvbnRpbnVhdGlvbiBPQmplY3QiLXN0eWxlIGNsYXNzZXMgYXMgd2VsbC4KLSAgICovCi0gIGJvb2wgZ2VuX2NvYl9zdHlsZV87Ci0KLSAgLyoqCi0gICAqIFRydWUgaWYgd2Ugc2hvdWxkIG9taXQgY2FsbHMgdG8gY29tcGxldGlvbl9fKCkgaW4gQ29iQ2xpZW50IGNsYXNzLgotICAgKi8KLSAgYm9vbCBnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fOwotCi0gIC8qKgotICAgKiBTdHJpbmdzIGZvciBuYW1lc3BhY2UsIGNvbXB1dGVkIG9uY2UgdXAgZnJvbnQgdGhlbiB1c2VkIGRpcmVjdGx5Ci0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIG5zX29wZW5fOwotICBzdGQ6OnN0cmluZyBuc19jbG9zZV87Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcywgc3RvcmVkIGhlcmUgdG8gYXZvaWQgcGFzc2luZyB0aGVtIGFzIHBhcmFtZXRlcnMgdG8gZXZlcnkKLSAgICogZnVuY3Rpb24uCi0gICAqLwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc19pbXBsXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzX3RjY187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9oZWFkZXJfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlX3RjY187Ci0KLSAgLyoqCi0gICAqIFdoZW4gZ2VuZXJhdGluZyBsb2NhbCByZWZsZWN0aW9ucywgbWFrZSBzdXJlIHdlIGRvbid0IGdlbmVyYXRlIGR1cGxpY2F0ZXMuCi0gICAqLwotICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gcmVmbGVjdGVkX2ZpbmdlcnByaW50c187Ci19OwotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkrcHJvZ3JhbV9uYW1lXysiX3R5cGVzLmgiOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZl90eXBlc19pbXBsX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fbmFtZV8rIl90eXBlcy5jcHAiOwotICBmX3R5cGVzX2ltcGxfLm9wZW4oZl90eXBlc19pbXBsX25hbWUuY19zdHIoKSk7Ci0KLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgLy8gSWYgd2UgZG9uJ3Qgb3BlbiB0aGUgc3RyZWFtLCBpdCBhcHBlYXJzIHRvIGp1c3QgZGlzY2FyZCBkYXRhLAotICAgIC8vIHdoaWNoIGlzIGZpbmUuCi0gICAgc3RyaW5nIGZfdHlwZXNfdGNjX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fbmFtZV8rIl90eXBlcy50Y2MiOwotICAgIGZfdHlwZXNfdGNjXy5vcGVuKGZfdHlwZXNfdGNjX25hbWUuY19zdHIoKSk7Ci0gIH0KLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl90eXBlc18gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKTsKLSAgZl90eXBlc19pbXBsXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpOwotICBmX3R5cGVzX3RjY18gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKTsKLQotICAvLyBTdGFydCBpZm5kZWYKLSAgZl90eXBlc18gPDwKLSAgICAiI2lmbmRlZiAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9UWVBFU19IIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfVFlQRVNfSCIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGZfdHlwZXNfdGNjXyA8PAotICAgICIjaWZuZGVmICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX1RZUEVTX1RDQyIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX1RZUEVTX1RDQyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gSW5jbHVkZSBiYXNlIHR5cGVzCi0gIGZfdHlwZXNfIDw8Ci0gICAgIiNpbmNsdWRlIDxUaHJpZnQuaD4iIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8cHJvdG9jb2wvVFByb3RvY29sLmg+IiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydC5oPiIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gSW5jbHVkZSBvdGhlciBUaHJpZnQgaW5jbHVkZXMKLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIGZfdHlwZXNfIDw8Ci0gICAgICAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqKGluY2x1ZGVzW2ldKSkgPDwKLSAgICAgIGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpIDw8ICJfdHlwZXMuaFwiIiA8PCBlbmRsOwotCi0gICAgLy8gWFhYKHNpbXBraW5zKTogSWYgZ2VuX3RlbXBsYXRlc18gaXMgZW5hYmxlZCwgd2UgY3VycmVudGx5IGFzc3VtZSBhbGwKLSAgICAvLyBpbmNsdWRlZCBmaWxlcyB3ZXJlIGFsc28gZ2VuZXJhdGVkIHdpdGggdGVtcGxhdGVzIGVuYWJsZWQuCi0gICAgZl90eXBlc190Y2NfIDw8Ci0gICAgICAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqKGluY2x1ZGVzW2ldKSkgPDwKLSAgICAgIGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpIDw8ICJfdHlwZXMudGNjXCIiIDw8IGVuZGw7Ci0gIH0KLSAgZl90eXBlc18gPDwgZW5kbDsKLQotICAvLyBJbmNsdWRlIGN1c3RvbSBoZWFkZXJzCi0gIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBjcHBfaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2NwcF9pbmNsdWRlcygpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNwcF9pbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIGlmIChjcHBfaW5jbHVkZXNbaV1bMF0gPT0gJzwnKSB7Ci0gICAgICBmX3R5cGVzXyA8PAotICAgICAgICAiI2luY2x1ZGUgIiA8PCBjcHBfaW5jbHVkZXNbaV0gPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl90eXBlc18gPDwKLSAgICAgICAgIiNpbmNsdWRlIFwiIiA8PCBjcHBfaW5jbHVkZXNbaV0gPDwgIlwiIiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBmX3R5cGVzXyA8PAotICAgIGVuZGw7Ci0KLSAgLy8gSW5jbHVkZSB0aGUgdHlwZXMgZmlsZQotICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwKLSAgICAiX3R5cGVzLmhcIiIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGZfdHlwZXNfdGNjXyA8PAotICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8Ci0gICAgIl90eXBlcy5oXCIiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIElmIHdlIGFyZSBnZW5lcmF0aW5nIGxvY2FsIHJlZmxlY3Rpb24gbWV0YWRhdGEsIHdlIG5lZWQgdG8gaW5jbHVkZQotICAvLyB0aGUgZGVmaW5pdGlvbiBvZiBUeXBlU3BlYy4KLSAgaWYgKGdlbl9kZW5zZV8pIHsKLSAgICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgICAiI2luY2x1ZGUgPFRSZWZsZWN0aW9uTG9jYWwuaD4iIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLQotICAvLyBPcGVuIG5hbWVzcGFjZQotICBuc19vcGVuXyA9IG5hbWVzcGFjZV9vcGVuKHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSk7Ci0gIG5zX2Nsb3NlXyA9IG5hbWVzcGFjZV9jbG9zZShwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY3BwIikpOwotCi0gIGZfdHlwZXNfIDw8Ci0gICAgbnNfb3Blbl8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl90eXBlc19pbXBsXyA8PAotICAgIG5zX29wZW5fIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGZfdHlwZXNfdGNjXyA8PAotICAgIG5zX29wZW5fIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIENsb3NlcyB0aGUgb3V0cHV0IGZpbGVzLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICAvLyBDbG9zZSBuYW1lc3BhY2UKLSAgZl90eXBlc18gPDwKLSAgICBuc19jbG9zZV8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICBuc19jbG9zZV8gPDwgZW5kbDsKLSAgZl90eXBlc190Y2NfIDw8Ci0gICAgbnNfY2xvc2VfIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEluY2x1ZGUgdGhlIHR5cGVzLnRjYyBmaWxlIGZyb20gdGhlIHR5cGVzIGhlYWRlciBmaWxlLAotICAvLyBzbyBjbGllbnRzIGRvbid0IGhhdmUgdG8gZXhwbGljaXRseSBpbmNsdWRlIHRoZSB0Y2MgZmlsZS4KLSAgLy8gVE9ETyhzaW1wa2lucyk6IE1ha2UgdGhpcyBhIHNlcGFyYXRlIG9wdGlvbi4KLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgZl90eXBlc18gPDwKLSAgICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8Ci0gICAgICAiX3R5cGVzLnRjY1wiIiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgLy8gQ2xvc2UgaWZuZGVmCi0gIGZfdHlwZXNfIDw8Ci0gICAgIiNlbmRpZiIgPDwgZW5kbDsKLSAgZl90eXBlc190Y2NfIDw8Ci0gICAgIiNlbmRpZiIgPDwgZW5kbDsKLQotICAvLyBDbG9zZSBvdXRwdXQgZmlsZQotICBmX3R5cGVzXy5jbG9zZSgpOwotICBmX3R5cGVzX2ltcGxfLmNsb3NlKCk7Ci0gIGZfdHlwZXNfdGNjXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMganVzdCBhIHNpbXBsZSAxLWxpbmVyIGluIEMrKwotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgZl90eXBlc18gPDwKLSAgICBpbmRlbnQoKSA8PCAidHlwZWRlZiAiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgIiAiIDw8IHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW1fY29uc3RhbnRfbGlzdChzdGQ6Om9mc3RyZWFtJiBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGNvbnN0YW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWZmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV92YWx1ZXMpIHsKLSAgZiA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGYgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChmKQotICAgICAgPDwgcHJlZml4IDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCBzdWZmaXg7Ci0gICAgaWYgKGluY2x1ZGVfdmFsdWVzICYmICgqY19pdGVyKS0+aGFzX3ZhbHVlKCkpIHsKLSAgICAgIGYgPDwgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICB9Ci0gIH0KLQotICBmIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmKSA8PCAifTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gSW4gQysrLCB0aGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lCi0gKiBhcyB0aGUgdGhyaWZ0IGRlZmluaXRpb24gaXRzZWxmLCB1c2luZyB0aGUgZW51bSBrZXl3b3JkIGluIEMrKy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0KLSAgc3RkOjpzdHJpbmcgZW51bV9uYW1lID0gdGVudW0tPmdldF9uYW1lKCk7Ci0gIGlmICghZ2VuX3B1cmVfZW51bXNfKSB7Ci0gICAgZW51bV9uYW1lID0gInR5cGUiOwotICAgIGZfdHlwZXNfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic3RydWN0ICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0gIGZfdHlwZXNfIDw8Ci0gICAgaW5kZW50KCkgPDwgImVudW0gIiA8PCBlbnVtX25hbWU7Ci0KLSAgZ2VuZXJhdGVfZW51bV9jb25zdGFudF9saXN0KGZfdHlwZXNfLCBjb25zdGFudHMsICIiLCAiIiwgdHJ1ZSk7Ci0KLSAgaWYgKCFnZW5fcHVyZV9lbnVtc18pIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfdHlwZXNfIDw8ICJ9OyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfdHlwZXNfIDw8IGVuZGw7Ci0KLSAgLyoqCi0gICAgIEdlbmVyYXRlIGEgY2hhcmFjdGVyIGFycmF5IG9mIGVudW0gbmFtZXMgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KLSAgKi8KLSAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiI7Ci0gIGlmICghZ2VuX3B1cmVfZW51bXNfKSB7Ci0gICAgcHJlZml4ID0gdGVudW0tPmdldF9uYW1lKCkgKyAiOjoiOwotICB9Ci0KLSAgZl90eXBlc19pbXBsXyA8PAotICAgIGluZGVudCgpIDw8ICJpbnQgX2siIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJWYWx1ZXNbXSA9IjsKLSAgZ2VuZXJhdGVfZW51bV9jb25zdGFudF9saXN0KGZfdHlwZXNfaW1wbF8sIGNvbnN0YW50cywgcHJlZml4LmNfc3RyKCksICIiLCBmYWxzZSk7Ci0KLSAgZl90eXBlc19pbXBsXyA8PAotICAgIGluZGVudCgpIDw8ICJjb25zdCBjaGFyKiBfayIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIk5hbWVzW10gPSI7Ci0gIGdlbmVyYXRlX2VudW1fY29uc3RhbnRfbGlzdChmX3R5cGVzX2ltcGxfLCBjb25zdGFudHMsICJcIiIsICJcIiIsIGZhbHNlKTsKLQotICBmX3R5cGVzXyA8PAotICAgIGluZGVudCgpIDw8ICJleHRlcm4gY29uc3Qgc3RkOjptYXA8aW50LCBjb25zdCBjaGFyKj4gXyIgPDwKLSAgICB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiX1ZBTFVFU19UT19OQU1FUzsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgaW5kZW50KCkgPDwgImNvbnN0IHN0ZDo6bWFwPGludCwgY29uc3QgY2hhcio+IF8iIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8Ci0gICAgIl9WQUxVRVNfVE9fTkFNRVMoOjphcGFjaGU6OnRocmlmdDo6VEVudW1JdGVyYXRvcigiIDw8IGNvbnN0YW50cy5zaXplKCkgPDwKLSAgICAiLCBfayIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIlZhbHVlcyIgPDwKLSAgICAiLCBfayIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIk5hbWVzKSwgIiA8PAotICAgICI6OmFwYWNoZTo6dGhyaWZ0OjpURW51bUl0ZXJhdG9yKC0xLCBOVUxMLCBOVUxMKSk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbihmX3R5cGVzXywgdGVudW0sIGZhbHNlKTsKLSAgZ2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbihmX3R5cGVzX2ltcGxfLCB0ZW51bSwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7Ci0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyJfY29uc3RhbnRzLmgiOwotICBvZnN0cmVhbSBmX2NvbnN0czsKLSAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBmX2NvbnN0c19pbXBsX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fbmFtZV8rIl9jb25zdGFudHMuY3BwIjsKLSAgb2ZzdHJlYW0gZl9jb25zdHNfaW1wbDsKLSAgZl9jb25zdHNfaW1wbC5vcGVuKGZfY29uc3RzX2ltcGxfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl9jb25zdHMgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKTsKLSAgZl9jb25zdHNfaW1wbCA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpOwotCi0gIC8vIFN0YXJ0IGlmbmRlZgotICBmX2NvbnN0cyA8PAotICAgICIjaWZuZGVmICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX0NPTlNUQU5UU19IIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfQ09OU1RBTlRTX0giIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwKLSAgICAiX3R5cGVzLmhcIiIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBuc19vcGVuXyA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX2NvbnN0c19pbXBsIDw8Ci0gICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwKLSAgICAiX2NvbnN0YW50cy5oXCIiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgbnNfb3Blbl8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl9jb25zdHMgPDwKLSAgICAiY2xhc3MgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHMgeyIgPDwgZW5kbCA8PAotICAgICIgcHVibGljOiIgPDwgZW5kbCA8PAotICAgICIgICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzKCk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7Ci0gICAgZl9jb25zdHMgPDwKLSAgICAgIGluZGVudCgpIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX2NvbnN0cyA8PAotICAgICJ9OyIgPDwgZW5kbDsKLQotICBmX2NvbnN0c19pbXBsIDw8Ci0gICAgImNvbnN0ICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIGdfIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfY29uc3RhbnRzOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHM6OiIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHNfaW1wbCwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX2NvbnN0c19pbXBsKSA8PAotICAgICJ9IiA8PCBlbmRsOwotCi0gIGZfY29uc3RzIDw8Ci0gICAgZW5kbCA8PAotICAgICJleHRlcm4gY29uc3QgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHMgZ18iIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9jb25zdGFudHM7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIG5zX2Nsb3NlXyA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICIjZW5kaWYiIDw8IGVuZGw7Ci0gIGZfY29uc3RzLmNsb3NlKCk7Ci0KLSAgZl9jb25zdHNfaW1wbCA8PAotICAgIGVuZGwgPDwKLSAgICBuc19jbG9zZV8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7Ci0gICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuX19pc3NldC4iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5pbnNlcnQoc3RkOjptYWtlX3BhaXIoIiA8PCBrZXkgPDwgIiwgIiA8PCB2YWwgPDwgIikpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5wdXNoX2JhY2soIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5pbnNlcnQoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHByaW50X2NvbnN0X3ZhbHVlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotfQotCi0vKioKLSAqCi0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvZnN0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICAodm9pZCkgbmFtZTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMTCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZW5kZXIgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOwotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgdCA8PCAiOyIgPDwgZW5kbDsKLSAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlKTsKLSAgICByZW5kZXIgPDwgdDsKLSAgfQotCi0gIHJldHVybiByZW5kZXIuc3RyKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBhIGNsYXNzCi0gKiB3aXRoIGRhdGEgbWVtYmVycyBhbmQgYSByZWFkL3dyaXRlKCkgZnVuY3Rpb24sIHBsdXMgYSBtaXJyb3JpbmcgaXNzZXQKLSAqIGlubmVyIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3BwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gIGdlbmVyYXRlX3N0cnVjdF9maW5nZXJwcmludChmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCB0cnVlKTsKLSAgZ2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOwotICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QsIHRydWUpOwotICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uX3BvaW50ZXIoZl90eXBlc19pbXBsXywgdHN0cnVjdCk7Ci0KLSAgc3RkOjpvZnN0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl90eXBlc190Y2NfIDogZl90eXBlc19pbXBsXyk7Ci0gIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotfQotCi0vKioKLSAqIFdyaXRlcyB0aGUgc3RydWN0IGRlZmluaXRpb24gaW50byB0aGUgaGVhZGVyIGZpbGUKLSAqCi0gKiBAcGFyYW0gb3V0IE91dHB1dCBzdHJlYW0KLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3cml0ZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgZXh0ZW5kcyA9ICIgOiBwdWJsaWMgOjphcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiI7Ci0gIH0KLQotICAvLyBHZXQgbWVtYmVycwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotCi0gIC8vIFdyaXRlIHRoZSBpc3NldCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb24gb3V0c2lkZSB0aGUgY2xhc3MuIFRoaXMgbWFrZXMKLSAgLy8gdGhlIGdlbmVyYXRlZCBjb2RlIGFtZW5hYmxlIHRvIHByb2Nlc3NpbmcgYnkgU1dJRy4KLSAgLy8gV2Ugb25seSBkZWNsYXJlIHRoZSBzdHJ1Y3QgaWYgaXQgZ2V0cyB1c2VkIGluIHRoZSBjbGFzcy4KLQotICAvLyBJc3NldCBzdHJ1Y3QgaGFzIGJvb2xlYW4gZmllbGRzLCBidXQgb25seSBmb3Igbm9uLXJlcXVpcmVkIGZpZWxkcy4KLSAgYm9vbCBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gZmFsc2U7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKLSAgICAgIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSB0cnVlOwotICB9Ci0KLSAgaWYgKGhhc19ub25yZXF1aXJlZF9maWVsZHMgJiYgKCFwb2ludGVycyB8fCByZWFkKSkgewotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiX19pc3NldCB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJfIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJfX2lzc2V0KCkgIjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICBvdXQgPDwKLSAgICAgICAgICAiOiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKGZhbHNlKSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICAiLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKGZhbHNlKSI7Ci0gICAgICB9Ci0gICAgfQotICAgIG91dCA8PCAiIHt9IiA8PCBlbmRsOwotCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAiYm9vbCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIn0gXyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiX19pc3NldDsiIDw8IGVuZGw7Ci0gICAgfQotCi0gIG91dCA8PCBlbmRsOwotCi0gIC8vIE9wZW4gc3RydWN0IGRlZgotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IGV4dGVuZHMgPDwgIiB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiBwdWJsaWM6IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gUHV0IHRoZSBmaW5nZXJwcmludCB1cCB0b3AgZm9yIGFsbCB0byBzZWUuCi0gIGdlbmVyYXRlX3N0cnVjdF9maW5nZXJwcmludChvdXQsIHRzdHJ1Y3QsIGZhbHNlKTsKLQotICBpZiAoIXBvaW50ZXJzKSB7Ci0gICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSI7Ci0KLSAgICBib29sIGluaXRfY3RvciA9IGZhbHNlOwotCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgIHN0cmluZyBkdmFsOwotICAgICAgICBpZiAodC0+aXNfZW51bSgpKSB7Ci0gICAgICAgICAgZHZhbCArPSAiKCIgKyB0eXBlX25hbWUodCkgKyAiKSI7Ci0gICAgICAgIH0KLSAgICAgICAgZHZhbCArPSB0LT5pc19zdHJpbmcoKSA/ICJcIlwiIiA6ICIwIjsKLSAgICAgICAgdF9jb25zdF92YWx1ZSogY3YgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOwotICAgICAgICBpZiAoY3YgIT0gTlVMTCkgewotICAgICAgICAgIGR2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCAoKm1faXRlciktPmdldF9uYW1lKCksIHQsIGN2KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWluaXRfY3RvcikgewotICAgICAgICAgIGluaXRfY3RvciA9IHRydWU7Ci0gICAgICAgICAgb3V0IDw8ICIgOiAiOwotICAgICAgICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGR2YWwgPDwgIikiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAiLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZHZhbCA8PCAiKSI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8ICIgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICAvLyBUT0RPKGRyZWlzcyk6IFdoZW4gZXZlcnl0aGluZyBlbHNlIGluIFRocmlmdCBpcyBwZXJmZWN0LAotICAgIC8vIGRvIG1vcmUgb2YgdGhlc2UgaW4gdGhlIGluaXRpYWxpemVyIGxpc3QuCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotCi0gICAgICBpZiAoIXQtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKLSAgICAgICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgdCwgY3YpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotCi0gIGlmICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSA9PSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIHRocm93KCkge30iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUncyByZWZsZWN0aW9uIGxvY2FsIHR5cGVzcGVjLgotICBpZiAoZ2VuX2RlbnNlXykgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAic3RhdGljIDo6YXBhY2hlOjp0aHJpZnQ6OnJlZmxlY3Rpb246OmxvY2FsOjpUeXBlU3BlYyogbG9jYWxfcmVmbGVjdGlvbjsiIDw8Ci0gICAgICBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBEZWNsYXJlIGFsbCBmaWVsZHMKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCBwb2ludGVycyAmJiAhKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc194Y2VwdGlvbigpLCAhcmVhZCkgPDwgZW5kbDsKLSAgfQotCi0gIC8vIEFkZCB0aGUgX19pc3NldCBkYXRhIG1lbWJlciBpZiB3ZSBuZWVkIGl0LCB1c2luZyB0aGUgZGVmaW5pdGlvbiBmcm9tIGFib3ZlCi0gIGlmIChoYXNfbm9ucmVxdWlyZWRfZmllbGRzICYmICghcG9pbnRlcnMgfHwgcmVhZCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJfIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJfX2lzc2V0IF9faXNzZXQ7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gQ3JlYXRlIGEgc2V0dGVyIGZ1bmN0aW9uIGZvciBlYWNoIGZpZWxkCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpZiAocG9pbnRlcnMpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBvdXQgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ2b2lkIF9fc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICIoIiA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgb3V0IDw8ICIgdmFsKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHZhbDsiIDw8IGVuZGw7Ci0KLSAgICAvLyBhc3N1bWUgYWxsIGZpZWxkcyBhcmUgcmVxdWlyZWQgZXhjZXB0IG9wdGlvbmFsIGZpZWxkcy4KLSAgICAvLyBmb3Igb3B0aW9uYWwgZmllbGRzIGNoYW5nZSBfX2lzc2V0Lm5hbWUgdG8gdHJ1ZQotICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgIGlmIChpc19vcHRpb25hbCkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJfX2lzc2V0LiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKTw8ICJ9IiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCBlbmRsOwotCi0gIGlmICghcG9pbnRlcnMpIHsKLSAgICAvLyBHZW5lcmF0ZSBhbiBlcXVhbGl0eSB0ZXN0aW5nIG9wZXJhdG9yLiAgTWFrZSBpdCBpbmxpbmUgc2luY2UgdGhlIGNvbXBpbGVyCi0gICAgLy8gd2lsbCBkbyBhIGJldHRlciBqb2IgdGhhbiB3ZSB3b3VsZCB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gaW5saW5lIGl0LgotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICYgIiA8PAotICAgICAgKG1lbWJlcnMuc2l6ZSgpID4gMCA/ICJyaHMiIDogIi8qIHJocyAqLyIpIDw8ICIpIGNvbnN0IiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgLy8gTW9zdCBleGlzdGluZyBUaHJpZnQgY29kZSBkb2VzIG5vdCB1c2UgaXNzZXQgb3Igb3B0aW9uYWwvcmVxdWlyZWQsCi0gICAgICAvLyBzbyB3ZSB0cmVhdCAiZGVmYXVsdCIgZmllbGRzIGFzIHJlcXVpcmVkLgotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICghKCIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgPDwgIiA9PSByaHMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoX19pc3NldC4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgIDw8ICIgIT0gcmhzLl9faXNzZXQuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImVsc2UgaWYgKF9faXNzZXQuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAmJiAhKCIKLSAgICAgICAgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSByaHMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICA8PCAiKSkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJib29sIG9wZXJhdG9yICE9IChjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmcmhzKSBjb25zdCB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gISgqdGhpcyA9PSByaHMpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIEdlbmVyYXRlIHRoZSBkZWNsYXJhdGlvbiBvZiBhIGxlc3MtdGhhbiBvcGVyYXRvci4gIFRoaXMgbXVzdCBiZQotICAgIC8vIGltcGxlbWVudGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgaWYgdGhleSB3aXNoIHRvIHVzZSBpdC4gIChUaGV5Ci0gICAgLy8gd2lsbCBnZXQgYSBsaW5rIGVycm9yIGlmIHRoZXkgdHJ5IHRvIHVzZSBpdCB3aXRob3V0IGFuIGltcGxlbWVudGF0aW9uLikKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJib29sIG9wZXJhdG9yIDwgKGNvbnN0ICIKLSAgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmICkgY29uc3Q7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAocmVhZCkgewotICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgcmVhZChQcm90b2NvbF8qIGlwcm90KTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgcmVhZCgiIDw8Ci0gICAgICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCk7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBpZiAod3JpdGUpIHsKLSAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInVpbnQzMl90IHdyaXRlKFByb3RvY29sXyogb3Byb3QpIGNvbnN0OyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCB3cml0ZSgiIDw8Ci0gICAgICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCkgY29uc3Q7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogV3JpdGVzIHRoZSBmaW5nZXJwcmludCBvZiBhIHN0cnVjdCB0byBlaXRoZXIgdGhlIGhlYWRlciBvciBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBAcGFyYW0gb3V0IE91dHB1dCBzdHJlYW0KLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9maW5nZXJwcmludChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kZWZpbml0aW9uKSB7Ci0gIHN0cmluZyBzdGF0LCBuc3BhY2UsIGNvbW1lbnQ7Ci0gIGlmIChpc19kZWZpbml0aW9uKSB7Ci0gICAgc3RhdCA9ICIiOwotICAgIG5zcGFjZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiOjoiOwotICAgIGNvbW1lbnQgPSAiICI7Ci0gIH0gZWxzZSB7Ci0gICAgc3RhdCA9ICJzdGF0aWMgIjsKLSAgICBuc3BhY2UgPSAiIjsKLSAgICBjb21tZW50ID0gIjsgLy8gIjsKLSAgfQotCi0gIGlmICh0c3RydWN0LT5oYXNfZmluZ2VycHJpbnQoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgc3RhdCA8PCAiY29uc3QgY2hhciogIiA8PCBuc3BhY2UKLSAgICAgICAgPDwgImFzY2lpX2ZpbmdlcnByaW50IiA8PCBjb21tZW50IDw8ICI9IFwiIiA8PAotICAgICAgICB0c3RydWN0LT5nZXRfYXNjaWlfZmluZ2VycHJpbnQoKSA8PCAiXCI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBzdGF0IDw8ICJjb25zdCB1aW50OF90ICIgPDwgbnNwYWNlIDw8Ci0gICAgICAgICJiaW5hcnlfZmluZ2VycHJpbnRbIiA8PCB0X3R5cGU6OmZpbmdlcnByaW50X2xlbiA8PCAiXSIgPDwgY29tbWVudCA8PCAiPSB7IjsKLSAgICBjb25zdCBjaGFyKiBjb21tYSA9ICIiOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdF90eXBlOjpmaW5nZXJwcmludF9sZW47IGkrKykgewotICAgICAgb3V0IDw8IGNvbW1hIDw8ICIweCIgPDwgdF9zdHJ1Y3Q6OmJ5dGVfdG9faGV4KHRzdHJ1Y3QtPmdldF9iaW5hcnlfZmluZ2VycHJpbnQoKVtpXSk7Ci0gICAgICBjb21tYSA9ICIsIjsKLSAgICB9Ci0gICAgb3V0IDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogV3JpdGVzIHRoZSBsb2NhbCByZWZsZWN0aW9uIG9mIGEgdHlwZSAoZWl0aGVyIGRlY2xhcmF0aW9uIG9yIGRlZmluaXRpb24pLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kZWZpbml0aW9uKSB7Ci0gIGlmICghZ2VuX2RlbnNlXykgewotICAgIHJldHVybjsKLSAgfQotICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotICBhc3NlcnQodHR5cGUtPmhhc19maW5nZXJwcmludCgpKTsKLSAgc3RyaW5nIGtleSA9IHR0eXBlLT5nZXRfYXNjaWlfZmluZ2VycHJpbnQoKSArIChpc19kZWZpbml0aW9uID8gIi1kZWZuIiA6ICItZGVjbCIpOwotICAvLyBOb3RlIHRoYXQgd2UgaGF2ZSBnZW5lcmF0ZWQgdGhpcyBmaW5nZXJwcmludC4gIElmIHdlIGFscmVhZHkgZGlkLCBiYWlsIG91dC4KLSAgaWYgKCFyZWZsZWN0ZWRfZmluZ2VycHJpbnRzXy5pbnNlcnQoa2V5KS5zZWNvbmQpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gTGV0IGVhY2ggcHJvZ3JhbSBoYW5kbGUgaXRzIG93biBzdHJ1Y3R1cmVzLgotICBpZiAodHR5cGUtPmdldF9wcm9ncmFtKCkgIT0gTlVMTCAmJiB0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBwcm9ncmFtXykgewotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIERvIGRlcGVuZGVuY2llcy4KLSAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uKG91dCwgKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCBpc19kZWZpbml0aW9uKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uKG91dCwgKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIGlzX2RlZmluaXRpb24pOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24ob3V0LCAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpLCBpc19kZWZpbml0aW9uKTsKLSAgICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uKG91dCwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgaXNfZGVmaW5pdGlvbik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgLy8gSGFja3kgaGFja3kuICBGb3IgZWZmaWNpZW5jeSBhbmQgY29udmVuaWVuY2UsIHdlIG5lZWQgYSBkdW1teSAiVF9TVE9QIgotICAgIC8vIHR5cGUgYXQgdGhlIGVuZCBvZiBvdXIgdHlwZXNwZWMgYXJyYXkuICBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcyBubwotICAgIC8vIFRfU1RPUCB0eXBlLCBzbyB3ZSB1c2UgdGhlIGdsb2JhbCB2b2lkIHR5cGUsIGFuZCBzcGVjaWFsIGNhc2UgaXQgd2hlbgotICAgIC8vIGdlbmVyYXRpbmcgaXRzIHR5cGVzcGVjLgotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9ICgodF9zdHJ1Y3QqKXR0eXBlKS0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24ob3V0LCAoKiptX2l0ZXIpLmdldF90eXBlKCksIGlzX2RlZmluaXRpb24pOwotICAgIH0KLSAgICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uKG91dCwgZ190eXBlX3ZvaWQsIGlzX2RlZmluaXRpb24pOwotCi0gICAgLy8gRm9yIGRlZmluaXRpb25zIG9mIHN0cnVjdHVyZXMsIGRvIHRoZSBhcnJheXMgb2YgbWV0YXMgYW5kIGZpZWxkIHNwZWNzIGFsc28uCi0gICAgaWYgKGlzX2RlZmluaXRpb24pIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cmVmbGVjdGlvbjo6bG9jYWw6OkZpZWxkTWV0YSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoIm1ldGFzIiwgdHR5cGUpIDw8IltdID0geyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAieyAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsICIgPDwKLSAgICAgICAgICAoKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpID8gInRydWUiIDogImZhbHNlIikgPDwKLSAgICAgICAgICAiIH0sIiA8PCBlbmRsOwotICAgICAgfQotICAgICAgLy8gWmVybyBmb3IgdGhlIFRfU1RPUCBtYXJrZXIuCi0gICAgICBpbmRlbnQob3V0KSA8PCAieyAwLCBmYWxzZSB9IiA8PCBlbmRsIDw8ICJ9OyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cmVmbGVjdGlvbjo6bG9jYWw6OlR5cGVTcGVjKiIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInNwZWNzIiwgdHR5cGUpIDw8IltdID0geyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiJiIgPDwKLSAgICAgICAgICBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiLCIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudChvdXQpIDw8ICImIiA8PAotICAgICAgICBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgZ190eXBlX3ZvaWQpIDw8ICIsIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9OyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiLy8gIiA8PCB0dHlwZS0+Z2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IChpc19kZWZpbml0aW9uID8gIiIgOiAiZXh0ZXJuICIpIDw8Ci0gICAgICAiOjphcGFjaGU6OnRocmlmdDo6cmVmbGVjdGlvbjo6bG9jYWw6OlR5cGVTcGVjIiA8PCBlbmRsIDw8Ci0gICAgICBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgdHR5cGUpIDw8Ci0gICAgICAoaXNfZGVmaW5pdGlvbiA/ICIoIiA6ICI7IikgPDwgZW5kbDsKLQotICBpZiAoIWlzX2RlZmluaXRpb24pIHsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbmRlbnRfdXAoKTsKLQotICBpZiAodHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVE9QIjsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX3RvX2VudW0odHR5cGUpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgIG91dCA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCAiOjpiaW5hcnlfZmluZ2VycHJpbnQsIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoIm1ldGFzIiwgdHR5cGUpIDw8ICIsIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInNwZWNzIiwgdHR5cGUpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICImIiA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIk5VTEwiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiYiIDw8IGxvY2FsX3JlZmxlY3Rpb25fbmFtZSgidHlwZXNwZWMiLCAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJOVUxMIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICImIiA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICImIiA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7Ci0gIH0KLQotICBvdXQgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBXcml0ZXMgdGhlIHN0cnVjdHVyZSdzIHN0YXRpYyBwb2ludGVyIHRvIGl0cyBsb2NhbCByZWZsZWN0aW9uIHR5cGVzcGVjCi0gKiBpbnRvIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbl9wb2ludGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSkgewotICBpZiAoIWdlbl9kZW5zZV8pIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiOjphcGFjaGU6OnRocmlmdDo6cmVmbGVjdGlvbjo6bG9jYWw6OlR5cGVTcGVjKiAiIDw8Ci0gICAgICB0dHlwZS0+Z2V0X25hbWUoKSA8PCAiOjpsb2NhbF9yZWZsZWN0aW9uID0gIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgJiIgPDwgbG9jYWxfcmVmbGVjdGlvbl9uYW1lKCJ0eXBlc3BlYyIsIHR0eXBlKSA8PCAiOyIgPDwKLSAgICBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogTWFrZXMgYSBoZWxwZXIgZnVuY3Rpb24gdG8gZ2VuIGEgc3RydWN0IHJlYWRlci4KLSAqCi0gKiBAcGFyYW0gb3V0IFN0cmVhbSB0byB3cml0ZSB0bwotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJzKSB7Ci0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8Ci0gICAgICAiOjpyZWFkKFByb3RvY29sXyogaXByb3QpIHsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwKLSAgICAgICI6OnJlYWQoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QpIHsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcwotICBvdXQgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInVpbnQzMl90IHhmZXIgPSAwOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzdGQ6OnN0cmluZyBmbmFtZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpbnQxNl90IGZpZDsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRTdHJ1Y3RCZWdpbihmbmFtZSk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ1c2luZyA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRXhjZXB0aW9uOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gUmVxdWlyZWQgdmFyaWFibGVzIGFyZW4ndCBpbiBfX2lzc2V0LCBzbyB3ZSBuZWVkIHRtcCB2YXJzIHRvIGNoZWNrIHRoZW0uCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpCi0gICAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCBpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCBlbmRsOwotCi0KLSAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IGlwcm90LT5yZWFkRmllbGRCZWdpbihmbmFtZSwgZnR5cGUsIGZpZCk7IiA8PCBlbmRsOwotCi0gICAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKGZ0eXBlID09IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUT1ApIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAic3dpdGNoIChmaWQpIiA8PCBlbmRsOwotCi0gICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgImlmIChmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAgIGNvbnN0IGNoYXIgKmlzc2V0X3ByZWZpeCA9Ci0gICAgICAgICAgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpID8gInRoaXMtPl9faXNzZXQuIiA6ICJpc3NldF8iOwotCi0jaWYgMAotICAgICAgICAvLyBUaGlzIGNvZGUgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc2FtZSBmaWVsZCBpcyBlbmNvdW50ZXJlZCB0d2ljZS4KLSAgICAgICAgLy8gV2UndmUgZGVjaWRlZCB0byBsZWF2ZSBpdCBvdXQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCi0gICAgICAgIC8vIFRPRE8oZHJlaXNzKTogR2VuZXJhdGUgdGhpcyBjb2RlIGFuZCAiaWYiIGl0IG91dCB0byBtYWtlIGl0IGVhc2llcgotICAgICAgICAvLyBmb3IgcGVvcGxlIHJlY29tcGlsaW5nIHRocmlmdCB0byBpbmNsdWRlIGl0LgotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgaXNzZXRfcHJlZml4IDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7IiA8PCBlbmRsOwotI2VuZGlmCi0KLSAgICAgICAgaWYgKHBvaW50ZXJzICYmICEoKmZfaXRlciktPmdldF90eXBlKCktPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICIoKih0aGlzLT4iLCAiKSkiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLT4iKTsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBpc3NldF9wcmVmaXggPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgeGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgLy8gVE9ETyhkcmVpc3MpOiBNYWtlIHRoaXMgYW4gb3B0aW9uIHdoZW4gdGhyaWZ0IHN0cnVjdHMKLSAgICAgICAgICAvLyBoYXZlIGEgY29tbW9uIGJhc2UgY2xhc3MuCi0gICAgICAgICAgLy8gaW5kZW50KCkgPDwgIiAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgeGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IGlwcm90LT5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgb3V0IDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIC8vIFRocm93IGlmIGFueSByZXF1aXJlZCBmaWVsZHMgYXJlIG1pc3NpbmcuCi0gIC8vIFdlIGRvIHRoaXMgYWZ0ZXIgcmVhZGluZyB0aGUgc3RydWN0IGVuZCBzbyB0aGF0Ci0gIC8vIHRoZXJlIG1pZ2h0IHBvc3NpYmx5IGJlIGEgY2hhbmNlIG9mIGNvbnRpbnVpbmcuCi0gIG91dCA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoIWlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICcpJyA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgInJldHVybiB4ZmVyOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSB3cml0ZSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gb3V0IFN0cmVhbSB0byB3cml0ZSB0bwotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJzKSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInVpbnQzMl90ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PAotICAgICAgIjo6d3JpdGUoUHJvdG9jb2xfKiBvcHJvdCkgY29uc3QgeyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInVpbnQzMl90ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PAotICAgICAgIjo6d3JpdGUoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpIGNvbnN0IHsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInVpbnQzMl90IHhmZXIgPSAwOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEJlZ2luKFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMtPl9faXNzZXQuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkQmVnaW4oIiA8PAotICAgICAgIlwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBpZiAocG9pbnRlcnMgJiYgISgqZl9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgIigqKHRoaXMtPiIsICIpKSIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy0+Iik7Ci0gICAgfQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICd9JyA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4geGZlcjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogU3RydWN0IHdyaXRlciBmb3IgcmVzdWx0IG9mIGEgZnVuY3Rpb24sIHdoaWNoIGNhbiBoYXZlIG9ubHkgb25lIG9mIGl0cwotICogZmllbGRzIHNldCBhbmQgZG9lcyBhIGNvbmRpdGlvbmFsIGlmIGVsc2UgbG9vayB1cCBpbnRvIHRoZSBfX2lzc2V0IGZpZWxkCi0gKiBvZiB0aGUgc3RydWN0LgotICoKLSAqIEBwYXJhbSBvdXQgT3V0cHV0IHN0cmVhbQotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHJlc3VsdCBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVycykgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwKLSAgICAgICI6OndyaXRlKFByb3RvY29sXyogb3Byb3QpIGNvbnN0IHsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwKLSAgICAgICI6OndyaXRlKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdCB7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgeGZlciA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEJlZ2luKFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIG91dCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgIiBlbHNlIGlmICI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIodGhpcy0+X19pc3NldC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkQmVnaW4oIiA8PAotICAgICAgIlwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBpZiAocG9pbnRlcnMpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICIoKih0aGlzLT4iLCAiKSkiKTsKLSAgICB9IGVsc2UgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOwotICAgIH0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICB9Ci0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4geGZlcjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKLSAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcwotICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgotICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBzdmNuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZXMKLSAgc3RyaW5nIGZfaGVhZGVyX25hbWUgPSBnZXRfb3V0X2RpcigpK3N2Y25hbWUrIi5oIjsKLSAgZl9oZWFkZXJfLm9wZW4oZl9oZWFkZXJfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIgZmlsZSBpbmNsdWRlcwotICBmX2hlYWRlcl8gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiNpZm5kZWYgIiA8PCBzdmNuYW1lIDw8ICJfSCIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgc3ZjbmFtZSA8PCAiX0giIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgICIjaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+IiA8PCBlbmRsIDw8IC8vIFRNZW1vcnlCdWZmZXIKLSAgICAgICIjaW5jbHVkZSA8dHIxL2Z1bmN0aW9uYWw+IiA8PCBlbmRsIDw8Ci0gICAgICAibmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgeyIgPDwgZW5kbCA8PAotICAgICAgImNsYXNzIFRBc3luY0NoYW5uZWw7IiA8PCBlbmRsIDw8Ci0gICAgICAifX19IiA8PCBlbmRsOwotICB9Ci0gIGZfaGVhZGVyXyA8PAotICAgICIjaW5jbHVkZSA8VFByb2Nlc3Nvci5oPiIgPDwgZW5kbDsKLSAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICAiI2luY2x1ZGUgPGFzeW5jL1RBc3luY1Byb2Nlc3Nvci5oPiIgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwKLSAgICAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXyA8PAotICAgICJfdHlwZXMuaFwiIiA8PCBlbmRsOwotCi0gIHRfc2VydmljZSogZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gIGlmIChleHRlbmRzX3NlcnZpY2UgIT0gTlVMTCkgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKihleHRlbmRzX3NlcnZpY2UtPmdldF9wcm9ncmFtKCkpKSA8PAotICAgICAgZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIuaFwiIiA8PCBlbmRsOwotICB9Ci0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgZW5kbCA8PAotICAgIG5zX29wZW5fIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIFNlcnZpY2UgaW1wbGVtZW50YXRpb24gZmlsZSBpbmNsdWRlcwotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpK3N2Y25hbWUrIi5jcHAiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBzdmNuYW1lIDw8ICIuaFwiIiA8PCBlbmRsOwotICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAiI2luY2x1ZGUgXCJhc3luYy9UQXN5bmNDaGFubmVsLmhcIiIgPDwgZW5kbDsKLSAgfQotICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PAotICAgICAgIi50Y2NcIiIgPDwgZW5kbDsKLQotICAgIHN0cmluZyBmX3NlcnZpY2VfdGNjX25hbWUgPSBnZXRfb3V0X2RpcigpK3N2Y25hbWUrIi50Y2MiOwotICAgIGZfc2VydmljZV90Y2NfLm9wZW4oZl9zZXJ2aWNlX3RjY19uYW1lLmNfc3RyKCkpOwotICAgIGZfc2VydmljZV90Y2NfIDw8Ci0gICAgICBhdXRvZ2VuX2NvbW1lbnQoKTsKLSAgICBmX3NlcnZpY2VfdGNjXyA8PAotICAgICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwKLSAgICAgICIuaFwiIiA8PCBlbmRsOwotCi0gICAgZl9zZXJ2aWNlX3RjY18gPDwKLSAgICAgICIjaWZuZGVmICIgPDwgc3ZjbmFtZSA8PCAiX1RDQyIgPDwgZW5kbCA8PAotICAgICAgIiNkZWZpbmUgIiA8PCBzdmNuYW1lIDw8ICJfVENDIiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotCi0gICAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7Ci0gICAgICBmX3NlcnZpY2VfdGNjXyA8PAotICAgICAgICAiI2luY2x1ZGUgXCJhc3luYy9UQXN5bmNDaGFubmVsLmhcIiIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgZW5kbCA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7Ci0gIGZfc2VydmljZV90Y2NfIDw8Ci0gICAgZW5kbCA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgYWxsIHRoZSBjb21wb25lbnRzCi0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlLCAiIik7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfbnVsbCh0c2VydmljZSwgIiIpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSwgIiIpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSwgIiIpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX211bHRpZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2tlbGV0b24odHNlcnZpY2UpOwotCi0gIC8vIEdlbmVyYXRlIGFsbCB0aGUgY29iIGNvbXBvbmVudHMKLSAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UsICJDb2JDbCIpOwotICAgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlLCAiQ29iU3YiKTsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX251bGwodHNlcnZpY2UsICJDb2JTdiIpOwotICAgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlLCAiQ29iIik7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodHNlcnZpY2UsICJDb2IiKTsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX3NrZWxldG9uKHRzZXJ2aWNlKTsKLSAgfQotCi0gIC8vIENsb3NlIHRoZSBuYW1lc3BhY2UKLSAgZl9zZXJ2aWNlXyA8PAotICAgIG5zX2Nsb3NlXyA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgZl9zZXJ2aWNlX3RjY18gPDwKLSAgICBuc19jbG9zZV8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGZfaGVhZGVyXyA8PAotICAgIG5zX2Nsb3NlXyA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBUT0RPKHNpbXBraW5zKTogTWFrZSB0aGlzIGEgc2VwYXJhdGUgb3B0aW9uCi0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwKLSAgICAgICIudGNjXCIiIDw8IGVuZGwgPDwKLSAgICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8Ci0gICAgICAiX3R5cGVzLnRjY1wiIiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiNlbmRpZiIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlX3RjY18gPDwKLSAgICAiI2VuZGlmIiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIHRoZSBmaWxlcwotICBmX3NlcnZpY2VfdGNjXy5jbG9zZSgpOwotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci0gIGZfaGVhZGVyXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuIEJhc2ljYWxseSwgdGhpcyBnZW5lcmF0ZXMgdHlwZXMKLSAqIGZvciBhbGwgdGhlIGFyZ3VtZW50cyBhbmQgcmVzdWx0cyB0byBmdW5jdGlvbnMuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgc3RkOjpvZnN0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl9zZXJ2aWNlX3RjY18gOiBmX3NlcnZpY2VfKTsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBzdHJpbmcgbmFtZV9vcmlnID0gdHMtPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBUT0RPKGRyZWlzcyk6IFdoeSBpcyB0aGlzIHN0dWZmIG5vdCBpbiBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzPwotICAgIHRzLT5zZXRfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyIpOwotICAgIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKGZfaGVhZGVyXywgdHMsIGZhbHNlKTsKLSAgICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHMpOwotICAgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIob3V0LCB0cyk7Ci0gICAgdHMtPnNldF9uYW1lKHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9wYXJncyIpOwotICAgIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKGZfaGVhZGVyXywgdHMsIGZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihvdXQsIHRzLCB0cnVlKTsKLSAgICB0cy0+c2V0X25hbWUobmFtZV9vcmlnKTsKLQotICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSkgewotCi0gIHN0cmluZyBzZXJ2aWNlX2lmX25hbWUgPSBzZXJ2aWNlX25hbWVfICsgc3R5bGUgKyAiSWYiOwotICBpZiAoc3R5bGUgPT0gIkNvYkNsIikgewotICAgIC8vIEZvcndhcmQgZGVjbGFyZSB0aGUgY2xpZW50LgotICAgIHN0cmluZyBjbGllbnRfbmFtZSA9IHNlcnZpY2VfbmFtZV8gKyAiQ29iQ2xpZW50IjsKLSAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIGNsaWVudF9uYW1lICs9ICJUIjsKLSAgICAgIHNlcnZpY2VfaWZfbmFtZSArPSAiVCI7Ci0gICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PAotICAgICAgICAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICJjbGFzcyAiIDw8IGNsaWVudF9uYW1lIDw8ICI7IiA8PAotICAgICAgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gIiA6IHZpcnR1YWwgcHVibGljICIgKyB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpICsKLSAgICAgIHN0eWxlICsgIklmIjsKLSAgICBpZiAoc3R5bGUgPT0gIkNvYkNsIiAmJiBnZW5fdGVtcGxhdGVzXykgewotICAgICAgLy8gVE9ETyhzaW1wa2lucyk6IElmIGdlbl90ZW1wbGF0ZXNfIGlzIGVuYWJsZWQsIHdlIGN1cnJlbnRseSBhc3N1bWUgYWxsCi0gICAgICAvLyBwYXJlbnQgc2VydmljZXMgd2VyZSBhbHNvIGdlbmVyYXRlZCB3aXRoIHRlbXBsYXRlcyBlbmFibGVkLgotICAgICAgZXh0ZW5kcyArPSAiVDxQcm90b2NvbF8+IjsKLSAgICB9Ci0gIH0KLQotICBpZiAoc3R5bGUgPT0gIkNvYkNsIiAmJiBnZW5fdGVtcGxhdGVzXykgewotICAgIGZfaGVhZGVyXyA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7Ci0gIH0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgImNsYXNzICIgPDwgc2VydmljZV9pZl9uYW1lIDw8IGV4dGVuZHMgPDwgIiB7IiA8PCBlbmRsIDw8Ci0gICAgIiBwdWJsaWM6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgc2VydmljZV9pZl9uYW1lIDw8ICIoKSB7fSIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHN0eWxlKSA8PCAiID0gMDsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIn07IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaWYgKHN0eWxlID09ICJDb2JDbCIgJiYgZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAvLyBnZW5lcmF0ZSBhIGJhY2t3YXJkcy1jb21wYXRpYmxlIHR5cGVkZWYgZm9yIGNsaWVudHMgdGhhdCBkbyBub3QKLSAgICAvLyBrbm93IGFib3V0IHRoZSBuZXcgdGVtcGxhdGUtc3R5bGUgY29kZQotICAgIGZfaGVhZGVyXyA8PAotICAgICAgInR5cGVkZWYgIiA8PCBzZXJ2aWNlX2lmX25hbWUgPDwKLSAgICAgICI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+ICIgPDwKLSAgICAgIHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIklmOyIgPDwKLSAgICAgIGVuZGwgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIG51bGwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX251bGwodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9ICIgLCB2aXJ0dWFsIHB1YmxpYyAiICsgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSArIHN0eWxlICsgIk51bGwiOwotICB9Ci0gIGZfaGVhZGVyXyA8PAotICAgICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIk51bGwgOiB2aXJ0dWFsIHB1YmxpYyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIklmIiA8PCBleHRlbmRzIDw8ICIgeyIgPDwgZW5kbCA8PAotICAgICIgcHVibGljOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIk51bGwoKSB7fSIgPDwgZW5kbDsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgc3R5bGUsICIiLCBmYWxzZSkgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgdF90eXBlKiByZXR1cm50eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgIHRfZmllbGQgcmV0dXJuZmllbGQocmV0dXJudHlwZSwgIl9yZXR1cm4iKTsKLQotICAgIGlmIChzdHlsZSA9PSAiIikgewotICAgICAgaWYgKHJldHVybnR5cGUtPmlzX3ZvaWQoKSB8fCBpc19jb21wbGV4X3R5cGUocmV0dXJudHlwZSkpIHsKLSAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmcmV0dXJuZmllbGQsIHRydWUpIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIF9yZXR1cm47IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoc3R5bGUgPT0gIkNvYlN2IikgewotICAgICAgaWYgKHJldHVybnR5cGUtPmlzX3ZvaWQoKSkgewotICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInJldHVybiBjb2IoKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRfZmllbGQgcmV0dXJuZmllbGQocmV0dXJudHlwZSwgIl9yZXR1cm4iKTsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZyZXR1cm5maWVsZCwgdHJ1ZSkgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYihfcmV0dXJuKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93ICJVTktOT1dOIFNUWUxFIjsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIn07IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9jYWxsKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgdGFyZ2V0LCBzdHJpbmcgaWZhY2UsIHN0cmluZyBhcmdfcHJlZml4KSB7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICB0X3R5cGUqIHJldF90eXBlID0gZ2V0X3RydWVfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpOwotICBvdXQgPDwgaW5kZW50KCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhcmV0X3R5cGUtPmlzX3ZvaWQoKSkgewotICAgIGlmIChpc19jb21wbGV4X3R5cGUocmV0X3R5cGUpKSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgb3V0IDw8IGlmYWNlIDw8ICItPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0YXJnZXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCB0YXJnZXQgPDwgIiA9ICIgPDwgaWZhY2UgPDwgIi0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwgaWZhY2UgPDwgIi0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICB9Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgIiwgIjsKLSAgICB9Ci0gICAgb3V0IDw8IGFyZ19wcmVmaXggPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIG91dCA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX3NrZWxldG9uKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIHN2Y25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKTsKLQotICAvLyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGZpbGUgaW5jbHVkZXMKLSAgc3RyaW5nIGZfc2tlbGV0b25fbmFtZSA9IGdldF9vdXRfZGlyKCkrc3ZjbmFtZSsiX2FzeW5jX3NlcnZlci5za2VsZXRvbi5jcHAiOwotCi0gIHN0cmluZyBucyA9IG5hbWVzcGFjZV9wcmVmaXgodHNlcnZpY2UtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImNwcCIpKTsKLQotICBvZnN0cmVhbSBmX3NrZWxldG9uOwotICBmX3NrZWxldG9uLm9wZW4oZl9za2VsZXRvbl9uYW1lLmNfc3RyKCkpOwotICBmX3NrZWxldG9uIDw8Ci0gICAgIi8vIFRoaXMgYXV0b2dlbmVyYXRlZCBza2VsZXRvbiBmaWxlIGlsbHVzdHJhdGVzIG9uZSB3YXkgdG8gYWRhcHQgYSBzeW5jaHJvbm91cyIgPDwgZW5kbCA8PAotICAgICIvLyBpbnRlcmZhY2UgaW50byBhbiBhc3luY2hyb25vdXMgaW50ZXJmYWNlLiBZb3Ugc2hvdWxkIGNvcHkgaXQgdG8gYW5vdGhlciIgPDwgZW5kbCA8PAotICAgICIvLyBmaWxlbmFtZSB0byBhdm9pZCBvdmVyd3JpdGluZyBpdCBhbmQgcmV3cml0ZSBhcyBhc3luY2hyb25vdXMgYW55IGZ1bmN0aW9ucyIgPDwgZW5kbCA8PAotICAgICIvLyB0aGF0IHdvdWxkIG90aGVyd2lzZSBpbnRyb2R1Y2UgdW53YW50ZWQgbGF0ZW5jeS4iIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwgIi5oXCIiIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8YXN5bmMvVEV2ZW50U2VydmVyLmg+IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDsiIDw8IGVuZGwgPDwKLSAgICAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOyIgPDwgZW5kbCA8PAotICAgICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OyIgPDwgZW5kbCA8PAotICAgICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6YXN5bmM7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICJ1c2luZyBib29zdDo6c2hhcmVkX3B0cjsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGlmICghbnMuZW1wdHkoKSkgewotICAgIGZfc2tlbGV0b24gPDwKLSAgICAgICJ1c2luZyBuYW1lc3BhY2UgIiA8PCBzdHJpbmcobnMsIDAsIG5zLnNpemUoKS0yKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIGZfc2tlbGV0b24gPDwKLSAgICAiY2xhc3MgIiA8PCBzdmNuYW1lIDw8ICJBc3luY0hhbmRsZXIgOiAiIDw8Ci0gICAgInB1YmxpYyAiIDw8IHN2Y25hbWUgPDwgIkNvYlN2SWYgeyIgPDwgZW5kbCA8PAotICAgICIgcHVibGljOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2tlbGV0b24gPDwKLSAgICBpbmRlbnQoKSA8PCBzdmNuYW1lIDw8ICJBc3luY0hhbmRsZXIoKSB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgc3luY0hhbmRsZXJfID0gc3RkOjphdXRvX3B0cjwiIDw8IHN2Y25hbWUgPDwKLSAgICAgICAgICAgICAgICAiSGFuZGxlcj4obmV3ICIgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlcik7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgLy8gWW91ciBpbml0aWFsaXphdGlvbiBnb2VzIGhlcmUiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgZl9za2VsZXRvbiA8PAotICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkFzeW5jSGFuZGxlcigpOyIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NrZWxldG9uIDw8Ci0gICAgICBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgIkNvYlN2IiwgIiIsIHRydWUpIDw8ICIgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIHRfdHlwZSogcmV0dXJudHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICB0X2ZpZWxkIHJldHVybmZpZWxkKHJldHVybnR5cGUsICJfcmV0dXJuIik7Ci0KLSAgICBzdHJpbmcgdGFyZ2V0ID0gcmV0dXJudHlwZS0+aXNfdm9pZCgpID8gIiIgOiAiX3JldHVybiI7Ci0gICAgaWYgKCFyZXR1cm50eXBlLT5pc192b2lkKCkpIHsKLSAgICAgIGZfc2tlbGV0b24gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmcmV0dXJuZmllbGQsIHRydWUpIDw8IGVuZGw7Ci0gICAgfQotICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2NhbGwoZl9za2VsZXRvbiwgKmZfaXRlciwgdGFyZ2V0LCAic3luY0hhbmRsZXJfIiwgIiIpOwotICAgIGZfc2tlbGV0b24gPDwgaW5kZW50KCkgPDwgInJldHVybiBjb2IoIiA8PCB0YXJnZXQgPDwgIik7IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihmX3NrZWxldG9uKTsKLSAgfQotICBmX3NrZWxldG9uIDw8IGVuZGwgPDwKLSAgICAiIHByb3RlY3RlZDoiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAic3RkOjphdXRvX3B0cjwiIDw8IHN2Y25hbWUgPDwgIkhhbmRsZXI+IHN5bmNIYW5kbGVyXzsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2tlbGV0b24gPDwKLSAgICAifTsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBtdWx0aWZhY2UsIHdoaWNoIGlzIGEgc2luZ2xlIHNlcnZlciB0aGF0IGp1c3QgdGFrZXMgYSBzZXQKLSAqIG9mIG9iamVjdHMgaW1wbGVtZW50aW5nIHRoZSBpbnRlcmZhY2UgYW5kIGNhbGxzIHRoZW0gYWxsLCByZXR1cm5pbmcgdGhlCi0gKiB2YWx1ZSBvZiB0aGUgbGFzdCBvbmUgdG8gYmUgY2FsbGVkLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIG11bHRpc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbXVsdGlmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfbXVsdGlmYWNlID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19tdWx0aWZhY2UgPSAiLCBwdWJsaWMgIiArIGV4dGVuZHMgKyAiTXVsdGlmYWNlIjsKLSAgfQotCi0gIHN0cmluZyBsaXN0X3R5cGUgPSBzdHJpbmcoInN0ZDo6dmVjdG9yPGJvb3N0OjpzaGFyZWRfcHRyPCIpICsgc2VydmljZV9uYW1lXyArICJJZj4gPiI7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGZfaGVhZGVyXyA8PAotICAgICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIk11bHRpZmFjZSA6ICIgPDwKLSAgICAidmlydHVhbCBwdWJsaWMgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZiIgPDwKLSAgICBleHRlbmRzX211bHRpZmFjZSA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICAiIHB1YmxpYzoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJNdWx0aWZhY2UoIiA8PCBsaXN0X3R5cGUgPDwgIiYgaWZhY2VzKSA6IGlmYWNlc18oaWZhY2VzKSB7IiA8PCBlbmRsOwotICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgc3RkOjp2ZWN0b3I8Ym9vc3Q6OnNoYXJlZF9wdHI8IiArIHNlcnZpY2VfbmFtZV8gKyAiSWY+ID46Oml0ZXJhdG9yIGl0ZXI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBmb3IgKGl0ZXIgPSBpZmFjZXMuYmVnaW4oKTsgaXRlciAhPSBpZmFjZXMuZW5kKCk7ICsraXRlcikgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICAiIDw8IGV4dGVuZHMgPDwgIk11bHRpZmFjZTo6YWRkKCppdGVyKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIH0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJNdWx0aWZhY2UoKSB7fSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICAvLyBQcm90ZWN0ZWQgZGF0YSBtZW1iZXJzCi0gIGZfaGVhZGVyXyA8PAotICAgICIgcHJvdGVjdGVkOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8IGxpc3RfdHlwZSA8PCAiIGlmYWNlc187IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCAiTXVsdGlmYWNlKCkge30iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidm9pZCBhZGQoYm9vc3Q6OnNoYXJlZF9wdHI8IiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZj4gaWZhY2UpIHsiIDw8IGVuZGw7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgIk11bHRpZmFjZTo6YWRkKGlmYWNlKTsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaWZhY2VzXy5wdXNoX2JhY2soaWZhY2UpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogYXJnbGlzdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0KLSAgICBzdHJpbmcgY2FsbCA9IHN0cmluZygiaWZhY2VzX1tpXS0+IikgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiKCI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgaWYgKGlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7Ci0gICAgICBjYWxsICs9ICJfcmV0dXJuIjsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfQotICAgIGZvciAoYV9pdGVyID0gYXJncy5iZWdpbigpOyBhX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY2FsbCArPSAiLCAiOwotICAgICAgfQotICAgICAgY2FsbCArPSAoKmFfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGNhbGwgKz0gIikiOwotCi0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgIiIpIDw8ICIgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJzaXplX3Qgc3ogPSBpZmFjZXNfLnNpemUoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN6OyArK2kpIHsiIDw8IGVuZGw7Ci0gICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlmIChpID09IHN6IC0gMSkgeyIgPDwgZW5kbDsKLSAgICAgIGlmIChpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgICIgPDwgY2FsbCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuICIgPDwgY2FsbCA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAgICIgPDwgY2FsbCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBjYWxsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSkgewotICBzdHJpbmcgaWZzdHlsZTsKLSAgaWYgKHN0eWxlID09ICJDb2IiKSB7Ci0gICAgaWZzdHlsZSA9ICJDb2JDbCI7Ci0gIH0KLQotICBzdGQ6Om9mc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3NlcnZpY2VfdGNjXyA6IGZfc2VydmljZV8pOwotICBzdHJpbmcgdGVtcGxhdGVfaGVhZGVyLCB0ZW1wbGF0ZV9zdWZmaXgsIHNob3J0X3N1ZmZpeCwgcHJvdG9jb2xfdHlwZSwgX3RoaXM7Ci0gIHN0cmluZyBjb25zdCBwcm90X2ZhY3RvcnlfdHlwZSA9Ci0gICAgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5IjsKLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgdGVtcGxhdGVfaGVhZGVyID0gInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+XG4iOwotICAgIHNob3J0X3N1ZmZpeCA9ICJUIjsKLSAgICB0ZW1wbGF0ZV9zdWZmaXggPSAiVDxQcm90b2NvbF8+IjsKLSAgICBwcm90b2NvbF90eXBlID0gIlByb3RvY29sXyI7Ci0gICAgX3RoaXMgPSAidGhpcy0+IjsKLSAgfSBlbHNlIHsKLSAgICBwcm90b2NvbF90eXBlID0gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wiOwotICB9Ci0gIHN0cmluZyBwcm90X3B0ciA9ICJib29zdDo6c2hhcmVkX3B0cjwgIiArIHByb3RvY29sX3R5cGUgKyAiPiI7Ci0gIHN0cmluZyBjbGllbnRfc3VmZml4ID0gIkNsaWVudCIgKyB0ZW1wbGF0ZV9zdWZmaXg7Ci0gIHN0cmluZyBpZl9zdWZmaXggPSAiSWYiOwotICBpZiAoc3R5bGUgPT0gIkNvYiIpIHsKLSAgICBpZl9zdWZmaXggKz0gdGVtcGxhdGVfc3VmZml4OwotICB9Ci0KLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgLy8gVE9ETyhzaW1wa2lucyk6IElmIGdlbl90ZW1wbGF0ZXNfIGlzIGVuYWJsZWQsIHdlIGN1cnJlbnRseSBhc3N1bWUgYWxsCi0gICAgLy8gcGFyZW50IHNlcnZpY2VzIHdlcmUgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0ZW1wbGF0ZXMgZW5hYmxlZC4KLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9ICIsIHB1YmxpYyAiICsgZXh0ZW5kcyArIHN0eWxlICsgY2xpZW50X3N1ZmZpeDsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBmX2hlYWRlcl8gPDwKLSAgICB0ZW1wbGF0ZV9oZWFkZXIgPDwKLSAgICAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJDbGllbnQiIDw8IHNob3J0X3N1ZmZpeCA8PCAiIDogIiA8PAotICAgICJ2aXJ0dWFsIHB1YmxpYyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgaWZzdHlsZSA8PCBpZl9zdWZmaXggPDwKLSAgICBleHRlbmRzX2NsaWVudCA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICAiIHB1YmxpYzoiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIGlmIChzdHlsZSAhPSAiQ29iIikgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwKLSAgICAgICIoIiA8PCBwcm90X3B0ciA8PCAiIHByb3QpIDoiIDw8Ci0gICAgICBlbmRsOwotICAgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBwaXByb3RfKHByb3QpLCIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBwb3Byb3RfKHByb3QpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3RfID0gcHJvdC5nZXQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3RfID0gcHJvdC5nZXQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgc3R5bGUgPDwgY2xpZW50X3N1ZmZpeCA8PAotICAgICAgICAiKHByb3QsIHByb3QpIHt9IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwKLSAgICAgICIoIiA8PCBwcm90X3B0ciA8PCAiIGlwcm90LCAiIDw8IHByb3RfcHRyIDw8ICIgb3Byb3QpIDoiIDw8IGVuZGw7Ci0gICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHBpcHJvdF8oaXByb3QpLCIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBwb3Byb3RfKG9wcm90KSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90XyA9IGlwcm90LmdldCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBvcHJvdF8gPSBvcHJvdC5nZXQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgc3R5bGUgPDwgY2xpZW50X3N1ZmZpeCA8PAotICAgICAgICAiKGlwcm90LCBvcHJvdCkge30iIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gR2VuZXJhdGUgZ2V0dGVycyBmb3IgdGhlIHByb3RvY29scy4KLSAgICAvLyBOb3RlIHRoYXQgdGhlc2UgYXJlIG5vdCBjdXJyZW50bHkgdGVtcGxhdGVkIGZvciBzaW1wbGljaXR5LgotICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBzaG91bGQgdGhleSBiZSB0ZW1wbGF0ZWQ/Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGdldElucHV0UHJvdG9jb2woKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBfdGhpcyA8PCAicGlwcm90XzsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGdldE91dHB1dFByb3RvY29sKCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgX3RoaXMgPDwgInBvcHJvdF87IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICB9IGVsc2UgLyogaWYgKHN0eWxlID09ICJDb2IiKSAqLyB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJDbGllbnQiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKCIgPDwKLSAgICAgICJib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY0NoYW5uZWw+IGNoYW5uZWwsICIgPDwKLSAgICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeSogcHJvdG9jb2xGYWN0b3J5KSA6IiA8PAotICAgICAgZW5kbDsKLSAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgY2hhbm5lbF8oY2hhbm5lbCksIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGl0cmFuc18obmV3IDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcigpKSwiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgb3RyYW5zXyhuZXcgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKCkpLCIgPDwgZW5kbDsKLSAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgICAvLyBUUHJvdG9jb2xGYWN0b3J5IGNsYXNzZXMgcmV0dXJuIGdlbmVyaWMgVFByb3RvY29sIHBvaW50ZXJzLgotICAgICAgICAvLyBXZSBoYXZlIHRvIGR5bmFtaWMgY2FzdCB0byB0aGUgUHJvdG9jb2xfIHR5cGUgd2UgYXJlIGV4cGVjdGluZy4KLSAgICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcGlwcm90Xyhib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8UHJvdG9jb2xfPigiIDw8Ci0gICAgICAgICAgInByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2woaXRyYW5zXykpKSwiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBwb3Byb3RfKGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxQcm90b2NvbF8+KCIgPDwKLSAgICAgICAgICAicHJvdG9jb2xGYWN0b3J5LT5nZXRQcm90b2NvbChvdHJhbnNfKSkpIHsiIDw8IGVuZGw7Ci0gICAgICAgIC8vIFRocm93IGEgVEV4Y2VwdGlvbiBpZiBlaXRoZXIgZHluYW1pYyBjYXN0IGZhaWxlZC4KLSAgICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgKCFwaXByb3RfIHx8ICFwb3Byb3RfKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgICB0aHJvdyA6OmFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKFwiIiA8PAotICAgICAgICAgICJUUHJvdG9jb2xGYWN0b3J5IHJldHVybmVkIHVuZXhwZWN0ZWQgcHJvdG9jb2wgdHlwZSBpbiAiIDw8Ci0gICAgICAgICAgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwKLSAgICAgICAgICAiIGNvbnN0cnVjdG9yXCIpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBwaXByb3RfKHByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2woaXRyYW5zXykpLCIgPDwKLSAgICAgICAgICBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcG9wcm90Xyhwcm90b2NvbEZhY3RvcnktPmdldFByb3RvY29sKG90cmFuc18pKSB7IiA8PAotICAgICAgICAgIGVuZGw7Ci0gICAgICB9Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3RfID0gcGlwcm90Xy5nZXQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3RfID0gcG9wcm90Xy5nZXQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgc3R5bGUgPDwgY2xpZW50X3N1ZmZpeCA8PAotICAgICAgICAiKGNoYW5uZWwsIHByb3RvY29sRmFjdG9yeSkge30iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHN0eWxlID09ICJDb2IiKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNDaGFubmVsPiBnZXRDaGFubmVsKCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgX3RoaXMgPDwgImNoYW5uZWxfOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgaWYgKCFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZpcnR1YWwgdm9pZCBjb21wbGV0ZWRfXyhib29sIC8qIHN1Y2Nlc3MgKi8pIHt9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBpZnN0eWxlKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAvLyBUT0RPKGRyZWlzcyk6IFVzZSBwcml2YXRlIGluaGVyaXRhbmNlIHRvIGF2b2lkIGdlbmVyYXRpbmcgdGhpc2UgaW4gY29iLXN0eWxlLgotICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKLSAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOwotICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbiwgIiIpIDw8ICI7IiA8PCBlbmRsOwotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICZub2FyZ3MpOwotICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uLCAiIikgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgaWYgKHN0eWxlID09ICJDb2IiKSB7Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jQ2hhbm5lbD4gY2hhbm5lbF87IiAgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gaXRyYW5zXzsiICA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBvdHJhbnNfOyIgIDw8IGVuZGw7Ci0gICAgfQotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgcHJvdF9wdHIgPDwgIiBwaXByb3RfOyIgIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IHByb3RfcHRyIDw8ICIgcG9wcm90XzsiICA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBwcm90b2NvbF90eXBlIDw8ICIqIGlwcm90XzsiICA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBwcm90b2NvbF90eXBlIDw8ICIqIG9wcm90XzsiICA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGZfaGVhZGVyXyA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgLy8gT3V0cHV0IGEgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdHlwZWRlZiB1c2luZwotICAgIC8vIFRQcm90b2NvbCBhcyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyLgotICAgIGZfaGVhZGVyXyA8PAotICAgICAgInR5cGVkZWYgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8Ci0gICAgICAiQ2xpZW50VDwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gIiA8PAotICAgICAgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50OyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBzY29wZSA9IHNlcnZpY2VfbmFtZV8gKyBzdHlsZSArIGNsaWVudF9zdWZmaXggKyAiOjoiOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCB0ZW1wbGF0ZV9oZWFkZXI7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgaWZzdHlsZSwgc2NvcGUpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0KLSAgICAvLyBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiLCAiOwotICAgICAgfQotICAgICAgb3V0IDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBvdXQgPDwgIik7IiA8PCBlbmRsOwotCi0gICAgaWYgKHN0eWxlICE9ICJDb2IiKSB7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7Ci0gICAgICAgICAgICBvdXQgPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoX3JldHVybik7IiA8PCBlbmRsOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQgPDwgInJldHVybiByZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBfdGhpcyA8PCAiY2hhbm5lbF8tPnNlbmRBbmRSZWN2TWVzc2FnZSgiIDw8Ci0gICAgICAgICAgInN0ZDo6dHIxOjpiaW5kKGNvYiwgdGhpcyksICIgPDwgX3RoaXMgPDwgIm90cmFuc18uZ2V0KCksICIgPDwKLSAgICAgICAgICBfdGhpcyA8PCAiaXRyYW5zXy5nZXQoKSk7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8IF90aGlzIDw8ICJjaGFubmVsXy0+c2VuZE1lc3NhZ2UoIiA8PAotICAgICAgICAgICJzdGQ6OnRyMTo6YmluZChjb2IsIHRoaXMpLCAiIDw8IF90aGlzIDw8ICJvdHJhbnNfLmdldCgpKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIC8vaWYgKHN0eWxlICE9ICJDb2IiKSAvLyBUT0RPKGRyZWlzcyk6IExpYmlmeSB0aGUgY2xpZW50IGFuZCBkb24ndCBnZW5lcmF0ZSB0aGlzIGZvciBjb2Itc3R5bGUKLSAgICBpZiAodHJ1ZSkgewotICAgICAgLy8gRnVuY3Rpb24gZm9yIHNlbmRpbmcKLSAgICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKLQotICAgICAgLy8gT3BlbiB0aGUgc2VuZCBmdW5jdGlvbgotICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IHRlbXBsYXRlX2hlYWRlcjsKLSAgICAgIH0KLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgIGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbiwgIiIsIHNjb3BlKSA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgLy8gRnVuY3Rpb24gYXJndW1lbnRzIGFuZCByZXN1bHRzCi0gICAgICBzdHJpbmcgYXJnc25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcGFyZ3MiOwotICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcHJlc3VsdCI7Ci0KLSAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpbnQzMl90IGNzZXFpZCA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IF90aGlzIDw8ICJvcHJvdF8tPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PAotICAgICAgICAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwKLSAgICAgICAgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9DQUxMLCBjc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJnczsiIDw8IGVuZGw7Ci0KLSAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICYiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUoIiA8PCBfdGhpcyA8PCAib3Byb3RfKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBfdGhpcyA8PCAib3Byb3RfLT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgX3RoaXMgPDwgIm9wcm90Xy0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IF90aGlzIDw8ICJvcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgICAgb3V0IDw8IGVuZGw7Ci0KLSAgICAgIC8vIEdlbmVyYXRlIHJlY3YgZnVuY3Rpb24gb25seSBpZiBub3QgYW4gb25ld2F5IGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOwotICAgICAgICAvLyBPcGVuIHRoZSByZWN2IGZ1bmN0aW9uCi0gICAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgICAgIGluZGVudChvdXQpIDw8IHRlbXBsYXRlX2hlYWRlcjsKLSAgICAgICAgfQotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgIGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbiwgIiIsIHNjb3BlKSA8PCBlbmRsOwotICAgICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICAgIG91dCA8PAotICAgICAgICAgIGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaW50MzJfdCByc2VxaWQgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJzdGQ6OnN0cmluZyBmbmFtZTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZTsiIDw8IGVuZGw7Ci0gICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgewotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgImJvb2wgY29tcGxldGVkID0gZmFsc2U7IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ0cnkgeyI7Ci0gICAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBfdGhpcyA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUJlZ2luKGZuYW1lLCBtdHlwZSwgcnNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG10eXBlID09IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTikgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4OyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHgucmVhZCgiIDw8IF90aGlzIDw8ICJpcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PAotICAgICAgICAgIGVuZGw7Ci0gICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgewotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZF9fKHRydWUpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyB4OyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChtdHlwZSAhPSA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9SRVBMWSkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+c2tpcCgiIDw8Ci0gICAgICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8Ci0gICAgICAgICAgZW5kbDsKLSAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18oZmFsc2UpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoZm5hbWUuY29tcGFyZShcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIikgIT0gMCkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+c2tpcCgiIDw8Ci0gICAgICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8Ci0gICAgICAgICAgZW5kbDsKLSAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18oZmFsc2UpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpICYmCi0gICAgICAgICAgICAhaXNfY29tcGxleF90eXBlKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICAgICAgICB0X2ZpZWxkIHJldHVybmZpZWxkKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwgIl9yZXR1cm4iKTsKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJnJldHVybmZpZWxkKSA8PCBlbmRsOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdDsiIDw8IGVuZGw7Ci0KLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5zdWNjZXNzID0gJl9yZXR1cm47IiA8PCBlbmRsOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKCIgPDwgX3RoaXMgPDwgImlwcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgX3RoaXMgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBfdGhpcyA8PCAiaXByb3RfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGVuZGw7Ci0KLSAgICAgICAgLy8gQ2FyZWZ1bCwgb25seSBsb29rIGZvciBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgIGlmIChpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuc3VjY2VzcykgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAvLyBfcmV0dXJuIHBvaW50ZXIgaGFzIG5vdyBiZWVuIGZpbGxlZCIgPDwgZW5kbDsKLSAgICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgewotICAgICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZF9fKHRydWUpOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm47IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC5zdWNjZXNzKSB7IiA8PCBlbmRsOwotICAgICAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18odHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBfcmV0dXJuOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgewotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZF9fKHRydWUpOyIgPDwgZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgb3V0ICA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIG9ubHkgZ2V0IGhlcmUgaWYgd2UgYXJlIGEgdm9pZCBmdW5jdGlvbgotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImNvbXBsZXRlZF9fKHRydWUpOyIgPDwgZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAgICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgewotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiY29tcGxldGVkX18odHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ0aHJvdyA6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24oOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgewotICAgICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAifSBjYXRjaCAoLi4uKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiAoIWNvbXBsZXRlZCkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgICBjb21wbGV0ZWRfXyhmYWxzZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdzsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBwcm9jZXNzb3IgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBwcm9jZXNzb3IgZm9yLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKSB7Ci0gIHN0cmluZyBpZnN0eWxlOwotICBzdHJpbmcgcHN0eWxlOwotICBzdHJpbmcgZmluaXNoX2NvYjsKLSAgc3RyaW5nIGZpbmlzaF9jb2JfZGVjbDsKLSAgc3RyaW5nIGNvYl9hcmc7Ci0gIHN0cmluZyBjYWxsX2NvbnRleHQgPSAiLCB2b2lkKiBjYWxsQ29udGV4dCI7Ci0gIHN0cmluZyBjYWxsX2NvbnRleHRfYXJnID0gIiwgY2FsbENvbnRleHQiOwotICBzdHJpbmcgY2FsbF9jb250ZXh0X2RlY2wgPSAiLCB2b2lkKiI7Ci0gIHN0cmluZyByZXRfdHlwZSA9ICJib29sICI7Ci0gIGlmIChzdHlsZSA9PSAiQ29iIikgewotICAgIGlmc3R5bGUgPSAiQ29iU3YiOwotICAgIHBzdHlsZSA9ICJBc3luYyI7Ci0gICAgZmluaXNoX2NvYiA9ICJzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCAiOwotICAgIGZpbmlzaF9jb2JfZGVjbCA9ICJzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4sICI7Ci0gICAgY2FsbF9jb250ZXh0ID0gIiI7ICAvLyBUT0RPKGVkaGFsbCkgcmVtb3ZlIHdoZW4gY2FsbENvbnRleHQgaXMgYWRlZCB0byBUQXN5bmNQcm9jZXNzb3IKLSAgICBjYWxsX2NvbnRleHRfYXJnID0gIiI7ICAvLyBkaXR0bwotICAgIGNhbGxfY29udGV4dF9kZWNsID0gIiI7IC8vIGRpdHRvCi0gICAgY29iX2FyZyA9ICJjb2IsICI7Ci0gICAgcmV0X3R5cGUgPSAidm9pZCAiOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyBwc3R5bGUgKyAiUHJvY2Vzc29yIjsKLSAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBJZiBnZW5fdGVtcGxhdGVzXyBpcyBlbmFibGVkLCB3ZSBjdXJyZW50bHkgYXNzdW1lIGFsbAotICAgICAgLy8gcGFyZW50IHNlcnZpY2VzIHdlcmUgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0ZW1wbGF0ZXMgZW5hYmxlZC4KLSAgICAgIGV4dGVuZHMgKz0gIlQ8UHJvdG9jb2xfPiI7Ci0gICAgfQotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiwgcHVibGljICIgKyBleHRlbmRzOwotICB9Ci0KLSAgc3RyaW5nIHRlbXBsYXRlX2hlYWRlciwgdGVtcGxhdGVfc3VmZml4LCB0eXBlbmFtZV9zdHI7Ci0gIHN0cmluZyBjbGFzc19zdWZmaXggPSAiUHJvY2Vzc29yIjsKLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgY2xhc3Nfc3VmZml4ID0gIlByb2Nlc3NvclQiOwotICAgIHRlbXBsYXRlX2hlYWRlciA9ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPlxuIjsKLSAgICB0ZW1wbGF0ZV9zdWZmaXggPSAiPFByb3RvY29sXz4iOwotICAgIHR5cGVuYW1lX3N0ciA9ICJ0eXBlbmFtZSAiOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGZfaGVhZGVyXyA8PAotICAgIHRlbXBsYXRlX2hlYWRlciA8PAotICAgICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgcHN0eWxlIDw8IGNsYXNzX3N1ZmZpeCA8PAotICAgICIgOiB2aXJ0dWFsIHB1YmxpYyA6OmFwYWNoZTo6dGhyaWZ0OjpUIiA8PCBwc3R5bGUgPDwgIlByb2Nlc3NvciIgPDwKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA8PCAiIHsiIDw8IGVuZGw7Ci0KLSAgLy8gUHJvdGVjdGVkIGRhdGEgbWVtYmVycwotICBmX2hlYWRlcl8gPDwKLSAgICAiIHByb3RlY3RlZDoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IiA8PCBzZXJ2aWNlX25hbWVfIDw8IGlmc3R5bGUgPDwgIklmPiBpZmFjZV87IiA8PCBlbmRsOwotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAidmlydHVhbCAiIDw8IHJldF90eXBlIDw8ICJwcm9jZXNzX2ZuKCIgPDwgZmluaXNoX2NvYiA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90LCBzdGQ6OnN0cmluZyYgZm5hbWUsIGludDMyX3Qgc2VxaWQiIDw8IGNhbGxfY29udGV4dCA8PCAiKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgLy8gUHJvY2VzcyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiBwcml2YXRlOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICJzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdm9pZCAoIiA8PAotICAgIHNlcnZpY2VfbmFtZV8gPDwgcHN0eWxlIDw8IGNsYXNzX3N1ZmZpeCA8PCAiOjoqKSgiIDw8IGZpbmlzaF9jb2JfZGVjbCA8PAotICAgICJpbnQzMl90LCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiwgIiA8PAotICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiIgPDwgY2FsbF9jb250ZXh0X2RlY2wgPDwKLSAgICAiKT4gcHJvY2Vzc01hcF87IiA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChmX2hlYWRlcl8pIDw8Ci0gICAgICAidm9pZCBwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBmaW5pc2hfY29iIDw8ICJpbnQzMl90IHNlcWlkLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QiIDw8IGNhbGxfY29udGV4dCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PAotICAgICAgICAidm9pZCBwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBmaW5pc2hfY29iIDw8Ci0gICAgICAgICJpbnQzMl90IHNlcWlkLCBQcm90b2NvbF8qIGlwcm90LCBQcm90b2NvbF8qIG9wcm90IiA8PAotICAgICAgICBjYWxsX2NvbnRleHQgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoc3R5bGUgPT0gIkNvYiIpIHsKLSAgICAgIC8vIFhYWCBGYWN0b3IgdGhpcyBvdXQsIGV2ZW4gaWYgaXQgaXMgYSBwYWluLgotICAgICAgc3RyaW5nIHJldF9hcmcgPSAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gIiIKLSAgICAgICAgICAgICAgICAgICAgICAgIDogIiwgY29uc3QgIiArIHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpICsgIiYgX3JldHVybiIpOwotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ2b2lkIHJldHVybl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PAotICAgICAgICAiKHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIgPDwKLSAgICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90LCAiIDw8Ci0gICAgICAgICJ2b2lkKiBjdHgiIDw8IHJldF9hcmcgPDwgIik7IiA8PCBlbmRsOwotICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ2b2lkIHJldHVybl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PAotICAgICAgICAgICIoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIiA8PAotICAgICAgICAgICJQcm90b2NvbF8qIG9wcm90LCB2b2lkKiBjdHgiIDw8IHJldF9hcmcgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgLy8gWFhYIERvbid0IGRlY2xhcmUgdGhyb3cgaWYgaXQgZG9lc24ndCBleGlzdAotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ2b2lkIHRocm93XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICIoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIiA8PAotICAgICAgICAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QsIHZvaWQqIGN0eCwgIiA8PAotICAgICAgICAiOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk7IiA8PCBlbmRsOwotICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ2b2lkIHRocm93XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgIihzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiIDw8Ci0gICAgICAgICAgIlByb3RvY29sXyogb3Byb3QsIHZvaWQqIGN0eCwgIiA8PAotICAgICAgICAgICI6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIHN0cmluZyBkZWNsYXJlX21hcCA9ICIiOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGRlY2xhcmVfbWFwICs9IGluZGVudCgpOwotICAgIGRlY2xhcmVfbWFwICs9ICJwcm9jZXNzTWFwX1tcIiI7Ci0gICAgZGVjbGFyZV9tYXAgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGRlY2xhcmVfbWFwICs9ICJcIl0gPSAmIjsKLSAgICBkZWNsYXJlX21hcCArPSBzZXJ2aWNlX25hbWVfOwotICAgIGRlY2xhcmVfbWFwICs9IHBzdHlsZTsKLSAgICBkZWNsYXJlX21hcCArPSBjbGFzc19zdWZmaXg7Ci0gICAgZGVjbGFyZV9tYXAgKz0gIjo6cHJvY2Vzc18iOwotICAgIGRlY2xhcmVfbWFwICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBkZWNsYXJlX21hcCArPSAiO1xuIjsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGZfaGVhZGVyXyA8PAotICAgICIgcHVibGljOiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgcHN0eWxlIDw8IGNsYXNzX3N1ZmZpeCA8PAotICAgICIoYm9vc3Q6OnNoYXJlZF9wdHI8IiA8PCBzZXJ2aWNlX25hbWVfIDw8IGlmc3R5bGUgPDwgIklmPiBpZmFjZSkgOiIgPDwgZW5kbDsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgaWZhY2VfKGlmYWNlKSB7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8ICIoaWZhY2UpLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgaWZhY2VfKGlmYWNlKSB7IiA8PCBlbmRsOwotICB9Ci0gIGZfaGVhZGVyXyA8PAotICAgIGRlY2xhcmVfbWFwIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInZpcnR1YWwgIiA8PCByZXRfdHlwZSA8PCAicHJvY2VzcygiIDw8IGZpbmlzaF9jb2IgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXByb3QsIGJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwb3Byb3QiIDw8IGNhbGxfY29udGV4dCA8PCAiKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCBzZXJ2aWNlX25hbWVfIDw8IHBzdHlsZSA8PCBjbGFzc19zdWZmaXggPDwKLSAgICAiKCkge30iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLSAgc3RkOjpvZnN0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl9zZXJ2aWNlX3RjY18gOiBmX3NlcnZpY2VfKTsKLSAgb3V0IDw8Ci0gICAgdGVtcGxhdGVfaGVhZGVyIDw8Ci0gICAgcmV0X3R5cGUgPDwgc2VydmljZV9uYW1lXyA8PCBwc3R5bGUgPDwgY2xhc3Nfc3VmZml4IDw8IHRlbXBsYXRlX3N1ZmZpeCA8PAotICAgICI6OnByb2Nlc3MoIiA8PCBmaW5pc2hfY29iIDw8Ci0gICAgImJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXByb3QsICIgPDwKLSAgICAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBvcHJvdCIgPDwKLSAgICBjYWxsX2NvbnRleHQgPDwgIikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCA9IHBpcHJvdC5nZXQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QgPSBwb3Byb3QuZ2V0KCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInN0ZDo6c3RyaW5nIGZuYW1lOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpbnQzMl90IHNlcWlkOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QtPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCBzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAobXR5cGUgIT0gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQ0FMTCAmJiBtdHlwZSAhPSA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9PTkVXQVkpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC0+c2tpcCg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlwcm90LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlwcm90LT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4KDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9NRVNTQUdFX1RZUEUpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihmbmFtZSwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OLCBzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgeC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgKHN0eWxlID09ICJDb2IiID8gIiAgcmV0dXJuIGNvYihmYWxzZSk7IiA6ICIgIHJldHVybiBmYWxzZTsiKSA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiBwcm9jZXNzX2ZuKCIgPDwgKHN0eWxlID09ICJDb2IiID8gImNvYiwgIiA6ICIiKQotICAgICAgICAgICAgIDw8ICJpcHJvdCwgb3Byb3QsIGZuYW1lLCBzZXFpZCIgPDwgY2FsbF9jb250ZXh0X2FyZyA8PCAiKTsiIDw8Ci0gICAgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgb3V0IDw8Ci0gICAgdGVtcGxhdGVfaGVhZGVyIDw8Ci0gICAgcmV0X3R5cGUgPDwgc2VydmljZV9uYW1lXyA8PCBwc3R5bGUgPDwgY2xhc3Nfc3VmZml4IDw8IHRlbXBsYXRlX3N1ZmZpeCA8PAotICAgICI6OnByb2Nlc3NfZm4oIiA8PCBmaW5pc2hfY29iIDw8Ci0gICAgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90LCAiIDw8Ci0gICAgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90LCAiIDw8Ci0gICAgInN0ZDo6c3RyaW5nJiBmbmFtZSwgaW50MzJfdCBzZXFpZCIgPDwgY2FsbF9jb250ZXh0IDw8ICIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIEhPVDogbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXIgbWFwCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8IHR5cGVuYW1lX3N0ciA8PCAic3RkOjptYXA8c3RkOjpzdHJpbmcsIHZvaWQgKCIgPDwKLSAgICBzZXJ2aWNlX25hbWVfIDw8IHBzdHlsZSA8PCBjbGFzc19zdWZmaXggPDwgIjo6KikoIiA8PCBmaW5pc2hfY29iX2RlY2wgPDwKLSAgICAiaW50MzJfdCwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCosICIgPDwKLSAgICAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCoiIDw8IGNhbGxfY29udGV4dF9kZWNsIDw8ICIpPjo6aXRlcmF0b3IgcGZuOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJwZm4gPSBwcm9jZXNzTWFwXy5maW5kKGZuYW1lKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKHBmbiA9PSBwcm9jZXNzTWFwXy5lbmQoKSkgeyIgPDwgZW5kbDsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3QtPnNraXAoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3QtPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICA6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24geCg6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCBcIkludmFsaWQgbWV0aG9kIG5hbWU6ICdcIitmbmFtZStcIidcIik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oZm5hbWUsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTiwgc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgeC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAoc3R5bGUgPT0gIkNvYiIgPyAiICByZXR1cm4gY29iKGZhbHNlKTsiIDogIiAgcmV0dXJuIGZhbHNlOyIpIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIgotICAgICAgICAgICAgICAgPDwgZXh0ZW5kcyA8PCAiOjpwcm9jZXNzX2ZuKCIKLSAgICAgICAgICAgICAgIDw8IChzdHlsZSA9PSAiQ29iIiA/ICJjb2IsICIgOiAiIikKLSAgICAgICAgICAgICAgIDw8ICJpcHJvdCwgb3Byb3QsIGZuYW1lLCBzZXFpZCIgPDwgY2FsbF9jb250ZXh0X2FyZyA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiKHRoaXMtPioocGZuLT5zZWNvbmQpKSgiIDw8IGNvYl9hcmcgPDwgInNlcWlkLCBpcHJvdCwgb3Byb3QiIDw8IGNhbGxfY29udGV4dF9hcmcgPDwgIik7IiA8PCBlbmRsOwotCi0gIC8vIFRPRE8oZHJlaXNzKTogcmV0dXJuIHBmbiByZXQ/Ci0gIGlmIChzdHlsZSA9PSAiQ29iIikgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlciwgc3R5bGUsIGZhbHNlKTsKLSAgICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIsIHN0eWxlLCB0cnVlKTsKLSAgICB9IGVsc2UgewotICAgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlciwgc3R5bGUsIGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAvLyBHZW5lcmF0ZSBhIGJhY2t3YXJkcyBjb21wYXRpYmxlIHR5cGVkZWYsIGZvciBjYWxsZXJzIHdobyBkb24ndCBrbm93Ci0gICAgLy8gYWJvdXQgdGhlIG5ldyB0ZW1wbGF0ZS1zdHlsZSBjb2RlLgotICAgIC8vCi0gICAgLy8gV2UgY2FuJ3QgdXNlIFRQcm90b2NvbCBhcyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyLCBzaW5jZSBQcm9jZXNzb3JUCi0gICAgLy8gcHJvdmlkZXMgb3ZlcmxvYWRlZCB2ZXJzaW9ucyBvZiBtb3N0IG1ldGhvZHMsIG9uZSBvZiB3aGljaCBhY2NlcHRzCi0gICAgLy8gVFByb3RvY29sIHBvaW50ZXJzLCBhbmQgb25lIHdoaWNoIGFjY2VwdHMgUHJvdG9jb2xfIHBvaW50ZXJzLiAgVGhpcwotICAgIC8vIHJlc3VsdHMgaW4gYSBjb21waWxlIGVycm9yIGlmIGluc3RhbnRpYXRlZCB3aXRoIFByb3RvY29sXyA9PSBUUHJvdG9jb2wuCi0gICAgLy8gVGhlcmVmb3JlLCB3ZSBkZWZpbmUgVER1bW15UHJvdG9jb2wgc29sZWx5IHNvIHdlIGNhbiB1c2UgaXQgYXMgdGhlCi0gICAgLy8gdGVtcGxhdGUgcGFyYW1ldGVyIGhlcmUuCi0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICAidHlwZWRlZiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgcHN0eWxlIDw8Ci0gICAgICAiUHJvY2Vzc29yVDwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlREdW1teVByb3RvY29sPiAiIDw8Ci0gICAgICBzZXJ2aWNlX25hbWVfIDw8IHBzdHlsZSA8PCAiUHJvY2Vzc29yOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6Om9mc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3NlcnZpY2VfdGNjXyA6IGZfc2VydmljZV8pOwotCi0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24oZl9oZWFkZXJfLCAmcmVzdWx0LCBmYWxzZSk7Ci0gIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob3V0LCAmcmVzdWx0KTsKLSAgZ2VuZXJhdGVfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCAmcmVzdWx0KTsKLQotICByZXN1bHQuc2V0X25hbWUodHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3ByZXN1bHQiKTsKLSAgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24oZl9oZWFkZXJfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZ2VuX2NvYl9zdHlsZV8pOwotICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG91dCwgJnJlc3VsdCwgdHJ1ZSk7Ci0gIGlmIChnZW5fY29iX3N0eWxlXykgewotICAgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIob3V0LCAmcmVzdWx0LCB0cnVlKTsKLSAgfQotCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3BlY2lhbGl6ZWQpIHsKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gIHN0cmluZyBzZXJ2aWNlX2Z1bmNfbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIi4iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOwotCi0gIHN0ZDo6b2ZzdHJlYW0mIG91dCA9IChnZW5fdGVtcGxhdGVzXyA/IGZfc2VydmljZV90Y2NfIDogZl9zZXJ2aWNlXyk7Ci0KLSAgc3RyaW5nIHByb3RfdHlwZSA9Ci0gICAgKHNwZWNpYWxpemVkID8gIlByb3RvY29sXyIgOiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCIpOwotICBzdHJpbmcgY2xhc3Nfc3VmZml4OwotICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICBjbGFzc19zdWZmaXggPSAiVDxQcm90b2NvbF8+IjsKLSAgfQotCi0gIC8vIEkgdHJpZWQgdG8gZG8gdGhpcyBhcyBvbmUgZnVuY3Rpb24uICBJIHJlYWxseSBkaWQuICBCdXQgaXQgd2FzIHRvbyBoYXJkLgotICBpZiAoc3R5bGUgIT0gIkNvYiIpIHsKLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOwotICAgIH0KLSAgICBjb25zdCBib29sIHVubmFtZWRfb3Byb3Rfc2VxaWQgPSB0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmCi0gICAgICAhKGdlbl90ZW1wbGF0ZXNfICYmICFzcGVjaWFsaXplZCk7Ci0gICAgb3V0IDw8Ci0gICAgICAidm9pZCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeCA8PCAiOjoiIDw8Ci0gICAgICAicHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCIgPDwKLSAgICAgICJpbnQzMl90IiA8PCAodW5uYW1lZF9vcHJvdF9zZXFpZCA/ICIsICIgOiAiIHNlcWlkLCAiKSA8PAotICAgICAgcHJvdF90eXBlIDw8ICIqIGlwcm90LCAiIDw8Ci0gICAgICBwcm90X3R5cGUgPDwgIioiIDw8ICh1bm5hbWVkX29wcm90X3NlcWlkID8gIiwgIiA6ICIgb3Byb3QsICIpIDw8Ci0gICAgICAidm9pZCogY2FsbENvbnRleHQpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICBpZiAoZ2VuX3RlbXBsYXRlc18gJiYgIXNwZWNpYWxpemVkKSB7Ci0gICAgICAvLyBJZiB0aGVzZSBhcmUgaW5zdGFuY2VzIG9mIFByb3RvY29sXywgaW5zdGVhZCBvZiBhbnkgb2xkIFRQcm90b2NvbCwKLSAgICAgIC8vIHVzZSB0aGUgc3BlY2lhbGl6ZWQgcHJvY2VzcyBmdW5jdGlvbiBpbnN0ZWFkLgotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJQcm90b2NvbF8qIF9pcHJvdCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihpcHJvdCk7IiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJQcm90b2NvbF8qIF9vcHJvdCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihvcHJvdCk7IiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoX2lwcm90ICYmIF9vcHJvdCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAiKHNlcWlkLCBfaXByb3QsIF9vcHJvdCwgY2FsbENvbnRleHQpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiVF9HRU5FUklDX1BST1RPQ09MKHRoaXMsIGlwcm90LCBfaXByb3QpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiVF9HRU5FUklDX1BST1RPQ09MKHRoaXMsIG9wcm90LCBfb3Byb3QpOyIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLQotICAgIHN0cmluZyBhcmdzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidm9pZCogY3R4ID0gTlVMTDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBjdHggPSBldmVudEhhbmRsZXJfLT5nZXRDb250ZXh0KFwiIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiXCIsIGNhbGxDb250ZXh0KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckNvbnRleHRGcmVlciBmcmVlcihldmVudEhhbmRsZXJfLmdldCgpLCBjdHgsIFwiIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiXCIpOyIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKGV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgZXZlbnRIYW5kbGVyXy0+cHJlUmVhZChjdHgsIFwiIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiXCIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaXByb3QtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgYnl0ZXMgPSBpcHJvdC0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmIChldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGV2ZW50SGFuZGxlcl8tPnBvc3RSZWFkKGN0eCwgXCIiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICJcIiwgYnl0ZXMpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0KLSAgICAvLyBEZWNsYXJlIHJlc3VsdAotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQ7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFRyeSBibG9jayBmb3IgZnVuY3Rpb25zIHdpdGggZXhjZXB0aW9ucwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpKSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIG91dCA8PCAiaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKHJlc3VsdC5zdWNjZXNzIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAicmVzdWx0LnN1Y2Nlc3MgPSBpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8Ci0gICAgICAgICJpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgICB9Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBTZXQgaXNzZXQgb24gc3VjY2VzcyBmaWVsZAotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuc3VjY2VzcyA9IHRydWU7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IjsKLQotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgb3V0IDw8ICIgY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAmIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5fX2lzc2V0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXQgPDwgIiBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGUpIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBldmVudEhhbmRsZXJfLT5oYW5kbGVyRXJyb3IoY3R4LCBcIiIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIlwiKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIHgoZS53aGF0KCkpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgZXZlbnRIYW5kbGVyXy0+YXN5bmNDb21wbGV0ZShjdHgsIFwiIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiXCIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIG91dCA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVzdWx0IGludG8gYSBzdHJ1Y3QKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBldmVudEhhbmRsZXJfLT5wcmVXcml0ZShjdHgsIFwiIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiXCIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJieXRlcyA9IG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBldmVudEhhbmRsZXJfLT5wb3N0V3JpdGUoY3R4LCBcIiIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIlwiLCBieXRlcyk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gQ29iIHN0eWxlLgotICBlbHNlIHsKLSAgICAvLyBQcm9jZXNzb3IgZW50cnkgcG9pbnQuCi0gICAgLy8gVE9ETyhlZGhhbGwpIHVwZGF0ZSBmb3IgY2FsbENvbnRleHQgd2hlbiBURXZlbnRTZXJ2ZXIgaXMgcmVhZHkKLSAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PAotICAgICAgInZvaWQgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeCA8PAotICAgICAgIjo6cHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgIihzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiIDw8Ci0gICAgICBwcm90X3R5cGUgPDwgIiogaXByb3QsICIgPDwgcHJvdF90eXBlIDw8ICIqIG9wcm90KSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgLy8gVE9ETyhzaW1wa2lucyk6IHdlIGNvdWxkIHRyeSB0byBjb25zb2xkYXRlIHRoaXMKLSAgICAvLyB3aXRoIHRoZSBub24tY29iIGNvZGUgYWJvdmUKLSAgICBpZiAoZ2VuX3RlbXBsYXRlc18gJiYgIXNwZWNpYWxpemVkKSB7Ci0gICAgICAvLyBJZiB0aGVzZSBhcmUgaW5zdGFuY2VzIG9mIFByb3RvY29sXywgaW5zdGVhZCBvZiBhbnkgb2xkIFRQcm90b2NvbCwKLSAgICAgIC8vIHVzZSB0aGUgc3BlY2lhbGl6ZWQgcHJvY2VzcyBmdW5jdGlvbiBpbnN0ZWFkLgotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJQcm90b2NvbF8qIF9pcHJvdCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihpcHJvdCk7IiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJQcm90b2NvbF8qIF9vcHJvdCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihvcHJvdCk7IiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoX2lwcm90ICYmIF9vcHJvdCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAiKGNvYiwgc2VxaWQsIF9pcHJvdCwgX29wcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIlRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBpcHJvdCwgX2lwcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIlRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBvcHJvdCwgX29wcm90KTsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIodm9pZCkgc2VxaWQ7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIodm9pZCkgb3Byb3Q7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiIDw8ICIgYXJnczsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ2b2lkKiBjdHggPSBOVUxMOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmIChldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGN0eCA9IGV2ZW50SGFuZGxlcl8tPmdldENvbnRleHQoXCIiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICJcIiwgTlVMTCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JDb250ZXh0RnJlZXIgZnJlZXIoZXZlbnRIYW5kbGVyXy5nZXQoKSwgY3R4LCBcIiIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIlwiKTsiIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmIChldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGV2ZW50SGFuZGxlcl8tPnByZVJlYWQoY3R4LCBcIiIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIlwiKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpcHJvdC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCBieXRlcyA9IGlwcm90LT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmIChldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGV2ZW50SGFuZGxlcl8tPnBvc3RSZWFkKGN0eCwgXCIiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICJcIiwgYnl0ZXMpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgLy8gVE9ETyhkcmVpc3MpOiBIYW5kbGUgVEV4Y2VwdGlvbnM/ICBFeHBvc2UgdG8gc2VydmVyPwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZXhuKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBpZiAoZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgIGV2ZW50SGFuZGxlcl8tPmhhbmRsZXJFcnJvcihjdHgsIFwiIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiXCIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGNvYihmYWxzZSk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgZXZlbnRIYW5kbGVyXy0+YXN5bmNDb21wbGV0ZShjdHgsIFwiIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiXCIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgLy8gVE9ETyhkcmVpc3MpOiBGaWd1cmUgb3V0IGEgc3RyYXRlZ3kgZm9yIGV4Y2VwdGlvbnMgaW4gYXN5bmMgaGFuZGxlcnMuCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZnJlZXIudW5yZWdpc3RlcigpOyIgPDwgZW5kbDsKLSAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgLy8gTm8gcmV0dXJuLiAgSnVzdCBoYW5kIG9mZiBvdXIgY29iLgotICAgICAgLy8gVE9ETyhkcmVpc3MpOiBDYWxsIHRoZSBjb2IgaW1tZWRpYXRlbHk/Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmYWNlXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiIDw8Ci0gICAgICAgICJzdGQ6OnRyMTo6YmluZChjb2IsIHRydWUpIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7IGluZGVudF91cCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdHJpbmcgcmV0X2FyZywgcmV0X3BsYWNlaG9sZGVyOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICByZXRfYXJnID0gIiwgY29uc3QgIiArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsKLSAgICAgICAgICAiJiBfcmV0dXJuIjsKLSAgICAgICAgcmV0X3BsYWNlaG9sZGVyID0gIiwgc3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzEiOwotICAgICAgfQotCi0gICAgICAvLyBXaGVuIGdlbl90ZW1wbGF0ZXNfIGlzIHRydWUsIHRoZSByZXR1cm5fIGFuZCB0aHJvd18gZnVuY3Rpb25zIGFyZQotICAgICAgLy8gb3ZlcmxvYWRlZC4gIFdlIGhhdmUgdG8gZGVjbGFyZSBwb2ludGVycyB0byB0aGVtIHNvIHRoYXQgdGhlIGNvbXBpbGVyCi0gICAgICAvLyBjYW4gcmVzb2x2ZSB0aGUgY29ycmVjdCBvdmVybG9hZGVkIHZlcnNpb24uCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZvaWQgKCIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PAotICAgICAgICBjbGFzc19zdWZmaXggPDwgIjo6KnJldHVybl9mbikoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+ICIgPDwKLSAgICAgICAgImNvYiwgaW50MzJfdCBzZXFpZCwgIiA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QsIHZvaWQqIGN0eCIgPDwKLSAgICAgICAgcmV0X2FyZyA8PCAiKSA9IiA8PCBlbmRsOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICYiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwKLSAgICAgICAgY2xhc3Nfc3VmZml4IDw8ICI6OnJldHVybl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIGlmICgheGNlcHRpb25zLmVtcHR5KCkpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInZvaWQgKCIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PAotICAgICAgICAgIGNsYXNzX3N1ZmZpeCA8PCAiOjoqdGhyb3dfZm4pKHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiAiIDw8Ci0gICAgICAgICAgImNvYiwgaW50MzJfdCBzZXFpZCwgIiA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QsIHZvaWQqIGN0eCwgIiA8PAotICAgICAgICAgICI6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KSA9IiA8PCBlbmRsOwotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAmIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8Ci0gICAgICAgICAgY2xhc3Nfc3VmZml4IDw8ICI6OnRocm93XyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmYWNlXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsgaW5kZW50X3VwKCk7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInN0ZDo6dHIxOjpiaW5kKHJldHVybl9mbiwgdGhpcywgY29iLCBzZXFpZCwgb3Byb3QsIGN0eCIgPDwKLSAgICAgICAgcmV0X3BsYWNlaG9sZGVyIDw8ICIpIjsKLSAgICAgIGlmICgheGNlcHRpb25zLmVtcHR5KCkpIHsKLSAgICAgICAgb3V0Ci0gICAgICAgICAgPDwgJywnIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAic3RkOjp0cjE6OmJpbmQodGhyb3dfZm4sIHRoaXMsIGNvYiwgc2VxaWQsIG9wcm90LCAiIDw8Ci0gICAgICAgICAgImN0eCwgc3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzEpIjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBYWFggV2hpdGVzcGFjZSBjbGVhbnVwLgotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBvdXQKLSAgICAgICAgICAgICAgICAgPDwgJywnIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsgaW5kZW50X2Rvd24oKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICAvLyBOb3JtYWwgcmV0dXJuLgotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RyaW5nIHJldF9hcmdfZGVjbCwgcmV0X2FyZ19uYW1lOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICByZXRfYXJnX2RlY2wgPSAiLCBjb25zdCAiICsgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKwotICAgICAgICAgICImIF9yZXR1cm4iOwotICAgICAgICByZXRfYXJnX25hbWUgPSAiLCBfcmV0dXJuIjsKLSAgICAgIH0KLSAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwKLSAgICAgICAgInZvaWQgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeCA8PAotICAgICAgICAiOjpyZXR1cm5fIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgIihzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiIDw8Ci0gICAgICAgIHByb3RfdHlwZSA8PCAiKiBvcHJvdCwgdm9pZCogY3R4IiA8PCByZXRfYXJnX2RlY2wgPDwgJyknIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICBpZiAoZ2VuX3RlbXBsYXRlc18gJiYgIXNwZWNpYWxpemVkKSB7Ci0gICAgICAgIC8vIElmIG9wcm90IGlzIGEgUHJvdG9jb2xfIGluc3RhbmNlLAotICAgICAgICAvLyB1c2UgdGhlIHNwZWNpYWxpemVkIHJldHVybiBmdW5jdGlvbiBpbnN0ZWFkLgotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiUHJvdG9jb2xfKiBfb3Byb3QgPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4ob3Byb3QpOyIgPDwKLSAgICAgICAgICBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChfb3Byb3QpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcmV0dXJuXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgIihjb2IsIHNlcWlkLCBfb3Byb3QsIGN0eCIgPDwgcmV0X2FyZ19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIlRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBvcHJvdCwgX29wcm90KTsiIDw8Ci0gICAgICAgICAgZW5kbCA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiX3ByZXN1bHQgcmVzdWx0OyIgPDwgZW5kbDsKLSAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgLy8gVGhlIGNvbnN0X2Nhc3QgaGVyZSBpcyB1bmZvcnR1bmF0ZSwgYnV0IGl0IHdvdWxkIGJlIGEgcGFpbiB0byBhdm9pZCwKLSAgICAgICAgLy8gYW5kIHdlIG9ubHkgZG8gYSB3cml0ZSB3aXRoIHRoaXMgc3RydWN0LCB3aGljaCBpcyBjb25zdC1zYWZlLgotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LnN1Y2Nlc3MgPSBjb25zdF9jYXN0PCIgPDwgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgPDwgIio+KCZfcmV0dXJuKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuc3VjY2VzcyA9IHRydWU7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgLy8gU2VyaWFsaXplIHRoZSByZXN1bHQgaW50byBhIHN0cnVjdAotICAgICAgb3V0IDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgY3R4ID0gZXZlbnRIYW5kbGVyXy0+Z2V0Q29udGV4dChcIiIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIlwiLCBOVUxMKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JDb250ZXh0RnJlZXIgZnJlZXIoZXZlbnRIYW5kbGVyXy5nZXQoKSwgY3R4LCBcIiIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIlwiKTsiIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBldmVudEhhbmRsZXJfLT5wcmVXcml0ZShjdHgsIFwiIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiXCIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1JFUExZLCBzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgYnl0ZXMgPSBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGV2ZW50SGFuZGxlcl8tPnBvc3RXcml0ZShjdHgsIFwiIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiXCIsIGJ5dGVzKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiBjb2IodHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gRXhjZXB0aW9uIHJldHVybi4KLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXhjZXB0aW9ucy5lbXB0eSgpKSB7Ci0gICAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgb3V0IDw8Ci0gICAgICAgICJ2b2lkICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXggPDwKLSAgICAgICAgIjo6dGhyb3dfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgIihzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiIDw8Ci0gICAgICAgIHByb3RfdHlwZSA8PCAiKiBvcHJvdCwgdm9pZCogY3R4LCAiIDw8Ci0gICAgICAgICI6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KSIgPDwgZW5kbDsKLSAgICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAgIGlmIChnZW5fdGVtcGxhdGVzXyAmJiAhc3BlY2lhbGl6ZWQpIHsKLSAgICAgICAgLy8gSWYgb3Byb3QgaXMgYSBQcm90b2NvbF8gaW5zdGFuY2UsCi0gICAgICAgIC8vIHVzZSB0aGUgc3BlY2lhbGl6ZWQgdGhyb3cgZnVuY3Rpb24gaW5zdGVhZC4KLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIlByb3RvY29sXyogX29wcm90ID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KG9wcm90KTsiIDw8Ci0gICAgICAgICAgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoX29wcm90KSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocm93XyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgIihjb2IsIHNlcWlkLCBfb3Byb3QsIGN0eCwgX3Rocm93KTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIFRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBvcHJvdCwgX29wcm90KTsiIDw8Ci0gICAgICAgICAgZW5kbCA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiX3Jlc3VsdCByZXN1bHQ7IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIl90aHJvdy0+dGhyb3dfaXQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiBjb2IoZmFsc2UpOyIgPDwgZW5kbDsgIC8vIElzIHRoaXMgcG9zc2libGU/ICBUQkQuCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICd9JzsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIG91dCA8PCAiICBjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICYiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOwotICAgICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgICB9Ci0gICAgICAvLyBUT0RPKGRyZWlzcyk6IEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhbiB1bmRlY2xhcmVkIGV4Y2VwdGlvbiBpcyB0aHJvd24/Ci0KLSAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVzdWx0IGludG8gYSBzdHJ1Y3QKLSAgICAgIG91dCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGN0eCA9IGV2ZW50SGFuZGxlcl8tPmdldENvbnRleHQoXCIiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICJcIiwgTlVMTCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yQ29udGV4dEZyZWVyIGZyZWVyKGV2ZW50SGFuZGxlcl8uZ2V0KCksIGN0eCwgXCIiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICJcIik7IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgZXZlbnRIYW5kbGVyXy0+cHJlV3JpdGUoY3R4LCBcIiIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIlwiKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInVpbnQzMl90IGJ5dGVzID0gb3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBldmVudEhhbmRsZXJfLT5wb3N0V3JpdGUoY3R4LCBcIiIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIlwiLCBieXRlcyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gY29iKHRydWUpOyIgPDwgZW5kbDsKLSAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0gLy8gZm9yIGVhY2ggZnVuY3Rpb24KLSAgfSAvLyBjb2Igc3R5bGUKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBza2VsZXRvbiBmaWxlIG9mIGEgc2VydmVyCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2tlbGV0b24odF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgc3ZjbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOwotCi0gIC8vIFNlcnZpY2UgaW1wbGVtZW50YXRpb24gZmlsZSBpbmNsdWRlcwotICBzdHJpbmcgZl9za2VsZXRvbl9uYW1lID0gZ2V0X291dF9kaXIoKStzdmNuYW1lKyJfc2VydmVyLnNrZWxldG9uLmNwcCI7Ci0KLSAgc3RyaW5nIG5zID0gbmFtZXNwYWNlX3ByZWZpeCh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiY3BwIikpOwotCi0gIG9mc3RyZWFtIGZfc2tlbGV0b247Ci0gIGZfc2tlbGV0b24ub3BlbihmX3NrZWxldG9uX25hbWUuY19zdHIoKSk7Ci0gIGZfc2tlbGV0b24gPDwKLSAgICAiLy8gVGhpcyBhdXRvZ2VuZXJhdGVkIHNrZWxldG9uIGZpbGUgaWxsdXN0cmF0ZXMgaG93IHRvIGJ1aWxkIGEgc2VydmVyLiIgPDwgZW5kbCA8PAotICAgICIvLyBZb3Ugc2hvdWxkIGNvcHkgaXQgdG8gYW5vdGhlciBmaWxlbmFtZSB0byBhdm9pZCBvdmVyd3JpdGluZyBpdC4iIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwgIi5oXCIiIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8c2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4iIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPHRyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+IiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4iIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0OyIgPDwgZW5kbCA8PAotICAgICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7IiA8PCBlbmRsIDw8Ci0gICAgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7IiA8PCBlbmRsIDw8Ci0gICAgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICJ1c2luZyBib29zdDo6c2hhcmVkX3B0cjsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGlmICghbnMuZW1wdHkoKSkgewotICAgIGZfc2tlbGV0b24gPDwKLSAgICAgICJ1c2luZyBuYW1lc3BhY2UgIiA8PCBzdHJpbmcobnMsIDAsIG5zLnNpemUoKS0yKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIGZfc2tlbGV0b24gPDwKLSAgICAiY2xhc3MgIiA8PCBzdmNuYW1lIDw8ICJIYW5kbGVyIDogdmlydHVhbCBwdWJsaWMgIiA8PCBzdmNuYW1lIDw8ICJJZiB7IiA8PCBlbmRsIDw8Ci0gICAgIiBwdWJsaWM6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9za2VsZXRvbiA8PAotICAgIGluZGVudCgpIDw8IHN2Y25hbWUgPDwgIkhhbmRsZXIoKSB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgLy8gWW91ciBpbml0aWFsaXphdGlvbiBnb2VzIGhlcmUiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9za2VsZXRvbiA8PAotICAgICAgaW5kZW50KCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICIiKSA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIC8vIFlvdXIgaW1wbGVtZW50YXRpb24gZ29lcyBoZXJlIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBwcmludGYoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXFxuXCIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NrZWxldG9uIDw8Ci0gICAgIn07IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX3NrZWxldG9uIDw8Ci0gICAgaW5kZW50KCkgPDwgImludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2tlbGV0b24gPDwKLSAgICBpbmRlbnQoKSA8PCAiaW50IHBvcnQgPSA5MDkwOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzaGFyZWRfcHRyPCIgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlcj4gaGFuZGxlcihuZXcgIiA8PCBzdmNuYW1lIDw8ICJIYW5kbGVyKCkpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcihuZXcgIiA8PCBzdmNuYW1lIDw8ICJQcm9jZXNzb3IoaGFuZGxlcikpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkobmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiVFNpbXBsZVNlcnZlciBzZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInNlcnZlci5zZXJ2ZSgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gMDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2tlbGV0b24gPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gQ2xvc2UgdGhlIGZpbGVzCi0gIGZfc2tlbGV0b24uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgc3VmZml4OwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IGlwcm90LT4iOwotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgIG91dCA8PCAicmVhZEJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgInJlYWRCb29sKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgb3V0IDw8ICJyZWFkSTE2KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBvdXQgPDwgInJlYWRJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCAicmVhZEk2NCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQysrIHJlYWRlciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpICsgbmFtZTsKLSAgICB9Ci0gICAgb3V0IDw8Ci0gICAgICBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHN0cmluZyB0ID0gdG1wKCJlY2FzdCIpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImludDMyX3QgIiA8PCB0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSBpcHJvdC0+cmVhZEkzMigiIDw8IHQgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHQgPDwgIjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHZhcmlhYmxlLiBUaGlzIG1ha2VzIHR3byBrZXkgYXNzdW1wdGlvbnMsCi0gKiBmaXJzdCB0aGF0IHRoZXJlIGlzIGEgY29uc3QgY2hhciogdmFyaWFibGUgbmFtZWQgZGF0YSB0aGF0IHBvaW50cyB0byB0aGUKLSAqIGJ1ZmZlciBmb3IgZGVzZXJpYWxpemF0aW9uLCBhbmQgdGhhdCB0aGVyZSBpcyBhIHZhcmlhYmxlIHByb3RvY29sIHdoaWNoCi0gKiBpcyBhIHJlZmVyZW5jZSB0byBhIFRQcm90b2NvbCBzZXJpYWxpemF0aW9uIG9iamVjdC4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAodm9pZCkgdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAieGZlciArPSAiIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7Ci0gIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7Ci0gIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7Ci0KLSAgdF9jb250YWluZXIqIHRjb250YWluZXIgPSAodF9jb250YWluZXIqKXR0eXBlOwotICBib29sIHVzZV9wdXNoID0gdGNvbnRhaW5lci0+aGFzX2NwcF9uYW1lKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5jbGVhcigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCAiIDw8IHNpemUgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgIiA8PCBrdHlwZSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSAiIDw8IHZ0eXBlIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaXByb3QtPnJlYWRNYXBCZWdpbigiIDw8Ci0gICAgICAgICAgICAgICAgICAga3R5cGUgPDwgIiwgIiA8PCB2dHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSAiIDw8IGV0eXBlIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaXByb3QtPnJlYWRTZXRCZWdpbigiIDw8Ci0gICAgICAgICAgICAgICAgICAgZXR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlICIgPDwgZXR5cGUgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpcHJvdC0+cmVhZExpc3RCZWdpbigiIDw8Ci0gICAgICBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICAgIGlmICghdXNlX3B1c2gpIHsKLSAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnJlc2l6ZSgiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInVpbnQzMl90ICIgPDwgaSA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJmb3IgKCIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IHNpemUgPDwgIjsgKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4LCB1c2VfcHVzaCwgaSk7Ci0gICAgfQotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LT5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC0+cmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LT5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZnZhbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkgPDwgIiA9ICIgPDwKLSAgICBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXTsiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLmluc2VydCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX3B1c2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCkgewotICBpZiAodXNlX3B1c2gpIHsKLSAgICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotICAgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLSAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXNoX2JhY2soIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHByZWZpeCArICJbIiArIGluZGV4ICsgIl0iKTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0gIH0KLX0KLQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgc3VmZml4OwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7Ci0gIH0KLQotCi0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IG9wcm90LT4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93Ci0gICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQysrIHdyaXRlciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpICsgbmFtZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJ3cml0ZUkzMigoaW50MzJfdCkiIDw8IG5hbWUgPDwgIik7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBuYW1lLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgInhmZXIgKz0gIiA8PCBwcmVmaXggPDwgIi53cml0ZShvcHJvdCk7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IG9wcm90LT53cml0ZU1hcEJlZ2luKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgInN0YXRpY19jYXN0PHVpbnQzMl90PigiIDw8IHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gb3Byb3QtPndyaXRlU2V0QmVnaW4oIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAic3RhdGljX2Nhc3Q8dWludDMyX3Q+KCIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gb3Byb3QtPndyaXRlTGlzdEJlZ2luKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICJzdGF0aWNfY2FzdDx1aW50MzJfdD4oIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCAiOjpjb25zdF9pdGVyYXRvciAiIDw8IGl0ZXIgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZm9yICgiIDw8IGl0ZXIgPDwgIiA9ICIgPDwgcHJlZml4ICA8PCAiLmJlZ2luKCk7ICIgPDwgaXRlciA8PCAiICE9ICIgPDwgcHJlZml4IDw8ICIuZW5kKCk7ICsrIiA8PCBpdGVyIDw8ICIpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7Ci0gICAgfQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAieGZlciArPSBvcHJvdC0+d3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IG9wcm90LT53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IG9wcm90LT53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyICsgIi0+Zmlyc3QiKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOwotCi0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBpdGVyICsgIi0+c2Vjb25kIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksICIoKiIgKyBpdGVyICsgIikiKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksICIoKiIgKyBpdGVyICsgIikiKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIE1ha2VzIGEgOjogcHJlZml4IGZvciBhIG5hbWVzcGFjZQotICoKLSAqIEBwYXJhbSBucyBUaGUgbmFtZXNwYWNlLCB3LyBwZXJpb2RzIGluIGl0Ci0gKiBAcmV0dXJuIE5hbWVzcGFjZXMKLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6bmFtZXNwYWNlX3ByZWZpeChzdHJpbmcgbnMpIHsKLSAgaWYgKG5zLnNpemUoKSA9PSAwKSB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgcmVzdWx0ICs9IG5zLnN1YnN0cigwLCBsb2MpOwotICAgIHJlc3VsdCArPSAiOjoiOwotICAgIG5zID0gbnMuc3Vic3RyKGxvYysxKTsKLSAgfQotICBpZiAobnMuc2l6ZSgpID4gMCkgewotICAgIHJlc3VsdCArPSBucyArICI6OiI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBPcGVucyBuYW1lc3BhY2UuCi0gKgotICogQHBhcmFtIG5zIFRoZSBuYW1lc3BhY2UsIHcvIHBlcmlvZHMgaW4gaXQKLSAqIEByZXR1cm4gTmFtZXNwYWNlcwotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpuYW1lc3BhY2Vfb3BlbihzdHJpbmcgbnMpIHsKLSAgaWYgKG5zLnNpemUoKSA9PSAwKSB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgc3RyaW5nIHNlcGFyYXRvciA9ICIiOwotICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0gIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICByZXN1bHQgKz0gc2VwYXJhdG9yOwotICAgIHJlc3VsdCArPSAibmFtZXNwYWNlICI7Ci0gICAgcmVzdWx0ICs9IG5zLnN1YnN0cigwLCBsb2MpOwotICAgIHJlc3VsdCArPSAiIHsiOwotICAgIHNlcGFyYXRvciA9ICIgIjsKLSAgICBucyA9IG5zLnN1YnN0cihsb2MrMSk7Ci0gIH0KLSAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICByZXN1bHQgKz0gc2VwYXJhdG9yICsgIm5hbWVzcGFjZSAiICsgbnMgKyAiIHsiOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ2xvc2VzIG5hbWVzcGFjZS4KLSAqCi0gKiBAcGFyYW0gbnMgVGhlIG5hbWVzcGFjZSwgdy8gcGVyaW9kcyBpbiBpdAotICogQHJldHVybiBOYW1lc3BhY2VzCi0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6Om5hbWVzcGFjZV9jbG9zZShzdHJpbmcgbnMpIHsKLSAgaWYgKG5zLnNpemUoKSA9PSAwKSB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIHN0cmluZyByZXN1bHQgPSAifSI7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLSAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHJlc3VsdCArPSAifSI7Ci0gICAgbnMgPSBucy5zdWJzdHIobG9jKzEpOwotICB9Ci0gIHJlc3VsdCArPSAiIC8vIG5hbWVzcGFjZSI7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIEMrKyB0eXBlIG5hbWUKLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqIEByZXR1cm4gU3RyaW5nIG9mIHRoZSB0eXBlIG5hbWUsIGkuZS4gc3RkOjpzZXQ8dHlwZT4KLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZiwgYm9vbCBhcmcpIHsKLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyBibmFtZSA9IGJhc2VfdHlwZV9uYW1lKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSk7Ci0gICAgaWYgKCFhcmcpIHsKLSAgICAgIHJldHVybiBibmFtZTsKLSAgICB9Ci0KLSAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykgewotICAgICAgcmV0dXJuICJjb25zdCAiICsgYm5hbWUgKyAiJiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAiY29uc3QgIiArIGJuYW1lOwotICAgIH0KLSAgfQotCi0gIC8vIENoZWNrIGZvciBhIGN1c3RvbSBvdmVybG9hZGVkIEMrKyBuYW1lCi0gIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBzdHJpbmcgY25hbWU7Ci0KLSAgICB0X2NvbnRhaW5lciogdGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopIHR0eXBlOwotICAgIGlmICh0Y29udGFpbmVyLT5oYXNfY3BwX25hbWUoKSkgewotICAgICAgY25hbWUgPSB0Y29udGFpbmVyLT5nZXRfY3BwX25hbWUoKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKSB0dHlwZTsKLSAgICAgIGNuYW1lID0gInN0ZDo6bWFwPCIgKwotICAgICAgICB0eXBlX25hbWUodG1hcC0+Z2V0X2tleV90eXBlKCksIGluX3R5cGVkZWYpICsgIiwgIiArCi0gICAgICAgIHR5cGVfbmFtZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgaW5fdHlwZWRlZikgKyAiPiAiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICB0X3NldCogdHNldCA9ICh0X3NldCopIHR0eXBlOwotICAgICAgY25hbWUgPSAic3RkOjpzZXQ8IiArIHR5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGluX3R5cGVkZWYpICsgIj4gIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0KikgdHR5cGU7Ci0gICAgICBjbmFtZSA9ICJzdGQ6OnZlY3RvcjwiICsgdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGluX3R5cGVkZWYpICsgIj4gIjsKLSAgICB9Ci0KLSAgICBpZiAoYXJnKSB7Ci0gICAgICByZXR1cm4gImNvbnN0ICIgKyBjbmFtZSArICImIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGNuYW1lOwotICAgIH0KLSAgfQotCi0gIHN0cmluZyBjbGFzc19wcmVmaXg7Ci0gIGlmIChpbl90eXBlZGVmICYmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpKSB7Ci0gICAgY2xhc3NfcHJlZml4ID0gImNsYXNzICI7Ci0gIH0KLQotICAvLyBDaGVjayBpZiBpdCBuZWVkcyB0byBiZSBuYW1lc3BhY2VkCi0gIHN0cmluZyBwbmFtZTsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHBuYW1lID0KLSAgICAgIGNsYXNzX3ByZWZpeCArCi0gICAgICBuYW1lc3BhY2VfcHJlZml4KHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImNwcCIpKSArCi0gICAgICB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgfSBlbHNlIHsKLSAgICBwbmFtZSA9IGNsYXNzX3ByZWZpeCArIHR0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19lbnVtKCkgJiYgIWdlbl9wdXJlX2VudW1zXykgewotICAgIHBuYW1lICs9ICI6OnR5cGUiOwotICB9Ci0KLSAgaWYgKGFyZykgewotICAgIGlmIChpc19jb21wbGV4X3R5cGUodHR5cGUpKSB7Ci0gICAgICByZXR1cm4gImNvbnN0ICIgKyBwbmFtZSArICImIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICJjb25zdCAiICsgcG5hbWU7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHJldHVybiBwbmFtZTsKLSAgfQotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIEMrKyB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgotICoKLSAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCi0gKiBAcmV0dXJuIEV4cGxpY2l0IEMrKyB0eXBlLCBpLmUuICJpbnQzMl90IgotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlKSB7Ci0gIHN3aXRjaCAodGJhc2UpIHsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgIHJldHVybiAidm9pZCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgIHJldHVybiAic3RkOjpzdHJpbmciOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgcmV0dXJuICJib29sIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIHJldHVybiAiaW50OF90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgcmV0dXJuICJpbnQxNl90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgcmV0dXJuICJpbnQzMl90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgcmV0dXJuICJpbnQ2NF90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgcmV0dXJuICJkb3VibGUiOwotICBkZWZhdWx0OgotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQysrIGJhc2UgdHlwZSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKiBAcmV0dXJuIEZpZWxkIGRlY2xhcmF0aW9uLCBpLmUuIGludCB4ID0gMDsKLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgYm9vbCBwb2ludGVyLCBib29sIGNvbnN0YW50LCBib29sIHJlZmVyZW5jZSkgewotICAvLyBUT0RPKG1jc2xlZSk6IGRvIHdlIGV2ZXIgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZD8KLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBpZiAoY29uc3RhbnQpIHsKLSAgICByZXN1bHQgKz0gImNvbnN0ICI7Ci0gIH0KLSAgcmVzdWx0ICs9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICBpZiAocG9pbnRlcikgewotICAgIHJlc3VsdCArPSAiKiI7Ci0gIH0KLSAgaWYgKHJlZmVyZW5jZSkgewotICAgIHJlc3VsdCArPSAiJiI7Ci0gIH0KLSAgcmVzdWx0ICs9ICIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBcIlwiIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQysrIGluaXRpYWxpemVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gKCIgKyB0eXBlX25hbWUodHlwZSkgKyAiKTAiOwotICAgIH0KLSAgfQotICBpZiAoIXJlZmVyZW5jZSkgewotICAgIHJlc3VsdCArPSAiOyI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuYW1lX3BhcmFtcykgewotICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwotICB0X3N0cnVjdCogYXJnbGlzdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgYm9vbCBoYXNfeGNlcHRpb25zID0gIXRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpLmVtcHR5KCk7Ci0KLSAgaWYgKHN0eWxlID09ICIiKSB7Ci0gICAgaWYgKGlzX2NvbXBsZXhfdHlwZSh0dHlwZSkpIHsKLSAgICAgIHJldHVybgotICAgICAgICAidm9pZCAiICsgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsKLSAgICAgICAgIigiICsgdHlwZV9uYW1lKHR0eXBlKSArIChuYW1lX3BhcmFtcyA/ICImIF9yZXR1cm4iIDogIiYgLyogX3JldHVybiAqLyIpICsKLSAgICAgICAgYXJndW1lbnRfbGlzdChhcmdsaXN0LCBuYW1lX3BhcmFtcywgdHJ1ZSkgKyAiKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybgotICAgICAgICB0eXBlX25hbWUodHR5cGUpICsgIiAiICsgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsKLSAgICAgICAgIigiICsgYXJndW1lbnRfbGlzdChhcmdsaXN0LCBuYW1lX3BhcmFtcykgKyAiKSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHN0eWxlLnN1YnN0cigwLDMpID09ICJDb2IiKSB7Ci0gICAgc3RyaW5nIGNvYl90eXBlOwotICAgIHN0cmluZyBleG5fY29iOwotICAgIGlmIChzdHlsZSA9PSAiQ29iQ2wiKSB7Ci0gICAgICBjb2JfdHlwZSA9ICIoIiArIHNlcnZpY2VfbmFtZV8gKyAiQ29iQ2xpZW50IjsKLSAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgICBjb2JfdHlwZSArPSAiVDxQcm90b2NvbF8+IjsKLSAgICAgIH0KLSAgICAgIGNvYl90eXBlICs9ICIqIGNsaWVudCkiOwotICAgIH0gZWxzZSBpZiAoc3R5bGUgPT0iQ29iU3YiKSB7Ci0gICAgICBjb2JfdHlwZSA9ICh0dHlwZS0+aXNfdm9pZCgpCi0gICAgICAgICAgICAgICAgICA/ICIoKSIKLSAgICAgICAgICAgICAgICAgIDogKCIoIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiIGNvbnN0JiBfcmV0dXJuKSIpKTsKLSAgICAgIGlmIChoYXNfeGNlcHRpb25zKSB7Ci0gICAgICAgIGV4bl9jb2IgPSAiLCBzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZCg6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KT4gLyogZXhuX2NvYiAqLyI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93ICJVTktOT1dOIFNUWUxFIjsKLSAgICB9Ci0KLSAgICByZXR1cm4KLSAgICAgICJ2b2lkICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKwotICAgICAgIihzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZCIgKyBjb2JfdHlwZSArICI+IGNvYiIgKyBleG5fY29iICsKLSAgICAgIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCwgbmFtZV9wYXJhbXMsIHRydWUpICsgIikiOwotICB9IGVsc2UgewotICAgIHRocm93ICJVTktOT1dOIFNUWUxFIjsKLSAgfQotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIENvbW1hIHNlcGVhcmF0ZWQgbGlzdCBvZiBhbGwgZmllbGQgbmFtZXMgaW4gdGhhdCBzdHJ1Y3QKLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBuYW1lX3BhcmFtcywgYm9vbCBzdGFydF9jb21tYSkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gIXN0YXJ0X2NvbW1hOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSkgKyAiICIgKwotICAgICAgKG5hbWVfcGFyYW1zID8gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDogIi8qICIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiICovIik7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gKgotICogQHBhcmFtIHR5cGUgVGhyaWZ0IFR5cGUKLSAqIEByZXR1cm4gU3RyaW5nIG9mIEMrKyBjb2RlIHRvIGRlZmluaXRpb24gb2YgdGhhdCB0eXBlIGNvbnN0YW50Ci0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0JZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0xJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIHN5bWJvbCBuYW1lIG9mIHRoZSBsb2NhbCByZWZsZWN0aW9uIG9mIGEgdHlwZS4KLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6bG9jYWxfcmVmbGVjdGlvbl9uYW1lKGNvbnN0IGNoYXIqIHByZWZpeCwgdF90eXBlKiB0dHlwZSwgYm9vbCBleHRlcm5hbCkgewotICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotCi0gIC8vIFdlIGhhdmUgdG8gdXNlIHRoZSBwcm9ncmFtIG5hbWUgYXMgcGFydCBvZiB0aGUgaWRlbnRpZmllciBiZWNhdXNlCi0gIC8vIGlmIHR3byB0aHJpZnQgInByb2dyYW1zIiBhcmUgY29tcGlsZWQgaW50byBvbmUgYWN0dWFsIHByb2dyYW0KLSAgLy8geW91IHdvdWxkIGdldCBhIHN5bWJvbCBjb2xsaXNpb24gaWYgdGhleSBib3RoIGRlZmluZWQgbGlzdDxpMzI+LgotICAvLyB0cmxvID0gVGhyaWZ0IFJlZmxlY3Rpb24gTE9jYWwuCi0gIHN0cmluZyBwcm9nOwotICBzdHJpbmcgbmFtZTsKLSAgc3RyaW5nIG5zcGFjZTsKLQotICAvLyBUT0RPKGRyZWlzcyk6IFdvdWxkIGl0IGJlIGJldHRlciB0byBwcmVnZW5lcmF0ZSB0aGUgYmFzZSB0eXBlcwotICAvLyAgICAgICAgICAgICAgIGFuZCBwdXQgdGhlbSBpbiBUaHJpZnQue2gsY3BwfSA/Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHByb2cgPSBwcm9ncmFtXy0+Z2V0X25hbWUoKTsKLSAgICBuYW1lID0gdHR5cGUtPmdldF9hc2NpaV9maW5nZXJwcmludCgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBhc3NlcnQodHR5cGUtPmdldF9wcm9ncmFtKCkgIT0gTlVMTCk7Ci0gICAgcHJvZyA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpOwotICAgIG5hbWUgPSB0dHlwZS0+Z2V0X2FzY2lpX2ZpbmdlcnByaW50KCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgcHJvZyA9IHByb2dyYW1fLT5nZXRfbmFtZSgpOwotICAgIG5hbWUgPSB0dHlwZS0+Z2V0X2FzY2lpX2ZpbmdlcnByaW50KCk7Ci0gIH0gZWxzZSB7Ci0gICAgYXNzZXJ0KHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSk7Ci0gICAgYXNzZXJ0KHR0eXBlLT5nZXRfcHJvZ3JhbSgpICE9IE5VTEwpOwotICAgIHByb2cgPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKTsKLSAgICBuYW1lID0gdHR5cGUtPmdldF9hc2NpaV9maW5nZXJwcmludCgpOwotICB9Ci0KLSAgaWYgKGV4dGVybmFsICYmCi0gICAgICB0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBOVUxMICYmCi0gICAgICB0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBwcm9ncmFtXykgewotICAgIG5zcGFjZSA9IG5hbWVzcGFjZV9wcmVmaXgodHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImNwcCIpKTsKLSAgfQotCi0gIHJldHVybiBuc3BhY2UgKyAidHJsb18iICsgcHJlZml4ICsgIl8iICsgcHJvZyArICJfIiArIG5hbWU7Ci19Ci0KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmdldF9pbmNsdWRlX3ByZWZpeChjb25zdCB0X3Byb2dyYW0mIHByb2dyYW0pIGNvbnN0IHsKLSAgc3RyaW5nIGluY2x1ZGVfcHJlZml4ID0gcHJvZ3JhbS5nZXRfaW5jbHVkZV9wcmVmaXgoKTsKLSAgaWYgKCF1c2VfaW5jbHVkZV9wcmVmaXhfIHx8Ci0gICAgICAoaW5jbHVkZV9wcmVmaXguc2l6ZSgpID4gMCAmJiBpbmNsdWRlX3ByZWZpeFswXSA9PSAnLycpKSB7Ci0gICAgLy8gaWYgZmxhZyBpcyB0dXJuZWQgb2ZmIG9yIHRoaXMgaXMgYWJzb2x1dGUgcGF0aCwgcmV0dXJuIGVtcHR5IHByZWZpeAotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIHN0cmluZzo6c2l6ZV90eXBlIGxhc3Rfc2xhc2ggPSBzdHJpbmc6Om5wb3M7Ci0gIGlmICgobGFzdF9zbGFzaCA9IGluY2x1ZGVfcHJlZml4LnJmaW5kKCIvIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHJldHVybiBpbmNsdWRlX3ByZWZpeC5zdWJzdHIoMCwgbGFzdF9zbGFzaCkgKyAiLyIgKyBvdXRfZGlyX2Jhc2VfICsgIi8iOwotICB9Ci0KLSAgcmV0dXJuICIiOwotfQotCi0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoY3BwLCAiQysrIiwKLSIgICAgY29iX3N0eWxlOiAgICAgICBHZW5lcmF0ZSBcIkNvbnRpbnVhdGlvbiBPQmplY3RcIi1zdHlsZSBjbGFzc2VzLlxuIgotIiAgICBub19jbGllbnRfY29tcGxldGlvbjpcbiIKLSIgICAgICAgICAgICAgICAgICAgICBPbWl0IGNhbGxzIHRvIGNvbXBsZXRpb25fXygpIGluIENvYkNsaWVudCBjbGFzcy5cbiIKLSIgICAgdGVtcGxhdGVzOiAgICAgICBHZW5lcmF0ZSB0ZW1wbGF0aXplZCByZWFkZXIvd3JpdGVyIG1ldGhvZHMuXG4iCi0iICAgIHB1cmVfZW51bXM6ICAgICAgR2VuZXJhdGUgcHVyZSBlbnVtcyBpbnN0ZWFkIG9mIHdyYXBwZXIgY2xhc3Nlcy5cbiIKLSIgICAgZGVuc2U6ICAgICAgICAgICBHZW5lcmF0ZSB0eXBlIHNwZWNpZmljYXRpb25zIGZvciB0aGUgZGVuc2UgcHJvdG9jb2wuXG4iCi0iICAgIGluY2x1ZGVfcHJlZml4OiAgVXNlIGZ1bGwgaW5jbHVkZSBwYXRocyBpbiBnZW5lcmF0ZWQgZmlsZXMuXG4iCi0pCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NzaGFycF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYTM5ZjkuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NzaGFycF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzExICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCi0gKiBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi1jbGFzcyB0X2NzaGFycF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yCi17Ci0gIHB1YmxpYzoKLSAgICB0X2NzaGFycF9nZW5lcmF0b3IoCi0gICAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgICB7Ci0gICAgICAodm9pZCkgcGFyc2VkX29wdGlvbnM7Ci0gICAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWNzaGFycCI7Ci0gICAgfQotICAgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0KLSAgICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgKHRfdHlwZWRlZiogdHR5cGVkZWYpOwotICAgIHZvaWQgZ2VuZXJhdGVfZW51bSAodF9lbnVtKiB0ZW51bSk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgKHRfc3RydWN0KiB0c3RydWN0KTsKLSAgICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogdHhjZXB0aW9uKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfcHJvcGVydHkob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljKTsKLSAgICB2b2lkIGdlbmVyYXRlX2NzaGFycF9wcm9wZXJ0eShvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4ID0gIiIpOwotICAgIGJvb2wgcHJpbnRfY29uc3RfdmFsdWUgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBpbl9zdGF0aWMsIGJvb2wgZGVmdmFsPWZhbHNlLCBib29sIG5lZWR0eXBlPWZhbHNlKTsKLSAgICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLSAgICB2b2lkIHByaW50X2NvbnN0X2NvbnN0cnVjdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0gICAgdm9pZCBwcmludF9jb25zdF9kZWZfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICAgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb249ZmFsc2UsIGJvb2wgaW5fY2xhc3M9ZmFsc2UsIGJvb2wgaXNfcmVzdWx0PWZhbHNlKTsKLSAgICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICAgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICAgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogZnVuY3Rpb24pOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9saXN0KiBsaXN0LCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIsIHN0ZDo6c3RyaW5nIG1hcCk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICAgIHZvaWQgc3RhcnRfY3NoYXJwX25hbWVzcGFjZSAoc3RkOjpvZnN0cmVhbSYgb3V0KTsKLSAgICB2b2lkIGVuZF9jc2hhcnBfbmFtZXNwYWNlIChzdGQ6Om9mc3RyZWFtJiBvdXQpOwotCi0gICAgc3RkOjpzdHJpbmcgY3NoYXJwX3R5cGVfdXNpbmdzKCk7Ci0gICAgc3RkOjpzdHJpbmcgY3NoYXJwX3RocmlmdF91c2luZ3MoKTsKLQotICAgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvdW50YWluZXI9ZmFsc2UsIGJvb2wgaW5faW5pdD1mYWxzZSk7Ci0gICAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLCBib29sIGluX2NvbnRhaW5lcj1mYWxzZSk7Ci0gICAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICAgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICAgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgICBzdGQ6OnN0cmluZyBwcm9wX25hbWUodF9maWVsZCogdGZpZWxkKTsKLQotICAgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7Ci0gICAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgICAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwKLSAgICAgICAgdHR5cGUtPmlzX3N0cnVjdCgpIHx8Ci0gICAgICAgIHR0eXBlLT5pc194Y2VwdGlvbigpIHx8Ci0gICAgICAgIHR0eXBlLT5pc19zdHJpbmcoKTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfbmFtZV87Ci0gICAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotICAgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9kaXJfOwotfTsKLQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0gIG5hbWVzcGFjZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjc2hhcnAiKTsKLQotICBzdHJpbmcgZGlyID0gbmFtZXNwYWNlX25hbWVfOwotICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKS5jX3N0cigpOwotICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0KLSAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7Ci0gICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOwotICAgIGRpciA9IGRpci5zdWJzdHIobG9jICsgMSk7Ci0gIH0KLSAgaWYgKGRpci5zaXplKCkgPiAwKSB7Ci0gICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOwotICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgfQotCi0gIG5hbWVzcGFjZV9kaXJfID0gc3ViZGlyOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6c3RhcnRfY3NoYXJwX25hbWVzcGFjZShvZnN0cmVhbSYgb3V0KSB7Ci0gIGlmICghbmFtZXNwYWNlX25hbWVfLmVtcHR5KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgICJuYW1lc3BhY2UgIiA8PCBuYW1lc3BhY2VfbmFtZV8gPDwgIlxuIjsKLSAgICBzY29wZV91cChvdXQpOwotICB9Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjplbmRfY3NoYXJwX25hbWVzcGFjZShvZnN0cmVhbSYgb3V0KSB7Ci0gIGlmICghbmFtZXNwYWNlX25hbWVfLmVtcHR5KCkpIHsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6Y3NoYXJwX3R5cGVfdXNpbmdzKCkgewotICByZXR1cm4gc3RyaW5nKCkgKwotICAgICJ1c2luZyBTeXN0ZW07XG4iICsKLSAgICAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zO1xuIiArCi0gICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljO1xuIiArCi0gICAgInVzaW5nIFN5c3RlbS5UZXh0O1xuIiArCi0gICAgInVzaW5nIFN5c3RlbS5JTztcbiIgKwotICAgICJ1c2luZyBUaHJpZnQ7XG4iICsKLSAgICAidXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zO1xuIjsKLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6Y3NoYXJwX3RocmlmdF91c2luZ3MoKSB7Ci0gIHJldHVybiBzdHJpbmcoKSArCi0gICAgInVzaW5nIFRocmlmdC5Qcm90b2NvbDtcbiIgKwotICAgICJ1c2luZyBUaHJpZnQuVHJhbnNwb3J0O1xuIjsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsgfQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCkgdHR5cGVkZWY7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgc3RyaW5nIGZfZW51bV9uYW1lID0gbmFtZXNwYWNlX2Rpcl8rIi8iICsgKHRlbnVtLT5nZXRfbmFtZSgpKSsiLmNzIjsKLSAgb2ZzdHJlYW0gZl9lbnVtOwotICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKLQotICBmX2VudW0gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOwotCi0gIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2UoZl9lbnVtKTsKLQotICBpbmRlbnQoZl9lbnVtKSA8PAotICAgICJwdWJsaWMgZW51bSAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJcbiI7Ci0gIHNjb3BlX3VwKGZfZW51bSk7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgaW5kZW50KGZfZW51bSkgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlIDw8ICIsIiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihmX2VudW0pOwotCi0gIGVuZF9jc2hhcnBfbmFtZXNwYWNlKGZfZW51bSk7Ci0KLSAgZl9lbnVtLmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBpZiAoY29uc3RzLmVtcHR5KCkpewotICAgIHJldHVybjsKLSAgfQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi9Db25zdGFudHMuY3MiOwotICBvZnN0cmVhbSBmX2NvbnN0czsKLSAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIGZfY29uc3RzIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBjc2hhcnBfdHlwZV91c2luZ3MoKSA8PCBlbmRsOwotCi0gIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2UoZl9jb25zdHMpOwotCi0gIGluZGVudChmX2NvbnN0cykgPDwKLSAgICAicHVibGljIGNsYXNzIENvbnN0YW50cyIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9jb25zdHMpOwotCi0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgYm9vbCBuZWVkX3N0YXRpY19jb25zdHJ1Y3RvciA9IGZhbHNlOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmIChwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLCAoKmNfaXRlciktPmdldF90eXBlKCksICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksIGZhbHNlKSkgewotICAgICAgbmVlZF9zdGF0aWNfY29uc3RydWN0b3IgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIGlmIChuZWVkX3N0YXRpY19jb25zdHJ1Y3RvcikgewotICAgIHByaW50X2NvbnN0X2NvbnN0cnVjdG9yKGZfY29uc3RzLCBjb25zdHMpOwotICB9Ci0KLSAgc2NvcGVfZG93bihmX2NvbnN0cyk7Ci0gIGVuZF9jc2hhcnBfbmFtZXNwYWNlKGZfY29uc3RzKTsKLSAgZl9jb25zdHMuY2xvc2UoKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X2RlZl92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKQotewotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiWyIgPDwga2V5IDw8ICJdIiA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLQotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5BZGQoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfY29uc3RydWN0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7Ci0gIGluZGVudChvdXQpIDw8ICJzdGF0aWMgQ29uc3RhbnRzKCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7Ci0gICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotCi0gICAgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotICB9Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotCi0vL2l0IHNlZW1zIGxpa2UgYWxsIHRoYXQgbWV0aG9kcyB0aGF0IGNhbGwgdGhpcyBhcmUgdXNpbmcgaW5fc3RhdGljIHRvIGJlIHRoZSBvcHBvc2l0ZSBvZiB3aGF0IGl0IHdvdWxkIGltcGx5Ci1ib29sIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBpbl9zdGF0aWMsIGJvb2wgZGVmdmFsLCBib29sIG5lZWR0eXBlKSB7Ci0gIGluZGVudChvdXQpOwotICBib29sIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9ICFpbl9zdGF0aWM7Ci0gIGlmICghZGVmdmFsIHx8IG5lZWR0eXBlKSB7Ci0gICAgb3V0IDw8Ci0gICAgICAoaW5fc3RhdGljID8gIiIgOiAicHVibGljIHN0YXRpYyAiKSA8PAotICAgICAgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKLSAgfQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGw7Ci0gICAgbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uID0gZmFsc2U7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9ICgiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIikiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PCBlbmRsOwotICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9IGZhbHNlOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKGRlZnZhbCAmJiAhdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR5cGUtPmlzX2VudW0oKSkgewotICAgIHByaW50X2NvbnN0X2RlZl92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKLSAgfQotCi0gIHJldHVybiBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb247Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gICh2b2lkKSBuYW1lOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdGJhc2U7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJlbmRlciA8PCAiKCIgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOwotICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUsIHRydWUsIHRydWUpOwotICAgIHJlbmRlciA8PCB0OwotICB9Ci0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArICh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuY3MiOwotICBvZnN0cmVhbSBmX3N0cnVjdDsKLQotICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zdHJ1Y3QgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGNzaGFycF90eXBlX3VzaW5ncygpIDw8Ci0gICAgY3NoYXJwX3RocmlmdF91c2luZ3MoKTsKLQotICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0KLSAgZl9zdHJ1Y3QuY2xvc2UoKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSAmb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24sIGJvb2wgaW5fY2xhc3MsIGJvb2wgaXNfcmVzdWx0KSB7Ci0KLSAgaWYgKCFpbl9jbGFzcykgewotICAgIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2Uob3V0KTsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiW1NlcmlhbGl6YWJsZV0iIDw8IGVuZGw7Ci0gIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKLSAKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJzZWFsZWQgIiA6ICIiKSA8PCAicGFydGlhbCBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA6ICI7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAiRXhjZXB0aW9uLCAiOwotICB9Ci0gIG91dCA8PCAiVEJhc2UiOwotCi0gIG91dCA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICAvL21ha2UgcHJpdmF0ZSBtZW1iZXJzIHdpdGggcHVibGljIFByb3BlcnRpZXMKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAicHJpdmF0ZSAiIDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsICJfIikgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwgZW5kbDsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvcGVydHkob3V0LCAqbV9pdGVyLCB0cnVlKTsKLSAgfQotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwdWJsaWMgSXNzZXQgX19pc3NldDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJbU2VyaWFsaXphYmxlXSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInB1YmxpYyBzdHJ1Y3QgSXNzZXQgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAicHVibGljIGJvb2wgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSAoKm1faXRlciktPmdldF90eXBlKCk7Ci0gICAgd2hpbGUgKHQtPmlzX3R5cGVkZWYoKSkgewotICAgICAgdCA9ICgodF90eXBlZGVmKil0KS0+Z2V0X3R5cGUoKTsKLSAgICB9Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy5fIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgdCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBpZiAoaXNfcmVzdWx0KSB7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfQotICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCk7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaWYgKCFpbl9jbGFzcykKLSAgewotICAgIGVuZF9jc2hhcnBfbmFtZXNwYWNlKG91dCk7Ci0gIH0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgInB1YmxpYyB2b2lkIFJlYWQgKFRQcm90b2NvbCBpcHJvdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIlRGaWVsZCBmaWVsZDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QuUmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJmaWVsZCA9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApIHsgIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiYnJlYWs7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInN3aXRjaCAoZmllbGQuSUQpIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlmIChmaWVsZC5UeXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PAotICAgICJkZWZhdWx0OiAiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImlwcm90LlJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiaXByb3QuUmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCBXcml0ZShUUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJUU3RydWN0IHN0cnVjID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IG5hbWUgPDwgIlwiKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgIm9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOyIgPDwgZW5kbDsKLQotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgpOyIgPDwgZW5kbDsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCAmJiBfX2lzc2V0LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJpZiAoX19pc3NldC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIH0KLQotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImZpZWxkLk5hbWUgPSBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiZmllbGQuSUQgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZCk7IiA8PCBlbmRsOwotCi0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKLQotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIm9wcm90LldyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PAotICAgICJvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAib3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Jlc3VsdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHVibGljIHZvaWQgV3JpdGUoVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiVFN0cnVjdCBzdHJ1YyA9IG5ldyBUU3RydWN0KFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgICJvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsiIDw8IGVuZGw7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgIiBlbHNlIGlmICI7Ci0gICAgICB9Ci0KLSAgICAgIG91dCA8PAotICAgICAgICAiKHRoaXMuX19pc3NldC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJpZiAoIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIH0KLQotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImZpZWxkLk5hbWUgPSBcIiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICJcIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiZmllbGQuSUQgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZCk7IiA8PCBlbmRsOwotCi0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKLQotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIm9wcm90LldyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0gICAgfQotICB9Ci0KLSAgb3V0IDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfdG9zdHJpbmcob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIlN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiKTsiIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgInNiLkFwcGVuZChcIiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIjogXCIpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgInNiLkFwcGVuZChcIiwiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICI6IFwiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgaWYgKHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgInNiLkFwcGVuZCgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICI9PSBudWxsID8gXCI8bnVsbD5cIiA6ICI8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSAgPDwgIi5Ub1N0cmluZygpKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJzYi5BcHBlbmQoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSAgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInNiLkFwcGVuZChcIilcIik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgICJyZXR1cm4gc2IuVG9TdHJpbmcoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiLmNzIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGNzaGFycF90eXBlX3VzaW5ncygpIDw8Ci0gICAgY3NoYXJwX3RocmlmdF91c2luZ3MoKTsKLQotICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKGZfc2VydmljZV8pOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJ9IiA8PCBlbmRsOwotICBlbmRfY3NoYXJwX25hbWVzcGFjZShmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfaWZhY2UgPSAiIDogIiArIGV4dGVuZHMgKyAiLklmYWNlIjsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgaW50ZXJmYWNlIElmYWNlIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKLSAgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLkNsaWVudCwgIjsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgY2xhc3MgQ2xpZW50IDogIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiSWZhY2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBwcm90KSA6IHRoaXMocHJvdCwgcHJvdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBDbGllbnQoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIjsKLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICIgOiBiYXNlKGlwcm90LCBvcHJvdCkiOwotICB9Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJpcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdF8gPSBvcHJvdDsiIDw8IGVuZGw7Ci0gIH0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgVFByb3RvY29sIGlwcm90XzsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgVFByb3RvY29sIG9wcm90XzsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgaW50IHNlcWlkXzsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBUUHJvdG9jb2wgSW5wdXRQcm90b2NvbCIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImdldCB7IHJldHVybiBpcHJvdF87IH0iIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBUUHJvdG9jb2wgT3V0cHV0UHJvdG9jb2wiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJnZXQgeyByZXR1cm4gb3Byb3RfOyB9IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKLSAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOwotCi0gICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdF8uV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkNhbGwsIHNlcWlkXykpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmbGRfaXRlcikgPDwgIiA9ICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImFyZ3MuV3JpdGUob3Byb3RfKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdF8uV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfLlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICZub2FyZ3MsCi0gICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiVE1lc3NhZ2UgbXNnID0gaXByb3RfLlJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChtc2cuVHlwZSA9PSBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5SZWFkKGlwcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpcHJvdF8uUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInRocm93IHg7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LlJlYWQoaXByb3RfKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlwcm90Xy5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLQotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC5zdWNjZXNzKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlc3VsdC5TdWNjZXNzOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICB0X3N0cnVjdCAqeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLQotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAgICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk1pc3NpbmdSZXN1bHQsIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5Qcm9jZXNzb3IsICI7Ci0gIH0KLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIGNsYXNzIFByb2Nlc3NvciA6ICIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIlRQcm9jZXNzb3IgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBQcm9jZXNzb3IoSWZhY2UgaWZhY2UpIiA7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiIDogYmFzZShpZmFjZSkiOwotICB9Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiaWZhY2VfID0gaWZhY2U7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfW1wiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiXSA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJfUHJvY2VzczsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgZGVsZWdhdGUgdm9pZCBQcm9jZXNzRnVuY3Rpb24oaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJwcml2YXRlIElmYWNlIGlmYWNlXzsiIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgRGljdGlvbmFyeTxzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4gcHJvY2Vzc01hcF8gPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4oKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyBib29sIFByb2Nlc3MoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsOwotICB9Ci0gIGVsc2UKLSAgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyBuZXcgYm9vbCBQcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKLSAgfQotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8ICBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90LlJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJQcm9jZXNzRnVuY3Rpb24gZm47IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfLlRyeUdldFZhbHVlKG1zZy5OYW1lLCBvdXQgZm4pOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoZm4gPT0gbnVsbCkgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgVFR5cGUuU3RydWN0KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93bk1ldGhvZCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIgKyBtc2cuTmFtZSArIFwiJ1wiKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1zZy5TZXFJRCkpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHguV3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImZuKG1zZy5TZXFJRCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImNhdGNoIChJT0V4Y2VwdGlvbikiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKQotICB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0ICp4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLQotICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpIHRzZXJ2aWNlOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIHZvaWQgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIl9Qcm9jZXNzKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJhcmdzLlJlYWQoaXByb3QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdC5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5TdWNjZXNzID0gIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgImlmYWNlXy4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIn0iOwotICAgICAgfQotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgICByZXR1cm47Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJlcGx5LCBzZXFpZCkpOyAiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmVzdWx0LldyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0gIHdoaWxlKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHByb3BfbmFtZSh0ZmllbGQpOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICBuYW1lIDw8ICIgPSAiOwotCi0gICAgaWYgKHR5cGUtPmlzX2VudW0oKSkKLSAgICB7Ci0gICAgICBvdXQgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIikiOwotICAgIH0KLQotICAgIG91dCA8PCAiaXByb3QuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgICAgb3V0IDw8ICJSZWFkQmluYXJ5KCk7IjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0IDw8ICJSZWFkU3RyaW5nKCk7IjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBvdXQgPDwgIlJlYWRCb29sKCk7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIG91dCA8PCAiUmVhZEJ5dGUoKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBvdXQgPDwgIlJlYWRJMTYoKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBvdXQgPDwgIlJlYWRJMzIoKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBvdXQgPDwgIlJlYWRJNjQoKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBvdXQgPDwgIlJlYWREb3VibGUoKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0YmFzZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJSZWFkSTMyKCk7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIuUmVhZChpcHJvdCk7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBzdHJpbmcgb2JqOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvYmogPSB0bXAoIl9tYXAiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvYmogPSB0bXAoIl9zZXQiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbGlzdCIpOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8ZW5kbDsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIlRNYXAgIiA8PCBvYmogPDwgIiA9IGlwcm90LlJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJUU2V0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5SZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIlRMaXN0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5SZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgImZvciggaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLkNvdW50IiA8PCAiOyAiIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKLQotICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZlbGVtLCB0cnVlKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmZWxlbSwgdHJ1ZSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgcHJvcF9uYW1lKHRmaWVsZCk7Ci0gIAotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0KLSAgICAgIHN3aXRjaCh0YmFzZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgICBvdXQgPDwgIldyaXRlQmluYXJ5KCI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dCA8PCAiV3JpdGVTdHJpbmcoIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgb3V0IDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIG91dCA8PCAiV3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgb3V0IDw8ICJXcml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgIG91dCA8PCAiV3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgIG91dCA8PCAiV3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIG91dCA8PCAiV3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIG91dCA8PCAiV3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRiYXNlOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIldyaXRlSTMyKChpbnQpIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSAnJXMlcycgVFlQRSAnJXMnXG4iLAotICAgICAgICBwcmVmaXguY19zdHIoKSwKLSAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewotICAodm9pZCkgdHN0cnVjdDsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIuV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LldyaXRlTWFwQmVnaW4obmV3IFRNYXAoIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5Db3VudCkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LldyaXRlU2V0QmVnaW4obmV3IFRTZXQoIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5Db3VudCkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC5Xcml0ZUxpc3RCZWdpbihuZXcgVExpc3QoIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgcHJlZml4IDw8ICIuQ291bnQpKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yZWFjaCAoIiA8PAotICAgICAgdHlwZV9uYW1lKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyIDw8Ci0gICAgICAiIGluICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLktleXMpIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvcmVhY2ggKCIgPDwKLSAgICAgIHR5cGVfbmFtZSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIgPDwKLSAgICAgICIgaW4gIiA8PAotICAgICAgcHJlZml4IDw8ICIpIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3JlYWNoICgiIDw8Ci0gICAgICB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlciA8PAotICAgICAgIiBpbiAiIDw8Ci0gICAgICBwcmVmaXggPDwgIikiOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBpdGVyLCBzdHJpbmcgbWFwKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOwotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgbWFwICsgIlsiICsgaXRlciArICJdIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvcGVydHkob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljKSB7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX3Byb3BlcnR5KG91dCwgdGZpZWxkLCBpc1B1YmxpYywgIl8iKTsKLX0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfcHJvcGVydHkob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCkgewotICAgIGluZGVudChvdXQpIDw8IChpc1B1YmxpYyA/ICJwdWJsaWMgIiA6ICJwcml2YXRlICIpIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpCi0gICAgICAgICAgICAgICAgPDwgIiAiIDw8IHByb3BfbmFtZSh0ZmllbGQpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZ2V0IiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGZpZWxkUHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAic2V0IiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXQuIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRQcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IHZhbHVlOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotfQotCi1zdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OnByb3BfbmFtZSh0X2ZpZWxkKiB0ZmllbGQpIHsKLSAgICBzdHJpbmcgbmFtZSAodGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKLSAgICByZXR1cm4gbmFtZTsKLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY29udGFpbmVyLCBib29sIGluX2luaXQpIHsKLSAgKHZvaWQpIGluX2luaXQ7Ci0gIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlLCBpbl9jb250YWluZXIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHRfbWFwICp0bWFwID0gKHRfbWFwKikgdHR5cGU7Ci0gICAgcmV0dXJuICJEaWN0aW9uYXJ5PCIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X2tleV90eXBlKCksIHRydWUpICsKLSAgICAgICIsICIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHRydWUpICsgIj4iOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0KikgdHR5cGU7Ci0gICAgcmV0dXJuICJUSGFzaFNldDwiICsgdHlwZV9uYW1lKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSkgKyAiPiI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0KikgdHR5cGU7Ci0gICAgcmV0dXJuICJMaXN0PCIgKyB0eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSkgKyAiPiI7Ci0gIH0KLQotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgc3RyaW5nIG5zID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY3NoYXJwIik7Ci0gICAgaWYgKCFucy5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gbnMgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXIpIHsKLSAgKHZvaWQpIGluX2NvbnRhaW5lcjsKLSAgc3dpdGNoICh0YmFzZS0+Z2V0X2Jhc2UoKSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHJldHVybiAidm9pZCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBpZiAodGJhc2UtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgIHJldHVybiAiYnl0ZVtdIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAic3RyaW5nIjsKLSAgICAgIH0KLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gImJvb2wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiYnl0ZSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gInNob3J0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiaW50IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAibG9uZyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gImRvdWJsZSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0YmFzZS0+Z2V0X2Jhc2UoKTsKLSAgfQotfQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBzdGQ6OnN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIHJlc3VsdCA9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0gICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgICB9Ci0gICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIG9mc3RyZWFtIGR1bW15OwotICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAoIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIikwIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdCArICI7IjsKLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwotICByZXR1cm4gdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmV0dXJuICJUVHlwZS5TdHJpbmciOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZXR1cm4gIlRUeXBlLkJvb2wiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICByZXR1cm4gIlRUeXBlLkJ5dGUiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJldHVybiAiVFR5cGUuRG91YmxlIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlN0cnVjdCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1hcCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNldCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5MaXN0IjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGNzaGFycCwgIkMjIiwgIiIpCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNGQzMGYuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5OTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgInRfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBFcmxhbmcgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X2VybF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9lcmxfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICAodm9pZCkgcGFyc2VkX29wdGlvbnM7Ci0gICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0gICAgcHJvZ3JhbV9uYW1lX1swXSA9IHRvbG93ZXIocHJvZ3JhbV9uYW1lX1swXSk7Ci0gICAgc2VydmljZV9uYW1lX1swXSA9IHRvbG93ZXIoc2VydmljZV9uYW1lX1swXSk7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tZXJsIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAodF9jb25zdCogICAgdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9tZW1iZXJfdHlwZShzdGQ6Om9zdHJlYW0gJiBvdXQsIHRfdHlwZSogdHlwZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfbWVtYmVyX3ZhbHVlKHN0ZDo6b3N0cmVhbSAmIG91dCwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX21lbWJlcl90eXBlKHRfZmllbGQgKiBmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9tZW1iZXJfdmFsdWUodF9maWVsZCAqIGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX21lbWJlcl9yZXF1aXJlZG5lc3ModF9maWVsZCAqIGZpZWxkKTsKLQotICBzdGQ6OnN0cmluZyByZW5kZXJfZGVmYXVsdF92YWx1ZSh0X3R5cGUqIHR5cGUpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl90eXBlX3Rlcm0odF90eXBlKiB0dHlwZSwgYm9vbCBleHBhbmRfc3RydWN0cywgYm9vbCBleHRlbmRlZF9pbmZvID0gZmFsc2UpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZXJsX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2VybF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2VybF9zdHJ1Y3RfbWVtYmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkICogdG1lbWJlcik7Ci0gIHZvaWQgZ2VuZXJhdGVfZXJsX3N0cnVjdF9pbmZvKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZXJsX2V4dGVuZGVkX3N0cnVjdF9pbmZvKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZXJsX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2luZm8gICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBlcmxfYXV0b2dlbl9jb21tZW50KCk7Ci0gIHN0ZDo6c3RyaW5nIGVybF9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotCi0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbW9kdWxlKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0ZDo6c3RyaW5nIGNhcGl0YWxpemUoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBpblswXSA9IHRvdXBwZXIoaW5bMF0pOwotICAgIHJldHVybiBpbjsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHVuY2FwaXRhbGl6ZShzdGQ6OnN0cmluZyBpbikgewotICAgIGluWzBdID0gdG9sb3dlcihpblswXSk7Ci0gICAgcmV0dXJuIGluOwotICB9Ci0KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbW1lbnQoc3RyaW5nIGluKTsKLQotIHByaXZhdGU6Ci0KLSAgLyoqCi0gICAqIGFkZCBmdW5jdGlvbiB0byBleHBvcnQgbGlzdAotICAgKi8KLQotICB2b2lkIGV4cG9ydF9mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHZvaWQgZXhwb3J0X3N0cmluZyhzdGQ6OnN0cmluZyBuYW1lLCBpbnQgbnVtKTsKLQotICB2b2lkIGV4cG9ydF90eXBlc19mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHZvaWQgZXhwb3J0X3R5cGVzX3N0cmluZyhzdGQ6OnN0cmluZyBuYW1lLCBpbnQgbnVtKTsKLQotICAvKioKLSAgICogd3JpdGUgb3V0IGhlYWRlcnMgYW5kIGZvb3RlcnMgZm9yIGhybCBmaWxlcwotICAgKi8KLQotICB2b2lkIGhybF9oZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICB2b2lkIGhybF9mb290ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOwotCi0gIC8qKgotICAgKiBzdHVmZiB0byBzcGl0IG91dCBhdCB0aGUgdG9wIG9mIGdlbmVyYXRlZCBmaWxlcwotICAgKi8KLQotICBib29sIGV4cG9ydF9saW5lc19maXJzdF87Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBleHBvcnRfbGluZXNfOwotCi0gIGJvb2wgZXhwb3J0X3R5cGVzX2xpbmVzX2ZpcnN0XzsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGV4cG9ydF90eXBlc19saW5lc187Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLQotICBzdGQ6Om9zdHJpbmdzdHJlYW0gZl9pbmZvXzsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGZfaW5mb19leHRfOwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc19maWxlXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzX2hybF9maWxlXzsKLQotICBzdGQ6Om9mc3RyZWFtIGZfY29uc3RzXzsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGZfc2VydmljZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlX2ZpbGVfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV9ocmxfOwotCi19OwotCi0KLS8qKgotICogVUkgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgLy8gc2V0dXAgZXhwb3J0IGxpbmVzCi0gIGV4cG9ydF9saW5lc19maXJzdF8gPSB0cnVlOwotICBleHBvcnRfdHlwZXNfbGluZXNfZmlyc3RfID0gdHJ1ZTsKLQotICAvLyB0eXBlcyBmaWxlcwotICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyJfdHlwZXMuZXJsIjsKLSAgc3RyaW5nIGZfdHlwZXNfaHJsX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fbmFtZV8rIl90eXBlcy5ocmwiOwotCi0gIGZfdHlwZXNfZmlsZV8ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0gIGZfdHlwZXNfaHJsX2ZpbGVfLm9wZW4oZl90eXBlc19ocmxfbmFtZS5jX3N0cigpKTsKLQotICBocmxfaGVhZGVyKGZfdHlwZXNfaHJsX2ZpbGVfLCBwcm9ncmFtX25hbWVfICsgIl90eXBlcyIpOwotCi0gIGZfdHlwZXNfZmlsZV8gPDwKLSAgICBlcmxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgICItbW9kdWxlKCIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzKS4iIDw8IGVuZGwgPDwKLSAgICBlcmxfaW1wb3J0cygpIDw8IGVuZGw7Ci0KLSAgZl90eXBlc19maWxlXyA8PAotICAgICItaW5jbHVkZShcIiIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzLmhybFwiKS4iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGZfdHlwZXNfaHJsX2ZpbGVfIDw8IHJlbmRlcl9pbmNsdWRlcygpIDw8IGVuZGw7Ci0KLSAgLy8gY29uc3RzIGZpbGUKLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fbmFtZV8rIl9jb25zdGFudHMuaHJsIjsKLSAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICBmX2NvbnN0c18gPDwKLSAgICBlcmxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgIGVybF9pbXBvcnRzKCkgPDwgZW5kbCA8PAotICAgICItaW5jbHVkZShcIiIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzLmhybFwiKS4iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEJvaWxlcnBsYXRlIGF0IGJlZ2lubmluZyBhbmQgZW5kIG9mIGhlYWRlciBmaWxlcwotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6aHJsX2hlYWRlcihvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lKSB7Ci0gIG91dCA8PCAiLWlmbmRlZihfIiA8PCBuYW1lIDw8ICJfaW5jbHVkZWQpLiIgPDwgZW5kbCA8PAotICAgICItZGVmaW5lKF8iIDw8IG5hbWUgPDwgIl9pbmNsdWRlZCwgeWVhaCkuIiA8PCBlbmRsOwotfQotCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6aHJsX2Zvb3Rlcihvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lKSB7Ci0gICh2b2lkKSBuYW1lOwotICBvdXQgPDwgIi1lbmRpZi4iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQotICovCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIHJlc3VsdCArPSAiLWluY2x1ZGUoXCIiICsgdW5jYXBpdGFsaXplKGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpKSArICJfdHlwZXMuaHJsXCIpLlxuIjsKLSAgfQotICBpZiAoaW5jbHVkZXMuc2l6ZSgpID4gMCkgewotICAgIHJlc3VsdCArPSAiXG4iOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQXV0b2dlbidkIGNvbW1lbnQKLSAqLwotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6ZXJsX2F1dG9nZW5fY29tbWVudCgpIHsKLSAgcmV0dXJuCi0gICAgc3RkOjpzdHJpbmcoIiUlXG4iKSArCi0gICAgIiUlIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIiArCi0gICAgIiUlXG4iICsKLSAgICAiJSUgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCi0gICAgIiUlXG4iOwotfQotCi0vKioKLSAqIENvbW1lbnQgb3V0IHRleHQKLSAqLwotCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpjb21tZW50KHN0cmluZyBpbikKLXsKLSAgc2l6ZV90IHBvcyA9IDA7Ci0gIGluLmluc2VydChwb3MsICIlJSAiKTsKLSAgd2hpbGUgKCAocG9zID0gaW4uZmluZF9maXJzdF9vZignXG4nLCBwb3MpKSAhPSBzdHJpbmc6Om5wb3MgKQotICB7Ci0gICAgaW4uaW5zZXJ0KCsrcG9zLCAiJSUgIik7Ci0gIH0KLSAgcmV0dXJuIGluOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgaW1wb3J0cwotICovCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjplcmxfaW1wb3J0cygpIHsKLSAgcmV0dXJuICIiOwotfQotCi0vKioKLSAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcwotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotCi0gIGV4cG9ydF90eXBlc19zdHJpbmcoInN0cnVjdF9pbmZvIiwgMSk7Ci0gIGV4cG9ydF90eXBlc19zdHJpbmcoInN0cnVjdF9pbmZvX2V4dCIsIDEpOwotICBmX3R5cGVzX2ZpbGVfIDw8ICItZXhwb3J0KFsiIDw8IGV4cG9ydF90eXBlc19saW5lc18uc3RyKCkgPDwgIl0pLiIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZfdHlwZXNfZmlsZV8gPDwgZl9pbmZvXy5zdHIoKTsKLSAgZl90eXBlc19maWxlXyA8PCAic3RydWN0X2luZm8oJ2kgYW0gYSBkdW1teSBzdHJ1Y3QnKSAtPiB1bmRlZmluZWQuIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl90eXBlc19maWxlXyA8PCBmX2luZm9fZXh0Xy5zdHIoKTsKLSAgZl90eXBlc19maWxlXyA8PCAic3RydWN0X2luZm9fZXh0KCdpIGFtIGEgZHVtbXkgc3RydWN0JykgLT4gdW5kZWZpbmVkLiIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGhybF9mb290ZXIoZl90eXBlc19ocmxfZmlsZV8sIHN0cmluZygiQk9HVVMiKSk7Ci0KLSAgZl90eXBlc19maWxlXy5jbG9zZSgpOwotICBmX3R5cGVzX2hybF9maWxlXy5jbG9zZSgpOwotICBmX2NvbnN0c18uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBubyBvcAotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpIHR0eXBlZGVmOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQotICogdGhlIHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotCi0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICBpbmRlbnQoZl90eXBlc19ocmxfZmlsZV8pIDw8Ci0gICAgICAiLWRlZmluZSgiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl8iIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJfIiA8PCBuYW1lIDw8ICIsICIgPDwgdmFsdWUgPDwgIikuIjw8IGVuZGw7Ci0gIH0KLQotICBmX3R5cGVzX2hybF9maWxlXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSh0Y29uc3QtPmdldF9uYW1lKCkpOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7Ci0KLSAgZl9jb25zdHNfIDw8ICItZGVmaW5lKCIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiXyIgPDwgbmFtZSA8PCAiLCAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgIikuIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8ICIjIiA8PCB1bmNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSkgPDwgInsiOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIiwiOwotICAgICAgfQotICAgICAgb3V0IDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIG91dCA8PCAiID0gIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotCi0gICAgb3V0IDw8ICJkaWN0OmZyb21fbGlzdChbIjsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgaSwgZW5kID0gdmFsdWUtPmdldF9tYXAoKS5lbmQoKTsKLSAgICBmb3IgKGkgPSB2YWx1ZS0+Z2V0X21hcCgpLmJlZ2luKCk7IGkgIT0gZW5kOykgewotICAgICAgb3V0IDw8ICJ7IgotICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgaS0+Zmlyc3QpICA8PCAiLCIKLSAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIGktPnNlY29uZCkgPDwgIn0iOwotICAgICAgaWYgKCArK2kgIT0gZW5kICkgewotICAgICAgICBvdXQgPDwgIiwiOwotICAgICAgfQotICAgIH0KLSAgICBvdXQgPDwgIl0pIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIG91dCA8PCAic2V0czpmcm9tX2xpc3QoWyI7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgaSwgZW5kID0gdmFsdWUtPmdldF9saXN0KCkuZW5kKCk7Ci0gICAgZm9yKCBpID0gdmFsdWUtPmdldF9saXN0KCkuYmVnaW4oKTsgaSAhPSBlbmQ7ICkgewotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKmkpIDsKLSAgICAgIGlmICggKytpICE9IGVuZCApIHsKLSAgICAgICAgb3V0IDw8ICIsIjsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8ICJdKSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIG91dCA8PCAiWyI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdD1mYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICB9Ci0gICAgb3V0IDw8ICJdIjsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl9kZWZhdWx0X3ZhbHVlKHRfdHlwZSogdHlwZSkgewotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiIyIgKyB1bmNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSkgKyAie30iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJkaWN0Om5ldygpIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAic2V0czpuZXcoKSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJbXSI7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuICJ1bmRlZmluZWQiOwotICB9Ci19Ci0KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl9tZW1iZXJfdHlwZSh0X2ZpZWxkICogZmllbGQpIHsKLSAgdF90eXBlICogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJzdHJpbmcoKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJib29sZWFuKCkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiaW50ZWdlcigpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiZmxvYXQoKSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogdW5zdXBwb3J0ZWQgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gImludGVnZXIoKSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiIyIgKyB1bmNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSkgKyAie30iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJkaWN0KCkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJzZXQoKSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJsaXN0KCkiOwotICB9IGVsc2UgewotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogdW5zdXBwb3J0ZWQgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotfQotCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfbWVtYmVyX3JlcXVpcmVkbmVzcyh0X2ZpZWxkICogZmllbGQpIHsKLSAgICBzd2l0Y2goZmllbGQtPmdldF9yZXEoKSkgewotICAgICAgICBjYXNlIHRfZmllbGQ6OlRfUkVRVUlSRUQ6ICAgICAgIHJldHVybiAicmVxdWlyZWQiOwotICAgICAgICBjYXNlIHRfZmllbGQ6OlRfT1BUSU9OQUw6ICAgICAgIHJldHVybiAib3B0aW9uYWwiOwotICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidW5kZWZpbmVkIjsKLSAgICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfZXJsX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2VybF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gICh2b2lkKSBpc19leGNlcHRpb247Ci0gIGdlbmVyYXRlX2VybF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzX2hybF9maWxlXywgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2VybF9zdHJ1Y3RfaW5mbyhmX2luZm9fLCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZXJsX2V4dGVuZGVkX3N0cnVjdF9pbmZvKGZfaW5mb19leHRfLCB0c3RydWN0KTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpCi17Ci0gIGluZGVudChvdXQpIDw8ICIlJSBzdHJ1Y3QgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgZW5kbCA8PCBlbmRsOwotCi0gIHN0ZDo6c3RyaW5nc3RyZWFtIGJ1ZjsKLSAgYnVmIDw8IGluZGVudCgpIDw8ICItcmVjb3JkKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIsIHsiOwotICBzdHJpbmcgZmllbGRfaW5kZW50KGJ1Zi5zdHIoKS5zaXplKCksICcgJyk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTspIHsKLSAgICBnZW5lcmF0ZV9lcmxfc3RydWN0X21lbWJlcihidWYsICptX2l0ZXIpOwotICAgIGlmICggKyttX2l0ZXIgIT0gbWVtYmVycy5lbmQoKSApIHsKLSAgICAgIGJ1ZiA8PCAiLCAiIDw8IGVuZGwgPDwgZmllbGRfaW5kZW50OwotICAgIH0KLSAgfQotICBidWYgPDwgIn0pLiI7Ci0KLSAgb3V0IDw8IGJ1Zi5zdHIoKSA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWNvcmQgZmllbGQgZGVmaW5pdGlvbgotICovCi0KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfc3RydWN0X21lbWJlcihvc3RyZWFtICYgb3V0LCB0X2ZpZWxkICogdG1lbWJlcikKLXsKLSAgb3V0IDw8IHVuY2FwaXRhbGl6ZSh0bWVtYmVyLT5nZXRfbmFtZSgpKTsKLSAgb3V0IDw8ICIgPSAiICA8PCByZW5kZXJfbWVtYmVyX3ZhbHVlKHRtZW1iZXIpOwotICBvdXQgPDwgIiA6OiAiIDw8IHJlbmRlcl9tZW1iZXJfdHlwZSh0bWVtYmVyKTsKLX0KLQotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX21lbWJlcl92YWx1ZSh0X2ZpZWxkICogZmllbGQpIHsKLSAgaWYgKCFmaWVsZC0+Z2V0X3ZhbHVlKCkpIHsKLSAgICByZXR1cm4gcmVuZGVyX2RlZmF1bHRfdmFsdWUoZmllbGQtPmdldF90eXBlKCkpOwotICB9IGVsc2UgewotICAgIHJldHVybiByZW5kZXJfY29uc3RfdmFsdWUoZmllbGQtPmdldF90eXBlKCksIGZpZWxkLT5nZXRfdmFsdWUoKSk7Ci0gIH0KLX0KLQotCi0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9zdHJ1Y3RfaW5mbyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJzdHJ1Y3RfaW5mbygnIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIicpIC0+IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8IHJlbmRlcl90eXBlX3Rlcm0odHN0cnVjdCwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX2V4dGVuZGVkX3N0cnVjdF9pbmZvKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInN0cnVjdF9pbmZvX2V4dCgnIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIicpIC0+IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8IHJlbmRlcl90eXBlX3Rlcm0odHN0cnVjdCwgdHJ1ZSwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gc29tZWhvdyB0aGlzIHBvaW50IGlzIHJlYWNoZWQgYmVmb3JlIHRoZSBjb25zdHJ1Y3RvciBhbmQgaXQncyBub3QgZG93bmNhc2VkIHlldAotICAvLyAuLi5hd2Vzb21lCi0gIHNlcnZpY2VfbmFtZV9bMF0gPSB0b2xvd2VyKHNlcnZpY2VfbmFtZV9bMF0pOwotCi0gIHN0cmluZyBmX3NlcnZpY2VfaHJsX25hbWUgPSBnZXRfb3V0X2RpcigpK3NlcnZpY2VfbmFtZV8rIl90aHJpZnQuaHJsIjsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKStzZXJ2aWNlX25hbWVfKyJfdGhyaWZ0LmVybCI7Ci0gIGZfc2VydmljZV9maWxlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotICBmX3NlcnZpY2VfaHJsXy5vcGVuKGZfc2VydmljZV9ocmxfbmFtZS5jX3N0cigpKTsKLQotICAvLyBSZXNldCBzZXJ2aWNlIHRleHQgYWdncmVnYXRpbmcgc3RyZWFtIHN0cmVhbXMKLSAgZl9zZXJ2aWNlXy5zdHIoIiIpOwotICBleHBvcnRfbGluZXNfLnN0cigiIik7Ci0gIGV4cG9ydF9saW5lc19maXJzdF8gPSB0cnVlOwotCi0gIGhybF9oZWFkZXIoZl9zZXJ2aWNlX2hybF8sIHNlcnZpY2VfbmFtZV8pOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZl9zZXJ2aWNlX2hybF8gPDwgIi1pbmNsdWRlKFwiIiA8PAotICAgICAgdW5jYXBpdGFsaXplKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKSA8PCAiX3RocmlmdC5ocmxcIikuICUgaW5oZXJpdCAiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfaHJsXyA8PAotICAgICItaW5jbHVkZShcIiIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzLmhybFwiKS4iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQSFApCi0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7IC8vIGNwaXJvOiBOZXcgRXJsYW5nIE9yZGVyCi0KLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotCi0gIC8vIGluZGVudF9kb3duKCk7Ci0KLSAgZl9zZXJ2aWNlX2ZpbGVfIDw8Ci0gICAgZXJsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICAiLW1vZHVsZSgiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIl90aHJpZnQpLiIgPDwgZW5kbCA8PAotICAgICItYmVoYXZpb3VyKHRocmlmdF9zZXJ2aWNlKS4iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgIGVybF9pbXBvcnRzKCkgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfZmlsZV8gPDwgIi1pbmNsdWRlKFwiIiA8PCB1bmNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpIDw8ICJfdGhyaWZ0LmhybFwiKS4iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfZmlsZV8gPDwgIi1leHBvcnQoWyIgPDwgZXhwb3J0X2xpbmVzXy5zdHIoKSA8PCAiXSkuIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlX2ZpbGVfIDw8IGZfc2VydmljZV8uc3RyKCk7Ci0KLSAgaHJsX2Zvb3RlcihmX3NlcnZpY2VfaHJsXywgZl9zZXJ2aWNlX25hbWUpOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3NlcnZpY2VfZmlsZV8uY2xvc2UoKTsKLSAgZl9zZXJ2aWNlX2hybF8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAvLyAgIiUgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGV4cG9ydF9zdHJpbmcoInN0cnVjdF9pbmZvIiwgMSk7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9lcmxfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotICBmX3NlcnZpY2VfICAgIDw8ICJzdHJ1Y3RfaW5mbygnaSBhbSBhIGR1bW15IHN0cnVjdCcpIC0+IHVuZGVmaW5lZC4iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpIHRmdW5jdGlvbjsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotCi0gIGV4cG9ydF9zdHJpbmcoImZ1bmN0aW9uX2luZm8iLCAyKTsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZl9zZXJ2aWNlXyA8PCAiJSUlIGludGVyZmFjZSIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotCi0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faW5mbyh0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICAvLyBJbmhlcml0YW5jZSAtIHBhc3MgdW5rbm93biBmdW5jdGlvbnMgdG8gYmFzZSBjbGFzcwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBJbmZvVHlwZSkgLT4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCB1bmNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgIl90aHJpZnQ6ZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgSW5mb1R5cGUpLiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSB7Ci0gICAgICAvLyBVc2UgYSBzcGVjaWFsIHJldHVybiBjb2RlIGZvciBub25leGlzdGVudCBmdW5jdGlvbnMKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb25faW5mbyhfRnVuYywgX0luZm8pIC0+IG5vX2Z1bmN0aW9uLiIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb25faW5mbyhGdW5jdGlvbk5hbWUsIHBhcmFtc190eXBlKSBhbmQKLSAqIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb25OYW1lLCByZXBseV90eXBlKQotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faW5mbyh0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gICh2b2lkKSB0c2VydmljZTsKLSAgc3RyaW5nIG5hbWVfYXRvbSA9ICInIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICInIjsKLQotCi0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotCi0gIC8vIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIHBhcmFtc190eXBlKToKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgImZ1bmN0aW9uX2luZm8oIiA8PCBuYW1lX2F0b20gPDwgIiwgcGFyYW1zX3R5cGUpIC0+IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVuZGVyX3R5cGVfdGVybShhcmdfc3RydWN0LCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIC8vIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIHJlcGx5X3R5cGUpOgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAiZnVuY3Rpb25faW5mbygiIDw8IG5hbWVfYXRvbSA8PCAiLCByZXBseV90eXBlKSAtPiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgcmVuZGVyX3R5cGVfdGVybSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksIGZhbHNlKSA8PCAiOyIgPDwgZW5kbDsKLSAgZWxzZSBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9uZXdheV92b2lkOyIgPDwgZW5kbDsKLSAgZWxzZQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAie3N0cnVjdCwgW119IiA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICAvLyBmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBleGNlcHRpb25zKToKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgImZ1bmN0aW9uX2luZm8oIiA8PCBuYW1lX2F0b20gPDwgIiwgZXhjZXB0aW9ucykgLT4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVuZGVyX3R5cGVfdGVybSh4cywgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgcmV0dXJuCi0gICAgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsKLSAgICAiKFRoaXMiICsgIGNhcGl0YWxpemUoYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpKSArICIpIjsKLX0KLQotLyoqCi0gKiBBZGQgYSBmdW5jdGlvbiB0byB0aGUgZXhwb3J0cyBsaXN0Ci0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpleHBvcnRfc3RyaW5nKHN0cmluZyBuYW1lLCBpbnQgbnVtKSB7Ci0gIGlmIChleHBvcnRfbGluZXNfZmlyc3RfKSB7Ci0gICAgZXhwb3J0X2xpbmVzX2ZpcnN0XyA9IGZhbHNlOwotICB9IGVsc2UgewotICAgIGV4cG9ydF9saW5lc18gPDwgIiwgIjsKLSAgfQotICBleHBvcnRfbGluZXNfIDw8IG5hbWUgPDwgIi8iIDw8IG51bTsKLX0KLQotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF90eXBlc19mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLQotICBleHBvcnRfdHlwZXNfc3RyaW5nKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAxIC8vIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgICArICgodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKS0+Z2V0X21lbWJlcnMoKSkuc2l6ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgKTsKLX0KLQotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF90eXBlc19zdHJpbmcoc3RyaW5nIG5hbWUsIGludCBudW0pIHsKLSAgaWYgKGV4cG9ydF90eXBlc19saW5lc19maXJzdF8pIHsKLSAgICBleHBvcnRfdHlwZXNfbGluZXNfZmlyc3RfID0gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgZXhwb3J0X3R5cGVzX2xpbmVzXyA8PCAiLCAiOwotICB9Ci0gIGV4cG9ydF90eXBlc19saW5lc18gPDwgbmFtZSA8PCAiLyIgPDwgbnVtOwotfQotCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6ZXhwb3J0X2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotCi0gIGV4cG9ydF9zdHJpbmcocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgIDEgLy8gVGhpcwotICAgICAgICAgICAgICAgICsgKCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpLT5nZXRfbWVtYmVycygpKS5zaXplKCkKLSAgICAgICAgICAgICAgICApOwotfQotCi0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsgLy8gaW5pdGlhbCBjb21tYSB0byBjb21wZW5zYXRlIGZvciBpbml0aWFsIFRoaXMKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKLSAgc3RyaW5nIHByZWZpeCA9ICIiOwotICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOwotCi0gIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX3NlcnZpY2UoKSkgewotICAgIG5hbWUgPSB1bmNhcGl0YWxpemUodHR5cGUtPmdldF9uYW1lKCkpOwotICB9Ci0KLSAgcmV0dXJuIHByZWZpeCArIG5hbWU7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBFcmxhbmcgInR5cGUiIChtYWNybyBmb3IgaW50IGNvbnN0YW50cykKLSAqLwotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiP3RUeXBlX1NUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICI/dFR5cGVfQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICI/dFR5cGVfQllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIj90VHlwZV9JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICI/dFR5cGVfSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiP3RUeXBlX0k2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIj90VHlwZV9ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIj90VHlwZV9JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIj90VHlwZV9TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICI/dFR5cGVfTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiP3RUeXBlX1NFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICI/dFR5cGVfTElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhbiBFcmxhbmcgdGVybSB3aGljaCByZXByZXNlbnRzIGEgdGhyaWZ0IHR5cGUKLSAqLwotc3RkOjpzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfdHlwZV90ZXJtKHRfdHlwZSogdHlwZSwgYm9vbCBleHBhbmRfc3RydWN0cywgYm9vbCBleHRlbmRlZF9pbmZvKSB7Ci0gICAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gInN0cmluZyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJib29sIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gImJ5dGUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJpMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJpMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJpNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJkb3VibGUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gImkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGlmIChleHBhbmRfc3RydWN0cykgewotCi0gICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBidWY7Ci0gICAgICBidWYgPDwgIntzdHJ1Y3QsIFsiOwotCi0gICAgICB0X3N0cnVjdDo6bWVtYmVyc190eXBlIGNvbnN0JiBmaWVsZHMgPSBzdGF0aWNfY2FzdDx0X3N0cnVjdCo+KHR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgICAgdF9zdHJ1Y3Q6Om1lbWJlcnNfdHlwZTo6Y29uc3RfaXRlcmF0b3IgaSwgZW5kID0gZmllbGRzLmVuZCgpOwotICAgICAgZm9yKCBpID0gZmllbGRzLmJlZ2luKCk7IGkgIT0gZW5kOyApCi0gICAgICB7Ci0gICAgICAgIHRfc3RydWN0OjptZW1iZXJzX3R5cGU6OnZhbHVlX3R5cGUgbWVtYmVyID0gKmk7Ci0gICAgICAgIGludDMyX3Qga2V5ICA9IG1lbWJlci0+Z2V0X2tleSgpOwotICAgICAgICBzdHJpbmcgIHR5cGUgPSByZW5kZXJfdHlwZV90ZXJtKG1lbWJlci0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKTsgLy8gcmVjdXJzaXZlIGNhbGwKLQotICAgICAgICBpZiAoICFleHRlbmRlZF9pbmZvICkgewotICAgICAgICAgIC8vIENvbnZlcnQgdG8gZm9ybWF0OiB7c3RydWN0LCBbe0ZpZCwgVHlwZX18Li4uXX0KLSAgICAgICAgICBidWYgPDwgInsiIDw8IGtleSA8PCAiLCAiICA8PCB0eXBlIDw8ICJ9IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBDb252ZXJ0IHRvIGZvcm1hdDoge3N0cnVjdCwgW3tGaWQsIFJlcSwgVHlwZSwgTmFtZSwgRGVmfXwuLi5dfQotICAgICAgICAgIHN0cmluZyAgbmFtZSAgICAgICAgID0gdW5jYXBpdGFsaXplKG1lbWJlci0+Z2V0X25hbWUoKSk7Ci0gICAgICAgICAgc3RyaW5nICB2YWx1ZSAgICAgICAgPSByZW5kZXJfbWVtYmVyX3ZhbHVlKG1lbWJlcik7Ci0gICAgICAgICAgc3RyaW5nICByZXF1aXJlZG5lc3MgPSByZW5kZXJfbWVtYmVyX3JlcXVpcmVkbmVzcyhtZW1iZXIpOwotICAgICAgICAgIGJ1ZiA8PCAieyIgPDwga2V5IDw8ICIsICIgIDw8IHJlcXVpcmVkbmVzcyA8PCAiLCAiICA8PCB0eXBlIDw8ICIsICciIDw8IG5hbWUgPDwgIiciPDwgIiwgIiAgPDwgdmFsdWUgPDwgIn0iOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCArK2kgIT0gZW5kICkgewotICAgICAgICAgIGJ1ZiA8PCAiLCAiOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGJ1ZiA8PCAiXX0iIDw8IGVuZGw7Ci0gICAgICByZXR1cm4gYnVmLnN0cigpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gIntzdHJ1Y3QsIHsnIiArIHR5cGVfbW9kdWxlKHR5cGUpICsgIicsICciICsgdHlwZV9uYW1lKHR5cGUpICsgIid9fSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgLy8ge21hcCwgS2V5VHlwZSwgVmFsVHlwZX0KLSAgICB0X3R5cGUgKmtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSAqdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0KLSAgICByZXR1cm4gInttYXAsICIgKyByZW5kZXJfdHlwZV90ZXJtKGtleV90eXBlLCBmYWxzZSkgKyAiLCAiICsKLSAgICAgIHJlbmRlcl90eXBlX3Rlcm0odmFsX3R5cGUsIGZhbHNlKSArICJ9IjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlICplbGVtX3R5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotCi0gICAgcmV0dXJuICJ7c2V0LCAiICsgcmVuZGVyX3R5cGVfdGVybShlbGVtX3R5cGUsIGZhbHNlKSArICJ9IjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSAqZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0KLSAgICByZXR1cm4gIntsaXN0LCAiICsgcmVuZGVyX3R5cGVfdGVybShlbGVtX3R5cGUsIGZhbHNlKSArICJ9IjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotc3RkOjpzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjp0eXBlX21vZHVsZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIHJldHVybiB1bmNhcGl0YWxpemUodHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpICsgIl90eXBlcyI7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoZXJsLCAiRXJsYW5nIiwgIiIpCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTE5MjljLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLS8qKgotICogVG9wIGxldmVsIHByb2dyYW0gZ2VuZXJhdGlvbiBmdW5jdGlvbi4gQ2FsbHMgdGhlIGdlbmVyYXRvciBzdWJjbGFzcyBtZXRob2RzCi0gKiBmb3IgcHJlcGFyaW5nIGZpbGUgc3RyZWFtcyBldGMuIHRoZW4gaXRlcmF0ZXMgb3ZlciBhbGwgdGhlIHBhcnRzIG9mIHRoZQotICogcHJvZ3JhbSB0byBwZXJmb3JtIHRoZSBjb3JyZWN0IGFjdGlvbnMuCi0gKgotICogQHBhcmFtIHByb2dyYW0gVGhlIHRocmlmdCBwcm9ncmFtIHRvIGNvbXBpbGUgaW50byBDKysgc291cmNlCi0gKi8KLXZvaWQgdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW0oKSB7Ci0gIC8vIEluaXRpYWxpemUgdGhlIGdlbmVyYXRvcgotICBpbml0X2dlbmVyYXRvcigpOwotCi0gIC8vIEdlbmVyYXRlIGVudW1zCi0gIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKLSAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOwotICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHR5cGVkZWZzCi0gIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKTsKLSAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOwotICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV90eXBlZGVmKCp0ZF9pdGVyKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNvbnN0YW50cwotICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHByb2dyYW1fLT5nZXRfY29uc3RzKCk7Ci0gIGdlbmVyYXRlX2NvbnN0cyhjb25zdHMpOwotCi0gIC8vIEdlbmVyYXRlIHN0cnVjdHMsIGV4Y2VwdGlvbnMsIGFuZCB1bmlvbnMgaW4gZGVjbGFyZWQgb3JkZXIKLSAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IHByb2dyYW1fLT5nZXRfb2JqZWN0cygpOwotICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOwotICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7Ci0gICAgaWYgKCgqb19pdGVyKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgZ2VuZXJhdGVfeGNlcHRpb24oKm9faXRlcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdlbmVyYXRlX3N0cnVjdCgqb19pdGVyKTsKLSAgICB9Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBzZXJ2aWNlcwotICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7Ci0gIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKLSAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7Ci0gICAgc2VydmljZV9uYW1lXyA9IGdldF9zZXJ2aWNlX25hbWUoKnN2X2l0ZXIpOwotICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOwotICB9Ci0KLSAgLy8gQ2xvc2UgdGhlIGdlbmVyYXRvcgotICBjbG9zZV9nZW5lcmF0b3IoKTsKLX0KLQotc3RyaW5nIHRfZ2VuZXJhdG9yOjplc2NhcGVfc3RyaW5nKGNvbnN0IHN0cmluZyAmaW4pIGNvbnN0IHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBmb3IgKHN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXQgPSBpbi5iZWdpbigpOyBpdCA8IGluLmVuZCgpOyBpdCsrKSB7Ci0gICAgc3RkOjptYXA8Y2hhciwgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciByZXMgPSBlc2NhcGVfLmZpbmQoKml0KTsKLSAgICBpZiAocmVzICE9IGVzY2FwZV8uZW5kKCkpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQocmVzLT5zZWNvbmQpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQucHVzaF9iYWNrKCppdCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfY29uc3QoKmNfaXRlcik7Ci0gIH0KLX0KLQotdm9pZCB0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY29tbWVudF9zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbGluZV9wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjb21tZW50X2VuZCkgewotICBpZiAoY29tbWVudF9zdGFydCAhPSAiIikgaW5kZW50KG91dCkgPDwgY29tbWVudF9zdGFydDsKLSAgc3RyaW5nc3RyZWFtIGRvY3MoY29udGVudHMsIGlvc19iYXNlOjppbik7Ci0gIHdoaWxlICghZG9jcy5lb2YoKSkgewotICAgIGNoYXIgbGluZVsxMDI0XTsKLSAgICBkb2NzLmdldGxpbmUobGluZSwgMTAyNCk7Ci0KLSAgICAvLyBKdXN0IHBybnQgYSBuZXdsaW5lIHdoZW4gdGhlIGxpbmUgJiBwcmVmaXggYXJlIGVtcHR5LgotICAgIGlmIChzdHJsZW4obGluZSkgPT0gMCAmJiBsaW5lX3ByZWZpeCA9PSAiIiAmJiAhZG9jcy5lb2YoKSkgewotICAgICAgICBvdXQgPDwgc3RkOjplbmRsOwotICAgIH0gZWxzZSBpZiAoc3RybGVuKGxpbmUpID4gMCB8fCAhZG9jcy5lb2YoKSkgeyAgLy8gc2tpcCB0aGUgZW1wdHkgbGFzdCBsaW5lCi0gICAgICBpbmRlbnQob3V0KSA8PCBsaW5lX3ByZWZpeCA8PCBsaW5lIDw8IHN0ZDo6ZW5kbDsKLSAgICB9Ci0gIH0KLSAgaWYgKGNvbW1lbnRfZW5kICE9ICIiKSBpbmRlbnQob3V0KSA8PCBjb21tZW50X2VuZDsKLX0KLQotCi12b2lkIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpyZWdpc3Rlcl9nZW5lcmF0b3IodF9nZW5lcmF0b3JfZmFjdG9yeSogZmFjdG9yeSkgewotICBnZW5fbWFwX3QmIHRoZV9tYXAgPSBnZXRfZ2VuZXJhdG9yX21hcCgpOwotICBpZiAodGhlX21hcC5maW5kKGZhY3RvcnktPmdldF9zaG9ydF9uYW1lKCkpICE9IHRoZV9tYXAuZW5kKCkpIHsKLSAgICBmYWlsdXJlKCJEdXBsaWNhdGUgZ2VuZXJhdG9ycyBmb3IgbGFuZ3VhZ2UgXCIlc1wiIVxuIiwgZmFjdG9yeS0+Z2V0X3Nob3J0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotICB0aGVfbWFwW2ZhY3RvcnktPmdldF9zaG9ydF9uYW1lKCldID0gZmFjdG9yeTsKLX0KLQotdF9nZW5lcmF0b3IqIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbnMpIHsKLSAgc3RyaW5nOjpzaXplX3R5cGUgY29sb24gPSBvcHRpb25zLmZpbmQoJzonKTsKLSAgc3RyaW5nIGxhbmd1YWdlID0gb3B0aW9ucy5zdWJzdHIoMCwgY29sb24pOwotCi0gIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnM7Ci0gIGlmIChjb2xvbiAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBjb2xvbisxOwotICAgIHdoaWxlIChwb3MgIT0gc3RyaW5nOjpucG9zICYmIHBvcyA8IG9wdGlvbnMuc2l6ZSgpKSB7Ci0gICAgICBzdHJpbmc6OnNpemVfdHlwZSBuZXh0X3BvcyA9IG9wdGlvbnMuZmluZCgnLCcsIHBvcyk7Ci0gICAgICBzdHJpbmcgb3B0aW9uID0gb3B0aW9ucy5zdWJzdHIocG9zLCBuZXh0X3Bvcy1wb3MpOwotICAgICAgcG9zID0gKChuZXh0X3BvcyA9PSBzdHJpbmc6Om5wb3MpID8gbmV4dF9wb3MgOiBuZXh0X3BvcysxKTsKLQotICAgICAgc3RyaW5nOjpzaXplX3R5cGUgc2VwYXJhdG9yID0gb3B0aW9uLmZpbmQoJz0nKTsKLSAgICAgIHN0cmluZyBrZXksIHZhbHVlOwotICAgICAgaWYgKHNlcGFyYXRvciA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAga2V5ID0gb3B0aW9uOwotICAgICAgICB2YWx1ZSA9ICIiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAga2V5ID0gb3B0aW9uLnN1YnN0cigwLCBzZXBhcmF0b3IpOwotICAgICAgICB2YWx1ZSA9IG9wdGlvbi5zdWJzdHIoc2VwYXJhdG9yKzEpOwotICAgICAgfQotCi0gICAgICBwYXJzZWRfb3B0aW9uc1trZXldID0gdmFsdWU7Ci0gICAgfQotICB9Ci0KLSAgZ2VuX21hcF90JiB0aGVfbWFwID0gZ2V0X2dlbmVyYXRvcl9tYXAoKTsKLSAgZ2VuX21hcF90OjppdGVyYXRvciBpdGVyID0gdGhlX21hcC5maW5kKGxhbmd1YWdlKTsKLQotICBpZiAoaXRlciA9PSB0aGVfbWFwLmVuZCgpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICByZXR1cm4gaXRlci0+c2Vjb25kLT5nZXRfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25zKTsKLX0KLQotdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdCYgdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3JfbWFwKCkgewotICAvLyBodHRwOi8vd3d3LnBhcmFzaGlmdC5jb20vYysrLWZhcS1saXRlL2N0b3JzLmh0bWwjZmFxLTEwLjEyCi0gIHN0YXRpYyBnZW5fbWFwX3QqIHRoZV9tYXAgPSBuZXcgZ2VuX21hcF90KCk7Ci0gIHJldHVybiAqdGhlX21hcDsKLX0KLQotdF9nZW5lcmF0b3JfZmFjdG9yeTo6dF9nZW5lcmF0b3JfZmFjdG9yeSgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2hvcnRfbmFtZSwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgbG9uZ19uYW1lLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2N1bWVudGF0aW9uKQotICA6IHNob3J0X25hbWVfKHNob3J0X25hbWUpCi0gICwgbG9uZ19uYW1lXyhsb25nX25hbWUpCi0gICwgZG9jdW1lbnRhdGlvbl8oZG9jdW1lbnRhdGlvbikKLXsKLSAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6OnJlZ2lzdGVyX2dlbmVyYXRvcih0aGlzKTsKLX0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRhYzg0MC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfR0VORVJBVE9SX0gKLSNkZWZpbmUgVF9HRU5FUkFUT1JfSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJwYXJzZS90X3Byb2dyYW0uaCIKLSNpbmNsdWRlICJnbG9iYWxzLmgiCi0jaW5jbHVkZSAidF9nZW5lcmF0b3JfcmVnaXN0cnkuaCIKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBhIHRocmlmdCBjb2RlIGdlbmVyYXRvci4gVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBiYXNpYwotICogcm91dGluZXMgZm9yIGNvZGUgZ2VuZXJhdGlvbiBhbmQgY29udGFpbnMgdGhlIHRvcCBsZXZlbCBtZXRob2QgdGhhdAotICogZGlzcGF0Y2hlcyBjb2RlIGdlbmVyYXRpb24gYWNyb3NzIHZhcmlvdXMgY29tcG9uZW50cy4KLSAqCi0gKi8KLWNsYXNzIHRfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSkgewotICAgIHRtcF8gPSAwOwotICAgIGluZGVudF8gPSAwOwotICAgIHByb2dyYW1fID0gcHJvZ3JhbTsKLSAgICBwcm9ncmFtX25hbWVfID0gZ2V0X3Byb2dyYW1fbmFtZShwcm9ncmFtKTsKLSAgICBlc2NhcGVfWydcbiddID0gIlxcbiI7Ci0gICAgZXNjYXBlX1snXHInXSA9ICJcXHIiOwotICAgIGVzY2FwZV9bJ1x0J10gPSAiXFx0IjsKLSAgICBlc2NhcGVfWyciJ10gID0gIlxcXCIiOwotICAgIGVzY2FwZV9bJ1xcJ10gPSAiXFxcXCI7Ci0gIH0KLQotICB2aXJ0dWFsIH50X2dlbmVyYXRvcigpIHt9Ci0KLSAgLyoqCi0gICAqIEZyYW1ld29yayBnZW5lcmF0b3IgbWV0aG9kIHRoYXQgaXRlcmF0ZXMgb3ZlciBhbGwgdGhlIHBhcnRzIG9mIGEgcHJvZ3JhbQotICAgKiBhbmQgcGVyZm9ybXMgZ2VuZXJhbCBhY3Rpb25zLiBUaGlzIGlzIGltcGxlbWVudGVkIGJ5IHRoZSBiYXNlIGNsYXNzIGFuZAotICAgKiBzaG91bGQgbm90IG5vcm1hbGx5IGJlIG92ZXJ3cml0dGVuIGluIHRoZSBzdWJjbGFzc2VzLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3Byb2dyYW0oKTsKLQotICBjb25zdCB0X3Byb2dyYW0qIGdldF9wcm9ncmFtKCkgY29uc3QgeyByZXR1cm4gcHJvZ3JhbV87IH0KLQotICB2b2lkIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29tbWVudF9zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGluZV9wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb21tZW50X2VuZCk7Ci0KLSAgLyoqCi0gICAqIGNoZWNrIHdoZXRoZXIgc3ViLW5hbWVzcGFjZSBkZWNsYXJhY3Rpb24gaXMgdXNlZCBieSBnZW5lcmF0b3IuCi0gICAqIGUuZy4gYWxsb3cKLSAgICogbmFtZXNwYWNlIHB5LnR3aXN0ZWQgYmFyCi0gICAqIHRvIHNwZWNpZnkgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIC1nZW4gcHk6dHdpc3RlZCBpcyBzcGVjaWZpZWQuCi0gICAqIFdpbGwgYmUgY2FsbGVkIHdpdGggc3VibmFtZXNwYWNlLCBpLmUuIGlzX3ZhbGlkX25hbWVzcGFjZSgidHdpc3RlZCIpCi0gICAqIHdpbGwgYmUgY2FsbGVkIGZvciB0aGUgYWJvdmUgZXhhbXBsZS4KLSAgICovCi0gIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgewotICAgICh2b2lkKSBzdWJfbmFtZXNwYWNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBFc2NhcGUgc3RyaW5nIHRvIHVzZSBvbmUgaW4gZ2VuZXJhdGVkIHNvdXJjZXMuCi0gICAqLwotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGVzY2FwZV9zdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJmluKSBjb25zdDsKLQotICBzdGQ6OnN0cmluZyBnZXRfZXNjYXBlZF9zdHJpbmcodF9jb25zdF92YWx1ZSogY29uc3R2YWwpIHsKLSAgICByZXR1cm4gZXNjYXBlX3N0cmluZyhjb25zdHZhbC0+Z2V0X3N0cmluZygpKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotCi0gIC8qKgotICAgKiBPcHRpb25hbCBtZXRob2RzIHRoYXQgbWF5IGJlIGltbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byB0YWtlIG5lY2Vzc2FyeQotICAgKiBzdGVwcyBhdCB0aGUgYmVnaW5uaW5nIG9yIGVuZCBvZiBjb2RlIGdlbmVyYXRpb24uCi0gICAqLwotCi0gIHZpcnR1YWwgdm9pZCBpbml0X2dlbmVyYXRvcigpIHt9Ci0gIHZpcnR1YWwgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKSB7fQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0KLSAgLyoqCi0gICAqIFB1cmUgdmlydHVhbCBtZXRob2RzIGltcGxlbWVudGVkIGJ5IHRoZSBnZW5lcmF0b3Igc3ViY2xhc3Nlcy4KLSAgICovCi0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgICh0X3R5cGVkZWYqICB0dHlwZWRlZikgID0gMDsKLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2VudW0gICAgICh0X2VudW0qICAgICB0ZW51bSkgICAgID0gMDsKLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2NvbnN0ICAgICh0X2NvbnN0KiAgICB0Y29uc3QpIHsKLSAgICAodm9pZCkgdGNvbnN0OwotICB9Ci0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICAodF9zdHJ1Y3QqICAgdHN0cnVjdCkgICA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpICA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbiAodF9zdHJ1Y3QqICAgdHhjZXB0aW9uKSB7Ci0gICAgLy8gQnkgZGVmYXVsdCBleGNlcHRpb25zIGFyZSB0aGUgc2FtZSBhcyBzdHJ1Y3RzCi0gICAgZ2VuZXJhdGVfc3RydWN0KHR4Y2VwdGlvbik7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIHRvIGdldCB0aGUgcHJvZ3JhbSBuYW1lLCBtYXkgYmUgb3ZlcnJpZGRlbgotICAgKi8KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfcHJvZ3JhbV9uYW1lKHRfcHJvZ3JhbSogdHByb2dyYW0pIHsKLSAgICByZXR1cm4gdHByb2dyYW0tPmdldF9uYW1lKCk7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIHRvIGdldCB0aGUgc2VydmljZSBuYW1lLCBtYXkgYmUgb3ZlcnJpZGRlbgotICAgKi8KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfc2VydmljZV9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgICByZXR1cm4gdHNlcnZpY2UtPmdldF9uYW1lKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjdXJyZW50IG91dHB1dCBkaXJlY3RvcnkKLSAgICovCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X291dF9kaXIoKSBjb25zdCB7Ci0gICAgaWYgKHByb2dyYW1fLT5pc19vdXRfcGF0aF9hYnNvbHV0ZSgpKSB7Ci0gICAgICByZXR1cm4gcHJvZ3JhbV8tPmdldF9vdXRfcGF0aCgpICsgIi8iOwotICAgIH0KLQotICAgIHJldHVybiBwcm9ncmFtXy0+Z2V0X291dF9wYXRoKCkgKyBvdXRfZGlyX2Jhc2VfICsgIi8iOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSB1bmlxdWUgdGVtcG9yYXJ5IHZhcmlhYmxlIG5hbWUsIHdoaWNoIGlzIGp1c3QgIm5hbWUiIHdpdGggYQotICAgKiBudW1iZXIgYXBwZW5kZWQgdG8gaXQgKGkuZS4gbmFtZTM1KQotICAgKi8KLSAgc3RkOjpzdHJpbmcgdG1wKHN0ZDo6c3RyaW5nIG5hbWUpIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICAgIG91dCA8PCBuYW1lIDw8IHRtcF8rKzsKLSAgICByZXR1cm4gb3V0LnN0cigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluZGVudGF0aW9uIGxldmVsIG1vZGlmaWVycwotICAgKi8KLQotICB2b2lkIGluZGVudF91cCgpewotICAgICsraW5kZW50XzsKLSAgfQotCi0gIHZvaWQgaW5kZW50X2Rvd24oKSB7Ci0gICAgLS1pbmRlbnRfOwotICB9Ci0KLSAgLyoqCi0gICAqIEluZGVudGF0aW9uIHByaW50IGZ1bmN0aW9uCi0gICAqLwotICBzdGQ6OnN0cmluZyBpbmRlbnQoKSB7Ci0gICAgc3RkOjpzdHJpbmcgaW5kID0gIiI7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGluZGVudF87ICsraSkgewotICAgICAgaW5kICs9ICIgICI7Ci0gICAgfQotICAgIHJldHVybiBpbmQ7Ci0gIH0KLQotICAvKioKLSAgICogSW5kZW50YXRpb24gdXRpbGl0eSB3cmFwcGVyCi0gICAqLwotICBzdGQ6Om9zdHJlYW0mIGluZGVudChzdGQ6Om9zdHJlYW0gJm9zKSB7Ci0gICAgcmV0dXJuIG9zIDw8IGluZGVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENhcGl0YWxpemF0aW9uIGhlbHBlcnMKLSAgICovCi0gIHN0ZDo6c3RyaW5nIGNhcGl0YWxpemUoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBpblswXSA9IHRvdXBwZXIoaW5bMF0pOwotICAgIHJldHVybiBpbjsKLSAgfQotICBzdGQ6OnN0cmluZyBkZWNhcGl0YWxpemUoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBpblswXSA9IHRvbG93ZXIoaW5bMF0pOwotICAgIHJldHVybiBpbjsKLSAgfQotICBzdGQ6OnN0cmluZyBsb3dlcmNhc2Uoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluLnNpemUoKTsgKytpKSB7Ci0gICAgICBpbltpXSA9IHRvbG93ZXIoaW5baV0pOwotICAgIH0KLSAgICByZXR1cm4gaW47Ci0gIH0KLSAgLyoqCi0gICAqIFRyYW5zZm9ybXMgYSBjYW1lbCBjYXNlIHN0cmluZyB0byBhbiBlcXVpdmFsZW50IG9uZSBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMKLSAgICogZS5nLiBhTXVsdGlXb3JkIC0+IGFfbXVsdGlfd29yZAotICAgKiAgICAgIHNvbWVOYW1lICAgLT4gc29tZV9uYW1lCi0gICAqICAgICAgQ2FtZWxDYXNlICAtPiBjYW1lbF9jYXNlCi0gICAqICAgICAgbmFtZSAgICAgICAtPiBuYW1lCi0gICAqICAgICAgTmFtZSAgICAgICAtPiBuYW1lCi0gICAqLwotICBzdGQ6OnN0cmluZyB1bmRlcnNjb3JlKHN0ZDo6c3RyaW5nIGluKSB7Ci0gICAgaW5bMF0gPSB0b2xvd2VyKGluWzBdKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IGluLnNpemUoKTsgKytpKSB7Ci0gICAgICBpZiAoaXN1cHBlcihpbltpXSkpIHsKLSAgICAgICAgaW5baV0gPSB0b2xvd2VyKGluW2ldKTsKLSAgICAgICAgaW4uaW5zZXJ0KGksICJfIik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbjsKLSAgfQotICAvKioKLSAgICAqIFRyYW5zZm9ybXMgYSBzdHJpbmcgd2l0aCB3b3JkcyBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMgdG8gYSBjYW1lbCBjYXNlIGVxdWl2YWxlbnQKLSAgICAqIGUuZy4gYV9tdWx0aV93b3JkIC0+IGFNdWx0aVdvcmQKLSAgICAqICAgICAgc29tZV9uYW1lICAgIC0+ICBzb21lTmFtZQotICAgICogICAgICBuYW1lICAgICAgICAgLT4gIG5hbWUKLSAgICAqLwotICBzdGQ6OnN0cmluZyBjYW1lbGNhc2Uoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICAgIGJvb2wgdW5kZXJzY29yZSA9IGZhbHNlOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbi5zaXplKCk7IGkrKykgewotICAgICAgaWYgKGluW2ldID09ICdfJykgewotICAgICAgICB1bmRlcnNjb3JlID0gdHJ1ZTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAodW5kZXJzY29yZSkgewotICAgICAgICBvdXQgPDwgKGNoYXIpIHRvdXBwZXIoaW5baV0pOwotICAgICAgICB1bmRlcnNjb3JlID0gZmFsc2U7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgb3V0IDw8IGluW2ldOwotICAgIH0KLQotICAgIHJldHVybiBvdXQuc3RyKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB0cnVlIHR5cGUgYmVoaW5kIGEgc2VyaWVzIG9mIHR5cGVkZWZzLgotICAgKi8KLSAgc3RhdGljIHRfdHlwZSogZ2V0X3RydWVfdHlwZSh0X3R5cGUqIHR5cGUpIHsKLSAgICByZXR1cm4gdHlwZS0+Z2V0X3RydWVfdHlwZSgpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8qKgotICAgKiBUaGUgcHJvZ3JhbSBiZWluZyBnZW5lcmF0ZWQKLSAgICovCi0gIHRfcHJvZ3JhbSogcHJvZ3JhbV87Ci0KLSAgLyoqCi0gICAqIFF1aWNrIGFjY2Vzc29yIGZvciBmb3JtYXR0ZWQgcHJvZ3JhbSBuYW1lIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nCi0gICAqIGdlbmVyYXRlZC4KLSAgICovCi0gIHN0ZDo6c3RyaW5nIHByb2dyYW1fbmFtZV87Ci0KLSAgLyoqCi0gICAqIFF1aWNrIGFjY2Vzc29yIGZvciBmb3JtYXR0ZWQgc2VydmljZSBuYW1lIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nCi0gICAqIGdlbmVyYXRlZC4KLSAgICovCi0gIHN0ZDo6c3RyaW5nIHNlcnZpY2VfbmFtZV87Ci0KLSAgLyoqCi0gICAqIE91dHB1dCB0eXBlLXNwZWNpZmMgZGlyZWN0b3J5IG5hbWUgKCJnZW4tKiIpCi0gICAqLwotICBzdGQ6OnN0cmluZyBvdXRfZGlyX2Jhc2VfOwotCi0gIC8qKgotICAgKiBNYXAgb2YgY2hhcmFjdGVycyB0byBlc2NhcGUgaW4gc3RyaW5nIGxpdGVyYWxzLgotICAgKi8KLSAgc3RkOjptYXA8Y2hhciwgc3RkOjpzdHJpbmc+IGVzY2FwZV87Ci0KLSBwcml2YXRlOgotICAvKioKLSAgICogQ3VycmVudCBjb2RlIGluZGVudGF0aW9uIGxldmVsCi0gICAqLwotICBpbnQgaW5kZW50XzsKLQotICAvKioKLSAgICogVGVtcG9yYXJ5IHZhcmlhYmxlIGNvdW50ZXIsIGZvciBtYWtpbmcgdW5pcXVlIHZhcmlhYmxlIG5hbWVzCi0gICAqLwotICBpbnQgdG1wXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDEwZTk0Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9HRU5FUkFUT1JfUkVHSVNUUllfSAotI2RlZmluZSBUX0dFTkVSQVRPUl9SRUdJU1RSWV9ICi0KLWNsYXNzIHRfZ2VuZXJhdG9yOwotCi0vKioKLSAqIEEgZmFjdG9yeSBmb3IgcHJvZHVjaW5nIGdlbmVyYXRvciBjbGFzc2VzIG9mIGEgcGFydGljdWxhciBsYW5ndWFnZS4KLSAqCi0gKiBUaGlzIGNsYXNzIGlzIGFsc28gcmVzcG9uc2libGUgZm9yOgotICogIC0gUmVnaXN0ZXJpbmcgaXRzZWxmIHdpdGggdGhlIGdlbmVyYXRvciByZWdpc3RyeS4KLSAqICAtIFByb3ZpZGluZyBkb2N1bWVudGF0aW9uIGZvciB0aGUgZ2VuZXJhdG9ycyBpdCBwcm9kdWNlcy4KLSAqLwotY2xhc3MgdF9nZW5lcmF0b3JfZmFjdG9yeSB7Ci0gcHVibGljOgotICB0X2dlbmVyYXRvcl9mYWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzaG9ydF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb25nX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRvY3VtZW50YXRpb24pOwotCi0gIHZpcnR1YWwgfnRfZ2VuZXJhdG9yX2ZhY3RvcnkoKSB7fQotCi0gIHZpcnR1YWwgdF9nZW5lcmF0b3IqIGdldF9nZW5lcmF0b3IoCi0gICAgICAvLyBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZS4KLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIC8vIE5vdGU6IHBhcnNlZF9vcHRpb25zIHdpbGwgbm90IGV4aXN0IGJleW9uZCB0aGUgY2FsbCB0byBnZXRfZ2VuZXJhdG9yLgotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAvLyBOb3RlOiBvcHRpb25fc3RyaW5nIG1pZ2h0IG5vdCBleGlzdCBiZXlvbmQgdGhlIGNhbGwgdG8gZ2V0X2dlbmVyYXRvci4KLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgID0gMDsKLQotICB2aXJ0dWFsIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSA9IDA7Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X3Nob3J0X25hbWUoKSB7IHJldHVybiBzaG9ydF9uYW1lXzsgfQotICBzdGQ6OnN0cmluZyBnZXRfbG9uZ19uYW1lKCkgeyByZXR1cm4gbG9uZ19uYW1lXzsgfQotICBzdGQ6OnN0cmluZyBnZXRfZG9jdW1lbnRhdGlvbigpIHsgcmV0dXJuIGRvY3VtZW50YXRpb25fOyB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyBzaG9ydF9uYW1lXzsKLSAgc3RkOjpzdHJpbmcgbG9uZ19uYW1lXzsKLSAgc3RkOjpzdHJpbmcgZG9jdW1lbnRhdGlvbl87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgZ2VuZXJhdG9yPgotY2xhc3MgdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsIDogcHVibGljIHRfZ2VuZXJhdG9yX2ZhY3RvcnkgewotIHB1YmxpYzoKLSAgdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsKGNvbnN0IHN0ZDo6c3RyaW5nJiBzaG9ydF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxvbmdfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2N1bWVudGF0aW9uKQotICAgIDogdF9nZW5lcmF0b3JfZmFjdG9yeShzaG9ydF9uYW1lLCBsb25nX25hbWUsIGRvY3VtZW50YXRpb24pCi0gIHt9Ci0KLSAgdmlydHVhbCB0X2dlbmVyYXRvciogZ2V0X2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpIHsKLSAgICByZXR1cm4gbmV3IGdlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSB7Ci0gICAgcmV0dXJuIGdlbmVyYXRvcjo6aXNfdmFsaWRfbmFtZXNwYWNlKHN1Yl9uYW1lc3BhY2UpOwotICB9Ci19OwotCi1jbGFzcyB0X2dlbmVyYXRvcl9yZWdpc3RyeSB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCByZWdpc3Rlcl9nZW5lcmF0b3IodF9nZW5lcmF0b3JfZmFjdG9yeSogZmFjdG9yeSk7Ci0KLSAgc3RhdGljIHRfZ2VuZXJhdG9yKiBnZXRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25zKTsKLQotICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2dlbmVyYXRvcl9mYWN0b3J5Kj4gZ2VuX21hcF90OwotICBzdGF0aWMgZ2VuX21hcF90JiBnZXRfZ2VuZXJhdG9yX21hcCgpOwotCi0gcHJpdmF0ZToKLSAgdF9nZW5lcmF0b3JfcmVnaXN0cnkoKTsKLSAgdF9nZW5lcmF0b3JfcmVnaXN0cnkoY29uc3QgdF9nZW5lcmF0b3JfcmVnaXN0cnkmKTsKLX07Ci0KLSNkZWZpbmUgVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihsYW5ndWFnZSwgbG9uZ19uYW1lLCBkb2MpICAgICAgICBcCi0gIGNsYXNzIHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwgICAgICAgICAgICAgICAgICAgICAgXAotICAgIDogcHVibGljIHRfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbDx0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3I+ICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwoKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIDogdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsPHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcj4oICAgICAgICBcCi0gICAgICAgICAgI2xhbmd1YWdlLCBsb25nX25hbWUsIGRvYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHt9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyB0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3JfZmFjdG9yeV9pbXBsIF9yZWdpc3RlcmVyOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nb19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ29fZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YjJlZmM4Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nb19nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMDg4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb2dvcmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb2dvIG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIEdvIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9nb19nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9nb19nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgICh2b2lkKSBwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWdvIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAodF9jb25zdCogICAgdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLQotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgY29uc3Qgc3RyaW5nJiBuYW1lKTsKLQotICAvKioKLSAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb249ZmFsc2UsIGJvb2wgaXNfcmVzdWx0PWZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9nb19zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLCBib29sIGlzX3Jlc3VsdD1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ29fc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwgYm9vbCBpc19yZXN1bHQ9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2dvX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIGRlY2xhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBlcnI9ImVyciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3M9ZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvZXJjZURhdGE9ZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0ICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgZGVjbGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGVycj0iZXJyIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgZGVjbGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGVycj0iZXJyIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICBkZWNsYXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZXJyPSJlcnIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIGRlY2xhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBlcnI9ImVyciIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIGRlY2xhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBlcnI9ImVyciIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBlcnI9ImVyciIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZXJyPSJlcnIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBlcnI9ImVyciIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGVycj0iZXJyIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZXJyPSJlcnIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZXJyPSJlcnIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2dvX2RvY3N0cmluZyAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9nb19kb2NzdHJpbmcgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX2dvX2RvY3N0cmluZyAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogICAgdGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3ViaGVhZGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX2dvX2RvY3N0cmluZyAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYyk7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIGdvX2F1dG9nZW5fY29tbWVudCgpOwotICBzdGQ6OnN0cmluZyBnb19wYWNrYWdlKCk7Ci0gIHN0ZDo6c3RyaW5nIGdvX2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9mYXN0YmluYXJ5X2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfYXJndW1lbnQodF9maWVsZCogdGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUodF9maWVsZCogdGZpZWxkLCBjb25zdCBzdHJpbmcmIG5hbWUpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9pZih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwgYm9vbCBhZGRPc0Vycm9yPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19nb190eXBlKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX3NwZWNfYXJncyh0X3R5cGUqIHR0eXBlKTsKLQotICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X3JlYWxfZ29fbW9kdWxlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSkgewotICAgIHN0ZDo6c3RyaW5nIHJlYWxfbW9kdWxlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiZ28iKTsKLSAgICBpZiAocmVhbF9tb2R1bGUuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIHByb2dyYW0tPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIHJldHVybiByZWFsX21vZHVsZTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gZl9jb25zdHNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0KLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOwotICAKLSAgc3RhdGljIHN0ZDo6c3RyaW5nIHB1YmxpY2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBzdGF0aWMgc3RkOjpzdHJpbmcgcHJpdmF0aXplKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIHN0YXRpYyBzdGQ6OnN0cmluZyB2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgc3RhdGljIGJvb2wgY2FuX2JlX25pbCh0X3R5cGUqIHZhbHVlKTsKLQotfTsKLQotCi1zdGQ6OnN0cmluZyB0X2dvX2dlbmVyYXRvcjo6cHVibGljaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBpZih2YWx1ZS5zaXplKCkgPD0gMCkgcmV0dXJuIHZhbHVlOwotICBzdGQ6OnN0cmluZyB2YWx1ZTIodmFsdWUpOwotICBpZighaXN1cHBlcih2YWx1ZTJbMF0pKQotICAgIHZhbHVlMlswXSA9IHRvdXBwZXIodmFsdWUyWzBdKTsKLSAgLy8gYXMgbG9uZyBhcyB3ZSBhcmUgY2hhbmdpbmcgdGhpbmdzLCBsZXQncyBjaGFuZ2UgXyBmb2xsb3dlZCBieSBsb3dlcmNhc2UgdG8gY2FwaXRhbAotICBmb3Ioc3RyaW5nOjpzaXplX3R5cGUgaT0xOyBpPHZhbHVlMi5zaXplKCktMTsgKytpKSB7Ci0gICAgaWYodmFsdWUyW2ldID09ICdfJyAmJiBpc2FscGhhKHZhbHVlMltpKzFdKSkgewotICAgICAgdmFsdWUyLnJlcGxhY2UoaSwgMiwgMSwgdG91cHBlcih2YWx1ZTJbaSsxXSkpOwotICAgIH0KLSAgfQotICByZXR1cm4gdmFsdWUyOwotfQotCi1zdGQ6OnN0cmluZyB0X2dvX2dlbmVyYXRvcjo6cHJpdmF0aXplKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBpZih2YWx1ZS5zaXplKCkgPD0gMCkgcmV0dXJuIHZhbHVlOwotICBzdGQ6OnN0cmluZyB2YWx1ZTIodmFsdWUpOwotICBpZighaXNsb3dlcih2YWx1ZTJbMF0pKSB7Ci0gICAgdmFsdWUyWzBdID0gdG9sb3dlcih2YWx1ZTJbMF0pOwotICB9Ci0gIC8vIGFzIGxvbmcgYXMgd2UgYXJlIGNoYW5naW5nIHRoaW5ncywgbGV0J3MgY2hhbmdlIF8gZm9sbG93ZWQgYnkgbG93ZXJjYXNlIHRvIGNhcGl0YWwKLSAgZm9yKHN0cmluZzo6c2l6ZV90eXBlIGk9MTsgaTx2YWx1ZTIuc2l6ZSgpLTE7ICsraSkgewotICAgIGlmKHZhbHVlMltpXSA9PSAnXycgJiYgaXNhbHBoYSh2YWx1ZTJbaSsxXSkpIHsKLSAgICAgIHZhbHVlMi5yZXBsYWNlKGksIDIsIDEsIHRvdXBwZXIodmFsdWUyW2krMV0pKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHZhbHVlMjsKLX0KLQotc3RkOjpzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgaWYodmFsdWUuc2l6ZSgpIDw9IDApIHJldHVybiB2YWx1ZTsKLSAgc3RkOjpzdHJpbmcgdmFsdWUyKHZhbHVlKTsKLSAgc3RkOjp0cmFuc2Zvcm0odmFsdWUyLmJlZ2luKCksIHZhbHVlMi5lbmQoKSwgdmFsdWUyLmJlZ2luKCksIDo6dG9sb3dlcik7Ci0gIHN3aXRjaCh2YWx1ZVswXSkgewotICAgIGNhc2UgJ2InOgotICAgIGNhc2UgJ0InOgotICAgICAgaWYodmFsdWUyICE9ICJicmVhayIpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYyc6Ci0gICAgY2FzZSAnQyc6Ci0gICAgICBpZih2YWx1ZTIgIT0gImNhc2UiICYmIHZhbHVlMiAhPSAiY2hhbiIgJiYgdmFsdWUyICE9ICJjb25zdCIgJiYgdmFsdWUyICE9ICJjb250aW51ZSIpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgICBpZih2YWx1ZTIgIT0gImRlZmF1bHQiICYmIHZhbHVlMiAhPSAiZGVmZXIiKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2UnOgotICAgIGNhc2UgJ0UnOgotICAgICAgaWYodmFsdWUyICE9ICJlbHNlIikgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICAgIGlmKHZhbHVlMiAhPSAiZmFsbHRocm91Z2giICYmIHZhbHVlMiAhPSAiZm9yIiAmJiB2YWx1ZTIgIT0gImZ1bmMiKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2cnOgotICAgIGNhc2UgJ0cnOgotICAgICAgaWYodmFsdWUyICE9ICJnbyIgJiYgdmFsdWUyICE9ICJnb3RvIikgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdpJzoKLSAgICBjYXNlICdJJzoKLSAgICAgIGlmKHZhbHVlMiAhPSAiaWYiICYmIHZhbHVlMiAhPSAiaW1wb3J0IiAmJiB2YWx1ZTIgIT0gImludGVyZmFjZSIpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnbSc6Ci0gICAgY2FzZSAnTSc6Ci0gICAgICBpZih2YWx1ZTIgIT0gIm1hcCIpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBpZih2YWx1ZTIgIT0gInBhY2thZ2UiKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgaWYodmFsdWUyICE9ICJyYW5nZSIgJiYgdmFsdWUyICE9ICJyZXR1cm4iKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgaWYodmFsdWUyICE9ICJzZWxlY3QiICYmIHZhbHVlMiAhPSAic3RydWN0IiAmJiB2YWx1ZTIgIT0gInN3aXRjaCIpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAndCc6Ci0gICAgY2FzZSAnVCc6Ci0gICAgICBpZih2YWx1ZTIgIT0gInR5cGUiKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3YnOgotICAgIGNhc2UgJ1YnOgotICAgICAgaWYodmFsdWUyICE9ICJ2YXIiKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLSAgcmV0dXJuIHZhbHVlMiArICJfYTEiOwotfQotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgc3RyaW5nIG1vZHVsZSA9IGdldF9yZWFsX2dvX21vZHVsZShwcm9ncmFtXyk7Ci0gIHN0cmluZyB0YXJnZXQgPSBtb2R1bGU7Ci0gIHBhY2thZ2VfZGlyXyA9IGdldF9vdXRfZGlyKCk7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgLy8gVE9ETzogRG8gYmV0dGVyIGVycm9yIGNoZWNraW5nIGhlcmUuCi0gICAgTUtESVIocGFja2FnZV9kaXJfLmNfc3RyKCkpOwotICAgIGlmIChtb2R1bGUuZW1wdHkoKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IG1vZHVsZS5maW5kKCcuJyk7Ci0gICAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHBhY2thZ2VfZGlyXyArPSAiLyI7Ci0gICAgICBwYWNrYWdlX2Rpcl8gKz0gbW9kdWxlOwotICAgICAgcGFja2FnZV9uYW1lXyA9IG1vZHVsZTsKLSAgICAgIG1vZHVsZS5jbGVhcigpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwYWNrYWdlX2Rpcl8gKz0gIi8iOwotICAgICAgcGFja2FnZV9kaXJfICs9IG1vZHVsZS5zdWJzdHIoMCwgcG9zKTsKLSAgICAgIG1vZHVsZS5lcmFzZSgwLCBwb3MrMSk7Ci0gICAgfQotICB9Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLSAgd2hpbGUoKGxvYyA9IHRhcmdldC5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHRhcmdldC5yZXBsYWNlKGxvYywgMSwgMSwgJy8nKTsKLSAgfQotICAKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl90eXBlc19uYW1lID0gcGFja2FnZV9kaXJfKyIvIisidHR5cGVzLmdvIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0gIGZfY29uc3RzXyA8PCAiZnVuYyBpbml0KCkgeyIgPDwgZW5kbDsKLSAgCi0gIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW1fLT5nZXRfc2VydmljZXMoKTsKLSAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOwotICBzdHJpbmcgZl9pbml0X25hbWUgPSBwYWNrYWdlX2Rpcl8rIi9NYWtlZmlsZSI7Ci0gIG9mc3RyZWFtIGZfaW5pdDsKLSAgZl9pbml0Lm9wZW4oZl9pbml0X25hbWUuY19zdHIoKSk7Ci0gIGZfaW5pdCAgPDwgCi0gICAgZW5kbCA8PAotICAgICJpbmNsdWRlICQoR09ST09UKS9zcmMvTWFrZS5pbmMiIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICJhbGw6IGluc3RhbGwiIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICJUQVJHPXRocmlmdGxpYi8iIDw8IHRhcmdldCA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAiRElSUz1cXCIgPDwgZW5kbDsKLSAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7Ci0gICAgZl9pbml0IDw8ICIgICIgPDwgKCpzdl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXFwiIDw8IGVuZGw7Ci0gIH0KLSAgZl9pbml0IDw8IGVuZGwgPDwKLSAgICAiR09GSUxFUz1cXCIgPDwgZW5kbCA8PAotICAgICIgIHR0eXBlcy5nb1xcIiA8PCBlbmRsOwotICAvLyAgIiAgIGNvbnN0YW50cy5nb1xcIiA8PCBlbmRsOwotICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKLSAgICBmX2luaXQgPDwgIiAgIiA8PCAoKnN2X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIuZ29cXCIgPDwgZW5kbDsKLSAgfQotICBmX2luaXQgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgImluY2x1ZGUgJChHT1JPT1QpL3NyYy9NYWtlLnBrZyIgPDwgZW5kbCA8PCBlbmRsOwotICBmX2luaXQuY2xvc2UoKTsKLQotICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKLSAgICBzdHJpbmcgc2VydmljZV9kaXIgPSBwYWNrYWdlX2Rpcl8rIi8iKygqc3ZfaXRlciktPmdldF9uYW1lKCk7Ci0jaWZkZWYgTUlOR1cKLSAgICBta2RpcihzZXJ2aWNlX2Rpci5jX3N0cigpKTsKLSNlbHNlCi0gICAgbWtkaXIoc2VydmljZV9kaXIuY19zdHIoKSwgMDc1NSk7Ci0jZW5kaWYKLSAgICBzdHJpbmcgZl9pbml0X25hbWUgPSBzZXJ2aWNlX2RpcisiL01ha2VmaWxlIjsKLSAgICBvZnN0cmVhbSBmX2luaXQ7Ci0gICAgZl9pbml0Lm9wZW4oZl9pbml0X25hbWUuY19zdHIoKSk7Ci0gICAgZl9pbml0ICA8PAotICAgICAgZW5kbCA8PAotICAgICAgImluY2x1ZGUgJChHT1JPT1QpL3NyYy9NYWtlLmluYyIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICAiYWxsOiBpbnN0YWxsIiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgICJUQVJHPSIgPDwgcHVibGljaXplKCgqc3ZfaXRlciktPmdldF9uYW1lKCkpIDw8ICItcmVtb3RlIiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgICJESVJTPVxcIiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgICJHT0ZJTEVTPVxcIiA8PCBlbmRsIDw8Ci0gICAgICAiICAiIDw8ICgqc3ZfaXRlciktPmdldF9uYW1lKCkgPDwgIi1yZW1vdGUuZ29cXCIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICAiaW5jbHVkZSAkKEdPUk9PVCkvc3JjL01ha2UuY21kIiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgZl9pbml0LmNsb3NlKCk7Ci0gIH0KLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl90eXBlc18gPDwKLSAgICBnb19hdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGdvX3BhY2thZ2UoKSA8PCAKLSAgICBnb19pbXBvcnRzKCkgPDwKLSAgICByZW5kZXJfaW5jbHVkZXMoKSA8PAotICAgIHJlbmRlcl9mYXN0YmluYXJ5X2luY2x1ZGVzKCkgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIHJlc3VsdCArPSAiaW1wb3J0IFwidGhyaWZ0bGliLyIgKyBnZXRfcmVhbF9nb19tb2R1bGUoaW5jbHVkZXNbaV0pICsgIlwiXG4iOwotICB9Ci0gIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7Ci0gICAgcmVzdWx0ICs9ICJcbiI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgdG8gdXNlIHRoZSBhY2NlbGVyYXRlZCBUQmluYXJ5UHJvdG9jb2wKLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfZmFzdGJpbmFyeV9pbmNsdWRlcygpIHsKLSAgcmV0dXJuICIiOwotfQotCi0vKioKLSAqIEF1dG9nZW4nZCBjb21tZW50Ci0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6Z29fYXV0b2dlbl9jb21tZW50KCkgewotICByZXR1cm4KLSAgICBzdGQ6OnN0cmluZygpICsKLQkiLyogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCi0gICAgIiAqXG4iCi0gICAgIiAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIKLSAgICAiICovXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgcGFja2FnZQotICovCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OmdvX3BhY2thZ2UoKSB7Ci0gIHJldHVybgotICAgIHN0cmluZygicGFja2FnZSAiKSArIHBhY2thZ2VfbmFtZV8gKyAiO1xuXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgaW1wb3J0cwotICovCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OmdvX2ltcG9ydHMoKSB7Ci0gIHJldHVybgotICAgIHN0cmluZygiaW1wb3J0IChcbiIKLSAgICAgICAgICAgIiAgICAgICAgXCJ0aHJpZnRcIlxuIgotLy8gICAgICAgICAgICIgICAgICAgIFwic3RyaW5nc1wiXG4iCi0gICAgICAgICAgICIgICAgICAgIFwiZm10XCJcbiIKLSAgICAgICAgICAgIilcblxuIik7Ci19Ci0KLS8qKgotICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZQotICBmX2NvbnN0c18gPDwgIn0iIDw8IGVuZGw7Ci0gIGZfdHlwZXNfIDw8IGZfY29uc3RzXy5zdHIoKSA8PCBlbmRsOwotICBmX3R5cGVzXy5jbG9zZSgpOwotICBmX2NvbnN0c18uY2xlYXIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIGdvLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAKLSAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfdHlwZXNfLCB0dHlwZWRlZik7Ci0gIHN0cmluZyBuZXdUeXBlRGVmKHB1YmxpY2l6ZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpKTsKLSAgc3RyaW5nIGJhc2VUeXBlKHR5cGVfdG9fZ29fdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkpOwotICBpZihiYXNlVHlwZSA9PSBuZXdUeXBlRGVmKQotICAgIHJldHVybjsKLSAgZl90eXBlc18gPDwKLSAgICAidHlwZSAiIDw8IG5ld1R5cGVEZWYgPDwgIiAiIDw8IGJhc2VUeXBlIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBEb25lIHVzaW5nIGEgY2xhc3MgdG8gc2NvcGUKLSAqIHRoZSB2YWx1ZXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHRvX3N0cmluZ19tYXBwaW5nLCBmcm9tX3N0cmluZ19tYXBwaW5nOwotICBzdGQ6OnN0cmluZyB0ZW51bV9uYW1lKHB1YmxpY2l6ZSh0ZW51bS0+Z2V0X25hbWUoKSkpOwotCi0gIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3R5cGVzXywgdGVudW0pOwotICBmX3R5cGVzXyA8PAotICAgICJ0eXBlICIgPDwgdGVudW1fbmFtZSA8PCAiIGludCIgPDwgZW5kbCA8PAotICAgICJjb25zdCAoIiA8PCBlbmRsOwotICAKLSAgdG9fc3RyaW5nX21hcHBpbmcgPDwKLSAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAiIDw8IHRlbnVtX25hbWUgPDwgIikgU3RyaW5nKCkgc3RyaW5nIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBzd2l0Y2ggcCB7IiA8PCBlbmRsOwotICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8Ci0gICAgaW5kZW50KCkgPDwgImZ1bmMgRnJvbSIgPDwgdGVudW1fbmFtZSA8PCAiU3RyaW5nKHMgc3RyaW5nKSAiIDw8IHRlbnVtX25hbWUgPDwgIiB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgc3dpdGNoIHMgeyIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGludCB2YWx1ZSA9IC0xOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmICgoKmNfaXRlciktPmhhc192YWx1ZSgpKSB7Ci0gICAgICB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICsrdmFsdWU7Ci0gICAgfQotICAgIHN0cmluZyBpdGVyX3N0ZF9uYW1lKGVzY2FwZV9zdHJpbmcoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSk7Ci0gICAgc3RyaW5nIGl0ZXJfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgIGZfdHlwZXNfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGl0ZXJfbmFtZSA8PCAnICcgPDwgdGVudW1fbmFtZSA8PCAiID0gIiA8PCB2YWx1ZSA8PCBlbmRsOwotICAgIAotICAgIC8vIERpY3Rpb25hcmllcyB0by9mcm9tIHN0cmluZyBuYW1lcyBvZiBlbnVtcwotICAgIHRvX3N0cmluZ19tYXBwaW5nIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBjYXNlICIgPDwgaXRlcl9uYW1lIDw8ICI6IHJldHVybiBcIiIgPDwgaXRlcl9zdGRfbmFtZSA8PCAiXCIiIDw8IGVuZGw7Ci0gICAgaWYoaXRlcl9zdGRfbmFtZSAhPSBlc2NhcGVfc3RyaW5nKGl0ZXJfbmFtZSkpIHsKLSAgICAgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgY2FzZSBcIiIgPDwgaXRlcl9zdGRfbmFtZSA8PCAiXCIsIFwiIiA8PCBlc2NhcGVfc3RyaW5nKGl0ZXJfbmFtZSkgPDwgIlwiOiByZXR1cm4gIiA8PCBpdGVyX25hbWUgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBjYXNlIFwiIiA8PCBpdGVyX3N0ZF9uYW1lIDw8ICJcIjogcmV0dXJuICIgPDwgaXRlcl9uYW1lIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIHRvX3N0cmluZ19tYXBwaW5nIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBcIlwiIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGZyb21fc3RyaW5nX21hcHBpbmcgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgdGVudW1fbmFtZSA8PCAiKC0xMDAwMCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICBmX3R5cGVzXyA8PAotICAgIGluZGVudCgpIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgdG9fc3RyaW5nX21hcHBpbmcuc3RyKCkgPDwgZW5kbCA8PCBmcm9tX3N0cmluZ19tYXBwaW5nLnN0cigpIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAiIDw8IHRlbnVtX25hbWUgPDwgIikgVmFsdWUoKSBpbnQgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBpbnQocCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgIiA8PCB0ZW51bV9uYW1lIDw8ICIpIElzRW51bSgpIGJvb2wgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gcHVibGljaXplKHRjb25zdC0+Z2V0X25hbWUoKSk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLSAgCi0gIGlmKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChmX3R5cGVzXykgPDwgImNvbnN0ICIgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUsIG5hbWUpIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl90eXBlc18gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ2YXIgIiA8PCBuYW1lIDw8ICIgIiA8PCAiICIgPDwgdHlwZV90b19nb190eXBlKHR5cGUpIDw8IGVuZGw7Ci0gICAgZl9jb25zdHNfIDw8Ci0gICAgICAiICAiIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlLCBuYW1lKSA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgY29uc3Qgc3RyaW5nJiBuYW1lKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBvdXQgPDwgCi0gICAgICAiTmV3IiA8PCBwdWJsaWNpemUodHlwZS0+Z2V0X25hbWUoKSkgPDwgIigpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgaWYoZmllbGRfdHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgZmllbGRfdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8IG5hbWUgPDwgIi4iIDw8IHB1YmxpY2l6ZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCwgbmFtZSkgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0cmluZyBrKHRtcCgiayIpKTsKLSAgICAgICAgc3RyaW5nIHYodG1wKCJ2IikpOwotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCB2IDw8ICIgOj0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQsIHYpIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBuYW1lIDw8ICIuIiA8PCBwdWJsaWNpemUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSA8PCAiID0gIiA8PCB2IDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgb3V0IDw8IAotICAgICAgInRocmlmdC5OZXdUTWFwKCIgPDwgdHlwZV90b19lbnVtKGt0eXBlKSA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSh2dHlwZSkgPDwgIiwgIiA8PCB2YWwuc2l6ZSgpIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgayh0bXAoImsiKSk7Ci0gICAgICBzdHJpbmcgdih0bXAoInYiKSk7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgayA8PCAiIDo9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0LCBrKSA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHYgPDwgIiA6PSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQsIHYpIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgbmFtZSA8PCAiLlNldCgiIDw8IGsgPDwgIiwgIiA8PCB2IDw8ICIpIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIG91dCA8PAotICAgICAgInRocmlmdC5OZXdUTGlzdCgiIDw8IHR5cGVfdG9fZW51bShldHlwZSkgPDwgIiwgIiA8PCB2YWwuc2l6ZSgpIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2KHRtcCgidiIpKTsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCB2IDw8ICIgOj0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIsIHYpIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgbmFtZSA8PCAiLlB1c2goIiA8PCB2IDw8ICIpIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICBvdXQgPDwKLSAgICAgICJ0aHJpZnQuTmV3VFNldCgiIDw8IHR5cGVfdG9fZW51bShldHlwZSkgPDwgIiwgIiA8PCB2YWwuc2l6ZSgpIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2KHRtcCgidiIpKTsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCB2IDw8ICIgOj0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIsIHYpIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgbmFtZSA8PCAiLkFkZCgiIDw8IHYgPDwgIikiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZ28gc3RydWN0Ci0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9nb19zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQotICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2dvX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGdvIHN0cnVjdAotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewotCi0gICh2b2lkKSBpc19leGNlcHRpb247Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBzb3J0ZWRfbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKG91dCwgdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHRzdHJ1Y3RfbmFtZShwdWJsaWNpemUodHN0cnVjdC0+Z2V0X25hbWUoKSkpOwotICBvdXQgPDwgCi0gICAgaW5kZW50KCkgPDwgInR5cGUgIiA8PCB0c3RydWN0X25hbWUgPDwgIiBzdHJ1Y3QgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHRocmlmdC5UU3RydWN0IiA8PCBlbmRsOwotCi0gIC8qCi0gICAgIEhlcmUgd2UgZ2VuZXJhdGUgdGhlIHN0cnVjdHVyZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgZmFzdGJpbmFyeSBjb2RlYy4KLSAgICAgVGhlc2Ugc3BlY2lmaWNhdGlvbnMgaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKLSAgICAgdGhyaWZ0X3NwZWMgLT4gdHVwbGUgb2YgaXRlbV9zcGVjCi0gICAgIGl0ZW1fc3BlYyAtPiBuaWwgfCAodGFnLCB0eXBlX2VudW0sIG5hbWUsIHNwZWNfYXJncywgZGVmYXVsdCkKLSAgICAgdGFnIC0+IGludGVnZXIKLSAgICAgdHlwZV9lbnVtIC0+IFRUeXBlLkkzMiB8IFRUeXBlLlNUUklORyB8IFRUeXBlLlNUUlVDVCB8IC4uLgotICAgICBuYW1lIC0+IHN0cmluZ19saXRlcmFsCi0gICAgIGRlZmF1bHQgLT4gbmlsICAjIEhhbmRsZWQgYnkgX19pbml0X18KLSAgICAgc3BlY19hcmdzIC0+IG5pbCAgIyBGb3Igc2ltcGxlIHR5cGVzCi0gICAgICAgICAgICAgICAgfCAodHlwZV9lbnVtLCBzcGVjX2FyZ3MpICAjIFZhbHVlIHR5cGUgZm9yIGxpc3Qvc2V0Ci0gICAgICAgICAgICAgICAgfCAodHlwZV9lbnVtLCBzcGVjX2FyZ3MsIHR5cGVfZW51bSwgc3BlY19hcmdzKQotICAgICAgICAgICAgICAgICAgIyBLZXkgYW5kIHZhbHVlIGZvciBtYXAKLSAgICAgICAgICAgICAgICB8IChjbGFzc19uYW1lLCBzcGVjX2FyZ3NfcHRyKSAjIEZvciBzdHJ1Y3QvZXhjZXB0aW9uCi0gICAgIGNsYXNzX25hbWUgLT4gaWRlbnRpZmllciAgIyBCYXNpY2FsbHkgYSBwb2ludGVyIHRvIHRoZSBjbGFzcwotICAgICBzcGVjX2FyZ3NfcHRyIC0+IGV4cHJlc3Npb24gICMganVzdCBjbGFzc19uYW1lLnNwZWNfYXJncwotCi0gICAgIFRPRE8oZHJlaXNzKTogQ29uc2lkZXIgbWFraW5nIHRoaXMgd29yayBmb3Igc3RydWN0cyB3aXRoIG5lZ2F0aXZlIHRhZ3MuCi0gICovCi0KLSAgLy8gVE9ETyhkcmVpc3MpOiBMb29rIGludG8gZ2VuZXJhdGluZyBhbiBlbXB0eSB0dXBsZSBpbnN0ZWFkIG9mIG5pbAotICAvLyBmb3Igc3RydWN0dXJlcyB3aXRoIG5vIG1lbWJlcnMuCi0gIC8vIFRPRE8oZHJlaXNzKTogVGVzdCBlbmNvZGluZyBvZiBzdHJ1Y3RzIHdoZXJlIHNvbWUgaW5uZXIgc3RydWN0cwotICAvLyBkb24ndCBoYXZlIHRocmlmdF9zcGVjLgotICBpbmRlbnRfdXAoKTsKLSAgaWYgKHNvcnRlZF9tZW1iZXJzLmVtcHR5KCkgfHwgKHNvcnRlZF9tZW1iZXJzWzBdLT5nZXRfa2V5KCkgPj0gMCkpIHsKLSAgICBpbnQgc29ydGVkX2tleXNfcG9zID0gMDsKLSAgICBmb3IgKG1faXRlciA9IHNvcnRlZF9tZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBzb3J0ZWRfbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLQotICAgICAgZm9yICg7IHNvcnRlZF9rZXlzX3BvcyAhPSAoKm1faXRlciktPmdldF9rZXkoKTsgc29ydGVkX2tleXNfcG9zKyspIHsKLSAgICAgICAgaWYgKHNvcnRlZF9rZXlzX3BvcyAhPSAwKSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIl8gaW50ZXJmYWNle30gXCIiIDw8IGVzY2FwZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiXCI7IC8vIG5pbCAjICIgPDwgc29ydGVkX2tleXNfcG9zIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHRfdHlwZSogZmllbGRUeXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgc3RyaW5nIGdvVHlwZSh0eXBlX3RvX2dvX3R5cGUoZmllbGRUeXBlKSk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBwdWJsaWNpemUodmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkpIDw8ICIgIiAKLSAgICAgICAgICAgICAgICAgIDw8IGdvVHlwZSA8PCAiIFwiIiA8PCBlc2NhcGVfc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICAgIDw8ICJcIjsgLy8gIiA8PCBzb3J0ZWRfa2V5c19wb3MKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgICAgIHNvcnRlZF9rZXlzX3BvcyArKzsKLSAgICB9Ci0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAvLyBUaGlzIGZpbGxzIGluIGRlZmF1bHQgdmFsdWVzLCBhcyBvcHBvc2VkIHRvIG51bGxzCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcHVibGljaXplKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiAiIDw8Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKCkgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG91dHB1dCA6PSAmIiA8PCB0c3RydWN0X25hbWUgPDwgInsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAgIFRTdHJ1Y3Q6dGhyaWZ0Lk5ld1RTdHJ1Y3QoXCIiIDw8IGVzY2FwZV9zdHJpbmcodHN0cnVjdC0+Z2V0X25hbWUoKSkgPDwgIlwiLCBbXXRocmlmdC5URmllbGR7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvcihtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHN0cmluZyB0aHJpZnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInRocmlmdC5OZXdURmllbGQoXCIiIDw8IGVzY2FwZV9zdHJpbmcodGhyaWZ0X25hbWUpIDw8ICJcIiwgIiA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiksIiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCAKLSAgICBpbmRlbnQoKSA8PCAifSksIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAvLyBJbml0aWFsaXplIGZpZWxkcwotICAgIC8vdF90eXBlKiB0eXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIHN0cmluZyBmaWVsZE5hbWUocHVibGljaXplKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkpOwotICAgIHN0cmluZyBmdWxsRmllbGROYW1lID0gIm91dHB1dC4iICsgZmllbGROYW1lOwotICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBmdWxsRmllbGROYW1lIDw8ICIgPSAiIDw8Ci0gICAgICAgIHJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKCptX2l0ZXIsIGZ1bGxGaWVsZE5hbWUpIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiBvdXRwdXQiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZ29fc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3RfbmFtZSwgaXNfcmVzdWx0KTsKLSAgZ2VuZXJhdGVfZ29fc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3RfbmFtZSwgaXNfcmVzdWx0KTsKLSAgCi0gIC8vIFByaW50aW5nIHV0aWxpdGllcyBzbyB0aGF0IG9uIHRoZSBjb21tYW5kIGxpbmUgdGhyaWZ0Ci0gIC8vIHN0cnVjdHMgbG9vayBwcmV0dHkgbGlrZSBkaWN0aW9uYXJpZXMKLSAgb3V0IDw8IAotICAgIGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBUU3RydWN0TmFtZSgpIHN0cmluZyB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIFwiIiA8PCBlc2NhcGVfc3RyaW5nKHRzdHJ1Y3RfbmFtZSkgPDwgIlwiIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgCi0gIG91dCA8PCAKLSAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgVGhyaWZ0TmFtZSgpIHN0cmluZyB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIFwiIiA8PCBlc2NhcGVfc3RyaW5nKHRzdHJ1Y3QtPmdldF9uYW1lKCkpIDw8ICJcIiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIAotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgU3RyaW5nKCkgc3RyaW5nIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBpZiBwID09IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gXCI8bmlsPlwiIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBmbXQuU3ByaW50ZihcIiIgPDwgZXNjYXBlX3N0cmluZyh0c3RydWN0X25hbWUpIDw8ICIoJSt2KVwiLCAqcCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEVxdWFsaXR5IGFuZCBpbmVxdWFsaXR5IG1ldGhvZHMgdGhhdCBjb21wYXJlIGJ5IHZhbHVlCi0gIGlmKG1lbWJlcnMuc2l6ZSgpIDw9IDApIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBDb21wYXJlVG8ob3RoZXIgaW50ZXJmYWNle30pIChpbnQsIGJvb2wpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlmIG90aGVyID09IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgIHJldHVybiAxLCB0cnVlIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBfLCBvayA6PSBvdGhlci4oKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBpZiAhb2sgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gMCwgZmFsc2UiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAwLCB0cnVlIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIENvbXBhcmVUbyhvdGhlciBpbnRlcmZhY2V7fSkgKGludCwgYm9vbCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgaWYgb3RoZXIgPT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuIDEsIHRydWUiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGRhdGEsIG9rIDo9IG90aGVyLigqIiA8PCB0c3RydWN0X25hbWUgPDwgIikiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlmICFvayB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgIHJldHVybiAwLCBmYWxzZSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogb3JpZ190eXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShvcmlnX3R5cGUpOwotICAgICAgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKHZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpKSk7Ci0gICAgICBpZih0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgICAgaWYodHlwZS0+aXNfYm9vbCgpKSB7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgY21wIDo9IHRocmlmdC5Db21wYXJlQm9vbChwLiIgPDwgZmllbGRfbmFtZSA8PCAiLCBkYXRhLiIgPDwgZmllbGRfbmFtZSA8PCAiKTsgY21wICE9IDAgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGNtcCwgdHJ1ZSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgcC4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBkYXRhLiIgPDwgZmllbGRfbmFtZSA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGlmIHAuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPCBkYXRhLiIgPDwgZmllbGRfbmFtZSA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuIC0xLCB0cnVlIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gMSwgdHJ1ZSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZih0eXBlLT5pc19jb250YWluZXIoKSB8fCB0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiBjbXAsIG9rIDo9IHAuIiA8PCBmaWVsZF9uYW1lIDw8ICIuQ29tcGFyZVRvKGRhdGEuIiA8PCBmaWVsZF9uYW1lIDw8ICIpOyAhb2sgfHwgY21wICE9IDAgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBjbXAsIG9rIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIGdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgCi0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gMCwgdHJ1ZSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotICAKLSAgLy8gRXF1YWxpdHkgYW5kIGluZXF1YWxpdHkgbWV0aG9kcyB0aGF0IGNvbXBhcmUgYnkgdmFsdWUKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIEF0dHJpYnV0ZUJ5RmllbGRJZChpZCBpbnQpIGludGVyZmFjZXt9IHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBzd2l0Y2ggaWQgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGRlZmF1bHQ6IHJldHVybiBuaWwiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUodmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkpKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJjYXNlICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjogcmV0dXJuIHAuIiA8PCBmaWVsZF9uYW1lIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBuaWwiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIFRTdHJ1Y3RGaWVsZHMoKSB0aHJpZnQuVEZpZWxkQ29udGFpbmVyIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0Lk5ld1RGaWVsZENvbnRhaW5lcihbXXRocmlmdC5URmllbGR7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvcihtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHN0cmluZyB0aHJpZnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInRocmlmdC5OZXdURmllbGQoXCIiIDw8IGVzY2FwZV9zdHJpbmcodGhyaWZ0X25hbWUpIDw8ICJcIiwgIiA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiksIiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCAKLSAgICBpbmRlbnQoKSA8PCAifSkiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7Ci0gICh2b2lkKSBpc19yZXN1bHQ7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgc3RyaW5nIGVzY2FwZWRfdHN0cnVjdF9uYW1lKGVzY2FwZV9zdHJpbmcodHN0cnVjdC0+Z2V0X25hbWUoKSkpOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBSZWFkKGlwcm90IHRocmlmdC5UUHJvdG9jb2wpIChlcnIgdGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIl8sIGVyciA9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyByZXR1cm4gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRTdHJ1Y3QocC5UaHJpZnROYW1lKCksIGVycik7IH0iIDw8IGVuZGw7Ci0KLSAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCi0gIGluZGVudChvdXQpIDw8ICJmb3IgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJmaWVsZE5hbWUsIGZpZWxkVHlwZUlkLCBmaWVsZElkLCBlcnIgOj0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiBmaWVsZElkIDwgMCB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgZmllbGRJZCA9IGludDE2KHAuRmllbGRJZEZyb21GaWVsZE5hbWUoZmllbGROYW1lKSkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSBlbHNlIGlmIGZpZWxkTmFtZSA9PSBcIlwiIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBmaWVsZE5hbWUgPSBwLkZpZWxkTmFtZUZyb21GaWVsZElkKGludChmaWVsZElkKSkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiBmaWVsZFR5cGVJZCA9PSB0aHJpZnQuR0VORVJJQyB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgZmllbGRUeXBlSWQgPSBwLkZpZWxkRnJvbUZpZWxkSWQoaW50KGZpZWxkSWQpKS5UeXBlSWQoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIGZpZWxkVHlwZUlkID09IHRocmlmdC5TVE9QIHsgYnJlYWs7IH0iIDw8IGVuZGw7Ci0KLSAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0KLSAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gIGludDMyX3QgZmllbGRfaWQgPSAtMTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmaWVsZF9pZCA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOwotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIGluZGVudChvdXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlICI7Ci0gICAgfQotICAgIG91dCA8PCAiaWYgZmllbGRJZCA9PSAiIDw8IGZpZWxkX2lkIDw8ICIgfHwgZmllbGROYW1lID09IFwiIiA8PCBlc2NhcGVfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIlwiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgZmllbGRUeXBlSWQgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGVyciA9IHAuUmVhZEZpZWxkIiA8PCBmaWVsZF9pZCA8PCAiKGlwcm90KSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgaWYgZXJyICE9IG5pbCB7IHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKTsgfSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSBpZiBmaWVsZFR5cGVJZCA9PSB0aHJpZnQuVk9JRCB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBlcnIgPSBpcHJvdC5Ta2lwKGZpZWxkVHlwZUlkKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgaWYgZXJyICE9IG5pbCB7IHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKTsgfSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBlcnIgPSBwLlJlYWRGaWVsZCIgPDwgZmllbGRfaWQgPDwgIihpcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyByZXR1cm4gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycik7IH0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCi0gIGlmIChmaXJzdCkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImVyciA9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKTsgfSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgZXJyID0gaXByb3QuU2tpcChmaWVsZFR5cGVJZCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyByZXR1cm4gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycik7IH0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0gIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiZXJyID0gaXByb3QuUmVhZEZpZWxkRW5kKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKTsgfSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJlcnIgPSBpcHJvdC5SZWFkU3RydWN0RW5kKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZFN0cnVjdChwLlRocmlmdE5hbWUoKSwgZXJyKTsgfSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gZXJyIiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZpZWxkX3R5cGVfbmFtZShwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSk7Ci0gICAgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpOwotICAgIGludDMyX3QgZmllbGRfaWQgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBSZWFkRmllbGQiIDw8IGZpZWxkX2lkIDw8ICIoaXByb3QgdGhyaWZ0LlRQcm90b2NvbCkgKGVyciB0aHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgZmFsc2UsICJwLiIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZXJyIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgUmVhZEZpZWxkIiA8PCBmaWVsZF9uYW1lIDw8ICIoaXByb3QgdGhyaWZ0LlRQcm90b2NvbCkgKHRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24pIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBwLlJlYWRGaWVsZCIgPDwgZmllbGRfaWQgPDwgIihpcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7Ci0gIHN0cmluZyBuYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIFdyaXRlKG9wcm90IHRocmlmdC5UUHJvdG9jb2wpIChlcnIgdGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IAotICAgIGluZGVudCgpIDw8ICJlcnIgPSBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKFwiIiA8PCBuYW1lIDw8ICJcIikiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVTdHJ1Y3QoIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAicC5UaHJpZnROYW1lKCksIGVycik7IH0iIDw8IGVuZGw7Ci0gIAotICBzdHJpbmcgZmllbGRfbmFtZTsKLSAgc3RyaW5nIGVzY2FwZV9maWVsZF9uYW1lOwotICBpbnQzMl90IGZpZWxkSWQgPSAtMTsKLSAgaWYgKGlzX3Jlc3VsdCAmJiBmaWVsZHMuc2l6ZSgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic3dpdGNoIHsiIDw8IGVuZGw7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBmcl9pdGVyOwotICAgIGZvciAoZnJfaXRlciA9IGZpZWxkcy5yYmVnaW4oKTsgZnJfaXRlciAhPSBmaWVsZHMucmVuZCgpOyArK2ZyX2l0ZXIpIHsKLSAgICAgIGZpZWxkX25hbWUgPSAoKmZyX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgZmllbGRJZCA9ICgqZnJfaXRlciktPmdldF9rZXkoKTsKLSAgICAgIGlmKGNhbl9iZV9uaWwoKCpmcl9pdGVyKS0+Z2V0X3R5cGUoKSkgJiYgZmllbGRJZCAhPSAwKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJjYXNlIHAuIiA8PCBwdWJsaWNpemUodmFyaWFibGVfbmFtZV90b19nb19uYW1lKGZpZWxkX25hbWUpKSA8PCAiICE9IG5pbDoiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiBlcnIgPSBwLldyaXRlRmllbGQiIDw8IGZpZWxkSWQgPDwgIihvcHJvdCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuIGVyciIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiBlcnIgPSBwLldyaXRlRmllbGQiIDw8IGZpZWxkSWQgPDwgIihvcHJvdCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuIGVyciIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBlc2NhcGVfZmllbGRfbmFtZSA9IGVzY2FwZV9zdHJpbmcoZmllbGRfbmFtZSk7Ci0gICAgICBmaWVsZElkID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImVyciA9IHAuV3JpdGVGaWVsZCIgPDwgZmllbGRJZCA8PCAiKG9wcm90KSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IHJldHVybiBlcnIgfSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiZXJyID0gb3Byb3QuV3JpdGVGaWVsZFN0b3AoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsgcmV0dXJuIHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKC0xLCBcIlNUT1BcIiwgcC5UaHJpZnROYW1lKCksIGVycik7IH0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZXJyID0gb3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsgcmV0dXJuIHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZVN0cnVjdCgiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICJwLlRocmlmdE5hbWUoKSwgZXJyKTsgfSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gZXJyIiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZmllbGRJZCA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOwotICAgIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgZXNjYXBlX2ZpZWxkX25hbWUgPSBlc2NhcGVfc3RyaW5nKGZpZWxkX25hbWUpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIFdyaXRlRmllbGQiIDw8IGZpZWxkSWQgPDwgIihvcHJvdCB0aHJpZnQuVFByb3RvY29sKSAoZXJyIHRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24pIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCi0gICAgaWYgKGNhbl9iZV9uaWwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiBwLiIgPDwgcHVibGljaXplKHZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZShmaWVsZF9uYW1lKSkgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJlcnIgPSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oXCIiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlX2ZpZWxkX25hbWUgPDwgIlwiLCAiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSWQgPDwgIikiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsgcmV0dXJuIHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKCIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElkIDw8ICIsIFwiIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZV9maWVsZF9uYW1lIDw8ICJcIiwgIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwLlRocmlmdE5hbWUoKSwgZXJyKTsgfSIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInAuIik7Ci0gICAgCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZXJyID0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVGaWVsZCgiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJZCA8PCAiLCBcIiIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVfZmllbGRfbmFtZSA8PCAiXCIsICIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicC5UaHJpZnROYW1lKCksIGVycik7IH0iIDw8IGVuZGw7Ci0KLSAgICBpZiAoY2FuX2JlX25pbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGVyciIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIFdyaXRlRmllbGQiIDw8IHB1YmxpY2l6ZShmaWVsZF9uYW1lKSA8PCAiKG9wcm90IHRocmlmdC5UUHJvdG9jb2wpICh0aHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcC5Xcml0ZUZpZWxkIiA8PCBmaWVsZElkIDw8ICIob3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrc2VydmljZV9uYW1lXysiLmdvIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBnb19hdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGdvX3BhY2thZ2UoKSA8PAotICAgIGdvX2ltcG9ydHMoKTsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJpbXBvcnQgXCJ0aHJpZnRsaWIvIiA8PCBnZXRfcmVhbF9nb19tb2R1bGUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpIDw8ICJcIiIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgICAiaW1wb3J0ICgiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAgICAgICBcIm9zXCIiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgcmVuZGVyX2Zhc3RiaW5hcnlfaW5jbHVkZXMoKTsKLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UgKHdlbGwsIHR3byBmb3Igbm93IGluIFBIUCkKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUodHNlcnZpY2UpOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIi8vIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX2dvX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRydWUgfHwgIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgICB9Ci0KLSAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gICAgfQotICAgIGdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKLSAgc3RyaW5nIHNlcnZpY2VOYW1lKHB1YmxpY2l6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkpOwotICBzdHJpbmcgaW50ZXJmYWNlTmFtZSA9ICJJIiArIHNlcnZpY2VOYW1lOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIHNpemVfdCBpbmRleCA9IGV4dGVuZHMucmZpbmQoIi4iKTsKLSAgICBpZihpbmRleCAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIGV4dGVuZHNfaWYgPSAiXG4iICsgaW5kZW50KCkgKyAiICAiICsgZXh0ZW5kcy5zdWJzdHIoMCwgaW5kZXggKyAxKSArICJJIiArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKSArICJcbiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV4dGVuZHNfaWYgPSAiXG4iICsgaW5kZW50KCkgKyAiSSIgKyBwdWJsaWNpemUoZXh0ZW5kcykgKyAiXG4iOwotICAgIH0KLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IGludGVyZmFjZU5hbWUgPDwgIiBpbnRlcmZhY2UgeyIgPDwgZXh0ZW5kc19pZjsKLSAgaW5kZW50X3VwKCk7Ci0gIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgaWYgKCFmdW5jdGlvbnMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3NlcnZpY2VfLCAoKmZfaXRlcikpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfaWYoKmZfaXRlciwgIiIsIHRydWUpIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnRfbmV3ID0gIiI7Ci0gIHN0cmluZyBzZXJ2aWNlTmFtZShwdWJsaWNpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpKTsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBzaXplX3QgaW5kZXggPSBleHRlbmRzLnJmaW5kKCIuIik7Ci0gICAgaWYoaW5kZXggIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMuc3Vic3RyKDAsIGluZGV4ICsgMSkgKyBwdWJsaWNpemUoZXh0ZW5kcy5zdWJzdHIoaW5kZXggKyAxKSkgKyAiQ2xpZW50IjsKLSAgICAgIGV4dGVuZHNfY2xpZW50X25ldyA9IGV4dGVuZHMuc3Vic3RyKDAsIGluZGV4ICsgMSkgKyAiTmV3IiArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKSArICJDbGllbnQiOwotICAgIH0gZWxzZSB7Ci0gICAgICBleHRlbmRzX2NsaWVudCA9IHB1YmxpY2l6ZShleHRlbmRzKSArICJDbGllbnQiOwotICAgICAgZXh0ZW5kc19jbGllbnRfbmV3ID0gIk5ldyIgKyBleHRlbmRzX2NsaWVudDsKLSAgICB9Ci0gIH0KLQotICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50IHN0cnVjdCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaWYoIWV4dGVuZHNfY2xpZW50LmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IAotICAgICAgaW5kZW50KCkgPDwgIioiIDw8IGV4dGVuZHNfY2xpZW50IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIlRyYW5zcG9ydCB0aHJpZnQuVFRyYW5zcG9ydCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIlByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIklucHV0UHJvdG9jb2wgdGhyaWZ0LlRQcm90b2NvbCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIk91dHB1dFByb3RvY29sIHRocmlmdC5UUHJvdG9jb2wiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJTZXFJZCBpbnQzMiIgPDwgZW5kbCAvKjw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmVxcyBtYXBbaW50MzJdRGVmZXJyZWQiIDw8IGVuZGwqLzsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgCi0gIC8vIENvbnN0cnVjdG9yIGZ1bmN0aW9uCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnRGYWN0b3J5KHQgdGhyaWZ0LlRUcmFuc3BvcnQsIGYgdGhyaWZ0LlRQcm90b2NvbEZhY3RvcnkpICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuICYiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQiOwotICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgCi0gICAgICAieyIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIjogIiA8PCBleHRlbmRzX2NsaWVudF9uZXcgPDwgIkZhY3RvcnkodCwgZil9IjsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8ICJ7VHJhbnNwb3J0OiB0LCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIlByb3RvY29sRmFjdG9yeTogZiwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJJbnB1dFByb3RvY29sOiBmLkdldFByb3RvY29sKHQpLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIk91dHB1dFByb3RvY29sOiBmLkdldFByb3RvY29sKHQpLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIlNlcUlkOiAwLCIgPDwgZW5kbCAvKjw8Ci0gICAgICBpbmRlbnQoKSA8PCAiUmVxczogbWFrZShtYXBbaW50MzJdRGVmZXJyZWQpIiA8PCBlbmRsKi87Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgCi0gIAotICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImZ1bmMgTmV3IiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50UHJvdG9jb2wodCB0aHJpZnQuVFRyYW5zcG9ydCwgaXByb3QgdGhyaWZ0LlRQcm90b2NvbCwgb3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgKiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gJiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCI7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAKLSAgICAgICJ7IiA8PCBleHRlbmRzX2NsaWVudCA8PCAiOiAiIDw8IGV4dGVuZHNfY2xpZW50X25ldyA8PCAiUHJvdG9jb2wodCwgaXByb3QsIG9wcm90KX0iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCAie1RyYW5zcG9ydDogdCwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJQcm90b2NvbEZhY3Rvcnk6IG5pbCwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJJbnB1dFByb3RvY29sOiBpcHJvdCwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJPdXRwdXRQcm90b2NvbDogb3Byb3QsIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiU2VxSWQ6IDAsIiA8PCBlbmRsIC8qPDwKLSAgICAgIGluZGVudCgpIDw8ICJSZXFzOiBtYWtlKG1hcFtpbnQzMl1pbnRlcmZhY2V7fSkiIDw8IGVuZGwqLzsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoZl9zZXJ2aWNlXywgKCpmX2l0ZXIpKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50KSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9pZigqZl9pdGVyLCAiIiwgdHJ1ZSkgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIC8qCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInAuU2VxSWQgKz0gMSIgPDwgZW5kbDsKLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImQgOj0gZGVmZXIuRGVmZXJyZWQoKSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicC5SZXFzW3AuU2VxSWRdID0gZCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgKi8KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZXJyID0gcC5TZW5kIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgdmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyByZXR1cm4gfSIgPDwgZW5kbDsKLSAgICAKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCAKLSAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiBwLlJlY3YiIDw8IGZ1bm5hbWUgPDwgIigpIiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCAKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQpIFNlbmQiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiKGVyciBvcy5FcnJvcikgeyIgPDwgZW5kbDsKLSAgICAKLSAgICBpbmRlbnRfdXAoKTsKLSAgICAKLSAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IHByaXZhdGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpICsgIkFyZ3MiOwotICAgIAotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKLSAgICBzdHJpbmcgYXJncyh0bXAoImFyZ3MiKSk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90IDo9IHAuT3V0cHV0UHJvdG9jb2wiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiBvcHJvdCAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3QgPSBwLlByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChwLlRyYW5zcG9ydCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHAuT3V0cHV0UHJvdG9jb2wgPSBvcHJvdCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwLlNlcUlkKysiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgdGhyaWZ0LkNBTEwsIHAuU2VxSWQpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBhcmdzIDw8ICIgOj0gTmV3IiA8PCBwdWJsaWNpemUoYXJnc25hbWUpIDw8ICIoKSIgPDwgZW5kbDsKLSAgICAKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCBhcmdzIDw8ICIuIiA8PCBwdWJsaWNpemUodmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSkgPDwgIiA9ICIgPDwgdmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOwotICAgIH0KLSAgICAKLSAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImVyciA9ICIgPDwgYXJncyA8PCAiLldyaXRlKG9wcm90KSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3QuVHJhbnNwb3J0KCkuRmx1c2goKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgCi0gICAgaWYgKHRydWUpIHsgLy8hKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSB8fCB0cnVlKSB7fQotICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IHByaXZhdGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpICsgIlJlc3VsdCI7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCkgUmVjdiIgPDwgcHVibGljaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwKLSAgICAgICAgICAgICAgICAgICAgIigpICgiOwotICAgICAgaWYoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAidmFsdWUgIiA8PCB0eXBlX3RvX2dvX3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiLCAiOwotICAgICAgfQotICAgICAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIHN0cmluZyBlcnJzID0gYXJndW1lbnRfbGlzdChleGNlcHRpb25zKTsKLSAgICAgIGlmKGVycnMuc2l6ZSgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgZXJycyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAKLSAgICAgICAgImVyciBvcy5FcnJvcikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAvLyBUT0RPKG1jc2xlZSk6IFZhbGlkYXRlIG1lc3NhZ2UgcmVwbHkgaGVyZSwgc2VxIGlkcyBldGMuCi0gICAgICAKLSAgICAgIHN0cmluZyByZXN1bHQodG1wKCJyZXN1bHQiKSk7Ci0gICAgICBzdHJpbmcgZXJyb3IodG1wKCJlcnJvciIpKTsKLSAgICAgIHN0cmluZyBlcnJvcjIodG1wKCJlcnJvciIpKTsKLSAgICAgIAotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaXByb3QgOj0gcC5JbnB1dFByb3RvY29sIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiBpcHJvdCA9PSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdCA9IHAuUHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHAuVHJhbnNwb3J0KSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBwLklucHV0UHJvdG9jb2wgPSBpcHJvdCIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiXywgbVR5cGVJZCwgc2VxSWQsIGVyciA6PSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIG1UeXBlSWQgPT0gdGhyaWZ0LkVYQ0VQVElPTiB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgZXJyb3IgPDwgIiA6PSB0aHJpZnQuTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uRGVmYXVsdCgpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgZXJyb3IyIDw8ICIsIGVyciA6PSAiIDw8IGVycm9yIDw8ICIuUmVhZChpcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgZXJyID0gaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgZXJyID0gIiA8PCBlcnJvcjIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIHAuU2VxSWQgIT0gc2VxSWQgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBlcnIgPSB0aHJpZnQuTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHRocmlmdC5CQURfU0VRVUVOQ0VfSUQsIFwicGluZyBmYWlsZWQ6IG91dCBvZiBzZXF1ZW5jZSByZXNwb25zZVwiKSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcmVzdWx0IDw8ICIgOj0gTmV3IiA8PCBwdWJsaWNpemUocmVzdWx0bmFtZSkgPDwgIigpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlcnIgPSAiIDw8IHJlc3VsdCA8PCAiLlJlYWQoaXByb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpcHJvdC5SZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ2YWx1ZSA9ICIgPDwgcmVzdWx0IDw8ICIuU3VjY2VzcyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIAotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAiIDw8IHJlc3VsdCA8PCAiLiIgPDwgcHVibGljaXplKCgqeF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHJlc3VsdCA8PCAiLiIgPDwgcHVibGljaXplKCgqeF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4iIDw8IGVuZGw7Ci0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvL2luZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNvbW1hbmQgbGluZSB0b29sIGZvciBtYWtpbmcgcmVtb3RlIHJlcXVlc3RzCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcmVtb3RlIGZvci4KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZW1vdGUodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZl9yZW1vdGVfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrc2VydmljZV9uYW1lXysiLyIrc2VydmljZV9uYW1lXysiLXJlbW90ZS5nbyI7Ci0gIG9mc3RyZWFtIGZfcmVtb3RlOwotICBmX3JlbW90ZS5vcGVuKGZfcmVtb3RlX25hbWUuY19zdHIoKSk7Ci0gIHN0cmluZyBzZXJ2aWNlX21vZHVsZSA9IGdldF9yZWFsX2dvX21vZHVsZShwcm9ncmFtXyk7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLSAgd2hpbGUoKGxvYyA9IHNlcnZpY2VfbW9kdWxlLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgc2VydmljZV9tb2R1bGUucmVwbGFjZShsb2MsIDEsIDEsICcvJyk7Ci0gIH0KLQotICBmX3JlbW90ZSA8PAotICAgIGdvX2F1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgaW5kZW50KCkgPDwgInBhY2thZ2UgbWFpbiIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImltcG9ydCAoIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICAgICAgXCJmbGFnXCIiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAgICAgICBcImZtdFwiIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICAgICAgXCJodHRwXCIiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAgICAgICBcIm5ldFwiIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICAgICAgXCJvc1wiIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICAgICAgXCJzdHJjb252XCIiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAgICAgICBcInRocmlmdFwiIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICAgICAgXCJ0aHJpZnRsaWIvIiA8PCBzZXJ2aWNlX21vZHVsZSA8PCAiXCIiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZnVuYyBVc2FnZSgpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50KG9zLlN0ZGVyciwgXCJVc2FnZSBvZiBcIiwgb3MuQXJnc1swXSwgXCIgWy1oIGhvc3Q6cG9ydF0gWy11IHVybF0gWy1mW3JhbWVkXV0gZnVuY3Rpb24gW2FyZzEgW2FyZzIuLi5dXTpcXG5cIikiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBmbGFnLlByaW50RGVmYXVsdHMoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnQob3MuU3RkZXJyLCBcIkZ1bmN0aW9uczpcXG5cIikiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bmNOYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgc3RyaW5nIGZ1bmNTaWduYXR1cmUoZnVuY3Rpb25fc2lnbmF0dXJlX2lmKCpmX2l0ZXIsICIiLCB0cnVlKSk7Ci0gICAgZl9yZW1vdGUgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnQob3MuU3RkZXJyLCBcIiAgIiA8PCBmdW5jTmFtZSA8PCBmdW5jU2lnbmF0dXJlLnN1YnN0cihmdW5jU2lnbmF0dXJlLmZpbmQoIigiKSkgPDwgIlxcblwiKSIgPDwgZW5kbDsKLSAgfQotICBmX3JlbW90ZSA8PAotICAgIGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnQob3MuU3RkZXJyLCBcIlxcblwiKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9zLkV4aXQoMCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZnVuYyBtYWluKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfcmVtb3RlIDw8Ci0gICAgaW5kZW50KCkgPDwgImZsYWcuVXNhZ2UgPSBVc2FnZSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ2YXIgaG9zdCBzdHJpbmciIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidmFyIHBvcnQgaW50IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInZhciBwcm90b2NvbCBzdHJpbmciIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidmFyIHVybFN0cmluZyBzdHJpbmciIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidmFyIGZyYW1lZCBib29sIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInZhciB1c2VIdHRwIGJvb2wiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidmFyIGhlbHAgYm9vbCIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ2YXIgdXJsIGh0dHAuVVJMIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInZhciB0cmFucyB0aHJpZnQuVFRyYW5zcG9ydCIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJmbGFnLlVzYWdlID0gVXNhZ2UiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZmxhZy5TdHJpbmdWYXIoJmhvc3QsIFwiaFwiLCBcImxvY2FsaG9zdFwiLCBcIlNwZWNpZnkgaG9zdCBhbmQgcG9ydFwiKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJmbGFnLkludFZhcigmcG9ydCwgXCJwXCIsIDkwOTAsIFwiU3BlY2lmeSBwb3J0XCIpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImZsYWcuU3RyaW5nVmFyKCZwcm90b2NvbCwgXCJQXCIsIFwiYmluYXJ5XCIsIFwiU3BlY2lmeSB0aGUgcHJvdG9jb2wgKGJpbmFyeSwgY29tcGFjdCwgc2ltcGxlanNvbiwganNvbilcIikiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZmxhZy5TdHJpbmdWYXIoJnVybFN0cmluZywgXCJ1XCIsIFwiXCIsIFwiU3BlY2lmeSB0aGUgdXJsXCIpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImZsYWcuQm9vbFZhcigmZnJhbWVkLCBcImZyYW1lZFwiLCBmYWxzZSwgXCJVc2UgZnJhbWVkIHRyYW5zcG9ydFwiKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJmbGFnLkJvb2xWYXIoJnVzZUh0dHAsIFwiaHR0cFwiLCBmYWxzZSwgXCJVc2UgaHR0cFwiKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJmbGFnLkJvb2xWYXIoJmhlbHAsIFwiaGVscFwiLCBmYWxzZSwgXCJTZWUgdXNhZ2Ugc3RyaW5nXCIpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImZsYWcuUGFyc2UoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiBoZWxwIHx8IGZsYWcuTkFyZygpID09IDAgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGZsYWcuVXNhZ2UoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiBsZW4odXJsU3RyaW5nKSA+IDAgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHVybCwgZXJyIDo9IGh0dHAuUGFyc2VVUkwodXJsU3RyaW5nKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgICAgZm10LkZwcmludChvcy5TdGRlcnIsIFwiRXJyb3IgcGFyc2luZyBVUkw6IFwiLCBlcnIuU3RyaW5nKCksIFwiXFxuXCIpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICBmbGFnLlVzYWdlKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaG9zdCA9IHVybC5Ib3N0IiA8PCBlbmRsIDw8Ci0gICAgLy9pbmRlbnQoKSA8PCAiICBpZiBsZW4odXJsLlBvcnQpID09IDAgeyB1cmwuUG9ydCA9IFwiODBcIjsgfSIgPDwgZW5kbCA8PAotICAgIC8vaW5kZW50KCkgPDwgIiAgcG9ydCA9IGludCh1cmwuUG9ydCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB1c2VIdHRwID0gbGVuKHVybC5TY2hlbWUpIDw9IDAgfHwgdXJsLlNjaGVtZSA9PSBcImh0dHBcIiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IGVsc2UgaWYgdXNlSHR0cCB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgXywgZXJyIDo9IGh0dHAuUGFyc2VVUkwoZm10LlNwcmludChcImh0dHA6Ly9cIiwgaG9zdCwgXCI6XCIsIHBvcnQpKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgICAgZm10LkZwcmludChvcy5TdGRlcnIsIFwiRXJyb3IgcGFyc2luZyBVUkw6IFwiLCBlcnIuU3RyaW5nKCksIFwiXFxuXCIpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICBmbGFnLlVzYWdlKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImNtZCA6PSBmbGFnLkFyZygwKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ2YXIgZXJyIG9zLkVycm9yIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIHVzZUh0dHAgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VEh0dHBDbGllbnQodXJsLlJhdykiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBhZGRyLCBlcnIgOj0gbmV0LlJlc29sdmVUQ1BBZGRyKFwidGNwXCIsIGZtdC5TcHJpbnQoaG9zdCwgXCI6XCIsIHBvcnQpKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgICAgZm10LkZwcmludChvcy5TdGRlcnIsIFwiRXJyb3IgcmVzb2x2aW5nIGFkZHJlc3NcIiwgZXJyLlN0cmluZygpKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgICAgb3MuRXhpdCgxKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB0cmFucywgZXJyID0gdGhyaWZ0Lk5ld1ROb25ibG9ja2luZ1NvY2tldEFkZHIoYWRkcikiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBpZiBmcmFtZWQgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgICAgdHJhbnMgPSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydCh0cmFucykiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludChvcy5TdGRlcnIsIFwiRXJyb3IgY3JlYXRpbmcgdHJhbnNwb3J0XCIsIGVyci5TdHJpbmcoKSkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcy5FeGl0KDEpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZGVmZXIgdHJhbnMuQ2xvc2UoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ2YXIgcHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInN3aXRjaCBwcm90b2NvbCB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImNhc2UgXCJjb21wYWN0XCI6IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBicmVhayIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJjYXNlIFwic2ltcGxlanNvblwiOiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSgpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgYnJlYWsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiY2FzZSBcImpzb25cIjoiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImNhc2UgXCJiaW5hcnlcIiwgXCJcIjoiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludChvcy5TdGRlcnIsIFwiSW52YWxpZCBwcm90b2NvbCBzcGVjaWZpZWQ6IFwiLCBwcm90b2NvbCwgXCJcXG5cIikiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3MuRXhpdCgxKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImNsaWVudCA6PSAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi5OZXciIDw8IHB1YmxpY2l6ZShzZXJ2aWNlX25hbWVfKSA8PCAiQ2xpZW50RmFjdG9yeSh0cmFucywgcHJvdG9jb2xGYWN0b3J5KSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiBlcnIgPSB0cmFucy5PcGVuKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnQob3MuU3RkZXJyLCBcIkVycm9yIG9wZW5pbmcgc29ja2V0IHRvIFwiLCBob3N0LCBcIjpcIiwgcG9ydCwgXCIgXCIsIGVyci5TdHJpbmcoKSkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcy5FeGl0KDEpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInN3aXRjaCBjbWQgeyIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLQotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOwotICAgIGludCBudW1fYXJncyA9IGFyZ3Muc2l6ZSgpOwotICAgIHN0cmluZyBmdW5jTmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOwotICAgIHN0cmluZyBwdWJOYW1lKHB1YmxpY2l6ZShmdW5jTmFtZSkpOwotICAgIAotICAgIGZfcmVtb3RlIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiY2FzZSBcIiIgPDwgZXNjYXBlX3N0cmluZyhmdW5jTmFtZSkgPDwgIlwiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3JlbW90ZSA8PAotICAgICAgaW5kZW50KCkgPDwgImlmIGZsYWcuTkFyZygpIC0gMSAhPSAiIDw8IG51bV9hcmdzIDw8ICIgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludChvcy5TdGRlcnIsIFwiIiA8PCBlc2NhcGVfc3RyaW5nKHB1Yk5hbWUpIDw8ICIgcmVxdWlyZXMgIiA8PCBudW1fYXJncyA8PCAiIGFyZ3NcXG5cIikiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGZsYWcuVXNhZ2UoKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7Ci0gICAgICBpbnQgZmxhZ0FyZyA9IGkgKyAxOwotICAgICAgdF90eXBlKiB0aGVfdHlwZShhcmdzW2ldLT5nZXRfdHlwZSgpKTsKLSAgICAgIHRfdHlwZSogdGhlX3R5cGUyKGdldF90cnVlX3R5cGUodGhlX3R5cGUpKTsKLSAgICAgIGlmKHRoZV90eXBlMi0+aXNfZW51bSgpKSB7Ci0gICAgICAgIGZfcmVtb3RlIDw8IAotICAgICAgICAgIGluZGVudCgpIDw8ICJ0bXAiIDw8IGkgPDwgIiwgZXJyIDo9IChzdHJjb252LkF0b2koZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpKSkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgcmV0dXJuIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi4iIDw8IHB1YmxpY2l6ZSh0aGVfdHlwZS0+Z2V0X25hbWUoKSkgPDwgIih0bXAiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgaWYodGhlX3R5cGUyLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIGUgPSAoKHRfYmFzZV90eXBlKil0aGVfdHlwZTIpLT5nZXRfYmFzZSgpOwotICAgICAgICBzdHJpbmcgZXJyKHRtcCgiZXJyIikpOwotICAgICAgICBzd2l0Y2goZSkgewotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDogYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgICBmX3JlbW90ZSA8PCAKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpIiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgICAgZl9yZW1vdGUgPDwgCi0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSA9PSBcInRydWVcIiIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICAgIGZfcmVtb3RlIDw8IAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAidG1wIiA8PCBpIDw8ICIsICIgPDwgZXJyIDw8ICIgOj0gKHN0cmNvbnYuQXRvaShmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikpKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBieXRlKHRtcCIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgICAgZl9yZW1vdGUgPDwgCi0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ0bXAiIDw8IGkgPDwgIiwgIiA8PCBlcnIgPDwgIiA6PSAoc3RyY29udi5BdG9pKGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSkpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGJ5dGUodG1wIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgICBmX3JlbW90ZSA8PCAKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgInRtcCIgPDwgaSA8PCAiLCAiIDw8IGVyciA8PCAiIDo9IChzdHJjb252LkF0b2koZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpKSkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gaW50MzIodG1wIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgICBmX3JlbW90ZSA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiwgIiA8PCBlcnIgPDwgIiA6PSAoc3RyY29udi5BdG9pNjQoZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpKSkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICAgIGZfcmVtb3RlIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiLCAiIDw8IGVyciA8PCAiIDo9IChzdHJjb252LkF0b2Y2NChmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikpKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdygiSW52YWxpZCBiYXNlIHR5cGUgaW4gZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUiKTsKLSAgICAgICAgfQotICAgICAgICAvL2ZfcmVtb3RlIDw8IHB1YmxpY2l6ZShhcmdzW2ldLT5nZXRfbmFtZSgpKSA8PCAiKHN0cmNvbnYuQXRvaShmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikpKSI7Ci0gICAgICB9IGVsc2UgaWYodGhlX3R5cGUyLT5pc19zdHJ1Y3QoKSkgewotICAgICAgICBzdHJpbmcgYXJnKHRtcCgiYXJnIikpOwotICAgICAgICBzdHJpbmcgbWJUcmFucyh0bXAoIm1iVHJhbnMiKSk7Ci0gICAgICAgIHN0cmluZyBlcnIxKHRtcCgiZXJyIikpOwotICAgICAgICBzdHJpbmcgZmFjdG9yeSh0bXAoImZhY3RvcnkiKSk7Ci0gICAgICAgIHN0cmluZyBqc1Byb3QodG1wKCJqc1Byb3QiKSk7Ci0gICAgICAgIHN0cmluZyBlcnIyKHRtcCgiZXJyIikpOwotICAgICAgICBzdGQ6OnN0cmluZyB0c3RydWN0X25hbWUocHVibGljaXplKHRoZV90eXBlLT5nZXRfbmFtZSgpKSk7Ci0gICAgICAgIGZfcmVtb3RlIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgYXJnIDw8ICIgOj0gZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgbWJUcmFucyA8PCAiIDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyTGVuKGxlbigiIDw8IGFyZyA8PCAiKSkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZGVmZXIgIiA8PCBtYlRyYW5zIDw8ICIuQ2xvc2UoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJfLCAiIDw8IGVycjEgPDwgIiA6PSAiIDw8IG1iVHJhbnMgPDwgIi5Xcml0ZVN0cmluZygiIDw8IGFyZyA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAiIDw8IGVycjEgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpICA8PCBmYWN0b3J5IDw8ICIgOj0gdGhyaWZ0Lk5ld1RTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBqc1Byb3QgPDwgIiA6PSAiIDw8IGZhY3RvcnkgPDwgIi5HZXRQcm90b2NvbCgiIDw8IG1iVHJhbnMgPDwgIikiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi5OZXciIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBlcnIyIDw8ICIgOj0gYXJndmFsdWUiIDw8IGkgPDwgIi5SZWFkKCIgPDwganNQcm90IDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyMiA8PCAiICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIGlmKHRoZV90eXBlMi0+aXNfY29udGFpbmVyKCkgfHwgdGhlX3R5cGUyLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIHN0cmluZyBhcmcodG1wKCJhcmciKSk7Ci0gICAgICAgIHN0cmluZyBtYlRyYW5zKHRtcCgibWJUcmFucyIpKTsKLSAgICAgICAgc3RyaW5nIGVycjEodG1wKCJlcnIiKSk7Ci0gICAgICAgIHN0cmluZyBmYWN0b3J5KHRtcCgiZmFjdG9yeSIpKTsKLSAgICAgICAgc3RyaW5nIGpzUHJvdCh0bXAoImpzUHJvdCIpKTsKLSAgICAgICAgc3RyaW5nIGVycjIodG1wKCJlcnIiKSk7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGFyZ05hbWUocHVibGljaXplKGFyZ3NbaV0tPmdldF9uYW1lKCkpKTsKLSAgICAgICAgZl9yZW1vdGUgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBhcmcgPDwgIiA6PSBmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBtYlRyYW5zIDw8ICIgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXJMZW4obGVuKCIgPDwgYXJnIDw8ICIpKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJkZWZlciAiIDw8IG1iVHJhbnMgPDwgIi5DbG9zZSgpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIl8sICIgPDwgZXJyMSA8PCAiIDo9ICIgPDwgbWJUcmFucyA8PCAiLldyaXRlU3RyaW5nKCIgPDwgYXJnIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyMSA8PCAiICE9IG5pbCB7ICIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8IGZhY3RvcnkgPDwgIiA6PSB0aHJpZnQuTmV3VFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8IGpzUHJvdCA8PCAiIDo9ICIgPDwgZmFjdG9yeSA8PCAiLkdldFByb3RvY29sKCIgPDwgbWJUcmFucyA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJjb250YWluZXJTdHJ1Y3QiIDw8IGkgPDwgIiA6PSAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi5OZXciIDw8IHB1Yk5hbWUgPDwgIkFyZ3MoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8IGVycjIgPDwgIiA6PSBjb250YWluZXJTdHJ1Y3QiIDw8IGkgPDwgIi5SZWFkRmllbGQiIDw8IChpICsgMSkgPDwgIigiIDw8IGpzUHJvdCA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAiIDw8IGVycjIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGNvbnRhaW5lclN0cnVjdCIgPDwgaSA8PCAiLiIgPDwgYXJnTmFtZSA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3coIkludmFsaWQgYXJndW1lbnQgdHlwZSBpbiBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSIpOwotICAgICAgICBzdHJpbmcgZXJyMSh0bXAoImVyciIpKTsKLSAgICAgICAgZl9yZW1vdGUgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiwgIiA8PCBlcnIxIDw8ICIgOj0gZXZhbChmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyMSA8PCAiICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaWYodGhlX3R5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgICAgICBmX3JlbW90ZSA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ2YWx1ZSIgPDwgaSA8PCAiIDo9ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLiIgPDwgcHVibGljaXplKHRoZV90eXBlLT5nZXRfbmFtZSgpKSA8PCAiKGFyZ3ZhbHVlIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9yZW1vdGUgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidmFsdWUiIDw8IGkgPDwgIiA6PSBhcmd2YWx1ZSIgPDwgaSA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBmX3JlbW90ZSA8PAotICAgICAgaW5kZW50KCkgPDwgImZtdC5QcmludChjbGllbnQuIiA8PCBwdWJOYW1lIDw8ICIoIjsKLSAgICBib29sIGFyZ0ZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9hcmdzOyArK2kpIHsKLSAgICAgIGlmIChhcmdGaXJzdCkgewotICAgICAgICBhcmdGaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9yZW1vdGUgPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGlmKGFyZ3NbaV0tPmdldF90eXBlKCktPmlzX2VudW0oKSkgewotICAgICAgICBmX3JlbW90ZSA8PCAidmFsdWUiIDw8IGk7Ci0gICAgICB9IGVsc2UgaWYoYXJnc1tpXS0+Z2V0X3R5cGUoKS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSBlID0gKCh0X2Jhc2VfdHlwZSopKGFyZ3NbaV0tPmdldF90eXBlKCkpKS0+Z2V0X2Jhc2UoKTsKLSAgICAgICAgc3dpdGNoKGUpIHsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6IGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBmX3JlbW90ZSA8PCAidmFsdWUiIDw8IGk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3coIkludmFsaWQgYmFzZSB0eXBlIGluIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy9mX3JlbW90ZSA8PCBwdWJsaWNpemUoYXJnc1tpXS0+Z2V0X25hbWUoKSkgPDwgIihzdHJjb252LkF0b2koZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpKSkiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9yZW1vdGUgPDwgInZhbHVlIiA8PCBpOwotICAgICAgfQotICAgIH0KLSAgICBmX3JlbW90ZSA8PAotICAgICAgIikpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZm10LlByaW50KFwiXFxuXCIpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYnJlYWsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotICBmX3JlbW90ZSA8PAotICAgIGluZGVudCgpIDw8ICJjYXNlIFwiXCI6IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludChvcy5TdGRlcnIsIFwiSW52YWxpZCBmdW5jdGlvbiBcIiwgY21kLCBcIlxcblwiKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICAKLSAgZl9yZW1vdGUgPDwgCi0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIAotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3JlbW90ZS5jbG9zZSgpOwotCi0gIC8vIE1ha2UgZmlsZSBleGVjdXRhYmxlLCBsb3ZlIHRoYXQgYml0d2lzZSBPUiBhY3Rpb24KLSAgY2htb2QoZl9yZW1vdGVfbmFtZS5jX3N0cigpLAotICAgICAgICAgIFNfSVJVU1IKLSAgICAgICAgfCBTX0lXVVNSCi0gICAgICAgIHwgU19JWFVTUgotI2lmbmRlZiBNSU5HVwotICAgICAgICB8IFNfSVJHUlAKLSAgICAgICAgfCBTX0lYR1JQCi0gICAgICAgIHwgU19JUk9USAotICAgICAgICB8IFNfSVhPVEgKLSNlbmRpZgotICApOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yX25ldyA9ICIiOwotICBzdHJpbmcgc2VydmljZU5hbWUocHVibGljaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSk7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgc2l6ZV90IGluZGV4ID0gZXh0ZW5kcy5yZmluZCgiLiIpOwotICAgIGlmKGluZGV4ICE9IHN0cmluZzo6bnBvcykgewotICAgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzLnN1YnN0cigwLCBpbmRleCArIDEpICsgcHVibGljaXplKGV4dGVuZHMuc3Vic3RyKGluZGV4ICsgMSkpICsgIlByb2Nlc3NvciI7Ci0gICAgICBleHRlbmRzX3Byb2Nlc3Nvcl9uZXcgPSBleHRlbmRzLnN1YnN0cigwLCBpbmRleCArIDEpICsgIk5ldyIgKyBwdWJsaWNpemUoZXh0ZW5kcy5zdWJzdHIoaW5kZXggKyAxKSkgKyAiUHJvY2Vzc29yIjsKLSAgICB9IGVsc2UgewotICAgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBwdWJsaWNpemUoZXh0ZW5kcykgKyAiUHJvY2Vzc29yIjsKLSAgICAgIGV4dGVuZHNfcHJvY2Vzc29yX25ldyA9ICJOZXciICsgZXh0ZW5kc19wcm9jZXNzb3I7Ci0gICAgfQotICB9Ci0gIHN0cmluZyBwU2VydmljZU5hbWUocHJpdmF0aXplKHNlcnZpY2VOYW1lKSk7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIHN0cmluZyBzZWxmKHRtcCgic2VsZiIpKTsKLSAgaWYoZXh0ZW5kc19wcm9jZXNzb3IuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ0eXBlICIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvciBzdHJ1Y3QgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgaGFuZGxlciBJIiA8PCBzZXJ2aWNlTmFtZSA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBwcm9jZXNzb3JNYXAgbWFwW3N0cmluZ110aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yKSBIYW5kbGVyKCkgSSIgPDwgc2VydmljZU5hbWUgPDwgIiB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcC5oYW5kbGVyIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yKSBBZGRUb1Byb2Nlc3Nvck1hcChrZXkgc3RyaW5nLCBwcm9jZXNzb3IgdGhyaWZ0LlRQcm9jZXNzb3JGdW5jdGlvbikgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcC5wcm9jZXNzb3JNYXBba2V5XSA9IHByb2Nlc3NvciIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcikgR2V0UHJvY2Vzc29yRnVuY3Rpb24oa2V5IHN0cmluZykgKHByb2Nlc3NvciB0aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uLCBleGlzdHMgYm9vbCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcHJvY2Vzc29yLCBleGlzdHMgPSBwLnByb2Nlc3Nvck1hcFtrZXldIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcHJvY2Vzc29yLCBleGlzdHMiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IpIFByb2Nlc3Nvck1hcCgpIG1hcFtzdHJpbmdddGhyaWZ0LlRQcm9jZXNzb3JGdW5jdGlvbiB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcC5wcm9jZXNzb3JNYXAiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcihoYW5kbGVyIEkiIDw8IHNlcnZpY2VOYW1lIDw8ICIpICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IgeyIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IHNlbGYgPDwgIiA6PSAmIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29ye2hhbmRsZXI6aGFuZGxlciwgcHJvY2Vzc29yTWFwOm1ha2UobWFwW3N0cmluZ110aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uKX0iIDw8IGVuZGw7Ci0gICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBlc2NhcGVkRnVuY05hbWUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKTsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBzZWxmIDw8ICIucHJvY2Vzc29yTWFwW1wiIiA8PCBlc2NhcGVkRnVuY05hbWUgPDwgIlwiXSA9ICYiIDw8IHBTZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIiA8PCBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAie2hhbmRsZXI6aGFuZGxlcn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIHN0cmluZyB4KHRtcCgieCIpKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgc2VsZiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yKSBQcm9jZXNzKGlwcm90LCBvcHJvdCB0aHJpZnQuVFByb3RvY29sKSAoc3VjY2VzcyBib29sLCBlcnIgdGhyaWZ0LlRFeGNlcHRpb24pIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIG5hbWUsIF8sIHNlcUlkLCBlcnIgOj0gaXByb3QuUmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBpZiBlcnIgIT0gbmlsIHsgcmV0dXJuIH0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHByb2Nlc3MsIG5hbWVGb3VuZCA6PSBwLkdldFByb2Nlc3NvckZ1bmN0aW9uKG5hbWUpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBpZiAhbmFtZUZvdW5kIHx8IHByb2Nlc3MgPT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICAgaXByb3QuU2tpcCh0aHJpZnQuU1RSVUNUKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICBpcHJvdC5SZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgICIgPDwgeCA8PCAiIDo9IHRocmlmdC5OZXdUQXBwbGljYXRpb25FeGNlcHRpb24odGhyaWZ0LlVOS05PV05fTUVUSE9ELCBcIlVua25vd24gZnVuY3Rpb24gXCIgKyBuYW1lKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0aHJpZnQuRVhDRVBUSU9OLCBzZXFJZCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICAgIiA8PCB4IDw8ICIuV3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgIG9wcm90LlRyYW5zcG9ydCgpLkZsdXNoKCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuIGZhbHNlLCAiIDw8IHggPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHByb2Nlc3MuUHJvY2VzcyhzZXFJZCwgaXByb3QsIG9wcm90KSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3Igc3RydWN0IHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHN1cGVyICoiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IpIEhhbmRsZXIoKSBJIiA8PCBzZXJ2aWNlTmFtZSA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBwLnN1cGVyLkhhbmRsZXIoKS4oSSIgPDwgc2VydmljZU5hbWUgPDwgIikiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IpIEFkZFRvUHJvY2Vzc29yTWFwKGtleSBzdHJpbmcsIHByb2Nlc3NvciB0aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBwLnN1cGVyLkFkZFRvUHJvY2Vzc29yTWFwKGtleSwgcHJvY2Vzc29yKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcikgR2V0UHJvY2Vzc29yRnVuY3Rpb24oa2V5IHN0cmluZykgKHByb2Nlc3NvciB0aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uLCBleGlzdHMgYm9vbCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHAuc3VwZXIuR2V0UHJvY2Vzc29yRnVuY3Rpb24oa2V5KSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcikgUHJvY2Vzc29yTWFwKCkgbWFwW3N0cmluZ110aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBwLnN1cGVyLlByb2Nlc3Nvck1hcCgpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IoaGFuZGxlciBJIiA8PCBzZXJ2aWNlTmFtZSA8PCAiKSAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgc2VsZiA8PCAiIDo9ICYiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3J7c3VwZXI6ICIgPDwgZXh0ZW5kc19wcm9jZXNzb3JfbmV3IDw8ICIoaGFuZGxlcil9IiA8PCBlbmRsOwotICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgZXNjYXBlZEZ1bmNOYW1lKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSk7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgc2VsZiA8PCAiLkFkZFRvUHJvY2Vzc29yTWFwKFwiIiA8PCBlc2NhcGVkRnVuY05hbWUgPDwgIlwiLCAmIiA8PCBwU2VydmljZU5hbWUgPDwgIlByb2Nlc3NvciIgPDwgcHVibGljaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIntoYW5kbGVyOmhhbmRsZXJ9KSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgc2VsZiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yKSBQcm9jZXNzKGlwcm90LCBvcHJvdCB0aHJpZnQuVFByb3RvY29sKSAoYm9vbCwgdGhyaWZ0LlRFeGNlcHRpb24pIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBwLnN1cGVyLlByb2Nlc3MoaXByb3QsIG9wcm90KSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotICAKLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgLy8gT3BlbiBmdW5jdGlvbgotICBzdHJpbmcgcHJvY2Vzc29yTmFtZSA9IHByaXZhdGl6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgKyAiUHJvY2Vzc29yIiArIHB1YmxpY2l6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOwotICAKLSAgc3RyaW5nIGFyZ3NuYW1lID0gcHVibGljaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiQXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gcHVibGljaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiUmVzdWx0IjsKLSAgCi0gIC8vdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIC8vY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ0eXBlICIgPDwgcHJvY2Vzc29yTmFtZSA8PCAiIHN0cnVjdCB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaGFuZGxlciBJIiA8PCBwdWJsaWNpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgcHJvY2Vzc29yTmFtZSA8PCAiKSBQcm9jZXNzKHNlcUlkIGludDMyLCBpcHJvdCwgb3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgKHN1Y2Nlc3MgYm9vbCwgZXJyIHRocmlmdC5URXhjZXB0aW9uKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiYXJncyA6PSBOZXciIDw8IGFyZ3NuYW1lIDw8ICIoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiBlcnIgPSBhcmdzLlJlYWQoaXByb3QpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC5SZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgeCA6PSB0aHJpZnQuTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHRocmlmdC5QUk9UT0NPTF9FUlJPUiwgZXJyLlN0cmluZygpKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCBlc2NhcGVfc3RyaW5nKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIlwiLCB0aHJpZnQuRVhDRVBUSU9OLCBzZXFJZCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB4LldyaXRlKG9wcm90KSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3QuVHJhbnNwb3J0KCkuRmx1c2goKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90LlJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmVzdWx0IDo9IE5ldyIgPDwgcmVzdWx0bmFtZSA8PCAiKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgIjsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaWYoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuU3VjY2VzcywgIjsKLSAgICB9Ci0gICAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBleGNlcHRpb25zLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LiIgPDwgcHVibGljaXplKHZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpKSA8PCAiLCAiOwotICAgIH0KLSAgfQotICAKLSAgCi0gIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgImVyciA9IHAuaGFuZGxlci4iIDw8IHB1YmxpY2l6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIoIjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCBwdWJsaWNpemUodmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIik7IGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHggOj0gdGhyaWZ0Lk5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0aHJpZnQuSU5URVJOQUxfRVJST1IsIFwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IGVzY2FwZV9zdHJpbmcodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiOiBcIiArIGVyci5TdHJpbmcoKSkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgZXNjYXBlX3N0cmluZyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICJcIiwgdGhyaWZ0LkVYQ0VQVElPTiwgc2VxSWQpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgeC5Xcml0ZShvcHJvdCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LlRyYW5zcG9ydCgpLkZsdXNoKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiBlcnIyIDo9IG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCBlc2NhcGVfc3RyaW5nKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIlwiLCB0aHJpZnQuUkVQTFksIHNlcUlkKTsgZXJyMiAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGVyciA9IGVycjIiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiBlcnIyIDo9IHJlc3VsdC5Xcml0ZShvcHJvdCk7IGVyciA9PSBuaWwgJiYgZXJyMiAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGVyciA9IGVycjIiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiBlcnIyIDo9IG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyBlcnIgPT0gbmlsICYmIGVycjIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBlcnIgPSBlcnIyIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgZXJyMiA6PSBvcHJvdC5UcmFuc3BvcnQoKS5GbHVzaCgpOyBlcnIgPT0gbmlsICYmIGVycjIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBlcnIgPSBlcnIyIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWUsIGVyciIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIC8qCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgImZ1bmMgKHAgKiIgPDwgcHVibGljaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSA8PCAiQ2xpZW50KSBXcml0ZVJlc3VsdHNTdWNjZXNzIiA8PCBwdWJsaWNpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PAotICAgICAgIihzdWNjZXNzIGJvb2wsIHJlc3VsdCAiIDw8IHB1YmxpY2l6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICJSZXN1bHQsIHNlcWlkIGludDMyLCBvcHJvdCB0aHJpZnQuVFByb3RvY29sKSAoZXJyIG9zLkVycm9yKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJyZXN1bHQuU3VjY2VzcyA9IHN1Y2Nlc3MiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IGVzY2FwZV9zdHJpbmcodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiXCIsIHRocmlmdC5SRVBMWSwgc2VxaWQpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJlc3VsdC5Xcml0ZShvcHJvdCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3QuVHJhbnNwb3J0KCkuRmx1c2goKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgCi0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgKi8KLSAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICAvKgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJmdW5jIChwICoiIDw8IHB1YmxpY2l6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgPDwgIkNsaWVudCkgV3JpdGVSZXN1bHRzRXhjZXB0aW9uIiA8PCBwdWJsaWNpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PAotICAgICAgIihlcnJvciAqIiA8PCBwdWJsaWNpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiLCByZXN1bHQgKiwgc2VxaWQsIG9wcm90KSAoZXJyIG9zLkVycm9yKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgLy8gS2luZGEgYWJzdXJkCi0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImV4Y2VwdCAiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6IiA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImVyciA9IG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCBlc2NhcGVfc3RyaW5nKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIlwiLCB0aHJpZnQuUkVQTFksIHNlcWlkKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyByZXR1cm4gZXJyIH0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJlcnIgPSByZXN1bHQuV3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IHJldHVybiBlcnIgfSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImVyciA9IG9wcm90LldyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IHJldHVybiBlcnIgfSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImVyciA9IG9wcm90LlRyYW5zcG9ydCgpLkZsdXNoKCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsgcmV0dXJuIGVyciB9IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0gICovCi19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGVyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29lcmNlRGF0YSkgewotICAodm9pZCkgaW5jbGFzczsKLSAgKHZvaWQpIGNvZXJjZURhdGE7Ci0gIHRfdHlwZSogb3JpZ190eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKG9yaWdfdHlwZSk7Ci0gIHN0cmluZyBuYW1lKHByZWZpeCArIHB1YmxpY2l6ZSh2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUodGZpZWxkLT5nZXRfbmFtZSgpKSkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7Ci0gIH0KLSAgc3RyaW5nIHYgPSB0bXAoInYiKTsKLSAgc3RyaW5nIGVycjIgPSB0bXAoImVyciIpOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgZGVjbGFyZSwgbmFtZSwgZXJyKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgdiA8PCAiLCAiIDw8IGVycjIgPDwgIiA6PSBpcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsKLSAgICAgICAgICBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBvdXQgPDwgIlJlYWRTdHJpbmcoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIlJlYWRCb29sKCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJSZWFkQnl0ZSgpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJSZWFkSTE2KCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIlJlYWRJMzIoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAiUmVhZEk2NCgpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJSZWFkRG91YmxlKCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gR28gbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIlJlYWRJMzIoKSI7Ci0gICAgfQotICAgIHN0cmluZyBzdHJ1Y3ROYW1lKCJcIlwiIik7Ci0gICAgaWYoIXByZWZpeC5zaXplKCkgfHwgcHJlZml4LmZpbmQoIi4iKSA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHN0cnVjdE5hbWUgPSAiXCJcIiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0cnVjdE5hbWUgPSBwcmVmaXggKyAiVGhyaWZ0TmFtZSgpIjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAiIDw8IGVycjIgPDwgIiAhPSBuaWwgeyByZXR1cm4gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZCgiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZmllbGQtPmdldF9rZXkoKSAgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIFwiIiA8PCBlc2NhcGVfc3RyaW5nKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiwgIiA8PCBzdHJ1Y3ROYW1lIDw8ICIsICIgPDwgZXJyMiA8PCAiKTsgfSIgPDwgZW5kbDsKLSAgICBpZighcHJlZml4LnNpemUoKSB8fCBwcmVmaXguZmluZCgiLiIpID09IHN0cmluZzo6bnBvcykgewotICAgICAgaWYodHlwZS0+aXNfZW51bSgpIHx8IG9yaWdfdHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA6PSAiIDw8IHB1YmxpY2l6ZShvcmlnX3R5cGUtPmdldF9uYW1lKCkpIDw8ICIoIjw8IHYgPDwgIikiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgOj0gIiA8PCB2IDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmKHR5cGUtPmlzX2VudW0oKSB8fCBvcmlnX3R5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAiIDw8IHB1YmxpY2l6ZShvcmlnX3R5cGUtPmdldF9uYW1lKCkpIDw8ICIoIjw8IHYgPDwgIikiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAiIDw8IHYgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICciICsgdHlwZS0+Z2V0X25hbWUoKSArICInIGZvciBmaWVsZCAnIiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICInIjsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBjYWxsaW5nIHJlYWQoKQotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGVycikgewotICAodm9pZCkgZXJyOwotICBzdHJpbmcgZXJyMih0bXAoImVyciIpKTsKLSAgc3RyaW5nIGVxKCIgOj0gIik7Ci0gIGlmKCFkZWNsYXJlKSB7Ci0gICAgZXEgPSAiID0gIjsKLSAgfQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgZXEgPDwgIk5ldyIgPDwgcHVibGljaXplKHR5cGVfbmFtZSh0c3RydWN0KSkgPDwgIigpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgZXJyMiA8PCAiIDo9ICIgPDwgcHJlZml4IDw8ICIuUmVhZChpcHJvdCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIyIDw8ICIgIT0gbmlsIHsgcmV0dXJuIHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkU3RydWN0KFwiIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZV9zdHJpbmcocHJlZml4ICsgdHN0cnVjdC0+Z2V0X25hbWUoKSkgPDwgIlwiLCAiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZXJyMiA8PCAiKTsgfVxuIjsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemUgYSBjb250YWluZXIgYnkgd3JpdGluZyBvdXQgdGhlIGhlYWRlciBmb2xsb3dlZCBieQotICogZGF0YSBhbmQgdGhlbiBhIGZvb3Rlci4KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICAgZGVjbGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlcnIpIHsKLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7Ci0gIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7Ci0gIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7Ci0KLSAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKLSAgdF9maWVsZCBma3R5cGUoZ190eXBlX2J5dGUsIGt0eXBlKTsKLSAgdF9maWVsZCBmdnR5cGUoZ190eXBlX2J5dGUsIHZ0eXBlKTsKLSAgdF9maWVsZCBmZXR5cGUoZ190eXBlX2J5dGUsIGV0eXBlKTsKLSAgCi0gIHN0cmluZyBlcSgiID0gIik7Ci0gIGlmKGRlY2xhcmUpCi0gICAgZXEgPSAiIDo9ICI7Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IGt0eXBlIDw8ICIsICIgPDwgdnR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIsICIgPDwgZXJyIDw8ICIgOj0gaXByb3QuUmVhZE1hcEJlZ2luKCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZCgiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAtMSA8PCAiLCBcIiIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZV9zdHJpbmcocHJlZml4KSA8PCAiXCIsIFwiXCIsICIgPDwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPDwgIikiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgZXEgPDwgInRocmlmdC5OZXdUTWFwKCIgPDwga3R5cGUgPDwgIiwgIiA8PCB2dHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIikiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIiwgIiA8PCBlcnIgPDwgIiA6PSBpcHJvdC5SZWFkU2V0QmVnaW4oKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IiAgcmV0dXJuIHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgPDwgIiwgXCIiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVfc3RyaW5nKHByZWZpeCkgPDwgIlwiLCBcIlwiLCAiIDw8IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyIDw8ICIpOyB9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgcHJlZml4IDw8IGVxIDw8ICJ0aHJpZnQuTmV3VFNldCgiIDw8IGV0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIiwgIiA8PCBlcnIgPDwgIiA6PSBpcHJvdC5SZWFkTGlzdEJlZ2luKCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCIgIHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKCIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xIDw8ICIsIFwiIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlX3N0cmluZyhwcmVmaXgpIDw8ICJcIiwgXCJcIiwgIiA8PCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCBlcSA8PCAidGhyaWZ0Lk5ld1RMaXN0KCIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIpIiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICciICsgdHR5cGUtPmdldF9uYW1lKCkgKyAiJyBmb3IgcHJlZml4ICciICsgcHJlZml4ICsgIiciOwotICB9Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImZvciAiIDw8IGkgPDwgIjo9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBzaXplIDw8ICI7ICIgPDwgaSA8PCAiKysgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgZGVjbGFyZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGRlY2xhcmUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBkZWNsYXJlLCBwcmVmaXgpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCBlcnIgPDwgIiA9IGlwcm90LlJlYWRNYXBFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsgcmV0dXJuIHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoIiAKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IC0xCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBcIiIgPDwgZXNjYXBlX3N0cmluZygoKHRfbWFwKil0dHlwZSktPmdldF9jcHBfbmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCAiIDw8ICJcIm1hcFwiLCAiIDw8IGVyciA8PCAiKTsgfSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IGVyciA8PCAiID0gaXByb3QuUmVhZFNldEVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyByZXR1cm4gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZCgiIAotICAgICAgICAgICAgICAgICAgICAgICAgPDwgLTEKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIFwiIiA8PCBlc2NhcGVfc3RyaW5nKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2NwcF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIsICIgPDwgIlwic2V0XCIsICIgPDwgZXJyIDw8ICIpOyB9IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IGVyciA8PCAiID0gaXByb3QuUmVhZExpc3RFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsgcmV0dXJuIHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoIiAKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IC0xCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBcIiIgPDwgZXNjYXBlX3N0cmluZygoKHRfbGlzdCopdHR5cGUpLT5nZXRfY3BwX25hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgIiA8PCAiXCJsaXN0XCIsIiA8PCBlcnIgPDwgIik7IH0iIDw8IGVuZGw7Ci0gIH0KLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgIGRlY2xhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZXJyKSB7Ci0gICh2b2lkKSBkZWNsYXJlOwotICAodm9pZCkgZXJyOwotICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSwgdHJ1ZSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwsIHRydWUpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIuU2V0KCIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpIiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFdyaXRlIGEgc2V0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICAgZGVjbGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlcnIpIHsKLSAgKHZvaWQpIGRlY2xhcmU7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIHRydWUsICIiLCBlcnIpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIuQWRkKCIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBXcml0ZSBhIGxpc3QgZWxlbWVudAotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgIGRlY2xhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlcnIpIHsKLSAgKHZvaWQpIGRlY2xhcmU7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCB0cnVlLCAiIiwgZXJyKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLlB1c2goIiA8PCBlbGVtIDw8ICIpIiA8PCBlbmRsOwotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZXJyKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgc3RyaW5nIG5hbWUocHJlZml4ICsgcHVibGljaXplKHZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgIGVyciA8PCAiID0gb3Byb3QuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdwotICAgICAgICAgICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgb3V0IDw8ICJXcml0ZVN0cmluZyhzdHJpbmcoIiA8PCBuYW1lIDw8ICIpKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIldyaXRlQm9vbChib29sKCIgPDwgbmFtZSA8PCAiKSkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJXcml0ZUJ5dGUoYnl0ZSgiIDw8IG5hbWUgPDwgIikpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJXcml0ZUkxNihpbnQxNigiIDw8IG5hbWUgPDwgIikpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJXcml0ZUkzMihpbnQzMigiIDw8IG5hbWUgPDwgIikpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJXcml0ZUk2NChpbnQ2NCgiIDw8IG5hbWUgPDwgIikpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJXcml0ZURvdWJsZShmbG9hdDY0KCIgPDwgbmFtZSA8PCAiKSkiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJXcml0ZUkzMihpbnQzMigiIDw8IG5hbWUgPDwgIikpIjsKLSAgICB9Ci0gICAgc3RyaW5nIHN0cnVjdE5hbWUgPSAocHJlZml4LnNpemUoKSkgPyBwcmVmaXggKyAiVGhyaWZ0TmFtZSgpIiA6ICJcIlwiIjsKLSAgICBvdXQgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsgcmV0dXJuIHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKCIgCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCB0ZmllbGQtPmdldF9rZXkoKQotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgXCIiIDw8IGVzY2FwZV9zdHJpbmcodGZpZWxkLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCAiIDw8IHN0cnVjdE5hbWUgPDwgIiwgIiA8PCBlcnIgPDwgIik7IH1cbiI7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgJyIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIicgZm9yIGZpZWxkICciICsgbmFtZSArICInIjsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlcnIpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgZXJyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiLldyaXRlKG9wcm90KSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVTdHJ1Y3QoIiAKLSAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIiIDw8IGVzY2FwZV9zdHJpbmcodHN0cnVjdC0+Z2V0X25hbWUoKSkgPDwgIlwiLCAiIDw8IGVyciA8PCAiKTsgfVxuIjsKLX0KLQotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZXJyKSB7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IGVyciA8PCAiID0gb3Byb3QuV3JpdGVNYXBCZWdpbigiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA8PCAiLkxlbigpKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsgcmV0dXJuIHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKCIgCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAtMQotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgXCIiIDw8IGVzY2FwZV9zdHJpbmcodHR5cGUtPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIsICIgPDwgIlwibWFwXCIsICIgPDwgZXJyIDw8ICIpOyB9XG4iOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgZXJyIDw8ICIgPSBvcHJvdC5Xcml0ZVNldEJlZ2luKCIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPDwgIi5MZW4oKSkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVGaWVsZCgiIAotICAgICAgICAgICAgICAgICAgICAgICAgPDwgLTEKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIFwiIiA8PCBlc2NhcGVfc3RyaW5nKHR0eXBlLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCAiIDw8ICJcInNldFwiLCAiIDw8IGVyciA8PCAiKTsgfVxuIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCBlcnIgPDwgIiA9IG9wcm90LldyaXRlTGlzdEJlZ2luKCIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4IDw8ICIuTGVuKCkpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyByZXR1cm4gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoIiAKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IC0xCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBcIiIgPDwgZXNjYXBlX3N0cmluZyh0dHlwZS0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgIiA8PCAiXCJsaXN0XCIsICIgPDwgZXJyIDw8ICIpOyB9XG4iOwotICB9IGVsc2UgewotICAgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAnIiArIHR0eXBlLT5nZXRfbmFtZSgpICsgIicgZm9yIHByZWZpeCAnIiArIHByZWZpeCArICInIjsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBzdHJpbmcgbWl0ZXIgPSB0bXAoIk1pdGVyIik7Ci0gICAgc3RyaW5nIGtpdGVyID0gdG1wKCJLaXRlciIpOwotICAgIHN0cmluZyB2aXRlciA9IHRtcCgiVml0ZXIiKTsKLSAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZm9yICIgPDwgbWl0ZXIgPDwgIiA6PSByYW5nZSAiIDw8IHByZWZpeCA8PCAiLkl0ZXIoKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGtpdGVyIDw8ICIsICIgPDwgdml0ZXIgPDwgIiA6PSAiIDw8IG1pdGVyIDw8ICIuS2V5KCkuKCIgPDwgdHlwZV90b19nb190eXBlKHRtYXAtPmdldF9rZXlfdHlwZSgpKSA8PCAiKSwgIiA8PCBtaXRlciA8PCAiLlZhbHVlKCkuKCIgPDwgdHlwZV90b19nb190eXBlKHRtYXAtPmdldF92YWxfdHlwZSgpKSA8PCAiKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCB0bWFwLCBraXRlciwgdml0ZXIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOwotICAgIHN0cmluZyBpdGVyID0gdG1wKCJJdGVyIik7Ci0gICAgc3RyaW5nIGl0ZXIyID0gdG1wKCJJdGVyIik7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIDo9ICIgPDwgcHJlZml4IDw8ICIuRnJvbnQoKTsgIiA8PCBpdGVyIDw8ICIgIT0gbmlsOyAiIDw8IGl0ZXIgPDwgIiA9ICIgPDwgaXRlciA8PCAiLk5leHQoKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGl0ZXIyIDw8ICIgOj0gIiA8PCBpdGVyIDw8ICIuVmFsdWUuKCIgPDwgdHlwZV90b19nb190eXBlKHRzZXQtPmdldF9lbGVtX3R5cGUoKSkgPDwgIikiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgdHNldCwgaXRlcjIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiSXRlciIpOwotICAgIHN0cmluZyBpdGVyMiA9IHRtcCgiSXRlciIpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImZvciAiIDw8IGl0ZXIgPDwgIiA6PSByYW5nZSAiIDw8IHByZWZpeCA8PCAiLkl0ZXIoKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGl0ZXIyIDw8ICIgOj0gIiA8PCBpdGVyIDw8ICIuKCIgPDwgdHlwZV90b19nb190eXBlKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpIDw8ICIpIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCB0bGlzdCwgaXRlcjIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCBlcnIgPDwgIiA9IG9wcm90LldyaXRlTWFwRW5kKCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVGaWVsZCgiIAotICAgICAgICAgICAgICAgICAgICAgICAgPDwgLTEKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIFwiIiA8PCBlc2NhcGVfc3RyaW5nKHR0eXBlLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCAiIDw8ICJcIm1hcFwiLCAiIDw8IGVyciA8PCAiKTsgfVxuIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IGVyciA8PCAiID0gb3Byb3QuV3JpdGVTZXRFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsgcmV0dXJuIHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKCIgCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAtMQotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgXCIiIDw8IGVzY2FwZV9zdHJpbmcodHR5cGUtPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIsICIgPDwgIlwic2V0XCIsICIgPDwgZXJyIDw8ICIpOyB9XG4iOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IGVyciA8PCAiID0gb3Byb3QuV3JpdGVMaXN0RW5kKCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVGaWVsZCgiIAotICAgICAgICAgICAgICAgICAgICAgICAgPDwgLTEKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIFwiIiA8PCBlc2NhcGVfc3RyaW5nKHR0eXBlLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCAiIDw8ICJcImxpc3RcIiwgIiA8PCBlcnIgPDwgIik7IH1cbiI7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGVycikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIiwgZXJyKTsKLQotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIiwgZXJyKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZXJyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCBlcnIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZXJyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIiwgZXJyKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnaXZlbiBzdHJ1Y3QuCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2RvY3N0cmluZyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3V0LCB0c3RydWN0LCB0c3RydWN0LCAiQXR0cmlidXRlcyIpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdpdmVuIGZ1bmN0aW9uLgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19kb2NzdHJpbmcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhvdXQsIHRmdW5jdGlvbiwgdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiUGFyYW1ldGVycyIpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIHN0cnVjdCBvciBmdW5jdGlvbi4KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fZG9jc3RyaW5nKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiAgICB0ZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3ViaGVhZGVyKSB7Ci0gIGJvb2wgaGFzX2RvYyA9IGZhbHNlOwotICBzdHJpbmdzdHJlYW0gc3M7Ci0gIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICBoYXNfZG9jID0gdHJ1ZTsKLSAgICBzcyA8PCB0ZG9jLT5nZXRfZG9jKCk7Ci0gIH0KLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICBpZiAoaGFzX2RvYykgewotICAgICAgc3MgPDwgZW5kbDsKLSAgICB9Ci0gICAgaGFzX2RvYyA9IHRydWU7Ci0gICAgc3MgPDwgc3ViaGVhZGVyIDw8ICI6XG4iOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKLSAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgewotICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7Ci0gICAgICBzcyA8PCAiIC0gIiA8PCBwdWJsaWNpemUodmFyaWFibGVfbmFtZV90b19nb19uYW1lKHAtPmdldF9uYW1lKCkpKTsKLSAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKLSAgICAgICAgc3MgPDwgIjogIiA8PCBwLT5nZXRfZG9jKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzcyA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChoYXNfZG9jKSB7Ci0gICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAotICAgICAgIi8qKlxuIiwKLSAgICAgICIgKiAiLCBzcy5zdHIoKSwKLSAgICAgICIgKi9cbiIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2VuZXJpYyBvYmplY3QuCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2RvY3N0cmluZyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYykgewotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAotICAgICAgIi8qKlxuIiwKLSAgICAgICIgKiIsIHRkb2MtPmdldF9kb2MoKSwKLSAgICAgICIgKi9cbiIpOwotICB9Ci19Ci0KLS8qKgotICogRGVjbGFyZXMgYW4gYXJndW1lbnQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAotICovCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OmRlY2xhcmVfYXJndW1lbnQodF9maWVsZCogdGZpZWxkKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZXN1bHQ7Ci0gIHJlc3VsdCA8PCBwdWJsaWNpemUodGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiPSI7Ci0gIGlmICh0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICByZXN1bHQgPDwgInRocmlmdF9zcGVjWyIgPDwKLSAgICAgIHRmaWVsZC0+Z2V0X2tleSgpIDw8ICJdWzRdIjsKLSAgfSBlbHNlIHsKLSAgICByZXN1bHQgPDwgIm5pbCI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgZGVmYXVsdCB2YWx1ZSwgcmV0dXJucyBuaWwgb3RoZXJ3aXNlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6cmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUodF9maWVsZCogdGZpZWxkLCBjb25zdCBzdHJpbmcmIG5hbWUpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICBpZiAodGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuIHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpLCBuYW1lKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gIm5pbCI7Ci0gIH0KLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgLy8gVE9ETyhtY3NsZWUpOiBOaXRwaWNreSwgbm8gJywnIGlmIGFyZ3VtZW50X2xpc3QgaXMgZW1wdHkKLSAgcmV0dXJuCi0gICAgcHVibGljaXplKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAKLSAgICAgICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGFuIGludGVyZmFjZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfaWYodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWRkT3NFcnJvcikgewotICAvLyBUT0RPKG1jc2xlZSk6IE5pdHBpY2t5LCBubyAnLCcgaWYgYXJndW1lbnRfbGlzdCBpcyBlbXB0eQotICBzdHJpbmcgc2lnbmF0dXJlID0gcHVibGljaXplKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiKCI7Ci0gIHNpZ25hdHVyZSArPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSAoIjsKLSAgdF90eXBlKiByZXQgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7Ci0gIHRfc3RydWN0KiBleGNlcHRpb25zID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIHN0cmluZyBlcnJzID0gYXJndW1lbnRfbGlzdChleGNlcHRpb25zKTsKLSAgc3RyaW5nIHJldHZhbCh0bXAoInJldHZhbCIpKTsKLSAgaWYoIXJldC0+aXNfdm9pZCgpKSB7Ci0gICAgc2lnbmF0dXJlICs9IHJldHZhbCArICIgIiArIHR5cGVfdG9fZ29fdHlwZShyZXQpOwotICAgIGlmKGFkZE9zRXJyb3IgfHwgZXJycy5zaXplKCk9PTApIHsKLSAgICAgIHNpZ25hdHVyZSArPSAiLCAiOwotICAgIH0KLSAgfQotICBpZihlcnJzLnNpemUoKT4wKSB7Ci0gICAgc2lnbmF0dXJlICs9IGVycnM7Ci0gICAgaWYoYWRkT3NFcnJvcikKLSAgICAgIHNpZ25hdHVyZSArPSAiLCAiOwotICB9Ci0gIGlmKGFkZE9zRXJyb3IpIHsKLSAgICBzaWduYXR1cmUgKz0gImVyciBvcy5FcnJvciI7Ci0gIH0KLSAgc2lnbmF0dXJlICs9ICIpIjsKLSAgcmV0dXJuIHNpZ25hdHVyZTsKLX0KLQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIAotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSB2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSArICIgIiArIHR5cGVfdG9fZ29fdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmICh0dHlwZS0+aXNfc2VydmljZSgpKSB7Ci0gICAgcmV0dXJuIGdldF9yZWFsX2dvX21vZHVsZShwcm9ncmFtKSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHJldHVybiBnZXRfcmVhbF9nb19tb2R1bGUocHJvZ3JhbSkgKyAiLnR0eXBlcy4iICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgZ28gdHlvZQotICovCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gInRocmlmdC5TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAidGhyaWZ0LkJPT0wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAidGhyaWZ0LkJZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJ0aHJpZnQuSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAidGhyaWZ0LkkzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gInRocmlmdC5JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJ0aHJpZnQuRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJ0aHJpZnQuSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJ0aHJpZnQuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAidGhyaWZ0Lk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gInRocmlmdC5TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAidGhyaWZ0LkxJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgZ28gdHlvZQotICovCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OnR5cGVfdG9fZ29fdHlwZSh0X3R5cGUqIHR5cGUpIHsKLSAgLy90eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAic3RyaW5nIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gImJvb2wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiYnl0ZSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gImludDE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiaW50MzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJpbnQ2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gImZsb2F0NjQiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gcHVibGljaXplKHR5cGUtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gc3RyaW5nKCIqIikgKyBwdWJsaWNpemUodHlwZS0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gInRocmlmdC5UTWFwIjsKLSAgICAvL3RfbWFwKiB0ID0gKHRfbWFwKil0eXBlOwotICAgIC8vc3RyaW5nIGtleVR5cGUgPSB0eXBlX3RvX2dvX3R5cGUodC0+Z2V0X2tleV90eXBlKCkpOwotICAgIC8vc3RyaW5nIHZhbHVlVHlwZSA9IHR5cGVfdG9fZ29fdHlwZSh0LT5nZXRfdmFsX3R5cGUoKSk7Ci0gICAgLy9yZXR1cm4gc3RyaW5nKCJtYXBbIikgKyBrZXlUeXBlICsgIl0iICsgdmFsdWVUeXBlOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJ0aHJpZnQuVFNldCI7Ci0gICAgLy90X3NldCogdCA9ICh0X3NldCopdHlwZTsKLSAgICAvL3N0cmluZyBlbGVtVHlwZSA9IHR5cGVfdG9fZ29fdHlwZSh0LT5nZXRfZWxlbV90eXBlKCkpOwotICAgIC8vcmV0dXJuIHN0cmluZygiW10iKSArIGVsZW1UeXBlOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAidGhyaWZ0LlRMaXN0IjsKLSAgICAvL3RfbGlzdCogdCA9ICh0X2xpc3QqKXR5cGU7Ci0gICAgLy9zdHJpbmcgZWxlbVR5cGUgPSB0eXBlX3RvX2dvX3R5cGUodC0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICAvL3JldHVybiBzdHJpbmcoIltdIikgKyBlbGVtVHlwZTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICByZXR1cm4gcHVibGljaXplKCgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3N5bWJvbGljKCkpOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2dvX3R5cGU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBnbyB0eW9lCi0gKi8KLWJvb2wgdF9nb19nZW5lcmF0b3I6OmNhbl9iZV9uaWwodF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIkludmFsaWQgVHlwZSBmb3IgY2FuX2JlX25pbCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIGNhbl9iZV9uaWw6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0KLQotLyoqIFNlZSB0aGUgY29tbWVudCBpbnNpZGUgZ2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24gZm9yIHdoYXQgdGhpcyBpcy4gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV90b19zcGVjX2FyZ3ModF90eXBlKiB0dHlwZSkgewotICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAibmlsIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIigiICsgdHlwZV9uYW1lKHR0eXBlKSArICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIi50aHJpZnRfc3BlYykiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiKCIgKwotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpICsgIiwiICsKLSAgICAgIHR5cGVfdG9fc3BlY19hcmdzKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpICsgIiwiICsKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSArICIsIiArCi0gICAgICB0eXBlX3RvX3NwZWNfYXJncygoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSArCi0gICAgICAiKSI7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIigiICsKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCIgKwotICAgICAgdHlwZV90b19zcGVjX2FyZ3MoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsKLSAgICAgICIpIjsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIigiICsKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIiwiICsKLSAgICAgIHR5cGVfdG9fc3BlY19hcmdzKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKwotICAgICAgIikiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX3NwZWNfYXJnczogIiArIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoZ28sICJHbyIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2hzX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZDE2ODYuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2hzX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE0ODggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLS8qKgotICogSGFza2VsbCBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfaHNfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X2hzX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgICh2b2lkKSBwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1ocyI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0ICAgICh0X2NvbnN0KiAgICB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbiAodF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotCi0gIHN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3QgICAgICAgICAgICAodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uIChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhlbHBlciA9IGZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF9yZWFkZXIgICAgIChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3Rfd3JpdGVyICAgICAob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfaHNfZnVuY3Rpb25faGVscGVycyAgKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlciAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAgKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICAgICAgICAob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0ICAgICAgIChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCk7Ci0KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZSAgICAgICAgICAob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUgPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0ICAgICAgICAgKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICAgICAgKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAgICAob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudCAgICAob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCAgIChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RyaW5nIGhzX2F1dG9nZW5fY29tbWVudCgpOwotICBzdHJpbmcgaHNfbGFuZ3VhZ2VfcHJhZ21hKCk7Ci0gIHN0cmluZyBoc19pbXBvcnRzKCk7Ci0KLSAgc3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgIHN0cmluZyBmdW5jdGlvbl9wcmVmaXggPSAiIik7Ci0KLSAgc3RyaW5nIGZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9ucyA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICBib29sIGlvID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWV0aG9kID0gZmFsc2UpOwotCi0gIHN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RyaW5nIHJlbmRlcl9oc190eXBlKHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNfcGFyZW5zID0gdHJ1ZSk7Ci0KLSBwcml2YXRlOgotICBvZnN0cmVhbSBmX3R5cGVzXzsKLSAgb2ZzdHJlYW0gZl9jb25zdHNfOwotICBvZnN0cmVhbSBmX3NlcnZpY2VfOwotICBvZnN0cmVhbSBmX2lmYWNlXzsKLSAgb2ZzdHJlYW0gZl9jbGllbnRfOwotfTsKLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIHBuYW1lID0gY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKTsKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwbmFtZSArICJfVHlwZXMuaHMiOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwbmFtZSArICJfQ29uc3RzLmhzIjsKLSAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl90eXBlc18gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKLSAgZl90eXBlc18gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKLSAgZl90eXBlc18gPDwgIm1vZHVsZSAiIDw8IHBuYW1lIDw8ICJfVHlwZXMgd2hlcmUiIDw8IGVuZGw7Ci0gIGZfdHlwZXNfIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOwotCi0gIGZfY29uc3RzXyA8PCBoc19sYW5ndWFnZV9wcmFnbWEoKSA8PCBlbmRsOwotICBmX2NvbnN0c18gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKLSAgZl9jb25zdHNfIDw8ICJtb2R1bGUgIiA8PCBwbmFtZSA8PCAiX0NvbnN0cyB3aGVyZSIgPDwgZW5kbDsKLSAgZl9jb25zdHNfIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOwotICBmX2NvbnN0c18gPDwgImltcG9ydCAiIDw8IHBuYW1lIDw8ICJfVHlwZXMiIDw8IGVuZGw7Ci19Ci0KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6aHNfbGFuZ3VhZ2VfcHJhZ21hKCkgewotICByZXR1cm4gc3RyaW5nKCJ7LSMgTEFOR1VBR0UgRGVyaXZlRGF0YVR5cGVhYmxlICMtfVxuIgotICAgICAgICAgICAgICAgICJ7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLW1pc3NpbmctZmllbGRzICMtfVxuIgotICAgICAgICAgICAgICAgICJ7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLW1pc3Npbmctc2lnbmF0dXJlcyAjLX1cbiIKLSAgICAgICAgICAgICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi1uYW1lLXNoYWRvd2luZyAjLX1cbiIKLSAgICAgICAgICAgICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi11bnVzZWQtaW1wb3J0cyAjLX1cbiIKLSAgICAgICAgICAgICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi11bnVzZWQtbWF0Y2hlcyAjLX1cbiIpOwotfQotCi0vKioKLSAqIEF1dG9nZW4nZCBjb21tZW50Ci0gKi8KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6aHNfYXV0b2dlbl9jb21tZW50KCkgewotICByZXR1cm4gc3RyaW5nKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIikgKwotICAgICAgICAgICAgICAgICItLSBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIikgICAgICAgICAgICAgICAgICAgICAgLS1cbiIgKwotICAgICAgICAgICAgICAgICItLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLVxuIiArCi0gICAgICAgICAgICAgICAgIi0tIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HIC0tXG4iICsKLSAgICAgICAgICAgICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCi0gKi8KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6aHNfaW1wb3J0cygpIHsKLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgc3RyaW5nIHJlc3VsdCA9IHN0cmluZygKLSAgICAgICJpbXBvcnQgUHJlbHVkZSAoIEJvb2woLi4pLCBFbnVtLCBEb3VibGUsIFN0cmluZywgTWF5YmUoLi4pLFxuIgotICAgICAgIiAgICAgICAgICAgICAgICAgRXEsIFNob3csIE9yZCxcbiIKLSAgICAgICIgICAgICAgICAgICAgICAgIHJldHVybiwgbGVuZ3RoLCBJTywgZnJvbUludGVncmFsLCBmcm9tRW51bSwgdG9FbnVtLFxuIgotICAgICAgIiAgICAgICAgICAgICAgICAgKCYmKSwgKHx8KSwgKD09KSwgKCsrKSwgKCQpLCAoLSkgKVxuIgotICAgICAgIlxuIgotICAgICAgImltcG9ydCBDb250cm9sLkV4Y2VwdGlvblxuIgotICAgICAgImltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuTGF6eVxuIgotICAgICAgImltcG9ydCBEYXRhLkludFxuIgotICAgICAgImltcG9ydCBEYXRhLlR5cGVhYmxlICggVHlwZWFibGUgKVxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5NYXAgYXMgTWFwXG4iCi0gICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLlNldCBhcyBTZXRcbiIKLSAgICAgICJcbiIKLSAgICAgICJpbXBvcnQgVGhyaWZ0XG4iCi0gICAgICAiXG4iKTsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKQotICAgIHJlc3VsdCArPSAiaW1wb3J0IHF1YWxpZmllZCAiICsgY2FwaXRhbGl6ZShpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSkgKyAiX1R5cGVzXG4iOwotCi0gIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKQotICAgIHJlc3VsdCArPSAiXG4iOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZQotICBmX3R5cGVzXy5jbG9zZSgpOwotICBmX2NvbnN0c18uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBFei4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgc3RyaW5nIHRuYW1lID0gY2FwaXRhbGl6ZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpOwotICBzdHJpbmcgdGRlZiA9IHJlbmRlcl9oc190eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpLCBmYWxzZSk7Ci0gIGluZGVudChmX3R5cGVzXykgPDwgInR5cGUgIiA8PCB0bmFtZSA8PCAiID0gIiA8PCB0ZGVmIDw8IGVuZGw7Ci0gIGZfdHlwZXNfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4KLSAqIHRoZSB2YWx1ZXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAiZGF0YSAiIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIgPSAiOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgIGZfdHlwZXNfIDw8IChmaXJzdCA/ICIiIDogInwiKTsKLSAgICBmX3R5cGVzXyA8PCBuYW1lOwotICAgIGZpcnN0ID0gZmFsc2U7Ci0gIH0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAiZGVyaXZpbmcgKFNob3csRXEsIFR5cGVhYmxlLCBPcmQpIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpOwotICBpbmRlbnQoZl90eXBlc18pIDw8ICJpbnN0YW5jZSBFbnVtICIgPDwgZW5hbWUgPDwgIiB3aGVyZSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAiZnJvbUVudW0gdCA9IGNhc2UgdCBvZiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgIGluZGVudChmX3R5cGVzXykgPDwgbmFtZSA8PCAiIC0+ICIgPDwgdmFsdWUgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChmX3R5cGVzXykgPDwgInRvRW51bSB0ID0gY2FzZSB0IG9mIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICBpbmRlbnQoZl90eXBlc18pIDw8IHZhbHVlIDw8ICIgLT4gIiA8PCBuYW1lIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAiXyAtPiB0aHJvdyBUaHJpZnRFeGNlcHRpb24iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0Y29uc3QtPmdldF9uYW1lKCkpOwotCi0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBpbmRlbnQoZl9jb25zdHNfKSA8PCBuYW1lIDw8ICIgOjogIiA8PCByZW5kZXJfaHNfdHlwZSh0eXBlLCBmYWxzZSkgPDwgZW5kbDsKLSAgaW5kZW50KGZfY29uc3RzXykgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8IGVuZGw7Ci0gIGZfY29uc3RzXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIG9zdHJpbmdzdHJlYW0gb3V0OwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0KLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gIlRydWUiIDogIkZhbHNlIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIG91dCA8PCAiKCIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIiA6OiBJbnQ4KSI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgb3V0IDw8ICIoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiIDo6IEludDE2KSI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgb3V0IDw8ICIoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiIDo6IEludDMyKSI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8ICIoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiIDo6IEludDY0KSI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICB0X2VudW0qIHRlbnVtID0gKHRfZW51bSopdHlwZTsKLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgaW50IHZhbCA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgICBpZiAodmFsID09IHZhbHVlLT5nZXRfaW50ZWdlcigpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHN0cmluZyBjbmFtZSA9IHR5cGVfbmFtZSh0eXBlKTsKLSAgICBpbmRlbnQob3V0KSA8PCBjbmFtZSA8PCAieyI7Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0KLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotCi0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKQotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotCi0gICAgICBzdHJpbmcgZm5hbWUgPSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICBzdHJpbmcgY29uc3RfdmFsdWUgPSByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotCi0gICAgICBvdXQgPDwgKGZpcnN0ID8gIiIgOiAiLCIpOwotICAgICAgb3V0IDw8ICJmXyIgPDwgY25hbWUgPDwgIl8iIDw8IGZuYW1lIDw8ICIgPSBKdXN0ICgiIDw8IGNvbnN0X3ZhbHVlIDw8ICIpIjsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0KLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotCi0gICAgb3V0IDw8ICIoTWFwLmZyb21MaXN0IFsiOwotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8IChmaXJzdCA/ICIiIDogIiwiKTsKLSAgICAgIG91dCA8PCAiKCIgPDwga2V5IDw8ICIsIiA8PCB2YWwgPDwgIikiOwotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9Ci0gICAgb3V0IDw8ICJdKSI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gdHlwZS0+aXNfbGlzdCgpCi0gICAgICAgID8gKCh0X2xpc3QqKSB0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpCi0gICAgICAgIDogKCh0X3NldCopIHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0KLSAgICBpZiAodHlwZS0+aXNfc2V0KCkpCi0gICAgICBvdXQgPDwgIihTZXQuZnJvbUxpc3QgIjsKLQotICAgIG91dCA8PCAiWyI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IChmaXJzdCA/ICIiIDogIiwiKTsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIl0iOwotCi0gICAgaWYgKHR5cGUtPmlzX3NldCgpKQotICAgICAgb3V0IDw8ICIpIjsKLQotICB9IGVsc2UgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSAic3RydWN0IgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfaHNfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0LCBidXQgYWxzbyBoYXMgYW4gZXhjZXB0aW9uIGRlY2xhcmF0aW9uLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfaHNfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgSGFza2VsbCBzdHJ1Y3QKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbixmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhlbHBlcikgewotICAodm9pZCkgaGVscGVyOwotICBzdHJpbmcgdG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJkYXRhICIgPDwgdG5hbWUgPDwgIiA9ICIgPDwgdG5hbWU7Ci0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwgInsiOwotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgc3RyaW5nIG1uYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgb3V0IDw8IChmaXJzdCA/ICIiIDogIiwiKTsKLSAgICAgIG91dCA8PCAiZl8iIDw8IHRuYW1lIDw8ICJfIiA8PCBtbmFtZSA8PCAiIDo6IE1heWJlICIgPDwgcmVuZGVyX2hzX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfQotICAgIG91dCA8PCAifSI7Ci0gIH0KLQotICBvdXQgPDwgIiBkZXJpdmluZyAoU2hvdyxFcSxPcmQsVHlwZWFibGUpIiA8PCBlbmRsOwotCi0gIGlmIChpc19leGNlcHRpb24pCi0gICAgb3V0IDw8ICJpbnN0YW5jZSBFeGNlcHRpb24gIiA8PCB0bmFtZSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2hzX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfaHNfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgcmVhZCBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBzbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgc3RyaW5nIHN0ciA9IHRtcCgiX3N0ciIpOwotICBzdHJpbmcgdCA9IHRtcCgiX3QiKTsKLSAgc3RyaW5nIGlkID0gdG1wKCJfaWQiKTsKLQotICBpbmRlbnQob3V0KSA8PCAicmVhZF8iIDw8IHNuYW1lIDw8ICJfZmllbGRzIGlwcm90IHJlY29yZCA9IGRvIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgaW5kZW50KG91dCkgPDwgIihfLCIgPDwgdCA8PCAiLCIgPDwgaWQgPDwgIikgPC0gcmVhZEZpZWxkQmVnaW4gaXByb3QiIDw8IGVuZGw7Ci0KLSAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhawotICBpbmRlbnQob3V0KSA8PCAiaWYgIiA8PCB0IDw8ICIgPT0gVF9TVE9QIHRoZW4gcmV0dXJuIHJlY29yZCBlbHNlIiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGlkIDw8ICIgb2YgIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbnQzMl90IGtleSA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOwotICAgIHN0cmluZyBldHlwZSA9IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIGluZGVudChvdXQpIDw8IGtleSA8PCAiIC0+ICIgPDwgImlmICIgPDwgdCA8PCAiID09ICIgPDwgZXR5cGUgPDwgIiB0aGVuIGRvIiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInMgPC0gIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsc3RyKTsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIHN0cmluZyBmbmFtZSA9IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOwotICAgIGluZGVudChvdXQpIDw8ICJyZWFkXyIgPDwgc25hbWUgPDwgIl9maWVsZHMgaXByb3QgcmVjb3Jke2ZfIiA8PCBzbmFtZSA8PCAiXyIgPDwgZm5hbWUgPDwgIj1KdXN0IHN9IiA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgImVsc2UgZG8iIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAic2tpcCBpcHJvdCAiIDw8IHQgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICJyZWFkXyIgPDwgc25hbWUgPDwgIl9maWVsZHMgaXByb3QgcmVjb3JkIiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICBpbmRlbnQob3V0KSA8PCAiXyAtPiBkbyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJza2lwIGlwcm90ICIgPDwgdCA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmVhZEZpZWxkRW5kIGlwcm90IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmVhZF8iIDw8IHNuYW1lIDw8ICJfZmllbGRzIGlwcm90IHJlY29yZCIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLQotICAvLyByZWFkCi0gIGluZGVudChvdXQpIDw8ICJyZWFkXyIgPDwgc25hbWUgPDwgIiBpcHJvdCA9IGRvIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgIl8gPC0gcmVhZFN0cnVjdEJlZ2luIGlwcm90IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmVjb3JkIDwtIHJlYWRfIiA8PCBzbmFtZSA8PCAiX2ZpZWxkcyBpcHJvdCAoIiA8PCBzbmFtZSA8PCAieyI7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8IChmaXJzdCA/ICIiIDogIiwiKTsKLSAgICBvdXQgPDwgImZfIiA8PCBzbmFtZSA8PCAiXyIgPDwgZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIj1Ob3RoaW5nIjsKLSAgICBmaXJzdCA9IGZhbHNlOwotICB9Ci0KLSAgb3V0IDw8ICJ9KSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInJlYWRTdHJ1Y3RFbmQgaXByb3QiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gcmVjb3JkIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBzdHJpbmcgc3RyID0gdG1wKCJfc3RyIik7Ci0gIHN0cmluZyBmID0gdG1wKCJfZiIpOwotCi0gIGluZGVudChvdXQpIDw8ICJ3cml0ZV8iIDw8IG5hbWUgPDwgIiBvcHJvdCByZWNvcmQgPSBkbyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ3cml0ZVN0cnVjdEJlZ2luIG9wcm90IFwiIiA8PCBuYW1lIDw8ICJcIiIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgotICAgIHN0cmluZyBtbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSBmXyIgPDwgbmFtZSA8PCAiXyIgPDwgbW5hbWUgPDwgIiByZWNvcmQgb2Yge05vdGhpbmcgLT4gcmV0dXJuICgpOyBKdXN0IF92IC0+IGRvIiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIndyaXRlRmllbGRCZWdpbiBvcHJvdCAoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsIgotICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBpbmRlbnQob3V0KTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAiX3YiKTsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8ICJ3cml0ZUZpZWxkRW5kIG9wcm90fSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgaW5kZW50KG91dCkgPDwgIndyaXRlRmllbGRTdG9wIG9wcm90IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAid3JpdGVTdHJ1Y3RFbmQgb3Byb3QiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiLmhzIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXyA8PCBoc19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pIDw8ICIgd2hlcmUiIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8gPDwgaHNfaW1wb3J0cygpIDw8IGVuZGw7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0IHF1YWxpZmllZCAiIDw8IGNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJfVHlwZXMiIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8gPDwgImltcG9ydCBxdWFsaWZpZWQgIiA8PCBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pIDw8ICJfSWZhY2UgYXMgSWZhY2UiIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLQotICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLS0gSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyAtLSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXyx0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX2hzX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0KLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotCi0gIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sJnJlc3VsdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfaWZhY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pICsgIl9JZmFjZS5ocyI7Ci0gIGZfaWZhY2VfLm9wZW4oZl9pZmFjZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfaWZhY2VfIDw8IGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGw7Ci0gIGZfaWZhY2VfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7Ci0KLSAgZl9pZmFjZV8gPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgIl9JZmFjZSB3aGVyZSIgPDwgZW5kbDsKLQotICBmX2lmYWNlXyA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKLSAgZl9pZmFjZV8gPDwgImltcG9ydCAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl9UeXBlcyIgPDwgZW5kbDsKLSAgZl9pZmFjZV8gPDwgZW5kbDsKLQotICBzdHJpbmcgc25hbWUgPSBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIHN0cmluZyBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLQotICAgIGluZGVudChmX2lmYWNlXykgPDwgImltcG9ydCAiIDw8IGV4dGVuZHMgPDwgIl9JZmFjZSIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9pZmFjZV8pIDw8ICJjbGFzcyAiIDw8IGV4dGVuZHMgPDwgIl9JZmFjZSBhID0+ICIgPDwgc25hbWUgPDwgIl9JZmFjZSBhIHdoZXJlIiA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KGZfaWZhY2VfKSA8PCAiY2xhc3MgIiA8PCBzbmFtZSA8PCAiX0lmYWNlIGEgd2hlcmUiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfdXAoKTsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnQgPSBmdW5jdGlvbl90eXBlKCpmX2l0ZXIsIHRydWUsIHRydWUsIHRydWUpOwotICAgIGluZGVudChmX2lmYWNlXykgPDwgZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6OiBhIC0+ICIgPDwgZnQgIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX2lmYWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uIE5vdGUgdGhhdCBpbiBIYXNrZWxsLCB0aGUgY2xpZW50IGRvZXNuJ3QgaW1wbGVtZW50IGlmYWNlLiBUaGlzIGlzIGJlY2F1c2UKLSAqIFRoZSBjbGllbnQgZG9lcyBub3QgKGFuZCBzaG91bGQgbm90IGhhdmUgdG8pIGRlYWwgd2l0aCBhcmd1bWVudHMgYmVpbmcgTm90aGluZy4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBmX2NsaWVudF9uYW1lID0gZ2V0X291dF9kaXIoKSArIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiX0NsaWVudC5ocyI7Ci0gIGZfY2xpZW50Xy5vcGVuKGZfY2xpZW50X25hbWUuY19zdHIoKSk7Ci0gIGZfY2xpZW50XyA8PCBoc19sYW5ndWFnZV9wcmFnbWEoKSA8PCBlbmRsOwotICBmX2NsaWVudF8gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXhwb3J0cyA9ICIiOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGV4cG9ydHMgKz0gKGZpcnN0ID8gIiIgOiAiLCIpOwotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGV4cG9ydHMgKz0gZGVjYXBpdGFsaXplKGZ1bm5hbWUpOwotICAgIGZpcnN0ID0gZmFsc2U7Ci0gIH0KLQotICBzdHJpbmcgc25hbWUgPSBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pOwotICBpbmRlbnQoZl9jbGllbnRfKSA8PCAibW9kdWxlICIgPDwgc25hbWUgPDwgIl9DbGllbnQoIiA8PCBleHBvcnRzIDw8ICIpIHdoZXJlIiA8PCBlbmRsOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgaW5kZW50KGZfY2xpZW50XykgPDwgImltcG9ydCAiIDw8IGV4dGVuZHMgPDwgIl9DbGllbnQiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiaW1wb3J0IERhdGEuSU9SZWYiIDw8IGVuZGw7Ci0gIGluZGVudChmX2NsaWVudF8pIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOwotICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiaW1wb3J0ICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX1R5cGVzIiA8PCBlbmRsOwotICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiaW1wb3J0ICIgPDwgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSA8PCBlbmRsOwotCi0gIC8vIERBVFMgUklURSBBIEdMT0JBTCBWQVIKLSAgaW5kZW50KGZfY2xpZW50XykgPDwgInNlcWlkID0gbmV3SU9SZWYgMCIgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICBzdHJpbmcgZmFyZ3MgPSAiIjsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikKLSAgICAgIGZhcmdzICs9ICIgYXJnXyIgKyBkZWNhcGl0YWxpemUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChmX2NsaWVudF8pIDw8IGRlY2FwaXRhbGl6ZShmdW5uYW1lKSA8PCAiIChpcCxvcCkiIDw8ICBmYXJncyA8PCAiID0gZG8iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KGZfY2xpZW50XykgPDwgICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiIG9wIiA8PCBmYXJnczsKLQotICAgIGZfY2xpZW50XyA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKQotICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIgaXAiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaW5kZW50KGZfY2xpZW50XykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIgb3AiIDw8IGZhcmdzIDw8ICIgPSBkbyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJzZXEgPC0gc2VxaWQiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfY2xpZW50XykgPDwgInNlcW4gPC0gcmVhZElPUmVmIHNlcSIgPDwgZW5kbDsKLSAgICBzdHJpbmcgYXJnc25hbWUgPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyIpOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgIHN0cmluZyBmbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAid3JpdGVNZXNzYWdlQmVnaW4gb3AgKFwiIiA8PCBmbmFtZSA8PCAiXCIsIE1fQ0FMTCwgc2VxbikiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfY2xpZW50XykgPDwgIndyaXRlXyIgPDwgYXJnc25hbWUgPDwgIiBvcCAoIiA8PCBhcmdzbmFtZSA8PCAieyI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgc3RyaW5nIGZpZWxkbmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgZl9jbGllbnRfIDw8IChmaXJzdCA/ICIiIDogIiwiKTsKLSAgICAgIGZfY2xpZW50XyA8PCAiZl8iIDw8IGFyZ3NuYW1lIDw8ICJfIiA8PCBmaWVsZG5hbWUgPDwgIj1KdXN0IGFyZ18iIDw8IGZpZWxkbmFtZTsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfQotICAgIGZfY2xpZW50XyA8PCAifSkiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCi0gICAgaW5kZW50KGZfY2xpZW50XykgPDwgIndyaXRlTWVzc2FnZUVuZCBvcCIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAidEZsdXNoIChnZXRUcmFuc3BvcnQgb3ApIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLQotICAgICAgc3RyaW5nIGZ1bm5hbWUgPSBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCBmdW5uYW1lLCAmbm9hcmdzKTsKLQotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgZnVubmFtZSA8PCAiIGlwID0gZG8iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgLy8gVE9ETyhtY3NsZWUpOiBWYWxpZGF0ZSBtZXNzYWdlIHJlcGx5IGhlcmUsIHNlcSBpZHMgZXRjLgotICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIihmbmFtZSwgbXR5cGUsIHJzZXFpZCkgPC0gcmVhZE1lc3NhZ2VCZWdpbiBpcCIgPDwgZW5kbDsKLSAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJpZiBtdHlwZSA9PSBNX0VYQ0VQVElPTiB0aGVuIGRvIiA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIiAgeCA8LSByZWFkQXBwRXhuIGlwIiA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIiAgcmVhZE1lc3NhZ2VFbmQgaXAiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiICB0aHJvdyB4IiA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIiAgZWxzZSByZXR1cm4gKCkiIDw8IGVuZGw7Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0KLSAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJyZXMgPC0gcmVhZF8iIDw8IHJlc3VsdG5hbWUgPDwgIiBpcCIgPDwgZW5kbDsKLSAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJyZWFkTWVzc2FnZUVuZCBpcCIgPDwgZW5kbDsKLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJjYXNlIGZfIiA8PCByZXN1bHRuYW1lIDw8ICJfc3VjY2VzcyByZXMgb2YiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJKdXN0IHYgLT4gcmV0dXJuIHYiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJOb3RoaW5nIC0+IGRvIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIH0KLQotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgc3RyaW5nIHhuYW1lID0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiY2FzZSBmXyIgPDwgcmVzdWx0bmFtZSA8PCAiXyIgPDwgeG5hbWUgPDwgIiByZXMgb2YiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJOb3RoaW5nIC0+IHJldHVybiAoKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIkp1c3QgX3YgLT4gdGhyb3cgX3YiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJyZXR1cm4gKCkiIDw8IGVuZGw7Ci0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0cmluZyB0bmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInRocm93IChBcHBFeG4gQUVfTUlTU0lOR19SRVNVTFQgXCIiIDw8IHRuYW1lIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotICB9Ci0KLSAgZl9jbGllbnRfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb2NfIGhhbmRsZXIgKGlwcm90LG9wcm90KSAobmFtZSx0eXAsc2VxaWQpID0gY2FzZSBuYW1lIG9mIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlwiIiA8PCBmbmFtZSA8PCAiXCIgLT4gcHJvY2Vzc18iIDw8IGRlY2FwaXRhbGl6ZShmbmFtZSkgPDwgIiAoc2VxaWQsaXByb3Qsb3Byb3QsaGFuZGxlcikiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIl8gLT4gIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBmX3NlcnZpY2VfIDw8IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgPDwgIi5wcm9jXyBoYW5kbGVyIChpcHJvdCxvcHJvdCkgKG5hbWUsdHlwLHNlcWlkKSIgPDwgZW5kbDsKLQotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgImRvIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2tpcCBpcHJvdCBUX1NUUlVDVCIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlYWRNZXNzYWdlRW5kIGlwcm90IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAid3JpdGVNZXNzYWdlQmVnaW4gb3Byb3QgKG5hbWUsTV9FWENFUFRJT04sc2VxaWQpIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAid3JpdGVBcHBFeG4gb3Byb3QgKEFwcEV4biBBRV9VTktOT1dOX01FVEhPRCAoXCJVbmtub3duIGZ1bmN0aW9uIFwiICsrIG5hbWUpKSIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIndyaXRlTWVzc2FnZUVuZCBvcHJvdCIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRGbHVzaCAoZ2V0VHJhbnNwb3J0IG9wcm90KSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY2VzcyBoYW5kbGVyIChpcHJvdCwgb3Byb3QpID0gZG8iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKG5hbWUsIHR5cCwgc2VxaWQpIDwtIHJlYWRNZXNzYWdlQmVnaW4gaXByb3QiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY18gaGFuZGxlciAoaXByb3Qsb3Byb3QpIChuYW1lLHR5cCxzZXFpZCkiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIFRydWUiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpIHRzZXJ2aWNlOwotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIHN0cmluZyBmdW5uYW1lID0gZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY2Vzc18iIDw8IGZ1bm5hbWUgPDwgIiAoc2VxaWQsIGlwcm90LCBvcHJvdCwgaGFuZGxlcikgPSBkbyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImFyZ3MgPC0gcmVhZF8iIDw8IGFyZ3NuYW1lIDw8ICIgaXByb3QiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVhZE1lc3NhZ2VFbmQgaXByb3QiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgc2l6ZV90IG4gPSB4Y2VwdGlvbnMuc2l6ZSgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQotICAgICAgbisrOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJycyA8LSByZXR1cm4gKCIgPDwgcmVzdWx0bmFtZTsKLQotICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBuOyBpKyspCi0gICAgICBmX3NlcnZpY2VfIDw8ICIgTm90aGluZyI7Ci0KLSAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXMgPC0gIjsKLSAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgeGNlcHRpb25zLnNpemUoKTsgaSsrKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIoQ29udHJvbC5FeGNlcHRpb24uY2F0Y2giIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKTsKLSAgICB9Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8ICIoZG8iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXyk7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKLSAgICBmX3NlcnZpY2VfIDw8ICJyZXMgPC0gIjsKLQotICBmX3NlcnZpY2VfIDw8ICJJZmFjZS4iIDw8IGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIgaGFuZGxlciI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQotICAgIGZfc2VydmljZV8gPDwgICIgKGZfIiA8PCBhcmdzbmFtZSA8PCAgIl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGFyZ3MpIjsKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHJze2ZfIiA8PCByZXN1bHRuYW1lIDw8ICJfc3VjY2Vzcz0gSnVzdCByZXN9IjsKLQotICB9IGVsc2UgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHJzIjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwICYmICF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKFxcZSAgLT4gIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiByc3tmXyIgPDwgcmVzdWx0bmFtZSA8PCAiXyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPUp1c3QgZX0iOwotCi0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiAoKSI7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgIikpIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiAoKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfICkgPDwgIndyaXRlTWVzc2FnZUJlZ2luIG9wcm90IChcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgTV9SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8gKSA8PCAid3JpdGVfIiA8PCByZXN1bHRuYW1lIDw8ICIgb3Byb3QgcmVzIiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXyApIDw8ICJ3cml0ZU1lc3NhZ2VFbmQgb3Byb3QiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfICkgPDwgInRGbHVzaCAoZ2V0VHJhbnNwb3J0IG9wcm90KSIgPDwgZW5kbDsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBpbmRlbnRfZG93bigpOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAodm9pZCkgcHJlZml4OwotICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LHR5cGUpOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKQotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFIjsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSk7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUpOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0KLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3QiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSA/ICJyZWFkQmluYXJ5IiA6ICJyZWFkU3RyaW5nIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgInJlYWRCb29sIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIG91dCA8PCAicmVhZEJ5dGUiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBvdXQgPDwgInJlYWRJMTYiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBvdXQgPDwgInJlYWRJMzIiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgInJlYWRJNjQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBvdXQgPDwgInJlYWREb3VibGUiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gICAgb3V0IDw8ICIgaXByb3QiOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgc3RyaW5nIGVuYW1lID0gY2FwaXRhbGl6ZSh0eXBlLT5nZXRfbmFtZSgpKTsKLSAgICBvdXQgPDwgIihkbyB7aSA8LSByZWFkSTMyIGlwcm90OyByZXR1cm4gJCB0b0VudW0gJCBmcm9tSW50ZWdyYWwgaX0pIjsKLQotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGNhbGxpbmcgcmVhZCgpCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSh0c3RydWN0LT5nZXRfbmFtZSgpKTsKLSAgb3V0IDw8ICIocmVhZF8iIDw8IG5hbWUgPDwgIiBpcHJvdCkiOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZSBhIGNvbnRhaW5lciBieSB3cml0aW5nIG91dCB0aGUgaGVhZGVyIGZvbGxvd2VkIGJ5Ci0gKiBkYXRhIGFuZCB0aGVuIGEgZm9vdGVyLgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlKSB7Ci0gIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOwotICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOwotICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOwotICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOwotICBzdHJpbmcgY29uID0gdG1wKCJfY29uIik7Ci0KLSAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKLSAgdF9maWVsZCBma3R5cGUoZ190eXBlX2J5dGUsIGt0eXBlKTsKLSAgdF9maWVsZCBmdnR5cGUoZ190eXBlX2J5dGUsIHZ0eXBlKTsKLSAgdF9maWVsZCBmZXR5cGUoZ190eXBlX2J5dGUsIGV0eXBlKTsKLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PCAiKGxldCB7ZiAwID0gcmV0dXJuIFtdOyBmIG4gPSBkbyB7ayA8LSAiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpOwotCi0gICAgb3V0IDw8ICI7IHYgPC0gIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKTsKLQotICAgIG91dCA8PCAiO3IgPC0gZiAobi0xKTsgcmV0dXJuICQgKGssdik6cn19IGluIGRvIHsoIiA8PCBrdHlwZSA8PCAiLCIgPDwgdnR5cGUgPDwgIiwiIDw8IHNpemUgPDwgIikgPC0gcmVhZE1hcEJlZ2luIGlwcm90OyBsIDwtIGYgIiA8PCBzaXplIDw8ICI7IHJldHVybiAkIE1hcC5mcm9tTGlzdCBsfSkiOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8ICIobGV0IHtmIDAgPSByZXR1cm4gW107IGYgbiA9IGRvIHt2IDwtICI7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7Ci0gICAgb3V0IDw8ICI7ciA8LSBmIChuLTEpOyByZXR1cm4gJCB2OnJ9fSBpbiBkbyB7KCIgPDwgZXR5cGUgPDwgIiwiIDw8IHNpemUgPDwgIikgPC0gcmVhZFNldEJlZ2luIGlwcm90OyBsIDwtIGYgIiA8PCBzaXplIDw8ICI7IHJldHVybiAkIFNldC5mcm9tTGlzdCBsfSkiOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG91dCA8PCAiKGxldCB7ZiAwID0gcmV0dXJuIFtdOyBmIG4gPSBkbyB7diA8LSAiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpOwotICAgIG91dCA8PCAiO3IgPC0gZiAobi0xKTsgcmV0dXJuICQgdjpyfX0gaW4gZG8geygiIDw8IGV0eXBlIDw8ICIsIiA8PCBzaXplIDw8ICIpIDwtIHJlYWRMaXN0QmVnaW4gaXByb3Q7IGYgIiA8PCBzaXplIDw8ICJ9KSI7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKQotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKQotICAgIG5hbWUgPSBkZWNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKTsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cKLSAgICAgICAgICAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgb3V0IDw8ICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkgPyAid3JpdGVCaW5hcnkiIDogIndyaXRlU3RyaW5nIikgPDwgIiBvcHJvdCAiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sIG9wcm90ICIgPDwgbmFtZTsKLSAgICAgICBicmVhazsKLQotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSBvcHJvdCAiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNiBvcHJvdCAiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMiBvcHJvdCAiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCBvcHJvdCAiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSBvcHJvdCAiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGhzIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBzdHJpbmcgZW5hbWUgPSBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpOwotICAgICAgb3V0IDw8ICJ3cml0ZUkzMiBvcHJvdCAoZnJvbUludGVncmFsICQgZnJvbUVudW0gIiA8PCBuYW1lIDw8ICIpIjsKLSAgICB9Ci0KLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBvdXQgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsICJ3cml0ZV8iKSA8PCAiIG9wcm90ICIgPDwgcHJlZml4OwotfQotCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBrID0gdG1wKCJfa2l0ZXIiKTsKLSAgICBzdHJpbmcgdiA9IHRtcCgiX3ZpdGVyIik7Ci0gICAgb3V0IDw8ICIobGV0IHtmIFtdID0gcmV0dXJuICgpOyBmICgoIiA8PCBrIDw8ICIsIiA8PCB2IDw8ICIpOnQpID0gZG8geyI7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaywgdik7Ci0gICAgb3V0IDw8ICI7ZiB0fX0gaW4gZG8ge3dyaXRlTWFwQmVnaW4gb3Byb3QgKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIixmcm9tSW50ZWdyYWwgJCBNYXAuc2l6ZSAiIDw8IHByZWZpeCA8PCAiKTsgZiAoTWFwLnRvTGlzdCAiIDw8IHByZWZpeCA8PCAiKTt3cml0ZU1hcEVuZCBvcHJvdH0pIjsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHN0cmluZyB2ID0gdG1wKCJfdml0ZXIiKTsKLSAgICBvdXQgPDwgIihsZXQge2YgW10gPSByZXR1cm4gKCk7IGYgKCIgPDwgdiA8PCAiOnQpID0gZG8geyI7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgdik7Ci0gICAgb3V0IDw8ICI7ZiB0fX0gaW4gZG8ge3dyaXRlU2V0QmVnaW4gb3Byb3QgKCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLGZyb21JbnRlZ3JhbCAkIFNldC5zaXplICIgPDwgcHJlZml4IDw8ICIpOyBmIChTZXQudG9MaXN0ICIgPDwgcHJlZml4IDw8ICIpO3dyaXRlU2V0RW5kIG9wcm90fSkiOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHN0cmluZyB2ID0gdG1wKCJfdml0ZXIiKTsKLSAgICBvdXQgPDwgIihsZXQge2YgW10gPSByZXR1cm4gKCk7IGYgKCIgPDwgdiA8PCAiOnQpID0gZG8geyI7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCB2KTsKLSAgICBvdXQgPDwgIjtmIHR9fSBpbiBkbyB7d3JpdGVMaXN0QmVnaW4gb3Byb3QgKCIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIixmcm9tSW50ZWdyYWwgJCBQcmVsdWRlLmxlbmd0aCAiIDw8IHByZWZpeCA8PCAiKTsgZiAiIDw8IHByZWZpeCA8PCAiO3dyaXRlTGlzdEVuZCBvcHJvdH0pIjsKLSAgfQotCi19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKLSAgb3V0IDw8ICJkbyB7IjsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCk7Ci0gIG91dCA8PCAiOyI7Ci0KLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCk7Ci0gIG91dCA8PCAifSI7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOwotfQotCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OmZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgb3B0aW9ucywgYm9vbCBpbywgYm9vbCBtZXRob2QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKG9wdGlvbnMpIHJlc3VsdCArPSAiTWF5YmUgIjsKLSAgICByZXN1bHQgKz0gcmVuZGVyX2hzX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBvcHRpb25zKTsKLSAgICByZXN1bHQgKz0gIiAtPiAiOwotICB9Ci0KLSAgaWYgKGZpZWxkcy5lbXB0eSgpICYmICFtZXRob2QpCi0gICAgcmVzdWx0ICs9ICIoKSAtPiAiOwotCi0gIGlmIChpbykKLSAgICByZXN1bHQgKz0gIklPICI7Ci0KLSAgcmVzdWx0ICs9IHJlbmRlcl9oc190eXBlKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpLCBpbyk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgc3RyaW5nIGZ1bmN0aW9uX3ByZWZpeCkgewotICBzdHJpbmcgcHJlZml4ID0gIiI7Ci0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotCi0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykKLSAgICBpZiAoIXR0eXBlLT5pc19zZXJ2aWNlKCkpCi0gICAgICBwcmVmaXggPSBjYXBpdGFsaXplKHByb2dyYW0tPmdldF9uYW1lKCkpICsgIl9UeXBlcy4iOwotCi0gIHJldHVybiBwcmVmaXggKyBmdW5jdGlvbl9wcmVmaXggKyBjYXBpdGFsaXplKHR0eXBlLT5nZXRfbmFtZSgpKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIFByb3RvY29sLnRfdHlwZSBlbnVtCi0gKi8KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDogICByZXR1cm4gIlRfVk9JRCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6IHJldHVybiAiVF9TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDogICByZXR1cm4gIlRfQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOiAgIHJldHVybiAiVF9CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjogICAgcmV0dXJuICJUX0kxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6ICAgIHJldHVybiAiVF9JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OiAgICByZXR1cm4gIlRfSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRTogcmV0dXJuICJUX0RPVUJMRSI7Ci0gICAgfQotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUX0kzMiI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUX1NUUlVDVCI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVF9NQVAiOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRfU0VUIjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVF9MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhbiBoYXNrZWxsIHR5cGUKLSAqLwotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpyZW5kZXJfaHNfdHlwZSh0X3R5cGUqIHR5cGUsIGJvb2wgbmVlZHNfcGFyZW5zKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdHJpbmcgdHlwZV9yZXByOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOiAgIHJldHVybiAiKCkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOiByZXR1cm4gKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSA/ICJCeXRlU3RyaW5nIiA6ICJTdHJpbmciKTsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6ICAgcmV0dXJuICJCb29sIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6ICAgcmV0dXJuICJJbnQ4IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjogICAgcmV0dXJuICJJbnQxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6ICAgIHJldHVybiAiSW50MzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OiAgICByZXR1cm4gIkludDY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRTogcmV0dXJuICJEb3VibGUiOwotICAgIH0KLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiBjYXBpdGFsaXplKCgodF9lbnVtKil0eXBlKS0+Z2V0X25hbWUoKSk7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuIHR5cGVfbmFtZSgodF9zdHJ1Y3QqKXR5cGUpOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgdHlwZV9yZXByID0gIk1hcC5NYXAgIiArIHJlbmRlcl9oc190eXBlKGt0eXBlLCB0cnVlKSArICIgIiArIHJlbmRlcl9oc190eXBlKHZ0eXBlLCB0cnVlKTsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgdHlwZV9yZXByID0gIlNldC5TZXQgIiArIHJlbmRlcl9oc190eXBlKGV0eXBlLCB0cnVlKSA7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgcmV0dXJuICJbIiArIHJlbmRlcl9oc190eXBlKGV0eXBlLCBmYWxzZSkgKyAiXSI7Ci0KLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICByZXR1cm4gbmVlZHNfcGFyZW5zID8gIigiICsgdHlwZV9yZXByICsgIikiIDogdHlwZV9yZXByOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGhzLCAiSGFza2VsbCIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2NiOTcyLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDY0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8bWFwPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgInRfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBIVE1MIGNvZGUgZ2VuZXJhdG9yCi0gKgotICogbW9zdGx5IGNvcHkvcGFzdGluZy90d2Vha2luZyBmcm9tIG1jc2xlZSdzIHdvcmsuCi0gKi8KLWNsYXNzIHRfaHRtbF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9odG1sX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIHBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOyAgCi0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4taHRtbCI7Ci0gICAgZXNjYXBlXy5jbGVhcigpOwotICAgIGVzY2FwZV9bJyYnXSAgPSAiJmFtcDsiOwotICAgIGVzY2FwZV9bJzwnXSAgPSAiJmx0OyI7Ci0gICAgZXNjYXBlX1snPiddICA9ICImZ3Q7IjsKLSAgICBlc2NhcGVfWyciJ10gID0gIiZxdW90OyI7Ci0gICAgZXNjYXBlX1snXCcnXSA9ICImYXBvczsiOwotICB9Ci0KLSAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtKCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbV90b2MoKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3codF9wcm9ncmFtKiB0cHJvZyk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93cyh0X3Byb2dyYW0qIHRwcm9nLAotICAgICAgICAgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj4mIGZpbmlzaGVkKTsKLSAgdm9pZCBnZW5lcmF0ZV9pbmRleCgpOwotICB2b2lkIGdlbmVyYXRlX2NzcygpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICh0X2NvbnN0KiAgICB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogICB0eGNlcHRpb24pOwotCi0gIHZvaWQgcHJpbnRfZG9jICAgICAgICAodF9kb2MqIHRkb2MpOwotICBpbnQgIHByaW50X3R5cGUgICAgICAgKHRfdHlwZSogdHR5cGUpOwotICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7Ci0KLSAgc3RkOjpvZnN0cmVhbSBmX291dF87Ci19OwotCi0vKioKLSAqIEVtaXRzIHRoZSBUYWJsZSBvZiBDb250ZW50cyBsaW5rcyBhdCB0aGUgdG9wIG9mIHRoZSBtb2R1bGUncyBwYWdlCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbV90b2MoKSB7Ci0gIGZfb3V0XyA8PCAiPHRhYmxlPjx0cj48dGg+TW9kdWxlPC90aD48dGg+U2VydmljZXM8L3RoPiIKLSAgIDw8ICI8dGg+RGF0YSB0eXBlczwvdGg+PHRoPkNvbnN0YW50czwvdGg+PC90cj4iIDw8IGVuZGw7Ci0gIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyhwcm9ncmFtXyk7Ci0gIGZfb3V0XyA8PCAiPC90YWJsZT4iIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBSZWN1cnNlcyB0aHJvdWdoIGZyb20gdGhlIHByb3ZpZGVkIHByb2dyYW0gYW5kIGdlbmVyYXRlcyBhIFRvQyByb3cKLSAqIGZvciBlYWNoIGRpc2NvdmVyZWQgcHJvZ3JhbSBleGFjdGx5IG9uY2UgYnkgbWFpbnRhaW5pbmcgdGhlIGxpc3Qgb2YKLSAqIGNvbXBsZXRlZCByb3dzIGluICdmaW5pc2hlZCcKLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHRfcHJvZ3JhbSogdHByb2csCi0gICAgICAgICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiYgZmluaXNoZWQpIHsKLSAgZm9yICh2ZWN0b3I8dF9wcm9ncmFtKj46Oml0ZXJhdG9yIGl0ZXIgPSBmaW5pc2hlZC5iZWdpbigpOwotICAgICAgIGl0ZXIgIT0gZmluaXNoZWQuZW5kKCk7IGl0ZXIrKykgewotICAgIGlmICh0cHJvZy0+Z2V0X3BhdGgoKSA9PSAoKml0ZXIpLT5nZXRfcGF0aCgpKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0gIGZpbmlzaGVkLnB1c2hfYmFjayh0cHJvZyk7Ci0gIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyh0cHJvZyk7Ci0gIHZlY3Rvcjx0X3Byb2dyYW0qPiBpbmNsdWRlcyA9IHRwcm9nLT5nZXRfaW5jbHVkZXMoKTsKLSAgZm9yICh2ZWN0b3I8dF9wcm9ncmFtKj46Oml0ZXJhdG9yIGl0ZXIgPSBpbmNsdWRlcy5iZWdpbigpOwotICAgICAgIGl0ZXIgIT0gaW5jbHVkZXMuZW5kKCk7IGl0ZXIrKykgewotICAgIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvd3MoKml0ZXIsIGZpbmlzaGVkKTsKLSAgfQotfQotCi0vKioKLSAqIEVtaXRzIHRoZSBUYWJsZSBvZiBDb250ZW50cyBsaW5rcyBhdCB0aGUgdG9wIG9mIHRoZSBtb2R1bGUncyBwYWdlCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93KHRfcHJvZ3JhbSogdHByb2cpIHsKLSAgc3RyaW5nIGZuYW1lID0gdHByb2ctPmdldF9uYW1lKCkgKyAiLmh0bWwiOwotICBmX291dF8gPDwgIjx0cj4iIDw8IGVuZGwgPDwgIjx0ZD4iIDw8IHRwcm9nLT5nZXRfbmFtZSgpIDw8ICI8L3RkPjx0ZD4iOwotICBpZiAoIXRwcm9nLT5nZXRfc2VydmljZXMoKS5lbXB0eSgpKSB7Ci0gICAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gdHByb2ctPmdldF9zZXJ2aWNlcygpOwotICAgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKLSAgICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gZ2V0X3NlcnZpY2VfbmFtZSgqc3ZfaXRlcik7Ci0gICAgICBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IGZuYW1lIDw8ICIjU3ZjXyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCi0gICAgICAgIDw8ICI8L2E+PGJyLz4iIDw8IGVuZGw7Ci0gICAgICBmX291dF8gPDwgIjx1bD4iIDw8IGVuZGw7Ci0gICAgICBtYXA8c3RyaW5nLHN0cmluZz4gZm5faHRtbDsKLSAgICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gKCpzdl9pdGVyKS0+Z2V0X2Z1bmN0aW9ucygpOwotICAgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlcjsKLSAgICAgIGZvciAoZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmbl9pdGVyKSB7Ci0gICAgICAgIHN0cmluZyBmbl9uYW1lID0gKCpmbl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgICAgc3RyaW5nIGh0bWwgPSAiPGxpPjxhIGhyZWY9XCIiICsgZm5hbWUgKyAiI0ZuXyIgKyBuYW1lICsgIl8iICsKLSAgICAgICAgICBmbl9uYW1lICsgIlwiPiIgKyBmbl9uYW1lICsgIjwvYT48L2xpPiI7Ci0gICAgICAgIGZuX2h0bWwuaW5zZXJ0KHBhaXI8c3RyaW5nLHN0cmluZz4oZm5fbmFtZSwgaHRtbCkpOwotICAgICAgfQotICAgICAgZm9yIChtYXA8c3RyaW5nLHN0cmluZz46Oml0ZXJhdG9yIGh0bWxfaXRlciA9IGZuX2h0bWwuYmVnaW4oKTsKLSAgICAgICAgaHRtbF9pdGVyICE9IGZuX2h0bWwuZW5kKCk7IGh0bWxfaXRlcisrKSB7Ci0gICAgICAgIGZfb3V0XyA8PCBodG1sX2l0ZXItPnNlY29uZCA8PCBlbmRsOwotICAgICAgfQotICAgICAgZl9vdXRfIDw8ICI8L3VsPiIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZl9vdXRfIDw8ICI8L3RkPiIgPDwgZW5kbCA8PCAiPHRkPiI7Ci0gIG1hcDxzdHJpbmcsc3RyaW5nPiBkYXRhX3R5cGVzOwotICBpZiAoIXRwcm9nLT5nZXRfZW51bXMoKS5lbXB0eSgpKSB7Ci0gICAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gdHByb2ctPmdldF9lbnVtcygpOwotICAgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKLSAgICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCplbl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIC8vIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgZm5hbWUgPDwgIiNFbnVtXyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCi0gICAgICAvLyA8PCAgIjwvYT48YnIvPiIgPDwgZW5kbDsKLSAgICAgIHN0cmluZyBodG1sID0gIjxhIGhyZWY9XCIiICsgZm5hbWUgKyAiI0VudW1fIiArIG5hbWUgKyAiXCI+IiArIG5hbWUgKwotICAgICAgICAiPC9hPiI7Ci0gICAgICBkYXRhX3R5cGVzLmluc2VydChwYWlyPHN0cmluZyxzdHJpbmc+KG5hbWUsIGh0bWwpKTsKLSAgICB9Ci0gIH0KLSAgaWYgKCF0cHJvZy0+Z2V0X3R5cGVkZWZzKCkuZW1wdHkoKSkgewotICAgIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHRwcm9nLT5nZXRfdHlwZWRlZnMoKTsKLSAgICB2ZWN0b3I8dF90eXBlZGVmKj46Oml0ZXJhdG9yIHRkX2l0ZXI7Ci0gICAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqdGRfaXRlciktPmdldF9zeW1ib2xpYygpOwotICAgICAgLy8gZl9vdXRfIDw8ICI8YSBocmVmPVwiIiA8PCBmbmFtZSA8PCAiI1R5cGVkZWZfIiA8PCBuYW1lIDw8ICJcIj4iIDw8IG5hbWUKLSAgICAgIC8vIDw8ICI8L2E+PGJyLz4iIDw8IGVuZGw7Ci0gICAgICBzdHJpbmcgaHRtbCA9ICI8YSBocmVmPVwiIiArIGZuYW1lICsgIiNUeXBlZGVmXyIgKyBuYW1lICsgIlwiPiIgKyBuYW1lICsKLSAgICAgICAgIjwvYT4iOwotICAgICAgZGF0YV90eXBlcy5pbnNlcnQocGFpcjxzdHJpbmcsc3RyaW5nPihuYW1lLCBodG1sKSk7Ci0gICAgfQotICB9Ci0gIGlmICghdHByb2ctPmdldF9vYmplY3RzKCkuZW1wdHkoKSkgewotICAgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSB0cHJvZy0+Z2V0X29iamVjdHMoKTsKLSAgICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOwotICAgIGZvciAob19pdGVyID0gb2JqZWN0cy5iZWdpbigpOyBvX2l0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytvX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCpvX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgLy9mX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IGZuYW1lIDw8ICIjU3RydWN0XyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCi0gICAgICAvLzw8ICI8L2E+PGJyLz4iIDw8IGVuZGw7Ci0gICAgICBzdHJpbmcgaHRtbCA9ICI8YSBocmVmPVwiIiArIGZuYW1lICsgIiNTdHJ1Y3RfIiArIG5hbWUgKyAiXCI+IiArIG5hbWUgKwotICAgICAgICAiPC9hPiI7Ci0gICAgICBkYXRhX3R5cGVzLmluc2VydChwYWlyPHN0cmluZyxzdHJpbmc+KG5hbWUsIGh0bWwpKTsKLSAgICB9Ci0gIH0KLSAgZm9yIChtYXA8c3RyaW5nLHN0cmluZz46Oml0ZXJhdG9yIGR0X2l0ZXIgPSBkYXRhX3R5cGVzLmJlZ2luKCk7Ci0gICAgICAgZHRfaXRlciAhPSBkYXRhX3R5cGVzLmVuZCgpOyBkdF9pdGVyKyspIHsKLSAgICBmX291dF8gPDwgZHRfaXRlci0+c2Vjb25kIDw8ICI8YnIvPiIgPDwgZW5kbDsKLSAgfQotICBmX291dF8gPDwgIjwvdGQ+IiA8PCBlbmRsIDw8ICI8dGQ+PGNvZGU+IjsKLSAgaWYgKCF0cHJvZy0+Z2V0X2NvbnN0cygpLmVtcHR5KCkpIHsKLSAgICBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3RfaHRtbDsKLSAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHRwcm9nLT5nZXRfY29uc3RzKCk7Ci0gICAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY29uX2l0ZXI7Ci0gICAgZm9yIChjb25faXRlciA9IGNvbnN0cy5iZWdpbigpOyBjb25faXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY29uX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCpjb25faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBzdHJpbmcgaHRtbCA9IjxhIGhyZWY9XCIiICsgZm5hbWUgKyAiI0NvbnN0XyIgKyBuYW1lICsKLSAgICAgICAgIlwiPiIgKyBuYW1lICsgIjwvYT4iOwotICAgICAgY29uc3RfaHRtbC5pbnNlcnQocGFpcjxzdHJpbmcsc3RyaW5nPihuYW1lLCBodG1sKSk7Ci0gICAgfQotICAgIGZvciAobWFwPHN0cmluZyxzdHJpbmc+OjppdGVyYXRvciBjb25faXRlciA9IGNvbnN0X2h0bWwuYmVnaW4oKTsKLSAgIGNvbl9pdGVyICE9IGNvbnN0X2h0bWwuZW5kKCk7IGNvbl9pdGVyKyspIHsKLSAgICAgIGZfb3V0XyA8PCBjb25faXRlci0+c2Vjb25kIDw8ICI8YnIvPiIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZl9vdXRfIDw8ICI8L2NvZGU+PC90ZD4iIDw8IGVuZGwgPDwgIjwvdHI+IjsKLX0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtLgotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW0oKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBzdHJpbmcgZm5hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiLmh0bWwiOwotICBmX291dF8ub3BlbihmbmFtZS5jX3N0cigpKTsKLSAgZl9vdXRfIDw8ICI8IURPQ1RZUEUgaHRtbCBQVUJMSUMgXCItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTlwiIiA8PCBlbmRsOwotICBmX291dF8gPDwgIiAgICBcImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGRcIj4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPGh0bWwgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI+IiA8PCBlbmRsOwotICBmX291dF8gPDwgIjxoZWFkPiIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICI8bWV0YSBodHRwLWVxdWl2PVwiQ29udGVudC1UeXBlXCIgY29udGVudD1cInRleHQvaHRtbDtjaGFyc2V0PXV0Zi04XCIgLz4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPGxpbmsgaHJlZj1cInN0eWxlLmNzc1wiIHJlbD1cInN0eWxlc2hlZXRcIiB0eXBlPVwidGV4dC9jc3NcIi8+IgotICAgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICI8dGl0bGU+VGhyaWZ0IG1vZHVsZTogIiA8PCBwcm9ncmFtXy0+Z2V0X25hbWUoKQotICAgPDwgIjwvdGl0bGU+PC9oZWFkPjxib2R5PiIgPDwgZW5kbCA8PCAiPGgxPlRocmlmdCBtb2R1bGU6ICIKLSAgIDw8IHByb2dyYW1fLT5nZXRfbmFtZSgpIDw8ICI8L2gxPiIgPDwgZW5kbDsKLQotICBwcmludF9kb2MocHJvZ3JhbV8pOwotCi0gIGdlbmVyYXRlX3Byb2dyYW1fdG9jKCk7Ci0KLSAgaWYgKCFwcm9ncmFtXy0+Z2V0X2NvbnN0cygpLmVtcHR5KCkpIHsKLSAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiQ29uc3RhbnRzXCI+Q29uc3RhbnRzPC9oMj4iIDw8IGVuZGw7Ci0gICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOwotICAgIGZfb3V0XyA8PCAiPHRhYmxlPiI7Ci0gICAgZl9vdXRfIDw8ICI8dHI+PHRoPkNvbnN0YW50PC90aD48dGg+VHlwZTwvdGg+PHRoPlZhbHVlPC90aD48L3RyPiIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9jb25zdHMoY29uc3RzKTsKLSAgICBmX291dF8gPDwgIjwvdGFibGU+IjsKLSAgfQotCi0gIGlmICghcHJvZ3JhbV8tPmdldF9lbnVtcygpLmVtcHR5KCkpIHsKLSAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiRW51bWVyYXRpb25zXCI+RW51bWVyYXRpb25zPC9oMj4iIDw8IGVuZGw7Ci0gICAgLy8gR2VuZXJhdGUgZW51bXMKLSAgICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBwcm9ncmFtXy0+Z2V0X2VudW1zKCk7Ci0gICAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOwotICAgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgewotICAgICAgZ2VuZXJhdGVfZW51bSgqZW5faXRlcik7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCkuZW1wdHkoKSkgewotICAgIGZfb3V0XyA8PCAiPGhyLz48aDIgaWQ9XCJUeXBlZGVmc1wiPlR5cGUgZGVjbGFyYXRpb25zPC9oMj4iIDw8IGVuZGw7Ci0gICAgLy8gR2VuZXJhdGUgdHlwZWRlZnMKLSAgICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCk7Ci0gICAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOwotICAgIGZvciAodGRfaXRlciA9IHR5cGVkZWZzLmJlZ2luKCk7IHRkX2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdGRfaXRlcikgewotICAgICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFwcm9ncmFtXy0+Z2V0X29iamVjdHMoKS5lbXB0eSgpKSB7Ci0gICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIlN0cnVjdHNcIj5EYXRhIHN0cnVjdHVyZXM8L2gyPiIgPDwgZW5kbDsKLSAgICAvLyBHZW5lcmF0ZSBzdHJ1Y3RzIGFuZCBleGNlcHRpb25zIGluIGRlY2xhcmVkIG9yZGVyCi0gICAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IHByb2dyYW1fLT5nZXRfb2JqZWN0cygpOwotICAgIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciBvX2l0ZXI7Ci0gICAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgewotICAgICAgaWYgKCgqb19pdGVyKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBnZW5lcmF0ZV94Y2VwdGlvbigqb19pdGVyKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGdlbmVyYXRlX3N0cnVjdCgqb19pdGVyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoIXByb2dyYW1fLT5nZXRfc2VydmljZXMoKS5lbXB0eSgpKSB7Ci0gICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIlNlcnZpY2VzXCI+U2VydmljZXM8L2gyPiIgPDwgZW5kbDsKLSAgICAvLyBHZW5lcmF0ZSBzZXJ2aWNlcwotICAgIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW1fLT5nZXRfc2VydmljZXMoKTsKLSAgICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7Ci0gICAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7Ci0gICAgICBzZXJ2aWNlX25hbWVfID0gZ2V0X3NlcnZpY2VfbmFtZSgqc3ZfaXRlcik7Ci0gICAgICBnZW5lcmF0ZV9zZXJ2aWNlKCpzdl9pdGVyKTsKLSAgICB9Ci0gIH0KLQotICBmX291dF8gPDwgIjwvYm9keT48L2h0bWw+IiA8PCBlbmRsOwotICBmX291dF8uY2xvc2UoKTsKLQotICBnZW5lcmF0ZV9pbmRleCgpOwotICBnZW5lcmF0ZV9jc3MoKTsKLX0KLQotLyoqCi0gKiBFbWl0cyB0aGUgaW5kZXguaHRtbCBmaWxlIGZvciB0aGUgcmVjdXJzaXZlIHNldCBvZiBUaHJpZnQgcHJvZ3JhbXMKLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pbmRleCgpIHsKLSAgc3RyaW5nIGluZGV4X2ZuYW1lID0gZ2V0X291dF9kaXIoKSArICJpbmRleC5odG1sIjsKLSAgZl9vdXRfLm9wZW4oaW5kZXhfZm5hbWUuY19zdHIoKSk7Ci0gIGZfb3V0XyA8PCAiPGh0bWw+PGhlYWQ+IiA8PCBlbmRsOwotICBmX291dF8gPDwgIjxsaW5rIGhyZWY9XCJzdHlsZS5jc3NcIiByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIvPiIKLSAgIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPHRpdGxlPkFsbCBUaHJpZnQgZGVjbGFyYXRpb25zPC90aXRsZT48L2hlYWQ+PGJvZHk+IgotICAgPDwgZW5kbCA8PCAiPGgxPkFsbCBUaHJpZnQgZGVjbGFyYXRpb25zPC9oMT4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPHRhYmxlPjx0cj48dGg+TW9kdWxlPC90aD48dGg+U2VydmljZXM8L3RoPjx0aD5EYXRhIHR5cGVzPC90aD4iCi0gICA8PCAiPHRoPkNvbnN0YW50czwvdGg+PC90cj4iIDw8IGVuZGw7Ci0gIHZlY3Rvcjx0X3Byb2dyYW0qPiBwcm9ncmFtczsKLSAgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93cyhwcm9ncmFtXywgcHJvZ3JhbXMpOwotICBmX291dF8gPDwgIjwvdGFibGU+IiA8PCBlbmRsOwotICBmX291dF8gPDwgIjwvYm9keT48L2h0bWw+IiA8PCBlbmRsOwotICBmX291dF8uY2xvc2UoKTsKLX0KLQotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc3MoKSB7Ci0gIHN0cmluZyBjc3NfZm5hbWUgPSBnZXRfb3V0X2RpcigpICsgInN0eWxlLmNzcyI7Ci0gIGZfb3V0Xy5vcGVuKGNzc19mbmFtZS5jX3N0cigpKTsKLSAgZl9vdXRfIDw8ICIvKiBBdXRvLWdlbmVyYXRlZCBDU1MgZm9yIGdlbmVyYXRlZCBUaHJpZnQgZG9jcyAqLyIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8Ci0gICAgImJvZHkgeyBmb250LWZhbWlseTogVGFob21hLCBzYW5zLXNlcmlmOyB9IiA8PCBlbmRsOwotICBmX291dF8gPDwKLSAgICAicHJlIHsgYmFja2dyb3VuZC1jb2xvcjogI2RkZGRkZDsgcGFkZGluZzogNnB4OyB9IiA8PCBlbmRsOwotICBmX291dF8gPDwKLSAgICAiaDMsaDQgeyBwYWRkaW5nLXRvcDogMHB4OyBtYXJnaW4tdG9wOiAwcHg7IH0iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PAotICAgICJkaXYuZGVmaW5pdGlvbiB7IGJvcmRlcjogMXB4IHNvbGlkIGdyYXk7IG1hcmdpbjogMTBweDsgcGFkZGluZzogMTBweDsgfSIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8Ci0gICAgImRpdi5leHRlbmRzIHsgbWFyZ2luOiAtMC41ZW0gMCAxZW0gNWVtIH0iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PAotICAgICJ0YWJsZSB7IGJvcmRlcjogMXB4IHNvbGlkIGdyZXk7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IH0iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PAotICAgICJ0ZCB7IGJvcmRlcjogMXB4IHNvbGlkIGdyZXk7IHBhZGRpbmc6IDFweCA2cHg7IHZlcnRpY2FsLWFsaWduOiB0b3A7IH0iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PAotICAgICJ0aCB7IGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBiYWNrZ3JvdW5kLWNvbG9yOiAjYmJiYmJiOyIgPDwgZW5kbCA8PAotICAgICIgICAgIHRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDFweCA2cHg7IH0iIDw8IGVuZGw7Ci0gIGZfb3V0Xy5jbG9zZSgpOwotfQotCi0vKioKLSAqIElmIHRoZSBwcm92aWRlZCBkb2N1bWVudGFibGUgb2JqZWN0IGhhcyBkb2N1bWVudGF0aW9uIGF0dGFjaGVkLCB0aGlzCi0gKiB3aWxsIGVtaXQgaXQgdG8gdGhlIG91dHB1dCBzdHJlYW0gaW4gSFRNTCBmb3JtYXQuCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6cHJpbnRfZG9jKHRfZG9jKiB0ZG9jKSB7Ci0gIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICBzdHJpbmcgZG9jID0gdGRvYy0+Z2V0X2RvYygpOwotICAgIHNpemVfdCBpbmRleDsKLSAgICB3aGlsZSAoKGluZGV4ID0gZG9jLmZpbmRfZmlyc3Rfb2YoIlxyXG4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICBpZiAoaW5kZXggPT0gMCkgewotICBmX291dF8gPDwgIjxwLz4iIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICBmX291dF8gPDwgZG9jLnN1YnN0cigwLCBpbmRleCkgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChpbmRleCArIDEgPCBkb2Muc2l6ZSgpICYmIGRvYy5hdChpbmRleCkgIT0gZG9jLmF0KGluZGV4ICsgMSkgJiYKLSAgICAoZG9jLmF0KGluZGV4ICsgMSkgPT0gJ1xyJyB8fCBkb2MuYXQoaW5kZXggKyAxKSA9PSAnXG4nKSkgewotICBpbmRleCsrOwotICAgICAgfQotICAgICAgZG9jID0gZG9jLnN1YnN0cihpbmRleCArIDEpOwotICAgIH0KLSAgICBmX291dF8gPDwgZG9jIDw8ICI8YnIvPiI7Ci0gIH0KLX0KLQotLyoqCi0gKiBQcmludHMgb3V0IHRoZSBwcm92aWRlZCB0eXBlIGluIEhUTUwKLSAqLwotaW50IHRfaHRtbF9nZW5lcmF0b3I6OnByaW50X3R5cGUodF90eXBlKiB0dHlwZSkgewotICBpbnQgbGVuID0gMDsKLSAgZl9vdXRfIDw8ICI8Y29kZT4iOwotICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGZfb3V0XyA8PCAibGlzdCZsdDsiOwotICAgICAgbGVuID0gNiArIHByaW50X3R5cGUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICAgIGZfb3V0XyA8PCAiJmd0OyI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGZfb3V0XyA8PCAic2V0Jmx0OyI7Ci0gICAgICBsZW4gPSA1ICsgcHJpbnRfdHlwZSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgICBmX291dF8gPDwgIiZndDsiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBmX291dF8gPDwgIm1hcCZsdDsiOwotICAgICAgbGVuID0gNSArIHByaW50X3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7Ci0gICAgICBmX291dF8gPDwgIiwgIjsKLSAgICAgIGxlbiArPSBwcmludF90eXBlKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOwotICAgICAgZl9vdXRfIDw8ICImZ3Q7IjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgZl9vdXRfIDw8ICgoKHRfYmFzZV90eXBlKil0dHlwZSktPmlzX2JpbmFyeSgpID8gImJpbmFyeSIgOiB0dHlwZS0+Z2V0X25hbWUoKSk7Ci0gICAgbGVuID0gdHR5cGUtPmdldF9uYW1lKCkuc2l6ZSgpOwotICB9IGVsc2UgewotICAgIHN0cmluZyBwcm9nX25hbWUgPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKTsKLSAgICBzdHJpbmcgdHlwZV9uYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7Ci0gICAgZl9vdXRfIDw8ICI8YSBocmVmPVwiIiA8PCBwcm9nX25hbWUgPDwgIi5odG1sIyI7Ci0gICAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICAgIGZfb3V0XyA8PCAiVHlwZWRlZl8iOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBmX291dF8gPDwgIlN0cnVjdF8iOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgZl9vdXRfIDw8ICJFbnVtXyI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2VydmljZSgpKSB7Ci0gICAgICBmX291dF8gPDwgIlN2Y18iOwotICAgIH0KLSAgICBmX291dF8gPDwgdHlwZV9uYW1lIDw8ICJcIj4iOwotICAgIGxlbiA9IHR5cGVfbmFtZS5zaXplKCk7Ci0gICAgaWYgKHR0eXBlLT5nZXRfcHJvZ3JhbSgpICE9IHByb2dyYW1fKSB7Ci0gICAgICBmX291dF8gPDwgcHJvZ19uYW1lIDw8ICIuIjsKLSAgICAgIGxlbiArPSBwcm9nX25hbWUuc2l6ZSgpICsgMTsKLSAgICB9Ci0gICAgZl9vdXRfIDw8IHR5cGVfbmFtZSA8PCAiPC9hPiI7Ci0gIH0KLSAgZl9vdXRfIDw8ICI8L2NvZGU+IjsKLSAgcmV0dXJuIGxlbjsKLX0KLQotLyoqCi0gKiBQcmludHMgb3V0IGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb3ZpZGVkIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUodF9jb25zdF92YWx1ZSogdHZhbHVlKSB7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBzd2l0Y2ggKHR2YWx1ZS0+Z2V0X3R5cGUoKSkgewotICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6Ci0gICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICBicmVhazsKLSAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEU6Ci0gICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgIGJyZWFrOwotICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX1NUUklORzoKLSAgICBmX291dF8gPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh0dmFsdWUpIDw8ICciJzsKLSAgICBicmVhazsKLSAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6Ci0gICAgewotICAgICAgZl9vdXRfIDw8ICJ7ICI7Ci0gICAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiBtYXBfZWxlbXMgPSB0dmFsdWUtPmdldF9tYXAoKTsKLSAgICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+OjppdGVyYXRvciBtYXBfaXRlcjsKLSAgICAgIGZvciAobWFwX2l0ZXIgPSBtYXBfZWxlbXMuYmVnaW4oKTsgbWFwX2l0ZXIgIT0gbWFwX2VsZW1zLmVuZCgpOyBtYXBfaXRlcisrKSB7Ci0gICAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgICBmX291dF8gPDwgIiwgIjsKLSAgICAgICAgfQotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICBwcmludF9jb25zdF92YWx1ZShtYXBfaXRlci0+Zmlyc3QpOwotICAgICAgICBmX291dF8gPDwgIiA9ICI7Ci0gICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG1hcF9pdGVyLT5zZWNvbmQpOwotICAgICAgfQotICAgICAgZl9vdXRfIDw8ICIgfSI7Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6Ci0gICAgewotICAgICAgZl9vdXRfIDw8ICJ7ICI7Ci0gICAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3RfZWxlbXMgPSB0dmFsdWUtPmdldF9saXN0KCk7OwotICAgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbGlzdF9pdGVyOwotICAgICAgZm9yIChsaXN0X2l0ZXIgPSBsaXN0X2VsZW1zLmJlZ2luKCk7IGxpc3RfaXRlciAhPSBsaXN0X2VsZW1zLmVuZCgpOyBsaXN0X2l0ZXIrKykgewotICAgICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgICAgZl9vdXRfIDw8ICIsICI7Ci0gICAgICAgIH0KLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKmxpc3RfaXRlcik7Ci0gICAgICB9Ci0gICAgICBmX291dF8gPDwgIiB9IjsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgZl9vdXRfIDw8ICJVTktOT1dOIjsKLSAgICBicmVhazsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgc3RyaW5nIG5hbWUgPSB0dHlwZWRlZi0+Z2V0X25hbWUoKTsKLSAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZGVmaW5pdGlvblwiPiI7Ci0gIGZfb3V0XyA8PCAiPGgzIGlkPVwiVHlwZWRlZl8iIDw8IG5hbWUgPDwgIlwiPlR5cGVkZWY6ICIgPDwgbmFtZQotICAgPDwgIjwvaDM+IiA8PCBlbmRsOwotICBmX291dF8gPDwgIjxwPjxzdHJvbmc+QmFzZSB0eXBlOjwvc3Ryb25nPiZuYnNwOyI7Ci0gIHByaW50X3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCkpOwotICBmX291dF8gPDwgIjwvcD4iIDw8IGVuZGw7Ci0gIHByaW50X2RvYyh0dHlwZWRlZik7Ci0gIGZfb3V0XyA8PCAiPC9kaXY+IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBzdHJpbmcgbmFtZSA9IHRlbnVtLT5nZXRfbmFtZSgpOwotICBmX291dF8gPDwgIjxkaXYgY2xhc3M9XCJkZWZpbml0aW9uXCI+IjsKLSAgZl9vdXRfIDw8ICI8aDMgaWQ9XCJFbnVtXyIgPDwgbmFtZSA8PCAiXCI+RW51bWVyYXRpb246ICIgPDwgbmFtZQotICAgPDwgIjwvaDM+IiA8PCBlbmRsOwotICBwcmludF9kb2ModGVudW0pOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gdmFsdWVzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciB2YWxfaXRlcjsKLSAgZl9vdXRfIDw8ICI8YnIvPjx0YWJsZT4iIDw8IGVuZGw7Ci0gIGZvciAodmFsX2l0ZXIgPSB2YWx1ZXMuYmVnaW4oKTsgdmFsX2l0ZXIgIT0gdmFsdWVzLmVuZCgpOyArK3ZhbF9pdGVyKSB7Ci0gICAgZl9vdXRfIDw8ICI8dHI+PHRkPjxjb2RlPiI7Ci0gICAgZl9vdXRfIDw8ICgqdmFsX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPiI7Ci0gICAgZl9vdXRfIDw8ICgqdmFsX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBmX291dF8gPDwgIjwvY29kZT48L3RkPjwvdHI+IiA8PCBlbmRsOwotICB9Ci0gIGZfb3V0XyA8PCAiPC90YWJsZT48L2Rpdj4iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7Ci0gIGZfb3V0XyA8PCAiPHRyIGlkPVwiQ29uc3RfIiA8PCBuYW1lIDw8ICJcIj48dGQ+PGNvZGU+IiA8PCBuYW1lCi0gICA8PCAiPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPiI7Ci0gIHByaW50X3R5cGUodGNvbnN0LT5nZXRfdHlwZSgpKTsKLSAgZl9vdXRfIDw8ICI8L2NvZGU+PC90ZD48dGQ+PGNvZGU+IjsKLSAgcHJpbnRfY29uc3RfdmFsdWUodGNvbnN0LT5nZXRfdmFsdWUoKSk7Ci0gIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+PC90cj4iOwotICBpZiAodGNvbnN0LT5oYXNfZG9jKCkpIHsKLSAgICBmX291dF8gPDwgIjx0cj48dGQgY29sc3Bhbj1cIjNcIj48YmxvY2txdW90ZT4iOwotICAgIHByaW50X2RvYyh0Y29uc3QpOwotICAgIGZfb3V0XyA8PCAiPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4iOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBmX291dF8gPDwgIjxkaXYgY2xhc3M9XCJkZWZpbml0aW9uXCI+IjsKLSAgZl9vdXRfIDw8ICI8aDMgaWQ9XCJTdHJ1Y3RfIiA8PCBuYW1lIDw8ICJcIj4iOwotICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgewotICAgIGZfb3V0XyA8PCAiRXhjZXB0aW9uOiAiOwotICB9IGVsc2UgewotICAgIGZfb3V0XyA8PCAiU3RydWN0OiAiOwotICB9Ci0gIGZfb3V0XyA8PCBuYW1lIDw8ICI8L2gzPiIgPDwgZW5kbDsKLSAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7Ci0gIGZfb3V0XyA8PCAiPHRhYmxlPiI7Ci0gIGZfb3V0XyA8PCAiPHRyPjx0aD5LZXk8L3RoPjx0aD5GaWVsZDwvdGg+PHRoPlR5cGU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PHRoPlJlcXVpcmVkbmVzczwvdGg+PHRoPkRlZmF1bHQgdmFsdWU8L3RoPjwvdHI+IgotICAgIDw8IGVuZGw7Ci0gIGZvciAoIDsgbWVtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgbWVtX2l0ZXIrKykgewotICAgIGZfb3V0XyA8PCAiPHRyPjx0ZD4iIDw8ICgqbWVtX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjwvdGQ+PHRkPiI7Ci0gICAgZl9vdXRfIDw8ICgqbWVtX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGZfb3V0XyA8PCAiPC90ZD48dGQ+IjsKLSAgICBwcmludF90eXBlKCgqbWVtX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7Ci0gICAgZl9vdXRfIDw8ICgqbWVtX2l0ZXIpLT5nZXRfZG9jKCk7Ci0gICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOwotICAgIGlmICgoKm1lbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgIGZfb3V0XyA8PCAib3B0aW9uYWwiOwotICAgIH0gZWxzZSBpZiAoKCptZW1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBmX291dF8gPDwgInJlcXVpcmVkIjsKLSAgICB9IGVsc2UgewotICAgICAgZl9vdXRfIDw8ICJkZWZhdWx0IjsKLSAgICB9Ci0gICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOwotICAgIHRfY29uc3RfdmFsdWUqIGRlZmF1bHRfdmFsID0gKCptZW1faXRlciktPmdldF92YWx1ZSgpOwotICAgIGlmIChkZWZhdWx0X3ZhbCAhPSBOVUxMKSB7Ci0gICAgICBwcmludF9jb25zdF92YWx1ZShkZWZhdWx0X3ZhbCk7Ci0gICAgfQotICAgIGZfb3V0XyA8PCAiPC90ZD48L3RyPiIgPDwgZW5kbDsKLSAgfQotICBmX291dF8gPDwgIjwvdGFibGU+PGJyLz4iOwotICBwcmludF9kb2ModHN0cnVjdCk7Ci0gIGZfb3V0XyA8PCAiPC9kaXY+IjsKLX0KLQotLyoqCi0gKiBFeGNlcHRpb25zIGFyZSBzcGVjaWFsIHN0cnVjdHMKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3N0cnVjdCh0eGNlcHRpb24pOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgSFRNTCBibG9jayBmb3IgYSBUaHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBmX291dF8gPDwgIjxoMyBpZD1cIlN2Y18iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlwiPlNlcnZpY2U6ICIKLSAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICI8L2gzPiIgPDwgZW5kbDsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpIHsKLSAgICBmX291dF8gPDwgIjxkaXYgY2xhc3M9XCJleHRlbmRzXCI+PGVtPmV4dGVuZHM8L2VtPiAiOwotICAgIHByaW50X3R5cGUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGZfb3V0XyA8PCAiPC9kaXY+XG4iOwotICB9Ci0gIHByaW50X2RvYyh0c2VydmljZSk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOwotICBmb3IgKCA7IGZuX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyBmbl9pdGVyKyspIHsKLSAgICBzdHJpbmcgZm5fbmFtZSA9ICgqZm5faXRlciktPmdldF9uYW1lKCk7Ci0gICAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZGVmaW5pdGlvblwiPiI7Ci0gICAgZl9vdXRfIDw8ICI8aDQgaWQ9XCJGbl8iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIl8iIDw8IGZuX25hbWUKLSAgICAgIDw8ICJcIj5GdW5jdGlvbjogIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIuIiA8PCBmbl9uYW1lCi0gICAgICA8PCAiPC9oND4iIDw8IGVuZGw7Ci0gICAgZl9vdXRfIDw8ICI8cHJlPiI7Ci0gICAgaW50IG9mZnNldCA9IHByaW50X3R5cGUoKCpmbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSk7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZl9vdXRfIDw8ICIgIiA8PCBmbl9uYW1lIDw8ICIoIjsKLSAgICBvZmZzZXQgKz0gZm5fbmFtZS5zaXplKCkgKyAyOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj4gYXJncyA9ICgqZm5faXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7Ci0gICAgaWYgKGFyZ19pdGVyICE9IGFyZ3MuZW5kKCkpIHsKLSAgICAgIGZvciAoIDsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgYXJnX2l0ZXIrKykgewotICAgICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgICAgZl9vdXRfIDw8ICIsIiA8PCBlbmRsOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2Zmc2V0OyArK2kpIHsKLSAgICAgICAgICAgIGZfb3V0XyA8PCAiICI7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIHByaW50X3R5cGUoKCphcmdfaXRlciktPmdldF90eXBlKCkpOwotICAgICAgICBmX291dF8gPDwgIiAiIDw8ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgICBpZiAoKCphcmdfaXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgICAgICBmX291dF8gPDwgIiA9ICI7Ci0gICAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCphcmdfaXRlciktPmdldF92YWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBmX291dF8gPDwgIikiIDw8IGVuZGw7Ci0gICAgZmlyc3QgPSB0cnVlOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj4gZXhjZXB0cyA9ICgqZm5faXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOwotICAgIGlmIChleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCkpIHsKLSAgICAgIGZfb3V0XyA8PCAiICAgIHRocm93cyAiOwotICAgICAgZm9yICggOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgewotICAgICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgICAgZl9vdXRfIDw8ICIsICI7Ci0gICAgICAgIH0KLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgcHJpbnRfdHlwZSgoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIH0KLSAgICAgIGZfb3V0XyA8PCBlbmRsOwotICAgIH0KLSAgICBmX291dF8gPDwgIjwvcHJlPiI7Ci0gICAgcHJpbnRfZG9jKCpmbl9pdGVyKTsKLSAgICBmX291dF8gPDwgIjwvZGl2PiI7Ci0gIH0KLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihodG1sLCAiSFRNTCIsICIiKQotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfamF2YV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfamF2YV9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZWQ1ZTIuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzkxNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxjY3R5cGU+Ci0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KLQotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0KLS8qKgotICogSmF2YSBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfamF2YV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfamF2YV9nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImJlYW5zIik7Ci0gICAgYmVhbl9zdHlsZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgicHJpdmF0ZS1tZW1iZXJzIik7Ci0gICAgcHJpdmF0ZV9tZW1iZXJzXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJub2NhbWVsIik7Ci0gICAgbm9jYW1lbF9zdHlsZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiaGFzaGNvZGUiKTsKLSAgICBnZW5faGFzaF9jb2RlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJhbmRyb2lkX2xlZ2FjeSIpOwotICAgIGFuZHJvaWRfbGVnYWN5XyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJqYXZhNSIpOwotICAgIGphdmE1XyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLSAgICBpZiAoamF2YTVfKSB7Ci0gICAgICAgIGFuZHJvaWRfbGVnYWN5XyA9IHRydWU7Ci0gICAgfQotCi0gICAgb3V0X2Rpcl9iYXNlXyA9IChiZWFuX3N0eWxlXyA/ICJnZW4tamF2YWJlYW4iIDogImdlbi1qYXZhIik7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uICAgKHRfc3RydWN0KiAgIHR1bmlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbD1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSwgYm9vbCBpbl9jbGFzcz1mYWxzZSwgYm9vbCBpc19yZXN1bHQ9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlX29iamVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkX29iamVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX21ldGFfZGF0YV9tYXAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2phdmFfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9maWVsZF9ieV9pZChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKLSAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwgc3RkOjpzdHJpbmcgY2FwX25hbWUpOwotICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkKTsKLSAgdm9pZCBnZW5lcmF0ZV9pc3NldF9zZXQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOwotICBzdGQ6OnN0cmluZyBpc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9hc3luY19pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlciAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAgKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3RvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25faXNfc2V0X21ldGhvZHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NoZWNrX3R5cGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3JlYWRfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3dyaXRlX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfbmFtZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25faGFzaGNvZGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jICAgICAgICAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgZmllbGQpOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2MgICAgICAgICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogICAgICB0ZG9jKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jICAgICAgICAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGRvYyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50ICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb250ZW50cyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AyLCBzdGQ6OnN0cmluZyByZXN1bHRfbmFtZSwgdF90eXBlKiB0eXBlKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLCBzdGQ6OnN0cmluZyBkZXN0X25hbWUsIHRfdHlwZSogdHlwZSk7Ci0KLSAgYm9vbCBoYXNfYml0X3ZlY3Rvcih0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIGphdmFfcGFja2FnZSgpOwotICBzdGQ6OnN0cmluZyBqYXZhX3R5cGVfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXI9ZmFsc2UsIGJvb2wgaW5faW5pdD1mYWxzZSwgYm9vbCBza2lwX2dlbmVyaWM9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgdXNlX2Jhc2VfbWV0aG9kID0gZmFsc2UsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV90eXBlcyA9IHRydWUpOwotICBzdGQ6OnN0cmluZyBhc3luY19mdW5jdGlvbl9jYWxsX2FyZ2xpc3QodF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgdXNlX2Jhc2VfbWV0aG9kID0gdHJ1ZSwgYm9vbCBpbmNsdWRlX3R5cGVzID0gdHJ1ZSk7Ci0gIHN0ZDo6c3RyaW5nIGFzeW5jX2FyZ3VtZW50X2xpc3QodF9mdW5jdGlvbiogdGZ1bmN0LCB0X3N0cnVjdCogdHN0cnVjdCwgdF90eXBlKiB0dHlwZSwgYm9vbCBpbmNsdWRlX3R5cGVzPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF9uYW1lX2NvbnN0YW50cyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKLSAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotCi0gICAgcmV0dXJuCi0gICAgICB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwKLSAgICAgIHR0eXBlLT5pc19zdHJ1Y3QoKSB8fAotICAgICAgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwKLSAgICAgIHR0eXBlLT5pc19zdHJpbmcoKSB8fAotICAgICAgdHR5cGUtPmlzX2VudW0oKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGNvbnN0YW50X25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7Ci0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87Ci0KLSAgYm9vbCBiZWFuX3N0eWxlXzsKLSAgYm9vbCBwcml2YXRlX21lbWJlcnNfOwotICBib29sIG5vY2FtZWxfc3R5bGVfOwotICBib29sIGdlbl9oYXNoX2NvZGVfOwotICBib29sIGFuZHJvaWRfbGVnYWN5XzsKLSAgYm9vbCBqYXZhNV87Ci0KLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0gIHBhY2thZ2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiamF2YSIpOwotCi0gIHN0cmluZyBkaXIgPSBwYWNrYWdlX25hbWVfOwotICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKTsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gICAgZGlyID0gZGlyLnN1YnN0cihsb2MrMSk7Ci0gIH0KLSAgaWYgKGRpci5zaXplKCkgPiAwKSB7Ci0gICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOwotICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgfQotCi0gIHBhY2thZ2VfZGlyXyA9IHN1YmRpcjsKLX0KLQotLyoqCi0gKiBQYWNrYWdlcyB0aGUgZ2VuZXJhdGVkIGZpbGUKLSAqCi0gKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgcGFja2FnZSwgaS5lLiAicGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdGRlbW87IgotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6amF2YV9wYWNrYWdlKCkgewotICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgewotICAgIHJldHVybiBzdHJpbmcoInBhY2thZ2UgIikgKyBwYWNrYWdlX25hbWVfICsgIjtcblxuIjsKLSAgfQotICByZXR1cm4gIiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIGphdmEgaW1wb3J0cwotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBKYXZhIHR5cGVzIHRoYXQgYXJlIHVzZWQgaW4gaGVyZQotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6amF2YV90eXBlX2ltcG9ydHMoKSB7Ci0gIHN0cmluZyBoYXNoX2J1aWxkZXI7Ci0gIGlmIChnZW5faGFzaF9jb2RlXykgewotICAgIGhhc2hfYnVpbGRlciA9ICJpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuYnVpbGRlci5IYXNoQ29kZUJ1aWxkZXI7XG4iOwotICB9Ci0KLSAgcmV0dXJuCi0gICAgc3RyaW5nKCkgKwotICAgIGhhc2hfYnVpbGRlciArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuTGlzdDtcbiIgKwotICAgICJpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDtcbiIgKwotICAgICJpbXBvcnQgamF2YS51dGlsLk1hcDtcbiIgKwotICAgICJpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7XG4iICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwO1xuIiArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuU2V0O1xuIiArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDtcbiIgKwotICAgICJpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7XG4iICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9ucztcbiIgKwotICAgICJpbXBvcnQgamF2YS51dGlsLkJpdFNldDtcbiIgKwotICAgICJpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjtcbiIKLSAgICAiaW1wb3J0IGphdmEudXRpbC5BcnJheXM7XG4iICsKLSAgICAiaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7XG4iICsKLSAgICAiaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5O1xuXG4iOwotfQotCi0vKioKLSAqIE5vdGhpbmcgaW4gSmF2YQotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHt9Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBKYXZhLCBzaW5jZSBpdCBkb2VzCi0gKiBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgbmFtZSByZXBsYWNlbWVudHMsIGFuZCBpdCdkIGJlIGEgd2Fja3kgd2FzdGUKLSAqIG9mIG92ZXJoZWFkIHRvIG1ha2Ugd3JhcHBlciBjbGFzc2VzLgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gICh2b2lkKSB0dHlwZWRlZjsKLX0KLQotLyoqCi0gKiBFbnVtcyBhcmUgYSBjbGFzcyB3aXRoIGEgc2V0IG9mIHN0YXRpYyBjb25zdGFudHMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrKHRlbnVtLT5nZXRfbmFtZSgpKSsiLmphdmEiOwotICBvZnN0cmVhbSBmX2VudW07Ci0gIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lLmNfc3RyKCkpOwotCi0gIC8vIENvbW1lbnQgYW5kIHBhY2thZ2UgaXQKLSAgZl9lbnVtIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqYXZhX3BhY2thZ2UoKSA8PCBlbmRsOwotCi0gIC8vIEFkZCBqYXZhIGltcG9ydHMKLSAgZl9lbnVtIDw8IHN0cmluZygpICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5NYXA7XG4iICsgCi0gICAgImltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDtcbiIgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEVudW07IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfamF2YV9kb2MoZl9lbnVtLCB0ZW51bSk7Ci0gIGluZGVudChmX2VudW0pIDw8Ci0gICAgInB1YmxpYyBlbnVtICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRFbnVtICI7Ci0gIHNjb3BlX3VwKGZfZW51bSk7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotCi0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX2VudW0gPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9lbnVtLCAqY19pdGVyKTsKLSAgICBpbmRlbnQoZl9lbnVtKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IHZhbHVlIDw8ICIpIjsKLSAgfQotICBmX2VudW0gPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBGaWVsZCBmb3IgdGhyaWZ0Q29kZQotICBpbmRlbnQoZl9lbnVtKSA8PCAicHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgInByaXZhdGUgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiKGludCB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAgdGhpcy52YWx1ZSA9IHZhbHVlOyIgPDxlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX2VudW0pIDw8ICIvKioiIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgKiBHZXQgdGhlIGludGVnZXIgdmFsdWUgb2YgdGhpcyBlbnVtIHZhbHVlLCBhcyBkZWZpbmVkIGluIHRoZSBUaHJpZnQgSURMLiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICByZXR1cm4gdmFsdWU7IiA8PGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgIi8qKiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEZpbmQgYSB0aGUgZW51bSB0eXBlIGJ5IGl0cyBpbnRlZ2VyIHZhbHVlLCBhcyBkZWZpbmVkIGluIHRoZSBUaHJpZnQgSURMLiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEByZXR1cm4gbnVsbCBpZiB0aGUgdmFsdWUgaXMgbm90IGZvdW5kLiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgIisgdGVudW0tPmdldF9uYW1lKCkgKyAiIGZpbmRCeVZhbHVlKGludCB2YWx1ZSkgeyAiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgInN3aXRjaCAodmFsdWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBpbmRlbnQoZl9lbnVtKSA8PCAiY2FzZSAiIDw8IHZhbHVlIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICAKLSAgaW5kZW50KGZfZW51bSkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICByZXR1cm4gbnVsbDsiIDw8IGVuZGw7ICAKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsOwotICAKLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAifSIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKGZfZW51bSk7Ci0KLSAgZl9lbnVtLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXysiL0NvbnN0YW50cy5qYXZhIjsKLSAgb2ZzdHJlYW0gZl9jb25zdHM7Ci0gIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl9jb25zdHMgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGphdmFfcGFja2FnZSgpIDw8Ci0gICAgamF2YV90eXBlX2ltcG9ydHMoKTsKLQotICBmX2NvbnN0cyA8PAotICAgICJwdWJsaWMgY2xhc3MgQ29uc3RhbnRzIHsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfY29uc3RzLCAoKmNfaXRlcikpOwotICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfY29uc3RzLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfY29uc3RzKSA8PAotICAgICJ9IiA8PCBlbmRsOwotICBmX2NvbnN0cy5jbG9zZSgpOwotfQotCi0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGluX3N0YXRpYywgYm9vbCBkZWZ2YWwpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaW5kZW50KG91dCk7Ci0gIGlmICghZGVmdmFsKSB7Ci0gICAgb3V0IDw8Ci0gICAgICAoaW5fc3RhdGljID8gIiIgOiAicHVibGljIHN0YXRpYyBmaW5hbCAiKSA8PAotICAgICAgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKLSAgfQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB0eXBlLCB2YWx1ZSk7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB0eXBlLCB2YWx1ZSkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiI7Ci0gICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpOwotICAgICAgb3V0IDw8ICJzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLnB1dCgiIDw8IGtleSA8PCAiLCAiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLmFkZCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotfQotCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZW5kZXIgPDwgIihieXRlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJlbmRlciA8PCAiKHNob3J0KSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgcmVuZGVyIDw8ICIoZG91YmxlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmVuZGVyIDw8IHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImphdmEiKSA8PCAiLiIgPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyX3dpdGhfcGFyZW50KCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOwotICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUpOwotICAgIHJlbmRlciA8PCB0OwotICB9Ci0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIHdpbGwgYmUgYSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZSAKLSAqIGltcGxlbWVudG9yLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgewotICAgIGdlbmVyYXRlX2phdmFfdW5pb24odHN0cnVjdCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotICB9Ci19Ci0KLS8qKgotICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotCi0vKioKLSAqIEphdmEgc3RydWN0IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iKyh0c3RydWN0LT5nZXRfbmFtZSgpKSsiLmphdmEiOwotICBvZnN0cmVhbSBmX3N0cnVjdDsKLSAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc3RydWN0IDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqYXZhX3BhY2thZ2UoKSA8PAotICAgamF2YV90eXBlX2ltcG9ydHMoKTsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXhjZXB0aW9uKTsKLSAgZl9zdHJ1Y3QuY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBKYXZhIHVuaW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV91bmlvbih0X3N0cnVjdCogdHN0cnVjdCkgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gcGFja2FnZV9kaXJfKyIvIisodHN0cnVjdC0+Z2V0X25hbWUoKSkrIi5qYXZhIjsKLSAgb2ZzdHJlYW0gZl9zdHJ1Y3Q7Ci0gIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKLQotICBmX3N0cnVjdCA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgamF2YV9wYWNrYWdlKCkgPDwKLSAgICBqYXZhX3R5cGVfaW1wb3J0cygpOwotCi0gIGdlbmVyYXRlX2phdmFfZG9jKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7Ci0KLSAgaW5kZW50KGZfc3RydWN0KSA8PAotICAgICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCi0gICAgPDwgIiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlRVbmlvbjwiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiwgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIuX0ZpZWxkcz4gIjsKLQotICBzY29wZV91cChmX3N0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfc3RydWN0X2Rlc2MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9maWVsZF9kZXNjcyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9maWVsZF9uYW1lX2NvbnN0YW50cyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9qYXZhX21ldGFfZGF0YV9tYXAoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZmllbGRfYnlfaWQoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV91bmlvbl9pc19zZXRfbWV0aG9kcyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0gIAotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlX29iamVjdChmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkX29iamVjdChmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKGZfc3RydWN0KTsKLQotICBmX3N0cnVjdC5jbG9zZSgpOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIihfRmllbGRzIHNldEZpZWxkLCBPYmplY3QgdmFsdWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKHNldEZpZWxkLCB2YWx1ZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcihvdGhlcik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIGRlZXBDb3B5KCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIih0aGlzKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gZ2VuZXJhdGUgImNvbnN0cnVjdG9ycyIgZm9yIGVhY2ggZmllbGQKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIHggPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB4LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIih2YWx1ZSk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiB4OyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKGJ5dGVbXSB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgeCA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgeC5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIoQnl0ZUJ1ZmZlci53cmFwKHZhbHVlKSk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIHg7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIAotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotCi0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0gICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7Ci0gICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpOwotCi0gICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBieXRlW10gZ2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHNldCIgPDwgY2FwX25hbWUgPDwgIihvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5yaWdodFNpemUoYnVmZmVyIiA8PCBnZXRfY2FwX25hbWUoImZvciIpIDw8IGNhcF9uYW1lIDw8ICIoKSkpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIEJ5dGVCdWZmZXIgYiA9IGJ1ZmZlciIgPDwgZ2V0X2NhcF9uYW1lKCJmb3IiKSA8PCBjYXBfbmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGIgPT0gbnVsbCA/IG51bGwgOiBiLmFycmF5KCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAgIG91dCA8PCBlbmRsOwotCi0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIEJ5dGVCdWZmZXIgYnVmZmVyIiA8PCBnZXRfY2FwX25hbWUoImZvciIpIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIChCeXRlQnVmZmVyKWdldEZpZWxkVmFsdWUoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oXCJDYW5ub3QgZ2V0IGZpZWxkICciIDw8IGZpZWxkLT5nZXRfbmFtZSgpCi0gICAgICAgIDw8ICInIGJlY2F1c2UgdW5pb24gaXMgY3VycmVudGx5IHNldCB0byBcIiArIGdldEZpZWxkRGVzYyhnZXRTZXRGaWVsZCgpKS5uYW1lKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8ICIgZ2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGdldFNldEZpZWxkKCkgPT0gX0ZpZWxkcy4iIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiAoIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUpIDw8ICIpZ2V0RmllbGRWYWx1ZSgpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIH0gZWxzZSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihcIkNhbm5vdCBnZXQgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkgCi0gICAgICAgIDw8ICInIGJlY2F1c2UgdW5pb24gaXMgY3VycmVudGx5IHNldCB0byBcIiArIGdldEZpZWxkRGVzYyhnZXRTZXRGaWVsZCgpKS5uYW1lKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIoYnl0ZVtdIHZhbHVlKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIoQnl0ZUJ1ZmZlci53cmFwKHZhbHVlKSk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIoIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8ICIgdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAodmFsdWUgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAiICBzZXRGaWVsZF8gPSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgdmFsdWVfID0gdmFsdWU7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25faXNfc2V0X21ldGhvZHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBpcyIgPDwgZ2V0X2NhcF9uYW1lKCJzZXQiKSA8PCBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiBzZXRGaWVsZF8gPT0gX0ZpZWxkcy4iIDw8IGNvbnN0YW50X25hbWUoZmllbGRfbmFtZSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9jaGVja190eXBlKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotICBnZW5lcmF0ZV9yZWFkX3ZhbHVlKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotICBnZW5lcmF0ZV93cml0ZV92YWx1ZShvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBfRmllbGRzIGVudW1Gb3JJZChzaG9ydCBpZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWRPclRocm93KGlkKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NoZWNrX3R5cGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCB2b2lkIGNoZWNrVHlwZShfRmllbGRzIHNldEZpZWxkLCBPYmplY3QgdmFsdWUpIHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotICAgIAotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlLCB0cnVlKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbihcIldhcyBleHBlY3RpbmcgdmFsdWUgb2YgdHlwZSAiIAotICAgICAgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiBmb3IgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkgCi0gICAgICA8PCAiJywgYnV0IGdvdCBcIiArIHZhbHVlLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsiIDw8IGVuZGw7Ci0gICAgLy8gZG8gdGhlIHJlYWwgY2hlY2sgaGVyZQotICB9Ci0gIAotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJVbmtub3duIGZpZWxkIGlkIFwiICsgc2V0RmllbGQpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlYWRfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBPYmplY3QgcmVhZFZhbHVlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIGZpZWxkKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJfRmllbGRzIHNldEZpZWxkID0gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZC5pZCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiaWYgKHNldEZpZWxkICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0gICAgCi0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0MudHlwZSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbnVsbDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcInNldEZpZWxkIHdhc24ndCBudWxsLCBidXQgZGlkbid0IG1hdGNoIGFueSBvZiB0aGUgY2FzZSBzdGF0ZW1lbnRzIVwiKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG51bGw7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV93cml0ZV92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIHZvaWQgd3JpdGVWYWx1ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGRfKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLSAgICAKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSAKLSAgICAgIDw8ICIgPSAoIiA8PCAgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIil2YWx1ZV87IiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGZpZWxkLCAiIik7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotICAKLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwiQ2Fubm90IHdyaXRlIHVuaW9uIHdpdGggdW5rbm93biBmaWVsZCBcIiArIHNldEZpZWxkXyk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLQotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIGdldEZpZWxkRGVzYyhfRmllbGRzIHNldEZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQzsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJVbmtub3duIGZpZWxkIGlkIFwiICsgc2V0RmllbGQpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBnZXRTdHJ1Y3REZXNjKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIFNUUlVDVF9ERVNDOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgLy8gZXF1YWxpdHkKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIGlmIChvdGhlciBpbnN0YW5jZW9mICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBlcXVhbHMoKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKW90aGVyKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0gZWxzZSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBvdGhlciAhPSBudWxsICYmIGdldFNldEZpZWxkKCkgPT0gb3RoZXIuZ2V0U2V0RmllbGQoKSAmJiBnZXRGaWVsZFZhbHVlKCkuZXF1YWxzKG90aGVyLmdldEZpZWxkVmFsdWUoKSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgY29tcGFyZVRvKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIGludCBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyhnZXRTZXRGaWVsZCgpLCBvdGhlci5nZXRTZXRGaWVsZCgpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIGlmIChsYXN0Q29tcGFyaXNvbiA9PSAwKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8oZ2V0RmllbGRWYWx1ZSgpLCBvdGhlci5nZXRGaWVsZFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBpZiAoZ2VuX2hhc2hfY29kZV8pIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBIYXNoQ29kZUJ1aWxkZXIgaGNiID0gbmV3IEhhc2hDb2RlQnVpbGRlcigpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBoY2IuYXBwZW5kKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0gc2V0RmllbGQgPSBnZXRTZXRGaWVsZCgpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAoc2V0RmllbGQgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAgIGhjYi5hcHBlbmQoc2V0RmllbGQuZ2V0VGhyaWZ0RmllbGRJZCgpKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICBPYmplY3QgdmFsdWUgPSBnZXRGaWVsZFZhbHVlKCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgaWYgKHZhbHVlIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS50aHJpZnQuVEVudW0pIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICAgIGhjYi5hcHBlbmQoKChvcmcuYXBhY2hlLnRocmlmdC5URW51bSlnZXRGaWVsZFZhbHVlKCkpLmdldFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAgIH0gZWxzZSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgICBoY2IuYXBwZW5kKHZhbHVlKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICB9IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGhjYi50b0hhc2hDb2RlKCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IjsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgKiBJZiB5b3UnZCBsaWtlIHRoaXMgdG8gcGVyZm9ybSBtb3JlIHJlc3BlY3RhYmx5LCB1c2UgdGhlIGhhc2hjb2RlIGdlbmVyYXRvciBvcHRpb24uIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBoYXNoQ29kZSgpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIDA7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogSmF2YSBzdHJ1Y3QgZGVmaW5pdGlvbi4gVGhpcyBoYXMgdmFyaW91cyBwYXJhbWV0ZXJzLCBhcyBpdCBjb3VsZCBiZQotICogZ2VuZXJhdGVkIHN0YW5kYWxvbmUgb3IgaW5zaWRlIGFub3RoZXIgY2xhc3MgYXMgYSBoZWxwZXIuIElmIGl0Ci0gKiBpcyBhIGhlbHBlciB0aGFuIGl0IGlzIGEgc3RhdGljIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0c3RydWN0ICAgICAgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKiBAcGFyYW0gaXNfZXhjZXB0aW9uIElzIHRoaXMgYW4gZXhjZXB0aW9uPwotICogQHBhcmFtIGluX2NsYXNzICAgICBJZiBpbnNpZGUgYSBjbGFzcywgbmVlZHMgdG8gYmUgc3RhdGljIGNsYXNzCi0gKiBAcGFyYW0gaXNfcmVzdWx0ICAgIElmIHRoaXMgaXMgYSByZXN1bHQgaXQgbmVlZHMgYSBkaWZmZXJlbnQgd3JpdGVyCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLSAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCB0c3RydWN0KTsKLQotICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gImZpbmFsICIgOiAiIikgPDwKLSAgICAgKGluX2NsYXNzID8gInN0YXRpYyAiIDogIiIpIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAiOwotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgImV4dGVuZHMgRXhjZXB0aW9uICI7Ci0gIH0KLSAgb3V0IDw8ICJpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSI7Ci0KLSAgb3V0IDw8ICIgIjsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGdlbmVyYXRlX3N0cnVjdF9kZXNjKG91dCwgdHN0cnVjdCk7Ci0KLSAgLy8gTWVtYmVycyBhcmUgcHVibGljIGZvciAtamF2YSwgcHJpdmF0ZSBmb3IgLWphdmFiZWFuCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZmllbGRfZGVzY3Mob3V0LCB0c3RydWN0KTsKLQotICBvdXQgPDwgZW5kbDsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKGJlYW5fc3R5bGVfIHx8IHByaXZhdGVfbWVtYmVyc18pIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKm1faXRlcik7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7Ci0gICAgfQotICAgIG91dCA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlKSA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZmllbGRfbmFtZV9jb25zdGFudHMob3V0LCB0c3RydWN0KTsKLQotICAvLyBpc3NldCBkYXRhCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICIvLyBpc3NldCBpZCBhc3NpZ25tZW50cyIgPDwgZW5kbDsKLQotICAgIGludCBpID0gMDsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICIgPDwgaXNzZXRfZmllbGRfaWQoKm1faXRlcikKLSAgICAgICAgICA8PCAiID0gIiA8PCBpIDw8ICI7IiA8PCAgZW5kbDsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChpID4gMCkgewotICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgQml0U2V0IF9faXNzZXRfYml0X3ZlY3RvciA9IG5ldyBCaXRTZXQoIiA8PCBpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfQotCi0gIGdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChvdXQsIHRzdHJ1Y3QpOwotCi0gIGJvb2wgYWxsX29wdGlvbmFsX21lbWJlcnMgPSB0cnVlOwotCi0gIC8vIERlZmF1bHQgY29uc3RydWN0b3IKLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy4iICsgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKLSAgICB9Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgIGFsbF9vcHRpb25hbF9tZW1iZXJzID0gZmFsc2U7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaWYgKCFtZW1iZXJzLmVtcHR5KCkgJiYgIWFsbF9vcHRpb25hbF9tZW1iZXJzKSB7Ci0gICAgLy8gRnVsbCBjb25zdHJ1Y3RvciBmb3IgYWxsIGZpZWxkcwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIgIiA8PAotICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8ICIpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInRoaXMoKTsiIDw8IGVuZGw7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwKLSAgICAgICAgICAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICgqbV9pdGVyKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIGNvcHkgY29uc3RydWN0b3IKLSAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqIFBlcmZvcm1zIGEgZGVlcCBjb3B5IG9uIDxpPm90aGVyPC9pPi4iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGlmIChoYXNfYml0X3ZlY3Rvcih0c3RydWN0KSkgewotICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3IuY2xlYXIoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0X3ZlY3Rvci5vcihvdGhlci5fX2lzc2V0X2JpdF92ZWN0b3IpOyIgPDwgZW5kbDsgICAgCi0gIH0KLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOwotICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHR5cGUpOwotCi0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKG90aGVyLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCAib3RoZXIiLCBmaWVsZF9uYW1lLCAiX190aGlzX18iICsgZmllbGRfbmFtZSwgdHlwZSk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IF9fdGhpc19fIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICI7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsICJvdGhlci4iICsgZmllbGRfbmFtZSwgZmllbGRfbmFtZSwgdHlwZSk7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBjbG9uZSBtZXRob2QsIHNvIHRoYXQgeW91IGNhbiBkZWVwIGNvcHkgYW4gb2JqZWN0IHdoZW4geW91IGRvbid0IGtub3cgaXRzIGNsYXNzLgotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIGRlZXBDb3B5KCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIih0aGlzKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2phdmFfc3RydWN0X2ZpZWxkX2J5X2lkKG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGlmIChpc19yZXN1bHQpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfamF2YV92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZV9vYmplY3Qob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZF9vYmplY3Qob3V0LCB0c3RydWN0KTsKLQotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBlcXVhbHMgbWV0aG9kcyBhbmQgYSBoYXNoQ29kZSBtZXRob2QgZm9yIGEgc3RydWN0dXJlLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAodGhhdCA9PSBudWxsKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgaW5zdGFuY2VvZiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhpcy5lcXVhbHMoKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKXRoYXQpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgdGhhdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAodGhhdCA9PSBudWxsKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIG91dCA8PCBlbmRsOwotCi0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIC8vIE1vc3QgZXhpc3RpbmcgVGhyaWZ0IGNvZGUgZG9lcyBub3QgdXNlIGlzc2V0IG9yIG9wdGlvbmFsL3JlcXVpcmVkLAotICAgIC8vIHNvIHdlIHRyZWF0ICJkZWZhdWx0IiBmaWVsZHMgYXMgcmVxdWlyZWQuCi0gICAgYm9vbCBpc19vcHRpb25hbCA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwodCk7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICBzdHJpbmcgdGhpc19wcmVzZW50ID0gInRydWUiOwotICAgIHN0cmluZyB0aGF0X3ByZXNlbnQgPSAidHJ1ZSI7Ci0gICAgc3RyaW5nIHVuZXF1YWw7Ci0KLSAgICBpZiAoaXNfb3B0aW9uYWwgfHwgY2FuX2JlX251bGwpIHsKLSAgICAgIHRoaXNfcHJlc2VudCArPSAiICYmIHRoaXMuIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpOwotICAgICAgdGhhdF9wcmVzZW50ICs9ICIgJiYgdGhhdC4iICsgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKm1faXRlcik7Ci0gICAgfQotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYm9vbGVhbiB0aGlzX3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgPSAiCi0gICAgICAgICAgICAgICA8PCB0aGlzX3ByZXNlbnQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJib29sZWFuIHRoYXRfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiA9ICIKLSAgICAgICAgICAgICAgIDw8IHRoYXRfcHJlc2VudCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgiIDw8ICJ0aGlzX3ByZXNlbnRfIiA8PCBuYW1lCi0gICAgICAgICAgICAgICA8PCAiIHx8IHRoYXRfcHJlc2VudF8iIDw8IG5hbWUgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoISgiIDw8ICJ0aGlzX3ByZXNlbnRfIiA8PCBuYW1lCi0gICAgICAgICAgICAgICA8PCAiICYmIHRoYXRfcHJlc2VudF8iIDw8IG5hbWUgPDwgIikpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotCi0gICAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXQpLT5pc19iaW5hcnkoKSkgewotICAgICAgdW5lcXVhbCA9ICIhdGhpcy4iICsgbmFtZSArICIuZXF1YWxzKHRoYXQuIiArIG5hbWUgKyAiKSI7Ci0gICAgfSBlbHNlIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgdW5lcXVhbCA9ICIhdGhpcy4iICsgbmFtZSArICIuZXF1YWxzKHRoYXQuIiArIG5hbWUgKyAiKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHVuZXF1YWwgPSAidGhpcy4iICsgbmFtZSArICIgIT0gdGhhdC4iICsgbmFtZTsKLSAgICB9Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoIiA8PCB1bmVxdWFsIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0gIG91dCA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBpbnQgaGFzaENvZGUoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKGdlbl9oYXNoX2NvZGVfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIkhhc2hDb2RlQnVpbGRlciBidWlsZGVyID0gbmV3IEhhc2hDb2RlQnVpbGRlcigpOyIgPDwgZW5kbDsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIG91dCA8PCBlbmRsOwotCi0gICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBib29sIGlzX29wdGlvbmFsID0gKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHQpOwotICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAgIHN0cmluZyBwcmVzZW50ID0gInRydWUiOwotCi0gICAgICBpZiAoaXNfb3B0aW9uYWwgfHwgY2FuX2JlX251bGwpIHsKLSAgICAgICAgcHJlc2VudCArPSAiICYmICgiICsgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKm1faXRlcikgKyAiKSI7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICJib29sZWFuIHByZXNlbnRfIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHByZXNlbnQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiYnVpbGRlci5hcHBlbmQocHJlc2VudF8iIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImlmIChwcmVzZW50XyIgPDwgbmFtZSA8PCAiKSIgPDwgZW5kbDsKLSAgICAgIGlmICh0LT5pc19lbnVtKCkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgYnVpbGRlci5hcHBlbmQoIiA8PCBuYW1lIDw8ICIuZ2V0VmFsdWUoKSk7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgYnVpbGRlci5hcHBlbmQoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXQgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGJ1aWxkZXIudG9IYXNoQ29kZSgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBjb21wYXJlVG8oIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImlmICghZ2V0Q2xhc3MoKS5lcXVhbHMob3RoZXIuZ2V0Q2xhc3MoKSkpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJpbnQgbGFzdENvbXBhcmlzb24gPSAwOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgdHlwZWRPdGhlciA9ICgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKW90aGVyOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKm1faXRlcjsKLSAgICBpbmRlbnQob3V0KSA8PCAibGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIikuY29tcGFyZVRvKHR5cGVkT3RoZXIuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIik7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLCB0eXBlZE90aGVyLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgInJldHVybiAwOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcyBhbmQgcmVhZCBzdHJ1Y3QgaGVhZGVyCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgZmllbGQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwKLSAgICAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpZiAoZmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVE9QKSB7ICIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImJyZWFrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAifSIgPDwgZW5kbDsKLQotICAgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQuaWQpIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IC8vICIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKLSAgICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICpmX2l0ZXIpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLQotICAgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlwcm90LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gICAgLy8gaW4gbm9uLWJlYW5zIHN0eWxlLCBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlCi0gICAgLy8gKHdoaWNoIGNhbiBiZSBjaGVja2VkIGhlcmUgYnV0IG5vdCBpbiB0aGUgZ2VuZXJhbCB2YWxpZGF0ZSBtZXRob2QpCi0gICAgaWYgKCFiZWFuX3N0eWxlXyl7Ci0gICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZSwgd2hpY2ggY2FuJ3QgYmUgY2hlY2tlZCBpbiB0aGUgdmFsaWRhdGUgbWV0aG9kIiA8PCBlbmRsOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQgJiYgIXR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmICghIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKFwiUmVxdWlyZWQgZmllbGQgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIHdhcyBub3QgZm91bmQgaW4gc2VyaWFsaXplZCBkYXRhISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotICAgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8vIGdlbmVyYXRlcyBqYXZhIG1ldGhvZCB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCi0vLyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV92YWxpZGF0b3Iob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KXsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaWYgKGJlYW5fc3R5bGVfKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoISIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24oXCJSZXF1aXJlZCBmaWVsZCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgaXMgdW5zZXQhIFN0cnVjdDpcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgICB9IGVsc2V7Ci0gICAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKFwiUmVxdWlyZWQgZmllbGQgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIHdhcyBub3QgcHJlc2VudCEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gYWxhcywgd2UgY2Fubm90IGNoZWNrICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyBiZWNhdXNlIGl0J3MgYSBwcmltaXRpdmUgYW5kIHlvdSBjaG9zZSB0aGUgbm9uLWJlYW5zIGdlbmVyYXRvci4iIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLSAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIGJvb2wgb3B0aW9uYWwgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgIGlmIChvcHRpb25hbCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCgqZl9pdGVyKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaWYgKG9wdGlvbmFsKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LAotICogd2hpY2ggaXMgYSBmdW5jdGlvbiByZXN1bHQuIFRoZXNlIGZpZWxkcyBhcmUgb25seSB3cml0dGVuCi0gKiBpZiB0aGV5IGFyZSBzZXQgaW4gdGhlIElzc2V0IGFycmF5LCBhbmQgb25seSBvbmUgb2YgdGhlbQotICogY2FuIGJlIHNldCBhdCBhIHRpbWUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIG91dCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgIiBlbHNlIGlmICI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIodGhpcy4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICAKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICB9Ci0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2ZpZWxkX2J5X2lkKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIF9GaWVsZHMgZmllbGRGb3JJZChpbnQgZmllbGRJZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIGZpZWxkX25hbWUsIHN0cmluZyBjYXBfbmFtZSkgewotICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHlwZS0+aXNfc3RyaW5nKCkpIHsKLSAgICB0X2Jhc2VfdHlwZSogYmFzZV90eXBlID0gKHRfYmFzZV90eXBlKil0eXBlOwotCi0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIi52YWx1ZU9mKCIgPDwgKGJhc2VfdHlwZS0+aXNfYm9vbCgpID8gImlzIiA6ICJnZXQiKSA8PCBjYXBfbmFtZSA8PCAiKCkpOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gZ2V0IiA8PCBjYXBfbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIGZpZWxkX25hbWUsIHN0cmluZyBjYXBfbmFtZSkgewotICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiaWYgKHZhbHVlID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHVuc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoKCIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiKXZhbHVlKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0KLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGdldHRlcl9zdHJlYW07Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBzZXR0ZXJfc3RyZWFtOwotCi0gIC8vIGJ1aWxkIHVwIHRoZSBib2RpZXMgb2YgYm90aCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXQgb25jZQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKLQotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7Ci0gICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKGdldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLQotICAvLyBjcmVhdGUgdGhlIHNldHRlcgotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIE9iamVjdCB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc3dpdGNoIChmaWVsZCkgeyIgPDwgZW5kbDsKLSAgb3V0IDw8IHNldHRlcl9zdHJlYW0uc3RyKCk7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gY3JlYXRlIHRoZSBnZXR0ZXIKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBPYmplY3QgZ2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQpIHsiIDw8IGVuZGw7Ci0gIG91dCA8PCBnZXR0ZXJfc3RyZWFtLnN0cigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8vIENyZWF0ZXMgYSBnZW5lcmljIGlzU2V0IG1ldGhvZCB0aGF0IHRha2VzIHRoZSBmaWVsZCBudW1iZXIgYXMgYXJndW1lbnQKLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCl7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBjcmVhdGUgdGhlIGlzU2V0IG1ldGhvZAotICBpbmRlbnQob3V0KSA8PCAiLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gaXNTZXQoX0ZpZWxkcyBmaWVsZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZCkgeyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXQgb2YgSmF2YSBCZWFuIGJvaWxlcnBsYXRlIGZ1bmN0aW9ucyAoc2V0dGVycywgZ2V0dGVycywgZXRjLikKLSAqIGZvciB0aGUgZ2l2ZW4gc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7Ci0KLSAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIC8vIE1ldGhvZCB0byByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGNvbGxlY3Rpb24KLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGdldCIgPDwgY2FwX25hbWU7Ci0gICAgICBvdXQgPDwgZ2V0X2NhcF9uYW1lKCJzaXplKCkgeyIpIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSA/IDAgOiAiIDw8Ci0gICAgICAgICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnNpemUoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpZiAodHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbGlzdCgpKSB7Ci0KLSAgICAgIHRfdHlwZSogZWxlbWVudF90eXBlOwotICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAgIGVsZW1lbnRfdHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBlbGVtZW50X3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgIH0KLQotICAgICAgLy8gSXRlcmF0b3IgZ2V0dGVyIGZvciBzZXRzIGFuZCBsaXN0cwotICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3I8IiA8PAotICAgICAgICB0eXBlX25hbWUoZWxlbWVudF90eXBlLCB0cnVlLCBmYWxzZSkgPDwgICI+IGdldCIgPDwgY2FwX25hbWU7Ci0gICAgICBvdXQgPDwgZ2V0X2NhcF9uYW1lKCJpdGVyYXRvcigpIHsiKSA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyBudWxsIDogIiA8PAotICAgICAgICAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5pdGVyYXRvcigpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgICAvLyBBZGQgdG8gc2V0IG9yIGxpc3QsIGNyZWF0ZSBpZiB0aGUgc2V0L2xpc3QgaXMgbnVsbAotICAgICAgaW5kZW50KG91dCk7Ci0gICAgICBvdXQgPDwgInB1YmxpYyB2b2lkIGFkZCIgPDwgZ2V0X2NhcF9uYW1lKCJ0byIpOwotICAgICAgb3V0IDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUoZWxlbWVudF90eXBlKSA8PCAiIGVsZW0pIHsiIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PAotICAgICAgICAiKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuYWRkKGVsZW0pOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgICAgLy8gUHV0IHRvIG1hcAotICAgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0KLSAgICAgIGluZGVudChvdXQpOwotICAgICAgb3V0IDw8ICJwdWJsaWMgdm9pZCBwdXQiIDw8IGdldF9jYXBfbmFtZSgidG8iKTsKLSAgICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKGtleV90eXBlKSA8PCAiIGtleSwgIgotICAgICAgICA8PCB0eXBlX25hbWUodmFsX3R5cGUpIDw8ICIgdmFsKSB7IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5ldyAiIDw8Ci0gICAgICAgIHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnB1dChrZXksIHZhbCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gU2ltcGxlIGdldHRlcgotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOwotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYnl0ZVtdIGdldCIgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBzZXQiIDw8IGNhcF9uYW1lIDw8ICIob3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIucmlnaHRTaXplKCIgPDwgZmllbGRfbmFtZSA8PCAiKSk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuICIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwgPyBudWxsIDogIiA8PCBmaWVsZF9uYW1lIDw8ICIuYXJyYXkoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIEJ5dGVCdWZmZXIgYnVmZmVyIiA8PCBnZXRfY2FwX25hbWUoImZvciIpIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHlwZSk7Ci0gICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYKLSAgICAgICAgICAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKSB7Ci0gICAgICAgIG91dCA8PCAiIGlzIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiIGdldCI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBTaW1wbGUgc2V0dGVyCi0gICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiOwotICAgICAgaWYgKGJlYW5fc3R5bGVfKSB7Ci0gICAgICAgIG91dCA8PCAidm9pZCI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICAgICAgfQotICAgICAgb3V0IDw8ICIgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKGJ5dGVbXSAiIDw8IGZpZWxkX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHNldCIgPDwgY2FwX25hbWUgPDwgIigiIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsID8gKEJ5dGVCdWZmZXIpbnVsbCA6IEJ5dGVCdWZmZXIud3JhcCgiIDw8IGZpZWxkX25hbWUgPDwgIikpOyIgPDwgZW5kbDsKLSAgICAgIGlmICghYmVhbl9zdHlsZV8pIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIHRoaXM7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiOwotICAgIGlmIChiZWFuX3N0eWxlXykgewotICAgICAgb3V0IDw8ICJ2b2lkIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgICB9Ci0gICAgb3V0IDw8ICIgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCBmaWVsZF9uYW1lIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8Ci0gICAgICBlbmRsOwotICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsIGZpZWxkKTsKLSAgICBpZiAoIWJlYW5fc3R5bGVfKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXM7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIFVuc2V0dGVyCi0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0X3ZlY3Rvci5jbGVhcigiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIGlzU2V0IG1ldGhvZAotICAgIGluZGVudChvdXQpIDw8ICIvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkICIgPDwgZmllbGRfbmFtZSA8PCAiIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gaXMiIDw8IGdldF9jYXBfbmFtZSgic2V0IikgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBudWxsOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBfX2lzc2V0X2JpdF92ZWN0b3IuZ2V0KCIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHNldCIgPDwgY2FwX25hbWUgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIoYm9vbGVhbiB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICghdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0X3ZlY3Rvci5zZXQoIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIiwgdmFsdWUpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOyAKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRvU3RyaW5nKCkgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIFN0cmluZyB0b1N0cmluZygpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIik7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2xlYW4gZmlyc3QgPSB0cnVlOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgaWYoY291bGRfYmVfdW5zZXQpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0KLSAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFmaXJzdCkgc2IuYXBwZW5kKFwiLCBcIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAic2IuYXBwZW5kKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIik7IiA8PCBlbmRsOwotICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBzYi5hcHBlbmQoXCJudWxsXCIpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICAKLSAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKShmaWVsZC0+Z2V0X3R5cGUoKSkpLT5pc19iaW5hcnkoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLnRvU3RyaW5nKHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLCBzYik7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAic2IuYXBwZW5kKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICAKLSAgICBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgImZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOwotCi0gICAgaWYoY291bGRfYmVfdW5zZXQpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZmlyc3QgPSBmYWxzZTsKLSAgfQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAic2IuYXBwZW5kKFwiKVwiKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIHNiLnRvU3RyaW5nKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdGF0aWMgbWFwIHdpdGggbWV0YSBkYXRhIHRvIHN0b3JlIGluZm9ybWF0aW9uIHN1Y2ggYXMgZmllbGRJRCB0bwotICogZmllbGROYW1lIG1hcHBpbmcKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX21ldGFfZGF0YV9tYXAob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBTdGF0aWMgTWFwIHdpdGggZmllbGRJRCAtPiBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSBtYXBwaW5ncwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBmaW5hbCBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IG1ldGFEYXRhTWFwOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAiTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiB0bXBNYXAgPSBuZXcgRW51bU1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4oX0ZpZWxkcy5jbGFzcyk7IiA8PCBlbmRsOwotCi0gIC8vIFBvcHVsYXRlIG1hcAotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInRtcE1hcC5wdXQoX0ZpZWxkcy4iIDw8IGNvbnN0YW50X25hbWUoZmllbGRfbmFtZSkgPDwgIiwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKFwiIiA8PCBmaWVsZF9uYW1lIDw8ICJcIiwgIjsKLQotICAgIC8vIFNldCBmaWVsZCByZXF1aXJlbWVudCB0eXBlIChyZXF1aXJlZCwgb3B0aW9uYWwsIGV0Yy4pCi0gICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgb3V0IDw8ICJvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuUkVRVUlSRUQsICI7Ci0gICAgfSBlbHNlIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgIG91dCA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5ERUZBVUxULCAiOwotICAgIH0KLQotICAgIC8vIENyZWF0ZSB2YWx1ZSBtZXRhIGRhdGEKLSAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgb3V0ICA8PCAiKSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgIm1ldGFEYXRhTWFwID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHRtcE1hcCk7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLmNsYXNzLCBtZXRhRGF0YU1hcCk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKiogCi0gKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRocmlmdCB0eXBlCi0gKiAoZS5nLiBmb3IgdGhlIHR5cGUgc3RydWN0IGl0IHJldHVybnMgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCIpCi0gKi8KLXN0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSkgewotICBpZiAodHlwZS0+aXNfbGlzdCgpKXsKLSAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5FTlVNIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICByZXR1cm4gZ2V0X2phdmFfdHlwZV9zdHJpbmcoKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRCAgIDogcmV0dXJuICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlZPSUQiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HIDogcmV0dXJuICAgICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkciOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCAgIDogcmV0dXJuICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkJPT0wiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURSAgIDogcmV0dXJuICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkJZVEUiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2ICAgIDogcmV0dXJuICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMTYiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyICAgIDogcmV0dXJuICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0ICAgIDogcmV0dXJuICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFIDogcmV0dXJuICAgICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUiOyBicmVhazsKLSAgICAgIGRlZmF1bHQgOiB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKSArICJcIiBwYXNzZWQgdG8gdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmchIik7IGJyZWFrOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCi0gICAgfQotICB9IGVsc2UgewotICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIlwiIHBhc3NlZCB0byB0X2phdmFfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyEiKTsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKXsKLSAgb3V0IDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKXsKLSAgICBpbmRlbnQob3V0KSA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TdHJ1Y3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIuY2xhc3MiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKXsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKXsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkxpc3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNULCAiOwotICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsgICAgCi0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOyAgIAotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpewotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuU2V0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU0VULCAiOwotICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsgICAgCi0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOyAKLSAgICB9IGVsc2V7IC8vIG1hcAotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuTWFwTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCAiOwotICAgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBrZXlfdHlwZSk7Ci0gICAgICBvdXQgPDwgIiwgIjsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIHZhbF90eXBlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRW51bU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkVOVU0sICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIuY2xhc3MiOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YSgiIDw8IGdldF9qYXZhX3R5cGVfc3RyaW5nKHR5cGUpOwotICAgIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIsIFwiIiA8PCAoKHRfdHlwZWRlZiopdHlwZSktPmdldF9zeW1ib2xpYygpIDw8ICJcIiI7Ci0gICAgfSBlbHNlIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIsIHRydWUiOwotICAgIH0KLSAgfQotICBvdXQgPDwgIikiOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKLSAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcwotICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgotICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrc2VydmljZV9uYW1lXysiLmphdmEiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgamF2YV9wYWNrYWdlKCkgPDwKLSAgICBqYXZhX3R5cGVfaW1wb3J0cygpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZQotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgIn0iIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2lmYWNlID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIi5JZmFjZSI7Ci0gIH0KLQotICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnRlcmZhY2UgSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwKLSAgICAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2lmYWNlID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIiAuQXN5bmNJZmFjZSI7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIEFzeW5jSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYygqZl9pdGVyLCB0cnVlKSA8PCAiIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcwotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgPT0gTlVMTCkgewotICAgIGV4dGVuZHNfY2xpZW50ID0gIm9yZy5hcGFjaGUudGhyaWZ0LlRTZXJ2aWNlQ2xpZW50IjsKLSAgfSBlbHNlIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLkNsaWVudCI7Ci0gIH0KLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIHN0YXRpYyBjbGFzcyBDbGllbnQgZXh0ZW5kcyAiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICIgaW1wbGVtZW50cyBJZmFjZSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRTZXJ2aWNlQ2xpZW50RmFjdG9yeTxDbGllbnQ+IHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBGYWN0b3J5KCkge30iIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudCBnZXRDbGllbnQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBuZXcgQ2xpZW50KHByb3QpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQgZ2V0Q2xpZW50KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gbmV3IENsaWVudChpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIENsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAic3VwZXIocHJvdCwgcHJvdCk7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBDbGllbnQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOwotCi0gICAgLy8gR2V0IHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gY2FsbCBwYXJhbXMKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLQotICAgIC8vIERlY2xhcmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKLQotICAgIHN0cmluZyBhcmdzbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncy5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIigiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmRCYXNlKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgYXJncyk7IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJlY2VpdmVCYXNlKHJlc3VsdCwgXCIiIDw8IGZ1bm5hbWUgPDwgIlwiKTsiIDw8IGVuZGw7Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygic3VjY2VzcyIpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3M7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInRocm93IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ob3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAib3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50IjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyAiLkFzeW5jQ2xpZW50IjsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIEFzeW5jQ2xpZW50IGV4dGVuZHMgIiA8PCBleHRlbmRzIDw8ICIgaW1wbGVtZW50cyBBc3luY0lmYWNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIEZhY3RvcnkgbWV0aG9kCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50RmFjdG9yeTxBc3luY0NsaWVudD4geyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHByaXZhdGUgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50TWFuYWdlciBjbGllbnRNYW5hZ2VyOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHByaXZhdGUgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3Rvcnk7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcHVibGljIEZhY3Rvcnkob3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50TWFuYWdlciBjbGllbnRNYW5hZ2VyLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgICAgdGhpcy5jbGllbnRNYW5hZ2VyID0gY2xpZW50TWFuYWdlcjsiIDw8IGVuZGw7IAotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgICB0aGlzLnByb3RvY29sRmFjdG9yeSA9IHByb3RvY29sRmFjdG9yeTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcHVibGljIEFzeW5jQ2xpZW50IGdldEFzeW5jQ2xpZW50KG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnNwb3J0KSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgICByZXR1cm4gbmV3IEFzeW5jQ2xpZW50KHByb3RvY29sRmFjdG9yeSwgY2xpZW50TWFuYWdlciwgdHJhbnNwb3J0KTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBBc3luY0NsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSwgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50TWFuYWdlciBjbGllbnRNYW5hZ2VyLCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zcG9ydCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKHByb3RvY29sRmFjdG9yeSwgY2xpZW50TWFuYWdlciwgdHJhbnNwb3J0KTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHRfdHlwZSogcmV0X3R5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgc3RyaW5nIGZ1bmNsYXNzbmFtZSA9IGZ1bm5hbWUgKyAiX2NhbGwiOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgYXJnc19uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgICBzdHJpbmcgcmVzdWx0X25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgICAvLyBNYWluIG1ldGhvZCBib2R5ICAgCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmMoKmZfaXRlciwgZmFsc2UpIDw8ICIgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgY2hlY2tSZWFkeSgpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgIiA8PCBmdW5jbGFzc25hbWUgPDwgIiBtZXRob2RfY2FsbCA9IG5ldyAiICsgZnVuY2xhc3NuYW1lICsgIigiIDw8IGFzeW5jX2FyZ3VtZW50X2xpc3QoKmZfaXRlciwgYXJnX3N0cnVjdCwgcmV0X3R5cGUpIDw8ICIsIHRoaXMsIF9fX3Byb3RvY29sRmFjdG9yeSwgX19fdHJhbnNwb3J0KTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHRoaXMuX19fY3VycmVudE1ldGhvZCA9IG1ldGhvZF9jYWxsOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgX19fbWFuYWdlci5jYWxsKG1ldGhvZF9jYWxsKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgLy8gVEFzeW5jTWV0aG9kIG9iamVjdCBmb3IgdGhpcyBmdW5jdGlvbiBjYWxsCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzICIgKyBmdW5jbGFzc25hbWUgKyAiIGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jTWV0aG9kQ2FsbCB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgLy8gTWVtYmVyIHZhcmlhYmxlcwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgIiArIHR5cGVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiICIgKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSArICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIE5PVEUgc2luY2Ugd2UgdXNlIGEgbmV3IENsaWVudCBpbnN0YW5jZSB0byBkZXNlcmlhbGl6ZSwgbGV0J3Mga2VlcCBzZXFpZCB0byAwIGZvciBub3cKLSAgICAvLyBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgaW50IHNlcWlkOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gQ29uc3RydWN0b3IKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiICsgZnVuY2xhc3NuYW1lICsgIigiICsgYXN5bmNfYXJndW1lbnRfbGlzdCgqZl9pdGVyLCBhcmdfc3RydWN0LCByZXRfdHlwZSwgdHJ1ZSkgPDwgIiwgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50IGNsaWVudCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnNwb3J0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihjbGllbnQsIHByb3RvY29sRmFjdG9yeSwgdHJhbnNwb3J0LCByZXN1bHRIYW5kbGVyLCAiIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gInRydWUiIDogImZhbHNlIikgPDwgIik7IiA8PCBlbmRsOwotCi0gICAgLy8gQXNzaWduIG1lbWJlciB2YXJpYWJsZXMKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHRoaXMuIiArICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiA9ICIgKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSArICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgdm9pZCB3cml0ZV9hcmdzKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgLy8gU2VyaWFsaXplIHJlcXVlc3QKLSAgICAvLyBOT1RFIHdlIGFyZSBsZWF2aW5nIHNlcWlkIGFzIDAsIGZvciBub3cgKHNlZSBhYm92ZSkKLSAgICBmX3NlcnZpY2VfIDw8IAotICAgICAgaW5kZW50KCkgPDwgInByb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlLkNBTEwsIDApKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IGFyZ3NfbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzX25hbWUgPDwgIigpOyIgPDwgZW5kbDsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKCIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwgCi0gICAgICBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShwcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBSZXR1cm4gbWV0aG9kICAKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiICsgdHlwZV9uYW1lKHJldF90eXBlKSArICIgZ2V0UmVzdWx0KCkgdGhyb3dzICI7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgKyAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKGdldFN0YXRlKCkgIT0gb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jTWV0aG9kQ2FsbC5TdGF0ZS5SRVNQT05TRV9SRUFEKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwiTWV0aG9kIGNhbGwgbm90IGZpbmlzaGVkIVwiKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRNZW1vcnlJbnB1dFRyYW5zcG9ydCBtZW1vcnlUcmFuc3BvcnQgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRNZW1vcnlJbnB1dFRyYW5zcG9ydChnZXRGcmFtZUJ1ZmZlcigpLmFycmF5KCkpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90ID0gY2xpZW50LmdldFByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKG1lbW9yeVRyYW5zcG9ydCk7IiA8PCBlbmRsOwotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pOwotICAgICAgaWYgKCFyZXRfdHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOyAKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgIihuZXcgQ2xpZW50KHByb3QpKS5yZWN2XyIgKyBmdW5uYW1lICsgIigpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgLy8gQ2xvc2UgY2xhc3MKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gQ2xvc2UgQXN5bmNDbGllbnQKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIEV4dGVuZHMgc3R1ZmYKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSA9PSBOVUxMKSB7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2VQcm9jZXNzb3IiOwotICB9IGVsc2UgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuUHJvY2Vzc29yIjsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIHN0YXRpYyBjbGFzcyBQcm9jZXNzb3I8SSBleHRlbmRzIElmYWNlPiBleHRlbmRzICIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIiBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3IgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUHJvY2Vzc29yLmNsYXNzLmdldE5hbWUoKSk7IiA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIFByb2Nlc3NvcihJIGlmYWNlKSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgc3VwZXIoaWZhY2UsIGdldFByb2Nlc3NNYXAobmV3IEhhc2hNYXA8U3RyaW5nLCBvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPj4oKSkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgUHJvY2Vzc29yKEkgaWZhY2UsIE1hcDxTdHJpbmcsICBvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzICBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZT4+IHByb2Nlc3NNYXApIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihpZmFjZSwgZ2V0UHJvY2Vzc01hcChwcm9jZXNzTWFwKSk7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgc3RhdGljIDxJIGV4dGVuZHMgSWZhY2U+IE1hcDxTdHJpbmcsICBvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzICBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZT4+IGdldFByb2Nlc3NNYXAoTWFwPFN0cmluZywgIG9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPj4gcHJvY2Vzc01hcCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzTWFwLnB1dChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgbmV3ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoKSk7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHByb2Nlc3NNYXA7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHJlc3VsdG5hbWUgPSAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2UiOwotICB9Ci0KLSAgKHZvaWQpIHRzZXJ2aWNlOwotICAvLyBPcGVuIGNsYXNzCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwcml2YXRlIHN0YXRpYyBjbGFzcyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiPEkgZXh0ZW5kcyBJZmFjZT4gZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgIiA8PCBhcmdzbmFtZSA8PCAiPiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvdGVjdGVkICIgPDwgYXJnc25hbWUgPDwgIiBnZXRFbXB0eUFyZ3NJbnN0YW5jZSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByZXR1cm4gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgIiA8PCByZXN1bHRuYW1lIDw8ICIgZ2V0UmVzdWx0KEkgaWZhY2UsICIgPDwgYXJnc25hbWUgPDwgIiBhcmdzKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJpZmFjZS4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgJiYgIXR5cGVfY2FuX2JlX251bGwodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuc2V0IiA8PCBnZXRfY2FwX25hbWUoInN1Y2Nlc3MiKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIih0cnVlKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJ9IjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBudWxsOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiByZXN1bHQ7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSI7Ci0KLSAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIENsb3NlIGNsYXNzCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKLSAqIEBwYXJhbSBwcmVmaXggVGhlIHZhcmlhYmxlIG5hbWUgb3IgY29udGFpbmVyIGZvciB0aGlzIGZpZWxkCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBpcHJvdC4iOwotCi0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKwotICAgICAgICAgIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoKTsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAicmVhZEJvb2woKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAicmVhZEkxNigpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAicmVhZEk2NCgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKYXZhIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgKyAiLmZpbmRCeVZhbHVlKGlwcm90LnJlYWRJMzIoKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGludm9rZXMgcmVhZCgpCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgc3RyaW5nIG9iajsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbWFwIik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfc2V0Iik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKLSAgfQotCi0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNldCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KQotICAgIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkKLSAgICAvLyBzaXplIHRoZSBjb2xsZWN0aW9uIGNvcnJlY3RseQotICAgIDw8ICIoIgotICAgIDw8ICh0dHlwZS0+aXNfbGlzdCgpID8gIiIgOiAiMioiICkKLSAgICA8PCBvYmogPDwgIi5zaXplIgotICAgIDw8ICIpOyIgPDwgZW5kbDsKLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJmb3IgKGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwKLSAgICBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLnNpemUiIDw8ICI7ICIgPDwKLSAgICAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKLSAgICB9Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIucHV0KCIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5hZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBsaXN0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSl7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlSTMyKCIgPDwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIuZ2V0VmFsdWUoKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93Ci0gICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSB3cml0aW5nIGl0cyBzaXplIHRoZW4gdGhlIGVsZW1lbnRzLgotICoKLSAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCi0gKiBAcGFyYW0gcHJlZml4IFN0cmluZyBwcmVmaXggZm9yIGZpZWxkcwotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVTZXRCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNldCgiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QoIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAoTWFwLkVudHJ5PCIgPDwKLSAgICAgIHR5cGVfbmFtZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiwgIiA8PAotICAgICAgdHlwZV9uYW1lKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiPiAiIDw8IGl0ZXIgPDwKLSAgICAgICIgOiAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5lbnRyeVNldCgpKSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3IgKCIgPDwKLSAgICAgIHR5cGVfbmFtZSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIgPDwKLSAgICAgICIgOiAiIDw8Ci0gICAgICBwcmVmaXggPDwgIikiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAoIiA8PAotICAgICAgdHlwZV9uYW1lKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIgPDwKLSAgICAgICIgOiAiIDw8Ci0gICAgICBwcmVmaXggPDwgIikiOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICB9Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXApIHsKLSAgKHZvaWQpIG1hcDsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIgKyAiLmdldEtleSgpIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIGl0ZXIgKyAiLmdldFZhbHVlKCkiKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFJldHVybnMgYSBKYXZhIHR5cGUgbmFtZQotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICogQHBhcmFtIGNvbnRhaW5lciBJcyB0aGUgdHlwZSBnb2luZyBpbnNpZGUgYSBjb250YWluZXI/Ci0gKiBAcmV0dXJuIEphdmEgdHlwZSBuYW1lLCBpLmUuIEhhc2hNYXA8S2V5LFZhbHVlPgotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY29udGFpbmVyLCBib29sIGluX2luaXQsIGJvb2wgc2tpcF9nZW5lcmljKSB7Ci0gIC8vIEluIEphdmEgdHlwZWRlZnMgYXJlIGp1c3QgcmVzb2x2ZWQgdG8gdGhlaXIgcmVhbCB0eXBlCi0gIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0gIHN0cmluZyBwcmVmaXg7Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlLCBpbl9jb250YWluZXIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKikgdHR5cGU7Ci0gICAgaWYgKGluX2luaXQpIHsKLSAgICAgIHByZWZpeCA9ICJIYXNoTWFwIjsKLSAgICB9IGVsc2UgewotICAgICAgcHJlZml4ID0gIk1hcCI7Ci0gICAgfQotICAgIHJldHVybiBwcmVmaXggKyAoc2tpcF9nZW5lcmljID8gIiIgOiAiPCIgKwotICAgICAgdHlwZV9uYW1lKHRtYXAtPmdldF9rZXlfdHlwZSgpLCB0cnVlKSArICIsIiArCi0gICAgICB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHRydWUpICsgIj4iKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3NldCogdHNldCA9ICh0X3NldCopIHR0eXBlOwotICAgIGlmIChpbl9pbml0KSB7Ci0gICAgICBwcmVmaXggPSAiSGFzaFNldCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByZWZpeCA9ICJTZXQiOwotICAgIH0KLSAgICByZXR1cm4gcHJlZml4ICsgKHNraXBfZ2VuZXJpYyA/ICIiIDogIjwiICsgdHlwZV9uYW1lKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSkgKyAiPiIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopIHR0eXBlOwotICAgIGlmIChpbl9pbml0KSB7Ci0gICAgICBwcmVmaXggPSAiQXJyYXlMaXN0IjsKLSAgICB9IGVsc2UgewotICAgICAgcHJlZml4ID0gIkxpc3QiOwotICAgIH0KLSAgICByZXR1cm4gcHJlZml4ICsgKHNraXBfZ2VuZXJpYyA/ICIiIDogIjwiICsgdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iKTsKLSAgfQotCi0gIC8vIENoZWNrIGZvciBuYW1lc3BhY2luZwotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJqYXZhIik7Ci0gICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBwYWNrYWdlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIEphdmEgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQotICogQHBhcmFtIGNvbnRhaW5lciBJcyBpdCBnb2luZyBpbiBhIEphdmEgY29udGFpbmVyPwotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIpIHsKLSAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7Ci0KLSAgc3dpdGNoICh0YmFzZSkgewotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgcmV0dXJuICJ2b2lkIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICByZXR1cm4gIkJ5dGVCdWZmZXIiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gIlN0cmluZyI7Ci0gICAgfQotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiQm9vbGVhbiIgOiAiYm9vbGVhbiIpOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiQnl0ZSIgOiAiYnl0ZSIpOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJTaG9ydCIgOiAic2hvcnQiKTsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiSW50ZWdlciIgOiAiaW50Iik7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkxvbmciIDogImxvbmciKTsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiRG91YmxlIiA6ICJkb3VibGUiKTsKLSAgZGVmYXVsdDoKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICB9Ci19Ci0KLS8qKgotICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKiBAcGFyYW0gaW5pdCBXaGV0aGVyIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkCi0gKi8KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0KSB7Ci0gIC8vIFRPRE8obWNzbGVlKTogZG8gd2UgZXZlciBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkPwotICBzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIGlmIChpbml0KSB7Ci0gICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgb2ZzdHJlYW0gZHVtbXk7Ci0gICAgICByZXN1bHQgKz0gIiA9ICIgKyByZW5kZXJfY29uc3RfdmFsdWUoZHVtbXksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOzsKLSAgICB9Ci0gIH0KLSAgcmVzdWx0ICs9ICI7IC8vICI7Ci0gIGlmICh0ZmllbGQtPmdldF94c2Rfb3B0aW9uYWwoKSkgewotICAgIHJlc3VsdCArPSAib3B0aW9uYWwiOwotICB9IGVsc2UgewotICAgIHJlc3VsdCArPSAicmVxdWlyZWQiOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwotICBzdGQ6OnN0cmluZyByZXN1bHQgPQotICAgIHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSB0aHJvd3MgIjsKLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICIsICI7Ci0gIH0KLSAgcmVzdWx0ICs9ICJvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndm9pZCBuYW1lKGFyZ3MsIHJlc3VsdEhhbmRsZXIpJwotICAqCi0gICogQHBhcmFtcyB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAgKi8KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmModF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIHVzZV9iYXNlX21ldGhvZCwgc3RyaW5nIHByZWZpeCkgewotICBzdGQ6OnN0cmluZyBhcmdsaXN0ID0gYXN5bmNfZnVuY3Rpb25fY2FsbF9hcmdsaXN0KHRmdW5jdGlvbiwgdXNlX2Jhc2VfbWV0aG9kLCB0cnVlKTsKLQotICBzdGQ6OnN0cmluZyByZXRfdHlwZSA9ICIiOwotICBpZiAodXNlX2Jhc2VfbWV0aG9kKSB7Ci0gICAgcmV0X3R5cGUgKz0gIkFzeW5jQ2xpZW50LiI7Ci0gIH0KLSAgcmV0X3R5cGUgKz0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9jYWxsIjsKLQotICBzdGQ6OnN0cmluZyByZXN1bHQgPSBwcmVmaXggKyAidm9pZCAiICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgYXJnbGlzdCArICIpIjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmFzeW5jX2Z1bmN0aW9uX2NhbGxfYXJnbGlzdCh0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCB1c2VfYmFzZV9tZXRob2QsIGJvb2wgaW5jbHVkZV90eXBlcykgewotICBzdGQ6OnN0cmluZyBhcmdsaXN0ID0gIiI7Ci0gIGlmICh0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPiAwKSB7Ci0gICAgYXJnbGlzdCA9IGFyZ3VtZW50X2xpc3QodGZ1bmMtPmdldF9hcmdsaXN0KCksIGluY2x1ZGVfdHlwZXMpICsgIiwgIjsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHJldF90eXBlID0gIiI7Ci0gIGlmICh1c2VfYmFzZV9tZXRob2QpIHsKLSAgICByZXRfdHlwZSArPSAiQXN5bmNDbGllbnQuIjsKLSAgfQotICByZXRfdHlwZSArPSB0ZnVuYy0+Z2V0X25hbWUoKSArICJfY2FsbCI7Ci0KLSAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKLSAgICBhcmdsaXN0ICs9ICJvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrPCIgKyByZXRfdHlwZSArICI+ICI7Ci0gIH0KLSAgYXJnbGlzdCArPSAicmVzdWx0SGFuZGxlciI7Ci0KLSAgcmV0dXJuIGFyZ2xpc3Q7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGNvbW1hIHNlcGFyYXRlZCBmaWVsZCBsaXN0LCB3aXRoIHR5cGUgbmFtZXMKLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV90eXBlcykgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICBpZiAoaW5jbHVkZV90eXBlcykgewotICAgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphc3luY19hcmd1bWVudF9saXN0KHRfZnVuY3Rpb24qIHRmdW5jdCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHRfdHlwZSogdHR5cGUsIGJvb2wgaW5jbHVkZV90eXBlcykgewotICAodm9pZCkgdHR5cGU7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICBpZiAoaW5jbHVkZV90eXBlcykgewotICAgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGlmICghZmlyc3QpIHsKLSAgICByZXN1bHQgKz0gIiwgIjsKLSAgfQotICBpZiAoaW5jbHVkZV90eXBlcykgewotICAgIHJlc3VsdCArPSAib3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazwiICsgdGZ1bmN0LT5nZXRfbmFtZSgpICsgIl9jYWxsIiArICI+ICI7Ci0gIH0KLSAgcmVzdWx0ICs9ICJyZXN1bHRIYW5kbGVyIjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEphdmEgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkJPT0wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuQllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogQXBwbGllcyB0aGUgY29ycmVjdCBzdHlsZSB0byBhIHN0cmluZyBiYXNlZCBvbiB0aGUgdmFsdWUgb2Ygbm9jYW1lbF9zdHlsZV8KLSAqLwotc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpewotICBpZiAobm9jYW1lbF9zdHlsZV8pIHsKLSAgICByZXR1cm4gIl8iICsgbmFtZTsKLSAgfSBlbHNlIHsKLSAgICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotfQotCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Y29uc3RhbnRfbmFtZShzdHJpbmcgbmFtZSkgewotICBzdHJpbmcgY29uc3RhbnRfbmFtZTsKLQotICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKLSAgYm9vbCB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGZhbHNlOwotICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaXRlciA9IG5hbWUuYmVnaW4oKTsgaXRlciAhPSBuYW1lLmVuZCgpOyArK2l0ZXIpIHsKLSAgICBzdHJpbmc6OnZhbHVlX3R5cGUgY2hhcmFjdGVyID0gKCppdGVyKTsKLQotICAgIGJvb2wgaXNfdXBwZXIgPSBpc3VwcGVyKGNoYXJhY3Rlcik7Ci0KLSAgICBpZiAoaXNfdXBwZXIgJiYgIWlzX2ZpcnN0ICYmICF3YXNfcHJldmlvdXNfY2hhcl91cHBlcikgewotICAgICAgY29uc3RhbnRfbmFtZSArPSAnXyc7Ci0gICAgfQotICAgIGNvbnN0YW50X25hbWUgKz0gdG91cHBlcihjaGFyYWN0ZXIpOwotCi0gICAgaXNfZmlyc3QgPSBmYWxzZTsKLSAgICB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGlzX3VwcGVyOwotICB9Ci0KLSAgcmV0dXJuIGNvbnN0YW50X25hbWU7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvZnN0cmVhbSAmb3V0LCBzdHJpbmcgY29udGVudHMpIHsKLSAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAotICAgICIvKipcbiIsCi0gICAgIiAqICIsIGNvbnRlbnRzLAotICAgICIgKi9cbiIpOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIGZpZWxkKSB7Ci0gIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7Ci0gICAgc3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSBmaWVsZC0+Z2V0X2RvYygpICsgIlxuQHNlZSAiICsgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvdXQsIGNvbWJpbmVkX21lc3NhZ2UpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKHRfZG9jKilmaWVsZCk7Ci0gIH0KLX0KLQotLyoqCi0gKiBFbWl0cyBhIEphdmFEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvYyhvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYykgewotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvdXQsIHRkb2MtPmdldF9kb2MoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBFbWl0cyBhIEphdmFEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvYyhvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7Ci0gICAgc3RyaW5nc3RyZWFtIHNzOwotICAgIHNzIDw8IHRmdW5jdGlvbi0+Z2V0X2RvYygpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7Ci0gICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKLSAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOwotICAgICAgc3MgPDwgIlxuQHBhcmFtICIgPDwgcC0+Z2V0X25hbWUoKTsKLSAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKLSAgICAgICAgc3MgPDwgIiAiIDw8IHAtPmdldF9kb2MoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAotICAgICAgIi8qKlxuIiwKLSAgICAgICIgKiAiLCBzcy5zdHIoKSwKLSAgICAgICIgKi9cbiIpOwotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LCBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMSwgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0X25hbWUsIHRfdHlwZSogdHlwZSkgewotCi0gIHRfY29udGFpbmVyKiBjb250YWluZXIgPSAodF9jb250YWluZXIqKXR5cGU7Ci0gIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lOwotICBpZiAoc291cmNlX25hbWVfcDIgPT0gIiIpCi0gICAgICBzb3VyY2VfbmFtZSA9IHNvdXJjZV9uYW1lX3AxOwotICBlbHNlCi0gICAgICBzb3VyY2VfbmFtZSA9IHNvdXJjZV9uYW1lX3AxICsgIi4iICsgc291cmNlX25hbWVfcDI7Ci0KLSAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZShjb250YWluZXIsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotCi0gIHN0ZDo6c3RyaW5nIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA9IHNvdXJjZV9uYW1lX3AxICsgIl9lbGVtZW50IjsKLSAgc3RkOjpzdHJpbmcgcmVzdWx0X2VsZW1lbnRfbmFtZSA9IHJlc3VsdF9uYW1lICsgIl9jb3B5IjsKLQotICBpZihjb250YWluZXItPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKWNvbnRhaW5lciktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKiljb250YWluZXIpLT5nZXRfdmFsX3R5cGUoKTsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yIChNYXAuRW50cnk8IiA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiLCAiIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICI+ICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIgOiAiIDw8IHNvdXJjZV9uYW1lIDw8ICIuZW50cnlTZXQoKSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIG91dCA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGtleV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiX2tleSA9ICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIuZ2V0S2V5KCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIl92YWx1ZSA9ICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIuZ2V0VmFsdWUoKTsiIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGlmIChrZXlfdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX2tleSIsICIiLCByZXN1bHRfZWxlbWVudF9uYW1lICsgIl9rZXkiLCBrZXlfdHlwZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfa2V5ID0gIjsKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl9rZXkiLCByZXN1bHRfZWxlbWVudF9uYW1lICsgIl9rZXkiLCBrZXlfdHlwZSk7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpZiAodmFsX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsICIiLCByZXN1bHRfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsIHZhbF90eXBlKTsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHZhbF90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl92YWx1ZSA9ICI7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLCByZXN1bHRfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsIHZhbF90eXBlKTsKLSAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIucHV0KCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSwgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgfSBlbHNlIHsKLSAgICB0X3R5cGUqIGVsZW1fdHlwZTsKLQotICAgIGlmIChjb250YWluZXItPmlzX3NldCgpKSB7Ci0gICAgICBlbGVtX3R5cGUgPSAoKHRfc2V0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGVsZW1fdHlwZSA9ICgodF9saXN0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkKLSAgICAgIDw8ICJmb3IgKCIgPDwgdHlwZV9uYW1lKGVsZW1fdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIiA6ICIgPDwgc291cmNlX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgaWYgKGVsZW1fdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIC8vIHJlY3Vyc2l2ZSBkZWVwIGNvcHkKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUsICIiLCByZXN1bHRfZWxlbWVudF9uYW1lLCBlbGVtX3R5cGUpOwotICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGQoIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgLy8gaXRlcmF0aXZlIGNvcHkKLSAgICAgIGlmKCgodF9iYXNlX3R5cGUqKWVsZW1fdHlwZSktPmlzX2JpbmFyeSgpKXsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIkJ5dGVCdWZmZXIgdGVtcF9iaW5hcnlfZWxlbWVudCA9ICI7Ci0gICAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCAidGVtcF9iaW5hcnlfZWxlbWVudCIsIGVsZW1fdHlwZSk7Ci0gICAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGQodGVtcF9iaW5hcnlfZWxlbWVudCk7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgZWxzZXsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGQoIjsKLSAgICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUsIHJlc3VsdF9uYW1lLCBlbGVtX3R5cGUpOwotICAgICAgICBvdXQgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgc291cmNlX25hbWUsIHN0ZDo6c3RyaW5nIGRlc3RfbmFtZSwgdF90eXBlKiB0eXBlKSB7Ci0gICh2b2lkKSBkZXN0X25hbWU7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkgfHwgdHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgb3V0IDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb3B5QmluYXJ5KCIgPDwgc291cmNlX25hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBldmVyeXRoaW5nIGVsc2UgY2FuIGJlIGNvcGllZCBkaXJlY3RseQotICAgICAgb3V0IDw8IHNvdXJjZV9uYW1lOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwgIm5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCB0cnVlKSA8PCAiKCIgPDwgc291cmNlX25hbWUgPDwgIikiOwotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKSB7Ci0gIHJldHVybiBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZC0+Z2V0X25hbWUoKSk7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6Omlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKSB7Ci0gIHJldHVybiAiX18iICsgdXBjYXNlX3N0cmluZyhmaWVsZC0+Z2V0X25hbWUoKSArICJfaXNzZXRfaWQiKTsKLX0KLQotc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgewotICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X3NldChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgewotICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIih0cnVlKTsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpIHsKLSAgc3RyaW5nIHBhY2thZ2UgPSAiIjsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImphdmEiKSArICIuIjsKLSAgfQotICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkICIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8Ci0gICAgICAiX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAiKHNob3J0KSIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfbmFtZV9jb25zdGFudHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgIi8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZW51bSBfRmllbGRzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkSWRFbnVtIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKCFmaXJzdCkgewotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBmaXJzdCA9IGZhbHNlOwotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKm1faXRlcik7Ci0gICAgaW5kZW50KG91dCkgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIoKHNob3J0KSIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIpIjsKLSAgfQotCi0gIG91dCA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBfRmllbGRzPiBieU5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIF9GaWVsZHM+KCk7IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIGZvciAoX0ZpZWxkcyBmaWVsZCA6IEVudW1TZXQuYWxsT2YoX0ZpZWxkcy5jbGFzcykpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgYnlOYW1lLnB1dChmaWVsZC5nZXRGaWVsZE5hbWUoKSwgZmllbGQpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZChpbnQgZmllbGRJZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2goZmllbGRJZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjogLy8gIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCB0aHJvd2luZyBhbiBleGNlcHRpb24iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKiBpZiBpdCBpcyBub3QgZm91bmQuIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkT3JUaHJvdyhpbnQgZmllbGRJZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgX0ZpZWxkcyBmaWVsZHMgPSBmaW5kQnlUaHJpZnRJZChmaWVsZElkKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIGlmIChmaWVsZHMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIkZpZWxkIFwiICsgZmllbGRJZCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGZpZWxkczsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIG5hbWUsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5TmFtZShTdHJpbmcgbmFtZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGJ5TmFtZS5nZXQobmFtZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlIGZpbmFsIHNob3J0IF90aHJpZnRJZDsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlIGZpbmFsIFN0cmluZyBfZmllbGROYW1lOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJfRmllbGRzKHNob3J0IHRocmlmdElkLCBTdHJpbmcgZmllbGROYW1lKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBfdGhyaWZ0SWQgPSB0aHJpZnRJZDsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIF9maWVsZE5hbWUgPSBmaWVsZE5hbWU7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc2hvcnQgZ2V0VGhyaWZ0RmllbGRJZCgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBfdGhyaWZ0SWQ7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBfZmllbGROYW1lOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotYm9vbCB0X2phdmFfZ2VuZXJhdG9yOjpoYXNfYml0X3ZlY3Rvcih0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpKSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGlmICghamF2YTVfKSB7Ci0gICAgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIGNsZWFyKCkgeyIgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGluZGVudF91cCgpOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqbV9pdGVyOwotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotCi0gICAgaWYgKGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICJ0aGlzLiIgKyBmaWVsZC0+Z2V0X25hbWUoKSwgdCwgZmllbGQtPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIG11c3QgYmUgYSBiYXNlIHR5cGUKLSAgICAvLyBtZWFucyBpdCBhbHNvIG5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgdW5zZXQKLSAgICBpbmRlbnQob3V0KSA8PCAic2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKGZhbHNlKTsiIDw8IGVuZGw7Ci0gICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICh0X2Jhc2VfdHlwZSopIHQ7Ci0KLSAgICBzd2l0Y2ggKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSAwOyIgPDwgZW5kbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gMC4wOyIgPDwgZW5kbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAidW5zdXBwb3J0ZWQgdHlwZTogIiArIGJhc2VfdHlwZS0+Z2V0X25hbWUoKSArICIgZm9yIGZpZWxkICIgKyBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vLyBnZW5lcmF0ZXMgamF2YSBtZXRob2QgdG8gc2VyaWFsaXplIChpbiB0aGUgSmF2YSBzZW5zZSkgdGhlIG9iamVjdAotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZV9vYmplY3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0cnkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICB3cml0ZShuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChvdXQpKSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlIiA8PCAoYW5kcm9pZF9sZWdhY3lfPyAiLmdldE1lc3NhZ2UoKSIgOiAiIikgPDwgIik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vLyBnZW5lcmF0ZXMgamF2YSBtZXRob2QgdG8gc2VyaWFsaXplIChpbiB0aGUgSmF2YSBzZW5zZSkgdGhlIG9iamVjdAotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkX29iamVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdHJ5IHsiIDw8IGVuZGw7Ci0gIGlmICghdHN0cnVjdC0+aXNfdW5pb24oKSAmJiBoYXNfYml0X3ZlY3Rvcih0c3RydWN0KSkgewotICAgIGluZGVudChvdXQpIDw8ICIgICAgLy8gaXQgZG9lc24ndCBzZWVtIGxpa2UgeW91IHNob3VsZCBoYXZlIHRvIGRvIHRoaXMsIGJ1dCBqYXZhIHNlcmlhbGl6YXRpb24gaXMgd2Fja3ksIGFuZCBkb2Vzbid0IGNhbGwgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgX19pc3NldF9iaXRfdmVjdG9yID0gbmV3IEJpdFNldCgxKTsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KG91dCkgPDwgIiAgICByZWFkKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KGluKSkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSIgPDwgKGFuZHJvaWRfbGVnYWN5Xz8gIi5nZXRNZXNzYWdlKCkiIDogIiIpIDw8ICIpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihqYXZhLCAiSmF2YSIsCi0iICAgIGJlYW5zOiAgICAgICAgICAgTWVtYmVycyB3aWxsIGJlIHByaXZhdGUsIGFuZCBzZXR0ZXIgbWV0aG9kcyB3aWxsIHJldHVybiB2b2lkLlxuIgotIiAgICBwcml2YXRlLW1lbWJlcnM6IE1lbWJlcnMgd2lsbCBiZSBwcml2YXRlLCBidXQgc2V0dGVyIG1ldGhvZHMgd2lsbCByZXR1cm4gJ3RoaXMnIGxpa2UgdXN1YWwuXG4iCi0iICAgIG5vY2FtZWw6ICAgICAgICAgRG8gbm90IHVzZSBDYW1lbENhc2UgZmllbGQgYWNjZXNzb3JzIHdpdGggYmVhbnMuXG4iCi0iICAgIGhhc2hjb2RlOiAgICAgICAgR2VuZXJhdGUgcXVhbGl0eSBoYXNoQ29kZSBtZXRob2RzLlxuIgotIiAgICBhbmRyb2lkX2xlZ2FjeTogIERvIG5vdCB1c2UgamF2YS5pby5JT0V4Y2VwdGlvbih0aHJvd2FibGUpIChhdmFpbGFibGUgZm9yIEFuZHJvaWQgMi4zIGFuZCBhYm92ZSkuXG4iCi0iICAgIGphdmE1OiAgICAgICAgICAgR2VuZXJhdGUgSmF2YSAxLjUgY29tcGxpYW50IGNvZGUgKGluY2x1ZGVzIGFuZHJvaWRfbGVnYWN5IGZsYWcpLiIKLSkKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2phdmFtZV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfamF2YW1lX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU5NmVkNS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfamF2YW1lX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDMzOTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8Y2N0eXBlPgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzdGRleGNlcHQ+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIEphdmEgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X2phdmFtZV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfamF2YW1lX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgICh2b2lkKSBwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWphdmFtZSI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uICAgKHRfc3RydWN0KiAgIHR1bmlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbD1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSwgYm9vbCBpbl9jbGFzcz1mYWxzZSwgYm9vbCBpc19yZXN1bHQ9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGdldF9qYXZhX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKLSAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwgc3RkOjpzdHJpbmcgY2FwX25hbWUpOwotICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkKTsKLSAgdm9pZCBnZW5lcmF0ZV9pc3NldF9zZXQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOwotICBzdGQ6OnN0cmluZyBpc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9wcmltaXRpdmVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uICAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9hYnN0cmFjdF9tZXRob2RzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jaGVja190eXBlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9yZWFkX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV93cml0ZV92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2V0X2ZpZWxkX25hbWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0ICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50ICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyAgICAgICAgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIGZpZWxkKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jICAgICAgICAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqICAgICAgdGRvYyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyAgICAgICAgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRkb2MpOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudCAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29udGVudHMpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AxLCBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMiwgc3RkOjpzdHJpbmcgcmVzdWx0X25hbWUsIHRfdHlwZSogdHlwZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZSwgc3RkOjpzdHJpbmcgZGVzdF9uYW1lLCB0X3R5cGUqIHR5cGUpOwotCi0gIGJvb2wgaGFzX2JpdF92ZWN0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBqYXZhX3BhY2thZ2UoKTsKLSAgc3RkOjpzdHJpbmcgamF2YV90eXBlX2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgamF2YV90aHJpZnRfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXI9ZmFsc2UsIGJvb2wgaW5faW5pdD1mYWxzZSwgYm9vbCBza2lwX2dlbmVyaWM9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV90eXBlcyA9IHRydWUpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGVzY3Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyBib3hfdHlwZSh0X3R5cGUqIHR5cGUsIHN0cmluZyB2YWx1ZSk7Ci0KLSAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKLSAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotCi0gICAgcmV0dXJuCi0gICAgICB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwKLSAgICAgIHR0eXBlLT5pc19zdHJ1Y3QoKSB8fAotICAgICAgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwKLSAgICAgIHR0eXBlLT5pc19zdHJpbmcoKSB8fAotICAgICAgdHR5cGUtPmlzX2VudW0oKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGNvbnN0YW50X25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7Ci0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87Ci0KLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLSAgcGFja2FnZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJqYXZhIik7Ci0KLSAgc3RyaW5nIGRpciA9IHBhY2thZ2VfbmFtZV87Ci0gIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpOwotICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0gIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOwotICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYysxKTsKLSAgfQotICBpZiAoZGlyLnNpemUoKSA+IDApIHsKLSAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7Ci0gICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOwotICB9Ci0KLSAgcGFja2FnZV9kaXJfID0gc3ViZGlyOwotfQotCi0vKioKLSAqIFBhY2thZ2VzIHRoZSBnZW5lcmF0ZWQgZmlsZQotICoKLSAqIEByZXR1cm4gU3RyaW5nIG9mIHRoZSBwYWNrYWdlLCBpLmUuICJwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0ZGVtbzsiCi0gKi8KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmphdmFfcGFja2FnZSgpIHsKLSAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXyArICI7XG5cbiI7Ci0gIH0KLSAgcmV0dXJuICIiOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBqYXZhIGltcG9ydHMKLSAqCi0gKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBmb3IgSmF2YSB0eXBlcyB0aGF0IGFyZSB1c2VkIGluIGhlcmUKLSAqLwotc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6amF2YV90eXBlX2ltcG9ydHMoKSB7Ci0gIHJldHVybgotICAgIHN0cmluZygpICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7XG4iICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7XG4iICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjtcblxuIjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgamF2YSBpbXBvcnRzCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aHJpZnQKLSAqLwotc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6amF2YV90aHJpZnRfaW1wb3J0cygpIHsKLSAgcmV0dXJuCi0gICAgc3RyaW5nKCkgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjtcbiIgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7XG4iICsKLSAgICAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qO1xuIiArCi0gICAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qO1xuXG4iOwotfQotCi0vKioKLSAqIE5vdGhpbmcgaW4gSmF2YQotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkge30KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIEphdmEsIHNpbmNlIGl0IGRvZXMKLSAqIG5vdCBzdXBwb3J0IGFyYml0cmFyeSBuYW1lIHJlcGxhY2VtZW50cywgYW5kIGl0J2QgYmUgYSB3YWNreSB3YXN0ZQotICogb2Ygb3ZlcmhlYWQgdG8gbWFrZSB3cmFwcGVyIGNsYXNzZXMuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCkgdHR5cGVkZWY7Ci19Ci0KLS8qKgotICogRW51bXMgYXJlIGEgY2xhc3Mgd2l0aCBhIHNldCBvZiBzdGF0aWMgY29uc3RhbnRzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrKHRlbnVtLT5nZXRfbmFtZSgpKSsiLmphdmEiOwotICBvZnN0cmVhbSBmX2VudW07Ci0gIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lLmNfc3RyKCkpOwotCi0gIC8vIENvbW1lbnQgYW5kIHBhY2thZ2UgaXQKLSAgZl9lbnVtIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqYXZhX3BhY2thZ2UoKTsKLQotICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2VudW0sIHRlbnVtKTsKLSAgaW5kZW50KGZfZW51bSkgPDwKLSAgICAicHVibGljIGNsYXNzICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRFbnVtICI7Ci0gIHNjb3BlX3VwKGZfZW51bSk7Ci0gIGZfZW51bSA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfZW51bSwgKmNfaXRlcik7Ci0gICAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgZmluYWwgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PAotICAgICAgIiAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gbmV3ICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwKLSAgICAgICIoIiA8PCB2YWx1ZSA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9lbnVtIDw8IGVuZGw7Ci0KLSAgLy8gRmllbGQgZm9yIHRocmlmdENvZGUKLSAgaW5kZW50KGZfZW51bSkgPDwgInByaXZhdGUgZmluYWwgaW50IHZhbHVlOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJwcml2YXRlICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIihpbnQgdmFsdWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgIHRoaXMudmFsdWUgPSB2YWx1ZTsiIDw8ZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICogR2V0IHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoaXMgZW51bSB2YWx1ZSwgYXMgZGVmaW5lZCBpbiB0aGUgVGhyaWZ0IElETC4iIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgaW50IGdldFZhbHVlKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuIHZhbHVlOyIgPDxlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX2VudW0pIDw8ICIvKioiIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgKiBGaW5kIGEgdGhlIGVudW0gdHlwZSBieSBpdHMgaW50ZWdlciB2YWx1ZSwgYXMgZGVmaW5lZCBpbiB0aGUgVGhyaWZ0IElETC4iIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgKiBAcmV0dXJuIG51bGwgaWYgdGhlIHZhbHVlIGlzIG5vdCBmb3VuZC4iIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljICIrIHRlbnVtLT5nZXRfbmFtZSgpICsgIiBmaW5kQnlWYWx1ZShpbnQgdmFsdWUpIHsgIiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJzd2l0Y2ggKHZhbHVlKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgaW5kZW50KGZfZW51bSkgPDwgImNhc2UgIiA8PCB2YWx1ZSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9lbnVtKSA8PCAiICByZXR1cm4gIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgCi0gIGluZGVudChmX2VudW0pIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuIG51bGw7IiA8PCBlbmRsOyAgCi0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAifSIgPDwgZW5kbDsKLSAgCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX2VudW0pOwotCi0gIGZfZW51bS5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXysiL0NvbnN0YW50cy5qYXZhIjsKLSAgb2ZzdHJlYW0gZl9jb25zdHM7Ci0gIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl9jb25zdHMgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGphdmFfcGFja2FnZSgpIDw8Ci0gICAgamF2YV90eXBlX2ltcG9ydHMoKTsKLQotICBmX2NvbnN0cyA8PAotICAgICJwdWJsaWMgY2xhc3MgQ29uc3RhbnRzIHsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfY29uc3RzLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfY29uc3RzKSA8PAotICAgICJ9IiA8PCBlbmRsOwotICBmX2NvbnN0cy5jbG9zZSgpOwotfQotCi0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbCkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpbmRlbnQob3V0KTsKLSAgaWYgKCFkZWZ2YWwpIHsKLSAgICBvdXQgPDwKLSAgICAgIChpbl9zdGF0aWMgPyAiIiA6ICJwdWJsaWMgc3RhdGljIGZpbmFsICIpIDw8Ci0gICAgICB0eXBlX25hbWUodHlwZSkgPDwgIiAiOwotICB9Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIjsKLSAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSk7Ci0gICAgICBvdXQgPDwgInNldCIgPDwgY2FwX25hbWUgPDwgIigiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIucHV0KCIgPDwgYm94X3R5cGUoa3R5cGUsIGtleSkgPDwgIiwgIiA8PAotCWJveF90eXBlKHZ0eXBlLCB2YWwpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0JaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLmFkZEVsZW1lbnQoIiA8PCBib3hfdHlwZShldHlwZSwgdmFsKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotCWluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5wdXQoIiA8PAotCSAgYm94X3R5cGUoZXR5cGUsIHZhbCkgPDwgIiwgIiA8PAotCSAgYm94X3R5cGUoZXR5cGUsIHZhbCkgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLX0KLQotc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gICh2b2lkKSBuYW1lOwotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJlbmRlciA8PCAiKGJ5dGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmVuZGVyIDw8ICIoc2hvcnQpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICByZW5kZXIgPDwgIihkb3VibGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZW5kZXIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCBmYWxzZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcigpOwotICB9IGVsc2UgewotICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKLSAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlKTsKLSAgICByZW5kZXIgPDwgdDsKLSAgfQotCi0gIHJldHVybiByZW5kZXIuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmJveF90eXBlKHRfdHlwZSogdHlwZSwgc3RyaW5nIHZhbHVlKSB7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIm5ldyBCb29sZWFuKCIgKyB2YWx1ZSArICIpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIm5ldyBCeXRlKCIgKyB2YWx1ZSArICIpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAibmV3IFNob3J0KCIgKyB2YWx1ZSArICIpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAibmV3IEludGVnZXIoIiArIHZhbHVlICsgIikiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJuZXcgTG9uZygiICsgdmFsdWUgKyAiKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIm5ldyBEb3VibGUoIiArIHZhbHVlICsgIikiOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgd2lsbCBiZSBhIFRCYXNlIAotICogaW1wbGVtZW50b3IuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX3VuaW9uKHRzdHJ1Y3QpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2phdmFfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLSAgfQotfQotCi0vKioKLSAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGluaGVyaXQgZnJvbSBFeGNlcHRpb24KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotCi0vKioKLSAqIEphdmEgc3RydWN0IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKyIuamF2YSI7Ci0gIG9mc3RyZWFtIGZfc3RydWN0OwotICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zdHJ1Y3QgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGphdmFfcGFja2FnZSgpIDw8Ci0gICAgamF2YV90eXBlX2ltcG9ydHMoKSA8PAotICAgIGphdmFfdGhyaWZ0X2ltcG9ydHMoKTsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXhjZXB0aW9uKTsKLSAgZl9zdHJ1Y3QuY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBKYXZhIHVuaW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iKyh0c3RydWN0LT5nZXRfbmFtZSgpKSsiLmphdmEiOwotICBvZnN0cmVhbSBmX3N0cnVjdDsKLSAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc3RydWN0IDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqYXZhX3BhY2thZ2UoKSA8PAotICAgIGphdmFfdHlwZV9pbXBvcnRzKCkgPDwKLSAgICBqYXZhX3RocmlmdF9pbXBvcnRzKCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKLQotICBpbmRlbnQoZl9zdHJ1Y3QpIDw8Ci0gICAgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJmaW5hbCAiIDogIiIpIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLQkgICAgICA8PCAiIGV4dGVuZHMgVFVuaW9uICI7Ci0KLSAgc2NvcGVfdXAoZl9zdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX3N0cnVjdF9kZXNjKGZfc3RydWN0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZmllbGRfZGVzY3MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3IoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKGZfc3RydWN0LCB0c3RydWN0KTsKLSAgCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfdW5pb25faGFzaGNvZGUoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3N0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QuY2xvc2UoKTsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIihfRmllbGRzIHNldEZpZWxkLCBPYmplY3QgdmFsdWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKHNldEZpZWxkLCB2YWx1ZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcihvdGhlcik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIGRlZXBDb3B5KCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIih0aGlzKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gZ2VuZXJhdGUgImNvbnN0cnVjdG9ycyIgZm9yIGVhY2ggZmllbGQKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIgdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiB4ID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgeC5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIodmFsdWUpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4geDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsgCi0gIH0KLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2dldHRlcnNfYW5kX3NldHRlcnMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLQotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8ICIgZ2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIGlmIChnZXRTZXRGaWVsZCgpID09IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuICgiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgIilnZXRGaWVsZFZhbHVlKCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIH0gZWxzZSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oXCJDYW5ub3QgZ2V0IGZpZWxkICciIDw8IGZpZWxkLT5nZXRfbmFtZSgpIAotICAgICAgPDwgIicgYmVjYXVzZSB1bmlvbiBpcyBjdXJyZW50bHkgc2V0IHRvIFwiICsgZ2V0RmllbGREZXNjKGdldFNldEZpZWxkKCkpLm5hbWUpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIAotICAgIG91dCA8PCBlbmRsOwotCi0gICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKCIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIHZhbHVlKSB7IiA8PCBlbmRsOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKHZhbHVlID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgc2V0RmllbGRfID0gX0ZpZWxkcy4iIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHZhbHVlXyA9IHZhbHVlOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9jaGVja190eXBlKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotICBnZW5lcmF0ZV9yZWFkX3ZhbHVlKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotICBnZW5lcmF0ZV93cml0ZV92YWx1ZShvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NoZWNrX3R5cGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCB2b2lkIGNoZWNrVHlwZShfRmllbGRzIHNldEZpZWxkLCBPYmplY3QgdmFsdWUpIHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotICAgIAotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlLCB0cnVlKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbihcIldhcyBleHBlY3RpbmcgdmFsdWUgb2YgdHlwZSAiIAotICAgICAgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiBmb3IgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkgCi0gICAgICA8PCAiJywgYnV0IGdvdCBcIiArIHZhbHVlLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsiIDw8IGVuZGw7Ci0gICAgLy8gZG8gdGhlIHJlYWwgY2hlY2sgaGVyZQotICB9Ci0gIAotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJVbmtub3duIGZpZWxkIGlkIFwiICsgc2V0RmllbGQpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVhZF92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIE9iamVjdCByZWFkVmFsdWUoVFByb3RvY29sIGlwcm90LCBURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIl9GaWVsZHMgc2V0RmllbGQgPSBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkLmlkKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJpZiAoc2V0RmllbGQgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLSAgICAKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQy50eXBlKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGZpZWxkLCAiIik7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwic2V0RmllbGQgd2Fzbid0IG51bGwsIGJ1dCBkaWRuJ3QgbWF0Y2ggYW55IG9mIHRoZSBjYXNlIHN0YXRlbWVudHMhXCIpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbnVsbDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfd3JpdGVfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCB2b2lkIHdyaXRlVmFsdWUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkXykgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0gICAgCi0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgZmllbGQtPmdldF9uYW1lKCkgCi0gICAgICA8PCAiID0gKCIgPDwgIHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIpdmFsdWVfOyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLSAgCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcIkNhbm5vdCB3cml0ZSB1bmlvbiB3aXRoIHVua25vd24gZmllbGQgXCIgKyBzZXRGaWVsZF8pOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0KLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgVEZpZWxkIGdldEZpZWxkRGVzYyhfRmllbGRzIHNldEZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQzsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJVbmtub3duIGZpZWxkIGlkIFwiICsgc2V0RmllbGQpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICAodm9pZCkgdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBUU3RydWN0IGdldFN0cnVjdERlc2MoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gU1RSVUNUX0RFU0M7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIC8vIGVxdWFsaXR5Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpZiAob3RoZXIgaW5zdGFuY2VvZiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gZXF1YWxzKCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIilvdGhlcik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gb3RoZXIgIT0gbnVsbCAmJiBnZXRTZXRGaWVsZCgpID09IG90aGVyLmdldFNldEZpZWxkKCkgJiYgZ2V0RmllbGRWYWx1ZSgpLmVxdWFscyhvdGhlci5nZXRGaWVsZFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbygiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpbnQgbGFzdENvbXBhcmlzb24gPSBUQmFzZUhlbHBlci5jb21wYXJlVG8oZ2V0U2V0RmllbGQoKSwgb3RoZXIuZ2V0U2V0RmllbGQoKSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpZiAobGFzdENvbXBhcmlzb24gPT0gMCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gVEJhc2VIZWxwZXIuY29tcGFyZVRvKGdldEZpZWxkVmFsdWUoKSwgb3RoZXIuZ2V0RmllbGRWYWx1ZSgpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICogSWYgeW91J2QgbGlrZSB0aGlzIHRvIHBlcmZvcm0gbW9yZSByZXNwZWN0YWJseSwgdXNlIHRoZSBoYXNoY29kZSBnZW5lcmF0b3Igb3B0aW9uLiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgaGFzaENvZGUoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gMDsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEphdmEgc3RydWN0IGRlZmluaXRpb24uIFRoaXMgaGFzIHZhcmlvdXMgcGFyYW1ldGVycywgYXMgaXQgY291bGQgYmUKLSAqIGdlbmVyYXRlZCBzdGFuZGFsb25lIG9yIGluc2lkZSBhbm90aGVyIGNsYXNzIGFzIGEgaGVscGVyLiBJZiBpdAotICogaXMgYSBoZWxwZXIgdGhhbiBpdCBpcyBhIHN0YXRpYyBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KLSAqIEBwYXJhbSBpbl9jbGFzcyAgICAgSWYgaW5zaWRlIGEgY2xhc3MsIG5lZWRzIHRvIGJlIHN0YXRpYyBjbGFzcwotICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLSAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCB0c3RydWN0KTsKLQotICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gImZpbmFsICIgOiAiIikgPDwKLSAgICAgKGluX2NsYXNzID8gInN0YXRpYyAiIDogIiIpIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAiOwotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgImV4dGVuZHMgRXhjZXB0aW9uICI7Ci0gIH0KLSAgb3V0IDw8ICJpbXBsZW1lbnRzIFRCYXNlICI7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvdXQsIHRzdHJ1Y3QpOwotCi0gIC8vIE1lbWJlcnMgYXJlIHB1YmxpYyBmb3IgLWphdmEsIHByaXZhdGUgZm9yIC1qYXZhYmVhbgotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIG91dCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG91dCwgdHN0cnVjdCk7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICI7Ci0gICAgb3V0IDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UpIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBpc3NldCBkYXRhCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICIvLyBpc3NldCBpZCBhc3NpZ25tZW50cyIgPDwgZW5kbDsKLQotICAgIGludCBpID0gMDsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICIgPDwgaXNzZXRfZmllbGRfaWQoKm1faXRlcikKLSAgICAgICAgICA8PCAiID0gIiA8PCBpIDw8ICI7IiA8PCAgZW5kbDsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChpID4gMCkgewotICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgYm9vbGVhbltdIF9faXNzZXRfdmVjdG9yID0gbmV3IGJvb2xlYW5bIiA8PCBpIDw8ICJdOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfQotCi0gIGJvb2wgYWxsX29wdGlvbmFsX21lbWJlcnMgPSB0cnVlOwotCi0gIC8vIERlZmF1bHQgY29uc3RydWN0b3IKLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy4iICsgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKLSAgICB9Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgIGFsbF9vcHRpb25hbF9tZW1iZXJzID0gZmFsc2U7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaWYgKCFtZW1iZXJzLmVtcHR5KCkgJiYgIWFsbF9vcHRpb25hbF9tZW1iZXJzKSB7Ci0gICAgLy8gRnVsbCBjb25zdHJ1Y3RvciBmb3IgYWxsIGZpZWxkcwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIgIiA8PAotICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8ICIpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInRoaXMoKTsiIDw8IGVuZGw7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwKLSAgICAgICAgICAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICgqbV9pdGVyKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIGNvcHkgY29uc3RydWN0b3IKLSAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqIFBlcmZvcm1zIGEgZGVlcCBjb3B5IG9uIDxpPm90aGVyPC9pPi4iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGlmIChoYXNfYml0X3ZlY3Rvcih0c3RydWN0KSkgewotICAgIGluZGVudChvdXQpIDw8ICJTeXN0ZW0uYXJyYXljb3B5KG90aGVyLl9faXNzZXRfdmVjdG9yLCAwLCBfX2lzc2V0X3ZlY3RvciwgMCwgb3RoZXIuX19pc3NldF92ZWN0b3IubGVuZ3RoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOwotICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHR5cGUpOwotCi0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKG90aGVyLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCAib3RoZXIiLCBmaWVsZF9uYW1lLCAiX190aGlzX18iICsgZmllbGRfbmFtZSwgdHlwZSk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IF9fdGhpc19fIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICI7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsICJvdGhlci4iICsgZmllbGRfbmFtZSwgZmllbGRfbmFtZSwgdHlwZSk7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBjbG9uZSBtZXRob2QsIHNvIHRoYXQgeW91IGNhbiBkZWVwIGNvcHkgYW4gb2JqZWN0IHdoZW4geW91IGRvbid0IGtub3cgaXRzIGNsYXNzLgotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIGRlZXBDb3B5KCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIih0aGlzKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBjbG9uZSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBuZXcgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIodGhpcyk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZXF1YWxpdHkob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhvdXQsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBpZiAoaXNfcmVzdWx0KSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9Ci0gIGdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGVxdWFscyBtZXRob2RzIGFuZCBhIGhhc2hDb2RlIG1ldGhvZCBmb3IgYSBzdHJ1Y3R1cmUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAodGhhdCA9PSBudWxsKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgaW5zdGFuY2VvZiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhpcy5lcXVhbHMoKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKXRoYXQpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgdGhhdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAodGhhdCA9PSBudWxsKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIG91dCA8PCBlbmRsOwotCi0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIC8vIE1vc3QgZXhpc3RpbmcgVGhyaWZ0IGNvZGUgZG9lcyBub3QgdXNlIGlzc2V0IG9yIG9wdGlvbmFsL3JlcXVpcmVkLAotICAgIC8vIHNvIHdlIHRyZWF0ICJkZWZhdWx0IiBmaWVsZHMgYXMgcmVxdWlyZWQuCi0gICAgYm9vbCBpc19vcHRpb25hbCA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwodCk7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICBzdHJpbmcgdGhpc19wcmVzZW50ID0gInRydWUiOwotICAgIHN0cmluZyB0aGF0X3ByZXNlbnQgPSAidHJ1ZSI7Ci0gICAgc3RyaW5nIHVuZXF1YWw7Ci0KLSAgICBpZiAoaXNfb3B0aW9uYWwgfHwgY2FuX2JlX251bGwpIHsKLSAgICAgIHRoaXNfcHJlc2VudCArPSAiICYmIHRoaXMuIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpOwotICAgICAgdGhhdF9wcmVzZW50ICs9ICIgJiYgdGhhdC4iICsgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKm1faXRlcik7Ci0gICAgfQotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYm9vbGVhbiB0aGlzX3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgPSAiCi0gICAgICAgICAgICAgICA8PCB0aGlzX3ByZXNlbnQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJib29sZWFuIHRoYXRfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiA9ICIKLSAgICAgICAgICAgICAgIDw8IHRoYXRfcHJlc2VudCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgiIDw8ICJ0aGlzX3ByZXNlbnRfIiA8PCBuYW1lCi0gICAgICAgICAgICAgICA8PCAiIHx8IHRoYXRfcHJlc2VudF8iIDw8IG5hbWUgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoISgiIDw8ICJ0aGlzX3ByZXNlbnRfIiA8PCBuYW1lCi0gICAgICAgICAgICAgICA8PCAiICYmIHRoYXRfcHJlc2VudF8iIDw8IG5hbWUgPDwgIikpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotCi0gICAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXQpLT5pc19iaW5hcnkoKSkgewotICAgICAgdW5lcXVhbCA9ICJUQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy4iICsgbmFtZSArICIsIHRoYXQuIiArCi0JbmFtZSArICIpICE9IDAiOwotICAgIH0gZWxzZSBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIHVuZXF1YWwgPSAiIXRoaXMuIiArIG5hbWUgKyAiLmVxdWFscyh0aGF0LiIgKyBuYW1lICsgIikiOwotICAgIH0gZWxzZSB7Ci0gICAgICB1bmVxdWFsID0gInRoaXMuIiArIG5hbWUgKyAiICE9IHRoYXQuIiArIG5hbWU7Ci0gICAgfQotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgdW5lcXVhbCA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnQgaGFzaENvZGUoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiAwOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8ob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvdGhlck9iamVjdCkgeyIgPDwgZW5kbDsKLSAgLy8gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbygiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAiaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlck9iamVjdC5nZXRDbGFzcygpKSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvdGhlck9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgb3V0IDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyID0gKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIpb3RoZXJPYmplY3Q7IjsKLQotICBpbmRlbnQob3V0KSA8PCAiaW50IGxhc3RDb21wYXJpc29uID0gMDsiIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICptX2l0ZXI7Ci0gICAgaW5kZW50KG91dCkgPDwgImxhc3RDb21wYXJpc29uID0gVEJhc2VIZWxwZXIuY29tcGFyZVRvKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIsIG90aGVyLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX3N0cnVjdCgpIHx8IGZpZWxkLT5nZXRfdHlwZSgpLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBsYXN0Q29tcGFyaXNvbiA9IHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLmNvbXBhcmVUbyhvdGhlci4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIiAgbGFzdENvbXBhcmlzb24gPSBUQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIG90aGVyLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudChvdXQpIDw8ICIgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgInJldHVybiAwOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzIGFuZCByZWFkIHN0cnVjdCBoZWFkZXIKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIlRGaWVsZCBmaWVsZDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PAotICAgICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKLQotICAgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsgIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ9IiA8PCBlbmRsOwotCi0gICAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZC5pZCkgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjogLy8gIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImlmIChmaWVsZC50eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotICAgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgKmZfaXRlcik7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaXByb3QucmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLSAgICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vLyBnZW5lcmF0ZXMgamF2YSBtZXRob2QgdG8gcGVyZm9ybSB2YXJpb3VzIGNoZWNrcwotLy8gKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV92YWxpZGF0b3Iob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KXsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoISIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFwiUmVxdWlyZWQgZmllbGQgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIGlzIHVuc2V0ISBTdHJ1Y3Q6XCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgYm9vbCBvcHRpb25hbCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgaWYgKG9wdGlvbmFsKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKCpmX2l0ZXIpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAob3B0aW9uYWwpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QsCi0gKiB3aGljaCBpcyBhIGZ1bmN0aW9uIHJlc3VsdC4gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4KLSAqIGlmIHRoZXkgYXJlIHNldCBpbiB0aGUgSXNzZXQgYXJyYXksIGFuZCBvbmx5IG9uZSBvZiB0aGVtCi0gKiBjYW4gYmUgc2V0IGF0IGEgdGltZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDsKLQotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICIgZWxzZSBpZiAiOwotICAgIH0KLQotICAgIG91dCA8PCAiKHRoaXMuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IjsKLSAgfQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIGZpZWxkX25hbWUsIHN0cmluZyBjYXBfbmFtZSkgewotICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHlwZS0+aXNfc3RyaW5nKCkpIHsKLSAgICB0X2Jhc2VfdHlwZSogYmFzZV90eXBlID0gKHRfYmFzZV90eXBlKil0eXBlOwotCi0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIoIiA8PCAoYmFzZV90eXBlLT5pc19ib29sKCkgPyAiaXMiIDogImdldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiBnZXQiIDw8IGNhcF9uYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0cmluZyBmaWVsZF9uYW1lLCBzdHJpbmcgY2FwX25hbWUpIHsKLSAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZSA9PSBudWxsKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB1bnNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCgiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIil2YWx1ZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gICh2b2lkKSBvdXQ7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBnZXR0ZXJfc3RyZWFtOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gc2V0dGVyX3N0cmVhbTsKLQotICAvLyBidWlsZCB1cCB0aGUgYm9kaWVzIG9mIGJvdGggdGhlIGdldHRlciBhbmQgc2V0dGVyIGF0IG9uY2UKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOwotICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhnZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2V0IG9mIEphdmEgQmVhbiBib2lsZXJwbGF0ZSBmdW5jdGlvbnMgKHNldHRlcnMsIGdldHRlcnMsIGV0Yy4pCi0gKiBmb3IgdGhlIGdpdmVuIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7Ci0KLSAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIC8vIE1ldGhvZCB0byByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGNvbGxlY3Rpb24KLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGdldCIgPDwgY2FwX25hbWU7Ci0gICAgICBvdXQgPDwgZ2V0X2NhcF9uYW1lKCJzaXplKCkgeyIpIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSA/IDAgOiAiIDw8Ci0gICAgICAgICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnNpemUoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpZiAodHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbGlzdCgpKSB7Ci0KLSAgICAgIHRfdHlwZSogZWxlbWVudF90eXBlOwotICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAgIGVsZW1lbnRfdHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBlbGVtZW50X3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgIH0KLQotICAgICAgLy8gSXRlcmF0b3IgZ2V0dGVyIGZvciBzZXRzIGFuZCBsaXN0cwotICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBFbnVtZXJhdGlvbiBnZXQiIDw8IGNhcF9uYW1lOwotICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgiRW51bWVyYXRpb24oKSB7IikgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpID8gbnVsbCA6ICIgPDwKLSAgICAgICAgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuZWxlbWVudHMoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgICAgLy8gQWRkIHRvIHNldCBvciBsaXN0LCBjcmVhdGUgaWYgdGhlIHNldC9saXN0IGlzIG51bGwKLSAgICAgIGluZGVudChvdXQpOwotICAgICAgb3V0IDw8ICJwdWJsaWMgdm9pZCBhZGQiIDw8IGdldF9jYXBfbmFtZSgidG8iKTsKLSAgICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSkgPDwgIiBlbGVtKSB7IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwKLSAgICAgICAgIigpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotCWluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnB1dCgiIDw8Ci0JICBib3hfdHlwZShlbGVtZW50X3R5cGUsICJlbGVtIikgPDwgIiwgIiA8PAotCSAgYm94X3R5cGUoZWxlbWVudF90eXBlLCAiZWxlbSIpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0JaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuYWRkRWxlbWVudCgiIDw8Ci0JICBib3hfdHlwZShlbGVtZW50X3R5cGUsICJlbGVtIikgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICAvLyBQdXQgdG8gbWFwCi0gICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLQotICAgICAgaW5kZW50KG91dCk7Ci0gICAgICBvdXQgPDwgInB1YmxpYyB2b2lkIHB1dFRvIgotCSAgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSkgPDwgIiBrZXksICIKLQkgIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSkgPDwgIiB2YWwpIHsiIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbmV3ICIgPDwKLSAgICAgICAgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIucHV0KGtleSwgdmFsKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBTaW1wbGUgZ2V0dGVyCi0gICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZSh0eXBlKTsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYKLSAgICAgICAgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCkgewotICAgICAgb3V0IDw8ICIgaXMiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgIiBnZXQiOwotICAgIH0KLSAgICBvdXQgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBTaW1wbGUgc2V0dGVyCi0gICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiOwotICAgIG91dCA8PCAidm9pZCI7Ci0gICAgb3V0IDw8ICIgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCBmaWVsZF9uYW1lIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8Ci0gICAgICBlbmRsOwotICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsIGZpZWxkKTsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIFVuc2V0dGVyCi0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfdmVjdG9yWyIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICJdID0gZmFsc2U7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBpc1NldCBtZXRob2QKLSAgICBpbmRlbnQob3V0KSA8PCAiLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCAiIDw8IGZpZWxkX25hbWUgPDwgIiBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19pc3NldF92ZWN0b3JbIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIl07IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgc2V0IiA8PCBjYXBfbmFtZSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIihib29sZWFuIHZhbHVlKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCF2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF92ZWN0b3JbIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIl0gPSB2YWx1ZTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsgCi0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0b1N0cmluZygpIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIlN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIik7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2xlYW4gZmlyc3QgPSB0cnVlOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgaWYoY291bGRfYmVfdW5zZXQpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0KLSAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFmaXJzdCkgc2IuYXBwZW5kKFwiLCBcIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAic2IuYXBwZW5kKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIik7IiA8PCBlbmRsOwotICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBzYi5hcHBlbmQoXCJudWxsXCIpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICAKLSAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKShmaWVsZC0+Z2V0X3R5cGUoKSkpLT5pc19iaW5hcnkoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIlRCYXNlSGVscGVyLnRvU3RyaW5nKHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLCBzYik7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAic2IuYXBwZW5kKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICAKLSAgICBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgImZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOwotCi0gICAgaWYoY291bGRfYmVfdW5zZXQpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZmlyc3QgPSBmYWxzZTsKLSAgfQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAic2IuYXBwZW5kKFwiKVwiKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIHNiLnRvU3RyaW5nKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqIAotICogUmV0dXJucyBhIHN0cmluZyB3aXRoIHRoZSBqYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiB0aHJpZnQgdHlwZQotICogKGUuZy4gZm9yIHRoZSB0eXBlIHN0cnVjdCBpdCByZXR1cm5zICJUVHlwZS5TVFJVQ1QiKQotICovCi1zdGQ6OnN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSkgewotICBpZiAodHlwZS0+aXNfbGlzdCgpKXsKLSAgICByZXR1cm4gIlRUeXBlLkxJU1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5FTlVNIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICByZXR1cm4gZ2V0X2phdmFfdHlwZV9zdHJpbmcoKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRCAgIDogcmV0dXJuICAgICAgIlRUeXBlLlZPSUQiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HIDogcmV0dXJuICAgICJUVHlwZS5TVFJJTkciOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCAgIDogcmV0dXJuICAgICAgIlRUeXBlLkJPT0wiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURSAgIDogcmV0dXJuICAgICAgIlRUeXBlLkJZVEUiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2ICAgIDogcmV0dXJuICAgICAgICJUVHlwZS5JMTYiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyICAgIDogcmV0dXJuICAgICAgICJUVHlwZS5JMzIiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0ICAgIDogcmV0dXJuICAgICAgICJUVHlwZS5JNjQiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFIDogcmV0dXJuICAgICJUVHlwZS5ET1VCTEUiOyBicmVhazsKLSAgICAgIGRlZmF1bHQgOiB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKSArICJcIiBwYXNzZWQgdG8gdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyEiKTsgYnJlYWs7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiXCIgcGFzc2VkIHRvIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmchIik7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKLSAgfQotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKXsKLSAgb3V0IDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKXsKLSAgICBpbmRlbnQob3V0KSA8PCAibmV3IFN0cnVjdE1ldGFEYXRhKFRUeXBlLlNUUlVDVCwgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIi5jbGFzcyI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpewotICAgIGlmICh0eXBlLT5pc19saXN0KCkpewotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBMaXN0TWV0YURhdGEoVFR5cGUuTElTVCwgIjsKLSAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7ICAgIAotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsgICAKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKXsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgU2V0TWV0YURhdGEoVFR5cGUuU0VULCAiOwotICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsgICAgCi0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOyAKLSAgICB9IGVsc2V7IC8vIG1hcAotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBNYXBNZXRhRGF0YShUVHlwZS5NQVAsICI7Ci0gICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGtleV90eXBlKTsKLSAgICAgIG91dCA8PCAiLCAiOwotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgdmFsX3R5cGUpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAibmV3IEVudW1NZXRhRGF0YShUVHlwZS5FTlVNLCAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLmNsYXNzIjsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAibmV3IEZpZWxkVmFsdWVNZXRhRGF0YSgiIDw8IGdldF9qYXZhX3R5cGVfc3RyaW5nKHR5cGUpOwotICAgIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIsIFwiIiA8PCAoKHRfdHlwZWRlZiopdHlwZSktPmdldF9zeW1ib2xpYygpIDw8ICJcIiI7Ci0gICAgfQotICB9Ci0gIG91dCA8PCAiKSI7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gSW4gQysrLCB0aGlzIGNvbXByaXNlcyBhbiBlbnRpcmVseSBzZXBhcmF0ZQotICogaGVhZGVyIGFuZCBzb3VyY2UgZmlsZS4gVGhlIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIG1ldGhvZHMgYW5kIGluY2x1ZGVzCi0gKiB0aGUgZGF0YSB0eXBlcyBkZWZpbmVkIGluIHRoZSBtYWluIGhlYWRlciBmaWxlLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uCi0gKiBmaWxlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYmFzaWMgcHJpbnRlciBhbmQgZGVmYXVsdCBpbnRlcmZhY2VzLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iK3NlcnZpY2VfbmFtZV8rIi5qYXZhIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGphdmFfcGFja2FnZSgpIDw8Ci0gICAgamF2YV90eXBlX2ltcG9ydHMoKSA8PAotICAgIGphdmFfdGhyaWZ0X2ltcG9ydHMoKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgInB1YmxpYyBjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiB7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgIn0iIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJpbWl0aXZlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSBJZmFjZSBleHRlbmRzICIgPDwKLSAgICBzZXJ2aWNlX25hbWVfIDw8ICJJZmFjZSB7IH0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBzdHJpbmcgZl9pbnRlcmZhY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiSWZhY2UuamF2YSI7Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9pZmFjZTsKLSAgZl9pZmFjZS5vcGVuKGZfaW50ZXJmYWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzX2lmYWNlID0gIiBleHRlbmRzICIgKyB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpICsgIklmYWNlIjsKLSAgfQotICAKLSAgZl9pZmFjZSA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgamF2YV9wYWNrYWdlKCkgPDwKLSAgICBqYXZhX3R5cGVfaW1wb3J0cygpIDw8Ci0gICAgamF2YV90aHJpZnRfaW1wb3J0cygpOwotICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2lmYWNlLCB0c2VydmljZSk7Ci0gIGZfaWZhY2UgPDwKLSAgICAicHVibGljIGludGVyZmFjZSAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmYWNlIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbCA8PCBlbmRsOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2lmYWNlLCAqZl9pdGVyKTsKLSAgICBmX2lmYWNlIDw8ICIgIHB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0gIGZfaWZhY2UgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiLklmYWNlIjsKLSAgfQotCi0gIGdlbmVyYXRlX2phdmFfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSBJZmFjZSIgPDwgZXh0ZW5kc19pZmFjZSA8PAotICAgICIgeyIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHN0cnVjdHMgZm9yIGFsbCB0aGUgc2VydmljZSBhcmdzIGFuZCByZXR1cm4gdHlwZXMKLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiLkNsaWVudCI7Ci0gIH0KLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIHN0YXRpYyBjbGFzcyBDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICIgaW1wbGVtZW50cyBUU2VydmljZUNsaWVudCwgSWZhY2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBDbGllbnQoVFByb3RvY29sIHByb3QpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInRoaXMocHJvdCwgcHJvdCk7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBDbGllbnQoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJpcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdF8gPSBvcHJvdDsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInN1cGVyKGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOwotICB9Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCBUUHJvdG9jb2wgaXByb3RfOyIgIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgVFByb3RvY29sIG9wcm90XzsiICA8PCBlbmRsIDw8Ci0gICAgICBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGludCBzZXFpZF87IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljIFRQcm90b2NvbCBnZXRJbnB1dFByb3RvY29sKCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicmV0dXJuIHRoaXMuaXByb3RfOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyBUUHJvdG9jb2wgZ2V0T3V0cHV0UHJvdG9jb2woKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJyZXR1cm4gdGhpcy5vcHJvdF87IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIH0KLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7Ci0KLSAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcwotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotCi0gICAgLy8gRGVjbGFyZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOwotCi0gICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5DQUxMLCArK3NlcWlkXykpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhcmdzLnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKCIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzLndyaXRlKG9wcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90Xy5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiVE1lc3NhZ2UgbXNnID0gaXByb3RfLnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChtc2cudHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnJlYWQoaXByb3RfKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IHg7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAobXNnLnNlcWlkICE9IHNlcWlkXykgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5CQURfU0VRVUVOQ0VfSUQsIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IG91dCBvZiBzZXF1ZW5jZSByZXNwb25zZVwiKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LnJlYWQoaXByb3RfKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlwcm90Xy5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCJzdWNjZXNzIikgPDwgIikgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiByZXN1bHQuc3VjY2VzczsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBJZiB5b3UgZ2V0IGhlcmUgaXQncyBhbiBleGNlcHRpb24sIHVubGVzcyBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgICAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgIn0iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBFeHRlbmRzIHN0dWZmCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIi5Qcm9jZXNzb3IiOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIFByb2Nlc3NvciIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIiBpbXBsZW1lbnRzIFRQcm9jZXNzb3IgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBQcm9jZXNzb3IoSWZhY2UgaWZhY2UpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic3VwZXIoaWZhY2UpOyIgPDwgZW5kbDsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmYWNlXyA9IGlmYWNlOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm9jZXNzTWFwXy5wdXQoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsIG5ldyAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCkpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCBzdGF0aWMgaW50ZXJmYWNlIFByb2Nlc3NGdW5jdGlvbiB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBwdWJsaWMgdm9pZCBwcm9jZXNzKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInByaXZhdGUgSWZhY2UgaWZhY2VfOyIgPDwgZW5kbDsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCBmaW5hbCBIYXNodGFibGUgcHJvY2Vzc01hcF8gPSBuZXcgSGFzaHRhYmxlKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBib29sZWFuIHByb2Nlc3MoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgLy8gVE9ETyhtY3NsZWUpOiB2YWxpZGF0ZSBtZXNzYWdlLCB3YXMgdGhlIHNlcWlkIGV0Yy4gbGVnaXQ/Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJQcm9jZXNzRnVuY3Rpb24gZm4gPSAoUHJvY2Vzc0Z1bmN0aW9uKXByb2Nlc3NNYXBfLmdldChtc2cubmFtZSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIChmbiA9PSBudWxsKSB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBUVHlwZS5TVFJVQ1QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIrbXNnLm5hbWUrXCInXCIpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgeC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJmbi5wcm9jZXNzKG1zZy5zZXFpZCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAodm9pZCkgdHNlcnZpY2U7Ci0gIC8vIE9wZW4gY2xhc3MKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInByaXZhdGUgY2xhc3MgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIiBpbXBsZW1lbnRzIFByb2Nlc3NGdW5jdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgdm9pZCBwcm9jZXNzKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgCi0gICAgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiBlKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlBST1RPQ09MX0VSUk9SLCBlLmdldE1lc3NhZ2UoKSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJpZmFjZV8uIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICAvLyBTZXQgaXNzZXQgb24gc3VjY2VzcyBmaWVsZAotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpICYmICF0eXBlX2Nhbl9iZV9udWxsKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCJzdWNjZXNzIikgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIiAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoVGhyb3dhYmxlIHRoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCBcIkludGVybmFsIGVycm9yIHByb2Nlc3NpbmcgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICAgIC8vIENsb3NlIGNsYXNzCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIENsb3NlIGNsYXNzCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKLSAqIEBwYXJhbSBwcmVmaXggVGhlIHZhcmlhYmxlIG5hbWUgb3IgY29udGFpbmVyIGZvciB0aGlzIGZpZWxkCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlwcm90LiI7Ci0KLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArCi0gICAgICAgICAgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCEoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKTsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAicmVhZEJpbmFyeSgpOyI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAicmVhZEJvb2woKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAicmVhZEkxNigpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAicmVhZEk2NCgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKYXZhIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgKyAiLmZpbmRCeVZhbHVlKGlwcm90LnJlYWRJMzIoKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGludm9rZXMgcmVhZCgpCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCk7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSByZWFkaW5nIGl0cyBzaXplIGFuZCB0aGVuIGl0ZXJhdGluZwotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIHN0cmluZyBvYmo7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG9iaiA9IHRtcCgiX21hcCIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG9iaiA9IHRtcCgiX3NldCIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvYmogPSB0bXAoIl9saXN0Iik7Ci0gIH0KLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJUTWFwICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIlRTZXQgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRTZXRCZWdpbigpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIlRMaXN0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkKLSAgICA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpCi0gICAgLy8gc2l6ZSB0aGUgY29sbGVjdGlvbiBjb3JyZWN0bHkKLSAgICA8PCAiKCIKLSAgICA8PCAodHR5cGUtPmlzX2xpc3QoKSA/ICIiIDogIjIqIiApCi0gICAgPDwgb2JqIDw8ICIuc2l6ZSIKLSAgICA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiZm9yIChpbnQgIiA8PCBpIDw8ICIgPSAwOyAiIDw8Ci0gICAgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5zaXplIiA8PCAiOyAiIDw8Ci0gICAgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfQotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIucHV0KCIgPDwKLSAgICBib3hfdHlwZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KSA8PCAiLCAiIDw8Ci0gICAgYm94X3R5cGUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCkgPDwgIik7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIucHV0KCIgPDwKLSAgICBib3hfdHlwZSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pIDw8ICIsICIgPDwKLSAgICBib3hfdHlwZSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBsaXN0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5hZGRFbGVtZW50KCIgPDwKLSAgICBib3hfdHlwZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKXsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVJMzIoIiA8PCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIi5nZXRWYWx1ZSgpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cKLSAgICAgICAgICAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKYXZhIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi53cml0ZShvcHJvdCk7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgd3JpdGluZyBpdHMgc2l6ZSB0aGVuIHRoZSBlbGVtZW50cy4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgIFRoZSB0eXBlIG9mIGNvbnRhaW5lcgotICogQHBhcmFtIHByZWZpeCBTdHJpbmcgcHJlZml4IGZvciBmaWVsZHMKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVTZXRCZWdpbihuZXcgVFNldCgiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgVExpc3QoIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBzdHJpbmcgZW51bWVyID0gaXRlciArICJfZW51bSI7Ci0gICAgc3RyaW5nIGtleV90eXBlID0gdHlwZV9uYW1lKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCksIHRydWUsIGZhbHNlKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAoRW51bWVyYXRpb24gIiA8PCBlbnVtZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICIua2V5cygpOyAiIDw8IGVudW1lciA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApICI7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KQotICAgICAgPDwga2V5X3R5cGUgPDwgIiAiIDw8IGl0ZXIgPDwgIiA9ICgiIDw8IGtleV90eXBlIDw8ICIpIiA8PCBlbnVtZXIgPDwgIi5uZXh0RWxlbWVudCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBzdHJpbmcgZW51bWVyID0gaXRlciArICJfZW51bSI7Ci0gICAgc3RyaW5nIGVsZV90eXBlID0gdHlwZV9uYW1lKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3IgKEVudW1lcmF0aW9uICIgPDwgZW51bWVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiLmtleXMoKTsgIiA8PCBlbnVtZXIgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSAiOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkKLSAgICAgIDw8IGVsZV90eXBlIDw8ICIgIiA8PCBpdGVyIDw8ICIgPSAoIgotICAgICAgPDwgZWxlX3R5cGUgPDwgIikiIDw8IGVudW1lciA8PCAiLm5leHRFbGVtZW50KCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBzdHJpbmcgZW51bWVyID0gaXRlciArICJfZW51bSI7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3IgKEVudW1lcmF0aW9uICIgPDwgZW51bWVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiLmVsZW1lbnRzKCk7ICIgPDwgZW51bWVyIDw8ICIuaGFzTW9yZUVsZW1lbnRzKCk7ICkgIjsKLSAgICBzY29wZV91cChvdXQpOwotICAgIHN0cmluZyBlbGVfdHlwZSA9IHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHRydWUpOwotICAgIGluZGVudChvdXQpCi0gICAgICA8PCBlbGVfdHlwZSA8PCAiICIgPDwgaXRlciA8PCAiID0gKCIKLSAgICAgIDw8IGVsZV90eXBlIDw8ICIpIiA8PCBlbnVtZXIgPDwgIi5uZXh0RWxlbWVudCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICB9Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCkgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKLSAgc3RyaW5nIHZhbF90eXBlID0gdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCB0cnVlLCBmYWxzZSk7Ci0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCAiKCgiICsgdmFsX3R5cGUgKyAiKSIgKyBtYXAgKyAiLmdldCgiICsgaXRlciArICIpKSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFJldHVybnMgYSBKYXZhIHR5cGUgbmFtZQotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICogQHBhcmFtIGNvbnRhaW5lciBJcyB0aGUgdHlwZSBnb2luZyBpbnNpZGUgYSBjb250YWluZXI/Ci0gKiBAcmV0dXJuIEphdmEgdHlwZSBuYW1lLCBpLmUuIFZlY3RvcgotICovCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXIsIGJvb2wgaW5faW5pdCwgYm9vbCBza2lwX2dlbmVyaWMpIHsKLSAgKHZvaWQpIGluX2luaXQ7Ci0gICh2b2lkKSBza2lwX2dlbmVyaWM7Ci0gIC8vIEluIEphdmEgdHlwZWRlZnMgYXJlIGp1c3QgcmVzb2x2ZWQgdG8gdGhlaXIgcmVhbCB0eXBlCi0gIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0gIHN0cmluZyBwcmVmaXg7Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlLCBpbl9jb250YWluZXIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiSGFzaHRhYmxlIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIkhhc2h0YWJsZSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVmVjdG9yIjsKLSAgfQotCi0gIC8vIENoZWNrIGZvciBuYW1lc3BhY2luZwotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJqYXZhIik7Ci0gICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBwYWNrYWdlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIEMrKyB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgotICoKLSAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCi0gKiBAcGFyYW0gY29udGFpbmVyIElzIGl0IGdvaW5nIGluIGEgSmF2YSBjb250YWluZXI/Ci0gKi8KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyKSB7Ci0gIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOwotCi0gIHN3aXRjaCAodGJhc2UpIHsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgIHJldHVybiAidm9pZCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgIGlmICghdHlwZS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIHJldHVybiAiU3RyaW5nIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICJieXRlW10iOwotICAgIH0KLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkJvb2xlYW4iIDogImJvb2xlYW4iKTsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkJ5dGUiIDogImJ5dGUiKTsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiU2hvcnQiIDogInNob3J0Iik7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkludGVnZXIiIDogImludCIpOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJMb25nIiA6ICJsb25nIik7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkRvdWJsZSIgOiAiZG91YmxlIik7Ci0gIGRlZmF1bHQ6Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICB9Ci19Ci0KLS8qKgotICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICovCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0KSB7Ci0gIC8vIFRPRE8obWNzbGVlKTogZG8gd2UgZXZlciBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkPwotICBzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIGlmIChpbml0KSB7Ci0gICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgb2ZzdHJlYW0gZHVtbXk7Ci0gICAgICByZXN1bHQgKz0gIiA9ICIgKyByZW5kZXJfY29uc3RfdmFsdWUoZHVtbXksIHRmaWVsZC0+Z2V0X25hbWUoKSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7OwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0ICsgIjsiOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwotICBzdGQ6OnN0cmluZyByZXN1bHQgPQotICAgIHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSB0aHJvd3MgIjsKLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICIsICI7Ci0gIH0KLSAgcmVzdWx0ICs9ICJURXhjZXB0aW9uIjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgY29tbWEgc2VwYXJhdGVkIGZpZWxkIGxpc3QsIHdpdGggdHlwZSBuYW1lcwotICovCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfdHlwZXMpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKLSAgICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLSAqLwotc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiVFR5cGUuU1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiVFR5cGUuQllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlRUeXBlLkkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlRUeXBlLkk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVFR5cGUuTElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogQXBwbGllcyB0aGUgY29ycmVjdCBzdHlsZSB0byBhIHN0cmluZyBiYXNlZCBvbiB0aGUgdmFsdWUgb2Ygbm9jYW1lbF9zdHlsZV8KLSAqLwotc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSl7Ci0gIG5hbWVbMF0gPSB0b3VwcGVyKG5hbWVbMF0pOwotICByZXR1cm4gbmFtZTsKLX0KLQotc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Y29uc3RhbnRfbmFtZShzdHJpbmcgbmFtZSkgewotICBzdHJpbmcgY29uc3RhbnRfbmFtZTsKLQotICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKLSAgYm9vbCB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGZhbHNlOwotICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaXRlciA9IG5hbWUuYmVnaW4oKTsgaXRlciAhPSBuYW1lLmVuZCgpOyArK2l0ZXIpIHsKLSAgICBzdHJpbmc6OnZhbHVlX3R5cGUgY2hhcmFjdGVyID0gKCppdGVyKTsKLQotICAgIGJvb2wgaXNfdXBwZXIgPSBpc3VwcGVyKGNoYXJhY3Rlcik7Ci0KLSAgICBpZiAoaXNfdXBwZXIgJiYgIWlzX2ZpcnN0ICYmICF3YXNfcHJldmlvdXNfY2hhcl91cHBlcikgewotICAgICAgY29uc3RhbnRfbmFtZSArPSAnXyc7Ci0gICAgfQotICAgIGNvbnN0YW50X25hbWUgKz0gdG91cHBlcihjaGFyYWN0ZXIpOwotCi0gICAgaXNfZmlyc3QgPSBmYWxzZTsKLSAgICB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGlzX3VwcGVyOwotICB9Ci0KLSAgcmV0dXJuIGNvbnN0YW50X25hbWU7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50KG9mc3RyZWFtICZvdXQsIHN0cmluZyBjb250ZW50cykgewotICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgIi8qKlxuIiwKLSAgICAiICogIiwgY29udGVudHMsCi0gICAgIiAqL1xuIik7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvYyhvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiBmaWVsZCkgewotICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgewotICAgIHN0cmluZyBjb21iaW5lZF9tZXNzYWdlID0gZmllbGQtPmdldF9kb2MoKSArICJcbkBzZWUgIiArIGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsICh0X2RvYyopZmllbGQpOwotICB9Ci19Ci0KLS8qKgotICogRW1pdHMgYSBKYXZhRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0Ci0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvYyhvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYykgewotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvdXQsIHRkb2MtPmdldF9kb2MoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBFbWl0cyBhIEphdmFEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKLSAgICBzdHJpbmdzdHJlYW0gc3M7Ci0gICAgc3MgPDwgdGZ1bmN0aW9uLT5nZXRfZG9jKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKLSAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgewotICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7Ci0gICAgICBzcyA8PCAiXG5AcGFyYW0gIiA8PCBwLT5nZXRfbmFtZSgpOwotICAgICAgaWYgKHAtPmhhc19kb2MoKSkgewotICAgICAgICBzcyA8PCAiICIgPDwgcC0+Z2V0X2RvYygpOwotICAgICAgfQotICAgIH0KLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAiLyoqXG4iLAotICAgICAgIiAqICIsIHNzLnN0cigpLAotICAgICAgIiAqL1xuIik7Ci0gIH0KLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdF9uYW1lLCB0X3R5cGUqIHR5cGUpIHsKLQotICB0X2NvbnRhaW5lciogY29udGFpbmVyID0gKHRfY29udGFpbmVyKil0eXBlOwotICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZTsKLSAgaWYgKHNvdXJjZV9uYW1lX3AyID09ICIiKQotICAgICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMTsKLSAgZWxzZQotICAgICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICIuIiArIHNvdXJjZV9uYW1lX3AyOwotCi0gIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9uYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUoY29udGFpbmVyLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLQotICBzdGQ6OnN0cmluZyBpdGVyYXRvcl9lbGVtZW50X25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICJfZWxlbWVudCI7Ci0gIHN0ZDo6c3RyaW5nIGVudW1lcmF0aW9uX25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICJfZW51bSI7Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdF9lbGVtZW50X25hbWUgPSByZXN1bHRfbmFtZSArICJfY29weSI7Ci0KLSAgaWYoY29udGFpbmVyLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKiljb250YWluZXIpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopY29udGFpbmVyKS0+Z2V0X3ZhbF90eXBlKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAoRW51bWVyYXRpb24gIiA8PCBlbnVtZXJhdGlvbl9uYW1lIDw8ICIgPSAiIDw8IHNvdXJjZV9uYW1lIDw8ICIua2V5cygpOyAiIDw8IGVudW1lcmF0aW9uX25hbWUgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICJfa2V5ID0gKCIgPDwgdHlwZV9uYW1lKGtleV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIikiIDw8IGVudW1lcmF0aW9uX25hbWUgPDwgIi5uZXh0RWxlbWVudCgpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUgPSAoIgotCQk8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiKSIgPDwgc291cmNlX25hbWUgPDwgIi5nZXQoIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIl9rZXkpOyIgPDwgZW5kbDsKLQotICAgIG91dCA8PCBlbmRsOwotCi0gICAgaWYgKGtleV90eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfa2V5IiwgIiIsIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX2tleSIsIGtleV90eXBlKTsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGtleV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl9rZXkgPSAiOwotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX2tleSIsIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX2tleSIsIGtleV90eXBlKTsKLSAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGlmICh2YWxfdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwgIiIsIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwgdmFsX3R5cGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX3ZhbHVlID0gIjsKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwgdmFsX3R5cGUpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5wdXQoIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfa2V5LCAiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl92YWx1ZSk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICB9IGVsc2UgewotICAgIHRfdHlwZSogZWxlbV90eXBlOwotCi0gICAgaWYgKGNvbnRhaW5lci0+aXNfc2V0KCkpIHsKLSAgICAgIGVsZW1fdHlwZSA9ICgodF9zZXQqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZWxlbV90eXBlID0gKCh0X2xpc3QqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KQotICAgICAgPDwgImZvciAoRW51bWVyYXRpb24gIiA8PCBlbnVtZXJhdGlvbl9uYW1lIDw8ICIgPSAiIDw8IHNvdXJjZV9uYW1lIDw8ICIuZWxlbWVudHMoKTsgIiAKLSAgICAgIDw8IGVudW1lcmF0aW9uX25hbWUgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpCi0gICAgICA8PCB0eXBlX25hbWUoZWxlbV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiID0gKCIKLSAgICAgIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiKSIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLm5leHRFbGVtZW50KCk7IiA8PCBlbmRsOwotICAgIGlmIChlbGVtX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICAvLyByZWN1cnNpdmUgZGVlcCBjb3B5Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCAiIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSwgZWxlbV90eXBlKTsKLSAgICAgIGlmIChlbGVtX3R5cGUtPmlzX2xpc3QoKSkgewotCWluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkRWxlbWVudCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLQlpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLnB1dCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIiwgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLy8gaXRlcmF0aXZlIGNvcHkKLSAgICAgIGlmKCgodF9iYXNlX3R5cGUqKWVsZW1fdHlwZSktPmlzX2JpbmFyeSgpKXsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGVsZW1fdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgdGVtcF9iaW5hcnlfZWxlbWVudCA9ICI7Ci0gICAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCAidGVtcF9iaW5hcnlfZWxlbWVudCIsIGVsZW1fdHlwZSk7Ci0gICAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLQlpZiAoZWxlbV90eXBlLT5pc19saXN0KCkpIHsKLQkgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkRWxlbWVudCh0ZW1wX2JpbmFyeV9lbGVtZW50KTsiIDw8IGVuZGw7Ci0JfSBlbHNlIHsKLQkgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIucHV0KHRlbXBfYmluYXJ5X2VsZW1lbnQsIHRlbXBfYmluYXJ5X2VsZW1lbnQpOyIgPDwgZW5kbDsKLQl9Ci0gICAgICB9IGVsc2V7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkRWxlbWVudCgiOwotICAgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwgcmVzdWx0X25hbWUsIGVsZW1fdHlwZSk7Ci0gICAgICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIH0KLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLCBzdGQ6OnN0cmluZyBkZXN0X25hbWUsIHRfdHlwZSogdHlwZSkgewotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpIHx8IHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIC8vIGJpbmFyeSBmaWVsZHMgbmVlZCB0byBiZSBjb3BpZWQgd2l0aCBTeXN0ZW0uYXJyYXljb3B5Ci0gICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSl7Ci0gICAgICBvdXQgPDwgIm5ldyBieXRlWyIgPDwgc291cmNlX25hbWUgPDwgIi5sZW5ndGhdOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJTeXN0ZW0uYXJyYXljb3B5KCIgPDwgc291cmNlX25hbWUgPDwgIiwgMCwgIiA8PCBkZXN0X25hbWUgPDwgIiwgMCwgIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmxlbmd0aCkiOwotICAgIH0KLSAgICAvLyBldmVyeXRoaW5nIGVsc2UgY2FuIGJlIGNvcGllZCBkaXJlY3RseQotICAgIGVsc2UKLSAgICAgIG91dCA8PCBzb3VyY2VfbmFtZTsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwgIm5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCB0cnVlKSA8PCAiKCIgPDwgc291cmNlX25hbWUgPDwgIikiOwotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpIHsKLSAgcmV0dXJuIGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkLT5nZXRfbmFtZSgpKTsKLX0KLQotc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjppc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCkgewotICByZXR1cm4gIl9fIiArIHVwY2FzZV9zdHJpbmcoZmllbGQtPmdldF9uYW1lKCkgKyAiX2lzc2V0X2lkIik7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgewotICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOwotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfc2V0KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7Ci0gIGlmICghdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAic2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKHRydWUpOyIgPDwgZW5kbDsKLSAgfQotfQotCi1zdGQ6OnN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7Ci0gIHN0cmluZyBwYWNrYWdlID0gIiI7Ci0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJqYXZhIikgKyAiLiI7Ci0gIH0KLSAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHJpdmF0ZSBzdGF0aWMgZmluYWwgVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBUU3RydWN0KFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGVzY3Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCBURmllbGQgIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwKLSAgICAgICJfRklFTERfREVTQyA9IG5ldyBURmllbGQoXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICIoc2hvcnQpIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotYm9vbCB0X2phdmFtZV9nZW5lcmF0b3I6Omhhc19iaXRfdmVjdG9yKHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbChnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgY2xlYXIoKSB7IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy4iICsgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gbXVzdCBiZSBhIGJhc2UgdHlwZQotICAgICAgICAvLyBtZWFucyBpdCBhbHNvIG5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgdW5zZXQKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIoZmFsc2UpOyIgPDwgZW5kbDsKLSAgICAgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKSkgewotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAwOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IDAuMDsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDogIC8vIHByZXZlbnQgZ2NjIGNvbXBpbGVyIHdhcm5pbmcKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihqYXZhbWUsICJKYXZhIE1FIiwgIiIpCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfanNfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmNhMDVhLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzgxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxsaXN0PgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLQotLyoqCi0gKiBKUyBjb2RlIGdlbmVyYXRvci4KLSAqLwotY2xhc3MgdF9qc19nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfanNfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykgOgotICAgICB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgewotICAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICAgCi0gICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0gICAgIAotICAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgibm9kZSIpOwotICAgICBnZW5fbm9kZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0gICAgIAotICAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgianF1ZXJ5Iik7Ci0gICAgIGdlbl9qcXVlcnlfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgIGlmIChnZW5fbm9kZV8pIHsKLSAgICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1ub2RlanMiOwotICAgICB9IGVsc2UgewotICAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWpzIjsKLSAgICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0ICAgICh0X2NvbnN0KiAgICB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbiAodF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9yZWN2X3Rocm93KHN0ZDo6c3RyaW5nIHZhcik7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9yZWN2X3JldHVybihzdGQ6OnN0cmluZyB2YXIpOwotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotCi0gIC8qKgotICAgKiBTdHJ1Y3RzIQotICAgKi8KLSAgdm9pZCBnZW5lcmF0ZV9qc19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9qc19zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uPWZhbHNlLCBib29sIGlzX2V4cG9ydGVkPXRydWUpOwotICB2b2lkIGdlbmVyYXRlX2pzX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qc19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QgICAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uICAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3M9ZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0ICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50ICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIGpzX2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0PWZhbHNlLCBib29sIG9iaj1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwgYm9vbCBpbmNsdWRlX2NhbGxiYWNrPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpbmNsdWRlX2NhbGxiYWNrPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0ZDo6c3RyaW5nIGF1dG9nZW5fY29tbWVudCgpIHsKLSAgICByZXR1cm4KLSAgICAgIHN0ZDo6c3RyaW5nKCIvL1xuIikgKwotICAgICAgIi8vIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIiArCi0gICAgICAiLy9cbiIgKwotICAgICAgIi8vIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKwotICAgICAgIi8vXG4iOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGpzX25hbWVzcGFjZV9waWVjZXModF9wcm9ncmFtKiBwKSB7Ci0gICAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoImpzIik7Ci0KLSAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgICBsb2M7Ci0gICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGllY2VzOwotCi0gICAgICBpZiAobnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgICAgICAgICBwaWVjZXMucHVzaF9iYWNrKG5zLnN1YnN0cigwLCBsb2MpKTsKLSAgICAgICAgICAgICAgbnMgPSBucy5zdWJzdHIobG9jKzEpOwotICAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICBwaWVjZXMucHVzaF9iYWNrKG5zKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHBpZWNlczsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGpzX3R5cGVfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgewotICAgIGlmIChnZW5fbm9kZV8pIHsKLSAgICAgIGlmIChwICE9IE5VTEwgJiYgcCAhPSBwcm9ncmFtXykgewotICAgICAgICByZXR1cm4gcC0+Z2V0X25hbWUoKSArICJfdHR5cGVzLiI7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gInR0eXBlcy4iOwotICAgIH0KLSAgICByZXR1cm4ganNfbmFtZXNwYWNlKHApOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcganNfZXhwb3J0X25hbWVzcGFjZSh0X3Byb2dyYW0qIHApIHsKLSAgICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgICByZXR1cm4gImV4cG9ydHMuIjsKLSAgICB9Ci0gICAgcmV0dXJuIGpzX25hbWVzcGFjZShwKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGpzX25hbWVzcGFjZSh0X3Byb2dyYW0qIHApIHsKLSAgICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgianMiKTsKLSAgICAgIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgbnMgKz0gIi4iOwotICAgICAgfQotCi0KLSAgICAgIHJldHVybiBuczsKLSAgfQotCi0gcHJpdmF0ZToKLQotICAvKioKLSAgICogVHJ1ZSBpZmYgd2Ugc2hvdWxkIGdlbmVyYXRlIE5vZGVKUy1mcmllbmRseSBSUEMgc2VydmljZXMuCi0gICAqLwotICBib29sIGdlbl9ub2RlXzsKLQotICAvKioKLSAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgc2VydmljZXMgdGhhdCB1c2UgalF1ZXJ5IGFqYXggKGFzeW5jL3N5bmMpLgotICAgKi8KLSAgYm9vbCBnZW5fanF1ZXJ5XzsKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci19OwotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICBzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKLQotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3R5cGVzX25hbWUgPSBvdXRkaXIrcHJvZ3JhbV8tPmdldF9uYW1lKCkrIl90eXBlcy5qcyI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAganNfaW5jbHVkZXMoKSA8PCBlbmRsOwotCi0gIGlmIChnZW5fbm9kZV8pIHsKLSAgICBmX3R5cGVzXyA8PCAidmFyIHR0eXBlcyA9IG1vZHVsZS5leHBvcnRzID0ge307IiA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIHBuczsKLQotICAvL3NldHVwIHRoZSBuYW1lc3BhY2UKLSAgLy8gVE9ETyBzaG91bGQgdGhlIG5hbWVzcGFjZSBqdXN0IGJlIGluIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZvciBub2RlPwotICB2ZWN0b3I8c3RyaW5nPiBuc19waWVjZXMgPSBqc19uYW1lc3BhY2VfcGllY2VzKCBwcm9ncmFtXyApOwotICBpZiggbnNfcGllY2VzLnNpemUoKSA+IDApewotICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBuc19waWVjZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgIHBucyArPSAoKGkgPT0gMCkgPyAiIiA6ICIuIikgKyBuc19waWVjZXNbaV07Ci0gICAgICBmX3R5cGVzXyA8PCAiaWYgKHR5cGVvZiAiIDw8IHBucyA8PCAiID09PSAndW5kZWZpbmVkJykgeyIgPDwgZW5kbDsKLSAgICAgICAgZl90eXBlc18gPDwgIiAgIiA8PCBwbnMgPDwgIiA9IHt9OyIgPDwgZW5kbDsKLSAgICAgICAgZl90eXBlc18gPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQganMgaW1wb3J0cwotICovCi1zdHJpbmcgdF9qc19nZW5lcmF0b3I6OmpzX2luY2x1ZGVzKCkgewotICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgcmV0dXJuIHN0cmluZygidmFyIFRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpLlRocmlmdDsiKTsKLSAgfQotICBzdHJpbmcgaW5jOwotCi0gIHJldHVybiBpbmM7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQotICovCi1zdHJpbmcgdF9qc19nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlcygpIHsKLSAgaWYgKGdlbl9ub2RlXykgewotICAgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7Ci0gICAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgIHJlc3VsdCArPSAidmFyICIgKyBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSArICJfdHR5cGVzID0gcmVxdWlyZSgnLi8iICsgaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkgKyAiX3R5cGVzJylcbiI7Ci0gICAgfQotICAgIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7Ci0gICAgICByZXN1bHQgKz0gIlxuIjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICBzdHJpbmcgaW5jOwotCi0gIHJldHVybiBpbmM7Ci19Ci0KLS8qKgotICogQ2xvc2UgdXAgKG9yIGRvd24pIHNvbWUgZmlsZXouCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZQotCi0gIGZfdHlwZXNfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBKUywgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpIHR0eXBlZGVmOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIFNpbmNlIGRlZmluZSBpcyBleHBlbnNpdmUgdG8gbG9va3VwCi0gKiBpbiBKUywgd2UgdXNlIGEgZ2xvYmFsIGFycmF5IGZvciB0aGlzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIGZfdHlwZXNfIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHRlbnVtLT5nZXRfcHJvZ3JhbSgpKTw8dGVudW0tPmdldF9uYW1lKCk8PCIgPSB7Ijw8ZW5kbDsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBmX3R5cGVzXyA8PCAiJyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIDogIiA8PCB2YWx1ZTsKLSAgICBpZiAoY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKS0xKSB7Ci0gICAgICAgIGZfdHlwZXNfIDw8ICIsIjsKLSAgICB9Ci0gICAgZl90eXBlc18gPDwgZW5kbDsKLSAgfQotCi0gIGZfdHlwZXNfIDw8ICJ9OyI8PGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIGZfdHlwZXNfIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHByb2dyYW1fKSAgPDwgbmFtZSA8PCAiID0gIjsKLSAgZl90eXBlc18gPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCAiOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9qc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0KLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAiJyIgPDwgdmFsdWUtPmdldF9zdHJpbmcoKSA8PCAiJyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBvdXQgPDwgIm5ldyAiIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpIDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIih7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBpZiAodl9pdGVyICE9IHZhbC5iZWdpbigpKQotICAgICAgICBvdXQgPDwgIiwiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIG91dCA8PCAiIDogIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgIH0KLQotICAgIG91dCA8PCAifSkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICBib29sICAgIGtleV9pc19zdHJpbmcgPSBmYWxzZTsKLSAgICBpZiAoa3R5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKWt0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpewotICAgICAgICBrZXlfaXNfc3RyaW5nID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIG91dCA8PCAieyI7Ci0KLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmJlZ2luKCkpCi0gICAgICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotCi0gICAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotCi0gICAgICAgIG91dCA8PCAiIDogIjsKLSAgICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgIH0KLQotICAgIG91dCA8PCBlbmRsIDw8ICJ9IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgb3V0IDw8ICJbIjsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmJlZ2luKCkpCi0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICB9Ci0gICAgb3V0IDw8ICJdIjsKLSAgfQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIE1ha2UgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2pzX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfanNfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogU3RydWN0cyBjYW4gYmUgbm9ybWFsIG9yIGV4Y2VwdGlvbnMuCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBub3RoaW5nIGluIEpTCi0gKiB3aGVyZSB0aGUgb2JqZWN0cyBhcmUgYWxsIGp1c3QgYXNzb2NpYXRpdmUgYXJyYXlzICh1bmxlc3Mgb2YgY291cnNlIHdlCi0gKiBkZWNpZGUgdG8gc3RhcnQgdXNpbmcgb2JqZWN0cyBmb3IgdGhlbS4uLikKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4cG9ydGVkKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKGdlbl9ub2RlXykgewotICAgIGlmIChpc19leHBvcnRlZCkgewotICAgICAgb3V0IDw8ICJ2YXIgIiA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PAotICAgICAgICAibW9kdWxlLmV4cG9ydHMuIiA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiID0gZnVuY3Rpb24oYXJncykge1xuIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICJ2YXIgIiA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiID0gZnVuY3Rpb24oYXJncykge1xuIjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IiA9IGZ1bmN0aW9uKGFyZ3MpIHtcbiI7Ci0gIH0KLQotICBpZiAoZ2VuX25vZGVfICYmIGlzX2V4Y2VwdGlvbikgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJUaHJpZnQuVEV4Y2VwdGlvbi5jYWxsKHRoaXMsIFwiIiA8PAotICAgICAgICAgIGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIikiIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMubmFtZSA9IFwiIiA8PAotICAgICAgICAgIGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIiIgPDwgZW5kbDsKLSAgfQotCi0gIC8vbWVtYmVycyB3aXRoIGFyZ3VtZW50cwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgc3RyaW5nIGR2YWwgPSBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsZmFsc2UsdHJ1ZSk7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgISh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgewotICAgICAgICBkdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKCgqbV9pdGVyKS0+IGdldF90eXBlKCksICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIGR2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gIH0KLQotICAvLyBHZW5lcmF0ZSBjb25zdHJ1Y3RvciBmcm9tIGFycmF5Ci0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0LCAoKm1faXRlciktPmdldF92YWx1ZSgpKSAgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICAiaWYgKGFyZ3MpIHsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAiaWYgKGFyZ3MuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gdW5kZWZpbmVkKSB7IiA8PCBlbmRsCi0gICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gYXJncy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSAgPDwgIjsiIDw8IGVuZGwKLSAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAgIn0iIDw8IGVuZGw7Ci0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCAifTtcbiI7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAiVGhyaWZ0LmluaGVyaXRzKCIgPDwKLSAgICAgICAganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8Ci0gICAgICAgIHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiwgVGhyaWZ0LlRFeGNlcHRpb24pOyIgPDwgZW5kbDsKLQlvdXQgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpPDx0c3RydWN0LT5nZXRfbmFtZSgpIDw8Ii5wcm90b3R5cGUubmFtZSA9ICciIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIC8vaW5pdCBwcm90b3R5cGUKLSAgICBvdXQgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpPDx0c3RydWN0LT5nZXRfbmFtZSgpIDw8Ii5wcm90b3R5cGUgPSB7fTtcbiI7Ci0gIH0KLQotCi0gIGdlbmVyYXRlX2pzX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfanNfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkKCkgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgb3V0IDw8ICBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSk8PHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKGlucHV0KSB7Ijw8ZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOwotCi0KLSAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCi0gIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAidmFyIHJldCA9IGlucHV0LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAidmFyIGZuYW1lID0gcmV0LmZuYW1lOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInZhciBmdHlwZSA9IHJldC5mdHlwZTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ2YXIgZmlkID0gcmV0LmZpZDsiICAgPDwgZW5kbDsKLQotCi0gIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgaW5kZW50KG91dCkgPDwgImlmIChmdHlwZSA9PSBUaHJpZnQuVHlwZS5TVE9QKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGlmICghZmllbGRzLmVtcHR5KCkpIHsKLSAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZwotICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZCkiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLQotICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0gICAgICBpbmRlbnRfZG93bigpOwotCi0gICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICAiICBpbnB1dC5za2lwKGZ0eXBlKTsiIDw8IGVuZGw7Ci0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotCi0gICAgfQotICAgIGlmIChmaWVsZHMuc2l6ZSgpID09IDEpIHsKLSAgICAgIC8vIHBzZXVkbyBjYXNlIHRvIG1ha2UganNsaW50IGhhcHB5Ci0gICAgICBpbmRlbnQob3V0KSA8PCAgImNhc2UgMDoiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAgIiAgaW5wdXQuc2tpcChmdHlwZSk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgICIgIGJyZWFrOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICAgIGluZGVudChvdXQpIDw8ICAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgICIgIGlucHV0LnNraXAoZnR5cGUpOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQuc2tpcChmdHlwZSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgd3JpdGUoKSBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSk8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24ob3V0cHV0KSB7Ijw8ZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LndyaXRlU3RydWN0QmVnaW4oJyIgPDwgbmFtZSA8PCAiJyk7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvdXRwdXQud3JpdGVGaWVsZEJlZ2luKCIgPDwKLSAgICAgICInIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKLQotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJvdXRwdXQud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIG91dCA8PGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gICAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKStzZXJ2aWNlX25hbWVfKyIuanMiOwotICAgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgICBqc19pbmNsdWRlcygpIDw8IGVuZGwgPDwKLSAgICAgIHJlbmRlcl9pbmNsdWRlcygpIDw8IGVuZGw7Ci0KLSAgICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgInZhciAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgICAiID0gcmVxdWlyZSgnLi8iIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICInKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgInZhciAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQgPSAiIDw8Ci0gICAgICAgICAgICB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiLkNsaWVudCIgPDwgZW5kbDsKLQotICAgICAgICB9Ci0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICJ2YXIgdHR5cGVzID0gcmVxdWlyZSgnLi8iICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiX3R5cGVzJyk7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICAgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLQotICAgIGlmIChnZW5fbm9kZV8pIHsKLSAgICAgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgInZhciAiIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yID0gIiA8PAotICAgICAgICAiZXhwb3J0cy5Qcm9jZXNzb3IgPSBmdW5jdGlvbihoYW5kbGVyKSAiOwotCi0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLl9oYW5kbGVyID0gaGFuZGxlciIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgIGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yLnByb3RvdHlwZS5wcm9jZXNzID0gZnVuY3Rpb24oaW5wdXQsIG91dHB1dCkgIjsKLQotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIHIgPSBpbnB1dC5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXNbJ3Byb2Nlc3NfJyArIHIuZm5hbWVdKSB7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhpc1sncHJvY2Vzc18nICsgci5mbmFtZV0uY2FsbCh0aGlzLCByLnJzZXFpZCwgaW5wdXQsIG91dHB1dCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGlucHV0LnNraXAoVGhyaWZ0LlR5cGUuU1RSVUNUKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGlucHV0LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB2YXIgeCA9IG5ldyBUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLlVOS05PV05fTUVUSE9ELCAnVW5rbm93biBmdW5jdGlvbiAnICsgci5mbmFtZSk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oci5mbmFtZSwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgci5yc2VxaWQpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgeC53cml0ZShvdXRwdXQpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgb3V0cHV0LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgb3V0cHV0LmZsdXNoKCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gICAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IucHJvdG90eXBlLnByb2Nlc3NfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIgPSBmdW5jdGlvbihzZXFpZCwgaW5wdXQsIG91dHB1dCkgIjsKLQotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgc3RyaW5nIGFyZ3NuYW1lID0gIGpzX25hbWVzcGFjZShwcm9ncmFtXykrIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICAgIHN0cmluZyByZXN1bHRuYW1lID0gIGpzX25hbWVzcGFjZShwcm9ncmFtXykrIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ2YXIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImFyZ3MucmVhZChpbnB1dCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpbnB1dC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLQotICAgIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotCi0gICAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKLSAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFmaXJzdCkgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgImZ1bmN0aW9uIChzdWNjZXNzKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5zdWNjZXNzID0gc3VjY2VzczsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAiXCIsIFRocmlmdC5NZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvdXRwdXQpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvdXRwdXQuZmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSkiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICIvL0hFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICAgICAgc3RyaW5nIG5hbWUgPSB0cy0+Z2V0X25hbWUoKTsKLSAgICAgICAgdHMtPnNldF9uYW1lKHNlcnZpY2VfbmFtZV8gKyAiXyIgKyBuYW1lKTsKLSAgICAgICAgZ2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGdlbmVyYXRlX2pzX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gICAgICAgIHRzLT5zZXRfbmFtZShuYW1lKTsKLSAgICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gICAgfQotCi0gICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gICAgfQotCi0gICAgZ2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gICh2b2lkKSB0c2VydmljZTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBSRVNUIGludGVyZmFjZQotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAodm9pZCkgdHNlcnZpY2U7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0KLSAgaWYgKGdlbl9ub2RlXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgInZhciAiIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ID0gIiA8PCAKLSAgICAgICAgImV4cG9ydHMuQ2xpZW50ID0gZnVuY3Rpb24ob3V0cHV0LCBwQ2xhc3MpIHsiPDxlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgPSBmdW5jdGlvbihpbnB1dCwgb3V0cHV0KSB7Ijw8ZW5kbDsKLSAgfQotCi0gIGluZGVudF91cCgpOwotCi0KLSAgaWYgKGdlbl9ub2RlXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMub3V0cHV0ID0gb3V0cHV0OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgdGhpcy5wQ2xhc3MgPSBwQ2xhc3M7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLnNlcWlkID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMuX3JlcXMgPSB7fTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgdGhpcy5pbnB1dCA9IGlucHV0OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgdGhpcy5vdXRwdXQgPSAoIW91dHB1dCkgPyBpbnB1dCA6IG91dHB1dDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMuc2VxaWQgPSAwOyIgPDwgZW5kbDsKLSAgfQotCi0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGw7Ci0KLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVGhyaWZ0LmluaGVyaXRzKCIgPDwKLSAgICAgICAganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PAotICAgICAgICBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQsICIgPDwKLSAgICAgICAgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIkNsaWVudCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgICAvL2luaXQgcHJvdG90eXBlCi0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSk8PHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudC5wcm90b3R5cGUgPSB7fTsiPDxlbmRsOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBzdHJpbmcgYXJnbGlzdCA9IGFyZ3VtZW50X2xpc3QoYXJnX3N0cnVjdCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgZl9zZXJ2aWNlXyA8PCAganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKTw8c2VydmljZV9uYW1lXzw8IkNsaWVudC5wcm90b3R5cGUuIiA8PAotICAgICAgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICIiLCBnZW5fbm9kZV8gfHwgZ2VuX2pxdWVyeV8pIDw8ICIgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidGhpcy5zZXFpZCArPSAxOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidGhpcy5fcmVxc1t0aGlzLnNlcWlkXSA9IGNhbGxiYWNrOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKGdlbl9qcXVlcnlfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PAotICAgICAgInRoaXMuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QgPDwgIik7IiA8PCBlbmRsOwotCi0gICAgaWYgKCFnZW5fbm9kZV8gJiYgISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAidGhpcy5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGlmIChnZW5fanF1ZXJ5XykgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciBwb3N0RGF0YSA9IHRoaXMuc2VuZF8iIDw8IGZ1bm5hbWUgPDwKLSAgICAgICAgICAgIigiIDw8IGFyZ2xpc3QgPDwgKGFyZ2xpc3QuZW1wdHkoKSA/ICIiIDogIiwgIikgPDwgInRydWUpOyIgPDwgZW5kbDsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIuanFSZXF1ZXN0KHRoaXMsIHBvc3REYXRhLCBhcmd1bWVudHMsIHRoaXMucmVjdl8iIDw8IGZ1bm5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGZfc2VydmljZV8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLQotICAgIC8vIFNlbmQgZnVuY3Rpb24KLSAgICBmX3NlcnZpY2VfIDw8ICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpPDxzZXJ2aWNlX25hbWVfIDw8Ci0gICAgICAgICJDbGllbnQucHJvdG90eXBlLnNlbmRfIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgIiIsIGdlbl9qcXVlcnlfKSA8PCAiIHsiIDw8ZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgc3RkOjpzdHJpbmcgb3V0cHV0VmFyOwotICAgIGlmIChnZW5fbm9kZV8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZhciBvdXRwdXQgPSBuZXcgdGhpcy5wQ2xhc3ModGhpcy5vdXRwdXQpOyIgPDwgZW5kbDsKLSAgICAgIG91dHB1dFZhciA9ICJvdXRwdXQiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXRwdXRWYXIgPSAidGhpcy5vdXRwdXQiOwotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0gIGpzX25hbWVzcGFjZShwcm9ncmFtXykrIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8IG91dHB1dFZhciA8PCAiLndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgVGhyaWZ0Lk1lc3NhZ2VUeXBlLkNBTEwsIHRoaXMuc2VxaWQpOyIgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ2YXIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7IAotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUoIiA8PCBvdXRwdXRWYXIgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBvdXRwdXRWYXIgPDwgIi53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhpcy5vdXRwdXQuZmx1c2goKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChnZW5fanF1ZXJ5XykgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2goY2FsbGJhY2spOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8ICJ9OyIgPDwgZW5kbDsKLQotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0ganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgICAgIGlmIChnZW5fbm9kZV8pIHsKLSAgICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICBlbmRsIDw8ICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpPDxzZXJ2aWNlX25hbWVfIDw8Ci0gICAgICAgICAgICAiQ2xpZW50LnByb3RvdHlwZS5yZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBmdW5jdGlvbihpbnB1dCxtdHlwZSxyc2VxaWQpIHsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotCi0gICAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKLSAgICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICBlbmRsIDw8ICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpPDxzZXJ2aWNlX25hbWVfIDw8Ci0gICAgICAgICAgICAiQ2xpZW50LnByb3RvdHlwZS4iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgIiB7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgc3RkOjpzdHJpbmcgaW5wdXRWYXI7Ci0gICAgICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgICAgIGlucHV0VmFyID0gImlucHV0IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlucHV0VmFyID0gInRoaXMuaW5wdXQiOwotICAgICAgfQotCi0gICAgICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidmFyIGNhbGxiYWNrID0gdGhpcy5fcmVxc1tyc2VxaWRdIHx8IGZ1bmN0aW9uKCkge307IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImRlbGV0ZSB0aGlzLl9yZXFzW3JzZXFpZF07IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ2YXIgcmV0ID0gdGhpcy5pbnB1dC5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInZhciBmbmFtZSA9IHJldC5mbmFtZTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidmFyIG10eXBlID0gcmV0Lm10eXBlOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ2YXIgcnNlcWlkID0gcmV0LnJzZXFpZDsiIDw8ZW5kbDsKLSAgICAgIH0KLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAobXR5cGUgPT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHZhciB4ID0gbmV3IFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB4LnJlYWQoIiA8PCBpbnB1dFZhciA8PCAiKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGlucHV0VmFyIDw8ICIucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IHJlbmRlcl9yZWN2X3Rocm93KCJ4IikgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZhciByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKCIgPDwgaW5wdXRWYXIgPDwgIik7IiA8PCBlbmRsOwotCi0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgaW5wdXRWYXIgPDwgIi5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotCi0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG51bGwgIT09IHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCByZW5kZXJfcmVjdl90aHJvdygicmVzdWx0LiIgKyAoKnhfaXRlciktPmdldF9uYW1lKCkpIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAobnVsbCAhPT0gcmVzdWx0LnN1Y2Nlc3MpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IHJlbmRlcl9yZWN2X3JldHVybigicmVzdWx0LnN1Y2Nlc3MiKSA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCByZW5kZXJfcmVjdl90aHJvdygiJyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiIGZhaWxlZDogdW5rbm93biByZXN1bHQnIikgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJjYWxsYmFjayhudWxsKSIgPDwgZW5kbDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJ9OyI8PGVuZGw7Ci0KLSAgICB9Ci0gIH0KLQotfQotCi1zdGQ6OnN0cmluZyB0X2pzX2dlbmVyYXRvcjo6cmVuZGVyX3JlY3ZfdGhyb3coc3RkOjpzdHJpbmcgdmFyKSB7Ci0gIGlmIChnZW5fbm9kZV8pIHsKLSAgICByZXR1cm4gInJldHVybiBjYWxsYmFjaygiICsgdmFyICsgIik7IjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gInRocm93ICIgKyB2YXIgKyAiOyI7Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnJlbmRlcl9yZWN2X3JldHVybihzdGQ6OnN0cmluZyB2YXIpIHsKLSAgaWYgKGdlbl9ub2RlXykgewotICAgIHJldHVybiAicmV0dXJuIGNhbGxiYWNrKG51bGwsICIgKyB2YXIgKyAiKTsiOwotICB9IGVsc2UgewotICAgIHJldHVybiAicmV0dXJuICIgKyB2YXIgKyAiOyI7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MpIHsKLSAgKHZvaWQpIGluY2xhc3M7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXgrdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBpbnB1dC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsKLSAgICAgICAgICBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgInJlYWRCb29sKCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgInJlYWRJMzIoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAicmVhZEk2NCgpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSlMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgInJlYWRJMzIoKSI7Ci0gICAgfQotCi0gICAgaWYgKCFnZW5fbm9kZV8pIHsKLSAgICAgICAgb3V0IDw8ICIudmFsdWUiOwotICAgIH0KLQotICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHZhcmlhYmxlLiBUaGlzIG1ha2VzIHR3byBrZXkgYXNzdW1wdGlvbnMsCi0gKiBmaXJzdCB0aGF0IHRoZXJlIGlzIGEgY29uc3QgY2hhciogdmFyaWFibGUgbmFtZWQgZGF0YSB0aGF0IHBvaW50cyB0byB0aGUKLSAqIGJ1ZmZlciBmb3IgZGVzZXJpYWxpemF0aW9uLCBhbmQgdGhhdCB0aGVyZSBpcyBhIHZhcmlhYmxlIHByb3RvY29sIHdoaWNoCi0gKiBpcyBhIHJlZmVyZW5jZSB0byBhIFRQcm90b2NvbCBzZXJpYWxpemF0aW9uIG9iamVjdC4KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCAganNfdHlwZV9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSk8PHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5yZWFkKGlucHV0KTsiIDw8IGVuZGw7Ci0KLX0KLQotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKLSAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKLSAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKLSAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKLSAgc3RyaW5nIHJ0bXAzID0gdG1wKCJfcnRtcDMiKTsKLQotICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOwotICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfYnl0ZSwga3R5cGUpOwotICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfYnl0ZSwgdnR5cGUpOwotICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfYnl0ZSwgZXR5cGUpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyICIgPDwgc2l6ZSA8PCAiID0gMDsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyICIgPDwgcnRtcDMgPDwgIjsiIDw8IGVuZGw7Ci0KLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSB7fTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidmFyICIgPDwga3R5cGUgPDwgIiA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInZhciAiIDw8IHZ0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbDsKLQotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHJ0bXAzIDw8ICIgPSBpbnB1dC5yZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwga3R5cGUgPDwgIiA9ICIgPDwgcnRtcDMgPDwgIi5rdHlwZTsiIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgdnR5cGUgPDwgIiA9ICIgPDwgcnRtcDMgPDwgIi52dHlwZTsiIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgc2l6ZSAgPDwgIiA9ICIgPDwgcnRtcDMgPDwgIi5zaXplOyIgPDwgZW5kbDsKLQotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0KLSAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBbXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZhciAiIDw8IGV0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBydG1wMyA8PCAiID0gaW5wdXQucmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IGV0eXBlIDw8ICIgPSAiIDw8IHJ0bXAzIDw8ICIuZXR5cGU7Ijw8ZW5kbDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHNpemUgPDwgIiA9ICIgPDwgcnRtcDMgPDwgIi5zaXplOyI8PGVuZGw7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0KLSAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBbXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZhciAiIDw8IGV0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBydG1wMyA8PCAiID0gaW5wdXQucmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBldHlwZSA8PCAiID0gIiA8PCBydG1wMyA8PCAiLmV0eXBlOyI8PGVuZGw8PAotICAgICAgICBpbmRlbnQoKSA8PCBzaXplIDw8ICIgPSAiIDw8IHJ0bXAzIDw8ICIuc2l6ZTsiPDxlbmRsOwotICB9Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiZm9yICh2YXIgIiA8PAotICAgIGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBzaXplIDw8ICI7ICsrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJrZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgidmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmtleSwgZmFsc2UsIGZhbHNlKSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmdmFsLCBmYWxzZSwgZmFsc2UpIDw8ICI7IiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICAgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInZhciAiIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICAgcHJlZml4IDw8ICIucHVzaCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAidmFyICIgPDwgZWxlbSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgICBwcmVmaXggPDwgIi5wdXNoKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICt0ZmllbGQtPmdldF9uYW1lKCkgKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICBzdHJpbmcgbmFtZSA9IHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICAgIC8vSGFjayBmb3Igd2hlbiBwcmVmaXggaXMgZGVmaW5lZCAoYWx3YXlzIGEgaGFzaCByZWYpCi0gICAgaWYoIXByZWZpeC5lbXB0eSgpKQotICAgICAgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdwotICAgICAgICAgICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEpTIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOwotICAgIH0KLSAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLndyaXRlKG91dHB1dCk7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFdyaXRlcyBvdXQgYSBjb250YWluZXIKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIm91dHB1dC53cml0ZU1hcEJlZ2luKCIgPDwKLSAgICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgIlRocmlmdC5vYmplY3RMZW5ndGgoIiA8PCBwcmVmaXggPDwgIikpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm91dHB1dC53cml0ZVNldEJlZ2luKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICBwcmVmaXggPDwgIi5sZW5ndGgpOyIgPDwgZW5kbDsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJvdXRwdXQud3JpdGVMaXN0QmVnaW4oIiA8PAotICAgICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAgIHByZWZpeCA8PCAiLmxlbmd0aCk7IiA8PCBlbmRsOwotCi0gIH0KLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGtpdGVyID0gdG1wKCJraXRlciIpOwotICAgIHN0cmluZyB2aXRlciA9IHRtcCgidml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yICh2YXIgIjw8a2l0ZXI8PCIgaW4gIjw8cHJlZml4PDwiKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoIjw8cHJlZml4PDwiLmhhc093blByb3BlcnR5KCI8PGtpdGVyPDwiKSkiIDw8ZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIjw8dml0ZXI8PCIgPSAiPDxwcmVmaXg8PCJbIjw8a2l0ZXI8PCJdOyI8PGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotCi0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yICh2YXIgIjw8aXRlcjw8IiBpbiAiIDw8IHByZWZpeCA8PCAiKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoIjw8cHJlZml4PDwiLmhhc093blByb3BlcnR5KCI8PGl0ZXI8PCIpKSIgPDxlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgaXRlciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIlsiIDw8IGl0ZXIgPDwgIl07Ijw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImZvciAodmFyICI8PGl0ZXI8PCIgaW4gIjw8IHByZWZpeCA8PCAiKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoIjw8cHJlZml4PDwiLmhhc093blByb3BlcnR5KCI8PGl0ZXI8PCIpKSIgPDxlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgaXRlciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIlsiIDw8IGl0ZXIgPDwgIl07Ijw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3V0cHV0LndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3V0cHV0LndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm91dHB1dC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkKTsKLQotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X2pzX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgYm9vbCBvYmopIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICJ0aGlzLiIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYoIW9iail7Ci0gICAgICByZXN1bHQgPSAidmFyICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSlMgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKXsKLSAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIGlmIChvYmopIHsKLSAgICAgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICtqc190eXBlX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHR5cGUtPmdldF9uYW1lKCkgKyAiKCkiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfY2FsbGJhY2spIHsKLQotICBzdHJpbmcgc3RyOwotCi0gIHN0ciAgPSBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiID0gZnVuY3Rpb24oIjsKLQotICBzdHIgKz0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksIGluY2x1ZGVfY2FsbGJhY2spOwotCi0gIHN0ciArPSAiKSI7Ci0gIHJldHVybiBzdHI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX2NhbGxiYWNrKSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAoaW5jbHVkZV9jYWxsYmFjaykgewotICAgIGlmICghZmllbGRzLmVtcHR5KCkpIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gImNhbGxiYWNrIjsKLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9qc19nZW5lcmF0b3IgOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUaHJpZnQuVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRocmlmdC5UeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRocmlmdC5UeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRocmlmdC5UeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUaHJpZnQuVHlwZS5MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGpzLCAiSmF2YXNjcmlwdCIsCi0iICAgIGpxdWVyeTogICAgICAgICAgR2VuZXJhdGUgalF1ZXJ5IGNvbXBhdGlibGUgY29kZS5cbiIKLSIgICAgbm9kZTogICAgICAgICAgICBHZW5lcmF0ZSBub2RlLmpzIGNvbXBhdGlibGUgY29kZS5cbiIpCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWRkYjgyLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIE9DYW1sIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9vY2FtbF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfb2NhbWxfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIHBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLW9jYW1sIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLSAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtICAoKTsKLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgKHRfY29uc3QqICAgIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotICBib29sIHN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCh0X2ZpZWxkICp0bWVtYmVyKTsKLSAgYm9vbCBzdHJ1Y3RfbWVtYmVyX29taXRhYmxlKHRfZmllbGQgKnRtZW1iZXIpOwotICBib29sIHN0cnVjdF9tZW1iZXJfZGVmYXVsdF9jaGVhcGx5X2NvbXBhcmFibGUodF9maWVsZCAqdG1lbWJlcik7Ci0gIHN0ZDo6c3RyaW5nIHN0cnVjdF9tZW1iZXJfY29weV9vZih0X3R5cGUgKnR5cGUsIHN0cmluZyB3aGF0KTsKLQotICAvKioKLSAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb249ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9tZW1iZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdHJpbmcgdG5hbWUsIHRfZmllbGQqIHRtZW1iZXIpOwotICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9zaWcoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfbWV0aG9kX2NvcHkoc3RkOjpvZnN0cmVhbSYgb3V0LCBjb25zdCB2ZWN0b3I8dF9maWVsZCAqPiYgbWVtYmVycyk7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfbWVtYmVyX2NvcHkoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkICptZW1iZXIpOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzICAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uICAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0ICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0c2V0KTsKLQotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZSAgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50ICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIG9jYW1sX2F1dG9nZW5fY29tbWVudCgpOwotICBzdGQ6OnN0cmluZyBvY2FtbF9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCBtZXRob2Q9ZmFsc2UsIGJvb2wgb3B0aW9ucyA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX29jYW1sX3R5cGUodF90eXBlKiB0eXBlKTsKLQotCi0gcHJpdmF0ZToKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9jb25zdHNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzX2lfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV9pXzsKLQotfTsKLQotCi0vKgotICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSB3YW50IHR5cGVkZWZzIHRvIGFwcGVhciBsYXRlciwKLSAqIGFmdGVyIGFsbCB0aGUgdHlwZXMgaGF2ZSBiZWVuIGRlY2xhcmVkLgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgewotICAvLyBJbml0aWFsaXplIHRoZSBnZW5lcmF0b3IKLSAgaW5pdF9nZW5lcmF0b3IoKTsKLQotICAvLyBHZW5lcmF0ZSBlbnVtcwotICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBwcm9ncmFtXy0+Z2V0X2VudW1zKCk7Ci0gIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKLSAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfZW51bSgqZW5faXRlcik7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBzdHJ1Y3RzCi0gIHZlY3Rvcjx0X3N0cnVjdCo+IHN0cnVjdHMgPSBwcm9ncmFtXy0+Z2V0X3N0cnVjdHMoKTsKLSAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIHN0X2l0ZXI7Ci0gIGZvciAoc3RfaXRlciA9IHN0cnVjdHMuYmVnaW4oKTsgc3RfaXRlciAhPSBzdHJ1Y3RzLmVuZCgpOyArK3N0X2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9zdHJ1Y3QoKnN0X2l0ZXIpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgeGNlcHRpb25zCi0gIHZlY3Rvcjx0X3N0cnVjdCo+IHhjZXB0aW9ucyA9IHByb2dyYW1fLT5nZXRfeGNlcHRpb25zKCk7Ci0gIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciB4X2l0ZXI7Ci0gIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfeGNlcHRpb24oKnhfaXRlcik7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0eXBlZGVmcwotICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCk7Ci0gIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKLSAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBzZXJ2aWNlcwotICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7Ci0gIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKLSAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7Ci0gICAgc2VydmljZV9uYW1lXyA9IGdldF9zZXJ2aWNlX25hbWUoKnN2X2l0ZXIpOwotICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY29uc3RhbnRzCi0gIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gcHJvZ3JhbV8tPmdldF9jb25zdHMoKTsKLSAgZ2VuZXJhdGVfY29uc3RzKGNvbnN0cyk7Ci0KLSAgLy8gQ2xvc2UgdGhlIGdlbmVyYXRvcgotICBjbG9zZV9nZW5lcmF0b3IoKTsKLX0KLQotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyJfdHlwZXMubWwiOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLSAgc3RyaW5nIGZfdHlwZXNfaV9uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyJfdHlwZXMubWxpIjsKLSAgZl90eXBlc19pXy5vcGVuKGZfdHlwZXNfaV9uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyJfY29uc3RzLm1sIjsKLSAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl90eXBlc18gPDwKLSAgICBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgb2NhbWxfaW1wb3J0cygpIDw8IGVuZGw7Ci0gIGZfdHlwZXNfaV8gPDwKLSAgICBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgb2NhbWxfaW1wb3J0cygpIDw8IGVuZGw7Ci0gIGZfY29uc3RzXyA8PAotICAgIG9jYW1sX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbCA8PAotICAgICJvcGVuICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKTw8Il90eXBlcyI8PCBlbmRsOwotfQotCi0KLS8qKgotICogQXV0b2dlbidkIGNvbW1lbnQKLSAqLwotc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gIHJldHVybgotICAgIHN0ZDo6c3RyaW5nKCIoKlxuIikgKwotICAgICIgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iICsKLSAgICAiXG4iICsKLSAgICAiIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsKLSAgICAiKilcbiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCi0gKi8KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6b2NhbWxfaW1wb3J0cygpIHsKLSAgcmV0dXJuICJvcGVuIFRocmlmdCI7Ci19Ci0KLS8qKgotICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZQotICBmX3R5cGVzXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIEV6LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICBmX3R5cGVzXyA8PAotICAgIGluZGVudCgpIDw8ICJ0eXBlICI8PCBkZWNhcGl0YWxpemUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKSA8PCAiID0gIiA8PCByZW5kZXJfb2NhbWxfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgZW5kbCA8PCBlbmRsOwotICBmX3R5cGVzX2lfIDw8Ci0gICAgaW5kZW50KCkgPDwgInR5cGUgIjw8IGRlY2FwaXRhbGl6ZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpIDw8ICIgPSAiIDw8IHJlbmRlcl9vY2FtbF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4KLSAqIHRoZSB2YWx1ZXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIiA9ICIgPDwgZW5kbCA8PCAic3RydWN0IiA8PCBlbmRsOwotICBpbmRlbnQoZl90eXBlc19pXykgPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIgOiAiIDw8IGVuZGwgPDwgInNpZyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3R5cGVzXykgPDwgInR5cGUgdCA9ICIgPDwgZW5kbDsKLSAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJ0eXBlIHQgPSAiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgaW5kZW50KGZfdHlwZXNfKSA8PCAifCAiIDw8IG5hbWUgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl90eXBlc19pXykgPDwgInwgIiA8PCBuYW1lIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQoZl90eXBlc18pIDw8ICJsZXQgdG9faSA9IGZ1bmN0aW9uIiA8PCBlbmRsOwotICBpbmRlbnQoZl90eXBlc19pXykgPDwgInZhbCB0b19pIDogdCAtPiBJbnQzMi50IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgIGluZGVudChmX3R5cGVzXykgPDwgInwgIiA8PCBuYW1lIDw8ICIgLT4gIiA8PCB2YWx1ZSA8PCAibCIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChmX3R5cGVzXykgPDwgImxldCBvZl9pID0gZnVuY3Rpb24iIDw8IGVuZGw7Ci0gIGluZGVudChmX3R5cGVzX2lfKSA8PCAidmFsIG9mX2kgOiBJbnQzMi50IC0+IHQiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICBpbmRlbnQoZl90eXBlc18pIDw8ICJ8ICIgPDwgdmFsdWUgPDwgImwgLT4gIiA8PCBuYW1lIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAifCBfIC0+IHJhaXNlIFRocmlmdF9lcnJvciIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAiZW5kIiA8PCBlbmRsOwotICBpbmRlbnQoZl90eXBlc19pXykgPDwgImVuZCIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gZGVjYXBpdGFsaXplKHRjb25zdC0+Z2V0X25hbWUoKSk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBpbmRlbnQoZl9jb25zdHNfKSA8PCAibGV0ICIgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICAvLyBPQ2FtbCByZXF1aXJlcyBhbGwgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBjb250YWluIGEgZGVjaW1hbCBwb2ludAotICBvdXQuc2V0Zihpb3M6OnNob3dwb2ludCk7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJsIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIuMCI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgdF9lbnVtKiB0ZW51bSA9ICh0X2VudW0qKXR5cGU7Ci0gICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gICAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgIGludCB2YWwgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgICAgaWYgKHZhbCA9PSB2YWx1ZS0+Z2V0X2ludGVnZXIoKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiLiIgPDwgY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHN0cmluZyBjbmFtZSA9IHR5cGVfbmFtZSh0eXBlKTsKLSAgICBzdHJpbmcgY3QgPSB0bXAoIl9jIik7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIihsZXQgIiA8PCBjdCA8PCAiID0gbmV3ICIgPDwgY25hbWUgPDwgIiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgc3RyaW5nIGZuYW1lID0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8IGN0IDw8IiNzZXRfIiA8PCBmbmFtZSA8PCAiICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgY3QgPDwgIikiOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIHN0cmluZyBobSA9IHRtcCgiX2htIik7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIihsZXQgIiA8PCBobSA8PCAiID0gSGFzaHRibC5jcmVhdGUgIiA8PCB2YWwuc2l6ZSgpIDw8ICIgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuYWRkICIgPDwgaG0gPDwgIiAiIDw8IGtleSA8PCAiICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCBobSA8PCAiKSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBvdXQgPDwgIlsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiXSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgc3RyaW5nIGhtID0gdG1wKCJfaG0iKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAiIDw8IGhtIDw8ICIgPSBIYXNodGJsLmNyZWF0ZSAiIDw8IHZhbC5zaXplKCkgPDwgIiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5hZGQgIiA8PCBobSA8PCAiICIgPDwgdmFsIDw8ICIgdHJ1ZTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8IGhtIDw8ICIpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSAic3RydWN0IgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0LCBidXQgYWxzbyBoYXMgYW4gZXhjZXB0aW9uIGRlY2xhcmF0aW9uLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIE9DYW1sIHN0cnVjdAotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9zaWcoZl90eXBlc19pXyx0c3RydWN0LGlzX2V4Y2VwdGlvbik7Ci19Ci0KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX21ldGhvZF9jb3B5KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCAqPiYgbWVtYmVycykgewotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICAgIC8qIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgb2JqZWN0ICovCi0gICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBjb3B5ID0iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7IGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJsZXQgX25ldyA9IE9vLmNvcHkgc2VsZiBpbiIgPDwgZW5kbDsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQotICAgICAgICBnZW5lcmF0ZV9vY2FtbF9tZW1iZXJfY29weShvdXQsICptX2l0ZXIpOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiX25ldyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotfQotCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnN0cnVjdF9tZW1iZXJfY29weV9vZih0X3R5cGUgKnR5cGUsIHN0cmluZyB3aGF0KSB7Ci0gICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgICAgcmV0dXJuIHdoYXQgKyBzdHJpbmcgKCIjY29weSIpOwotICAgIH0gaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICAgIHN0cmluZyBjb3B5X29mX2sgPSBzdHJ1Y3RfbWVtYmVyX2NvcHlfb2YoKCh0X21hcCAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgImsiKTsKLSAgICAgICAgc3RyaW5nIGNvcHlfb2ZfdiA9IHN0cnVjdF9tZW1iZXJfY29weV9vZigoKHRfbWFwICopdHlwZSktPmdldF92YWxfdHlwZSgpLCAidiIpOwotCi0gICAgICAgIGlmKGNvcHlfb2ZfayA9PSAiayIgJiYgY29weV9vZl92ID09ICJ2IikgewotICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcgKCIoSGFzaHRibC5jb3B5ICIpICsgd2hhdCArIHN0cmluZygiKSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcgKCIoKGZ1biBvaCAtPiBsZXQgbmggPSBIYXNodGJsLmNyZWF0ZSAoSGFzaHRibC5sZW5ndGggb2gpIGluIEhhc2h0YmwuaXRlciAoZnVuIGsgdiAtPiBIYXNodGJsLmFkZCBuaCAiKQotICAgICAgICAgICAgICAgICAgICArIGNvcHlfb2ZfayArIHN0cmluZygiICIpICsgY29weV9vZl92Ci0gICAgICAgICAgICAgICAgICAgICsgc3RyaW5nKCIpIG9oOyBuaCkgIikKLSAgICAgICAgICAgICAgICAgICAgKyB3aGF0ICsgIikiOwotICAgICAgICB9Ci0gICAgfSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgc3RyaW5nIGNvcHlfb2YgPSBzdHJ1Y3RfbWVtYmVyX2NvcHlfb2YoKCh0X3NldCAqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCksICJrIik7Ci0KLSAgICAgICAgaWYoY29weV9vZiA9PSAiayIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nICgiKEhhc2h0YmwuY29weSAiKSArIHdoYXQgKyBzdHJpbmcoIikiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nICgiKChmdW4gb2ggLT4gbGV0IG5oID0gSGFzaHRibC5jcmVhdGUgKEhhc2h0YmwubGVuZ3RoIG9oKSBpbiBIYXNodGJsLml0ZXIgKGZ1biBrIHYgLT4gSGFzaHRibC5hZGQgbmggIikKLSAgICAgICAgICAgICAgICAgICAgKyBjb3B5X29mICsgc3RyaW5nKCIgdHJ1ZSIpCi0gICAgICAgICAgICAgICAgICAgICsgc3RyaW5nKCIpIG9oOyBuaCkgIikKLSAgICAgICAgICAgICAgICAgICAgKyB3aGF0ICsgIikiOwotICAgICAgICB9Ci0gICAgfSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIHN0cmluZyBjb3B5X29mID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9saXN0ICopdHlwZSktPmdldF9lbGVtX3R5cGUoKSwgIngiKTsKLSAgICAgICAgaWYoY29weV9vZiAhPSAieCIpIHsKLSAgICAgICAgICAgIHJldHVybiBzdHJpbmcoIihMaXN0Lm1hcCAoZnVuIHggLT4gIikKLSAgICAgICAgICAgICAgICArIGNvcHlfb2YgKyBzdHJpbmcgKCIpICIpCi0gICAgICAgICAgICAgICAgKyB3aGF0ICsgc3RyaW5nKCIpIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gd2hhdDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gd2hhdDsKLX0KLQotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfbWVtYmVyX2NvcHkob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQgKnRtZW1iZXIpIHsKLSAgICBzdHJpbmcgbW5hbWUgPSBkZWNhcGl0YWxpemUodG1lbWJlci0+Z2V0X25hbWUoKSk7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0bWVtYmVyLT5nZXRfdHlwZSgpKTsKLQotICAgIHN0cmluZyBncmFiX2ZpZWxkID0gc3RyaW5nKCJzZWxmI2dyYWJfIikgKyBtbmFtZTsKLSAgICBzdHJpbmcgY29weV9vZiA9IHN0cnVjdF9tZW1iZXJfY29weV9vZih0eXBlLCBncmFiX2ZpZWxkKTsKLSAgICBpZihjb3B5X29mICE9IGdyYWJfZmllbGQpIHsKLSAgICAgICAgaW5kZW50KG91dCk7Ci0gICAgICAgIGlmKCFzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpIHsKLSAgICAgICAgICAgICAgICBvdXQgPDwgImlmIF8iIDw8IG1uYW1lIDw8ICIgPD4gTm9uZSB0aGVuIiA8PCBlbmRsOwotICAgICAgICAgICAgICAgIGluZGVudChvdXQpIDw8ICIgICI7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8ICJfbmV3I3NldF8iIDw8IG1uYW1lIDw8ICIgIiA8PCBjb3B5X29mIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBzdHJpbmcgdG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIGluZGVudChvdXQpIDw8ICJjbGFzcyAiIDw8IHRuYW1lIDw8ICIgPSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIm9iamVjdCAoc2VsZikiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9tZW1iZXIob3V0LCB0bmFtZSwgKCptX2l0ZXIpKTsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLSAgfQotICBnZW5lcmF0ZV9vY2FtbF9tZXRob2RfY29weShvdXQsIG1lbWJlcnMpOwotICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Ci0KLSAgaWYoaXNfZXhjZXB0aW9uKXsKLSAgICBpbmRlbnQob3V0KSA8PCAiZXhjZXB0aW9uICIgPDwgY2FwaXRhbGl6ZSh0bmFtZSkgPDwiIG9mICIgPDwgdG5hbWUgPDwgZW5kbDsKLSAgfQotCi0gIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3R1cmUgbWVtYmVyIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCi0gKgotICogQHBhcmFtIHRuYW1lIE5hbWUgb2YgdGhlIHBhcmVudCBzdHJ1Y3R1cmUgZm9yIHRoZSBtZW1iZXIKLSAqIEBwYXJhbSB0bWVtYmVyIE1lbWJlciBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9tZW1iZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0bWVtYmVyKSB7Ci0gIHN0cmluZyB4ID0gdG1wKCJfeCIpOwotICBzdHJpbmcgbW5hbWUgPSBkZWNhcGl0YWxpemUodG1lbWJlci0+Z2V0X25hbWUoKSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInZhbCBtdXRhYmxlIF8iIDw8IG1uYW1lIDw8ICIgOiAiIDw8IHJlbmRlcl9vY2FtbF90eXBlKHRtZW1iZXItPmdldF90eXBlKCkpOwotICB0X2NvbnN0X3ZhbHVlICp2YWwgPSB0bWVtYmVyLT5nZXRfdmFsdWUoKTsKLSAgaWYodmFsKSB7Ci0gICAgaWYoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKQotICAgICAgICBvdXQgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHRtZW1iZXItPmdldF90eXBlKCksIHRtZW1iZXItPmdldF92YWx1ZSgpKSA8PCBlbmRsOwotICAgIGVsc2UKLSAgICAgICAgb3V0IDw8ICIgb3B0aW9uID0gU29tZSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICAvLyBhc3NlcnQoIXN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCh0bWVtYmVyKSkKLSAgICBvdXQgPDwgIiBvcHRpb24gPSBOb25lIiA8PCBlbmRsOwotICB9Ci0KLSAgaWYoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ2V0XyIgPDwgbW5hbWUgPDwgIiA9IFNvbWUgXyIgPDwgbW5hbWUgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBncmFiXyIgPDwgbW5hbWUgPDwgIiA9IF8iIDw8IG1uYW1lIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgc2V0XyIgPDwgbW5hbWUgPDwgIiAiIDw8IHggPDwgIiA9IF8iIDw8IG1uYW1lIDw8ICIgPC0gIiA8PCB4IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ2V0XyIgPDwgbW5hbWUgPDwgIiA9IF8iIDw8IG1uYW1lIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ3JhYl8iIDw8IG1uYW1lIDw8ICIgPSBtYXRjaCBfIjw8bW5hbWU8PCIgd2l0aCBOb25lLT5yYWlzZSAoRmllbGRfZW1wdHkgXCIiPDx0bmFtZTw8Ii4iPDxtbmFtZTw8IlwiKSB8IFNvbWUgIiA8PCB4IDw8IiAtPiAiIDw8IHggPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBzZXRfIiA8PCBtbmFtZSA8PCAiICIgPDwgeCA8PCAiID0gXyIgPDwgbW5hbWUgPDwgIiA8LSBTb21lICIgPDwgeCA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHVuc2V0XyIgPDwgbW5hbWUgPDwgIiA9IF8iIDw8IG1uYW1lIDw8ICIgPC0gTm9uZSIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJtZXRob2QgcmVzZXRfIiA8PCBtbmFtZSA8PCAiID0gXyIgPDwgbW5hbWUgPDwgIiA8LSAiOwotICBpZih2YWwpIHsKLSAgICBpZihzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpCi0gICAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgICBvdXQgPDwgIlNvbWUgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICJOb25lIiA8PCBlbmRsOwotICB9Ci0KLQotfQotCi0vKioKLSAqIENoZWNrIHdoZXRoZXIgYSBtZW1iZXIgb2YgdGhlIHN0cnVjdHVyZSBjYW4gbm90IGhhdmUgdW5kZWZpbmVkIHZhbHVlCi0gKgotICogQHBhcmFtIHRtZW1iZXIgTWVtYmVyIGRlZmluaXRpb24KLSAqLwotYm9vbCB0X29jYW1sX2dlbmVyYXRvcjo6c3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRfZmllbGQgKnRtZW1iZXIpIHsKLSAgdF9jb25zdF92YWx1ZSAqdmFsID0gdG1lbWJlci0+Z2V0X3ZhbHVlKCk7Ci0gIHJldHVybiAodmFsID8gdHJ1ZSA6IGZhbHNlKTsKLX0KLQotLyoqCi0gKiBDaGVjayB3aGV0aGVyIGEgbWVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUgY2FuIGJlIHNraXBwZWQgZHVyaW5nIGVuY29kaW5nCi0gKgotICogQHBhcmFtIHRtZW1iZXIgTWVtYmVyIGRlZmluaXRpb24KLSAqLwotYm9vbCB0X29jYW1sX2dlbmVyYXRvcjo6c3RydWN0X21lbWJlcl9vbWl0YWJsZSh0X2ZpZWxkICp0bWVtYmVyKSB7Ci0gIHJldHVybiAodG1lbWJlci0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpOwotfQotCi0vKioKLSAqIEZpZ3VyZSBvdXQgd2hldGhlciBhIG1lbWJlciBvZiB0aGUgc3RydWN0dXJlIGhhcwotICogYSBjaGVhcGx5IGNvbXBhcmFibGUgZGVmYXVsdCB2YWx1ZS4KLSAqCi0gKiBAcGFyYW0gdG1lbWJlciBNZW1iZXIgZGVmaW5pdGlvbgotICovCi1ib29sIHRfb2NhbWxfZ2VuZXJhdG9yOjpzdHJ1Y3RfbWVtYmVyX2RlZmF1bHRfY2hlYXBseV9jb21wYXJhYmxlKHRfZmllbGQgKnRtZW1iZXIpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0bWVtYmVyLT5nZXRfdHlwZSgpKTsKLSAgdF9jb25zdF92YWx1ZSAqdmFsID0gdG1lbWJlci0+Z2V0X3ZhbHVlKCk7Ci0gIGlmKCF2YWwpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSBpZih0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIC8vIEJhc2UgdHlwZXMgYXJlIGdlbmVyYWxseSBjaGVhcGx5IGNvbXBhcmVkIGZvciBzdHJ1Y3R1cmFsIGVxdWl2YWxlbmNlLgotICAgIHN3aXRjaCgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBpZih2YWwtPmdldF9kb3VibGUoKSA9PSAwLjApCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9IGVsc2UgaWYodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgLy8gRW1wdHkgbGlzdHMgYXJlIGNoZWFwbHkgY29tcGFyZWQgZm9yIHN0cnVjdHVyYWwgZXF1aXZhbGVuY2UuCi0gICAgLy8gSXMgZW1wdHkgbGlzdD8KLSAgICBpZih2YWwtPmdldF9saXN0KCkuc2l6ZSgpID09IDApCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9zaWcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgdG5hbWUgPDwgIiA6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAib2JqZWN0ICgnYSkiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIHggPSB0bXAoIl94Iik7Ci0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBzdHJpbmcgbW5hbWUgPSBkZWNhcGl0YWxpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICAgIHN0cmluZyB0eXBlID0gcmVuZGVyX29jYW1sX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ2V0XyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgdHlwZSA8PCAiIG9wdGlvbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ3JhYl8iIDw8IG1uYW1lIDw8ICIgOiAiIDw8IHR5cGUgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgc2V0XyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgdHlwZSA8PCAiIC0+IHVuaXQiIDw8IGVuZGw7Ci0gICAgICBpZighc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KCptX2l0ZXIpKQotICAgICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHVuc2V0XyIgPDwgbW5hbWUgPDwgIiA6IHVuaXQiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHJlc2V0XyIgPDwgbW5hbWUgPDwgIiA6IHVuaXQiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGluZGVudChvdXQpIDw8ICJtZXRob2QgY29weSA6ICdhIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHdyaXRlIDogUHJvdG9jb2wudCAtPiB1bml0IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gIGlmKGlzX2V4Y2VwdGlvbil7Ci0gICAgaW5kZW50KG91dCkgPDwgImV4Y2VwdGlvbiAiIDw8IGNhcGl0YWxpemUodG5hbWUpIDw8IiBvZiAiIDw8IHRuYW1lIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAidmFsIHJlYWRfIiA8PCB0bmFtZSA8PCAiIDogUHJvdG9jb2wudCAtPiAiIDw8IHRuYW1lIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIHN0cmluZyBzbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgc3RyaW5nIHN0ciA9IHRtcCgiX3N0ciIpOwotICBzdHJpbmcgdCA9IHRtcCgiX3QiKTsKLSAgc3RyaW5nIGlkID0gdG1wKCJfaWQiKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAibGV0IHJlYyByZWFkXyIgPDwgc25hbWUgPDwgIiAoaXByb3QgOiBQcm90b2NvbC50KSA9IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImxldCAiIDw8IHN0ciA8PCAiID0gbmV3ICIgPDwgc25hbWUgPDwgIiBpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgImlnbm9yZShpcHJvdCNyZWFkU3RydWN0QmVnaW4pOyIgPDwgZW5kbDsKLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiKHRyeSB3aGlsZSB0cnVlIGRvIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImxldCAoXywiIDw8IHQgPDwiLCI8PGlkPDwiKSA9IGlwcm90I3JlYWRGaWVsZEJlZ2luIGluIiA8PCBlbmRsOwotCi0gIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiaWYgIiA8PCB0IDw8IiA9IFByb3RvY29sLlRfU1RPUCB0aGVuIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAgICJyYWlzZSBCcmVhayIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJlbHNlICgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICIobWF0Y2ggIiA8PCBpZDw8IiB3aXRoICIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaW5kZW50KG91dCkgPDwgInwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiIC0+ICgiOwotICAgICAgb3V0IDw8ICJpZiAiIDw8IHQgPDwiID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIHRoZW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLHN0cik7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90I3NraXAgIjw8IHQgPDwgIikiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLQotICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ8IF8gLT4gIiA8PCAiaXByb3Qjc2tpcCAiPDx0PDwiKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QjcmVhZEZpZWxkRW5kOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJkb25lOyAoKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ3aXRoIEJyZWFrIC0+ICgpKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlwcm90I3JlYWRTdHJ1Y3RFbmQ7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgc3RyIDw8IGVuZGwgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBzdHJpbmcgc3RyID0gdG1wKCJfc3RyIik7Ci0gIHN0cmluZyBmID0gdG1wKCJfZiIpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIm1ldGhvZCB3cml0ZSAob3Byb3QgOiBQcm90b2NvbC50KSA9IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAib3Byb3Qjd3JpdGVTdHJ1Y3RCZWdpbiBcIiI8PG5hbWU8PCJcIjsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkICp0bWVtYmVyID0gKCpmX2l0ZXIpOwotICAgIHN0cmluZyBtbmFtZSA9ICJfIitkZWNhcGl0YWxpemUodG1lbWJlci0+Z2V0X25hbWUoKSk7Ci0gICAgc3RyaW5nIF92OwotCi0gICAgaWYoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKSB7Ci0KLSAgICAgIGlmKHN0cnVjdF9tZW1iZXJfb21pdGFibGUodG1lbWJlcikKLSAgICAgICAgJiYgc3RydWN0X21lbWJlcl9kZWZhdWx0X2NoZWFwbHlfY29tcGFyYWJsZSh0bWVtYmVyKSkgewotICAgICAgICBfdiA9ICJfdiI7Ci0gICAgICAgIC8vIEF2b2lkIHJlZHVuZGFudCBlbmNvZGluZyBvZiBtZW1iZXJzIGhhdmluZyBkZWZhdWx0IHZhbHVlcy4KLSAgICAgICAgaW5kZW50KG91dCkgPDwgIihtYXRjaCAiIDw8IG1uYW1lIDw8ICIgd2l0aCAiCi0gICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpCi0gICAgICAgICAgICA8PCAiIC0+ICgpIHwgIiA8PCBfdiA8PCAiIC0+ICIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIF92ID0gbW5hbWU7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIoIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgfSBlbHNlIHsKLQotICAgICAgaW5kZW50KG91dCkgPDwgIihtYXRjaCAiIDw8IG1uYW1lIDw8ICIgd2l0aCAiOwotCi0gICAgICBpZihzdHJ1Y3RfbWVtYmVyX29taXRhYmxlKHRtZW1iZXIpKSB7Ci0gICAgICAgIG91dCA8PCAiTm9uZSAtPiAoKSI7Ci0KLSAgICAgICAgaWYoc3RydWN0X21lbWJlcl9kZWZhdWx0X2NoZWFwbHlfY29tcGFyYWJsZSh0bWVtYmVyKSkgewotICAgICAgICAgIC8vIEF2b2lkIHJlZHVuZGFudCBlbmNvZGluZyBvZiBtZW1iZXJzIGhhdmluZyBkZWZhdWx0IHZhbHVlcy4KLSAgICAgICAgICBvdXQgPDwgIiB8IFNvbWUgIgotICAgICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpCi0gICAgICAgICAgICAgIDw8ICIgLT4gKCkiOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCAiIHwgU29tZSBfdiAtPiAiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInwgTm9uZSAtPiByYWlzZSAoRmllbGRfZW1wdHkgXCIiCi0gICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLiIgPDwgbW5hbWUgPDwgIlwiKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInwgU29tZSBfdiAtPiAiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIF92ID0gIl92IjsKLSAgICB9Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlRmllbGRCZWdpbihcIiI8PCB0bWVtYmVyLT5nZXRfbmFtZSgpPDwiXCIsIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSh0bWVtYmVyLT5nZXRfdHlwZSgpKSA8PCAiLCIKLSAgICAgICAgICAgICAgICA8PCB0bWVtYmVyLT5nZXRfa2V5KCk8PCIpOyIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgdG1lbWJlciwgX3YpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlRmllbGRFbmQiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZUZpZWxkU3RvcDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVTdHJ1Y3RFbmQiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKStjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pKyIubWwiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0gIHN0cmluZyBmX3NlcnZpY2VfaV9uYW1lID0gZ2V0X291dF9kaXIoKStjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pKyIubWxpIjsKLSAgZl9zZXJ2aWNlX2lfLm9wZW4oZl9zZXJ2aWNlX2lfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgIG9jYW1sX2ltcG9ydHMoKSA8PCBlbmRsOwotICBmX3NlcnZpY2VfaV8gPDwKLSAgICBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgb2NhbWxfaW1wb3J0cygpIDw8IGVuZGw7Ci0KLSAgLyogaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAib3BlbiAiIDw8IGNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlX2lfIDw8Ci0gICAgICAib3BlbiAiIDw8IGNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8IGVuZGw7Ci0gIH0KLSAgKi8KLSAgZl9zZXJ2aWNlXyA8PAotICAgICAib3BlbiAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl9zZXJ2aWNlX2lfIDw8Ci0gICAgICJvcGVuICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZQotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotCi0KLSAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLSAgZl9zZXJ2aWNlX2lfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgIigqIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMgKikiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX29jYW1sX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLSAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJjbGFzcyB2aXJ0dWFsIGlmYWNlID0iIDw8IGVuZGwgPDwgIm9iamVjdCAoc2VsZikiIDw8IGVuZGw7Ci0gIGZfc2VydmljZV9pXyA8PAotICAgIGluZGVudCgpIDw8ICJjbGFzcyB2aXJ0dWFsIGlmYWNlIDoiIDw8IGVuZGwgPDwgIm9iamVjdCIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIHN0cmluZyBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuaWZhY2UiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuaWZhY2UiIDw8IGVuZGw7Ci0gIH0KLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnQgPSBmdW5jdGlvbl90eXBlKCpmX2l0ZXIsdHJ1ZSx0cnVlKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibWV0aG9kIHZpcnR1YWwgIiA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDogIiA8PCBmdCAgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfaV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJtZXRob2QgdmlydHVhbCAiIDw8IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOiAiIDw8IGZ0IDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uIE5vdGUgdGhhdCBpbiBPQ2FtbCwgdGhlIGNsaWVudCBkb2Vzbid0IGltcGxlbWVudCBpZmFjZS4gVGhpcyBpcyBiZWNhdXNlCi0gKiBUaGUgY2xpZW50IGRvZXMgbm90IChhbmQgc2hvdWxkIG5vdCBoYXZlIHRvKSBkZWFsIHdpdGggYXJndW1lbnRzIGJlaW5nIE5vbmUuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAiY2xhc3MgY2xpZW50IChpcHJvdCA6IFByb3RvY29sLnQpIChvcHJvdCA6IFByb3RvY29sLnQpID0iIDw8IGVuZGwgPDwgIm9iamVjdCAoc2VsZikiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfaV8pIDw8Ci0gICAgImNsYXNzIGNsaWVudCA6IFByb3RvY29sLnQgLT4gUHJvdG9jb2wudCAtPiAiIDw8IGVuZGwgPDwgIm9iamVjdCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5oZXJpdCAiIDw8IGV4dGVuZHMgPDwgIi5jbGllbnQgaXByb3Qgb3Byb3QgYXMgc3VwZXIiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuY2xpZW50IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFsIG11dGFibGUgc2VxaWQgPSAwIiA8PCBlbmRsOwotCi0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJtZXRob2QgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIiA9ICIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PAotICAgICAgIm1ldGhvZCAiIDw8IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOiAiIDw8IGZ1bmN0aW9uX3R5cGUoKmZfaXRlcix0cnVlLGZhbHNlKSA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInNlbGYjc2VuZF8iIDw8IGZ1bm5hbWU7Ci0KLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIgIiA8PCBkZWNhcGl0YWxpemUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICI7IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAic2VsZiNyZWN2XyIgPDwgZnVubmFtZSA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAibWV0aG9kIHByaXZhdGUgc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiID0gIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlTWVzc2FnZUJlZ2luIChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgUHJvdG9jb2wuQ0FMTCwgc2VxaWQpOyIgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJsZXQgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncyNzZXRfIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzI3dyaXRlIG9wcm90OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlTWVzc2FnZUVuZDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdCNnZXRUcmFuc3BvcnQjZmx1c2giIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0KLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAibWV0aG9kIHByaXZhdGUgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8ICIgPSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAvLyBUT0RPKG1jc2xlZSk6IFZhbGlkYXRlIG1lc3NhZ2UgcmVwbHkgaGVyZSwgc2VxIGlkcyBldGMuCi0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImxldCAoZm5hbWUsIG10eXBlLCByc2VxaWQpID0gaXByb3QjcmVhZE1lc3NhZ2VCZWdpbiBpbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiKGlmIG10eXBlID0gUHJvdG9jb2wuRVhDRVBUSU9OIHRoZW4iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgbGV0IHggPSBBcHBsaWNhdGlvbl9FeG4ucmVhZCBpcHJvdCBpbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAoaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAgcmFpc2UgKEFwcGxpY2F0aW9uX0V4bi5FIHgpKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbHNlICgpKTsiIDw8IGVuZGw7Ci0gICAgICBzdHJpbmcgcmVzID0gIl8iOwotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgfHwgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICAgICAgcmVzID0gInJlc3VsdCI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJsZXQgIjw8cmVzPDwiID0gcmVhZF8iIDw8IHJlc3VsdG5hbWUgPDwgIiBpcHJvdCBpbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJtYXRjaCByZXN1bHQjZ2V0X3N1Y2Nlc3Mgd2l0aCBTb21lIHYgLT4gdiB8IE5vbmUgLT4gKCIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICB9Ci0KLQotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIobWF0Y2ggcmVzdWx0I2dldF8iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIHdpdGggTm9uZSAtPiAoKSB8IFNvbWUgX3YgLT4iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByYWlzZSAoIiA8PCBjYXBpdGFsaXplKHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpKSA8PCAiIF92KSk7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgICAiKCkiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJhaXNlIChBcHBsaWNhdGlvbl9FeG4uRSAoQXBwbGljYXRpb25fRXhuLmNyZWF0ZSBBcHBsaWNhdGlvbl9FeG4uTUlTU0lOR19SRVNVTFQgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJjbGFzcyBwcm9jZXNzb3IgKGhhbmRsZXIgOiBpZmFjZSkgPSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib2JqZWN0IChzZWxmKSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV9pXykgPDwKLSAgICAiY2xhc3MgcHJvY2Vzc29yIDogaWZhY2UgLT4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9iamVjdCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICBpbmRlbnQoKSA8PCAiaW5oZXJpdCBQcm9jZXNzb3IudCIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGZfc2VydmljZV9pXyA8PAotICAgICBpbmRlbnQoKSA8PCAiaW5oZXJpdCBQcm9jZXNzb3IudCIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaGVyaXQgIiArIGV4dGVuZHMgKyAiLnByb2Nlc3NvciAoaGFuZGxlciA6PiAiICsgZXh0ZW5kcyArICIuaWZhY2UpIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJpbmhlcml0ICIgKyBleHRlbmRzICsgIi5wcm9jZXNzb3IiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YWwgcHJvY2Vzc01hcCA9IEhhc2h0YmwuY3JlYXRlICIgPDwgZnVuY3Rpb25zLnNpemUoKSA8PCBlbmRsOwotICB9Ci0gIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJ2YWwgcHJvY2Vzc01hcCA6IChzdHJpbmcsIGludCAqIFByb3RvY29sLnQgKiBQcm90b2NvbC50IC0+IHVuaXQpIEhhc2h0YmwudCIgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJtZXRob2QgcHJvY2VzcyBpcHJvdCBvcHJvdCA9IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PAotICAgICJtZXRob2QgcHJvY2VzcyA6IFByb3RvY29sLnQgLT4gUHJvdG9jb2wudCAtPiBib29sIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImxldCAobmFtZSwgdHlwLCBzZXFpZCkgID0gaXByb3QjcmVhZE1lc3NhZ2VCZWdpbiBpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZQotCi0gIC8vIEhPVDogZGljdGlvbmFyeSBmdW5jdGlvbiBsb29rdXAKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpZiBIYXNodGJsLm1lbSBwcm9jZXNzTWFwIG5hbWUgdGhlbiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIChIYXNodGJsLmZpbmQgcHJvY2Vzc01hcCBuYW1lKSAoc2VxaWQsIGlwcm90LCBvcHJvdCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZWxzZSAoIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaXByb3Qjc2tpcChQcm90b2NvbC5UX1NUUlVDVCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgbGV0IHggPSBBcHBsaWNhdGlvbl9FeG4uY3JlYXRlIEFwcGxpY2F0aW9uX0V4bi5VTktOT1dOX01FVEhPRCAoXCJVbmtub3duIGZ1bmN0aW9uIFwiXm5hbWUpIGluIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICBvcHJvdCN3cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBQcm90b2NvbC5FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAgIHgjd3JpdGUgb3Byb3Q7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICBvcHJvdCN3cml0ZU1lc3NhZ2VFbmQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICBvcHJvdCNnZXRUcmFuc3BvcnQjZmx1c2giIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgLy8gUmVhZCBlbmQgb2YgYXJncyBmaWVsZCwgdGhlIFRfU1RPUCwgYW5kIHRoZSBzdHJ1Y3QgY2xvc2UKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ0cnVlIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5pdGlhbGl6ZXIiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJIYXNodGJsLmFkZCBwcm9jZXNzTWFwIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHNlbGYjcHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAodm9pZCkgdHNlcnZpY2U7Ci0gIC8vIE9wZW4gZnVuY3Rpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgIm1ldGhvZCBwcml2YXRlIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAiIChzZXFpZCwgaXByb3QsIG9wcm90KSA9IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBhcmdzID0gImFyZ3MiOwotICBpZihmaWVsZHMuc2l6ZSgpID09IDApewotICAgIGFyZ3M9Il8iOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJsZXQgIjw8YXJnczw8IiA9IHJlYWRfIiA8PCBhcmdzbmFtZSA8PCAiIGlwcm90IGluIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdCNyZWFkTWVzc2FnZUVuZDsiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibGV0IHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIih0cnkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotCi0KLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0I3NldF9zdWNjZXNzICI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICIoaGFuZGxlciMiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICAiIGFyZ3MjZ2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0KLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIndpdGgiIDw8ZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifCAiIDw8IGNhcGl0YWxpemUodHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkpIDw8ICIgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAtPiAiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaWYoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpewotICAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdCNzZXRfIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKSI7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotCi0KLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIoKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZU1lc3NhZ2VCZWdpbiAoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFByb3RvY29sLlJFUExZLCBzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJlc3VsdCN3cml0ZSBvcHJvdDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVNZXNzYWdlRW5kOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCNnZXRUcmFuc3BvcnQjZmx1c2giIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpewotICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0KLQotICBzdHJpbmcgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpOwotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiNzZXRfIjw8bmFtZSA8PCAiICI7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LHR5cGUpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEUiOwotICB9Ci0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIG91dCA8PCAiaXByb3QjIjsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAicmVhZEJvb2wiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgb3V0IDw8ICJyZWFkQnl0ZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIG91dCA8PCAicmVhZEkxNiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIG91dCA8PCAicmVhZEkzMiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCAicmVhZEk2NCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIG91dCA8PCAicmVhZERvdWJsZSI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBzdHJpbmcgZW5hbWUgPSBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpOwotICAgIG91dCA8PCAiKCIgPDxlbmFtZSA8PCAiLm9mX2kgaXByb3QjcmVhZEkzMikiOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGNhbGxpbmcgcmVhZCgpCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcHJlZml4ID0gIiI7Ci0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgICBwcmVmaXggPSBjYXBpdGFsaXplKHByb2dyYW0tPmdldF9uYW1lKCkpICsgIl90eXBlcy4iOwotICB9Ci0gIHN0cmluZyBuYW1lID0gZGVjYXBpdGFsaXplKHRzdHJ1Y3QtPmdldF9uYW1lKCkpOwotICBvdXQgPDwgIigiIDw8IHByZWZpeCA8PCAicmVhZF8iIDw8IG5hbWUgPDwgIiBpcHJvdCkiOwotCi19Ci0KLS8qKgotICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKLSAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUpIHsKLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7Ci0gIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7Ci0gIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7Ci0gIHN0cmluZyBjb24gPSB0bXAoIl9jb24iKTsKLQotICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOwotICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfYnl0ZSwga3R5cGUpOwotICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfYnl0ZSwgdnR5cGUpOwotICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfYnl0ZSwgZXR5cGUpOwotCi0gIG91dCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIjw8a3R5cGU8PCIsIjw8dnR5cGU8PCIsIjw8c2l6ZTw8IikgPSBpcHJvdCNyZWFkTWFwQmVnaW4gaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImxldCAiPDxjb248PCIgPSBIYXNodGJsLmNyZWF0ZSAiPDxzaXplPDwiIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJmb3IgaSA9IDEgdG8gIjw8c2l6ZTw8IiBkbyIgPDxlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJsZXQgX2sgPSAiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpOwotICAgIG91dCA8PCAiIGluIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJsZXQgX3YgPSAiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOwotICAgIG91dCA8PCAiIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLmFkZCAiPDxjb248PCAiIF9rIF92IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZG9uZTsgaXByb3QjcmVhZE1hcEVuZDsgIjw8Y29uPDwiKSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIjw8ZXR5cGU8PCIsIjw8c2l6ZTw8IikgPSBpcHJvdCNyZWFkU2V0QmVnaW4gaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImxldCAiPDxjb248PCIgPSBIYXNodGJsLmNyZWF0ZSAiPDxzaXplPDwiIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJmb3IgaSA9IDEgdG8gIjw8c2l6ZTw8IiBkbyIgPDxlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLmFkZCAiPDxjb248PCIgIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgb3V0IDw8ICIgdHJ1ZSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJkb25lOyBpcHJvdCNyZWFkU2V0RW5kOyAiPDxjb248PCIpIjsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIjw8ZXR5cGU8PCIsIjw8c2l6ZTw8IikgPSBpcHJvdCNyZWFkTGlzdEJlZ2luIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJsZXQgIjw8Y29uPDwiID0gKEFycmF5LnRvX2xpc3QgKEFycmF5LmluaXQgIjw8c2l6ZTw8IiAoZnVuIF8gLT4gIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgIG91dCA8PCAiKSkpIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdCNyZWFkTGlzdEVuZDsgIjw8Y29uPDwiKSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYobmFtZS5sZW5ndGgoKSA9PSAwKXsKLSAgICBuYW1lID0gZGVjYXBpdGFsaXplKHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdCMiOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93Ci0gICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBvY2FtbCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSk7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKCI8PGVuYW1lPDwiLnRvX2kgIiA8PCBuYW1lIDw8ICIpIjsKLSAgICB9Ci0KLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci0gIG91dCA8PCAiOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiN3cml0ZShvcHJvdCkiOwotfQotCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZU1hcEJlZ2luKCI8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwiOwotICAgIG91dCA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwiOwotICAgIG91dCA8PCAiSGFzaHRibC5sZW5ndGggIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qjd3JpdGVTZXRCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwiOwotICAgIG91dCA8PCAiSGFzaHRibC5sZW5ndGggIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90I3dyaXRlTGlzdEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwiOwotICAgIG91dCA8PCAiTGlzdC5sZW5ndGggIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBraXRlciA9IHRtcCgiX2tpdGVyIik7Ci0gICAgc3RyaW5nIHZpdGVyID0gdG1wKCJfdml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5pdGVyIChmdW4gIjw8a2l0ZXI8PCIgLT4gZnVuICIgPDwgdml0ZXIgPDwgIiAtPiAiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpICIgPDwgcHJlZml4IDw8ICI7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLml0ZXIgKGZ1biAiPDxpdGVyPDwiIC0+IGZ1biBfIC0+ICI7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSAiIDw8IHByZWZpeCA8PCAiOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgIkxpc3QuaXRlciAoZnVuICI8PGl0ZXI8PCIgLT4gIjsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIikgIiA8PCBwcmVmaXggPDwgIjsiIDw8ICBlbmRsOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qjd3JpdGVNYXBFbmQiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qjd3JpdGVTZXRFbmQiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90I3dyaXRlTGlzdEVuZCI7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkKTsKLQotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOwotfQotCi0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICduYW1lIGFyZ3MnCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHJldHVybgotICAgIHByZWZpeCArIGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsKLSAgICAiICIgKyAgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOwotfQotCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgbWV0aG9kLCBib29sIG9wdGlvbnMpewotICBzdHJpbmcgcmVzdWx0PSIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0ICs9IHJlbmRlcl9vY2FtbF90eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYob3B0aW9ucykKLSAgICAgIHJlc3VsdCArPSAiIG9wdGlvbiI7Ci0gICAgcmVzdWx0ICs9ICIgLT4gIjsKLSAgfQotICBpZihmaWVsZHMuZW1wdHkoKSAmJiAhbWV0aG9kKXsKLSAgICByZXN1bHQgKz0gInVuaXQgLT4gIjsKLSAgfQotICByZXN1bHQgKz0gcmVuZGVyX29jYW1sX3R5cGUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKi8KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgewotICBzdHJpbmcgcHJlZml4ID0gIiI7Ci0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBpZiAoIXR0eXBlLT5pc19zZXJ2aWNlKCkpIHsKLSAgICAgIHByZWZpeCA9IGNhcGl0YWxpemUocHJvZ3JhbS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzLiI7Ci0gICAgfQotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgaWYodHR5cGUtPmlzX3NlcnZpY2UoKSl7Ci0gICAgbmFtZSA9IGNhcGl0YWxpemUobmFtZSk7Ci0gIH0gZWxzZSB7Ci0gICAgbmFtZSA9IGRlY2FwaXRhbGl6ZShuYW1lKTsKLSAgfQotICByZXR1cm4gcHJlZml4ICsgbmFtZTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIFByb3RvY29sLnRfdHlwZSBlbnVtCi0gKi8KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9WT0lEIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlByb3RvY29sLlRfQllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlByb3RvY29sLlRfSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0k2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlByb3RvY29sLlRfRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJQcm90b2NvbC5UX0kzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiUHJvdG9jb2wuVF9TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJQcm90b2NvbC5UX01BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlByb3RvY29sLlRfU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlByb3RvY29sLlRfTElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYW4gb2NhbWwgdHlwZQotICovCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnJlbmRlcl9vY2FtbF90eXBlKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHJldHVybiAidW5pdCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gInN0cmluZyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJib29sIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gImludCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gImludCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIkludDMyLnQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJJbnQ2NC50IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiZmxvYXQiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gY2FwaXRhbGl6ZSgoKHRfZW51bSopdHlwZSktPmdldF9uYW1lKCkpKyIudCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiB0eXBlX25hbWUoKHRfc3RydWN0Kil0eXBlKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICByZXR1cm4gIigiK3JlbmRlcl9vY2FtbF90eXBlKGt0eXBlKSsiLCIrcmVuZGVyX29jYW1sX3R5cGUodnR5cGUpKyIpIEhhc2h0YmwudCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICByZXR1cm4gIigiK3JlbmRlcl9vY2FtbF90eXBlKGV0eXBlKSsiLGJvb2wpIEhhc2h0YmwudCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIHJldHVybiByZW5kZXJfb2NhbWxfdHlwZShldHlwZSkrIiBsaXN0IjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKG9jYW1sLCAiT0NhbWwiLCAiIikKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MzBhZjEuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX09PUF9HRU5FUkFUT1JfSAotI2RlZmluZSBUX09PUF9HRU5FUkFUT1JfSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSAiZ2xvYmFscy5oIgotI2luY2x1ZGUgInRfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0vKioKLSAqIENsYXNzIHdpdGggdXRpbGl0eSBtZXRob2RzIHNoYXJlZCBhY3Jvc3MgY29tbW9uIG9iamVjdCBvcmllbnRlZCBsYW5ndWFnZXMuCi0gKiBTcGVjaWZpY2FsbHksIG1vc3Qgb2YgdGhpcyBzdHVmZiBpcyBmb3IgQysrL0phdmEuCi0gKgotICovCi1jbGFzcyB0X29vcF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9vb3BfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOgotICAgIHRfZ2VuZXJhdG9yKHByb2dyYW0pIHt9Ci0KLSAgLyoqCi0gICAqIFNjb3BpbmcsIHVzaW5nIGN1cmx5IGJyYWNlcyEKLSAgICovCi0KLSAgdm9pZCBzY29wZV91cChzdGQ6Om9zdHJlYW0mIG91dCkgewotICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBzdGQ6OmVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotICB2b2lkIHNjb3BlX2Rvd24oc3RkOjpvc3RyZWFtJiBvdXQpIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBzdGQ6OmVuZGw7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyB1cGNhc2Vfc3RyaW5nKHN0ZDo6c3RyaW5nIG9yaWdpbmFsKSB7Ci0gICAgc3RkOjp0cmFuc2Zvcm0ob3JpZ2luYWwuYmVnaW4oKSwgb3JpZ2luYWwuZW5kKCksIG9yaWdpbmFsLmJlZ2luKCksIChpbnQoKikoaW50KSkgdG91cHBlcik7Ci0gICAgcmV0dXJuIG9yaWdpbmFsOwotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyBhIGNvbW1lbnQgYWJvdXQgdGhpcyBjb2RlIGJlaW5nIGF1dG9nZW5lcmF0ZWQsIHVzaW5nIEMrKyBzdHlsZQotICAgKiBjb21tZW50cywgd2hpY2ggYXJlIGFsc28gZmFpciBnYW1lIGluIEphdmEgLyBQSFAsIHlheSEKLSAgICoKLSAgICogQHJldHVybiBDLXN0eWxlIGNvbW1lbnQgbWVudGlvbmluZyB0aGF0IHRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkLgotICAgKi8KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBhdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gICAgcmV0dXJuCi0gICAgICBzdGQ6OnN0cmluZygiLyoqXG4iKSArCi0gICAgICAiICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iICsKLSAgICAgICIgKlxuIiArCi0gICAgICAiICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCi0gICAgICAiICovXG4iOwotICB9Ci19OwotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmRhZDMzLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE4MTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBQRVJMIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9wZXJsX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9wZXJsX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgICh2b2lkKSBwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1wZXJsIjsKLSAgICBlc2NhcGVfWyckJ10gPSAiXFwkIjsKLSAgICBlc2NhcGVfWydAJ10gPSAiXFxAIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAodF9jb25zdCogICAgdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLQotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFN0cnVjdHMhCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfcGVybF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb249ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX3Blcmxfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9wZXJsX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGVybF9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCAgICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcz1mYWxzZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgcGVybF9pbmNsdWRlcygpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0PWZhbHNlLCBib29sIG9iaj1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgewotICAgIHJldHVybgotICAgICAgc3RkOjpzdHJpbmcoIiNcbiIpICsKLSAgICAgICIjIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIiArCi0gICAgICAiI1xuIiArCi0gICAgICAiIyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsKLSAgICAgICIjXG4iOwotICB9Ci0KLSAgdm9pZCBwZXJsX25hbWVzcGFjZV9kaXJzKHRfcHJvZ3JhbSogcCwgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiYgZGlycykgewotICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgicGVybCIpOwotICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbG9jOwotCi0gICAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICAgIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgICBkaXJzLnB1c2hfYmFjayhucy5zdWJzdHIoMCwgbG9jKSk7Ci0gICAgICAgIG5zID0gbnMuc3Vic3RyKGxvYysxKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobnMuc2l6ZSgpID4gMCkgewotICAgICAgZGlycy5wdXNoX2JhY2sobnMpOwotICAgIH0KLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHBlcmxfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgewotICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgicGVybCIpOwotICAgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICIiOwotICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbG9jOwotCi0gICAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICAgIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgICByZXN1bHQgKz0gbnMuc3Vic3RyKDAsIGxvYyk7Ci0gICAgICAgIHJlc3VsdCArPSAiOjoiOwotICAgICAgICBucyA9IG5zLnN1YnN0cihsb2MrMSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIHJlc3VsdCArPSBucyArICI6OiI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGdldF9uYW1lc3BhY2Vfb3V0X2RpcigpIHsKLSAgICBzdGQ6OnN0cmluZyBvdXRkaXIgPSBnZXRfb3V0X2RpcigpOwotICAgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4gZGlyczsKLSAgICBwZXJsX25hbWVzcGFjZV9kaXJzKHByb2dyYW1fLCBkaXJzKTsKLSAgICBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdDsKLSAgICBmb3IgKGl0ID0gZGlycy5iZWdpbigpOyBpdCAhPSBkaXJzLmVuZCgpOyBpdCsrKSB7Ci0gICAgICBvdXRkaXIgKz0gKml0ICsgIi8iOwotICAgIH0KLSAgICByZXR1cm4gb3V0ZGlyOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9jb25zdHNfOwotICBzdGQ6Om9mc3RyZWFtIGZfaGVscGVyc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLQotfTsKLQotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICBzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKLSAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiBkaXJzOwotICBwZXJsX25hbWVzcGFjZV9kaXJzKHByb2dyYW1fLCBkaXJzKTsKLSAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXQ7Ci0gIGZvciAoaXQgPSBkaXJzLmJlZ2luKCk7IGl0ICE9IGRpcnMuZW5kKCk7IGl0KyspIHsKLSAgICAgIG91dGRpciArPSAqaXQgKyAiLyI7Ci0gICAgICBNS0RJUihvdXRkaXIuY19zdHIoKSk7Ci0gIH0KLQotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3R5cGVzX25hbWUgPSBvdXRkaXIrIlR5cGVzLnBtIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gb3V0ZGlyKyJDb25zdGFudHMucG0iOwotICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgcGVybF9pbmNsdWRlcygpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX2NvbnN0c18gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgICJwYWNrYWdlICI8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwiQ29uc3RhbnRzOyI8PGVuZGw8PAotICAgIHBlcmxfaW5jbHVkZXMoKSA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIGphdmEgaW1wb3J0cwotICovCi1zdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6cGVybF9pbmNsdWRlcygpIHsKLSAgc3RyaW5nIGluYzsKLQotICBpbmMgID0gInJlcXVpcmUgNS42LjA7XG4iOwotICBpbmMgKz0gInVzZSBzdHJpY3Q7XG4iOwotICBpbmMgKz0gInVzZSB3YXJuaW5ncztcbiI7Ci0gIGluYyArPSAidXNlIFRocmlmdDtcblxuIjsKLQotICByZXR1cm4gaW5jOwotfQotCi0vKioKLSAqIENsb3NlIHVwIChvciBkb3duKSBzb21lIGZpbGV6LgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZQotICBmX3R5cGVzXyA8PCAiMTsiIDw8IGVuZGw7Ci0gIGZfdHlwZXNfLmNsb3NlKCk7Ci0KLSAgZl9jb25zdHNfIDw8ICIxOyIgPDwgZW5kbDsKLSAgZl9jb25zdHNfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBQRVJMLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gICh2b2lkKSB0dHlwZWRlZjsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBTaW5jZSBkZWZpbmUgaXMgZXhwZW5zaXZlIHRvIGxvb2t1cAotICogaW4gUEVSTCwgd2UgdXNlIGEgZ2xvYmFsIGFycmF5IGZvciB0aGlzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgZl90eXBlc18gPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDx0ZW51bS0+Z2V0X25hbWUoKTw8IjsiPDxlbmRsOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGZfdHlwZXNfIDw8ICJ1c2UgY29uc3RhbnQgIjw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0+ICIgPDwgdmFsdWUgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBmX2NvbnN0c18gPDwgInVzZSBjb25zdGFudCAiIDw8IG5hbWUgPDwgIiA9PiAiOwotICBmX2NvbnN0c18gPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKLSAgZl9jb25zdHNfIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0KLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICIxIiA6ICIwIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCAibmV3ICIgPDwgcGVybF9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiKHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA9PiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBvdXQgPDwgIiwiOwotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8ICJ9KSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgb3V0IDw8ICJ7IiA8PCBlbmRsOwotCi0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA9PiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCAifSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIG91dCA8PCAiWyIgPDwgZW5kbDsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLQotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgb3V0IDw8ICIgPT4gMSI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCAiXSI7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBNYWtlIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX3Blcmxfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3Blcmxfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogU3RydWN0cyBjYW4gYmUgbm9ybWFsIG9yIGV4Y2VwdGlvbnMuCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGVybF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBub3RoaW5nIGluIFBFUkwKLSAqIHdoZXJlIHRoZSBvYmplY3RzIGFyZSBhbGwganVzdCBhc3NvY2lhdGl2ZSBhcnJheXMgKHVubGVzcyBvZiBjb3Vyc2Ugd2UKLSAqIGRlY2lkZSB0byBzdGFydCB1c2luZyBvYmplY3RzIGZvciB0aGVtLi4uKQotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIG91dCA8PAotICAgICAgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IjtcbiI7Ci0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgInVzZSBiYXNlIHF3KFRocmlmdDo6VEV4Y2VwdGlvbik7XG4iOwotICB9Ci0KLSAgLy9DcmVhdGUgc2ltcGxlIGFjZXNzb3IgbWV0aG9kcwotICBvdXQgPDwgInVzZSBiYXNlIHF3KENsYXNzOjpBY2Nlc3Nvcik7XG4iOwotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICAgIG91dCA8PCBwZXJsX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8Ii0+bWtfYWNjZXNzb3JzKCBxdyggIjsKLSAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICAgICAgaWYgKCF0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgICAgICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAiOwotICAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgb3V0IDw8ICIpICk7XG4iOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gbmV3KCkKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PAotICAgICJzdWIgbmV3IHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJGNsYXNzbmFtZSA9IHNoaWZ0OyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkc2VsZiAgICAgID0ge307IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICR2YWxzICAgICAgPSBzaGlmdCB8fCB7fTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHN0cmluZyBkdmFsID0gInVuZGVmIjsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAhKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7Ci0gICAgICBkdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgfQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRzZWxmLT57IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAiIDw8IGR2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBjb25zdHJ1Y3RvciBmcm9tIGFycmF5Ci0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIkc2VsZi0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoVU5JVkVSU0FMOjppc2EoJHZhbHMsJ0hBU0gnKSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChkZWZpbmVkICR2YWxzLT57IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIn0pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgJHNlbGYtPnsiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSA9ICR2YWxzLT57IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIn07IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGJsZXNzICgkc2VsZiwgJGNsYXNzbmFtZSk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgIn1cblxuIjsKLQotICBvdXQgPDwKLSAgICAic3ViIGdldE5hbWUgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHJlYWQoKSBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGVybF9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgb3V0IDw8ICJzdWIgcmVhZCB7IiA8PGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICgkc2VsZiwgJGlucHV0KSA9IEBfOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkeGZlciAgPSAwOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkZm5hbWU7IiAgICAgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkZnR5cGUgPSAwOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkZmlkICAgPSAwOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oXFwkZm5hbWUpOyIgPDwgZW5kbDsKLQotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKDEpICIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKFxcJGZuYW1lLCBcXCRmdHlwZSwgXFwkZmlkKTsiIDw8IGVuZGw7Ci0KLSAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhawotICBpbmRlbnQob3V0KSA8PCAiaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJsYXN0OyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgaW5kZW50KG91dCkgPDwgIlNXSVRDSDogZm9yKCRmaWQpIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiL14iIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIkLyAmJiBkb3siOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoJGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYtPiIpOwotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAgIiAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7IiA8PCBlbmRsOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImxhc3Q7IH07IiA8PCBlbmRsOwotCi0gIH0KLSAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotCi0gIGluZGVudChvdXQpIDw8ICAiICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICR4ZmVyOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHdyaXRlKCkgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PCAic3ViIHdyaXRlIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJteSAoJHNlbGYsICRvdXRwdXQpID0gQF87IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAibXkgJHhmZXIgICA9IDA7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHNlbGYtPnsiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCIgPDwKLSAgICAgICInIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKLQotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic2VsZi0+Iik7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBvdXQgPDxpbmRlbnQoKSA8PCAicmV0dXJuICR4ZmVyOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X25hbWVzcGFjZV9vdXRfZGlyKCkrc2VydmljZV9uYW1lXysiLnBtIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICAvLy8gICAgICAicGFja2FnZSAiPDxzZXJ2aWNlX25hbWVfPDwiOyI8PGVuZGw8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgcGVybF9pbmNsdWRlcygpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICAidXNlICIgPDwgcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8ICJUeXBlczsiIDw8IGVuZGw7Ci0KLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgInVzZSAiIDw8IHBlcmxfbmFtZXNwYWNlKGV4dGVuZHNfcy0+Z2V0X3Byb2dyYW0oKSkgPDwgZXh0ZW5kc19zLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UgKHdlbGwsIHR3byBmb3Igbm93IGluIFBFUkwpCi0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9yZXN0KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSk7Ci0KLSAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCi0gIGZfc2VydmljZV8gPDwgIjE7IiA8PCBlbmRsOwotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0gIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kc19zLT5nZXRfbmFtZSgpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gInVzZSBiYXNlIHF3KCIgKyBleHRlbmRzICsgIlByb2Nlc3Nvcik7IjsKLSAgfQotCi0gIGluZGVudF91cCgpOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBmX3NlcnZpY2VfIDw8Ci0gICAgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yOyIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgInVzZSBzdHJpY3Q7IiA8PCBlbmRsIDw8Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPDwgZW5kbCA8PCBlbmRsOwotCi0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgInN1YiBuZXcgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm15ICgkY2xhc3NuYW1lLCAkaGFuZGxlcikgPSBAXzsiPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm15ICRzZWxmICAgICAgPSB7fTsiICAgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIkc2VsZi0+e2hhbmRsZXJ9ID0gJGhhbmRsZXI7IiA8PCBlbmRsOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybiBibGVzcyAoJHNlbGYsICRjbGFzc25hbWUpOyI8PGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLSAgZl9zZXJ2aWNlXyA8PCAic3ViIHByb2Nlc3MgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJteSAoJHNlbGYsICRpbnB1dCwgJG91dHB1dCkgPSBAXzsiIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJteSAkcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJGZuYW1lICA9IHVuZGVmOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkbXR5cGUgID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VCZWdpbihcXCRmbmFtZSwgXFwkbXR5cGUsIFxcJHJzZXFpZCk7IiA8PCBlbmRsOwotCi0gIC8vIEhPVDogY2hlY2sgZm9yIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICRtZXRob2RuYW1lID0gJ3Byb2Nlc3NfJy4kZm5hbWU7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICghJHNlbGYtPmNhbigkbWV0aG9kbmFtZSkpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiJGlucHV0LT5za2lwKFRUeXBlOjpTVFJVQ1QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICR4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbignRnVuY3Rpb24gJy4kZm5hbWUuJyBub3QgaW1wbGVtZW50ZWQuJywgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCRmbmFtZSwgVE1lc3NhZ2VUeXBlOjpFWENFUFRJT04sICRyc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkeC0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJHNlbGYtPiRtZXRob2RuYW1lKCRyc2VxaWQsICRpbnB1dCwgJG91dHB1dCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiAxOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICAifSIgPDwgZW5kbCA8PGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgLy8gT3BlbiBmdW5jdGlvbgotICBmX3NlcnZpY2VfIDw8Ci0gICAgInN1YiBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIgeyI8PGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJteSAoJHNlbGYsICRzZXFpZCwgJGlucHV0LCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbDsKLQotICBzdHJpbmcgYXJnc25hbWUgPSBwZXJsX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSBwZXJsX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRhcmdzLT5yZWFkKCRpbnB1dCk7IiA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiJGlucHV0LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJteSAkcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZXZhbCB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICIkcmVzdWx0LT57c3VjY2Vzc30gPSAiOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICAiJHNlbGYtPntoYW5kbGVyfS0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiJGFyZ3MtPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn07IGlmKCBVTklWRVJTQUw6OmlzYSgkQCwnIiA8PAotICAgICAgICAgIHBlcmxfbmFtZXNwYWNlKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3Byb2dyYW0oKSkgPDwKLSAgICAgICAgICAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAiJykgKXsgIiA8PCBlbmRsOwotCi0gICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+eyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gJEA7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgfQotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJ9IiA8PCBlbmRsOwotICAgIHJldHVybjsKLSAgfQotICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBUTWVzc2FnZVR5cGU6OlJFUExZLCAkc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkcmVzdWx0LT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICAiIyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgc3RyaW5nIG5hbWUgPSB0cy0+Z2V0X25hbWUoKTsKLSAgICB0cy0+c2V0X25hbWUoc2VydmljZV9uYW1lXyArICJfIiArIG5hbWUpOwotICAgIGdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlKTsKLSAgICBnZW5lcmF0ZV9wZXJsX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gICAgdHMtPnNldF9uYW1lKG5hbWUpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGVybF9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzX2lmID0gIiI7Ci0gIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgewotICAgIGV4dGVuZHNfaWYgPSAidXNlIGJhc2UgcXcoIiArIHBlcmxfbmFtZXNwYWNlKGV4dGVuZHNfcy0+Z2V0X3Byb2dyYW0oKSkgKyBleHRlbmRzX3MtPmdldF9uYW1lKCkgKyAiSWYpOyI7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiSWY7IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAidXNlIHN0cmljdDsiIDw8IGVuZGwgPDwKLSAgICBleHRlbmRzX2lmIDw8IGVuZGwgPDwgZW5kbDsKLQotCi0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAic3ViICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ZW5kbDw8ICIgIGRpZSAnaW1wbGVtZW50IGludGVyZmFjZSc7XG59IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIFJFU1QgaW50ZXJmYWNlCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZXN0KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyAgICA9ICBleHRlbmRzX3MtPmdldF9uYW1lKCk7Ci0gICAgZXh0ZW5kc19pZiA9ICJ1c2UgYmFzZSBxdygiICsgcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHNfcy0+Z2V0X25hbWUoKSArICJSZXN0KTsiOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJSZXN0OyIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgInVzZSBzdHJpY3Q7IiA8PCBlbmRsIDw8Ci0gICAgZXh0ZW5kc19pZiA8PCBlbmRsIDw8IGVuZGw7Ci0KLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAic3ViIG5ldyB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibXkgKCRjbGFzc25hbWUsICRpbXBsKSA9IEBfOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm15ICRzZWxmICAgICA9eyBpbXBsID0+ICRpbXBsIH07IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7IiA8PCBlbmRsOwotCi0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgZl9zZXJ2aWNlXyAgPDwKLSAgICAgICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAic3ViICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAieyIgICAgPDxlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibXkgKCRzZWxmLCAkcmVxdWVzdCkgPSBAXzsiIDw8IGVuZGwgPDwgZW5kbDsKLQotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgewotICAgICAgdF90eXBlKiBhdHlwZSA9IGdldF90cnVlX3R5cGUoKCphX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIHN0cmluZyByZXEgPSAiJHJlcXVlc3QtPnsnIiArICgqYV9pdGVyKS0+Z2V0X25hbWUoKSArICInfSI7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJteSAkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICgiIDw8IHJlcSA8PCAiKSA/ICIgPDwgcmVxIDw8ICIgOiB1bmRlZjsiIDw8IGVuZGw7Ci0gICAgICBpZiAoYXR5cGUtPmlzX3N0cmluZygpICYmCi0gICAgICAgICAgKCh0X2Jhc2VfdHlwZSopYXR5cGUpLT5pc19zdHJpbmdfbGlzdCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAibXkgQCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBzcGxpdCgvLC8sICQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSAgICAgPDwgIiQiPDwoKmFfaXRlciktPmdldF9uYW1lKCkgPDwiID0gXFxAIjw8KCphX2l0ZXIpLT5nZXRfbmFtZSgpPDxlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuICRzZWxmLT57aW1wbH0tPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBhcmd1bWVudF9saXN0KCgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSkgPDwgIik7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8ZW5kbDsKLSAgfQotCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kc19zLT5nZXRfbmFtZSgpOwotICAgIGV4dGVuZHNfY2xpZW50ID0gInVzZSBiYXNlIHF3KCIgKyBleHRlbmRzICsgIkNsaWVudCk7IjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICAgICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudDsiIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgZXh0ZW5kc19jbGllbnQgPDwgZW5kbCA8PAotICAgICAgInVzZSBiYXNlIHF3KCIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmKTsiIDw8IGVuZGw7Ci0KLSAgLy8gQ29uc3RydWN0b3IgZnVuY3Rpb24KLSAgZl9zZXJ2aWNlXyA8PCAic3ViIG5ldyB7Ijw8ZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICgkY2xhc3NuYW1lLCAkaW5wdXQsICRvdXRwdXQpID0gQF87IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICRzZWxmICAgICAgPSB7fTsiICAgPDxlbmRsOwotCi0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiRzZWxmID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHNlbGYtPntpbnB1dH0gID0gJGlucHV0OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRzZWxmLT57b3V0cHV0fSA9IGRlZmluZWQgJG91dHB1dCA/ICRvdXRwdXQgOiAkaW5wdXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHNlbGYtPntzZXFpZH0gID0gMDsiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsiPDxlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBmX3NlcnZpY2VfIDw8ICJzdWIgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGluZGVudCgpIDw8Ci0gICAgICAiJHNlbGYtPnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgIiQiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICIkc2VsZi0+cmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgInN1YiBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0gcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiRzZWxmLT57b3V0cHV0fS0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCBUTWVzc2FnZVR5cGU6OkNBTEwsICRzZWxmLT57c2VxaWR9KTsiIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibXkgJGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRhcmdzLT57IiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSA9ICQiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJGFyZ3MtPndyaXRlKCRzZWxmLT57b3V0cHV0fSk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHNlbGYtPntvdXRwdXR9LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkc2VsZi0+e291dHB1dH0tPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKLQotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGw7Ci0KLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0gICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotCi0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKLSAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICAic3ViICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAibXkgJHJzZXFpZCA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJteSAkZm5hbWU7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJteSAkbXR5cGUgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkc2VsZi0+e2lucHV0fS0+cmVhZE1lc3NhZ2VCZWdpbihcXCRmbmFtZSwgXFwkbXR5cGUsIFxcJHJzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoJG10eXBlID09IFRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIG15ICR4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAkeC0+cmVhZCgkc2VsZi0+e2lucHV0fSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICRzZWxmLT57aW5wdXR9LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBkaWUgJHg7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm15ICRyZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRyZXN1bHQtPnJlYWQoJHNlbGYtPntpbnB1dH0pOyIgPDwgZW5kbDsKLQotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkc2VsZi0+e2lucHV0fS0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbDsKLQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiByZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChkZWZpbmVkICRyZXN1bHQtPntzdWNjZXNzfSApIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gJHJlc3VsdC0+e3N1Y2Nlc3N9OyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChkZWZpbmVkICRyZXN1bHQtPnsiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIGRpZSAkcmVzdWx0LT57IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIn07IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAgICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJkaWUgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCAifSI8PGVuZGw7Ci0KLSAgICB9Ci0gIH0KLQotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7Ci0gICh2b2lkKSBpbmNsYXNzOwotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gIC8vSGFjayBmb3Igd2hlbiBwcmVmaXggaXMgZGVmaW5lZCAoYWx3YXlzIGEgaGFzaCByZWYpCi0gIGlmICghcHJlZml4LmVtcHR5KCkpIHsKLSAgICBuYW1lID0gcHJlZml4ICsgInsiICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIn0iOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiJHhmZXIgKz0gJGlucHV0LT4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsKLSAgICAgICAgICBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoXFwkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgInJlYWRCb29sKFxcJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZShcXCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTE2KFxcJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgInJlYWRJMzIoXFwkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAicmVhZEk2NChcXCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKFxcJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEVSTCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAicmVhZEkzMihcXCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHZhcmlhYmxlLiBUaGlzIG1ha2VzIHR3byBrZXkgYXNzdW1wdGlvbnMsCi0gKiBmaXJzdCB0aGF0IHRoZXJlIGlzIGEgY29uc3QgY2hhciogdmFyaWFibGUgbmFtZWQgZGF0YSB0aGF0IHBvaW50cyB0byB0aGUKLSAqIGJ1ZmZlciBmb3IgZGVzZXJpYWxpemF0aW9uLCBhbmQgdGhhdCB0aGVyZSBpcyBhIHZhcmlhYmxlIHByb3RvY29sIHdoaWNoCi0gKiBpcyBhIHJlZmVyZW5jZSB0byBhIFRQcm90b2NvbCBzZXJpYWxpemF0aW9uIG9iamVjdC4KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCBwZXJsX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJCIgPDwgcHJlZml4IDw8ICItPnJlYWQoJGlucHV0KTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOwotICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOwotICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOwotICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOwotCi0gIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7Ci0gIHRfZmllbGQgZmt0eXBlKGdfdHlwZV9ieXRlLCBrdHlwZSk7Ci0gIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9ieXRlLCB2dHlwZSk7Ci0gIHRfZmllbGQgZmV0eXBlKGdfdHlwZV9ieXRlLCBldHlwZSk7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICQiIDw8IHNpemUgPDwgIiA9IDA7IiA8PCBlbmRsOwotCi0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSB7fTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJteSAkIiA8PCBrdHlwZSA8PCAiID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJteSAkIiA8PCB2dHlwZSA8PCAiID0gMDsiIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBCZWdpbigiIDw8Ci0gICAgICAiXFwkIiA8PCBrdHlwZSA8PCAiLCBcXCQiIDw8IHZ0eXBlIDw8ICIsIFxcJCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0ge307IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibXkgJCIgPDwgZXR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0QmVnaW4oIiA8PAotICAgICAgIlxcJCIgPDwgZXR5cGUgPDwgIiwgXFwkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gW107IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibXkgJCIgPDwgZXR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEJlZ2luKCIgPDwKLSAgICAgICJcXCQiIDw8IGV0eXBlIDw8ICIsIFxcJCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgfQotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgImZvciAobXkgJCIgPDwKLSAgICBpIDw8ICIgPSAwOyAkIiA8PCBpIDw8ICIgPCAkIiA8PCBzaXplIDw8ICI7ICsrJCIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotCi0gIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgia2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoInZhbCIpOwotICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZrZXksIHRydWUsIHRydWUpIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZnZhbCwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiJCIgPDwgcHJlZml4IDw8ICItPnskIiA8PCBrZXkgPDwgIn0gPSAkIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIm15ICQiIDw8IGVsZW0gPDwgIiA9IHVuZGVmOyIgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiJCIgPDwgcHJlZml4IDw8ICItPnskIiA8PCBlbGVtIDw8ICJ9ID0gMTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIm15ICQiIDw8IGVsZW0gPDwgIiA9IHVuZGVmOyIgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHVzaChAeyQiIDw8IHByZWZpeCA8PCAifSwkIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArICJ7Iit0ZmllbGQtPmdldF9uYW1lKCkrIn0iICk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyAieyIgKyB0ZmllbGQtPmdldF9uYW1lKCkrIn0iKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotICAgIHN0cmluZyBuYW1lID0gdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gICAgLy9IYWNrIGZvciB3aGVuIHByZWZpeCBpcyBkZWZpbmVkIChhbHdheXMgYSBoYXNoIHJlZikKLSAgICBpZighcHJlZml4LmVtcHR5KCkpCi0gICAgICBuYW1lID0gcHJlZml4ICsgInsiICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIn0iOwotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkb3V0cHV0LT4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93Ci0gICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQRVJMIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJ3cml0ZUkzMigkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgICAiJHhmZXIgKz0gJCIgPDwgcHJlZml4IDw8ICItPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBXcml0ZXMgb3V0IGEgY29udGFpbmVyCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwQmVnaW4oIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAic2NhbGFyKGtleXMgJXskIiA8PCBwcmVmaXggPDwgIn0pKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEJlZ2luKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgInNjYWxhcihAeyQiIDw8IHByZWZpeCA8PCAifSkpOyIgPDwgZW5kbDsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVMaXN0QmVnaW4oIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgInNjYWxhcihAeyQiIDw8IHByZWZpeCA8PCAifSkpOyIgPDwgZW5kbDsKLQotICB9Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGtpdGVyID0gdG1wKCJraXRlciIpOwotICAgIHN0cmluZyB2aXRlciA9IHRtcCgidml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIndoaWxlKCBteSAoJCI8PGtpdGVyPDwiLCQiPDx2aXRlcjw8IikgPSBlYWNoICV7JCIgPDwgcHJlZml4IDw8ICJ9KSAiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvcmVhY2ggbXkgJCI8PGl0ZXI8PCIgKEB7JCIgPDwgcHJlZml4IDw8ICJ9KSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3JlYWNoIG15ICQiPDxpdGVyPDwiIChAeyQiIDw8IHByZWZpeCA8PCAifSkgIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkKTsKLQotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Ci19Ci0KLS8qKgotICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICovCi1zdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgYm9vbCBvYmopIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICJteSAkIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gJyciOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gMC4wIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBFUkwgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IFtdIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIGlmIChvYmopIHsKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHBlcmxfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpICsgdHlwZS0+Z2V0X25hbWUoKSArICIoKSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgKz0gIiA9IHVuZGVmIjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdCArICI7IjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0KLSAgc3RyaW5nIHN0cjsKLQotICBzdHIgID0gcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIntcbiI7Ci0gIHN0ciArPSAiICBteSAkc2VsZiA9IHNoaWZ0O1xuIjsKLQotICAvL05lZWQgdG8gY3JlYXRlIHBlcmwgZnVuY3Rpb24gYXJnIGlucHV0cwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+ICZmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0ciArPSAiICBteSAkIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIgPSBzaGlmdDtcbiI7Ci0gIH0KLQotICByZXR1cm4gc3RyOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKi8KLXN0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAiJCIgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gKi8KLXN0cmluZyB0X3BlcmxfZ2VuZXJhdG9yIDo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiVFR5cGU6OlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZTo6Qk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZTo6QllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpJMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZTo6STMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGU6Okk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpJMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpTVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6TUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGU6OlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6TElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IocGVybCwgIlBlcmwiLCAiIikKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BocF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE0Y2ZmYy4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDIzNjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0jZGVmaW5lIE5TR0xPQkFMICAobnNnbG9iYWxfLnNpemUoKSA/IG5zZ2xvYmFsXyA6ICIiKQotI2RlZmluZSBOU0dMT0JBTF9BICgiXFwiICsgTlNHTE9CQUwgKQotI2RlZmluZSBOU0dMT0JBTF9CICggTlNHTE9CQUwgKyAiXFwiKQotI2RlZmluZSBOU0dMT0JBTF9BQiAoIlxcIiArIE5TR0xPQkFMICsgIlxcIikKLSNkZWZpbmUgTlNfUk9PVCAoIG5hbWVzcGFjZV9waHBfID8gIlxcIiA6ICIiKQotCi0KLS8qKgotICogUEhQIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9waHBfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X3BocF9nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImlubGluZWQiKTsKLSAgICBiaW5hcnlfaW5saW5lXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJyZXN0Iik7Ci0gICAgcmVzdF8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgic2VydmVyIik7Ci0gICAgcGhwc18gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiYXV0b2xvYWQiKTsKLSAgICBhdXRvbG9hZF8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgib29wIik7Ci0gICAgb29wXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJuYW1lc3BhY2UiKTsKLSAgICBuYW1lc3BhY2VfcGhwXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJuc2dsb2JhbCIpOwotICAgIGlmKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpIHsKLSAgICAgIGlmKG5hbWVzcGFjZV9waHBfKSBuc2dsb2JhbF8gPSBpdGVyLT5zZWNvbmQ7Ci0gICAgICBlbHNlIHRocm93ICJjYW5ub3QgdXNlIG5zZ2xvYmFsIHdpdGhvdXQgbmFtZXNwYWNlLiI7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgbnNnbG9iYWxfID0gIiI7IC8vIGJ5IGRlZmF1bHQgZ2xvYmFsIG5hbWVzcGFjZSBpcyBlbXB0eQotICAgIH0KLQotICAgIGlmIChvb3BfICYmIGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICB0aHJvdyAib29wIGFuZCBpbmxpbmVkIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuIjsKLSAgICB9Ci0KLSAgICBvdXRfZGlyX2Jhc2VfID0gKGJpbmFyeV9pbmxpbmVfID8gImdlbi1waHBpIiA6ICJnZW4tcGhwIik7Ci0gICAgZXNjYXBlX1snJCddID0gIlxcJCI7Ci0gIH0KLQotICBzdGF0aWMgYm9vbCBpc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpOwotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAodF9jb25zdCogICAgdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLQotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFN0cnVjdHMhCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uPWZhbHNlKTsKLSAgdm9pZCBfZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb249ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3BocF9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKHN0ZDo6b2ZzdHJlYW0gJm91dCwgdF90eXBlKiB0KTsKLSAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3NwZWMoc3RkOjpvZnN0cmVhbSAmb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCAgICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgX2dlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcz1mYWxzZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgcGhwX2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQ9ZmFsc2UsIGJvb2wgb2JqPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fY2FzdCh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0ZDo6c3RyaW5nIHBocF9uYW1lc3BhY2UodF9wcm9ncmFtKiBwKSB7Ci0gICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJwaHAiKTsKLSAgICBzaXplX3QgcG9zaXRpb24gPSBucy5maW5kKCAiLiIgKTsKLSAgICB3aGlsZSAocG9zaXRpb24gIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICBucy5yZXBsYWNlKHBvc2l0aW9uLCAxLCAiXFwiKTsKLSAgICAgIHBvc2l0aW9uID0gbnMuZmluZCgiLiIsIHBvc2l0aW9uKzEpOwotICAgIH0KLSAgICBpZihuYW1lc3BhY2VfcGhwXykgcmV0dXJuIChuc2dsb2JhbF8uc2l6ZSgpID8gTlNHTE9CQUxfQUIgOiBOU0dMT0JBTF9CKSArIChucy5zaXplKCkgPyAobnMgKyAiXFwiKSA6ICIiKTsKLSAgICBlbHNlIHJldHVybiAiIjsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHBocF9uYW1lc3BhY2Vfc3VmZml4KGNvbnN0IHRfcHJvZ3JhbSogcCkgewotICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgicGhwIik7Ci0gICAgc2l6ZV90IHBvc2l0aW9uID0gbnMuZmluZCggIi4iICk7Ci0gICAgd2hpbGUgKHBvc2l0aW9uICE9IHN0cmluZzo6bnBvcykgewotICAgICAgbnMucmVwbGFjZShwb3NpdGlvbiwgMSwgIlxcIik7Ci0gICAgICBwb3NpdGlvbiA9IG5zLmZpbmQoIi4iLCBwb3NpdGlvbisxKTsKLSAgICB9ICAgIAotICAgIGlmIChuYW1lc3BhY2VfcGhwXykgcmV0dXJuIChuc2dsb2JhbF8uc2l6ZSgpID8gTlNHTE9CQUxfQiA6IE5TR0xPQkFMKSArIG5zOwotICAgIGVsc2UgcmV0dXJuICIiOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgcGhwX3BhdGgodF9wcm9ncmFtKiBwKSB7Ci0gICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJwaHAucGF0aCIpOwotICAgIGlmIChucy5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gcC0+Z2V0X25hbWUoKTsKLSAgICB9Ci0KLSAgICAvLyBUcmFuc2Zvcm0gdGhlIGphdmEtc3R5bGUgbmFtZXNwYWNlIGludG8gYSBwYXRoLgotICAgIGZvciAoc3RkOjpzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gbnMuYmVnaW4oKTsgaXQgIT0gbnMuZW5kKCk7ICsraXQpIHsKLSAgICAgIGlmICgqaXQgPT0gJy4nKSB7Ci0gICAgICAgICppdCA9ICcvJzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gKChuYW1lc3BhY2VfcGhwXykgPyBucyArICcvJyA6ICIiICkgKyBwLT5nZXRfbmFtZSgpOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9jb25zdHNfOwotICBzdGQ6Om9mc3RyZWFtIGZfaGVscGVyc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLQotICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87Ci0gIC8qKgotICAgKiBHZW5lcmF0ZSBwcm90b2NvbC1pbmRlcGVuZGVudCB0ZW1wbGF0ZT8gT3IgQmluYXJ5IGlubGluZSBjb2RlPwotICAgKi8KLSAgYm9vbCBiaW5hcnlfaW5saW5lXzsKLQotICAvKioKLSAgICogR2VuZXJhdGUgYSBSRVNUIGhhbmRsZXIgY2xhc3MKLSAgICovCi0gIGJvb2wgcmVzdF87Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlIHN0dWJzIGZvciBhIFBIUCBzZXJ2ZXIKLSAgICovCi0gIGJvb2wgcGhwc187Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlIFBIUCBjb2RlIHRoYXQgdXNlcyBhdXRvbG9hZAotICAgKi8KLSAgYm9vbCBhdXRvbG9hZF87Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdG8gdXNlIE9PUCBiYXNlIGNsYXNzIFRCYXNlCi0gICAqLwotICBib29sIG9vcF87Ci0gIAotICAvKioKLSAgICogR2VuZXJhdGUgbmFtZXNwYWNlcyBpbiBQSFA1LjMgc3R5bGUKLSAgICovCi0gIGJvb2wgbmFtZXNwYWNlX3BocF87Ci0gCi0gIC8qKgotICAgKiBHbG9iYWwgbmFtZXNwYWNlIGZvciBQSFAgNS4zCi0gICAqLwotICBzdGQ6OnN0cmluZyBuc2dsb2JhbF87Ci19OwotCi0KLWJvb2wgdF9waHBfZ2VuZXJhdG9yOjppc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpIHsKLSAgcmV0dXJuIHN1Yl9uYW1lc3BhY2UgPT0gInBhdGgiOwotfQotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0gIHBhY2thZ2VfZGlyXyA9IGdldF9vdXRfZGlyKCkrIi8iK3Byb2dyYW1fbmFtZV8rIi8iOwotICBNS0RJUihwYWNrYWdlX2Rpcl8uY19zdHIoKSk7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IHBhY2thZ2VfZGlyXytwcm9ncmFtX25hbWVfKyJfdHlwZXMucGhwIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfdHlwZXNfIDw8Ci0gICAgIjw/cGhwIiA8PCBlbmRsOwotICBpZihuYW1lc3BhY2VfcGhwXykgZl90eXBlc18gPDwgIm5hbWVzcGFjZSAiIDw8IHBocF9uYW1lc3BhY2Vfc3VmZml4KGdldF9wcm9ncmFtKCkpIDw8ICI7IiA8PCBlbmRsOwotICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBwaHBfaW5jbHVkZXMoKTsKLQotICAvLyBJbmNsdWRlIG90aGVyIFRocmlmdCBpbmNsdWRlcwotICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgc3RyaW5nIHBhY2thZ2UgPSBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKTsKLSAgICBzdHJpbmcgcHJlZml4ID0gcGhwX3BhdGgoaW5jbHVkZXNbaV0pOwotICAgIGZfdHlwZXNfIDw8Ci0gICAgICAiaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvcGFja2FnZXMvIiA8PCBwcmVmaXggPDwgIi8iIDw8IHBhY2thZ2UgPDwgIl90eXBlcy5waHAnOyIgPDwgZW5kbDsKLSAgfQotICBmX3R5cGVzXyA8PCBlbmRsOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBpZiAoIXByb2dyYW1fLT5nZXRfY29uc3RzKCkuZW1wdHkoKSkgewotICAgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfK3Byb2dyYW1fbmFtZV8rIl9jb25zdGFudHMucGhwIjsKLSAgICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotICAgIGZfY29uc3RzXyA8PAotICAgICAgIjw/cGhwIiA8PCBlbmRsOwotICAgICBpZihuYW1lc3BhY2VfcGhwXykgZl9jb25zdHNfIDw8ICJuYW1lc3BhY2UgIiA8PCBwaHBfbmFtZXNwYWNlX3N1ZmZpeChnZXRfcHJvZ3JhbSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgZl9jb25zdHNfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgICAiaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvcGFja2FnZXMvIiArIHBocF9wYXRoKHByb2dyYW1fKSArICIvIiArIHByb2dyYW1fbmFtZV8gKyAiX3R5cGVzLnBocCc7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsIDw8Ci0gICAgICAiJEdMT0JBTFNbJyIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX0NPTlNUQU5UUyddID0gYXJyYXkoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgcGhwIGluY2x1ZGVzCi0gKi8KLXN0cmluZyB0X3BocF9nZW5lcmF0b3I6OnBocF9pbmNsdWRlcygpIHsKLSAgcmV0dXJuCi0gICAgc3RyaW5nKCJpbmNsdWRlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9UaHJpZnQucGhwJztcblxuIik7Ci19Ci0KLS8qKgotICogQ2xvc2UgdXAgKG9yIGRvd24pIHNvbWUgZmlsZXouCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIHR5cGVzIGZpbGUKLSAgZl90eXBlc18gPDwgIj8+IiA8PCBlbmRsOwotICBmX3R5cGVzXy5jbG9zZSgpOwotCi0gIGlmICghcHJvZ3JhbV8tPmdldF9jb25zdHMoKS5lbXB0eSgpKSB7Ci0gICAgZl9jb25zdHNfIDw8ICI/PiIgPDwgZW5kbDsKLSAgICBmX2NvbnN0c18uY2xvc2UoKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUEhQLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpIHR0eXBlZGVmOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIFNpbmNlIGRlZmluZSBpcyBleHBlbnNpdmUgdG8gbG9va3VwCi0gKiBpbiBQSFAsIHdlIHVzZSBhIGdsb2JhbCBhcnJheSBmb3IgdGhpcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgZl90eXBlc18gPDwKLSAgICAiJEdMT0JBTFNbJyIgPDwgcGhwX25hbWVzcGFjZSh0ZW51bS0+Z2V0X3Byb2dyYW0oKSkgPDwgIkVfIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiJ10gPSBhcnJheSgiIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgZl90eXBlc18gPDwKLSAgICAgICIgICciIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyA9PiAiIDw8IHZhbHVlIDw8ICIsIiA8PCBlbmRsOwotICB9Ci0KLSAgZl90eXBlc18gPDwKLSAgICAiKTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotCi0gIC8vIFdlJ3JlIGFsc28gZG9pbmcgaXQgdGhpcyB3YXkgdG8gc2VlIGhvdyBpdCBwZXJmb3Jtcy4gSXQncyBtb3JlIGxlZ2libGUKLSAgLy8gY29kZSBidXQgeW91IGNhbid0IGRvIHRoaW5ncyBsaWtlIGFuICdleHRyYWN0JyBvbiBpdCwgd2hpY2ggaXMgYSBiaXQgb2YKLSAgLy8gYSBkb3duZXIuCi0gIGZfdHlwZXNfIDw8Ci0gICAgImZpbmFsIGNsYXNzICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgaW5kZW50KGZfdHlwZXNfKSA8PAotICAgICAgImNvbnN0ICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PAotICAgICJzdGF0aWMgcHVibGljICRfX25hbWVzID0gYXJyYXkoIiA8PCBlbmRsOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgaW5kZW50KGZfdHlwZXNfKSA8PAotICAgICAgIiAgIiA8PCB2YWx1ZSA8PCAiID0+ICciIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PAotICAgICIpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7Ci0KLSAgZl9jb25zdHNfIDw8ICIkR0xPQkFMU1snIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfQ09OU1RBTlRTJ11bJyIgPDwgbmFtZSA8PCAiJ10gPSAiOwotICBmX2NvbnN0c18gPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKLSAgZl9jb25zdHNfIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBvdXQgPDwgIm5ldyAiIDw8IE5TX1JPT1QgPDwgcGhwX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIoYXJyYXkoIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgPT4gIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpKSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgb3V0IDw8ICJhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA9PiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgb3V0IDw8ICJhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgICBvdXQgPDwgIiA9PiB0cnVlIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSI7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBNYWtlIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfcGhwX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3BocF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBTdHJ1Y3RzIGNhbiBiZSBub3JtYWwgb3IgZXhjZXB0aW9ucy4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci19Ci0KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHQpIHsKLSAgdCA9IGdldF90cnVlX3R5cGUodCk7Ci0gIGluZGVudChvdXQpIDw8ICIndHlwZScgPT4gIiA8PCBOU19ST09UIDw8IHR5cGVfdG9fZW51bSh0KSA8PCAiLCIgPDwgZW5kbDsKLQotICBpZiAodC0+aXNfYmFzZV90eXBlKCkgfHwgdC0+aXNfZW51bSgpKSB7Ci0gICAgLy8gTm9vcCwgdHlwZSBpcyBhbGwgd2UgbmVlZAotICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiJ2NsYXNzJyA9PiAnIiA8PCBwaHBfbmFtZXNwYWNlKHQtPmdldF9wcm9ncmFtKCkpIDw8IHQtPmdldF9uYW1lKCkgPDwiJywiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbWFwKil0KS0+Z2V0X2tleV90eXBlKCkpOwotICAgIHRfdHlwZSogdnR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgodF9tYXAqKXQpLT5nZXRfdmFsX3R5cGUoKSk7Ci0gICAgaW5kZW50KG91dCkgPDwgIidrdHlwZScgPT4gIiA8PCBOU19ST09UIDw8IHR5cGVfdG9fZW51bShrdHlwZSkgPDwgIiwiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIid2dHlwZScgPT4gIiA8PCBOU19ST09UIDw8IHR5cGVfdG9fZW51bSh2dHlwZSkgPDwgIiwiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIidrZXknID0+IGFycmF5KCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG91dCwga3R5cGUpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIiksIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIndmFsJyA9PiBhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvdXQsIHZ0eXBlKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSwiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkgfHwgdC0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0LT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbGlzdCopdCktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfc2V0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgIidldHlwZScgPT4gIiA8PCBOU19ST09UIDw8IHR5cGVfdG9fZW51bShldHlwZSkgPDwiLCIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiJ2VsZW0nID0+IGFycmF5KCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG91dCwgZXR5cGUpOwotICAgIGluZGVudChvdXQpIDw8ICIpLCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgewotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gdHlwZSBmb3IgcGhwIHN0cnVjdCBzcGVjIGZpZWxkIjsKLSAgfQotCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBzdHJ1Y3Qgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUsIHdoaWNoIGZ1bGx5IHF1YWxpZmllcyBlbm91Z2gKLSAqIHR5cGUgaW5mb3JtYXRpb24gdG8gZ2VuZXJhbGl6ZSBzZXJpYWxpemF0aW9uIHJvdXRpbmVzLgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9zcGVjKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJpZiAoIWlzc2V0KHNlbGY6OiRfVFNQRUMpKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAic2VsZjo6JF9UU1BFQyA9IGFycmF5KCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpbmRlbnQob3V0KSA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiID0+IGFycmF5KCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIndmFyJyA9PiAnIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIicsIiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX3BocF90eXBlX3NwZWMob3V0LCB0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSwiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICIgICk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBpZiAoYXV0b2xvYWRfKSB7Ci0gICAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICAgIG9mc3RyZWFtIGF1dG9sb2FkX291dDsKLSAgICBzdHJpbmcgZl9zdHJ1Y3QgPSBwcm9ncmFtX25hbWVfKyIuIisodHN0cnVjdC0+Z2V0X25hbWUoKSkrIi5waHAiOwotICAgIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gcGFja2FnZV9kaXJfK2Zfc3RydWN0OwotICAgIGF1dG9sb2FkX291dC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7Ci0gICAgYXV0b2xvYWRfb3V0IDw8ICI8P3BocCIgPDwgZW5kbDsKLSAgICBfZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKGF1dG9sb2FkX291dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgICBhdXRvbG9hZF9vdXQgPDwgZW5kbCA8PCAiPz4iIDw8IGVuZGw7Ci0gICAgYXV0b2xvYWRfb3V0LmNsb3NlKCk7Ci0KLSAgICBmX3R5cGVzXyA8PAotICAgICAgIiRHTE9CQUxTWydUSFJJRlRfQVVUT0xPQUQnXVsnIiA8PCBsb3dlcmNhc2UocGhwX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSArIHRzdHJ1Y3QtPmdldF9uYW1lKCkpIDw8ICInXSA9ICciIDw8IHByb2dyYW1fbmFtZV8gPDwgIi8iIDw8IGZfc3RydWN0IDw8ICInOyIgPDwgZW5kbDsKLQotICB9IGVsc2UgewotICAgIF9nZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24ob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBub3RoaW5nIGluIFBIUAotICogd2hlcmUgdGhlIG9iamVjdHMgYXJlIGFsbCBqdXN0IGFzc29jaWF0aXZlIGFycmF5cyAodW5sZXNzIG9mIGNvdXJzZSB3ZQotICogZGVjaWRlIHRvIHN0YXJ0IHVzaW5nIG9iamVjdHMgZm9yIHRoZW0uLi4pCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpfZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIG91dCA8PAotICAgICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgIiBleHRlbmRzICIgPDwgTlNfUk9PVCA8PCAiVEV4Y2VwdGlvbiI7Ci0gIH0gZWxzZSBpZiAob29wXykgewotICAgIG91dCA8PCAiIGV4dGVuZHMgIiA8PCBOU19ST09UIDw8ICJUQmFzZSI7Ci0gIH0KLSAgb3V0IDw8Ci0gICAgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAic3RhdGljICRfVFNQRUM7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHN0cmluZyBkdmFsID0gIm51bGwiOwotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICEodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKLSAgICAgIGR2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKm1faXRlciktPmdldF92YWx1ZSgpKTsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJwdWJsaWMgJCIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IGR2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBjb25zdHJ1Y3RvciBmcm9tIGFycmF5Ci0gIHN0cmluZyBwYXJhbSA9IChtZW1iZXJzLnNpemUoKSA+IDApID8gIiR2YWxzPW51bGwiIDogIiI7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoIiA8PCBwYXJhbSA8PCAiKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBnZW5lcmF0ZV9waHBfc3RydWN0X3NwZWMob3V0LCB0c3RydWN0KTsKLQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiR0aGlzLT4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmIChpc19hcnJheSgkdmFscykpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKG9vcF8pIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicGFyZW50OjpfX2NvbnN0cnVjdChzZWxmOjokX1RTUEVDLCAkdmFscyk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoaXNzZXQoJHZhbHNbJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInXSkpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAkdGhpcy0+IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICR2YWxzWyciIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJ107IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfQotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkKCkgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHVibGljIGZ1bmN0aW9uIHJlYWQoJGlucHV0KSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAob29wXykgewotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gJHRoaXMtPl9yZWFkKCciIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIicsIHNlbGY6OiRfVFNQRUMsICRpbnB1dCk7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiJHhmZXIgPSAwOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkZm5hbWUgPSBudWxsOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkZnR5cGUgPSAwOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkZmlkID0gMDsiIDw8IGVuZGw7Ci0KLSAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzCi0gIGlmICghYmluYXJ5X2lubGluZV8pIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKCRmbmFtZSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIHRfZmllbGQgZmZ0eXBlKGdfdHlwZV9ieXRlLCAiZnR5cGUiKTsKLSAgICAgIHRfZmllbGQgZmZpZChnX3R5cGVfaTE2LCAiZmlkIik7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZnR5cGUpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoJGZ0eXBlID09ICIgPDwgTlNfUk9PVCA8PCAiVFR5cGU6OlNUT1ApIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmZpZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICIkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKCRmbmFtZSwgJGZ0eXBlLCAkZmlkKTsiIDw8IGVuZGw7Ci0gICAgICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiaWYgKCRmdHlwZSA9PSAiIDw8IE5TX1JPT1QgPDwgIlRUeXBlOjpTVE9QKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiYnJlYWs7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJ9IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJzd2l0Y2ggKCRmaWQpIiA8PCBlbmRsOwotCi0gICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoJGZ0eXBlID09ICIgPDwgTlNfUk9PVCA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy0+Iik7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICAgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgICIgICR4ZmVyICs9ICIgPDwgTlNfUk9PVCA8PCAiVFByb3RvY29sOjpza2lwQmluYXJ5KCRpbnB1dCwgJGZ0eXBlKTsiIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgICIgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgICAgIGluZGVudChvdXQpIDw8ICAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgICIgICR4ZmVyICs9ICIgPDwgTlNfUk9PVCA8PCAiVFByb3RvY29sOjpza2lwQmluYXJ5KCRpbnB1dCwgJGZ0eXBlKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAgIiAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50KG91dCkgPDwgICIgIGJyZWFrOyIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgaWYgKCFiaW5hcnlfaW5saW5lXykgewotICAgICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmICghYmluYXJ5X2lubGluZV8pIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInJldHVybiAkeGZlcjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgd3JpdGUoKSBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInB1YmxpYyBmdW5jdGlvbiB3cml0ZSgmJG91dHB1dCkgeyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkb3V0cHV0KSB7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF91cCgpOwotCi0gIGlmIChvb3BfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAkdGhpcy0+X3dyaXRlKCciIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIicsIHNlbGY6OiRfVFNQRUMsICRvdXRwdXQpOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiJHhmZXIgPSAwOyIgPDwgZW5kbDsKLQotICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKCR0aGlzLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIHN0cmluZyBleHBlY3Q7Ci0gICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBleHBlY3QgPSAiYXJyYXkiOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICAgIGV4cGVjdCA9ICJvYmplY3QiOwotICAgIH0KLSAgICBpZiAoIWV4cGVjdC5lbXB0eSgpKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICghaXNfIiA8PCBleHBlY3QgPDwgIigkdGhpcy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidGhyb3cgbmV3ICIgPDwgTlNfUk9PVCA8PCAiVFByb3RvY29sRXhjZXB0aW9uKCdCYWQgdHlwZSBpbiBzdHJ1Y3R1cmUuJywgIiA8PCBOU19ST09UIDw8ICJUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7IiA8PCBlbmRsOwotICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgIH0KLQotICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCduJywgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oIiA8PAotICAgICAgICAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8Ci0gICAgICAgIE5TX1JPT1QgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy0+Iik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAifSIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIgPDwgTlNfUk9PVCA8PCAiVFR5cGU6OlNUT1ApOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiAkeGZlcjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfK3NlcnZpY2VfbmFtZV8rIi5waHAiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCAiPD9waHAiIDw8IGVuZGw7Ci0gIGlmKG5hbWVzcGFjZV9waHBfKSBmX3NlcnZpY2VfIDw8ICJuYW1lc3BhY2UgIiA8PCBwaHBfbmFtZXNwYWNlX3N1ZmZpeCh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgIjsiIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBwaHBfaW5jbHVkZXMoKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgImluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3BhY2thZ2VzLyIgPDwgcGhwX3BhdGgocHJvZ3JhbV8pIDw8ICIvIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXMucGhwJzsiIDw8IGVuZGw7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAiaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvcGFja2FnZXMvIiA8PCBwaHBfcGF0aCh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSkgPDwgIi8iIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICIucGhwJzsiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZSAod2VsbCwgdHdvIGZvciBub3cgaW4gUEhQKQotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGlmIChyZXN0XykgewotICAgIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0c2VydmljZSk7Ci0gIH0KLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBpZiAocGhwc18pIHsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSk7Ci0gIH0KLQotICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgZl9zZXJ2aWNlXyA8PCAiPz4iIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICIgZXh0ZW5kcyAiICsgcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSkgKyBleHRlbmRzICsgIlByb2Nlc3NvciI7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvciIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCAkaGFuZGxlcl8gPSBudWxsOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRoYW5kbGVyKSB7IiA8PCBlbmRsOwotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJHRoaXMtPmhhbmRsZXJfID0gJGhhbmRsZXI7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHBhcmVudDo6X19jb25zdHJ1Y3QoJGhhbmRsZXIpOyIgPDwgZW5kbDsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKCRpbnB1dCwgJG91dHB1dCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICIkcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJGZuYW1lID0gbnVsbDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJG10eXBlID0gMDsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgIHRfZmllbGQgZmZuYW1lKGdfdHlwZV9zdHJpbmcsICJmbmFtZSIpOwotICAgIHRfZmllbGQgZm10eXBlKGdfdHlwZV9ieXRlLCAibXR5cGUiKTsKLSAgICB0X2ZpZWxkIGZzZXFpZChnX3R5cGVfaTMyLCAicnNlcWlkIik7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoZl9zZXJ2aWNlXywgJmZmbmFtZSwgIiIsIHRydWUpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGZfc2VydmljZV8sICZmbXR5cGUsICIiLCB0cnVlKTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfLCAmZnNlcWlkLCAiIiwgdHJ1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VCZWdpbigkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gSE9UOiBjaGVjayBmb3IgbWV0aG9kIGltcGxlbWVudGF0aW9uCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiJG1ldGhvZG5hbWUgPSAncHJvY2Vzc18nLiRmbmFtZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKCFtZXRob2RfZXhpc3RzKCR0aGlzLCAkbWV0aG9kbmFtZSkpIHsiIDw8IGVuZGw7Ci0gIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IG5ldyBFeGNlcHRpb24oJ0Z1bmN0aW9uICcuJGZuYW1lLicgbm90IGltcGxlbWVudGVkLicpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAkaW5wdXQtPnNraXAoIiA8PCBOU19ST09UIDw8ICJUVHlwZTo6U1RSVUNUKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICR4ID0gbmV3ICIgPDwgTlNfUk9PVCA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCdGdW5jdGlvbiAnLiRmbmFtZS4nIG5vdCBpbXBsZW1lbnRlZC4nLCAiIDw8IE5TX1JPT1QgPDwgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJGZuYW1lLCAiIDw8IE5TX1JPT1QgPDwgIlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OLCAkcnNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICR4LT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICRvdXRwdXQtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJG91dHB1dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm47IiA8PCBlbmRsOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkdGhpcy0+JG1ldGhvZG5hbWUoJHJzZXFpZCwgJGlucHV0LCAkb3V0cHV0KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIC8vIE9wZW4gZnVuY3Rpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInByb3RlY3RlZCBmdW5jdGlvbiBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgIigkc2VxaWQsICRpbnB1dCwgJG91dHB1dCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICIkYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJGFyZ3MtPnJlYWQoJGlucHV0KTsiIDw8IGVuZGw7Ci0gIGlmICghYmluYXJ5X2lubGluZV8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJGlucHV0LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiRyZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCi0gIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiJHJlc3VsdC0+c3VjY2VzcyA9ICI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICIkdGhpcy0+aGFuZGxlcl8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIiRhcmdzLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IGNhdGNoICgiIDw8IHBocF9uYW1lc3BhY2UoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfcHJvZ3JhbSgpKSA8PCAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgIiAkIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkcmVzdWx0LT4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJCIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgfQotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIHJldHVybjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiJGJpbl9hY2NlbCA9ICgkb3V0cHV0IGluc3RhbmNlb2YgIiA8PCBOU19ST09UIDw8ICJUUHJvdG9jb2w6OiRUQklOQVJZUFJPVE9DT0xBQ0NFTEVSQVRFRCkgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5Jyk7IiA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKCRiaW5fYWNjZWwpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkoJG91dHB1dCwgJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8IE5TX1JPT1QgPDwgIlRNZXNzYWdlVHlwZTo6UkVQTFksICRyZXN1bHQsICRzZXFpZCwgJG91dHB1dC0+aXNTdHJpY3RXcml0ZSgpKTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCi0gIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIkYnVmZiA9IHBhY2soJ04nLCAoMHg4MDAxMDAwMCB8ICIgPDwgTlNfUk9PVCA8PCAiVE1lc3NhZ2VUeXBlOjpSRVBMWSkpOyAiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkYnVmZiAuPSBwYWNrKCdOJywgc3RybGVuKCciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJykpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRidWZmIC49ICciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkYnVmZiAuPSBwYWNrKCdOJywgJHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkcmVzdWx0LT53cml0ZSgkYnVmZik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGUoJGJ1ZmYpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQtPmZsdXNoKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsICIgPDwgTlNfUk9PVCA8PCAiVE1lc3NhZ2VUeXBlOjpSRVBMWSwgJHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkcmVzdWx0LT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gIC8vIENsb3NlIGZ1bmN0aW9uCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICIvLyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgc3RyaW5nIG5hbWUgPSB0cy0+Z2V0X25hbWUoKTsKLSAgICB0cy0+c2V0X25hbWUoc2VydmljZV9uYW1lXyArICJfIiArIG5hbWUpOwotICAgIGdlbmVyYXRlX3BocF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX3BocF9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICAgIHRzLT5zZXRfbmFtZShuYW1lKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgICB9Ci0KLSAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gICAgfQotCi0gICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2lmID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9ICIgZXh0ZW5kcyAiICsgcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSkgKyB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKTsKLSAgICBleHRlbmRzX2lmID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKSArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpICsgIklmIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgImludGVyZmFjZSAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmIiA8PCBleHRlbmRzX2lmIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyBmdW5jdGlvbiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBSRVNUIGludGVyZmFjZQotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZXN0KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKSArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOwotICAgIGV4dGVuZHNfaWYgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgKyAiUmVzdCI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlJlc3QiIDw8IGV4dGVuZHNfaWYgPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCAkaW1wbF87IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGltcGwpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAkdGhpcy0+aW1wbF8gPSAkaW1wbDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljIGZ1bmN0aW9uICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoJHJlcXVlc3QpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgewotICAgICAgdF90eXBlKiBhdHlwZSA9IGdldF90cnVlX3R5cGUoKCphX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIHN0cmluZyBjYXN0ID0gdHlwZV90b19jYXN0KGF0eXBlKTsKLSAgICAgIHN0cmluZyByZXEgPSAiJHJlcXVlc3RbJyIgKyAoKmFfaXRlciktPmdldF9uYW1lKCkgKyAiJ10iOwotICAgICAgaWYgKGF0eXBlLT5pc19ib29sKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgY2FzdCA8PCAiKCFlbXB0eSgiIDw8IHJlcSA8PCAiKSAmJiAoIiA8PCByZXEgPDwgIiAhPT0gJ2ZhbHNlJykpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBpc3NldCgiIDw8IHJlcSA8PCAiKSA/ICIgPDwgY2FzdCA8PCByZXEgPDwgIiA6IG51bGw7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaWYgKGF0eXBlLT5pc19zdHJpbmcoKSAmJgotICAgICAgICAgICgodF9iYXNlX3R5cGUqKWF0eXBlKS0+aXNfc3RyaW5nX2xpc3QoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZXhwbG9kZSgnLCcsICQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKGF0eXBlLT5pc19tYXAoKSB8fCBhdHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBqc29uX2RlY29kZSgkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgdHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIGlmIChhdHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGFycmF5X2ZpbGxfa2V5cyhqc29uX2RlY29kZSgkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgdHJ1ZSksIDEpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSBpZiAoYXR5cGUtPmlzX3N0cnVjdCgpIHx8IGF0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBuZXcgIiA8PCBwaHBfbmFtZXNwYWNlKGF0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCBhdHlwZS0+Z2V0X25hbWUoKSA8PCAiKGpzb25fZGVjb2RlKCQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCB0cnVlKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gJHRoaXMtPmltcGxfLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgYXJndW1lbnRfbGlzdCgoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIGlmIChhdXRvbG9hZF8pIHsKLSAgICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gICAgb2ZzdHJlYW0gYXV0b2xvYWRfb3V0OwotICAgIHN0cmluZyBmX3N0cnVjdCA9IHByb2dyYW1fbmFtZV8rIi4iKyh0c2VydmljZS0+Z2V0X25hbWUoKSkrIi5jbGllbnQucGhwIjsKLSAgICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXytmX3N0cnVjdDsKLSAgICBhdXRvbG9hZF9vdXQub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwotICAgIGF1dG9sb2FkX291dCA8PCAiPD9waHAiIDw8IGVuZGw7Ci0gICAgX2dlbmVyYXRlX3NlcnZpY2VfY2xpZW50KGF1dG9sb2FkX291dCwgdHNlcnZpY2UpOwotICAgIGF1dG9sb2FkX291dCA8PCBlbmRsIDw8ICI/PiIgPDwgZW5kbDsKLSAgICBhdXRvbG9hZF9vdXQuY2xvc2UoKTsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICIkR0xPQkFMU1snVEhSSUZUX0FVVE9MT0FEJ11bJyIgPDwgbG93ZXJjYXNlKHNlcnZpY2VfbmFtZV8gKyAiQ2xpZW50IikgPDwgIiddID0gJyIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiLyIgPDwgZl9zdHJ1Y3QgPDwgIic7IiA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgX2dlbmVyYXRlX3NlcnZpY2VfY2xpZW50KGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6Ol9nZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKTsKLSAgICBleHRlbmRzX2NsaWVudCA9ICIgZXh0ZW5kcyAiICsgcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSkgKyBleHRlbmRzICsgIkNsaWVudCI7Ci0gIH0KLQotICBvdXQgPDwKLSAgICAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICIgaW1wbGVtZW50cyAiIDw8ICAobmFtZXNwYWNlX3BocF8gPyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA6ICIiKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBQcml2YXRlIG1lbWJlcnMKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCAkaW5wdXRfID0gbnVsbDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJG91dHB1dF8gPSBudWxsOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJHNlcWlkXyA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgLy8gQ29uc3RydWN0b3IgZnVuY3Rpb24KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaW5wdXQsICRvdXRwdXQ9bnVsbCkgeyIgPDwgZW5kbDsKLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHBhcmVudDo6X19jb25zdHJ1Y3QoJGlucHV0LCAkb3V0cHV0KTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAkdGhpcy0+aW5wdXRfID0gJGlucHV0OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJHRoaXMtPm91dHB1dF8gPSAkb3V0cHV0ID8gJG91dHB1dCA6ICRpbnB1dDsiIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAicHVibGljIGZ1bmN0aW9uICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICIkdGhpcy0+c2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOwotCi0gICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICIsICI7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8ICIkIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgICBvdXQgPDwgInJldHVybiAiOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgICIkdGhpcy0+cmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInB1YmxpYyBmdW5jdGlvbiBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSAobmFtZXNwYWNlX3BocF8gPyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA6ICIiKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKLQotICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiRhcmdzLT4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAkIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkYmluX2FjY2VsID0gKCR0aGlzLT5vdXRwdXRfIGluc3RhbmNlb2YgIiA8PCBOU19ST09UIDw8ICJUUHJvdG9jb2w6OiRUQklOQVJZUFJPVE9DT0xBQ0NFTEVSQVRFRCkgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5Jyk7IiA8PCBlbmRsOwotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICgkYmluX2FjY2VsKSIgPDwgZW5kbDsKLSAgICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgkdGhpcy0+b3V0cHV0XywgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8IE5TX1JPT1QgPDwgIlRNZXNzYWdlVHlwZTo6Q0FMTCwgJGFyZ3MsICR0aGlzLT5zZXFpZF8sICR0aGlzLT5vdXRwdXRfLT5pc1N0cmljdFdyaXRlKCkpOyIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkYnVmZiA9IHBhY2soJ04nLCAoMHg4MDAxMDAwMCB8ICIgPDwgTlNfUk9PVCA8PCAiVE1lc3NhZ2VUeXBlOjpDQUxMKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiRidWZmIC49IHBhY2soJ04nLCBzdHJsZW4oJyIgPDwgZnVubmFtZSA8PCAiJykpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkYnVmZiAuPSAnIiA8PCBmdW5uYW1lIDw8ICInOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkYnVmZiAuPSBwYWNrKCdOJywgJHRoaXMtPnNlcWlkXyk7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiR0aGlzLT5vdXRwdXRfLT53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIgPDwgTlNfUk9PVCA8PCAiVE1lc3NhZ2VUeXBlOjpDQUxMLCAkdGhpcy0+c2VxaWRfKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KLSAgICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJGFyZ3MtPndyaXRlKCRidWZmKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJHRoaXMtPm91dHB1dF8tPndyaXRlKCRidWZmKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJHRoaXMtPm91dHB1dF8tPmZsdXNoKCk7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiRhcmdzLT53cml0ZSgkdGhpcy0+b3V0cHV0Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiR0aGlzLT5vdXRwdXRfLT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJHRoaXMtPm91dHB1dF8tPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0gcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLQotICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBvdXQgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkYmluX2FjY2VsID0gKCR0aGlzLT5pbnB1dF8gaW5zdGFuY2VvZiAiIDw8IE5TX1JPT1QgPDwgIlRQcm90b2NvbDo6JFRCSU5BUllQUk9UT0NPTEFDQ0VMRVJBVEVEKSIKLSAgICAgICAgICAgICAgICAgPDwgIiAmJiBmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeScpOyIgPDwgZW5kbDsKLQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoJGJpbl9hY2NlbCkgJHJlc3VsdCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSgkdGhpcy0+aW5wdXRfLCAnIiA8PCByZXN1bHRuYW1lIDw8ICInLCAkdGhpcy0+aW5wdXRfLT5pc1N0cmljdFJlYWQoKSk7IiA8PCBlbmRsOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRmbmFtZSA9IG51bGw7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkbXR5cGUgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotCi0gICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgICAgdF9maWVsZCBmZm5hbWUoZ190eXBlX3N0cmluZywgImZuYW1lIik7Ci0gICAgICAgIHRfZmllbGQgZnNlcWlkKGdfdHlwZV9pMzIsICJyc2VxaWQiKTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiR2ZXIgPSB1bnBhY2soJ04nLCAkdGhpcy0+aW5wdXRfLT5yZWFkQWxsKDQpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJHZlciA9ICR2ZXJbMV07IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiRtdHlwZSA9ICR2ZXIgJiAweGZmOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkdmVyID0gJHZlciAmIDB4ZmZmZjAwMDA7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkdmVyICE9IDB4ODAwMTAwMDApIHRocm93IG5ldyAiIDw8IE5TX1JPT1QgPDwgIlRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaWRlbnRpZmllcjogJy4kdmVyLCAiIDw8IE5TX1JPT1QgPDwgIlRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04pOyIgPDwgZW5kbDsKLSAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmZuYW1lLCAiIiwgdHJ1ZSk7Ci0gICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZzZXFpZCwgIiIsIHRydWUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8tPnJlYWRNZXNzYWdlQmVnaW4oJGZuYW1lLCAkbXR5cGUsICRyc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoJG10eXBlID09ICIgPDwgTlNfUk9PVCA8PCAiVE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAkeCA9IG5ldyAiIDw8IE5TX1JPT1QgPDwgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICR4LT5yZWFkKCR0aGlzLT5pbnB1dF8pOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICR0aGlzLT5pbnB1dF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgJHg7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+cmVhZCgkdGhpcy0+aW5wdXRfKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGlmICghYmluYXJ5X2lubGluZV8pIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIHJlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoJHJlc3VsdC0+c3VjY2VzcyAhPT0gbnVsbCkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAkcmVzdWx0LT5zdWNjZXNzOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCRyZXN1bHQtPiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IG51bGwpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyAkcmVzdWx0LT4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInRocm93IG5ldyAiIDw8IE5TX1JPT1QgPDwgIkV4Y2VwdGlvbihcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcykgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gIH0gZWxzZSB7Ci0KLSAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgICBzdGQ6OnN0cmluZyBpdHJhbnMgPSAoaW5jbGFzcyA/ICIkdGhpcy0+aW5wdXRfIiA6ICIkaW5wdXQiKTsKLQotICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsKLSAgICAgICAgICAgICAgbmFtZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkbGVuID0gdW5wYWNrKCdOJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCg0KSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkbGVuID0gJGxlblsxXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkbGVuID4gMHg3ZmZmZmZmZikgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAkbGVuID0gMCAtICgoJGxlbiAtIDEpIF4gMHhmZmZmZmZmZik7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKCRsZW4pOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gdW5wYWNrKCdjJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCgxKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAoYm9vbCkkIiA8PCBuYW1lIDw8ICJbMV07IiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSB1bnBhY2soJ2MnLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDEpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9ICQiIDw8IG5hbWUgPDwgIlsxXTsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJHZhbCA9IHVucGFjaygnbicsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoMikpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJHZhbCA9ICR2YWxbMV07IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoJHZhbCA+IDB4N2ZmZikgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAkdmFsID0gMCAtICgoJHZhbCAtIDEpIF4gMHhmZmZmKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9ICR2YWw7IiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiR2YWwgPSB1bnBhY2soJ04nLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDQpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiR2YWwgPSAkdmFsWzFdOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCR2YWwgPiAweDdmZmZmZmZmKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICR2YWwgPSAwIC0gKCgkdmFsIC0gMSkgXiAweGZmZmZmZmZmKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9ICR2YWw7IiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiRhcnIgPSB1bnBhY2soJ04yJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCg4KSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoJGFyclsxXSAmIDB4ODAwMDAwMDApIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgJGFyclsxXSA9ICRhcnJbMV0gXiAweEZGRkZGRkZGOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAkYXJyWzJdID0gJGFyclsyXSBeIDB4RkZGRkZGRkY7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICQiIDw8IG5hbWUgPDwgIiA9IDAgLSAkYXJyWzFdKjQyOTQ5NjcyOTYgLSAkYXJyWzJdIC0gMTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICQiIDw8IG5hbWUgPDwgIiA9ICRhcnJbMV0qNDI5NDk2NzI5NiArICRhcnJbMl07IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiRhcnIgPSB1bnBhY2soJ2QnLCBzdHJyZXYoIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCg4KSkpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJGFyclsxXTsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJHZhbCA9IHVucGFjaygnTicsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoNCkpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJHZhbCA9ICR2YWxbMV07IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoJHZhbCA+IDB4N2ZmZmZmZmYpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgJHZhbCA9IDAgLSAoKCR2YWwgLSAxKSBeIDB4ZmZmZmZmZmYpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJHZhbDsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAiJHhmZXIgKz0gJGlucHV0LT4iOwotCi0gICAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKwotICAgICAgICAgICAgICBuYW1lOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgICAgb3V0IDw8ICJyZWFkQm9vbCgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgICAgIG91dCA8PCAicmVhZEkzMigkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgdmFyaWFibGUuIFRoaXMgbWFrZXMgdHdvIGtleSBhc3N1bXB0aW9ucywKLSAqIGZpcnN0IHRoYXQgdGhlcmUgaXMgYSBjb25zdCBjaGFyKiB2YXJpYWJsZSBuYW1lZCBkYXRhIHRoYXQgcG9pbnRzIHRvIHRoZQotICogYnVmZmVyIGZvciBkZXNlcmlhbGl6YXRpb24sIGFuZCB0aGF0IHRoZXJlIGlzIGEgdmFyaWFibGUgcHJvdG9jb2wgd2hpY2gKLSAqIGlzIGEgcmVmZXJlbmNlIHRvIGEgVFByb3RvY29sIHNlcmlhbGl6YXRpb24gb2JqZWN0LgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHBocF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICQiIDw8IHByZWZpeCA8PCAiLT5yZWFkKCRpbnB1dCk7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7Ci0gIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7Ci0gIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7Ci0KLSAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKLSAgdF9maWVsZCBma3R5cGUoZ190eXBlX2J5dGUsIGt0eXBlKTsKLSAgdF9maWVsZCBmdnR5cGUoZ190eXBlX2J5dGUsIHZ0eXBlKTsKLSAgdF9maWVsZCBmZXR5cGUoZ190eXBlX2J5dGUsIGV0eXBlKTsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSBhcnJheSgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkIiA8PCBzaXplIDw8ICIgPSAwOyIgPDwgZW5kbDsKLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IGt0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IHZ0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbDsKLSAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrdHlwZSk7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdnR5cGUpOwotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEJlZ2luKCIgPDwKLSAgICAgICAgIiQiIDw8IGt0eXBlIDw8ICIsICQiIDw8IHZ0eXBlIDw8ICIsICQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZldHlwZSk7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmc2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgZXR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRCZWdpbigiIDw8Ci0gICAgICAgICIkIiA8PCBldHlwZSA8PCAiLCAkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmV0eXBlKTsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZzaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBldHlwZSA8PCAiID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RCZWdpbigiIDw8Ci0gICAgICAgICIkIiA8PCBldHlwZSA8PCAiLCAkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJmb3IgKCQiIDw8Ci0gICAgaSA8PCAiID0gMDsgJCIgPDwgaSA8PCAiIDwgJCIgPDwgc2l6ZSA8PCAiOyArKyQiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKLSAgICB9Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKCFiaW5hcnlfaW5saW5lXykgewotICAgIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgia2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoInZhbCIpOwotICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZrZXksIHRydWUsIHRydWUpIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZnZhbCwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiJCIgPDwgcHJlZml4IDw8ICJbJCIgPDwga2V5IDw8ICJdID0gJCIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICIkIiA8PCBlbGVtIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImlmIChpc19zY2FsYXIoJCIgPDwgZWxlbSA8PCAiKSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgJCIgPDwgcHJlZml4IDw8ICJbJCIgPDwgZWxlbSA8PCAiXSA9IHRydWU7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICQiIDw8IHByZWZpeCA8PCAiIFtdPSAkIiA8PCBlbGVtIDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiJCIgPDwgZWxlbSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIiQiIDw8IHByZWZpeCA8PCAiIFtdPSAkIiA8PCBlbGVtIDw8ICI7IiA8PCBlbmRsOwotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ04nLCBzdHJsZW4oJCIgPDwgbmFtZSA8PCAiKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSAkIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgJCIgPDwgbmFtZSA8PCAiID8gMSA6IDApOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICQiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ24nLCAkIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdOJywgJCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnTjInLCAkIiA8PCBuYW1lIDw8ICIgPj4gMzIsICQiIDw8IG5hbWUgPDwgIiAmIDB4RkZGRkZGRkYpOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBzdHJyZXYocGFjaygnZCcsICQiIDw8IG5hbWUgPDwgIikpOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ04nLCAkIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotCi0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJHhmZXIgKz0gJG91dHB1dC0+IjsKLQotICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgIG91dCA8PCAid3JpdGVJMTYoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgIiR4ZmVyICs9ICQiIDw8IHByZWZpeCA8PCAiLT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogV3JpdGVzIG91dCBhIGNvbnRhaW5lcgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHN0cnJldihwYWNrKCdsJywgY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKSk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJG91dHB1dC0+d3JpdGVNYXBCZWdpbigiIDw8Ci0gICAgICAgIE5TX1JPT1QgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgTlNfUk9PVCA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICAiY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHN0cnJldihwYWNrKCdsJywgY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKSk7IiA8PCBlbmRsOwotCi0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICIkb3V0cHV0LT53cml0ZVNldEJlZ2luKCIgPDwKLSAgICAgICAgTlNfUk9PVCA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgImNvdW50KCQiIDw8IHByZWZpeCA8PCAiKSk7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHN0cnJldihwYWNrKCdsJywgY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKSk7IiA8PCBlbmRsOwotCi0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICIkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigiIDw8Ci0gICAgICAgIE5TX1JPT1QgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICAiY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGtpdGVyID0gdG1wKCJraXRlciIpOwotICAgIHN0cmluZyB2aXRlciA9IHRtcCgidml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvcmVhY2ggKCQiIDw8IHByZWZpeCA8PCAiIGFzICIgPDwKLSAgICAgICIkIiA8PCBraXRlciA8PCAiID0+ICQiIDw8IHZpdGVyIDw8ICIpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvcmVhY2ggKCQiIDw8IHByZWZpeCA8PCAiIGFzICQiIDw8IGl0ZXIgPDwgIikiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGlzX3NjYWxhcigkIiA8PCBpdGVyIDw8ICIpKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAkIiA8PCBwcmVmaXggPDwgIlskIiA8PCBpdGVyIDw8ICJdID0gdHJ1ZTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvcmVhY2ggKCQiIDw8IHByZWZpeCA8PCAiIGFzICQiIDw8IGl0ZXIgPDwgIikiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiRvdXRwdXQtPndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJG91dHB1dC0+d3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOwotCi0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X3BocF9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIGJvb2wgb2JqKSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiJCIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIGlmIChpbml0KSB7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXN1bHQgKz0gIiA9ICcnIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwLjAiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIGluaXRpYWxpemVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBhcnJheSgpIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIGlmIChvYmopIHsKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHBocF9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgKyB0eXBlLT5nZXRfbmFtZSgpICsgIigpIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQgKyAiOyI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgcmV0dXJuCi0gICAgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsKLSAgICAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gIiQiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogR2V0cyBhIHR5cGVjYXN0IHN0cmluZyBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUuCi0gKi8KLXN0cmluZyB0X3BocF9nZW5lcmF0b3I6OnR5cGVfdG9fY2FzdCh0X3R5cGUqIHR5cGUpIHsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGUqIGJ0eXBlID0gKHRfYmFzZV90eXBlKil0eXBlOwotICAgIHN3aXRjaCAoYnR5cGUtPmdldF9iYXNlKCkpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIihib29sKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICIoaW50KSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIihkb3VibGUpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiKHN0cmluZykiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiKGludCkiOwotICB9Ci0gIHJldHVybiAiIjsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gKi8KLXN0cmluZyB0X3BocF9nZW5lcmF0b3IgOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZTo6U1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpCT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpCWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGU6OkkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpJMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZTo6STY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGU6OkRPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVFR5cGU6OkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGU6OlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpNQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6U0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpMU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKHBocCwgIlBIUCIsCi0iICAgIGlubGluZWQ6ICAgICAgICAgR2VuZXJhdGUgUEhQIGlubGluZWQgZmlsZXNcbiIKLSIgICAgc2VydmVyOiAgICAgICAgICBHZW5lcmF0ZSBQSFAgc2VydmVyIHN0dWJzXG4iCi0iICAgIGF1dG9sb2FkOiAgICAgICAgR2VuZXJhdGUgUEhQIHdpdGggYXV0b2xvYWRcbiIKLSIgICAgb29wOiAgICAgICAgICAgICBHZW5lcmF0ZSBQSFAgd2l0aCBvYmplY3Qgb3JpZW50ZWQgc3ViY2xhc3Nlc1xuIgotIiAgICByZXN0OiAgICAgICAgICAgIEdlbmVyYXRlIFBIUCBSRVNUIHByb2Nlc3NvcnNcbiIKLSIgICAgbmFtZXNwYWNlOiAgICAgICBHZW5lcmF0ZSBQSFAgbmFtZXNwYWNlcyBhcyBkZWZpbmVkIGluIFBIUCA+PSA1LjNcbiIKLSkKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhODJiZDcuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDIzOTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlICJ0X2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0KLS8qKgotICogUHl0aG9uIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9weV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9weV9nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgibmV3X3N0eWxlIik7Ci0gICAgZ2VuX25ld3N0eWxlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJ0d2lzdGVkIik7Ci0gICAgZ2VuX3R3aXN0ZWRfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInV0ZjhzdHJpbmdzIik7Ci0gICAgZ2VuX3V0ZjhzdHJpbmdzXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGlmIChnZW5fdHdpc3RlZF8pewotICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcHkudHdpc3RlZCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXB5IjsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgKHRfY29uc3QqICAgIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSwgYm9vbCBpc19yZXN1bHQ9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX3B5X3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3B5X2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcz1mYWxzZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogICAgdGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3ViaGVhZGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqIHRkb2MpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBweV9hdXRvZ2VuX2NvbW1lbnQoKTsKLSAgc3RkOjpzdHJpbmcgcHlfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2Zhc3RiaW5hcnlfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9hcmd1bWVudCh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9pZih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fc3BlY19hcmdzKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgewotICAgIHJldHVybiBzdWJfbmFtZXNwYWNlID09ICJ0d2lzdGVkIjsKLSAgfQotCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfcmVhbF9weV9tb2R1bGUoY29uc3QgdF9wcm9ncmFtKiBwcm9ncmFtLCBib29sIGdlbl90d2lzdGVkKSB7Ci0gICAgaWYoZ2VuX3R3aXN0ZWQpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHR3aXN0ZWRfbW9kdWxlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgicHkudHdpc3RlZCIpOwotICAgICAgaWYoIXR3aXN0ZWRfbW9kdWxlLmVtcHR5KCkpewotICAgICAgICByZXR1cm4gdHdpc3RlZF9tb2R1bGU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmcgcmVhbF9tb2R1bGUgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJweSIpOwotICAgIGlmIChyZWFsX21vZHVsZS5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gcHJvZ3JhbS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlYWxfbW9kdWxlOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgZ2VuZXJhdGUgbmV3LXN0eWxlIGNsYXNzZXMuCi0gICAqLwotICBib29sIGdlbl9uZXdzdHlsZV87Ci0KLSAgLyoqCi0gICAqIFRydWUgaWZmIHdlIHNob3VsZCBnZW5lcmF0ZSBUd2lzdGVkLWZyaWVuZGx5IFJQQyBzZXJ2aWNlcy4KLSAgICovCi0gIGJvb2wgZ2VuX3R3aXN0ZWRfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmZiBzdHJpbmdzIHNob3VsZCBiZSBlbmNvZGVkIHVzaW5nIHV0Zi04LgotICAgKi8KLSAgYm9vbCBnZW5fdXRmOHN0cmluZ3NfOwotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2NvbnN0c187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLQotICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87Ci0KLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBzdHJpbmcgbW9kdWxlID0gZ2V0X3JlYWxfcHlfbW9kdWxlKHByb2dyYW1fLCBnZW5fdHdpc3RlZF8pOwotICBwYWNrYWdlX2Rpcl8gPSBnZXRfb3V0X2RpcigpOwotICB3aGlsZSAodHJ1ZSkgewotICAgIC8vIFRPRE86IERvIGJldHRlciBlcnJvciBjaGVja2luZyBoZXJlLgotICAgIE1LRElSKHBhY2thZ2VfZGlyXy5jX3N0cigpKTsKLSAgICBzdGQ6Om9mc3RyZWFtIGluaXRfcHkoKHBhY2thZ2VfZGlyXysiL19faW5pdF9fLnB5IikuY19zdHIoKSk7Ci0gICAgaW5pdF9weS5jbG9zZSgpOwotICAgIGlmIChtb2R1bGUuZW1wdHkoKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IG1vZHVsZS5maW5kKCcuJyk7Ci0gICAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHBhY2thZ2VfZGlyXyArPSAiLyI7Ci0gICAgICBwYWNrYWdlX2Rpcl8gKz0gbW9kdWxlOwotICAgICAgbW9kdWxlLmNsZWFyKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBhY2thZ2VfZGlyXyArPSAiLyI7Ci0gICAgICBwYWNrYWdlX2Rpcl8gKz0gbW9kdWxlLnN1YnN0cigwLCBwb3MpOwotICAgICAgbW9kdWxlLmVyYXNlKDAsIHBvcysxKTsKLSAgICB9Ci0gIH0KLQotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3R5cGVzX25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iKyJ0dHlwZXMucHkiOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrImNvbnN0YW50cy5weSI7Ci0gIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIGZfaW5pdF9uYW1lID0gcGFja2FnZV9kaXJfKyIvX19pbml0X18ucHkiOwotICBvZnN0cmVhbSBmX2luaXQ7Ci0gIGZfaW5pdC5vcGVuKGZfaW5pdF9uYW1lLmNfc3RyKCkpOwotICBmX2luaXQgIDw8Ci0gICAgIl9fYWxsX18gPSBbJ3R0eXBlcycsICdjb25zdGFudHMnIjsKLSAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOwotICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7Ci0gIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgewotICAgIGZfaW5pdCA8PCAiLCAnIiA8PCAoKnN2X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIjsKLSAgfQotICBmX2luaXQgPDwgIl0iIDw8IGVuZGw7Ci0gIGZfaW5pdC5jbG9zZSgpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PAotICAgIHB5X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICBweV9pbXBvcnRzKCkgPDwgZW5kbCA8PAotICAgIHJlbmRlcl9pbmNsdWRlcygpIDw8IGVuZGwgPDwKLSAgICByZW5kZXJfZmFzdGJpbmFyeV9pbmNsdWRlcygpIDw8Ci0gICAgZW5kbCA8PCBlbmRsOwotCi0gIGZfY29uc3RzXyA8PAotICAgIHB5X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICBweV9pbXBvcnRzKCkgPDwgZW5kbCA8PAotICAgICJmcm9tIHR0eXBlcyBpbXBvcnQgKiIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlcygpIHsKLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgcmVzdWx0ICs9ICJpbXBvcnQgIiArIGdldF9yZWFsX3B5X21vZHVsZShpbmNsdWRlc1tpXSwgZ2VuX3R3aXN0ZWRfKSArICIudHR5cGVzXG4iOwotICB9Ci0gIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7Ci0gICAgcmVzdWx0ICs9ICJcbiI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgdG8gdXNlIHRoZSBhY2NlbGVyYXRlZCBUQmluYXJ5UHJvdG9jb2wKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpyZW5kZXJfZmFzdGJpbmFyeV9pbmNsdWRlcygpIHsKLSAgcmV0dXJuCi0gICAgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydFxuIgotICAgICJmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sLCBUUHJvdG9jb2xcbiIKLSAgICAidHJ5OlxuIgotICAgICIgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBmYXN0YmluYXJ5XG4iCi0gICAgImV4Y2VwdDpcbiIKLSAgICAiICBmYXN0YmluYXJ5ID0gTm9uZVxuIjsKLX0KLQotLyoqCi0gKiBBdXRvZ2VuJ2QgY29tbWVudAotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OnB5X2F1dG9nZW5fY29tbWVudCgpIHsKLSAgcmV0dXJuCi0gICAgc3RkOjpzdHJpbmcoIiNcbiIpICsKLSAgICAiIyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIgKwotICAgICIjXG4iICsKLSAgICAiIyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsKLSAgICAiI1xuIjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgdGhyaWZ0IGltcG9ydHMKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpweV9pbXBvcnRzKCkgewotICByZXR1cm4KLSAgICBzdHJpbmcoImZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgKiIpOwotfQotCi0vKioKLSAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcwotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIHR5cGVzIGZpbGUKLSAgZl90eXBlc18uY2xvc2UoKTsKLSAgZl9jb25zdHNfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBQeXRob24sIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gICh2b2lkKSB0dHlwZWRlZjsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBEb25lIHVzaW5nIGEgY2xhc3MgdG8gc2NvcGUKLSAqIHRoZSB2YWx1ZXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHRvX3N0cmluZ19tYXBwaW5nLCBmcm9tX3N0cmluZ19tYXBwaW5nOwotCi0gIGZfdHlwZXNfIDw8Ci0gICAgImNsYXNzICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwKLSAgICAoZ2VuX25ld3N0eWxlXyA/ICIob2JqZWN0KSIgOiAiIikgPDwKLSAgICAiOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoZl90eXBlc18sIHRlbnVtKTsKLQotICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiX1ZBTFVFU19UT19OQU1FUyA9IHsiIDw8IGVuZGw7Ci0gIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIl9OQU1FU19UT19WQUxVRVMgPSB7IiA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGluZGVudChmX3R5cGVzXykgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlIDw8IGVuZGw7Ci0KLSAgICAvLyBEaWN0aW9uYXJpZXMgdG8vZnJvbSBzdHJpbmcgbmFtZXMgb2YgZW51bXMKLSAgICB0b19zdHJpbmdfbWFwcGluZyA8PAotICAgICAgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgdmFsdWUgPDwgIjogXCIiIDw8Ci0gICAgICBlc2NhcGVfc3RyaW5nKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIlwiLCIgPDwgZW5kbDsKLSAgICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAnIicgPDwgZXNjYXBlX3N0cmluZygoKmNfaXRlciktPmdldF9uYW1lKCkpIDw8Ci0gICAgICAiXCI6ICIgPDwgdmFsdWUgPDwgJywnIDw8IGVuZGw7Ci0gIH0KLSAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl90eXBlc18gPDwgZW5kbDsKLSAgZl90eXBlc18gPDwgdG9fc3RyaW5nX21hcHBpbmcuc3RyKCkgPDwgZW5kbCA8PCBmcm9tX3N0cmluZ19tYXBwaW5nLnN0cigpIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIGluZGVudChmX2NvbnN0c18pIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKLSAgZl9jb25zdHNfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gIlRydWUiIDogIkZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIigqKnsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA6ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIG91dCA8PCAieyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIG91dCA8PCAiIDogIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgb3V0IDw8ICJzZXQoIjsKLSAgICB9Ci0gICAgb3V0IDw8ICJbIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIl0iOwotICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgb3V0IDw8ICIpIjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHB5dGhvbiBzdHJ1Y3QKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX3B5X3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfcHlfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHl0aG9uIHN0cnVjdAotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewotICAodm9pZCkgaXNfcmVzdWx0OwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgc29ydGVkX21lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIG91dCA8PCBzdGQ6OmVuZGwgPDwKLSAgICAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICIoRXhjZXB0aW9uKSI7Ci0gIH0gZWxzZSBpZiAoZ2VuX25ld3N0eWxlXykgewotICAgIG91dCA8PCAiKG9iamVjdCkiOwotICB9Ci0gIG91dCA8PAotICAgICI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvdXQsIHRzdHJ1Y3QpOwotCi0gIG91dCA8PCBlbmRsOwotCi0gIC8qCi0gICAgIEhlcmUgd2UgZ2VuZXJhdGUgdGhlIHN0cnVjdHVyZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgZmFzdGJpbmFyeSBjb2RlYy4KLSAgICAgVGhlc2Ugc3BlY2lmaWNhdGlvbnMgaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKLSAgICAgdGhyaWZ0X3NwZWMgLT4gdHVwbGUgb2YgaXRlbV9zcGVjCi0gICAgIGl0ZW1fc3BlYyAtPiBOb25lIHwgKHRhZywgdHlwZV9lbnVtLCBuYW1lLCBzcGVjX2FyZ3MsIGRlZmF1bHQpCi0gICAgIHRhZyAtPiBpbnRlZ2VyCi0gICAgIHR5cGVfZW51bSAtPiBUVHlwZS5JMzIgfCBUVHlwZS5TVFJJTkcgfCBUVHlwZS5TVFJVQ1QgfCAuLi4KLSAgICAgbmFtZSAtPiBzdHJpbmdfbGl0ZXJhbAotICAgICBkZWZhdWx0IC0+IE5vbmUgICMgSGFuZGxlZCBieSBfX2luaXRfXwotICAgICBzcGVjX2FyZ3MgLT4gTm9uZSAgIyBGb3Igc2ltcGxlIHR5cGVzCi0gICAgICAgICAgICAgICAgfCAodHlwZV9lbnVtLCBzcGVjX2FyZ3MpICAjIFZhbHVlIHR5cGUgZm9yIGxpc3Qvc2V0Ci0gICAgICAgICAgICAgICAgfCAodHlwZV9lbnVtLCBzcGVjX2FyZ3MsIHR5cGVfZW51bSwgc3BlY19hcmdzKQotICAgICAgICAgICAgICAgICAgIyBLZXkgYW5kIHZhbHVlIGZvciBtYXAKLSAgICAgICAgICAgICAgICB8IChjbGFzc19uYW1lLCBzcGVjX2FyZ3NfcHRyKSAjIEZvciBzdHJ1Y3QvZXhjZXB0aW9uCi0gICAgIGNsYXNzX25hbWUgLT4gaWRlbnRpZmllciAgIyBCYXNpY2FsbHkgYSBwb2ludGVyIHRvIHRoZSBjbGFzcwotICAgICBzcGVjX2FyZ3NfcHRyIC0+IGV4cHJlc3Npb24gICMganVzdCBjbGFzc19uYW1lLnNwZWNfYXJncwotCi0gICAgIFRPRE8oZHJlaXNzKTogQ29uc2lkZXIgbWFraW5nIHRoaXMgd29yayBmb3Igc3RydWN0cyB3aXRoIG5lZ2F0aXZlIHRhZ3MuCi0gICovCi0KLSAgLy8gVE9ETyhkcmVpc3MpOiBMb29rIGludG8gZ2VuZXJhdGluZyBhbiBlbXB0eSB0dXBsZSBpbnN0ZWFkIG9mIE5vbmUKLSAgLy8gZm9yIHN0cnVjdHVyZXMgd2l0aCBubyBtZW1iZXJzLgotICAvLyBUT0RPKGRyZWlzcyk6IFRlc3QgZW5jb2Rpbmcgb2Ygc3RydWN0cyB3aGVyZSBzb21lIGlubmVyIHN0cnVjdHMKLSAgLy8gZG9uJ3QgaGF2ZSB0aHJpZnRfc3BlYy4KLSAgaWYgKHNvcnRlZF9tZW1iZXJzLmVtcHR5KCkgfHwgKHNvcnRlZF9tZW1iZXJzWzBdLT5nZXRfa2V5KCkgPj0gMCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhyaWZ0X3NwZWMgPSAoIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgaW50IHNvcnRlZF9rZXlzX3BvcyA9IDA7Ci0gICAgZm9yIChtX2l0ZXIgPSBzb3J0ZWRfbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gc29ydGVkX21lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0KLSAgICAgIGZvciAoOyBzb3J0ZWRfa2V5c19wb3MgIT0gKCptX2l0ZXIpLT5nZXRfa2V5KCk7IHNvcnRlZF9rZXlzX3BvcysrKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJOb25lLCAjICIgPDwgc29ydGVkX2tleXNfcG9zIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICIoIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiLCAiCi0gICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgICAgICA8PCAiJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIiA8PCAiLCAiCi0gICAgICAgICAgICA8PCB0eXBlX3RvX3NwZWNfYXJncygoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgICAgIDw8IHJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKCptX2l0ZXIpIDw8ICIsICIKLSAgICAgICAgICAgIDw8ICIpLCIKLSAgICAgICAgICAgIDw8ICIgIyAiIDw8IHNvcnRlZF9rZXlzX3BvcwotICAgICAgICAgICAgPDwgZW5kbDsKLQotICAgICAgc29ydGVkX2tleXNfcG9zICsrOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIikiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhyaWZ0X3NwZWMgPSBOb25lIiA8PCBlbmRsOwotICB9Ci0KLQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZGVmIF9faW5pdF9fKHNlbGYsIjsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIC8vIFRoaXMgZmlsbHMgaW4gZGVmYXVsdCB2YWx1ZXMsIGFzIG9wcG9zZWQgdG8gbnVsbHMKLSAgICAgIG91dCA8PCAiICIgPDwgZGVjbGFyZV9hcmd1bWVudCgqbV9pdGVyKSA8PCAiLCI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIpOiIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgLy8gSW5pdGlhbGl6ZSBmaWVsZHMKLSAgICAgIHRfdHlwZSogdHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgIGlmICghdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR5cGUtPmlzX2VudW0oKSAmJiAoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAiaWYgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBpcyAiIDw8ICJzZWxmLnRocmlmdF9zcGVjWyIgPDwKLSAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICJdWzRdOiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwKLSAgICAgICAgICByZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSgqbV9pdGVyKSA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgInNlbGYuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIG91dCA8PCBlbmRsOwotICB9Ci0KLSAgZ2VuZXJhdGVfcHlfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9weV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0KLSAgLy8gRm9yIGV4Y2VwdGlvbnMgb25seSwgZ2VuZXJhdGUgYSBfX3N0cl9fIG1ldGhvZC4gVGhpcyBpcwotICAvLyBiZWNhdXNlIHdoZW4gcmFpc2VkIGV4Y2VwdGlvbnMgYXJlIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUsIF9fcmVwcl9fCi0gIC8vIGlzbid0IHVzZWQuIFNlZSBweXRob24gYnVnICM1ODgyCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJkZWYgX19zdHJfXyhzZWxmKToiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiByZXByKHNlbGYpIiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgLy8gUHJpbnRpbmcgdXRpbGl0aWVzIHNvIHRoYXQgb24gdGhlIGNvbW1hbmQgbGluZSB0aHJpZnQKLSAgLy8gc3RydWN0cyBsb29rIHByZXR0eSBsaWtlIGRpY3Rpb25hcmllcwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiZGVmIF9fcmVwcl9fKHNlbGYpOiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIEwgPSBbJyVzPSVyJyAlIChrZXksIHZhbHVlKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX2RpY3RfXy5pdGVyaXRlbXMoKV0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEVxdWFsaXR5IGFuZCBpbmVxdWFsaXR5IG1ldGhvZHMgdGhhdCBjb21wYXJlIGJ5IHZhbHVlCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJkZWYgX19lcV9fKHNlbGYsIG90aGVyKToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKSBhbmQgIgotICAgICAgICAgICAgICAgICJzZWxmLl9fZGljdF9fID09IG90aGVyLl9fZGljdF9fIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgZW5kbDsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgcmVhZCBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJkZWYgcmVhZChzZWxmLCBpcHJvdCk6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJpZiBpcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkICIKLSAgICAiYW5kIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSAiCi0gICAgImFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lICIKLSAgICAiYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJmYXN0YmluYXJ5LmRlY29kZV9iaW5hcnkoc2VsZiwgaXByb3QudHJhbnMsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgICJyZXR1cm4iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCkiIDw8IGVuZGw7Ci0KLSAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIndoaWxlIFRydWU6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKSIgPDwgZW5kbDsKLQotICAgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlmIGZ0eXBlID09IFRUeXBlLlNUT1A6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiYnJlYWsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0KLSAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImVsaWYgIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiZmlkID09ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiBmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLiIpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiZWxzZToiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3Quc2tpcChmdHlwZSkiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLQotICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICAiZWxzZToiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICAiICBpcHJvdC5za2lwKGZ0eXBlKSIgPDwgZW5kbDsKLQotICAgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaXByb3QucmVhZEZpZWxkRW5kKCkiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpcHJvdC5yZWFkU3RydWN0RW5kKCkiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiZGVmIHdyaXRlKHNlbGYsIG9wcm90KToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImlmIG9wcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgIgotICAgICJhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSAiCi0gICAgImFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAib3Byb3QudHJhbnMud3JpdGUoZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5KHNlbGYsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpKSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAicmV0dXJuIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oJyIgPDwgbmFtZSA8PCAiJykiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlmIHNlbGYuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBpcyBub3QgTm9uZToiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PAotICAgICAgIiciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIikiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLiIpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUZpZWxkRW5kKCkiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKLQotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PAotICAgIGVuZGw7Ci19Ci0KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgImRlZiB2YWxpZGF0ZShzZWxmKToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgc2VsZi4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgaXMgTm9uZToiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIgIHJhaXNlIFRQcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24obWVzc2FnZT0nUmVxdWlyZWQgZmllbGQgIiA8PAotICAgICAgICAgIGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgaXMgdW5zZXQhJykiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgInJldHVybiIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iK3NlcnZpY2VfbmFtZV8rIi5weSI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgcHlfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgIHB5X2ltcG9ydHMoKSA8PCBlbmRsOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgImltcG9ydCAiIDw8IGdldF9yZWFsX3B5X21vZHVsZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSwgZ2VuX3R3aXN0ZWRfKSA8PAotICAgICAgIi4iIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgImZyb20gdHR5cGVzIGltcG9ydCAqIiA8PCBlbmRsIDw8Ci0gICAgImZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVFByb2Nlc3NvciIgPDwgZW5kbCA8PAotICAgIHJlbmRlcl9mYXN0YmluYXJ5X2luY2x1ZGVzKCkgPDwgZW5kbDsKLQotICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgImZyb20gem9wZS5pbnRlcmZhY2UgaW1wb3J0IEludGVyZmFjZSwgaW1wbGVtZW50cyIgPDwgZW5kbCA8PAotICAgICAgImZyb20gdHdpc3RlZC5pbnRlcm5ldCBpbXBvcnQgZGVmZXIiIDw8IGVuZGwgPDwKLSAgICAgICJmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUd2lzdGVkIiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQSFApCi0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlKHRzZXJ2aWNlKTsKLQotICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICAiIyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7Ci0gICAgZ2VuZXJhdGVfcHlfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgICB9Ci0KLSAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gICAgfQotICAgIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2lmID0gIigiICsgZXh0ZW5kcyArICIuSWZhY2UpIjsKLSAgfSBlbHNlIHsKLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICBleHRlbmRzX2lmID0gIihJbnRlcmZhY2UpIjsKLSAgICB9IGVsc2UgaWYgKGdlbl9uZXdzdHlsZV8pIHsKLSAgICAgIGV4dGVuZHNfaWYgPSAiKG9iamVjdCkiOwotICAgIH0KLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICAiY2xhc3MgSWZhY2UiIDw8IGV4dGVuZHNfaWYgPDwgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICBpZiAoZnVuY3Rpb25zLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9pZigqZl9pdGVyKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCAoKmZfaXRlcikpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgZXh0ZW5kc19jbGllbnQgPSAiKCIgKyBleHRlbmRzICsgIi5DbGllbnQpIjsKLSAgICB9IGVsc2UgewotICAgICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5DbGllbnQsICI7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChnZW5fdHdpc3RlZF8gJiYgZ2VuX25ld3N0eWxlXykgewotICAgICAgICBleHRlbmRzX2NsaWVudCA9ICIob2JqZWN0KSI7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGdlbl90d2lzdGVkXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJjbGFzcyBDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICI6IiA8PCBlbmRsIDw8Ci0gICAgICAiICBpbXBsZW1lbnRzKElmYWNlKSIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJjbGFzcyBDbGllbnQoIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiSWZhY2UpOiIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfdXAoKTsKLSAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0KLSAgLy8gQ29uc3RydWN0b3IgZnVuY3Rpb24KLSAgaWYgKGdlbl90d2lzdGVkXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJkZWYgX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBvcHJvdF9mYWN0b3J5KToiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImRlZiBfX2luaXRfXyhzZWxmLCBpcHJvdCwgb3Byb3Q9Tm9uZSk6IiA8PCBlbmRsOwotICB9Ci0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHNlbGYuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydCIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBzZWxmLl9vcHJvdF9mYWN0b3J5ID0gb3Byb3RfZmFjdG9yeSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBzZWxmLl9zZXFpZCA9IDAiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgc2VsZi5fcmVxcyA9IHt9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgc2VsZi5faXByb3QgPSBzZWxmLl9vcHJvdCA9IGlwcm90IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlmIG9wcm90IGlzIG5vdCBOb25lOiIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAgIHNlbGYuX29wcm90ID0gb3Byb3QiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgc2VsZi5fc2VxaWQgPSAwIiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8ICIuQ2xpZW50Ll9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgb3Byb3RfZmFjdG9yeSkiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgIi5DbGllbnQuX19pbml0X18oc2VsZiwgaXByb3QsIG9wcm90KSIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotICAgIH0KLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAiZGVmICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoZl9zZXJ2aWNlXywgKCpmX2l0ZXIpKTsKLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYuX3NlcWlkICs9IDEiIDw8IGVuZGw7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgImQgPSBzZWxmLl9yZXFzW3NlbGYuX3NlcWlkXSA9IGRlZmVyLkRlZmVycmVkKCkiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAic2VsZi5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gZCIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgICAgfQotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgInNlbGYucmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpIiA8PCBlbmRsOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGRlZmVyLnN1Y2NlZWQoTm9uZSkiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAiZGVmIHNlbmRfIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjoiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdCA9IHNlbGYuX29wcm90X2ZhY3RvcnkuZ2V0UHJvdG9jb2woc2VsZi5fdHJhbnNwb3J0KSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PAotICAgICAgICAgICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsIFRNZXNzYWdlVHlwZS5DQUxMLCBzZWxmLl9zZXFpZCkiCi0gICAgICAgIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInNlbGYuX29wcm90LndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgVE1lc3NhZ2VUeXBlLkNBTEwsIHNlbGYuX3NlcWlkKSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIigpIiA8PCBlbmRsOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhcmdzLndyaXRlKG9wcm90KSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUoc2VsZi5fb3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJzZWxmLl9vcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAic2VsZi5fb3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBlbmRsOwotICAgICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImRlZiByZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgICAgICIoc2VsZiwgaXByb3QsIG10eXBlLCByc2VxaWQpOiIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0gICAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgLy8gVE9ETyhtY3NsZWUpOiBWYWxpZGF0ZSBtZXNzYWdlIHJlcGx5IGhlcmUsIHNlcSBpZHMgZXRjLgotCi0gICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZCA9IHNlbGYuX3JlcXMucG9wKHJzZXFpZCkiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIihmbmFtZSwgbXR5cGUsIHJzZXFpZCkgPSBzZWxmLl9pcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIG10eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT046IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb24oKSIgPDwgZW5kbDsKLQotICAgICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgeC5yZWFkKGlwcm90KSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZC5lcnJiYWNrKHgpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LnJlYWQoaXByb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgeC5yZWFkKHNlbGYuX2lwcm90KSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHNlbGYuX2lwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByYWlzZSB4IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LnJlYWQoc2VsZi5faXByb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInNlbGYuX2lwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIHJlc3VsdC5zdWNjZXNzIGlzIG5vdCBOb25lOiIgPDwgZW5kbDsKLSAgICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBkLmNhbGxiYWNrKHJlc3VsdC5zdWNjZXNzKSIgPDwgZW5kbDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3MiIDw8IGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGlzIG5vdCBOb25lOiIgPDwgZW5kbDsKLSAgICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBkLmVycmJhY2socmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmFpc2UgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIiIDw8IGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgICAicmV0dXJuIGQuY2FsbGJhY2soTm9uZSkiIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgICAicmV0dXJuIiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiBkLmVycmJhY2soVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpIiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJyYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgY29tbWFuZCBsaW5lIHRvb2wgZm9yIG1ha2luZyByZW1vdGUgcmVxdWVzdHMKLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSByZW1vdGUgZm9yLgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBmX3JlbW90ZV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIitzZXJ2aWNlX25hbWVfKyItcmVtb3RlIjsKLSAgb2ZzdHJlYW0gZl9yZW1vdGU7Ci0gIGZfcmVtb3RlLm9wZW4oZl9yZW1vdGVfbmFtZS5jX3N0cigpKTsKLQotICBmX3JlbW90ZSA8PAotICAgICIjIS91c3IvYmluL2VudiBweXRob24iIDw8IGVuZGwgPDwKLSAgICBweV9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgImltcG9ydCBzeXMiIDw8IGVuZGwgPDwKLSAgICAiaW1wb3J0IHBwcmludCIgPDwgZW5kbCA8PAotICAgICJmcm9tIHVybHBhcnNlIGltcG9ydCB1cmxwYXJzZSIgPDwgZW5kbCA8PAotICAgICJmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQiIDw8IGVuZGwgPDwKLSAgICAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0IiA8PCBlbmRsIDw8Ci0gICAgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVEh0dHBDbGllbnQiIDw8IGVuZGwgPDwKLSAgICAiZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbCIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl9yZW1vdGUgPDwKLSAgICAiaW1wb3J0ICIgPDwgc2VydmljZV9uYW1lXyA8PCBlbmRsIDw8Ci0gICAgImZyb20gdHR5cGVzIGltcG9ydCAqIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX3JlbW90ZSA8PAotICAgICJpZiBsZW4oc3lzLmFyZ3YpIDw9IDEgb3Igc3lzLmFyZ3ZbMV0gPT0gJy0taGVscCc6IiA8PCBlbmRsIDw8Ci0gICAgIiAgcHJpbnQgJyciIDw8IGVuZGwgPDwKLSAgICAiICBwcmludCAnVXNhZ2U6ICcgKyBzeXMuYXJndlswXSArICcgWy1oIGhvc3Q6cG9ydF0gWy11IHVybF0gWy1mW3JhbWVkXV0gZnVuY3Rpb24gW2FyZzEgW2FyZzIuLi5dXSciIDw8IGVuZGwgPDwKLSAgICAiICBwcmludCAnJyIgPDwgZW5kbCA8PAotICAgICIgIHByaW50ICdGdW5jdGlvbnM6JyIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3JlbW90ZSA8PAotICAgICAgIiAgcHJpbnQgJyAgIiA8PCAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkgPDwgIiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgaW50IG51bV9hcmdzID0gYXJncy5zaXplKCk7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfcmVtb3RlIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3JlbW90ZSA8PAotICAgICAgICBhcmdzW2ldLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCBhcmdzW2ldLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3JlbW90ZSA8PCAiKSciIDw8IGVuZGw7Ci0gIH0KLSAgZl9yZW1vdGUgPDwKLSAgICAiICBwcmludCAnJyIgPDwgZW5kbCA8PAotICAgICIgIHN5cy5leGl0KDApIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX3JlbW90ZSA8PAotICAgICJwcCA9IHBwcmludC5QcmV0dHlQcmludGVyKGluZGVudCA9IDIpIiA8PCBlbmRsIDw8Ci0gICAgImhvc3QgPSAnbG9jYWxob3N0JyIgPDwgZW5kbCA8PAotICAgICJwb3J0ID0gOTA5MCIgPDwgZW5kbCA8PAotICAgICJ1cmkgPSAnJyIgPDwgZW5kbCA8PAotICAgICJmcmFtZWQgPSBGYWxzZSIgPDwgZW5kbCA8PAotICAgICJodHRwID0gRmFsc2UiIDw8IGVuZGwgPDwKLSAgICAiYXJnaSA9IDEiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctaCc6IiA8PCBlbmRsIDw8Ci0gICAgIiAgcGFydHMgPSBzeXMuYXJndlthcmdpKzFdLnNwbGl0KCc6JykiIDw8IGVuZGwgPDwKLSAgICAiICBob3N0ID0gcGFydHNbMF0iIDw8IGVuZGwgPDwKLSAgICAiICBwb3J0ID0gaW50KHBhcnRzWzFdKSIgPDwgZW5kbCA8PAotICAgICIgIGFyZ2kgKz0gMiIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy11JzoiIDw8IGVuZGwgPDwKLSAgICAiICB1cmwgPSB1cmxwYXJzZShzeXMuYXJndlthcmdpKzFdKSIgPDwgZW5kbCA8PAotICAgICIgIHBhcnRzID0gdXJsWzFdLnNwbGl0KCc6JykiIDw8IGVuZGwgPDwKLSAgICAiICBob3N0ID0gcGFydHNbMF0iIDw8IGVuZGwgPDwKLSAgICAiICBpZiBsZW4ocGFydHMpID4gMToiIDw8IGVuZGwgPDwKLSAgICAiICAgIHBvcnQgPSBpbnQocGFydHNbMV0pIiA8PCBlbmRsIDw8Ci0gICAgIiAgZWxzZToiIDw8IGVuZGwgPDwKLSAgICAiICAgIHBvcnQgPSA4MCIgPDwgZW5kbCA8PAotICAgICIgIHVyaSA9IHVybFsyXSIgPDwgZW5kbCA8PAotICAgICIgIGlmIHVybFs0XToiIDw8IGVuZGwgPDwKLSAgICAiICAgIHVyaSArPSAnPyVzJyAlIHVybFs0XSIgPDwgZW5kbCA8PAotICAgICIgIGh0dHAgPSBUcnVlIiA8PCBlbmRsIDw8Ci0gICAgIiAgYXJnaSArPSAyIiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICJpZiBzeXMuYXJndlthcmdpXSA9PSAnLWYnIG9yIHN5cy5hcmd2W2FyZ2ldID09ICctZnJhbWVkJzoiIDw8IGVuZGwgPDwKLSAgICAiICBmcmFtZWQgPSBUcnVlIiA8PCBlbmRsIDw8Ci0gICAgIiAgYXJnaSArPSAxIiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICJjbWQgPSBzeXMuYXJndlthcmdpXSIgPDwgZW5kbCA8PAotICAgICJhcmdzID0gc3lzLmFyZ3ZbYXJnaSsxOl0iIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgImlmIGh0dHA6IiA8PCBlbmRsIDw8Ci0gICAgIiAgdHJhbnNwb3J0ID0gVEh0dHBDbGllbnQuVEh0dHBDbGllbnQoaG9zdCwgcG9ydCwgdXJpKSIgPDwgZW5kbCA8PAotICAgICJlbHNlOiIgPDwgZW5kbCA8PAotICAgICIgIHNvY2tldCA9IFRTb2NrZXQuVFNvY2tldChob3N0LCBwb3J0KSIgPDwgZW5kbCA8PAotICAgICIgIGlmIGZyYW1lZDoiIDw8IGVuZGwgPDwKLSAgICAiICAgIHRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpIiA8PCBlbmRsIDw8Ci0gICAgIiAgZWxzZToiIDw8IGVuZGwgPDwKLSAgICAiICAgIHRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkiIDw8IGVuZGwgPDwKLSAgICAicHJvdG9jb2wgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkiIDw8IGVuZGwgPDwKLSAgICAiY2xpZW50ID0gIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIuQ2xpZW50KHByb3RvY29sKSIgPDwgZW5kbCA8PAotICAgICJ0cmFuc3BvcnQub3BlbigpIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9yZW1vdGUgPDwgImVsIjsKLSAgICB9Ci0KLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKLSAgICBpbnQgbnVtX2FyZ3MgPSBhcmdzLnNpemUoKTsKLQotICAgIGZfcmVtb3RlIDw8Ci0gICAgICAiaWYgY21kID09ICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJzoiIDw8IGVuZGwgPDwKLSAgICAgICIgIGlmIGxlbihhcmdzKSAhPSAiIDw8IG51bV9hcmdzIDw8ICI6IiA8PCBlbmRsIDw8Ci0gICAgICAiICAgIHByaW50ICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIHJlcXVpcmVzICIgPDwgbnVtX2FyZ3MgPDwgIiBhcmdzJyIgPDwgZW5kbCA8PAotICAgICAgIiAgICBzeXMuZXhpdCgxKSIgPDwgZW5kbCA8PAotICAgICAgIiAgcHAucHByaW50KGNsaWVudC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7Ci0gICAgICBpZiAoYXJnc1tpXS0+Z2V0X3R5cGUoKS0+aXNfc3RyaW5nKCkpIHsKLSAgICAgICAgZl9yZW1vdGUgPDwgImFyZ3NbIiA8PCBpIDw8ICJdLCI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3JlbW90ZSA8PCAiZXZhbChhcmdzWyIgPDwgaSA8PCAiXSksIjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZl9yZW1vdGUgPDwgIikpIiA8PCBlbmRsOwotCi0gICAgZl9yZW1vdGUgPDwgZW5kbDsKLSAgfQotICBmX3JlbW90ZSA8PCAiZWxzZToiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8ICIgIHByaW50ICdVbnJlY29nbml6ZWQgbWV0aG9kICVzJyAlIGNtZCIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgIiAgc3lzLmV4aXQoMSkiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGVuZGw7Ci0KLSAgZl9yZW1vdGUgPDwgInRyYW5zcG9ydC5jbG9zZSgpIiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3JlbW90ZS5jbG9zZSgpOwotCi0gIC8vIE1ha2UgZmlsZSBleGVjdXRhYmxlLCBsb3ZlIHRoYXQgYml0d2lzZSBPUiBhY3Rpb24KLSAgY2htb2QoZl9yZW1vdGVfbmFtZS5jX3N0cigpLAotICAgICAgICAgIFNfSVJVU1IKLSAgICAgICAgfCBTX0lXVVNSCi0gICAgICAgIHwgU19JWFVTUgotI2lmbmRlZiBNSU5HVwotICAgICAgICB8IFNfSVJHUlAKLSAgICAgICAgfCBTX0lYR1JQCi0gICAgICAgIHwgU19JUk9USAotICAgICAgICB8IFNfSVhPVEgKLSNlbmRpZgotICApOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLlByb2Nlc3NvciwgIjsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgImNsYXNzIFByb2Nlc3NvcigiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJUUHJvY2Vzc29yKToiIDw8IGVuZGwgPDwKLSAgICAgICIgIGltcGxlbWVudHMoSWZhY2UpIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgImNsYXNzIFByb2Nlc3NvcigiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJJZmFjZSwgVFByb2Nlc3Nvcik6IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgImRlZiBfX2luaXRfXyhzZWxmLCBoYW5kbGVyKToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAic2VsZi5faGFuZGxlciA9IElmYWNlKGhhbmRsZXIpIiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJzZWxmLl9oYW5kbGVyID0gaGFuZGxlciIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic2VsZi5fcHJvY2Vzc01hcCA9IHt9IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgZXh0ZW5kcyA8PCAiLlByb2Nlc3Nvci5fX2luaXRfXyhzZWxmLCBJZmFjZShoYW5kbGVyKSkiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgZXh0ZW5kcyA8PCAiLlByb2Nlc3Nvci5fX2luaXRfXyhzZWxmLCBoYW5kbGVyKSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic2VsZi5fcHJvY2Vzc01hcFtcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl0gPSBQcm9jZXNzb3IucHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJkZWYgcHJvY2VzcyhzZWxmLCBpcHJvdCwgb3Byb3QpOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICIobmFtZSwgdHlwZSwgc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOwotCi0gIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZQotCi0gIC8vIEhPVDogZGljdGlvbmFyeSBmdW5jdGlvbiBsb29rdXAKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpZiBuYW1lIG5vdCBpbiBzZWxmLl9wcm9jZXNzTWFwOiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlwcm90LnNraXAoVFR5cGUuU1RSVUNUKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCwgJ1Vua25vd24gZnVuY3Rpb24gJXMnICUgKG5hbWUpKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOwotCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZGVmZXIuc3VjY2VlZChOb25lKSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImVsc2U6IiA8PCBlbmRsOwotCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gc2VsZi5fcHJvY2Vzc01hcFtuYW1lXShzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90KSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBzZWxmLl9wcm9jZXNzTWFwW25hbWVdKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOwotCi0gICAgLy8gUmVhZCBlbmQgb2YgYXJncyBmaWVsZCwgdGhlIFRfU1RPUCwgYW5kIHRoZSBzdHJ1Y3QgY2xvc2UKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIFRydWUiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpIHRzZXJ2aWNlOwotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJkZWYgcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICIoc2VsZiwgc2VxaWQsIGlwcm90LCBvcHJvdCk6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImFyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICIoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICIoKSIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZCA9IGRlZmVyLm1heWJlRGVmZXJyZWQoc2VsZi5faGFuZGxlci4iIDw8Ci0gICAgICAgIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiLCAiOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0KLSAgICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gZCIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwKLSAgICAgICAgImQuYWRkQ2FsbGJhY2soc2VsZi53cml0ZV9yZXN1bHRzX3N1Y2Nlc3NfIiA8PAotICAgICAgICAgIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiLCByZXN1bHQsIHNlcWlkLCBvcHJvdCkiIDw8IGVuZGw7Ci0KLSAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwKLSAgICAgICAgICAiZC5hZGRFcnJiYWNrKHNlbGYud3JpdGVfcmVzdWx0c19leGNlcHRpb25fIiA8PAotICAgICAgICAgICAgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIsIHJlc3VsdCwgc2VxaWQsIG9wcm90KSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGQiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAiZGVmIHdyaXRlX3Jlc3VsdHNfc3VjY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAiKHNlbGYsIHN1Y2Nlc3MsIHJlc3VsdCwgc2VxaWQsIG9wcm90KToiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5zdWNjZXNzID0gc3VjY2VzcyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgImRlZiB3cml0ZV9yZXN1bHRzX2V4Y2VwdGlvbl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAiKHNlbGYsIGVycm9yLCByZXN1bHQsIHNlcWlkLCBvcHJvdCk6IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0cnk6IiA8PCBlbmRsOwotCi0gICAgICAvLyBLaW5kYSBhYnN1cmQKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgZXJyb3IucmFpc2VFeGNlcHRpb24oKSIgPDwgZW5kbDsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZXhjZXB0ICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICAgIGluZGVudF91cCgpOwotICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAgICJcIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0KLSAgICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCi0gICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0cnk6IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJzZWxmLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJleGNlcHQgIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJwYXNzIiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKLQotICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MpIHsKLSAgKHZvaWQpIGluY2xhc3M7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICBuYW1lIDw8ICIgPSBpcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsKLSAgICAgICAgICBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpIHx8ICFnZW5fdXRmOHN0cmluZ3NfKSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCk7IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgInJlYWRCb29sKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgInJlYWRJMTYoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgInJlYWRJNjQoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCkiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKLSAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKLSAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKLSAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKLSAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKLQotICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOwotICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfYnl0ZSwga3R5cGUpOwotICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfYnl0ZSwgdnR5cGUpOwotICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfYnl0ZSwgZXR5cGUpOwotCi0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IHt9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiKCIgPDwga3R5cGUgPDwgIiwgIiA8PCB2dHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIiApID0gaXByb3QucmVhZE1hcEJlZ2luKCkgIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBzZXQoKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIigiIDw8IGV0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiKSA9IGlwcm90LnJlYWRTZXRCZWdpbigpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gW10iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIoIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIikgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCkiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJmb3IgIiA8PCBpIDw8ICIgaW4geHJhbmdlKCIgPDwgc2l6ZSA8PCAiKToiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTZXRFbmQoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRMaXN0RW5kKCkiIDw8IGVuZGw7Ci0gIH0KLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFdyaXRlIGEgc2V0IGVsZW1lbnQKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBXcml0ZSBhIGxpc3QgZWxlbWVudAotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5hcHBlbmQoIiA8PCBlbGVtIDw8ICIpIiA8PCBlbmRsOwotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cKLSAgICAgICAgICAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkgfHwgIWdlbl91dGY4c3RyaW5nc18pIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIi5lbmNvZGUoJ3V0Zi04JykpIjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpIiA8PCBlbmRsOwotfQotCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVNYXBCZWdpbigiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICJsZW4oIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVTZXRCZWdpbigiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICJsZW4oIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlTGlzdEJlZ2luKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICJsZW4oIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKLSAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3IgIiA8PCBraXRlciA8PCAiLCIgPDwgdml0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiLml0ZW1zKCk6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3IgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVNYXBFbmQoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlU2V0RW5kKCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVMaXN0RW5kKCkiIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7Ci0KLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnaXZlbiBzdHJ1Y3QuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3QsICJBdHRyaWJ1dGVzIik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2l2ZW4gZnVuY3Rpb24uCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3V0LCB0ZnVuY3Rpb24sIHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIlBhcmFtZXRlcnMiKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBzdHJ1Y3Qgb3IgZnVuY3Rpb24uCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqICAgIHRkb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWJoZWFkZXIpIHsKLSAgYm9vbCBoYXNfZG9jID0gZmFsc2U7Ci0gIHN0cmluZ3N0cmVhbSBzczsKLSAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewotICAgIGhhc19kb2MgPSB0cnVlOwotICAgIHNzIDw8IHRkb2MtPmdldF9kb2MoKTsKLSAgfQotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIGlmIChoYXNfZG9jKSB7Ci0gICAgICBzcyA8PCBlbmRsOwotICAgIH0KLSAgICBoYXNfZG9jID0gdHJ1ZTsKLSAgICBzcyA8PCBzdWJoZWFkZXIgPDwgIjpcbiI7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOwotICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKLSAgICAgIHNzIDw8ICIgLSAiIDw8IHAtPmdldF9uYW1lKCk7Ci0gICAgICBpZiAocC0+aGFzX2RvYygpKSB7Ci0gICAgICAgIHNzIDw8ICI6ICIgPDwgcC0+Z2V0X2RvYygpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3MgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoaGFzX2RvYykgewotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAgICJcIlwiXCJcbiIsCi0gICAgICAiIiwgc3Muc3RyKCksCi0gICAgICAiXCJcIlwiXG4iKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdlbmVyaWMgb2JqZWN0LgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jKSB7Ci0gIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAiXCJcIlwiXG4iLAotICAgICAgIiIsIHRkb2MtPmdldF9kb2MoKSwKLSAgICAgICJcIlwiXCJcbiIpOwotICB9Ci19Ci0KLS8qKgotICogRGVjbGFyZXMgYW4gYXJndW1lbnQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OmRlY2xhcmVfYXJndW1lbnQodF9maWVsZCogdGZpZWxkKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZXN1bHQ7Ci0gIHJlc3VsdCA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIj0iOwotICBpZiAodGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgcmVzdWx0IDw8ICJ0aHJpZnRfc3BlY1siIDw8Ci0gICAgICB0ZmllbGQtPmdldF9rZXkoKSA8PCAiXVs0XSI7Ci0gIH0gZWxzZSB7Ci0gICAgcmVzdWx0IDw8ICJOb25lIjsKLSAgfQotICByZXR1cm4gcmVzdWx0LnN0cigpOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBkZWZhdWx0IHZhbHVlLCByZXR1cm5zIE5vbmUgb3RoZXJ3aXNlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6cmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUodF9maWVsZCogdGZpZWxkKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgaWYgKHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgIHJldHVybiByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuICJOb25lIjsKLSAgfQotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgLy8gVE9ETyhtY3NsZWUpOiBOaXRwaWNreSwgbm8gJywnIGlmIGFyZ3VtZW50X2xpc3QgaXMgZW1wdHkKLSAgcmV0dXJuCi0gICAgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsKLSAgICAiKHNlbGYsICIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhbiBpbnRlcmZhY2UgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2lmKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIC8vIFRPRE8obWNzbGVlKTogTml0cGlja3ksIG5vICcsJyBpZiBhcmd1bWVudF9saXN0IGlzIGVtcHR5Ci0gIHN0cmluZyBzaWduYXR1cmUgPSBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCI7Ci0gIGlmICghZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgc2lnbmF0dXJlICs9ICJzZWxmLCAiOwotICB9Ci0gIHNpZ25hdHVyZSArPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Ci0gIHJldHVybiBzaWduYXR1cmU7Ci19Ci0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAodHR5cGUtPmlzX3NlcnZpY2UoKSkgewotICAgIHJldHVybiBnZXRfcmVhbF9weV9tb2R1bGUocHJvZ3JhbSwgZ2VuX3R3aXN0ZWRfKSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHJldHVybiBnZXRfcmVhbF9weV9tb2R1bGUocHJvZ3JhbSwgZ2VuX3R3aXN0ZWRfKSArICIudHR5cGVzLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBQeXRob24gdHlvZQotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGUuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGUuU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkxJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKiogU2VlIHRoZSBjb21tZW50IGluc2lkZSBnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbiBmb3Igd2hhdCB0aGlzIGlzLiAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjp0eXBlX3RvX3NwZWNfYXJncyh0X3R5cGUqIHR0eXBlKSB7Ci0gIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJOb25lIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIigiICsgdHlwZV9uYW1lKHR0eXBlKSArICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIi50aHJpZnRfc3BlYykiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiKCIgKwotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpICsgIiwiICsKLSAgICAgIHR5cGVfdG9fc3BlY19hcmdzKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpICsgIiwiICsKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSArICIsIiArCi0gICAgICB0eXBlX3RvX3NwZWNfYXJncygoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSArCi0gICAgICAiKSI7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIigiICsKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCIgKwotICAgICAgdHlwZV90b19zcGVjX2FyZ3MoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsKLSAgICAgICIpIjsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIigiICsKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIiwiICsKLSAgICAgIHR5cGVfdG9fc3BlY19hcmdzKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKwotICAgICAgIikiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX3NwZWNfYXJnczogIiArIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IocHksICJQeXRob24iLAotIiAgICBuZXdfc3R5bGU6ICAgICAgIEdlbmVyYXRlIG5ldy1zdHlsZSBjbGFzc2VzLlxuIiBcCi0iICAgIHR3aXN0ZWQ6ICAgICAgICAgR2VuZXJhdGUgVHdpc3RlZC1mcmllbmRseSBSUEMgc2VydmljZXMuXG4iIFwKLSIgICAgdXRmOHN0cmluZ3M6ICAgICBFbmNvZGUvZGVjb2RlIHN0cmluZ3MgdXNpbmcgdXRmOCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuXG4iCi0pCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWU0NDA1Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCi0gKiBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBSdWJ5IGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9yYl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfcmJfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIHBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXJiIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgICAgICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAgICAodF9jb25zdCogICAgdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICAgICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb24gICAgICAgICh0X3N0cnVjdCogICB0dW5pb24pOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICAgICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICAgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfcmJfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9yYl9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3JiX3VuaW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9yYl91bmlvbl92YWxpZGF0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmJfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX3JiX3NpbXBsZV9jb25zdHJ1Y3RvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9yYl9zaW1wbGVfZXhjZXB0aW9uX2NvbnN0cnVjdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2NvbnN0YW50cyAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfY29uc3RydWN0b3JzIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF9kZWZucyAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGF0YSAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiBmaWVsZF90eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgZmllbGRfbmFtZSwgdF9jb25zdF92YWx1ZSogZmllbGRfdmFsdWUsIGJvb2wgb3B0aW9uYWwpOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzICAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uICAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3M9ZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0ICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50ICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9yZG9jICAgICAgICAgICAgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYyk7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIHJiX2F1dG9nZW5fY29tbWVudCgpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bGxfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotCi0KLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcnVieV9tb2R1bGVzKHRfcHJvZ3JhbSogcCkgewotICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgicmIiKTsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbW9kdWxlczsKLSAgICBpZiAobnMuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIG1vZHVsZXM7Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmc6Oml0ZXJhdG9yIHBvcyA9IG5zLmJlZ2luKCk7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHN0ZDo6c3RyaW5nOjppdGVyYXRvciBkZWxpbSA9IHN0ZDo6ZmluZChwb3MsIG5zLmVuZCgpLCAnLicpOwotICAgICAgbW9kdWxlcy5wdXNoX2JhY2soY2FwaXRhbGl6ZShzdGQ6OnN0cmluZyhwb3MsIGRlbGltKSkpOwotICAgICAgcG9zID0gZGVsaW07Ci0gICAgICBpZiAocG9zID09IG5zLmVuZCgpKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgKytwb3M7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1vZHVsZXM7Ci0gIH0KLQotICB2b2lkIGJlZ2luX25hbWVzcGFjZShzdGQ6Om9mc3RyZWFtJiwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KTsKLSAgdm9pZCBlbmRfbmFtZXNwYWNlKHN0ZDo6b2ZzdHJlYW0mLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4pOwotCi0gcHJpdmF0ZToKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9jb25zdHNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0KLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkrdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSsiX3R5cGVzLnJiIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpK3VuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykrIl9jb25zdGFudHMucmIiOwotICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PAotICAgIHJiX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOwotICAgIGJlZ2luX25hbWVzcGFjZShmX3R5cGVzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7Ci0KLSAgZl9jb25zdHNfIDw8Ci0gICAgcmJfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgICJyZXF1aXJlICciIDw8IHVuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyciIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICAgIGJlZ2luX25hbWVzcGFjZShmX2NvbnN0c18sIHJ1YnlfbW9kdWxlcyhwcm9ncmFtXykpOwotCi19Ci0KLS8qKgotICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQotICovCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlcygpIHsKLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgcmVzdWx0ICs9ICJyZXF1aXJlICciICsgdW5kZXJzY29yZShpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzJ1xuIjsKLSAgfQotICBpZiAoaW5jbHVkZXMuc2l6ZSgpID4gMCkgewotICAgIHJlc3VsdCArPSAiXG4iOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQXV0b2dlbidkIGNvbW1lbnQKLSAqLwotc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpyYl9hdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gIHJldHVybgotICAgIHN0ZDo6c3RyaW5nKCIjXG4iKSArCi0gICAgIiMgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iICsKLSAgICAiI1xuIiArCi0gICAgIiMgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCi0gICAgIiNcbiI7Ci19Ci0KLS8qKgotICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZQotICBlbmRfbmFtZXNwYWNlKGZfdHlwZXNfLCBydWJ5X21vZHVsZXMocHJvZ3JhbV8pKTsKLSAgZW5kX25hbWVzcGFjZShmX2NvbnN0c18sIHJ1YnlfbW9kdWxlcyhwcm9ncmFtXykpOwotICBmX3R5cGVzXy5jbG9zZSgpOwotICBmX2NvbnN0c18uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIFJ1YnksIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gICh2b2lkKSB0dHlwZWRlZjsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBEb25lIHVzaW5nIGEgY2xhc3MgdG8gc2NvcGUKLSAqIHRoZSB2YWx1ZXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgaW5kZW50KGZfdHlwZXNfKSA8PAotICAgICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLQotICAgIC8vIFJ1YnkgY2xhc3MgY29uc3RhbnRzIGhhdmUgdG8gYmUgY2FwaXRhbGl6ZWQuLi4gb21nIGkgYW0gc28gb24gdGhlIGZlbmNlCi0gICAgLy8gYWJvdXQgbGFuZ3VhZ2VzIHN0cmljdGx5IGVuZm9yY2luZyBjYXBpdGFsaXphdGlvbiB3aHkgY2FuJ3Qgd2UganVzdCBhbGwKLSAgICAvLyBhZ3JlZSBhbmQgcGxheSBuaWNlLgotICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotCi0gICAgZ2VuZXJhdGVfcmRvYyhmX3R5cGVzXywgKmNfaXRlcik7Ci0gICAgaW5kZW50KGZfdHlwZXNfKSA8PCBuYW1lIDw8ICIgPSAiIDw8IHZhbHVlIDw8IGVuZGw7Ci0gIH0KLSAgCi0gIC8vIENyZWF0ZSBhIGhhc2ggbWFwcGluZyB2YWx1ZXMgYmFjayB0byB0aGVpciBuYW1lcyAoYXMgc3RyaW5ncykgc2luY2UgcnVieSBoYXMgbm8gbmF0aXZlIGVudW0gdHlwZQotICBpbmRlbnQoZl90eXBlc18pIDw8ICJWQUxVRV9NQVAgPSB7IjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvcihjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAvLyBQb3B1bGF0ZSB0aGUgaGFzaAotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgZmlyc3QgPyBmaXJzdCA9IGZhbHNlIDogZl90eXBlc18gPDwgIiwgIjsKLSAgICBmX3R5cGVzXyA8PCB2YWx1ZSA8PCAiID0+IFwiIiA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIlwiIjsKLSAgfQotICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbDsKLSAgCi0gIC8vIENyZWF0ZSBhIHNldCB3aXRoIHZhbGlkIHZhbHVlcyBmb3IgdGhpcyBlbnVtCi0gIGluZGVudChmX3R5cGVzXykgPDwgIlZBTElEX1ZBTFVFUyA9IFNldC5uZXcoWyI7Ci0gIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAvLyBQb3B1bGF0ZSB0aGUgc2V0Ci0gICAgZmlyc3QgPyBmaXJzdCA9IGZhbHNlIDogZl90eXBlc18gPDwgIiwgIjsKLSAgICBmX3R5cGVzXyA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gIH0KLSAgZl90eXBlc18gPDwgIl0pLmZyZWV6ZSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl90eXBlc18pIDw8Ci0gICAgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKLQotICBpbmRlbnQoZl9jb25zdHNfKSA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSk7Ci0gIGZfY29uc3RzXyA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAiJXFcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCBmdWxsX3R5cGVfbmFtZSh0eXBlKSA8PCAiLm5ldyh7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgPT4gIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9KSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgb3V0IDw8ICJ7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgPT4gIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgb3V0IDw8ICJTZXQubmV3KFsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiWyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJdKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJdIjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBydWJ5IHN0cnVjdAotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9yYl91bmlvbihmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX3JiX3N0cnVjdChmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfcmJfc3RydWN0KGZfdHlwZXNfLCB0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHJ1Ynkgc3RydWN0Ci0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbiA9IGZhbHNlKSB7Ci0gIGdlbmVyYXRlX3Jkb2Mob3V0LCB0c3RydWN0KTsKLSAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICIgPCA6OlRocmlmdDo6RXhjZXB0aW9uIjsKLSAgfQotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImluY2x1ZGUgOjpUaHJpZnQ6OlN0cnVjdCwgOjpUaHJpZnQ6OlN0cnVjdF9VbmlvbiIgPDwgZW5kbDsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgZ2VuZXJhdGVfcmJfc2ltcGxlX2V4Y2VwdGlvbl9jb25zdHJ1Y3RvcihvdXQsIHRzdHJ1Y3QpOwotICB9Ci0KLSAgZ2VuZXJhdGVfZmllbGRfY29uc3RhbnRzKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2ZpZWxkX2RlZm5zKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX3JiX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiOjpUaHJpZnQ6OlN0cnVjdC5nZW5lcmF0ZV9hY2Nlc3NvcnMgc2VsZiIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBydWJ5IHVuaW9uCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX3VuaW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uID0gZmFsc2UpIHsKLSAgKHZvaWQpIGlzX2V4Y2VwdGlvbjsKLSAgZ2VuZXJhdGVfcmRvYyhvdXQsIHRzdHJ1Y3QpOwotICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiA8IDo6VGhyaWZ0OjpVbmlvbiIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImluY2x1ZGUgOjpUaHJpZnQ6OlN0cnVjdF9VbmlvbiIgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9maWVsZF9jb25zdHJ1Y3RvcnMob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9maWVsZF9jb25zdGFudHMob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZmllbGRfZGVmbnMob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfcmJfdW5pb25fdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIjo6VGhyaWZ0OjpVbmlvbi5nZW5lcmF0ZV9hY2Nlc3NvcnMgc2VsZiIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX2NvbnN0cnVjdG9ycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0KLSAgaW5kZW50KG91dCkgPDwgImNsYXNzIDw8IHNlbGYiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmX2l0ZXIgIT0gZmllbGRzLmJlZ2luKCkpIHsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgaW5kZW50KG91dCkgPDwgImRlZiAiIDw8IGZpZWxkX25hbWUgPDwgIih2YWwpIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLm5ldyg6IiA8PCBmaWVsZF9uYW1lIDw8ICIsIHZhbCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgfQotICAKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLQotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfc2ltcGxlX2V4Y2VwdGlvbl9jb25zdHJ1Y3RvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA9PSAxKSB7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOwotCi0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfc3RyaW5nKCkpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgICBpbmRlbnQob3V0KSA8PCAiZGVmIGluaXRpYWxpemUobWVzc2FnZT1uaWwpIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAic3VwZXIoKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzZWxmLiIgPDwgbmFtZSA8PCAiID0gbWVzc2FnZSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAgIGlmIChuYW1lICE9ICJtZXNzYWdlIikgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiZGVmIG1lc3NhZ2U7ICIgPDwgbmFtZSA8PCAiIGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9jb25zdGFudHMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9maWVsZF9uYW1lID0gdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKTsKLSAgICAKLSAgICBpbmRlbnQob3V0KSA8PCBjYXBfZmllbGRfbmFtZSA8PCAiID0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9kZWZucyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAiRklFTERTID0geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZfaXRlciAhPSBmaWVsZHMuYmVnaW4oKSkgewotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIGdlbmVyYXRlIHRoZSBmaWVsZCBkb2NzdHJpbmdzIHdpdGhpbiB0aGUgRklFTERTIGNvbnN0YW50LiBubyByZWFsIGJldHRlciBwbGFjZS4uLgotICAgIGdlbmVyYXRlX3Jkb2Mob3V0LCAqZl9pdGVyKTsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICB1cGNhc2Vfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9PiAiOwotCi0gICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLCAoKmZfaXRlciktPmdldF92YWx1ZSgpLCAKLSAgICAgICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAKLSAgaW5kZW50KG91dCkgPDwgImRlZiBzdHJ1Y3RfZmllbGRzOyBGSUVMRFM7IGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotICAKLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGF0YShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogZmllbGRfdHlwZSwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmllbGRfbmFtZSA9ICIiLCB0X2NvbnN0X3ZhbHVlKiBmaWVsZF92YWx1ZSA9IE5VTEwsIGJvb2wgb3B0aW9uYWwgPSBmYWxzZSkgewotICBmaWVsZF90eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZF90eXBlKTsKLQotICAvLyBCZWdpbiB0aGlzIGZpZWxkJ3MgZGVmbgotICBvdXQgPDwgIns6dHlwZSA9PiAiIDw8IHR5cGVfdG9fZW51bShmaWVsZF90eXBlKTsKLQotICBpZiAoIWZpZWxkX25hbWUuZW1wdHkoKSkgewotICAgIG91dCA8PCAiLCA6bmFtZSA9PiAnIiA8PCBmaWVsZF9uYW1lIDw8ICInIjsKLSAgfQotCi0gIGlmIChmaWVsZF92YWx1ZSAhPSBOVUxMKSB7Ci0gICAgb3V0IDw8ICIsIDpkZWZhdWx0ID0+ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIGZpZWxkX3ZhbHVlKTsKLSAgfQotCi0gIGlmICghZmllbGRfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBpZiAoZmllbGRfdHlwZS0+aXNfc3RydWN0KCkgfHwgZmllbGRfdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgb3V0IDw8ICIsIDpjbGFzcyA9PiAiIDw8IGZ1bGxfdHlwZV9uYW1lKCh0X3N0cnVjdCopZmllbGRfdHlwZSk7Ci0gICAgfSBlbHNlIGlmIChmaWVsZF90eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIG91dCA8PCAiLCA6ZWxlbWVudCA9PiAiOwotICAgICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgodF9saXN0KilmaWVsZF90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBvdXQgPDwgIiwgOmtleSA9PiAiOwotICAgICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgodF9tYXAqKWZpZWxkX3R5cGUpLT5nZXRfa2V5X3R5cGUoKSk7Ci0gICAgICBvdXQgPDwgIiwgOnZhbHVlID0+ICI7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwgKCh0X21hcCopZmllbGRfdHlwZSktPmdldF92YWxfdHlwZSgpKTsKLSAgICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBvdXQgPDwgIiwgOmVsZW1lbnQgPT4gIjsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX2RhdGEob3V0LCAoKHRfc2V0KilmaWVsZF90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKCgodF9iYXNlX3R5cGUqKWZpZWxkX3R5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgb3V0IDw8ICIsIDpiaW5hcnkgPT4gdHJ1ZSI7Ci0gICAgfQotICB9Ci0gIAotICBpZihvcHRpb25hbCkgewotICAgIG91dCA8PCAiLCA6b3B0aW9uYWwgPT4gdHJ1ZSI7Ci0gIH0KLQotICBpZiAoZmllbGRfdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0IDw8ICIsIDplbnVtX2NsYXNzID0+ICIgPDwgZnVsbF90eXBlX25hbWUoZmllbGRfdHlwZSk7Ci0gIH0KLQotICAvLyBFbmQgb2YgdGhpcyBmaWVsZCdzIGRlZm4KLSAgb3V0IDw8ICJ9IjsKLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6YmVnaW5fbmFtZXNwYWNlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVzKSB7Ci0gIGZvciAodmVjdG9yPHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgbV9pdGVyID0gbW9kdWxlcy5iZWdpbigpOyBtX2l0ZXIgIT0gbW9kdWxlcy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAibW9kdWxlICIgPDwgKm1faXRlciA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci19Ci0KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmVuZF9uYW1lc3BhY2Uoc3RkOjpvZnN0cmVhbSYgb3V0LCB2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXMpIHsKLSAgZm9yICh2ZWN0b3I8c3RkOjpzdHJpbmc+OjpyZXZlcnNlX2l0ZXJhdG9yIG1faXRlciA9IG1vZHVsZXMucmJlZ2luKCk7IG1faXRlciAhPSBtb2R1bGVzLnJlbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Ci0gIH0KLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpK3VuZGVyc2NvcmUoc2VydmljZV9uYW1lXykrIi5yYiI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgcmJfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgICJyZXF1aXJlICd0aHJpZnQnIiA8PCBlbmRsOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgInJlcXVpcmUgJyIgPDwgdW5kZXJzY29yZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgIiciIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgInJlcXVpcmUgJyIgPDwgdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzJyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgYmVnaW5fbmFtZXNwYWNlKGZfc2VydmljZV8sIHJ1YnlfbW9kdWxlcyh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UgKHdlbGwsIHR3byBmb3Igbm93IGluIFBIUCkKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGVuZF9uYW1lc3BhY2UoZl9zZXJ2aWNlXywgcnVieV9tb2R1bGVzKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSk7Ci0KLSAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAiIyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfcmJfc3RydWN0KGZfc2VydmljZV8sIHRzKTsKLSAgICBnZW5lcmF0ZV9yYl9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgfQotICBnZW5lcmF0ZV9yYl9zdHJ1Y3QoZl9zZXJ2aWNlXywgJnJlc3VsdCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSBmdWxsX3R5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSAiIDwgIiArIGV4dGVuZHMgKyAiOjpDbGllbnQgIjsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJjbGFzcyBDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50IDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJpbmNsdWRlIDo6VGhyaWZ0OjpDbGllbnQiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7Ci0KLSAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICAgIH0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICAgIH0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCkiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJkZWYgc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7Ci0KLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VuZF9tZXNzYWdlKCciIDw8IGZ1bm5hbWUgPDwgIicsICIgPDwgYXJnc25hbWU7Ci0KLSAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgOiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgfQotCi0gICAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0KLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJkZWYgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgLy8gVE9ETyhtY3NsZWUpOiBWYWxpZGF0ZSBtZXNzYWdlIHJlcGx5IGhlcmUsIHNlcSBpZHMgZXRjLgotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQgPSByZWNlaXZlX21lc3NhZ2UoIiA8PCByZXN1bHRuYW1lIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gcmVzdWx0LnN1Y2Nlc3MgdW5sZXNzIHJlc3VsdC5zdWNjZXNzLm5pbD8iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAgICJyYWlzZSByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAgICIgdW5sZXNzIHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLm5pbD8iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAgICJyZXR1cm4iIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJhaXNlIDo6VGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoOjpUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdCcpIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IGZ1bGxfdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICIgPCAiICsgZXh0ZW5kcyArICI6OlByb2Nlc3NvciAiOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJjbGFzcyBQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6UHJvY2Vzc29yIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpIHRzZXJ2aWNlOwotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJkZWYgcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICIoc2VxaWQsIGlwcm90LCBvcHJvdCkiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9yZXN1bHQiOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiYXJncyA9IHJlYWRfYXJncyhpcHJvdCwgIiA8PCBhcmdzbmFtZSA8PCAiKSIgPDwgZW5kbDsKLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIi5uZXcoKSIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJAaGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmVzY3VlICIgPDwgZnVsbF90eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiID0+ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgfQotICAgIH0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ3cml0ZV9yZXN1bHQocmVzdWx0LCBvcHJvdCwgJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBzZXFpZCkiIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X3JiX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIC8vIFRPRE8obWNzbGVlKTogTml0cGlja3ksIG5vICcsJyBpZiBhcmd1bWVudF9saXN0IGlzIGVtcHR5Ci0gIHJldHVybgotICAgIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArCi0gICAgIigiICsgIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICovCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIHN0cmluZyBwcmVmaXggPSAiIjsKLQotICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOwotICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBuYW1lID0gY2FwaXRhbGl6ZSh0dHlwZS0+Z2V0X25hbWUoKSk7Ci0gIH0KLQotICByZXR1cm4gcHJlZml4ICsgbmFtZTsKLX0KLQotc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpmdWxsX3R5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIHN0cmluZyBwcmVmaXggPSAiIjsKLSAgdmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVzID0gcnVieV9tb2R1bGVzKHR0eXBlLT5nZXRfcHJvZ3JhbSgpKTsKLSAgZm9yICh2ZWN0b3I8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBtX2l0ZXIgPSBtb2R1bGVzLmJlZ2luKCk7Ci0gICAgICAgbV9pdGVyICE9IG1vZHVsZXMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgcHJlZml4ICs9ICptX2l0ZXIgKyAiOjoiOwotICB9Ci0gIHJldHVybiBwcmVmaXggKyB0eXBlX25hbWUodHR5cGUpOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgUnVieSB0eW9lCi0gKi8KLXN0cmluZyB0X3JiX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpTVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpCT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6QllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6STE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpJMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6Okk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6RE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6Ok1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6U0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6TElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmRvYyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7Ci0gIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAiIiwgIiMgIiwgdGRvYy0+Z2V0X2RvYygpLCAiIik7Ci0gIH0KLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiZGVmIHZhbGlkYXRlIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKLSAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmFpc2UgOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLm5ldyg6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlVOS05PV04sICdSZXF1aXJlZCBmaWVsZCAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgaXMgdW5zZXQhJykiOwotICAgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19ib29sKCkpIHsKLSAgICAgICAgb3V0IDw8ICIgaWYgQCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIi5uaWw/IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiIHVubGVzcyBAIiA8PCBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIC8vIGlmIGZpZWxkIGlzIGFuIGVudW0sIGNoZWNrIHRoYXQgaXRzIHZhbHVlIGlzIHZhbGlkCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0KLSAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSl7ICAgICAgCi0gICAgICBpbmRlbnQob3V0KSA8PCAidW5sZXNzIEAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIubmlsPyB8fCAiIDw8IGZ1bGxfdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiOjpWQUxJRF9WQUxVRVMuaW5jbHVkZT8oQCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyYWlzZSA6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24ubmV3KDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTiwgJ0ludmFsaWQgdmFsdWUgb2YgZmllbGQgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIScpIiA8PCBlbmRsOyAgCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX3VuaW9uX3ZhbGlkYXRvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJkZWYgdmFsaWRhdGUiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAicmFpc2UoU3RhbmRhcmRFcnJvciwgJ1VuaW9uIGZpZWxkcyBhcmUgbm90IHNldC4nKSBpZiBnZXRfc2V0X2ZpZWxkLm5pbD8gfHwgZ2V0X3ZhbHVlLm5pbD8iIDw8IGVuZGw7Ci0KLSAgLy8gaWYgZmllbGQgaXMgYW4gZW51bSwgY2hlY2sgdGhhdCBpdHMgdmFsdWUgaXMgdmFsaWQKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBjb25zdCB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKLQotICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKXsgICAgICAKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiBnZXRfc2V0X2ZpZWxkID09IDoiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByYWlzZSA6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24ubmV3KDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTiwgJ0ludmFsaWQgdmFsdWUgb2YgZmllbGQgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIScpIHVubGVzcyAiIDw8IGZ1bGxfdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiOjpWQUxJRF9WQUxVRVMuaW5jbHVkZT8oZ2V0X3ZhbHVlKSIgPDwgZW5kbDsgIAotICAgICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IocmIsICJSdWJ5IiwgIiIpCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfc3RfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGU4YTNiLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCi0gKiBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBTbWFsbHRhbGsgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X3N0X2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9zdF9nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICAodm9pZCkgcGFyc2VkX29wdGlvbnM7Ci0gICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tc3QiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAgICAgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0ICAgICAgICh0X2NvbnN0KiAgICB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgICAgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbiAgICAodF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICAgICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX2NsYXNzX3NpZGVfZGVmaW5pdGlvbiAoKTsKLSAgdm9pZCBnZW5lcmF0ZV9mb3JjZV9jb25zdHMgKCk7Ci0KLQotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zdF9zdHJ1Y3QgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9hY2Nlc3NvcnMgICAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZW5kX21ldGhvZCAodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9yZWN2X21ldGhvZCAodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICBzdGQ6OnN0cmluZyBtYXBfcmVhZGVyICh0X21hcCAqdG1hcCk7Ci0gIHN0ZDo6c3RyaW5nIGxpc3RfcmVhZGVyICh0X2xpc3QgKnRsaXN0KTsKLSAgc3RkOjpzdHJpbmcgc2V0X3JlYWRlciAodF9zZXQgKnRzZXQpOwotICBzdGQ6OnN0cmluZyBzdHJ1Y3RfcmVhZGVyICh0X3N0cnVjdCAqdHN0cnVjdCwgc3RkOjpzdHJpbmcgY2xzTmFtZSk7Ci0KLSAgc3RkOjpzdHJpbmcgbWFwX3dyaXRlciAodF9tYXAgKnRtYXAsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICBzdGQ6OnN0cmluZyBsaXN0X3dyaXRlciAodF9saXN0ICp0bGlzdCwgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIHNldF93cml0ZXIgKHRfc2V0ICp0c2V0LCBzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgc3RydWN0X3dyaXRlciAodF9zdHJ1Y3QgKnRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIGZuYW1lKTsKLQotICBzdGQ6OnN0cmluZyB3cml0ZV92YWwgKHRfdHlwZSAqdCwgc3RkOjpzdHJpbmcgZm5hbWUpOwotICBzdGQ6OnN0cmluZyByZWFkX3ZhbCAodF90eXBlICp0KTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgc3RfYXV0b2dlbl9jb21tZW50KCk7Ci0KLSAgdm9pZCBzdF9jbGFzc19kZWYoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdGQ6OnN0cmluZyBuYW1lKTsKLSAgdm9pZCBzdF9tZXRob2Qoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICB2b2lkIHN0X21ldGhvZChzdGQ6Om9mc3RyZWFtICZvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgY2F0ZWdvcnkpOwotICB2b2lkIHN0X2Nsb3NlX21ldGhvZChzdGQ6Om9mc3RyZWFtICZvdXQpOwotICB2b2lkIHN0X2NsYXNzX21ldGhvZChzdGQ6Om9mc3RyZWFtICZvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHZvaWQgc3RfY2xhc3NfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyBjYXRlZ29yeSk7Ci0gIHZvaWQgc3Rfc2V0dGVyKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyB0eXBlKTsKLSAgdm9pZCBzdF9nZXR0ZXIoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICB2b2lkIHN0X2FjY2Vzc29ycyhzdGQ6Om9mc3RyZWFtICZvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgdHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgY2xhc3NfbmFtZSgpOwotICBzdGF0aWMgYm9vbCBpc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpOwotICBzdGQ6OnN0cmluZyBjbGllbnRfY2xhc3NfbmFtZSgpOwotICBzdGQ6OnN0cmluZyBwcmVmaXgoc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fdHlwZXNfY29tbWVudCh0X2Z1bmN0aW9uKiBmbik7Ci0KLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBhX3R5cGUodF90eXBlKiB0eXBlKTsKLSAgYm9vbCBpc192b3dlbChjaGFyIGMpOwotICBzdGQ6OnN0cmluZyB0ZW1wX25hbWUoKTsKLSAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVkX2NhdGVnb3J5KCk7Ci0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0gIGludCB0ZW1wb3JhcnlfdmFyOwotICBzdGQ6Om9mc3RyZWFtIGZfOwotCi19OwotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICB0ZW1wb3JhcnlfdmFyID0gMDsKLQotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX25hbWUgPSBnZXRfb3V0X2RpcigpKyIvIitwcm9ncmFtX25hbWVfKyIuc3QiOwotICBmXy5vcGVuKGZfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl8gPDwgc3RfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKLQotICBzdF9jbGFzc19kZWYoZl8sIHByb2dyYW1fbmFtZV8pOwotICBnZW5lcmF0ZV9jbGFzc19zaWRlX2RlZmluaXRpb24oKTsKLQotICAvL0dlbmVyYXRlIGVudW1zCi0gIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKLSAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOwotICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKLSAgfQotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmNsYXNzX25hbWUoKSB7Ci0gIHJldHVybiBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pOwotfQotCi1ib29sIHRfc3RfZ2VuZXJhdG9yOjppc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpIHsKLSAgcmV0dXJuIHN1Yl9uYW1lc3BhY2UgPT0gInByZWZpeCIgfHwgc3ViX25hbWVzcGFjZSA9PSAiY2F0ZWdvcnkiOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnByZWZpeChzdHJpbmcgY2xhc3NfbmFtZSkgewotICBzdHJpbmcgcHJlZml4ID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoInNtYWxsdGFsay5wcmVmaXgiKTsKLSAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKGNsYXNzX25hbWUpOwotICBuYW1lID0gcHJlZml4LmVtcHR5KCkgPyBuYW1lIDogKHByZWZpeCArIG5hbWUpOwotICByZXR1cm4gbmFtZTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpjbGllbnRfY2xhc3NfbmFtZSgpIHsKLSAgcmV0dXJuIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiQ2xpZW50IjsKLX0KLQotLyoqCi0gKiBBdXRvZ2VuJ2QgY29tbWVudAotICovCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnN0X2F1dG9nZW5fY29tbWVudCgpIHsKLSAgcmV0dXJuCi0gICAgc3RkOjpzdHJpbmcoIiciKSArCi0gICAgIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIiArCi0gICAgIlxuIiArCi0gICAgIkRPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKwotICAgICInIVxuIjsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZm9yY2VfY29uc3RzKCkgewotICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGVudW1zIGtleXNBbmRWYWx1ZXNEbzogWzprIDp2IHwgIiA8PAotICAgIHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgZW51bXMgYXQ6IGsgcHV0OiB2IHZhbHVlXS4hIiA8PCBlbmRsOwotCi0gIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgY29uc3RhbnRzIGtleXNBbmRWYWx1ZXNEbzogWzprIDp2IHwgIiA8PAotICAgIHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgY29uc3RhbnRzIGF0OiBrIHB1dDogdiB2YWx1ZV0uISIgPDwgZW5kbDsKLQotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIGdlbmVyYXRlX2ZvcmNlX2NvbnN0cygpOwotICBmXy5jbG9zZSgpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlZF9jYXRlZ29yeSgpIHsKLSAgc3RyaW5nIGNhdCA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJzbWFsbHRhbGsuY2F0ZWdvcnkiKTsKLSAgLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgVGhyaWZ0IGdyYW1tYXIsIHRoZSBjYXRlZ29yeSBtdXN0Ci0gIC8vIGJlIHB1bmN0dWF0ZWQgYnkgZG90cy4gIFJlcGxhY2VzIHRoZW0gd2l0aCBkYXNoZXMgaGVyZS4KLSAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIGl0ZXIgPSBjYXQuYmVnaW4oKTsgaXRlciAhPSBjYXQuZW5kKCk7ICsraXRlcikgewotICAgIGlmICgqaXRlciA9PSAnLicpIHsKLSAgICAgICppdGVyID0gJy0nOwotICAgIH0KLSAgfQotICByZXR1cm4gY2F0LnNpemUoKSA/IGNhdCA6ICJHZW5lcmF0ZWQtIiArIGNsYXNzX25hbWUoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIFNtYWxsdGFsaywgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpIHR0eXBlZGVmOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9jbGFzc19kZWYoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdHJpbmcgbmFtZSkgewotICBvdXQgPDwgIk9iamVjdCBzdWJjbGFzczogIyIgPDwgcHJlZml4KG5hbWUpIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImluc3RhbmNlVmFyaWFibGVOYW1lczogJyciIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiY2xhc3NWYXJpYWJsZU5hbWVzOiAnJyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJwb29sRGljdGlvbmFyaWVzOiAnJyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJjYXRlZ29yeTogJyIgPDwgZ2VuZXJhdGVkX2NhdGVnb3J5KCkgPDwgIichIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X21ldGhvZChzdGQ6Om9mc3RyZWFtICZvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lKSB7Ci0gIHN0X21ldGhvZChvdXQsIGNscywgbmFtZSwgImFzIHlldCB1bmNhdGVnb3JpemVkIik7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2NsYXNzX21ldGhvZChzdGQ6Om9mc3RyZWFtICZvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lKSB7Ci0gIHN0X21ldGhvZChvdXQsIGNscyArICIgY2xhc3MiLCBuYW1lKTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xhc3NfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUsIHN0cmluZyBjYXRlZ29yeSkgewotICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUsIGNhdGVnb3J5KTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUsIHN0cmluZyBjYXRlZ29yeSkgewotICBjaGFyIHRpbWVzdHJbNTBdOwotICB0aW1lX3QgcmF3dGltZTsKLSAgc3RydWN0IHRtICp0aW5mbzsKLQotICB0aW1lKCZyYXd0aW1lKTsKLSAgdGluZm8gPSBsb2NhbHRpbWUoJnJhd3RpbWUpOwotICBzdHJmdGltZSh0aW1lc3RyLCA1MCwgIiVtLyVkLyVZICVIOiVNIiwgdGluZm8pOwotCi0gIG91dCA8PCAiISIgPDwgcHJlZml4KGNscykgPDwKLSAgICAiIG1ldGhvZHNGb3I6ICciK2NhdGVnb3J5KyInIHN0YW1wOiAndGhyaWZ0ICIgPDwgdGltZXN0ciA8PCAiJyFcbiIgPDwKLSAgICBuYW1lIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xvc2VfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCkgewotICBvdXQgPDwgIiEgISIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9zZXR0ZXIoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSwgc3RyaW5nIHR5cGUgPSAiYW5PYmplY3QiKSB7Ci0gIHN0X21ldGhvZChvdXQsIGNscywgbmFtZSArICI6ICIgKyB0eXBlKTsKLSAgb3V0IDw8IG5hbWUgPDwgIiA6PSAiICsgdHlwZTsKLSAgc3RfY2xvc2VfbWV0aG9kKG91dCk7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2dldHRlcihzdGQ6Om9mc3RyZWFtICZvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lKSB7Ci0gIHN0X21ldGhvZChvdXQsIGNscywgbmFtZSArICIiKTsKLSAgb3V0IDw8ICJeICIgPDwgbmFtZTsKLSAgc3RfY2xvc2VfbWV0aG9kKG91dCk7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2FjY2Vzc29ycyhzdGQ6Om9mc3RyZWFtICZvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lLCBzdHJpbmcgdHlwZSA9ICJhbk9iamVjdCIpIHsKLSAgc3Rfc2V0dGVyKG91dCwgY2xzLCBuYW1lLCB0eXBlKTsKLSAgc3RfZ2V0dGVyKG91dCwgY2xzLCBuYW1lKTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfY2xhc3Nfc2lkZV9kZWZpbml0aW9uKCkgewotICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGNsYXNzIiA8PCBlbmRsIDw8Ci0gICAgIlx0aW5zdGFuY2VWYXJpYWJsZU5hbWVzOiAnY29uc3RhbnRzIGVudW1zJyEiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBzdF9hY2Nlc3NvcnMoZl8sIGNsYXNzX25hbWUoKSArICIgY2xhc3MiLCAiZW51bXMiKTsKLSAgc3RfYWNjZXNzb3JzKGZfLCBjbGFzc19uYW1lKCkgKyAiIGNsYXNzIiwgImNvbnN0YW50cyIpOwotCi0gIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgZW51bXM6IERpY3Rpb25hcnkgbmV3ISIgPDwgZW5kbDsKLSAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjb25zdGFudHM6IERpY3Rpb25hcnkgbmV3ISIgPDwgZW5kbDsKLQotICBmXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQotICogdGhlIHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBzdHJpbmcgY2xzX25hbWUgPSBwcm9ncmFtX25hbWVfICsgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSk7Ci0KLSAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBlbnVtcyBhdDogJyIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIicgcHV0OiBbIiA8PAotICAgICIoRGljdGlvbmFyeSBuZXcgIiA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGZfIDw8ICJcdGF0OiAnIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIicgcHV0OiAiIDw8IHZhbHVlIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgZl8gPDwgIlx0eW91cnNlbGYpXSEiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7Ci0KLSAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjb25zdGFudHMgYXQ6ICciIDw8IG5hbWUgPDwgIicgcHV0OiBbIiA8PAotICAgIHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgIl0hIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCAiKCIgPDwgY2FwaXRhbGl6ZSh0eXBlLT5nZXRfbmFtZSgpKSA8PCAiIG5ldyAiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLQotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0KLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIjogIiA8PAotICAgICAgICByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInlvdXJzZWxmKSI7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIG91dCA8PCAiKERpY3Rpb25hcnkgbmV3IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCAiYXQ6ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIG91dCA8PCAiIHB1dDogIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJ5b3Vyc2VsZikiOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBvdXQgPDwgIihTZXQgbmV3IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgIihPcmRlcmVkQ29sbGVjdGlvbiBuZXciIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8ICJhZGQ6ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJ5b3Vyc2VsZikiOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIFNtYWxsdGFsayBzdHJ1Y3QKLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX3N0X3N0cnVjdChmXywgdHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQotICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3N0X3N0cnVjdChmXywgdHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzbWFsbHRhbGsgY2xhc3MgdG8gcmVwcmVzZW50IGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0X3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbiA9IGZhbHNlKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikKLSAgICBvdXQgPDwgIkVycm9yIjsKLSAgZWxzZQotICAgIG91dCA8PCAiT2JqZWN0IjsKLQotICBvdXQgPDwgIiBzdWJjbGFzczogIyIgPDwgcHJlZml4KHR5cGVfbmFtZSh0c3RydWN0KSkgPDwgZW5kbCA8PAotICAgICJcdGluc3RhbmNlVmFyaWFibGVOYW1lczogJyI7Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmIChtX2l0ZXIgIT0gbWVtYmVycy5iZWdpbigpKSBvdXQgPDwgIiAiOwotICAgICAgb3V0IDw8IGNhbWVsY2FzZSgoKm1faXRlciktPmdldF9uYW1lKCkpOwotICAgIH0KLSAgfQotCi0gIG91dCA8PCAiJ1xuIiA8PAotICAgICJcdGNsYXNzVmFyaWFibGVOYW1lczogJydcbiIgPDwKLSAgICAiXHRwb29sRGljdGlvbmFyaWVzOiAnJ1xuIiA8PAotICAgICJcdGNhdGVnb3J5OiAnIiA8PCBnZW5lcmF0ZWRfY2F0ZWdvcnkoKSA8PCAiJyFcblxuIjsKLQotICBnZW5lcmF0ZV9hY2Nlc3NvcnMob3V0LCB0c3RydWN0KTsKLX0KLQotYm9vbCB0X3N0X2dlbmVyYXRvcjo6aXNfdm93ZWwoY2hhciBjKSB7Ci0gIHN3aXRjaCh0b2xvd2VyKGMpKSB7Ci0gICAgY2FzZSAnYSc6IGNhc2UgJ2UnOiBjYXNlICdpJzogY2FzZSAnbyc6IGNhc2UgJ3UnOgotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjphX3R5cGUodF90eXBlKiB0eXBlKSB7Ci0gIHN0cmluZyBwcmVmaXg7Ci0KLSAgaWYgKGlzX3Zvd2VsKHR5cGVfbmFtZSh0eXBlKVswXSkpCi0gICAgcHJlZml4ID0gImFuIjsKLSAgZWxzZQotICAgIHByZWZpeCA9ICJhIjsKLQotICByZXR1cm4gcHJlZml4ICsgY2FwaXRhbGl6ZSh0eXBlX25hbWUodHlwZSkpOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hY2Nlc3NvcnMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBzdHJpbmcgdHlwZTsKLSAgc3RyaW5nIHByZWZpeDsKLQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgc3RfYWNjZXNzb3JzKG91dCwKLSAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKHR5cGVfbmFtZSh0c3RydWN0KSksCi0gICAgICAgICAgICAgICAgICAgY2FtZWxjYXNlKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgYV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIC8vIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjp0ZW1wX25hbWUoKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIG91dCA8PCAidGVtcCIgPDwgdGVtcG9yYXJ5X3ZhcisrOwotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6Om1hcF93cml0ZXIodF9tYXAgKnRtYXAsIHN0cmluZyBmbmFtZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBzdHJpbmcga2V5ID0gdGVtcF9uYW1lKCk7Ci0gIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKLQotICBvdXQgPDwgIltvcHJvdCB3cml0ZU1hcEJlZ2luOiAoVE1hcCBuZXcga2V5VHlwZTogIiA8PCB0eXBlX3RvX2VudW0odG1hcC0+Z2V0X2tleV90eXBlKCkpIDw8Ci0gICAgIjsgdmFsdWVUeXBlOiAiIDw8IHR5cGVfdG9fZW51bSh0bWFwLT5nZXRfdmFsX3R5cGUoKSkgPDwgIjsgc2l6ZTogIiA8PCBmbmFtZSA8PCAiIHNpemUpLiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IGZuYW1lIDw8ICIga2V5c0FuZFZhbHVlc0RvOiBbOiIgPDwga2V5IDw8ICIgOiIgPDwgdmFsIDw8ICIgfCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KSA8PCAiLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IHdyaXRlX3ZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlTWFwRW5kXSB2YWx1ZSI7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjptYXBfcmVhZGVyKHRfbWFwICp0bWFwKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIHN0cmluZyBkZXNjID0gdGVtcF9uYW1lKCk7Ci0gIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKLQotICBvdXQgPDwgIlt8IiA8PCBkZXNjIDw8ICIgIiA8PCB2YWwgPDwgInwgIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgZGVzYyA8PCAiIDo9IGlwcm90IHJlYWRNYXBCZWdpbi4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCB2YWwgPDwgIiA6PSBEaWN0aW9uYXJ5IG5ldy4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCBkZXNjIDw8ICIgc2l6ZSB0aW1lc1JlcGVhdDogWyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIGF0OiAiIDw8IHJlYWRfdmFsKHRtYXAtPmdldF9rZXlfdHlwZSgpKSA8PAotICAgICIgcHV0OiAiIDw8IHJlYWRfdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpKTsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90IHJlYWRNYXBFbmQuIiA8PCBlbmRsIDw8Ci0gIGluZGVudCgpIDw8IHZhbCA8PCAiXSB2YWx1ZSI7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpsaXN0X3dyaXRlcih0X2xpc3QgKnRsaXN0LCBzdHJpbmcgZm5hbWUpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOwotCi0gIG91dCA8PCAiW29wcm90IHdyaXRlTGlzdEJlZ2luOiAoVExpc3QgbmV3IGVsZW1UeXBlOiAiIDw8Ci0gICAgdHlwZV90b19lbnVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpIDw8ICI7IHNpemU6ICIgPDwgZm5hbWUgPDwgIiBzaXplKS4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCBmbmFtZSA8PCAiIGRvOiBbOiIgPDwgdmFsIDw8ICJ8IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgd3JpdGVfdmFsKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHZhbCkgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlTGlzdEVuZF0gdmFsdWUiOwotICBpbmRlbnRfZG93bigpOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6bGlzdF9yZWFkZXIodF9saXN0ICp0bGlzdCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBzdHJpbmcgZGVzYyA9IHRlbXBfbmFtZSgpOwotICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7Ci0KLSAgb3V0IDw8ICJbfCIgPDwgZGVzYyA8PCAiICIgPDwgdmFsIDw8ICJ8ICIgPDwgZGVzYyA8PCAiIDo9IGlwcm90IHJlYWRMaXN0QmVnaW4uIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgOj0gT3JkZXJlZENvbGxlY3Rpb24gbmV3LiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IGRlc2MgPDwgIiBzaXplIHRpbWVzUmVwZWF0OiBbIiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgYWRkOiAiIDw8IHJlYWRfdmFsKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpOwotICBpbmRlbnRfZG93bigpOwotCi0gIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QgcmVhZExpc3RFbmQuIiA8PCBlbmRsIDw8Ci0gIGluZGVudCgpIDw8IHZhbCA8PCAiXSB2YWx1ZSI7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpzZXRfd3JpdGVyKHRfc2V0ICp0c2V0LCBzdHJpbmcgZm5hbWUpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOwotCi0gIG91dCA8PCAiW29wcm90IHdyaXRlU2V0QmVnaW46IChUU2V0IG5ldyBlbGVtVHlwZTogIiA8PCB0eXBlX3RvX2VudW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpKSA8PAotICAgICI7IHNpemU6ICIgPDwgZm5hbWUgPDwgIiBzaXplKS4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCBmbmFtZSA8PCAiIGRvOiBbOiIgPDwgdmFsIDw8ICJ8IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgd3JpdGVfdmFsKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgdmFsKSA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVTZXRFbmRdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnNldF9yZWFkZXIodF9zZXQgKnRzZXQpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgc3RyaW5nIGRlc2MgPSB0ZW1wX25hbWUoKTsKLSAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOwotCi0gIG91dCA8PCAiW3wiIDw8IGRlc2MgPDwgIiAiIDw8IHZhbCA8PCAifCAiIDw8IGRlc2MgPDwgIiA6PSBpcHJvdCByZWFkU2V0QmVnaW4uIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgOj0gU2V0IG5ldy4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCBkZXNjIDw8ICIgc2l6ZSB0aW1lc1JlcGVhdDogWyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIGFkZDogIiA8PCByZWFkX3ZhbCh0c2V0LT5nZXRfZWxlbV90eXBlKCkpOwotICBpbmRlbnRfZG93bigpOwotCi0gIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QgcmVhZFNldEVuZC4iIDw8IGVuZGwgPDwKLSAgaW5kZW50KCkgPDwgdmFsIDw8ICJdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnN0cnVjdF93cml0ZXIodF9zdHJ1Y3QgKnRzdHJ1Y3QsIHN0cmluZyBzbmFtZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0KLSAgb3V0IDw8ICJbb3Byb3Qgd3JpdGVTdHJ1Y3RCZWdpbjogIiA8PAotICAgICIoVFN0cnVjdCBuZXcgbmFtZTogJyIgKyB0c3RydWN0LT5nZXRfbmFtZSgpICsiJykuIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgIGJvb2wgb3B0aW9uYWwgPSAoKmZsZF9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgc3RyaW5nIGZuYW1lID0gY2FtZWxjYXNlKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICBzdHJpbmcgYWNjZXNzb3IgPSBzbmFtZSArICIgIiArIGNhbWVsY2FzZShmbmFtZSk7Ci0KLSAgICBpZiAob3B0aW9uYWwpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBhY2Nlc3NvciA8PCAiIGlmTm90TmlsOiBbIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkQmVnaW46IChURmllbGQgbmV3IG5hbWU6ICciIDw8IGZuYW1lIDw8Ci0gICAgICAiJzsgdHlwZTogIiA8PCB0eXBlX3RvX2VudW0oKCpmbGRfaXRlciktPmdldF90eXBlKCkpIDw8Ci0gICAgICAiOyBpZDogIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpLiIgPDwgZW5kbDsKLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwoKCpmbGRfaXRlciktPmdldF90eXBlKCksIGFjY2Vzc29yKSA8PCAiLiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRFbmQiOwotCi0gICAgaWYgKG9wdGlvbmFsKSB7Ci0gICAgICBvdXQgPDwgIl0iOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIi4iIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRTdG9wOyB3cml0ZVN0cnVjdEVuZF0gdmFsdWUiOwotICBpbmRlbnRfZG93bigpOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6c3RydWN0X3JlYWRlcih0X3N0cnVjdCAqdHN0cnVjdCwgc3RyaW5nIGNsc05hbWUgPSAiIikgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOwotICBzdHJpbmcgZGVzYyA9IHRlbXBfbmFtZSgpOwotICBzdHJpbmcgZm91bmQgPSB0ZW1wX25hbWUoKTsKLQotICBpZiAoY2xzTmFtZS5zaXplKCkgPT0gMCkgewotICAgIGNsc05hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgb3V0IDw8ICJbfCIgPDwgZGVzYyA8PCAiICIgPDwgdmFsIDw8ICJ8IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvL1RoaXMgaXMgbmFzdHksIGJ1dCB3aXRob3V0IGl0IHdlJ2xsIGJyZWFrIHRoaW5ncyBieSBwcmVmaXhpbmcgVFJlc3VsdC4KLSAgc3RyaW5nIG5hbWUgPSAoKGNhcGl0YWxpemUoY2xzTmFtZSkgPT0gIlRSZXN1bHQiKSA/IGNhcGl0YWxpemUoY2xzTmFtZSkgOiBwcmVmaXgoY2xzTmFtZSkpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgOj0gIiA8PCBuYW1lIDw8ICIgbmV3LiIgPDwgZW5kbDsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90IHJlYWRTdHJ1Y3RCZWdpbi4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiWyIgPDwgZGVzYyA8PCAiIDo9IGlwcm90IHJlYWRGaWVsZEJlZ2luLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IGRlc2MgPDwgIiB0eXBlID0gVFR5cGUgc3RvcF0gd2hpbGVGYWxzZTogW3wiIDw8IGZvdW5kIDw8ICJ8IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZXNjIDw8ICIgaWQgPSAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfa2V5KCkgPDwKLSAgICAgICIgaWZUcnVlOiBbIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8IGZvdW5kIDw8ICIgOj0gdHJ1ZS4iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IHZhbCA8PCAiICIgPDwgY2FtZWxjYXNlKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOiAiIDw8Ci0gICAgICByZWFkX3ZhbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIG91dCA8PCAiXS4iIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwgaW5kZW50KCkgPDwgZm91bmQgPDwgIiBpZk5pbDogW2lwcm90IHNraXA6ICIgPDwgZGVzYyA8PCAiIHR5cGVdXS4iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdCByZWFkU3RydWN0RW5kLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IHZhbCA8PCAiXSB2YWx1ZSI7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjp3cml0ZV92YWwodF90eXBlICp0LCBzdHJpbmcgZm5hbWUpIHsKLSAgdCA9IGdldF90cnVlX3R5cGUodCk7Ci0KLSAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKSB0KS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2godGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiaXByb3Qgd3JpdGVEb3VibGU6ICIgKyBmbmFtZSArICIgYXNGbG9hdCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gImlwcm90IHdyaXRlIiArIGNhcGl0YWxpemUodHlwZV9uYW1lKHQpKSArICI6ICIgKyBmbmFtZSArICIgYXNJbnRlZ2VyIjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJpcHJvdCB3cml0ZSIgKyBjYXBpdGFsaXplKHR5cGVfbmFtZSh0KSkgKyAiOiAiICsgZm5hbWU7Ci0gICAgfQotICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuIG1hcF93cml0ZXIoKHRfbWFwKikgdCwgZm5hbWUpOwotICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gc3RydWN0X3dyaXRlcigodF9zdHJ1Y3QqKSB0LCBmbmFtZSk7Ci0gIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuIGxpc3Rfd3JpdGVyKCh0X2xpc3QqKSB0LCBmbmFtZSk7Ci0gIH0gZWxzZSBpZiAodC0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gc2V0X3dyaXRlcigodF9zZXQqKSB0LCBmbmFtZSk7Ci0gIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJpcHJvdCB3cml0ZUkzMjogIiArIGZuYW1lOwotICB9IGVsc2UgewotICAgIHRocm93ICJTb3JyeSwgSSBkb24ndCBrbm93IGhvdyB0byB3cml0ZSB0aGlzOiAiICsgdHlwZV9uYW1lKHQpOwotICB9Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6cmVhZF92YWwodF90eXBlICp0KSB7Ci0gIHQgPSBnZXRfdHJ1ZV90eXBlKHQpOwotCi0gIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiAiaXByb3QgcmVhZCIgKyBjYXBpdGFsaXplKHR5cGVfbmFtZSh0KSk7Ci0gIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gbWFwX3JlYWRlcigodF9tYXAqKSB0KTsKLSAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuIHN0cnVjdF9yZWFkZXIoKHRfc3RydWN0KikgdCk7Ci0gIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuIGxpc3RfcmVhZGVyKCh0X2xpc3QqKSB0KTsKLSAgfSBlbHNlIGlmICh0LT5pc19zZXQoKSkgewotICAgIHJldHVybiBzZXRfcmVhZGVyKCh0X3NldCopIHQpOwotICB9IGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiaXByb3QgcmVhZEkzMiI7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIlNvcnJ5LCBJIGRvbid0IGtub3cgaG93IHRvIHJlYWQgdGhpczogIiArIHR5cGVfbmFtZSh0KTsKLSAgfQotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZW5kX21ldGhvZCh0X2Z1bmN0aW9uKiBmdW5jdGlvbikgewotICBzdHJpbmcgZnVubmFtZSA9IGZ1bmN0aW9uLT5nZXRfbmFtZSgpOwotICBzdHJpbmcgc2lnbmF0dXJlID0gZnVuY3Rpb25fc2lnbmF0dXJlKGZ1bmN0aW9uKTsKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSBmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0KLSAgc3RfbWV0aG9kKGZfLCBjbGllbnRfY2xhc3NfbmFtZSgpLCAic2VuZCIgKyBjYXBpdGFsaXplKHNpZ25hdHVyZSkpOwotICBmXyA8PCAib3Byb3Qgd3JpdGVNZXNzYWdlQmVnaW46IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmXyA8PCBpbmRlbnQoKSA8PCAiKFRDYWxsTWVzc2FnZSBuZXciIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfIDw8IGluZGVudCgpIDw8ICJuYW1lOiAnIiA8PCBmdW5uYW1lIDw8ICInOyAiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAic2VxaWQ6IHNlbGYgbmV4dFNlcWlkKS4iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlU3RydWN0QmVnaW46ICIgPDwKLSAgICAiKFRTdHJ1Y3QgbmV3IG5hbWU6ICciICsgY2FwaXRhbGl6ZShjYW1lbGNhc2UoZnVubmFtZSkpICsgIl9hcmdzJykuIiA8PCBlbmRsOwotCi0gIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgc3RyaW5nIGZuYW1lID0gY2FtZWxjYXNlKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLQotICAgIGZfIDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkQmVnaW46IChURmllbGQgbmV3IG5hbWU6ICciIDw8IGZuYW1lIDw8Ci0gICAgICAiJzsgdHlwZTogIiA8PCB0eXBlX3RvX2VudW0oKCpmbGRfaXRlciktPmdldF90eXBlKCkpIDw8Ci0gICAgICAiOyBpZDogIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpLiIgPDwgZW5kbDsKLQotICAgIGZfIDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSwgZm5hbWUpIDw8ICIuIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVGaWVsZEVuZC4iIDw8IGVuZGw7Ci0gIH0KLQotICBmXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVGaWVsZFN0b3A7IHdyaXRlU3RydWN0RW5kOyB3cml0ZU1lc3NhZ2VFbmQuIiA8PCBlbmRsOwotICBmXyA8PCBpbmRlbnQoKSA8PCAib3Byb3QgdHJhbnNwb3J0IGZsdXNoIjsKLQotICBzdF9jbG9zZV9tZXRob2QoZl8pOwotfQotCi0vLyBXZSBvbmx5IHN1cHBvcnQgcmVjZWl2aW5nIFRSZXN1bHQgc3RydWN0dXJlcyAoc28gdGhpcyB3b24ndCB3b3JrIG9uIHRoZSBzZXJ2ZXIgc2lkZSkKLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlY3ZfbWV0aG9kKHRfZnVuY3Rpb24qIGZ1bmN0aW9uKSB7Ci0gIHN0cmluZyBmdW5uYW1lID0gY2FtZWxjYXNlKGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKLSAgc3RyaW5nIHNpZ25hdHVyZSA9IGZ1bmN0aW9uX3NpZ25hdHVyZShmdW5jdGlvbik7Ci0KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCAiVFJlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3MoZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotCi0gIHRfc3RydWN0KiB4cyA9IGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgLy8gZHVwbGljYXRlIHRoZSBmaWVsZCwgYnV0IGNhbGwgaXQgImV4Y2VwdGlvbiIuLi4gd2UgZG9uJ3QgbmVlZCBhIGR5bmFtaWMgbmFtZQotICAgIHRfZmllbGQgKmV4Y2VwdGlvbiA9IG5ldyB0X2ZpZWxkKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgImV4Y2VwdGlvbiIsICgqZl9pdGVyKS0+Z2V0X2tleSgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGV4Y2VwdGlvbik7Ci0gIH0KLQotICBzdF9tZXRob2QoZl8sIGNsaWVudF9jbGFzc19uYW1lKCksICJyZWN2IiArIGNhcGl0YWxpemUoZnVubmFtZSkpOwotICBmXyA8PCAifCBmIG1zZyByZXMgfCAiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAibXNnIDo9IG9wcm90IHJlYWRNZXNzYWdlQmVnaW4uIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInNlbGYgdmFsaWRhdGVSZW1vdGVNZXNzYWdlOiBtc2cuIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJlcyA6PSAiIDw8IHN0cnVjdF9yZWFkZXIoJnJlc3VsdCkgPDwgIi4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3QgcmVhZE1lc3NhZ2VFbmQuIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90IHRyYW5zcG9ydCBmbHVzaC4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmVzIGV4Y2VwdGlvbiBpZk5vdE5pbDogW3JlcyBleGNlcHRpb24gc2lnbmFsXS4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiXiByZXMiOwotICBzdF9jbG9zZV9tZXRob2QoZl8pOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3R5cGVzX2NvbW1lbnQodF9mdW5jdGlvbiogZm4pIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gZm4tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwgIlwiIjsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIG91dCA8PCBjYW1lbGNhc2UoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOiAiIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIGlmICgoZl9pdGVyICsgMSkgIT0gZmllbGRzLmVuZCgpKSB7Ci0gICAgICBvdXQgPDwgIiwgIjsKLSAgICB9Ci0gIH0KLQotICBvdXQgPDwgIlwiIjsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiVENsaWVudCI7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIkNsaWVudCI7Ci0gIH0KLQotICBmXyA8PCBleHRlbmRzX2NsaWVudCA8PCAiIHN1YmNsYXNzOiAjIiA8PCBwcmVmaXgoY2xpZW50X2NsYXNzX25hbWUoKSkgPDwgZW5kbCA8PAotICAgICJcdGluc3RhbmNlVmFyaWFibGVOYW1lczogJydcbiIgPDwKLSAgICAiXHRjbGFzc1ZhcmlhYmxlTmFtZXM6ICcnXG4iIDw8Ci0gICAgIlx0cG9vbERpY3Rpb25hcmllczogJydcbiIgPDwKLSAgICAiXHRjYXRlZ29yeTogJyIgPDwgZ2VuZXJhdGVkX2NhdGVnb3J5KCkgPDwgIichXG5cbiI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVubmFtZSA9IGNhbWVsY2FzZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOwotICAgIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcik7Ci0KLSAgICBzdF9tZXRob2QoZl8sIGNsaWVudF9jbGFzc19uYW1lKCksIHNpZ25hdHVyZSk7Ci0gICAgZl8gPDwgZnVuY3Rpb25fdHlwZXNfY29tbWVudCgqZl9pdGVyKSA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic2VsZiBzZW5kIiA8PCBjYXBpdGFsaXplKHNpZ25hdHVyZSkgPDwgIi4iIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfIDw8IGluZGVudCgpIDw8ICJeIHNlbGYgcmVjdiIgPDwgY2FwaXRhbGl6ZShmdW5uYW1lKSA8PCAiIHN1Y2Nlc3MgIiA8PCBlbmRsOwotICAgIH0KLQotICAgIHN0X2Nsb3NlX21ldGhvZChmXyk7Ci0KLSAgICBnZW5lcmF0ZV9zZW5kX21ldGhvZCgqZl9pdGVyKTsKLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGdlbmVyYXRlX3JlY3ZfbWV0aG9kKCpmX2l0ZXIpOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHJldHVybiBjYW1lbGNhc2UodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArIGNhcGl0YWxpemUoYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpKTsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICovCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiAiOwotICAgIH0KLSAgICBzdHJpbmcgbmFtZSA9IGNhbWVsY2FzZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOwotICAgIHJlc3VsdCArPSBuYW1lICsgIjogIiArIG5hbWU7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgewotICBzdHJpbmcgcHJlZml4ID0gIiI7Ci0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBpZiAoIXR0eXBlLT5pc19zZXJ2aWNlKCkpIHsKLSAgICAgIHByZWZpeCA9IHByb2dyYW0tPmdldF9uYW1lKCkgKyAiX3R5cGVzLiI7Ci0gICAgfQotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG5hbWUgPSBjYXBpdGFsaXplKHR0eXBlLT5nZXRfbmFtZSgpKTsKLSAgfQotCi0gIHJldHVybiBwcmVmaXggKyBuYW1lOwotfQotCi0vKiBDb252ZXJ0IHRfdHlwZSB0byBTbWFsbHRhbGsgdHlwZSBjb2RlICovCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlIHN0cmluZyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZSBib29sIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlIGJ5dGUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZSBpMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZSBpMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZSBpNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZSBkb3VibGUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlIGkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUgc3RydWN0IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGUgbWFwIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGUgc2V0IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlIGxpc3QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1Ioc3QsICJTbWFsbHRhbGsiLCAiIikKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIzZWM3MC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIFhTRCBnZW5lcmF0b3IsIGNyZWF0ZXMgYW4gWFNEIGZvciB0aGUgYmFzZSB0eXBlcyBldGMuCi0gKgotICovCi1jbGFzcyB0X3hzZF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF94c2RfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICAodm9pZCkgcGFyc2VkX29wdGlvbnM7Ci0gICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4teHNkIjsKLSAgfQotCi0gIHZpcnR1YWwgfnRfeHNkX2dlbmVyYXRvcigpIHt9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgICAodm9pZCkgdGVudW07Ci0gIH0KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKLQotIHByaXZhdGU6Ci0KLSAgdm9pZCBnZW5lcmF0ZV9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR0eXBlLCB0X3N0cnVjdCogYXR0cnM9TlVMTCwgYm9vbCBvcHRpb25hbD1mYWxzZSwgYm9vbCBuaWxsYWJsZT1mYWxzZSwgYm9vbCBsaXN0X2VsZW1lbnQ9ZmFsc2UpOwotCi0gIHN0ZDo6c3RyaW5nIG5zKHN0ZDo6c3RyaW5nIGluLCBzdGQ6OnN0cmluZyBucykgewotICAgIHJldHVybiBucyArICI6IiArIGluOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgeHNkKHN0ZDo6c3RyaW5nIGluKSB7Ci0gICAgcmV0dXJuIG5zKGluLCAieHNkIik7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UpOwotCi0gIC8qKgotICAgKiBPdXRwdXQgeHNkL3BocCBmaWxlCi0gICAqLwotICBzdGQ6Om9mc3RyZWFtIGZfeHNkXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3BocF87Ci0KLSAgLyoqCi0gICAqIE91dHB1dCBzdHJpbmcgc3RyZWFtCi0gICAqLwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gc194c2RfdHlwZXNfOwotCi19OwotCi0KLXZvaWQgdF94c2RfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9waHBfbmFtZSA9IGdldF9vdXRfZGlyKCkrcHJvZ3JhbV8tPmdldF9uYW1lKCkrIl94c2QucGhwIjsKLSAgZl9waHBfLm9wZW4oZl9waHBfbmFtZS5jX3N0cigpKTsKLQotICBmX3BocF8gPDwKLSAgICAiPD9waHAiIDw8IGVuZGw7Ci0KLX0KLQotdm9pZCB0X3hzZF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgZl9waHBfIDw8ICI/PiIgPDwgZW5kbDsKLSAgZl9waHBfLmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF94c2RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwKLSAgICAiPHhzZDpzaW1wbGVUeXBlIG5hbWU9XCIiIDw8IHR0eXBlZGVmLT5nZXRfbmFtZSgpIDw8ICJcIj4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpZiAodHR5cGVkZWYtPmdldF90eXBlKCktPmlzX3N0cmluZygpICYmICgodF9iYXNlX3R5cGUqKXR0eXBlZGVmLT5nZXRfdHlwZSgpKS0+aXNfc3RyaW5nX2VudW0oKSkgewotICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8Ci0gICAgICAiPHhzZDpyZXN0cmljdGlvbiBiYXNlPVwiIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8ICJcIj4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHN0cmluZz4mIHZhbHVlcyA9ICgodF9iYXNlX3R5cGUqKXR0eXBlZGVmLT5nZXRfdHlwZSgpKS0+Z2V0X3N0cmluZ19lbnVtX3ZhbHMoKTsKLSAgICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsdWVzLmJlZ2luKCk7IHZfaXRlciAhPSB2YWx1ZXMuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PAotICAgICAgICAiPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT1cIiIgPDwgKCp2X2l0ZXIpIDw8ICJcIiAvPiIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PAotICAgICAgIjwveHNkOnJlc3RyaWN0aW9uPiIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PAotICAgICAgIjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT1cIiIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCAiXCIgLz4iIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwKLSAgICAiPC94c2Q6c2ltcGxlVHlwZT4iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3hzZF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICBib29sIHhzZF9hbGwgPSB0c3RydWN0LT5nZXRfeHNkX2FsbCgpOwotCi0gIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOmNvbXBsZXhUeXBlIG5hbWU9XCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiPiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGlmICh4c2RfYWxsKSB7Ci0gICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6YWxsPiIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDpzZXF1ZW5jZT4iIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGdlbmVyYXRlX2VsZW1lbnQoc194c2RfdHlwZXNfLCAoKm1faXRlciktPmdldF9uYW1lKCksICgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgKCptX2l0ZXIpLT5nZXRfeHNkX2F0dHJzKCksICgqbV9pdGVyKS0+Z2V0X3hzZF9vcHRpb25hbCgpIHx8IHhzZF9hbGwsICgqbV9pdGVyKS0+Z2V0X3hzZF9uaWxsYWJsZSgpKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGlmICh4c2RfYWxsKSB7Ci0gICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjwveHNkOmFsbD4iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjwveHNkOnNlcXVlbmNlPiIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PAotICAgICI8L3hzZDpjb21wbGV4VHlwZT4iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi12b2lkIHRfeHNkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZWxlbWVudChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogYXR0cnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuaWxsYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGlzdF9lbGVtZW50KSB7Ci0gIHN0cmluZyBzbWluT2NjdXJzID0gKG9wdGlvbmFsIHx8IGxpc3RfZWxlbWVudCkgPyAiIG1pbk9jY3Vycz1cIjBcIiIgOiAiIjsKLSAgc3RyaW5nIHNtYXhPY2N1cnMgPSBsaXN0X2VsZW1lbnQgPyAiIG1heE9jY3Vycz1cInVuYm91bmRlZFwiIiA6ICIiOwotICBzdHJpbmcgc29wdGlvbmFsID0gc21pbk9jY3VycyArIHNtYXhPY2N1cnM7Ci0gIHN0cmluZyBzbmlsbGFibGUgPSBuaWxsYWJsZSA/ICIgbmlsbGFibGU9XCJ0cnVlXCIiIDogIiI7Ci0KLSAgaWYgKHR0eXBlLT5pc192b2lkKCkgfHwgdHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiPHhzZDplbGVtZW50IG5hbWU9XCIiIDw8IG5hbWUgPDwgIlwiIiA8PCBzb3B0aW9uYWwgPDwgc25pbGxhYmxlIDw8ICI+IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmIChhdHRycyA9PSBOVUxMICYmIHR0eXBlLT5pc192b2lkKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICI8eHNkOmNvbXBsZXhUeXBlIC8+IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiPHhzZDpjb21wbGV4VHlwZT4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOnNlcXVlbmNlIG1pbk9jY3Vycz1cIjBcIiBtYXhPY2N1cnM9XCJ1bmJvdW5kZWRcIj4iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBzdHJpbmcgc3VibmFtZTsKLSAgICAgICAgdF90eXBlKiBzdWJ0eXBlID0gKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgICBpZiAoc3VidHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgc3VidHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgICAgICBzdWJuYW1lID0gbmFtZSArICJfZWx0IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzdWJuYW1lID0gdHlwZV9uYW1lKHN1YnR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGZfcGhwXyA8PCAiJEdMT0JBTFNbJyIgPDwgcHJvZ3JhbV8tPmdldF9uYW1lKCkgPDwgIl94c2RfZWx0XyIgPDwgbmFtZSA8PCAiJ10gPSAnIiA8PCBzdWJuYW1lIDw8ICInOyIgPDwgZW5kbDsKLSAgICAgICAgZ2VuZXJhdGVfZWxlbWVudChvdXQsIHN1Ym5hbWUsIHN1YnR5cGUsIE5VTEwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpzZXF1ZW5jZT4iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmF0dHJpYnV0ZSBuYW1lPVwibGlzdFwiIHR5cGU9XCJ4c2Q6Ym9vbGVhblwiIC8+IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaWYgKGF0dHJzICE9IE5VTEwpIHsKLSAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IGF0dHJzLT5nZXRfbWVtYmVycygpOwotICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgICAgIGZvciAoYV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBhX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKythX2l0ZXIpIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDphdHRyaWJ1dGUgbmFtZT1cIiIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiB0eXBlPVwiIiA8PCB0eXBlX25hbWUoKCphX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiXCIgLz4iIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiPC94c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiPC94c2Q6ZWxlbWVudD4iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGF0dHJzID09IE5VTEwpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICI8eHNkOmVsZW1lbnQgbmFtZT1cIiIgPDwgbmFtZSA8PCAiXCIiIDw8ICIgdHlwZT1cIiIgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCAiXCIiIDw8IHNvcHRpb25hbCA8PCBzbmlsbGFibGUgPDwgIiAvPiIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgLy8gV293LCBhbGwgdGhpcyB3b3JrIGZvciBhIFNJTVBMRSBUWVBFIHdpdGggYXR0cmlidXRlcz8hPyE/IQotICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6ZWxlbWVudCBuYW1lPVwiIiA8PCBuYW1lIDw8ICJcIiIgPDwgc29wdGlvbmFsIDw8IHNuaWxsYWJsZSA8PCAiPiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpjb21wbGV4Q29udGVudD4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmV4dGVuc2lvbiBiYXNlPVwiIiA8PCB0eXBlX25hbWUodHR5cGUpIDw8ICJcIj4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSBhdHRycy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKLSAgICAgIGZvciAoYV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBhX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKythX2l0ZXIpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6YXR0cmlidXRlIG5hbWU9XCIiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIgdHlwZT1cIiIgPDwgdHlwZV9uYW1lKCgqYV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIlwiIC8+IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpleHRlbnNpb24+IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpjb21wbGV4Q29udGVudD4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6ZWxlbWVudD4iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgdF94c2RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl94c2RfbmFtZSA9IGdldF9vdXRfZGlyKCkrdHNlcnZpY2UtPmdldF9uYW1lKCkrIi54c2QiOwotICBmX3hzZF8ub3BlbihmX3hzZF9uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBucyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJ4c2QiKTsKLSAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICBucyA9ICIgdGFyZ2V0TmFtZXNwYWNlPVwiIiArIG5zICsgIlwiIHhtbG5zPVwiIiArIG5zICsgIlwiICIgKwotICAgICAgImVsZW1lbnRGb3JtRGVmYXVsdD1cInF1YWxpZmllZFwiIjsKLSAgfQotCi0gIC8vIFByaW50IHRoZSBYU0QgaGVhZGVyCi0gIGZfeHNkXyA8PAotICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiID8+IiA8PCBlbmRsIDw8Ci0gICAgIjx4c2Q6c2NoZW1hIHhtbG5zOnhzZD1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCIiIDw8IG5zIDw8ICI+IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICI8IS0tIFlvIHlvIHlvLCB0aGlzIFhTRCB3b3ogYmUgZ2VuZXJhdGVkIGJ5IFRocmlmdC4gLS0+IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBQcmludCBvdXQgdGhlIHR5cGUgZGVmaW5pdGlvbnMKLSAgaW5kZW50KGZfeHNkXykgPDwgc194c2RfdHlwZXNfLnN0cigpOwotCi0gIC8vIEtlZXAgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgZXhjZXB0aW9ucyB0aGF0IG1pZ2h0IGdldCB0aHJvd24KLSAgbWFwPHN0cmluZywgdF9zdHJ1Y3QqPiBhbGxfeGNlcHRpb25zOwotCi0gIC8vIExpc3QgdGhlIGVsZW1lbnRzIHRoYXQgeW91IG1pZ2h0IGFjdHVhbGx5IGdldAotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZWxlbW5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3BvbnNlIjsKLSAgICB0X3R5cGUqIHJldHVybnR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7Ci0gICAgZ2VuZXJhdGVfZWxlbWVudChmX3hzZF8sIGVsZW1uYW1lLCByZXR1cm50eXBlKTsKLSAgICBmX3hzZF8gPDwgZW5kbDsKLQotICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBhbGxfeGNlcHRpb25zWygqeF9pdGVyKS0+Z2V0X25hbWUoKV0gPSAodF9zdHJ1Y3QqKSgoKnhfaXRlciktPmdldF90eXBlKCkpOwotICAgIH0KLSAgfQotCi0gIG1hcDxzdHJpbmcsIHRfc3RydWN0Kj46Oml0ZXJhdG9yIGF4X2l0ZXI7Ci0gIGZvciAoYXhfaXRlciA9IGFsbF94Y2VwdGlvbnMuYmVnaW4oKTsgYXhfaXRlciAhPSBhbGxfeGNlcHRpb25zLmVuZCgpOyArK2F4X2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9lbGVtZW50KGZfeHNkXywgYXhfaXRlci0+Zmlyc3QsIGF4X2l0ZXItPnNlY29uZCk7Ci0gIH0KLQotICAvLyBDbG9zZSB0aGUgWFNEIGRvY3VtZW50Ci0gIGZfeHNkXyA8PCBlbmRsIDw8ICI8L3hzZDpzY2hlbWE+IiA8PCBlbmRsOwotICBmX3hzZF8uY2xvc2UoKTsKLX0KLQotc3RyaW5nIHRfeHNkX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKLSAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuIHhzZChiYXNlX3R5cGVfbmFtZSgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkpKTsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuIHhzZCgiaW50Iik7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgcmV0dXJuICJjb250YWluZXIiOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIFhTRCB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgotICoKLSAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCi0gKiBAcmV0dXJuIEV4cGxpY2l0IFhTRCB0eXBlLCBpLmUuIHhzZDpzdHJpbmcKLSAqLwotc3RyaW5nIHRfeHNkX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSkgewotICBzd2l0Y2ggKHRiYXNlKSB7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICByZXR1cm4gInZvaWQiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICByZXR1cm4gInN0cmluZyI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICByZXR1cm4gImJvb2xlYW4iOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgcmV0dXJuICJieXRlIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgcmV0dXJuICJzaG9ydCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIHJldHVybiAiaW50IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgcmV0dXJuICJsb25nIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgcmV0dXJuICJkZWNpbWFsIjsKLSAgZGVmYXVsdDoKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyBiYXNlIHR5cGUgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICB9Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoeHNkLCAiWFNEIiwgIiIpCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2xvYmFscy5oIGIvY29tcGlsZXIvY3BwL3NyYy9nbG9iYWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMDQxNDMuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nbG9iYWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfR0xPQkFMU19ICi0jZGVmaW5lIFRfR0xPQkFMU19ICi0KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8cXVldWU+Ci0jaW5jbHVkZSA8c3RhY2s+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHN0cmluZz4KLQotLyoqCi0gKiBUaGlzIG1vZHVsZSBjb250YWlucyBhbGwgdGhlIGdsb2JhbCB2YXJpYWJsZXMgKHNsYXAgb24gdGhlIHdyaXN0KSB0aGF0IGFyZQotICogc2hhcmVkIHRocm91Z2hvdXQgdGhlIHByb2dyYW0uIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdG8gZmFjaWxpdGF0ZSBzaW1wbGUKLSAqIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIHBhcnNlciBhbmQgdGhlIHJlc3Qgb2YgdGhlIHByb2dyYW0uIEJlZm9yZSBjYWxsaW5nCi0gKiB5eXBhcnNlKCksIHRoZSBtYWluLmNjIHByb2dyYW0gd2lsbCBtYWtlIG5lY2Vzc2FyeSBhZGp1c3RtZW50cyB0byB0aGVzZQotICogZ2xvYmFsIHZhcmlhYmxlcyBzdWNoIHRoYXQgdGhlIHBhcnNlciBkb2VzIHRoZSByaWdodCB0aGluZyBhbmQgcHV0cyBlbnRyaWVzCi0gKiBpbnRvIHRoZSByaWdodCBjb250YWluZXJzLCBldGMuCi0gKgotICovCi0KLS8qKgotICogSG9vcmF5IGZvciBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHR5cGVzIQotICovCi0KLWNsYXNzIHRfcHJvZ3JhbTsKLWNsYXNzIHRfc2NvcGU7Ci1jbGFzcyB0X3R5cGU7Ci0KLS8qKgotICogUGFyc2luZyBtb2RlLCB0d28gcGFzc2VzIHVwIGluIHRoaXMgZ2luIHJ1bW15IQotICovCi0KLWVudW0gUEFSU0VfTU9ERSB7Ci0gIElOQ0xVREVTID0gMSwKLSAgUFJPR1JBTSA9IDIKLX07Ci0KLS8qKgotICogU3RyaWN0bmVzcyBsZXZlbAotICovCi1leHRlcm4gaW50IGdfc3RyaWN0OwotCi0vKioKLSAqIFRoZSBtYXN0ZXIgcHJvZ3JhbSBwYXJzZSB0cmVlLiBUaGlzIGlzIGFjY2Vzc2VkIGZyb20gd2l0aGluIHRoZSBwYXJzZXIgY29kZQotICogdG8gYnVpbGQgdXAgdGhlIHByb2dyYW0gZWxlbWVudHMuCi0gKi8KLWV4dGVybiB0X3Byb2dyYW0qIGdfcHJvZ3JhbTsKLQotLyoqCi0gKiBHbG9iYWwgdHlwZXMgZm9yIHRoZSBwYXJzZXIgdG8gYmUgYWJsZSB0byByZWZlcmVuY2UKLSAqLwotCi1leHRlcm4gdF90eXBlKiBnX3R5cGVfdm9pZDsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9zdHJpbmc7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfYmluYXJ5OwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX3NsaXN0OwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX2Jvb2w7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfYnl0ZTsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9pMTY7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfaTMyOwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX2k2NDsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9kb3VibGU7Ci0KLS8qKgotICogVGhlIHNjb3BlIHRoYXQgd2UgYXJlIGN1cnJlbnRseSBwYXJzaW5nIGludG8KLSAqLwotZXh0ZXJuIHRfc2NvcGUqIGdfc2NvcGU7Ci0KLS8qKgotICogVGhlIHBhcmVudCBzY29wZSB0byBhbHNvIGxvYWQgc3ltYm9scyBpbnRvCi0gKi8KLWV4dGVybiB0X3Njb3BlKiBnX3BhcmVudF9zY29wZTsKLQotLyoqCi0gKiBUaGUgcHJlZml4IGZvciB0aGUgcGFyZW50IHNjb3BlIGVudHJpZXMKLSAqLwotZXh0ZXJuIHN0ZDo6c3RyaW5nIGdfcGFyZW50X3ByZWZpeDsKLQotLyoqCi0gKiBUaGUgcGFyc2luZyBwYXNzIHRoYXQgd2UgYXJlIG9uLiBXZSBkbyBkaWZmZXJlbnQgdGhpbmdzIG9uIGVhY2ggcGFzcy4KLSAqLwotZXh0ZXJuIFBBUlNFX01PREUgZ19wYXJzZV9tb2RlOwotCi0vKioKLSAqIEdsb2JhbCB0aW1lIHN0cmluZywgdXNlZCBpbiBmb3JtYXR0aW5nIGVycm9yIG1lc3NhZ2VzIGV0Yy4KLSAqLwotZXh0ZXJuIGNoYXIqIGdfdGltZV9zdHI7Ci0KLS8qKgotICogVGhlIGxhc3QgcGFyc2VkIGRvY3RleHQgY29tbWVudC4KLSAqLwotZXh0ZXJuIGNoYXIqIGdfZG9jdGV4dDsKLQotLyoqCi0gKiBUaGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgcGFyc2VkIGRvY3RleHQgY29tbWVudC4KLSAqLwotZXh0ZXJuIGludCBnX2RvY3RleHRfbGluZW5vOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvbWFpbi5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvbWFpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0YTg3NC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL21haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiB0aHJpZnQgLSBhIGxpZ2h0d2VpZ2h0IGNyb3NzLWxhbmd1YWdlIHJwYy9zZXJpYWxpemF0aW9uIHRvb2wKLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1haW4gY29tcGlsZXIgZW5naW5lIGZvciBUaHJpZnQsIHdoaWNoIGludm9rZXMgdGhlCi0gKiBzY2FubmVyL3BhcnNlciB0byBidWlsZCB0aGUgdGhyaWZ0IG9iamVjdCB0cmVlLiBUaGUgaW50ZXJmYWNlIGdlbmVyYXRpb24KLSAqIGNvZGUgZm9yIGVhY2ggbGFuZ3VhZ2UgbGl2ZXMgaW4gYSBmaWxlIGJ5IHRoZSBsYW5ndWFnZSBuYW1lIHVuZGVyIHRoZQotICogZ2VuZXJhdGUvIGZvbGRlciwgYW5kIGFsbCBwYXJzZSBzdHJ1Y3R1cmVzIGxpdmUgaW4gcGFyc2UvCi0gKgotICovCi0KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotCi0jaWZkZWYgTUlOR1cKLSMgaW5jbHVkZSA8d2luZG93cy5oPiAvKiBmb3IgR2V0RnVsbFBhdGhOYW1lICovCi0jZW5kaWYKLQotLy8gQ2FyZWZ1bDogbXVzdCBpbmNsdWRlIGdsb2JhbHMgZmlyc3QgZm9yIGV4dGVybiBkZWZpbml0aW9ucwotI2luY2x1ZGUgImdsb2JhbHMuaCIKLQotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJwYXJzZS90X3Byb2dyYW0uaCIKLSNpbmNsdWRlICJwYXJzZS90X3Njb3BlLmgiCi0jaW5jbHVkZSAiZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKLQotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotLyoqCi0gKiBHbG9iYWwgcHJvZ3JhbSB0cmVlCi0gKi8KLXRfcHJvZ3JhbSogZ19wcm9ncmFtOwotCi0vKioKLSAqIEdsb2JhbCB0eXBlcwotICovCi0KLXRfdHlwZSogZ190eXBlX3ZvaWQ7Ci10X3R5cGUqIGdfdHlwZV9zdHJpbmc7Ci10X3R5cGUqIGdfdHlwZV9iaW5hcnk7Ci10X3R5cGUqIGdfdHlwZV9zbGlzdDsKLXRfdHlwZSogZ190eXBlX2Jvb2w7Ci10X3R5cGUqIGdfdHlwZV9ieXRlOwotdF90eXBlKiBnX3R5cGVfaTE2OwotdF90eXBlKiBnX3R5cGVfaTMyOwotdF90eXBlKiBnX3R5cGVfaTY0OwotdF90eXBlKiBnX3R5cGVfZG91YmxlOwotCi0vKioKLSAqIEdsb2JhbCBzY29wZQotICovCi10X3Njb3BlKiBnX3Njb3BlOwotCi0vKioKLSAqIFBhcmVudCBzY29wZSB0byBhbHNvIHBhcnNlIHR5cGVzCi0gKi8KLXRfc2NvcGUqIGdfcGFyZW50X3Njb3BlOwotCi0vKioKLSAqIFByZWZpeCBmb3IgcHV0dGluZyB0eXBlcyBpbiBwYXJlbnQgc2NvcGUKLSAqLwotc3RyaW5nIGdfcGFyZW50X3ByZWZpeDsKLQotLyoqCi0gKiBQYXJzaW5nIHBhc3MKLSAqLwotUEFSU0VfTU9ERSBnX3BhcnNlX21vZGU7Ci0KLS8qKgotICogQ3VycmVudCBkaXJlY3Rvcnkgb2YgZmlsZSBiZWluZyBwYXJzZWQKLSAqLwotc3RyaW5nIGdfY3VyZGlyOwotCi0vKioKLSAqIEN1cnJlbnQgZmlsZSBiZWluZyBwYXJzZWQKLSAqLwotc3RyaW5nIGdfY3VycGF0aDsKLQotLyoqCi0gKiBTZWFyY2ggcGF0aCBmb3IgaW5jbHVzaW9ucwotICovCi12ZWN0b3I8c3RyaW5nPiBnX2luY2xfc2VhcmNocGF0aDsKLQotLyoqCi0gKiBTaG91bGQgQysrIGluY2x1ZGUgc3RhdGVtZW50cyB1c2UgcGF0aCBwcmVmaXhlcyBmb3Igb3RoZXIgdGhyaWZ0LWdlbmVyYXRlZAotICogaGVhZGVyIGZpbGVzCi0gKi8KLWJvb2wgZ19jcHBfdXNlX2luY2x1ZGVfcHJlZml4ID0gZmFsc2U7Ci0KLS8qKgotICogR2xvYmFsIGRlYnVnIHN0YXRlCi0gKi8KLWludCBnX2RlYnVnID0gMDsKLQotLyoqCi0gKiBTdHJpY3RuZXNzIGxldmVsCi0gKi8KLWludCBnX3N0cmljdCA9IDEyNzsKLQotLyoqCi0gKiBXYXJuaW5nIGxldmVsCi0gKi8KLWludCBnX3dhcm4gPSAxOwotCi0vKioKLSAqIFZlcmJvc2Ugb3V0cHV0Ci0gKi8KLWludCBnX3ZlcmJvc2UgPSAwOwotCi0vKioKLSAqIEdsb2JhbCB0aW1lIHN0cmluZwotICovCi1jaGFyKiBnX3RpbWVfc3RyOwotCi0vKioKLSAqIFRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCi0gKi8KLWNoYXIqIGdfZG9jdGV4dDsKLQotLyoqCi0gKiBUaGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgcGFyc2VkIGRvY3RleHQgY29tbWVudC4KLSAqLwotaW50IGdfZG9jdGV4dF9saW5lbm87Ci0KLS8qKgotICogRmxhZ3MgdG8gY29udHJvbCBjb2RlIGdlbmVyYXRpb24KLSAqLwotYm9vbCBnZW5fY3BwID0gZmFsc2U7Ci1ib29sIGdlbl9kZW5zZSA9IGZhbHNlOwotYm9vbCBnZW5famF2YSA9IGZhbHNlOwotYm9vbCBnZW5famF2YWJlYW4gPSBmYWxzZTsKLWJvb2wgZ2VuX3JiID0gZmFsc2U7Ci1ib29sIGdlbl9weSA9IGZhbHNlOwotYm9vbCBnZW5fcHlfbmV3c3R5bGUgPSBmYWxzZTsKLWJvb2wgZ2VuX3hzZCA9IGZhbHNlOwotYm9vbCBnZW5fcGhwID0gZmFsc2U7Ci1ib29sIGdlbl9waHBpID0gZmFsc2U7Ci1ib29sIGdlbl9waHBzID0gdHJ1ZTsKLWJvb2wgZ2VuX3BocGEgPSBmYWxzZTsKLWJvb2wgZ2VuX3BocG8gPSBmYWxzZTsKLWJvb2wgZ2VuX3Jlc3QgPSBmYWxzZTsKLWJvb2wgZ2VuX3BlcmwgPSBmYWxzZTsKLWJvb2wgZ2VuX2VybCA9IGZhbHNlOwotYm9vbCBnZW5fb2NhbWwgPSBmYWxzZTsKLWJvb2wgZ2VuX2hzID0gZmFsc2U7Ci1ib29sIGdlbl9jb2NvYSA9IGZhbHNlOwotYm9vbCBnZW5fY3NoYXJwID0gZmFsc2U7Ci1ib29sIGdlbl9zdCA9IGZhbHNlOwotYm9vbCBnZW5fcmVjdXJzZSA9IGZhbHNlOwotCi0vKioKLSAqIE1pbkdXIGRvZXNuJ3QgaGF2ZSByZWFscGF0aCwgc28gdXNlIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIGluIHRoYXQgY2FzZSwKLSAqIG90aGVyd2lzZSB0aGlzIGp1c3QgY2FsbHMgdGhyb3VnaCB0byByZWFscGF0aAotICovCi1jaGFyICpzYWZlcmVhbHBhdGgoY29uc3QgY2hhciAqcGF0aCwgY2hhciAqcmVzb2x2ZWRfcGF0aCkgewotI2lmZGVmIE1JTkdXCi0gIGNoYXIgYnVmW01BWF9QQVRIXTsKLSAgY2hhciogYmFzZW5hbWU7Ci0gIERXT1JEIGxlbiA9IEdldEZ1bGxQYXRoTmFtZShwYXRoLCBNQVhfUEFUSCwgYnVmLCAmYmFzZW5hbWUpOwotICBpZiAobGVuID09IDAgfHwgbGVuID4gTUFYX1BBVEggLSAxKXsKLSAgICBzdHJjcHkocmVzb2x2ZWRfcGF0aCwgcGF0aCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyY3B5KHJlc29sdmVkX3BhdGgsIGJ1Zik7Ci0gIH0KLQotICAvLyBSZXBsYWNlIGJhY2tzbGFzaGVzIHdpdGggZm9yd2FyZCBzbGFzaGVzIHNvIHRoZQotICAvLyByZXN0IG9mIHRoZSBjb2RlIGJlaGF2ZXMgY29ycmVjdGx5LgotICBzaXplX3QgcmVzb2x2ZWRfbGVuID0gc3RybGVuKHJlc29sdmVkX3BhdGgpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc29sdmVkX2xlbjsgaSsrKSB7Ci0gICAgaWYgKHJlc29sdmVkX3BhdGhbaV0gPT0gJ1xcJykgewotICAgICAgcmVzb2x2ZWRfcGF0aFtpXSA9ICcvJzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc29sdmVkX3BhdGg7Ci0jZWxzZQotICByZXR1cm4gcmVhbHBhdGgocGF0aCwgcmVzb2x2ZWRfcGF0aCk7Ci0jZW5kaWYKLX0KLQotCi0vKioKLSAqIFJlcG9ydCBhbiBlcnJvciB0byB0aGUgdXNlci4gVGhpcyBpcyBjYWxsZWQgeXllcnJvciBmb3IgaGlzdG9yaWNhbAotICogcmVhc29ucyAobGV4IGFuZCB5YWNjIGV4cGVjdCB0aGUgZXJyb3IgcmVwb3J0aW5nIHJvdXRpbmUgdG8gYmUgY2FsbGVkCi0gKiB0aGlzKS4gQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHJlcG9ydCBhbnkgZXJyb3JzIHRvIHRoZSB1c2VyLgotICogeXllcnJvciB0YWtlcyBwcmludGYgc3R5bGUgYXJndW1lbnRzLgotICoKLSAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCi0gKi8KLXZvaWQgeXllcnJvcihjb25zdCBjaGFyKiBmbXQsIC4uLikgewotICB2YV9saXN0IGFyZ3M7Ci0gIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICJbRVJST1I6JXM6JWRdIChsYXN0IHRva2VuIHdhcyAnJXMnKVxuIiwKLSAgICAgICAgICBnX2N1cnBhdGguY19zdHIoKSwKLSAgICAgICAgICB5eWxpbmVubywKLSAgICAgICAgICB5eXRleHQpOwotCi0gIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0gIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdzKTsKLSAgdmFfZW5kKGFyZ3MpOwotCi0gIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKLX0KLQotLyoqCi0gKiBQcmludHMgYSBkZWJ1ZyBtZXNzYWdlIGZyb20gdGhlIHBhcnNlci4KLSAqCi0gKiBAcGFyYW0gZm10IEMgZm9ybWF0IHN0cmluZyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGFyZ3VtZW50cwotICovCi12b2lkIHBkZWJ1Zyhjb25zdCBjaGFyKiBmbXQsIC4uLikgewotICBpZiAoZ19kZWJ1ZyA9PSAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHZhX2xpc3QgYXJnczsKLSAgcHJpbnRmKCJbUEFSU0U6JWRdICIsIHl5bGluZW5vKTsKLSAgdmFfc3RhcnQoYXJncywgZm10KTsKLSAgdnByaW50ZihmbXQsIGFyZ3MpOwotICB2YV9lbmQoYXJncyk7Ci0gIHByaW50ZigiXG4iKTsKLX0KLQotLyoqCi0gKiBQcmludHMgYSB2ZXJib3NlIG91dHB1dCBtb2RlIG1lc3NhZ2UKLSAqCi0gKiBAcGFyYW0gZm10IEMgZm9ybWF0IHN0cmluZyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGFyZ3VtZW50cwotICovCi12b2lkIHB2ZXJib3NlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7Ci0gIGlmIChnX3ZlcmJvc2UgPT0gMCkgewotICAgIHJldHVybjsKLSAgfQotICB2YV9saXN0IGFyZ3M7Ci0gIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0gIHZwcmludGYoZm10LCBhcmdzKTsKLSAgdmFfZW5kKGFyZ3MpOwotfQotCi0vKioKLSAqIFByaW50cyBhIHdhcm5pbmcgbWVzc2FnZQotICoKLSAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCi0gKi8KLXZvaWQgcHdhcm5pbmcoaW50IGxldmVsLCBjb25zdCBjaGFyKiBmbXQsIC4uLikgewotICBpZiAoZ193YXJuIDwgbGV2ZWwpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgdmFfbGlzdCBhcmdzOwotICBwcmludGYoIltXQVJOSU5HOiVzOiVkXSAiLCBnX2N1cnBhdGguY19zdHIoKSwgeXlsaW5lbm8pOwotICB2YV9zdGFydChhcmdzLCBmbXQpOwotICB2cHJpbnRmKGZtdCwgYXJncyk7Ci0gIHZhX2VuZChhcmdzKTsKLSAgcHJpbnRmKCJcbiIpOwotfQotCi0vKioKLSAqIFByaW50cyBhIGZhaWx1cmUgbWVzc2FnZSBhbmQgZXhpdHMKLSAqCi0gKiBAcGFyYW0gZm10IEMgZm9ybWF0IHN0cmluZyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGFyZ3VtZW50cwotICovCi12b2lkIGZhaWx1cmUoY29uc3QgY2hhciogZm10LCAuLi4pIHsKLSAgdmFfbGlzdCBhcmdzOwotICBmcHJpbnRmKHN0ZGVyciwgIltGQUlMVVJFOiVzOiVkXSAiLCBnX2N1cnBhdGguY19zdHIoKSwgeXlsaW5lbm8pOwotICB2YV9zdGFydChhcmdzLCBmbXQpOwotICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJncyk7Ci0gIHZhX2VuZChhcmdzKTsKLSAgcHJpbnRmKCJcbiIpOwotICBleGl0KDEpOwotfQotCi0vKioKLSAqIENvbnZlcnRzIGEgc3RyaW5nIGZpbGVuYW1lIGludG8gYSB0aHJpZnQgcHJvZ3JhbSBuYW1lCi0gKi8KLXN0cmluZyBwcm9ncmFtX25hbWUoc3RyaW5nIGZpbGVuYW1lKSB7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIHNsYXNoID0gZmlsZW5hbWUucmZpbmQoIi8iKTsKLSAgaWYgKHNsYXNoICE9IHN0cmluZzo6bnBvcykgewotICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyKHNsYXNoKzEpOwotICB9Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGRvdCA9IGZpbGVuYW1lLnJmaW5kKCIuIik7Ci0gIGlmIChkb3QgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHIoMCwgZG90KTsKLSAgfQotICByZXR1cm4gZmlsZW5hbWU7Ci19Ci0KLS8qKgotICogR2V0cyB0aGUgZGlyZWN0b3J5IHBhdGggb2YgYSBmaWxlbmFtZQotICovCi1zdHJpbmcgZGlyZWN0b3J5X25hbWUoc3RyaW5nIGZpbGVuYW1lKSB7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIHNsYXNoID0gZmlsZW5hbWUucmZpbmQoIi8iKTsKLSAgLy8gTm8gc2xhc2gsIGp1c3QgdXNlIHRoZSBjdXJyZW50IGRpcmVjdG9yeQotICBpZiAoc2xhc2ggPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgcmV0dXJuICIuIjsKLSAgfQotICByZXR1cm4gZmlsZW5hbWUuc3Vic3RyKDAsIHNsYXNoKTsKLX0KLQotLyoqCi0gKiBGaW5kcyB0aGUgYXBwcm9wcmlhdGUgZmlsZSBwYXRoIGZvciB0aGUgZ2l2ZW4gZmlsZW5hbWUKLSAqLwotc3RyaW5nIGluY2x1ZGVfZmlsZShzdHJpbmcgZmlsZW5hbWUpIHsKLSAgLy8gQWJzb2x1dGUgcGF0aD8gSnVzdCB0cnkgdGhhdAotICBpZiAoZmlsZW5hbWVbMF0gPT0gJy8nKSB7Ci0gICAgLy8gUmVhbHBhdGghCi0gICAgY2hhciBycFtQQVRIX01BWF07Ci0gICAgaWYgKHNhZmVyZWFscGF0aChmaWxlbmFtZS5jX3N0cigpLCBycCkgPT0gTlVMTCkgewotICAgICAgcHdhcm5pbmcoMCwgIkNhbm5vdCBvcGVuIGluY2x1ZGUgZmlsZSAlc1xuIiwgZmlsZW5hbWUuY19zdHIoKSk7Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvLyBTdGF0IHRoaXMgZmlsZQotICAgIHN0cnVjdCBzdGF0IGZpbmZvOwotICAgIGlmIChzdGF0KHJwLCAmZmluZm8pID09IDApIHsKLSAgICAgIHJldHVybiBycDsKLSAgICB9Ci0gIH0gZWxzZSB7IC8vIHJlbGF0aXZlIHBhdGgsIHN0YXJ0IHNlYXJjaGluZwotICAgIC8vIG5ldyBzZWFyY2ggcGF0aCB3aXRoIGN1cnJlbnQgZGlyIGdsb2JhbAotICAgIHZlY3RvcjxzdHJpbmc+IHNwID0gZ19pbmNsX3NlYXJjaHBhdGg7Ci0gICAgc3AuaW5zZXJ0KHNwLmJlZ2luKCksIGdfY3VyZGlyKTsKLQotICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBwYXRocwotICAgIHZlY3RvcjxzdHJpbmc+OjppdGVyYXRvciBpdDsKLSAgICBmb3IgKGl0ID0gc3AuYmVnaW4oKTsgaXQgIT0gc3AuZW5kKCk7IGl0KyspIHsKLSAgICAgIHN0cmluZyBzZmlsZW5hbWUgPSAqKGl0KSArICIvIiArIGZpbGVuYW1lOwotCi0gICAgICAvLyBSZWFscGF0aCEKLSAgICAgIGNoYXIgcnBbUEFUSF9NQVhdOwotICAgICAgaWYgKHNhZmVyZWFscGF0aChzZmlsZW5hbWUuY19zdHIoKSwgcnApID09IE5VTEwpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFN0YXQgdGhpcyBmaWxlcwotICAgICAgc3RydWN0IHN0YXQgZmluZm87Ci0gICAgICBpZiAoc3RhdChycCwgJmZpbmZvKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBycDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBVaCBvaAotICBwd2FybmluZygwLCAiQ291bGQgbm90IGZpbmQgaW5jbHVkZSBmaWxlICVzXG4iLCBmaWxlbmFtZS5jX3N0cigpKTsKLSAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7Ci19Ci0KLS8qKgotICogQ2xlYXJzIGFueSBwcmV2aW91c2x5IHN0b3JlZCBkb2N0ZXh0IHN0cmluZy4KLSAqIEFsc28gcHJpbnRzIGEgd2FybmluZyBpZiB3ZSBhcmUgZGlzY2FyZGluZyBpbmZvcm1hdGlvbi4KLSAqLwotdm9pZCBjbGVhcl9kb2N0ZXh0KCkgewotICBpZiAoZ19kb2N0ZXh0ICE9IE5VTEwpIHsKLSAgICBwd2FybmluZygyLCAiVW5jYXB0dXJlZCBkb2N0ZXh0IGF0IG9uIGxpbmUgJWQuIiwgZ19kb2N0ZXh0X2xpbmVubyk7Ci0gIH0KLSAgZnJlZShnX2RvY3RleHQpOwotICBnX2RvY3RleHQgPSBOVUxMOwotfQotCi0vKioKLSAqIENsZWFucyB1cCB0ZXh0IGNvbW1vbmx5IGZvdW5kIGluIGRveHlnZW4tbGlrZSBjb21tZW50cwotICoKLSAqIFdhcm5pbmc6IGlmIHlvdSBtaXggdGFicyBhbmQgc3BhY2VzIGluIGEgbm9uLXVuaWZvcm0gd2F5LAotICogeW91IHdpbGwgZ2V0IHdoYXQgeW91IGRlc2VydmUuCi0gKi8KLWNoYXIqIGNsZWFuX3VwX2RvY3RleHQoY2hhciogZG9jdGV4dCkgewotICAvLyBDb252ZXJ0IHRvIEMrKyBzdHJpbmcsIGFuZCByZW1vdmUgV2luZG93cydzIGNhcnJpYWdlIHJldHVybnMuCi0gIHN0cmluZyBkb2NzdHJpbmcgPSBkb2N0ZXh0OwotICBkb2NzdHJpbmcuZXJhc2UoCi0gICAgICByZW1vdmUoZG9jc3RyaW5nLmJlZ2luKCksIGRvY3N0cmluZy5lbmQoKSwgJ1xyJyksCi0gICAgICBkb2NzdHJpbmcuZW5kKCkpOwotCi0gIC8vIFNlcGFyYXRlIGludG8gbGluZXMuCi0gIHZlY3RvcjxzdHJpbmc+IGxpbmVzOwotICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBzdHJpbmc6Om5wb3M7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxhc3Q7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgbGFzdCA9IChwb3MgPT0gc3RyaW5nOjpucG9zKSA/IDAgOiBwb3MrMTsKLSAgICBwb3MgPSBkb2NzdHJpbmcuZmluZCgnXG4nLCBsYXN0KTsKLSAgICBpZiAocG9zID09IHN0cmluZzo6bnBvcykgewotICAgICAgLy8gRmlyc3QgYml0IG9mIGNsZWFuaW5nLiAgSWYgdGhlIGxhc3QgbGluZSBpcyBvbmx5IHdoaXRlc3BhY2UsIGRyb3AgaXQuCi0gICAgICBzdHJpbmc6OnNpemVfdHlwZSBub253aGl0ZSA9IGRvY3N0cmluZy5maW5kX2ZpcnN0X25vdF9vZigiIFx0IiwgbGFzdCk7Ci0gICAgICBpZiAobm9ud2hpdGUgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAgIGxpbmVzLnB1c2hfYmFjayhkb2NzdHJpbmcuc3Vic3RyKGxhc3QpKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBsaW5lcy5wdXNoX2JhY2soZG9jc3RyaW5nLnN1YnN0cihsYXN0LCBwb3MtbGFzdCkpOwotICB9Ci0KLSAgLy8gQSB2ZXJ5IHByb2ZvdW5kIGRvY3N0cmluZy4KLSAgaWYgKGxpbmVzLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIC8vIENsZWFyIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSBmaXJzdCBsaW5lLgotICBwb3MgPSBsaW5lcy5mcm9udCgpLmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiKTsKLSAgbGluZXMuZnJvbnQoKS5lcmFzZSgwLCBwb3MpOwotCi0gIC8vIElmIGV2ZXJ5IG5vbmJsYW5rIGxpbmUgYWZ0ZXIgdGhlIGZpcnN0IGhhcyB0aGUgc2FtZSBudW1iZXIgb2Ygc3BhY2VzL3RhYnMsCi0gIC8vIHRoZW4gYSBzdGFyLCByZW1vdmUgdGhlbS4KLSAgYm9vbCBoYXZlX3ByZWZpeCA9IHRydWU7Ci0gIGJvb2wgZm91bmRfcHJlZml4ID0gZmFsc2U7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIHByZWZpeF9sZW4gPSAwOwotICB2ZWN0b3I8c3RyaW5nPjo6aXRlcmF0b3IgbF9pdGVyOwotICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCkrMTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgewotICAgIGlmIChsX2l0ZXItPmVtcHR5KCkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIHBvcyA9IGxfaXRlci0+ZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIpOwotICAgIGlmICghZm91bmRfcHJlZml4KSB7Ci0gICAgICBpZiAocG9zICE9IHN0cmluZzo6bnBvcykgewotICAgICAgICBpZiAobF9pdGVyLT5hdChwb3MpID09ICcqJykgewotICAgICAgICAgIGZvdW5kX3ByZWZpeCA9IHRydWU7Ci0gICAgICAgICAgcHJlZml4X2xlbiA9IHBvczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBoYXZlX3ByZWZpeCA9IGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBXaGl0ZXNwYWNlLW9ubHkgbGluZS4gIFRydW5jYXRlIGl0LgotICAgICAgICBsX2l0ZXItPmNsZWFyKCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChsX2l0ZXItPnNpemUoKSA+IHBvcwotICAgICAgICAmJiBsX2l0ZXItPmF0KHBvcykgPT0gJyonCi0gICAgICAgICYmIHBvcyA9PSBwcmVmaXhfbGVuKSB7Ci0gICAgICAvLyBCdXNpbmVzcyBhcyB1c3VhbC4KLSAgICB9IGVsc2UgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIC8vIFdoaXRlc3BhY2Utb25seSBsaW5lLiAgTGV0J3MgdHJ1bmNhdGUgaXQgZm9yIHRoZW0uCi0gICAgICBsX2l0ZXItPmNsZWFyKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFRoZSBwYXR0ZXJuIGhhcyBiZWVuIGJyb2tlbi4KLSAgICAgIGhhdmVfcHJlZml4ID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvLyBJZiBvdXIgcHJlZml4IHN1cnZpdmVkLCBkZWxldGUgaXQgZnJvbSBldmVyeSBsaW5lLgotICBpZiAoaGF2ZV9wcmVmaXgpIHsKLSAgICAvLyBHZXQgdGhlIHN0YXIgdG9vLgotICAgIHByZWZpeF9sZW4rKzsKLSAgICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCkrMTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgewotICAgICAgbF9pdGVyLT5lcmFzZSgwLCBwcmVmaXhfbGVuKTsKLSAgICB9Ci0gIH0KLQotICAvLyBOb3cgZGVsZXRlIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSBlYWNoIGxpbmUuCi0gIHByZWZpeF9sZW4gPSBzdHJpbmc6Om5wb3M7Ci0gIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKSsxOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7Ci0gICAgaWYgKGxfaXRlci0+ZW1wdHkoKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIHBvcyA9IGxfaXRlci0+ZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIpOwotICAgIGlmIChwb3MgIT0gc3RyaW5nOjpucG9zCi0gICAgICAgICYmIChwcmVmaXhfbGVuID09IHN0cmluZzo6bnBvcyB8fCBwb3MgPCBwcmVmaXhfbGVuKSkgewotICAgICAgcHJlZml4X2xlbiA9IHBvczsKLSAgICB9Ci0gIH0KLQotICAvLyBJZiBvdXIgcHJlZml4IHN1cnZpdmVkLCBkZWxldGUgaXQgZnJvbSBldmVyeSBsaW5lLgotICBpZiAocHJlZml4X2xlbiAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCkrMTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgewotICAgICAgbF9pdGVyLT5lcmFzZSgwLCBwcmVmaXhfbGVuKTsKLSAgICB9Ci0gIH0KLQotICAvLyBSZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIGV2ZXJ5IGxpbmUuCi0gIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgewotICAgIHBvcyA9IGxfaXRlci0+ZmluZF9sYXN0X25vdF9vZigiIFx0Iik7Ci0gICAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MgJiYgcG9zICE9IGxfaXRlci0+bGVuZ3RoKCktMSkgewotICAgICAgbF9pdGVyLT5lcmFzZShwb3MrMSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gSWYgdGhlIGZpcnN0IGxpbmUgaXMgZW1wdHksIHJlbW92ZSBpdC4KLSAgLy8gRG9uJ3QgZG8gdGhpcyBlYXJsaWVyIGJlY2F1c2UgYSBsb3Qgb2Ygc3RlcHMgc2tpcCB0aGUgZmlyc3QgbGluZS4KLSAgaWYgKGxpbmVzLmZyb250KCkuZW1wdHkoKSkgewotICAgIGxpbmVzLmVyYXNlKGxpbmVzLmJlZ2luKCkpOwotICB9Ci0KLSAgLy8gTm93IHJlam9pbiB0aGUgbGluZXMgYW5kIGNvcHkgdGhlbSBiYWNrIGludG8gZG9jdGV4dC4KLSAgZG9jc3RyaW5nLmNsZWFyKCk7Ci0gIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgewotICAgIGRvY3N0cmluZyArPSAqbF9pdGVyOwotICAgIGRvY3N0cmluZyArPSAnXG4nOwotICB9Ci0KLSAgYXNzZXJ0KGRvY3N0cmluZy5sZW5ndGgoKSA8PSBzdHJsZW4oZG9jdGV4dCkpOwotICBzdHJjcHkoZG9jdGV4dCwgZG9jc3RyaW5nLmNfc3RyKCkpOwotICByZXR1cm4gZG9jdGV4dDsKLX0KLQotLyoqIFNldCB0byB0cnVlIHRvIGRlYnVnIGRvY3N0cmluZyBwYXJzaW5nICovCi1zdGF0aWMgYm9vbCBkdW1wX2RvY3MgPSBmYWxzZTsKLQotLyoqCi0gKiBEdW1wcyBkb2NzdHJpbmdzIHRvIHN0ZG91dAotICogT25seSB3b3JrcyBmb3IgdG9wLWxldmVsIGRlZmluaXRpb25zIGFuZCB0aGUgd2hvbGUgcHJvZ3JhbSBkb2MKLSAqIChpLmUuLCBub3QgZW51bSBjb25zdGFudHMsIHN0cnVjdCBmaWVsZHMsIG9yIGZ1bmN0aW9ucy4KLSAqLwotdm9pZCBkdW1wX2RvY3N0cmluZ3ModF9wcm9ncmFtKiBwcm9ncmFtKSB7Ci0gIHN0cmluZyBwcm9nZG9jID0gcHJvZ3JhbS0+Z2V0X2RvYygpOwotICBpZiAoIXByb2dkb2MuZW1wdHkoKSkgewotICAgIHByaW50ZigiV2hvbGUgcHJvZ3JhbSBkb2M6XG4lc1xuIiwgcHJvZ2RvYy5jX3N0cigpKTsKLSAgfQotICBjb25zdCB2ZWN0b3I8dF90eXBlZGVmKj4mIHR5cGVkZWZzID0gcHJvZ3JhbS0+Z2V0X3R5cGVkZWZzKCk7Ci0gIHZlY3Rvcjx0X3R5cGVkZWYqPjo6Y29uc3RfaXRlcmF0b3IgdF9pdGVyOwotICBmb3IgKHRfaXRlciA9IHR5cGVkZWZzLmJlZ2luKCk7IHRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0X2l0ZXIpIHsKLSAgICB0X3R5cGVkZWYqIHRkID0gKnRfaXRlcjsKLSAgICBpZiAodGQtPmhhc19kb2MoKSkgewotICAgICAgcHJpbnRmKCJ0eXBlZGVmICVzOlxuJXNcbiIsIHRkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHRkLT5nZXRfZG9jKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0gIGNvbnN0IHZlY3Rvcjx0X2VudW0qPiYgZW51bXMgPSBwcm9ncmFtLT5nZXRfZW51bXMoKTsKLSAgdmVjdG9yPHRfZW51bSo+Ojpjb25zdF9pdGVyYXRvciBlX2l0ZXI7Ci0gIGZvciAoZV9pdGVyID0gZW51bXMuYmVnaW4oKTsgZV9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VfaXRlcikgewotICAgIHRfZW51bSogZW4gPSAqZV9pdGVyOwotICAgIGlmIChlbi0+aGFzX2RvYygpKSB7Ci0gICAgICBwcmludGYoImVudW0gJXM6XG4lc1xuIiwgZW4tPmdldF9uYW1lKCkuY19zdHIoKSwgZW4tPmdldF9kb2MoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLSAgY29uc3QgdmVjdG9yPHRfY29uc3QqPiYgY29uc3RzID0gcHJvZ3JhbS0+Z2V0X2NvbnN0cygpOwotICB2ZWN0b3I8dF9jb25zdCo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgdF9jb25zdCogY28gPSAqY19pdGVyOwotICAgIGlmIChjby0+aGFzX2RvYygpKSB7Ci0gICAgICBwcmludGYoImNvbnN0ICVzOlxuJXNcbiIsIGNvLT5nZXRfbmFtZSgpLmNfc3RyKCksIGNvLT5nZXRfZG9jKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0gIGNvbnN0IHZlY3Rvcjx0X3N0cnVjdCo+JiBzdHJ1Y3RzID0gcHJvZ3JhbS0+Z2V0X3N0cnVjdHMoKTsKLSAgdmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKLSAgZm9yIChzX2l0ZXIgPSBzdHJ1Y3RzLmJlZ2luKCk7IHNfaXRlciAhPSBzdHJ1Y3RzLmVuZCgpOyArK3NfaXRlcikgewotICAgIHRfc3RydWN0KiBzdCA9ICpzX2l0ZXI7Ci0gICAgaWYgKHN0LT5oYXNfZG9jKCkpIHsKLSAgICAgIHByaW50Zigic3RydWN0ICVzOlxuJXNcbiIsIHN0LT5nZXRfbmFtZSgpLmNfc3RyKCksIHN0LT5nZXRfZG9jKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0gIGNvbnN0IHZlY3Rvcjx0X3N0cnVjdCo+JiB4Y2VwdGlvbnMgPSBwcm9ncmFtLT5nZXRfeGNlcHRpb25zKCk7Ci0gIHZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHhuID0gKnhfaXRlcjsKLSAgICBpZiAoeG4tPmhhc19kb2MoKSkgewotICAgICAgcHJpbnRmKCJ4Y2VwdGlvbiAlczpcbiVzXG4iLCB4bi0+Z2V0X25hbWUoKS5jX3N0cigpLCB4bi0+Z2V0X2RvYygpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotICBjb25zdCB2ZWN0b3I8dF9zZXJ2aWNlKj4mIHNlcnZpY2VzID0gcHJvZ3JhbS0+Z2V0X3NlcnZpY2VzKCk7Ci0gIHZlY3Rvcjx0X3NlcnZpY2UqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICBmb3IgKHZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICB0X3NlcnZpY2UqIHN2ID0gKnZfaXRlcjsKLSAgICBpZiAoc3YtPmhhc19kb2MoKSkgewotICAgICAgcHJpbnRmKCJzZXJ2aWNlICVzOlxuJXNcbiIsIHN2LT5nZXRfbmFtZSgpLmNfc3RyKCksIHN2LT5nZXRfZG9jKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogQ2FsbCBnZW5lcmF0ZV9maW5nZXJwcmludCBmb3IgZXZlcnkgc3RydWN0dXJlIGFuZCBlbnVtLgotICovCi12b2lkIGdlbmVyYXRlX2FsbF9maW5nZXJwcmludHModF9wcm9ncmFtKiBwcm9ncmFtKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X3N0cnVjdCo+JiBzdHJ1Y3RzID0gcHJvZ3JhbS0+Z2V0X3N0cnVjdHMoKTsKLSAgdmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKLSAgZm9yIChzX2l0ZXIgPSBzdHJ1Y3RzLmJlZ2luKCk7IHNfaXRlciAhPSBzdHJ1Y3RzLmVuZCgpOyArK3NfaXRlcikgewotICAgIHRfc3RydWN0KiBzdCA9ICpzX2l0ZXI7Ci0gICAgc3QtPmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gIH0KLQotICBjb25zdCB2ZWN0b3I8dF9zdHJ1Y3QqPiYgeGNlcHRpb25zID0gcHJvZ3JhbS0+Z2V0X3hjZXB0aW9ucygpOwotICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgIHRfc3RydWN0KiBzdCA9ICp4X2l0ZXI7Ci0gICAgc3QtPmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gIH0KLQotICBjb25zdCB2ZWN0b3I8dF9lbnVtKj4mIGVudW1zID0gcHJvZ3JhbS0+Z2V0X2VudW1zKCk7Ci0gIHZlY3Rvcjx0X2VudW0qPjo6Y29uc3RfaXRlcmF0b3IgZV9pdGVyOwotICBmb3IgKGVfaXRlciA9IGVudW1zLmJlZ2luKCk7IGVfaXRlciAhPSBlbnVtcy5lbmQoKTsgKytlX2l0ZXIpIHsKLSAgICB0X2VudW0qIGUgPSAqZV9pdGVyOwotICAgIGUtPmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gIH0KLQotICBnX3R5cGVfdm9pZC0+Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLQotICAvLyBJZiB5b3Ugd2FudCB0byBnZW5lcmF0ZSBmaW5nZXJwcmludHMgZm9yIGltcGxpY2l0IHN0cnVjdHVyZXMsIHN0YXJ0IGhlcmUuCi0gIC8qCi0gIGNvbnN0IHZlY3Rvcjx0X3NlcnZpY2UqPiYgc2VydmljZXMgPSBwcm9ncmFtLT5nZXRfc2VydmljZXMoKTsKLSAgdmVjdG9yPHRfc2VydmljZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gIGZvciAodl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3ZfaXRlcikgewotICAgIHRfc2VydmljZSogc3YgPSAqdl9pdGVyOwotICB9Ci0gICovCi19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2ZXJzaW9uIG51bWJlcgotICovCi12b2lkIHZlcnNpb24oKSB7Ci0gIHByaW50ZigiVGhyaWZ0IHZlcnNpb24gJXNcbiIsIFRIUklGVF9WRVJTSU9OKTsKLX0KLQotLyoqCi0gKiBEaXBsYXlzIHRoZSB1c2FnZSBtZXNzYWdlIGFuZCB0aGVuIGV4aXRzIHdpdGggYW4gZXJyb3IgY29kZS4KLSAqLwotdm9pZCB1c2FnZSgpIHsKLSAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogdGhyaWZ0IFtvcHRpb25zXSBmaWxlXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJPcHRpb25zOlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtdmVyc2lvbiAgICBQcmludCB0aGUgY29tcGlsZXIgdmVyc2lvblxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtbyBkaXIgICAgICBTZXQgdGhlIG91dHB1dCBkaXJlY3RvcnkgZm9yIGdlbi0qIHBhY2thZ2VzXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAoZGVmYXVsdDogY3VycmVudCBkaXJlY3RvcnkpXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1vdXQgZGlyICAgIFNldCB0aGUgb3VwdXQgbG9jYXRpb24gZm9yIGdlbmVyYXRlZCBmaWxlcy5cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwiICAgICAgICAgICAgICAgKG5vIGdlbi0qIGZvbGRlciB3aWxsIGJlIGNyZWF0ZWQpXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1JIGRpciAgICAgIEFkZCBhIGRpcmVjdG9yeSB0byB0aGUgbGlzdCBvZiBkaXJlY3Rvcmllc1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIHNlYXJjaGVkIGZvciBpbmNsdWRlIGRpcmVjdGl2ZXNcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLW5vd2FybiAgICAgU3VwcHJlc3MgYWxsIGNvbXBpbGVyIHdhcm5pbmdzIChCQUQhKVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtc3RyaWN0ICAgICBTdHJpY3QgY29tcGlsZXIgd2FybmluZ3Mgb25cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXZbZXJib3NlXSAgVmVyYm9zZSBtb2RlXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1yW2VjdXJzZV0gIEFsc28gZ2VuZXJhdGUgaW5jbHVkZWQgZmlsZXNcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRlYnVnICAgICAgUGFyc2UgZGVidWcgdHJhY2UgdG8gc3Rkb3V0XG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC0tZ2VuIFNUUiAgIEdlbmVyYXRlIGNvZGUgd2l0aCBhIGR5bmFtaWNhbGx5LXJlZ2lzdGVyZWQgZ2VuZXJhdG9yLlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIFNUUiBoYXMgdGhlIGZvcm0gbGFuZ3VhZ2VbOmtleTE9dmFsMVssa2V5Mixba2V5Mz12YWwzXV1dLlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIEtleXMgYW5kIHZhbHVlcyBhcmUgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIGdlbmVyYXRvci5cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBNYW55IG9wdGlvbnMgd2lsbCBub3QgcmVxdWlyZSB2YWx1ZXMuXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIkF2YWlsYWJsZSBnZW5lcmF0b3JzIChhbmQgb3B0aW9ucyk6XG4iKTsKLQotICB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90IGdlbl9tYXAgPSB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcl9tYXAoKTsKLSAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdDo6aXRlcmF0b3IgaXRlcjsKLSAgZm9yIChpdGVyID0gZ2VuX21hcC5iZWdpbigpOyBpdGVyICE9IGdlbl9tYXAuZW5kKCk7ICsraXRlcikgewotICAgIGZwcmludGYoc3RkZXJyLCAiICAlcyAoJXMpOlxuIiwKLSAgICAgICAgaXRlci0+c2Vjb25kLT5nZXRfc2hvcnRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgIGl0ZXItPnNlY29uZC0+Z2V0X2xvbmdfbmFtZSgpLmNfc3RyKCkpOwotICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCBpdGVyLT5zZWNvbmQtPmdldF9kb2N1bWVudGF0aW9uKCkuY19zdHIoKSk7Ci0gIH0KLSAgZXhpdCgxKTsKLX0KLQotLyoqCi0gKiBZb3Uga25vdywgd2hlbiBJIHN0YXJ0ZWQgd29ya2luZyBvbiBUaHJpZnQgSSByZWFsbHkgdGhvdWdodCBpdCB3YXNuJ3QgZ29pbmcKLSAqIHRvIGJlY29tZSBhIHByb2dyYW1taW5nIGxhbmd1YWdlIGJlY2F1c2UgaXQgd2FzIGp1c3QgYSBnZW5lcmF0b3IgYW5kIGl0Ci0gKiB3b3VsZG4ndCBuZWVkIHJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbiBhbmQgYWxsIHRoYXQgamF6ei4gQnV0IHRoZW4gd2UKLSAqIGRlY2lkZWQgdG8gYWRkIGNvbnN0YW50cywgYW5kIGFsbCBvZiBhIHN1ZGRlbiB0aGF0IG1lYW5zIHJ1bnRpbWUgdHlwZQotICogdmFsaWRhdGlvbiBhbmQgaW5mZXJlbmNlLCBleGNlcHQgdGhlICJydW50aW1lIiBpcyB0aGUgY29kZSBnZW5lcmF0b3IKLSAqIHJ1bnRpbWUuCi0gKi8KLXZvaWQgdmFsaWRhdGVfY29uc3RfcmVjKHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJ0eXBlIGVycm9yOiBjYW5ub3QgZGVjbGFyZSBhIHZvaWQgY29uc3Q6ICIgKyBuYW1lOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkcpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIHN0cmluZyI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgYm9vbCI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgYnl0ZSI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBpMTYiOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgaTMyIjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGk2NCI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSICYmCi0gICAgICAgICAgdmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBkb3VibGUiOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpICsgbmFtZTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVIpIHsKLSAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBlbnVtIjsKLSAgICB9Ci0KLSAgICAvLyBzZWUgaWYgdGhlcmUncyBhIGRvdCBpbiB0aGUgaWRlbnRpZmllcgotICAgIHN0ZDo6c3RyaW5nIG5hbWVfcG9ydGlvbiA9IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCk7Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gKCh0X2VudW0qKXR5cGUpLT5nZXRfY29uc3RhbnRzKCk7Ci0gICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7Ci0gICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotCi0gICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpID09IG5hbWVfcG9ydGlvbikgewotICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgIiArIG5hbWUgKyAiIHdhcyBkZWNsYXJlZCBhcyB0eXBlICIgCi0gICAgICAgICsgdHlwZS0+Z2V0X25hbWUoKSArICIgd2hpY2ggaXMgYW4gZW51bSwgYnV0ICIgCi0gICAgICAgICsgdmFsdWUtPmdldF9pZGVudGlmaWVyKCkgKyAiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciB0aGF0IGVudW0iOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX01BUCkgewotICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIHN0cnVjdC94Y2VwdGlvbiI7Ci0gICAgfQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIGlmICh2X2l0ZXItPmZpcnN0LT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX1NUUklORykgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIG5hbWUgKyAiIHN0cnVjdCBrZXkgbXVzdCBiZSBzdHJpbmciOwotICAgICAgfQotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotCi0gICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICIuIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga190eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdl90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHZhbGlkYXRlX2NvbnN0X3JlYyhuYW1lICsgIjxrZXk+Iiwga190eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIHZhbGlkYXRlX2NvbnN0X3JlYyhuYW1lICsgIjx2YWw+Iiwgdl90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZV90eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGVfdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBlX3R5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHZhbGlkYXRlX2NvbnN0X3JlYyhuYW1lICsgIjxlbGVtPiIsIGVfdHlwZSwgKnZfaXRlcik7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHBhcnNlZCBjb25zdCBpbmZvcm1hdGlvbiBhZ2FpbnN0IGl0cyBkZWNsYXJlZCB0eXBlCi0gKi8KLXZvaWQgdmFsaWRhdGVfY29uc3RfdHlwZSh0X2NvbnN0KiBjKSB7Ci0gIHZhbGlkYXRlX2NvbnN0X3JlYyhjLT5nZXRfbmFtZSgpLCBjLT5nZXRfdHlwZSgpLCBjLT5nZXRfdmFsdWUoKSk7Ci19Ci0KLS8qKgotICogQ2hlY2sgdGhlIHR5cGUgb2YgYSBkZWZhdWx0IHZhbHVlIGFzc2lnbmVkIHRvIGEgZmllbGQuCi0gKi8KLXZvaWQgdmFsaWRhdGVfZmllbGRfdmFsdWUodF9maWVsZCogZmllbGQsIHRfY29uc3RfdmFsdWUqIGN2KSB7Ci0gIHZhbGlkYXRlX2NvbnN0X3JlYyhmaWVsZC0+Z2V0X25hbWUoKSwgZmllbGQtPmdldF90eXBlKCksIGN2KTsKLX0KLQotLyoqCi0gKiBDaGVjayB0aGF0IGFsbCB0aGUgZWxlbWVudHMgb2YgYSB0aHJvd3MgYmxvY2sgYXJlIGFjdHVhbGx5IGV4Y2VwdGlvbnMuCi0gKi8KLWJvb2wgdmFsaWRhdGVfdGhyb3dzKHRfc3RydWN0KiB0aHJvd3MpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRocm93cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKCEoKm1faXRlciktPmdldF90eXBlKCktPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKgotICogUGFyc2VzIGEgcHJvZ3JhbQotICovCi12b2lkIHBhcnNlKHRfcHJvZ3JhbSogcHJvZ3JhbSwgdF9wcm9ncmFtKiBwYXJlbnRfcHJvZ3JhbSkgewotICAvLyBHZXQgc2NvcGUgZmlsZSBwYXRoCi0gIHN0cmluZyBwYXRoID0gcHJvZ3JhbS0+Z2V0X3BhdGgoKTsKLQotICAvLyBTZXQgY3VycmVudCBkaXIgZ2xvYmFsLCB3aGljaCBpcyB1c2VkIGluIHRoZSBpbmNsdWRlX2ZpbGUgZnVuY3Rpb24KLSAgZ19jdXJkaXIgPSBkaXJlY3RvcnlfbmFtZShwYXRoKTsKLSAgZ19jdXJwYXRoID0gcGF0aDsKLQotICAvLyBPcGVuIHRoZSBmaWxlCi0gIHl5aW4gPSBmb3BlbihwYXRoLmNfc3RyKCksICJyIik7Ci0gIGlmICh5eWluID09IDApIHsKLSAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlOiBcIiVzXCIiLCBwYXRoLmNfc3RyKCkpOwotICB9Ci0KLSAgLy8gQ3JlYXRlIG5ldyBzY29wZSBhbmQgc2NhbiBmb3IgaW5jbHVkZXMKLSAgcHZlcmJvc2UoIlNjYW5uaW5nICVzIGZvciBpbmNsdWRlc1xuIiwgcGF0aC5jX3N0cigpKTsKLSAgZ19wYXJzZV9tb2RlID0gSU5DTFVERVM7Ci0gIGdfcHJvZ3JhbSA9IHByb2dyYW07Ci0gIGdfc2NvcGUgPSBwcm9ncmFtLT5zY29wZSgpOwotICB0cnkgewotICAgIHl5bGluZW5vID0gMTsKLSAgICBpZiAoeXlwYXJzZSgpICE9IDApIHsKLSAgICAgIGZhaWx1cmUoIlBhcnNlciBlcnJvciBkdXJpbmcgaW5jbHVkZSBwYXNzLiIpOwotICAgIH0KLSAgfSBjYXRjaCAoc3RyaW5nIHgpIHsKLSAgICBmYWlsdXJlKHguY19zdHIoKSk7Ci0gIH0KLSAgZmNsb3NlKHl5aW4pOwotCi0gIC8vIFJlY3Vyc2l2ZWx5IHBhcnNlIGFsbCB0aGUgaW5jbHVkZSBwcm9ncmFtcwotICB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbS0+Z2V0X2luY2x1ZGVzKCk7Ci0gIHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaXRlcjsKLSAgZm9yIChpdGVyID0gaW5jbHVkZXMuYmVnaW4oKTsgaXRlciAhPSBpbmNsdWRlcy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgcGFyc2UoKml0ZXIsIHByb2dyYW0pOwotICB9Ci0KLSAgLy8gUGFyc2UgdGhlIHByb2dyYW0gZmlsZQotICBnX3BhcnNlX21vZGUgPSBQUk9HUkFNOwotICBnX3Byb2dyYW0gPSBwcm9ncmFtOwotICBnX3Njb3BlID0gcHJvZ3JhbS0+c2NvcGUoKTsKLSAgZ19wYXJlbnRfc2NvcGUgPSAocGFyZW50X3Byb2dyYW0gIT0gTlVMTCkgPyBwYXJlbnRfcHJvZ3JhbS0+c2NvcGUoKSA6IE5VTEw7Ci0gIGdfcGFyZW50X3ByZWZpeCA9IHByb2dyYW0tPmdldF9uYW1lKCkgKyAiLiI7Ci0gIGdfY3VycGF0aCA9IHBhdGg7Ci0gIHl5aW4gPSBmb3BlbihwYXRoLmNfc3RyKCksICJyIik7Ci0gIGlmICh5eWluID09IDApIHsKLSAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlOiBcIiVzXCIiLCBwYXRoLmNfc3RyKCkpOwotICB9Ci0gIHB2ZXJib3NlKCJQYXJzaW5nICVzIGZvciB0eXBlc1xuIiwgcGF0aC5jX3N0cigpKTsKLSAgeXlsaW5lbm8gPSAxOwotICB0cnkgewotICAgIGlmICh5eXBhcnNlKCkgIT0gMCkgewotICAgICAgZmFpbHVyZSgiUGFyc2VyIGVycm9yIGR1cmluZyB0eXBlcyBwYXNzLiIpOwotICAgIH0KLSAgfSBjYXRjaCAoc3RyaW5nIHgpIHsKLSAgICBmYWlsdXJlKHguY19zdHIoKSk7Ci0gIH0KLSAgZmNsb3NlKHl5aW4pOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGNvZGUKLSAqLwotdm9pZCBnZW5lcmF0ZSh0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBnZW5lcmF0b3Jfc3RyaW5ncykgewotICAvLyBPb29vaGgsIHJlY3Vyc2l2ZSBjb2RlIGdlbmVyYXRpb24sIGhvdCEhCi0gIGlmIChnZW5fcmVjdXJzZSkgewotICAgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtLT5nZXRfaW5jbHVkZXMoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAvLyBQcm9wb2dhdGUgb3V0cHV0IHBhdGggZnJvbSBwYXJlbnQgdG8gY2hpbGQgcHJvZ3JhbXMKLSAgICAgIGluY2x1ZGVzW2ldLT5zZXRfb3V0X3BhdGgocHJvZ3JhbS0+Z2V0X291dF9wYXRoKCksIHByb2dyYW0tPmlzX291dF9wYXRoX2Fic29sdXRlKCkpOwotCi0gICAgICBnZW5lcmF0ZShpbmNsdWRlc1tpXSwgZ2VuZXJhdG9yX3N0cmluZ3MpOwotICAgIH0KLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNvZGUhCi0gIHRyeSB7Ci0gICAgcHZlcmJvc2UoIlByb2dyYW06ICVzXG4iLCBwcm9ncmFtLT5nZXRfcGF0aCgpLmNfc3RyKCkpOwotCi0gICAgLy8gQ29tcHV0ZSBmaW5nZXJwcmludHMuCi0gICAgZ2VuZXJhdGVfYWxsX2ZpbmdlcnByaW50cyhwcm9ncmFtKTsKLQotICAgIGlmIChkdW1wX2RvY3MpIHsKLSAgICAgIGR1bXBfZG9jc3RyaW5ncyhwcm9ncmFtKTsKLSAgICB9Ci0KLSAgICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgICBmb3IgKGl0ZXIgPSBnZW5lcmF0b3Jfc3RyaW5ncy5iZWdpbigpOyBpdGVyICE9IGdlbmVyYXRvcl9zdHJpbmdzLmVuZCgpOyArK2l0ZXIpIHsKLSAgICAgIHRfZ2VuZXJhdG9yKiBnZW5lcmF0b3IgPSB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcihwcm9ncmFtLCAqaXRlcik7Ci0KLSAgICAgIGlmIChnZW5lcmF0b3IgPT0gTlVMTCkgewotICAgICAgICBwd2FybmluZygxLCAiVW5hYmxlIHRvIGdldCBhIGdlbmVyYXRvciBmb3IgXCIlc1wiLlxuIiwgaXRlci0+Y19zdHIoKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwdmVyYm9zZSgiR2VuZXJhdGluZyBcIiVzXCJcbiIsIGl0ZXItPmNfc3RyKCkpOwotICAgICAgICBnZW5lcmF0b3ItPmdlbmVyYXRlX3Byb2dyYW0oKTsKLSAgICAgICAgZGVsZXRlIGdlbmVyYXRvcjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgfSBjYXRjaCAoc3RyaW5nIHMpIHsKLSAgICBwcmludGYoIkVycm9yOiAlc1xuIiwgcy5jX3N0cigpKTsKLSAgfSBjYXRjaCAoY29uc3QgY2hhciogZXhjKSB7Ci0gICAgcHJpbnRmKCJFcnJvcjogJXNcbiIsIGV4Yyk7Ci0gIH0KLQotfQotCi0vKioKLSAqIFBhcnNlIGl0IHVwLi4gdGhlbiBzcGl0IGl0IGJhY2sgb3V0LCBpbiBwcmV0dHkgbXVjaCBldmVyeSBsYW5ndWFnZS4gQWxyaWdodAotICogbm90IHRoYXQgbWFueSBsYW5ndWFnZXMsIGJ1dCB0aGUgY29vbCBvbmVzIHRoYXQgd2UgY2FyZSBhYm91dC4KLSAqLwotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gIGludCBpOwotICBzdGQ6OnN0cmluZyBvdXRfcGF0aDsKLSAgYm9vbCBvdXRfcGF0aF9pc19hYnNvbHV0ZSA9IGZhbHNlOwotCi0gIC8vIFNldHVwIHRpbWUgc3RyaW5nCi0gIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwotICBnX3RpbWVfc3RyID0gY3RpbWUoJm5vdyk7Ci0KLSAgLy8gQ2hlY2sgZm9yIG5lY2Vzc2FyeSBhcmd1bWVudHMsIHlvdSBnb3R0YSBoYXZlIGF0IGxlYXN0IGEgZmlsZW5hbWUgYW5kCi0gIC8vIGFuIG91dHB1dCBsYW5ndWFnZSBmbGFnCi0gIGlmIChhcmdjIDwgMikgewotICAgIHVzYWdlKCk7Ci0gIH0KLQotICB2ZWN0b3I8c3RyaW5nPiBnZW5lcmF0b3Jfc3RyaW5nczsKLQotICAvLyBTZXQgdGhlIGN1cnJlbnQgcGF0aCB0byBhIGR1bW15IHZhbHVlIHRvIG1ha2Ugd2FybmluZyBtZXNzYWdlcyBjbGVhcmVyLgotICBnX2N1cnBhdGggPSAiYXJndW1lbnRzIjsKLQotICAvLyBIYWNreSBwYXJhbWV0ZXIgaGFuZGxpbmcuLi4gSSBkaWRuJ3QgZmVlbCBsaWtlIHVzaW5nIGEgbGlicmFyeSBzb3JyeSEKLSAgZm9yIChpID0gMTsgaSA8IGFyZ2MtMTsgaSsrKSB7Ci0gICAgY2hhciogYXJnOwotCi0gICAgYXJnID0gc3RydG9rKGFyZ3ZbaV0sICIgIik7Ci0gICAgd2hpbGUgKGFyZyAhPSBOVUxMKSB7Ci0gICAgICAvLyBUcmVhdCBkb3VibGUgZGFzaGVzIGFzIHNpbmdsZSBkYXNoZXMKLSAgICAgIGlmIChhcmdbMF0gPT0gJy0nICYmIGFyZ1sxXSA9PSAnLScpIHsKLSAgICAgICAgKythcmc7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzdHJjbXAoYXJnLCAiLXZlcnNpb24iKSA9PSAwKSB7Ci0gICAgICAgIHZlcnNpb24oKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1kZWJ1ZyIpID09IDApIHsKLSAgICAgICAgZ19kZWJ1ZyA9IDE7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItbm93YXJuIikgPT0gMCkgewotICAgICAgICBnX3dhcm4gPSAwOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXN0cmljdCIpID09IDApIHsKLSAgICAgICAgZ19zdHJpY3QgPSAyNTU7Ci0gICAgICAgIGdfd2FybiA9IDI7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItdiIpID09IDAgfHwgc3RyY21wKGFyZywgIi12ZXJib3NlIikgPT0gMCApIHsKLSAgICAgICAgZ192ZXJib3NlID0gMTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1yIikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiLXJlY3Vyc2UiKSA9PSAwICkgewotICAgICAgICBnZW5fcmVjdXJzZSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItZ2VuIikgPT0gMCkgewotICAgICAgICBhcmcgPSBhcmd2WysraV07Ci0gICAgICAgIGlmIChhcmcgPT0gTlVMTCkgewotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiISEhIE1pc3NpbmcgZ2VuZXJhdG9yIHNwZWNpZmljYXRpb25cbiIpOwotICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKGFyZyk7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItZGVuc2UiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9kZW5zZSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItY3BwIikgPT0gMCkgewotICAgICAgICBnZW5fY3BwID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1qYXZhYmVhbiIpID09IDApIHsKLSAgICAgICAgZ2VuX2phdmFiZWFuID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1qYXZhIikgPT0gMCkgewotICAgICAgICBnZW5famF2YSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItcGhwIikgPT0gMCkgewotICAgICAgICBnZW5fcGhwID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1waHBpIikgPT0gMCkgewotICAgICAgICBnZW5fcGhwaSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItcGhwcyIpID09IDApIHsKLSAgICAgICAgZ2VuX3BocCA9IHRydWU7Ci0gICAgICAgIGdlbl9waHBzID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1waHBsIikgPT0gMCkgewotICAgICAgICBnZW5fcGhwID0gdHJ1ZTsKLSAgICAgICAgZ2VuX3BocHMgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1waHBhIikgPT0gMCkgewotICAgICAgICBnZW5fcGhwID0gdHJ1ZTsKLSAgICAgICAgZ2VuX3BocHMgPSBmYWxzZTsKLSAgICAgICAgZ2VuX3BocGEgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXBocG8iKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9waHAgPSB0cnVlOwotICAgICAgICBnZW5fcGhwbyA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItcmVzdCIpID09IDApIHsKLSAgICAgICAgZ2VuX3Jlc3QgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXB5IikgPT0gMCkgewotICAgICAgICBnZW5fcHkgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXB5bnMiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9weSA9IHRydWU7Ci0gICAgICAgIGdlbl9weV9uZXdzdHlsZSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItcmIiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9yYiA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICIteHNkIikgPT0gMCkgewotICAgICAgICBnZW5feHNkID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1wZXJsIikgPT0gMCkgewotICAgICAgICBnZW5fcGVybCA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItZXJsIikgPT0gMCkgewotICAgICAgICBnZW5fZXJsID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1vY2FtbCIpID09IDApIHsKLSAgICAgICAgZ2VuX29jYW1sID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1ocyIpID09IDApIHsKLSAgICAgICAgZ2VuX2hzID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1jb2NvYSIpID09IDApIHsKLSAgICAgICAgZ2VuX2NvY29hID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1zdCIpID09IDApIHsKLSAgICAgICAgZ2VuX3N0ID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1jc2hhcnAiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9jc2hhcnAgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWNwcF91c2VfaW5jbHVkZV9wcmVmaXgiKSA9PSAwKSB7Ci0gICAgICAgIGdfY3BwX3VzZV9pbmNsdWRlX3ByZWZpeCA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItSSIpID09IDApIHsKLSAgICAgICAgLy8gQW4gYXJndW1lbnQgb2YgIi1JXCBhc2RmIiBpcyBpbnZhbGlkIGFuZCBoYXMgdW5rbm93biByZXN1bHRzCi0gICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKLQotICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiEhISBNaXNzaW5nIEluY2x1ZGUgZGlyZWN0b3J5XG4iKTsKLSAgICAgICAgICB1c2FnZSgpOwotICAgICAgICB9Ci0gICAgICAgIGdfaW5jbF9zZWFyY2hwYXRoLnB1c2hfYmFjayhhcmcpOwotICAgICAgfSBlbHNlIGlmICgoc3RyY21wKGFyZywgIi1vIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICItb3V0IikgPT0gMCkpIHsKLSAgICAgICAgb3V0X3BhdGhfaXNfYWJzb2x1dGUgPSAoc3RyY21wKGFyZywgIi1vdXQiKSA9PSAwKSA/IHRydWUgOiBmYWxzZTsKLQkJICAKLQkJYXJnID0gYXJndlsrK2ldOwotICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIi1vOiBtaXNzaW5nIG91dHB1dCBkaXJlY3RvcnlcbiIpOwotICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0X3BhdGggPSBhcmc7Ci0KLSNpZmRlZiBNSU5HVwotICAgICAgICAvL3N0cmlwIG91dCB0cmFpbGluZyBcIG9uIFdpbmRvd3MKLSAgICAgICAgaW50IGxhc3QgPSBvdXRfcGF0aC5sZW5ndGgoKS0xOwotICAgICAgICBpZiAob3V0X3BhdGhbbGFzdF0gPT0gJ1xcJykKLSAgICAgICAgewotICAgICAgICAgIG91dF9wYXRoLmVyYXNlKGxhc3QpOwotICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICBzdHJ1Y3Qgc3RhdCBzYjsKLSAgICAgICAgaWYgKHN0YXQob3V0X3BhdGguY19zdHIoKSwgJnNiKSA8IDApIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk91dHB1dCBkaXJlY3RvcnkgJXMgaXMgdW51c2FibGU6ICVzXG4iLCBvdXRfcGF0aC5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoISBTX0lTRElSKHNiLnN0X21vZGUpKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICJPdXRwdXQgZGlyZWN0b3J5ICVzIGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5XG4iLCBvdXRfcGF0aC5jX3N0cigpKTsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiISEhIFVucmVjb2duaXplZCBvcHRpb246ICVzXG4iLCBhcmcpOwotICAgICAgICB1c2FnZSgpOwotICAgICAgfQotCi0gICAgICAvLyBUb2tlbml6ZSBtb3JlCi0gICAgICBhcmcgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICB9Ci0gIH0KLQotICAvLyBpZiB5b3UncmUgYXNraW5nIGZvciB2ZXJzaW9uLCB5b3UgaGF2ZSBhIHJpZ2h0IG5vdCB0byBwYXNzIGEgZmlsZQotICBpZiAoc3RyY21wKGFyZ3ZbYXJnYy0xXSwgIi12ZXJzaW9uIikgPT0gMCkgewotICAgIHZlcnNpb24oKTsKLSAgICBleGl0KDEpOwotICB9Ci0KLSAgLy8gVE9ETyhkcmVpc3MpOiBEZWxldGUgdGhlc2Ugd2hlbiBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuCi0gIGlmIChnZW5fY3BwKSB7Ci0gICAgcHdhcm5pbmcoMSwgIi1jcHAgaXMgZGVwcmVjYXRlZC4gIFVzZSAtLWdlbiBjcHAiKTsKLSAgICBzdHJpbmcgZ2VuX3N0cmluZyA9ICJjcHA6IjsKLSAgICBpZiAoZ2VuX2RlbnNlKSB7Ci0gICAgICBnZW5fc3RyaW5nLmFwcGVuZCgiZGVuc2UsIik7Ci0gICAgfQotICAgIGlmIChnX2NwcF91c2VfaW5jbHVkZV9wcmVmaXgpIHsKLSAgICAgIGdlbl9zdHJpbmcuYXBwZW5kKCJpbmNsdWRlX3ByZWZpeCwiKTsKLSAgICB9Ci0gICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKGdlbl9zdHJpbmcpOwotICB9Ci0gIGlmIChnZW5famF2YSkgewotICAgIHB3YXJuaW5nKDEsICItamF2YSBpcyBkZXByZWNhdGVkLiAgVXNlIC0tZ2VuIGphdmEiKTsKLSAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soImphdmEiKTsKLSAgfQotICBpZiAoZ2VuX2phdmFiZWFuKSB7Ci0gICAgcHdhcm5pbmcoMSwgIi1qYXZhYmVhbiBpcyBkZXByZWNhdGVkLiAgVXNlIC0tZ2VuIGphdmE6YmVhbnMiKTsKLSAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soImphdmE6YmVhbnMiKTsKLSAgfQotICBpZiAoZ2VuX2NzaGFycCkgewotICAgIHB3YXJuaW5nKDEsICItY3NoYXJwIGlzIGRlcHJlY2F0ZWQuICBVc2UgLS1nZW4gY3NoYXJwIik7Ci0gICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKCJjc2hhcnAiKTsKLSAgfQotICBpZiAoZ2VuX3B5KSB7Ci0gICAgcHdhcm5pbmcoMSwgIi1weSBpcyBkZXByZWNhdGVkLiAgVXNlIC0tZ2VuIHB5Iik7Ci0gICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKCJweSIpOwotICB9Ci0gIGlmIChnZW5fcmIpIHsKLSAgICBwd2FybmluZygxLCAiLXJiIGlzIGRlcHJlY2F0ZWQuICBVc2UgLS1nZW4gcmIiKTsKLSAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soInJiIik7Ci0gIH0KLSAgaWYgKGdlbl9wZXJsKSB7Ci0gICAgcHdhcm5pbmcoMSwgIi1wZXJsIGlzIGRlcHJlY2F0ZWQuICBVc2UgLS1nZW4gcGVybCIpOwotICAgIGdlbmVyYXRvcl9zdHJpbmdzLnB1c2hfYmFjaygicGVybCIpOwotICB9Ci0gIGlmIChnZW5fcGhwIHx8IGdlbl9waHBpKSB7Ci0gICAgcHdhcm5pbmcoMSwgIi1waHAgaXMgZGVwcmVjYXRlZC4gIFVzZSAtLWdlbiBwaHAiKTsKLSAgICBzdHJpbmcgZ2VuX3N0cmluZyA9ICJwaHA6IjsKLSAgICBpZiAoZ2VuX3BocGkpIHsKLSAgICAgIGdlbl9zdHJpbmcuYXBwZW5kKCJpbmxpbmVkLCIpOwotICAgIH0gZWxzZSBpZihnZW5fcGhwcykgewotICAgICAgZ2VuX3N0cmluZy5hcHBlbmQoInNlcnZlciwiKTsKLSAgICB9IGVsc2UgaWYoZ2VuX3BocGEpIHsKLSAgICAgIGdlbl9zdHJpbmcuYXBwZW5kKCJhdXRvbG9hZCwiKTsKLSAgICB9IGVsc2UgaWYoZ2VuX3BocG8pIHsKLSAgICAgIGdlbl9zdHJpbmcuYXBwZW5kKCJvb3AsIik7Ci0gICAgfSBlbHNlIGlmKGdlbl9yZXN0KSB7Ci0gICAgICBnZW5fc3RyaW5nLmFwcGVuZCgicmVzdCwiKTsKLSAgICB9Ci0gICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKGdlbl9zdHJpbmcpOwotICB9Ci0gIGlmIChnZW5fY29jb2EpIHsKLSAgICBwd2FybmluZygxLCAiLWNvY29hIGlzIGRlcHJlY2F0ZWQuICBVc2UgLS1nZW4gY29jb2EiKTsKLSAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soImNvY29hIik7Ci0gIH0KLSAgaWYgKGdlbl9lcmwpIHsKLSAgICBwd2FybmluZygxLCAiLWVybCBpcyBkZXByZWNhdGVkLiAgVXNlIC0tZ2VuIGVybCIpOwotICAgIGdlbmVyYXRvcl9zdHJpbmdzLnB1c2hfYmFjaygiZXJsIik7Ci0gIH0KLSAgaWYgKGdlbl9zdCkgewotICAgIHB3YXJuaW5nKDEsICItc3QgaXMgZGVwcmVjYXRlZC4gIFVzZSAtLWdlbiBzdCIpOwotICAgIGdlbmVyYXRvcl9zdHJpbmdzLnB1c2hfYmFjaygic3QiKTsKLSAgfQotICBpZiAoZ2VuX29jYW1sKSB7Ci0gICAgcHdhcm5pbmcoMSwgIi1vY2FtbCBpcyBkZXByZWNhdGVkLiAgVXNlIC0tZ2VuIG9jYW1sIik7Ci0gICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKCJvY2FtbCIpOwotICB9Ci0gIGlmIChnZW5faHMpIHsKLSAgICBwd2FybmluZygxLCAiLWhzIGlzIGRlcHJlY2F0ZWQuICBVc2UgLS1nZW4gaHMiKTsKLSAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soImhzIik7Ci0gIH0KLSAgaWYgKGdlbl94c2QpIHsKLSAgICBwd2FybmluZygxLCAiLXhzZCBpcyBkZXByZWNhdGVkLiAgVXNlIC0tZ2VuIHhzZCIpOwotICAgIGdlbmVyYXRvcl9zdHJpbmdzLnB1c2hfYmFjaygieHNkIik7Ci0gIH0KLQotICAvLyBZb3UgZ290dGEgZ2VuZXJhdGUgc29tZXRoaW5nIQotICBpZiAoZ2VuZXJhdG9yX3N0cmluZ3MuZW1wdHkoKSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiISEhIE5vIG91dHB1dCBsYW5ndWFnZShzKSBzcGVjaWZpZWRcblxuIik7Ci0gICAgdXNhZ2UoKTsKLSAgfQotCi0gIC8vIFJlYWwtcGF0aGlmeSBpdAotICBjaGFyIHJwW1BBVEhfTUFYXTsKLSAgaWYgKGFyZ3ZbaV0gPT0gTlVMTCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiISEhIE1pc3NpbmcgZmlsZSBuYW1lXG4iKTsKLSAgICB1c2FnZSgpOwotICB9Ci0gIGlmIChzYWZlcmVhbHBhdGgoYXJndltpXSwgcnApID09IE5VTEwpIHsKLSAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlIHdpdGggcmVhbHBhdGg6ICVzIiwgYXJndltpXSk7Ci0gIH0KLSAgc3RyaW5nIGlucHV0X2ZpbGUocnApOwotCi0gIC8vIEluc3RhbmNlIG9mIHRoZSBnbG9iYWwgcGFyc2UgdHJlZQotICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKGlucHV0X2ZpbGUpOwotICBpZiAob3V0X3BhdGguc2l6ZSgpKSB7Ci0gICAgcHJvZ3JhbS0+c2V0X291dF9wYXRoKG91dF9wYXRoLCBvdXRfcGF0aF9pc19hYnNvbHV0ZSk7Ci0gIH0KLQotICAvLyBDb21wdXRlIHRoZSBjcHAgaW5jbHVkZSBwcmVmaXguCi0gIC8vIGluZmVyIHRoaXMgZnJvbSB0aGUgZmlsZW5hbWUgcGFzc2VkIGluCi0gIHN0cmluZyBpbnB1dF9maWxlbmFtZSA9IGFyZ3ZbaV07Ci0gIHN0cmluZyBpbmNsdWRlX3ByZWZpeDsKLQotICBzdHJpbmc6OnNpemVfdHlwZSBsYXN0X3NsYXNoID0gc3RyaW5nOjpucG9zOwotICBpZiAoKGxhc3Rfc2xhc2ggPSBpbnB1dF9maWxlbmFtZS5yZmluZCgiLyIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBpbmNsdWRlX3ByZWZpeCA9IGlucHV0X2ZpbGVuYW1lLnN1YnN0cigwLCBsYXN0X3NsYXNoKTsKLSAgfQotCi0gIHByb2dyYW0tPnNldF9pbmNsdWRlX3ByZWZpeChpbmNsdWRlX3ByZWZpeCk7Ci0KLSAgLy8gSW5pdGlhbGl6ZSBnbG9iYWwgdHlwZXMKLSAgZ190eXBlX3ZvaWQgICA9IG5ldyB0X2Jhc2VfdHlwZSgidm9pZCIsICAgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRCk7Ci0gIGdfdHlwZV9zdHJpbmcgPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7Ci0gIGdfdHlwZV9iaW5hcnkgPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7Ci0gICgodF9iYXNlX3R5cGUqKWdfdHlwZV9iaW5hcnkpLT5zZXRfYmluYXJ5KHRydWUpOwotICBnX3R5cGVfc2xpc3QgID0gbmV3IHRfYmFzZV90eXBlKCJzdHJpbmciLCB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpOwotICAoKHRfYmFzZV90eXBlKilnX3R5cGVfc2xpc3QpLT5zZXRfc3RyaW5nX2xpc3QodHJ1ZSk7Ci0gIGdfdHlwZV9ib29sICAgPSBuZXcgdF9iYXNlX3R5cGUoImJvb2wiLCAgIHRfYmFzZV90eXBlOjpUWVBFX0JPT0wpOwotICBnX3R5cGVfYnl0ZSAgID0gbmV3IHRfYmFzZV90eXBlKCJieXRlIiwgICB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFKTsKLSAgZ190eXBlX2kxNiAgICA9IG5ldyB0X2Jhc2VfdHlwZSgiaTE2IiwgICAgdF9iYXNlX3R5cGU6OlRZUEVfSTE2KTsKLSAgZ190eXBlX2kzMiAgICA9IG5ldyB0X2Jhc2VfdHlwZSgiaTMyIiwgICAgdF9iYXNlX3R5cGU6OlRZUEVfSTMyKTsKLSAgZ190eXBlX2k2NCAgICA9IG5ldyB0X2Jhc2VfdHlwZSgiaTY0IiwgICAgdF9iYXNlX3R5cGU6OlRZUEVfSTY0KTsKLSAgZ190eXBlX2RvdWJsZSA9IG5ldyB0X2Jhc2VfdHlwZSgiZG91YmxlIiwgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFKTsKLQotICAvLyBQYXJzZSBpdCEKLSAgcGFyc2UocHJvZ3JhbSwgTlVMTCk7Ci0KLSAgLy8gVGhlIGN1cnJlbnQgcGF0aCBpcyBub3QgcmVhbGx5IHJlbGV2YW50IHdoZW4gd2UgYXJlIGRvaW5nIGdlbmVyYXRpb24uCi0gIC8vIFJlc2V0IHRoZSB2YXJpYWJsZSB0byBtYWtlIHdhcm5pbmcgbWVzc2FnZXMgY2xlYXJlci4KLSAgZ19jdXJwYXRoID0gImdlbmVyYXRpb24iOwotICAvLyBSZXNldCB5eWxpbmVubyBmb3IgdGhlIGhlY2sgb2YgaXQuICBVc2UgMSBpbnN0ZWFkIG9mIDAgYmVjYXVzZQotICAvLyBUaGF0IGlzIHdoYXQgc2hvd3MgdXAgZHVyaW5nIGFyZ3VtZW50IHBhcnNpbmcuCi0gIHl5bGluZW5vID0gMTsKLQotICAvLyBHZW5lcmF0ZSBpdCEKLSAgZ2VuZXJhdGUocHJvZ3JhbSwgZ2VuZXJhdG9yX3N0cmluZ3MpOwotCi0gIC8vIENsZWFuIHVwLiBXaG8gYW0gSSBraWRkaW5nLi4uIHRoaXMgcHJvZ3JhbSBwcm9iYWJseSBvcnBoYW5zIGhlYXAgbWVtb3J5Ci0gIC8vIGFsbCBvdmVyIHRoZSBwbGFjZSwgYnV0IHdobyBjYXJlcyBiZWNhdXNlIGl0IGlzIGFib3V0IHRvIGV4aXQgYW5kIGl0IGlzCi0gIC8vIGFsbCByZWZlcmVuY2VkIGFuZCB1c2VkIGJ5IHRoaXMgd2Fja3kgcGFyc2UgdHJlZSB1cCB1bnRpbCBub3cgYW55d2F5cy4KLQotICBkZWxldGUgcHJvZ3JhbTsKLSAgZGVsZXRlIGdfdHlwZV92b2lkOwotICBkZWxldGUgZ190eXBlX3N0cmluZzsKLSAgZGVsZXRlIGdfdHlwZV9ib29sOwotICBkZWxldGUgZ190eXBlX2J5dGU7Ci0gIGRlbGV0ZSBnX3R5cGVfaTE2OwotICBkZWxldGUgZ190eXBlX2kzMjsKLSAgZGVsZXRlIGdfdHlwZV9pNjQ7Ci0gIGRlbGV0ZSBnX3R5cGVfZG91YmxlOwotCi0gIC8vIEZpbmlzaGVkCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9tYWluLmggYi9jb21waWxlci9jcHAvc3JjL21haW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI3ZDgyZC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL21haW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9NQUlOX0gKLSNkZWZpbmUgVF9NQUlOX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJwYXJzZS90X2NvbnN0LmgiCi0jaW5jbHVkZSAicGFyc2UvdF9maWVsZC5oIgotCi0vKioKLSAqIERlZmluZWQgaW4gdGhlIGZsZXggbGlicmFyeQotICovCi0KLWludCB5eWxleCh2b2lkKTsKLQotaW50IHl5cGFyc2Uodm9pZCk7Ci0KLS8qKgotICogRXhwZWN0ZWQgdG8gYmUgZGVmaW5lZCBieSBGbGV4L0Jpc29uCi0gKi8KLXZvaWQgeXllcnJvcihjb25zdCBjaGFyKiBmbXQsIC4uLik7Ci0KLS8qKgotICogUGFyc2UgZGVidWdnaW5nIG91dHB1dCwgdXNlZCB0byBwcmludCBoZWxwZnVsIGluZm8KLSAqLwotdm9pZCBwZGVidWcoY29uc3QgY2hhciogZm10LCAuLi4pOwotCi0vKioKLSAqIFBhcnNlciB3YXJuaW5nCi0gKi8KLXZvaWQgcHdhcm5pbmcoaW50IGxldmVsLCBjb25zdCBjaGFyKiBmbXQsIC4uLik7Ci0KLS8qKgotICogRmFpbHVyZSEKLSAqLwotdm9pZCBmYWlsdXJlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKLQotLyoqCi0gKiBDaGVjayBjb25zdGFudCB0eXBlcwotICovCi12b2lkIHZhbGlkYXRlX2NvbnN0X3R5cGUodF9jb25zdCogYyk7Ci0KLS8qKgotICogQ2hlY2sgY29uc3RhbnQgdHlwZXMKLSAqLwotdm9pZCB2YWxpZGF0ZV9maWVsZF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCwgdF9jb25zdF92YWx1ZSogY3YpOwotCi0vKioKLSAqIENoZWNrIG1lbWJlcnMgb2YgYSB0aHJvd3MgYmxvY2sKLSAqLwotYm9vbCB2YWxpZGF0ZV90aHJvd3ModF9zdHJ1Y3QqIHRocm93cyk7Ci0KLS8qKgotICogQ29udmVydHMgYSBzdHJpbmcgZmlsZW5hbWUgaW50byBhIHRocmlmdCBwcm9ncmFtIG5hbWUKLSAqLwotc3RkOjpzdHJpbmcgcHJvZ3JhbV9uYW1lKHN0ZDo6c3RyaW5nIGZpbGVuYW1lKTsKLQotLyoqCi0gKiBHZXRzIHRoZSBkaXJlY3RvcnkgcGF0aCBvZiBhIGZpbGVuYW1lCi0gKi8KLXN0ZDo6c3RyaW5nIGRpcmVjdG9yeV9uYW1lKHN0ZDo6c3RyaW5nIGZpbGVuYW1lKTsKLQotLyoqCi0gKiBHZXQgdGhlIGFic29sdXRlIHBhdGggZm9yIGFuIGluY2x1ZGUgZmlsZQotICovCi1zdGQ6OnN0cmluZyBpbmNsdWRlX2ZpbGUoc3RkOjpzdHJpbmcgZmlsZW5hbWUpOwotCi0vKioKLSAqIENsZWFycyBhbnkgcHJldmlvdXNseSBzdG9yZWQgZG9jdGV4dCBzdHJpbmcuCi0gKi8KLXZvaWQgY2xlYXJfZG9jdGV4dCgpOwotCi0vKioKLSAqIENsZWFucyB1cCB0ZXh0IGNvbW1vbmx5IGZvdW5kIGluIGRveHlnZW4tbGlrZSBjb21tZW50cwotICovCi1jaGFyKiBjbGVhbl91cF9kb2N0ZXh0KGNoYXIqIGRvY3RleHQpOwotCi0vKioKLSAqIEZsZXggdXRpbGl0aWVzCi0gKi8KLQotZXh0ZXJuIGludCAgIHl5bGluZW5vOwotZXh0ZXJuIGNoYXIgIHl5dGV4dFtdOwotZXh0ZXJuIEZJTEUqIHl5aW47Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9tZDUuYyBiL2NvbXBpbGVyL2NwcC9zcmMvbWQ1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNWQ5NmMuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9tZDUuYworKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0vKgotICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIgQWxhZGRpbiBFbnRlcnByaXNlcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotCi0gIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi0gIEwuIFBldGVyIERldXRzY2gKLSAgZ2hvc3RAYWxhZGRpbi5jb20KLQotICovCi0vKiAkSWQ6IG1kNS5jLHYgMS42IDIwMDIvMDQvMTMgMTk6MjA6MjggbHBkIEV4cCAkICovCi0vKgotICBJbmRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiBvZiBNRDUgKFJGQyAxMzIxKS4KLQotICBUaGlzIGNvZGUgaW1wbGVtZW50cyB0aGUgTUQ1IEFsZ29yaXRobSBkZWZpbmVkIGluIFJGQyAxMzIxLCB3aG9zZQotICB0ZXh0IGlzIGF2YWlsYWJsZSBhdAotCWh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzEzMjEudHh0Ci0gIFRoZSBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgdGV4dCBvZiB0aGUgUkZDLCBpbmNsdWRpbmcgdGhlIHRlc3Qgc3VpdGUKLSAgKHNlY3Rpb24gQS41KSBidXQgZXhjbHVkaW5nIHRoZSByZXN0IG9mIEFwcGVuZGl4IEEuICBJdCBkb2VzIG5vdCBpbmNsdWRlCi0gIGFueSBjb2RlIG9yIGRvY3VtZW50YXRpb24gdGhhdCBpcyBpZGVudGlmaWVkIGluIHRoZSBSRkMgYXMgYmVpbmcKLSAgY29weXJpZ2h0ZWQuCi0KLSAgVGhlIG9yaWdpbmFsIGFuZCBwcmluY2lwYWwgYXV0aG9yIG9mIG1kNS5jIGlzIEwuIFBldGVyIERldXRzY2gKLSAgPGdob3N0QGFsYWRkaW4uY29tPi4gIE90aGVyIGF1dGhvcnMgYXJlIG5vdGVkIGluIHRoZSBjaGFuZ2UgaGlzdG9yeQotICB0aGF0IGZvbGxvd3MgKGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlcik6Ci0KLSAgMjAwMi0wNC0xMyBscGQgQ2xhcmlmaWVkIGRlcml2YXRpb24gZnJvbSBSRkMgMTMyMTsgbm93IGhhbmRsZXMgYnl0ZSBvcmRlcgotCWVpdGhlciBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5OyBhZGRlZCBtaXNzaW5nICNpbmNsdWRlIDxzdHJpbmcuaD4KLQlpbiBsaWJyYXJ5LgotICAyMDAyLTAzLTExIGxwZCBDb3JyZWN0ZWQgYXJndW1lbnQgbGlzdCBmb3IgbWFpbigpLCBhbmQgYWRkZWQgaW50IHJldHVybgotCXR5cGUsIGluIHRlc3QgcHJvZ3JhbSBhbmQgVCB2YWx1ZSBwcm9ncmFtLgotICAyMDAyLTAyLTIxIGxwZCBBZGRlZCBtaXNzaW5nICNpbmNsdWRlIDxzdGRpby5oPiBpbiB0ZXN0IHByb2dyYW0uCi0gIDIwMDAtMDctMDMgbHBkIFBhdGNoZWQgdG8gZWxpbWluYXRlIHdhcm5pbmdzIGFib3V0ICJjb25zdGFudCBpcwotCXVuc2lnbmVkIGluIEFOU0kgQywgc2lnbmVkIGluIHRyYWRpdGlvbmFsIjsgbWFkZSB0ZXN0IHByb2dyYW0KLQlzZWxmLWNoZWNraW5nLgotICAxOTk5LTExLTA0IGxwZCBFZGl0ZWQgY29tbWVudHMgc2xpZ2h0bHkgZm9yIGF1dG9tYXRpYyBUT0MgZXh0cmFjdGlvbi4KLSAgMTk5OS0xMC0xOCBscGQgRml4ZWQgdHlwbyBpbiBoZWFkZXIgY29tbWVudCAoYW5zaTJrbnIgcmF0aGVyIHRoYW4gbWQ1KS4KLSAgMTk5OS0wNS0wMyBscGQgT3JpZ2luYWwgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSAibWQ1LmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSN1bmRlZiBCWVRFX09SREVSCS8qIDEgPSBiaWctZW5kaWFuLCAtMSA9IGxpdHRsZS1lbmRpYW4sIDAgPSB1bmtub3duICovCi0jaWZkZWYgQVJDSF9JU19CSUdfRU5ESUFOCi0jICBkZWZpbmUgQllURV9PUkRFUiAoQVJDSF9JU19CSUdfRU5ESUFOID8gMSA6IC0xKQotI2Vsc2UKLSMgIGRlZmluZSBCWVRFX09SREVSIDAKLSNlbmRpZgotCi0jZGVmaW5lIFRfTUFTSyAoKG1kNV93b3JkX3QpfjApCi0jZGVmaW5lIFQxIC8qIDB4ZDc2YWE0NzggKi8gKFRfTUFTSyBeIDB4Mjg5NTViODcpCi0jZGVmaW5lIFQyIC8qIDB4ZThjN2I3NTYgKi8gKFRfTUFTSyBeIDB4MTczODQ4YTkpCi0jZGVmaW5lIFQzICAgIDB4MjQyMDcwZGIKLSNkZWZpbmUgVDQgLyogMHhjMWJkY2VlZSAqLyAoVF9NQVNLIF4gMHgzZTQyMzExMSkKLSNkZWZpbmUgVDUgLyogMHhmNTdjMGZhZiAqLyAoVF9NQVNLIF4gMHgwYTgzZjA1MCkKLSNkZWZpbmUgVDYgICAgMHg0Nzg3YzYyYQotI2RlZmluZSBUNyAvKiAweGE4MzA0NjEzICovIChUX01BU0sgXiAweDU3Y2ZiOWVjKQotI2RlZmluZSBUOCAvKiAweGZkNDY5NTAxICovIChUX01BU0sgXiAweDAyYjk2YWZlKQotI2RlZmluZSBUOSAgICAweDY5ODA5OGQ4Ci0jZGVmaW5lIFQxMCAvKiAweDhiNDRmN2FmICovIChUX01BU0sgXiAweDc0YmIwODUwKQotI2RlZmluZSBUMTEgLyogMHhmZmZmNWJiMSAqLyAoVF9NQVNLIF4gMHgwMDAwYTQ0ZSkKLSNkZWZpbmUgVDEyIC8qIDB4ODk1Y2Q3YmUgKi8gKFRfTUFTSyBeIDB4NzZhMzI4NDEpCi0jZGVmaW5lIFQxMyAgICAweDZiOTAxMTIyCi0jZGVmaW5lIFQxNCAvKiAweGZkOTg3MTkzICovIChUX01BU0sgXiAweDAyNjc4ZTZjKQotI2RlZmluZSBUMTUgLyogMHhhNjc5NDM4ZSAqLyAoVF9NQVNLIF4gMHg1OTg2YmM3MSkKLSNkZWZpbmUgVDE2ICAgIDB4NDliNDA4MjEKLSNkZWZpbmUgVDE3IC8qIDB4ZjYxZTI1NjIgKi8gKFRfTUFTSyBeIDB4MDllMWRhOWQpCi0jZGVmaW5lIFQxOCAvKiAweGMwNDBiMzQwICovIChUX01BU0sgXiAweDNmYmY0Y2JmKQotI2RlZmluZSBUMTkgICAgMHgyNjVlNWE1MQotI2RlZmluZSBUMjAgLyogMHhlOWI2YzdhYSAqLyAoVF9NQVNLIF4gMHgxNjQ5Mzg1NSkKLSNkZWZpbmUgVDIxIC8qIDB4ZDYyZjEwNWQgKi8gKFRfTUFTSyBeIDB4MjlkMGVmYTIpCi0jZGVmaW5lIFQyMiAgICAweDAyNDQxNDUzCi0jZGVmaW5lIFQyMyAvKiAweGQ4YTFlNjgxICovIChUX01BU0sgXiAweDI3NWUxOTdlKQotI2RlZmluZSBUMjQgLyogMHhlN2QzZmJjOCAqLyAoVF9NQVNLIF4gMHgxODJjMDQzNykKLSNkZWZpbmUgVDI1ICAgIDB4MjFlMWNkZTYKLSNkZWZpbmUgVDI2IC8qIDB4YzMzNzA3ZDYgKi8gKFRfTUFTSyBeIDB4M2NjOGY4MjkpCi0jZGVmaW5lIFQyNyAvKiAweGY0ZDUwZDg3ICovIChUX01BU0sgXiAweDBiMmFmMjc4KQotI2RlZmluZSBUMjggICAgMHg0NTVhMTRlZAotI2RlZmluZSBUMjkgLyogMHhhOWUzZTkwNSAqLyAoVF9NQVNLIF4gMHg1NjFjMTZmYSkKLSNkZWZpbmUgVDMwIC8qIDB4ZmNlZmEzZjggKi8gKFRfTUFTSyBeIDB4MDMxMDVjMDcpCi0jZGVmaW5lIFQzMSAgICAweDY3NmYwMmQ5Ci0jZGVmaW5lIFQzMiAvKiAweDhkMmE0YzhhICovIChUX01BU0sgXiAweDcyZDViMzc1KQotI2RlZmluZSBUMzMgLyogMHhmZmZhMzk0MiAqLyAoVF9NQVNLIF4gMHgwMDA1YzZiZCkKLSNkZWZpbmUgVDM0IC8qIDB4ODc3MWY2ODEgKi8gKFRfTUFTSyBeIDB4Nzg4ZTA5N2UpCi0jZGVmaW5lIFQzNSAgICAweDZkOWQ2MTIyCi0jZGVmaW5lIFQzNiAvKiAweGZkZTUzODBjICovIChUX01BU0sgXiAweDAyMWFjN2YzKQotI2RlZmluZSBUMzcgLyogMHhhNGJlZWE0NCAqLyAoVF9NQVNLIF4gMHg1YjQxMTViYikKLSNkZWZpbmUgVDM4ICAgIDB4NGJkZWNmYTkKLSNkZWZpbmUgVDM5IC8qIDB4ZjZiYjRiNjAgKi8gKFRfTUFTSyBeIDB4MDk0NGI0OWYpCi0jZGVmaW5lIFQ0MCAvKiAweGJlYmZiYzcwICovIChUX01BU0sgXiAweDQxNDA0MzhmKQotI2RlZmluZSBUNDEgICAgMHgyODliN2VjNgotI2RlZmluZSBUNDIgLyogMHhlYWExMjdmYSAqLyAoVF9NQVNLIF4gMHgxNTVlZDgwNSkKLSNkZWZpbmUgVDQzIC8qIDB4ZDRlZjMwODUgKi8gKFRfTUFTSyBeIDB4MmIxMGNmN2EpCi0jZGVmaW5lIFQ0NCAgICAweDA0ODgxZDA1Ci0jZGVmaW5lIFQ0NSAvKiAweGQ5ZDRkMDM5ICovIChUX01BU0sgXiAweDI2MmIyZmM2KQotI2RlZmluZSBUNDYgLyogMHhlNmRiOTllNSAqLyAoVF9NQVNLIF4gMHgxOTI0NjYxYSkKLSNkZWZpbmUgVDQ3ICAgIDB4MWZhMjdjZjgKLSNkZWZpbmUgVDQ4IC8qIDB4YzRhYzU2NjUgKi8gKFRfTUFTSyBeIDB4M2I1M2E5OWEpCi0jZGVmaW5lIFQ0OSAvKiAweGY0MjkyMjQ0ICovIChUX01BU0sgXiAweDBiZDZkZGJiKQotI2RlZmluZSBUNTAgICAgMHg0MzJhZmY5NwotI2RlZmluZSBUNTEgLyogMHhhYjk0MjNhNyAqLyAoVF9NQVNLIF4gMHg1NDZiZGM1OCkKLSNkZWZpbmUgVDUyIC8qIDB4ZmM5M2EwMzkgKi8gKFRfTUFTSyBeIDB4MDM2YzVmYzYpCi0jZGVmaW5lIFQ1MyAgICAweDY1NWI1OWMzCi0jZGVmaW5lIFQ1NCAvKiAweDhmMGNjYzkyICovIChUX01BU0sgXiAweDcwZjMzMzZkKQotI2RlZmluZSBUNTUgLyogMHhmZmVmZjQ3ZCAqLyAoVF9NQVNLIF4gMHgwMDEwMGI4MikKLSNkZWZpbmUgVDU2IC8qIDB4ODU4NDVkZDEgKi8gKFRfTUFTSyBeIDB4N2E3YmEyMmUpCi0jZGVmaW5lIFQ1NyAgICAweDZmYTg3ZTRmCi0jZGVmaW5lIFQ1OCAvKiAweGZlMmNlNmUwICovIChUX01BU0sgXiAweDAxZDMxOTFmKQotI2RlZmluZSBUNTkgLyogMHhhMzAxNDMxNCAqLyAoVF9NQVNLIF4gMHg1Y2ZlYmNlYikKLSNkZWZpbmUgVDYwICAgIDB4NGUwODExYTEKLSNkZWZpbmUgVDYxIC8qIDB4Zjc1MzdlODIgKi8gKFRfTUFTSyBeIDB4MDhhYzgxN2QpCi0jZGVmaW5lIFQ2MiAvKiAweGJkM2FmMjM1ICovIChUX01BU0sgXiAweDQyYzUwZGNhKQotI2RlZmluZSBUNjMgICAgMHgyYWQ3ZDJiYgotI2RlZmluZSBUNjQgLyogMHhlYjg2ZDM5MSAqLyAoVF9NQVNLIF4gMHgxNDc5MmM2ZSkKLQotCi1zdGF0aWMgdm9pZAotbWQ1X3Byb2Nlc3MobWQ1X3N0YXRlX3QgKnBtcywgY29uc3QgbWQ1X2J5dGVfdCAqZGF0YSAvKls2NF0qLykKLXsKLSAgICBtZDVfd29yZF90Ci0JYSA9IHBtcy0+YWJjZFswXSwgYiA9IHBtcy0+YWJjZFsxXSwKLQljID0gcG1zLT5hYmNkWzJdLCBkID0gcG1zLT5hYmNkWzNdOwotICAgIG1kNV93b3JkX3QgdDsKLSNpZiBCWVRFX09SREVSID4gMAotICAgIC8qIERlZmluZSBzdG9yYWdlIG9ubHkgZm9yIGJpZy1lbmRpYW4gQ1BVcy4gKi8KLSAgICBtZDVfd29yZF90IFhbMTZdOwotI2Vsc2UKLSAgICAvKiBEZWZpbmUgc3RvcmFnZSBmb3IgbGl0dGxlLWVuZGlhbiBvciBib3RoIHR5cGVzIG9mIENQVXMuICovCi0gICAgbWQ1X3dvcmRfdCB4YnVmWzE2XTsKLSAgICBjb25zdCBtZDVfd29yZF90ICpYOwotI2VuZGlmCi0KLSAgICB7Ci0jaWYgQllURV9PUkRFUiA9PSAwCi0JLyoKLQkgKiBEZXRlcm1pbmUgZHluYW1pY2FsbHkgd2hldGhlciB0aGlzIGlzIGEgYmlnLWVuZGlhbiBvcgotCSAqIGxpdHRsZS1lbmRpYW4gbWFjaGluZSwgc2luY2Ugd2UgY2FuIHVzZSBhIG1vcmUgZWZmaWNpZW50Ci0JICogYWxnb3JpdGhtIG9uIHRoZSBsYXR0ZXIuCi0JICovCi0Jc3RhdGljIGNvbnN0IGludCB3ID0gMTsKLQotCWlmICgqKChjb25zdCBtZDVfYnl0ZV90ICopJncpKSAvKiBkeW5hbWljIGxpdHRsZS1lbmRpYW4gKi8KLSNlbmRpZgotI2lmIEJZVEVfT1JERVIgPD0gMAkJLyogbGl0dGxlLWVuZGlhbiAqLwotCXsKLQkgICAgLyoKLQkgICAgICogT24gbGl0dGxlLWVuZGlhbiBtYWNoaW5lcywgd2UgY2FuIHByb2Nlc3MgcHJvcGVybHkgYWxpZ25lZAotCSAgICAgKiBkYXRhIHdpdGhvdXQgY29weWluZyBpdC4KLQkgICAgICovCi0JICAgIGlmICghKChkYXRhIC0gKGNvbnN0IG1kNV9ieXRlX3QgKikwKSAmIDMpKSB7Ci0JCS8qIGRhdGEgYXJlIHByb3Blcmx5IGFsaWduZWQgKi8KLQkJWCA9IChjb25zdCBtZDVfd29yZF90ICopZGF0YTsKLQkgICAgfSBlbHNlIHsKLQkJLyogbm90IGFsaWduZWQgKi8KLQkJbWVtY3B5KHhidWYsIGRhdGEsIDY0KTsKLQkJWCA9IHhidWY7Ci0JICAgIH0KLQl9Ci0jZW5kaWYKLSNpZiBCWVRFX09SREVSID09IDAKLQllbHNlCQkJLyogZHluYW1pYyBiaWctZW5kaWFuICovCi0jZW5kaWYKLSNpZiBCWVRFX09SREVSID49IDAJCS8qIGJpZy1lbmRpYW4gKi8KLQl7Ci0JICAgIC8qCi0JICAgICAqIE9uIGJpZy1lbmRpYW4gbWFjaGluZXMsIHdlIG11c3QgYXJyYW5nZSB0aGUgYnl0ZXMgaW4gdGhlCi0JICAgICAqIHJpZ2h0IG9yZGVyLgotCSAgICAgKi8KLQkgICAgY29uc3QgbWQ1X2J5dGVfdCAqeHAgPSBkYXRhOwotCSAgICBpbnQgaTsKLQotIyAgaWYgQllURV9PUkRFUiA9PSAwCi0JICAgIFggPSB4YnVmOwkJLyogKGR5bmFtaWMgb25seSkgKi8KLSMgIGVsc2UKLSMgICAgZGVmaW5lIHhidWYgWAkJLyogKHN0YXRpYyBvbmx5KSAqLwotIyAgZW5kaWYKLQkgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2ksIHhwICs9IDQpCi0JCXhidWZbaV0gPSB4cFswXSArICh4cFsxXSA8PCA4KSArICh4cFsyXSA8PCAxNikgKyAoeHBbM10gPDwgMjQpOwotCX0KLSNlbmRpZgotICAgIH0KLQotI2RlZmluZSBST1RBVEVfTEVGVCh4LCBuKSAoKCh4KSA8PCAobikpIHwgKCh4KSA+PiAoMzIgLSAobikpKSkKLQotICAgIC8qIFJvdW5kIDEuICovCi0gICAgLyogTGV0IFthYmNkIGsgcyBpXSBkZW5vdGUgdGhlIG9wZXJhdGlvbgotICAgICAgIGEgPSBiICsgKChhICsgRihiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpLiAqLwotI2RlZmluZSBGKHgsIHksIHopICgoKHgpICYgKHkpKSB8ICh+KHgpICYgKHopKSkKLSNkZWZpbmUgU0VUKGEsIGIsIGMsIGQsIGssIHMsIFRpKVwKLSAgdCA9IGEgKyBGKGIsYyxkKSArIFhba10gKyBUaTtcCi0gIGEgPSBST1RBVEVfTEVGVCh0LCBzKSArIGIKLSAgICAvKiBEbyB0aGUgZm9sbG93aW5nIDE2IG9wZXJhdGlvbnMuICovCi0gICAgU0VUKGEsIGIsIGMsIGQsICAwLCAgNywgIFQxKTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDEsIDEyLCAgVDIpOwotICAgIFNFVChjLCBkLCBhLCBiLCAgMiwgMTcsICBUMyk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICAzLCAyMiwgIFQ0KTsKLSAgICBTRVQoYSwgYiwgYywgZCwgIDQsICA3LCAgVDUpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgNSwgMTIsICBUNik7Ci0gICAgU0VUKGMsIGQsIGEsIGIsICA2LCAxNywgIFQ3KTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDcsIDIyLCAgVDgpOwotICAgIFNFVChhLCBiLCBjLCBkLCAgOCwgIDcsICBUOSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICA5LCAxMiwgVDEwKTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTAsIDE3LCBUMTEpOwotICAgIFNFVChiLCBjLCBkLCBhLCAxMSwgMjIsIFQxMik7Ci0gICAgU0VUKGEsIGIsIGMsIGQsIDEyLCAgNywgVDEzKTsKLSAgICBTRVQoZCwgYSwgYiwgYywgMTMsIDEyLCBUMTQpOwotICAgIFNFVChjLCBkLCBhLCBiLCAxNCwgMTcsIFQxNSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsIDE1LCAyMiwgVDE2KTsKLSN1bmRlZiBTRVQKLQotICAgICAvKiBSb3VuZCAyLiAqLwotICAgICAvKiBMZXQgW2FiY2QgayBzIGldIGRlbm90ZSB0aGUgb3BlcmF0aW9uCi0gICAgICAgICAgYSA9IGIgKyAoKGEgKyBHKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykuICovCi0jZGVmaW5lIEcoeCwgeSwgeikgKCgoeCkgJiAoeikpIHwgKCh5KSAmIH4oeikpKQotI2RlZmluZSBTRVQoYSwgYiwgYywgZCwgaywgcywgVGkpXAotICB0ID0gYSArIEcoYixjLGQpICsgWFtrXSArIFRpO1wKLSAgYSA9IFJPVEFURV9MRUZUKHQsIHMpICsgYgotICAgICAvKiBEbyB0aGUgZm9sbG93aW5nIDE2IG9wZXJhdGlvbnMuICovCi0gICAgU0VUKGEsIGIsIGMsIGQsICAxLCAgNSwgVDE3KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDYsICA5LCBUMTgpOwotICAgIFNFVChjLCBkLCBhLCBiLCAxMSwgMTQsIFQxOSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICAwLCAyMCwgVDIwKTsKLSAgICBTRVQoYSwgYiwgYywgZCwgIDUsICA1LCBUMjEpOwotICAgIFNFVChkLCBhLCBiLCBjLCAxMCwgIDksIFQyMik7Ci0gICAgU0VUKGMsIGQsIGEsIGIsIDE1LCAxNCwgVDIzKTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDQsIDIwLCBUMjQpOwotICAgIFNFVChhLCBiLCBjLCBkLCAgOSwgIDUsIFQyNSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsIDE0LCAgOSwgVDI2KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgIDMsIDE0LCBUMjcpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgOCwgMjAsIFQyOCk7Ci0gICAgU0VUKGEsIGIsIGMsIGQsIDEzLCAgNSwgVDI5KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDIsICA5LCBUMzApOwotICAgIFNFVChjLCBkLCBhLCBiLCAgNywgMTQsIFQzMSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsIDEyLCAyMCwgVDMyKTsKLSN1bmRlZiBTRVQKLQotICAgICAvKiBSb3VuZCAzLiAqLwotICAgICAvKiBMZXQgW2FiY2QgayBzIHRdIGRlbm90ZSB0aGUgb3BlcmF0aW9uCi0gICAgICAgICAgYSA9IGIgKyAoKGEgKyBIKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykuICovCi0jZGVmaW5lIEgoeCwgeSwgeikgKCh4KSBeICh5KSBeICh6KSkKLSNkZWZpbmUgU0VUKGEsIGIsIGMsIGQsIGssIHMsIFRpKVwKLSAgdCA9IGEgKyBIKGIsYyxkKSArIFhba10gKyBUaTtcCi0gIGEgPSBST1RBVEVfTEVGVCh0LCBzKSArIGIKLSAgICAgLyogRG8gdGhlIGZvbGxvd2luZyAxNiBvcGVyYXRpb25zLiAqLwotICAgIFNFVChhLCBiLCBjLCBkLCAgNSwgIDQsIFQzMyk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICA4LCAxMSwgVDM0KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTEsIDE2LCBUMzUpOwotICAgIFNFVChiLCBjLCBkLCBhLCAxNCwgMjMsIFQzNik7Ci0gICAgU0VUKGEsIGIsIGMsIGQsICAxLCAgNCwgVDM3KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDQsIDExLCBUMzgpOwotICAgIFNFVChjLCBkLCBhLCBiLCAgNywgMTYsIFQzOSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsIDEwLCAyMywgVDQwKTsKLSAgICBTRVQoYSwgYiwgYywgZCwgMTMsICA0LCBUNDEpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgMCwgMTEsIFQ0Mik7Ci0gICAgU0VUKGMsIGQsIGEsIGIsICAzLCAxNiwgVDQzKTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDYsIDIzLCBUNDQpOwotICAgIFNFVChhLCBiLCBjLCBkLCAgOSwgIDQsIFQ0NSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsIDEyLCAxMSwgVDQ2KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTUsIDE2LCBUNDcpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgMiwgMjMsIFQ0OCk7Ci0jdW5kZWYgU0VUCi0KLSAgICAgLyogUm91bmQgNC4gKi8KLSAgICAgLyogTGV0IFthYmNkIGsgcyB0XSBkZW5vdGUgdGhlIG9wZXJhdGlvbgotICAgICAgICAgIGEgPSBiICsgKChhICsgSShiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpLiAqLwotI2RlZmluZSBJKHgsIHksIHopICgoeSkgXiAoKHgpIHwgfih6KSkpCi0jZGVmaW5lIFNFVChhLCBiLCBjLCBkLCBrLCBzLCBUaSlcCi0gIHQgPSBhICsgSShiLGMsZCkgKyBYW2tdICsgVGk7XAotICBhID0gUk9UQVRFX0xFRlQodCwgcykgKyBiCi0gICAgIC8qIERvIHRoZSBmb2xsb3dpbmcgMTYgb3BlcmF0aW9ucy4gKi8KLSAgICBTRVQoYSwgYiwgYywgZCwgIDAsICA2LCBUNDkpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgNywgMTAsIFQ1MCk7Ci0gICAgU0VUKGMsIGQsIGEsIGIsIDE0LCAxNSwgVDUxKTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDUsIDIxLCBUNTIpOwotICAgIFNFVChhLCBiLCBjLCBkLCAxMiwgIDYsIFQ1Myk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICAzLCAxMCwgVDU0KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTAsIDE1LCBUNTUpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgMSwgMjEsIFQ1Nik7Ci0gICAgU0VUKGEsIGIsIGMsIGQsICA4LCAgNiwgVDU3KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgMTUsIDEwLCBUNTgpOwotICAgIFNFVChjLCBkLCBhLCBiLCAgNiwgMTUsIFQ1OSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsIDEzLCAyMSwgVDYwKTsKLSAgICBTRVQoYSwgYiwgYywgZCwgIDQsICA2LCBUNjEpOwotICAgIFNFVChkLCBhLCBiLCBjLCAxMSwgMTAsIFQ2Mik7Ci0gICAgU0VUKGMsIGQsIGEsIGIsICAyLCAxNSwgVDYzKTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDksIDIxLCBUNjQpOwotI3VuZGVmIFNFVAotCi0gICAgIC8qIFRoZW4gcGVyZm9ybSB0aGUgZm9sbG93aW5nIGFkZGl0aW9ucy4gKFRoYXQgaXMgaW5jcmVtZW50IGVhY2gKLSAgICAgICAgb2YgdGhlIGZvdXIgcmVnaXN0ZXJzIGJ5IHRoZSB2YWx1ZSBpdCBoYWQgYmVmb3JlIHRoaXMgYmxvY2sKLSAgICAgICAgd2FzIHN0YXJ0ZWQuKSAqLwotICAgIHBtcy0+YWJjZFswXSArPSBhOwotICAgIHBtcy0+YWJjZFsxXSArPSBiOwotICAgIHBtcy0+YWJjZFsyXSArPSBjOwotICAgIHBtcy0+YWJjZFszXSArPSBkOwotfQotCi12b2lkCi1tZDVfaW5pdChtZDVfc3RhdGVfdCAqcG1zKQotewotICAgIHBtcy0+Y291bnRbMF0gPSBwbXMtPmNvdW50WzFdID0gMDsKLSAgICBwbXMtPmFiY2RbMF0gPSAweDY3NDUyMzAxOwotICAgIHBtcy0+YWJjZFsxXSA9IC8qMHhlZmNkYWI4OSovIFRfTUFTSyBeIDB4MTAzMjU0NzY7Ci0gICAgcG1zLT5hYmNkWzJdID0gLyoweDk4YmFkY2ZlKi8gVF9NQVNLIF4gMHg2NzQ1MjMwMTsKLSAgICBwbXMtPmFiY2RbM10gPSAweDEwMzI1NDc2OwotfQotCi12b2lkCi1tZDVfYXBwZW5kKG1kNV9zdGF0ZV90ICpwbXMsIGNvbnN0IG1kNV9ieXRlX3QgKmRhdGEsIGludCBuYnl0ZXMpCi17Ci0gICAgY29uc3QgbWQ1X2J5dGVfdCAqcCA9IGRhdGE7Ci0gICAgaW50IGxlZnQgPSBuYnl0ZXM7Ci0gICAgaW50IG9mZnNldCA9IChwbXMtPmNvdW50WzBdID4+IDMpICYgNjM7Ci0gICAgbWQ1X3dvcmRfdCBuYml0cyA9IChtZDVfd29yZF90KShuYnl0ZXMgPDwgMyk7Ci0KLSAgICBpZiAobmJ5dGVzIDw9IDApCi0JcmV0dXJuOwotCi0gICAgLyogVXBkYXRlIHRoZSBtZXNzYWdlIGxlbmd0aC4gKi8KLSAgICBwbXMtPmNvdW50WzFdICs9IG5ieXRlcyA+PiAyOTsKLSAgICBwbXMtPmNvdW50WzBdICs9IG5iaXRzOwotICAgIGlmIChwbXMtPmNvdW50WzBdIDwgbmJpdHMpCi0JcG1zLT5jb3VudFsxXSsrOwotCi0gICAgLyogUHJvY2VzcyBhbiBpbml0aWFsIHBhcnRpYWwgYmxvY2suICovCi0gICAgaWYgKG9mZnNldCkgewotCWludCBjb3B5ID0gKG9mZnNldCArIG5ieXRlcyA+IDY0ID8gNjQgLSBvZmZzZXQgOiBuYnl0ZXMpOwotCi0JbWVtY3B5KHBtcy0+YnVmICsgb2Zmc2V0LCBwLCBjb3B5KTsKLQlpZiAob2Zmc2V0ICsgY29weSA8IDY0KQotCSAgICByZXR1cm47Ci0JcCArPSBjb3B5OwotCWxlZnQgLT0gY29weTsKLQltZDVfcHJvY2VzcyhwbXMsIHBtcy0+YnVmKTsKLSAgICB9Ci0KLSAgICAvKiBQcm9jZXNzIGZ1bGwgYmxvY2tzLiAqLwotICAgIGZvciAoOyBsZWZ0ID49IDY0OyBwICs9IDY0LCBsZWZ0IC09IDY0KQotCW1kNV9wcm9jZXNzKHBtcywgcCk7Ci0KLSAgICAvKiBQcm9jZXNzIGEgZmluYWwgcGFydGlhbCBibG9jay4gKi8KLSAgICBpZiAobGVmdCkKLQltZW1jcHkocG1zLT5idWYsIHAsIGxlZnQpOwotfQotCi12b2lkCi1tZDVfZmluaXNoKG1kNV9zdGF0ZV90ICpwbXMsIG1kNV9ieXRlX3QgZGlnZXN0WzE2XSkKLXsKLSAgICBzdGF0aWMgY29uc3QgbWQ1X2J5dGVfdCBwYWRbNjRdID0gewotCTB4ODAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0JMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKLSAgICB9OwotICAgIG1kNV9ieXRlX3QgZGF0YVs4XTsKLSAgICBpbnQgaTsKLQotICAgIC8qIFNhdmUgdGhlIGxlbmd0aCBiZWZvcmUgcGFkZGluZy4gKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKQotCWRhdGFbaV0gPSAobWQ1X2J5dGVfdCkocG1zLT5jb3VudFtpID4+IDJdID4+ICgoaSAmIDMpIDw8IDMpKTsKLSAgICAvKiBQYWQgdG8gNTYgYnl0ZXMgbW9kIDY0LiAqLwotICAgIG1kNV9hcHBlbmQocG1zLCBwYWQsICgoNTUgLSAocG1zLT5jb3VudFswXSA+PiAzKSkgJiA2MykgKyAxKTsKLSAgICAvKiBBcHBlbmQgdGhlIGxlbmd0aC4gKi8KLSAgICBtZDVfYXBwZW5kKHBtcywgZGF0YSwgOCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpCi0JZGlnZXN0W2ldID0gKG1kNV9ieXRlX3QpKHBtcy0+YWJjZFtpID4+IDJdID4+ICgoaSAmIDMpIDw8IDMpKTsKLX0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvbWQ1LmggYi9jb21waWxlci9jcHAvc3JjL21kNS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OThjOTk1Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvbWQ1LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDIgQWxhZGRpbiBFbnRlcnByaXNlcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotCi0gIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi0gIEwuIFBldGVyIERldXRzY2gKLSAgZ2hvc3RAYWxhZGRpbi5jb20KLQotICovCi0vKiAkSWQ6IG1kNS5oLHYgMS40IDIwMDIvMDQvMTMgMTk6MjA6MjggbHBkIEV4cCAkICovCi0vKgotICBJbmRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiBvZiBNRDUgKFJGQyAxMzIxKS4KLQotICBUaGlzIGNvZGUgaW1wbGVtZW50cyB0aGUgTUQ1IEFsZ29yaXRobSBkZWZpbmVkIGluIFJGQyAxMzIxLCB3aG9zZQotICB0ZXh0IGlzIGF2YWlsYWJsZSBhdAotCWh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzEzMjEudHh0Ci0gIFRoZSBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgdGV4dCBvZiB0aGUgUkZDLCBpbmNsdWRpbmcgdGhlIHRlc3Qgc3VpdGUKLSAgKHNlY3Rpb24gQS41KSBidXQgZXhjbHVkaW5nIHRoZSByZXN0IG9mIEFwcGVuZGl4IEEuICBJdCBkb2VzIG5vdCBpbmNsdWRlCi0gIGFueSBjb2RlIG9yIGRvY3VtZW50YXRpb24gdGhhdCBpcyBpZGVudGlmaWVkIGluIHRoZSBSRkMgYXMgYmVpbmcKLSAgY29weXJpZ2h0ZWQuCi0KLSAgVGhlIG9yaWdpbmFsIGFuZCBwcmluY2lwYWwgYXV0aG9yIG9mIG1kNS5oIGlzIEwuIFBldGVyIERldXRzY2gKLSAgPGdob3N0QGFsYWRkaW4uY29tPi4gIE90aGVyIGF1dGhvcnMgYXJlIG5vdGVkIGluIHRoZSBjaGFuZ2UgaGlzdG9yeQotICB0aGF0IGZvbGxvd3MgKGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlcik6Ci0KLSAgMjAwMi0wNC0xMyBscGQgUmVtb3ZlZCBzdXBwb3J0IGZvciBub24tQU5TSSBjb21waWxlcnM7IHJlbW92ZWQKLQlyZWZlcmVuY2VzIHRvIEdob3N0c2NyaXB0OyBjbGFyaWZpZWQgZGVyaXZhdGlvbiBmcm9tIFJGQyAxMzIxOwotCW5vdyBoYW5kbGVzIGJ5dGUgb3JkZXIgZWl0aGVyIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkuCi0gIDE5OTktMTEtMDQgbHBkIEVkaXRlZCBjb21tZW50cyBzbGlnaHRseSBmb3IgYXV0b21hdGljIFRPQyBleHRyYWN0aW9uLgotICAxOTk5LTEwLTE4IGxwZCBGaXhlZCB0eXBvIGluIGhlYWRlciBjb21tZW50IChhbnNpMmtuciByYXRoZXIgdGhhbiBtZDUpOwotCWFkZGVkIGNvbmRpdGlvbmFsaXphdGlvbiBmb3IgQysrIGNvbXBpbGF0aW9uIGZyb20gTWFydGluCi0JUHVyc2Noa2UgPHB1cnNjaGtlQGJubC5nb3Y+LgotICAxOTk5LTA1LTAzIGxwZCBPcmlnaW5hbCB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgbWQ1X0lOQ0xVREVECi0jICBkZWZpbmUgbWQ1X0lOQ0xVREVECi0KLS8qCi0gKiBUaGlzIHBhY2thZ2Ugc3VwcG9ydHMgYm90aCBjb21waWxlLXRpbWUgYW5kIHJ1bi10aW1lIGRldGVybWluYXRpb24gb2YgQ1BVCi0gKiBieXRlIG9yZGVyLiAgSWYgQVJDSF9JU19CSUdfRU5ESUFOIGlzIGRlZmluZWQgYXMgMCwgdGhlIGNvZGUgd2lsbCBiZQotICogY29tcGlsZWQgdG8gcnVuIG9ubHkgb24gbGl0dGxlLWVuZGlhbiBDUFVzOyBpZiBBUkNIX0lTX0JJR19FTkRJQU4gaXMKLSAqIGRlZmluZWQgYXMgbm9uLXplcm8sIHRoZSBjb2RlIHdpbGwgYmUgY29tcGlsZWQgdG8gcnVuIG9ubHkgb24gYmlnLWVuZGlhbgotICogQ1BVczsgaWYgQVJDSF9JU19CSUdfRU5ESUFOIGlzIG5vdCBkZWZpbmVkLCB0aGUgY29kZSB3aWxsIGJlIGNvbXBpbGVkIHRvCi0gKiBydW4gb24gZWl0aGVyIGJpZy0gb3IgbGl0dGxlLWVuZGlhbiBDUFVzLCBidXQgd2lsbCBydW4gc2xpZ2h0bHkgbGVzcwotICogZWZmaWNpZW50bHkgb24gZWl0aGVyIG9uZSB0aGFuIGlmIEFSQ0hfSVNfQklHX0VORElBTiBpcyBkZWZpbmVkLgotICovCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBtZDVfYnl0ZV90OyAvKiA4LWJpdCBieXRlICovCi10eXBlZGVmIHVuc2lnbmVkIGludCBtZDVfd29yZF90OyAvKiAzMi1iaXQgd29yZCAqLwotCi0vKiBEZWZpbmUgdGhlIHN0YXRlIG9mIHRoZSBNRDUgQWxnb3JpdGhtLiAqLwotdHlwZWRlZiBzdHJ1Y3QgbWQ1X3N0YXRlX3MgewotICAgIG1kNV93b3JkX3QgY291bnRbMl07CS8qIG1lc3NhZ2UgbGVuZ3RoIGluIGJpdHMsIGxzdyBmaXJzdCAqLwotICAgIG1kNV93b3JkX3QgYWJjZFs0XTsJCS8qIGRpZ2VzdCBidWZmZXIgKi8KLSAgICBtZDVfYnl0ZV90IGJ1Zls2NF07CQkvKiBhY2N1bXVsYXRlIGJsb2NrICovCi19IG1kNV9zdGF0ZV90OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgCi17Ci0jZW5kaWYKLQotLyogSW5pdGlhbGl6ZSB0aGUgYWxnb3JpdGhtLiAqLwotdm9pZCBtZDVfaW5pdChtZDVfc3RhdGVfdCAqcG1zKTsKLQotLyogQXBwZW5kIGEgc3RyaW5nIHRvIHRoZSBtZXNzYWdlLiAqLwotdm9pZCBtZDVfYXBwZW5kKG1kNV9zdGF0ZV90ICpwbXMsIGNvbnN0IG1kNV9ieXRlX3QgKmRhdGEsIGludCBuYnl0ZXMpOwotCi0vKiBGaW5pc2ggdGhlIG1lc3NhZ2UgYW5kIHJldHVybiB0aGUgZGlnZXN0LiAqLwotdm9pZCBtZDVfZmluaXNoKG1kNV9zdGF0ZV90ICpwbXMsIG1kNV9ieXRlX3QgZGlnZXN0WzE2XSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgLyogZW5kIGV4dGVybiAiQyIgKi8KLSNlbmRpZgotCi0jZW5kaWYgLyogbWQ1X0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3BhcnNlLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS9wYXJzZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY1NTY1Mi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3BhcnNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI2luY2x1ZGUgInRfdHlwZS5oIgotI2luY2x1ZGUgInRfdHlwZWRlZi5oIgotCi0jaW5jbHVkZSAibWQ1LmgiCi0KLXZvaWQgdF90eXBlOjpnZW5lcmF0ZV9maW5nZXJwcmludCgpIHsKLSAgc3RkOjpzdHJpbmcgbWF0ZXJpYWwgPSBnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKTsKLSAgbWQ1X3N0YXRlX3QgY3R4OwotICBtZDVfaW5pdCgmY3R4KTsKLSAgbWQ1X2FwcGVuZCgmY3R4LCAobWQ1X2J5dGVfdCopKG1hdGVyaWFsLmRhdGEoKSksIChpbnQpbWF0ZXJpYWwuc2l6ZSgpKTsKLSAgbWQ1X2ZpbmlzaCgmY3R4LCAobWQ1X2J5dGVfdCopZmluZ2VycHJpbnRfKTsKLX0KLQotdF90eXBlKiB0X3R5cGU6OmdldF90cnVlX3R5cGUoKSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRoaXM7Ci0gIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0gIHJldHVybiB0eXBlOwotfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2Jhc2VfdHlwZS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2Jhc2VfdHlwZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzY3NzJiLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9iYXNlX3R5cGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9CQVNFX1RZUEVfSAotI2RlZmluZSBUX0JBU0VfVFlQRV9ICi0KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgInRfdHlwZS5oIgotCi0vKioKLSAqIEEgdGhyaWZ0IGJhc2UgdHlwZSwgd2hpY2ggbXVzdCBiZSBvbmUgb2YgdGhlIGRlZmluZWQgZW51bWVyYXRlZCB0eXBlcyBpbnNpZGUKLSAqIHRoaXMgZGVmaW5pdGlvbi4KLSAqCi0gKi8KLWNsYXNzIHRfYmFzZV90eXBlIDogcHVibGljIHRfdHlwZSB7Ci0gcHVibGljOgotICAvKioKLSAgICogRW51bWVyYXRpb24gb2YgdGhyaWZ0IGJhc2UgdHlwZXMKLSAgICovCi0gIGVudW0gdF9iYXNlIHsKLSAgICBUWVBFX1ZPSUQsCi0gICAgVFlQRV9TVFJJTkcsCi0gICAgVFlQRV9CT09MLAotICAgIFRZUEVfQllURSwKLSAgICBUWVBFX0kxNiwKLSAgICBUWVBFX0kzMiwKLSAgICBUWVBFX0k2NCwKLSAgICBUWVBFX0RPVUJMRQotICB9OwotCi0gIHRfYmFzZV90eXBlKHN0ZDo6c3RyaW5nIG5hbWUsIHRfYmFzZSBiYXNlKSA6Ci0gICAgdF90eXBlKG5hbWUpLAotICAgIGJhc2VfKGJhc2UpLAotICAgIHN0cmluZ19saXN0XyhmYWxzZSksCi0gICAgYmluYXJ5XyhmYWxzZSksCi0gICAgc3RyaW5nX2VudW1fKGZhbHNlKXt9Ci0KLSAgdF9iYXNlIGdldF9iYXNlKCkgY29uc3QgewotICAgIHJldHVybiBiYXNlXzsKLSAgfQotCi0gIGJvb2wgaXNfdm9pZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gYmFzZV8gPT0gVFlQRV9WT0lEOwotICB9Ci0KLSAgYm9vbCBpc19zdHJpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGJhc2VfID09IFRZUEVfU1RSSU5HOwotICB9Ci0KLSAgYm9vbCBpc19ib29sKCkgY29uc3QgewotICAgIHJldHVybiBiYXNlXyA9PSBUWVBFX0JPT0w7Ci0gIH0KLQotICB2b2lkIHNldF9zdHJpbmdfbGlzdChib29sIHZhbCkgewotICAgIHN0cmluZ19saXN0XyA9IHZhbDsKLSAgfQotCi0gIGJvb2wgaXNfc3RyaW5nX2xpc3QoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChiYXNlXyA9PSBUWVBFX1NUUklORykgJiYgc3RyaW5nX2xpc3RfOwotICB9Ci0KLSAgdm9pZCBzZXRfYmluYXJ5KGJvb2wgdmFsKSB7Ci0gICAgYmluYXJ5XyA9IHZhbDsKLSAgfQotCi0gIGJvb2wgaXNfYmluYXJ5KCkgY29uc3QgewotICAgIHJldHVybiAoYmFzZV8gPT0gVFlQRV9TVFJJTkcpICYmIGJpbmFyeV87Ci0gIH0KLQotICB2b2lkIHNldF9zdHJpbmdfZW51bShib29sIHZhbCkgewotICAgIHN0cmluZ19lbnVtXyA9IHZhbDsKLSAgfQotCi0gIGJvb2wgaXNfc3RyaW5nX2VudW0oKSBjb25zdCB7Ci0gICAgcmV0dXJuIGJhc2VfID09IFRZUEVfU1RSSU5HICYmIHN0cmluZ19lbnVtXzsKLSAgfQotCi0gIHZvaWQgYWRkX3N0cmluZ19lbnVtX3ZhbChzdGQ6OnN0cmluZyB2YWwpIHsKLSAgICBzdHJpbmdfZW51bV92YWxzXy5wdXNoX2JhY2sodmFsKTsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZ2V0X3N0cmluZ19lbnVtX3ZhbHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cmluZ19lbnVtX3ZhbHNfOwotICB9Ci0KLSAgYm9vbCBpc19iYXNlX3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpIGNvbnN0IHsKLSAgICBzdGQ6OnN0cmluZyBydiA9IHRfYmFzZV9uYW1lKGJhc2VfKTsKLSAgICBpZiAocnYgPT0gIih1bmtub3duKSIpIHsKLSAgICAgIHRocm93ICJCVUc6IENhbid0IGdldCBmaW5nZXJwcmludCBtYXRlcmlhbCBmb3IgdGhpcyBiYXNlIHR5cGUuIjsKLSAgICB9Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIHRfYmFzZV9uYW1lKHRfYmFzZSB0YmFzZSkgewotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgVFlQRV9WT0lEICAgOiByZXR1cm4gICAgICAidm9pZCI7IGJyZWFrOwotICAgICAgY2FzZSBUWVBFX1NUUklORyA6IHJldHVybiAgICAic3RyaW5nIjsgYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfQk9PTCAgIDogcmV0dXJuICAgICAgImJvb2wiOyBicmVhazsKLSAgICAgIGNhc2UgVFlQRV9CWVRFICAgOiByZXR1cm4gICAgICAiYnl0ZSI7IGJyZWFrOwotICAgICAgY2FzZSBUWVBFX0kxNiAgICA6IHJldHVybiAgICAgICAiaTE2IjsgYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfSTMyICAgIDogcmV0dXJuICAgICAgICJpMzIiOyBicmVhazsKLSAgICAgIGNhc2UgVFlQRV9JNjQgICAgOiByZXR1cm4gICAgICAgImk2NCI7IGJyZWFrOwotICAgICAgY2FzZSBUWVBFX0RPVUJMRSA6IHJldHVybiAgICAiZG91YmxlIjsgYnJlYWs7Ci0gICAgICBkZWZhdWx0ICAgICAgICAgIDogcmV0dXJuICIodW5rbm93bikiOyBicmVhazsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRfYmFzZSBiYXNlXzsKLQotICBib29sIHN0cmluZ19saXN0XzsKLSAgYm9vbCBiaW5hcnlfOwotICBib29sIHN0cmluZ19lbnVtXzsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0cmluZ19lbnVtX3ZhbHNfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfY29uc3QuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb25zdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmQ4MWJkLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb25zdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfQ09OU1RfSAotI2RlZmluZSBUX0NPTlNUX0gKLQotI2luY2x1ZGUgInRfdHlwZS5oIgotI2luY2x1ZGUgInRfY29uc3RfdmFsdWUuaCIKLQotLyoqCi0gKiBBIGNvbnN0IGlzIGEgY29uc3RhbnQgdmFsdWUgZGVmaW5lZCBhY3Jvc3MgbGFuZ3VhZ2VzIHRoYXQgaGFzIGEgdHlwZSBhbmQKLSAqIGEgdmFsdWUuIFRoZSB0cmljayBoZXJlIGlzIHRoYXQgdGhlIGRlY2xhcmVkIHR5cGUgbWlnaHQgbm90IG1hdGNoIHRoZSB0eXBlCi0gKiBvZiB0aGUgdmFsdWUgb2JqZWN0LCBzaW5jZSB0aGF0IGlzIG5vdCBkZXRlcm1pbmVkIHVudGlsIGFmdGVyIHBhcnNpbmcgdGhlCi0gKiB3aG9sZSB0aGluZyBvdXQuCi0gKgotICovCi1jbGFzcyB0X2NvbnN0IDogcHVibGljIHRfZG9jIHsKLSBwdWJsaWM6Ci0gIHRfY29uc3QodF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBuYW1lLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgOgotICAgIHR5cGVfKHR5cGUpLAotICAgIG5hbWVfKG5hbWUpLAotICAgIHZhbHVlXyh2YWx1ZSkge30KLQotICB0X3R5cGUqIGdldF90eXBlKCkgY29uc3QgewotICAgIHJldHVybiB0eXBlXzsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGdldF9uYW1lKCkgY29uc3QgewotICAgIHJldHVybiBuYW1lXzsKLSAgfQotCi0gIHRfY29uc3RfdmFsdWUqIGdldF92YWx1ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdmFsdWVfOwotICB9Ci0KLSBwcml2YXRlOgotICB0X3R5cGUqIHR5cGVfOwotICBzdGQ6OnN0cmluZyBuYW1lXzsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWVfOwotfTsKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb25zdF92YWx1ZS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2NvbnN0X3ZhbHVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNDIyYWUuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2NvbnN0X3ZhbHVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfQ09OU1RfVkFMVUVfSAotI2RlZmluZSBUX0NPTlNUX1ZBTFVFX0gKLQotI2luY2x1ZGUgInRfZW51bS5oIgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0vKioKLSAqIEEgY29uc3QgdmFsdWUgaXMgc29tZXRoaW5nIHBhcnNlZCB0aGF0IGNvdWxkIGJlIGEgbWFwLCBzZXQsIGxpc3QsIHN0cnVjdAotICogb3Igd2hhdGV2ZXIuCi0gKgotICovCi1jbGFzcyB0X2NvbnN0X3ZhbHVlIHsKLSBwdWJsaWM6Ci0KLSAgZW51bSB0X2NvbnN0X3ZhbHVlX3R5cGUgewotICAgIENWX0lOVEVHRVIsCi0gICAgQ1ZfRE9VQkxFLAotICAgIENWX1NUUklORywKLSAgICBDVl9NQVAsCi0gICAgQ1ZfTElTVCwKLSAgICBDVl9JREVOVElGSUVSCi0gIH07Ci0KLSAgdF9jb25zdF92YWx1ZSgpIHt9Ci0KLSAgdF9jb25zdF92YWx1ZShpbnQ2NF90IHZhbCkgewotICAgIHNldF9pbnRlZ2VyKHZhbCk7Ci0gIH0KLQotICB0X2NvbnN0X3ZhbHVlKHN0ZDo6c3RyaW5nIHZhbCkgewotICAgIHNldF9zdHJpbmcodmFsKTsKLSAgfQotCi0gIHZvaWQgc2V0X3N0cmluZyhzdGQ6OnN0cmluZyB2YWwpIHsKLSAgICB2YWxUeXBlXyA9IENWX1NUUklORzsKLSAgICBzdHJpbmdWYWxfID0gdmFsOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X3N0cmluZygpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RyaW5nVmFsXzsKLSAgfQotCi0gIHZvaWQgc2V0X2ludGVnZXIoaW50NjRfdCB2YWwpIHsKLSAgICB2YWxUeXBlXyA9IENWX0lOVEVHRVI7Ci0gICAgaW50VmFsXyA9IHZhbDsKLSAgfQotCi0gIGludDY0X3QgZ2V0X2ludGVnZXIoKSBjb25zdCB7Ci0gICAgaWYgKHZhbFR5cGVfID09IENWX0lERU5USUZJRVIpIHsKLSAgICAgIGlmIChlbnVtXyA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJoYXZlIGlkZW50aWZpZXIgXCIiICsgZ2V0X2lkZW50aWZpZXIoKSArICJcIiwgYnV0IHVuc2V0IGVudW0gb24gbGluZSEiOwotICAgICAgfQotICAgICAgc3RkOjpzdHJpbmcgaWRlbnRpZmllciA9IGdldF9pZGVudGlmaWVyKCk7Ci0gICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGRvdCA9IGlkZW50aWZpZXIucmZpbmQoJy4nKTsKLSAgICAgIGlmIChkb3QgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgaWRlbnRpZmllciA9IGlkZW50aWZpZXIuc3Vic3RyKGRvdCsxKTsKLSAgICAgIH0KLSAgICAgIHRfZW51bV92YWx1ZSogdmFsID0gZW51bV8tPmdldF9jb25zdGFudF9ieV9uYW1lKGlkZW50aWZpZXIpOwotICAgICAgaWYgKHZhbCA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93Ci0gICAgICAgICAgIlVuYWJsZSB0byBmaW5kIGVudW0gdmFsdWUgXCIiICsgaWRlbnRpZmllciArCi0gICAgICAgICAgIlwiIGluIGVudW0gXCIiICsgZW51bV8tPmdldF9uYW1lKCkgKyAiXCIiOwotICAgICAgfQotICAgICAgcmV0dXJuIHZhbC0+Z2V0X3ZhbHVlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBpbnRWYWxfOwotICAgIH0KLSAgfQotCi0gIHZvaWQgc2V0X2RvdWJsZShkb3VibGUgdmFsKSB7Ci0gICAgdmFsVHlwZV8gPSBDVl9ET1VCTEU7Ci0gICAgZG91YmxlVmFsXyA9IHZhbDsKLSAgfQotCi0gIGRvdWJsZSBnZXRfZG91YmxlKCkgY29uc3QgewotICAgIHJldHVybiBkb3VibGVWYWxfOwotICB9Ci0KLSAgdm9pZCBzZXRfbWFwKCkgewotICAgIHZhbFR5cGVfID0gQ1ZfTUFQOwotICB9Ci0KLSAgdm9pZCBhZGRfbWFwKHRfY29uc3RfdmFsdWUqIGtleSwgdF9jb25zdF92YWx1ZSogdmFsKSB7Ci0gICAgbWFwVmFsX1trZXldID0gdmFsOwotICB9Ci0KLSAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgZ2V0X21hcCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbWFwVmFsXzsKLSAgfQotCi0gIHZvaWQgc2V0X2xpc3QoKSB7Ci0gICAgdmFsVHlwZV8gPSBDVl9MSVNUOwotICB9Ci0KLSAgdm9pZCBhZGRfbGlzdCh0X2NvbnN0X3ZhbHVlKiB2YWwpIHsKLSAgICBsaXN0VmFsXy5wdXNoX2JhY2sodmFsKTsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgZ2V0X2xpc3QoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGxpc3RWYWxfOwotICB9Ci0KLSAgdm9pZCBzZXRfaWRlbnRpZmllcihzdGQ6OnN0cmluZyB2YWwpIHsKLSAgICB2YWxUeXBlXyA9IENWX0lERU5USUZJRVI7Ci0gICAgaWRlbnRpZmllclZhbF8gPSB2YWw7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRfaWRlbnRpZmllcigpIGNvbnN0IHsKLSAgICByZXR1cm4gaWRlbnRpZmllclZhbF87Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRfaWRlbnRpZmllcl9uYW1lKCkgY29uc3QgewotICAgIHN0ZDo6c3RyaW5nIHJldCA9IGdldF9pZGVudGlmaWVyKCk7Ci0gICAgc2l6ZV90IHMgPSByZXQuZmluZCgnLicpOwotICAgIGlmIChzID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICB0aHJvdyAiZXJyb3I6IGlkZW50aWZpZXIgIiArIHJldCArICIgaXMgdW5xdWFsaWZpZWQhIjsKLSAgICB9Ci0gICAgcmV0ID0gcmV0LnN1YnN0cihzKzEpOwotICAgIHMgPSByZXQuZmluZCgnLicpOwotICAgIGlmIChzICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICByZXQgPSByZXQuc3Vic3RyKHMrMSk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRfaWRlbnRpZmllcl93aXRoX3BhcmVudCgpIGNvbnN0IHsKLSAgICBzdGQ6OnN0cmluZyByZXQgPSBnZXRfaWRlbnRpZmllcigpOwotICAgIHNpemVfdCBzID0gcmV0LmZpbmQoJy4nKTsKLSAgICBpZiAocyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgdGhyb3cgImVycm9yOiBpZGVudGlmaWVyICIgKyByZXQgKyAiIGlzIHVucXVhbGlmaWVkISI7Ci0gICAgfQotICAgIHNpemVfdCBzMiA9IHJldC5maW5kKCcuJywgcysxKTsKLSAgICBpZiAoczIgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHJldCA9IHJldC5zdWJzdHIocysxKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIHZvaWQgc2V0X2VudW0odF9lbnVtKiB0ZW51bSkgewotICAgIGVudW1fID0gdGVudW07Ci0gIH0KLQotICB0X2NvbnN0X3ZhbHVlX3R5cGUgZ2V0X3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHZhbFR5cGVfOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+IG1hcFZhbF87Ci0gIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiBsaXN0VmFsXzsKLSAgc3RkOjpzdHJpbmcgc3RyaW5nVmFsXzsKLSAgaW50NjRfdCBpbnRWYWxfOwotICBkb3VibGUgZG91YmxlVmFsXzsKLSAgc3RkOjpzdHJpbmcgaWRlbnRpZmllclZhbF87Ci0gIHRfZW51bSogZW51bV87Ci0KLSAgdF9jb25zdF92YWx1ZV90eXBlIHZhbFR5cGVfOwotCi19OwotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2NvbnRhaW5lci5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2NvbnRhaW5lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzUzNDkzLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb250YWluZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0NPTlRBSU5FUl9ICi0jZGVmaW5lIFRfQ09OVEFJTkVSX0gKLQotI2luY2x1ZGUgInRfdHlwZS5oIgotCi1jbGFzcyB0X2NvbnRhaW5lciA6IHB1YmxpYyB0X3R5cGUgewotIHB1YmxpYzoKLSAgdF9jb250YWluZXIoKSA6Ci0gICAgY3BwX25hbWVfKCksCi0gICAgaGFzX2NwcF9uYW1lXyhmYWxzZSkge30KLQotICB2aXJ0dWFsIH50X2NvbnRhaW5lcigpIHt9Ci0KLSAgdm9pZCBzZXRfY3BwX25hbWUoc3RkOjpzdHJpbmcgY3BwX25hbWUpIHsKLSAgICBjcHBfbmFtZV8gPSBjcHBfbmFtZTsKLSAgICBoYXNfY3BwX25hbWVfID0gdHJ1ZTsKLSAgfQotCi0gIGJvb2wgaGFzX2NwcF9uYW1lKCkgewotICAgIHJldHVybiBoYXNfY3BwX25hbWVfOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X2NwcF9uYW1lKCkgewotICAgIHJldHVybiBjcHBfbmFtZV87Ci0gIH0KLQotICBib29sIGlzX2NvbnRhaW5lcigpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgY3BwX25hbWVfOwotICBib29sIGhhc19jcHBfbmFtZV87Ci0KLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2RvYy5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2RvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTIwNjhjLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9kb2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0RPQ19ICi0jZGVmaW5lIFRfRE9DX0gKLQotLyoqCi0gKiBEb2N1bWVudGF0aW9uIHN0dWJzCi0gKgotICovCi1jbGFzcyB0X2RvYyB7Ci0KLSBwdWJsaWM6Ci0gIHRfZG9jKCkgOiBoYXNfZG9jXyhmYWxzZSkge30KLQotICB2b2lkIHNldF9kb2MoY29uc3Qgc3RkOjpzdHJpbmcmIGRvYykgewotICAgIGRvY18gPSBkb2M7Ci0gICAgaGFzX2RvY18gPSB0cnVlOwotICB9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9kb2MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGRvY187Ci0gIH0KLQotICBib29sIGhhc19kb2MoKSB7Ci0gICAgcmV0dXJuIGhhc19kb2NfOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyBkb2NfOwotICBib29sIGhhc19kb2NfOwotCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9lbnVtLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZW51bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWQxNjA2Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9lbnVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9FTlVNX0gKLSNkZWZpbmUgVF9FTlVNX0gKLQotI2luY2x1ZGUgInRfZW51bV92YWx1ZS5oIgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotLyoqCi0gKiBBbiBlbnVtZXJhdGVkIHR5cGUuIEEgbGlzdCBvZiBjb25zdGFudCBvYmplY3RzIHdpdGggYSBuYW1lIGZvciB0aGUgdHlwZS4KLSAqCi0gKi8KLWNsYXNzIHRfZW51bSA6IHB1YmxpYyB0X3R5cGUgewotIHB1YmxpYzoKLSAgdF9lbnVtKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOgotICAgIHRfdHlwZShwcm9ncmFtKSB7fQotCi0gIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgICBuYW1lXyA9IG5hbWU7Ci0gIH0KLQotICB2b2lkIGFwcGVuZCh0X2VudW1fdmFsdWUqIGNvbnN0YW50KSB7Ci0gICAgY29uc3RhbnRzXy5wdXNoX2JhY2soY29uc3RhbnQpOwotICB9Ci0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGdldF9jb25zdGFudHMoKSB7Ci0gICAgcmV0dXJuIGNvbnN0YW50c187Ci0gIH0KLQotICB0X2VudW1fdmFsdWUqIGdldF9jb25zdGFudF9ieV9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWUpIHsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSBnZXRfY29uc3RhbnRzKCk7Ci0gICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKLSAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgIGlmICgoKmNfaXRlciktPmdldF9uYW1lKCkgPT0gbmFtZSkgewotICAgICAgICByZXR1cm4gKmNfaXRlcjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICB0X2VudW1fdmFsdWUqIGdldF9jb25zdGFudF9ieV92YWx1ZShpbnQ2NF90IHZhbHVlKSB7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gZ2V0X2NvbnN0YW50cygpOwotICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7Ci0gICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSA9PSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gKmNfaXRlcjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBib29sIGlzX2VudW0oKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gImVudW0iOwotICB9Ci0KLSAgdm9pZCByZXNvbHZlX3ZhbHVlcygpIHsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSBnZXRfY29uc3RhbnRzKCk7Ci0gICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKLSAgICBpbnQgbGFzdFZhbHVlID0gLTE7Ci0gICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICBpZiAoISAoKmNfaXRlciktPmhhc192YWx1ZSgpKSB7Ci0gICAgICAgICgqY19pdGVyKS0+c2V0X3ZhbHVlKCsrbGFzdFZhbHVlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGxhc3RWYWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHNfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZW51bV92YWx1ZS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2VudW1fdmFsdWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgzYTg3ZS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZW51bV92YWx1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfRU5VTV9WQUxVRV9ICi0jZGVmaW5lIFRfRU5VTV9WQUxVRV9ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAidF9kb2MuaCIKLQotLyoqCi0gKiBBIGNvbnN0YW50LiBUaGVzZSBhcmUgdXNlZCBpbnNpZGUgb2YgZW51bSBkZWZpbml0aW9ucy4gQ29uc3RhbnRzIGFyZSBqdXN0Ci0gKiBzeW1ib2wgaWRlbnRpZmllcnMgdGhhdCBtYXkgb3IgbWF5IG5vdCBoYXZlIGFuIGV4cGxpY2l0IHZhbHVlIGFzc29jaWF0ZWQKLSAqIHdpdGggdGhlbS4KLSAqCi0gKi8KLWNsYXNzIHRfZW51bV92YWx1ZSA6IHB1YmxpYyB0X2RvYyB7Ci0gcHVibGljOgotICB0X2VudW1fdmFsdWUoc3RkOjpzdHJpbmcgbmFtZSkgOgotICAgIG5hbWVfKG5hbWUpLAotICAgIGhhc192YWx1ZV8oZmFsc2UpLAotICAgIHZhbHVlXygwKSB7fQotCi0gIHRfZW51bV92YWx1ZShzdGQ6OnN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIDoKLSAgICBuYW1lXyhuYW1lKSwKLSAgICBoYXNfdmFsdWVfKHRydWUpLAotICAgIHZhbHVlXyh2YWx1ZSkge30KLQotICB+dF9lbnVtX3ZhbHVlKCkge30KLQotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSB7Ci0gICAgcmV0dXJuIG5hbWVfOwotICB9Ci0KLSAgYm9vbCBoYXNfdmFsdWUoKSB7Ci0gICAgcmV0dXJuIGhhc192YWx1ZV87Ci0gIH0KLQotICBpbnQgZ2V0X3ZhbHVlKCkgewotICAgIHJldHVybiB2YWx1ZV87Ci0gIH0KLQotICB2b2lkIHNldF92YWx1ZShpbnQgdmFsKSB7Ci0gICAgaGFzX3ZhbHVlXyA9IHRydWU7Ci0gICAgdmFsdWVfID0gdmFsOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyBuYW1lXzsKLSAgYm9vbCBoYXNfdmFsdWVfOwotICBpbnQgdmFsdWVfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZmllbGQuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9maWVsZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzNjMmIxLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9maWVsZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0ZJRUxEX0gKLSNkZWZpbmUgVF9GSUVMRF9ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgInRfZG9jLmgiCi0KLS8vIEZvcndhcmQgZGVjbGFyZSBmb3IgeHNkX2F0dHJzCi1jbGFzcyB0X3N0cnVjdDsKLQotLyoqCi0gKiBDbGFzcyB0byByZXByZXNlbnQgYSBmaWVsZCBpbiBhIHRocmlmdCBzdHJ1Y3R1cmUuIEEgZmllbGQgaGFzIGEgZGF0YSB0eXBlLAotICogYSBzeW1ib2xpYyBuYW1lLCBhbmQgYSBudW1lcmljIGlkZW50aWZpZXIuCi0gKgotICovCi1jbGFzcyB0X2ZpZWxkIDogcHVibGljIHRfZG9jIHsKLSBwdWJsaWM6Ci0gIHRfZmllbGQodF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBuYW1lKSA6Ci0gICAgdHlwZV8odHlwZSksCi0gICAgbmFtZV8obmFtZSksCi0gICAga2V5XygwKSwKLSAgICB2YWx1ZV8oTlVMTCksCi0gICAgeHNkX29wdGlvbmFsXyhmYWxzZSksCi0gICAgeHNkX25pbGxhYmxlXyhmYWxzZSksCi0gICAgeHNkX2F0dHJzXyhOVUxMKSB7fQotCi0gIHRfZmllbGQodF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBuYW1lLCBpbnQzMl90IGtleSkgOgotICAgIHR5cGVfKHR5cGUpLAotICAgIG5hbWVfKG5hbWUpLAotICAgIGtleV8oa2V5KSwKLSAgICByZXFfKFRfT1BUX0lOX1JFUV9PVVQpLAotICAgIHZhbHVlXyhOVUxMKSwKLSAgICB4c2Rfb3B0aW9uYWxfKGZhbHNlKSwKLSAgICB4c2RfbmlsbGFibGVfKGZhbHNlKSwKLSAgICB4c2RfYXR0cnNfKE5VTEwpIHt9Ci0KLSAgfnRfZmllbGQoKSB7fQotCi0gIHRfdHlwZSogZ2V0X3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHR5cGVfOwotICB9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgewotICAgIHJldHVybiBuYW1lXzsKLSAgfQotCi0gIGludDMyX3QgZ2V0X2tleSgpIGNvbnN0IHsKLSAgICByZXR1cm4ga2V5XzsKLSAgfQotCi0gIGVudW0gZV9yZXEgewotICAgIFRfUkVRVUlSRUQsCi0gICAgVF9PUFRJT05BTCwKLSAgICBUX09QVF9JTl9SRVFfT1VUCi0gIH07Ci0KLSAgdm9pZCBzZXRfcmVxKGVfcmVxIHJlcSkgewotICAgIHJlcV8gPSByZXE7Ci0gIH0KLQotICBlX3JlcSBnZXRfcmVxKCkgY29uc3QgewotICAgIHJldHVybiByZXFfOwotICB9Ci0KLSAgdm9pZCBzZXRfdmFsdWUodF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgICB2YWx1ZV8gPSB2YWx1ZTsKLSAgfQotCi0gIHRfY29uc3RfdmFsdWUqIGdldF92YWx1ZSgpIHsKLSAgICByZXR1cm4gdmFsdWVfOwotICB9Ci0KLSAgdm9pZCBzZXRfeHNkX29wdGlvbmFsKGJvb2wgeHNkX29wdGlvbmFsKSB7Ci0gICAgeHNkX29wdGlvbmFsXyA9IHhzZF9vcHRpb25hbDsKLSAgfQotCi0gIGJvb2wgZ2V0X3hzZF9vcHRpb25hbCgpIGNvbnN0IHsKLSAgICByZXR1cm4geHNkX29wdGlvbmFsXzsKLSAgfQotCi0gIHZvaWQgc2V0X3hzZF9uaWxsYWJsZShib29sIHhzZF9uaWxsYWJsZSkgewotICAgIHhzZF9uaWxsYWJsZV8gPSB4c2RfbmlsbGFibGU7Ci0gIH0KLQotICBib29sIGdldF94c2RfbmlsbGFibGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHhzZF9uaWxsYWJsZV87Ci0gIH0KLQotICB2b2lkIHNldF94c2RfYXR0cnModF9zdHJ1Y3QqIHhzZF9hdHRycykgewotICAgIHhzZF9hdHRyc18gPSB4c2RfYXR0cnM7Ci0gIH0KLQotICB0X3N0cnVjdCogZ2V0X3hzZF9hdHRycygpIHsKLSAgICByZXR1cm4geHNkX2F0dHJzXzsKLSAgfQotCi0gIC8vIFRoaXMgaXMgbm90IHRoZSBzYW1lIGZ1bmN0aW9uIGFzIHRfdHlwZTo6Z2V0X2ZpbmdlcnByaW50X21hdGVyaWFsLAotICAvLyBidXQgaXQgZG9lcyB0aGUgc2FtZSB0aGluZy4KLSAgc3RkOjpzdHJpbmcgZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgY29uc3QgewotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBrZXlzdG07Ci0gICAga2V5c3RtIDw8IGtleV87Ci0gICAgcmV0dXJuIGtleXN0bS5zdHIoKSArICI6IiArCi0gICAgICAoKHJlcV8gPT0gVF9PUFRJT05BTCkgPyAib3B0LSIgOiAiIikgKwotICAgICAgdHlwZV8tPmdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXBhcmF0b3IgdG8gc29ydCBmaWVsZHMgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IGtleS4KLSAgICogTWFrZSB0aGlzIGEgZnVuY3RvciBpbnN0ZWFkIG9mIGEgZnVuY3Rpb24gdG8gaGVscCBHQ0MgaW5saW5lIGl0LgotICAgKiBUaGUgYXJndW1lbnRzIGFyZSAoY29uc3QpIHJlZmVyZW5jZXMgdG8gY29uc3QgcG9pbnRlcnMgdG8gY29uc3QgdF9maWVsZHMuCi0gICAqLwotICBzdHJ1Y3Qga2V5X2NvbXBhcmUgewotICAgIGJvb2wgb3BlcmF0b3IoKSh0X2ZpZWxkIGNvbnN0ICogY29uc3QgJiBhLCB0X2ZpZWxkIGNvbnN0ICogY29uc3QgJiBiKSB7Ci0gICAgICByZXR1cm4gYS0+Z2V0X2tleSgpIDwgYi0+Z2V0X2tleSgpOwotICAgIH0KLSAgfTsKLQotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zXzsKLQotIHByaXZhdGU6Ci0gIHRfdHlwZSogdHlwZV87Ci0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotICBpbnQzMl90IGtleV87Ci0gIGVfcmVxIHJlcV87Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlXzsKLQotICBib29sIHhzZF9vcHRpb25hbF87Ci0gIGJvb2wgeHNkX25pbGxhYmxlXzsKLSAgdF9zdHJ1Y3QqIHhzZF9hdHRyc187Ci0KLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2Z1bmN0aW9uLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZnVuY3Rpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcyYWE2Yy4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZnVuY3Rpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0ZVTkNUSU9OX0gKLSNkZWZpbmUgVF9GVU5DVElPTl9ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAidF90eXBlLmgiCi0jaW5jbHVkZSAidF9zdHJ1Y3QuaCIKLSNpbmNsdWRlICJ0X2RvYy5oIgotCi0vKioKLSAqIFJlcHJlc2VudGF0aW9uIG9mIGEgZnVuY3Rpb24uIEtleSBwYXJ0cyBhcmUgcmV0dXJuIHR5cGUsIGZ1bmN0aW9uIG5hbWUsCi0gKiBvcHRpb25hbCBtb2RpZmllcnMsIGFuZCBhbiBhcmd1bWVudCBsaXN0LCB3aGljaCBpcyBpbXBsZW1lbnRlZCBhcyBhIHRocmlmdAotICogc3RydWN0LgotICoKLSAqLwotY2xhc3MgdF9mdW5jdGlvbiA6IHB1YmxpYyB0X2RvYyB7Ci0gcHVibGljOgotICB0X2Z1bmN0aW9uKHRfdHlwZSogcmV0dXJudHlwZSwKLSAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgIHRfc3RydWN0KiBhcmdsaXN0LAotICAgICAgICAgICAgIGJvb2wgb25ld2F5PWZhbHNlKSA6Ci0gICAgcmV0dXJudHlwZV8ocmV0dXJudHlwZSksCi0gICAgbmFtZV8obmFtZSksCi0gICAgYXJnbGlzdF8oYXJnbGlzdCksCi0gICAgb25ld2F5XyhvbmV3YXkpIHsKLSAgICB4Y2VwdGlvbnNfID0gbmV3IHRfc3RydWN0KE5VTEwpOwotICB9Ci0KLSAgdF9mdW5jdGlvbih0X3R5cGUqIHJldHVybnR5cGUsCi0gICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICB0X3N0cnVjdCogYXJnbGlzdCwKLSAgICAgICAgICAgICB0X3N0cnVjdCogeGNlcHRpb25zLAotICAgICAgICAgICAgIGJvb2wgb25ld2F5PWZhbHNlKSA6Ci0gICAgcmV0dXJudHlwZV8ocmV0dXJudHlwZSksCi0gICAgbmFtZV8obmFtZSksCi0gICAgYXJnbGlzdF8oYXJnbGlzdCksCi0gICAgeGNlcHRpb25zXyh4Y2VwdGlvbnMpLAotICAgIG9uZXdheV8ob25ld2F5KQotICB7Ci0gICAgaWYgKG9uZXdheV8gJiYgIXhjZXB0aW9uc18tPmdldF9tZW1iZXJzKCkuZW1wdHkoKSkgewotICAgICAgdGhyb3cgc3RkOjpzdHJpbmcoIk9uZXdheSBtZXRob2RzIGNhbid0IHRocm93IGV4Y2VwdGlvbnMuIik7Ci0gICAgfQotICB9Ci0KLSAgfnRfZnVuY3Rpb24oKSB7fQotCi0gIHRfdHlwZSogZ2V0X3JldHVybnR5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJldHVybnR5cGVfOwotICB9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgewotICAgIHJldHVybiBuYW1lXzsKLSAgfQotCi0gIHRfc3RydWN0KiBnZXRfYXJnbGlzdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gYXJnbGlzdF87Ci0gIH0KLQotICB0X3N0cnVjdCogZ2V0X3hjZXB0aW9ucygpIGNvbnN0IHsKLSAgICByZXR1cm4geGNlcHRpb25zXzsKLSAgfQotCi0gIGJvb2wgaXNfb25ld2F5KCkgY29uc3QgewotICAgIHJldHVybiBvbmV3YXlfOwotICB9Ci0KLSBwcml2YXRlOgotICB0X3R5cGUqIHJldHVybnR5cGVfOwotICBzdGQ6OnN0cmluZyBuYW1lXzsKLSAgdF9zdHJ1Y3QqIGFyZ2xpc3RfOwotICB0X3N0cnVjdCogeGNlcHRpb25zXzsKLSAgYm9vbCBvbmV3YXlfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfbGlzdC5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2xpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFhOTYyNS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfbGlzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfTElTVF9ICi0jZGVmaW5lIFRfTElTVF9ICi0KLSNpbmNsdWRlICJ0X2NvbnRhaW5lci5oIgotCi0vKioKLSAqIEEgbGlzdCBpcyBhIGxpZ2h0d2VpZ2h0IGNvbnRhaW5lciB0eXBlIHRoYXQganVzdCB3cmFwcyBhbm90aGVyIGRhdGEgdHlwZS4KLSAqCi0gKi8KLWNsYXNzIHRfbGlzdCA6IHB1YmxpYyB0X2NvbnRhaW5lciB7Ci0gcHVibGljOgotICB0X2xpc3QodF90eXBlKiBlbGVtX3R5cGUpIDoKLSAgICBlbGVtX3R5cGVfKGVsZW1fdHlwZSkge30KLQotICB0X3R5cGUqIGdldF9lbGVtX3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGVsZW1fdHlwZV87Ci0gIH0KLQotICBib29sIGlzX2xpc3QoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gImxpc3Q8IiArIGVsZW1fdHlwZV8tPmdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpICsgIj4iOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2ZpbmdlcnByaW50KCkgewotICAgIHRfdHlwZTo6Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgICBlbGVtX3R5cGVfLT5nZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICB9Ci0KLSBwcml2YXRlOgotICB0X3R5cGUqIGVsZW1fdHlwZV87Ci19OwotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X21hcC5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X21hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGUzNThmLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9tYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX01BUF9ICi0jZGVmaW5lIFRfTUFQX0gKLQotI2luY2x1ZGUgInRfY29udGFpbmVyLmgiCi0KLS8qKgotICogQSBtYXAgaXMgYSBsaWdodHdlaWdodCBjb250YWluZXIgdHlwZSB0aGF0IGp1c3Qgd3JhcHMgYW5vdGhlciB0d28gZGF0YQotICogdHlwZXMuCi0gKgotICovCi1jbGFzcyB0X21hcCA6IHB1YmxpYyB0X2NvbnRhaW5lciB7Ci0gcHVibGljOgotICB0X21hcCh0X3R5cGUqIGtleV90eXBlLCB0X3R5cGUqIHZhbF90eXBlKSA6Ci0gICAga2V5X3R5cGVfKGtleV90eXBlKSwKLSAgICB2YWxfdHlwZV8odmFsX3R5cGUpIHt9Ci0KLSAgdF90eXBlKiBnZXRfa2V5X3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGtleV90eXBlXzsKLSAgfQotCi0gIHRfdHlwZSogZ2V0X3ZhbF90eXBlKCkgY29uc3QgewotICAgIHJldHVybiB2YWxfdHlwZV87Ci0gIH0KLQotICBib29sIGlzX21hcCgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgY29uc3QgewotICAgIHJldHVybiAibWFwPCIgKyBrZXlfdHlwZV8tPmdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpICsKLSAgICAgICIsIiArIHZhbF90eXBlXy0+Z2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgKyAiPiI7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZmluZ2VycHJpbnQoKSB7Ci0gICAgdF90eXBlOjpnZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICAgIGtleV90eXBlXy0+Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgICB2YWxfdHlwZV8tPmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRfdHlwZSoga2V5X3R5cGVfOwotICB0X3R5cGUqIHZhbF90eXBlXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Byb2dyYW0uaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9wcm9ncmFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMDVlZWQuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Byb2dyYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9QUk9HUkFNX0gKLSNkZWZpbmUgVF9QUk9HUkFNX0gKLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0vLyBGb3IgcHJvZ3JhbV9uYW1lKCkKLSNpbmNsdWRlICJtYWluLmgiCi0KLSNpbmNsdWRlICJ0X2RvYy5oIgotI2luY2x1ZGUgInRfc2NvcGUuaCIKLSNpbmNsdWRlICJ0X2Jhc2VfdHlwZS5oIgotI2luY2x1ZGUgInRfdHlwZWRlZi5oIgotI2luY2x1ZGUgInRfZW51bS5oIgotI2luY2x1ZGUgInRfY29uc3QuaCIKLSNpbmNsdWRlICJ0X3N0cnVjdC5oIgotI2luY2x1ZGUgInRfc2VydmljZS5oIgotI2luY2x1ZGUgInRfbGlzdC5oIgotI2luY2x1ZGUgInRfbWFwLmgiCi0jaW5jbHVkZSAidF9zZXQuaCIKLSNpbmNsdWRlICJnZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIgotLy8jaW5jbHVkZSAidF9kb2MuaCIKLQotLyoqCi0gKiBUb3AgbGV2ZWwgY2xhc3MgcmVwcmVzZW50aW5nIGFuIGVudGlyZSB0aHJpZnQgcHJvZ3JhbS4gQSBwcm9ncmFtIGNvbnNpc3RzCi0gKiBmdW5kYW1lbnRhbGx5IG9mIHRoZSBmb2xsb3dpbmc6Ci0gKgotICogICBUeXBlZGVmcwotICogICBFbnVtZXJhdGlvbnMKLSAqICAgQ29uc3RhbnRzCi0gKiAgIFN0cnVjdHMKLSAqICAgRXhjZXB0aW9ucwotICogICBTZXJ2aWNlcwotICoKLSAqIFRoZSBwcm9ncmFtIG1vZHVsZSBhbHNvIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgYmFzZSB0eXBlcy4KLSAqCi0gKi8KLWNsYXNzIHRfcHJvZ3JhbSA6IHB1YmxpYyB0X2RvYyB7Ci0gcHVibGljOgotICB0X3Byb2dyYW0oc3RkOjpzdHJpbmcgcGF0aCwgc3RkOjpzdHJpbmcgbmFtZSkgOgotICAgIHBhdGhfKHBhdGgpLAotICAgIG5hbWVfKG5hbWUpLAotICAgIG91dF9wYXRoXygiLi8iKSwKLSAgICBvdXRfcGF0aF9pc19hYnNvbHV0ZV8oZmFsc2UpIHsKLSAgICBzY29wZV8gPSBuZXcgdF9zY29wZSgpOwotICB9Ci0KLSAgdF9wcm9ncmFtKHN0ZDo6c3RyaW5nIHBhdGgpIDoKLSAgICBwYXRoXyhwYXRoKSwKLSAgICBvdXRfcGF0aF8oIi4vIiksCi0gICAgb3V0X3BhdGhfaXNfYWJzb2x1dGVfKGZhbHNlKSB7Ci0gICAgbmFtZV8gPSBwcm9ncmFtX25hbWUocGF0aCk7Ci0gICAgc2NvcGVfID0gbmV3IHRfc2NvcGUoKTsKLSAgfQotCi0gIC8vIFBhdGggYWNjZXNzb3IKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9wYXRoKCkgY29uc3QgeyByZXR1cm4gcGF0aF87IH0KLQotICAvLyBPdXRwdXQgcGF0aCBhY2Nlc3NvcgotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X291dF9wYXRoKCkgY29uc3QgeyByZXR1cm4gb3V0X3BhdGhfOyB9Ci0KLSAgLy8gQ3JlYXRlIGdlbi0qIGRpciBhY2Nlc3NvcgotICBib29sIGlzX291dF9wYXRoX2Fic29sdXRlKCkgeyByZXR1cm4gb3V0X3BhdGhfaXNfYWJzb2x1dGVfOyB9Ci0KLSAgLy8gTmFtZSBhY2Nlc3NvcgotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQotCi0gIC8vIE5hbWVzcGFjZQotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWVzcGFjZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVzcGFjZV87IH0KLQotICAvLyBJbmNsdWRlIHByZWZpeCBhY2Nlc3NvcgotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X2luY2x1ZGVfcHJlZml4KCkgY29uc3QgeyByZXR1cm4gaW5jbHVkZV9wcmVmaXhfOyB9Ci0KLSAgLy8gQWNjZXNzb3JzIGZvciBwcm9ncmFtIGVsZW1lbnRzCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfdHlwZWRlZio+JiBnZXRfdHlwZWRlZnMoKSAgY29uc3QgeyByZXR1cm4gdHlwZWRlZnNfOyAgfQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW0qPiYgICAgZ2V0X2VudW1zKCkgICAgIGNvbnN0IHsgcmV0dXJuIGVudW1zXzsgICAgIH0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdCo+JiAgIGdldF9jb25zdHMoKSAgICBjb25zdCB7IHJldHVybiBjb25zdHNfOyAgICB9Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mICBnZXRfc3RydWN0cygpICAgY29uc3QgeyByZXR1cm4gc3RydWN0c187ICAgfQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiAgZ2V0X3hjZXB0aW9ucygpIGNvbnN0IHsgcmV0dXJuIHhjZXB0aW9uc187IH0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiYgIGdldF9vYmplY3RzKCkgICBjb25zdCB7IHJldHVybiBvYmplY3RzXzsgICB9Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+JiBnZXRfc2VydmljZXMoKSAgY29uc3QgeyByZXR1cm4gc2VydmljZXNfOyAgfQotCi0gIC8vIFByb2dyYW0gZWxlbWVudHMKLSAgdm9pZCBhZGRfdHlwZWRlZiAgKHRfdHlwZWRlZiogdGQpIHsgdHlwZWRlZnNfLnB1c2hfYmFjayh0ZCk7ICB9Ci0gIHZvaWQgYWRkX2VudW0gICAgICh0X2VudW0qICAgIHRlKSB7IGVudW1zXy5wdXNoX2JhY2sodGUpOyAgICAgfQotICB2b2lkIGFkZF9jb25zdCAgICAodF9jb25zdCogICB0YykgeyBjb25zdHNfLnB1c2hfYmFjayh0Yyk7ICAgIH0KLSAgdm9pZCBhZGRfc3RydWN0ICAgKHRfc3RydWN0KiAgdHMpIHsgb2JqZWN0c18ucHVzaF9iYWNrKHRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0c18ucHVzaF9iYWNrKHRzKTsgICB9Ci0gIHZvaWQgYWRkX3hjZXB0aW9uICh0X3N0cnVjdCogIHR4KSB7IG9iamVjdHNfLnB1c2hfYmFjayh0eCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjZXB0aW9uc18ucHVzaF9iYWNrKHR4KTsgfQotICB2b2lkIGFkZF9zZXJ2aWNlICAodF9zZXJ2aWNlKiB0cykgeyBzZXJ2aWNlc18ucHVzaF9iYWNrKHRzKTsgIH0KLQotICAvLyBQcm9ncmFtcyB0byBpbmNsdWRlCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBnZXRfaW5jbHVkZXMoKSBjb25zdCB7IHJldHVybiBpbmNsdWRlc187IH0KLQotICB2b2lkIHNldF9vdXRfcGF0aChzdGQ6OnN0cmluZyBvdXRfcGF0aCwgYm9vbCBvdXRfcGF0aF9pc19hYnNvbHV0ZSkgewotICAgIG91dF9wYXRoXyA9IG91dF9wYXRoOwotICAgIG91dF9wYXRoX2lzX2Fic29sdXRlXyA9IG91dF9wYXRoX2lzX2Fic29sdXRlOwotICAgIC8vIEVuc3VyZSB0aGF0IGl0IGVuZHMgd2l0aCBhIHRyYWlsaW5nICcvJyAob3IgJ1wnIGZvciB3aW5kb3dzIG1hY2hpbmVzKQotICAgIGNoYXIgYyA9IG91dF9wYXRoXy5hdChvdXRfcGF0aF8uc2l6ZSgpIC0gMSk7Ci0gICAgaWYgKCEoYyA9PSAnLycgfHwgYyA9PSAnXFwnKSkgewotICAgICAgb3V0X3BhdGhfLnB1c2hfYmFjaygnLycpOwotICAgIH0KLSAgfQotCi0gIC8vIFNjb3BpbmcgYW5kIG5hbWVzcGFjaW5nCi0gIHZvaWQgc2V0X25hbWVzcGFjZShzdGQ6OnN0cmluZyBuYW1lKSB7Ci0gICAgbmFtZXNwYWNlXyA9IG5hbWU7Ci0gIH0KLQotICAvLyBTY29wZSBhY2Nlc3NvcgotICB0X3Njb3BlKiBzY29wZSgpIHsKLSAgICByZXR1cm4gc2NvcGVfOwotICB9Ci0KLSAgLy8gSW5jbHVkZXMKLQotICB2b2lkIGFkZF9pbmNsdWRlKHN0ZDo6c3RyaW5nIHBhdGgsIHN0ZDo6c3RyaW5nIGluY2x1ZGVfc2l0ZSkgewotICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCk7Ci0KLSAgICAvLyBpbmNsdWRlIHByZWZpeCBmb3IgdGhpcyBwcm9ncmFtIGlzIHRoZSBzaXRlIGF0IHdoaWNoIGl0IHdhcyBpbmNsdWRlZAotICAgIC8vIChtaW51cyB0aGUgZmlsZW5hbWUpCi0gICAgc3RkOjpzdHJpbmcgaW5jbHVkZV9wcmVmaXg7Ci0gICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsYXN0X3NsYXNoID0gc3RkOjpzdHJpbmc6Om5wb3M7Ci0gICAgaWYgKChsYXN0X3NsYXNoID0gaW5jbHVkZV9zaXRlLnJmaW5kKCIvIikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICBpbmNsdWRlX3ByZWZpeCA9IGluY2x1ZGVfc2l0ZS5zdWJzdHIoMCwgbGFzdF9zbGFzaCk7Ci0gICAgfQotCi0gICAgcHJvZ3JhbS0+c2V0X2luY2x1ZGVfcHJlZml4KGluY2x1ZGVfcHJlZml4KTsKLSAgICBpbmNsdWRlc18ucHVzaF9iYWNrKHByb2dyYW0pOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj4mIGdldF9pbmNsdWRlcygpIHsKLSAgICByZXR1cm4gaW5jbHVkZXNfOwotICB9Ci0KLSAgdm9pZCBzZXRfaW5jbHVkZV9wcmVmaXgoc3RkOjpzdHJpbmcgaW5jbHVkZV9wcmVmaXgpIHsKLSAgICBpbmNsdWRlX3ByZWZpeF8gPSBpbmNsdWRlX3ByZWZpeDsKLQotICAgIC8vIHRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgYSBkaXJlY3Rvcnk7IGFkZCBhIHRyYWlsaW5nIHNsYXNoIGlmIG5lY2Vzc2FyeQotICAgIGludCBsZW4gPSBpbmNsdWRlX3ByZWZpeF8uc2l6ZSgpOwotICAgIGlmIChsZW4gPiAwICYmIGluY2x1ZGVfcHJlZml4X1tsZW4gLSAxXSAhPSAnLycpIHsKLSAgICAgIGluY2x1ZGVfcHJlZml4XyArPSAnLyc7Ci0gICAgfQotICB9Ci0KLSAgLy8gTGFuZ3VhZ2UgbmV1dHJhbCBuYW1lc3BhY2UgLyBwYWNrYWdpbmcKLSAgdm9pZCBzZXRfbmFtZXNwYWNlKHN0ZDo6c3RyaW5nIGxhbmd1YWdlLCBzdGQ6OnN0cmluZyBuYW1lX3NwYWNlKSB7Ci0gICAgaWYgKGxhbmd1YWdlICE9ICIqIikgewotICAgICAgc2l6ZV90IHN1Yl9pbmRleCA9IGxhbmd1YWdlLmZpbmQoJy4nKTsKLSAgICAgIHN0ZDo6c3RyaW5nIGJhc2VfbGFuZ3VhZ2UgPSBsYW5ndWFnZS5zdWJzdHIoMCwgc3ViX2luZGV4KTsKLSAgICAgIHN0ZDo6c3RyaW5nIHN1Yl9uYW1lc3BhY2U7Ci0KLSAgICAgIGlmKGJhc2VfbGFuZ3VhZ2UgPT0gInNtYWxsdGFsayIpIHsKLSAgICAgICAgcHdhcm5pbmcoMSwgIk5hbWVzcGFjZSAnc21hbGx0YWxrJyBpcyBkZXByZWNhdGVkLiBVc2UgJ3N0JyBpbnN0ZWFkIik7Ci0gICAgICAgIGJhc2VfbGFuZ3VhZ2UgPSAic3QiOwotICAgICAgfQotCi0gICAgICB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90IG15X2NvcHkgPSB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcl9tYXAoKTsKLQotICAgICAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdDo6aXRlcmF0b3IgaXQ7Ci0gICAgICBpdD1teV9jb3B5LmZpbmQoYmFzZV9sYW5ndWFnZSk7Ci0KLSAgICAgIGlmIChpdCA9PSBteV9jb3B5LmVuZCgpKSB7Ci0gICAgICAgIHRocm93ICJObyBnZW5lcmF0b3IgbmFtZWQgJyIgKyBiYXNlX2xhbmd1YWdlICsgIicgY291bGQgYmUgZm91bmQhIjsKLSAgICAgIH0KLQotICAgICAgaWYgKHN1Yl9pbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgICBzdGQ6OnN0cmluZyBzdWJfbmFtZXNwYWNlID0gbGFuZ3VhZ2Uuc3Vic3RyKHN1Yl9pbmRleCsxKTsKLSAgICAgICAgaWYoISBpdC0+c2Vjb25kLT5pc192YWxpZF9uYW1lc3BhY2Uoc3ViX25hbWVzcGFjZSkpIHsKLSAgICAgICAgICB0aHJvdyBiYXNlX2xhbmd1YWdlICsiIGdlbmVyYXRvciBkb2VzIG5vdCBhY2NlcHQgJyIgKyBzdWJfbmFtZXNwYWNlICsgIicgYXMgc3ViLW5hbWVzcGFjZSEiOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgbmFtZXNwYWNlc19bbGFuZ3VhZ2VdID0gbmFtZV9zcGFjZTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGdldF9uYW1lc3BhY2Uoc3RkOjpzdHJpbmcgbGFuZ3VhZ2UpIGNvbnN0IHsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotICAgIGlmICgoaXRlciA9IG5hbWVzcGFjZXNfLmZpbmQobGFuZ3VhZ2UpKSAhPSBuYW1lc3BhY2VzXy5lbmQoKSB8fAotICAgICAgICAoaXRlciA9IG5hbWVzcGFjZXNfLmZpbmQoIioiICAgICApKSAhPSBuYW1lc3BhY2VzXy5lbmQoKSkgewotICAgICAgcmV0dXJuIGl0ZXItPnNlY29uZDsKLSAgICB9Ci0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7Ci0gIH0KLQotICAvLyBMYW5ndWFnZSBzcGVjaWZpYyBuYW1lc3BhY2UgLyBwYWNrYWdpbmcKLQotICB2b2lkIGFkZF9jcHBfaW5jbHVkZShzdGQ6OnN0cmluZyBwYXRoKSB7Ci0gICAgY3BwX2luY2x1ZGVzXy5wdXNoX2JhY2socGF0aCk7Ci0gIH0KLQotICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGdldF9jcHBfaW5jbHVkZXMoKSB7Ci0gICAgcmV0dXJuIGNwcF9pbmNsdWRlc187Ci0gIH0KLQotICB2b2lkIGFkZF9jX2luY2x1ZGUoc3RkOjpzdHJpbmcgcGF0aCkgewotICAgIGNfaW5jbHVkZXNfLnB1c2hfYmFjayhwYXRoKTsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZ2V0X2NfaW5jbHVkZXMoKSB7Ci0gICAgcmV0dXJuIGNfaW5jbHVkZXNfOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIC8vIEZpbGUgcGF0aAotICBzdGQ6OnN0cmluZyBwYXRoXzsKLQotICAvLyBOYW1lCi0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotCi0gIC8vIE91dHB1dCBkaXJlY3RvcnkKLSAgc3RkOjpzdHJpbmcgb3V0X3BhdGhfOwotCi0gIC8vIE91dHB1dCBkaXJlY3RvcnkgaXMgYWJzb2x1dGUgbG9jYXRpb24gZm9yIGdlbmVyYXRlZCBzb3VyY2UgKG5vIGdlbi0qKQotICBib29sIG91dF9wYXRoX2lzX2Fic29sdXRlXzsKLQotICAvLyBOYW1lc3BhY2UKLSAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlXzsKLQotICAvLyBJbmNsdWRlZCBwcm9ncmFtcwotICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiBpbmNsdWRlc187Ci0KLSAgLy8gSW5jbHVkZSBwcmVmaXggZm9yIHRoaXMgcHJvZ3JhbSwgaWYgYW55Ci0gIHN0ZDo6c3RyaW5nIGluY2x1ZGVfcHJlZml4XzsKLQotICAvLyBJZGVudGlmaWVyIGxvb2t1cCBzY29wZQotICB0X3Njb3BlKiBzY29wZV87Ci0KLSAgLy8gQ29tcG9uZW50cyB0byBnZW5lcmF0ZSBjb2RlIGZvcgotICBzdGQ6OnZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmc187Ci0gIHN0ZDo6dmVjdG9yPHRfZW51bSo+ICAgIGVudW1zXzsKLSAgc3RkOjp2ZWN0b3I8dF9jb25zdCo+ICAgY29uc3RzXzsKLSAgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiAgb2JqZWN0c187Ci0gIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4gIHN0cnVjdHNfOwotICBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+ICB4Y2VwdGlvbnNfOwotICBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlc187Ci0KLSAgLy8gRHluYW1pYyBuYW1lc3BhY2VzCi0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbmFtZXNwYWNlc187Ci0KLSAgLy8gQysrIGV4dHJhIGluY2x1ZGVzCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjcHBfaW5jbHVkZXNfOwotCi0gIC8vIEMgZXh0cmEgaW5jbHVkZXMKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNfaW5jbHVkZXNfOwotCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zY29wZS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Njb3BlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MTdiZjguLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Njb3BlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfU0NPUEVfSAotI2RlZmluZSBUX1NDT1BFX0gKLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgInRfdHlwZS5oIgotI2luY2x1ZGUgInRfc2VydmljZS5oIgotI2luY2x1ZGUgInRfY29uc3QuaCIKLSNpbmNsdWRlICJ0X2NvbnN0X3ZhbHVlLmgiCi0jaW5jbHVkZSAidF9iYXNlX3R5cGUuaCIKLSNpbmNsdWRlICJ0X21hcC5oIgotI2luY2x1ZGUgInRfbGlzdC5oIgotCi0vKioKLSAqIFRoaXMgcmVwcmVzZW50cyBhIHZhcmlhYmxlIHNjb3BlIHVzZWQgZm9yIGxvb2tpbmcgdXAgcHJlZGVmaW5lZCB0eXBlcyBhbmQKLSAqIHNlcnZpY2VzLiBUeXBpY2FsbHksIGEgc2NvcGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgdF9wcm9ncmFtLiBTY29wZXMgYXJlIG5vdAotICogdXNlZCB0byBkZXRlcm1pbmUgY29kZSBnZW5lcmF0aW9uLCBidXQgcmF0aGVyIHRvIHJlc29sdmUgaWRlbnRpZmllcnMgYXQKLSAqIHBhcnNlIHRpbWUuCi0gKgotICovCi1jbGFzcyB0X3Njb3BlIHsKLSBwdWJsaWM6Ci0gIHRfc2NvcGUoKSB7fQotCi0gIHZvaWQgYWRkX3R5cGUoc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlKSB7Ci0gICAgdHlwZXNfW25hbWVdID0gdHlwZTsKLSAgfQotCi0gIHRfdHlwZSogZ2V0X3R5cGUoc3RkOjpzdHJpbmcgbmFtZSkgewotICAgIHJldHVybiB0eXBlc19bbmFtZV07Ci0gIH0KLQotICB2b2lkIGFkZF9zZXJ2aWNlKHN0ZDo6c3RyaW5nIG5hbWUsIHRfc2VydmljZSogc2VydmljZSkgewotICAgIHNlcnZpY2VzX1tuYW1lXSA9IHNlcnZpY2U7Ci0gIH0KLQotICB0X3NlcnZpY2UqIGdldF9zZXJ2aWNlKHN0ZDo6c3RyaW5nIG5hbWUpIHsKLSAgICByZXR1cm4gc2VydmljZXNfW25hbWVdOwotICB9Ci0KLSAgdm9pZCBhZGRfY29uc3RhbnQoc3RkOjpzdHJpbmcgbmFtZSwgdF9jb25zdCogY29uc3RhbnQpIHsKLSAgICBpZiAoY29uc3RhbnRzXy5maW5kKG5hbWUpICE9IGNvbnN0YW50c18uZW5kKCkpIHsKLSAgICAgIHRocm93ICJFbnVtICIgKyBuYW1lICsgIiBpcyBhbHJlYWR5IGRlZmluZWQhIjsKLSAgICB9IGVsc2UgewotICAgICAgY29uc3RhbnRzX1tuYW1lXSA9IGNvbnN0YW50OwotICAgIH0KLQkJICAgCi0gIH0KLQotICB0X2NvbnN0KiBnZXRfY29uc3RhbnQoc3RkOjpzdHJpbmcgbmFtZSkgewotICAgIHJldHVybiBjb25zdGFudHNfW25hbWVdOwotICB9Ci0KLSAgdm9pZCBwcmludCgpIHsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF90eXBlKj46Oml0ZXJhdG9yIGl0ZXI7Ci0gICAgZm9yIChpdGVyID0gdHlwZXNfLmJlZ2luKCk7IGl0ZXIgIT0gdHlwZXNfLmVuZCgpOyArK2l0ZXIpIHsKLSAgICAgIHByaW50ZigiJXMgPT4gJXNcbiIsCi0gICAgICAgICAgICAgaXRlci0+Zmlyc3QuY19zdHIoKSwKLSAgICAgICAgICAgICBpdGVyLT5zZWNvbmQtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCByZXNvbHZlX2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbCwgdF90eXBlKiB0dHlwZSkgewotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIG1hcCA9IGNvbnN0X3ZhbC0+Z2V0X21hcCgpOwotICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgICAgZm9yICh2X2l0ZXIgPSBtYXAuYmVnaW4oKTsgdl9pdGVyICE9IG1hcC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSh2X2l0ZXItPmZpcnN0LCAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKLSAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSh2X2l0ZXItPnNlY29uZCwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpIHx8IHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSBjb25zdF92YWwtPmdldF9saXN0KCk7Ci0gICAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgIHJlc29sdmVfY29uc3RfdmFsdWUoKCp2X2l0ZXIpLCAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgICB0X3N0cnVjdCogdHN0cnVjdCA9ICh0X3N0cnVjdCopdHR5cGU7Ci0gICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiBtYXAgPSBjb25zdF92YWwtPmdldF9tYXAoKTsKLSAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICAgIGZvciAodl9pdGVyID0gbWFwLmJlZ2luKCk7IHZfaXRlciAhPSBtYXAuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgIHRfZmllbGQqIGZpZWxkID0gdHN0cnVjdC0+Z2V0X2ZpZWxkX2J5X25hbWUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKTsKLSAgICAgICAgaWYgKGZpZWxkID09IE5VTEwpIHsKLSAgICAgICAgICB0aHJvdyAiTm8gZmllbGQgbmFtZWQgXCIiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpICsgIlwiIHdhcyBmb3VuZCBpbiBzdHJ1Y3Qgb2YgdHlwZSBcIiIgKyB0c3RydWN0LT5nZXRfbmFtZSgpICsgIlwiIjsKLSAgICAgICAgfQotICAgICAgICByZXNvbHZlX2NvbnN0X3ZhbHVlKHZfaXRlci0+c2Vjb25kLCBmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChjb25zdF92YWwtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUikgewotICAgICAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgICAgY29uc3RfdmFsLT5zZXRfZW51bSgodF9lbnVtKil0dHlwZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0X2NvbnN0KiBjb25zdGFudCA9IGdldF9jb25zdGFudChjb25zdF92YWwtPmdldF9pZGVudGlmaWVyKCkpOwotICAgICAgICBpZiAoY29uc3RhbnQgPT0gTlVMTCkgewotICAgICAgICAgIHRocm93ICJObyBlbnVtIHZhbHVlIG9yIGNvbnN0YW50IGZvdW5kIG5hbWVkIFwiIiArIGNvbnN0X3ZhbC0+Z2V0X2lkZW50aWZpZXIoKSArICJcIiEiOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVzb2x2ZSB0eXBlZGVmcyB0byB0aGUgdW5kZXJseWluZyB0eXBlCi0gICAgICAgIHRfdHlwZSogY29uc3RfdHlwZSA9IGNvbnN0YW50LT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7Ci0KLSAgICAgICAgaWYgKGNvbnN0X3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKiljb25zdF90eXBlKS0+Z2V0X2Jhc2UoKSkgewotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgICAgICBjb25zdF92YWwtPnNldF9pbnRlZ2VyKGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X2ludGVnZXIoKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X3N0cmluZyhjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2RvdWJsZShjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9kb3VibGUoKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgICAgICB0aHJvdyAiQ29uc3RhbnRzIGNhbm5vdCBiZSBvZiB0eXBlIFZPSUQiOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjb25zdF90eXBlLT5pc19tYXAoKSkgewotICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIG1hcCA9IGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X21hcCgpOwotICAgICAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLQotICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X21hcCgpOwotICAgICAgICAgIGZvciAodl9pdGVyID0gbWFwLmJlZ2luKCk7IHZfaXRlciAhPSBtYXAuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgICAgICBjb25zdF92YWwtPmFkZF9tYXAodl9pdGVyLT5maXJzdCwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjb25zdF90eXBlLT5pc19saXN0KCkpIHsKLSAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X2xpc3QoKTsKLSAgICAgICAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLQotICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2xpc3QoKTsKLSAgICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgICAgICAgY29uc3RfdmFsLT5hZGRfbGlzdCgqdl9pdGVyKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIC8vIGVudW0gY29uc3RhbnQgd2l0aCBub24taWRlbnRpZmllciB2YWx1ZS4gc2V0IHRoZSBlbnVtIGFuZCBmaW5kIHRoZQotICAgICAgLy8gdmFsdWUncyBuYW1lLgotICAgICAgdF9lbnVtKiB0ZW51bSA9ICh0X2VudW0qKXR0eXBlOwotICAgICAgdF9lbnVtX3ZhbHVlKiBlbnVtX3ZhbHVlID0gdGVudW0tPmdldF9jb25zdGFudF9ieV92YWx1ZShjb25zdF92YWwtPmdldF9pbnRlZ2VyKCkpOwotICAgICAgaWYgKGVudW1fdmFsdWUgPT0gTlVMTCkgewotICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gdmFsc3RtOwotICAgICAgICB2YWxzdG0gPDwgY29uc3RfdmFsLT5nZXRfaW50ZWdlcigpOwotICAgICAgICB0aHJvdyAiQ291bGRuJ3QgZmluZCBhIG5hbWVkIHZhbHVlIGluIGVudW0gIiArIHRlbnVtLT5nZXRfbmFtZSgpICsgIiBmb3IgdmFsdWUgIiArIHZhbHN0bS5zdHIoKTsKLSAgICAgIH0KLSAgICAgIGNvbnN0X3ZhbC0+c2V0X2lkZW50aWZpZXIodGVudW0tPmdldF9uYW1lKCkgKyAiLiIgKyBlbnVtX3ZhbHVlLT5nZXRfbmFtZSgpKTsKLSAgICAgIGNvbnN0X3ZhbC0+c2V0X2VudW0odGVudW0pOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLQotICAvLyBNYXAgb2YgbmFtZXMgdG8gdHlwZXMKLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfdHlwZSo+IHR5cGVzXzsKLQotICAvLyBNYXAgb2YgbmFtZXMgdG8gY29uc3RhbnRzCi0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2NvbnN0Kj4gY29uc3RhbnRzXzsKLQotICAvLyBNYXAgb2YgbmFtZXMgdG8gc2VydmljZXMKLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfc2VydmljZSo+IHNlcnZpY2VzXzsKLQotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc2VydmljZS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3NlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFlNjkyNC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfU0VSVklDRV9ICi0jZGVmaW5lIFRfU0VSVklDRV9ICi0KLSNpbmNsdWRlICJ0X2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSA8dmVjdG9yPgotCi1jbGFzcyB0X3Byb2dyYW07Ci0KLS8qKgotICogQSBzZXJ2aWNlIGNvbnNpc3RzIG9mIGEgc2V0IG9mIGZ1bmN0aW9ucy4KLSAqCi0gKi8KLWNsYXNzIHRfc2VydmljZSA6IHB1YmxpYyB0X3R5cGUgewotIHB1YmxpYzoKLSAgdF9zZXJ2aWNlKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOgotICAgIHRfdHlwZShwcm9ncmFtKSwKLSAgICBleHRlbmRzXyhOVUxMKSB7fQotCi0gIGJvb2wgaXNfc2VydmljZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZvaWQgc2V0X2V4dGVuZHModF9zZXJ2aWNlKiBleHRlbmRzKSB7Ci0gICAgZXh0ZW5kc18gPSBleHRlbmRzOwotICB9Ci0KLSAgdm9pZCBhZGRfZnVuY3Rpb24odF9mdW5jdGlvbiogZnVuYykgewotICAgIHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgICBmb3IgKGl0ZXIgPSBmdW5jdGlvbnNfLmJlZ2luKCk7IGl0ZXIgIT0gZnVuY3Rpb25zXy5lbmQoKTsgaXRlcisrKSB7Ci0gICAgICBpZiAoZnVuYy0+Z2V0X25hbWUoKSA9PSAoKml0ZXIpLT5nZXRfbmFtZSgpKSB7Ci0gICAgICAgIHRocm93ICJGdW5jdGlvbiAiICsgZnVuYy0+Z2V0X25hbWUoKSArICIgaXMgYWxyZWFkeSBkZWZpbmVkIjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZnVuY3Rpb25zXy5wdXNoX2JhY2soZnVuYyk7Ci0gIH0KLQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4mIGdldF9mdW5jdGlvbnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZ1bmN0aW9uc187Ci0gIH0KLQotICB0X3NlcnZpY2UqIGdldF9leHRlbmRzKCkgewotICAgIHJldHVybiBleHRlbmRzXzsKLSAgfQotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgY29uc3QgewotICAgIC8vIFNlcnZpY2VzIHNob3VsZCBuZXZlciBiZSB1c2VkIGluIGZpbmdlcnByaW50cy4KLSAgICB0aHJvdyAiQlVHOiBDYW4ndCBnZXQgZmluZ2VycHJpbnQgbWF0ZXJpYWwgZm9yIHNlcnZpY2UuIjsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9uc187Ci0gIHRfc2VydmljZSogZXh0ZW5kc187Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zZXQuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE5ODM1Ny4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9TRVRfSAotI2RlZmluZSBUX1NFVF9ICi0KLSNpbmNsdWRlICJ0X2NvbnRhaW5lci5oIgotCi0vKioKLSAqIEEgc2V0IGlzIGEgbGlnaHR3ZWlnaHQgY29udGFpbmVyIHR5cGUgdGhhdCBqdXN0IHdyYXBzIGFub3RoZXIgZGF0YSB0eXBlLgotICoKLSAqLwotY2xhc3MgdF9zZXQgOiBwdWJsaWMgdF9jb250YWluZXIgewotIHB1YmxpYzoKLSAgdF9zZXQodF90eXBlKiBlbGVtX3R5cGUpIDoKLSAgICBlbGVtX3R5cGVfKGVsZW1fdHlwZSkge30KLQotICB0X3R5cGUqIGdldF9lbGVtX3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGVsZW1fdHlwZV87Ci0gIH0KLQotICBib29sIGlzX3NldCgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgY29uc3QgewotICAgIHJldHVybiAic2V0PCIgKyBlbGVtX3R5cGVfLT5nZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSArICI+IjsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9maW5nZXJwcmludCgpIHsKLSAgICB0X3R5cGU6OmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gICAgZWxlbV90eXBlXy0+Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdF90eXBlKiBlbGVtX3R5cGVfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc3RydWN0LmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc3RydWN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZWUxMTIuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3N0cnVjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX1NUUlVDVF9ICi0jZGVmaW5lIFRfU1RSVUNUX0gKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJ0X3R5cGUuaCIKLSNpbmNsdWRlICJ0X2ZpZWxkLmgiCi0KLS8vIEZvcndhcmQgZGVjbGFyZSB0aGF0IHB1cHB5Ci1jbGFzcyB0X3Byb2dyYW07Ci0KLS8qKgotICogQSBzdHJ1Y3QgaXMgYSBjb250YWluZXIgZm9yIGEgc2V0IG9mIG1lbWJlciBmaWVsZHMgdGhhdCBoYXMgYSBuYW1lLiBTdHJ1Y3RzCi0gKiBhcmUgYWxzbyB1c2VkIHRvIGltcGxlbWVudCBleGNlcHRpb24gdHlwZXMuCi0gKgotICovCi1jbGFzcyB0X3N0cnVjdCA6IHB1YmxpYyB0X3R5cGUgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVyc190eXBlOwotCi0gIHRfc3RydWN0KHRfcHJvZ3JhbSogcHJvZ3JhbSkgOgotICAgIHRfdHlwZShwcm9ncmFtKSwKLSAgICBpc194Y2VwdGlvbl8oZmFsc2UpLAotICAgIHhzZF9hbGxfKGZhbHNlKSB7fQotCi0gIHRfc3RydWN0KHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIDoKLSAgICB0X3R5cGUocHJvZ3JhbSwgbmFtZSksCi0gICAgaXNfeGNlcHRpb25fKGZhbHNlKSwKLSAgICB4c2RfYWxsXyhmYWxzZSkge30KLQotICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gICAgbmFtZV8gPSBuYW1lOwotICB9Ci0KLSAgdm9pZCBzZXRfeGNlcHRpb24oYm9vbCBpc194Y2VwdGlvbikgewotICAgIGlzX3hjZXB0aW9uXyA9IGlzX3hjZXB0aW9uOwotICB9Ci0KLSAgdm9pZCBzZXRfdW5pb24oYm9vbCBpc191bmlvbikgewotICAgIGlzX3VuaW9uXyA9IGlzX3VuaW9uOwotICB9Ci0KLSAgdm9pZCBzZXRfeHNkX2FsbChib29sIHhzZF9hbGwpIHsKLSAgICB4c2RfYWxsXyA9IHhzZF9hbGw7Ci0gIH0KLQotICBib29sIGdldF94c2RfYWxsKCkgY29uc3QgewotICAgIHJldHVybiB4c2RfYWxsXzsKLSAgfQotCi0gIGJvb2wgYXBwZW5kKHRfZmllbGQqIGVsZW0pIHsKLSAgICBtZW1iZXJzXy5wdXNoX2JhY2soZWxlbSk7Ci0KLSAgICB0eXBlZGVmIG1lbWJlcnNfdHlwZTo6aXRlcmF0b3IgaXRlcl90eXBlOwotICAgIHN0ZDo6cGFpcjxpdGVyX3R5cGUsIGl0ZXJfdHlwZT4gYm91bmRzID0gc3RkOjplcXVhbF9yYW5nZSgKLSAgICAgICAgICAgIG1lbWJlcnNfaW5faWRfb3JkZXJfLmJlZ2luKCksIG1lbWJlcnNfaW5faWRfb3JkZXJfLmVuZCgpLCBlbGVtLCB0X2ZpZWxkOjprZXlfY29tcGFyZSgpCi0gICAgICAgICk7Ci0gICAgaWYgKGJvdW5kcy5maXJzdCAhPSBib3VuZHMuc2Vjb25kKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIG1lbWJlcnNfaW5faWRfb3JkZXJfLmluc2VydChib3VuZHMuc2Vjb25kLCBlbGVtKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGNvbnN0IG1lbWJlcnNfdHlwZSYgZ2V0X21lbWJlcnMoKSB7Ci0gICAgcmV0dXJuIG1lbWJlcnNfOwotICB9Ci0KLSAgY29uc3QgbWVtYmVyc190eXBlJiBnZXRfc29ydGVkX21lbWJlcnMoKSB7Ci0gICAgcmV0dXJuIG1lbWJlcnNfaW5faWRfb3JkZXJfOwotICB9Ci0KLSAgYm9vbCBpc19zdHJ1Y3QoKSBjb25zdCB7Ci0gICAgcmV0dXJuICFpc194Y2VwdGlvbl87Ci0gIH0KLQotICBib29sIGlzX3hjZXB0aW9uKCkgY29uc3QgewotICAgIHJldHVybiBpc194Y2VwdGlvbl87Ci0gIH0KLSAgCi0gIGJvb2wgaXNfdW5pb24oKSBjb25zdCB7Ci0gICAgcmV0dXJuIGlzX3VuaW9uXzsKLSAgfQotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgY29uc3QgewotICAgIHN0ZDo6c3RyaW5nIHJ2ID0gInsiOwotICAgIG1lbWJlcnNfdHlwZTo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVyc19pbl9pZF9vcmRlcl8uYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmVuZCgpOyArK21faXRlcikgewotICAgICAgcnYgKz0gKCptX2l0ZXIpLT5nZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKTsKLSAgICAgIHJ2ICs9ICI7IjsKLSAgICB9Ci0gICAgcnYgKz0gIn0iOwotICAgIHJldHVybiBydjsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9maW5nZXJwcmludCgpIHsKLSAgICB0X3R5cGU6OmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gICAgbWVtYmVyc190eXBlOjpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzX2luX2lkX29yZGVyXy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVyc19pbl9pZF9vcmRlcl8uZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAoKm1faXRlciktPmdldF90eXBlKCktPmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gICAgfQotICB9Ci0KLSAgdF9maWVsZCogZ2V0X2ZpZWxkX2J5X25hbWUoc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgewotICAgIG1lbWJlcnNfdHlwZTo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVyc19pbl9pZF9vcmRlcl8uYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSA9PSBmaWVsZF9uYW1lKSB7Ci0gICAgICAgIHJldHVybiAqbV9pdGVyOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gcHJpdmF0ZToKLQotICBtZW1iZXJzX3R5cGUgbWVtYmVyc187Ci0gIG1lbWJlcnNfdHlwZSBtZW1iZXJzX2luX2lkX29yZGVyXzsKLSAgYm9vbCBpc194Y2VwdGlvbl87Ci0gIGJvb2wgaXNfdW5pb25fOwotCi0gIGJvb2wgeHNkX2FsbF87Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF90eXBlLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfdHlwZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDI0Mjc5Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF90eXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfVFlQRV9ICi0jZGVmaW5lIFRfVFlQRV9ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSAidF9kb2MuaCIKLQotY2xhc3MgdF9wcm9ncmFtOwotCi0vKioKLSAqIEdlbmVyaWMgcmVwcmVzZW50YXRpb24gb2YgYSB0aHJpZnQgdHlwZS4gVGhlc2Ugb2JqZWN0cyBhcmUgdXNlZCBieSB0aGUKLSAqIHBhcnNlciBtb2R1bGUgdG8gYnVpbGQgdXAgYSB0cmVlIG9mIG9iamVjdCB0aGF0IGFyZSBhbGwgZXhwbGljaXRseSB0eXBlZC4KLSAqIFRoZSBnZW5lcmljIHRfdHlwZSBjbGFzcyBleHBvcnRzIGEgdmFyaWV0eSBvZiB1c2VmdWwgbWV0aG9kcyB0aGF0IGFyZQotICogdXNlZCBieSB0aGUgY29kZSBnZW5lcmF0b3IgdG8gYnJhbmNoIGJhc2VkIHVwb24gZGlmZmVyZW50IGhhbmRsaW5nIGZvciB0aGUKLSAqIHZhcmlvdXMgdHlwZXMuCi0gKgotICovCi1jbGFzcyB0X3R5cGUgOiBwdWJsaWMgdF9kb2MgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+dF90eXBlKCkge30KLQotICB2aXJ0dWFsIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgICBuYW1lXyA9IG5hbWU7Ci0gIH0KLQotICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbmFtZV87Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgaXNfdm9pZCgpICAgICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX2Jhc2VfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19zdHJpbmcoKSAgICBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfYm9vbCgpICAgICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX3R5cGVkZWYoKSAgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19lbnVtKCkgICAgICBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfc3RydWN0KCkgICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX3hjZXB0aW9uKCkgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19jb250YWluZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfbGlzdCgpICAgICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX3NldCgpICAgICAgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19tYXAoKSAgICAgICBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfc2VydmljZSgpICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICB0X3Byb2dyYW0qIGdldF9wcm9ncmFtKCkgewotICAgIHJldHVybiBwcm9ncmFtXzsKLSAgfQotCi0gIHRfdHlwZSogZ2V0X3RydWVfdHlwZSgpOwotCi0gIC8vIFJldHVybiBhIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyB0eXBlCi0gIC8vIGZyb20gYW55IG90aGVyIHRocmlmdCB0eXBlIGluIHRoZSB3b3JsZCwgYXMgZmFyIGFzCi0gIC8vIFREZW5zZVByb3RvY29sIGlzIGNvbmNlcm5lZC4KLSAgLy8gV2UgZG9uJ3QgY2FjaGUgdGhpcywgd2hpY2ggaXMgYSBsaXR0bGUgc2xvcHB5LAotICAvLyBidXQgdGhlIGNvbXBpbGVyIGlzIHNvIGZhc3QgdGhhdCBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXIuCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgY29uc3QgPSAwOwotCi0gIC8vIEZpbmdlcnByaW50IHNob3VsZCBjaGFuZ2Ugd2hlbmV2ZXIgKGFuZCBvbmx5IHdoZW4pCi0gIC8vIHRoZSBlbmNvZGluZyB2aWEgVERlbnNlUHJvdG9jb2wgY2hhbmdlcy4KLSAgc3RhdGljIGNvbnN0IGludCBmaW5nZXJwcmludF9sZW4gPSAxNjsKLQotICAvLyBDYWxsIHRoaXMgYmVmb3JlIHRyeWluZyBnZXRfKl9maW5nZXJwcmludCgpLgotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLQotICBib29sIGhhc19maW5nZXJwcmludCgpIGNvbnN0IHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbmdlcnByaW50X2xlbjsgaSsrKSB7Ci0gICAgICBpZiAoZmluZ2VycHJpbnRfW2ldICE9IDApIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGNvbnN0IHVpbnQ4X3QqIGdldF9iaW5hcnlfZmluZ2VycHJpbnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZpbmdlcnByaW50XzsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGdldF9hc2NpaV9maW5nZXJwcmludCgpIGNvbnN0IHsKLSAgICBzdGQ6OnN0cmluZyBydjsKLSAgICBjb25zdCB1aW50OF90KiBmcCA9IGdldF9iaW5hcnlfZmluZ2VycHJpbnQoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbmdlcnByaW50X2xlbjsgaSsrKSB7Ci0gICAgICBydiArPSBieXRlX3RvX2hleChmcFtpXSk7Ci0gICAgfQotICAgIHJldHVybiBydjsKLSAgfQotCi0gIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBicmVhayAobWF5YmUgYmFkbHkpIHVubGVzcyAwIDw9IG51bSA8PSAxNi4KLSAgc3RhdGljIGNoYXIgbnliYmxlX3RvX3hkaWdpdChpbnQgbnVtKSB7Ci0gICAgaWYgKG51bSA8IDEwKSB7Ci0gICAgICByZXR1cm4gJzAnICsgbnVtOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gJ0EnICsgbnVtIC0gMTA7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIGJ5dGVfdG9faGV4KHVpbnQ4X3QgYnl0ZSkgewotICAgIHN0ZDo6c3RyaW5nIHJ2OwotICAgIHJ2ICs9IG55YmJsZV90b194ZGlnaXQoYnl0ZSA+PiA0KTsKLSAgICBydiArPSBueWJibGVfdG9feGRpZ2l0KGJ5dGUgJiAweDBmKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zXzsKLQotIHByb3RlY3RlZDoKLSAgdF90eXBlKCkgOgotICAgIHByb2dyYW1fKE5VTEwpCi0gIHsKLSAgICBtZW1zZXQoZmluZ2VycHJpbnRfLCAwLCBzaXplb2YoZmluZ2VycHJpbnRfKSk7Ci0gIH0KLQotICB0X3R5cGUodF9wcm9ncmFtKiBwcm9ncmFtKSA6Ci0gICAgcHJvZ3JhbV8ocHJvZ3JhbSkKLSAgewotICAgIG1lbXNldChmaW5nZXJwcmludF8sIDAsIHNpemVvZihmaW5nZXJwcmludF8pKTsKLSAgfQotCi0gIHRfdHlwZSh0X3Byb2dyYW0qIHByb2dyYW0sIHN0ZDo6c3RyaW5nIG5hbWUpIDoKLSAgICBwcm9ncmFtXyhwcm9ncmFtKSwKLSAgICBuYW1lXyhuYW1lKQotICB7Ci0gICAgbWVtc2V0KGZpbmdlcnByaW50XywgMCwgc2l6ZW9mKGZpbmdlcnByaW50XykpOwotICB9Ci0KLSAgdF90eXBlKHN0ZDo6c3RyaW5nIG5hbWUpIDoKLSAgICBwcm9ncmFtXyhOVUxMKSwKLSAgICBuYW1lXyhuYW1lKQotICB7Ci0gICAgbWVtc2V0KGZpbmdlcnByaW50XywgMCwgc2l6ZW9mKGZpbmdlcnByaW50XykpOwotICB9Ci0KLSAgdF9wcm9ncmFtKiBwcm9ncmFtXzsKLSAgc3RkOjpzdHJpbmcgbmFtZV87Ci0KLSAgdWludDhfdCBmaW5nZXJwcmludF9bZmluZ2VycHJpbnRfbGVuXTsKLX07Ci0KLQotLyoqCi0gKiBQbGFjZWhvbGRlciBzdHJ1Y3QgZm9yIHJldHVybmluZyB0aGUga2V5IGFuZCB2YWx1ZSBvZiBhbiBhbm5vdGF0aW9uCi0gKiBkdXJpbmcgcGFyc2luZy4KLSAqLwotc3RydWN0IHRfYW5ub3RhdGlvbiB7Ci0gIHN0ZDo6c3RyaW5nIGtleTsKLSAgc3RkOjpzdHJpbmcgdmFsOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfdHlwZWRlZi5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3R5cGVkZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM3N2Q5Ny4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfdHlwZWRlZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfVFlQRURFRl9ICi0jZGVmaW5lIFRfVFlQRURFRl9ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAidF90eXBlLmgiCi0KLS8qKgotICogQSB0eXBlZGVmIGlzIGEgbWFwcGluZyBmcm9tIGEgc3ltYm9saWMgbmFtZSB0byBhbm90aGVyIHR5cGUuIEluIGR5bWFuaWNhbGx5Ci0gKiB0eXBlZCBsYW5ndWFnZXMgKGkuZS4gcGhwL3B5dGhvbikgdGhlIGNvZGUgZ2VuZXJhdG9yIGNhbiBhY3R1YWxseSB1c3VhbGx5Ci0gKiBpZ25vcmUgdHlwZWRlZnMgYW5kIGp1c3QgdXNlIHRoZSB1bmRlcmx5aW5nIHR5cGUgZGlyZWN0bHksIHRob3VnaCBpbiBDKysKLSAqIHRoZSBzeW1ib2xpYyBuYW1pbmcgY2FuIGJlIHF1aXRlIHVzZWZ1bCBmb3IgY29kZSBjbGFyaXR5LgotICoKLSAqLwotY2xhc3MgdF90eXBlZGVmIDogcHVibGljIHRfdHlwZSB7Ci0gcHVibGljOgotICB0X3R5cGVkZWYodF9wcm9ncmFtKiBwcm9ncmFtLCB0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIHN5bWJvbGljKSA6Ci0gICAgdF90eXBlKHByb2dyYW0sIHN5bWJvbGljKSwKLSAgICB0eXBlXyh0eXBlKSwKLSAgICBzeW1ib2xpY18oc3ltYm9saWMpIHt9Ci0KLSAgfnRfdHlwZWRlZigpIHt9Ci0KLSAgdF90eXBlKiBnZXRfdHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHlwZV87Ci0gIH0KLQotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X3N5bWJvbGljKCkgY29uc3QgewotICAgIHJldHVybiBzeW1ib2xpY187Ci0gIH0KLQotICBib29sIGlzX3R5cGVkZWYoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHlwZV8tPmdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2ZpbmdlcnByaW50KCkgewotICAgIHRfdHlwZTo6Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgICBpZiAoIXR5cGVfLT5oYXNfZmluZ2VycHJpbnQoKSkgewotICAgICAgdHlwZV8tPmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gICAgfQotICB9Ci0KLSBwcml2YXRlOgotICB0X3R5cGUqIHR5cGVfOwotICBzdGQ6OnN0cmluZyBzeW1ib2xpY187Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGxhdGZvcm0uaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGxhdGZvcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ5N2Y2OC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BsYXRmb3JtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogZGVmaW5lIGZvciBta2RpcixzaW5jZSB0aGUgbWV0aG9kIHNpZ25hdHVyZQotICogaXMgZGlmZmVyZW50IGZvciB0aGUgbm9uLVBPU0lYIE1pbkdXCi0gKi8KLQotI2lmZGVmIE1JTkdXCi0jaW5jbHVkZSA8aW8uaD4KLSNlbHNlCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBNSU5HVwotI2RlZmluZSBNS0RJUih4KSBta2Rpcih4KQotI2Vsc2UKLSNkZWZpbmUgTUtESVIoeCkgbWtkaXIoeCwgU19JUldYVSB8IFNfSVJXWEcgfCBTX0lSV1hPKQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMzlkNjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcApAQCAtMCwwICsxLDQ2NCBAQAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworLy8gQ2FyZWZ1bDogbXVzdCBpbmNsdWRlIGdsb2JhbHMgZmlyc3QgZm9yIGV4dGVybiBkZWZpbml0aW9ucworI2luY2x1ZGUgInRocmlmdC9nbG9iYWxzLmgiCisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9jb25zdC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2ZpZWxkLmgiCisKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorCisjaW5jbHVkZSAidGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaCIKKworZXh0ZXJuIGludCBnX3dhcm47CitleHRlcm4gc3RkOjpzdHJpbmcgZ19jdXJwYXRoOworZXh0ZXJuIGJvb2wgZ19yZXR1cm5fZmFpbHVyZTsKKwordm9pZCB0aHJpZnRfYXVkaXRfd2FybmluZyhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgICBpZiAoZ193YXJuIDwgbGV2ZWwpIHsKKyAgICAgIHJldHVybjsKKyAgIH0KKyAgIHZhX2xpc3QgYXJnczsKKyAgIHByaW50ZigiW1RocmlmdCBBdWRpdCBXYXJuaW5nOiVzXSAiLCBnX2N1cnBhdGguY19zdHIoKSk7CisgICB2YV9zdGFydChhcmdzLCBmbXQpOworICAgdnByaW50ZihmbXQsIGFyZ3MpOworICAgdmFfZW5kKGFyZ3MpOworICAgcHJpbnRmKCJcbiIpOworfQorCit2b2lkIHRocmlmdF9hdWRpdF9mYWlsdXJlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgZnByaW50ZihzdGRlcnIsICJbVGhyaWZ0IEF1ZGl0IEZhaWx1cmU6JXNdICIsIGdfY3VycGF0aC5jX3N0cigpKTsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgZ19yZXR1cm5fZmFpbHVyZSA9IHRydWU7Cit9CisKK3ZvaWQgY29tcGFyZV9uYW1lc3BhY2UodF9wcm9ncmFtKiBuZXdQcm9ncmFtLCB0X3Byb2dyYW0qIG9sZFByb2dyYW0pCit7CisgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBuZXdOYW1lc3BhY2VNYXAgPSBuZXdQcm9ncmFtLT5nZXRfYWxsX25hbWVzcGFjZXMoKTsKKyAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIG9sZE5hbWVzcGFjZU1hcCA9IG9sZFByb2dyYW0tPmdldF9hbGxfbmFtZXNwYWNlcygpOworCisgICBmb3Ioc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3Igb2xkTmFtZXNwYWNlTWFwSXQgPSBvbGROYW1lc3BhY2VNYXAuYmVnaW4oKTsKKyAgICAgICAgIG9sZE5hbWVzcGFjZU1hcEl0ICE9IG9sZE5hbWVzcGFjZU1hcC5lbmQoKTsKKyAgICAgICAgIG9sZE5hbWVzcGFjZU1hcEl0KyspCisgICB7CisgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBuZXdOYW1lc3BhY2VNYXBJdCA9IG5ld05hbWVzcGFjZU1hcC5maW5kKG9sZE5hbWVzcGFjZU1hcEl0LT5maXJzdCk7CisgICAgICBpZihuZXdOYW1lc3BhY2VNYXBJdCA9PSBuZXdOYW1lc3BhY2VNYXAuZW5kKCkpCisgICAgICB7CisgICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiTGFuZ3VhZ2UgJXMgbm90IGZvdW5kIGluIG5ldyB0aHJpZnQgZmlsZVxuIiwgKG9sZE5hbWVzcGFjZU1hcEl0LT5maXJzdCkuY19zdHIoKSk7CisgICAgICB9CisgICAgICBlbHNlIGlmKChuZXdOYW1lc3BhY2VNYXBJdC0+c2Vjb25kKSAhPSBvbGROYW1lc3BhY2VNYXBJdC0+c2Vjb25kKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIk5hbWVzcGFjZSAlcyBjaGFuZ2VkIGluIG5ldyB0aHJpZnQgZmlsZVxuIiwgKG9sZE5hbWVzcGFjZU1hcEl0LT5zZWNvbmQpLmNfc3RyKCkpOworICAgICAgfQorICAgfQorfQorCit2b2lkIGNvbXBhcmVfZW51bV92YWx1ZXModF9lbnVtKiBuZXdFbnVtLHRfZW51bSogb2xkRW51bSkKK3sKKyAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBvbGRFbnVtVmFsdWVzID0gb2xkRW51bS0+Z2V0X2NvbnN0YW50cygpOworICAgZm9yKHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBvbGRFbnVtVmFsdWVzSXQgPSBvbGRFbnVtVmFsdWVzLmJlZ2luKCk7CisgICAgICAgICBvbGRFbnVtVmFsdWVzSXQgIT0gb2xkRW51bVZhbHVlcy5lbmQoKTsKKyAgICAgICAgIG9sZEVudW1WYWx1ZXNJdCsrKQorICAgeworICAgICAgaW50IGVudW1WYWx1ZSA9ICgqb2xkRW51bVZhbHVlc0l0KS0+Z2V0X3ZhbHVlKCk7CisgICAgICB0X2VudW1fdmFsdWUqIG5ld0VudW1WYWx1ZSA9IG5ld0VudW0tPmdldF9jb25zdGFudF9ieV92YWx1ZShlbnVtVmFsdWUpOworICAgICAgaWYobmV3RW51bVZhbHVlICE9IE5VTEwpCisgICAgICB7CisgICAgICAgICBzdGQ6OnN0cmluZyBlbnVtTmFtZSA9ICgqb2xkRW51bVZhbHVlc0l0KS0+Z2V0X25hbWUoKTsKKyAgICAgICAgIGlmKGVudW1OYW1lICE9IG5ld0VudW1WYWx1ZS0+Z2V0X25hbWUoKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJOYW1lIG9mIHRoZSB2YWx1ZSAlZCBjaGFuZ2VkIGluIGVudW0gJXNcbiIsIGVudW1WYWx1ZSwgb2xkRW51bS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJFbnVtIHZhbHVlICVkIG1pc3NpbmcgaW4gJXNcbiIsIGVudW1WYWx1ZSwgb2xkRW51bS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgIH0KKworICAgfQorfQorCit2b2lkIGNvbXBhcmVfZW51bXMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtKj4mIG5ld0VudW1MaXN0LCBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW0qPiYgb2xkRW51bUxpc3QpCit7CisgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZyx0X2VudW0qPiBuZXdFbnVtTWFwOworICAgc3RkOjp2ZWN0b3I8dF9lbnVtKj46OmNvbnN0X2l0ZXJhdG9yIG5ld0VudW1JdDsKKyAgIGZvcihuZXdFbnVtSXQgPSBuZXdFbnVtTGlzdC5iZWdpbigpOyBuZXdFbnVtSXQgIT0gbmV3RW51bUxpc3QuZW5kKCk7IG5ld0VudW1JdCsrKQorICAgeworICAgICAgbmV3RW51bU1hcFsoKm5ld0VudW1JdCktPmdldF9uYW1lKCldID0gKm5ld0VudW1JdDsKKyAgIH0KKyAgIHN0ZDo6dmVjdG9yPHRfZW51bSo+Ojpjb25zdF9pdGVyYXRvciBvbGRFbnVtSXQ7CisgICBmb3Iob2xkRW51bUl0ID0gb2xkRW51bUxpc3QuYmVnaW4oKTsgb2xkRW51bUl0ICE9IG9sZEVudW1MaXN0LmVuZCgpOyBvbGRFbnVtSXQrKykKKyAgIHsKKyAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLHRfZW51bSo+OjppdGVyYXRvciBuZXdFbnVtTWFwSXQ7CisgICAgICBuZXdFbnVtTWFwSXQgPSBuZXdFbnVtTWFwLmZpbmQoKCpvbGRFbnVtSXQpLT5nZXRfbmFtZSgpKTsKKworICAgICAgaWYobmV3RW51bU1hcEl0ID09IG5ld0VudW1NYXAuZW5kKCkpCisgICAgICB7CisgICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiRW51bSAlcyBub3QgZm91bmQgaW4gbmV3IHRocmlmdCBmaWxlXG4iLCgqb2xkRW51bUl0KS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGNvbXBhcmVfZW51bV92YWx1ZXMobmV3RW51bU1hcEl0LT5zZWNvbmQsICpvbGRFbnVtSXQpOworICAgICAgfQorICAgfQorfQorCisvL1RoaXMgZnVuY3Rpb24gcmV0dXJucyAndHJ1ZScgaWYgdGhlIHR3byBhcmd1ZW1lbnRzIGFyZSBvZiBzYW1lIHR5cGVzLgorLy9SZXR1cm5zIGZhbHNlIGlmIHRoZXkgYXJlIG9mIGRpZmZlcmVudCB0eXBlCitib29sIGNvbXBhcmVfdHlwZSh0X3R5cGUqIG5ld1R5cGUsIHRfdHlwZSogb2xkVHlwZSkKK3sKKyAgIC8vQ29tcGFyaW5nIG5hbWVzIG9mIHR3byB0eXBlcyB3aWxsIHdvcmsgd2hlbiB0aGUgbmV3VHlwZSBhbmQgb2xkVHlwZSBhcmUgYmFzaWMgdHlwZXMgb3Igc3RydWN0cyBvciBlbnVtcy4KKyAgIC8vSG93ZXZlciwgd2hlbiB0aGV5IGFyZSBjb250YWluZXJzLCBnZXRfbmFtZSgpIHJldHVybnMgZW1wdHkgZm9yIHdoaWNoIHdlIGhhdmUgdG8gY29tcGFyZSB0aGUgdHlwZSBvZgorICAgLy90aGVpciBlbGVtZW50cyBhcyB3ZWxsLgorICAgaWYoKG5ld1R5cGUtPmdldF9uYW1lKCkpLmVtcHR5KCkgJiYgKG9sZFR5cGUtPmdldF9uYW1lKCkpLmVtcHR5KCkpCisgICB7CisKKyAgICAgIGlmKG5ld1R5cGUtPmlzX2xpc3QoKSAmJiBvbGRUeXBlLT5pc19saXN0KCkpCisgICAgICB7CisgICAgICAgICB0X3R5cGUqIG5ld0VsZW1lbnRUeXBlID0gKCh0X2xpc3QqKW5ld1R5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgICB0X3R5cGUqIG9sZEVsZW1lbnRUeXBlID0gKCh0X2xpc3QqKW9sZFR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgICByZXR1cm4gY29tcGFyZV90eXBlKG5ld0VsZW1lbnRUeXBlLCBvbGRFbGVtZW50VHlwZSk7CisgICAgICB9CisgICAgICBlbHNlIGlmKG5ld1R5cGUtPmlzX21hcCgpICYmIG9sZFR5cGUtPmlzX21hcCgpKQorICAgICAgeworICAgICAgICAgdF90eXBlKiBuZXdLZXlUeXBlID0gKCh0X21hcCopbmV3VHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgICAgdF90eXBlKiBvbGRLZXlUeXBlID0gKCh0X21hcCopb2xkVHlwZSktPmdldF9rZXlfdHlwZSgpOworCisgICAgICAgICB0X3R5cGUqIG5ld1ZhbFR5cGUgPSAoKHRfbWFwKiluZXdUeXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgICAgICB0X3R5cGUqIG9sZFZhbFR5cGUgPSAoKHRfbWFwKilvbGRUeXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgICAgICAgIHJldHVybiAoY29tcGFyZV90eXBlKG5ld0tleVR5cGUsIG9sZEtleVR5cGUpICYmIGNvbXBhcmVfdHlwZShuZXdWYWxUeXBlLCBvbGRWYWxUeXBlKSk7CisgICAgICB9CisgICAgICBlbHNlIGlmKG5ld1R5cGUtPmlzX3NldCgpICYmIG9sZFR5cGUtPmlzX3NldCgpKQorICAgICAgeworICAgICAgICAgdF90eXBlKiBuZXdFbGVtZW50VHlwZSA9ICgodF9zZXQqKW5ld1R5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgICB0X3R5cGUqIG9sZEVsZW1lbnRUeXBlID0gKCh0X3NldCopb2xkVHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgIHJldHVybiBjb21wYXJlX3R5cGUobmV3RWxlbWVudFR5cGUsIG9sZEVsZW1lbnRUeXBlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgIH0KKyAgIGVsc2UgaWYobmV3VHlwZS0+Z2V0X25hbWUoKSA9PSBvbGRUeXBlLT5nZXRfbmFtZSgpKQorICAgeworICAgICAgcmV0dXJuIHRydWU7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9Cit9CisKK2Jvb2wgY29tcGFyZV9wYWlyKHN0ZDo6cGFpcjx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+IG5ld01hcFBhaXIsIHN0ZDo6cGFpcjx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+IG9sZE1hcFBhaXIpCit7CisgICByZXR1cm4gY29tcGFyZV9kZWZhdWx0cyhuZXdNYXBQYWlyLmZpcnN0LCBvbGRNYXBQYWlyLmZpcnN0KSAmJiBjb21wYXJlX2RlZmF1bHRzKG5ld01hcFBhaXIuc2Vjb25kLCBvbGRNYXBQYWlyLnNlY29uZCk7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAndHJ1ZScgaWYgdGhlIGRlZmF1bHQgdmFsdWVzIGFyZSBzYW1lLiBSZXR1cm5zIGZhbHNlIGlmIHRoZXkgYXJlIGRpZmZlcmVudC4KK2Jvb2wgY29tcGFyZV9kZWZhdWx0cyh0X2NvbnN0X3ZhbHVlKiBuZXdTdHJ1Y3REZWZhdWx0LCB0X2NvbnN0X3ZhbHVlKiBvbGRTdHJ1Y3REZWZhdWx0KQoreworICAgaWYobmV3U3RydWN0RGVmYXVsdCA9PSBOVUxMICYmIG9sZFN0cnVjdERlZmF1bHQgPT0gTlVMTCkgcmV0dXJuIHRydWU7CisgICBlbHNlIGlmKG5ld1N0cnVjdERlZmF1bHQgPT0gTlVMTCAmJiBvbGRTdHJ1Y3REZWZhdWx0ICE9IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgIGVsc2UgaWYgKG5ld1N0cnVjdERlZmF1bHQgIT0gTlVMTCAmJiBvbGRTdHJ1Y3REZWZhdWx0ID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICAgaWYobmV3U3RydWN0RGVmYXVsdC0+Z2V0X3R5cGUoKSAhPSBvbGRTdHJ1Y3REZWZhdWx0LT5nZXRfdHlwZSgpKQorICAgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorCisgICBzd2l0Y2gobmV3U3RydWN0RGVmYXVsdC0+Z2V0X3R5cGUoKSkKKyAgIHsKKyAgICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjoKKyAgICAgICAgIHJldHVybiAobmV3U3RydWN0RGVmYXVsdC0+Z2V0X2ludGVnZXIoKSA9PSBvbGRTdHJ1Y3REZWZhdWx0LT5nZXRfaW50ZWdlcigpKTsKKyAgICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFOgorICAgICAgICAgcmV0dXJuIChuZXdTdHJ1Y3REZWZhdWx0LT5nZXRfZG91YmxlKCkgPT0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X2RvdWJsZSgpKTsKKyAgICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgorICAgICAgICAgcmV0dXJuIChuZXdTdHJ1Y3REZWZhdWx0LT5nZXRfc3RyaW5nKCkgPT0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X3N0cmluZygpKTsKKyAgICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTElTVDoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgb2xkRGVmYXVsdExpc3QgPSBvbGRTdHJ1Y3REZWZhdWx0LT5nZXRfbGlzdCgpOworICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBuZXdEZWZhdWx0TGlzdCA9IG5ld1N0cnVjdERlZmF1bHQtPmdldF9saXN0KCk7CisgICAgICAgICAgICBib29sIGRlZmF1bHRWYWx1ZXNDb21wYXJlID0gKG9sZERlZmF1bHRMaXN0LnNpemUoKSA9PSBuZXdEZWZhdWx0TGlzdC5zaXplKCkpOworCisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlc0NvbXBhcmUgJiYgc3RkOjplcXVhbChuZXdEZWZhdWx0TGlzdC5iZWdpbigpLCBuZXdEZWZhdWx0TGlzdC5lbmQoKSwgb2xkRGVmYXVsdExpc3QuYmVnaW4oKSwgY29tcGFyZV9kZWZhdWx0cyk7CisgICAgICAgICB9CisgICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4gbmV3TWFwID0gbmV3U3RydWN0RGVmYXVsdC0+Z2V0X21hcCgpOworICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiBvbGRNYXAgPSBvbGRTdHJ1Y3REZWZhdWx0LT5nZXRfbWFwKCk7CisKKyAgICAgICAgICAgIGJvb2wgZGVmYXVsdFZhbHVlc0NvbXBhcmUgPSAob2xkTWFwLnNpemUoKSA9PSBuZXdNYXAuc2l6ZSgpKTsKKworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZXNDb21wYXJlICYmIHN0ZDo6ZXF1YWwobmV3TWFwLmJlZ2luKCksIG5ld01hcC5lbmQoKSwgb2xkTWFwLmJlZ2luKCksIGNvbXBhcmVfcGFpcik7CisgICAgICAgICB9CisgICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVI6CisgICAgICAgICByZXR1cm4gKG5ld1N0cnVjdERlZmF1bHQtPmdldF9pZGVudGlmaWVyKCkgPT0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X2lkZW50aWZpZXIoKSk7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorCit9CisKK3ZvaWQgY29tcGFyZV9zdHJ1Y3RfZmllbGQodF9maWVsZCogbmV3RmllbGQsIHRfZmllbGQqIG9sZEZpZWxkLCBzdGQ6OnN0cmluZyBvbGRTdHJ1Y3ROYW1lKQoreworICAgdF90eXBlKiBuZXdGaWVsZFR5cGUgPSBuZXdGaWVsZC0+Z2V0X3R5cGUoKTsKKyAgIHRfdHlwZSogb2xkRmllbGRUeXBlID0gb2xkRmllbGQtPmdldF90eXBlKCk7CisgICBpZighY29tcGFyZV90eXBlKG5ld0ZpZWxkVHlwZSwgb2xkRmllbGRUeXBlKSkKKyAgIHsKKyAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJTdHJ1Y3QgRmllbGQgVHlwZSBDaGFuZ2VkIGZvciBJZCA9ICVkIGluICVzIFxuIiwgbmV3RmllbGQtPmdldF9rZXkoKSwgb2xkU3RydWN0TmFtZS5jX3N0cigpKTsKKyAgIH0KKworICAgLy8gQSBTdHJ1Y3QgbWVtYmVyIGNhbiBiZSBvcHRpb25hbCBpZiBpdCBpcyBtZW50aW9uZWQgZXhwbGljaXRseSwgb3IgaWYgaXQgaXMgYXNzaWduZWQgd2l0aCBkZWZhdWx0IHZhbHVlcy4KKyAgIGJvb2wgbmV3U3RydWN0RmllbGRPcHRpb25hbCA9IChuZXdGaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpOworICAgYm9vbCBvbGRTdHJ1Y3RGaWVsZE9wdGlvbmFsID0gKG9sZEZpZWxkLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCk7CisKKyAgIGlmKG5ld1N0cnVjdEZpZWxkT3B0aW9uYWwgIT0gb2xkU3RydWN0RmllbGRPcHRpb25hbCkKKyAgIHsKKyAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJTdHJ1Y3QgRmllbGQgUmVxdWlyZWRuZXNzIENoYW5nZWQgZm9yIElkID0gJWQgaW4gJXMgXG4iLCBuZXdGaWVsZC0+Z2V0X2tleSgpLCBvbGRTdHJ1Y3ROYW1lLmNfc3RyKCkpOworICAgfQorICAgaWYobmV3U3RydWN0RmllbGRPcHRpb25hbCB8fCBvbGRTdHJ1Y3RGaWVsZE9wdGlvbmFsKQorICAgeworICAgICAgaWYoIWNvbXBhcmVfZGVmYXVsdHMobmV3RmllbGQtPmdldF92YWx1ZSgpLCBvbGRGaWVsZC0+Z2V0X3ZhbHVlKCkpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIkRlZmF1bHQgdmFsdWUgY2hhbmdlZCBmb3IgSWQgPSAlZCBpbiAlcyBcbiIsIG5ld0ZpZWxkLT5nZXRfa2V5KCksIG9sZFN0cnVjdE5hbWUuY19zdHIoKSk7CisgICAgICB9CisgICB9CisKKyAgIHN0ZDo6c3RyaW5nIGZpZWxkTmFtZSA9IG5ld0ZpZWxkLT5nZXRfbmFtZSgpOworICAgaWYoZmllbGROYW1lICE9IG9sZEZpZWxkLT5nZXRfbmFtZSgpKQorICAgeworICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIlN0cnVjdCBmaWVsZCBuYW1lIGNoYW5nZWQgZm9yIElkID0gJWQgaW4gJXNcbiIsIG5ld0ZpZWxkLT5nZXRfa2V5KCksIG9sZFN0cnVjdE5hbWUuY19zdHIoKSk7CisgICB9CisKK30KKwordm9pZCBjb21wYXJlX3NpbmdsZV9zdHJ1Y3QodF9zdHJ1Y3QqIG5ld1N0cnVjdCwgdF9zdHJ1Y3QqIG9sZFN0cnVjdCwgY29uc3Qgc3RkOjpzdHJpbmcmIG9sZFN0cnVjdE5hbWUgPSBzdGQ6OnN0cmluZygpKQoreworICAgc3RkOjpzdHJpbmcgc3RydWN0TmFtZSA9IG9sZFN0cnVjdE5hbWUuZW1wdHkoKSA/IG9sZFN0cnVjdC0+Z2V0X25hbWUoKSA6IG9sZFN0cnVjdE5hbWU7CisgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIG9sZFN0cnVjdE1lbWJlcnNJbklkT3JkZXIgPSBvbGRTdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBuZXdTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyID0gbmV3U3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3Igb2xkU3RydWN0TWVtYmVySXQgPSBvbGRTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyLmJlZ2luKCk7CisgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG5ld1N0cnVjdE1lbWJlckl0ID0gbmV3U3RydWN0TWVtYmVyc0luSWRPcmRlci5iZWdpbigpOworCisgICAvLyBTaW5jZSB3ZSBoYXZlIHRoZSBzdHJ1Y3QgbWVtYmVycyBpbiB0aGVpciBJRCBvcmRlciwgY29tcGFyaW5nIHRoZWlyIElEcyBjYW4gYmUgZG9uZSBieSB0cmF2ZXJzaW5nIHRoZSB0d28gbWVtYmVyCisgICAvLyBsaXN0cyB0b2dldGhlci4KKyAgIHdoaWxlKCEob2xkU3RydWN0TWVtYmVySXQgPT0gb2xkU3RydWN0TWVtYmVyc0luSWRPcmRlci5lbmQoKSAmJiBuZXdTdHJ1Y3RNZW1iZXJJdCA9PSBuZXdTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyLmVuZCgpKSkKKyAgIHsKKyAgICAgIGlmKG5ld1N0cnVjdE1lbWJlckl0ID09IG5ld1N0cnVjdE1lbWJlcnNJbklkT3JkZXIuZW5kKCkgJiYgb2xkU3RydWN0TWVtYmVySXQgIT0gb2xkU3RydWN0TWVtYmVyc0luSWRPcmRlci5lbmQoKSkKKyAgICAgIHsKKyAgICAgICAgIC8vIEEgZmllbGQgSUQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBlbmQuCisgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiU3RydWN0IEZpZWxkIHJlbW92ZWQgZm9yIElkID0gJWQgaW4gJXMgXG4iLCAoKm9sZFN0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpLCBzdHJ1Y3ROYW1lLmNfc3RyKCkpOworICAgICAgICAgb2xkU3RydWN0TWVtYmVySXQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYobmV3U3RydWN0TWVtYmVySXQgIT0gbmV3U3RydWN0TWVtYmVyc0luSWRPcmRlci5lbmQoKSAmJiBvbGRTdHJ1Y3RNZW1iZXJJdCA9PSBvbGRTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyLmVuZCgpKQorICAgICAgeworICAgICAgICAgLy9OZXcgZmllbGQgSUQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGVuZC4KKyAgICAgICAgIGlmKCgqbmV3U3RydWN0TWVtYmVySXQpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJSZXF1aXJlZCBTdHJ1Y3QgRmllbGQgQWRkZWQgZm9yIElkID0gJWQgaW4gJXMgXG4iLCAoKm5ld1N0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpLCBzdHJ1Y3ROYW1lLmNfc3RyKCkpOworICAgICAgICAgfQorICAgICAgICAgbmV3U3RydWN0TWVtYmVySXQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoKCpuZXdTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSA9PSAoKm9sZFN0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpKQorICAgICAgeworICAgICAgICAgLy9GaWVsZCBJRCBmb3VuZCBpbiBib3RoIHN0cnVjdHMuIENvbXBhcmUgZmllbGQgdHlwZXMsIGRlZmF1bHQgdmFsdWVzLgorICAgICAgICAgY29tcGFyZV9zdHJ1Y3RfZmllbGQoKm5ld1N0cnVjdE1lbWJlckl0LCAqb2xkU3RydWN0TWVtYmVySXQsIHN0cnVjdE5hbWUpOworCisgICAgICAgICBuZXdTdHJ1Y3RNZW1iZXJJdCsrOworICAgICAgICAgb2xkU3RydWN0TWVtYmVySXQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoKCpuZXdTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSA8ICgqb2xkU3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCkpCisgICAgICB7CisgICAgICAgICAvL05ldyBGaWVsZCBJZCBpcyBpbnNlcnRlZCBpbiBiZXR3ZWVuCisgICAgICAgICAvL0FkZGluZyBmaWVsZHMgdG8gc3RydWN0IGlzIGZpbmUsIGJ1dCBhZGRpbmcgdGhlbSBpbiB0aGUgbWlkZGxlIGlzIHN1c3BpY2lvdXMuIEVycm9yISEKKyAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJTdHJ1Y3QgZmllbGQgaXMgYWRkZWQgaW4gdGhlIG1pZGRsZSB3aXRoIElkID0gJWQgaW4gJXNcbiIsICAoKm5ld1N0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpLCAgc3RydWN0TmFtZS5jX3N0cigpKTsKKyAgICAgICAgIG5ld1N0cnVjdE1lbWJlckl0Kys7CisgICAgICB9CisgICAgICBlbHNlIGlmKCgqbmV3U3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCkgPiAoKm9sZFN0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpKQorICAgICAgeworICAgICAgICAgLy9BIGZpZWxkIGlzIGRlbGV0ZWQgaW4gbmV3U3RydWN0LgorICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIlN0cnVjdCBGaWVsZCByZW1vdmVkIGZvciBJZCA9ICVkIGluICVzIFxuIiwgICgqb2xkU3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCksIHN0cnVjdE5hbWUuY19zdHIoKSk7CisgICAgICAgICBvbGRTdHJ1Y3RNZW1iZXJJdCsrOworICAgICAgfQorCisgICB9Cit9CisKK3ZvaWQgY29tcGFyZV9zdHJ1Y3RzKGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIG5ld1N0cnVjdExpc3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIG9sZFN0cnVjdExpc3QpCit7CisgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZyx0X3N0cnVjdCo+IG5ld1N0cnVjdE1hcDsKKyAgIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIG5ld1N0cnVjdExpc3RJdDsKKyAgIGZvcihuZXdTdHJ1Y3RMaXN0SXQgPSBuZXdTdHJ1Y3RMaXN0LmJlZ2luKCk7IG5ld1N0cnVjdExpc3RJdCAhPSBuZXdTdHJ1Y3RMaXN0LmVuZCgpOyBuZXdTdHJ1Y3RMaXN0SXQrKykKKyAgIHsKKyAgICAgIG5ld1N0cnVjdE1hcFsoKm5ld1N0cnVjdExpc3RJdCktPmdldF9uYW1lKCldID0gKm5ld1N0cnVjdExpc3RJdDsKKyAgIH0KKworICAgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3Igb2xkU3RydWN0TGlzdEl0OworICAgZm9yKG9sZFN0cnVjdExpc3RJdCA9IG9sZFN0cnVjdExpc3QuYmVnaW4oKTsgb2xkU3RydWN0TGlzdEl0ICE9IG9sZFN0cnVjdExpc3QuZW5kKCk7IG9sZFN0cnVjdExpc3RJdCsrKQorICAgeworICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfc3RydWN0Kj46Oml0ZXJhdG9yIG5ld1N0cnVjdE1hcEl0OworICAgICAgbmV3U3RydWN0TWFwSXQgPSBuZXdTdHJ1Y3RNYXAuZmluZCgoKm9sZFN0cnVjdExpc3RJdCktPmdldF9uYW1lKCkpOworICAgICAgaWYobmV3U3RydWN0TWFwSXQgPT0gbmV3U3RydWN0TWFwLmVuZCgpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIlN0cnVjdCAlcyBub3QgZm91bmQgaW4gbmV3IHRocmlmdCBmaWxlXG4iLCAoKm9sZFN0cnVjdExpc3RJdCktPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBjb21wYXJlX3NpbmdsZV9zdHJ1Y3QobmV3U3RydWN0TWFwSXQtPnNlY29uZCwgKm9sZFN0cnVjdExpc3RJdCk7CisgICAgICB9CisgICB9CisKK30KKwordm9pZCBjb21wYXJlX3NpbmdsZV9mdW5jdGlvbih0X2Z1bmN0aW9uKiBuZXdGdW5jdGlvbiwgdF9mdW5jdGlvbiogb2xkRnVuY3Rpb24pCit7CisgICB0X3R5cGUqIG5ld0Z1bmN0aW9uUmV0dXJuVHlwZSA9IG5ld0Z1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworCisgICBpZihuZXdGdW5jdGlvbi0+aXNfb25ld2F5KCkgIT0gb2xkRnVuY3Rpb24tPmlzX29uZXdheSgpKQorICAgeworICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIk9uZXdheSBhdHRyaWJ1dGUgY2hhbmdlZCBmb3IgZnVuY3Rpb24gJXNcbiIsb2xkRnVuY3Rpb24tPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICB9CisgICBpZighY29tcGFyZV90eXBlKG5ld0Z1bmN0aW9uUmV0dXJuVHlwZSwgb2xkRnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpKQorICAgeworICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIlJldHVybiB0eXBlIGNoYW5nZWQgZm9yIGZ1bmN0aW9uICVzXG4iLG9sZEZ1bmN0aW9uLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgfQorCisgICAvL0NvbXBhcmUgZnVuY3Rpb24gYXJndW1lbnRzLgorICAgY29tcGFyZV9zaW5nbGVfc3RydWN0KG5ld0Z1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCBvbGRGdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7CisgICBzdGQ6OnN0cmluZyBleGNlcHRpb25OYW1lID0gb2xkRnVuY3Rpb24tPmdldF9uYW1lKCk7CisgICBleGNlcHRpb25OYW1lICs9ICJfZXhjZXB0aW9uIjsKKyAgIGNvbXBhcmVfc2luZ2xlX3N0cnVjdChuZXdGdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLCBvbGRGdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLCBleGNlcHRpb25OYW1lKTsKK30KKwordm9pZCBjb21wYXJlX2Z1bmN0aW9ucyhjb25zdCBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4mIG5ld0Z1bmN0aW9uTGlzdCwgY29uc3Qgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+JiBvbGRGdW5jdGlvbkxpc3QpCit7CisgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9mdW5jdGlvbio+IG5ld0Z1bmN0aW9uTWFwOworICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgbmV3RnVuY3Rpb25NYXBJdDsKKyAgIGZvcihzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIG5ld0Z1bmN0aW9uSXQgPSBuZXdGdW5jdGlvbkxpc3QuYmVnaW4oKTsKKyAgICAgICAgIG5ld0Z1bmN0aW9uSXQgIT0gbmV3RnVuY3Rpb25MaXN0LmVuZCgpOworICAgICAgICAgbmV3RnVuY3Rpb25JdCsrKQorICAgeworICAgICAgbmV3RnVuY3Rpb25NYXBbKCpuZXdGdW5jdGlvbkl0KS0+Z2V0X25hbWUoKV0gPSAqbmV3RnVuY3Rpb25JdDsKKyAgIH0KKworICAgZm9yKHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3Igb2xkRnVuY3Rpb25JdCA9IG9sZEZ1bmN0aW9uTGlzdC5iZWdpbigpOworICAgICAgICAgb2xkRnVuY3Rpb25JdCAhPSBvbGRGdW5jdGlvbkxpc3QuZW5kKCk7CisgICAgICAgICBvbGRGdW5jdGlvbkl0KyspCisgICB7CisgICAgICBuZXdGdW5jdGlvbk1hcEl0ID0gbmV3RnVuY3Rpb25NYXAuZmluZCgoKm9sZEZ1bmN0aW9uSXQpLT5nZXRfbmFtZSgpKTsKKyAgICAgIGlmKG5ld0Z1bmN0aW9uTWFwSXQgPT0gbmV3RnVuY3Rpb25NYXAuZW5kKCkpCisgICAgICB7CisgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiTmV3IFRocmlmdCBGaWxlIGhhcyBtaXNzaW5nIGZ1bmN0aW9uICVzXG4iLCgqb2xkRnVuY3Rpb25JdCktPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIC8vRnVuY3Rpb24gaXMgZm91bmQgaW4gYm90aCB0aHJpZnQgZmlsZXMuIENvbXBhcmUgcmV0dXJuIHR5cGUgYW5kIGFyZ3VtZW50IGxpc3QKKyAgICAgICAgIGNvbXBhcmVfc2luZ2xlX2Z1bmN0aW9uKG5ld0Z1bmN0aW9uTWFwSXQtPnNlY29uZCwgKm9sZEZ1bmN0aW9uSXQpOworICAgICAgfQorICAgfQorCit9CisKK3ZvaWQgY29tcGFyZV9zZXJ2aWNlcyhjb25zdCBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiYgbmV3U2VydmljZXMsIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+JiBvbGRTZXJ2aWNlcykKK3sKKyAgIHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+Ojpjb25zdF9pdGVyYXRvciBvbGRTZXJ2aWNlSXQ7CisKKyAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X3NlcnZpY2UqPiBuZXdTZXJ2aWNlTWFwOworICAgZm9yKHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+Ojpjb25zdF9pdGVyYXRvciBuZXdTZXJ2aWNlSXQgPSBuZXdTZXJ2aWNlcy5iZWdpbigpOworICAgICAgICAgbmV3U2VydmljZUl0ICE9IG5ld1NlcnZpY2VzLmVuZCgpOworICAgICAgICAgbmV3U2VydmljZUl0KyspCisgICB7CisgICAgICBuZXdTZXJ2aWNlTWFwWygqbmV3U2VydmljZUl0KS0+Z2V0X25hbWUoKV0gPSAqbmV3U2VydmljZUl0OworICAgfQorCisKKyAgIGZvcihvbGRTZXJ2aWNlSXQgPSBvbGRTZXJ2aWNlcy5iZWdpbigpOyBvbGRTZXJ2aWNlSXQgIT0gb2xkU2VydmljZXMuZW5kKCk7IG9sZFNlcnZpY2VJdCsrKQorICAgeworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgb2xkU2VydmljZU5hbWUgPSAoKm9sZFNlcnZpY2VJdCktPmdldF9uYW1lKCk7CisgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9zZXJ2aWNlKj46Oml0ZXJhdG9yIG5ld1NlcnZpY2VNYXBJdCA9IG5ld1NlcnZpY2VNYXAuZmluZChvbGRTZXJ2aWNlTmFtZSk7CisKKyAgICAgIGlmKG5ld1NlcnZpY2VNYXBJdCA9PSBuZXdTZXJ2aWNlTWFwLmVuZCgpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIk5ldyBUaHJpZnQgZmlsZSBpcyBtaXNzaW5nIGEgc2VydmljZSAlc1xuIiwgb2xkU2VydmljZU5hbWUuY19zdHIoKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICB0X3NlcnZpY2UqIG9sZFNlcnZpY2VFeHRlbmRzID0gKCpvbGRTZXJ2aWNlSXQpLT5nZXRfZXh0ZW5kcygpOworICAgICAgICAgdF9zZXJ2aWNlKiBuZXdTZXJ2aWNlRXh0ZW5kcyA9IChuZXdTZXJ2aWNlTWFwSXQtPnNlY29uZCktPmdldF9leHRlbmRzKCk7CisKKyAgICAgICAgIGlmKG9sZFNlcnZpY2VFeHRlbmRzID09IE5VTEwpCisgICAgICAgICB7CisgICAgICAgICAgICAvLyBJdCBpcyBmaW5lIHRvIGFkZCBleHRlbmRzLiBTbyBpZiBzZXJ2aWNlIGluIG9sZGVyIHRocmlmdCBkaWQgbm90IGhhdmUgYW55IGV4dGVuZHMsIHdlIGFyZSBmaW5lLgorICAgICAgICAgICAgLy8gRE8gTm90aGluZworICAgICAgICAgfQorICAgICAgICAgZWxzZSBpZihvbGRTZXJ2aWNlRXh0ZW5kcyAhPSBOVUxMICYmIG5ld1NlcnZpY2VFeHRlbmRzID09IE5VTEwpCisgICAgICAgICB7CisgICAgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiQ2hhbmdlIGluIFNlcnZpY2UgaW5oZXJpdGFuY2UgZm9yICVzXG4iLCBvbGRTZXJ2aWNlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9sZEV4dGVuZHNOYW1lID0gb2xkU2VydmljZUV4dGVuZHMtPmdldF9uYW1lKCk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBuZXdFeHRlbmRzTmFtZSA9IG5ld1NlcnZpY2VFeHRlbmRzLT5nZXRfbmFtZSgpOworCisgICAgICAgICAgICBpZiggbmV3RXh0ZW5kc05hbWUgIT0gb2xkRXh0ZW5kc05hbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiQ2hhbmdlIGluIFNlcnZpY2UgaW5oZXJpdGFuY2UgZm9yICVzXG4iLCBvbGRTZXJ2aWNlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgY29tcGFyZV9mdW5jdGlvbnMoKG5ld1NlcnZpY2VNYXBJdC0+c2Vjb25kKS0+Z2V0X2Z1bmN0aW9ucygpLCAoKm9sZFNlcnZpY2VJdCktPmdldF9mdW5jdGlvbnMoKSk7CisgICAgICB9CisKKyAgIH0KKworfQorCit2b2lkIGNvbXBhcmVfY29uc3RzKGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3QqPiYgbmV3Q29uc3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3QqPiYgb2xkQ29uc3QpCit7CisgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj46OmNvbnN0X2l0ZXJhdG9yIG5ld0NvbnN0SXQ7CisgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj46OmNvbnN0X2l0ZXJhdG9yIG9sZENvbnN0SXQ7CisKKyAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2NvbnN0Kj4gbmV3Q29uc3RNYXA7CisKKyAgIGZvcihuZXdDb25zdEl0ID0gbmV3Q29uc3QuYmVnaW4oKTsgbmV3Q29uc3RJdCAhPSBuZXdDb25zdC5lbmQoKTsgbmV3Q29uc3RJdCsrKQorICAgeworICAgICAgbmV3Q29uc3RNYXBbKCpuZXdDb25zdEl0KS0+Z2V0X25hbWUoKV0gPSAqbmV3Q29uc3RJdDsKKyAgIH0KKworICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfY29uc3QqPjo6Y29uc3RfaXRlcmF0b3IgbmV3Q29uc3RNYXBJdDsKKyAgIGZvcihvbGRDb25zdEl0ID0gb2xkQ29uc3QuYmVnaW4oKTsgb2xkQ29uc3RJdCAhPSBvbGRDb25zdC5lbmQoKTsgb2xkQ29uc3RJdCsrKQorICAgeworICAgICAgbmV3Q29uc3RNYXBJdCA9IG5ld0NvbnN0TWFwLmZpbmQoKCpvbGRDb25zdEl0KS0+Z2V0X25hbWUoKSk7CisgICAgICBpZihuZXdDb25zdE1hcEl0ID09IG5ld0NvbnN0TWFwLmVuZCgpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIkNvbnN0YW50cyBNaXNzaW5nICVzIFxuIiwgKCgqb2xkQ29uc3RJdCktPmdldF9uYW1lKCkpLmNfc3RyKCkpOworICAgICAgfQorICAgICAgZWxzZSBpZighY29tcGFyZV90eXBlKChuZXdDb25zdE1hcEl0LT5zZWNvbmQpLT5nZXRfdHlwZSgpLCAoKm9sZENvbnN0SXQpLT5nZXRfdHlwZSgpKSkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJDb25zdGFudCAlcyBpcyBvZiBkaWZmZXJlbnQgdHlwZSBcbiIsICgoKm9sZENvbnN0SXQpLT5nZXRfbmFtZSgpKS5jX3N0cigpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoIWNvbXBhcmVfZGVmYXVsdHMoKG5ld0NvbnN0TWFwSXQtPnNlY29uZCktPmdldF92YWx1ZSgpLCAoKm9sZENvbnN0SXQpLT5nZXRfdmFsdWUoKSkpCisgICAgICB7CisgICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiQ29uc3RhbnQgJXMgaGFzIGRpZmZlcmVudCB2YWx1ZVxuIiwgKCgqb2xkQ29uc3RJdCktPmdldF9uYW1lKCkpLmNfc3RyKCkpOworICAgICAgfQorICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNzllMzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBUX0FVRElUX0gKKyNkZWZpbmUgVF9BVURJVF9ICisKK3ZvaWQgY29tcGFyZV9uYW1lc3BhY2UodF9wcm9ncmFtKiBuZXdQcm9ncmFtLCB0X3Byb2dyYW0qIG9sZFByb2dyYW0pOwordm9pZCBjb21wYXJlX2VudW1zKGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bSo+JiBuZXdFbnVtTGlzdCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW0qPiYgb2xkRW51bUxpc3QpOworYm9vbCBjb21wYXJlX2RlZmF1bHRzKHRfY29uc3RfdmFsdWUqIG5ld1N0cnVjdERlZmF1bHQsIHRfY29uc3RfdmFsdWUqIG9sZFN0cnVjdERlZmF1bHQpOwordm9pZCBjb21wYXJlX3N0cnVjdHMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiYgbmV3U3RydWN0TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIG9sZFN0cnVjdExpc3QpOwordm9pZCBjb21wYXJlX3NlcnZpY2VzKGNvbnN0IHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+JiBuZXdTZXJ2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiYgb2xkU2VydmljZXMpOwordm9pZCBjb21wYXJlX2NvbnN0cyhjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4mIG5ld0NvbnN0LCBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4mIG9sZENvbnN0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9jb21tb24uY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9jb21tb24uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EyYjlkMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2NvbW1vbi5jYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJ0aHJpZnQvY29tbW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmgiCisKK3RfdHlwZSogZ190eXBlX3ZvaWQ7Cit0X3R5cGUqIGdfdHlwZV9zdHJpbmc7Cit0X3R5cGUqIGdfdHlwZV9iaW5hcnk7Cit0X3R5cGUqIGdfdHlwZV9zbGlzdDsKK3RfdHlwZSogZ190eXBlX2Jvb2w7Cit0X3R5cGUqIGdfdHlwZV9pODsKK3RfdHlwZSogZ190eXBlX2kxNjsKK3RfdHlwZSogZ190eXBlX2kzMjsKK3RfdHlwZSogZ190eXBlX2k2NDsKK3RfdHlwZSogZ190eXBlX2RvdWJsZTsKKwordm9pZCBpbml0R2xvYmFscygpIHsKKyAgZ190eXBlX3ZvaWQgPSBuZXcgdF9iYXNlX3R5cGUoInZvaWQiLCB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEKTsKKyAgZ190eXBlX3N0cmluZyA9IG5ldyB0X2Jhc2VfdHlwZSgic3RyaW5nIiwgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKTsKKyAgZ190eXBlX2JpbmFyeSA9IG5ldyB0X2Jhc2VfdHlwZSgic3RyaW5nIiwgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKTsKKyAgKCh0X2Jhc2VfdHlwZSopZ190eXBlX2JpbmFyeSktPnNldF9iaW5hcnkodHJ1ZSk7CisgIGdfdHlwZV9zbGlzdCA9IG5ldyB0X2Jhc2VfdHlwZSgic3RyaW5nIiwgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKTsKKyAgKCh0X2Jhc2VfdHlwZSopZ190eXBlX3NsaXN0KS0+c2V0X3N0cmluZ19saXN0KHRydWUpOworICBnX3R5cGVfYm9vbCA9IG5ldyB0X2Jhc2VfdHlwZSgiYm9vbCIsIHRfYmFzZV90eXBlOjpUWVBFX0JPT0wpOworICBnX3R5cGVfaTggPSBuZXcgdF9iYXNlX3R5cGUoImk4IiwgdF9iYXNlX3R5cGU6OlRZUEVfSTgpOworICBnX3R5cGVfaTE2ID0gbmV3IHRfYmFzZV90eXBlKCJpMTYiLCB0X2Jhc2VfdHlwZTo6VFlQRV9JMTYpOworICBnX3R5cGVfaTMyID0gbmV3IHRfYmFzZV90eXBlKCJpMzIiLCB0X2Jhc2VfdHlwZTo6VFlQRV9JMzIpOworICBnX3R5cGVfaTY0ID0gbmV3IHRfYmFzZV90eXBlKCJpNjQiLCB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQpOworICBnX3R5cGVfZG91YmxlID0gbmV3IHRfYmFzZV90eXBlKCJkb3VibGUiLCB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUpOworfQorCit2b2lkIGNsZWFyR2xvYmFscygpIHsKKyAgZGVsZXRlIGdfdHlwZV92b2lkOworICBkZWxldGUgZ190eXBlX3N0cmluZzsKKyAgZGVsZXRlIGdfdHlwZV9ib29sOworICBkZWxldGUgZ190eXBlX2k4OworICBkZWxldGUgZ190eXBlX2kxNjsKKyAgZGVsZXRlIGdfdHlwZV9pMzI7CisgIGRlbGV0ZSBnX3R5cGVfaTY0OworICBkZWxldGUgZ190eXBlX2RvdWJsZTsKK30KKworLyoqCisgKiBUaG9zZSBhcmUgbm90IHJlYWxseSBuZWVkZWQgZm9yIHBsdWdpbnMgYnV0IGNhdXNlcyBsaW5rIGVycm9ycyB3aXRob3V0CisgKi8KKworLyoqCisgKiBUaGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgcGFyc2VkIGRvY3RleHQgY29tbWVudC4KKyAqLworaW50IGdfZG9jdGV4dF9saW5lbm87CitpbnQgZ19wcm9ncmFtX2RvY3RleHRfbGluZW5vID0gMDsKK1BST0dET0NURVhUX1NUQVRVUyBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBJTlZBTElEOwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvY29tbW9uLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTQ4ODQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvY29tbW9uLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfQ09NTU9OX0gKKyNkZWZpbmUgVF9DT01NT05fSAorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorCisvKioKKyAqIEdsb2JhbCB0eXBlcyBmb3IgdGhlIHBhcnNlciB0byBiZSBhYmxlIHRvIHJlZmVyZW5jZQorICovCisKK2V4dGVybiB0X3R5cGUqIGdfdHlwZV92b2lkOworZXh0ZXJuIHRfdHlwZSogZ190eXBlX3N0cmluZzsKK2V4dGVybiB0X3R5cGUqIGdfdHlwZV9iaW5hcnk7CitleHRlcm4gdF90eXBlKiBnX3R5cGVfc2xpc3Q7CitleHRlcm4gdF90eXBlKiBnX3R5cGVfYm9vbDsKK2V4dGVybiB0X3R5cGUqIGdfdHlwZV9pODsKK2V4dGVybiB0X3R5cGUqIGdfdHlwZV9pMTY7CitleHRlcm4gdF90eXBlKiBnX3R5cGVfaTMyOworZXh0ZXJuIHRfdHlwZSogZ190eXBlX2k2NDsKK2V4dGVybiB0X3R5cGUqIGdfdHlwZV9kb3VibGU7CisKK3ZvaWQgaW5pdEdsb2JhbHMoKTsKK3ZvaWQgY2xlYXJHbG9iYWxzKCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9hczNfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9hczNfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNzI0ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2FzM19nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwyNTk0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBBUzMgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X2FzM19nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9hczNfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGJpbmRhYmxlXyA9IGZhbHNlOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImJpbmRhYmxlIikgPT0gMCkgeworICAgICAgICBiaW5kYWJsZV8gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGFzMzoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tYXMzIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7CisgIC8vIHJlbW92ZWQgLS0gZXF1YWxpdHksY29tcGFyZV90bworICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfYXMzX3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYmluZGFibGUpOworICB2b2lkIGdlbmVyYXRlX2FzM19tZXRhX2RhdGFfbWFwKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOworICBzdGQ6OnN0cmluZyBnZXRfYXMzX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSk7CisgIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9hczNfYmVhbl9ib2lsZXJwbGF0ZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYmluZGFibGUpOworCisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGQpOworICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKKyAgLy8gcmVtb3ZlZCBzdGQ6OnN0cmluZyBpc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9hczNfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisKKyAgdm9pZCBnZW5lcmF0ZV9hczNfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZG9jKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgYXMzX3BhY2thZ2UoKTsKKyAgc3RkOjpzdHJpbmcgYXMzX3R5cGVfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyBhczNfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nJiBpbXBvcnRzKTsKKyAgc3RkOjpzdHJpbmcgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UsIGJvb2wgaW5faW5pdCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLCBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSk7CisKKyAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKKyAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworCisgICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkKKyAgICAgICAgICAgfHwgdHR5cGUtPmlzX3N0cmluZygpOworICB9CisKKyAgc3RkOjpzdHJpbmcgY29uc3RhbnRfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKKworICBib29sIGJpbmRhYmxlXzsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisgIHBhY2thZ2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiYXMzIik7CisKKyAgc3RyaW5nIGRpciA9IHBhY2thZ2VfbmFtZV87CisgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpOworICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisgIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOworICB9CisgIGlmIChkaXIuc2l6ZSgpID4gMCkgeworICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgIH0KKworICBwYWNrYWdlX2Rpcl8gPSBzdWJkaXI7Cit9CisKKy8qKgorICogUGFja2FnZXMgdGhlIGdlbmVyYXRlZCBmaWxlCisgKgorICogQHJldHVybiBTdHJpbmcgb2YgdGhlIHBhY2thZ2UsIGkuZS4gInBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnRkZW1vOyIKKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXMzX3BhY2thZ2UoKSB7CisgIGlmICghcGFja2FnZV9uYW1lXy5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHN0cmluZygicGFja2FnZSAiKSArIHBhY2thZ2VfbmFtZV8gKyAiICI7CisgIH0KKyAgcmV0dXJuICJwYWNrYWdlICI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIGFzMyBpbXBvcnRzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgZm9yIEFzMyB0eXBlcyB0aGF0IGFyZSB1c2VkIGluIGhlcmUKKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXMzX3R5cGVfaW1wb3J0cygpIHsKKyAgcmV0dXJuIHN0cmluZygpICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5TZXQ7XG4iICsgImltcG9ydCBmbGFzaC51dGlscy5CeXRlQXJyYXk7XG4iCisgICAgICAgICArICJpbXBvcnQgZmxhc2gudXRpbHMuRGljdGlvbmFyeTtcblxuIjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgYXMzIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIHRocmlmdAorICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphczNfdGhyaWZ0X2ltcG9ydHMoKSB7CisgIHJldHVybiBzdHJpbmcoKSArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjtcbiIgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qO1xuIgorICAgICAgICAgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7XG5cbiI7Cit9CisKKy8qKgorICogUHJpbnRzIGltcG9ydHMgbmVlZGVkIGZvciBhIGdpdmVuIHR5cGUKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGEgZ2l2ZW4gdF9zdHJ1Y3QKKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXMzX3RocmlmdF9nZW5faW1wb3J0cyh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nJiBpbXBvcnRzKSB7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICAvLyBGb3IgZWFjaCB0eXBlIGNoZWNrIGlmIGl0IGlzIGZyb20gYSBkaWZmZXJuZXQgbmFtZXNwYWNlCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSAoKm1faXRlciktPmdldF90eXBlKCktPmdldF9wcm9ncmFtKCk7CisgICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImFzMyIpOworICAgICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKKyAgICAgICAgaWYgKGltcG9ydHMuZmluZChwYWNrYWdlICsgIi4iICsgKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICBpbXBvcnRzLmFwcGVuZCgiaW1wb3J0ICIgKyBwYWNrYWdlICsgIi4iICsgKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpICsgIjtcbiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBpbXBvcnRzOworfQorCisvKioKKyAqIFByaW50cyBpbXBvcnRzIG5lZWRlZCBmb3IgYSBnaXZlbiB0eXBlCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBhIGdpdmVuIHRfc2VydmljZQorICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGltcG9ydHM7CisgIGNvbnN0IHZlY3Rvcjx0X2Z1bmN0aW9uKj4mIGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBGb3IgZWFjaCB0eXBlIGNoZWNrIGlmIGl0IGlzIGZyb20gYSBkaWZmZXJuZXQgbmFtZXNwYWNlCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfcHJvZ3JhbSgpOworICAgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJhczMiKTsKKyAgICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7CisgICAgICAgIGlmIChpbXBvcnRzLmZpbmQocGFja2FnZSArICIuIiArICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X25hbWUoKSkgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgaW1wb3J0cy5hcHBlbmQoImltcG9ydCAiICsgcGFja2FnZSArICIuIiArICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgIjtcbiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgYXMzX3RocmlmdF9nZW5faW1wb3J0cygoKmZfaXRlciktPmdldF9hcmdsaXN0KCksIGltcG9ydHMpOworICAgIGFzM190aHJpZnRfZ2VuX2ltcG9ydHMoKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCksIGltcG9ydHMpOworICB9CisKKyAgcmV0dXJuIGltcG9ydHM7Cit9CisKKy8qKgorICogTm90aGluZyBpbiBBczMKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIEFzMywgc2luY2UgaXQgZG9lcworICogbm90IHN1cHBvcnQgYXJiaXRyYXJ5IG5hbWUgcmVwbGFjZW1lbnRzLCBhbmQgaXQnZCBiZSBhIHdhY2t5IHdhc3RlCisgKiBvZiBvdmVyaGVhZCB0byBtYWtlIHdyYXBwZXIgY2xhc3Nlcy4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEVudW1zIGFyZSBhIGNsYXNzIHdpdGggYSBzZXQgb2Ygc3RhdGljIGNvbnN0YW50cy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9lbnVtX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAodGVudW0tPmdldF9uYW1lKCkpICsgIi5hcyI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9lbnVtOworICBmX2VudW0ub3BlbihmX2VudW1fbmFtZSk7CisKKyAgLy8gQ29tbWVudCBhbmQgcGFja2FnZSBpdAorICBmX2VudW0gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKSA8PCBlbmRsOworCisgIHNjb3BlX3VwKGZfZW51bSk7CisgIC8vIEFkZCBhczMgaW1wb3J0cworICBmX2VudW0gPDwgc3RyaW5nKCkgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlNldDsiIDw8IGVuZGwgPDwgImltcG9ydCBmbGFzaC51dGlscy5EaWN0aW9uYXJ5OyIKKyAgICAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgIjsKKyAgc2NvcGVfdXAoZl9lbnVtKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyBjb25zdCAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOmludCA9ICIgPDwgdmFsdWUgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIC8vIENyZWF0ZSBhIHN0YXRpYyBTZXQgd2l0aCBhbGwgdmFsaWQgdmFsdWVzIGZvciB0aGlzIGVudW0KKyAgZl9lbnVtIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgVkFMSURfVkFMVUVTOlNldCA9IG5ldyBTZXQoIjsKKyAgaW5kZW50X3VwKCk7CisgIGJvb2wgZmlyc3RWYWx1ZSA9IHRydWU7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgLy8gcG9wdWxhdGUgc2V0CisgICAgZl9lbnVtIDw8IChmaXJzdFZhbHVlID8gIiIgOiAiLCAiKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgZmlyc3RWYWx1ZSA9IGZhbHNlOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfZW51bSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgVkFMVUVTX1RPX05BTUVTOkRpY3Rpb25hcnkgPSBuZXcgRGljdGlvbmFyeSgpOyIgPDwgZW5kbDsKKworICBzY29wZV91cChmX2VudW0pOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGluZGVudChmX2VudW0pIDw8ICJWQUxVRVNfVE9fTkFNRVNbIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIl0gPSBcIiIKKyAgICAgICAgICAgICAgICAgICA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiOyIgPDwgZW5kbDsKKyAgfQorICBmX2VudW0gPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfZW51bSk7CisKKyAgc2NvcGVfZG93bihmX2VudW0pOyAvLyBlbmQgY2xhc3MKKworICBzY29wZV9kb3duKGZfZW51bSk7IC8vIGVuZCBwYWNrYWdlCisKKyAgZl9lbnVtLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIGlmIChjb25zdHMuZW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICJDb25zdGFudHMuYXMiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOworICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX2NvbnN0cyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpOworCisgIHNjb3BlX3VwKGZfY29uc3RzKTsKKyAgZl9jb25zdHMgPDwgZW5kbDsKKworICBmX2NvbnN0cyA8PCBhczNfdHlwZV9pbXBvcnRzKCk7CisKKyAgaW5kZW50KGZfY29uc3RzKSA8PCAicHVibGljIGNsYXNzICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2NvbnN0cykgPDwgIn0iIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9jb25zdHMpOworICBmX2NvbnN0cy5jbG9zZSgpOworfQorCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGluZGVudChvdXQpOworICBpZiAoIWRlZnZhbCkgeworICAgIG91dCA8PCAoaW5fc3RhdGljID8gInZhciAiIDogInB1YmxpYyBzdGF0aWMgY29uc3QgIik7CisgIH0KKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIG91dCA8PCBuYW1lOworICAgIGlmICghZGVmdmFsKSB7CisgICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKKyAgICB9CisgICAgb3V0IDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8IG5hbWU7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgIH0KKyAgICBvdXQgPDwgIiA9ICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3V0IDw8IG5hbWUgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IgorICAgICAgICA8PCBlbmRsOworICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpOnZvaWQgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iOworICAgICAgb3V0IDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IG5hbWU7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgIH0KKyAgICBvdXQgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKTp2b2lkIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9KCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgbmFtZTsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgfQorICAgIG91dCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpOnZvaWQgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiIgPDwgKHR5cGUtPmlzX2xpc3QoKSA/ICJwdXNoIiA6ICJhZGQiKSA8PCAiKCIgPDwgdmFsIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICAodm9pZCluYW1lOworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZW5kZXIgPDwgIihieXRlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJlbmRlciA8PCAiKHNob3J0KSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8ICIoZG91YmxlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgeworICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKKyAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlKTsKKyAgICByZW5kZXIgPDwgdDsKKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBhIGNsYXNzCisgKiB3aXRoIGRhdGEgbWVtYmVycywgcmVhZCgpLCB3cml0ZSgpLCBhbmQgYW4gaW5uZXIgSXNzZXQgY2xhc3MuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfYXMzX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9hczNfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogQXMzIHN0cnVjdCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuYXMiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc3RydWN0OworICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CisKKyAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKKworICBzY29wZV91cChmX3N0cnVjdCk7CisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgc3RyaW5nIGltcG9ydHM7CisKKyAgZl9zdHJ1Y3QgPDwgYXMzX3R5cGVfaW1wb3J0cygpIDw8IGFzM190aHJpZnRfaW1wb3J0cygpIDw8IGFzM190aHJpZnRfZ2VuX2ltcG9ydHModHN0cnVjdCwgaW1wb3J0cykKKyAgICAgICAgICAgPDwgZW5kbDsKKworICBpZiAoYmluZGFibGVfICYmICFpc19leGNlcHRpb24pIHsKKyAgICBmX3N0cnVjdCA8PCAiaW1wb3J0IGZsYXNoLmV2ZW50cy5FdmVudDsiIDw8IGVuZGwgPDwgImltcG9ydCBmbGFzaC5ldmVudHMuRXZlbnREaXNwYXRjaGVyOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICJpbXBvcnQgbXguZXZlbnRzLlByb3BlcnR5Q2hhbmdlRXZlbnQ7IiA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworCisgIHNjb3BlX2Rvd24oZl9zdHJ1Y3QpOyAvLyBlbmQgb2YgcGFja2FnZQorICBmX3N0cnVjdC5jbG9zZSgpOworfQorCisvKioKKyAqIEFzMyBzdHJ1Y3QgZGVmaW5pdGlvbi4gVGhpcyBoYXMgdmFyaW91cyBwYXJhbWV0ZXJzLCBhcyBpdCBjb3VsZCBiZQorICogZ2VuZXJhdGVkIHN0YW5kYWxvbmUgb3IgaW5zaWRlIGFub3RoZXIgY2xhc3MgYXMgYSBoZWxwZXIuIElmIGl0CisgKiBpcyBhIGhlbHBlciB0aGFuIGl0IGlzIGEgc3RhdGljIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0c3RydWN0ICAgICAgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBAcGFyYW0gaXNfZXhjZXB0aW9uIElzIHRoaXMgYW4gZXhjZXB0aW9uPworICogQHBhcmFtIGluX2NsYXNzICAgICBJZiBpbnNpZGUgYSBjbGFzcywgbmVlZHMgdG8gYmUgc3RhdGljIGNsYXNzCisgKiBAcGFyYW0gaXNfcmVzdWx0ICAgIElmIHRoaXMgaXMgYSByZXN1bHQgaXQgbmVlZHMgYSBkaWZmZXJlbnQgd3JpdGVyCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgIGdlbmVyYXRlX2FzM19kb2Mob3V0LCB0c3RydWN0KTsKKworICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7CisgIGJvb2wgYmluZGFibGUgPSAhaXNfZXhjZXB0aW9uICYmICFpbl9jbGFzcyAmJiBiaW5kYWJsZV87CisKKyAgaW5kZW50KG91dCkgPDwgKGluX2NsYXNzID8gIiIgOiAicHVibGljICIpIDw8IChpc19maW5hbCA/ICJmaW5hbCAiIDogIiIpIDw8ICJjbGFzcyAiCisgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAiOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgImV4dGVuZHMgRXJyb3IgIjsKKyAgfSBlbHNlIGlmIChiaW5kYWJsZSkgeworICAgIG91dCA8PCAiZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIgIjsKKyAgfQorICBvdXQgPDwgImltcGxlbWVudHMgVEJhc2UgIjsKKworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBjb25zdCBTVFJVQ1RfREVTQzpUU3RydWN0ID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIlwiKTsiIDw8IGVuZGw7CisKKyAgLy8gTWVtYmVycyBhcmUgcHVibGljIGZvciAtYXMzLCBwcml2YXRlIGZvciAtYXMzYmVhbgorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgY29uc3QgIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0M6VEZpZWxkID0gbmV3IFRGaWVsZChcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgZ2VuZXJhdGVfYXMzX2RvYyhvdXQsICptX2l0ZXIpOworICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHZhciBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgKyAiOiIgKyB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgIiA8PCB1cGNhc2Vfc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiOmludCA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBJbm5lciBJc3NldCBjbGFzcworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgdmFyIF9faXNzZXRfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjpCb29sZWFuID0gZmFsc2U7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2FzM19tZXRhX2RhdGFfbWFwKG91dCwgdHN0cnVjdCk7CisKKyAgLy8gU3RhdGljIGluaXRpYWxpemVyIHRvIHBvcHVsYXRlIGdsb2JhbCBjbGFzcyB0byBzdHJ1Y3QgbWV0YWRhdGEgbWFwCisgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiwgbWV0YURhdGFNYXApOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKS0+Z2V0X2ludGVnZXIoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9hczNfYmVhbl9ib2lsZXJwbGF0ZShvdXQsIHRzdHJ1Y3QsIGJpbmRhYmxlKTsKKyAgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qob3V0LCB0c3RydWN0KTsKKworICBnZW5lcmF0ZV9hczNfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBpZiAoaXNfcmVzdWx0KSB7CisgICAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfYXMzX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfQorICBnZW5lcmF0ZV9hczNfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCwgYmluZGFibGUpOworICBnZW5lcmF0ZV9hczNfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiByZWFkKGlwcm90OlRQcm90b2NvbCk6dm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzIGFuZCByZWFkIHN0cnVjdCBoZWFkZXIKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmllbGQ6VEZpZWxkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCisgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7ICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkLmlkKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICpmX2l0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAorICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBpbiBub24tYmVhbnMgc3R5bGUsIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUKKyAgLy8gKHdoaWNoIGNhbiBiZSBjaGVja2VkIGhlcmUgYnV0IG5vdCBpbiB0aGUgZ2VuZXJhbCB2YWxpZGF0ZSBtZXRob2QpCisgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlLCB3aGljaCBjYW4ndCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGVja2VkIGluIHRoZSB2YWxpZGF0ZSBtZXRob2QiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQgJiYgIXR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIV9faXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvci5VTktOT1dOLCBcIlJlcXVpcmVkIGZpZWxkICciCisgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgPDwgIicgd2FzIG5vdCBmb3VuZCBpbiBzZXJpYWxpemVkIGRhdGEhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvLyBnZW5lcmF0ZXMgYXMzIG1ldGhvZCB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCisvLyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZSgpOnZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yLlVOS05PV04sIFwiUmVxdWlyZWQgZmllbGQgJyIKKyAgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIHdhcyBub3QgcHJlc2VudCEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gYWxhcywgd2UgY2Fubm90IGNoZWNrICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiJyBiZWNhdXNlIGl0J3MgYSBwcmltaXRpdmUgYW5kIHlvdSBjaG9zZSB0aGUgbm9uLWJlYW5zIGdlbmVyYXRvci4iIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOworICAgIC8vIGlmIGZpZWxkIGlzIGFuIGVudW0sIGNoZWNrIHRoYXQgaXRzIHZhbHVlIGlzIHZhbGlkCisgICAgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiICYmICEiIDw8IGdldF9lbnVtX2NsYXNzX25hbWUodHlwZSkKKyAgICAgICAgICAgICAgICAgIDw8ICIuVkFMSURfVkFMVUVTLmNvbnRhaW5zKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIikpeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvci5VTktOT1dOLCBcIlRoZSBmaWVsZCAnIgorICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIicgaGFzIGJlZW4gYXNzaWduZWQgdGhlIGludmFsaWQgdmFsdWUgXCIgKyAiCisgICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIHdyaXRlKG9wcm90OlRQcm90b2NvbCk6dm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiCisgICAgICA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QsCisgKiB3aGljaCBpcyBhIGZ1bmN0aW9uIHJlc3VsdC4gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4KKyAqIGlmIHRoZXkgYXJlIHNldCBpbiB0aGUgSXNzZXQgYXJyYXksIGFuZCBvbmx5IG9uZSBvZiB0aGVtCisgKiBjYW4gYmUgc2V0IGF0IGEgdGltZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIHdyaXRlKG9wcm90OlRQcm90b2NvbCk6dm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIgZWxzZSBpZiAiOworICAgIH0KKworICAgIG91dCA8PCAiKHRoaXMuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgfQorICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjYXBfbmFtZSkgeworICAodm9pZCl0eXBlOworICAodm9pZCljYXBfbmFtZTsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjYXBfbmFtZSkgeworICAodm9pZCl0eXBlOworICAodm9pZCljYXBfbmFtZTsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZSA9PSBudWxsKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB1bnNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IHZhbHVlOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gZ2V0dGVyX3N0cmVhbTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNldHRlcl9zdHJlYW07CisKKyAgLy8gYnVpbGQgdXAgdGhlIGJvZGllcyBvZiBib3RoIHRoZSBnZXR0ZXIgYW5kIHNldHRlciBhdCBvbmNlCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOworCisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHNldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKKyAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoZ2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBjcmVhdGUgdGhlIHNldHRlcgorICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHNldEZpZWxkVmFsdWUoZmllbGRJRDppbnQsIHZhbHVlOiopOnZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKKworICBvdXQgPDwgc2V0dGVyX3N0cmVhbS5zdHIoKTsKKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gY3JlYXRlIHRoZSBnZXR0ZXIKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXRGaWVsZFZhbHVlKGZpZWxkSUQ6aW50KToqIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7CisKKyAgb3V0IDw8IGdldHRlcl9zdHJlYW0uc3RyKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8vIENyZWF0ZXMgYSBnZW5lcmljIGlzU2V0IG1ldGhvZCB0aGF0IHRha2VzIHRoZSBmaWVsZCBudW1iZXIgYXMgYXJndW1lbnQKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIGNyZWF0ZSB0aGUgaXNTZXQgbWV0aG9kCisgIGluZGVudChvdXQpIDw8ICIvLyBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSAiCisgICAgICAgICAgICAgICAgICJ2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBpc1NldChmaWVsZElEOmludCk6Qm9vbGVhbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXQgb2YgQXMzIEJlYW4gYm9pbGVycGxhdGUgZnVuY3Rpb25zIChzZXR0ZXJzLCBnZXR0ZXJzLCBldGMuKQorICogZm9yIHRoZSBnaXZlbiBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfYmVhbl9ib2lsZXJwbGF0ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiaW5kYWJsZSkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKKworICAgIC8vIFNpbXBsZSBnZXR0ZXIKKyAgICBnZW5lcmF0ZV9hczNfZG9jKG91dCwgZmllbGQpOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0ICIgPDwgZmllbGRfbmFtZSA8PCAiKCk6IiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy5fIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFNpbXBsZSBzZXR0ZXIKKyAgICBnZW5lcmF0ZV9hczNfZG9jKG91dCwgZmllbGQpOworICAgIHN0ZDo6c3RyaW5nIHByb3BOYW1lID0gdG1wKCJ0aHJpZnRQcm9wZXJ0eUNoYW5nZSIpOworICAgIGlmIChiaW5kYWJsZSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIltCaW5kYWJsZShldmVudD1cIiIgPDwgcHJvcE5hbWUgPDwgIlwiKV0iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gc2V0ICIgPDwgZmllbGRfbmFtZSA8PCAiKCIgPDwgZmllbGRfbmFtZSA8PCAiOiIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodHlwZSkgPDwgIik6dm9pZCB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl8iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCBmaWVsZCk7CisKKyAgICBpZiAoYmluZGFibGUpIHsKKyAgICAgIC8vIFdlIGhhdmUgdG8gdXNlIGEgY3VzdG9tIGV2ZW50IHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0LCBiZWNhdXNlIGlmIHlvdSB1c2UgdGhlIGRlZmF1bHQsCisgICAgICAvLyB0aGUgc2V0dGVyIG9ubHkgZ2V0cyBjYWxsZWQgaWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkIC0gdGhpcyBtZWFucyBjYWxsaW5nCisgICAgICAvLyBmb28uc2V0SW50VmFsdWUoMCkKKyAgICAgIC8vIHdpbGwgbm90IGNhdXNlIGZvby5pc0ludFZhbHVlU2V0KCkgdG8gcmV0dXJuIHRydWUgc2luY2UgdGhlIHZhbHVlIG9mIGZvby5faW50VmFsdWUgd2Fzbid0CisgICAgICAvLyBjaGFuZ2VkCisgICAgICAvLyBzbyB0aGUgc2V0dGVyIHdhcyBuZXZlciBjYWxsZWQuCisgICAgICBpbmRlbnQob3V0KSA8PCAiZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCIiIDw8IHByb3BOYW1lIDw8ICJcIikpOyIgPDwgZW5kbDsKKworICAgICAgLy8gSG93ZXZlciwgaWYgeW91IGp1c3QgdXNlIGEgY3VzdG9tIGV2ZW50LCB0aGVuIGNvbGxlY3Rpb25zIHdvbid0IGJlIGFibGUgdG8gZGV0ZWN0IHdoZW4KKyAgICAgIC8vIGVsZW1lbnRzCisgICAgICAvLyBpbiB0aGUgY29sbGVjdGlvbnMgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZXkgbGlzdGVkIGZvciBQcm9wZXJ0eUNoYW5nZUV2ZW50cy4gIFNvLCB3ZQorICAgICAgLy8gZGlzcGF0Y2ggYm90aC4KKyAgICAgIGluZGVudChvdXQpIDw8ICJkaXNwYXRjaEV2ZW50KG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KFByb3BlcnR5Q2hhbmdlRXZlbnQuUFJPUEVSVFlfQ0hBTkdFKSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gVW5zZXR0ZXIKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCk6dm9pZCB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBpc1NldCBtZXRob2QKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8gUmV0dXJucyB0cnVlIGlmIGZpZWxkICIgPDwgZmllbGRfbmFtZQorICAgICAgICAgICAgICAgIDw8ICIgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gaXMiIDw8IGdldF9jYXBfbmFtZSgic2V0IikgPDwgY2FwX25hbWUgPDwgIigpOkJvb2xlYW4geyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy5fX2lzc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdG9TdHJpbmcoKSBtZXRob2QgZm9yIHRoZSBnaXZlbiBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJpbmRhYmxlKSB7CisgIC8vIElmIGl0J3MgYmluZGFibGUsIGl0IGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHNvIHRvU3RyaW5nIGlzIGFuIG92ZXJyaWRlLgorICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8IChiaW5kYWJsZSA/ICJvdmVycmlkZSAiIDogIiIpIDw8ICJmdW5jdGlvbiB0b1N0cmluZygpOlN0cmluZyB7IgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgcmV0OlN0cmluZyA9IG5ldyBTdHJpbmcoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIik7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBmaXJzdDpCb29sZWFuID0gdHJ1ZTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgY291bGRfYmVfdW5zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKworICAgIGlmICghZmlyc3QpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIWZpcnN0KSByZXQgKz0gIFwiLCBcIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiOyIgPDwgZW5kbDsKKyAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwibnVsbFwiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIkJJTkFSWVwiOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIl9uYW1lOlN0cmluZyA9ICIgPDwgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgICAgIDw8ICIuVkFMVUVTX1RPX05BTUVTW3RoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl07IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZSAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9ICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIiAoXCI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0ICs9IHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWUgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIilcIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldCArPSB0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiZmlyc3QgPSBmYWxzZTsiIDw8IGVuZGw7CisKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgfQorICBvdXQgPDwgaW5kZW50KCkgPDwgInJldCArPSBcIilcIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiByZXQ7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RhdGljIG1hcCB3aXRoIG1ldGEgZGF0YSB0byBzdG9yZSBpbmZvcm1hdGlvbiBzdWNoIGFzIGZpZWxkSUQgdG8KKyAqIGZpZWxkTmFtZSBtYXBwaW5nCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfbWV0YV9kYXRhX21hcChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBTdGF0aWMgTWFwIHdpdGggZmllbGRJRCAtPiBGaWVsZE1ldGFEYXRhIG1hcHBpbmdzCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIGNvbnN0IG1ldGFEYXRhTWFwOkRpY3Rpb25hcnkgPSBuZXcgRGljdGlvbmFyeSgpOyIgPDwgZW5kbDsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICAvLyBQb3B1bGF0ZSBtYXAKKyAgICBzY29wZV91cChvdXQpOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAibWV0YURhdGFNYXBbIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICJdID0gbmV3IEZpZWxkTWV0YURhdGEoXCIiCisgICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lIDw8ICJcIiwgIjsKKworICAgICAgLy8gU2V0IGZpZWxkIHJlcXVpcmVtZW50IHR5cGUgKHJlcXVpcmVkLCBvcHRpb25hbCwgZXRjLikKKyAgICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuUkVRVUlSRUQsICI7CisgICAgICB9IGVsc2UgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsICI7CisgICAgICB9CisKKyAgICAgIC8vIENyZWF0ZSB2YWx1ZSBtZXRhIGRhdGEKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorfQorCisvKioKKyAqIFJldHVybnMgYSBzdHJpbmcgd2l0aCB0aGUgYXMzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiB0aHJpZnQgdHlwZQorICogKGUuZy4gZm9yIHRoZSB0eXBlIHN0cnVjdCBpdCByZXR1cm5zICJUVHlwZS5TVFJVQ1QiKQorICovCitzdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdldF9hczNfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKSB7CisgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxJU1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJldHVybiBnZXRfYXMzX3R5cGVfc3RyaW5nKCgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJUVHlwZS5WT0lEIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9hczNfZ2VuZXJhdG9yOjpnZXRfYXMzX3R5cGVfc3RyaW5nISIpOworICAgICAgYnJlYWs7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKAorICAgICAgICAiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2FzM19nZW5lcmF0b3I6OmdldF9hczNfdHlwZV9zdHJpbmchIik7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKKyAgfQorfQorCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpIHsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibmV3IFN0cnVjdE1ldGFEYXRhKFRUeXBlLlNUUlVDVCwgIiA8PCB0eXBlX25hbWUodHlwZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IExpc3RNZXRhRGF0YShUVHlwZS5MSVNULCAiOworICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBTZXRNZXRhRGF0YShUVHlwZS5TRVQsICI7CisgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsKKyAgICB9IGVsc2UgeyAvLyBtYXAKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgTWFwTWV0YURhdGEoVFR5cGUuTUFQLCAiOworICAgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBrZXlfdHlwZSk7CisgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIHZhbF90eXBlKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIm5ldyBGaWVsZFZhbHVlTWV0YURhdGEoIiA8PCBnZXRfYXMzX3R5cGVfc3RyaW5nKHR5cGUpOworICB9CisgIG91dCA8PCAiKSI7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKKyAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcworICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgorICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIE1ha2UgaW50ZXJmYWNlIGZpbGUKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICIuYXMiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpOworCisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBhczNfdHlwZV9pbXBvcnRzKCkgPDwgYXMzX3RocmlmdF9pbXBvcnRzKCkKKyAgICAgICAgICAgICA8PCBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIHRfdHlwZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgc3RyaW5nIHBhcmVudF9uYW1lc3BhY2UgPSBwYXJlbnQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImFzMyIpOworICAgIGlmICghcGFyZW50X25hbWVzcGFjZS5lbXB0eSgpICYmIHBhcmVudF9uYW1lc3BhY2UgIT0gcGFja2FnZV9uYW1lXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgdHlwZV9uYW1lKHBhcmVudCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfLmNsb3NlKCk7CisKKyAgLy8gTm93IG1ha2UgdGhlIGltcGxlbWVudGF0aW9uL2NsaWVudCBmaWxlCisgIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICJJbXBsLmFzIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKKworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgYXMzX3R5cGVfaW1wb3J0cygpIDw8IGFzM190aHJpZnRfaW1wb3J0cygpCisgICAgICAgICAgICAgPDwgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSk7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICB0X3R5cGUqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIHN0cmluZyBwYXJlbnRfbmFtZXNwYWNlID0gcGFyZW50LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJhczMiKTsKKyAgICBpZiAoIXBhcmVudF9uYW1lc3BhY2UuZW1wdHkoKSAmJiBwYXJlbnRfbmFtZXNwYWNlICE9IHBhY2thZ2VfbmFtZV8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHR5cGVfbmFtZShwYXJlbnQpIDw8ICJJbXBsOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgYXMzX3R5cGVfaW1wb3J0cygpOworICBmX3NlcnZpY2VfIDw8IGFzM190aHJpZnRfaW1wb3J0cygpOworICBmX3NlcnZpY2VfIDw8IGFzM190aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpOworICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi4qOyIgPDwgZW5kbDsKKyAgfQorCisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworCisgIC8vIE5vdyBtYWtlIHRoZSBwcm9jZXNzb3Ivc2VydmVyIGZpbGUKKyAgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIlByb2Nlc3Nvci5hcyI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7CisKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGFzM190eXBlX2ltcG9ydHMoKSA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKQorICAgICAgICAgICAgIDw8IGFzM190aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgYXMzX3R5cGVfaW1wb3J0cygpOworICBmX3NlcnZpY2VfIDw8IGFzM190aHJpZnRfaW1wb3J0cygpOworICBmX3NlcnZpY2VfIDw8IGFzM190aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpIDw8IGVuZGw7CisgIGlmICghcGFja2FnZV9uYW1lXy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLio7IiA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKworICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzX2lmYWNlID0gIiBleHRlbmRzICIgKyB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGdlbmVyYXRlX2FzM19kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlICIgPDwgc2VydmljZV9uYW1lXyA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9hczNfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvbkVycm9yKEVycm9yKTp2b2lkOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uU3VjY2VzcygpOnZvaWQ7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uRXJyb3IoRXJyb3IpOnZvaWQ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25TdWNjZXNzKCIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpOnZvaWQ7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgYXJncyBhbmQgcmV0dXJuIHR5cGVzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgdHJ1ZSk7CisgICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfY2xpZW50ID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIkltcGwiOworICB9CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJbXBsIiA8PCBleHRlbmRzX2NsaWVudAorICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSW1wbCIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIoaXByb3Q6VFByb3RvY29sLCBvcHJvdDpUUHJvdG9jb2w9bnVsbCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3RfID0gaXByb3Q7IiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChvcHJvdCA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IGlwcm90OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IG9wcm90OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN1cGVyKGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworICB9CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIHZhciBpcHJvdF86VFByb3RvY29sOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInByb3RlY3RlZCB2YXIgb3Byb3RfOlRQcm90b2NvbDsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInByb3RlY3RlZCB2YXIgc2VxaWRfOmludDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uIGdldElucHV0UHJvdG9jb2woKTpUUHJvdG9jb2wiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gdGhpcy5pcHJvdF87IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0T3V0cHV0UHJvdG9jb2woKTpUUHJvdG9jb2wiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gdGhpcy5vcHJvdF87IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uRXJyb3IoRXJyb3IpOnZvaWQ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25TdWNjZXNzKCk6dm9pZDsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25FcnJvcihFcnJvcik6dm9pZDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvblN1Y2Nlc3MoIiA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIik6dm9pZDsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PTkVXQVkiIDogIlRNZXNzYWdlVHlwZS5DQUxMIikKKyAgICAgICAgICAgICAgIDw8ICIsIHNlcWlkXykpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmFyIGFyZ3M6IiA8PCBhcmdzbmFtZSA8PCAiID0gbmV3ICIKKyAgICAgICAgICAgICAgIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUob3Byb3RfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgaWYgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLmdldFRyYW5zcG9ydCgpLmZsdXNoKGZ1bmN0aW9uKGVycm9yOkVycm9yKTp2b2lkIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChlcnJvciAhPSBudWxsKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgIGlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoZXJyb3IpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm47IgorICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJ2YXIgbXNnOlRNZXNzYWdlID0gaXByb3RfLnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgImlmIChtc2cudHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgIHZhciB4OlRBcHBsaWNhdGlvbkVycm9yID0gVEFwcGxpY2F0aW9uRXJyb3IucmVhZChpcHJvdF8pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAgaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcih4KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdCA6IiA8PCByZXN1bHRuYW1lIDw8ICIgPSBuZXcgIgorICAgICAgICAgICAgICAgICA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgaWYgKG9uU3VjY2VzcyAhPSBudWxsKSBvblN1Y2Nlc3MocmVzdWx0LnN1Y2Nlc3MpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKG9uU3VjY2VzcyAhPSBudWxsKSBvblN1Y2Nlc3MoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihuZXcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FcnJvcihUQXBwbGljYXRpb25FcnJvci5NSVNTSU5HX1JFU1VMVCwgXCIiCisgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKGU6VEVycm9yKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgIGlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7CisgICAgfQorICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBFeHRlbmRzIHN0dWZmCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIlByb2Nlc3NvciI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgVFByb2Nlc3NvciB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvcihpZmFjZToiIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgICAgICAgIDw8ICIpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzdXBlcihpZmFjZSk7IiA8PCBlbmRsOworICB9CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmYWNlXyA9IGlmYWNlOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlBST0NFU1NfTUFQW1wiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIl0gPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByaXZhdGUgdmFyIGlmYWNlXzoiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIjsiIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBjb25zdCBQUk9DRVNTX01BUDpEaWN0aW9uYXJ5ID0gbmV3IERpY3Rpb25hcnkoKTsiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBzdHJpbmcgb3ZlcnJpZGUgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBvdmVycmlkZSA9ICJvdmVycmlkZSAiOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBvdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgPDwgInB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKGlwcm90OlRQcm90b2NvbCwgb3Byb3Q6VFByb3RvY29sKTpCb29sZWFuIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgbXNnOlRNZXNzYWdlID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBUT0RPKG1jc2xlZSk6IHZhbGlkYXRlIG1lc3NhZ2UsIHdhcyB0aGUgc2VxaWQgZXRjLiBsZWdpdD8KKyAgLy8gQVMtIElmIGFsbCBtZXRob2QgaXMgb25ld2F5OgorICAvLyBkbyB5b3UgaGF2ZSBhbiBvcHJvdD8KKyAgLy8gZG8geW91IHlvdSBuZWVkIG51bGxjaGVjaz8KKyAgZl9zZXJ2aWNlXworICAgICAgPDwgaW5kZW50KCkgPDwgInZhciBmbjpGdW5jdGlvbiA9IFBST0NFU1NfTUFQW21zZy5uYW1lXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJpZiAoZm4gPT0gbnVsbCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIFRUeXBlLlNUUlVDVCk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgdmFyIHg6VEFwcGxpY2F0aW9uRXJyb3IgPSBuZXcgVEFwcGxpY2F0aW9uRXJyb3IoVEFwcGxpY2F0aW9uRXJyb3IuVU5LTk9XTl9NRVRIT0QsICIKKyAgICAgICAgICJcIkludmFsaWQgbWV0aG9kIG5hbWU6ICdcIittc2cubmFtZStcIidcIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1zZy5zZXFpZCkpOyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIHJldHVybiB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImZuLmNhbGwodGhpcyxtc2cuc2VxaWQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIE9wZW4gY2xhc3MKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcml2YXRlIGZ1bmN0aW9uICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoKTpGdW5jdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIGZ1bmN0aW9uKHNlcWlkOmludCwgaXByb3Q6VFByb3RvY29sLCBvcHJvdDpUUHJvdG9jb2wpOnZvaWQiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciBhcmdzOiIgPDwgYXJnc25hbWUgPDwgIiA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IgorICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0OiIgPDwgcmVzdWx0bmFtZSA8PCAiID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJpZmFjZV8uIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgIi8vIHNvcnJ5IHRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgeWV0IiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyBFcnJvcihcIlRoaXMgaXMgbm90IHlldCBzdXBwb3J0ZWRcIik7IiA8PCBlbmRsOworICB9CisKKyAgLy8gU2V0IGlzc2V0IG9uIHN1Y2Nlc3MgZmllbGQKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKQorICAgICAgJiYgIXR5cGVfY2FuX2JlX251bGwodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC5zZXQiIDw8IGdldF9jYXBfbmFtZSgic3VjY2VzcyIpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKQorICAgICAgICAgICAgICAgPDwgIih0cnVlKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKCIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6IgorICAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICJ9IjsKKyAgICAgIH0KKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICh0aDpFcnJvcikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cmFjZShcIkludGVybmFsIGVycm9yIHByb2Nlc3NpbmcgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIiwgdGgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInZhciB4OlRBcHBsaWNhdGlvbkVycm9yID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FcnJvcihUQXBwbGljYXRpb25FcnJvci5JTlRFUk5BTF9FUlJPUiwgXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIKKyAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4LndyaXRlKG9wcm90KTsiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICAgIC8vIENsb3NlIGNsYXNzCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgY2xhc3MKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCisgKiBAcGFyYW0gcHJlZml4IFRoZSB2YXJpYWJsZSBuYW1lIG9yIGNvbnRhaW5lciBmb3IgdGhpcyBmaWVsZAorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaXByb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAicmVhZEJpbmFyeSgpOyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCk7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAicmVhZEkxNigpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAicmVhZEk2NCgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBBczMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBpbnZva2VzIHJlYWQoKQorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBzdHJpbmcgb2JqOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvYmogPSB0bXAoIl9tYXAiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9zZXQiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb2JqID0gdG1wKCJfbGlzdCIpOworICB9CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICI6VE1hcCA9IGlwcm90LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICI6VFNldCA9IGlwcm90LnJlYWRTZXRCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG9iaiA8PCAiOlRMaXN0ID0gaXByb3QucmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgLy8gc2l6ZSB0aGUgY29sbGVjdGlvbiBjb3JyZWN0bHkKKyAgICAgICAgICAgICAgPDwgIigiCisgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yICh2YXIgIiA8PCBpIDw8ICI6aW50ID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLnNpemUiCisgICAgICAgICAgICAgIDw8ICI7ICIKKyAgICAgICAgICAgICAgPDwgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5hZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBsaXN0IGVsZW1lbnQKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnB1c2goIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQXMzIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHByZWZpeC5jX3N0cigpLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKKyAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiX2tleSIpOworICAgIHN0cmluZyBjb3VudGVyID0gdG1wKCJfc2l6ZUNvdW50ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgY291bnRlciA8PCAiOmludCA9IDA7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKHZhciAiIDw8IGl0ZXIgPDwgIjoqIGluICIgPDwgcHJlZml4IDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCBjb3VudGVyIDw8ICsiKys7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwQmVnaW4obmV3IFRNYXAoIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8IGNvdW50ZXIgPDwgIikpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEJlZ2luKG5ldyBUU2V0KCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuc2l6ZSkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEJlZ2luKG5ldyBUTGlzdCgiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5sZW5ndGgpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBpdGVyID0gdG1wKCJlbGVtIik7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICh2YXIgIiA8PCBpdGVyIDw8ICI6KiBpbiAiIDw8IHByZWZpeCA8PCAiKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvciBlYWNoICh2YXIgIiA8PCBpdGVyIDw8ICI6KiBpbiAiIDw8IHByZWZpeCA8PCAiLnRvQXJyYXkoKSkiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIGVhY2ggKHZhciAiIDw8IGl0ZXIgPDwgIjoqIGluICIgPDwgcHJlZml4IDw8ICIpIjsKKyAgfQorCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCkgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIG1hcCArICJbIiArIGl0ZXIgKyAiXSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgQXMzIHR5cGUgbmFtZQorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lciBJcyB0aGUgdHlwZSBnb2luZyBpbnNpZGUgYSBjb250YWluZXI/CisgKiBAcmV0dXJuIEFzMyB0eXBlIG5hbWUsIGkuZS4gSGFzaE1hcDxLZXksVmFsdWU+CisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lciwgYm9vbCBpbl9pbml0KSB7CisgICh2b2lkKWluX2luaXQ7CisgIC8vIEluIEFzMyB0eXBlZGVmcyBhcmUganVzdCByZXNvbHZlZCB0byB0aGVpciByZWFsIHR5cGUKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgc3RyaW5nIHByZWZpeDsKKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUsIGluX2NvbnRhaW5lcik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiaW50IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIkRpY3Rpb25hcnkiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiU2V0IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJBcnJheSI7CisgIH0KKworICAvLyBDaGVjayBmb3IgbmFtZXNwYWNpbmcKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiYXMzIik7CisgICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBwYWNrYWdlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIEFTMyB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgorICoKKyAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCisgKiBAcGFyYW0gY29udGFpbmVyIElzIGl0IGdvaW5nIGluIGEgQXMzIGNvbnRhaW5lcj8KKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUsIGJvb2wgaW5fY29udGFpbmVyKSB7CisgICh2b2lkKWluX2NvbnRhaW5lcjsKKyAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7CisKKyAgc3dpdGNoICh0YmFzZSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgcmV0dXJuICJ2b2lkIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICByZXR1cm4gIkJ5dGVBcnJheSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiU3RyaW5nIjsKKyAgICB9CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gIkJvb2xlYW4iOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuICJpbnQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICB0aHJvdyAiaTY0IGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGluIGFzMyI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiTnVtYmVyIjsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEFzMyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgIH0KK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQpIHsKKyAgLy8gVE9ETyhtY3NsZWUpOiBkbyB3ZSBldmVyIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQ/CisgIHN0cmluZyByZXN1bHQgPSAidmFyICIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAiOiIgKyB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgaWYgKGluaXQpIHsKKyAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICBzdGQ6Om9mc3RyZWFtIGR1bW15OworICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgICAgOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0ICsgIjsiOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICBzdGQ6OnN0cmluZyBhcmd1bWVudHMgPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGlmIChhcmd1bWVudHMgIT0gIiIpIHsKKyAgICAgIGFyZ3VtZW50cyArPSAiLCAiOworICAgIH0KKyAgICBhcmd1bWVudHMgKz0gIm9uRXJyb3I6RnVuY3Rpb24sIG9uU3VjY2VzczpGdW5jdGlvbiI7CisgIH0KKworICBzdGQ6OnN0cmluZyByZXN1bHQgPSAiZnVuY3Rpb24gIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50cyArICIpOnZvaWQiOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICI6IiArIHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgorICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogQXBwbGllcyB0aGUgY29ycmVjdCBzdHlsZSB0byBhIHN0cmluZyBiYXNlZCBvbiB0aGUgdmFsdWUgb2Ygbm9jYW1lbF9zdHlsZV8KKyAqLworc3RkOjpzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKKyAgcmV0dXJuIG5hbWU7Cit9CisKK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmNvbnN0YW50X25hbWUoc3RyaW5nIG5hbWUpIHsKKyAgc3RyaW5nIGNvbnN0YW50X25hbWU7CisKKyAgYm9vbCBpc19maXJzdCA9IHRydWU7CisgIGJvb2wgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBmYWxzZTsKKyAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIGl0ZXIgPSBuYW1lLmJlZ2luKCk7IGl0ZXIgIT0gbmFtZS5lbmQoKTsgKytpdGVyKSB7CisgICAgc3RyaW5nOjp2YWx1ZV90eXBlIGNoYXJhY3RlciA9ICgqaXRlcik7CisKKyAgICBib29sIGlzX3VwcGVyID0gaXN1cHBlcihjaGFyYWN0ZXIpOworCisgICAgaWYgKGlzX3VwcGVyICYmICFpc19maXJzdCAmJiAhd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIpIHsKKyAgICAgIGNvbnN0YW50X25hbWUgKz0gJ18nOworICAgIH0KKyAgICBjb25zdGFudF9uYW1lICs9IHRvdXBwZXIoY2hhcmFjdGVyKTsKKworICAgIGlzX2ZpcnN0ID0gZmFsc2U7CisgICAgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBpc191cHBlcjsKKyAgfQorCisgIHJldHVybiBjb25zdGFudF9uYW1lOworfQorCisvKioKKyAqIEVtaXRzIGEgQXMzRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8qKlxuIiwgIiAqICIsIHRkb2MtPmdldF9kb2MoKSwgIiAqL1xuIik7CisgIH0KK30KKworLyoqCisgKiBFbWl0cyBhIEFzM0RvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKKyAgICBzdHJpbmdzdHJlYW0gc3M7CisgICAgc3MgPDwgdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgeworICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICBzcyA8PCAiXG5AcGFyYW0gIiA8PCBwLT5nZXRfbmFtZSgpOworICAgICAgaWYgKHAtPmhhc19kb2MoKSkgeworICAgICAgICBzcyA8PCAiICIgPDwgcC0+Z2V0X2RvYygpOworICAgICAgfQorICAgIH0KKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBzcy5zdHIoKSwgIiAqL1xuIik7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgeworICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOworfQorCitzdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIHsKKyAgcmV0dXJuICJpcyIgKyBnZXRfY2FwX25hbWUoInNldCIpICsgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpICsgIigpIjsKK30KKwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CisgIGlmICghdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0XyIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpIHsKKyAgc3RyaW5nIHBhY2thZ2UgPSAiIjsKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImFzMyIpICsgIi4iOworICB9CisgIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBhczMsCisgICAgIkFTMyIsCisgICAgIiAgICBiaW5kYWJsZTogICAgICAgIEFkZCBbYmluZGFibGVdIG1ldGFkYXRhIHRvIGFsbCB0aGUgc3RydWN0IGNsYXNzZXMuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jX2dsaWJfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jX2dsaWJfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlM2JhZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NfZ2xpYl9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSw0NTg3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCitzdHJpbmcgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHN0cmluZyBuYW1lKTsKK3N0cmluZyB1bmRlcnNjb3Jlc190b19pbml0aWFsX2NhcHMoc3RyaW5nIG5hbWUpOworc3RyaW5nIHRvX3VwcGVyX2Nhc2Uoc3RyaW5nIG5hbWUpOworc3RyaW5nIHRvX2xvd2VyX2Nhc2Uoc3RyaW5nIG5hbWUpOworCisvKioKKyAqIEMgY29kZSBnZW5lcmF0b3IsIHVzaW5nIGdsaWIgZm9yIEMgdHlwaW5nLgorICovCitjbGFzcyB0X2NfZ2xpYl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgLyogY29uc3RydWN0b3IgKi8KKyAgdF9jX2dsaWJfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICAvKiBzZXQgdGhlIG91dHB1dCBkaXJlY3RvcnkgKi8KKyAgICB0aGlzLT5vdXRfZGlyX2Jhc2VfID0gImdlbi1jX2dsaWIiOworCisgICAgLyogbm8gb3B0aW9ucyB5ZXQgKi8KKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBjX2dsaWI6IiArIGl0ZXItPmZpcnN0OworICAgIH0KKworICAgIC8qIHNldCB0aGUgbmFtZXNwYWNlICovCisgICAgdGhpcy0+bnNwYWNlID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImNfZ2xpYiIpOworCisgICAgaWYgKHRoaXMtPm5zcGFjZS5lbXB0eSgpKSB7CisgICAgICB0aGlzLT5uc3BhY2UgPSAiIjsKKyAgICAgIHRoaXMtPm5zcGFjZV91ID0gIiI7CisgICAgICB0aGlzLT5uc3BhY2VfdWMgPSAiIjsKKyAgICAgIHRoaXMtPm5zcGFjZV9sYyA9ICIiOworICAgIH0gZWxzZSB7CisgICAgICAvKiByZXBsYWNlIGRvdHMgd2l0aCB1bmRlcnNjb3JlcyAqLworICAgICAgY2hhciogdG1wID0gc3RyZHVwKHRoaXMtPm5zcGFjZS5jX3N0cigpKTsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgc3RybGVuKHRtcCk7IGkrKykgeworICAgICAgICBpZiAodG1wW2ldID09ICcuJykgeworICAgICAgICAgIHRtcFtpXSA9ICdfJzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdGhpcy0+bnNwYWNlID0gc3RyaW5nKHRtcCwgc3RybGVuKHRtcCkpOworICAgICAgZnJlZSh0bXApOworCisgICAgICAvKiBjbGVhbiB1cCB0aGUgbmFtZXNwYWNlIGZvciBDLgorICAgICAgICogQW4gaW5wdXQgb2YgJ25hbWVzcGFjZSBmb28nIHNob3VsZCByZXN1bHQgaW46CisgICAgICAgKiAgLSBuc3BhY2UgPSBmb28gICAgICAgLSBmb3IgdGhyaWZ0IG9iamVjdHMgYW5kIHR5cGVkZWZzCisgICAgICAgKiAgLSBuc3BhY2VfdSA9IEZvbyAgICAgLSBmb3IgaW50ZXJuYWwgR09iamVjdCBwcmVmaXhlcworICAgICAgICogIC0gbnNwYWNlX3VjID0gRk9PXyAgIC0gZm9yIG1hY3JvIHByZWZpeGVzCisgICAgICAgKiAgLSBuc3BhY2VfbGMgPSBmb29fICAgLSBmb3IgZmlsZW5hbWUgYW5kIG1ldGhvZCBwcmVmaXhlcworICAgICAgICogVGhlIHVuZGVyc2NvcmVzIGFyZSB0aGVyZSBzaW5jZSB1YyBhbmQgbGMgc3RyaW5ncyBhcmUgdXNlZCBhcyBmaWxlIGFuZAorICAgICAgICogdmFyaWFibGUgcHJlZml4ZXMuCisgICAgICAgKi8KKyAgICAgIHRoaXMtPm5zcGFjZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHRoaXMtPm5zcGFjZSk7CisgICAgICB0aGlzLT5uc3BhY2VfdWMgPSB0b191cHBlcl9jYXNlKHRoaXMtPm5zcGFjZV91KSArICJfIjsKKyAgICAgIHRoaXMtPm5zcGFjZV9sYyA9IHRvX2xvd2VyX2Nhc2UodGhpcy0+bnNwYWNlX3UpICsgIl8iOworICAgIH0KKyAgfQorCisgIC8qIGluaXRpYWxpemF0aW9uIGFuZCBkZXN0cnVjdGlvbiAqLworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyogZ2VuZXJhdGlvbiBmdW5jdGlvbnMgKi8KKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCitwcml2YXRlOgorICAvKiBmaWxlIHN0cmVhbXMgKi8KKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzX2ltcGxfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaGVhZGVyXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworCisgIC8qIG5hbWVzcGFjZSB2YXJpYWJsZXMgKi8KKyAgc3RyaW5nIG5zcGFjZTsKKyAgc3RyaW5nIG5zcGFjZV91OworICBzdHJpbmcgbnNwYWNlX3VjOworICBzdHJpbmcgbnNwYWNlX2xjOworCisgIC8qIGhlbHBlciBmdW5jdGlvbnMgKi8KKyAgYm9vbCBpc19jb21wbGV4X3R5cGUodF90eXBlKiB0dHlwZSk7CisgIGJvb2wgaXNfbnVtZXJpYyh0X3R5cGUqIHR0eXBlKTsKKyAgc3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWYgPSBmYWxzZSwgYm9vbCBpc19jb25zdCA9IGZhbHNlKTsKKyAgc3RyaW5nIHByb3BlcnR5X3R5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWYgPSBmYWxzZSwgYm9vbCBpc19jb25zdCA9IGZhbHNlKTsKKyAgc3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfdHlwZSogdHlwZSk7CisgIHN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKTsKKyAgc3RyaW5nIGNvbnN0YW50X2xpdGVyYWwodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHN0cmluZyBjb25zdGFudF92YWx1ZShzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHN0cmluZyBjb25zdGFudF92YWx1ZV93aXRoX3N0b3JhZ2Uoc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICBzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RyaW5nIHhjZXB0aW9uX2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5pdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb25zdGFudCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlZmVyZW5jZSA9IGZhbHNlKTsKKyAgdm9pZCBkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nJiBiYXNlX25hbWUsIGJvb2wgZm9yX2hhc2hfdGFibGUpOworICB2b2lkIGRlY2xvcmVfbG9jYWxfdmFyaWFibGVfZm9yX3dyaXRlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nJiBiYXNlX25hbWUpOworCisgIC8qIGdlbmVyYXRpb24gZnVuY3Rpb25zICovCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIoc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdG9wX2xldmVsID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hhbmRsZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfb2JqZWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX2dldCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19mdW5jdGlvbiA9IHRydWUpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfZ2V0ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2Z1bmN0aW9uID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgZWxlbWVudCwgaW50IGVycm9yX3JldCk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvY2F0ZSA9IHRydWUpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG9jYXRlID0gdHJ1ZSk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KTsKKworICBzdHJpbmcgZ2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlKHRfdHlwZSoga2V5LCB0X3R5cGUqIHZhbHVlKTsKKyAgc3RyaW5nIGdlbmVyYXRlX25ld19hcnJheV9mcm9tX3R5cGUodF90eXBlKiB0dHlwZSk7CisKKyAgc3RyaW5nIGdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUodF90eXBlKiB0dHlwZSk7CisgIHN0cmluZyBnZW5lcmF0ZV9oYXNoX2Z1bmNfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpOworICBzdHJpbmcgZ2VuZXJhdGVfY21wX2Z1bmNfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpOworfTsKKworLyoqCisgKiBQcmVwYXJlIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUKKyAqIG91dHB1dCBzdHJlYW1zLgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8qIGNyZWF0ZSBvdXRwdXQgZGlyZWN0b3J5ICovCisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgc3RyaW5nIHByb2dyYW1fbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHByb2dyYW1fbmFtZV8pOworICBzdHJpbmcgcHJvZ3JhbV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShwcm9ncmFtX25hbWVfdSk7CisgIHN0cmluZyBwcm9ncmFtX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKHByb2dyYW1fbmFtZV91KTsKKworICAvKiBjcmVhdGUgb3V0cHV0IGZpbGVzICovCisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgdGhpcy0+bnNwYWNlX2xjICsgcHJvZ3JhbV9uYW1lX2xjICsgIl90eXBlcy5oIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisgIHN0cmluZyBmX3R5cGVzX2ltcGxfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyB0aGlzLT5uc3BhY2VfbGMgKyBwcm9ncmFtX25hbWVfbGMgKyAiX3R5cGVzLmMiOworICBmX3R5cGVzX2ltcGxfLm9wZW4oZl90eXBlc19pbXBsX25hbWUuY19zdHIoKSk7CisKKyAgLyogYWRkIHRocmlmdCBib2lsZXJwbGF0ZSBoZWFkZXJzICovCisgIGZfdHlwZXNfIDw8IGF1dG9nZW5fY29tbWVudCgpOworICBmX3R5cGVzX2ltcGxfIDw8IGF1dG9nZW5fY29tbWVudCgpOworCisgIC8qIGluY2x1ZGUgaW5jbHVzaW9uIGd1YXJkICovCisgIGZfdHlwZXNfIDw8ICIjaWZuZGVmICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHByb2dyYW1fbmFtZV91YyA8PCAiX1RZUEVTX0giIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgcHJvZ3JhbV9uYW1lX3VjIDw8ICJfVFlQRVNfSCIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8qIGluY2x1ZGUgYmFzZSB0eXBlcyAqLworICBmX3R5cGVzXyA8PCAiLyogYmFzZSBpbmNsdWRlcyAqLyIgPDwgZW5kbCA8PCAiI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+IiA8PCBlbmRsCisgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0Lmg+IiA8PCBlbmRsCisgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4iIDw8IGVuZGw7CisKKyAgLyogaW5jbHVkZSBvdGhlciB0aHJpZnQgaW5jbHVkZXMgKi8KKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgaWYgKCFpbmNsdWRlcy5lbXB0eSgpKSB7CisgICAgZl90eXBlc18gPDwgIi8qIG90aGVyIHRocmlmdCBpbmNsdWRlcyAqLyIgPDwgZW5kbDsKKworICAgIGZvciAodmVjdG9yPHRfcHJvZ3JhbSo+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gaW5jbHVkZXMuYmVnaW4oKTsKKyAgICAgICAgIGl0ZXIgIT0gaW5jbHVkZXMuZW5kKCk7CisgICAgICAgICArK2l0ZXIpIHsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbmNsdWRlX25zcGFjZSA9ICgqaXRlciktPmdldF9uYW1lc3BhY2UoImNfZ2xpYiIpOworICAgICAgc3RkOjpzdHJpbmcgaW5jbHVkZV9uc3BhY2VfcHJlZml4ID0KKyAgICAgICAgaW5jbHVkZV9uc3BhY2UuZW1wdHkoKSA/ICIiIDogaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGluY2x1ZGVfbnNwYWNlKSArICJfIjsKKworICAgICAgZl90eXBlc18gPDwgIiNpbmNsdWRlIFwiIiA8PCBpbmNsdWRlX25zcGFjZV9wcmVmaXgKKyAgICAgICAgICAgICAgIDw8IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKml0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiX3R5cGVzLmhcIiIgPDwgZW5kbDsKKyAgICB9CisgICAgZl90eXBlc18gPDwgZW5kbDsKKyAgfQorCisgIC8qIGluY2x1ZGUgY3VzdG9tIGhlYWRlcnMgKi8KKyAgY29uc3QgdmVjdG9yPHN0cmluZz4mIGNfaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2NfaW5jbHVkZXMoKTsKKyAgZl90eXBlc18gPDwgIi8qIGN1c3RvbSB0aHJpZnQgaW5jbHVkZXMgKi8iIDw8IGVuZGw7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY19pbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIGlmIChjX2luY2x1ZGVzW2ldWzBdID09ICc8JykgeworICAgICAgZl90eXBlc18gPDwgIiNpbmNsdWRlICIgPDwgY19pbmNsdWRlc1tpXSA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGNfaW5jbHVkZXNbaV0gPDwgIlwiIiA8PCBlbmRsOworICAgIH0KKyAgfQorICBmX3R5cGVzXyA8PCBlbmRsOworCisgIC8qIGluY2x1ZGUgbWF0aC5oIChmb3IgIklORklOSVRZIikgaW4gdGhlIGltcGxlbWVudGF0aW9uIGZpbGUsIGluIGNhc2Ugd2UKKyAgICAgZW5jb3VudGVyIGEgc3RydWN0IHdpdGggYSBtZW1iZXIgb2YgdHlwZSBkb3VibGUgKi8KKyAgZl90eXBlc19pbXBsXyA8PCBlbmRsIDw8ICIjaW5jbHVkZSA8bWF0aC5oPiIgPDwgZW5kbDsKKworICAvLyBpbmNsdWRlIHRoZSB0eXBlcyBmaWxlCisgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbCA8PCAiI2luY2x1ZGUgXCIiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBwcm9ncmFtX25hbWVfdSA8PCAiX3R5cGVzLmhcIiIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4iIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3R5cGVzXyA8PCAiLyogYmVnaW4gdHlwZXMgKi8iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiAgRmluaXNoIHVwIGdlbmVyYXRpb24gYW5kIGNsb3NlIGFsbCBmaWxlIHN0cmVhbXMuCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIHN0cmluZyBwcm9ncmFtX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyhwcm9ncmFtX25hbWVfKSk7CisKKyAgLyogZW5kIHRoZSBoZWFkZXIgaW5jbHVzaW9uIGd1YXJkICovCisgIGZfdHlwZXNfIDw8ICIjZW5kaWYgLyogIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgcHJvZ3JhbV9uYW1lX3VjIDw8ICJfVFlQRVNfSCAqLyIgPDwgZW5kbDsKKworICAvKiBjbG9zZSBvdXRwdXQgZmlsZSAqLworICBmX3R5cGVzXy5jbG9zZSgpOworICBmX3R5cGVzX2ltcGxfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgVGhyaWZ0IHR5cGVkZWYgaW4gQyBjb2RlLiAgRm9yIGV4YW1wbGU6CisgKgorICogVGhyaWZ0OgorICogdHlwZWRlZiBtYXA8aTMyLGkzMj4gU29tZU1hcAorICoKKyAqIEM6CisgKiB0eXBlZGVmIEdIYXNoVGFibGUgKiBUaHJpZnRTb21lTWFwOworICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmICIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiICIgPDwgdGhpcy0+bnNwYWNlCisgICAgICAgICAgIDw8IHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIEMgZW51bWVyYXRpb24uICBGb3IgZXhhbXBsZToKKyAqCisgKiBUaHJpZnQ6CisgKiBlbnVtIE15RW51bSB7CisgKiAgIE9ORSA9IDEsCisgKiAgIFRXTworICogfQorICoKKyAqIEM6CisgKiBlbnVtIF9UaHJpZnRNeUVudW0geworICogICBUSFJJRlRfTVlfRU5VTV9PTkUgPSAxLAorICogICBUSFJJRlRfTVlfRU5VTV9UV08KKyAqIH07CisgKiB0eXBlZGVmIGVudW0gX1RocmlmdE15RW51bSBUaHJpZnRNeUVudW07CisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgc3RyaW5nIG5hbWUgPSB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKSk7CisKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImVudW0gXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgLyogb3V0cHV0IGVhY2ggb2YgdGhlIGVudW1lcmF0aW9uIGVsZW1lbnRzICovCisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX3R5cGVzXyA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiXyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZfdHlwZXNfIDw8ICIgPSAiIDw8ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzXyA8PCBlbmRsIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBlbnVtIF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIgIgorICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfdHlwZXNfIDw8ICIvKiByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbnN0YW50ICovIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAiY29uc3QgY2hhciAqIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAidG9TdHJpbmdfIiA8PCBuYW1lIDw8ICIoaW50IHZhbHVlKTsgIiA8PCBlbmRsIDw8IGVuZGw7CisgIDsKKyAgZl90eXBlc19pbXBsXyA8PCAiLyogcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb25zdGFudCAqLyIgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAiY29uc3QgY2hhciAqIiA8PCBlbmRsOworICBmX3R5cGVzX2ltcGxfIDw8ICJ0b1N0cmluZ18iIDw8IG5hbWUgPDwgIihpbnQgdmFsdWUpICIgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAieyIgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAiICBzdGF0aWMgX190aHJlYWQgY2hhciBidWZbMTZdID0gezB9OyIgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAiICBzd2l0Y2godmFsdWUpIHsiIDw8IGVuZGw7CisgIHN0ZDo6c2V0PGludD4gZG9uZTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIC8vIFNraXBwaW5nIGR1cGxpY2F0ZSB2YWx1ZQorICAgIGlmIChkb25lLmZpbmQodmFsdWUpID09IGRvbmUuZW5kKCkpIHsKKyAgICAgIGRvbmUuaW5zZXJ0KHZhbHVlKTsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgIiAgY2FzZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIjoiCisgICAgICAgICAgICAgICAgICAgIDw8ICJyZXR1cm4gXCIiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIlwiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZl90eXBlc19pbXBsXyA8PCAiICBkZWZhdWx0OiBnX3NucHJpbnRmKGJ1ZiwgMTYsIFwiJWRcIiwgdmFsdWUpOyByZXR1cm4gYnVmOyIgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAiICB9IiA8PCBlbmRsOworICBmX3R5cGVzX2ltcGxfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIFRocmlmdCBjb25zdGFudHMgaW4gQyBjb2RlLgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIGZfdHlwZXNfIDw8ICIvKiBjb25zdGFudHMgKi8iIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgIi8qIGNvbnN0YW50cyAqLyIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKG5hbWUpOworICAgIHN0cmluZyBuYW1lX2xjID0gdG9fbG93ZXJfY2FzZShuYW1lKTsKKyAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7CisgICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworCisgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSh0eXBlKSkgeworICAgICAgZl90eXBlc18gPDwgdHlwZV9uYW1lKHR5cGUpIDw8IGluZGVudCgpIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjCisgICAgICAgICAgICAgICA8PCAiX2NvbnN0YW50KCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIiAiCisgICAgICAgICAgICAgPDwgY29uc3RhbnRfdmFsdWUobmFtZV9sYywgdHlwZSwgdmFsdWUpIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcihuYW1lX2xjLCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7CisgIH0KKworICBmX3R5cGVzXyA8PCBlbmRsOworICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgVGhyaWZ0IHN0cnVjdHMgaW4gQyBjb2RlLCBhcyBHT2JqZWN0cy4gIEV4YW1wbGU6CisgKgorICogVGhyaWZ0OgorICogc3RydWN0IEJvbmsKKyAqIHsKKyAqICAgMTogc3RyaW5nIG1lc3NhZ2UsCisgKiAgIDI6IGkzMiB0eXBlCisgKiB9CisgKgorICogQyBHT2JqZWN0IGluc3RhbmNlIGhlYWRlcjoKKyAqIHN0cnVjdCBfVGhyaWZ0Qm9uaworICogeworICogICBHT2JqZWN0IHBhcmVudDsKKyAqCisgKiAgIGdjaGFyICogbWVzc2FnZTsKKyAqICAgZ2ludDMyIHR5cGU7CisgKiB9OworICogdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEJvbmsgVGhyaWZ0Qm9uaworICogLy8gLi4uIGFkZGl0aW9uYWwgR09iamVjdCBib2lsZXJwbGF0ZSAuLi4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBmX3R5cGVzXyA8PCAiLyogc3RydWN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICovIiA8PCBlbmRsOworICBnZW5lcmF0ZV9vYmplY3QodHN0cnVjdCk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgQyBjb2RlIHRvIHJlcHJlc2VudCBUaHJpZnQgc2VydmljZXMuICBDcmVhdGVzIGEgbmV3IEdPYmplY3QKKyAqIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgc2VydmljZS4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgc3ZjbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKTsKKyAgc3RyaW5nIHN2Y25hbWVfdWMgPSB0aGlzLT5uc3BhY2VfdWMgKyB0b191cHBlcl9jYXNlKHN2Y25hbWVfdSk7CisgIHN0cmluZyBmaWxlbmFtZSA9IHRoaXMtPm5zcGFjZV9sYyArIHRvX2xvd2VyX2Nhc2Uoc3ZjbmFtZV91KTsKKworICAvLyBtYWtlIG91dHB1dCBmaWxlcworICBzdHJpbmcgZl9oZWFkZXJfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBmaWxlbmFtZSArICIuaCI7CisgIGZfaGVhZGVyXy5vcGVuKGZfaGVhZGVyX25hbWUuY19zdHIoKSk7CisKKyAgc3RyaW5nIHByb2dyYW1fbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHByb2dyYW1fbmFtZV8pOworICBzdHJpbmcgcHJvZ3JhbV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShwcm9ncmFtX25hbWVfdSk7CisKKyAgLy8gYWRkIGhlYWRlciBmaWxlIGJvaWxlcnBsYXRlCisgIGZfaGVhZGVyXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKworICAvLyBhZGQgYW4gaW5jbHVzaW9uIGd1YXJkCisgIGZfaGVhZGVyXyA8PCAiI2lmbmRlZiAiIDw8IHN2Y25hbWVfdWMgPDwgIl9IIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgc3ZjbmFtZV91YyA8PCAiX0giIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgLy8gYWRkIHN0YW5kYXJkIGluY2x1ZGVzCisgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuaD4iIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSBcIiIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHByb2dyYW1fbmFtZV9sYyA8PCAiX3R5cGVzLmhcIiIgPDwgZW5kbDsKKworICAvLyBpZiB3ZSBhcmUgaW5oZXJpdGluZyBmcm9tIGFub3RoZXIgc2VydmljZSwgaW5jbHVkZSBpdHMgaGVhZGVyCisgIHRfc2VydmljZSogZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzX3NlcnZpY2UgIT0gTlVMTCkgeworICAgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgXCIiIDw8IHRoaXMtPm5zcGFjZV9sYworICAgICAgICAgICAgICA8PCB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCkpKSA8PCAiLmhcIiIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgZW5kbDsKKworICAvLyBjcmVhdGUgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24KKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIGZpbGVuYW1lICsgIi5jIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIC8vIGFkZCB0aGUgYm9pbGVycGxhY2UgaGVhZGVyCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCk7CisKKyAgLy8gaW5jbHVkZSB0aGUgaGVhZGVycworICBmX3NlcnZpY2VfIDw8ICIjaW5jbHVkZSA8c3RyaW5nLmg+IiA8PCBlbmRsIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oPiIgPDwgZW5kbCA8PCAiI2luY2x1ZGUgXCIiCisgICAgICAgICAgICAgPDwgZmlsZW5hbWUgPDwgIi5oXCIiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSB0aGUgc2VydmljZS1oZWxwZXIgY2xhc3NlcworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworCisgIC8vIGdlbmVyYXRlIHRoZSBjbGllbnQgb2JqZWN0cworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisKKyAgLy8gZ2VuZXJhdGUgdGhlIHNlcnZlciBvYmplY3RzCisgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKKworICAvLyBlbmQgdGhlIGhlYWRlciBpbmNsdXNpb24gZ3VhcmQKKyAgZl9oZWFkZXJfIDw8ICIjZW5kaWYgLyogIiA8PCBzdmNuYW1lX3VjIDw8ICJfSCAqLyIgPDwgZW5kbDsKKworICAvLyBjbG9zZSB0aGUgZmlsZXMKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworICBmX2hlYWRlcl8uY2xvc2UoKTsKK30KKworLyoqCisgKgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBzdHJpbmcgbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOworICBzdHJpbmcgbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UobmFtZV91KTsKKyAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKG5hbWVfdSk7CisKKyAgZ2VuZXJhdGVfb2JqZWN0KHRzdHJ1Y3QpOworCisgIGZfdHlwZXNfIDw8ICIvKiBleGNlcHRpb24gKi8iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgInR5cGVkZWYgZW51bSIgPDwgZW5kbAorICAgICAgICAgICA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfRVJST1JfQ09ERSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgIn0gIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiRXJyb3I7IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIkdRdWFyayAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjCisgICAgICAgICAgIDw8ICJfZXJyb3JfcXVhcmsgKHZvaWQpOyIgPDwgZW5kbAorICAgICAgICAgICA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfRVJST1IgKCIKKyAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9lcnJvcl9xdWFyaygpKSIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGw7CisKKyAgZl90eXBlc19pbXBsXyA8PCAiLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIGZvciBleGNlcHRpb25zICovIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiX0VSUk9SX0RPTUFJTiBcIiIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMKKyAgICAgICAgICAgICAgICA8PCAiX2Vycm9yX3F1YXJrXCIiIDw8IGVuZGwgPDwgIkdRdWFyayIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYworICAgICAgICAgICAgICAgIDw8ICJfZXJyb3JfcXVhcmsgKHZvaWQpIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgIiAgcmV0dXJuIGdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nICgiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjCisgICAgICAgICAgICAgICAgPDwgIl9FUlJPUl9ET01BSU4pOyIgPDwgZW5kbCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioqKioqKioqKioqKioqKioqKioKKyAqIEhFTFBFUiBGVU5DVElPTlMgKgorICoqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0dHlwZSBpcyBub3QgYSBwcmltaXRpdmUuCisgKi8KK2Jvb2wgdF9jX2dsaWJfZ2VuZXJhdG9yOjppc19jb21wbGV4X3R5cGUodF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworCisgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpOworfQorCitib29sIHRfY19nbGliX2dlbmVyYXRvcjo6aXNfbnVtZXJpYyh0X3R5cGUqIHR0eXBlKSB7CisgIHJldHVybiB0dHlwZS0+aXNfZW51bSgpIHx8ICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR0eXBlLT5pc19zdHJpbmcoKSk7Cit9CisKKy8qKgorICogTWFwcyBhIFRocmlmdCB0X3R5cGUgdG8gYSBDIHR5cGUuCisgKi8KK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWYsIGJvb2wgaXNfY29uc3QpIHsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyBibmFtZSA9IGJhc2VfdHlwZV9uYW1lKHR0eXBlKTsKKworICAgIGlmIChpc19jb25zdCkgeworICAgICAgcmV0dXJuICJjb25zdCAiICsgYm5hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBibmFtZTsKKyAgICB9CisgIH0KKworICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgc3RyaW5nIGNuYW1lOworCisgICAgdF9jb250YWluZXIqIHRjb250YWluZXIgPSAodF9jb250YWluZXIqKXR0eXBlOworICAgIGlmICh0Y29udGFpbmVyLT5oYXNfY3BwX25hbWUoKSkgeworICAgICAgY25hbWUgPSB0Y29udGFpbmVyLT5nZXRfY3BwX25hbWUoKTsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgY25hbWUgPSAiR0hhc2hUYWJsZSI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIC8vIHNpbmNlIGEgc2V0IHJlcXVpcmVzIHVuaXF1ZSBlbGVtZW50cywgdXNlIGEgR0hhc2hUYWJsZSwgYW5kCisgICAgICAvLyBwb3B1bGF0ZSB0aGUga2V5cyBhbmQgdmFsdWVzIHdpdGggdGhlIHNhbWUgZGF0YSwgdXNpbmcga2V5cyBmb3IKKyAgICAgIC8vIHRoZSBhY3R1YWwgd3JpdGVzIGFuZCByZWFkcy4KKyAgICAgIC8vIFRPRE86IGRpc2N1c3Mgd2hldGhlciBvciBub3QgdG8gaW1wbGVtZW50IFRTZXQsIFRIYXNoU2V0IG9yIEdIYXNoU2V0CisgICAgICBjbmFtZSA9ICJHSGFzaFRhYmxlIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIHRfdHlwZSogZXR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgICBpZiAoZXR5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoImNvbXBpbGVyIGVycm9yOiBsaXN0IGVsZW1lbnQgdHlwZSBjYW5ub3QgYmUgdm9pZCIpOworICAgICAgfQorICAgICAgLy8gVE9ETzogaW52ZXN0aWdhdGUgb3RoZXIgaW1wbGVtZW50YXRpb25zIGJlc2lkZXMgR1B0ckFycmF5CisgICAgICBjbmFtZSA9IGlzX251bWVyaWMoZXR5cGUpID8gIkdBcnJheSIgOiAiR1B0ckFycmF5IjsKKyAgICB9CisKKyAgICAvKiBPbWl0IHRoZSBkZXJlZmVyZW5jZSBvcGVyYXRvciBpZiB3ZSBhcmUgYWxpYXNpbmcgdGhpcyB0eXBlIHdpdGhpbiBhCisgICAgICAgdHlwZWRlZiwgdG8gYWxsb3cgdGhlIHR5cGUgdG8gYmUgdXNlZCBtb3JlIG5hdHVyYWxseSBpbiBjbGllbnQgY29kZTsKKyAgICAgICBvdGhlcndpc2UsIGluY2x1ZGUgaXQgKi8KKyAgICBpZiAoIWluX3R5cGVkZWYpIHsKKyAgICAgIGNuYW1lICs9ICIgKiI7CisgICAgfQorCisgICAgaWYgKGlzX2NvbnN0KSB7CisgICAgICByZXR1cm4gImNvbnN0ICIgKyBjbmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGNuYW1lOworICAgIH0KKyAgfQorCisgIC8vIGNoZWNrIGZvciBhIG5hbWVzcGFjZQorICB0X3Byb2dyYW0qIHRwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIHN0cmluZyBwbmFtZSA9ICh0cHJvZ3JhbSA/IHRwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjX2dsaWIiKSA6ICIiKSArIHR0eXBlLT5nZXRfbmFtZSgpOworCisgIGlmIChpc19jb21wbGV4X3R5cGUodHR5cGUpKSB7CisgICAgcG5hbWUgKz0gIiAqIjsKKyAgfQorCisgIGlmIChpc19jb25zdCkgeworICAgIHJldHVybiAiY29uc3QgIiArIHBuYW1lOworICB9IGVsc2UgeworICAgIHJldHVybiBwbmFtZTsKKyAgfQorfQorCisvKioKKyAqIE1hcHMgYSBUaHJpZnQgcHJpbWl0aXZlIHRvIHRoZSB0eXBlIG5lZWRlZCB0byBob2xkIGl0cyB2YWx1ZSB3aGVuIHVzZWQgYXMgYW4KKyAqIG9iamVjdCBwcm9wZXJ0eS4KKyAqCisgKiBUaGlzIG1ldGhvZCBpcyBuZWVkZWQgYmVjYXVzZSBhbGwgaW50ZWdlciBwcm9wZXJ0aWVzIG9mIHdpZHRoIGxlc3MgdGhhbiA2NAorICogYml0cyBtYXAgdG8gdGhlIHNhbWUgdHlwZSwgZ2ludCwgYXMgb3Bwb3NlZCB0byB0aGVpciB3aWR0aC1zcGVjaWZpYyB0eXBlCisgKiAoZ2ludDgsIGdpbnQxNiBvciBnaW50MzIpLgorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpwcm9wZXJ0eV90eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmLCBib29sIGlzX2NvbnN0KSB7CisgIHN0cmluZyByZXN1bHQ7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGlmIChpc19jb25zdCkgeworICAgICAgICByZXN1bHQgPSAiY29uc3QgZ2ludCI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSAiZ2ludCI7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXN1bHQgPSB0eXBlX25hbWUodHR5cGUsIGluX3R5cGVkZWYsIGlzX2NvbnN0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmVzdWx0ID0gdHlwZV9uYW1lKHR0eXBlLCBpbl90eXBlZGVmLCBpc19jb25zdCk7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIE1hcHMgYSBUaHJpZnQgcHJpbWl0aXZlIHRvIGEgQyBwcmltaXRpdmUuCisgKi8KK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfdHlwZSogdHlwZSkgeworICBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuIHR5cGVfbmFtZSh0eXBlKTsKKyAgfQorICBpZiAoIXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJPbmx5IGJhc2UgdHlwZXMgYXJlIHN1cHBwb3J0ZWQuIik7CisgIH0KKyAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dF9iYXNlX3R5cGUqPih0eXBlKTsKKyAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKTsKKyAgc3dpdGNoICh0YmFzZSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgcmV0dXJuICJ2b2lkIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIHJldHVybiAiR0J5dGVBcnJheSAqIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJnY2hhciAqIjsKKyAgICB9CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gImdib29sZWFuIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICByZXR1cm4gImdpbnQ4IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgcmV0dXJuICJnaW50MTYiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gImdpbnQzMiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAiZ2ludDY0IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuICJnZG91YmxlIjsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJjb21waWxlciBlcnJvcjogbm8gQyBiYXNlIHR5cGUgbmFtZSBmb3IgYmFzZSB0eXBlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSk7CisgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIGEgbWVtYmVyIG9mIHRoZSBUaHJpZnRUeXBlIEMgZW51bWVyYXRpb24gaW4gdGhyaWZ0X3Byb3RvY29sLmgKKyAqIGZvciBhIFRocmlmdCB0eXBlLgorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRfU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRfQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVF9CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVF9JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUX0kzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRfSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVF9ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRfSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgIHJldHVybiAiVF9TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRfU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVF9NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUX1NFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUX0xJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIFJldHVybnMgYSBUaHJpZnQgY29uc3RhbnQgZm9ybWF0dGVkIGFzIGEgbGl0ZXJhbCBmb3IgaW5jbHVzaW9uIGluIEMgY29kZS4KKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Y29uc3RhbnRfbGl0ZXJhbCh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIG9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIC8qIHByaW1pdGl2ZXMgKi8KKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgIlwiIiArIHZhbHVlLT5nZXRfc3RyaW5nKCkgKyAiXCIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgIT0gMCkgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGUgdmFsdWVfdHlwZSA9IHZhbHVlLT5nZXRfdHlwZSgpOworCisgICAgc3dpdGNoICh2YWx1ZV90eXBlKSB7CisgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOgorICAgICAgcmVuZGVyIDw8ICJ7ICI7CisgICAgICB7CisgICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIGxpc3QgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICAgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgbGlzdF9pdGVyOworCisgICAgICAgIGlmIChsaXN0LnNpemUoKSA+IDApIHsKKyAgICAgICAgICBsaXN0X2l0ZXIgPSBsaXN0LmJlZ2luKCk7CisgICAgICAgICAgcmVuZGVyIDw8IGNvbnN0YW50X2xpdGVyYWwoZWxlbV90eXBlLCAqbGlzdF9pdGVyKTsKKworICAgICAgICAgIHdoaWxlICgrK2xpc3RfaXRlciAhPSBsaXN0LmVuZCgpKSB7CisgICAgICAgICAgICByZW5kZXIgPDwgIiwgIiA8PCBjb25zdGFudF9saXRlcmFsKGVsZW1fdHlwZSwgKmxpc3RfaXRlcik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZW5kZXIgPDwgIiB9IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTUFQOgorICAgIGRlZmF1bHQ6CisgICAgICByZW5kZXIgPDwgIk5VTEwgLyogbm90IHN1cHBvcnRlZCAqLyI7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIEMgY29kZSB0aGF0IHJlcHJlc2VudHMgYSBUaHJpZnQgY29uc3RhbnQuCisgKi8KK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmNvbnN0YW50X3ZhbHVlKHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIG9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIC8qIHByaW1pdGl2ZXMgKi8KKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmVuZGVyIDw8ICJnX3N0cmR1cCAoXCIiICsgdmFsdWUtPmdldF9zdHJpbmcoKSArICJcIikiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgIT0gMCkgPyAxIDogMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgIkdfR0lOVDY0X0NPTlNUQU5UICgiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCAiKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmIChpc19jb21wbGV4X3R5cGUodHlwZSkpIHsKKyAgICByZW5kZXIgPDwgIigiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCB0b19sb3dlcl9jYXNlKG5hbWUpIDw8ICJfY29uc3RhbnQoKSkiOworICB9IGVsc2UgeworICAgIHJlbmRlciA8PCAiTlVMTCAvKiBub3Qgc3VwcG9ydGVkICovIjsKKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHRfc3RydWN0KiBhcmdsaXN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICB0X3N0cnVjdCogeGxpc3QgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgc3RyaW5nIGZuYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisKKyAgYm9vbCBoYXNfcmV0dXJuID0gIXR0eXBlLT5pc192b2lkKCk7CisgIGJvb2wgaGFzX2FyZ3MgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworICBib29sIGhhc194Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKyAgcmV0dXJuICJnYm9vbGVhbiAiICsgdGhpcy0+bnNwYWNlX2xjICsgZm5hbWUgKyAiICgiICsgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJJZiAqIGlmYWNlIgorICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIiogX3JldHVybiIgOiAiIikKKyAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCkpKQorICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0KHhsaXN0KSkpICsgIiwgR0Vycm9yICoqIGVycm9yKSI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEByZXR1cm4gQ29tbWEgc2VwZWFyYXRlZCBsaXN0IG9mIGFsbCBmaWVsZCBuYW1lcyBpbiB0aGF0IHN0cnVjdAorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSkgKyAiICIgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIG11dGFibGUgZXhjZXB0aW9uIGxpc3RzCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBAcmV0dXJuIENvbW1hIHNlcGVhcmF0ZWQgbGlzdCBvZiBhbGwgZmllbGQgbmFtZXMgaW4gdGhhdCBzdHJ1Y3QKKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6eGNlcHRpb25fbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICIqICIgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCBpbmNsdWRpbmcgYW55IG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnN0YW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlZmVyZW5jZSkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGlmIChjb25zdGFudCkgeworICAgIHJlc3VsdCArPSAiY29uc3QgIjsKKyAgfQorICByZXN1bHQgKz0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIGlmIChwb2ludGVyKSB7CisgICAgcmVzdWx0ICs9ICIqIjsKKyAgfQorICBpZiAocmVmZXJlbmNlKSB7CisgICAgcmVzdWx0ICs9ICIqIjsKKyAgfQorICByZXN1bHQgKz0gIiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICBpZiAoaW5pdCkgeworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gKGdkb3VibGUpIDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXN1bHQgKz0gIiA9IE5VTEwiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyBpbnRpYWxpemVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gKCIgKyB0eXBlX25hbWUodHlwZSkgKyAiKSAwIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IE5VTEwiOworICAgIH0KKyAgfQorCisgIGlmICghcmVmZXJlbmNlKSB7CisgICAgcmVzdWx0ICs9ICI7IjsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmNvbnN0YW50X3ZhbHVlX3dpdGhfc3RvcmFnZShzdHJpbmcgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiBldHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICBvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKyAgaWYgKGlzX251bWVyaWMoZXR5cGUpKSB7CisgICAgcmVuZGVyIDw8ICIgICAgIiA8PCB0eXBlX25hbWUoZXR5cGUpIDw8ICIgKiIgPDwgZm5hbWUgPDwgIiA9ICIKKyAgICAgICAgICAgPDwgImdfbmV3ICgiIDw8IGJhc2VfdHlwZV9uYW1lKGV0eXBlKSA8PCAiLCAxKTsiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiAgICAqIiA8PCBmbmFtZSA8PCAiID0gIiA8PCBjb25zdGFudF92YWx1ZShmbmFtZSwgKHRfdHlwZSopZXR5cGUsIHZhbHVlKSA8PCAiOyIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICByZW5kZXIgPDwgIiAgICAiIDw8IHR5cGVfbmFtZShldHlwZSkgPDwgIiAiIDw8IGZuYW1lIDw8ICIgPSAiCisgICAgICAgICAgIDw8IGNvbnN0YW50X3ZhbHVlKGZuYW1lLCAodF90eXBlKilldHlwZSwgdmFsdWUpIDw8ICI7IiA8PCBlbmRsOworICB9CisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IGluaXRpYWxpemVzIGNvbXBsZXggY29uc3RhbnRzLgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIoc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdG9wX2xldmVsKSB7CisgIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7CisgIHN0cmluZyBuYW1lX2xjID0gdG9fbG93ZXJfY2FzZShuYW1lX3UpOworICBzdHJpbmcgdHlwZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHR5cGUtPmdldF9uYW1lKCkpOworICBzdHJpbmcgdHlwZV91YyA9IHRvX3VwcGVyX2Nhc2UodHlwZV91KTsKKyAgc3RyaW5nIG1heWJlX3N0YXRpYyA9IHRvcF9sZXZlbCA/ICIiIDogInN0YXRpYyAiOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3N0cmluZ3N0cmVhbSBpbml0aWFsaXplcnM7CisKKyAgICAvLyBpbml0aWFsaXplIGFueSBjb25zdGFudHMgdGhhdCBtYXkgYmUgcmVmZXJlbmNlZCBieSB0aGlzIGluaXRpYWxpemVyCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBzdHJpbmcgZmllbGRfbmFtZSA9ICIiOworCisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgICAgZmllbGRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiCisgICAgICAgICAgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBmaWVsZF9uYW1lID0gdG1wKGZpZWxkX25hbWUpOworCisgICAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcihuYW1lICsgIl9jb25zdGFudF8iICsgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbml0aWFsaXplcnMgPDwgIiAgICBjb25zdGFudC0+IiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICA8PCBjb25zdGFudF92YWx1ZShuYW1lICsgIl9jb25zdGFudF8iICsgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfaXRlci0+c2Vjb25kKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8ICIgICAgY29uc3RhbnQtPl9faXNzZXRfIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiID0gVFJVRTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gaW1wbGVtZW50IHRoZSBpbml0aWFsaXplcgorICAgIGZfdHlwZXNfaW1wbF8gPDwgbWF5YmVfc3RhdGljIDw8IHRoaXMtPm5zcGFjZSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIgKiIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInN0YXRpYyAiIDw8IHRoaXMtPm5zcGFjZSA8PCB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiICpjb25zdGFudCA9IE5VTEw7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGNvbnN0YW50ID09IE5VTEwpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImNvbnN0YW50ID0gZ19vYmplY3RfbmV3ICgiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICAgICAgICAgPDwgIlRZUEVfIiA8PCB0eXBlX3VjIDw8ICIsIE5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgaW5pdGlhbGl6ZXJzLnN0cigpOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIHN0cmluZyBmaWVsZF9uYW1lID0gIiI7CisKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgICBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIKKyAgICAgICAgICArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIGZpZWxkX25hbWUgPSB0bXAoZmllbGRfbmFtZSk7CisgICAgfQorCisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvbnN0YW50OyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICBzdHJpbmcgbGlzdF90eXBlID0gIkdQdHJBcnJheSAqIjsKKyAgICBzdHJpbmcgZnJlZV9mdW5jCisgICAgICAgID0gZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZShyZWludGVycHJldF9jYXN0PHRfbGlzdCo+KHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIHN0cmluZyBsaXN0X2luaXRpYWxpemVyID0gImdfcHRyX2FycmF5X25ld193aXRoX2ZyZWVfZnVuYyAoIiArIGZyZWVfZnVuYyArICIpOyI7CisgICAgc3RyaW5nIGxpc3RfYXBwZW5kZXIgPSAiZ19wdHJfYXJyYXlfYWRkIjsKKyAgICBib29sIGxpc3RfdmFyaWFibGUgPSBmYWxzZTsKKworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3N0cmluZ3N0cmVhbSBpbml0aWFsaXplcnM7CisgICAgb3N0cmluZ3N0cmVhbSBhcHBlbmRlcnM7CisKKyAgICBsaXN0X2luaXRpYWxpemVyID0gZ2VuZXJhdGVfbmV3X2FycmF5X2Zyb21fdHlwZShldHlwZSk7CisgICAgaWYgKGV0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKWV0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBsaXN0X3R5cGUgPSAiR0FycmF5ICoiOworICAgICAgICBsaXN0X2FwcGVuZGVyID0gImdfYXJyYXlfYXBwZW5kX3ZhbCI7CisgICAgICAgIGxpc3RfdmFyaWFibGUgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChldHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBsaXN0X3R5cGUgPSAiR0FycmF5ICoiOworICAgICAgbGlzdF9hcHBlbmRlciA9ICJnX2FycmF5X2FwcGVuZF92YWwiOworICAgICAgbGlzdF92YXJpYWJsZSA9IHRydWU7CisgICAgfQorCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBmbmFtZSA9IHRtcChuYW1lKTsKKworICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIoZm5hbWUsIGV0eXBlLCAoKnZfaXRlcikpOworICAgICAgaWYgKGxpc3RfdmFyaWFibGUpIHsKKyAgICAgICAgaW5pdGlhbGl6ZXJzIDw8ICIgICAgIiA8PCB0eXBlX25hbWUoZXR5cGUpIDw8ICIgIiA8PCBmbmFtZSA8PCAiID0gIgorICAgICAgICAgICAgICAgICAgICAgPDwgY29uc3RhbnRfdmFsdWUoZm5hbWUsICh0X3R5cGUqKWV0eXBlLCAoKnZfaXRlcikpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgYXBwZW5kZXJzIDw8ICIgICAgIiA8PCBsaXN0X2FwcGVuZGVyIDw8ICIoY29uc3RhbnQsICIgPDwgZm5hbWUgPDwgIik7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFwcGVuZGVycyA8PCAiICAgICIgPDwgbGlzdF9hcHBlbmRlciA8PCAiKGNvbnN0YW50LCAiCisgICAgICAgICAgICAgICAgICA8PCBjb25zdGFudF92YWx1ZShmbmFtZSwgKHRfdHlwZSopZXR5cGUsICgqdl9pdGVyKSkgPDwgIik7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmX3R5cGVzX2ltcGxfIDw8IG1heWJlX3N0YXRpYyA8PCBsaXN0X3R5cGUgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9jb25zdGFudCAodm9pZCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic3RhdGljICIgPDwgbGlzdF90eXBlIDw8ICIgY29uc3RhbnQgPSBOVUxMOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoY29uc3RhbnQgPT0gTlVMTCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgaWYgKCFpbml0aWFsaXplcnMuc3RyKCkuZW1wdHkoKSkgeworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbml0aWFsaXplcnMuc3RyKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiY29uc3RhbnQgPSAiIDw8IGxpc3RfaW5pdGlhbGl6ZXIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgYXBwZW5kZXJzLnN0cigpOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvbnN0YW50OyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBvc3RyaW5nc3RyZWFtIGluaXRpYWxpemVyczsKKyAgICBvc3RyaW5nc3RyZWFtIGFwcGVuZGVyczsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgZm5hbWUgPSB0bXAobmFtZSk7CisgICAgICBzdHJpbmcgcHRyID0gaXNfbnVtZXJpYyhldHlwZSkgPyAiKiIgOiAiIjsKKyAgICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKGZuYW1lLCBldHlwZSwgKCp2X2l0ZXIpKTsKKyAgICAgIGluaXRpYWxpemVycyA8PCBjb25zdGFudF92YWx1ZV93aXRoX3N0b3JhZ2UoZm5hbWUsICh0X3R5cGUqKWV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGFwcGVuZGVycyA8PCAiICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGNvbnN0YW50LCAiIDw8IGZuYW1lIDw8ICIsIDApOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3R5cGVzX2ltcGxfIDw8IG1heWJlX3N0YXRpYyA8PCAiR0hhc2hUYWJsZSAqIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYyA8PCAiX2NvbnN0YW50ICh2b2lkKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzdGF0aWMgR0hhc2hUYWJsZSAqY29uc3RhbnQgPSBOVUxMOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChjb25zdGFudCA9PSBOVUxMKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluaXRpYWxpemVycy5zdHIoKSA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiY29uc3RhbnQgPSAiIDw8IGdlbmVyYXRlX25ld19oYXNoX2Zyb21fdHlwZShldHlwZSwgTlVMTCkgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgYXBwZW5kZXJzLnN0cigpOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvbnN0YW50OyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIG9zdHJpbmdzdHJlYW0gaW5pdGlhbGl6ZXJzOworICAgIG9zdHJpbmdzdHJlYW0gYXBwZW5kZXJzOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBmbmFtZSA9IHRtcChuYW1lKTsKKyAgICAgIHN0cmluZyBrbmFtZSA9IGZuYW1lICsgImtleSI7CisgICAgICBzdHJpbmcgdm5hbWUgPSBmbmFtZSArICJ2YWwiOworICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIoa25hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKHZuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworCisgICAgICBpbml0aWFsaXplcnMgPDwgY29uc3RhbnRfdmFsdWVfd2l0aF9zdG9yYWdlKGtuYW1lLCAodF90eXBlKilrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBpbml0aWFsaXplcnMgPDwgY29uc3RhbnRfdmFsdWVfd2l0aF9zdG9yYWdlKHZuYW1lLCAodF90eXBlKil2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgYXBwZW5kZXJzIDw8ICIgICAgZ19oYXNoX3RhYmxlX2luc2VydCAoY29uc3RhbnQsICIgPDwga25hbWUgPDwgIiwgIiA8PCB2bmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl90eXBlc19pbXBsXyA8PCBtYXliZV9zdGF0aWMgPDwgIkdIYXNoVGFibGUgKiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9jb25zdGFudCAodm9pZCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic3RhdGljIEdIYXNoVGFibGUgKmNvbnN0YW50ID0gTlVMTDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoY29uc3RhbnQgPT0gTlVMTCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbml0aWFsaXplcnMuc3RyKCkgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImNvbnN0YW50ID0gIiA8PCBnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUoa3R5cGUsIHZ0eXBlKSA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBhcHBlbmRlcnMuc3RyKCk7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY29uc3RhbnQ7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBjbGFzc2VzIGZvciBhIHNlcnZpY2UsIGNvbnNpc3Rpbmcgb2YgYSBUaHJpZnRTdHJ1Y3Qgc3ViY2xhc3MKKyAqIGZvciB0aGUgYXJndW1lbnRzIHRvIGFuZCB0aGUgcmVzdWx0IGZyb20gZWFjaCBtZXRob2QuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGZvciB3aGljaCB0byBnZW5lcmF0ZSBoZWxwZXIgY2xhc3NlcworICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmdW5jdGlvbl9pdGVyOworCisgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgc2VydmljZSdzIG1ldGhvZHMKKyAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmN0aW9uX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVuY3Rpb25fbmFtZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCk7CisgICAgdF9zdHJ1Y3QqIGFyZ19saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBzdHJpbmcgYXJnX2xpc3RfbmFtZV9vcmlnID0gYXJnX2xpc3QtPmdldF9uYW1lKCk7CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgYXJndW1lbnRzIGNsYXNzCisgICAgYXJnX2xpc3QtPnNldF9uYW1lKHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgdW5kZXJzY29yZXNfdG9faW5pdGlhbF9jYXBzKGZ1bmN0aW9uX25hbWUpICsgIkFyZ3MiKTsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3QoYXJnX2xpc3QpOworCisgICAgYXJnX2xpc3QtPnNldF9uYW1lKGFyZ19saXN0X25hbWVfb3JpZyk7CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgcmVzdWx0IGNsYXNzCisgICAgaWYgKCEoKmZ1bmN0aW9uX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLAorICAgICAgICAgICAgICAgICAgICAgIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgdW5kZXJzY29yZXNfdG9faW5pdGlhbF9jYXBzKGZ1bmN0aW9uX25hbWUpICsgIlJlc3VsdCIpOworICAgICAgdF9maWVsZCBzdWNjZXNzKCgqZnVuY3Rpb25faXRlciktPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgICAgICBzdWNjZXNzLnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgICAgICBpZiAoISgqZnVuY3Rpb25faXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmaWVsZF9pdGVyOworICAgICAgZm9yIChmaWVsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZpZWxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZpZWxkX2l0ZXIpIHsKKyAgICAgICAgKCpmaWVsZF9pdGVyKS0+c2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgqZmllbGRfaXRlcik7CisgICAgICB9CisKKyAgICAgIGdlbmVyYXRlX3N0cnVjdCgmcmVzdWx0KTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgQyBjb2RlIHRoYXQgcmVwcmVzZW50cyBhIFRocmlmdCBzZXJ2aWNlIGNsaWVudC4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLyogZ2V0IHNvbWUgQyBmcmllbmRseSBzZXJ2aWNlIG5hbWVzICovCisgIHN0cmluZyBzZXJ2aWNlX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX25hbWVfKSk7CisgIHN0cmluZyBzZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHNlcnZpY2VfbmFtZV9sYyk7CisKKyAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWU7CisgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lX2xjOworICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZV91YzsKKworICBzdHJpbmcgcGFyZW50X2NsYXNzX25hbWUgPSAiR09iamVjdCI7CisgIHN0cmluZyBwYXJlbnRfdHlwZV9uYW1lID0gIkdfVFlQRV9PQkpFQ1QiOworCisgIC8vIFRoZSBzZXJ2aWNlIHRoaXMgc2VydmljZSBleHRlbmRzLCBvciBOVUxMIGlmIGl0IGV4dGVuZHMgbm8KKyAgLy8gc2VydmljZQorICB0X3NlcnZpY2UqIGV4dGVuZHNfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zZXJ2aWNlKSB7CisgICAgLy8gVGhlIG5hbWUgb2YgdGhlIHBhcmVudCBzZXJ2aWNlCisgICAgcGFyZW50X3NlcnZpY2VfbmFtZSA9IGV4dGVuZHNfc2VydmljZS0+Z2V0X25hbWUoKTsKKyAgICBwYXJlbnRfc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocGFyZW50X3NlcnZpY2VfbmFtZSkpOworICAgIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHBhcmVudF9zZXJ2aWNlX25hbWVfbGMpOworCisgICAgLy8gVGhlIG5hbWVzIG9mIHRoZSBjbGllbnQgY2xhc3MnIHBhcmVudCBjbGFzcyBhbmQgdHlwZQorICAgIHBhcmVudF9jbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgcGFyZW50X3NlcnZpY2VfbmFtZSArICJDbGllbnQiOworICAgIHBhcmVudF90eXBlX25hbWUgPSB0aGlzLT5uc3BhY2VfdWMgKyAiVFlQRV8iICsgcGFyZW50X3NlcnZpY2VfbmFtZV91YyArICJfQ0xJRU5UIjsKKyAgfQorCisgIC8vIFRoZSBiYXNlIHNlcnZpY2UgKHRoZSB0b3Btb3N0IGluIHRoZSAiZXh0ZW5kcyIgaGllcmFyY2h5KSwgb24KKyAgLy8gd2hvc2UgY2xpZW50IGNsYXNzIHRoZSAiaW5wdXRfcHJvdG9jb2wiIGFuZCAib3V0cHV0X3Byb3RvY29sIgorICAvLyBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkCisgIHRfc2VydmljZSogYmFzZV9zZXJ2aWNlID0gdHNlcnZpY2U7CisgIHdoaWxlIChiYXNlX3NlcnZpY2UtPmdldF9leHRlbmRzKCkpIHsKKyAgICBiYXNlX3NlcnZpY2UgPSBiYXNlX3NlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIH0KKworICBzdHJpbmcgYmFzZV9zZXJ2aWNlX25hbWUgPSBiYXNlX3NlcnZpY2UtPmdldF9uYW1lKCk7CisgIHN0cmluZyBiYXNlX3NlcnZpY2VfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGJhc2Vfc2VydmljZV9uYW1lKSk7CisgIHN0cmluZyBiYXNlX3NlcnZpY2VfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoYmFzZV9zZXJ2aWNlX25hbWVfbGMpOworCisgIC8vIEdlbmVyYXRlIHRoZSBjbGllbnQgaW50ZXJmYWNlIGR1bW15IG9iamVjdCBpbiB0aGUgaGVhZGVyLgorICBmX2hlYWRlcl8gPDwgIi8qICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHNlcnZpY2UgaW50ZXJmYWNlICovIiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmICIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmOyAiCisgICAgICAgICAgICA8PCAiIC8qIGR1bW15IG9iamVjdCAqLyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBjbGllbnQgaW50ZXJmYWNlIG9iamVjdCBpbiB0aGUgaGVhZGVyLgorICBmX2hlYWRlcl8gPDwgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICIgIEdUeXBlSW50ZXJmYWNlIHBhcmVudDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvKiB3cml0ZSBvdXQgdGhlIGZ1bmN0aW9ucyBmb3IgdGhpcyBpbnRlcmZhY2UgKi8KKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIC8qIG1ha2UgdGhlIGZ1bmN0aW9uIG5hbWUgQyBmcmllbmRseSAqLworICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICB0X3N0cnVjdCogYXJnbGlzdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICB0X3N0cnVjdCogeGxpc3QgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICBib29sIGhhc19yZXR1cm4gPSAhdHR5cGUtPmlzX3ZvaWQoKTsKKyAgICBib29sIGhhc19hcmdzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKyAgICBib29sIGhhc194Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKworICAgIHN0cmluZyBwYXJhbXMgPSAiKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICppZmFjZSIKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIiogX3JldHVybiIgOiAiIikKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX2FyZ3MgPyAiIiA6ICgiLCAiICsgYXJndW1lbnRfbGlzdChhcmdsaXN0KSkpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc194Y2VwdGlvbnMgPyAiIiA6ICgiLCAiICsgeGNlcHRpb25fbGlzdCh4bGlzdCkpKSArICIsIEdFcnJvciAqKmVycm9yKSI7CisKKyAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiZ2Jvb2xlYW4gKCoiIDw8IGZ1bm5hbWUgPDwgIikgIiA8PCBwYXJhbXMgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlIGFsbCB0aGUgaW50ZXJmYWNlIGJvaWxlcnBsYXRlCisgIGZfaGVhZGVyXyA8PCAiR1R5cGUgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfZ2V0X3R5cGUgKHZvaWQpOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiAiCisgICAgICAgICAgICA8PCAiKCIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2dldF90eXBlKCkpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRihvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYpKSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYob2JqKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUZfR0VUX0lOVEVSRkFDRShpbnN0KSAoR19UWVBFX0lOU1RBTkNFX0dFVF9JTlRFUkZBQ0UgKChpbnN0KSwgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYsICIgPDwgdGhpcy0+bnNwYWNlCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSkpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gd3JpdGUgb3V0IGFsbCB0aGUgaW50ZXJmYWNlIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvKiBtYWtlIHRoZSBmdW5jdGlvbiBuYW1lIEMgZnJpZW5kbHkgKi8KKyAgICBzdHJpbmcgZnVubmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgdF9zdHJ1Y3QqIHhsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgYm9vbCBoYXNfcmV0dXJuID0gIXR0eXBlLT5pc192b2lkKCk7CisgICAgYm9vbCBoYXNfYXJncyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisgICAgYm9vbCBoYXNfeGNlcHRpb25zID0geGxpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisKKyAgICBzdHJpbmcgcGFyYW1zID0gIigiICsgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJJZiAqaWZhY2UiCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCkpKQorICAgICAgICAgICAgICAgICAgICArIChoYXNfeGNlcHRpb25zID8gIiIgOiAoIiwgIiArIHhjZXB0aW9uX2xpc3QoeGxpc3QpKSkgKyAiLCBHRXJyb3IgKiplcnJvcikiOworCisgICAgZl9oZWFkZXJfIDw8ICJnYm9vbGVhbiAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl8iIDw8IGZ1bm5hbWUgPDwgIiAiCisgICAgICAgICAgICAgIDw8IHBhcmFtcyA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgY2xpZW50IG9iamVjdCBpbnN0YW5jZSBkZWZpbml0aW9uIGluIHRoZSBoZWFkZXIuCisgIGZfaGVhZGVyXyA8PCAiLyogIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgc2VydmljZSBjbGllbnQgKi8iIDw8IGVuZGwgPDwgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbCA8PCAiICAiIDw8IHBhcmVudF9jbGFzc19uYW1lCisgICAgICAgICAgICA8PCAiIHBhcmVudDsiIDw8IGVuZGw7CisgIGlmICghZXh0ZW5kc19zZXJ2aWNlKSB7CisgICAgLy8gRGVmaW5lICJpbnB1dF9wcm90b2NvbCIgYW5kICJvdXRwdXRfcHJvdG9jb2wiIHByb3BlcnRpZXMgb25seQorICAgIC8vIGZvciBiYXNlIHNlcnZpY2VzOyBjaGlsZCBzZXJ2aWNlLWNsaWVudCBjbGFzc2VzIHdpbGwgaW5oZXJpdAorICAgIC8vIHRoZXNlCisgICAgZl9oZWFkZXJfIDw8IGVuZGwgPDwgIiAgVGhyaWZ0UHJvdG9jb2wgKmlucHV0X3Byb3RvY29sOyIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCAiICBUaHJpZnRQcm90b2NvbCAqb3V0cHV0X3Byb3RvY29sOyIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGNsYXNzIGRlZmluaXRpb24gaW4gdGhlIGhlYWRlci4KKyAgZl9oZWFkZXJfIDw8ICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCAiICAiIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICJDbGFzcyBwYXJlbnQ7IiA8PCBlbmRsIDw8ICJ9OyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnRDbGFzcyAiIDw8IHRoaXMtPm5zcGFjZQorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3M7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gQ3JlYXRlIGFsbCB0aGUgR09iamVjdCBib2lsZXJwbGF0ZQorICBmX2hlYWRlcl8gPDwgIkdUeXBlICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9nZXRfdHlwZSAodm9pZCk7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCAiCisgICAgICAgICAgICA8PCAiKCIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9nZXRfdHlwZSgpKSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50KSkiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVF9DTEFTUyhjKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICA8PCAiX0NMSUVOVCwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSVNfQ0xJRU5UKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCkpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JU19DTElFTlRfQ0xBU1MoYykgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgPDwgIl9DTElFTlQpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgIDw8ICJfQ0xJRU5UX0dFVF9DTEFTUyhvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MpKSIKKyAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICAvKiB3cml0ZSBvdXQgdGhlIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvKiBtYWtlIHRoZSBmdW5jdGlvbiBuYW1lIEMgZnJpZW5kbHkgKi8KKyAgICBzdHJpbmcgZnVubmFtZSA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpOworCisgICAgdF9mdW5jdGlvbiBzZXJ2aWNlX2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nKCJfY2xpZW50XyIpICsgZnVubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7CisgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZXJ2aWNlX2Z1bmN0aW9uKSA8PCAiOyIgPDwgZW5kbDsKKworICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nKCJfY2xpZW50X3NlbmRfIikgKyBmdW5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgIjsiIDw8IGVuZGw7CisKKyAgICAvLyBpbXBsZW1lbnQgcmVjdiBpZiBub3QgYSBvbmV3YXkgc2VydmljZQorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKyAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nKCJfY2xpZW50X3JlY3ZfIikgKyBmdW5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOworICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvKiB3cml0ZSBvdXQgdGhlIGdldC9zZXQgZnVuY3Rpb24gcHJvdG90eXBlcyAqLworICBmX2hlYWRlcl8gPDwgInZvaWQgIiArIHNlcnZpY2VfbmFtZV9sYyArICJfY2xpZW50X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnR5X2lkLCBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYyk7IgorICAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9oZWFkZXJfIDw8ICJ2b2lkICIgKyBzZXJ2aWNlX25hbWVfbGMgKyAiX2NsaWVudF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0eV9pZCwgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpOyIKKyAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgZl9oZWFkZXJfIDw8IGVuZGw7CisgIC8vIGVuZCBvZiBoZWFkZXIgY29kZQorCisgIC8vIEdlbmVyYXRlIGludGVyZmFjZSBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgLyogbWFrZSB0aGUgZnVuY3Rpb24gbmFtZSBDIGZyaWVuZGx5ICovCisgICAgc3RyaW5nIGZ1bm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHRfc3RydWN0KiBhcmdsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHRfc3RydWN0KiB4bGlzdCA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgIGJvb2wgaGFzX3JldHVybiA9ICF0dHlwZS0+aXNfdm9pZCgpOworICAgIGJvb2wgaGFzX2FyZ3MgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworICAgIGJvb2wgaGFzX3hjZXB0aW9ucyA9IHhsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworCisgICAgc3RyaW5nIHBhcmFtcyA9ICIoIiArIHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSWYgKmlmYWNlIgorICAgICAgICAgICAgICAgICAgICArIChoYXNfcmV0dXJuID8gIiwgIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiKiBfcmV0dXJuIiA6ICIiKQorICAgICAgICAgICAgICAgICAgICArIChoYXNfYXJncyA/ICIiIDogKCIsICIgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0KHhsaXN0KSkpICsgIiwgR0Vycm9yICoqZXJyb3IpIjsKKworICAgIHN0cmluZyBwYXJhbXNfd2l0aG91dF90eXBlID0gc3RyaW5nKCJpZmFjZSwgIikgKyAoaGFzX3JldHVybiA/ICJfcmV0dXJuLCAiIDogIiIpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXJfZmllbGQ7CisgICAgZm9yIChmX2l0ZXJfZmllbGQgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyX2ZpZWxkICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXJfZmllbGQpIHsKKyAgICAgIHBhcmFtc193aXRob3V0X3R5cGUgKz0gKCpmX2l0ZXJfZmllbGQpLT5nZXRfbmFtZSgpOworICAgICAgcGFyYW1zX3dpdGhvdXRfdHlwZSArPSAiLCAiOworICAgIH0KKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhsaXN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgcGFyYW1zX3dpdGhvdXRfdHlwZSArPSAoKnhfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBwYXJhbXNfd2l0aG91dF90eXBlICs9ICIsICI7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCAiZ2Jvb2xlYW4iIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmXyIgPDwgZnVubmFtZQorICAgICAgICAgICAgICAgPDwgIiAiIDw8IHBhcmFtcyA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsIDw8ICIgIHJldHVybiAiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUZfR0VUX0lOVEVSRkFDRSAoaWZhY2UpLT4iIDw8IGZ1bm5hbWUgPDwgIiAoIgorICAgICAgICAgICAgICAgPDwgcGFyYW1zX3dpdGhvdXRfdHlwZSA8PCAiZXJyb3IpOyIgPDwgZW5kbCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgaW50ZXJmYWNlIGJvaWxlcnBsYXRlCisgIGZfc2VydmljZV8gPDwgIkdUeXBlIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl9nZXRfdHlwZSAodm9pZCkiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAieyIgPDwgZW5kbCA8PCAiICBzdGF0aWMgR1R5cGUgdHlwZSA9IDA7IiA8PCBlbmRsIDw8ICIgIGlmICh0eXBlID09IDApIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgeyIgPDwgZW5kbCA8PCAiICAgIHN0YXRpYyBjb25zdCBHVHlwZUluZm8gdHlwZV9pbmZvID0iIDw8IGVuZGwgPDwgIiAgICB7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgIHNpemVvZiAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UpLCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgICAgICBOVUxMLCAgLyogYmFzZV9pbml0ICovIiA8PCBlbmRsIDw8ICIgICAgICBOVUxMLCAgLyogYmFzZV9maW5hbGl6ZSAqLyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgICAgICBOVUxMLCAgLyogY2xhc3NfaW5pdCAqLyIgPDwgZW5kbCA8PCAiICAgICAgTlVMTCwgIC8qIGNsYXNzX2ZpbmFsaXplICovIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgIE5VTEwsICAvKiBjbGFzc19kYXRhICovIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiAgICAgIDAsICAgICAvKiBpbnN0YW5jZV9zaXplICovIiA8PCBlbmRsIDw8ICIgICAgICAwLCAgICAgLyogbl9wcmVhbGxvY3MgKi8iCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgTlVMTCwgIC8qIGluc3RhbmNlX2luaXQgKi8iIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiICAgICAgTlVMTCAgIC8qIHZhbHVlX3RhYmxlICovIiA8PCBlbmRsIDw8ICIgICAgfTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiICAgIHR5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljIChHX1RZUEVfSU5URVJGQUNFLCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZcIiwiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZV9pbmZvLCAwKTsiIDw8IGVuZGwgPDwgIiAgfSIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIHJldHVybiB0eXBlOyIgPDwgZW5kbCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGNsaWVudCBib2lsZXJwbGF0ZQorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCAiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYworICAgICAgICAgICAgIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlICppZmFjZSk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCAiR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICA8PCAiQ2xpZW50LCAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnQsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAiIDw8IHBhcmVudF90eXBlX25hbWUgPDwgIiwgIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKCIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA8PCB0aGlzLT5uc3BhY2VfbGMKKyAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl9pbnRlcmZhY2VfaW5pdCkpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgcHJvcGVydHktcmVsYXRlZCBjb2RlIG9ubHkgZm9yIGJhc2Ugc2VydmljZXMtLS1jaGlsZAorICAvLyBzZXJ2aWNlLWNsaWVudCBjbGFzc2VzIGhhdmUgb25seSBwcm9wZXJ0aWVzIGluaGVyaXRlZCBmcm9tIHRoZWlyCisgIC8vIHBhcmVudCBjbGFzcworICBpZiAoIWV4dGVuZHNfc2VydmljZSkgeworICAgIC8vIEdlbmVyYXRlIGNsaWVudCBwcm9wZXJ0aWVzCisgICAgZl9zZXJ2aWNlXyA8PCAiZW51bSBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50UHJvcGVydGllcyIgPDwgZW5kbCA8PCAieyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgUFJPUF8wLCIgPDwgZW5kbCA8PCAiICBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgICAgPDwgIl9DTElFTlRfSU5QVVRfUFJPVE9DT0wsIiA8PCBlbmRsIDw8ICIgIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVF9PVVRQVVRfUFJPVE9DT0wiIDw8IGVuZGwgPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBnZW5lcmF0ZSBwcm9wZXJ0eSBzZXR0ZXIKKyAgICBmX3NlcnZpY2VfIDw8ICJ2b2lkIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfc2V0X3Byb3BlcnR5ICgiCisgICAgICAgICAgICAgICA8PCAiR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwgY29uc3QgR1ZhbHVlICp2YWx1ZSwgIgorICAgICAgICAgICAgICAgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbCA8PCAiICAiIDw8IHRoaXMtPm5zcGFjZQorICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ICpjbGllbnQgPSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UIChvYmplY3QpOyIgPDwgZW5kbCA8PCBlbmRsIDw8ICIgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIHN3aXRjaCAocHJvcGVydHlfaWQpIiA8PCBlbmRsIDw8ICIgIHsiIDw8IGVuZGwgPDwgIiAgICBjYXNlIFBST1BfIgorICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVF9JTlBVVF9QUk9UT0NPTDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICBjbGllbnQtPmlucHV0X3Byb3RvY29sID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgYnJlYWs7IiA8PCBlbmRsIDw8ICIgICAgY2FzZSBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgICAgPDwgIl9DTElFTlRfT1VUUFVUX1BST1RPQ09MOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgIGNsaWVudC0+b3V0cHV0X3Byb3RvY29sID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgYnJlYWs7IiA8PCBlbmRsIDw8ICIgIH0iIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIGdlbmVyYXRlIHByb3BlcnR5IGdldHRlcgorICAgIGZfc2VydmljZV8gPDwgInZvaWQiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9nZXRfcHJvcGVydHkgKCIKKyAgICAgICAgICAgICAgIDw8ICJHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLCBHVmFsdWUgKnZhbHVlLCAiCisgICAgICAgICAgICAgICA8PCAiR1BhcmFtU3BlYyAqcHNwZWMpIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsIDw8ICIgICIgPDwgdGhpcy0+bnNwYWNlCisgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgKmNsaWVudCA9ICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgICAgPDwgIl9DTElFTlQgKG9iamVjdCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgIiAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgc3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGwgPDwgIiAgeyIgPDwgZW5kbCA8PCAiICAgIGNhc2UgUFJPUF8iCisgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UX0lOUFVUX1BST1RPQ09MOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIGNsaWVudC0+aW5wdXRfcHJvdG9jb2wpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgIGJyZWFrOyIgPDwgZW5kbCA8PCAiICAgIGNhc2UgUFJPUF8iIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UX09VVFBVVF9QUk9UT0NPTDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBjbGllbnQtPm91dHB1dF9wcm90b2NvbCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgYnJlYWs7IiA8PCBlbmRsIDw8ICIgIH0iIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7CisKKyAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcyBhbmQgZXhjZXB0aW9ucworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgLy8gRnVuY3Rpb24gZm9yIHNlbmRpbmcKKyAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZygiX2NsaWVudF9zZW5kXyIpICsgZnVubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKKworICAgIC8vIE9wZW4gdGhlIHNlbmQgZnVuY3Rpb24KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgc3RyaW5nIHJlcVR5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRfT05FV0FZIiA6ICJUX0NBTEwiOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ2ludDMyIGNzZXFpZCA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiVGhyaWZ0UHJvdG9jb2wgKiBwcm90b2NvbCA9ICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IGJhc2Vfc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICAgICA8PCAiX0NMSUVOVCAoaWZhY2UpLT5vdXRwdXRfcHJvdG9jb2w7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJpZiAodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCBcIiIgPDwgbmFtZSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgIDw8IHJlcVR5cGUgPDwgIiwgY3NlcWlkLCBlcnJvcikgPCAwKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IgorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihmX3NlcnZpY2VfLCBhcmdfc3RydWN0LCAiIiwgIiIsIGZhbHNlKTsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBlcnJvcikgPCAwKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgImlmICghdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAocHJvdG9jb2wtPnRyYW5zcG9ydCwgZXJyb3IpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgImlmICghdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKHByb3RvY29sLT50cmFuc3BvcnQsIGVycm9yKSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFRSVUU7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgLy8gR2VuZXJhdGUgcmVjdiBmdW5jdGlvbiBvbmx5IGlmIG5vdCBhbiBhc3luYyBmdW5jdGlvbgorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKyAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nKCJfY2xpZW50X3JlY3ZfIikgKyBmdW5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOworICAgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnaW50MzIgcnNlcWlkOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ2NoYXIgKiBmbmFtZSA9IE5VTEw7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRNZXNzYWdlVHlwZSBtdHlwZTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFByb3RvY29sICogcHJvdG9jb2wgPSAiCisgICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBiYXNlX3NlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgICAgICA8PCAiX0NMSUVOVCAoaWZhY2UpLT5pbnB1dF9wcm90b2NvbDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp4Y2VwdGlvbjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gIgorICAgICAgICAgICAgICAgICAgICAiKHByb3RvY29sLCAmZm5hbWUsICZtdHlwZSwgJnJzZXFpZCwgZXJyb3IpIDwgMCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiBGQUxTRTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAobXR5cGUgPT0gVF9FWENFUFRJT04pIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChmbmFtZSkgZ19mcmVlIChmbmFtZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ4Y2VwdGlvbiA9IGdfb2JqZWN0X25ldyAiCisgICAgICAgICAgICAgICAgICAgICIoVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLCBOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF9zdHJ1Y3RfcmVhZCAoVEhSSUZUX1NUUlVDVCAoeGNlcHRpb24pLCAiCisgICAgICAgICAgICAgICAgICAgICJwcm90b2NvbCwgTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAiCisgICAgICAgICAgICAgICAgICAgICIocHJvdG9jb2wsIE5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAiCisgICAgICAgICAgICAgICAgICAgICIocHJvdG9jb2wtPnRyYW5zcG9ydCwgTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJnX3NldF9lcnJvciAoZXJyb3IsICIKKyAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1IseGNlcHRpb24tPnR5cGUsICIKKyAgICAgICAgICAgICAgICAgICAgIlwiYXBwbGljYXRpb24gZXJyb3I6ICVzXCIsIHhjZXB0aW9uLT5tZXNzYWdlKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gRkFMU0U7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSBpZiAobXR5cGUgIT0gVF9SRVBMWSkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgVF9TVFJVQ1QsICIKKyAgICAgICAgICAgICAgICAgICAgIk5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLCAiCisgICAgICAgICAgICAgICAgICAgICJOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKCIKKyAgICAgICAgICAgICAgICAgICAgInByb3RvY29sLT50cmFuc3BvcnQsIE5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ19zZXRfZXJyb3IgKGVycm9yLCAiCisgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0lOVkFMSURfTUVTU0FHRV9UWVBFLCAiCisgICAgICAgICAgICAgICAgICAgICJcImludmFsaWQgbWVzc2FnZSB0eXBlICVkLCBleHBlY3RlZCBUX1JFUExZXCIsIG10eXBlKTsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiBGQUxTRTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIGlmIChzdHJuY21wIChmbmFtZSwgXCIiIDw8IG5hbWUKKyAgICAgICAgICAgICAgICAgPDwgIlwiLCAiIDw8IG5hbWUubGVuZ3RoKCkgPDwgIikgIT0gMCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBUX1NUUlVDVCwgIgorICAgICAgICAgICAgICAgICAgICAiTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIgorICAgICAgICAgICAgICAgICAgICAiZXJyb3IpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoIgorICAgICAgICAgICAgICAgICAgICAicHJvdG9jb2wtPnRyYW5zcG9ydCwgZXJyb3IpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ19zZXRfZXJyb3IgKGVycm9yLCAiCisgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1dST05HX01FVEhPRF9OQU1FLCAiCisgICAgICAgICAgICAgICAgICAgICJcIndyb25nIG1ldGhvZCBuYW1lICVzLCBleHBlY3RlZCAiIDw8IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCBmbmFtZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIEZBTFNFOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgICAgIHsKKyAgICAgICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgICAgIHRfZmllbGQgc3VjY2VzcygoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksICIqX3JldHVybiIsIDApOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgcmVhZGVycyBmb3IgZXhjZXB0aW9ucywgZGVyZWZlcmVuY2luZyB0aGUgcG9pbnRlci4KKyAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgeF9pdGVyKyspIHsKKyAgICAgICAgICB0X2ZpZWxkKiB4Y2VwdGlvbiA9IG5ldyB0X2ZpZWxkKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIqIiArICgqeF9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqeF9pdGVyKS0+Z2V0X2tleSgpKTsKKyAgICAgICAgICByZXN1bHQuYXBwZW5kKHhjZXB0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIoZl9zZXJ2aWNlXywgJnJlc3VsdCwgIiIsICIiLCBmYWxzZSk7CisgICAgICB9CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICh0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIGVycm9yKSA8IDApIgorICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiaWYgKCF0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChwcm90b2NvbC0+dHJhbnNwb3J0LCBlcnJvcikpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgLy8gY29weSBvdmVyIGFueSB0aHJvdyBleGNlcHRpb25zIGFuZCByZXR1cm4gZmFpbHVyZQorICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgeF9pdGVyKyspIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCoiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgICBnX3NldF9lcnJvciAoZXJyb3IsICIKKyAgICAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgICAgICAgICA8PCB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkpKQorICAgICAgICAgICAgICAgICAgIDw8ICJfRVJST1IsICIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgICAgICAgICAgPDwgdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICA8PCAiX0VSUk9SX0NPREUsIFwiIiA8PCAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisgICAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gVFJVRTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIH0KKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICB0X2Z1bmN0aW9uIHNlcnZpY2VfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMgKyBzdHJpbmcoIl9jbGllbnRfIikgKyBmdW5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZXJ2aWNlX2Z1bmN0aW9uKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgLy8gd3JhcCBlYWNoIGZ1bmN0aW9uCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCEiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfc2VuZF8iCisgICAgICAgICAgICAgICA8PCBmdW5uYW1lIDw8ICIgKGlmYWNlIjsKKworICAgIC8vIERlY2xhcmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiLCBlcnJvcikpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGw7CisKKyAgICAvLyBpZiBub3Qgb25ld2F5LCBpbXBsZW1lbnQgcmVjdgorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIHJldCA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpID8gIiIgOiAiX3JldHVybiwgIjsKKworICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICByZXQgKz0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICByZXQgKz0gIiwgIjsKKyAgICAgIH0KKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCEiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfcmVjdl8iCisgICAgICAgICAgICAgICAgIDw8IGZ1bm5hbWUgPDwgIiAoaWZhY2UsICIgPDwgcmV0IDw8ICJlcnJvcikpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gcmV0dXJuIFRSVUUgd2hpY2ggbWVhbnMgYWxsIGZ1bmN0aW9ucyB3ZXJlIGNhbGxlZCBPSworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIFRSVUU7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICB9CisKKyAgLy8gY3JlYXRlIHRoZSBpbnRlcmZhY2UgaW5pdGlhbGl6ZXIKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQgKCIKKyAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UgKmlmYWNlKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAvKiBtYWtlIHRoZSBmdW5jdGlvbiBuYW1lIEMgZnJpZW5kbHkgKi8KKyAgICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmYWNlLT4iIDw8IGZ1bm5hbWUgPDwgIiA9ICIgPDwgdGhpcy0+bnNwYWNlX2xjCisgICAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF8iIDw8IGZ1bm5hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7IiA8PCBlbmRsOworICB9CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBjcmVhdGUgdGhlIGNsaWVudCBpbnN0YW5jZSBpbml0aWFsaXplcgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfaW5pdCAoIgorICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgKmNsaWVudCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoIWV4dGVuZHNfc2VydmljZSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNsaWVudC0+aW5wdXRfcHJvdG9jb2wgPSBOVUxMOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImNsaWVudC0+b3V0cHV0X3Byb3RvY29sID0gTlVMTDsiIDw8IGVuZGw7CisgIH0KKyAgZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKGNsaWVudCk7IiA8PCBlbmRsOworICB9CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBjcmVhdGUgdGhlIGNsaWVudCBjbGFzcyBpbml0aWFsaXplcgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjCisgICAgICAgICAgICAgPDwgIl9jbGllbnRfY2xhc3NfaW5pdCAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MgKmNscykiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgaWYgKCFleHRlbmRzX3NlcnZpY2UpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYzsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjCisgICAgICAgICAgICAgICA8PCAiX2NsaWVudF9zZXRfcHJvcGVydHk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMKKyAgICAgICAgICAgICAgIDw8ICJfY2xpZW50X2dldF9wcm9wZXJ0eTsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19vYmplY3QgKFwiaW5wdXRfcHJvdG9jb2xcIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImlucHV0IHByb3RvY29sIChjb25zdHJ1Y3QpXCIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJTZXQgdGhlIGNsaWVudCBpbnB1dCBwcm90b2NvbFwiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgICAgPDwgIl9DTElFTlRfSU5QVVRfUFJPVE9DT0wsIHBhcmFtX3NwZWMpOyIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX29iamVjdCAoXCJvdXRwdXRfcHJvdG9jb2xcIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm91dHB1dCBwcm90b2NvbCAoY29uc3RydWN0KVwiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU2V0IHRoZSBjbGllbnQgb3V0cHV0IHByb3RvY29sXCIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfUFJPVE9DT0wsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICAgICA8PCAiX0NMSUVOVF9PVVRQVVRfUFJPVE9DT0wsIHBhcmFtX3NwZWMpOyIgPDwgZW5kbDsKKyAgfQorICBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIgIFRIUklGVF9VTlVTRURfVkFSIChjbHMpOyIgPDwgZW5kbDsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IHJlcHJlc2VudHMgYSBUaHJpZnQgc2VydmljZSBoYW5kbGVyLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBmb3Igd2hpY2ggdG8gZ2VuZXJhdGUgYSBoYW5kbGVyLgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oYW5kbGVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmdW5jdGlvbl9pdGVyOworCisgIHN0cmluZyBzZXJ2aWNlX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX25hbWVfKSk7CisgIHN0cmluZyBzZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHNlcnZpY2VfbmFtZV9sYyk7CisKKyAgc3RyaW5nIHNlcnZpY2VfaGFuZGxlcl9uYW1lID0gc2VydmljZV9uYW1lXyArICJIYW5kbGVyIjsKKworICBzdHJpbmcgY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfaGFuZGxlcl9uYW1lOworICBzdHJpbmcgY2xhc3NfbmFtZV9sYyA9IHRoaXMtPm5zcGFjZV9sYyArIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX2hhbmRsZXJfbmFtZSk7CisgIHN0cmluZyBjbGFzc19uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShjbGFzc19uYW1lX2xjKTsKKworICBzdHJpbmcgcGFyZW50X2NsYXNzX25hbWU7CisgIHN0cmluZyBwYXJlbnRfdHlwZV9uYW1lOworCisgIHN0cmluZyBhcmdzX2luZGVudDsKKworICAvLyBUaGUgc2VydmljZSB0aGlzIHNlcnZpY2UgZXh0ZW5kcywgb3IgTlVMTCBpZiBpdCBleHRlbmRzIG5vIHNlcnZpY2UKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKworICAvLyBEZXRlcm1pbmUgdGhlIG5hbWUgb2Ygb3VyIHBhcmVudCBzZXJ2aWNlIChpZiBhbnkpIGFuZCB0aGUgaGFuZGxlciBjbGFzcycKKyAgLy8gcGFyZW50IGNsYXNzIG5hbWUgYW5kIHR5cGUKKyAgaWYgKGV4dGVuZHNfc2VydmljZSkgeworICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lID0gZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocGFyZW50X3NlcnZpY2VfbmFtZSkpOworICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShwYXJlbnRfc2VydmljZV9uYW1lX2xjKTsKKworICAgIHBhcmVudF9jbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgcGFyZW50X3NlcnZpY2VfbmFtZSArICJIYW5kbGVyIjsKKyAgICBwYXJlbnRfdHlwZV9uYW1lID0gdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIiArIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgKyAiX0hBTkRMRVIiOworICB9IGVsc2UgeworICAgIHBhcmVudF9jbGFzc19uYW1lID0gIkdPYmplY3QiOworICAgIHBhcmVudF90eXBlX25hbWUgPSAiR19UWVBFX09CSkVDVCI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBjbGFzcycgZGVmaW5pdGlvbiBpbiB0aGUgaGVhZGVyIGZpbGUKKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBpbnN0YW5jZSBkZWZpbml0aW9uCisgIGZfaGVhZGVyXyA8PCAiLyogIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgaGFuZGxlciAoYWJzdHJhY3QgYmFzZSBjbGFzcykgKi8iIDw8IGVuZGwgPDwgInN0cnVjdCBfIgorICAgICAgICAgICAgPDwgY2xhc3NfbmFtZSA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICIgcGFyZW50OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgY2xhc3NfbmFtZSA8PCAiICIgPDwgY2xhc3NfbmFtZSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBjbGFzcyBkZWZpbml0aW9uLCBpbmNsdWRpbmcgaXRzIGNsYXNzIG1lbWJlcnMKKyAgLy8gKG1ldGhvZHMpCisgIGZfaGVhZGVyXyA8PCAic3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICJDbGFzcyBwYXJlbnQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmN0aW9uX2l0ZXIpIHsKKyAgICBzdHJpbmcgbWV0aG9kX25hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgdF90eXBlKiByZXR1cm5fdHlwZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgdF9zdHJ1Y3QqIGFyZ19saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICB0X3N0cnVjdCogeF9saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgIGJvb2wgaGFzX3JldHVybiA9ICFyZXR1cm5fdHlwZS0+aXNfdm9pZCgpOworICAgIGJvb2wgaGFzX2FyZ3MgPSBhcmdfbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKyAgICBib29sIGhhc194Y2VwdGlvbnMgPSB4X2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisKKyAgICBzdHJpbmcgcGFyYW1zID0gIigiICsgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJJZiAqaWZhY2UiCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lKHJldHVybl90eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QoYXJnX2xpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0KHhfbGlzdCkpKSArICIsIEdFcnJvciAqKmVycm9yKSI7CisKKyAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiZ2Jvb2xlYW4gKCoiIDw8IG1ldGhvZF9uYW1lIDw8ICIpICIgPDwgcGFyYW1zIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MgIiA8PCBjbGFzc19uYW1lCisgICAgICAgICAgICA8PCAiQ2xhc3M7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHJlbWFpbmluZyBoZWFkZXIgYm9pbGVycGxhdGUKKyAgZl9oZWFkZXJfIDw8ICJHVHlwZSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9nZXRfdHlwZSAodm9pZCk7IiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIgIgorICAgICAgICAgICAgPDwgIigiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9nZXRfdHlwZSgpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IGNsYXNzX25hbWVfdWMKKyAgICAgICAgICAgIDw8ICIob2JqKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUiwgIiA8PCBjbGFzc19uYW1lIDw8ICIpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUihvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBjbGFzc19uYW1lX3VjCisgICAgICAgICAgICA8PCAiX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSLCAiIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVJfQ0xBU1MoYykgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgPDwgIl9IQU5ETEVSKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICA8PCAiX0hBTkRMRVJfR0VUX0NMQVNTKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUiwgIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgY2xhc3MnIG1ldGhvZCBkZWZpbml0aW9ucworICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY3Rpb25faXRlcikgeworICAgIHN0cmluZyBtZXRob2RfbmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB0X3R5cGUqIHJldHVybl90eXBlID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICB0X3N0cnVjdCogYXJnX2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHRfc3RydWN0KiB4X2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgYm9vbCBoYXNfcmV0dXJuID0gIXJldHVybl90eXBlLT5pc192b2lkKCk7CisgICAgYm9vbCBoYXNfYXJncyA9IGFyZ19saXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworICAgIGJvb2wgaGFzX3hjZXB0aW9ucyA9IHhfbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKworICAgIHN0cmluZyBwYXJhbXMgPSAiKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICppZmFjZSIKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUocmV0dXJuX3R5cGUpICsgIiogX3JldHVybiIgOiAiIikKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX2FyZ3MgPyAiIiA6ICgiLCAiICsgYXJndW1lbnRfbGlzdChhcmdfbGlzdCkpKQorICAgICAgICAgICAgICAgICAgICArIChoYXNfeGNlcHRpb25zID8gIiIgOiAoIiwgIiArIHhjZXB0aW9uX2xpc3QoeF9saXN0KSkpICsgIiwgR0Vycm9yICoqZXJyb3IpIjsKKworICAgIGZfaGVhZGVyXyA8PCAiZ2Jvb2xlYW4gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfIiA8PCBtZXRob2RfbmFtZSA8PCAiICIgPDwgcGFyYW1zIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGZfaGVhZGVyXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyJ3MgaW1wbGVtZW50YXRpb24gaW4gdGhlIGltcGxlbWVudGF0aW9uIGZpbGUKKworICAvLyBHZW5lcmF0ZSB0aGUgaW1wbGVtZW50YXRpb24gYm9pbGVycGxhdGUKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgY2xhc3NfbmFtZV9sYyA8PCAiXyIgPDwgc2VydmljZV9uYW1lX2xjCisgICAgICAgICAgICAgPDwgIl9pZl9pbnRlcmZhY2VfaW5pdCAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UgKmlmYWNlKTsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKDI1LCAnICcpOworICBmX3NlcnZpY2VfIDw8ICJHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoIiA8PCBjbGFzc19uYW1lIDw8ICIsICIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgIDw8IGNsYXNzX25hbWVfbGMgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgcGFyZW50X3R5cGVfbmFtZSA8PCAiLCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKCIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiwiIDw8IGVuZGw7CisgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMywgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfIiA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl9pbnRlcmZhY2VfaW5pdCkpIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jdGlvbl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bmN0aW9uX25hbWUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBtZXRob2RfbmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhmdW5jdGlvbl9uYW1lKTsKKyAgICB0X3R5cGUqIHJldHVybl90eXBlID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICB0X3N0cnVjdCogYXJnX2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHRfc3RydWN0KiB4X2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX2xpc3QtPmdldF9tZW1iZXJzKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geF9saXN0LT5nZXRfbWVtYmVycygpOworCisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmllbGRfaXRlcjsKKworICAgIHRfZnVuY3Rpb24gaW1wbGVtZW50aW5nX2Z1bmN0aW9uKHJldHVybl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArICJfaGFuZGxlcl8iICsgbWV0aG9kX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKTsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJmltcGxlbWVudGluZ19mdW5jdGlvbikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX3JldHVybl92YWxfaWZfZmFpbCAoIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIKKyAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIgKGlmYWNlKSwgRkFMU0UpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicmV0dXJuICIgPDwgY2xhc3NfbmFtZV91YyA8PCAiX0dFVF9DTEFTUyAoaWZhY2UpIgorICAgICAgICAgICAgICAgPDwgIi0+IiA8PCBtZXRob2RfbmFtZSA8PCAiIChpZmFjZSwgIjsKKworICAgIGlmICghcmV0dXJuX3R5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiX3JldHVybiwgIjsKKyAgICB9CisgICAgZm9yIChmaWVsZF9pdGVyID0gYXJncy5iZWdpbigpOyBmaWVsZF9pdGVyICE9IGFyZ3MuZW5kKCk7ICsrZmllbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZpZWxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsICI7CisgICAgfQorICAgIGZvciAoZmllbGRfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyBmaWVsZF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKytmaWVsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICgqZmllbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiZXJyb3IpOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyIGludGVyZmFjZSBpbml0aWFsaXplcgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfIiA8PCBzZXJ2aWNlX25hbWVfbGMKKyAgICAgICAgICAgICA8PCAiX2lmX2ludGVyZmFjZV9pbml0ICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSAqaWZhY2UpIgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDApIHsKKyAgICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY3Rpb25faXRlcikgeworICAgICAgc3RyaW5nIG1ldGhvZF9uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCkpOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZmFjZS0+IiA8PCBtZXRob2RfbmFtZSA8PCAiID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfIgorICAgICAgICAgICAgICAgICA8PCBtZXRob2RfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsiIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyIGluc3RhbmNlIGluaXRpYWxpemVyCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9pbml0ICgiIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZikiCisgICAgICAgICAgICAgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChzZWxmKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBjbGFzcyBpbml0aWFsaXplcgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9jbGFzc19pbml0ICgiIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzICpjbHMpIgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDApIHsKKyAgICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKKyAgICAgICAgIGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOworICAgICAgICAgKytmdW5jdGlvbl9pdGVyKSB7CisgICAgICBzdHJpbmcgZnVuY3Rpb25fbmFtZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCk7CisgICAgICBzdHJpbmcgbWV0aG9kX25hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoZnVuY3Rpb25fbmFtZSk7CisKKyAgICAgIC8vIEFsbCBtZXRob2RzIGFyZSBwdXJlIHZpcnR1YWwgYW5kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2xzLT4iIDw8IG1ldGhvZF9uYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKGNscyk7IiA8PCBlbmRsOworICB9CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgQyBjb2RlIHRoYXQgcmVwcmVzZW50cyBhIFRocmlmdCBzZXJ2aWNlIHByb2Nlc3Nvci4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZm9yIHdoaWNoIHRvIGdlbmVyYXRlIGEgcHJvY2Vzc29yCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZnVuY3Rpb25faXRlcjsKKworICBzdHJpbmcgc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9uYW1lXykpOworICBzdHJpbmcgc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShzZXJ2aWNlX25hbWVfbGMpOworCisgIHN0cmluZyBzZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lID0gc2VydmljZV9uYW1lXyArICJQcm9jZXNzb3IiOworCisgIHN0cmluZyBjbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgc2VydmljZV9wcm9jZXNzb3JfbmFtZTsKKyAgc3RyaW5nIGNsYXNzX25hbWVfbGMgPSB0aGlzLT5uc3BhY2VfbGMgKyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9wcm9jZXNzb3JfbmFtZSk7CisgIHN0cmluZyBjbGFzc19uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShjbGFzc19uYW1lX2xjKTsKKworICBzdHJpbmcgcGFyZW50X2NsYXNzX25hbWU7CisgIHN0cmluZyBwYXJlbnRfdHlwZV9uYW1lOworCisgIHN0cmluZyBoYW5kbGVyX2NsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIkhhbmRsZXIiOworICBzdHJpbmcgaGFuZGxlcl9jbGFzc19uYW1lX2xjID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGhhbmRsZXJfY2xhc3NfbmFtZSk7CisKKyAgc3RyaW5nIHByb2Nlc3NfZnVuY3Rpb25fdHlwZV9uYW1lID0gY2xhc3NfbmFtZSArICJQcm9jZXNzRnVuY3Rpb24iOworICBzdHJpbmcgcHJvY2Vzc19mdW5jdGlvbl9kZWZfdHlwZV9uYW1lID0KKyAgICBjbGFzc19uYW1lX2xjICsgIl9wcm9jZXNzX2Z1bmN0aW9uX2RlZiI7CisKKyAgc3RyaW5nIGZ1bmN0aW9uX25hbWU7CisgIHN0cmluZyBhcmdzX2luZGVudDsKKworICAvLyBUaGUgc2VydmljZSB0aGlzIHNlcnZpY2UgZXh0ZW5kcywgb3IgTlVMTCBpZiBpdCBleHRlbmRzIG5vIHNlcnZpY2UKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKworICAvLyBEZXRlcm1pbmUgdGhlIG5hbWUgb2Ygb3VyIHBhcmVudCBzZXJ2aWNlIChpZiBhbnkpIGFuZCB0aGUKKyAgLy8gcHJvY2Vzc29yIGNsYXNzJyBwYXJlbnQgY2xhc3MgbmFtZSBhbmQgdHlwZQorICBpZiAoZXh0ZW5kc19zZXJ2aWNlKSB7CisgICAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWUgPSBleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCk7CisgICAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhwYXJlbnRfc2VydmljZV9uYW1lKSk7CisgICAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHBhcmVudF9zZXJ2aWNlX25hbWVfbGMpOworCisgICAgcGFyZW50X2NsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBwYXJlbnRfc2VydmljZV9uYW1lICsgIlByb2Nlc3NvciI7CisgICAgcGFyZW50X3R5cGVfbmFtZSA9IHRoaXMtPm5zcGFjZV91YyArICJUWVBFXyIgKyBwYXJlbnRfc2VydmljZV9uYW1lX3VjICsgIl9QUk9DRVNTT1IiOworICB9IGVsc2UgeworICAgIHBhcmVudF9jbGFzc19uYW1lID0gIlRocmlmdERpc3BhdGNoUHJvY2Vzc29yIjsKKyAgICBwYXJlbnRfdHlwZV9uYW1lID0gIlRIUklGVF9UWVBFX0RJU1BBVENIX1BST0NFU1NPUiI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yIGNsYXNzJyBkZWZpbml0aW9uIGluIHRoZSBoZWFkZXIgZmlsZQorCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IgaW5zdGFuY2UgZGVmaW5pdGlvbgorICBmX2hlYWRlcl8gPDwgIi8qICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHByb2Nlc3NvciAqLyIgPDwgZW5kbCA8PCAic3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgZW5kbAorICAgICAgICAgICAgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgcGFyZW50X2NsYXNzX25hbWUgPDwgIiBwYXJlbnQ7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICIvKiBwcm90ZWN0ZWQgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSGFuZGxlciAqaGFuZGxlcjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJHSGFzaFRhYmxlICpwcm9jZXNzX21hcDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgIiAiIDw8IGNsYXNzX25hbWUgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvciBjbGFzcyBkZWZpbml0aW9uCisgIGZfaGVhZGVyXyA8PCAic3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICJDbGFzcyBwYXJlbnQ7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICIvKiBwcm90ZWN0ZWQgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJnYm9vbGVhbiAoKmRpc3BhdGNoX2NhbGwpIChUaHJpZnREaXNwYXRjaFByb2Nlc3NvciAqcHJvY2Vzc29yLCIgPDwgZW5kbDsKKyAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygyNywgJyAnKTsKKyAgZl9oZWFkZXJfIDw8IGFyZ3NfaW5kZW50IDw8ICJUaHJpZnRQcm90b2NvbCAqaW4sIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJUaHJpZnRQcm90b2NvbCAqb3V0LCIKKyAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImdjaGFyICpmbmFtZSwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImdpbnQzMiBzZXFpZCwiCisgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHRXJyb3IgKiplcnJvcik7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcyAiIDw8IGNsYXNzX25hbWUKKyAgICAgICAgICAgIDw8ICJDbGFzczsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcmVtYWluaW5nIGhlYWRlciBib2lsZXJwbGF0ZQorICBmX2hlYWRlcl8gPDwgIkdUeXBlICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2dldF90eXBlICh2b2lkKTsiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SICIKKyAgICAgICAgICAgIDw8ICIoIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZ2V0X3R5cGUoKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBjbGFzc19uYW1lX3VjCisgICAgICAgICAgICA8PCAiKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUiwgIiA8PCBjbGFzc19uYW1lIDw8ICIpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgY2xhc3NfbmFtZV91YworICAgICAgICAgICAgPDwgIl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SLCAiIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUl9DTEFTUyhjKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICA8PCAiX1BST0NFU1NPUikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgPDwgIl9QUk9DRVNTT1JfR0VUX0NMQVNTKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SLCAiIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzKSkiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgaW1wbGVtZW50YXRpb24gaW4gdGhlIGltcGxlbWVudGF0aW9uIGZpbGUKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgcHJvcGVydGllcyBlbnVtCisgIGZfc2VydmljZV8gPDwgImVudW0gXyIgPDwgY2xhc3NfbmFtZSA8PCAiUHJvcGVydGllcyIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlBST1BfIiA8PCBjbGFzc19uYW1lX3VjIDw8ICJfMCwiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlBST1BfIgorICAgICAgICAgICAgIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9IQU5ETEVSIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBib2lsZXJwbGF0ZQorICBhcmdzX2luZGVudCA9IHN0cmluZygxNSwgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCAiR19ERUZJTkVfVFlQRSAoIiA8PCBjbGFzc19uYW1lIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8IGNsYXNzX25hbWVfbGMKKyAgICAgICAgICAgICA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCBwYXJlbnRfdHlwZV9uYW1lIDw8ICIpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIHByb2Nlc3NpbmctZnVuY3Rpb24gdHlwZQorICBhcmdzX2luZGVudCA9IHN0cmluZyhwcm9jZXNzX2Z1bmN0aW9uX3R5cGVfbmFtZS5sZW5ndGgoKSArIDIzLCAnICcpOworICBmX3NlcnZpY2VfIDw8ICJ0eXBlZGVmIGdib29sZWFuICgqICIgPDwgcHJvY2Vzc19mdW5jdGlvbl90eXBlX25hbWUgPDwgIikgKCIKKyAgICAgICAgICAgICA8PCBjbGFzc19uYW1lIDw8ICIgKiwgIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgImdpbnQzMiwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiVGhyaWZ0UHJvdG9jb2wgKiwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiVGhyaWZ0UHJvdG9jb2wgKiwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiR0Vycm9yICoqKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBwcm9jZXNzaW5nLWZ1bmN0aW9uLWRlZmluaXRpb24gdHlwZQorICBmX3NlcnZpY2VfIDw8ICJ0eXBlZGVmIHN0cnVjdCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ2NoYXIgKm5hbWU7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgcHJvY2Vzc19mdW5jdGlvbl90eXBlX25hbWUgPDwgIiBmdW5jdGlvbjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgIn0gIiA8PCBwcm9jZXNzX2Z1bmN0aW9uX2RlZl90eXBlX25hbWUgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGZvcndhcmQgZGVjbGFyYXRpb25zIG9mIHRoZSBwcm9jZXNzb3IncyBwcm9jZXNzaW5nIGZ1bmN0aW9ucyBzbyB3ZQorICAvLyBjYW4gcmVmZXIgdG8gdGhlbSBpbiB0aGUgcHJvY2Vzc2luZy1mdW5jdGlvbi1kZWZpbml0aW9uIHN0cnVjdCBiZWxvdyBhbmQKKyAgLy8ga2VlcCBhbGwgb2YgdGhlIHByb2Nlc3NvcidzIGRlY2xhcmF0aW9ucyBpbiBvbmUgcGxhY2UKKyAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7CisgICAgICAgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7CisgICAgICAgKytmdW5jdGlvbl9pdGVyKSB7CisgICAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX3Byb2Nlc3NfIgorICAgICAgKyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSk7CisKKyAgICBhcmdzX2luZGVudCA9IHN0cmluZyhmdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKKyAgICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgZ2Jvb2xlYW4iIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9uX25hbWUgPDwgIiAoIgorICAgICAgICAgICAgICAgPDwgY2xhc3NfbmFtZSA8PCAiICosIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiZ2ludDMyLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIlRocmlmdFByb3RvY29sICosIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiVGhyaWZ0UHJvdG9jb2wgKiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJHRXJyb3IgKiopOyIgPDwgZW5kbDsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIHByb2Nlc3NpbmctZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGlmIHRoZSBzZXJ2aWNlCisgIC8vIGRlZmluZXMgYW55IG1ldGhvZHMKKyAgaWYgKGZ1bmN0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic3RhdGljICIgPDwgcHJvY2Vzc19mdW5jdGlvbl9kZWZfdHlwZV9uYW1lCisgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcHJvY2Vzc19mdW5jdGlvbl9kZWZzWyIKKyAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9ucy5zaXplKCkgPDwgIl0gPSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOworICAgICAgICAgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7CisgICAgICAgICArK2Z1bmN0aW9uX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgc3RyaW5nIHByb2Nlc3NfZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX3Byb2Nlc3NfIgorICAgICAgICArIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX2Z1bmN0aW9uX25hbWUpOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJcIiIgPDwgc2VydmljZV9mdW5jdGlvbl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgcHJvY2Vzc19mdW5jdGlvbl9uYW1lIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIKKyAgICAgICAgICAgICAgICAgPDwgKGZ1bmN0aW9uX2l0ZXIgPT0gLS1mdW5jdGlvbnMuZW5kKCkgPyAiIiA6ICIsIikgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBwcm9jZXNzaW5nIGZ1bmN0aW9ucworICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY3Rpb25faXRlcikgeworICAgIHN0cmluZyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfaWMgPSB1bmRlcnNjb3Jlc190b19pbml0aWFsX2NhcHMoc2VydmljZV9mdW5jdGlvbl9uYW1lKTsKKyAgICBzdHJpbmcgc2VydmljZV9mdW5jdGlvbl9uYW1lX2xjID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHNlcnZpY2VfZnVuY3Rpb25fbmFtZSk7CisgICAgc3RyaW5nIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2Uoc2VydmljZV9mdW5jdGlvbl9uYW1lX2xjKTsKKworICAgIHRfdHlwZSogcmV0dXJuX3R5cGUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIGJvb2wgaGFzX3JldHVybl92YWx1ZSA9ICFyZXR1cm5fdHlwZS0+aXNfdm9pZCgpOworCisgICAgdF9zdHJ1Y3QqIGFyZ19saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX2xpc3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYXJnX2l0ZXI7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeGNlcHRpb25faXRlcjsKKworICAgIHN0cmluZyBhcmdzX2NsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgc2VydmljZV9mdW5jdGlvbl9uYW1lX2ljICsgIkFyZ3MiOworICAgIHN0cmluZyBhcmdzX2NsYXNzX3R5cGUgPSB0aGlzLT5uc3BhY2VfdWMgKyAiVFlQRV8iICsgc2VydmljZV9uYW1lX3VjICsgIl8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VydmljZV9mdW5jdGlvbl9uYW1lX3VjICsgIl9BUkdTIjsKKworICAgIHN0cmluZyByZXN1bHRfY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfaWMgKyAiUmVzdWx0IjsKKyAgICBzdHJpbmcgcmVzdWx0X2NsYXNzX3R5cGUgPSB0aGlzLT5uc3BhY2VfdWMgKyAiVFlQRV8iICsgc2VydmljZV9uYW1lX3VjICsgIl8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfdWMgKyAiX1JFU1VMVCI7CisKKyAgICBzdHJpbmcgaGFuZGxlcl9mdW5jdGlvbl9uYW1lID0gaGFuZGxlcl9jbGFzc19uYW1lX2xjICsgIl8iICsgc2VydmljZV9mdW5jdGlvbl9uYW1lX2xjOworCisgICAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX3Byb2Nlc3NfIgorICAgICAgICAgICAgICAgICAgICArIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX2Z1bmN0aW9uX25hbWUpOworCisgICAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7CisgICAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIGdib29sZWFuIiA8PCBlbmRsIDw8IGZ1bmN0aW9uX25hbWUgPDwgIiAoIiA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYsIgorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZ2ludDMyIHNlcXVlbmNlX2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgPDwgIlRocmlmdFByb3RvY29sICppbnB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgIDw8ICJUaHJpZnRQcm90b2NvbCAqb3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR0Vycm9yICoqZXJyb3IpIgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnYm9vbGVhbiByZXN1bHQgPSBUUlVFOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqeGNlcHRpb247IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBhcmdzX2NsYXNzX25hbWUgKyAiICogYXJncyA9IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X25ldyAoIiA8PCBhcmdzX2NsYXNzX3R5cGUgPDwgIiwgTlVMTCk7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpZiAoKCpmdW5jdGlvbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChzZXF1ZW5jZV9pZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAob3V0cHV0X3Byb3RvY29sKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfZ2V0IChpbnB1dF9wcm90b2NvbCwgXCJ0cmFuc3BvcnRcIiwgIgorICAgICAgICAgICAgICAgPDwgIiZ0cmFuc3BvcnQsIE5VTEwpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gUmVhZCB0aGUgbWV0aG9kJ3MgYXJndW1lbnRzIGZyb20gdGhlIGNhbGxlcgorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgodGhyaWZ0X3N0cnVjdF9yZWFkIChUSFJJRlRfU1RSVUNUIChhcmdzKSwgIgorICAgICAgICAgICAgICAgPDwgImlucHV0X3Byb3RvY29sLCBlcnJvcikgIT0gLTEpICYmIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiICAgICh0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAoaW5wdXRfcHJvdG9jb2wsICIKKyAgICAgICAgICAgICAgIDw8ICJlcnJvcikgIT0gLTEpICYmIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiICAgICh0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kICh0cmFuc3BvcnQsIGVycm9yKSAhPSBGQUxTRSkpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgZm9yIChhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythcmdfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBwcm9wZXJ0eV90eXBlX25hbWUoKCphcmdfaXRlciktPmdldF90eXBlKCkpIDw8ICIgIgorICAgICAgICAgICAgICAgICA8PCAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZm9yICh4Y2VwdGlvbl9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhjZXB0aW9uX2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hjZXB0aW9uX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgdHlwZV9uYW1lKCgqeGNlcHRpb25faXRlciktPmdldF90eXBlKCkpIDw8ICIgIgorICAgICAgICAgICAgICAgICA8PCBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCp4Y2VwdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoaGFzX3JldHVybl92YWx1ZSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBwcm9wZXJ0eV90eXBlX25hbWUocmV0dXJuX3R5cGUpIDw8ICIgcmV0dXJuX3ZhbHVlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCEoKmZ1bmN0aW9uX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCByZXN1bHRfY2xhc3NfbmFtZSA8PCAiICogcmVzdWx0X3N0cnVjdDsiIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGlmIChhcmdzLnNpemUoKSA+IDApIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X2dldCAoYXJncywiIDw8IGVuZGw7CisgICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDE0LCAnICcpOworICAgICAgZm9yIChhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythcmdfaXRlcikgeworICAgICAgICBzdHJpbmcgYXJnX25hbWUgPSAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJcIiIgPDwgYXJnX25hbWUgPDwgIlwiLCAmIiA8PCBhcmdfbmFtZSA8PCAiLCIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwpOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghKCpmdW5jdGlvbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiZ19vYmplY3RfZ2V0IChvdXRwdXRfcHJvdG9jb2wsIFwidHJhbnNwb3J0XCIsICIKKyAgICAgICAgICAgICAgICAgPDwgIiZ0cmFuc3BvcnQsIE5VTEwpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHRfc3RydWN0ID0gZ19vYmplY3RfbmV3ICgiIDw8IHJlc3VsdF9jbGFzc190eXBlIDw8ICIsIE5VTEwpOyIgPDwgZW5kbDsKKyAgICAgIGlmIChoYXNfcmV0dXJuX3ZhbHVlKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X2dldCAocmVzdWx0X3N0cnVjdCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcInN1Y2Nlc3NcIiwgJnJldHVybl92YWx1ZSwgTlVMTCk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFBhc3MgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QgaW4gdGhlIGhhbmRsZXIKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBoYW5kbGVyX2Z1bmN0aW9uX25hbWUgPDwgIiAoIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGIChzZWxmLT5oYW5kbGVyKSwiIDw8IGVuZGw7CisgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZyhoYW5kbGVyX2Z1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyA2LCAnICcpOworICAgIGlmIChoYXNfcmV0dXJuX3ZhbHVlKSB7CisgICAgICBzdHJpbmcgcmV0dXJuX3R5cGVfbmFtZSA9IHR5cGVfbmFtZShyZXR1cm5fdHlwZSk7CisKKyAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQ7CisKKyAgICAgIC8vIENhc3QgcmV0dXJuX3ZhbHVlIGlmIGl0IHdhcyBkZWNsYXJlZCBhcyBhIHR5cGUgb3RoZXIgdGhhbiB0aGUgcmV0dXJuCisgICAgICAvLyB2YWx1ZSdzIGFjdHVhbCB0eXBlLS0tdGhpcyBpcyB0cnVlIGZvciBpbnRlZ2VyIHZhbHVlcyAzMiBiaXRzIG9yIGZld2VyCisgICAgICAvLyBpbiB3aWR0aCwgZm9yIHdoaWNoIEdMaWIgcmVxdWlyZXMgYSBwbGFpbiBnaW50IHR5cGUgYmUgdXNlZCB3aGVuCisgICAgICAvLyBzdG9yaW5nIG9yIHJldHJpZXZpbmcgYXMgYW4gb2JqZWN0IHByb3BlcnR5CisgICAgICBpZiAocmV0dXJuX3R5cGVfbmFtZSAhPSBwcm9wZXJ0eV90eXBlX25hbWUocmV0dXJuX3R5cGUpKSB7CisgICAgICAgIGlmIChyZXR1cm5fdHlwZV9uYW1lW3JldHVybl90eXBlX25hbWUubGVuZ3RoKCkgLSAxXSAhPSAnKicpIHsKKyAgICAgICAgICByZXR1cm5fdHlwZV9uYW1lICs9ICcgJzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm5fdHlwZV9uYW1lICs9ICcqJzsKKworICAgICAgICBmX3NlcnZpY2VfIDw8ICIoIiA8PCByZXR1cm5fdHlwZV9uYW1lIDw8ICIpIjsKKyAgICAgIH0KKworICAgICAgZl9zZXJ2aWNlXyA8PCAiJnJldHVybl92YWx1ZSwiIDw8IGVuZGw7CisgICAgfQorICAgIGZvciAoYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYXJnX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgKCphcmdfaXRlciktPmdldF9uYW1lKCkgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGZvciAoeGNlcHRpb25faXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4Y2VwdGlvbl9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4Y2VwdGlvbl9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICImIiA8PCBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCp4Y2VwdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgImVycm9yKSA9PSBUUlVFKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIC8vIFRoZSBoYW5kbGVyIHJlcG9ydGVkIHN1Y2Nlc3M7IHJldHVybiB0aGUgcmVzdWx0LCBpZiBhbnksIHRvIHRoZSBjYWxsZXIKKyAgICBpZiAoISgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBpZiAoaGFzX3JldHVybl92YWx1ZSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9zZXQgKHJlc3VsdF9zdHJ1Y3QsIFwic3VjY2Vzc1wiLCAiOworICAgICAgICBpZiAodHlwZV9uYW1lKHJldHVybl90eXBlKSAhPSBwcm9wZXJ0eV90eXBlX25hbWUocmV0dXJuX3R5cGUpKSB7CisgICAgICAgICAgLy8gUm91bmR0cmlwIGNhc3QgdG8gZml4IHRoZSBwb3NpdGlvbiBvZiBzaWduIGJpdC4KKyAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIoIiA8PCBwcm9wZXJ0eV90eXBlX25hbWUocmV0dXJuX3R5cGUpIDw8ICIpIgorICAgICAgICAgICAgICAgICAgICAgPDwgIigiIDw8IHR5cGVfbmFtZShyZXR1cm5fdHlwZSkgPDwgIikiOworICAgICAgICB9CisgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybl92YWx1ZSwgIgorICAgICAgICAgICAgICAgICAgIDw8ICJOVUxMKTsiIDw8IGVuZGw7CisKKyAgICAgICAgLy8gRGVhbGxvY2F0ZSAob3IgdW5yZWYpIHJldHVybl92YWx1ZQorICAgICAgICByZXR1cm5fdHlwZSA9IGdldF90cnVlX3R5cGUocmV0dXJuX3R5cGUpOworICAgICAgICBpZiAocmV0dXJuX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKXJldHVybl90eXBlKTsKKworICAgICAgICAgIGlmIChiYXNlX3R5cGUtPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmV0dXJuX3ZhbHVlICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICBpZiAoYmFzZV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2J5dGVfYXJyYXlfdW5yZWYgKHJldHVybl92YWx1ZSk7IiA8PCBlbmRsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19mcmVlIChyZXR1cm5fdmFsdWUpOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHJldHVybl90eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXR1cm5fdmFsdWUgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgICBpZiAocmV0dXJuX3R5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopcmV0dXJuX3R5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICAgICAgICBpZiAoaXNfbnVtZXJpYyhlbGVtX3R5cGUpKSB7CisgICAgICAgICAgICAgIGZfc2VydmljZV8gPDwgImdfYXJyYXlfdW5yZWYiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiZ19wdHJfYXJyYXlfdW5yZWYiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiIChyZXR1cm5fdmFsdWUpOyIgPDwgZW5kbDsKKyAgICAgICAgICB9IGVsc2UgaWYgKHJldHVybl90eXBlLT5pc19tYXAoKSB8fCByZXR1cm5fdHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfaGFzaF90YWJsZV91bnJlZiAocmV0dXJuX3ZhbHVlKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorCisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXR1cm5fdHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmV0dXJuX3ZhbHVlICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmIChyZXR1cm5fdmFsdWUpOyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICB9CisKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0ID0iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIigodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKG91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGw7CisgICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDM5LCAnICcpOworICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiXCIiIDw8IHNlcnZpY2VfZnVuY3Rpb25fbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgIDw8ICJUX1JFUExZLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAic2VxdWVuY2VfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgIDw8ICJlcnJvcikgIT0gLTEpICYmIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgKHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRIUklGVF9TVFJVQ1QgKHJlc3VsdF9zdHJ1Y3QpLCIgPDwgZW5kbDsKKyAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMjMsICcgJyk7CisgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJvdXRwdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJlcnJvcikgIT0gLTEpKTsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICAvLyBUaGUgaGFuZGxlciByZXBvcnRlZCBmYWlsdXJlOyBjaGVjayB0byBzZWUgaWYgYW4gYXBwbGljYXRpb24tZGVmaW5lZAorICAgIC8vIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGFuZCBpZiBzbywgcmV0dXJuIGl0IHRvIHRoZSBjYWxsZXIKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgZm9yICh4Y2VwdGlvbl9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhjZXB0aW9uX2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hjZXB0aW9uX2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiaWYgKCIgPDwgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqeGNlcHRpb25faXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3NldCAocmVzdWx0X3N0cnVjdCwiIDw8IGVuZGw7CisgICAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMTQsICcgJyk7CisgICAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlwiIiA8PCAoKnhjZXB0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgICAgIDw8ICgqeGNlcHRpb25faXRlciktPmdldF9uYW1lKCkgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKCh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAob3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbDsKKyAgICAgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygzOSwgJyAnKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiXCIiIDw8IHNlcnZpY2VfZnVuY3Rpb25fbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgPDwgIlRfUkVQTFksIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJzZXF1ZW5jZV9pZCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICA8PCAiZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICIgKHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRIUklGVF9TVFJVQ1QgKHJlc3VsdF9zdHJ1Y3QpLCIgPDwgZW5kbDsKKyAgICAgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygyMywgJyAnKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAib3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZXJyb3IpICE9IC0xKSk7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgaGFuZGxlciByZXBvcnRlZCBmYWlsdXJlIGJ1dCByYWlzZWQgbm8gYXBwbGljYXRpb24tZGVmaW5lZAorICAgIC8vIGV4Y2VwdGlvbiwgcmV0dXJuIGEgVGhyaWZ0IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiB3aXRoIHRoZSBpbmZvcm1hdGlvbgorICAgIC8vIHJldHVybmVkIHZpYSBHTGliJ3Mgb3duIGVycm9yLXJlcG9ydGluZyBtZWNoYW5pc20KKyAgICBmX3NlcnZpY2VfIDw8ICJpZiAoKmVycm9yID09IE5VTEwpIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfd2FybmluZyAoXCIiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIi4iCisgICAgICAgICAgICAgICA8PCAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgRkFMU0UgXCIiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IHN0cmluZygxMSwgJyAnKSA8PCAiXCJidXQgZGlkIG5vdCBzZXQgYW4gZXJyb3JcIik7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ4Y2VwdGlvbiA9IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLCIgPDwgZW5kbDsKKyAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDE0LCAnICcpOworICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlwidHlwZVwiLCAgICAqZXJyb3IgIT0gTlVMTCA/ICgqZXJyb3IpLT5jb2RlIDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8IHN0cmluZygxMSwgJyAnKSA8PCAiVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9VTktOT1dOLCIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIlwibWVzc2FnZVwiLCAqZXJyb3IgIT0gTlVMTCA/ICgqZXJyb3IpLT5tZXNzYWdlIDogTlVMTCwiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2NsZWFyX2Vycm9yIChlcnJvcik7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJyZXN1bHQgPSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIoKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChvdXRwdXRfcHJvdG9jb2wsIiA8PCBlbmRsOworICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMzksICcgJyk7CisgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiXCIiIDw8IHNlcnZpY2VfZnVuY3Rpb25fbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICA8PCAiVF9FWENFUFRJT04sIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJzZXF1ZW5jZV9pZCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgIDw8ICJlcnJvcikgIT0gLTEpICYmIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiICh0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUICh4Y2VwdGlvbiksIiA8PCBlbmRsOworICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMjMsICcgJyk7CisgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAib3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZXJyb3IpICE9IC0xKSk7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgfQorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgLy8gRGVsbG9jYXRlIG9yIHVucmVmIHJldHJpZXZlZCBhcmd1bWVudCB2YWx1ZXMgYXMgbmVjZXNzYXJ5CisgICAgZm9yIChhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythcmdfaXRlcikgeworICAgICAgc3RyaW5nIGFyZ19uYW1lID0gKCphcmdfaXRlciktPmdldF9uYW1lKCk7CisgICAgICB0X3R5cGUqIGFyZ190eXBlID0gZ2V0X3RydWVfdHlwZSgoKmFyZ19pdGVyKS0+Z2V0X3R5cGUoKSk7CisKKyAgICAgIGlmIChhcmdfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKWFyZ190eXBlKTsKKworICAgICAgICBpZiAoYmFzZV90eXBlLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IGFyZ19uYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgaWYgKGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfYnl0ZV9hcnJheV91bnJlZiAoIiA8PCBhcmdfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfZnJlZSAoIiA8PCBhcmdfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoYXJnX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IGFyZ19uYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIGlmIChhcmdfdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopYXJnX3R5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgICAgIGlmIChpc19udW1lcmljKGVsZW1fdHlwZSkpIHsKKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgImdfYXJyYXlfdW5yZWYiOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJnX3B0cl9hcnJheV91bnJlZiI7CisgICAgICAgICAgfQorICAgICAgICAgIGZfc2VydmljZV8gPDwgIiAoIiA8PCBhcmdfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnX3R5cGUtPmlzX21hcCgpIHx8IGFyZ190eXBlLT5pc19zZXQoKSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfaGFzaF90YWJsZV91bnJlZiAoIiA8PCBhcmdfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfSBlbHNlIGlmIChhcmdfdHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgYXJnX25hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmICgiIDw8IGFyZ19uYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoISgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAocmVzdWx0X3N0cnVjdCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgImlmIChyZXN1bHQgPT0gVFJVRSkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIoKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZCAiCisgICAgICAgICAgICAgICAgIDw8ICIob3V0cHV0X3Byb3RvY29sLCBlcnJvcikgIT0gLTEpICYmIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgKHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIGVycm9yKSAiCisgICAgICAgICAgICAgICAgIDw8ICIhPSBGQUxTRSkgJiYiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAodGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBlcnJvcikgIgorICAgICAgICAgICAgICAgICA8PCAiIT0gRkFMU0UpKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9IEZBTFNFOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJnX29iamVjdF91bnJlZiAoYXJncyk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiByZXN1bHQ7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgZGlzcGF0Y2hfY2FsbCBpbXBsZW1lbnRhdGlvbgorICBmdW5jdGlvbl9uYW1lID0gY2xhc3NfbmFtZV9sYyArICJfZGlzcGF0Y2hfY2FsbCI7CisgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7CisgIGZfc2VydmljZV8gPDwgInN0YXRpYyBnYm9vbGVhbiIgPDwgZW5kbCA8PCBmdW5jdGlvbl9uYW1lCisgICAgICAgICAgICAgPDwgIiAoVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgKmRpc3BhdGNoX3Byb2Nlc3NvciwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICA8PCAiVGhyaWZ0UHJvdG9jb2wgKmlucHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgIDw8ICJUaHJpZnRQcm90b2NvbCAqb3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZ2NoYXIgKm1ldGhvZF9uYW1lLCIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJnaW50MzIgc2VxdWVuY2VfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgPDwgIkdFcnJvciAqKmVycm9yKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3Byb2Nlc3NfZnVuY3Rpb25fZGVmICoiCisgICAgICAgICAgICAgPDwgInByb2Nlc3NfZnVuY3Rpb25fZGVmOyIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ2Jvb2xlYW4gZGlzcGF0Y2hfcmVzdWx0ID0gRkFMU0U7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIiAoZGlzcGF0Y2hfcHJvY2Vzc29yKTsiIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcGFyZW50X2NsYXNzX25hbWUgPDwgIkNsYXNzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKnBhcmVudF9jbGFzcyA9IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50ICgiIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9HRVRfQ0xBU1MgKHNlbGYpKTsiCisgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInByb2Nlc3NfZnVuY3Rpb25fZGVmID0gIgorICAgICAgICAgICAgIDw8ICJnX2hhc2hfdGFibGVfbG9va3VwIChzZWxmLT5wcm9jZXNzX21hcCwgbWV0aG9kX25hbWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAocHJvY2Vzc19mdW5jdGlvbl9kZWYgIT0gTlVMTCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDUzLCAnICcpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2ZyZWUgKG1ldGhvZF9uYW1lKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZGlzcGF0Y2hfcmVzdWx0ID0gIgorICAgICAgICAgICAgIDw8ICIoKnByb2Nlc3NfZnVuY3Rpb25fZGVmLT5mdW5jdGlvbikgKHNlbGYsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgInNlcXVlbmNlX2lkLCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJpbnB1dF9wcm90b2NvbCwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAib3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJlcnJvcik7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAvLyBNZXRob2QgbmFtZSBub3QgcmVjb2duaXplZDsgY2hhaW4gdXAgdG8gb3VyIHBhcmVudCBwcm9jZXNzb3ItLS1ub3RlIHRoZQorICAvLyB0b3AtbW9zdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCwgaW4gVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgaXRzZWxmLAorICAvLyB3aWxsIHJldHVybiBhbiBhcHBsaWNhdGlvbiBleGNlcHRpb24gdG8gdGhlIGNhbGxlciBpZiBubyBjbGFzcyBpbiB0aGUKKyAgLy8gaGllcmFyY2h5IHJlY29nbml6ZXMgdGhlIG1ldGhvZCBuYW1lCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRpc3BhdGNoX3Jlc3VsdCA9IHBhcmVudF9jbGFzcy0+ZGlzcGF0Y2hfY2FsbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihkaXNwYXRjaF9wcm9jZXNzb3IsIiA8PCBlbmRsOworICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDQ3LCAnICcpOworICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJpbnB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIm91dHB1dF9wcm90b2NvbCwiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAibWV0aG9kX25hbWUsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJzZXF1ZW5jZV9pZCwiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZXJyb3IpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZGlzcGF0Y2hfcmVzdWx0OyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBwcm9wZXJ0eSBzZXR0ZXIKKyAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX3NldF9wcm9wZXJ0eSI7CisgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKGZ1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOworICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBmdW5jdGlvbl9uYW1lIDw8ICIgKEdPYmplY3QgKm9iamVjdCwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiZ3VpbnQgcHJvcGVydHlfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJjb25zdCBHVmFsdWUgKnZhbHVlLCIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHUGFyYW1TcGVjICpwc3BlYykiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZiA9ICIgPDwgY2xhc3NfbmFtZV91YyA8PCAiIChvYmplY3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInN3aXRjaCAocHJvcGVydHlfaWQpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSBQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiX0hBTkRMRVI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHNlbGYtPmhhbmRsZXIgIT0gTlVMTCkiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAoc2VsZi0+aGFuZGxlcik7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLT5oYW5kbGVyID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgImdfb2JqZWN0X3JlZiAoc2VsZi0+aGFuZGxlcik7IiA8PCBlbmRsOworICBpZiAoZXh0ZW5kc19zZXJ2aWNlKSB7CisgICAgLy8gQ2hhaW4gdXAgdG8gc2V0IHRoZSBoYW5kbGVyIGluIGV2ZXJ5IHN1cGVyY2xhc3MgYXMgd2VsbAorICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiR19PQkpFQ1RfQ0xBU1MgKCIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3BhcmVudF9jbGFzcyktPiIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2V0X3Byb3BlcnR5IChvYmplY3QsIHByb3BlcnR5X2lkLCB2YWx1ZSwgcHNwZWMpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgcHJvY2Vzc29yJ3MgcHJvcGVydHkgZ2V0dGVyCisgIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9nZXRfcHJvcGVydHkiOworICBhcmdzX2luZGVudCA9IHN0cmluZyhmdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgZnVuY3Rpb25fbmFtZSA8PCAiIChHT2JqZWN0ICpvYmplY3QsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgImd1aW50IHByb3BlcnR5X2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR1ZhbHVlICp2YWx1ZSwiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR1BhcmFtU3BlYyAqcHNwZWMpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIiAob2JqZWN0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggKHByb3BlcnR5X2lkKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhc2UgUFJPUF8iIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9IQU5ETEVSOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlbGYtPmhhbmRsZXIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRvciB0aGUgcHJvY2Vzc29yJ3MgZGlzcG9zZSBmdW5jdGlvbgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZGlzcG9zZSAoR09iamVjdCAqZ29iamVjdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZiA9ICIgPDwgY2xhc3NfbmFtZV91YyA8PCAiIChnb2JqZWN0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZi0+aGFuZGxlciAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmIChzZWxmLT5oYW5kbGVyKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAic2VsZi0+aGFuZGxlciA9IE5VTEw7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIkdfT0JKRUNUX0NMQVNTICgiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9wYXJlbnRfY2xhc3MpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+ZGlzcG9zZSAoZ29iamVjdCk7IgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBwcm9jZXNzb3IgZmluYWxpemUgZnVuY3Rpb24KKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2ZpbmFsaXplIChHT2JqZWN0ICpnb2JqZWN0KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvciAqc2VsZiA9ICIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SIChnb2JqZWN0KTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJ0aHJpZnRfc2FmZV9oYXNoX3RhYmxlX2Rlc3Ryb3kgKHNlbGYtPnByb2Nlc3NfbWFwKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJHX09CSkVDVF9DTEFTUyAoIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcGFyZW50X2NsYXNzKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLT5maW5hbGl6ZSAoZ29iamVjdCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgcHJvY2Vzc29yIGluc3RhbmNlIGluaXRpYWxpemVyCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9pbml0ICgiIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZikiCisgICAgICAgICAgICAgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImd1aW50IGluZGV4OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLT5oYW5kbGVyID0gTlVMTDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAic2VsZi0+cHJvY2Vzc19tYXAgPSAiCisgICAgICAgICAgICAgICAgImdfaGFzaF90YWJsZV9uZXcgKGdfc3RyX2hhc2gsIGdfc3RyX2VxdWFsKTsiIDw8IGVuZGw7CisgIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKDIxLCAnICcpOworICAgIGZfc2VydmljZV8gPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaW5kZXggPSAwOyBpbmRleCA8ICIKKyAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9ucy5zaXplKCkgPDwgIjsgaW5kZXggKz0gMSkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19oYXNoX3RhYmxlX2luc2VydCAoc2VsZi0+cHJvY2Vzc19tYXAsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3Byb2Nlc3NfZnVuY3Rpb25fZGVmc1tpbmRleF0ubmFtZSwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICA8PCAiJiIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3Byb2Nlc3NfZnVuY3Rpb25fZGVmc1tpbmRleF0iIDw8ICIpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgcHJvY2Vzc29yIGNsYXNzIGluaXRpYWxpemVyCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9jbGFzc19pbml0ICgiIDw8IGNsYXNzX25hbWUKKyAgICAgICAgICAgICA8PCAiQ2xhc3MgKmNscykiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3JDbGFzcyAqZGlzcGF0Y2hfcHJvY2Vzc29yX2NsYXNzID0iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfRElTUEFUQ0hfUFJPQ0VTU09SX0NMQVNTIChjbHMpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiR1BhcmFtU3BlYyAqcGFyYW1fc3BlYzsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZGlzcG9zZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9maW5hbGl6ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfc2V0X3Byb3BlcnR5OyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9nZXRfcHJvcGVydHk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJkaXNwYXRjaF9wcm9jZXNzb3JfY2xhc3MtPmRpc3BhdGNoX2NhbGwgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9kaXNwYXRjaF9jYWxsOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJjbHMtPmRpc3BhdGNoX2NhbGwgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9kaXNwYXRjaF9jYWxsOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfb2JqZWN0IChcImhhbmRsZXJcIiwiCisgICAgICAgICAgICAgPDwgZW5kbDsKKyAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygzNCwgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiXCJTZXJ2aWNlIGhhbmRsZXIgaW1wbGVtZW50YXRpb25cIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICA8PCAiXCJUaGUgc2VydmljZSBoYW5kbGVyIGltcGxlbWVudGF0aW9uIFwiIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgPDwgIlwidG8gd2hpY2ggbWV0aG9kIGNhbGxzIGFyZSBkaXNwYXRjaGVkLlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyArICJUWVBFXyIgKyBzZXJ2aWNlX25hbWVfdWMgKyAiX0hBTkRMRVIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKTsiIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIiA8PCBlbmRsOworICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDMzLCAnICcpOworICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiX0hBTkRMRVIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgPDwgInBhcmFtX3NwZWMpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgQyBjb2RlIHRoYXQgcmVwcmVzZW50cyBhIFRocmlmdCBzZXJ2aWNlIHNlcnZlci4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2aWNlJ3MgaGFuZGxlciBjbGFzcworICBnZW5lcmF0ZV9zZXJ2aWNlX2hhbmRsZXIodHNlcnZpY2UpOworCisgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2aWNlJ3MgcHJvY2Vzc29yIGNsYXNzCisgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgQyBjb2RlIHRvIHJlcHJlc2VudCBhIFRIcmlmdCBzdHJ1Y3R1cmUgYXMgYSBHT2JqZWN0LgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2JqZWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgc3RyaW5nIG5hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKKyAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKG5hbWVfdSk7CisKKyAgc3RyaW5nIGNsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBuYW1lOworICBzdHJpbmcgY2xhc3NfbmFtZV9sYyA9IHRoaXMtPm5zcGFjZV9sYyArIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKKyAgc3RyaW5nIGNsYXNzX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKGNsYXNzX25hbWVfbGMpOworCisgIHN0cmluZyBmdW5jdGlvbl9uYW1lOworICBzdHJpbmcgYXJnc19pbmRlbnQ7CisKKyAgLy8gd3JpdGUgdGhlIGluc3RhbmNlIGRlZmluaXRpb24KKyAgZl90eXBlc18gPDwgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCBlbmRsIDw8ICJ7ICIgPDwgZW5kbAorICAgICAgICAgICA8PCAiICBUaHJpZnRTdHJ1Y3QgcGFyZW50OyAiIDw8IGVuZGwgPDwgZW5kbCA8PCAiICAvKiBwdWJsaWMgKi8iIDw8IGVuZGw7CisKKyAgLy8gZm9yIGVhY2ggZmllbGQsIGFkZCBhIG1lbWJlciB2YXJpYWJsZQorICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGZfdHlwZXNfIDw8ICIgICIgPDwgdHlwZV9uYW1lKHQpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGZfdHlwZXNfIDw8ICIgIGdib29sZWFuIF9faXNzZXRfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gY2xvc2UgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uIGFuZCBjcmVhdGUgYSB0eXBlZGVmCisgIGZfdHlwZXNfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiAiIDw8IHRoaXMtPm5zcGFjZQorICAgICAgICAgICA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gd3JpdGUgdGhlIGNsYXNzIGRlZmluaXRpb24KKyAgZl90eXBlc18gPDwgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiAgVGhyaWZ0U3RydWN0Q2xhc3MgcGFyZW50OyIgPDwgZW5kbCA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgc3RydWN0IF8iCisgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcyAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzczsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyB3cml0ZSB0aGUgc3RhbmRhcmQgR09iamVjdCBib2lsZXJwbGF0ZQorICBmX3R5cGVzXyA8PCAiR1R5cGUgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfZ2V0X3R5cGUgKHZvaWQpOyIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IG5hbWVfdWMgPDwgIiAoIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91CisgICAgICAgICAgIDw8ICJfZ2V0X3R5cGUoKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YworICAgICAgICAgICA8PCAiKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBuYW1lX3VjCisgICAgICAgICAgIDw8ICIsICIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgIDw8IG5hbWVfdWMgPDwgIl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIl9UWVBFXyIKKyAgICAgICAgICAgPDwgbmFtZV91YyA8PCAiLCAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IG5hbWVfdWMgPDwgIihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICIKKyAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgbmFtZV91YyA8PCAiKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgPDwgIklTXyIgPDwgbmFtZV91YyA8PCAiX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICA8PCAiVFlQRV8iIDw8IG5hbWVfdWMgPDwgIikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMKKyAgICAgICAgICAgPDwgIl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgPDwgbmFtZV91YyA8PCAiLCAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gc3RhcnQgd3JpdGluZyB0aGUgb2JqZWN0IGltcGxlbWVudGF0aW9uIC5jIGZpbGUKKworICAvLyBnZW5lcmF0ZSBwcm9wZXJ0aWVzIGVudW0KKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZfdHlwZXNfaW1wbF8gPDwgImVudW0gXyIgPDwgY2xhc3NfbmFtZSA8PCAiUHJvcGVydGllcyIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiXzAiOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZV91YworICAgICAgICAgID0gdG9fdXBwZXJfY2FzZSh0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKm1faXRlciktPmdldF9uYW1lKCkpKSk7CisKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgIiwiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlBST1BfIiA8PCBjbGFzc19uYW1lX3VjIDw8ICJfIiA8PCBtZW1iZXJfbmFtZV91YzsKKyAgICB9CisgICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl90eXBlc19pbXBsXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIGdlbmVyYXRlIHN0cnVjdCBJL08gbWV0aG9kcworICBzdHJpbmcgdGhpc19nZXQgPSB0aGlzLT5uc3BhY2UgKyBuYW1lICsgIiAqIHRoaXNfb2JqZWN0ID0gIiArIHRoaXMtPm5zcGFjZV91YyArIG5hbWVfdWMKKyAgICAgICAgICAgICAgICAgICAgKyAiKG9iamVjdCk7IjsKKyAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCAidGhpc19vYmplY3QtPiIsIHRoaXNfZ2V0KTsKKyAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCAidGhpc19vYmplY3QtPiIsIHRoaXNfZ2V0KTsKKworICAvLyBnZW5lcmF0ZSBwcm9wZXJ0eSBzZXR0ZXIgYW5kIGdldHRlcgorICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgLy8gZ2VuZXJhdGUgcHJvcGVydHkgc2V0dGVyCisgICAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX3NldF9wcm9wZXJ0eSI7CisgICAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7CisgICAgZl90eXBlc19pbXBsXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgZnVuY3Rpb25fbmFtZSA8PCAiIChHT2JqZWN0ICpvYmplY3QsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiZ3VpbnQgcHJvcGVydHlfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICA8PCAiY29uc3QgR1ZhbHVlICp2YWx1ZSwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZiA9ICIgPDwgY2xhc3NfbmFtZV91YyA8PCAiIChvYmplY3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF9maWVsZCogbWVtYmVyID0gKCptX2l0ZXIpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lID0gbWVtYmVyLT5nZXRfbmFtZSgpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lX3VjCisgICAgICAgICAgPSB0b191cHBlcl9jYXNlKHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG1lbWJlcl9uYW1lKSkpOworICAgICAgdF90eXBlKiBtZW1iZXJfdHlwZSA9IGdldF90cnVlX3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKTsKKworICAgICAgc3RyaW5nIHByb3BlcnR5X2lkZW50aWZpZXIgPSAiUFJPUF8iICsgY2xhc3NfbmFtZV91YyArICJfIiArIG1lbWJlcl9uYW1lX3VjOworCisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgcHJvcGVydHlfaWRlbnRpZmllciArICI6IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGlmIChtZW1iZXJfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKW1lbWJlcl90eXBlKTsKKyAgICAgICAgc3RyaW5nIGFzc2lnbl9mdW5jdGlvbl9uYW1lOworCisgICAgICAgIGlmIChiYXNlX3R5cGUtPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7CisgICAgICAgICAgc3RyaW5nIHJlbGVhc2VfZnVuY3Rpb25fbmFtZTsKKworICAgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImlmIChzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgICBpZiAoYmFzZV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgICAgcmVsZWFzZV9mdW5jdGlvbl9uYW1lID0gImdfYnl0ZV9hcnJheV91bnJlZiI7CisgICAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2R1cF9ib3hlZCI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA9ICJnX2ZyZWUiOworICAgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9kdXBfc3RyaW5nIjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA8PCAiIChzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzd2l0Y2ggKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgeworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZ2V0X2Jvb2xlYW4iOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9nZXRfaW50IjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2dldF9pbnQ2NCI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9nZXRfZG91YmxlIjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogIgorICAgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBiYXNlIHR5cGUgXCIiICsgYmFzZV90eXBlLT5nZXRfbmFtZSgpICsgIlwiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3Igc3RydWN0IG1lbWJlciBcIiIKKyAgICAgICAgICAgICAgICArIG1lbWJlcl9uYW1lICsgIlwiIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIiA9ICIgPDwgYXNzaWduX2Z1bmN0aW9uX25hbWUKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiICh2YWx1ZSk7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIiA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOyIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgICAgc3RyaW5nIHJlbGVhc2VfZnVuY3Rpb25fbmFtZTsKKyAgICAgICAgc3RyaW5nIGFzc2lnbl9mdW5jdGlvbl9uYW1lOworCisgICAgICAgIGlmIChtZW1iZXJfdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopbWVtYmVyX3R5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICAgICAgICAvLyBMaXN0cyBvZiBiYXNlIHR5cGVzIG90aGVyIHRoYW4gc3RyaW5ncyBhcmUgcmVwcmVzZW50ZWQgYXMgR0FycmF5czsKKyAgICAgICAgICAvLyBhbGwgb3RoZXJzIGFzIEdQdHJBcnJheXMKKyAgICAgICAgICBpZiAoaXNfbnVtZXJpYyhlbGVtX3R5cGUpKSB7CisgICAgICAgICAgICByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPSAiZ19hcnJheV91bnJlZiI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA9ICJnX3B0cl9hcnJheV91bnJlZiI7CisgICAgICAgICAgfQorCisgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9kdXBfYm94ZWQiOworICAgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19zZXQoKSB8fCBtZW1iZXJfdHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgICAgICByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPSAiZ19oYXNoX3RhYmxlX3VucmVmIjsKKyAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2R1cF9ib3hlZCI7CisgICAgICAgIH0KKworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPDwgIiAoc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiKTsiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiID0gIiA8PCBhc3NpZ25fZnVuY3Rpb25fbmFtZQorICAgICAgICAgICAgICAgICAgICAgIDw8ICIgKHZhbHVlKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19zdHJ1Y3QoKSB8fCBtZW1iZXJfdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaWYgKG1lbWJlci0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic2VsZi0+X19pc3NldF8iIDw8IG1lbWJlcl9uYW1lIDw8ICIgPSBUUlVFOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOworCisgICAgLy8gZ2VuZXJhdGUgcHJvcGVydHkgZ2V0dGVyCisgICAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX2dldF9wcm9wZXJ0eSI7CisgICAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7CisgICAgZl90eXBlc19pbXBsXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgZnVuY3Rpb25fbmFtZSA8PCAiIChHT2JqZWN0ICpvYmplY3QsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiZ3VpbnQgcHJvcGVydHlfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHVmFsdWUgKnZhbHVlLCIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZiA9ICIgPDwgY2xhc3NfbmFtZV91YyA8PCAiIChvYmplY3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF9maWVsZCogbWVtYmVyID0gKCptX2l0ZXIpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lX3VjCisgICAgICAgICAgPSB0b191cHBlcl9jYXNlKHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG1lbWJlcl9uYW1lKSkpOworICAgICAgdF90eXBlKiBtZW1iZXJfdHlwZSA9IGdldF90cnVlX3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKTsKKworICAgICAgc3RyaW5nIHByb3BlcnR5X2lkZW50aWZpZXIgPSAiUFJPUF8iICsgY2xhc3NfbmFtZV91YyArICJfIiArIG1lbWJlcl9uYW1lX3VjOworCisgICAgICBzdHJpbmcgc2V0dGVyX2Z1bmN0aW9uX25hbWU7CisKKyAgICAgIGlmIChtZW1iZXJfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKW1lbWJlcl90eXBlKTsKKworICAgICAgICBzd2l0Y2ggKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfYm9vbGVhbiI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X2ludCI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfaW50NjQiOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X2RvdWJsZSI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgaWYgKGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X2JveGVkIjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfc3RyaW5nIjsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6ICIKKyAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIGJhc2UgdHlwZSBcIiIgKyBiYXNlX3R5cGUtPmdldF9uYW1lKCkgKyAiXCIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3Igc3RydWN0IG1lbWJlciBcIiIKKyAgICAgICAgICAgICAgKyBtZW1iZXJfbmFtZSArICJcIiI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX2VudW0oKSkgeworICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9pbnQiOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfc3RydWN0KCkgfHwgbWVtYmVyX3R5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfb2JqZWN0IjsKKyAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X2JveGVkIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogIgorICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIHR5cGUgZm9yIHN0cnVjdCBtZW1iZXIgXCIiICsgbWVtYmVyX25hbWUgKyAiXCIiOworICAgICAgfQorCisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgcHJvcGVydHlfaWRlbnRpZmllciArICI6IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IHNldHRlcl9mdW5jdGlvbl9uYW1lIDw8ICIgKHZhbHVlLCBzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOworICB9CisKKyAgLy8gZ2VuZXJhdGUgdGhlIGluc3RhbmNlIGluaXQgZnVuY3Rpb24KKworICBmX3R5cGVzX2ltcGxfIDw8ICJzdGF0aWMgdm9pZCAiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2luc3RhbmNlX2luaXQgKCIKKyAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiICogb2JqZWN0KSIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gZ2VuZXJhdGUgZGVmYXVsdC12YWx1ZSBzdHJ1Y3R1cmVzIGZvciBjb250YWluZXItdHlwZSBtZW1iZXJzCisgIGJvb2wgY29uc3RhbnRfZGVjbGFyYXRpb25fb3V0cHV0ID0gZmFsc2U7CisgIGJvb2wgc3RyaW5nX2xpc3RfY29uc3RhbnRfb3V0cHV0ID0gZmFsc2U7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAqbV9pdGVyOworICAgIHRfY29uc3RfdmFsdWUqIG1lbWJlcl92YWx1ZSA9IG1lbWJlci0+Z2V0X3ZhbHVlKCk7CisKKyAgICBpZiAobWVtYmVyX3ZhbHVlICE9IE5VTEwpIHsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZSA9IG1lbWJlci0+Z2V0X25hbWUoKTsKKyAgICAgIHRfdHlwZSogbWVtYmVyX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSk7CisKKyAgICAgIGlmIChtZW1iZXJfdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIGxpc3QgPSBtZW1iZXJfdmFsdWUtPmdldF9saXN0KCk7CisgICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKW1lbWJlcl90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgICAgICAgIC8vIEdlbmVyYXRlIGFuIGFycmF5IHdpdGggdGhlIGxpc3QgbGl0ZXJhbAorICAgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgInN0YXRpYyAiIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIGZhbHNlLCB0cnVlKSA8PCAiIF9fZGVmYXVsdF8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBtZW1iZXJfbmFtZSA8PCAiWyIgPDwgbGlzdC5zaXplKCkgPDwgIl0gPSAiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IGNvbnN0YW50X2xpdGVyYWwobWVtYmVyX3R5cGUsIG1lbWJlcl92YWx1ZSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICAgICAgY29uc3RhbnRfZGVjbGFyYXRpb25fb3V0cHV0ID0gdHJ1ZTsKKworICAgICAgICAvLyBJZiB3ZSBhcmUgZ2VuZXJhdGluZyB2YWx1ZXMgZm9yIGEgcG9pbnRlciBhcnJheSAoaS5lLiBhIGxpc3Qgb2YKKyAgICAgICAgLy8gc3RyaW5ncyksIHNldCBhIGZsYWcgc28gd2Uga25vdyB0byBhbHNvIGRlY2xhcmUgYW4gaW5kZXggdmFyaWFibGUgdG8KKyAgICAgICAgLy8gdXNlIGluIHByZS1wb3B1bGF0aW5nIHRoZSBhcnJheQorICAgICAgICBpZiAoZWxlbV90eXBlLT5pc19zdHJpbmcoKSkgeworICAgICAgICAgIHN0cmluZ19saXN0X2NvbnN0YW50X291dHB1dCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gVE9ETzogSGFuZGxlIGNvbnRhaW5lciB0eXBlcyBvdGhlciB0aGFuIGxpc3QKKyAgICB9CisgIH0KKyAgaWYgKGNvbnN0YW50X2RlY2xhcmF0aW9uX291dHB1dCkgeworICAgIGlmIChzdHJpbmdfbGlzdF9jb25zdGFudF9vdXRwdXQpIHsKKyAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAidW5zaWduZWQgaW50IGxpc3RfaW5kZXg7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKyAgfQorCisgIC8vIHNhdGlzZnkgY29tcGlsZXJzIHdpdGggLVdhbGwgdHVybmVkIG9uCisgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAiLyogc2F0aXNmeSAtV2FsbCAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRIUklGVF9VTlVTRURfVkFSIChvYmplY3QpOyIgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiBtZW1iZXJfdHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKG1lbWJlcl90eXBlKTsKKyAgICBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHN0cmluZyBkdmFsID0gIiA9ICI7CisgICAgICBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgICAgIGR2YWwgKz0gIigiICsgdHlwZV9uYW1lKHQpICsgIikiOworICAgICAgfQorICAgICAgdF9jb25zdF92YWx1ZSogY3YgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOworICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKKyAgICAgICAgZHZhbCArPSBjb25zdGFudF92YWx1ZSgiIiwgdCwgY3YpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZHZhbCArPSB0LT5pc19zdHJpbmcoKSA/ICJOVUxMIiA6ICIwIjsKKyAgICAgIH0KKyAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAib2JqZWN0LT4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCBkdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfc3RydWN0KCkpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgdF9wcm9ncmFtKiB0eXBlX3Byb2dyYW0gPSBtZW1iZXJfdHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgICAgIHN0cmluZyB0eXBlX25zcGFjZSA9IHR5cGVfcHJvZ3JhbSA/IHR5cGVfcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY19nbGliIikgOiAiIjsKKyAgICAgIHN0cmluZyB0eXBlX25zcGFjZV9wcmVmaXggPQorICAgICAgICB0eXBlX25zcGFjZS5lbXB0eSgpID8gIiIgOiBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModHlwZV9uc3BhY2UpICsgIl8iOworICAgICAgc3RyaW5nIHR5cGVfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG1lbWJlcl90eXBlLT5nZXRfbmFtZSgpKSk7CisgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBnX29iamVjdF9uZXcgKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0b191cHBlcl9jYXNlKHR5cGVfbnNwYWNlX3ByZWZpeCkgPDwgIlRZUEVfIiA8PCB0eXBlX25hbWVfdWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBOVUxMKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0LT5pc194Y2VwdGlvbigpKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAib2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgc3RyaW5nIGluaXRfZnVuY3Rpb247CisgICAgICB0X3R5cGUqIGV0eXBlID0gTlVMTDsKKworICAgICAgaWYgKHQtPmlzX21hcCgpKSB7CisgICAgICAgIHRfdHlwZSoga2V5ID0gKCh0X21hcCopdCktPmdldF9rZXlfdHlwZSgpOworICAgICAgICB0X3R5cGUqIHZhbHVlID0gKCh0X21hcCopdCktPmdldF92YWxfdHlwZSgpOworICAgICAgICBpbml0X2Z1bmN0aW9uID0gZ2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlKGtleSwgdmFsdWUpOworICAgICAgfSBlbHNlIGlmICh0LT5pc19zZXQoKSkgeworICAgICAgICBldHlwZSA9ICgodF9zZXQqKXQpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIGluaXRfZnVuY3Rpb24gPSBnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUoZXR5cGUsIE5VTEwpOworICAgICAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdCktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgaW5pdF9mdW5jdGlvbiA9IGdlbmVyYXRlX25ld19hcnJheV9mcm9tX3R5cGUoZXR5cGUpOworICAgICAgfQorCisgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSAiIDw8IGluaXRfZnVuY3Rpb24gPDwgZW5kbDsKKworICAgICAgLy8gUHJlLXBvcHVsYXRlIHRoZSBjb250YWluZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWVzLCBpZiBhbnkKKyAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpKSB7CisgICAgICAgIHRfY29uc3RfdmFsdWUqIG1lbWJlcl92YWx1ZSA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisKKyAgICAgICAgaWYgKHQtPmlzX2xpc3QoKSkgeworICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIGxpc3QgPSBtZW1iZXJfdmFsdWUtPmdldF9saXN0KCk7CisKKyAgICAgICAgICBpZiAoaXNfbnVtZXJpYyhldHlwZSkpIHsKKyAgICAgICAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PAorICAgICAgICAgICAgICAiZ19hcnJheV9hcHBlbmRfdmFscyAob2JqZWN0LT4iIDw8IG5hbWUgPDwgIiwgJl9fZGVmYXVsdF8iIDw8CisgICAgICAgICAgICAgIG5hbWUgPDwgIiwgIiA8PCBsaXN0LnNpemUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8CisgICAgICAgICAgICAgICJmb3IgKGxpc3RfaW5kZXggPSAwOyBsaXN0X2luZGV4IDwgIiA8PCBsaXN0LnNpemUoKSA8PCAiOyAiIDw8CisgICAgICAgICAgICAgICJsaXN0X2luZGV4ICs9IDEpIiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwKKyAgICAgICAgICAgICAgImdfcHRyX2FycmF5X2FkZCAob2JqZWN0LT4iIDw8IG5hbWUgPDwgIiwiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgICAgaW5kZW50KCkgPDwgc3RyaW5nKDE3LCAnICcpIDw8ICJnX3N0cmR1cCAoX19kZWZhdWx0XyIgPDwKKyAgICAgICAgICAgICAgbmFtZSA8PCAiW2xpc3RfaW5kZXhdKSk7IiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBIYW5kbGUgY29udGFpbmVyIHR5cGVzIG90aGVyIHRoYW4gbGlzdAorICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vdCByZXF1aXJlZCwgaW5pdGlhbGl6ZSB0aGUgX19pc3NldCB2YXJpYWJsZSAqLworICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+X19pc3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gRkFMU0U7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfaW1wbF8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvKiBjcmVhdGUgdGhlIGRlc3RydWN0b3IgKi8KKyAgZl90eXBlc19pbXBsXyA8PCAic3RhdGljIHZvaWQgIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UKKyAgICAgICAgICAgICAgICA8PCAiX2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIgKnRvYmplY3QgPSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjCisgICAgICAgICAgICAgICAgPDwgIiAob2JqZWN0KTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICIvKiBzYXRpc2Z5IC1XYWxsIGluIGNhc2Ugd2UgZG9uJ3QgdXNlIHRvYmplY3QgKi8iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHRvYmplY3QpOyIgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICh0LT5pc19jb250YWluZXIoKSkgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgICBpZiAodC0+aXNfbWFwKCkgfHwgdC0+aXNfc2V0KCkpIHsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZ19oYXNoX3RhYmxlX2Rlc3Ryb3kgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInRvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSkgeworICAgICAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXQpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIHN0cmluZyBkZXN0cnVjdG9yX2Z1bmN0aW9uID0gImdfcHRyX2FycmF5X3VucmVmIjsKKworICAgICAgICBpZiAoZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKWV0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgZGVzdHJ1Y3Rvcl9mdW5jdGlvbiA9ICJnX2FycmF5X3VucmVmIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGV0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgICAgICBkZXN0cnVjdG9yX2Z1bmN0aW9uID0gImdfYXJyYXlfdW5yZWYiOworICAgICAgICB9CisKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCBkZXN0cnVjdG9yX2Z1bmN0aW9uIDw8ICIgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInRvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIC8vIFRPRE86IGdfY2xlYXJfb2JqZWN0IG5lZWRzIGdsaWIgPj0gMi4yOAorICAgICAgLy8gZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZ19jbGVhcl9vYmplY3QgKCYodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIpKTsiIDw8IGVuZGw7CisgICAgICAvLyBkb2VzIGdfb2JqZWN0X3VucmVmIHRoZSB0cmljaz8KKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImlmICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0LT5pc19zdHJpbmcoKSkgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IGdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUodCkgPDwgIih0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIik7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAidG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfaW1wbF8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSB0aGUgY2xhc3MgaW5pdCBmdW5jdGlvbgorCisgIGZfdHlwZXNfaW1wbF8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9jbGFzc19pbml0ICgiIDw8IGNsYXNzX25hbWUKKyAgICAgICAgICAgICAgICA8PCAiQ2xhc3MgKiBjbHMpIiA8PCBlbmRsOworICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKworICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0U3RydWN0Q2xhc3MgKnN0cnVjdF9jbGFzcyA9ICIKKyAgICAgICAgICAgICAgICA8PCAiVEhSSUZUX1NUUlVDVF9DTEFTUyAoY2xzKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICJzdHJ1Y3RfY2xhc3MtPnJlYWQgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9yZWFkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICJzdHJ1Y3RfY2xhc3MtPndyaXRlID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfd3JpdGU7IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9maW5hbGl6ZTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9ICIgPDwgY2xhc3NfbmFtZV9sYworICAgICAgICAgICAgICAgICAgPDwgIl9nZXRfcHJvcGVydHk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICA8PCAiZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfc2V0X3Byb3BlcnR5OyIgPDwgZW5kbDsKKworICAgIC8vIGluc3RhbGwgYSBwcm9wZXJ0eSBmb3IgZWFjaCBtZW1iZXIKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1faXRlcik7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWUgPSBtZW1iZXItPmdldF9uYW1lKCk7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWVfdWMKKyAgICAgICAgICA9IHRvX3VwcGVyX2Nhc2UodG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobWVtYmVyX25hbWUpKSk7CisgICAgICB0X3R5cGUqIG1lbWJlcl90eXBlID0gZ2V0X3RydWVfdHlwZShtZW1iZXItPmdldF90eXBlKCkpOworICAgICAgdF9jb25zdF92YWx1ZSogbWVtYmVyX3ZhbHVlID0gbWVtYmVyLT5nZXRfdmFsdWUoKTsKKworICAgICAgc3RyaW5nIHByb3BlcnR5X2lkZW50aWZpZXIgPSAiUFJPUF8iICsgY2xhc3NfbmFtZV91YyArICJfIiArIG1lbWJlcl9uYW1lX3VjOworCisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyAnICc7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICIoZ29iamVjdF9jbGFzcywiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgcHJvcGVydHlfaWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAgICA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudDsKKworICAgICAgaWYgKG1lbWJlcl90eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKW1lbWJlcl90eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgICAgICBpZiAoYmFzZV90eXBlID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykgeworICAgICAgICAgIGlmICgoKHRfYmFzZV90eXBlKiltZW1iZXJfdHlwZSktPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcoMjAsICcgJyk7CisgICAgICAgICAgICBmX3R5cGVzX2ltcGxfIDw8ICJnX3BhcmFtX3NwZWNfYm94ZWQgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkdfVFlQRV9CWVRFX0FSUkFZLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMSwgJyAnKTsKKyAgICAgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgImdfcGFyYW1fc3BlY19zdHJpbmcgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKChtZW1iZXJfdmFsdWUgIT0gTlVMTCkgPyAiXCIiICsgbWVtYmVyX3ZhbHVlLT5nZXRfc3RyaW5nKCkgKyAiXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIk5VTEwiKSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKSB7CisgICAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIyLCAnICcpOworICAgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgImdfcGFyYW1fc3BlY19ib29sZWFuIChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgKCgobWVtYmVyX3ZhbHVlICE9IE5VTEwpICYmIChtZW1iZXJfdmFsdWUtPmdldF9pbnRlZ2VyKCkgIT0gMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIlRSVUUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIkZBTFNFIikgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIGlmICgoYmFzZV90eXBlID09IHRfYmFzZV90eXBlOjpUWVBFX0k4KSB8fCAoYmFzZV90eXBlID09IHRfYmFzZV90eXBlOjpUWVBFX0kxNikKKyAgICAgICAgICAgICAgICAgICB8fCAoYmFzZV90eXBlID09IHRfYmFzZV90eXBlOjpUWVBFX0kzMikgfHwgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQpCisgICAgICAgICAgICAgICAgICAgfHwgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUpKSB7CisgICAgICAgICAgc3RyaW5nIHBhcmFtX3NwZWNfZnVuY3Rpb25fbmFtZSA9ICJnX3BhcmFtX3NwZWNfaW50IjsKKyAgICAgICAgICBzdHJpbmcgbWluX3ZhbHVlOworICAgICAgICAgIHN0cmluZyBtYXhfdmFsdWU7CisgICAgICAgICAgb3N0cmluZ3N0cmVhbSBkZWZhdWx0X3ZhbHVlOworCisgICAgICAgICAgc3dpdGNoIChiYXNlX3R5cGUpIHsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgICAgbWluX3ZhbHVlID0gIkdfTUlOSU5UOCI7CisgICAgICAgICAgICBtYXhfdmFsdWUgPSAiR19NQVhJTlQ4IjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgICBtaW5fdmFsdWUgPSAiR19NSU5JTlQxNiI7CisgICAgICAgICAgICBtYXhfdmFsdWUgPSAiR19NQVhJTlQxNiI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgICAgbWluX3ZhbHVlID0gIkdfTUlOSU5UMzIiOworICAgICAgICAgICAgbWF4X3ZhbHVlID0gIkdfTUFYSU5UMzIiOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICAgIHBhcmFtX3NwZWNfZnVuY3Rpb25fbmFtZSA9ICJnX3BhcmFtX3NwZWNfaW50NjQiOworICAgICAgICAgICAgbWluX3ZhbHVlID0gIkdfTUlOSU5UNjQiOworICAgICAgICAgICAgbWF4X3ZhbHVlID0gIkdfTUFYSU5UNjQiOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgIHBhcmFtX3NwZWNfZnVuY3Rpb25fbmFtZSA9ICJnX3BhcmFtX3NwZWNfZG91YmxlIjsKKyAgICAgICAgICAgIG1pbl92YWx1ZSA9ICItSU5GSU5JVFkiOworICAgICAgICAgICAgbWF4X3ZhbHVlID0gIklORklOSVRZIjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogIgorICAgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBiYXNlIHR5cGUgXCIiICsgbWVtYmVyX3R5cGUtPmdldF9uYW1lKCkgKyAiXCIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHN0cnVjdCBtZW1iZXIgXCIiCisgICAgICAgICAgICAgICAgKyBtZW1iZXJfbmFtZSArICJcIiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAobWVtYmVyX3ZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRlZmF1bHRfdmFsdWUgPDwgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUgPyBtZW1iZXJfdmFsdWUtPmdldF9kb3VibGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1lbWJlcl92YWx1ZS0+Z2V0X2ludGVnZXIoKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlZmF1bHRfdmFsdWUgPDwgIjAiOworICAgICAgICAgIH0KKworICAgICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZyhwYXJhbV9zcGVjX2Z1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOworICAgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgcGFyYW1fc3BlY19mdW5jdGlvbl9uYW1lIDw8ICIgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCBtaW5fdmFsdWUgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgbWF4X3ZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCBkZWZhdWx0X3ZhbHVlLnN0cigpIDw8ICIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgIHRfZW51bV92YWx1ZSogZW51bV9taW5fdmFsdWUgPSAoKHRfZW51bSopbWVtYmVyX3R5cGUpLT5nZXRfbWluX3ZhbHVlKCk7CisgICAgICAgIHRfZW51bV92YWx1ZSogZW51bV9tYXhfdmFsdWUgPSAoKHRfZW51bSopbWVtYmVyX3R5cGUpLT5nZXRfbWF4X3ZhbHVlKCk7CisgICAgICAgIGludCBtaW5fdmFsdWUgPSAoZW51bV9taW5fdmFsdWUgIT0gTlVMTCkgPyBlbnVtX21pbl92YWx1ZS0+Z2V0X3ZhbHVlKCkgOiAwOworICAgICAgICBpbnQgbWF4X3ZhbHVlID0gKGVudW1fbWF4X3ZhbHVlICE9IE5VTEwpID8gZW51bV9tYXhfdmFsdWUtPmdldF92YWx1ZSgpIDogMDsKKworICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcoMTgsICcgJyk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgImdfcGFyYW1fc3BlY19pbnQgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgIDw8IG1pbl92YWx1ZSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCBtYXhfdmFsdWUgPDwgIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCBtaW5fdmFsdWUgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19zdHJ1Y3QoKSB8fCBtZW1iZXJfdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICB0X3Byb2dyYW0qIHR5cGVfcHJvZ3JhbSA9IG1lbWJlcl90eXBlLT5nZXRfcHJvZ3JhbSgpOworICAgICAgICBzdHJpbmcgdHlwZV9uc3BhY2UgPSB0eXBlX3Byb2dyYW0gPyB0eXBlX3Byb2dyYW0tPmdldF9uYW1lc3BhY2UoImNfZ2xpYiIpIDogIiI7CisgICAgICAgIHN0cmluZyB0eXBlX25zcGFjZV9wcmVmaXggPQorICAgICAgICAgIHR5cGVfbnNwYWNlLmVtcHR5KCkgPyAiIiA6IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0eXBlX25zcGFjZSkgKyAiXyI7CisKKyAgICAgICAgc3RyaW5nIHBhcmFtX3R5cGUgPSB0b191cHBlcl9jYXNlKHR5cGVfbnNwYWNlX3ByZWZpeCkgKyAiVFlQRV8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhtZW1iZXJfdHlwZS0+Z2V0X25hbWUoKSkpOworCisgICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMCwgJyAnKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCAiZ19wYXJhbV9zcGVjX29iamVjdCAoXCIiIDw8IG1lbWJlcl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgPDwgcGFyYW1fdHlwZSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopbWVtYmVyX3R5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIHN0cmluZyBwYXJhbV90eXBlOworCisgICAgICAgIGlmIChlbGVtX3R5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICFlbGVtX3R5cGUtPmlzX3N0cmluZygpKSB7CisgICAgICAgICAgcGFyYW1fdHlwZSA9ICJHX1RZUEVfQVJSQVkiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBhcmFtX3R5cGUgPSAiR19UWVBFX1BUUl9BUlJBWSI7CisgICAgICAgIH0KKworICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcoMjAsICcgJyk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgImdfcGFyYW1fc3BlY19ib3hlZCAoXCIiIDw8IG1lbWJlcl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgPDwgcGFyYW1fdHlwZSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19zZXQoKSB8fCBtZW1iZXJfdHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIwLCAnICcpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8ICJnX3BhcmFtX3NwZWNfYm94ZWQgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgIDw8ICJHX1RZUEVfSEFTSF9UQUJMRSwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9CisgICAgfQorICB9CisgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKworICBmX3R5cGVzX2ltcGxfIDw8ICJHVHlwZSIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfZ2V0X3R5cGUgKHZvaWQpIiA8PCBlbmRsIDw8ICJ7IgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgc3RhdGljIEdUeXBlIHR5cGUgPSAwOyIgPDwgZW5kbCA8PCBlbmRsIDw8ICIgIGlmICh0eXBlID09IDApICIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8ICIgIHsiIDw8IGVuZGwgPDwgIiAgICBzdGF0aWMgY29uc3QgR1R5cGVJbmZvIHR5cGVfaW5mbyA9ICIgPDwgZW5kbCA8PCAiICAgIHsiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgc2l6ZW9mICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcyksIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgIiAgICAgIE5VTEwsIC8qIGJhc2VfaW5pdCAqLyIgPDwgZW5kbCA8PCAiICAgICAgTlVMTCwgLyogYmFzZV9maW5hbGl6ZSAqLyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICAoR0NsYXNzSW5pdEZ1bmMpICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2NsYXNzX2luaXQsIgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgIE5VTEwsIC8qIGNsYXNzX2ZpbmFsaXplICovIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgIiAgICAgIE5VTEwsIC8qIGNsYXNzX2RhdGEgKi8iIDw8IGVuZGwgPDwgIiAgICAgIHNpemVvZiAoIiA8PCB0aGlzLT5uc3BhY2UKKyAgICAgICAgICAgICAgICA8PCBuYW1lIDw8ICIpLCIgPDwgZW5kbCA8PCAiICAgICAgMCwgLyogbl9wcmVhbGxvY3MgKi8iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCAiICAgICAgKEdJbnN0YW5jZUluaXRGdW5jKSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9pbnN0YW5jZV9pbml0LCIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICBOVUxMLCAvKiB2YWx1ZV90YWJsZSAqLyIgPDwgZW5kbCA8PCAiICAgIH07IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCAiICAgIHR5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljIChUSFJJRlRfVFlQRV9TVFJVQ1QsICIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiVHlwZVwiLCIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlX2luZm8sIDApOyIgPDwgZW5kbCA8PCAiICB9IgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCAiICByZXR1cm4gdHlwZTsiIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgZnVuY3Rpb25zIHRvIHdyaXRlIFRocmlmdCBzdHJ1Y3R1cmVzIHRvIGEgc3RyZWFtLgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19nZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2Z1bmN0aW9uKSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgc3RyaW5nIG5hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKKyAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKG5hbWVfdSk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBpbnQgZXJyb3JfcmV0ID0gMDsKKworICBpZiAoaXNfZnVuY3Rpb24pIHsKKyAgICBlcnJvcl9yZXQgPSAtMTsKKyAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIGdpbnQzMiIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91CisgICAgICAgICAgICAgICAgPDwgIl93cml0ZSAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpIgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ2ludDMyIHJldDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImdpbnQzMiB4ZmVyID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCB0aGlzX2dldCA8PCBlbmRsOworICAvLyBzYXRpc2Z5IC1XYWxsIGluIHRoZSBjYXNlIG9mIGFuIGVtcHR5IHN0cnVjdAorICBpZiAoIXRoaXNfZ2V0LmVtcHR5KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHRoaXNfb2JqZWN0KTsiIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsIFwiIiA8PCBuYW1lCisgICAgICA8PCAiXCIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzX29iamVjdC0+X19pc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IFRSVUUpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgIgorICAgICAgICA8PCAiXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0CisgICAgICAgIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgdGhpc19uYW1lLCAiIiwgZXJyb3JfcmV0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIKKyAgICAgICAgPDwgZW5kbDsKKworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gd3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICA8PCBlbmRsOworCisgIGlmIChpc19mdW5jdGlvbikgeworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4geGZlcjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIHJlYWQgVGhyaWZ0IHN0cnVjdHVyZXMgZnJvbSBhIHN0cmVhbS4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19mdW5jdGlvbikgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7CisgIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lX3UpOworICBpbnQgZXJyb3JfcmV0ID0gMDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGlmIChpc19mdW5jdGlvbikgeworICAgIGVycm9yX3JldCA9IC0xOworICAgIGluZGVudChvdXQpIDw8ICIvKiByZWFkcyBhICIgPDwgbmFtZV91IDw8ICIgb2JqZWN0ICovIiA8PCBlbmRsIDw8ICJzdGF0aWMgZ2ludDMyIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdQorICAgICAgICAgICAgICAgIDw8ICJfcmVhZCAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIGRlY2xhcmUgc3RhY2sgdGVtcCB2YXJpYWJsZXMKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJnaW50MzIgcmV0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZ2ludDMyIHhmZXIgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImdjaGFyICpuYW1lID0gTlVMTDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlRocmlmdFR5cGUgZnR5cGU7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiZ2ludDE2IGZpZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgbGVuID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJncG9pbnRlciBkYXRhID0gTlVMTDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdGhpc19nZXQgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZ2Jvb2xlYW4gaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IEZBTFNFOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBzYXRpc2Z5IC1XYWxsIGluIGNhc2Ugd2UgZG9uJ3QgdXNlIHNvbWUgdmFyaWFibGVzCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogc2F0aXNmeSAtV2FsbCBpbiBjYXNlIHRoZXNlIGFyZW4ndCB1c2VkICovIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKGxlbik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAoZGF0YSk7IiA8PCBlbmRsOworCisgIGlmICghdGhpc19nZXQuZW1wdHkoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHRoaXNfb2JqZWN0KTsiIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gcmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJ1Y3R1cmUgbWFya2VyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogcmVhZCB0aGUgc3RydWN0IGJlZ2luIG1hcmtlciAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgJm5hbWUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIm5hbWUgPSBOVUxMOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIHJlYWQgdGhlIHN0cnVjdCBmaWVsZHMKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvKiByZWFkIHRoZSBzdHJ1Y3QgZmllbGRzICovIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ3aGlsZSAoMSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gcmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogcmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgZmllbGQgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJm5hbWUsICZmdHlwZSwgJmZpZCwgZXJyb3IpKSA8IDApIgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpZiAobmFtZSkgZ19mcmVlIChuYW1lKTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAibmFtZSA9IE5VTEw7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gY2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogYnJlYWsgaWYgd2UgZ2V0IGEgU1RPUCBmaWVsZCAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImlmIChmdHlwZSA9PSBUX1NUT1ApIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBzd2l0Y2ggZGVwZW5kaW5nIG9uIHRoZSBmaWVsZCB0eXBlCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZCkiIDw8IGVuZGw7CisKKyAgLy8gc3RhcnQgc3dpdGNoCisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gZ2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIHR5cGVzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICAvLyBnZW5lcmF0ZSBkZXNlcmlhbGl6ZSBmaWVsZAorICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgdGhpc19uYW1lLCAiIiwgZXJyb3JfcmV0LCBmYWxzZSk7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGZ0eXBlLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIGNyZWF0ZSB0aGUgZGVmYXVsdCBjYXNlCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBmdHlwZSwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICAgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4ZmVyICs9IHJldDsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKKworICAvLyBlbmQgc3dpdGNoCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyByZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7CisKKyAgLy8gZW5kIHdoaWxlIGxvb3AKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICAvLyByZWFkIHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZQorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwKKyAgICAgIDw8IGVuZGw7CisKKyAgLy8gaWYgYSByZXF1aXJlZCBmaWVsZCBpcyBtaXNzaW5nLCB0aHJvdyBhbiBlcnJvcgorICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInsiCisgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX0lOVkFMSURfREFUQSwiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgXCJtaXNzaW5nIGZpZWxkXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gLTE7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpZiAoaXNfZnVuY3Rpb24pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHhmZXI7IiA8PCBlbmRsOworICB9CisKKyAgLy8gZW5kIHRoZSBmdW5jdGlvbi9zdHJ1Y3R1cmUKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgc3VmZml4OworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lLCBlcnJvcl9yZXQpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUsIGVycm9yX3JldCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlXyI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJib29sIChwcm90b2NvbCwgIiA8PCBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAiYnl0ZSAocHJvdG9jb2wsICIgPDwgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJpMTYgKHByb3RvY29sLCAiIDw8IG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAiaTMyIChwcm90b2NvbCwgIiA8PCBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgImk2NCAocHJvdG9jb2wsICIgPDwgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJkb3VibGUgKHByb3RvY29sLCAiIDw8IG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAiYmluYXJ5IChwcm90b2NvbCwgIiA8PCBuYW1lIDw8ICIgPyAoKEdCeXRlQXJyYXkgKikgIiA8PCBuYW1lIDw8ICIpLT5kYXRhIDogTlVMTCwgIgorICAgICAgICAgICAgICA8PCBuYW1lIDw8ICIgPyAoKEdCeXRlQXJyYXkgKikgIiA8PCBuYW1lIDw8ICIpLT5sZW4gOiAwIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgInN0cmluZyAocHJvdG9jb2wsICIgPDwgbmFtZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyB3cml0ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSArIG5hbWU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiaTMyIChwcm90b2NvbCwgKGdpbnQzMikgIiA8PCBuYW1lOworICAgIH0KKyAgICBvdXQgPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnIiArIG5hbWUgKyAiJyBUWVBFICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIHR5cGVfbmFtZSh0eXBlKSk7CisgIH0KK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgeworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3N0cnVjdF93cml0ZSAoVEhSSUZUX1NUUlVDVCAoIiA8PCBwcmVmaXgKKyAgICAgIDw8ICIpLCBwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiB0a2V5ID0gKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHR2YWwgPSAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIHN0cmluZyB0a2V5X25hbWUgPSB0eXBlX25hbWUodGtleSk7CisgICAgc3RyaW5nIHR2YWxfbmFtZSA9IHR5cGVfbmFtZSh0dmFsKTsKKyAgICBzdHJpbmcgdGtleV9wdHI7CisgICAgc3RyaW5nIHR2YWxfcHRyOworICAgIHN0cmluZyBrZXluYW1lID0gdG1wKCJrZXkiKTsKKyAgICBzdHJpbmcgdmFsbmFtZSA9IHRtcCgidmFsIik7CisKKyAgICBkZWNsb3JlX2xvY2FsX3ZhcmlhYmxlX2Zvcl93cml0ZShvdXQsIHRrZXksIGtleW5hbWUpOworICAgIGRlY2xvcmVfbG9jYWxfdmFyaWFibGVfZm9yX3dyaXRlKG91dCwgdHZhbCwgdmFsbmFtZSk7CisKKyAgICAvKiBJZiBlaXRoZXIgdGhlIGtleSBvciB2YWx1ZSB0eXBlIGlzIGEgdHlwZWRlZiwgZmluZCBpdHMgdW5kZXJseWluZyB0eXBlIHNvCisgICAgICAgd2UgY2FuIGNvcnJlY3RseSBkZXRlcm1pbmUgaG93IHRvIGdlbmVyYXRlIGEgcG9pbnRlciB0byBpdCAqLworICAgIHRrZXkgPSBnZXRfdHJ1ZV90eXBlKHRrZXkpOworICAgIHR2YWwgPSBnZXRfdHJ1ZV90eXBlKHR2YWwpOworCisgICAgdGtleV9wdHIgPSB0a2V5LT5pc19zdHJpbmcoKSB8fCAhdGtleS0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKKyAgICB0dmFsX3B0ciA9IHR2YWwtPmlzX3N0cmluZygpIHx8ICF0dmFsLT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOworCisgICAgLyoKKyAgICAgKiBTb21lIHVnbGluZXNzIGhlcmUuICBUbyBtYXhpbWl6ZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgd2UKKyAgICAgKiBhdm9pZCB1c2luZyBHSGFzaFRhYmxlSXRlciBhbmQgaW5zdGVhZCBnZXQgYSBHTGlzdCBvZiBhbGwga2V5cywKKyAgICAgKiB0aGVuIGNvcHkgaXQgaW50byBhIGFycmF5IG9uIHRoZSBzdGFjaywgYW5kIGZyZWUgaXQuCisgICAgICogVGhpcyBpcyBiZWNhdXNlIHdlIG1heSBleGl0IGVhcmx5IGJlZm9yZSB3ZSBnZXQgYSBjaGFuY2UgdG8gZnJlZSB0aGUKKyAgICAgKiBHTGlzdC4KKyAgICAgKi8KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIkdMaXN0ICprZXlfbGlzdCA9IE5VTEwsICppdGVyID0gTlVMTDsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgdGtleV9uYW1lIDw8IHRrZXlfcHRyIDw8ICIqIGtleXM7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpbnQgaSA9IDAsIGtleV9jb3VudDsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgIgorICAgICAgICA8PCB0eXBlX3RvX2VudW0odGtleSkgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0odHZhbCkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIiA/ICIKKyAgICAgICAgPDwgIihnaW50MzIpIGdfaGFzaF90YWJsZV9zaXplICgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeCA8PCAiKSA6IDAiCisgICAgICAgIDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZ19oYXNoX3RhYmxlX2ZvcmVhY2ggKChHSGFzaFRhYmxlICopICIgPDwgcHJlZml4CisgICAgICAgIDw8ICIsIHRocmlmdF9oYXNoX3RhYmxlX2dldF9rZXlzLCAma2V5X2xpc3QpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAia2V5X2NvdW50ID0gZ19saXN0X2xlbmd0aCAoa2V5X2xpc3QpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAia2V5cyA9IGdfbmV3YSAoIiA8PCB0a2V5X25hbWUgPDwgdGtleV9wdHIKKyAgICAgICAgPDwgIiwga2V5X2NvdW50KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaXRlciA9IGdfbGlzdF9maXJzdCAoa2V5X2xpc3QpOyBpdGVyOyAiCisgICAgICAgICAgICJpdGVyID0gaXRlci0+bmV4dCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJrZXlzW2krK10gPSAoIiA8PCB0a2V5X25hbWUgPDwgdGtleV9wdHIKKyAgICAgICAgPDwgIikgaXRlci0+ZGF0YTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImdfbGlzdF9mcmVlIChrZXlfbGlzdCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaSA9IDA7IGkgPCBrZXlfY291bnQ7ICsraSkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwga2V5bmFtZSA8PCAiID0ga2V5c1tpXTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgdmFsbmFtZSA8PCAiID0gKCIgPDwgdHZhbF9uYW1lIDw8IHR2YWxfcHRyCisgICAgICAgIDw8ICIpIGdfaGFzaF90YWJsZV9sb29rdXAgKCgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeAorICAgICAgICA8PCAiKSwgKGdwb2ludGVyKSAiIDw8IGtleW5hbWUgPDwgIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfbWFwKil0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGtleV9wdHIgKyAiICIgKyBrZXluYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dmFsX3B0ciArICIgIiArIHZhbG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3JldCk7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZCAocHJvdG9jb2wsICIKKyAgICAgICAgICAgImVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogdGVsZW0gPSAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBzdHJpbmcgdGVsZW1fbmFtZSA9IHR5cGVfbmFtZSh0ZWxlbSk7CisgICAgc3RyaW5nIHRlbGVtX3B0ciA9IHRlbGVtLT5pc19zdHJpbmcoKSB8fCAhdGVsZW0tPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJHTGlzdCAqa2V5X2xpc3QgPSBOVUxMLCAqaXRlciA9IE5VTEw7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IHRlbGVtX25hbWUgPDwgdGVsZW1fcHRyIDw8ICIqIGtleXM7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpbnQgaSA9IDAsIGtleV9jb3VudDsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgdGVsZW1fbmFtZSA8PCB0ZWxlbV9wdHIgPDwgIiBlbGVtOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ3BvaW50ZXIgdmFsdWU7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAodmFsdWUpOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW4gKHByb3RvY29sLCAiCisgICAgICAgIDw8IHR5cGVfdG9fZW51bSh0ZWxlbSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIiA/ICIKKyAgICAgICAgPDwgIihnaW50MzIpIGdfaGFzaF90YWJsZV9zaXplICgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeCA8PCAiKSA6IDAiCisgICAgICAgIDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZ19oYXNoX3RhYmxlX2ZvcmVhY2ggKChHSGFzaFRhYmxlICopICIgPDwgcHJlZml4CisgICAgICAgIDw8ICIsIHRocmlmdF9oYXNoX3RhYmxlX2dldF9rZXlzLCAma2V5X2xpc3QpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAia2V5X2NvdW50ID0gZ19saXN0X2xlbmd0aCAoa2V5X2xpc3QpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAia2V5cyA9IGdfbmV3YSAoIiA8PCB0ZWxlbV9uYW1lIDw8IHRlbGVtX3B0cgorICAgICAgICA8PCAiLCBrZXlfY291bnQpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpdGVyID0gZ19saXN0X2ZpcnN0IChrZXlfbGlzdCk7IGl0ZXI7ICIKKyAgICAgICAgICAgIml0ZXIgPSBpdGVyLT5uZXh0KSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImtleXNbaSsrXSA9ICgiIDw8IHRlbGVtX25hbWUgPDwgdGVsZW1fcHRyCisgICAgICAgIDw8ICIpIGl0ZXItPmRhdGE7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJnX2xpc3RfZnJlZSAoa2V5X2xpc3QpOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKGkgPSAwOyBpIDwga2V5X2NvdW50OyArK2kpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbGVtID0ga2V5c1tpXTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInZhbHVlID0gKGdwb2ludGVyKSBnX2hhc2hfdGFibGVfbG9va3VwICIKKyAgICAgICAgICAgIigoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXggPDwgIiksIChncG9pbnRlcikgZWxlbSk7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc2V0Kil0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVsZW1fcHRyICsgImVsZW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9yZXQpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9lbmQgKHByb3RvY29sLCAiCisgICAgICAgICAgICJlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgc3RyaW5nIGxlbmd0aCA9ICIoIiArIHByZWZpeCArICIgPyAiICsgcHJlZml4ICsgIi0+bGVuIDogMCkiOworICAgIHN0cmluZyBpID0gdG1wKCJpIik7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJndWludCAiIDw8IGkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsICIKKyAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgKGdpbnQzMikgIgorICAgICAgICA8PCBsZW5ndGggPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgbGVuZ3RoIDw8ICI7ICIKKyAgICAgICAgPDwgaSA8PCAiKyspIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgsIGksIGVycm9yX3JldCk7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQgKHByb3RvY29sLCAiCisgICAgICAgICAgICJlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiLCAiIiwgZXJyb3JfcmV0KTsKKworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsdWUpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIiwgIiIsIGVycm9yX3JldCk7Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtZW50KTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsICIiLCBlcnJvcl9yZXQpOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgIHRfdHlwZSogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpOworCisgIC8vIGNhc3QgdG8gbm9uLWNvbnN0CisgIHN0cmluZyBjYXN0ID0gIiI7CisgIHN0cmluZyBuYW1lID0gImdfcHRyX2FycmF5X2luZGV4ICgoR1B0ckFycmF5ICopICIgKyBsaXN0ICsgIiwgIiArIGluZGV4ICsgIikiOworCisgIGlmICh0dHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJjb21waWxlciBlcnJvcjogbGlzdCBlbGVtZW50IHR5cGUgY2Fubm90IGJlIHZvaWQiKTsKKyAgfSBlbHNlIGlmIChpc19udW1lcmljKHR0eXBlKSkgeworICAgIG5hbWUgPSAiZ19hcnJheV9pbmRleCAoIiArIGxpc3QgKyAiLCAiICsgYmFzZV90eXBlX25hbWUodHR5cGUpICsgIiwgIiArIGluZGV4ICsgIikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJpbmcoKSkgeworICAgIGNhc3QgPSAiKGdjaGFyKikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSB8fCB0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBjYXN0ID0gIihHSGFzaFRhYmxlKikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGlmIChldHlwZS0+aXNfdm9pZCgpKSB7CisgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoImNvbXBpbGVyIGVycm9yOiBsaXN0IGVsZW1lbnQgdHlwZSBjYW5ub3QgYmUgdm9pZCIpOworICAgIH0KKyAgICBjYXN0ID0gaXNfbnVtZXJpYyhldHlwZSkgPyAiKEdBcnJheSopIiA6ICIoR1B0ckFycmF5KikiOworICB9CisKKyAgdF9maWVsZCBlZmllbGQodHR5cGUsICIoIiArIGNhc3QgKyBuYW1lICsgIikiKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsICIiLCBlcnJvcl9yZXQpOworfQorCisvKiBkZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4gKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb2NhdGUpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgKyBzdWZmaXg7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUsIGVycm9yX3JldCwgYWxsb2NhdGUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSwgZXJyb3JfcmV0KTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZ19mcmVlKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfIjsKKworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBvdXQgPDwgImJpbmFyeSAocHJvdG9jb2wsICZkYXRhLCAmbGVuIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAic3RyaW5nIChwcm90b2NvbCwgJiIgPDwgbmFtZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAiYm9vbCAocHJvdG9jb2wsICYiIDw8IG5hbWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgb3V0IDw8ICJieXRlIChwcm90b2NvbCwgJiIgPDwgbmFtZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgb3V0IDw8ICJpMTYgKHByb3RvY29sLCAmIiA8PCBuYW1lOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBvdXQgPDwgImkzMiAocHJvdG9jb2wsICYiIDw8IG5hbWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCAiaTY0IChwcm90b2NvbCwgJiIgPDwgbmFtZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgb3V0IDw8ICJkb3VibGUgKHByb3RvY29sLCAmIiA8PCBuYW1lOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyByZWFkZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSArIG5hbWU7CisgICAgfQorICAgIG91dCA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IgorICAgICAgICA8PCBlbmRsOworCisgICAgLy8gbG9hZCB0aGUgYnl0ZSBhcnJheSB3aXRoIHRoZSBkYXRhCisgICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyAmJiB0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gZ19ieXRlX2FycmF5X25ldygpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJnX2J5dGVfYXJyYXlfYXBwZW5kICgiIDw8IG5hbWUgPDwgIiwgKGd1aW50OCAqKSBkYXRhLCAoZ3VpbnQpIGxlbik7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImdfZnJlZSAoZGF0YSk7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgiZWNhc3QiKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImdpbnQzMiAiIDw8IHQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJiIgPDwgdCA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB0IDw8ICI7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAiJyBUWVBFICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIHR5cGVfbmFtZSh0eXBlKSk7CisgIH0KKworICAvLyBpZiB0aGUgdHlwZSBpcyBub3QgcmVxdWlyZWQgYW5kIHRoaXMgaXMgYSB0aHJpZnQgc3RydWN0IChubyBwcmVmaXgpLAorICAvLyBzZXQgdGhlIGlzc2V0IHZhcmlhYmxlLiAgaWYgdGhlIHR5cGUgaXMgcmVxdWlyZWQsIHRoZW4gc2V0IHRoZQorICAvLyBsb2NhbCB2YXJpYWJsZSBpbmRpY2F0aW5nIHRoZSB2YWx1ZSB3YXMgc2V0LCBzbyB0aGF0IHdlIGNhbiBkbyAgICAvLyB2YWxpZGF0aW9uIGxhdGVyLgorICBpZiAocHJlZml4ICE9ICIiICYmIHRmaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIl9faXNzZXRfIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgc3VmZml4IDw8ICIgPSBUUlVFOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmIChwcmVmaXggIT0gIiIgJiYgdGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgIGluZGVudChvdXQpIDw8ICJpc3NldF8iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gVFJVRTsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG9jYXRlKSB7CisgIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModHN0cnVjdC0+Z2V0X25hbWUoKSkpOworICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogVGhpcyBzdHJ1Y3QgaXMgYW4gZXhjZXB0aW9uICovIiA8PCBlbmRsOworICAgIGFsbG9jYXRlID0gdHJ1ZTsKKyAgfQorCisgIGlmIChhbGxvY2F0ZSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCAiIDw8IHByZWZpeCA8PCAiICE9IE5VTEwpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKCIgPDwgcHJlZml4IDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IGdfb2JqZWN0X25ldyAoIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgPDwgIlRZUEVfIiA8PCBuYW1lX3VjIDw8ICIsIE5VTEwpOyIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3N0cnVjdF9yZWFkIChUSFJJRlRfU1RSVUNUICgiIDw8IHByZWZpeAorICAgICAgPDwgIiksIHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAoYWxsb2NhdGUpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZ19vYmplY3RfdW5yZWYgKCIgPDwgcHJlZml4IDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgeworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgc2l6ZTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgaTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFR5cGUga2V5X3R5cGU7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRUeXBlIHZhbHVlX3R5cGU7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIG1hcCBiZWdpbiBtYXJrZXIgKi8iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwgIgorICAgICAgICAgICAiJmtleV90eXBlLCAmdmFsdWVfdHlwZSwgJnNpemUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgICAvLyBpdGVyYXRlIG92ZXIgbWFwIGVsZW1lbnRzCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIvKiBpdGVyYXRlIHRocm91Z2ggZWFjaCBvZiB0aGUgbWFwJ3MgZmllbGRzICovIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4LCBlcnJvcl9yZXQpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIC8vIHJlYWQgbWFwIGVuZAorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogcmVhZCB0aGUgbWFwIGVuZCBtYXJrZXIgKi8iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2VuZCAocHJvdG9jb2wsICIKKyAgICAgICAgICAgImVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBzaXplOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGU7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luIChwcm90b2NvbCwgIgorICAgICAgICAgICAiJmVsZW1lbnRfdHlwZSwgJnNpemUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgICAvLyBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIvKiBpdGVyYXRlIHRocm91Z2ggdGhlIHNldCBlbGVtZW50cyAqLyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCwgZXJyb3JfcmV0KTsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICAvLyByZWFkIHNldCBlbmQKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2VuZCAocHJvdG9jb2wsICIKKyAgICAgICAgICAgImVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBzaXplOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGU7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICIKKyAgICAgICAgICAgIiZlbGVtZW50X3R5cGUsJnNpemUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgICAvLyBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIvKiBpdGVyYXRlIHRocm91Z2ggbGlzdCBlbGVtZW50cyAqLyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9saXN0Kil0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3JldCk7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgLy8gcmVhZCBsaXN0IGVuZAorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2VuZCAocHJvdG9jb2wsICIKKyAgICAgICAgICAgImVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6ZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyYgbmFtZSwgYm9vbCBmb3JfaGFzaF90YWJsZSkgeworICBzdHJpbmcgdG5hbWUgPSB0eXBlX25hbWUodHR5cGUpOworCisgIC8qIElmIHRoZSBnaXZlbiB0eXBlIGlzIGEgdHlwZWRlZiwgZmluZCBpdHMgdW5kZXJseWluZyB0eXBlIHNvIHdlCisgICAgIGNhbiBjb3JyZWN0bHkgZGV0ZXJtaW5lIGhvdyB0byBnZW5lcmF0ZSBhIHBvaW50ZXIgdG8gaXQgKi8KKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgc3RyaW5nIHB0ciA9ICFpc19udW1lcmljKHR0eXBlKSA/ICIiIDogIioiOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHRuYW1lIDw8IHB0ciA8PCAiICIgPDwgbmFtZSA8PCAiID0gIgorICAgICAgICA8PCBnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUodG1hcC0+Z2V0X2tleV90eXBlKCksIHRtYXAtPmdldF92YWxfdHlwZSgpKSA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHRuYW1lIDw8IHB0ciA8PCAiICIgPDwgbmFtZSA8PCAiID0gIgorICAgICAgICA8PCBnZW5lcmF0ZV9uZXdfYXJyYXlfZnJvbV90eXBlKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAoZm9yX2hhc2hfdGFibGUgJiYgdHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0bmFtZSA8PCAiICIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgdG5hbWUgPDwgcHRyIDw8ICIgIiA8PCBuYW1lCisgICAgICAgIDw8IChwdHIgIT0gIiIgPyAiID0gZ19uZXcgKCIgKyB0bmFtZSArICIsIDEpIiA6ICIgPSBOVUxMIikgPDwgIjsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmRlY2xvcmVfbG9jYWxfdmFyaWFibGVfZm9yX3dyaXRlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyYgbmFtZSkgeworICBzdHJpbmcgdG5hbWUgPSB0eXBlX25hbWUodHR5cGUpOworICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBzdHJpbmcgcHRyID0gdHR5cGUtPmlzX3N0cmluZygpIHx8ICF0dHlwZS0+aXNfYmFzZV90eXBlKCkgPyAiICIgOiAiKiAiOworICBzdHJpbmcgaW5pdF92YWwgPSB0dHlwZS0+aXNfZW51bSgpID8gIiIgOiAiID0gTlVMTCI7CisgIG91dCA8PCBpbmRlbnQoKSA8PCB0bmFtZSA8PCBwdHIgPDwgbmFtZSA8PCBpbml0X3ZhbCA8PCAiOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgdF90eXBlKiB0a2V5ID0gdG1hcC0+Z2V0X2tleV90eXBlKCk7CisgIHRfdHlwZSogdHZhbCA9IHRtYXAtPmdldF92YWxfdHlwZSgpOworICBzdHJpbmcga2V5bmFtZSA9IHRtcCgia2V5Iik7CisgIHN0cmluZyB2YWxuYW1lID0gdG1wKCJ2YWwiKTsKKworICBkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG91dCwgdGtleSwga2V5bmFtZSwgdHJ1ZSk7CisgIGRlY2xhcmVfbG9jYWxfdmFyaWFibGUob3V0LCB0dmFsLCB2YWxuYW1lLCB0cnVlKTsKKworICAvKiBJZiBlaXRoZXIgdGhlIGtleSBvciB2YWx1ZSB0eXBlIGlzIGEgdHlwZWRlZiwgZmluZCBpdHMgdW5kZXJseWluZworICAgICB0eXBlIHNvIHdlIGNhbiBjb3JyZWN0bHkgZGV0ZXJtaW5lIGhvdyB0byBnZW5lcmF0ZSBhIHBvaW50ZXIgdG8KKyAgICAgaXQgKi8KKyAgdGtleSA9IGdldF90cnVlX3R5cGUodGtleSk7CisgIHR2YWwgPSBnZXRfdHJ1ZV90eXBlKHR2YWwpOworCisgIHN0cmluZyB0a2V5X3B0ciA9IHRrZXktPmlzX3N0cmluZygpIHx8ICF0a2V5LT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOworICBzdHJpbmcgdHZhbF9wdHIgPSB0dmFsLT5pc19zdHJpbmcoKSB8fCAhdHZhbC0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKKworICAvLyBkZXNlcmlhbGl6ZSB0aGUgZmllbGRzIG9mIHRoZSBtYXAgZWxlbWVudAorICB0X2ZpZWxkIGZrZXkodGtleSwgdGtleV9wdHIgKyBrZXluYW1lKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSwgIiIsICIiLCBlcnJvcl9yZXQpOworICB0X2ZpZWxkIGZ2YWwodHZhbCwgdHZhbF9wdHIgKyB2YWxuYW1lKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCwgIiIsICIiLCBlcnJvcl9yZXQpOworCisgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIiAmJiAiIDw8IGtleW5hbWUgPDwgIikiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiZ19oYXNoX3RhYmxlX2luc2VydCAoKEdIYXNoVGFibGUgKikiIDw8IHByZWZpeCA8PCAiLCAoZ3BvaW50ZXIpICIgPDwga2V5bmFtZQorICAgICAgICAgICAgICA8PCAiLCAoZ3BvaW50ZXIpICIgPDwgdmFsbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgIHRfdHlwZSogdGVsZW0gPSB0c2V0LT5nZXRfZWxlbV90eXBlKCk7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICBzdHJpbmcgdGVsZW1fcHRyID0gdGVsZW0tPmlzX3N0cmluZygpIHx8ICF0ZWxlbS0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKKworICBkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG91dCwgdGVsZW0sIGVsZW0sIHRydWUpOworCisgIHRfZmllbGQgZmVsZW0odGVsZW0sIHRlbGVtX3B0ciArIGVsZW0pOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgIiIsICIiLCBlcnJvcl9yZXQpOworCisgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIiAmJiAiIDw8IGVsZW0gPDwgIikiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiZ19oYXNoX3RhYmxlX2luc2VydCAoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXggPDwgIiwgKGdwb2ludGVyKSAiIDw8IGVsZW0KKyAgICAgICAgICAgICAgPDwgIiwgKGdwb2ludGVyKSAiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgICh2b2lkKWluZGV4OworICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHN0cmluZyB0ZWxlbV9wdHIgPSAhaXNfbnVtZXJpYyh0dHlwZSkgPyAiIiA6ICIqIjsKKworICBkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG91dCwgdHR5cGUsIGVsZW0sIGZhbHNlKTsKKworICB0X2ZpZWxkIGZlbGVtKHR0eXBlLCB0ZWxlbV9wdHIgKyBlbGVtKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sICIiLCAiIiwgZXJyb3JfcmV0KTsKKworICBpZiAodHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiY29tcGlsZXIgZXJyb3I6IGxpc3QgZWxlbWVudCB0eXBlIGNhbm5vdCBiZSB2b2lkIik7CisgIH0gZWxzZSBpZiAoaXNfbnVtZXJpYyh0dHlwZSkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZ19hcnJheV9hcHBlbmRfdmFscyAoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCBlbGVtIDw8ICIsIDEpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZ19wdHJfYXJyYXlfYWRkICgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworICB9Cit9CisKK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUodF90eXBlKiB0dHlwZSkgeworICBpZiAodHR5cGUgPT0gTlVMTCkKKyAgICByZXR1cm4gIk5VTEwiOworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgaGFzaCB0eXBlIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJnX2ZyZWUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgcmV0dXJuICJ0aHJpZnRfc3RyaW5nX2ZyZWUiOworICAgICAgfQorICAgICAgcmV0dXJuICJnX2ZyZWUiOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGhhc2ggdGFibGUgaW5mbyBmb3IgdHlwZSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIk5VTEwiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSB8fCB0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIihHRGVzdHJveU5vdGlmeSkgdGhyaWZ0X3NhZmVfaGFzaF90YWJsZV9kZXN0cm95IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICByZXR1cm4gImdfb2JqZWN0X3VucmVmIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBpZiAoZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopZXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgYXJyYXkgdHlwZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXR1cm4gIihHRGVzdHJveU5vdGlmeSkgZ19hcnJheV91bnJlZiI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmV0dXJuICIoR0Rlc3Ryb3lOb3RpZnkpIGdfcHRyX2FycmF5X3VucmVmIjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChldHlwZS0+aXNfY29udGFpbmVyKCkgfHwgZXR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICByZXR1cm4gIihHRGVzdHJveU5vdGlmeSkgZ19wdHJfYXJyYXlfdW5yZWYiOworICAgICAgOworICAgIH0gZWxzZSBpZiAoZXR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmV0dXJuICIoR0Rlc3Ryb3lOb3RpZnkpIGdfYXJyYXlfdW5yZWYiOworICAgIH0KKyAgICBwcmludGYoIlR5cGUgbm90IGV4cGVjdGVkIGluc2lkZSB0aGUgYXJyYXk6ICVzXG4iLCBldHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICB0aHJvdyAiVHlwZSBub3QgZXhwZWN0ZWQgaW5zaWRlIGFycmF5IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIGdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUoKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKSk7CisgIH0KKyAgcHJpbnRmKCJUeXBlIG5vdCBleHBlY3RlZDogJXNcbiIsIHR0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB0aHJvdyAiVHlwZSBub3QgZXhwZWN0ZWQiOworfQorCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXNoX2Z1bmNfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHR0eXBlID09IE5VTEwpCisgICAgcmV0dXJuICJOVUxMIjsKKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGhhc2ggdHlwZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gInRocmlmdF9ib29sZWFuX2hhc2giOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gInRocmlmdF9pbnQ4X2hhc2giOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJ0aHJpZnRfaW50MTZfaGFzaCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gImdfaW50X2hhc2giOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJnX2ludDY0X2hhc2giOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJnX2RvdWJsZV9oYXNoIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiZ19zdHJfaGFzaCI7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gaGFzaCB0YWJsZSBpbmZvIGZvciB0eXBlIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiZ19kaXJlY3RfaGFzaCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgIHJldHVybiAiZ19kaXJlY3RfaGFzaCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJldHVybiBnZW5lcmF0ZV9oYXNoX2Z1bmNfZnJvbV90eXBlKCgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCkpOworICB9CisgIHByaW50ZigiVHlwZSBub3QgZXhwZWN0ZWQ6ICVzXG4iLCB0dHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgdGhyb3cgIlR5cGUgbm90IGV4cGVjdGVkIjsKK30KKworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY21wX2Z1bmNfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHR0eXBlID09IE5VTEwpCisgICAgcmV0dXJuICJOVUxMIjsKKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGhhc2ggdHlwZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gInRocmlmdF9ib29sZWFuX2VxdWFsIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJ0aHJpZnRfaW50OF9lcXVhbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gInRocmlmdF9pbnQxNl9lcXVhbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gImdfaW50X2VxdWFsIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiZ19pbnQ2NF9lcXVhbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gImdfZG91YmxlX2VxdWFsIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiZ19zdHJfZXF1YWwiOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGhhc2ggdGFibGUgaW5mbyBmb3IgdHlwZSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gImdfZGlyZWN0X2VxdWFsIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgcmV0dXJuICJnX2RpcmVjdF9lcXVhbCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJldHVybiBnZW5lcmF0ZV9jbXBfZnVuY19mcm9tX3R5cGUoKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKSk7CisgIH0KKyAgcHJpbnRmKCJUeXBlIG5vdCBleHBlY3RlZDogJXNcbiIsIHR0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB0aHJvdyAiVHlwZSBub3QgZXhwZWN0ZWQiOworfQorCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUodF90eXBlKiBrZXksIHRfdHlwZSogdmFsdWUpIHsKKyAgc3RyaW5nIGhhc2hfZnVuYyA9IGdlbmVyYXRlX2hhc2hfZnVuY19mcm9tX3R5cGUoa2V5KTsKKyAgc3RyaW5nIGNtcF9mdW5jID0gZ2VuZXJhdGVfY21wX2Z1bmNfZnJvbV90eXBlKGtleSk7CisgIHN0cmluZyBrZXlfZnJlZV9mdW5jID0gZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZShrZXkpOworICBzdHJpbmcgdmFsdWVfZnJlZV9mdW5jID0gZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZSh2YWx1ZSk7CisKKyAgcmV0dXJuICJnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKCIgKyBoYXNoX2Z1bmMgKyAiLCAiICsgY21wX2Z1bmMgKyAiLCAiICsga2V5X2ZyZWVfZnVuYyArICIsICIKKyAgICAgICAgICsgdmFsdWVfZnJlZV9mdW5jICsgIik7IjsKK30KKworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV3X2FycmF5X2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgIGlmICh0dHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIik7CisgIH0gZWxzZSBpZiAoaXNfbnVtZXJpYyh0dHlwZSkpIHsKKyAgICByZXR1cm4gImdfYXJyYXlfbmV3ICgwLCAxLCBzaXplb2YgKCIgKyBiYXNlX3R5cGVfbmFtZSh0dHlwZSkgKyAiKSk7IjsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgZnJlZV9mdW5jID0gZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZSh0dHlwZSk7CisgICAgcmV0dXJuICJnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKCIgKyBmcmVlX2Z1bmMgKyAiKTsiOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFVUSUxJVFkgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVXBwZXIgY2FzZSBhIHN0cmluZy4gIFdyYXBzIGJvb3N0J3Mgc3RyaW5nIHV0aWxpdHkuCisgKi8KK3N0cmluZyB0b191cHBlcl9jYXNlKHN0cmluZyBuYW1lKSB7CisgIHN0cmluZyBzKG5hbWUpOworICBzdGQ6OnRyYW5zZm9ybShzLmJlZ2luKCksIHMuZW5kKCksIHMuYmVnaW4oKSwgOjp0b3VwcGVyKTsKKyAgcmV0dXJuIHM7CisgIC8vICByZXR1cm4gYm9vc3Q6OnRvX3VwcGVyX2NvcHkgKG5hbWUpOworfQorCisvKioKKyAqIExvd2VyIGNhc2UgYSBzdHJpbmcuICBXcmFwcyBib29zdCdzIHN0cmluZyB1dGlsaXR5LgorICovCitzdHJpbmcgdG9fbG93ZXJfY2FzZShzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgcyhuYW1lKTsKKyAgc3RkOjp0cmFuc2Zvcm0ocy5iZWdpbigpLCBzLmVuZCgpLCBzLmJlZ2luKCksIDo6dG9sb3dlcik7CisgIHJldHVybiBzOworICAvLyAgcmV0dXJuIGJvb3N0Ojp0b19sb3dlcl9jb3B5IChuYW1lKTsKK30KKworLyoqCisgKiBNYWtlcyBhIHN0cmluZyBmcmllbmRseSB0byBDIGNvZGUgc3RhbmRhcmRzIGJ5IGxvd2VyY2FzaW5nIGFuZCBhZGRpbmcKKyAqIHVuZGVyc2NvcmVzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3Rlci4gIEZvciBleGFtcGxlOgorICoKKyAqIElucHV0OiAiWm9tZ0NhbWVsQ2FzZSIKKyAqIE91dHB1dDogInpvbWdfY2FtZWxfY2FzZSIKKyAqLworc3RyaW5nIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgcmV0OworICBjb25zdCBjaGFyKiB0bXAgPSBuYW1lLmNfc3RyKCk7CisgIGludCBwb3MgPSAwOworCisgIC8qIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXNuJ3QgdW5kZXJzY29yZWQgaWYgdXBwZXJjYXNlLCBqdXN0IGxvd2VyY2FzZWQgKi8KKyAgcmV0ICs9IHRvbG93ZXIodG1wW3Bvc10pOworICBwb3MrKzsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IHBvczsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykgeworICAgIGNoYXIgbGMgPSB0b2xvd2VyKHRtcFtpXSk7CisgICAgaWYgKGxjICE9IHRtcFtpXSkgeworICAgICAgcmV0ICs9ICdfJzsKKyAgICB9CisgICAgcmV0ICs9IGxjOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBQZXJmb3JtcyB0aGUgcmV2ZXJzZSBvcGVyYXRpb24gb2YgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzOiBUaGUgZmlyc3QKKyAqIGNoYXJhY3RlciBvZiB0aGUgc3RyaW5nIGlzIG1hZGUgdXBwZXJjYXNlLCBhbG9uZyB3aXRoIGVhY2ggY2hhcmFjdGVyIHRoYXQKKyAqIGZvbGxvd3MgYW4gdW5kZXJzY29yZSAod2hpY2ggaXMgcmVtb3ZlZCkuIFVzZWZ1bCBmb3IgY29udmVydGluZyBUaHJpZnQKKyAqIHNlcnZpY2UtbWV0aG9kIG5hbWVzIGludG8gR09iamVjdC1zdHlsZSBjbGFzcyBuYW1lcy4KKyAqCisgKiBJbnB1dDogInpvbWdfY2FtZWxfY2FzZSIKKyAqIE91dHB1dDogIlpvbWdDYW1lbENhc2UiCisgKi8KK3N0cmluZyB1bmRlcnNjb3Jlc190b19pbml0aWFsX2NhcHMoc3RyaW5nIG5hbWUpIHsKKyAgc3RyaW5nIHJldDsKKyAgY29uc3QgY2hhciogdG1wID0gbmFtZS5jX3N0cigpOworICBib29sIHVwcGVyY2FzZV9uZXh0ID0gdHJ1ZTsKKworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykgeworICAgIGNoYXIgYyA9IHRtcFtpXTsKKyAgICBpZiAoYyA9PSAnXycpIHsKKyAgICAgIHVwcGVyY2FzZV9uZXh0ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHVwcGVyY2FzZV9uZXh0KSB7CisgICAgICAgIHJldCArPSB0b3VwcGVyKGMpOworICAgICAgICB1cHBlcmNhc2VfbmV4dCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ICs9IGM7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogcmVnaXN0ZXIgdGhpcyBnZW5lcmF0b3Igd2l0aCB0aGUgbWFpbiBwcm9ncmFtICovCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGNfZ2xpYiwgIkMsIHVzaW5nIEdMaWIiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY2xfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jbF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI4ZDBkOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY2xfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsNTU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LSBQYXRyaWNrIENvbGxpc29uIDxwYXRyaWNrQGNvbGxpc29uLmllPgorICogQ29weXJpZ2h0IChjKSAyMDA2LSBGYWNlYm9vaworICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Ym9vc3QvdG9rZW5pemVyLmhwcD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworCisvKioKKyAqIENvbW1vbiBMaXNwIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqIEBhdXRob3IgUGF0cmljayBDb2xsaXNvbiA8cGF0cmlja0Bjb2xsaXNvbi5pZT4KKyAqLworY2xhc3MgdF9jbF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIHRfY2xfZ2VuZXJhdG9yKAorICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQorICB7CisgICAgbm9fYXNkID0gZmFsc2U7CisgICAgc3lzdGVtX3ByZWZpeCA9ICJ0aHJpZnQtZ2VuLSI7CisKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgZm9yKGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vX2FzZCIpID09IDApIHsKKyAgICAgICAgbm9fYXNkID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgic3lzX3ByZWYiKSA9PSAwKSB7CisJc3lzdGVtX3ByZWZpeCA9IGl0ZXItPnNlY29uZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBjbDoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tY2wiOworICAgIGNvcHlfb3B0aW9uc18gPSBvcHRpb25fc3RyaW5nOworICB9CisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAgICAgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICAgICAodF9lbnVtKiAgICAgdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0ICAgICAgICh0X2NvbnN0KiAgICB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgICAgICh0X3N0cnVjdCogICB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbiAgICAodF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICAgICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX2NsX3N0cnVjdCAoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY2xfc3RydWN0X2ludGVybmFsIChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9leGNlcHRpb25fc2lnKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiBmKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIHN0ZDo6c3RyaW5nIGNsX2F1dG9nZW5fY29tbWVudCgpOworICB2b2lkIGFzZGZfZGVmKHN0ZDo6b3N0cmVhbSAmb3V0KTsKKyAgdm9pZCBwYWNrYWdlX2RlZihzdGQ6Om9zdHJlYW0gJm91dCk7CisgIHZvaWQgcGFja2FnZV9pbihzdGQ6Om9zdHJlYW0gJm91dCk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlZF9wYWNrYWdlKCk7CisgIHN0ZDo6c3RyaW5nIHByZWZpeChzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9vZih0X3Byb2dyYW0qIHByb2dyYW0pOworICBzdGQ6OnN0cmluZyBwYWNrYWdlKCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOworCisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZXNwZWMgKHRfdHlwZSAqdCk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKworICBzdGQ6OnN0cmluZyBjbF9kb2NzdHJpbmcoc3RkOjpzdHJpbmcgcmF3KTsKKworIHByaXZhdGU6CisKKyAgaW50IHRlbXBvcmFyeV92YXI7CisgIC8qKgorICAgKiBJc29sYXRlIHRoZSB2YXJpYWJsZSBkZWZpbml0aW9ucywgYXMgdGhleSBjYW4gcmVxdWlyZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMKKyAgICovCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9hc2RfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdmFyc187CisKKyAgc3RkOjpzdHJpbmcgY29weV9vcHRpb25zXzsKKworICBib29sIG5vX2FzZDsKKyAgc3RkOjpzdHJpbmcgc3lzdGVtX3ByZWZpeDsKK307CisKKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisgIHN0cmluZyBwcm9ncmFtX2RpciA9IGdldF9vdXRfZGlyKCkgKyAiLyIgKyBwcm9ncmFtX25hbWVfOworICBNS0RJUihwcm9ncmFtX2Rpci5jX3N0cigpKTsKKworICB0ZW1wb3JhcnlfdmFyID0gMDsKKworICBzdHJpbmcgZl90eXBlc19uYW1lID0gcHJvZ3JhbV9kaXIgKyAiLyIgKyBwcm9ncmFtX25hbWVfICsgIi10eXBlcy5saXNwIjsKKyAgc3RyaW5nIGZfdmFyc19uYW1lID0gcHJvZ3JhbV9kaXIgKyAiLyIgKyBwcm9ncmFtX25hbWVfICsgIi12YXJzLmxpc3AiOworCisgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOworICBmX3R5cGVzXyA8PCBjbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworICBmX3ZhcnNfLm9wZW4oZl92YXJzX25hbWUuY19zdHIoKSk7CisgIGZfdmFyc18gPDwgY2xfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKworICBwYWNrYWdlX2RlZihmX3R5cGVzXyk7CisgIHBhY2thZ2VfaW4oZl90eXBlc18pOworICBwYWNrYWdlX2luKGZfdmFyc18pOworCisgIGlmICghbm9fYXNkKSB7CisgICAgc3RyaW5nIGZfYXNkX25hbWUgPSBwcm9ncmFtX2RpciArICIvIiArIHN5c3RlbV9wcmVmaXggKyBwcm9ncmFtX25hbWVfICsgIi5hc2QiOworICAgIGZfYXNkXy5vcGVuKGZfYXNkX25hbWUuY19zdHIoKSk7CisgICAgZl9hc2RfIDw8IGNsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisgICAgYXNkZl9kZWYoZl9hc2RfKTsKKyAgfQorfQorCisvKioKKyAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KKyAqLworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgcmVzdWx0ICs9ICI6ZGVwZW5kcy1vbiAoOnRocmlmdCI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICByZXN1bHQgKz0gIiA6IiArIHN5c3RlbV9wcmVmaXggKyB1bmRlcnNjb3JlKGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpKTsKKyAgfQorICByZXN1bHQgKz0gIilcbiI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6cGFja2FnZV9vZih0X3Byb2dyYW0qIHByb2dyYW0pIHsKKyAgc3RyaW5nIHByZWZpeCA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImNsIik7CisgIHJldHVybiBwcmVmaXguZW1wdHkoKSA/ICJ0aHJpZnQtZ2VuZXJhdGVkIiA6IHByZWZpeDsKK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjpwYWNrYWdlKCkgeworICByZXR1cm4gcGFja2FnZV9vZihwcm9ncmFtXyk7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6cHJlZml4KHN0cmluZyBzeW1ib2wpIHsKKyAgcmV0dXJuICJcIiIgKyBzeW1ib2wgKyAiXCIiOworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OmNsX2F1dG9nZW5fY29tbWVudCgpIHsKKyAgcmV0dXJuCisgICAgc3RkOjpzdHJpbmcoIjs7OyAiKSArICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdFxuIiArCisgICAgIjs7OyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsKKyAgICAiOzs7IG9wdGlvbnMgc3RyaW5nOiAiICsgY29weV9vcHRpb25zXyArICJcbiI7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6Y2xfZG9jc3RyaW5nKHN0cmluZyByYXcpIHsKKyAgcmVwbGFjZShyYXcuYmVnaW4oKSwgcmF3LmVuZCgpLCAnIicsICdcJycpOworICByZXR1cm4gcmF3OworfQorCisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgZl9hc2RfLmNsb3NlKCk7CisgIGZfdHlwZXNfLmNsb3NlKCk7CisgIGZfdmFyc18uY2xvc2UoKTsKK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZWRfcGFja2FnZSgpIHsKKyAgcmV0dXJuIHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjcHAiKTsKK30KKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6YXNkZl9kZWYoc3RkOjpvc3RyZWFtICZvdXQpIHsKKyAgb3V0IDw8ICIoYXNkZjpkZWZzeXN0ZW0gIzoiIDw8IHN5c3RlbV9wcmVmaXggPDwgcHJvZ3JhbV9uYW1lXyA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHJlbmRlcl9pbmNsdWRlcygpCisgICAgICA8PCBpbmRlbnQoKSA8PCAiOnNlcmlhbCB0IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiOmNvbXBvbmVudHMgKCIKKyAgICAgIDw8ICIoOmZpbGUgXCIiIDw8IHByb2dyYW1fbmFtZV8gPDwgIi10eXBlc1wiKSAiCisgICAgICA8PCAiKDpmaWxlIFwiIiA8PCBwcm9ncmFtX25hbWVfIDw8ICItdmFyc1wiKSkpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCisvKioqCisgKiBHZW5lcmF0ZSBhIHBhY2thZ2UgZGVmaW5pdGlvbi4gQWRkIHVzZSByZWZlcmVuY2VzIGVxdWl2YWxlbnQgdG8gdGhlIGlkbCBmaWxlJ3MgaW5jbHVkZSBzdGF0ZW1lbnRzLgorICovCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpwYWNrYWdlX2RlZihzdGQ6Om9zdHJlYW0gJm91dCkgeworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworCisgIG91dCA8PCAiKHRocmlmdDpkZWYtcGFja2FnZSA6IiA8PCBwYWNrYWdlKCk7CisgIGlmICggaW5jbHVkZXMuc2l6ZSgpID4gMCApIHsKKyAgICBvdXQgPDwgIiA6dXNlICgiOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIG91dCA8PCAiIDoiIDw8IGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBvdXQgPDwgIikiOworICB9CisgIG91dCA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpwYWNrYWdlX2luKHN0ZDo6b3N0cmVhbSAmb3V0KSB7CisgIG91dCA8PCAiKGNsOmluLXBhY2thZ2UgOiIgPDwgcGFja2FnZSgpIDw8ICIpIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBDb21tb24gTGlzcCwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBmX3R5cGVzXyA8PCAiKHRocmlmdDpkZWYtZW51bSAiIDw8IHByZWZpeCh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGludCB2YWx1ZSA9IC0xOworCisgIGluZGVudF91cCgpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiKCI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworCisgICAgaWYoY19pdGVyICE9IGNvbnN0YW50cy5iZWdpbigpKSBmX3R5cGVzXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIjsKKworICAgIGZfdHlwZXNfIDw8ICIoXCIiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIgLiAiIDw8IHZhbHVlIDw8ICIpIjsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzXyA8PCAiKSkiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgZl92YXJzXyA8PCAiKHRocmlmdDpkZWYtY29uc3RhbnQgIiA8PCBwcmVmaXgobmFtZSkgPDwgIiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgIikiCisgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgIlwiIiA8PCB2YWx1ZS0+Z2V0X3N0cmluZygpIDw8ICJcIiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0IiA6ICJuaWwiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8ICh0eXBlLT5pc19zdHJ1Y3QoKSA/ICIobWFrZS1pbnN0YW5jZSAnIiA6ICIobWFrZS1leGNlcHRpb24gJyIpIDw8CisgICAgICAgICAgIGxvd2VyY2FzZSh0eXBlLT5nZXRfbmFtZSgpKSA8PCAiICIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICI6IiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiAiIDw8CisgICAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIpIjsKKworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICAvLyBlbWl0IGFuIGhhc2ggZm9ybSB3aXRoIGJvdGgga2V5cyBhbmQgdmFsdWVzIHRvIGJlIGV2YWx1YXRlZAorICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBvdXQgPDwgIih0aHJpZnQ6bWFwICI7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiKGNsOmNvbnMgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpIDw8ICIgIgorICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpIDw8ICIpIjsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIikiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIG91dCA8PCAiKHRocmlmdDpzZXQiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiKHRocmlmdDpsaXN0IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9jbF9zdHJ1Y3QoZl90eXBlc18sIHRzdHJ1Y3QsIGZhbHNlKTsKK30KKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9jbF9zdHJ1Y3QoZl90eXBlc18sIHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NsX3N0cnVjdF9pbnRlcm5hbChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgICh2b2lkKWlzX2V4Y2VwdGlvbjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBvdXQgPDwgIigiOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgdF90eXBlKiB0eXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworCisgICAgaWYgKG1faXRlciAhPSBtZW1iZXJzLmJlZ2luKCkpIHsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIjsKKyAgICB9CisgICAgb3V0IDw8ICIoIiA8PCBwcmVmaXgoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiICIgPDwKKyAgICAgICAgKCAoTlVMTCAhPSB2YWx1ZSkgPyByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDogIm5pbCIgKSA8PAorICAgICAgICAiIDppZCAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpOworICAgIGlmICggdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgInN0cmluZyIgPT0gdHlwZXNwZWModHlwZSkgKQorICAgICAgaWYgKCAoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkgKQorICAgICAgICBvdXQgPDwgIiA6dHlwZSBiaW5hcnkiOworICAgICAgZWxzZQorICAgICAgICBvdXQgPDwgIiA6dHlwZSBzdHJpbmciOworICAgIGVsc2UKKyAgICAgIG91dCA8PCAiIDp0eXBlICIgPDwgdHlwZXNwZWModHlwZSk7CisgICAgaWYgKCAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMICkgeworICAgICAgb3V0IDw8ICIgOm9wdGlvbmFsIHQiOworICAgIH0KKyAgICBpZiAoICgqbV9pdGVyKS0+aGFzX2RvYygpKSB7CisgICAgICBvdXQgPDwgIiA6ZG9jdW1lbnRhdGlvbiBcIiIgPDwgY2xfZG9jc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X2RvYygpKSA8PCAiXCIiOworICAgIH0KKyAgICBvdXQgPDwiKSI7CisgIH0KKworICBvdXQgPDwgIikiOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jbF9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbiA9IGZhbHNlKSB7CisgIHN0ZDo6c3RyaW5nIG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIG91dCA8PCAoaXNfZXhjZXB0aW9uID8gIih0aHJpZnQ6ZGVmLWV4Y2VwdGlvbiAiIDogIih0aHJpZnQ6ZGVmLXN0cnVjdCAiKSA8PAorICAgICAgcHJlZml4KG5hbWUpIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAoIHRzdHJ1Y3QtPmhhc19kb2MoKSApIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgOworICAgIG91dCA8PCAiXCIiIDw8IGNsX2RvY3N0cmluZyh0c3RydWN0LT5nZXRfZG9jKCkpIDw8ICJcIiIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgaW5kZW50KCkgOworICBnZW5lcmF0ZV9jbF9zdHJ1Y3RfaW50ZXJuYWwob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgIikiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXhjZXB0aW9uX3NpZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogZikgeworICBnZW5lcmF0ZV9jbF9zdHJ1Y3RfaW50ZXJuYWwob3V0LCBmLT5nZXRfeGNlcHRpb25zKCksIHRydWUpOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50OworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHNfY2xpZW50ID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgfQorCisgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kc19jbGllbnQuZW1wdHkoKSA/ICJuaWwiIDogcHJlZml4KGV4dGVuZHNfY2xpZW50KTsKKworICBmX3R5cGVzXyA8PCAiKHRocmlmdDpkZWYtc2VydmljZSAiIDw8IHByZWZpeChzZXJ2aWNlX25hbWVfKSA8PCAiICIKKyAgICAgICAgICAgPDwgZXh0ZW5kc19jbGllbnQ7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKCB0c2VydmljZS0+aGFzX2RvYygpKSB7CisgICAgICBmX3R5cGVzXyA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiKDpkb2N1bWVudGF0aW9uIFwiIiA8PCBjbF9kb2NzdHJpbmcodHNlcnZpY2UtPmdldF9kb2MoKSkgPDwgIlwiKSI7CisgICAgfQorCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9mdW5jdGlvbiogZnVuY3Rpb24gPSAqZl9pdGVyOworICAgIHN0cmluZyBmbmFtZSA9IGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoZnVuY3Rpb24pOworICAgIHRfc3RydWN0KiBleGNlcHRpb25zID0gZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4bWVtYmVycyA9IGV4Y2VwdGlvbnMtPmdldF9tZW1iZXJzKCk7CisKKyAgICBmX3R5cGVzXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIoOm1ldGhvZCAiIDw8IHByZWZpeChmbmFtZSk7CisgICAgZl90eXBlc18gPDwgIiAoIiA8PCBzaWduYXR1cmUgPDwgIiAiICA8PCB0eXBlc3BlYygoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpIDw8ICIpIjsKKyAgICBpZiAoeG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgICAgZl90eXBlc18gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiIDpleGNlcHRpb25zICIgOworICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uX3NpZyhmX3R5cGVzXywgZnVuY3Rpb24pOworICAgIH0KKyAgICBpZiAoICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgKSB7CisgICAgICBmX3R5cGVzXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgOm9uZXdheSB0IjsKKyAgICB9CisgICAgaWYgKCAoKmZfaXRlciktPmhhc19kb2MoKSApIHsKKyAgICAgIGZfdHlwZXNfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiA6ZG9jdW1lbnRhdGlvbiBcIiIKKyAgICAgICAgICAgICAgIDw8IGNsX2RvY3N0cmluZygoKmZfaXRlciktPmdldF9kb2MoKSkgPDwgIlwiIjsKKyAgfQorICAgIGZfdHlwZXNfIDw8ICIpIjsKKyAgfQorCisgIGZfdHlwZXNfIDw8ICIpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjp0eXBlc3BlYyh0X3R5cGUgKnQpIHsKKyAgdCA9IGdldF90cnVlX3R5cGUodCk7CisKKyAgaWYgKHQgLT4gaXNfYmluYXJ5KCkpeworICAgIHJldHVybiAiYmluYXJ5IjsKKyAgfSBlbHNlIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiB0eXBlX25hbWUodCk7CisgIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCAqbSA9ICh0X21hcCopIHQ7CisgICAgcmV0dXJuICIodGhyaWZ0Om1hcCAiICsgdHlwZXNwZWMobS0+Z2V0X2tleV90eXBlKCkpICsgIiAiICsKKyAgICAgIHR5cGVzcGVjKG0tPmdldF92YWxfdHlwZSgpKSArICIpIjsKKyAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICIoc3RydWN0ICIgKyBwcmVmaXgodHlwZV9uYW1lKHQpKSArICIpIjsKKyAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIih0aHJpZnQ6bGlzdCAiICsgdHlwZXNwZWMoKCh0X2xpc3QqKSB0KS0+Z2V0X2VsZW1fdHlwZSgpKSArICIpIjsKKyAgfSBlbHNlIGlmICh0LT5pc19zZXQoKSkgeworICAgIHJldHVybiAiKHRocmlmdDpzZXQgIiArIHR5cGVzcGVjKCgodF9zZXQqKSB0KS0+Z2V0X2VsZW1fdHlwZSgpKSArICIpIjsKKyAgfSBlbHNlIGlmICh0LT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIihlbnVtIFwiIiArICgodF9lbnVtKikgdCktPmdldF9uYW1lKCkgKyAiXCIpIjsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiU29ycnksIEkgZG9uJ3Qga25vdyBob3cgdG8gZ2VuZXJhdGUgdGhpczogIiArIHR5cGVfbmFtZSh0KTsKKyAgfQorfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgcmV0dXJuIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZ3N0cmVhbSByZXM7CisgIHJlcyA8PCAiKCI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlcyA8PCAiICI7CisgICAgfQorICAgIHJlcyA8PCAiKCIgKyBwcmVmaXgoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiICIgPDwKKyAgICAgIHR5cGVzcGVjKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8CisgICAgICAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAgIikiOworCisKKyAgfQorICByZXMgPDwgIikiOworICByZXR1cm4gcmVzLnN0cigpOworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBwcmVmaXggPSAiIjsKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKQorICAgIHByZWZpeCA9IHBhY2thZ2Vfb2YocHJvZ3JhbSkgPT0gcGFja2FnZSgpID8gIiIgOiBwYWNrYWdlX29mKHByb2dyYW0pICsgIjoiOworCisgIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7CisKKyAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkKKyAgICBuYW1lID0gbG93ZXJjYXNlKHR0eXBlLT5nZXRfbmFtZSgpKTsKKworICByZXR1cm4gcHJlZml4ICsgbmFtZTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBjbCwKKyAgICAiQ29tbW9uIExpc3AiLAorICAgICIgICAgbm9fYXNkOiAgICAgICAgICBEbyBub3QgZGVmaW5lIEFTREYgc3lzdGVtcyBmb3IgZWFjaCBnZW5lcmF0ZWQgVGhyaWZ0IHByb2dyYW0uXG4iCisgICAgIiAgICBzeXNfcHJlZj0gICAgICAgIFRoZSBwcmVmaXggdG8gZ2l2ZSBBU0RGIHN5c3RlbSBuYW1lcy4gRGVmYXVsdDogdGhyaWZ0LWdlbi1cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY29jb2FfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNjQ0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDMzMDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIE9iamVjdGl2ZS1DIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqIG1vc3RseSBjb3B5L3Bhc3RpbmcvdHdlYWtpbmcgZnJvbSBtY3NsZWUncyB3b3JrLgorICovCitjbGFzcyB0X2NvY29hX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2NvY29hX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgbG9nX3VuZXhwZWN0ZWRfID0gZmFsc2U7CisgICAgdmFsaWRhdGVfcmVxdWlyZWRfID0gZmFsc2U7CisgICAgYXN5bmNfY2xpZW50c18gPSBmYWxzZTsKKyAgICBwcm9taXNlX2tpdF8gPSBmYWxzZTsKKyAgICBkZWJ1Z19kZXNjcmlwdGlvbnNfID0gZmFsc2U7CisgICAgcG9kc18gPSBmYWxzZTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJsb2dfdW5leHBlY3RlZCIpID09IDApIHsKKyAgICAgICAgbG9nX3VuZXhwZWN0ZWRfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidmFsaWRhdGVfcmVxdWlyZWQiKSA9PSAwKSB7CisgICAgICAgIHZhbGlkYXRlX3JlcXVpcmVkXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImFzeW5jX2NsaWVudHMiKSA9PSAwKSB7CisgICAgICAgIGFzeW5jX2NsaWVudHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicHJvbWlzZV9raXQiKSA9PSAwKSB7CisgICAgICAgIHByb21pc2Vfa2l0XyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImRlYnVnX2Rlc2NyaXB0aW9ucyIpID09IDApIHsKKyAgICAgICAgZGVidWdfZGVzY3JpcHRpb25zXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInBvZHMiKSA9PSAwKSB7CisgICAgICAgIHBvZHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBjb2NvYToiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tY29jb2EiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYm94X2l0ID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0aWFsaXplcl9zaWduYXR1cmUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdF93aXRoX2NvZGVyX21ldGhvZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9lbmNvZGVfd2l0aF9jb2Rlcl9tZXRob2Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2NvcHlfbWV0aG9kKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaGFzaF9tZXRob2Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2lzX2VxdWFsX21ldGhvZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfaW1wbGVtZW50YXRpb25zKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF92YWxpZGF0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZGVzY3JpcHRpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRfc2VydmljZSAqdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X3NlcnZpY2UgKnRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9wcm90b2NvbChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9hc3luY19wcm90b2NvbChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbnRlcmZhY2Uoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2FzeW5jX2ludGVyZmFjZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzX3Byb3RvY29sKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ludm9jYXRpb24ob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZhaWx1cmVCbG9ja05hbWUpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3JlY3ZfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNfcHJvdG9jb2wpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbnRlcmZhY2Uoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBmaWVsZE5hbWUpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIGZpZWxkTmFtZSA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBsaXN0TmFtZSk7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIGNvY29hX3ByZWZpeCgpOworICBzdGQ6OnN0cmluZyBjb2NvYV9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIGNvY29hX3RocmlmdF9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGNsYXNzX3JlZiA9IGZhbHNlLCBib29sIG5lZWRzX211dGFibGUgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGVsZW1lbnRfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX3Byb3BlcnR5KHRfZmllbGQqIHRmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfcHJvcGVydHlfaXNzZXQodF9maWVsZCogdGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9wcm9wZXJ0eV91bnNldCh0X2ZpZWxkKiB0ZmllbGQpOworICBzdGQ6OnN0cmluZyBpbnZhbGlkX3JldHVybl9zdGF0ZW1lbnQodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbmNsdWRlX2Vycm9yKTsKKyAgc3RkOjpzdHJpbmcgYXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbmNsdWRlX2Vycm9yKTsKKyAgc3RkOjpzdHJpbmcgcHJvbWlzZV9mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByb3RvY29sX25hbWUsIGJvb2wgaW5jbHVkZV9lcnJvcik7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZm9ybWF0X3N0cmluZ19mb3JfdHlwZSh0X3R5cGUqIHR5cGUpOworICBzdGQ6OnN0cmluZyBmb3JtYXRfY2FzdF9mb3JfdHlwZSh0X3R5cGUqIHR5cGUpOworICBzdGQ6OnN0cmluZyBjYWxsX2ZpZWxkX3NldHRlcih0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIGZpZWxkTmFtZSk7CisgIHN0ZDo6c3RyaW5nIGJveCh0X3R5cGUgKnR0eXBlLCBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKTsKKyAgc3RkOjpzdHJpbmcgdW5ib3godF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdldHRlcl9uYW1lKHN0cmluZyBmaWVsZF9uYW1lKTsKKyAgc3RkOjpzdHJpbmcgc2V0dGVyX25hbWUoc3RyaW5nIGZpZWxkX25hbWUpOworCisgIGJvb2wgdHlwZV9jYW5fYmVfY29weSh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgICAKKyAgICByZXR1cm4gdHR5cGUtPmlzX3N0cmluZygpOworICB9CisgIAorICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgeworICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisKKyAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKQorICAgICAgICAgICB8fCB0dHlwZS0+aXNfc3RyaW5nKCk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgY29jb2FfcHJlZml4XzsKKyAgc3RkOjpzdHJpbmcgY29uc3RhbnRzX2RlY2xhcmF0aW9uc187CisgIGludCBlcnJvcl9jb25zdGFudF87CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaGVhZGVyXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2ltcGxfOworCisgIGJvb2wgbG9nX3VuZXhwZWN0ZWRfOworICBib29sIHZhbGlkYXRlX3JlcXVpcmVkXzsKKyAgYm9vbCBhc3luY19jbGllbnRzXzsKKyAgYm9vbCBwcm9taXNlX2tpdF87CisgIGJvb2wgZGVidWdfZGVzY3JpcHRpb25zXzsKKyAgYm9vbCBwb2RzXzsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKyAgY29jb2FfcHJlZml4XyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjb2NvYSIpOworCisgIC8vIHdlIGhhdmUgYSAuaCBoZWFkZXIgZmlsZS4uLgorICBzdHJpbmcgZl9oZWFkZXJfbmFtZSA9IGNvY29hX3ByZWZpeF8gKyBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pICsgIi5oIjsKKyAgc3RyaW5nIGZfaGVhZGVyX2Z1bGxuYW1lID0gZ2V0X291dF9kaXIoKSArIGZfaGVhZGVyX25hbWU7CisgIGZfaGVhZGVyXy5vcGVuKGZfaGVhZGVyX2Z1bGxuYW1lLmNfc3RyKCkpOworCisgIGZfaGVhZGVyXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworCisgIGZfaGVhZGVyXyA8PCBjb2NvYV9pbXBvcnRzKCkgPDwgY29jb2FfdGhyaWZ0X2ltcG9ydHMoKTsKKworICAvLyAuLi5hbmQgYSAubSBpbXBsZW1lbnRhdGlvbiBmaWxlCisgIHN0cmluZyBmX2ltcGxfbmFtZSA9IGNvY29hX3ByZWZpeF8gKyBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pICsgIi5tIjsKKyAgc3RyaW5nIGZfaW1wbF9mdWxsbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBmX2ltcGxfbmFtZTsKKyAgZl9pbXBsXy5vcGVuKGZfaW1wbF9mdWxsbmFtZS5jX3N0cigpKTsKKworICBmX2ltcGxfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgZl9pbXBsXyA8PCBjb2NvYV9pbXBvcnRzKCkgPDwgY29jb2FfdGhyaWZ0X2ltcG9ydHMoKSA8PCAiI2ltcG9ydCBcIiIgPDwgZl9oZWFkZXJfbmFtZSA8PCAiXCIiCisgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgIGVycm9yX2NvbnN0YW50XyA9IDYwMDAwOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBDb2NvYSBpbXBvcnRzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgZm9yIENvY29hIGxpYnJhcmllcworICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmNvY29hX2ltcG9ydHMoKSB7CisgIHJldHVybiBzdHJpbmcoKSArICIjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD5cbiIgKyAiXG4iOworfQorCisvKioKKyAqIFByaW50cyB0aHJpZnQgcnVudGltZSBpbXBvcnRzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aHJpZnQgcnVudGltZQorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmNvY29hX3RocmlmdF9pbXBvcnRzKCkgeworCisgIHZlY3RvcjxzdHJpbmc+IGluY2x1ZGVzX2xpc3Q7CisgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJUUHJvdG9jb2wuaCIpOworICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiVFByb3RvY29sRmFjdG9yeS5oIik7CisgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJUQXBwbGljYXRpb25FcnJvci5oIik7CisgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJUUHJvdG9jb2xFcnJvci5oIik7CisgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJUUHJvdG9jb2xVdGlsLmgiKTsKKyAgaW5jbHVkZXNfbGlzdC5wdXNoX2JhY2soIlRQcm9jZXNzb3IuaCIpOworICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiVEJhc2UuaCIpOworICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiVEFzeW5jVHJhbnNwb3J0LmgiKTsKKyAgaW5jbHVkZXNfbGlzdC5wdXNoX2JhY2soIlRCYXNlQ2xpZW50LmgiKTsKKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gaW5jbHVkZXM7CisKKyAgdmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGlfaXRlcjsKKyAgZm9yIChpX2l0ZXI9aW5jbHVkZXNfbGlzdC5iZWdpbigpOyBpX2l0ZXIhPWluY2x1ZGVzX2xpc3QuZW5kKCk7ICsraV9pdGVyKSB7CisgICAgaW5jbHVkZXMgPDwgIiNpbXBvcnQgIjsKKyAgICBpZiAocG9kc18pIHsKKyAgICAgIGluY2x1ZGVzIDw8ICI8VGhyaWZ0LyIgPDwgKmlfaXRlciA8PCAiPiI7CisgICAgfSBlbHNlIHsKKyAgICAgIGluY2x1ZGVzIDw8ICJcIiIgPDwgKmlfaXRlciA8PCAiXCIiOworICAgIH0KKyAgICBpbmNsdWRlcyA8PCBlbmRsOworICB9CisKKyAgaW5jbHVkZXMgPDwgZW5kbDsKKworICBpZiAocHJvbWlzZV9raXRfKSB7CisgICAgaW5jbHVkZXMgPDwgIiNpbXBvcnQgIjsKKyAgICBpZiAocG9kc18pIHsKKyAgICAgIGluY2x1ZGVzIDw8ICI8UHJvbWlzZUtpdC9Qcm9taXNlS2l0Lmg+IjsKKyAgICB9IGVsc2UgeworICAgICAgaW5jbHVkZXMgPDwgIlwiUHJvbWlzZUtpdC5oXCIiOworICAgIH0KKyAgICBpbmNsdWRlcyA8PCBlbmRsOworICB9CisKKyAgLy8gSW5jbHVkZSBvdGhlciBUaHJpZnQgaW5jbHVkZXMKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBvdGhlcl9pbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdGhlcl9pbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIGluY2x1ZGVzIDw8ICIjaW1wb3J0IFwiIgorICAgICAgICAgICAgIDw8IG90aGVyX2luY2x1ZGVzW2ldLT5nZXRfbmFtZXNwYWNlKCJjb2NvYSIpCisgICAgICAgICAgICAgPDwgY2FwaXRhbGl6ZShvdGhlcl9pbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICA8PCAiLmhcIiIgPDwgZW5kbDsKKyAgfQorCisgIGluY2x1ZGVzIDw8IGVuZGw7CisKKyAgcmV0dXJuIGluY2x1ZGVzLnN0cigpOworfQorCisvKioKKyAqIEZpbmlzaCB1cCBnZW5lcmF0aW9uLgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIC8vIHN0aWNrIG91ciBjb25zdGFudHMgZGVjbGFyYXRpb25zIGF0IHRoZSBlbmQgb2YgdGhlIGhlYWRlciBmaWxlCisgIC8vIHNpbmNlIHRoZXkgcmVmZXIgdG8gdGhpbmdzIHdlIGFyZSBkZWZpbmluZy4KKyAgZl9oZWFkZXJfIDw8IGNvbnN0YW50c19kZWNsYXJhdGlvbnNfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBqdXN0IGEgc2ltcGxlIDEtbGluZXIgaW4gb2JqZWN0aXZlLWMKKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgaWYgKHR0eXBlZGVmLT5nZXRfdHlwZSgpLT5pc19tYXAoKSkgeworICAgIHRfbWFwICptYXAgPSAodF9tYXAgKil0dHlwZWRlZi0+Z2V0X3R5cGUoKTsKKyAgICBpZiAobWFwLT5nZXRfa2V5X3R5cGUoKS0+aXNfc3RydWN0KCkpIHsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiQGNsYXNzICIgPDwgdHlwZV9uYW1lKG1hcC0+Z2V0X2tleV90eXBlKCksIHRydWUpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAobWFwLT5nZXRfdmFsX3R5cGUoKS0+aXNfc3RydWN0KCkpIHsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiQGNsYXNzICIgPDwgdHlwZV9uYW1lKG1hcC0+Z2V0X3ZhbF90eXBlKCksIHRydWUpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBlbHNlIGlmICh0dHlwZWRlZi0+Z2V0X3R5cGUoKS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCAqc2V0ID0gKHRfc2V0ICopdHR5cGVkZWYtPmdldF90eXBlKCk7CisgICAgaWYgKHNldC0+Z2V0X2VsZW1fdHlwZSgpLT5pc19zdHJ1Y3QoKSkgeworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJAY2xhc3MgIiA8PCB0eXBlX25hbWUoc2V0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBlbHNlIGlmICh0dHlwZWRlZi0+Z2V0X3R5cGUoKS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0ICpsaXN0ID0gKHRfbGlzdCAqKXR0eXBlZGVmLT5nZXRfdHlwZSgpOworICAgIGlmIChsaXN0LT5nZXRfZWxlbV90eXBlKCktPmlzX3N0cnVjdCgpKSB7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIkBjbGFzcyAiIDw8IHR5cGVfbmFtZShsaXN0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8ICIgIiA8PCBjb2NvYV9wcmVmaXhfCisgICAgICAgICAgICA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaWYgKHR0eXBlZGVmLT5nZXRfdHlwZSgpLT5pc19jb250YWluZXIoKSkgeworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiAiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSwgZmFsc2UsIHRydWUpIDw8ICIgIiA8PCBjb2NvYV9wcmVmaXhfCisgICAgICAgICAgICAgIDw8ICJNdXRhYmxlIiA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIEluIE9iamVjdGl2ZS1DLCB0aGlzIGlzCisgKiBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyB0aGUgdGhyaWZ0IGRlZmluaXRpb24gaXRzZWxmLCBpbnN0ZWFkIHVzaW5nCisgKiBOU19FTlVNIGtleXdvcmQgaW4gT2JqZWN0aXZlLUMuICBGb3IgbmFtZXNwYWNlIHB1cnBvc2VzLCB0aGUgbmFtZSBvZgorICogdGhlIGVudW0gaXMgcHJlZml4ZWQgdG8gZWFjaCBlbGVtZW50IGluIGtlZXBpbmcgd2l0aCBDb2NvYSAmIFN3aWZ0CisgKiBzdGFuZGFyZHMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmIE5TX0VOVU0oU0ludDMyLCAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfaGVhZGVyXyA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGNvY29hX3ByZWZpeF8gPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZfaGVhZGVyXyA8PCAiID0gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8IGVuZGwgPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGNvbnN0X2ludGVyZmFjZTsKKworICBjb25zdF9pbnRlcmZhY2UgPDwgIkZPVU5EQVRJT05fRVhQT1JUIE5TU3RyaW5nICoiIDw8IGNvY29hX3ByZWZpeF8gPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiRXJyb3JEb21haW47IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworCisKKyAgYm9vbCBuZWVkc19jbGFzcyA9IGZhbHNlOworCisgIC8vIFB1YmxpYyBjb25zdGFudHMgZm9yIGJhc2UgdHlwZXMgJiBzdHJpbmdzCisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKyAgICBpZiAoIXR5cGUtPmlzX2NvbnRhaW5lcigpICYmICF0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgY29uc3RfaW50ZXJmYWNlIDw8ICJGT1VOREFUSU9OX0VYUE9SVCAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBjb2NvYV9wcmVmaXhfIDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBuZWVkc19jbGFzcyA9IHRydWU7CisgICAgfQorICB9CisKKworICBzdHJpbmcgY29uc3RhbnRzX2NsYXNzX25hbWUgPSBjb2NvYV9wcmVmaXhfICsgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSArICJDb25zdGFudHMiOworCisgIGlmIChuZWVkc19jbGFzcykgeworCisgICAgY29uc3RfaW50ZXJmYWNlIDw8IGVuZGw7CisKKyAgICBjb25zdF9pbnRlcmZhY2UgPDwgIkBpbnRlcmZhY2UgIiA8PCBjb25zdGFudHNfY2xhc3NfbmFtZSA8PCAiIDogTlNPYmplY3QgIjsKKyAgICBzY29wZV91cChjb25zdF9pbnRlcmZhY2UpOworICAgIHNjb3BlX2Rvd24oY29uc3RfaW50ZXJmYWNlKTsKKworICAgIC8vIGdldHRlciBtZXRob2QgZm9yIGVhY2ggY29uc3RhbnQgZGVmaW5lZC4KKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKyAgICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSB8fCB0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIGNvbnN0X2ludGVyZmFjZSA8PCBlbmRsIDw8ICIrICgiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSAiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgY29uc3RfaW50ZXJmYWNlIDw8IGVuZGwgPDwgIkBlbmQiOworICB9CisKKyAgLy8gdGhpcyBnZXRzIHNwaXQgaW50byB0aGUgaGVhZGVyIGZpbGUgaW4gOjpjbG9zZV9nZW5lcmF0b3IKKyAgY29uc3RhbnRzX2RlY2xhcmF0aW9uc18gPSBjb25zdF9pbnRlcmZhY2Uuc3RyKCk7CisKKyAgZl9pbXBsXyA8PCAiTlNTdHJpbmcgKiIgPDwgY29jb2FfcHJlZml4XyA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJFcnJvckRvbWFpbiA9ICIKKyAgICAgICAgICA8PCAiQFwiIiA8PCBjb2NvYV9wcmVmaXhfIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIkVycm9yRG9tYWluXCI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gdmFyaWFibGVzIGluIHRoZSAubSBob2xkIGFsbCBzaW1wbGUgY29uc3RhbnQgdmFsdWVzCisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIGZfaW1wbF8gPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IG5hbWU7CisgICAgdF90eXBlKiB0dHlwZSA9IHR5cGUtPmdldF90cnVlX3R5cGUoKTsKKyAgICBpZiAoIXR0eXBlLT5pc19jb250YWluZXIoKSAmJiAhdHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICBmX2ltcGxfIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShmX2ltcGxfLCB0eXBlLCAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICB9CisgICAgZl9pbXBsXyA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBmX2ltcGxfIDw8IGVuZGw7CisKKyAgaWYgKG5lZWRzX2NsYXNzKSB7CisKKyAgICBmX2ltcGxfIDw8ICJAaW1wbGVtZW50YXRpb24gIiA8PCBjb25zdGFudHNfY2xhc3NfbmFtZSA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBpbml0aWFsaXplIGNvbXBsZXggY29uc3RhbnRzIHdoZW4gdGhlIGNsYXNzIGlzIGxvYWRlZAorICAgIGZfaW1wbF8gPDwgIisgKHZvaWQpIGluaXRpYWxpemUgIjsKKyAgICBzY29wZV91cChmX2ltcGxfKTsKKworICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICB0X3R5cGUqIHR0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisgICAgICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgICBmX2ltcGxfIDw8IGVuZGw7CisgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfaW1wbF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvY29hX3ByZWZpeF8gKyAoKmNfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICBmX2ltcGxfIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBzY29wZV9kb3duKGZfaW1wbF8pOworCisgICAgLy8gZ2V0dGVyIG1ldGhvZCBmb3IgZWFjaCBjb25zdGFudAorICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOworICAgICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICAgIGZfaW1wbF8gPDwgZW5kbCA8PCAiKyAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikgIiA8PCBuYW1lIDw8ICIgIjsKKyAgICAgICAgc2NvcGVfdXAoZl9pbXBsXyk7CisgICAgICAgIGluZGVudChmX2ltcGxfKSA8PCAicmV0dXJuICIgPDwgY29jb2FfcHJlZml4XyA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBzY29wZV9kb3duKGZfaW1wbF8pOworICAgICAgfQorICAgIH0KKworICAgIGZfaW1wbF8gPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcworICogd2l0aCBwcm90ZWN0ZWQgZGF0YSBtZW1iZXJzLCByZWFkKCksIHdyaXRlKCksIGFuZCBnZXR0ZXJzIGFuZCBzZXR0ZXJzLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShmX2hlYWRlcl8sIHRzdHJ1Y3QsIGZhbHNlKTsKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBFeGNlcHRpb25zIGFyZSBzdHJ1Y3RzLCBidXQgdGhleSBpbmhlcml0IGZyb20gTlNFeGNlcHRpb24KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW50ZXJmYWNlKGZfaGVhZGVyXywgdHhjZXB0aW9uLCB0cnVlKTsKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgdGhlIGludGVyZmFjZSBmb3IgYSBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgImVudW0geyIgPDwgZW5kbAorICAgICAgICA8PCAiICAiIDw8IGNvY29hX3ByZWZpeF8gPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiRXJyb3IiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgICIgPSAtIiA8PCBlcnJvcl9jb25zdGFudF8rKyA8PCBlbmRsCisgICAgICAgIDw8ICJ9OyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8ICJAaW50ZXJmYWNlICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgOiAiOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgIk5TRXJyb3IgIjsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIk5TT2JqZWN0ICI7CisgIH0KKyAgb3V0IDw8ICI8VEJhc2UsIE5TQ29kaW5nLCBOU0NvcHlpbmc+ICIgPDwgZW5kbDsKKworICBvdXQgPDwgZW5kbDsKKworICAvLyBwcm9wZXJ0aWVzCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX3Byb3BlcnR5KCptX2l0ZXIpIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9wcm9wZXJ0eV9pc3NldCgqbV9pdGVyKSA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfcHJvcGVydHlfdW5zZXQoKm1faXRlcikgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIC8vIGluaXRpYWxpemVyIGZvciBhbGwgZmllbGRzCisgIGlmICghbWVtYmVycy5lbXB0eSgpKSB7CisgICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRpYWxpemVyX3NpZ25hdHVyZShvdXQsIHRzdHJ1Y3QpOworICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgZW5kbDsKKworICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBzaWduYXR1cmUgZm9yIGluaXRpYWxpemVyIG9mIHN0cnVjdCB3aXRoIGEgcGFyYW1ldGVyIGZvcgorICogZWFjaCBmaWVsZC4KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRpYWxpemVyX3NpZ25hdHVyZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGluZGVudChvdXQpIDw8ICItIChpbnN0YW5jZXR5cGUpIGluaXRXaXRoIjsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOykgeworICAgIGlmIChtX2l0ZXIgPT0gbWVtYmVycy5iZWdpbigpKSB7CisgICAgICBvdXQgPDwgY2FwaXRhbGl6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBvdXQgPDwgIjogKCIgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgKyttX2l0ZXI7CisgICAgaWYgKG1faXRlciAhPSBtZW1iZXJzLmVuZCgpKSB7CisgICAgICBvdXQgPDwgIiAiOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlIHRoZSBpbml0V2l0aENvZGVyIG1ldGhvZCBmb3IgdGhpcyBzdHJ1Y3Qgc28gaXQncyBjb21wYXRpYmxlIHdpdGgKKyAqIHRoZSBOU0NvZGluZyBwcm90b2NvbAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdF93aXRoX2NvZGVyX21ldGhvZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisKKyAgaW5kZW50KG91dCkgPDwgIi0gKGluc3RhbmNldHlwZSkgaW5pdFdpdGhDb2RlcjogKE5TQ29kZXIgKikgZGVjb2RlciIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgLy8gTlNFeGNlcHRpb25zIGNvbmZvcm0gdG8gTlNDb2RpbmcsIHNvIHdlIGNhbiBjYWxsIHN1cGVyCisgICAgaW5kZW50KG91dCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdFdpdGhDb2RlcjogZGVjb2Rlcl07IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJpZiAoc2VsZikgIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoW2RlY29kZXIgY29udGFpbnNWYWx1ZUZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXSkiCisgICAgICAgIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIjsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgeworICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVPYmplY3RGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IgorICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0LT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXQpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUJvb2xGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVJbnRGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUludDMyRm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVJbnQ2NEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlRG91YmxlRm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGRvbid0IGtub3cgaG93IHRvIGRlY29kZSB0aHJpZnQgdHlwZTogIgorICAgICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiSXNTZXQgPSBZRVM7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgZW5jb2RlV2l0aENvZGVyIG1ldGhvZCBmb3IgdGhpcyBzdHJ1Y3Qgc28gaXQncyBjb21wYXRpYmxlIHdpdGgKKyAqIHRoZSBOU0NvZGluZyBwcm90b2NvbAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZW5jb2RlX3dpdGhfY29kZXJfbWV0aG9kKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisKKyAgaW5kZW50KG91dCkgPDwgIi0gKHZvaWQpIGVuY29kZVdpdGhDb2RlcjogKE5TQ29kZXIgKikgZW5jb2RlciIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgLy8gTlNFeGNlcHRpb25zIGNvbmZvcm0gdG8gTlNDb2RpbmcsIHNvIHdlIGNhbiBjYWxsIHN1cGVyCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbc3VwZXIgZW5jb2RlV2l0aENvZGVyOiBlbmNvZGVyXTsiIDw8IGVuZGw7CisgIH0KKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJJc1NldCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVPYmplY3Q6IF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIgorICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVJbnQ6IF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIgorICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXQpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUJvb2w6IF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIgorICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50OiBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVJbnQ6IF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIgorICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUludDMyOiBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVJbnQ2NDogXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiCisgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlRG91YmxlOiBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGRvbid0IGtub3cgaG93IHRvIGVuY29kZSB0aHJpZnQgdHlwZTogIgorICAgICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIHRoZSBjb3B5IG1ldGhvZCBmb3IgdGhpcyBzdHJ1Y3QKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2NvcHlfbWV0aG9kKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoaW5zdGFuY2V0eXBlKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiB2YWwgPSBbIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBlcnJvcldpdGhEb21haW46IHNlbGYuZG9tYWluIGNvZGU6IHNlbGYuY29kZSB1c2VySW5mbzogc2VsZi51c2VySW5mb107IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiB2YWwgPSBbIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBuZXddOyIgPDwgZW5kbDsKKyAgfQorCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0KSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhbC4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gW3NlbGYuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBjb3B5XTsiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhbC4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gc2VsZi4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHZhbDsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgaGFzaCBtZXRob2QgZm9yIHRoaXMgc3RydWN0CisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9oYXNoX21ldGhvZChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICItIChOU1VJbnRlZ2VyKSBoYXNoIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TVUludGVnZXIgaGFzaCA9IDE3OyIgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJoYXNoID0gKGhhc2ggKiAzMSkgXiBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgPDwgIklzU2V0ID8gMjY1NDQzNTc2MSA6IDA7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiSXNTZXQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaGFzaCA9IChoYXNoICogMzEpIF4gW18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGhhc2hdOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJoYXNoID0gKGhhc2ggKiAzMSkgXiBbQChfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikgaGFzaF07IgorICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGhhc2g7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIHRoZSBpc0VxdWFsIG1ldGhvZCBmb3IgdGhpcyBzdHJ1Y3QKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2lzX2VxdWFsX21ldGhvZChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBpbmRlbnQob3V0KSA8PCAiLSAoQk9PTCkgaXNFcXVhbDogKGlkKSBhbk9iamVjdCIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgKHNlbGYgPT0gYW5PYmplY3QpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIHN0cmluZyBjbGFzc19uYW1lID0gY29jb2FfcHJlZml4XyArIHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtzdXBlciBpc0VxdWFsOmFuT2JqZWN0XSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKyAgZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW2FuT2JqZWN0IGlzS2luZE9mQ2xhc3M6WyIgPDwgY2xhc3NfbmFtZSA8PCAiIGNsYXNzXV0pIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBjbGFzc19uYW1lIDw8ICIgKm90aGVyID0gKCIgPDwgY2xhc3NfbmFtZSA8PCAiICopYW5PYmplY3Q7IiA8PCBlbmRsOworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgoXyIgPDwgbmFtZSA8PCAiSXNTZXQgIT0gb3RoZXItPl8iIDw8IG5hbWUgPDwgIklzU2V0KSB8fCIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAiCisgICAgICAgICAgICA8PCAiKF8iIDw8IG5hbWUgPDwgIklzU2V0ICYmICIKKyAgICAgICAgICAgIDw8ICIoKF8iIDw8IG5hbWUgPDwgIiB8fCBvdGhlci0+XyIgPDwgbmFtZSA8PCAiKSAmJiAiCisgICAgICAgICAgICA8PCAiIVtfIiA8PCBuYW1lIDw8ICIgaXNFcXVhbDpvdGhlci0+XyIgPDwgbmFtZSA8PCAiXSkpKSB7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKF8iIDw8IG5hbWUgPDwgIklzU2V0ICE9IG90aGVyLT5fIiA8PCBuYW1lIDw8ICJJc1NldCkgfHwiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgIgorICAgICAgICAgICAgPDwgIihfIiA8PCBuYW1lIDw8ICJJc1NldCAmJiAiCisgICAgICAgICAgICA8PCAiKF8iIDw8IG5hbWUgPDwgIiAhPSBvdGhlci0+XyIgPDwgbmFtZSA8PCAiKSkpIHsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gTk87IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgc3RydWN0IGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBwYXJhbSB0c3RydWN0ICAgICAgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBAcGFyYW0gaXNfZXhjZXB0aW9uIElzIHRoaXMgYW4gZXhjZXB0aW9uPworICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgIGluZGVudChvdXQpIDw8ICJAaW1wbGVtZW50YXRpb24gIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgZW5kbCA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgLy8gZXhjZXB0aW9ucyBuZWVkIHRvIGNhbGwgdGhlIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgb24gTlNFeGNlcHRpb24KKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoaW5zdGFuY2V0eXBlKSBpbml0IiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gW3N1cGVyIGluaXRXaXRoRG9tYWluOiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiRXJyb3JEb21haW4iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6ICIgPDwgY29jb2FfcHJlZml4XyA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJFcnJvciIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOiBuaWxdOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgLy8gc3RydWN0CisKKyAgICAvLyBkZWZhdWx0IGluaXRpYWxpemVyCisgICAgLy8gc2V0dXAgaW5zdGFuY2UgdmFyaWFibGVzIHdpdGggZGVmYXVsdCB2YWx1ZXMKKyAgICBpbmRlbnQob3V0KSA8PCAiLSAoaW5zdGFuY2V0eXBlKSBpbml0IiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoc2VsZikiOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGYuIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHNlbGY7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorCisgIC8vIGluaXRpYWxpemVyIHdpdGggYWxsIGZpZWxkcyBhcyBwYXJhbXMKKyAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKKyAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdGlhbGl6ZXJfc2lnbmF0dXJlKG91dCwgdHN0cnVjdCk7CisgICAgb3V0IDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc2VsZiBpbml0XTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZiA9IFtzdXBlciBpbml0XTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImlmIChzZWxmKSI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIjsKKyAgICAgIGlmIChnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgIG91dCA8PCAiWyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgbXV0YWJsZUNvcHldOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiSXNTZXQgPSBZRVM7IiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KKworICAvLyBpbml0V2l0aENvZGVyIGZvciBOU0NvZGluZworICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdF93aXRoX2NvZGVyX21ldGhvZChvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIC8vIGVuY29kZVdpdGhDb2RlciBmb3IgTlNDb2RpbmcKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2VuY29kZV93aXRoX2NvZGVyX21ldGhvZChvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIC8vIGhhc2ggYW5kIGlzRXF1YWwgZm9yIE5TT2JqZWN0CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9oYXNoX21ldGhvZChvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaXNfZXF1YWxfbWV0aG9kKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgLy8gY29weSBmb3IgTlNPYmplY3QKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2NvcHlfbWV0aG9kKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKworICAvLyB0aGUgcmVzdCBvZiB0aGUgbWV0aG9kcworICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfaW1wbGVtZW50YXRpb25zKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBpZiAoaXNfcmVzdWx0KSB7CisgICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZGVzY3JpcHRpb24ob3V0LCB0c3RydWN0KTsKKworICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgIi0gKEJPT0wpIHJlYWQ6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbCBlcnJvcjogKE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKV9fdGhyaWZ0RXJyb3IiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcworICBpbmRlbnQob3V0KSA8PCAiTlNTdHJpbmcgKiBmaWVsZE5hbWU7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiU0ludDMyIGZpZWxkVHlwZTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJTSW50MzIgZmllbGRJRDsiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJpZiAoIVtpblByb3RvY29sIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6IE5VTEwgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBpbmRlbnQob3V0KQorICAgICAgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOiAmZmllbGROYW1lIHR5cGU6ICZmaWVsZFR5cGUgZmllbGRJRDogJmZpZWxkSUQgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IgorICAgICAgPDwgZW5kbDsKKworICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCisgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGRUeXBlID09IFRUeXBlU1RPUCkgeyAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZFR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAiZmllbGRWYWx1ZSIpOworICAgIGluZGVudChvdXQpIDw8IGNhbGxfZmllbGRfc2V0dGVyKCpmX2l0ZXIsICJmaWVsZFZhbHVlIikgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGw7CisgICAgaWYgKGxvZ191bmV4cGVjdGVkXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIE5TTG9nKEBcIiVzOiBmaWVsZCBJRCAlaSBoYXMgdW5leHBlY3RlZCB0eXBlICVpLiAgU2tpcHBpbmcuXCIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiX19QUkVUVFlfRlVOQ1RJT05fXywgKGludClmaWVsZElELCAoaW50KWZpZWxkVHlwZSk7IiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBmaWVsZFR5cGUgb25Qcm90b2NvbDogaW5Qcm90b2NvbCBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaWYgKGxvZ191bmV4cGVjdGVkXykgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU0xvZyhAXCIlczogdW5leHBlY3RlZCBmaWVsZCBJRCAlaSB3aXRoIHR5cGUgJWkuICBTa2lwcGluZy5cIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAiX19QUkVUVFlfRlVOQ1RJT05fXywgKGludClmaWVsZElELCAoaW50KWZpZWxkVHlwZSk7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGlmICghW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGZpZWxkVHlwZSBvblByb3RvY29sOiBpblByb3RvY29sIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZEZpZWxkRW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtpblByb3RvY29sIHJlYWRTdHJ1Y3RFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICBpZiAodmFsaWRhdGVfcmVxdWlyZWRfKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtzZWxmIHZhbGlkYXRlOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKEJPT0wpIHdyaXRlOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sIGVycm9yOiAoTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopX190aHJpZnRFcnJvciB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogQFwiIiA8PCBuYW1lIDw8ICJcIiBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0KSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG5pbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogQFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiXCIgdHlwZTogIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIgZmllbGRJRDogIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZUZpZWxkRW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZFN0b3A6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LCB3aGljaAorICogaXMgYSBmdW5jdGlvbiByZXN1bHQuIFRoZXNlIGZpZWxkcyBhcmUgb25seSB3cml0dGVuIGlmIHRoZXkgYXJlCisgKiBzZXQsIGFuZCBvbmx5IG9uZSBvZiB0aGVtIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoQk9PTCkgd3JpdGU6IChpZCA8VFByb3RvY29sPikgb3V0UHJvdG9jb2wgZXJyb3I6IChOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKilfX3RocmlmdEVycm9yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOiBAXCIiIDw8IG5hbWUgPDwgIlwiIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIgZWxzZSBpZiAiOworICAgIH0KKworICAgIG91dCA8PCAiKF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiSXNTZXQpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBuaWwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIlwiIHR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiIGZpZWxkSUQ6ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSI7CisgIH0KKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlRmllbGRTdG9wOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlU3RydWN0RW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIKKyAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKKyAqIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICItIChCT09MKSB2YWxpZGF0ZTogKE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKV9fdGhyaWZ0RXJyb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIV8iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJJc1NldCkgIjsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKF9fdGhyaWZ0RXJyb3IpICI7CisgICAgICBzY29wZV91cChvdXQpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIqX190aHJpZnRFcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjogVFByb3RvY29sRXJyb3JEb21haW4iIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFRQcm90b2NvbEVycm9yVW5rbm93biIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzogQHtUUHJvdG9jb2xFcnJvckV4dGVuZGVkRXJyb3JLZXk6IEAoVFByb3RvY29sRXh0ZW5kZWRFcnJvck1pc3NpbmdSZXF1aXJlZEZpZWxkKSwiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXJyb3JGaWVsZE5hbWVLZXk6IEBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIn1dOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9CisgIH0KKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBwcm9wZXJ0eSBhY2Nlc3NvciBtZXRob2RzIGZvciBhbGwgZmllbGRzIGluIHRoZSBzdHJ1Y3QuCisgKiBnZXR0ZXIsIHNldHRlciwgaXNzZXQgZ2V0dGVyLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfaW1wbGVtZW50YXRpb25zKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgICh2b2lkKWlzX2V4Y2VwdGlvbjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBmaWVsZF9uYW1lOworICAgIGNhcF9uYW1lWzBdID0gdG91cHBlcihjYXBfbmFtZVswXSk7CisKKyAgICAvLyBTaW1wbGUgc2V0dGVyCisgICAgaW5kZW50KG91dCkgPDwgIi0gKHZvaWQpIHNldCIgPDwgY2FwX25hbWUgPDwgIjogKCIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKSAiIDw8IGZpZWxkX25hbWUKKyAgICAgICAgICAgICAgICA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgIl8iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiXyIgPDwgZmllbGRfbmFtZSA8PCAiSXNTZXQgPSBZRVM7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFVuc2V0dGVyIC0gZG8gd2UgbmVlZCB0aGlzPworICAgIGluZGVudChvdXQpIDw8ICItICh2b2lkKSB1bnNldCIgPDwgY2FwX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiXyIgPDwgZmllbGRfbmFtZSA8PCAiID0gbmlsOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgIl8iIDw8IGZpZWxkX25hbWUgPDwgIklzU2V0ID0gTk87IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGRlc2NyaXB0aW9uIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZGVzY3JpcHRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworCisgIC8vIEFsbG93IHVzZSBvZiBkZWJ1Z0Rlc2NyaXB0aW9uIHNvIHRoZSBhcHAgY2FuIGFkZCBkZXNjcmlwdGlvbiB2aWEgYSBjYXRlb2dvcnkvZXh0ZW5zaW9uCisgIGlmIChkZWJ1Z19kZXNjcmlwdGlvbnNfKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICItIChOU1N0cmluZyAqKSBkZWJ1Z0Rlc2NyaXB0aW9uIHsiIDw8IGVuZGw7CisgIH0KKyAgZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICItIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbiB7IiA8PCBlbmRsOworICB9CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNNdXRhYmxlU3RyaW5nICogbXMgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6IEBcIiIKKyAgICAgIDw8IGNvY29hX3ByZWZpeF8gPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiXTsiIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBpbmRlbnQob3V0KSA8PCAiW21zIGFwcGVuZFN0cmluZzogQFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIl07IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiW21zIGFwcGVuZFN0cmluZzogQFwiLCIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCJdOyIgPDwgZW5kbDsKKyAgICB9CisgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiW21zIGFwcGVuZEZvcm1hdDogQFwiIiA8PCBmb3JtYXRfc3RyaW5nX2Zvcl90eXBlKHR0eXBlKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICA8PCBmb3JtYXRfY2FzdF9mb3JfdHlwZSh0dHlwZSkgPDwgIl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXTsiIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJbbXMgYXBwZW5kU3RyaW5nOiBAXCIpXCJdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgInJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aFN0cmluZzogbXNdOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLiAgSW4gT2JqZWN0aXZlLUMgdGhpcyBjb25zaXN0cyBvZiBhCisgKiBwcm90b2NvbCBkZWZpbml0aW9uLCBhIGNsaWVudCBpbnRlcmZhY2UgYW5kIGEgY2xpZW50IGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3Byb3RvY29sKGZfaGVhZGVyXywgdHNlcnZpY2UpOworICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbnRlcmZhY2UoZl9oZWFkZXJfLCB0c2VydmljZSk7CisgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2Vfc2VydmVyX2ludGVyZmFjZShmX2hlYWRlcl8sIHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHNlcnZpY2UpOworICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0c2VydmljZSk7CisgIGlmIChhc3luY19jbGllbnRzXykgeworICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfYXN5bmNfcHJvdG9jb2woZl9oZWFkZXJfLCB0c2VydmljZSk7CisgICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfYXN5bmNfaW50ZXJmYWNlKGZfaGVhZGVyXywgdHNlcnZpY2UpOworICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2FzeW5jX2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzZXJ2aWNlKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgcmV0dXJuIHR5cGVzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgc3RyaW5nIHFuYW1lID0gZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsICpmX2l0ZXIpOworCisgICAgdF9zdHJ1Y3QgcW5hbWVfdHMgPSB0X3N0cnVjdCh0cy0+Z2V0X3Byb2dyYW0oKSwgcW5hbWUpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBxbmFtZV90cy5hcHBlbmQoKm1faXRlcik7CisgICAgfQorCisgICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShmX2ltcGxfLCAmcW5hbWVfdHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgJnFuYW1lX3RzLCBmYWxzZSwgZmFsc2UpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModHNlcnZpY2UsICpmX2l0ZXIpOworICB9Cit9CisKK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X3NlcnZpY2UgKnRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXR1cm4gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICB9Cit9CisKK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHJldHVybiB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gY3JlYXRlIGEgcmVzdWx0IHN0cnVjdCB3aXRoIGEgc3VjY2VzcyBmaWVsZCBvZiB0aGUgcmV0dXJuIHR5cGUsCisgIC8vIGFuZCBhIGZpZWxkIGZvciBlYWNoIHR5cGUgb2YgZXhjZXB0aW9uIHRocm93bgorICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsIHRmdW5jdGlvbikpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgLy8gZ2VuZXJhdGUgdGhlIHJlc3VsdCBzdHJ1Y3QKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShmX2ltcGxfLCAmcmVzdWx0LCBmYWxzZSk7CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBwcm90b2NvbCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHByb3RvY29sIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfcHJvdG9jb2wob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIG91dCA8PCAiQHByb3RvY29sICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiIDxOU09iamVjdD4iIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgb3V0IDw8ICItICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUpIDw8ICI7IgorICAgICAgICA8PCAiICAvLyB0aHJvd3MgIjsKKyAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgb3V0IDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpICsgIiwgIjsKKyAgICB9CisgICAgb3V0IDw8ICJURXhjZXB0aW9uIiA8PCBlbmRsOworICB9CisgIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiBhc3luY2hyb25vdXMgc2VydmljZSBwcm90b2NvbCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHByb3RvY29sIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfYXN5bmNfcHJvdG9jb2wob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIG91dCA8PCAiQHByb3RvY29sICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmMiCisgICAgICA8PCAiIDxOU09iamVjdD4iIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgb3V0IDw8ICItICIgPDwgYXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGZhbHNlKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpZiAocHJvbWlzZV9raXRfKSB7CisgICAgICBvdXQgPDwgIi0gIiA8PCBwcm9taXNlX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbnRlcmZhY2Uob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgb3V0IDw8ICJAaW50ZXJmYWNlICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50IDogVEJhc2VDbGllbnQgPCIKKyAgICAgIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIj4gIiA8PCBlbmRsOworCisgIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2w7IiA8PCBlbmRsOworICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aEluUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbCBvdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSAiCisgICAgICAgICAib3V0UHJvdG9jb2w7IiA8PCBlbmRsOworICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2FzeW5jX2ludGVyZmFjZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBvdXQgPDwgIkBpbnRlcmZhY2UgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJDbGllbnRBc3luYyA6IFRCYXNlQ2xpZW50IDwiCisgICAgICA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luYz4gIiA8PCBlbmRsCisgICAgICA8PCBlbmRsOworCisgIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoUHJvdG9jb2xGYWN0b3J5OiAoaWQgPFRQcm90b2NvbEZhY3Rvcnk+KSBwcm90b2NvbEZhY3RvcnkgIgorICAgICAgPDwgInRyYW5zcG9ydEZhY3Rvcnk6IChpZCA8VEFzeW5jVHJhbnNwb3J0RmFjdG9yeT4pIHRyYW5zcG9ydEZhY3Rvcnk7IiA8PCBlbmRsOworICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBpbnRlcmZhY2UgZGVmaW5pdGlvbi4gSW4gb3RoZXIgd29yZHMsIHRoZSBUUHJvY2VzcyBpbXBsZW1lbnRhdGlvbiBmb3IKKyAqdGhlCisgKiBzZXJ2aWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbnRlcmZhY2Uob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgb3V0IDw8ICJAaW50ZXJmYWNlICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKQorICAgICAgPDwgIlByb2Nlc3NvciA6IE5TT2JqZWN0IDxUUHJvY2Vzc29yPiAiIDw8IGVuZGw7CisKKyAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGgiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI6IChpZCA8IiA8PCBjb2NvYV9wcmVmaXhfCisgICAgICA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPikgc2VydmljZTsiIDw8IGVuZGw7CisgIG91dCA8PCAiLSAoaWQ8IiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+KSBzZXJ2aWNlOyIgPDwgZW5kbDsKKworICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbigKKyAgICBvc3RyZWFtJiBvdXQsCisgICAgdF9zZXJ2aWNlICp0c2VydmljZSwKKyAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgYm9vbCBuZWVkc19wcm90b2NvbCkgeworICBzdHJpbmcgZnVubmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKworICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX2Jvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOworCisgIHN0cmluZyBhcmdzbmFtZSA9IGZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCB0ZnVuY3Rpb24pOworCisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgaW5kZW50KG91dCkgPDwgIi0gKEJPT0wpIHNlbmRfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksIG5lZWRzX3Byb3RvY29sID8gIm91dFByb3RvY29sIiA6ICIiLCB0cnVlKSA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgZnVubmFtZSA8PCAiXCIiCisgICAgICA8PCAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSA/ICIgdHlwZTogVE1lc3NhZ2VUeXBlT05FV0FZIiA6ICIgdHlwZTogVE1lc3NhZ2VUeXBlQ0FMTCIpCisgICAgICA8PCAiIHNlcXVlbmNlSUQ6IDAgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOiBAXCIiIDw8IGFyZ3NuYW1lCisgICAgICAgICAgICAgICAgICA8PCAiXCIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgIC8vIHdyaXRlIG91dCBmdW5jdGlvbiBwYXJhbWV0ZXJzCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICBzdHJpbmcgZmllbGROYW1lID0gKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmbGRfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IGZpZWxkTmFtZSA8PCAiICE9IG5pbCkiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogQFwiIiA8PCBmaWVsZE5hbWUKKyAgICAgICAgPDwgIlwiIgorICAgICAgICAgICAiIHR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICA8PCAiIGZpZWxkSUQ6ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmbGRfaXRlciwgZmllbGROYW1lKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZUZpZWxkU3RvcDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3JlY3ZfZnVuY3Rpb25faW1wbGVtZW50YXRpb24oCisgICAgb3N0cmVhbSYgb3V0LAorICAgIHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgIGJvb2wgbmVlZHNfcHJvdG9jb2wpIHsKKworCisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgaW5kZW50KG91dCkgPDwgIi0gKEJPT0wpIHJlY3ZfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBvdXQgPDwgIjogKCIgPDwgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgZmFsc2UsIHRydWUpIDw8ICIgKikgcmVzdWx0ICI7CisgICAgaWYgKG5lZWRzX3Byb3RvY29sKSB7CisgICAgICBvdXQgPDwgInByb3RvY29sIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJlcnJvciI7CisgICAgfQorICB9CisgIGlmIChuZWVkc19wcm90b2NvbCkgeworICAgIG91dCA8PCAiOiAoaWQ8VFByb3RvY29sPikgaW5Qcm90b2NvbCBlcnJvciI7CisgIH0KKyAgb3V0IDw8ICI6IChOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKilfX3RocmlmdEVycm9yIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIC8vIFRPRE8obWNzbGVlKTogTWVzc2FnZSB2YWxpZGF0aW9uIGhlcmUsIHdhcyB0aGUgc2VxaWQgZXRjIG9rPworCisgIC8vIGNoZWNrIGZvciBhbiBleGNlcHRpb24KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJOU0Vycm9yICppbmNvbWluZ0V4Y2VwdGlvbiA9IFtzZWxmIGNoZWNrSW5jb21pbmdNZXNzYWdlRXhjZXB0aW9uOiBpblByb3RvY29sXTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoaW5jb21pbmdFeGNlcHRpb24pIjsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoX190aHJpZnRFcnJvcikiOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIipfX3RocmlmdEVycm9yID0gaW5jb21pbmdFeGNlcHRpb247IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIEZJWE1FIC0gY291bGQgb3B0aW1pemUgaGVyZSB0byByZWR1Y2UgY3JlYXRpb24gb2YgdGVtcG9yYXJ5IG9iamVjdHMuCisgIHN0cmluZyByZXN1bHRuYW1lID0gZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0c2VydmljZSwgdGZ1bmN0aW9uKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IGNvY29hX3ByZWZpeF8gPDwgcmVzdWx0bmFtZSA8PCAiICogcmVzdWx0ZXIgPSBbIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHJlc3VsdG5hbWUgPDwgIiBuZXddOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlmICghW3Jlc3VsdGVyIHJlYWQ6IGluUHJvdG9jb2wgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHRlci5zdWNjZXNzSXNTZXQpIjsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKnJlc3VsdCA9IHJlc3VsdGVyLnN1Y2Nlc3M7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHRlci4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiSXNTZXQpIjsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF9fdGhyaWZ0RXJyb3IpIjsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKl9fdGhyaWZ0RXJyb3IgPSBbcmVzdWx0ZXIgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIl07IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCisgIGlmICh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfX3RocmlmdEVycm9yKSI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIipfX3RocmlmdEVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOiBUQXBwbGljYXRpb25FcnJvckRvbWFpbiIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFRBcHBsaWNhdGlvbkVycm9yTWlzc2luZ1Jlc3VsdCIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86IEB7VEFwcGxpY2F0aW9uRXJyb3JNZXRob2RLZXk6IEBcIiIKKyAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIn1dOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gTk87IiA8PCBlbmRsOworICB9CisKKyAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gaW52b2NhdGlvbiBvZiBhIGdpdmVuICdzZW5kXycgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbnZvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbc2VsZiBzZW5kXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICBzdHJpbmcgZmllbGROYW1lID0gKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgb3V0IDw8ICIgIjsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBvdXQgPDwgIjogIiA8PCBmaWVsZE5hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBmaWVsZE5hbWUgPDwgIjogIiA8PCBmaWVsZE5hbWU7CisgICAgfQorICB9CisgIGlmICghZmllbGRzLmVtcHR5KCkpIHsKKyAgICBvdXQgPDwgIiBlcnJvciI7CisgIH0KKyAgb3V0IDw8ICI6IF9fdGhyaWZ0RXJyb3JdKSAiIDw8IGludmFsaWRfcmV0dXJuX3N0YXRlbWVudCh0ZnVuY3Rpb24pIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIGludm9jYXRpb24gb2YgYSBnaXZlbiAnc2VuZF8nIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmYWlsdXJlQmxvY2tOYW1lKSB7CisKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW3NlbGYgc2VuZF8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgc3RyaW5nIGZpZWxkTmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIG91dCA8PCAiICI7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgb3V0IDw8ICI6ICIgPDwgZmllbGROYW1lOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgZmllbGROYW1lIDw8ICI6ICIgPDwgZmllbGROYW1lOworICAgIH0KKyAgfQorICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7CisgICAgb3V0IDw8ICIgcHJvdG9jb2wiOworICB9CisgIG91dCA8PCAiOiBwcm90b2NvbCBlcnJvcjogJnRocmlmdEVycm9yXSkgIjsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IGZhaWx1cmVCbG9ja05hbWUgPDwgIih0aHJpZnRFcnJvcik7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworCisgIHN0cmluZyBuYW1lID0gY29jb2FfcHJlZml4XyArIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIkNsaWVudCI7CisKKyAgb3V0IDw8ICJAaW50ZXJmYWNlICIgPDwgbmFtZSA8PCAiICgpICI7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlkPFRQcm90b2NvbD4gaW5Qcm90b2NvbDsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWQ8VFByb3RvY29sPiBvdXRQcm90b2NvbDsiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKworICBvdXQgPDwgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IG5hbWUgPDwgZW5kbDsKKworICAvLyBpbml0aWFsaXplcnMKKyAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGhQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbCIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gW3NlbGYgaW5pdFdpdGhJblByb3RvY29sOiBwcm90b2NvbCBvdXRQcm90b2NvbDogcHJvdG9jb2xdOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aEluUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgYW5JblByb3RvY29sIG91dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pICIKKyAgICAgICAgICJhbk91dFByb3RvY29sIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChzZWxmKSAiOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImluUHJvdG9jb2wgPSBhbkluUHJvdG9jb2w7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIm91dFByb3RvY29sID0gYW5PdXRQcm90b2NvbDsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZjsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIsIGZhbHNlKTsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyLCBmYWxzZSk7CisgICAgfQorCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChvdXQpIDw8ICItICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUpIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ludm9jYXRpb24ob3V0LCAqZl9pdGVyKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbW291dFByb3RvY29sIHRyYW5zcG9ydF0gZmx1c2g6IF9fdGhyaWZ0RXJyb3JdKSAiIDw8IGludmFsaWRfcmV0dXJuX3N0YXRlbWVudCgqZl9pdGVyKSA8PCBlbmRsOworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbc2VsZiByZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksIGZhbHNlLCB0cnVlKSA8PCAiIF9fcmVzdWx0OyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICghW3NlbGYgcmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAmX19yZXN1bHQgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSAiCisgICAgICAgICAgICA8PCBpbnZhbGlkX3JldHVybl9zdGF0ZW1lbnQoKmZfaXRlcikgPDwgZW5kbDsKKyAgICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIF9fcmVzdWx0OyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBAKF9fcmVzdWx0KTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbiBmb3IgaXRzIGFzeW5jaHJvbm91cyBpbnRlcmZhY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgc3RyaW5nIG5hbWUgPSBjb2NvYV9wcmVmaXhfICsgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiQ2xpZW50QXN5bmMiOworCisgIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IG5hbWUgPDwgIiAoKSAiOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZDxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3Rvcnk7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlkPFRBc3luY1RyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3Rvcnk7IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisKKworICBvdXQgPDwgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IG5hbWUgPDwgZW5kbAorICAgICAgPDwgZW5kbCA8PCAiLSAoaWQpIGluaXRXaXRoUHJvdG9jb2xGYWN0b3J5OiAoaWQgPFRQcm90b2NvbEZhY3Rvcnk+KSBhUHJvdG9jb2xGYWN0b3J5ICIKKyAgICAgICAgICAgICAgICAgInRyYW5zcG9ydEZhY3Rvcnk6IChpZCA8VEFzeW5jVHJhbnNwb3J0RmFjdG9yeT4pIGFUcmFuc3BvcnRGYWN0b3J5OyIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChzZWxmKSB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcHJvdG9jb2xGYWN0b3J5ID0gYVByb3RvY29sRmFjdG9yeTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICB0cmFuc3BvcnRGYWN0b3J5ID0gYVRyYW5zcG9ydEZhY3Rvcnk7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGY7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyLCB0cnVlKTsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyLCB0cnVlKTsKKyAgICB9CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaW5kZW50KG91dCkgPDwgIi0gIiA8PCBhc3luY19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZmFsc2UpIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNFcnJvciAqdGhyaWZ0RXJyb3I7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZDxUQXN5bmNUcmFuc3BvcnQ+IHRyYW5zcG9ydCA9IFt0cmFuc3BvcnRGYWN0b3J5IG5ld1RyYW5zcG9ydF07IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZDxUUHJvdG9jb2w+IHByb3RvY29sID0gW3Byb3RvY29sRmFjdG9yeSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OnRyYW5zcG9ydF07IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9zZW5kX2FzeW5jX2Z1bmN0aW9uX2ludm9jYXRpb24ob3V0LCAqZl9pdGVyLCAiZmFpbHVyZUJsb2NrIik7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlt0cmFuc3BvcnQgZmx1c2hXaXRoQ29tcGxldGlvbjpeeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJOU0Vycm9yICp0aHJpZnRFcnJvcjsiIDw8IGVuZGw7CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpIDw8ICIgcmVzdWx0OyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbc2VsZiByZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgIjogJnJlc3VsdCBwcm90b2NvbCI7CisgICAgICB9CisgICAgICBvdXQgPDwgIjogcHJvdG9jb2wgZXJyb3I6ICZ0aHJpZnRFcnJvcl0pICI7CisgICAgICBzY29wZV91cChvdXQpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmYWlsdXJlQmxvY2sodGhyaWZ0RXJyb3IpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzcG9uc2VCbG9jaygiOworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSAmJiAhKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIG91dCA8PCAicmVzdWx0IjsKKyAgICB9CisgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZmFpbHVyZTpmYWlsdXJlQmxvY2tdOyIgPDwgZW5kbDsKKworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gUHJvbWlzZSBmdW5jdGlvbgorICAgIGlmIChwcm9taXNlX2tpdF8pIHsKKworICAgICAgaW5kZW50KG91dCkgPDwgIi0gIiA8PCBwcm9taXNlX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworICAgICAgc2NvcGVfdXAob3V0KTsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gW0FueVByb21pc2UgcHJvbWlzZVdpdGhSZXNvbHZlckJsb2NrOl4oUE1LUmVzb2x2ZXIgcmVzb2x2ZXIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJOU0Vycm9yICp0aHJpZnRFcnJvcjsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWQ8VEFzeW5jVHJhbnNwb3J0PiB0cmFuc3BvcnQgPSBbdHJhbnNwb3J0RmFjdG9yeSBuZXdUcmFuc3BvcnRdOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZDxUUHJvdG9jb2w+IHByb3RvY29sID0gW3Byb3RvY29sRmFjdG9yeSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OnRyYW5zcG9ydF07IiA8PCBlbmRsCisgICAgICAgICAgPDwgZW5kbDsKKworICAgICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9hc3luY19mdW5jdGlvbl9pbnZvY2F0aW9uKG91dCwgKmZfaXRlciwgInJlc29sdmVyIik7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW3RyYW5zcG9ydCBmbHVzaFdpdGhDb21wbGV0aW9uOl57IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TRXJyb3IgKnRocmlmdEVycm9yOyIgPDwgZW5kbDsKKworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpIDw8ICIgcmVzdWx0OyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW3NlbGYgcmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIG91dCA8PCAiOiAmcmVzdWx0IHByb3RvY29sIjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgIjogcHJvdG9jb2wgZXJyb3I6ICZ0aHJpZnRFcnJvcl0pICI7CisgICAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzb2x2ZXIodGhyaWZ0RXJyb3IpOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIH0KKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXNvbHZlcigiOworICAgICAgaWYgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgfHwgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgb3V0IDw8ICJAWUVTIjsKKyAgICAgIH0gZWxzZSBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICAgIG91dCA8PCAicmVzdWx0IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiQChyZXN1bHQpIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBmYWlsdXJlOl4oTlNFcnJvciAqZXJyb3IpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzb2x2ZXIoZXJyb3IpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn1dOyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifV07IiA8PCBlbmRsOworCisgICAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICAgIG91dCA8PCBlbmRsOworCisgICAgfQorCisgIH0KKworICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBpbXBsZW1lbnRhdGlvbi4gIEluIG90aGVyIHdvcmRzIHRoZSBhY3R1YWwgVFByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbgorICogZm9yIHRoZSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworCisgIHN0cmluZyBuYW1lID0gY29jb2FfcHJlZml4XyArIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIlByb2Nlc3NvciI7CisKKyAgb3V0IDw8ICJAaW50ZXJmYWNlICIgPDwgbmFtZSA8PCAiICgpICI7CisKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZCA8IiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+IHNlcnZpY2U7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TRGljdGlvbmFyeSAqIG1ldGhvZE1hcDsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKworICBvdXQgPDwgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IG5hbWUgPDwgZW5kbDsKKworICAvLyBpbml0aWFsaXplcgorICBvdXQgPDwgZW5kbDsKKyAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGgiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI6IChpZCA8IiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+KSBhU2VydmljZSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZikgIjsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzZXJ2aWNlID0gYVNlcnZpY2U7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIm1ldGhvZE1hcCA9IFtOU011dGFibGVEaWN0aW9uYXJ5IGRpY3Rpb25hcnldOyIgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSBtZXRob2QgbWFwIGZvciByb3V0aW5nIGluY29taW5nIGNhbGxzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJTRUwgcyA9IEBzZWxlY3Rvcihwcm9jZXNzXyIgPDwgZnVubmFtZSA8PCAiX3dpdGhTZXF1ZW5jZUlEOmluUHJvdG9jb2w6b3V0UHJvdG9jb2w6ZXJyb3I6KTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJOU01ldGhvZFNpZ25hdHVyZSAqIHNpZyA9IFtzZWxmIG1ldGhvZFNpZ25hdHVyZUZvclNlbGVjdG9yOiBzXTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJOU0ludm9jYXRpb24gKiBpbnZvY2F0aW9uID0gW05TSW52b2NhdGlvbiBpbnZvY2F0aW9uV2l0aE1ldGhvZFNpZ25hdHVyZTogc2lnXTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbaW52b2NhdGlvbiBzZXRTZWxlY3Rvcjogc107IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2ludm9jYXRpb24gcmV0YWluQXJndW1lbnRzXTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbbWV0aG9kTWFwIHNldFZhbHVlOiBpbnZvY2F0aW9uIGZvcktleTogQFwiIiA8PCBmdW5uYW1lIDw8ICJcIl07IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGY7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gaW1wbGVtZW50YXRpb24gb2YgdGhlICdzZXJ2aWNlJyBtZXRob2Qgd2hpY2ggcmV0dXJucyB0aGUgc2VydmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcworICAvLyBwcm9jZXNzb3IKKyAgb3V0IDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoaWQ8IiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+KSBzZXJ2aWNlIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gc2VydmljZTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFByb2Nlc3MgbWV0aG9kLCB3aGljaCBkaXNwYXRjaGVzIHRoZSBpbmNvbWluZyBjYWxsIHVzaW5nIHRoZSBtZXRob2QgbWFwCisgIG91dCA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKEJPT0wpIHByb2Nlc3NPbklucHV0UHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbCIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKilfX3RocmlmdEVycm9yIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU1N0cmluZyAqIG1lc3NhZ2VOYW1lOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFNJbnQzMiBtZXNzYWdlVHlwZTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBTSW50MzIgc2VxSUQ7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaWYgKCFbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTogJm1lc3NhZ2VOYW1lIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICZtZXNzYWdlVHlwZSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiAmc2VxSUQiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU0ludm9jYXRpb24gKiBpbnZvY2F0aW9uID0gW21ldGhvZE1hcCB2YWx1ZUZvcktleTogbWVzc2FnZU5hbWVdOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGlmIChpbnZvY2F0aW9uID09IG5pbCkgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgaWYgKCFbVFByb3RvY29sVXRpbCBza2lwVHlwZTogVFR5cGVTVFJVQ1Qgb25Qcm90b2NvbDogaW5Qcm90b2NvbCBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIGlmICghW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBOU0Vycm9yICogeCA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjogVEFwcGxpY2F0aW9uRXJyb3JEb21haW4iIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBUQXBwbGljYXRpb25FcnJvclVua25vd25NZXRob2QiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOiBAe1RBcHBsaWNhdGlvbkVycm9yTWV0aG9kS2V5OiBtZXNzYWdlTmFtZX1dOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTogbWVzc2FnZU5hbWUiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFRNZXNzYWdlVHlwZUVYQ0VQVElPTiIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogc2VxSUQiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBpZiAoIVt4IHdyaXRlOiBvdXRQcm90b2NvbCBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIGlmICghW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIGlmICghW1tvdXRQcm90b2NvbCB0cmFuc3BvcnRdIGZsdXNoOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuIFlFUzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgLy8gTlNJbnZvY2F0aW9uIGRvZXMgbm90IGNvbmZvcm0gdG8gTlNDb3B5aW5nIHByb3RvY29sIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNJbnZvY2F0aW9uICogaSA9IFtOU0ludm9jYXRpb24gaW52b2NhdGlvbldpdGhNZXRob2RTaWduYXR1cmU6ICIKKyAgICAgICAgICAgICAgICAgICAgICJbaW52b2NhdGlvbiBtZXRob2RTaWduYXR1cmVdXTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRTZWxlY3RvcjogW2ludm9jYXRpb24gc2VsZWN0b3JdXTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRBcmd1bWVudDogJnNlcUlEIGF0SW5kZXg6IDJdOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIHNldEFyZ3VtZW50OiAmaW5Qcm90b2NvbCBhdEluZGV4OiAzXTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRBcmd1bWVudDogJm91dFByb3RvY29sIGF0SW5kZXg6IDRdOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIHNldEFyZ3VtZW50OiAmX190aHJpZnRFcnJvciBhdEluZGV4OiA1XTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRUYXJnZXQ6IHNlbGZdOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIGludm9rZV07IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIFlFUzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSBhIHByb2Nlc3NfWFhYWCBtZXRob2QgZm9yIGVhY2ggc2VydmljZSBmdW5jdGlvbiwgd2hpY2ggcmVhZHMgYXJncywgY2FsbHMgdGhlIHNlcnZpY2UsCisgIC8vIGFuZCB3cml0ZXMgcmVzdWx0cworICBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIG91dCA8PCBlbmRsOworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoQk9PTCkgcHJvY2Vzc18iIDw8IGZ1bm5hbWUKKyAgICAgICAgPDwgIl93aXRoU2VxdWVuY2VJRDogKFNJbnQzMikgc2VxSUQgaW5Qcm90b2NvbDogKGlkPFRQcm90b2NvbD4pIGluUHJvdG9jb2wgb3V0UHJvdG9jb2w6ICIKKyAgICAgICAgICAgIihpZDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopX190aHJpZnRFcnJvciIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIHN0cmluZyBhcmdzdHlwZSA9IGNvY29hX3ByZWZpeF8gKyBmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0c2VydmljZSwgKmZfaXRlcik7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IGFyZ3N0eXBlIDw8ICIgKiBhcmdzID0gWyIgPDwgYXJnc3R5cGUgPDwgIiBuZXddOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW2FyZ3MgcmVhZDogaW5Qcm90b2NvbCBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtpblByb3RvY29sIHJlYWRNZXNzYWdlRW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICAgIC8vIHByZXBhcmUgdGhlIHJlc3VsdCBpZiBub3Qgb25ld2F5CisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBzdHJpbmcgcmVzdWx0dHlwZSA9IGNvY29hX3ByZWZpeF8gKyBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZXN1bHR0eXBlIDw8ICIgKiByZXN1bHQgPSBbIiA8PCByZXN1bHR0eXBlIDw8ICIgbmV3XTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gbWFrZSB0aGUgY2FsbCB0byB0aGUgYWN0dWFsIHNlcnZpY2Ugb2JqZWN0CisgICAgb3V0IDw8IGluZGVudCgpOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgb3V0IDw8ICJCT09MIjsKKyAgICB9IGVsc2UgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgb3V0IDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksIGZhbHNlLCB0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJOU051bWJlciAqIjsKKyAgICB9CisgICAgb3V0IDw8ICIgc2VydmljZVJlc3VsdCA9ICI7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X3RydWVfdHlwZSgpLT5pc19jb250YWluZXIoKSkgeworICAgICAgb3V0IDw8ICIoIiA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCBmYWxzZSwgdHJ1ZSkgPDwgIikiOworICAgIH0KKyAgICBvdXQgPDwgIltzZXJ2aWNlICIgPDwgZnVubmFtZTsKKyAgICAvLyBzdXBwbHlpbmcgYXJndW1lbnRzCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgc3RyaW5nIGZpZWxkTmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIG91dCA8PCAiOiBbYXJncyAiIDw8IGZpZWxkTmFtZSA8PCAiXSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIiAiIDw8IGZpZWxkTmFtZSA8PCAiOiBbYXJncyAiIDw8IGZpZWxkTmFtZSA8PCAiXSI7CisgICAgICB9CisgICAgfQorICAgIGlmICghZmllbGRzLmVtcHR5KCkpIHsKKyAgICAgIG91dCA8PCAiIGVycm9yIjsKKyAgICB9CisgICAgb3V0IDw8ICI6IF9fdGhyaWZ0RXJyb3JdOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghc2VydmljZVJlc3VsdCkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltyZXN1bHQgc2V0U3VjY2VzczogIiA8PCB1bmJveCgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksICJzZXJ2aWNlUmVzdWx0IikgPDwgIl07IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIHdyaXRlIG91dCB0aGUgcmVzdWx0IGlmIG5vdCBvbmV3YXkKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTogQFwiIiA8PCBmdW5uYW1lIDw8ICJcIiIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogVE1lc3NhZ2VUeXBlUkVQTFkiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IHNlcUlEIiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbcmVzdWx0IHdyaXRlOiBvdXRQcm90b2NvbCBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW1tvdXRQcm90b2NvbCB0cmFuc3BvcnRdIGZsdXNoOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCisgKiBAcGFyYW0gZmllbGROYW1lIFRoZSB2YXJpYWJsZSBuYW1lIGZvciB0aGlzIGZpZWxkCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBmaWVsZE5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgZmllbGROYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGZpZWxkTmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbaW5Qcm90b2NvbCAiOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnk6JiIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmc6JiIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJyZWFkQm9vbDomIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAicmVhZEJ5dGU6KFVJbnQ4ICopJiIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTE2OiYiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAicmVhZEkzMjomIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgInJlYWRJNjQ6JiIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlOiYiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBPYmplY3RpdmUtQyBuYW1lIGZvciBiYXNlIHR5cGUgIgorICAgICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgInJlYWRJMzI6JiIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICB9CisgICAgb3V0IDw8ICIpIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgYWxsb2NhdGVzIHRoZSBzdHJ1Y3QgYW5kIGludm9rZXMgcmVhZDoKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7CisgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCBmaWVsZE5hbWUgPDwgIiA9IFtbIiA8PCB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSkKKyAgICAgICAgICAgICAgPDwgIiBhbGxvY10gaW5pdF07IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbIiA8PCBmaWVsZE5hbWUgPDwgIiByZWFkOiBpblByb3RvY29sIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIGluZGVudChvdXQpIDw8ICJTSW50MzIgIiA8PCBzaXplIDw8ICI7IiA8PCBlbmRsOworCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZTogTlVMTCB2YWx1ZVR5cGU6IE5VTEwgc2l6ZTogJiIgPDwgc2l6ZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiTlNNdXRhYmxlRGljdGlvbmFyeSAqICIgPDwgZmllbGROYW1lCisgICAgICAgICAgICAgICAgPDwgIiA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTogIiA8PCBzaXplIDw8ICJdOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbaW5Qcm90b2NvbCByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogTlVMTCBzaXplOiAmIiA8PCBzaXplIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIk5TTXV0YWJsZVNldCAqICIgPDwgZmllbGROYW1lCisgICAgICAgICAgICAgICAgPDwgIiA9IFtbTlNNdXRhYmxlU2V0IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiAiIDw8IHNpemUgPDwgIl07IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbaW5Qcm90b2NvbCByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6IE5VTEwgc2l6ZTogJiIgPDwgc2l6ZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJOU011dGFibGVBcnJheSAqICIgPDwgZmllbGROYW1lCisgICAgICAgICAgICAgICAgPDwgIiA9IFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6ICIgPDwgc2l6ZSA8PCAiXTsiIDw8IGVuZGw7CisgIH0KKyAgLy8gRklYTUUgLSB0aGUgY29kZSBhYm92ZSBkb2VzIG5vdCB2ZXJpZnkgdGhhdCB0aGUgZWxlbWVudCB0eXBlcyBvZgorICAvLyB0aGUgY29udGFpbmVycyBiZWluZyByZWFkIG1hdGNoIHRoZSBlbGVtZW50IHR5cGVzIG9mIHRoZQorICAvLyBjb250YWluZXJzIHdlIGFyZSByZWFkaW5nIGludG8uICBEb2VzIHRoYXQgbWF0dGVyPworCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJpbnQgIiA8PCBpIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJmb3IgKCIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiCisgICAgICAgICAgICAgIDw8IHNpemUgPDwgIjsgIgorICAgICAgICAgICAgICA8PCAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBmaWVsZE5hbWUpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgZmllbGROYW1lKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGZpZWxkTmFtZSk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbaW5Qcm90b2NvbCByZWFkTWFwRW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbaW5Qcm90b2NvbCByZWFkU2V0RW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZExpc3RFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogVGFrZSBhIHZhcmlhYmxlIG9mIGEgZ2l2ZW4gdHlwZSBhbmQgd3JhcCBpdCBpbiBjb2RlIHRvIG1ha2UgaXQKKyAqIHN1aXRhYmxlIGZvciBwdXR0aW5nIGludG8gYSBjb250YWluZXIsIGlmIG5lY2Vzc2FyeS4gIEJhc2ljYWxseSwKKyAqIHdyYXAgc2NhbGVyIHByaW1pdGl2ZXMgaW4gTlNOdW1iZXIgb2JqZWN0cy4KKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpib3godF90eXBlKiB0dHlwZSwgc3RyaW5nIGZpZWxkX25hbWUpIHsKKworICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiQCgiICsgZmllbGRfbmFtZSArICIpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNhbid0IGJveCB2b2lkIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmV0dXJuICJAKCIgKyBmaWVsZF9uYW1lICsgIikiOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gZG8gbm90aGluZworICByZXR1cm4gZmllbGRfbmFtZTsKK30KKworLyoqCisgKiBFeHRyYWN0cyB0aGUgYWN0dWFsIHZhbHVlIGZyb20gYSBib3hlZCB2YWx1ZQorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OnVuYm94KHRfdHlwZSogdHR5cGUsIHN0cmluZyBmaWVsZF9uYW1lKSB7CisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJbIiArIGZpZWxkX25hbWUgKyAiIGludFZhbHVlXSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjYW4ndCB1bmJveCB2b2lkIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmV0dXJuICJbIiArIGZpZWxkX25hbWUgKyAiIGJvb2xWYWx1ZV0iOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgcmV0dXJuICIoKFNJbnQ4KVsiICsgZmllbGRfbmFtZSArICIgY2hhclZhbHVlXSkiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIHJldHVybiAiKChTSW50MTYpWyIgKyBmaWVsZF9uYW1lICsgIiBzaG9ydFZhbHVlXSkiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIHJldHVybiAiKChTSW50MzIpWyIgKyBmaWVsZF9uYW1lICsgIiBsb25nVmFsdWVdKSI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmV0dXJuICIoKFNJbnQ2NClbIiArIGZpZWxkX25hbWUgKyAiIGxvbmdMb25nVmFsdWVdKSI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmV0dXJuICJbIiArIGZpZWxkX25hbWUgKyAiIGRvdWJsZVZhbHVlXSI7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBkbyBub3RoaW5nCisgIHJldHVybiBmaWVsZF9uYW1lOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwIGVsZW1lbnQKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7CisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICB0X3R5cGUqIGtleVR5cGUgPSB0bWFwLT5nZXRfa2V5X3R5cGUoKTsKKyAgdF90eXBlKiB2YWxUeXBlID0gdG1hcC0+Z2V0X3ZhbF90eXBlKCk7CisgIHRfZmllbGQgZmtleShrZXlUeXBlLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodmFsVHlwZSwgdmFsKTsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5LCBrZXkpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsLCB2YWwpOworCisgIGluZGVudChvdXQpIDw8ICJbIiA8PCBmaWVsZE5hbWUgPDwgIiBzZXRPYmplY3Q6ICIgPDwgYm94KHZhbFR5cGUsIHZhbCkKKyAgICAgICAgICAgICAgPDwgIiBmb3JLZXk6ICIgPDwgYm94KGtleVR5cGUsIGtleSkgPDwgIl07IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50CisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF90eXBlKiB0eXBlID0gdHNldC0+Z2V0X2VsZW1fdHlwZSgpOworICB0X2ZpZWxkIGZlbGVtKHR5cGUsIGVsZW0pOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgZmllbGROYW1lIDw8ICIgYWRkT2JqZWN0OiAiIDw8IGJveCh0eXBlLCBlbGVtKSA8PCAiXTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50CisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X3R5cGUqIHR5cGUgPSB0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpOworICB0X2ZpZWxkIGZlbGVtKHR5cGUsIGVsZW0pOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgZmllbGROYW1lIDw8ICIgYWRkT2JqZWN0OiAiIDw8IGJveCh0eXBlLCBlbGVtKSA8PCAiXTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIGZpZWxkTmFtZSBOYW1lIHRvIG9mIHRoZSB2YXJpYWJsZSBob2xkaW5nIHRoZSBmaWVsZAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBmaWVsZE5hbWUpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgZmllbGROYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBmaWVsZE5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCAiOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgZmllbGROYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5OiAiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZzogIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbDogIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlOiAoVUludDgpIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2OiAiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAid3JpdGVJMzI6ICIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NDogIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlOiAiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBPYmplY3RpdmUtQyBuYW1lIGZvciBiYXNlIHR5cGUgIgorICAgICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyOiAiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgfQorICAgIG91dCA8PCAiKSByZXR1cm4gTk87IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZSBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIGZpZWxkTmFtZSBOYW1lIG9mIHZhcmlhYmxlIGhvbGRpbmcgc3RydWN0CisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgeworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghWyIgPDwgZmllbGROYW1lIDw8ICIgd3JpdGU6IG91dFByb3RvY29sIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKKyAqIEBwYXJhbSBmaWVsZE5hbWUgTmFtZSBvZiB2YXJpYWJsZSBob2xkaW5nIGNvbnRhaW5lcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgeworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOiAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiB2YWx1ZVR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIgc2l6ZTogKFNJbnQzMilbIgorICAgICAgICAgICAgICAgIDw8IGZpZWxkTmFtZSA8PCAiIGNvdW50XSBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGU6ICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgc2l6ZTogKFNJbnQzMilbIiA8PCBmaWVsZE5hbWUKKyAgICAgICAgICAgICAgICA8PCAiIGNvdW50XSBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZTogIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgc2l6ZTogKFNJbnQzMilbIiA8PCBmaWVsZE5hbWUKKyAgICAgICAgICAgICAgICA8PCAiIGNvdW50XSBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgc3RyaW5nIGtleTsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGtleSA9IHRtcCgia2V5Iik7CisgICAgaW5kZW50KG91dCkgPDwgIk5TRW51bWVyYXRvciAqICIgPDwgaXRlciA8PCAiID0gWyIgPDwgZmllbGROYW1lIDw8ICIga2V5RW51bWVyYXRvcl07IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJpZCAiIDw8IGtleSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKCgiIDw8IGtleSA8PCAiID0gWyIgPDwgaXRlciA8PCAiIG5leHRPYmplY3RdKSkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAga2V5ID0gdG1wKCJvYmoiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiTlNFbnVtZXJhdG9yICogIiA8PCBpdGVyIDw8ICIgPSBbIiA8PCBmaWVsZE5hbWUgPDwgIiBvYmplY3RFbnVtZXJhdG9yXTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWQgIiA8PCBrZXkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIndoaWxlICgoIiA8PCBrZXkgPDwgIiA9IFsiIDw8IGl0ZXIgPDwgIiBuZXh0T2JqZWN0XSkpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBrZXkgPSB0bXAoImlkeCIpOworICAgIGluZGVudChvdXQpIDw8ICJpbnQgIiA8PCBrZXkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAoIiA8PCBrZXkgPDwgIiA9IDA7ICIgPDwga2V5IDw8ICIgPCBbIiA8PCBmaWVsZE5hbWUgPDwgIiBjb3VudF07ICIgPDwga2V5CisgICAgICAgICAgICAgICAgPDwgIisrKSIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtleSwgZmllbGROYW1lKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBrZXkpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGtleSwgZmllbGROYW1lKTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlTWFwRW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVTZXRFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVMaXN0RW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcE5hbWUpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsIHVuYm94KGtmaWVsZC5nZXRfdHlwZSgpLCBrZXkpKTsKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksICJbIiArIG1hcE5hbWUgKyAiIG9iamVjdEZvcktleTogIiArIGtleSArICJdIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsIHVuYm94KHZmaWVsZC5nZXRfdHlwZSgpLCB2ZmllbGQuZ2V0X25hbWUoKSkpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGVsZW1lbnROYW1lKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbWVudE5hbWUpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCB1bmJveChlZmllbGQuZ2V0X3R5cGUoKSwgZWxlbWVudE5hbWUpKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGxpc3ROYW1lKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksICJbIiArIGxpc3ROYW1lICsgIiBvYmplY3RBdEluZGV4OiAiICsgaW5kZXggKyAiXSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCB1bmJveChlZmllbGQuZ2V0X3R5cGUoKSwgZWZpZWxkLmdldF9uYW1lKCkpKTsKK30KKworLyoqCisgKiBSZXR1cm5zIGFuIE9iamVjdGl2ZS1DIG5hbWUKKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqIEBwYXJhbSBjbGFzc19yZWYgRG8gd2Ugd2FudCBhIENsYXNzIHJlZmVyZW5jZSBpc3RlYWQgb2YgYSB0eXBlIHJlZmVyZW5jZT8KKyAqIEByZXR1cm4gT2JqZWN0aXZlLUMgdHlwZSBuYW1lLCBpLmUuIE5TRGljdGlvbmFyeTxLZXksVmFsdWU+ICoKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBjbGFzc19yZWYsIGJvb2wgbmVlZHNfbXV0YWJsZSkgeworICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHN0cmluZyBuYW1lID0gKG5lZWRzX211dGFibGUgJiYgdHR5cGUtPmdldF90cnVlX3R5cGUoKS0+aXNfY29udGFpbmVyKCkpID8gIk11dGFibGUiICsgdHR5cGUtPmdldF9uYW1lKCkgOiB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgICByZXR1cm4gcHJvZ3JhbSA/IChwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjb2NvYSIpICsgbmFtZSkgOiBuYW1lOworICB9CisKKyAgc3RyaW5nIHJlc3VsdDsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuIGNvY29hX3ByZWZpeF8gKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCAqbWFwID0gKHRfbWFwICopdHR5cGU7CisgICAgcmVzdWx0ID0gbmVlZHNfbXV0YWJsZSA/ICJOU011dGFibGVEaWN0aW9uYXJ5IiA6ICJOU0RpY3Rpb25hcnkiOworICAgIHJlc3VsdCArPSAiPCIgKyBlbGVtZW50X3R5cGVfbmFtZShtYXAtPmdldF9rZXlfdHlwZSgpKSArICIsICIgKyBlbGVtZW50X3R5cGVfbmFtZShtYXAtPmdldF92YWxfdHlwZSgpKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCAqc2V0ID0gKHRfc2V0ICopdHR5cGU7CisgICAgcmVzdWx0ID0gbmVlZHNfbXV0YWJsZSA/ICJOU011dGFibGVTZXQiIDogIk5TU2V0IjsKKyAgICByZXN1bHQgKz0gIjwiICsgZWxlbWVudF90eXBlX25hbWUoc2V0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QgKmxpc3QgPSAodF9saXN0ICopdHR5cGU7CisgICAgcmVzdWx0ID0gbmVlZHNfbXV0YWJsZSA/ICJOU011dGFibGVBcnJheSIgOiAiTlNBcnJheSI7CisgICAgcmVzdWx0ICs9ICI8IiArIGVsZW1lbnRfdHlwZV9uYW1lKGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0gZWxzZSB7CisgICAgLy8gQ2hlY2sgZm9yIHByZWZpeAorICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICAgIGlmIChwcm9ncmFtICE9IE5VTEwpIHsKKyAgICAgIHJlc3VsdCA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImNvY29hIikgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ID0gdHR5cGUtPmdldF9uYW1lKCk7CisgICAgfQorICB9CisKKyAgaWYgKCFjbGFzc19yZWYpIHsKKyAgICByZXN1bHQgKz0gIiAqIjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJldHVybnMgYW4gT2JqZWN0aXZlLUMgdHlwZSBuYW1lIGZvciBjb250YWluZXIgdHlwZXMKKyAqCisgKiBAcGFyYW0gdHR5cGUgdGhlIHR5cGUKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjplbGVtZW50X3R5cGVfbmFtZSh0X3R5cGUqIGV0eXBlKSB7CisKKyAgdF90eXBlKiB0dHlwZSA9IGV0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7CisKKyAgaWYgKGV0eXBlLT5pc190eXBlZGVmKCkgJiYgdHlwZV9jYW5fYmVfbnVsbCh0dHlwZSkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKGV0eXBlKTsKKyAgfQorCisgIHN0cmluZyByZXN1bHQ7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2UgPSAodF9iYXNlX3R5cGUqKXR0eXBlOworICAgIHN3aXRjaCAodGJhc2UtPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0YmFzZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgcmVzdWx0ID0gIk5TRGF0YSAqIjsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICByZXN1bHQgPSAiTlNTdHJpbmcgKiI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmVzdWx0ID0gIk5TTnVtYmVyICoiOworICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCA9ICJOU051bWJlciAqIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCAqbWFwID0gKHRfbWFwICopdHR5cGU7CisgICAgcmVzdWx0ID0gIk5TRGljdGlvbmFyeTwiICsgZWxlbWVudF90eXBlX25hbWUobWFwLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiICsgZWxlbWVudF90eXBlX25hbWUobWFwLT5nZXRfdmFsX3R5cGUoKSkgKyAiPiAqIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCAqc2V0ID0gKHRfc2V0ICopdHR5cGU7CisgICAgcmVzdWx0ID0gIk5TU2V0PCIgKyBlbGVtZW50X3R5cGVfbmFtZShzZXQtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiAqIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0ICpsaXN0ID0gKHRfbGlzdCAqKXR0eXBlOworICAgIHJlc3VsdCA9ICJOU0FycmF5PCIgKyBlbGVtZW50X3R5cGVfbmFtZShsaXN0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4gKiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmVzdWx0ID0gY29jb2FfcHJlZml4XyArIHR0eXBlLT5nZXRfbmFtZSgpICsgIiAqIjsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgT2JqZWN0aXZlLUMgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlKSB7CisgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOworCisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAidm9pZCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgcmV0dXJuICJOU0RhdGEgKiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiTlNTdHJpbmcgKiI7CisgICAgfQorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuICJCT09MIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICByZXR1cm4gIlNJbnQ4IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgcmV0dXJuICJTSW50MTYiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gIlNJbnQzMiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAiU0ludDY0IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuICJkb3VibGUiOworICBkZWZhdWx0OgorICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gT2JqZWN0aXZlLUMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICB9Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsIHZhbHVlKTsKKyAgICBpbmRlbnQob3V0KTsKKyAgICBpZiAoZGVmdmFsKQorICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KTsKKyAgICBpZiAoZGVmdmFsKQorICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgdHlwZSwgdmFsdWUpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGluZGVudChvdXQpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGlmIChkZWZ2YWwpCisgICAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gWyIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUpIDw8ICIgbmV3XTsiCisgICAgICAgIDw8IGVuZGw7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGNhcGl0YWxpemUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJbIiA8PCBuYW1lIDw8ICIgc2V0IiA8PCBjYXBfbmFtZSA8PCAiOiIgPDwgdmFsIDw8ICJdOyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvc3RyaW5nc3RyZWFtIG1hcG91dDsKKyAgICBpbmRlbnQobWFwb3V0KTsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBpZiAoZGVmdmFsKQorICAgICAgbWFwb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgbWFwb3V0IDw8IG5hbWUgPDwgIiA9IEB7IjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOykgeworICAgICAgbWFwb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGt0eXBlLCB2X2l0ZXItPmZpcnN0LCB0cnVlKSA8PCAiOiAiCisgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgdnR5cGUsIHZfaXRlci0+c2Vjb25kLCB0cnVlKTsKKyAgICAgIGlmICgrK3ZfaXRlciAhPSB2YWwuZW5kKCkpIHsKKyAgICAgICAgbWFwb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgfQorICAgIG1hcG91dCA8PCAifSI7CisgICAgb3V0IDw8IG1hcG91dC5zdHIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvc3RyaW5nc3RyZWFtIGxpc3RvdXQ7CisgICAgaW5kZW50KGxpc3RvdXQpOworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgaWYgKGRlZnZhbCkKKyAgICAgIGxpc3RvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgICBsaXN0b3V0IDw8IG5hbWUgPDwgIiA9IEBbIjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOykgeworICAgICAgbGlzdG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBldHlwZSwgKnZfaXRlciwgdHJ1ZSk7CisgICAgICBpZiAoKyt2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIGxpc3RvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICB9CisgICAgbGlzdG91dCA8PCAiXSI7CisgICAgb3V0IDw8IGxpc3RvdXQuc3RyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvc3RyaW5nc3RyZWFtIHNldG91dDsKKyAgICBpbmRlbnQoc2V0b3V0KTsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgaWYgKGRlZnZhbCkKKyAgICAgIHNldG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIHNldG91dCA8PCBuYW1lIDw8ICIgPSBbTlNTZXQgc2V0V2l0aEFycmF5OkBbIjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOykgeworICAgICAgc2V0b3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGV0eXBlLCAqdl9pdGVyLCB0cnVlKTsKKyAgICAgIGlmICgrK3ZfaXRlciAhPSB2YWwuZW5kKCkpIHsKKyAgICAgICAgc2V0b3V0IDw8ICIsICI7CisgICAgICB9CisgICAgfQorICAgIHNldG91dCA8PCAiXV0iOworICAgIG91dCA8PCBzZXRvdXQuc3RyKCk7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBib3hfaXQpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIC8vIFdlIG11c3QgaGFuZGxlIGJpbmFyeSBjb25zdGFudCBidXQgdGhlIHN5bnRheCBvZiBJREwgZGVmaW5lcworICAgICAgLy8gbm90aGluZyBhYm91dCBiaW5hcnkgY29uc3RhbnQuCisgICAgICAvLyAgIGlmIHR5cGUtPmlzX2JpbmFyeSgpKQorICAgICAgLy8gICAgICAvLyBiaW5hcnkgY29kZQorICAgICAgcmVuZGVyIDw8ICJAXCIiIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJZRVMiIDogIk5PIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgeworICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKKyAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlKTsKKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgcmVuZGVyIDw8IHQ7CisgIH0KKworICBpZiAoYm94X2l0KSB7CisgICAgcmV0dXJuIGJveCh0eXBlLCByZW5kZXIuc3RyKCkpOworICB9CisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKyNpZiAwCisvKioKK09SSUdJTkFMCisgKiBTcGl0IG91dCBjb2RlIHRoYXQgZXZhbHVhdGVzIHRvIHRoZSBzcGVjaWZpZWQgY29uc3RhbnQgdmFsdWUuCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJveF9pdCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmVuZGVyIDw8ICJAXCIiIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJZRVMiIDogIk5PIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBpZiAodmFsLnNpemUoKSA+IDApCisgICAgICByZW5kZXIgPDwgIltbIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSkgPDwgIiBhbGxvY10gaW5pdFdpdGgiOworICAgIGVsc2UKKyAgICAgIHJlbmRlciA8PCAiW1siIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlKSA8PCAiIGFsbG9jXSBpbml0IjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgLy8gRklYTUUgVGhlIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IG1hdGNoIHdpdGggaW5pdFdpdGhYWFgKKyAgICAgIC8vICAgICAgIGluaXRpYWxpemVyIGFuZCBjYXVzZXMgY29tcGlsZSBlcnJvci4KKyAgICAgIC8vICAgICAgIFRyeTogdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgYW5kIHRlc3QvU21hbGxUZXN0LnRocmlmdAorICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIHJlbmRlciA8PCBjYXBpdGFsaXplKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSk7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgIiAiIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIHJlbmRlciA8PCAiOiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgfQorICAgIHJlbmRlciA8PCAiXSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZW5kZXIgPDwgIltbTlNEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aE9iamVjdHNBbmRLZXlzOiAiOworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0LCB0cnVlKTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kLCB0cnVlKTsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8ICIsICI7CisgICAgICB9CisgICAgICByZW5kZXIgPDwgdmFsIDw8ICIsICIgPDwga2V5OworICAgIH0KKyAgICBpZiAoZmlyc3QpCisgICAgICByZW5kZXIgPDwgIiBuaWxdIjsKKyAgICBlbHNlCisgICAgICByZW5kZXIgPDwgIiwgbmlsXSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmVuZGVyIDw8ICJbW05TQXJyYXkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czogIjsKKyAgICB0X3R5cGUgKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIHJlbmRlciA8PCByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgZXR5cGUsICp2X2l0ZXIsIHRydWUpOworICAgIH0KKyAgICBpZiAoZmlyc3QpCisgICAgICByZW5kZXIgPDwgIiBuaWxdIjsKKyAgICBlbHNlCisgICAgICByZW5kZXIgPDwgIiwgbmlsXSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZW5kZXIgPDwgIltbTlNTZXQgYWxsb2NdIGluaXRXaXRoT2JqZWN0czogIjsKKyAgICB0X3R5cGUgKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCAiLCAiOworICAgICAgfQorICAgICAgcmVuZGVyIDw8IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCBldHlwZSwgKnZfaXRlciwgdHJ1ZSk7CisgICAgfQorICAgIGlmIChmaXJzdCkKKyAgICAgIHJlbmRlciA8PCAiIG5pbF0iOworICAgIGVsc2UKKyAgICAgIHJlbmRlciA8PCAiLCBuaWxdIjsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiZG9uJ3Qga25vdyBob3cgdG8gcmVuZGVyIGNvbnN0YW50IGZvciB0eXBlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmIChib3hfaXQpIHsKKyAgICByZXR1cm4gYm94KHR5cGUsIHJlbmRlci5zdHIoKSk7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorI2VuZGlmCisKKy8qKgorICogRGVjbGFyZXMgYW4gT2JqZWN0aXZlLUMgMi4wIHByb3BlcnR5LgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIGRlY2xhcmUgYSBwcm9wZXJ0eSBmb3IKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpkZWNsYXJlX3Byb3BlcnR5KHRfZmllbGQqIHRmaWVsZCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworICByZW5kZXIgPDwgIkBwcm9wZXJ0eSAoIjsKKworICBpZiAodHlwZV9jYW5fYmVfY29weSh0ZmllbGQtPmdldF90eXBlKCkpKSB7CisgICAgcmVuZGVyIDw8ICJjb3B5LCAiOworICB9IGVsc2UgaWYgKHR5cGVfY2FuX2JlX251bGwodGZpZWxkLT5nZXRfdHlwZSgpKSkgeworICAgIHJlbmRlciA8PCAic3Ryb25nLCAiOworICB9IGVsc2UgeworICAgIHJlbmRlciA8PCAiYXNzaWduLCAiOworICB9CisKKyAgcmVuZGVyIDw8ICJub25hdG9taWMpICIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgZmFsc2UsIHRydWUpIDw8ICIgIgorICA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiOworCisgIC8vIENoZWNrIGlmIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIGFuIE9iamVjdGl2ZS1DIHJldHVybiArMSBjb3VudCBzaWduYWwKKyAgaWYgKCh0ZmllbGQtPmdldF9uYW1lKCkubGVuZ3RoKCkgPj0gMyAmJiB0ZmllbGQtPmdldF9uYW1lKCkuc3Vic3RyKDAsMykgPT0gIm5ldyIpIHx8CisgICAgICAodGZpZWxkLT5nZXRfbmFtZSgpLmxlbmd0aCgpID49IDYgJiYgdGZpZWxkLT5nZXRfbmFtZSgpLnN1YnN0cigwLDYpID09ICJjcmVhdGUiKSB8fAorICAgICAgKHRmaWVsZC0+Z2V0X25hbWUoKS5sZW5ndGgoKSA+PSA1ICYmIHRmaWVsZC0+Z2V0X25hbWUoKS5zdWJzdHIoMCw1KSA9PSAiYWxsb2MiKSkgeworICAgIC8vIExldCBPYmplY3RpdmUtQyBrbm93IG5vdCB0byByZXR1cm4gKzEgZm9yIG9iamVjdCBwb2ludGVycworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHRmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIHJlbmRlciA8PCBlbmRsOworICAgICAgcmVuZGVyIDw8ICItICgiICsgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiKSAiICsgZGVjYXBpdGFsaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkgKyAiIF9fYXR0cmlidXRlX18oKG9iamNfbWV0aG9kX2ZhbWlseShub25lKSkpOyI7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKworLyoqCisgKiBEZWNsYXJlcyBhbiBPYmplY3RpdmUtQyAyLjAgcHJvcGVydHkuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gZGVjbGFyZSBhIHByb3BlcnR5IGZvcgorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmRlY2xhcmVfcHJvcGVydHlfaXNzZXQodF9maWVsZCogdGZpZWxkKSB7CisgIHJldHVybiAiQHByb3BlcnR5IChhc3NpZ24sIG5vbmF0b21pYykgQk9PTCAiICsgZGVjYXBpdGFsaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkgKyAiSXNTZXQ7IjsKK30KKworLyoqCisgKiBEZWNsYXJlcyBwcm9wZXJ0eSB1bnNldCBtZXRob2QuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gZGVjbGFyZSBhIHByb3BlcnR5IGZvcgorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmRlY2xhcmVfcHJvcGVydHlfdW5zZXQodF9maWVsZCogdGZpZWxkKSB7CisgIHJldHVybiAiLSAodm9pZCkgdW5zZXQiICsgY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpICsgIjsiOworfQorCisvKioKKyAqIFJlbmRlcnMgdGhlIGVhcmx5IG91dCByZXR1cm4gc3RhdGVtZW50CisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBpbnZhbGlkIHJldHVybiBzdGF0bWVudAorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmludmFsaWRfcmV0dXJuX3N0YXRlbWVudCh0X2Z1bmN0aW9uICp0ZnVuY3Rpb24pIHsKKyAgaWYgKCh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkpIHsKKyAgICByZXR1cm4gInJldHVybiBOTzsiOworICB9CisgIHJldHVybiAicmV0dXJuIG5pbDsiOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGluY2x1ZGVfZXJyb3IpIHsKKyAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgc3RyaW5nIHJlc3VsdDsKKyAgaWYgKHR0eXBlLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQgPSAiKEJPT0wpIjsKKyAgfQorICBlbHNlIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR0eXBlKSkgeworICAgIHJlc3VsdCA9ICIoIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiKSI7CisgIH0KKyAgZWxzZSB7CisgICAgcmVzdWx0ID0gIihOU051bWJlciAqKSI7CisgIH0KKyAgcmVzdWx0ICs9ICIgIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiIiwgaW5jbHVkZV9lcnJvcik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSB0aGF0IHJldHVybnMgYXN5bmNocm9ub3VzbHkgaW5zdGVhZCBvZgorICogbGl0ZXJhbGx5IHJldHVybmluZy4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjphc3luY19mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGluY2x1ZGVfZXJyb3IpIHsKKyAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgdF9zdHJ1Y3QqIHRhcmdsaXN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBzdHJpbmcgcmVzcG9uc2VfcGFyYW0gPSAidm9pZCAoXikoIiArICgodHR5cGUtPmlzX3ZvaWQoKSkgPyAiIiA6IHR5cGVfbmFtZSh0dHlwZSkpICsgIikiOworICBzdGQ6OnN0cmluZyByZXN1bHQgPSAiKHZvaWQpICIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIiIsIGluY2x1ZGVfZXJyb3IpCisgICsgKHRhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA/ICIgcmVzcG9uc2UiIDogIiIpICsgIjogKCIKKyAgKyByZXNwb25zZV9wYXJhbSArICIpIHJlc3BvbnNlQmxvY2sgIgorICArICJmYWlsdXJlIDogKFRBc3luY0ZhaWx1cmVCbG9jaykgZmFpbHVyZUJsb2NrIjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIHRoYXQgcmV0dXJucyBhIHByb21pc2UgaW5zdGVhZCBvZgorICogbGl0ZXJhbGx5IHJldHVybmluZy4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpwcm9taXNlX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgcmV0dXJuICIoQW55UHJvbWlzZSAqKSAiICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICIiLCBmYWxzZSk7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIHR5cGVzIGFuZCBuYW1lcywgc3VpdGFibGUgZm9yIGFuCisgKiBvYmplY3RpdmUtYyBwYXJhbWV0ZXIgbGlzdAorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcm90b2NvbF9uYW1lLCBib29sIGluY2x1ZGVfZXJyb3IpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBib29sIGluY2x1ZGVfcHJvdG9jb2wgPSAhcHJvdG9jb2xfbmFtZS5lbXB0eSgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGFyZ1ByZWZpeCA9ICIiOworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgYXJnUHJlZml4ID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgcmVzdWx0ICs9ICIgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9IGFyZ1ByZWZpeCArICI6ICgiICsgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiKSAiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIGlmIChpbmNsdWRlX3Byb3RvY29sKSB7CisgICAgaWYgKCFmaXJzdCkgeworICAgICAgcmVzdWx0ICs9ICIgcHJvdG9jb2wiOworICAgIH0KKyAgICByZXN1bHQgKz0gIjogKGlkPFRQcm90b2NvbD4pICIgKyBwcm90b2NvbF9uYW1lOworICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKyAgaWYgKGluY2x1ZGVfZXJyb3IpIHsKKyAgICBpZiAoIWZpcnN0KSB7CisgICAgICByZXN1bHQgKz0gIiBlcnJvciI7CisgICAgfQorICAgIHJlc3VsdCArPSAiOiAoTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopX190aHJpZnRFcnJvciI7CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGFuIE9iamVjdGl2ZS1DIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZVNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZUJPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGVJMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZUk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZUkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGVTVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZU1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogUmV0dXJucyBhIGZvcm1hdCBzdHJpbmcgc3BlY2lmaWVyIGZvciB0aGUgc3VwcGxpZWQgcGFyc2UgdHlwZS4KKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpmb3JtYXRfc3RyaW5nX2Zvcl90eXBlKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiXFxcIiVAXFxcIiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICIlaSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiJWkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICIlaGkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICIlaSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIiVxaSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIiVmIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICIlaSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiJUAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICIlQCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIiVAIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIiVAIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gZm9ybWF0X3N0cmluZ19mb3JfdHlwZTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogUmV0dXJucyBhIGZvcm1hdCBjYXN0IGZvciB0aGUgc3VwcGxpZWQgcGFyc2UgdHlwZS4KKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpmb3JtYXRfY2FzdF9mb3JfdHlwZSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIiI7IC8vICJcXFwiJUBcXFwiIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIiI7IC8vICIlaSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiIjsgLy8gIiVpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiIjsgLy8gIiVoaSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIihpbnQpIjsgLy8gIiVpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiIjsgLy8gIiVxaSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIiI7IC8vICIlZiI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiKGludCkiOyAvLyAiJWkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIiI7IC8vICIlQCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIiI7IC8vICIlQCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIiI7IC8vICIlQCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICIiOyAvLyAiJUAiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBmb3JtYXRfY2FzdF9mb3JfdHlwZTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSBjYWxsIHRvIGEgZmllbGQncyBzZXR0ZXIuCisgKgorICogQHBhcmFtIHRmaWVsZCBGaWVsZCB0aGUgc2V0dGVyIGlzIGJlaW5nIGNhbGxlZCBvbgorICogQHBhcmFtIGZpZWxkTmFtZSBOYW1lIG9mIHZhcmlhYmxlIHRvIHBhc3MgdG8gc2V0dGVyCisgKi8KKworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpjYWxsX2ZpZWxkX3NldHRlcih0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBmaWVsZE5hbWUpIHsKKyAgcmV0dXJuICJzZWxmLiIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAiID0gIiArIGZpZWxkTmFtZSArICI7IjsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBjb2NvYSwKKyAgICAiQ29jb2EiLAorICAgICIgICAgbG9nX3VuZXhwZWN0ZWQ6ICBMb2cgZXZlcnkgdGltZSBhbiB1bmV4cGVjdGVkIGZpZWxkIElEIG9yIHR5cGUgaXMgZW5jb3VudGVyZWQuXG4iCisgICAgIiAgICBkZWJ1Z19kZXNjcmlwdGlvbnM6XG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIEFsbG93IHVzZSBvZiBkZWJ1Z0Rlc2NyaXB0aW9uIHNvIHRoZSBhcHAgY2FuIGFkZCBkZXNjcmlwdGlvbiB2aWEgYSBjYXRlb2dvcnkvZXh0ZW5zaW9uXG4iCisgICAgIiAgICB2YWxpZGF0ZV9yZXF1aXJlZDpcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgVGhyb3dzIGV4Y2VwdGlvbiBpZiBhbnkgcmVxdWlyZWQgZmllbGQgaXMgbm90IHNldC5cbiIKKyAgICAiICAgIGFzeW5jX2NsaWVudHM6ICAgR2VuZXJhdGUgY2xpZW50cyB3aGljaCBpbnZva2UgYXN5bmNocm9ub3VzbHkgdmlhIGJsb2NrIHN5bnRheC5cbiIKKyAgICAiICAgIHBvZHM6ICAgICAgICAgICAgR2VuZXJhdGUgaW1wb3J0cyBpbiBDb2NvcG9kcyBmcmFtZXdvcmsgZm9ybWF0LlxuIgorICAgICIgICAgcHJvbWlzZV9raXQ6ICAgICBHZW5lcmF0ZSBjbGllbnRzIHdoaWNoIGludm9rZSBhc3luY2hyb25vdXNseSB2aWEgcHJvbWlzZXMuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMzAzNjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSw0NDkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEMrKyBjb2RlIGdlbmVyYXRvci4gVGhpcyBpcyBsZWdpdGltYWN5IGluY2FybmF0ZS4KKyAqCisgKi8KK2NsYXNzIHRfY3BwX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2NwcF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisKKyAgICBnZW5fcHVyZV9lbnVtc18gPSBmYWxzZTsKKyAgICB1c2VfaW5jbHVkZV9wcmVmaXhfID0gZmFsc2U7CisgICAgZ2VuX2NvYl9zdHlsZV8gPSBmYWxzZTsKKyAgICBnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fID0gZmFsc2U7CisgICAgZ2VuX25vX2RlZmF1bHRfb3BlcmF0b3JzXyA9IGZhbHNlOworICAgIGdlbl90ZW1wbGF0ZXNfID0gZmFsc2U7CisgICAgZ2VuX3RlbXBsYXRlc19vbmx5XyA9IGZhbHNlOworICAgIGdlbl9tb3ZlYWJsZV8gPSBmYWxzZTsKKyAgICBnZW5fbm9fb3N0cmVhbV9vcGVyYXRvcnNfID0gZmFsc2U7CisgICAgZ2VuX25vX3NrZWxldG9uXyA9IGZhbHNlOworCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicHVyZV9lbnVtcyIpID09IDApIHsKKyAgICAgICAgZ2VuX3B1cmVfZW51bXNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiaW5jbHVkZV9wcmVmaXgiKSA9PSAwKSB7CisgICAgICAgIHVzZV9pbmNsdWRlX3ByZWZpeF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJjb2Jfc3R5bGUiKSA9PSAwKSB7CisgICAgICAgIGdlbl9jb2Jfc3R5bGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9fY2xpZW50X2NvbXBsZXRpb24iKSA9PSAwKSB7CisgICAgICAgIGdlbl9ub19jbGllbnRfY29tcGxldGlvbl8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub19kZWZhdWx0X29wZXJhdG9ycyIpID09IDApIHsKKyAgICAgICAgZ2VuX25vX2RlZmF1bHRfb3BlcmF0b3JzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInRlbXBsYXRlcyIpID09IDApIHsKKyAgICAgICAgZ2VuX3RlbXBsYXRlc18gPSB0cnVlOworICAgICAgICBnZW5fdGVtcGxhdGVzX29ubHlfID0gKGl0ZXItPnNlY29uZCA9PSAib25seSIpOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJtb3ZlYWJsZV90eXBlcyIpID09IDApIHsKKyAgICAgICAgZ2VuX21vdmVhYmxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub19vc3RyZWFtX29wZXJhdG9ycyIpID09IDApIHsKKyAgICAgICAgZ2VuX25vX29zdHJlYW1fb3BlcmF0b3JzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub19za2VsZXRvbiIpID09IDApIHsKKyAgICAgICAgZ2VuX25vX3NrZWxldG9uXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gY3BwOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1jcHAiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2VudW1fb3N0cmVhbV9vcGVyYXRvcl9kZWNsKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtX29zdHJlYW1fb3BlcmF0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeyBnZW5lcmF0ZV9jcHBfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsgfQorICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsgZ2VuZXJhdGVfY3BwX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOyB9CisgIHZvaWQgZ2VuZXJhdGVfY3BwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9kZWNsYXJhdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcnMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWFkID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3cml0ZSA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3dhcCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VzZXJfc3RydWN0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgZm9yY2VfY3BwX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNldHRlcnMgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdXNlcl9zdHJ1Y3QgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfY29weV9jb25zdHJ1Y3RvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9tb3ZlX2NvbnN0cnVjdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0cnVjdG9yX2hlbHBlcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjcGV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21vdmUpOworICB2b2lkIGdlbmVyYXRlX2Fzc2lnbm1lbnRfb3BlcmF0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9tb3ZlX2Fzc2lnbm1lbnRfb3BlcmF0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9hc3NpZ25tZW50X2hlbHBlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfbW92ZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgcG9pbnRlcnMgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgcG9pbnRlcnMgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9zd2FwKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3ByaW50X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZV9mYWN0b3J5KHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9udWxsKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9tdWx0aWZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NrZWxldG9uKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3BlY2lhbGl6ZWQgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2tlbGV0b24odF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdWZmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHVzaF9iYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpbmRleCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN1ZmZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25fY2FsbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFyZ19wcmVmaXgpOworICAvKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfcHJlZml4KHN0ZDo6c3RyaW5nIG5zKTsKKyAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX29wZW4oc3RkOjpzdHJpbmcgbnMpOworICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfY2xvc2Uoc3RkOjpzdHJpbmcgbnMpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmID0gZmFsc2UsIGJvb2wgYXJnID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbml0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb25zdGFudCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVmZXJlbmNlID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmFtZV9wYXJhbXMgPSB0cnVlKTsKKyAgc3RkOjpzdHJpbmcgY29iX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuYW1lX3BhcmFtcyA9IHRydWUpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIG5hbWVfcGFyYW1zID0gdHJ1ZSwgYm9vbCBzdGFydF9jb21tYSA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworCisgIHZvaWQgZ2VuZXJhdGVfZW51bV9jb25zdGFudF9saXN0KHN0ZDo6b3N0cmVhbSYgZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZW51bV92YWx1ZSo+JiBjb25zdGFudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfdmFsdWVzKTsKKworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9vc3RyZWFtX29wZXJhdG9yX2RlY2woc3RkOjpvc3RyZWFtJiBmLCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X29zdHJlYW1fb3BlcmF0b3Ioc3RkOjpvc3RyZWFtJiBmLCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3ByaW50X21ldGhvZF9kZWNsKHN0ZDo6b3N0cmVhbSYgZiwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZF9kZWNsKHN0ZDo6b3N0cmVhbSYgZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4dGVybmFsID0gZmFsc2UpOworCisgIGJvb2wgaXNfcmVmZXJlbmNlKHRfZmllbGQqIHRmaWVsZCkgeyByZXR1cm4gdGZpZWxkLT5nZXRfcmVmZXJlbmNlKCk7IH0KKworICBib29sIGlzX2NvbXBsZXhfdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpCisgICAgICAgICAgIHx8ICh0dHlwZS0+aXNfYmFzZV90eXBlKCkKKyAgICAgICAgICAgICAgICYmICgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSk7CisgIH0KKworICB2b2lkIHNldF91c2VfaW5jbHVkZV9wcmVmaXgoYm9vbCB1c2VfaW5jbHVkZV9wcmVmaXgpIHsgdXNlX2luY2x1ZGVfcHJlZml4XyA9IHVzZV9pbmNsdWRlX3ByZWZpeDsgfQorCisgIC8qKgorICAgKiBUaGUgY29tcGlsZXIgb3B0aW9uICJub190aHJpZnRfb3N0cmVhbV9pbXBsIiBjYW4gYmUgdXNlZCB0byBwcmV2ZW50CisgICAqIHRoZSBjb21waWxlciBmcm9tIGVtaXR0aW5nIGltcGxlbWVudGF0aW9ucyBmb3Igb3BlcmF0b3IgPDwuICBJbiB0aGlzCisgICAqIGNhc2UgdGhlIGNvbnN1bWluZyBhcHBsaWNhdGlvbiBtdXN0IHByb3ZpZGUgYW55IG5lZWRlZCB0byBidWlsZC4KKyAgICoKKyAgICogVG8gZGlzYWJsZSB0aGlzIG9uIGEgcGVyIHN0cnVjdHVyZSBiYXNlcywgb25lIGNhbiBhbHRlcm5hdGl2ZWx5IHNldAorICAgKiB0aGUgYW5ub3RhdGlvbiAiY3BwLmN1c3RvbW9zdHJlYW0iIHRvIHByZXZlbnQgdGhyaWZ0IGZyb20gZW1pdHRpbmcgYW4KKyAgICogb3BlcmF0b3IgPDwgKHN0ZDo6b3N0cmVhbSYpLgorICAgKgorICAgKiBTZWUgQW5ub3RhdGlvblRlc3QgZm9yIHZhbGlkYXRpb24gb2YgdGhpcyBhbm5vdGF0aW9uIGZlYXR1cmUuCisgICAqLworICBib29sIGhhc19jdXN0b21fb3N0cmVhbSh0X3R5cGUqIHR0eXBlKSBjb25zdCB7CisgICAgcmV0dXJuIChnZW5fbm9fb3N0cmVhbV9vcGVyYXRvcnNfKSB8fAorICAgICAgICAgICAodHR5cGUtPmFubm90YXRpb25zXy5maW5kKCJjcHAuY3VzdG9tb3N0cmVhbSIpICE9IHR0eXBlLT5hbm5vdGF0aW9uc18uZW5kKCkpOworICB9CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBpbmNsdWRlIHByZWZpeCB0byB1c2UgZm9yIGEgZmlsZSBnZW5lcmF0ZWQgYnkgcHJvZ3JhbSwgb3IgdGhlCisgICAqIGVtcHR5IHN0cmluZyBpZiBubyBpbmNsdWRlIHByZWZpeCBzaG91bGQgYmUgdXNlZC4KKyAgICovCisgIHN0ZDo6c3RyaW5nIGdldF9pbmNsdWRlX3ByZWZpeChjb25zdCB0X3Byb2dyYW0mIHByb2dyYW0pIGNvbnN0OworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBwdXJlIGVudW1zIGZvciBUaHJpZnQgZW51bXMsIGluc3RlYWQgb2Ygd3JhcHBlciBjbGFzc2VzLgorICAgKi8KKyAgYm9vbCBnZW5fcHVyZV9lbnVtc187CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIHRlbXBsYXRpemVkIHJlYWRlci93cml0ZXIgbWV0aG9kcy4KKyAgICovCisgIGJvb2wgZ2VuX3RlbXBsYXRlc187CisKKyAgLyoqCisgICAqIFRydWUgaWZmIHdlIHNob3VsZCBnZW5lcmF0ZSBwcm9jZXNzIGZ1bmN0aW9uIHBvaW50ZXJzIGZvciBvbmx5IHRlbXBsYXRpemVkCisgICAqIHJlYWRlci93cml0ZXIgbWV0aG9kcy4KKyAgICovCisgIGJvb2wgZ2VuX3RlbXBsYXRlc19vbmx5XzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgbW92ZSBjb25zdHJ1Y3RvcnMgJiBhc3NpZ25tZW50IG9wZXJhdG9ycy4KKyAgICovCisgIGJvb2wgZ2VuX21vdmVhYmxlXzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgb3N0cmVhbSBkZWZpbml0aW9ucworICAgKi8KKyAgYm9vbCBnZW5fbm9fb3N0cmVhbV9vcGVyYXRvcnNfOworCisgIC8qKgorICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgdXNlIGEgcGF0aCBwcmVmaXggaW4gb3VyICNpbmNsdWRlIHN0YXRlbWVudHMgZm9yIG90aGVyCisgICAqIHRocmlmdC1nZW5lcmF0ZWQgaGVhZGVyIGZpbGVzLgorICAgKi8KKyAgYm9vbCB1c2VfaW5jbHVkZV9wcmVmaXhfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSAiQ29udGludWF0aW9uIE9CamVjdCItc3R5bGUgY2xhc3NlcyBhcyB3ZWxsLgorICAgKi8KKyAgYm9vbCBnZW5fY29iX3N0eWxlXzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgb21pdCBjYWxscyB0byBjb21wbGV0aW9uX18oKSBpbiBDb2JDbGllbnQgY2xhc3MuCisgICAqLworICBib29sIGdlbl9ub19jbGllbnRfY29tcGxldGlvbl87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIG9taXQgZ2VuZXJhdGluZyB0aGUgZGVmYXVsdCBvcGVhcnRvcnMgPT0sICE9IGFuZCA8LgorICAgKi8KKyAgYm9vbCBnZW5fbm9fZGVmYXVsdF9vcGVyYXRvcnNfOworCisgICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgc2tlbGV0b24uCisgICAqLworICBib29sIGdlbl9ub19za2VsZXRvbl87CisKKyAgLyoqCisgICAqIFN0cmluZ3MgZm9yIG5hbWVzcGFjZSwgY29tcHV0ZWQgb25jZSB1cCBmcm9udCB0aGVuIHVzZWQgZGlyZWN0bHkKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgbnNfb3Blbl87CisgIHN0ZDo6c3RyaW5nIG5zX2Nsb3NlXzsKKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zLCBzdG9yZWQgaGVyZSB0byBhdm9pZCBwYXNzaW5nIHRoZW0gYXMgcGFyYW1ldGVycyB0byBldmVyeQorICAgKiBmdW5jdGlvbi4KKyAgICovCisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzX2ltcGxfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfdGNjXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2hlYWRlcl87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfdGNjXzsKKworICAvLyBUaGUgUHJvY2Vzc29yR2VuZXJhdG9yIGlzIHVzZWQgdG8gZ2VuZXJhdGUgcGFydHMgb2YgdGhlIGNvZGUsCisgIC8vIHNvIGl0IG5lZWRzIGFjY2VzcyB0byBtYW55IG9mIG91ciBwcm90ZWN0ZWQgbWVtYmVycyBhbmQgbWV0aG9kcy4KKyAgLy8KKyAgLy8gVE9ETzogVGhlIGNvZGUgcmVhbGx5IHNob3VsZCBiZSBjbGVhbmVkIHVwIHNvIHRoYXQgaGVscGVyIG1ldGhvZHMgZm9yCisgIC8vIHdyaXRpbmcgdG8gdGhlIG91dHB1dCBmaWxlcyBhcmUgc2VwYXJhdGUgZnJvbSB0aGUgZ2VuZXJhdG9yIGNsYXNzZXMKKyAgLy8gdGhlbXNlbHZlcy4KKyAgZnJpZW5kIGNsYXNzIFByb2Nlc3NvckdlbmVyYXRvcjsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX3R5cGVzLmgiOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZSk7CisKKyAgc3RyaW5nIGZfdHlwZXNfaW1wbF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX3R5cGVzLmNwcCI7CisgIGZfdHlwZXNfaW1wbF8ub3BlbihmX3R5cGVzX2ltcGxfbmFtZS5jX3N0cigpKTsKKworICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAvLyBJZiB3ZSBkb24ndCBvcGVuIHRoZSBzdHJlYW0sIGl0IGFwcGVhcnMgdG8ganVzdCBkaXNjYXJkIGRhdGEsCisgICAgLy8gd2hpY2ggaXMgZmluZS4KKyAgICBzdHJpbmcgZl90eXBlc190Y2NfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl90eXBlcy50Y2MiOworICAgIGZfdHlwZXNfdGNjXy5vcGVuKGZfdHlwZXNfdGNjX25hbWUuY19zdHIoKSk7CisgIH0KKworICAvLyBQcmludCBoZWFkZXIKKyAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCk7CisgIGZfdHlwZXNfaW1wbF8gPDwgYXV0b2dlbl9jb21tZW50KCk7CisgIGZfdHlwZXNfdGNjXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKworICAvLyBTdGFydCBpZm5kZWYKKyAgZl90eXBlc18gPDwgIiNpZm5kZWYgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfVFlQRVNfSCIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgPDwgIl9UWVBFU19IIiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfdHlwZXNfdGNjXyA8PCAiI2lmbmRlZiAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9UWVBFU19UQ0MiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgICAgICA8PCAiX1RZUEVTX1RDQyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEluY2x1ZGUgYmFzZSB0eXBlcworICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgPGlvc2Z3ZD4iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmg+IiA8PCBlbmRsCisgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L1RCYXNlLmg+IiA8PCBlbmRsCisgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPiIgPDwgZW5kbAorICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPiIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsOworICAvLyBJbmNsdWRlIEMrK3h4IGNvbXBhdGliaWxpdHkgaGVhZGVyCisgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSA8ZnVuY3Rpb25hbD4iIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSA8bWVtb3J5PiIgPDwgZW5kbDsKKworICAvLyBJbmNsdWRlIG90aGVyIFRocmlmdCBpbmNsdWRlcworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgZl90eXBlc18gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKihpbmNsdWRlc1tpXSkpIDw8IGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIl90eXBlcy5oXCIiIDw8IGVuZGw7CisKKyAgICAvLyBYWFgoc2ltcGtpbnMpOiBJZiBnZW5fdGVtcGxhdGVzXyBpcyBlbmFibGVkLCB3ZSBjdXJyZW50bHkgYXNzdW1lIGFsbAorICAgIC8vIGluY2x1ZGVkIGZpbGVzIHdlcmUgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0ZW1wbGF0ZXMgZW5hYmxlZC4KKyAgICBmX3R5cGVzX3RjY18gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKihpbmNsdWRlc1tpXSkpIDw8IGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICJfdHlwZXMudGNjXCIiIDw8IGVuZGw7CisgIH0KKyAgZl90eXBlc18gPDwgZW5kbDsKKworICAvLyBJbmNsdWRlIGN1c3RvbSBoZWFkZXJzCisgIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBjcHBfaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2NwcF9pbmNsdWRlcygpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNwcF9pbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIGlmIChjcHBfaW5jbHVkZXNbaV1bMF0gPT0gJzwnKSB7CisgICAgICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgIiA8PCBjcHBfaW5jbHVkZXNbaV0gPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl90eXBlc18gPDwgIiNpbmNsdWRlIFwiIiA8PCBjcHBfaW5jbHVkZXNbaV0gPDwgIlwiIiA8PCBlbmRsOworICAgIH0KKyAgfQorICBmX3R5cGVzXyA8PCBlbmRsOworCisgIC8vIEluY2x1ZGUgdGhlIHR5cGVzIGZpbGUKKyAgZl90eXBlc19pbXBsXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICAgICAgIDw8ICJfdHlwZXMuaFwiIiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfdHlwZXNfdGNjXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICAgICAgPDwgIl90eXBlcy5oXCIiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBUaGUgc3dhcCgpIGNvZGUgbmVlZHMgPGFsZ29yaXRobT4gZm9yIHN0ZDo6c3dhcCgpCisgIGZfdHlwZXNfaW1wbF8gPDwgIiNpbmNsdWRlIDxhbGdvcml0aG0+IiA8PCBlbmRsOworICAvLyBmb3Igb3BlcmF0b3I8PAorICBmX3R5cGVzX2ltcGxfIDw8ICIjaW5jbHVkZSA8b3N0cmVhbT4iIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAiI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBPcGVuIG5hbWVzcGFjZQorICBuc19vcGVuXyA9IG5hbWVzcGFjZV9vcGVuKHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSk7CisgIG5zX2Nsb3NlXyA9IG5hbWVzcGFjZV9jbG9zZShwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY3BwIikpOworCisgIGZfdHlwZXNfIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3R5cGVzX2ltcGxfIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3R5cGVzX3RjY18gPDwgbnNfb3Blbl8gPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIENsb3NlcyB0aGUgb3V0cHV0IGZpbGVzLgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICAvLyBDbG9zZSBuYW1lc3BhY2UKKyAgZl90eXBlc18gPDwgbnNfY2xvc2VfIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCBuc19jbG9zZV8gPDwgZW5kbDsKKyAgZl90eXBlc190Y2NfIDw8IG5zX2Nsb3NlXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gSW5jbHVkZSB0aGUgdHlwZXMudGNjIGZpbGUgZnJvbSB0aGUgdHlwZXMgaGVhZGVyIGZpbGUsCisgIC8vIHNvIGNsaWVudHMgZG9uJ3QgaGF2ZSB0byBleHBsaWNpdGx5IGluY2x1ZGUgdGhlIHRjYyBmaWxlLgorICAvLyBUT0RPKHNpbXBraW5zKTogTWFrZSB0aGlzIGEgc2VwYXJhdGUgb3B0aW9uLgorICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICAgIDw8ICJfdHlwZXMudGNjXCIiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIENsb3NlIGlmbmRlZgorICBmX3R5cGVzXyA8PCAiI2VuZGlmIiA8PCBlbmRsOworICBmX3R5cGVzX3RjY18gPDwgIiNlbmRpZiIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBvdXRwdXQgZmlsZQorICBmX3R5cGVzXy5jbG9zZSgpOworICBmX3R5cGVzX2ltcGxfLmNsb3NlKCk7CisgIGZfdHlwZXNfdGNjXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMganVzdCBhIHNpbXBsZSAxLWxpbmVyIGluIEMrKworICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCksIHRydWUpIDw8ICIgIgorICAgICAgICAgICA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW1fY29uc3RhbnRfbGlzdChzdGQ6Om9zdHJlYW0mIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgY29uc3RhbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX3ZhbHVlcykgeworICBmIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgZiA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KGYpIDw8IHByZWZpeCA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgc3VmZml4OworICAgIGlmIChpbmNsdWRlX3ZhbHVlcykgeworICAgICAgZiA8PCAiID0gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIH0KKyAgfQorCisgIGYgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGYpIDw8ICJ9OyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBJbiBDKyssIHRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUKKyAqIGFzIHRoZSB0aHJpZnQgZGVmaW5pdGlvbiBpdHNlbGYsIHVzaW5nIHRoZSBlbnVtIGtleXdvcmQgaW4gQysrLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKworICBzdGQ6OnN0cmluZyBlbnVtX25hbWUgPSB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgaWYgKCFnZW5fcHVyZV9lbnVtc18pIHsKKyAgICBlbnVtX25hbWUgPSAidHlwZSI7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInN0cnVjdCAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZW51bSAiIDw8IGVudW1fbmFtZTsKKworICBnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3QoZl90eXBlc18sIGNvbnN0YW50cywgIiIsICIiLCB0cnVlKTsKKworICBpZiAoIWdlbl9wdXJlX2VudW1zXykgeworICAgIGluZGVudF9kb3duKCk7CisgICAgZl90eXBlc18gPDwgIn07IiA8PCBlbmRsOworICB9CisKKyAgZl90eXBlc18gPDwgZW5kbDsKKworICAvKioKKyAgICAgR2VuZXJhdGUgYSBjaGFyYWN0ZXIgYXJyYXkgb2YgZW51bSBuYW1lcyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICAqLworICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIjsKKyAgaWYgKCFnZW5fcHVyZV9lbnVtc18pIHsKKyAgICBwcmVmaXggPSB0ZW51bS0+Z2V0X25hbWUoKSArICI6OiI7CisgIH0KKworICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpbnQgX2siIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJWYWx1ZXNbXSA9IjsKKyAgZ2VuZXJhdGVfZW51bV9jb25zdGFudF9saXN0KGZfdHlwZXNfaW1wbF8sIGNvbnN0YW50cywgcHJlZml4LmNfc3RyKCksICIiLCBmYWxzZSk7CisKKyAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiY29uc3QgY2hhciogX2siIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJOYW1lc1tdID0iOworICBnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3QoZl90eXBlc19pbXBsXywgY29uc3RhbnRzLCAiXCIiLCAiXCIiLCBmYWxzZSk7CisKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImV4dGVybiBjb25zdCBzdGQ6Om1hcDxpbnQsIGNvbnN0IGNoYXIqPiBfIiA8PCB0ZW51bS0+Z2V0X25hbWUoKQorICAgICAgICAgICA8PCAiX1ZBTFVFU19UT19OQU1FUzsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJjb25zdCBzdGQ6Om1hcDxpbnQsIGNvbnN0IGNoYXIqPiBfIiA8PCB0ZW51bS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICJfVkFMVUVTX1RPX05BTUVTKDo6YXBhY2hlOjp0aHJpZnQ6OlRFbnVtSXRlcmF0b3IoIiA8PCBjb25zdGFudHMuc2l6ZSgpIDw8ICIsIF9rIgorICAgICAgICAgICAgICAgIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJWYWx1ZXMiCisgICAgICAgICAgICAgICAgPDwgIiwgX2siIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJOYW1lcyksICIKKyAgICAgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VEVudW1JdGVyYXRvcigtMSwgTlVMTCwgTlVMTCkpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2VudW1fb3N0cmVhbV9vcGVyYXRvcl9kZWNsKGZfdHlwZXNfLCB0ZW51bSk7CisgIGdlbmVyYXRlX2VudW1fb3N0cmVhbV9vcGVyYXRvcihmX3R5cGVzX2ltcGxfLCB0ZW51bSk7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtX29zdHJlYW1fb3BlcmF0b3JfZGVjbChzdGQ6Om9zdHJlYW0mIG91dCwgdF9lbnVtKiB0ZW51bSkgeworCisgIG91dCA8PCAic3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCAiOworICBpZiAoZ2VuX3B1cmVfZW51bXNfKSB7CisgICAgb3V0IDw8IHRlbnVtLT5nZXRfbmFtZSgpOworICB9IGVsc2UgeworICAgIG91dCA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiOjp0eXBlJiI7CisgIH0KKyAgb3V0IDw8ICIgdmFsKTsiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bV9vc3RyZWFtX29wZXJhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2VudW0qIHRlbnVtKSB7CisKKyAgLy8gSWYgd2UndmUgYmVlbiB0b2xkIHRoZSBjb25zdW1pbmcgYXBwbGljYXRpb24gd2lsbCBwcm92aWRlIGFuIG9zdHJlYW0KKyAgLy8gb3BlcmF0b3IgZGVmaW5pdGlvbiB0aGVuIHdlIG9ubHkgbWFrZSBhIGRlY2xhcmF0aW9uOgorCisgIGlmICghaGFzX2N1c3RvbV9vc3RyZWFtKHRlbnVtKSkgeworICAgIG91dCA8PCAic3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCAiOworICAgIGlmIChnZW5fcHVyZV9lbnVtc18pIHsKKyAgICAgIG91dCA8PCB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICI6OnR5cGUmIjsKKyAgICB9CisgICAgb3V0IDw8ICIgdmFsKSAiOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInN0ZDo6bWFwPGludCwgY29uc3QgY2hhcio+Ojpjb25zdF9pdGVyYXRvciBpdCA9IF8iCisgICAgICAgICAgICAgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIl9WQUxVRVNfVE9fTkFNRVMuZmluZCh2YWwpOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChpdCAhPSBfIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiX1ZBTFVFU19UT19OQU1FUy5lbmQoKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm91dCA8PCBpdC0+c2Vjb25kOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvdXQgPDwgc3RhdGljX2Nhc3Q8aW50Pih2YWwpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIG91dDsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX2NvbnN0YW50cy5oIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0czsKKyAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lKTsKKworICBzdHJpbmcgZl9jb25zdHNfaW1wbF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX2NvbnN0YW50cy5jcHAiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzX2ltcGw7CisgIGZfY29uc3RzX2ltcGwub3BlbihmX2NvbnN0c19pbXBsX25hbWUpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX2NvbnN0cyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKyAgZl9jb25zdHNfaW1wbCA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKworICAvLyBTdGFydCBpZm5kZWYKKyAgZl9jb25zdHMgPDwgIiNpZm5kZWYgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfQ09OU1RBTlRTX0giIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgIDw8ICJfQ09OU1RBTlRTX0giIDw8IGVuZGwgPDwgZW5kbCA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzLmhcIiIgPDwgZW5kbCA8PCBlbmRsIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX2NvbnN0c19pbXBsIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgICAgICAgPDwgIl9jb25zdGFudHMuaFwiIiA8PCBlbmRsIDw8IGVuZGwgPDwgbnNfb3Blbl8gPDwgZW5kbCA8PCBlbmRsOworCisgIGZfY29uc3RzIDw8ICJjbGFzcyAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cyB7IiA8PCBlbmRsIDw8ICIgcHVibGljOiIgPDwgZW5kbCA8PCAiICAiCisgICAgICAgICAgIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cygpOyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBmX2NvbnN0cyA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9jb25zdHMgPDwgIn07IiA8PCBlbmRsOworCisgIGZfY29uc3RzX2ltcGwgPDwgImNvbnN0ICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIGdfIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfY29uc3RhbnRzOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzOjoiIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgICAgICA8PCAiQ29uc3RhbnRzKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHNfaW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2NvbnN0c19pbXBsKSA8PCAifSIgPDwgZW5kbDsKKworICBmX2NvbnN0cyA8PCBlbmRsIDw8ICJleHRlcm4gY29uc3QgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHMgZ18iIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgPDwgIl9jb25zdGFudHM7IiA8PCBlbmRsIDw8IGVuZGwgPDwgbnNfY2xvc2VfIDw8IGVuZGwgPDwgZW5kbCA8PCAiI2VuZGlmIiA8PCBlbmRsOworICBmX2NvbnN0cy5jbG9zZSgpOworCisgIGZfY29uc3RzX2ltcGwgPDwgZW5kbCA8PCBuc19jbG9zZV8gPDwgZW5kbCA8PCBlbmRsOworICBmX2NvbnN0c19pbXBsLmNsb3NlKCk7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGJvb2wgaXNfbm9ucmVxdWlyZWRfZmllbGQgPSBmYWxzZTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGlzX25vbnJlcXVpcmVkX2ZpZWxkID0gZmFsc2U7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgICAgaXNfbm9ucmVxdWlyZWRfZmllbGQgPSAoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGlmIChpc19ub25yZXF1aXJlZF9maWVsZCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuX19pc3NldC4iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5pbnNlcnQoc3RkOjptYWtlX3BhaXIoIiA8PCBrZXkgPDwgIiwgIiA8PCB2YWwgPDwgIikpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5wdXNoX2JhY2soIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5pbnNlcnQoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHByaW50X2NvbnN0X3ZhbHVlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCisvKioKKyAqCisgKi8KK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICh2b2lkKW5hbWU7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkxMIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8ICJzdGF0aWNfY2FzdDxkb3VibGU+KCIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IGVtaXRfZG91YmxlX2FzX3N0cmluZyh2YWx1ZS0+Z2V0X2RvdWJsZSgpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmVuZGVyIDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgeworICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IHQgPDwgIjsiIDw8IGVuZGw7CisgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSk7CisgICAgcmVuZGVyIDw8IHQ7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCkgeworICAvLyBGb3J3YXJkIGRlY2xhcmUgc3RydWN0IGRlZgorICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBhIGNsYXNzCisgKiB3aXRoIGRhdGEgbWVtYmVycyBhbmQgYSByZWFkL3dyaXRlKCkgZnVuY3Rpb24sIHBsdXMgYSBtaXJyb3JpbmcgaXNzZXQKKyAqIGlubmVyIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3BwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24sIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc19pbXBsXywgZl90eXBlc19pbXBsXywgdHN0cnVjdCwgdHJ1ZSwgdHJ1ZSk7CisKKyAgc3RkOjpvc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3R5cGVzX3RjY18gOiBmX3R5cGVzX2ltcGxfKTsKKyAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX3N0cnVjdF9zd2FwKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9jb3B5X2NvbnN0cnVjdG9yKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIGlmIChnZW5fbW92ZWFibGVfKSB7CisgICAgZ2VuZXJhdGVfbW92ZV9jb25zdHJ1Y3RvcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICB9CisgIGdlbmVyYXRlX2Fzc2lnbm1lbnRfb3BlcmF0b3IoZl90eXBlc19pbXBsXywgdHN0cnVjdCk7CisgIGlmIChnZW5fbW92ZWFibGVfKSB7CisgICAgZ2VuZXJhdGVfbW92ZV9hc3NpZ25tZW50X29wZXJhdG9yKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOworICB9CisKKyAgaWYgKCFoYXNfY3VzdG9tX29zdHJlYW0odHN0cnVjdCkpIHsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOworICB9CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIGdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZChmX3R5cGVzX2ltcGxfLCB0c3RydWN0KTsKKyAgfQorfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29weV9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2NvbnN0cnVjdG9yX2hlbHBlcihvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgLyppc19tb3ZlPSovZmFsc2UpOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbW92ZV9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2NvbnN0cnVjdG9yX2hlbHBlcihvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgLyppc19tb3ZlPSovdHJ1ZSk7Cit9CisKK25hbWVzcGFjZSB7CisvLyBIZWxwZXIgdG8gY29udmVydCBhIHZhcmlhYmxlIHRvIHJ2YWx1ZSwgaWYgbW92ZSBpcyBlbmFibGVkCitzdGQ6OnN0cmluZyBtYXliZU1vdmUoc3RkOjpzdHJpbmcgY29uc3QmIG90aGVyLCBib29sIG1vdmUpIHsKKyAgaWYgKG1vdmUpIHsKKyAgICByZXR1cm4gInN0ZDo6bW92ZSgiICsgb3RoZXIgKyAiKSI7CisgIH0KKyAgcmV0dXJuIG90aGVyOworfQorfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RydWN0b3JfaGVscGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21vdmUpIHsKKworICBzdGQ6OnN0cmluZyB0bXBfbmFtZSA9IHRtcCgib3RoZXIiKTsKKworICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6OiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKworICBpZiAoaXNfbW92ZSkgeworICAgIG91dCA8PCAiKCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYmICI7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICIoY29uc3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImICI7CisgIH0KKyAgb3V0IDw8IHRtcF9uYW1lIDw8ICIpICI7CisgIGlmIChpc19leGNlcHRpb24pCisgICAgb3V0IDw8ICI6IFRFeGNlcHRpb24oKSAiOworICBvdXQgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIC8vIGVsaW1pbmF0ZSBjb21waWxlciB1bnVzZWQgd2FybmluZworICBpZiAobWVtYmVycy5lbXB0eSgpKQorICAgIGluZGVudChvdXQpIDw8ICIodm9pZCkgIiA8PCB0bXBfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICBmb3IgKGZfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgZl9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpCisgICAgICBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKKyAgICBpbmRlbnQob3V0KSA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICA8PCBtYXliZU1vdmUodG1wX25hbWUgKyAiLiIgKyAoKmZfaXRlciktPmdldF9uYW1lKCksIGlzX21vdmUpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKGhhc19ub25yZXF1aXJlZF9maWVsZHMpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldCA9ICIgPDwgbWF5YmVNb3ZlKHRtcF9uYW1lICsgIi5fX2lzc2V0IiwgaXNfbW92ZSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Fzc2lnbm1lbnRfb3BlcmF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9hc3NpZ25tZW50X2hlbHBlcihvdXQsIHRzdHJ1Y3QsIC8qaXNfbW92ZT0qL2ZhbHNlKTsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX21vdmVfYXNzaWdubWVudF9vcGVyYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2Fzc2lnbm1lbnRfaGVscGVyKG91dCwgdHN0cnVjdCwgLyppc19tb3ZlPSovdHJ1ZSk7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hc3NpZ25tZW50X2hlbHBlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX21vdmUpIHsKKyAgc3RkOjpzdHJpbmcgdG1wX25hbWUgPSB0bXAoIm90aGVyIik7CisKKyAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6b3BlcmF0b3I9KCI7CisKKyAgaWYgKGlzX21vdmUpIHsKKyAgICBvdXQgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiYgIjsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgImNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiAiOworICB9CisgIG91dCA8PCB0bXBfbmFtZSA8PCAiKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIC8vIGVsaW1pbmF0ZSBjb21waWxlciB1bnVzZWQgd2FybmluZworICBpZiAobWVtYmVycy5lbXB0eSgpKQorICAgIGluZGVudChvdXQpIDw8ICIodm9pZCkgIiA8PCB0bXBfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICBmb3IgKGZfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgZl9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpCisgICAgICBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKKyAgICBpbmRlbnQob3V0KSA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICA8PCBtYXliZU1vdmUodG1wX25hbWUgKyAiLiIgKyAoKmZfaXRlciktPmdldF9uYW1lKCksIGlzX21vdmUpIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGlmIChoYXNfbm9ucmVxdWlyZWRfZmllbGRzKSB7CisgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXQgPSAiIDw8IG1heWJlTW92ZSh0bXBfbmFtZSArICIuX19pc3NldCIsIGlzX21vdmUpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiAqdGhpczsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCisvKioKKyAqIFdyaXRlcyB0aGUgc3RydWN0IGRlY2xhcmF0aW9uIGludG8gdGhlIGhlYWRlciBmaWxlCisgKgorICogQHBhcmFtIG91dCBPdXRwdXQgc3RyZWFtCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0CisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzd2FwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VzZXJfc3RydWN0KSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBleHRlbmRzID0gIiA6IHB1YmxpYyA6OmFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIjsKKyAgfSBlbHNlIHsKKyAgICBpZiAoaXNfdXNlcl9zdHJ1Y3QgJiYgIWdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBleHRlbmRzID0gIiA6IHB1YmxpYyB2aXJ0dWFsIDo6YXBhY2hlOjp0aHJpZnQ6OlRCYXNlIjsKKyAgICB9CisgIH0KKworICAvLyBHZXQgbWVtYmVycworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIC8vIFdyaXRlIHRoZSBpc3NldCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb24gb3V0c2lkZSB0aGUgY2xhc3MuIFRoaXMgbWFrZXMKKyAgLy8gdGhlIGdlbmVyYXRlZCBjb2RlIGFtZW5hYmxlIHRvIHByb2Nlc3NpbmcgYnkgU1dJRy4KKyAgLy8gV2Ugb25seSBkZWNsYXJlIHRoZSBzdHJ1Y3QgaWYgaXQgZ2V0cyB1c2VkIGluIHRoZSBjbGFzcy4KKworICAvLyBJc3NldCBzdHJ1Y3QgaGFzIGJvb2xlYW4gZmllbGRzLCBidXQgb25seSBmb3Igbm9uLXJlcXVpcmVkIGZpZWxkcy4KKyAgYm9vbCBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gZmFsc2U7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKKyAgICAgIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSB0cnVlOworICB9CisKKyAgaWYgKGhhc19ub25yZXF1aXJlZF9maWVsZHMgJiYgKCFwb2ludGVycyB8fCByZWFkKSkgeworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJfX2lzc2V0IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiXyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiX19pc3NldCgpICI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBzdHJpbmcgaXNTZXQgPSAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSA/ICJ0cnVlIiA6ICJmYWxzZSI7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgb3V0IDw8ICI6ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBpc1NldCA8PCAiKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIiwgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGlzU2V0IDw8ICIpIjsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICIge30iIDw8IGVuZGw7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIDoxOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IF8iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIl9faXNzZXQ7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gT3BlbiBzdHJ1Y3QgZGVmCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IGV4dGVuZHMgPDwgIiB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiIHB1YmxpYzoiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKCFwb2ludGVycykgeworICAgIC8vIENvcHkgY29uc3RydWN0b3IKKyAgICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoY29uc3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImKTsiIDw8IGVuZGw7CisKKyAgICAvLyBNb3ZlIGNvbnN0cnVjdG9yCisgICAgaWYgKGdlbl9tb3ZlYWJsZV8pIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYmKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gQXNzaWdubWVudCBPcGVyYXRvcgorICAgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYgb3BlcmF0b3I9KGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJik7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAvLyBNb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IKKyAgICBpZiAoZ2VuX21vdmVhYmxlXykgeworICAgICAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiBvcGVyYXRvcj0oIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImJik7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSI7CisKKyAgICBib29sIGluaXRfY3RvciA9IGZhbHNlOworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpIHx8IHQtPmlzX2VudW0oKSB8fCBpc19yZWZlcmVuY2UoKm1faXRlcikpIHsKKyAgICAgICAgc3RyaW5nIGR2YWw7CisgICAgICAgIGlmICh0LT5pc19lbnVtKCkpIHsKKyAgICAgICAgICBkdmFsICs9ICIoIiArIHR5cGVfbmFtZSh0KSArICIpIjsKKyAgICAgICAgfQorICAgICAgICBkdmFsICs9ICh0LT5pc19zdHJpbmcoKSB8fCBpc19yZWZlcmVuY2UoKm1faXRlcikpID8gIiIgOiAiMCI7CisgICAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKKyAgICAgICAgICBkdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCBjdik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpbml0X2N0b3IpIHsKKyAgICAgICAgICBpbml0X2N0b3IgPSB0cnVlOworICAgICAgICAgIG91dCA8PCAiIDogIjsKKyAgICAgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBkdmFsIDw8ICIpIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIiwgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGR2YWwgPDwgIikiOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgLy8gVE9ETyhkcmVpc3MpOiBXaGVuIGV2ZXJ5dGhpbmcgZWxzZSBpbiBUaHJpZnQgaXMgcGVyZmVjdCwKKyAgICAvLyBkbyBtb3JlIG9mIHRoZXNlIGluIHRoZSBpbml0aWFsaXplciBsaXN0LgorICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKworICAgICAgaWYgKCF0LT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICB0X2NvbnN0X3ZhbHVlKiBjdiA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgICAgIGlmIChjdiAhPSBOVUxMKSB7CisgICAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAoKm1faXRlciktPmdldF9uYW1lKCksIHQsIGN2KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBpZiAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgPT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKSB7CisgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgbm9leGNlcHQ7IiA8PCBlbmRsOworICB9CisKKyAgLy8gRGVjbGFyZSBhbGwgZmllbGRzCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb2ludGVycyAmJiAhKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc194Y2VwdGlvbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFyZWFkKSA8PCBlbmRsOworICB9CisKKyAgLy8gQWRkIHRoZSBfX2lzc2V0IGRhdGEgbWVtYmVyIGlmIHdlIG5lZWQgaXQsIHVzaW5nIHRoZSBkZWZpbml0aW9uIGZyb20gYWJvdmUKKyAgaWYgKGhhc19ub25yZXF1aXJlZF9maWVsZHMgJiYgKCFwb2ludGVycyB8fCByZWFkKSkgeworICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJfIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJfX2lzc2V0IF9faXNzZXQ7IiA8PCBlbmRsOworICB9CisKKyAgLy8gQ3JlYXRlIGEgc2V0dGVyIGZ1bmN0aW9uIGZvciBlYWNoIGZpZWxkCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAocG9pbnRlcnMpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoaXNfcmVmZXJlbmNlKCgqbV9pdGVyKSkpIHsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2b2lkIF9fc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoOjpzdGQ6OnNoYXJlZF9wdHI8IgorICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIj4iOworICAgICAgb3V0IDw8ICIgdmFsKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2b2lkIF9fc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIgorICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCksIGZhbHNlLCB0cnVlKTsKKyAgICAgIG91dCA8PCAiIHZhbCk7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBvdXQgPDwgZW5kbDsKKworICBpZiAoIXBvaW50ZXJzKSB7CisgICAgLy8gU2hvdWxkIHdlIGdlbmVyYXRlIGRlZmF1bHQgb3BlcmF0b3JzPworICAgIGlmICghZ2VuX25vX2RlZmF1bHRfb3BlcmF0b3JzXykgeworICAgICAgLy8gR2VuZXJhdGUgYW4gZXF1YWxpdHkgdGVzdGluZyBvcGVyYXRvci4gIE1ha2UgaXQgaW5saW5lIHNpbmNlIHRoZSBjb21waWxlcgorICAgICAgLy8gd2lsbCBkbyBhIGJldHRlciBqb2IgdGhhbiB3ZSB3b3VsZCB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gaW5saW5lIGl0LgorICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sIG9wZXJhdG9yID09IChjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmICIKKyAgICAgICAgICA8PCAobWVtYmVycy5zaXplKCkgPiAwID8gInJocyIgOiAiLyogcmhzICovIikgPDwgIikgY29uc3QiIDw8IGVuZGw7CisgICAgICBzY29wZV91cChvdXQpOworICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgICAvLyBNb3N0IGV4aXN0aW5nIFRocmlmdCBjb2RlIGRvZXMgbm90IHVzZSBpc3NldCBvciBvcHRpb25hbC9yZXF1aXJlZCwKKyAgICAgICAgLy8gc28gd2UgdHJlYXQgImRlZmF1bHQiIGZpZWxkcyBhcyByZXF1aXJlZC4KKyAgICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghKCIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gcmhzLiIKKyAgICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF9faXNzZXQuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSByaHMuX19pc3NldC4iCisgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJlbHNlIGlmIChfX2lzc2V0LiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgJiYgISgiCisgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IHJocy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgJnJocykgY29uc3QgeyIKKyAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAhKCp0aGlzID09IHJocyk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgPDwgZW5kbDsKKworICAgICAgLy8gR2VuZXJhdGUgdGhlIGRlY2xhcmF0aW9uIG9mIGEgbGVzcy10aGFuIG9wZXJhdG9yLiAgVGhpcyBtdXN0IGJlCisgICAgICAvLyBpbXBsZW1lbnRlZCBieSB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyIGlmIHRoZXkgd2lzaCB0byB1c2UgaXQuICAoVGhleQorICAgICAgLy8gd2lsbCBnZXQgYSBsaW5rIGVycm9yIGlmIHRoZXkgdHJ5IHRvIHVzZSBpdCB3aXRob3V0IGFuIGltcGxlbWVudGF0aW9uLikKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbCBvcGVyYXRvciA8IChjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmICkgY29uc3Q7IiA8PCBlbmRsCisgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpZiAocmVhZCkgeworICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJ1aW50MzJfdCByZWFkKFByb3RvY29sXyogaXByb3QpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCByZWFkKCIKKyAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaWYgKHdyaXRlKSB7CisgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgInVpbnQzMl90IHdyaXRlKFByb3RvY29sXyogb3Byb3QpIGNvbnN0OyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCB3cml0ZSgiCisgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdDsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIG91dCA8PCBlbmRsOworCisgIGlmIChpc191c2VyX3N0cnVjdCAmJiAhaGFzX2N1c3RvbV9vc3RyZWFtKHRzdHJ1Y3QpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsICI7CisgICAgZ2VuZXJhdGVfc3RydWN0X3ByaW50X21ldGhvZF9kZWNsKG91dCwgTlVMTCk7CisgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgLy8gc3RkOjpleGNlcHRpb246OndoYXQoKQorICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJtdXRhYmxlIHN0ZDo6c3RyaW5nIHRocmlmdFRFeGNlcHRpb25NZXNzYWdlSG9sZGVyXzsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpOworICAgIGdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZF9kZWNsKG91dCwgdHN0cnVjdCwgZmFsc2UpOworICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChzd2FwKSB7CisgICAgLy8gR2VuZXJhdGUgYSBuYW1lc3BhY2Utc2NvcGUgc3dhcCgpIGZ1bmN0aW9uCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2b2lkIHN3YXAoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgJmEsICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICA8PCAiICZiKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGlmIChpc191c2VyX3N0cnVjdCkgeworICAgIGdlbmVyYXRlX3N0cnVjdF9vc3RyZWFtX29wZXJhdG9yX2RlY2wob3V0LCB0c3RydWN0KTsKKyAgfQorfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGZvcmNlX2NwcF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZXR0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdXNlcl9zdHJ1Y3QpIHsKKyAgLy8gR2V0IG1lbWJlcnMKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAvLyBEZXN0cnVjdG9yCisgIGlmICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSA9PSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpIHsKKyAgICBmb3JjZV9jcHBfb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjp+IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiKCkgbm9leGNlcHQgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgZm9yY2VfY3BwX291dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLy8gQ3JlYXRlIGEgc2V0dGVyIGZ1bmN0aW9uIGZvciBlYWNoIGZpZWxkCisgIGlmIChzZXR0ZXJzKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKGlzX3JlZmVyZW5jZSgoKm1faXRlcikpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGUgPSB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZvaWQgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6Ol9fc2V0XyIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKDo6c3RkOjpzaGFyZWRfcHRyPCIKKyAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIj4iOworICAgICAgICBvdXQgPDwgIiB2YWwpIHsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidm9pZCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6X19zZXRfIgorICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgIG91dCA8PCAiIHZhbCkgeyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF91cCgpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLT4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdmFsOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICAgIC8vIGFzc3VtZSBhbGwgZmllbGRzIGFyZSByZXF1aXJlZCBleGNlcHQgb3B0aW9uYWwgZmllbGRzLgorICAgICAgLy8gZm9yIG9wdGlvbmFsIGZpZWxkcyBjaGFuZ2UgX19pc3NldC5uYW1lIHRvIHRydWUKKyAgICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgICAgaWYgKGlzX29wdGlvbmFsKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAiX19pc3NldC4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisgIGlmIChpc191c2VyX3N0cnVjdCkgeworICAgIGdlbmVyYXRlX3N0cnVjdF9vc3RyZWFtX29wZXJhdG9yKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogTWFrZXMgYSBoZWxwZXIgZnVuY3Rpb24gdG8gZ2VuIGEgc3RydWN0IHJlYWRlci4KKyAqCisgKiBAcGFyYW0gb3V0IFN0cmVhbSB0byB3cml0ZSB0bworICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzKSB7CisgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90ICIKKyAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjpyZWFkKFByb3RvY29sXyogaXByb3QpIHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInVpbnQzMl90ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICI6OnJlYWQoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QpIHsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcworICBvdXQgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUSW5wdXRSZWN1cnNpb25UcmFja2VyIHRyYWNrZXIoKmlwcm90KTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCB4ZmVyID0gMDsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJzdGQ6OnN0cmluZyBmbmFtZTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZnR5cGU7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiaW50MTZfdCBmaWQ7IiA8PCBlbmRsCisgICAgICA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAieGZlciArPSBpcHJvdC0+cmVhZFN0cnVjdEJlZ2luKGZuYW1lKTsiIDw8IGVuZGwKKyAgICAgIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ1c2luZyA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRXhjZXB0aW9uOyIgPDwgZW5kbAorICAgICAgPDwgZW5kbDsKKworICAvLyBSZXF1aXJlZCB2YXJpYWJsZXMgYXJlbid0IGluIF9faXNzZXQsIHNvIHdlIG5lZWQgdG1wIHZhcnMgdG8gY2hlY2sgdGhlbS4KKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKKyAgICAgIGluZGVudChvdXQpIDw8ICJib29sIGlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkRmllbGRCZWdpbihmbmFtZSwgZnR5cGUsIGZpZCk7IiA8PCBlbmRsOworCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChmdHlwZSA9PSA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVE9QKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICBicmVhazsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaWYgKGZpZWxkcy5lbXB0eSgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IGlwcm90LT5za2lwKGZ0eXBlKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWQpIiA8PCBlbmRsOworCisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBjb25zdCBjaGFyKiBpc3NldF9wcmVmaXggPSAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgPyAidGhpcy0+X19pc3NldC4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiaXNzZXRfIjsKKworI2lmIDAKKyAgICAgICAgICAvLyBUaGlzIGNvZGUgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc2FtZSBmaWVsZCBpcyBlbmNvdW50ZXJlZCB0d2ljZS4KKyAgICAgICAgICAvLyBXZSd2ZSBkZWNpZGVkIHRvIGxlYXZlIGl0IG91dCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KKyAgICAgICAgICAvLyBUT0RPKGRyZWlzcyk6IEdlbmVyYXRlIHRoaXMgY29kZSBhbmQgImlmIiBpdCBvdXQgdG8gbWFrZSBpdCBlYXNpZXIKKyAgICAgICAgICAvLyBmb3IgcGVvcGxlIHJlY29tcGlsaW5nIHRocmlmdCB0byBpbmNsdWRlIGl0LgorICAgICAgICAgIG91dCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmICgiIDw8IGlzc2V0X3ByZWZpeCA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7IiA8PCBlbmRsOworI2VuZGlmCisKKyAgICAgIGlmIChwb2ludGVycyAmJiAhKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgIigqKHRoaXMtPiIsICIpKSIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy0+Iik7CisgICAgICB9CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgaXNzZXRfcHJlZml4IDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4ZmVyICs9IGlwcm90LT5za2lwKGZ0eXBlKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PAorICAgICAgICAgIC8vIFRPRE8oZHJlaXNzKTogTWFrZSB0aGlzIGFuIG9wdGlvbiB3aGVuIHRocmlmdCBzdHJ1Y3RzCisgICAgICAgICAgLy8gaGF2ZSBhIGNvbW1vbiBiYXNlIGNsYXNzLgorICAgICAgICAgIC8vIGluZGVudCgpIDw8ICIgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgICAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKKworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfSAvLyFmaWVsZHMuZW1wdHkoKQorICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgLy8gVGhyb3cgaWYgYW55IHJlcXVpcmVkIGZpZWxkcyBhcmUgbWlzc2luZy4KKyAgLy8gV2UgZG8gdGhpcyBhZnRlciByZWFkaW5nIHRoZSBzdHJ1Y3QgZW5kIHNvIHRoYXQKKyAgLy8gdGhlcmUgbWlnaHQgcG9zc2libHkgYmUgYSBjaGFuY2Ugb2YgY29udGludWluZy4KKyAgb3V0IDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgJyknIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4geGZlcjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHdyaXRlIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSBvdXQgU3RyZWFtIHRvIHdyaXRlIHRvCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0CisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgcG9pbnRlcnMpIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90ICIKKyAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjp3cml0ZShQcm90b2NvbF8qIG9wcm90KSBjb25zdCB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiOjp3cml0ZSg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCkgY29uc3QgeyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90IHhmZXIgPSAwOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRPdXRwdXRSZWN1cnNpb25UcmFja2VyIHRyYWNrZXIoKm9wcm90KTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEJlZ2luKFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBjaGVja19pZl9zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKmZfaXRlciktPmdldF90eXBlKCktPmlzX3hjZXB0aW9uKCk7CisgICAgaWYgKGNoZWNrX2lmX3NldCkgeworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5fX2lzc2V0LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkQmVnaW4oIgorICAgICAgICA8PCAiXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBpZiAocG9pbnRlcnMgJiYgISgqZl9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgIigqKHRoaXMtPiIsICIpKSIpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy0+Iik7CisgICAgfQorICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworICAgIGlmIChjaGVja19pZl9zZXQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAnfSc7CisgICAgfQorICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAicmV0dXJuIHhmZXI7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogU3RydWN0IHdyaXRlciBmb3IgcmVzdWx0IG9mIGEgZnVuY3Rpb24sIHdoaWNoIGNhbiBoYXZlIG9ubHkgb25lIG9mIGl0cworICogZmllbGRzIHNldCBhbmQgZG9lcyBhIGNvbmRpdGlvbmFsIGlmIGVsc2UgbG9vayB1cCBpbnRvIHRoZSBfX2lzc2V0IGZpZWxkCisgKiBvZiB0aGUgc3RydWN0LgorICoKKyAqIEBwYXJhbSBvdXQgT3V0cHV0IHN0cmVhbQorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHJlc3VsdCBzdHJ1Y3QKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJzKSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCAiCisgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6d3JpdGUoUHJvdG9jb2xfKiBvcHJvdCkgY29uc3QgeyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidWludDMyX3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIjo6d3JpdGUoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpIGNvbnN0IHsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90IHhmZXIgPSAwOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEJlZ2luKFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiBlbHNlIGlmICI7CisgICAgfQorCisgICAgb3V0IDw8ICIodGhpcy0+X19pc3NldC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRCZWdpbigiCisgICAgICAgIDw8ICJcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGlmIChwb2ludGVycykgeworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgIigqKHRoaXMtPiIsICIpKSIpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy0+Iik7CisgICAgfQorICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSI7CisgIH0KKworICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHhmZXI7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBzd2FwIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSBvdXQgU3RyZWFtIHRvIHdyaXRlIHRvCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0CisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3Rfc3dhcChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidm9pZCBzd2FwKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICZhLCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgIDw8ICIgJmIpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIExldCBhcmd1bWVudC1kZXBlbmRlbnQgbmFtZSBsb29rdXAgZmluZCB0aGUgY29ycmVjdCBzd2FwKCkgZnVuY3Rpb24gdG8KKyAgLy8gdXNlIGJhc2VkIG9uIHRoZSBhcmd1bWVudCB0eXBlcy4gIElmIG5vbmUgaXMgZm91bmQgaW4gdGhlIGFyZ3VtZW50cycKKyAgLy8gbmFtZXNwYWNlcywgZmFsbCBiYWNrIHRvIDo6c3RkOjpzd2FwKCkuCisgIG91dCA8PCBpbmRlbnQoKSA8PCAidXNpbmcgOjpzdGQ6OnN3YXA7IiA8PCBlbmRsOworCisgIGJvb2wgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIHRmaWVsZCA9ICpmX2l0ZXI7CisKKyAgICBpZiAodGZpZWxkLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IHRydWU7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzd2FwKGEuIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgYi4iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiCisgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBpZiAoaGFzX25vbnJlcXVpcmVkX2ZpZWxkcykgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic3dhcChhLl9faXNzZXQsIGIuX19pc3NldCk7IiA8PCBlbmRsOworICB9CisKKyAgLy8gaGFuZGxlIGVtcHR5IHN0cnVjdHMKKyAgaWYgKGZpZWxkcy5zaXplKCkgPT0gMCkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKHZvaWQpIGE7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKHZvaWQpIGI7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9vc3RyZWFtX29wZXJhdG9yX2RlY2woc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCAic3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCAiCisgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICA8PCAiJiBvYmopOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaWYgKCFoYXNfY3VzdG9tX29zdHJlYW0odHN0cnVjdCkpIHsKKyAgICAvLyB0aHJpZnQgZGVmaW5lcyB0aGlzIGJlaGF2aW9yCisgICAgb3V0IDw8ICJzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0ICIKKyAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICA8PCAiJiBvYmopIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvYmoucHJpbnRUbyhvdXQpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIG91dDsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kX2RlY2woc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCAidm9pZCAiOworICBpZiAodHN0cnVjdCkgeworICAgIG91dCA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6OiI7CisgIH0KKyAgb3V0IDw8ICJwcmludFRvKHN0ZDo6b3N0cmVhbSYgb3V0KSBjb25zdCI7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2RfZGVjbChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4dGVybmFsKSB7CisgIG91dCA8PCAiY29uc3QgY2hhciogIjsKKyAgaWYgKGV4dGVybmFsKSB7CisgICAgb3V0IDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6IjsKKyAgfQorICBvdXQgPDwgIndoYXQoKSBjb25zdCBub2V4Y2VwdCI7Cit9CisKK25hbWVzcGFjZSBzdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcl9nZW5lcmF0b3Igewordm9pZCBnZW5lcmF0ZV9yZXF1aXJlZF9maWVsZF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgdF9maWVsZCogZmllbGQpIHsKKyAgb3V0IDw8ICIgPDwgdG9fc3RyaW5nKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIikiOworfQorCit2b2lkIGdlbmVyYXRlX29wdGlvbmFsX2ZpZWxkX3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCB0X2ZpZWxkKiBmaWVsZCkgeworICBvdXQgPDwgIjsgKF9faXNzZXQuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID8gKG91dCI7CisgIGdlbmVyYXRlX3JlcXVpcmVkX2ZpZWxkX3ZhbHVlKG91dCwgZmllbGQpOworICBvdXQgPDwgIikgOiAob3V0IDw8IFwiPG51bGw+XCIpKSI7Cit9CisKK3ZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IHRfZmllbGQqIGZpZWxkKSB7CisgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpCisgICAgZ2VuZXJhdGVfb3B0aW9uYWxfZmllbGRfdmFsdWUob3V0LCBmaWVsZCk7CisgIGVsc2UKKyAgICBnZW5lcmF0ZV9yZXF1aXJlZF9maWVsZF92YWx1ZShvdXQsIGZpZWxkKTsKK30KKwordm9pZCBnZW5lcmF0ZV9maWVsZF9uYW1lKHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCB0X2ZpZWxkKiBmaWVsZCkgeworICBvdXQgPDwgIlwiIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiPVwiIjsKK30KKwordm9pZCBnZW5lcmF0ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgdF9maWVsZCogZmllbGQpIHsKKyAgZ2VuZXJhdGVfZmllbGRfbmFtZShvdXQsIGZpZWxkKTsKKyAgZ2VuZXJhdGVfZmllbGRfdmFsdWUob3V0LCBmaWVsZCk7Cit9CisKK3ZvaWQgZ2VuZXJhdGVfZmllbGRzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluZGVudCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBiZWcgPSBmaWVsZHMuYmVnaW4oKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gZmllbGRzLmVuZCgpOworCisgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBiZWc7IGl0ICE9IGVuZDsgKytpdCkgeworICAgIG91dCA8PCBpbmRlbnQgPDwgIm91dCA8PCAiOworCisgICAgaWYgKGl0ICE9IGJlZykgeworICAgICAgb3V0IDw8ICJcIiwgXCIgPDwgIjsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9maWVsZChvdXQsICppdCk7CisgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICB9Cit9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIG9wZXJhdG9yPDwKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKTsKKyAgZ2VuZXJhdGVfc3RydWN0X3ByaW50X21ldGhvZF9kZWNsKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCAiIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ1c2luZyA6OmFwYWNoZTo6dGhyaWZ0Ojp0b19zdHJpbmc7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIm91dCA8PCBcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiOyIgPDwgZW5kbDsKKyAgc3RydWN0X29zdHJlYW1fb3BlcmF0b3JfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZHMob3V0LCB0c3RydWN0LT5nZXRfbWVtYmVycygpLCBpbmRlbnQoKSk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3V0IDw8IFwiKVwiOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgd2hhdCgpIG1ldGhvZCBmb3IgZXhjZXB0aW9ucworICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXhjZXB0aW9uX3doYXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCk7CisgIGdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZF9kZWNsKG91dCwgdHN0cnVjdCwgdHJ1ZSk7CisgIG91dCA8PCAiIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAic3RkOjpzdHJpbmdzdHJlYW0gc3M7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInNzIDw8IFwiVEV4Y2VwdGlvbiAtIHNlcnZpY2UgaGFzIHRocm93bjogXCIgPDwgKnRoaXM7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMtPnRocmlmdFRFeGNlcHRpb25NZXNzYWdlSG9sZGVyXyA9IHNzLnN0cigpOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhpcy0+dGhyaWZ0VEV4Y2VwdGlvbk1lc3NhZ2VIb2xkZXJfLmNfc3RyKCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBcIlRFeGNlcHRpb24gLSBzZXJ2aWNlIGhhcyB0aHJvd246ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCI7IgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKKyAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcworICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgorICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBzdmNuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7CisKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZXMKKyAgc3RyaW5nIGZfaGVhZGVyX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc3ZjbmFtZSArICIuaCI7CisgIGZfaGVhZGVyXy5vcGVuKGZfaGVhZGVyX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyIGZpbGUgaW5jbHVkZXMKKyAgZl9oZWFkZXJfIDw8IGF1dG9nZW5fY29tbWVudCgpOworICBmX2hlYWRlcl8gPDwgIiNpZm5kZWYgIiA8PCBzdmNuYW1lIDw8ICJfSCIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHN2Y25hbWUgPDwgIl9IIiA8PCBlbmRsCisgICAgICAgICAgICA8PCBlbmRsOworICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKKyAgICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+IiA8PCBlbmRsIC8vIFRNZW1vcnlCdWZmZXIKKyAgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIDxmdW5jdGlvbmFsPiIgPDwgZW5kbCAKKyAgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIDxtZW1vcnk+IiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8ICJuYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBhc3luYyB7IiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8ICJjbGFzcyBUQXN5bmNDaGFubmVsOyIgPDwgZW5kbCA8PCAifX19IiA8PCBlbmRsOworICB9CisgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgPHRocmlmdC9URGlzcGF0Y2hQcm9jZXNzb3IuaD4iIDw8IGVuZGw7CisgIGlmIChnZW5fY29iX3N0eWxlXykgeworICAgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNEaXNwYXRjaFByb2Nlc3Nvci5oPiIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oPiIgPDwgZW5kbDsKKyAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXMuaFwiIgorICAgICAgICAgICAgPDwgZW5kbDsKKworICB0X3NlcnZpY2UqIGV4dGVuZHNfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zZXJ2aWNlICE9IE5VTEwpIHsKKyAgICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKihleHRlbmRzX3NlcnZpY2UtPmdldF9wcm9ncmFtKCkpKQorICAgICAgICAgICAgICA8PCBleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCkgPDwgIi5oXCIiIDw8IGVuZGw7CisgIH0KKworICBmX2hlYWRlcl8gPDwgZW5kbCA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9oZWFkZXJfIDw8ICIjaWZkZWYgX01TQ19WRVJcbiIKKyAgICAgICAgICAgICAgICIgICNwcmFnbWEgd2FybmluZyggcHVzaCApXG4iCisgICAgICAgICAgICAgICAiICAjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGUgOiA0MjUwICkgLy9pbmhlcml0aW5nIG1ldGhvZHMgdmlhIGRvbWluYW5jZSBcbiIKKyAgICAgICAgICAgICAgICIjZW5kaWZcblxuIjsKKworICAvLyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGZpbGUgaW5jbHVkZXMKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIHN2Y25hbWUgKyAiLmNwcCI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKyAgZl9zZXJ2aWNlXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLmhcIiIgPDwgZW5kbDsKKyAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiI2luY2x1ZGUgXCJ0aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oXCIiIDw8IGVuZGw7CisgIH0KKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLnRjY1wiIgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIHN0cmluZyBmX3NlcnZpY2VfdGNjX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc3ZjbmFtZSArICIudGNjIjsKKyAgICBmX3NlcnZpY2VfdGNjXy5vcGVuKGZfc2VydmljZV90Y2NfbmFtZS5jX3N0cigpKTsKKyAgICBmX3NlcnZpY2VfdGNjXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKyAgICBmX3NlcnZpY2VfdGNjXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLmhcIiIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlX3RjY18gPDwgIiNpZm5kZWYgIiA8PCBzdmNuYW1lIDw8ICJfVENDIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgc3ZjbmFtZSA8PCAiX1RDQyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKKyAgICAgIGZfc2VydmljZV90Y2NfIDw8ICIjaW5jbHVkZSBcInRocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmhcIiIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgbnNfb3Blbl8gPDwgZW5kbCA8PCBlbmRsOworICBmX3NlcnZpY2VfdGNjXyA8PCBlbmRsIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBhbGwgdGhlIGNvbXBvbmVudHMKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UsICIiKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2VfZmFjdG9yeSh0c2VydmljZSwgIiIpOworICBnZW5lcmF0ZV9zZXJ2aWNlX251bGwodHNlcnZpY2UsICIiKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UsICIiKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodHNlcnZpY2UsICIiKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9tdWx0aWZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSwgIkNvbmN1cnJlbnQiKTsKKworICAvLyBHZW5lcmF0ZSBza2VsZXRvbgorICBpZiAoIWdlbl9ub19za2VsZXRvbl8pIHsKKyAgICAgIGdlbmVyYXRlX3NlcnZpY2Vfc2tlbGV0b24odHNlcnZpY2UpOworICB9CisKKyAgLy8gR2VuZXJhdGUgYWxsIHRoZSBjb2IgY29tcG9uZW50cworICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSwgIkNvYkNsIik7CisgICAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UsICJDb2JTdiIpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlX2ZhY3RvcnkodHNlcnZpY2UsICJDb2JTdiIpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfbnVsbCh0c2VydmljZSwgIkNvYlN2Iik7CisgICAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UsICJDb2IiKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSwgIkNvYiIpOworCisgICAgaWYgKCFnZW5fbm9fc2tlbGV0b25fKSB7CisgICAgICBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX3NrZWxldG9uKHRzZXJ2aWNlKTsKKyAgICB9CisKKyAgfQorCisgIGZfaGVhZGVyXyA8PCAiI2lmZGVmIF9NU0NfVkVSXG4iCisgICAgICAgICAgICAgICAiICAjcHJhZ21hIHdhcm5pbmcoIHBvcCApXG4iCisgICAgICAgICAgICAgICAiI2VuZGlmXG5cbiI7CisKKyAgLy8gQ2xvc2UgdGhlIG5hbWVzcGFjZQorICBmX3NlcnZpY2VfIDw8IG5zX2Nsb3NlXyA8PCBlbmRsIDw8IGVuZGw7CisgIGZfc2VydmljZV90Y2NfIDw8IG5zX2Nsb3NlXyA8PCBlbmRsIDw8IGVuZGw7CisgIGZfaGVhZGVyXyA8PCBuc19jbG9zZV8gPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIFRPRE8oc2ltcGtpbnMpOiBNYWtlIHRoaXMgYSBzZXBhcmF0ZSBvcHRpb24KKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBzdmNuYW1lIDw8ICIudGNjXCIiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgICAgPDwgIl90eXBlcy50Y2NcIiIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZl9oZWFkZXJfIDw8ICIjZW5kaWYiIDw8IGVuZGw7CisgIGZfc2VydmljZV90Y2NfIDw8ICIjZW5kaWYiIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgdGhlIGZpbGVzCisgIGZfc2VydmljZV90Y2NfLmNsb3NlKCk7CisgIGZfc2VydmljZV8uY2xvc2UoKTsKKyAgZl9oZWFkZXJfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4gQmFzaWNhbGx5LCB0aGlzIGdlbmVyYXRlcyB0eXBlcworICogZm9yIGFsbCB0aGUgYXJndW1lbnRzIGFuZCByZXN1bHRzIHRvIGZ1bmN0aW9ucy4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBzdGQ6Om9zdHJlYW0mIG91dCA9IChnZW5fdGVtcGxhdGVzXyA/IGZfc2VydmljZV90Y2NfIDogZl9zZXJ2aWNlXyk7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgc3RyaW5nIG5hbWVfb3JpZyA9IHRzLT5nZXRfbmFtZSgpOworCisgICAgLy8gVE9ETyhkcmVpc3MpOiBXaHkgaXMgdGhpcyBzdHVmZiBub3QgaW4gZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycz8KKyAgICB0cy0+c2V0X25hbWUodHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24oZl9oZWFkZXJfLCB0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgZl9zZXJ2aWNlXywgdHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHMpOworICAgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIob3V0LCB0cyk7CisgICAgdHMtPnNldF9uYW1lKHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9wYXJncyIpOworICAgIGdlbmVyYXRlX3N0cnVjdF9kZWNsYXJhdGlvbihmX2hlYWRlcl8sIHRzLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOworICAgIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgZl9zZXJ2aWNlXywgdHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHMsIHRydWUpOworICAgIHRzLT5zZXRfbmFtZShuYW1lX29yaWcpOworCisgICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0c2VydmljZSwgKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKSB7CisKKyAgc3RyaW5nIHNlcnZpY2VfaWZfbmFtZSA9IHNlcnZpY2VfbmFtZV8gKyBzdHlsZSArICJJZiI7CisgIGlmIChzdHlsZSA9PSAiQ29iQ2wiKSB7CisgICAgLy8gRm9yd2FyZCBkZWNsYXJlIHRoZSBjbGllbnQuCisgICAgc3RyaW5nIGNsaWVudF9uYW1lID0gc2VydmljZV9uYW1lXyArICJDb2JDbGllbnQiOworICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgY2xpZW50X25hbWUgKz0gIlQiOworICAgICAgc2VydmljZV9pZl9uYW1lICs9ICJUIjsKKyAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgImNsYXNzICIgPDwgY2xpZW50X25hbWUgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9ICIgOiB2aXJ0dWFsIHB1YmxpYyAiICsgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSArIHN0eWxlICsgIklmIjsKKyAgICBpZiAoc3R5bGUgPT0gIkNvYkNsIiAmJiBnZW5fdGVtcGxhdGVzXykgeworICAgICAgLy8gVE9ETyhzaW1wa2lucyk6IElmIGdlbl90ZW1wbGF0ZXNfIGlzIGVuYWJsZWQsIHdlIGN1cnJlbnRseSBhc3N1bWUgYWxsCisgICAgICAvLyBwYXJlbnQgc2VydmljZXMgd2VyZSBhbHNvIGdlbmVyYXRlZCB3aXRoIHRlbXBsYXRlcyBlbmFibGVkLgorICAgICAgZXh0ZW5kcyArPSAiVDxQcm90b2NvbF8+IjsKKyAgICB9CisgIH0KKworICBpZiAoc3R5bGUgPT0gIkNvYkNsIiAmJiBnZW5fdGVtcGxhdGVzXykgeworICAgIGZfaGVhZGVyXyA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8ICJjbGFzcyAiIDw8IHNlcnZpY2VfaWZfbmFtZSA8PCBleHRlbmRzIDw8ICIgeyIgPDwgZW5kbCA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgc2VydmljZV9pZl9uYW1lIDw8ICIoKSB7fSIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5oYXNfZG9jKCkpCisgICAgICBmX2hlYWRlcl8gPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2hlYWRlcl8sICpmX2l0ZXIpOworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBzdHlsZSkgPDwgIiA9IDA7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoc3R5bGUgPT0gIkNvYkNsIiAmJiBnZW5fdGVtcGxhdGVzXykgeworICAgIC8vIGdlbmVyYXRlIGEgYmFja3dhcmRzLWNvbXBhdGlibGUgdHlwZWRlZiBmb3IgY2xpZW50cyB0aGF0IGRvIG5vdAorICAgIC8vIGtub3cgYWJvdXQgdGhlIG5ldyB0ZW1wbGF0ZS1zdHlsZSBjb2RlCisgICAgZl9oZWFkZXJfIDw8ICJ0eXBlZGVmICIgPDwgc2VydmljZV9pZl9uYW1lIDw8ICI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+ICIKKyAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiSWY7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBmYWN0b3J5LgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbnRlcmZhY2UgZmFjdG9yeSBmb3IuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZV9mYWN0b3J5KHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSkgeworICBzdHJpbmcgc2VydmljZV9pZl9uYW1lID0gc2VydmljZV9uYW1lXyArIHN0eWxlICsgIklmIjsKKworICAvLyBGaWd1cmUgb3V0IHRoZSBuYW1lIG9mIHRoZSB1cHBlci1tb3N0IHBhcmVudCBjbGFzcy4KKyAgLy8gR2V0dGluZyBldmVyeXRoaW5nIHRvIHdvcmsgb3V0IHByb3Blcmx5IHdpdGggaW5oZXJpdGFuY2UgaXMgYW5ub3lpbmcuCisgIC8vIEhlcmUncyB3aGF0IHdlJ3JlIGRvaW5nIGZvciBub3c6CisgIC8vCisgIC8vIC0gQWxsIGhhbmRsZXJzIGltcGxlbWVudCBnZXRIYW5kbGVyKCksIGJ1dCBzdWJjbGFzc2VzIHVzZSBjb3ZhcmlhbnQgcmV0dXJuCisgIC8vICAgdHlwZXMgdG8gcmV0dXJuIHRoZWlyIHNwZWNpZmljIHNlcnZpY2UgaW50ZXJmYWNlIGNsYXNzIHR5cGUuICBXZSBoYXZlIHRvCisgIC8vICAgdXNlIHJhdyBwb2ludGVycyBiZWNhdXNlIG9mIHRoaXM7IHNoYXJlZF9wdHI8PiBjYW4ndCBiZSB1c2VkIGZvcgorICAvLyAgIGNvdmFyaWFudCByZXR1cm4gdHlwZXMuCisgIC8vCisgIC8vIC0gU2luY2Ugd2UncmUgbm90IHVzaW5nIHNoYXJlZF9wdHI8Piwgd2UgYWxzbyBwcm92aWRlIGEgcmVsZWFzZUhhbmRsZXIoKQorICAvLyAgIGZ1bmN0aW9uIHRoYXQgbXVzdCBiZSBjYWxsZWQgdG8gcmVsZWFzZSBhIHBvaW50ZXIgdG8gYSBoYW5kbGVyIG9idGFpbmVkCisgIC8vICAgdmlhIGdldEhhbmRsZXIoKS4KKyAgLy8KKyAgLy8gICByZWxlYXNlSGFuZGxlcigpIGFsd2F5cyBhY2NlcHRzIGEgcG9pbnRlciB0byB0aGUgdXBwZXItbW9zdCBwYXJlbnQgY2xhc3MKKyAgLy8gICB0eXBlLiAgVGhpcyBpcyBuZWNlc3Nhcnkgc2luY2UgdGhlIHBhcmVudCB2ZXJzaW9ucyBvZiByZWxlYXNlSGFuZGxlcigpCisgIC8vICAgbWF5IGFjY2VwdCBhbnkgb2YgdGhlIHBhcmVudCB0eXBlcywgbm90IGp1c3QgdGhlIG1vc3Qgc3BlY2lmaWMgc3ViY2xhc3MKKyAgLy8gICB0eXBlLiAgSW1wbGVtZW50YXRpb25zIGNhbiB1c2UgZHluYW1pY19jYXN0IHRvIGNhc3QgdGhlIHBvaW50ZXIgdG8gdGhlCisgIC8vICAgc3ViY2xhc3MgdHlwZSBpZiBkZXNpcmVkLgorICB0X3NlcnZpY2UqIGJhc2Vfc2VydmljZSA9IHRzZXJ2aWNlOworICB3aGlsZSAoYmFzZV9zZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBiYXNlX3NlcnZpY2UgPSBiYXNlX3NlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIH0KKyAgc3RyaW5nIGJhc2VfaWZfbmFtZSA9IHR5cGVfbmFtZShiYXNlX3NlcnZpY2UpICsgc3R5bGUgKyAiSWYiOworCisgIC8vIEdlbmVyYXRlIHRoZSBhYnN0cmFjdCBmYWN0b3J5IGNsYXNzCisgIHN0cmluZyBmYWN0b3J5X25hbWUgPSBzZXJ2aWNlX2lmX25hbWUgKyAiRmFjdG9yeSI7CisgIHN0cmluZyBleHRlbmRzOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSAiIDogdmlydHVhbCBwdWJsaWMgIiArIHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyBzdHlsZSArICJJZkZhY3RvcnkiOworICB9CisKKyAgZl9oZWFkZXJfIDw8ICJjbGFzcyAiIDw8IGZhY3RvcnlfbmFtZSA8PCBleHRlbmRzIDw8ICIgeyIgPDwgZW5kbCA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgIiA8PCBzZXJ2aWNlX2lmX25hbWUgPDwgIiBIYW5kbGVyOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAidmlydHVhbCB+IiA8PCBmYWN0b3J5X25hbWUgPDwgIigpIHt9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgIgorICAgICAgICAgICAgPDwgc2VydmljZV9pZl9uYW1lIDw8ICIqIGdldEhhbmRsZXIoIgorICAgICAgICAgICAgPDwgImNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OlRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJ2aXJ0dWFsIHZvaWQgcmVsZWFzZUhhbmRsZXIoIiA8PCBiYXNlX2lmX25hbWUgPDwgIiogLyogaGFuZGxlciAqLykgPSAwOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNpbmdsZXRvbiBmYWN0b3J5IGNsYXNzCisgIHN0cmluZyBzaW5nbGV0b25fZmFjdG9yeV9uYW1lID0gc2VydmljZV9pZl9uYW1lICsgIlNpbmdsZXRvbkZhY3RvcnkiOworICBmX2hlYWRlcl8gPDwgImNsYXNzICIgPDwgc2luZ2xldG9uX2ZhY3RvcnlfbmFtZSA8PCAiIDogdmlydHVhbCBwdWJsaWMgIiA8PCBmYWN0b3J5X25hbWUgPDwgIiB7IgorICAgICAgICAgICAgPDwgZW5kbCA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgc2luZ2xldG9uX2ZhY3RvcnlfbmFtZSA8PCAiKGNvbnN0IDo6c3RkOjpzaGFyZWRfcHRyPCIgPDwgc2VydmljZV9pZl9uYW1lCisgICAgICAgICAgICA8PCAiPiYgaWZhY2UpIDogaWZhY2VfKGlmYWNlKSB7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB+IgorICAgICAgICAgICAgPDwgc2luZ2xldG9uX2ZhY3RvcnlfbmFtZSA8PCAiKCkge30iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCAiCisgICAgICAgICAgICA8PCBzZXJ2aWNlX2lmX25hbWUgPDwgIiogZ2V0SGFuZGxlcigiCisgICAgICAgICAgICA8PCAiY29uc3QgOjphcGFjaGU6OnRocmlmdDo6VENvbm5lY3Rpb25JbmZvJikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgIiAgcmV0dXJuIGlmYWNlXy5nZXQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJ2aXJ0dWFsIHZvaWQgcmVsZWFzZUhhbmRsZXIoIiA8PCBiYXNlX2lmX25hbWUgPDwgIiogLyogaGFuZGxlciAqLykge30iIDw8IGVuZGw7CisKKyAgZl9oZWFkZXJfIDw8IGVuZGwgPDwgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwiIDw8IHNlcnZpY2VfaWZfbmFtZQorICAgICAgICAgICAgPDwgIj4gaWZhY2VfOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgbnVsbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbnVsbCh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gIiAsIHZpcnR1YWwgcHVibGljICIgKyB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpICsgc3R5bGUgKyAiTnVsbCI7CisgIH0KKyAgZl9oZWFkZXJfIDw8ICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIk51bGwgOiB2aXJ0dWFsIHB1YmxpYyAiIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgIDw8IHN0eWxlIDw8ICJJZiIgPDwgZXh0ZW5kcyA8PCAiIHsiIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIk51bGwoKSB7fSIgPDwgZW5kbDsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBzdHlsZSwgIiIsIGZhbHNlKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICB0X3R5cGUqIHJldHVybnR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgdF9maWVsZCByZXR1cm5maWVsZChyZXR1cm50eXBlLCAiX3JldHVybiIpOworCisgICAgaWYgKHN0eWxlID09ICIiKSB7CisgICAgICBpZiAocmV0dXJudHlwZS0+aXNfdm9pZCgpIHx8IGlzX2NvbXBsZXhfdHlwZShyZXR1cm50eXBlKSkgeworICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmcmV0dXJuZmllbGQsIHRydWUpIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgIDw8ICJyZXR1cm4gX3JldHVybjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChzdHlsZSA9PSAiQ29iU3YiKSB7CisgICAgICBpZiAocmV0dXJudHlwZS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYigpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRfZmllbGQgcmV0dXJuZmllbGQocmV0dXJudHlwZSwgIl9yZXR1cm4iKTsKKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJnJldHVybmZpZWxkLCB0cnVlKSA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICA8PCAicmV0dXJuIGNvYihfcmV0dXJuKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgIlVOS05PV04gU1RZTEUiOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2NhbGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBhcmdfcHJlZml4KSB7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICB0X3R5cGUqIHJldF90eXBlID0gZ2V0X3RydWVfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpOworICBvdXQgPDwgaW5kZW50KCk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhcmV0X3R5cGUtPmlzX3ZvaWQoKSkgeworICAgIGlmIChpc19jb21wbGV4X3R5cGUocmV0X3R5cGUpKSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgb3V0IDw8IGlmYWNlIDw8ICItPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0YXJnZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCB0YXJnZXQgPDwgIiA9ICIgPDwgaWZhY2UgPDwgIi0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgaWZhY2UgPDwgIi0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiwgIjsKKyAgICB9CisgICAgb3V0IDw8IGFyZ19wcmVmaXggPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIG91dCA8PCAiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX3NrZWxldG9uKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIHN2Y25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKTsKKworICAvLyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGZpbGUgaW5jbHVkZXMKKyAgc3RyaW5nIGZfc2tlbGV0b25fbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzdmNuYW1lICsgIl9hc3luY19zZXJ2ZXIuc2tlbGV0b24uY3BwIjsKKworICBzdHJpbmcgbnMgPSBuYW1lc3BhY2VfcHJlZml4KHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSk7CisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NrZWxldG9uOworICBmX3NrZWxldG9uLm9wZW4oZl9za2VsZXRvbl9uYW1lLmNfc3RyKCkpOworICBmX3NrZWxldG9uIDw8ICIvLyBUaGlzIGF1dG9nZW5lcmF0ZWQgc2tlbGV0b24gZmlsZSBpbGx1c3RyYXRlcyBvbmUgd2F5IHRvIGFkYXB0IGEgc3luY2hyb25vdXMiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAiLy8gaW50ZXJmYWNlIGludG8gYW4gYXN5bmNocm9ub3VzIGludGVyZmFjZS4gWW91IHNob3VsZCBjb3B5IGl0IHRvIGFub3RoZXIiCisgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIvLyBmaWxlbmFtZSB0byBhdm9pZCBvdmVyd3JpdGluZyBpdCBhbmQgcmV3cml0ZSBhcyBhc3luY2hyb25vdXMgYW55IGZ1bmN0aW9ucyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICIvLyB0aGF0IHdvdWxkIG90aGVyd2lzZSBpbnRyb2R1Y2UgdW53YW50ZWQgbGF0ZW5jeS4iIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBzdmNuYW1lIDw8ICIuaFwiIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIHRoZSBmb2xsb3dpbmcgY29kZSB3b3VsZCBub3QgY29tcGlsZToKKyAgLy8gdXNpbmcgbmFtZXNwYWNlIDsKKyAgLy8gdXNpbmcgbmFtZXNwYWNlIDo6OworICBpZiAoKCFucy5lbXB0eSgpKSAmJiAobnMuY29tcGFyZSgiIDo6IikgIT0gMCkpIHsKKyAgICBmX3NrZWxldG9uIDw8ICJ1c2luZyBuYW1lc3BhY2UgIiA8PCBzdHJpbmcobnMsIDAsIG5zLnNpemUoKSAtIDIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBmX3NrZWxldG9uIDw8ICJjbGFzcyAiIDw8IHN2Y25hbWUgPDwgIkFzeW5jSGFuZGxlciA6ICIKKyAgICAgICAgICAgICA8PCAicHVibGljICIgPDwgc3ZjbmFtZSA8PCAiQ29iU3ZJZiB7IiA8PCBlbmRsIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2tlbGV0b24gPDwgaW5kZW50KCkgPDwgc3ZjbmFtZSA8PCAiQXN5bmNIYW5kbGVyKCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIgIHN5bmNIYW5kbGVyXyA9IHN0ZDo6YXV0b19wdHI8IiA8PCBzdmNuYW1lIDw8ICJIYW5kbGVyPihuZXcgIiA8PCBzdmNuYW1lCisgICAgICAgICAgICAgPDwgIkhhbmRsZXIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAvLyBZb3VyIGluaXRpYWxpemF0aW9uIGdvZXMgaGVyZSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3NrZWxldG9uIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkFzeW5jSGFuZGxlcigpOyIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NrZWxldG9uIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICJDb2JTdiIsICIiLCB0cnVlKSA8PCAiIHsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgdF90eXBlKiByZXR1cm50eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHRfZmllbGQgcmV0dXJuZmllbGQocmV0dXJudHlwZSwgIl9yZXR1cm4iKTsKKworICAgIHN0cmluZyB0YXJnZXQgPSByZXR1cm50eXBlLT5pc192b2lkKCkgPyAiIiA6ICJfcmV0dXJuIjsKKyAgICBpZiAoIXJldHVybnR5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgZl9za2VsZXRvbiA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZyZXR1cm5maWVsZCwgdHJ1ZSkgPDwgZW5kbDsKKyAgICB9CisgICAgZ2VuZXJhdGVfZnVuY3Rpb25fY2FsbChmX3NrZWxldG9uLCAqZl9pdGVyLCB0YXJnZXQsICJzeW5jSGFuZGxlcl8iLCAiIik7CisgICAgZl9za2VsZXRvbiA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYigiIDw8IHRhcmdldCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKGZfc2tlbGV0b24pOworICB9CisgIGZfc2tlbGV0b24gPDwgZW5kbCA8PCAiIHByb3RlY3RlZDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInN0ZDo6YXV0b19wdHI8IiA8PCBzdmNuYW1lCisgICAgICAgICAgICAgPDwgIkhhbmRsZXI+IHN5bmNIYW5kbGVyXzsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2tlbGV0b24gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgbXVsdGlmYWNlLCB3aGljaCBpcyBhIHNpbmdsZSBzZXJ2ZXIgdGhhdCBqdXN0IHRha2VzIGEgc2V0CisgKiBvZiBvYmplY3RzIGltcGxlbWVudGluZyB0aGUgaW50ZXJmYWNlIGFuZCBjYWxscyB0aGVtIGFsbCwgcmV0dXJuaW5nIHRoZQorICogdmFsdWUgb2YgdGhlIGxhc3Qgb25lIHRvIGJlIGNhbGxlZC4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBtdWx0aXNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX211bHRpZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX211bHRpZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfbXVsdGlmYWNlID0gIiwgcHVibGljICIgKyBleHRlbmRzICsgIk11bHRpZmFjZSI7CisgIH0KKworICBzdHJpbmcgbGlzdF90eXBlID0gc3RyaW5nKCJzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8IikgKyBzZXJ2aWNlX25hbWVfICsgIklmPiA+IjsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgZl9oZWFkZXJfIDw8ICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIk11bHRpZmFjZSA6ICIKKyAgICAgICAgICAgIDw8ICJ2aXJ0dWFsIHB1YmxpYyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmIiA8PCBleHRlbmRzX211bHRpZmFjZSA8PCAiIHsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJNdWx0aWZhY2UoIiA8PCBsaXN0X3R5cGUKKyAgICAgICAgICAgIDw8ICImIGlmYWNlcykgOiBpZmFjZXNfKGlmYWNlcykgeyIgPDwgZW5kbDsKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgIiAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPCIgKyBzZXJ2aWNlX25hbWVfICsgIklmPiA+OjppdGVyYXRvciBpdGVyOyIKKyAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBmb3IgKGl0ZXIgPSBpZmFjZXMuYmVnaW4oKTsgaXRlciAhPSBpZmFjZXMuZW5kKCk7ICsraXRlcikgeyIKKyAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAgICIgPDwgZXh0ZW5kcyA8PCAiTXVsdGlmYWNlOjphZGQoKml0ZXIpOyIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICB9CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICA8PCAiTXVsdGlmYWNlKCkge30iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gUHJvdGVjdGVkIGRhdGEgbWVtYmVycworICBmX2hlYWRlcl8gPDwgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGxpc3RfdHlwZSA8PCAiIGlmYWNlc187IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgIDw8ICJNdWx0aWZhY2UoKSB7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidm9pZCBhZGQoOjpzdGQ6OnNoYXJlZF9wdHI8IgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiSWY+IGlmYWNlKSB7IiA8PCBlbmRsOworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgIk11bHRpZmFjZTo6YWRkKGlmYWNlKTsiIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIGlmYWNlc18ucHVzaF9iYWNrKGlmYWNlKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnbGlzdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7CisKKyAgICBzdHJpbmcgY2FsbCA9IHN0cmluZygiaWZhY2VzX1tpXS0+IikgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiKCI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICBjYWxsICs9ICJfcmV0dXJuIjsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGZvciAoYV9pdGVyID0gYXJncy5iZWdpbigpOyBhX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2FsbCArPSAiLCAiOworICAgICAgfQorICAgICAgY2FsbCArPSAoKmFfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGNhbGwgKz0gIikiOworCisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiIikgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAic2l6ZV90IHN6ID0gaWZhY2VzXy5zaXplKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzaXplX3QgaSA9IDA7IgorICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJmb3IgKDsgaSA8IChzeiAtIDEpOyArK2kpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGNhbGwgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBpZiAoaXNfY29tcGxleF90eXBlKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGNhbGwgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGNhbGwgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBjYWxsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKSB7CisgIHN0cmluZyBpZnN0eWxlOworICBpZiAoc3R5bGUgPT0gIkNvYiIpIHsKKyAgICBpZnN0eWxlID0gIkNvYkNsIjsKKyAgfQorCisgIHN0ZDo6b3N0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl9zZXJ2aWNlX3RjY18gOiBmX3NlcnZpY2VfKTsKKyAgc3RyaW5nIHRlbXBsYXRlX2hlYWRlciwgdGVtcGxhdGVfc3VmZml4LCBzaG9ydF9zdWZmaXgsIHByb3RvY29sX3R5cGUsIF90aGlzOworICBzdHJpbmcgY29uc3QgcHJvdF9mYWN0b3J5X3R5cGUgPSAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3RvcnkiOworICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICB0ZW1wbGF0ZV9oZWFkZXIgPSAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz5cbiI7CisgICAgc2hvcnRfc3VmZml4ID0gIlQiOworICAgIHRlbXBsYXRlX3N1ZmZpeCA9ICJUPFByb3RvY29sXz4iOworICAgIHByb3RvY29sX3R5cGUgPSAiUHJvdG9jb2xfIjsKKyAgICBfdGhpcyA9ICJ0aGlzLT4iOworICB9IGVsc2UgeworICAgIHByb3RvY29sX3R5cGUgPSAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCI7CisgIH0KKyAgc3RyaW5nIHByb3RfcHRyID0gInN0ZDo6c2hhcmVkX3B0cjwgIiArIHByb3RvY29sX3R5cGUgKyAiPiI7CisgIHN0cmluZyBjbGllbnRfc3VmZml4ID0gIkNsaWVudCIgKyB0ZW1wbGF0ZV9zdWZmaXg7CisgIHN0cmluZyBpZl9zdWZmaXggPSAiSWYiOworICBpZiAoc3R5bGUgPT0gIkNvYiIpIHsKKyAgICBpZl9zdWZmaXggKz0gdGVtcGxhdGVfc3VmZml4OworICB9CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgLy8gVE9ETyhzaW1wa2lucyk6IElmIGdlbl90ZW1wbGF0ZXNfIGlzIGVuYWJsZWQsIHdlIGN1cnJlbnRseSBhc3N1bWUgYWxsCisgICAgLy8gcGFyZW50IHNlcnZpY2VzIHdlcmUgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0ZW1wbGF0ZXMgZW5hYmxlZC4KKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2NsaWVudCA9ICIsIHB1YmxpYyAiICsgZXh0ZW5kcyArIHN0eWxlICsgY2xpZW50X3N1ZmZpeDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgZl9oZWFkZXJfIDw8ICIvLyBUaGUgXCdjb25jdXJyZW50XCcgY2xpZW50IGlzIGEgdGhyZWFkIHNhZmUgY2xpZW50IHRoYXQgY29ycmVjdGx5IGhhbmRsZXNcbiIKKyAgICAgICAgICAgICAgICAgIi8vIG91dCBvZiBvcmRlciByZXNwb25zZXMuICBJdCBpcyBzbG93ZXIgdGhhbiB0aGUgcmVndWxhciBjbGllbnQsIHNvIHNob3VsZFxuIgorICAgICAgICAgICAgICAgICAiLy8gb25seSBiZSB1c2VkIHdoZW4geW91IG5lZWQgdG8gc2hhcmUgYSBjb25uZWN0aW9uIGFtb25nIG11bHRpcGxlIHRocmVhZHNcbiI7CisgIH0KKyAgZl9oZWFkZXJfIDw8IHRlbXBsYXRlX2hlYWRlciA8PCAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJDbGllbnQiIDw8IHNob3J0X3N1ZmZpeAorICAgICAgICAgICAgPDwgIiA6ICIKKyAgICAgICAgICAgIDw8ICJ2aXJ0dWFsIHB1YmxpYyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgaWZzdHlsZSA8PCBpZl9zdWZmaXggPDwgZXh0ZW5kc19jbGllbnQgPDwgIiB7IgorICAgICAgICAgICAgPDwgZW5kbCA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIGlmIChzdHlsZSAhPSAiQ29iIikgeworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJDbGllbnQiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKCIgPDwgcHJvdF9wdHIKKyAgICAgICAgICAgICAgPDwgIiBwcm90KSAiOworCisgICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgICAgZl9oZWFkZXJfIDw8ICJ7IiA8PCBlbmRsOworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIHNldFByb3RvY29sIiA8PCBzaG9ydF9zdWZmaXggPDwgIihwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9oZWFkZXJfIDw8ICI6IiA8PCBlbmRsOworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kcyA8PCBzdHlsZSA8PCBjbGllbnRfc3VmZml4IDw8ICIocHJvdCwgcHJvdCkge30iCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwgIigiIDw8IHByb3RfcHRyCisgICAgICAgICAgICAgIDw8ICIgaXByb3QsICIgPDwgcHJvdF9wdHIgPDwgIiBvcHJvdCkgIjsKKyAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgICBmX2hlYWRlcl8gPDwgInsiIDw8IGVuZGw7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgc2V0UHJvdG9jb2wiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKGlwcm90LG9wcm90KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9oZWFkZXJfIDw8ICI6IiA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgc3R5bGUgPDwgY2xpZW50X3N1ZmZpeAorICAgICAgICAgICAgICAgIDw8ICIoaXByb3QsIG9wcm90KSB7fSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBjcmVhdGUgdGhlIHNldFByb3RvY29sIG1ldGhvZHMKKyAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgICBmX2hlYWRlcl8gPDwgIiBwcml2YXRlOiIgPDwgZW5kbDsKKyAgICAgIC8vIDE6IG9uZSBwYXJhbWV0ZXIKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidm9pZCBzZXRQcm90b2NvbCIgPDwgc2hvcnRfc3VmZml4IDw8ICIoIiA8PCBwcm90X3B0ciA8PCAiIHByb3QpIHsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAic2V0UHJvdG9jb2wiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKHByb3QscHJvdCk7IiA8PCBlbmRsOworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgLy8gMjogdHdvIHBhcmFtZXRlcgorICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2b2lkIHNldFByb3RvY29sIiA8PCBzaG9ydF9zdWZmaXggPDwgIigiIDw8IHByb3RfcHRyIDw8ICIgaXByb3QsICIKKyAgICAgICAgICAgICAgICA8PCBwcm90X3B0ciA8PCAiIG9wcm90KSB7IiA8PCBlbmRsOworCisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgcGlwcm90Xz1pcHJvdDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcG9wcm90Xz1vcHJvdDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdF8gPSBpcHJvdC5nZXQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAiICBvcHJvdF8gPSBvcHJvdC5nZXQoKTsiIDw8IGVuZGw7CisKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGZfaGVhZGVyXyA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gR2VuZXJhdGUgZ2V0dGVycyBmb3IgdGhlIHByb3RvY29scy4KKyAgICAvLyBOb3RlIHRoYXQgdGhlc2UgYXJlIG5vdCBjdXJyZW50bHkgdGVtcGxhdGVkIGZvciBzaW1wbGljaXR5LgorICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBzaG91bGQgdGhleSBiZSB0ZW1wbGF0ZWQ/CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICJzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGdldElucHV0UHJvdG9jb2woKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IF90aGlzIDw8ICJwaXByb3RfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAic3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBnZXRPdXRwdXRQcm90b2NvbCgpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgX3RoaXMgPDwgInBvcHJvdF87IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IgorICAgICAgICAgICAgICA8PCBlbmRsOworCisgIH0gZWxzZSAvKiBpZiAoc3R5bGUgPT0gIkNvYiIpICovIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwgIigiCisgICAgICAgICAgICAgIDw8ICJzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNDaGFubmVsPiBjaGFubmVsLCAiCisgICAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeSogcHJvdG9jb2xGYWN0b3J5KSA6IiA8PCBlbmRsOworICAgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBjaGFubmVsXyhjaGFubmVsKSwiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAiICBpdHJhbnNfKG5ldyA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIoKSksIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgb3RyYW5zXyhuZXcgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKCkpLCIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICAgIC8vIFRQcm90b2NvbEZhY3RvcnkgY2xhc3NlcyByZXR1cm4gZ2VuZXJpYyBUUHJvdG9jb2wgcG9pbnRlcnMuCisgICAgICAgIC8vIFdlIGhhdmUgdG8gZHluYW1pYyBjYXN0IHRvIHRoZSBQcm90b2NvbF8gdHlwZSB3ZSBhcmUgZXhwZWN0aW5nLgorICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgcGlwcm90Xyg6OnN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8UHJvdG9jb2xfPigiCisgICAgICAgICAgICAgICAgICA8PCAicHJvdG9jb2xGYWN0b3J5LT5nZXRQcm90b2NvbChpdHJhbnNfKSkpLCIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgPDwgIiAgcG9wcm90Xyg6OnN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8UHJvdG9jb2xfPigiCisgICAgICAgICAgICAgICAgICA8PCAicHJvdG9jb2xGYWN0b3J5LT5nZXRQcm90b2NvbChvdHJhbnNfKSkpIHsiIDw8IGVuZGw7CisgICAgICAgIC8vIFRocm93IGEgVEV4Y2VwdGlvbiBpZiBlaXRoZXIgZHluYW1pYyBjYXN0IGZhaWxlZC4KKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIGlmICghcGlwcm90XyB8fCAhcG9wcm90XykgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgPDwgIiAgICB0aHJvdyA6OmFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKFwiIgorICAgICAgICAgICAgICAgICAgPDwgIlRQcm90b2NvbEZhY3RvcnkgcmV0dXJuZWQgdW5leHBlY3RlZCBwcm90b2NvbCB0eXBlIGluICIgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgPDwgc3R5bGUgPDwgIkNsaWVudCIgPDwgc2hvcnRfc3VmZml4IDw8ICIgY29uc3RydWN0b3JcIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICA8PCAiICB9IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIHBpcHJvdF8ocHJvdG9jb2xGYWN0b3J5LT5nZXRQcm90b2NvbChpdHJhbnNfKSksIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBwb3Byb3RfKHByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2wob3RyYW5zXykpIHsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgaXByb3RfID0gcGlwcm90Xy5nZXQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAiICBvcHJvdF8gPSBwb3Byb3RfLmdldCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kcyA8PCBzdHlsZSA8PCBjbGllbnRfc3VmZml4CisgICAgICAgICAgICAgICAgPDwgIihjaGFubmVsLCBwcm90b2NvbEZhY3RvcnkpIHt9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGlmIChzdHlsZSA9PSAiQ29iIikgeworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNDaGFubmVsPiBnZXRDaGFubmVsKCkgeyIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBfdGhpcyA8PCAiY2hhbm5lbF87IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGlmICghZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsIHZvaWQgY29tcGxldGVkX18oYm9vbCAvKiBzdWNjZXNzICovKSB7fSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgaWZzdHlsZSkgPDwgIjsiIDw8IGVuZGw7CisgICAgLy8gVE9ETyhkcmVpc3MpOiBVc2UgcHJpdmF0ZSBpbmhlcml0YW5jZSB0byBhdm9pZCBnZW5lcmF0aW5nIHRoaXNlIGluIGNvYi1zdHlsZS4KKyAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiICYmICEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAvLyBjb25jdXJyZW50IGNsaWVudHMgbmVlZCB0byBtb3ZlIHRoZSBzZXFpZCBmcm9tIHRoZSBzZW5kIGZ1bmN0aW9uIHRvIHRoZQorICAgICAgLy8gcmVjdiBmdW5jdGlvbi4gIE9uZXdheSBtZXRob2RzIGRvbid0IGhhdmUgYSByZWN2IGZ1bmN0aW9uLCBzbyB3ZSBkb24ndCBuZWVkIHRvCisgICAgICAvLyBtb3ZlIHRoZSBzZXFpZCBmb3IgdGhlbS4gIEF0dGVtcHRpbmcgdG8gZG8gc28gd291bGQgcmVzdWx0IGluIGEgc2VxaWQgbGVhay4KKyAgICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfaTMyLCAvKnJldHVybmluZyBzZXFpZCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7CisgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24sICIiKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uLCAiIikgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICB0X2ZpZWxkIHNlcUlkQXJnKGdfdHlwZV9pMzIsICJzZXFpZCIpOworICAgICAgICB0X3N0cnVjdCBzZXFJZEFyZ1N0cnVjdChwcm9ncmFtXyk7CisgICAgICAgIHNlcUlkQXJnU3RydWN0LmFwcGVuZCgmc2VxSWRBcmcpOworICAgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcUlkQXJnU3RydWN0KTsKKyAgICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uLCAiIikgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworICAgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7CisgICAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbiwgIiIpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX2hlYWRlcl8gPDwgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKHN0eWxlID09ICJDb2IiKSB7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNDaGFubmVsPiBjaGFubmVsXzsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBpdHJhbnNfOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IG90cmFuc187IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIGZfaGVhZGVyXyA8PAorICAgICAgaW5kZW50KCkgPDwgcHJvdF9wdHIgPDwgIiBwaXByb3RfOyIgPDwgZW5kbCA8PAorICAgICAgaW5kZW50KCkgPDwgcHJvdF9wdHIgPDwgIiBwb3Byb3RfOyIgPDwgZW5kbCA8PAorICAgICAgaW5kZW50KCkgPDwgcHJvdG9jb2xfdHlwZSA8PCAiKiBpcHJvdF87IiA8PCBlbmRsIDw8CisgICAgICBpbmRlbnQoKSA8PCBwcm90b2NvbF90eXBlIDw8ICIqIG9wcm90XzsiIDw8IGVuZGw7CisKKyAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICBmX2hlYWRlcl8gPDwKKyAgICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQ29uY3VycmVudENsaWVudFN5bmNJbmZvIHN5bmNfOyI8PGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgLy8gT3V0cHV0IGEgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdHlwZWRlZiB1c2luZworICAgIC8vIFRQcm90b2NvbCBhcyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyLgorICAgIGZfaGVhZGVyXyA8PCAidHlwZWRlZiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUKKyAgICAgICAgICAgICAgPDwgIkNsaWVudFQ8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+ICIgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZQorICAgICAgICAgICAgICA8PCAiQ2xpZW50OyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgc3RyaW5nIHNjb3BlID0gc2VydmljZV9uYW1lXyArIHN0eWxlICsgY2xpZW50X3N1ZmZpeCArICI6OiI7CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgc2VxSWRDYXB0dXJlOworICAgIHN0cmluZyBzZXFJZFVzZTsKKyAgICBzdHJpbmcgc2VxSWRDb21tYVVzZTsKKyAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiICYmICEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBzZXFJZENhcHR1cmUgPSAiaW50MzJfdCBzZXFpZCA9ICI7CisgICAgICBzZXFJZFVzZSA9ICJzZXFpZCI7CisgICAgICBzZXFJZENvbW1hVXNlID0gIiwgc2VxaWQiOworICAgIH0KKworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgaW5kZW50KG91dCkgPDwgdGVtcGxhdGVfaGVhZGVyOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgaWZzdHlsZSwgc2NvcGUpIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCBzZXFJZENhcHR1cmUgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKKworICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisKKyAgICAvLyBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgICAgb3V0IDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworCisgICAgaWYgKHN0eWxlICE9ICJDb2IiKSB7CisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICAgICAgICBvdXQgPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoX3JldHVybiIgPDwgc2VxSWRDb21tYVVzZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dCA8PCAicmV0dXJuIHJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBzZXFJZFVzZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IHNlcUlkVXNlIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IF90aGlzIDw8ICJjaGFubmVsXy0+c2VuZEFuZFJlY3ZNZXNzYWdlKCIKKyAgICAgICAgICAgIDw8ICI6OnN0ZDo6YmluZChjb2IsIHRoaXMpLCAiIDw8IF90aGlzIDw8ICJvdHJhbnNfLmdldCgpLCAiIDw8IF90aGlzIDw8ICJpdHJhbnNfLmdldCgpKTsiCisgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IF90aGlzIDw8ICJjaGFubmVsXy0+c2VuZE1lc3NhZ2UoIgorICAgICAgICAgICAgPDwgIjo6c3RkOjpiaW5kKGNvYiwgdGhpcyksICIgPDwgX3RoaXMgPDwgIm90cmFuc18uZ2V0KCkpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gaWYgKHN0eWxlICE9ICJDb2IiKSAvLyBUT0RPKGRyZWlzcyk6IExpYmlmeSB0aGUgY2xpZW50IGFuZCBkb24ndCBnZW5lcmF0ZSB0aGlzIGZvciBjb2Itc3R5bGUKKyAgICBpZiAodHJ1ZSkgeworICAgICAgdF90eXBlKiBzZW5kX2Z1bmNfcmV0dXJuX3R5cGUgPSBnX3R5cGVfdm9pZDsKKyAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIgJiYgISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgc2VuZF9mdW5jX3JldHVybl90eXBlID0gZ190eXBlX2kzMjsKKyAgICAgIH0KKyAgICAgIC8vIEZ1bmN0aW9uIGZvciBzZW5kaW5nCisgICAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oc2VuZF9mdW5jX3JldHVybl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworCisgICAgICAvLyBPcGVuIHRoZSBzZW5kIGZ1bmN0aW9uCisgICAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgdGVtcGxhdGVfaGVhZGVyOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uLCAiIiwgc2NvcGUpIDw8IGVuZGw7CisgICAgICBzY29wZV91cChvdXQpOworCisgICAgICAvLyBGdW5jdGlvbiBhcmd1bWVudHMgYW5kIHJlc3VsdHMKKyAgICAgIHN0cmluZyBhcmdzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9wYXJncyI7CisgICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9wcmVzdWx0IjsKKworICAgICAgc3RyaW5nIGNzZXFpZFZhbCA9ICIwIjsKKyAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgICAgY3NlcWlkVmFsID0gInRoaXMtPnN5bmNfLmdlbmVyYXRlU2VxSWQoKSI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgICAgb3V0IDw8CisgICAgICAgIGluZGVudCgpIDw8ICJpbnQzMl90IGNzZXFpZCA9ICIgPDwgY3NlcWlkVmFsIDw8ICI7IiA8PCBlbmRsOworICAgICAgaWYoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgIG91dCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VENvbmN1cnJlbnRTZW5kU2VudHJ5IHNlbnRyeSgmdGhpcy0+c3luY18pOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGlmIChzdHlsZSA9PSAiQ29iIikgeworICAgICAgICBvdXQgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCBfdGhpcyA8PCAib3RyYW5zXy0+cmVzZXRCdWZmZXIoKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBvdXQgPDwKKyAgICAgICAgaW5kZW50KCkgPDwgX3RoaXMgPDwgIm9wcm90Xy0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8CisgICAgICAgICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PAorICAgICAgICAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjoiIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRfT05FV0FZIiA6ICJUX0NBTEwiKSA8PAorICAgICAgICAiLCBjc2VxaWQpOyIgPDwgZW5kbCA8PCBlbmRsIDw8CisgICAgICAgIGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJnczsiIDw8IGVuZGw7CisKKyAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAmIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZSgiIDw8IF90aGlzIDw8ICJvcHJvdF8pOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8IF90aGlzCisgICAgICAgICAgPDwgIm9wcm90Xy0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IF90aGlzCisgICAgICAgICAgPDwgIm9wcm90Xy0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IF90aGlzCisgICAgICAgICAgPDwgIm9wcm90Xy0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOworCisgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzZW50cnkuY29tbWl0KCk7IiA8PCBlbmRsOworCisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNzZXFpZDsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIG91dCA8PCBlbmRsOworCisgICAgICAvLyBHZW5lcmF0ZSByZWN2IGZ1bmN0aW9uIG9ubHkgaWYgbm90IGFuIG9uZXdheSBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisKKyAgICAgICAgdF9maWVsZCBzZXFJZEFyZyhnX3R5cGVfaTMyLCAic2VxaWQiKTsKKyAgICAgICAgdF9zdHJ1Y3Qgc2VxSWRBcmdTdHJ1Y3QocHJvZ3JhbV8pOworICAgICAgICBzZXFJZEFyZ1N0cnVjdC5hcHBlbmQoJnNlcUlkQXJnKTsKKworICAgICAgICB0X3N0cnVjdCogcmVjdl9mdW5jdGlvbl9hcmdzID0gJm5vYXJnczsKKyAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgIHJlY3ZfZnVuY3Rpb25fYXJncyA9ICZzZXFJZEFyZ1N0cnVjdDsKKyAgICAgICAgfQorCisgICAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN2X2Z1bmN0aW9uX2FyZ3MpOworICAgICAgICAvLyBPcGVuIHRoZSByZWN2IGZ1bmN0aW9uCisgICAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgICAgIGluZGVudChvdXQpIDw8IHRlbXBsYXRlX2hlYWRlcjsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQob3V0KSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24sICIiLCBzY29wZSkgPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfdXAob3V0KTsKKworICAgICAgICBvdXQgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICJpbnQzMl90IHJzZXFpZCA9IDA7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgInN0ZDo6c3RyaW5nIGZuYW1lOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlOyIgPDwgZW5kbDsKKyAgICAgICAgaWYoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgb3V0IDw8CisgICAgICAgICAgICBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiLy8gdGhlIHJlYWQgbXV0ZXggZ2V0cyBkcm9wcGVkIGFuZCByZWFjcXVpcmVkIGFzIHBhcnQgb2Ygd2FpdEZvcldvcmsoKSIgPDwgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIi8vIFRoZSBkZXN0cnVjdG9yIG9mIHRoaXMgc2VudHJ5IHdha2VzIHVwIG90aGVyIGNsaWVudHMiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VENvbmN1cnJlbnRSZWN2U2VudHJ5IHNlbnRyeSgmdGhpcy0+c3luY18sIHNlcWlkKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sIGNvbXBsZXRlZCA9IGZhbHNlOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ0cnkgeyI7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICBvdXQgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICJ3aGlsZSh0cnVlKSB7IiA8PCBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBpZighdGhpcy0+c3luY18uZ2V0UGVuZGluZyhmbmFtZSwgbXR5cGUsIHJzZXFpZCkpIHsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgX3RoaXMgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VCZWdpbihmbmFtZSwgbXR5cGUsIHJzZXFpZCk7IiA8PCBlbmRsOworICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgc2NvcGVfZG93bihvdXQpOworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYoc2VxaWQgPT0gcnNlcWlkKSB7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICB9CisgICAgICAgIG91dCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAobXR5cGUgPT0gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OKSB7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIHg7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgeC5yZWFkKCIgPDwgX3RoaXMgPDwgImlwcm90Xyk7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGw7CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyh0cnVlKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBzZW50cnkuY29tbWl0KCk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIG91dCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IHg7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG10eXBlICE9IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1JFUExZKSB7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5za2lwKCIgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGw7CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyhmYWxzZSk7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIG91dCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgImlmIChmbmFtZS5jb21wYXJlKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiKSAhPSAwKSB7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5za2lwKCIgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGw7CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyhmYWxzZSk7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICBvdXQgPDwgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgLy8gaW4gYSBiYWQgc3RhdGUsIGRvbid0IGNvbW1pdCIgPDwgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgdXNpbmcgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEV4Y2VwdGlvbjsiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpCisgICAgICAgICAgICAmJiAhaXNfY29tcGxleF90eXBlKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICAgICAgICB0X2ZpZWxkIHJldHVybmZpZWxkKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwgIl9yZXR1cm4iKTsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmcmV0dXJuZmllbGQpIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdDsiIDw8IGVuZGw7CisKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAmX3JldHVybjsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKCIgPDwgX3RoaXMgPDwgImlwcm90Xyk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IF90aGlzCisgICAgICAgICAgICA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBfdGhpcworICAgICAgICAgICAgPDwgImlwcm90Xy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgICAvLyBDYXJlZnVsLCBvbmx5IGxvb2sgZm9yIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICAgICAgICBvdXQgPDwKKyAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC5zdWNjZXNzKSB7IiA8PCBlbmRsOworICAgICAgICAgICAgb3V0IDw8CisgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIC8vIF9yZXR1cm4gcG9pbnRlciBoYXMgbm93IGJlZW4gZmlsbGVkIiA8PCBlbmRsOworICAgICAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7CisgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyh0cnVlKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgc2VudHJ5LmNvbW1pdCgpOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PAorICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm47IiA8PCBlbmRsIDw8CisgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC5zdWNjZXNzKSB7IiA8PCBlbmRsOworICAgICAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7CisgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyh0cnVlKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgc2VudHJ5LmNvbW1pdCgpOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gX3JldHVybjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZF9fKHRydWUpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgc2VudHJ5LmNvbW1pdCgpOyIgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHRocm93IHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIG9ubHkgZ2V0IGhlcmUgaWYgd2UgYXJlIGEgdm9pZCBmdW5jdGlvbgorICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImNvbXBsZXRlZF9fKHRydWUpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbnRyeS5jb21taXQoKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiY29tcGxldGVkX18odHJ1ZSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gaW4gYSBiYWQgc3RhdGUsIGRvbid0IGNvbW1pdCIgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aHJvdyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24oOjphcGFjaGU6OnRocmlmdDo6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgb3V0IDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAvLyBzZXFpZCAhPSByc2VxaWQiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMtPnN5bmNfLnVwZGF0ZVBlbmRpbmcoZm5hbWUsIG10eXBlLCByc2VxaWQpOyIgPDwgZW5kbCA8PAorICAgICAgICAgICAgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgLy8gdGhpcyB3aWxsIHRlbXBvcmFyaWx5IHVubG9jayB0aGUgcmVhZE11dGV4LCBhbmQgbGV0IG90aGVyIGNsaWVudHMgZ2V0IHdvcmsgZG9uZSIgPDwgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhpcy0+c3luY18ud2FpdEZvcldvcmsoc2VxaWQpOyIgPDwgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0gLy8gZW5kIHdoaWxlKHRydWUpIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoICguLi4pIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaWYgKCFjb21wbGV0ZWQpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICBjb21wbGV0ZWRfXyhmYWxzZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3c7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK2NsYXNzIFByb2Nlc3NvckdlbmVyYXRvciB7CitwdWJsaWM6CisgIFByb2Nlc3NvckdlbmVyYXRvcih0X2NwcF9nZW5lcmF0b3IqIGdlbmVyYXRvciwgdF9zZXJ2aWNlKiBzZXJ2aWNlLCBjb25zdCBzdHJpbmcmIHN0eWxlKTsKKworICB2b2lkIHJ1bigpIHsKKyAgICBnZW5lcmF0ZV9jbGFzc19kZWZpbml0aW9uKCk7CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2hDYWxsKCkgZnVuY3Rpb24KKyAgICBnZW5lcmF0ZV9kaXNwYXRjaF9jYWxsKGZhbHNlKTsKKyAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIGdlbmVyYXRlX2Rpc3BhdGNoX2NhbGwodHJ1ZSk7CisgICAgfQorCisgICAgLy8gR2VuZXJhdGUgYWxsIG9mIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25zKCk7CisKKyAgICBnZW5lcmF0ZV9mYWN0b3J5KCk7CisgIH0KKworICB2b2lkIGdlbmVyYXRlX2NsYXNzX2RlZmluaXRpb24oKTsKKyAgdm9pZCBnZW5lcmF0ZV9kaXNwYXRjaF9jYWxsKGJvb2wgdGVtcGxhdGVfcHJvdG9jb2wpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25zKCk7CisgIHZvaWQgZ2VuZXJhdGVfZmFjdG9yeSgpOworCitwcm90ZWN0ZWQ6CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWYgPSBmYWxzZSwgYm9vbCBhcmcgPSBmYWxzZSkgeworICAgIHJldHVybiBnZW5lcmF0b3JfLT50eXBlX25hbWUodHR5cGUsIGluX3R5cGVkZWYsIGFyZyk7CisgIH0KKworICBzdGQ6OnN0cmluZyBpbmRlbnQoKSB7IHJldHVybiBnZW5lcmF0b3JfLT5pbmRlbnQoKTsgfQorICBzdGQ6Om9zdHJlYW0mIGluZGVudChzdGQ6Om9zdHJlYW0mIG9zKSB7IHJldHVybiBnZW5lcmF0b3JfLT5pbmRlbnQob3MpOyB9CisKKyAgdm9pZCBpbmRlbnRfdXAoKSB7IGdlbmVyYXRvcl8tPmluZGVudF91cCgpOyB9CisgIHZvaWQgaW5kZW50X2Rvd24oKSB7IGdlbmVyYXRvcl8tPmluZGVudF9kb3duKCk7IH0KKworICB0X2NwcF9nZW5lcmF0b3IqIGdlbmVyYXRvcl87CisgIHRfc2VydmljZSogc2VydmljZV87CisgIHN0ZDo6b3N0cmVhbSYgZl9oZWFkZXJfOworICBzdGQ6Om9zdHJlYW0mIGZfb3V0XzsKKyAgc3RyaW5nIHNlcnZpY2VfbmFtZV87CisgIHN0cmluZyBzdHlsZV87CisgIHN0cmluZyBwc3R5bGVfOworICBzdHJpbmcgY2xhc3NfbmFtZV87CisgIHN0cmluZyBpZl9uYW1lXzsKKyAgc3RyaW5nIGZhY3RvcnlfY2xhc3NfbmFtZV87CisgIHN0cmluZyBmaW5pc2hfY29iXzsKKyAgc3RyaW5nIGZpbmlzaF9jb2JfZGVjbF87CisgIHN0cmluZyByZXRfdHlwZV87CisgIHN0cmluZyBjYWxsX2NvbnRleHRfOworICBzdHJpbmcgY29iX2FyZ187CisgIHN0cmluZyBjYWxsX2NvbnRleHRfYXJnXzsKKyAgc3RyaW5nIGNhbGxfY29udGV4dF9kZWNsXzsKKyAgc3RyaW5nIHRlbXBsYXRlX2hlYWRlcl87CisgIHN0cmluZyB0ZW1wbGF0ZV9zdWZmaXhfOworICBzdHJpbmcgdHlwZW5hbWVfc3RyXzsKKyAgc3RyaW5nIGNsYXNzX3N1ZmZpeF87CisgIHN0cmluZyBleHRlbmRzXzsKK307CisKK1Byb2Nlc3NvckdlbmVyYXRvcjo6UHJvY2Vzc29yR2VuZXJhdG9yKHRfY3BwX2dlbmVyYXRvciogZ2VuZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzdHlsZSkKKyAgOiBnZW5lcmF0b3JfKGdlbmVyYXRvciksCisgICAgc2VydmljZV8oc2VydmljZSksCisgICAgZl9oZWFkZXJfKGdlbmVyYXRvci0+Zl9oZWFkZXJfKSwKKyAgICBmX291dF8oZ2VuZXJhdG9yLT5nZW5fdGVtcGxhdGVzXyA/IGdlbmVyYXRvci0+Zl9zZXJ2aWNlX3RjY18gOiBnZW5lcmF0b3ItPmZfc2VydmljZV8pLAorICAgIHNlcnZpY2VfbmFtZV8oZ2VuZXJhdG9yLT5zZXJ2aWNlX25hbWVfKSwKKyAgICBzdHlsZV8oc3R5bGUpIHsKKyAgaWYgKHN0eWxlXyA9PSAiQ29iIikgeworICAgIHBzdHlsZV8gPSAiQXN5bmMiOworICAgIGNsYXNzX25hbWVfID0gc2VydmljZV9uYW1lXyArIHBzdHlsZV8gKyAiUHJvY2Vzc29yIjsKKyAgICBpZl9uYW1lXyA9IHNlcnZpY2VfbmFtZV8gKyAiQ29iU3ZJZiI7CisKKyAgICBmaW5pc2hfY29iXyA9ICI6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCAiOworICAgIGZpbmlzaF9jb2JfZGVjbF8gPSAiOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+LCAiOworICAgIGNvYl9hcmdfID0gImNvYiwgIjsKKyAgICByZXRfdHlwZV8gPSAidm9pZCAiOworICB9IGVsc2UgeworICAgIGNsYXNzX25hbWVfID0gc2VydmljZV9uYW1lXyArICJQcm9jZXNzb3IiOworICAgIGlmX25hbWVfID0gc2VydmljZV9uYW1lXyArICJJZiI7CisKKyAgICByZXRfdHlwZV8gPSAiYm9vbCAiOworICAgIC8vIFRPRE8oZWRoYWxsKSBjYWxsQ29udGV4dCBzaG91bGQgZXZlbnR1YWxseSBiZSBhZGRlZCB0byBUQXN5bmNQcm9jZXNzb3IKKyAgICBjYWxsX2NvbnRleHRfID0gIiwgdm9pZCogY2FsbENvbnRleHQiOworICAgIGNhbGxfY29udGV4dF9hcmdfID0gIiwgY2FsbENvbnRleHQiOworICAgIGNhbGxfY29udGV4dF9kZWNsXyA9ICIsIHZvaWQqIjsKKyAgfQorCisgIGZhY3RvcnlfY2xhc3NfbmFtZV8gPSBjbGFzc19uYW1lXyArICJGYWN0b3J5IjsKKworICBpZiAoZ2VuZXJhdG9yLT5nZW5fdGVtcGxhdGVzXykgeworICAgIHRlbXBsYXRlX2hlYWRlcl8gPSAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz5cbiI7CisgICAgdGVtcGxhdGVfc3VmZml4XyA9ICI8UHJvdG9jb2xfPiI7CisgICAgdHlwZW5hbWVfc3RyXyA9ICJ0eXBlbmFtZSAiOworICAgIGNsYXNzX25hbWVfICs9ICJUIjsKKyAgICBmYWN0b3J5X2NsYXNzX25hbWVfICs9ICJUIjsKKyAgfQorCisgIGlmIChzZXJ2aWNlXy0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kc18gPSB0eXBlX25hbWUoc2VydmljZV8tPmdldF9leHRlbmRzKCkpICsgcHN0eWxlXyArICJQcm9jZXNzb3IiOworICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgICAgLy8gVE9ETyhzaW1wa2lucyk6IElmIGdlbl90ZW1wbGF0ZXNfIGlzIGVuYWJsZWQsIHdlIGN1cnJlbnRseSBhc3N1bWUgYWxsCisgICAgICAvLyBwYXJlbnQgc2VydmljZXMgd2VyZSBhbHNvIGdlbmVyYXRlZCB3aXRoIHRlbXBsYXRlcyBlbmFibGVkLgorICAgICAgZXh0ZW5kc18gKz0gIlQ8UHJvdG9jb2xfPiI7CisgICAgfQorICB9Cit9CisKK3ZvaWQgUHJvY2Vzc29yR2VuZXJhdG9yOjpnZW5lcmF0ZV9jbGFzc19kZWZpbml0aW9uKCkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHNlcnZpY2VfLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgcGFyZW50X2NsYXNzOworICBpZiAoc2VydmljZV8tPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIHBhcmVudF9jbGFzcyA9IGV4dGVuZHNfOworICB9IGVsc2UgeworICAgIGlmIChzdHlsZV8gPT0gIkNvYiIpIHsKKyAgICAgIHBhcmVudF9jbGFzcyA9ICI6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IiOworICAgIH0gZWxzZSB7CisgICAgICBwYXJlbnRfY2xhc3MgPSAiOjphcGFjaGU6OnRocmlmdDo6VERpc3BhdGNoUHJvY2Vzc29yIjsKKyAgICB9CisKKyAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIHBhcmVudF9jbGFzcyArPSAiVDxQcm90b2NvbF8+IjsKKyAgICB9CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgZl9oZWFkZXJfIDw8IHRlbXBsYXRlX2hlYWRlcl8gPDwgImNsYXNzICIgPDwgY2xhc3NfbmFtZV8gPDwgIiA6IHB1YmxpYyAiIDw8IHBhcmVudF9jbGFzcyA8PCAiIHsiCisgICAgICAgICAgICA8PCBlbmRsOworCisgIC8vIFByb3RlY3RlZCBkYXRhIG1lbWJlcnMKKyAgZl9oZWFkZXJfIDw8ICIgcHJvdGVjdGVkOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IiA8PCBpZl9uYW1lXyA8PCAiPiBpZmFjZV87IiA8PCBlbmRsOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgIiA8PCByZXRfdHlwZV8gPDwgImRpc3BhdGNoQ2FsbCgiIDw8IGZpbmlzaF9jb2JfCisgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QsICIKKyAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCwgIgorICAgICAgICAgICAgPDwgImNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwgaW50MzJfdCBzZXFpZCIgPDwgY2FsbF9jb250ZXh0XyA8PCAiKTsiIDw8IGVuZGw7CisgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCAiIDw8IHJldF90eXBlXyA8PCAiZGlzcGF0Y2hDYWxsVGVtcGxhdGVkKCIgPDwgZmluaXNoX2NvYl8KKyAgICAgICAgICAgICAgPDwgIlByb3RvY29sXyogaXByb3QsIFByb3RvY29sXyogb3Byb3QsICIKKyAgICAgICAgICAgICAgPDwgImNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwgaW50MzJfdCBzZXFpZCIgPDwgY2FsbF9jb250ZXh0XyA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyBQcm9jZXNzIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucworICBmX2hlYWRlcl8gPDwgIiBwcml2YXRlOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gRGVjbGFyZSBwcm9jZXNzTWFwXworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgIHZvaWQgKCIgPDwgY2xhc3NfbmFtZV8gPDwgIjo6KiIKKyAgICAgICAgICAgIDw8ICJQcm9jZXNzRnVuY3Rpb24pKCIgPDwgZmluaXNoX2NvYl9kZWNsXyA8PCAiaW50MzJfdCwgIgorICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqLCAiCisgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCoiIDw8IGNhbGxfY29udGV4dF9kZWNsXyA8PCAiKTsiIDw8IGVuZGw7CisgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiB2b2lkICgiIDw8IGNsYXNzX25hbWVfIDw8ICI6OioiCisgICAgICAgICAgICAgIDw8ICJTcGVjaWFsaXplZFByb2Nlc3NGdW5jdGlvbikoIiA8PCBmaW5pc2hfY29iX2RlY2xfIDw8ICJpbnQzMl90LCAiCisgICAgICAgICAgICAgIDw8ICJQcm90b2NvbF8qLCBQcm90b2NvbF8qIiA8PCBjYWxsX2NvbnRleHRfZGVjbF8gPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICJzdHJ1Y3QgUHJvY2Vzc0Z1bmN0aW9ucyB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFByb2Nlc3NGdW5jdGlvbiBnZW5lcmljOyIKKyAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBTcGVjaWFsaXplZFByb2Nlc3NGdW5jdGlvbiBzcGVjaWFsaXplZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgIiAgUHJvY2Vzc0Z1bmN0aW9ucyhQcm9jZXNzRnVuY3Rpb24gZywgIgorICAgICAgICAgICAgICA8PCAiU3BlY2lhbGl6ZWRQcm9jZXNzRnVuY3Rpb24gcykgOiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAgIGdlbmVyaWMoZyksIiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgc3BlY2lhbGl6ZWQocykge30iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgIiAgUHJvY2Vzc0Z1bmN0aW9ucygpIDogZ2VuZXJpYyhOVUxMKSwgc3BlY2lhbGl6ZWQoTlVMTCkgIgorICAgICAgICAgICAgICA8PCAie30iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICJ0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb25zPiAiCisgICAgICAgICAgICAgIDw8ICJQcm9jZXNzTWFwOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4gIgorICAgICAgICAgICAgICA8PCAiUHJvY2Vzc01hcDsiIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJQcm9jZXNzTWFwIHByb2Nlc3NNYXBfOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICJ2b2lkIHByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGZpbmlzaF9jb2JfCisgICAgICAgICAgICAgICAgICAgICAgPDwgImludDMyX3Qgc2VxaWQsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90IiA8PCBjYWxsX2NvbnRleHRfIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgInZvaWQgcHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZmluaXNoX2NvYl8KKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJpbnQzMl90IHNlcWlkLCBQcm90b2NvbF8qIGlwcm90LCBQcm90b2NvbF8qIG9wcm90IiA8PCBjYWxsX2NvbnRleHRfCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChzdHlsZV8gPT0gIkNvYiIpIHsKKyAgICAgIC8vIFhYWCBGYWN0b3IgdGhpcyBvdXQsIGV2ZW4gaWYgaXQgaXMgYSBwYWluLgorICAgICAgc3RyaW5nIHJldF9hcmcgPSAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiLCBjb25zdCAiICsgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkgKyAiJiBfcmV0dXJuIik7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZvaWQgcmV0dXJuXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIig6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiCisgICAgICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90LCAiCisgICAgICAgICAgICAgICAgPDwgInZvaWQqIGN0eCIgPDwgcmV0X2FyZyA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2b2lkIHJldHVybl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIig6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiCisgICAgICAgICAgICAgICAgICA8PCAiUHJvdG9jb2xfKiBvcHJvdCwgdm9pZCogY3R4IiA8PCByZXRfYXJnIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIC8vIFhYWCBEb24ndCBkZWNsYXJlIHRocm93IGlmIGl0IGRvZXNuJ3QgZXhpc3QKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidm9pZCB0aHJvd18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICIoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgorICAgICAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCwgdm9pZCogY3R4LCAiCisgICAgICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpOyIgPDwgZW5kbDsKKyAgICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZvaWQgdGhyb3dfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICIoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgorICAgICAgICAgICAgICAgICAgPDwgIlByb3RvY29sXyogb3Byb3QsIHZvaWQqIGN0eCwgIgorICAgICAgICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmX2hlYWRlcl8gPDwgIiBwdWJsaWM6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWVfIDw8ICIoOjpzdGQ6OnNoYXJlZF9wdHI8IiA8PCBpZl9uYW1lXworICAgICAgICAgICAgPDwgIj4gaWZhY2UpIDoiIDw8IGVuZGw7CisgIGlmICghZXh0ZW5kc18uZW1wdHkoKSkgeworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHNfIDw8ICIoaWZhY2UpLCIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgaWZhY2VfKGlmYWNlKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAicHJvY2Vzc01hcF9bXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdID0gIjsKKyAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIGZfaGVhZGVyXyA8PCAiUHJvY2Vzc0Z1bmN0aW9ucygiIDw8IGVuZGw7CisgICAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc19vbmx5XykgeworICAgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiICBOVUxMLCIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICIgICYiIDw8IGNsYXNzX25hbWVfIDw8ICI6OnByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiwiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiICAmIiA8PCBjbGFzc19uYW1lXyA8PCAiOjpwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIjsKKyAgICB9IGVsc2UgeworICAgICAgZl9oZWFkZXJfIDw8ICImIiA8PCBjbGFzc19uYW1lXyA8PCAiOjpwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX2hlYWRlcl8gPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCBjbGFzc19uYW1lXyA8PCAiKCkge30iCisgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgLy8gR2VuZXJhdGUgYSBiYWNrd2FyZHMgY29tcGF0aWJsZSB0eXBlZGVmLCBmb3IgY2FsbGVycyB3aG8gZG9uJ3Qga25vdworICAgIC8vIGFib3V0IHRoZSBuZXcgdGVtcGxhdGUtc3R5bGUgY29kZS4KKyAgICAvLworICAgIC8vIFdlIGNhbid0IHVzZSBUUHJvdG9jb2wgYXMgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciwgc2luY2UgUHJvY2Vzc29yVAorICAgIC8vIHByb3ZpZGVzIG92ZXJsb2FkZWQgdmVyc2lvbnMgb2YgbW9zdCBtZXRob2RzLCBvbmUgb2Ygd2hpY2ggYWNjZXB0cworICAgIC8vIFRQcm90b2NvbCBwb2ludGVycywgYW5kIG9uZSB3aGljaCBhY2NlcHRzIFByb3RvY29sXyBwb2ludGVycy4gIFRoaXMKKyAgICAvLyByZXN1bHRzIGluIGEgY29tcGlsZSBlcnJvciBpZiBpbnN0YW50aWF0ZWQgd2l0aCBQcm90b2NvbF8gPT0gVFByb3RvY29sLgorICAgIC8vIFRoZXJlZm9yZSwgd2UgZGVmaW5lIFREdW1teVByb3RvY29sIHNvbGVseSBzbyB3ZSBjYW4gdXNlIGl0IGFzIHRoZQorICAgIC8vIHRlbXBsYXRlIHBhcmFtZXRlciBoZXJlLgorICAgIGZfaGVhZGVyXyA8PCAidHlwZWRlZiAiIDw8IGNsYXNzX25hbWVfIDw8ICI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpURHVtbXlQcm90b2NvbCA+ICIKKyAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCBwc3R5bGVfIDw8ICJQcm9jZXNzb3I7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCBQcm9jZXNzb3JHZW5lcmF0b3I6OmdlbmVyYXRlX2Rpc3BhdGNoX2NhbGwoYm9vbCB0ZW1wbGF0ZV9wcm90b2NvbCkgeworICBzdHJpbmcgcHJvdG9jb2wgPSAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCI7CisgIHN0cmluZyBmdW5jdGlvbl9zdWZmaXg7CisgIGlmICh0ZW1wbGF0ZV9wcm90b2NvbCkgeworICAgIHByb3RvY29sID0gIlByb3RvY29sXyI7CisgICAgLy8gV2UgY2FsbCB0aGUgZ2VuZXJpYyB2ZXJzaW9uIGRpc3BhdGNoQ2FsbCgpLCBhbmQgdGhlIHNwZWNpYWxpemVkCisgICAgLy8gdmVyc2lvbiBkaXNwYXRjaENhbGxUZW1wbGF0ZWQoKS4gIFdlIGNhbid0IGNhbGwgdGhlbSBib3RoCisgICAgLy8gZGlzcGF0Y2hDYWxsKCksIHNpbmNlIHRoaXMgd2lsbCBjYXVzZSB0aGUgY29tcGlsZXIgdG8gaXNzdWUgYSB3YXJuaW5nIGlmCisgICAgLy8gYSBzZXJ2aWNlIHRoYXQgZG9lc24ndCB1c2UgdGVtcGxhdGVzIGluaGVyaXRzIGZyb20gYSBzZXJ2aWNlIHRoYXQgZG9lcworICAgIC8vIHVzZSB0ZW1wbGF0ZXM6IHRoZSBjb21waWxlciBjb21wbGFpbnMgdGhhdCB0aGUgc3ViY2xhc3Mgb25seSBpbXBsZW1lbnRzCisgICAgLy8gdGhlIGdlbmVyaWMgdmVyc2lvbiBvZiBkaXNwYXRjaENhbGwoKSwgYW5kIGhpZGVzIHRoZSB0ZW1wbGF0ZWQgdmVyc2lvbi4KKyAgICAvLyBVc2luZyBkaWZmZXJlbnQgbmFtZXMgZm9yIHRoZSB0d28gZnVuY3Rpb25zIHByZXZlbnRzIHRoaXMuCisgICAgZnVuY3Rpb25fc3VmZml4ID0gIlRlbXBsYXRlZCI7CisgIH0KKworICBmX291dF8gPDwgdGVtcGxhdGVfaGVhZGVyXyA8PCByZXRfdHlwZV8gPDwgY2xhc3NfbmFtZV8gPDwgdGVtcGxhdGVfc3VmZml4XyA8PCAiOjpkaXNwYXRjaENhbGwiCisgICAgICAgICA8PCBmdW5jdGlvbl9zdWZmaXggPDwgIigiIDw8IGZpbmlzaF9jb2JfIDw8IHByb3RvY29sIDw8ICIqIGlwcm90LCAiIDw8IHByb3RvY29sCisgICAgICAgICA8PCAiKiBvcHJvdCwgIgorICAgICAgICAgPDwgImNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwgaW50MzJfdCBzZXFpZCIgPDwgY2FsbF9jb250ZXh0XyA8PCAiKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBIT1Q6IG1lbWJlciBmdW5jdGlvbiBwb2ludGVyIG1hcAorICBmX291dF8gPDwgaW5kZW50KCkgPDwgdHlwZW5hbWVfc3RyXyA8PCAiUHJvY2Vzc01hcDo6aXRlcmF0b3IgcGZuOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgPDwgInBmbiA9IHByb2Nlc3NNYXBfLmZpbmQoZm5hbWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgPDwgImlmIChwZm4gPT0gcHJvY2Vzc01hcF8uZW5kKCkpIHsiIDw8IGVuZGw7CisgIGlmIChleHRlbmRzXy5lbXB0eSgpKSB7CisgICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICIgIGlwcm90LT5za2lwKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgIDw8ICIgIGlwcm90LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICA8PCAiICBpcHJvdC0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgPDwgIiAgOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uICIKKyAgICAgICAgICAgICAgIngoOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAiCisgICAgICAgICAgICAgICInXCIrZm5hbWUrXCInXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICA8PCAiICBvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oZm5hbWUsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTiwgc2VxaWQpOyIKKyAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgPDwgIiAgb3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICA8PCAiICBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgIDw8ICIgIG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgPDwgKHN0eWxlXyA9PSAiQ29iIiA/ICIgIHJldHVybiBjb2IodHJ1ZSk7IiA6ICIgIHJldHVybiB0cnVlOyIpIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGV4dGVuZHNfIDw8ICI6OmRpc3BhdGNoQ2FsbCgiCisgICAgICAgICAgIDw8IChzdHlsZV8gPT0gIkNvYiIgPyAiY29iLCAiIDogIiIpIDw8ICJpcHJvdCwgb3Byb3QsIGZuYW1lLCBzZXFpZCIgPDwgY2FsbF9jb250ZXh0X2FyZ18KKyAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICB9CisgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgaWYgKHRlbXBsYXRlX3Byb3RvY29sKSB7CisgICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICIodGhpcy0+KihwZm4tPnNlY29uZC5zcGVjaWFsaXplZCkpIjsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc19vbmx5XykgeworICAgICAgLy8gVE9ETzogVGhpcyBpcyBhIG51bGwgcG9pbnRlciwgc28gbm90aGluZyBnb29kIHdpbGwgY29tZSBmcm9tIGNhbGxpbmcKKyAgICAgIC8vIGl0LiAgVGhyb3cgYW4gZXhjZXB0aW9uIGluc3RlYWQuCisgICAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgIih0aGlzLT4qKHBmbi0+c2Vjb25kLmdlbmVyaWMpKSI7CisgICAgfSBlbHNlIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICIodGhpcy0+KihwZm4tPnNlY29uZC5nZW5lcmljKSkiOworICAgIH0gZWxzZSB7CisgICAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgIih0aGlzLT4qKHBmbi0+c2Vjb25kKSkiOworICAgIH0KKyAgfQorICBmX291dF8gPDwgIigiIDw8IGNvYl9hcmdfIDw8ICJzZXFpZCwgaXByb3QsIG9wcm90IiA8PCBjYWxsX2NvbnRleHRfYXJnXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgLy8gVE9ETyhkcmVpc3MpOiByZXR1cm4gcGZuIHJldD8KKyAgaWYgKHN0eWxlXyA9PSAiQ29iIikgeworICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfb3V0XyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIFByb2Nlc3NvckdlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbnMoKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gc2VydmljZV8tPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgICAgZ2VuZXJhdG9yXy0+Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihzZXJ2aWNlXywgKmZfaXRlciwgc3R5bGVfLCBmYWxzZSk7CisgICAgICBnZW5lcmF0b3JfLT5nZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHNlcnZpY2VfLCAqZl9pdGVyLCBzdHlsZV8sIHRydWUpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0b3JfLT5nZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHNlcnZpY2VfLCAqZl9pdGVyLCBzdHlsZV8sIGZhbHNlKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBQcm9jZXNzb3JHZW5lcmF0b3I6OmdlbmVyYXRlX2ZhY3RvcnkoKSB7CisgIHN0cmluZyBpZl9mYWN0b3J5X25hbWUgPSBpZl9uYW1lXyArICJGYWN0b3J5IjsKKworICAvLyBHZW5lcmF0ZSB0aGUgZmFjdG9yeSBjbGFzcyBkZWZpbml0aW9uCisgIGZfaGVhZGVyXyA8PCB0ZW1wbGF0ZV9oZWFkZXJfIDw8ICJjbGFzcyAiIDw8IGZhY3RvcnlfY2xhc3NfbmFtZV8gPDwgIiA6IHB1YmxpYyA6OmFwYWNoZTo6dGhyaWZ0OjoiCisgICAgICAgICAgICA8PCAoc3R5bGVfID09ICJDb2IiID8gImFzeW5jOjpUQXN5bmNQcm9jZXNzb3JGYWN0b3J5IiA6ICJUUHJvY2Vzc29yRmFjdG9yeSIpIDw8ICIgeyIKKyAgICAgICAgICAgIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgZmFjdG9yeV9jbGFzc19uYW1lXyA8PCAiKGNvbnN0IDo6c3RkOjpzaGFyZWRfcHRyPCAiIDw8IGlmX2ZhY3RvcnlfbmFtZQorICAgICAgICAgICAgPDwgIiA+JiBoYW5kbGVyRmFjdG9yeSkgOiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgIiAgICBoYW5kbGVyRmFjdG9yeV8oaGFuZGxlckZhY3RvcnkpIHt9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6IgorICAgICAgICAgICAgPDwgKHN0eWxlXyA9PSAiQ29iIiA/ICJhc3luYzo6VEFzeW5jUHJvY2Vzc29yIiA6ICJUUHJvY2Vzc29yIikgPDwgIiA+ICIKKyAgICAgICAgICAgIDw8ICJnZXRQcm9jZXNzb3IoY29uc3QgOjphcGFjaGU6OnRocmlmdDo6VENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbyk7IiA8PCBlbmRsOworCisgIGZfaGVhZGVyXyA8PCBlbmRsIDw8ICIgcHJvdGVjdGVkOiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8ICIKKyAgICAgICAgICAgIDw8IGlmX2ZhY3RvcnlfbmFtZSA8PCAiID4gaGFuZGxlckZhY3RvcnlfOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gSWYgd2UgYXJlIGdlbmVyYXRpbmcgdGVtcGxhdGVzLCBvdXRwdXQgYSB0eXBlZGVmIGZvciB0aGUgcGxhaW4KKyAgLy8gZmFjdG9yeSBuYW1lLgorICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICBmX2hlYWRlcl8gPDwgInR5cGVkZWYgIiA8PCBmYWN0b3J5X2NsYXNzX25hbWVfCisgICAgICAgICAgICAgIDw8ICI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpURHVtbXlQcm90b2NvbCA+ICIgPDwgc2VydmljZV9uYW1lXyA8PCBwc3R5bGVfCisgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3JGYWN0b3J5OyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGdldFByb2Nlc3NvcigpIG1ldGhvZAorICBmX291dF8gPDwgdGVtcGxhdGVfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OiIKKyAgICAgICAgIDw8IChzdHlsZV8gPT0gIkNvYiIgPyAiYXN5bmM6OlRBc3luY1Byb2Nlc3NvciIgOiAiVFByb2Nlc3NvciIpIDw8ICIgPiAiCisgICAgICAgICA8PCBmYWN0b3J5X2NsYXNzX25hbWVfIDw8IHRlbXBsYXRlX3N1ZmZpeF8gPDwgIjo6Z2V0UHJvY2Vzc29yKCIKKyAgICAgICAgIDw8ICJjb25zdCA6OmFwYWNoZTo6dGhyaWZ0OjpUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX291dF8gPDwgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlJlbGVhc2VIYW5kbGVyPCAiIDw8IGlmX2ZhY3RvcnlfbmFtZQorICAgICAgICAgPDwgIiA+IGNsZWFudXAoaGFuZGxlckZhY3RvcnlfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCAiCisgICAgICAgICA8PCBpZl9uYW1lXyA8PCAiID4gaGFuZGxlcigiCisgICAgICAgICA8PCAiaGFuZGxlckZhY3RvcnlfLT5nZXRIYW5kbGVyKGNvbm5JbmZvKSwgY2xlYW51cCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OiIKKyAgICAgICAgIDw8IChzdHlsZV8gPT0gIkNvYiIgPyAiYXN5bmM6OlRBc3luY1Byb2Nlc3NvciIgOiAiVFByb2Nlc3NvciIpIDw8ICIgPiAiCisgICAgICAgICA8PCAicHJvY2Vzc29yKG5ldyAiIDw8IGNsYXNzX25hbWVfIDw8IHRlbXBsYXRlX3N1ZmZpeF8gPDwgIihoYW5kbGVyKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICA8PCAicmV0dXJuIHByb2Nlc3NvcjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBwcm9jZXNzb3IgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBwcm9jZXNzb3IgZm9yLgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKSB7CisgIFByb2Nlc3NvckdlbmVyYXRvciBnZW5lcmF0b3IodGhpcywgdHNlcnZpY2UsIHN0eWxlKTsKKyAgZ2VuZXJhdG9yLnJ1bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6Om9zdHJlYW0mIG91dCA9IChnZW5fdGVtcGxhdGVzXyA/IGZfc2VydmljZV90Y2NfIDogZl9zZXJ2aWNlXyk7CisKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24oZl9oZWFkZXJfLCAmcmVzdWx0LCBmYWxzZSk7CisgIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOworICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG91dCwgJnJlc3VsdCk7CisgIGdlbmVyYXRlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgJnJlc3VsdCk7CisKKyAgcmVzdWx0LnNldF9uYW1lKHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9wcmVzdWx0Iik7CisgIGdlbmVyYXRlX3N0cnVjdF9kZWNsYXJhdGlvbihmX2hlYWRlcl8sICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlLCBnZW5fY29iX3N0eWxlXyk7CisgIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOworICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG91dCwgJnJlc3VsdCwgdHJ1ZSk7CisgIGlmIChnZW5fY29iX3N0eWxlXykgeworICAgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIob3V0LCAmcmVzdWx0LCB0cnVlKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNwZWNpYWxpemVkKSB7CisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICBzdHJpbmcgc2VydmljZV9mdW5jX25hbWUgPSAiXCIiICsgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiLiIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiXCIiOworCisgIHN0ZDo6b3N0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl9zZXJ2aWNlX3RjY18gOiBmX3NlcnZpY2VfKTsKKworICBzdHJpbmcgcHJvdF90eXBlID0gKHNwZWNpYWxpemVkID8gIlByb3RvY29sXyIgOiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCIpOworICBzdHJpbmcgY2xhc3Nfc3VmZml4OworICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICBjbGFzc19zdWZmaXggPSAiVDxQcm90b2NvbF8+IjsKKyAgfQorCisgIC8vIEkgdHJpZWQgdG8gZG8gdGhpcyBhcyBvbmUgZnVuY3Rpb24uICBJIHJlYWxseSBkaWQuICBCdXQgaXQgd2FzIHRvbyBoYXJkLgorICBpZiAoc3R5bGUgIT0gIkNvYiIpIHsKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOworICAgIH0KKyAgICBjb25zdCBib29sIHVubmFtZWRfb3Byb3Rfc2VxaWQgPSB0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICEoZ2VuX3RlbXBsYXRlc18gJiYgIXNwZWNpYWxpemVkKTsKKyAgICBvdXQgPDwgInZvaWQgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXggPDwgIjo6IgorICAgICAgICA8PCAicHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCIKKyAgICAgICAgPDwgImludDMyX3QiIDw8ICh1bm5hbWVkX29wcm90X3NlcWlkID8gIiwgIiA6ICIgc2VxaWQsICIpIDw8IHByb3RfdHlwZSA8PCAiKiBpcHJvdCwgIgorICAgICAgICA8PCBwcm90X3R5cGUgPDwgIioiIDw8ICh1bm5hbWVkX29wcm90X3NlcWlkID8gIiwgIiA6ICIgb3Byb3QsICIpIDw8ICJ2b2lkKiBjYWxsQ29udGV4dCkiCisgICAgICAgIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIHN0cmluZyBhcmdzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXVubmFtZWRfb3Byb3Rfc2VxaWQpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKHZvaWQpIHNlcWlkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiKHZvaWQpIG9wcm90OyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZvaWQqIGN0eCA9IE5VTEw7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIGN0eCA9IHRoaXMtPmV2ZW50SGFuZGxlcl8tPmdldENvbnRleHQoIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBjYWxsQ29udGV4dCk7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yQ29udGV4dEZyZWVyIGZyZWVyKCIKKyAgICAgICAgPDwgInRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCksIGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wcmVSZWFkKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3M7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJhcmdzLnJlYWQoaXByb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ1aW50MzJfdCBieXRlcyA9IGlwcm90LT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnBvc3RSZWFkKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBieXRlcyk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBEZWNsYXJlIHJlc3VsdAorICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQ7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFRyeSBibG9jayBmb3IgZnVuY3Rpb25zIHdpdGggZXhjZXB0aW9ucworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBpZiAoaXNfY29tcGxleF90eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgb3V0IDw8ICJpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIocmVzdWx0LnN1Y2Nlc3MiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICJyZXN1bHQuc3VjY2VzcyA9IGlmYWNlXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgImlmYWNlXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICAgIH0KKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKworICAgIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXN1bHQuX19pc3NldC5zdWNjZXNzID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iOworCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBvdXQgPDwgIiBjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICYiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuX19pc3NldC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAifSI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIG91dCA8PCAiIGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZSkgeyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIgY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJikgeyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+aGFuZGxlckVycm9yKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24geChlLndoYXQoKSk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgPDwgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAieC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucworICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5hc3luY0NvbXBsZXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVzdWx0IGludG8gYSBzdHJ1Y3QKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cHJlV3JpdGUoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICA8PCAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1JFUExZLCBzZXFpZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYnl0ZXMgPSBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cG9zdFdyaXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBieXRlcyk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KKworICAvLyBDb2Igc3R5bGUuCisgIGVsc2UgeworICAgIC8vIFByb2Nlc3NvciBlbnRyeSBwb2ludC4KKyAgICAvLyBUT0RPKGVkaGFsbCkgdXBkYXRlIGZvciBjYWxsQ29udGV4dCB3aGVuIFRFdmVudFNlcnZlciBpcyByZWFkeQorICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8ICJ2b2lkICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXggPDwgIjo6cHJvY2Vzc18iCisgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKKyAgICAgICAgPDwgcHJvdF90eXBlIDw8ICIqIGlwcm90LCAiIDw8IHByb3RfdHlwZSA8PCAiKiBvcHJvdCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIC8vIFRPRE8oc2ltcGtpbnMpOiB3ZSBjb3VsZCB0cnkgdG8gY29uc29sZGF0ZSB0aGlzCisgICAgLy8gd2l0aCB0aGUgbm9uLWNvYiBjb2RlIGFib3ZlCisgICAgaWYgKGdlbl90ZW1wbGF0ZXNfICYmICFzcGVjaWFsaXplZCkgeworICAgICAgLy8gSWYgdGhlc2UgYXJlIGluc3RhbmNlcyBvZiBQcm90b2NvbF8sIGluc3RlYWQgb2YgYW55IG9sZCBUUHJvdG9jb2wsCisgICAgICAvLyB1c2UgdGhlIHNwZWNpYWxpemVkIHByb2Nlc3MgZnVuY3Rpb24gaW5zdGVhZC4KKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiUHJvdG9jb2xfKiBfaXByb3QgPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4oaXByb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJQcm90b2NvbF8qIF9vcHJvdCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgImlmIChfaXByb3QgJiYgX29wcm90KSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBwcm9jZXNzXyIKKyAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihjb2IsIHNlcWlkLCBfaXByb3QsIF9vcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IgorICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBpcHJvdCwgX2lwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiVF9HRU5FUklDX1BST1RPQ09MKHRoaXMsIG9wcm90LCBfb3Byb3QpOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIih2b2lkKSBzZXFpZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIih2b2lkKSBvcHJvdDsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJfYXJncyBhcmdzOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidm9pZCogY3R4ID0gTlVMTDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgY3R4ID0gdGhpcy0+ZXZlbnRIYW5kbGVyXy0+Z2V0Q29udGV4dCgiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIE5VTEwpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckNvbnRleHRGcmVlciBmcmVlcigiCisgICAgICAgIDw8ICJ0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpLCBjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wcmVSZWFkKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJpcHJvdC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgInVpbnQzMl90IGJ5dGVzID0gaXByb3QtPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnBvc3RSZWFkKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBieXRlcyk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgIC8vIFRPRE8oZHJlaXNzKTogSGFuZGxlIFRFeGNlcHRpb25zPyAgRXhwb3NlIHRvIHNlcnZlcj8KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICAgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPmhhbmRsZXJFcnJvcihjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGNvYihmYWxzZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPmFzeW5jQ29tcGxldGUoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICAvLyBUT0RPKGRyZWlzcyk6IEZpZ3VyZSBvdXQgYSBzdHJhdGVneSBmb3IgZXhjZXB0aW9ucyBpbiBhc3luYyBoYW5kbGVycy4KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZyZWVyLnVucmVnaXN0ZXIoKTsiIDw8IGVuZGw7CisgICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIC8vIE5vIHJldHVybi4gIEp1c3QgaGFuZCBvZmYgb3VyIGNvYi4KKyAgICAgIC8vIFRPRE8oZHJlaXNzKTogQ2FsbCB0aGUgY29iIGltbWVkaWF0ZWx5PworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIgorICAgICAgICAgIDw8ICI6OnN0ZDo6YmluZChjb2IsIHRydWUpIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9IGVsc2UgeworICAgICAgc3RyaW5nIHJldF9hcmcsIHJldF9wbGFjZWhvbGRlcjsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgcmV0X2FyZyA9ICIsIGNvbnN0ICIgKyB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICImIF9yZXR1cm4iOworICAgICAgICByZXRfcGxhY2Vob2xkZXIgPSAiLCA6OnN0ZDo6cGxhY2Vob2xkZXJzOjpfMSI7CisgICAgICB9CisKKyAgICAgIC8vIFdoZW4gZ2VuX3RlbXBsYXRlc18gaXMgdHJ1ZSwgdGhlIHJldHVybl8gYW5kIHRocm93XyBmdW5jdGlvbnMgYXJlCisgICAgICAvLyBvdmVybG9hZGVkLiAgV2UgaGF2ZSB0byBkZWNsYXJlIHBvaW50ZXJzIHRvIHRoZW0gc28gdGhhdCB0aGUgY29tcGlsZXIKKyAgICAgIC8vIGNhbiByZXNvbHZlIHRoZSBjb3JyZWN0IG92ZXJsb2FkZWQgdmVyc2lvbi4KKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidm9pZCAoIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeAorICAgICAgICAgIDw8ICI6OipyZXR1cm5fZm4pKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiAiCisgICAgICAgICAgPDwgImNvYiwgaW50MzJfdCBzZXFpZCwgIiA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QsIHZvaWQqIGN0eCIgPDwgcmV0X2FyZworICAgICAgICAgIDw8ICIpID0iIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgJiIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXgKKyAgICAgICAgICA8PCAiOjpyZXR1cm5fIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpZiAoIXhjZXB0aW9ucy5lbXB0eSgpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidm9pZCAoIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeAorICAgICAgICAgICAgPDwgIjo6KnRocm93X2ZuKSg6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gIgorICAgICAgICAgICAgPDwgImNvYiwgaW50MzJfdCBzZXFpZCwgIiA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QsIHZvaWQqIGN0eCwgIgorICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpID0iIDw8IGVuZGw7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAmIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeAorICAgICAgICAgICAgPDwgIjo6dGhyb3dfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpiaW5kKHJldHVybl9mbiwgdGhpcywgY29iLCBzZXFpZCwgb3Byb3QsIGN0eCIgPDwgcmV0X3BsYWNlaG9sZGVyCisgICAgICAgICAgPDwgIikiOworICAgICAgaWYgKCF4Y2VwdGlvbnMuZW1wdHkoKSkgeworICAgICAgICBvdXQgPDwgJywnIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpiaW5kKHRocm93X2ZuLCB0aGlzLCBjb2IsIHNlcWlkLCBvcHJvdCwgIgorICAgICAgICAgICAgPDwgImN0eCwgOjpzdGQ6OnBsYWNlaG9sZGVyczo6XzEpIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBYWFggV2hpdGVzcGFjZSBjbGVhbnVwLgorICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBvdXQgPDwgJywnIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIC8vIE5vcm1hbCByZXR1cm4uCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBzdHJpbmcgcmV0X2FyZ19kZWNsLCByZXRfYXJnX25hbWU7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIHJldF9hcmdfZGVjbCA9ICIsIGNvbnN0ICIgKyB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICImIF9yZXR1cm4iOworICAgICAgICByZXRfYXJnX25hbWUgPSAiLCBfcmV0dXJuIjsKKyAgICAgIH0KKyAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOworICAgICAgfQorICAgICAgb3V0IDw8ICJ2b2lkICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXggPDwgIjo6cmV0dXJuXyIKKyAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIig6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiCisgICAgICAgICAgPDwgcHJvdF90eXBlIDw8ICIqIG9wcm90LCB2b2lkKiBjdHgiIDw8IHJldF9hcmdfZGVjbCA8PCAnKScgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICAgIGlmIChnZW5fdGVtcGxhdGVzXyAmJiAhc3BlY2lhbGl6ZWQpIHsKKyAgICAgICAgLy8gSWYgb3Byb3QgaXMgYSBQcm90b2NvbF8gaW5zdGFuY2UsCisgICAgICAgIC8vIHVzZSB0aGUgc3BlY2lhbGl6ZWQgcmV0dXJuIGZ1bmN0aW9uIGluc3RlYWQuCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiUHJvdG9jb2xfKiBfb3Byb3QgPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4ob3Byb3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChfb3Byb3QpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJldHVybl8iCisgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihjb2IsIHNlcWlkLCBfb3Byb3QsIGN0eCIgPDwgcmV0X2FyZ19uYW1lIDw8ICIpOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBvcHJvdCwgX29wcm90KTsiCisgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJfcHJlc3VsdCByZXN1bHQ7IgorICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIC8vIFRoZSBjb25zdF9jYXN0IGhlcmUgaXMgdW5mb3J0dW5hdGUsIGJ1dCBpdCB3b3VsZCBiZSBhIHBhaW4gdG8gYXZvaWQsCisgICAgICAgIC8vIGFuZCB3ZSBvbmx5IGRvIGEgd3JpdGUgd2l0aCB0aGlzIHN0cnVjdCwgd2hpY2ggaXMgY29uc3Qtc2FmZS4KKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXN1bHQuc3VjY2VzcyA9IGNvbnN0X2Nhc3Q8IiA8PCB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKQorICAgICAgICAgICAgPDwgIio+KCZfcmV0dXJuKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5fX2lzc2V0LnN1Y2Nlc3MgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVzdWx0IGludG8gYSBzdHJ1Y3QKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgY3R4ID0gdGhpcy0+ZXZlbnRIYW5kbGVyXy0+Z2V0Q29udGV4dCgiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIE5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JDb250ZXh0RnJlZXIgZnJlZXIoIgorICAgICAgICAgIDw8ICJ0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpLCBjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnByZVdyaXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiCisgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiCisgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgYnl0ZXMgPSBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnBvc3RXcml0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY29iKHRydWUpOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKworICAgIC8vIEV4Y2VwdGlvbiByZXR1cm4uCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF4Y2VwdGlvbnMuZW1wdHkoKSkgeworICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7CisgICAgICB9CisgICAgICBvdXQgPDwgInZvaWQgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeCA8PCAiOjp0aHJvd18iCisgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgorICAgICAgICAgIDw8IHByb3RfdHlwZSA8PCAiKiBvcHJvdCwgdm9pZCogY3R4LCAiCisgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpIiA8PCBlbmRsOworICAgICAgc2NvcGVfdXAob3V0KTsKKworICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfICYmICFzcGVjaWFsaXplZCkgeworICAgICAgICAvLyBJZiBvcHJvdCBpcyBhIFByb3RvY29sXyBpbnN0YW5jZSwKKyAgICAgICAgLy8gdXNlIHRoZSBzcGVjaWFsaXplZCB0aHJvdyBmdW5jdGlvbiBpbnN0ZWFkLgorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlByb3RvY29sXyogX29wcm90ID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KG9wcm90KTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoX29wcm90KSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJvd18iCisgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihjb2IsIHNlcWlkLCBfb3Byb3QsIGN0eCwgX3Rocm93KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJUX0dFTkVSSUNfUFJPVE9DT0wodGhpcywgb3Byb3QsIF9vcHJvdCk7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBHZXQgdGhlIGV2ZW50IGhhbmRsZXIgY29udGV4dAorICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICBjdHggPSB0aGlzLT5ldmVudEhhbmRsZXJfLT5nZXRDb250ZXh0KCIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckNvbnRleHRGcmVlciBmcmVlcigiCisgICAgICAgICAgPDwgInRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCksIGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgLy8gVGhyb3cgdGhlIFREZWxheWVkRXhjZXB0aW9uLCBhbmQgY2F0Y2ggdGhlIHJlc3VsdAorICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIl9yZXN1bHQgcmVzdWx0OyIKKyAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl90aHJvdy0+dGhyb3dfaXQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBjb2IoZmFsc2UpOyIKKyAgICAgICAgICA8PCBlbmRsOyAvLyBJcyB0aGlzIHBvc3NpYmxlPyAgVEJELgorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAnfSc7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBvdXQgPDwgIiAgY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAmIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuX19pc3NldC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiCisgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICB9CisKKyAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhbiB1bmRlY2xhcmVkIGV4Y2VwdGlvbiBpcyB0aHJvd24KKyAgICAgIG91dCA8PCAiIGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZSkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+aGFuZGxlckVycm9yKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4KGUud2hhdCgpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICA8PCAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTiwgc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8CisgICAgICAgICAgLy8gV2UgcGFzcyB0cnVlIHRvIHRoZSBjb2IgaGVyZSwgc2luY2Ugd2UgZGlkIHN1Y2Nlc3NmdWxseSB3cml0ZSBhCisgICAgICAgICAgLy8gcmVzcG9uc2UsIGV2ZW4gdGhvdWdoIGl0IGlzIGFuIGV4Y2VwdGlvbiByZXNwb25zZS4KKyAgICAgICAgICAvLyBJdCBsb29rcyBsaWtlIHRoZSBhcmd1bWVudCBpcyBjdXJyZW50bHkgaWdub3JlZCwgYW55d2F5LgorICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gY29iKHRydWUpOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgICAgLy8gU2VyaWFsaXplIHRoZSByZXN1bHQgaW50byBhIHN0cnVjdAorICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cHJlV3JpdGUoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihcIiIKKyAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCBieXRlcyA9IG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cG9zdFdyaXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBieXRlcyk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBjb2IodHJ1ZSk7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgICAgb3V0IDw8IGVuZGw7CisgICAgfSAvLyBmb3IgZWFjaCBmdW5jdGlvbgorICB9ICAgLy8gY29iIHN0eWxlCit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2tlbGV0b24gZmlsZSBvZiBhIHNlcnZlcgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NrZWxldG9uKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIHN2Y25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKTsKKworICAvLyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGZpbGUgaW5jbHVkZXMKKyAgc3RyaW5nIGZfc2tlbGV0b25fbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzdmNuYW1lICsgIl9zZXJ2ZXIuc2tlbGV0b24uY3BwIjsKKworICBzdHJpbmcgbnMgPSBuYW1lc3BhY2VfcHJlZml4KHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSk7CisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NrZWxldG9uOworICBmX3NrZWxldG9uLm9wZW4oZl9za2VsZXRvbl9uYW1lLmNfc3RyKCkpOworICBmX3NrZWxldG9uIDw8ICIvLyBUaGlzIGF1dG9nZW5lcmF0ZWQgc2tlbGV0b24gZmlsZSBpbGx1c3RyYXRlcyBob3cgdG8gYnVpbGQgYSBzZXJ2ZXIuIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIi8vIFlvdSBzaG91bGQgY29weSBpdCB0byBhbm90aGVyIGZpbGVuYW1lIHRvIGF2b2lkIG92ZXJ3cml0aW5nIGl0LiIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwgIi5oXCIiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyB0aGUgZm9sbG93aW5nIGNvZGUgd291bGQgbm90IGNvbXBpbGU6CisgIC8vIHVzaW5nIG5hbWVzcGFjZSA7CisgIC8vIHVzaW5nIG5hbWVzcGFjZSA6OjsKKyAgaWYgKCghbnMuZW1wdHkoKSkgJiYgKG5zLmNvbXBhcmUoIiA6OiIpICE9IDApKSB7CisgICAgZl9za2VsZXRvbiA8PCAidXNpbmcgbmFtZXNwYWNlICIgPDwgc3RyaW5nKG5zLCAwLCBucy5zaXplKCkgLSAyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZl9za2VsZXRvbiA8PCAiY2xhc3MgIiA8PCBzdmNuYW1lIDw8ICJIYW5kbGVyIDogdmlydHVhbCBwdWJsaWMgIiA8PCBzdmNuYW1lIDw8ICJJZiB7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9za2VsZXRvbiA8PCBpbmRlbnQoKSA8PCBzdmNuYW1lIDw8ICJIYW5kbGVyKCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIgIC8vIFlvdXIgaW5pdGlhbGl6YXRpb24gZ29lcyBoZXJlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9za2VsZXRvbiwgKmZfaXRlcik7CisgICAgZl9za2VsZXRvbiA8PCBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgIiIpIDw8ICIgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIiAgLy8gWW91ciBpbXBsZW1lbnRhdGlvbiBnb2VzIGhlcmUiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcHJpbnRmKFwiIgorICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcXG5cIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3NrZWxldG9uIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfc2tlbGV0b24gPDwgaW5kZW50KCkgPDwgImludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2tlbGV0b24KKyAgICAgIDw8IGluZGVudCgpIDw8ICJpbnQgcG9ydCA9IDkwOTA7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwiIDw8IHN2Y25hbWUKKyAgICAgIDw8ICJIYW5kbGVyPiBoYW5kbGVyKG5ldyAiIDw8IHN2Y25hbWUgPDwgIkhhbmRsZXIoKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKG5ldyAiIDw8IHN2Y25hbWUgPDwgIlByb2Nlc3NvcihoYW5kbGVyKSk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkobmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKSk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOyIKKyAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIlRTaW1wbGVTZXJ2ZXIgc2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInNlcnZlci5zZXJ2ZSgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NrZWxldG9uIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgdGhlIGZpbGVzCisgIGZfc2tlbGV0b24uY2xvc2UoKTsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSArIHN1ZmZpeDsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSwgaXNfcmVmZXJlbmNlKHRmaWVsZCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBpcHJvdC0+IjsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIG91dCA8PCAicmVhZEJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAicmVhZEJvb2woIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgb3V0IDw8ICJyZWFkSTE2KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBvdXQgPDwgInJlYWRJMzIoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCAicmVhZEk2NCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQysrIHJlYWRlciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpICsgbmFtZTsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgc3RyaW5nIHQgPSB0bXAoImVjYXN0Iik7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpbnQzMl90ICIgPDwgdCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSBpcHJvdC0+cmVhZEkzMigiIDw8IHQKKyAgICAgICAgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIiA9ICgiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdCA8PCAiOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgdmFyaWFibGUuIFRoaXMgbWFrZXMgdHdvIGtleSBhc3N1bXB0aW9ucywKKyAqIGZpcnN0IHRoYXQgdGhlcmUgaXMgYSBjb25zdCBjaGFyKiB2YXJpYWJsZSBuYW1lZCBkYXRhIHRoYXQgcG9pbnRzIHRvIHRoZQorICogYnVmZmVyIGZvciBkZXNlcmlhbGl6YXRpb24sIGFuZCB0aGF0IHRoZXJlIGlzIGEgdmFyaWFibGUgcHJvdG9jb2wgd2hpY2gKKyAqIGlzIGEgcmVmZXJlbmNlIHRvIGEgVFByb3RvY29sIHNlcmlhbGl6YXRpb24gb2JqZWN0LgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcikgeworICBpZiAocG9pbnRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoISIgPDwgcHJlZml4IDw8ICIpIHsgIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgcHJlZml4IDw8ICIgPSA6OnN0ZDo6c2hhcmVkX3B0cjwiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiPihuZXcgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gIiA8PCBwcmVmaXggPDwgIi0+cmVhZChpcHJvdCk7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJib29sIHdhc1NldCA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgZm9yIChmX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGZfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICItPl9faXNzZXQuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICIpIHsgd2FzU2V0ID0gdHJ1ZTsgfSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgImlmICghd2FzU2V0KSB7ICIgPDwgcHJlZml4IDw8ICIucmVzZXQoKTsgfSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSAiIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOworICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOworICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOworICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOworCisgIHRfY29udGFpbmVyKiB0Y29udGFpbmVyID0gKHRfY29udGFpbmVyKil0dHlwZTsKKyAgYm9vbCB1c2VfcHVzaCA9IHRjb250YWluZXItPmhhc19jcHBfbmFtZSgpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmNsZWFyKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCAiIDw8IHNpemUgPDwgIjsiIDw8IGVuZGw7CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSAiIDw8IGt0eXBlIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgIiA8PCB2dHlwZSA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAieGZlciArPSBpcHJvdC0+cmVhZE1hcEJlZ2luKCIgPDwga3R5cGUgPDwgIiwgIiA8PCB2dHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlICIgPDwgZXR5cGUgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRTZXRCZWdpbigiIDw8IGV0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlICIgPDwgZXR5cGUgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRMaXN0QmVnaW4oIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOworICAgIGlmICghdXNlX3B1c2gpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnJlc2l6ZSgiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgIiA8PCBpIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJmb3IgKCIgPDwgaSA8PCAiID0gMDsgIiA8PCBpCisgICAgICA8PCAiIDwgIiA8PCBzaXplIDw8ICI7ICsrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgsIHVzZV9wdXNoLCBpKTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBpcHJvdC0+cmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSA8PCAiID0gIiA8PCBwcmVmaXggPDwgIlsiIDw8IGtleQorICAgICAgICAgICAgICA8PCAiXTsiIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmluc2VydCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfcHVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4KSB7CisgIGlmICh1c2VfcHVzaCkgeworICAgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICAgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisgICAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnB1c2hfYmFjaygiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgcHJlZml4ICsgIlsiICsgaW5kZXggKyAiXSIpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgKyBzdWZmaXg7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSwgaXNfcmVmZXJlbmNlKHRmaWVsZCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQysrIHdyaXRlciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpCisgICAgICAgICAgICArIG5hbWU7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAid3JpdGVJMzIoKGludDMyX3QpIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgbmFtZS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIpIHsKKyAgaWYgKHBvaW50ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgeGZlciArPSAiIDw8IHByZWZpeCA8PCAiLT53cml0ZShvcHJvdCk7ICIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiCisgICAgICAgICAgICAgICAgPDwgIm9wcm90LT53cml0ZVN0cnVjdEJlZ2luKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIik7ICIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICBvcHJvdC0+d3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgb3Byb3QtPndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9ICIgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlTWFwQmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInN0YXRpY19jYXN0PHVpbnQzMl90PigiIDw8IHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVTZXRCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInN0YXRpY19jYXN0PHVpbnQzMl90PigiIDw8IHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlTGlzdEJlZ2luKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInN0YXRpY19jYXN0PHVpbnQzMl90PigiIDw8IHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICBvdXQgPDwgaW5kZW50KCkgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCAiOjpjb25zdF9pdGVyYXRvciAiIDw8IGl0ZXIgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJmb3IgKCIgPDwgaXRlciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIi5iZWdpbigpOyAiIDw8IGl0ZXIgPDwgIiAhPSAiIDw8IHByZWZpeAorICAgICAgPDwgIi5lbmQoKTsgKysiIDw8IGl0ZXIgPDwgIikiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgfQorICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIgKyAiLT5maXJzdCIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7CisKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIGl0ZXIgKyAiLT5zZWNvbmQiKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCAiKCoiICsgaXRlciArICIpIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCAiKCoiICsgaXRlciArICIpIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiBNYWtlcyBhIDo6IHByZWZpeCBmb3IgYSBuYW1lc3BhY2UKKyAqCisgKiBAcGFyYW0gbnMgVGhlIG5hbWVzcGFjZSwgdy8gcGVyaW9kcyBpbiBpdAorICogQHJldHVybiBOYW1lc3BhY2VzCisgKi8KK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6Om5hbWVzcGFjZV9wcmVmaXgoc3RyaW5nIG5zKSB7CisgIC8vIEFsd2F5cyBzdGFydCB3aXRoICI6OiIsIHRvIGF2b2lkIHBvc3NpYmxlIG5hbWUgY29sbGlzaW9ucyB3aXRoCisgIC8vIG90aGVyIG5hbWVzIGluIG9uZSBvZiB0aGUgY3VycmVudCBuYW1lc3BhY2VzLgorICAvLworICAvLyBXZSBhbHNvIG5lZWQgYSBsZWFkaW5nIHNwYWNlLCBpbiBjYXNlIHRoZSBuYW1lIGlzIHVzZWQgaW5zaWRlIG9mIGEKKyAgLy8gdGVtcGxhdGUgcGFyYW1ldGVyLiAgIk15VGVtcGxhdGU8Ojpmb286OkJhcj4iIGlzIG5vdCB2YWxpZCBDKyssCisgIC8vIHNpbmNlICI8OiIgaXMgYW4gYWx0ZXJuYXRpdmUgdG9rZW4gZm9yICJbIi4KKyAgc3RyaW5nIHJlc3VsdCA9ICIgOjoiOworCisgIGlmIChucy5zaXplKCkgPT0gMCkgeworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgcmVzdWx0ICs9IG5zLnN1YnN0cigwLCBsb2MpOworICAgIHJlc3VsdCArPSAiOjoiOworICAgIG5zID0gbnMuc3Vic3RyKGxvYyArIDEpOworICB9CisgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgcmVzdWx0ICs9IG5zICsgIjo6IjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIE9wZW5zIG5hbWVzcGFjZS4KKyAqCisgKiBAcGFyYW0gbnMgVGhlIG5hbWVzcGFjZSwgdy8gcGVyaW9kcyBpbiBpdAorICogQHJldHVybiBOYW1lc3BhY2VzCisgKi8KK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6Om5hbWVzcGFjZV9vcGVuKHN0cmluZyBucykgeworICBpZiAobnMuc2l6ZSgpID09IDApIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBzdHJpbmcgc2VwYXJhdG9yID0gIiI7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHJlc3VsdCArPSBzZXBhcmF0b3I7CisgICAgcmVzdWx0ICs9ICJuYW1lc3BhY2UgIjsKKyAgICByZXN1bHQgKz0gbnMuc3Vic3RyKDAsIGxvYyk7CisgICAgcmVzdWx0ICs9ICIgeyI7CisgICAgc2VwYXJhdG9yID0gIiAiOworICAgIG5zID0gbnMuc3Vic3RyKGxvYyArIDEpOworICB9CisgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgcmVzdWx0ICs9IHNlcGFyYXRvciArICJuYW1lc3BhY2UgIiArIG5zICsgIiB7IjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENsb3NlcyBuYW1lc3BhY2UuCisgKgorICogQHBhcmFtIG5zIFRoZSBuYW1lc3BhY2UsIHcvIHBlcmlvZHMgaW4gaXQKKyAqIEByZXR1cm4gTmFtZXNwYWNlcworICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpuYW1lc3BhY2VfY2xvc2Uoc3RyaW5nIG5zKSB7CisgIGlmIChucy5zaXplKCkgPT0gMCkgeworICAgIHJldHVybiAiIjsKKyAgfQorICBzdHJpbmcgcmVzdWx0ID0gIn0iOworICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisgIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICByZXN1bHQgKz0gIn0iOworICAgIG5zID0gbnMuc3Vic3RyKGxvYyArIDEpOworICB9CisgIHJlc3VsdCArPSAiIC8vIG5hbWVzcGFjZSI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmV0dXJucyBhIEMrKyB0eXBlIG5hbWUKKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqIEByZXR1cm4gU3RyaW5nIG9mIHRoZSB0eXBlIG5hbWUsIGkuZS4gc3RkOjpzZXQ8dHlwZT4KKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZiwgYm9vbCBhcmcpIHsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyBibmFtZSA9IGJhc2VfdHlwZV9uYW1lKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSk7CisgICAgc3RkOjptYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IHR0eXBlLT5hbm5vdGF0aW9uc18uZmluZCgiY3BwLnR5cGUiKTsKKyAgICBpZiAoaXQgIT0gdHR5cGUtPmFubm90YXRpb25zXy5lbmQoKSkgeworICAgICAgYm5hbWUgPSBpdC0+c2Vjb25kOworICAgIH0KKworICAgIGlmICghYXJnKSB7CisgICAgICByZXR1cm4gYm5hbWU7CisgICAgfQorCisgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKKyAgICAgIHJldHVybiAiY29uc3QgIiArIGJuYW1lICsgIiYiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gImNvbnN0ICIgKyBibmFtZTsKKyAgICB9CisgIH0KKworICAvLyBDaGVjayBmb3IgYSBjdXN0b20gb3ZlcmxvYWRlZCBDKysgbmFtZQorICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgc3RyaW5nIGNuYW1lOworCisgICAgdF9jb250YWluZXIqIHRjb250YWluZXIgPSAodF9jb250YWluZXIqKXR0eXBlOworICAgIGlmICh0Y29udGFpbmVyLT5oYXNfY3BwX25hbWUoKSkgeworICAgICAgY25hbWUgPSB0Y29udGFpbmVyLT5nZXRfY3BwX25hbWUoKTsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgICAgY25hbWUgPSAic3RkOjptYXA8IiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaW5fdHlwZWRlZikgKyAiLCAiCisgICAgICAgICAgICAgICsgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCBpbl90eXBlZGVmKSArICI+ICI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICAgIGNuYW1lID0gInN0ZDo6c2V0PCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpbl90eXBlZGVmKSArICI+ICI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7CisgICAgICBjbmFtZSA9ICJzdGQ6OnZlY3RvcjwiICsgdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGluX3R5cGVkZWYpICsgIj4gIjsKKyAgICB9CisKKyAgICBpZiAoYXJnKSB7CisgICAgICByZXR1cm4gImNvbnN0ICIgKyBjbmFtZSArICImIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGNuYW1lOworICAgIH0KKyAgfQorCisgIHN0cmluZyBjbGFzc19wcmVmaXg7CisgIGlmIChpbl90eXBlZGVmICYmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpKSB7CisgICAgY2xhc3NfcHJlZml4ID0gImNsYXNzICI7CisgIH0KKworICAvLyBDaGVjayBpZiBpdCBuZWVkcyB0byBiZSBuYW1lc3BhY2VkCisgIHN0cmluZyBwbmFtZTsKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHBuYW1lID0gY2xhc3NfcHJlZml4ICsgbmFtZXNwYWNlX3ByZWZpeChwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSkgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICBwbmFtZSA9IGNsYXNzX3ByZWZpeCArIHR0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19lbnVtKCkgJiYgIWdlbl9wdXJlX2VudW1zXykgeworICAgIHBuYW1lICs9ICI6OnR5cGUiOworICB9CisKKyAgaWYgKGFyZykgeworICAgIGlmIChpc19jb21wbGV4X3R5cGUodHR5cGUpKSB7CisgICAgICByZXR1cm4gImNvbnN0ICIgKyBwbmFtZSArICImIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJjb25zdCAiICsgcG5hbWU7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiBwbmFtZTsKKyAgfQorfQorCisvKioKKyAqIFJldHVybnMgdGhlIEMrKyB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgorICoKKyAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCisgKiBAcmV0dXJuIEV4cGxpY2l0IEMrKyB0eXBlLCBpLmUuICJpbnQzMl90IgorICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlKSB7CisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAidm9pZCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIHJldHVybiAic3RkOjpzdHJpbmciOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuICJib29sIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICByZXR1cm4gImludDhfdCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIHJldHVybiAiaW50MTZfdCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIHJldHVybiAiaW50MzJfdCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAiaW50NjRfdCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiZG91YmxlIjsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyBiYXNlIHR5cGUgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICB9Cit9CisKKy8qKgorICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICogQHJldHVybiBGaWVsZCBkZWNsYXJhdGlvbiwgaS5lLiBpbnQgeCA9IDA7CisgKi8KK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb25zdGFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWZlcmVuY2UpIHsKKyAgLy8gVE9ETyhtY3NsZWUpOiBkbyB3ZSBldmVyIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQ/CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgaWYgKGNvbnN0YW50KSB7CisgICAgcmVzdWx0ICs9ICJjb25zdCAiOworICB9CisgIHJlc3VsdCArPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgaWYgKGlzX3JlZmVyZW5jZSh0ZmllbGQpKSB7CisgICAgcmVzdWx0ID0gIjo6c3RkOjpzaGFyZWRfcHRyPCIgKyByZXN1bHQgKyAiPiI7CisgIH0KKyAgaWYgKHBvaW50ZXIpIHsKKyAgICByZXN1bHQgKz0gIioiOworICB9CisgIGlmIChyZWZlcmVuY2UpIHsKKyAgICByZXN1bHQgKz0gIiYiOworICB9CisgIHJlc3VsdCArPSAiICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyBpbml0aWFsaXplciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9ICgiICsgdHlwZV9uYW1lKHR5cGUpICsgIikwIjsKKyAgICB9CisgIH0KKyAgaWYgKCFyZWZlcmVuY2UpIHsKKyAgICByZXN1bHQgKz0gIjsiOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmFtZV9wYXJhbXMpIHsKKyAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGJvb2wgaGFzX3hjZXB0aW9ucyA9ICF0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpOworCisgIGlmIChzdHlsZSA9PSAiIikgeworICAgIGlmIChpc19jb21wbGV4X3R5cGUodHR5cGUpKSB7CisgICAgICByZXR1cm4gInZvaWQgIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIHR5cGVfbmFtZSh0dHlwZSkKKyAgICAgICAgICAgICArIChuYW1lX3BhcmFtcyA/ICImIF9yZXR1cm4iIDogIiYgLyogX3JldHVybiAqLyIpCisgICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QsIG5hbWVfcGFyYW1zLCB0cnVlKSArICIpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIKKyAgICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCwgbmFtZV9wYXJhbXMpICsgIikiOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHlsZS5zdWJzdHIoMCwgMykgPT0gIkNvYiIpIHsKKyAgICBzdHJpbmcgY29iX3R5cGU7CisgICAgc3RyaW5nIGV4bl9jb2I7CisgICAgaWYgKHN0eWxlID09ICJDb2JDbCIpIHsKKyAgICAgIGNvYl90eXBlID0gIigiICsgc2VydmljZV9uYW1lXyArICJDb2JDbGllbnQiOworICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICAgIGNvYl90eXBlICs9ICJUPFByb3RvY29sXz4iOworICAgICAgfQorICAgICAgY29iX3R5cGUgKz0gIiogY2xpZW50KSI7CisgICAgfSBlbHNlIGlmIChzdHlsZSA9PSAiQ29iU3YiKSB7CisgICAgICBjb2JfdHlwZSA9ICh0dHlwZS0+aXNfdm9pZCgpID8gIigpIiA6ICgiKCIgKyB0eXBlX25hbWUodHR5cGUpICsgIiBjb25zdCYgX3JldHVybikiKSk7CisgICAgICBpZiAoaGFzX3hjZXB0aW9ucykgeworICAgICAgICBleG5fY29iCisgICAgICAgICAgICA9ICIsIDo6c3RkOjpmdW5jdGlvbjx2b2lkKDo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpPiAvKiBleG5fY29iICovIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgIlVOS05PV04gU1RZTEUiOworICAgIH0KKworICAgIHJldHVybiAidm9pZCAiICsgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIig6OnN0ZDo6ZnVuY3Rpb248dm9pZCIgKyBjb2JfdHlwZSArICI+IGNvYiIKKyAgICAgICAgICAgKyBleG5fY29iICsgYXJndW1lbnRfbGlzdChhcmdsaXN0LCBuYW1lX3BhcmFtcywgdHJ1ZSkgKyAiKSI7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIlVOS05PV04gU1RZTEUiOworICB9Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEByZXR1cm4gQ29tbWEgc2VwZWFyYXRlZCBsaXN0IG9mIGFsbCBmaWVsZCBuYW1lcyBpbiB0aGF0IHN0cnVjdAorICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIG5hbWVfcGFyYW1zLCBib29sIHN0YXJ0X2NvbW1hKSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSAhc3RhcnRfY29tbWE7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCB0cnVlKSArICIgIgorICAgICAgICAgICAgICArIChuYW1lX3BhcmFtcyA/ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA6ICIvKiAiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiAqLyIpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgorICoKKyAqIEBwYXJhbSB0eXBlIFRocmlmdCBUeXBlCisgKiBAcmV0dXJuIFN0cmluZyBvZiBDKysgY29kZSB0byBkZWZpbml0aW9uIG9mIHRoYXQgdHlwZSBjb25zdGFudAorICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0k2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0RPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmdldF9pbmNsdWRlX3ByZWZpeChjb25zdCB0X3Byb2dyYW0mIHByb2dyYW0pIGNvbnN0IHsKKyAgc3RyaW5nIGluY2x1ZGVfcHJlZml4ID0gcHJvZ3JhbS5nZXRfaW5jbHVkZV9wcmVmaXgoKTsKKyAgaWYgKCF1c2VfaW5jbHVkZV9wcmVmaXhfIHx8IChpbmNsdWRlX3ByZWZpeC5zaXplKCkgPiAwICYmIGluY2x1ZGVfcHJlZml4WzBdID09ICcvJykpIHsKKyAgICAvLyBpZiBmbGFnIGlzIHR1cm5lZCBvZmYgb3IgdGhpcyBpcyBhYnNvbHV0ZSBwYXRoLCByZXR1cm4gZW1wdHkgcHJlZml4CisgICAgcmV0dXJuICIiOworICB9CisKKyAgc3RyaW5nOjpzaXplX3R5cGUgbGFzdF9zbGFzaCA9IHN0cmluZzo6bnBvczsKKyAgaWYgKChsYXN0X3NsYXNoID0gaW5jbHVkZV9wcmVmaXgucmZpbmQoIi8iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgcmV0dXJuIGluY2x1ZGVfcHJlZml4LnN1YnN0cigwLCBsYXN0X3NsYXNoKQorICAgICAgICAgICArIChnZXRfcHJvZ3JhbSgpLT5pc19vdXRfcGF0aF9hYnNvbHV0ZSgpID8gIi8iIDogIi8iICsgb3V0X2Rpcl9iYXNlXyArICIvIik7CisgIH0KKworICByZXR1cm4gIiI7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgY3BwLAorICAgICJDKysiLAorICAgICIgICAgY29iX3N0eWxlOiAgICAgICBHZW5lcmF0ZSBcIkNvbnRpbnVhdGlvbiBPQmplY3RcIi1zdHlsZSBjbGFzc2VzLlxuIgorICAgICIgICAgbm9fY2xpZW50X2NvbXBsZXRpb246XG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIE9taXQgY2FsbHMgdG8gY29tcGxldGlvbl9fKCkgaW4gQ29iQ2xpZW50IGNsYXNzLlxuIgorICAgICIgICAgbm9fZGVmYXVsdF9vcGVyYXRvcnM6XG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIE9taXRzIGdlbmVyYXRpb24gb2YgZGVmYXVsdCBvcGVyYXRvcnMgPT0sICE9IGFuZCA8XG4iCisgICAgIiAgICB0ZW1wbGF0ZXM6ICAgICAgIEdlbmVyYXRlIHRlbXBsYXRpemVkIHJlYWRlci93cml0ZXIgbWV0aG9kcy5cbiIKKyAgICAiICAgIHB1cmVfZW51bXM6ICAgICAgR2VuZXJhdGUgcHVyZSBlbnVtcyBpbnN0ZWFkIG9mIHdyYXBwZXIgY2xhc3Nlcy5cbiIKKyAgICAiICAgIGluY2x1ZGVfcHJlZml4OiAgVXNlIGZ1bGwgaW5jbHVkZSBwYXRocyBpbiBnZW5lcmF0ZWQgZmlsZXMuXG4iCisgICAgIiAgICBtb3ZlYWJsZV90eXBlczogIEdlbmVyYXRlIG1vdmUgY29uc3RydWN0b3JzIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9ycy5cbiIKKyAgICAiICAgIG5vX29zdHJlYW1fb3BlcmF0b3JzOlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBPbWl0IGdlbmVyYXRpb24gb2Ygb3N0cmVhbSBkZWZpbml0aW9ucy5cbiIKKyAgICAiICAgIG5vX3NrZWxldG9uOiAgICAgT21pdHMgZ2VuZXJhdGlvbiBvZiBza2VsZXRvbi5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NzaGFycF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NzaGFycF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQxZTI5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDMyNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworc3RydWN0IG1lbWJlcl9tYXBwaW5nX3Njb3BlIHsKKyAgdm9pZCogc2NvcGVfbWVtYmVyOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG1hcHBpbmdfdGFibGU7Cit9OworCitjbGFzcyB0X2NzaGFycF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9jc2hhcnBfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgYXN5bmNfID0gZmFsc2U7CisgICAgbnVsbGFibGVfID0gZmFsc2U7CisgICAgaGFzaGNvZGVfID0gZmFsc2U7CisgICAgdW5pb25fID0gZmFsc2U7CisgICAgc2VyaWFsaXplXyA9IGZhbHNlOworICAgIHdjZl8gPSBmYWxzZTsKKyAgICB3Y2ZfbmFtZXNwYWNlXy5jbGVhcigpOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImFzeW5jIikgPT0gMCkgeworICAgICAgICBhc3luY18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJudWxsYWJsZSIpID09IDApIHsKKyAgICAgICAgbnVsbGFibGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiaGFzaGNvZGUiKSA9PSAwKSB7CisgICAgICAgIGhhc2hjb2RlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInVuaW9uIikgPT0gMCkgeworICAgICAgICB1bmlvbl8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJzZXJpYWwiKSA9PSAwKSB7CisgICAgICAgIHNlcmlhbGl6ZV8gPSB0cnVlOworICAgICAgICB3Y2ZfbmFtZXNwYWNlXyA9IGl0ZXItPnNlY29uZDsgLy8gc2luY2UgdGhlcmUgY2FuIGJlIG9ubHkgb25lIG5hbWVzcGFjZQorICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ3Y2YiKSA9PSAwKSB7CisgICAgICAgIHdjZl8gPSB0cnVlOworICAgICAgICB3Y2ZfbmFtZXNwYWNlXyA9IGl0ZXItPnNlY29uZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBjc2hhcnA6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWNzaGFycCI7CisgIH0KKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbik7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgYm9vbCBnZW5lcmF0ZUlzc2V0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfcHJvcGVydHkob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQdWJsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZUlzc2V0ID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXggPSAiIik7CisgIGJvb2wgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWR0eXBlID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICB2b2lkIHByaW50X2NvbnN0X2NvbnN0cnVjdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKyAgdm9pZCBwcmludF9jb25zdF9kZWZfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF91bmlvbih0X3N0cnVjdCogdHVuaW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24pOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF91bmlvbl9jbGFzcyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbiwgdF9maWVsZCogdGZpZWxkKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfd2NmZmF1bHQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZXF1YWxzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9oYXNoY29kZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF91bmlvbl9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24pOworCisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcGFyYXRlX3NlcnZpY2VfaW50ZXJmYWNlcyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zeW5jX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX2FzeW5jX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX2NvbWJpbmVkX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NpbHZlcmxpZ2h0X2FzeW5jX21ldGhvZHModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyX3N5bmModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXJfYXN5bmModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiBmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbl9hc3luYyh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiBmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcm9wZXJ0eWxlc3MgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiBsaXN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2VsZW1lbnQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcm9wZXJ0eWxlc3MgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX2RvY3N0cmluZ19jb21tZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpOworCisgIHZvaWQgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShzdGQ6Om9zdHJlYW0mIG91dCk7CisgIHZvaWQgZW5kX2NzaGFycF9uYW1lc3BhY2Uoc3RkOjpvc3RyZWFtJiBvdXQpOworCisgIHN0ZDo6c3RyaW5nIGNzaGFycF90eXBlX3VzaW5ncygpOworICBzdGQ6OnN0cmluZyBjc2hhcnBfdGhyaWZ0X3VzaW5ncygpOworCisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb3VudGFpbmVyID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2luaXQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fcGFyYW0gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9wYXJhbSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2JlZ2luKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfZW5kKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmModF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgcHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBzdXBwcmVzc19tYXBwaW5nID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSk7CisKKyAgYm9vbCBmaWVsZF9oYXNfZGVmYXVsdCh0X2ZpZWxkKiB0ZmllbGQpIHsgcmV0dXJuIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTDsgfQorCisgIGJvb2wgZmllbGRfaXNfcmVxdWlyZWQodF9maWVsZCogdGZpZWxkKSB7IHJldHVybiB0ZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEOyB9CisKKyAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKKyAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpCisgICAgICAgICAgIHx8IHR0eXBlLT5pc19zdHJpbmcoKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfbmFtZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKyAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX2Rpcl87CisgIGJvb2wgYXN5bmNfOworICBib29sIG51bGxhYmxlXzsKKyAgYm9vbCB1bmlvbl87CisgIGJvb2wgaGFzaGNvZGVfOworICBib29sIHNlcmlhbGl6ZV87CisgIGJvb2wgd2NmXzsKKyAgc3RkOjpzdHJpbmcgd2NmX25hbWVzcGFjZV87CisKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gY3NoYXJwX2tleXdvcmRzOworICBzdGQ6OnZlY3RvcjxtZW1iZXJfbWFwcGluZ19zY29wZT4gIG1lbWJlcl9tYXBwaW5nX3Njb3BlczsKKworICB2b2lkIGluaXRfa2V5d29yZHMoKTsKKyAgc3RkOjpzdHJpbmcgbm9ybWFsaXplX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIG1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIoc3RkOjpzdHJpbmcgY29uc3QmIGZyb21OYW1lKTsKKyAgdm9pZCBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh2b2lkKiBzY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RuYW1lKTsKKyAgdm9pZCBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUpOworICBzdHJpbmcgZ2V0X21hcHBlZF9tZW1iZXJfbmFtZShzdHJpbmcgb2xkbmFtZSk7Cit9OworCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisgIG5hbWVzcGFjZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjc2hhcnAiKTsKKworICBzdHJpbmcgZGlyID0gbmFtZXNwYWNlX25hbWVfOworICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKS5jX3N0cigpOworICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisKKyAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgIGRpciA9IGRpci5zdWJzdHIobG9jICsgMSk7CisgIH0KKyAgaWYgKGRpci5zaXplKCkgPiAwKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgfQorCisgIG5hbWVzcGFjZV9kaXJfID0gc3ViZGlyOworICBpbml0X2tleXdvcmRzKCk7CisKKyAgd2hpbGUoICEgbWVtYmVyX21hcHBpbmdfc2NvcGVzLmVtcHR5KCkpIHsKKyAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoIG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5iYWNrKCkuc2NvcGVfbWVtYmVyKTsKKyAgfQorCisgIHB2ZXJib3NlKCJDIyBvcHRpb25zOlxuIik7CisgIHB2ZXJib3NlKCItIGFzeW5jIC4uLi4uLiAlc1xuIiwgKGFzeW5jXyA/ICJPTiIgOiAib2ZmIikpOworICBwdmVyYm9zZSgiLSBudWxsYWJsZSAuLi4gJXNcbiIsIChudWxsYWJsZV8gPyAiT04iIDogIm9mZiIpKTsKKyAgcHZlcmJvc2UoIi0gdW5pb24gLi4uLi4uICVzXG4iLCAodW5pb25fID8gIk9OIiA6ICJvZmYiKSk7CisgIHB2ZXJib3NlKCItIGhhc2hjb2RlIC4uLiAlc1xuIiwgKGhhc2hjb2RlXyA/ICJPTiIgOiAib2ZmIikpOworICBwdmVyYm9zZSgiLSBzZXJpYWxpemUgLi4gJXNcbiIsIChzZXJpYWxpemVfID8gIk9OIiA6ICJvZmYiKSk7CisgIHB2ZXJib3NlKCItIHdjZiAuLi4uLi4uLiAlc1xuIiwgKHdjZl8gPyAiT04iIDogIm9mZiIpKTsKK30KKworc3RkOjpzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpub3JtYWxpemVfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIHN0cmluZyB0bXAobmFtZSk7CisgIHN0ZDo6dHJhbnNmb3JtKHRtcC5iZWdpbigpLCB0bXAuZW5kKCksIHRtcC5iZWdpbigpLCBzdGF0aWNfY2FzdDxpbnQgKCopKGludCk+KHN0ZDo6dG9sb3dlcikpOworCisgIC8vIHVuLWNvbmZsaWN0IGtleXdvcmRzIGJ5IHByZWZpeGluZyB3aXRoICJAIgorICBpZiAoY3NoYXJwX2tleXdvcmRzLmZpbmQodG1wKSAhPSBjc2hhcnBfa2V5d29yZHMuZW5kKCkpIHsKKyAgICByZXR1cm4gIkAiICsgbmFtZTsKKyAgfQorCisgIC8vIG5vIGNoYW5nZXMgbmVjZXNzYXJ5CisgIHJldHVybiBuYW1lOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6aW5pdF9rZXl3b3JkcygpIHsKKyAgY3NoYXJwX2tleXdvcmRzLmNsZWFyKCk7CisKKyAgLy8gQyMga2V5d29yZHMKKyAgY3NoYXJwX2tleXdvcmRzWyJhYnN0cmFjdCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJhcyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJiYXNlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImJvb2wiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siYnJlYWsiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siYnl0ZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJjYXNlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImNhdGNoIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImNoYXIiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siY2hlY2tlZCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJjbGFzcyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJjb25zdCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJjb250aW51ZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJkZWNpbWFsIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImRlZmF1bHQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZGVsZWdhdGUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZG8iXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZG91YmxlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImVsc2UiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZW51bSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJldmVudCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJleHBsaWNpdCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJleHRlcm4iXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZmFsc2UiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZmluYWxseSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJmaXhlZCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJmbG9hdCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJmb3IiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZm9yZWFjaCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJnb3RvIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImlmIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImltcGxpY2l0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImluIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImludCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJpbnRlcmZhY2UiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siaW50ZXJuYWwiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siaXMiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sibG9jayJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJsb25nIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbIm5hbWVzcGFjZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJuZXciXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sibnVsbCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJvYmplY3QiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sib3BlcmF0b3IiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sib3V0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbIm92ZXJyaWRlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInBhcmFtcyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJwcml2YXRlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInByb3RlY3RlZCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJwdWJsaWMiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sicmVhZG9ubHkiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sicmVmIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInJldHVybiJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzYnl0ZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzZWFsZWQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic2hvcnQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic2l6ZW9mIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInN0YWNrYWxsb2MiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic3RhdGljIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInN0cmluZyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzdHJ1Y3QiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic3dpdGNoIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInRoaXMiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidGhyb3ciXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidHJ1ZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ0cnkiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidHlwZW9mIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInVpbnQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidWxvbmciXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidW5jaGVja2VkIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInVuc2FmZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ1c2hvcnQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidXNpbmciXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidmlydHVhbCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ2b2lkIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInZvbGF0aWxlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbIndoaWxlIl0gPSAxOworCisgIC8vIEMjIGNvbnRleHR1YWwga2V5d29yZHMKKyAgY3NoYXJwX2tleXdvcmRzWyJhZGQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siYWxpYXMiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siYXNjZW5kaW5nIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImFzeW5jIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImF3YWl0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImRlc2NlbmRpbmciXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZHluYW1pYyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJmcm9tIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImdldCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJnbG9iYWwiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZ3JvdXAiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siaW50byJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJqb2luIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImxldCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJvcmRlcmJ5Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInBhcnRpYWwiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sicmVtb3ZlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInNlbGVjdCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzZXQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidmFsdWUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidmFyIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbIndoZXJlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInlpZWxkIl0gPSAxOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6c3RhcnRfY3NoYXJwX25hbWVzcGFjZShvc3RyZWFtJiBvdXQpIHsKKyAgaWYgKCFuYW1lc3BhY2VfbmFtZV8uZW1wdHkoKSkgeworICAgIG91dCA8PCAibmFtZXNwYWNlICIgPDwgbmFtZXNwYWNlX25hbWVfIDw8ICJcbiI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZW5kX2NzaGFycF9uYW1lc3BhY2Uob3N0cmVhbSYgb3V0KSB7CisgIGlmICghbmFtZXNwYWNlX25hbWVfLmVtcHR5KCkpIHsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6Y3NoYXJwX3R5cGVfdXNpbmdzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAidXNpbmcgU3lzdGVtO1xuIiArICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7XG4iCisgICAgICAgICArICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYztcbiIgKyAidXNpbmcgU3lzdGVtLlRleHQ7XG4iICsgInVzaW5nIFN5c3RlbS5JTztcbiIKKyAgICAgICAgICsgKChhc3luY18pID8gInVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7XG4iIDogIiIpICsgInVzaW5nIFRocmlmdDtcbiIKKyAgICAgICAgICsgInVzaW5nIFRocmlmdC5Db2xsZWN0aW9ucztcbiIgKyAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgPyAiI2lmICFTSUxWRVJMSUdIVFxuIiA6ICIiKQorICAgICAgICAgKyAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgPyAidXNpbmcgU3lzdGVtLlhtbC5TZXJpYWxpemF0aW9uO1xuIiA6ICIiKQorICAgICAgICAgKyAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgPyAiI2VuZGlmXG4iIDogIiIpCisgICAgICAgICArICJ1c2luZyBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uO1xuIjsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6Y3NoYXJwX3RocmlmdF91c2luZ3MoKSB7CisgIHJldHVybiBzdHJpbmcoKSArICJ1c2luZyBUaHJpZnQuUHJvdG9jb2w7XG4iICsgInVzaW5nIFRocmlmdC5UcmFuc3BvcnQ7XG4iOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworfQordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBzdHJpbmcgZl9lbnVtX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArICh0ZW51bS0+Z2V0X25hbWUoKSkgKyAiLmNzIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2VudW07CisgIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lLmNfc3RyKCkpOworCisgIGZfZW51bSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworCisgIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2UoZl9lbnVtKTsKKworICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfZW51bSwgdGVudW0pOworCisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgZW51bSAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJcbiI7CisgIHNjb3BlX3VwKGZfZW51bSk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9lbnVtLCAqY19pdGVyKTsKKworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KGZfZW51bSkgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlIDw8ICIsIiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihmX2VudW0pOworCisgIGVuZF9jc2hhcnBfbmFtZXNwYWNlKGZfZW51bSk7CisKKyAgZl9lbnVtLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICcvJyArIHByb2dyYW1fbmFtZV8gKyAiLkNvbnN0YW50cy5jcyI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHM7CisgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICBmX2NvbnN0cyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBjc2hhcnBfdHlwZV91c2luZ3MoKSA8PCBlbmRsOworCisgIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2UoZl9jb25zdHMpOworCisgIGluZGVudChmX2NvbnN0cykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgIiA8PCBtYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHByb2dyYW1fbmFtZV8pCisgICAgICAgICAgICAgICAgICAgPDwgIkNvbnN0YW50cyIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9jb25zdHMpOworCisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgYm9vbCBuZWVkX3N0YXRpY19jb25zdHJ1Y3RvciA9IGZhbHNlOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9jb25zdHMsICgqY19pdGVyKSk7CisgICAgaWYgKHByaW50X2NvbnN0X3ZhbHVlKGZfY29uc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSB7CisgICAgICBuZWVkX3N0YXRpY19jb25zdHJ1Y3RvciA9IHRydWU7CisgICAgfQorICB9CisKKyAgaWYgKG5lZWRfc3RhdGljX2NvbnN0cnVjdG9yKSB7CisgICAgcHJpbnRfY29uc3RfY29uc3RydWN0b3IoZl9jb25zdHMsIGNvbnN0cyk7CisgIH0KKworICBzY29wZV9kb3duKGZfY29uc3RzKTsKKyAgZW5kX2NzaGFycF9uYW1lc3BhY2UoZl9jb25zdHMpOworICBmX2NvbnN0cy5jbG9zZSgpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfZGVmX3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZygodF9zdHJ1Y3QqKXR5cGUpOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBmaWVsZCA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkID0gKCpmX2l0ZXIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGQgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiIgPDwgcHJvcF9uYW1lKGZpZWxkKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZygodF9zdHJ1Y3QqKXR5cGUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIlsiIDw8IGtleSA8PCAiXSIKKyAgICAgICAgICAgICAgICAgIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorCisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLkFkZCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpwcmludF9jb25zdF9jb25zdHJ1Y3RvcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBpbmRlbnQob3V0KSA8PCAic3RhdGljICIgPDwgbWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihwcm9ncmFtX25hbWVfKS5jX3N0cigpIDw8ICJDb25zdGFudHMoKSIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisKKyAgICBwcmludF9jb25zdF9kZWZfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgIH0KKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvLyBpdCBzZWVtcyBsaWtlIGFsbCB0aGF0IG1ldGhvZHMgdGhhdCBjYWxsIHRoaXMgYXJlIHVzaW5nIGluX3N0YXRpYyB0byBiZSB0aGUgb3Bwb3NpdGUgb2Ygd2hhdCBpdAorLy8gd291bGQgaW1wbHkKK2Jvb2wgdF9jc2hhcnBfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkdHlwZSkgeworICBpbmRlbnQob3V0KTsKKyAgYm9vbCBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb24gPSAhaW5fc3RhdGljOworICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICghZGVmdmFsIHx8IG5lZWR0eXBlKSB7CisgICAgb3V0IDw8IChpbl9zdGF0aWMgPyAiIiA6IHR5cGUtPmlzX2Jhc2VfdHlwZSgpID8gInB1YmxpYyBjb25zdCAiIDogInB1YmxpYyBzdGF0aWMgIikKKyAgICAgICAgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgfQorICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGw7CisgICAgbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uID0gZmFsc2U7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiLiIgPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKQorICAgICAgICA8PCAiOyIgPDwgZW5kbDsKKyAgICBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb24gPSBmYWxzZTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChkZWZ2YWwgJiYgIXR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBwcmludF9jb25zdF9kZWZfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgIH0KKworICByZXR1cm4gbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uOworfQorCitzdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICh2b2lkKW5hbWU7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmVuZGVyIDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOworICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUsIHRydWUsIHRydWUpOworICAgIHJlbmRlciA8PCB0OworICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBpZiAodW5pb25fICYmIHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfdW5pb24odHN0cnVjdCk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArICh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuY3MiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc3RydWN0OworCisgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKworICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBjc2hhcnBfdHlwZV91c2luZ3MoKSA8PCBjc2hhcnBfdGhyaWZ0X3VzaW5ncygpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworCisgIGZfc3RydWN0LmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisKKyAgaWYgKCFpbl9jbGFzcykgeworICAgIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2Uob3V0KTsKKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2NzaGFycF9kb2Mob3V0LCB0c3RydWN0KTsKKyAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRzdHJ1Y3QpOworCisgIGluZGVudChvdXQpIDw8ICIjaWYgIVNJTFZFUkxJR0hUIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiW1NlcmlhbGl6YWJsZV0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIjZW5kaWYiIDw8IGVuZGw7CisgIGlmICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSAmJiAhaXNfZXhjZXB0aW9uKSB7CisgICAgaW5kZW50KG91dCkgPDwgIltEYXRhQ29udHJhY3QoTmFtZXNwYWNlPVwiIiA8PCB3Y2ZfbmFtZXNwYWNlXyA8PCAiXCIpXSIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOyAvLyBkbyBub3QgbWFrZSBleGNlcHRpb24gY2xhc3NlcyBkaXJlY3RseSBXQ0Ygc2VyaWFsaXphYmxlLCB3ZSBwcm92aWRlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXBhcmF0ZSAiZmF1bHQiIGZvciB0aGF0CisgIH0KKyAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAic2VhbGVkICIgOiAiIikgPDwgInBhcnRpYWwgY2xhc3MgIgorICAgICAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKSA8PCAiIDogIjsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8ICJURXhjZXB0aW9uLCAiOworICB9CisgIG91dCA8PCAiVEJhc2UiOworCisgIG91dCA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICAvLyBtYWtlIHByaXZhdGUgbWVtYmVycyB3aXRoIHB1YmxpYyBQcm9wZXJ0aWVzCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAvLyBpZiB0aGUgZmllbGQgaXMgcmVxdWllZCwgdGhlbiB3ZSB1c2UgYXV0by1wcm9wZXJ0aWVzCisgICAgaWYgKCFmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpICYmICghbnVsbGFibGVfIHx8IGZpZWxkX2hhc19kZWZhdWx0KCgqbV9pdGVyKSkpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSAiIDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsICJfIikgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgYm9vbCBoYXNfbm9uX3JlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICBib29sIGhhc19ub25fcmVxdWlyZWRfZGVmYXVsdF92YWx1ZV9maWVsZHMgPSBmYWxzZTsKKyAgYm9vbCBoYXNfcmVxdWlyZWRfZmllbGRzID0gZmFsc2U7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKG91dCwgKm1faXRlcik7CisgICAgZ2VuZXJhdGVfcHJvcGVydHkob3V0LCAqbV9pdGVyLCB0cnVlLCB0cnVlKTsKKyAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKTsKKyAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKCptX2l0ZXIpKTsKKyAgICBpZiAoaXNfcmVxdWlyZWQpIHsKKyAgICAgIGhhc19yZXF1aXJlZF9maWVsZHMgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoaGFzX2RlZmF1bHQpIHsKKyAgICAgICAgaGFzX25vbl9yZXF1aXJlZF9kZWZhdWx0X3ZhbHVlX2ZpZWxkcyA9IHRydWU7CisgICAgICB9CisgICAgICBoYXNfbm9uX3JlcXVpcmVkX2ZpZWxkcyA9IHRydWU7CisgICAgfQorICB9CisKKyAgYm9vbCBnZW5lcmF0ZV9pc3NldCA9IChudWxsYWJsZV8gJiYgaGFzX25vbl9yZXF1aXJlZF9kZWZhdWx0X3ZhbHVlX2ZpZWxkcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICghbnVsbGFibGVfICYmIGhhc19ub25fcmVxdWlyZWRfZmllbGRzKTsKKyAgaWYgKGdlbmVyYXRlX2lzc2V0KSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaWYgKHNlcmlhbGl6ZV8gfHwgd2NmXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbWG1sSWdub3JlXSAvLyBYbWxTZXJpYWxpemVyIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIltEYXRhTWVtYmVyKE9yZGVyID0gMSldICAvLyBYbWxPYmplY3RTZXJpYWxpemVyLCBEYXRhQ29udHJhY3RKc29uU2VyaWFsaXplciwgZXRjLiIKKyAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBJc3NldCBfX2lzc2V0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiI2lmICFTSUxWRVJMSUdIVCIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiW1NlcmlhbGl6YWJsZV0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiNlbmRpZiIgPDwgZW5kbDsKKyAgICBpZiAoc2VyaWFsaXplXyB8fCB3Y2ZfKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiW0RhdGFDb250cmFjdF0iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RydWN0IElzc2V0IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSk7CisgICAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKCptX2l0ZXIpKTsKKyAgICAgIC8vIGlmIGl0IGlzIHJlcXVpcmVkLCBkb24ndCBuZWVkIElzc2V0IGZvciB0aGF0IHZhcmlhYmxlCisgICAgICAvLyBpZiBpdCBpcyBub3QgcmVxdWlyZWQsIGlmIGl0IGhhcyBhIGRlZmF1bHQgdmFsdWUsIHdlIG5lZWQgdG8gZ2VuZXJhdGUgSXNzZXQKKyAgICAgIC8vIGlmIHdlIGFyZSBub3QgbnVsbGFibGUsIHRoZW4gd2UgZ2VuZXJhdGUgSXNzZXQKKyAgICAgIGlmICghaXNfcmVxdWlyZWQgJiYgKCFudWxsYWJsZV8gfHwgaGFzX2RlZmF1bHQpKSB7CisgICAgICAgIGlmIChzZXJpYWxpemVfIHx8IHdjZl8pIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiW0RhdGFNZW1iZXJdIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbCAiIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgaWYgKGdlbmVyYXRlX2lzc2V0ICYmIChzZXJpYWxpemVfIHx8IHdjZl8pKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiI3JlZ2lvbiBYbWxTZXJpYWxpemVyIHN1cHBvcnQiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKTsKKyAgICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqbV9pdGVyKSk7CisgICAgICAgIC8vIGlmIGl0IGlzIHJlcXVpcmVkLCBkb24ndCBuZWVkIElzc2V0IGZvciB0aGF0IHZhcmlhYmxlCisgICAgICAgIC8vIGlmIGl0IGlzIG5vdCByZXF1aXJlZCwgaWYgaXQgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgd2UgbmVlZCB0byBnZW5lcmF0ZSBJc3NldAorICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IG51bGxhYmxlLCB0aGVuIHdlIGdlbmVyYXRlIElzc2V0CisgICAgICAgIGlmICghaXNfcmVxdWlyZWQgJiYgKCFudWxsYWJsZV8gfHwgaGFzX2RlZmF1bHQpKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sIFNob3VsZFNlcmlhbGl6ZSIgPDwgcHJvcF9uYW1lKCgqbV9pdGVyKSkgPDwgIigpIiA8PCBlbmRsOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGluZGVudChvdXQpIDw8ICIjZW5kcmVnaW9uIFhtbFNlcmlhbGl6ZXIgc3VwcG9ydCIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIFdlIGFsd2F5cyB3YW50IGEgZGVmYXVsdCwgbm8gYXJndW1lbnQgY29uc3RydWN0b3IgZm9yIFJlYWRpbmcKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IG5vcm1hbGl6ZV9uYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpIDw8ICIoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIHdoaWxlICh0LT5pc190eXBlZGVmKCkpIHsKKyAgICAgIHQgPSAoKHRfdHlwZWRlZiopdCktPmdldF90eXBlKCk7CisgICAgfQorICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpKSB7CisgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgInRoaXMuIiArIHByb3BfbmFtZSgqbV9pdGVyKSwgdCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzLl8iICsgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgLy8gT3B0aW9uYWxzIHdpdGggZGVmYXVsdHMgYXJlIG1hcmtlZCBzZXQKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9IHRydWU7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChoYXNfcmVxdWlyZWRfZmllbGRzKSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIgIiA8PCBub3JtYWxpemVfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgIikgOiB0aGlzKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgcHJvcF9uYW1lKCgqbV9pdGVyKSkgPDwgIiA9ICIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBpZiAoaXNfcmVzdWx0KSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfQorICBpZiAoaGFzaGNvZGVfKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9lcXVhbHMob3V0LCB0c3RydWN0KTsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2hhc2hjb2RlKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QpOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlIGEgY29ycmVzcG9uZGluZyBXQ0YgZmF1bHQgdG8gd3JhcCB0aGUgZXhjZXB0aW9uCisgIGlmICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSAmJiBpc19leGNlcHRpb24pIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfd2NmZmF1bHQob3V0LCB0c3RydWN0KTsKKyAgfQorCisgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh0c3RydWN0KTsKKyAgaWYgKCFpbl9jbGFzcykgeworICAgIGVuZF9jc2hhcnBfbmFtZXNwYWNlKG91dCk7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF93Y2ZmYXVsdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiI2lmICFTSUxWRVJMSUdIVCIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIltTZXJpYWxpemFibGVdIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiI2VuZGlmIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiW0RhdGFDb250cmFjdF0iIDw8IGVuZGw7CisgIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gInNlYWxlZCAiIDogIiIpIDw8ICJwYXJ0aWFsIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICA8PCAiRmF1bHQiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIC8vIG1ha2UgcHJpdmF0ZSBtZW1iZXJzIHdpdGggcHVibGljIFByb3BlcnRpZXMKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIC8vIGlmIHRoZSBmaWVsZCBpcyByZXF1aWVkLCB0aGVuIHdlIHVzZSBhdXRvLXByb3BlcnRpZXMKKyAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSkgJiYgKCFudWxsYWJsZV8gfHwgZmllbGRfaGFzX2RlZmF1bHQoKCptX2l0ZXIpKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICIgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgIl8iKSA8PCBlbmRsOworICAgIH0KKyAgfQorICBvdXQgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvcGVydHkob3V0LCAqbV9pdGVyLCB0cnVlLCBmYWxzZSk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgUmVhZCAoVFByb3RvY29sIGlwcm90KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gUmVxdWlyZWQgdmFyaWFibGVzIGFyZW4ndCBpbiBfX2lzc2V0LCBzbyB3ZSBuZWVkIHRtcCB2YXJzIHRvIGNoZWNrIHRoZW0KKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImJvb2wgaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiVEZpZWxkIGZpZWxkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuUmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgImZpZWxkID0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApIHsgIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQuSUQpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOworICAgIGlmIChpc19yZXF1aXJlZCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIWlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiCisgICAgICAgICAgPDwgIlwicmVxdWlyZWQgZmllbGQgIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiIG5vdCBzZXRcIik7IgorICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIFdyaXRlKFRQcm90b2NvbCBvcHJvdCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJUU3RydWN0IHN0cnVjID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IG5hbWUgPDwgIlwiKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsiIDw8IGVuZGw7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsiIDw8IGVuZGw7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpOworICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqZl9pdGVyKSk7CisgICAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKworICAgICAgaWYgKGlzX3JlcXVpcmVkKQorICAgICAgeworICAgICAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgPT0gbnVsbCkiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICIKKyAgICAgICAgICAgICAgPDwgIlwicmVxdWlyZWQgZmllbGQgIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiIG5vdCBzZXRcIik7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaWYgKG51bGxhYmxlXyAmJiAhaGFzX2RlZmF1bHQpIHsKKyAgICAgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwgJiYgX19pc3NldC4iCisgICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgeyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgaW5kZW50KG91dCkgPDwgImlmIChfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLk5hbWUgPSBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZmllbGQuSUQgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZCk7IiA8PCBlbmRsOworCisgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKKworICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisgICAgICBpZiAoIWlzX3JlcXVpcmVkKSB7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIFdyaXRlKFRQcm90b2NvbCBvcHJvdCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJUU3RydWN0IHN0cnVjID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IG5hbWUgPDwgIlwiKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsiIDw8IGVuZGw7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsiIDw8IGVuZGw7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKKyAgICAgIH0KKworICAgICAgaWYgKG51bGxhYmxlXykgeworICAgICAgICBvdXQgPDwgIih0aGlzLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIodGhpcy5fX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gIW51bGxhYmxlXyAmJiB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIH0KKworICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLk5hbWUgPSBcIiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICJcIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZmllbGQuSUQgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZCk7IiA8PCBlbmRsOworCisgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKKworICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSI7CisgICAgfQorICB9CisKKyAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LldyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Rvc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiU3RyaW5nQnVpbGRlciBfX3NiID0gbmV3IFN0cmluZ0J1aWxkZXIoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIik7IgorICAgICAgICAgICAgICA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBib29sIHVzZUZpcnN0RmxhZyA9IGZhbHNlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImJvb2wgX19maXJzdCA9IHRydWU7IiA8PCBlbmRsOworICAgICAgdXNlRmlyc3RGbGFnID0gdHJ1ZTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKworICBib29sIGhhZF9yZXF1aXJlZCA9IGZhbHNlOyAvLyBzZXQgdG8gdHJ1ZSBhZnRlciBmaXJzdCByZXF1aXJlZCBmaWVsZCBoYXMgYmVlbiBwcm9jZXNzZWQKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpOworICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKmZfaXRlcikpOworICAgIGlmIChudWxsYWJsZV8gJiYgIWhhc19kZWZhdWx0ICYmICFpc19yZXF1aXJlZCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0gZWxzZSBpZiAoIWlzX3JlcXVpcmVkKSB7CisgICAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCAmJiBfX2lzc2V0LiIKKyAgICAgICAgICAgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHVzZUZpcnN0RmxhZyAmJiAoIWhhZF9yZXF1aXJlZCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZighX19maXJzdCkgeyBfX3NiLkFwcGVuZChcIiwgXCIpOyB9IiA8PCBlbmRsOworICAgICAgaWYgKCFpc19yZXF1aXJlZCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiX19maXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJfX3NiLkFwcGVuZChcIiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIjogXCIpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9fc2IuQXBwZW5kKFwiLCAiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICI6IFwiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBpZiAodHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiX19zYi5BcHBlbmQoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKQorICAgICAgICAgICAgICAgICAgPDwgIj09IG51bGwgPyBcIjxudWxsPlwiIDogIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiLlRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9fc2IuQXBwZW5kKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghaXNfcmVxdWlyZWQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaGFkX3JlcXVpcmVkID0gdHJ1ZTsgLy8gbm93IF9fZmlyc3QgbXVzdCBiZSBmYWxzZSwgc28gd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBpdCBhbnltb3JlCisgICAgfQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgIl9fc2IuQXBwZW5kKFwiKVwiKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19zYi5Ub1N0cmluZygpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3VuaW9uKHRfc3RydWN0KiB0dW5pb24pIHsKKyAgc3RyaW5nIGZfdW5pb25fbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgKHR1bmlvbi0+Z2V0X25hbWUoKSkgKyAiLmNzIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3VuaW9uOworCisgIGZfdW5pb24ub3BlbihmX3VuaW9uX25hbWUuY19zdHIoKSk7CisKKyAgZl91bmlvbiA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBjc2hhcnBfdHlwZV91c2luZ3MoKSA8PCBjc2hhcnBfdGhyaWZ0X3VzaW5ncygpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX2RlZmluaXRpb24oZl91bmlvbiwgdHVuaW9uKTsKKworICBmX3VuaW9uLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfdW5pb25fZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbikgeworICAvLyBMZXQncyBkZWZpbmUgdGhlIGNsYXNzIGZpcnN0CisgIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2Uob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGFic3RyYWN0IHBhcnRpYWwgY2xhc3MgIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiA6IFRBYnN0cmFjdEJhc2UgeyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGUoVFByb3RvY29sIHByb3RvY29sKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgcmVhZG9ubHkgYm9vbCBJc3NldDsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYWJzdHJhY3Qgb2JqZWN0IERhdGEgeyBnZXQ7IH0iIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiKGJvb2wgaXNzZXQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiSXNzZXQgPSBpc3NldDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBjbGFzcyBfX191bmRlZmluZWQgOiAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IERhdGEgeyBnZXQgeyByZXR1cm4gbnVsbDsgfSB9IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgX19fdW5kZWZpbmVkKCkgOiBiYXNlKGZhbHNlKSB7fSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShUUHJvdG9jb2wgcHJvdG9jb2wpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbiggVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgXCJDYW5ub3QgcGVyc2lzdCAiCisgICAgICAgICAgICAgICAgICJhbiB1bmlvbiB0eXBlIHdoaWNoIGlzIG5vdCBzZXQuXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHR1bmlvbi0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX2NsYXNzKG91dCwgdHVuaW9uLCAoKmZfaXRlcikpOworICB9CisKKyAgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX3JlYWRlcihvdXQsIHR1bmlvbik7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBlbmRfY3NoYXJwX25hbWVzcGFjZShvdXQpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3VuaW9uX2NsYXNzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHVuaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIDogIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIF9kYXRhOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvdmVycmlkZSBvYmplY3QgRGF0YSB7IGdldCB7IHJldHVybiBfZGF0YTsgfSB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICA8PCAiIGRhdGEpIDogYmFzZSh0cnVlKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInRoaXMuX2RhdGEgPSBkYXRhOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShUUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJUU3RydWN0IHN0cnVjID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImZpZWxkLk5hbWUgPSBcIiIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJmaWVsZC5UeXBlID0gIiA8PCB0eXBlX3RvX2VudW0odGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImZpZWxkLklEID0gIiA8PCB0ZmllbGQtPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZCk7IiA8PCBlbmRsOworCisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIHRmaWVsZCwgIl9kYXRhIiwgdHJ1ZSwgdHJ1ZSk7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZXF1YWxzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3QgdGhhdCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInZhciBvdGhlciA9IHRoYXQgYXMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlmIChSZWZlcmVuY2VFcXVhbHModGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiYmICI7CisgICAgfQorICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSAmJiAhKG51bGxhYmxlXyAmJiAhZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKSkpIHsKKyAgICAgIG91dCA8PCAiKChfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID09IG90aGVyLl9faXNzZXQuIgorICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgJiYgKCghX19pc3NldC4iCisgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB8fCAoIjsKKyAgICB9CisgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgb3V0IDw8ICJUQ29sbGVjdGlvbnMuRXF1YWxzKCI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiU3lzdGVtLk9iamVjdC5FcXVhbHMoIjsKKyAgICB9CisgICAgb3V0IDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIsIG90aGVyLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIikiOworICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSAmJiAhKG51bGxhYmxlXyAmJiAhZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKSkpIHsKKyAgICAgIG91dCA8PCAiKSkpIjsKKyAgICB9CisgIH0KKyAgaWYgKGZpcnN0KSB7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiaW50IGhhc2hjb2RlID0gMDsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ1bmNoZWNrZWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaGFzaGNvZGUgPSAoaGFzaGNvZGUgKiAzOTcpIF4gIjsKKyAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkgeworICAgICAgb3V0IDw8ICIoIjsKKyAgICB9IGVsc2UgaWYgKG51bGxhYmxlXykgeworICAgICAgb3V0IDw8ICIoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiID09IG51bGwgPyAwIDogIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIoIV9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPyAwIDogIjsKKyAgICB9CisgICAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgb3V0IDw8ICIoVENvbGxlY3Rpb25zLkdldEhhc2hDb2RlKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIikpIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiLkdldEhhc2hDb2RlKCkpIjsKKyAgICB9CisgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGhhc2hjb2RlOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICIuY3MiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBjc2hhcnBfdHlwZV91c2luZ3MoKSA8PCBjc2hhcnBfdGhyaWZ0X3VzaW5ncygpIDw8IGVuZGw7CisKKyAgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShmX3NlcnZpY2VfKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBwYXJ0aWFsIGNsYXNzICIgPDwgbm9ybWFsaXplX25hbWUoc2VydmljZV9uYW1lXykgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICBlbmRfY3NoYXJwX25hbWVzcGFjZShmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBnZW5lcmF0ZV9zZXBhcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZXModHNlcnZpY2UpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VwYXJhdGVfc2VydmljZV9pbnRlcmZhY2VzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZ2VuZXJhdGVfc3luY19zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisKKyAgaWYgKGFzeW5jXykgeworICAgIGdlbmVyYXRlX2FzeW5jX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgfQorCisgIGdlbmVyYXRlX2NvbWJpbmVkX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N5bmNfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfaWZhY2UgPSAiIDogIiArIGV4dGVuZHMgKyAiLklTeW5jIjsKKyAgfQorCisgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworCisgIGlmICh3Y2ZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbU3lzdGVtLlNlcnZpY2VNb2RlbC5TZXJ2aWNlQ29udHJhY3QoTmFtZXNwYWNlPVwiIiA8PCB3Y2ZfbmFtZXNwYWNlXyA8PCAiXCIpXSIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBpbnRlcmZhY2UgSVN5bmMiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOworCisgICAgLy8gaWYgd2UncmUgdXNpbmcgV0NGLCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlcworICAgIGlmICh3Y2ZfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIltTeXN0ZW0uU2VydmljZU1vZGVsLk9wZXJhdGlvbkNvbnRyYWN0XSIgPDwgZW5kbDsKKworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW1N5c3RlbS5TZXJ2aWNlTW9kZWwuRmF1bHRDb250cmFjdCh0eXBlb2YoIgorICAgICAgICAgICsgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICJGYXVsdCkpXSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2FzeW5jX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2lmYWNlID0gIiA6ICIgKyBleHRlbmRzICsgIi5JQXN5bmMiOworICB9CisKKyAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisKKyAgaWYgKHdjZl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIltTeXN0ZW0uU2VydmljZU1vZGVsLlNlcnZpY2VDb250cmFjdChOYW1lc3BhY2U9XCIiIDw8IHdjZl9uYW1lc3BhY2VfIDw8ICJcIildIiA8PCBlbmRsOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGludGVyZmFjZSBJQXN5bmMiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOworCisgICAgLy8gaWYgd2UncmUgdXNpbmcgV0NGLCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlcworICAgIGlmICh3Y2ZfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIltTeXN0ZW0uU2VydmljZU1vZGVsLk9wZXJhdGlvbkNvbnRyYWN0XSIgPDwgZW5kbDsKKworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW1N5c3RlbS5TZXJ2aWNlTW9kZWwuRmF1bHRDb250cmFjdCh0eXBlb2YoIgorICAgICAgICAgICsgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICJGYXVsdCkpXSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbWJpbmVkX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIDogSVN5bmMiOworCisgIGlmIChhc3luY18pIHsKKyAgICBleHRlbmRzX2lmYWNlICs9ICIsIElBc3luYyI7CisgIH0KKworICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKworICBpZiAod2NmXykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW1N5c3RlbS5TZXJ2aWNlTW9kZWwuU2VydmljZUNvbnRyYWN0KE5hbWVzcGFjZT1cIiIgPDwgd2NmX25hbWVzcGFjZV8gPDwgIlwiKV0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBpbnRlcmZhY2UgSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIC8vIFdlIG5lZWQgdG8gZ2VuZXJhdGUgZXh0cmEgb2xkIHN0eWxlIGFzeW5jIG1ldGhvZHMgZm9yIHNpbHZlcmxpZ2h0LiBTaW5jZQorICAvLyB0aGlzIGlzbid0IHNvbWV0aGluZyB5b3UnZCB3YW50IHRvIGltcGxlbWVudCBzZXJ2ZXItc2lkZSwganVzdCBwdXQgdGhlbSBpbnRvCisgIC8vIHRoZSBtYWluIElmYWNlIGludGVyZmFjZS4KKyAgZ2VuZXJhdGVfc2lsdmVybGlnaHRfYXN5bmNfbWV0aG9kcyh0c2VydmljZSk7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zaWx2ZXJsaWdodF9hc3luY19tZXRob2RzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKKworICAgIC8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgaW5jbHVkZSB0aGUgQmVnaW5fLCBFbmRfIG1ldGhvZHMgaWYgd2UncmUgZ2VuZXJhdGluZworICAgIC8vIHdpdGggdGhlIGFzeW5jIGZsYWcuIEknbSBub3Qgc3VyZSB0aGlzIGlzIG5lY2Vzc2FyeSwgc28gc29tZW9uZSB3aXRoIG1vcmUga25vd2xlZGdlCisgICAgLy8gY2FuIG1heWJlIHJlbW92ZSB0aGVzZSBjaGVja3MgaWYgdGhleSBrbm93IGl0J3Mgc2FmZS4KKyAgICBpZiAoIWFzeW5jXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjaWYgU0lMVkVSTElHSFQiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19iZWdpbigqZl9pdGVyLCAiQmVnaW5fIikgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19lbmQoKmZfaXRlciwgIkVuZF8iKSA8PCAiOyIgPDwgZW5kbDsKKworICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbmRpZiIgPDwgZW5kbDsKKyAgICB9CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UsIHRydWUpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5DbGllbnQsICI7CisgIH0gZWxzZSB7CisgICAgZXh0ZW5kc19jbGllbnQgPSAiSURpc3Bvc2FibGUsICI7CisgIH0KKworICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBjbGFzcyBDbGllbnQgOiAiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICJJZmFjZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBwcm90KSA6IHRoaXMocHJvdCwgcHJvdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSI7CisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiIDogYmFzZShpcHJvdCwgb3Byb3QpIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IG9wcm90OyIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBpcHJvdF87IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBvcHJvdF87IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgaW50IHNlcWlkXzsiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgVFByb3RvY29sIElucHV0UHJvdG9jb2wiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJnZXQgeyByZXR1cm4gaXByb3RfOyB9IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgVFByb3RvY29sIE91dHB1dFByb3RvY29sIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZ2V0IHsgcmV0dXJuIG9wcm90XzsgfSIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBlbmRsOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjcmVnaW9uIFwiIElEaXNwb3NhYmxlIFN1cHBvcnQgXCIiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvLyBJRGlzcG9zYWJsZSIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyB2b2lkIERpc3Bvc2UoKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIkRpc3Bvc2UodHJ1ZSk7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoIV9Jc0Rpc3Bvc2VkKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChkaXNwb3NpbmcpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGlwcm90XyAhPSBudWxsKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigoSURpc3Bvc2FibGUpaXByb3RfKS5EaXNwb3NlKCk7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob3Byb3RfICE9IG51bGwpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKChJRGlzcG9zYWJsZSlvcHJvdF8pLkRpc3Bvc2UoKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJfSXNEaXNwb3NlZCA9IHRydWU7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZW5kcmVnaW9uIiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZW5kbDsKKworICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNpZiBTSUxWRVJMSUdIVCIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBlbmRsOworICAgIH0KKyAgICAvLyBCZWdpbl8KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19iZWdpbigqZl9pdGVyLCAiQmVnaW5fIikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKGNhbGxiYWNrLCBzdGF0ZSI7CisKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICBmX3NlcnZpY2VfIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICAvLyBFbmQKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19lbmQoKmZfaXRlciwgIkVuZF8iKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3RfLlRyYW5zcG9ydC5FbmRGbHVzaChhc3luY1Jlc3VsdCk7IiA8PCBlbmRsOworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIC8vIGFzeW5jCisgICAgYm9vbCBmaXJzdDsKKyAgICBpZiAoYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBhc3luYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYygqZl9pdGVyLCAiIikgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiIHJldHZhbDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dmFsID0gIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKTsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgImF3YWl0IFRhc2suUnVuKCgpID0+IiA8PCBlbmRsOworICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXyk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBmdW5uYW1lIDw8ICIoIjsKKyAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgICB9CisgICAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pOyIgPDwgZW5kbDsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gcmV0dmFsOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCFhc3luY18pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZGlmIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgLy8gc2lsdmVybGlnaHQgaW52b2tlCisgICAgaWYgKCFhc3luY18pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2lmIFNJTFZFUkxJR0hUIiA8PCBlbmRsOworCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhciBhc3luY1Jlc3VsdCA9IEJlZ2luXyIgPDwgZnVubmFtZSA8PCAiKG51bGwsIG51bGwiOworICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworICAgICAgCisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgICB9CisgICAgICAgIGZfc2VydmljZV8gPDwgIkVuZF8iIDw8IGZ1bm5hbWUgPDwgIihhc3luY1Jlc3VsdCk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbHNlIiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIHN5bmNocm9ub3VzIGludm9rZQorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOworICAKKyAgICBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworICAKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgaWYgKCFhc3luY18pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZGlmIiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgICAgLy8gU2VuZAorICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKworICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNpZiBTSUxWRVJMSUdIVCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19iZWdpbigmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCisgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT25ld2F5IiA6ICJUTWVzc2FnZVR5cGUuQ2FsbCIpCisgICAgICAgICAgICAgICA8PCAiLCBzZXFpZF8pKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUKKyAgICAgICAgICAgICAgIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZmxkX2l0ZXIpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLldyaXRlKG9wcm90Xyk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBvcHJvdF8uVHJhbnNwb3J0LkJlZ2luRmx1c2goY2FsbGJhY2ssIHN0YXRlKTsiIDw8IGVuZGw7CisgICAgICAKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbHNlIiA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PbmV3YXkiIDogIlRNZXNzYWdlVHlwZS5DYWxsIikKKyAgICAgICAgICAgICAgIDw8ICIsIHNlcWlkXykpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZQorICAgICAgICAgICAgICAgPDwgIigpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmbGRfaXRlcikgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MuV3JpdGUob3Byb3RfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJvcHJvdF8uV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdF8uVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsOworICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgICAgaWYgKCFhc3luY18pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZGlmIiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOworICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHhzLCB4cy0+Z2V0X21lbWJlcnMoKSwgcmVzdWx0bmFtZSk7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90Xy5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJpZiAobXNnLlR5cGUgPT0gVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb24uUmVhZChpcHJvdF8pOyIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3RfLlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ0aHJvdyB4OyIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIgorICAgICAgICAgICAgICAgICA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5SZWFkKGlwcm90Xyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpcHJvdF8uUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaWYgKG51bGxhYmxlXykgeworICAgICAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuU3VjY2VzcyAhPSBudWxsKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiByZXN1bHQuU3VjY2VzczsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuU3VjY2Vzcy5IYXNWYWx1ZSkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiICByZXR1cm4gcmVzdWx0LlN1Y2Nlc3MuVmFsdWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuc3VjY2VzcykgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgPDwgIiAgcmV0dXJuIHJlc3VsdC5TdWNjZXNzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgaWYgKG51bGxhYmxlXykgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICJ0aHJvdyBuZXcgIgorICAgICAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTWlzc2luZ1Jlc3VsdCwgXCIiCisgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZygoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7CisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaWYgKGFzeW5jXykgeworICAgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyX2FzeW5jKHRzZXJ2aWNlKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcl9zeW5jKHRzZXJ2aWNlKTsKKyAgfQorICBlbHNlIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcl9zeW5jKHRzZXJ2aWNlKTsKKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXJfc3luYyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuUHJvY2Vzc29yLCAiOworICB9CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgY2xhc3MgUHJvY2Vzc29yIDogIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiVFByb2Nlc3NvciB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBQcm9jZXNzb3IoSVN5bmMgaWZhY2UpIjsKKworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgIiA6IGJhc2UoaWZhY2UpIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZmFjZV8gPSBpZmFjZTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm9jZXNzTWFwX1tcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICA8PCAiXCJdID0gIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl9Qcm9jZXNzOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJwcm90ZWN0ZWQgZGVsZWdhdGUgdm9pZCBQcm9jZXNzRnVuY3Rpb24oaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCk7IgorICAgICAgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByaXZhdGUgSVN5bmMgaWZhY2VfOyIgPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIERpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+IHByb2Nlc3NNYXBfID0gbmV3ICIKKyAgICAgICJEaWN0aW9uYXJ5PHN0cmluZywgUHJvY2Vzc0Z1bmN0aW9uPigpOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgYm9vbCBQcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKKyAgfQorICBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBuZXcgYm9vbCBQcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKKyAgfQorICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90LlJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlXworICAgIDw8IGluZGVudCgpIDw8ICJQcm9jZXNzRnVuY3Rpb24gZm47IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgPDwgInByb2Nlc3NNYXBfLlRyeUdldFZhbHVlKG1zZy5OYW1lLCBvdXQgZm4pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuID09IG51bGwpIHsiCisgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIFRUeXBlLlN0cnVjdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgPDwgIiAgaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24gIgorICAgICIoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93bk1ldGhvZCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIgKyAiCisgICAgIm1zZy5OYW1lICsgXCInXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbXNnLlNlcUlEKSk7IgorICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeC5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZTsiCisgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZm4obXNnLlNlcUlELCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhdGNoIChJT0V4Y2VwdGlvbikiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXJfYXN5bmModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLkFzeW5jUHJvY2Vzc29yLCAiOworICB9CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgY2xhc3MgQXN5bmNQcm9jZXNzb3IgOiAiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJUQXN5bmNQcm9jZXNzb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQXN5bmNQcm9jZXNzb3IoSUFzeW5jIGlmYWNlKSI7CisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiIDogYmFzZShpZmFjZSkiOworICB9CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmYWNlXyA9IGlmYWNlOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfW1wiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgIDw8ICJcIl0gPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX1Byb2Nlc3NBc3luYzsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAicHJvdGVjdGVkIGRlbGVnYXRlIFRhc2sgUHJvY2Vzc0Z1bmN0aW9uKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpOyIKKyAgICAgIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcml2YXRlIElBc3luYyBpZmFjZV87IiA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgRGljdGlvbmFyeTxzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4gcHJvY2Vzc01hcF8gPSBuZXcgIgorICAgICAgIkRpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+KCk7IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7CisgIH0KKyAgZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgbmV3IGFzeW5jIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKKyAgfQorICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90LlJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlXworICAgIDw8IGluZGVudCgpIDw8ICJQcm9jZXNzRnVuY3Rpb24gZm47IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgPDwgInByb2Nlc3NNYXBfLlRyeUdldFZhbHVlKG1zZy5OYW1lLCBvdXQgZm4pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuID09IG51bGwpIHsiCisgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIFRUeXBlLlN0cnVjdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgPDwgIiAgaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24gIgorICAgICIoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93bk1ldGhvZCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIgKyAiCisgICAgIm1zZy5OYW1lICsgXCInXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbXNnLlNlcUlEKSk7IgorICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeC5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZTsiCisgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgZm4obXNnLlNlcUlELCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhdGNoIChJT0V4Y2VwdGlvbikiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uX2FzeW5jKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKworICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHZvaWQgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJfUHJvY2VzcyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImFyZ3MuUmVhZChpcHJvdCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5TdWNjZXNzID0gIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICJpZmFjZV8uIiA8PCBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZl9pdGVyKTsKKyAgICBpZiAobnVsbGFibGVfICYmICF0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIi5WYWx1ZSI7CisgICAgfQorICB9CisgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKKyAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHhzLCB4cy0+Z2V0X21lbWJlcnMoKSwgcmVzdWx0bmFtZSk7CisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiICIKKyAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUmVwbHksIHNlcWlkKSk7ICIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh4cyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHRocm93OyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImNhdGNoIChFeGNlcHRpb24gZXgpIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBDb25zb2xlLkVycm9yLldyaXRlTGluZShcIkVycm9yIG9jY3VycmVkIGluIHByb2Nlc3NvcjpcIik7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoZXguVG9TdHJpbmcoKSk7IiA8PCBlbmRsOworCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJuYWxFcnJvcixcIiBJbnRlcm5hbCBlcnJvci5cIik7IgorICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgc2VxaWQpKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHguV3JpdGUob3Byb3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QuVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uX2FzeW5jKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0c2VydmljZTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgYXN5bmMgVGFzayAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgIDw8ICJfUHJvY2Vzc0FzeW5jKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAiYXJncy5SZWFkKGlwcm90KTsiIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAiaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LlN1Y2Nlc3MgPSAiOworICB9CisgIGZfc2VydmljZV8gPDwgImF3YWl0IGlmYWNlXy4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIkFzeW5jKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZl9pdGVyKTsKKyAgICBpZiAobnVsbGFibGVfICYmICF0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIi5WYWx1ZSI7CisgICAgfQorICB9CisgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKKyAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHhzLCB4cy0+Z2V0X21lbWJlcnMoKSwgcmVzdWx0bmFtZSk7CisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiICIKKyAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUmVwbHksIHNlcWlkKSk7ICIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh4cyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikiIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbAorICAgIDw8IGluZGVudCgpIDw8ICIgIHRocm93OyIgPDwgZW5kbAorICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgImNhdGNoIChFeGNlcHRpb24gZXgpIiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAiICBDb25zb2xlLkVycm9yLldyaXRlTGluZShcIkVycm9yIG9jY3VycmVkIGluIHByb2Nlc3NvcjpcIik7IiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgIiAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoZXguVG9TdHJpbmcoKSk7IiA8PCBlbmRsOworCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorICBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJuYWxFcnJvcixcIiBJbnRlcm5hbCBlcnJvci5cIik7IgorICAgICAgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgc2VxaWQpKTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIgIHguV3JpdGUob3Byb3QpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QuVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfdW5pb25fcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKSB7CisgIC8vIFRoYW5rcyB0byBUSFJJRlQtMTc2OCwgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIGluIHRoZSB1bmlvbgorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0dW5pb24tPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIFJlYWQoVFByb3RvY29sIGlwcm90KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiByZXR2YWw7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiVEZpZWxkIGZpZWxkID0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7CisgIC8vIHdlIGNhbm5vdCBoYXZlIHRoZSBmaXJzdCBmaWVsZCBiZSBhIHN0b3AgLS0gd2UgbXVzdCBoYXZlIGEgc2luZ2xlIGZpZWxkIGRlZmluZWQKKyAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dmFsID0gbmV3IF9fX3VuZGVmaW5lZCgpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBpbmRlbnQob3V0KSA8PCAiZWxzZSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQuSUQpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiB0ZW1wOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICgqZl9pdGVyKSwgInRlbXAiLCB0cnVlKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dmFsID0gbmV3ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIodGVtcCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR2YWwgPSBuZXcgX19fdW5kZWZpbmVkKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgInJldHZhbCA9IG5ldyBfX191bmRlZmluZWQoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgImlmIChpcHJvdC5SZWFkRmllbGRCZWdpbigpLlR5cGUgIT0gVFR5cGUuU3RvcCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIGVuZCBvZiBlbHNlIGZvciBUU3RvcAorICBzY29wZV9kb3duKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHJldHZhbDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJvcGVydHlsZXNzKSB7CisgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIChpc19wcm9wZXJ0eWxlc3MgPyAiIiA6IHByb3BfbmFtZSh0ZmllbGQpKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAiOworCisgICAgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIpIjsKKyAgICB9CisKKyAgICBvdXQgPDwgImlwcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgIlJlYWRCaW5hcnkoKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiUmVhZFN0cmluZygpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAiUmVhZEJvb2woKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAiUmVhZEJ5dGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIlJlYWRJMTYoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIlJlYWRJMzIoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIlJlYWRJNjQoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIlJlYWREb3VibGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIlJlYWRJMzIoKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgaWYgKHVuaW9uXyAmJiB0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIi5SZWFkKGlwcm90KTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgcHJlZml4IDw8ICIuUmVhZChpcHJvdCk7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgc3RyaW5nIG9iajsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb2JqID0gdG1wKCJfbWFwIik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb2JqID0gdG1wKCJfc2V0Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVE1hcCAiIDw8IG9iaiA8PCAiID0gaXByb3QuUmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVFNldCAiIDw8IG9iaiA8PCAiID0gaXByb3QuUmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRMaXN0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5SZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsOworICB9CisKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IoIGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5Db3VudCIKKyAgICAgICAgICAgICAgPDwgIjsgIgorICAgICAgICAgICAgICA8PCAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuQWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcm9wZXJ0eWxlc3MpIHsKKyAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgKGlzX3Byb3BlcnR5bGVzcyA/ICIiIDogcHJvcF9uYW1lKHRmaWVsZCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuIjsKKworICAgIHN0cmluZyBudWxsYWJsZV9uYW1lID0gbnVsbGFibGVfICYmICFpc19lbGVtZW50ICYmICFmaWVsZF9pc19yZXF1aXJlZCh0ZmllbGQpID8gbmFtZSArICIuVmFsdWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuYW1lOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJXcml0ZUJpbmFyeSgiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiV3JpdGVTdHJpbmcoIjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUJvb2woIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUJ5dGUoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAiV3JpdGVJMTYoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAiV3JpdGVJMzIoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAiV3JpdGVJNjQoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAiV3JpdGVEb3VibGUoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAiV3JpdGVJMzIoKGludCkiIDw8IG51bGxhYmxlX25hbWUgPDwgIik7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFICclcyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHByZWZpeC5jX3N0cigpLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIuV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZU1hcEJlZ2luKG5ldyBUTWFwKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKKyAgICAgICAgICAgICAgICA8PCAiLkNvdW50KSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVNldEJlZ2luKG5ldyBUU2V0KCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuQ291bnQpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUxpc3RCZWdpbihuZXcgVExpc3QoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuQ291bnQpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggKCIgPDwgdHlwZV9uYW1lKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyCisgICAgICAgICAgICAgICAgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiLktleXMpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCAoIiA8PCB0eXBlX25hbWUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyCisgICAgICAgICAgICAgICAgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3JlYWNoICgiIDw8IHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyCisgICAgICAgICAgICAgICAgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSI7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCkgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiLCB0cnVlKTsKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIG1hcCArICJbIiArIGl0ZXIgKyAiXSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsIHRydWUpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCB0cnVlKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1B1YmxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGdlbmVyYXRlSXNzZXQpIHsKKyAgZ2VuZXJhdGVfY3NoYXJwX3Byb3BlcnR5KG91dCwgdGZpZWxkLCBpc1B1YmxpYywgZ2VuZXJhdGVJc3NldCwgIl8iKTsKK30KK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfcHJvcGVydHkob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQdWJsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZ2VuZXJhdGVJc3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgpIHsKKyAgaWYgKChzZXJpYWxpemVfIHx8IHdjZl8pICYmIGlzUHVibGljKSB7CisgICAgaW5kZW50KG91dCkgPDwgIltEYXRhTWVtYmVyKE9yZGVyID0gMCldIiA8PCBlbmRsOworICB9CisgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCh0ZmllbGQpOworICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQodGZpZWxkKTsKKyAgaWYgKChudWxsYWJsZV8gJiYgIWhhc19kZWZhdWx0KSB8fCAoaXNfcmVxdWlyZWQpKSB7CisgICAgaW5kZW50KG91dCkgPDwgKGlzUHVibGljID8gInB1YmxpYyAiIDogInByaXZhdGUgIikKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGlzX3JlcXVpcmVkKSA8PCAiICIKKyAgICAgICAgICAgICAgICA8PCBwcm9wX25hbWUodGZpZWxkKSA8PCAiIHsgZ2V0OyBzZXQ7IH0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgKGlzUHVibGljID8gInB1YmxpYyAiIDogInByaXZhdGUgIikKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UsIHRydWUpIDw8ICIgIiA8PCBwcm9wX25hbWUodGZpZWxkKQorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZ2V0IiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgYm9vbCB1c2VfbnVsbGFibGUgPSBmYWxzZTsKKyAgICBpZiAobnVsbGFibGVfKSB7CisgICAgICB0X3R5cGUqIHR0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICAgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICAgICAgfQorICAgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICB1c2VfbnVsbGFibGUgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkgIT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOworICAgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgIHVzZV9udWxsYWJsZSA9IHRydWU7CisgICAgICB9CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBmaWVsZFByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgInNldCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGlmICh1c2VfbnVsbGFibGUpIHsKKyAgICAgIGlmIChnZW5lcmF0ZUlzc2V0KSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUodGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiID0gdmFsdWUuSGFzVmFsdWU7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZS5IYXNWYWx1ZSkgdGhpcy4iIDw8IGZpZWxkUHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiID0gdmFsdWUuVmFsdWU7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoZ2VuZXJhdGVJc3NldCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZFByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gdmFsdWU7IiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisgIG91dCA8PCBlbmRsOworfQorCitzdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6Om1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIoc3RkOjpzdHJpbmcgY29uc3QmIGZyb21OYW1lKSB7CisgIHN0ZDo6c3RyaW5nIHN0ciA9IGZyb21OYW1lOworICBpZiAoc3RyLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gc3RyOworICB9CisKKyAgLy8gdGVzdHMgcmVseSBvbiB0aGlzCisgIGFzc2VydCgoJ0EnIDwgJ1onKSAmJiAoJ2EnIDwgJ3onKSAmJiAoJzAnIDwgJzknKSk7CisKKyAgLy8gaWYgdGhlIGZpcnN0IGxldHRlciBpcyBhIG51bWJlciwgd2UgYWRkIGFuIGFkZGl0aW9uYWwgdW5kZXJzY29yZSBpbiBmcm9udCBvZiBpdAorICBjaGFyIGMgPSBzdHIuYXQoMCk7CisgIGlmICgoJzAnIDw9IGMpICYmIChjIDw9ICc5JykpIHsKKyAgICBzdHIgPSAiXyIgKyBzdHI7CisgIH0KKworICAvLyBmb2xsb3dpbmcgY2hhcnM6IGxldHRlciwgbnVtYmVyIG9yIHVuZGVyc2NvcmUKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHIuc2l6ZSgpOyArK2kpIHsKKyAgICBjID0gc3RyLmF0KGkpOworICAgIGlmICgoKCdBJyA+IGMpIHx8IChjID4gJ1onKSkgJiYgKCgnYScgPiBjKSB8fCAoYyA+ICd6JykpICYmICgoJzAnID4gYykgfHwgKGMgPiAnOScpKQorICAgICAgICAmJiAoJ18nICE9IGMpKSB7CisgICAgICBzdHIucmVwbGFjZShpLCAxLCAiXyIpOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdHI7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUpIHsKKyAgaWYoIG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5lbXB0eSgpKSB7CisgICAgdGhyb3cgImludGVybmFsIGVycm9yOiBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoKSBubyBzY29wZSBhY3RpdmUiOworICB9CisKKyAgbWVtYmVyX21hcHBpbmdfc2NvcGUmIGFjdGl2ZSA9IG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5iYWNrKCk7CisgIGlmIChhY3RpdmUuc2NvcGVfbWVtYmVyICE9IHNjb3BlKSB7CisgICAgdGhyb3cgImludGVybmFsIGVycm9yOiBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoKSBjYWxsZWQgZm9yIHdyb25nIHN0cnVjdCI7CisgIH0KKworICBtZW1iZXJfbWFwcGluZ19zY29wZXMucG9wX2JhY2soKTsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2V0X21hcHBlZF9tZW1iZXJfbmFtZShzdHJpbmcgbmFtZSkgeworICBpZiggISBtZW1iZXJfbWFwcGluZ19zY29wZXMuZW1wdHkoKSkgeworICAgIG1lbWJlcl9tYXBwaW5nX3Njb3BlJiBhY3RpdmUgPSBtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ZXIgPSBhY3RpdmUubWFwcGluZ190YWJsZS5maW5kKG5hbWUpOworICAgIGlmIChhY3RpdmUubWFwcGluZ190YWJsZS5lbmQoKSAhPSBpdGVyKSB7CisgICAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICAgIH0KKyAgfQorCisgIHB2ZXJib3NlKCJubyBtYXBwaW5nIGZvciBtZW1iZXIgJXNcbiIsIG5hbWUuY19zdHIoKSk7CisgIHJldHVybiBuYW1lOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0c3RydWN0LCB0c3RydWN0LT5nZXRfbWVtYmVycygpLCB0c3RydWN0LT5nZXRfbmFtZSgpKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh2b2lkKiBzY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RuYW1lKSB7CisgIC8vIGJlZ2luIG5ldyBzY29wZQorICBtZW1iZXJfbWFwcGluZ19zY29wZSBkdW1teTsKKyAgZHVtbXkuc2NvcGVfbWVtYmVyID0gMDsKKyAgbWVtYmVyX21hcHBpbmdfc2NvcGVzLnB1c2hfYmFjayhkdW1teSk7CisgIG1lbWJlcl9tYXBwaW5nX3Njb3BlJiBhY3RpdmUgPSBtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpOworICBhY3RpdmUuc2NvcGVfbWVtYmVyID0gc2NvcGU7CisKKyAgLy8gY3VycmVudCBDIyBnZW5lcmF0b3IgcG9saWN5OgorICAvLyAtIHByb3AgbmFtZXMgYXJlIGFsd2F5cyByZW5kZXJlZCB3aXRoIGFuIFVwcGVyY2FzZSBmaXJzdCBsZXR0ZXIKKyAgLy8gLSBzdHJ1Y3QgbmFtZXMgYXJlIHVzZWQgYXMgZ2l2ZW4KKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHVzZWRfbWVtYmVyX25hbWVzOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgIC8vIHByZXZlbnQgbmFtZSBjb25mbGljdHMgd2l0aCBzdHJ1Y3QgKENTMDU0MiBlcnJvcikKKyAgdXNlZF9tZW1iZXJfbmFtZXMuaW5zZXJ0KHN0cnVjdG5hbWUpOworCisgIC8vIHByZXZlbnQgbmFtZSBjb25mbGljdHMgd2l0aCBrbm93biBtZXRob2RzIChUSFJJRlQtMjk0MikKKyAgdXNlZF9tZW1iZXJfbmFtZXMuaW5zZXJ0KCJSZWFkIik7CisgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydCgiV3JpdGUiKTsKKworICBmb3IgKGl0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGl0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKytpdGVyKSB7CisgICAgc3RyaW5nIG9sZG5hbWUgPSAoKml0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBuZXduYW1lID0gcHJvcF9uYW1lKCppdGVyLCB0cnVlKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworCisgICAgICAvLyBuZXcgbmFtZSBjb25mbGljdHMgd2l0aCBhbm90aGVyIG1lbWJlcgorICAgICAgaWYgKHVzZWRfbWVtYmVyX25hbWVzLmZpbmQobmV3bmFtZSkgIT0gdXNlZF9tZW1iZXJfbmFtZXMuZW5kKCkpIHsKKyAgICAgICAgcHZlcmJvc2UoInN0cnVjdCAlczogbWVtYmVyICVzIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgbWVtYmVyXG4iLAorICAgICAgICAgICAgICAgICBzdHJ1Y3RuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIG5ld25hbWUuY19zdHIoKSk7CisgICAgICAgIG5ld25hbWUgKz0gJ18nOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gYWRkIGFsd2F5cywgdGhpcyBoZWxwcyB1cyB0byBkZXRlY3QgZWRnZSBjYXNlcyBsaWtlCisgICAgICAvLyBkaWZmZXJlbnQgc3BlbGxpbmdzICgiZm9vIiBhbmQgIkZvbyIpIHdpdGhpbiB0aGUgc2FtZSBzdHJ1Y3QKKyAgICAgIHB2ZXJib3NlKCJzdHJ1Y3QgJXM6IG1lbWJlciBtYXBwaW5nICVzID0+ICVzXG4iLAorICAgICAgICAgICAgICAgc3RydWN0bmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgb2xkbmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgbmV3bmFtZS5jX3N0cigpKTsKKyAgICAgIGFjdGl2ZS5tYXBwaW5nX3RhYmxlW29sZG5hbWVdID0gbmV3bmFtZTsKKyAgICAgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydChuZXduYW1lKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OnByb3BfbmFtZSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgc3VwcHJlc3NfbWFwcGluZykgeworICBzdHJpbmcgbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpOworICBpZiAoc3VwcHJlc3NfbWFwcGluZykgeworICAgIG5hbWVbMF0gPSB0b3VwcGVyKG5hbWVbMF0pOworICB9IGVsc2UgeworICAgIG5hbWUgPSBnZXRfbWFwcGVkX21lbWJlcl9uYW1lKG5hbWUpOworICB9CisgIHJldHVybiBuYW1lOworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkKSB7CisgICh2b2lkKWluX2luaXQ7CisgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlLCBpbl9jb250YWluZXIsIGluX3BhcmFtLCBpc19yZXF1aXJlZCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgIHJldHVybiAiRGljdGlvbmFyeTwiICsgdHlwZV9uYW1lKHRtYXAtPmdldF9rZXlfdHlwZSgpLCB0cnVlKSArICIsICIKKyAgICAgICAgICAgKyB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHRydWUpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICByZXR1cm4gIlRIYXNoU2V0PCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgIHJldHVybiAiTGlzdDwiICsgdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iOworICB9CisKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIHN0cmluZyBwb3N0Zml4ID0gKCFpc19yZXF1aXJlZCAmJiBudWxsYWJsZV8gJiYgaW5fcGFyYW0gJiYgdHR5cGUtPmlzX2VudW0oKSkgPyAiPyIgOiAiIjsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgc3RyaW5nIG5zID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY3NoYXJwIik7CisgICAgaWYgKCFucy5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gbnMgKyAiLiIgKyBub3JtYWxpemVfbmFtZSh0dHlwZS0+Z2V0X25hbWUoKSkgKyBwb3N0Zml4OworICAgIH0KKyAgfQorCisgIHJldHVybiBub3JtYWxpemVfbmFtZSh0dHlwZS0+Z2V0X25hbWUoKSkgKyBwb3N0Zml4OworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkKSB7CisgICh2b2lkKWluX2NvbnRhaW5lcjsKKyAgc3RyaW5nIHBvc3RmaXggPSAoIWlzX3JlcXVpcmVkICYmIG51bGxhYmxlXyAmJiBpbl9wYXJhbSkgPyAiPyIgOiAiIjsKKyAgc3dpdGNoICh0YmFzZS0+Z2V0X2Jhc2UoKSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgcmV0dXJuICJ2b2lkIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKHRiYXNlLT5pc19iaW5hcnkoKSkgeworICAgICAgcmV0dXJuICJieXRlW10iOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gInN0cmluZyI7CisgICAgfQorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuICJib29sIiArIHBvc3RmaXg7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgcmV0dXJuICJzYnl0ZSIgKyBwb3N0Zml4OworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICByZXR1cm4gInNob3J0IiArIHBvc3RmaXg7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIHJldHVybiAiaW50IiArIHBvc3RmaXg7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAibG9uZyIgKyBwb3N0Zml4OworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gImRvdWJsZSIgKyBwb3N0Zml4OworICBkZWZhdWx0OgorICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UtPmdldF9iYXNlKCkpOworICB9Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIHN0ZDo6c3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0dHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIGZpZWxkX2hhc19kZWZhdWx0KHRmaWVsZCkpIHsKKyAgICAgIHN0ZDo6b2ZzdHJlYW0gZHVtbXk7CisgICAgICByZXN1bHQgKz0gIiA9ICIgKyByZW5kZXJfY29uc3RfdmFsdWUoZHVtbXksIHRmaWVsZC0+Z2V0X25hbWUoKSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9ICgiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKTAiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0ICsgIjsiOworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHJldHVybiB0eXBlX25hbWUodHR5cGUpICsgIiAiICsgbm9ybWFsaXplX25hbWUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICIoIgorICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19iZWdpbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGNvbW1hID0gKHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPiAwID8gIiwgIiA6ICIiKTsKKyAgcmV0dXJuICJJQXN5bmNSZXN1bHQgIiArIG5vcm1hbGl6ZV9uYW1lKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkKKyAgICAgICAgICsgIihBc3luY0NhbGxiYWNrIGNhbGxiYWNrLCBvYmplY3Qgc3RhdGUiICsgY29tbWEgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkKKyAgICAgICAgICsgIikiOworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfZW5kKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICByZXR1cm4gdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIG5vcm1hbGl6ZV9uYW1lKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkKKyAgICAgICAgICsgIihJQXN5bmNSZXN1bHQgYXN5bmNSZXN1bHQpIjsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICBzdHJpbmcgdGFzayA9ICJUYXNrIjsKKyAgaWYgKCF0dHlwZS0+aXNfdm9pZCgpKQorICAgIHRhc2sgKz0gIjwiICsgdHlwZV9uYW1lKHR0eXBlKSArICI+IjsKKyAgcmV0dXJuIHRhc2sgKyAiICIgKyBub3JtYWxpemVfbmFtZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIkFzeW5jKCIKKyAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiICIgKyBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU3RyaW5nIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJ5dGUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5Eb3VibGUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU3RydWN0IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTWFwIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU2V0IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxpc3QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX2RvY3N0cmluZ19jb21tZW50KG9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKSB7CisgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8vLyA8c3VtbWFyeT5cbiIsICIvLy8gIiwgY29udGVudHMsICIvLy8gPC9zdW1tYXJ5PlxuIik7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfZG9jKG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKKyAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKKyAgICBzdHJpbmcgY29tYmluZWRfbWVzc2FnZSA9IGZpZWxkLT5nZXRfZG9jKCkgKyAiXG48c2VlYWxzbyBjcmVmPVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRfZW51bV9jbGFzc19uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSArICJcIi8+IjsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKG91dCwgKHRfZG9jKilmaWVsZCk7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9kb2Mob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvY3N0cmluZ19jb21tZW50KG91dCwgdGRvYy0+Z2V0X2RvYygpKTsKKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKKyAgICBzdHJpbmdzdHJlYW0gcHM7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgeworICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICBwcyA8PCAiXG48cGFyYW0gbmFtZT1cIiIgPDwgcC0+Z2V0X25hbWUoKSA8PCAiXCI+IjsKKyAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RyID0gcC0+Z2V0X2RvYygpOworICAgICAgICBzdHIuZXJhc2Uoc3RkOjpyZW1vdmUoc3RyLmJlZ2luKCksIHN0ci5lbmQoKSwgJ1xuJyksCisgICAgICAgICAgICAgICAgICBzdHIuZW5kKCkpOyAvLyByZW1vdmUgdGhlIG5ld2xpbmVzIHRoYXQgYXBwZWFyIGZyb20gdGhlIHBhcnNlcgorICAgICAgICBwcyA8PCBzdHI7CisgICAgICB9CisgICAgICBwcyA8PCAiPC9wYXJhbT4iOworICAgIH0KKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8vLyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VtbWFyeT5cbiIgKyB0ZnVuY3Rpb24tPmdldF9kb2MoKSArICI8L3N1bW1hcnk+IiArIHBzLnN0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiKTsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7CisgIHN0cmluZyBwYWNrYWdlID0gIiI7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjc2hhcnAiKSArICIuIjsKKyAgfQorICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBjc2hhcnAsCisgICAgIkMjIiwKKyAgICAiICAgIGFzeW5jOiAgICAgICAgICAgQWRkcyBBc3luYyBzdXBwb3J0IHVzaW5nIFRhc2suUnVuLlxuIgorICAgICIgICAgd2NmOiAgICAgICAgICAgICBBZGRzIGJpbmRpbmdzIGZvciBXQ0YgdG8gZ2VuZXJhdGVkIGNsYXNzZXMuXG4iCisgICAgIiAgICBzZXJpYWw6ICAgICAgICAgIEFkZCBzZXJpYWxpemF0aW9uIHN1cHBvcnQgdG8gZ2VuZXJhdGVkIGNsYXNzZXMuXG4iCisgICAgIiAgICBudWxsYWJsZTogICAgICAgIFVzZSBudWxsYWJsZSB0eXBlcyBmb3IgcHJvcGVydGllcy5cbiIKKyAgICAiICAgIGhhc2hjb2RlOiAgICAgICAgR2VuZXJhdGUgYSBoYXNoY29kZSBhbmQgZXF1YWxzIGltcGxlbWVudGF0aW9uIGZvciBjbGFzc2VzLlxuIgorICAgICIgICAgdW5pb246ICAgICAgICAgICBVc2UgbmV3IHVuaW9uIHR5cGluZywgd2hpY2ggaW5jbHVkZXMgYSBzdGF0aWMgcmVhZCBmdW5jdGlvbiBmb3IgdW5pb24gIgorICAgICJ0eXBlcy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjU2Y2ZjCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDc0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnNldDsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBEIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqIGdlbmVyYXRlXyooKSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBieSB0aGUgYmFzZSBjbGFzcyB0byBlbWl0IGNvZGUgZm9yIHRoZQorICogZ2l2ZW4gZW50aXR5LCBwcmludF8qKCkgZnVuY3Rpb25zIHdyaXRlIGEgcGllY2Ugb2YgY29kZSB0byB0aGUgcGFzc2VkCisgKiBzdHJlYW0sIGFuZCByZW5kZXJfKigpIHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBEIHJlcHJlc2VudGF0aW9uIG9mCisgKiB0aGUgcGFzc2VkIGVudGl0eS4KKyAqLworY2xhc3MgdF9kX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2RfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgLyogbm8gb3B0aW9ucyB5ZXQgKi8KKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBkOiIgKyBpdGVyLT5maXJzdDsKKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1kIjsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBpbml0X2dlbmVyYXRvcigpIHsKKyAgICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgICAgc3RyaW5nIGRpciA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJkIik7CisgICAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7CisgICAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworICAgIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7CisgICAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOworICAgIH0KKyAgICBpZiAoIWRpci5lbXB0eSgpKSB7CisgICAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7CisgICAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgfQorCisgICAgcGFja2FnZV9kaXJfID0gc3ViZGlyICsgIi8iOworCisgICAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICAgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBwcm9ncmFtX25hbWVfICsgIl90eXBlcy5kIjsKKyAgICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKworICAgIC8vIFByaW50IGhlYWRlcgorICAgIGZfdHlwZXNfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8ICJtb2R1bGUgIiA8PCByZW5kZXJfcGFja2FnZSgqcHJvZ3JhbV8pIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgICA8PCAiX3R5cGVzOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgcHJpbnRfZGVmYXVsdF9pbXBvcnRzKGZfdHlwZXNfKTsKKworICAgIC8vIEluY2x1ZGUgdHlwZSBtb2R1bGVzIGZyb20gb3RoZXIgaW1wb3J0ZWQgcHJvZ3JhbXMuCisgICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgICBmX3R5cGVzXyA8PCAicHVibGljIGltcG9ydCAiIDw8IHJlbmRlcl9wYWNrYWdlKCooaW5jbHVkZXNbaV0pKSA8PCBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIl90eXBlczsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghaW5jbHVkZXMuZW1wdHkoKSkKKyAgICAgIGZfdHlwZXNfIDw8IGVuZGw7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCkgeworICAgIC8vIENsb3NlIG91dHB1dCBmaWxlCisgICAgZl90eXBlc18uY2xvc2UoKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICAgIGlmICghY29uc3RzLmVtcHR5KCkpIHsKKyAgICAgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfICsgcHJvZ3JhbV9uYW1lXyArICJfY29uc3RhbnRzLmQiOworICAgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0czsKKyAgICAgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAgICAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgIm1vZHVsZSAiIDw8IHJlbmRlcl9wYWNrYWdlKCpwcm9ncmFtXykgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICAgICAgPDwgIl9jb25zdGFudHM7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIHByaW50X2RlZmF1bHRfaW1wb3J0cyhmX2NvbnN0cyk7CisKKyAgICAgIGZfY29uc3RzIDw8ICJpbXBvcnQgIiA8PCByZW5kZXJfcGFja2FnZSgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgICAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICAgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgICAgdGhpcy0+ZW1pdF9kb2MoKmNfaXRlciwgZl9jb25zdHMpOworICAgICAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICBpbmRlbnQoZl9jb25zdHMpIDw8ICJpbW11dGFibGUoIiA8PCByZW5kZXJfdHlwZV9uYW1lKHR5cGUpIDw8ICIpICIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgZl9jb25zdHMgPDwgZW5kbCA8PCAic3RhdGljIHRoaXMoKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX2NvbnN0cyA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgaW5kZW50KGZfY29uc3RzKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICI7CisgICAgICAgIGlmICghaXNfaW1tdXRhYmxlX3R5cGUodHlwZSkpIHsKKyAgICAgICAgICBmX2NvbnN0cyA8PCAiY2FzdChpbW11dGFibGUoIiA8PCByZW5kZXJfdHlwZV9uYW1lKHR5cGUpIDw8ICIpKSAiOworICAgICAgICB9CisgICAgICAgIGZfY29uc3RzIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCAoKmNfaXRlciktPmdldF92YWx1ZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9jb25zdHMpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgICB0aGlzLT5lbWl0X2RvYyh0dHlwZWRlZiwgZl90eXBlc18pOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJhbGlhcyAiIDw8IHJlbmRlcl90eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8ICIgIgorICAgICAgICAgICAgIDw8IHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICAgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworCisgICAgdGhpcy0+ZW1pdF9kb2ModGVudW0sIGZfdHlwZXNfKTsKKyAgICBzdHJpbmcgZW51bV9uYW1lID0gdGVudW0tPmdldF9uYW1lKCk7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImVudW0gIiA8PCBlbnVtX25hbWUgPDwgIiB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgdGhpcy0+ZW1pdF9kb2MoKmNfaXRlciwgZl90eXBlc18pOworICAgICAgaW5kZW50KGZfdHlwZXNfKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBmX3R5cGVzXyA8PCAiID0gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpIDw8ICIsIjsKKyAgICB9CisKKyAgICBmX3R5cGVzXyA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfdHlwZXNfKSA8PCAifSIgPDwgZW5kbDsKKworICAgIGZfdHlwZXNfIDw8IGVuZGw7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgICAgcHJpbnRfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGZhbHNlKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgICAgcHJpbnRfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHR4Y2VwdGlvbiwgdHJ1ZSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgICAgc3RyaW5nIHN2Y19uYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7CisKKyAgICAvLyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGZpbGUgaW5jbHVkZXMKKyAgICBzdHJpbmcgZl9zZXJ2aWNlbmFtZSA9IHBhY2thZ2VfZGlyXyArIHN2Y19uYW1lICsgIi5kIjsKKyAgICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZTsKKyAgICBmX3NlcnZpY2Uub3BlbihmX3NlcnZpY2VuYW1lLmNfc3RyKCkpOworICAgIGZfc2VydmljZSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCAibW9kdWxlICIgPDwgcmVuZGVyX3BhY2thZ2UoKnByb2dyYW1fKSA8PCBzdmNfbmFtZSA8PCAiOyIKKyAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgICAgcHJpbnRfZGVmYXVsdF9pbXBvcnRzKGZfc2VydmljZSk7CisKKyAgICBmX3NlcnZpY2UgPDwgImltcG9ydCAiIDw8IHJlbmRlcl9wYWNrYWdlKCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXM7IiA8PCBlbmRsOworCisgICAgdF9zZXJ2aWNlKiBleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgICBpZiAoZXh0ZW5kc19zZXJ2aWNlICE9IE5VTEwpIHsKKyAgICAgIGZfc2VydmljZSA8PCAiaW1wb3J0ICIgPDwgcmVuZGVyX3BhY2thZ2UoKihleHRlbmRzX3NlcnZpY2UtPmdldF9wcm9ncmFtKCkpKQorICAgICAgICAgICAgICAgIDw8IGV4dGVuZHNfc2VydmljZS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3NlcnZpY2UgPDwgZW5kbDsKKworICAgIHN0cmluZyBleHRlbmRzID0gIiI7CisgICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICAgIGV4dGVuZHMgPSAiIDogIiArIHJlbmRlcl90eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIH0KKworICAgIHRoaXMtPmVtaXRfZG9jKHRzZXJ2aWNlLCBmX3NlcnZpY2UpOworICAgIGZfc2VydmljZSA8PCBpbmRlbnQoKSA8PCAiaW50ZXJmYWNlICIgPDwgc3ZjX25hbWUgPDwgZXh0ZW5kcyA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICAvLyBDb2xsZWN0IGFsbCB0aGUgZXhjZXB0aW9uIHR5cGVzIHNlcnZpY2UgbWV0aG9kcyBjYW4gdGhyb3cgc28gd2UgY2FuCisgICAgLy8gZW1pdCB0aGUgbmVjZXNzYXJ5IGFsaWFzZXMgbGF0ZXIuCisgICAgc2V0PHRfdHlwZSo+IGV4Y2VwdGlvbl90eXBlczsKKworICAgIC8vIFByaW50IHRoZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlcjsKKyAgICBmb3IgKGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZm5faXRlcikgeworICAgICAgdGhpcy0+ZW1pdF9kb2MoKmZuX2l0ZXIsIGZfc2VydmljZSk7CisgICAgICBmX3NlcnZpY2UgPDwgaW5kZW50KCk7CisgICAgICBwcmludF9mdW5jdGlvbl9zaWduYXR1cmUoZl9zZXJ2aWNlLCAqZm5faXRlcik7CisgICAgICBmX3NlcnZpY2UgPDwgIjsiIDw8IGVuZGw7CisKKyAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGV4Y2VwdGlvbnMgPSAoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBleF9pdGVyOworICAgICAgZm9yIChleF9pdGVyID0gZXhjZXB0aW9ucy5iZWdpbigpOyBleF9pdGVyICE9IGV4Y2VwdGlvbnMuZW5kKCk7ICsrZXhfaXRlcikgeworICAgICAgICBleGNlcHRpb25fdHlwZXMuaW5zZXJ0KCgqZXhfaXRlciktPmdldF90eXBlKCkpOworICAgICAgfQorICAgIH0KKworICAgIC8vIEFsaWFzIHRoZSBleGNlcHRpb24gdHlwZXMgaW50byB0aGUgY3VycmVudCBzY29wZS4KKyAgICBpZiAoIWV4Y2VwdGlvbl90eXBlcy5lbXB0eSgpKQorICAgICAgZl9zZXJ2aWNlIDw8IGVuZGw7CisgICAgc2V0PHRfdHlwZSo+Ojpjb25zdF9pdGVyYXRvciBldF9pdGVyOworICAgIGZvciAoZXRfaXRlciA9IGV4Y2VwdGlvbl90eXBlcy5iZWdpbigpOyBldF9pdGVyICE9IGV4Y2VwdGlvbl90eXBlcy5lbmQoKTsgKytldF9pdGVyKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlKSA8PCAiYWxpYXMgIiA8PCByZW5kZXJfcGFja2FnZSgqKCpldF9pdGVyKS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqZXRfaXRlciktPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkgPDwgIl90eXBlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIiA8PCAoKmV0X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCAoKmV0X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0aGUgbWV0aG9kIG1ldGFkYXRhLgorICAgIG9zdHJpbmdzdHJlYW0gbWV0YTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZm5faXRlcikgeworICAgICAgaWYgKCgqZm5faXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKQorICAgICAgICAgICYmICgqZm5faXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpICYmICEoKmZuX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBtZXRhIDw8ICIsIjsKKyAgICAgIH0KKworICAgICAgbWV0YSA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJUTWV0aG9kTWV0YShgIiA8PCAoKmZuX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJgLCAiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChtZXRhKSA8PCAiWyI7CisKKyAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgcGFyYW1zID0gKCpmbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICAgIGZvciAocF9pdGVyID0gcGFyYW1zLmJlZ2luKCk7IHBfaXRlciAhPSBwYXJhbXMuZW5kKCk7ICsrcF9pdGVyKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbWV0YSA8PCAiLCAiOworICAgICAgICB9CisKKyAgICAgICAgbWV0YSA8PCAiVFBhcmFtTWV0YShgIiA8PCAoKnBfaXRlciktPmdldF9uYW1lKCkgPDwgImAsICIgPDwgKCpwX2l0ZXIpLT5nZXRfa2V5KCk7CisKKyAgICAgICAgdF9jb25zdF92YWx1ZSogY3YgPSAoKnBfaXRlciktPmdldF92YWx1ZSgpOworICAgICAgICBpZiAoY3YgIT0gTlVMTCkgeworICAgICAgICAgIG1ldGEgPDwgIiwgcXsiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSgoKnBfaXRlciktPmdldF90eXBlKCksIGN2KSA8PCAifSI7CisgICAgICAgIH0KKyAgICAgICAgbWV0YSA8PCAiKSI7CisgICAgICB9CisKKyAgICAgIG1ldGEgPDwgIl0iOworCisgICAgICBpZiAoISgqZm5faXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpIHx8ICgqZm5faXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIG1ldGEgPDwgIiwiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlsiOworCisgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBleGNlcHRpb25zID0gKCpmbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBleF9pdGVyOworICAgICAgICBmb3IgKGV4X2l0ZXIgPSBleGNlcHRpb25zLmJlZ2luKCk7IGV4X2l0ZXIgIT0gZXhjZXB0aW9ucy5lbmQoKTsgKytleF9pdGVyKSB7CisgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZXRhIDw8ICIsICI7CisgICAgICAgICAgfQorCisgICAgICAgICAgbWV0YSA8PCAiVEV4Y2VwdGlvbk1ldGEoYCIgPDwgKCpleF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiYCwgIiA8PCAoKmV4X2l0ZXIpLT5nZXRfa2V5KCkKKyAgICAgICAgICAgICAgIDw8ICIsIGAiIDw8ICgqZXhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgImApIjsKKyAgICAgICAgfQorCisgICAgICAgIG1ldGEgPDwgIl0iOworICAgICAgfQorCisgICAgICBpZiAoKCpmbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgbWV0YSA8PCAiLCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiVE1ldGhvZFR5cGUuT05FV0FZIjsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIG1ldGEgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiKSI7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisKKyAgICBzdHJpbmcgbWV0YV9zdHIobWV0YS5zdHIoKSk7CisgICAgaWYgKCFtZXRhX3N0ci5lbXB0eSgpKSB7CisgICAgICBmX3NlcnZpY2UgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZW51bSBtZXRob2RNZXRhID0gWyIgPDwgbWV0YV9zdHIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiXTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2UpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgLy8gU2VydmVyIHNrZWxldG9uIGdlbmVyYXRpb24uCisgICAgc3RyaW5nIGZfc2tlbGV0b25uYW1lID0gcGFja2FnZV9kaXJfICsgc3ZjX25hbWUgKyAiX3NlcnZlci5za2VsZXRvbi5kIjsKKyAgICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2tlbGV0b247CisgICAgZl9za2VsZXRvbi5vcGVuKGZfc2tlbGV0b25uYW1lLmNfc3RyKCkpOworICAgIHByaW50X3NlcnZlcl9za2VsZXRvbihmX3NrZWxldG9uLCB0c2VydmljZSk7CisgICAgZl9za2VsZXRvbi5jbG9zZSgpOworICB9CisKKyAgdm9pZCBlbWl0X2RvYyh0X2RvYyAqZG9jLCBzdGQ6Om9zdHJlYW0mIG91dCkgeworICAgIGlmICghZG9jLT5oYXNfZG9jKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgc3RkOjplbmRsOworICAgIGluZGVudF91cCgpOworICAgIC8vIE5vIGVuZGwgLS0gY29tbWVudHMgcmVsaWFibHkgaGF2ZSBhIG5ld2xpbmUgYXQgdGhlIGVuZC4KKyAgICAvLyBUaGlzIGlzIHRydWUgZXZlbiBmb3Igc3R1ZmYgbGlrZToKKyAgICAvLyAgICAgLyoqIG1ldGhvZCBpbmZvcyAqLyB2b2lkIGZvbygvKiogaHVoPyovIDE6IGk2NCBzdHVmZikKKyAgICBpbmRlbnQob3V0KSA8PCBkb2MtPmdldF9kb2MoKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIqLyIgPDwgc3RkOjplbmRsOworICB9CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBXcml0ZXMgYSBzZXJ2ZXIgc2tlbGV0b24gZm9yIHRoZSBwYXNzZWQgc2VydmljZSB0byBvdXQuCisgICAqLworICB2b2lkIHByaW50X3NlcnZlcl9za2VsZXRvbihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgICBzdHJpbmcgc3ZjX25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKTsKKworICAgIG91dCA8PCAiLyoiIDw8IGVuZGwKKyAgICAgICAgPDwgIiAqIFRoaXMgYXV0by1nZW5lcmF0ZWQgc2tlbGV0b24gZmlsZSBpbGx1c3RyYXRlcyBob3cgdG8gYnVpbGQgYSBzZXJ2ZXIuIElmIHlvdSIgPDwgZW5kbAorICAgICAgICA8PCAiICogaW50ZW5kIHRvIGN1c3RvbWl6ZSBpdCwgeW91IHNob3VsZCBlZGl0IGEgY29weSB3aXRoIGFub3RoZXIgZmlsZSBuYW1lIHRvICIgPDwgZW5kbAorICAgICAgICA8PCAiICogYXZvaWQgb3ZlcndyaXRpbmcgaXQgd2hlbiBydW5uaW5nIHRoZSBnZW5lcmF0b3IgYWdhaW4uIiA8PCBlbmRsIDw8ICIgKi8iIDw8IGVuZGwKKyAgICAgICAgPDwgIm1vZHVsZSAiIDw8IHJlbmRlcl9wYWNrYWdlKCp0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc3ZjX25hbWUgPDwgIl9zZXJ2ZXI7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwgPDwgImltcG9ydCBzdGQuc3RkaW87IiA8PCBlbmRsIDw8ICJpbXBvcnQgdGhyaWZ0LmNvZGVnZW4ucHJvY2Vzc29yOyIgPDwgZW5kbAorICAgICAgICA8PCAiaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7IiA8PCBlbmRsIDw8ICJpbXBvcnQgdGhyaWZ0LnNlcnZlci5zaW1wbGU7IiA8PCBlbmRsCisgICAgICAgIDw8ICJpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuc29ja2V0OyIgPDwgZW5kbCA8PCAiaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYnVmZmVyZWQ7IgorICAgICAgICA8PCBlbmRsIDw8ICJpbXBvcnQgdGhyaWZ0LnV0aWwuaGFzaHNldDsiIDw8IGVuZGwgPDwgZW5kbCA8PCAiaW1wb3J0ICIKKyAgICAgICAgPDwgcmVuZGVyX3BhY2thZ2UoKnRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzdmNfbmFtZSA8PCAiOyIgPDwgZW5kbCA8PCAiaW1wb3J0ICIKKyAgICAgICAgPDwgcmVuZGVyX3BhY2thZ2UoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwgIl90eXBlczsiIDw8IGVuZGwgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgIDw8ICJjbGFzcyAiIDw8IHN2Y19uYW1lIDw8ICJIYW5kbGVyIDogIiA8PCBzdmNfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMoKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIC8vIFlvdXIgaW5pdGlhbGl6YXRpb24gZ29lcyBoZXJlLiIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpOworICAgICAgcHJpbnRfZnVuY3Rpb25fc2lnbmF0dXJlKG91dCwgKmZfaXRlcik7CisgICAgICBvdXQgPDwgIiB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBZb3VyIGltcGxlbWVudGF0aW9uIGdvZXMgaGVyZS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIndyaXRlbG4oXCIiCisgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgY2FsbGVkXCIpOyIgPDwgZW5kbDsKKworCSAgdF90eXBlKiBydCA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKwkgIGlmICghcnQtPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHR5cGVvZihyZXR1cm4pLmluaXQ7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2b2lkIG1haW4oKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXV0byBwcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSEoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgImF1dG8gcHJvY2Vzc29yID0gbmV3IFRTZXJ2aWNlUHJvY2Vzc29yISIgPDwgc3ZjX25hbWUgPDwgIihuZXcgIiA8PCBzdmNfbmFtZQorICAgICAgICA8PCAiSGFuZGxlcik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJhdXRvIHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0KDkwOTApOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYXV0byB0cmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhdXRvIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKCIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICBwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgInNlcnZlci5zZXJ2ZSgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIC8qKgorICAgKiBXcml0ZXMgdGhlIGRlZmluaXRpb24gb2YgYSBzdHJ1Y3Qgb3IgYW4gZXhjZXB0aW9uIHR5cGUgdG8gb3V0LgorICAgKi8KKyAgdm9pZCBwcmludF9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgICAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgICAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIDogVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAic3RydWN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF91cCgpOworCisgICAgLy8gRGVjbGFyZSBhbGwgZmllbGRzLgorICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCByZW5kZXJfdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpCisgICAgICBpbmRlbnQob3V0KSA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJtaXhpbiBUU3RydWN0SGVscGVycyEoIjsKKworICAgIGlmICghbWVtYmVycy5lbXB0eSgpKSB7CisgICAgICAvLyBJZiB0aGVyZSBhcmUgYW55IGZpZWxkcywgY29uc3RydWN0IHRoZSBURmllbGRNZXRhIGFycmF5IHRvIHBhc3MgdG8KKyAgICAgIC8vIFRTdHJ1Y3RIZWxwZXJzLiBXZSBjYW4ndCBqdXN0IHBhc3MgYW4gZW1wdHkgYXJyYXkgaWYgbm90IGJlY2F1c2UgW10KKyAgICAgIC8vIGRvZXNuJ3QgcGFzcyB0aGUgVEZpZWxkTWV0YVtdIGNvbnN0cmFpbnQuCisgICAgICBvdXQgPDwgIlsiOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiLCI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIlRGaWVsZE1ldGEoYCIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJgLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpOworCisgICAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICAgICAgdF9maWVsZDo6ZV9yZXEgcmVxID0gKCptX2l0ZXIpLT5nZXRfcmVxKCk7CisgICAgICAgIG91dCA8PCAiLCAiIDw8IHJlbmRlcl9yZXEocmVxKTsKKyAgICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKKyAgICAgICAgICBvdXQgPDwgIiwgcXsiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSgoKm1faXRlciktPmdldF90eXBlKCksIGN2KSA8PCAifSI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8ICIpIjsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJdIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLyoqCisgICAqIFByaW50cyB0aGUgRCBmdW5jdGlvbiBzaWduYXR1cmUgKGluY2x1ZGluZyByZXR1cm4gdHlwZSkgZm9yIHRoZSBnaXZlbgorICAgKiBtZXRob2QuCisgICAqLworICB2b2lkIHByaW50X2Z1bmN0aW9uX3NpZ25hdHVyZShvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIGZuKSB7CisgICAgb3V0IDw8IHJlbmRlcl90eXBlX25hbWUoZm4tPmdldF9yZXR1cm50eXBlKCkpIDw8ICIgIiA8PCBmbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBmbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgICBvdXQgPDwgcmVuZGVyX3R5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCksIHRydWUpIDw8ICIgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorCisgICAgb3V0IDw8ICIpIjsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBEIHJlcHJlc2VudGF0aW9uIG9mIHZhbHVlLiBUaGUgcmVzdWx0IGlzIGd1YXJhbnRlZWQgdG8gYmUgYQorICAgKiBzaW5nbGUgZXhwcmVzc2lvbjsgZm9yIGNvbXBsZXggdHlwZXMsIGltbWVkaWF0ZWx5IGNhbGxlZCBkZWxlZ2F0ZQorICAgKiBsaXRlcmFscyBhcmUgdXNlZCB0byBhY2hpZXZlIHRoaXMuCisgICAqLworICBzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgICAvLyBSZXNvbHZlIGFueSB0eXBlZGVmcy4KKyAgICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICAgIG9zdHJpbmdzdHJlYW0gb3V0OworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgImNhc3QoIiA8PCByZW5kZXJfdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJDb21waWxlciBlcnJvcjogTm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgImNhc3QoIiA8PCByZW5kZXJfdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl90eXBlX25hbWUodHlwZSkgPDwgIiB2OyIgPDwgZW5kbDsKKyAgICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ2ID0gIiA8PCAodHlwZS0+aXNfeGNlcHRpb24oKSA/ICJuZXcgIiA6ICIiKSA8PCByZW5kZXJfdHlwZV9uYW1lKHR5cGUpCisgICAgICAgICAgICAgICAgICAgIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICAgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICAgICAgdGhyb3cgIlR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIgorICAgICAgICAgICAgICAgICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgICAgIH0KKyAgICAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidi5zZXQhYCIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICJgKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgICAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgICAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICAgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInZbIjsKKyAgICAgICAgICBpZiAoIWlzX2ltbXV0YWJsZV90eXBlKGt0eXBlKSkgeworICAgICAgICAgICAgb3V0IDw8ICJjYXN0KGltbXV0YWJsZSgiIDw8IHJlbmRlcl90eXBlX25hbWUoa3R5cGUpIDw8ICIpKSI7CisgICAgICAgICAgfQorICAgICAgICAgIG91dCA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICAgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ2IH49ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICAgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ2IH49ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAiQ29tcGlsZXIgZXJyb3I6IEludmFsaWQgdHlwZSBpbiByZW5kZXJfY29uc3RfdmFsdWU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB2OyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9KCkiOworICAgIH0KKworICAgIHJldHVybiBvdXQuc3RyKCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgRCBwYWNrYWdlIHRvIHdoaWNoIG1vZHVsZXMgZm9yIHByb2dyYW0gYXJlIHdyaXR0ZW4gKHdpdGggYQorICAgKiB0cmFpbGluZyBkb3QsIGlmIG5vdCBlbXB0eSkuCisgICAqLworICBzdHJpbmcgcmVuZGVyX3BhY2thZ2UoY29uc3QgdF9wcm9ncmFtJiBwcm9ncmFtKSBjb25zdCB7CisgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLmdldF9uYW1lc3BhY2UoImQiKTsKKyAgICBpZiAocGFja2FnZS5zaXplKCkgPT0gMCkKKyAgICAgIHJldHVybiAiIjsKKyAgICByZXR1cm4gcGFja2FnZSArICIuIjsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBEIHJlcGVzZW50YXRpb24gb2YgdHR5cGUuCisgICAqCisgICAqIElmIGlzQXJnIGlzIHRydWUsIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSB0eXBlIHdpbGwgYmUgcmV0dXJuZWQgZm9yCisgICAqIHN0cnVjdHMuCisgICAqLworICBzdHJpbmcgcmVuZGVyX3R5cGVfbmFtZShjb25zdCB0X3R5cGUqIHR0eXBlLCBib29sIGlzQXJnID0gZmFsc2UpIGNvbnN0IHsKKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICByZXR1cm4gInZvaWQiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHJldHVybiAic3RyaW5nIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmV0dXJuICJib29sIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIHJldHVybiAiYnl0ZSI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgcmV0dXJuICJzaG9ydCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgcmV0dXJuICJpbnQiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJldHVybiAibG9uZyI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmV0dXJuICJkb3VibGUiOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgIkNvbXBpbGVyIGVycm9yOiBObyBEIHR5cGUgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0KKworICAgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHRfY29udGFpbmVyKiB0Y29udGFpbmVyID0gKHRfY29udGFpbmVyKil0dHlwZTsKKyAgICAgIGlmICh0Y29udGFpbmVyLT5oYXNfY3BwX25hbWUoKSkgeworICAgICAgICByZXR1cm4gdGNvbnRhaW5lci0+Z2V0X2NwcF9uYW1lKCk7CisgICAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgICAgIHRfdHlwZSoga3R5cGUgPSB0bWFwLT5nZXRfa2V5X3R5cGUoKTsKKworICAgICAgICBzdHJpbmcgbmFtZSA9IHJlbmRlcl90eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCkpICsgIlsiOworICAgICAgICBpZiAoIWlzX2ltbXV0YWJsZV90eXBlKGt0eXBlKSkgeworICAgICAgICAgIG5hbWUgKz0gImltbXV0YWJsZSgiOworICAgICAgICB9CisgICAgICAgIG5hbWUgKz0gcmVuZGVyX3R5cGVfbmFtZShrdHlwZSk7CisgICAgICAgIGlmICghaXNfaW1tdXRhYmxlX3R5cGUoa3R5cGUpKSB7CisgICAgICAgICAgbmFtZSArPSAiKSI7CisgICAgICAgIH0KKyAgICAgICAgbmFtZSArPSAiXSI7CisgICAgICAgIHJldHVybiBuYW1lOworICAgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgICAgICByZXR1cm4gIkhhc2hTZXQhKCIgKyByZW5kZXJfdHlwZV9uYW1lKHRzZXQtPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7CisgICAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgICAgICByZXR1cm4gcmVuZGVyX3R5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKSArICJbXSI7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSAmJiBpc0FyZykgeworICAgICAgcmV0dXJuICJyZWYgY29uc3QoIiArIHR0eXBlLT5nZXRfbmFtZSgpICsgIikiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIEQgVFJlcSBlbnVtIG1lbWJlciBjb3JyZXNwb25kaW5nIHRvIHJlcS4KKyAgICovCisgIHN0cmluZyByZW5kZXJfcmVxKHRfZmllbGQ6OmVfcmVxIHJlcSkgY29uc3QgeworICAgIHN3aXRjaCAocmVxKSB7CisgICAgY2FzZSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUOgorICAgICAgcmV0dXJuICJUUmVxLk9QVF9JTl9SRVFfT1VUIjsKKyAgICBjYXNlIHRfZmllbGQ6OlRfT1BUSU9OQUw6CisgICAgICByZXR1cm4gIlRSZXEuT1BUSU9OQUwiOworICAgIGNhc2UgdF9maWVsZDo6VF9SRVFVSVJFRDoKKyAgICAgIHJldHVybiAiVFJlcS5SRVFVSVJFRCI7CisgICAgZGVmYXVsdDogeworICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICBzcyA8PCAiQ29tcGlsZXIgZXJyb3I6IEludmFsaWQgcmVxdWlyZW1lbnQgbGV2ZWwgIiA8PCByZXE7CisgICAgICB0aHJvdyBzcy5zdHIoKTsKKyAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFdyaXRlcyB0aGUgZGVmYXVsdCBsaXN0IG9mIGltcG9ydHMgKHdoaWNoIGFyZSB3cml0dGVuIHRvIGV2ZXJ5IGdlbmVyYXRlZAorICAgKiBtb2R1bGUpIHRvIGYuCisgICAqLworICB2b2lkIHByaW50X2RlZmF1bHRfaW1wb3J0cyhvc3RyZWFtJiBvdXQpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaW1wb3J0IHRocmlmdC5iYXNlOyIgPDwgZW5kbCA8PCAiaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmJhc2U7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgImltcG9ydCB0aHJpZnQudXRpbC5oYXNoc2V0OyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgd2hldGhlciB0eXBlIGlzIMK7aW50cmluc2ljYWxseSBpbW11dGFibGXCqywgaW4gdGhlIHNlbnNlIHRoYXQKKyAgICogYSB2YWx1ZSBvZiB0aGF0IHR5cGUgaXMgaW1wbGljaXRseSBjYXN0YWJsZSB0byBpbW11dGFibGUodHlwZSksIGFuZCBpdCBpcworICAgKiBhbGxvd2VkIGZvciBBQSBrZXlzIHdpdGhvdXQgYW4gaW1tdXRhYmxlKCkgcXVhbGlmaWVyLgorICAgKi8KKyAgYm9vbCBpc19pbW11dGFibGVfdHlwZSh0X3R5cGUqIHR5cGUpIGNvbnN0IHsKKyAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgICByZXR1cm4gdHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR0eXBlLT5pc19lbnVtKCk7CisgIH0KKworICAvKgorICAgKiBGaWxlIHN0cmVhbXMsIHN0b3JlZCBoZXJlIHRvIGF2b2lkIHBhc3NpbmcgdGhlbSBhcyBwYXJhbWV0ZXJzIHRvIGV2ZXJ5CisgICAqIGZ1bmN0aW9uLgorICAgKi8KKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2hlYWRlcl87CisKKyAgc3RyaW5nIHBhY2thZ2VfZGlyXzsKK307CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoZCwgIkQiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZGFydF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RhcnRfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNGMzMzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RhcnRfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMjUxNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y2N0eXBlPgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwyID0gIlxuXG4iOworCisvKioKKyAqIFVzZSB0aGUgY3VycmVudCBUaHJpZnQgdmVyc2lvbiBmb3Igc3RhdGljIGxpYnJhcmllcy4gIFdoZW4gcmVsZWFzaW5nLCB1cGRhdGUKKyAqIHRoZSB2ZXJzaW9uIGluIHRoZXNlIGZpbGVzLgorICogLSBsaWIvZGFydC9wdWJzcGVjLnlhbWwKKyAqIC0gdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L3B1YnNwZWMueWFtbAorICogLSB0dXRvcmlhbC9kYXJ0L2NsaWVudC9wdWJzcGVjLnlhbWwKKyAqIC0gdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWwKKyAqIC0gdHV0b3JpYWwvZGFydC9zZXJ2ZXIvcHVic3BlYy55YW1sCisgKiBTZWUgaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZy9kb2NzL2NvbW1pdHRlcnMvSG93VG9WZXJzaW9uCisgKi8KK3N0YXRpYyBjb25zdCBzdHJpbmcgZGFydF90aHJpZnRfdmVyc2lvbiA9IFRIUklGVF9WRVJTSU9OOworCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworc3RyaW5nIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzdHJpbmcgbmFtZSk7CisKKy8qKgorICogRGFydCBjb2RlIGdlbmVyYXRvcgorICoKKyAqLworY2xhc3MgdF9kYXJ0X2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2RhcnRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGxpYnJhcnlfbmFtZV8gPSAiIjsKKyAgICBsaWJyYXJ5X3ByZWZpeF8gPSAiIjsKKyAgICBwYWNrYWdlX3ByZWZpeF8gPSAiIjsKKyAgICBwdWJzcGVjX2xpYl8gPSAiIjsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJsaWJyYXJ5X25hbWUiKSA9PSAwKSB7CisgICAgICAgIGxpYnJhcnlfbmFtZV8gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibGlicmFyeV9wcmVmaXgiKSA9PSAwKSB7CisgICAgICAgIGxpYnJhcnlfcHJlZml4XyA9IChpdGVyLT5zZWNvbmQpICsgIi4iOworICAgICAgICBwYWNrYWdlX3ByZWZpeF8gPSByZXBsYWNlX2FsbChsaWJyYXJ5X3ByZWZpeF8sICIuIiwgIi8iKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicHVic3BlY19saWIiKSA9PSAwKSB7CisgICAgICAgIHB1YnNwZWNfbGliXyA9IChpdGVyLT5zZWNvbmQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGRhcnQ6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWRhcnQiOworICB9CisKKyAgdm9pZCBzY29wZV91cChzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgcHJlZml4PSIgIikgeworICAgIG91dCA8PCBwcmVmaXggPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICB2b2lkIHNjb3BlX2Rvd24oc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIHBvc3RmaXg9ZW5kbCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IHBvc3RmaXg7CisgIH0KKworICBzdHJpbmcgcmVwbGFjZV9hbGwoc3RyaW5nIGNvbnRlbnRzLCBzdHJpbmcgc2VhcmNoLCBzdHJpbmcgcmVwbCkgeworICAgIHN0cmluZyBzdHIoY29udGVudHMpOworCisgICAgc2l6ZV90IHNsZW4gPSBzZWFyY2gubGVuZ3RoKCk7CisgICAgc2l6ZV90IHJsZW4gPSByZXBsLmxlbmd0aCgpOworICAgIHNpemVfdCBpbmNyID0gKHJsZW4gPiAwKSA/IHJsZW4gOiAxOworCisgICAgaWYgKHNsZW4gPiAwKSB7CisgICAgICBzaXplX3QgZm91bmQgPSBzdHIuZmluZChzZWFyY2gpOworICAgICAgd2hpbGUgKChmb3VuZCAhPSBzdHJpbmc6Om5wb3MpICYmIChmb3VuZCA8IHN0ci5sZW5ndGgoKSkpIHsKKyAgICAgICAgc3RyLnJlcGxhY2UoZm91bmQsIHNsZW4sIHJlcGwpOworICAgICAgICBmb3VuZCA9IHN0ci5maW5kKHNlYXJjaCwgZm91bmQgKyBpbmNyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RyOworICB9CisKKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgdm9pZCBleHBvcnRfY2xhc3NfdG9fbGlicmFyeShzdHJpbmcgZmlsZV9uYW1lLCBzdHJpbmcgY2xhc3NfbmFtZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X2xpYnJhcnkoKTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3B1YnNwZWMoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfZGFydF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBleHBvcnRfZmlsZV9uYW1lID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2RhcnRfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2RhcnRfdmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZGFydF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2RhcnRfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2RhcnRfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIGdldF9kYXJ0X3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X2JlYW5fYm9pbGVycGxhdGUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgaW5pdF92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQpOworICBzdGQ6OnN0cmluZyBnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9tZW1iZXJfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2FyZ3NfY2xhc3NfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X3Jlc3VsdF9jbGFzc19uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZXRfZmlsZV9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZXRfY29uc3RhbnRzX2NsYXNzX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGQpOworICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX2RhcnRfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIGZpbmRfbGlicmFyeV9uYW1lKHRfcHJvZ3JhbSogcHJvZ3JhbSk7CisgIHN0ZDo6c3RyaW5nIGRhcnRfbGlicmFyeShzdHJpbmcgZmlsZV9uYW1lKTsKKyAgc3RkOjpzdHJpbmcgc2VydmljZV9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIGRhcnRfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X3R0eXBlX2NsYXNzX25hbWUodF90eXBlKiB0dHlwZSk7CisKKyAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKKyAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworCisgICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkKKyAgICAgICAgICAgfHwgdHR5cGUtPmlzX3N0cmluZygpOworICB9CisKKyAgdmVjdG9yPHN0ZDo6c3RyaW5nPiBzcGxpdChjb25zdCBzdHJpbmcmIHMsIGNoYXIgZGVsaW0pIHsKKyAgICB2ZWN0b3I8c3RkOjpzdHJpbmc+IGVsZW1zOworICAgIHN0cmluZ3N0cmVhbSBzcyhzKTsKKyAgICBzdHJpbmcgaXRlbTsKKyAgICB3aGlsZSAoZ2V0bGluZShzcywgaXRlbSwgZGVsaW0pKSB7CisgICAgICBlbGVtcy5wdXNoX2JhY2soaXRlbSk7CisgICAgfQorICAgIHJldHVybiBlbGVtczsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGNvbnN0YW50X25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisKK3ByaXZhdGU6CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKworICBzdGQ6OnN0cmluZyBsaWJyYXJ5X25hbWVfOworICBzdGQ6OnN0cmluZyBsaWJyYXJ5X3ByZWZpeF87CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfcHJlZml4XzsKKyAgc3RkOjpzdHJpbmcgcHVic3BlY19saWJfOworCisgIHN0ZDo6c3RyaW5nIGJhc2VfZGlyXzsKKyAgc3RkOjpzdHJpbmcgc3JjX2Rpcl87CisgIHN0ZDo6c3RyaW5nIGxpYnJhcnlfZXhwb3J0c187Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIGlmIChsaWJyYXJ5X25hbWVfLmVtcHR5KCkpIHsKKyAgICBsaWJyYXJ5X25hbWVfID0gZmluZF9saWJyYXJ5X25hbWUocHJvZ3JhbV8pOworICB9CisKKyAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCkgKyAiLyIgKyBsaWJyYXJ5X25hbWVfOworICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgIGJhc2VfZGlyXyA9IHN1YmRpcjsKKworICBpZiAobGlicmFyeV9wcmVmaXhfLmVtcHR5KCkpIHsKKyAgICBzdWJkaXIgKz0gIi9saWIiOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICBzdWJkaXIgKz0gIi9zcmMiOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICBzcmNfZGlyXyA9IHN1YmRpcjsKKyAgfSBlbHNlIHsKKyAgICBzcmNfZGlyXyA9IGJhc2VfZGlyXzsKKyAgfQorfQorCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6ZmluZF9saWJyYXJ5X25hbWUodF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgIHN0cmluZyBuYW1lID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiZGFydCIpOworICBpZiAobmFtZS5lbXB0eSgpKSB7CisgICAgbmFtZSA9IHByb2dyYW0tPmdldF9uYW1lKCk7CisgIH0KKyAgbmFtZSA9IHJlcGxhY2VfYWxsKG5hbWUsICIuIiwgIl8iKTsKKyAgbmFtZSA9IHJlcGxhY2VfYWxsKG5hbWUsICItIiwgIl8iKTsKKyAgcmV0dXJuIG5hbWU7Cit9CisKKy8qKgorICogVGhlIERhcnQgbGlicmFyeQorICoKKyAqIEByZXR1cm4gU3RyaW5nIG9mIHRoZSBsaWJyYXJ5LCBlLmcuICJsaWJyYXJ5IG15c2VydmljZTsiCisgKi8KK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpkYXJ0X2xpYnJhcnkoc3RyaW5nIGZpbGVfbmFtZSkgeworICBzdHJpbmcgb3V0ID0gImxpYnJhcnkgIiArIGxpYnJhcnlfcHJlZml4XyArIGxpYnJhcnlfbmFtZV87CisgIGlmICghZmlsZV9uYW1lLmVtcHR5KCkpIHsKKyAgICBpZiAobGlicmFyeV9wcmVmaXhfLmVtcHR5KCkpIHsKKyAgICAgIG91dCArPSAiLnNyYy4iICsgZmlsZV9uYW1lOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgKz0gIi4iICsgZmlsZV9uYW1lOworICAgIH0KKyAgfQorICByZXR1cm4gb3V0ICsgIjtcbiI7Cit9CisKKy8qKgorICogUHJpbnRzIGltcG9ydHMgZm9yIHNlcnZpY2VzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgZm9yIHNlcnZpY2VzCisgKi8KK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpzZXJ2aWNlX2ltcG9ydHMoKSB7CisgIHJldHVybiAiaW1wb3J0ICdkYXJ0OmFzeW5jJzsiICsgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgZGFydCBpbXBvcnRzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aHJpZnQKKyAqLworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmRhcnRfdGhyaWZ0X2ltcG9ydHMoKSB7CisgIHN0cmluZyBpbXBvcnRzID0gImltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsiICsgZW5kbCArCisgICAgICAgICAgICAgICAgICAgImltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOyIgKyBlbmRsOworCisgIC8vIGFkZCBpbXBvcnQgZm9yIHRoaXMgbGlicmFyeQorICBpZiAocGFja2FnZV9wcmVmaXhfLmVtcHR5KCkpIHsKKyAgICBpbXBvcnRzICs9ICJpbXBvcnQgJ3BhY2thZ2U6IiArIGxpYnJhcnlfbmFtZV8gKyAiLyIgKyBsaWJyYXJ5X25hbWVfICsgIi5kYXJ0JzsiICsgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbXBvcnRzICs9ICJpbXBvcnQgJ3BhY2thZ2U6IiArIHBhY2thZ2VfcHJlZml4XyArIGxpYnJhcnlfbmFtZV8gKyAiLmRhcnQnOyIgKyBlbmRsOworICB9CisKKyAgLy8gYWRkIGltcG9ydHMgZm9yIGluY2x1ZGVkIHRocmlmdCBmaWxlcworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgc3RyaW5nIGluY2x1ZGVfbmFtZSA9IGZpbmRfbGlicmFyeV9uYW1lKGluY2x1ZGVzW2ldKTsKKyAgICBzdHJpbmcgbmFtZWRfaW1wb3J0ID0gInRfIiArIGluY2x1ZGVfbmFtZTsKKyAgICBpZiAocGFja2FnZV9wcmVmaXhfLmVtcHR5KCkpIHsKKyAgICAgIGltcG9ydHMgKz0gImltcG9ydCAncGFja2FnZToiICsgaW5jbHVkZV9uYW1lICsgIi8iICsgaW5jbHVkZV9uYW1lICsgIi5kYXJ0JyBhcyAiICsgbmFtZWRfaW1wb3J0ICsgIjsiICsgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW1wb3J0cyArPSAiaW1wb3J0ICdwYWNrYWdlOiIgKyBwYWNrYWdlX3ByZWZpeF8gKyBpbmNsdWRlX25hbWUgKyAiLmRhcnQnIGFzICIgKyBuYW1lZF9pbXBvcnQgKyAiOyIgKyBlbmRsOworICAgIH0KKyAgfQorCisgIHJldHVybiBpbXBvcnRzOworfQorCisvKioKKyAqIE5vdCB1c2VkCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBnZW5lcmF0ZV9kYXJ0X2xpYnJhcnkoKTsKKworICBpZiAobGlicmFyeV9wcmVmaXhfLmVtcHR5KCkpIHsKKyAgICBnZW5lcmF0ZV9kYXJ0X3B1YnNwZWMoKTsKKyAgfQorfQorCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfbGlicmFyeSgpIHsKKyAgc3RyaW5nIGZfbGlicmFyeV9uYW1lOworICBpZiAobGlicmFyeV9wcmVmaXhfLmVtcHR5KCkpIHsKKyAgICBmX2xpYnJhcnlfbmFtZSA9IGJhc2VfZGlyXyArICIvbGliLyIgKyBsaWJyYXJ5X25hbWVfICsgIi5kYXJ0IjsKKyAgfSBlbHNlIHsKKyAgICBmX2xpYnJhcnlfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyAiLyIgKyBsaWJyYXJ5X25hbWVfICsgIi5kYXJ0IjsKKyAgfQorCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9saWJyYXJ5OworICBmX2xpYnJhcnkub3BlbihmX2xpYnJhcnlfbmFtZS5jX3N0cigpKTsKKworICBmX2xpYnJhcnkgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgZl9saWJyYXJ5IDw8ICJsaWJyYXJ5ICIgPDwgbGlicmFyeV9wcmVmaXhfIDw8IGxpYnJhcnlfbmFtZV8gPDwgIjsiIDw8IGVuZGwyOworICBmX2xpYnJhcnkgPDwgbGlicmFyeV9leHBvcnRzXzsKKworICBmX2xpYnJhcnkuY2xvc2UoKTsKK30KKwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpleHBvcnRfY2xhc3NfdG9fbGlicmFyeShzdHJpbmcgZmlsZV9uYW1lLCBzdHJpbmcgY2xhc3NfbmFtZSkgeworICBzdHJpbmcgc3ViZGlyOworICBpZiAobGlicmFyeV9wcmVmaXhfLmVtcHR5KCkpIHsKKyAgICBzdWJkaXIgPSAic3JjIjsKKyAgfSBlbHNlIHsKKyAgICBzdWJkaXIgPSBsaWJyYXJ5X25hbWVfOworICB9CisgIGxpYnJhcnlfZXhwb3J0c18gKz0gImV4cG9ydCAnIiArIHN1YmRpciArICIvIiArIGZpbGVfbmFtZSArICIuZGFydCcgc2hvdyAiICsgY2xhc3NfbmFtZSArICI7IiArIGVuZGw7Cit9CisKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF9wdWJzcGVjKCkgeworICBzdHJpbmcgZl9wdWJzcGVjX25hbWUgPSBiYXNlX2Rpcl8gKyAiL3B1YnNwZWMueWFtbCI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9wdWJzcGVjOworICBmX3B1YnNwZWMub3BlbihmX3B1YnNwZWNfbmFtZS5jX3N0cigpKTsKKworICBpbmRlbnQoZl9wdWJzcGVjKSA8PCAibmFtZTogIiA8PCBsaWJyYXJ5X25hbWVfIDw8IGVuZGw7CisgIGluZGVudChmX3B1YnNwZWMpIDw8ICJ2ZXJzaW9uOiAwLjAuMSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfcHVic3BlYykgPDwgImRlc2NyaXB0aW9uOiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciIgPDwgZW5kbDsKKyAgZl9wdWJzcGVjIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfcHVic3BlYykgPDwgImVudmlyb25tZW50OiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3B1YnNwZWMpIDw8ICJzZGs6IF4xLjEyLjAiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfcHVic3BlYyA8PCBlbmRsOworCisgIGluZGVudChmX3B1YnNwZWMpIDw8ICJkZXBlbmRlbmNpZXM6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAocHVic3BlY19saWJfLmVtcHR5KCkpIHsKKyAgICAvLyBkZWZhdWx0IHRvIHJlbGF0aXZlIHBhdGggd2l0aGluIHdvcmtpbmcgZGlyZWN0b3J5LCB3aGljaCB3b3JrcyBmb3IgdGVzdHMKKyAgICBpbmRlbnQoZl9wdWJzcGVjKSA8PCAidGhyaWZ0OiAgIyBeIiA8PCBkYXJ0X3RocmlmdF92ZXJzaW9uIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfcHVic3BlYykgPDwgInBhdGg6IC4uLy4uLy4uLy4uL2xpYi9kYXJ0IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSB7CisgICAgY29uc3QgdmVjdG9yPHN0ZDo6c3RyaW5nPiBsaW5lcyA9IHNwbGl0KHB1YnNwZWNfbGliXywgJ3wnKTsKKyAgICBmb3IgKHNpemVfdCBsaW5lX2luZGV4ID0gMDsgbGluZV9pbmRleCA8IGxpbmVzLnNpemUoKTsgbGluZV9pbmRleCsrKSB7CisgICAgICBpbmRlbnQoZl9wdWJzcGVjKSA8PCBsaW5lc1tsaW5lX2luZGV4XSA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIGFkZCBpbmNsdWRlZCB0aHJpZnQgZmlsZXMgYXMgZGVwZW5kZW5jaWVzCisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBzdHJpbmcgaW5jbHVkZV9uYW1lID0gZmluZF9saWJyYXJ5X25hbWUoaW5jbHVkZXNbaV0pOworICAgIGluZGVudChmX3B1YnNwZWMpIDw8IGluY2x1ZGVfbmFtZSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9wdWJzcGVjKSA8PCAicGF0aDogLi4vIiA8PCBpbmNsdWRlX25hbWUgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9wdWJzcGVjIDw8IGVuZGw7CisKKyAgZl9wdWJzcGVjLmNsb3NlKCk7Cit9CisKKy8qKgorICogTm90IHVzZWQKKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworLyoqCisgKiBFbnVtcyBhcmUgYSBjbGFzcyB3aXRoIGEgc2V0IG9mIHN0YXRpYyBjb25zdGFudHMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmaWxlX25hbWUgPSBnZXRfZmlsZV9uYW1lKHRlbnVtLT5nZXRfbmFtZSgpKTsKKworICBzdHJpbmcgZl9lbnVtX25hbWUgPSBzcmNfZGlyXyArICIvIiArIGZpbGVfbmFtZSArICIuZGFydCI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9lbnVtOworICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKKworICAvLyBDb21tZW50IGFuZCBhZGQgbGlicmFyeQorICBmX2VudW0gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZGFydF9saWJyYXJ5KGZpbGVfbmFtZSkgPDwgZW5kbDsKKworICBzdHJpbmcgY2xhc3NfbmFtZSA9IHRlbnVtLT5nZXRfbmFtZSgpOworICBleHBvcnRfY2xhc3NfdG9fbGlicmFyeShmaWxlX25hbWUsIGNsYXNzX25hbWUpOworICBmX2VudW0gPDwgImNsYXNzICIgPDwgY2xhc3NfbmFtZTsKKyAgc2NvcGVfdXAoZl9lbnVtKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAic3RhdGljIGNvbnN0IGludCAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgLy8gQ3JlYXRlIGEgc3RhdGljIFNldCB3aXRoIGFsbCB2YWxpZCB2YWx1ZXMgZm9yIHRoaXMgZW51bQorICBmX2VudW0gPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAic3RhdGljIGZpbmFsIFNldDxpbnQ+IFZBTElEX1ZBTFVFUyA9IG5ldyBTZXQuZnJvbShbIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgYm9vbCBmaXJzdFZhbHVlID0gdHJ1ZTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAvLyBwb3B1bGF0ZSBzZXQKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAoZmlyc3RWYWx1ZSA/ICIiIDogIiwgIik7CisgICAgZl9lbnVtIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgIGZpcnN0VmFsdWUgPSBmYWxzZTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9lbnVtKSA8PCAiXSk7IiA8PCBlbmRsOworCisgIGluZGVudChmX2VudW0pIDw8ICJzdGF0aWMgZmluYWwgTWFwPGludCwgU3RyaW5nPiBWQUxVRVNfVE9fTkFNRVMgPSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZmlyc3RWYWx1ZSA9IHRydWU7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW5kZW50KGZfZW51bSkgPDwgKGZpcnN0VmFsdWUgPyAiIiA6ICIsICIpOworICAgIGZfZW51bSAgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICciIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyIgPDwgZW5kbDsKKyAgICBmaXJzdFZhbHVlID0gZmFsc2U7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfZW51bSkgPDwgIn07IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24oZl9lbnVtKTsgLy8gZW5kIGNsYXNzCisKKyAgZl9lbnVtLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdHJpbmcgY2xhc3NfbmFtZSA9IGdldF9jb25zdGFudHNfY2xhc3NfbmFtZShwcm9ncmFtX25hbWVfKTsKKyAgc3RyaW5nIGZpbGVfbmFtZSA9IGdldF9maWxlX25hbWUoY2xhc3NfbmFtZSk7CisKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBzcmNfZGlyXyArICIvIiArIGZpbGVfbmFtZSArICIuZGFydCI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHM7CisgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZGFydF9saWJyYXJ5KGZpbGVfbmFtZSkgPDwgZW5kbDsKKyAgZl9jb25zdHMgPDwgZGFydF90aHJpZnRfaW1wb3J0cygpIDw8IGVuZGw7CisKKyAgZXhwb3J0X2NsYXNzX3RvX2xpYnJhcnkoZmlsZV9uYW1lLCBjbGFzc19uYW1lKTsKKyAgaW5kZW50KGZfY29uc3RzKSA8PCAiY2xhc3MgIiA8PCBjbGFzc19uYW1lOworICBzY29wZV91cChmX2NvbnN0cyk7CisKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfY29uc3RzLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgZl9jb25zdHMgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9jb25zdHMpOworCisgIGZfY29uc3RzLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGluZGVudChvdXQpOworICBpZiAoIWRlZnZhbCkgeworICAgIG91dCA8PCAoaW5fc3RhdGljID8gInZhciAiIDogInN0YXRpYyBmaW5hbCAiKTsKKyAgfQorICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgfQorICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgICBvdXQgPDwgbmFtZTsKKyAgICBvdXQgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgfQorICAgIG91dCA8PCBuYW1lOworICAgIG91dCA8PCAiID0gIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigpIjsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIi4uIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9ICIgPDwgdmFsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIGlmICghZGVmdmFsKSB7CisgICAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgICB9CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9IjsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwga2V5IDw8ICI6ICIgPDwgdmFsIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCwgIjsiICsgZW5kbCk7CisKKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgfQorICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiOworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgb3V0IDw8ICJbIiA8PCBlbmRsOworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJuZXcgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIi5mcm9tKFsiIDw8IGVuZGw7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGluZGVudF91cCgpOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgdmFsIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIl07IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiXSk7IiA8PCBlbmRsOworICAgIH0KKworICB9IGVsc2UgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgKHZvaWQpbmFtZTsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAiJyIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAiJyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgeworICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKKyAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlKTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICByZW5kZXIgPDwgdDsKKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBhIGNsYXNzCisgKiB3aXRoIGRhdGEgbWVtYmVycywgcmVhZCgpLCB3cml0ZSgpLCBhbmQgYW4gaW5uZXIgSXNzZXQgY2xhc3MuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2RhcnRfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBFeGNlcHRpb25zIGFyZSBzdHJ1Y3RzLCBidXQgdGhleSBpbmhlcml0IGZyb20gRXhjZXB0aW9uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9kYXJ0X3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIERhcnQgc3RydWN0IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIHN0cmluZyBmaWxlX25hbWUgPSBnZXRfZmlsZV9uYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpOworICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHNyY19kaXJfICsgIi8iICsgZmlsZV9uYW1lICsgIi5kYXJ0IjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3N0cnVjdDsKKyAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOworCisgIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGRhcnRfbGlicmFyeShmaWxlX25hbWUpIDw8IGVuZGw7CisKKyAgc3RyaW5nIGltcG9ydHM7CisKKyAgZl9zdHJ1Y3QgPDwgZGFydF90aHJpZnRfaW1wb3J0cygpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGFydF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCBmYWxzZSwgZmlsZV9uYW1lKTsKKworICBmX3N0cnVjdC5jbG9zZSgpOworfQorCisvKioKKyAqIERhcnQgc3RydWN0IGRlZmluaXRpb24uIFRoaXMgaGFzIHZhcmlvdXMgcGFyYW1ldGVycywgYXMgaXQgY291bGQgYmUKKyAqIGdlbmVyYXRlZCBzdGFuZGFsb25lIG9yIGluc2lkZSBhbm90aGVyIGNsYXNzIGFzIGEgaGVscGVyLiBJZiBpdAorICogaXMgYSBoZWxwZXIgdGhhbiBpdCBpcyBhIHN0YXRpYyBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KKyAqIEBwYXJhbSBpbl9jbGFzcyAgICAgSWYgaW5zaWRlIGEgY2xhc3MsIG5lZWRzIHRvIGJlIHN0YXRpYyBjbGFzcworICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBleHBvcnRfZmlsZV9uYW1lKSB7CisgIGdlbmVyYXRlX2RhcnRfZG9jKG91dCwgdHN0cnVjdCk7CisKKyAgc3RyaW5nIGNsYXNzX25hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBpZiAoIWV4cG9ydF9maWxlX25hbWUuZW1wdHkoKSkgeworICAgIGV4cG9ydF9jbGFzc190b19saWJyYXJ5KGV4cG9ydF9maWxlX25hbWUsIGNsYXNzX25hbWUpOworICB9CisgIGluZGVudChvdXQpIDw8ICJjbGFzcyAiIDw8IGNsYXNzX25hbWUgPDwgIiAiOworCisgIG91dCA8PCAiaW1wbGVtZW50cyBUQmFzZSI7CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgIiwgRXhjZXB0aW9uICI7CisgIH0KKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAic3RhdGljIGZpbmFsIFRTdHJ1Y3QgX1NUUlVDVF9ERVNDID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IGNsYXNzX25hbWUKKyAgICAgICAgICAgICAgPDwgIlwiKTsiIDw8IGVuZGw7CisKKyAgLy8gTWVtYmVycyBhcmUgcHVibGljIGZvciAtZGFydCwgcHJpdmF0ZSBmb3IgLWRhcnRiZWFuCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgZmluYWwgVEZpZWxkIF8iIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyA9IG5ldyBURmllbGQoXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGdlbmVyYXRlX2RhcnRfZG9jKG91dCwgKm1faXRlcik7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiIF8iCisgICAgICAgICAgICAgICAgPDwgZ2V0X21lbWJlcl9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgaW5pdF92YWx1ZSgqbV9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgY29uc3QgaW50ICIgPDwgdXBjYXNlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIiA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBJbm5lciBJc3NldCBjbGFzcworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImJvb2wgX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCisgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIjsKKyAgc2NvcGVfdXAob3V0KTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAidGhpcy4iICsgZ2V0X21lbWJlcl9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICB9CisgIH0KKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kYXJ0X2JlYW5fYm9pbGVycGxhdGUob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2RhcnRfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBpZiAoaXNfcmVzdWx0KSB7CisgICAgZ2VuZXJhdGVfZGFydF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2RhcnRfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9CisgIGdlbmVyYXRlX2RhcnRfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2RhcnRfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJyZWFkKFRQcm90b2NvbCBpcHJvdCkiOworICBzY29wZV91cChvdXQpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMgYW5kIHJlYWQgc3RydWN0IGhlYWRlcgorICBpbmRlbnQob3V0KSA8PCAiVEZpZWxkIGZpZWxkOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIjsKKyAgc2NvcGVfdXAob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkLmlkKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSI7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgKmZfaXRlcik7CisKKyAgICBzY29wZV9kb3duKG91dCwgIiBlbHNlIik7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAiVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAorICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDI7CisKKyAgLy8gaW4gbm9uLWJlYW5zIHN0eWxlLCBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlCisgIC8vICh3aGljaCBjYW4gYmUgY2hlY2tlZCBoZXJlIGJ1dCBub3QgaW4gdGhlIGdlbmVyYWwgdmFsaWRhdGUgbWV0aG9kKQorICBpbmRlbnQob3V0KSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZSwgd2hpY2ggY2FuJ3QgYmUgIgorICAgICAgICAgICAgICAgICAiY2hlY2tlZCBpbiB0aGUgdmFsaWRhdGUgbWV0aG9kIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEICYmICF0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFfX2lzc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiKSI7CisgICAgICBzY29wZV91cChvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5VTktOT1dOLCBcIlJlcXVpcmVkIGZpZWxkICciCisgICAgICAgICAgPDwgZmllbGRfbmFtZQorICAgICAgICAgIDw8ICInIHdhcyBub3QgZm91bmQgaW4gc2VyaWFsaXplZCBkYXRhISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihvdXQsIGVuZGwyKTsKKyAgICB9CisgIH0KKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7Cit9CisKKy8vIGdlbmVyYXRlcyBkYXJ0IG1ldGhvZCB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCisvLyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpIjsKKyAgICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuVU5LTk9XTiwgXCJSZXF1aXJlZCBmaWVsZCAnIgorICAgICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lIDw8ICInIHdhcyBub3QgcHJlc2VudCEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfZG93bihvdXQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vIGFsYXMsIHdlIGNhbm5vdCBjaGVjayAnIiA8PCBmaWVsZF9uYW1lCisgICAgICAgICAgICAgICAgICAgIDw8ICInIGJlY2F1c2UgaXQncyBhIHByaW1pdGl2ZSBhbmQgeW91IGNob3NlIHRoZSBub24tYmVhbnMgZ2VuZXJhdG9yLiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBjaGVjayB0aGF0IGZpZWxkcyBvZiB0eXBlIGVudW0gaGF2ZSB2YWxpZCB2YWx1ZXMKKyAgaW5kZW50KG91dCkgPDwgIi8vIGNoZWNrIHRoYXQgZmllbGRzIG9mIHR5cGUgZW51bSBoYXZlIHZhbGlkIHZhbHVlcyIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICAvLyBpZiBmaWVsZCBpcyBhbiBlbnVtLCBjaGVjayB0aGF0IGl0cyB2YWx1ZSBpcyB2YWxpZAorICAgIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIiAmJiAhIiA8PCBnZXRfdHR5cGVfY2xhc3NfbmFtZSh0eXBlKQorICAgICAgICAgICAgICAgICAgPDwgIi5WQUxJRF9WQUxVRVMuY29udGFpbnMoIiA8PCBmaWVsZF9uYW1lIDw8ICIpKSI7CisgICAgICBzY29wZV91cChvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuVU5LTk9XTiwgXCJUaGUgZmllbGQgJyIKKyAgICAgICAgICAgICAgICAgIDw8IGZpZWxkX25hbWUgPDwgIicgaGFzIGJlZW4gYXNzaWduZWQgdGhlIGludmFsaWQgdmFsdWUgIgorICAgICAgICAgICAgICAgICAgPDwgIiQiIDw8IGZpZWxkX25hbWUgPDwgIlwiKTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgfQorICB9CisKKyAgc2NvcGVfZG93bihvdXQsIGVuZGwyKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ3cml0ZShUUHJvdG9jb2wgb3Byb3QpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGwyOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKF9TVFJVQ1RfREVTQyk7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSI7CisgICAgICBzY29wZV91cChvdXQpOworICAgIH0KKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbCkiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKF8iIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0KKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9CisgIH0KKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIKKyAgICAgIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQsIGVuZGwyKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LAorICogd2hpY2ggaXMgYSBmdW5jdGlvbiByZXN1bHQuIFRoZXNlIGZpZWxkcyBhcmUgb25seSB3cml0dGVuCisgKiBpZiB0aGV5IGFyZSBzZXQgaW4gdGhlIElzc2V0IGFycmF5LCBhbmQgb25seSBvbmUgb2YgdGhlbQorICogY2FuIGJlIHNldCBhdCBhIHRpbWUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJ3cml0ZShUUHJvdG9jb2wgb3Byb3QpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKF9TVFJVQ1RfREVTQyk7IiA8PCBlbmRsMjsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIgZWxzZSBpZiAiOworICAgIH0KKworICAgIG91dCA8PCAiKHRoaXMuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSI7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oXyIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKG91dCwgIiIpOworICB9CisgIG91dCA8PCBlbmRsOworCisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7Cit9CisKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgLy8gY3JlYXRlIHRoZSBnZXR0ZXIKKyAgaW5kZW50KG91dCkgPDwgImdldEZpZWxkVmFsdWUoaW50IGZpZWxkSUQpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCAkZmllbGRJRCBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc2NvcGVfZG93bihvdXQpOyAgLy8gc3dpdGNoCisgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7ICAvLyBtZXRob2QKK30KKwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX3NldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworCisgIC8vIGNyZWF0ZSB0aGUgc2V0dGVyCisgIGluZGVudChvdXQpIDw8ICJzZXRGaWVsZFZhbHVlKGludCBmaWVsZElELCBPYmplY3QgdmFsdWUpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gYnVpbGQgdXAgdGhlIGJvZGllcyBvZiBib3RoIHRoZSBnZXR0ZXIgYW5kIHNldHRlciBhdCBvbmNlCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHZhbHVlID09IG51bGwpIjsKKyAgICBzY29wZV91cChvdXQpOworICAgIGluZGVudChvdXQpIDw8ICJ1bnNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKG91dCwgIiBlbHNlIik7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IHZhbHVlOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkICRmaWVsZElEIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBzY29wZV9kb3duKG91dCk7ICAvLyBzd2l0Y2gKKyAgc2NvcGVfZG93bihvdXQsIGVuZGwyKTsgIC8vIG1ldGhvZAorfQorCisvLyBDcmVhdGVzIGEgZ2VuZXJpYyBpc1NldCBtZXRob2QgdGhhdCB0YWtlcyB0aGUgZmllbGQgbnVtYmVyIGFzIGFyZ3VtZW50Cit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gY3JlYXRlIHRoZSBpc1NldCBtZXRob2QKKyAgaW5kZW50KG91dCkgPDwgIi8vIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhICIKKyAgICAgICAgICAgICAgICAgInZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiYm9vbCBpc1NldChpbnQgZmllbGRJRCkiOworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkICRmaWVsZElEIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBzY29wZV9kb3duKG91dCk7ICAvLyBzd2l0Y2gKKyAgc2NvcGVfZG93bihvdXQsIGVuZGwyKTsgIC8vIG1ldGhvZAorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNldCBvZiBEYXJ0IEJlYW4gYm9pbGVycGxhdGUgZnVuY3Rpb25zIChzZXR0ZXJzLCBnZXR0ZXJzLCBldGMuKQorICogZm9yIHRoZSBnaXZlbiBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF9iZWFuX2JvaWxlcnBsYXRlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoZmllbGQtPmdldF9uYW1lKCkpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOworCisgICAgaW5kZW50KG91dCkgPDwgIi8vICIgPDwgZmllbGRfbmFtZSA8PCBlbmRsOworCisgICAgLy8gU2ltcGxlIGdldHRlcgorICAgIGdlbmVyYXRlX2RhcnRfZG9jKG91dCwgZmllbGQpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiIGdldCAiIDw8IGZpZWxkX25hbWUgPDwgIiA9PiB0aGlzLl8iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGwyOworCisgICAgLy8gU2ltcGxlIHNldHRlcgorICAgIGdlbmVyYXRlX2RhcnRfZG9jKG91dCwgZmllbGQpOworICAgIGluZGVudChvdXQpIDw8ICJzZXQgIiA8PCBmaWVsZF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGZpZWxkX25hbWUgPDwgIikiOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMuXyIgPDwgZmllbGRfbmFtZSA8PCAiID0gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsIGZpZWxkKTsKKyAgICBzY29wZV9kb3duKG91dCwgZW5kbDIpOworCisgICAgLy8gaXNTZXQgbWV0aG9kCisgICAgaW5kZW50KG91dCkgPDwgImJvb2wgaXMiIDw8IGdldF9jYXBfbmFtZSgic2V0IikgPDwgY2FwX25hbWUgPDwgIigpIjsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgb3V0IDw8ICIgPT4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBudWxsOyIgPDwgZW5kbDI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiID0+IHRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGwyOworICAgIH0KKworICAgIC8vIFVuc2V0dGVyCisgICAgaW5kZW50KG91dCkgPDwgInVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkiOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0b1N0cmluZygpIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfc3RydWN0X3Rvc3RyaW5nKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJTdHJpbmcgdG9TdHJpbmcoKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgIlN0cmluZ0J1ZmZlciByZXQgPSBuZXcgU3RyaW5nQnVmZmVyKFwiIgorICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIgPDwgZW5kbDI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgY291bGRfYmVfdW5zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIjsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgfQorCisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisKKyAgICBpZiAoIWZpcnN0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0LndyaXRlKFwiLCBcIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicmV0LndyaXRlKFwiIiA8PCBmaWVsZF9uYW1lIDw8ICI6XCIpOyIgPDwgZW5kbDsKKyAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQud3JpdGUoXCJudWxsXCIpOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0LCAiIGVsc2UiKTsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgfQorCisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19iaW5hcnkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldC53cml0ZShcIkJJTkFSWVwiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiU3RyaW5nICIgPDwgZmllbGRfbmFtZSA8PCAiX25hbWUgPSAiCisgICAgICAgICAgICAgICAgICA8PCBnZXRfdHR5cGVfY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgICAgIDw8ICIuVkFMVUVTX1RPX05BTUVTW3RoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICJdOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBmaWVsZF9uYW1lIDw8ICJfbmFtZSAhPSBudWxsKSI7CisgICAgICBzY29wZV91cChvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgInJldC53cml0ZSgiIDw8IGZpZWxkX25hbWUgPDwgIl9uYW1lKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0LndyaXRlKFwiIChcIik7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgInJldC53cml0ZSh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGRfbmFtZSA8PCAiX25hbWUgIT0gbnVsbCkiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQud3JpdGUoXCIpXCIpOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldC53cml0ZSh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgfQorICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0LndyaXRlKFwiKVwiKTsiIDw8IGVuZGwyOworCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gcmV0LnRvU3RyaW5nKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7Cit9CisKKy8qKgorICogUmV0dXJucyBhIHN0cmluZyB3aXRoIHRoZSBkYXJ0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiB0aHJpZnQgdHlwZQorICogKGUuZy4gZm9yIHRoZSB0eXBlIHN0cnVjdCBpdCByZXR1cm5zICJUVHlwZS5TVFJVQ1QiKQorICovCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZXRfZGFydF90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpIHsKKyAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTElTVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIGdldF9kYXJ0X3R5cGVfc3RyaW5nKCgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJUVHlwZS5WT0lEIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9kYXJ0X2dlbmVyYXRvcjo6Z2V0X2RhcnRfdHlwZV9zdHJpbmchIik7CisgICAgICBicmVhazsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoCisgICAgICAgICJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfZGFydF9nZW5lcmF0b3I6OmdldF9kYXJ0X3R5cGVfc3RyaW5nISIpOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCisgIH0KK30KKwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGZpbGVfbmFtZSA9IGdldF9maWxlX25hbWUoc2VydmljZV9uYW1lXyk7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHNyY19kaXJfICsgIi8iICsgZmlsZV9uYW1lICsgIi5kYXJ0IjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZGFydF9saWJyYXJ5KGZpbGVfbmFtZSkgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXyA8PCBzZXJ2aWNlX2ltcG9ydHMoKSA8PCBkYXJ0X3RocmlmdF9pbXBvcnRzKCkgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIGdldF90dHlwZV9jbGFzc19uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgfQorCisgIGdlbmVyYXRlX2RhcnRfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKworICBzdHJpbmcgY2xhc3NfbmFtZSA9IHNlcnZpY2VfbmFtZV87CisgIGV4cG9ydF9jbGFzc190b19saWJyYXJ5KGdldF9maWxlX25hbWUoc2VydmljZV9uYW1lXyksIGNsYXNzX25hbWUpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImFic3RyYWN0IGNsYXNzICIgPDwgY2xhc3NfbmFtZSA8PCBleHRlbmRzX2lmYWNlOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfZGFydF9kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXywgZW5kbDIpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgYXJncyBhbmQgcmV0dXJuIHR5cGVzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX2RhcnRfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBnZXRfdHR5cGVfY2xhc3NfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19jbGllbnQgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiQ2xpZW50IjsKKyAgfQorCisgIHN0cmluZyBjbGFzc19uYW1lID0gc2VydmljZV9uYW1lXyArICJDbGllbnQiOworICBleHBvcnRfY2xhc3NfdG9fbGlicmFyeShnZXRfZmlsZV9uYW1lKHNlcnZpY2VfbmFtZV8pLCBjbGFzc19uYW1lKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJjbGFzcyAiIDw8IGNsYXNzX25hbWUgPDwgZXh0ZW5kc19jbGllbnQKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyAiIDw8IHNlcnZpY2VfbmFtZV87CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGNsYXNzX25hbWUgPDwgIihUUHJvdG9jb2wgaXByb3QsIFtUUHJvdG9jb2wgb3Byb3QgPSBudWxsXSkiOworCisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiOiBzdXBlcihpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgeworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiX2lwcm90ID0gaXByb3Q7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiX29wcm90ID0gKG9wcm90ID09IG51bGwpID8gaXByb3QgOiBvcHJvdDsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVFByb3RvY29sIF9pcHJvdDsiIDw8IGVuZGwyOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVFByb3RvY29sIGdldCBpcHJvdCA9PiBfaXByb3Q7IiA8PCBlbmRsMjsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRQcm90b2NvbCBfb3Byb3Q7IiA8PCBlbmRsMjsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRQcm90b2NvbCBnZXQgb3Byb3QgPT4gX29wcm90OyIgPDwgZW5kbDI7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpbnQgX3NlcWlkID0gMDsiIDw8IGVuZGwyOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW50IGdldCBzZXFpZCA9PiBfc2VxaWQ7IiA8PCBlbmRsMjsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImludCBuZXh0U2VxaWQoKSA9PiArK19zZXFpZDsiIDw8IGVuZGwyOworICB9CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIiBhc3luYyI7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gZ2V0X2FyZ3NfY2xhc3NfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlLk9ORVdBWSIgOiAiVE1lc3NhZ2VUeXBlLkNBTEwiKQorICAgICAgICAgICAgICAgPDwgIiwgbmV4dFNlcWlkKCkpKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgc3RyaW5nIGFyZ19maWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiYXJncy4iIDw8IGFyZ19maWVsZF9uYW1lIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgIDw8IGFyZ19maWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiYXJncy53cml0ZShvcHJvdCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsMjsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiYXdhaXQgb3Byb3QudHJhbnNwb3J0LmZsdXNoKCk7IiA8PCBlbmRsMjsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTikiOworICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRBcHBsaWNhdGlvbkVycm9yIGVycm9yID0gVEFwcGxpY2F0aW9uRXJyb3IucmVhZChpcHJvdCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhyb3cgZXJyb3I7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCBlbmRsMik7CisKKyAgICAgIHN0cmluZyByZXN1bHRfY2xhc3MgPSBnZXRfcmVzdWx0X2NsYXNzX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCByZXN1bHRfY2xhc3MgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRfY2xhc3MgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVzdWx0LnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChyZXN1bHQuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygic3VjY2VzcyIpIDw8ICIpIjsKKyAgICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHJlc3VsdC5zdWNjZXNzOyIgPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCBlbmRsMik7CisgICAgICB9CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIHN0cmluZyByZXN1bHRfZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZSgoKnhfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChyZXN1bHQuIiA8PCByZXN1bHRfZmllbGRfbmFtZSA8PCAiICE9IG51bGwpIjsKKyAgICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhyb3cgcmVzdWx0LiIgPDwgcmVzdWx0X2ZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgICB9CisKKyAgICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhyb3cgbmV3IFRBcHBsaWNhdGlvbkVycm9yKFRBcHBsaWNhdGlvbkVycm9yVHlwZS5NSVNTSU5HX1JFU1VMVCwgXCIiCisgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCBlbmRsMik7CisgIH0KKworICBzY29wZV9kb3duKGZfc2VydmljZV8sIGVuZGwyKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAvLyB0eXBlZGVmCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidHlwZWRlZiB2b2lkIFByb2Nlc3NGdW5jdGlvbihpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KTsiIDw8IGVuZGwyOworCisgIC8vIEV4dGVuZHMgc3R1ZmYKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IGdldF90dHlwZV9jbGFzc19uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICJQcm9jZXNzb3IiOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIHN0cmluZyBjbGFzc19uYW1lID0gIHNlcnZpY2VfbmFtZV8gKyAiUHJvY2Vzc29yIjsKKyAgZXhwb3J0X2NsYXNzX3RvX2xpYnJhcnkoZ2V0X2ZpbGVfbmFtZShzZXJ2aWNlX25hbWVfKSwgY2xhc3NfbmFtZSk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2xhc3MgIiA8PCBjbGFzc19uYW1lIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICIgaW1wbGVtZW50cyBUUHJvY2Vzc29yIjsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGNsYXNzX25hbWUgPDwgIigiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiBpZmFjZSkiOworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIjogc3VwZXIoaWZhY2UpIjsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmYWNlXyA9IGlmYWNlOyIgPDwgZW5kbDsKKyAgfQorCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJQUk9DRVNTX01BUFtcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCJdID0gIiA8PCBnZXRfbWVtYmVyX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8sIGVuZGwyKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgc2VydmljZV9uYW1lXyA8PCAiIGlmYWNlXzsiIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZmluYWwgTWFwPFN0cmluZywgUHJvY2Vzc0Z1bmN0aW9uPiBQUk9DRVNTX01BUCA9IHt9OyIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiYm9vbCBwcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSI7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUHJvY2Vzc0Z1bmN0aW9uIGZuID0gUFJPQ0VTU19NQVBbbXNnLm5hbWVdOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoZm4gPT0gbnVsbCkiOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIFRUeXBlLlNUUlVDVCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRBcHBsaWNhdGlvbkVycm9yIHggPSBuZXcgVEFwcGxpY2F0aW9uRXJyb3IoVEFwcGxpY2F0aW9uRXJyb3JUeXBlLlVOS05PV05fTUVUSE9ELCAiCisgICAgICAgICAiXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIrbXNnLm5hbWUrXCInXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1zZy5zZXFpZCkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LnRyYW5zcG9ydC5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZm4obXNnLnNlcWlkLCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXywgZW5kbDIpOyAvLyBwcm9jZXNzIGZ1bmN0aW9uCisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBzY29wZV9kb3duKGZfc2VydmljZV8sIGVuZGwyKTsgLy8gY2xhc3MKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgZ2V0X3Jlc3VsdF9jbGFzc19uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfZGFydF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0c2VydmljZTsKKworICBib29sIGF3YWl0X3Jlc3VsdCA9ICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBnZXRfbWVtYmVyX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIjsKKyAgaWYgKGF3YWl0X3Jlc3VsdCkgeworICAgIGZfc2VydmljZV8gPDwgIiBhc3luYyI7CisgIH0KKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gZ2V0X2FyZ3NfY2xhc3NfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IGdldF9yZXN1bHRfY2xhc3NfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRyeSI7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgaWYgKGF3YWl0X3Jlc3VsdCkgeworICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gYXdhaXQgIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICJpZmFjZV8uIiA8PCBnZXRfbWVtYmVyX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgZ2V0X21lbWJlcl9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIHN0cmluZyByZXN1bHRfZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZSgoKnhfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCAiIik7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgb24gIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICA8PCAiIGNhdGNoKCIgPDwgcmVzdWx0X2ZpZWxkX25hbWUgPDwgIikiOworICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXN1bHQuIiA8PCByZXN1bHRfZmllbGRfbmFtZSA8PCAiID0gIgorICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdF9maWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8sICIgIik7CisgICAgZl9zZXJ2aWNlXyA8PCAiY2F0Y2ggKHRoKSI7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvLyBJbnRlcm5hbCBlcnJvciIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRBcHBsaWNhdGlvbkVycm9yIHggPSBuZXcgIgorICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkVycm9yKFRBcHBsaWNhdGlvbkVycm9yVHlwZS5JTlRFUk5BTF9FUlJPUiwgXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIKKyAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAieC53cml0ZShvcHJvdCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3QudHJhbnNwb3J0LmZsdXNoKCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICB9CisKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC50cmFuc3BvcnQuZmx1c2goKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKGZfc2VydmljZV8sIGVuZGwyKTsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAorICogQHBhcmFtIHByZWZpeCBUaGUgdmFyaWFibGUgbmFtZSBvciBjb250YWluZXIgZm9yIHRoaXMgZmllbGQKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgZmllbGRfbmFtZTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgZmllbGRfbmFtZTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlwcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAicmVhZEJvb2woKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgInJlYWRJMTYoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgInJlYWRJNjQoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gRGFydCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBmaWVsZF9uYW1lLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBpbnZva2VzIHJlYWQoKQorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIGluZGVudChvdXQpOworICBzY29wZV91cChvdXQsICIiKTsKKworICBzdHJpbmcgb2JqOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvYmogPSB0bXAoIl9tYXAiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9zZXQiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb2JqID0gdG1wKCJfbGlzdCIpOworICB9CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVE1hcCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJUU2V0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJUTGlzdCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCAiKCk7IiA8PCBlbmRsOworCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IgKGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5sZW5ndGgiCisgICAgICAgICAgICAgIDw8ICI7ICIKKyAgICAgICAgICAgICAgPDwgIisrIiA8PCBpIDw8ICIpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50CisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSk7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgZmllbGRfbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgZmllbGRfbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgZmllbGRfbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIGZpZWxkX25hbWU7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gRGFydCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKKyAgICAgICAgICAgZmllbGRfbmFtZS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi53cml0ZShvcHJvdCk7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgd3JpdGluZyBpdHMgc2l6ZSB0aGVuIHRoZSBlbGVtZW50cy4KKyAqCisgKiBAcGFyYW0gdHR5cGUgIFRoZSB0eXBlIG9mIGNvbnRhaW5lcgorICogQHBhcmFtIHByZWZpeCBTdHJpbmcgcHJlZml4IGZvciBmaWVsZHMKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBpbmRlbnQob3V0KTsKKyAgc2NvcGVfdXAob3V0LCAiIik7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJfa2V5Iik7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwQmVnaW4obmV3IFRNYXAoIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLmxlbmd0aCkpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEJlZ2luKG5ldyBUU2V0KCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgcHJlZml4IDw8ICIubGVuZ3RoKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLmxlbmd0aCkpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgc3RyaW5nIGl0ZXIgPSB0bXAoImVsZW0iKTsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKHZhciAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiLmtleXMpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkgfHwgdHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKHZhciAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSI7CisgIH0KKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgbWFwICsgIlsiICsgaXRlciArICJdIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogUmV0dXJucyBhIERhcnQgdHlwZSBuYW1lCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcmV0dXJuIERhcnQgdHlwZSBuYW1lLCBpLmUuIE1hcDxLZXksIFZhbHVlPgorICovCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gImludCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgIHJldHVybiAiTWFwPCIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X2tleV90eXBlKCkpICsgIiwgIgorICAgICAgICAgICAgICAgICAgKyB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCkpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICByZXR1cm4gIlNldDwiICsgdHlwZV9uYW1lKHRzZXQtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICByZXR1cm4gIkxpc3Q8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKKyAgfQorCisgIHJldHVybiBnZXRfdHR5cGVfY2xhc3NfbmFtZSh0dHlwZSk7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgRGFydCB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgorICoKKyAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCisgKi8KK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdHlwZSkgeworICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKKworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gInZvaWQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIHJldHVybiAiVWludDhMaXN0IjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJTdHJpbmciOworICAgIH0KKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAiYm9vbCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgcmV0dXJuICJpbnQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gImRvdWJsZSI7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBEYXJ0IG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgfQorfQorCisvKioKKyAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqLworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQpIHsKKyAgc3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUodGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgc3RyaW5nIHJlc3VsdCA9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIiAiICsgZmllbGRfbmFtZTsKKyAgaWYgKGluaXQpIHsKKyAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICBzdGQ6OiBvZnN0cmVhbSBkdW1teTsKKyAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgZmllbGRfbmFtZSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gMC4wIjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUpICsgIigpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiKCkiOworICAgICAgOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0ICsgIjsiOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRzID0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOworCisgIHN0ZDo6c3RyaW5nIHJldHVybnR5cGU7CisgIGlmICh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJldHVybnR5cGUgPSAiRnV0dXJlIjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm50eXBlID0gIkZ1dHVyZTwiICsgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiPiI7CisgIH0KKworICBzdGQ6OnN0cmluZyByZXN1bHQgPSByZXR1cm50eXBlICsgIiAiICsgZ2V0X21lbWJlcl9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKworICAgICAgICAgICAgICAgICAgICAgICAiKCIgKyBhcmd1bWVudHMgKyAiKSI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGNvbW1hIHNlcGFyYXRlZCBmaWVsZCBsaXN0LCB3aXRoIHR5cGUgbmFtZXMKKyAqLworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgc3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiICIgKyBmaWVsZF9uYW1lOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgorICovCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjppbml0X3ZhbHVlKHRfZmllbGQqIGZpZWxkKSB7CisgIC8vIERvIG5vdCBpbml0aWFsaXplIG9wdGlvbmFsIGZpZWxkcworICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgdF90eXBlKiB0dHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOworCisgIC8vIEdldCB0aGUgYWN0dWFsIHR5cGUgZm9yIGEgdHlwZWRlZgorICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIC8vIE9ubHkgY29uc2lkZXIgYmFzZSB0eXBlcyBmb3IgZGVmYXVsdCBpbml0aWFsaXphdGlvbgorICBpZiAoIXR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiAiIjsKKyAgfQorICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworCisgIC8vIEluaXRpYWxpemUgYm9vbHMsIGludHMsIGFuZCBkb3VibGVzIHdpdGggc2FuZSBkZWZhdWx0cworICBzdHJpbmcgcmVzdWx0OworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXN1bHQgPSAiID0gZmFsc2UiOworICAgIGJyZWFrOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJlc3VsdCA9ICIgPSAwIjsKKyAgICBicmVhazsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmVzdWx0ID0gIiA9IDAuMCI7CisgICAgYnJlYWs7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgcmVzdWx0ID0gIiI7CisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKKyAgcmV0dXJuIG5hbWU7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmdldF9tZW1iZXJfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIG5hbWVbMF0gPSB0b2xvd2VyKG5hbWVbMF0pOworICByZXR1cm4gbmFtZTsKK30KKworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Z2V0X2FyZ3NfY2xhc3NfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIHJldHVybiBuYW1lICsgIl9hcmdzIjsKK30KKworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Z2V0X3Jlc3VsdF9jbGFzc19uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgcmV0dXJuIG5hbWUgKyAiX3Jlc3VsdCI7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmdldF9maWxlX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICAvLyBlLmcuIGNoYW5nZSBBUElGb3JGaWxlSU8gdG8gYXBpX2Zvcl9maWxlX2lvCisKKyAgc3RyaW5nIHJldDsKKyAgY29uc3QgY2hhciogdG1wID0gbmFtZS5jX3N0cigpOworICBib29sIGlzX3ByZXZfbGMgPSB0cnVlOworICBib29sIGlzX2N1cnJlbnRfbGMgPSB0bXBbMF0gPT0gdG9sb3dlcih0bXBbMF0pOworICBib29sIGlzX25leHRfbGMgPSBmYWxzZTsKKworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykgeworICAgIGNoYXIgbGMgPSB0b2xvd2VyKHRtcFtpXSk7CisKKyAgICBpZiAoaSA9PSBuYW1lLmxlbmd0aCgpIC0gMSkgeworICAgICAgaXNfbmV4dF9sYyA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBpc19uZXh0X2xjID0gKHRtcFtpKzFdID09IHRvbG93ZXIodG1wW2krMV0pKTsKKyAgICB9CisKKyAgICBpZiAoaSAhPSAwICYmICFpc19jdXJyZW50X2xjICYmIChpc19wcmV2X2xjIHx8IGlzX25leHRfbGMpKSB7CisgICAgICByZXQgKz0gIl8iOworICAgIH0KKyAgICByZXQgKz0gbGM7CisKKyAgICBpc19wcmV2X2xjID0gaXNfY3VycmVudF9sYzsKKyAgICBpc19jdXJyZW50X2xjID0gaXNfbmV4dF9sYzsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmdldF9jb25zdGFudHNfY2xhc3NfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIC8vIGUuZy4gY2hhbmdlIG15X2dyZWF0X21vZGVsIHRvIE15R3JlYXRNb2RlbENvbnN0YW50cworICBzdHJpbmcgcmV0OworICBjb25zdCBjaGFyKiB0bXAgPSBuYW1lLmNfc3RyKCk7CisgIGJvb2wgaXNfcHJldl91bmRlcnNjb3JlID0gdHJ1ZTsKKworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykgeworICAgIGlmICh0bXBbaV0gPT0gJ18nKSB7CisgICAgICBpc19wcmV2X3VuZGVyc2NvcmUgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoaXNfcHJldl91bmRlcnNjb3JlKSB7CisgICAgICAgIHJldCArPSB0b3VwcGVyKHRtcFtpXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXQgKz0gdG1wW2ldOworICAgICAgfQorCisgICAgICBpc19wcmV2X3VuZGVyc2NvcmUgPSBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0ICsgIkNvbnN0YW50cyI7Cit9CisKK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7CisgIHN0cmluZyBjb25zdGFudF9uYW1lOworCisgIGJvb2wgaXNfZmlyc3QgPSB0cnVlOworICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7CisgIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gbmFtZS5iZWdpbigpOyBpdGVyICE9IG5hbWUuZW5kKCk7ICsraXRlcikgeworICAgIHN0cmluZzo6dmFsdWVfdHlwZSBjaGFyYWN0ZXIgPSAoKml0ZXIpOworCisgICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKKworICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7CisgICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKKyAgICB9CisgICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpc19maXJzdCA9IGZhbHNlOworICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7CisgIH0KKworICByZXR1cm4gY29uc3RhbnRfbmFtZTsKK30KKworLyoqCisgKiBFbWl0cyBhIGRvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIiIsICIvLy8gIiwgdGRvYy0+Z2V0X2RvYygpLCAiIik7CisgIH0KK30KKworLyoqCisgKiBFbWl0cyBhIGRvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfZG9jKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgeworICAgIHN0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOworICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKKyAgICAgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKHAtPmdldF9uYW1lKCkpOworICAgICAgc3MgPDwgIlxuQHBhcmFtICIgPDwgZmllbGRfbmFtZTsKKyAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgc3MgPDwgIiAiIDw8IHAtPmdldF9kb2MoKTsKKyAgICAgIH0KKyAgICB9CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiIiwgIi8vLyAiLCBzcy5zdHIoKSwgIiIpOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKSB7CisgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgcmV0dXJuIGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkX25hbWUpOworfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7CisgIHJldHVybiAiaXMiICsgZ2V0X2NhcF9uYW1lKCJzZXQiKSArIGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSArICIoKSI7Cit9CisKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKKyAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgeworICAgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Z2V0X3R0eXBlX2NsYXNzX25hbWUodF90eXBlKiB0dHlwZSkgeworICBpZiAocHJvZ3JhbV8gPT0gdHR5cGUtPmdldF9wcm9ncmFtKCkpIHsKKyAgICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIG5hbWVkX2ltcG9ydCA9ICJ0XyIgKyBmaW5kX2xpYnJhcnlfbmFtZSh0dHlwZS0+Z2V0X3Byb2dyYW0oKSk7CisgICAgcmV0dXJuIG5hbWVkX2ltcG9ydCArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgZGFydCwKKyAgICAiRGFydCIsCisgICAgIiAgICBsaWJyYXJ5X25hbWU6ICAgIE9wdGlvbmFsIG92ZXJyaWRlIGZvciBsaWJyYXJ5IG5hbWUuXG4iCisgICAgIiAgICBsaWJyYXJ5X3ByZWZpeDogIEdlbmVyYXRlIGNvZGUgdGhhdCBjYW4gYmUgdXNlZCB3aXRoaW4gYW4gZXhpc3RpbmcgbGlicmFyeS5cbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgVXNlIGEgZG90LXNlcGFyYXRlZCBzdHJpbmcsIGUuZy4gXCJteV9wYXJlbnRfbGliLnNyYy5nZW5cIlxuIgorICAgICIgICAgcHVic3BlY19saWI6ICAgICBPcHRpb25hbCBvdmVycmlkZSBmb3IgdGhyaWZ0IGxpYiBkZXBlbmRlbmN5IGluIHB1YnNwZWMueWFtbCxcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgZS5nLiBcInRocmlmdDogMC54LnhcIi4gIFVzZSBhIHBpcGUgZGVsaW1pdGVyIHRvIHNlcGFyYXRlIGxpbmVzLFxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBlLmcuIFwidGhyaWZ0OnwgIGdpdDp8ICAgIHVybDogZ2l0QGZvby5jb21cIlxuIgorKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kZWxwaGlfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kZWxwaGlfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZDc3ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RlbHBoaV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSw0MDExIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKK2NsYXNzIHRfZGVscGhpX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2RlbHBoaV9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBpbmRlbnRfaW1wbF8gPSAwOworICAgIGhhc19mb3J3YXJkID0gZmFsc2U7CisgICAgaGFzX2VudW0gPSBmYWxzZTsKKyAgICBoYXNfY29uc3QgPSBmYWxzZTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgYW5zaXN0cl9iaW5hcnlfID0gZmFsc2U7CisgICAgcmVnaXN0ZXJfdHlwZXNfID0gZmFsc2U7CisgICAgY29uc3RwcmVmaXhfID0gZmFsc2U7CisgICAgZXZlbnRzXyA9IGZhbHNlOworICAgIHhtbGRvY18gPSBmYWxzZTsKKyAgICBhc3luY18gPSBmYWxzZTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJhbnNpc3RyX2JpbmFyeSIpID09IDApIHsKKyAgICAgICAgYW5zaXN0cl9iaW5hcnlfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicmVnaXN0ZXJfdHlwZXMiKSA9PSAwKSB7CisgICAgICAgIHJlZ2lzdGVyX3R5cGVzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImNvbnN0cHJlZml4IikgPT0gMCkgeworICAgICAgICBjb25zdHByZWZpeF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJldmVudHMiKSA9PSAwKSB7CisgICAgICAgIGV2ZW50c18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ4bWxkb2MiKSA9PSAwKSB7CisgICAgICAgIHhtbGRvY18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJhc3luYyIpID09IDApIHsKKyAgICAgICAgYXN5bmNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBkZWxwaGk6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWRlbHBoaSI7CisgICAgZXNjYXBlXy5jbGVhcigpOworICAgIGVzY2FwZV9bJ1wnJ10gPSAiJyciOworICB9CisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgYm9vbCBpc194Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcHJvcGVydHlfd3JpdGVyXyhvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYyk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHkob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cnVjdF9pc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1B1YmxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2lzc2V0X3JlYWRlcl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzX3hjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcyk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdW5pb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgeGNlcHRpb25fZmFjdG9yeV9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfY2xlYXJfdW5pb25fdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdW5pb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgeGNlcHRpb25fZmFjdG9yeV9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3Rfd3JpdGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdG9zdHJpbmdfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkpOworCisgIHZvaWQgYWRkX2RlbHBoaV91c2VzX2xpc3Qoc3RyaW5nIHVuaXRuYW1lKTsKKworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVhZGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9jcmVhdGVfZXhjZXB0aW9uX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKKworICBib29sIGNvbnN0X25lZWRzX3Zhcih0X3R5cGUqIHR5cGUpOworICB2b2lkIHByaW50X2NvbnN0X3Byb3Aoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgdm9pZCBwcmludF9wcml2YXRlX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiB2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgdm9pZCBpbml0aWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgdm9pZCBmaW5hbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfbm0gPSAiIik7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHZvaWQgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKHN0ZDo6b3N0cmVhbSYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19ubSA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgbWFrZV9jb25zdGFudHNfY2xhc3NuYW1lKCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSA9IGZhbHNlKTsKKyAgdm9pZCBwcmludF9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeV9mdW5jKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3RvcnlfcmVnaXN0cmF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBib29sIGZvcl9hc3luYyk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogZnVuY3Rpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4KTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisKKyAgdm9pZCBkZWxwaGlfdHlwZV91c2luZ3Moc3RkOjpvc3RyZWFtJiBvdXQpOworICBzdGQ6OnN0cmluZyBkZWxwaGlfdGhyaWZ0X3VzaW5ncygpOworCisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2NscyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX25vX3Bvc3RmaXggPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9leGNlcHRpb25fZmFjdG9yeSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2Z1bGxfZXhjZXB0aW9uX2ZhY3RvcnkgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIG5vcm1hbGl6ZV9jbHNubShzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX25vX2NoZWNrX2tleXdvcmQgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIG1ha2VfdmFsaWRfZGVscGhpX2lkZW50aWZpZXIoc3RkOjpzdHJpbmcgY29uc3QmIGZyb21OYW1lKTsKKyAgc3RkOjpzdHJpbmcgaW5wdXRfYXJnX3ByZWZpeCh0X3R5cGUqIHR0eXBlKTsKKworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluaXQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JfYXN5bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmdWxsX2NscyA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIGNvbnN0cnVjdG9yX2FyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIGN1cnJlbnRfaW5kZW50KTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBwcm9wX25hbWUodF9maWVsZCogdGZpZWxkLCBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBwcm9wX25hbWUoc3RkOjpzdHJpbmcgbmFtZSwgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgY29uc3RydWN0b3JfcGFyYW1fbmFtZShzdHJpbmcgbmFtZSk7CisKKyAgdm9pZCB3cml0ZV9lbnVtKHN0ZDo6c3RyaW5nIGxpbmUpOworICB2b2lkIHdyaXRlX2ZvcndhcmRfZGVjcihzdGQ6OnN0cmluZyBsaW5lKTsKKyAgdm9pZCB3cml0ZV9jb25zdChzdGQ6OnN0cmluZyBsaW5lKTsKKyAgdm9pZCB3cml0ZV9zdHJ1Y3Qoc3RkOjpzdHJpbmcgbGluZSk7CisgIHZvaWQgd3JpdGVfc2VydmljZShzdGQ6OnN0cmluZyBsaW5lKTsKKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGF1dG9nZW5fY29tbWVudCgpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoIigqKlxuIikgKyAiICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICAgICsgIiAqXG4iICsgIiAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIKKyAgICAgICAgICAgKyAiICopXG4iOworICB9CisKKyAgc3RyaW5nIHJlcGxhY2VfYWxsKHN0cmluZyBjb250ZW50cywgc3RyaW5nIHNlYXJjaCwgc3RyaW5nIHJlcGxhY2UpOworICBzdHJpbmcgeG1sX2VuY29kZShzdHJpbmcgY29udGVudHMpOworICBzdHJpbmcgeG1sZG9jX2VuY29kZShzdHJpbmcgY29udGVudHMpOworICBzdHJpbmcgeG1sYXR0cmliX2VuY29kZShzdHJpbmcgY29udGVudHMpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2RvY3N0cmluZ19jb21tZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpOworCisgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CisgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfbmFtZV87CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX2ZvcndhcmRfZGVjcjsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfZW51bTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfY29uc3Q7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3N0cnVjdDsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfc2VydmljZTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfY29uc3RfaW1wbDsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfc3RydWN0X2ltcGw7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3NlcnZpY2VfaW1wbDsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfdHlwZV9mYWN0b3J5X3JlZ2lzdHJhdGlvbjsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfdHlwZV9mYWN0b3J5X2Z1bmNzOworICBib29sIGhhc19mb3J3YXJkOworICBib29sIGhhc19lbnVtOworICBib29sIGhhc19jb25zdDsKKyAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX2Rpcl87CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IGRlbHBoaV9rZXl3b3JkczsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gZGVscGhpX3Jlc2VydmVkX21ldGhvZDsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb247CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IHR5cGVzX2tub3duOworICBzdGQ6Omxpc3Q8dF90eXBlZGVmKj4gdHlwZWRlZnNfcGVuZGluZzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHVzZXNfbGlzdDsKKyAgdm9pZCBjcmVhdGVfa2V5d29yZHMoKTsKKyAgYm9vbCBmaW5kX2tleXdvcmQoc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4mIGtleXdvcmRfbWFwLCBzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgbm9ybWFsaXplX25hbWUoc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX21ldGhvZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZXhjZXB0aW9uX21ldGhvZCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZW1wdHlfdmFsdWUodF90eXBlKiB0eXBlKTsKKyAgYm9vbCBpc19mdWxseV9kZWZpbmVkX3R5cGUodF90eXBlKiB0dHlwZSk7CisgIHZvaWQgYWRkX2RlZmluZWRfdHlwZSh0X3R5cGUqIHR0eXBlKTsKKyAgdm9pZCBpbml0X2tub3duX3R5cGVzX2xpc3QoKTsKKyAgYm9vbCBpc192b2lkKHRfdHlwZSogdHlwZSk7CisgIGludCBpbmRlbnRfaW1wbF87CisgIGJvb2wgYW5zaXN0cl9iaW5hcnlfOworICBib29sIHJlZ2lzdGVyX3R5cGVzXzsKKyAgYm9vbCBjb25zdHByZWZpeF87CisgIGJvb2wgZXZlbnRzXzsKKyAgYm9vbCB4bWxkb2NfOworICBib29sIGFzeW5jXzsKKyAgdm9pZCBpbmRlbnRfdXBfaW1wbCgpIHsgKytpbmRlbnRfaW1wbF87IH07CisgIHZvaWQgaW5kZW50X2Rvd25faW1wbCgpIHsgLS1pbmRlbnRfaW1wbF87IH07CisgIHN0ZDo6c3RyaW5nIGluZGVudF9pbXBsKCkgeworICAgIHN0ZDo6c3RyaW5nIGluZCA9ICIiOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBpbmRlbnRfaW1wbF87ICsraSkgeworICAgICAgaW5kICs9ICIgICI7CisgICAgfQorICAgIHJldHVybiBpbmQ7CisgIH07CisgIHN0ZDo6b3N0cmVhbSYgaW5kZW50X2ltcGwoc3RkOjpvc3RyZWFtJiBvcykgeyByZXR1cm4gb3MgPDwgaW5kZW50X2ltcGwoKTsgfTsKK307CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnJlcGxhY2VfYWxsKHN0cmluZyBjb250ZW50cywgc3RyaW5nIHNlYXJjaCwgc3RyaW5nIHJlcGwpIHsKKyAgc3RyaW5nIHN0cihjb250ZW50cyk7CisKKyAgc2l6ZV90IHNsZW4gPSBzZWFyY2gubGVuZ3RoKCk7CisgIHNpemVfdCBybGVuID0gcmVwbC5sZW5ndGgoKTsKKyAgc2l6ZV90IGluY3IgPSAocmxlbiA+IDApID8gcmxlbiA6IDE7CisKKyAgaWYgKHNsZW4gPiAwKSB7CisgICAgc2l6ZV90IGZvdW5kID0gc3RyLmZpbmQoc2VhcmNoKTsKKyAgICB3aGlsZSAoKGZvdW5kICE9IHN0cmluZzo6bnBvcykgJiYgKGZvdW5kIDwgc3RyLmxlbmd0aCgpKSkgeworICAgICAgc3RyLnJlcGxhY2UoZm91bmQsIHNsZW4sIHJlcGwpOworICAgICAgZm91bmQgPSBzdHIuZmluZChzZWFyY2gsIGZvdW5kICsgaW5jcik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0cjsKK30KKworLy8gWE1MIGVuY29kaW5nCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjp4bWxfZW5jb2RlKHN0cmluZyBjb250ZW50cykgeworICBzdHJpbmcgc3RyKGNvbnRlbnRzKTsKKworICAvLyBlc2NhcGUgdGhlIGVzY2FwZQorICBzdHIgPSByZXBsYWNlX2FsbChzdHIsICImIiwgIiZhbXA7Iik7CisKKyAgLy8gb3RoZXIgc3RhbmRhcmQgWE1MIGVudGl0aWVzCisgIHN0ciA9IHJlcGxhY2VfYWxsKHN0ciwgIjwiLCAiJmx0OyIpOworICBzdHIgPSByZXBsYWNlX2FsbChzdHIsICI+IiwgIiZndDsiKTsKKworICByZXR1cm4gc3RyOworfQorCisvLyBYTUwgYXR0cmlidXRlIGVuY29kaW5nCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjp4bWxhdHRyaWJfZW5jb2RlKHN0cmluZyBjb250ZW50cykgeworICBzdHJpbmcgc3RyKHhtbF9lbmNvZGUoY29udGVudHMpKTsKKworICAvLyBvdXIgYXR0cmlicyBhcmUgZW5jbG9zZWQgaW4gIgorICBzdHIgPSByZXBsYWNlX2FsbChzdHIsICJcIiIsICJcXFwiIik7CisKKyAgcmV0dXJuIHN0cjsKK30KKworLy8gWE1MIGVuY29kaW5nIGZvciBkb2MgY29tbWVudHMKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnhtbGRvY19lbmNvZGUoc3RyaW5nIGNvbnRlbnRzKSB7CisgIHN0cmluZyBzdHIoeG1sX2VuY29kZShjb250ZW50cykpOworCisgIC8vIFhNTERvYyBzcGVjaWZpYzogY29udmVydCBsaW5lYnJlYWtzIGludG8gPHBhcmE+Z3JhcGhzPC9wYXJhPgorICBzdHIgPSByZXBsYWNlX2FsbChzdHIsICJcclxuIiwgIlxyIik7CisgIHN0ciA9IHJlcGxhY2VfYWxsKHN0ciwgIlxuIiwgIlxyIik7CisgIHN0ciA9IHJlcGxhY2VfYWxsKHN0ciwgIlxyIiwgIjwvcGFyYT5cbjxwYXJhPiIpOworCisgIHJldHVybiBzdHI7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpIHsKKyAgaWYgKHhtbGRvY18pIHsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInskUkVHSU9OICdYTUxEb2MnfS8vLyA8c3VtbWFyeT5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8vLyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8cGFyYT4iICsgY29udGVudHMgKyAiPC9wYXJhPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8vLyA8L3N1bW1hcnk+XG57JEVORFJFR0lPTn1cbiIpOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfZG9jKG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKKyAgaWYgKHhtbGRvY18pIHsKKyAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgeworICAgICAgc3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSB4bWxkb2NfZW5jb2RlKGZpZWxkLT5nZXRfZG9jKCkpICsgIlxuPHNlZWFsc28gY3JlZj1cIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB4bWxkb2NfZW5jb2RlKHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkpICsgIlwiLz4iOworICAgICAgZ2VuZXJhdGVfZGVscGhpX2RvY3N0cmluZ19jb21tZW50KG91dCwgY29tYmluZWRfbWVzc2FnZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX2RlbHBoaV9kb2Mob3V0LCAodF9kb2MqKWZpZWxkKTsKKyAgICB9CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9kb2Mob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpICYmIHhtbGRvY18pIHsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCB4bWxkb2NfZW5jb2RlKHRkb2MtPmdldF9kb2MoKSkpOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfZG9jKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSAmJiB4bWxkb2NfKSB7CisgICAgc3RyaW5nc3RyZWFtIHBzOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgcHMgPDwgIlxuPHBhcmFtIG5hbWU9XCIiIDw8IHhtbGF0dHJpYl9lbmNvZGUocC0+Z2V0X25hbWUoKSkgPDwgIlwiPiI7CisgICAgICBpZiAocC0+aGFzX2RvYygpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0ciA9IHAtPmdldF9kb2MoKTsKKyAgICAgICAgc3RyLmVyYXNlKHN0ZDo6cmVtb3ZlKHN0ci5iZWdpbigpLCBzdHIuZW5kKCksICdcbicpLAorICAgICAgICAgICAgICAgICAgc3RyLmVuZCgpKTsgLy8gcmVtb3ZlIHRoZSBuZXdsaW5lcyB0aGF0IGFwcGVhciBmcm9tIHRoZSBwYXJzZXIKKyAgICAgICAgcHMgPDwgeG1sZG9jX2VuY29kZShzdHIpOworICAgICAgfQorICAgICAgcHMgPDwgIjwvcGFyYW0+IjsKKyAgICB9CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ7JFJFR0lPTiAnWE1MRG9jJ30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLy8gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1bW1hcnk+PHBhcmE+IiArIHhtbGRvY19lbmNvZGUodGZ1bmN0aW9uLT5nZXRfZG9jKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiPC9wYXJhPjwvc3VtbWFyeT4iICsgcHMuc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInskRU5EUkVHSU9OfVxuIik7CisgIH0KK30KKworYm9vbCB0X2RlbHBoaV9nZW5lcmF0b3I6OmZpbmRfa2V5d29yZChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiYga2V5d29yZF9tYXAsIHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsZW4gPSBuYW1lLmxlbmd0aCgpOworCisgIGlmIChsZW4gPD0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbmxhc3QgPSBuYW1lLmZpbmRfbGFzdF9vZignXycpOworCisgIGlmIChubGFzdCA+PSAxKSB7CisgICAgaWYgKG5sYXN0ID09IChsZW4gLSAxKSkgeworICAgICAgc3RyaW5nIG5ld19uYW1lKG5hbWUsIDAsIG5sYXN0KTsKKyAgICAgIHJldHVybiBmaW5kX2tleXdvcmQoa2V5d29yZF9tYXAsIG5ld19uYW1lKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChrZXl3b3JkX21hcFtuYW1lXSA9PSAxKTsKK30KKworc3RkOjpzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpub3JtYWxpemVfbmFtZShzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZXhjZXB0aW9uX21ldGhvZCkgeworICBzdHJpbmcgdG1wKG5hbWUpOworICBzdGQ6OnRyYW5zZm9ybSh0bXAuYmVnaW4oKSwgdG1wLmVuZCgpLCB0bXAuYmVnaW4oKSwgc3RhdGljX2Nhc3Q8aW50ICgqKShpbnQpPihzdGQ6OnRvbG93ZXIpKTsKKworICBib29sIGJfZm91bmQgPSBmYWxzZTsKKworICBpZiAoZmluZF9rZXl3b3JkKGRlbHBoaV9rZXl3b3JkcywgdG1wKSkgeworICAgIGJfZm91bmQgPSB0cnVlOworICB9IGVsc2UgaWYgKGJfbWV0aG9kICYmIGZpbmRfa2V5d29yZChkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kLCB0bXApKSB7CisgICAgYl9mb3VuZCA9IHRydWU7CisgIH0gZWxzZSBpZiAoYl9leGNlcHRpb25fbWV0aG9kICYmIGZpbmRfa2V5d29yZChkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvbiwgdG1wKSkgeworICAgIGJfZm91bmQgPSB0cnVlOworICB9CisKKyAgaWYgKGJfZm91bmQpIHsKKyAgICByZXR1cm4gbmFtZSArICJfIjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Y3JlYXRlX2tleXdvcmRzKCkgeworICBkZWxwaGlfa2V5d29yZHNbImFuZCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJlbmQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siaW50ZXJmYWNlIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInJhaXNlIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInVzZXMiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siYXJyYXkiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZXhjZXB0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImlzIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInJlY29yZCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ2YXIiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siYXMiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZXhwb3J0cyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJsYWJlbCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJyZXBlYXQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sid2hpbGUiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siYXNtIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImZpbGUiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sibGlicmFyeSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJyZXNvdXJjZXN0cmluZyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ3aXRoIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImJlZ2luIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImZpbmFsaXphdGlvbiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJtb2QiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sic2V0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInhvciJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJjYXNlIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImZpbmFsbHkiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sibmlsIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInNobCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJjbGFzcyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJmb3IiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sibm90Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInNociJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJjb25zdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJmdW5jdGlvbiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJvYmplY3QiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sic3RyaW5nIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImNvbnN0cnVjdG9yIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImdvdG8iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sib2YiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidGhlbiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJkZXN0cnVjdG9yIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImlmIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIm9yIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInRocmVhZHZhciJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJkaXNwaW50ZXJmYWNlIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImltcGxlbWVudGF0aW9uIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIm91dCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0byJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJkaXYiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siaW4iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicGFja2VkIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInRyeSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJkbyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpbmhlcml0ZWQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicHJvY2VkdXJlIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInR5cGUiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZG93bnRvIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImluaXRpYWxpemF0aW9uIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInByb2dyYW0iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidW5pdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJlbHNlIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImlubGluZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJwcm9wZXJ0eSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ1bnRpbCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJwcml2YXRlIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInByb3RlY3RlZCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJwdWJsaWMiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicHVibGlzaGVkIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImF1dG9tYXRlZCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJhdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJvbiJdID0gMTsKKworICAvLyByZXNlcnZlZC9wcmVkZWZpbmVkIHZhcmlhYmxlcyBhbmQgdHlwZXMgKGxvd2VyY2FzZSEpCisgIGRlbHBoaV9rZXl3b3Jkc1sicmVzdWx0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInN5c3RlbSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJzeXN1dGlscyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0aHJpZnQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidGJ5dGVzIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInRvYmplY3QiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidGNsYXNzIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInRpbnRlcmZhY2Vkb2JqZWN0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImFuc2lzdHJpbmciXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sic3RyaW5nIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImJvb2xlYW4iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sic2hvcnRpbnQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sic21hbGxpbnQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siaW50ZWdlciJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpbnQ2NCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJkb3VibGUiXSA9IDE7CisKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY3JlYXRlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJmcmVlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJpbml0aW5zdGFuY2UiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNsZWFudXBpbnN0YW5jZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY2xhc3N0eXBlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjbGFzc25hbWUiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNsYXNzbmFtZWlzIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjbGFzc3BhcmVudCJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY2xhc3NpbmZvIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJpbnN0YW5jZXNpemUiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImluaGVyaXRzZnJvbSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsibWV0aG9kYWRkcmVzcyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsibWV0aG9kYWRkcmVzcyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsibWV0aG9kbmFtZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZmllbGRhZGRyZXNzIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJmaWVsZGFkZHJlc3MiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImdldGludGVyZmFjZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZ2V0aW50ZXJmYWNlZW50cnkiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImdldGludGVyZmFjZXRhYmxlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJ1bml0bmFtZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZXF1YWxzIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJnZXRoYXNoY29kZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsidG9zdHJpbmciXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbInNhZmVjYWxsZXhjZXB0aW9uIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJhZnRlcmNvbnN0cnVjdGlvbiJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiYmVmb3JlZGVzdHJ1Y3Rpb24iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImRpc3BhdGNoIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJkZWZhdWx0aGFuZGxlciJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsibmV3aW5zdGFuY2UiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImZyZWVpbnN0YW5jZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZGVzdHJveSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsicmVhZCJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsid3JpdGUiXSA9IDE7CisKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInNldGlubmVyZXhjZXB0aW9uIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsic2V0c3RhY2tpbmZvIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiZ2V0c3RhY2t0cmFjZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInJhaXNpbmdleGNlcHRpb24iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVmbXQiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVyZXMiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVyZXNmbXQiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVoZWxwIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlZm10aGVscCJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNyZWF0ZXJlc2hlbHAiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVyZXNmbXRoZWxwIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiZ2V0YmFzZWV4Y2VwdGlvbiJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImJhc2VleGNlcHRpb24iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJoZWxwY29udGV4dCJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImlubmVyZXhjZXB0aW9uIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsibWVzc2FnZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInN0YWNrdHJhY2UiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJzdGFja2luZm8iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJnZXRleGNlcHRpb25zdGFja2luZm9wcm9jIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiZ2V0c3RhY2tpbmZvc3RyaW5ncHJvYyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNsZWFudXBzdGFja2luZm9wcm9jIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsicmFpc2VvdXRlcmV4Y2VwdGlvbiJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInRocm93b3V0ZXJleGNlcHRpb24iXSA9IDE7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjphZGRfZGVscGhpX3VzZXNfbGlzdChzdHJpbmcgdW5pdG5hbWUpIHsKKyAgdmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOworICBib29sIGZvdW5kID0gZmFsc2U7CisgIGZvciAoc19pdGVyID0gdXNlc19saXN0LmJlZ2luKCk7IHNfaXRlciAhPSB1c2VzX2xpc3QuZW5kKCk7ICsrc19pdGVyKSB7CisgICAgaWYgKCgqc19pdGVyKSA9PSB1bml0bmFtZSkgeworICAgICAgZm91bmQgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmICghZm91bmQpIHsKKyAgICB1c2VzX2xpc3QucHVzaF9iYWNrKHVuaXRuYW1lKTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIGluZGVudF9pbXBsXyA9IDA7CisgIG5hbWVzcGFjZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJkZWxwaGkiKTsKKyAgaGFzX2ZvcndhcmQgPSBmYWxzZTsKKyAgaGFzX2VudW0gPSBmYWxzZTsKKyAgaGFzX2NvbnN0ID0gZmFsc2U7CisgIGNyZWF0ZV9rZXl3b3JkcygpOworCisgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJDbGFzc2VzIik7CisgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJTeXNVdGlscyIpOworICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiR2VuZXJpY3MuQ29sbGVjdGlvbnMiKTsKKyAgaWYoYXN5bmNfKSB7CisgICAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlN5c3RlbS5UaHJlYWRpbmciKTsKKyAgfQorCisgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQiKTsKKyAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdC5VdGlscyIpOworICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiVGhyaWZ0LkNvbGxlY3Rpb25zIik7CisgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQuUHJvdG9jb2wiKTsKKyAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdC5UcmFuc3BvcnQiKTsKKyAgaWYgKHJlZ2lzdGVyX3R5cGVzXykgeworICAgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQuVHlwZVJlZ2lzdHJ5Iik7CisgIH0KKworICBpbml0X2tub3duX3R5cGVzX2xpc3QoKTsKKworICBzdHJpbmcgdW5pdG5hbWUsIG5zbmFtZTsKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIHVuaXRuYW1lID0gaW5jbHVkZXNbaV0tPmdldF9uYW1lKCk7CisgICAgbnNuYW1lID0gaW5jbHVkZXNbaV0tPmdldF9uYW1lc3BhY2UoImRlbHBoaSIpOworICAgIGlmICgiIiAhPSBuc25hbWUpIHsKKyAgICAgIHVuaXRuYW1lID0gbm9ybWFsaXplX25hbWUobnNuYW1lKTsKKyAgICB9CisgICAgYWRkX2RlbHBoaV91c2VzX2xpc3QodW5pdG5hbWUpOworICB9CisKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgc3RkOjpzdHJpbmcgdW5pdG5hbWUgPSBwcm9ncmFtX25hbWVfOworICBpZiAoIiIgIT0gbmFtZXNwYWNlX25hbWVfKSB7CisgICAgdW5pdG5hbWUgPSBuYW1lc3BhY2VfbmFtZV87CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpdW5pdG5hbWUuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAodW5pdG5hbWVbaV0gPT0gJyAnKSB7CisgICAgICB1bml0bmFtZS5yZXBsYWNlKGksIDEsICJfIik7CisgICAgfQorICB9CisKKyAgdW5pdG5hbWUgPSBub3JtYWxpemVfbmFtZSh1bml0bmFtZSk7CisgIAorICBzdGQ6OnN0cmluZyBmX25hbWUgPSBnZXRfb3V0X2RpcigpICsgIi8iICsgdW5pdG5hbWUgKyAiLnBhcyI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9hbGw7CisKKyAgZl9hbGwub3BlbihmX25hbWUuY19zdHIoKSk7CisKKyAgZl9hbGwgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfZGVscGhpX2RvYyhmX2FsbCwgcHJvZ3JhbV8pOworICBmX2FsbCA8PCAidW5pdCAiIDw8IHVuaXRuYW1lIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfYWxsIDw8ICJpbnRlcmZhY2UiIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9hbGwgPDwgInVzZXMiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgdmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOworICBmb3IgKHNfaXRlciA9IHVzZXNfbGlzdC5iZWdpbigpOyBzX2l0ZXIgIT0gdXNlc19saXN0LmVuZCgpOyArK3NfaXRlcikgeworICAgIGlmIChzX2l0ZXIgIT0gdXNlc19saXN0LmJlZ2luKCkpIHsKKyAgICAgIGZfYWxsIDw8ICIsIjsKKyAgICAgIGZfYWxsIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChmX2FsbCkgPDwgKnNfaXRlcjsKKyAgfQorCisgIGZfYWxsIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBzdHJpbmcgdG1wX3VuaXQodW5pdG5hbWUpOworICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpdG1wX3VuaXQuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAodG1wX3VuaXRbaV0gPT0gJy4nKSB7CisgICAgICB0bXBfdW5pdC5yZXBsYWNlKGksIDEsICJfIik7CisgICAgfQorICB9CisKKyAgZl9hbGwgPDwgImNvbnN0IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfYWxsKSA8PCAiYyIgPDwgdG1wX3VuaXQKKyAgICAgICAgICAgICAgICA8PCAiX09wdGlvbl9BbnNpU3RyX0JpbmFyeSA9ICIgPDwgKGFuc2lzdHJfYmluYXJ5XyA/ICJUcnVlIiA6ICJGYWxzZSIpIDw8ICI7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChmX2FsbCkgPDwgImMiIDw8IHRtcF91bml0CisgICAgICAgICAgICAgICAgPDwgIl9PcHRpb25fUmVnaXN0ZXJfVHlwZXMgPSAiIDw8IChyZWdpc3Rlcl90eXBlc18gPyAiVHJ1ZSIgOiAiRmFsc2UiKSA8PCAiOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9hbGwpIDw8ICJjIiA8PCB0bXBfdW5pdAorICAgICAgICAgICAgICAgIDw8ICJfT3B0aW9uX0NvbnN0UHJlZml4ICAgID0gIiA8PCAoY29uc3RwcmVmaXhfID8gIlRydWUiIDogIkZhbHNlIikgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChmX2FsbCkgPDwgImMiIDw8IHRtcF91bml0IDw8ICJfT3B0aW9uX0V2ZW50cyAgICAgICAgID0gIiA8PCAoZXZlbnRzXyA/ICJUcnVlIiA6ICJGYWxzZSIpCisgICAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChmX2FsbCkgPDwgImMiIDw8IHRtcF91bml0IDw8ICJfT3B0aW9uX1htbERvYyAgICAgICAgID0gIiA8PCAoeG1sZG9jXyA/ICJUcnVlIiA6ICJGYWxzZSIpCisgICAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgZl9hbGwgPDwgZW5kbDsKKyAgZl9hbGwgPDwgInR5cGUiIDw8IGVuZGw7CisgIGlmIChoYXNfZm9yd2FyZCkgeworICAgIGZfYWxsIDw8IHNfZm9yd2FyZF9kZWNyLnN0cigpIDw8IGVuZGw7CisgIH0KKyAgaWYgKGhhc19lbnVtKSB7CisgICAgaW5kZW50KGZfYWxsKSA8PCBlbmRsOworICAgIGluZGVudChmX2FsbCkgPDwgInskU0NPUEVERU5VTVMgT059IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgZl9hbGwgPDwgc19lbnVtLnN0cigpOworICAgIGluZGVudChmX2FsbCkgPDwgInskU0NPUEVERU5VTVMgT0ZGfSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisgIGZfYWxsIDw8IHNfc3RydWN0LnN0cigpOworICBmX2FsbCA8PCBzX3NlcnZpY2Uuc3RyKCk7CisgIGZfYWxsIDw8IHNfY29uc3Quc3RyKCk7CisgIGZfYWxsIDw8ICJpbXBsZW1lbnRhdGlvbiIgPDwgZW5kbCA8PCBlbmRsOworICBmX2FsbCA8PCBzX3N0cnVjdF9pbXBsLnN0cigpOworICBmX2FsbCA8PCBzX3NlcnZpY2VfaW1wbC5zdHIoKTsKKyAgZl9hbGwgPDwgc19jb25zdF9pbXBsLnN0cigpOworCisgIGlmIChyZWdpc3Rlcl90eXBlc18pIHsKKyAgICBmX2FsbCA8PCBlbmRsOworICAgIGZfYWxsIDw8ICIvLyBUeXBlIGZhY3RvcnkgbWV0aG9kcyBhbmQgcmVnaXN0cmF0aW9uIiA8PCBlbmRsOworICAgIGZfYWxsIDw8IHNfdHlwZV9mYWN0b3J5X2Z1bmNzLnN0cigpOworICAgIGZfYWxsIDw8ICJwcm9jZWR1cmUgUmVnaXN0ZXJUeXBlRmFjdG9yaWVzOyIgPDwgZW5kbDsKKyAgICBmX2FsbCA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgZl9hbGwgPDwgc190eXBlX2ZhY3RvcnlfcmVnaXN0cmF0aW9uLnN0cigpOworICAgIGZfYWxsIDw8ICJlbmQ7IiA8PCBlbmRsOworICB9CisgIGZfYWxsIDw8IGVuZGw7CisKKyAgc3RyaW5nIGNvbnN0YW50c19jbGFzcyA9IG1ha2VfY29uc3RhbnRzX2NsYXNzbmFtZSgpOworCisgIGZfYWxsIDw8ICJpbml0aWFsaXphdGlvbiIgPDwgZW5kbDsKKyAgaWYgKGhhc19jb25zdCkgeworICAgIGZfYWxsIDw8ICJ7JElGIENvbXBpbGVyVmVyc2lvbiA8IDIxLjB9ICAvLyBEMjAxMCIgPDwgZW5kbDsKKyAgICBmX2FsbCA8PCAiICAiIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICJfSW5pdGlhbGl6ZTsiIDw8IGVuZGw7CisgICAgZl9hbGwgPDwgInskSUZFTkR9IiA8PCBlbmRsOworICB9CisgIGlmIChyZWdpc3Rlcl90eXBlc18pIHsKKyAgICBmX2FsbCA8PCAiICBSZWdpc3RlclR5cGVGYWN0b3JpZXM7IiA8PCBlbmRsOworICB9CisgIGZfYWxsIDw8IGVuZGw7CisKKyAgZl9hbGwgPDwgImZpbmFsaXphdGlvbiIgPDwgZW5kbDsKKyAgaWYgKGhhc19jb25zdCkgeworICAgIGZfYWxsIDw8ICJ7JElGIENvbXBpbGVyVmVyc2lvbiA8IDIxLjB9ICAvLyBEMjAxMCIgPDwgZW5kbDsKKyAgICBmX2FsbCA8PCAiICAiIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICJfRmluYWxpemU7IiA8PCBlbmRsOworICAgIGZfYWxsIDw8ICJ7JElGRU5EfSIgPDwgZW5kbDsKKyAgfQorICBmX2FsbCA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9hbGwgPDwgImVuZC4iIDw8IGVuZGw7CisgIGZfYWxsLmNsb3NlKCk7CisKKyAgaWYgKCF0eXBlZGVmc19wZW5kaW5nLmVtcHR5KCkpIHsKKyAgICBwd2FybmluZygwLCAiJWQgdHlwZWRlZnMgd2l0aCB1bnJlc29sdmVkIHR5cGUgcmVmZXJlbmNlcyBsZWZ0OlxuIiwgdHlwZWRlZnNfcGVuZGluZy5zaXplKCkpOworICAgIGZvciAoc3RkOjpsaXN0PHRfdHlwZWRlZio+OjppdGVyYXRvciBpdGVyID0gdHlwZWRlZnNfcGVuZGluZy5iZWdpbigpOworICAgICAgICAgdHlwZWRlZnNfcGVuZGluZy5lbmQoKSAhPSBpdGVyOworICAgICAgICAgKytpdGVyKSB7CisgICAgICBwd2FybmluZygwLCAiLSAlc1xuIiwgKCppdGVyKS0+Z2V0X3N5bWJvbGljKCkuY19zdHIoKSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpkZWxwaGlfdHlwZV91c2luZ3Mob3N0cmVhbSYgb3V0KSB7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiQ2xhc3NlcywgU3lzVXRpbHMsIEdlbmVyaWNzLkNvbGxlY3Rpb25zLCBUaHJpZnQuQ29sbGVjdGlvbnMsIFRocmlmdC5Qcm90b2NvbCwiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJUaHJpZnQuVHJhbnNwb3J0OyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCkgeworICAvLyBGb3J3YXJkIGRlY2xhcmUgc3RydWN0IGRlZgorICBoYXNfZm9yd2FyZCA9IHRydWU7CisgIHB2ZXJib3NlKCJmb3J3YXJkIGRlY2xhcmF0aW9uIG9mICVzXG4iLCB0eXBlX25hbWUodHN0cnVjdCkuY19zdHIoKSk7CisKKyAgc3RyaW5nIHdoYXQgPSB0c3RydWN0LT5pc194Y2VwdGlvbigpID8gImNsYXNzIiA6ICJpbnRlcmZhY2UiOworCisgIGluZGVudF91cCgpOworICBpbmRlbnQoc19mb3J3YXJkX2RlY3IpIDw8IHR5cGVfbmFtZSh0c3RydWN0LCB0c3RydWN0LT5pc194Y2VwdGlvbigpLCB0cnVlKSA8PCAiID0gIiA8PCB3aGF0IDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgYWRkX2RlZmluZWRfdHlwZSh0c3RydWN0KTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICB0X3R5cGUqIHR5cGUgPSB0dHlwZWRlZi0+Z2V0X3R5cGUoKTsKKworICAvLyB3cml0ZSBub3cgb3Igc2F2ZSBmb3IgbGF0ZXI/CisgIGlmICghaXNfZnVsbHlfZGVmaW5lZF90eXBlKHR5cGUpKSB7CisgICAgcHZlcmJvc2UoInR5cGVkZWYgJXM6IHVucmVzb2x2ZWQgZGVwZW5kZW5jaWVzIGZvdW5kXG4iLCB0eXBlX25hbWUodHR5cGVkZWYpLmNfc3RyKCkpOworICAgIHR5cGVkZWZzX3BlbmRpbmcucHVzaF9iYWNrKHR0eXBlZGVmKTsKKyAgICByZXR1cm47CisgIH0KKworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3N0cnVjdCwgdHR5cGVkZWYpOworICBpbmRlbnQoc19zdHJ1Y3QpIDw8IHR5cGVfbmFtZSh0dHlwZWRlZikgPDwgIiA9ICI7CisKKyAgLy8gY29tbWVudGVkIG91dDogdGhlIGJlbmVmaXQgaXMgbm90IGJpZyBlbm91Z2ggdG8gcmlzayBicmVha2luZyBleGlzdGluZyBjb2RlCisgIC8vIGJvb2wgY29udGFpbmVyID0gdHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX21hcCgpIHx8IHR5cGUtPmlzX3NldCgpOworICAvLyBpZiggISBjb250YWluZXIpCisgIC8vICBzX3N0cnVjdCA8PCAidHlwZSAiOyAgLy90aGUgInR5cGUgQSA9IHR5cGUgQiIgc3ludGF4IGxlYWRzIHRvIEUyNTc0IHdpdGggZ2VuZXJpY3MKKworICBzX3N0cnVjdCA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgYWRkX2RlZmluZWRfdHlwZSh0dHlwZWRlZik7Cit9CisKK2Jvb2wgdF9kZWxwaGlfZ2VuZXJhdG9yOjppc19mdWxseV9kZWZpbmVkX3R5cGUodF90eXBlKiB0dHlwZSkgeworICBpZiAoKE5VTEwgIT0gdHR5cGUtPmdldF9wcm9ncmFtKCkpICYmICh0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBwcm9ncmFtXykpIHsKKyAgICB0X3Njb3BlKiBzY29wZSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5zY29wZSgpOworICAgIGlmIChOVUxMICE9IHNjb3BlLT5nZXRfdHlwZSh0dHlwZS0+Z2V0X25hbWUoKSkpIHsKKyAgICAgIC8vIHByaW50ZigidHlwZSAlcyBmb3VuZCBpbiBpbmNsdWRlZCBzY29wZSAlc1xuIiwgdHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgIC8vIHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gKDEgPT0gdHlwZXNfa25vd25bdHlwZV9uYW1lKHR0eXBlKV0pOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiAoMSA9PSB0eXBlc19rbm93bltiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlKV0pOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gdHJ1ZTsgLy8gZW51bXMgYXJlIHdyaXR0ZW4gZmlyc3QsIGJlZm9yZSBhbGwgb3RoZXIgdHlwZXMKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgcmV0dXJuIGlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgICAgICAgJiYgaXNfZnVsbHlfZGVmaW5lZF90eXBlKHRtYXAtPmdldF92YWxfdHlwZSgpKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgcmV0dXJuIGlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7CisgICAgcmV0dXJuIGlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgfQorCisgIHJldHVybiAoMSA9PSB0eXBlc19rbm93blt0eXBlX25hbWUodHR5cGUpXSk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjphZGRfZGVmaW5lZF90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgLy8gbWFyayBhcyBrbm93biB0eXBlCisgIHR5cGVzX2tub3duW3R5cGVfbmFtZSh0dHlwZSldID0gMTsKKworICAvLyBjaGVjayBhbGwgcGVuZGluZyB0eXBlZGVmcworICBzdGQ6Omxpc3Q8dF90eXBlZGVmKj46Oml0ZXJhdG9yIGl0ZXI7CisgIGJvb2wgbW9yZSA9IHRydWU7CisgIHdoaWxlIChtb3JlICYmICghdHlwZWRlZnNfcGVuZGluZy5lbXB0eSgpKSkgeworICAgIG1vcmUgPSBmYWxzZTsKKworICAgIGZvciAoaXRlciA9IHR5cGVkZWZzX3BlbmRpbmcuYmVnaW4oKTsgdHlwZWRlZnNfcGVuZGluZy5lbmQoKSAhPSBpdGVyOyArK2l0ZXIpIHsKKyAgICAgIHRfdHlwZWRlZiogdHR5cGVkZWYgPSAoKml0ZXIpOworICAgICAgaWYgKGlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgcHZlcmJvc2UoInR5cGVkZWYgJXM6IGFsbCBwZW5kaW5nIHJlZmVyZW5jZXMgYXJlIG5vdyByZXNvbHZlZFxuIiwKKyAgICAgICAgICAgICAgICAgdHlwZV9uYW1lKHR0eXBlZGVmKS5jX3N0cigpKTsKKyAgICAgICAgdHlwZWRlZnNfcGVuZGluZy5lcmFzZShpdGVyKTsKKyAgICAgICAgZ2VuZXJhdGVfdHlwZWRlZih0dHlwZWRlZik7CisgICAgICAgIG1vcmUgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmluaXRfa25vd25fdHlwZXNfbGlzdCgpIHsKKyAgLy8ga25vd24gYmFzZSB0eXBlcworICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX3N0cmluZyldID0gMTsKKyAgdHlwZXNfa25vd25bdHlwZV9uYW1lKGdfdHlwZV9iaW5hcnkpXSA9IDE7CisgIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfYm9vbCldID0gMTsKKyAgdHlwZXNfa25vd25bdHlwZV9uYW1lKGdfdHlwZV9pOCldID0gMTsKKyAgdHlwZXNfa25vd25bdHlwZV9uYW1lKGdfdHlwZV9pMTYpXSA9IDE7CisgIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfaTMyKV0gPSAxOworICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX2k2NCldID0gMTsKKyAgdHlwZXNfa25vd25bdHlwZV9uYW1lKGdfdHlwZV9kb3VibGUpXSA9IDE7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgaGFzX2VudW0gPSB0cnVlOworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX2VudW0sIHRlbnVtKTsKKyAgaW5kZW50KHNfZW51bSkgPDwgdHlwZV9uYW1lKHRlbnVtLCB0cnVlLCB0cnVlKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICA8PCAiKCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICBpZiAoY29uc3RhbnRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQoc19lbnVtKSA8PCAiZHVtbXkgPSAwICAvLyBlbXB0eSBlbnVtcyBhcmUgbm90IGFsbG93ZWQiOworICB9IGVsc2UgeworICAgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICAgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgICAgaWYgKGNfaXRlciAhPSBjb25zdGFudHMuYmVnaW4oKSkgeworICAgICAgICBzX2VudW0gPDwgIiwiOworICAgICAgICBzX2VudW0gPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19lbnVtLCAqY19pdGVyKTsKKyAgICAgIGluZGVudChzX2VudW0pIDw8IG5vcm1hbGl6ZV9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9ICIgPDwgdmFsdWU7CisgICAgfQorICB9CisgIHNfZW51bSA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoc19lbnVtKSA8PCAiKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworc3RkOjpzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjptYWtlX3ZhbGlkX2RlbHBoaV9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSkgeworICBzdGQ6OnN0cmluZyBzdHIgPSBmcm9tTmFtZTsKKyAgaWYgKHN0ci5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHN0cjsKKyAgfQorCisgIC8vIHRlc3RzIHJlbHkgb24gdGhpcworICBhc3NlcnQoKCdBJyA8ICdaJykgJiYgKCdhJyA8ICd6JykgJiYgKCcwJyA8ICc5JykpOworCisgIC8vIGlmIHRoZSBmaXJzdCBsZXR0ZXIgaXMgYSBudW1iZXIsIHdlIGFkZCBhbiBhZGRpdGlvbmFsIHVuZGVyc2NvcmUgaW4gZnJvbnQgb2YgaXQKKyAgY2hhciBjID0gc3RyLmF0KDApOworICBpZiAoKCcwJyA8PSBjKSAmJiAoYyA8PSAnOScpKSB7CisgICAgc3RyID0gIl8iICsgc3RyOworICB9CisKKyAgLy8gZm9sbG93aW5nIGNoYXJzOiBsZXR0ZXIsIG51bWJlciBvciB1bmRlcnNjb3JlCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgKytpKSB7CisgICAgYyA9IHN0ci5hdChpKTsKKyAgICBpZiAoKCgnQScgPiBjKSB8fCAoYyA+ICdaJykpICYmICgoJ2EnID4gYykgfHwgKGMgPiAneicpKSAmJiAoKCcwJyA+IGMpIHx8IChjID4gJzknKSkKKyAgICAgICAgJiYgKCdfJyAhPSBjKSkgeworICAgICAgc3RyLnJlcGxhY2UoaSwgMSwgIl8iKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RyOworfQorCitzdGQ6OnN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6Om1ha2VfY29uc3RhbnRzX2NsYXNzbmFtZSgpIHsKKyAgaWYgKGNvbnN0cHJlZml4XykgeworICAgIHJldHVybiBtYWtlX3ZhbGlkX2RlbHBoaV9pZGVudGlmaWVyKCJUIiArIHByb2dyYW1fbmFtZV8gKyAiQ29uc3RhbnRzIik7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuICJUQ29uc3RhbnRzIjsgLy8gY29tcGF0aWJpbGl0eQorICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBoYXNfY29uc3QgPSB0cnVlOworICBzdHJpbmcgY29uc3RhbnRzX2NsYXNzID0gbWFrZV9jb25zdGFudHNfY2xhc3NuYW1lKCk7CisKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChzX2NvbnN0KSA8PCBjb25zdGFudHNfY2xhc3MuY19zdHIoKSA8PCAiID0gY2xhc3MiIDw8IGVuZGw7CisgIGluZGVudChzX2NvbnN0KSA8PCAicHJpdmF0ZSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpZiAoY29uc3RfbmVlZHNfdmFyKCgqY19pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIHByaW50X3ByaXZhdGVfZmllbGQoc19jb25zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplX25hbWUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KHNfY29uc3QpIDw8ICJwdWJsaWMiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19jb25zdCwgKmNfaXRlcik7CisgICAgcHJpbnRfY29uc3RfcHJvcChzX2NvbnN0LAorICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplX25hbWUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICB9CisgIGluZGVudChzX2NvbnN0KSA8PCAieyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0iIDw8IGVuZGw7CisgIGluZGVudChzX2NvbnN0KSA8PCAiY2xhc3MgY29uc3RydWN0b3IgQ3JlYXRlOyIgPDwgZW5kbDsKKyAgaW5kZW50KHNfY29uc3QpIDw8ICJjbGFzcyBkZXN0cnVjdG9yIERlc3Ryb3k7IiA8PCBlbmRsOworICBpbmRlbnQoc19jb25zdCkgPDwgInskSUZFTkR9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoc19jb25zdCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gdmFycywgY29kZTsKKworICBpbmRlbnRfdXBfaW1wbCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGluaXRpYWxpemVfZmllbGQodmFycywKKyAgICAgICAgICAgICAgICAgICAgIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAiRiIgKyBwcm9wX25hbWUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICB9CisgIGluZGVudF9kb3duX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJ7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfSIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiY2xhc3MgY29uc3RydWN0b3IgIiA8PCBjb25zdGFudHNfY2xhc3MuY19zdHIoKSA8PCAiLkNyZWF0ZTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBpZiAoIXZhcnMuc3RyKCkuZW1wdHkoKSkgeworICAgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKKyAgICBzX2NvbnN0X2ltcGwgPDwgdmFycy5zdHIoKTsKKyAgfQorICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaWYgKCFjb2RlLnN0cigpLmVtcHR5KCkpIHsKKyAgICBzX2NvbnN0X2ltcGwgPDwgY29kZS5zdHIoKTsKKyAgfQorICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImNsYXNzIGRlc3RydWN0b3IgIiA8PCBjb25zdGFudHNfY2xhc3MuY19zdHIoKSA8PCAiLkRlc3Ryb3k7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGlmIChjb25zdF9uZWVkc192YXIoKCpjX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgZmluYWxpemVfZmllbGQoc19jb25zdF9pbXBsLAorICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplX25hbWUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgIH0KKyAgfQorICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJpbmhlcml0ZWQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInskRUxTRX0iIDw8IGVuZGw7CisKKyAgdmFycy5zdHIoIiIpOworICBjb2RlLnN0cigiIik7CisKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpZiAoY29uc3RfbmVlZHNfdmFyKCgqY19pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIGluaXRpYWxpemVfZmllbGQodmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnRzX2NsYXNzICsgIi5GIiArIHByb3BfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgIH0KKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAicHJvY2VkdXJlICIgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIl9Jbml0aWFsaXplOyIgPDwgZW5kbDsKKyAgaWYgKCF2YXJzLnN0cigpLmVtcHR5KCkpIHsKKyAgICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJ2YXIiIDw8IGVuZGw7CisgICAgc19jb25zdF9pbXBsIDw8IHZhcnMuc3RyKCk7CisgIH0KKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGlmICghY29kZS5zdHIoKS5lbXB0eSgpKSB7CisgICAgc19jb25zdF9pbXBsIDw8IGNvZGUuc3RyKCk7CisgIH0KKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInByb2NlZHVyZSAiIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICJfRmluYWxpemU7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBmaW5hbGl6ZV9maWVsZChzX2NvbnN0X2ltcGwsCisgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplX25hbWUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICBjb25zdGFudHNfY2xhc3MpOworICB9CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAieyRJRkVORH0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X2RlZl92YWx1ZShzdGQ6Om9zdHJlYW0mIHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19ubSkgeworCisgIHN0cmluZyBjbHNfcHJlZml4OworCisgIGlmIChjbHNfbm0gPT0gIiIpIHsKKyAgICBjbHNfcHJlZml4ID0gIiI7CisgIH0gZWxzZSB7CisgICAgY2xzX3ByZWZpeCA9IGNsc19ubSArICIuIjsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUodmFycywgb3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IGNsc19wcmVmaXggPDwgbm9ybWFsaXplX25hbWUobmFtZSkgPDwgIi4iCisgICAgICAgICAgICAgICAgICAgICAgIDw8IHByb3BfbmFtZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCksIHR5cGUtPmlzX3hjZXB0aW9uKCkpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgOj0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUodmFycywgb3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgY2xzX3ByZWZpeCA8PCBub3JtYWxpemVfbmFtZShuYW1lKSA8PCAiWyIgPDwga2V5IDw8ICJdIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIDo9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUodmFycywgb3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IGNsc19wcmVmaXggPDwgbm9ybWFsaXplX25hbWUobmFtZSkgPDwgIi5BZGQoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJpbnRfcHJpdmF0ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgKHZvaWQpdmFsdWU7CisgIGluZGVudChvdXQpIDw8ICJjbGFzcyB2YXIgRiIgPDwgbmFtZSA8PCAiOiAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiOyIgPDwgZW5kbDsKK30KKworYm9vbCB0X2RlbHBoaV9nZW5lcmF0b3I6OmNvbnN0X25lZWRzX3Zhcih0X3R5cGUqIHR5cGUpIHsKKyAgdF90eXBlKiB0cnVldHlwZSA9IHR5cGU7CisgIHdoaWxlICh0cnVldHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHJ1ZXR5cGUgPSAoKHRfdHlwZWRlZiopdHJ1ZXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisgIHJldHVybiAoIXRydWV0eXBlLT5pc19iYXNlX3R5cGUoKSk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcmludF9jb25zdF9wcm9wKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICAodm9pZCl2YWx1ZTsKKyAgaWYgKGNvbnN0X25lZWRzX3Zhcih0eXBlKSkgeworICAgIGluZGVudChvdXQpIDw8ICJjbGFzcyBwcm9wZXJ0eSAiIDw8IG5hbWUgPDwgIjogIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiByZWFkIEYiIDw8IG5hbWUgPDwgIjsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gdmFyczsgLy8gZHVtbXkKKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUodmFycywgb3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgaW5kZW50KG91dCkgPDwgImNvbnN0ICIgPDwgbmFtZSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiB2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICB0X3R5cGUqIHRydWV0eXBlID0gdHlwZTsKKyAgd2hpbGUgKHRydWV0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0cnVldHlwZSA9ICgodF90eXBlZGVmKil0cnVldHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAodHJ1ZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgLy8gYWxyZWFkeSBkb25lCisgICAgLy8gc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKCB2YXJzLCBvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgICAvLyBpbmRlbnRfaW1wbChvdXQpIDw8IG5hbWUgPDwgIiA6PSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8IG5hbWUgPDwgIiA6PSAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLiIgPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHR5cG5hbWU7CisgICAgdHlwbmFtZSA9IHR5cGVfbmFtZSh0cnVldHlwZSwgdHJ1ZSwgZmFsc2UsIHR5cGUtPmlzX3hjZXB0aW9uKCksIHR5cGUtPmlzX3hjZXB0aW9uKCkpOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgbmFtZSA8PCAiIDo9ICIgPDwgdHlwbmFtZSA8PCAiLkNyZWF0ZTsiIDw8IGVuZGw7CisgICAgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwgdHJ1ZXR5cGUsIHZhbHVlKTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6aW5pdGlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgcHJpbnRfY29uc3RfdmFsdWUodmFycywgb3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpmaW5hbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19ubSkgeworICAodm9pZClvdXQ7CisgICh2b2lkKW5hbWU7CisgICh2b2lkKXR5cGU7CisgICh2b2lkKXZhbHVlOworICAodm9pZCljbHNfbm07Cit9CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiB2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgKHZvaWQpbmFtZTsKKworICB0X3R5cGUqIHRydWV0eXBlID0gdHlwZTsKKyAgd2hpbGUgKHRydWV0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0cnVldHlwZSA9ICgodF90eXBlZGVmKil0cnVldHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0cnVldHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHJ1ZXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAiJyIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAiJyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gIlRydWUiIDogIkZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmVuZGVyIDw8ICJTaG9ydEludCggIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJlbmRlciA8PCAiU21hbGxJbnQoICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZW5kZXIgPDwgIkxvbmdJbnQoICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgIkludDY0KCAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIuMCI7IC8vIG1ha2UgaXQgYSBkb3VibGUgY29uc3RhbnQgYnkgYWRkaW5nICIuMCIKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmVuZGVyIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOworICAgIHZhcnMgPDwgIiAgIiA8PCB0IDw8ICIgOiAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBwcmludF9jb25zdF92YWx1ZSh2YXJzLCBvdXQsIHQsIHR5cGUsIHZhbHVlKTsKKyAgICByZW5kZXIgPDwgdDsKKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2RlZmluaXRpb24oc19zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIGluZGVudF9kb3duKCk7CisKKyAgYWRkX2RlZmluZWRfdHlwZSh0c3RydWN0KTsKKworICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2ltcGwoc19zdHJ1Y3RfaW1wbCwgIiIsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIGlmIChyZWdpc3Rlcl90eXBlc18pIHsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeShzX3R5cGVfZmFjdG9yeV9mdW5jcywgIiIsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3RvcnlfcmVnaXN0cmF0aW9uKHNfdHlwZV9mYWN0b3J5X3JlZ2lzdHJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4Y2VwdGlvbik7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSkgeworCisgIGlmIChpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7CisgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9pbXBsKG91dCwgY2xzX3ByZWZpeCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCBpc19yZXN1bHQsIHRydWUpOworICB9CisKKyAgc3RyaW5nIGNsc19ubTsKKworICBzdHJpbmcgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZTsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA9IG5vcm1hbGl6ZV9jbHNubSh0c3RydWN0LT5nZXRfbmFtZSgpLCAiIiwgdHJ1ZSkgKyAiRmFjdG9yeSI7CisgIH0KKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsICghaXNfeF9mYWN0b3J5KSwgaXNfeF9mYWN0b3J5LCB0cnVlKTsKKyAgfSBlbHNlIHsKKyAgICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UpOworICB9CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHZhcnMsIGNvZGU7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBpbmRlbnRfdXBfaW1wbCgpOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIHdoaWxlICh0LT5pc190eXBlZGVmKCkpIHsKKyAgICAgIHQgPSAoKHRfdHlwZWRlZiopdCktPmdldF90eXBlKCk7CisgICAgfQorICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIGluaXRpYWxpemVfZmllbGQodmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkYiICsgcHJvcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgaXNfZXhjZXB0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBpbmRlbnRfaW1wbChjb2RlKSA8PCAiRl9faXNzZXRfIiA8PCBwcm9wX25hbWUoKCptX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIgOj0gVHJ1ZTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisgIGluZGVudF9kb3duX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJjb25zdHJ1Y3RvciAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuIgorICAgICAgICAgICAgICAgICAgIDw8ICJDcmVhdGU7IiA8PCBlbmRsOworCisgIGlmICghdmFycy5zdHIoKS5lbXB0eSgpKSB7CisgICAgb3V0IDw8ICJ2YXIiIDw8IGVuZGw7CisgICAgb3V0IDw8IHZhcnMuc3RyKCk7CisgIH0KKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaWYgKGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpbmhlcml0ZWQgQ3JlYXRlKCcnKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaW5oZXJpdGVkOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmICghY29kZS5zdHIoKS5lbXB0eSgpKSB7CisgICAgb3V0IDw8IGNvZGUuc3RyKCk7CisgIH0KKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoKG1lbWJlcnMuc2l6ZSgpID4gMCkgJiYgaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImNvbnN0cnVjdG9yICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi4iCisgICAgICAgICAgICAgICAgICAgICA8PCAiQ3JlYXRlKCIgPDwgY29uc3RydWN0b3JfYXJndW1lbnRfbGlzdCh0c3RydWN0LCBpbmRlbnRfaW1wbCgpKSA8PCAiKTsiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiQ3JlYXRlOyIgPDwgZW5kbDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBzdHJpbmcgcHJvcG5hbWUgPSBwcm9wX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCBpc19leGNlcHRpb24pOworICAgICAgc3RyaW5nIHBhcmFtX25hbWUgPSBjb25zdHJ1Y3Rvcl9wYXJhbV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHByb3BuYW1lIDw8ICIgOj0gIiA8PCBwYXJhbV9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJVcGRhdGVNZXNzYWdlUHJvcGVydHk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJkZXN0cnVjdG9yICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi4iCisgICAgICAgICAgICAgICAgICAgPDwgIkRlc3Ryb3k7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIHdoaWxlICh0LT5pc190eXBlZGVmKCkpIHsKKyAgICAgIHQgPSAoKHRfdHlwZWRlZiopdCktPmdldF90eXBlKCk7CisgICAgfQorICAgIGZpbmFsaXplX2ZpZWxkKG91dCwgcHJvcF9uYW1lKCptX2l0ZXIsIGlzX2V4Y2VwdGlvbiksIHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICB9CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiaW5oZXJpdGVkOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmdW5jdGlvbiAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lCisgICAgICAgICAgICAgICAgICAgICA8PCAiOiBJIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgRiIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiID0gbmlsIiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgInRoZW4gRiIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiIDo9IFQiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIkltcGwuQ3JlYXRlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAicmVzdWx0IDo9IEYiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAicHJvY2VkdXJlICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi4iCisgICAgICAgICAgICAgICAgICAgICA8PCAiQ2xlYXJVbmlvblZhbHVlczsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X3R5cGUqIHQgPSAoKm1faXRlciktPmdldF90eXBlKCk7CisgICAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKSB7CisgICAgICAgIHQgPSAoKHRfdHlwZWRlZiopdCktPmdldF90eXBlKCk7CisgICAgICB9CisKKyAgICAgIGdlbmVyYXRlX2RlbHBoaV9jbGVhcl91bmlvbl92YWx1ZShvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHNfbm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHN0cnVjdC0+aXNfdW5pb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc194X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSk7CisgICAgfQorICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIHdoaWxlICh0LT5pc190eXBlZGVmKCkpIHsKKyAgICAgIHQgPSAoKHRfdHlwZWRlZiopdCktPmdldF90eXBlKCk7CisgICAgfQorICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfaW1wbChvdXQsIGNsc19wcmVmaXgsIGNsc19ubSwgdCwgKm1faXRlciwgIkYiLCBpc19leGNlcHRpb24pOworICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfaW1wbChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsc19ubSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1faXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzdHJ1Y3QtPmlzX3VuaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3hfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSk7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGdlbmVyYXRlX2RlbHBoaV9pc3NldF9yZWFkZXJfaW1wbChvdXQsIGNsc19wcmVmaXgsIGNsc19ubSwgdCwgKm1faXRlciwgIkYiLCBpc19leGNlcHRpb24pOworICAgIH0KKyAgfQorCisgIGlmICgoIWlzX2V4Y2VwdGlvbikgfHwgaXNfeF9mYWN0b3J5KSB7CisgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZWFkZXJfaW1wbChvdXQsIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgICAgaWYgKGlzX3Jlc3VsdCkgeworICAgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZXN1bHRfd3JpdGVyX2ltcGwob3V0LCBjbHNfcHJlZml4LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3dyaXRlcl9pbXBsKG91dCwgY2xzX3ByZWZpeCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgICB9CisgIH0KKyAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF90b3N0cmluZ19pbXBsKG91dCwgY2xzX3ByZWZpeCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCBpc194X2ZhY3RvcnkpOworCisgIGlmIChpc19leGNlcHRpb24gJiYgaXNfeF9mYWN0b3J5KSB7CisgICAgZ2VuZXJhdGVfZGVscGhpX2NyZWF0ZV9leGNlcHRpb25faW1wbChvdXQsIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OnByaW50X2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X2Z1bmMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgc3RydWN0X2ludGZfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgb3V0IDw8ICJDcmVhdGVfIjsKKyAgb3V0IDw8IHN0cnVjdF9pbnRmX25hbWU7CisgIG91dCA8PCAiX0ltcGwiOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3Rvcnkob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5KSB7CisgICh2b2lkKWNsc19wcmVmaXg7CisgIGlmIChpc19leGNlcHRpb24pCisgICAgcmV0dXJuOworICBpZiAoaXNfcmVzdWx0KQorICAgIHJldHVybjsKKyAgaWYgKGlzX3hfZmFjdG9yeSkKKyAgICByZXR1cm47CisKKyAgc3RyaW5nIHN0cnVjdF9pbnRmX25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIHN0cmluZyBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UpOworCisgIG91dCA8PCAiZnVuY3Rpb24gIjsKKyAgcHJpbnRfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3RvcnlfZnVuYyhvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgIjogIjsKKyAgb3V0IDw8IHN0cnVjdF9pbnRmX25hbWU7CisgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgb3V0IDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJSZXN1bHQgOj0gIiA8PCBjbHNfbm0gPDwgIi5DcmVhdGU7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X3JlZ2lzdHJhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSkgeworICAodm9pZCljbHNfcHJlZml4OworICBpZiAoaXNfZXhjZXB0aW9uKQorICAgIHJldHVybjsKKyAgaWYgKGlzX3Jlc3VsdCkKKyAgICByZXR1cm47CisgIGlmIChpc194X2ZhY3RvcnkpCisgICAgcmV0dXJuOworCisgIHN0cmluZyBzdHJ1Y3RfaW50Zl9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworCisgIGluZGVudChvdXQpIDw8ICIgIFR5cGVSZWdpc3RyeS5SZWdpc3RlclR5cGVGYWN0b3J5PCIgPDwgc3RydWN0X2ludGZfbmFtZSA8PCAiPigiOworICBwcmludF9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeV9mdW5jKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCAiKTsiOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5KSB7CisgIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKKyAgc3RyaW5nIHN0cnVjdF9pbnRmX25hbWU7CisgIHN0cmluZyBzdHJ1Y3RfbmFtZTsKKyAgc3RyaW5nIGlzc2V0X25hbWU7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgc3RyaW5nIGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPSBub3JtYWxpemVfY2xzbm0odHN0cnVjdC0+Z2V0X25hbWUoKSwgIiIsIHRydWUpICsgIkZhY3RvcnkiOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBzdHJ1Y3RfaW50Zl9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgIH0gZWxzZSB7CisgICAgc3RydWN0X2ludGZfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgfQorCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBzdHJ1Y3RfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCAoIWlzX3hfZmFjdG9yeSksIGlzX3hfZmFjdG9yeSk7CisgIH0gZWxzZSB7CisgICAgc3RydWN0X25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSk7CisgIH0KKworICBpZiAoKCFpc19leGNlcHRpb24pIHx8IGlzX3hfZmFjdG9yeSkgeworCisgICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhvdXQsIHRzdHJ1Y3QpOworICAgIGluZGVudChvdXQpIDw8IHN0cnVjdF9pbnRmX25hbWUgPDwgIiA9IGludGVyZmFjZShJQmFzZSkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2RlZmluaXRpb24ob3V0LCAqbV9pdGVyLCBpc19leGNlcHRpb24pOworICAgICAgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9kZWZpbml0aW9uKG91dCwgKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICB9CisKKyAgICBpZiAoaXNfeF9mYWN0b3J5KSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIvLyBDcmVhdGUgRXhjZXB0aW9uIE9iamVjdCIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiBDcmVhdGVFeGNlcHRpb246ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIHRydWUpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIGlzX2V4Y2VwdGlvbik7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgICAgZ2VuZXJhdGVfZGVscGhpX2lzc2V0X3JlYWRlcl9kZWZpbml0aW9uKG91dCwgKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICAgIGlzc2V0X25hbWUgPSAiX19pc3NldF8iICsgcHJvcF9uYW1lKCptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInByb3BlcnR5ICIgPDwgaXNzZXRfbmFtZSA8PCAiOiBTeXN0ZW0uQm9vbGVhbiByZWFkIEdldCIgPDwgaXNzZXRfbmFtZSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfZGVscGhpX2RvYyhvdXQsIHRzdHJ1Y3QpOworICBpbmRlbnQob3V0KSA8PCBzdHJ1Y3RfbmFtZSA8PCAiID0gIjsKKyAgaWYgKGlzX2ZpbmFsKSB7CisgICAgb3V0IDw8ICJzZWFsZWQgIjsKKyAgfQorICBvdXQgPDwgImNsYXNzKCI7CisgIGlmIChpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7CisgICAgb3V0IDw8ICJURXhjZXB0aW9uIjsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIlRJbnRlcmZhY2VkT2JqZWN0LCBJQmFzZSwgIiA8PCBzdHJ1Y3RfaW50Zl9uYW1lOworICB9CisgIG91dCA8PCAiKSIgPDwgZW5kbDsKKworICBpZiAoaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgeworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInR5cGUiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCBpbl9jbGFzcywgaXNfcmVzdWx0LCB0cnVlKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiRiIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiIDoiIDw8IHN0cnVjdF9pbnRmX25hbWUgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCAiRiIsIGlzX2V4Y2VwdGlvbikgPDwgZW5kbDsKKyAgfQorCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnQob3V0KSA8PCBlbmRsOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIGlzc2V0X25hbWUgPSAiRl9faXNzZXRfIiArIHByb3BfbmFtZSgqbV9pdGVyLCBpc19leGNlcHRpb24pOworICAgICAgICBpbmRlbnQob3V0KSA8PCBpc3NldF9uYW1lIDw8ICI6IFN5c3RlbS5Cb29sZWFuOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBlbmRsOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2RlZmluaXRpb24ob3V0LCAqbV9pdGVyLCBpc19leGNlcHRpb24pOworICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfZGVmaW5pdGlvbihvdXQsICptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgIH0KKworICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIvLyBDbGVhciB2YWx1ZXMoZm9yIHVuaW9uJ3MgcHJvcGVydHkgc2V0dGVyKSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHJvY2VkdXJlIENsZWFyVW5pb25WYWx1ZXM7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIG91dCA8PCBlbmRsOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIGlzc2V0X25hbWUgPSAiX19pc3NldF8iICsgcHJvcF9uYW1lKCptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiBHZXQiIDw8IGlzc2V0X25hbWUgPDwgIjogU3lzdGVtLkJvb2xlYW47IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKChtZW1iZXJzLnNpemUoKSA+IDApICYmIGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImNvbnN0cnVjdG9yIENyZWF0ZSgiIDw8IGNvbnN0cnVjdG9yX2FyZ3VtZW50X2xpc3QodHN0cnVjdCwgaW5kZW50KCkpCisgICAgICAgICAgICAgICAgPDwgIik7IG92ZXJsb2FkOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY29uc3RydWN0b3IgQ3JlYXRlOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOyIgPDwgZW5kbDsKKworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIFRvU3RyaW5nOiBzdHJpbmc7IG92ZXJyaWRlOyIgPDwgZW5kbDsKKworICBpZiAoaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgeworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIvLyBFeGNlcHRpb24gRmFjdG9yeSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICI6ICIgPDwgc3RydWN0X2ludGZfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmICgoIWlzX2V4Y2VwdGlvbikgfHwgaXNfeF9mYWN0b3J5KSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIi8vIElCYXNlIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJwcm9jZWR1cmUgUmVhZCggY29uc3QgaXByb3Q6IElQcm90b2NvbCk7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IG9wcm90OiBJUHJvdG9jb2wpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChpc19leGNlcHRpb24gJiYgaXNfeF9mYWN0b3J5KSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIi8vIENyZWF0ZSBFeGNlcHRpb24gT2JqZWN0IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiBDcmVhdGVFeGNlcHRpb246ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIHRydWUpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIvLyBQcm9wZXJ0aWVzIiA8PCBlbmRsOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGdlbmVyYXRlX3Byb3BlcnR5KG91dCwgKm1faXRlciwgdHJ1ZSwgaXNfZXhjZXB0aW9uKTsKKyAgICB9CisgIH0KKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIi8vIGlzc2V0IiA8PCBlbmRsOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIGlzc2V0X25hbWUgPSAiX19pc3NldF8iICsgcHJvcF9uYW1lKCptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwcm9wZXJ0eSAiIDw8IGlzc2V0X25hbWUgPDwgIjogU3lzdGVtLkJvb2xlYW4gcmVhZCBHZXQiIDw8IGlzc2V0X25hbWUgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikgPDwgIiA9IGNsYXNzIiA8PCBlbmRsOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgInR5cGUiIDw8IGVuZGw7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJlbmQ7IiA8PCBlbmRsOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSxmYWxzZSk7CisgIGlmKGFzeW5jXykgeworICAgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlLHRydWUpOworICB9Cit9CisKKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UsIGJvb2wgZm9yX2FzeW5jKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7CisgIHN0cmluZyBpZmFjZV9uYW1lID0gZm9yX2FzeW5jID8gIklBc3luYyIgOiAiSWZhY2UiOworCisgIGluZGVudF91cCgpOworCisgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zZXJ2aWNlLCB0c2VydmljZSk7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgZXh0ZW5kc19pZmFjZSA9IGV4dGVuZHMgKyAiLiIgKyBpZmFjZV9uYW1lOworICAgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zZXJ2aWNlLCB0c2VydmljZSk7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgaWZhY2VfbmFtZSA8PCAiID0gaW50ZXJmYWNlKCIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBpZmFjZV9uYW1lIDw8ICIgPSBpbnRlcmZhY2UiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsICpmX2l0ZXIpOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmb3JfYXN5bmMpIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9kZWZpbml0aW9uKHNfc2VydmljZSwgdHMsIGZhbHNlLCB0cnVlKTsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2ltcGwoc19zZXJ2aWNlX2ltcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpICsgIi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaW5kZW50X3VwKCk7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICJUSW50ZXJmYWNlZE9iamVjdCI7CisgIHN0cmluZyBpbXBsZW1lbnRzID0gYXN5bmNfID8gIklmYWNlLCBJQXN5bmMiIDogIklmYWNlIjsKKworICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgdHNlcnZpY2UpOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCksIHRydWUsIHRydWUpOworICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcyArICIuVENsaWVudCI7CisgIH0KKyAgaW5kZW50KHNfc2VydmljZSkgPDwgIlRDbGllbnQgPSBjbGFzcyggIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiLCAiIDw8IGltcGxlbWVudHMgPDwgIikiIDw8IGVuZGw7CisKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgImNvbnN0cnVjdG9yIENyZWF0ZSggcHJvdDogSVByb3RvY29sKTsgb3ZlcmxvYWQ7IiA8PCBlbmRsOworCisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiY29uc3RydWN0b3IgIiA8PCBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi5UQ2xpZW50LkNyZWF0ZSggcHJvdDogSVByb3RvY29sKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiQ3JlYXRlKCBwcm90LCBwcm90ICk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChzX3NlcnZpY2UpCisgICAgICA8PCAiY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sKTsgb3ZlcmxvYWQ7IiA8PCBlbmRsOworCisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiY29uc3RydWN0b3IgIiA8PCBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi5UQ2xpZW50LkNyZWF0ZSggY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpbmhlcml0ZWQgQ3JlYXRlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpcHJvdF8gOj0gaXByb3Q7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90XyA6PSBvcHJvdDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb3RlY3RlZCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiaXByb3RfOiBJUHJvdG9jb2w7IiA8PCBlbmRsOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJvcHJvdF86IElQcm90b2NvbDsiIDw8IGVuZGw7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgInNlcWlkXzogU3lzdGVtLkludGVnZXI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm9wZXJ0eSBJbnB1dFByb3RvY29sOiBJUHJvdG9jb2wgcmVhZCBpcHJvdF87IiA8PCBlbmRsOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm9wZXJ0eSBPdXRwdXRQcm90b2NvbDogSVByb3RvY29sIHJlYWQgb3Byb3RfOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb3RlY3RlZCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgIi8vIElmYWNlIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zZXJ2aWNlLCAqZl9pdGVyKTsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZmFsc2UpIDw8IGVuZGw7CisgIH0KKworICBpZiggYXN5bmNfKSB7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgZW5kbDsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiLy8gSUFzeW5jIiA8PCBlbmRsOworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zZXJ2aWNlLCAqZl9pdGVyKTsKKyAgICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCB0cnVlKSA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGZ1bGxfY2xzID0gbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikgKyAiLlRDbGllbnQiOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworCisgICAgLy8gb25lIGZvciBzeW5jIG9ubHksIHR3byBmb3IgYXN5bmMrc3luYworICAgIGludCBtb2RlID0gYXN5bmNfID8gMSA6IDA7CisgICAgd2hpbGUoIG1vZGUgPj0gMCkgeworICAgICAgYm9vbCBmb3JfYXN5bmMgPSAobW9kZSAhPSAwKTsKKyAgICAgIG1vZGUtLTsKKworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmb3JfYXN5bmMsIGZ1bGxfY2xzKSA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cF9pbXBsKCk7CisKKyAgICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgICBpZiggZm9yX2FzeW5jKSB7CisgICAgICAgIGlmIChpc192b2lkKHR0eXBlKSkgeworICAgICAgICAgICAvLyBEZWxwaGkgZm9yY2VzIHVzIHRvIHNwZWNpZnkgYSB0eXBlIHdpdGggSUZ1dHVyZTxUPiwgc28gd2UgdXNlIEludGVnZXI9MCBmb3Igdm9pZCBtZXRob2RzCisgICAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyZXN1bHQgOj0gVFRhc2suRnV0dXJlPFN5c3RlbS5JbnRlZ2VyPihmdW5jdGlvbjogU3lzdGVtLkludGVnZXIiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RyaW5nIHJldHR5cGUgPSB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyZXN1bHQgOj0gVFRhc2suRnV0dXJlPCIgPDwgcmV0dHlwZSA8PCAiPihmdW5jdGlvbjogIiA8PCByZXR0eXBlIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7CisKKyAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzX3NlcnZpY2VfaW1wbCA8PCAiLCAiOworICAgICAgICB9CisgICAgICAgIHNfc2VydmljZV9pbXBsIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIH0KKyAgICAgIHNfc2VydmljZV9pbXBsIDw8ICIpOyIgPDwgZW5kbDsKKworICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIHNfc2VydmljZV9pbXBsIDw8IGluZGVudF9pbXBsKCk7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBzX3NlcnZpY2VfaW1wbCA8PCAiUmVzdWx0IDo9ICI7CisgICAgICAgIH0KKyAgICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGlmKCBmb3JfYXN5bmMpIHsKKyAgICAgICAgaWYgKGlzX3ZvaWQodHR5cGUpKSB7CisgICAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJSZXN1bHQgOj0gMDsiIDw8IGVuZGw7ICAvLyBubyBJRnV0dXJlPHZvaWQ+IGluIERlbHBoaQorICAgICAgICB9CisgICAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQpOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7CisKKyAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICAgIHN0cmluZyBhcmdzX2Nsc25tID0gbm9ybWFsaXplX2Nsc25tKGFyZ3NuYW1lLCAiVCIpOworICAgIHN0cmluZyBhcmdzX2ludGZubSA9IG5vcm1hbGl6ZV9jbHNubShhcmdzbmFtZSwgIkkiKTsKKworICAgIHN0cmluZyBhcmdzdmFyID0gdG1wKCJfYXJncyIpOworICAgIHN0cmluZyBtc2d2YXIgPSB0bXAoIl9tc2ciKTsKKworICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbiwgZmFsc2UpIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbiwgZmFsc2UsIGZ1bGxfY2xzKSA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidmFyIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFyZ3N2YXIgPDwgIiA6ICIgPDwgYXJnc19pbnRmbm0gPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IG1zZ3ZhciA8PCAiIDogVGhyaWZ0LlByb3RvY29sLlRUaHJpZnRNZXNzYWdlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworCisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJzZXFpZF8gOj0gc2VxaWRfICsgMTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggIiA8PCBtc2d2YXIgPDwgIiwgJyIgPDwgZnVubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiJywgIiA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT25ld2F5IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJUTWVzc2FnZVR5cGUuQ2FsbCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIHNlcWlkXyk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdF8uV3JpdGVNZXNzYWdlQmVnaW4oICIgPDwgbXNndmFyIDw8ICIgKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFyZ3N2YXIgPDwgIiA6PSAiIDw8IGFyZ3NfY2xzbm0gPDwgIkltcGwuQ3JlYXRlKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBhcmdzdmFyIDw8ICIuIiA8PCBwcm9wX25hbWUoKmZsZF9pdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgOj0gIiA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFyZ3N2YXIgPDwgIi5Xcml0ZShvcHJvdF8pOyIgPDwgZW5kbDsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFyZ3N2YXIgPDwgIi4iIDw8IHByb3BfbmFtZSgqZmxkX2l0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA6PSAiIDw8IGVtcHR5X3ZhbHVlKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90Xy5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdF8uVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBzdHJpbmcgb3JnX3Jlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisgICAgICBzdHJpbmcgcmVzdWx0X2Nsc25tID0gbm9ybWFsaXplX2Nsc25tKG9yZ19yZXN1bHRuYW1lLCAiVCIpOworICAgICAgc3RyaW5nIHJlc3VsdF9pbnRmbm0gPSBub3JtYWxpemVfY2xzbm0ob3JnX3Jlc3VsdG5hbWUsICJJIik7CisKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworCisgICAgICBzdHJpbmcgZXhjZXB0dmFyID0gdG1wKCJfZXgiKTsKKyAgICAgIHN0cmluZyBhcHBleHZhciA9IHRtcCgiX2F4Iik7CisgICAgICBzdHJpbmcgcmV0dmFyID0gdG1wKCJfcmV0Iik7CisKKyAgICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbiwgZmFsc2UpIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uLCBmYWxzZSwgZnVsbF9jbHMpIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgbXNndmFyIDw8ICIgOiBUaHJpZnQuUHJvdG9jb2wuVFRocmlmdE1lc3NhZ2U7IiA8PCBlbmRsOworICAgICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBleGNlcHR2YXIgPDwgIiA6IEV4Y2VwdGlvbjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgYXBwZXh2YXIgPDwgIiA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgcmV0dmFyIDw8ICIgOiAiIDw8IHJlc3VsdF9pbnRmbm0gPDwgIjsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IG1zZ3ZhciA8PCAiIDo9IGlwcm90Xy5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiAoIiA8PCBtc2d2YXIgPDwgIi5UeXBlXyA9IFRNZXNzYWdlVHlwZS5FeGNlcHRpb24pIHRoZW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFwcGV4dmFyIDw8ICIgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlJlYWQoaXByb3RfKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlwcm90Xy5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmFpc2UgIiA8PCBhcHBleHZhciA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IHJldHZhciA8PCAiIDo9ICIgPDwgcmVzdWx0X2Nsc25tIDw8ICJJbXBsLkNyZWF0ZSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCByZXR2YXIgPDwgIi5SZWFkKGlwcm90Xyk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpcHJvdF8uUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiAoIiA8PCByZXR2YXIgPDwgIi5fX2lzc2V0X3N1Y2Nlc3MpIHRoZW4iIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiUmVzdWx0IDo9ICIgPDwgcmV0dmFyIDw8ICIuU3VjY2VzczsiIDw8IGVuZGw7CisgICAgICAgIHRfdHlwZSogdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICAgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHlwZS0+aXNfbWFwKCkgfHwgdHlwZS0+aXNfbGlzdCgpCisgICAgICAgICAgICB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCByZXR2YXIgPDwgIi5TdWNjZXNzIDo9IG5pbDsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJFeGl0OyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgKCIgPDwgcmV0dmFyIDw8ICIuX19pc3NldF8iIDw8IHByb3BfbmFtZSgqeF9pdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikgdGhlbiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGV4Y2VwdHZhciA8PCAiIDo9ICIgPDwgcmV0dmFyIDw8ICIuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuQ3JlYXRlRXhjZXB0aW9uOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyYWlzZSAiIDw8IGV4Y2VwdHZhciA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpCisgICAgICAgICAgICA8PCAicmFpc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uTWlzc2luZ1Jlc3VsdC5DcmVhdGUoJyIKKyAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHQnKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworCisgIHN0cmluZyBmdWxsX2NscyA9IG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpICsgIi5UUHJvY2Vzc29ySW1wbCI7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLCB0cnVlLCB0cnVlKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLlRQcm9jZXNzb3JJbXBsIjsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiVFByb2Nlc3NvckltcGwgPSBjbGFzcygiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICIsIElQcm9jZXNzb3IpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJUUHJvY2Vzc29ySW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVByb2Nlc3NvcikiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgImNvbnN0cnVjdG9yIENyZWF0ZSggaWZhY2VfOiBJZmFjZSApOyIgPDwgZW5kbDsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgImRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiY29uc3RydWN0b3IgIiA8PCBmdWxsX2NscyA8PCAiLkNyZWF0ZSggaWZhY2VfOiBJZmFjZSApOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImluaGVyaXRlZCBDcmVhdGUoIGlmYWNlXyk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaW5oZXJpdGVkIENyZWF0ZTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJTZWxmLmlmYWNlXyA6PSBpZmFjZV87IiA8PCBlbmRsOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiQVNTRVJUKCBwcm9jZXNzTWFwXyA8PiBuaWwpOyAgLy8gaW5oZXJpdGVkIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKQorICAgICAgICA8PCAicHJvY2Vzc01hcF8gOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPHN0cmluZywgVFByb2Nlc3NGdW5jdGlvbj4uQ3JlYXRlOyIgPDwgZW5kbDsKKyAgfQorCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJwcm9jZXNzTWFwXy5BZGRPclNldFZhbHVlKCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJfUHJvY2Vzcyk7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJkZXN0cnVjdG9yICIgPDwgZnVsbF9jbHMgPDwgIi5EZXN0cm95OyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpbmhlcml0ZWQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcml2YXRlIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgImlmYWNlXzogSWZhY2U7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSA9PSBOVUxMKSB7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb3RlY3RlZCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAidHlwZSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiVFByb2Nlc3NGdW5jdGlvbiA9IHJlZmVyZW5jZSB0byBwcm9jZWR1cmUoIHNlcWlkOiBTeXN0ZW0uSW50ZWdlcjsgY29uc3QgaXByb3Q6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sIgorICAgICAgICAgICAgICAgICAgICAgIDw8IChldmVudHNfID8gIjsgY29uc3QgZXZlbnRzIDogSVJlcXVlc3RFdmVudHMiIDogIiIpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb3RlY3RlZCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvY2Vzc01hcF86IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZywgVFByb2Nlc3NGdW5jdGlvbj47IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJmdW5jdGlvbiBQcm9jZXNzKCBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sOyBjb25zdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImV2ZW50cyA6IElQcm9jZXNzb3JFdmVudHMpOiBTeXN0ZW0uQm9vbGVhbjsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgImZ1bmN0aW9uIFByb2Nlc3MoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2w7IGNvbnN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnRzIDogSVByb2Nlc3NvckV2ZW50cyk6IFN5c3RlbS5Cb29sZWFuOyByZWludHJvZHVjZTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImZ1bmN0aW9uICIgPDwgZnVsbF9jbHMgPDwgIi5Qcm9jZXNzKCBjb25zdCBpcHJvdDogSVByb3RvY29sOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uc3Qgb3Byb3Q6IElQcm90b2NvbDsgY29uc3QgZXZlbnRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IElQcm9jZXNzb3JFdmVudHMpOiBTeXN0ZW0uQm9vbGVhbjsiIDw8IGVuZGw7CisgIDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ2YXIiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAibXNnIDogVGhyaWZ0LlByb3RvY29sLlRUaHJpZnRNZXNzYWdlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmbiA6IFRQcm9jZXNzRnVuY3Rpb247IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInggOiBUQXBwbGljYXRpb25FeGNlcHRpb247IiA8PCBlbmRsOworICBpZiAoZXZlbnRzXykgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiY29udGV4dCA6IElSZXF1ZXN0RXZlbnRzOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidHJ5IiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm1zZyA6PSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImZuIDo9IG5pbDsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgbm90IHByb2Nlc3NNYXBfLlRyeUdldFZhbHVlKG1zZy5OYW1lLCBmbikiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Igbm90IEFzc2lnbmVkKGZuKSB0aGVuIiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgVFR5cGUuU3RydWN0KTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAieCA6PSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5rbm93bk1ldGhvZC5DcmVhdGUoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIidJbnZhbGlkIG1ldGhvZCBuYW1lOiAnJycgKyBtc2cuTmFtZSArICcnJycpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpCisgICAgICA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoIG1zZywgbXNnLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1zZy5TZXFJRCk7IgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbiggbXNnKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAieC5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiUmVzdWx0IDo9IFRydWU7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIkV4aXQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgaWYgKGV2ZW50c18pIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ0aGVuIGNvbnRleHQgOj0gZXZlbnRzLkNyZWF0ZVJlcXVlc3RDb250ZXh0KG1zZy5OYW1lKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVsc2UgY29udGV4dCA6PSBuaWw7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidHJ5IiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmbihtc2cuU2VxSUQsIGlwcm90LCBvcHJvdCwgY29udGV4dCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGNvbnRleHQgPD4gbmlsIHRoZW4gYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImNvbnRleHQuQ2xlYW51cENvbnRleHQ7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiY29udGV4dCA6PSBuaWw7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImZuKG1zZy5TZXFJRCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImV4Y2VwdCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvbiBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQgZG8gYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiUmVzdWx0IDo9IFRydWU7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIkV4aXQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbHNlIGJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlJlc3VsdCA6PSBGYWxzZTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiRXhpdDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJSZXN1bHQgOj0gVHJ1ZTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgIlN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfZGVmaW5pdGlvbihzX3NlcnZpY2UsICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKKyAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9pbXBsKHNfc2VydmljZV9pbXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikgKyAiLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIHN0cmluZyBmdW5jbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKyAgc3RyaW5nIGZ1bGxfY2xzID0gbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikgKyAiLlRQcm9jZXNzb3JJbXBsIjsKKworICBzdHJpbmcgb3JnX2FyZ3NuYW1lID0gZnVuY25hbWUgKyAiX2FyZ3MiOworICBzdHJpbmcgYXJnc19jbHNubSA9IG5vcm1hbGl6ZV9jbHNubShvcmdfYXJnc25hbWUsICJUIik7CisgIHN0cmluZyBhcmdzX2ludGZubSA9IG5vcm1hbGl6ZV9jbHNubShvcmdfYXJnc25hbWUsICJJIik7CisKKyAgc3RyaW5nIG9yZ19yZXN1bHRuYW1lID0gZnVuY25hbWUgKyAiX3Jlc3VsdCI7CisgIHN0cmluZyByZXN1bHRfY2xzbm0gPSBub3JtYWxpemVfY2xzbm0ob3JnX3Jlc3VsdG5hbWUsICJUIik7CisgIHN0cmluZyByZXN1bHRfaW50Zm5tID0gbm9ybWFsaXplX2Nsc25tKG9yZ19yZXN1bHRuYW1lLCAiSSIpOworCisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm9jZWR1cmUgIiA8PCBmdW5jbmFtZQorICAgICAgICAgICAgICAgICAgICA8PCAiX1Byb2Nlc3MoIHNlcWlkOiBTeXN0ZW0uSW50ZWdlcjsgY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbCIKKyAgICAgICAgICAgICAgICAgICAgPDwgKGV2ZW50c18gPyAiOyBjb25zdCBldmVudHMgOiBJUmVxdWVzdEV2ZW50cyIgOiAiIikgPDwgIik7IiA8PCBlbmRsOworCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICIvLyBvbmUgd2F5IHByb2Nlc3NvciIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIi8vIGJvdGggd2F5IHByb2Nlc3NvciIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKQorICAgICAgPDwgInByb2NlZHVyZSAiIDw8IGZ1bGxfY2xzIDw8ICIuIiA8PCBmdW5jbmFtZQorICAgICAgPDwgIl9Qcm9jZXNzKCBzZXFpZDogU3lzdGVtLkludGVnZXI7IGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2wiCisgICAgICA8PCAoZXZlbnRzXyA/ICI7IGNvbnN0IGV2ZW50cyA6IElSZXF1ZXN0RXZlbnRzIiA6ICIiKSA8PCAiKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidmFyIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFyZ3M6ICIgPDwgYXJnc19pbnRmbm0gPDwgIjsiIDw8IGVuZGw7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAibXNnOiBUaHJpZnQuUHJvdG9jb2wuVFRocmlmdE1lc3NhZ2U7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmV0OiAiIDw8IHJlc3VsdF9pbnRmbm0gPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcHB4IDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBpZiAoZXZlbnRzXykgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5QcmVSZWFkOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFyZ3MgOj0gIiA8PCBhcmdzX2Nsc25tIDw8ICJJbXBsLkNyZWF0ZTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXJncy5SZWFkKGlwcm90KTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgIGlmIChldmVudHNfKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLlBvc3RSZWFkOyIgPDwgZW5kbDsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyZXQgOj0gIiA8PCByZXN1bHRfY2xzbm0gPDwgIkltcGwuQ3JlYXRlOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidHJ5IiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBzX3NlcnZpY2VfaW1wbCA8PCBpbmRlbnRfaW1wbCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgc19zZXJ2aWNlX2ltcGwgPDwgInJldC5TdWNjZXNzIDo9ICI7CisgIH0KKyAgc19zZXJ2aWNlX2ltcGwgPDwgImlmYWNlXy4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgdHJ1ZSkgPDwgIigiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHNfc2VydmljZV9pbXBsIDw8ICIsICI7CisgICAgfQorICAgIHNfc2VydmljZV9pbXBsIDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpOworICB9CisgIHNfc2VydmljZV9pbXBsIDw8ICIpOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZl9pdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIDo9ICIgPDwgZW1wdHlfdmFsdWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJleGNlcHQiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9uIEU6ICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgdHJ1ZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBkbyBiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIGZhY3RvcnlfbmFtZSA9IG5vcm1hbGl6ZV9jbHNubSgoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCksICIiLCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIkZhY3RvcnkiOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyZXQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIiA6PSBFLiIgPDwgZmFjdG9yeV9uYW1lIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9uIEU6IEV4Y2VwdGlvbiBkbyBiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaWYoZXZlbnRzXykgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5VbmhhbmRsZWRFcnJvcihFKTsiIDw8IGVuZGw7CisgIH0KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcHB4IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludGVybmFsRXJyb3IuQ3JlYXRlKEUuTWVzc2FnZSk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidHJ5IiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaWYoZXZlbnRzXykgeworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLlByZVdyaXRlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggbXNnLCAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIHNlcWlkKTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbiggbXNnKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcHB4LldyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7CisgICAgaWYoZXZlbnRzXykgeworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLlBvc3RXcml0ZTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiRXhpdDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXBweC5GcmVlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGlmIChldmVudHNfKSB7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuUHJlV3JpdGU7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCBtc2csICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgVE1lc3NhZ2VUeXBlLlJlcGx5LCBzZXFpZCk7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUJlZ2luKCBtc2cpOyAiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyZXQuV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKKyAgICBpZiAoZXZlbnRzXykgeworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLlBvc3RXcml0ZTsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKGV2ZW50c18pIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuT25ld2F5Q29tcGxldGU7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKyAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb24pOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lLCAiIik7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCBpc194Y2VwdGlvbiwgdHlwZSwgbmFtZSwgbG9jYWxfdmFycyk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCBuYW1lIDw8ICIgOj0gIjsKKworICAgIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UpIDw8ICIoIjsKKyAgICB9CisKKyAgICBvdXQgPDwgImlwcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBpZiAoYW5zaXN0cl9iaW5hcnlfKSB7CisgICAgICAgICAgICBvdXQgPDwgIlJlYWRBbnNpU3RyaW5nKCk7IjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0IDw8ICJSZWFkQmluYXJ5KCk7IjsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJSZWFkU3RyaW5nKCk7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJSZWFkQm9vbCgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJSZWFkQnl0ZSgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAiUmVhZEkxNigpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAiUmVhZEkzMigpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAiUmVhZEk2NCgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAiUmVhZERvdWJsZSgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBEZWxwaGkgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIlJlYWRJMzIoKSI7CisgICAgICBvdXQgPDwgIik7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgdHlwX25hbWU7CisKKyAgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICB0eXBfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7CisgIH0gZWxzZSB7CisgICAgdHlwX25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UpOworICB9CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCBwcmVmaXggPDwgbmFtZSA8PCAiIDo9ICIgPDwgdHlwX25hbWUgPDwgIi5DcmVhdGU7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8IHByZWZpeCA8PCBuYW1lIDw8ICIuUmVhZChpcHJvdCk7IiA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycykgeworCisgIHN0cmluZyBvYmo7CisgIHN0cmluZyBjb3VudGVyOworICBzdHJpbmcgbG9jYWxfdmFyOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvYmogPSB0bXAoIl9tYXAiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9zZXQiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb2JqID0gdG1wKCJfbGlzdCIpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGxvY2FsX3ZhciA9IG9iaiArICI6IFRUaHJpZnRNYXA7IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBsb2NhbF92YXIgPSBvYmogKyAiOiBUVGhyaWZ0U2V0OyI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGxvY2FsX3ZhciA9IG9iaiArICI6IFRUaHJpZnRMaXN0OyI7CisgIH0KKyAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGxvY2FsX3ZhciA8PCBlbmRsOworICBjb3VudGVyID0gdG1wKCJfaSIpOworICBsb2NhbF92YXIgPSBjb3VudGVyICsgIjogU3lzdGVtLkludGVnZXI7IjsKKyAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGxvY2FsX3ZhciA8PCBlbmRsOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgbmFtZSA8PCAiIDo9ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCB0cnVlKSA8PCAiLkNyZWF0ZTsiIDw8IGVuZGw7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgb2JqIDw8ICIgOj0gaXByb3QuUmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgb2JqIDw8ICIgOj0gaXByb3QuUmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8IG9iaiA8PCAiIDo9IGlwcm90LlJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmb3IgIiA8PCBjb3VudGVyIDw8ICIgOj0gMCB0byAiIDw8IG9iaiA8PCAiLkNvdW50IC0gMSBkbyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsIGlzX3hjZXB0aW9uLCAodF9tYXAqKXR0eXBlLCBuYW1lLCBsb2NhbF92YXJzKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsIGlzX3hjZXB0aW9uLCAodF9zZXQqKXR0eXBlLCBuYW1lLCBsb2NhbF92YXJzKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X2xpc3QqKXR0eXBlLCBuYW1lLCBsb2NhbF92YXJzKTsKKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGw7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlwcm90LlJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaXByb3QuUmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaXByb3QuUmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgeworCisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICBzdHJpbmcgbG9jYWxfdmFyOworCisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOworICBsb2NhbF92YXJzIDw8ICIgICIgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZmtleSwgIiIsIGxvY2FsX3ZhcnMpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZnZhbCwgIiIsIGxvY2FsX3ZhcnMpOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgcHJlZml4IDw8ICIuQWRkT3JTZXRWYWx1ZSggIiA8PCBrZXkgPDwgIiwgIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmZlbGVtLCAiIiwgbG9jYWxfdmFycyk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgcHJlZml4IDw8ICIuQWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworICBsb2NhbF92YXJzIDw8ICIgICIgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZmZWxlbSwgIiIsIGxvY2FsX3ZhcnMpOworICBpbmRlbnRfaW1wbChvdXQpIDw8IHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisgICh2b2lkKWxvY2FsX3ZhcnM7CisKKyAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb24pOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lLCBsb2NhbF92YXJzKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCBpc194Y2VwdGlvbiwgdHlwZSwgbmFtZSwgbG9jYWxfdmFycyk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBpZiAoYW5zaXN0cl9iaW5hcnlfKSB7CisgICAgICAgICAgICBvdXQgPDwgIldyaXRlQW5zaVN0cmluZygiOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQgPDwgIldyaXRlQmluYXJ5KCI7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiV3JpdGVTdHJpbmcoIjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAiV3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAiV3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAiV3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAiV3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBEZWxwaGkgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIldyaXRlSTMyKFN5c3RlbS5JbnRlZ2VyKCIgPDwgbmFtZSA8PCAiKSk7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFICclcyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHByZWZpeC5jX3N0cigpLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKyAgKHZvaWQpbG9jYWxfdmFyczsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudF9pbXBsKCkgPDwgcHJlZml4IDw8ICIuV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgeworICBzdHJpbmcgb2JqOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb2JqID0gdG1wKCJtYXAiKTsKKyAgICBsb2NhbF92YXJzIDw8ICIgICIgPDwgb2JqIDw8ICIgOiBUVGhyaWZ0TWFwOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggIiA8PCBvYmogPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeAorICAgICAgICAgICAgICAgICAgICAgPDwgIi5Db3VudCk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIm9wcm90LldyaXRlTWFwQmVnaW4oICIgPDwgb2JqIDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvYmogPSB0bXAoInNldF8iKTsKKyAgICBsb2NhbF92YXJzIDw8ICIgICIgPDwgb2JqIDw8ICIgOiBUVGhyaWZ0U2V0OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggIiA8PCBvYmogPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeAorICAgICAgICAgICAgICAgICAgICAgPDwgIi5Db3VudCk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIm9wcm90LldyaXRlU2V0QmVnaW4oICIgPDwgb2JqIDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb2JqID0gdG1wKCJsaXN0XyIpOworICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBvYmogPDwgIiA6IFRUaHJpZnRMaXN0OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggIiA8PCBvYmogPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIuQ291bnQpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC5Xcml0ZUxpc3RCZWdpbiggIiA8PCBvYmogPDwgIik7IiA8PCBlbmRsOworICB9CisKKyAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBsb2NhbF92YXJzIDw8ICIgICIgPDwgaXRlciA8PCAiOiAiIDw8IHR5cGVfbmFtZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmb3IgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi5LZXlzIGRvIiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGl0ZXIgPDwgIjogIiA8PCB0eXBlX25hbWUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICI7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmb3IgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIiBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBsb2NhbF92YXJzIDw8ICIgICIgPDwgaXRlciA8PCAiOiAiIDw8IHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICI7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmb3IgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIiBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsIGlzX3hjZXB0aW9uLCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgsIGxvY2FsX3ZhcnMpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsIGlzX3hjZXB0aW9uLCAodF9zZXQqKXR0eXBlLCBpdGVyLCBsb2NhbF92YXJzKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsIGlzX3hjZXB0aW9uLCAodF9saXN0Kil0dHlwZSwgaXRlciwgbG9jYWxfdmFycyk7CisgIH0KKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGw7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIm9wcm90LldyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIm9wcm90LldyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC5Xcml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAma2ZpZWxkLCAiIiwgbG9jYWxfdmFycyk7CisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiWyIgKyBpdGVyICsgIl0iKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZ2ZmllbGQsICIiLCBsb2NhbF92YXJzKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmVmaWVsZCwgIiIsIGxvY2FsX3ZhcnMpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZlZmllbGQsICIiLCBsb2NhbF92YXJzKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1B1YmxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eShvdXQsIGlzX3hjZXB0aW9uLCB0ZmllbGQsIGlzUHVibGljLCAiR2V0Iik7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHkob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cnVjdF9pc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUHVibGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCkgeworICAodm9pZClpc1B1YmxpYzsKKworICB0X3R5cGUqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7CisgIGdlbmVyYXRlX2RlbHBoaV9kb2Mob3V0LCB0ZmllbGQpOworICBpbmRlbnQob3V0KSA8PCAicHJvcGVydHkgIiA8PCBwcm9wX25hbWUodGZpZWxkLCBzdHJ1Y3RfaXNfeGNlcHRpb24pIDw8ICI6ICIKKyAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZ0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpIDw8ICIgcmVhZCAiCisgICAgICAgICAgICAgIDw8IGZpZWxkUHJlZml4ICsgcHJvcF9uYW1lKHRmaWVsZCwgc3RydWN0X2lzX3hjZXB0aW9uKSA8PCAiIHdyaXRlIFNldCIKKyAgICAgICAgICAgICAgPDwgcHJvcF9uYW1lKHRmaWVsZCwgc3RydWN0X2lzX3hjZXB0aW9uKSA8PCAiOyIgPDwgZW5kbDsKK30KKworc3RkOjpzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcm9wX25hbWUodF9maWVsZCogdGZpZWxkLCBib29sIGlzX3hjZXB0aW9uKSB7CisgIHJldHVybiBwcm9wX25hbWUodGZpZWxkLT5nZXRfbmFtZSgpLCBpc194Y2VwdGlvbik7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJvcF9uYW1lKHN0cmluZyBuYW1lLCBib29sIGlzX3hjZXB0aW9uKSB7CisgIHN0cmluZyByZXQgPSBuYW1lOworICByZXRbMF0gPSB0b3VwcGVyKHJldFswXSk7CisgIHJldHVybiBub3JtYWxpemVfbmFtZShyZXQsIHRydWUsIGlzX3hjZXB0aW9uKTsKK30KKworc3RkOjpzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpjb25zdHJ1Y3Rvcl9wYXJhbV9uYW1lKHN0cmluZyBuYW1lKSB7CisgIHN0cmluZyByZXQgPSBuYW1lOworICByZXRbMF0gPSB0b3VwcGVyKHJldFswXSk7CisgIHJldCA9ICJBIiArIHJldDsKKyAgcmV0dXJuIG5vcm1hbGl6ZV9uYW1lKHJldCwgZmFsc2UsIGZhbHNlKTsKK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6bm9ybWFsaXplX2Nsc25tKHN0cmluZyBjbHNubSwgc3RyaW5nIHByZWZpeCwgYm9vbCBiX25vX2NoZWNrX2tleXdvcmQpIHsKKyAgaWYgKGNsc25tLnNpemUoKSA+IDApIHsKKyAgICBjbHNubVswXSA9IHRvdXBwZXIoY2xzbm1bMF0pOworICB9CisgIGlmIChiX25vX2NoZWNrX2tleXdvcmQpIHsKKyAgICByZXR1cm4gcHJlZml4ICsgY2xzbm07CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5vcm1hbGl6ZV9uYW1lKHByZWZpeCArIGNsc25tKTsKKyAgfQorfQorCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9ub19wb3N0Zml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9leGNlcHRpb25fZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZnVsbF9leGNlcHRpb25fZmFjdG9yeSkgeworCisgIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdF90eXBlZGVmKiB0ZGVmID0gKHRfdHlwZWRlZiopdHR5cGU7CisgICAgaWYgKHRkZWYtPmlzX2ZvcndhcmRfdHlwZWRlZigpKSB7IC8vIGZvcndhcmQgdHlwZXMgYWNjb3JkaW5nIHRvIFRIUklGVC0yNDIxCisgICAgICBpZiAodGRlZi0+Z2V0X3R5cGUoKSAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiB0eXBlX25hbWUodGRlZi0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiX2NscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBiX25vX3Bvc3RmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgYl9leGNlcHRpb25fZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiX2Z1bGxfZXhjZXB0aW9uX2ZhY3RvcnkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVucmVzb2x2ZWQgZm9yd2FyZCBkZWNsYXJhdGlvbjogIiArIHRkZWYtPmdldF9zeW1ib2xpYygpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbm9ybWFsaXplX25hbWUoIlQiICsgdGRlZi0+Z2V0X3N5bWJvbGljKCkpOworICAgIH0KKyAgfQorCisgIHN0cmluZyB0eXBfbm07CisKKyAgc3RyaW5nIHNfZmFjdG9yeTsKKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBiX2NscyA9IHRydWU7CisgICAgYl9ub19wb3N0Zml4ID0gdHJ1ZTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgaWYgKGJfY2xzKSB7CisgICAgICB0eXBfbm0gPSAiVFRocmlmdERpY3Rpb25hcnlJbXBsIjsKKyAgICB9IGVsc2UgeworICAgICAgdHlwX25tID0gIklUaHJpZnREaWN0aW9uYXJ5IjsKKyAgICB9CisgICAgcmV0dXJuIHR5cF9ubSArICI8IiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiICsgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpKQorICAgICAgICAgICArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgaWYgKGJfY2xzKSB7CisgICAgICB0eXBfbm0gPSAiVEhhc2hTZXRJbXBsIjsKKyAgICB9IGVsc2UgeworICAgICAgdHlwX25tID0gIklIYXNoU2V0IjsKKyAgICB9CisgICAgcmV0dXJuIHR5cF9ubSArICI8IiArIHR5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7CisgICAgaWYgKGJfY2xzKSB7CisgICAgICB0eXBfbm0gPSAiVFRocmlmdExpc3RJbXBsIjsKKyAgICB9IGVsc2UgeworICAgICAgdHlwX25tID0gIklUaHJpZnRMaXN0IjsKKyAgICB9CisgICAgcmV0dXJuIHR5cF9ubSArICI8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKKyAgfQorCisgIHN0cmluZyB0eXBlX3ByZWZpeDsKKworICBpZiAoYl9jbHMpIHsKKyAgICB0eXBlX3ByZWZpeCA9ICJUIjsKKyAgfSBlbHNlIHsKKyAgICB0eXBlX3ByZWZpeCA9ICJJIjsKKyAgfQorCisgIHN0cmluZyBubSA9IG5vcm1hbGl6ZV9jbHNubSh0dHlwZS0+Z2V0X25hbWUoKSwgdHlwZV9wcmVmaXgpOworCisgIGlmIChiX2V4Y2VwdGlvbl9mYWN0b3J5KSB7CisgICAgbm0gPSBubSArICJGYWN0b3J5IjsKKyAgfQorCisgIGlmIChiX2NscykgeworICAgIGlmICghYl9ub19wb3N0Zml4KSB7CisgICAgICBubSA9IG5tICsgIkltcGwiOworICAgIH0KKyAgfQorCisgIGlmIChiX2V4Y2VwdGlvbl9mYWN0b3J5ICYmIGJfZnVsbF9leGNlcHRpb25fZmFjdG9yeSkgeworICAgIHJldHVybiB0eXBlX25hbWUodHR5cGUsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSkgKyAiLiIgKyBubTsKKyAgfQorCisgIHJldHVybiBubTsKK30KKworLy8gcmV0dXJucyAiY29uc3QgIiBmb3Igc29tZSBhcmd1bWVudCB0eXBlcworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6aW5wdXRfYXJnX3ByZWZpeCh0X3R5cGUqIHR0eXBlKSB7CisKKyAgLy8gYmFzZSB0eXBlcworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkpIHsKKworICAgIC8vIHRoZXNlIHNob3VsZCBiZSBjb25zdCdlZCBmb3Igb3B0aW1hbCBwZXJmb3JtYW1jZQorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOiAvLyByZWZjb3VudGVkIHBvaW50ZXIKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDogICAgLy8gbGFyZ2VyIHRoYW4gMzIgYml0CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6IC8vIGxhcmdlciB0aGFuIDMyIGJpdAorICAgICAgcmV0dXJuICJjb25zdCAiOworCisgICAgLy8gYWxsIG90aGVycyBkb24ndCBuZWVkIHRvIGJlCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICIiOworCisgICAgLy8gd2UgYmV0dGVyIGFsd2F5cyByZXBvcnQgYW55IHVua25vd24gdHlwZXMKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBpbnB1dF9hcmdfcHJlZml4KCkgZm9yIGJhc2UgdHlwZSAiCisgICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpKTsKKyAgICB9CisKKyAgICAvLyBlbnVtcworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIiI7IC8vIHVzdWFsbHkgPD0gMzIgYml0CisKKyAgICAvLyBjb250YWluZXJzCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJjb25zdCAiOyAvLyByZWZjb3VudGVkIHBvaW50ZXIKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiY29uc3QgIjsgLy8gcmVmY291bnRlZCBwb2ludGVyCisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJjb25zdCAiOyAvLyByZWZjb3VudGVkIHBvaW50ZXIKKyAgfQorCisgIC8vIGFueSBvdGhlciB0eXBlLCBlaXRoZXIgVFNvbWV0aGluZyBvciBJU29tZXRoaW5nCisgIHJldHVybiAiY29uc3QgIjsgLy8gcG9zc2libHkgcmVmY291bnRlZCBwb2ludGVyCit9CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSkgeworICBzd2l0Y2ggKHRiYXNlLT5nZXRfYmFzZSgpKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAvLyBubyAidm9pZCIgaW4gRGVscGhpIGxhbmd1YWdlCisgICAgcmV0dXJuICIiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICBpZiAodGJhc2UtPmlzX2JpbmFyeSgpKSB7CisgICAgICBpZiAoYW5zaXN0cl9iaW5hcnlfKSB7CisgICAgICAgIHJldHVybiAiU3lzdGVtLkFuc2lTdHJpbmciOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICJTeXNVdGlscy5UQnl0ZXMiOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIlN5c3RlbS5zdHJpbmciOworICAgIH0KKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAiU3lzdGVtLkJvb2xlYW4iOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIHJldHVybiAiU3lzdGVtLlNob3J0SW50IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgcmV0dXJuICJTeXN0ZW0uU21hbGxJbnQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gIlN5c3RlbS5JbnRlZ2VyIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgcmV0dXJuICJTeXN0ZW0uSW50NjQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gIlN5c3RlbS5Eb3VibGUiOworICBkZWZhdWx0OgorICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gRGVscGhpIG5hbWUgZm9yIGJhc2UgdHlwZSAiCisgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlLT5nZXRfYmFzZSgpKTsKKyAgfQorfQorCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpIHsKKyAgKHZvaWQpaW5pdDsKKworICB0X3R5cGUqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7CisKKyAgc3RyaW5nIHJlc3VsdCA9IHByZWZpeCArIHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSArICI6ICIKKyAgICAgICAgICAgICAgICAgICsgdHlwZV9uYW1lKGZ0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpICsgIjsiOworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yX2FzeW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZ1bGxfY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24pIHsKKyAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgc3RyaW5nIHByZWZpeDsKKyAgaWYgKGZ1bGxfY2xzID09ICIiKSB7CisgICAgcHJlZml4ID0gIiI7CisgIH0gZWxzZSB7CisgICAgcHJlZml4ID0gZnVsbF9jbHMgKyAiLiI7CisgIH0KKworICBpZiggZm9yX2FzeW5jKSB7CisgICAgaWYgKGlzX3ZvaWQodHR5cGUpKSB7CisgICAgICByZXR1cm4gImZ1bmN0aW9uICIgKyBwcmVmaXggKyBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCksIHRydWUsIGlzX3hjZXB0aW9uKSArICJBc3luYygiCisgICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKTogSUZ1dHVyZTxJbnRlZ2VyPjsiOyAgLy8gbm8gSUZ1dHVyZTx2b2lkPiBpbiBEZWxwaGkKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJmdW5jdGlvbiAiICsgcHJlZml4ICsgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpLCB0cnVlLCBpc194Y2VwdGlvbikgKyAiQXN5bmMoIgorICAgICAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIik6IElGdXR1cmU8IgorICAgICAgICAgICAgICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpICsgIj47IjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGlzX3ZvaWQodHR5cGUpKSB7CisgICAgICByZXR1cm4gInByb2NlZHVyZSAiICsgcHJlZml4ICsgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpLCB0cnVlLCBpc194Y2VwdGlvbikgKyAiKCIKKyAgICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpOyI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiZnVuY3Rpb24gIiArIHByZWZpeCArIG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgdHJ1ZSwgaXNfeGNlcHRpb24pICsgIigiCisgICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKTogIgorICAgICAgICAgICAgICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpICsgIjsiOworICAgIH0KKyAgfQorfQorCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgdF90eXBlKiB0dDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICI7ICI7CisgICAgfQorCisgICAgdHQgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgcmVzdWx0ICs9IGlucHV0X2FyZ19wcmVmaXgodHQpOyAvLyBjb25zdD8KKyAgICByZXN1bHQgKz0gbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSArICI6ICIKKyAgICAgICAgICAgICAgKyB0eXBlX25hbWUodHQsIGZhbHNlLCB0cnVlLCB0dC0+aXNfeGNlcHRpb24oKSwgdHJ1ZSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6Y29uc3RydWN0b3JfYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIGN1cnJlbnRfaW5kZW50KSB7CisgIG9zdHJpbmdzdHJlYW0gcmVzdWx0OworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICB0X3R5cGUqIHR0OworICBzdHJpbmcgbGluZSA9ICIiOworICBzdHJpbmcgbmV3bGluZV9pbmRlbnQgPSBjdXJyZW50X2luZGVudCArICIgICI7CisKKyAgYm9vbCBmaXJzdGxpbmUgPSB0cnVlOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBsaW5lICs9ICI7IjsKKyAgICB9CisKKyAgICBpZiAobGluZS5zaXplKCkgPiA4MCkgeworICAgICAgaWYgKGZpcnN0bGluZSkgeworICAgICAgICByZXN1bHQgPDwgZW5kbCA8PCBuZXdsaW5lX2luZGVudDsKKyAgICAgICAgZmlyc3RsaW5lID0gZmFsc2U7CisgICAgICB9CisgICAgICByZXN1bHQgPDwgbGluZSA8PCBlbmRsOworICAgICAgbGluZSA9IG5ld2xpbmVfaW5kZW50OworICAgIH0gZWxzZSBpZiAobGluZS5zaXplKCkgPiAwKSB7CisgICAgICBsaW5lICs9ICIgIjsKKyAgICB9CisKKyAgICB0dCA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBsaW5lICs9IGlucHV0X2FyZ19wcmVmaXgodHQpOyAvLyBjb25zdD8KKyAgICBsaW5lICs9IGNvbnN0cnVjdG9yX3BhcmFtX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSArICI6ICIKKyAgICAgICAgICAgICsgdHlwZV9uYW1lKHR0LCBmYWxzZSwgdHJ1ZSwgdHQtPmlzX3hjZXB0aW9uKCksIHRydWUpOworICB9CisKKyAgaWYgKGxpbmUuc2l6ZSgpID4gMCkgeworICAgIHJlc3VsdCA8PCBsaW5lOworICB9CisKKyAgc3RyaW5nIHJlc3VsdF9zdHI7CisKKyAgaWYgKGZpcnN0bGluZSkgeworICAgIHJlc3VsdF9zdHIgPSAiICIgKyByZXN1bHQuc3RyKCk7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0X3N0ciA9IHJlc3VsdC5zdHIoKTsKKyAgfQorCisgIHJldHVybiByZXN1bHRfc3RyOworfQorCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlN0cmluZ18iOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQm9vbF8iOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJ5dGVfIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRG91YmxlXyI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TdHJ1Y3QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NYXAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TZXRfIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxpc3QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjplbXB0eV92YWx1ZSh0X3R5cGUqIHR5cGUpIHsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAiMCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgaWYgKGFuc2lzdHJfYmluYXJ5XykgeworICAgICAgICAgIHJldHVybiAiJyciOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiAibmlsIjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICInJyI7CisgICAgICB9CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJGYWxzZSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiMCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIjAuMCI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVCIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIigwKSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAibmlsIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAibmlsIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAibmlsIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIm5pbCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpIHsKKyAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOworCisgIGluZGVudChvdXQpIDw8ICJwcm9jZWR1cmUgU2V0IiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykKKyAgICAgICAgICAgICAgPDwgIiggY29uc3QgVmFsdWU6ICIgPDwgdHlwZV9uYW1lKGZ0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpIDw8ICIpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcykgeworICB0X3R5cGUqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIEdldCIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICI6ICIKKyAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZ0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpIDw8ICI7IiA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2lzc2V0X3JlYWRlcl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uKSB7CisgIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiBHZXRfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb24pIDw8ICI6IFN5c3RlbS5Cb29sZWFuOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9jbGVhcl91bmlvbl92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc191bmlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB4Y2VwdGlvbl9mYWN0b3J5X25hbWUpIHsKKyAgKHZvaWQpY2xzX3ByZWZpeDsKKyAgKHZvaWQpbmFtZTsKKyAgKHZvaWQpdHlwZTsKKyAgKHZvaWQpaXNfdW5pb247CisgICh2b2lkKWlzX3hjZXB0aW9uX2ZhY3Rvcnk7CisgICh2b2lkKXhjZXB0aW9uX2ZhY3RvcnlfbmFtZTsKKworICB0X3R5cGUqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgRl9faXNzZXRfIiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIiB0aGVuIGJlZ2luIgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgIkZfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICIgOj0gRmFsc2U7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8IGZpZWxkUHJlZml4IDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiIDo9ICIKKyAgICAgICAgICAgICAgICAgICA8PCAiRGVmYXVsdCggIiA8PCB0eXBlX25hbWUoZnR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgPDwgIik7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc191bmlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB4Y2VwdGlvbl9mYWN0b3J5X25hbWUpIHsKKyAgKHZvaWQpdHlwZTsKKworICB0X3R5cGUqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAicHJvY2VkdXJlICIgPDwgY2xzX3ByZWZpeCA8PCBuYW1lIDw8ICIuIgorICAgICAgICAgICAgICAgICAgIDw8ICJTZXQiIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKQorICAgICAgICAgICAgICAgICAgIDw8ICIoIGNvbnN0IFZhbHVlOiAiIDw8IHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSA8PCAiKTsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGlmIChpc191bmlvbikgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIkNsZWFyVW5pb25WYWx1ZXM7IiA8PCBlbmRsOworICB9CisgIGlmICh0ZmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiRl9faXNzZXRfIiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIiA6PSBUcnVlOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfaW1wbChvdXQpIDw8IGZpZWxkUHJlZml4IDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiIDo9IFZhbHVlOyIgPDwgZW5kbDsKKworICBpZiAoaXNfeGNlcHRpb25fY2xhc3MgJiYgKCFpc194Y2VwdGlvbl9mYWN0b3J5KSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgeGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICIuIiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgOj0gVmFsdWU7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpIHsKKyAgKHZvaWQpdHlwZTsKKworICB0X3R5cGUqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZnVuY3Rpb24gIiA8PCBjbHNfcHJlZml4IDw8IG5hbWUgPDwgIi4iCisgICAgICAgICAgICAgICAgICAgPDwgIkdldCIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICI6ICIKKyAgICAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZnR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQgOj0gIiA8PCBmaWVsZFByZWZpeCA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24pIHsKKyAgKHZvaWQpdHlwZTsKKworICBzdHJpbmcgaXNzZXRfbmFtZSA9ICJfX2lzc2V0XyIgKyBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbik7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImZ1bmN0aW9uICIgPDwgY2xzX3ByZWZpeCA8PCBuYW1lIDw8ICIuIgorICAgICAgICAgICAgICAgICAgIDw8ICJHZXQiIDw8IGlzc2V0X25hbWUgPDwgIjogU3lzdGVtLkJvb2xlYW47IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0IDo9ICIgPDwgZmllbGRQcmVmaXggPDwgaXNzZXRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfY3JlYXRlX2V4Y2VwdGlvbl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworICAodm9pZCljbHNfcHJlZml4OworCisgIHN0cmluZyBleGNlcHRpb25fY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIHRydWUpOworICBzdHJpbmcgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlLCBpc19leGNlcHRpb24sIGlzX2V4Y2VwdGlvbik7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZnVuY3Rpb24gIiA8PCBjbHNfbm0gPDwgIi5DcmVhdGVFeGNlcHRpb246ICIgPDwgZXhjZXB0aW9uX2Nsc19ubSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdCA6PSAiIDw8IGV4Y2VwdGlvbl9jbHNfbm0gPDwgIi5DcmVhdGU7IiA8PCBlbmRsOworICBzdHJpbmcgZmFjdG9yeV9uYW1lID0gbm9ybWFsaXplX2Nsc25tKHRzdHJ1Y3QtPmdldF9uYW1lKCksICIiLCB0cnVlKSArICJGYWN0b3J5IjsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0LkYiIDw8IGZhY3RvcnlfbmFtZSA8PCAiIDo9IFNlbGY7IiA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgcHJvcG5hbWU7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBwcm9wbmFtZSA9IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiBfX2lzc2V0XyIgPDwgcHJvcG5hbWUgPDwgIiB0aGVuIGJlZ2luIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICB9CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0LiIgPDwgcHJvcG5hbWUgPDwgIiA6PSAiIDw8IHByb3BuYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdC5VcGRhdGVNZXNzYWdlUHJvcGVydHk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZWFkZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKworICBvc3RyaW5nc3RyZWFtIGxvY2FsX3ZhcnM7CisgIG9zdHJpbmdzdHJlYW0gY29kZV9ibG9jazsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGluZGVudF9pbXBsKGxvY2FsX3ZhcnMpIDw8ICJ0cmFja2VyIDogSVByb3RvY29sUmVjdXJzaW9uVHJhY2tlcjsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJ0cmFja2VyIDo9IGlwcm90Lk5leHRSZWN1cnNpb25MZXZlbDsiIDw8IGVuZGw7CisKKyAgLy8gbG9jYWwgYm9vbHMgZm9yIHJlcXVpcmVkIGZpZWxkcworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpbmRlbnRfaW1wbChsb2NhbF92YXJzKSA8PCAiX3JlcV9pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICIgOiBTeXN0ZW0uQm9vbGVhbjsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIl9yZXFfaXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCAiIDo9IEZBTFNFOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInN0cnVjIDo9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInRyeSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAid2hpbGUgKHRydWUpIGRvIiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXyA6PSBpcHJvdC5SZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKGZpZWxkXy5UeXBlXyA9IFRUeXBlLlN0b3ApIHRoZW4iIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIkJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgaWYgKGZpcnN0KSB7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiY2FzZSBmaWVsZF8uSUQgb2YiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIH0KKworICAgIGZpcnN0ID0gZmFsc2U7CisgICAgaWYgKGZfaXRlciAhPSBmaWVsZHMuYmVnaW4oKSkgeworICAgICAgY29kZV9ibG9jayA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjogYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKGZpZWxkXy5UeXBlXyA9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSB0aGVuIGJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChjb2RlX2Jsb2NrLCBpc19leGNlcHRpb24sICpmX2l0ZXIsICJTZWxmLiIsIGxvY2FsX3ZhcnMpOworCisgICAgLy8gcmVxdWlyZWQgZmllbGQ/CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJfcmVxX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgIiA6PSBUUlVFOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd25faW1wbCgpOworCisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZCBlbHNlIGJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIlRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGRfLlR5cGVfKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kIjsKKyAgfQorCisgIGlmICghZmlyc3QpIHsKKyAgICBjb2RlX2Jsb2NrIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVsc2UgYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgfQorCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkXy5UeXBlXyk7IiA8PCBlbmRsOworCisgIGlmICghZmlyc3QpIHsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlwcm90LlJlYWRGaWVsZEVuZDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpbmFsbHkiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpcHJvdC5SZWFkU3RydWN0RW5kOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKKworICAvLyBhbGwgcmVxdWlyZWQgZmllbGRzIGhhdmUgYmVlbiByZWFkPworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgbm90IF9yZXFfaXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykKKyAgICAgICAgICA8PCAidGhlbiByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoIgorICAgICAgICAgIDw8ICIncmVxdWlyZWQgZmllbGQgIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCAiIG5vdCBzZXQnKTsiCisgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgc3RyaW5nIGNsc19ubTsKKworICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UsIGlzX2V4Y2VwdGlvbiwgaXNfZXhjZXB0aW9uKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJwcm9jZWR1cmUgIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLlJlYWQoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2wpOyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJ2YXIiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImZpZWxkXyA6IFRUaHJpZnRGaWVsZDsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgInN0cnVjIDogVFRocmlmdFN0cnVjdDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgb3V0IDw8IGxvY2FsX3ZhcnMuc3RyKCkgPDwgZW5kbDsKKyAgb3V0IDw8IGNvZGVfYmxvY2suc3RyKCk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Jlc3VsdF93cml0ZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKworICBvc3RyaW5nc3RyZWFtIGxvY2FsX3ZhcnM7CisgIG9zdHJpbmdzdHJlYW0gY29kZV9ibG9jazsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGluZGVudF9pbXBsKGxvY2FsX3ZhcnMpIDw8ICJ0cmFja2VyIDogSVByb3RvY29sUmVjdXJzaW9uVHJhY2tlcjsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJ0cmFja2VyIDo9IG9wcm90Lk5leHRSZWN1cnNpb25MZXZlbDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCBzdHJ1YywgJyIgPDwgbmFtZSA8PCAiJyk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7IiA8PCBlbmRsOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggZmllbGRfKTsiIDw8IGVuZGw7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiAoX19pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICIpIHRoZW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8uTmFtZSA6PSAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXy5UeXBlXyAgOj0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfLklEIDo9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVGaWVsZEJlZ2luKGZpZWxkXyk7IiA8PCBlbmRsOworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKGNvZGVfYmxvY2ssIGlzX2V4Y2VwdGlvbiwgKmZfaXRlciwgIlNlbGYuIiwgbG9jYWxfdmFycyk7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICB9CisgIH0KKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgc3RyaW5nIGNsc19ubTsKKworICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UsIGlzX2V4Y2VwdGlvbiwgaXNfZXhjZXB0aW9uKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJwcm9jZWR1cmUgIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLldyaXRlKCBjb25zdCBvcHJvdDogSVByb3RvY29sKTsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAidmFyIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJzdHJ1YyA6IFRUaHJpZnRTdHJ1Y3Q7IiA8PCBlbmRsOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImZpZWxkXyA6IFRUaHJpZnRGaWVsZDsiIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgbG9jYWxfdmFycy5zdHIoKTsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBvdXQgPDwgY29kZV9ibG9jay5zdHIoKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3Rfd3JpdGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisKKyAgb3N0cmluZ3N0cmVhbSBsb2NhbF92YXJzOworICBvc3RyaW5nc3RyZWFtIGNvZGVfYmxvY2s7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChsb2NhbF92YXJzKSA8PCAidHJhY2tlciA6IElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXI7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAidHJhY2tlciA6PSBvcHJvdC5OZXh0UmVjdXJzaW9uTGV2ZWw7IiA8PCBlbmRsOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggc3RydWMsICciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOyIgPDwgZW5kbDsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoIGZpZWxkXyk7IiA8PCBlbmRsOworICB9CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZmllbGRuYW1lID0gcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKTsKKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBib29sIGlzX3JlcXVpcmVkID0gKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpOworICAgIGJvb2wgaGFzX2lzc2V0ID0gKCFpc19yZXF1aXJlZCk7CisgICAgaWYgKGlzX3JlcXVpcmVkICYmIG51bGxfYWxsb3dlZCkgeworICAgICAgbnVsbF9hbGxvd2VkID0gZmFsc2U7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKFNlbGYuIiA8PCBmaWVsZG5hbWUgPDwgIiA9IG5pbCkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAidGhlbiByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIidyZXF1aXJlZCBmaWVsZCAiIDw8IGZpZWxkbmFtZSA8PCAiIG5vdCBzZXQnKTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKFNlbGYuIiA8PCBmaWVsZG5hbWUgPDwgIiA8PiBuaWwpIjsKKyAgICAgIGlmIChoYXNfaXNzZXQpIHsKKyAgICAgICAgY29kZV9ibG9jayA8PCAiIGFuZCBfX2lzc2V0XyIgPDwgZmllbGRuYW1lOworICAgICAgfQorICAgICAgY29kZV9ibG9jayA8PCAiIHRoZW4gYmVnaW4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoaGFzX2lzc2V0KSB7CisgICAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiAoX19pc3NldF8iIDw8IGZpZWxkbmFtZSA8PCAiKSB0aGVuIGJlZ2luIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgICAgfQorICAgIH0KKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfLk5hbWUgOj0gJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfLlR5cGVfICA6PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXy5JRCA6PSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGRfKTsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKGNvZGVfYmxvY2ssIGlzX2V4Y2VwdGlvbiwgKmZfaXRlciwgIlNlbGYuIiwgbG9jYWxfdmFycyk7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisgICAgaWYgKG51bGxfYWxsb3dlZCB8fCBoYXNfaXNzZXQpIHsKKyAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBzdHJpbmcgY2xzX25tOworCisgIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCBmYWxzZSwgaXNfZXhjZXB0aW9uLCBpc19leGNlcHRpb24pOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgInByb2NlZHVyZSAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuV3JpdGUoIGNvbnN0IG9wcm90OiBJUHJvdG9jb2wpOyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJ2YXIiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgInN0cnVjIDogVFRocmlmdFN0cnVjdDsiIDw8IGVuZGw7CisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImZpZWxkXyA6IFRUaHJpZnRGaWVsZDsiIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGxvY2FsX3ZhcnMuc3RyKCk7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgb3V0IDw8IGNvZGVfYmxvY2suc3RyKCk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Rvc3RyaW5nX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSkgeworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgY2xzX25tOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgKCFpc194X2ZhY3RvcnkpLCBpc194X2ZhY3RvcnksIHRydWUpOworICB9IGVsc2UgeworICAgIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCBmYWxzZSk7CisgIH0KKworICBzdHJpbmcgdG1wX3NiID0gdG1wKCJfc2IiKTsKKyAgc3RyaW5nIHRtcF9maXJzdCA9IHRtcCgiX2ZpcnN0Iik7CisgIGJvb2wgdXNlRmlyc3RGbGFnID0gZmFsc2U7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZnVuY3Rpb24gIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLlRvU3RyaW5nOiBzdHJpbmc7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJ2YXIiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIgOiBUVGhyaWZ0U3RyaW5nQnVpbGRlcjsiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBpc19vcHRpb25hbCA9ICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKTsKKyAgICBpZiAoaXNfb3B0aW9uYWwpIHsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX2ZpcnN0IDw8ICIgOiBTeXN0ZW0uQm9vbGVhbjsiIDw8IGVuZGw7CisgICAgICB1c2VGaXJzdEZsYWcgPSB0cnVlOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIgOj0gVFRocmlmdFN0cmluZ0J1aWxkZXIuQ3JlYXRlKCcoJyk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgaWYgKHVzZUZpcnN0RmxhZykgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX2ZpcnN0IDw8ICIgOj0gVFJVRTsiIDw8IGVuZGw7CisgIH0KKworICBib29sIGhhZF9yZXF1aXJlZCA9IGZhbHNlOyAvLyBzZXQgdG8gdHJ1ZSBhZnRlciBmaXJzdCByZXF1aXJlZCBmaWVsZCBoYXMgYmVlbiBwcm9jZXNzZWQKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCk7CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgKFNlbGYuIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIgPD4gbmlsKSI7CisgICAgICBpZiAoaXNfb3B0aW9uYWwpIHsKKyAgICAgICAgb3V0IDw8ICIgYW5kIF9faXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiIHRoZW4gYmVnaW4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoaXNfb3B0aW9uYWwpIHsKKyAgICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgKF9faXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCAiKSB0aGVuIGJlZ2luIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHVzZUZpcnN0RmxhZyAmJiAoIWhhZF9yZXF1aXJlZCkpIHsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlmIG5vdCAiIDw8IHRtcF9maXJzdCA8PCAiIHRoZW4gIiA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoJywnKTsiIDw8IGVuZGw7CisgICAgICBpZiAoaXNfb3B0aW9uYWwpIHsKKyAgICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfZmlyc3QgPDwgIiA6PSBGQUxTRTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiLkFwcGVuZCgnIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICI6ICcpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoJywgIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICI6ICcpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisKKyAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7CisgICAgfQorCisgICAgaWYgKHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgKFNlbGYuIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIgPSBuaWwpIHRoZW4gIiA8PCB0bXBfc2IKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIi5BcHBlbmQoJzxudWxsPicpIGVsc2UgIiA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoIFNlbGYuIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIuVG9TdHJpbmcoKSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoU3lzdGVtLkludGVnZXIoIFNlbGYuIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKCBTZWxmLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiKTsiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKG51bGxfYWxsb3dlZCB8fCBpc19vcHRpb25hbCkgeworICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoIWlzX29wdGlvbmFsKSB7CisgICAgICBoYWRfcmVxdWlyZWQgPSB0cnVlOyAvLyBub3cgX19maXJzdCBtdXN0IGJlIGZhbHNlLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGl0IGFueW1vcmUKKyAgICB9CisgIH0KKworICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiLkFwcGVuZCgnKScpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0IDo9ICIgPDwgdG1wX3NiIDw8ICIuVG9TdHJpbmc7IiA8PCBlbmRsOworICBpZiAodXNlRmlyc3RGbGFnKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgIiA8PCB0bXBfZmlyc3QgPDwgIiB0aGVuIHtwcmV2ZW50IHdhcm5pbmd9OyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIi5GcmVlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCitib29sIHRfZGVscGhpX2dlbmVyYXRvcjo6aXNfdm9pZCh0X3R5cGUqIHR5cGUpIHsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgZGVscGhpLAorICAgICJkZWxwaGkiLAorICAgICIgICAgYW5zaXN0cl9iaW5hcnk6ICBVc2UgQW5zaVN0cmluZyBmb3IgYmluYXJ5IGRhdGF0eXBlIChkZWZhdWx0IGlzIFRCeXRlcykuXG4iCisgICAgIiAgICByZWdpc3Rlcl90eXBlczogIEVuYWJsZSBUeXBlUmVnaXN0cnksIGFsbG93cyBmb3IgY3JlYXRpb24gb2Ygc3RydWN0LCB1bmlvblxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBhbmQgY29udGFpbmVyIGluc3RhbmNlcyBieSBpbnRlcmZhY2Ugb3IgVHlwZUluZm8oKVxuIgorICAgICIgICAgY29uc3RwcmVmaXg6ICAgICBOYW1lIFRDb25zdGFudHMgY2xhc3NlcyBhZnRlciBJREwgdG8gcmVkdWNlIGFtYmlndWl0aWVzXG4iCisgICAgIiAgICBldmVudHM6ICAgICAgICAgIEVuYWJsZSBhbmQgdXNlIHByb2Nlc3NpbmcgZXZlbnRzIGluIHRoZSBnZW5lcmF0ZWQgY29kZS5cbiIKKyAgICAiICAgIHhtbGRvYzogICAgICAgICAgRW5hYmxlIFhNTERvYyBjb21tZW50cyBmb3IgSGVscCBJbnNpZ2h0IGV0Yy5cbiIKKyAgICAiICAgIGFzeW5jOiAgICAgICAgICAgR2VuZXJhdGUgSUFzeW5jIGludGVyZmFjZSB0byB1c2UgUGFyYWxsZWwgUHJvZ3JhbW1pbmcgTGlicmFyeSAoWEU3KyBvbmx5KS5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkOTFhNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDEyODEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBFcmxhbmcgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X2VybF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2VybF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBsZWdhY3lfbmFtZXNfID0gZmFsc2U7CisgICAgbWFwc18gPSBmYWxzZTsKKyAgICBvdHAxNl8gPSBmYWxzZTsKKyAgICBleHBvcnRfbGluZXNfZmlyc3RfID0gdHJ1ZTsKKyAgICBleHBvcnRfdHlwZXNfbGluZXNfZmlyc3RfID0gdHJ1ZTsKKworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImxlZ2FjeW5hbWVzIikgPT0gMCkgeworICAgICAgICBsZWdhY3lfbmFtZXNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibWFwcyIpID09IDApIHsKKyAgICAgICAgbWFwc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJvdHAxNiIpID09IDApIHsKKyAgICAgICAgb3RwMTZfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBlcmw6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIGlmIChtYXBzXyAmJiBvdHAxNl8pIHsKKyAgICAgIHRocm93ICJhcmd1bWVudCBlcnJvcjogQ2Fubm90IHNwZWNpZnkgYm90aCBtYXBzIGFuZCBvdHAxNjsgbWFwcyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgRXJsYW5nL09UUCBSMTYgb3Igb2xkZXIiOworICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWVybCI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfbWVtYmVyX3R5cGUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7CisgIHZvaWQgZ2VuZXJhdGVfbWVtYmVyX3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfbWVtYmVyX3R5cGUodF9maWVsZCogZmllbGQpOworICBzdGQ6OnN0cmluZyByZW5kZXJfbWVtYmVyX3ZhbHVlKHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX21lbWJlcl9yZXF1aXJlZG5lc3ModF9maWVsZCogZmllbGQpOworCisgIC8vICBzdGQ6OnN0cmluZyByZW5kZXJfZGVmYXVsdF92YWx1ZSh0X3R5cGUqIHR5cGUpOworICBzdGQ6OnN0cmluZyByZW5kZXJfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX3R5cGVfdGVybSh0X3R5cGUqIHR0eXBlLCBib29sIGV4cGFuZF9zdHJ1Y3RzLCBib29sIGV4dGVuZGVkX2luZm8gPSBmYWxzZSk7CisKKyAgLyoqCisgICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9lcmxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZXJsX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZXJsX3N0cnVjdF9tZW1iZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRtZW1iZXIpOworICB2b2lkIGdlbmVyYXRlX2VybF9zdHJ1Y3RfaW5mbyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2VybF9leHRlbmRlZF9zdHJ1Y3RfaW5mbyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2VybF9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfdHlwZV9tZXRhZGF0YShzdGQ6OnN0cmluZyBmdW5jdGlvbl9uYW1lLCB2ZWN0b3I8c3RyaW5nPiBuYW1lcyk7CisgIHZvaWQgZ2VuZXJhdGVfZW51bV9pbmZvKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2VudW1fbWV0YWRhdGEoKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdF9mdW5jdGlvbih0X2NvbnN0KiB0Y29uc3QsIG9zdHJpbmdzdHJlYW0mIGV4cG9ydHMsIG9zdHJpbmdzdHJlYW0mIGZ1bmN0aW9ucyk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3RfZnVuY3Rpb25zKCk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9tZXRhZGF0YSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9pbmZvKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIGVybF9hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgc3RkOjpzdHJpbmcgZXJsX2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVzKCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X2xpc3RfdmFsdWVzKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyB0eXBlX21vZHVsZSh0X3R5cGUqIHR0eXBlKTsKKworICBzdGQ6OnN0cmluZyBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHN0ZDo6c3RyaW5nIGluKSB7CisgICAgaWYgKGxlZ2FjeV9uYW1lc18pIHsKKyAgICAgIHJldHVybiBkZWNhcGl0YWxpemUoaW4pOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gdW5kZXJzY29yZShpbik7CisgICAgfQorICB9CisKKyAgc3RkOjpzdHJpbmcgYXRvbWlmeShzdGQ6OnN0cmluZyBpbikgeworICAgIGlmIChsZWdhY3lfbmFtZXNfKSB7CisgICAgICByZXR1cm4gIiciICsgZGVjYXBpdGFsaXplKGluKSArICInIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICInIiArIGluICsgIiciOworICAgIH0KKyAgfQorCisgIHN0ZDo6c3RyaW5nIGNvbnN0aWZ5KHN0ZDo6c3RyaW5nIGluKSB7CisgICAgaWYgKGxlZ2FjeV9uYW1lc18pIHsKKyAgICAgIHJldHVybiBjYXBpdGFsaXplKGluKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHVwcGVyY2FzZShpbik7CisgICAgfQorICB9CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbW1lbnQoc3RyaW5nIGluKTsKKworcHJpdmF0ZToKKyAgYm9vbCBoYXNfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKik7CisKKyAgLyogaWYgdHJ1ZSByZXRhaW4gcHJlIDAuOS4yIG5hbWluZyBzY2hlbWUgZm9yIGZ1bmN0aW9ucywgYXRvbXMgYW5kIGNvbnN0cyAqLworICBib29sIGxlZ2FjeV9uYW1lc187CisKKyAgLyogaWYgdHJ1ZSB1c2UgbWFwcyBpbnN0ZWFkIG9mIGRpY3RzIGluIGdlbmVyYXRlZCBjb2RlICovCisgIGJvb2wgbWFwc187CisKKyAgLyogaWYgdHJ1ZSB1c2Ugbm9uLW5hbWVzcGFjZWQgZGljdCBhbmQgc2V0IGluc3RlYWQgb2YgZGljdDpkaWN0IGFuZCBzZXRzOnNldCAqLworICBib29sIG90cDE2XzsKKworICAvKioKKyAgICogYWRkIGZ1bmN0aW9uIHRvIGV4cG9ydCBsaXN0CisgICAqLworCisgIHZvaWQgZXhwb3J0X2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGV4cG9ydF9zdHJpbmcoc3RkOjpzdHJpbmcgbmFtZSwgaW50IG51bSk7CisKKyAgdm9pZCBleHBvcnRfdHlwZXNfc3RyaW5nKHN0ZDo6c3RyaW5nIG5hbWUsIGludCBudW0pOworCisgIC8qKgorICAgKiB3cml0ZSBvdXQgaGVhZGVycyBhbmQgZm9vdGVycyBmb3IgaHJsIGZpbGVzCisgICAqLworCisgIHZvaWQgaHJsX2hlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSk7CisgIHZvaWQgaHJsX2Zvb3RlcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSk7CisKKyAgLyoqCisgICAqIHN0dWZmIHRvIHNwaXQgb3V0IGF0IHRoZSB0b3Agb2YgZ2VuZXJhdGVkIGZpbGVzCisgICAqLworCisgIGJvb2wgZXhwb3J0X2xpbmVzX2ZpcnN0XzsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGV4cG9ydF9saW5lc187CisKKyAgYm9vbCBleHBvcnRfdHlwZXNfbGluZXNfZmlyc3RfOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gZXhwb3J0X3R5cGVzX2xpbmVzXzsKKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBmX2luZm9fOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gZl9pbmZvX2V4dF87CisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzX2ZpbGVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfaHJsX2ZpbGVfOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfZmlsZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfaHJsX2ZpbGVfOworCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBmX3NlcnZpY2VfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV9maWxlXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfaHJsXzsKKworICAvKioKKyAgICogTWV0YWRhdGEgY29udGFpbmVycworICAgKi8KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHZfc3RydWN0X25hbWVzXzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHZfZW51bV9uYW1lc187CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB2X2V4Y2VwdGlvbl9uYW1lc187CisgIHN0ZDo6dmVjdG9yPHRfZW51bSo+IHZfZW51bXNfOworICBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gdl9jb25zdHNfOworfTsKKworLyoqCisgKiBVSSBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICAvLyBzZXR1cCBleHBvcnQgbGluZXMKKyAgZXhwb3J0X2xpbmVzX2ZpcnN0XyA9IHRydWU7CisgIGV4cG9ydF90eXBlc19saW5lc19maXJzdF8gPSB0cnVlOworCisgIHN0cmluZyBwcm9ncmFtX21vZHVsZV9uYW1lID0gbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShwcm9ncmFtX25hbWVfKTsKKworICAvLyB0eXBlcyBmaWxlcworICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbW9kdWxlX25hbWUgKyAiX3R5cGVzLmVybCI7CisgIHN0cmluZyBmX3R5cGVzX2hybF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbW9kdWxlX25hbWUgKyAiX3R5cGVzLmhybCI7CisKKyAgZl90eXBlc19maWxlXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKyAgZl90eXBlc19ocmxfZmlsZV8ub3BlbihmX3R5cGVzX2hybF9uYW1lLmNfc3RyKCkpOworCisgIGhybF9oZWFkZXIoZl90eXBlc19ocmxfZmlsZV8sIHByb2dyYW1fbW9kdWxlX25hbWUgKyAiX3R5cGVzIik7CisKKyAgZl90eXBlc19maWxlXyA8PCBlcmxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8ICItbW9kdWxlKCIgPDwgcHJvZ3JhbV9tb2R1bGVfbmFtZSA8PCAiX3R5cGVzKS4iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBlcmxfaW1wb3J0cygpIDw8IGVuZGw7CisKKyAgZl90eXBlc19maWxlXyA8PCAiLWluY2x1ZGUoXCIiIDw8IHByb2dyYW1fbW9kdWxlX25hbWUgPDwgIl90eXBlcy5ocmxcIikuIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgIGZfdHlwZXNfaHJsX2ZpbGVfIDw8IHJlbmRlcl9pbmNsdWRlcygpIDw8IGVuZGw7CisKKyAgLy8gY29uc3RzIGZpbGVzCisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbW9kdWxlX25hbWUgKyAiX2NvbnN0YW50cy5lcmwiOworICBzdHJpbmcgZl9jb25zdHNfaHJsX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9tb2R1bGVfbmFtZSArICJfY29uc3RhbnRzLmhybCI7CisKKyAgZl9jb25zdHNfZmlsZV8ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworICBmX2NvbnN0c19ocmxfZmlsZV8ub3BlbihmX2NvbnN0c19ocmxfbmFtZS5jX3N0cigpKTsKKworICBmX2NvbnN0c19maWxlXyA8PCBlcmxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCAiLW1vZHVsZSgiIDw8IHByb2dyYW1fbW9kdWxlX25hbWUgPDwgIl9jb25zdGFudHMpLiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBlcmxfaW1wb3J0cygpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgIi1pbmNsdWRlKFwiIiA8PCBwcm9ncmFtX21vZHVsZV9uYW1lIDw8ICJfdHlwZXMuaHJsXCIpLiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgIGZfY29uc3RzX2hybF9maWxlXyA8PCBlcmxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBlcmxfaW1wb3J0cygpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgIDw8ICItaW5jbHVkZShcIiIgPDwgcHJvZ3JhbV9tb2R1bGVfbmFtZSA8PCAiX3R5cGVzLmhybFwiKS4iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBCb2lsZXJwbGF0ZSBhdCBiZWdpbm5pbmcgYW5kIGVuZCBvZiBoZWFkZXIgZmlsZXMKKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmhybF9oZWFkZXIob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSkgeworICBvdXQgPDwgIi1pZm5kZWYoXyIgPDwgbmFtZSA8PCAiX2luY2x1ZGVkKS4iIDw8IGVuZGwgPDwgIi1kZWZpbmUoXyIgPDwgbmFtZSA8PCAiX2luY2x1ZGVkLCB5ZWFoKS4iCisgICAgICA8PCBlbmRsOworfQorCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6aHJsX2Zvb3Rlcihvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lKSB7CisgICh2b2lkKW5hbWU7CisgIG91dCA8PCAiLWVuZGlmLiIgPDwgZW5kbDsKK30KKworLyoqCisgKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGluY2x1ZGluZyBhbm90aGVyIFRocmlmdCBwcm9ncmFtCisgKi8KK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlcygpIHsKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgcmVzdWx0ICs9ICItaW5jbHVkZShcIiIgKyBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICArICJfdHlwZXMuaHJsXCIpLlxuIjsKKyAgfQorICBpZiAoaW5jbHVkZXMuc2l6ZSgpID4gMCkgeworICAgIHJlc3VsdCArPSAiXG4iOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQXV0b2dlbidkIGNvbW1lbnQKKyAqLworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6ZXJsX2F1dG9nZW5fY29tbWVudCgpIHsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKCIlJVxuIikgKyAiJSUgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICArICIlJVxuIiArICIlJSBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iCisgICAgICAgICArICIlJVxuIjsKK30KKworLyoqCisgKiBDb21tZW50IG91dCB0ZXh0CisgKi8KKworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6Y29tbWVudChzdHJpbmcgaW4pIHsKKyAgc2l6ZV90IHBvcyA9IDA7CisgIGluLmluc2VydChwb3MsICIlJSAiKTsKKyAgd2hpbGUgKChwb3MgPSBpbi5maW5kX2ZpcnN0X29mKCdcbicsIHBvcykpICE9IHN0cmluZzo6bnBvcykgeworICAgIGluLmluc2VydCgrK3BvcywgIiUlICIpOworICB9CisgIHJldHVybiBpbjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgdGhyaWZ0IGltcG9ydHMKKyAqLworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6ZXJsX2ltcG9ydHMoKSB7CisgIHJldHVybiAiIjsKK30KKworLyoqCisgKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKworICBleHBvcnRfdHlwZXNfc3RyaW5nKCJzdHJ1Y3RfaW5mbyIsIDEpOworICBleHBvcnRfdHlwZXNfc3RyaW5nKCJzdHJ1Y3RfaW5mb19leHQiLCAxKTsKKyAgZXhwb3J0X3R5cGVzX3N0cmluZygiZW51bV9pbmZvIiwgMSk7CisgIGV4cG9ydF90eXBlc19zdHJpbmcoImVudW1fbmFtZXMiLCAwKTsKKyAgZXhwb3J0X3R5cGVzX3N0cmluZygic3RydWN0X25hbWVzIiwgMCk7CisgIGV4cG9ydF90eXBlc19zdHJpbmcoImV4Y2VwdGlvbl9uYW1lcyIsIDApOworCisgIGZfdHlwZXNfZmlsZV8gPDwgIi1leHBvcnQoWyIgPDwgZXhwb3J0X3R5cGVzX2xpbmVzXy5zdHIoKSA8PCAiXSkuIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl90eXBlc19maWxlXyA8PCBmX2luZm9fLnN0cigpOworICBmX3R5cGVzX2ZpbGVfIDw8ICJzdHJ1Y3RfaW5mbyhfKSAtPiBlcmxhbmc6ZXJyb3IoZnVuY3Rpb25fY2xhdXNlKS4iIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3R5cGVzX2ZpbGVfIDw8IGZfaW5mb19leHRfLnN0cigpOworICBmX3R5cGVzX2ZpbGVfIDw8ICJzdHJ1Y3RfaW5mb19leHQoXykgLT4gZXJsYW5nOmVycm9yKGZ1bmN0aW9uX2NsYXVzZSkuIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfY29uc3RfZnVuY3Rpb25zKCk7CisKKyAgZ2VuZXJhdGVfdHlwZV9tZXRhZGF0YSgic3RydWN0X25hbWVzIiwgdl9zdHJ1Y3RfbmFtZXNfKTsKKyAgZ2VuZXJhdGVfZW51bV9tZXRhZGF0YSgpOworICBnZW5lcmF0ZV90eXBlX21ldGFkYXRhKCJlbnVtX25hbWVzIiwgdl9lbnVtX25hbWVzXyk7CisgIGdlbmVyYXRlX3R5cGVfbWV0YWRhdGEoImV4Y2VwdGlvbl9uYW1lcyIsIHZfZXhjZXB0aW9uX25hbWVzXyk7CisKKyAgaHJsX2Zvb3RlcihmX3R5cGVzX2hybF9maWxlXywgc3RyaW5nKCJCT0dVUyIpKTsKKworICBmX3R5cGVzX2ZpbGVfLmNsb3NlKCk7CisgIGZfdHlwZXNfaHJsX2ZpbGVfLmNsb3NlKCk7CisgIGZfY29uc3RzX2ZpbGVfLmNsb3NlKCk7CisgIGZfY29uc3RzX2hybF9maWxlXy5jbG9zZSgpOworfQorCitjb25zdCBzdGQ6OnN0cmluZyBlbWl0X2RvdWJsZV9hc19zdHJpbmcoY29uc3QgZG91YmxlIHZhbHVlKSB7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIGRvdWJsZV9vdXRwdXRfc3RyZWFtOworICAvLyBzZXRzIHRoZSBtYXhpbXVtIHByZWNpc2lvbjogaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvaW8vbWFuaXAvc2V0cHJlY2lzaW9uCisgIC8vIHNldHMgdGhlIG91dHB1dCBmb3JtYXQgdG8gZml4ZWQ6IGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2lvL21hbmlwL2ZpeGVkIChub3QgaW4gc2NpZW50aWZpYyBub3RhdGlvbikKKyAgZG91YmxlX291dHB1dF9zdHJlYW0gPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpkaWdpdHMxMCArIDEpOworCisgICNpZmRlZiBfTVNDX1ZFUgorICAgICAgLy8gc3RydG9kIGlzIGJyb2tlbiBpbiBNU1ZDIGNvbXBpbGVycyBvbGRlciB0aGFuIDIwMTUsIHNvIHN0ZDo6Zml4ZWQgZmFpbHMgdG8gZm9ybWF0IGEgZG91YmxlIGxpdGVyYWwuCisgICAgICAvLyBtb3JlIGRldGFpbHM6IGh0dHBzOi8vYmxvZ3MubXNkbi5taWNyb3NvZnQuY29tL3ZjYmxvZy8yMDE0LzA2LzE4LworICAgICAgLy8gICAgICAgICAgICAgICBjLXJ1bnRpbWUtY3J0LWZlYXR1cmVzLWZpeGVzLWFuZC1icmVha2luZy1jaGFuZ2VzLWluLXZpc3VhbC1zdHVkaW8tMTQtY3RwMS8KKyAgICAgIC8vICAgICAgICAgICAgICAgYW5kCisgICAgICAvLyAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuZXhwbG9yaW5nYmluYXJ5LmNvbS92aXN1YWwtYy1wbHVzLXBsdXMtc3RydG9kLXN0aWxsLWJyb2tlbi8KKyAgICAgICNpZiBfTVNDX1ZFUiA+PSBNU0NfMjAxNV9WRVIKKyAgICAgICAgICBkb3VibGVfb3V0cHV0X3N0cmVhbSA8PCBzdGQ6OmZpeGVkOworICAgICAgI2Vsc2UKKyAgICAgICAgICAvLyBub3RlIHRoYXQgaWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGUgZXJsYW5nIGdlbmVyYXRvciBhbmQgdGhlIE1TVkMgY29tcGlsZXIgaXMgb2xkZXIgdGhhbiAyMDE1LAorICAgICAgICAgIC8vIHRoZSBkb3VibGUgbGl0ZXJhbCBtdXN0IGJlIG91dHB1dCBpbiB0aGUgc2NpZW50aWZpYyBmb3JtYXQuIFRoZXJlIGNhbiBiZSBzb21lIGNhc2VzIHdoZXJlIHRoZQorICAgICAgICAgIC8vIG1hbnRpc3NhIG9mIHRoZSBvdXRwdXQgZG9lcyBub3QgaGF2ZSBmcmFjdGlvbmFscywgd2hpY2ggaXMgaWxsZWdhbCBpbiBFcmxhbmcuCisgICAgICAgICAgLy8gZXhhbXBsZSA9PiAxMDAwMDAwMDAwMDAwMDAwMC4wIGJlaW5nIG91dHB1dCBhcyAxZSsxNgorICAgICAgICAgIGRvdWJsZV9vdXRwdXRfc3RyZWFtIDw8IHN0ZDo6c2NpZW50aWZpYzsKKyAgICAgICNlbmRpZgorICAjZWxzZQorICAgICAgZG91YmxlX291dHB1dF9zdHJlYW0gPDwgc3RkOjpmaXhlZDsKKyAgI2VuZGlmCisKKyAgZG91YmxlX291dHB1dF9zdHJlYW0gPDwgdmFsdWU7CisKKyAgcmV0dXJuIGRvdWJsZV9vdXRwdXRfc3RyZWFtLnN0cigpOworfQorCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZV9tZXRhZGF0YShzdGQ6OnN0cmluZyBmdW5jdGlvbl9uYW1lLCB2ZWN0b3I8c3RyaW5nPiBuYW1lcykgeworICBzaXplX3QgbnVtX3N0cnVjdHMgPSBuYW1lcy5zaXplKCk7CisKKyAgaW5kZW50KGZfdHlwZXNfZmlsZV8pIDw8IGZ1bmN0aW9uX25hbWUgPDwgIigpIC0+XG4iOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfdHlwZXNfZmlsZV8pIDw8ICJbIjsKKworCisgIGZvcihzaXplX3QgaT0wOyBpIDwgbnVtX3N0cnVjdHM7IGkrKykgeworICAgIGZfdHlwZXNfZmlsZV8gPDwgbmFtZXMuYXQoaSk7CisKKyAgICBpZiAoaSA8IG51bV9zdHJ1Y3RzIC0gMSkgeworICAgICAgZl90eXBlc19maWxlXyA8PCAiLCAiOworICAgIH0KKyAgfQorCisgIGZfdHlwZXNfZmlsZV8gPDwgIl0uXG5cbiI7CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gbm8gb3AKKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisKK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdF9mdW5jdGlvbih0X2NvbnN0KiB0Y29uc3QsIG9zdHJpbmdzdHJlYW0mIGV4cG9ydHMsIG9zdHJpbmdzdHJlYW0mIGZ1bmN0aW9ucykgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRjb25zdC0+Z2V0X3R5cGUoKSk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIHN0cmluZyBjb25zdF9mdW5fbmFtZSA9IGxvd2VyY2FzZShuYW1lKTsKKworICAgIC8vIEVtaXQgY29uc3QgZnVuY3Rpb24gZXhwb3J0LgorICAgIGlmIChleHBvcnRzLnRlbGxwKCkgPiAwKSB7IGV4cG9ydHMgPDwgIiwgIjsgfQorICAgIGV4cG9ydHMgPDwgY29uc3RfZnVuX25hbWUgPDwgIi8xLCAiIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIvMiI7CisKKyAgICAvLyBFbWl0IGNvbnN0IGZ1bmN0aW9uIGRlZmluaXRpb24uCisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIGksIGVuZCA9IHZhbHVlLT5nZXRfbWFwKCkuZW5kKCk7CisgICAgLy8gVGhlIG9uZS1hcmd1bWVudCBmb3JtIHRocm93cyBhbiBlcnJvciBpZiB0aGUga2V5IGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAuCisgICAgZm9yIChpID0gdmFsdWUtPmdldF9tYXAoKS5iZWdpbigpOyBpICE9IGVuZDspIHsKKyAgICAgIGZ1bmN0aW9ucyA8PCBjb25zdF9mdW5fbmFtZSA8PCAiKCIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCBpLT5maXJzdCkgPDwgIikgLT4gIgorICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgaS0+c2Vjb25kKTsKKyAgICAgICsraTsKKyAgICAgIGZ1bmN0aW9ucyA8PCAoaSAhPSBlbmQgPyAiO1xuIiA6ICIuXG5cbiIpOworICAgIH0KKworICAgIC8vIFRoZSB0d28tYXJndW1lbnQgZm9ybSByZXR1cm5zIGEgZGVmYXVsdCB2YWx1ZSBpZiB0aGUga2V5IGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAuCisgICAgZm9yIChpID0gdmFsdWUtPmdldF9tYXAoKS5iZWdpbigpOyBpICE9IGVuZDsgKytpKSB7CisgICAgICBmdW5jdGlvbnMgPDwgY29uc3RfZnVuX25hbWUgPDwgIigiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgaS0+Zmlyc3QpIDw8ICIsIF8pIC0+ICIKKyAgICAgICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIGktPnNlY29uZCkgPDwgIjtcbiI7CisgICAgfQorICAgIGZ1bmN0aW9ucyA8PCBjb25zdF9mdW5fbmFtZSA8PCAiKF8sIERlZmF1bHQpIC0+IERlZmF1bHQuXG5cbiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgc3RyaW5nIGNvbnN0X2Z1bl9uYW1lID0gbG93ZXJjYXNlKG5hbWUpOworCisgICAgaWYgKGV4cG9ydHMudGVsbHAoKSA+IDApIHsgZXhwb3J0cyA8PCAiLCAiOyB9CisgICAgZXhwb3J0cyA8PCBjb25zdF9mdW5fbmFtZSA8PCAiLzEsICIgPDwgY29uc3RfZnVuX25hbWUgPDwgIi8yIjsKKworICAgIHNpemVfdCBsaXN0X3NpemUgPSB2YWx1ZS0+Z2V0X2xpc3QoKS5zaXplKCk7CisgICAgc3RyaW5nIHJlbmRlcmVkX2xpc3QgPSByZW5kZXJfY29uc3RfbGlzdF92YWx1ZXModHlwZSwgdmFsdWUpOworICAgIGZ1bmN0aW9ucyA8PCBjb25zdF9mdW5fbmFtZSA8PCAiKE4pIHdoZW4gTiA+PSAxLCBOID08ICIgPDwgbGlzdF9zaXplIDw8ICIgLT5cbiIKKyAgICAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJlbGVtZW50KE4sIHsiIDw8IHJlbmRlcmVkX2xpc3QgPDwgIn0pLlxuIjsKKyAgICBmdW5jdGlvbnMgPDwgY29uc3RfZnVuX25hbWUgPDwgIihOLCBfKSB3aGVuIE4gPj0gMSwgTiA9PCAiIDw8IGxpc3Rfc2l6ZSA8PCAiIC0+XG4iCisgICAgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiZWxlbWVudChOLCB7IiA8PCByZW5kZXJlZF9saXN0IDw8ICJ9KTtcbiIKKyAgICAgICAgICAgICAgPDwgY29uc3RfZnVuX25hbWUgPDwgIihfLCBEZWZhdWx0KSAtPiBEZWZhdWx0LlxuXG4iOworICAgIGluZGVudF9kb3duKCk7CisgIH0KK30KKwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0X2Z1bmN0aW9ucygpIHsKKyAgb3N0cmluZ3N0cmVhbSBleHBvcnRzOworICBvc3RyaW5nc3RyZWFtIGZ1bmN0aW9uczsKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IHZfY29uc3RzXy5iZWdpbigpOyBjX2l0ZXIgIT0gdl9jb25zdHNfLmVuZCgpOyArK2NfaXRlcikgeworICAgIGdlbmVyYXRlX2NvbnN0X2Z1bmN0aW9uKCpjX2l0ZXIsIGV4cG9ydHMsIGZ1bmN0aW9ucyk7CisgIH0KKyAgaWYgKGV4cG9ydHMudGVsbHAoKSA+IDApIHsKKyAgICBmX2NvbnN0c19maWxlXyA8PCAiLWV4cG9ydChbIiA8PCBleHBvcnRzLnN0cigpIDw8ICJdKS5cblxuIgorICAgICAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9ucy5zdHIoKTsKKyAgfQorfQorCisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCisgKiB0aGUgdmFsdWVzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisKKyAgdl9lbnVtc18ucHVzaF9iYWNrKHRlbnVtKTsKKyAgdl9lbnVtX25hbWVzXy5wdXNoX2JhY2soYXRvbWlmeSh0ZW51bS0+Z2V0X25hbWUoKSkpOworCisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBpbmRlbnQoZl90eXBlc19ocmxfZmlsZV8pIDw8ICItZGVmaW5lKCIgPDwgY29uc3RpZnkobWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShwcm9ncmFtX25hbWVfKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJfIiA8PCBjb25zdGlmeSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIl8iIDw8IGNvbnN0aWZ5KG5hbWUpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHZhbHVlIDw8ICIpLiIgPDwgZW5kbDsKKyAgfQorCisgIGZfdHlwZXNfaHJsX2ZpbGVfIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtX2luZm8odF9lbnVtKiB0ZW51bSl7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICBzaXplX3QgbnVtX2NvbnN0YW50cyA9IGNvbnN0YW50cy5zaXplKCk7CisKKyAgaW5kZW50KGZfdHlwZXNfZmlsZV8pIDw8ICJlbnVtX2luZm8oIiA8PCBhdG9taWZ5KHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiKSAtPlxuIjsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3R5cGVzX2ZpbGVfKSA8PCAiW1xuIjsKKworICBmb3Ioc2l6ZV90IGk9MDsgaSA8IG51bV9jb25zdGFudHM7IGkrKykgeworICAgIGluZGVudF91cCgpOworICAgIHRfZW51bV92YWx1ZSogdmFsdWUgPSBjb25zdGFudHMuYXQoaSk7CisgICAgaW5kZW50KGZfdHlwZXNfZmlsZV8pIDw8ICJ7IiA8PCBhdG9taWZ5KHZhbHVlLT5nZXRfbmFtZSgpKSA8PCAiLCAiIDw8IHZhbHVlLT5nZXRfdmFsdWUoKSA8PCAifSI7CisKKyAgICBpZiAoaSA8IG51bV9jb25zdGFudHMgLSAxKSB7CisgICAgICBmX3R5cGVzX2ZpbGVfIDw8ICIsXG4iOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICB9CisgIGZfdHlwZXNfZmlsZV8gPDwgIlxuIjsKKyAgaW5kZW50KGZfdHlwZXNfZmlsZV8pIDw8ICJdO1xuXG4iOworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bV9tZXRhZGF0YSgpIHsKKyAgc2l6ZV90IGVudW1fY291bnQgPSB2X2VudW1zXy5zaXplKCk7CisKKyAgZm9yKHNpemVfdCBpPTA7IGkgPCBlbnVtX2NvdW50OyBpKyspIHsKKyAgICB0X2VudW0qIHRlbnVtID0gdl9lbnVtc18uYXQoaSk7CisgICAgZ2VuZXJhdGVfZW51bV9pbmZvKHRlbnVtKTsKKyAgfQorCisgIGluZGVudChmX3R5cGVzX2ZpbGVfKSA8PCAiZW51bV9pbmZvKF8pIC0+IGVybGFuZzplcnJvcihmdW5jdGlvbl9jbGF1c2UpLlxuXG4iOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgLy8gU2F2ZSB0aGUgdGNvbnN0IHNvIHRoYXQgZnVuY3Rpb24gY2FuIGJlIGVtaXR0ZWQgaW4gZ2VuZXJhdGVfY29uc3RfZnVuY3Rpb25zKCkuCisgIHZfY29uc3RzXy5wdXNoX2JhY2sodGNvbnN0KTsKKworICBmX2NvbnN0c19ocmxfZmlsZV8gPDwgIi1kZWZpbmUoIiA8PCBjb25zdGlmeShtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHByb2dyYW1fbmFtZV8pKSA8PCAiXyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGNvbnN0aWZ5KG5hbWUpIDw8ICIsICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCAiKS4iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgImZsb2F0KCIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IGVtaXRfZG91YmxlX2FzX3N0cmluZyh2YWx1ZS0+Z2V0X2RvdWJsZSgpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8ICIjIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgInsiOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIiwiOworICAgICAgfQorICAgICAgb3V0IDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIG91dCA8PCAiID0gIjsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworCisgICAgaWYgKG1hcHNfKSB7CisgICAgICBvdXQgPDwgIm1hcHM6ZnJvbV9saXN0KFsiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgImRpY3Q6ZnJvbV9saXN0KFsiOworICAgIH0KKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3IgaSwgZW5kID0gdmFsdWUtPmdldF9tYXAoKS5lbmQoKTsKKyAgICBmb3IgKGkgPSB2YWx1ZS0+Z2V0X21hcCgpLmJlZ2luKCk7IGkgIT0gZW5kOykgeworICAgICAgb3V0IDw8ICJ7IiA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIGktPmZpcnN0KSA8PCAiLCIKKyAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIGktPnNlY29uZCkgPDwgIn0iOworICAgICAgaWYgKCsraSAhPSBlbmQpIHsKKyAgICAgICAgb3V0IDw8ICIsIjsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICJdKSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBvdXQgPDwgInNldHM6ZnJvbV9saXN0KFsiOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGksIGVuZCA9IHZhbHVlLT5nZXRfbGlzdCgpLmVuZCgpOworICAgIGZvciAoaSA9IHZhbHVlLT5nZXRfbGlzdCgpLmJlZ2luKCk7IGkgIT0gZW5kOykgeworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKmkpOworICAgICAgaWYgKCsraSAhPSBlbmQpIHsKKyAgICAgICAgb3V0IDw8ICIsIjsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICJdKSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3V0IDw8ICJbIiA8PCByZW5kZXJfY29uc3RfbGlzdF92YWx1ZXModHlwZSwgdmFsdWUpIDw8ICJdIjsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gb3V0LnN0cigpOworfQorCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfbGlzdF92YWx1ZXModF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiwiOworICAgIH0KKyAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKKyAgfQorICByZXR1cm4gb3V0LnN0cigpOworfQorCisKK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl9kZWZhdWx0X3ZhbHVlKHRfZmllbGQqIGZpZWxkKSB7CisgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiIyIgKyB0eXBlX25hbWUodHlwZSkgKyAie30iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgaWYgKG1hcHNfKSB7CisgICAgICByZXR1cm4gIiN7fSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiZGljdDpuZXcoKSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJzZXRzOm5ldygpIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIltdIjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gInVuZGVmaW5lZCI7CisgIH0KK30KKworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX21lbWJlcl90eXBlKHRfZmllbGQqIGZpZWxkKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJzdHJpbmcoKSB8IGJpbmFyeSgpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gImJvb2xlYW4oKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiaW50ZWdlcigpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZmxvYXQoKSI7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogdW5zdXBwb3J0ZWQgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gImludGVnZXIoKSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiB0eXBlX25hbWUodHlwZSkgKyAiKCkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgaWYgKG1hcHNfKSB7CisgICAgICByZXR1cm4gIm1hcCgpIjsKKyAgICB9IGVsc2UgaWYgKG90cDE2XykgeworICAgICAgcmV0dXJuICJkaWN0KCkiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gImRpY3Q6ZGljdCgpIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpZiAob3RwMTZfKSB7CisgICAgICByZXR1cm4gInNldCgpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJzZXRzOnNldCgpIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJsaXN0KCkiOworICB9IGVsc2UgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogdW5zdXBwb3J0ZWQgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfbWVtYmVyX3JlcXVpcmVkbmVzcyh0X2ZpZWxkKiBmaWVsZCkgeworICBzd2l0Y2ggKGZpZWxkLT5nZXRfcmVxKCkpIHsKKyAgY2FzZSB0X2ZpZWxkOjpUX1JFUVVJUkVEOgorICAgIHJldHVybiAicmVxdWlyZWQiOworICBjYXNlIHRfZmllbGQ6OlRfT1BUSU9OQUw6CisgICAgcmV0dXJuICJvcHRpb25hbCI7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuICJ1bmRlZmluZWQiOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgdl9zdHJ1Y3RfbmFtZXNfLnB1c2hfYmFjayh0eXBlX25hbWUodHN0cnVjdCkpOworICBnZW5lcmF0ZV9lcmxfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCisgKgorICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgdl9leGNlcHRpb25fbmFtZXNfLnB1c2hfYmFjayh0eXBlX25hbWUodHhjZXB0aW9uKSk7CisgIGdlbmVyYXRlX2VybF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgICh2b2lkKWlzX2V4Y2VwdGlvbjsKKyAgZ2VuZXJhdGVfZXJsX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfaHJsX2ZpbGVfLCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZXJsX3N0cnVjdF9pbmZvKGZfaW5mb18sIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9lcmxfZXh0ZW5kZWRfc3RydWN0X2luZm8oZl9pbmZvX2V4dF8sIHRzdHJ1Y3QpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAiJSUgc3RydWN0ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8IGVuZGwgPDwgZW5kbDsKKworICBzdGQ6OnN0cmluZ3N0cmVhbSBidWY7CisgIGJ1ZiA8PCBpbmRlbnQoKSA8PCAiLXJlY29yZCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLCB7IjsKKyAgc3RyaW5nIGZpZWxkX2luZGVudChidWYuc3RyKCkuc2l6ZSgpLCAnICcpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7KSB7CisgICAgZ2VuZXJhdGVfZXJsX3N0cnVjdF9tZW1iZXIoYnVmLCAqbV9pdGVyKTsKKyAgICBpZiAoKyttX2l0ZXIgIT0gbWVtYmVycy5lbmQoKSkgeworICAgICAgYnVmIDw8ICIsIiA8PCBlbmRsIDw8IGZpZWxkX2luZGVudDsKKyAgICB9CisgIH0KKyAgYnVmIDw8ICJ9KS4iOworCisgIG91dCA8PCBidWYuc3RyKCkgPDwgZW5kbDsKKyAgb3V0IDw8ICItdHlwZSAiICsgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKSA6OiAjIiArIHR5cGVfbmFtZSh0c3RydWN0KSArICJ7fS4iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHJlY29yZCBmaWVsZCBkZWZpbml0aW9uCisgKi8KKwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9zdHJ1Y3RfbWVtYmVyKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdG1lbWJlcikgeworICBvdXQgPDwgYXRvbWlmeSh0bWVtYmVyLT5nZXRfbmFtZSgpKTsKKyAgaWYgKGhhc19kZWZhdWx0X3ZhbHVlKHRtZW1iZXIpKQorICAgIG91dCA8PCAiID0gIiA8PCByZW5kZXJfbWVtYmVyX3ZhbHVlKHRtZW1iZXIpOworICBvdXQgPDwgIiA6OiAiIDw8IHJlbmRlcl9tZW1iZXJfdHlwZSh0bWVtYmVyKTsKKyAgaWYgKHRtZW1iZXItPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQorICAgIG91dCA8PCAiIHwgJ3VuZGVmaW5lZCciOworfQorCitib29sIHRfZXJsX2dlbmVyYXRvcjo6aGFzX2RlZmF1bHRfdmFsdWUodF9maWVsZCogZmllbGQpIHsKKyAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisgIGlmICghZmllbGQtPmdldF92YWx1ZSgpKSB7CisgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHlwZS0+aXNfbWFwKCkgfHwgdHlwZS0+aXNfc2V0KCkKKyAgICAgICAgICB8fCB0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK30KKworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX21lbWJlcl92YWx1ZSh0X2ZpZWxkKiBmaWVsZCkgeworICBpZiAoIWZpZWxkLT5nZXRfdmFsdWUoKSkgeworICAgIHJldHVybiByZW5kZXJfZGVmYXVsdF92YWx1ZShmaWVsZCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZC0+Z2V0X3R5cGUoKSwgZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgcmVhZCBtZXRob2QgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfc3RydWN0X2luZm8ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAic3RydWN0X2luZm8oIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIikgLT4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX3R5cGVfdGVybSh0c3RydWN0LCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfZXh0ZW5kZWRfc3RydWN0X2luZm8ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAic3RydWN0X2luZm9fZXh0KCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIpIC0+IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHJlbmRlcl90eXBlX3Rlcm0odHN0cnVjdCwgdHJ1ZSwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc2VydmljZV9uYW1lXyA9IG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUoc2VydmljZV9uYW1lXyk7CisKKyAgc3RyaW5nIGZfc2VydmljZV9ocmxfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzZXJ2aWNlX25hbWVfICsgIl90aHJpZnQuaHJsIjsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIHNlcnZpY2VfbmFtZV8gKyAiX3RocmlmdC5lcmwiOworICBmX3NlcnZpY2VfZmlsZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKyAgZl9zZXJ2aWNlX2hybF8ub3BlbihmX3NlcnZpY2VfaHJsX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUmVzZXQgc2VydmljZSB0ZXh0IGFnZ3JlZ2F0aW5nIHN0cmVhbSBzdHJlYW1zCisgIGZfc2VydmljZV8uc3RyKCIiKTsKKyAgZXhwb3J0X2xpbmVzXy5zdHIoIiIpOworICBleHBvcnRfbGluZXNfZmlyc3RfID0gdHJ1ZTsKKworICBocmxfaGVhZGVyKGZfc2VydmljZV9ocmxfLCBzZXJ2aWNlX25hbWVfKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGZfc2VydmljZV9ocmxfIDw8ICItaW5jbHVkZShcIiIKKyAgICAgICAgICAgICAgICAgICA8PCBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgIDw8ICJfdGhyaWZ0LmhybFwiKS4gJSBpbmhlcml0ICIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV9ocmxfIDw8ICItaW5jbHVkZShcIiIgPDwgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzLmhybFwiKS4iCisgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZSAod2VsbCwgdHdvIGZvciBub3cgaW4gUEhQKQorICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOyAvLyBjcGlybzogTmV3IEVybGFuZyBPcmRlcgorCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX21ldGFkYXRhKHRzZXJ2aWNlKTsKKworICAvLyBpbmRlbnRfZG93bigpOworCisgIGZfc2VydmljZV9maWxlXyA8PCBlcmxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCAiLW1vZHVsZSgiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIl90aHJpZnQpLiIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIi1iZWhhdmlvdXIodGhyaWZ0X3NlcnZpY2UpLiIgPDwgZW5kbCA8PCBlbmRsIDw8IGVybF9pbXBvcnRzKCkgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfZmlsZV8gPDwgIi1pbmNsdWRlKFwiIiA8PCBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgPDwgIl90aHJpZnQuaHJsXCIpLiIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfc2VydmljZV9maWxlXyA8PCAiLWV4cG9ydChbIiA8PCBleHBvcnRfbGluZXNfLnN0cigpIDw8ICJdKS4iIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfZmlsZV8gPDwgZl9zZXJ2aWNlXy5zdHIoKTsKKworICBocmxfZm9vdGVyKGZfc2VydmljZV9ocmxfLCBmX3NlcnZpY2VfbmFtZSk7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCisgIGZfc2VydmljZV9maWxlXy5jbG9zZSgpOworICBmX3NlcnZpY2VfaHJsXy5jbG9zZSgpOworfQorCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9tZXRhZGF0YSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGV4cG9ydF9zdHJpbmcoImZ1bmN0aW9uX25hbWVzIiwgMCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgc2l6ZV90IG51bV9mdW5jdGlvbnMgPSBmdW5jdGlvbnMuc2l6ZSgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb25fbmFtZXMoKSAtPiAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlsiOworCisgIGZvciAoc2l6ZV90IGk9MDsgaSA8IG51bV9mdW5jdGlvbnM7IGkrKykgeworICAgIHRfZnVuY3Rpb24qIGN1cnJlbnQgPSBmdW5jdGlvbnMuYXQoaSk7CisgICAgZl9zZXJ2aWNlXyA8PCBhdG9taWZ5KGN1cnJlbnQtPmdldF9uYW1lKCkpOworICAgIGlmIChpIDwgbnVtX2Z1bmN0aW9ucyAtIDEpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfIDw8ICJdLlxuXG4iOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAvLyAgaW5kZW50KGZfc2VydmljZV8pIDw8CisgIC8vICAiJSBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZXhwb3J0X3N0cmluZygic3RydWN0X2luZm8iLCAxKTsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2VybF9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9CisgIGZfc2VydmljZV8gPDwgInN0cnVjdF9pbmZvKF8pIC0+IGVybGFuZzplcnJvcihmdW5jdGlvbl9jbGF1c2UpLiIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0ZnVuY3Rpb247Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBleHBvcnRfc3RyaW5nKCJmdW5jdGlvbl9pbmZvIiwgMik7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZfc2VydmljZV8gPDwgIiUlJSBpbnRlcmZhY2UiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfZnVuY3Rpb25faW5mbyh0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICAvLyBJbmhlcml0YW5jZSAtIHBhc3MgdW5rbm93biBmdW5jdGlvbnMgdG8gYmFzZSBjbGFzcworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgSW5mb1R5cGUpIC0+IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiX3RocmlmdDpmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBJbmZvVHlwZSkuIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSB7CisgICAgLy8gcmV0dXJuIGZ1bmN0aW9uX2NsYXVzZSBlcnJvciBmb3Igbm9uLWV4aXN0ZW50IGZ1bmN0aW9ucworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb25faW5mbyhfRnVuYywgX0luZm8pIC0+IGVybGFuZzplcnJvcihmdW5jdGlvbl9jbGF1c2UpLiIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb25OYW1lLCBwYXJhbXNfdHlwZSkgYW5kCisgKiBmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uTmFtZSwgcmVwbHlfdHlwZSkKKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2luZm8odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICBzdHJpbmcgbmFtZV9hdG9tID0gYXRvbWlmeSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKworICAvLyBmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBwYXJhbXNfdHlwZSk6CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb25faW5mbygiIDw8IG5hbWVfYXRvbSA8PCAiLCBwYXJhbXNfdHlwZSkgLT4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCByZW5kZXJfdHlwZV90ZXJtKGFyZ19zdHJ1Y3QsIHRydWUpIDw8ICI7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgcmVwbHlfdHlwZSk6CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb25faW5mbygiIDw8IG5hbWVfYXRvbSA8PCAiLCByZXBseV90eXBlKSAtPiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVuZGVyX3R5cGVfdGVybSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksIGZhbHNlKSA8PCAiOyIgPDwgZW5kbDsKKyAgZWxzZSBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9uZXdheV92b2lkOyIgPDwgZW5kbDsKKyAgZWxzZQorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAie3N0cnVjdCwgW119IgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyBmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBleGNlcHRpb25zKToKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmdW5jdGlvbl9pbmZvKCIgPDwgbmFtZV9hdG9tIDw8ICIsIGV4Y2VwdGlvbnMpIC0+IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlbmRlcl90eXBlX3Rlcm0oeHMsIHRydWUpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICByZXR1cm4gcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIihUaGlzIgorICAgICAgICAgKyBjYXBpdGFsaXplKGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSkgKyAiKSI7Cit9CisKKy8qKgorICogQWRkIGEgZnVuY3Rpb24gdG8gdGhlIGV4cG9ydHMgbGlzdAorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6ZXhwb3J0X3N0cmluZyhzdHJpbmcgbmFtZSwgaW50IG51bSkgeworICBpZiAoZXhwb3J0X2xpbmVzX2ZpcnN0XykgeworICAgIGV4cG9ydF9saW5lc19maXJzdF8gPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBleHBvcnRfbGluZXNfIDw8ICIsICI7CisgIH0KKyAgZXhwb3J0X2xpbmVzXyA8PCBuYW1lIDw8ICIvIiA8PCBudW07Cit9CisKK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpleHBvcnRfdHlwZXNfc3RyaW5nKHN0cmluZyBuYW1lLCBpbnQgbnVtKSB7CisgIGlmIChleHBvcnRfdHlwZXNfbGluZXNfZmlyc3RfKSB7CisgICAgZXhwb3J0X3R5cGVzX2xpbmVzX2ZpcnN0XyA9IGZhbHNlOworICB9IGVsc2UgeworICAgIGV4cG9ydF90eXBlc19saW5lc18gPDwgIiwgIjsKKyAgfQorICBleHBvcnRfdHlwZXNfbGluZXNfIDw8IG5hbWUgPDwgIi8iIDw8IG51bTsKK30KKwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF9mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgdF9zdHJ1Y3Q6Om1lbWJlcnNfdHlwZTo6c2l6ZV90eXBlIG51bSA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5zaXplKCk7CisgIGlmIChudW0gPiBzdGF0aWNfY2FzdDx0X3N0cnVjdDo6bWVtYmVyc190eXBlOjpzaXplX3R5cGU+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50PigpLm1heCgpKSkgeworICAgIHRocm93ICJpbnRlZ2VyIG92ZXJmbG93IGluIHRfZXJsX2dlbmVyYXRvcjo6ZXhwb3J0X2Z1bmN0aW9uLCBuYW1lICIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIH0KKyAgZXhwb3J0X3N0cmluZyhwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgMSAvLyBUaGlzCisgICAgICAgICAgICAgICAgKyBzdGF0aWNfY2FzdDxpbnQ+KG51bSkpOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKi8KK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgcmVzdWx0ICs9ICIsICI7IC8vIGluaXRpYWwgY29tbWEgdG8gY29tcGVuc2F0ZSBmb3IgaW5pdGlhbCBUaGlzCisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBwcmVmaXggPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiZXJsIik7CisgIHNpemVfdCBwcmVmaXhfbGVuZ3RoID0gcHJlZml4Lmxlbmd0aCgpOworICBpZiAocHJlZml4X2xlbmd0aCA+IDAgJiYgcHJlZml4W3ByZWZpeF9sZW5ndGggLSAxXSAhPSAnXycpIHsKKyAgICBwcmVmaXggKz0gJy4nOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKKworICByZXR1cm4gYXRvbWlmeShwcmVmaXggKyBuYW1lKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEVybGFuZyAidHlwZSIgKG1hY3JvIGZvciBpbnQgY29uc3RhbnRzKQorICovCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICI/dFR5cGVfU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIj90VHlwZV9CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICI/dFR5cGVfSTgiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICI/dFR5cGVfSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiP3RUeXBlX0kzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIj90VHlwZV9JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICI/dFR5cGVfRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICI/dFR5cGVfSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICI/dFR5cGVfU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiP3RUeXBlX01BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIj90VHlwZV9TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiP3RUeXBlX0xJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGFuIEVybGFuZyB0ZXJtIHdoaWNoIHJlcHJlc2VudHMgYSB0aHJpZnQgdHlwZQorICovCitzdGQ6OnN0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl90eXBlX3Rlcm0odF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXhwYW5kX3N0cnVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleHRlbmRlZF9pbmZvKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJzdHJpbmciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiYm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiYnl0ZSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gImkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gImkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gImk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gImRvdWJsZSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiaTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgaWYgKGV4cGFuZF9zdHJ1Y3RzKSB7CisKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGJ1ZjsKKyAgICAgIGJ1ZiA8PCAie3N0cnVjdCwgWyI7CisgICAgICBzdHJpbmcgZmllbGRfaW5kZW50KGJ1Zi5zdHIoKS5zaXplKCksICcgJyk7CisKKyAgICAgIHRfc3RydWN0OjptZW1iZXJzX3R5cGUgY29uc3QmIGZpZWxkcyA9IHN0YXRpY19jYXN0PHRfc3RydWN0Kj4odHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgICB0X3N0cnVjdDo6bWVtYmVyc190eXBlOjpjb25zdF9pdGVyYXRvciBpLCBlbmQgPSBmaWVsZHMuZW5kKCk7CisgICAgICBmb3IgKGkgPSBmaWVsZHMuYmVnaW4oKTsgaSAhPSBlbmQ7KSB7CisgICAgICAgIHRfc3RydWN0OjptZW1iZXJzX3R5cGU6OnZhbHVlX3R5cGUgbWVtYmVyID0gKmk7CisgICAgICAgIGludDMyX3Qga2V5ID0gbWVtYmVyLT5nZXRfa2V5KCk7CisgICAgICAgIHN0cmluZyB0eXBlID0gcmVuZGVyX3R5cGVfdGVybShtZW1iZXItPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSk7IC8vIHJlY3Vyc2l2ZSBjYWxsCisKKyAgICAgICAgaWYgKCFleHRlbmRlZF9pbmZvKSB7CisgICAgICAgICAgLy8gQ29udmVydCB0byBmb3JtYXQ6IHtzdHJ1Y3QsIFt7RmlkLCBUeXBlfXwuLi5dfQorICAgICAgICAgIGJ1ZiA8PCAieyIgPDwga2V5IDw8ICIsICIgPDwgdHlwZSA8PCAifSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gQ29udmVydCB0byBmb3JtYXQ6IHtzdHJ1Y3QsIFt7RmlkLCBSZXEsIFR5cGUsIE5hbWUsIERlZn18Li4uXX0KKyAgICAgICAgICBzdHJpbmcgbmFtZSA9IG1lbWJlci0+Z2V0X25hbWUoKTsKKyAgICAgICAgICBzdHJpbmcgdmFsdWUgPSByZW5kZXJfbWVtYmVyX3ZhbHVlKG1lbWJlcik7CisgICAgICAgICAgc3RyaW5nIHJlcXVpcmVkbmVzcyA9IHJlbmRlcl9tZW1iZXJfcmVxdWlyZWRuZXNzKG1lbWJlcik7CisgICAgICAgICAgYnVmIDw8ICJ7IiA8PCBrZXkgPDwgIiwgIiA8PCByZXF1aXJlZG5lc3MgPDwgIiwgIiA8PCB0eXBlIDw8ICIsICIgPDwgYXRvbWlmeShuYW1lKSA8PCAiLCAiCisgICAgICAgICAgICAgIDw8IHZhbHVlIDw8ICJ9IjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgrK2kgIT0gZW5kKSB7CisgICAgICAgICAgYnVmIDw8ICIsIiA8PCBlbmRsIDw8IGZpZWxkX2luZGVudDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBidWYgPDwgIl19IiA8PCBlbmRsOworICAgICAgcmV0dXJuIGJ1Zi5zdHIoKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJ7c3RydWN0LCB7IiArIGF0b21pZnkodHlwZV9tb2R1bGUodHlwZSkpICsgIiwgIiArIHR5cGVfbmFtZSh0eXBlKSArICJ9fSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgLy8ge21hcCwgS2V5VHlwZSwgVmFsVHlwZX0KKyAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgICByZXR1cm4gInttYXAsICIgKyByZW5kZXJfdHlwZV90ZXJtKGtleV90eXBlLCBmYWxzZSkgKyAiLCAiICsgcmVuZGVyX3R5cGVfdGVybSh2YWxfdHlwZSwgZmFsc2UpCisgICAgICAgICAgICsgIn0iOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICByZXR1cm4gIntzZXQsICIgKyByZW5kZXJfdHlwZV90ZXJtKGVsZW1fdHlwZSwgZmFsc2UpICsgIn0iOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKworICAgIHJldHVybiAie2xpc3QsICIgKyByZW5kZXJfdHlwZV90ZXJtKGVsZW1fdHlwZSwgZmFsc2UpICsgIn0iOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitzdGQ6OnN0cmluZyB0X2VybF9nZW5lcmF0b3I6OnR5cGVfbW9kdWxlKHRfdHlwZSogdHR5cGUpIHsKKyAgcmV0dXJuIG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUodHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpICsgIl90eXBlcyI7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgZXJsLAorICAgICJFcmxhbmciLAorICAgICIgICAgbGVnYWN5bmFtZXM6IE91dHB1dCBmaWxlcyByZXRhaW4gbmFtaW5nIGNvbnZlbnRpb25zIG9mIFRocmlmdCAwLjkuMSBhbmQgZWFybGllci5cbiIKKyAgICAiICAgIG1hcHM6ICAgICAgICBHZW5lcmF0ZSBtYXBzIGluc3RlYWQgb2YgZGljdHMuXG4iCisgICAgIiAgICBvdHAxNjogICAgICAgR2VuZXJhdGUgbm9uLW5hbWVzcGFjZWQgZGljdCBhbmQgc2V0IGluc3RlYWQgb2YgZGljdDpkaWN0IGFuZCBzZXRzOnNldC5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhM2Y1ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisvKioKKyAqIFRvcCBsZXZlbCBwcm9ncmFtIGdlbmVyYXRpb24gZnVuY3Rpb24uIENhbGxzIHRoZSBnZW5lcmF0b3Igc3ViY2xhc3MgbWV0aG9kcworICogZm9yIHByZXBhcmluZyBmaWxlIHN0cmVhbXMgZXRjLiB0aGVuIGl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBwYXJ0cyBvZiB0aGUKKyAqIHByb2dyYW0gdG8gcGVyZm9ybSB0aGUgY29ycmVjdCBhY3Rpb25zLgorICoKKyAqIEBwYXJhbSBwcm9ncmFtIFRoZSB0aHJpZnQgcHJvZ3JhbSB0byBjb21waWxlIGludG8gQysrIHNvdXJjZQorICovCit2b2lkIHRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgeworICAvLyBJbml0aWFsaXplIHRoZSBnZW5lcmF0b3IKKyAgaW5pdF9nZW5lcmF0b3IoKTsKKworICAvLyBHZW5lcmF0ZSBlbnVtcworICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBwcm9ncmFtXy0+Z2V0X2VudW1zKCk7CisgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKKyAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfZW51bSgqZW5faXRlcik7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0eXBlZGVmcworICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCk7CisgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKKyAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7CisgICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7CisgIH0KKworICAvLyBHZW5lcmF0ZSBzdHJ1Y3RzLCBleGNlcHRpb25zLCBhbmQgdW5pb25zIGluIGRlY2xhcmVkIG9yZGVyCisgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBwcm9ncmFtXy0+Z2V0X29iamVjdHMoKTsKKworICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOworICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7CisgICAgZ2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbigqb19pdGVyKTsKKyAgfQorICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7CisgICAgaWYgKCgqb19pdGVyKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgZ2VuZXJhdGVfeGNlcHRpb24oKm9faXRlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX3N0cnVjdCgqb19pdGVyKTsKKyAgICB9CisgIH0KKworICAvLyBHZW5lcmF0ZSBjb25zdGFudHMKKyAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOworICBnZW5lcmF0ZV9jb25zdHMoY29uc3RzKTsKKworICAvLyBHZW5lcmF0ZSBzZXJ2aWNlcworICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7CisgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKKyAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7CisgICAgc2VydmljZV9uYW1lXyA9IGdldF9zZXJ2aWNlX25hbWUoKnN2X2l0ZXIpOworICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOworICB9CisKKyAgLy8gQ2xvc2UgdGhlIGdlbmVyYXRvcgorICBjbG9zZV9nZW5lcmF0b3IoKTsKK30KKworc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHRfZ2VuZXJhdG9yOjpsYW5nX2tleXdvcmRzKCkgY29uc3QgeworICBzdGQ6OnN0cmluZyBrZXl3b3Jkc1tdID0geyAiQkVHSU4iLCAiRU5EIiwgIl9fQ0xBU1NfXyIsICJfX0RJUl9fIiwgIl9fRklMRV9fIiwgIl9fRlVOQ1RJT05fXyIsCisgICAgICAiX19MSU5FX18iLCAiX19NRVRIT0RfXyIsICJfX05BTUVTUEFDRV9fIiwgImFic3RyYWN0IiwgImFsaWFzIiwgImFuZCIsICJhcmdzIiwgImFzIiwKKyAgICAgICJhc3NlcnQiLCAiYmVnaW4iLCAiYnJlYWsiLCAiY2FzZSIsICJjYXRjaCIsICJjbGFzcyIsICJjbG9uZSIsICJjb250aW51ZSIsICJkZWNsYXJlIiwKKyAgICAgICJkZWYiLCAiZGVmYXVsdCIsICJkZWwiLCAiZGVsZXRlIiwgImRvIiwgImR5bmFtaWMiLCAiZWxpZiIsICJlbHNlIiwgImVsc2VpZiIsICJlbHNpZiIsCisgICAgICAiZW5kIiwgImVuZGRlY2xhcmUiLCAiZW5kZm9yIiwgImVuZGZvcmVhY2giLCAiZW5kaWYiLCAiZW5kc3dpdGNoIiwgImVuZHdoaWxlIiwgImVuc3VyZSIsCisgICAgICAiZXhjZXB0IiwgImV4ZWMiLCAiZmluYWxseSIsICJmbG9hdCIsICJmb3IiLCAiZm9yZWFjaCIsICJmcm9tIiwgImZ1bmN0aW9uIiwgImdsb2JhbCIsCisgICAgICAiZ290byIsICJpZiIsICJpbXBsZW1lbnRzIiwgImltcG9ydCIsICJpbiIsICJpbmxpbmUiLCAiaW5zdGFuY2VvZiIsICJpbnRlcmZhY2UiLCAiaXMiLAorICAgICAgImxhbWJkYSIsICJtb2R1bGUiLCAibmF0aXZlIiwgIm5ldyIsICJuZXh0IiwgIm5pbCIsICJub3QiLCAib3IiLCAicGFja2FnZSIsICJwYXNzIiwKKyAgICAgICJwdWJsaWMiLCAicHJpbnQiLCAicHJpdmF0ZSIsICJwcm90ZWN0ZWQiLCAicmFpc2UiLCAicmVkbyIsICJyZXNjdWUiLCAicmV0cnkiLCAicmVnaXN0ZXIiLAorICAgICAgInJldHVybiIsICJzZWxmIiwgInNpemVvZiIsICJzdGF0aWMiLCAic3VwZXIiLCAic3dpdGNoIiwgInN5bmNocm9uaXplZCIsICJ0aGVuIiwgInRoaXMiLAorICAgICAgInRocm93IiwgInRyYW5zaWVudCIsICJ0cnkiLCAidW5kZWYiLCAidW5sZXNzIiwgInVuc2lnbmVkIiwgInVudGlsIiwgInVzZSIsICJ2YXIiLAorICAgICAgInZpcnR1YWwiLCAidm9sYXRpbGUiLCAid2hlbiIsICJ3aGlsZSIsICJ3aXRoIiwgInhvciIsICJ5aWVsZCIgfTsKKyAgcmV0dXJuIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPihrZXl3b3Jkcywga2V5d29yZHMgKyBzaXplb2Yoa2V5d29yZHMpL3NpemVvZihrZXl3b3Jkc1swXSkgKTsKK30KKwordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGVfaW5wdXQoKSBjb25zdCB7CisgIHZhbGlkYXRlKHByb2dyYW1fLT5nZXRfZW51bXMoKSk7CisgIHZhbGlkYXRlKHByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKSk7CisgIHZhbGlkYXRlKHByb2dyYW1fLT5nZXRfb2JqZWN0cygpKTsKKyAgdmFsaWRhdGUocHJvZ3JhbV8tPmdldF9jb25zdHMoKSk7CisgIHZhbGlkYXRlKHByb2dyYW1fLT5nZXRfc2VydmljZXMoKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUoY29uc3QgdmVjdG9yPFQ+JiBsaXN0KSBjb25zdHsKKyAgdHlwZW5hbWUgdmVjdG9yPFQ+Ojpjb25zdF9pdGVyYXRvciBpdDsKKyAgZm9yKGl0PWxpc3QuYmVnaW4oKTsgaXQgIT0gbGlzdC5lbmQoKTsgKytpdCkgeworICAgICAgdmFsaWRhdGUoKml0KTsKKyAgfQorfQorCit2b2lkIHRfZ2VuZXJhdG9yOjp2YWxpZGF0ZSh0X2Z1bmN0aW9uIGNvbnN0KiBmKSBjb25zdCB7CisgIHZhbGlkYXRlX2lkKGYtPmdldF9uYW1lKCkpOworICB2YWxpZGF0ZShmLT5nZXRfYXJnbGlzdCgpKTsKKyAgdmFsaWRhdGUoZi0+Z2V0X3hjZXB0aW9ucygpKTsKK30KKwordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF9zZXJ2aWNlIGNvbnN0KiBzKSBjb25zdCB7CisgIHZhbGlkYXRlX2lkKHMtPmdldF9uYW1lKCkpOworICB2YWxpZGF0ZShzLT5nZXRfZnVuY3Rpb25zKCkpOworfQorCit2b2lkIHRfZ2VuZXJhdG9yOjp2YWxpZGF0ZSh0X2VudW0gY29uc3QqIGVuKSBjb25zdCB7CisgIHZhbGlkYXRlX2lkKGVuLT5nZXRfbmFtZSgpKTsKKyAgdmFsaWRhdGUoZW4tPmdldF9jb25zdGFudHMoKSk7Cit9Cit2b2lkIHRfZ2VuZXJhdG9yOjp2YWxpZGF0ZSh0X3N0cnVjdCBjb25zdCogcykgY29uc3QgeworICB2YWxpZGF0ZV9pZChzLT5nZXRfbmFtZSgpKTsKKyAgdmFsaWRhdGUocy0+Z2V0X21lbWJlcnMoKSk7Cit9CisKK3ZvaWQgdF9nZW5lcmF0b3I6OnZhbGlkYXRlKHRfZW51bV92YWx1ZSBjb25zdCogZW5fdmFsKSBjb25zdCB7CisgIHZhbGlkYXRlX2lkKGVuX3ZhbC0+Z2V0X25hbWUoKSk7Cit9Cit2b2lkIHRfZ2VuZXJhdG9yOjp2YWxpZGF0ZSh0X3R5cGVkZWYgY29uc3QqIHRkKSBjb25zdCB7CisgIHZhbGlkYXRlX2lkKHRkLT5nZXRfbmFtZSgpKTsKK30KK3ZvaWQgdF9nZW5lcmF0b3I6OnZhbGlkYXRlKHRfY29uc3QgY29uc3QqIGMpIGNvbnN0IHsKKyAgdmFsaWRhdGVfaWQoYy0+Z2V0X25hbWUoKSk7Cit9Cit2b2lkIHRfZ2VuZXJhdG9yOjp2YWxpZGF0ZSh0X2ZpZWxkIGNvbnN0KiBmKSBjb25zdCB7CisgIHZhbGlkYXRlX2lkKGYtPmdldF9uYW1lKCkpOworfQorCit2b2lkIHRfZ2VuZXJhdG9yOjp2YWxpZGF0ZV9pZChjb25zdCBzdHJpbmcmIGlkKSBjb25zdCB7CisgIGlmIChrZXl3b3Jkc18uZmluZChpZCkgIT0ga2V5d29yZHNfLmVuZCgpKSB7CisgICAgZmFpbHVyZSgiQ2Fubm90IHVzZSByZXNlcnZlZCBsYW5ndWFnZSBrZXl3b3JkOiBcIiVzXCIiLCBpZC5jX3N0cigpKTsKKyAgfQorfQorCitzdHJpbmcgdF9nZW5lcmF0b3I6OmVzY2FwZV9zdHJpbmcoY29uc3Qgc3RyaW5nJiBpbikgY29uc3QgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGZvciAoc3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdCA9IGluLmJlZ2luKCk7IGl0IDwgaW4uZW5kKCk7IGl0KyspIHsKKyAgICBzdGQ6Om1hcDxjaGFyLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHJlcyA9IGVzY2FwZV8uZmluZCgqaXQpOworICAgIGlmIChyZXMgIT0gZXNjYXBlXy5lbmQoKSkgeworICAgICAgcmVzdWx0LmFwcGVuZChyZXMtPnNlY29uZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdC5wdXNoX2JhY2soKml0KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCB0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9jb25zdCgqY19pdGVyKTsKKyAgfQorfQorCit2b2lkIHRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNvbW1lbnRfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGxpbmVfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY29tbWVudF9lbmQpIHsKKyAgaWYgKCFjb21tZW50X3N0YXJ0LmVtcHR5KCkpCisgICAgaW5kZW50KG91dCkgPDwgY29tbWVudF9zdGFydDsKKyAgc3RyaW5nc3RyZWFtIGRvY3MoY29udGVudHMsIGlvc19iYXNlOjppbik7CisgIHdoaWxlICghKGRvY3MuZW9mKCkgfHwgZG9jcy5mYWlsKCkpKSB7CisgICAgY2hhciBsaW5lWzEwMjRdOworICAgIGRvY3MuZ2V0bGluZShsaW5lLCAxMDI0KTsKKworICAgIGlmIChzdHJsZW4obGluZSkgPiAwKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBsaW5lX3ByZWZpeCA8PCBsaW5lIDw8IHN0ZDo6ZW5kbDsKKyAgICB9IGVsc2UgaWYgKGxpbmVfcHJlZml4LmVtcHR5KCkpeworICAgICAgb3V0IDw8IHN0ZDo6ZW5kbDsKKyAgICB9IGVsc2UgaWYoIWRvY3MuZW9mKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IGxpbmVfcHJlZml4IDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisgIH0KKyAgaWYgKCFjb21tZW50X2VuZC5lbXB0eSgpKQorICAgIGluZGVudChvdXQpIDw8IGNvbW1lbnRfZW5kOworfQorCit2b2lkIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpyZWdpc3Rlcl9nZW5lcmF0b3IodF9nZW5lcmF0b3JfZmFjdG9yeSogZmFjdG9yeSkgeworICBnZW5fbWFwX3QmIHRoZV9tYXAgPSBnZXRfZ2VuZXJhdG9yX21hcCgpOworICBpZiAodGhlX21hcC5maW5kKGZhY3RvcnktPmdldF9zaG9ydF9uYW1lKCkpICE9IHRoZV9tYXAuZW5kKCkpIHsKKyAgICBmYWlsdXJlKCJEdXBsaWNhdGUgZ2VuZXJhdG9ycyBmb3IgbGFuZ3VhZ2UgXCIlc1wiIVxuIiwgZmFjdG9yeS0+Z2V0X3Nob3J0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorICB0aGVfbWFwW2ZhY3RvcnktPmdldF9zaG9ydF9uYW1lKCldID0gZmFjdG9yeTsKK30KKwordm9pZCB0X2dlbmVyYXRvcjo6cGFyc2Vfb3B0aW9ucyhjb25zdCBzdHJpbmcmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyYgbGFuZ3VhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zKSB7CisgIHN0cmluZzo6c2l6ZV90eXBlIGNvbG9uID0gb3B0aW9ucy5maW5kKCc6Jyk7CisgIGxhbmd1YWdlID0gb3B0aW9ucy5zdWJzdHIoMCwgY29sb24pOworCisgIGlmIChjb2xvbiAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBjb2xvbiArIDE7CisgICAgd2hpbGUgKHBvcyAhPSBzdHJpbmc6Om5wb3MgJiYgcG9zIDwgb3B0aW9ucy5zaXplKCkpIHsKKyAgICAgIHN0cmluZzo6c2l6ZV90eXBlIG5leHRfcG9zID0gb3B0aW9ucy5maW5kKCcsJywgcG9zKTsKKyAgICAgIHN0cmluZyBvcHRpb24gPSBvcHRpb25zLnN1YnN0cihwb3MsIG5leHRfcG9zIC0gcG9zKTsKKyAgICAgIHBvcyA9ICgobmV4dF9wb3MgPT0gc3RyaW5nOjpucG9zKSA/IG5leHRfcG9zIDogbmV4dF9wb3MgKyAxKTsKKworICAgICAgc3RyaW5nOjpzaXplX3R5cGUgc2VwYXJhdG9yID0gb3B0aW9uLmZpbmQoJz0nKTsKKyAgICAgIHN0cmluZyBrZXksIHZhbHVlOworICAgICAgaWYgKHNlcGFyYXRvciA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAga2V5ID0gb3B0aW9uOworICAgICAgICB2YWx1ZSA9ICIiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAga2V5ID0gb3B0aW9uLnN1YnN0cigwLCBzZXBhcmF0b3IpOworICAgICAgICB2YWx1ZSA9IG9wdGlvbi5zdWJzdHIoc2VwYXJhdG9yICsgMSk7CisgICAgICB9CisKKyAgICAgIHBhcnNlZF9vcHRpb25zW2tleV0gPSB2YWx1ZTsKKyAgICB9CisgIH0KK30KKwordF9nZW5lcmF0b3IqIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGxhbmd1YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25zKSB7CisgIGdlbl9tYXBfdCYgdGhlX21hcCA9IGdldF9nZW5lcmF0b3JfbWFwKCk7CisgIGdlbl9tYXBfdDo6aXRlcmF0b3IgaXRlciA9IHRoZV9tYXAuZmluZChsYW5ndWFnZSk7CisKKyAgaWYgKGl0ZXIgPT0gdGhlX21hcC5lbmQoKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIGl0ZXItPnNlY29uZC0+Z2V0X2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9ucyk7Cit9CisKK3RfZ2VuZXJhdG9yKiB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IHN0cmluZyYgb3B0aW9ucykgeworICBzdHJpbmcgbGFuZ3VhZ2U7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnM7CisgIHRfZ2VuZXJhdG9yOjpwYXJzZV9vcHRpb25zKG9wdGlvbnMsIGxhbmd1YWdlLCBwYXJzZWRfb3B0aW9ucyk7CisgIHJldHVybiBnZXRfZ2VuZXJhdG9yKHByb2dyYW0sIGxhbmd1YWdlLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9ucyk7Cit9CisKK3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3QmIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yX21hcCgpIHsKKyAgLy8gaHR0cDovL3d3dy5wYXJhc2hpZnQuY29tL2MrKy1mYXEtbGl0ZS9jdG9ycy5odG1sI2ZhcS0xMC4xMgorICBzdGF0aWMgZ2VuX21hcF90KiB0aGVfbWFwID0gbmV3IGdlbl9tYXBfdCgpOworICByZXR1cm4gKnRoZV9tYXA7Cit9CisKK3RfZ2VuZXJhdG9yX2ZhY3Rvcnk6OnRfZ2VuZXJhdG9yX2ZhY3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHNob3J0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb25nX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2N1bWVudGF0aW9uKQorICA6IHNob3J0X25hbWVfKHNob3J0X25hbWUpLCBsb25nX25hbWVfKGxvbmdfbmFtZSksIGRvY3VtZW50YXRpb25fKGRvY3VtZW50YXRpb24pIHsKKyAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6OnJlZ2lzdGVyX2dlbmVyYXRvcih0aGlzKTsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiOWQwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsNDUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9HRU5FUkFUT1JfSAorI2RlZmluZSBUX0dFTkVSQVRPUl9ICisjZGVmaW5lIE1TQ18yMDE1X1ZFUiAxOTAwCisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L2NvbW1vbi5oIgorI2luY2x1ZGUgInRocmlmdC9sb2dnaW5nLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgiCisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgYSB0aHJpZnQgY29kZSBnZW5lcmF0b3IuIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgYmFzaWMKKyAqIHJvdXRpbmVzIGZvciBjb2RlIGdlbmVyYXRpb24gYW5kIGNvbnRhaW5zIHRoZSB0b3AgbGV2ZWwgbWV0aG9kIHRoYXQKKyAqIGRpc3BhdGNoZXMgY29kZSBnZW5lcmF0aW9uIGFjcm9zcyB2YXJpb3VzIGNvbXBvbmVudHMuCisgKgorICovCitjbGFzcyB0X2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSkKKyAgICA6IGtleXdvcmRzXyhsYW5nX2tleXdvcmRzKCkpeworICAgIHRtcF8gPSAwOworICAgIGluZGVudF8gPSAwOworICAgIHByb2dyYW1fID0gcHJvZ3JhbTsKKyAgICBwcm9ncmFtX25hbWVfID0gZ2V0X3Byb2dyYW1fbmFtZShwcm9ncmFtKTsKKyAgICBlc2NhcGVfWydcbiddID0gIlxcbiI7CisgICAgZXNjYXBlX1snXHInXSA9ICJcXHIiOworICAgIGVzY2FwZV9bJ1x0J10gPSAiXFx0IjsKKyAgICBlc2NhcGVfWyciJ10gPSAiXFxcIiI7CisgICAgZXNjYXBlX1snXFwnXSA9ICJcXFxcIjsKKyAgfQorCisgIHZpcnR1YWwgfnRfZ2VuZXJhdG9yKCkge30KKworICAvKioKKyAgICogRnJhbWV3b3JrIGdlbmVyYXRvciBtZXRob2QgdGhhdCBpdGVyYXRlcyBvdmVyIGFsbCB0aGUgcGFydHMgb2YgYSBwcm9ncmFtCisgICAqIGFuZCBwZXJmb3JtcyBnZW5lcmFsIGFjdGlvbnMuIFRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGJhc2UgY2xhc3MgYW5kCisgICAqIHNob3VsZCBub3Qgbm9ybWFsbHkgYmUgb3ZlcndyaXR0ZW4gaW4gdGhlIHN1YmNsYXNzZXMuCisgICAqLworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbSgpOworCisgIGNvbnN0IHRfcHJvZ3JhbSogZ2V0X3Byb2dyYW0oKSBjb25zdCB7IHJldHVybiBwcm9ncmFtXzsgfQorCisgIHZvaWQgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbW1lbnRfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxpbmVfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29tbWVudF9lbmQpOworCisgIHN0YXRpYyB2b2lkIHBhcnNlX29wdGlvbnMoY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbnMsIHN0ZDo6c3RyaW5nJiBsYW5ndWFnZSwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zKTsKKworICAvKioKKyAgICogY2hlY2sgd2hldGhlciBzdWItbmFtZXNwYWNlIGRlY2xhcmFjdGlvbiBpcyB1c2VkIGJ5IGdlbmVyYXRvci4KKyAgICogZS5nLiBhbGxvdworICAgKiBuYW1lc3BhY2UgcHkudHdpc3RlZCBiYXIKKyAgICogdG8gc3BlY2lmeSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gLWdlbiBweTp0d2lzdGVkIGlzIHNwZWNpZmllZC4KKyAgICogV2lsbCBiZSBjYWxsZWQgd2l0aCBzdWJuYW1lc3BhY2UsIGkuZS4gaXNfdmFsaWRfbmFtZXNwYWNlKCJ0d2lzdGVkIikKKyAgICogd2lsbCBiZSBjYWxsZWQgZm9yIHRoZSBhYm92ZSBleGFtcGxlLgorICAgKi8KKyAgc3RhdGljIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSB7CisgICAgKHZvaWQpc3ViX25hbWVzcGFjZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvKioKKyAgICogRXNjYXBlIHN0cmluZyB0byB1c2Ugb25lIGluIGdlbmVyYXRlZCBzb3VyY2VzLgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBlc2NhcGVfc3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbikgY29uc3Q7CisKKyAgc3RkOjpzdHJpbmcgZ2V0X2VzY2FwZWRfc3RyaW5nKHRfY29uc3RfdmFsdWUqIGNvbnN0dmFsKSB7CisgICAgcmV0dXJuIGVzY2FwZV9zdHJpbmcoY29uc3R2YWwtPmdldF9zdHJpbmcoKSk7CisgIH0KKworICAvKioKKyAgICogQ2hlY2sgaWYgYWxsIGlkZW50aWZpZXJzIGFyZSB2YWxpZCBmb3IgdGhlIHRhcmdldCBsYW5ndWFnZQorICAgKi8KKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlX2lucHV0KCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gbGFuZ19rZXl3b3JkcygpIGNvbnN0OworCisgIC8qKgorICAgKiBBIGxpc3Qgb2YgcmVzZXJ2ZWQgd29yZHMgdGhhdCBjYW5ub3QgYmUgdXNlZCBhcyBpZGVudGlmaWVycy4KKyAgICovCisgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBrZXl3b3Jkc187CisKKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlX2lkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCkgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlKHRfZW51bSBjb25zdCogZW4pIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgdmFsaWRhdGUodF9lbnVtX3ZhbHVlIGNvbnN0KiBlbl92YWwpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgdmFsaWRhdGUodF90eXBlZGVmIGNvbnN0KiB0ZCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZSh0X2NvbnN0IGNvbnN0KiBjKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlKHRfc2VydmljZSBjb25zdCogcykgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZSh0X3N0cnVjdCBjb25zdCogYykgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZSh0X2ZpZWxkIGNvbnN0KiBmKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlKHRfZnVuY3Rpb24gY29uc3QqIGYpIGNvbnN0OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIHZhbGlkYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiBsaXN0KSBjb25zdDsKKworICAvKioKKyAgICogT3B0aW9uYWwgbWV0aG9kcyB0aGF0IG1heSBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzIHRvIHRha2UgbmVjZXNzYXJ5CisgICAqIHN0ZXBzIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kIG9mIGNvZGUgZ2VuZXJhdGlvbi4KKyAgICovCisKKyAgdmlydHVhbCB2b2lkIGluaXRfZ2VuZXJhdG9yKCkge30KKyAgdmlydHVhbCB2b2lkIGNsb3NlX2dlbmVyYXRvcigpIHt9CisKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKworICAvKioKKyAgICogUHVyZSB2aXJ0dWFsIG1ldGhvZHMgaW1wbGVtZW50ZWQgYnkgdGhlIGdlbmVyYXRvciBzdWJjbGFzc2VzLgorICAgKi8KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pID0gMDsKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeyAodm9pZCl0Y29uc3Q7IH0KKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgPSAwOworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHRfc3RydWN0Kikge30KKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgICAvLyBCeSBkZWZhdWx0IGV4Y2VwdGlvbnMgYXJlIHRoZSBzYW1lIGFzIHN0cnVjdHMKKyAgICBnZW5lcmF0ZV9zdHJ1Y3QodHhjZXB0aW9uKTsKKyAgfQorCisgIC8qKgorICAgKiBNZXRob2QgdG8gZ2V0IHRoZSBwcm9ncmFtIG5hbWUsIG1heSBiZSBvdmVycmlkZGVuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9wcm9ncmFtX25hbWUodF9wcm9ncmFtKiB0cHJvZ3JhbSkgeyByZXR1cm4gdHByb2dyYW0tPmdldF9uYW1lKCk7IH0KKworICAvKioKKyAgICogTWV0aG9kIHRvIGdldCB0aGUgc2VydmljZSBuYW1lLCBtYXkgYmUgb3ZlcnJpZGRlbgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfc2VydmljZV9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpIHsgcmV0dXJuIHRzZXJ2aWNlLT5nZXRfbmFtZSgpOyB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgY3VycmVudCBvdXRwdXQgZGlyZWN0b3J5CisgICAqLworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9vdXRfZGlyKCkgY29uc3QgeworICAgIGlmIChwcm9ncmFtXy0+aXNfb3V0X3BhdGhfYWJzb2x1dGUoKSkgeworICAgICAgcmV0dXJuIHByb2dyYW1fLT5nZXRfb3V0X3BhdGgoKSArICIvIjsKKyAgICB9CisKKyAgICByZXR1cm4gcHJvZ3JhbV8tPmdldF9vdXRfcGF0aCgpICsgb3V0X2Rpcl9iYXNlXyArICIvIjsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgdW5pcXVlIHRlbXBvcmFyeSB2YXJpYWJsZSBuYW1lLCB3aGljaCBpcyBqdXN0ICJuYW1lIiB3aXRoIGEKKyAgICogbnVtYmVyIGFwcGVuZGVkIHRvIGl0IChpLmUuIG5hbWUzNSkKKyAgICovCisgIHN0ZDo6c3RyaW5nIHRtcChzdGQ6OnN0cmluZyBuYW1lKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgICBvdXQgPDwgbmFtZSA8PCB0bXBfKys7CisgICAgcmV0dXJuIG91dC5zdHIoKTsKKyAgfQorCisgIC8qKgorICAgKiBHZW5lcmF0ZXMgYSBjb21tZW50IGFib3V0IHRoaXMgY29kZSBiZWluZyBhdXRvZ2VuZXJhdGVkLCB1c2luZyBDKysgc3R5bGUKKyAgICogY29tbWVudHMsIHdoaWNoIGFyZSBhbHNvIGZhaXIgZ2FtZSBpbiBKYXZhIC8gUEhQLCB5YXkhCisgICAqCisgICAqIEByZXR1cm4gQy1zdHlsZSBjb21tZW50IG1lbnRpb25pbmcgdGhhdCB0aGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZC4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiLyoqXG4iKSArICIgKiAiICsgYXV0b2dlbl9zdW1tYXJ5KCkgKyAiXG4iICsgIiAqXG4iCisgICAgICAgICAgICsgIiAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIKKyAgICAgICAgICAgKyAiICogIEBnZW5lcmF0ZWRcbiIgKyAiICovXG4iOworICB9CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBhdXRvZ2VuX3N1bW1hcnkoKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIikgKyBUSFJJRlRfVkVSU0lPTiArICIpIjsKKyAgfQorCisgIC8qKgorICAgKiBJbmRlbnRhdGlvbiBsZXZlbCBtb2RpZmllcnMKKyAgICovCisKKyAgdm9pZCBpbmRlbnRfdXAoKSB7ICsraW5kZW50XzsgfQorCisgIHZvaWQgaW5kZW50X2Rvd24oKSB7IC0taW5kZW50XzsgfQorCisgIC8qKgorICAqIEluZGVudGF0aW9uIHZhbGlkYXRpb24gaGVscGVyCisgICovCisgIGludCBpbmRlbnRfY291bnQoKSB7IHJldHVybiBpbmRlbnRfOyB9CisKKyAgdm9pZCBpbmRlbnRfdmFsaWRhdGUoIGludCBleHBlY3RlZCwgY29uc3QgY2hhciAqIGZ1bmNfbmFtZSkgeworICAgIGlmIChpbmRlbnRfICE9IGV4cGVjdGVkKSB7IAorICAgICAgcHZlcmJvc2UoIldyb25nIGluZGVudCBjb3VudCBpbiAlczogZGlmZmVyZW5jZSA9ICVpIFxuIiwgZnVuY19uYW1lLCAoZXhwZWN0ZWQgLSBpbmRlbnRfKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEluZGVudGF0aW9uIHByaW50IGZ1bmN0aW9uCisgICAqLworICBzdGQ6OnN0cmluZyBpbmRlbnQoKSB7CisgICAgc3RkOjpzdHJpbmcgaW5kID0gIiI7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGluZGVudF87ICsraSkgeworICAgICAgaW5kICs9IGluZGVudF9zdHIoKTsKKyAgICB9CisgICAgcmV0dXJuIGluZDsKKyAgfQorCisgIC8qKgorICAgKiBJbmRlbnRhdGlvbiB1dGlsaXR5IHdyYXBwZXIKKyAgICovCisgIHN0ZDo6b3N0cmVhbSYgaW5kZW50KHN0ZDo6b3N0cmVhbSYgb3MpIHsgcmV0dXJuIG9zIDw8IGluZGVudCgpOyB9CisKKyAgLyoqCisgICAqIENhcGl0YWxpemF0aW9uIGhlbHBlcnMKKyAgICovCisgIHN0ZDo6c3RyaW5nIGNhcGl0YWxpemUoc3RkOjpzdHJpbmcgaW4pIHsKKyAgICBpblswXSA9IHRvdXBwZXIoaW5bMF0pOworICAgIHJldHVybiBpbjsKKyAgfQorICBzdGQ6OnN0cmluZyBkZWNhcGl0YWxpemUoc3RkOjpzdHJpbmcgaW4pIHsKKyAgICBpblswXSA9IHRvbG93ZXIoaW5bMF0pOworICAgIHJldHVybiBpbjsKKyAgfQorICBzdGF0aWMgc3RkOjpzdHJpbmcgbG93ZXJjYXNlKHN0ZDo6c3RyaW5nIGluKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbi5zaXplKCk7ICsraSkgeworICAgICAgaW5baV0gPSB0b2xvd2VyKGluW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIGluOworICB9CisgIHN0YXRpYyBzdGQ6OnN0cmluZyB1cHBlcmNhc2Uoc3RkOjpzdHJpbmcgaW4pIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluLnNpemUoKTsgKytpKSB7CisgICAgICBpbltpXSA9IHRvdXBwZXIoaW5baV0pOworICAgIH0KKyAgICByZXR1cm4gaW47CisgIH0KKworICAvKioKKyAgICogVHJhbnNmb3JtcyBhIGNhbWVsIGNhc2Ugc3RyaW5nIHRvIGFuIGVxdWl2YWxlbnQgb25lIHNlcGFyYXRlZCBieSB1bmRlcnNjb3JlcworICAgKiBlLmcuIGFNdWx0aVdvcmQgLT4gYV9tdWx0aV93b3JkCisgICAqICAgICAgc29tZU5hbWUgICAtPiBzb21lX25hbWUKKyAgICogICAgICBDYW1lbENhc2UgIC0+IGNhbWVsX2Nhc2UKKyAgICogICAgICBuYW1lICAgICAgIC0+IG5hbWUKKyAgICogICAgICBOYW1lICAgICAgIC0+IG5hbWUKKyAgICovCisgIHN0ZDo6c3RyaW5nIHVuZGVyc2NvcmUoc3RkOjpzdHJpbmcgaW4pIHsKKyAgICBpblswXSA9IHRvbG93ZXIoaW5bMF0pOworICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgaW4uc2l6ZSgpOyArK2kpIHsKKyAgICAgIGlmIChpc3VwcGVyKGluW2ldKSkgeworICAgICAgICBpbltpXSA9IHRvbG93ZXIoaW5baV0pOworICAgICAgICBpbi5pbnNlcnQoaSwgIl8iKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGluOworICB9CisKKyAgLyoqCisgICAgKiBUcmFuc2Zvcm1zIGEgc3RyaW5nIHdpdGggd29yZHMgc2VwYXJhdGVkIGJ5IHVuZGVyc2NvcmVzIHRvIGEgY2FtZWwgY2FzZSBlcXVpdmFsZW50CisgICAgKiBlLmcuIGFfbXVsdGlfd29yZCAtPiBhTXVsdGlXb3JkCisgICAgKiAgICAgIHNvbWVfbmFtZSAgICAtPiAgc29tZU5hbWUKKyAgICAqICAgICAgbmFtZSAgICAgICAgIC0+ICBuYW1lCisgICAgKi8KKyAgc3RkOjpzdHJpbmcgY2FtZWxjYXNlKHN0ZDo6c3RyaW5nIGluKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgICBib29sIHVuZGVyc2NvcmUgPSBmYWxzZTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW4uc2l6ZSgpOyBpKyspIHsKKyAgICAgIGlmIChpbltpXSA9PSAnXycpIHsKKyAgICAgICAgdW5kZXJzY29yZSA9IHRydWU7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHVuZGVyc2NvcmUpIHsKKyAgICAgICAgb3V0IDw8IChjaGFyKXRvdXBwZXIoaW5baV0pOworICAgICAgICB1bmRlcnNjb3JlID0gZmFsc2U7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgb3V0IDw8IGluW2ldOworICAgIH0KKworICAgIHJldHVybiBvdXQuc3RyKCk7CisgIH0KKworICBjb25zdCBzdGQ6OnN0cmluZyBlbWl0X2RvdWJsZV9hc19zdHJpbmcoY29uc3QgZG91YmxlIHZhbHVlKSB7CisgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBkb3VibGVfb3V0cHV0X3N0cmVhbTsKKyAgICAgIC8vIHNldHMgdGhlIG1heGltdW0gcHJlY2lzaW9uOiBodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9pby9tYW5pcC9zZXRwcmVjaXNpb24KKyAgICAgIC8vIHNldHMgdGhlIG91dHB1dCBmb3JtYXQgdG8gZml4ZWQ6IGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2lvL21hbmlwL2ZpeGVkIChub3QgaW4gc2NpZW50aWZpYyBub3RhdGlvbikKKyAgICAgIGRvdWJsZV9vdXRwdXRfc3RyZWFtIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZGlnaXRzMTAgKyAxKTsKKworICAgICAgI2lmZGVmIF9NU0NfVkVSCisgICAgICAgICAgLy8gc3RydG9kIGlzIGJyb2tlbiBpbiBNU1ZDIGNvbXBpbGVycyBvbGRlciB0aGFuIDIwMTUsIHNvIHN0ZDo6Zml4ZWQgZmFpbHMgdG8gZm9ybWF0IGEgZG91YmxlIGxpdGVyYWwuCisgICAgICAgICAgLy8gbW9yZSBkZXRhaWxzOiBodHRwczovL2Jsb2dzLm1zZG4ubWljcm9zb2Z0LmNvbS92Y2Jsb2cvMjAxNC8wNi8xOC8KKyAgICAgICAgICAvLyAgICAgICAgICAgICAgIGMtcnVudGltZS1jcnQtZmVhdHVyZXMtZml4ZXMtYW5kLWJyZWFraW5nLWNoYW5nZXMtaW4tdmlzdWFsLXN0dWRpby0xNC1jdHAxLworICAgICAgICAgIC8vICAgICAgICAgICAgICAgYW5kCisgICAgICAgICAgLy8gICAgICAgICAgICAgICBodHRwOi8vd3d3LmV4cGxvcmluZ2JpbmFyeS5jb20vdmlzdWFsLWMtcGx1cy1wbHVzLXN0cnRvZC1zdGlsbC1icm9rZW4vCisgICAgICAgICAgI2lmIF9NU0NfVkVSID49IE1TQ18yMDE1X1ZFUgorICAgICAgICAgICAgICBkb3VibGVfb3V0cHV0X3N0cmVhbSA8PCBzdGQ6OmZpeGVkOworICAgICAgICAgICNlbmRpZgorICAgICAgI2Vsc2UKKyAgICAgICAgICBkb3VibGVfb3V0cHV0X3N0cmVhbSA8PCBzdGQ6OmZpeGVkOworICAgICAgI2VuZGlmCisKKyAgICAgIGRvdWJsZV9vdXRwdXRfc3RyZWFtIDw8IHZhbHVlOworCisgICAgICByZXR1cm4gZG91YmxlX291dHB1dF9zdHJlYW0uc3RyKCk7CisgIH0KKworcHVibGljOgorICAvKioKKyAgICogR2V0IHRoZSB0cnVlIHR5cGUgYmVoaW5kIGEgc2VyaWVzIG9mIHR5cGVkZWZzLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IHRfdHlwZSogZ2V0X3RydWVfdHlwZShjb25zdCB0X3R5cGUqIHR5cGUpIHsgcmV0dXJuIHR5cGUtPmdldF90cnVlX3R5cGUoKTsgfQorICBzdGF0aWMgdF90eXBlKiBnZXRfdHJ1ZV90eXBlKHRfdHlwZSogdHlwZSkgeyByZXR1cm4gdHlwZS0+Z2V0X3RydWVfdHlwZSgpOyB9CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqIFRoZSBwcm9ncmFtIGJlaW5nIGdlbmVyYXRlZAorICAgKi8KKyAgdF9wcm9ncmFtKiBwcm9ncmFtXzsKKworICAvKioKKyAgICogUXVpY2sgYWNjZXNzb3IgZm9yIGZvcm1hdHRlZCBwcm9ncmFtIG5hbWUgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcKKyAgICogZ2VuZXJhdGVkLgorICAgKi8KKyAgc3RkOjpzdHJpbmcgcHJvZ3JhbV9uYW1lXzsKKworICAvKioKKyAgICogUXVpY2sgYWNjZXNzb3IgZm9yIGZvcm1hdHRlZCBzZXJ2aWNlIG5hbWUgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcKKyAgICogZ2VuZXJhdGVkLgorICAgKi8KKyAgc3RkOjpzdHJpbmcgc2VydmljZV9uYW1lXzsKKworICAvKioKKyAgICogT3V0cHV0IHR5cGUtc3BlY2lmYyBkaXJlY3RvcnkgbmFtZSAoImdlbi0qIikKKyAgICovCisgIHN0ZDo6c3RyaW5nIG91dF9kaXJfYmFzZV87CisKKyAgLyoqCisgICAqIE1hcCBvZiBjaGFyYWN0ZXJzIHRvIGVzY2FwZSBpbiBzdHJpbmcgbGl0ZXJhbHMuCisgICAqLworICBzdGQ6Om1hcDxjaGFyLCBzdGQ6OnN0cmluZz4gZXNjYXBlXzsKKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGluZGVudF9zdHIoKSBjb25zdCB7CisgICAgcmV0dXJuICIgICI7CisgIH0KKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEN1cnJlbnQgY29kZSBpbmRlbnRhdGlvbiBsZXZlbAorICAgKi8KKyAgaW50IGluZGVudF87CisKKyAgLyoqCisgICAqIFRlbXBvcmFyeSB2YXJpYWJsZSBjb3VudGVyLCBmb3IgbWFraW5nIHVuaXF1ZSB2YXJpYWJsZSBuYW1lcworICAgKi8KKyAgaW50IHRtcF87Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBzdGQ6OmNoYXJfdHJhaXRzPF9DaGFyVD4gPgorY2xhc3MgdGVtcGxhdGVfb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSA6IHB1YmxpYyBzdGQ6Om9zdHJpbmdzdHJlYW0geworcHVibGljOgorICB0ZW1wbGF0ZV9vZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlKCk6IGNvbnRlbnRzX3dyaXR0ZW4oZmFsc2UpIHt9CisKKyAgdGVtcGxhdGVfb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZShzdGQ6OnN0cmluZyBjb25zdCYgb3V0cHV0X2ZpbGVfcGF0aF8pCisgIDogb3V0cHV0X2ZpbGVfcGF0aChvdXRwdXRfZmlsZV9wYXRoXyksIGNvbnRlbnRzX3dyaXR0ZW4oZmFsc2UpIHt9CisKKyAgfnRlbXBsYXRlX29mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUoKSB7CisgICAgaWYgKCFjb250ZW50c193cml0dGVuKSB7CisgICAgICBjbG9zZSgpOworICAgIH0KKyAgfQorCisgIHZvaWQgb3BlbihzdGQ6OnN0cmluZyBjb25zdCYgb3V0cHV0X2ZpbGVfcGF0aF8pIHsKKyAgICBvdXRwdXRfZmlsZV9wYXRoID0gb3V0cHV0X2ZpbGVfcGF0aF87CisgICAgY2xlYXJfYnVmKCk7CisgICAgY29udGVudHNfd3JpdHRlbiA9IGZhbHNlOworICB9CisKKyAgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAoY29udGVudHNfd3JpdHRlbiB8fCBvdXRwdXRfZmlsZV9wYXRoID09ICIiKQorICAgICAgcmV0dXJuOworCisgICAgaWYgKCFpc19yZWFkYWJsZShvdXRwdXRfZmlsZV9wYXRoKSkgeworICAgICAgZHVtcCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6aWZzdHJlYW0gb2xkX2ZpbGU7CisgICAgb2xkX2ZpbGUuZXhjZXB0aW9ucyhvbGRfZmlsZS5leGNlcHRpb25zKCkgfCBzdGQ6Omlmc3RyZWFtOjpiYWRiaXQgfCBzdGQ6Omlmc3RyZWFtOjpmYWlsYml0KTsKKyAgICBvbGRfZmlsZS5vcGVuKG91dHB1dF9maWxlX3BhdGguY19zdHIoKSwgc3RkOjppb3M6OmluKTsKKworICAgIGlmIChvbGRfZmlsZSkgeworICAgICAgc3RkOjpzdHJpbmcgY29uc3Qgb2xkX2ZpbGVfY29udGVudHMoc3RhdGljX2Nhc3Q8c3RkOjpvc3RyaW5nc3RyZWFtIGNvbnN0Jj4oc3RkOjpvc3RyaW5nc3RyZWFtKCkgPDwgb2xkX2ZpbGUucmRidWYoKSkuc3RyKCkpOworICAgICAgb2xkX2ZpbGUuY2xvc2UoKTsKKworICAgICAgaWYgKG9sZF9maWxlX2NvbnRlbnRzICE9IHN0cigpKSB7CisgICAgICAgIGR1bXAoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworcHJvdGVjdGVkOgorICB2b2lkIGR1bXAoKSB7CisgICAgc3RkOjpvZnN0cmVhbSBvdXRfZmlsZTsKKyAgICBvdXRfZmlsZS5leGNlcHRpb25zKG91dF9maWxlLmV4Y2VwdGlvbnMoKSB8IHN0ZDo6b2ZzdHJlYW06OmJhZGJpdCB8IHN0ZDo6b2ZzdHJlYW06OmZhaWxiaXQpOworICAgIHRyeSB7CisgICAgICBvdXRfZmlsZS5vcGVuKG91dHB1dF9maWxlX3BhdGguY19zdHIoKSwgc3RkOjppb3M6Om91dCk7CisgICAgfQorICAgIGNhdGNoIChjb25zdCBzdGQ6Omlvc19iYXNlOjpmYWlsdXJlJiBlKSB7CisgICAgICA6OmZhaWx1cmUoImZhaWxlZCB0byB3cml0ZSB0aGUgb3V0cHV0IHRvIHRoZSBmaWxlICclcycsIGRldGFpbHM6ICclcyciLCBvdXRwdXRfZmlsZV9wYXRoLmNfc3RyKCksIGUud2hhdCgpKTsKKyAgICB9CisgICAgb3V0X2ZpbGUgPDwgc3RyKCk7CisgICAgb3V0X2ZpbGUuY2xvc2UoKTsKKyAgICBjbGVhcl9idWYoKTsKKyAgICBjb250ZW50c193cml0dGVuID0gdHJ1ZTsKKyAgfQorCisgIHZvaWQgY2xlYXJfYnVmKCkgeworICAgIHN0cihzdGQ6OnN0cmluZygpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzX3JlYWRhYmxlKHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWxlX25hbWUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oc3RkOjppZnN0cmVhbShmaWxlX25hbWUuY19zdHIoKSkpOworICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIG91dHB1dF9maWxlX3BhdGg7CisgIGJvb2wgY29udGVudHNfd3JpdHRlbjsKK307Cit0eXBlZGVmIHRlbXBsYXRlX29mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGU8Y2hhcj4gb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjAyMTY3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfR0VORVJBVE9SX1JFR0lTVFJZX0gKKyNkZWZpbmUgVF9HRU5FUkFUT1JfUkVHSVNUUllfSAorCitjbGFzcyB0X2dlbmVyYXRvcjsKKworLyoqCisgKiBBIGZhY3RvcnkgZm9yIHByb2R1Y2luZyBnZW5lcmF0b3IgY2xhc3NlcyBvZiBhIHBhcnRpY3VsYXIgbGFuZ3VhZ2UuCisgKgorICogVGhpcyBjbGFzcyBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvcjoKKyAqICAtIFJlZ2lzdGVyaW5nIGl0c2VsZiB3aXRoIHRoZSBnZW5lcmF0b3IgcmVnaXN0cnkuCisgKiAgLSBQcm92aWRpbmcgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGdlbmVyYXRvcnMgaXQgcHJvZHVjZXMuCisgKi8KK2NsYXNzIHRfZ2VuZXJhdG9yX2ZhY3RvcnkgeworcHVibGljOgorICB0X2dlbmVyYXRvcl9mYWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzaG9ydF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb25nX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRvY3VtZW50YXRpb24pOworCisgIHZpcnR1YWwgfnRfZ2VuZXJhdG9yX2ZhY3RvcnkoKSB7fQorCisgIHZpcnR1YWwgdF9nZW5lcmF0b3IqIGdldF9nZW5lcmF0b3IoCisgICAgICAvLyBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZS4KKyAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgIC8vIE5vdGU6IHBhcnNlZF9vcHRpb25zIHdpbGwgbm90IGV4aXN0IGJleW9uZCB0aGUgY2FsbCB0byBnZXRfZ2VuZXJhdG9yLgorICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAvLyBOb3RlOiBvcHRpb25fc3RyaW5nIG1pZ2h0IG5vdCBleGlzdCBiZXlvbmQgdGhlIGNhbGwgdG8gZ2V0X2dlbmVyYXRvci4KKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKSA9IDA7CisKKyAgdmlydHVhbCBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgPSAwOworCisgIHN0ZDo6c3RyaW5nIGdldF9zaG9ydF9uYW1lKCkgeyByZXR1cm4gc2hvcnRfbmFtZV87IH0KKyAgc3RkOjpzdHJpbmcgZ2V0X2xvbmdfbmFtZSgpIHsgcmV0dXJuIGxvbmdfbmFtZV87IH0KKyAgc3RkOjpzdHJpbmcgZ2V0X2RvY3VtZW50YXRpb24oKSB7IHJldHVybiBkb2N1bWVudGF0aW9uXzsgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBzaG9ydF9uYW1lXzsKKyAgc3RkOjpzdHJpbmcgbG9uZ19uYW1lXzsKKyAgc3RkOjpzdHJpbmcgZG9jdW1lbnRhdGlvbl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgZ2VuZXJhdG9yPgorY2xhc3MgdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsIDogcHVibGljIHRfZ2VuZXJhdG9yX2ZhY3RvcnkgeworcHVibGljOgorICB0X2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwoY29uc3Qgc3RkOjpzdHJpbmcmIHNob3J0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbG9uZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRvY3VtZW50YXRpb24pCisgICAgOiB0X2dlbmVyYXRvcl9mYWN0b3J5KHNob3J0X25hbWUsIGxvbmdfbmFtZSwgZG9jdW1lbnRhdGlvbikge30KKworICB2aXJ0dWFsIHRfZ2VuZXJhdG9yKiBnZXRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykgeworICAgIHJldHVybiBuZXcgZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBpc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpIHsKKyAgICByZXR1cm4gZ2VuZXJhdG9yOjppc192YWxpZF9uYW1lc3BhY2Uoc3ViX25hbWVzcGFjZSk7CisgIH0KK307CisKK2NsYXNzIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5IHsKK3B1YmxpYzoKKyAgc3RhdGljIHZvaWQgcmVnaXN0ZXJfZ2VuZXJhdG9yKHRfZ2VuZXJhdG9yX2ZhY3RvcnkqIGZhY3RvcnkpOworCisgIHN0YXRpYyB0X2dlbmVyYXRvciogZ2V0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25zKTsKKyAgc3RhdGljIHRfZ2VuZXJhdG9yKiBnZXRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsYXVnbmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbnMpOworCisgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfZ2VuZXJhdG9yX2ZhY3RvcnkqPiBnZW5fbWFwX3Q7CisgIHN0YXRpYyBnZW5fbWFwX3QmIGdldF9nZW5lcmF0b3JfbWFwKCk7CisKK3ByaXZhdGU6CisgIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5KCk7CisgIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5KGNvbnN0IHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5Jik7Cit9OworCisjZGVmaW5lIFRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IobGFuZ3VhZ2UsIGxvbmdfbmFtZSwgZG9jKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNsYXNzIHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6IHB1YmxpYyB0X2dlbmVyYXRvcl9mYWN0b3J5X2ltcGw8dF8jI2xhbmd1YWdlIyNfZ2VuZXJhdG9yPiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdF8jI2xhbmd1YWdlIyNfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6IHRfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbDx0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3I+KCNsYW5ndWFnZSwgbG9uZ19uYW1lLCBkb2MpIHt9ICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3JfZmFjdG9yeV9pbXBsIF9yZWdpc3RlcmVyOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ29fZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nb19nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMxNmI4NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ29fZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMzcxMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIHByb2dyYW1tYXRpY2FsbHkgc2FuaXRpemVkIGZvciBzdHlsZToKKyAqIGFzdHlsZSAtLXN0eWxlPTF0YnMgLWYgLXAgLUggLWogLVUgdF9nb19nZW5lcmF0b3IuY2MKKyAqCisgKiBUaGUgb3V0cHV0IG9mIGFzdHlsZSBzaG91bGQgbm90IGJlIHRha2VuIHVucXVlc3Rpb25pbmdseSwgYnV0IGl0IGlzIGEgZ29vZAorICogZ3VpZGUgZm9yIGVuc3VyaW5nIHVuaWZvcm1pdHkgYW5kIHJlYWRhYmlsaXR5LgorICovCisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjbG9jYWxlPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogQSBoZWxwZXIgZm9yIGF1dG9tYXRpY2FsbHkgZm9ybWF0dGluZyB0aGUgZW1pdHRlZCBHbyBjb2RlIGZyb20gdGhlIFRocmlmdAorICogSURMIHBlciB0aGUgR28gc3R5bGUgZ3VpZGUuCisgKgorICogUmV0dXJuczoKKyAqICAtIHRydWUsIGlmIHRoZSBmb3JtYXR0aW5nIHByb2Nlc3Mgc3VjY2VlZGVkLgorICogIC0gZmFsc2UsIGlmIHRoZSBmb3JtYXR0aW5nIHByb2Nlc3MgZmFpbGVkLCB3aGljaCBtZWFucyB0aGUgYmFzaWMgb3V0cHV0IHdhcworICogICAgICAgICAgIHN0aWxsIGdlbmVyYXRlZC4KKyAqLworYm9vbCBmb3JtYXRfZ29fb3V0cHV0KGNvbnN0IHN0cmluZyYgZmlsZV9wYXRoKTsKKworY29uc3Qgc3RyaW5nIERFRkFVTFRfVEhSSUZUX0lNUE9SVCA9ICJnaXRodWIuY29tL2FwYWNoZS90aHJpZnQvbGliL2dvL3RocmlmdCI7CitzdGF0aWMgc3RkOjpzdHJpbmcgcGFja2FnZV9mbGFnOworCisvKioKKyAqIEdvIGNvZGUgZ2VuZXJhdG9yLgorICovCitjbGFzcyB0X2dvX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfZ29fZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworCisgICAgZ2VuX3RocmlmdF9pbXBvcnRfID0gREVGQVVMVF9USFJJRlRfSU1QT1JUOworICAgIGdlbl9wYWNrYWdlX3ByZWZpeF8gPSAiIjsKKyAgICBwYWNrYWdlX2ZsYWcgPSAiIjsKKyAgICByZWFkX3dyaXRlX3ByaXZhdGVfID0gZmFsc2U7CisgICAgaWdub3JlX2luaXRpYWxpc21zXyA9IGZhbHNlOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInBhY2thZ2VfcHJlZml4IikgPT0gMCkgeworICAgICAgICBnZW5fcGFja2FnZV9wcmVmaXhfID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInRocmlmdF9pbXBvcnQiKSA9PSAwKSB7CisgICAgICAgIGdlbl90aHJpZnRfaW1wb3J0XyA9IChpdGVyLT5zZWNvbmQpOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJwYWNrYWdlIikgPT0gMCkgeworICAgICAgICBwYWNrYWdlX2ZsYWcgPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicmVhZF93cml0ZV9wcml2YXRlIikgPT0gMCkgeworICAgICAgICByZWFkX3dyaXRlX3ByaXZhdGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiaWdub3JlX2luaXRpYWxpc21zIikgPT0gMCkgeworICAgICAgICBpZ25vcmVfaW5pdGlhbGlzbXNfID0gIHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gZ286IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWdvIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgY29uc3Qgc3RyaW5nJiBuYW1lLCBib29sIG9wdCA9IGZhbHNlKTsKKworICAvKioKKyAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQorICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfYXJncyA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9nb19zdHJ1Y3RfaW5pdGlhbGl6ZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2FyZ3Nfb3JfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2lzc2V0X2hlbHBlcnMoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfY291bnRzZXRmaWVsZHNfaGVscGVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfZ29fc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VzX2NvdW50c2V0ZmllbGRzID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2dvX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZXRfcHVibGljaXplZF9uYW1lX2FuZF9kZWZfdmFsdWUodF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIE9VVF9wdWJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSoqIE9VVF9kZWZfdmFsdWUpIGNvbnN0OworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvZXJjZURhdGEgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlua2V5ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3BvaW50ZXJfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlua2V5ID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyX2ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqIHRkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWJoZWFkZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIGdvX2F1dG9nZW5fY29tbWVudCgpOworICBzdGQ6OnN0cmluZyBnb19wYWNrYWdlKCk7CisgIHN0ZDo6c3RyaW5nIGdvX2ltcG9ydHNfYmVnaW4oYm9vbCBjb25zdHMpOworICBzdGQ6OnN0cmluZyBnb19pbXBvcnRzX2VuZCgpOworICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoYm9vbCBjb25zdHMpOworICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZWRfcHJvZ3JhbXMoc3RyaW5nJiB1bnVzZWRfcHJvdGVjdGlvbik7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbXBvcnRfcHJvdGVjdGlvbigpOworICBzdGQ6OnN0cmluZyByZW5kZXJfZmFzdGJpbmFyeV9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2FyZ3VtZW50KHRfZmllbGQqIHRmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9maWVsZF9pbml0aWFsX3ZhbHVlKHRfZmllbGQqIHRmaWVsZCwgY29uc3Qgc3RyaW5nJiBuYW1lLCBib29sIG9wdGlvbmFsX2ZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBtb2R1bGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfaWYodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFkZEVycm9yID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2dvX3R5cGUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZ29fdHlwZV93aXRoX29wdCh0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25hbF9maWVsZCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZ29fa2V5X3R5cGUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fc3BlY19hcmdzKHRfdHlwZSogdHR5cGUpOworCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfcmVhbF9nb19tb2R1bGUoY29uc3QgdF9wcm9ncmFtKiBwcm9ncmFtKSB7CisKKyAgICBpZiAoIXBhY2thZ2VfZmxhZy5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcGFja2FnZV9mbGFnOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyByZWFsX21vZHVsZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImdvIik7CisgICAgaWYgKCFyZWFsX21vZHVsZS5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcmVhbF9tb2R1bGU7CisgICAgfQorCisgICAgcmV0dXJuIGxvd2VyY2FzZShwcm9ncmFtLT5nZXRfbmFtZSgpKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBnZW5fcGFja2FnZV9wcmVmaXhfOworICBzdGQ6OnN0cmluZyBnZW5fdGhyaWZ0X2ltcG9ydF87CisgIGJvb2wgcmVhZF93cml0ZV9wcml2YXRlXzsKKyAgYm9vbCBpZ25vcmVfaW5pdGlhbGlzbXNfOworCisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgc3RkOjpzdHJpbmcgZl90eXBlc19uYW1lXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0c187CisgIHN0ZDo6c3RyaW5nIGZfY29uc3RzX25hbWVfOworICBzdGQ6OnN0cmluZ3N0cmVhbSBmX2NvbnN0X3ZhbHVlc187CisKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOworICBzdGQ6OnN0cmluZyByZWFkX21ldGhvZF9uYW1lXzsKKyAgc3RkOjpzdHJpbmcgd3JpdGVfbWV0aG9kX25hbWVfOworCisgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjb21tb25Jbml0aWFsaXNtczsKKworICBzdGQ6OnN0cmluZyBjYW1lbGNhc2UoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSBjb25zdDsKKyAgdm9pZCBmaXhfY29tbW9uX2luaXRpYWxpc20oc3RkOjpzdHJpbmcmIHZhbHVlLCBpbnQgaSkgY29uc3Q7CisgIHN0ZDo6c3RyaW5nIHB1YmxpY2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUsIGJvb2wgaXNfYXJnc19vcl9yZXN1bHQgPSBmYWxzZSkgY29uc3Q7CisgIHN0ZDo6c3RyaW5nIHByaXZhdGl6ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIGNvbnN0OworICBzdGQ6OnN0cmluZyBuZXdfcHJlZml4KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgY29uc3Q7CisgIHN0YXRpYyBzdGQ6OnN0cmluZyB2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RhdGljIGJvb2wgaXNfcG9pbnRlcl9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UpOworICBzdGF0aWMgYm9vbCBvbWl0X2luaXRpYWxpemF0aW9uKHRfZmllbGQqIHRmaWVsZCk7Cit9OworCisvLyByZXR1cm5zIHRydWUgaWYgZmllbGQgaW5pdGlhbGl6YXRpb24gY2FuIGJlIG9taXR0ZWQgc2luY2UgaXQgaGFzIGNvcnJlc3BvbmRpbmcgZ28gdHlwZSB6ZXJvIHZhbHVlCisvLyBvciBkZWZhdWx0IHZhbHVlIGlzIG5vdCBzZXQKK2Jvb2wgdF9nb19nZW5lcmF0b3I6Om9taXRfaW5pdGlhbGl6YXRpb24odF9maWVsZCogdGZpZWxkKSB7CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGZpZWxkLT5nZXRfdmFsdWUoKTsKKyAgaWYgKCF2YWx1ZSkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIiI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAvL1tdYnl0ZSBhcmUgYWx3YXlzIGlubGluZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAvLyBzdHJpbmdzIGFyZSBwb2ludGVycyBpZiBoYXMgbm8gZGVmYXVsdAorICAgICAgcmV0dXJuIHZhbHVlLT5nZXRfc3RyaW5nKCkuZW1wdHkoKTsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuIHZhbHVlLT5nZXRfaW50ZWdlcigpID09IDA7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICByZXR1cm4gdmFsdWUtPmdldF9pbnRlZ2VyKCkgPT0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiB2YWx1ZS0+Z2V0X2RvdWJsZSgpID09IDAuOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHlwZSBuZWVkIGEgcmVmZXJlbmNlIGlmIHVzZWQgYXMgb3B0aW9uYWwgd2l0aG91dCBkZWZhdWx0CitzdGF0aWMgYm9vbCB0eXBlX25lZWRfcmVmZXJlbmNlKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gdHlwZS0+Z2V0X3RydWVfdHlwZSgpOworICBpZiAodHlwZS0+aXNfbWFwKCkgfHwgdHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3N0cnVjdCgpCisgICAgICB8fCB0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyByZXR1cm5zIGZhbHNlIGlmIGZpZWxkIGNvdWxkIG5vdCB1c2UgY29tcGFyaXNvbiB0byBkZWZhdWx0IHZhbHVlIGFzICFJc1NldCoKK2Jvb2wgdF9nb19nZW5lcmF0b3I6OmlzX3BvaW50ZXJfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluX2NvbnRhaW5lcl92YWx1ZSkgeworICAodm9pZClpbl9jb250YWluZXJfdmFsdWU7CisgIGlmICh0ZmllbGQtPmFubm90YXRpb25zXy5jb3VudCgiY3BwLnJlZiIpICE9IDApIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKyAgLy8gU3RydWN0cyBpbiBjb250YWluZXJzIGFyZSBwb2ludGVycworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmICghKHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGJvb2wgaGFzX2RlZmF1bHQgPSB0ZmllbGQtPmdldF92YWx1ZSgpOworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIiI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAvL1tdYnl0ZSBhcmUgYWx3YXlzIGlubGluZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAvLyBzdHJpbmdzIGFyZSBwb2ludGVycyBpZiBoYXMgbm8gZGVmYXVsdAorICAgICAgcmV0dXJuICFoYXNfZGVmYXVsdDsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICFoYXNfZGVmYXVsdDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICFoYXNfZGVmYXVsdDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gaGFzX2RlZmF1bHQ7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gaGFzX2RlZmF1bHQ7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuIGhhc19kZWZhdWx0OworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJldHVybiBoYXNfZGVmYXVsdDsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19nb190eXBlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworc3RkOjpzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmNhbWVsY2FzZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcgdmFsdWUyKHZhbHVlKTsKKyAgc3RkOjpzZXRsb2NhbGUoTENfQUxMLCAiQyIpOyAvLyBzZXQgbG9jYWxlIHRvIGNsYXNzaWMKKworICAvLyBGaXggY29tbW9uIGluaXRpYWxpc20gaW4gZmlyc3Qgd29yZAorICBmaXhfY29tbW9uX2luaXRpYWxpc20odmFsdWUyLCAwKTsKKworICAvLyBhcyBsb25nIGFzIHdlIGFyZSBjaGFuZ2luZyB0aGluZ3MsIGxldCdzIGNoYW5nZSBfIGZvbGxvd2VkIGJ5IGxvd2VyY2FzZSB0bworICAvLyBjYXBpdGFsIGFuZCBmaXggY29tbW9uIGluaXRpYWxpc21zCisgIGZvciAoc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBpID0gMTsgaSA8IHZhbHVlMi5zaXplKCkgLSAxOyArK2kpIHsKKyAgICBpZiAodmFsdWUyW2ldID09ICdfJykgeworICAgICAgaWYgKGlzbG93ZXIodmFsdWUyW2kgKyAxXSkpIHsKKyAgICAgICAgdmFsdWUyLnJlcGxhY2UoaSwgMiwgMSwgdG91cHBlcih2YWx1ZTJbaSArIDFdKSk7CisgICAgICB9CisKKyAgICAgIGlmIChpID4gc3RhdGljX2Nhc3Q8c3RkOjpzdHJpbmc6OnNpemVfdHlwZT4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+KCkubWF4KCkpKSB7CisgICAgICAgIHRocm93ICJpbnRlZ2VyIG92ZXJmbG93IGluIHRfZ29fZ2VuZXJhdG9yOjpjYW1lbGNhc2UsIHZhbHVlID0gIiArIHZhbHVlOworICAgICAgfQorICAgICAgZml4X2NvbW1vbl9pbml0aWFsaXNtKHZhbHVlMiwgc3RhdGljX2Nhc3Q8aW50PihpKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHZhbHVlMjsKK30KKworLy8gQ2hlY2tzIHRvIHNlZSBpZiB0aGUgd29yZCBzdGFydGluZyBhdCBpIGluIHZhbHVlIGNvbnRhaW5zIGEgY29tbW9uIGluaXRpYWxpc20KKy8vIGFuZCBpZiBzbyByZXBsYWNlcyBpdCB3aXRoIHRoZSB1cHBlciBjYXNlIHZlcnNpb24gb2YgdGhlIHdvcmQuCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpmaXhfY29tbW9uX2luaXRpYWxpc20oc3RkOjpzdHJpbmcmIHZhbHVlLCBpbnQgaSkgY29uc3QgeworICBpZiAoIWlnbm9yZV9pbml0aWFsaXNtc18pIHsKKyAgICBzaXplX3Qgd29yZExlbiA9IHZhbHVlLmZpbmQoJ18nLCBpKTsKKyAgICBpZiAod29yZExlbiAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgd29yZExlbiAtPSBpOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB3b3JkID0gdmFsdWUuc3Vic3RyKGksIHdvcmRMZW4pOworICAgIHN0ZDo6dHJhbnNmb3JtKHdvcmQuYmVnaW4oKSwgd29yZC5lbmQoKSwgd29yZC5iZWdpbigpLCA6OnRvdXBwZXIpOworICAgIGlmIChjb21tb25Jbml0aWFsaXNtcy5maW5kKHdvcmQpICE9IGNvbW1vbkluaXRpYWxpc21zLmVuZCgpKSB7CisgICAgICB2YWx1ZS5yZXBsYWNlKGksIHdvcmQubGVuZ3RoKCksIHdvcmQpOworICAgIH0KKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2dvX2dlbmVyYXRvcjo6cHVibGljaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSwgYm9vbCBpc19hcmdzX29yX3Jlc3VsdCkgY29uc3QgeworICBpZiAodmFsdWUuc2l6ZSgpIDw9IDApIHsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICBzdGQ6OnN0cmluZyB2YWx1ZTIodmFsdWUpLCBwcmVmaXg7CisKKyAgc3RyaW5nOjpzaXplX3R5cGUgZG90X3BvcyA9IHZhbHVlLnJmaW5kKCcuJyk7CisgIGlmIChkb3RfcG9zICE9IHN0cmluZzo6bnBvcykgeworICAgIHByZWZpeCA9IHZhbHVlLnN1YnN0cigwLCBkb3RfcG9zICsgMSkgKyBwcmVmaXg7CisgICAgdmFsdWUyID0gdmFsdWUuc3Vic3RyKGRvdF9wb3MgKyAxKTsKKyAgfQorCisgIGlmICghaXN1cHBlcih2YWx1ZTJbMF0pKSB7CisgICAgdmFsdWUyWzBdID0gdG91cHBlcih2YWx1ZTJbMF0pOworICB9CisKKyAgdmFsdWUyID0gY2FtZWxjYXNlKHZhbHVlMik7CisKKyAgLy8gZmluYWwgbGVuZ3RoIGJlZm9yZSBmdXJ0aGVyIGNoZWNrcywgdGhlIHN0cmluZyBtYXkgYmVjb21lIGxvbmdlcgorICBzaXplX3QgbGVuX2JlZm9yZSA9IHZhbHVlMi5sZW5ndGgoKTsKKworICAvLyBJREwgaWRlbnRpZmllcnMgbWF5IHN0YXJ0IHdpdGggIk5ldyIgd2hpY2ggaW50ZXJmZXJlcyB3aXRoIHRoZSBDVE9SIHBhdHRlcm4KKyAgLy8gQWRkaW5nIGFuIGV4dHJhIHVuZGVyc2NvcmUgdG8gYWxsIHRob3NlIGlkZW50aWZpZXJzIHNvbHZlcyB0aGlzCisgIGlmICgobGVuX2JlZm9yZSA+PSAzKSAmJiAodmFsdWUyLnN1YnN0cigwLCAzKSA9PSAiTmV3IikpIHsKKyAgICB2YWx1ZTIgKz0gJ18nOworICB9CisKKyAgLy8gSURMIGlkZW50aWZpZXJzIG1heSBlbmQgd2l0aCAiQXJncyIvIlJlc3VsdCIgd2hpY2ggaW50ZXJmZXJlcyB3aXRoIHRoZSBpbXBsaWNpdCBzZXJ2aWNlCisgIC8vIGZ1bmN0aW9uIHN0cnVjdHMKKyAgLy8gQWRkaW5nIGFub3RoZXIgZXh0cmEgdW5kZXJzY29yZSB0byBhbGwgdGhvc2UgaWRlbnRpZmllcnMgc29sdmVzIHRoaXMKKyAgLy8gU3VwcHJlc3MgdGhpcyBjaGVjayBmb3IgdGhlIGFjdHVhbCBoZWxwZXIgc3RydWN0IG5hbWVzCisgIGlmICghaXNfYXJnc19vcl9yZXN1bHQpIHsKKyAgICBib29sIGVuZHNfd2l0aF9hcmdzID0gKGxlbl9iZWZvcmUgPj0gNCkgJiYgKHZhbHVlMi5zdWJzdHIobGVuX2JlZm9yZSAtIDQsIDQpID09ICJBcmdzIik7CisgICAgYm9vbCBlbmRzX3dpdGhfcnNsdCA9IChsZW5fYmVmb3JlID49IDYpICYmICh2YWx1ZTIuc3Vic3RyKGxlbl9iZWZvcmUgLSA2LCA2KSA9PSAiUmVzdWx0Iik7CisgICAgaWYgKGVuZHNfd2l0aF9hcmdzIHx8IGVuZHNfd2l0aF9yc2x0KSB7CisgICAgICB2YWx1ZTIgKz0gJ18nOworICAgIH0KKyAgfQorCisgIC8vIEF2b2lkIG5hbWluZyBjb2xsaXNpb25zIHdpdGggb3RoZXIgc2VydmljZXMKKyAgaWYgKGlzX2FyZ3Nfb3JfcmVzdWx0KSB7CisgICAgcHJlZml4ICs9IHB1YmxpY2l6ZShzZXJ2aWNlX25hbWVfKTsKKyAgfQorCisgIHJldHVybiBwcmVmaXggKyB2YWx1ZTI7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpuZXdfcHJlZml4KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgY29uc3QgeworICBpZiAodmFsdWUuc2l6ZSgpIDw9IDApIHsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICBzdHJpbmc6OnNpemVfdHlwZSBkb3RfcG9zID0gdmFsdWUucmZpbmQoJy4nKTsKKyAgaWYgKGRvdF9wb3MgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgcmV0dXJuIHZhbHVlLnN1YnN0cigwLCBkb3RfcG9zICsgMSkgKyAiTmV3IiArIHB1YmxpY2l6ZSh2YWx1ZS5zdWJzdHIoZG90X3BvcyArIDEpKTsKKyAgfQorICByZXR1cm4gIk5ldyIgKyBwdWJsaWNpemUodmFsdWUpOworfQorCitzdGQ6OnN0cmluZyB0X2dvX2dlbmVyYXRvcjo6cHJpdmF0aXplKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgY29uc3QgeworICBpZiAodmFsdWUuc2l6ZSgpIDw9IDApIHsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICBzdGQ6OnN0cmluZyB2YWx1ZTIodmFsdWUpOworCisgIGlmICghaXNsb3dlcih2YWx1ZTJbMF0pKSB7CisgICAgdmFsdWUyWzBdID0gdG9sb3dlcih2YWx1ZTJbMF0pOworICB9CisKKyAgdmFsdWUyID0gY2FtZWxjYXNlKHZhbHVlMik7CisKKyAgcmV0dXJuIHZhbHVlMjsKK30KKworc3RkOjpzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgaWYgKHZhbHVlLnNpemUoKSA8PSAwKSB7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgc3RkOjpzdHJpbmcgdmFsdWUyKHZhbHVlKTsKKyAgc3RkOjp0cmFuc2Zvcm0odmFsdWUyLmJlZ2luKCksIHZhbHVlMi5lbmQoKSwgdmFsdWUyLmJlZ2luKCksIDo6dG9sb3dlcik7CisKKyAgc3dpdGNoICh2YWx1ZVswXSkgeworICBjYXNlICdiJzoKKyAgY2FzZSAnQic6CisgICAgaWYgKHZhbHVlMiAhPSAiYnJlYWsiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAnYyc6CisgIGNhc2UgJ0MnOgorICAgIGlmICh2YWx1ZTIgIT0gImNhc2UiICYmIHZhbHVlMiAhPSAiY2hhbiIgJiYgdmFsdWUyICE9ICJjb25zdCIgJiYgdmFsdWUyICE9ICJjb250aW51ZSIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICdkJzoKKyAgY2FzZSAnRCc6CisgICAgaWYgKHZhbHVlMiAhPSAiZGVmYXVsdCIgJiYgdmFsdWUyICE9ICJkZWZlciIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICdlJzoKKyAgY2FzZSAnRSc6CisgICAgaWYgKHZhbHVlMiAhPSAiZWxzZSIgJiYgdmFsdWUyICE9ICJlcnJvciIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICdmJzoKKyAgY2FzZSAnRic6CisgICAgaWYgKHZhbHVlMiAhPSAiZmFsbHRocm91Z2giICYmIHZhbHVlMiAhPSAiZm9yIiAmJiB2YWx1ZTIgIT0gImZ1bmMiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAnZyc6CisgIGNhc2UgJ0cnOgorICAgIGlmICh2YWx1ZTIgIT0gImdvIiAmJiB2YWx1ZTIgIT0gImdvdG8iKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAnaSc6CisgIGNhc2UgJ0knOgorICAgIGlmICh2YWx1ZTIgIT0gImlmIiAmJiB2YWx1ZTIgIT0gImltcG9ydCIgJiYgdmFsdWUyICE9ICJpbnRlcmZhY2UiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAnbSc6CisgIGNhc2UgJ00nOgorICAgIGlmICh2YWx1ZTIgIT0gIm1hcCIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICdwJzoKKyAgY2FzZSAnUCc6CisgICAgaWYgKHZhbHVlMiAhPSAicGFja2FnZSIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICdyJzoKKyAgY2FzZSAnUic6CisgICAgaWYgKHZhbHVlMiAhPSAicmFuZ2UiICYmIHZhbHVlMiAhPSAicmV0dXJuIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ3MnOgorICBjYXNlICdTJzoKKyAgICBpZiAodmFsdWUyICE9ICJzZWxlY3QiICYmIHZhbHVlMiAhPSAic3RydWN0IiAmJiB2YWx1ZTIgIT0gInN3aXRjaCIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICd0JzoKKyAgY2FzZSAnVCc6CisgICAgaWYgKHZhbHVlMiAhPSAidHlwZSIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICd2JzoKKyAgY2FzZSAnVic6CisgICAgaWYgKHZhbHVlMiAhPSAidmFyIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgcmV0dXJuIHZhbHVlMiArICJfYTEiOworfQorCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIHN0cmluZyBtb2R1bGUgPSBnZXRfcmVhbF9nb19tb2R1bGUocHJvZ3JhbV8pOworICBzdHJpbmcgdGFyZ2V0ID0gbW9kdWxlOworICBwYWNrYWdlX2Rpcl8gPSBnZXRfb3V0X2RpcigpOworCisgIC8vIFRoaXMgc2V0IGlzIHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9saW50L2Jsb2IvbWFzdGVyL2xpbnQuZ28jTDY5MgorICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkFQSSIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkFTQ0lJIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiQ1BVIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiQ1NTIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiRE5TIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiRU9GIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiR1VJRCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkhUTUwiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJIVFRQIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiSFRUUFMiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJJRCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIklQIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiSlNPTiIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkxIUyIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlFQUyIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlJBTSIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlJIUyIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlJQQyIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlNMQSIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlNNVFAiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJTU0giKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJUQ1AiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJUTFMiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJUVEwiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJVRFAiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJVSSIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlVJRCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlVVSUQiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJVUkkiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJVUkwiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJVVEY4Iik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVk0iKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJYTUwiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJYU1JGIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiWFNTIik7CisKKyAgLy8gbmFtZXMgb2YgcmVhZCBhbmQgd3JpdGUgbWV0aG9kcworICBpZiAocmVhZF93cml0ZV9wcml2YXRlXykgeworICAgIHJlYWRfbWV0aG9kX25hbWVfID0gInJlYWQiOworICAgIHdyaXRlX21ldGhvZF9uYW1lXyA9ICJ3cml0ZSI7CisgIH0gZWxzZSB7CisgICAgcmVhZF9tZXRob2RfbmFtZV8gPSAiUmVhZCI7CisgICAgd3JpdGVfbWV0aG9kX25hbWVfID0gIldyaXRlIjsKKyAgfQorCisgIHdoaWxlICh0cnVlKSB7CisgICAgLy8gVE9ETzogRG8gYmV0dGVyIGVycm9yIGNoZWNraW5nIGhlcmUuCisgICAgTUtESVIocGFja2FnZV9kaXJfLmNfc3RyKCkpOworCisgICAgaWYgKG1vZHVsZS5lbXB0eSgpKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBtb2R1bGUuZmluZCgnLicpOworCisgICAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHBhY2thZ2VfZGlyXyArPSAiLyI7CisgICAgICBwYWNrYWdlX2Rpcl8gKz0gbW9kdWxlOworICAgICAgcGFja2FnZV9uYW1lXyA9IG1vZHVsZTsKKyAgICAgIG1vZHVsZS5jbGVhcigpOworICAgIH0gZWxzZSB7CisgICAgICBwYWNrYWdlX2Rpcl8gKz0gIi8iOworICAgICAgcGFja2FnZV9kaXJfICs9IG1vZHVsZS5zdWJzdHIoMCwgcG9zKTsKKyAgICAgIG1vZHVsZS5lcmFzZSgwLCBwb3MgKyAxKTsKKyAgICB9CisgIH0KKworICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisKKyAgd2hpbGUgKChsb2MgPSB0YXJnZXQuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICB0YXJnZXQucmVwbGFjZShsb2MsIDEsIDEsICcvJyk7CisgIH0KKworICAvLyBNYWtlIG91dHB1dCBmaWxlcworICBmX3R5cGVzX25hbWVfID0gcGFja2FnZV9kaXJfICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICIuZ28iOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZV8uY19zdHIoKSk7CisKKyAgZl9jb25zdHNfbmFtZV8gPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBwcm9ncmFtX25hbWVfICsgIi1jb25zdHMuZ28iOworICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lXy5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl90eXBlc18gPDwgZ29fYXV0b2dlbl9jb21tZW50KCkgPDwgZ29fcGFja2FnZSgpIDw8IHJlbmRlcl9pbmNsdWRlcyhmYWxzZSk7CisKKyAgZl9jb25zdHNfIDw8IGdvX2F1dG9nZW5fY29tbWVudCgpIDw8IGdvX3BhY2thZ2UoKSA8PCByZW5kZXJfaW5jbHVkZXModHJ1ZSk7CisKKyAgZl9jb25zdF92YWx1ZXNfIDw8IGVuZGwgPDwgImZ1bmMgaW5pdCgpIHsiIDw8IGVuZGw7CisKKyAgLy8gQ3JlYXRlIGZpbGUgZm9yIHRoZSBHb1VudXNlZFByb3RlY3Rpb25fXyB2YXJpYWJsZQorICBzdHJpbmcgZl91bnVzZWRfcHJvdF9uYW1lXyA9IHBhY2thZ2VfZGlyXyArICIvIiArICJHb1VudXNlZFByb3RlY3Rpb25fXy5nbyI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl91bnVzZWRfcHJvdF87CisgIGZfdW51c2VkX3Byb3RfLm9wZW4oZl91bnVzZWRfcHJvdF9uYW1lXy5jX3N0cigpKTsKKyAgZl91bnVzZWRfcHJvdF8gPDwgZ29fYXV0b2dlbl9jb21tZW50KCkgPDwgZ29fcGFja2FnZSgpIDw8IHJlbmRlcl9pbXBvcnRfcHJvdGVjdGlvbigpOworICBmX3VudXNlZF9wcm90Xy5jbG9zZSgpOworfQorCisKK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVkX3Byb2dyYW1zKHN0cmluZyYgdW51c2VkX3Byb3RlY3Rpb24pIHsKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIHVudXNlZF9wcm90ZWN0aW9uID0gIiI7CisKKyAgc3RyaW5nIGxvY2FsX25hbWVzcGFjZSA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJnbyIpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgaWYgKCFsb2NhbF9uYW1lc3BhY2UuZW1wdHkoKSAmJiBsb2NhbF9uYW1lc3BhY2UgPT0gaW5jbHVkZXNbaV0tPmdldF9uYW1lc3BhY2UoImdvIikpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHN0cmluZyBnb19tb2R1bGUgPSBnZXRfcmVhbF9nb19tb2R1bGUoaW5jbHVkZXNbaV0pOworICAgIHNpemVfdCBmb3VuZCA9IDA7CisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBnb19tb2R1bGUuc2l6ZSgpOyBqKyspIHsKKyAgICAgIC8vIEltcG9ydCBzdGF0ZW1lbnQgdXNlcyBzbGFzaGVzICgnLycpIGluIG5hbWVzcGFjZQorICAgICAgaWYgKGdvX21vZHVsZVtqXSA9PSAnLicpIHsKKyAgICAgICAgZ29fbW9kdWxlW2pdID0gJy8nOworICAgICAgICBmb3VuZCA9IGogKyAxOworICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdCArPSAiXHRcIiIgKyBnZW5fcGFja2FnZV9wcmVmaXhfICsgZ29fbW9kdWxlICsgIlwiXG4iOworICAgIHVudXNlZF9wcm90ZWN0aW9uICs9ICJ2YXIgXyA9ICIgKyBnb19tb2R1bGUuc3Vic3RyKGZvdW5kKSArICIuR29VbnVzZWRQcm90ZWN0aW9uX19cbiI7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0uCisgKiBJZiBjb25zdHMgaW5jbHVkZSB0aGUgYWRkaXRpb25hbCBpbXBvcnRzLgorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlcyhib29sIGNvbnN0cykgeworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIHN0cmluZyB1bnVzZWRfcHJvdCA9ICIiOworCisgIHN0cmluZyBsb2NhbF9uYW1lc3BhY2UgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiZ28iKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIGlmICghbG9jYWxfbmFtZXNwYWNlLmVtcHR5KCkgJiYgbG9jYWxfbmFtZXNwYWNlID09IGluY2x1ZGVzW2ldLT5nZXRfbmFtZXNwYWNlKCJnbyIpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBzdHJpbmcgZ29fbW9kdWxlID0gZ2V0X3JlYWxfZ29fbW9kdWxlKGluY2x1ZGVzW2ldKTsKKyAgICBzaXplX3QgZm91bmQgPSAwOworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZ29fbW9kdWxlLnNpemUoKTsgaisrKSB7CisgICAgICAvLyBJbXBvcnQgc3RhdGVtZW50IHVzZXMgc2xhc2hlcyAoJy8nKSBpbiBuYW1lc3BhY2UKKyAgICAgIGlmIChnb19tb2R1bGVbal0gPT0gJy4nKSB7CisgICAgICAgIGdvX21vZHVsZVtqXSA9ICcvJzsKKyAgICAgICAgZm91bmQgPSBqICsgMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXN1bHQgKz0gIlx0XCIiICsgZ2VuX3BhY2thZ2VfcHJlZml4XyArIGdvX21vZHVsZSArICJcIlxuIjsKKyAgICB1bnVzZWRfcHJvdCArPSAidmFyIF8gPSAiICsgZ29fbW9kdWxlLnN1YnN0cihmb3VuZCkgKyAiLkdvVW51c2VkUHJvdGVjdGlvbl9fXG4iOworICB9CisKKyAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApIHsKKyAgICByZXN1bHQgKz0gIlxuIjsKKyAgfQorCisgIHJldHVybiBnb19pbXBvcnRzX2JlZ2luKGNvbnN0cykgKyByZXN1bHQgKyBnb19pbXBvcnRzX2VuZCgpICsgdW51c2VkX3Byb3Q7Cit9CisKK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6cmVuZGVyX2ltcG9ydF9wcm90ZWN0aW9uKCkgeworICByZXR1cm4gc3RyaW5nKCJ2YXIgR29VbnVzZWRQcm90ZWN0aW9uX18gaW50O1xuXG4iKTsKK30KKworLyoqCisgKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgdG8gdXNlIHRoZSBhY2NlbGVyYXRlZCBUQmluYXJ5UHJvdG9jb2wKKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfZmFzdGJpbmFyeV9pbmNsdWRlcygpIHsKKyAgcmV0dXJuICIiOworfQorCisvKioKKyAqIEF1dG9nZW4nZCBjb21tZW50CisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6Z29fYXV0b2dlbl9jb21tZW50KCkgeworICByZXR1cm4KKyAgICAgICAgc3RkOjpzdHJpbmcoKSArCisgICAgICAgICIvLyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKKyAgICAgICAgIi8vIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcblxuIjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgdGhyaWZ0IHBhY2thZ2UKKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpnb19wYWNrYWdlKCkgeworICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXyArICJcblxuIjsKK30KKworLyoqCisgKiBSZW5kZXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW1wb3J0IHN0YXRlbWVudC4KKyAqIElmIGNvbnN0cyBpbmNsdWRlIHRoZSBhZGRpdGlvbmFsIGltcG9ydHMuCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6Z29faW1wb3J0c19iZWdpbihib29sIGNvbnN0cykgeworICBzdHJpbmcgZXh0cmE7CisKKyAgLy8gSWYgbm90IHdyaXRpbmcgY29uc3RhbnRzLCBhbmQgdGhlcmUgYXJlIGVudW1zLCBuZWVkIGV4dHJhIGltcG9ydHMuCisgIGlmICghY29uc3RzICYmIGdldF9wcm9ncmFtKCktPmdldF9lbnVtcygpLnNpemUoKSA+IDApIHsKKyAgICBleHRyYSArPQorICAgICAgIlx0XCJkYXRhYmFzZS9zcWwvZHJpdmVyXCJcbiIKKyAgICAgICJcdFwiZXJyb3JzXCJcbiI7CisgIH0KKyAgcmV0dXJuIHN0cmluZygKKyAgICAgICJpbXBvcnQgKFxuIgorICAgICAgIlx0XCJieXRlc1wiXG4iCisgICAgICAiXHRcImNvbnRleHRcIlxuIgorICAgICAgIlx0XCJyZWZsZWN0XCJcbiIKKyAgICAgICsgZXh0cmEgKworICAgICAgIlx0XCJmbXRcIlxuIgorICAgICAgIlx0XCIiICsgZ2VuX3RocmlmdF9pbXBvcnRfICsgIlwiXG4iKTsKK30KKworLyoqCisgKiBFbmQgdGhlIGltcG9ydCBzdGF0ZW1lbnQsIGluY2x1ZGUgdW5kc2NvcmUtYXNzaWdubWVudHMKKyAqCisgKiBUaGVzZSAiXyA9IiBwcmV2ZW50IHRoZSBnbyBjb21waWxlciBjb21wbGFpbmluZyBhYm91dCB1bnVzZWQgaW1wb3J0cy4KKyAqIFRoaXMgd2lsbCBoYXZlIHRvIGRvIGluIGxpZXUgb2YgbW9yZSBpbnRlbGxpZ2VudCBpbXBvcnQgc3RhdGVtZW50IGNvbnN0cnVjdGlvbgorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmdvX2ltcG9ydHNfZW5kKCkgeworICByZXR1cm4gc3RyaW5nKAorICAgICAgIilcblxuIgorICAgICAgIi8vIChuZWVkZWQgdG8gZW5zdXJlIHNhZmV0eSBiZWNhdXNlIG9mIG5haXZlIGltcG9ydCBsaXN0IGNvbnN0cnVjdGlvbi4pXG4iCisgICAgICAidmFyIF8gPSB0aHJpZnQuWkVST1xuIgorICAgICAgInZhciBfID0gZm10LlByaW50ZlxuIgorICAgICAgInZhciBfID0gY29udGV4dC5CYWNrZ3JvdW5kXG4iCisgICAgICAidmFyIF8gPSByZWZsZWN0LkRlZXBFcXVhbFxuIgorICAgICAgInZhciBfID0gYnl0ZXMuRXF1YWxcblxuIik7Cit9CisKKy8qKgorICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgZl9jb25zdF92YWx1ZXNfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfY29uc3RzXyA8PCBmX2NvbnN0X3ZhbHVlc18uc3RyKCk7CisKKyAgLy8gQ2xvc2UgdHlwZXMgYW5kIGNvbnN0YW50cyBmaWxlcworICBmX2NvbnN0c18uY2xvc2UoKTsKKyAgZl90eXBlc18uY2xvc2UoKTsKKyAgZm9ybWF0X2dvX291dHB1dChmX3R5cGVzX25hbWVfKTsKKyAgZm9ybWF0X2dvX291dHB1dChmX2NvbnN0c19uYW1lXyk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfdHlwZXNfLCB0dHlwZWRlZik7CisgIHN0cmluZyBuZXdfdHlwZV9uYW1lKHB1YmxpY2l6ZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpKTsKKyAgc3RyaW5nIGJhc2VfdHlwZSh0eXBlX3RvX2dvX3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCkpKTsKKworICBpZiAoYmFzZV90eXBlID09IG5ld190eXBlX25hbWUpIHsKKyAgICByZXR1cm47CisgIH0KKworICBmX3R5cGVzXyA8PCAidHlwZSAiIDw8IG5ld190eXBlX25hbWUgPDwgIiAiIDw8IGJhc2VfdHlwZSA8PCBlbmRsIDw8IGVuZGw7CisgIC8vIEdlbmVyYXRlIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBhbiBpbnN0YW5jZSBvZiBhIHR5cGUKKyAgLy8gKHdoaWNoIG1heSBiZSBhIGNvbnN0YW50KSBpbnRvIGEgcG9pbnRlciB0byBhbiBpbnN0YW5jZSBvZiBhIHR5cGUuCisgIGZfdHlwZXNfIDw8ICJmdW5jICIgPDwgbmV3X3R5cGVfbmFtZSA8PCAiUHRyKHYgIiA8PCBuZXdfdHlwZV9uYW1lIDw8ICIpICoiIDw8IG5ld190eXBlX25hbWUKKyAgICAgICAgICAgPDwgIiB7IHJldHVybiAmdiB9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCisgKiB0aGUgdmFsdWVzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSB0b19zdHJpbmdfbWFwcGluZywgZnJvbV9zdHJpbmdfbWFwcGluZzsKKyAgc3RkOjpzdHJpbmcgdGVudW1fbmFtZShwdWJsaWNpemUodGVudW0tPmdldF9uYW1lKCkpKTsKKyAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfdHlwZXNfLCB0ZW51bSk7CisgIGZfdHlwZXNfIDw8ICJ0eXBlICIgPDwgdGVudW1fbmFtZSA8PCAiIGludDY0IiA8PCBlbmRsIDw8ICJjb25zdCAoIiA8PCBlbmRsOworCisgIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICIgPDwgdGVudW1fbmFtZSA8PCAiKSBTdHJpbmcoKSBzdHJpbmcgeyIgPDwgZW5kbDsKKyAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgc3dpdGNoIHAgeyIgPDwgZW5kbDsKKworICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJmdW5jICIgPDwgdGVudW1fbmFtZSA8PCAiRnJvbVN0cmluZyhzIHN0cmluZykgKCIgPDwgdGVudW1fbmFtZQorICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGVycm9yKSB7IiA8PCBlbmRsOworICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIHN3aXRjaCBzIHsiIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBpbnQgdmFsdWUgPSAtMTsKKworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgIHN0cmluZyBpdGVyX3N0ZF9uYW1lKGVzY2FwZV9zdHJpbmcoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSk7CisgICAgc3RyaW5nIGl0ZXJfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgdGVudW1fbmFtZSA8PCAiXyIgPDwgaXRlcl9uYW1lIDw8ICcgJyA8PCB0ZW51bV9uYW1lIDw8ICIgPSAiCisgICAgICAgICAgICAgPDwgdmFsdWUgPDwgZW5kbDsKKyAgICAvLyBEaWN0aW9uYXJpZXMgdG8vZnJvbSBzdHJpbmcgbmFtZXMgb2YgZW51bXMKKyAgICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICBjYXNlICIgPDwgdGVudW1fbmFtZSA8PCAiXyIgPDwgaXRlcl9uYW1lIDw8ICI6IHJldHVybiBcIiIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBpdGVyX3N0ZF9uYW1lIDw8ICJcIiIgPDwgZW5kbDsKKworICAgIGlmIChpdGVyX3N0ZF9uYW1lICE9IGVzY2FwZV9zdHJpbmcoaXRlcl9uYW1lKSkgeworICAgICAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICBjYXNlIFwiIiA8PCBpdGVyX3N0ZF9uYW1lIDw8ICJcIiwgXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVzY2FwZV9zdHJpbmcoaXRlcl9uYW1lKSA8PCAiXCI6IHJldHVybiAiIDw8IHRlbnVtX25hbWUgPDwgIl8iCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGl0ZXJfbmFtZSA8PCAiLCBuaWwgIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIGNhc2UgXCIiIDw8IGl0ZXJfc3RkX25hbWUgPDwgIlwiOiByZXR1cm4gIiA8PCB0ZW51bV9uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJfIiA8PCBpdGVyX25hbWUgPDwgIiwgbmlsICIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gXCI8VU5TRVQ+XCIiIDw8IGVuZGw7CisgIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgdGVudW1fbmFtZSA8PCAiKDApLCIKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZtdC5FcnJvcmYoXCJub3QgYSB2YWxpZCAiIDw8IHRlbnVtX25hbWUgPDwgIiBzdHJpbmdcIikiIDw8IGVuZGw7CisgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgZl90eXBlc18gPDwgIikiIDw8IGVuZGwgPDwgZW5kbCA8PCB0b19zdHJpbmdfbWFwcGluZy5zdHIoKSA8PCBlbmRsIDw8IGZyb21fc3RyaW5nX21hcHBpbmcuc3RyKCkKKyAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBhbiBpbnN0YW5jZSBvZiBhbiBlbnVtCisgIC8vICh3aGljaCBtYXkgYmUgYSBjb25zdGFudCkgaW50byBhIHBvaW50ZXIgdG8gYW4gaW5zdGFuY2Ugb2YgdGhhdCBlbnVtCisgIC8vIHR5cGUuCisgIGZfdHlwZXNfIDw8ICJmdW5jICIgPDwgdGVudW1fbmFtZSA8PCAiUHRyKHYgIiA8PCB0ZW51bV9uYW1lIDw8ICIpICoiIDw8IHRlbnVtX25hbWUKKyAgICAgICAgICAgPDwgIiB7IHJldHVybiAmdiB9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgTWFyc2hhbFRleHQKKyAgZl90eXBlc18gPDwgImZ1bmMgKHAgIiA8PCB0ZW51bV9uYW1lIDw8ICIpIE1hcnNoYWxUZXh0KCkgKFtdYnl0ZSwgZXJyb3IpIHsiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJyZXR1cm4gW11ieXRlKHAuU3RyaW5nKCkpLCBuaWwiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgVW5tYXJzaGFsVGV4dAorICBmX3R5cGVzXyA8PCAiZnVuYyAocCAqIiA8PCB0ZW51bV9uYW1lIDw8ICIpIFVubWFyc2hhbFRleHQodGV4dCBbXWJ5dGUpIGVycm9yIHsiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJxLCBlcnIgOj0gIiA8PCB0ZW51bV9uYW1lIDw8ICJGcm9tU3RyaW5nKHN0cmluZyh0ZXh0KSkiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJpZiAoZXJyICE9IG5pbCkgeyIgPDwgZW5kbCA8PCAicmV0dXJuIGVyciIgPDwgZW5kbCA8PCAifSIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgIipwID0gcSIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgInJldHVybiBuaWwiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgU2NhbiBmb3Igc3FsLlNjYW5uZXIgaW50ZXJmYWNlCisgIGZfdHlwZXNfIDw8ICJmdW5jIChwICoiIDw8IHRlbnVtX25hbWUgPDwgIikgU2Nhbih2YWx1ZSBpbnRlcmZhY2V7fSkgZXJyb3IgeyIgPDxlbmRsOworICBmX3R5cGVzXyA8PCAidiwgb2sgOj0gdmFsdWUuKGludDY0KSIgPDxlbmRsOworICBmX3R5cGVzXyA8PCAiaWYgIW9rIHsiIDw8ZW5kbDsKKyAgZl90eXBlc18gPDwgInJldHVybiBlcnJvcnMuTmV3KFwiU2NhbiB2YWx1ZSBpcyBub3QgaW50NjRcIikiIDw8ZW5kbDsKKyAgZl90eXBlc18gPDwgIn0iIDw8ZW5kbDsKKyAgZl90eXBlc18gPDwgIipwID0gIiA8PCB0ZW51bV9uYW1lIDw8ICIodikiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJyZXR1cm4gbmlsIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIFZhbHVlIGZvciBkcml2ZXIuVmFsdWVyIGludGVyZmFjZQorICBmX3R5cGVzXyA8PCAiZnVuYyAocCAqICIgPDwgdGVudW1fbmFtZSA8PCAiKSBWYWx1ZSgpIChkcml2ZXIuVmFsdWUsIGVycm9yKSB7IiA8PGVuZGw7CisgIGZfdHlwZXNfIDw8ICIgIGlmIHAgPT0gbmlsIHsiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICIgICAgcmV0dXJuIG5pbCwgbmlsIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAiICB9IiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAicmV0dXJuIGludDY0KCpwKSwgbmlsIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbDsKKworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgc3RyaW5nIG5hbWUgPSBwdWJsaWNpemUodGNvbnN0LT5nZXRfbmFtZSgpKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KGZfY29uc3RzXykgPDwgImNvbnN0ICIgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUsIG5hbWUpIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9jb25zdF92YWx1ZXNfIDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlLCBuYW1lKSA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICBmX2NvbnN0c18gPDwgaW5kZW50KCkgPDwgInZhciAiIDw8IG5hbWUgPDwgIiAiIDw8IHR5cGVfdG9fZ29fdHlwZSh0eXBlKSA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgY29uc3Qgc3RyaW5nJiBuYW1lLCBib29sIG9wdCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICBpZiAob3B0KSB7CisgICAgICBvdXQgPDwgIiYoJnN0cnVjdHt4ICI7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBvdXQgPDwgImJvb2x9eyI7CisgICAgICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIG91dCA8PCAiaW50OH17IjsKKyAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgIG91dCA8PCAiaW50MTZ9eyI7CisgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICBvdXQgPDwgImludDMyfXsiOworICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgb3V0IDw8ICJpbnQ2NH17IjsKKyAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgb3V0IDw8ICJmbG9hdDY0fXsiOworICAgICAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICBvdXQgPDwgInN0cmluZ317IjsKKyAgICAgICAgICBvdXQgPDwgJyInICsgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSArICciJzsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgICAgb3V0IDw8ICJ9KS54IjsKKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICAgIG91dCA8PCAiW11ieXRlKFwiIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICJcIikiOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgaWYgKG9wdCkgeworICAgICAgICAgICAgb3V0IDw8ICImKCZzdHJ1Y3R7eCBpbnR9eyI7CisgICAgICAgICAgfQorICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgICBpZiAob3B0KSB7CisgICAgICAgICAgICBvdXQgPDwgIn0pLngiOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8ICImIiA8PCBwdWJsaWNpemUodHlwZV9uYW1lKHR5cGUpKSA8PCAieyI7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGJvb2wgaXNfb3B0aW9uYWwgPSBmYWxzZTsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgICBpc19vcHRpb25hbCA9IGlzX3BvaW50ZXJfZmllbGQoKmZfaXRlcik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcHVibGljaXplKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgPDwgIjogIgorICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCwgbmFtZSwgaXNfb3B0aW9uYWwpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8ICJ9IjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG91dCA8PCAibWFwWyIgPDwgdHlwZV90b19nb190eXBlKGt0eXBlKSA8PCAiXSIgPDwgdHlwZV90b19nb190eXBlKHZ0eXBlKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QsIG5hbWUpIDw8ICI6ICIKKyAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kLCBuYW1lKSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIG91dCA8PCAiW10iIDw8IHR5cGVfdG9fZ29fdHlwZShldHlwZSkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIsIG5hbWUpIDw8ICIsICI7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgb3V0IDw8ICJbXSIgPDwgdHlwZV90b19nb19rZXlfdHlwZShldHlwZSkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIsIG5hbWUpIDw8ICIsICI7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iOworICB9IGVsc2UgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBnbyBzdHJ1Y3QKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2dvX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfZ29fc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZ28gc3RydWN0CisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Cit9CisKK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdldF9wdWJsaWNpemVkX25hbWVfYW5kX2RlZl92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBPVVRfcHViX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSoqIE9VVF9kZWZfdmFsdWUpIGNvbnN0IHsKKyAgY29uc3Qgc3RyaW5nIGJhc2VfZmllbGRfbmFtZSA9IHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgY29uc3Qgc3RyaW5nIGVzY2FwZWRfZmllbGRfbmFtZSA9IGVzY2FwZV9zdHJpbmcoYmFzZV9maWVsZF9uYW1lKTsKKyAgKk9VVF9wdWJfbmFtZSA9IHB1YmxpY2l6ZShlc2NhcGVkX2ZpZWxkX25hbWUpOworICAqT1VUX2RlZl92YWx1ZSA9IHRmaWVsZC0+Z2V0X3ZhbHVlKCk7Cit9CisKK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX3N0cnVjdF9pbml0aWFsaXplcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19hcmdzX29yX3Jlc3VsdCkgeworICBvdXQgPDwgcHVibGljaXplKHR5cGVfbmFtZSh0c3RydWN0KSwgaXNfYXJnc19vcl9yZXN1bHQpIDw8ICJ7IjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsKKyAgICAgICArK21faXRlcikgeworICAgIGJvb2wgcG9pbnRlcl9maWVsZCA9IGlzX3BvaW50ZXJfZmllbGQoKm1faXRlcik7CisgICAgc3RyaW5nIHB1YmxpY2l6ZWRfbmFtZTsKKyAgICB0X2NvbnN0X3ZhbHVlKiBkZWZfdmFsdWU7CisgICAgZ2V0X3B1YmxpY2l6ZWRfbmFtZV9hbmRfZGVmX3ZhbHVlKCptX2l0ZXIsICZwdWJsaWNpemVkX25hbWUsICZkZWZfdmFsdWUpOworICAgIGlmICghcG9pbnRlcl9maWVsZCAmJiBkZWZfdmFsdWUgIT0gTlVMTCAmJiAhb21pdF9pbml0aWFsaXphdGlvbigqbV9pdGVyKSkgeworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcHVibGljaXplZF9uYW1lIDw8ICI6ICIKKyAgICAgICAgICA8PCByZW5kZXJfZmllbGRfaW5pdGlhbF92YWx1ZSgqbV9pdGVyLCAoKm1faXRlciktPmdldF9uYW1lKCksIHBvaW50ZXJfZmllbGQpIDw8ICIsIgorICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgb3V0IDw8ICJ9IiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfYXJncykgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgc29ydGVkX21lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIHN0ZDo6c3RyaW5nIHRzdHJ1Y3RfbmFtZShwdWJsaWNpemUodHN0cnVjdC0+Z2V0X25hbWUoKSwgaXNfYXJncyB8fCBpc19yZXN1bHQpKTsKKyAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiIHN0cnVjdCB7IiA8PCBlbmRsOworICAvKgorICAgICBIZXJlIHdlIGdlbmVyYXRlIHRoZSBzdHJ1Y3R1cmUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGZhc3RiaW5hcnkgY29kZWMuCisgICAgIFRoZXNlIHNwZWNpZmljYXRpb25zIGhhdmUgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisgICAgIHRocmlmdF9zcGVjIC0+IHR1cGxlIG9mIGl0ZW1fc3BlYworICAgICBpdGVtX3NwZWMgLT4gbmlsIHwgKHRhZywgdHlwZV9lbnVtLCBuYW1lLCBzcGVjX2FyZ3MsIGRlZmF1bHQpCisgICAgIHRhZyAtPiBpbnRlZ2VyCisgICAgIHR5cGVfZW51bSAtPiBUVHlwZS5JMzIgfCBUVHlwZS5TVFJJTkcgfCBUVHlwZS5TVFJVQ1QgfCAuLi4KKyAgICAgbmFtZSAtPiBzdHJpbmdfbGl0ZXJhbAorICAgICBkZWZhdWx0IC0+IG5pbCAgIyBIYW5kbGVkIGJ5IF9faW5pdF9fCisgICAgIHNwZWNfYXJncyAtPiBuaWwgICMgRm9yIHNpbXBsZSB0eXBlcworICAgICAgICAgICAgICAgIHwgKHR5cGVfZW51bSwgc3BlY19hcmdzKSAgIyBWYWx1ZSB0eXBlIGZvciBsaXN0L3NldAorICAgICAgICAgICAgICAgIHwgKHR5cGVfZW51bSwgc3BlY19hcmdzLCB0eXBlX2VudW0sIHNwZWNfYXJncykKKyAgICAgICAgICAgICAgICAgICMgS2V5IGFuZCB2YWx1ZSBmb3IgbWFwCisgICAgICAgICAgICAgICAgfCAoY2xhc3NfbmFtZSwgc3BlY19hcmdzX3B0cikgIyBGb3Igc3RydWN0L2V4Y2VwdGlvbgorICAgICBjbGFzc19uYW1lIC0+IGlkZW50aWZpZXIgICMgQmFzaWNhbGx5IGEgcG9pbnRlciB0byB0aGUgY2xhc3MKKyAgICAgc3BlY19hcmdzX3B0ciAtPiBleHByZXNzaW9uICAjIGp1c3QgY2xhc3NfbmFtZS5zcGVjX2FyZ3MKKworICAgICBUT0RPKGRyZWlzcyk6IENvbnNpZGVyIG1ha2luZyB0aGlzIHdvcmsgZm9yIHN0cnVjdHMgd2l0aCBuZWdhdGl2ZSB0YWdzLgorICAqLworICAvLyBUT0RPKGRyZWlzcyk6IExvb2sgaW50byBnZW5lcmF0aW5nIGFuIGVtcHR5IHR1cGxlIGluc3RlYWQgb2YgbmlsCisgIC8vIGZvciBzdHJ1Y3R1cmVzIHdpdGggbm8gbWVtYmVycy4KKyAgLy8gVE9ETyhkcmVpc3MpOiBUZXN0IGVuY29kaW5nIG9mIHN0cnVjdHMgd2hlcmUgc29tZSBpbm5lciBzdHJ1Y3RzCisgIC8vIGRvbid0IGhhdmUgdGhyaWZ0X3NwZWMuCisgIGluZGVudF91cCgpOworCisgIGludCBudW1fc2V0YWJsZSA9IDA7CisgIGlmIChzb3J0ZWRfbWVtYmVycy5lbXB0eSgpIHx8IChzb3J0ZWRfbWVtYmVyc1swXS0+Z2V0X2tleSgpID49IDApKSB7CisgICAgaW50IHNvcnRlZF9rZXlzX3BvcyA9IDA7CisKKyAgICBmb3IgKG1faXRlciA9IHNvcnRlZF9tZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBzb3J0ZWRfbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIC8vIFNldCBmaWVsZCB0byBvcHRpb25hbCBpZiBmaWVsZCBpcyB1bmlvbiwgdGhpcyBpcyBzbyB3ZSBjYW4gZ2V0IGEKKyAgICAgIC8vIHBvaW50ZXIgdG8gdGhlIGZpZWxkLgorICAgICAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpCisgICAgICAgICgqbV9pdGVyKS0+c2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKyAgICAgIGlmIChzb3J0ZWRfa2V5c19wb3MgIT0gKCptX2l0ZXIpLT5nZXRfa2V5KCkpIHsKKyAgICAgICAgaW50IGZpcnN0X3VudXNlZCA9IChzdGQ6Om1heCkoMSwgc29ydGVkX2tleXNfcG9zKyspOworICAgICAgICB3aGlsZSAoc29ydGVkX2tleXNfcG9zICE9ICgqbV9pdGVyKS0+Z2V0X2tleSgpKSB7CisgICAgICAgICAgKytzb3J0ZWRfa2V5c19wb3M7CisgICAgICAgIH0KKyAgICAgICAgaW50IGxhc3RfdW51c2VkID0gc29ydGVkX2tleXNfcG9zIC0gMTsKKyAgICAgICAgaWYgKGZpcnN0X3VudXNlZCA8IGxhc3RfdW51c2VkKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vIHVudXNlZCBmaWVsZHMgIyAiIDw8IGZpcnN0X3VudXNlZCA8PCAiIHRvICIgPDwgbGFzdF91bnVzZWQgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIGlmIChmaXJzdF91bnVzZWQgPT0gbGFzdF91bnVzZWQpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gdW51c2VkIGZpZWxkICMgIiA8PCBmaXJzdF91bnVzZWQgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0X3R5cGUqIGZpZWxkVHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgIHN0cmluZyBnb1R5cGUgPSB0eXBlX3RvX2dvX3R5cGVfd2l0aF9vcHQoZmllbGRUeXBlLCBpc19wb2ludGVyX2ZpZWxkKCptX2l0ZXIpKTsKKyAgICAgIHN0cmluZyBnb3RhZyA9ICJkYjpcIiIgKyBlc2NhcGVfc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgICsgIlwiICI7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgICBnb3RhZyArPSAianNvbjpcIiIgKyBlc2NhcGVfc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiLG9taXRlbXB0eVwiIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdvdGFnICs9ICJqc29uOlwiIiArIGVzY2FwZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSArICJcIiI7CisgICAgICB9CisKKyAgICAgIC8vIENoZWNrIGZvciB1c2VyIG92ZXJyaWRlIG9mIGRiIGFuZCBqc29uIHRhZ3MgdXNpbmcgImdvLnRhZyIKKyAgICAgIHN0ZDo6bWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXQgPSAoKm1faXRlciktPmFubm90YXRpb25zXy5maW5kKCJnby50YWciKTsKKyAgICAgIGlmIChpdCAhPSAoKm1faXRlciktPmFubm90YXRpb25zXy5lbmQoKSkgeworICAgICAgICBnb3RhZyA9IGl0LT5zZWNvbmQ7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCBwdWJsaWNpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiICIgPDwgZ29UeXBlIDw8ICIgYHRocmlmdDpcIiIKKyAgICAgICAgICAgICAgICAgIDw8IGVzY2FwZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiLCIgPDwgc29ydGVkX2tleXNfcG9zOworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgb3V0IDw8ICIscmVxdWlyZWQiOworICAgICAgfQorCisgICAgICBvdXQgPDwgIlwiICIgPDwgZ290YWcgPDwgImAiIDw8IGVuZGw7CisgICAgICBzb3J0ZWRfa2V5c19wb3MrKzsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgLy8gVGhpcyBmaWxscyBpbiBkZWZhdWx0IHZhbHVlcywgYXMgb3Bwb3NlZCB0byBudWxscworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHB1YmxpY2l6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIgIgorICAgICAgICAgIDw8IHR5cGVfdG9fZ29fdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKCkgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAmIjsKKyAgZ2VuZXJhdGVfZ29fc3RydWN0X2luaXRpYWxpemVyKG91dCwgdHN0cnVjdCwgaXNfcmVzdWx0IHx8IGlzX2FyZ3MpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgLy8gRGVmYXVsdCB2YWx1ZXMgZm9yIG9wdGlvbmFsIGZpZWxkcworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgc3RyaW5nIHB1YmxpY2l6ZWRfbmFtZTsKKyAgICB0X2NvbnN0X3ZhbHVlKiBkZWZfdmFsdWU7CisgICAgZ2V0X3B1YmxpY2l6ZWRfbmFtZV9hbmRfZGVmX3ZhbHVlKCptX2l0ZXIsICZwdWJsaWNpemVkX25hbWUsICZkZWZfdmFsdWUpOworICAgIHRfdHlwZSogZmllbGRUeXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIHN0cmluZyBnb1R5cGUgPSB0eXBlX3RvX2dvX3R5cGVfd2l0aF9vcHQoZmllbGRUeXBlLCBmYWxzZSk7CisgICAgc3RyaW5nIGRlZl92YXJfbmFtZSA9IHRzdHJ1Y3RfbmFtZSArICJfIiArIHB1YmxpY2l6ZWRfbmFtZSArICJfREVGQVVMVCI7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwgaXNfcG9pbnRlcl9maWVsZCgqbV9pdGVyKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgIiA8PCBkZWZfdmFyX25hbWUgPDwgIiAiIDw8IGdvVHlwZTsKKyAgICAgIGlmIChkZWZfdmFsdWUgIT0gTlVMTCkgeworICAgICAgICBvdXQgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkVHlwZSwgZGVmX3ZhbHVlLCAoKm1faXRlciktPmdldF9uYW1lKCkpOworICAgICAgfQorICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gbnVtX3NldGFibGUgaXMgdXNlZCBmb3IgZGVjaWRpbmcgaWYgQ291bnQqIG1ldGhvZHMgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIHVuaW9uIGZpZWxkcy4KKyAgICAvLyBUaGlzIGFwcGxpZXMgdG8gYWxsIG51bGxhYmxlIGZpZWxkcyBpbmNsdWRpbmcgc2xpY2VzICh1c2VkIGZvciBzZXQsIGxpc3QgYW5kIGJpbmFyeSkgYW5kIG1hcHMsIG5vdCBqdXN0IHBvaW50ZXJzLgorICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkVHlwZS0+Z2V0X3RydWVfdHlwZSgpOworICAgIGlmIChpc19wb2ludGVyX2ZpZWxkKCptX2l0ZXIpfHwgdHlwZS0+aXNfbWFwKCkgfHwgdHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICBudW1fc2V0YWJsZSArPSAxOworICAgIH0KKworICAgIGlmIChpc19wb2ludGVyX2ZpZWxkKCptX2l0ZXIpKSB7CisgICAgICBzdHJpbmcgZ29PcHRUeXBlID0gdHlwZV90b19nb190eXBlX3dpdGhfb3B0KGZpZWxkVHlwZSwgdHJ1ZSk7CisgICAgICBzdHJpbmcgbWF5YmVwb2ludGVyID0gZ29PcHRUeXBlICE9IGdvVHlwZSA/ICIqIiA6ICIiOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBHZXQiIDw8IHB1YmxpY2l6ZWRfbmFtZSA8PCAiKCkgIgorICAgICAgICAgIDw8IGdvVHlwZSA8PCAiIHsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaWYgIXAuSXNTZXQiIDw8IHB1YmxpY2l6ZWRfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiAiIDw8IGRlZl92YXJfbmFtZSA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IG1heWJlcG9pbnRlciA8PCAicC4iIDw8IHB1YmxpY2l6ZWRfbmFtZSA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgR2V0IiA8PCBwdWJsaWNpemVkX25hbWUgPDwgIigpICIKKyAgICAgICAgICA8PCBnb1R5cGUgPDwgIiB7IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBwLiIgPDwgcHVibGljaXplZF9uYW1lIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkgJiYgbnVtX3NldGFibGUgPiAwKSB7CisgICAgZ2VuZXJhdGVfY291bnRzZXRmaWVsZHNfaGVscGVyKG91dCwgdHN0cnVjdCwgdHN0cnVjdF9uYW1lLCBpc19yZXN1bHQpOworICB9CisKKyAgZ2VuZXJhdGVfaXNzZXRfaGVscGVycyhvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3RfbmFtZSwgaXNfcmVzdWx0KTsKKyAgZ2VuZXJhdGVfZ29fc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3RfbmFtZSwgaXNfcmVzdWx0KTsKKyAgZ2VuZXJhdGVfZ29fc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3RfbmFtZSwgaXNfcmVzdWx0LCBudW1fc2V0YWJsZSA+IDApOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgU3RyaW5nKCkgc3RyaW5nIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpZiBwID09IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gXCI8bmlsPlwiIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmbXQuU3ByaW50ZihcIiIgPDwgZXNjYXBlX3N0cmluZyh0c3RydWN0X25hbWUpIDw8ICIoJSt2KVwiLCAqcCkiCisgICAgICA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBFcnJvcigpIHN0cmluZyB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcC5TdHJpbmcoKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgSXNTZXQgaGVscGVyIG1ldGhvZHMgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2hlbHBlcnMob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgICh2b2lkKWlzX3Jlc3VsdDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBjb25zdCBzdHJpbmcgZXNjYXBlZF90c3RydWN0X25hbWUoZXNjYXBlX3N0cmluZyh0c3RydWN0LT5nZXRfbmFtZSgpKSk7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBjb25zdCBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKSk7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwgaXNfcG9pbnRlcl9maWVsZCgqZl9pdGVyKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBJc1NldCIgPDwgZmllbGRfbmFtZSA8PCAiKCkgYm9vbCB7IgorICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKyAgICAgIGJvb2wgaXNfYnl0ZXNsaWNlID0gdHR5cGUtPmlzX2JpbmFyeSgpOworICAgICAgYm9vbCBjb21wYXJlX3RvX25pbF9vbmx5ID0gdHR5cGUtPmlzX3NldCgpIHx8IHR0eXBlLT5pc19saXN0KCkgfHwgdHR5cGUtPmlzX21hcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaXNfYnl0ZXNsaWNlICYmICEoKmZfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICAgIGlmIChpc19wb2ludGVyX2ZpZWxkKCpmX2l0ZXIpIHx8IGNvbXBhcmVfdG9fbmlsX29ubHkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcC4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBuaWwiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdHJpbmcgZGVmX3Zhcl9uYW1lID0gdHN0cnVjdF9uYW1lICsgIl8iICsgZmllbGRfbmFtZSArICJfREVGQVVMVCI7CisgICAgICAgIGlmIChpc19ieXRlc2xpY2UpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAhYnl0ZXMuRXF1YWwocC4iIDw8IGZpZWxkX25hbWUgPDwgIiwgIiA8PCBkZWZfdmFyX25hbWUgPDwgIikiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcC4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSAiIDw8IGRlZl92YXJfbmFtZSA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBDb3VudFNldEZpZWxkcyBoZWxwZXIgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb3VudHNldGZpZWxkc19oZWxwZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgICh2b2lkKWlzX3Jlc3VsdDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBjb25zdCBzdHJpbmcgZXNjYXBlZF90c3RydWN0X25hbWUoZXNjYXBlX3N0cmluZyh0c3RydWN0LT5nZXRfbmFtZSgpKSk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBDb3VudFNldEZpZWxkcyIgPDwgdHN0cnVjdF9uYW1lIDw8ICIoKSBpbnQgeyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImNvdW50IDo9IDAiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpCisgICAgICBjb250aW51ZTsKKworICAgIHRfdHlwZSogdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOworCisgICAgaWYgKCEoaXNfcG9pbnRlcl9maWVsZCgqZl9pdGVyKSB8fCB0eXBlLT5pc19tYXAoKSB8fCB0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfYmluYXJ5KCkpKQorICAgICAgY29udGludWU7CisKKyAgICBjb25zdCBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChwLklzU2V0IiA8PCBmaWVsZF9uYW1lIDw8ICIoKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNvdW50KysiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBjb3VudCIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHJlYWQgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICAodm9pZClpc19yZXN1bHQ7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgc3RyaW5nIGVzY2FwZWRfdHN0cnVjdF9uYW1lKGVzY2FwZV9zdHJpbmcodHN0cnVjdC0+Z2V0X25hbWUoKSkpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpICIgPDwgcmVhZF9tZXRob2RfbmFtZV8gPDwgIihpcHJvdCB0aHJpZnQuVFByb3RvY29sKSBlcnJvciB7IgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgXywgZXJyIDo9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZihcIiVUIHJlYWQgZXJyb3I6IFwiLCBwKSwgZXJyKSIKKyAgICAgIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIFJlcXVpcmVkIHZhcmlhYmxlcyBkb2VzIG5vdCBoYXZlIElzU2V0IGZ1bmN0aW9ucywgc28gd2UgbmVlZCB0bXAgdmFycyB0byBjaGVjayB0aGVtLgorICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBjb25zdCBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKSk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidmFyIGlzc2V0IiA8PCBmaWVsZF9uYW1lIDw8ICIgYm9vbCA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJmb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgIl8sIGZpZWxkVHlwZUlkLCBmaWVsZElkLCBlcnIgOj0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiCisgICAgICAgICAgICAgICAgICAgICAiXCIlVCBmaWVsZCAlZCByZWFkIGVycm9yOiBcIiwgcCwgZmllbGRJZCksIGVycikiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGZpZWxkVHlwZUlkID09IHRocmlmdC5TVE9QIHsgYnJlYWs7IH0iIDw8IGVuZGw7CisKKyAgc3RyaW5nIHRocmlmdEZpZWxkVHlwZUlkOworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgaW50MzJfdCBmaWVsZF9pZCA9IC0xOworCisgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nLCBmYWxzZSBpZiBubyBmaWVsZHMgcHJlc2VudAorICBib29sIGhhdmVfc3dpdGNoID0gIWZpZWxkcy5lbXB0eSgpOworICBpZiAoaGF2ZV9zd2l0Y2gpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIGZpZWxkSWQgeyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEFsbCB0aGUgZmllbGRzIHdlIGtub3cKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmaWVsZF9pZCA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOworCisgICAgLy8gaWYgbmVnYXRpdmUgaWQsIGVuc3VyZSB3ZSBnZW5lcmF0ZSBhIHZhbGlkIG1ldGhvZCBuYW1lCisgICAgc3RyaW5nIGZpZWxkX21ldGhvZF9wcmVmaXgoIlJlYWRGaWVsZCIpOworICAgIGludDMyX3QgZmllbGRfbWV0aG9kX3N1ZmZpeCA9IGZpZWxkX2lkOworCisgICAgaWYgKGZpZWxkX21ldGhvZF9zdWZmaXggPCAwKSB7CisgICAgICBmaWVsZF9tZXRob2RfcHJlZml4ICs9ICJfIjsKKyAgICAgIGZpZWxkX21ldGhvZF9zdWZmaXggKj0gLTE7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgZmllbGRfaWQgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgdGhyaWZ0RmllbGRUeXBlSWQgPSB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKworICAgIGlmICh0aHJpZnRGaWVsZFR5cGVJZCA9PSAidGhyaWZ0LkJJTkFSWSIpIHsKKyAgICAgIHRocmlmdEZpZWxkVHlwZUlkID0gInRocmlmdC5TVFJJTkciOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZmllbGRUeXBlSWQgPT0gIiA8PCB0aHJpZnRGaWVsZFR5cGVJZCA8PCAiIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGlmIGVyciA6PSBwLiIgPDwgZmllbGRfbWV0aG9kX3ByZWZpeCA8PCBmaWVsZF9tZXRob2Rfc3VmZml4IDw8ICIoaXByb3QpOyBlcnIgIT0gbmlsIHsiCisgICAgICAgIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuIGVyciIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKworICAgIC8vIE1hcmsgcmVxdWlyZWQgZmllbGQgYXMgcmVhZAorICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBjb25zdCBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKSk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaXNzZXQiIDw8IGZpZWxkX25hbWUgPDwgIiA9IHRydWUiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaWYgZXJyIDo9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuIGVyciIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBCZWdpbiBzd2l0Y2ggZGVmYXVsdCBjYXNlCisgIGlmIChoYXZlX3N3aXRjaCkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICAvLyBTa2lwIHVua25vd24gZmllbGRzIGluIGVpdGhlciBjYXNlCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZXJyIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gRW5kIHN3aXRjaCBkZWZhdWx0IGNhc2UKKyAgaWYgKGhhdmVfc3dpdGNoKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gaXByb3QuUmVhZEZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBlcnIiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBpcHJvdC5SZWFkU3RydWN0RW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIKKyAgICAgICAgICAgICAgICAgICAgICJcIiVUIHJlYWQgc3RydWN0IGVuZCBlcnJvcjogXCIsIHApLCBlcnIpIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gUmV0dXJuIGVycm9yIGlmIGFueSByZXF1aXJlZCBmaWVsZHMgYXJlIG1pc3NpbmcuCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGNvbnN0IHN0cmluZyBmaWVsZF9uYW1lKHB1YmxpY2l6ZShlc2NhcGVfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgIWlzc2V0IiA8PCBmaWVsZF9uYW1lIDw8ICJ7IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUodGhyaWZ0LklOVkFMSURfREFUQSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJmbXQuRXJyb3JmKFwiUmVxdWlyZWQgZmllbGQgIiA8PCBmaWVsZF9uYW1lIDw8ICIgaXMgbm90IHNldFwiKSk7IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIG5pbCIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZmllbGRfdHlwZV9uYW1lKHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkpKTsKKyAgICBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSk7CisgICAgc3RyaW5nIGZpZWxkX21ldGhvZF9wcmVmaXgoIlJlYWRGaWVsZCIpOworICAgIGludDMyX3QgZmllbGRfaWQgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKKyAgICBpbnQzMl90IGZpZWxkX21ldGhvZF9zdWZmaXggPSBmaWVsZF9pZDsKKworICAgIGlmIChmaWVsZF9tZXRob2Rfc3VmZml4IDwgMCkgeworICAgICAgZmllbGRfbWV0aG9kX3ByZWZpeCArPSAiXyI7CisgICAgICBmaWVsZF9tZXRob2Rfc3VmZml4ICo9IC0xOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgICIgPDwgZmllbGRfbWV0aG9kX3ByZWZpeCA8PCBmaWVsZF9tZXRob2Rfc3VmZml4CisgICAgICAgIDw8ICIoaXByb3QgdGhyaWZ0LlRQcm90b2NvbCkgZXJyb3IgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsIGZhbHNlLCAicC4iKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gbmlsIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZXNfY291bnRzZXRmaWVsZHMpIHsKKyAgKHZvaWQpaXNfcmVzdWx0OworICBzdHJpbmcgbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgaW5kZW50KG91dCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpICIgPDwgd3JpdGVfbWV0aG9kX25hbWVfIDw8ICIob3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgZXJyb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGlmICh0c3RydWN0LT5pc191bmlvbigpICYmIHVzZXNfY291bnRzZXRmaWVsZHMpIHsKKyAgICBzdGQ6OnN0cmluZyB0c3RydWN0X25hbWUocHVibGljaXplKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGMgOj0gcC5Db3VudFNldEZpZWxkcyIgPDwgdHN0cnVjdF9uYW1lIDw8ICIoKTsgYyAhPSAxIHsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgcmV0dXJuIGZtdC5FcnJvcmYoXCIlVCB3cml0ZSB1bmlvbjogZXhhY3RseSBvbmUgZmllbGQgbXVzdCBiZSBzZXQgKCVkIHNldCkuXCIsIHAsIGMpIgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlU3RydWN0QmVnaW4oXCIiIDw8IG5hbWUgPDwgIlwiKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIgorICAgICAgICAgICAgICAgICAgICAgIlwiJVQgd3JpdGUgc3RydWN0IGJlZ2luIGVycm9yOiBcIiwgcCksIGVycikgfSIgPDwgZW5kbDsKKworICBzdHJpbmcgZmllbGRfbmFtZTsKKyAgc3RyaW5nIGVzY2FwZV9maWVsZF9uYW1lOworICAvLyB0X2NvbnN0X3ZhbHVlKiBmaWVsZF9kZWZhdWx0X3ZhbHVlOworICB0X2ZpZWxkOjplX3JlcSBmaWVsZF9yZXF1aXJlZDsKKyAgaW50MzJfdCBmaWVsZF9pZCA9IC0xOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgcCAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZmllbGRfbWV0aG9kX3ByZWZpeCgid3JpdGVGaWVsZCIpOworICAgIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgZXNjYXBlX2ZpZWxkX25hbWUgPSBlc2NhcGVfc3RyaW5nKGZpZWxkX25hbWUpOworICAgIGZpZWxkX2lkID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7CisgICAgaW50MzJfdCBmaWVsZF9tZXRob2Rfc3VmZml4ID0gZmllbGRfaWQ7CisKKyAgICBpZiAoZmllbGRfbWV0aG9kX3N1ZmZpeCA8IDApIHsKKyAgICAgIGZpZWxkX21ldGhvZF9wcmVmaXggKz0gIl8iOworICAgICAgZmllbGRfbWV0aG9kX3N1ZmZpeCAqPSAtMTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBwLiIgPDwgZmllbGRfbWV0aG9kX3ByZWZpeCA8PCBmaWVsZF9tZXRob2Rfc3VmZml4CisgICAgICAgIDw8ICIob3Byb3QpOyBlcnIgIT0gbmlsIHsgcmV0dXJuIGVyciB9IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRTdG9wKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwid3JpdGUgZmllbGQgc3RvcCBlcnJvcjogXCIsIGVycikgfSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJ3cml0ZSBzdHJ1Y3Qgc3RvcCBlcnJvcjogXCIsIGVycikgfSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gbmlsIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmaWVsZF9tZXRob2RfcHJlZml4KCJ3cml0ZUZpZWxkIik7CisgICAgZmllbGRfaWQgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKKyAgICBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGVzY2FwZV9maWVsZF9uYW1lID0gZXNjYXBlX3N0cmluZyhmaWVsZF9uYW1lKTsKKyAgICAvLyBmaWVsZF9kZWZhdWx0X3ZhbHVlID0gKCpmX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBmaWVsZF9yZXF1aXJlZCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpOworICAgIGludDMyX3QgZmllbGRfbWV0aG9kX3N1ZmZpeCA9IGZpZWxkX2lkOworCisgICAgaWYgKGZpZWxkX21ldGhvZF9zdWZmaXggPCAwKSB7CisgICAgICBmaWVsZF9tZXRob2RfcHJlZml4ICs9ICJfIjsKKyAgICAgIGZpZWxkX21ldGhvZF9zdWZmaXggKj0gLTE7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSAiIDw8IGZpZWxkX21ldGhvZF9wcmVmaXggPDwgZmllbGRfbWV0aG9kX3N1ZmZpeAorICAgICAgICA8PCAiKG9wcm90IHRocmlmdC5UUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAoZmllbGRfcmVxdWlyZWQgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBwLklzU2V0IiA8PCBwdWJsaWNpemUoZmllbGRfbmFtZSkgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oXCIiIDw8IGVzY2FwZV9maWVsZF9uYW1lIDw8ICJcIiwgIgorICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8IGZpZWxkX2lkIDw8ICIpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKFwiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgIgorICAgICAgICA8PCBmaWVsZF9pZCA8PCAiOiIgPDwgZXNjYXBlX2ZpZWxkX25hbWUgPDwgIjogXCIsIHApLCBlcnIpIH0iIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJwLiIpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKFwiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yICIKKyAgICAgICAgPDwgZmllbGRfaWQgPDwgIjoiIDw8IGVzY2FwZV9maWVsZF9uYW1lIDw8ICI6IFwiLCBwKSwgZXJyKSB9IiA8PCBlbmRsOworCisgICAgaWYgKGZpZWxkX3JlcXVpcmVkID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGVyciIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgdGVzdF9zdWZmaXgoIl90ZXN0Iik7CisgIHN0cmluZyBmaWxlbmFtZSA9IGxvd2VyY2FzZShzZXJ2aWNlX25hbWVfKTsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lOworCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlKHRzZXJ2aWNlKTsKKyAgZl90eXBlc18gPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZl90eXBlc18gPDwgIi8vIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHMsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgICAgZ2VuZXJhdGVfZ29fZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgICBzdWNjZXNzLnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgdF9maWVsZCogZiA9ICpmX2l0ZXI7CisgICAgICBmLT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICAgICAgcmVzdWx0LmFwcGVuZChmKTsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgJnJlc3VsdCwgZmFsc2UsIHRydWUpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOworICBzdHJpbmcgc2VydmljZU5hbWUocHVibGljaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSk7CisgIHN0cmluZyBpbnRlcmZhY2VOYW1lID0gc2VydmljZU5hbWU7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBzaXplX3QgaW5kZXggPSBleHRlbmRzLnJmaW5kKCIuIik7CisKKyAgICBpZiAoaW5kZXggIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBleHRlbmRzX2lmID0gIlxuIiArIGluZGVudCgpICsgIiAgIiArIGV4dGVuZHMuc3Vic3RyKDAsIGluZGV4ICsgMSkKKyAgICAgICAgICAgICAgICAgICArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKSArICJcbiI7CisgICAgfSBlbHNlIHsKKyAgICAgIGV4dGVuZHNfaWYgPSAiXG4iICsgaW5kZW50KCkgKyBwdWJsaWNpemUoZXh0ZW5kcykgKyAiXG4iOworICAgIH0KKyAgfQorCisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ0eXBlICIgPDwgaW50ZXJmYWNlTmFtZSA8PCAiIGludGVyZmFjZSB7IiA8PCBleHRlbmRzX2lmOworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfdHlwZXNfLCB0c2VydmljZSk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKworICBpZiAoIWZ1bmN0aW9ucy5lbXB0eSgpKSB7CisgICAgZl90eXBlc18gPDwgZW5kbDsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfdHlwZXNfLCAoKmZfaXRlcikpOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2lmKCpmX2l0ZXIsICIiLCB0cnVlKSA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2ZpZWxkID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnRfbmV3ID0gIiI7CisgIHN0cmluZyBzZXJ2aWNlTmFtZShwdWJsaWNpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIHNpemVfdCBpbmRleCA9IGV4dGVuZHMucmZpbmQoIi4iKTsKKworICAgIGlmIChpbmRleCAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcy5zdWJzdHIoMCwgaW5kZXggKyAxKSArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKQorICAgICAgICAgICAgICAgICAgICAgICArICJDbGllbnQiOworICAgICAgZXh0ZW5kc19jbGllbnRfbmV3ID0gZXh0ZW5kcy5zdWJzdHIoMCwgaW5kZXggKyAxKSArICJOZXciCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKSArICJDbGllbnQiOworICAgIH0gZWxzZSB7CisgICAgICBleHRlbmRzX2NsaWVudCA9IHB1YmxpY2l6ZShleHRlbmRzKSArICJDbGllbnQiOworICAgICAgZXh0ZW5kc19jbGllbnRfbmV3ID0gIk5ldyIgKyBleHRlbmRzX2NsaWVudDsKKyAgICB9CisgIH0KKworICBleHRlbmRzX2ZpZWxkID0gZXh0ZW5kc19jbGllbnQuc3Vic3RyKGV4dGVuZHNfY2xpZW50LmZpbmQoIi4iKSArIDEpOworCisgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3R5cGVzXywgdHNlcnZpY2UpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQgc3RydWN0IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICghZXh0ZW5kc19jbGllbnQuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIqIiA8PCBleHRlbmRzX2NsaWVudCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJjIHRocmlmdC5UQ2xpZW50IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBMZWdhY3kgY29uc3RydWN0b3IgZnVuY3Rpb24KKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImZ1bmMgTmV3IiA8PCBzZXJ2aWNlTmFtZQorICAgICAgICAgICAgIDw8ICJDbGllbnRGYWN0b3J5KHQgdGhyaWZ0LlRUcmFuc3BvcnQsIGYgdGhyaWZ0LlRQcm90b2NvbEZhY3RvcnkpICoiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgICAgICAgPDwgIkNsaWVudCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiAmIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50IjsKKworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8ICJ7IiA8PCBleHRlbmRzX2ZpZWxkIDw8ICI6ICIgPDwgZXh0ZW5kc19jbGllbnRfbmV3IDw8ICJGYWN0b3J5KHQsIGYpfSI7CisgIH0gZWxzZSB7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl90eXBlc18gPDwgInsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImM6IHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQoZi5HZXRQcm90b2NvbCh0KSwgZi5HZXRQcm90b2NvbCh0KSksIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAvLyBMZWdhY3kgY29uc3RydWN0b3IgZnVuY3Rpb24gd2l0aCBjdXN0b20gaW5wdXQgJiBvdXRwdXQgcHJvdG9jb2xzCisgIGZfdHlwZXNfCisgICAgICA8PCBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHNlcnZpY2VOYW1lCisgICAgICA8PCAiQ2xpZW50UHJvdG9jb2wodCB0aHJpZnQuVFRyYW5zcG9ydCwgaXByb3QgdGhyaWZ0LlRQcm90b2NvbCwgb3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgKiIKKyAgICAgIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gJiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCI7CisKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCAieyIgPDwgZXh0ZW5kc19maWVsZCA8PCAiOiAiIDw8IGV4dGVuZHNfY2xpZW50X25ldyA8PCAiUHJvdG9jb2wodCwgaXByb3QsIG9wcm90KX0iCisgICAgICAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudF91cCgpOworICAgIGZfdHlwZXNfIDw8ICJ7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJjOiB0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KGlwcm90LCBvcHJvdCksIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIENvbnN0cnVjdG9yIGZ1bmN0aW9uCisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgc2VydmljZU5hbWUKKyAgICA8PCAiQ2xpZW50KGMgdGhyaWZ0LlRDbGllbnQpICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gJiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgZXh0ZW5kc19maWVsZCA8PCAiOiAiIDw8IGV4dGVuZHNfY2xpZW50X25ldyA8PCAiKGMpLCIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiYzogYywiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCkgQ2xpZW50XygpIHRocmlmdC5UQ2xpZW50IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiBwLmMiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBzdHJpbmcgZnVubmFtZSA9IHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoZl90eXBlc18sICgqZl9pdGVyKSk7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCkgIgorICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2lmKCpmX2l0ZXIsICIiLCB0cnVlKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdGQ6OnN0cmluZyBtZXRob2QgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgYXJnc1R5cGUgPSBwdWJsaWNpemUobWV0aG9kICsgIl9hcmdzIiwgdHJ1ZSk7CisgICAgc3RkOjpzdHJpbmcgYXJnc05hbWUgPSB0bXAoIl9hcmdzIik7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInZhciAiIDw8IGFyZ3NOYW1lIDw8ICIgIiA8PCBhcmdzVHlwZSA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8IGFyZ3NOYW1lIDw8ICIuIiA8PCBwdWJsaWNpemUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICA8PCAiID0gIiA8PCB2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBzdGQ6OnN0cmluZyByZXN1bHROYW1lID0gdG1wKCJfcmVzdWx0Iik7CisgICAgICBzdGQ6OnN0cmluZyByZXN1bHRUeXBlID0gcHVibGljaXplKG1ldGhvZCArICJfcmVzdWx0IiwgdHJ1ZSk7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidmFyICIgPDwgcmVzdWx0TmFtZSA8PCAiICIgPDwgcmVzdWx0VHlwZSA8PCBlbmRsOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGVyciA9IHAuQ2xpZW50XygpLkNhbGwoY3R4LCBcIiIKKyAgICAgICAgPDwgbWV0aG9kIDw8ICJcIiwgJiIgPDwgYXJnc05hbWUgPDwgIiwgJiIgPDwgcmVzdWx0TmFtZSA8PCAiKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAgICAgaWYgKCF4Y2VwdGlvbnMuZW1wdHkoKSkgeworICAgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIHsiIDw8IGVuZGw7CisKKyAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBwdWJuYW1lID0gcHVibGljaXplKCgqeF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGQgPSByZXN1bHROYW1lICsgIi4iICsgcHVibmFtZTsKKworICAgICAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgZmllbGQgPDwgIiE9IG5pbDoiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHIsICIgPDwgZmllbGQgPDwgZW5kbDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiAiPDwgZmllbGQgPDwgZW5kbDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICB9CisKKyAgICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgcmVzdWx0TmFtZSA8PCAiLkdldFN1Y2Nlc3MoKSwgbmlsIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiBuaWwiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRPRE86IHdvdWxkIGJlIG5pY2UgdG8gbm90IHRvIGR1cGxpY2F0ZSB0aGUgY2FsbCBnZW5lcmF0aW9uCisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IHAuQ2xpZW50XygpLkNhbGwoY3R4LCBcIiIKKyAgICAgIDw8IG1ldGhvZCA8PCAiXCIsICYiPDwgYXJnc05hbWUgPDwgIiwgbmlsKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZXJyIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiBuaWwiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgY29tbWFuZCBsaW5lIHRvb2wgZm9yIG1ha2luZyByZW1vdGUgcmVxdWVzdHMKKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSByZW1vdGUgZm9yLgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdF9zZXJ2aWNlKiBwYXJlbnQgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKworICAvLyBjb2xsZWN0IGluaGVyaXRlZCBmdW5jdGlvbnMKKyAgd2hpbGUgKHBhcmVudCAhPSBOVUxMKSB7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBwX2Z1bmN0aW9ucyA9IHBhcmVudC0+Z2V0X2Z1bmN0aW9ucygpOworICAgIGZ1bmN0aW9ucy5pbnNlcnQoZnVuY3Rpb25zLmVuZCgpLCBwX2Z1bmN0aW9ucy5iZWdpbigpLCBwX2Z1bmN0aW9ucy5lbmQoKSk7CisgICAgcGFyZW50ID0gcGFyZW50LT5nZXRfZXh0ZW5kcygpOworICB9CisKKyAgLy8gVGhpcyBmaWxlIGlzIG5vdCB1c2VmdWwgaWYgdGhlcmUgYXJlIG5vIGZ1bmN0aW9uczsgZG9uJ3QgZ2VuZXJhdGUgaXQKKyAgaWYgKGZ1bmN0aW9ucy5zaXplKCkgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorCisgIHN0cmluZyBmX3JlbW90ZV9kaXIgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyB1bmRlcnNjb3JlKHNlcnZpY2VfbmFtZV8pICsgIi1yZW1vdGUiOworICBNS0RJUihmX3JlbW90ZV9kaXIuY19zdHIoKSk7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBzdHJpbmcgZl9yZW1vdGVfbmFtZSA9IGZfcmVtb3RlX2RpciArICIvIgorICAgICAgICAgICAgICAgICAgICAgICAgICsgdW5kZXJzY29yZShzZXJ2aWNlX25hbWVfKSArICItcmVtb3RlLmdvIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3JlbW90ZTsKKyAgZl9yZW1vdGUub3BlbihmX3JlbW90ZV9uYW1lLmNfc3RyKCkpOworICBzdHJpbmcgc2VydmljZV9tb2R1bGUgPSBnZXRfcmVhbF9nb19tb2R1bGUocHJvZ3JhbV8pOworICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisKKyAgd2hpbGUgKChsb2MgPSBzZXJ2aWNlX21vZHVsZS5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHNlcnZpY2VfbW9kdWxlLnJlcGxhY2UobG9jLCAxLCAxLCAnLycpOworICB9CisgIGlmICghZ2VuX3BhY2thZ2VfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgc2VydmljZV9tb2R1bGUgPSBnZW5fcGFja2FnZV9wcmVmaXhfICsgc2VydmljZV9tb2R1bGU7CisgIH0KKworICBzdHJpbmcgdW51c2VkX3Byb3RlY3Rpb247CisKKyAgc3RyaW5nIGN0eFBhY2thZ2UgPSAiY29udGV4dCI7CisKKyAgZl9yZW1vdGUgPDwgZ29fYXV0b2dlbl9jb21tZW50KCk7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJwYWNrYWdlIG1haW4iIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImltcG9ydCAoIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcIiIgPDwgY3R4UGFja2FnZSA8PCAiXCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwiZmxhZ1wiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcImZtdFwiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcIm1hdGhcIiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJuZXRcIiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJuZXQvdXJsXCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwib3NcIiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJzdHJjb252XCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwic3RyaW5nc1wiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcIiIgKyBnZW5fdGhyaWZ0X2ltcG9ydF8gKyAiXCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IHJlbmRlcl9pbmNsdWRlZF9wcm9ncmFtcyh1bnVzZWRfcHJvdGVjdGlvbik7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwiIiA8PCBzZXJ2aWNlX21vZHVsZSA8PCAiXCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCB1bnVzZWRfcHJvdGVjdGlvbjsgLy8gZmlsbGVkIGluIHJlbmRlcl9pbmNsdWRlZF9wcm9ncmFtcygpCisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmdW5jIFVzYWdlKCkgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJVc2FnZSBvZiBcIiwgb3MuQXJnc1swXSwgXCIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiWy1oIGhvc3Q6cG9ydF0gWy11IHVybF0gWy1mW3JhbWVkXV0gZnVuY3Rpb24gW2FyZzEgW2FyZzIuLi5dXTpcIikiCisgICAgICAgICAgIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZsYWcuUHJpbnREZWZhdWx0cygpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIlxcbkZ1bmN0aW9uczpcIikiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3JlbW90ZSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIiAgIiA8PCAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkgPDwgIiAiCisgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIG51bV9hcmdzID0gYXJncy5zaXplKCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3JlbW90ZSA8PCAiLCAiOworICAgICAgfQorCisgICAgICBmX3JlbW90ZSA8PCBhcmdzW2ldLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCBhcmdzW2ldLT5nZXRfbmFtZSgpOworICAgIH0KKworICAgIGZfcmVtb3RlIDw8ICIpXCIpIiA8PCBlbmRsOworICB9CisKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVycikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIG9zLkV4aXQoMCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworCisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ0eXBlIGh0dHBIZWFkZXJzIG1hcFtzdHJpbmddc3RyaW5nIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZnVuYyAoaCBodHRwSGVhZGVycykgU3RyaW5nKCkgc3RyaW5nIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHZhciBtIG1hcFtzdHJpbmddc3RyaW5nID0gaCIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZtdC5TcHJpbnRmKFwiJXNcIiwgbSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZnVuYyAoaCBodHRwSGVhZGVycykgU2V0KHZhbHVlIHN0cmluZykgZXJyb3IgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcGFydHMgOj0gc3RyaW5ncy5TcGxpdCh2YWx1ZSwgXCI6IFwiKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgbGVuKHBhcnRzKSAhPSAyIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuIGZtdC5FcnJvcmYoXCJoZWFkZXIgc2hvdWxkIGJlIG9mIGZvcm1hdCAnS2V5OiBWYWx1ZSdcIikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGhbcGFydHNbMF1dID0gcGFydHNbMV0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBuaWwiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworCisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmdW5jIG1haW4oKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuVXNhZ2UgPSBVc2FnZSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBob3N0IHN0cmluZyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBwb3J0IGludCIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBwcm90b2NvbCBzdHJpbmciIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgdXJsU3RyaW5nIHN0cmluZyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBmcmFtZWQgYm9vbCIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciB1c2VIdHRwIGJvb2wiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJoZWFkZXJzIDo9IG1ha2UoaHR0cEhlYWRlcnMpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFyIHBhcnNlZFVybCAqdXJsLlVSTCIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciB0cmFucyB0aHJpZnQuVFRyYW5zcG9ydCIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIl8gPSBzdHJjb252LkF0b2kiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJfID0gbWF0aC5BYnMiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlVzYWdlID0gVXNhZ2UiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlN0cmluZ1ZhcigmaG9zdCwgXCJoXCIsIFwibG9jYWxob3N0XCIsIFwiU3BlY2lmeSBob3N0IGFuZCBwb3J0XCIpIgorICAgICAgICAgICA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5JbnRWYXIoJnBvcnQsIFwicFwiLCA5MDkwLCBcIlNwZWNpZnkgcG9ydFwiKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuU3RyaW5nVmFyKCZwcm90b2NvbCwgXCJQXCIsIFwiYmluYXJ5XCIsIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiU3BlY2lmeSB0aGUgcHJvdG9jb2wgKGJpbmFyeSwgY29tcGFjdCwgc2ltcGxlanNvbiwganNvbilcIikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlN0cmluZ1ZhcigmdXJsU3RyaW5nLCBcInVcIiwgXCJcIiwgXCJTcGVjaWZ5IHRoZSB1cmxcIikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLkJvb2xWYXIoJmZyYW1lZCwgXCJmcmFtZWRcIiwgZmFsc2UsIFwiVXNlIGZyYW1lZCB0cmFuc3BvcnRcIikiCisgICAgICAgICAgIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLkJvb2xWYXIoJnVzZUh0dHAsIFwiaHR0cFwiLCBmYWxzZSwgXCJVc2UgaHR0cFwiKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuVmFyKGhlYWRlcnMsIFwiSFwiLCBcIkhlYWRlcnMgdG8gc2V0IG9uIHRoZSBodHRwKHMpIHJlcXVlc3QgKGUuZy4gLUggXFxcIktleTogVmFsdWVcXFwiKVwiKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuUGFyc2UoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmIGxlbih1cmxTdHJpbmcpID4gMCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB2YXIgZXJyIGVycm9yIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBwYXJzZWRVcmwsIGVyciA9IHVybC5QYXJzZSh1cmxTdHJpbmcpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJFcnJvciBwYXJzaW5nIFVSTDogXCIsIGVycikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgZmxhZy5Vc2FnZSgpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBob3N0ID0gcGFyc2VkVXJsLkhvc3QiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHVzZUh0dHAgPSBsZW4ocGFyc2VkVXJsLlNjaGVtZSkgPD0gMCB8fCBwYXJzZWRVcmwuU2NoZW1lID09IFwiaHR0cFwiIHx8IHBhcnNlZFVybC5TY2hlbWUgPT0gXCJodHRwc1wiIgorICAgICAgICAgICA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIGlmIHVzZUh0dHAgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgXywgZXJyIDo9IHVybC5QYXJzZShmbXQuU3ByaW50KFwiaHR0cDovL1wiLCBob3N0LCBcIjpcIiwgcG9ydCkpIgorICAgICAgICAgICA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJFcnJvciBwYXJzaW5nIFVSTDogXCIsIGVycikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgZmxhZy5Vc2FnZSgpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNtZCA6PSBmbGFnLkFyZygwKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBlcnIgZXJyb3IiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiB1c2VIdHRwIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VEh0dHBDbGllbnQocGFyc2VkVXJsLlN0cmluZygpKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgbGVuKGhlYWRlcnMpID4gMCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGh0dHB0cmFucyA6PSB0cmFucy4oKnRocmlmdC5USHR0cENsaWVudCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgZm9yIGtleSwgdmFsdWUgOj0gcmFuZ2UgaGVhZGVycyB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgaHR0cHRyYW5zLlNldEhlYWRlcihrZXksIHZhbHVlKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHBvcnRTdHIgOj0gZm10LlNwcmludChwb3J0KSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgc3RyaW5ncy5Db250YWlucyhob3N0LCBcIjpcIikgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgIGhvc3QsIHBvcnRTdHIsIGVyciA9IG5ldC5TcGxpdEhvc3RQb3J0KGhvc3QpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcImVycm9yIHdpdGggaG9zdDpcIiwgZXJyKSIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgb3MuRXhpdCgxKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgIH0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VFNvY2tldChuZXQuSm9pbkhvc3RQb3J0KGhvc3QsIHBvcnRTdHIpKSIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiZXJyb3IgcmVzb2x2aW5nIGFkZHJlc3M6XCIsIGVycikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgb3MuRXhpdCgxKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgZnJhbWVkIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgdHJhbnMgPSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydCh0cmFucykiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIkVycm9yIGNyZWF0aW5nIHRyYW5zcG9ydFwiLCBlcnIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBvcy5FeGl0KDEpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImRlZmVyIHRyYW5zLkNsb3NlKCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgcHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIHByb3RvY29sIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjYXNlIFwiY29tcGFjdFwiOiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY2FzZSBcInNpbXBsZWpzb25cIjoiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSgpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBicmVhayIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNhc2UgXCJqc29uXCI6IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjYXNlIFwiYmluYXJ5XCIsIFwiXCI6IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJJbnZhbGlkIHByb3RvY29sIHNwZWNpZmllZDogXCIsIHByb3RvY29sKSIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgb3MuRXhpdCgxKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpcHJvdCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAib3Byb3QgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNsaWVudCA6PSAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi5OZXciIDw8IHB1YmxpY2l6ZShzZXJ2aWNlX25hbWVfKQorICAgICAgICAgICA8PCAiQ2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQoaXByb3QsIG9wcm90KSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gdHJhbnMuT3BlbigpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiRXJyb3Igb3BlbmluZyBzb2NrZXQgdG8gXCIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImhvc3QsIFwiOlwiLCBwb3J0LCBcIiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgb3MuRXhpdCgxKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggY21kIHsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIG51bV9hcmdzID0gYXJncy5zaXplKCk7CisgICAgc3RyaW5nIGZ1bmNOYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgc3RyaW5nIHB1Yk5hbWUocHVibGljaXplKGZ1bmNOYW1lKSk7CisgICAgc3RyaW5nIGFyZ3VtZW50c05hbWUocHVibGljaXplKGZ1bmNOYW1lICsgIl9hcmdzIiwgdHJ1ZSkpOworICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjYXNlIFwiIiA8PCBlc2NhcGVfc3RyaW5nKGZ1bmNOYW1lKSA8PCAiXCI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiBmbGFnLk5BcmcoKSAtIDEgIT0gIiA8PCBudW1fYXJncyA8PCAiIHsiIDw8IGVuZGw7CisgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCIiIDw8IGVzY2FwZV9zdHJpbmcocHViTmFtZSkgPDwgIiByZXF1aXJlcyAiCisgICAgICAgICAgICAgPDwgbnVtX2FyZ3MgPDwgIiBhcmdzXCIpIiA8PCBlbmRsOworICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZsYWcuVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIGZvciAoc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7CisgICAgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBmbGFnQXJnID0gaSArIDE7CisgICAgICB0X3R5cGUqIHRoZV90eXBlKGFyZ3NbaV0tPmdldF90eXBlKCkpOworICAgICAgdF90eXBlKiB0aGVfdHlwZTIoZ2V0X3RydWVfdHlwZSh0aGVfdHlwZSkpOworCisgICAgICBpZiAodGhlX3R5cGUyLT5pc19lbnVtKCkpIHsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInRtcCIgPDwgaSA8PCAiLCBlcnIgOj0gKHN0cmNvbnYuQXRvaShmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikpKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi4iCisgICAgICAgICAgICAgICAgIDw8IHB1YmxpY2l6ZSh0aGVfdHlwZS0+Z2V0X25hbWUoKSkgPDwgIih0bXAiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKHRoZV90eXBlMi0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSBlID0gKCh0X2Jhc2VfdHlwZSopdGhlX3R5cGUyKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgc3RyaW5nIGVycih0bXAoImVyciIpKTsKKworICAgICAgICBzd2l0Y2ggKGUpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIGlmICh0aGVfdHlwZTItPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBbXWJ5dGUoZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpKSIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSA9PSBcInRydWVcIiIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInRtcCIgPDwgaSA8PCAiLCAiIDw8IGVyciA8PCAiIDo9IChzdHJjb252LkF0b2koZmxhZy5BcmcoIgorICAgICAgICAgICAgICAgICAgIDw8IGZsYWdBcmcgPDwgIikpKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBpbnQ4KHRtcCIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidG1wIiA8PCBpIDw8ICIsICIgPDwgZXJyIDw8ICIgOj0gKHN0cmNvbnYuQXRvaShmbGFnLkFyZygiCisgICAgICAgICAgICAgICAgICAgPDwgZmxhZ0FyZyA8PCAiKSkpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGludDE2KHRtcCIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidG1wIiA8PCBpIDw8ICIsICIgPDwgZXJyIDw8ICIgOj0gKHN0cmNvbnYuQXRvaShmbGFnLkFyZygiCisgICAgICAgICAgICAgICAgICAgPDwgZmxhZ0FyZyA8PCAiKSkpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGludDMyKHRtcCIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiwgIiA8PCBlcnIKKyAgICAgICAgICAgICAgICAgICA8PCAiIDo9IChzdHJjb252LlBhcnNlSW50KGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSwgMTAsIDY0KSkiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIsICIgPDwgZXJyCisgICAgICAgICAgICAgICAgICAgPDwgIiA6PSAoc3RyY29udi5QYXJzZUZsb2F0KGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSwgNjQpKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93KCJJbnZhbGlkIGJhc2UgdHlwZSBpbiBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZl9yZW1vdGUgPDwgcHVibGljaXplKGFyZ3NbaV0tPmdldF9uYW1lKCkpIDw8ICIoc3RyY29udi5BdG9pKGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PAorICAgICAgICAvLyAiKSkpIjsKKyAgICAgIH0gZWxzZSBpZiAodGhlX3R5cGUyLT5pc19zdHJ1Y3QoKSkgeworICAgICAgICBzdHJpbmcgYXJnKHRtcCgiYXJnIikpOworICAgICAgICBzdHJpbmcgbWJUcmFucyh0bXAoIm1iVHJhbnMiKSk7CisgICAgICAgIHN0cmluZyBlcnIxKHRtcCgiZXJyIikpOworICAgICAgICBzdHJpbmcgZmFjdG9yeSh0bXAoImZhY3RvcnkiKSk7CisgICAgICAgIHN0cmluZyBqc1Byb3QodG1wKCJqc1Byb3QiKSk7CisgICAgICAgIHN0cmluZyBlcnIyKHRtcCgiZXJyIikpOworICAgICAgICBzdGQ6OnN0cmluZyB0c3RydWN0X25hbWUocHVibGljaXplKHRoZV90eXBlLT5nZXRfbmFtZSgpKSk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRzdHJ1Y3RfbW9kdWxlKCBtb2R1bGVfbmFtZSh0aGVfdHlwZSkpOworICAgICAgICBpZih0c3RydWN0X21vZHVsZS5lbXB0eSgpKSB7CisgICAgICAgICAgdHN0cnVjdF9tb2R1bGUgPSBwYWNrYWdlX25hbWVfOworICAgICAgICB9CisKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgYXJnIDw8ICIgOj0gZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBtYlRyYW5zIDw8ICIgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXJMZW4obGVuKCIgPDwgYXJnIDw8ICIpKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImRlZmVyICIgPDwgbWJUcmFucyA8PCAiLkNsb3NlKCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJfLCAiIDw8IGVycjEgPDwgIiA6PSAiIDw8IG1iVHJhbnMgPDwgIi5Xcml0ZVN0cmluZygiIDw8IGFyZyA8PCAiKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyMSA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBmYWN0b3J5IDw8ICIgOj0gdGhyaWZ0Lk5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGpzUHJvdCA8PCAiIDo9ICIgPDwgZmFjdG9yeSA8PCAiLkdldFByb3RvY29sKCIgPDwgbWJUcmFucyA8PCAiKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gIiA8PCB0c3RydWN0X21vZHVsZSA8PCAiLk5ldyIgPDwgdHN0cnVjdF9uYW1lCisgICAgICAgICAgICAgICAgIDw8ICIoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZXJyMiA8PCAiIDo9IGFyZ3ZhbHVlIiA8PCBpIDw8ICIuIiA8PCByZWFkX21ldGhvZF9uYW1lXyA8PCAgIigiIDw8IGpzUHJvdCA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyMiA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfSBlbHNlIGlmICh0aGVfdHlwZTItPmlzX2NvbnRhaW5lcigpIHx8IHRoZV90eXBlMi0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBzdHJpbmcgYXJnKHRtcCgiYXJnIikpOworICAgICAgICBzdHJpbmcgbWJUcmFucyh0bXAoIm1iVHJhbnMiKSk7CisgICAgICAgIHN0cmluZyBlcnIxKHRtcCgiZXJyIikpOworICAgICAgICBzdHJpbmcgZmFjdG9yeSh0bXAoImZhY3RvcnkiKSk7CisgICAgICAgIHN0cmluZyBqc1Byb3QodG1wKCJqc1Byb3QiKSk7CisgICAgICAgIHN0cmluZyBlcnIyKHRtcCgiZXJyIikpOworICAgICAgICBzdGQ6OnN0cmluZyBhcmdOYW1lKHB1YmxpY2l6ZShhcmdzW2ldLT5nZXRfbmFtZSgpKSk7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGFyZyA8PCAiIDo9IGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgbWJUcmFucyA8PCAiIDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyTGVuKGxlbigiIDw8IGFyZyA8PCAiKSkiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJkZWZlciAiIDw8IG1iVHJhbnMgPDwgIi5DbG9zZSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiXywgIiA8PCBlcnIxIDw8ICIgOj0gIiA8PCBtYlRyYW5zIDw8ICIuV3JpdGVTdHJpbmcoIiA8PCBhcmcgPDwgIikiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVycjEgPDwgIiAhPSBuaWwgeyAiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGZhY3RvcnkgPDwgIiA6PSB0aHJpZnQuTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwganNQcm90IDw8ICIgOj0gIiA8PCBmYWN0b3J5IDw8ICIuR2V0UHJvdG9jb2woIiA8PCBtYlRyYW5zIDw8ICIpIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY29udGFpbmVyU3RydWN0IiA8PCBpIDw8ICIgOj0gIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuTmV3IgorICAgICAgICAgICAgICAgICA8PCBhcmd1bWVudHNOYW1lIDw8ICIoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZXJyMiA8PCAiIDo9IGNvbnRhaW5lclN0cnVjdCIgPDwgaSA8PCAiLlJlYWRGaWVsZCIgPDwgKGkgKyAxKSA8PCAiKCIKKyAgICAgICAgICAgICAgICAgPDwganNQcm90IDw8ICIpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGNvbnRhaW5lclN0cnVjdCIgPDwgaSA8PCAiLiIgPDwgYXJnTmFtZQorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3coIkludmFsaWQgYXJndW1lbnQgdHlwZSBpbiBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSIpOworICAgICAgfQorCisgICAgICBpZiAodGhlX3R5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyB0eXBlZGVmX21vZHVsZSggbW9kdWxlX25hbWUodGhlX3R5cGUpKTsKKyAgICAgICAgaWYodHlwZWRlZl9tb2R1bGUuZW1wdHkoKSkgeworICAgICAgICAgIHR5cGVkZWZfbW9kdWxlID0gcGFja2FnZV9uYW1lXzsKKyAgICAgICAgfQorICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFsdWUiIDw8IGkgPDwgIiA6PSAiIDw8IHR5cGVkZWZfbW9kdWxlIDw8ICIuIgorICAgICAgICAgICAgICAgICA8PCBwdWJsaWNpemUodGhlX3R5cGUtPmdldF9uYW1lKCkpIDw8ICIoYXJndmFsdWUiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFsdWUiIDw8IGkgPDwgIiA6PSBhcmd2YWx1ZSIgPDwgaSA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbXQuUHJpbnQoY2xpZW50LiIgPDwgcHViTmFtZSA8PCAiKCI7CisgICAgYm9vbCBhcmdGaXJzdCA9IHRydWU7CisKKyAgICBmX3JlbW90ZSA8PCAiY29udGV4dC5CYWNrZ3JvdW5kKCkiOworICAgIGZvciAoc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7CisgICAgICBpZiAoYXJnRmlyc3QpIHsKKyAgICAgICAgYXJnRmlyc3QgPSBmYWxzZTsKKyAgICAgICAgZl9yZW1vdGUgPDwgIiwgIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfcmVtb3RlIDw8ICIsICI7CisgICAgICB9CisKKyAgICAgIGlmIChhcmdzW2ldLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKKyAgICAgICAgZl9yZW1vdGUgPDwgInZhbHVlIiA8PCBpOworICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLT5nZXRfdHlwZSgpLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIGUgPSAoKHRfYmFzZV90eXBlKikoYXJnc1tpXS0+Z2V0X3R5cGUoKSkpLT5nZXRfYmFzZSgpOworCisgICAgICAgIHN3aXRjaCAoZSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgZl9yZW1vdGUgPDwgInZhbHVlIiA8PCBpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3coIkludmFsaWQgYmFzZSB0eXBlIGluIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBmX3JlbW90ZSA8PCBwdWJsaWNpemUoYXJnc1tpXS0+Z2V0X25hbWUoKSkgPDwgIihzdHJjb252LkF0b2koZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8CisgICAgICAgIC8vICIpKSkiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9yZW1vdGUgPDwgInZhbHVlIiA8PCBpOworICAgICAgfQorICAgIH0KKworICAgIGZfcmVtb3RlIDw8ICIpKSIgPDwgZW5kbDsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZm10LlByaW50KFwiXFxuXCIpIiA8PCBlbmRsOworICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJicmVhayIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNhc2UgXCJcIjoiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiSW52YWxpZCBmdW5jdGlvbiBcIiwgY21kKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKKyAgZl9yZW1vdGUuY2xvc2UoKTsKKyAgZm9ybWF0X2dvX291dHB1dChmX3JlbW90ZV9uYW1lKTsKKyNpZm5kZWYgX01TQ19WRVIKKyAgLy8gTWFrZSBmaWxlIGV4ZWN1dGFibGUsIGxvdmUgdGhhdCBiaXR3aXNlIE9SIGFjdGlvbgorICBjaG1vZChmX3JlbW90ZV9uYW1lLmNfc3RyKCksCisgICAgICAgIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JWFVTUgorI2lmbmRlZiBfV0lOMzIKKyAgICAgICAgfCBTX0lSR1JQIHwgU19JWEdSUCB8IFNfSVJPVEggfCBTX0lYT1RICisjZW5kaWYKKyAgICAgICAgKTsKKyNlbmRpZgorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3Nvcl9uZXcgPSAiIjsKKyAgc3RyaW5nIHNlcnZpY2VOYW1lKHB1YmxpY2l6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkpOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgc2l6ZV90IGluZGV4ID0gZXh0ZW5kcy5yZmluZCgiLiIpOworCisgICAgaWYgKGluZGV4ICE9IHN0cmluZzo6bnBvcykgeworICAgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzLnN1YnN0cigwLCBpbmRleCArIDEpICsgcHVibGljaXplKGV4dGVuZHMuc3Vic3RyKGluZGV4ICsgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlByb2Nlc3NvciI7CisgICAgICBleHRlbmRzX3Byb2Nlc3Nvcl9uZXcgPSBleHRlbmRzLnN1YnN0cigwLCBpbmRleCArIDEpICsgIk5ldyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHVibGljaXplKGV4dGVuZHMuc3Vic3RyKGluZGV4ICsgMSkpICsgIlByb2Nlc3NvciI7CisgICAgfSBlbHNlIHsKKyAgICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gcHVibGljaXplKGV4dGVuZHMpICsgIlByb2Nlc3NvciI7CisgICAgICBleHRlbmRzX3Byb2Nlc3Nvcl9uZXcgPSAiTmV3IiArIGV4dGVuZHNfcHJvY2Vzc29yOworICAgIH0KKyAgfQorCisgIHN0cmluZyBwU2VydmljZU5hbWUocHJpdmF0aXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSk7CisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBzdHJpbmcgc2VsZih0bXAoInNlbGYiKSk7CisKKyAgaWYgKGV4dGVuZHNfcHJvY2Vzc29yLmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3Igc3RydWN0IHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcHJvY2Vzc29yTWFwIG1hcFtzdHJpbmdddGhyaWZ0LlRQcm9jZXNzb3JGdW5jdGlvbiIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBoYW5kbGVyICIgPDwgc2VydmljZU5hbWUgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yKSBBZGRUb1Byb2Nlc3Nvck1hcChrZXkgc3RyaW5nLCBwcm9jZXNzb3IgdGhyaWZ0LlRQcm9jZXNzb3JGdW5jdGlvbikgeyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcC5wcm9jZXNzb3JNYXBba2V5XSA9IHByb2Nlc3NvciIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yKSBHZXRQcm9jZXNzb3JGdW5jdGlvbihrZXkgc3RyaW5nKSAiCisgICAgICAgICAgICAgICAgICAiKHByb2Nlc3NvciB0aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uLCBvayBib29sKSB7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHByb2Nlc3Nvciwgb2sgPSBwLnByb2Nlc3Nvck1hcFtrZXldIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBwcm9jZXNzb3IsIG9rIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUKKyAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3IpIFByb2Nlc3Nvck1hcCgpIG1hcFtzdHJpbmdddGhyaWZ0LlRQcm9jZXNzb3JGdW5jdGlvbiB7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBwLnByb2Nlc3Nvck1hcCIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcihoYW5kbGVyICIgPDwgc2VydmljZU5hbWUKKyAgICAgICAgICAgICAgIDw8ICIpICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IgeyIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfdHlwZXNfCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICIgPDwgc2VsZiA8PCAiIDo9ICYiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgIDw8ICJQcm9jZXNzb3J7aGFuZGxlcjpoYW5kbGVyLCBwcm9jZXNzb3JNYXA6bWFrZShtYXBbc3RyaW5nXXRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24pfSIKKyAgICAgICAgPDwgZW5kbDsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBzdHJpbmcgZXNjYXBlZEZ1bmNOYW1lKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSk7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHNlbGYgPDwgIi5wcm9jZXNzb3JNYXBbXCIiIDw8IGVzY2FwZWRGdW5jTmFtZSA8PCAiXCJdID0gJiIKKyAgICAgICAgICAgICAgICAgPDwgcFNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IiIDw8IHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgIDw8ICJ7aGFuZGxlcjpoYW5kbGVyfSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBzdHJpbmcgeCh0bXAoIngiKSk7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IHNlbGYgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yKSBQcm9jZXNzKGN0eCBjb250ZXh0LkNvbnRleHQsIGlwcm90LCBvcHJvdCB0aHJpZnQuVFByb3RvY29sKSAoc3VjY2VzcyBib29sLCBlcnIgIgorICAgICAgICAgICAgICAgICAgInRocmlmdC5URXhjZXB0aW9uKSB7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG5hbWUsIF8sIHNlcUlkLCBlcnIgOj0gaXByb3QuUmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyByZXR1cm4gZmFsc2UsIGVyciB9IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGlmIHByb2Nlc3Nvciwgb2sgOj0gcC5HZXRQcm9jZXNzb3JGdW5jdGlvbihuYW1lKTsgb2sgeyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBwcm9jZXNzb3IuUHJvY2VzcyhjdHgsIHNlcUlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgaXByb3QuU2tpcCh0aHJpZnQuU1RSVUNUKSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdC5SZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgeAorICAgICAgICAgICAgICAgPDwgIiA6PSB0aHJpZnQuTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHRocmlmdC5VTktOT1dOX01FVEhPRCwgXCJVbmtub3duIGZ1bmN0aW9uICIKKyAgICAgICAgICAgICAgICAgICJcIiArIG5hbWUpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHRocmlmdC5FWENFUFRJT04sIHNlcUlkKSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHggPDwgIi5Xcml0ZShvcHJvdCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuRmx1c2goY3R4KSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2UsICIgPDwgeCA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3Igc3RydWN0IHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgKiIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcihoYW5kbGVyICIgPDwgc2VydmljZU5hbWUKKyAgICAgICAgICAgICAgIDw8ICIpICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IgeyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHNlbGYgPDwgIiA6PSAmIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yeyIKKyAgICAgICAgICAgICAgIDw8IGV4dGVuZHNfcHJvY2Vzc29yX25ldyA8PCAiKGhhbmRsZXIpfSIgPDwgZW5kbDsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBzdHJpbmcgZXNjYXBlZEZ1bmNOYW1lKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSk7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHNlbGYgPDwgIi5BZGRUb1Byb2Nlc3Nvck1hcChcIiIgPDwgZXNjYXBlZEZ1bmNOYW1lCisgICAgICAgICAgICAgICAgIDw8ICJcIiwgJiIgPDwgcFNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IiIDw8IHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgIDw8ICJ7aGFuZGxlcjpoYW5kbGVyfSkiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgc2VsZiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGZfdHlwZXNfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBzdHJpbmcgcHJvY2Vzc29yTmFtZSA9IHByaXZhdGl6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgKyAiUHJvY2Vzc29yIgorICAgICAgICAgICAgICAgICAgICAgICAgICsgcHVibGljaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisgIHN0cmluZyBhcmdzbmFtZSA9IHB1YmxpY2l6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiLCB0cnVlKTsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBwdWJsaWNpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiLCB0cnVlKTsKKworICAvLyB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgLy8gY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBwcm9jZXNzb3JOYW1lIDw8ICIgc3RydWN0IHsiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGhhbmRsZXIgIiA8PCBwdWJsaWNpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHByb2Nlc3Nvck5hbWUKKyAgICAgICAgICAgICA8PCAiKSBQcm9jZXNzKGN0eCBjb250ZXh0LkNvbnRleHQsIHNlcUlkIGludDMyLCBpcHJvdCwgb3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgKHN1Y2Nlc3MgYm9vbCwgZXJyICIKKyAgICAgICAgICAgICAgICAidGhyaWZ0LlRFeGNlcHRpb24pIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiYXJncyA6PSAiIDw8IGFyZ3NuYW1lIDw8ICJ7fSIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGVyciA9IGFyZ3MuIiA8PCByZWFkX21ldGhvZF9uYW1lXyA8PCAgIihpcHJvdCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgaXByb3QuUmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIgIHggOj0gdGhyaWZ0Lk5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0aHJpZnQuUFJPVE9DT0xfRVJST1IsIGVyci5FcnJvcigpKSIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IGVzY2FwZV9zdHJpbmcodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgPDwgIlwiLCB0aHJpZnQuRVhDRVBUSU9OLCBzZXFJZCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgeC5Xcml0ZShvcHJvdCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuRmx1c2goY3R4KSIgPDwgZW5kbDsKKyAgfQorICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2UsIGVyciIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlwcm90LlJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA6PSAiIDw8IHJlc3VsdG5hbWUgPDwgInt9IiA8PCBlbmRsOworICB9CisgIGJvb2wgbmVlZF9yZWZlcmVuY2UgPSB0eXBlX25lZWRfcmVmZXJlbmNlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBmX3R5cGVzXyA8PCAidmFyIHJldHZhbCAiIDw8IHR5cGVfdG9fZ29fdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpIDw8IGVuZGw7CisgIH0KKworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidmFyIGVycjIgZXJyb3IiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiAiOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGZfdHlwZXNfIDw8ICJyZXR2YWwsICI7CisgICAgfQorICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmX3R5cGVzXyA8PCAiZXJyMiA9IHAuaGFuZGxlci4iIDw8IHB1YmxpY2l6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgZl90eXBlc18gPDwgImN0eCI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgZl90eXBlc18gPDwgIiwgIjsKKyAgICB9IGVsc2UgeworICAgICAgZl90eXBlc18gPDwgIiwgIjsKKyAgICB9CisKKyAgICBmX3R5cGVzXyA8PCAiYXJncy4iIDw8IHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICB9CisKKyAgZl90eXBlc18gPDwgIik7IGVycjIgIT0gbmlsIHsiIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeF9maWVsZHMgPSBleGNlcHRpb25zLT5nZXRfbWVtYmVycygpOworICBpZiAoIXhfZmllbGRzLmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIHYgOj0gZXJyMi4odHlwZSkgeyIgPDwgZW5kbDsKKworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhmX2l0ZXI7CisKKyAgICBmb3IgKHhmX2l0ZXIgPSB4X2ZpZWxkcy5iZWdpbigpOyB4Zl9pdGVyICE9IHhfZmllbGRzLmVuZCgpOyArK3hmX2l0ZXIpIHsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGNhc2UgIiA8PCB0eXBlX3RvX2dvX3R5cGUoKCgqeGZfaXRlciktPmdldF90eXBlKCkpKSA8PCAiOiIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCBwdWJsaWNpemUoKCp4Zl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9IHYiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgZGVmYXVsdDoiIDw8IGVuZGw7CisgIH0KKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICB4IDo9IHRocmlmdC5OZXdUQXBwbGljYXRpb25FeGNlcHRpb24odGhyaWZ0LklOVEVSTkFMX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgZXNjYXBlX3N0cmluZyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICA8PCAiOiBcIiArIGVycjIuRXJyb3IoKSkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IGVzY2FwZV9zdHJpbmcodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgPDwgIlwiLCB0aHJpZnQuRVhDRVBUSU9OLCBzZXFJZCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgeC5Xcml0ZShvcHJvdCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuRmx1c2goY3R4KSIgPDwgZW5kbDsKKyAgfQorCisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlLCBlcnIyIiA8PCBlbmRsOworCisgIGlmICgheF9maWVsZHMuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iOyAvLyBjbG9zZXMgZXJyMiAhPSBuaWwKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBmX3R5cGVzXyA8PCAiIGVsc2UgeyIgPDwgZW5kbDsgLy8gbWFrZSBzdXJlIHdlIHNldCBTdWNjZXNzIHJldHZhbCBvbmx5IG9uIHN1Y2Nlc3MKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJlc3VsdC5TdWNjZXNzID0gIjsKKyAgICAgIGlmIChuZWVkX3JlZmVyZW5jZSkgeworICAgICAgICBmX3R5cGVzXyA8PCAiJiI7CisgICAgICB9CisgICAgICBmX3R5cGVzXyA8PCAicmV0dmFsIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3R5cGVzXyA8PCBlbmRsOworICAgIH0KKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyMiA9IG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKFwiIgorICAgICAgICAgICAgICAgPDwgZXNjYXBlX3N0cmluZyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICJcIiwgdGhyaWZ0LlJFUExZLCBzZXFJZCk7IGVycjIgIT0gbmlsIHsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGVyciA9IGVycjIiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGVycjIgPSByZXN1bHQuIiA8PCB3cml0ZV9tZXRob2RfbmFtZV8gPDwgIihvcHJvdCk7IGVyciA9PSBuaWwgJiYgZXJyMiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBlcnIgPSBlcnIyIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIyID0gb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IGVyciA9PSBuaWwgJiYgZXJyMiAhPSBuaWwgeyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgZXJyID0gZXJyMiIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyMiA9IG9wcm90LkZsdXNoKGN0eCk7IGVyciA9PSBuaWwgJiYgZXJyMiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBlcnIgPSBlcnIyIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZSwgZXJyIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfdHlwZXNfIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlLCBuaWwiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29lcmNlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lcl92YWx1ZSkgeworICAodm9pZClpbmNsYXNzOworICAodm9pZCljb2VyY2VEYXRhOworICB0X3R5cGUqIG9yaWdfdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShvcmlnX3R5cGUpOworICBzdHJpbmcgbmFtZShwcmVmaXggKyBwdWJsaWNpemUodGZpZWxkLT5nZXRfbmFtZSgpKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19wb2ludGVyX2ZpZWxkKHRmaWVsZCwgaW5fY29udGFpbmVyX3ZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCBvcmlnX3R5cGUsIGlzX3BvaW50ZXJfZmllbGQodGZpZWxkKSwgZGVjbGFyZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBpZiAoZGVjbGFyZSkgeworICAgICAgc3RyaW5nIHR5cGVfbmFtZSA9IGlua2V5ID8gdHlwZV90b19nb19rZXlfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0eXBlX3RvX2dvX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAgICAgb3V0IDw8ICJ2YXIgIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiAiIDw8IHR5cGVfbmFtZSA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJpZiB2LCBlcnIgOj0gaXByb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworCisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkgJiYgIWlua2V5KSB7CisgICAgICAgICAgb3V0IDw8ICJSZWFkQmluYXJ5KCkiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiUmVhZFN0cmluZygpIjsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAiUmVhZEJvb2woKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIlJlYWRCeXRlKCkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAiUmVhZEkxNigpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIlJlYWRJMzIoKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJSZWFkSTY0KCkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAiUmVhZERvdWJsZSgpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gR28gbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIlJlYWRJMzIoKSI7CisgICAgfQorCisgICAgb3V0IDw8ICI7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3IgcmVhZGluZyBmaWVsZCAiIDw8IHRmaWVsZC0+Z2V0X2tleSgpCisgICAgICAgIDw8ICI6IFwiLCBlcnIpIiA8PCBlbmRsOworCisgICAgb3V0IDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBzdHJpbmcgd3JhcDsKKworICAgIGlmICh0eXBlLT5pc19lbnVtKCkgfHwgb3JpZ190eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgIHdyYXAgPSBwdWJsaWNpemUodHlwZV9uYW1lKG9yaWdfdHlwZSkpOworICAgIH0gZWxzZSBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfSTgpIHsKKyAgICAgIHdyYXAgPSAiaW50OCI7CisgICAgfQorCisgICAgc3RyaW5nIG1heWJlX2FkZHJlc3MgPSAoaXNfcG9pbnRlcl9maWVsZCh0ZmllbGQpID8gIiYiIDogIiIpOworICAgIGlmICh3cmFwID09ICIiKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAiIDw8IG1heWJlX2FkZHJlc3MgPDwgInYiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0ZW1wIDo9ICIgPDwgd3JhcCA8PCAiKHYpIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIiA8PCBtYXliZV9hZGRyZXNzIDw8ICJ0ZW1wIiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICciICsgdHlwZS0+Z2V0X25hbWUoKSArICInIGZvciBmaWVsZCAnIgorICAgICAgICArIHRmaWVsZC0+Z2V0X25hbWUoKSArICInIjsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBjYWxsaW5nIHJlYWQoKQorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcl9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZXEoZGVjbGFyZSA/ICIgOj0gIiA6ICIgPSAiKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8IGVxIDw8IChwb2ludGVyX2ZpZWxkID8gIiYiIDogIiIpOworICBnZW5lcmF0ZV9nb19zdHJ1Y3RfaW5pdGlhbGl6ZXIob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gIiA8PCBwcmVmaXggPDwgIi4iIDw8IHJlYWRfbWV0aG9kX25hbWVfIDw8ICAiKGlwcm90KTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoXCIlVCBlcnJvciByZWFkaW5nIHN0cnVjdDogXCIsICIKKyAgICAgIDw8IHByZWZpeCA8PCAiKSwgZXJyKSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZSBhIGNvbnRhaW5lciBieSB3cml0aW5nIG91dCB0aGUgaGVhZGVyIGZvbGxvd2VkIGJ5CisgKiBkYXRhIGFuZCB0aGVuIGEgZm9vdGVyLgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogb3JpZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcl9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZShvcmlnX3R5cGUpOworICBzdHJpbmcgZXEoIiA9ICIpOworCisgIGlmIChkZWNsYXJlKSB7CisgICAgZXEgPSAiIDo9ICI7CisgIH0KKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiXywgXywgc2l6ZSwgZXJyIDo9IGlwcm90LlJlYWRNYXBCZWdpbigpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHJlYWRpbmcgbWFwIGJlZ2luOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0TWFwIDo9IG1ha2UoIiA8PCB0eXBlX3RvX2dvX3R5cGUob3JpZ190eXBlKSA8PCAiLCBzaXplKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8IGVxIDw8ICIgIiA8PCAocG9pbnRlcl9maWVsZCA/ICImIiA6ICIiKSA8PCAidE1hcCIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl8sIHNpemUsIGVyciA6PSBpcHJvdC5SZWFkU2V0QmVnaW4oKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciByZWFkaW5nIHNldCBiZWdpbjogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidFNldCA6PSBtYWtlKCIgPDwgdHlwZV90b19nb190eXBlKG9yaWdfdHlwZSkgPDwgIiwgMCwgc2l6ZSkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCBlcSA8PCAiICIgPDwgKHBvaW50ZXJfZmllbGQgPyAiJiIgOiAiIikgPDwgInRTZXQiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiXywgc2l6ZSwgZXJyIDo9IGlwcm90LlJlYWRMaXN0QmVnaW4oKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciByZWFkaW5nIGxpc3QgYmVnaW46IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRTbGljZSA6PSBtYWtlKCIgPDwgdHlwZV90b19nb190eXBlKG9yaWdfdHlwZSkgPDwgIiwgMCwgc2l6ZSkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCBlcSA8PCAiICIgPDwgKHBvaW50ZXJfZmllbGQgPyAiJiIgOiAiIikgPDwgInRTbGljZSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAnIiArIHR0eXBlLT5nZXRfbmFtZSgpICsgIicgZm9yIHByZWZpeCAnIgorICAgICAgICArIHByZWZpeCArICInIjsKKyAgfQorCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSArKyB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAocG9pbnRlcl9maWVsZCkgeworICAgIHByZWZpeCA9ICIoKiIgKyBwcmVmaXggKyAiKSI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgZGVjbGFyZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGRlY2xhcmUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBkZWNsYXJlLCBwcmVmaXgpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gaXByb3QuUmVhZE1hcEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3IgcmVhZGluZyBtYXAgZW5kOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gaXByb3QuUmVhZFNldEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3IgcmVhZGluZyBzZXQgZW5kOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IGlwcm90LlJlYWRMaXN0RW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciByZWFkaW5nIGxpc3QgZW5kOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpZGVjbGFyZTsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworICBma2V5LnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIGZ2YWwuc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSwgdHJ1ZSwgIiIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwsIHRydWUsICIiLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCBlbmRsOworfQorCisvKioKKyAqIFdyaXRlIGEgc2V0IGVsZW1lbnQKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKWRlY2xhcmU7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisgIGZlbGVtLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCB0cnVlLCAiIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gYXBwZW5kKCIgPDwgcHJlZml4IDw8ICIsICIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBXcml0ZSBhIGxpc3QgZWxlbWVudAorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpZGVjbGFyZTsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0oKCh0X2xpc3QqKXRsaXN0KS0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKyAgZmVsZW0uc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIHRydWUsICIiLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBhcHBlbmQoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCBlbGVtIDw8ICIpIiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlua2V5KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgc3RyaW5nIG5hbWUocHJlZml4ICsgcHVibGljaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGdlbmVyYXRlIHNlcmlhbGl6ZSBmb3Igdm9pZCB0eXBlOiAiICsgbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgaXNfcG9pbnRlcl9maWVsZCh0ZmllbGQpLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgZXJyIDo9IG9wcm90LiI7CisKKyAgICBpZiAoaXNfcG9pbnRlcl9maWVsZCh0ZmllbGQpKSB7CisgICAgICBuYW1lID0gIioiICsgbmFtZTsKKyAgICB9CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpICYmICFpbmtleSkgeworICAgICAgICAgIG91dCA8PCAiV3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIldyaXRlU3RyaW5nKHN0cmluZygiIDw8IG5hbWUgPDwgIikpIjsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAiV3JpdGVCb29sKGJvb2woIiA8PCBuYW1lIDw8ICIpKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIldyaXRlQnl0ZShpbnQ4KCIgPDwgbmFtZSA8PCAiKSkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAiV3JpdGVJMTYoaW50MTYoIiA8PCBuYW1lIDw8ICIpKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUkzMihpbnQzMigiIDw8IG5hbWUgPDwgIikpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIldyaXRlSTY0KGludDY0KCIgPDwgbmFtZSA8PCAiKSkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAiV3JpdGVEb3VibGUoZmxvYXQ2NCgiIDw8IG5hbWUgPDwgIikpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gR28gbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIldyaXRlSTMyKGludDMyKCIgPDwgbmFtZSA8PCAiKSkiOworICAgIH0KKworICAgIG91dCA8PCAiOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZihcIiVULiIKKyAgICAgICAgPDwgZXNjYXBlX3N0cmluZyh0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIgKCIgPDwgdGZpZWxkLT5nZXRfa2V5KCkKKyAgICAgICAgPDwgIikgZmllbGQgd3JpdGUgZXJyb3I6IFwiLCBwKSwgZXJyKSB9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogSW52YWxpZCB0eXBlIGluIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAnIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgKyAiJyBmb3IgZmllbGQgJyIgKyBuYW1lICsgIiciOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9ICIgPDwgcHJlZml4IDw8ICIuIiA8PCB3cml0ZV9tZXRob2RfbmFtZV8gPDwgIihvcHJvdCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKFwiJVQgZXJyb3Igd3JpdGluZyBzdHJ1Y3Q6IFwiLCAiCisgICAgICA8PCBwcmVmaXggPDwgIiksIGVycikiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcl9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBpZiAocG9pbnRlcl9maWVsZCkgeworICAgIHByZWZpeCA9ICIqIiArIHByZWZpeDsKKyAgfQorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVNYXBCZWdpbigiCisgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3Igd3JpdGluZyBtYXAgYmVnaW46IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZVNldEJlZ2luKCIKKyAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3Igd3JpdGluZyBzZXQgYmVnaW46IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVMaXN0QmVnaW4oIgorICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3Igd3JpdGluZyBsaXN0IGJlZ2luOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBJbnZhbGlkIHR5cGUgaW4gZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAnIiArIHR0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICsgIicgZm9yIHByZWZpeCAnIiArIHByZWZpeCArICInIjsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3IgaywgdiA6PSByYW5nZSAiIDw8IHByZWZpeCA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgdG1hcCwgImsiLCAidiIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yIGkgOj0gMDsgaTxsZW4oIiA8PCBwcmVmaXggPDwgIik7IGkrKyB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBmb3IgaiA6PSBpKzE7IGo8bGVuKCIgPDwgcHJlZml4IDw8ICIpOyBqKysgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBpZiByZWZsZWN0LkRlZXBFcXVhbCgiIDw8IHByZWZpeCA8PCAiW2ldLCIgPDwgcHJlZml4IDw8ICJbal0pIHsgIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJcIiwgZm10LkVycm9yZihcIiVUIGVycm9yIHdyaXRpbmcgc2V0IGZpZWxkOiBzbGljZSBpcyBub3QgdW5pcXVlXCIsICIgPDwgcHJlZml4IDw8ICJbaV0pKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICB9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZvciBfLCB2IDo9IHJhbmdlICIgPDwgcHJlZml4IDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCB0c2V0LCAidiIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZvciBfLCB2IDo9IHJhbmdlICIgPDwgcHJlZml4IDw8ICIgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCB0bGlzdCwgInYiKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlTWFwRW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciB3cml0aW5nIG1hcCBlbmQ6IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZVNldEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3Igd3JpdGluZyBzZXQgZW5kOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlTGlzdEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3Igd3JpdGluZyBsaXN0IGVuZDogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgIiIpOworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgIiIpOworICBrZmllbGQuc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKKyAgdmZpZWxkLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsIGtpdGVyLCB0cnVlKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgdml0ZXIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgIiIpOworICBlZmllbGQuc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgcHJlZml4KTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgIiIpOworICBlZmllbGQuc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgcHJlZml4KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnaXZlbiBzdHJ1Y3QuCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3QsICJBdHRyaWJ1dGVzIik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2l2ZW4gZnVuY3Rpb24uCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3V0LCB0ZnVuY3Rpb24sIHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIlBhcmFtZXRlcnMiKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBzdHJ1Y3Qgb3IgZnVuY3Rpb24uCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqIHRkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3ViaGVhZGVyKSB7CisgIGJvb2wgaGFzX2RvYyA9IGZhbHNlOworICBzdHJpbmdzdHJlYW0gc3M7CisKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGhhc19kb2MgPSB0cnVlOworICAgIHNzIDw8IHRkb2MtPmdldF9kb2MoKTsKKyAgfQorCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaWYgKGhhc19kb2MpIHsKKyAgICAgIHNzIDw8IGVuZGw7CisgICAgfQorCisgICAgaGFzX2RvYyA9IHRydWU7CisgICAgc3MgPDwgc3ViaGVhZGVyIDw8ICI6XG4iOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKworICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKKyAgICAgIHNzIDw8ICIgLSAiIDw8IHB1YmxpY2l6ZShwLT5nZXRfbmFtZSgpKTsKKworICAgICAgaWYgKHAtPmhhc19kb2MoKSkgeworICAgICAgICBzcyA8PCAiOiAiIDw8IHAtPmdldF9kb2MoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNzIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGhhc19kb2MpIHsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIiLCAiLy8gIiwgc3Muc3RyKCksICIiKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdlbmVyaWMgb2JqZWN0LgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiIiwgIi8vIiwgdGRvYy0+Z2V0X2RvYygpLCAiIik7CisgIH0KK30KKworLyoqCisgKiBEZWNsYXJlcyBhbiBhcmd1bWVudCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6ZGVjbGFyZV9hcmd1bWVudCh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgcmVzdWx0IDw8IHB1YmxpY2l6ZSh0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICI9IjsKKworICBpZiAodGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgcmVzdWx0IDw8ICJ0aHJpZnRfc3BlY1siIDw8IHRmaWVsZC0+Z2V0X2tleSgpIDw8ICJdWzRdIjsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPDwgIm5pbCI7CisgIH0KKworICByZXR1cm4gcmVzdWx0LnN0cigpOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBzdHJ1Y3QgZmllbGQgaW5pdGlhbCB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCwgd2hpY2ggbXVzdCBoYXZlIGB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTExgCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6cmVuZGVyX2ZpZWxkX2luaXRpYWxfdmFsdWUodF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWxfZmllbGQpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmIChvcHRpb25hbF9maWVsZCkgeworICAgIC8vIFRoZSBjYWxsZXIgd2lsbCBtYWtlIGEgc2Vjb25kIHBhc3MgZm9yIG9wdGlvbmFsIGZpZWxkcywKKyAgICAvLyBhc3NpZ25pbmcgdGhlIHJlc3VsdCBvZiByZW5kZXJfY29uc3RfdmFsdWUgdG8gIipmaWVsZF9uYW1lIi4gSXQKKyAgICAvLyBpcyBtYWRkZW5pbmcgdGhhdCBHbyBzeW50YXggZG9lcyBub3QgYWxsb3cgZm9yIGEgdHlwZS1hZ25vc3RpYworICAgIC8vIHdheSB0byBpbml0aWFsaXplIGEgcG9pbnRlciB0byBhIGNvbnN0IHZhbHVlLCBidXQgc28gaXQgZ29lcy4KKyAgICAvLyBUaGUgYWx0ZXJuYXRpdmUgd291bGQgYmUgdG8gd3JpdGUgdHlwZSBzcGVjaWZpYyBmdW5jdGlvbnMgdGhhdAorICAgIC8vIGNvbnZlcnQgZnJvbSBjb25zdCB2YWx1ZXMgdG8gcG9pbnRlciB0eXBlcywgYnV0IGdpdmVuIHRoZSBsYWNrCisgICAgLy8gb2Ygb3ZlcmxvYWRpbmcgaXQgd291bGQgYmUgbWVzc3kuCisgICAgcmV0dXJuICJuZXcoIiArIHR5cGVfdG9fZ29fdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIikiOworICB9IGVsc2UgeworICAgIHJldHVybiByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSwgbmFtZSk7CisgIH0KK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICAvLyBUT0RPKG1jc2xlZSk6IE5pdHBpY2t5LCBubyAnLCcgaWYgYXJndW1lbnRfbGlzdCBpcyBlbXB0eQorICByZXR1cm4gcHVibGljaXplKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkKKyAgICAgICAgICsgIikiOworfQorCisvKioKKyAqIFJlbmRlcnMgYW4gaW50ZXJmYWNlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9pZih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgsIGJvb2wgYWRkRXJyb3IpIHsKKyAgc3RyaW5nIHNpZ25hdHVyZSA9IHB1YmxpY2l6ZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIigiOworICBzaWduYXR1cmUgKz0gImN0eCBjb250ZXh0LkNvbnRleHQiOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpKSB7CisgICAgc2lnbmF0dXJlICs9ICIsICIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7CisgIH0KKyAgc2lnbmF0dXJlICs9ICIpICgiOworCisgIHRfdHlwZSogcmV0ID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICB0X3N0cnVjdCogZXhjZXB0aW9ucyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBzdHJpbmcgZXJycyA9IGFyZ3VtZW50X2xpc3QoZXhjZXB0aW9ucyk7CisKKyAgaWYgKCFyZXQtPmlzX3ZvaWQoKSkgeworICAgIHNpZ25hdHVyZSArPSAiciAiICsgdHlwZV90b19nb190eXBlKHJldCk7CisKKyAgICBpZiAoYWRkRXJyb3IgfHwgZXJycy5zaXplKCkgPT0gMCkgeworICAgICAgc2lnbmF0dXJlICs9ICIsICI7CisgICAgfQorICB9CisKKyAgaWYgKGFkZEVycm9yKSB7CisgICAgc2lnbmF0dXJlICs9ICJlcnIgZXJyb3IiOworICB9CisKKyAgc2lnbmF0dXJlICs9ICIpIjsKKyAgcmV0dXJuIHNpZ25hdHVyZTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgbGlzdAorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisKKyAgICByZXN1bHQgKz0gdmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiICIKKyAgICAgICAgICAgICAgKyB0eXBlX3RvX2dvX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgc3RyaW5nIG1vZHVsZSggbW9kdWxlX25hbWUodHR5cGUpKTsKKyAgaWYoICEgbW9kdWxlLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gbW9kdWxlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6bW9kdWxlX25hbWUodF90eXBlKiB0dHlwZSkgeworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICBpZiAocHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiZ28iKS5lbXB0eSgpIHx8CisgICAgICAgIHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJnbyIpLmVtcHR5KCkgfHwKKyAgICAgICAgcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiZ28iKSAhPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiZ28iKSkgeworICAgICAgc3RyaW5nIG1vZHVsZShnZXRfcmVhbF9nb19tb2R1bGUocHJvZ3JhbSkpOworICAgICAgLy8gZm9yIG5hbWVzcGFjZWQgaW5jbHVkZXMsIG9ubHkga2VlcCBwYXJ0IGFmdGVyIGRvdC4KKyAgICAgIHNpemVfdCBkb3QgPSBtb2R1bGUucmZpbmQoJy4nKTsKKyAgICAgIGlmIChkb3QgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgIG1vZHVsZSA9IG1vZHVsZS5zdWJzdHIoZG90ICsgMSk7CisgICAgICB9CisgICAgICByZXR1cm4gbW9kdWxlOworICAgIH0KKyAgfQorCisgIHJldHVybiAiIjsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIGdvIHR5b2UKKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIC8qIHRoaXMgaXMgd3JvbmcsIGJpbmFyeSBpcyBzdGlsbCBhIHN0cmluZyB0eXBlIGludGVybmFsbHkKKyAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIHJldHVybiAidGhyaWZ0LkJJTkFSWSI7CisgICAgICB9CisgICAgICAqLworICAgICAgcmV0dXJuICJ0aHJpZnQuU1RSSU5HIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAidGhyaWZ0LkJPT0wiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAidGhyaWZ0LkJZVEUiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gInRocmlmdC5JMTYiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gInRocmlmdC5JMzIiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gInRocmlmdC5JNjQiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gInRocmlmdC5ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gInRocmlmdC5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gInRocmlmdC5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJ0aHJpZnQuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAidGhyaWZ0LlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJ0aHJpZnQuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBnbyBtYXAgdHlwZSwgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgaXQgd2lsbAorICogbm90IHByb2R1Y2UgYSB2YWxpZCBnbyBtYXAgdHlwZS4KKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp0eXBlX3RvX2dvX2tleV90eXBlKHRfdHlwZSogdHlwZSkgeworICB0X3R5cGUqIHJlc29sdmVkX3R5cGUgPSB0eXBlOworCisgIHdoaWxlIChyZXNvbHZlZF90eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXNvbHZlZF90eXBlID0gKCh0X3R5cGVkZWYqKXJlc29sdmVkX3R5cGUpLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisgIH0KKworICBpZiAocmVzb2x2ZWRfdHlwZS0+aXNfbWFwKCkgfHwgcmVzb2x2ZWRfdHlwZS0+aXNfbGlzdCgpIHx8IHJlc29sdmVkX3R5cGUtPmlzX3NldCgpKSB7CisgICAgdGhyb3cgIkNhbm5vdCBwcm9kdWNlIGEgdmFsaWQgdHlwZSBmb3IgYSBHbyBtYXAga2V5OiAiICsgdHlwZV90b19nb190eXBlKHR5cGUpICsgIiAtIGFib3J0aW5nLiI7CisgIH0KKworICBpZiAocmVzb2x2ZWRfdHlwZS0+aXNfYmluYXJ5KCkpCisgICAgcmV0dXJuICJzdHJpbmciOworCisgIHJldHVybiB0eXBlX3RvX2dvX3R5cGUodHlwZSk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBnbyB0eXBlCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV90b19nb190eXBlKHRfdHlwZSogdHlwZSkgeworICByZXR1cm4gdHlwZV90b19nb190eXBlX3dpdGhfb3B0KHR5cGUsIGZhbHNlKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIGdvIHR5cGUsIHRha2luZyBpbnRvIGFjY291bnQgd2hldGhlciB0aGUgZmllbGQKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHlwZSBpcyBUX09QVElPTkFMLgorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnR5cGVfdG9fZ29fdHlwZV93aXRoX29wdCh0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsX2ZpZWxkKSB7CisgIHN0cmluZyBtYXliZV9wb2ludGVyKG9wdGlvbmFsX2ZpZWxkID8gIioiIDogIiIpOworCisgIGlmICh0eXBlLT5pc190eXBlZGVmKCkgJiYgKCh0X3R5cGVkZWYqKXR5cGUpLT5pc19mb3J3YXJkX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90cnVlX3R5cGUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgIltdYnl0ZSI7CisgICAgICB9CisKKyAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgInN0cmluZyI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJib29sIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJpbnQ4IjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiaW50MTYiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJpbnQzMiI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgImludDY0IjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiZmxvYXQ2NCI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgcHVibGljaXplKHR5cGVfbmFtZSh0eXBlKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiKiIgKyBwdWJsaWNpemUodHlwZV9uYW1lKHR5cGUpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfbWFwKiB0ID0gKHRfbWFwKil0eXBlOworICAgIHN0cmluZyBrZXlUeXBlID0gdHlwZV90b19nb19rZXlfdHlwZSh0LT5nZXRfa2V5X3R5cGUoKSk7CisgICAgc3RyaW5nIHZhbHVlVHlwZSA9IHR5cGVfdG9fZ29fdHlwZSh0LT5nZXRfdmFsX3R5cGUoKSk7CisgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyBzdHJpbmcoIm1hcFsiKSArIGtleVR5cGUgKyAiXSIgKyB2YWx1ZVR5cGU7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCogdCA9ICh0X3NldCopdHlwZTsKKyAgICBzdHJpbmcgZWxlbVR5cGUgPSB0eXBlX3RvX2dvX3R5cGUodC0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArIHN0cmluZygiW10iKSArIGVsZW1UeXBlOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCogdCA9ICh0X2xpc3QqKXR5cGU7CisgICAgc3RyaW5nIGVsZW1UeXBlID0gdHlwZV90b19nb190eXBlKHQtPmdldF9lbGVtX3R5cGUoKSk7CisgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyBzdHJpbmcoIltdIikgKyBlbGVtVHlwZTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArIHB1YmxpY2l6ZSh0eXBlX25hbWUodHlwZSkpOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2dvX3R5cGU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKiogU2VlIHRoZSBjb21tZW50IGluc2lkZSBnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbiBmb3Igd2hhdCB0aGlzIGlzLiAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp0eXBlX3RvX3NwZWNfYXJncyh0X3R5cGUqIHR0eXBlKSB7CisgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJuaWwiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiKCIgKyB0eXBlX25hbWUodHR5cGUpICsgIiwgIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiLnRocmlmdF9zcGVjKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICIoIiArIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSArICIsIgorICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpICsgIiwiCisgICAgICAgICAgICsgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpICsgIiwiCisgICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgKyAiKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICIoIiArIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCIKKyAgICAgICAgICAgKyB0eXBlX3RvX3NwZWNfYXJncygoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiKCIgKyB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIsIgorICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fc3BlY19hcmdzOiAiICsgdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK2Jvb2wgZm9ybWF0X2dvX291dHB1dChjb25zdCBzdHJpbmcmIGZpbGVfcGF0aCkgeworCisgIC8vIGZvcm1hdHRpbmcgdmlhIGdvZm10IGRlYWN0aXZhdGVkIGR1ZSB0byBUSFJJRlQtMzg5MworICAvLyBQbGVhc2UgbG9vayBhdCB0aGUgdGlja2V0IGFuZCBtYWtlIHN1cmUgeW91IGZ1bGx5IHVuZGVyc3RhbmQgYWxsIHRoZSBpbXBsaWNhdGlvbnMKKyAgLy8gYmVmb3JlIHN1Ym1pdHRpbmcgYSBwYXRjaCB0aGF0IGVuYWJsZXMgdGhpcyBmZWF0dXJlIGFnYWluLiBUaGFuayB5b3UuCisgICh2b2lkKSBmaWxlX3BhdGg7CisgIHJldHVybiBmYWxzZTsKKworICAvKgorICBjb25zdCBzdHJpbmcgY29tbWFuZCA9ICJnb2ZtdCAtdyAiICsgZmlsZV9wYXRoOworCisgIGlmIChzeXN0ZW0oY29tbWFuZC5jX3N0cigpKSA9PSAwKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkcgLSBSdW5uaW5nICclcycgZmFpbGVkLlxuIiwgY29tbWFuZC5jX3N0cigpKTsKKyAgcmV0dXJuIGZhbHNlOworICAqLworIH0KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihnbywgIkdvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBwYWNrYWdlX3ByZWZpeD0gIFBhY2thZ2UgcHJlZml4IGZvciBnZW5lcmF0ZWQgZmlsZXMuXG4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB0aHJpZnRfaW1wb3J0PSAgIE92ZXJyaWRlIHRocmlmdCBwYWNrYWdlIGltcG9ydCBwYXRoIChkZWZhdWx0OiIgKyBERUZBVUxUX1RIUklGVF9JTVBPUlQgKyAiKVxuIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgcGFja2FnZT0gICAgICAgICBQYWNrYWdlIG5hbWUgKGRlZmF1bHQ6IGluZmVycmVkIGZyb20gdGhyaWZ0IGZpbGUgbmFtZSlcbiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGlnbm9yZV9pbml0aWFsaXNtc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZSBhdXRvbWF0aWMgc3BlbGxpbmcgY29ycmVjdGlvbiBvZiBpbml0aWFsaXNtcyAoZS5nLiBcIlVSTFwiKVxuIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgcmVhZF93cml0ZV9wcml2YXRlXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICBNYWtlIHJlYWQvd3JpdGUgbWV0aG9kcyBwcml2YXRlLCBkZWZhdWx0IGlzIHB1YmxpYyBSZWFkL1dyaXRlXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9ndl9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2d2X2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjgzMDFhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9ndl9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpwYWlyOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogR3JhcGh2aXogY29kZSBnZW5lcmF0b3IKKyAqLworY2xhc3MgdF9ndl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2d2X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBleGNlcHRpb25fYXJyb3dzID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZXhjZXB0aW9ucyIpID09IDApIHsKKyAgICAgICAgZXhjZXB0aW9uX2Fycm93cyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gZ3Y6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWd2IjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBlbmQgb2YgZ2VuZXJhdG9yCisgICAqLworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBIZWxwZXJzCisgICAqLworICB2b2lkIHByaW50X3R5cGUodF90eXBlKiB0dHlwZSwgc3RyaW5nIHN0cnVjdF9maWVsZF9yZWYpOworICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKTsKKworcHJpdmF0ZToKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX291dF87CisgIHN0ZDo6bGlzdDxzdHJpbmc+IGVkZ2VzOworICBib29sIGV4Y2VwdGlvbl9hcnJvd3M7Cit9OworCisvKioKKyAqIEluaXQgZ2VuZXJhdG9yOgorICogLSBBZGRzIHNvbWUgZXNjYXBpbmcgZm9yIHRoZSBHcmFwaHZpeiBkb21haW4uCisgKiAtIENyZWF0ZSBvdXRwdXQgZGlyZWN0b3J5IGFuZCBvcGVuIGZpbGUgZm9yIHdyaXR0aW5nLgorICogLSBXcml0ZSB0aGUgZmlsZSBoZWFkZXIuCisgKi8KK3ZvaWQgdF9ndl9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBlc2NhcGVfWyd7J10gPSAiXFx7IjsKKyAgZXNjYXBlX1snfSddID0gIlxcfSI7CisKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisgIHN0cmluZyBmbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICIuZ3YiOworICBmX291dF8ub3BlbihmbmFtZS5jX3N0cigpKTsKKyAgZl9vdXRfIDw8ICJkaWdyYXBoIFwiIiA8PCBlc2NhcGVfc3RyaW5nKHByb2dyYW1fbmFtZV8pIDw8ICJcIiB7IiA8PCBlbmRsOworICBmX291dF8gPDwgIm5vZGUgW3N0eWxlPWZpbGxlZCwgc2hhcGU9cmVjb3JkXTsiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiZWRnZSBbYXJyb3dzaXplPTAuNV07IiA8PCBlbmRsOworICBmX291dF8gPDwgInJhbmtkaXI9TFIiIDw8IGVuZGw7Cit9CisKKy8qKgorICogQ2xvc2VzIGdlbmVyYXRvcjoKKyAqIC0gUHJpbnQgYWNjdW11bGF0ZWQgbm9kZXMgY29ubmVjdGlvbnMuCisgKiAtIFByaW50IGZvb3Rub3RlLgorICogLSBDbG9zZXMgZmlsZS4KKyAqLwordm9pZCB0X2d2X2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICAvLyBQcmludCBlZGdlcworICBzdGQ6Omxpc3Q8c3RyaW5nPjo6aXRlcmF0b3IgaXRlciA9IGVkZ2VzLmJlZ2luKCk7CisgIGZvciAoOyBpdGVyICE9IGVkZ2VzLmVuZCgpOyBpdGVyKyspIHsKKyAgICBmX291dF8gPDwgKCppdGVyKSA8PCBlbmRsOworICB9CisKKyAgLy8gUHJpbnQgZ3JhcGggZW5kIH0gYW5kIGNsb3NlIGZpbGUKKyAgZl9vdXRfIDw8ICJ9IiA8PCBlbmRsOworICBmX291dF8uY2xvc2UoKTsKK30KKwordm9pZCB0X2d2X2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIHN0cmluZyBuYW1lID0gdHR5cGVkZWYtPmdldF9uYW1lKCk7CisgIGZfb3V0XyA8PCAibm9kZSBbZmlsbGNvbG9yPWF6dXJlXTsiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCBuYW1lIDw8ICIgW2xhYmVsPVwiIjsKKworICBmX291dF8gPDwgZXNjYXBlX3N0cmluZyhuYW1lKTsKKyAgZl9vdXRfIDw8ICIgOjogIjsKKyAgcHJpbnRfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSwgbmFtZSk7CisKKyAgZl9vdXRfIDw8ICJcIl07IiA8PCBlbmRsOworfQorCit2b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgc3RyaW5nIG5hbWUgPSB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9d2hpdGVdOyIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8IG5hbWUgPDwgIiBbbGFiZWw9XCJlbnVtICIgPDwgZXNjYXBlX3N0cmluZyhuYW1lKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gdmFsdWVzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciB2YWxfaXRlcjsKKyAgZm9yICh2YWxfaXRlciA9IHZhbHVlcy5iZWdpbigpOyB2YWxfaXRlciAhPSB2YWx1ZXMuZW5kKCk7ICsrdmFsX2l0ZXIpIHsKKyAgICBmX291dF8gPDwgJ3wnIDw8ICgqdmFsX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZfb3V0XyA8PCAiID0gIjsKKyAgICBmX291dF8gPDwgKCp2YWxfaXRlciktPmdldF92YWx1ZSgpOworICB9CisKKyAgZl9vdXRfIDw8ICJcIl07IiA8PCBlbmRsOworfQorCit2b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7CisKKyAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9YWxpY2VibHVlXTsiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiY29uc3RfIiA8PCBuYW1lIDw8ICIgW2xhYmVsPVwiIjsKKworICBmX291dF8gPDwgZXNjYXBlX3N0cmluZyhuYW1lKTsKKyAgZl9vdXRfIDw8ICIgPSAiOworICBwcmludF9jb25zdF92YWx1ZSh0Y29uc3QtPmdldF90eXBlKCksIHRjb25zdC0+Z2V0X3ZhbHVlKCkpOworICBmX291dF8gPDwgIiA6OiAiOworICBwcmludF90eXBlKHRjb25zdC0+Z2V0X3R5cGUoKSwgImNvbnN0XyIgKyBuYW1lKTsKKworICBmX291dF8gPDwgIlwiXTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9ndl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBmX291dF8gPDwgIm5vZGUgW2ZpbGxjb2xvcj1saWdodHBpbmtdOyIgPDwgZW5kbDsKKyAgICBmX291dF8gPDwgbmFtZSA8PCAiIFtsYWJlbD1cIiI7CisgICAgZl9vdXRfIDw8ICJleGNlcHRpb24gIiA8PCBlc2NhcGVfc3RyaW5nKG5hbWUpOworICB9IGVsc2UgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBmX291dF8gPDwgIm5vZGUgW2ZpbGxjb2xvcj1saWdodGN5YW5dOyIgPDwgZW5kbDsKKyAgICBmX291dF8gPDwgbmFtZSA8PCAiIFtsYWJlbD1cIiI7CisgICAgZl9vdXRfIDw8ICJ1bmlvbiAiIDw8IGVzY2FwZV9zdHJpbmcobmFtZSk7CisgIH0gZWxzZSB7CisgICAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9YmVpZ2VdOyIgPDwgZW5kbDsKKyAgICBmX291dF8gPDwgbmFtZSA8PCAiIFtsYWJlbD1cIiI7CisgICAgZl9vdXRfIDw8ICJzdHJ1Y3QgIiA8PCBlc2NhcGVfc3RyaW5nKG5hbWUpOworICB9CisKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7CisgIGZvciAoOyBtZW1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyBtZW1faXRlcisrKSB7CisgICAgc3RyaW5nIGZpZWxkX25hbWUgPSAoKm1lbV9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIC8vIHByaW50IHBvcnQgKGFuY2hvciByZWZlcmVuY2UpCisgICAgZl9vdXRfIDw8ICJ8PGZpZWxkXyIgPDwgZmllbGRfbmFtZSA8PCAnPic7CisKKyAgICAvLyBmaWVsZCBuYW1lIDo6IGZpZWxkIHR5cGUKKyAgICBmX291dF8gPDwgKCptZW1faXRlciktPmdldF9uYW1lKCk7CisgICAgZl9vdXRfIDw8ICIgOjogIjsKKyAgICBwcmludF90eXBlKCgqbWVtX2l0ZXIpLT5nZXRfdHlwZSgpLCBuYW1lICsgIjpmaWVsZF8iICsgZmllbGRfbmFtZSk7CisgIH0KKworICBmX291dF8gPDwgIlwiXTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9ndl9nZW5lcmF0b3I6OnByaW50X3R5cGUodF90eXBlKiB0dHlwZSwgc3RyaW5nIHN0cnVjdF9maWVsZF9yZWYpIHsKKyAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBmX291dF8gPDwgImxpc3RcXDwiOworICAgICAgcHJpbnRfdHlwZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHN0cnVjdF9maWVsZF9yZWYpOworICAgICAgZl9vdXRfIDw8ICJcXD4iOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBmX291dF8gPDwgInNldFxcPCI7CisgICAgICBwcmludF90eXBlKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCBzdHJ1Y3RfZmllbGRfcmVmKTsKKyAgICAgIGZfb3V0XyA8PCAiXFw+IjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgZl9vdXRfIDw8ICJtYXBcXDwiOworICAgICAgcHJpbnRfdHlwZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpLCBzdHJ1Y3RfZmllbGRfcmVmKTsKKyAgICAgIGZfb3V0XyA8PCAiLCAiOworICAgICAgcHJpbnRfdHlwZSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpLCBzdHJ1Y3RfZmllbGRfcmVmKTsKKyAgICAgIGZfb3V0XyA8PCAiXFw+IjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgZl9vdXRfIDw8ICh0dHlwZS0+aXNfYmluYXJ5KCkgPyAiYmluYXJ5IiA6IHR0eXBlLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIHsKKyAgICBmX291dF8gPDwgdHR5cGUtPmdldF9uYW1lKCk7CisgICAgZWRnZXMucHVzaF9iYWNrKHN0cnVjdF9maWVsZF9yZWYgKyAiIC0+ICIgKyB0dHlwZS0+Z2V0X25hbWUoKSk7CisgIH0KK30KKworLyoqCisgKiBQcmludHMgb3V0IGFuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvdmlkZWQgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X2d2X2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIHN3aXRjaCAodHZhbHVlLT5nZXRfdHlwZSgpKSB7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjoKKyAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgIGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKKyAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgorICAgIGZfb3V0XyA8PCAiXFxcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHR2YWx1ZSkgPDwgIlxcXCIiOworICAgIGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDogeworICAgIGZfb3V0XyA8PCAiXFx7ICI7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4gbWFwX2VsZW1zID0gdHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46Oml0ZXJhdG9yIG1hcF9pdGVyOworICAgIGZvciAobWFwX2l0ZXIgPSBtYXBfZWxlbXMuYmVnaW4oKTsgbWFwX2l0ZXIgIT0gbWFwX2VsZW1zLmVuZCgpOyBtYXBfaXRlcisrKSB7CisgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgIGZfb3V0XyA8PCAiLCAiOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgbWFwX2l0ZXItPmZpcnN0KTsKKyAgICAgIGZfb3V0XyA8PCAiID0gIjsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgbWFwX2l0ZXItPnNlY29uZCk7CisgICAgfQorICAgIGZfb3V0XyA8PCAiIFxcfSI7CisgIH0gYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTElTVDogeworICAgIGZfb3V0XyA8PCAiXFx7ICI7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiBsaXN0X2VsZW1zID0gdHZhbHVlLT5nZXRfbGlzdCgpOworICAgIDsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+OjppdGVyYXRvciBsaXN0X2l0ZXI7CisgICAgZm9yIChsaXN0X2l0ZXIgPSBsaXN0X2VsZW1zLmJlZ2luKCk7IGxpc3RfaXRlciAhPSBsaXN0X2VsZW1zLmVuZCgpOyBsaXN0X2l0ZXIrKykgeworICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICBmX291dF8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCAqbGlzdF9pdGVyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCksICpsaXN0X2l0ZXIpOworICAgICAgfQorICAgIH0KKyAgICBmX291dF8gPDwgIiBcXH0iOworICB9IGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVI6CisgICAgZl9vdXRfIDw8IGVzY2FwZV9zdHJpbmcodHlwZS0+Z2V0X25hbWUoKSkgPDwgIi4iCisgICAgICAgICAgIDw8IGVzY2FwZV9zdHJpbmcodHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCkpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGZfb3V0XyA8PCAiVU5LTk9XTiI7CisgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCB0X2d2X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBzZXJ2aWNlX25hbWUgPSBnZXRfc2VydmljZV9uYW1lKHRzZXJ2aWNlKTsKKyAgZl9vdXRfIDw8ICJzdWJncmFwaCBjbHVzdGVyXyIgPDwgc2VydmljZV9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9YmlzcXVlXTsiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAic3R5bGU9ZGFzaGVkOyIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICJsYWJlbCA9IFwiIiA8PCBlc2NhcGVfc3RyaW5nKHNlcnZpY2VfbmFtZSkgPDwgIiBzZXJ2aWNlXCI7IiA8PCBlbmRsOworCisgIC8vIFRPRE86IHNlcnZpY2UgZXh0ZW5kcworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOworICBmb3IgKDsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7IGZuX2l0ZXIrKykgeworICAgIHN0cmluZyBmbl9uYW1lID0gKCpmbl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIGZfb3V0XyA8PCAiZnVuY3Rpb25fIiA8PCBzZXJ2aWNlX25hbWUgPDwgZm5fbmFtZTsKKyAgICBmX291dF8gPDwgIltsYWJlbD1cIjxyZXR1cm5fdHlwZT5mdW5jdGlvbiAiIDw8IGVzY2FwZV9zdHJpbmcoZm5fbmFtZSk7CisgICAgZl9vdXRfIDw8ICIgOjogIjsKKyAgICBwcmludF90eXBlKCgqZm5faXRlciktPmdldF9yZXR1cm50eXBlKCksICJmdW5jdGlvbl8iICsgc2VydmljZV9uYW1lICsgZm5fbmFtZSArICI6cmV0dXJuX3R5cGUiKTsKKworICAgIHZlY3Rvcjx0X2ZpZWxkKj4gYXJncyA9ICgqZm5faXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7CisgICAgZm9yICg7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7IGFyZ19pdGVyKyspIHsKKyAgICAgIGZfb3V0XyA8PCAifDxwYXJhbV8iIDw8ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI+IjsKKyAgICAgIGZfb3V0XyA8PCAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGlmICgoKmFyZ19pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgICBmX291dF8gPDwgIiA9ICI7CisgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKmFyZ19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgICAgfQorICAgICAgZl9vdXRfIDw8ICIgOjogIjsKKyAgICAgIHByaW50X3R5cGUoKCphcmdfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICJmdW5jdGlvbl8iICsgc2VydmljZV9uYW1lICsgZm5fbmFtZSArICI6cGFyYW1fIiArICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB9CisgICAgLy8gZW5kIG9mIG5vZGUKKyAgICBmX291dF8gPDwgIlwiXTsiIDw8IGVuZGw7CisKKyAgICAvLyBFeGNlcHRpb24gZWRnZXMKKyAgICBpZiAoZXhjZXB0aW9uX2Fycm93cykgeworICAgICAgdmVjdG9yPHRfZmllbGQqPiBleGNlcHRzID0gKCpmbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgZXhfaXRlciA9IGV4Y2VwdHMuYmVnaW4oKTsKKyAgICAgIGZvciAoOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgeworICAgICAgICBlZGdlcy5wdXNoX2JhY2soImZ1bmN0aW9uXyIgKyBzZXJ2aWNlX25hbWUgKyBmbl9uYW1lICsgIiAtPiAiCisgICAgICAgICAgICAgICAgICAgICAgICArICgqZXhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgKyAiIFtjb2xvcj1yZWRdIik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZl9vdXRfIDw8ICIgfSIgPDwgZW5kbDsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBndiwKKyAgICAiR3JhcGh2aXoiLAorICAgICIgICAgZXhjZXB0aW9uczogICAgICBXaGV0aGVyIHRvIGRyYXcgYXJyb3dzIGZyb20gZnVuY3Rpb25zIHRvIGV4Y2VwdGlvbi5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2hheGVfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9oYXhlX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjg4YzRkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9oYXhlX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDI5ODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEhheGUgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X2hheGVfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfaGF4ZV9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBjYWxsYmFja3NfID0gZmFsc2U7CisgICAgcnR0aV8gPSBmYWxzZTsKKyAgICBidWlsZG1hY3JvXyA9ICIiOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImNhbGxiYWNrcyIpID09IDApIHsKKyAgICAgICAgY2FsbGJhY2tzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInJ0dGkiKSA9PSAwKSB7CisgICAgICAgIHJ0dGlfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYnVpbGRtYWNybyIpID09IDApIHsKKyAgICAgICAgYnVpbGRtYWNyb18gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBoYXhlOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1oYXhlIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24sIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7CisgIC8vIHJlbW92ZWQgLS0gZXF1YWxpdHksY29tcGFyZV90bworICB2b2lkIGdlbmVyYXRlX2hheGVfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2hheGVfdmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2hheGVfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2hheGVfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9tZXRhX2RhdGFfbWFwKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOworICBzdGQ6OnN0cmluZyBnZXRfaGF4ZV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOworICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvcGVydHlfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOworICAvLyByZW1vdmVkIHN0ZDo6c3RyaW5nIGlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpc19pbnRlcmZhY2UpOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOworCisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7CisKKyAgdm9pZCBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24oc3RkOjpvc3RyZWFtJiBvdXQpOworICB2b2lkIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24oc3RkOjpvc3RyZWFtJiBvdXQpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBoYXhlX3BhY2thZ2UoKTsKKyAgc3RkOjpzdHJpbmcgaGF4ZV90eXBlX2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgaGF4ZV90aHJpZnRfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyBoYXhlX3RocmlmdF9nZW5faW1wb3J0cyh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nJiBpbXBvcnRzKTsKKyAgc3RkOjpzdHJpbmcgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlLCBib29sIGluX2luaXQgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9jYWxsYmFjayh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfbm9ybWFsKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKTsKKyAgc3RyaW5nIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX29uc3VjY2Vzcyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgYXNfdHlwZSwgYm9vbCBvbWl0X25hbWUpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZV9jYWxsYmFjayh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaXNfaW50ZXJmYWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmVfbm9ybWFsKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpc19pbnRlcmZhY2UpOworCisgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICAgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJpbmcoKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAvLyBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDogIC0gSW50NjQgaXMgbm90IHJlYWxseSBudWxsYWJsZSwgZXZlbiB0aG91Z2ggaXQgYmVoYXZlZCB0aGF0CisgICAgICAgIC8vIHdheSBiZWZvcmUgSGF4ZSAzLjIuMAorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGQ6OnN0cmluZyBjb25zdGFudF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworCitwcml2YXRlOgorICBib29sIGNhbGxiYWNrc187CisgIGJvb2wgcnR0aV87CisgIHN0cmluZyBidWlsZG1hY3JvXzsKKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfbmFtZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisgIHBhY2thZ2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiaGF4ZSIpOworCisgIC8vIEhheGUgcGFja2FnZSBuYW1lcyBhcmUgbG93ZXJjYXNlCisgIGlmIChwYWNrYWdlX25hbWVfLmxlbmd0aCgpID4gMCkgeworICAgIHBhY2thZ2VfbmFtZV9bMF0gPSB0b2xvd2VyKHBhY2thZ2VfbmFtZV9bMF0pOworICAgIHNpemVfdCBpbmRleCA9IHBhY2thZ2VfbmFtZV8uZmluZCgnLicpOworICAgIHdoaWxlIChpbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgaWYgKCsraW5kZXggPCBwYWNrYWdlX25hbWVfLmxlbmd0aCgpKSB7CisgICAgICAgIHBhY2thZ2VfbmFtZV9baW5kZXhdID0gdG9sb3dlcihwYWNrYWdlX25hbWVfW2luZGV4XSk7CisgICAgICB9CisgICAgICBpbmRleCA9IHBhY2thZ2VfbmFtZV8uZmluZCgnLicsIGluZGV4KTsKKyAgICB9CisgIH0KKworICBzdHJpbmcgZGlyID0gcGFja2FnZV9uYW1lXzsKKyAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgIGRpciA9IGRpci5zdWJzdHIobG9jICsgMSk7CisgIH0KKyAgaWYgKGRpci5zaXplKCkgPiAwKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgfQorCisgIHBhY2thZ2VfZGlyXyA9IHN1YmRpcjsKK30KKworLyoqCisgKiBQYWNrYWdlcyB0aGUgZ2VuZXJhdGVkIGZpbGUKKyAqCisgKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgcGFja2FnZSwgaS5lLiAicGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdGRlbW87IgorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6aGF4ZV9wYWNrYWdlKCkgeworICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgeworICAgIHJldHVybiBzdHJpbmcoInBhY2thZ2UgIikgKyBwYWNrYWdlX25hbWVfOworICB9CisgIHJldHVybiAicGFja2FnZSI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIGhheGUgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBoYXhlIHR5cGVzIHRoYXQgYXJlIHVzZWQgaW4gaGVyZQorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6aGF4ZV90eXBlX2ltcG9ydHMoKSB7CisgIHJldHVybiBzdHJpbmcoKSArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyLio7XG4iICsgImltcG9ydCBoYXhlLmlvLkJ5dGVzO1xuIgorICAgICAgICAgKyAiaW1wb3J0IGhheGUuZHMuSW50TWFwO1xuIiArICJpbXBvcnQgaGF4ZS5kcy5TdHJpbmdNYXA7XG4iCisgICAgICAgICArICJpbXBvcnQgaGF4ZS5kcy5PYmplY3RNYXA7XG4iICsgIlxuIiArICIjaWYgZmxhc2hcbiIKKyAgICAgICAgICsgImltcG9ydCBmbGFzaC5lcnJvcnMuQXJndW1lbnRFcnJvcjtcbiIgKyAiI2VuZFxuIiArICJcbiI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIGhheGUgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgdGhyaWZ0CisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpoYXhlX3RocmlmdF9pbXBvcnRzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7XG4iICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjtcbiIKKyAgICAgICAgICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qO1xuIiArICJcbiI7Cit9CisKKy8qKgorICogUHJpbnRzIGltcG9ydHMgbmVlZGVkIGZvciBhIGdpdmVuIHR5cGUKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGEgZ2l2ZW4gdF9zdHJ1Y3QKKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcmIGltcG9ydHMpIHsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIC8vIEZvciBlYWNoIHR5cGUgY2hlY2sgaWYgaXQgaXMgZnJvbSBhIGRpZmZlcmVudCBuYW1lc3BhY2UKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3Byb2dyYW0oKTsKKyAgICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiaGF4ZSIpOworICAgICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKKyAgICAgICAgaWYgKGltcG9ydHMuZmluZChwYWNrYWdlICsgIi4iICsgKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICBpbXBvcnRzLmFwcGVuZCgiaW1wb3J0ICIgKyBwYWNrYWdlICsgIi4iICsgKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpICsgIjtcbiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBpbXBvcnRzOworfQorCisvKioKKyAqIFByaW50cyBpbXBvcnRzIG5lZWRlZCBmb3IgYSBnaXZlbiB0eXBlCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBhIGdpdmVuIHRfc2VydmljZQorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6aGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgaW1wb3J0czsKKyAgY29uc3QgdmVjdG9yPHRfZnVuY3Rpb24qPiYgZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIEZvciBlYWNoIHR5cGUgY2hlY2sgaWYgaXQgaXMgZnJvbSBhIGRpZmZlcmVudCBuYW1lc3BhY2UKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9wcm9ncmFtKCk7CisgICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImhheGUiKTsKKyAgICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7CisgICAgICAgIGlmIChpbXBvcnRzLmZpbmQocGFja2FnZSArICIuIiArICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X25hbWUoKSkgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgaW1wb3J0cy5hcHBlbmQoImltcG9ydCAiICsgcGFja2FnZSArICIuIiArICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgIjtcbiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHMoKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLCBpbXBvcnRzKTsKKyAgICBoYXhlX3RocmlmdF9nZW5faW1wb3J0cygoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSwgaW1wb3J0cyk7CisgIH0KKworICByZXR1cm4gaW1wb3J0czsKK30KKworLyoqCisgKiBOb3RoaW5nIGluIGhheGUKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBoYXhlLCBzaW5jZSBpdCBkb2VzCisgKiBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgbmFtZSByZXBsYWNlbWVudHMsIGFuZCBpdCdkIGJlIGEgd2Fja3kgd2FzdGUKKyAqIG9mIG92ZXJoZWFkIHRvIG1ha2Ugd3JhcHBlciBjbGFzc2VzLgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEVudW1zIGFyZSBhIGNsYXNzIHdpdGggYSBzZXQgb2Ygc3RhdGljIGNvbnN0YW50cy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfZW51bV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgZ2V0X2NhcF9uYW1lKHRlbnVtLT5nZXRfbmFtZSgpKSArICIuaHgiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZW51bTsKKyAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7CisKKyAgLy8gQ29tbWVudCBhbmQgcGFja2FnZSBpdAorICBmX2VudW0gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgaGF4ZV9wYWNrYWdlKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBBZGQgaGF4ZSBpbXBvcnRzCisgIGZfZW51bSA8PCBzdHJpbmcoKSArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyLio7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfcnR0aV9kZWNvcmF0aW9uKGZfZW51bSk7CisgIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24oZl9lbnVtKTsKKyAgaW5kZW50KGZfZW51bSkgPDwgImNsYXNzICIgPDwgZ2V0X2NhcF9uYW1lKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiICI7CisgIHNjb3BlX3VwKGZfZW51bSk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIDogSW50ID0gIiA8PCB2YWx1ZQorICAgICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgLy8gQ3JlYXRlIGEgc3RhdGljIFNldCB3aXRoIGFsbCB2YWxpZCB2YWx1ZXMgZm9yIHRoaXMgZW51bQorICBmX2VudW0gPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyB2YXIgVkFMSURfVkFMVUVTID0geyBuZXcgSW50U2V0KCBbIjsKKyAgaW5kZW50X3VwKCk7CisgIGJvb2wgZmlyc3RWYWx1ZSA9IHRydWU7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgLy8gcG9wdWxhdGUgc2V0CisgICAgZl9lbnVtIDw8IChmaXJzdFZhbHVlID8gIiIgOiAiLCAiKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgZmlyc3RWYWx1ZSA9IGZhbHNlOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfZW51bSA8PCAiXSk7IH07IiA8PCBlbmRsOworCisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljIHZhciBWQUxVRVNfVE9fTkFNRVMgPSB7IFsiOworICBpbmRlbnRfdXAoKTsKKyAgZmlyc3RWYWx1ZSA9IHRydWU7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZl9lbnVtIDw8IChmaXJzdFZhbHVlID8gIiIgOiAiLCIpIDw8IGVuZGw7CisgICAgaW5kZW50KGZfZW51bSkgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT4gXCIiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIiOworICAgIGZpcnN0VmFsdWUgPSBmYWxzZTsKKyAgfQorICBmX2VudW0gPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfZW51bSkgPDwgIl07IH07IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24oZl9lbnVtKTsgLy8gZW5kIGNsYXNzCisKKyAgZl9lbnVtLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGdldF9jYXBfbmFtZShwcm9ncmFtX25hbWVfKSArICJDb25zdGFudHMuaHgiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOworICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGhheGVfcGFja2FnZSgpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9jb25zdHMgPDwgZW5kbDsKKworICBmX2NvbnN0cyA8PCBoYXhlX3R5cGVfaW1wb3J0cygpOworCisgIGdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihmX2NvbnN0cyk7CisgIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24oZl9jb25zdHMpOworICBpbmRlbnQoZl9jb25zdHMpIDw8ICJjbGFzcyAiIDw8IGdldF9jYXBfbmFtZShwcm9ncmFtX25hbWVfKSA8PCAiQ29uc3RhbnRzIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2NvbnN0cykgPDwgIn0iIDw8IGVuZGw7CisgIGZfY29uc3RzLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaW5kZW50KG91dCk7CisgIGlmICghZGVmdmFsKSB7CisgICAgb3V0IDw8IChpbl9zdGF0aWMgPyAidmFyICIgOiAicHVibGljIHN0YXRpYyBpbmxpbmUgdmFyICAiKTsKKyAgfQorICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgb3V0IDw8IG5hbWU7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgIH0KKyAgICBvdXQgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgbmFtZTsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgfQorICAgIG91dCA8PCAiID0gIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBvdXQgPDwgbmFtZSA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiCisgICAgICAgIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IGZ1bmN0aW9uKCkgOiBWb2lkIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIjsKKyAgICAgIG91dCA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9KCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBuYW1lOworICAgIGlmICghZGVmdmFsKSB7CisgICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKKyAgICB9CisgICAgb3V0IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IGZ1bmN0aW9uKCkgOiBWb2lkIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9KCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgbmFtZTsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgfQorICAgIG91dCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpIDogVm9pZCB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIiA8PCAodHlwZS0+aXNfbGlzdCgpID8gInB1c2giIDogImFkZCIpIDw8ICIoIiA8PCB2YWwgPDwgIik7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICAodm9pZCluYW1lOworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZW5kZXIgPDwgIihieXRlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJlbmRlciA8PCAiKHNob3J0KSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8ICIoZG91YmxlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgeworICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKKyAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlKTsKKyAgICByZW5kZXIgPDwgdDsKKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBhIGNsYXNzCisgKiB3aXRoIGRhdGEgbWVtYmVycywgcmVhZCgpLCB3cml0ZSgpLCBhbmQgYW4gaW5uZXIgSXNzZXQgY2xhc3MuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2hheGVfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBFeGNlcHRpb25zIGFyZSBzdHJ1Y3RzLCBidXQgdGhleSBpbmhlcml0IGZyb20gRXhjZXB0aW9uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9oYXhlX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEhheGUgc3RydWN0IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uLCBib29sIGlzX3Jlc3VsdCkgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgZ2V0X2NhcF9uYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpICsgIi5oeCI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CisgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKworICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBoYXhlX3BhY2thZ2UoKSA8PCAiOyIgPDwgZW5kbDsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIHN0cmluZyBpbXBvcnRzOworCisgIGZfc3RydWN0IDw8IGhheGVfdHlwZV9pbXBvcnRzKCkgPDwgaGF4ZV90aHJpZnRfaW1wb3J0cygpCisgICAgICAgICAgIDw8IGhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzdHJ1Y3QsIGltcG9ydHMpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCBpc19yZXN1bHQpOworCisgIGZfc3RydWN0LmNsb3NlKCk7Cit9CisKKy8qKgorICogaGF4ZSBzdHJ1Y3QgZGVmaW5pdGlvbi4gVGhpcyBoYXMgdmFyaW91cyBwYXJhbWV0ZXJzLCBhcyBpdCBjb3VsZCBiZQorICogZ2VuZXJhdGVkIHN0YW5kYWxvbmUgb3IgaW5zaWRlIGFub3RoZXIgY2xhc3MgYXMgYSBoZWxwZXIuIElmIGl0CisgKiBpcyBhIGhlbHBlciB0aGFuIGl0IGlzIGEgc3RhdGljIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0c3RydWN0ICAgICAgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBAcGFyYW0gaXNfZXhjZXB0aW9uIElzIHRoaXMgYW4gZXhjZXB0aW9uPworICogQHBhcmFtIGluX2NsYXNzICAgICBJZiBpbnNpZGUgYSBjbGFzcywgbmVlZHMgdG8gYmUgc3RhdGljIGNsYXNzCisgKiBAcGFyYW0gaXNfcmVzdWx0ICAgIElmIHRoaXMgaXMgYSByZXN1bHQgaXQgbmVlZHMgYSBkaWZmZXJlbnQgd3JpdGVyCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKKyAgZ2VuZXJhdGVfaGF4ZV9kb2Mob3V0LCB0c3RydWN0KTsKKworICBzdHJpbmcgY2xzbmFtZSA9IGdldF9jYXBfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKTsKKworICBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24ob3V0KTsKKyAgZ2VuZXJhdGVfbWFjcm9fZGVjb3JhdGlvbihvdXQpOworICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgIiA8PCBjbHNuYW1lIDw8ICIgIjsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8ICJleHRlbmRzIFRFeGNlcHRpb24gIjsKKyAgfQorICBvdXQgPDwgImltcGxlbWVudHMgVEJhc2UgIjsKKworICBzY29wZV91cChvdXQpOworICBpbmRlbnQob3V0KSA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgdmFyIFNUUlVDVF9ERVNDID0geyBuZXcgVFN0cnVjdChcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIpOyB9OyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHZhciAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyA9IHsgbmV3IFRGaWVsZChcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IH07IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGdlbmVyYXRlX2hheGVfZG9jKG91dCwgKm1faXRlcik7CisgICAgLy8gaW5kZW50KG91dCkgPDwgInByaXZhdGUgdmFyIF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSArICIgOiAiICsKKyAgICAvLyB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiQDppc1ZhciIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZhciAiCisgICAgICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpICsgIihnZXQsc2V0KSA6ICIKKyAgICAgICAgICAgICAgICAgICArIGdldF9jYXBfbmFtZSh0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlubGluZSBzdGF0aWMgdmFyICIgPDwgdXBjYXNlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9JRCA6IEludCA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBJbm5lciBJc3NldCBjbGFzcworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgdmFyIF9faXNzZXRfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA6IEJvb2wgPSBmYWxzZTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gU3RhdGljIGluaXRpYWxpemVyIHRvIHBvcHVsYXRlIGdsb2JhbCBjbGFzcyB0byBzdHJ1Y3QgbWV0YWRhdGEgbWFwCisgIGlmIChmYWxzZSkgeworICAgIC8vIFRPRE86IHJlYWN0aXZhdGUgd2hlbiBuZWVkZWQKKyAgICBnZW5lcmF0ZV9oYXhlX21ldGFfZGF0YV9tYXAob3V0LCB0c3RydWN0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLCBtZXRhRGF0YU1hcCk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBuZXcoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIGluZGVudChvdXQpIDw8ICJzdXBlcigpOyIgPDwgZW5kbDsKKyAgfQorICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCktPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfcHJvcGVydHlfZ2V0dGVyc19zZXR0ZXJzKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgIGlmIChpc19yZXN1bHQpIHsKKyAgICBnZW5lcmF0ZV9oYXhlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfaGF4ZV92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gcmVhZCggaXByb3QgOiBUUHJvdG9jb2wpIDogVm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcyBhbmQgcmVhZCBzdHJ1Y3QgaGVhZGVyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGZpZWxkIDogVEZpZWxkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7IgorICAgICAgPDwgZW5kbDsKKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RPUCkgeyAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZC5pZCkiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0lEOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKyAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCAqZl9pdGVyKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiCisgICAgICA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJjYXRjaChlOkR5bmFtaWMpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBpbmRlbnQob3V0KSA8PCAiaXByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBlOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUKKyAgLy8gKHdoaWNoIGNhbiBiZSBjaGVja2VkIGhlcmUgYnV0IG5vdCBpbiB0aGUgZ2VuZXJhbCB2YWxpZGF0ZSBtZXRob2QpCisgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlLCB3aGljaCBjYW4ndCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGVja2VkIGluIHRoZSB2YWxpZGF0ZSBtZXRob2QiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQgJiYgIXR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIV9faXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlVOS05PV04sIFwiUmVxdWlyZWQgZmllbGQgJyIKKyAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICA8PCAiJyB3YXMgbm90IGZvdW5kIGluIHNlcmlhbGl6ZWQgZGF0YSEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8vIGdlbmVyYXRlcyBoYXhlIG1ldGhvZCB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCisvLyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHZhbGlkYXRlKCkgOiBWb2lkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpCisgICAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5VTktOT1dOLCBcIlJlcXVpcmVkIGZpZWxkICciCisgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgd2FzIG5vdCBwcmVzZW50ISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIvLyBhbGFzLCB3ZSBjYW5ub3QgY2hlY2sgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICInIGJlY2F1c2UgaXQncyBhIHByaW1pdGl2ZS4iIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOworICAgIC8vIGlmIGZpZWxkIGlzIGFuIGVudW0sIGNoZWNrIHRoYXQgaXRzIHZhbHVlIGlzIHZhbGlkCisgICAgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiICYmICEiCisgICAgICAgICAgICAgICAgICA8PCBnZXRfY2FwX25hbWUoZ2V0X2VudW1fY2xhc3NfbmFtZSh0eXBlKSkgPDwgIi5WQUxJRF9WQUxVRVMuY29udGFpbnMoIgorICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIikpeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlVOS05PV04sIFwiVGhlIGZpZWxkICciCisgICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiJyBoYXMgYmVlbiBhc3NpZ25lZCB0aGUgaW52YWxpZCB2YWx1ZSBcIiArICIKKyAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpIDogVm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImNhdGNoKGU6RHluYW1pYykiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IGU7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwKKyAqIHdoaWNoIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbgorICogaWYgdGhleSBhcmUgc2V0IGluIHRoZSBJc3NldCBhcnJheSwgYW5kIG9ubHkgb25lIG9mIHRoZW0KKyAqIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpIDogVm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIih0aGlzLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSI7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImNhdGNoKGU6RHluYW1pYykiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IGU7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNhcF9uYW1lKSB7CisgICh2b2lkKXR5cGU7CisgICh2b2lkKWNhcF9uYW1lOworICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIl9GSUVMRF9JRDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjYXBfbmFtZSkgeworICAodm9pZCl0eXBlOworICAodm9pZCljYXBfbmFtZTsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICJfRklFTERfSUQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZSA9PSBudWxsKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB1bnNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IHZhbHVlOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBnZXR0ZXJfc3RyZWFtOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc2V0dGVyX3N0cmVhbTsKKworICAvLyBidWlsZCB1cCB0aGUgYm9kaWVzIG9mIGJvdGggdGhlIGdldHRlciBhbmQgc2V0dGVyIGF0IG9uY2UKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOworICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhnZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIGNyZWF0ZSB0aGUgc2V0dGVyCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gc2V0RmllbGRWYWx1ZShmaWVsZElEIDogSW50LCB2YWx1ZSA6IER5bmFtaWMpIDogVm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSB7IiA8PCBlbmRsOworICAgIG91dCA8PCBzZXR0ZXJfc3RyZWFtLnN0cigpOworICAgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGNyZWF0ZSB0aGUgZ2V0dGVyCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0RmllbGRWYWx1ZShmaWVsZElEIDogSW50KSA6IER5bmFtaWMgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgZ2V0dGVyX3N0cmVhbS5zdHIoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvLyBDcmVhdGVzIGEgZ2VuZXJpYyBpc1NldCBtZXRob2QgdGhhdCB0YWtlcyB0aGUgZmllbGQgbnVtYmVyIGFzIGFyZ3VtZW50Cit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gY3JlYXRlIHRoZSBpc1NldCBtZXRob2QKKyAgaW5kZW50KG91dCkgPDwgIi8vIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhICIKKyAgICAgICAgICAgICAgICAgInZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGlzU2V0KGZpZWxkSUQgOiBJbnQpIDogQm9vbCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfSUQ6IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXQgb2YgcHJvcGVydHkgc2V0dGVycy9nZXR0ZXJzIGZvciB0aGUgZ2l2ZW4gc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb3BlcnR5X2dldHRlcnNfc2V0dGVycyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOworCisgICAgLy8gU2ltcGxlIGdldHRlcgorICAgIGdlbmVyYXRlX2hheGVfZG9jKG91dCwgZmllbGQpOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiKCkgOiAiIDw8IGdldF9jYXBfbmFtZSh0eXBlX25hbWUodHlwZSkpCisgICAgICAgICAgICAgICAgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gU2ltcGxlIHNldHRlcgorICAgIGdlbmVyYXRlX2hheGVfZG9jKG91dCwgZmllbGQpOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiKCIgPDwgZmllbGRfbmFtZSA8PCAiOiIKKyAgICAgICAgICAgICAgICA8PCBnZXRfY2FwX25hbWUodHlwZV9uYW1lKHR5cGUpKSA8PCAiKSA6ICIgPDwgZ2V0X2NhcF9uYW1lKHR5cGVfbmFtZSh0eXBlKSkgPDwgIiB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgZmllbGQpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBVbnNldHRlcgorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSA6IFZvaWQgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gaXNTZXQgbWV0aG9kCisgICAgaW5kZW50KG91dCkgPDwgIi8vIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCAiIDw8IGZpZWxkX25hbWUKKyAgICAgICAgICAgICAgICA8PCAiIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSA6IEJvb2wgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiICE9IG51bGw7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRvU3RyaW5nKCkgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyAiCisgICAgICA8PCAiZnVuY3Rpb24gdG9TdHJpbmcoKSA6IFN0cmluZyB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciByZXQgOiBTdHJpbmcgPSBcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmlyc3QgOiBCb29sID0gdHJ1ZTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgY291bGRfYmVfdW5zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKworICAgIGlmICghZmlyc3QpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIWZpcnN0KSByZXQgKz0gIFwiLCBcIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiOyIgPDwgZW5kbDsKKyAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwibnVsbFwiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIkJJTkFSWVwiOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIl9uYW1lIDogU3RyaW5nID0gIiA8PCBnZXRfY2FwX25hbWUoZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkpCisgICAgICAgICAgICAgICAgICA8PCAiLlZBTFVFU19UT19OQU1FU1t0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWUgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCIgKFwiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInJldCArPSB0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCIpXCI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gdGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgImZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOworCisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXQgKz0gXCIpXCI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmV0OyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0YXRpYyBtYXAgd2l0aCBtZXRhIGRhdGEgdG8gc3RvcmUgaW5mb3JtYXRpb24gc3VjaCBhcyBmaWVsZElEIHRvCisgKiBmaWVsZE5hbWUgbWFwcGluZworICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfbWV0YV9kYXRhX21hcChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBTdGF0aWMgTWFwIHdpdGggZmllbGRJRCAtPiBGaWVsZE1ldGFEYXRhIG1hcHBpbmdzCisgIGluZGVudChvdXQpIDw8ICJpbmxpbmUgc3RhdGljIHZhciBtZXRhRGF0YU1hcCA6IEludE1hcCA9IG5ldyBJbnRNYXAoKTsiIDw8IGVuZGw7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgLy8gUG9wdWxhdGUgbWFwCisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGFEYXRhTWFwWyIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKQorICAgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9JRF0gPSBuZXcgRmllbGRNZXRhRGF0YShcIiIgPDwgZmllbGRfbmFtZSA8PCAiXCIsICI7CisKKyAgICAgIC8vIFNldCBmaWVsZCByZXF1aXJlbWVudCB0eXBlIChyZXF1aXJlZCwgb3B0aW9uYWwsIGV0Yy4pCisgICAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLlJFUVVJUkVELCAiOworICAgICAgfSBlbHNlIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5ERUZBVUxULCAiOworICAgICAgfQorCisgICAgICAvLyBDcmVhdGUgdmFsdWUgbWV0YSBkYXRhCisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGhheGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRocmlmdCB0eXBlCisgKiAoZS5nLiBmb3IgdGhlIHR5cGUgc3RydWN0IGl0IHJldHVybnMgIlRUeXBlLlNUUlVDVCIpCisgKi8KK3N0ZDo6c3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmdldF9oYXhlX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSkgeworICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gZ2V0X2hheGVfdHlwZV9zdHJpbmcoKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIlRUeXBlLlZPSUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2hheGVfZ2VuZXJhdG9yOjpnZXRfaGF4ZV90eXBlX3N0cmluZyEiKTsKKyAgICAgIGJyZWFrOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCisgICAgfQorICB9IGVsc2UgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigKKyAgICAgICAgIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9oYXhlX2dlbmVyYXRvcjo6Z2V0X2hheGVfdHlwZV9zdHJpbmchIik7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKKyAgfQorfQorCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKSB7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50X3VwKCk7CisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJuZXcgU3RydWN0TWV0YURhdGEoVFR5cGUuU1RSVUNULCAiIDw8IHR5cGVfbmFtZSh0eXBlKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgTGlzdE1ldGFEYXRhKFRUeXBlLkxJU1QsICI7CisgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IFNldE1ldGFEYXRhKFRUeXBlLlNFVCwgIjsKKyAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOworICAgIH0gZWxzZSB7IC8vIG1hcAorICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBNYXBNZXRhRGF0YShUVHlwZS5NQVAsICI7CisgICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGtleV90eXBlKTsKKyAgICAgIG91dCA8PCAiLCAiOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgdmFsX3R5cGUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibmV3IEZpZWxkVmFsdWVNZXRhRGF0YSgiIDw8IGdldF9oYXhlX3R5cGVfc3RyaW5nKHR5cGUpOworICB9CisgIG91dCA8PCAiKSI7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKKyAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcworICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgorICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBNYWtlIGludGVyZmFjZSBmaWxlCisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSArICIuaHgiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBoYXhlX3BhY2thZ2UoKSA8PCAiOyIgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgaGF4ZV90eXBlX2ltcG9ydHMoKSA8PCBoYXhlX3RocmlmdF9pbXBvcnRzKCkKKyAgICAgICAgICAgICA8PCBoYXhlX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSk7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICB0X3R5cGUqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIHN0cmluZyBwYXJlbnRfbmFtZXNwYWNlID0gcGFyZW50LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJoYXhlIik7CisgICAgaWYgKCFwYXJlbnRfbmFtZXNwYWNlLmVtcHR5KCkgJiYgcGFyZW50X25hbWVzcGFjZSAhPSBwYWNrYWdlX25hbWVfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCB0eXBlX25hbWUocGFyZW50KSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworCisgIGZfc2VydmljZV8uY2xvc2UoKTsKKworICAvLyBOb3cgbWFrZSB0aGUgaW1wbGVtZW50YXRpb24vY2xpZW50IGZpbGUKKyAgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgKyAiSW1wbC5oeCI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGhheGVfcGFja2FnZSgpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaGF4ZV90eXBlX2ltcG9ydHMoKQorICAgICAgICAgICAgIDw8IGhheGVfdGhyaWZ0X2ltcG9ydHMoKSA8PCBoYXhlX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSkgPDwgZW5kbDsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIHRfdHlwZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgc3RyaW5nIHBhcmVudF9uYW1lc3BhY2UgPSBwYXJlbnQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImhheGUiKTsKKyAgICBpZiAoIXBhcmVudF9uYW1lc3BhY2UuZW1wdHkoKSAmJiBwYXJlbnRfbmFtZXNwYWNlICE9IHBhY2thZ2VfbmFtZV8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHR5cGVfbmFtZShwYXJlbnQpIDw8ICJJbXBsOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworCisgIGZfc2VydmljZV8uY2xvc2UoKTsKKworICAvLyBOb3cgbWFrZSB0aGUgaGVscGVyIGNsYXNzIGZpbGVzCisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgLy8gTm93IG1ha2UgdGhlIHByb2Nlc3Nvci9zZXJ2ZXIgZmlsZQorICBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSArICJQcm9jZXNzb3IuaHgiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBoYXhlX3BhY2thZ2UoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGhheGVfdHlwZV9pbXBvcnRzKCkKKyAgICAgICAgICAgICA8PCBoYXhlX3RocmlmdF9pbXBvcnRzKCkgPDwgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpIDw8IGVuZGw7CisKKyAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuKjsiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLiIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pLmNfc3RyKCkKKyAgICAgICAgICAgICAgIDw8ICJJbXBsOyIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIH0KKworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgY29kZSBzbmlwcGV0IGZvciB0aGUgb25TdWNjZXNzIGNhbGxiYWNrcworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgY29kZSBmb3IuCisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9vbnN1Y2Nlc3ModF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFzX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb21pdF9uYW1lKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSAiIjsKKyAgaWYgKCFvbWl0X25hbWUpIHsKKyAgICBuYW1lID0gIm9uU3VjY2VzcyI7CisgICAgaWYgKGFzX3R5cGUpIHsKKyAgICAgIG5hbWUgKz0gIiA6ICI7CisgICAgfQorICB9CisKKyAgaWYgKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgaWYgKGFzX3R5cGUpIHsKKyAgICAgIHJldHVybiBuYW1lICsgIlZvaWQtPlZvaWQgPSBudWxsIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG5hbWUgKyAiKCkgOiBWb2lkIjsKKyAgICB9CisgIH0KKworICBpZiAoYXNfdHlwZSkgeworICAgIHJldHVybiBuYW1lICsgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiLT5Wb2lkID0gbnVsbCI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5hbWUgKyAiKCByZXR2YWwgOiAiICsgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiKSI7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIG1ldGhvZCBoZWFkZXIKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGNvZGUgZm9yLgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaXNfaW50ZXJmYWNlKSB7CisgIGlmIChjYWxsYmFja3NfKSB7CisgICAgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlX2NhbGxiYWNrKHRmdW5jdGlvbiwgaXNfaW50ZXJmYWNlKTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmVfbm9ybWFsKHRmdW5jdGlvbiwgaXNfaW50ZXJmYWNlKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgbWV0aG9kIGhlYWRlciBpbiAibm9ybWFsIiBzdHlsZQorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgY29kZSBmb3IuCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlX25vcm1hbCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbnRlcmZhY2UpIHsKKyAgaWYgKGlzX2ludGVyZmFjZSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfbm9ybWFsKHRmdW5jdGlvbikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9ub3JtYWwodGZ1bmN0aW9uKSA8PCAiIHsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIG1ldGhvZCBoZWFkZXIgaW4gImNhbGxiYWNrIiBzdHlsZQorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgY29kZSBmb3IuCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlX2NhbGxiYWNrKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW50ZXJmYWNlKSB7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHN0ZDo6c3RyaW5nIG9uX3N1Y2Nlc3NfaW1wbCA9IGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX29uc3VjY2Vzcyh0ZnVuY3Rpb24sIGZhbHNlLCBmYWxzZSk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvLyBmdW5jdGlvbiBvbkVycm9yKER5bmFtaWMpIDogVm9pZDsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvLyBmdW5jdGlvbiAiIDw8IG9uX3N1Y2Nlc3NfaW1wbC5jX3N0cigpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKGlzX2ludGVyZmFjZSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfY2FsbGJhY2sodGZ1bmN0aW9uKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2NhbGxiYWNrKHRmdW5jdGlvbikgPDwgIiB7IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7CisgIH0KKworICBnZW5lcmF0ZV9oYXhlX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisgIC8vIGdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihmX3NlcnZpY2VfKTsgLSBub3QgeWV0LCBiZWNhdXNlIG9mCisgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL2lzc3Vlcy8zNjI2CisgIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImludGVyZmFjZSAiIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9oYXhlX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmUoKmZfaXRlciwgdHJ1ZSk7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgYXJncyBhbmQgcmV0dXJuIHR5cGVzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGVuZGw7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9oYXhlX3N0cnVjdCh0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gZ2V0X2NhcF9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKTsKKyAgICBleHRlbmRzX2NsaWVudCA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICJJbXBsIjsKKyAgfQorCisgIGdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihmX3NlcnZpY2VfKTsKKyAgLy8gYnVpbGQgbWFjcm8gaXMgaW5oZXJpdGVkIGZyb20gaW50ZXJmYWNlCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2xhc3MgIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIkltcGwiIDw8IGV4dGVuZHNfY2xpZW50CisgICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uIG5ldyggaXByb3QgOiBUUHJvdG9jb2wsIG9wcm90IDogVFByb3RvY29sID0gbnVsbCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3RfID0gaXByb3Q7IiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChvcHJvdCA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IGlwcm90OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IG9wcm90OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic3VwZXIoaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcml2YXRlIHZhciBpcHJvdF8gOiBUUHJvdG9jb2w7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicHJpdmF0ZSB2YXIgb3Byb3RfIDogVFByb3RvY29sOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInByaXZhdGUgdmFyIHNlcWlkXyA6IEludDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uIGdldElucHV0UHJvdG9jb2woKSA6IFRQcm90b2NvbCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiB0aGlzLmlwcm90XzsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXRPdXRwdXRQcm90b2NvbCgpIDogVFByb3RvY29sIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRoaXMub3Byb3RfOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSk7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisKKyAgICBzdHJpbmcgYXJnc25hbWUgPSBnZXRfY2FwX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgIHN0cmluZyBjYWxsdHlwZSA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiT05FV0FZIiA6ICJDQUxMIjsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCBmdW5uYW1lCisgICAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS4iIDw8IGNhbGx0eXBlIDw8ICIsIHNlcWlkXykpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInZhciBhcmdzIDogIiA8PCBhcmdzbmFtZSA8PCAiID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShvcHJvdF8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoISgoKmZfaXRlciktPmlzX29uZXdheSgpIHx8ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIHJldHZhbCA6ICIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkgPDwgIjsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goZnVuY3Rpb24oZXJyb3I6RHluYW1pYykgOiBWb2lkIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGlmIChjYWxsYmFja3NfKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgfQorICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSBnZXRfY2FwX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGVycm9yICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGlmIChjYWxsYmFja3NfKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihlcnJvcik7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRocm93IGVycm9yOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhciBtc2cgOiBUTWVzc2FnZSA9IGlwcm90Xy5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YXIgeCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgICBpZiAoY2FsbGJhY2tzXykgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoeCk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRocm93IHg7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFyIHJlc3VsdCA6ICIgPDwgcmVzdWx0bmFtZSA8PCAiID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChyZXN1bHQuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygic3VjY2VzcyIpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpZiAoY2FsbGJhY2tzXykgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9uU3VjY2VzcyAhPSBudWxsKSBvblN1Y2Nlc3MocmVzdWx0LnN1Y2Nlc3MpOyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR2YWwgPSByZXN1bHQuc3VjY2VzczsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGlmIChjYWxsYmFja3NfKSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhyb3cgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrc18pIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvblN1Y2Nlc3MgIT0gbnVsbCkgb25TdWNjZXNzKCk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjYWxsYmFja3NfKSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob25FcnJvciAhPSBudWxsKSIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykKKyAgICAgICAgICAgICAgPDwgIm9uRXJyb3IoIG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSk7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pCisgICAgICAgICAgICAgIDw8ICJ0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChjYWxsYmFja3NfKSB7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBjYXRjaCggZSA6IFRFeGNlcHRpb24pIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoZSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoISgoKmZfaXRlciktPmlzX29uZXdheSgpIHx8ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHJldHZhbDsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBFeHRlbmRzIHN0dWZmCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBnZXRfY2FwX25hbWUodHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiUHJvY2Vzc29yIjsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24oZl9zZXJ2aWNlXyk7CisgIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24oZl9zZXJ2aWNlXyk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2xhc3MgIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIlByb2Nlc3NvciIgPDwgZXh0ZW5kc19wcm9jZXNzb3IKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyBUUHJvY2Vzc29yIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSB2YXIgIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykKKyAgICAgICAgICAgICA8PCAiX2lmYWNlXyA6ICIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICI7IiA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicHJpdmF0ZSB2YXIgUFJPQ0VTU19NQVAgPSBuZXcgU3RyaW5nTWFwPCBJbnQtPlRQcm90b2NvbC0+VFByb3RvY29sLT5Wb2lkID4oKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uIG5ldyggaWZhY2UgOiAiIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCAiKSIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN1cGVyKGlmYWNlKTsiIDw8IGVuZGw7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIl9pZmFjZV8gPSBpZmFjZTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJQUk9DRVNTX01BUC5zZXQoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCkpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIHN0cmluZyBvdmVycmlkZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIG92ZXJyaWRlID0gIm92ZXJyaWRlICI7CisgIH0KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IG92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICA8PCAicHVibGljIGZ1bmN0aW9uIHByb2Nlc3MoIGlwcm90IDogVFByb3RvY29sLCBvcHJvdCA6IFRQcm90b2NvbCkgOiBCb29sIgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIG1zZyA6IFRNZXNzYWdlID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBUT0RPKG1jc2xlZSk6IHZhbGlkYXRlIG1lc3NhZ2UsIHdhcyB0aGUgc2VxaWQgZXRjLiBsZWdpdD8KKyAgLy8gQVMtIElmIGFsbCBtZXRob2QgaXMgb25ld2F5OgorICAvLyBkbyB5b3UgaGF2ZSBhbiBvcHJvdD8KKyAgLy8gZG8geW91IHlvdSBuZWVkIG51bGxjaGVjaz8KKyAgZl9zZXJ2aWNlXworICAgICAgPDwgaW5kZW50KCkgPDwgInZhciBmbiAgPSBQUk9DRVNTX01BUC5nZXQobXNnLm5hbWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImlmIChmbiA9PSBudWxsKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgVFR5cGUuU1RSVUNUKTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICB2YXIgeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlVOS05PV05fTUVUSE9ELCBcIkludmFsaWQgIgorICAgICAgICAgIm1ldGhvZCBuYW1lOiAnXCIrbXNnLm5hbWUrXCInXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtc2cuc2VxaWQpKTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICByZXR1cm4gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJmbiggbXNnLnNlcWlkLCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdHJpbmcgcmVzdWx0bmFtZSA9IGdldF9jYXBfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHJlc3VsdG5hbWUpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3QoJnJlc3VsdCwgZmFsc2UsIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIE9wZW4gY2xhc3MKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcml2YXRlIGZ1bmN0aW9uICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICA8PCAiKCkgOiBJbnQtPlRQcm90b2NvbC0+VFByb3RvY29sLT5Wb2lkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gZnVuY3Rpb24oIHNlcWlkIDogSW50LCBpcHJvdCA6IFRQcm90b2NvbCwgb3Byb3QgOiBUUHJvdG9jb2wpIDogVm9pZCIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIHN0cmluZyBhcmdzbmFtZSA9IGdldF9jYXBfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBnZXRfY2FwX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgYXJncyA6ICIgPDwgYXJnc25hbWUgPDwgIiA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IgorICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0IDogIiA8PCByZXN1bHRuYW1lIDw8ICIgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgLy8gVHJ5IGJsb2NrIGZvciBhbnkgIGZ1bmN0aW9uIHRvIGNhdGNoIChkZWZpbmVkIG9yIHVuZGVmaW5lZCkgZXhjZXB0aW9ucworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGNhbGxiYWNrc18pIHsKKyAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiBzdHlsZSBvbkVycm9yL29uU3VjY2VzcworCisgICAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCAiX2lmYWNlXy4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgc3RyaW5nIG9uX3N1Y2Nlc3MgPSBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9vbnN1Y2Nlc3ModGZ1bmN0aW9uLCBmYWxzZSwgdHJ1ZSk7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibnVsbCwgIC8vIGVycm9ycyBhcmUgdGhyb3duIGJ5IHRoZSBoYW5kbGVyIiA8PCBlbmRsOworICAgICAgaWYgKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibnVsbCk7IC8vIG5vIHJldHZhbCIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb24iIDw8IG9uX3N1Y2Nlc3MuY19zdHIoKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5zdWNjZXNzID0gcmV0dmFsOyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICB9CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisKKyAgfSBlbHNlIHsKKyAgICAvLyBub3JtYWwgZnVuY3Rpb24oKTpyZXN1bHQgc3R5bGUKKworICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgaWYgKCEodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSB8fCB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIl9pZmFjZV8uIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIC8vIGNhdGNoIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgSURMCisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjoiCisgICAgICAgICAgICAgICAgIDw8IGdldF9jYXBfbmFtZSh0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gYWx3YXlzIGNhdGNoIGFsbCBleGNlcHRpb25zIHRvIHByZXZlbnQgZnJvbSBzZXJ2aWNlIGRlbmlhbAorICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKHRoIDogRHluYW1pYykgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidHJhY2UoXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgdGgpOyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFyIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICAgIC8vIENsb3NlIGNsYXNzCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgY2xhc3MKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCisgKiBAcGFyYW0gcHJlZml4IFRoZSB2YXJpYWJsZSBuYW1lIG9yIGNvbnRhaW5lciBmb3IgdGhpcyBmaWVsZAorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlwcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAicmVhZEJvb2woKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgInJlYWRJMTYoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgInJlYWRJNjQoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSGF4ZSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGludm9rZXMgcmVhZCgpCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCBnZXRfY2FwX25hbWUodHlwZV9uYW1lKHRzdHJ1Y3QpKSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIHN0cmluZyBvYmo7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG9iaiA9IHRtcCgiX21hcCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG9iaiA9IHRtcCgiX3NldCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9saXN0Iik7CisgIH0KKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpCisgICAgICAgICAgICAgIC8vIHNpemUgdGhlIGNvbGxlY3Rpb24gY29ycmVjdGx5CisgICAgICAgICAgICAgIDw8ICIoIgorICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwgImZvciggIiA8PCBpIDw8ICIgaW4gMCAuLi4gIiA8PCBvYmogPDwgIi5zaXplKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5zZXQoICIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50CisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5hZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEhheGUgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKKyAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9rZXkiKTsKKyAgICBzdHJpbmcgY291bnRlciA9IHRtcCgiX3NpemVDb3VudGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IGNvdW50ZXIgPDwgIiA6IEludCA9IDA7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJmb3IoICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCBjb3VudGVyIDw8ICsiKys7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwQmVnaW4obmV3IFRNYXAoIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8IGNvdW50ZXIgPDwgIikpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEJlZ2luKG5ldyBUU2V0KCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuc2l6ZSkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEJlZ2luKG5ldyBUTGlzdCgiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5sZW5ndGgpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBpdGVyID0gdG1wKCJlbGVtIik7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yKCAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiLmtleXMoKSkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvciggIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi50b0FycmF5KCkpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yKCAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXApIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7CisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiLmdldCgiICsgaXRlciArICIpIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogUmV0dXJucyBhIGhheGUgdHlwZSBuYW1lCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcGFyYW0gY29udGFpbmVyIElzIHRoZSB0eXBlIGdvaW5nIGluc2lkZSBhIGNvbnRhaW5lcj8KKyAqIEByZXR1cm4gaGF4ZSB0eXBlIG5hbWUsIGkuZS4gSGFzaE1hcDxLZXksVmFsdWU+CisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXIsIGJvb2wgaW5faW5pdCkgeworICAodm9pZClpbl9pbml0OworCisgIC8vIHR5cGVkZWZzIGFyZSBqdXN0IHJlc29sdmVkIHRvIHRoZWlyIHJlYWwgdHlwZQorICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBzdHJpbmcgcHJlZml4OworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSwgaW5fY29udGFpbmVyKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJJbnQiOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSogdGtleSA9IGdldF90cnVlX3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7CisgICAgdF90eXBlKiB0dmFsID0gZ2V0X3RydWVfdHlwZSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKTsKKyAgICBpZiAodGtleS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0a2V5KS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAoISh0a2V5LT5pc19iaW5hcnkoKSkpIHsKKyAgICAgICAgICByZXR1cm4gIlN0cmluZ01hcDwgIiArIHR5cGVfbmFtZSh0dmFsKSArICI+IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsgLy8gZGVmYXVsdCB0byBPYmplY3RNYXA8PgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIHJldHVybiAiSW50TWFwPCAiICsgdHlwZV9uYW1lKHR2YWwpICsgIj4iOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJldHVybiAiSW50NjRNYXA8ICIgKyB0eXBlX25hbWUodHZhbCkgKyAiPiI7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsgLy8gZGVmYXVsdCB0byBPYmplY3RNYXA8PgorICAgICAgfQorICAgIH0KKyAgICBpZiAodGtleS0+aXNfZW51bSgpKSB7CisgICAgICByZXR1cm4gIkludE1hcDwgIiArIHR5cGVfbmFtZSh0dmFsKSArICI+IjsKKyAgICB9CisgICAgcmV0dXJuICJPYmplY3RNYXA8ICIgKyB0eXBlX25hbWUodGtleSkgKyAiLCAiICsgdHlwZV9uYW1lKHR2YWwpICsgIj4iOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogdGtleSA9IGdldF90cnVlX3R5cGUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIGlmICh0a2V5LT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXRrZXkpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICghKHRrZXktPmlzX2JpbmFyeSgpKSkgeworICAgICAgICAgIHJldHVybiAiU3RyaW5nU2V0IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsgLy8gZGVmYXVsdCB0byBPYmplY3RTZXQKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICByZXR1cm4gIkludFNldCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmV0dXJuICJJbnQ2NFNldCI7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsgLy8gZGVmYXVsdCB0byBPYmplY3RTZXQKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHRrZXktPmlzX2VudW0oKSkgeworICAgICAgcmV0dXJuICJJbnRTZXQiOworICAgIH0KKyAgICByZXR1cm4gIk9iamVjdFNldDwgIiArIHR5cGVfbmFtZSh0a2V5KSArICI+IjsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF90eXBlKiB0ZWxtID0gKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHJldHVybiAiTGlzdDwgIiArIHR5cGVfbmFtZSh0ZWxtKSArICI+IjsKKyAgfQorCisgIC8vIENoZWNrIGZvciBuYW1lc3BhY2luZworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJoYXhlIik7CisgICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBwYWNrYWdlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGhheGUgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lciBJcyBpdCBnb2luZyBpbiBhIGhheGUgY29udGFpbmVyPworICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUsIGJvb2wgaW5fY29udGFpbmVyKSB7CisgICh2b2lkKWluX2NvbnRhaW5lcjsKKyAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7CisKKyAgc3dpdGNoICh0YmFzZSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgcmV0dXJuICJWb2lkIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICByZXR1cm4gImhheGUuaW8uQnl0ZXMiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIlN0cmluZyI7CisgICAgfQorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuICJCb29sIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIHJldHVybiAiaGF4ZS5JbnQzMiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAiaGF4ZS5JbnQ2NCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiRmxvYXQiOworICBkZWZhdWx0OgorICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSGF4ZSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgIH0KK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0KSB7CisgIC8vIFRPRE8obWNzbGVlKTogZG8gd2UgZXZlciBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkPworICBzdHJpbmcgcmVzdWx0ID0gInZhciAiICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIiA6ICIgKyB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgaWYgKGluaXQpIHsKKyAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICBzdGQ6Om9mc3RyZWFtIGR1bW15OworICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0ICsgIjsiOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9jYWxsYmFjayh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgc3RkOjpzdHJpbmcgb25fZXJyb3Jfc3VjY2VzcyA9ICJvbkVycm9yIDogRHluYW1pYy0+Vm9pZCA9IG51bGwsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfb25zdWNjZXNzKHRmdW5jdGlvbiwgdHJ1ZSwgZmFsc2UpOworCisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50cyA9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaWYgKGFyZ3VtZW50cyAhPSAiIikgeworICAgICAgYXJndW1lbnRzICs9ICIsICI7CisgICAgfQorICAgIGFyZ3VtZW50cyArPSBvbl9lcnJvcl9zdWNjZXNzOyAvLyJvbkVycm9yIDogRnVuY3Rpb24sIG9uU3VjY2VzcyA6IEZ1bmN0aW9uIjsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICJmdW5jdGlvbiAiICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgYXJndW1lbnRzICsgIikgOiBWb2lkIjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfbm9ybWFsKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBzdGQ6OnN0cmluZyBhcmd1bWVudHMgPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0dHlwZTsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgfHwgdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHR0eXBlID0gIlZvaWQiOworICB9IGVsc2UgeworICAgIHJlc3VsdHR5cGUgPSB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICJmdW5jdGlvbiAiICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgYXJndW1lbnRzICsgIikgOiAiICsgcmVzdWx0dHlwZTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgY29tbWEgc2VwYXJhdGVkIGZpZWxkIGxpc3QsIHdpdGggdHlwZSBuYW1lcworICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiA6ICIgKyB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBIYXhlIGNsYXNzIG5hbWVzIG11c3Qgc3RhcnQgd2l0aCB1cHBlcmNhc2UgbGV0dGVyLCBidXQgSGF4ZSBuYW1lc3BhY2VzIG11c3Qgbm90LgorICovCitzdGQ6OnN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgcmV0dXJuIG5hbWU7CisgIH0KKworICAvLyB0ZXN0LmZvci5HZW5lcmljPCBkYXRhLlR5cGUsIG9yLnRoZS5MaWtlPiBhbmQgaGFuZGxlIGl0IHJlY3Vyc2l2ZWx5CisgIHNpemVfdCBnZW5lcmljX2ZpcnN0ID0gbmFtZS5maW5kKCc8Jyk7CisgIHNpemVfdCBnZW5lcmljX2xhc3QgPSBuYW1lLnJmaW5kKCc+Jyk7CisgIGlmICgoZ2VuZXJpY19maXJzdCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgJiYgKGdlbmVyaWNfbGFzdCAhPSBzdGQ6OnN0cmluZzo6bnBvcykpIHsKKyAgICBzdHJpbmcgb3V0ZXJfdHlwZSA9IG5hbWUuc3Vic3RyKDAsIGdlbmVyaWNfZmlyc3QpOworICAgIHN0cmluZyBpbm5lcl90eXBlcyA9IG5hbWUuc3Vic3RyKGdlbmVyaWNfZmlyc3QgKyAxLCBnZW5lcmljX2xhc3QgLSBnZW5lcmljX2ZpcnN0IC0gMSk7CisKKyAgICBzdHJpbmcgbmV3X2lubmVyID0gIiI7CisgICAgc2l6ZV90IGNvbW1hX3N0YXJ0ID0gMDsKKyAgICB3aGlsZSAoY29tbWFfc3RhcnQgPCBpbm5lcl90eXBlcy5sZW5ndGgoKSkgeworICAgICAgc2l6ZV90IGNvbW1hX3BvcyA9IGNvbW1hX3N0YXJ0OworICAgICAgaW50IG5lc3RlZCA9IDA7CisKKyAgICAgIHdoaWxlIChjb21tYV9wb3MgPCBpbm5lcl90eXBlcy5sZW5ndGgoKSkgeworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIHN3aXRjaCAoaW5uZXJfdHlwZXNbY29tbWFfcG9zXSkgeworICAgICAgICBjYXNlICc8JzoKKyAgICAgICAgICArK25lc3RlZDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnPic6CisgICAgICAgICAgLS1uZXN0ZWQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgIGZvdW5kID0gKG5lc3RlZCA9PSAwKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICArK2NvbW1hX3BvczsKKyAgICAgIH0KKworICAgICAgaWYgKG5ld19pbm5lci5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgbmV3X2lubmVyICs9ICIsIjsKKyAgICAgIH0KKworICAgICAgc3RyaW5nIGlubmVyID0gaW5uZXJfdHlwZXMuc3Vic3RyKGNvbW1hX3N0YXJ0LCBjb21tYV9wb3MgLSBjb21tYV9zdGFydCk7CisgICAgICBuZXdfaW5uZXIgKz0gZ2V0X2NhcF9uYW1lKGlubmVyKTsKKyAgICAgIGNvbW1hX3N0YXJ0ID0gKytjb21tYV9wb3M7CisgICAgfQorCisgICAgcmV0dXJuIGdldF9jYXBfbmFtZShvdXRlcl90eXBlKSArICI8IiArIG5ld19pbm5lciArICI+IjsKKyAgfQorCisgIC8vIHBhY2thZ2UgbmFtZQorICBzaXplX3QgaW5kZXggPSBuYW1lLmZpbmRfZmlyc3Rfbm90X29mKCIgXG5cclx0Iik7CisgIGlmIChpbmRleCA8IG5hbWUubGVuZ3RoKCkpIHsKKyAgICBuYW1lW2luZGV4XSA9IHRvbG93ZXIobmFtZVtpbmRleF0pOworICAgIGluZGV4ID0gbmFtZS5maW5kKCcuJyk7CisgICAgd2hpbGUgKGluZGV4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICBpZiAoKytpbmRleCA8IG5hbWUubGVuZ3RoKCkpIHsKKyAgICAgICAgbmFtZVtpbmRleF0gPSB0b2xvd2VyKG5hbWVbaW5kZXhdKTsKKyAgICAgIH0KKyAgICAgIGluZGV4ID0gbmFtZS5maW5kKCcuJywgaW5kZXgpOworICAgIH0KKyAgfQorCisgIC8vIGNsYXNzIG5hbWUKKyAgaW5kZXggPSBuYW1lLnJmaW5kKCcuJyk7CisgIGlmIChpbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICsraW5kZXg7CisgIH0gZWxzZSB7CisgICAgaW5kZXggPSBuYW1lLmZpbmRfZmlyc3Rfbm90X29mKCIgXG5cclx0Iik7CisgIH0KKworICBpZiAoaW5kZXggPCBuYW1lLmxlbmd0aCgpKSB7CisgICAgbmFtZVtpbmRleF0gPSB0b3VwcGVyKG5hbWVbaW5kZXhdKTsKKyAgfQorCisgIHJldHVybiBuYW1lOworfQorCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6Y29uc3RhbnRfbmFtZShzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgY29uc3RhbnRfbmFtZTsKKworICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKKyAgYm9vbCB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGZhbHNlOworICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaXRlciA9IG5hbWUuYmVnaW4oKTsgaXRlciAhPSBuYW1lLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBzdHJpbmc6OnZhbHVlX3R5cGUgY2hhcmFjdGVyID0gKCppdGVyKTsKKworICAgIGJvb2wgaXNfdXBwZXIgPSBpc3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpZiAoaXNfdXBwZXIgJiYgIWlzX2ZpcnN0ICYmICF3YXNfcHJldmlvdXNfY2hhcl91cHBlcikgeworICAgICAgY29uc3RhbnRfbmFtZSArPSAnXyc7CisgICAgfQorICAgIGNvbnN0YW50X25hbWUgKz0gdG91cHBlcihjaGFyYWN0ZXIpOworCisgICAgaXNfZmlyc3QgPSBmYWxzZTsKKyAgICB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGlzX3VwcGVyOworICB9CisKKyAgcmV0dXJuIGNvbnN0YW50X25hbWU7Cit9CisKKy8qKgorICogRW5hYmxlcyBSVFRJIGZvciBhIGNsYXNzIG9yIGludGVyZmFjZQorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihvc3RyZWFtJiBvdXQpIHsKKyAgaWYgKHJ0dGlfKSB7CisgICAgb3V0IDw8ICJAOnJ0dGkiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBBZGRzIGJ1aWxkIG1hY3JvcyB0byBhIGNsYXNzIG9yIGludGVyZmFjZQorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24ob3N0cmVhbSYgb3V0KSB7CisgIGlmICghYnVpbGRtYWNyb18uZW1wdHkoKSkgeworICAgIG91dCA8PCAiI2lmICEgbWFjcm8iIDw8IGVuZGw7CisgICAgb3V0IDw8ICJAOmJ1aWxkKCAiIDw8IGJ1aWxkbWFjcm9fIDw8ICIpIiA8PCBlbmRsOyAgICAgLy8gY3VycmVudCBjbGFzcy9pbnRlcmZhY2UKKyAgICBvdXQgPDwgIkA6YXV0b0J1aWxkKCAiIDw8IGJ1aWxkbWFjcm9fIDw8ICIpIiA8PCBlbmRsOyAvLyBpbmhlcml0ZWQgY2xhc3Nlcy9pbnRlcmZhY2VzCisgICAgb3V0IDw8ICIjZW5kIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogRW1pdHMgYSBoYXhlRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9kb2Mob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgdGRvYy0+Z2V0X2RvYygpLCAiICovXG4iKTsKKyAgfQorfQorCisvKioKKyAqIEVtaXRzIGEgaGF4ZURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfZG9jKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgeworICAgIHN0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOworICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKKyAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IHAtPmdldF9uYW1lKCk7CisgICAgICBpZiAocC0+aGFzX2RvYygpKSB7CisgICAgICAgIHNzIDw8ICIgIiA8PCBwLT5nZXRfZG9jKCk7CisgICAgICB9CisgICAgfQorICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8qKlxuIiwgIiAqICIsIHNzLnN0cigpLCAiICovXG4iKTsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgeworICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOworfQorCitzdGQ6OnN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7CisgIHJldHVybiAiaXMiICsgZ2V0X2NhcF9uYW1lKCJzZXQiKSArIGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSArICIoKSI7Cit9CisKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKKyAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9faXNzZXRfIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6Z2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpIHsKKyAgc3RyaW5nIHBhY2thZ2UgPSAiIjsKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAvKiYmIHByb2dyYW0gIT0gcHJvZ3JhbV8qLykgeworICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJoYXhlIikgKyAiLiI7CisgIH0KKyAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGhheGUsCisgICAgIkhheGUiLAorICAgICIgICAgY2FsbGJhY2tzICAgICAgICBVc2Ugb25FcnJvcigpL29uU3VjY2VzcygpIGNhbGxiYWNrcyBmb3Igc2VydmljZSBtZXRob2RzIChsaWtlIEFTMylcbiIKKyAgICAiICAgIHJ0dGkgICAgICAgICAgICAgRW5hYmxlIEA6cnR0aSBmb3IgZ2VuZXJhdGVkIGNsYXNzZXMgYW5kIGludGVyZmFjZXNcbiIKKyAgICAiICAgIGJ1aWxkbWFjcm89bXkubWFjcm9zLkNsYXNzLm1ldGhvZChhcmdzKVxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBBZGQgQDpidWlsZCBtYWNybyBjYWxscyB0byBnZW5lcmF0ZWQgY2xhc3NlcyBhbmQgaW50ZXJmYWNlc1xuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY2ZDRiMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTcyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKworI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBIYXNrZWxsIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9oc19nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9oc19nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICAvKiBubyBvcHRpb25zIHlldCAqLworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGhzOiIgKyBpdGVyLT5maXJzdDsKKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1ocyI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoZWxwZXIgPSBmYWxzZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfaHNfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF9hcmJpdHJhcnkob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9oc19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9oc190eXBlbWFwKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfaHNfZGVmYXVsdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgbmFtZSA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBhcmcgPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0KTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgYXJnID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0cmluZyBuYW1lID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIGtpdGVyLCBzdHJpbmcgdml0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcik7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0cmluZyBoc19hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgc3RyaW5nIGhzX2xhbmd1YWdlX3ByYWdtYSgpOworICBzdHJpbmcgaHNfaW1wb3J0cygpOworCisgIHN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgc3RyaW5nIGZ1bmN0aW9uX3ByZWZpeCA9ICIiKTsKKworICBzdHJpbmcgZmllbGRfbmFtZShzdHJpbmcgdG5hbWUsIHN0cmluZyBmbmFtZSk7CisKKyAgc3RyaW5nIGZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9ucyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlvID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWV0aG9kID0gZmFsc2UpOworCisgIHN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisKKyAgc3RyaW5nIHR5cGVfdG9fZGVmYXVsdCh0X3R5cGUqIHR0eXBlKTsKKworICBzdHJpbmcgcmVuZGVyX2hzX3R5cGUodF90eXBlKiB0eXBlLCBib29sIG5lZWRzX3BhcmVucyk7CisKKyAgc3RyaW5nIHR5cGVfdG9fY29uc3RydWN0b3IodF90eXBlKiB0dHlwZSk7CisKKyAgc3RyaW5nIHJlbmRlcl9oc190eXBlX2Zvcl9mdW5jdGlvbl9uYW1lKHRfdHlwZSogdHlwZSk7CisKK3ByaXZhdGU6CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9pZmFjZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jbGllbnRfOworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIHBuYW1lID0gY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKTsKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwbmFtZSArICJfVHlwZXMuaHMiOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwbmFtZSArICJfQ29uc3RzLmhzIjsKKyAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl90eXBlc18gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgIm1vZHVsZSAiIDw8IHBuYW1lIDw8ICJfVHlwZXMgd2hlcmUiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOworCisgIGZfY29uc3RzXyA8PCBoc19sYW5ndWFnZV9wcmFnbWEoKSA8PCBlbmRsOworICBmX2NvbnN0c18gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgZl9jb25zdHNfIDw8ICJtb2R1bGUgIiA8PCBwbmFtZSA8PCAiX0NvbnN0cyB3aGVyZSIgPDwgZW5kbDsKKyAgZl9jb25zdHNfIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOworICBmX2NvbnN0c18gPDwgImltcG9ydCAiIDw8IHBuYW1lIDw8ICJfVHlwZXMiIDw8IGVuZGw7Cit9CisKK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6aHNfbGFuZ3VhZ2VfcHJhZ21hKCkgeworICByZXR1cm4gc3RyaW5nKAorICAgICAgInstIyBMQU5HVUFHRSBEZXJpdmVEYXRhVHlwZWFibGUgIy19XG4iCisgICAgICAiey0jIExBTkdVQUdFIERlcml2ZUdlbmVyaWMgIy19XG4iCisgICAgICAiey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzICMtfVxuIgorICAgICAgInstIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tbWlzc2luZy1maWVsZHMgIy19XG4iCisgICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi1taXNzaW5nLXNpZ25hdHVyZXMgIy19XG4iCisgICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi1uYW1lLXNoYWRvd2luZyAjLX1cbiIKKyAgICAgICJ7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLXVudXNlZC1pbXBvcnRzICMtfVxuIgorICAgICAgInstIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tdW51c2VkLW1hdGNoZXMgIy19XG4iKTsKK30KKworLyoqCisgKiBBdXRvZ2VuJ2QgY29tbWVudAorICovCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OmhzX2F1dG9nZW5fY29tbWVudCgpIHsKKyAgcmV0dXJuIHN0cmluZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpCisgICAgICAgICArICItLSBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIikgICAgICAgICAgICAgICAgICAgICAgLS1cbiIKKyAgICAgICAgICsgIi0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tXG4iCisgICAgICAgICArICItLSBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORyAtLVxuIgorICAgICAgICAgKyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCisgKi8KK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6aHNfaW1wb3J0cygpIHsKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgc3RyaW5nIHJlc3VsdCA9IHN0cmluZygKKyAgICAgICJpbXBvcnQgUHJlbHVkZSAoKCQpLCAoLiksICg+Pj0pLCAoPT0pLCAoKyspKVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgUHJlbHVkZSBhcyBQXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBDb250cm9sLkV4Y2VwdGlvbiBhcyBYXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBDb250cm9sLk1vbmFkIGFzIE0gKCBsaWZ0TSwgYXAsIHdoZW4gKVxuIgorICAgICAgImltcG9ydCBEYXRhLkZ1bmN0b3IgKCAoPCQ+KSApXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlNcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaGFibGUgYXMgSFxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5JbnQgYXMgSVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5NYXliZSBhcyBNIChjYXRNYXliZXMpXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLlRleHQuTGF6eS5FbmNvZGluZyBhcyBFICggZGVjb2RlVXRmOCwgZW5jb2RlVXRmOCApXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLlRleHQuTGF6eSBhcyBMVFxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgR0hDLkdlbmVyaWNzIGFzIEcgKEdlbmVyaWMpXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLlR5cGVhYmxlIGFzIFRZICggVHlwZWFibGUgKVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXBcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaFNldCBhcyBTZXRcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuVmVjdG9yIGFzIFZlY3RvclxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgVGVzdC5RdWlja0NoZWNrLkFyYml0cmFyeSBhcyBRQyAoIEFyYml0cmFyeSguLikgKVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgVGVzdC5RdWlja0NoZWNrIGFzIFFDICggZWxlbWVudHMgKVxuIgorICAgICAgIlxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgVGhyaWZ0IGFzIFRcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIFRocmlmdC5UeXBlcyBhcyBUXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBUaHJpZnQuQXJiaXRyYXJpZXMgYXMgVFxuIgorICAgICAgIlxuIik7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkKKyAgICByZXN1bHQgKz0gImltcG9ydCBxdWFsaWZpZWQgIiArIGNhcGl0YWxpemUoaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkpICsgIl9UeXBlc1xuIjsKKworICBpZiAoaW5jbHVkZXMuc2l6ZSgpID4gMCkKKyAgICByZXN1bHQgKz0gIlxuIjsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcworICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIC8vIENsb3NlIHR5cGVzIGZpbGUKKyAgZl90eXBlc18uY2xvc2UoKTsKKyAgZl9jb25zdHNfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gRXouCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIHN0cmluZyB0bmFtZSA9IGNhcGl0YWxpemUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKTsKKyAgc3RyaW5nIHRkZWYgPSByZW5kZXJfaHNfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSwgZmFsc2UpOworICBpbmRlbnQoZl90eXBlc18pIDw8ICJ0eXBlICIgPDwgdG5hbWUgPDwgIiA9ICIgPDwgdGRlZiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuCisgKiB0aGUgdmFsdWVzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGluZGVudChmX3R5cGVzXykgPDwgImRhdGEgIiA8PCBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiID0gIjsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICBmX3R5cGVzXyA8PCAoZmlyc3QgPyAiIiA6ICJ8Iik7CisgICAgZl90eXBlc18gPDwgbmFtZTsKKyAgICBmaXJzdCA9IGZhbHNlOworICB9CisgIGluZGVudChmX3R5cGVzXykgPDwgImRlcml2aW5nIChQLlNob3csIFAuRXEsIEcuR2VuZXJpYywgVFkuVHlwZWFibGUsIFAuT3JkLCBQLkJvdW5kZWQpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpOworCisgIGluZGVudChmX3R5cGVzXykgPDwgImluc3RhbmNlIFAuRW51bSAiIDw8IGVuYW1lIDw8ICIgd2hlcmUiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl90eXBlc18pIDw8ICJmcm9tRW51bSB0ID0gY2FzZSB0IG9mIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgIGluZGVudChmX3R5cGVzXykgPDwgbmFtZSA8PCAiIC0+ICIgPDwgdmFsdWUgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl90eXBlc18pIDw8ICJ0b0VudW0gdCA9IGNhc2UgdCBvZiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICBpbmRlbnQoZl90eXBlc18pIDw8IHZhbHVlIDw8ICIgLT4gIiA8PCBuYW1lIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAiXyAtPiBYLnRocm93IFQuVGhyaWZ0RXhjZXB0aW9uIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChmX3R5cGVzXykgPDwgImluc3RhbmNlIEguSGFzaGFibGUgIiA8PCBlbmFtZSA8PCAiIHdoZXJlIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAiaGFzaFdpdGhTYWx0IHNhbHQgPSBILmhhc2hXaXRoU2FsdCBzYWx0IFAuLiBQLmZyb21FbnVtIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChmX3R5cGVzXykgPDwgImluc3RhbmNlIFFDLkFyYml0cmFyeSAiIDw8IGVuYW1lIDw8ICIgd2hlcmUiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl90eXBlc18pIDw8ICJhcmJpdHJhcnkgPSBRQy5lbGVtZW50cyAoUC5lbnVtRnJvbVRvIFAubWluQm91bmQgUC5tYXhCb3VuZCkiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0Y29uc3QtPmdldF9uYW1lKCkpOworCisgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKKworICBpbmRlbnQoZl9jb25zdHNfKSA8PCBuYW1lIDw8ICIgOjogIiA8PCByZW5kZXJfaHNfdHlwZSh0eXBlLCBmYWxzZSkgPDwgZW5kbDsKKyAgaW5kZW50KGZfY29uc3RzXykgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8IGVuZGw7CisgIGZfY29uc3RzXyA8PCBlbmRsOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgcmV0dXJuIHR5cGVfdG9fZGVmYXVsdCh0eXBlKTsKKworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgb3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAiUC5UcnVlIiA6ICJQLkZhbHNlIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgIigiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgIigiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiKCIgPDwgdmFsdWUtPmdldF9kb3VibGUoKSA8PCAiKSI7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICB0X2VudW0qIHRlbnVtID0gKHRfZW51bSopdHlwZTsKKyAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgICBmb3IgKHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7CisgICAgICAgICArK2NfaXRlcikgeworICAgICAgaW50IHZhbCA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgICBpZiAodmFsID09IHZhbHVlLT5nZXRfaW50ZWdlcigpKSB7CisgICAgICAgIHRfcHJvZ3JhbSogcHJvZyA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgICAgICAgIGlmIChwcm9nICE9IE5VTEwgJiYgcHJvZyAhPSBwcm9ncmFtXykKKyAgICAgICAgICBvdXQgPDwgY2FwaXRhbGl6ZShwcm9nLT5nZXRfbmFtZSgpKSA8PCAiX1R5cGVzLiI7CisgICAgICAgIG91dCA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBzdHJpbmcgY25hbWUgPSB0eXBlX25hbWUodHlwZSk7CisgICAgb3V0IDw8ICJkZWZhdWx0XyIgPDwgY25hbWUgPDwgInsiOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXIgPSB2YWwuYmVnaW4oKTsKKyAgICAgICAgIHZfaXRlciAhPSB2YWwuZW5kKCk7CisgICAgICAgICArK3ZfaXRlcikgeworICAgICAgdF9maWVsZCogZmllbGQgPSBOVUxMOworCisgICAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOworICAgICAgICAgICArK2ZfaXRlcikKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpCisgICAgICAgICAgZmllbGQgPSAoKmZfaXRlcik7CisKKyAgICAgIGlmIChmaWVsZCA9PSBOVUxMKQorICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIGNuYW1lICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKworICAgICAgc3RyaW5nIGZuYW1lID0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgc3RyaW5nIGNvbnN0X3ZhbHVlID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkLT5nZXRfdHlwZSgpLCB2X2l0ZXItPnNlY29uZCk7CisKKyAgICAgIG91dCA8PCAoZmlyc3QgPyAiIiA6ICIsICIpOworICAgICAgb3V0IDw8IGZpZWxkX25hbWUoY25hbWUsIGZuYW1lKSA8PCAiID0gIjsKKyAgICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwgKCh0X3R5cGUqKWZpZWxkLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBvdXQgPDwgIlAuSnVzdCAiOworICAgICAgfQorICAgICAgb3V0IDw8IGNvbnN0X3ZhbHVlOworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisKKyAgICBvdXQgPDwgIn0iOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgb3V0IDw8ICIoTWFwLmZyb21MaXN0IFsiOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgb3V0IDw8IChmaXJzdCA/ICIiIDogIiwiKTsKKyAgICAgIG91dCA8PCAiKCIgPDwga2V5IDw8ICIsIiA8PCB2YWwgPDwgIikiOworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgb3V0IDw8ICJdKSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gdHlwZS0+aXNfbGlzdCgpID8gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGlmICh0eXBlLT5pc19zZXQoKSkKKyAgICAgIG91dCA8PCAiKFNldC5mcm9tTGlzdCBbIjsKKyAgICBlbHNlCisgICAgICBvdXQgPDwgIihWZWN0b3IuZnJvbUxpc3QgWyI7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0IDw8IChmaXJzdCA/ICIiIDogIiwiKTsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisKKyAgICBvdXQgPDwgIl0pIjsKKworICB9IGVsc2UgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSAic3RydWN0IgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfaHNfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0LCBidXQgYWxzbyBoYXMgYW4gZXhjZXB0aW9uIGRlY2xhcmF0aW9uLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfaHNfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgSGFza2VsbCBzdHJ1Y3QKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGVscGVyKSB7CisgICh2b2lkKWhlbHBlcjsKKyAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIGluZGVudChvdXQpIDw8ICJkYXRhICIgPDwgdG5hbWUgPDwgIiA9ICIgPDwgdG5hbWU7CisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7CisgICAgICAgICArK21faXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ7ICI7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiLCAiOworICAgICAgfQorICAgICAgc3RyaW5nIG1uYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgb3V0IDw8IGZpZWxkX25hbWUodG5hbWUsIG1uYW1lKSA8PCAiIDo6ICI7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAgIHx8ICgodF90eXBlKikoKm1faXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIG91dCA8PCAiUC5NYXliZSAiOworICAgICAgfQorICAgICAgb3V0IDw8IHJlbmRlcl9oc190eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBvdXQgPDwgIiBkZXJpdmluZyAoUC5TaG93LFAuRXEsRy5HZW5lcmljLFRZLlR5cGVhYmxlKSIgPDwgZW5kbDsKKworICBpZiAoaXNfZXhjZXB0aW9uKQorICAgIG91dCA8PCAiaW5zdGFuY2UgWC5FeGNlcHRpb24gIiA8PCB0bmFtZSA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJpbnN0YW5jZSBILkhhc2hhYmxlICIgPDwgdG5hbWUgPDwgIiB3aGVyZSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJoYXNoV2l0aFNhbHQgc2FsdCByZWNvcmQgPSBzYWx0IjsKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOworICAgICAgICsrbV9pdGVyKSB7CisgICAgc3RyaW5nIG1uYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGluZGVudChvdXQpIDw8ICIgYEguaGFzaFdpdGhTYWx0YCAiIDw8IGZpZWxkX25hbWUodG5hbWUsIG1uYW1lKSA8PCAiIHJlY29yZCI7CisgIH0KKyAgaW5kZW50KG91dCkgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBnZW5lcmF0ZV9oc19zdHJ1Y3RfYXJiaXRyYXJ5KG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2hzX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfaHNfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9oc190eXBlbWFwKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2hzX2RlZmF1bHQob3V0LCB0c3RydWN0KTsKK30KKwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0X2FyYml0cmFyeShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICBpbmRlbnQob3V0KSA8PCAiaW5zdGFuY2UgUUMuQXJiaXRyYXJ5ICIgPDwgdG5hbWUgPDwgIiB3aGVyZSAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50KG91dCkgPDwgImFyYml0cmFyeSA9IE0ubGlmdE0gIiA8PCB0bmFtZTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7CisgICAgICAgICArK21faXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIG91dCA8PCAiICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiYE0uYXBgIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiKCI7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAgIHx8ICgodF90eXBlKikoKm1faXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIG91dCA8PCAiTS5saWZ0TSBQLkp1c3QgIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiUUMuYXJiaXRyYXJ5KSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIC8vIFNocmluaworICAgIGluZGVudChvdXQpIDw8ICJzaHJpbmsgb2JqIHwgb2JqID09IGRlZmF1bHRfIiA8PCB0bmFtZSA8PCAiID0gW10iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgICAgICAgICAgfCBQLm90aGVyd2lzZSA9IE0uY2F0TWF5YmVzIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7CisgICAgICAgICArK21faXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJbICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiLCAiOworICAgICAgfQorICAgICAgc3RyaW5nIGZuYW1lID0gZmllbGRfbmFtZSh0bmFtZSwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIG91dCA8PCAiaWYgb2JqID09IGRlZmF1bHRfIiA8PCB0bmFtZTsKKyAgICAgIG91dCA8PCAieyIgPDwgZm5hbWUgPDwgIiA9ICIgPDwgZm5hbWUgPDwgIiBvYmp9ICI7CisgICAgICBvdXQgPDwgInRoZW4gUC5Ob3RoaW5nICI7CisgICAgICBvdXQgPDwgImVsc2UgUC5KdXN0ICQgZGVmYXVsdF8iIDw8IHRuYW1lOworICAgICAgb3V0IDw8ICJ7IiA8PCBmbmFtZSA8PCAiID0gIiA8PCBmbmFtZSA8PCAiIG9ian0iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJdIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSB7IC8qIDAgPT0gbWVtYmVycy5zaXplKCkgKi8KKyAgICBpbmRlbnQob3V0KSA8PCAiYXJiaXRyYXJ5ID0gUUMuZWxlbWVudHMgWyIgPDwgdG5hbWUgPDwgIl0iIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHJlYWQgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICBzdHJpbmcgc25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIHN0cmluZyBpZCA9IHRtcCgiX2lkIik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKworICBpbmRlbnQob3V0KSA8PCAidG9fIiA8PCBzbmFtZSA8PCAiIDo6IFQuVGhyaWZ0VmFsIC0+ICIgPDwgc25hbWUgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRvXyIgPDwgc25hbWUgPDwgIiAoVC5UU3RydWN0IGZpZWxkcykgPSAiIDw8IHNuYW1lIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbnQzMl90IGtleSA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOworICAgIHN0cmluZyBldHlwZSA9IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIHN0cmluZyBmbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIEZpbGwgaW4gRmllbGQKKyAgICBpbmRlbnQob3V0KSA8PCBmaWVsZF9uYW1lKHNuYW1lLCBmbmFtZSkgPDwgIiA9ICI7CisKKyAgICBvdXQgPDwgIlAubWF5YmUgKCI7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIG91dCA8PCAiUC5lcnJvciBcIk1pc3NpbmcgcmVxdWlyZWQgZmllbGQ6ICIgPDwgZm5hbWUgPDwgIlwiIjsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgICAgIHx8ICgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSAmJiAoKmZfaXRlciktPmdldF92YWx1ZSgpID09IE5VTEwpIHsKKyAgICAgICAgb3V0IDw8ICJQLk5vdGhpbmciOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IGZpZWxkX25hbWUoc25hbWUsIGZuYW1lKSA8PCAiIGRlZmF1bHRfIiA8PCBzbmFtZTsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICIpICI7CisKKyAgICBvdXQgPDwgIihcXChfLCIgPDwgdmFsIDw8ICIpIC0+ICI7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgfHwgKCh0X3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpCisgICAgICBvdXQgPDwgIlAuSnVzdCAiOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgdmFsKTsKKyAgICBvdXQgPDwgIikiOworICAgIG91dCA8PCAiIChNYXAubG9va3VwICgiIDw8IGtleSA8PCAiKSBmaWVsZHMpIjsKKyAgfQorCisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyByZWFkCisgIHN0cmluZyB0bWFwID0gdHlwZV9uYW1lKHRzdHJ1Y3QsICJ0eXBlbWFwXyIpOworICBpbmRlbnQob3V0KSA8PCAidG9fIiA8PCBzbmFtZSA8PCAiIF8gPSBQLmVycm9yIFwibm90IGEgc3RydWN0XCIiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInJlYWRfIiA8PCBzbmFtZSA8PCAiIDo6IFQuUHJvdG9jb2wgcCA9PiBwIC0+IFAuSU8gIiA8PCBzbmFtZQorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmVhZF8iIDw8IHNuYW1lIDw8ICIgaXByb3QgPSB0b18iIDw8IHNuYW1lOworICBvdXQgPDwgIiA8JD4gVC5yZWFkVmFsIGlwcm90IChULlRfU1RSVUNUICIgPDwgdG1hcCA8PCAiKSIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiZGVjb2RlXyIgPDwgc25hbWUKKyAgICAgICAgICAgICAgPDwgIiA6OiBULlN0YXRlbGVzc1Byb3RvY29sIHAgPT4gcCAtPiBMQlMuQnl0ZVN0cmluZyAtPiAiIDw8IHNuYW1lIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJkZWNvZGVfIiA8PCBzbmFtZSA8PCAiIGlwcm90IGJzID0gdG9fIiA8PCBzbmFtZSA8PCAiICQgIjsKKyAgb3V0IDw8ICJULmRlc2VyaWFsaXplVmFsIGlwcm90IChULlRfU1RSVUNUICIgPDwgdG1hcCA8PCAiKSBicyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgc3RyaW5nIHN0ciA9IHRtcCgiX3N0ciIpOworICBzdHJpbmcgZiA9IHRtcCgiX2YiKTsKKyAgc3RyaW5nIHYgPSB0bXAoIl92Iik7CisKKyAgaW5kZW50KG91dCkgPDwgImZyb21fIiA8PCBuYW1lIDw8ICIgOjogIiA8PCBuYW1lIDw8ICIgLT4gVC5UaHJpZnRWYWwiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJmcm9tXyIgPDwgbmFtZSA8PCAiIHJlY29yZCA9IFQuVFN0cnVjdCAkIE1hcC5mcm9tTGlzdCAiOworICBpbmRlbnRfdXAoKTsKKworICAvLyBHZXQgRXhjZXB0aW9ucworICBib29sIGhhc0V4biA9IGZhbHNlOworICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKHRfdHlwZSopKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgaGFzRXhuID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGJvb2wgaXNmaXJzdCA9IHRydWU7CisgIGlmIChoYXNFeG4pIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiKGxldCBleG5zID0gTS5jYXRNYXliZXMgIjsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOworICAgICAgICAgKytmX2l0ZXIpIHsKKyAgICAgIGlmICgoKHRfdHlwZSopKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBpZiAoaXNmaXJzdCkgeworICAgICAgICAgIG91dCA8PCAiWyAiOworICAgICAgICAgIGlzZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBzdHJpbmcgbW5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIGludDMyX3Qga2V5ID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7CisgICAgICAgIG91dCA8PCAiKFxcIiA8PCB2IDw8ICIgLT4gKCIgPDwga2V5IDw8ICIsIChcIiIgPDwgbW5hbWUgPDwgIlwiLCI7CisgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG91dCwgKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCB2KTsKKyAgICAgICAgb3V0IDw8ICIpKSkgPCQ+ICIgPDwgZmllbGRfbmFtZShuYW1lLCBtbmFtZSkgPDwgIiByZWNvcmQiOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWlzZmlyc3QpIHsKKyAgICAgIG91dCA8PCAiXSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaW4gaWYgUC5ub3QgKFAubnVsbCBleG5zKSB0aGVuIGV4bnMgZWxzZSAiOworICAgIGluZGVudF91cCgpOworICB9IGVsc2UgeworICAgIG91dCA8PCAiJCAiOworICB9CisKKyAgb3V0IDw8ICJNLmNhdE1heWJlcyIgPDwgZW5kbDsKKyAgLy8gR2V0IHRoZSBSZXN0CisgIGlzZmlyc3QgPSB0cnVlOworICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgorICAgIGlmIChpc2ZpcnN0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiWyAiOworICAgICAgaXNmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiLCAiOworICAgIH0KKyAgICBzdHJpbmcgbW5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgaW50MzJfdCBrZXkgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKKyAgICBvdXQgPDwgIihcXCI7CisgICAgb3V0IDw8IHYgPDwgIiAtPiAiOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgICYmICEoKHRfdHlwZSopKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgb3V0IDw8ICJQLkp1c3QgIjsKKyAgICB9CisgICAgb3V0IDw8ICIoIiA8PCBrZXkgPDwgIiwgKFwiIiA8PCBtbmFtZSA8PCAiXCIsIjsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvdXQsICgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgdik7CisgICAgb3V0IDw8ICIpKSkgIjsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAmJiAhKCh0X3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIG91dCA8PCAiJCI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiPCQ+IjsKKyAgICB9CisgICAgb3V0IDw8ICIgIiA8PCBmaWVsZF9uYW1lKG5hbWUsIG1uYW1lKSA8PCAiIHJlY29yZCIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIGlmIChpc2ZpcnN0KSB7CisgICAgaW5kZW50KG91dCkgPDwgIltdIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJdIiA8PCBlbmRsOworICB9CisgIGlmIChoYXNFeG4pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gd3JpdGUKKyAgaW5kZW50KG91dCkgPDwgIndyaXRlXyIgPDwgbmFtZSA8PCAiIDo6IFQuUHJvdG9jb2wgcCA9PiBwIC0+ICIgPDwgbmFtZQorICAgICAgICAgICAgICA8PCAiIC0+IFAuSU8gKCkiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ3cml0ZV8iIDw8IG5hbWUgPDwgIiBvcHJvdCByZWNvcmQgPSBULndyaXRlVmFsIG9wcm90ICQgZnJvbV8iOworICBvdXQgPDwgbmFtZSA8PCAiIHJlY29yZCIgPDwgZW5kbDsKKworICAvLyBlbmNvZGUKKyAgaW5kZW50KG91dCkgPDwgImVuY29kZV8iIDw8IG5hbWUgPDwgIiA6OiBULlN0YXRlbGVzc1Byb3RvY29sIHAgPT4gcCAtPiAiIDw8IG5hbWUKKyAgICAgICAgICAgICAgPDwgIiAtPiBMQlMuQnl0ZVN0cmluZyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImVuY29kZV8iIDw8IG5hbWUgPDwgIiBvcHJvdCByZWNvcmQgPSBULnNlcmlhbGl6ZVZhbCBvcHJvdCAkICI7CisgIG91dCA8PCAiZnJvbV8iIDw8IG5hbWUgPDwgIiByZWNvcmQiIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pICsgIi5ocyI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXyA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSA8PCAiIHdoZXJlIiA8PCBlbmRsOworICBmX3NlcnZpY2VfIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgeworICAgIGZfc2VydmljZV8gPDwgImltcG9ydCBxdWFsaWZpZWQgIiA8PCBjYXBpdGFsaXplKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX1R5cGVzIiA8PCBlbmRsOworICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgcXVhbGlmaWVkICIgPDwgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSA8PCAiX0lmYWNlIGFzIElmYWNlIiA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlCisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCisgIGZfc2VydmljZV8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi0tIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMgLS0iIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfaHNfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIGZpZWxkX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpLCAicmVzdWx0IikpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworCisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworCisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKworICBnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgdGhlIG1hcCBmcm9tIGZpZWxkIG5hbWVzIHRvICh0eXBlLCBpZCkKKyAqIEBwYXJhbSB0c3RydWN0IHRoZSBTdHJ1Y3QKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfdHlwZW1hcChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKworICBpbmRlbnQob3V0KSA8PCAidHlwZW1hcF8iIDw8IG5hbWUgPDwgIiA6OiBULlR5cGVNYXAiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0eXBlbWFwXyIgPDwgbmFtZSA8PCAiID0gTWFwLmZyb21MaXN0IFsiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgbW5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgaWYgKCFmaXJzdCkgeworICAgICAgb3V0IDw8ICIsIjsKKyAgICB9CisKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaW50MzJfdCBrZXkgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKKyAgICBvdXQgPDwgIigiIDw8IGtleSA8PCAiLChcIiIgPDwgbW5hbWUgPDwgIlwiLCIgPDwgdHlwZV90b19lbnVtKHR5cGUpIDw8ICIpKSI7CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgfQorICBvdXQgPDwgIl0iIDw8IGVuZGw7Cit9CisKKy8qKgorICogZ2VuZXJhdGUgdGhlIHN0cnVjdCB3aXRoIGRlZmF1bHQgdmFsdWVzIGZpbGxlZCBpbgorICogQHBhcmFtIHRzdHJ1Y3QgdGhlIFN0cnVjdAorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19kZWZhdWx0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIHN0cmluZyBmbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0LCAiZGVmYXVsdF8iKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisKKyAgaW5kZW50KG91dCkgPDwgZm5hbWUgPDwgIiA6OiAiIDw8IG5hbWUgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZm5hbWUgPDwgIiA9ICIgPDwgbmFtZSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBtbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSAoKmZfaXRlciktPmdldF92YWx1ZSgpOworICAgIGluZGVudChvdXQpIDw8IGZpZWxkX25hbWUobmFtZSwgbW5hbWUpIDw8ICIgPSAiOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgIHx8ICgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBvdXQgPDwgIlAuTm90aGluZyI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIlAuSnVzdCAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOworICAgIH0KKyAgfQorICBvdXQgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZl9pZmFjZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiX0lmYWNlLmhzIjsKKyAgZl9pZmFjZV8ub3BlbihmX2lmYWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9pZmFjZV8gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKKyAgZl9pZmFjZV8gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKworICBmX2lmYWNlXyA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSA8PCAiX0lmYWNlIHdoZXJlIiA8PCBlbmRsOworCisgIGZfaWZhY2VfIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOworICBmX2lmYWNlXyA8PCAiaW1wb3J0ICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX1R5cGVzIiA8PCBlbmRsOworICBmX2lmYWNlXyA8PCBlbmRsOworCisgIHN0cmluZyBzbmFtZSA9IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXyk7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgc3RyaW5nIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworCisgICAgaW5kZW50KGZfaWZhY2VfKSA8PCAiaW1wb3J0ICIgPDwgZXh0ZW5kcyA8PCAiX0lmYWNlIiA8PCBlbmRsOworICAgIGluZGVudChmX2lmYWNlXykgPDwgImNsYXNzICIgPDwgZXh0ZW5kcyA8PCAiX0lmYWNlIGEgPT4gIiA8PCBzbmFtZSA8PCAiX0lmYWNlIGEgd2hlcmUiIDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9pZmFjZV8pIDw8ICJjbGFzcyAiIDw8IHNuYW1lIDw8ICJfSWZhY2UgYSB3aGVyZSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdCA9IGZ1bmN0aW9uX3R5cGUoKmZfaXRlciwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgaW5kZW50KGZfaWZhY2VfKSA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDo6IGEgLT4gIiA8PCBmdCA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9pZmFjZV8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLiBOb3RlIHRoYXQgaW4gSGFza2VsbCwgdGhlIGNsaWVudCBkb2Vzbid0IGltcGxlbWVudCBpZmFjZS4KKyAqVGhpcyBpcyBiZWNhdXNlCisgKiBUaGUgY2xpZW50IGRvZXMgbm90IChhbmQgc2hvdWxkIG5vdCBoYXZlIHRvKSBkZWFsIHdpdGggYXJndW1lbnRzIGJlaW5nIE5vdGhpbmcuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZl9jbGllbnRfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pICsgIl9DbGllbnQuaHMiOworICBmX2NsaWVudF8ub3BlbihmX2NsaWVudF9uYW1lLmNfc3RyKCkpOworICBmX2NsaWVudF8gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKKyAgZl9jbGllbnRfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4cG9ydHMgPSAiIjsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBleHBvcnRzICs9IChmaXJzdCA/ICIiIDogIiwiKTsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBleHBvcnRzICs9IGRlY2FwaXRhbGl6ZShmdW5uYW1lKTsKKyAgICBmaXJzdCA9IGZhbHNlOworICB9CisKKyAgc3RyaW5nIHNuYW1lID0gY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKTsKKyAgaW5kZW50KGZfY2xpZW50XykgPDwgIm1vZHVsZSAiIDw8IHNuYW1lIDw8ICJfQ2xpZW50KCIgPDwgZXhwb3J0cyA8PCAiKSB3aGVyZSIgPDwgZW5kbDsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJpbXBvcnQgIiA8PCBleHRlbmRzIDw8ICJfQ2xpZW50IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KGZfY2xpZW50XykgPDwgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5JT1JlZiBhcyBSIiA8PCBlbmRsOworICBpbmRlbnQoZl9jbGllbnRfKSA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKKyAgaW5kZW50KGZfY2xpZW50XykgPDwgImltcG9ydCAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl9UeXBlcyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfY2xpZW50XykgPDwgImltcG9ydCAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgZW5kbDsKKworICAvLyBEQVRTIFJJVEUgQSBHTE9CQUwgVkFSCisgIGluZGVudChmX2NsaWVudF8pIDw8ICJzZXFpZCA9IFIubmV3SU9SZWYgMCIgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICBzdHJpbmcgZmFyZ3MgPSAiIjsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikKKyAgICAgIGZhcmdzICs9ICIgYXJnXyIgKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCBkZWNhcGl0YWxpemUoZnVubmFtZSkgPDwgIiAoaXAsb3ApIiA8PCBmYXJncyA8PCAiID0gZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIgb3AiIDw8IGZhcmdzOworCisgICAgZl9jbGllbnRfIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpCisgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIiBpcCIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIiBvcCIgPDwgZmFyZ3MgPDwgIiA9IGRvIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInNlcSA8LSBzZXFpZCIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VxbiA8LSBSLnJlYWRJT1JlZiBzZXEiIDw8IGVuZGw7CisgICAgc3RyaW5nIGFyZ3NuYW1lID0gY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKKyAgICBzdHJpbmcgZm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgc3RyaW5nIG1zZ1R5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlQuTV9PTkVXQVkiIDogIlQuTV9DQUxMIjsKKyAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiVC53cml0ZU1lc3NhZ2Ugb3AgKFwiIiA8PCBmbmFtZSA8PCAiXCIsICIgPDwgbXNnVHlwZSA8PCAiLCBzZXFuKSAkIgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIndyaXRlXyIgPDwgYXJnc25hbWUgPDwgIiBvcCAoIiA8PCBhcmdzbmFtZSA8PCAieyI7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsKKyAgICAgICAgICsrZmxkX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBmaWVsZG5hbWUgPSAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGZfY2xpZW50XyA8PCAoZmlyc3QgPyAiIiA6ICIsIik7CisgICAgICBmX2NsaWVudF8gPDwgZmllbGRfbmFtZShhcmdzbmFtZSwgZmllbGRuYW1lKSA8PCAiPSI7CisgICAgICBpZiAoKCpmbGRfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgICAgfHwgKCh0X3R5cGUqKSgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkKKyAgICAgICAgZl9jbGllbnRfIDw8ICJQLkp1c3QgIjsKKyAgICAgIGZfY2xpZW50XyA8PCAiYXJnXyIgPDwgZmllbGRuYW1lOworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgZl9jbGllbnRfIDw8ICJ9KSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKworICAgICAgc3RyaW5nIGZ1bm5hbWUgPSBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCBmdW5uYW1lLCAmbm9hcmdzKTsKKworICAgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgZnVubmFtZSA8PCAiIGlwID0gZG8iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIlQucmVhZE1lc3NhZ2UgaXAgJCBcXChmbmFtZSwgbXR5cGUsIHJzZXFpZCkgLT4gZG8iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJNLndoZW4gKG10eXBlID09IFQuTV9FWENFUFRJT04pICQgZG8geyBleG4gPC0gVC5yZWFkQXBwRXhuIGlwIDsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlgudGhyb3cgZXhuIH0iIDw8IGVuZGw7CisKKyAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJyZXMgPC0gcmVhZF8iIDw8IHJlc3VsdG5hbWUgPDwgIiBpcCIgPDwgZW5kbDsKKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKworICAgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsKKyAgICAgICAgICAgKyt4X2l0ZXIpIHsKKyAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIlAubWF5YmUgKFAucmV0dXJuICgpKSBYLnRocm93ICgiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkX25hbWUocmVzdWx0bmFtZSwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIHJlcykiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJQLnJldHVybiAkICIgPDwgZmllbGRfbmFtZShyZXN1bHRuYW1lLCAic3VjY2VzcyIpIDw8ICIgcmVzIiA8PCBlbmRsOworICAgICAgZWxzZQorICAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiUC5yZXR1cm4gKCkiIDw8IGVuZGw7CisKKyAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgIH0KKworICBmX2NsaWVudF8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKQorICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY18gaGFuZGxlciAoaXByb3Qsb3Byb3QpIChuYW1lLHR5cCxzZXFpZCkgPSBjYXNlIG5hbWUgb2YiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiXCIiIDw8IGZuYW1lIDw8ICJcIiAtPiBwcm9jZXNzXyIgPDwgZGVjYXBpdGFsaXplKGZuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIChzZXFpZCxpcHJvdCxvcHJvdCxoYW5kbGVyKSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiXyAtPiAiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGZfc2VydmljZV8gPDwgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKQorICAgICAgICAgICAgICAgPDwgIi5wcm9jXyBoYW5kbGVyIChpcHJvdCxvcHJvdCkgKG5hbWUsdHlwLHNlcWlkKSIgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgImRvIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiXyA8LSBULnJlYWRWYWwgaXByb3QgKFQuVF9TVFJVQ1QgTWFwLmVtcHR5KSIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlIG9wcm90IChuYW1lLFQuTV9FWENFUFRJT04sc2VxaWQpICQiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlQXBwRXhuIG9wcm90IChULkFwcEV4biBULkFFX1VOS05PV05fTUVUSE9EIChcIlVua25vd24gZnVuY3Rpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgKysgTFQudW5wYWNrIG5hbWUpKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworCisgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzIGhhbmRsZXIgKGlwcm90LCBvcHJvdCkgPSBkbyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULnJlYWRNZXNzYWdlIGlwcm90ICgiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBwcm9jXyBoYW5kbGVyIChpcHJvdCxvcHJvdCkpIiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlAucmV0dXJuIFAuVHJ1ZSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworYm9vbCBoYXNOb0FyZ3VtZW50cyh0X2Z1bmN0aW9uKiBmdW5jKSB7CisgIHJldHVybiAoZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpKTsKK30KKworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpyZW5kZXJfaHNfdHlwZV9mb3JfZnVuY3Rpb25fbmFtZSh0X3R5cGUqIHR5cGUpIHsKKyAgc3RyaW5nIHR5cGVfc3RyID0gcmVuZGVyX2hzX3R5cGUodHlwZSwgZmFsc2UpOworICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGZvdW5kID0gLTE7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBmb3VuZCA9IHR5cGVfc3RyLmZpbmRfZmlyc3Rfb2YoIltdLiAiLCBmb3VuZCArIDEpOworICAgIGlmIChzdHJpbmc6Om5wb3MgPT0gc2l6ZV90KGZvdW5kKSkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHR5cGVfc3RyW2ZvdW5kXSA9PSAnLicpCisgICAgICB0eXBlX3N0cltmb3VuZF0gPSAnXyc7CisgICAgZWxzZQorICAgICAgdHlwZV9zdHJbZm91bmRdID0gJ1onOworICB9CisgIHJldHVybiB0eXBlX3N0cjsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0c2VydmljZTsKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBzdHJpbmcgZnVubmFtZSA9IGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb2Nlc3NfIiA8PCBmdW5uYW1lIDw8ICIgKHNlcWlkLCBpcHJvdCwgb3Byb3QsIGhhbmRsZXIpID0gZG8iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBhcmdzbmFtZSA9IGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9yZXN1bHQiOworCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJhcmdzIDwtIHJlYWRfIiA8PCBhcmdzbmFtZSA8PCAiIGlwcm90IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIHNpemVfdCBuID0geGNlcHRpb25zLnNpemUoKSArIDE7CisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKG4gPiAwKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKFguY2F0Y2giIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgIH0KKworICBpZiAobiA+IDApIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIihkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXyk7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKKyAgICBmX3NlcnZpY2VfIDw8ICJ2YWwgPC0gIjsKKworICBmX3NlcnZpY2VfIDw8ICJJZmFjZS4iIDw8IGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIgaGFuZGxlciI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIGZfc2VydmljZV8gPDwgIiAoIiA8PCBmaWVsZF9uYW1lKGFyZ3NuYW1lLCAoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgYXJncykiOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJsZXQgcmVzID0gZGVmYXVsdF8iIDw8IHJlc3VsdG5hbWUgPDwgInsiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkX25hbWUocmVzdWx0bmFtZSwgInN1Y2Nlc3MiKSA8PCAiID0gdmFsfSI7CisKKyAgfSBlbHNlIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImxldCByZXMgPSBkZWZhdWx0XyIgPDwgcmVzdWx0bmFtZTsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlAucmV0dXJuICgpIjsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlIG9wcm90IChcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgVC5NX1JFUExZLCBzZXFpZCkgJCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIndyaXRlXyIgPDwgcmVzdWx0bmFtZSA8PCAiIG9wcm90IHJlcyI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBpZiAobiA+IDApIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIpIjsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAobiA+IDApIHsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoXFxlICAtPiBkbyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJsZXQgcmVzID0gZGVmYXVsdF8iIDw8IHJlc3VsdG5hbWUgPDwgInsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lKHJlc3VsdG5hbWUsICgqeF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9IFAuSnVzdCBlfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZU1lc3NhZ2Ugb3Byb3QgKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgVC5NX1JFUExZLCBzZXFpZCkgJCIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAid3JpdGVfIiA8PCByZXN1bHRuYW1lIDw8ICIgb3Byb3QgcmVzIjsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUC5yZXR1cm4gKCkiOworICAgICAgfQorCisgICAgICBmX3NlcnZpY2VfIDw8ICIpKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigoXFxfIC0+IGRvIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlIG9wcm90IChcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCBULk1fRVhDRVBUSU9OLCBzZXFpZCkgJCIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlQXBwRXhuIG9wcm90IChULkFwcEV4biBULkFFX1VOS05PV04gXCJcIikiOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJQLnJldHVybiAoKSI7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCAiKSA6OiBYLlNvbWVFeGNlcHRpb24gLT4gUC5JTyAoKSkpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICAvLyBDbG9zZSBmdW5jdGlvbgorICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZClwcmVmaXg7CisgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsIHR5cGUsIHByZWZpeCk7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0cmluZyBhcmcpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgb3V0IDw8ICIoY2FzZSAiIDw8IGFyZyA8PCAiIG9mIHsiIDw8IHR5cGVfdG9fY29uc3RydWN0b3IodHlwZSkgPDwgIiAiIDw8IHZhbCA8PCAiIC0+ICI7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRSI7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHZhbCk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHZhbCk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HICYmICF0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgb3V0IDw8ICJFLmRlY29kZVV0ZjggIjsKKyAgICB9CisgICAgb3V0IDw8IHZhbDsKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIC8vIFNpbmNlIHdpcmUgdHlwZSBvZiBiaW5hcnkgaXMgdGhlIHNhbWUgYXMgc3RyaW5nLCB3ZSBhY3R1YWxseSByZWNlaXZlIFQuVFN0cmluZyBub3QKKyAgICAgIC8vIFQuVEJpbmFyeQorICAgICAgb3V0IDw8ICI7IFQuVFN0cmluZyAiIDw8IHZhbCA8PCAiIC0+ICIgPDwgdmFsOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgIlAudG9FbnVtICQgUC5mcm9tSW50ZWdyYWwgIiA8PCB2YWw7CisKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIFRZUEUgIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgb3V0IDw8ICI7IF8gLT4gUC5lcnJvciBcIndyb25nIHR5cGVcIn0pIjsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBuYW1lKSB7CisKKyAgb3V0IDw8ICIoIiA8PCB0eXBlX25hbWUodHN0cnVjdCwgInRvXyIpIDw8ICIgKFQuVFN0cnVjdCAiIDw8IG5hbWUgPDwgIikpIjsKK30KKworLyoqCisgKiBTZXJpYWxpemUgYSBjb250YWluZXIgYnkgd3JpdGluZyBvdXQgdGhlIGhlYWRlciBmb2xsb3dlZCBieQorICogZGF0YSBhbmQgdGhlbiBhIGZvb3Rlci4KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIGFyZykgeworCisgIHN0cmluZyB2YWwgPSB0bXAoIl92Iik7CisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGtleSA9IHRtcCgiX2siKTsKKyAgICBvdXQgPDwgIihNYXAuZnJvbUxpc3QgJCBQLm1hcCAoXFwoIiA8PCBrZXkgPDwgIiwiIDw8IHZhbCA8PCAiKSAtPiAoIjsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKworICAgIG91dCA8PCAiLCI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgICBvdXQgPDwgIikpICIgPDwgYXJnIDw8ICIpIjsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCAiKFNldC5mcm9tTGlzdCAkIFAubWFwIChcXCIgPDwgdmFsIDw8ICIgLT4gIjsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHZhbCk7CisgICAgb3V0IDw8ICIpICIgPDwgYXJnIDw8ICIpIjsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgIihWZWN0b3IuZnJvbUxpc3QgJCBQLm1hcCAoXFwiIDw8IHZhbCA8PCAiIC0+ICI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgdmFsKTsKKyAgICBvdXQgPDwgIikgIiA8PCBhcmcgPDwgIikiOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIG5hbWUpIHsKKworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKQorICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRSI7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBvdXQgPDwgdHlwZV90b19jb25zdHJ1Y3Rvcih0eXBlKSA8PCAiICI7CisgICAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HICYmICF0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBvdXQgPDwgIiQgRS5lbmNvZGVVdGY4ICI7CisgICAgICB9CisgICAgICBvdXQgPDwgbmFtZTsKKworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBzdHJpbmcgZW5hbWUgPSBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpOworICAgICAgb3V0IDw8ICJULlRJMzIgJCBQLmZyb21JbnRlZ3JhbCAkIFAuZnJvbUVudW0gIiA8PCBuYW1lOworICAgIH0KKworICB9IGVsc2UgeworICAgIHRocm93ICJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEIE9GIFRZUEUgIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgb3V0IDw8IHR5cGVfbmFtZSh0c3RydWN0LCAiZnJvbV8iKSA8PCAiICIgPDwgcHJlZml4OworfQorCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgayA9IHRtcCgiX2siKTsKKyAgc3RyaW5nIHYgPSB0bXAoIl92Iik7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIG91dCA8PCAiVC5UTWFwICIgPDwgdHlwZV90b19lbnVtKGt0eXBlKSA8PCAiICIgPDwgdHlwZV90b19lbnVtKHZ0eXBlKTsKKyAgICBvdXQgPDwgIiAkIFAubWFwIChcXCgiIDw8IGsgPDwgIiwiIDw8IHYgPDwgIikgLT4gKCI7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3V0LCBrdHlwZSwgayk7CisgICAgb3V0IDw8ICIsICI7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3V0LCB2dHlwZSwgdik7CisgICAgb3V0IDw8ICIpKSAkIE1hcC50b0xpc3QgIiA8PCBwcmVmaXg7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgIlQuVFNldCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgb3V0IDw8ICIgJCBQLm1hcCAoXFwiIDw8IHYgPDwgIiAtPiAiOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG91dCwgKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHYpOworICAgIG91dCA8PCAiKSAkIFNldC50b0xpc3QgIiA8PCBwcmVmaXg7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3V0IDw8ICJULlRMaXN0ICIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgb3V0IDw8ICIgJCBQLm1hcCAoXFwiIDw8IHYgPDwgIiAtPiAiOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG91dCwgKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB2KTsKKyAgICBvdXQgPDwgIikgJCBWZWN0b3IudG9MaXN0ICIgPDwgcHJlZml4OworICB9Cit9CisKK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6ZnVuY3Rpb25fdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCBvcHRpb25zLCBib29sIGlvLCBib29sIG1ldGhvZCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgfHwgKCh0X3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpCisgICAgICByZXN1bHQgKz0gIlAuTWF5YmUgIjsKKyAgICByZXN1bHQgKz0gcmVuZGVyX2hzX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBvcHRpb25zKTsKKyAgICByZXN1bHQgKz0gIiAtPiAiOworICB9CisKKyAgaWYgKGZpZWxkcy5lbXB0eSgpICYmICFtZXRob2QpCisgICAgcmVzdWx0ICs9ICIoKSAtPiAiOworCisgIGlmIChpbykKKyAgICByZXN1bHQgKz0gIlAuSU8gIjsKKworICByZXN1bHQgKz0gcmVuZGVyX2hzX3R5cGUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCksIGlvKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgc3RyaW5nIGZ1bmN0aW9uX3ByZWZpeCkgeworICBzdHJpbmcgcHJlZml4ID0gIiI7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworCisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykKKyAgICBpZiAoIXR0eXBlLT5pc19zZXJ2aWNlKCkpCisgICAgICBwcmVmaXggPSBjYXBpdGFsaXplKHByb2dyYW0tPmdldF9uYW1lKCkpICsgIl9UeXBlcy4iOworCisgIHJldHVybiBwcmVmaXggKyBmdW5jdGlvbl9wcmVmaXggKyBjYXBpdGFsaXplKHR0eXBlLT5nZXRfbmFtZSgpKTsKK30KKworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpmaWVsZF9uYW1lKHN0cmluZyB0bmFtZSwgc3RyaW5nIGZuYW1lKSB7CisgIHJldHVybiBkZWNhcGl0YWxpemUodG5hbWUpICsgIl8iICsgZm5hbWU7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBQcm90b2NvbC50X3R5cGUgZW51bQorICovCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIlQuVF9WT0lEIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiB0eXBlLT5pc19iaW5hcnkoKSA/ICJULlRfQklOQVJZIiA6ICJULlRfU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlQuVF9CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJULlRfQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlQuVF9JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJULlRfSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVC5UX0k2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlQuVF9ET1VCTEUiOworICAgIH0KKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVC5UX0kzMiI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICIoVC5UX1NUUlVDVCAiICsgdHlwZV9uYW1lKCh0X3N0cnVjdCopdHlwZSwgInR5cGVtYXBfIikgKyAiKSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBrdHlwZSA9IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCkpOworICAgIHN0cmluZyB2dHlwZSA9IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOworICAgIHJldHVybiAiKFQuVF9NQVAgIiArIGt0eXBlICsgIiAiICsgdnR5cGUgKyAiKSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiKFQuVF9TRVQgIiArIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIpIjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiKFQuVF9MSVNUICIgKyB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIikiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgZGVmYXVsdCB2YWx1ZQorICovCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OnR5cGVfdG9fZGVmYXVsdCh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIlAuZXJyb3IgXCJObyBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIFRfVk9JRFwiIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiXCJcIiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJQLkZhbHNlIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICIwIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiMCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIjAiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICIwIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiMCI7CisgICAgfQorCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICIoUC50b0VudW0gMCkiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiB0eXBlX25hbWUoKHRfc3RydWN0Kil0eXBlLCAiZGVmYXVsdF8iKTsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJNYXAuZW1wdHkiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlNldC5lbXB0eSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlZlY3Rvci5lbXB0eSI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZGVmYXVsdDogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYW4gaGFza2VsbCB0eXBlCisgKi8KK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6cmVuZGVyX2hzX3R5cGUodF90eXBlKiB0eXBlLCBib29sIG5lZWRzX3BhcmVucykgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RyaW5nIHR5cGVfcmVwcjsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAiKCkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICh0eXBlLT5pc19iaW5hcnkoKSA/ICJMQlMuQnl0ZVN0cmluZyIgOiAiTFQuVGV4dCIpOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiUC5Cb29sIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJJLkludDgiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJJLkludDE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiSS5JbnQzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIkkuSW50NjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJQLkRvdWJsZSI7CisgICAgfQorCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuIHR5cGVfbmFtZSgodF9lbnVtKil0eXBlKTsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKCh0X3N0cnVjdCopdHlwZSk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICB0eXBlX3JlcHIgPSAiTWFwLkhhc2hNYXAgIiArIHJlbmRlcl9oc190eXBlKGt0eXBlLCB0cnVlKSArICIgIiArIHJlbmRlcl9oc190eXBlKHZ0eXBlLCB0cnVlKTsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgdHlwZV9yZXByID0gIlNldC5IYXNoU2V0ICIgKyByZW5kZXJfaHNfdHlwZShldHlwZSwgdHJ1ZSk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgdHlwZV9yZXByID0gIlZlY3Rvci5WZWN0b3IgIiArIHJlbmRlcl9oc190eXBlKGV0eXBlLCB0cnVlKTsKKworICB9IGVsc2UgeworICAgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHJldHVybiBuZWVkc19wYXJlbnMgPyAiKCIgKyB0eXBlX3JlcHIgKyAiKSIgOiB0eXBlX3JlcHI7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBoYXNrZWxsIGNvbnN0cnVjdG9yCisgKi8KK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6dHlwZV90b19jb25zdHJ1Y3Rvcih0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiaW52YWxpZCB0eXBlOiBUX1ZPSUQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuIHR5cGUtPmlzX2JpbmFyeSgpID8gIlQuVEJpbmFyeSIgOiAiVC5UU3RyaW5nIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlQuVEJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlQuVEJ5dGUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJULlRJMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJULlRJMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJULlRJNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJULlREb3VibGUiOworICAgIH0KKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVC5USTMyIjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlQuVFN0cnVjdCI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVC5UTWFwIF8gXyI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVC5UU2V0IF8iOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJULlRMaXN0IF8iOworICB9CisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihocywgIkhhc2tlbGwiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZmEzODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTA4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnBhaXI7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworZW51bSBpbnB1dF90eXBlIHsgSU5QVVRfVU5LTk9XTiwgSU5QVVRfVVRGOCwgSU5QVVRfUExBSU4gfTsKKworLyoqCisgKiBIVE1MIGNvZGUgZ2VuZXJhdG9yCisgKgorICogbW9zdGx5IGNvcHkvcGFzdGluZy90d2Vha2luZyBmcm9tIG1jc2xlZSdzIHdvcmsuCisgKi8KK2NsYXNzIHRfaHRtbF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2h0bWxfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBzdGFuZGFsb25lXyA9IGZhbHNlOworICAgIHVuc2FmZV8gPSBmYWxzZTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJzdGFuZGFsb25lIikgPT0gMCkgeworICAgICAgICBzdGFuZGFsb25lXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vZXNjYXBlIikgPT0gMCkgeworICAgICAgICB1bnNhZmVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBodG1sOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWh0bWwiOworICAgIGlucHV0X3R5cGVfID0gSU5QVVRfVU5LTk9XTjsKKworICAgIGVzY2FwZV8uY2xlYXIoKTsKKyAgICBlc2NhcGVfWycmJ10gPSAiJmFtcDsiOworICAgIGVzY2FwZV9bJzwnXSA9ICImbHQ7IjsKKyAgICBlc2NhcGVfWyc+J10gPSAiJmd0OyI7CisgICAgZXNjYXBlX1snIiddID0gIiZxdW90OyI7CisgICAgZXNjYXBlX1snXCcnXSA9ICImYXBvczsiOworCisgICAgaW5pdF9hbGxvd2VkX19tYXJrdXAoKTsKKyAgfQorCisgIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbSgpOworICB2b2lkIGdlbmVyYXRlX3Byb2dyYW1fdG9jKCk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93KHRfcHJvZ3JhbSogdHByb2cpOworICB2b2lkIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvd3ModF9wcm9ncmFtKiB0cHJvZywgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj4mIGZpbmlzaGVkKTsKKyAgdm9pZCBnZW5lcmF0ZV9pbmRleCgpOworICBzdGQ6OnN0cmluZyBlc2NhcGVfaHRtbChzdGQ6OnN0cmluZyBjb25zdCYgc3RyKTsKKyAgc3RkOjpzdHJpbmcgZXNjYXBlX2h0bWxfdGFncyhzdGQ6OnN0cmluZyBjb25zdCYgc3RyKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc3MoKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc3NfY29udGVudChzdGQ6Om9zdHJlYW0mIGZfdGFyZ2V0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHlsZV90YWcoKTsKKyAgc3RkOjpzdHJpbmcgbWFrZV9maWxlX2xpbmsoc3RkOjpzdHJpbmcgbmFtZSk7CisgIGJvb2wgaXNfdXRmOF9zZXF1ZW5jZShzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBzaXplX3QgZmlyc3Rwb3MpOworICB2b2lkIGRldGVjdF9pbnB1dF9lbmNvZGluZyhzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBzaXplX3QgZmlyc3Rwb3MpOworICB2b2lkIGluaXRfYWxsb3dlZF9fbWFya3VwKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisKKyAgdm9pZCBwcmludF9kb2ModF9kb2MqIHRkb2MpOworICBpbnQgcHJpbnRfdHlwZSh0X3R5cGUqIHR0eXBlKTsKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7CisgIHZvaWQgcHJpbnRfZm5fYXJnc19kb2ModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworcHJpdmF0ZToKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX291dF87CisgIHN0ZDo6c3RyaW5nIGN1cnJlbnRfZmlsZV87CisgIGlucHV0X3R5cGUgaW5wdXRfdHlwZV87CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IGFsbG93ZWRfbWFya3VwOworICBib29sIHN0YW5kYWxvbmVfOworICBib29sIHVuc2FmZV87Cit9OworCisvKioKKyAqIEVtaXRzIHRoZSBUYWJsZSBvZiBDb250ZW50cyBsaW5rcyBhdCB0aGUgdG9wIG9mIHRoZSBtb2R1bGUncyBwYWdlCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbV90b2MoKSB7CisgIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCAiCisgICAgICAgICAgICAidGFibGUtY29uZGVuc2VkXCI+PHRoZWFkPjx0aD5Nb2R1bGU8L3RoPjx0aD5TZXJ2aWNlczwvdGg+IgorICAgICAgICAgPDwgIjx0aD5EYXRhIHR5cGVzPC90aD48dGg+Q29uc3RhbnRzPC90aD48L3RoZWFkPiIgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93KHByb2dyYW1fKTsKKyAgZl9vdXRfIDw8ICI8L3RhYmxlPiIgPDwgZW5kbDsKK30KKworLyoqCisgKiBSZWN1cnNlcyB0aHJvdWdoIGZyb20gdGhlIHByb3ZpZGVkIHByb2dyYW0gYW5kIGdlbmVyYXRlcyBhIFRvQyByb3cKKyAqIGZvciBlYWNoIGRpc2NvdmVyZWQgcHJvZ3JhbSBleGFjdGx5IG9uY2UgYnkgbWFpbnRhaW5pbmcgdGhlIGxpc3Qgb2YKKyAqIGNvbXBsZXRlZCByb3dzIGluICdmaW5pc2hlZCcKKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHRfcHJvZ3JhbSogdHByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj4mIGZpbmlzaGVkKSB7CisgIGZvciAodmVjdG9yPHRfcHJvZ3JhbSo+OjppdGVyYXRvciBpdGVyID0gZmluaXNoZWQuYmVnaW4oKTsgaXRlciAhPSBmaW5pc2hlZC5lbmQoKTsgaXRlcisrKSB7CisgICAgaWYgKHRwcm9nLT5nZXRfcGF0aCgpID09ICgqaXRlciktPmdldF9wYXRoKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgZmluaXNoZWQucHVzaF9iYWNrKHRwcm9nKTsKKyAgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93KHRwcm9nKTsKKyAgdmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzID0gdHByb2ctPmdldF9pbmNsdWRlcygpOworICBmb3IgKHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaXRlciA9IGluY2x1ZGVzLmJlZ2luKCk7IGl0ZXIgIT0gaW5jbHVkZXMuZW5kKCk7IGl0ZXIrKykgeworICAgIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvd3MoKml0ZXIsIGZpbmlzaGVkKTsKKyAgfQorfQorCisvKioKKyAqIEVtaXRzIHRoZSBUYWJsZSBvZiBDb250ZW50cyBsaW5rcyBhdCB0aGUgdG9wIG9mIHRoZSBtb2R1bGUncyBwYWdlCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93KHRfcHJvZ3JhbSogdHByb2cpIHsKKyAgc3RyaW5nIGZuYW1lID0gdHByb2ctPmdldF9uYW1lKCkgKyAiLmh0bWwiOworICBmX291dF8gPDwgIjx0cj4iIDw8IGVuZGwgPDwgIjx0ZD4iIDw8IHRwcm9nLT5nZXRfbmFtZSgpIDw8ICI8L3RkPjx0ZD4iOworICBpZiAoIXRwcm9nLT5nZXRfc2VydmljZXMoKS5lbXB0eSgpKSB7CisgICAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gdHByb2ctPmdldF9zZXJ2aWNlcygpOworICAgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKKyAgICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gZ2V0X3NlcnZpY2VfbmFtZSgqc3ZfaXRlcik7CisgICAgICBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IG1ha2VfZmlsZV9saW5rKGZuYW1lKSA8PCAiI1N2Y18iIDw8IG5hbWUgPDwgIlwiPiIgPDwgbmFtZQorICAgICAgICAgICAgIDw8ICI8L2E+PGJyLz4iIDw8IGVuZGw7CisgICAgICBmX291dF8gPDwgIjx1bD4iIDw8IGVuZGw7CisgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IGZuX2h0bWw7CisgICAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9ICgqc3ZfaXRlciktPmdldF9mdW5jdGlvbnMoKTsKKyAgICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZuX2l0ZXI7CisgICAgICBmb3IgKGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZm5faXRlcikgeworICAgICAgICBzdHJpbmcgZm5fbmFtZSA9ICgqZm5faXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIHN0cmluZyBodG1sID0gIjxsaT48YSBocmVmPVwiIiArIG1ha2VfZmlsZV9saW5rKGZuYW1lKSArICIjRm5fIiArIG5hbWUgKyAiXyIgKyBmbl9uYW1lCisgICAgICAgICAgICAgICAgICAgICAgKyAiXCI+IiArIGZuX25hbWUgKyAiPC9hPjwvbGk+IjsKKyAgICAgICAgZm5faHRtbC5pbnNlcnQocGFpcjxzdHJpbmcsIHN0cmluZz4oZm5fbmFtZSwgaHRtbCkpOworICAgICAgfQorICAgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBodG1sX2l0ZXIgPSBmbl9odG1sLmJlZ2luKCk7IGh0bWxfaXRlciAhPSBmbl9odG1sLmVuZCgpOworICAgICAgICAgICBodG1sX2l0ZXIrKykgeworICAgICAgICBmX291dF8gPDwgaHRtbF9pdGVyLT5zZWNvbmQgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfb3V0XyA8PCAiPC91bD4iIDw8IGVuZGw7CisgICAgfQorICB9CisgIGZfb3V0XyA8PCAiPC90ZD4iIDw8IGVuZGwgPDwgIjx0ZD4iOworICBtYXA8c3RyaW5nLCBzdHJpbmc+IGRhdGFfdHlwZXM7CisgIGlmICghdHByb2ctPmdldF9lbnVtcygpLmVtcHR5KCkpIHsKKyAgICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSB0cHJvZy0+Z2V0X2VudW1zKCk7CisgICAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOworICAgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKmVuX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgLy8gZl9vdXRfIDw8ICI8YSBocmVmPVwiIiA8PCBtYWtlX2ZpbGVfbGluayhmbmFtZSkgPDwgIiNFbnVtXyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCisgICAgICAvLyA8PCAgIjwvYT48YnIvPiIgPDwgZW5kbDsKKyAgICAgIHN0cmluZyBodG1sID0gIjxhIGhyZWY9XCIiICsgbWFrZV9maWxlX2xpbmsoZm5hbWUpICsgIiNFbnVtXyIgKyBuYW1lICsgIlwiPiIgKyBuYW1lICsgIjwvYT4iOworICAgICAgZGF0YV90eXBlcy5pbnNlcnQocGFpcjxzdHJpbmcsIHN0cmluZz4obmFtZSwgaHRtbCkpOworICAgIH0KKyAgfQorICBpZiAoIXRwcm9nLT5nZXRfdHlwZWRlZnMoKS5lbXB0eSgpKSB7CisgICAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gdHByb2ctPmdldF90eXBlZGVmcygpOworICAgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKKyAgICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCp0ZF9pdGVyKS0+Z2V0X3N5bWJvbGljKCk7CisgICAgICAvLyBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IG1ha2VfZmlsZV9saW5rKGZuYW1lKSA8PCAiI1R5cGVkZWZfIiA8PCBuYW1lIDw8ICJcIj4iIDw8IG5hbWUKKyAgICAgIC8vIDw8ICI8L2E+PGJyLz4iIDw8IGVuZGw7CisgICAgICBzdHJpbmcgaHRtbCA9ICI8YSBocmVmPVwiIiArIG1ha2VfZmlsZV9saW5rKGZuYW1lKSArICIjVHlwZWRlZl8iICsgbmFtZSArICJcIj4iICsgbmFtZQorICAgICAgICAgICAgICAgICAgICArICI8L2E+IjsKKyAgICAgIGRhdGFfdHlwZXMuaW5zZXJ0KHBhaXI8c3RyaW5nLCBzdHJpbmc+KG5hbWUsIGh0bWwpKTsKKyAgICB9CisgIH0KKyAgaWYgKCF0cHJvZy0+Z2V0X29iamVjdHMoKS5lbXB0eSgpKSB7CisgICAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IHRwcm9nLT5nZXRfb2JqZWN0cygpOworICAgIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciBvX2l0ZXI7CisgICAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKm9faXRlciktPmdldF9uYW1lKCk7CisgICAgICAvLyBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IG1ha2VfZmlsZV9saW5rKGZuYW1lKSA8PCAiI1N0cnVjdF8iIDw8IG5hbWUgPDwgIlwiPiIgPDwgbmFtZQorICAgICAgLy88PCAiPC9hPjxici8+IiA8PCBlbmRsOworICAgICAgc3RyaW5nIGh0bWwgPSAiPGEgaHJlZj1cIiIgKyBtYWtlX2ZpbGVfbGluayhmbmFtZSkgKyAiI1N0cnVjdF8iICsgbmFtZSArICJcIj4iICsgbmFtZQorICAgICAgICAgICAgICAgICAgICArICI8L2E+IjsKKyAgICAgIGRhdGFfdHlwZXMuaW5zZXJ0KHBhaXI8c3RyaW5nLCBzdHJpbmc+KG5hbWUsIGh0bWwpKTsKKyAgICB9CisgIH0KKyAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBkdF9pdGVyID0gZGF0YV90eXBlcy5iZWdpbigpOyBkdF9pdGVyICE9IGRhdGFfdHlwZXMuZW5kKCk7CisgICAgICAgZHRfaXRlcisrKSB7CisgICAgZl9vdXRfIDw8IGR0X2l0ZXItPnNlY29uZCA8PCAiPGJyLz4iIDw8IGVuZGw7CisgIH0KKyAgZl9vdXRfIDw8ICI8L3RkPiIgPDwgZW5kbCA8PCAiPHRkPiI7CisgIGlmICghdHByb2ctPmdldF9jb25zdHMoKS5lbXB0eSgpKSB7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBjb25zdF9odG1sOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gdHByb2ctPmdldF9jb25zdHMoKTsKKyAgICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjb25faXRlcjsKKyAgICBmb3IgKGNvbl9pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNvbl9pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjb25faXRlcikgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKmNvbl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHN0cmluZyBodG1sID0gIjxjb2RlPjxhIGhyZWY9XCIiICsgbWFrZV9maWxlX2xpbmsoZm5hbWUpICsgIiNDb25zdF8iICsgbmFtZSArICJcIj4iICsgbmFtZQorICAgICAgICAgICAgICAgICAgICArICI8L2E+PC9jb2RlPiI7CisgICAgICBjb25zdF9odG1sLmluc2VydChwYWlyPHN0cmluZywgc3RyaW5nPihuYW1lLCBodG1sKSk7CisgICAgfQorICAgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgY29uX2l0ZXIgPSBjb25zdF9odG1sLmJlZ2luKCk7IGNvbl9pdGVyICE9IGNvbnN0X2h0bWwuZW5kKCk7CisgICAgICAgICBjb25faXRlcisrKSB7CisgICAgICBmX291dF8gPDwgY29uX2l0ZXItPnNlY29uZCA8PCAiPGJyLz4iIDw8IGVuZGw7CisgICAgfQorICB9CisgIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+IiA8PCBlbmRsIDw8ICI8L3RyPiI7Cit9CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbS4KKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKyAgY3VycmVudF9maWxlXyA9IHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIi5odG1sIjsKKyAgc3RyaW5nIGZuYW1lID0gZ2V0X291dF9kaXIoKSArIGN1cnJlbnRfZmlsZV87CisgIGZfb3V0Xy5vcGVuKGZuYW1lLmNfc3RyKCkpOworICBmX291dF8gPDwgIjwhRE9DVFlQRSBodG1sIFBVQkxJQyBcIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOXCIiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiICAgIFwiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZFwiPiIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICI8aHRtbCB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIj4iIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiPGhlYWQ+IiA8PCBlbmRsOworICBmX291dF8gPDwgIjxtZXRhIGh0dHAtZXF1aXY9XCJDb250ZW50LVR5cGVcIiBjb250ZW50PVwidGV4dC9odG1sO2NoYXJzZXQ9dXRmLThcIiAvPiIgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfc3R5bGVfdGFnKCk7CisgIGZfb3V0XyA8PCAiPHRpdGxlPlRocmlmdCBtb2R1bGU6ICIgPDwgcHJvZ3JhbV8tPmdldF9uYW1lKCkgPDwgIjwvdGl0bGU+PC9oZWFkPjxib2R5PiIgPDwgZW5kbAorICAgICAgICAgPDwgIjxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4iIDw8IGVuZGwKKyAgICAgICAgIDw8ICI8aDE+VGhyaWZ0IG1vZHVsZTogIiA8PCBwcm9ncmFtXy0+Z2V0X25hbWUoKSA8PCAiPC9oMT4iIDw8IGVuZGw7CisKKyAgcHJpbnRfZG9jKHByb2dyYW1fKTsKKworICBnZW5lcmF0ZV9wcm9ncmFtX3RvYygpOworCisgIGlmICghcHJvZ3JhbV8tPmdldF9jb25zdHMoKS5lbXB0eSgpKSB7CisgICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIkNvbnN0YW50c1wiPkNvbnN0YW50czwvaDI+IiA8PCBlbmRsOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gcHJvZ3JhbV8tPmdldF9jb25zdHMoKTsKKyAgICBmX291dF8gPDwgIjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgdGFibGUtY29uZGVuc2VkXCI+IjsKKyAgICBmX291dF8gPDwgIjx0aGVhZD48dGg+Q29uc3RhbnQ8L3RoPjx0aD5UeXBlPC90aD48dGg+VmFsdWU8L3RoPjwvdGhlYWQ+IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX2NvbnN0cyhjb25zdHMpOworICAgIGZfb3V0XyA8PCAiPC90YWJsZT4iOworICB9CisKKyAgaWYgKCFwcm9ncmFtXy0+Z2V0X2VudW1zKCkuZW1wdHkoKSkgeworICAgIGZfb3V0XyA8PCAiPGhyLz48aDIgaWQ9XCJFbnVtZXJhdGlvbnNcIj5FbnVtZXJhdGlvbnM8L2gyPiIgPDwgZW5kbDsKKyAgICAvLyBHZW5lcmF0ZSBlbnVtcworICAgIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKKyAgICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7CisgICAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7CisgICAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKKyAgICB9CisgIH0KKworICBpZiAoIXByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKS5lbXB0eSgpKSB7CisgICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIlR5cGVkZWZzXCI+VHlwZSBkZWNsYXJhdGlvbnM8L2gyPiIgPDwgZW5kbDsKKyAgICAvLyBHZW5lcmF0ZSB0eXBlZGVmcworICAgIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKTsKKyAgICB2ZWN0b3I8dF90eXBlZGVmKj46Oml0ZXJhdG9yIHRkX2l0ZXI7CisgICAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7CisgICAgICBnZW5lcmF0ZV90eXBlZGVmKCp0ZF9pdGVyKTsKKyAgICB9CisgIH0KKworICBpZiAoIXByb2dyYW1fLT5nZXRfb2JqZWN0cygpLmVtcHR5KCkpIHsKKyAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiU3RydWN0c1wiPkRhdGEgc3RydWN0dXJlczwvaDI+IiA8PCBlbmRsOworICAgIC8vIEdlbmVyYXRlIHN0cnVjdHMgYW5kIGV4Y2VwdGlvbnMgaW4gZGVjbGFyZWQgb3JkZXIKKyAgICB2ZWN0b3I8dF9zdHJ1Y3QqPiBvYmplY3RzID0gcHJvZ3JhbV8tPmdldF9vYmplY3RzKCk7CisgICAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIG9faXRlcjsKKyAgICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7CisgICAgICBpZiAoKCpvX2l0ZXIpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIGdlbmVyYXRlX3hjZXB0aW9uKCpvX2l0ZXIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ2VuZXJhdGVfc3RydWN0KCpvX2l0ZXIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmICghcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpLmVtcHR5KCkpIHsKKyAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiU2VydmljZXNcIj5TZXJ2aWNlczwvaDI+IiA8PCBlbmRsOworICAgIC8vIEdlbmVyYXRlIHNlcnZpY2VzCisgICAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOworICAgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKKyAgICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKKyAgICAgIHNlcnZpY2VfbmFtZV8gPSBnZXRfc2VydmljZV9uYW1lKCpzdl9pdGVyKTsKKyAgICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOworICAgIH0KKyAgfQorCisgIGZfb3V0XyA8PCAiPC9kaXY+PC9ib2R5PjwvaHRtbD4iIDw8IGVuZGw7CisgIGZfb3V0Xy5jbG9zZSgpOworCisgIGdlbmVyYXRlX2luZGV4KCk7CisgIGdlbmVyYXRlX2NzcygpOworfQorCisvKioKKyAqIEVtaXRzIHRoZSBpbmRleC5odG1sIGZpbGUgZm9yIHRoZSByZWN1cnNpdmUgc2V0IG9mIFRocmlmdCBwcm9ncmFtcworICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2luZGV4KCkgeworICBjdXJyZW50X2ZpbGVfID0gImluZGV4Lmh0bWwiOworICBzdHJpbmcgaW5kZXhfZm5hbWUgPSBnZXRfb3V0X2RpcigpICsgY3VycmVudF9maWxlXzsKKyAgZl9vdXRfLm9wZW4oaW5kZXhfZm5hbWUuY19zdHIoKSk7CisgIGZfb3V0XyA8PCAiPGh0bWw+PGhlYWQ+IiA8PCBlbmRsOworICBnZW5lcmF0ZV9zdHlsZV90YWcoKTsKKyAgZl9vdXRfIDw8ICI8dGl0bGU+QWxsIFRocmlmdCBkZWNsYXJhdGlvbnM8L3RpdGxlPjwvaGVhZD48Ym9keT4iIDw8IGVuZGwKKyAgICAgICAgIDw8ICI8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+IiA8PCBlbmRsIDw8ICI8aDE+QWxsIFRocmlmdCBkZWNsYXJhdGlvbnM8L2gxPiIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICI8dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkICIKKyAgICAgICAgICAgICJ0YWJsZS1jb25kZW5zZWRcIj48dGhlYWQ+PHRoPk1vZHVsZTwvdGg+PHRoPlNlcnZpY2VzPC90aD48dGg+RGF0YSB0eXBlczwvdGg+IgorICAgICAgICAgPDwgIjx0aD5Db25zdGFudHM8L3RoPjwvdGhlYWQ+IiA8PCBlbmRsOworICB2ZWN0b3I8dF9wcm9ncmFtKj4gcHJvZ3JhbXM7CisgIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvd3MocHJvZ3JhbV8sIHByb2dyYW1zKTsKKyAgZl9vdXRfIDw8ICI8L3RhYmxlPiIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICI8L2Rpdj48L2JvZHk+PC9odG1sPiIgPDwgZW5kbDsKKyAgZl9vdXRfLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NzKCkgeworICBpZiAoIXN0YW5kYWxvbmVfKSB7CisgICAgY3VycmVudF9maWxlXyA9ICJzdHlsZS5jc3MiOworICAgIHN0cmluZyBjc3NfZm5hbWUgPSBnZXRfb3V0X2RpcigpICsgY3VycmVudF9maWxlXzsKKyAgICBmX291dF8ub3Blbihjc3NfZm5hbWUuY19zdHIoKSk7CisgICAgZ2VuZXJhdGVfY3NzX2NvbnRlbnQoZl9vdXRfKTsKKyAgICBmX291dF8uY2xvc2UoKTsKKyAgfQorfQorCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Nzc19jb250ZW50KHN0ZDo6b3N0cmVhbSYgZl90YXJnZXQpIHsKKyAgZl90YXJnZXQgPDwgQk9PVFNUUkFQX0NTUygpIDw8IGVuZGw7CisgIGZfdGFyZ2V0IDw8ICIvKiBBdXRvLWdlbmVyYXRlZCBDU1MgZm9yIGdlbmVyYXRlZCBUaHJpZnQgZG9jcyAqLyIgPDwgZW5kbDsKKyAgZl90YXJnZXQgPDwgImgzLCBoNCB7IG1hcmdpbi1ib3R0b206IDZweDsgfSIgPDwgZW5kbDsKKyAgZl90YXJnZXQgPDwgImRpdi5kZWZpbml0aW9uIHsgYm9yZGVyOiAxcHggc29saWQgI0NDQzsgbWFyZ2luLWJvdHRvbTogMTBweDsgcGFkZGluZzogMTBweDsgfSIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgZl90YXJnZXQgPDwgImRpdi5leHRlbmRzIHsgbWFyZ2luOiAtMC41ZW0gMCAxZW0gNWVtIH0iIDw8IGVuZGw7CisgIGZfdGFyZ2V0IDw8ICJ0ZCB7IHZlcnRpY2FsLWFsaWduOiB0b3A7IH0iIDw8IGVuZGw7CisgIGZfdGFyZ2V0IDw8ICJ0YWJsZSB7IGVtcHR5LWNlbGxzOiBzaG93OyB9IiA8PCBlbmRsOworICBmX3RhcmdldCA8PCAiY29kZSB7IGxpbmUtaGVpZ2h0OiAyMHB4OyB9IiA8PCBlbmRsOworICBmX3RhcmdldCA8PCAiLnRhYmxlLWJvcmRlcmVkIHRoLCAudGFibGUtYm9yZGVyZWQgdGQgeyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0RERERERDsgfSIKKyAgICAgICAgICAgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIENTUyB0YWcuCisgKiBEZXBlbmRpbmcgb24gInN0YW5kYWxvbmUiLCBlaXRoZXIgYSBDU1MgZmlsZSBsaW5rIChkZWZhdWx0KSwgb3IgdGhlIGVudGlyZSBDU1MgaXMgZW1iZWRkZWQKKyAqIGlubGluZS4KKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHlsZV90YWcoKSB7CisgIGlmICghc3RhbmRhbG9uZV8pIHsKKyAgICBmX291dF8gPDwgIjxsaW5rIGhyZWY9XCJzdHlsZS5jc3NcIiByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIvPiIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX291dF8gPDwgIjxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIi8+PCEtLSIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9jc3NfY29udGVudChmX291dF8pOworICAgIGZfb3V0XyA8PCAiLS0+PC9zdHlsZT4iIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSB0YXJnZXQgZmlsZSBmb3IgYSA8YSBocmVmPiBsaW5rCisgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIGVtcHR5LCB3aGVuZXZlciBmaWxlbmFtZSByZWZlcnMgdG8gdGhlIGN1cnJlbnQgZmlsZS4KKyAqLworc3RkOjpzdHJpbmcgdF9odG1sX2dlbmVyYXRvcjo6bWFrZV9maWxlX2xpbmsoc3RkOjpzdHJpbmcgZmlsZW5hbWUpIHsKKyAgcmV0dXJuIChjdXJyZW50X2ZpbGVfLmNvbXBhcmUoZmlsZW5hbWUpICE9IDApID8gZmlsZW5hbWUgOiAiIjsKK30KKworLyoqCisgKiBJZiB0aGUgcHJvdmlkZWQgZG9jdW1lbnRhYmxlIG9iamVjdCBoYXMgZG9jdW1lbnRhdGlvbiBhdHRhY2hlZCwgdGhpcworICogd2lsbCBlbWl0IGl0IHRvIHRoZSBvdXRwdXQgc3RyZWFtIGluIEhUTUwgZm9ybWF0LgorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OnByaW50X2RvYyh0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgaWYgKHVuc2FmZV8pIHsKKyAgICAgIGZfb3V0XyA8PCB0ZG9jLT5nZXRfZG9jKCkgPDwgIjxici8+IjsKKyAgICB9IGVsc2UgeworICAgICAgZl9vdXRfIDw8ICI8cHJlPiIgPDwgZXNjYXBlX2h0bWwodGRvYy0+Z2V0X2RvYygpKSA8PCAiPC9wcmU+PGJyLz4iOworICAgIH0KKyAgfQorfQorCitib29sIHRfaHRtbF9nZW5lcmF0b3I6OmlzX3V0Zjhfc2VxdWVuY2Uoc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgc2l6ZV90IGZpcnN0cG9zKSB7CisgIC8vIGxlYWRpbmcgY2hhciBkZXRlcm1pbmVzIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlCisgIHVuc2lnbmVkIGNoYXIgYyA9IHN0ci5hdChmaXJzdHBvcyk7CisgIGludCBjb3VudCA9IDA7CisgIGlmICgoYyAmIDB4RTApID09IDB4QzApIHsKKyAgICBjb3VudCA9IDE7CisgIH0gZWxzZSBpZiAoKGMgJiAweEYwKSA9PSAweEUwKSB7CisgICAgY291bnQgPSAyOworICB9IGVsc2UgaWYgKChjICYgMHhGOCkgPT0gMHhGMCkgeworICAgIGNvdW50ID0gMzsKKyAgfSBlbHNlIGlmICgoYyAmIDB4RkMpID09IDB4RjgpIHsKKyAgICBjb3VudCA9IDQ7CisgIH0gZWxzZSBpZiAoKGMgJiAweEZFKSA9PSAweEZDKSB7CisgICAgY291bnQgPSA1OworICB9IGVsc2UgeworICAgIC8vIHBkZWJ1ZygiVVRGLTggdGVzdDogY2hhciAnJWMnICglZCkgaXMgbm90IGEgdmFsaWQgVVRGLTggbGVhZGluZyBieXRlIiwgYywgaW50KGMpKTsKKyAgICByZXR1cm4gZmFsc2U7IC8vIG5vIFVURi04CisgIH0KKworICAvLyBmb2xsb3dpbmcgY2hhcnMKKyAgc2l6ZV90IHBvcyA9IGZpcnN0cG9zICsgMTsKKyAgd2hpbGUgKChwb3MgPCBzdHIubGVuZ3RoKCkpICYmICgwIDwgY291bnQpKSB7CisgICAgYyA9IHN0ci5hdChwb3MpOworICAgIGlmICgoYyAmIDB4QzApICE9IDB4ODApIHsKKyAgICAgIC8vIHBkZWJ1ZygiVVRGLTggdGVzdDogY2hhciAnJWMnICglZCkgaXMgbm90IGEgdmFsaWQgVVRGLTggZm9sbG93aW5nIGJ5dGUiLCBjLCBpbnQoYykpOworICAgICAgcmV0dXJuIGZhbHNlOyAvLyBubyBVVEYtOAorICAgIH0KKyAgICAtLWNvdW50OworICAgICsrcG9zOworICB9CisKKyAgLy8gdHJ1ZSBpZiB0aGUgc2VxdWVuY2UgaXMgY29tcGxldGUKKyAgcmV0dXJuICgwID09IGNvdW50KTsKK30KKwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpkZXRlY3RfaW5wdXRfZW5jb2Rpbmcoc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgc2l6ZV90IGZpcnN0cG9zKSB7CisgIGlmIChpc191dGY4X3NlcXVlbmNlKHN0ciwgZmlyc3Rwb3MpKSB7CisgICAgcGRlYnVnKCJJbnB1dCBzZWVtcyB0byBiZSBhbHJlYWR5IFVURi04IGVuY29kZWQiKTsKKyAgICBpbnB1dF90eXBlXyA9IElOUFVUX1VURjg7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gZmFsbGJhY2sKKyAgcHdhcm5pbmcoMSwgIklucHV0IGlzIG5vdCBVVEYtOCwgdHJlYXRpbmcgYXMgcGxhaW4gQU5TSSIpOworICBpbnB1dF90eXBlXyA9IElOUFVUX1BMQUlOOworfQorCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmluaXRfYWxsb3dlZF9fbWFya3VwKCkgeworICBhbGxvd2VkX21hcmt1cC5jbGVhcigpOworICAvLyBzdGFuZGFsb25lIHRhZ3MKKyAgYWxsb3dlZF9tYXJrdXBbImJyIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiYnIvIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiaW1nIl0gPSAxOworICAvLyBwYWlyZWQgdGFncworICBhbGxvd2VkX21hcmt1cFsiYiJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9iIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsidSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi91Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiaSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9pIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsicyJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9zIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiYmlnIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2JpZyJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbInNtYWxsIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL3NtYWxsIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsic3VwIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL3N1cCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbInN1YiJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9zdWIiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJwcmUiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvcHJlIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsidHQiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvdHQiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJ1bCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi91bCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIm9sIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL29sIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsibGkiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvbGkiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJhIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2EiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJwIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL3AiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJjb2RlIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2NvZGUiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJkbCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9kbCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImR0Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2R0Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiZGQiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvZGQiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJoMSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9oMSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImgyIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2gyIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiaDMiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvaDMiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJoNCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9oNCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImg1Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2g1Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiaDYiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvaDYiXSA9IDE7Cit9CisKK3N0ZDo6c3RyaW5nIHRfaHRtbF9nZW5lcmF0b3I6OmVzY2FwZV9odG1sX3RhZ3Moc3RkOjpzdHJpbmcgY29uc3QmIHN0cikgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVzdWx0OworCisgIHVuc2lnbmVkIGNoYXIgYyA9ICc/JzsKKyAgc2l6ZV90IGxhc3Rwb3M7CisgIHNpemVfdCBmaXJzdHBvcyA9IDA7CisgIHdoaWxlIChmaXJzdHBvcyA8IHN0ci5sZW5ndGgoKSkgeworCisgICAgLy8gbG9vayBmb3Igbm9uLUFTQ0lJIGNoYXIKKyAgICBsYXN0cG9zID0gZmlyc3Rwb3M7CisgICAgd2hpbGUgKGxhc3Rwb3MgPCBzdHIubGVuZ3RoKCkpIHsKKyAgICAgIGMgPSBzdHIuYXQobGFzdHBvcyk7CisgICAgICBpZiAoKCc8JyA9PSBjKSB8fCAoJz4nID09IGMpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgKytsYXN0cG9zOworICAgIH0KKworICAgIC8vIGNvcHkgd2hhdCB3ZSBnb3Qgc28gZmFyCisgICAgaWYgKGxhc3Rwb3MgPiBmaXJzdHBvcykgeworICAgICAgcmVzdWx0IDw8IHN0ci5zdWJzdHIoZmlyc3Rwb3MsIGxhc3Rwb3MgLSBmaXJzdHBvcyk7CisgICAgICBmaXJzdHBvcyA9IGxhc3Rwb3M7CisgICAgfQorCisgICAgLy8gcmVhY2hlZCB0aGUgZW5kPworICAgIGlmIChmaXJzdHBvcyA+PSBzdHIubGVuZ3RoKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIHRhZyBlbmQgd2l0aG91dCBjb3JyZXNwb25kaW5nIGJlZ2luCisgICAgKytmaXJzdHBvczsKKyAgICBpZiAoJz4nID09IGMpIHsKKyAgICAgIHJlc3VsdCA8PCAiJmd0OyI7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBleHRyYWN0IHRoZSB0YWcKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gdGFnc3RyZWFtOworICAgIHdoaWxlIChmaXJzdHBvcyA8IHN0ci5sZW5ndGgoKSkgeworICAgICAgYyA9IHN0ci5hdChmaXJzdHBvcyk7CisgICAgICArK2ZpcnN0cG9zOworICAgICAgaWYgKCc8JyA9PSBjKSB7CisgICAgICAgIHRhZ3N0cmVhbSA8PCAiJmx0OyI7IC8vIG5lc3RlZCBiZWdpbj8KKyAgICAgIH0gZWxzZSBpZiAoJz4nID09IGMpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgeworICAgICAgICB0YWdzdHJlYW0gPDwgYzsgLy8gbm90IHZlcnkgZWZmaWNpZW50LCBidXQgdGFncyBzaG91bGQgYmUgcXVpdGUgc2hvcnQKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyB3ZSBhbGxvdyBmb3Igc2V2ZXJhbCBtYXJrdXAgaW4gZG9jc3RyaW5ncywgYWxsIGVsc2Ugd2lsbCBiZWNvbWUgZXNjYXBlZAorICAgIHN0cmluZyB0YWdfY29udGVudCA9IHRhZ3N0cmVhbS5zdHIoKTsKKyAgICBzdHJpbmcgdGFnX2tleSA9IHRhZ19jb250ZW50OworICAgIHNpemVfdCBmaXJzdF93aGl0ZSA9IHRhZ19rZXkuZmluZF9maXJzdF9vZigiIFx0XGZcdlxuXHIiKTsKKyAgICBpZiAoZmlyc3Rfd2hpdGUgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICB0YWdfa2V5LmVyYXNlKGZpcnN0X3doaXRlKTsKKyAgICB9CisgICAgZm9yIChzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgdGFnX2tleS5sZW5ndGgoKTsgKytpKSB7CisgICAgICB0YWdfa2V5W2ldID0gdG9sb3dlcih0YWdfa2V5W2ldKTsKKyAgICB9CisgICAgaWYgKGFsbG93ZWRfbWFya3VwLmZpbmQodGFnX2tleSkgIT0gYWxsb3dlZF9tYXJrdXAuZW5kKCkpIHsKKyAgICAgIHJlc3VsdCA8PCAiPCIgPDwgdGFnX2NvbnRlbnQgPDwgIj4iOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgPDwgIiZsdDsiIDw8IHRhZ3N0cmVhbS5zdHIoKSA8PCAiJmd0OyI7CisgICAgICBwdmVyYm9zZSgiaWxsZWdhbCBtYXJrdXAgPCVzPiBpbiBkb2MtY29tbWVudFxuIiwgdGFnX2tleS5jX3N0cigpKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0LnN0cigpOworfQorCitzdGQ6OnN0cmluZyB0X2h0bWxfZ2VuZXJhdG9yOjplc2NhcGVfaHRtbChzdGQ6OnN0cmluZyBjb25zdCYgc3RyKSB7CisgIC8vIHRoZSBnZW5lcmF0ZWQgSFRNTCBoZWFkZXIgc2F5cyBpdCBpcyBVVEYtOCBlbmNvZGVkCisgIC8vIGlmIFVURi04IGlucHV0IGhhcyBiZWVuIGRldGVjdGVkIGJlZm9yZSwgd2UgZG9uJ3QgbmVlZCB0byBjaGFuZ2UgYW55dGhpbmcKKyAgaWYgKGlucHV0X3R5cGVfID09IElOUFVUX1VURjgpIHsKKyAgICByZXR1cm4gZXNjYXBlX2h0bWxfdGFncyhzdHIpOworICB9CisKKyAgLy8gY29udmVydCB1bnNhZmUgY2hhcnMgdG8gdGhlaXIgJiM8bnVtPjsgZXF1aXZhbGVudAorICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVzdWx0OworICB1bnNpZ25lZCBjaGFyIGMgPSAnPyc7CisgIHVuc2lnbmVkIGludCBpYyA9IDA7CisgIHNpemVfdCBsYXN0cG9zOworICBzaXplX3QgZmlyc3Rwb3MgPSAwOworICB3aGlsZSAoZmlyc3Rwb3MgPCBzdHIubGVuZ3RoKCkpIHsKKworICAgIC8vIGxvb2sgZm9yIG5vbi1BU0NJSSBjaGFyCisgICAgbGFzdHBvcyA9IGZpcnN0cG9zOworICAgIHdoaWxlIChsYXN0cG9zIDwgc3RyLmxlbmd0aCgpKSB7CisgICAgICBjID0gc3RyLmF0KGxhc3Rwb3MpOworICAgICAgaWMgPSBjOworICAgICAgaWYgKCgzMiA+IGljKSB8fCAoMTI3IDwgaWMpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgKytsYXN0cG9zOworICAgIH0KKworICAgIC8vIGNvcHkgd2hhdCB3ZSBnb3Qgc28gZmFyCisgICAgaWYgKGxhc3Rwb3MgPiBmaXJzdHBvcykgeworICAgICAgcmVzdWx0IDw8IHN0ci5zdWJzdHIoZmlyc3Rwb3MsIGxhc3Rwb3MgLSBmaXJzdHBvcyk7CisgICAgICBmaXJzdHBvcyA9IGxhc3Rwb3M7CisgICAgfQorCisgICAgLy8gcmVhY2hlZCB0aGUgZW5kPworICAgIGlmIChmaXJzdHBvcyA+PSBzdHIubGVuZ3RoKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIHNvbWUgY29udHJvbCBjb2RlPworICAgIGlmIChpYyA8PSAzMSkgeworICAgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlICdccic6CisgICAgICBjYXNlICdcbic6CisgICAgICBjYXNlICdcdCc6CisgICAgICAgIHJlc3VsdCA8PCBjOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IC8vIHNpbGVudGx5IGNvbnN1bWUgYWxsIG90aGVyIGN0cmwgY2hhcnMKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICArK2ZpcnN0cG9zOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gcmVhY2hlZCB0aGUgZW5kPworICAgIGlmIChmaXJzdHBvcyA+PSBzdHIubGVuZ3RoKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIHRyeSB0byBkZXRlY3QgaW5wdXQgZW5jb2RpbmcKKyAgICBpZiAoaW5wdXRfdHlwZV8gPT0gSU5QVVRfVU5LTk9XTikgeworICAgICAgZGV0ZWN0X2lucHV0X2VuY29kaW5nKHN0ciwgZmlyc3Rwb3MpOworICAgICAgaWYgKGlucHV0X3R5cGVfID09IElOUFVUX1VURjgpIHsKKyAgICAgICAgbGFzdHBvcyA9IHN0ci5sZW5ndGgoKTsKKyAgICAgICAgcmVzdWx0IDw8IHN0ci5zdWJzdHIoZmlyc3Rwb3MsIGxhc3Rwb3MgLSBmaXJzdHBvcyk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIC8vIGNvbnZlcnQgdGhlIGNoYXJhY3RlciB0byBzb21ldGhpbmcgdXNlZnVsIGJhc2VkIG9uIHRoZSBkZXRlY3RlZCBlbmNvZGluZworICAgIHN3aXRjaCAoaW5wdXRfdHlwZV8pIHsKKyAgICBjYXNlIElOUFVUX1BMQUlOOgorICAgICAgcmVzdWx0IDw8ICImIyIgPDwgaWMgPDwgIjsiOworICAgICAgKytmaXJzdHBvczsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiVW5leHBlY3RlZCBvciB1bnJlY29nbml6ZWQgaW5wdXQgZW5jb2RpbmciOworICAgIH0KKyAgfQorCisgIHJldHVybiBlc2NhcGVfaHRtbF90YWdzKHJlc3VsdC5zdHIoKSk7Cit9CisKKy8qKgorICogUHJpbnRzIG91dCB0aGUgcHJvdmlkZWQgdHlwZSBpbiBIVE1MCisgKi8KK2ludCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsZW4gPSAwOworICBmX291dF8gPDwgIjxjb2RlPiI7CisgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZl9vdXRfIDw8ICJsaXN0Jmx0OyI7CisgICAgICBsZW4gPSA2ICsgcHJpbnRfdHlwZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgICAgZl9vdXRfIDw8ICImZ3Q7IjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgZl9vdXRfIDw8ICJzZXQmbHQ7IjsKKyAgICAgIGxlbiA9IDUgKyBwcmludF90eXBlKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICAgIGZfb3V0XyA8PCAiJmd0OyI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGZfb3V0XyA8PCAibWFwJmx0OyI7CisgICAgICBsZW4gPSA1ICsgcHJpbnRfdHlwZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKKyAgICAgIGZfb3V0XyA8PCAiLCAiOworICAgICAgbGVuICs9IHByaW50X3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7CisgICAgICBmX291dF8gPDwgIiZndDsiOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBmX291dF8gPDwgKHR0eXBlLT5pc19iaW5hcnkoKSA/ICJiaW5hcnkiIDogdHR5cGUtPmdldF9uYW1lKCkpOworICAgIGxlbiA9IHR0eXBlLT5nZXRfbmFtZSgpLnNpemUoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgcHJvZ19uYW1lID0gdHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCk7CisgICAgc3RyaW5nIHR5cGVfbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOworICAgIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgbWFrZV9maWxlX2xpbmsocHJvZ19uYW1lICsgIi5odG1sIikgPDwgIiMiOworICAgIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgICBmX291dF8gPDwgIlN0cnVjdF8iOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBmX291dF8gPDwgIlN0cnVjdF8iOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgZl9vdXRfIDw8ICJFbnVtXyI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2VydmljZSgpKSB7CisgICAgICBmX291dF8gPDwgIlN2Y18iOworICAgIH0KKyAgICBmX291dF8gPDwgdHlwZV9uYW1lIDw8ICJcIj4iOworICAgIGxlbiA9IHR5cGVfbmFtZS5zaXplKCk7CisgICAgaWYgKHR0eXBlLT5nZXRfcHJvZ3JhbSgpICE9IHByb2dyYW1fKSB7CisgICAgICBmX291dF8gPDwgcHJvZ19uYW1lIDw8ICIuIjsKKyAgICAgIGxlbiArPSBwcm9nX25hbWUuc2l6ZSgpICsgMTsKKyAgICB9CisgICAgZl9vdXRfIDw8IHR5cGVfbmFtZSA8PCAiPC9hPiI7CisgIH0KKyAgZl9vdXRfIDw8ICI8L2NvZGU+IjsKKyAgcmV0dXJuIChpbnQpbGVuOworfQorCisvKioKKyAqIFByaW50cyBvdXQgYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvdmlkZWQgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSkgeworCisgIC8vIGlmIHR2YWx1ZSBpcyBhbiBpZGVudGlmaWVyLCB0aGUgY29uc3RhbnQgY29udGVudCBpcyBhbHJlYWR5IHNob3duIGVsc2V3aGVyZQorICBpZiAodHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVIpIHsKKyAgICBzdHJpbmcgZm5hbWUgPSBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICIuaHRtbCI7CisgICAgc3RyaW5nIG5hbWUgPSBlc2NhcGVfaHRtbCh0dmFsdWUtPmdldF9pZGVudGlmaWVyKCkpOworICAgIGZfb3V0XyA8PCAiPGNvZGU+PGEgaHJlZj1cIiIgKyBtYWtlX2ZpbGVfbGluayhmbmFtZSkgKyAiI0NvbnN0XyIgKyBuYW1lICsgIlwiPiIgKyBuYW1lCisgICAgICAgICAgICAgICsgIjwvYT48L2NvZGU+IjsKKyAgICByZXR1cm47CisgIH0KKworICB0X3R5cGUqIHRydWV0eXBlID0gdHlwZTsKKyAgd2hpbGUgKHRydWV0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0cnVldHlwZSA9ICgodF90eXBlZGVmKil0cnVldHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgaWYgKHRydWV0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0cnVldHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgZl9vdXRfIDw8ICciJyA8PCBlc2NhcGVfaHRtbChnZXRfZXNjYXBlZF9zdHJpbmcodHZhbHVlKSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgZl9vdXRfIDw8ICgodHZhbHVlLT5nZXRfaW50ZWdlcigpICE9IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHR2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZl9vdXRfIDw8ICJVTktOT1dOIEJBU0UgVFlQRSI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSBpZiAodHJ1ZXR5cGUtPmlzX2VudW0oKSkgeworICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCh0cnVldHlwZS0+Z2V0X25hbWUoKSkgPDwgIi4iCisgICAgICAgICAgIDw8IGVzY2FwZV9odG1sKHR2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfc3RydWN0KCkgfHwgdHJ1ZXR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBmX291dF8gPDwgInsgIjsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0cnVldHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB0dmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHJ1ZXR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiCisgICAgICAgICAgICArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgZl9vdXRfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgZl9vdXRfIDw8IGVzY2FwZV9odG1sKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgPDwgIiA9ICI7CisgICAgICBwcmludF9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgfQorICAgIGZfb3V0XyA8PCAiIH0iOworICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19tYXAoKSkgeworICAgIGZfb3V0XyA8PCAieyAiOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+IG1hcF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+OjppdGVyYXRvciBtYXBfaXRlcjsKKyAgICBmb3IgKG1hcF9pdGVyID0gbWFwX2VsZW1zLmJlZ2luKCk7IG1hcF9pdGVyICE9IG1hcF9lbGVtcy5lbmQoKTsgbWFwX2l0ZXIrKykgeworICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICBmX291dF8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBwcmludF9jb25zdF92YWx1ZSgoKHRfbWFwKil0cnVldHlwZSktPmdldF9rZXlfdHlwZSgpLCBtYXBfaXRlci0+Zmlyc3QpOworICAgICAgZl9vdXRfIDw8ICIgPSAiOworICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCh0X21hcCopdHJ1ZXR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgbWFwX2l0ZXItPnNlY29uZCk7CisgICAgfQorICAgIGZfb3V0XyA8PCAiIH0iOworICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19saXN0KCkpIHsKKyAgICBmX291dF8gPDwgInsgIjsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3RfZWxlbXMgPSB0dmFsdWUtPmdldF9saXN0KCk7CisgICAgOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIGxpc3RfaXRlcjsKKyAgICBmb3IgKGxpc3RfaXRlciA9IGxpc3RfZWxlbXMuYmVnaW4oKTsgbGlzdF9pdGVyICE9IGxpc3RfZWxlbXMuZW5kKCk7IGxpc3RfaXRlcisrKSB7CisgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgIGZfb3V0XyA8PCAiLCAiOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9saXN0Kil0cnVldHlwZSktPmdldF9lbGVtX3R5cGUoKSwgKmxpc3RfaXRlcik7CisgICAgfQorICAgIGZfb3V0XyA8PCAiIH0iOworICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19zZXQoKSkgeworICAgIGZfb3V0XyA8PCAieyAiOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4gbGlzdF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICA7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbGlzdF9pdGVyOworICAgIGZvciAobGlzdF9pdGVyID0gbGlzdF9lbGVtcy5iZWdpbigpOyBsaXN0X2l0ZXIgIT0gbGlzdF9lbGVtcy5lbmQoKTsgbGlzdF9pdGVyKyspIHsKKyAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgZl9vdXRfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCh0X3NldCopdHJ1ZXR5cGUpLT5nZXRfZWxlbV90eXBlKCksICpsaXN0X2l0ZXIpOworICAgIH0KKyAgICBmX291dF8gPDwgIiB9IjsKKyAgfSBlbHNlIHsKKyAgICBmX291dF8gPDwgIlVOS05PV04gVFlQRSI7CisgIH0KK30KKworLyoqCisgKiBQcmludHMgb3V0IGRvY3VtZW50YXRpb24gZm9yIGFyZ3VtZW50cy9leGNlcHRpb25zIG9mIGEgZnVuY3Rpb24sIGlmIGFueSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuCisgKiBzdXBwbGllZC4KKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF9mbl9hcmdzX2RvYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgYm9vbCBoYXNfZG9jcyA9IGZhbHNlOworICB2ZWN0b3I8dF9maWVsZCo+IGFyZ3MgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGFyZ19pdGVyID0gYXJncy5iZWdpbigpOworICBpZiAoYXJnX2l0ZXIgIT0gYXJncy5lbmQoKSkgeworICAgIGZvciAoOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyBhcmdfaXRlcisrKSB7CisgICAgICBpZiAoKCphcmdfaXRlciktPmhhc19kb2MoKSAmJiAhKCphcmdfaXRlciktPmdldF9kb2MoKS5lbXB0eSgpKQorICAgICAgICBoYXNfZG9jcyA9IHRydWU7CisgICAgfQorICAgIGlmIChoYXNfZG9jcykgeworICAgICAgYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7CisgICAgICBmX291dF8gPDwgIjxici8+PGg0IGlkPVwiUGFyYW1ldGVyc18iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgIDw8ICJcIj5QYXJhbWV0ZXJzPC9oND4iIDw8IGVuZGw7CisgICAgICBmX291dF8gPDwgIjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgdGFibGUtY29uZGVuc2VkXCI+IjsKKyAgICAgIGZfb3V0XyA8PCAiPHRoZWFkPjx0aD5OYW1lPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdGhlYWQ+IjsKKyAgICAgIGZvciAoOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyBhcmdfaXRlcisrKSB7CisgICAgICAgIGZfb3V0XyA8PCAiPHRyPjx0ZD4iIDw8ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7CisgICAgICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCgoKmFyZ19pdGVyKS0+Z2V0X2RvYygpKTsKKyAgICAgICAgZl9vdXRfIDw8ICI8L3RkPjwvdHI+IiA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9vdXRfIDw8ICI8L3RhYmxlPiI7CisgICAgfQorICB9CisKKyAgaGFzX2RvY3MgPSBmYWxzZTsKKyAgdmVjdG9yPHRfZmllbGQqPiBleGNlcHRzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGV4X2l0ZXIgPSBleGNlcHRzLmJlZ2luKCk7CisgIGlmIChleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCkpIHsKKyAgICBmb3IgKDsgZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpOyBleF9pdGVyKyspIHsKKyAgICAgIGlmICgoKmV4X2l0ZXIpLT5oYXNfZG9jKCkgJiYgISgqZXhfaXRlciktPmdldF9kb2MoKS5lbXB0eSgpKQorICAgICAgICBoYXNfZG9jcyA9IHRydWU7CisgICAgfQorICAgIGlmIChoYXNfZG9jcykgeworICAgICAgZXhfaXRlciA9IGV4Y2VwdHMuYmVnaW4oKTsKKyAgICAgIGZfb3V0XyA8PCAiPGJyLz48aDQgaWQ9XCJFeGNlcHRpb25zXyIgPDwgc2VydmljZV9uYW1lXyA8PCAiXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiPkV4Y2VwdGlvbnM8L2g0PiIgPDwgZW5kbDsKKyAgICAgIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1jb25kZW5zZWRcIj4iOworICAgICAgZl9vdXRfIDw8ICI8dGhlYWQ+PHRoPlR5cGU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90aGVhZD4iOworICAgICAgZm9yICg7IGV4X2l0ZXIgIT0gZXhjZXB0cy5lbmQoKTsgZXhfaXRlcisrKSB7CisgICAgICAgIGZfb3V0XyA8PCAiPHRyPjx0ZD4iIDw8ICgqZXhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCk7CisgICAgICAgIGZfb3V0XyA8PCAiPC90ZD48dGQ+IjsKKyAgICAgICAgZl9vdXRfIDw8IGVzY2FwZV9odG1sKCgqZXhfaXRlciktPmdldF9kb2MoKSk7CisgICAgICAgIGZfb3V0XyA8PCAiPC90ZD48L3RyPiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfb3V0XyA8PCAiPC90YWJsZT4iOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgc3RyaW5nIG5hbWUgPSB0dHlwZWRlZi0+Z2V0X25hbWUoKTsKKyAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZGVmaW5pdGlvblwiPiI7CisgIGZfb3V0XyA8PCAiPGgzIGlkPVwiVHlwZWRlZl8iIDw8IG5hbWUgPDwgIlwiPlR5cGVkZWY6ICIgPDwgbmFtZSA8PCAiPC9oMz4iIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiPHA+PHN0cm9uZz5CYXNlIHR5cGU6PC9zdHJvbmc+Jm5ic3A7IjsKKyAgcHJpbnRfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSk7CisgIGZfb3V0XyA8PCAiPC9wPiIgPDwgZW5kbDsKKyAgcHJpbnRfZG9jKHR0eXBlZGVmKTsKKyAgZl9vdXRfIDw8ICI8L2Rpdj4iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0cmluZyBuYW1lID0gdGVudW0tPmdldF9uYW1lKCk7CisgIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImRlZmluaXRpb25cIj4iOworICBmX291dF8gPDwgIjxoMyBpZD1cIkVudW1fIiA8PCBuYW1lIDw8ICJcIj5FbnVtZXJhdGlvbjogIiA8PCBuYW1lIDw8ICI8L2gzPiIgPDwgZW5kbDsKKyAgcHJpbnRfZG9jKHRlbnVtKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IHZhbHVlcyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgdmFsX2l0ZXI7CisgIGZfb3V0XyA8PCAiPGJyLz48dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkIHRhYmxlLWNvbmRlbnNlZFwiPiIgPDwgZW5kbDsKKyAgZm9yICh2YWxfaXRlciA9IHZhbHVlcy5iZWdpbigpOyB2YWxfaXRlciAhPSB2YWx1ZXMuZW5kKCk7ICsrdmFsX2l0ZXIpIHsKKyAgICBmX291dF8gPDwgIjx0cj48dGQ+PGNvZGU+IjsKKyAgICBmX291dF8gPDwgKCp2YWxfaXRlciktPmdldF9uYW1lKCk7CisgICAgZl9vdXRfIDw8ICI8L2NvZGU+PC90ZD48dGQ+PGNvZGU+IjsKKyAgICBmX291dF8gPDwgKCp2YWxfaXRlciktPmdldF92YWx1ZSgpOworICAgIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+PHRkPiIgPDwgZW5kbDsKKyAgICBwcmludF9kb2MoKCp2YWxfaXRlcikpOworICAgIGZfb3V0XyA8PCAiPC90ZD48L3RyPiIgPDwgZW5kbDsKKyAgfQorICBmX291dF8gPDwgIjwvdGFibGU+PC9kaXY+IiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICBmX291dF8gPDwgIjx0ciBpZD1cIkNvbnN0XyIgPDwgbmFtZSA8PCAiXCI+PHRkPjxjb2RlPiIgPDwgbmFtZSA8PCAiPC9jb2RlPjwvdGQ+PHRkPiI7CisgIHByaW50X3R5cGUodGNvbnN0LT5nZXRfdHlwZSgpKTsKKyAgZl9vdXRfIDw8ICI8L3RkPjx0ZD48Y29kZT4iOworICBwcmludF9jb25zdF92YWx1ZSh0Y29uc3QtPmdldF90eXBlKCksIHRjb25zdC0+Z2V0X3ZhbHVlKCkpOworICBmX291dF8gPDwgIjwvY29kZT48L3RkPjwvdHI+IjsKKyAgaWYgKHRjb25zdC0+aGFzX2RvYygpKSB7CisgICAgZl9vdXRfIDw8ICI8dHI+PHRkIGNvbHNwYW49XCIzXCI+PGJsb2NrcXVvdGU+IjsKKyAgICBwcmludF9kb2ModGNvbnN0KTsKKyAgICBmX291dF8gPDwgIjwvYmxvY2txdW90ZT48L3RkPjwvdHI+IjsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZGVmaW5pdGlvblwiPiI7CisgIGZfb3V0XyA8PCAiPGgzIGlkPVwiU3RydWN0XyIgPDwgbmFtZSA8PCAiXCI+IjsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBmX291dF8gPDwgIkV4Y2VwdGlvbjogIjsKKyAgfSBlbHNlIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgZl9vdXRfIDw8ICJVbmlvbjogIjsKKyAgfSBlbHNlIHsKKyAgICBmX291dF8gPDwgIlN0cnVjdDogIjsKKyAgfQorICBmX291dF8gPDwgbmFtZSA8PCAiPC9oMz4iIDw8IGVuZGw7CisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOworICBmX291dF8gPDwgIjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgdGFibGUtY29uZGVuc2VkXCI+IjsKKyAgZl9vdXRfIDw8ICI8dGhlYWQ+PHRoPktleTwvdGg+PHRoPkZpZWxkPC90aD48dGg+VHlwZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48dGg+UmVxdWlyZWRuZXNzPC8iCisgICAgICAgICAgICAidGg+PHRoPkRlZmF1bHQgdmFsdWU8L3RoPjwvdGhlYWQ+IiA8PCBlbmRsOworICBmb3IgKDsgbWVtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgbWVtX2l0ZXIrKykgeworICAgIGZfb3V0XyA8PCAiPHRyPjx0ZD4iIDw8ICgqbWVtX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjwvdGQ+PHRkPiI7CisgICAgZl9vdXRfIDw8ICgqbWVtX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZfb3V0XyA8PCAiPC90ZD48dGQ+IjsKKyAgICBwcmludF90eXBlKCgqbWVtX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7CisgICAgZl9vdXRfIDw8IGVzY2FwZV9odG1sKCgqbWVtX2l0ZXIpLT5nZXRfZG9jKCkpOworICAgIGZfb3V0XyA8PCAiPC90ZD48dGQ+IjsKKyAgICBpZiAoKCptZW1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICBmX291dF8gPDwgIm9wdGlvbmFsIjsKKyAgICB9IGVsc2UgaWYgKCgqbWVtX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgZl9vdXRfIDw8ICJyZXF1aXJlZCI7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfb3V0XyA8PCAiZGVmYXVsdCI7CisgICAgfQorICAgIGZfb3V0XyA8PCAiPC90ZD48dGQ+IjsKKyAgICB0X2NvbnN0X3ZhbHVlKiBkZWZhdWx0X3ZhbCA9ICgqbWVtX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpZiAoZGVmYXVsdF92YWwgIT0gTlVMTCkgeworICAgICAgZl9vdXRfIDw8ICI8Y29kZT4iOworICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCptZW1faXRlciktPmdldF90eXBlKCksIGRlZmF1bHRfdmFsKTsKKyAgICAgIGZfb3V0XyA8PCAiPC9jb2RlPiI7CisgICAgfQorICAgIGZfb3V0XyA8PCAiPC90ZD48L3RyPiIgPDwgZW5kbDsKKyAgfQorICBmX291dF8gPDwgIjwvdGFibGU+PGJyLz4iOworICBwcmludF9kb2ModHN0cnVjdCk7CisgIGZfb3V0XyA8PCAiPC9kaXY+IjsKK30KKworLyoqCisgKiBFeGNlcHRpb25zIGFyZSBzcGVjaWFsIHN0cnVjdHMKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX3N0cnVjdCh0eGNlcHRpb24pOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgSFRNTCBibG9jayBmb3IgYSBUaHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBmX291dF8gPDwgIjxoMyBpZD1cIlN2Y18iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlwiPlNlcnZpY2U6ICIgPDwgc2VydmljZV9uYW1lXyA8PCAiPC9oMz4iIDw8IGVuZGw7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7CisgICAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZXh0ZW5kc1wiPjxlbT5leHRlbmRzPC9lbT4gIjsKKyAgICBwcmludF90eXBlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBmX291dF8gPDwgIjwvZGl2PlxuIjsKKyAgfQorICBwcmludF9kb2ModHNlcnZpY2UpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKKyAgZm9yICg7IGZuX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyBmbl9pdGVyKyspIHsKKyAgICBzdHJpbmcgZm5fbmFtZSA9ICgqZm5faXRlciktPmdldF9uYW1lKCk7CisgICAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZGVmaW5pdGlvblwiPiI7CisgICAgZl9vdXRfIDw8ICI8aDQgaWQ9XCJGbl8iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIl8iIDw8IGZuX25hbWUgPDwgIlwiPkZ1bmN0aW9uOiAiIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgPDwgIi4iIDw8IGZuX25hbWUgPDwgIjwvaDQ+IiA8PCBlbmRsOworICAgIGZfb3V0XyA8PCAiPHByZT4iOworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgb2Zmc2V0ID0gcHJpbnRfdHlwZSgoKmZuX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKTsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmX291dF8gPDwgIiAiIDw8IGZuX25hbWUgPDwgIigiOworICAgIG9mZnNldCArPSBmbl9uYW1lLnNpemUoKSArIDI7CisgICAgdmVjdG9yPHRfZmllbGQqPiBhcmdzID0gKCpmbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsKKyAgICBmb3IgKDsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgYXJnX2l0ZXIrKykgeworICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICBmX291dF8gPDwgIiwiIDw8IGVuZGw7CisgICAgICAgIGZvciAoc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBpID0gMDsgaSA8IG9mZnNldDsgKytpKSB7CisgICAgICAgICAgZl9vdXRfIDw8ICIgIjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIHByaW50X3R5cGUoKCphcmdfaXRlciktPmdldF90eXBlKCkpOworICAgICAgZl9vdXRfIDw8ICIgIiA8PCAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGlmICgoKmFyZ19pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgICBmX291dF8gPDwgIiA9ICI7CisgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKmFyZ19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgICAgfQorICAgIH0KKyAgICBmX291dF8gPDwgIikiIDw8IGVuZGw7CisgICAgZmlyc3QgPSB0cnVlOworICAgIHZlY3Rvcjx0X2ZpZWxkKj4gZXhjZXB0cyA9ICgqZm5faXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOworICAgIGlmIChleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCkpIHsKKyAgICAgIGZfb3V0XyA8PCAiICAgIHRocm93cyAiOworICAgICAgZm9yICg7IGV4X2l0ZXIgIT0gZXhjZXB0cy5lbmQoKTsgZXhfaXRlcisrKSB7CisgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICBmX291dF8gPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBwcmludF90eXBlKCgqZXhfaXRlciktPmdldF90eXBlKCkpOworICAgICAgfQorICAgICAgZl9vdXRfIDw8IGVuZGw7CisgICAgfQorICAgIGZfb3V0XyA8PCAiPC9wcmU+IjsKKyAgICBwcmludF9kb2MoKmZuX2l0ZXIpOworICAgIHByaW50X2ZuX2FyZ3NfZG9jKCpmbl9pdGVyKTsKKyAgICBmX291dF8gPDwgIjwvZGl2PiI7CisgIH0KK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBodG1sLAorICAgICJIVE1MIiwKKyAgICAiICAgIHN0YW5kYWxvbmU6ICAgICAgU2VsZi1jb250YWluZWQgbW9kZSwgaW5jbHVkZXMgYWxsIENTUyBpbiB0aGUgSFRNTCBmaWxlcy5cbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVzIG5vIHN0eWxlLmNzcyBmaWxlLCBidXQgSFRNTCBmaWxlcyB3aWxsIGJlIGxhcmdlci5cbiIKKyAgICAiICAgIG5vZXNjYXBlOiAgICAgICAgRG8gbm90IGVzY2FwZSBodG1sIGluIGRvYyB0ZXh0LlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDBiMTdmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsMjQwIEBACisjZGVmaW5lIEJPT1RTVFJBUF9DU1MoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIvKiFcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIgKiBCb290c3RyYXAgdjIuMC4zXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIgKlxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIgKiBDb3B5cmlnaHQgMjAxMiBUd2l0dGVyLCBJbmNcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgdjIuMFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIgKlxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIgKiBEZXNpZ25lZCBhbmQgYnVpbHQgd2l0aCBhbGwgdGhlIGxvdmUgaW4gdGhlIHdvcmxkIEB0d2l0dGVyIGJ5IEBtZG8gYW5kIEBmYXQuXG4iICAgICAgICAgICAgICBcCisgICIgKi9cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuY2xlYXJmaXh7Knpvb206MTt9LmNsZWFyZml4OmJlZm9yZSwuY2xlYXJmaXg6YWZ0ZXJ7ZGlzcGxheTp0YWJsZTtjb250ZW50OlwiXCI7fVxuIiAgICAgICAgICAgICBcCisgICIuY2xlYXJmaXg6YWZ0ZXJ7Y2xlYXI6Ym90aDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuaGlkZS10ZXh0e2ZvbnQ6MC8wICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhO2NvbG9yOnRyYW5zcGFyZW50O3RleHQtc2hhZG93Om5vbmU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXI6MDt9XG4iICAgICAgICAgICAgICAgICBcCisgICIuaW5wdXQtYmxvY2stbGV2ZWx7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO21pbi1oZWlnaHQ6MjhweDstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstIiAgICBcCisgICJtb3otYm94LXNpemluZzpib3JkZXItYm94Oy1tcy1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O31cbiIgICAgICAgICAgICAgICAgICBcCisgICJhcnRpY2xlLGFzaWRlLGRldGFpbHMsZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGhlYWRlcixoZ3JvdXAsbmF2LHNlY3Rpb257ZGlzcGxheTpibG9jazt9XG4iICAgICBcCisgICJhdWRpbyxjYW52YXMsdmlkZW97ZGlzcGxheTppbmxpbmUtYmxvY2s7KmRpc3BsYXk6aW5saW5lOyp6b29tOjE7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhdWRpbzpub3QoW2NvbnRyb2xzXSl7ZGlzcGxheTpub25lO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJodG1se2ZvbnQtc2l6ZToxMDAlOy13ZWJraXQtdGV4dC1zaXplLWFkanVzdDoxMDAlOy1tcy10ZXh0LXNpemUtYWRqdXN0OjEwMCU7fVxuIiAgICAgICAgICAgICAgICBcCisgICJhOmZvY3Vze291dGxpbmU6dGhpbiBkb3R0ZWQgIzMzMztvdXRsaW5lOjVweCBhdXRvICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICItd2Via2l0LWZvY3VzLXJpbmctY29sb3I7b3V0bGluZS1vZmZzZXQ6LTJweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhOmhvdmVyLGE6YWN0aXZle291dGxpbmU6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJzdWIsc3Vwe3Bvc2l0aW9uOnJlbGF0aXZlO2ZvbnQtc2l6ZTo3NSU7bGluZS1oZWlnaHQ6MDt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt9XG4iICAgICAgICAgICAgICBcCisgICJzdXB7dG9wOi0wLjVlbTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJzdWJ7Ym90dG9tOi0wLjI1ZW07fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJpbWd7bWF4LXdpZHRoOjEwMCU7dmVydGljYWwtYWxpZ246bWlkZGxlO2JvcmRlcjowOy1tcy1pbnRlcnBvbGF0aW9uLW1vZGU6YmljdWJpYzt9XG4iICAgICAgICAgICBcCisgICJidXR0b24saW5wdXQsc2VsZWN0LHRleHRhcmVhe21hcmdpbjowO2ZvbnQtc2l6ZToxMDAlO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTt9XG4iICAgICAgICAgICAgICAgICBcCisgICJidXR0b24saW5wdXR7Km92ZXJmbG93OnZpc2libGU7bGluZS1oZWlnaHQ6bm9ybWFsO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJidXR0b246Oi1tb3otZm9jdXMtaW5uZXIsaW5wdXQ6Oi1tb3otZm9jdXMtaW5uZXJ7cGFkZGluZzowO2JvcmRlcjowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJidXR0b24saW5wdXRbdHlwZT1cImJ1dHRvblwiXSxpbnB1dFt0eXBlPVwicmVzZXRcIl0saW5wdXRbdHlwZT1cInN1Ym1pdFwiXXtjdXJzb3I6cG9pbnRlcjstIiAgICBcCisgICJ3ZWJraXQtYXBwZWFyYW5jZTpidXR0b247fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJpbnB1dFt0eXBlPVwic2VhcmNoXCJdey13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzoiICBcCisgICJjb250ZW50LWJveDstd2Via2l0LWFwcGVhcmFuY2U6dGV4dGZpZWxkO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJpbnB1dFt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uLGlucHV0W3R5cGU9XCJzZWFyY2hcIl06Oi13ZWJraXQtc2VhcmNoLSIgICAgICBcCisgICJjYW5jZWwtYnV0dG9uey13ZWJraXQtYXBwZWFyYW5jZTpub25lO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0ZXh0YXJlYXtvdmVyZmxvdzphdXRvO3ZlcnRpY2FsLWFsaWduOnRvcDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJib2R5e21hcmdpbjowO2ZvbnQtZmFtaWx5OlwiSGVsdmV0aWNhICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJOZXVlXCIsSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MThweDtjb2xvcjojMzMzMzMzO2JhY2tncm91bmQtIiAgICBcCisgICJjb2xvcjojZmZmZmZmO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhe2NvbG9yOiMwMDg4Y2M7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhOmhvdmVye2NvbG9yOiMwMDU1ODA7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93e21hcmdpbi1sZWZ0Oi0yMHB4Oyp6b29tOjE7fS5yb3c6YmVmb3JlLC5yb3c6YWZ0ZXJ7ZGlzcGxheTp0YWJsZTtjb250ZW50OlwiXCI7fVxuIiAgICAgICAgICBcCisgICIucm93OmFmdGVye2NsZWFyOmJvdGg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJbY2xhc3MqPVwic3BhblwiXXtmbG9hdDpsZWZ0O21hcmdpbi1sZWZ0OjIwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuY29udGFpbmVyLC5uYXZiYXItZml4ZWQtdG9wIC5jb250YWluZXIsLm5hdmJhci1maXhlZC1ib3R0b20gLmNvbnRhaW5lcnt3aWR0aDo5NDBweDt9XG4iICAgICAgICBcCisgICIuc3BhbjEye3dpZHRoOjk0MHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuc3BhbjExe3dpZHRoOjg2MHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuc3BhbjEwe3dpZHRoOjc4MHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuc3Bhbjl7d2lkdGg6NzAwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuc3Bhbjh7d2lkdGg6NjIwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuc3Bhbjd7d2lkdGg6NTQwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuc3BhbjZ7d2lkdGg6NDYwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuc3BhbjV7d2lkdGg6MzgwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuc3BhbjR7d2lkdGg6MzAwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuc3BhbjN7d2lkdGg6MjIwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuc3BhbjJ7d2lkdGg6MTQwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuc3BhbjF7d2lkdGg6NjBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0MTJ7bWFyZ2luLWxlZnQ6OTgwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0MTF7bWFyZ2luLWxlZnQ6OTAwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0MTB7bWFyZ2luLWxlZnQ6ODIwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0OXttYXJnaW4tbGVmdDo3NDBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0OHttYXJnaW4tbGVmdDo2NjBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0N3ttYXJnaW4tbGVmdDo1ODBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0NnttYXJnaW4tbGVmdDo1MDBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0NXttYXJnaW4tbGVmdDo0MjBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0NHttYXJnaW4tbGVmdDozNDBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0M3ttYXJnaW4tbGVmdDoyNjBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0MnttYXJnaW4tbGVmdDoxODBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0MXttYXJnaW4tbGVmdDoxMDBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlke3dpZHRoOjEwMCU7Knpvb206MTt9LnJvdy1mbHVpZDpiZWZvcmUsLnJvdy1mbHVpZDphZnRlcntkaXNwbGF5OnRhYmxlO2NvbnRlbnQ6XCJcIjt9IiBcCisgICJcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkOmFmdGVye2NsZWFyOmJvdGg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJbY2xhc3MqPVwic3BhblwiXXtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7bWluLWhlaWdodDoyOHB4Oy13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otIiBcCisgICJib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1zLWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZmxvYXQ6bGVmdDttYXJnaW4tbGVmdDoiICBcCisgICIyLjEyNzY1OTU3NCU7Km1hcmdpbi1sZWZ0OjIuMDc0NDY4MDg0NjM4Mjk3NyU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIFtjbGFzcyo9XCJzcGFuXCJdOmZpcnN0LWNoaWxke21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuMTJ7d2lkdGg6OTkuOTk5OTk5OTg5OTk5OTklOyp3aWR0aDo5OS45NDY4MDg1MDA2MzgyOCU7fVxuIiAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuMTF7d2lkdGg6OTEuNDg5MzYxNjkzJTsqd2lkdGg6OTEuNDM2MTcwMjAzNjM4MyU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuMTB7d2lkdGg6ODIuOTc4NzIzMzk1OTk5OTklOyp3aWR0aDo4Mi45MjU1MzE5MDY2MzgyOCU7fVxuIiAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuOXt3aWR0aDo3NC40NjgwODUwOTklOyp3aWR0aDo3NC40MTQ4OTM2MDk2MzgzJTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuOHt3aWR0aDo2NS45NTc0NDY4MDE5OTk5OSU7KndpZHRoOjY1LjkwNDI1NTMxMjYzODI4JTt9XG4iICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuN3t3aWR0aDo1Ny40NDY4MDg1MDUlOyp3aWR0aDo1Ny4zOTM2MTcwMTU2MzgzJTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuNnt3aWR0aDo0OC45MzYxNzAyMDc5OTk5OSU7KndpZHRoOjQ4Ljg4Mjk3ODcxODYzODI5JTt9XG4iICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuNXt3aWR0aDo0MC40MjU1MzE5MTElOyp3aWR0aDo0MC4zNzIzNDA0MjE2MzgzJTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuNHt3aWR0aDozMS45MTQ4OTM2MTQlOyp3aWR0aDozMS44NjE3MDIxMjQ2MzgzJTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuM3t3aWR0aDoyMy40MDQyNTUzMTclOyp3aWR0aDoyMy4zNTEwNjM4Mjc2MzgzJTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuMnt3aWR0aDoxNC44OTM2MTcwMiU7KndpZHRoOjE0Ljg0MDQyNTUzMDYzODMlO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuMXt3aWR0aDo2LjM4Mjk3ODcyMyU7KndpZHRoOjYuMzI5Nzg3MjMzNjM4Mjk4JTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuY29udGFpbmVye21hcmdpbi1yaWdodDphdXRvO21hcmdpbi1sZWZ0OmF1dG87Knpvb206MTt9LmNvbnRhaW5lcjpiZWZvcmUsLmNvbnRhaW5lcjphZnRlcnsiICAgICBcCisgICJkaXNwbGF5OnRhYmxlO2NvbnRlbnQ6XCJcIjt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuY29udGFpbmVyOmFmdGVye2NsZWFyOmJvdGg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuY29udGFpbmVyLWZsdWlke3BhZGRpbmctcmlnaHQ6MjBweDtwYWRkaW5nLWxlZnQ6MjBweDsqem9vbToxO30uY29udGFpbmVyLWZsdWlkOmJlZm9yZSwuIiAgICAgICBcCisgICJjb250YWluZXItZmx1aWQ6YWZ0ZXJ7ZGlzcGxheTp0YWJsZTtjb250ZW50OlwiXCI7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuY29udGFpbmVyLWZsdWlkOmFmdGVye2NsZWFyOmJvdGg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJwe21hcmdpbjowIDAgOXB4O2ZvbnQtZmFtaWx5OlwiSGVsdmV0aWNhICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJOZXVlXCIsSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MThweDt9cCAiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJzbWFsbHtmb250LXNpemU6MTFweDtjb2xvcjojOTk5OTk5O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubGVhZHttYXJnaW4tYm90dG9tOjE4cHg7Zm9udC1zaXplOjIwcHg7Zm9udC13ZWlnaHQ6MjAwO2xpbmUtaGVpZ2h0OjI3cHg7fVxuIiAgICAgICAgICAgICAgICAgICBcCisgICJoMSxoMixoMyxoNCxoNSxoNnttYXJnaW46MDtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtd2VpZ2h0OmJvbGQ7Y29sb3I6aW5oZXJpdDt0ZXh0LXJlbmRlcmluZzoiICBcCisgICJvcHRpbWl6ZWxlZ2liaWxpdHk7fWgxIHNtYWxsLGgyIHNtYWxsLGgzIHNtYWxsLGg0IHNtYWxsLGg1IHNtYWxsLGg2ICIgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJzbWFsbHtmb250LXdlaWdodDpub3JtYWw7Y29sb3I6Izk5OTk5OTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJoMXtmb250LXNpemU6MzBweDtsaW5lLWhlaWdodDozNnB4O31oMSBzbWFsbHtmb250LXNpemU6MThweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJoMntmb250LXNpemU6MjRweDtsaW5lLWhlaWdodDozNnB4O31oMiBzbWFsbHtmb250LXNpemU6MThweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJoM3tmb250LXNpemU6MThweDtsaW5lLWhlaWdodDoyN3B4O31oMyBzbWFsbHtmb250LXNpemU6MTRweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJoNCxoNSxoNntsaW5lLWhlaWdodDoxOHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJoNHtmb250LXNpemU6MTRweDt9aDQgc21hbGx7Zm9udC1zaXplOjEycHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJoNXtmb250LXNpemU6MTJweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJoNntmb250LXNpemU6MTFweDtjb2xvcjojOTk5OTk5O3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucGFnZS1oZWFkZXJ7cGFkZGluZy1ib3R0b206MTdweDttYXJnaW46MThweCAwO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlZWVlZWU7fVxuIiAgICAgICAgICAgICBcCisgICIucGFnZS1oZWFkZXIgaDF7bGluZS1oZWlnaHQ6MTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ1bCxvbHtwYWRkaW5nOjA7bWFyZ2luOjAgMCA5cHggMjVweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ1bCB1bCx1bCBvbCxvbCBvbCxvbCB1bHttYXJnaW4tYm90dG9tOjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ1bHtsaXN0LXN0eWxlOmRpc2M7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJvbHtsaXN0LXN0eWxlOmRlY2ltYWw7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJsaXtsaW5lLWhlaWdodDoxOHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ1bC51bnN0eWxlZCxvbC51bnN0eWxlZHttYXJnaW4tbGVmdDowO2xpc3Qtc3R5bGU6bm9uZTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJkbHttYXJnaW4tYm90dG9tOjE4cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJkdCxkZHtsaW5lLWhlaWdodDoxOHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJkdHtmb250LXdlaWdodDpib2xkO2xpbmUtaGVpZ2h0OjE3cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJkZHttYXJnaW4tbGVmdDo5cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuZGwtaG9yaXpvbnRhbCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJkdHtmbG9hdDpsZWZ0O3dpZHRoOjEyMHB4O2NsZWFyOmxlZnQ7dGV4dC1hbGlnbjpyaWdodDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczsiICBcCisgICJ3aGl0ZS1zcGFjZTpub3dyYXA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuZGwtaG9yaXpvbnRhbCBkZHttYXJnaW4tbGVmdDoxMzBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJocnttYXJnaW46MThweCAwO2JvcmRlcjowO2JvcmRlci10b3A6MXB4IHNvbGlkICNlZWVlZWU7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2ZmZmZmZjt9XG4iICAgICBcCisgICJzdHJvbmd7Zm9udC13ZWlnaHQ6Ym9sZDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJlbXtmb250LXN0eWxlOml0YWxpYzt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubXV0ZWR7Y29sb3I6Izk5OTk5OTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhYmJyW3RpdGxlXXtjdXJzb3I6aGVscDtib3JkZXItYm90dG9tOjFweCBkb3R0ZWQgI2RkZDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhYmJyLmluaXRpYWxpc217Zm9udC1zaXplOjkwJTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJibG9ja3F1b3Rle3BhZGRpbmc6MCAwIDAgMTVweDttYXJnaW46MCAwIDE4cHg7Ym9yZGVyLWxlZnQ6NXB4IHNvbGlkICNlZWVlZWU7fWJsb2NrcXVvdGUgIiAgICAgICBcCisgICJwe21hcmdpbi1ib3R0b206MDtmb250LXNpemU6MTZweDtmb250LXdlaWdodDozMDA7bGluZS1oZWlnaHQ6MjIuNXB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJibG9ja3F1b3RlIHNtYWxse2Rpc3BsYXk6YmxvY2s7bGluZS1oZWlnaHQ6MThweDtjb2xvcjojOTk5OTk5O31ibG9ja3F1b3RlICIgICAgICAgICAgICAgICAgICAgICBcCisgICJzbWFsbDpiZWZvcmV7Y29udGVudDonXFwyMDE0IFxcMDBBMCc7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJibG9ja3F1b3RlLnB1bGwtcmlnaHR7ZmxvYXQ6cmlnaHQ7cGFkZGluZy1yaWdodDoxNXB4O3BhZGRpbmctbGVmdDowO2JvcmRlci1yaWdodDo1cHggc29saWQgIiAgICBcCisgICIjZWVlZWVlO2JvcmRlci1sZWZ0OjA7fWJsb2NrcXVvdGUucHVsbC1yaWdodCBwLGJsb2NrcXVvdGUucHVsbC1yaWdodCAiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJzbWFsbHt0ZXh0LWFsaWduOnJpZ2h0O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJxOmJlZm9yZSxxOmFmdGVyLGJsb2NrcXVvdGU6YmVmb3JlLGJsb2NrcXVvdGU6YWZ0ZXJ7Y29udGVudDpcIlwiO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhZGRyZXNze2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbToxOHB4O2ZvbnQtc3R5bGU6bm9ybWFsO2xpbmUtaGVpZ2h0OjE4cHg7fVxuIiAgICAgICAgICAgICAgICBcCisgICJzbWFsbHtmb250LXNpemU6MTAwJTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJjaXRle2ZvbnQtc3R5bGU6bm9ybWFsO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJjb2RlLHByZXtwYWRkaW5nOjAgM3B4IDJweDtmb250LWZhbWlseTpNZW5sbyxNb25hY28sQ29uc29sYXMsXCJDb3VyaWVyICIgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJOZXdcIixtb25vc3BhY2U7Zm9udC1zaXplOjEycHg7Y29sb3I6IzMzMzMzMzstd2Via2l0LWJvcmRlci1yYWRpdXM6M3B4Oy1tb3otYm9yZGVyLXJhZGl1czozcHg7IiBcCisgICJib3JkZXItcmFkaXVzOjNweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJjb2Rle3BhZGRpbmc6MnB4IDRweDtjb2xvcjojZDE0O2JhY2tncm91bmQtY29sb3I6I2Y3ZjdmOTtib3JkZXI6MXB4IHNvbGlkICNlMWUxZTg7fVxuIiAgICAgICAgICBcCisgICJwcmV7ZGlzcGxheTpibG9jaztwYWRkaW5nOjguNXB4O21hcmdpbjowIDAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICI5cHg7Zm9udC1zaXplOjEyLjAyNXB4O2xpbmUtaGVpZ2h0OjE4cHg7d29yZC1icmVhazpicmVhay1hbGw7d29yZC13cmFwOmJyZWFrLXdvcmQ7d2hpdGUtc3BhY2U6IiBcCisgICJwcmU7d2hpdGUtc3BhY2U6cHJlLXdyYXA7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1O2JvcmRlcjoxcHggc29saWQgI2NjYztib3JkZXI6MXB4IHNvbGlkICIgICAgICBcCisgICJyZ2JhKDAsIDAsIDAsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIwLjE1KTstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czo0cHg7fXByZS5wcmV0dHlwcmludHsiICAgICBcCisgICJtYXJnaW4tYm90dG9tOjE4cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJwcmUgY29kZXtwYWRkaW5nOjA7Y29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlcjowO31cbiIgICAgICAgICAgICAgICAgICAgICBcCisgICIucHJlLXNjcm9sbGFibGV7bWF4LWhlaWdodDozNDBweDtvdmVyZmxvdy15OnNjcm9sbDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubGFiZWwsLmJhZGdle2ZvbnQtc2l6ZToxMC45OThweDtmb250LXdlaWdodDpib2xkO2xpbmUtaGVpZ2h0OjE0cHg7Y29sb3I6I2ZmZmZmZjt2ZXJ0aWNhbC0iICAgICBcCisgICJhbGlnbjpiYXNlbGluZTt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1zaGFkb3c6MCAtMXB4IDAgcmdiYSgwLCAwLCAwLCAiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIwLjI1KTtiYWNrZ3JvdW5kLWNvbG9yOiM5OTk5OTk7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubGFiZWx7cGFkZGluZzoxcHggNHB4ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIycHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjNweDstbW96LWJvcmRlci1yYWRpdXM6M3B4O2JvcmRlci1yYWRpdXM6M3B4O31cbiIgICAgICAgICAgICAgICAgICAgICBcCisgICIuYmFkZ2V7cGFkZGluZzoxcHggOXB4ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIycHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjlweDstbW96LWJvcmRlci1yYWRpdXM6OXB4O2JvcmRlci1yYWRpdXM6OXB4O31cbiIgICAgICAgICAgICAgICAgICAgICBcCisgICJhLmxhYmVsOmhvdmVyLGEuYmFkZ2U6aG92ZXJ7Y29sb3I6I2ZmZmZmZjt0ZXh0LWRlY29yYXRpb246bm9uZTtjdXJzb3I6cG9pbnRlcjt9XG4iICAgICAgICAgICAgICBcCisgICIubGFiZWwtaW1wb3J0YW50LC5iYWRnZS1pbXBvcnRhbnR7YmFja2dyb3VuZC1jb2xvcjojYjk0YTQ4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubGFiZWwtaW1wb3J0YW50W2hyZWZdLC5iYWRnZS1pbXBvcnRhbnRbaHJlZl17YmFja2dyb3VuZC1jb2xvcjojOTUzYjM5O31cbiIgICAgICAgICAgICAgICAgICAgICBcCisgICIubGFiZWwtd2FybmluZywuYmFkZ2Utd2FybmluZ3tiYWNrZ3JvdW5kLWNvbG9yOiNmODk0MDY7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubGFiZWwtd2FybmluZ1tocmVmXSwuYmFkZ2Utd2FybmluZ1tocmVmXXtiYWNrZ3JvdW5kLWNvbG9yOiNjNjc2MDU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubGFiZWwtc3VjY2VzcywuYmFkZ2Utc3VjY2Vzc3tiYWNrZ3JvdW5kLWNvbG9yOiM0Njg4NDc7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubGFiZWwtc3VjY2Vzc1tocmVmXSwuYmFkZ2Utc3VjY2Vzc1tocmVmXXtiYWNrZ3JvdW5kLWNvbG9yOiMzNTY2MzU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubGFiZWwtaW5mbywuYmFkZ2UtaW5mb3tiYWNrZ3JvdW5kLWNvbG9yOiMzYTg3YWQ7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubGFiZWwtaW5mb1tocmVmXSwuYmFkZ2UtaW5mb1tocmVmXXtiYWNrZ3JvdW5kLWNvbG9yOiMyZDY5ODc7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubGFiZWwtaW52ZXJzZSwuYmFkZ2UtaW52ZXJzZXtiYWNrZ3JvdW5kLWNvbG9yOiMzMzMzMzM7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubGFiZWwtaW52ZXJzZVtocmVmXSwuYmFkZ2UtaW52ZXJzZVtocmVmXXtiYWNrZ3JvdW5kLWNvbG9yOiMxYTFhMWE7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZXttYXgtd2lkdGg6MTAwJTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtib3JkZXItc3BhY2luZzowO30iICBcCisgICJcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGV7d2lkdGg6MTAwJTttYXJnaW4tYm90dG9tOjE4cHg7fS50YWJsZSB0aCwudGFibGUgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0ZHtwYWRkaW5nOjhweDtsaW5lLWhlaWdodDoxOHB4O3RleHQtYWxpZ246bGVmdDt2ZXJ0aWNhbC1hbGlnbjp0b3A7Ym9yZGVyLXRvcDoxcHggc29saWQgIiAgICAgICBcCisgICIjZGRkZGRkO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUgdGh7Zm9udC13ZWlnaHQ6Ym9sZDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUgdGhlYWQgdGh7dmVydGljYWwtYWxpZ246Ym90dG9tO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUgY2FwdGlvbit0aGVhZCB0cjpmaXJzdC1jaGlsZCB0aCwudGFibGUgY2FwdGlvbit0aGVhZCB0cjpmaXJzdC1jaGlsZCB0ZCwudGFibGUgIiAgICAgICAgICBcCisgICJjb2xncm91cCt0aGVhZCB0cjpmaXJzdC1jaGlsZCB0aCwudGFibGUgY29sZ3JvdXArdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGQsLnRhYmxlICIgICAgICAgICAgICAgICBcCisgICJ0aGVhZDpmaXJzdC1jaGlsZCB0cjpmaXJzdC1jaGlsZCB0aCwudGFibGUgdGhlYWQ6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgIiAgICAgICAgICAgICAgICAgICBcCisgICJ0ZHtib3JkZXItdG9wOjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUgdGJvZHkrdGJvZHl7Ym9yZGVyLXRvcDoycHggc29saWQgI2RkZGRkZDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUtY29uZGVuc2VkIHRoLC50YWJsZS1jb25kZW5zZWQgdGR7cGFkZGluZzo0cHggNXB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUtYm9yZGVyZWR7Ym9yZGVyOjFweCBzb2xpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIjZGRkZGRkO2JvcmRlci1jb2xsYXBzZTpzZXBhcmF0ZTsqYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlZDtib3JkZXItbGVmdDowOy13ZWJraXQtYm9yZGVyLSIgICAgICBcCisgICJyYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czo0cHg7fS50YWJsZS1ib3JkZXJlZCB0aCwudGFibGUtYm9yZGVyZWQgIiAgICAgICBcCisgICJ0ZHtib3JkZXItbGVmdDoxcHggc29saWQgI2RkZGRkZDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUtYm9yZGVyZWQgY2FwdGlvbit0aGVhZCB0cjpmaXJzdC1jaGlsZCB0aCwudGFibGUtYm9yZGVyZWQgY2FwdGlvbit0Ym9keSB0cjpmaXJzdC1jaGlsZCAiICBcCisgICJ0aCwudGFibGUtYm9yZGVyZWQgY2FwdGlvbit0Ym9keSB0cjpmaXJzdC1jaGlsZCB0ZCwudGFibGUtYm9yZGVyZWQgY29sZ3JvdXArdGhlYWQgIiAgICAgICAgICAgICBcCisgICJ0cjpmaXJzdC1jaGlsZCB0aCwudGFibGUtYm9yZGVyZWQgY29sZ3JvdXArdGJvZHkgdHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlLWJvcmRlcmVkICIgICAgICAgICAgICBcCisgICJjb2xncm91cCt0Ym9keSB0cjpmaXJzdC1jaGlsZCB0ZCwudGFibGUtYm9yZGVyZWQgdGhlYWQ6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgIiAgICAgICAgICAgICBcCisgICJ0aCwudGFibGUtYm9yZGVyZWQgdGJvZHk6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlLWJvcmRlcmVkIHRib2R5OmZpcnN0LWNoaWxkICIgICAgICBcCisgICJ0cjpmaXJzdC1jaGlsZCB0ZHtib3JkZXItdG9wOjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUtYm9yZGVyZWQgdGhlYWQ6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQsLnRhYmxlLWJvcmRlcmVkICIgICAgICAgICAgICAgICBcCisgICJ0Ym9keTpmaXJzdC1jaGlsZCB0cjpmaXJzdC1jaGlsZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0ZDpmaXJzdC1jaGlsZHstd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6NHB4O2JvcmRlci10b3AtbGVmdC1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLSIgICAgICBcCisgICJyYWRpdXMtdG9wbGVmdDo0cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUtYm9yZGVyZWQgdGhlYWQ6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgdGg6bGFzdC1jaGlsZCwudGFibGUtYm9yZGVyZWQgIiAgICAgICAgICAgICAgICBcCisgICJ0Ym9keTpmaXJzdC1jaGlsZCB0cjpmaXJzdC1jaGlsZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0ZDpsYXN0LWNoaWxkey13ZWJraXQtYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6NHB4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweDstbW96LWJvcmRlci0iICAgICBcCisgICJyYWRpdXMtdG9wcmlnaHQ6NHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUtYm9yZGVyZWQgdGhlYWQ6bGFzdC1jaGlsZCB0cjpsYXN0LWNoaWxkIHRoOmZpcnN0LWNoaWxkLC50YWJsZS1ib3JkZXJlZCAiICAgICAgICAgICAgICAgICBcCisgICJ0Ym9keTpsYXN0LWNoaWxkIHRyOmxhc3QtY2hpbGQgdGQ6Zmlyc3QtY2hpbGR7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjAgMCAwICIgICAgICAgICAgICAgICAgICAgICBcCisgICI0cHg7LW1vei1ib3JkZXItcmFkaXVzOjAgMCAwIDRweDtib3JkZXItcmFkaXVzOjAgMCAwICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICI0cHg7LXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjRweDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXMtIiAgICBcCisgICJib3R0b21sZWZ0OjRweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUtYm9yZGVyZWQgdGhlYWQ6bGFzdC1jaGlsZCB0cjpsYXN0LWNoaWxkIHRoOmxhc3QtY2hpbGQsLnRhYmxlLWJvcmRlcmVkIHRib2R5Omxhc3QtY2hpbGQgIiBcCisgICJ0cjpsYXN0LWNoaWxkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0ZDpsYXN0LWNoaWxkey13ZWJraXQtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NHB4O2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjRweDstbW96LSIgICAgICBcCisgICJib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0OjRweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUtc3RyaXBlZCB0Ym9keSB0cjpudGgtY2hpbGQob2RkKSB0ZCwudGFibGUtc3RyaXBlZCB0Ym9keSB0cjpudGgtY2hpbGQob2RkKSAiICAgICAgICAgICAgICBcCisgICJ0aHtiYWNrZ3JvdW5kLWNvbG9yOiNmOWY5Zjk7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUgdGJvZHkgdHI6aG92ZXIgdGQsLnRhYmxlIHRib2R5IHRyOmhvdmVyIHRoe2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNTt9XG4iICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjF7ZmxvYXQ6bm9uZTt3aWR0aDo0NHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjJ7ZmxvYXQ6bm9uZTt3aWR0aDoxMjRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjN7ZmxvYXQ6bm9uZTt3aWR0aDoyMDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjR7ZmxvYXQ6bm9uZTt3aWR0aDoyODRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjV7ZmxvYXQ6bm9uZTt3aWR0aDozNjRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjZ7ZmxvYXQ6bm9uZTt3aWR0aDo0NDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3Bhbjd7ZmxvYXQ6bm9uZTt3aWR0aDo1MjRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3Bhbjh7ZmxvYXQ6bm9uZTt3aWR0aDo2MDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3Bhbjl7ZmxvYXQ6bm9uZTt3aWR0aDo2ODRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjEwe2Zsb2F0Om5vbmU7d2lkdGg6NzY0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjExe2Zsb2F0Om5vbmU7d2lkdGg6ODQ0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjEye2Zsb2F0Om5vbmU7d2lkdGg6OTI0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjEze2Zsb2F0Om5vbmU7d2lkdGg6MTAwNHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjE0e2Zsb2F0Om5vbmU7d2lkdGg6MTA4NHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjE1e2Zsb2F0Om5vbmU7d2lkdGg6MTE2NHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjE2e2Zsb2F0Om5vbmU7d2lkdGg6MTI0NHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjE3e2Zsb2F0Om5vbmU7d2lkdGg6MTMyNHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjE4e2Zsb2F0Om5vbmU7d2lkdGg6MTQwNHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjE5e2Zsb2F0Om5vbmU7d2lkdGg6MTQ4NHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjIwe2Zsb2F0Om5vbmU7d2lkdGg6MTU2NHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjIxe2Zsb2F0Om5vbmU7d2lkdGg6MTY0NHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjIye2Zsb2F0Om5vbmU7d2lkdGg6MTcyNHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjIze2Zsb2F0Om5vbmU7d2lkdGg6MTgwNHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjI0e2Zsb2F0Om5vbmU7d2lkdGg6MTg4NHB4O21hcmdpbi1sZWZ0OjA7fSIKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfamF2YV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjODQ1NTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsNTQ1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjdGltZT4KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c2V0ZmlsbDsKK3VzaW5nIHN0ZDo6c2V0dzsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEphdmEgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X2phdmFfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfamF2YV9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBiZWFuX3N0eWxlXyA9IGZhbHNlOworICAgIGFuZHJvaWRfc3R5bGVfID0gZmFsc2U7CisgICAgcHJpdmF0ZV9tZW1iZXJzXyA9IGZhbHNlOworICAgIG5vY2FtZWxfc3R5bGVfID0gZmFsc2U7CisgICAgZnVsbGNhbWVsX3N0eWxlXyA9IGZhbHNlOworICAgIGFuZHJvaWRfbGVnYWN5XyA9IGZhbHNlOworICAgIHNvcnRlZF9jb250YWluZXJzXyA9IGZhbHNlOworICAgIGphdmE1XyA9IGZhbHNlOworICAgIHJldXNlX29iamVjdHNfID0gZmFsc2U7CisgICAgdXNlX29wdGlvbl90eXBlXyA9IGZhbHNlOworICAgIHVuZGF0ZWRfZ2VuZXJhdGVkX2Fubm90YXRpb25zXyAgPSBmYWxzZTsKKyAgICBzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfID0gZmFsc2U7CisgICAgcmV0aHJvd191bmhhbmRsZWRfZXhjZXB0aW9uc18gPSBmYWxzZTsKKyAgICB1bnNhZmVfYmluYXJpZXNfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYmVhbnMiKSA9PSAwKSB7CisgICAgICAgIGJlYW5fc3R5bGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYW5kcm9pZCIpID09IDApIHsKKyAgICAgICAgYW5kcm9pZF9zdHlsZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJwcml2YXRlLW1lbWJlcnMiKSA9PSAwKSB7CisgICAgICAgIHByaXZhdGVfbWVtYmVyc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub2NhbWVsIikgPT0gMCkgeworICAgICAgICBub2NhbWVsX3N0eWxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImZ1bGxjYW1lbCIpID09IDApIHsKKyAgICAgICAgZnVsbGNhbWVsX3N0eWxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImFuZHJvaWRfbGVnYWN5IikgPT0gMCkgeworICAgICAgICBhbmRyb2lkX2xlZ2FjeV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJzb3J0ZWRfY29udGFpbmVycyIpID09IDApIHsKKyAgICAgICAgc29ydGVkX2NvbnRhaW5lcnNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiamF2YTUiKSA9PSAwKSB7CisgICAgICAgIGphdmE1XyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInJldXNlLW9iamVjdHMiKSA9PSAwKSB7CisgICAgICAgIHJldXNlX29iamVjdHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgib3B0aW9uX3R5cGUiKSA9PSAwKSB7CisgICAgICAgIHVzZV9vcHRpb25fdHlwZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJyZXRocm93X3VuaGFuZGxlZF9leGNlcHRpb25zIikgPT0gMCkgeworICAgICAgICByZXRocm93X3VuaGFuZGxlZF9leGNlcHRpb25zXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImdlbmVyYXRlZF9hbm5vdGF0aW9ucyIpID09IDApIHsKKyAgICAgICAgaWYoIGl0ZXItPnNlY29uZC5jb21wYXJlKCJ1bmRhdGVkIikgPT0gMCkgeworICAgICAgICAgIHVuZGF0ZWRfZ2VuZXJhdGVkX2Fubm90YXRpb25zXyAgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYoaXRlci0+c2Vjb25kLmNvbXBhcmUoInN1cHByZXNzIikgPT0gMCkgeworICAgICAgICAgIHN1cHByZXNzX2dlbmVyYXRlZF9hbm5vdGF0aW9uc18gPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBqYXZhOiIgKyBpdGVyLT5maXJzdCArICI9IiArIGl0ZXItPnNlY29uZDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ1bnNhZmVfYmluYXJpZXMiKSA9PSAwKSB7CisgICAgICAgIHVuc2FmZV9iaW5hcmllc18gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGphdmE6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIGlmIChqYXZhNV8pIHsKKyAgICAgIGFuZHJvaWRfbGVnYWN5XyA9IHRydWU7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9IChiZWFuX3N0eWxlXyA/ICJnZW4tamF2YWJlYW4iIDogImdlbi1qYXZhIik7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbih0X3N0cnVjdCogdHVuaW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcGFyY2VsYWJsZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZV9vYmplY3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkX29iamVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2phdmFfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9maWVsZF9ieV9pZChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOworICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBhc19jYW1lbF9jYXNlKHN0ZDo6c3RyaW5nIG5hbWUsIGJvb2wgdWNmaXJzdCA9IHRydWUpOworICBzdGQ6OnN0cmluZyBnZXRfcnBjX21ldGhvZF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGQpOworICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXgpOworICBzdGQ6OnN0cmluZyBpc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9hc3luY19jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9hc3luY19zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfYXN5bmNfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2dldHRlcnNfYW5kX3NldHRlcnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb25faXNfc2V0X21ldGhvZHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jaGVja190eXBlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV9yZWFkX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV93cml0ZV92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV90dXBsZV9zY2hlbWVfcmVhZF92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV90dXBsZV9zY2hlbWVfd3JpdGVfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9uYW1lKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb25faGFzaGNvZGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zY2hlbWVfbWFwKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0YW5kYXJkX3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RhbmRhcmRfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3N0YW5kYXJkX3NjaGVtZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV9zY2hlbWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfc2NoZW1lX2xvb2t1cChvc3RyZWFtJiBvdXQpOworCisgIHZvaWQgZ2VuZXJhdGVfamF2YXhfZ2VuZXJhdGVkX2Fubm90YXRpb24ob3N0cmVhbSYgb3V0KTsKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9iaiA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBvYmogPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgb2JqID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKKworICB2b2lkIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpOworICB2b2lkIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpOworCisgIGVudW0gaXNzZXRfdHlwZSB7IElTU0VUX05PTkUsIElTU0VUX1BSSU1JVElWRSwgSVNTRVRfQklUU0VUIH07CisgIGlzc2V0X3R5cGUgbmVlZHNfaXNzZXQodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nKiBvdXRQcmltaXRpdmVUeXBlID0gTlVMTCk7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIGphdmFfcGFja2FnZSgpOworICBzdGQ6OnN0cmluZyBqYXZhX3N1cHByZXNzaW9ucygpOworICBzdGQ6OnN0cmluZyBqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9pbml0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNraXBfZ2VuZXJpYyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZV9uYW1lc3BhY2UgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQgPSBmYWxzZSwgYm9vbCBjb21tZW50ID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9iYXNlX21ldGhvZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfdHlwZXMgPSB0cnVlKTsKKyAgc3RkOjpzdHJpbmcgYXN5bmNfZnVuY3Rpb25fY2FsbF9hcmdsaXN0KHRfZnVuY3Rpb24qIHRmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfYmFzZV9tZXRob2QgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX3R5cGVzID0gdHJ1ZSk7CisgIHN0ZDo6c3RyaW5nIGFzeW5jX2FyZ3VtZW50X2xpc3QodF9mdW5jdGlvbiogdGZ1bmN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX3R5cGVzID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGVzY3Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfbmFtZV9jb25zdGFudHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgc3RkOjpzdHJpbmcgbWFrZV92YWxpZF9qYXZhX2ZpbGVuYW1lKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSk7CisgIHN0ZDo6c3RyaW5nIG1ha2VfdmFsaWRfamF2YV9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSk7CisKKyAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKKyAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworCisgICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX3N0cmluZygpCisgICAgICAgICAgIHx8IHR0eXBlLT5pc19lbnVtKCk7CisgIH0KKworICBib29sIGlzX2RlcHJlY2F0ZWQoY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgYW5ub3RhdGlvbnMpIHsKKyAgICByZXR1cm4gYW5ub3RhdGlvbnMuZmluZCgiZGVwcmVjYXRlZCIpICE9IGFubm90YXRpb25zLmVuZCgpOworICB9CisKKyAgYm9vbCBpc19lbnVtX3NldCh0X3R5cGUqIHR0eXBlKSB7CisgICAgaWYgKCFzb3J0ZWRfY29udGFpbmVyc18pIHsKKyAgICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgICAgICBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHRzZXQtPmdldF9lbGVtX3R5cGUoKSk7CisgICAgICAgIHJldHVybiBlbGVtX3R5cGUtPmlzX2VudW0oKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBpc19lbnVtX21hcCh0X3R5cGUqIHR0eXBlKSB7CisgICAgaWYgKCFzb3J0ZWRfY29udGFpbmVyc18pIHsKKyAgICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgICAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICAgICAgdF90eXBlKiBrZXlfdHlwZSA9IGdldF90cnVlX3R5cGUodG1hcC0+Z2V0X2tleV90eXBlKCkpOworICAgICAgICByZXR1cm4ga2V5X3R5cGUtPmlzX2VudW0oKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RkOjpzdHJpbmcgaW5uZXJfZW51bV90eXBlX25hbWUodF90eXBlKiB0dHlwZSkgeworICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgICAgdF90eXBlKiBrZXlfdHlwZSA9IGdldF90cnVlX3R5cGUodG1hcC0+Z2V0X2tleV90eXBlKCkpOworICAgICAgcmV0dXJuIHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSkgKyAiLmNsYXNzIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHRzZXQtPmdldF9lbGVtX3R5cGUoKSk7CisgICAgICByZXR1cm4gdHlwZV9uYW1lKGVsZW1fdHlwZSwgdHJ1ZSkgKyAiLmNsYXNzIjsKKyAgICB9CisgICAgcmV0dXJuICIiOworICB9CisKKyAgc3RkOjpzdHJpbmcgY29uc3RhbnRfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKKworICBib29sIGJlYW5fc3R5bGVfOworICBib29sIGFuZHJvaWRfc3R5bGVfOworICBib29sIHByaXZhdGVfbWVtYmVyc187CisgIGJvb2wgbm9jYW1lbF9zdHlsZV87CisgIGJvb2wgZnVsbGNhbWVsX3N0eWxlXzsKKyAgYm9vbCBhbmRyb2lkX2xlZ2FjeV87CisgIGJvb2wgamF2YTVfOworICBib29sIHNvcnRlZF9jb250YWluZXJzXzsKKyAgYm9vbCByZXVzZV9vYmplY3RzXzsKKyAgYm9vbCB1c2Vfb3B0aW9uX3R5cGVfOworICBib29sIHVuZGF0ZWRfZ2VuZXJhdGVkX2Fubm90YXRpb25zXzsKKyAgYm9vbCBzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfOworICBib29sIHJldGhyb3dfdW5oYW5kbGVkX2V4Y2VwdGlvbnNfOworICBib29sIHVuc2FmZV9iaW5hcmllc187CisKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBwYWNrYWdlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImphdmEiKTsKKworICBzdHJpbmcgZGlyID0gcGFja2FnZV9uYW1lXzsKKyAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgIGRpciA9IGRpci5zdWJzdHIobG9jICsgMSk7CisgIH0KKyAgaWYgKGRpci5zaXplKCkgPiAwKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgfQorCisgIHBhY2thZ2VfZGlyXyA9IHN1YmRpcjsKK30KKworLyoqCisgKiBQYWNrYWdlcyB0aGUgZ2VuZXJhdGVkIGZpbGUKKyAqCisgKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgcGFja2FnZSwgaS5lLiAicGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdGRlbW87IgorICovCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6amF2YV9wYWNrYWdlKCkgeworICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgeworICAgIHJldHVybiBzdHJpbmcoInBhY2thZ2UgIikgKyBwYWNrYWdlX25hbWVfICsgIjtcblxuIjsKKyAgfQorICByZXR1cm4gIiI7Cit9CisKK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpqYXZhX3N1cHByZXNzaW9ucygpIHsKKyAgcmV0dXJuICJAU3VwcHJlc3NXYXJuaW5ncyh7XCJjYXN0XCIsIFwicmF3dHlwZXNcIiwgXCJzZXJpYWxcIiwgXCJ1bmNoZWNrZWRcIiwgXCJ1bnVzZWRcIn0pXG4iOworfQorCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6amF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgeworICByZXR1cm4gIkBvcmcuYXBhY2hlLnRocmlmdC5hbm5vdGF0aW9uLk51bGxhYmxlIjsKK30KKworLyoqCisgKiBOb3RoaW5nIGluIEphdmEKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBKYXZhLCBzaW5jZSBpdCBkb2VzCisgKiBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgbmFtZSByZXBsYWNlbWVudHMsIGFuZCBpdCdkIGJlIGEgd2Fja3kgd2FzdGUKKyAqIG9mIG92ZXJoZWFkIHRvIG1ha2Ugd3JhcHBlciBjbGFzc2VzLgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEVudW1zIGFyZSBhIGNsYXNzIHdpdGggYSBzZXQgb2Ygc3RhdGljIGNvbnN0YW50cy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGJvb2wgaXNfZGVwcmVjYXRlZCA9IHRoaXMtPmlzX2RlcHJlY2F0ZWQodGVudW0tPmFubm90YXRpb25zXyk7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfZW51bV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgbWFrZV92YWxpZF9qYXZhX2ZpbGVuYW1lKHRlbnVtLT5nZXRfbmFtZSgpKSArICIuamF2YSI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9lbnVtOworICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKKworICAvLyBDb21tZW50IGFuZCBwYWNrYWdlIGl0CisgIGZfZW51bSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2phdmFfZG9jKGZfZW51bSwgdGVudW0pOworCisgIGlmICghc3VwcHJlc3NfZ2VuZXJhdGVkX2Fubm90YXRpb25zXykgeworICAgIGdlbmVyYXRlX2phdmF4X2dlbmVyYXRlZF9hbm5vdGF0aW9uKGZfZW51bSk7CisgIH0KKworICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgIGluZGVudChmX2VudW0pIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGVudW0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEVudW0gIjsKKyAgc2NvcGVfdXAoZl9lbnVtKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfZW51bSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2VudW0sICpjX2l0ZXIpOworICAgIGlmICh0aGlzLT5pc19kZXByZWNhdGVkKCgqY19pdGVyKS0+YW5ub3RhdGlvbnNfKSkgeworICAgICAgaW5kZW50KGZfZW51bSkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IHZhbHVlIDw8ICIpIjsKKyAgfQorICBmX2VudW0gPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBGaWVsZCBmb3IgdGhyaWZ0Q29kZQorICBpbmRlbnQoZl9lbnVtKSA8PCAicHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInByaXZhdGUgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiKGludCB2YWx1ZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAgdGhpcy52YWx1ZSA9IHZhbHVlOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAiLyoqIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICogR2V0IHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoaXMgZW51bSB2YWx1ZSwgYXMgZGVmaW5lZCBpbiB0aGUgVGhyaWZ0IElETC4iCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgaW50IGdldFZhbHVlKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuIHZhbHVlOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAiLyoqIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICogRmluZCBhIHRoZSBlbnVtIHR5cGUgYnkgaXRzIGludGVnZXIgdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICogQHJldHVybiBudWxsIGlmIHRoZSB2YWx1ZSBpcyBub3QgZm91bmQuIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICovIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCBqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKSA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyAiICsgdGVudW0tPmdldF9uYW1lKCkgKyAiIGZpbmRCeVZhbHVlKGludCB2YWx1ZSkgeyAiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInN3aXRjaCAodmFsdWUpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAiY2FzZSAiIDw8IHZhbHVlIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChmX2VudW0pIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuIG51bGw7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAifSIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfZW51bSk7CisKKyAgZl9lbnVtLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICcvJyArIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZShwcm9ncmFtX25hbWVfKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgIkNvbnN0YW50cy5qYXZhIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0czsKKyAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX2NvbnN0cyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBqYXZhX3N1cHByZXNzaW9ucygpOworCisgIGZfY29uc3RzIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCBtYWtlX3ZhbGlkX2phdmFfaWRlbnRpZmllcihwcm9ncmFtX25hbWVfKSA8PCAiQ29uc3RhbnRzIHsiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2NvbnN0cywgKCpjX2l0ZXIpKTsKKyAgICBwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2NvbnN0cykgPDwgIn0iIDw8IGVuZGw7CisgIGZfY29uc3RzLmNsb3NlKCk7Cit9CisKKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGluZGVudChvdXQpOworICBpZiAoIWRlZnZhbCkgeworICAgIG91dCA8PCAoaW5fc3RhdGljID8gIiIgOiAicHVibGljIHN0YXRpYyBmaW5hbCAiKSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICB9CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsIHZhbHVlKTsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsIHZhbHVlKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB1bnNvcnRlZF9maWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+IGZpZWxkcyA9IHVuc29ydGVkX2ZpZWxkczsKKyAgICBzdGQ6OnNvcnQoZmllbGRzLmJlZ2luKCksIGZpZWxkcy5lbmQoKSwgdF9maWVsZDo6a2V5X2NvbXBhcmUoKSk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiI7CisgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpOworICAgICAgb3V0IDw8ICJzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHN0ZDo6c3RyaW5nIGNvbnN0cnVjdG9yX2FyZ3M7CisgICAgaWYgKGlzX2VudW1fbWFwKHR5cGUpKSB7CisgICAgICBjb25zdHJ1Y3Rvcl9hcmdzID0gaW5uZXJfZW51bV90eXBlX25hbWUodHlwZSk7CisgICAgfQorICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoIiA8PCBjb25zdHJ1Y3Rvcl9hcmdzIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIucHV0KCIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgaWYgKGlzX2VudW1fc2V0KHR5cGUpKSB7CisgICAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUsIHRydWUpIDw8ICIubm9uZU9mKCIgPDwgaW5uZXJfZW51bV90eXBlX25hbWUodHlwZSkgPDwgIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBldHlwZSwgKnZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuYWRkKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJlbmRlciA8PCAiKGJ5dGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmVuZGVyIDw8ICIoc2hvcnQpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgImQiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IGVtaXRfZG91YmxlX2FzX3N0cmluZyh2YWx1ZS0+Z2V0X2RvdWJsZSgpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX3ByZWZpeCA9IHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImphdmEiKTsKKyAgICBpZiAobmFtZXNwYWNlX3ByZWZpeC5sZW5ndGgoKSA+IDApIHsKKyAgICAgIG5hbWVzcGFjZV9wcmVmaXggKz0gIi4iOworICAgIH0KKyAgICByZW5kZXIgPDwgbmFtZXNwYWNlX3ByZWZpeCA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfd2l0aF9wYXJlbnQoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7CisgICAgcmVuZGVyIDw8IHQ7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgd2lsbCBiZSBhIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlCisgKiBpbXBsZW1lbnRvci4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX3VuaW9uKHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2phdmFfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKKyAgfQorfQorCisvKioKKyAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGluaGVyaXQgZnJvbSBFeGNlcHRpb24KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2phdmFfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogSmF2YSBzdHJ1Y3QgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5qYXZhIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3N0cnVjdDsKKyAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOworCisgIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfc3VwcHJlc3Npb25zKCk7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgZl9zdHJ1Y3QuY2xvc2UoKTsKK30KKworLyoqCisgKiBKYXZhIHVuaW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV91bmlvbih0X3N0cnVjdCogdHN0cnVjdCkgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgbWFrZV92YWxpZF9qYXZhX2ZpbGVuYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLmphdmEiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc3RydWN0OworICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CisKKyAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV9zdXBwcmVzc2lvbnMoKTsKKworICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOworICBib29sIGlzX2RlcHJlY2F0ZWQgPSB0aGlzLT5pc19kZXByZWNhdGVkKHRzdHJ1Y3QtPmFubm90YXRpb25zXyk7CisKKyAgaWYgKCFzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfKSB7CisgICAgZ2VuZXJhdGVfamF2YXhfZ2VuZXJhdGVkX2Fubm90YXRpb24oZl9zdHJ1Y3QpOworICB9CisKKyAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICBpbmRlbnQoZl9zdHJ1Y3QpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zdHJ1Y3QpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlRVbmlvbjwiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi5fRmllbGRzPiAiOworCisgIHNjb3BlX3VwKGZfc3RydWN0KTsKKworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhmX3N0cnVjdCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2ZpZWxkX25hbWVfY29uc3RhbnRzKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3IoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9maWVsZF9ieV9pZChmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2lzX3NldF9tZXRob2RzKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlX29iamVjdChmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkX29iamVjdChmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc3RydWN0KTsKKworICBmX3N0cnVjdC5jbG9zZSgpOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgYm9vbCBkZWZhdWx0X3ZhbHVlID0gZmFsc2U7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgaW5kZW50KG91dCkgPDwgInN1cGVyKF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgdHlwZSwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgPDwgIik7IiA8PCBlbmRsOworICAgICAgZGVmYXVsdF92YWx1ZSA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKGRlZmF1bHRfdmFsdWUgPT0gZmFsc2UpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAic3VwZXIoKTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoX0ZpZWxkcyBzZXRGaWVsZCwgamF2YS5sYW5nLk9iamVjdCB2YWx1ZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgc3VwZXIoc2V0RmllbGQsIHZhbHVlKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKG90aGVyKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgZGVlcENvcHkoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKHRoaXMpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSAiY29uc3RydWN0b3JzIiBmb3IgZWFjaCBmaWVsZAorICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0eXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgdmFsdWUpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiB4ID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgeC5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIodmFsdWUpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4geDsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIihieXRlW10gdmFsdWUpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIHggPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICB4LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBpZih1bnNhZmVfYmluYXJpZXNfKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIoamF2YS5uaW8uQnl0ZUJ1ZmZlci53cmFwKHZhbHVlKSk7IiA8PCBlbmRsOworICAgICAgfWVsc2V7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIoamF2YS5uaW8uQnl0ZUJ1ZmZlci53cmFwKHZhbHVlLmNsb25lKCkpKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4geDsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2dldHRlcnNfYW5kX3NldHRlcnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKyAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisgICAgYm9vbCBpc19kZXByZWNhdGVkID0gdGhpcy0+aXNfZGVwcmVjYXRlZChmaWVsZC0+YW5ub3RhdGlvbnNfKTsKKworICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBieXRlW10gZ2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHNldCIgPDwgY2FwX25hbWUgPDwgIihvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5yaWdodFNpemUoYnVmZmVyIgorICAgICAgICAgICAgICAgICAgPDwgZ2V0X2NhcF9uYW1lKCJmb3IiKSA8PCBjYXBfbmFtZSA8PCAiKCkpKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBqYXZhLm5pby5CeXRlQnVmZmVyIGIgPSBidWZmZXIiIDw8IGdldF9jYXBfbmFtZSgiZm9yIikgPDwgY2FwX25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBiID09IG51bGwgPyBudWxsIDogYi5hcnJheSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgICBvdXQgPDwgZW5kbDsKKworICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIGJ1ZmZlciIgPDwgZ2V0X2NhcF9uYW1lKCJmb3IiKQorICAgICAgICAgICAgICAgICAgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGlmIChnZXRTZXRGaWVsZCgpID09IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKSB7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgICAgaWYodW5zYWZlX2JpbmFyaWVzXyl7CisgICAgICAgIGluZGVudChvdXQpCisgICAgICAgICAgPDwgIiAgICByZXR1cm4gKGphdmEubmlvLkJ5dGVCdWZmZXIpZ2V0RmllbGRWYWx1ZSgpOyIKKyAgICAgICAgICA8PCBlbmRsOworICAgICAgfWVsc2V7CisgICAgICAgIGluZGVudChvdXQpCisgICAgICAgICAgPDwgIiAgICByZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29weUJpbmFyeSgoamF2YS5uaW8uQnl0ZUJ1ZmZlcilnZXRGaWVsZFZhbHVlKCkpOyIKKyAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgICAgdGhyb3cgbmV3IGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uKFwiQ2Fubm90IGdldCBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIicgYmVjYXVzZSB1bmlvbiBpcyBjdXJyZW50bHkgc2V0IHRvIFwiICsgZ2V0RmllbGREZXNjKGdldFNldEZpZWxkKCkpLm5hbWUpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8ICIgZ2V0IgorICAgICAgICAgICAgICAgICAgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGlmIChnZXRTZXRGaWVsZCgpID09IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKSB7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuICgiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgIilnZXRGaWVsZFZhbHVlKCk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIH0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24oXCJDYW5ub3QgZ2V0IGZpZWxkICciIDw8IGZpZWxkLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiJyBiZWNhdXNlIHVuaW9uIGlzIGN1cnJlbnRseSBzZXQgdG8gXCIgKyBnZXRGaWVsZERlc2MoZ2V0U2V0RmllbGQoKSkubmFtZSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKGJ5dGVbXSB2YWx1ZSkgeyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisKKyAgICAgIGlmKHVuc2FmZV9iaW5hcmllc18peworICAgICAgICBpbmRlbnQob3V0KSA8PCAiKGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcCh2YWx1ZSkpOyIgPDwgZW5kbDsKKyAgICAgIH1lbHNleworICAgICAgICBpbmRlbnQob3V0KSA8PCAiKGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcCh2YWx1ZS5jbG9uZSgpKSk7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIigiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIHZhbHVlKSB7IiA8PCBlbmRsOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKHZhbHVlID09IG51bGwpIHRocm93IG5ldyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICIgIHNldEZpZWxkXyA9IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB2YWx1ZV8gPSB2YWx1ZTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9pc19zZXRfbWV0aG9kcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gaXMiIDw8IGdldF9jYXBfbmFtZSgic2V0IikgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBzZXRGaWVsZF8gPT0gX0ZpZWxkcy4iIDw8IGNvbnN0YW50X25hbWUoZmllbGRfbmFtZSkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2NoZWNrX3R5cGUob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV9yZWFkX3ZhbHVlKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfd3JpdGVfdmFsdWUob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGdlbmVyYXRlX3R1cGxlX3NjaGVtZV9yZWFkX3ZhbHVlKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV90dXBsZV9zY2hlbWVfd3JpdGVfdmFsdWUob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgX0ZpZWxkcyBlbnVtRm9ySWQoc2hvcnQgaWQpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBfRmllbGRzLmZpbmRCeVRocmlmdElkT3JUaHJvdyhpZCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jaGVja190eXBlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkKKyAgICAgIDw8ICJwcm90ZWN0ZWQgdm9pZCBjaGVja1R5cGUoX0ZpZWxkcyBzZXRGaWVsZCwgamF2YS5sYW5nLk9iamVjdCB2YWx1ZSkgdGhyb3dzIGphdmEubGFuZy5DbGFzc0Nhc3RFeGNlcHRpb24geyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlLCB0cnVlKQorICAgICAgICAgICAgICAgIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgICBicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgamF2YS5sYW5nLkNsYXNzQ2FzdEV4Y2VwdGlvbihcIldhcyBleHBlY3RpbmcgdmFsdWUgb2YgdHlwZSAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiBmb3IgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiJywgYnV0IGdvdCBcIiArIHZhbHVlLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsiIDw8IGVuZGw7CisgICAgLy8gZG8gdGhlIHJlYWwgY2hlY2sgaGVyZQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIlVua25vd24gZmllbGQgaWQgXCIgKyBzZXRGaWVsZCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV9yZWFkX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IHN0YW5kYXJkU2NoZW1lUmVhZFZhbHVlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCAiCisgICAgICAgICAgICAgICAgICJpcHJvdCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIGZpZWxkKSB0aHJvd3MgIgorICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJfRmllbGRzIHNldEZpZWxkID0gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZC5pZCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaWYgKHNldEZpZWxkICE9IG51bGwpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQy50eXBlKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbnVsbDsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJzZXRGaWVsZCB3YXNuJ3QgbnVsbCwgYnV0IGRpZG4ndCBtYXRjaCBhbnkgIgorICAgICAgICAgICAgICAgICAib2YgdGhlIGNhc2Ugc3RhdGVtZW50cyFcIik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBudWxsOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RhbmRhcmRfc2NoZW1lX3dyaXRlX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCB2b2lkIHN0YW5kYXJkU2NoZW1lV3JpdGVWYWx1ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgIgorICAgICAgICAgICAgICAgICAib3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGRfKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSAoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIpdmFsdWVfOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwiQ2Fubm90IHdyaXRlIHVuaW9uIHdpdGggdW5rbm93biBmaWVsZCBcIiArICIKKyAgICAgICAgICAgICAgICAgInNldEZpZWxkXyk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHVwbGVfc2NoZW1lX3JlYWRfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgdHVwbGVTY2hlbWVSZWFkVmFsdWUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sICIKKyAgICAgICAgICAgICAgICAgImlwcm90LCBzaG9ydCBmaWVsZElEKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJfRmllbGRzIHNldEZpZWxkID0gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZElEKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpZiAoc2V0RmllbGQgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcInNldEZpZWxkIHdhc24ndCBudWxsLCBidXQgZGlkbid0IG1hdGNoIGFueSAiCisgICAgICAgICAgICAgICAgICJvZiB0aGUgY2FzZSBzdGF0ZW1lbnRzIVwiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24oXCJDb3VsZG4ndCBmaW5kIGEgZmllbGQgd2l0aCBmaWVsZCBpZCBcIiArIGZpZWxkSUQpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R1cGxlX3NjaGVtZV93cml0ZV92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgdm9pZCB0dXBsZVNjaGVtZVdyaXRlVmFsdWUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSAiCisgICAgICAgICAgICAgICAgICJ0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkXykgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiKXZhbHVlXzsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgZmllbGQsICIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcIkNhbm5vdCB3cml0ZSB1bmlvbiB3aXRoIHVua25vd24gZmllbGQgXCIgKyAiCisgICAgICAgICAgICAgICAgICJzZXRGaWVsZF8pOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgZ2V0RmllbGREZXNjKF9GaWVsZHMgc2V0RmllbGQpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQzsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFwiVW5rbm93biBmaWVsZCBpZCBcIiArIHNldEZpZWxkKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IGdldFN0cnVjdERlc2MoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gU1RSVUNUX0RFU0M7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIC8vIGVxdWFsaXR5CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoamF2YS5sYW5nLk9iamVjdCBvdGhlcikgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaWYgKG90aGVyIGluc3RhbmNlb2YgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGVxdWFscygoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpb3RoZXIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscygiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG90aGVyICE9IG51bGwgJiYgZ2V0U2V0RmllbGQoKSA9PSBvdGhlci5nZXRTZXRGaWVsZCgpICYmICIKKyAgICAgICAgICAgICAgICAgImdldEZpZWxkVmFsdWUoKS5lcXVhbHMob3RoZXIuZ2V0RmllbGRWYWx1ZSgpKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBjb21wYXJlVG8oIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaW50IGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKGdldFNldEZpZWxkKCksICIKKyAgICAgICAgICAgICAgICAgIm90aGVyLmdldFNldEZpZWxkKCkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGxhc3RDb21wYXJpc29uID09IDApIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyhnZXRGaWVsZFZhbHVlKCksICIKKyAgICAgICAgICAgICAgICAgIm90aGVyLmdldEZpZWxkVmFsdWUoKSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25faGFzaGNvZGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBoYXNoQ29kZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5PYmplY3Q+IGxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxqYXZhLmxhbmcuT2JqZWN0PigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgbGlzdC5hZGQodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0gc2V0RmllbGQgPSBnZXRTZXRGaWVsZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaWYgKHNldEZpZWxkICE9IG51bGwpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgbGlzdC5hZGQoc2V0RmllbGQuZ2V0VGhyaWZ0RmllbGRJZCgpKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgamF2YS5sYW5nLk9iamVjdCB2YWx1ZSA9IGdldEZpZWxkVmFsdWUoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgaWYgKHZhbHVlIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS50aHJpZnQuVEVudW0pIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgICBsaXN0LmFkZCgoKG9yZy5hcGFjaGUudGhyaWZ0LlRFbnVtKWdldEZpZWxkVmFsdWUoKSkuZ2V0VmFsdWUoKSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIH0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgICAgbGlzdC5hZGQodmFsdWUpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbGlzdC5oYXNoQ29kZSgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iOworfQorCisvKioKKyAqIEphdmEgc3RydWN0IGRlZmluaXRpb24uIFRoaXMgaGFzIHZhcmlvdXMgcGFyYW1ldGVycywgYXMgaXQgY291bGQgYmUKKyAqIGdlbmVyYXRlZCBzdGFuZGFsb25lIG9yIGluc2lkZSBhbm90aGVyIGNsYXNzIGFzIGEgaGVscGVyLiBJZiBpdAorICogaXMgYSBoZWxwZXIgdGhhbiBpdCBpcyBhIHN0YXRpYyBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KKyAqIEBwYXJhbSBpbl9jbGFzcyAgICAgSWYgaW5zaWRlIGEgY2xhc3MsIG5lZWRzIHRvIGJlIHN0YXRpYyBjbGFzcworICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKKyAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCB0c3RydWN0KTsKKworICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7CisgIGJvb2wgaXNfZGVwcmVjYXRlZCA9IHRoaXMtPmlzX2RlcHJlY2F0ZWQodHN0cnVjdC0+YW5ub3RhdGlvbnNfKTsKKworICBpZiAoIWluX2NsYXNzICYmICFzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfKSB7CisgICAgZ2VuZXJhdGVfamF2YXhfZ2VuZXJhdGVkX2Fubm90YXRpb24ob3V0KTsKKyAgfQorCisgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PCAoaW5fY2xhc3MgPyAic3RhdGljICIgOiAiIikgPDwgImNsYXNzICIKKyAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICI7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uICI7CisgIH0KKyAgb3V0IDw8ICJpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgIDw8ICIuX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI+IjsKKworICBpZiAoYW5kcm9pZF9zdHlsZV8pIHsKKyAgICBvdXQgPDwgIiwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIjsKKyAgfQorCisgIG91dCA8PCAiICI7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvdXQsIHRzdHJ1Y3QpOworCisgIC8vIE1lbWJlcnMgYXJlIHB1YmxpYyBmb3IgLWphdmEsIHByaXZhdGUgZm9yIC1qYXZhYmVhbgorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIG91dCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG91dCwgdHN0cnVjdCk7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfc2NoZW1lX21hcChvdXQsIHRzdHJ1Y3QpOworCisgIG91dCA8PCBlbmRsOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoYmVhbl9zdHlsZV8gfHwgcHJpdmF0ZV9tZW1iZXJzXykgeworICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgIjsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCAqbV9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIjsKKyAgICB9CisgICAgb3V0IDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsIHRydWUpIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICBpZiAoYW5kcm9pZF9zdHlsZV8pIHsKKyAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9wYXJjZWxhYmxlKG91dCwgdHN0cnVjdCk7CisgIH0KKworICBnZW5lcmF0ZV9maWVsZF9uYW1lX2NvbnN0YW50cyhvdXQsIHRzdHJ1Y3QpOworCisgIC8vIGlzc2V0IGRhdGEKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgIi8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzIiA8PCBlbmRsOworCisgICAgaW50IGkgPSAwOworICAgIGludCBvcHRpb25hbHMgPSAwOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgIG9wdGlvbmFscysrOworICAgICAgfQorICAgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIGludCAiIDw8IGlzc2V0X2ZpZWxkX2lkKCptX2l0ZXIpIDw8ICIgPSAiIDw8IGkgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGkrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBwcmltaXRpdmVUeXBlOworICAgIHN3aXRjaCAobmVlZHNfaXNzZXQodHN0cnVjdCwgJnByaW1pdGl2ZVR5cGUpKSB7CisgICAgY2FzZSBJU1NFVF9OT05FOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBJU1NFVF9QUklNSVRJVkU6CisgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSAiIDw8IHByaW1pdGl2ZVR5cGUgPDwgIiBfX2lzc2V0X2JpdGZpZWxkID0gMDsiIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICBjYXNlIElTU0VUX0JJVFNFVDoKKyAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIGphdmEudXRpbC5CaXRTZXQgX19pc3NldF9iaXRfdmVjdG9yID0gbmV3IGphdmEudXRpbC5CaXRTZXQoIiA8PCBpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChvcHRpb25hbHMgPiAwKSB7CisgICAgICBzdGQ6OnN0cmluZyBvdXRwdXRfc3RyaW5nID0gInByaXZhdGUgc3RhdGljIGZpbmFsIF9GaWVsZHMgb3B0aW9uYWxzW10gPSB7IjsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgICBvdXRwdXRfc3RyaW5nID0gb3V0cHV0X3N0cmluZyArICJfRmllbGRzLiIgKyBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiLCI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8IG91dHB1dF9zdHJpbmcuc3Vic3RyKDAsIG91dHB1dF9zdHJpbmcubGVuZ3RoKCkgLSAxKSA8PCAifTsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgZ2VuZXJhdGVfamF2YV9tZXRhX2RhdGFfbWFwKG91dCwgdHN0cnVjdCk7CisKKyAgYm9vbCBhbGxfb3B0aW9uYWxfbWVtYmVycyA9IHRydWU7CisKKyAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMuIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgIH0KKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgYWxsX29wdGlvbmFsX21lbWJlcnMgPSBmYWxzZTsKKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoIW1lbWJlcnMuZW1wdHkoKSAmJiAhYWxsX29wdGlvbmFsX21lbWJlcnMpIHsKKyAgICAvLyBGdWxsIGNvbnN0cnVjdG9yIGZvciBhbGwgZmllbGRzCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcygpOyIgPDwgZW5kbDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIGlmKHVuc2FmZV9iaW5hcmllc18peworICAgICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvcHlCaW5hcnkoIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgKCptX2l0ZXIpLCAiIik7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLy8gY29weSBjb25zdHJ1Y3RvcgorICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICogUGVyZm9ybXMgYSBkZWVwIGNvcHkgb24gPGk+b3RoZXI8L2k+LiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBvdGhlcikgeyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3dpdGNoIChuZWVkc19pc3NldCh0c3RydWN0KSkgeworICBjYXNlIElTU0VUX05PTkU6CisgICAgYnJlYWs7CisgIGNhc2UgSVNTRVRfUFJJTUlUSVZFOgorICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gb3RoZXIuX19pc3NldF9iaXRmaWVsZDsiIDw8IGVuZGw7CisgICAgYnJlYWs7CisgIGNhc2UgSVNTRVRfQklUU0VUOgorICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3IuY2xlYXIoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0X3ZlY3Rvci5vcihvdGhlci5fX2lzc2V0X2JpdF92ZWN0b3IpOyIgPDwgZW5kbDsKKyAgICBicmVhazsKKyAgfQorCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKyAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbCh0eXBlKTsKKworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmIChvdGhlci4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwgIm90aGVyIiwgZmllbGRfbmFtZSwgIl9fdGhpc19fIiArIGZpZWxkX25hbWUsIHR5cGUpOworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBfX3RoaXNfXyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiOworICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCAib3RoZXIuIiArIGZpZWxkX25hbWUsIGZpZWxkX25hbWUsIHR5cGUpOworICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gY2xvbmUgbWV0aG9kLCBzbyB0aGF0IHlvdSBjYW4gZGVlcCBjb3B5IGFuIG9iamVjdCB3aGVuIHlvdSBkb24ndCBrbm93IGl0cyBjbGFzcy4KKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBkZWVwQ29weSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBuZXcgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIodGhpcyk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZXF1YWxpdHkob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9maWVsZF9ieV9pZChvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBpZiAoaXNfcmVzdWx0KSB7CisgICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9CisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVfb2JqZWN0KG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRfb2JqZWN0KG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfc3RhbmRhcmRfc2NoZW1lKG91dCwgdHN0cnVjdCwgaXNfcmVzdWx0KTsKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfc2NoZW1lKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2phdmFfc2NoZW1lX2xvb2t1cChvdXQpOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogZ2VuZXJhdGVzIHBhcmNlbGFibGUgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcGFyY2VsYWJsZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyB0bmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgInB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgb3V0LCBpbnQgZmxhZ3MpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBzdHJpbmcgYml0c2V0UHJpbWl0aXZlVHlwZSA9ICIiOworICBzd2l0Y2ggKG5lZWRzX2lzc2V0KHRzdHJ1Y3QsICZiaXRzZXRQcmltaXRpdmVUeXBlKSkgeworICBjYXNlIElTU0VUX05PTkU6CisgICAgYnJlYWs7CisgIGNhc2UgSVNTRVRfUFJJTUlUSVZFOgorICAgIGluZGVudChvdXQpIDw8ICIvL3ByaW1pdGl2ZSBiaXRmaWVsZCBvZiB0eXBlOiAiIDw8IGJpdHNldFByaW1pdGl2ZVR5cGUgPDwgZW5kbDsKKyAgICBpZiAoYml0c2V0UHJpbWl0aXZlVHlwZSA9PSAiYnl0ZSIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVCeXRlKF9faXNzZXRfYml0ZmllbGQpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGJpdHNldFByaW1pdGl2ZVR5cGUgPT0gInNob3J0IikgeworICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludChuZXcgU2hvcnQoX19pc3NldF9iaXRmaWVsZCkuaW50VmFsdWUoKSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoYml0c2V0UHJpbWl0aXZlVHlwZSA9PSAiaW50IikgeworICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludChfX2lzc2V0X2JpdGZpZWxkKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJsb25nIikgeworICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUxvbmcoX19pc3NldF9iaXRmaWVsZCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgICBicmVhazsKKyAgY2FzZSBJU1NFVF9CSVRTRVQ6CisgICAgaW5kZW50KG91dCkgPDwgIi8vQml0U2V0IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVTZXJpYWxpemFibGUoX19pc3NldF9iaXRfdmVjdG9yKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGVuZGw7CisgICAgYnJlYWs7CisgIH0KKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIGlmICh0LT5pc19zdHJ1Y3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZVBhcmNlbGFibGUoIiA8PCBuYW1lIDw8ICIsIGZsYWdzKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0eXBlX25hbWUodCkgPT0gImZsb2F0IikgeworICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUZsb2F0KCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0LT5pc19lbnVtKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVJbnQoIiA8PCBuYW1lIDw8ICIgIT0gbnVsbCA/ICIgPDwgbmFtZSA8PCAiLmdldFZhbHVlKCkgOiAtMSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7CisgICAgICBpZiAoKCh0X2xpc3QqKXQpLT5nZXRfZWxlbV90eXBlKCktPmdldF90cnVlX3R5cGUoKS0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZVR5cGVkTGlzdCgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUxpc3QoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlTWFwKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgaWYgKHQtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVJbnQoIiA8PCBuYW1lIDw8ICIhPW51bGwgPyAxIDogMCk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYoIiA8PCBuYW1lIDw8ICIgIT0gbnVsbCkgeyAiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlQnl0ZUFycmF5KCIgPDwgbmFtZSA8PCAiLmFycmF5KCksICIgPDwgbmFtZSA8PCAiLnBvc2l0aW9uKCkgKyAiCisgICAgICAgICAgICAgICAgICAgIDw8IG5hbWUgPDwgIi5hcnJheU9mZnNldCgpLCAiIDw8IG5hbWUgPDwgIi5saW1pdCgpIC0gIiA8PCBuYW1lCisgICAgICAgICAgICAgICAgICAgIDw8ICIucG9zaXRpb24oKSApOyIgPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfZG93bihvdXQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KG5ldyBTaG9ydCgiIDw8IG5hbWUgPDwgIikuaW50VmFsdWUoKSk7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVMb25nKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KCIgPDwgbmFtZSA8PCAiID8gMSA6IDApOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAwOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdG5hbWUgPDwgIihhbmRyb2lkLm9zLlBhcmNlbCBpbikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIC8vIHJlYWQgaW4gdGhlIHJlcXVpcmVkIGJpdGZpZWxkCisgIHN3aXRjaCAobmVlZHNfaXNzZXQodHN0cnVjdCwgJmJpdHNldFByaW1pdGl2ZVR5cGUpKSB7CisgIGNhc2UgSVNTRVRfTk9ORToKKyAgICBicmVhazsKKyAgY2FzZSBJU1NFVF9QUklNSVRJVkU6CisgICAgaW5kZW50KG91dCkgPDwgIi8vcHJpbWl0aXZlIGJpdGZpZWxkIG9mIHR5cGU6ICIgPDwgYml0c2V0UHJpbWl0aXZlVHlwZSA8PCBlbmRsOworICAgIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJieXRlIikgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0ZmllbGQgPSBpbi5yZWFkQnl0ZSgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGJpdHNldFByaW1pdGl2ZVR5cGUgPT0gInNob3J0IikgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0ZmllbGQgPSAoc2hvcnQpIGluLnJlYWRJbnQoKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJpbnQiKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRmaWVsZCA9IGluLnJlYWRJbnQoKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJsb25nIikgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0ZmllbGQgPSBpbi5yZWFkTG9uZygpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgICAgYnJlYWs7CisgIGNhc2UgSVNTRVRfQklUU0VUOgorICAgIGluZGVudChvdXQpIDw8ICIvL0JpdFNldCIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yID0gKGphdmEudXRpbC5CaXRTZXQpIGluLnJlYWRTZXJpYWxpemFibGUoKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGVuZGw7CisgICAgYnJlYWs7CisgIH0KKyAgLy8gcmVhZCBhbGwgdGhlIGZpZWxkcworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBwcmVmaXggPSAidGhpcy4iICsgbmFtZTsKKworICAgIGlmICh0LT5pc19zdHJ1Y3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICI9IGluLnJlYWRQYXJjZWxhYmxlKCIgPDwgdG5hbWUgPDwgIi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHQpIDw8ICIuZmluZEJ5VmFsdWUoaW4ucmVhZEludCgpKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICAgIHRfbGlzdCogbGlzdCA9ICh0X2xpc3QqKXQ7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0LCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgIGlmIChsaXN0LT5nZXRfZWxlbV90eXBlKCktPmdldF90cnVlX3R5cGUoKS0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImluLnJlYWRUeXBlZExpc3QoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCB0eXBlX25hbWUobGlzdC0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgICAgICA8PCAiLkNSRUFUT1IpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpbi5yZWFkTGlzdCgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IHRuYW1lIDw8ICIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHQsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiBpbi5yZWFkTWFwKCIgPDwgcHJlZml4IDw8ICIsICIgPDwgdG5hbWUgPDwgIi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHlwZV9uYW1lKHQpID09ICJmbG9hdCIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gaW4ucmVhZEZsb2F0KCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlKiBidCA9ICh0X2Jhc2VfdHlwZSopdDsKKyAgICAgIGlmIChidC0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmKGluLnJlYWRJbnQoKT09MSkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gamF2YS5uaW8uQnl0ZUJ1ZmZlci53cmFwKGluLmNyZWF0ZUJ5dGVBcnJheSgpKTsiIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoYnQtPmdldF9iYXNlKCkpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSAoc2hvcnQpIGluLnJlYWRJbnQoKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gaW4ucmVhZEludCgpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBpbi5yZWFkTG9uZygpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gKGluLnJlYWRJbnQoKT09MSk7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gaW4ucmVhZEJ5dGUoKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gaW4ucmVhZERvdWJsZSgpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICI9IGluLnJlYWRTdHJpbmcoKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8IiA8PCB0bmFtZQorICAgICAgICAgICAgICA8PCAiPiBDUkVBVE9SID0gbmV3IGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPCIgPDwgdG5hbWUgPDwgIj4oKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCB0bmFtZSA8PCAiW10gbmV3QXJyYXkoaW50IHNpemUpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG5ldyAiIDw8IHRuYW1lIDw8ICJbc2l6ZV07IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8IHRuYW1lCisgICAgICAgICAgICAgIDw8ICIgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBpbikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbmV3ICIgPDwgdG5hbWUgPDwgIihpbik7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn07IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgZXF1YWxzIG1ldGhvZHMgYW5kIGEgaGFzaENvZGUgbWV0aG9kIGZvciBhIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoamF2YS5sYW5nLk9iamVjdCB0aGF0KSB7IgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGF0IGluc3RhbmNlb2YgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICByZXR1cm4gdGhpcy5lcXVhbHMoKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKXRoYXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgInJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgdGhhdCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzID09IHRoYXQpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlOyIgIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIG91dCA8PCBlbmRsOworCisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIC8vIE1vc3QgZXhpc3RpbmcgVGhyaWZ0IGNvZGUgZG9lcyBub3QgdXNlIGlzc2V0IG9yIG9wdGlvbmFsL3JlcXVpcmVkLAorICAgIC8vIHNvIHdlIHRyZWF0ICJkZWZhdWx0IiBmaWVsZHMgYXMgcmVxdWlyZWQuCisgICAgYm9vbCBpc19vcHRpb25hbCA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwodCk7CisgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisKKyAgICBzdHJpbmcgdGhpc19wcmVzZW50ID0gInRydWUiOworICAgIHN0cmluZyB0aGF0X3ByZXNlbnQgPSAidHJ1ZSI7CisgICAgc3RyaW5nIHVuZXF1YWw7CisKKyAgICBpZiAoaXNfb3B0aW9uYWwgfHwgY2FuX2JlX251bGwpIHsKKyAgICAgIHRoaXNfcHJlc2VudCArPSAiICYmIHRoaXMuIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpOworICAgICAgdGhhdF9wcmVzZW50ICs9ICIgJiYgdGhhdC4iICsgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKm1faXRlcik7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sZWFuIHRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiA9ICIgPDwgdGhpc19wcmVzZW50IDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJib29sZWFuIHRoYXRfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiA9ICIgPDwgdGhhdF9wcmVzZW50IDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoIgorICAgICAgICA8PCAidGhpc19wcmVzZW50XyIgPDwgbmFtZSA8PCAiIHx8IHRoYXRfcHJlc2VudF8iIDw8IG5hbWUgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghKCIKKyAgICAgICAgPDwgInRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiAmJiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworCisgICAgaWYgKHQtPmlzX2JpbmFyeSgpKSB7CisgICAgICB1bmVxdWFsID0gIiF0aGlzLiIgKyBuYW1lICsgIi5lcXVhbHModGhhdC4iICsgbmFtZSArICIpIjsKKyAgICB9IGVsc2UgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICB1bmVxdWFsID0gIiF0aGlzLiIgKyBuYW1lICsgIi5lcXVhbHModGhhdC4iICsgbmFtZSArICIpIjsKKyAgICB9IGVsc2UgeworICAgICAgdW5lcXVhbCA9ICJ0aGlzLiIgKyBuYW1lICsgIiAhPSB0aGF0LiIgKyBuYW1lOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgdW5lcXVhbCA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIGNvbnN0IGludCBNVUwgPSA4MTkxOyAvLyBIYXNoQ29kZSBtdWx0aXBsaWVyCisgIGNvbnN0IGludCBCX1lFUyA9IDEzMTA3MTsKKyAgY29uc3QgaW50IEJfTk8gPSA1MjQyODc7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJpbnQgaGFzaENvZGUgPSAxOyIgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgYm9vbCBpc19vcHRpb25hbCA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwodCk7CisgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisKKyAgICBpZiAoaXNfb3B0aW9uYWwgfHwgY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJoYXNoQ29kZSA9IGhhc2hDb2RlICogIiA8PCBNVUwgPDwgIiArICgoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqbV9pdGVyKQorICAgICAgICAgICAgICAgICAgPDwgIikgPyAiIDw8IEJfWUVTIDw8ICIgOiAiIDw8IEJfTk8gPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChpc19vcHRpb25hbCB8fCBjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiICsgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKm1faXRlcikgKyAiKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGlmICh0LT5pc19lbnVtKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJoYXNoQ29kZSA9IGhhc2hDb2RlICogIiA8PCBNVUwgPDwgIiArICIgPDwgbmFtZSA8PCAiLmdldFZhbHVlKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHN3aXRjaCgoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGluZGVudChvdXQpIDw8ICJoYXNoQ29kZSA9IGhhc2hDb2RlICogIiA8PCBNVUwgPDwgIiArICIgPDwgbmFtZSA8PCAiLmhhc2hDb2RlKCk7IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImhhc2hDb2RlID0gaGFzaENvZGUgKiAiIDw8IE1VTCA8PCAiICsgKCgiIDw8IG5hbWUgPDwgIikgPyAiCisgICAgICAgICAgICAgICAgICAgIDw8IEJfWUVTIDw8ICIgOiAiIDw8IEJfTk8gPDwgIik7IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIGluZGVudChvdXQpIDw8ICJoYXNoQ29kZSA9IGhhc2hDb2RlICogIiA8PCBNVUwgPDwgIiArIChpbnQpICgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIGluZGVudChvdXQpIDw8ICJoYXNoQ29kZSA9IGhhc2hDb2RlICogIiA8PCBNVUwgPDwgIiArICIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBpbmRlbnQob3V0KSA8PCAiaGFzaENvZGUgPSBoYXNoQ29kZSAqICIgPDwgTVVMIDw8ICIgKyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5oYXNoQ29kZSgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiY29tcGlsZXIgZXJyb3I6IGEgc3RydWN0IGZpZWxkIGNhbm5vdCBiZSB2b2lkIik7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJjb21waWxlciBlcnJvcjogdGhlIGZvbGxvd2luZyBiYXNlIHR5cGUgaGFzIG5vIGhhc2hjb2RlIGdlbmVyYXRvcjogIiArCisgICAgICAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUoKCh0X2Jhc2VfdHlwZSopdCktPmdldF9iYXNlKCkpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgImhhc2hDb2RlID0gaGFzaENvZGUgKiAiIDw8IE1VTCA8PCAiICsgIiA8PCBuYW1lIDw8ICIuaGFzaENvZGUoKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKGlzX29wdGlvbmFsIHx8IGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgfQorCisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGhhc2hDb2RlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgY29tcGFyZVRvKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJpZiAoIWdldENsYXNzKCkuZXF1YWxzKG90aGVyLmdldENsYXNzKCkpKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkuY29tcGFyZVRvKG90aGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiaW50IGxhc3RDb21wYXJpc29uID0gMDsiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICptX2l0ZXI7CisgICAgaW5kZW50KG91dCkgPDwgImxhc3RDb21wYXJpc29uID0gamF2YS5sYW5nLkJvb2xlYW4udmFsdWVPZigiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKQorICAgICAgICAgICAgICAgIDw8ICIpLmNvbXBhcmVUbyhvdGhlci4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy4iCisgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgb3RoZXIuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCkgdGhyb3dzICIKKyAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJzY2hlbWUoaXByb3QpLnJlYWQoaXByb3QsIHRoaXMpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLy8gZ2VuZXJhdGVzIGphdmEgbWV0aG9kIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKKy8vIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGlmIChiZWFuX3N0eWxlXykgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKFwiUmVxdWlyZWQgZmllbGQgJyIKKyAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyBpcyB1bnNldCEgU3RydWN0OlwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudChvdXQpCisgICAgICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24oXCJSZXF1aXJlZCBmaWVsZCAnIgorICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgd2FzIG5vdCBwcmVzZW50ISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICIvLyBhbGFzLCB3ZSBjYW5ub3QgY2hlY2sgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIicgYmVjYXVzZSBpdCdzIGEgcHJpbWl0aXZlIGFuZCB5b3UgY2hvc2UgdGhlIG5vbi1iZWFucyBnZW5lcmF0b3IuIgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciBzdWItc3RydWN0IHZhbGlkaXR5IiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfdHlwZSogdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgJiYgISgodF9zdHJ1Y3QqKXR5cGUpLT5pc191bmlvbigpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIi52YWxpZGF0ZSgpOyIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB0aHJvd3MgIgorICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInNjaGVtZShvcHJvdCkud3JpdGUob3Byb3QsIHRoaXMpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QsCisgKiB3aGljaCBpcyBhIGZ1bmN0aW9uIHJlc3VsdC4gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4KKyAqIGlmIHRoZXkgYXJlIHNldCBpbiB0aGUgSXNzZXQgYXJyYXksIGFuZCBvbmx5IG9uZSBvZiB0aGVtCisgKiBjYW4gYmUgc2V0IGF0IGEgdGltZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzICIKKyAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJzY2hlbWUob3Byb3QpLndyaXRlKG9wcm90LCB0aGlzKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2ZpZWxkX2J5X2lkKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBfRmllbGRzIGZpZWxkRm9ySWQoaW50IGZpZWxkSWQpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkSWQpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8ICh0eXBlLT5pc19ib29sKCkgPyAiaXMiIDogImdldCIpIDw8IGNhcF9uYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKKyAgY29uc3QgYm9vbCBpc19iaW5hcnkgPSB0eXBlLT5pc19iaW5hcnkoKTsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZSA9PSBudWxsKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB1bnNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaWYgKGlzX2JpbmFyeSkgeworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAodmFsdWUgaW5zdGFuY2VvZiBieXRlW10pIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKChieXRlW10pdmFsdWUpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCgiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIil2YWx1ZSk7IiA8PCBlbmRsOworICBpZiAoaXNfYmluYXJ5KSB7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBnZXR0ZXJfc3RyZWFtOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc2V0dGVyX3N0cmVhbTsKKworICAvLyBidWlsZCB1cCB0aGUgYm9kaWVzIG9mIGJvdGggdGhlIGdldHRlciBhbmQgc2V0dGVyIGF0IG9uY2UKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOworICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhnZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIGNyZWF0ZSB0aGUgc2V0dGVyCisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHNldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCwgIiA8PCBqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKQorICAgICAgICAgICAgICA8PCAiIGphdmEubGFuZy5PYmplY3QgdmFsdWUpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHN3aXRjaCAoZmllbGQpIHsiIDw8IGVuZGw7CisgIG91dCA8PCBzZXR0ZXJfc3RyZWFtLnN0cigpOworICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGNyZWF0ZSB0aGUgZ2V0dGVyCisgIGluZGVudChvdXQpIDw8IGphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZCkgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGdldHRlcl9zdHJlYW0uc3RyKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8vIENyZWF0ZXMgYSBnZW5lcmljIGlzU2V0IG1ldGhvZCB0aGF0IHRha2VzIHRoZSBmaWVsZCBudW1iZXIgYXMgYXJndW1lbnQKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBjcmVhdGUgdGhlIGlzU2V0IG1ldGhvZAorICBpbmRlbnQob3V0KSA8PCAiLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhICIKKyAgICAgICAgICAgICAgICAgInZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gaXNTZXQoX0ZpZWxkcyBmaWVsZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQpIHsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNldCBvZiBKYXZhIEJlYW4gYm9pbGVycGxhdGUgZnVuY3Rpb25zIChzZXR0ZXJzLCBnZXR0ZXJzLCBldGMuKQorICogZm9yIHRoZSBnaXZlbiBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaXNzZXRfdHlwZSBpc3NldFR5cGUgPSBuZWVkc19pc3NldCh0c3RydWN0KTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7CisgICAgYm9vbCBvcHRpb25hbCA9IHVzZV9vcHRpb25fdHlwZV8gJiYgZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGJvb2wgaXNfZGVwcmVjYXRlZCA9IHRoaXMtPmlzX2RlcHJlY2F0ZWQoZmllbGQtPmFubm90YXRpb25zXyk7CisKKyAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIC8vIE1ldGhvZCB0byByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGNvbGxlY3Rpb24KKyAgICAgIGlmIChvcHRpb25hbCkgeworICAgICAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIG9yZy5hcGFjaGUudGhyaWZ0Lk9wdGlvbjxJbnRlZ2VyPiBnZXQiIDw8IGNhcF9uYW1lOworICAgICAgICBvdXQgPDwgZ2V0X2NhcF9uYW1lKCJzaXplKCkgeyIpIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBvcmcuYXBhY2hlLnRocmlmdC5PcHRpb24ubm9uZSgpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBvcmcuYXBhY2hlLnRocmlmdC5PcHRpb24uc29tZSh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnNpemUoKSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGdldCIgPDwgY2FwX25hbWU7CisgICAgICAgIG91dCA8PCBnZXRfY2FwX25hbWUoInNpemUoKSB7IikgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSA/IDAgOiAiCisgICAgICAgICAgICAgICAgICAgIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnNpemUoKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHR5cGUtPmlzX3NldCgpIHx8IHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgdF90eXBlKiBlbGVtZW50X3R5cGU7CisgICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgZWxlbWVudF90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVsZW1lbnRfdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgfQorCisgICAgICAvLyBJdGVyYXRvciBnZXR0ZXIgZm9yIHNldHMgYW5kIGxpc3RzCisgICAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvcmcuYXBhY2hlLnRocmlmdC5PcHRpb248amF2YS51dGlsLkl0ZXJhdG9yPCIgPDwgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSwgdHJ1ZSwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgIDw8ICI+PiBnZXQiIDw8IGNhcF9uYW1lOworICAgICAgICBvdXQgPDwgZ2V0X2NhcF9uYW1lKCJpdGVyYXRvcigpIHsiKSA8PCBlbmRsOworCisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uLm5vbmUoKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uLnNvbWUodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5pdGVyYXRvcigpKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50KG91dCkgPDwgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3I8IiA8PCB0eXBlX25hbWUoZWxlbWVudF90eXBlLCB0cnVlLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIj4gZ2V0IiA8PCBjYXBfbmFtZTsKKyAgICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgiaXRlcmF0b3IoKSB7IikgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSA/IG51bGwgOiAiCisgICAgICAgICAgICAgICAgICAgIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLml0ZXJhdG9yKCk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBBZGQgdG8gc2V0IG9yIGxpc3QsIGNyZWF0ZSBpZiB0aGUgc2V0L2xpc3QgaXMgbnVsbAorICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIGFkZCIgPDwgZ2V0X2NhcF9uYW1lKCJ0byIpOworICAgICAgb3V0IDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUoZWxlbWVudF90eXBlKSA8PCAiIGVsZW0pIHsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZTsKKyAgICAgIGlmIChpc19lbnVtX3NldCh0eXBlKSkgeworICAgICAgICBvdXQgPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlLCB0cnVlKSA8PCAiLm5vbmVPZigiIDw8IGlubmVyX2VudW1fdHlwZV9uYW1lKHR5cGUpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuYWRkKGVsZW0pOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIC8vIFB1dCB0byBtYXAKKyAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworCisgICAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgcHV0IiA8PCBnZXRfY2FwX25hbWUoInRvIik7CisgICAgICBvdXQgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZShrZXlfdHlwZSkgPDwgIiBrZXksICIgPDwgdHlwZV9uYW1lKHZhbF90eXBlKSA8PCAiIHZhbCkgeyIKKyAgICAgICAgICA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBzdGQ6OnN0cmluZyBjb25zdHJ1Y3Rvcl9hcmdzOworICAgICAgaWYgKGlzX2VudW1fbWFwKHR5cGUpKSB7CisgICAgICAgIGNvbnN0cnVjdG9yX2FyZ3MgPSBpbm5lcl9lbnVtX3R5cGVfbmFtZSh0eXBlKTsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCIgPDwgY29uc3RydWN0b3JfYXJncyA8PCAiKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIucHV0KGtleSwgdmFsKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBTaW1wbGUgZ2V0dGVyCisgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJ5dGVbXSBnZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLnJpZ2h0U2l6ZSgiCisgICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lIDw8ICIpKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCA/IG51bGwgOiAiIDw8IGZpZWxkX25hbWUgPDwgIi5hcnJheSgpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgYnVmZmVyIiA8PCBnZXRfY2FwX25hbWUoImZvciIpIDw8IGNhcF9uYW1lIDw8ICIoKSB7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGlmKHVuc2FmZV9iaW5hcmllc18peworICAgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfWVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29weUJpbmFyeSgiIDw8IGZpZWxkX25hbWUgPDwgIik7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uPCIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUpIDw8ICI+IjsKKyAgICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX0JPT0wpIHsKKyAgICAgICAgICBvdXQgPDwgIiBpcyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICIgZ2V0IjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy5pc1NldCIgPDwgY2FwX25hbWUgPDwgIigpKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBvcmcuYXBhY2hlLnRocmlmdC5PcHRpb24uc29tZSh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uLm5vbmUoKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCBqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKSA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKSB7CisgICAgICAgICAgb3V0IDw8ICIgaXMiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiIGdldCI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTaW1wbGUgc2V0dGVyCisgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7CisgICAgICBpZiAoYmVhbl9zdHlsZV8pIHsKKyAgICAgICAgb3V0IDw8ICJ2b2lkIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB0eXBlX25hbWUodHN0cnVjdCk7CisgICAgICB9CisgICAgICBvdXQgPDwgIiBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoYnl0ZVtdICIgPDwgZmllbGRfbmFtZSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwgPyAoamF2YS5uaW8uQnl0ZUJ1ZmZlciludWxsIjsKKworICAgICAgaWYodW5zYWZlX2JpbmFyaWVzXyl7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIgOiBqYXZhLm5pby5CeXRlQnVmZmVyLndyYXAoIiA8PCBmaWVsZF9uYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH1lbHNleworICAgICAgICBpbmRlbnQob3V0KSA8PCAiIDogamF2YS5uaW8uQnl0ZUJ1ZmZlci53cmFwKCIgPDwgZmllbGRfbmFtZSA8PCAiLmNsb25lKCkpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgICAgICAgICAgICAgCisgICAgICBpZiAoIWJlYW5fc3R5bGVfKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiB0aGlzOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIjsKKyAgICBpZiAoYmVhbl9zdHlsZV8pIHsKKyAgICAgIG91dCA8PCAidm9pZCI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHN0cnVjdCk7CisgICAgfQorICAgIG91dCA8PCAiIHNldCIgPDwgY2FwX25hbWUgPDwgIigiIDw8ICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpID8gKGphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpICsgIiAiKSA6ICIiKQorICAgICAgICA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGZpZWxkX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICI7CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpICYmICF1bnNhZmVfYmluYXJpZXNfKSB7CisgICAgICBvdXQgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvcHlCaW5hcnkoIiA8PCBmaWVsZF9uYW1lIDw8ICIpIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGZpZWxkX25hbWU7CisgICAgfQorICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCBmaWVsZCwgIiIpOworICAgIGlmICghYmVhbl9zdHlsZV8pIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpczsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gVW5zZXR0ZXIKKyAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoaXNzZXRUeXBlID09IElTU0VUX1BSSU1JVElWRSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0ZmllbGQgPSBvcmcuYXBhY2hlLnRocmlmdC5FbmNvZGluZ1V0aWxzLmNsZWFyQml0KF9faXNzZXRfYml0ZmllbGQsICIKKyAgICAgICAgICAgICAgICAgIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3IuY2xlYXIoIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBpc1NldCBtZXRob2QKKyAgICBpbmRlbnQob3V0KSA8PCAiLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCAiIDw8IGZpZWxkX25hbWUKKyAgICAgICAgICAgICAgICA8PCAiIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLyIgPDwgZW5kbDsKKyAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gaXMiIDw8IGdldF9jYXBfbmFtZSgic2V0IikgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGlzc2V0VHlwZSA9PSBJU1NFVF9QUklNSVRJVkUpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuRW5jb2RpbmdVdGlscy50ZXN0Qml0KF9faXNzZXRfYml0ZmllbGQsICIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpCisgICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19pc3NldF9iaXRfdmVjdG9yLmdldCgiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGNhcF9uYW1lIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKGJvb2xlYW4gdmFsdWUpIHsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICghdmFsdWUpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGlzc2V0VHlwZSA9PSBJU1NFVF9QUklNSVRJVkUpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gb3JnLmFwYWNoZS50aHJpZnQuRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgIgorICAgICAgICAgICAgICAgICAgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICIsIHZhbHVlKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3Iuc2V0KCIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICIsIHZhbHVlKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRvU3RyaW5nKCkgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImphdmEubGFuZy5TdHJpbmdCdWlsZGVyIHNiID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIKKyAgICAgIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbGVhbiBmaXJzdCA9IHRydWU7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisKKyAgICBpZiAoIWZpcnN0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFmaXJzdCkgc2IuYXBwZW5kKFwiLCBcIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAic2IuYXBwZW5kKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIik7IiA8PCBlbmRsOworICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBzYi5hcHBlbmQoXCJudWxsXCIpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGlmIChnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci50b1N0cmluZyh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgc2IpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICgoZmllbGQtPmdldF90eXBlKCktPmlzX3NldCgpKQorICAgICAgICAgICAgICAgJiYgKGdldF90cnVlX3R5cGUoKCh0X3NldCopZmllbGQtPmdldF90eXBlKCkpLT5nZXRfZWxlbV90eXBlKCkpLT5pc19iaW5hcnkoKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci50b1N0cmluZyh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgc2IpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICgoZmllbGQtPmdldF90eXBlKCktPmlzX2xpc3QoKSkKKyAgICAgICAgICAgICAgICYmIChnZXRfdHJ1ZV90eXBlKCgodF9saXN0KilmaWVsZC0+Z2V0X3R5cGUoKSktPmdldF9lbGVtX3R5cGUoKSktPmlzX2JpbmFyeSgpKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLnRvU3RyaW5nKHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLCBzYik7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInNiLmFwcGVuZCh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgImZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOworCisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzYi5hcHBlbmQoXCIpXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNiLnRvU3RyaW5nKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RhdGljIG1hcCB3aXRoIG1ldGEgZGF0YSB0byBzdG9yZSBpbmZvcm1hdGlvbiBzdWNoIGFzIGZpZWxkSUQgdG8KKyAqIGZpZWxkTmFtZSBtYXBwaW5nCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9tZXRhX2RhdGFfbWFwKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIFN0YXRpYyBNYXAgd2l0aCBmaWVsZElEIC0+IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhIG1hcHBpbmdzCisgIGluZGVudChvdXQpCisgICAgICA8PCAicHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJqYXZhLnV0aWwuTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiB0bXBNYXAgPSBuZXcgIgorICAgICAgICAgICAgICAgICAiamF2YS51dGlsLkVudW1NYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+KF9GaWVsZHMuY2xhc3MpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAvLyBQb3B1bGF0ZSBtYXAKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIGluZGVudChvdXQpIDw8ICJ0bXBNYXAucHV0KF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpCisgICAgICAgICAgICAgICAgPDwgIiwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKFwiIiA8PCBmaWVsZF9uYW1lIDw8ICJcIiwgIjsKKworICAgIC8vIFNldCBmaWVsZCByZXF1aXJlbWVudCB0eXBlIChyZXF1aXJlZCwgb3B0aW9uYWwsIGV0Yy4pCisgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgb3V0IDw8ICJvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuUkVRVUlSRUQsICI7CisgICAgfSBlbHNlIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgIG91dCA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5ERUZBVUxULCAiOworICAgIH0KKworICAgIC8vIENyZWF0ZSB2YWx1ZSBtZXRhIGRhdGEKKyAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgb3V0IDw8ICIpKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAibWV0YURhdGFNYXAgPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHRtcE1hcCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcCgiCisgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLmNsYXNzLCBtZXRhRGF0YU1hcCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIFJldHVybnMgYSBzdHJpbmcgd2l0aCB0aGUgamF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdGhyaWZ0IHR5cGUKKyAqIChlLmcuIGZvciB0aGUgdHlwZSBzdHJ1Y3QgaXQgcmV0dXJucyAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNUIikKKyAqLworc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKSB7CisgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5FTlVNIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gZ2V0X2phdmFfdHlwZV9zdHJpbmcoKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlZPSUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkJPT0wiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuQllURSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTE2IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2phdmFfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyEiKTsKKyAgICAgIHJldHVybiAiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfamF2YV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISI7CisgICAgICBicmVhazsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmchIik7CisgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQorICB9Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpIHsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibmV3ICIKKyAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLlN0cnVjdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLiIKKyAgICAgICAgICAgICAgICAgICAiU1RSVUNULCAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLmNsYXNzIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpCisgICAgICAgICAgPDwgIm5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuTGlzdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QsICI7CisgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgIDw8ICJuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLlNldE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNFVCwgIjsKKyAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7CisgICAgfSBlbHNlIHsgLy8gbWFwCisgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgIDw8ICJuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLk1hcE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgIjsKKyAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwga2V5X3R5cGUpOworICAgICAgb3V0IDw8ICIsICI7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCB2YWxfdHlwZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpCisgICAgICAgIDw8ICJuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkVudW1NZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5FTlVNLCAiCisgICAgICAgIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLmNsYXNzIjsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEoIgorICAgICAgICAgICAgICAgIDw8IGdldF9qYXZhX3R5cGVfc3RyaW5nKHR5cGUpOworICAgIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIsIFwiIiA8PCAoKHRfdHlwZWRlZiopdHlwZSktPmdldF9zeW1ib2xpYygpIDw8ICJcIiI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiwgdHJ1ZSI7CisgICAgfQorICB9CisgIG91dCA8PCAiKSI7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKKyAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcworICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgorICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZShzZXJ2aWNlX25hbWVfKSArICIuamF2YSI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfc3VwcHJlc3Npb25zKCk7CisKKyAgaWYgKCFzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfKSB7CisgICAgZ2VuZXJhdGVfamF2YXhfZ2VuZXJhdGVkX2Fubm90YXRpb24oZl9zZXJ2aWNlXyk7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9hc3luY19jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2VydmVyKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOworICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIuSWZhY2UiOworICB9CisKKyAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElmYWNlIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9hc3luY19pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiIC5Bc3luY0lmYWNlIjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnRlcmZhY2UgQXN5bmNJZmFjZSIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKCpmX2l0ZXIsIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgYXJncyBhbmQgcmV0dXJuIHR5cGVzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCB0cnVlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSA9PSBOVUxMKSB7CisgICAgZXh0ZW5kc19jbGllbnQgPSAib3JnLmFwYWNoZS50aHJpZnQuVFNlcnZpY2VDbGllbnQiOworICB9IGVsc2UgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcyArICIuQ2xpZW50IjsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBDbGllbnQgZXh0ZW5kcyAiIDw8IGV4dGVuZHNfY2xpZW50CisgICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgSWZhY2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pCisgICAgICA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVFNlcnZpY2VDbGllbnRGYWN0b3J5PENsaWVudD4geyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBGYWN0b3J5KCkge30iIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudCBnZXRDbGllbnQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QpIHsiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gbmV3IENsaWVudChwcm90KTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50IGdldENsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBuZXcgQ2xpZW50KGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInN1cGVyKHByb3QsIHByb3QpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgc3RyaW5nIHNlcCA9ICJfIjsKKyAgICBzdHJpbmcgamF2YW5hbWUgPSBmdW5uYW1lOworICAgIGlmIChmdWxsY2FtZWxfc3R5bGVfKSB7CisgICAgICBzZXAgPSAiIjsKKyAgICAgIGphdmFuYW1lID0gYXNfY2FtZWxfY2FzZShmdW5uYW1lKTsKKyAgICB9CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmQiIDw8IHNlcCA8PCBqYXZhbmFtZSA8PCAiKCI7CisKKyAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgLy8gRGVjbGFyZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZWN2IiA8PCBzZXAgPDwgamF2YW5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZCIpICsgc2VwICsgamF2YW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7CisKKyAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJhcmdzLnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgY29uc3Qgc3RyaW5nIHNlbmRCYXNlTmFtZSA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAic2VuZEJhc2VPbmV3YXkiIDogInNlbmRCYXNlIjsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgc2VuZEJhc2VOYW1lIDw8ICIoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCBhcmdzKTsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdiIpICsgc2VwICsgamF2YW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7CisgICAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlY2VpdmVCYXNlKHJlc3VsdCwgXCIiIDw8IGZ1bm5hbWUgPDwgIlwiKTsiIDw8IGVuZGw7CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKG9yZy5hcGFjaGUudGhyaWZ0LiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCBcIiIKKyAgICAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAib3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50IjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyAiLkFzeW5jQ2xpZW50IjsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBBc3luY0NsaWVudCBleHRlbmRzICIgPDwgZXh0ZW5kcworICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzIEFzeW5jSWZhY2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gRmFjdG9yeSBtZXRob2QKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50RmFjdG9yeTxBc3luY0NsaWVudD4geyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHByaXZhdGUgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50TWFuYWdlciBjbGllbnRNYW5hZ2VyOyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBwcml2YXRlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5OyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBwdWJsaWMgRmFjdG9yeShvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNDbGllbnRNYW5hZ2VyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJjbGllbnRNYW5hZ2VyLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJwcm90b2NvbEZhY3RvcnkpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICAgIHRoaXMuY2xpZW50TWFuYWdlciA9IGNsaWVudE1hbmFnZXI7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgICB0aGlzLnByb3RvY29sRmFjdG9yeSA9IHByb3RvY29sRmFjdG9yeTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcHVibGljIEFzeW5jQ2xpZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJnZXRBc3luY0NsaWVudChvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICAgIHJldHVybiBuZXcgQXN5bmNDbGllbnQocHJvdG9jb2xGYWN0b3J5LCBjbGllbnRNYW5hZ2VyLCB0cmFuc3BvcnQpOyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBBc3luY0NsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJwcm90b2NvbEZhY3RvcnksIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudE1hbmFnZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgImNsaWVudE1hbmFnZXIsIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKHByb3RvY29sRmFjdG9yeSwgY2xpZW50TWFuYWdlciwgdHJhbnNwb3J0KTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBzZXAgPSAiXyI7CisgICAgc3RyaW5nIGphdmFuYW1lID0gZnVubmFtZTsKKyAgICBpZiAoZnVsbGNhbWVsX3N0eWxlXykgeworICAgICAgc2VwID0gIiI7CisgICAgICBqYXZhbmFtZSA9IGFzX2NhbWVsX2Nhc2UoamF2YW5hbWUpOworICAgIH0KKyAgICB0X3R5cGUqIHJldF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHN0cmluZyBmdW5jbGFzc25hbWUgPSBmdW5uYW1lICsgIl9jYWxsIjsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgc3RyaW5nIGFyZ3NfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgICAgc3RyaW5nIHJlc3VsdF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgICAgLy8gTWFpbiBtZXRob2QgYm9keQorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKCpmX2l0ZXIsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIGNoZWNrUmVhZHkoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgICIgPDwgZnVuY2xhc3NuYW1lIDw8ICIgbWV0aG9kX2NhbGwgPSBuZXcgIiArIGZ1bmNsYXNzbmFtZSArICIoIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBhc3luY19hcmd1bWVudF9saXN0KCpmX2l0ZXIsIGFyZ19zdHJ1Y3QsIHJldF90eXBlKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCB0aGlzLCBfX19wcm90b2NvbEZhY3RvcnksIF9fX3RyYW5zcG9ydCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICB0aGlzLl9fX2N1cnJlbnRNZXRob2QgPSBtZXRob2RfY2FsbDsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIF9fX21hbmFnZXIuY2FsbChtZXRob2RfY2FsbCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIC8vIFRBc3luY01ldGhvZCBvYmplY3QgZm9yIHRoaXMgZnVuY3Rpb24gY2FsbAorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyAiICsgZnVuY2xhc3NuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY01ldGhvZENhbGw8IgorICAgICAgICAgICAgICAgICAgICAgICAgICArIHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksIHRydWUpICsgIj4geyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIC8vIE1lbWJlciB2YXJpYWJsZXMKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcml2YXRlICIgKyB0eXBlX25hbWUoKCpmbGRfaXRlciktPmdldF90eXBlKCkpICsgIiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSArICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIE5PVEUgc2luY2Ugd2UgdXNlIGEgbmV3IENsaWVudCBpbnN0YW5jZSB0byBkZXNlcmlhbGl6ZSwgbGV0J3Mga2VlcCBzZXFpZCB0byAwIGZvciBub3cKKyAgICAvLyBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgaW50IHNlcWlkOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gQ29uc3RydWN0b3IKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiICsgZnVuY2xhc3NuYW1lICsgIigiCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgYXN5bmNfYXJndW1lbnRfbGlzdCgqZl9pdGVyLCBhcmdfc3RydWN0LCByZXRfdHlwZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50IGNsaWVudCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnNwb3J0KSB0aHJvd3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihjbGllbnQsIHByb3RvY29sRmFjdG9yeSwgdHJhbnNwb3J0LCByZXN1bHRIYW5kbGVyLCAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gInRydWUiIDogImZhbHNlIikgPDwgIik7IiA8PCBlbmRsOworCisgICAgLy8gQXNzaWduIG1lbWJlciB2YXJpYWJsZXMKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHRoaXMuIiArICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiA9ICIgKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyB2b2lkIHdyaXRlX2FyZ3Mob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICAvLyBTZXJpYWxpemUgcmVxdWVzdAorICAgIC8vIE5PVEUgd2UgYXJlIGxlYXZpbmcgc2VxaWQgYXMgMCwgZm9yIG5vdyAoc2VlIGFib3ZlKQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlKFwiIgorICAgICAgICAgICAgICAgPDwgZnVubmFtZSA8PCAiXCIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLiIKKyAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PTkVXQVkiIDogIlRNZXNzYWdlVHlwZS5DQUxMIikgPDwgIiwgMCkpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgYXJnc19uYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NfbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Muc2V0IiA8PCBnZXRfY2FwX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICIoIgorICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInByb3Qud3JpdGVNZXNzYWdlRW5kKCk7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBSZXR1cm4gbWV0aG9kCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiArIHR5cGVfbmFtZShyZXRfdHlwZSwgdHJ1ZSkgKyAiIGdldFJlc3VsdCgpIHRocm93cyAiOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXworICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiaWYgKGdldFN0YXRlKCkgIT0gb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jTWV0aG9kQ2FsbC5TdGF0ZS5SRVNQT05TRV9SRUFEKSB7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwiTWV0aG9kIGNhbGwgbm90IGZpbmlzaGVkIVwiKTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5SW5wdXRUcmFuc3BvcnQgbWVtb3J5VHJhbnNwb3J0ID0gbmV3ICIKKyAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5SW5wdXRUcmFuc3BvcnQoZ2V0RnJhbWVCdWZmZXIoKS5hcnJheSgpKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90ID0gIgorICAgICAgICAgICAgICAgICAgICAgICAiY2xpZW50LmdldFByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKG1lbW9yeVRyYW5zcG9ydCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKTsKKyAgICBpZiAocmV0X3R5cGUtPmlzX3ZvaWQoKSkgeyAvLyBOQjogSW5jbHVkZXMgb25ld2F5cyB3aGljaCBhbHdheXMgcmV0dXJuIHZvaWQuCisgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gbnVsbDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAobmV3IENsaWVudChwcm90KSkucmVjdiIgKyBzZXAgKyBqYXZhbmFtZSArICIoKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKworICAgIC8vIENsb3NlIGNsYXNzCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIENsb3NlIEFzeW5jQ2xpZW50CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBFeHRlbmRzIHN0dWZmCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgPT0gTlVMTCkgeworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlUHJvY2Vzc29yPEk+IjsKKyAgfSBlbHNlIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLlByb2Nlc3NvcjxJPiI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIFByb2Nlc3NvcjxJIGV4dGVuZHMgSWZhY2U+IGV4dGVuZHMgIgorICAgICAgICAgICAgICAgICAgICAgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIiBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pCisgICAgICA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLnNsZjRqLkxvZ2dlciBfTE9HR0VSID0gb3JnLnNsZjRqLkxvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFByb2Nlc3Nvci5jbGFzcy5nZXROYW1lKCkpOyIKKyAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgUHJvY2Vzc29yKEkgaWZhY2UpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihpZmFjZSwgZ2V0UHJvY2Vzc01hcChuZXcgamF2YS51dGlsLkhhc2hNYXA8amF2YS5sYW5nLlN0cmluZywgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPj4oKSkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgUHJvY2Vzc29yKEkgaWZhY2UsIGphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U+PiAiCisgICAgICAgICAgICAgICAgICAgICAgICAicHJvY2Vzc01hcCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKGlmYWNlLCBnZXRQcm9jZXNzTWFwKHByb2Nlc3NNYXApKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBzdGF0aWMgPEkgZXh0ZW5kcyBJZmFjZT4gamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U+PiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0UHJvY2Vzc01hcChqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZT4+IHByb2Nlc3NNYXApIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY2Vzc01hcC5wdXQoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsIG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCkpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBwcm9jZXNzTWFwOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9hc3luY19zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBFeHRlbmRzIHN0dWZmCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgPT0gTlVMTCkgeworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlQXN5bmNQcm9jZXNzb3I8ST4iOworICB9IGVsc2UgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuQXN5bmNQcm9jZXNzb3I8ST4iOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBBc3luY1Byb2Nlc3NvcjxJIGV4dGVuZHMgQXN5bmNJZmFjZT4gZXh0ZW5kcyAiCisgICAgICAgICAgICAgICAgICAgICA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLnNsZjRqLkxvZ2dlciBfTE9HR0VSID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBc3luY1Byb2Nlc3Nvci5jbGFzcy5nZXROYW1lKCkpOyIgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBBc3luY1Byb2Nlc3NvcihJIGlmYWNlKSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgc3VwZXIoaWZhY2UsIGdldFByb2Nlc3NNYXAobmV3IGphdmEudXRpbC5IYXNoTWFwPGphdmEubGFuZy5TdHJpbmcsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5Bc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlLCA/Pj4oKSkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgQXN5bmNQcm9jZXNzb3IoSSBpZmFjZSwgamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlLCA/Pj4gcHJvY2Vzc01hcCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKGlmYWNlLCBnZXRQcm9jZXNzTWFwKHByb2Nlc3NNYXApKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBzdGF0aWMgPEkgZXh0ZW5kcyBBc3luY0lmYWNlPiBqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsICAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzICAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2UsPz4+IGdldFByb2Nlc3NNYXAoamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlLCA/Pj4gcHJvY2Vzc01hcCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzTWFwLnB1dChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoKSk7IiA8PCBlbmRsOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHByb2Nlc3NNYXA7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2FzeW5jX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2FzeW5jX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworCisgIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJlc3VsdG5hbWUgPSAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2UiOworICB9CisKKyAgc3RyaW5nIHJlc3VsdHR5cGUgPSB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCB0cnVlKTsKKworICAodm9pZCl0c2VydmljZTsKKyAgLy8gT3BlbiBjbGFzcworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICI8SSBleHRlbmRzIEFzeW5jSWZhY2U+IGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgIgorICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc25hbWUgPDwgIiwgIiA8PCByZXN1bHR0eXBlIDw8ICI+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoKSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgc3VwZXIoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBhcmdzbmFtZSA8PCAiIGdldEVtcHR5QXJnc0luc3RhbmNlKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHJldHVybiBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrPCIgPDwgcmVzdWx0dHlwZQorICAgICAgICAgICAgICAgICAgICAgPDwgIj4gZ2V0UmVzdWx0SGFuZGxlcihmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5Bc3luY0ZyYW1lQnVmZmVyIGZiLCBmaW5hbCBpbnQgc2VxaWQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uIGZjYWxsID0gdGhpczsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrPCIgPDwgcmVzdWx0dHlwZQorICAgICAgICAgICAgICAgICAgICAgPDwgIj4oKSB7ICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHZvaWQgb25Db21wbGV0ZSgiIDw8IHJlc3VsdHR5cGUgPDwgIiBvKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKworICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVzdWx0LnN1Y2Nlc3MgPSBvOyIgPDwgZW5kbDsKKyAgICAgIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCisgICAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5zZXQiIDw8IGdldF9jYXBfbmFtZSgic3VjY2VzcyIpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIih0cnVlKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykKKyAgICAgICAgPDwgIiAgZmNhbGwuc2VuZFJlc3BvbnNlKGZiLCByZXN1bHQsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5SRVBMWSxzZXFpZCk7IgorICAgICAgICA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiX0xPR0dFUi5lcnJvcihcIlRUcmFuc3BvcnRFeGNlcHRpb24gd3JpdGluZyB0byBpbnRlcm5hbCBmcmFtZSBidWZmZXJcIiwgZSk7IgorICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImZiLmNsb3NlKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGNhdGNoIChqYXZhLmxhbmcuRXhjZXB0aW9uIGUpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiX0xPR0dFUi5lcnJvcihcIkV4Y2VwdGlvbiB3cml0aW5nIHRvIGludGVybmFsIGZyYW1lIGJ1ZmZlclwiLCBlKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib25FcnJvcihlKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHZvaWQgb25FcnJvcihqYXZhLmxhbmcuRXhjZXB0aW9uIGUpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uKSB7IgorICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiX0xPR0dFUi5lcnJvcihcIlRUcmFuc3BvcnRFeGNlcHRpb24gaW5zaWRlIGhhbmRsZXJcIiwgZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmIuY2xvc2UoKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJfTE9HR0VSLmVycm9yKFwiRXhjZXB0aW9uIGluc2lkZSBvbmV3YXkgaGFuZGxlclwiLCBlKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImJ5dGUgbXNnVHlwZSA9IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5SRVBMWTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UU2VyaWFsaXphYmxlIG1zZzsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworCisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgaWYgKHhfaXRlciA9PSB4Y2VwdGlvbnMuYmVnaW4oKSkKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgICBzdHJpbmcgdHlwZSA9IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHN0cmluZyBuYW1lID0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBmX3NlcnZpY2VfIDw8ICJpZiAoZSBpbnN0YW5jZW9mICIgPDwgdHlwZSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgbmFtZSA8PCAiID0gKCIgPDwgdHlwZSA8PCAiKSBlOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuc2V0IiA8PCBnZXRfY2FwX25hbWUobmFtZSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICAgICAgPDwgIih0cnVlKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXNnID0gcmVzdWx0OyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGVsc2UgIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICJpZiAoZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIl9MT0dHRVIuZXJyb3IoXCJUVHJhbnNwb3J0RXhjZXB0aW9uIGluc2lkZSBoYW5kbGVyXCIsIGUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImZiLmNsb3NlKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIGlmIChlIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7IgorICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIl9MT0dHRVIuZXJyb3IoXCJUQXBwbGljYXRpb25FeGNlcHRpb24gaW5zaWRlIGhhbmRsZXJcIiwgZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXNnVHlwZSA9IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5FWENFUFRJT047IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXNnID0gKG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbillOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiX0xPR0dFUi5lcnJvcihcIkV4Y2VwdGlvbiBpbnNpZGUgaGFuZGxlclwiLCBlKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJtc2dUeXBlID0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJtc2cgPSBuZXcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihvcmcuYXBhY2hlLnRocmlmdC4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCBlLmdldE1lc3NhZ2UoKSk7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZmNhbGwuc2VuZFJlc3BvbnNlKGZiLG1zZyxtc2dUeXBlLHNlcWlkKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoIChqYXZhLmxhbmcuRXhjZXB0aW9uIGV4KSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBfTE9HR0VSLmVycm9yKFwiRXhjZXB0aW9uIHdyaXRpbmcgdG8gaW50ZXJuYWwgZnJhbWUgYnVmZmVyXCIsIGV4KTsiCisgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBmYi5jbG9zZSgpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb3RlY3RlZCBib29sZWFuIGlzT25ld2F5KCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHJldHVybiAiIDw8ICgodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgdm9pZCBzdGFydChJIGlmYWNlLCAiIDw8IGFyZ3NuYW1lCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGFyZ3MsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s8IiA8PCByZXN1bHR0eXBlCisgICAgICAgICAgICAgICAgICAgICA8PCAiPiByZXN1bHRIYW5kbGVyKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisKKyAgZl9zZXJ2aWNlXyA8PCAiaWZhY2UuIiA8PCBnZXRfcnBjX21ldGhvZF9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIigiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBpZiAoIWZpcnN0KQorICAgIGZfc2VydmljZV8gPDwgIiwiOworICBmX3NlcnZpY2VfIDw8ICJyZXN1bHRIYW5kbGVyIjsKKyAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IjsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgY2xhc3MKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmVzdWx0bmFtZSA9ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZSI7CisgIH0KKworICAodm9pZCl0c2VydmljZTsKKyAgLy8gT3BlbiBjbGFzcworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICI8SSBleHRlbmRzIElmYWNlPiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCAiCisgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzbmFtZSA8PCAiPiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgYXJnc25hbWUgPDwgIiBnZXRFbXB0eUFyZ3NJbnN0YW5jZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByZXR1cm4gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgYm9vbGVhbiBpc09uZXdheSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByZXR1cm4gIiA8PCAoKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpID8gInRydWUiIDogImZhbHNlIikgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb3RlY3RlZCBib29sZWFuIHJldGhyb3dVbmhhbmRsZWRFeGNlcHRpb25zKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHJldHVybiAiIDw8ICgocmV0aHJvd191bmhhbmRsZWRfZXhjZXB0aW9uc18pID8gInRydWUiIDogImZhbHNlIikgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgcmVzdWx0bmFtZSA8PCAiIGdldFJlc3VsdChJIGlmYWNlLCAiIDw8IGFyZ3NuYW1lCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGFyZ3MpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucworICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAiOworICB9CisgIGZfc2VydmljZV8gPDwgImlmYWNlLiIgPDwgZ2V0X3JwY19tZXRob2RfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgLy8gU2V0IGlzc2V0IG9uIHN1Y2Nlc3MgZmllbGQKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKQorICAgICAgJiYgIXR5cGVfY2FuX2JlX251bGwodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVzdWx0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCJzdWNjZXNzIikgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIiAiCisgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7CisgICAgICB9CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gbnVsbDsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gcmVzdWx0OyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iOworCisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBDbG9zZSBjbGFzcworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKKyAqIEBwYXJhbSBwcmVmaXggVGhlIHZhcmlhYmxlIG5hbWUgb3IgY29udGFpbmVyIGZvciB0aGlzIGZpZWxkCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lLCBoYXNfbWV0YWRhdGEpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaXByb3QuIjsKKworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCk7IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgInJlYWRCb29sKCk7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBvdXQgPDwgInJlYWRCeXRlKCk7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgb3V0IDw8ICJyZWFkSTE2KCk7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8ICJyZWFkSTY0KCk7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCk7IjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlKQorICAgICAgICAgICAgICAgICAgICsgIi5maW5kQnlWYWx1ZShpcHJvdC5yZWFkSTMyKCkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBpbnZva2VzIHJlYWQoKQorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKworICBpZiAocmV1c2Vfb2JqZWN0c18pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsOworICBpZiAocmV1c2Vfb2JqZWN0c18pIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgeworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgc3RyaW5nIG9iajsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb2JqID0gdG1wKCJfbWFwIik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb2JqID0gdG1wKCJfc2V0Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKKyAgfQorCisgIGlmIChoYXNfbWV0YWRhdGEpIHsKKyAgICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZE1hcEJlZ2luKCk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTZXQgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRTZXRCZWdpbigpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCAiIDw8IG9iagorICAgICAgICAgICAgICAgICAgPDwgIiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKCIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgPDwgImlwcm90LnJlYWRJMzIoKSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNldCAiIDw8IG9iagorICAgICAgICAgICAgICAgICAgPDwgIiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU2V0KCIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgaXByb3QucmVhZEkzMigpKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0ICIgPDwgb2JqCisgICAgICAgICAgICAgICAgICA8PCAiID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KCIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsIGlwcm90LnJlYWRJMzIoKSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpZiAocmV1c2Vfb2JqZWN0c18pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIGlmIChpc19lbnVtX3NldCh0dHlwZSkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUsIHRydWUpIDw8ICIubm9uZU9mIjsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKTsKKyAgfQorCisgIC8vIGNvbnN0cnVjdCB0aGUgY29sbGVjdGlvbiBjb3JyZWN0bHkgaS5lLiB3aXRoIGFwcHJvcHJpYXRlIHNpemUvdHlwZQorICBpZiAoaXNfZW51bV9zZXQodHR5cGUpIHx8IGlzX2VudW1fbWFwKHR0eXBlKSkgeworICAgIG91dCA8PCAiKCIgPDwgaW5uZXJfZW51bV90eXBlX25hbWUodHR5cGUpIDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmIChzb3J0ZWRfY29udGFpbmVyc18gJiYgKHR0eXBlLT5pc19tYXAoKSB8fCB0dHlwZS0+aXNfc2V0KCkpKSB7CisgICAgLy8gVHJlZVNldCBhbmQgVHJlZU1hcCBkb24ndCBoYXZlIGFueSBjb25zdHJ1Y3RvciB3aGljaCB0YWtlcyBhIGNhcGFjaXR5IGFzIGFuIGFyZ3VtZW50CisgICAgb3V0IDw8ICIoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICIoIiA8PCAodHR5cGUtPmlzX2xpc3QoKSA/ICIiIDogIjIqIikgPDwgb2JqIDw8ICIuc2l6ZSIKKyAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKHJldXNlX29iamVjdHNfKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCwgb2JqLCBoYXNfbWV0YWRhdGEpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4LCBvYmosIGhhc19tZXRhZGF0YSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgsIG9iaiwgaGFzX21ldGFkYXRhKTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAoaGFzX21ldGFkYXRhKSB7CisgICAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgeworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSwgcmV1c2Vfb2JqZWN0c18sIGZhbHNlKSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsLCByZXVzZV9vYmplY3RzXywgZmFsc2UpIDw8IGVuZGw7CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwgImZvciAoaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLnNpemUiCisgICAgICAgICAgICAgIDw8ICI7ICIKKyAgICAgICAgICAgICAgPDwgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSwgIiIsIGhhc19tZXRhZGF0YSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwsICIiLCBoYXNfbWV0YWRhdGEpOworCisgIGlmIChnZXRfdHJ1ZV90eXBlKGZrZXkuZ2V0X3R5cGUoKSktPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBrZXkgPDwgIiAhPSBudWxsKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucHV0KCIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKworICBpZiAoZ2V0X3RydWVfdHlwZShma2V5LmdldF90eXBlKCkpLT5pc19lbnVtKCkpIHsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBpZiAocmV1c2Vfb2JqZWN0c18gJiYgIWdldF90cnVlX3R5cGUoZmtleS5nZXRfdHlwZSgpKS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBrZXkgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKHJldXNlX29iamVjdHNfICYmICFnZXRfdHJ1ZV90eXBlKGZ2YWwuZ2V0X3R5cGUoKSktPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgdmFsIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50CisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSwgcmV1c2Vfb2JqZWN0c18sIGZhbHNlKSA8PCBlbmRsOworCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IgKGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5zaXplIgorICAgICAgICAgICAgICA8PCAiOyAiCisgICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgIiIsIGhhc19tZXRhZGF0YSk7CisKKyAgaWYgKGdldF90cnVlX3R5cGUoZmVsZW0uZ2V0X3R5cGUoKSktPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBlbGVtIDw8ICIgIT0gbnVsbCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworCisgIGlmIChnZXRfdHJ1ZV90eXBlKGZlbGVtLmdldF90eXBlKCkpLT5pc19lbnVtKCkpIHsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBpZiAocmV1c2Vfb2JqZWN0c18gJiYgIWdldF90cnVlX3R5cGUoZmVsZW0uZ2V0X3R5cGUoKSktPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgZWxlbSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBsaXN0IGVsZW1lbnQKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0sIHJldXNlX29iamVjdHNfLCBmYWxzZSkgPDwgZW5kbDsKKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yIChpbnQgIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuc2l6ZSIKKyAgICAgICAgICAgICAgPDwgIjsgIgorICAgICAgICAgICAgICA8PCAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sICIiLCBoYXNfbWV0YWRhdGEpOworCisgIGlmIChnZXRfdHJ1ZV90eXBlKGZlbGVtLmdldF90eXBlKCkpLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZWxlbSA8PCAiICE9IG51bGwpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5hZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKKworICBpZiAoZ2V0X3RydWVfdHlwZShmZWxlbS5nZXRfdHlwZSgpKS0+aXNfZW51bSgpKSB7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgaWYgKHJldXNlX29iamVjdHNfICYmICFnZXRfdHJ1ZV90eXBlKGZlbGVtLmdldF90eXBlKCkpLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGluZGVudChvdXQpIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCksIGhhc19tZXRhZGF0YSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlSTMyKCIgPDwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIuZ2V0VmFsdWUoKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAid3JpdGVJMzIoc3RydWN0LiIgPDwgbmFtZSA8PCAiKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKKyAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKGhhc19tZXRhZGF0YSkgeworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKCIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNldCgiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4CisgICAgICAgICAgICAgICAgICA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QoIgorICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKKyAgICAgICAgICAgICAgICAgIDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVJMzIoIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpOyIgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAoamF2YS51dGlsLk1hcC5FbnRyeTwiIDw8IHR5cGVfbmFtZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpLCB0cnVlLCBmYWxzZSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfbmFtZSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIj4gIiA8PCBpdGVyCisgICAgICAgICAgICAgICAgPDwgIiA6ICIgPDwgcHJlZml4IDw8ICIuZW50cnlTZXQoKSkiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKCIgPDwgdHlwZV9uYW1lKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlciA8PCAiIDogIgorICAgICAgICAgICAgICAgIDw8IHByZWZpeCA8PCAiKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKCIgPDwgdHlwZV9uYW1lKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIgPDwgIiA6ICIKKyAgICAgICAgICAgICAgICA8PCBwcmVmaXggPDwgIikiOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgsIGhhc19tZXRhZGF0YSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlciwgaGFzX21ldGFkYXRhKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyLCBoYXNfbWV0YWRhdGEpOworICB9CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAoaGFzX21ldGFkYXRhKSB7CisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7CisgICh2b2lkKW1hcDsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIgKyAiLmdldEtleSgpIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiLCBoYXNfbWV0YWRhdGEpOworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgaXRlciArICIuZ2V0VmFsdWUoKSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIiwgaGFzX21ldGFkYXRhKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsIGhhc19tZXRhZGF0YSk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsIGhhc19tZXRhZGF0YSk7Cit9CisKKy8qKgorICogUmV0dXJucyBhIEphdmEgdHlwZSBuYW1lCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcGFyYW0gY29udGFpbmVyIElzIHRoZSB0eXBlIGdvaW5nIGluc2lkZSBhIGNvbnRhaW5lcj8KKyAqIEByZXR1cm4gSmF2YSB0eXBlIG5hbWUsIGkuZS4gamF2YS51dGlsLkhhc2hNYXA8S2V5LFZhbHVlPgorICovCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2tpcF9nZW5lcmljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlX25hbWVzcGFjZSkgeworICAvLyBJbiBKYXZhIHR5cGVkZWZzIGFyZSBqdXN0IHJlc29sdmVkIHRvIHRoZWlyIHJlYWwgdHlwZQorICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBzdHJpbmcgcHJlZml4OworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSwgaW5fY29udGFpbmVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgaWYgKGluX2luaXQpIHsKKyAgICAgIGlmIChpc19lbnVtX21hcCh0bWFwKSkgeworICAgICAgICBwcmVmaXggPSAiamF2YS51dGlsLkVudW1NYXAiOworICAgICAgfSBlbHNlIGlmIChzb3J0ZWRfY29udGFpbmVyc18pIHsKKyAgICAgICAgcHJlZml4ID0gImphdmEudXRpbC5UcmVlTWFwIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByZWZpeCA9ICJqYXZhLnV0aWwuSGFzaE1hcCI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHByZWZpeCA9ICJqYXZhLnV0aWwuTWFwIjsKKyAgICB9CisgICAgcmV0dXJuIHByZWZpeCArIChza2lwX2dlbmVyaWMgPyAiIiA6ICI8IiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSkgKyAiLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHRydWUpICsgIj4iKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgaWYgKGluX2luaXQpIHsKKyAgICAgIGlmIChpc19lbnVtX3NldCh0c2V0KSkgeworICAgICAgICBwcmVmaXggPSAiamF2YS51dGlsLkVudW1TZXQiOworICAgICAgfSBlbHNlIGlmIChzb3J0ZWRfY29udGFpbmVyc18pIHsKKyAgICAgICAgcHJlZml4ID0gImphdmEudXRpbC5UcmVlU2V0IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByZWZpeCA9ICJqYXZhLnV0aWwuSGFzaFNldCI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHByZWZpeCA9ICJqYXZhLnV0aWwuU2V0IjsKKyAgICB9CisgICAgcmV0dXJuIHByZWZpeCArIChza2lwX2dlbmVyaWMgPyAiIiA6ICI8IiArIHR5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgIGlmIChpbl9pbml0KSB7CisgICAgICBwcmVmaXggPSAiamF2YS51dGlsLkFycmF5TGlzdCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHByZWZpeCA9ICJqYXZhLnV0aWwuTGlzdCI7CisgICAgfQorICAgIHJldHVybiBwcmVmaXggKyAoc2tpcF9nZW5lcmljID8gIiIgOiAiPCIgKyB0eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSkgKyAiPiIpOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIG5hbWVzcGFjaW5nCisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAoKHByb2dyYW0gIT0gTlVMTCkgJiYgKChwcm9ncmFtICE9IHByb2dyYW1fKSB8fCBmb3JjZV9uYW1lc3BhY2UpKSB7CisgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJqYXZhIik7CisgICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBwYWNrYWdlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIEphdmEgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lciBJcyBpdCBnb2luZyBpbiBhIEphdmEgY29udGFpbmVyPworICovCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUsIGJvb2wgaW5fY29udGFpbmVyKSB7CisgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOworCisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIlZvaWQiIDogInZvaWQiKTsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICByZXR1cm4gImphdmEubmlvLkJ5dGVCdWZmZXIiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gImphdmEubGFuZy5TdHJpbmciOworICAgIH0KKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gImphdmEubGFuZy5Cb29sZWFuIiA6ICJib29sZWFuIik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiamF2YS5sYW5nLkJ5dGUiIDogImJ5dGUiKTsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiamF2YS5sYW5nLlNob3J0IiA6ICJzaG9ydCIpOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJqYXZhLmxhbmcuSW50ZWdlciIgOiAiaW50Iik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gImphdmEubGFuZy5Mb25nIiA6ICJsb25nIik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gImphdmEubGFuZy5Eb3VibGUiIDogImRvdWJsZSIpOworICBkZWZhdWx0OgorICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgIH0KK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKKyAqIEBwYXJhbSBpbml0IFdoZXRoZXIgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQKKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIGJvb2wgY29tbWVudCkgeworICAvLyBUT0RPKG1jc2xlZSk6IGRvIHdlIGV2ZXIgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZD8KKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0dHlwZSkpIHsKKyAgICByZXN1bHQgKz0gamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgKyAiICI7CisgIH0KKyAgcmVzdWx0ICs9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICBpZiAoaW5pdCkgeworICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICBzdGQ6Om9mc3RyZWFtIGR1bW15OworICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgICA7CisgICAgfQorICB9CisgIHJlc3VsdCArPSAiOyI7CisgIGlmIChjb21tZW50KSB7CisgICAgcmVzdWx0ICs9ICIgLy8gIjsKKyAgICBpZiAodGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgcmVzdWx0ICs9ICJvcHRpb25hbCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAicmVxdWlyZWQiOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgc3RkOjpzdHJpbmcgZm5fbmFtZSA9IGdldF9ycGNfbWV0aG9kX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIHByZWZpeCArIGZuX25hbWUgKyAiKCIKKyAgICAgICAgICAgICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSB0aHJvd3MgIjsKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICIsICI7CisgIH0KKyAgcmVzdWx0ICs9ICJvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd2b2lkIG5hbWUoYXJncywgcmVzdWx0SGFuZGxlciknCisgKgorICogQHBhcmFtcyB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfYmFzZV9tZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RkOjpzdHJpbmcgYXJnbGlzdCA9IGFzeW5jX2Z1bmN0aW9uX2NhbGxfYXJnbGlzdCh0ZnVuY3Rpb24sIHVzZV9iYXNlX21ldGhvZCwgdHJ1ZSk7CisKKyAgc3RkOjpzdHJpbmcgcmV0X3R5cGUgPSAiIjsKKyAgaWYgKHVzZV9iYXNlX21ldGhvZCkgeworICAgIHJldF90eXBlICs9ICJBc3luY0NsaWVudC4iOworICB9CisgIHJldF90eXBlICs9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfY2FsbCI7CisKKyAgc3RkOjpzdHJpbmcgZm5fbmFtZSA9IGdldF9ycGNfbWV0aG9kX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKKworICBzdGQ6OnN0cmluZyByZXN1bHQgPSBwcmVmaXggKyAidm9pZCAiICsgZm5fbmFtZSArICIoIiArIGFyZ2xpc3QgKyAiKSI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphc3luY19mdW5jdGlvbl9jYWxsX2FyZ2xpc3QodF9mdW5jdGlvbiogdGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2Jhc2VfbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfdHlwZXMpIHsKKyAgKHZvaWQpdXNlX2Jhc2VfbWV0aG9kOworICBzdGQ6OnN0cmluZyBhcmdsaXN0ID0gIiI7CisgIGlmICh0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPiAwKSB7CisgICAgYXJnbGlzdCA9IGFyZ3VtZW50X2xpc3QodGZ1bmMtPmdldF9hcmdsaXN0KCksIGluY2x1ZGVfdHlwZXMpICsgIiwgIjsKKyAgfQorCisgIGlmIChpbmNsdWRlX3R5cGVzKSB7CisgICAgYXJnbGlzdCArPSAib3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazwiOworICAgIGFyZ2xpc3QgKz0gdHlwZV9uYW1lKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpLCB0cnVlKSArICI+ICI7CisgIH0KKyAgYXJnbGlzdCArPSAicmVzdWx0SGFuZGxlciI7CisKKyAgcmV0dXJuIGFyZ2xpc3Q7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGNvbW1hIHNlcGFyYXRlZCBmaWVsZCBsaXN0LCB3aXRoIHR5cGUgbmFtZXMKKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV90eXBlcykgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICBpZiAoaW5jbHVkZV90eXBlcykgeworICAgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiOworICAgIH0KKyAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphc3luY19hcmd1bWVudF9saXN0KHRfZnVuY3Rpb24qIHRmdW5jdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV90eXBlcykgeworICAodm9pZCl0ZnVuY3Q7CisgICh2b2lkKXR0eXBlOworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKKyAgICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBpZiAoIWZpcnN0KSB7CisgICAgcmVzdWx0ICs9ICIsICI7CisgIH0KKyAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKKyAgICByZXN1bHQgKz0gIm9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s8IjsKKyAgICByZXN1bHQgKz0gdHlwZV9uYW1lKHRmdW5jdC0+Z2V0X3JldHVybnR5cGUoKSwgdHJ1ZSkgKyAiPiAiOworICB9CisgIHJlc3VsdCArPSAicmVzdWx0SGFuZGxlciI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBKYXZhIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBUYWtlcyBhIG5hbWUgYW5kIHByb2R1ZXMgYSB2YWxpZCBKYXZhIHNvdXJjZSBmaWxlIG5hbWUgZnJvbSBpdAorICoKKyAqIEBwYXJhbSBmcm9tTmFtZSBUaGUgbmFtZSB3aGljaCBzaGFsbCBiZWNvbWUgYSB2YWxpZCBKYXZhIHNvdXJjZSBmaWxlIG5hbWUKKyAqIEByZXR1cm4gVGhlIHByb2R1Y2VkIGlkZW50aWZpZXIKKyAqLworc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6bWFrZV92YWxpZF9qYXZhX2ZpbGVuYW1lKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSkgeworICAvLyBpZiBhbnkgZnVydGhlciBydWxlcyBhcHBseSB0byBzb3VyY2UgZmlsZSBuYW1lcyBpbiBKYXZhLCBtb2RpZnkgYXMgbmVjZXNzYXJ5CisgIHJldHVybiBtYWtlX3ZhbGlkX2phdmFfaWRlbnRpZmllcihmcm9tTmFtZSk7Cit9CisKKy8qKgorICogVGFrZXMgYSBuYW1lIGFuZCBwcm9kdWVzIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyIGZyb20gaXQKKyAqCisgKiBAcGFyYW0gZnJvbU5hbWUgVGhlIG5hbWUgd2hpY2ggc2hhbGwgYmVjb21lIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyCisgKiBAcmV0dXJuIFRoZSBwcm9kdWNlZCBpZGVudGlmaWVyCisgKi8KK3N0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6Om1ha2VfdmFsaWRfamF2YV9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSkgeworICBzdGQ6OnN0cmluZyBzdHIgPSBmcm9tTmFtZTsKKyAgaWYgKHN0ci5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHN0cjsKKyAgfQorCisgIC8vIHRlc3RzIHJlbHkgb24gdGhpcworICBhc3NlcnQoKCdBJyA8ICdaJykgJiYgKCdhJyA8ICd6JykgJiYgKCcwJyA8ICc5JykpOworCisgIC8vIGlmIHRoZSBmaXJzdCBsZXR0ZXIgaXMgYSBudW1iZXIsIHdlIGFkZCBhbiBhZGRpdGlvbmFsIHVuZGVyc2NvcmUgaW4gZnJvbnQgb2YgaXQKKyAgY2hhciBjID0gc3RyLmF0KDApOworICBpZiAoKCcwJyA8PSBjKSAmJiAoYyA8PSAnOScpKSB7CisgICAgc3RyID0gIl8iICsgc3RyOworICB9CisKKyAgLy8gZm9sbG93aW5nIGNoYXJzOiBsZXR0ZXIsIG51bWJlciBvciB1bmRlcnNjb3JlCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgKytpKSB7CisgICAgYyA9IHN0ci5hdChpKTsKKyAgICBpZiAoKCgnQScgPiBjKSB8fCAoYyA+ICdaJykpICYmICgoJ2EnID4gYykgfHwgKGMgPiAneicpKSAmJiAoKCcwJyA+IGMpIHx8IChjID4gJzknKSkKKyAgICAgICAgJiYgKCdfJyAhPSBjKSkgeworICAgICAgc3RyLnJlcGxhY2UoaSwgMSwgIl8iKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RyOworfQorCitzdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphc19jYW1lbF9jYXNlKHN0ZDo6c3RyaW5nIG5hbWUsIGJvb2wgdWNmaXJzdCkgeworICBzdGQ6OnN0cmluZyBuZXdfbmFtZTsKKyAgc2l6ZV90IGkgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgbmFtZS5zaXplKCk7IGkrKykgeworICAgIGlmIChuYW1lW2ldICE9ICdfJykKKyAgICAgIGJyZWFrOworICB9CisgIGlmICh1Y2ZpcnN0KSB7CisgICAgbmV3X25hbWUgKz0gdG91cHBlcihuYW1lW2krK10pOworICB9IGVsc2UgeworICAgIG5ld19uYW1lICs9IHRvbG93ZXIobmFtZVtpKytdKTsKKyAgfQorICBmb3IgKDsgaSA8IG5hbWUuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAobmFtZVtpXSA9PSAnXycpIHsKKyAgICAgIGlmIChpIDwgbmFtZS5zaXplKCkgLSAxKSB7CisgICAgICAgIGkrKzsKKyAgICAgICAgbmV3X25hbWUgKz0gdG91cHBlcihuYW1lW2ldKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgbmV3X25hbWUgKz0gbmFtZVtpXTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG5ld19uYW1lOworfQorCitzdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpnZXRfcnBjX21ldGhvZF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgaWYgKGZ1bGxjYW1lbF9zdHlsZV8pIHsKKyAgICByZXR1cm4gYXNfY2FtZWxfY2FzZShuYW1lLCBmYWxzZSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5hbWU7CisgIH0KK30KKworLyoqCisgKiBBcHBsaWVzIHRoZSBjb3JyZWN0IHN0eWxlIHRvIGEgc3RyaW5nIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBub2NhbWVsX3N0eWxlXworICogYW5kL29yIGZ1bGxjYW1lbF9zdHlsZV8KKyAqLworc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgaWYgKG5vY2FtZWxfc3R5bGVfKSB7CisgICAgcmV0dXJuICJfIiArIG5hbWU7CisgIH0gZWxzZSBpZiAoZnVsbGNhbWVsX3N0eWxlXykgeworICAgIHJldHVybiBhc19jYW1lbF9jYXNlKG5hbWUpOworICB9IGVsc2UgeworICAgIG5hbWVbMF0gPSB0b3VwcGVyKG5hbWVbMF0pOworICAgIHJldHVybiBuYW1lOworICB9Cit9CisKK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7CisgIHN0cmluZyBjb25zdGFudF9uYW1lOworCisgIGJvb2wgaXNfZmlyc3QgPSB0cnVlOworICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7CisgIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gbmFtZS5iZWdpbigpOyBpdGVyICE9IG5hbWUuZW5kKCk7ICsraXRlcikgeworICAgIHN0cmluZzo6dmFsdWVfdHlwZSBjaGFyYWN0ZXIgPSAoKml0ZXIpOworCisgICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKKworICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7CisgICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKKyAgICB9CisgICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpc19maXJzdCA9IGZhbHNlOworICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7CisgIH0KKworICByZXR1cm4gY29uc3RhbnRfbmFtZTsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpIHsKKworICB0X2NvbnRhaW5lciogY29udGFpbmVyID0gKHRfY29udGFpbmVyKil0eXBlOworICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZTsKKyAgaWYgKHNvdXJjZV9uYW1lX3AyID09ICIiKQorICAgIHNvdXJjZV9uYW1lID0gc291cmNlX25hbWVfcDE7CisgIGVsc2UKKyAgICBzb3VyY2VfbmFtZSA9IHNvdXJjZV9uYW1lX3AxICsgIi4iICsgc291cmNlX25hbWVfcDI7CisKKyAgYm9vbCBjb3B5X2NvbnN0cnVjdF9jb250YWluZXI7CisgIGlmIChjb250YWluZXItPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKWNvbnRhaW5lcjsKKyAgICBjb3B5X2NvbnN0cnVjdF9jb250YWluZXIgPSB0bWFwLT5nZXRfa2V5X3R5cGUoKS0+aXNfYmFzZV90eXBlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0bWFwLT5nZXRfdmFsX3R5cGUoKS0+aXNfYmFzZV90eXBlKCk7CisgIH0gZWxzZSB7CisgICAgdF90eXBlKiBlbGVtX3R5cGUgPSBjb250YWluZXItPmlzX2xpc3QoKSA/ICgodF9saXN0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKCh0X3NldCopY29udGFpbmVyKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvcHlfY29uc3RydWN0X2NvbnRhaW5lciA9IGVsZW1fdHlwZS0+aXNfYmFzZV90eXBlKCk7CisgIH0KKworICBpZiAoY29weV9jb25zdHJ1Y3RfY29udGFpbmVyKSB7CisgICAgLy8gZGVlcCBjb3B5IG9mIGJhc2UgdHlwZXMgY2FuIGJlIGRvbmUgbXVjaCBtb3JlIGVmZmljaWVudGx5IHRoYW4gaXRlcmF0aW5nIG92ZXIgYWxsIHRoZQorICAgIC8vIGVsZW1lbnRzIG1hbnVhbGx5CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X25hbWUgPDwgIiA9IG5ldyAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGNvbnRhaW5lciwgZmFsc2UsIHRydWUpIDw8ICIoIiA8PCBzb3VyY2VfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjpzdHJpbmcgY29uc3RydWN0b3JfYXJnczsKKyAgaWYgKGlzX2VudW1fc2V0KGNvbnRhaW5lcikgfHwgaXNfZW51bV9tYXAoY29udGFpbmVyKSkgeworICAgIGNvbnN0cnVjdG9yX2FyZ3MgPSBpbm5lcl9lbnVtX3R5cGVfbmFtZShjb250YWluZXIpOworICB9IGVsc2UgaWYgKCEoc29ydGVkX2NvbnRhaW5lcnNfICYmIChjb250YWluZXItPmlzX21hcCgpIHx8IGNvbnRhaW5lci0+aXNfc2V0KCkpKSkgeworICAgIC8vIHVuc29ydGVkIGNvbnRhaW5lcnMgYWNjZXB0IGEgY2FwYWNpdHkgdmFsdWUKKyAgICBjb25zdHJ1Y3Rvcl9hcmdzID0gc291cmNlX25hbWUgKyAiLnNpemUoKSI7CisgIH0KKworICBpZiAoaXNfZW51bV9zZXQoY29udGFpbmVyKSkgeworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9uYW1lIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGNvbnRhaW5lciwgZmFsc2UsIHRydWUsIHRydWUpIDw8ICIubm9uZU9mKCIgPDwgY29uc3RydWN0b3JfYXJncyA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X25hbWUgPDwgIiA9IG5ldyAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGNvbnRhaW5lciwgZmFsc2UsIHRydWUpIDw8ICIoIiA8PCBjb25zdHJ1Y3Rvcl9hcmdzIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA9IHNvdXJjZV9uYW1lX3AxICsgIl9lbGVtZW50IjsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0X2VsZW1lbnRfbmFtZSA9IHJlc3VsdF9uYW1lICsgIl9jb3B5IjsKKworICBpZiAoY29udGFpbmVyLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKiljb250YWluZXIpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopY29udGFpbmVyKS0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIChqYXZhLnV0aWwuTWFwLkVudHJ5PCIgPDwgdHlwZV9uYW1lKGtleV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICI+ICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIgOiAiCisgICAgICAgICAgICAgICAgPDwgc291cmNlX25hbWUgPDwgIi5lbnRyeVNldCgpKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIl9rZXkgPSAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiLmdldEtleSgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIl92YWx1ZSA9ICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIuZ2V0VmFsdWUoKTsiIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGlmIChrZXlfdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX2tleSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl9rZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfa2V5ID0gIjsKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfa2V5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX2tleSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSk7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpZiAodmFsX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbF90eXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHZhbF90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl92YWx1ZSA9ICI7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbF90eXBlKTsKKyAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIucHV0KCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSwgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIl92YWx1ZSk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIHRfdHlwZSogZWxlbV90eXBlOworCisgICAgaWYgKGNvbnRhaW5lci0+aXNfc2V0KCkpIHsKKyAgICAgIGVsZW1fdHlwZSA9ICgodF9zZXQqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZWxlbV90eXBlID0gKCh0X2xpc3QqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICgiIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIiA6ICIgPDwgc291cmNlX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKGVsZW1fdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIC8vIHJlY3Vyc2l2ZSBkZWVwIGNvcHkKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUsICIiLCByZXN1bHRfZWxlbWVudF9uYW1lLCBlbGVtX3R5cGUpOworICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGQoIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gaXRlcmF0aXZlIGNvcHkKKyAgICAgIGlmIChlbGVtX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJqYXZhLm5pby5CeXRlQnVmZmVyIHRlbXBfYmluYXJ5X2VsZW1lbnQgPSAiOworICAgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlbXBfYmluYXJ5X2VsZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtX3R5cGUpOworICAgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkKHRlbXBfYmluYXJ5X2VsZW1lbnQpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkKCI7CisgICAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCByZXN1bHRfbmFtZSwgZWxlbV90eXBlKTsKKyAgICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSkgeworICAodm9pZClkZXN0X25hbWU7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpIHx8IHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgb3V0IDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb3B5QmluYXJ5KCIgPDwgc291cmNlX25hbWUgPDwgIikiOworICAgIH0gZWxzZSB7CisgICAgICAvLyBldmVyeXRoaW5nIGVsc2UgY2FuIGJlIGNvcGllZCBkaXJlY3RseQorICAgICAgb3V0IDw8IHNvdXJjZV9uYW1lOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIm5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCB0cnVlKSA8PCAiKCIgPDwgc291cmNlX25hbWUgPDwgIikiOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKSB7CisgIHJldHVybiBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZC0+Z2V0X25hbWUoKSk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6Omlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKSB7CisgIHJldHVybiAiX18iICsgdXBjYXNlX3N0cmluZyhmaWVsZC0+Z2V0X25hbWUoKSArICJfaXNzZXRfaWQiKTsKK30KKworc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgeworICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIGlmICghdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgInNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKKyAgICAgICAgICAgICAgICA8PCAiKHRydWUpOyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgIgorICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdChcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9kZXNjcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgIgorICAgICAgICAgICAgICAgIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICJcIiwgIiA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgIihzaG9ydCkiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NjaGVtZV9tYXAob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlNjaGVtZUZhY3RvcnkgU1RBTkRBUkRfU0NIRU1FX0ZBQ1RPUlkgPSBuZXcgIgorICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiU3RhbmRhcmRTY2hlbWVGYWN0b3J5KCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlNjaGVtZUZhY3RvcnkgVFVQTEVfU0NIRU1FX0ZBQ1RPUlkgPSBuZXcgIgorICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiVHVwbGVTY2hlbWVGYWN0b3J5KCk7IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX25hbWVfY29uc3RhbnRzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIi8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciAiCisgICAgICAgICAgICAgICAgICJmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZW51bSBfRmllbGRzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkSWRFbnVtIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKCFmaXJzdCkgeworICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBmaXJzdCA9IGZhbHNlOworICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKm1faXRlcik7CisgICAgaW5kZW50KG91dCkgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIoKHNob3J0KSIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkKKyAgICAgICAgICAgICAgICA8PCAiLCBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIikiOworICB9CisKKyAgb3V0IDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkKKyAgICAgIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsIF9GaWVsZHM+IGJ5TmFtZSA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcDxqYXZhLmxhbmcuU3RyaW5nLCBfRmllbGRzPigpOyIKKyAgICAgIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgZm9yIChfRmllbGRzIGZpZWxkIDogamF2YS51dGlsLkVudW1TZXQuYWxsT2YoX0ZpZWxkcy5jbGFzcykpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgYnlOYW1lLnB1dChmaWVsZC5nZXRGaWVsZE5hbWUoKSwgZmllbGQpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLiIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZChpbnQgZmllbGRJZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2goZmllbGRJZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjogLy8gIgorICAgICAgICAgICAgICAgIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG51bGw7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqIGlmIGl0IGlzIG5vdCBmb3VuZC4iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWRPclRocm93KGludCBmaWVsZElkKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBfRmllbGRzIGZpZWxkcyA9IGZpbmRCeVRocmlmdElkKGZpZWxkSWQpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGZpZWxkcyA9PSBudWxsKSB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIkZpZWxkIFwiICsgZmllbGRJZCArICIKKyAgICAgICAgICAgICAgICAgIlwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGZpZWxkczsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIG5hbWUsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4iCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5TmFtZShqYXZhLmxhbmcuU3RyaW5nIG5hbWUpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBieU5hbWUuZ2V0KG5hbWUpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBmaW5hbCBzaG9ydCBfdGhyaWZ0SWQ7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIF9maWVsZE5hbWU7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIl9GaWVsZHMoc2hvcnQgdGhyaWZ0SWQsIGphdmEubGFuZy5TdHJpbmcgZmllbGROYW1lKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBfdGhyaWZ0SWQgPSB0aHJpZnRJZDsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIF9maWVsZE5hbWUgPSBmaWVsZE5hbWU7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc2hvcnQgZ2V0VGhyaWZ0RmllbGRJZCgpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBfdGhyaWZ0SWQ7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRGaWVsZE5hbWUoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gX2ZpZWxkTmFtZTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3RfamF2YV9nZW5lcmF0b3I6Omlzc2V0X3R5cGUgdF9qYXZhX2dlbmVyYXRvcjo6bmVlZHNfaXNzZXQodF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRQcmltaXRpdmVUeXBlKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaW50IGNvdW50ID0gMDsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbChnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpKSB7CisgICAgICBjb3VudCsrOworICAgIH0KKyAgfQorICBpZiAoY291bnQgPT0gMCkgeworICAgIHJldHVybiBJU1NFVF9OT05FOworICB9IGVsc2UgaWYgKGNvdW50IDw9IDY0KSB7CisgICAgaWYgKG91dFByaW1pdGl2ZVR5cGUgIT0gTlVMTCkgeworICAgICAgaWYgKGNvdW50IDw9IDgpCisgICAgICAgICpvdXRQcmltaXRpdmVUeXBlID0gImJ5dGUiOworICAgICAgZWxzZSBpZiAoY291bnQgPD0gMTYpCisgICAgICAgICpvdXRQcmltaXRpdmVUeXBlID0gInNob3J0IjsKKyAgICAgIGVsc2UgaWYgKGNvdW50IDw9IDMyKQorICAgICAgICAqb3V0UHJpbWl0aXZlVHlwZSA9ICJpbnQiOworICAgICAgZWxzZSBpZiAoY291bnQgPD0gNjQpCisgICAgICAgICpvdXRQcmltaXRpdmVUeXBlID0gImxvbmciOworICAgIH0KKyAgICByZXR1cm4gSVNTRVRfUFJJTUlUSVZFOworICB9IGVsc2UgeworICAgIHJldHVybiBJU1NFVF9CSVRTRVQ7CisgIH0KK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaWYgKCFqYXZhNV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBjbGVhcigpIHsiIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKm1faXRlcjsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAgIGlmIChmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy4iICsgZmllbGQtPmdldF9uYW1lKCksIHQsIGZpZWxkLT5nZXRfdmFsdWUoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgeworCisgICAgICBpZiAocmV1c2Vfb2JqZWN0c18gJiYgKHQtPmlzX2NvbnRhaW5lcigpIHx8IHQtPmlzX3N0cnVjdCgpKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIuY2xlYXIoKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgICB9IGVsc2UgeworCisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gbXVzdCBiZSBhIGJhc2UgdHlwZQorICAgIC8vIG1lYW5zIGl0IGFsc28gbmVlZHMgdG8gYmUgZXhwbGljaXRseSB1bnNldAorICAgIGluZGVudChvdXQpIDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIoZmFsc2UpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSAodF9iYXNlX3R5cGUqKXQ7CisKKyAgICBzd2l0Y2ggKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSAwOyIgPDwgZW5kbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gMC4wOyIgPDwgZW5kbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAidW5zdXBwb3J0ZWQgdHlwZTogIiArIGJhc2VfdHlwZS0+Z2V0X25hbWUoKSArICIgZm9yIGZpZWxkICIgKyBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvLyBnZW5lcmF0ZXMgamF2YSBtZXRob2QgdG8gc2VyaWFsaXplIChpbiB0aGUgSmF2YSBzZW5zZSkgdGhlIG9iamVjdAordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZV9vYmplY3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KQorICAgICAgPDwgInByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0cnkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICB3cml0ZShuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgIgorICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChvdXQpKSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlIiA8PCAoYW5kcm9pZF9sZWdhY3lfID8gIi5nZXRNZXNzYWdlKCkiIDogIiIpCisgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLy8gZ2VuZXJhdGVzIGphdmEgbWV0aG9kIHRvIHNlcmlhbGl6ZSAoaW4gdGhlIEphdmEgc2Vuc2UpIHRoZSBvYmplY3QKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZF9vYmplY3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzICIKKyAgICAgICAgICAgICAgICAgImphdmEuaW8uSU9FeGNlcHRpb24sIGphdmEubGFuZy5DbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRyeSB7IiA8PCBlbmRsOworICBpZiAoIXRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBzd2l0Y2ggKG5lZWRzX2lzc2V0KHRzdHJ1Y3QpKSB7CisgICAgY2FzZSBJU1NFVF9OT05FOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBJU1NFVF9QUklNSVRJVkU6CisgICAgICBpbmRlbnQob3V0KSA8PCAiICAgIC8vIGl0IGRvZXNuJ3Qgc2VlbSBsaWtlIHlvdSBzaG91bGQgaGF2ZSB0byBkbyB0aGlzLCBidXQgamF2YSAiCisgICAgICAgICAgICAgICAgICAgICAic2VyaWFsaXphdGlvbiBpcyB3YWNreSwgYW5kIGRvZXNuJ3QgY2FsbCB0aGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4iIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICAgIF9faXNzZXRfYml0ZmllbGQgPSAwOyIgPDwgZW5kbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVNTRVRfQklUU0VUOgorICAgICAgaW5kZW50KG91dCkgPDwgIiAgICAvLyBpdCBkb2Vzbid0IHNlZW0gbGlrZSB5b3Ugc2hvdWxkIGhhdmUgdG8gZG8gdGhpcywgYnV0IGphdmEgIgorICAgICAgICAgICAgICAgICAgICAgInNlcmlhbGl6YXRpb24gaXMgd2Fja3ksIGFuZCBkb2Vzbid0IGNhbGwgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgICBfX2lzc2V0X2JpdF92ZWN0b3IgPSBuZXcgamF2YS51dGlsLkJpdFNldCgxKTsiIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaW5kZW50KG91dCkgPDwgIiAgICByZWFkKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyAiCisgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KGluKSkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSIgPDwgKGFuZHJvaWRfbGVnYWN5XyA/ICIuZ2V0TWVzc2FnZSgpIiA6ICIiKQorICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RhbmRhcmRfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgIgorICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcyBhbmQgcmVhZCBzdHJ1Y3QgaGVhZGVyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIHNjaGVtZUZpZWxkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgInNjaGVtZUZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RPUCkgeyAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzY2hlbWVGaWVsZC5pZCkgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IC8vICIKKyAgICAgICAgICAgICAgICA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzdHJ1Y3QuIiwgdHJ1ZSk7CisgICAgaW5kZW50KG91dCkgPDwgInN0cnVjdC4iCisgICAgICAgICAgICAgICAgPDwgInNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICAgPDwgIih0cnVlKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7IgorICAgICAgICAgICAgICA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICAvLyBpbiBub24tYmVhbnMgc3R5bGUsIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUKKyAgLy8gKHdoaWNoIGNhbiBiZSBjaGVja2VkIGhlcmUgYnV0IG5vdCBpbiB0aGUgZ2VuZXJhbCB2YWxpZGF0ZSBtZXRob2QpCisgIGlmICghYmVhbl9zdHlsZV8pIHsKKyAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZSwgd2hpY2ggY2FuJ3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGVja2VkIGluIHRoZSB2YWxpZGF0ZSBtZXRob2QiIDw8IGVuZGw7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEICYmICF0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIXN0cnVjdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKFwiUmVxdWlyZWQgZmllbGQgJyIKKyAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgPDwgIicgd2FzIG5vdCBmb3VuZCBpbiBzZXJpYWxpemVkIGRhdGEhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICBpbmRlbnQob3V0KSA8PCAic3RydWN0LnZhbGlkYXRlKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdGFuZGFyZF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpIHsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90LCAiCisgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaW5kZW50KG91dCkgPDwgInN0cnVjdC52YWxpZGF0ZSgpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChzdHJ1Y3QuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIGJvb2wgb3B0aW9uYWwgPSAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgfHwgKGlzX3Jlc3VsdCAmJiAhbnVsbF9hbGxvd2VkKTsKKyAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIgorICAgICAgICAgICAgICAgICAgPDwgInN0cnVjdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCgqZl9pdGVyKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInN0cnVjdC4iLCB0cnVlKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiCisgICAgICA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3N0YW5kYXJkX3NjaGVtZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIlN0YW5kYXJkU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TY2hlbWVGYWN0b3J5IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiU3RhbmRhcmRTY2hlbWUgZ2V0U2NoZW1lKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiU3RhbmRhcmRTY2hlbWUoKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSBzdGF0aWMgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICA8PCAiU3RhbmRhcmRTY2hlbWUgZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU3RhbmRhcmRTY2hlbWU8IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI+IHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGdlbmVyYXRlX3N0YW5kYXJkX3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfc3RhbmRhcmRfd3JpdGVyKG91dCwgdHN0cnVjdCwgaXNfcmVzdWx0KTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgIgorICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUdXBsZVByb3RvY29sIGlwcm90ID0gKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUdXBsZVByb3RvY29sKSBwcm90OyIgPDwgZW5kbDsKKyAgaW50IG9wdGlvbmFsX2NvdW50ID0gMDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgIHx8ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgIG9wdGlvbmFsX2NvdW50Kys7CisgICAgfQorICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICgqZl9pdGVyKSwgInN0cnVjdC4iLCBmYWxzZSk7CisgICAgICBpbmRlbnQob3V0KSA8PCAic3RydWN0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICAgICA8PCAiKHRydWUpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaWYgKG9wdGlvbmFsX2NvdW50ID4gMCkgeworICAgIGluZGVudChvdXQpIDw8ICJqYXZhLnV0aWwuQml0U2V0IGluY29taW5nID0gaXByb3QucmVhZEJpdFNldCgiIDw8IG9wdGlvbmFsX2NvdW50IDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgICAgfHwgKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGluY29taW5nLmdldCgiIDw8IGkgPDwgIikpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICgqZl9pdGVyKSwgInN0cnVjdC4iLCBmYWxzZSk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJzdHJ1Y3Quc2V0IiA8PCBnZXRfY2FwX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKKyAgICAgICAgICAgICAgICAgICAgPDwgIih0cnVlKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBpKys7CisgICAgICB9CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgIgorICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUdXBsZVByb3RvY29sIG9wcm90ID0gKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUdXBsZVByb3RvY29sKSBwcm90OyIgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgaGFzX29wdGlvbmFsID0gZmFsc2U7CisgIGludCBvcHRpb25hbF9jb3VudCA9IDA7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgfHwgKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgeworICAgICAgb3B0aW9uYWxfY291bnQrKzsKKyAgICAgIGhhc19vcHRpb25hbCA9IHRydWU7CisgICAgfQorICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJzdHJ1Y3QuIiwgZmFsc2UpOworICAgIH0KKyAgfQorICBpZiAoaGFzX29wdGlvbmFsKSB7CisgICAgaW5kZW50KG91dCkgPDwgImphdmEudXRpbC5CaXRTZXQgb3B0aW9uYWxzID0gbmV3IGphdmEudXRpbC5CaXRTZXQoKTsiIDw8IGVuZGw7CisgICAgaW50IGkgPSAwOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAgIHx8ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmIChzdHJ1Y3QuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygoKmZfaXRlcikpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAib3B0aW9uYWxzLnNldCgiIDw8IGkgPDwgIik7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgaSsrOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsICIgPDwgb3B0aW9uYWxfY291bnQgPDwgIik7IiA8PCBlbmRsOworICAgIGludCBqID0gMDsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgICB8fCAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoc3RydWN0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICgqZl9pdGVyKSwgInN0cnVjdC4iLCBmYWxzZSk7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBqKys7CisgICAgICB9CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3NjaGVtZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIlR1cGxlU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TY2hlbWVGYWN0b3J5IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiVHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiVHVwbGVTY2hlbWUoKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInByaXZhdGUgc3RhdGljIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgPDwgIlR1cGxlU2NoZW1lIGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlR1cGxlU2NoZW1lPCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiPiB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3NjaGVtZV9sb29rdXAob3N0cmVhbSYgb3V0KSB7CisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyA8UyBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5JU2NoZW1lPiBTIHNjaGVtZSgiCisgICAgICA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3RvKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiAob3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlN0YW5kYXJkU2NoZW1lLmNsYXNzLmVxdWFscyhwcm90by5nZXRTY2hlbWUoKSkgIgorICAgICAgPDwgIj8gU1RBTkRBUkRfU0NIRU1FX0ZBQ1RPUlkgIgorICAgICAgPDwgIjogVFVQTEVfU0NIRU1FX0ZBQ1RPUlkiCisgICAgICA8PCAiKS5nZXRTY2hlbWUoKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmF4X2dlbmVyYXRlZF9hbm5vdGF0aW9uKG9zdHJlYW0mIG91dCkgeworICB0aW1lX3Qgc2Vjb25kcyA9IHRpbWUoTlVMTCk7CisgIHN0cnVjdCB0bSogbm93ID0gbG9jYWx0aW1lKCZzZWNvbmRzKTsKKyAgaW5kZW50KG91dCkgPDwgIkBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZCh2YWx1ZSA9IFwiIiA8PCBhdXRvZ2VuX3N1bW1hcnkoKSA8PCAiXCIiOworICBpZiAodW5kYXRlZF9nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfKSB7CisgICAgb3V0IDw8ICIpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICIsIGRhdGUgPSBcIiIgPDwgKG5vdy0+dG1feWVhciArIDE5MDApIDw8ICItIiA8PCBzZXRmaWxsKCcwJykgPDwgc2V0dygyKQorICAgICAgICAgICAgICAgIDw8IChub3ctPnRtX21vbiArIDEpIDw8ICItIiA8PCBzZXRmaWxsKCcwJykgPDwgc2V0dygyKSA8PCBub3ctPnRtX21kYXkKKyAgICAgICAgICAgICAgICA8PCAiXCIpIiA8PCBlbmRsOworICB9Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgamF2YSwKKyAgICAiSmF2YSIsCisgICAgIiAgICBiZWFuczogICAgICAgICAgIE1lbWJlcnMgd2lsbCBiZSBwcml2YXRlLCBhbmQgc2V0dGVyIG1ldGhvZHMgd2lsbCByZXR1cm4gdm9pZC5cbiIKKyAgICAiICAgIHByaXZhdGUtbWVtYmVyczogTWVtYmVycyB3aWxsIGJlIHByaXZhdGUsIGJ1dCBzZXR0ZXIgbWV0aG9kcyB3aWxsIHJldHVybiAndGhpcycgbGlrZSAiCisgICAgInVzdWFsLlxuIgorICAgICIgICAgbm9jYW1lbDogICAgICAgICBEbyBub3QgdXNlIENhbWVsQ2FzZSBmaWVsZCBhY2Nlc3NvcnMgd2l0aCBiZWFucy5cbiIKKyAgICAiICAgIGZ1bGxjYW1lbDogICAgICAgQ29udmVydCB1bmRlcnNjb3JlZF9hY2Nlc3Nvcl9vcl9zZXJ2aWNlX25hbWVzIHRvIGNhbWVsQ2FzZS5cbiIKKyAgICAiICAgIGFuZHJvaWQ6ICAgICAgICAgR2VuZXJhdGVkIHN0cnVjdHVyZXMgYXJlIFBhcmNlbGFibGUuXG4iCisgICAgIiAgICBhbmRyb2lkX2xlZ2FjeTogIERvIG5vdCB1c2UgamF2YS5pby5JT0V4Y2VwdGlvbih0aHJvd2FibGUpIChhdmFpbGFibGUgZm9yIEFuZHJvaWQgMi4zIGFuZCAiCisgICAgImFib3ZlKS5cbiIKKyAgICAiICAgIG9wdGlvbl90eXBlOiAgICAgV3JhcCBvcHRpb25hbCBmaWVsZHMgaW4gYW4gT3B0aW9uIHR5cGUuXG4iCisgICAgIiAgICByZXRocm93X3VuaGFuZGxlZF9leGNlcHRpb25zOlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBFbmFibGUgcmV0aHJvdyBvZiB1bmhhbmRsZWQgZXhjZXB0aW9ucyBhbmQgbGV0IHRoZW0gcHJvcGFnYXRlIGZ1dGhlci4iCisgICAgIiAoRGVmYXVsdCBiZWhhdmlvciBpcyB0byBjYXRjaCBhbmQgbG9nIGl0LilcbiIKKyAgICAiICAgIGphdmE1OiAgICAgICAgICAgR2VuZXJhdGUgSmF2YSAxLjUgY29tcGxpYW50IGNvZGUgKGluY2x1ZGVzIGFuZHJvaWRfbGVnYWN5IGZsYWcpLlxuIgorICAgICIgICAgcmV1c2Utb2JqZWN0czogICBEYXRhIG9iamVjdHMgd2lsbCBub3QgYmUgYWxsb2NhdGVkLCBidXQgZXhpc3RpbmcgaW5zdGFuY2VzIHdpbGwgYmUgdXNlZCAiCisgICAgIihyZWFkIGFuZCB3cml0ZSkuXG4iCisgICAgIiAgICBzb3J0ZWRfY29udGFpbmVyczpcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgVXNlIFRyZWVTZXQvVHJlZU1hcCBpbnN0ZWFkIG9mIEhhc2hTZXQvSGFzaE1hcCBhcyBhIGltcGxlbWVudGF0aW9uIG9mICIKKyAgICAic2V0L21hcC5cbiIKKyAgICAiICAgIGdlbmVyYXRlZF9hbm5vdGF0aW9ucz1bdW5kYXRlZHxzdXBwcmVzc106XG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIHVuZGF0ZWQ6IHN1cHByZXNzIHRoZSBkYXRlIGF0IEBHZW5lcmF0ZWQgYW5ub3RhdGlvbnNcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgc3VwcHJlc3M6IHN1cHByZXNzIEBHZW5lcmF0ZWQgYW5ub3RhdGlvbnMgZW50aXJlbHlcbiIKKyAgICAiICAgIHVuc2FmZV9iaW5hcmllczogRG8gbm90IGNvcHkgQnl0ZUJ1ZmZlcnMgaW4gY29uc3RydWN0b3JzLCBnZXR0ZXJzLCBhbmQgc2V0dGVycy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFtZV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFtZV9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE3NDNjYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfamF2YW1lX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDMyOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEphdmEgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X2phdmFtZV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9qYXZhbWVfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKXBhcnNlZF9vcHRpb25zOworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIC8qIG5vIG9wdGlvbnMgeWV0ICovCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gamF2YW1lOiIgKyBpdGVyLT5maXJzdDsKKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1qYXZhbWUiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbik7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9qYXZhX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSk7CisgIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOworICBzdGQ6OnN0cmluZyBpc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9wcmltaXRpdmVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2dldHRlcnNfYW5kX3NldHRlcnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jaGVja190eXBlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3JlYWRfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfd3JpdGVfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9uYW1lKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb25faGFzaGNvZGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKTsKKworICB2b2lkIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpOworICB2b2lkIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpOworCisgIGJvb2wgaGFzX2JpdF92ZWN0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBqYXZhX3BhY2thZ2UoKTsKKyAgc3RkOjpzdHJpbmcgamF2YV90eXBlX2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgamF2YV90aHJpZnRfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2luaXQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2tpcF9nZW5lcmljID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV90eXBlcyA9IHRydWUpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF9kZXNjcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgYm94X3R5cGUodF90eXBlKiB0eXBlLCBzdHJpbmcgdmFsdWUpOworCisgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJpbmcoKQorICAgICAgICAgICB8fCB0dHlwZS0+aXNfZW51bSgpOworICB9CisKKyAgc3RkOjpzdHJpbmcgY29uc3RhbnRfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisgIHBhY2thZ2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiamF2YSIpOworCisgIHN0cmluZyBkaXIgPSBwYWNrYWdlX25hbWVfOworICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKTsKKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKKyAgfQorICBpZiAoZGlyLnNpemUoKSA+IDApIHsKKyAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICB9CisKKyAgcGFja2FnZV9kaXJfID0gc3ViZGlyOworfQorCisvKioKKyAqIFBhY2thZ2VzIHRoZSBnZW5lcmF0ZWQgZmlsZQorICoKKyAqIEByZXR1cm4gU3RyaW5nIG9mIHRoZSBwYWNrYWdlLCBpLmUuICJwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0ZGVtbzsiCisgKi8KK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmphdmFfcGFja2FnZSgpIHsKKyAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXyArICI7XG5cbiI7CisgIH0KKyAgcmV0dXJuICIiOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBqYXZhIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBmb3IgSmF2YSB0eXBlcyB0aGF0IGFyZSB1c2VkIGluIGhlcmUKKyAqLworc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6amF2YV90eXBlX2ltcG9ydHMoKSB7CisgIHJldHVybiBzdHJpbmcoKSArICJpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTtcbiIgKyAiaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7XG4iCisgICAgICAgICArICJpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uO1xuXG4iOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBqYXZhIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIHRocmlmdAorICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpqYXZhX3RocmlmdF9pbXBvcnRzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7XG4iICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjtcbiIKKyAgICAgICAgICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjtcbiIgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7XG5cbiI7Cit9CisKKy8qKgorICogTm90aGluZyBpbiBKYXZhCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBKYXZhLCBzaW5jZSBpdCBkb2VzCisgKiBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgbmFtZSByZXBsYWNlbWVudHMsIGFuZCBpdCdkIGJlIGEgd2Fja3kgd2FzdGUKKyAqIG9mIG92ZXJoZWFkIHRvIG1ha2Ugd3JhcHBlciBjbGFzc2VzLgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKKy8qKgorICogRW51bXMgYXJlIGEgY2xhc3Mgd2l0aCBhIHNldCBvZiBzdGF0aWMgY29uc3RhbnRzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICh0ZW51bS0+Z2V0X25hbWUoKSkgKyAiLmphdmEiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZW51bTsKKyAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7CisKKyAgLy8gQ29tbWVudCBhbmQgcGFja2FnZSBpdAorICBmX2VudW0gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCk7CisKKyAgZ2VuZXJhdGVfamF2YV9kb2MoZl9lbnVtLCB0ZW51bSk7CisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEVudW0gIjsKKyAgc2NvcGVfdXAoZl9lbnVtKTsKKyAgZl9lbnVtIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9lbnVtLCAqY19pdGVyKTsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyBmaW5hbCAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiID0gbmV3ICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIigiIDw8IHZhbHVlIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorICBmX2VudW0gPDwgZW5kbDsKKworICAvLyBGaWVsZCBmb3IgdGhyaWZ0Q29kZQorICBpbmRlbnQoZl9lbnVtKSA8PCAicHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInByaXZhdGUgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiKGludCB2YWx1ZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAgdGhpcy52YWx1ZSA9IHZhbHVlOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAiLyoqIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICogR2V0IHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoaXMgZW51bSB2YWx1ZSwgYXMgZGVmaW5lZCBpbiB0aGUgVGhyaWZ0IElETC4iCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgaW50IGdldFZhbHVlKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuIHZhbHVlOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAiLyoqIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICogRmluZCBhIHRoZSBlbnVtIHR5cGUgYnkgaXRzIGludGVnZXIgdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICogQHJldHVybiBudWxsIGlmIHRoZSB2YWx1ZSBpcyBub3QgZm91bmQuIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICovIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyAiICsgdGVudW0tPmdldF9uYW1lKCkgKyAiIGZpbmRCeVZhbHVlKGludCB2YWx1ZSkgeyAiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInN3aXRjaCAodmFsdWUpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAiY2FzZSAiIDw8IHZhbHVlIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChmX2VudW0pIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuIG51bGw7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAifSIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfZW51bSk7CisKKyAgZl9lbnVtLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIGlmIChjb25zdHMuZW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICJDb25zdGFudHMuamF2YSI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHM7CisgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV90eXBlX2ltcG9ydHMoKTsKKworICBmX2NvbnN0cyA8PCAicHVibGljIGNsYXNzICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2NvbnN0cykgPDwgIn0iIDw8IGVuZGw7CisgIGZfY29uc3RzLmNsb3NlKCk7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpbmRlbnQob3V0KTsKKyAgaWYgKCFkZWZ2YWwpIHsKKyAgICBvdXQgPDwgKGluX3N0YXRpYyA/ICIiIDogInB1YmxpYyBzdGF0aWMgZmluYWwgIikgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgfQorICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiI7CisgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpOworICAgICAgb3V0IDw8ICJzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLnB1dCgiIDw8IGJveF90eXBlKGt0eXBlLCBrZXkpIDw8ICIsICIgPDwgYm94X3R5cGUodnR5cGUsIHZhbCkgPDwgIik7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5hZGRFbGVtZW50KCIgPDwgYm94X3R5cGUoZXR5cGUsIHZhbCkgPDwgIik7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLnB1dCgiIDw8IGJveF90eXBlKGV0eXBlLCB2YWwpIDw8ICIsICIgPDwgYm94X3R5cGUoZXR5cGUsIHZhbCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KK30KKworc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgKHZvaWQpbmFtZTsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmVuZGVyIDw8ICIoYnl0ZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZW5kZXIgPDwgIihzaG9ydCkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiTCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJlbmRlciA8PCAiKGRvdWJsZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIGZhbHNlKSA8PCAiLiIgPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyKCk7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOworICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUpOworICAgIHJlbmRlciA8PCB0OworICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKworc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Ym94X3R5cGUodF90eXBlKiB0eXBlLCBzdHJpbmcgdmFsdWUpIHsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAibmV3IEJvb2xlYW4oIiArIHZhbHVlICsgIikiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIm5ldyBCeXRlKCIgKyB2YWx1ZSArICIpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAibmV3IFNob3J0KCIgKyB2YWx1ZSArICIpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAibmV3IEludGVnZXIoIiArIHZhbHVlICsgIikiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJuZXcgTG9uZygiICsgdmFsdWUgKyAiKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIm5ldyBEb3VibGUoIiArIHZhbHVlICsgIikiOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgd2lsbCBiZSBhIFRCYXNlCisgKiBpbXBsZW1lbnRvci4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIGdlbmVyYXRlX2phdmFfdW5pb24odHN0cnVjdCk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworICB9Cit9CisKKy8qKgorICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEphdmEgc3RydWN0IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuamF2YSI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CisgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKworICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBqYXZhX3R5cGVfaW1wb3J0cygpIDw8IGphdmFfdGhyaWZ0X2ltcG9ydHMoKTsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICBmX3N0cnVjdC5jbG9zZSgpOworfQorCisvKioKKyAqIEphdmEgdW5pb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuamF2YSI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CisgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKworICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBqYXZhX3R5cGVfaW1wb3J0cygpIDw8IGphdmFfdGhyaWZ0X2ltcG9ydHMoKTsKKworICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOworCisgIGluZGVudChmX3N0cnVjdCkgPDwgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJmaW5hbCAiIDogIiIpIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiIGV4dGVuZHMgVFVuaW9uICI7CisKKyAgc2NvcGVfdXAoZl9zdHJ1Y3QpOworCisgIGdlbmVyYXRlX3N0cnVjdF9kZXNjKGZfc3RydWN0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZmllbGRfZGVzY3MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3IoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24oZl9zdHJ1Y3QpOworCisgIGZfc3RydWN0LmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIihfRmllbGRzIHNldEZpZWxkLCBPYmplY3QgdmFsdWUpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKHNldEZpZWxkLCB2YWx1ZSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcihvdGhlcik7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIGRlZXBDb3B5KCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIih0aGlzKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgImNvbnN0cnVjdG9ycyIgZm9yIGVhY2ggZmllbGQKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiB2YWx1ZSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIHggPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB4LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIih2YWx1ZSk7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiB4OyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorCisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIGdldCIKKyAgICAgICAgICAgICAgICA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIoKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIGlmIChnZXRTZXRGaWVsZCgpID09IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gKCIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiKWdldEZpZWxkVmFsdWUoKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFwiQ2Fubm90IGdldCBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICInIGJlY2F1c2UgdW5pb24gaXMgY3VycmVudGx5IHNldCB0byBcIiArIGdldEZpZWxkRGVzYyhnZXRTZXRGaWVsZCgpKS5uYW1lKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiB2YWx1ZSkgeyIgPDwgZW5kbDsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGlmICh2YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICIgIHNldEZpZWxkXyA9IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB2YWx1ZV8gPSB2YWx1ZTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9jaGVja190eXBlKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9yZWFkX3ZhbHVlKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV93cml0ZV92YWx1ZShvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NoZWNrX3R5cGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KQorICAgICAgPDwgInByb3RlY3RlZCB2b2lkIGNoZWNrVHlwZShfRmllbGRzIHNldEZpZWxkLCBPYmplY3QgdmFsdWUpIHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24geyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlLCB0cnVlKQorICAgICAgICAgICAgICAgIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgICBicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKFwiV2FzIGV4cGVjdGluZyB2YWx1ZSBvZiB0eXBlICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiIGZvciBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICInLCBidXQgZ290IFwiICsgdmFsdWUuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOyIgPDwgZW5kbDsKKyAgICAvLyBkbyB0aGUgcmVhbCBjaGVjayBoZXJlCisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJVbmtub3duIGZpZWxkIGlkIFwiICsgc2V0RmllbGQpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlYWRfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIE9iamVjdCByZWFkVmFsdWUoVFByb3RvY29sIGlwcm90LCBURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIl9GaWVsZHMgc2V0RmllbGQgPSBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkLmlkKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpZiAoc2V0RmllbGQgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09ICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9ERVNDLnR5cGUpIHsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGZpZWxkLCAiIik7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwic2V0RmllbGQgd2Fzbid0IG51bGwsIGJ1dCBkaWRuJ3QgbWF0Y2ggYW55ICIKKyAgICAgICAgICAgICAgICAgIm9mIHRoZSBjYXNlIHN0YXRlbWVudHMhXCIpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbnVsbDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfd3JpdGVfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIHZvaWQgd3JpdGVWYWx1ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGRfKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSAoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIpdmFsdWVfOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJDYW5ub3Qgd3JpdGUgdW5pb24gd2l0aCB1bmtub3duIGZpZWxkIFwiICsgIgorICAgICAgICAgICAgICAgICAic2V0RmllbGRfKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBURmllbGQgZ2V0RmllbGREZXNjKF9GaWVsZHMgc2V0RmllbGQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQzsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJVbmtub3duIGZpZWxkIGlkIFwiICsgc2V0RmllbGQpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgVFN0cnVjdCBnZXRTdHJ1Y3REZXNjKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIFNUUlVDVF9ERVNDOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIC8vIGVxdWFsaXR5CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBpZiAob3RoZXIgaW5zdGFuY2VvZiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gZXF1YWxzKCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIilvdGhlcik7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gb3RoZXIgIT0gbnVsbCAmJiBnZXRTZXRGaWVsZCgpID09IG90aGVyLmdldFNldEZpZWxkKCkgJiYgIgorICAgICAgICAgICAgICAgICAiZ2V0RmllbGRWYWx1ZSgpLmVxdWFscyhvdGhlci5nZXRGaWVsZFZhbHVlKCkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbygiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBpbnQgbGFzdENvbXBhcmlzb24gPSBUQmFzZUhlbHBlci5jb21wYXJlVG8oZ2V0U2V0RmllbGQoKSwgb3RoZXIuZ2V0U2V0RmllbGQoKSk7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBpZiAobGFzdENvbXBhcmlzb24gPT0gMCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gVEJhc2VIZWxwZXIuY29tcGFyZVRvKGdldEZpZWxkVmFsdWUoKSwgb3RoZXIuZ2V0RmllbGRWYWx1ZSgpKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkKKyAgICAgIDw8ICIgKiBJZiB5b3UnZCBsaWtlIHRoaXMgdG8gcGVyZm9ybSBtb3JlIHJlc3BlY3RhYmx5LCB1c2UgdGhlIGhhc2hjb2RlIGdlbmVyYXRvciBvcHRpb24uIgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgaGFzaENvZGUoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gMDsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCisvKioKKyAqIEphdmEgc3RydWN0IGRlZmluaXRpb24uIFRoaXMgaGFzIHZhcmlvdXMgcGFyYW1ldGVycywgYXMgaXQgY291bGQgYmUKKyAqIGdlbmVyYXRlZCBzdGFuZGFsb25lIG9yIGluc2lkZSBhbm90aGVyIGNsYXNzIGFzIGEgaGVscGVyLiBJZiBpdAorICogaXMgYSBoZWxwZXIgdGhhbiBpdCBpcyBhIHN0YXRpYyBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KKyAqIEBwYXJhbSBpbl9jbGFzcyAgICAgSWYgaW5zaWRlIGEgY2xhc3MsIG5lZWRzIHRvIGJlIHN0YXRpYyBjbGFzcworICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgdHN0cnVjdCk7CisKKyAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PCAoaW5fY2xhc3MgPyAic3RhdGljICIgOiAiIikgPDwgImNsYXNzICIKKyAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICI7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiZXh0ZW5kcyBFeGNlcHRpb24gIjsKKyAgfQorICBvdXQgPDwgImltcGxlbWVudHMgVEJhc2UgIjsKKworICBzY29wZV91cChvdXQpOworCisgIGdlbmVyYXRlX3N0cnVjdF9kZXNjKG91dCwgdHN0cnVjdCk7CisKKyAgLy8gTWVtYmVycyBhcmUgcHVibGljIGZvciAtamF2YSwgcHJpdmF0ZSBmb3IgLWphdmFiZWFuCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZmllbGRfZGVzY3Mob3V0LCB0c3RydWN0KTsKKworICBvdXQgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgIjsKKyAgICBvdXQgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSkgPDwgZW5kbDsKKyAgfQorCisgIC8vIGlzc2V0IGRhdGEKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgIi8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzIiA8PCBlbmRsOworCisgICAgaW50IGkgPSAwOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCgoKm1faXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgIiA8PCBpc3NldF9maWVsZF9pZCgqbV9pdGVyKSA8PCAiID0gIiA8PCBpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBpKys7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGkgPiAwKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBib29sZWFuW10gX19pc3NldF92ZWN0b3IgPSBuZXcgYm9vbGVhblsiIDw8IGkgPDwgIl07IiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworICB9CisKKyAgYm9vbCBhbGxfb3B0aW9uYWxfbWVtYmVycyA9IHRydWU7CisKKyAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMuIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgIH0KKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgYWxsX29wdGlvbmFsX21lbWJlcnMgPSBmYWxzZTsKKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoIW1lbWJlcnMuZW1wdHkoKSAmJiAhYWxsX29wdGlvbmFsX21lbWJlcnMpIHsKKyAgICAvLyBGdWxsIGNvbnN0cnVjdG9yIGZvciBhbGwgZmllbGRzCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcygpOyIgPDwgZW5kbDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICgqbV9pdGVyKSk7CisgICAgICB9CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIGNvcHkgY29uc3RydWN0b3IKKyAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqIFBlcmZvcm1zIGEgZGVlcCBjb3B5IG9uIDxpPm90aGVyPC9pPi4iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgb3RoZXIpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChoYXNfYml0X3ZlY3Rvcih0c3RydWN0KSkgeworICAgIGluZGVudChvdXQpIDw8ICJTeXN0ZW0uYXJyYXljb3B5KG90aGVyLl9faXNzZXRfdmVjdG9yLCAwLCBfX2lzc2V0X3ZlY3RvciwgMCwgIgorICAgICAgICAgICAgICAgICAgICJvdGhlci5fX2lzc2V0X3ZlY3Rvci5sZW5ndGgpOyIgPDwgZW5kbDsKKyAgfQorCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwodHlwZSk7CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAob3RoZXIuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsICJvdGhlciIsIGZpZWxkX25hbWUsICJfX3RoaXNfXyIgKyBmaWVsZF9uYW1lLCB0eXBlKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gX190aGlzX18iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gIjsKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgIm90aGVyLiIgKyBmaWVsZF9uYW1lLCBmaWVsZF9uYW1lLCB0eXBlKTsKKyAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGNsb25lIG1ldGhvZCwgc28gdGhhdCB5b3UgY2FuIGRlZXAgY29weSBhbiBvYmplY3Qgd2hlbiB5b3UgZG9uJ3Qga25vdyBpdHMgY2xhc3MuCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgZGVlcENvcHkoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKHRoaXMpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8ob3V0LCB0c3RydWN0KTsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaWYgKGlzX3Jlc3VsdCkgeworICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfQorICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBlcXVhbHMgbWV0aG9kcyBhbmQgYSBoYXNoQ29kZSBtZXRob2QgZm9yIGEgc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZXF1YWxpdHkob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGF0IGluc3RhbmNlb2YgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICByZXR1cm4gdGhpcy5lcXVhbHMoKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKXRoYXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgInJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgdGhhdCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzID09IHRoYXQpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlOyIgIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIG91dCA8PCBlbmRsOworCisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIC8vIE1vc3QgZXhpc3RpbmcgVGhyaWZ0IGNvZGUgZG9lcyBub3QgdXNlIGlzc2V0IG9yIG9wdGlvbmFsL3JlcXVpcmVkLAorICAgIC8vIHNvIHdlIHRyZWF0ICJkZWZhdWx0IiBmaWVsZHMgYXMgcmVxdWlyZWQuCisgICAgYm9vbCBpc19vcHRpb25hbCA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwodCk7CisgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisKKyAgICBzdHJpbmcgdGhpc19wcmVzZW50ID0gInRydWUiOworICAgIHN0cmluZyB0aGF0X3ByZXNlbnQgPSAidHJ1ZSI7CisgICAgc3RyaW5nIHVuZXF1YWw7CisKKyAgICBpZiAoaXNfb3B0aW9uYWwgfHwgY2FuX2JlX251bGwpIHsKKyAgICAgIHRoaXNfcHJlc2VudCArPSAiICYmIHRoaXMuIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpOworICAgICAgdGhhdF9wcmVzZW50ICs9ICIgJiYgdGhhdC4iICsgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKm1faXRlcik7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sZWFuIHRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiA9ICIgPDwgdGhpc19wcmVzZW50IDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJib29sZWFuIHRoYXRfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiA9ICIgPDwgdGhhdF9wcmVzZW50IDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoIgorICAgICAgICA8PCAidGhpc19wcmVzZW50XyIgPDwgbmFtZSA8PCAiIHx8IHRoYXRfcHJlc2VudF8iIDw8IG5hbWUgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghKCIKKyAgICAgICAgPDwgInRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiAmJiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworCisgICAgaWYgKHQtPmlzX2JpbmFyeSgpKSB7CisgICAgICB1bmVxdWFsID0gIlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLiIgKyBuYW1lICsgIiwgdGhhdC4iICsgbmFtZSArICIpICE9IDAiOworICAgIH0gZWxzZSBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIHVuZXF1YWwgPSAiIXRoaXMuIiArIG5hbWUgKyAiLmVxdWFscyh0aGF0LiIgKyBuYW1lICsgIikiOworICAgIH0gZWxzZSB7CisgICAgICB1bmVxdWFsID0gInRoaXMuIiArIG5hbWUgKyAiICE9IHRoYXQuIiArIG5hbWU7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCB1bmVxdWFsIDw8ICIpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gMDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvdGhlck9iamVjdCkgeyIgPDwgZW5kbDsKKyAgLy8gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbygiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlck9iamVjdC5nZXRDbGFzcygpKSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvdGhlck9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyID0gKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIpb3RoZXJPYmplY3Q7IjsKKworICBpbmRlbnQob3V0KSA8PCAiaW50IGxhc3RDb21wYXJpc29uID0gMDsiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICptX2l0ZXI7CisgICAgaW5kZW50KG91dCkgPDwgImxhc3RDb21wYXJpc29uID0gVEJhc2VIZWxwZXIuY29tcGFyZVRvKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpCisgICAgICAgICAgICAgICAgPDwgIiwgb3RoZXIuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIik7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfc3RydWN0KCkgfHwgZmllbGQtPmdldF90eXBlKCktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGxhc3RDb21wYXJpc29uID0gdGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIuY29tcGFyZVRvKG90aGVyLiIKKyAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIiAgbGFzdENvbXBhcmlzb24gPSBUQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiLCBvdGhlci4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gMDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzIGFuZCByZWFkIHN0cnVjdCBoZWFkZXIKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJURmllbGQgZmllbGQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsgIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQuaWQpIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiAvLyAiCisgICAgICAgICAgICAgICAgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgKmZfaXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvLyBnZW5lcmF0ZXMgamF2YSBtZXRob2QgdG8gcGVyZm9ybSB2YXJpb3VzIGNoZWNrcworLy8gKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihcIlJlcXVpcmVkIGZpZWxkICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgIDw8ICInIGlzIHVuc2V0ISBTdHJ1Y3Q6XCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICBib29sIG9wdGlvbmFsID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygoKmZfaXRlcikpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIKKyAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwKKyAqIHdoaWNoIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbgorICogaWYgdGhleSBhcmUgc2V0IGluIHRoZSBJc3NldCBhcnJheSwgYW5kIG9ubHkgb25lIG9mIHRoZW0KKyAqIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIgZWxzZSBpZiAiOworICAgIH0KKworICAgIG91dCA8PCAiKHRoaXMuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgfQorICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjYXBfbmFtZSkgeworICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHlwZS0+aXNfc3RyaW5nKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogYmFzZV90eXBlID0gKHRfYmFzZV90eXBlKil0eXBlOworCisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIoIgorICAgICAgICAgICAgICAgIDw8IChiYXNlX3R5cGUtPmlzX2Jvb2woKSA/ICJpcyIgOiAiZ2V0IikgPDwgY2FwX25hbWUgPDwgIigpKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGdldCIgPDwgY2FwX25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjYXBfbmFtZSkgeworICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiaWYgKHZhbHVlID09IG51bGwpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHVuc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoKCIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiKXZhbHVlKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CisgICh2b2lkKW91dDsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGdldHRlcl9zdHJlYW07CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzZXR0ZXJfc3RyZWFtOworCisgIC8vIGJ1aWxkIHVwIHRoZSBib2RpZXMgb2YgYm90aCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXQgb25jZQorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKKworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7CisgICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKGdldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2V0IG9mIEphdmEgQmVhbiBib2lsZXJwbGF0ZSBmdW5jdGlvbnMgKHNldHRlcnMsIGdldHRlcnMsIGV0Yy4pCisgKiBmb3IgdGhlIGdpdmVuIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOworCisgICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAvLyBNZXRob2QgdG8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjb2xsZWN0aW9uCisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBnZXQiIDw8IGNhcF9uYW1lOworICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgic2l6ZSgpIHsiKSA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyAwIDogIgorICAgICAgICAgICAgICAgICAgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuc2l6ZSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIGlmICh0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19saXN0KCkpIHsKKworICAgICAgdF90eXBlKiBlbGVtZW50X3R5cGU7CisgICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgZWxlbWVudF90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVsZW1lbnRfdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgfQorCisgICAgICAvLyBJdGVyYXRvciBnZXR0ZXIgZm9yIHNldHMgYW5kIGxpc3RzCisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIEVudW1lcmF0aW9uIGdldCIgPDwgY2FwX25hbWU7CisgICAgICBvdXQgPDwgZ2V0X2NhcF9uYW1lKCJFbnVtZXJhdGlvbigpIHsiKSA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyBudWxsIDogIgorICAgICAgICAgICAgICAgICAgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuZWxlbWVudHMoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgLy8gQWRkIHRvIHNldCBvciBsaXN0LCBjcmVhdGUgaWYgdGhlIHNldC9saXN0IGlzIG51bGwKKyAgICAgIGluZGVudChvdXQpOworICAgICAgb3V0IDw8ICJwdWJsaWMgdm9pZCBhZGQiIDw8IGdldF9jYXBfbmFtZSgidG8iKTsKKyAgICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSkgPDwgIiBlbGVtKSB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIucHV0KCIgPDwgYm94X3R5cGUoZWxlbWVudF90eXBlLCAiZWxlbSIpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgPDwgYm94X3R5cGUoZWxlbWVudF90eXBlLCAiZWxlbSIpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLmFkZEVsZW1lbnQoIiA8PCBib3hfdHlwZShlbGVtZW50X3R5cGUsICJlbGVtIikKKyAgICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgICAvLyBQdXQgdG8gbWFwCisgICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKworICAgICAgaW5kZW50KG91dCk7CisgICAgICBvdXQgPDwgInB1YmxpYyB2b2lkIHB1dFRvIiA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKGtleV90eXBlLCB0cnVlKSA8PCAiIGtleSwgIgorICAgICAgICAgIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSkgPDwgIiB2YWwpIHsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnB1dChrZXksIHZhbCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gU2ltcGxlIGdldHRlcgorICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX0JPT0wpIHsKKyAgICAgIG91dCA8PCAiIGlzIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIgZ2V0IjsKKyAgICB9CisgICAgb3V0IDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gU2ltcGxlIHNldHRlcgorICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIjsKKyAgICBvdXQgPDwgInZvaWQiOworICAgIG91dCA8PCAiIHNldCIgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgZmllbGRfbmFtZSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsIGZpZWxkKTsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFVuc2V0dGVyCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfdmVjdG9yWyIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICJdID0gZmFsc2U7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBpc1NldCBtZXRob2QKKyAgICBpbmRlbnQob3V0KSA8PCAiLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCAiIDw8IGZpZWxkX25hbWUKKyAgICAgICAgICAgICAgICA8PCAiIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gaXMiIDw8IGdldF9jYXBfbmFtZSgic2V0IikgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBfX2lzc2V0X3ZlY3RvclsiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiXTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGNhcF9uYW1lIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKGJvb2xlYW4gdmFsdWUpIHsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICghdmFsdWUpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfdmVjdG9yWyIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICJdID0gdmFsdWU7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0b1N0cmluZygpIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIlN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIik7IgorICAgICAgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sZWFuIGZpcnN0ID0gdHJ1ZTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgY291bGRfYmVfdW5zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKworICAgIGlmICghZmlyc3QpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIWZpcnN0KSBzYi5hcHBlbmQoXCIsIFwiKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJzYi5hcHBlbmQoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiKTsiIDw8IGVuZGw7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHNiLmFwcGVuZChcIm51bGxcIik7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19iaW5hcnkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIlRCYXNlSGVscGVyLnRvU3RyaW5nKHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLCBzYik7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAic2IuYXBwZW5kKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiZmlyc3QgPSBmYWxzZTsiIDw8IGVuZGw7CisKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgfQorICBvdXQgPDwgaW5kZW50KCkgPDwgInNiLmFwcGVuZChcIilcIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2IudG9TdHJpbmcoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRocmlmdCB0eXBlCisgKiAoZS5nLiBmb3IgdGhlIHR5cGUgc3RydWN0IGl0IHJldHVybnMgIlRUeXBlLlNUUlVDVCIpCisgKi8KK3N0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKSB7CisgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxJU1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5FTlVNIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gZ2V0X2phdmFfdHlwZV9zdHJpbmcoKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIlRUeXBlLlZPSUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2phdmFtZV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISIpOworICAgICAgYnJlYWs7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKAorICAgICAgICAiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2phdmFtZV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISIpOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCisgIH0KK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKSB7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50X3VwKCk7CisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm5ldyBTdHJ1Y3RNZXRhRGF0YShUVHlwZS5TVFJVQ1QsICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIuY2xhc3MiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBMaXN0TWV0YURhdGEoVFR5cGUuTElTVCwgIjsKKyAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgU2V0TWV0YURhdGEoVFR5cGUuU0VULCAiOworICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7CisgICAgfSBlbHNlIHsgLy8gbWFwCisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IE1hcE1ldGFEYXRhKFRUeXBlLk1BUCwgIjsKKyAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwga2V5X3R5cGUpOworICAgICAgb3V0IDw8ICIsICI7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCB2YWxfdHlwZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJuZXcgRW51bU1ldGFEYXRhKFRUeXBlLkVOVU0sICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIuY2xhc3MiOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJuZXcgRmllbGRWYWx1ZU1ldGFEYXRhKCIgPDwgZ2V0X2phdmFfdHlwZV9zdHJpbmcodHlwZSk7CisgICAgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiwgXCIiIDw8ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3N5bWJvbGljKCkgPDwgIlwiIjsKKyAgICB9CisgIH0KKyAgb3V0IDw8ICIpIjsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gSW4gQysrLCB0aGlzIGNvbXByaXNlcyBhbiBlbnRpcmVseSBzZXBhcmF0ZQorICogaGVhZGVyIGFuZCBzb3VyY2UgZmlsZS4gVGhlIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIG1ldGhvZHMgYW5kIGluY2x1ZGVzCisgKiB0aGUgZGF0YSB0eXBlcyBkZWZpbmVkIGluIHRoZSBtYWluIGhlYWRlciBmaWxlLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uCisgKiBmaWxlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYmFzaWMgcHJpbnRlciBhbmQgZGVmYXVsdCBpbnRlcmZhY2VzLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIi5qYXZhIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV90eXBlX2ltcG9ydHMoKSA8PCBqYXZhX3RocmlmdF9pbXBvcnRzKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOworICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3ByaW1pdGl2ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnRlcmZhY2UgSWZhY2UgZXh0ZW5kcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmYWNlIHsgfSIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisKKyAgc3RyaW5nIGZfaW50ZXJmYWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIklmYWNlLmphdmEiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaWZhY2U7CisgIGZfaWZhY2Uub3BlbihmX2ludGVyZmFjZV9uYW1lLmNfc3RyKCkpOworCisgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSArICJJZmFjZSI7CisgIH0KKworICBmX2lmYWNlIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfdHlwZV9pbXBvcnRzKCkgPDwgamF2YV90aHJpZnRfaW1wb3J0cygpOworICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2lmYWNlLCB0c2VydmljZSk7CisgIGZfaWZhY2UgPDwgInB1YmxpYyBpbnRlcmZhY2UgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZmFjZSIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBlbmRsOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2lmYWNlLCAqZl9pdGVyKTsKKyAgICBmX2lmYWNlIDw8ICIgIHB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisgIGZfaWZhY2UgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiLklmYWNlIjsKKyAgfQorCisgIGdlbmVyYXRlX2phdmFfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSBJZmFjZSIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgYXJncyBhbmQgcmV0dXJuIHR5cGVzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UsIHRydWUpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfY2xpZW50ID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIi5DbGllbnQiOworICB9CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIENsaWVudCIgPDwgZXh0ZW5kc19jbGllbnQKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyBUU2VydmljZUNsaWVudCwgSWZhY2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBwcm90KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcyhwcm90LCBwcm90KTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90XyA9IGlwcm90OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3RfID0gb3Byb3Q7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN1cGVyKGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworICB9CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBpcHJvdF87IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBvcHJvdF87IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJwcm90ZWN0ZWQgaW50IHNlcWlkXzsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIFRQcm90b2NvbCBnZXRJbnB1dFByb3RvY29sKCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gdGhpcy5pcHJvdF87IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgVFByb3RvY29sIGdldE91dHB1dFByb3RvY29sKCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gdGhpcy5vcHJvdF87IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKKworICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisKKyAgICAvLyBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7CisKKyAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PTkVXQVkiIDogIlRNZXNzYWdlVHlwZS5DQUxMIikKKyAgICAgICAgICAgICAgIDw8ICIsICsrc2VxaWRfKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lCisgICAgICAgICAgICAgICA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Muc2V0IiA8PCBnZXRfY2FwX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICIoIgorICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShvcHJvdF8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKKyAgICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOworICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90Xy5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGlwcm90Xy5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyB4OyIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKG1zZy5zZXFpZCAhPSBzZXFpZF8pIHsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uQkFEX1NFUVVFTkNFX0lELCBcIiIKKyAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiBvdXQgb2Ygc2VxdWVuY2UgcmVzcG9uc2VcIik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIgorICAgICAgICAgICAgICAgICA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICJ0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgXCIiCisgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIC8vIEV4dGVuZHMgc3R1ZmYKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiLlByb2Nlc3NvciI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIFByb2Nlc3NvciIgPDwgZXh0ZW5kc19wcm9jZXNzb3IKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyBUUHJvY2Vzc29yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIFByb2Nlc3NvcihJZmFjZSBpZmFjZSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN1cGVyKGlmYWNlKTsiIDw8IGVuZGw7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWZhY2VfID0gaWZhY2U7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvY2Vzc01hcF8ucHV0KFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCBuZXcgIgorICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoKSk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgc3RhdGljIGludGVyZmFjZSBQcm9jZXNzRnVuY3Rpb24geyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICBwdWJsaWMgdm9pZCBwcm9jZXNzKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSBJZmFjZSBpZmFjZV87IiA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgZmluYWwgSGFzaHRhYmxlIHByb2Nlc3NNYXBfID0gbmV3IEhhc2h0YWJsZSgpOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGJvb2xlYW4gcHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24iCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZSwgd2FzIHRoZSBzZXFpZCBldGMuIGxlZ2l0PworCisgIGZfc2VydmljZV8KKyAgICAgIDw8IGluZGVudCgpIDw8ICJQcm9jZXNzRnVuY3Rpb24gZm4gPSAoUHJvY2Vzc0Z1bmN0aW9uKXByb2Nlc3NNYXBfLmdldChtc2cubmFtZSk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuID09IG51bGwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgVFR5cGUuU1RSVUNUKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyAiCisgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAiCisgICAgICAgICAiJ1wiK21zZy5uYW1lK1wiJ1wiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmV0dXJuIHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiZm4ucHJvY2Vzcyhtc2cuc2VxaWQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICAvLyBPcGVuIGNsYXNzCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBjbGFzcyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiIGltcGxlbWVudHMgUHJvY2Vzc0Z1bmN0aW9uIHsiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKQorICAgICAgPDwgInB1YmxpYyB2b2lkIHByb2Nlc3MoaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24iCisgICAgICA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAidHJ5IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uIGUpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyAiCisgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uUFJPVE9DT0xfRVJST1IsIGUuZ2V0TWVzc2FnZSgpKTsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIgorICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICB9CisKKyAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucworICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAiOworICB9CisgIGZfc2VydmljZV8gPDwgImlmYWNlXy4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkKKyAgICAgICYmICF0eXBlX2Nhbl9iZV9udWxsKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuc2V0IiA8PCBnZXRfY2FwX25hbWUoInN1Y2Nlc3MiKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKKyAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIiAiCisgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7CisgICAgICB9CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoVGhyb3dhYmxlIHRoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IgorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIgorICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICAgIC8vIENsb3NlIGNsYXNzCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgY2xhc3MKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCisgKiBAcGFyYW0gcHJlZml4IFRoZSB2YXJpYWJsZSBuYW1lIG9yIGNvbnRhaW5lciBmb3IgdGhpcyBmaWVsZAorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaXByb3QuIjsKKworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAoIXR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoKTsiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIG91dCA8PCAicmVhZEkxNigpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCAicmVhZEk2NCgpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpOyI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKYXZhIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSArICIuZmluZEJ5VmFsdWUoaXByb3QucmVhZEkzMigpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBpbnZva2VzIHJlYWQoKQorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBzdHJpbmcgb2JqOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvYmogPSB0bXAoIl9tYXAiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9zZXQiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb2JqID0gdG1wKCJfbGlzdCIpOworICB9CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVE1hcCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJUU2V0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJUTGlzdCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgLy8gc2l6ZSB0aGUgY29sbGVjdGlvbiBjb3JyZWN0bHkKKyAgICAgICAgICAgICAgPDwgIigiIDw8ICh0dHlwZS0+aXNfbGlzdCgpID8gIiIgOiAiMioiKSA8PCBvYmogPDwgIi5zaXplIgorICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwgImZvciAoaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLnNpemUiCisgICAgICAgICAgICAgIDw8ICI7ICIKKyAgICAgICAgICAgICAgPDwgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnB1dCgiIDw8IGJveF90eXBlKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpIDw8ICIsICIKKyAgICAgICAgICAgICAgPDwgYm94X3R5cGUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCkgPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50CisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXQoIiA8PCBib3hfdHlwZSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pIDw8ICIsICIKKyAgICAgICAgICAgICAgPDwgYm94X3R5cGUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50CisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5hZGRFbGVtZW50KCIgPDwgYm94X3R5cGUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSkgPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlSTMyKCIgPDwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIuZ2V0VmFsdWUoKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKKyAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgVE1hcCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4CisgICAgICAgICAgICAgICAgPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0QmVnaW4obmV3IFRTZXQoIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgVExpc3QoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBlbnVtZXIgPSBpdGVyICsgIl9lbnVtIjsKKyAgICBzdHJpbmcga2V5X3R5cGUgPSB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKEVudW1lcmF0aW9uICIgPDwgZW51bWVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiLmtleXMoKTsgIiA8PCBlbnVtZXIKKyAgICAgICAgICAgICAgICA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApICI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCBrZXlfdHlwZSA8PCAiICIgPDwgaXRlciA8PCAiID0gKCIgPDwga2V5X3R5cGUgPDwgIikiIDw8IGVudW1lcgorICAgICAgICAgICAgICAgIDw8ICIubmV4dEVsZW1lbnQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgc3RyaW5nIGVudW1lciA9IGl0ZXIgKyAiX2VudW0iOworICAgIHN0cmluZyBlbGVfdHlwZSA9IHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHRydWUpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKEVudW1lcmF0aW9uICIgPDwgZW51bWVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiLmtleXMoKTsgIiA8PCBlbnVtZXIKKyAgICAgICAgICAgICAgICA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApICI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCBlbGVfdHlwZSA8PCAiICIgPDwgaXRlciA8PCAiID0gKCIgPDwgZWxlX3R5cGUgPDwgIikiIDw8IGVudW1lcgorICAgICAgICAgICAgICAgIDw8ICIubmV4dEVsZW1lbnQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBlbnVtZXIgPSBpdGVyICsgIl9lbnVtIjsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIi5lbGVtZW50cygpOyAiIDw8IGVudW1lcgorICAgICAgICAgICAgICAgIDw8ICIuaGFzTW9yZUVsZW1lbnRzKCk7ICkgIjsKKyAgICBzY29wZV91cChvdXQpOworICAgIHN0cmluZyBlbGVfdHlwZSA9IHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHRydWUpOworICAgIGluZGVudChvdXQpIDw8IGVsZV90eXBlIDw8ICIgIiA8PCBpdGVyIDw8ICIgPSAoIiA8PCBlbGVfdHlwZSA8PCAiKSIgPDwgZW51bWVyCisgICAgICAgICAgICAgICAgPDwgIi5uZXh0RWxlbWVudCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICB9CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOworICBzdHJpbmcgdmFsX3R5cGUgPSB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHRydWUsIGZhbHNlKTsKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksICIoKCIgKyB2YWxfdHlwZSArICIpIiArIG1hcCArICIuZ2V0KCIgKyBpdGVyICsgIikpIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogUmV0dXJucyBhIEphdmEgdHlwZSBuYW1lCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcGFyYW0gY29udGFpbmVyIElzIHRoZSB0eXBlIGdvaW5nIGluc2lkZSBhIGNvbnRhaW5lcj8KKyAqIEByZXR1cm4gSmF2YSB0eXBlIG5hbWUsIGkuZS4gVmVjdG9yCisgKi8KK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5faW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNraXBfZ2VuZXJpYykgeworICAodm9pZClpbl9pbml0OworICAodm9pZClza2lwX2dlbmVyaWM7CisgIC8vIEluIEphdmEgdHlwZWRlZnMgYXJlIGp1c3QgcmVzb2x2ZWQgdG8gdGhlaXIgcmVhbCB0eXBlCisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIHN0cmluZyBwcmVmaXg7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlLCBpbl9jb250YWluZXIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiSGFzaHRhYmxlIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIkhhc2h0YWJsZSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVmVjdG9yIjsKKyAgfQorCisgIC8vIENoZWNrIGZvciBuYW1lc3BhY2luZworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJqYXZhIik7CisgICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBwYWNrYWdlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIEMrKyB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgorICoKKyAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCisgKiBAcGFyYW0gY29udGFpbmVyIElzIGl0IGdvaW5nIGluIGEgSmF2YSBjb250YWluZXI/CisgKi8KK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlLCBib29sIGluX2NvbnRhaW5lcikgeworICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKKworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gInZvaWQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICBpZiAoIXR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICByZXR1cm4gIlN0cmluZyI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiYnl0ZVtdIjsKKyAgICB9CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJCb29sZWFuIiA6ICJib29sZWFuIik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiQnl0ZSIgOiAiYnl0ZSIpOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJTaG9ydCIgOiAic2hvcnQiKTsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiSW50ZWdlciIgOiAiaW50Iik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkxvbmciIDogImxvbmciKTsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiRG91YmxlIiA6ICJkb3VibGUiKTsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICB9Cit9CisKKy8qKgorICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0KSB7CisgIC8vIFRPRE8obWNzbGVlKTogZG8gd2UgZXZlciBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkPworICBzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgc3RkOjpvZnN0cmVhbSBkdW1teTsKKyAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICAgIDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdCArICI7IjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIgorICAgICAgICAgICAgICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIHRocm93cyAiOworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIiwgIjsKKyAgfQorICByZXN1bHQgKz0gIlRFeGNlcHRpb24iOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCisgKi8KK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV90eXBlcykgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICBpZiAoaW5jbHVkZV90eXBlcykgeworICAgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiOworICAgIH0KKyAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgorICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogQXBwbGllcyB0aGUgY29ycmVjdCBzdHlsZSB0byBhIHN0cmluZyBiYXNlZCBvbiB0aGUgdmFsdWUgb2Ygbm9jYW1lbF9zdHlsZV8KKyAqLworc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKKyAgcmV0dXJuIG5hbWU7Cit9CisKK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmNvbnN0YW50X25hbWUoc3RyaW5nIG5hbWUpIHsKKyAgc3RyaW5nIGNvbnN0YW50X25hbWU7CisKKyAgYm9vbCBpc19maXJzdCA9IHRydWU7CisgIGJvb2wgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBmYWxzZTsKKyAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIGl0ZXIgPSBuYW1lLmJlZ2luKCk7IGl0ZXIgIT0gbmFtZS5lbmQoKTsgKytpdGVyKSB7CisgICAgc3RyaW5nOjp2YWx1ZV90eXBlIGNoYXJhY3RlciA9ICgqaXRlcik7CisKKyAgICBib29sIGlzX3VwcGVyID0gaXN1cHBlcihjaGFyYWN0ZXIpOworCisgICAgaWYgKGlzX3VwcGVyICYmICFpc19maXJzdCAmJiAhd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIpIHsKKyAgICAgIGNvbnN0YW50X25hbWUgKz0gJ18nOworICAgIH0KKyAgICBjb25zdGFudF9uYW1lICs9IHRvdXBwZXIoY2hhcmFjdGVyKTsKKworICAgIGlzX2ZpcnN0ID0gZmFsc2U7CisgICAgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBpc191cHBlcjsKKyAgfQorCisgIHJldHVybiBjb25zdGFudF9uYW1lOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cykgeworICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBjb250ZW50cywgIiAqL1xuIik7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvYyhvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CisgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgc3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSBmaWVsZC0+Z2V0X2RvYygpICsgIlxuQHNlZSAiICsgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvdXQsIGNvbWJpbmVkX21lc3NhZ2UpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKHRfZG9jKilmaWVsZCk7CisgIH0KK30KKworLyoqCisgKiBFbWl0cyBhIEphdmFEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCB0ZG9jLT5nZXRfZG9jKCkpOworICB9Cit9CisKKy8qKgorICogRW1pdHMgYSBKYXZhRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKKyAgICBzdHJpbmdzdHJlYW0gc3M7CisgICAgc3MgPDwgdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgeworICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICBzcyA8PCAiXG5AcGFyYW0gIiA8PCBwLT5nZXRfbmFtZSgpOworICAgICAgaWYgKHAtPmhhc19kb2MoKSkgeworICAgICAgICBzcyA8PCAiICIgPDwgcC0+Z2V0X2RvYygpOworICAgICAgfQorICAgIH0KKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBzcy5zdHIoKSwgIiAqL1xuIik7CisgIH0KK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKSB7CisKKyAgdF9jb250YWluZXIqIGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopdHlwZTsKKyAgc3RkOjpzdHJpbmcgc291cmNlX25hbWU7CisgIGlmIChzb3VyY2VfbmFtZV9wMiA9PSAiIikKKyAgICBzb3VyY2VfbmFtZSA9IHNvdXJjZV9uYW1lX3AxOworICBlbHNlCisgICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICIuIiArIHNvdXJjZV9uYW1lX3AyOworCisgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9uYW1lIDw8ICIgPSBuZXcgIgorICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoY29udGFpbmVyLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKworICBzdGQ6OnN0cmluZyBpdGVyYXRvcl9lbGVtZW50X25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICJfZWxlbWVudCI7CisgIHN0ZDo6c3RyaW5nIGVudW1lcmF0aW9uX25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICJfZW51bSI7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdF9lbGVtZW50X25hbWUgPSByZXN1bHRfbmFtZSArICJfY29weSI7CisKKyAgaWYgKGNvbnRhaW5lci0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopY29udGFpbmVyKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKWNvbnRhaW5lciktPmdldF92YWxfdHlwZSgpOworCisgICAgaW5kZW50KG91dCkgPDwgImZvciAoRW51bWVyYXRpb24gIiA8PCBlbnVtZXJhdGlvbl9uYW1lIDw8ICIgPSAiIDw8IHNvdXJjZV9uYW1lIDw8ICIua2V5cygpOyAiCisgICAgICAgICAgICAgICAgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIl9rZXkgPSAoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpIiA8PCBlbnVtZXJhdGlvbl9uYW1lIDw8ICIubmV4dEVsZW1lbnQoKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUgPSAoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmdldCgiCisgICAgICAgICAgICAgICAgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICJfa2V5KTsiIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGlmIChrZXlfdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX2tleSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl9rZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfa2V5ID0gIjsKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfa2V5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX2tleSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSk7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpZiAodmFsX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbF90eXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHZhbF90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl92YWx1ZSA9ICI7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbF90eXBlKTsKKyAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIucHV0KCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSwgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIl92YWx1ZSk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIHRfdHlwZSogZWxlbV90eXBlOworCisgICAgaWYgKGNvbnRhaW5lci0+aXNfc2V0KCkpIHsKKyAgICAgIGVsZW1fdHlwZSA9ICgodF9zZXQqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZWxlbV90eXBlID0gKCh0X2xpc3QqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lcmF0aW9uX25hbWUgPDwgIiA9ICIgPDwgc291cmNlX25hbWUKKyAgICAgICAgICAgICAgICA8PCAiLmVsZW1lbnRzKCk7ICIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGVsZW1fdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIiA9ICgiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGVsZW1fdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpIiA8PCBlbnVtZXJhdGlvbl9uYW1lIDw8ICIubmV4dEVsZW1lbnQoKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpZiAoZWxlbV90eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgLy8gcmVjdXJzaXZlIGRlZXAgY29weQorICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwgIiIsIHJlc3VsdF9lbGVtZW50X25hbWUsIGVsZW1fdHlwZSk7CisgICAgICBpZiAoZWxlbV90eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGRFbGVtZW50KCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLnB1dCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIiwgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lCisgICAgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gaXRlcmF0aXZlIGNvcHkKKyAgICAgIGlmIChlbGVtX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiIHRlbXBfYmluYXJ5X2VsZW1lbnQgPSAiOworICAgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlbXBfYmluYXJ5X2VsZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtX3R5cGUpOworICAgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGlmIChlbGVtX3R5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkRWxlbWVudCh0ZW1wX2JpbmFyeV9lbGVtZW50KTsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5wdXQodGVtcF9iaW5hcnlfZWxlbWVudCwgdGVtcF9iaW5hcnlfZWxlbWVudCk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLmFkZEVsZW1lbnQoIjsKKyAgICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUsIHJlc3VsdF9uYW1lLCBlbGVtX3R5cGUpOworICAgICAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpIHsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSB8fCB0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAvLyBiaW5hcnkgZmllbGRzIG5lZWQgdG8gYmUgY29waWVkIHdpdGggU3lzdGVtLmFycmF5Y29weQorICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgb3V0IDw8ICJuZXcgYnl0ZVsiIDw8IHNvdXJjZV9uYW1lIDw8ICIubGVuZ3RoXTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiU3lzdGVtLmFycmF5Y29weSgiIDw8IHNvdXJjZV9uYW1lIDw8ICIsIDAsICIgPDwgZGVzdF9uYW1lIDw8ICIsIDAsICIKKyAgICAgICAgICAgICAgICAgIDw8IHNvdXJjZV9uYW1lIDw8ICIubGVuZ3RoKSI7CisgICAgfQorICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZSBjYW4gYmUgY29waWVkIGRpcmVjdGx5CisgICAgZWxzZQorICAgICAgb3V0IDw8IHNvdXJjZV9uYW1lOworICB9IGVsc2UgeworICAgIG91dCA8PCAibmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIHRydWUpIDw8ICIoIiA8PCBzb3VyY2VfbmFtZSA8PCAiKSI7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgeworICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOworfQorCitzdGQ6OnN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6Omlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKSB7CisgIHJldHVybiAiX18iICsgdXBjYXNlX3N0cmluZyhmaWVsZC0+Z2V0X25hbWUoKSArICJfaXNzZXRfaWQiKTsKK30KKworc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7CisgIHJldHVybiAiaXMiICsgZ2V0X2NhcF9uYW1lKCJzZXQiKSArIGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSArICIoKSI7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgeworICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIih0cnVlKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7CisgIHN0cmluZyBwYWNrYWdlID0gIiI7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJqYXZhIikgKyAiLiI7CisgIH0KKyAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBUU3RydWN0KFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgIDw8ICJcIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGVzY3Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgVEZpZWxkICIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDID0gbmV3IFRGaWVsZChcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAiKHNob3J0KSIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOworICB9Cit9CisKK2Jvb2wgdF9qYXZhbWVfZ2VuZXJhdG9yOjpoYXNfYml0X3ZlY3Rvcih0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgY2xlYXIoKSB7IiA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaW5kZW50X3VwKCk7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMuIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBtdXN0IGJlIGEgYmFzZSB0eXBlCisgICAgICAgIC8vIG1lYW5zIGl0IGFsc28gbmVlZHMgdG8gYmUgZXhwbGljaXRseSB1bnNldAorICAgICAgICBpbmRlbnQob3V0KSA8PCAic2V0IiA8PCBnZXRfY2FwX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKKyAgICAgICAgICAgICAgICAgICAgPDwgIihmYWxzZSk7IiA8PCBlbmRsOworICAgICAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXQpLT5nZXRfYmFzZSgpKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IDA7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gMC4wOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vIHByZXZlbnQgZ2NjIGNvbXBpbGVyIHdhcm5pbmcKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoamF2YW1lLCAiSmF2YSBNRSIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2pzX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTc4MmI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwyNzIxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCisKKy8qKgorICogSlMgY29kZSBnZW5lcmF0b3IuCisgKi8KK2NsYXNzIHRfanNfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfanNfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBnZW5fbm9kZV8gPSBmYWxzZTsKKyAgICBnZW5fanF1ZXJ5XyA9IGZhbHNlOworICAgIGdlbl90c18gPSBmYWxzZTsKKyAgICBnZW5fZXM2XyA9IGZhbHNlOworCisgICAgYm9vbCB3aXRoX25zXyA9IGZhbHNlOworCisgICAgZm9yIChpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9kZSIpID09IDApIHsKKyAgICAgICAgZ2VuX25vZGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgianF1ZXJ5IikgPT0gMCkgeworICAgICAgICBnZW5fanF1ZXJ5XyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInRzIikgPT0gMCkgeworICAgICAgICBnZW5fdHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgid2l0aF9ucyIpID09IDApIHsKKyAgICAgICAgd2l0aF9uc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJlczYiKSA9PSAwKSB7CisgICAgICAgIGdlbl9lczZfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBqczoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGdlbl9lczZfICYmIGdlbl9qcXVlcnlfKSB7CisgICAgICB0aHJvdyAiSW52YWxpZCBzd2l0Y2g6IFstZ2VuIGpzOmVzNixqcXVlcnldIG9wdGlvbnMgbm90IGNvbXBhdGlibGUiOworICAgIH0KKworICAgIGlmIChnZW5fbm9kZV8gJiYgZ2VuX2pxdWVyeV8pIHsKKyAgICAgIHRocm93ICJJbnZhbGlkIHN3aXRjaDogWy1nZW4ganM6bm9kZSxqcXVlcnldIG9wdGlvbnMgbm90IGNvbXBhdGlibGUsIHRyeTogWy1nZW4ganM6bm9kZSAtZ2VuICIKKyAgICAgICAgICAgICJqczpqcXVlcnldIjsKKyAgICB9CisKKyAgICBpZiAoIWdlbl9ub2RlXyAmJiB3aXRoX25zXykgeworICAgICAgdGhyb3cgIkludmFsaWQgc3dpdGNoOiBbLWdlbiBqczp3aXRoX25zXSBpcyBvbmx5IHZhbGlkIHdoZW4gdXNpbmcgbm9kZS5qcyI7CisgICAgfQorCisgICAgLy8gRGVwZW5kaW5nIG9uIHRoZSBwcm9jZXNzaW5nIGZsYWdzLCB3ZSB3aWxsIHVwZGF0ZSB0aGVzZSB0byBiZSBFUzYgY29tcGF0aWJsZQorICAgIGpzX2NvbnN0X3R5cGVfID0gInZhciAiOworICAgIGpzX2xldF90eXBlXyA9ICJ2YXIgIjsKKyAgICBqc192YXJfdHlwZV8gPSAidmFyICI7CisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBqc19jb25zdF90eXBlXyA9ICJjb25zdCAiOworICAgICAganNfbGV0X3R5cGVfID0gImxldCAiOworICAgIH0KKworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLW5vZGVqcyI7CisgICAgICBub19uc18gPSAhd2l0aF9uc187CisgICAgfSBlbHNlIHsKKyAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWpzIjsKKyAgICAgIG5vX25zXyA9IGZhbHNlOworICAgIH0KKworICAgIGVzY2FwZV9bJ1wnJ10gPSAiXFwnIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfcmVjdl90aHJvdyhzdGQ6OnN0cmluZyB2YXIpOworICBzdGQ6OnN0cmluZyByZW5kZXJfcmVjdl9yZXR1cm4oc3RkOjpzdHJpbmcgdmFyKTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFN0cnVjdHMhCisgICAqLworICB2b2lkIGdlbmVyYXRlX2pzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4cG9ydGVkID0gdHJ1ZSk7CisgIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2pzX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qc19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MgPSBmYWxzZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIGpzX2luY2x1ZGVzKCk7CisgIHN0ZDo6c3RyaW5nIHRzX2luY2x1ZGVzKCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIGJvb2wgb2JqID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfY2FsbGJhY2sgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV9jYWxsYmFjayA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBtYWtlX3ZhbGlkX25vZGVKc19pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lKTsKKworICBzdGQ6OnN0cmluZyBhdXRvZ2VuX2NvbW1lbnQoKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCIvL1xuIikgKyAiLy8gQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICAgICsgIi8vXG4iICsgIi8vIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIKKyAgICAgICAgICAgKyAiLy9cbiI7CisgIH0KKworICB0X3R5cGUqIGdldF9jb250YWluZWRfdHlwZSh0X3R5cGUqIHQpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBqc19uYW1lc3BhY2VfcGllY2VzKHRfcHJvZ3JhbSogcCkgeworICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgianMiKTsKKworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbG9jOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaWVjZXM7CisKKyAgICBpZiAobm9fbnNfKSB7CisgICAgICByZXR1cm4gcGllY2VzOworICAgIH0KKworICAgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgcGllY2VzLnB1c2hfYmFjayhucy5zdWJzdHIoMCwgbG9jKSk7CisgICAgICAgIG5zID0gbnMuc3Vic3RyKGxvYyArIDEpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgICBwaWVjZXMucHVzaF9iYWNrKG5zKTsKKyAgICB9CisKKyAgICByZXR1cm4gcGllY2VzOworICB9CisKKyAgc3RkOjpzdHJpbmcganNfdHlwZV9uYW1lc3BhY2UodF9wcm9ncmFtKiBwKSB7CisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgaWYgKHAgIT0gTlVMTCAmJiBwICE9IHByb2dyYW1fKSB7CisgICAgICAgIHJldHVybiBtYWtlX3ZhbGlkX25vZGVKc19pZGVudGlmaWVyKHAtPmdldF9uYW1lKCkpICsgIl90dHlwZXMuIjsKKyAgICAgIH0KKyAgICAgIHJldHVybiAidHR5cGVzLiI7CisgICAgfQorICAgIHJldHVybiBqc19uYW1lc3BhY2UocCk7CisgIH0KKworICBzdGQ6OnN0cmluZyBqc19leHBvcnRfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgeworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIHJldHVybiAiZXhwb3J0cy4iOworICAgIH0KKyAgICByZXR1cm4ganNfbmFtZXNwYWNlKHApOworICB9CisKKyAgYm9vbCBoYXNfanNfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgeworICAgIGlmIChub19uc18pIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJqcyIpOworICAgIHJldHVybiAobnMuc2l6ZSgpID4gMCk7CisgIH0KKworICBzdGQ6OnN0cmluZyBqc19uYW1lc3BhY2UodF9wcm9ncmFtKiBwKSB7CisgICAgaWYgKG5vX25zXykgeworICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoImpzIik7CisgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKKyAgICAgIG5zICs9ICIuIjsKKyAgICB9CisKKyAgICByZXR1cm4gbnM7CisgIH0KKworICAvKioKKyAgICogVHlwZVNjcmlwdCBEZWZpbml0aW9uIEZpbGUgaGVscGVyIGZ1bmN0aW9ucworICAgKi8KKworICBzdHJpbmcgdHNfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbmNsdWRlX2NhbGxiYWNrLCBib29sIG9wdGlvbmFsX2NhbGxiYWNrKTsKKyAgc3RyaW5nIHRzX2dldF90eXBlKHRfdHlwZSogdHlwZSk7CisKKyAgLyoqCisgICAqIFNwZWNpYWwgaW5kZW50YXRpb24gZm9yIFR5cGVTY3JpcHQgRGVmaW5pdGlvbnMgYmVjYXVzZSBvZiB0aGUgbW9kdWxlLgorICAgKiBSZXR1cm5zIHRoZSBub3JtYWwgaW5kZW50YXRpb24gKyAiICAiIGlmIGEgbW9kdWxlIHdhcyBkZWZpbmVkLgorICAgKiBAcmV0dXJuIHN0cmluZworICAgKi8KKyAgc3RyaW5nIHRzX2luZGVudCgpIHsgcmV0dXJuIGluZGVudCgpICsgKCF0c19tb2R1bGVfLmVtcHR5KCkgPyAiICAiIDogIiIpOyB9CisKKyAgLyoqCisgICAqIFJldHVybnMgImRlY2xhcmUgIiBpZiBubyBtb2R1bGUgd2FzIGRlZmluZWQuCisgICAqIEByZXR1cm4gc3RyaW5nCisgICAqLworICBzdHJpbmcgdHNfZGVjbGFyZSgpIHsgcmV0dXJuICh0c19tb2R1bGVfLmVtcHR5KCkgPyAiZGVjbGFyZSAiIDogIiIpOyB9CisKKyAgLyoqCisgICAqIFJldHVybnMgIj8iIGlmIHRoZSBnaXZlbiBmaWVsZCBpcyBvcHRpb25hbCBvciBoYXMgYSBkZWZhdWx0IHZhbHVlLgorICAgKiBAcGFyYW0gdF9maWVsZCBUaGUgZmllbGQgdG8gY2hlY2sKKyAgICogQHJldHVybiBzdHJpbmcKKyAgICovCisgIHN0cmluZyB0c19nZXRfcmVxKHRfZmllbGQqIGZpZWxkKSB7cmV0dXJuIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwgZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwgPyAiPyIgOiAiIik7IH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgZG9jdW1lbnRhdGlvbiwgaWYgdGhlIHByb3ZpZGVkIGRvY3VtZW50YWJsZSBvYmplY3QgaGFzIG9uZS4KKyAgICogQHBhcmFtIHRfZG9jIFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBkb2N1bWVudGF0aW9uIGZyb20KKyAgICogQHJldHVybiBzdHJpbmcgVGhlIGRvY3VtZW50YXRpb24KKyAgICovCisgIHN0cmluZyB0c19wcmludF9kb2ModF9kb2MqIHRkb2MpIHsKKyAgICBzdHJpbmcgcmVzdWx0ID0gZW5kbDsKKworICAgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGRvYyh0ZG9jLT5nZXRfZG9jKCkpOworICAgICAgc3RyaW5nIGl0ZW07CisKKyAgICAgIHJlc3VsdCArPSB0c19pbmRlbnQoKSArICIvKioiICsgZW5kbDsKKyAgICAgIHdoaWxlIChzdGQ6OmdldGxpbmUoZG9jLCBpdGVtKSkgeworICAgICAgICByZXN1bHQgKz0gdHNfaW5kZW50KCkgKyAiICogIiArIGl0ZW0gKyBlbmRsOworICAgICAgfQorICAgICAgcmVzdWx0ICs9IHRzX2luZGVudCgpICsgIiAqLyIgKyBlbmRsOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBOb2RlSlMtZnJpZW5kbHkgUlBDIHNlcnZpY2VzLgorICAgKi8KKyAgYm9vbCBnZW5fbm9kZV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIHNlcnZpY2VzIHRoYXQgdXNlIGpRdWVyeSBhamF4IChhc3luYy9zeW5jKS4KKyAgICovCisgIGJvb2wgZ2VuX2pxdWVyeV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIGEgVHlwZVNjcmlwdCBEZWZpbml0aW9uIEZpbGUgZm9yIGVhY2ggc2VydmljZS4KKyAgICovCisgIGJvb2wgZ2VuX3RzXzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgRVM2IGNvZGUsIGkuZS4gd2l0aCBQcm9taXNlcworICAgKi8KKyAgYm9vbCBnZW5fZXM2XzsKKworICAvKioKKyAgICogVGhlIG5hbWUgb2YgdGhlIGRlZmluZWQgbW9kdWxlKHMpLCBmb3IgVHlwZVNjcmlwdCBEZWZpbml0aW9uIEZpbGVzLgorICAgKi8KKyAgc3RyaW5nIHRzX21vZHVsZV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIG5vdCBnZW5lcmF0ZSBuYW1lc3BhY2Ugb2JqZWN0cyBmb3Igbm9kZS4KKyAgICovCisgIGJvb2wgbm9fbnNfOworCisgIC8qKgorICAgKiBUaGUgdmFyaWFibGUgZGVjb3JhdG9yIGZvciAiY29uc3QiIHZhcmlhYmxlcy4gV2lsbCBkZWZhdWx0IHRvICJ2YXIiIGlmIGluIGFuIGluY29tcGF0aWJsZSBsYW5ndWFnZS4KKyAgICovCisgIHN0cmluZyBqc19jb25zdF90eXBlXzsKKworICAgLyoqCisgICAqIFRoZSB2YXJpYWJsZSBkZWNvcmF0b3IgZm9yICJsZXQiIHZhcmlhYmxlcy4gV2lsbCBkZWZhdWx0IHRvICJ2YXIiIGlmIGluIGFuIGluY29tcGF0aWJsZSBsYW5ndWFnZS4KKyAgICovCisgIHN0cmluZyBqc19sZXRfdHlwZV87CisKKyAgIC8qKgorICAgKiBUaGUgZGVmYXVsdCB2YXJpYWJsZSBkZWNvcmF0b3IuIFN1cHBvcnRzIGFsbCBqYXZhc2NyaXB0IGxhbmd1YWdlcywgYnV0IGlzIG5vdCBzY29wZWQgdG8gZnVuY3Rpb25zIG9yIGNsb3N1cmVzLgorICAgKi8KKyAgc3RyaW5nIGpzX3Zhcl90eXBlXzsKKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc190c187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlX3RzXzsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICBzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKKworICAvLyBNYWtlIG91dHB1dCBmaWxlKHMpCisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBvdXRkaXIgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICJfdHlwZXMuanMiOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKworICBpZiAoZ2VuX3RzXykgeworICAgIHN0cmluZyBmX3R5cGVzX3RzX25hbWUgPSBvdXRkaXIgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICJfdHlwZXMuZC50cyI7CisgICAgZl90eXBlc190c18ub3BlbihmX3R5cGVzX3RzX25hbWUuY19zdHIoKSk7CisgIH0KKworICAvLyBQcmludCBoZWFkZXIKKyAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCk7CisKKyAgaWYgKChnZW5fbm9kZV8gfHwgZ2VuX2VzNl8pICYmIG5vX25zXykgeworICAgIGZfdHlwZXNfIDw8ICJcInVzZSBzdHJpY3RcIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGZfdHlwZXNfIDw8IGpzX2luY2x1ZGVzKCkgPDwgZW5kbCA8PCByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOworCisgIGlmIChnZW5fdHNfKSB7CisgICAgZl90eXBlc190c18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgdHNfaW5jbHVkZXMoKSA8PCBlbmRsOworICB9CisKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIGZfdHlwZXNfIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJ0dHlwZXMgPSBtb2R1bGUuZXhwb3J0cyA9IHt9OyIgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBwbnM7CisKKyAgLy8gc2V0dXAgdGhlIG5hbWVzcGFjZQorICAvLyBUT0RPIHNob3VsZCB0aGUgbmFtZXNwYWNlIGp1c3QgYmUgaW4gdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIG5vZGU/CisgIHZlY3RvcjxzdHJpbmc+IG5zX3BpZWNlcyA9IGpzX25hbWVzcGFjZV9waWVjZXMocHJvZ3JhbV8pOworICBpZiAobnNfcGllY2VzLnNpemUoKSA+IDApIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5zX3BpZWNlcy5zaXplKCk7ICsraSkgeworICAgICAgcG5zICs9ICgoaSA9PSAwKSA/ICIiIDogIi4iKSArIG5zX3BpZWNlc1tpXTsKKyAgICAgIGZfdHlwZXNfIDw8ICJpZiAodHlwZW9mICIgPDwgcG5zIDw8ICIgPT09ICd1bmRlZmluZWQnKSB7IiA8PCBlbmRsOworICAgICAgZl90eXBlc18gPDwgIiAgIiA8PCBwbnMgPDwgIiA9IHt9OyIgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgdHNfbW9kdWxlXyA9IHBuczsKKyAgICAgIGZfdHlwZXNfdHNfIDw8ICJkZWNsYXJlIG1vZHVsZSAiIDw8IHRzX21vZHVsZV8gPDwgIiB7IjsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQganMgaW1wb3J0cworICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OmpzX2luY2x1ZGVzKCkgeworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgc3RyaW5nIHJlc3VsdCA9IGpzX2NvbnN0X3R5cGVfICsgInRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpO1xuIgorICAgICAgICArIGpzX2NvbnN0X3R5cGVfICsgIlRocmlmdCA9IHRocmlmdC5UaHJpZnQ7XG4iOworICAgIGlmICghZ2VuX2VzNl8pIHsKKyAgICAgIHJlc3VsdCArPSBqc19jb25zdF90eXBlXyArICJRID0gdGhyaWZ0LlE7XG4iOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcmV0dXJuICIiOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCB0cyBpbXBvcnRzCisgKi8KK3N0cmluZyB0X2pzX2dlbmVyYXRvcjo6dHNfaW5jbHVkZXMoKSB7CisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICByZXR1cm4gc3RyaW5nKAorICAgICAgICAiaW1wb3J0IHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpO1xuIgorICAgICAgICAiaW1wb3J0IFRocmlmdCA9IHRocmlmdC5UaHJpZnQ7XG4iCisgICAgICAgICJpbXBvcnQgUSA9IHRocmlmdC5RO1xuIik7CisgIH0KKworICByZXR1cm4gIiI7Cit9CisKKy8qKgorICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQorICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlcygpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIHJlc3VsdCArPSBqc19jb25zdF90eXBlXyArIG1ha2VfdmFsaWRfbm9kZUpzX2lkZW50aWZpZXIoaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkpICsgIl90dHlwZXMgPSByZXF1aXJlKCcuLyIgKyBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICsgIl90eXBlcycpO1xuIjsKKyAgICB9CisgICAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApIHsKKyAgICAgIHJlc3VsdCArPSAiXG4iOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ2xvc2UgdXAgKG9yIGRvd24pIHNvbWUgZmlsZXouCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gQ2xvc2UgdHlwZXMgZmlsZShzKQorCisgIGZfdHlwZXNfLmNsb3NlKCk7CisKKyAgaWYgKGdlbl90c18pIHsKKyAgICBpZiAoIXRzX21vZHVsZV8uZW1wdHkoKSkgeworICAgICAgZl90eXBlc190c18gPDwgIn0iOworICAgIH0KKyAgICBmX3R5cGVzX3RzXy5jbG9zZSgpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBKUywgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gU2luY2UgZGVmaW5lIGlzIGV4cGVuc2l2ZSB0byBsb29rdXAKKyAqIGluIEpTLCB3ZSB1c2UgYSBnbG9iYWwgYXJyYXkgZm9yIHRoaXMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgZl90eXBlc18gPDwganNfdHlwZV9uYW1lc3BhY2UodGVudW0tPmdldF9wcm9ncmFtKCkpIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgPSB7IiA8PCBlbmRsOworCisgIGlmIChnZW5fdHNfKSB7CisgICAgZl90eXBlc190c18gPDwgdHNfcHJpbnRfZG9jKHRlbnVtKSA8PCB0c19pbmRlbnQoKSA8PCB0c19kZWNsYXJlKCkgPDwgImVudW0gIgorICAgICAgICAgICAgICAgIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgeyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdCYgY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgZl90eXBlc190c18gPDwgdHNfaW5kZW50KCkgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlIDw8ICIsIiA8PCBlbmRsOworICAgICAgLy8gYWRkICd2YWx1ZToga2V5JyBpbiBhZGRpdGlvbiB0byAna2V5OiB2YWx1ZScgZm9yIFR5cGVTY3JpcHQgZW51bXMKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICInIiA8PCB2YWx1ZSA8PCAiJyA6ICciIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywiIDw8IGVuZGw7CisgICAgfQorICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICInIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIicgOiAiIDw8IHZhbHVlOworICAgIGlmIChjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpIC0gMSkgeworICAgICAgZl90eXBlc18gPDwgIiwiOworICAgIH0KKyAgICBmX3R5cGVzXyA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBmX3R5cGVzXyA8PCAifTsiIDw8IGVuZGw7CisKKyAgaWYgKGdlbl90c18pIHsKKyAgICBmX3R5cGVzX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKKworICBmX3R5cGVzXyA8PCBqc190eXBlX25hbWVzcGFjZShwcm9ncmFtXykgPDwgbmFtZSA8PCAiID0gIjsKKyAgZl90eXBlc18gPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCAiOyIgPDwgZW5kbDsKKworICBpZiAoZ2VuX3RzXykgeworICAgIGZfdHlwZXNfdHNfIDw8IHRzX3ByaW50X2RvYyh0Y29uc3QpIDw8IHRzX2luZGVudCgpIDw8IHRzX2RlY2xhcmUoKSA8PCBqc19jb25zdF90eXBlXyA8PCBuYW1lIDw8ICI6ICIKKyAgICAgICAgICAgICAgICA8PCB0c19nZXRfdHlwZSh0eXBlKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X2pzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICInIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICInIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgZW1pdF9kb3VibGVfYXNfc3RyaW5nKHZhbHVlLT5nZXRfZG91YmxlKCkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCAibmV3ICIgPDwganNfdHlwZV9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiKHsiOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBpZiAodl9pdGVyICE9IHZhbC5iZWdpbigpKQorICAgICAgICBvdXQgPDwgIiwiOworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOworICAgICAgb3V0IDw8ICIgOiAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0pIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIG91dCA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmJlZ2luKCkpCisgICAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisKKyAgICAgIG91dCA8PCAiIDogIjsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIG91dCA8PCAiWyI7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBpZiAodl9pdGVyICE9IHZhbC5iZWdpbigpKQorICAgICAgICBvdXQgPDwgIiwiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgICAgfQorICAgIG91dCA8PCAiXSI7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBNYWtlIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9qc19zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQorICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2pzX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIFN0cnVjdHMgY2FuIGJlIG5vcm1hbCBvciBleGNlcHRpb25zLgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworfQorCisvKioKKyAqIFJldHVybiB0eXBlIG9mIGNvbnRhaW5lZCBlbGVtZW50cyBmb3IgYSBjb250YWluZXIgdHlwZS4gRm9yIG1hcHMKKyAqIHRoaXMgaXMgdHlwZSBvZiB2YWx1ZSAoa2V5cyBhcmUgYWx3YXlzIHN0cmluZ3MgaW4ganMpCisgKi8KK3RfdHlwZSogdF9qc19nZW5lcmF0b3I6OmdldF9jb250YWluZWRfdHlwZSh0X3R5cGUqIHQpIHsKKyAgdF90eXBlKiBldHlwZTsKKyAgaWYgKHQtPmlzX2xpc3QoKSkgeworICAgIGV0eXBlID0gKCh0X2xpc3QqKXQpLT5nZXRfZWxlbV90eXBlKCk7CisgIH0gZWxzZSBpZiAodC0+aXNfc2V0KCkpIHsKKyAgICBldHlwZSA9ICgodF9zZXQqKXQpLT5nZXRfZWxlbV90eXBlKCk7CisgIH0gZWxzZSB7CisgICAgZXR5cGUgPSAoKHRfbWFwKil0KS0+Z2V0X3ZhbF90eXBlKCk7CisgIH0KKyAgcmV0dXJuIGV0eXBlOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgbm90aGluZyBpbiBKUworICogd2hlcmUgdGhlIG9iamVjdHMgYXJlIGFsbCBqdXN0IGFzc29jaWF0aXZlIGFycmF5cyAodW5sZXNzIG9mIGNvdXJzZSB3ZQorICogZGVjaWRlIHRvIHN0YXJ0IHVzaW5nIG9iamVjdHMgZm9yIHRoZW0uLi4pCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4cG9ydGVkKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIHN0cmluZyBwcmVmaXggPSBoYXNfanNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpID8ganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDoganNfY29uc3RfdHlwZV87CisgICAgb3V0IDw8IHByZWZpeCA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8CisgICAgICAoaXNfZXhwb3J0ZWQgPyAiID0gbW9kdWxlLmV4cG9ydHMuIiArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgOiAiIik7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfdHlwZXNfdHNfIDw8IHRzX3ByaW50X2RvYyh0c3RydWN0KSA8PCB0c19pbmRlbnQoKSA8PCB0c19kZWNsYXJlKCkgPDwgImNsYXNzICIKKyAgICAgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgKGlzX2V4Y2VwdGlvbiA/ICIgZXh0ZW5kcyBUaHJpZnQuVEV4Y2VwdGlvbiIgOiAiIikKKyAgICAgICAgICAgICAgICAgIDw8ICIgeyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3R5cGVzX3RzXyA8PCB0c19wcmludF9kb2ModHN0cnVjdCkgPDwgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8ICJjbGFzcyAiCisgICAgICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IChpc19leGNlcHRpb24gPyAiIGV4dGVuZHMgVGhyaWZ0LlRFeGNlcHRpb24iIDogIiIpCisgICAgICAgICAgICAgICAgICA8PCAiIHsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaWYgKGdlbl9ub2RlXyAmJiBpc19leGNlcHRpb24pIHsKKyAgICAgIG91dCA8PCAiID0gY2xhc3MgZXh0ZW5kcyBUaHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiA9IGNsYXNzIHsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJjb25zdHJ1Y3RvcihhcmdzKSB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCAiID0gZnVuY3Rpb24oYXJncykgeyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIC8vIENhbGwgc3VwZXIoKSBtZXRob2Qgb24gaW5oZXJpdGVkIEVycm9yIGNsYXNzCisgIGlmIChnZW5fbm9kZV8gJiYgaXNfZXhjZXB0aW9uKSB7CisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAic3VwZXIoYXJncyk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiVGhyaWZ0LlRFeGNlcHRpb24uY2FsbCh0aGlzLCBcIiIgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpCisgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy5uYW1lID0gXCIiIDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGw7CisgIH0KKworICAvLyBtZW1iZXJzIHdpdGggYXJndW1lbnRzCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBzdHJpbmcgZHZhbCA9IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsIHRydWUpOworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICEodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKKyAgICAgIGR2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKm1faXRlciktPmdldF92YWx1ZSgpKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCBkdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgICAgZl90eXBlc190c18gPDwgdHNfaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiCisgICAgICAgICAgICAgICAgICAgIDw8IHRzX2dldF90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3R5cGVzX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjogIgorICAgICAgICAgICAgICAgICAgICA8PCB0c19nZXRfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgCisgICAgfQorICB9CisKKyAgLy8gR2VuZXJhdGUgY29uc3RydWN0b3IgZnJvbSBhcnJheQorICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgLy8gRWFybHkgcmV0dXJucyBmb3IgZXhjZXB0aW9ucworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICh0LT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGFyZ3MgaW5zdGFuY2VvZiAiIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHQtPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICA8PCB0LT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgInRoaXMuIgorICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBhcmdzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIKKyAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImlmIChhcmdzKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3R5cGVzX3RzXyA8PCBlbmRsIDw8IHRzX2luZGVudCgpIDw8ICJjb25zdHJ1Y3RvcihhcmdzPzogeyAiOworICAgIH0KKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoYXJncy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSB1bmRlZmluZWQgJiYgYXJncy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgICAgaWYgKHQtPmlzX3N0cnVjdCgpKSB7CisgICAgICAgIG91dCA8PCAoIiA9IG5ldyAiICsganNfdHlwZV9uYW1lc3BhY2UodC0+Z2V0X3Byb2dyYW0oKSkgKyB0LT5nZXRfbmFtZSgpICsKKyAgICAgICAgICAgICAgICAiKGFyZ3MuIisoKm1faXRlciktPmdldF9uYW1lKCkgKyIpOyIpOworICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAodC0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgICAgdF90eXBlKiBldHlwZSA9IGdldF9jb250YWluZWRfdHlwZSh0KTsKKyAgICAgICAgc3RyaW5nIGNvcHlGdW5jID0gdC0+aXNfbWFwKCkgPyAiVGhyaWZ0LmNvcHlNYXAiIDogIlRocmlmdC5jb3B5TGlzdCI7CisgICAgICAgIHN0cmluZyB0eXBlX2xpc3QgPSAiIjsKKworICAgICAgICB3aGlsZSAoZXR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgICAgaWYgKHR5cGVfbGlzdC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHR5cGVfbGlzdCArPSAiLCAiOworICAgICAgICAgIH0KKyAgICAgICAgICB0eXBlX2xpc3QgKz0gZXR5cGUtPmlzX21hcCgpID8gIlRocmlmdC5jb3B5TWFwIiA6ICJUaHJpZnQuY29weUxpc3QiOworICAgICAgICAgIGV0eXBlID0gZ2V0X2NvbnRhaW5lZF90eXBlKGV0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChldHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgICBpZiAodHlwZV9saXN0Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgdHlwZV9saXN0ICs9ICIsICI7CisgICAgICAgICAgfQorICAgICAgICAgIHR5cGVfbGlzdCArPSBqc190eXBlX25hbWVzcGFjZShldHlwZS0+Z2V0X3Byb2dyYW0oKSkgKyBldHlwZS0+Z2V0X25hbWUoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBpZiAodHlwZV9saXN0Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgdHlwZV9saXN0ICs9ICIsICI7CisgICAgICAgICAgfQorICAgICAgICAgIHR5cGVfbGlzdCArPSAibnVsbCI7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgKCIgPSAiICsgY29weUZ1bmMgKyAiKGFyZ3MuIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSArCisgICAgICAgICAgICAgICAgIiwgWyIgKyB0eXBlX2xpc3QgKyAiXSk7Iik7CisgICAgICAgIG91dCA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIgPSBhcmdzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaWYgKCEoKm1faXRlciktPmdldF9yZXEoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuVU5LTk9XTiwgIgorICAgICAgICAgICAgICAgIidSZXF1aXJlZCBmaWVsZCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGlzIHVuc2V0IScpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaWYgKGdlbl90c18pIHsKKyAgICAgICAgZl90eXBlc190c18gPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IHRzX2dldF9yZXEoKm1faXRlcikgPDwgIjogIgorICAgICAgICAgICAgICAgICAgICA8PCB0c19nZXRfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICI7ICI7CisgICAgICB9CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3R5cGVzX3RzXyA8PCAifSk7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIERvbmUgd2l0aCBjb25zdHJ1Y3RvcgorICBpbmRlbnRfZG93bigpOworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChnZW5fdHNfKSB7CisgICAgZl90eXBlc190c18gPDwgdHNfaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpZiAoIWdlbl9lczZfKSB7CisgICAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgICAgb3V0IDw8ICJUaHJpZnQuaW5oZXJpdHMoIiA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgIDw8ICIsIFRocmlmdC5URXhjZXB0aW9uKTsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi5wcm90b3R5cGUubmFtZSA9ICciCisgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGluaXQgcHJvdG90eXBlIG1hbnVhbGx5IGlmIHdlIGFyZW4ndCB1c2luZyBlczYKKyAgICAgIG91dCA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLnByb3RvdHlwZSA9IHt9OyIKKyAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICB9CisKKyAgZ2VuZXJhdGVfanNfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9qc19zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisKKyAgLy8gQ2xvc2Ugb3V0IHRoZSBjbGFzcyBkZWZpbml0aW9uCisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn07IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWFkKCkgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudChvdXQpIDw8ICJyZWFkIChpbnB1dCkgeyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICA8PCAiLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24oaW5wdXQpIHsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwganNfY29uc3RfdHlwZV8gPDwgInJldCA9IGlucHV0LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBqc19jb25zdF90eXBlXyA8PCAiZnR5cGUgPSByZXQuZnR5cGU7IiA8PCBlbmRsOworICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwganNfY29uc3RfdHlwZV8gPDwgImZpZCA9IHJldC5maWQ7IiA8PCBlbmRsOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgKGZ0eXBlID09IFRocmlmdC5UeXBlLlNUT1ApIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgeworICAgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmlkKSB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImlmIChmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50KG91dCkgPDwgIiAgaW5wdXQuc2tpcChmdHlwZSk7IiA8PCBlbmRsOworCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKGZpZWxkcy5zaXplKCkgPT0gMSkgeworICAgICAgLy8gcHNldWRvIGNhc2UgdG8gbWFrZSBqc2xpbnQgaGFwcHkKKyAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlIDA6IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgaW5wdXQuc2tpcChmdHlwZSk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsOworICAgIH0KKyAgICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCisgICAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIGlucHV0LnNraXAoZnR5cGUpOyIgPDwgZW5kbDsKKworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQuc2tpcChmdHlwZSk7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSB3cml0ZSgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudChvdXQpIDw8ICJ3cml0ZSAob3V0cHV0KSB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgIDw8ICIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24ob3V0cHV0KSB7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gbnVsbCAmJiB0aGlzLiIKKyAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IHVuZGVmaW5lZCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVGaWVsZEJlZ2luKCIKKyAgICAgICAgICAgICAgICA8PCAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworCisgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVTdHJ1Y3RFbmQoKTsiCisgICAgICA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIHNlcnZpY2VfbmFtZV8gKyAiLmpzIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGlmIChnZW5fdHNfKSB7CisgICAgc3RyaW5nIGZfc2VydmljZV90c19uYW1lID0gZ2V0X291dF9kaXIoKSArIHNlcnZpY2VfbmFtZV8gKyAiLmQudHMiOworICAgIGZfc2VydmljZV90c18ub3BlbihmX3NlcnZpY2VfdHNfbmFtZS5jX3N0cigpKTsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCk7CisKKyAgaWYgKChnZW5fbm9kZV8gfHwgZ2VuX2VzNl8pICYmIG5vX25zXykgeworICAgIGZfc2VydmljZV8gPDwgIlwidXNlIHN0cmljdFwiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBqc19pbmNsdWRlcygpIDw8IGVuZGwgPDwgcmVuZGVyX2luY2x1ZGVzKCkgPDwgZW5kbDsKKworICBpZiAoZ2VuX3RzXykgeworICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8ICIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiLmQudHNcIiAvPiIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9zZXJ2aWNlX3RzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5jbHVkZXMoKSA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiaW1wb3J0IHR0eXBlcyA9IHJlcXVpcmUoJy4vIiArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIl90eXBlcycpOyIgPDwgZW5kbDsKKyAgICAgIC8vIEdlbmVyYXRlIHR5cGUgYWxpYXNlcworICAgICAgLy8gZW51bQorICAgICAgdmVjdG9yPHRfZW51bSo+IGNvbnN0JiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKKyAgICAgIHZlY3Rvcjx0X2VudW0qPjo6Y29uc3RfaXRlcmF0b3IgZV9pdGVyOworICAgICAgZm9yIChlX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZV9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImltcG9ydCAiIDw8ICgqZV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHR5cGVzLiIKKyAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZShwcm9ncmFtXykgPDwgKCplX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICB9CisgICAgICAvLyBjb25zdAorICAgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdCYgY29uc3RzID0gcHJvZ3JhbV8tPmdldF9jb25zdHMoKTsKKyAgICAgIHZlY3Rvcjx0X2NvbnN0Kj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImltcG9ydCAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHR5cGVzLiIKKyAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZShwcm9ncmFtXykgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICB9CisgICAgICAvLyBleGNlcHRpb24KKyAgICAgIHZlY3Rvcjx0X3N0cnVjdCo+IGNvbnN0JiBleGNlcHRpb25zID0gcHJvZ3JhbV8tPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIHZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IGV4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IGV4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImltcG9ydCAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHR5cGVzLiIKKyAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZShwcm9ncmFtXykgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICB9CisgICAgICAvLyBzdHJ1Y3RzCisgICAgICB2ZWN0b3I8dF9zdHJ1Y3QqPiBjb25zdCYgc3RydWN0cyA9IHByb2dyYW1fLT5nZXRfc3RydWN0cygpOworICAgICAgdmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKKyAgICAgIGZvciAoc19pdGVyID0gc3RydWN0cy5iZWdpbigpOyBzX2l0ZXIgIT0gc3RydWN0cy5lbmQoKTsgKytzX2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiaW1wb3J0ICIgPDwgKCpzX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0dHlwZXMuIgorICAgICAgICAgICAgICAgICAgPDwganNfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCAoKnNfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCF0c19tb2R1bGVfLmVtcHR5KCkpIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgImRlY2xhcmUgbW9kdWxlICIgPDwgdHNfbW9kdWxlXyA8PCAiIHsiOworICAgIH0KKyAgfQorCisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBqc19jb25zdF90eXBlXyA8PCAgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIiA9IHJlcXVpcmUoJy4vIgorICAgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiJyk7IiA8PCBlbmRsIDw8IGpzX2NvbnN0X3R5cGVfCisgICAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQgPSAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICIuQ2xpZW50OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBqc19jb25zdF90eXBlXyA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yID0gIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiLlByb2Nlc3NvcjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBqc19jb25zdF90eXBlXyA8PCAidHR5cGVzID0gcmVxdWlyZSgnLi8iICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiX3R5cGVzJyk7IiA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlKTsKKyAgfQorCisgIGZfc2VydmljZV8uY2xvc2UoKTsKKyAgaWYgKGdlbl90c18pIHsKKyAgICBpZiAoIXRzX21vZHVsZV8uZW1wdHkoKSkgeworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAifSI7CisgICAgfQorICAgIGZfc2VydmljZV90c18uY2xvc2UoKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgc3RyaW5nIHByZWZpeCA9IGhhc19qc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpID8ganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA6IGpzX2NvbnN0X3R5cGVfOworICAgIGZfc2VydmljZV8gPDwgcHJlZml4IDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvciA9ICIgPDwgImV4cG9ydHMuUHJvY2Vzc29yIjsKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCBlbmRsIDw8ICJkZWNsYXJlIGNsYXNzIFByb2Nlc3NvciAiOworICAgICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiZXh0ZW5kcyAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJQcm9jZXNzb3IgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV90c18gPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgInByaXZhdGUgX2hhbmRsZXI6IE9iamVjdDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgImNvbnN0cnVjdG9yKGhhbmRsZXI6IE9iamVjdCk7IiA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAicHJvY2VzcyhpbnB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2wsIG91dHB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2wpOiB2b2lkOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IgPSAiCisgICAgICAgICAgICAgPDwgImV4cG9ydHMuUHJvY2Vzc29yIjsKKyAgfQorCisgIGJvb2wgaXNfc3ViY2xhc3Nfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEw7CisKKyAgLy8gRVM2IENvbnN0cnVjdG9yCisgIGlmIChnZW5fZXM2XykgeworICAgIGlmIChpc19zdWJjbGFzc19zZXJ2aWNlKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgPSBjbGFzcyBleHRlbmRzICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciB7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgPSBjbGFzcyB7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNvbnN0cnVjdG9yKGhhbmRsZXIpIHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiID0gZnVuY3Rpb24oaGFuZGxlcikgeyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworICBpZiAoZ2VuX2VzNl8gJiYgaXNfc3ViY2xhc3Nfc2VydmljZSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic3VwZXIoaGFuZGxlcik7IiA8PCBlbmRsOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5faGFuZGxlciA9IGhhbmRsZXI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIC8vIERvbmUgd2l0aCBjb25zdHJ1Y3RvcgorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEVTNSBzZXJ2aWNlIGluaGVyaXRhbmNlCisgIGlmICghZ2VuX2VzNl8gJiYgaXNfc3ViY2xhc3Nfc2VydmljZSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVGhyaWZ0LmluaGVyaXRzKCIgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IsICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIlByb2Nlc3Nvcik7IiA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb2Nlc3MgKGlucHV0LCBvdXRwdXQpIHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3IucHJvdG90eXBlLnByb2Nlc3MgPSBmdW5jdGlvbihpbnB1dCwgb3V0cHV0KSB7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJyID0gaW5wdXQucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJpZiAodGhpc1sncHJvY2Vzc18nICsgci5mbmFtZV0pIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICByZXR1cm4gdGhpc1sncHJvY2Vzc18nICsgci5mbmFtZV0uY2FsbCh0aGlzLCByLnJzZXFpZCwgaW5wdXQsIG91dHB1dCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlucHV0LnNraXAoVGhyaWZ0LlR5cGUuU1RSVUNUKTsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpbnB1dC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIgICIgPDwganNfY29uc3RfdHlwZV8gPDwgInggPSBuZXcgIgorICAgICAgICAgICAgICAgICJUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLlVOS05PV05fTUVUSE9ELCAiCisgICAgICAgICAgICAgICAgIidVbmtub3duIGZ1bmN0aW9uICcgKyByLmZuYW1lKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICBvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oci5mbmFtZSwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgci5yc2VxaWQpOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHgud3JpdGUob3V0cHV0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICBvdXRwdXQud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICAvLyBDbG9zZSBvZmYgdGhlIHByb2Nlc3NvciBjbGFzcyBkZWZpbml0aW9uCisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorICBpZiAoZ2VuX25vZGVfICYmIGdlbl90c18pIHsKKyAgICBmX3NlcnZpY2VfdHNfIDw8ICJ9IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiIChzZXFpZCwgaW5wdXQsIG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICAgICAgICAgPDwgIlByb2Nlc3Nvci5wcm90b3R5cGUucHJvY2Vzc18iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiA9IGZ1bmN0aW9uKHNlcWlkLCBpbnB1dCwgb3V0cHV0KSB7IiA8PCBlbmRsOworICB9CisgIGlmIChnZW5fdHNfKSB7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAicHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKHNlcWlkOiBudW1iZXIsIGlucHV0OiBUaHJpZnQuVEpTT05Qcm90b2NvbCwgb3V0cHV0OiBUaHJpZnQuVEpTT05Qcm90b2NvbCk6IHZvaWQ7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSBqc19uYW1lc3BhY2UocHJvZ3JhbV8pICsgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0ganNfbmFtZXNwYWNlKHByb2dyYW1fKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICArICJfcmVzdWx0IjsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfY29uc3RfdHlwZV8gPDwgImFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgImFyZ3MucmVhZChpbnB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpbnB1dC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIC8vIFByb21pc2Ugc3R5bGUgaW52b2NhdGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmICh0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIi5sZW5ndGggPT09ICIgPDwgZmllbGRzLnNpemUoKSA8PCAiKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlByb21pc2UucmVzb2x2ZSh0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIuYmluZCh0aGlzLl9oYW5kbGVyKSgiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIG1heWJlQ29tbWEgPSAoZmllbGRzLnNpemUoKSA+IDAgPyAiLCIgOiAiIik7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJRLmZjYWxsKHRoaXMuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIi5iaW5kKHRoaXMuX2hhbmRsZXIpIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBtYXliZUNvbW1hIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgbWF5YmVDb21tYSA9IChmX2l0ZXIgIT0gZmllbGRzLmVuZCgpIC0gMSA/ICIsIiA6ICIiKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgbWF5YmVDb21tYSA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIpKS50aGVuKHJlc3VsdCA9PiB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJyZXN1bHRfb2JqID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKHtzdWNjZXNzOiByZXN1bHR9KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICA8PCAiXCIsIFRocmlmdC5NZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJyZXN1bHRfb2JqLndyaXRlKG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pLmNhdGNoKGVyciA9PiB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSkuY2F0Y2goZnVuY3Rpb24gKGVycikgeyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX2xldF90eXBlXyA8PCAicmVzdWx0OyIgPDwgZW5kbDsKKworICBib29sIGhhc19leGNlcHRpb24gPSBmYWxzZTsKKyAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgaWYgKGV4Y2VwdGlvbnMpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gZXhjZXB0aW9ucy0+Z2V0X21lbWJlcnMoKTsKKyAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWVtYmVycy5iZWdpbigpOyBpdCAhPSBtZW1iZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqaXQpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICh0LT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIGlmICghaGFzX2V4Y2VwdGlvbikgeworICAgICAgICAgIGhhc19leGNlcHRpb24gPSB0cnVlOworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGVyciBpbnN0YW5jZW9mICIgPDwganNfdHlwZV9uYW1lc3BhY2UodC0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdC0+Z2V0X25hbWUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIgfHwgZXJyIGluc3RhbmNlb2YgIiA8PCBqc190eXBlX25hbWVzcGFjZSh0LT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICAgICAgPDwgdC0+Z2V0X25hbWUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChoYXNfZXhjZXB0aW9uKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIihlcnIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCIsIFRocmlmdC5NZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9IG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuVU5LTk9XTiwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBlcnIubWVzc2FnZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oXCIiCisgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpOyIgPDwgZW5kbDsKKworICBpZiAoaGFzX2V4Y2VwdGlvbikgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIC8vIEVuZCBwcm9taXNlIHN0eWxlIGludm9jYXRpb24KKworICAvLyBDYWxsYmFjayBzdHlsZSBpbnZvY2F0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCAiOworICB9CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiKGVyciwgcmVzdWx0KSA9PiB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgImZ1bmN0aW9uIChlcnIsIHJlc3VsdCkgeyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX2xldF90eXBlXyA8PCAicmVzdWx0X29iajsiIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoKGVyciA9PT0gbnVsbCB8fCB0eXBlb2YgZXJyID09PSAndW5kZWZpbmVkJykiOworICBpZiAoaGFzX2V4Y2VwdGlvbikgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSBleGNlcHRpb25zLT5nZXRfbWVtYmVycygpOworICAgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtZW1iZXJzLmJlZ2luKCk7IGl0ICE9IG1lbWJlcnMuZW5kKCk7ICsraXQpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCppdCktPmdldF90eXBlKCkpOworICAgICAgaWYgKHQtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiIHx8IGVyciBpbnN0YW5jZW9mICIgPDwganNfdHlwZV9uYW1lc3BhY2UodC0+Z2V0X3Byb2dyYW0oKSkgPDwgdC0+Z2V0X25hbWUoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0X29iaiA9IG5ldyAiIDw8IHJlc3VsdG5hbWUKKyAgICAgICAgICAgICA8PCAiKChlcnIgIT09IG51bGwgfHwgdHlwZW9mIGVyciA9PT0gJ3VuZGVmaW5lZCcpID8gZXJyIDoge3N1Y2Nlc3M6IHJlc3VsdH0pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgIDw8ICJcIiwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0X29iaiA9IG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuVU5LTk9XTiwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBlcnIubWVzc2FnZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oXCIiCisgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0X29iai53cml0ZShvdXRwdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQuZmx1c2goKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgLy8gRW5kIGNhbGxiYWNrIHN0eWxlIGludm9jYXRpb24KKworICBpbmRlbnRfZG93bigpOworCisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gRG8gbm90IGdlbmVyYXRlIFRTIGRlZmluaXRpb25zIGZvciBoZWxwZXIgZnVuY3Rpb25zCisgIGJvb2wgZ2VuX3RzX3RtcCA9IGdlbl90c187CisgIGdlbl90c18gPSBmYWxzZTsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBmX3NlcnZpY2VfIDw8ICIvL0hFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBzdHJpbmcgbmFtZSA9IHRzLT5nZXRfbmFtZSgpOworICAgIHRzLT5zZXRfbmFtZShzZXJ2aWNlX25hbWVfICsgIl8iICsgbmFtZSk7CisgICAgZ2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfanNfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgICB0cy0+c2V0X25hbWUobmFtZSk7CisgIH0KKworICBnZW5fdHNfID0gZ2VuX3RzX3RtcDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAodm9pZCl0c2VydmljZTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBSRVNUIGludGVyZmFjZQorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAodm9pZCl0c2VydmljZTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBib29sIGlzX3N1YmNsYXNzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMOworCisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICBzdHJpbmcgcHJlZml4ID0gaGFzX2pzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPyBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDoganNfY29uc3RfdHlwZV87CisgICAgZl9zZXJ2aWNlXyA8PCBwcmVmaXggPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ID0gIiA8PCAiZXhwb3J0cy5DbGllbnQiOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX3ByaW50X2RvYyh0c2VydmljZSkgPDwgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8ICJjbGFzcyAiCisgICAgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQgIjsKKyAgICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImV4dGVuZHMgIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50ICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJ7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgPDwgIkNsaWVudCI7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfcHJpbnRfZG9jKHRzZXJ2aWNlKSA8PCB0c19pbmRlbnQoKSA8PCB0c19kZWNsYXJlKCkgPDwgImNsYXNzICIKKyAgICAgICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ICI7CisgICAgICBpZiAoaXNfc3ViY2xhc3Nfc2VydmljZSkgeworICAgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJleHRlbmRzICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIkNsaWVudCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAieyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBFUzYgQ29uc3RydWN0b3IKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaWYgKGlzX3N1YmNsYXNzX3NlcnZpY2UpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiA9IGNsYXNzIGV4dGVuZHMgIiA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQgeyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiID0gY2xhc3MgeyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJjb25zdHJ1Y3RvcihvdXRwdXQsIHBDbGFzcykgeyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJjb25zdHJ1Y3RvcihpbnB1dCwgb3V0cHV0KSB7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgPSBmdW5jdGlvbihvdXRwdXQsIHBDbGFzcykgeyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiID0gZnVuY3Rpb24oaW5wdXQsIG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLm91dHB1dCA9IG91dHB1dDsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLnBDbGFzcyA9IHBDbGFzczsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLl9zZXFpZCA9IDA7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5fcmVxcyA9IHt9OyIgPDwgZW5kbDsKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAicHJpdmF0ZSBpbnB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2w7IiA8PCBlbmRsIDw8IHRzX2luZGVudCgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJwcml2YXRlIG91dHB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2w7IiA8PCBlbmRsIDw8IHRzX2luZGVudCgpIDw8ICJwcml2YXRlIHNlcWlkOiBudW1iZXI7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgdHNfaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgPDwgImNvbnN0cnVjdG9yKGlucHV0OiBUaHJpZnQuVEpTT05Qcm90b2NvbCwgb3V0cHV0PzogVGhyaWZ0LlRKU09OUHJvdG9jb2wpOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLmlucHV0ID0gaW5wdXQ7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5vdXRwdXQgPSAoIW91dHB1dCkgPyBpbnB1dCA6IG91dHB1dDsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLnNlcWlkID0gMDsiIDw8IGVuZGw7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgImlucHV0OiBUaHJpZnQuVEpTT05Qcm90b2NvbDsiIDw8IGVuZGwgPDwgdHNfaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIm91dHB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2w7IiA8PCBlbmRsIDw8IHRzX2luZGVudCgpIDw8ICJzZXFpZDogbnVtYmVyOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IHRzX2luZGVudCgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJjb25zdHJ1Y3RvcihpbnB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2wsIG91dHB1dD86IFRocmlmdC5USlNPTlByb3RvY29sKTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgICBpZiAoaXNfc3ViY2xhc3Nfc2VydmljZSkgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUaHJpZnQuaW5oZXJpdHMoIiA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gaW5pdCBwcm90b3R5cGUKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQucHJvdG90eXBlID0ge307IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIHV0aWxzIGZvciBtdWx0aXBsZXhlZCBzZXJ2aWNlcworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlcWlkICgpIHsgcmV0dXJuIHRoaXMuX3NlcWlkOyB9IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJuZXdfc2VxaWQgKCkgeyByZXR1cm4gdGhpcy5fc2VxaWQgKz0gMTsgfSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkNsaWVudC5wcm90b3R5cGUuc2VxaWQgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3NlcWlkOyB9OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50LnByb3RvdHlwZS5uZXdfc2VxaWQgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3NlcWlkICs9IDE7IH07IgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBhcmdsaXN0ID0gYXJndW1lbnRfbGlzdChhcmdfc3RydWN0KTsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVubmFtZSA8PCAiICgiIDw8IGFyZ2xpc3QgPDwgIikgeyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50LnByb3RvdHlwZS4iCisgICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICIiLCAhZ2VuX2VzNl8pIDw8ICIgeyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICAvLyBmdW5jdGlvbiBkZWZpbml0aW9uIHdpdGhvdXQgY2FsbGJhY2sKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfcHJpbnRfZG9jKCpmX2l0ZXIpIDw8IHRzX2luZGVudCgpIDw8IHRzX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSwgZmFsc2UpIDw8IGVuZGw7CisgICAgICBpZiAoIWdlbl9lczZfKSB7CisgICAgICAgIC8vIG92ZXJsb2FkIHdpdGggY2FsbGJhY2sKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19wcmludF9kb2MoKmZfaXRlcikgPDwgdHNfaW5kZW50KCkgPDwgdHNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUsIGZhbHNlKSA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gb3ZlcmxvYWQgd2l0aCBjYWxsYmFjaworICAgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX3ByaW50X2RvYygqZl9pdGVyKSA8PCB0c19pbmRlbnQoKSA8PCB0c19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ2VuX2VzNl8gJiYgZ2VuX25vZGVfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMuX3NlcWlkID0gdGhpcy5uZXdfc2VxaWQoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfY29uc3RfdHlwZV8gPDwgInNlbGYgPSB0aGlzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAicmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZi5fcmVxc1tzZWxmLnNlcWlkKCldID0gKGVycm9yLCByZXN1bHQpID0+IHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIGVycm9yID8gcmVqZWN0KGVycm9yKSA6IHJlc29sdmUocmVzdWx0KTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZi5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgYXJnbGlzdCA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChnZW5fbm9kZV8pIHsgLy8gTm9kZS5qcyBvdXRwdXQgICAgICAuL2dlbi1ub2RlanMKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMuX3NlcWlkID0gdGhpcy5uZXdfc2VxaWQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgImlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJfZGVmZXIgPSBRLmRlZmVyKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJ0aGlzLl9yZXFzW3RoaXMuc2VxaWQoKV0gPSBmdW5jdGlvbihlcnJvciwgcmVzdWx0KSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChlcnJvcikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJfZGVmZXIucmVqZWN0KGVycm9yKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJfZGVmZXIucmVzb2x2ZShyZXN1bHQpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QgPDwgIik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gX2RlZmVyLnByb21pc2U7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMuX3JlcXNbdGhpcy5zZXFpZCgpXSA9IGNhbGxiYWNrOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAidGhpcy5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgYXJnbGlzdCA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInNlbGYgPSB0aGlzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAicmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QKKyAgICAgICAgICAgICAgICAgPDwgKGFyZ2xpc3QuZW1wdHkoKSA/ICIiIDogIiwgIikgPDwgIihlcnJvciwgcmVzdWx0KSA9PiB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBlcnJvciA/IHJlamVjdChlcnJvcikgOiByZXNvbHZlKHJlc3VsdCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0pOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9KTsiIDw8IGVuZGw7CisKKyAgICB9IGVsc2UgaWYgKGdlbl9qcXVlcnlfKSB7IC8vIGpRdWVyeSBvdXRwdXQgICAgICAgLi9nZW4tanMKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0IDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7CisgICAgICAgIH0KKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAidGhpcy5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJwb3N0RGF0YSA9IHRoaXMuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QKKyAgICAgICAgICAgICAgICAgPDwgKGFyZ2xpc3QuZW1wdHkoKSA/ICIiIDogIiwgIikgPDwgInRydWUpOyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiLmpxUmVxdWVzdCh0aGlzLCBwb3N0RGF0YSwgYXJndW1lbnRzLCB0aGlzLnJlY3ZfIiA8PCBmdW5uYW1lCisgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeyAvLyBTdGFuZGFyZCBKYXZhU2NyaXB0IC4vZ2VuLWpzCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0CisgICAgICAgICAgICAgICAgIDw8IChhcmdsaXN0LmVtcHR5KCkgPyAiIiA6ICIsICIpIDw8ICJjYWxsYmFjayk7ICIgPDwgZW5kbDsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoIWNhbGxiYWNrKSB7IiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiICByZXR1cm4gIjsKKyAgICAgICAgfQorICAgICAgICBmX3NlcnZpY2VfIDw8ICJ0aGlzLnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBTZW5kIGZ1bmN0aW9uCisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIiAoIiA8PCBhcmdsaXN0IDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBFUzYganMgc3RpbGwgdXNlcyBjYWxsYmFja3MgaGVyZS4gU2hvdWxkIHJlZmFjdG9yIHRoaXMgdG8gcHJvbWlzZSBzdHlsZSBsYXRlci4uCisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIiAoIiA8PCBhcmd1bWVudF9saXN0KGFyZ19zdHJ1Y3QsIHRydWUpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudC5wcm90b3R5cGUuc2VuZF8iCisgICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICIiLCAhZ2VuX25vZGVfKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdGQ6OnN0cmluZyBvdXRwdXRWYXI7CisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAib3V0cHV0ID0gbmV3IHRoaXMucENsYXNzKHRoaXMub3V0cHV0KTsiIDw8IGVuZGw7CisgICAgICBvdXRwdXRWYXIgPSAib3V0cHV0IjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0cHV0VmFyID0gInRoaXMub3V0cHV0IjsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IGpzX25hbWVzcGFjZShwcm9ncmFtXykgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICArICJfYXJncyI7CisKKyAgICBzdGQ6OnN0cmluZyBtZXNzYWdlVHlwZSA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVGhyaWZ0Lk1lc3NhZ2VUeXBlLk9ORVdBWSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiVGhyaWZ0Lk1lc3NhZ2VUeXBlLkNBTEwiOworICAgIC8vIEJ1aWxkIGFyZ3MKKyAgICBpZiAoZmllbGRzLnNpemUoKSA+IDApeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAicGFyYW1zID0geyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIGlmIChmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCktMSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgIiwiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19jb25zdF90eXBlXyA8PCAiYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIocGFyYW1zKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19jb25zdF90eXBlXyA8PCAiYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorCisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyIHdpdGhpbiB0cnkvY2F0Y2gKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRyeSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBvdXRwdXRWYXIgPDwgIi53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgPDwgIicsICIgPDwgbWVzc2FnZVR5cGUgPDwgIiwgdGhpcy5zZXFpZCgpKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgb3V0cHV0VmFyIDw8ICIud3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICInLCAiIDw8IG1lc3NhZ2VUeXBlIDw8ICIsIHRoaXMuc2VxaWQpOyIgPDwgZW5kbDsKKyAgICB9CisKKworICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLndyaXRlKCIgPDwgb3V0cHV0VmFyIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBvdXRwdXRWYXIKKyAgICAgICAgICAgICAgIDw8ICIud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgaWYoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLm91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAiY2FsbGJhY2sgPSB0aGlzLl9yZXFzW3RoaXMuc2VxaWQoKV0gfHwgZnVuY3Rpb24oKSB7fTsiIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlbGV0ZSB0aGlzLl9yZXFzW3RoaXMuc2VxaWQoKV07IiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYWxsYmFjayhudWxsKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhpcy5vdXRwdXQuZmx1c2goKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChnZW5fanF1ZXJ5XykgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2goY2FsbGJhY2spOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAic2VsZiA9IHRoaXM7IiA8PCBlbmRsOworICAgICAgICBpZigoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2godHJ1ZSwgbnVsbCk7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhbGxiYWNrKCk7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpLmZsdXNoKHRydWUsICgpID0+IHsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19sZXRfdHlwZV8gPDwgImVycm9yID0gbnVsbCwgcmVzdWx0ID0gbnVsbDsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXN1bHQgPSBzZWxmLnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoZSkgeyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIGVycm9yID0gZTsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYWxsYmFjayhlcnJvciwgcmVzdWx0KTsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9KTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChjYWxsYmFjaykgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGlmKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCh0cnVlLCBudWxsKTsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FsbGJhY2soKTsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAic2VsZiA9IHRoaXM7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpLmZsdXNoKHRydWUsIGZ1bmN0aW9uKCkgeyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2xldF90eXBlXyA8PCAicmVzdWx0ID0gbnVsbDsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXN1bHQgPSBzZWxmLnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoZSkgeyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJlc3VsdCA9IGU7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FsbGJhY2socmVzdWx0KTsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9KTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIC8vIFJlc2V0IHRoZSB0cmFuc3BvcnQgYW5kIGRlbGV0ZSByZWdpc3RlcmVkIGNhbGxiYWNrIGlmIHRoZXJlIHdhcyBhIHNlcmlhbGl6YXRpb24gZXJyb3IKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoZSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWxldGUgdGhpcy5fcmVxc1t0aGlzLnNlcWlkKCldOyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICh0eXBlb2YgIiA8PCBvdXRwdXRWYXIgPDwgIi5yZXNldCA9PT0gJ2Z1bmN0aW9uJykgeyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBvdXRwdXRWYXIgPDwgIi5yZXNldCgpOyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICh0eXBlb2YgIiA8PCBvdXRwdXRWYXIgPDwgIi5nZXRUcmFuc3BvcnQoKS5yZXNldCA9PT0gJ2Z1bmN0aW9uJykgeyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBvdXRwdXRWYXIgPDwgIi5nZXRUcmFuc3BvcnQoKS5yZXNldCgpOyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRocm93IGU7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICAvLyBDbG9zZSBzZW5kIGZ1bmN0aW9uCisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gUmVjZWl2ZSBmdW5jdGlvbgorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAgIC8vIE9wZW4gcmVjZWl2ZSBmdW5jdGlvbgorICAgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgICBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAoaW5wdXQsIG10eXBlLCByc2VxaWQpIHsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQucHJvdG90eXBlLnJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiID0gZnVuY3Rpb24oaW5wdXQsbXR5cGUscnNlcWlkKSB7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAoKSB7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisKKyAgICAgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQucHJvdG90eXBlLiIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIHN0ZDo6c3RyaW5nIGlucHV0VmFyOworICAgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgICBpbnB1dFZhciA9ICJpbnB1dCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnB1dFZhciA9ICJ0aGlzLmlucHV0IjsKKyAgICAgIH0KKworICAgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJjYWxsYmFjayA9IHRoaXMuX3JlcXNbcnNlcWlkXSB8fCBmdW5jdGlvbigpIHt9OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJkZWxldGUgdGhpcy5fcmVxc1tyc2VxaWRdOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInJldCA9IHRoaXMuaW5wdXQucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJtdHlwZSA9IHJldC5tdHlwZTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChtdHlwZSA9PSBUaHJpZnQuTWVzc2FnZVR5cGUuRVhDRVBUSU9OKSB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInggPSBuZXcgVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieC5yZWFkKCIgPDwgaW5wdXRWYXIgPDwgIik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGlucHV0VmFyIDw8ICIucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgcmVuZGVyX3JlY3ZfdGhyb3coIngiKSA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAicmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHQucmVhZCgiIDw8IGlucHV0VmFyIDw8ICIpOyIgPDwgZW5kbDsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBpbnB1dFZhciA8PCAiLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChudWxsICE9PSByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICIgPDwgcmVuZGVyX3JlY3ZfdGhyb3coInJlc3VsdC4iICsgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIHJlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChudWxsICE9PSByZXN1bHQuc3VjY2VzcykgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAiCisgICAgICAgICAgICAgICAgICAgPDwgcmVuZGVyX3JlY3ZfcmV0dXJuKCJyZXN1bHQuc3VjY2VzcyIpIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCByZW5kZXJfcmVjdl90aHJvdygiJyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiIGZhaWxlZDogdW5rbm93biByZXN1bHQnIikKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2FsbGJhY2sobnVsbCk7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBDbG9zZSByZWNlaXZlIGZ1bmN0aW9uCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gRmluaXNoIGNsYXNzIGRlZmluaXRpb25zCisgIGlmIChnZW5fdHNfKSB7CisgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgIn07IiA8PCBlbmRsOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpyZW5kZXJfcmVjdl90aHJvdyhzdGQ6OnN0cmluZyB2YXIpIHsKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIHJldHVybiAicmV0dXJuIGNhbGxiYWNrKCIgKyB2YXIgKyAiKTsiOworICB9IGVsc2UgeworICAgIHJldHVybiAidGhyb3cgIiArIHZhciArICI7IjsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2pzX2dlbmVyYXRvcjo6cmVuZGVyX3JlY3ZfcmV0dXJuKHN0ZDo6c3RyaW5nIHZhcikgeworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgcmV0dXJuICJyZXR1cm4gY2FsbGJhY2sobnVsbCwgIiArIHZhciArICIpOyI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuICJyZXR1cm4gIiArIHZhciArICI7IjsKKyAgfQorfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7CisgICh2b2lkKWluY2xhc3M7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBpbnB1dC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgb3V0IDw8ICh0eXBlLT5pc19iaW5hcnkoKSA/ICJyZWFkQmluYXJ5KCkiIDogInJlYWRTdHJpbmcoKSIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgInJlYWRJMTYoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAicmVhZEkzMigpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKUyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAicmVhZEkzMigpIjsKKyAgICB9CisKKyAgICBpZiAoIWdlbl9ub2RlXykgeworICAgICAgb3V0IDw8ICIudmFsdWUiOworICAgIH0KKworICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHZhcmlhYmxlLiBUaGlzIG1ha2VzIHR3byBrZXkgYXNzdW1wdGlvbnMsCisgKiBmaXJzdCB0aGF0IHRoZXJlIGlzIGEgY29uc3QgY2hhciogdmFyaWFibGUgbmFtZWQgZGF0YSB0aGF0IHBvaW50cyB0byB0aGUKKyAqIGJ1ZmZlciBmb3IgZGVzZXJpYWxpemF0aW9uLCBhbmQgdGhhdCB0aGVyZSBpcyBhIHZhcmlhYmxlIHByb3RvY29sIHdoaWNoCisgKiBpcyBhIHJlZmVyZW5jZSB0byBhIFRQcm90b2NvbCBzZXJpYWxpemF0aW9uIG9iamVjdC4KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwganNfdHlwZV9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5yZWFkKGlucHV0KTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIHN0cmluZyBydG1wMyA9IHRtcCgiX3J0bXAzIik7CisKKyAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IHt9OyIgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCBydG1wMyA8PCAiID0gaW5wdXQucmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCBzaXplIDw8ICIgPSAiIDw8IHJ0bXAzIDw8ICIuc2l6ZSB8fCAwOyIgPDwgZW5kbDsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gW107IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8IHJ0bXAzIDw8ICIgPSBpbnB1dC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgc2l6ZSA8PCAiID0gIiA8PCBydG1wMyA8PCAiLnNpemUgfHwgMDsiIDw8IGVuZGw7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBbXTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgcnRtcDMgPDwgIiA9IGlucHV0LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgc2l6ZSA8PCAiID0gIiA8PCBydG1wMyA8PCAiLnNpemUgfHwgMDsiIDw8IGVuZGw7CisgIH0KKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yICgiIDw8IGpzX2xldF90eXBlXyA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgc2l6ZSA8PCAiOyArKyIgPDwgaSA8PCAiKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpZiAoIWdlbl9ub2RlXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBpIDw8ICIgPiAwICkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIGlmIChpbnB1dC5yc3RhY2subGVuZ3RoID4gaW5wdXQucnBvc1tpbnB1dC5ycG9zLmxlbmd0aCAtMV0gKyAxKSB7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICBpbnB1dC5yc3RhY2sucG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpbnB1dC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpbnB1dC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoImtleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJ2YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSwgZmFsc2UsIGZhbHNlKSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCwgZmFsc2UsIGZhbHNlKSA8PCAiOyIgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwganNfbGV0X3R5cGVfIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXNoKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwganNfbGV0X3R5cGVfIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXNoKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgc3RyaW5nIG5hbWUgPSB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgICAvLyBIYWNrIGZvciB3aGVuIHByZWZpeCBpcyBkZWZpbmVkIChhbHdheXMgYSBoYXNoIHJlZikKKyAgICBpZiAoIXByZWZpeC5lbXB0eSgpKQorICAgICAgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIG91dCA8PCAodHlwZS0+aXNfYmluYXJ5KCkgPyAid3JpdGVCaW5hcnkoIiA6ICJ3cml0ZVN0cmluZygiKSA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSlMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgfQorICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3V0cHV0KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogV3JpdGVzIG91dCBhIGNvbnRhaW5lcgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJUaHJpZnQub2JqZWN0TGVuZ3RoKCIgPDwgcHJlZml4IDw8ICIpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZVNldEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgcHJlZml4IDw8ICIubGVuZ3RoKTsiIDw8IGVuZGw7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LndyaXRlTGlzdEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLmxlbmd0aCk7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKKyAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAoIiA8PCBqc19sZXRfdHlwZV8gPDwga2l0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIi5oYXNPd25Qcm9wZXJ0eSgiIDw8IGtpdGVyIDw8ICIpKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IGpzX2xldF90eXBlXyA8PCB2aXRlciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIlsiIDw8IGtpdGVyIDw8ICJdOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKCIgPDwganNfbGV0X3R5cGVfIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIi5oYXNPd25Qcm9wZXJ0eSgiIDw8IGl0ZXIgPDwgIikpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgaXRlciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIlsiIDw8IGl0ZXIgPDwgIl07IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICgiIDw8IGpzX2xldF90eXBlXyA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIuaGFzT3duUHJvcGVydHkoIiA8PCBpdGVyIDw8ICIpKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IGl0ZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICJbIiA8PCBpdGVyIDw8ICJdOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCk7CisKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOworfQorCisvKioKKyAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqLworc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBib29sIG9iaikgeworICBzdHJpbmcgcmVzdWx0ID0gInRoaXMuIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAoIW9iaikgeworICAgIHJlc3VsdCA9IGpzX2xldF90eXBlXyArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSlMgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBpZiAob2JqKSB7CisgICAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyBqc190eXBlX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHR5cGUtPmdldF9uYW1lKCkgKyAiKCkiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV9jYWxsYmFjaykgeworCisgIHN0cmluZyBzdHI7CisKKyAgc3RyID0gcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIiA9IGZ1bmN0aW9uKCI7CisKKyAgc3RyICs9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCBpbmNsdWRlX2NhbGxiYWNrKTsKKworICBzdHIgKz0gIikiOworICByZXR1cm4gc3RyOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKi8KK3N0cmluZyB0X2pzX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpbmNsdWRlX2NhbGxiYWNrKSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAoaW5jbHVkZV9jYWxsYmFjaykgeworICAgIGlmICghZmllbGRzLmVtcHR5KCkpIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gImNhbGxiYWNrIjsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgorICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRocmlmdC5UeXBlLlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRocmlmdC5UeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRocmlmdC5UeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRocmlmdC5UeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyBhIHRfdHlwZSB0byBhIFR5cGVTY3JpcHQgdHlwZSAoc3RyaW5nKS4KKyAqIEBwYXJhbSB0X3R5cGUgVHlwZSB0byBjb252ZXJ0IHRvIFR5cGVTY3JpcHQKKyAqIEByZXR1cm4gU3RyaW5nIFR5cGVTY3JpcHQgdHlwZQorICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnRzX2dldF90eXBlKHRfdHlwZSogdHlwZSkgeworICBzdGQ6OnN0cmluZyB0c190eXBlOworCisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICB0c190eXBlID0gInN0cmluZyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICB0c190eXBlID0gImJvb2xlYW4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHRzX3R5cGUgPSAiYW55IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgdHNfdHlwZSA9ICJudW1iZXIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdHNfdHlwZSA9ICJ2b2lkIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpIHx8IHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBzdGQ6OnN0cmluZyB0eXBlX25hbWU7CisgICAgaWYgKHR5cGUtPmdldF9wcm9ncmFtKCkpIHsKKyAgICAgIHR5cGVfbmFtZSA9IGpzX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKTsKKyAgICB9CisgICAgdHlwZV9uYW1lLmFwcGVuZCh0eXBlLT5nZXRfbmFtZSgpKTsKKyAgICB0c190eXBlID0gdHlwZV9uYW1lOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorCisgICAgdHNfdHlwZSA9IHRzX2dldF90eXBlKGV0eXBlKSArICJbXSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcga3R5cGUgPSB0c19nZXRfdHlwZSgoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCkpOworICAgIHN0cmluZyB2dHlwZSA9IHRzX2dldF90eXBlKCgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7CisKKworICAgIGlmIChrdHlwZSA9PSAibnVtYmVyIiB8fCBrdHlwZSA9PSAic3RyaW5nIiApIHsKKyAgICAgIHRzX3R5cGUgPSAieyBbazogIiArIGt0eXBlICsgIl06ICIgKyB2dHlwZSArICI7IH0iOworICAgIH0gZWxzZSBpZiAoKCgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKSktPmlzX2VudW0oKSkgeworICAgICAgLy8gTm90IHlldCBzdXBwb3J0ZWQgKGVudW0gbWFwKTogaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L3B1bGwvMjY1MgorICAgICAgLy90c190eXBlID0gInsgW2s6ICIgKyBrdHlwZSArICJdOiAiICsgdnR5cGUgKyAiOyB9IjsKKyAgICAgIHRzX3R5cGUgPSAieyBbazogbnVtYmVyIC8qIiArIGt0eXBlICsgIiovXTogIiArIHZ0eXBlICsgIjsgfSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHRzX3R5cGUgPSAiYW55IjsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHNfdHlwZTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgVHlwZVNjcmlwdCBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ25hbWUoYXJnczogdHlwZXMpOiB0eXBlOycKKyAqCisgKiBAcGFyYW0gdF9mdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcGFyYW0gYm9vbCBpbi0vZXhjbHVkZSB0aGUgY2FsbGJhY2sgYXJndW1lbnQKKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RkOjpzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnRzX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaW5jbHVkZV9jYWxsYmFjaywgYm9vbCBvcHRpb25hbF9jYWxsYmFjaykgeworICBzdHJpbmcgc3RyOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBzdHIgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCI7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHIgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgdHNfZ2V0X3JlcSgqZl9pdGVyKSArICI6ICIgKyB0c19nZXRfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworCisgICAgaWYgKGZfaXRlciArIDEgIT0gZmllbGRzLmVuZCgpIHx8IChpbmNsdWRlX2NhbGxiYWNrICYmIGZpZWxkcy5zaXplKCkgPiAwKSkgeworICAgICAgc3RyICs9ICIsICI7CisgICAgfQorICB9CisKKyAgaWYgKGluY2x1ZGVfY2FsbGJhY2spIHsKKyAgICBzdHJpbmcgY2FsbGJhY2tfb3B0aW9uYWxfc3RyaW5nID0gb3B0aW9uYWxfY2FsbGJhY2sgPyAiPyIgOiAiIjsKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICB0X3N0cnVjdCogZXhjZXB0aW9ucyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgc3RyaW5nIGV4Y2VwdGlvbl90eXBlczsKKyAgICAgIGlmIChleGNlcHRpb25zKSB7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSBleGNlcHRpb25zLT5nZXRfbWVtYmVycygpOworICAgICAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWVtYmVycy5iZWdpbigpOyBpdCAhPSBtZW1iZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKml0KS0+Z2V0X3R5cGUoKSk7CisgICAgICAgICAgaWYgKGl0ID09IG1lbWJlcnMuYmVnaW4oKSkgeworICAgICAgICAgICAgZXhjZXB0aW9uX3R5cGVzID0gdC0+Z2V0X25hbWUoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXhjZXB0aW9uX3R5cGVzICs9ICIgfCAiICsgdC0+Z2V0X25hbWUoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChleGNlcHRpb25fdHlwZXMgPT0gIiIpIHsKKyAgICAgICAgc3RyICs9ICJjYWxsYmFjayIgKyBjYWxsYmFja19vcHRpb25hbF9zdHJpbmcgKyAiOiAoZXJyb3I6IHZvaWQsIHJlc3BvbnNlOiAiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICIpPT52b2lkKTogIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ciArPSAiY2FsbGJhY2siICsgY2FsbGJhY2tfb3B0aW9uYWxfc3RyaW5nICsgIjogKGVycm9yOiAiICsgZXhjZXB0aW9uX3R5cGVzICsgIiwgcmVzcG9uc2U6ICIgKyB0c19nZXRfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIik9PnZvaWQpOiAiOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzdHIgKz0gImNhbGxiYWNrIiArIGNhbGxiYWNrX29wdGlvbmFsX3N0cmluZyArICI6IChkYXRhOiAiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICIpPT52b2lkKTogIjsKKyAgICB9CisKKyAgICBpZiAoZ2VuX2pxdWVyeV8pIHsKKyAgICAgIHN0ciArPSAiSlF1ZXJ5UHJvbWlzZTwiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArIj47IjsKKyAgICB9IGVsc2UgeworICAgICAgc3RyICs9ICJ2b2lkOyI7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChnZW5fZXM2XykgeworICAgICAgc3RyICs9ICIpOiBQcm9taXNlPCIgKyB0c19nZXRfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIj47IjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBzdHIgKz0gIik6ICIgKyB0c19nZXRfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIjsiOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdHI7Cit9CisKKy8qKgorICogVGFrZXMgYSBuYW1lIGFuZCBwcm9kdWNlcyBhIHZhbGlkIE5vZGVKUyBpZGVudGlmaWVyIGZyb20gaXQKKyAqCisgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB3aGljaCBzaGFsbCBiZWNvbWUgYSB2YWxpZCBOb2RlSlMgaWRlbnRpZmllcgorICogQHJldHVybiBUaGUgbW9kaWZpZWQgbmFtZSB3aXRoIHRoZSB1cGRhdGVkIGlkZW50aWZpZXIKKyAqLworc3RkOjpzdHJpbmcgdF9qc19nZW5lcmF0b3I6Om1ha2VfdmFsaWRfbm9kZUpzX2lkZW50aWZpZXIoc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUpIHsKKyAgc3RkOjpzdHJpbmcgc3RyID0gbmFtZTsKKyAgaWYgKHN0ci5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHN0cjsKKyAgfQorCisgIC8vIHRlc3RzIHJlbHkgb24gdGhpcworICBhc3NlcnQoKCdBJyA8ICdaJykgJiYgKCdhJyA8ICd6JykgJiYgKCcwJyA8ICc5JykpOworCisgIC8vIGlmIHRoZSBmaXJzdCBsZXR0ZXIgaXMgYSBudW1iZXIsIHdlIGFkZCBhbiBhZGRpdGlvbmFsIHVuZGVyc2NvcmUgaW4gZnJvbnQgb2YgaXQKKyAgY2hhciBjID0gc3RyLmF0KDApOworICBpZiAoKCcwJyA8PSBjKSAmJiAoYyA8PSAnOScpKSB7CisgICAgc3RyID0gIl8iICsgc3RyOworICB9CisKKyAgLy8gZm9sbG93aW5nIGNoYXJzOiBsZXR0ZXIsIG51bWJlciBvciB1bmRlcnNjb3JlCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgKytpKSB7CisgICAgYyA9IHN0ci5hdChpKTsKKyAgICBpZiAoKCgnQScgPiBjKSB8fCAoYyA+ICdaJykpICYmICgoJ2EnID4gYykgfHwgKGMgPiAneicpKSAmJiAoKCcwJyA+IGMpIHx8IChjID4gJzknKSkKKyAgICAgICAgJiYgKCdfJyAhPSBjKSAmJiAoJyQnICE9IGMpKSB7CisgICAgICBzdHIucmVwbGFjZShpLCAxLCAiXyIpOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdHI7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoanMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJKYXZhc2NyaXB0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBqcXVlcnk6ICAgICAgICAgIEdlbmVyYXRlIGpRdWVyeSBjb21wYXRpYmxlIGNvZGUuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgbm9kZTogICAgICAgICAgICBHZW5lcmF0ZSBub2RlLmpzIGNvbXBhdGlibGUgY29kZS5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB0czogICAgICAgICAgICAgIEdlbmVyYXRlIFR5cGVTY3JpcHQgZGVmaW5pdGlvbiBmaWxlcy5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB3aXRoX25zOiAgICAgICAgIENyZWF0ZSBnbG9iYWwgbmFtZXNwYWNlIG9iamVjdHMgd2hlbiB1c2luZyBub2RlLmpzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgZXM2OiAgICAgICAgICAgICBDcmVhdGUgRVM2IGNvZGUgd2l0aCBQcm9taXNlc1xuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfanNvbl9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2pzb25fZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNTM2MTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2pzb25fZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsNzkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7Cit1c2luZyBzdGQ6OnN0YWNrOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOworc3RhdGljIGNvbnN0IHN0cmluZyBxdW90ID0gIlwiIjsKK3N0YXRpYyBjb25zdCBib29sIE5PX0lOREVOVCA9IGZhbHNlOworc3RhdGljIGNvbnN0IGJvb2wgRk9SQ0VfU1RSSU5HID0gdHJ1ZTsKKworY2xhc3MgdF9qc29uX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfanNvbl9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIHNob3VsZF9tZXJnZV9pbmNsdWRlc18gPSBmYWxzZTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJtZXJnZSIpID09IDApIHsKKyAgICAgICAgc2hvdWxkX21lcmdlX2luY2x1ZGVzXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24ganNvbjoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tanNvbiI7CisgIH0KKworICB2aXJ0dWFsIH50X2pzb25fZ2VuZXJhdG9yKCkge30KKworICAvKioKKyAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX3Byb2dyYW0oKTsKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuYyk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGQodF9maWVsZCogZmllbGQpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCitwcml2YXRlOgorICBib29sIHNob3VsZF9tZXJnZV9pbmNsdWRlc187CisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2pzb25fOworICBzdGQ6OnN0YWNrPGJvb2w+IGNvbW1hX25lZWRlZF87CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0cmluZyBudW1iZXJfdG9fc3RyaW5nKFQgdCkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgICAgb3V0LmltYnVlKHN0ZDo6bG9jYWxlOjpjbGFzc2ljKCkpOworICAgIG91dC5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxUPjo6ZGlnaXRzMTApOworICAgIG91dCA8PCB0OworICAgIHJldHVybiBvdXQuc3RyKCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdm9pZCB3cml0ZV9udW1iZXIoVCBuKSB7CisgICAgZl9qc29uXyA8PCBudW1iZXJfdG9fc3RyaW5nKG4pOworICB9CisKKyAgc3RyaW5nIGdldF90eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0cmluZyBnZXRfcXVhbGlmaWVkX25hbWUodF90eXBlKiB0dHlwZSk7CisKKyAgdm9pZCBzdGFydF9vYmplY3QoYm9vbCBzaG91bGRfaW5kZW50ID0gdHJ1ZSk7CisgIHZvaWQgc3RhcnRfYXJyYXkoKTsKKyAgdm9pZCBlbmRfb2JqZWN0KCk7CisgIHZvaWQgZW5kX2FycmF5KCk7CisgIHZvaWQgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgIHZvaWQgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIHN0cmluZyBlc2NhcGVfanNvbl9zdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCk7CisgIHN0cmluZyBqc29uX3N0cihjb25zdCBzdHJpbmcmIHN0cik7CisgIHZvaWQgbWVyZ2VfaW5jbHVkZXModF9wcm9ncmFtKik7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdGFudCh0X2NvbnN0KiBjb24pOworCisgIHZvaWQgd3JpdGVfdHlwZV9zcGVjX2VudHJ5KGNvbnN0IGNoYXIqIG5hbWUsIHRfdHlwZSogdHR5cGUpOworICB2b2lkIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoY29uc3QgY2hhciogbmFtZSwgdF90eXBlKiB0dHlwZSk7CisgIHZvaWQgd3JpdGVfdHlwZV9zcGVjKHRfdHlwZSogdHR5cGUpOworICB2b2lkIHdyaXRlX3N0cmluZyhjb25zdCBzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCB3cml0ZV92YWx1ZSh0X3R5cGUqIHR2YWx1ZSk7CisgIHZvaWQgd3JpdGVfY29uc3RfdmFsdWUodF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgZm9yY2Vfc3RyaW5nID0gZmFsc2UpOworICB2b2lkIHdyaXRlX2tleV9hbmQoc3RyaW5nIGtleSk7CisgIHZvaWQgd3JpdGVfa2V5X2FuZF9zdHJpbmcoc3RyaW5nIGtleSwgc3RyaW5nIHZhbCk7CisgIHZvaWQgd3JpdGVfa2V5X2FuZF9pbnRlZ2VyKHN0cmluZyBrZXksIGludCB2YWwpOworICB2b2lkIHdyaXRlX2tleV9hbmRfYm9vbChzdHJpbmcga2V5LCBib29sIHZhbCk7Cit9OworCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIHN0cmluZyBmX2pzb25fbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICIuanNvbiI7CisgIGZfanNvbl8ub3BlbihmX2pzb25fbmFtZS5jX3N0cigpKTsKKworICAvLyBNZXJnZSBhbGwgaW5jbHVkZWQgcHJvZ3JhbXMgaW50byB0aGlzIG9uZSBzbyB3ZSBjYW4gb3V0cHV0IG9uZSBiaWcgZmlsZS4KKyAgaWYgKHNob3VsZF9tZXJnZV9pbmNsdWRlc18pIHsKKyAgICBtZXJnZV9pbmNsdWRlcyhwcm9ncmFtXyk7CisgIH0KK30KKworc3RyaW5nIHRfanNvbl9nZW5lcmF0b3I6OmVzY2FwZV9qc29uX3N0cmluZyhjb25zdCBzdHJpbmcmIGlucHV0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKKyAgZm9yIChzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGlucHV0LmJlZ2luKCk7IGl0ZXIgIT0gaW5wdXQuZW5kKCk7IGl0ZXIrKykgeworICAgIHN3aXRjaCAoKml0ZXIpIHsKKyAgICBjYXNlICdcXCc6CisgICAgICBzcyA8PCAiXFxcXCI7CisgICAgICBicmVhazsKKyAgICBjYXNlICciJzoKKyAgICAgIHNzIDw8ICJcXFwiIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJy8nOgorICAgICAgc3MgPDwgIlxcLyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcYic6CisgICAgICBzcyA8PCAiXFxiIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1xmJzoKKyAgICAgIHNzIDw8ICJcXGYiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXG4nOgorICAgICAgc3MgPDwgIlxcbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdccic6CisgICAgICBzcyA8PCAiXFxyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1x0JzoKKyAgICAgIHNzIDw8ICJcXHQiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHNzIDw8ICppdGVyOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBzcy5zdHIoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpzdGFydF9vYmplY3QoYm9vbCBzaG91bGRfaW5kZW50KSB7CisgIGZfanNvbl8gPDwgKHNob3VsZF9pbmRlbnQgPyBpbmRlbnQoKSA6ICIiKSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGNvbW1hX25lZWRlZF8ucHVzaChmYWxzZSk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6c3RhcnRfYXJyYXkoKSB7CisgIGZfanNvbl8gPDwgIlsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBjb21tYV9uZWVkZWRfLnB1c2goZmFsc2UpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX2NvbW1hX2lmX25lZWRlZCgpIHsKKyAgaWYgKGNvbW1hX25lZWRlZF8udG9wKCkpIHsKKyAgICBmX2pzb25fIDw8ICIsIiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6aW5kaWNhdGVfY29tbWFfbmVlZGVkKCkgeworICBjb21tYV9uZWVkZWRfLnBvcCgpOworICBjb21tYV9uZWVkZWRfLnB1c2godHJ1ZSk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfa2V5X2FuZChzdHJpbmcga2V5KSB7CisgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICBpbmRlbnQoZl9qc29uXykgPDwganNvbl9zdHIoa2V5KSA8PCAiOiAiOworICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV9rZXlfYW5kX2ludGVnZXIoc3RyaW5nIGtleSwgaW50IHZhbCkgeworICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgaW5kZW50KGZfanNvbl8pIDw8IGpzb25fc3RyKGtleSkgPDwgIjogIiA8PCBudW1iZXJfdG9fc3RyaW5nKHZhbCk7CisgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX2tleV9hbmRfc3RyaW5nKHN0cmluZyBrZXksIHN0cmluZyB2YWwpIHsKKyAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgIGluZGVudChmX2pzb25fKSA8PCBqc29uX3N0cihrZXkpIDw8ICI6ICIgPDwganNvbl9zdHIodmFsKTsKKyAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfa2V5X2FuZF9ib29sKHN0cmluZyBrZXksIGJvb2wgdmFsKSB7CisgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICBpbmRlbnQoZl9qc29uXykgPDwganNvbl9zdHIoa2V5KSA8PCAiOiAiIDw8ICh2YWwgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6ZW5kX29iamVjdCgpIHsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9qc29uXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgY29tbWFfbmVlZGVkXy5wb3AoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjplbmRfYXJyYXkoKSB7CisgIGluZGVudF9kb3duKCk7CisgIGlmIChjb21tYV9uZWVkZWRfLnRvcCgpKSB7CisgICAgZl9qc29uXyA8PCBlbmRsOworICB9CisgIGluZGVudChmX2pzb25fKSA8PCAiXSI7CisgIGNvbW1hX25lZWRlZF8ucG9wKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfdHlwZV9zcGVjX29iamVjdChjb25zdCBjaGFyKiBuYW1lLCB0X3R5cGUqIHR0eXBlKSB7CisgIHR0eXBlID0gdHR5cGUtPmdldF90cnVlX3R5cGUoKTsKKyAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kKG5hbWUpOworICAgIHN0YXJ0X29iamVjdChOT19JTkRFTlQpOworICAgIHdyaXRlX2tleV9hbmQoInR5cGVJZCIpOworICAgIHdyaXRlX3R5cGVfc3BlYyh0dHlwZSk7CisgICAgZW5kX29iamVjdCgpOworICB9Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfdHlwZV9zcGVjX2VudHJ5KGNvbnN0IGNoYXIqIG5hbWUsIHRfdHlwZSogdHR5cGUpIHsKKyAgd3JpdGVfa2V5X2FuZChuYW1lKTsKKyAgd3JpdGVfdHlwZV9zcGVjKHR0eXBlKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV90eXBlX3NwZWModF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IHR0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7CisKKyAgd3JpdGVfc3RyaW5nKGdldF90eXBlX25hbWUodHR5cGUpKTsKKworICBpZiAodHR5cGUtPmFubm90YXRpb25zXy5zaXplKCkgPiAwKSB7CisgICAgd3JpdGVfa2V5X2FuZCgiYW5ub3RhdGlvbnMiKTsKKyAgICBzdGFydF9vYmplY3QoKTsKKyAgICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gdHR5cGUtPmFubm90YXRpb25zXy5iZWdpbigpOyBpdCAhPSB0dHlwZS0+YW5ub3RhdGlvbnNfLmVuZCgpOyArK2l0KSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImNsYXNzIiwgZ2V0X3F1YWxpZmllZF9uYW1lKHR0eXBlKSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImtleVR5cGVJZCIsIGdldF90eXBlX25hbWUoa3R5cGUpKTsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygidmFsdWVUeXBlSWQiLCBnZXRfdHlwZV9uYW1lKHZ0eXBlKSk7CisgICAgd3JpdGVfdHlwZV9zcGVjX29iamVjdCgia2V5VHlwZSIsIGt0eXBlKTsKKyAgICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJ2YWx1ZVR5cGUiLCB2dHlwZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImVsZW1UeXBlSWQiLCBnZXRfdHlwZV9uYW1lKGV0eXBlKSk7CisgICAgd3JpdGVfdHlwZV9zcGVjX29iamVjdCgiZWxlbVR5cGUiLCBldHlwZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJlbGVtVHlwZUlkIiwgZ2V0X3R5cGVfbmFtZShldHlwZSkpOworICAgIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoImVsZW1UeXBlIiwgZXR5cGUpOworICB9Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBmX2pzb25fIDw8IGVuZGw7CisgIGZfanNvbl8uY2xvc2UoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjptZXJnZV9pbmNsdWRlcyh0X3Byb2dyYW0qIHByb2dyYW0pIHsKKyAgdmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzID0gcHJvZ3JhbS0+Z2V0X2luY2x1ZGVzKCk7CisgIHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaW5jX2l0ZXI7CisgIGZvciAoaW5jX2l0ZXIgPSBpbmNsdWRlcy5iZWdpbigpOyBpbmNfaXRlciAhPSBpbmNsdWRlcy5lbmQoKTsgKytpbmNfaXRlcikgeworICAgIHRfcHJvZ3JhbSogaW5jbHVkZSA9ICppbmNfaXRlcjsKKyAgICAvLyByZWN1cnNlIGluIGNhc2Ugd2UgZ2V0IGNyYXp5CisgICAgbWVyZ2VfaW5jbHVkZXMoaW5jbHVkZSk7CisgICAgLy8gbWVyZ2UgZW51bXMKKyAgICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBpbmNsdWRlLT5nZXRfZW51bXMoKTsKKyAgICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7CisgICAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7CisgICAgICBwcm9ncmFtLT5hZGRfZW51bSgqZW5faXRlcik7CisgICAgfQorICAgIC8vIG1lcmdlIHR5cGVkZWZzCisgICAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gaW5jbHVkZS0+Z2V0X3R5cGVkZWZzKCk7CisgICAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOworICAgIGZvciAodGRfaXRlciA9IHR5cGVkZWZzLmJlZ2luKCk7IHRkX2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdGRfaXRlcikgeworICAgICAgcHJvZ3JhbS0+YWRkX3R5cGVkZWYoKnRkX2l0ZXIpOworICAgIH0KKyAgICAvLyBtZXJnZSBzdHJ1Y3RzCisgICAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IGluY2x1ZGUtPmdldF9vYmplY3RzKCk7CisgICAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIG9faXRlcjsKKyAgICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7CisgICAgICBwcm9ncmFtLT5hZGRfc3RydWN0KCpvX2l0ZXIpOworICAgIH0KKyAgICAvLyBtZXJnZSBjb25zdGFudHMKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IGluY2x1ZGUtPmdldF9jb25zdHMoKTsKKyAgICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIHByb2dyYW0tPmFkZF9jb25zdCgqY19pdGVyKTsKKyAgICB9CisKKyAgICAvLyBtZXJnZSBzZXJ2aWNlcworICAgIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IGluY2x1ZGUtPmdldF9zZXJ2aWNlcygpOworICAgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKKyAgICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKKyAgICAgIHByb2dyYW0tPmFkZF9zZXJ2aWNlKCpzdl9pdGVyKTsKKyAgICB9CisgIH0KK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgeworCisgIGluaXRfZ2VuZXJhdG9yKCk7CisKKyAgc3RhcnRfb2JqZWN0KCk7CisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgcHJvZ3JhbV8tPmdldF9uYW1lKCkpOworICBpZiAocHJvZ3JhbV8tPmhhc19kb2MoKSkgeworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCBwcm9ncmFtXy0+Z2V0X2RvYygpKTsKKyAgfQorCisgIC8vIFdoZW4gbWVyZ2luZyBpbmNsdWRlcywgdGhlICJuYW1lc3BhY2VzIiBhbmQgImluY2x1ZGVzIiBzZWN0aW9ucworICAvLyBiZWNvbWUgYW1iaWd1b3VzLCBzbyBqdXN0IHNraXAgdGhlbS4KKyAgaWYgKCFzaG91bGRfbWVyZ2VfaW5jbHVkZXNfKSB7CisgICAgLy8gR2VuZXJhdGUgbmFtZXNwYWNlcworICAgIHdyaXRlX2tleV9hbmQoIm5hbWVzcGFjZXMiKTsKKyAgICBzdGFydF9vYmplY3QoTk9fSU5ERU5UKTsKKyAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiBuYW1lc3BhY2VzID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2VzKCk7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgbnNfaXQ7CisgICAgZm9yIChuc19pdCA9IG5hbWVzcGFjZXMuYmVnaW4oKTsgbnNfaXQgIT0gbmFtZXNwYWNlcy5lbmQoKTsgKytuc19pdCkgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcobnNfaXQtPmZpcnN0LCBuc19pdC0+c2Vjb25kKTsKKyAgICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisKKyAgICAvLyBHZW5lcmF0ZSBpbmNsdWRlcworICAgIHdyaXRlX2tleV9hbmQoImluY2x1ZGVzIik7CisgICAgc3RhcnRfYXJyYXkoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4gaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgICAgdmVjdG9yPHRfcHJvZ3JhbSo+Ojpjb25zdF9pdGVyYXRvciBpbmNfaXQ7CisgICAgZm9yIChpbmNfaXQgPSBpbmNsdWRlcy5iZWdpbigpOyBpbmNfaXQgIT0gaW5jbHVkZXMuZW5kKCk7ICsraW5jX2l0KSB7CisgICAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICAgIHdyaXRlX3N0cmluZygoKmluY19pdCktPmdldF9uYW1lKCkpOworICAgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgICAgfQorICAgIGVuZF9hcnJheSgpOworICB9CisKKyAgLy8gR2VuZXJhdGUgZW51bXMKKyAgd3JpdGVfa2V5X2FuZCgiZW51bXMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOworICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7CisgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgeworICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOworICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICB9CisgIGVuZF9hcnJheSgpOworCisgIC8vIEdlbmVyYXRlIHR5cGVkZWZzCisgIHdyaXRlX2tleV9hbmQoInR5cGVkZWZzIik7CisgIHN0YXJ0X2FycmF5KCk7CisgIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKTsKKyAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOworICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKKyAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICBnZW5lcmF0ZV90eXBlZGVmKCp0ZF9pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICAvLyBHZW5lcmF0ZSBzdHJ1Y3RzLCBleGNlcHRpb25zLCBhbmQgdW5pb25zIGluIGRlY2xhcmVkIG9yZGVyCisgIHdyaXRlX2tleV9hbmQoInN0cnVjdHMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IHByb2dyYW1fLT5nZXRfb2JqZWN0cygpOworICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOworICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgaWYgKCgqb19pdGVyKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgZ2VuZXJhdGVfeGNlcHRpb24oKm9faXRlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX3N0cnVjdCgqb19pdGVyKTsKKyAgICB9CisgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIH0KKyAgZW5kX2FycmF5KCk7CisKKyAgLy8gR2VuZXJhdGUgY29uc3RhbnRzCisgIHdyaXRlX2tleV9hbmQoImNvbnN0YW50cyIpOworICBzdGFydF9hcnJheSgpOworICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHByb2dyYW1fLT5nZXRfY29uc3RzKCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICBnZW5lcmF0ZV9jb25zdGFudCgqY19pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICAvLyBHZW5lcmF0ZSBzZXJ2aWNlcworICB3cml0ZV9rZXlfYW5kKCJzZXJ2aWNlcyIpOworICBzdGFydF9hcnJheSgpOworICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7CisgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKKyAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgZ2VuZXJhdGVfc2VydmljZSgqc3ZfaXRlcik7CisgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIH0KKyAgZW5kX2FycmF5KCk7CisKKyAgZW5kX29iamVjdCgpOworCisgIC8vIENsb3NlIHRoZSBnZW5lcmF0b3IKKyAgY2xvc2VfZ2VuZXJhdG9yKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIHN0YXJ0X29iamVjdCgpOworICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIGdldF9xdWFsaWZpZWRfbmFtZSh0dHlwZWRlZikpOworICB3cml0ZV9rZXlfYW5kX3N0cmluZygidHlwZUlkIiwgZ2V0X3R5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3RydWVfdHlwZSgpKSk7CisgIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoInR5cGUiLCB0dHlwZWRlZi0+Z2V0X3RydWVfdHlwZSgpKTsKKyAgaWYgKHR0eXBlZGVmLT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgdHR5cGVkZWYtPmdldF9kb2MoKSk7CisgIH0KKyAgaWYgKHR0eXBlZGVmLT5hbm5vdGF0aW9uc18uc2l6ZSgpID4gMCkgeworICAgIHdyaXRlX2tleV9hbmQoImFubm90YXRpb25zIik7CisgICAgc3RhcnRfb2JqZWN0KCk7CisgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IHR0eXBlZGVmLT5hbm5vdGF0aW9uc18uYmVnaW4oKTsgaXQgIT0gdHR5cGVkZWYtPmFubm90YXRpb25zXy5lbmQoKTsgKytpdCkgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworICB9CisgIGVuZF9vYmplY3QoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV9zdHJpbmcoY29uc3Qgc3RyaW5nJiB2YWx1ZSkgeworICBmX2pzb25fIDw8IHF1b3QgPDwgZXNjYXBlX2pzb25fc3RyaW5nKHZhbHVlKSA8PCBxdW90OworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIHNob3VsZF9mb3JjZV9zdHJpbmcpIHsKKworICBzd2l0Y2ggKHZhbHVlLT5nZXRfdHlwZSgpKSB7CisKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgorICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6CisgICAgaWYgKHNob3VsZF9mb3JjZV9zdHJpbmcpIHsKKyAgICAgIHdyaXRlX3N0cmluZyhudW1iZXJfdG9fc3RyaW5nKHZhbHVlLT5nZXRfaW50ZWdlcigpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlX251bWJlcih2YWx1ZS0+Z2V0X2ludGVnZXIoKSk7CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFOgorICAgIGlmIChzaG91bGRfZm9yY2Vfc3RyaW5nKSB7CisgICAgICB3cml0ZV9zdHJpbmcobnVtYmVyX3RvX3N0cmluZyh2YWx1ZS0+Z2V0X2RvdWJsZSgpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlX251bWJlcih2YWx1ZS0+Z2V0X2RvdWJsZSgpKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkc6CisgICAgd3JpdGVfc3RyaW5nKHZhbHVlLT5nZXRfc3RyaW5nKCkpOworICAgIGJyZWFrOworCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTElTVDogeworICAgIHN0YXJ0X2FycmF5KCk7CisgICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3QgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIGxpdDsKKyAgICBmb3IgKGxpdCA9IGxpc3QuYmVnaW4oKTsgbGl0ICE9IGxpc3QuZW5kKCk7ICsrbGl0KSB7CisgICAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICAgIGZfanNvbl8gPDwgaW5kZW50KCk7CisgICAgICB3cml0ZV9jb25zdF92YWx1ZSgqbGl0KTsKKyAgICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICAgIH0KKyAgICBlbmRfYXJyYXkoKTsKKyAgICBicmVhazsKKyAgfQorCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTUFQOiB7CisgICAgc3RhcnRfb2JqZWN0KE5PX0lOREVOVCk7CisgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiBtYXAgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46Oml0ZXJhdG9yIG1pdDsKKyAgICBmb3IgKG1pdCA9IG1hcC5iZWdpbigpOyBtaXQgIT0gbWFwLmVuZCgpOyArK21pdCkgeworICAgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgICBmX2pzb25fIDw8IGluZGVudCgpOworICAgICAgLy8gSlNPTiBvYmplY3RzIG9ubHkgYWxsb3cgc3RyaW5nIGtleXMKKyAgICAgIHdyaXRlX2NvbnN0X3ZhbHVlKG1pdC0+Zmlyc3QsIEZPUkNFX1NUUklORyk7CisgICAgICBmX2pzb25fIDw8ICI6ICI7CisgICAgICB3cml0ZV9jb25zdF92YWx1ZShtaXQtPnNlY29uZCk7CisgICAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworICAgIGJyZWFrOworICB9CisKKyAgZGVmYXVsdDoKKyAgICBmX2pzb25fIDw8ICJudWxsIjsKKyAgICBicmVhazsKKyAgfQorfQorCitzdHJpbmcgdF9qc29uX2dlbmVyYXRvcjo6anNvbl9zdHIoY29uc3Qgc3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIHF1b3QgKyBlc2NhcGVfanNvbl9zdHJpbmcoc3RyKSArIHF1b3Q7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RhbnQodF9jb25zdCogY29uKSB7CisgIHN0YXJ0X29iamVjdCgpOworCisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgY29uLT5nZXRfbmFtZSgpKTsKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoInR5cGVJZCIsIGdldF90eXBlX25hbWUoY29uLT5nZXRfdHlwZSgpKSk7CisgIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoInR5cGUiLCBjb24tPmdldF90eXBlKCkpOworCisgIGlmIChjb24tPmhhc19kb2MoKSkgeworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCBjb24tPmdldF9kb2MoKSk7CisgIH0KKworICB3cml0ZV9rZXlfYW5kKCJ2YWx1ZSIpOworICB3cml0ZV9jb25zdF92YWx1ZShjb24tPmdldF92YWx1ZSgpKTsKKworICBlbmRfb2JqZWN0KCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0YXJ0X29iamVjdCgpOworCisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgdGVudW0tPmdldF9uYW1lKCkpOworCisgIGlmICh0ZW51bS0+aGFzX2RvYygpKSB7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIHRlbnVtLT5nZXRfZG9jKCkpOworICB9CisKKyAgaWYgKHRlbnVtLT5hbm5vdGF0aW9uc18uc2l6ZSgpID4gMCkgeworICAgICAgd3JpdGVfa2V5X2FuZCgiYW5ub3RhdGlvbnMiKTsKKyAgICAgIHN0YXJ0X29iamVjdCgpOworICAgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IHRlbnVtLT5hbm5vdGF0aW9uc18uYmVnaW4oKTsgaXQgIT0gdGVudW0tPmFubm90YXRpb25zXy5lbmQoKTsgKytpdCkgeworICAgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgICAgfQorICAgICAgZW5kX29iamVjdCgpOworICB9CisKKyAgd3JpdGVfa2V5X2FuZCgibWVtYmVycyIpOworICBzdGFydF9hcnJheSgpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gdmFsdWVzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciB2YWxfaXRlcjsKKyAgZm9yICh2YWxfaXRlciA9IHZhbHVlcy5iZWdpbigpOyB2YWxfaXRlciAhPSB2YWx1ZXMuZW5kKCk7ICsrdmFsX2l0ZXIpIHsKKyAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICB0X2VudW1fdmFsdWUqIHZhbCA9ICgqdmFsX2l0ZXIpOworICAgIHN0YXJ0X29iamVjdCgpOworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgdmFsLT5nZXRfbmFtZSgpKTsKKyAgICB3cml0ZV9rZXlfYW5kX2ludGVnZXIoInZhbHVlIiwgdmFsLT5nZXRfdmFsdWUoKSk7CisgICAgaWYgKHZhbC0+aGFzX2RvYygpKSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgdmFsLT5nZXRfZG9jKCkpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIH0KKyAgZW5kX2FycmF5KCk7CisKKyAgZW5kX29iamVjdCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdGFydF9vYmplY3QoKTsKKworICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIHRzdHJ1Y3QtPmdldF9uYW1lKCkpOworCisgIGlmICh0c3RydWN0LT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgdHN0cnVjdC0+Z2V0X2RvYygpKTsKKyAgfQorCisgIGlmICh0c3RydWN0LT5hbm5vdGF0aW9uc18uc2l6ZSgpID4gMCkgeworICAgIHdyaXRlX2tleV9hbmQoImFubm90YXRpb25zIik7CisgICAgc3RhcnRfb2JqZWN0KCk7CisgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5iZWdpbigpOyBpdCAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCk7ICsraXQpIHsKKyAgICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKGl0LT5maXJzdCwgaXQtPnNlY29uZCk7CisgICAgfQorICAgIGVuZF9vYmplY3QoKTsKKyAgfQorCisgIHdyaXRlX2tleV9hbmRfYm9vbCgiaXNFeGNlcHRpb24iLCB0c3RydWN0LT5pc194Y2VwdGlvbigpKTsKKworICB3cml0ZV9rZXlfYW5kX2Jvb2woImlzVW5pb24iLCB0c3RydWN0LT5pc191bmlvbigpKTsKKworICB3cml0ZV9rZXlfYW5kKCJmaWVsZHMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXI7CisgIGZvciAobWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1lbV9pdGVyKyspIHsKKyAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICBnZW5lcmF0ZV9maWVsZCgqbWVtX2l0ZXIpOworICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICB9CisgIGVuZF9hcnJheSgpOworCisgIGVuZF9vYmplY3QoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RhcnRfb2JqZWN0KCk7CisKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCBnZXRfcXVhbGlmaWVkX25hbWUodHNlcnZpY2UpKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZXh0ZW5kcyIsIGdldF9xdWFsaWZpZWRfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkpOworICB9CisKKyAgaWYgKHRzZXJ2aWNlLT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgdHNlcnZpY2UtPmdldF9kb2MoKSk7CisgIH0KKworICBpZiAodHNlcnZpY2UtPmFubm90YXRpb25zXy5zaXplKCkgPiAwKSB7CisgICAgd3JpdGVfa2V5X2FuZCgiYW5ub3RhdGlvbnMiKTsKKyAgICBzdGFydF9vYmplY3QoKTsKKyAgICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gdHNlcnZpY2UtPmFubm90YXRpb25zXy5iZWdpbigpOyBpdCAhPSB0c2VydmljZS0+YW5ub3RhdGlvbnNfLmVuZCgpOyArK2l0KSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgIH0KKworICB3cml0ZV9rZXlfYW5kKCJmdW5jdGlvbnMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7CisgIGZvciAoOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgZm5faXRlcisrKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgZ2VuZXJhdGVfZnVuY3Rpb24oKmZuX2l0ZXIpOworICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICB9CisgIGVuZF9hcnJheSgpOworCisgIGVuZF9vYmplY3QoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuYykgeworICBzdGFydF9vYmplY3QoKTsKKworICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIHRmdW5jLT5nZXRfbmFtZSgpKTsKKworICB3cml0ZV9rZXlfYW5kX3N0cmluZygicmV0dXJuVHlwZUlkIiwgZ2V0X3R5cGVfbmFtZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSkpOworICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJyZXR1cm5UeXBlIiwgdGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpOworCisgIHdyaXRlX2tleV9hbmRfYm9vbCgib25ld2F5IiwgdGZ1bmMtPmlzX29uZXdheSgpKTsKKworICBpZiAodGZ1bmMtPmhhc19kb2MoKSkgeworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCB0ZnVuYy0+Z2V0X2RvYygpKTsKKyAgfQorCisgIGlmICh0ZnVuYy0+YW5ub3RhdGlvbnNfLnNpemUoKSA+IDApIHsKKyAgICB3cml0ZV9rZXlfYW5kKCJhbm5vdGF0aW9ucyIpOworICAgIHN0YXJ0X29iamVjdCgpOworICAgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXQgPSB0ZnVuYy0+YW5ub3RhdGlvbnNfLmJlZ2luKCk7IGl0ICE9IHRmdW5jLT5hbm5vdGF0aW9uc18uZW5kKCk7ICsraXQpIHsKKyAgICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKGl0LT5maXJzdCwgaXQtPnNlY29uZCk7CisgICAgfQorICAgIGVuZF9vYmplY3QoKTsKKyAgfQorCisgIHdyaXRlX2tleV9hbmQoImFyZ3VtZW50cyIpOworICBzdGFydF9hcnJheSgpOworICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7CisgIGZvciAoOyBtZW1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyBtZW1faXRlcisrKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgZ2VuZXJhdGVfZmllbGQoKm1lbV9pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICB3cml0ZV9rZXlfYW5kKCJleGNlcHRpb25zIik7CisgIHN0YXJ0X2FycmF5KCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj4gZXhjZXB0cyA9IHRmdW5jLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGV4X2l0ZXIgPSBleGNlcHRzLmJlZ2luKCk7CisgIGZvciAoOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgeworICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgIGdlbmVyYXRlX2ZpZWxkKCpleF9pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICBlbmRfb2JqZWN0KCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGQodF9maWVsZCogZmllbGQpIHsKKyAgc3RhcnRfb2JqZWN0KCk7CisKKyAgd3JpdGVfa2V5X2FuZF9pbnRlZ2VyKCJrZXkiLCBmaWVsZC0+Z2V0X2tleSgpKTsKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCBmaWVsZC0+Z2V0X25hbWUoKSk7CisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJ0eXBlSWQiLCBnZXRfdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSk7CisgIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoInR5cGUiLCBmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKGZpZWxkLT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgZmllbGQtPmdldF9kb2MoKSk7CisgIH0KKworICBpZiAoZmllbGQtPmFubm90YXRpb25zXy5zaXplKCkgPiAwKSB7CisgICAgd3JpdGVfa2V5X2FuZCgiYW5ub3RhdGlvbnMiKTsKKyAgICBzdGFydF9vYmplY3QoKTsKKyAgICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gZmllbGQtPmFubm90YXRpb25zXy5iZWdpbigpOyBpdCAhPSBmaWVsZC0+YW5ub3RhdGlvbnNfLmVuZCgpOyArK2l0KSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgIH0KKworICB3cml0ZV9rZXlfYW5kKCJyZXF1aXJlZCIpOworICBzd2l0Y2ggKGZpZWxkLT5nZXRfcmVxKCkpIHsKKyAgY2FzZSB0X2ZpZWxkOjpUX1JFUVVJUkVEOgorICAgIHdyaXRlX3N0cmluZygicmVxdWlyZWQiKTsKKyAgICBicmVhazsKKyAgY2FzZSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUOgorICAgIHdyaXRlX3N0cmluZygicmVxX291dCIpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHdyaXRlX3N0cmluZygib3B0aW9uYWwiKTsKKyAgICBicmVhazsKKyAgfQorCisgIGlmIChmaWVsZC0+Z2V0X3ZhbHVlKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kKCJkZWZhdWx0Iik7CisgICAgd3JpdGVfY29uc3RfdmFsdWUoZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgfQorCisgIGVuZF9vYmplY3QoKTsKK30KKworc3RyaW5nIHRfanNvbl9nZW5lcmF0b3I6OmdldF90eXBlX25hbWUodF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IHR0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7CisgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJsaXN0IjsKKyAgfQorICBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJzZXQiOworICB9CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIm1hcCI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gImkzMiI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgIHJldHVybiAoKHRfc3RydWN0Kil0dHlwZSktPmlzX3VuaW9uKCkgPyAidW5pb24iIDogInN0cnVjdCI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJleGNlcHRpb24iOworICB9CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2V0eXBlID0gKHRfYmFzZV90eXBlKil0dHlwZTsKKyAgICByZXR1cm4gdGJhc2V0eXBlLT5pc19iaW5hcnkoKSA/ICJiaW5hcnkiIDogdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNldHlwZS0+Z2V0X2Jhc2UoKSk7CisgIH0KKworICByZXR1cm4gIih1bmtub3duKSI7Cit9CisKK3N0cmluZyB0X2pzb25fZ2VuZXJhdG9yOjpnZXRfcXVhbGlmaWVkX25hbWUodF90eXBlKiB0dHlwZSkgeworICBpZiAoc2hvdWxkX21lcmdlX2luY2x1ZGVzXyB8fCB0dHlwZS0+Z2V0X3Byb2dyYW0oKSA9PSBwcm9ncmFtXykgeworICAgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gdHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihqc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSlNPTiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgbWVyZ2U6ICAgICAgICAgICBHZW5lcmF0ZSBvdXRwdXQgd2l0aCBpbmNsdWRlZCBmaWxlcyBtZXJnZWRcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2x1YV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2x1YV9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRlZTg5NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbHVhX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDExMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOwordXNpbmcgc3RkOjptYXA7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBMVUEgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X2x1YV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9sdWFfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGdlbl9yZXF1aXJlc18gPSB0cnVlOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm9taXRfcmVxdWlyZXMiKSA9PSAwKSB7CisgICAgICAgIGdlbl9yZXF1aXJlc18gPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBsdWE6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWx1YSI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgZ2VuZXJhdGUgbHVhIHJlcXVpcmUgc3RhdGVtZW50cy4KKyAgICovCisgIGJvb2wgZ2VuX3JlcXVpcmVzXzsKKworICAvKioKKyAgICogU3RydWN0LWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX2x1YV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfbHVhX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9sdWFfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIERlc2VyaWFsaXphdGlvbiAoUmVhZCkKKyAgICovCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gKFdyaXRlKQorICAgKi8KKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKyAgc3RkOjpzdHJpbmcgbHVhX2luY2x1ZGVzKCk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfbmFtZXNwYWNlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSk7CisKKyAgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiLS1cbiIpICsgIi0tIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0XG4iICsgIi0tXG4iCisgICAgICAgICAgICsgIi0tIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKyAiLS0gQCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZW5lcmF0ZWRcbiIKKyAgICAgICAgICAgKyAiLS1cbiI7CisgIH0KKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworfTsKKworLyoqCisgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIHN0cmluZyBvdXRkaXIgPSBnZXRfb3V0X2RpcigpOworICBNS0RJUihvdXRkaXIuY19zdHIoKSk7CisKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZXMKKyAgc3RyaW5nIGN1cl9uYW1lc3BhY2UgPSBnZXRfbmFtZXNwYWNlKHByb2dyYW1fKTsKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBvdXRkaXIgKyBjdXJfbmFtZXNwYWNlICsgImNvbnN0YW50cy5sdWEiOworICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworICBzdHJpbmcgZl90eXBlc19uYW1lID0gb3V0ZGlyICsgY3VyX25hbWVzcGFjZSArICJ0dHlwZXMubHVhIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisKKyAgLy8gQWRkIGhlYWRlcnMKKyAgZl9jb25zdHNfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGx1YV9pbmNsdWRlcygpOworICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBsdWFfaW5jbHVkZXMoKTsKKyAgaWYgKGdlbl9yZXF1aXJlc18pIHsKKyAgICBmX3R5cGVzXyA8PCBlbmRsIDw8ICJyZXF1aXJlICciIDw8IGN1cl9uYW1lc3BhY2UgPDwgImNvbnN0YW50cyciOworICB9Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIC8vIENsb3NlIHR5cGVzIGZpbGUKKyAgZl90eXBlc18uY2xvc2UoKTsKKyAgZl9jb25zdHNfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSB0eXBlZGVmIChlc3NlbnRpYWxseSBhIGNvbnN0YW50KQorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIGZfdHlwZXNfIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIiA9ICIKKyAgICAgICAgICAgPDwgdHR5cGVkZWYtPmdldF90eXBlKCktPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZSAodGFibGUpCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgZl90eXBlc18gPDwgZW5kbCA8PCBlbmRsIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgPSB7IiA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTspIHsKKyAgICBpbnQzMl90IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgIGZfdHlwZXNfIDw8ICIgICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlOworICAgICsrY19pdGVyOworICAgIGlmIChjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpKSB7CisgICAgICBmX3R5cGVzXyA8PCAiLCI7CisgICAgfQorICAgIGZfdHlwZXNfIDw8IGVuZGw7CisgIH0KKyAgZl90eXBlc18gPDwgIn0iOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgKG5vbi1sb2NhbCkgdmFsdWUKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgZl9jb25zdHNfIDw8IGVuZGwgPDwgZW5kbCA8PCBuYW1lIDw8ICIgPSAiOworICBmX2NvbnN0c18gPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAiJyIgPDwgdmFsdWUtPmdldF9zdHJpbmcoKSA8PCAiJyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8ICJsdWFsb25nbnVtYmVyLm5ldygnIiA8PCB2YWx1ZS0+Z2V0X3N0cmluZygpIDw8ICInKSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIgPSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKworICAgICAgaW5kZW50KG91dCk7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOworICAgICAgb3V0IDw8ICIgPSAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICArK3ZfaXRlcjsKKyAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCI7CisgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8ICJ9IjsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KQorICAgICAgICAgICAgICAgICAgPDwgIl0gPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgKyt2X2l0ZXI7CisgICAgICBpZiAodl9pdGVyICE9IHZhbC5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwiOworICAgICAgfQorICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBvdXQgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiID0geyIgPDwgZW5kbDsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKyAgICAgIGluZGVudChvdXQpOworICAgICAgb3V0IDw8ICJbIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpIDw8ICJdIjsKKyAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgICBvdXQgPDwgIiA9IHRydWUiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIgPSBmYWxzZSI7CisgICAgICB9CisgICAgICArK3ZfaXRlcjsKKyAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICJ9IjsKKyAgfQorICByZXR1cm4gb3V0LnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgdGhyaWZ0IHN0cnVjdAorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2x1YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgdGhyaWZ0IGV4Y2VwdGlvbgorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9sdWFfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSB0aHJpZnQgc3RydWN0IG9yIGV4Y2VwdGlvbiAobHVhIHRhYmxlKQorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbHVhX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCBlbmRsIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgIiA9IFRFeGNlcHRpb246bmV3eyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBfX3R5cGUgPSAnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInIjsKKyAgICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgICBvdXQgPDwgIiwiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIiA9IF9fVE9iamVjdDpuZXd7IiA8PCBlbmRsOworICB9CisgIGluZGVudF91cCgpOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7KSB7CisgICAgaW5kZW50KG91dCk7CisgICAgb3V0IDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICArK21faXRlcjsKKyAgICBpZiAobV9pdGVyICE9IG1lbWJlcnMuZW5kKCkpIHsKKyAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCk7CisgIG91dCA8PCBlbmRsIDw8ICJ9IjsKKworICBnZW5lcmF0ZV9sdWFfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9sdWFfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgc3RydWN0L2V4Y2VwdGlvbiByZWFkZXIKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2x1YV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIGZ1bmN0aW9uCisgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6cmVhZChpcHJvdCkiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdDpyZWFkU3RydWN0QmVnaW4oKSIgPDwgZW5kbDsKKworICAvLyB3aGlsZTogUmVhZCBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlIHRydWUgZG8iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIGlmOiBDaGVjayB3aGF0IHRvIHJlYWQKKyAgaW5kZW50KG91dCkgPDwgImxvY2FsIGZuYW1lLCBmdHlwZSwgZmlkID0gaXByb3Q6cmVhZEZpZWxkQmVnaW4oKSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlmIGZ0eXBlID09IFRUeXBlLlNUT1AgdGhlbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJicmVhayIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImVsc2VpZiBmaWQgPT0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiIHRoZW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiB0aGVuIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgLy8gUmVhZCBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgZmFsc2UsICJzZWxmLiIpOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZWxzZSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICBpcHJvdDpza2lwKGZ0eXBlKSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworICB9CisKKyAgLy8gZW5kIGlmCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJlbHNlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBpcHJvdDpza2lwKGZ0eXBlKSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlwcm90OnJlYWRGaWVsZEVuZCgpIiA8PCBlbmRsOworCisgIC8vIGVuZCB3aGlsZQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaXByb3Q6cmVhZFN0cnVjdEVuZCgpIiA8PCBlbmRsOworCisgIC8vIGVuZCBmdW5jdGlvbgorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KTsKKyAgb3V0IDw8ICJlbmQiOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgc3RydWN0L2V4Y2VwdGlvbiB3cml0ZXIKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2x1YV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIGZ1bmN0aW9uCisgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6d3JpdGUob3Byb3QpIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVTdHJ1Y3RCZWdpbignIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInKSIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvLyBUbyBjaGVjayBlbGVtZW50IG9mIHNlbGYgd2hldGhlciBuaWwgb3Igbm90LgorICAgIC8vIGF2b2lkIHRoZSB2YWx1ZShmYWxzZSkgb2YgQk9PTCBpcyBsb3N0LgorICAgIGluZGVudChvdXQpIDw8ICJpZiBzZWxmLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgfj0gbmlsIHRoZW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlRmllbGRCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpIgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLiIpOworCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlRmllbGRFbmQoKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlRmllbGRTdG9wKCkiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZVN0cnVjdEVuZCgpIiA8PCBlbmRsOworCisgIC8vIGVuZCBmdW5jdGlvbgorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KTsKKyAgb3V0IDw8ICJlbmQiOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgdGhyaWZ0IHNlcnZpY2UKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZXQgb3V0cHV0IGRpcmVjdG9yeQorICBzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKKworICAvLyBPcGVuIHRoZSBmaWxlIGZvciB3cml0aW5nCisgIHN0cmluZyBjdXJfbnMgPSBnZXRfbmFtZXNwYWNlKHByb2dyYW1fKTsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gb3V0ZGlyICsgY3VyX25zICsgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiLmx1YSI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICAvLyBIZWFkZXJzCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbHVhX2luY2x1ZGVzKCk7CisgIGlmIChnZW5fcmVxdWlyZXNfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8ICJyZXF1aXJlICciIDw8IGN1cl9ucyA8PCAidHR5cGVzJyIgPDwgZW5kbDsKKworICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZXF1aXJlICciIDw8IGdldF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICInIiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChmX3NlcnZpY2VfLCB0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworCisgIC8vIENsb3NlIHRoZSBmaWxlCisgIGZfc2VydmljZV8uY2xvc2UoKTsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgY2xhc3NuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiSWZhY2UiOworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworCisgIC8vIEludGVyZmFjZSBvYmplY3QgZGVmaW5pdGlvbgorICBvdXQgPDwgY2xhc3NuYW1lIDw8ICIgPSAiOworICBpZiAoZXh0ZW5kc19zKSB7CisgICAgb3V0IDw8IGV4dGVuZHNfcy0+Z2V0X25hbWUoKSA8PCAiSWZhY2U6bmV3eyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIl9fVE9iamVjdDpuZXd7IiA8PCBlbmRsOworICB9CisgIG91dCA8PCAiICBfX3R5cGUgPSAnIiA8PCBjbGFzc25hbWUgPDwgIiciIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgY2xhc3NuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiQ2xpZW50IjsKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKworICAvLyBDbGllbnQgb2JqZWN0IGRlZmluaXRpb24KKyAgb3V0IDw8IGNsYXNzbmFtZSA8PCAiID0gX19UT2JqZWN0Lm5ldygiOworICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKKyAgICBvdXQgPDwgZXh0ZW5kc19zLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQiOworICB9IGVsc2UgeworICAgIG91dCA8PCAiX19UQ2xpZW50IjsKKyAgfQorICBvdXQgPDwgIiwgeyIgPDwgZW5kbCA8PCAiICBfX3R5cGUgPSAnIiA8PCBjbGFzc25hbWUgPDwgIiciIDw8IGVuZGwgPDwgIn0pIiA8PCBlbmRsOworCisgIC8vIFNlbmQvUmVjdiBmdW5jdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIHNpZyA9IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKTsKKyAgICBzdHJpbmcgZnVuY25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAvLyBXcmFwcGVyIGZ1bmN0aW9uCisgICAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCBjbGFzc25hbWUgPDwgIjoiIDw8IHNpZyA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgInNlbGY6c2VuZF8iIDw8IHNpZyA8PCBlbmRsIDw8IGluZGVudCgpOworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgb3V0IDw8ICJzZWxmOnJlY3ZfIiA8PCBzaWcgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisKKyAgICAvLyBTZW5kIGZ1bmN0aW9uCisgICAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCBjbGFzc25hbWUgPDwgIjpzZW5kXyIgPDwgc2lnIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAic2VsZi5vcHJvdDp3cml0ZU1lc3NhZ2VCZWdpbignIiA8PCBmdW5jbmFtZSA8PCAiJywgIgorICAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PTkVXQVkiIDogIlRNZXNzYWdlVHlwZS5DQUxMIikKKyAgICAgICAgICAgICAgICA8PCAiLCBzZWxmLl9zZXFpZCkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImxvY2FsIGFyZ3MgPSAiIDw8IGZ1bmNuYW1lIDw8ICJfYXJnczpuZXd7fSIgPDwgZW5kbDsKKworICAgIC8vIFNldCB0aGUgYXJncworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgZm9yIChmbGRfaXRlciA9IGFyZ3MuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gYXJncy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgc3RkOjpzdHJpbmcgYXJnbmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgaW5kZW50KG91dCkgPDwgImFyZ3MuIiA8PCBhcmduYW1lIDw8ICIgPSAiIDw8IGFyZ25hbWUgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiYXJnczp3cml0ZShzZWxmLm9wcm90KSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAic2VsZi5vcHJvdDp3cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAic2VsZi5vcHJvdC50cmFuczpmbHVzaCgpIiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworCisgICAgLy8gUmVjdiBmdW5jdGlvbgorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCBjbGFzc25hbWUgPDwgIjpyZWN2XyIgPDwgc2lnIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJsb2NhbCBmbmFtZSwgbXR5cGUsIHJzZXFpZCA9IHNlbGYuaXByb3Q6IgorICAgICAgICAgIDw8ICJyZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIG10eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04gdGhlbiIKKyAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGxvY2FsIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb246bmV3e30iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB4OnJlYWQoc2VsZi5pcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgc2VsZi5pcHJvdDpyZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZXJyb3IoeCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJsb2NhbCByZXN1bHQgPSAiIDw8IGZ1bmNuYW1lIDw8ICJfcmVzdWx0Om5ld3t9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgInJlc3VsdDpyZWFkKHNlbGYuaXByb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzZWxmLmlwcm90OnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisKKyAgICAgIC8vIFJldHVybiB0aGUgcmVzdWx0IGlmIGl0J3Mgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIHJlc3VsdC5zdWNjZXNzIH49IG5pbCB0aGVuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiByZXN1bHQuc3VjY2VzcyIKKyAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAgICAgLy8gVGhyb3cgY3VzdG9tIGV4Y2VwdGlvbnMKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4ZiA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICAgIGZvciAoeF9pdGVyID0geGYuYmVnaW4oKTsgeF9pdGVyICE9IHhmLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZWlmIHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIHRoZW4iIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZXJyb3IocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJlcnJvcihUQXBwbGljYXRpb25FeGNlcHRpb246bmV3e2Vycm9yQ29kZSA9ICIKKyAgICAgICAgICAgIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFR9KSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGNsYXNzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIlByb2Nlc3NvciI7CisgIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisKKyAgLy8gRGVmaW5lIHByb2Nlc3NvciB0YWJsZQorICBvdXQgPDwgZW5kbCA8PCBjbGFzc25hbWUgPDwgIiA9IF9fVE9iamVjdC5uZXcoIjsKKyAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7CisgICAgb3V0IDw8IGV4dGVuZHNfcy0+Z2V0X25hbWUoKSA8PCAiUHJvY2Vzc29yIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCAiX19UUHJvY2Vzc29yIiA8PCBlbmRsOworICB9CisgIG91dCA8PCAiLCB7IiA8PCBlbmRsIDw8ICIgX190eXBlID0gJyIgPDwgY2xhc3NuYW1lIDw8ICInIiA8PCBlbmRsIDw8ICJ9KSIgPDwgZW5kbDsKKworICAvLyBQcm9jZXNzIGZ1bmN0aW9uCisgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgImZ1bmN0aW9uICIgPDwgY2xhc3NuYW1lIDw8ICI6cHJvY2VzcyhpcHJvdCwgb3Byb3QsIHNlcnZlcl9jdHgpIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAibG9jYWwgbmFtZSwgbXR5cGUsIHNlcWlkID0gaXByb3Q6cmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAibG9jYWwgZnVuY19uYW1lID0gJ3Byb2Nlc3NfJyAuLiBuYW1lIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaWYgbm90IHNlbGZbZnVuY19uYW1lXSBvciB0dHlwZShzZWxmW2Z1bmNfbmFtZV0pIH49ICdmdW5jdGlvbicgdGhlbiI7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3Q6c2tpcChUVHlwZS5TVFJVQ1QpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiaXByb3Q6cmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjpuZXd7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiICBlcnJvckNvZGUgPSBUQXBwbGljYXRpb25FeGNlcHRpb24uVU5LTk9XTl9NRVRIT0QiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdDp3cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCAiCisgICAgICA8PCAic2VxaWQpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4OndyaXRlKG9wcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIm9wcm90OndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFuczpmbHVzaCgpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZWxzZSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAiICBzZWxmW2Z1bmNfbmFtZV0oc2VsZiwgc2VxaWQsIGlwcm90LCBvcHJvdCwgc2VydmVyX2N0eCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgImVuZCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIpOworICB9Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgc3RyaW5nIGNsYXNzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIlByb2Nlc3NvciI7CisgIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICBzdHJpbmcgZm5fbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKworICBpbmRlbnQob3V0KSA8PCBlbmRsIDw8ICJmdW5jdGlvbiAiIDw8IGNsYXNzbmFtZSA8PCAiOnByb2Nlc3NfIiA8PCBmbl9uYW1lCisgICAgICAgICAgICAgIDw8ICIoc2VxaWQsIGlwcm90LCBvcHJvdCwgc2VydmVyX2N0eCkiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIFJlYWQgdGhlIHJlcXVlc3QKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJsb2NhbCBhcmdzID0gIiA8PCBhcmdzbmFtZSA8PCAiOm5ld3t9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAibG9jYWwgcmVwbHlfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYXJnczpyZWFkKGlwcm90KSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlwcm90OnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImxvY2FsIHJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZQorICAgICAgPDwgIjpuZXd7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibG9jYWwgc3RhdHVzLCByZXMgPSBwY2FsbChzZWxmLmhhbmRsZXIuIiA8PCBmbl9uYW1lCisgICAgICA8PCAiLCBzZWxmLmhhbmRsZXIiOworCisgIC8vIFByaW50IGFyZ3VtZW50cworICB0X3N0cnVjdCogYXJncyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgaWYgKGFyZ3MtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID4gMCkgeworICAgIG91dCA8PCAiLCAiIDw8IGFyZ3VtZW50X2xpc3QoYXJncywgImFyZ3MuIik7CisgIH0KKworICAvLyBDaGVjayBmb3IgZXJyb3JzCisgIG91dCA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgbm90IHN0YXR1cyB0aGVuIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICByZXBseV90eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uOm5ld3ttZXNzYWdlID0gcmVzfSIgPDwgZW5kbDsKKworICAvLyBIYW5kbGUgY3VzdG9tIGV4Y2VwdGlvbnMKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4ZiA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICBpZiAoeGYuc2l6ZSgpID4gMCkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICBmb3IgKHhfaXRlciA9IHhmLmJlZ2luKCk7IHhfaXRlciAhPSB4Zi5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZWlmIHR0eXBlKHJlcykgPT0gJyIgPDwgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICInIHRoZW4iCisgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHJlcyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBTZXQgdGhlIHJlc3VsdCBhbmQgd3JpdGUgdGhlIHJlcGx5CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXN1bHQuc3VjY2VzcyA9IHJlcyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImVuZCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Q6d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgZm5fbmFtZSA8PCAiJywgcmVwbHlfdHlwZSwgIgorICAgICAgPDwgInNlcWlkKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0OndyaXRlKG9wcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIm9wcm90OndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFuczpmbHVzaCgpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Cit9CisKKy8vIFNlcnZpY2UgaGVscGVycwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8IGVuZGwgPDwgIi0tIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9sdWFfc3RydWN0X2RlZmluaXRpb24ob3V0LCB0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMob3V0LCAqZl9pdGVyKTsKKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgICAgfQorICAgIGdlbmVyYXRlX2x1YV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsICZyZXN1bHQsIGZhbHNlKTsKKyAgfQorfQorCisvKioKKyAqIERlc2VyaWFsaXplIChSZWFkKQorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBsb2NhbCwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBsb2NhbCwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgKGxvY2FsID8gImxvY2FsICIgOiAiIikgPDwgbmFtZSA8PCAiID0gaXByb3Q6IjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAicmVhZEJvb2woKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgInJlYWRJMzIoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAicmVhZEk2NCgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgaW5kZW50KG91dCkgPDwgKGxvY2FsID8gImxvY2FsICIgOiAiIikgPDwgcHJlZml4IDw8ICIgPSAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjpuZXd7fSIKKyAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIjpyZWFkKGlwcm90KSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7CisgIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7CisgIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7CisKKyAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKKyAgdF9maWVsZCBma3R5cGUoZ190eXBlX2k4LCBrdHlwZSk7CisgIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9pOCwgdnR5cGUpOworICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfaTgsIGV0eXBlKTsKKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaW5kZW50KG91dCkgPDwgKGxvY2FsID8gImxvY2FsICIgOiAiIikgPDwgcHJlZml4IDw8ICIgPSB7fSIgPDwgZW5kbDsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJsb2NhbCAiIDw8IGt0eXBlIDw8ICIsICIgPDwgdnR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIgPSBpcHJvdDpyZWFkTWFwQmVnaW4oKSAiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibG9jYWwgIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIiA9IGlwcm90OnJlYWRTZXRCZWdpbigpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibG9jYWwgIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIiA9IGlwcm90OnJlYWRMaXN0QmVnaW4oKSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIERlc2VyaWFsaXplCisgIGluZGVudChvdXQpIDw8ICJmb3IgX2k9MSwiIDw8IHNpemUgPDwgIiBkbyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdDpyZWFkTWFwRW5kKCkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90OnJlYWRTZXRFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90OnJlYWRMaXN0RW5kKCkiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgLy8gQSBtYXAgaXMgcmVwcmVzZW50ZWQgYnkgYSB0YWJsZSBpbmRleGFibGUgYnkgYW55IGx1YSB0eXBlCisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5LCB0cnVlKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCwgdHJ1ZSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCBlbmRsOworfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICAvLyBBIHNldCBpcyByZXByZXNlbnRlZCBieSBhIHRhYmxlIGluZGV4ZWQgYnkgdGhlIHZhbHVlCisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIHRydWUpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwgZWxlbSA8PCAiXSA9ICIgPDwgZWxlbSA8PCBlbmRsOworfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICAvLyBBIGxpc3QgaXMgcmVwcmVzZW50ZWQgYnkgYSB0YWJsZSBpbmRleGVkIGJ5IGludGVnZXIgdmFsdWVzCisgIC8vIExVQSBuYXRpdmVseSBwcm92aWRlcyBhbGwgb2YgdGhlIGZ1bmN0aW9ucyByZXF1aXJlZCB0byBtYWludGFpbiBhIGxpc3QKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIHRydWUpOworCisgIGluZGVudChvdXQpIDw8ICJ0YWJsZS5pbnNlcnQoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCBlbGVtIDw8ICIpIiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZSAoV3JpdGUpCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6IjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiOndyaXRlKG9wcm90KSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIC8vIEJlZ2luIHdyaXRpbmcKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJ0dGFibGVfc2l6ZSgiIDw8IHByZWZpeCA8PCAiKSkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlU2V0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAidHRhYmxlX3NpemUoIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVMaXN0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAiIyIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsOworICB9CisKKyAgLy8gU2VyaWFsaXplCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7CisgICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgIiA8PCBraXRlciA8PCAiLCIgPDwgdml0ZXIgPDwgIiBpbiBwYWlycygiIDw8IHByZWZpeCA8PCAiKSBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgIiA8PCBpdGVyIDw8ICIsXyBpbiBwYWlycygiIDw8IHByZWZpeCA8PCAiKSBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvciBfLCIgPDwgaXRlciA8PCAiIGluIGlwYWlycygiIDw8IHByZWZpeCA8PCAiKSBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEZpbmlzaCB3cml0aW5nCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVNYXBFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVTZXRFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlTGlzdEVuZCgpIiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOworCisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiAgSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAqLworc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6bHVhX2luY2x1ZGVzKCkgeworICBpZiAoZ2VuX3JlcXVpcmVzXykgeworICAgIHJldHVybiAiXG5cbnJlcXVpcmUgJ1RocmlmdCciOworICB9IGVsc2UgeworICAgIHJldHVybiAiIjsKKyAgfQorfQorCitzdHJpbmcgdF9sdWFfZ2VuZXJhdG9yOjpnZXRfbmFtZXNwYWNlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworICBzdGQ6OnN0cmluZyByZWFsX21vZHVsZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImx1YSIpOworICBpZiAocmVhbF9tb2R1bGUuZW1wdHkoKSkgeworICAgIHJldHVybiBwcm9ncmFtLT5nZXRfbmFtZSgpICsgIl8iOworICB9CisgIHJldHVybiByZWFsX21vZHVsZSArICJfIjsKK30KKworc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZClwcmVmaXg7CisgIHN0ZDo6c3RyaW5nIHJldCA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKKyAgcmV0dXJuIHJldDsKK30KKworc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgc3RkOjpzdHJpbmcgcmV0ID0gIiI7CisgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgeworICAgIHJldCArPSBwcmVmaXggKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICArK2ZsZF9pdGVyOworICAgIGlmIChmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCkpIHsKKyAgICAgIHJldCArPSAiLCAiOworICAgIH0KKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdHJpbmcgdF9sdWFfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgbHVhLAorICAgICJMdWEiLAorICAgICIgICAgb21pdF9yZXF1aXJlczogICBTdXBwcmVzcyBnZW5lcmF0aW9uIG9mIHJlcXVpcmUgJ3NvbWVmaWxlJy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmU3ZGEwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDMxMTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworLy9UT0RPOiBjaGVjayBmb3IgaW5kZW50YXRpb24KKy8vVE9ETzogRG8gd2UgbmVlZCBzZXFJZF8gaW4gZ2VuZXJhdGlvbj8KKwordF9uZXRjb3JlX2dlbmVyYXRvcjo6dF9uZXRjb3JlX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLCBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKK3sKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworCisgICAgbnVsbGFibGVfID0gZmFsc2U7CisgICAgaGFzaGNvZGVfID0gZmFsc2U7CisgICAgdW5pb25fID0gZmFsc2U7CisgICAgc2VyaWFsaXplXyA9IGZhbHNlOworICAgIHdjZl8gPSBmYWxzZTsKKyAgICB3Y2ZfbmFtZXNwYWNlXy5jbGVhcigpOworCisgICAgbWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGZvciAoaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikKKyAgICB7CisgICAgICAgIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJudWxsYWJsZSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG51bGxhYmxlXyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgiaGFzaGNvZGUiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBoYXNoY29kZV8gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoInVuaW9uIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdW5pb25fID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJzZXJpYWwiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBzZXJpYWxpemVfID0gdHJ1ZTsKKyAgICAgICAgICAgIHdjZl9uYW1lc3BhY2VfID0gaXRlci0+c2Vjb25kOyAvLyBzaW5jZSB0aGVyZSBjYW4gYmUgb25seSBvbmUgbmFtZXNwYWNlCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgid2NmIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgd2NmXyA9IHRydWU7CisgICAgICAgICAgICB3Y2ZfbmFtZXNwYWNlXyA9IGl0ZXItPnNlY29uZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBuZXRjb3JlOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLW5ldGNvcmUiOworfQorCitzdGF0aWMgc3RyaW5nIGNvcnJlY3RfZnVuY3Rpb25fbmFtZV9mb3JfYXN5bmMoc3RyaW5nIGNvbnN0JiBmdW5jdGlvbl9uYW1lKQoreworICAgIHN0cmluZyBjb25zdCBhc3luY19lbmQgPSAiQXN5bmMiOworICAgIHNpemVfdCBpID0gZnVuY3Rpb25fbmFtZS5maW5kKGFzeW5jX2VuZCk7CisgICAgaWYgKGkgIT0gc3RyaW5nOjpucG9zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9uX25hbWUgKyBhc3luY19lbmQ7CisgICAgfQorCisgICAgcmV0dXJuIGZ1bmN0aW9uX25hbWU7Cit9CisKKy8qKgorKiBcYnJpZWYgU2VhcmNoIGFuZCByZXBsYWNlICJfYXJncyIgc3Vic3RyaW5nIGluIHN0cnVjdCBuYW1lIGlmIGV4aXN0IChmb3IgQyMgY2xhc3MgbmFtaW5nKQorKiBccGFyYW0gc3RydWN0X25hbWUKKyogXHJldHVybiBNb2RpZmllZCBzdHJ1Y3QgbmFtZSAoIlN0cnVjdF9hcmdzIiAtPiAiU3RydWN0QXJncyIpIG9yIG9yaWdpbmFsIG5hbWUKKyovCitzdGF0aWMgc3RyaW5nIGNoZWNrX2FuZF9jb3JyZWN0X3N0cnVjdF9uYW1lKGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUpCit7CisgICAgc3RyaW5nIGFyZ3NfZW5kID0gIl9hcmdzIjsKKyAgICBzaXplX3QgaSA9IHN0cnVjdF9uYW1lLmZpbmQoYXJnc19lbmQpOworICAgIGlmIChpICE9IHN0cmluZzo6bnBvcykKKyAgICB7CisgICAgICAgIHN0cmluZyBuZXdfc3RydWN0X25hbWUgPSBzdHJ1Y3RfbmFtZTsKKyAgICAgICAgbmV3X3N0cnVjdF9uYW1lLnJlcGxhY2UoaSwgYXJnc19lbmQubGVuZ3RoKCksICJBcmdzIik7CisgICAgICAgIHJldHVybiBuZXdfc3RydWN0X25hbWU7CisgICAgfQorCisgICAgc3RyaW5nIHJlc3VsdF9lbmQgPSAiX3Jlc3VsdCI7CisgICAgc2l6ZV90IGogPSBzdHJ1Y3RfbmFtZS5maW5kKHJlc3VsdF9lbmQpOworICAgIGlmIChqICE9IHN0cmluZzo6bnBvcykKKyAgICB7CisgICAgICAgIHN0cmluZyBuZXdfc3RydWN0X25hbWUgPSBzdHJ1Y3RfbmFtZTsKKyAgICAgICAgbmV3X3N0cnVjdF9uYW1lLnJlcGxhY2UoaiwgcmVzdWx0X2VuZC5sZW5ndGgoKSwgIlJlc3VsdCIpOworICAgICAgICByZXR1cm4gbmV3X3N0cnVjdF9uYW1lOworICAgIH0KKworICAgIHJldHVybiBzdHJ1Y3RfbmFtZTsKK30KKworc3RhdGljIGJvb2wgZmllbGRfaGFzX2RlZmF1bHQodF9maWVsZCogdGZpZWxkKSB7IHJldHVybiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEw7IH0KKworc3RhdGljIGJvb2wgZmllbGRfaXNfcmVxdWlyZWQodF9maWVsZCogdGZpZWxkKSB7IHJldHVybiB0ZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEOyB9CisKK3N0YXRpYyBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkKK3sKKyAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkKKyAgICB7CisgICAgICAgIHR0eXBlID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJpbmcoKTsKK30KKworYm9vbCB0X25ldGNvcmVfZ2VuZXJhdG9yOjppc193Y2ZfZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIHdjZl87IH0KKworYm9vbCB0X25ldGNvcmVfZ2VuZXJhdG9yOjppc19udWxsYWJsZV9lbmFibGVkKCkgY29uc3QgeyByZXR1cm4gbnVsbGFibGVfOyB9CisKK2Jvb2wgdF9uZXRjb3JlX2dlbmVyYXRvcjo6aXNfaGFzaGNvZGVfZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIGhhc2hjb2RlXzsgfQorCitib29sIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmlzX3NlcmlhbGl6ZV9lbmFibGVkKCkgY29uc3QgeyByZXR1cm4gc2VyaWFsaXplXzsgfQorCitib29sIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmlzX3VuaW9uX2VuYWJsZWQoKSBjb25zdCB7IHJldHVybiB1bmlvbl87IH0KKworbWFwPHN0cmluZywgaW50PiB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZXRfa2V5d29yZHNfbGlzdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG5ldGNvcmVfa2V5d29yZHM7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKQoreworICAgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgICAvLyBmb3IgdXNhZ2Ugb2YgY3NoYXJwIG5hbWVzcGFjZXMgaW4gdGhyaWZ0IGZpbGVzIChmcm9tIGZpbGVzIGZvciBjc2hhcnApCisgICAgbmFtZXNwYWNlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoIm5ldGNvcmUiKTsKKyAgICBpZiAobmFtZXNwYWNlX25hbWVfLmVtcHR5KCkpCisgICAgeworICAgICAgICBuYW1lc3BhY2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgibmV0Y29yZSIpOworICAgIH0KKworICAgIHN0cmluZyBkaXIgPSBuYW1lc3BhY2VfbmFtZV87CisgICAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCkuY19zdHIoKTsKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisKKyAgICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykKKyAgICB7CisgICAgICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKKyAgICAgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgICAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOworICAgIH0KKyAgICBpZiAoZGlyLnNpemUoKSA+IDApCisgICAgeworICAgICAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7CisgICAgICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICB9CisKKyAgICBuYW1lc3BhY2VfZGlyXyA9IHN1YmRpcjsKKyAgICBpbml0X2tleXdvcmRzKCk7CisKKyAgICB3aGlsZSAoIW1lbWJlcl9tYXBwaW5nX3Njb3Blcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5iYWNrKCkuc2NvcGVfbWVtYmVyKTsKKyAgICB9CisKKyAgICBwdmVyYm9zZSgiLk5FVCBDb3JlIG9wdGlvbnM6XG4iKTsKKyAgICBwdmVyYm9zZSgiLSBudWxsYWJsZSAuLi4gJXNcbiIsIChudWxsYWJsZV8gPyAiT04iIDogIm9mZiIpKTsKKyAgICBwdmVyYm9zZSgiLSB1bmlvbiAuLi4uLi4gJXNcbiIsICh1bmlvbl8gPyAiT04iIDogIm9mZiIpKTsKKyAgICBwdmVyYm9zZSgiLSBoYXNoY29kZSAuLi4gJXNcbiIsIChoYXNoY29kZV8gPyAiT04iIDogIm9mZiIpKTsKKyAgICBwdmVyYm9zZSgiLSBzZXJpYWxpemUgLi4gJXNcbiIsIChzZXJpYWxpemVfID8gIk9OIiA6ICJvZmYiKSk7CisgICAgcHZlcmJvc2UoIi0gd2NmIC4uLi4uLi4uICVzXG4iLCAod2NmXyA/ICJPTiIgOiAib2ZmIikpOworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6bm9ybWFsaXplX25hbWUoc3RyaW5nIG5hbWUpCit7CisgICAgc3RyaW5nIHRtcChuYW1lKTsKKyAgICB0cmFuc2Zvcm0odG1wLmJlZ2luKCksIHRtcC5lbmQoKSwgdG1wLmJlZ2luKCksIHN0YXRpY19jYXN0PGludCgqKShpbnQpPih0b2xvd2VyKSk7CisKKyAgICAvLyB1bi1jb25mbGljdCBrZXl3b3JkcyBieSBwcmVmaXhpbmcgd2l0aCAiQCIKKyAgICBpZiAobmV0Y29yZV9rZXl3b3Jkcy5maW5kKHRtcCkgIT0gbmV0Y29yZV9rZXl3b3Jkcy5lbmQoKSkKKyAgICB7CisgICAgICAgIHJldHVybiAiQCIgKyBuYW1lOworICAgIH0KKworICAgIC8vIG5vIGNoYW5nZXMgbmVjZXNzYXJ5CisgICAgcmV0dXJuIG5hbWU7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6aW5pdF9rZXl3b3JkcygpCit7CisgICAgbmV0Y29yZV9rZXl3b3Jkcy5jbGVhcigpOworCisgICAgLy8gQyMga2V5d29yZHMKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJhYnN0cmFjdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJhcyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJiYXNlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImJvb2wiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYnJlYWsiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYnl0ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJjYXNlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImNhdGNoIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImNoYXIiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siY2hlY2tlZCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJjbGFzcyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJjb25zdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJjb250aW51ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJkZWNpbWFsIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImRlZmF1bHQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZGVsZWdhdGUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZG8iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZG91YmxlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImVsc2UiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZW51bSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJldmVudCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJleHBsaWNpdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJleHRlcm4iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZmFsc2UiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZmluYWxseSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJmaXhlZCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJmbG9hdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJmb3IiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZm9yZWFjaCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJnb3RvIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImlmIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImltcGxpY2l0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImluIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImludCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJpbnRlcmZhY2UiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siaW50ZXJuYWwiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siaXMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sibG9jayJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJsb25nIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIm5hbWVzcGFjZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJuZXciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sibnVsbCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJvYmplY3QiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sib3BlcmF0b3IiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sib3V0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIm92ZXJyaWRlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInBhcmFtcyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJwcml2YXRlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInByb3RlY3RlZCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJwdWJsaWMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicmVhZG9ubHkiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicmVmIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInJldHVybiJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzYnl0ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzZWFsZWQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic2hvcnQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic2l6ZW9mIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInN0YWNrYWxsb2MiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic3RhdGljIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInN0cmluZyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzdHJ1Y3QiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic3dpdGNoIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInRoaXMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidGhyb3ciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidHJ1ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ0cnkiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidHlwZW9mIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInVpbnQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidWxvbmciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidW5jaGVja2VkIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInVuc2FmZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ1c2hvcnQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidXNpbmciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidmlydHVhbCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ2b2lkIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInZvbGF0aWxlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIndoaWxlIl0gPSAxOworCisgICAgLy8gQyMgY29udGV4dHVhbCBrZXl3b3JkcworICAgIG5ldGNvcmVfa2V5d29yZHNbImFkZCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJhbGlhcyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJhc2NlbmRpbmciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYXN5bmMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYXdhaXQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZGVzY2VuZGluZyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJkeW5hbWljIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImZyb20iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZ2V0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImdsb2JhbCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJncm91cCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJpbnRvIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImpvaW4iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sibGV0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIm9yZGVyYnkiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicGFydGlhbCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJyZW1vdmUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic2VsZWN0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInNldCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ2YWx1ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ2YXIiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sid2hlcmUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sieWllbGQiXSA9IDE7CisKKwluZXRjb3JlX2tleXdvcmRzWyJ3aGVuIl0gPSAxOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnN0YXJ0X25ldGNvcmVfbmFtZXNwYWNlKG9zdHJlYW0mIG91dCkKK3sKKyAgICBpZiAoIW5hbWVzcGFjZV9uYW1lXy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8ICJuYW1lc3BhY2UgIiA8PCBuYW1lc3BhY2VfbmFtZV8gPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6ZW5kX25ldGNvcmVfbmFtZXNwYWNlKG9zdHJlYW0mIG91dCkKK3sKKyAgICBpZiAoIW5hbWVzcGFjZV9uYW1lXy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0KK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6Om5ldGNvcmVfdHlwZV91c2luZ3MoKSBjb25zdAoreworICAgIHN0cmluZyBuYW1lc3BhY2VzID0KKyAgICAgICAgInVzaW5nIFN5c3RlbTtcbiIKKyAgICAgICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucztcbiIKKyAgICAgICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljO1xuIgorICAgICAgICAidXNpbmcgU3lzdGVtLlRleHQ7XG4iCisgICAgICAgICJ1c2luZyBTeXN0ZW0uSU87XG4iCisgICAgICAgICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nO1xuIgorICAgICAgICAidXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrcztcbiIKKyAgICAgICAgInVzaW5nIFRocmlmdDtcbiIKKyAgICAgICAgInVzaW5nIFRocmlmdC5Db2xsZWN0aW9ucztcbiI7CisKKyAgICBpZiAod2NmXykKKyAgICB7CisgICAgICAgIG5hbWVzcGFjZXMgKz0gInVzaW5nIFN5c3RlbS5TZXJ2aWNlTW9kZWw7XG4iOworICAgICAgICBuYW1lc3BhY2VzICs9ICJ1c2luZyBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uO1xuIjsKKyAgICB9CisKKyAgICByZXR1cm4gbmFtZXNwYWNlcyArIGVuZGw7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpuZXRjb3JlX3RocmlmdF91c2luZ3MoKSBjb25zdAoreworICAgIHN0cmluZyBuYW1lc3BhY2VzID0KKyAgICAgICAgInVzaW5nIFRocmlmdC5Qcm90b2NvbHM7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzO1xuIgorICAgICAgICAidXNpbmcgVGhyaWZ0LlByb3RvY29scy5VdGlsaXRpZXM7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQuVHJhbnNwb3J0cztcbiIKKyAgICAgICAgInVzaW5nIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudDtcbiIKKyAgICAgICAgInVzaW5nIFRocmlmdC5UcmFuc3BvcnRzLlNlcnZlcjtcbiI7CisKKyAgICByZXR1cm4gbmFtZXNwYWNlcyArIGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkKK3sKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpCit7CisgICAgKHZvaWQpdHR5cGVkZWY7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKQoreworCWludCBpYyA9IGluZGVudF9jb3VudCgpOworICAgIHN0cmluZyBmX2VudW1fbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgdGVudW0tPmdldF9uYW1lKCkgKyAiLmNzIjsKKworICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9lbnVtOworICAgIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lLmNfc3RyKCkpOworCisJZ2VuZXJhdGVfZW51bShmX2VudW0sIHRlbnVtKTsKKworICAgIGZfZW51bS5jbG9zZSgpOworCWluZGVudF92YWxpZGF0ZShpYywgImdlbmVyYXRlX2VudW0iKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKG9zdHJlYW0mIG91dCwgdF9lbnVtKiB0ZW51bSkKK3sKKwlvdXQgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKworCXN0YXJ0X25ldGNvcmVfbmFtZXNwYWNlKG91dCk7CisJZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCB0ZW51bSk7CisKKwlvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBlbnVtICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgZW5kbDsKKwlzY29wZV91cChvdXQpOworCisJdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisJdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisKKwlmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikKKwl7CisJCWdlbmVyYXRlX25ldGNvcmVfZG9jKG91dCwgKmNfaXRlcik7CisJCWludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisJCW91dCA8PCBpbmRlbnQoKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgIiwiIDw8IGVuZGw7CisJfQorCisJc2NvcGVfZG93bihvdXQpOworCWVuZF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykKK3sKKyAgICBpZiAoY29uc3RzLmVtcHR5KCkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICcvJyArIHByb2dyYW1fbmFtZV8gKyAiLkNvbnN0YW50cy5jcyI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0czsKKyAgICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgICBnZW5lcmF0ZV9jb25zdHMoZl9jb25zdHMsIGNvbnN0cyk7CisKKyAgICBmX2NvbnN0cy5jbG9zZSgpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhvc3RyZWFtJiBvdXQsIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKQoreworICAgIGlmIChjb25zdHMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBvdXQgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbmV0Y29yZV90eXBlX3VzaW5ncygpIDw8IGVuZGw7CisKKyAgICBzdGFydF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzICIgPDwgbWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihwcm9ncmFtX25hbWVfKSA8PCAiQ29uc3RhbnRzIiA8PCBlbmRsOworCisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgICBib29sIG5lZWRfc3RhdGljX2NvbnN0cnVjdG9yID0gZmFsc2U7CisgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvdXQsICpjX2l0ZXIpOworICAgICAgICBpZiAocHJpbnRfY29uc3RfdmFsdWUob3V0LCAoKmNfaXRlciktPmdldF9uYW1lKCksICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwgZmFsc2UpKQorICAgICAgICB7CisgICAgICAgICAgICBuZWVkX3N0YXRpY19jb25zdHJ1Y3RvciA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobmVlZF9zdGF0aWNfY29uc3RydWN0b3IpCisgICAgeworICAgICAgICBwcmludF9jb25zdF9jb25zdHJ1Y3RvcihvdXQsIGNvbnN0cyk7CisgICAgfQorCisgICAgc2NvcGVfZG93bihvdXQpOworICAgIGVuZF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X2RlZl92YWx1ZShvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKQoreworICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKQorICAgIHsKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gc3RhdGljX2Nhc3Q8dF9zdHJ1Y3QqPih0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICAgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHN0YXRpY19jYXN0PHRfc3RydWN0Kj4odHlwZSkpOworCisgICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICB0X2ZpZWxkKiBmaWVsZCA9IE5VTEw7CisKKyAgICAgICAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmllbGQgPSAqZl9pdGVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZpZWxkID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisKKyAgICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiLiIgPDwgcHJvcF9uYW1lKGZpZWxkKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoc3RhdGljX2Nhc3Q8dF9zdHJ1Y3QqPih0eXBlKSk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgdF90eXBlKiBrdHlwZSA9IHN0YXRpY19jYXN0PHRfbWFwKj4odHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgICB0X3R5cGUqIHZ0eXBlID0gc3RhdGljX2Nhc3Q8dF9tYXAqPih0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgICAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIlsiIDw8IGtleSA8PCAiXSIgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIHRfdHlwZSogZXR5cGU7CisgICAgICAgIGlmICh0eXBlLT5pc19saXN0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGV0eXBlID0gc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGV0eXBlID0gc3RhdGljX2Nhc3Q8dF9zZXQqPih0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiLkFkZCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfY29uc3RydWN0b3Iob3N0cmVhbSYgb3V0LCB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInN0YXRpYyAiIDw8IG1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIocHJvZ3JhbV9uYW1lXykuY19zdHIoKSA8PCAiQ29uc3RhbnRzKCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikKKyAgICB7CisgICAgICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgICAgICBwcmludF9jb25zdF9kZWZfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworYm9vbCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGluX3N0YXRpYywgYm9vbCBkZWZ2YWwsIGJvb2wgbmVlZHR5cGUpCit7CisgICAgb3V0IDw8IGluZGVudCgpOworICAgIGJvb2wgbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uID0gIWluX3N0YXRpYzsKKyAgICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKQorICAgIHsKKyAgICAgICAgdHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIGlmICghZGVmdmFsIHx8IG5lZWR0eXBlKQorICAgIHsKKyAgICAgICAgb3V0IDw8IChpbl9zdGF0aWMgPyAiIiA6IHR5cGUtPmlzX2Jhc2VfdHlwZSgpID8gInB1YmxpYyBjb25zdCAiIDogInB1YmxpYyBzdGF0aWMgIikgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgICB9CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgeworICAgICAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgICAgIG91dCA8PCBub3JtYWxpemVfbmFtZShuYW1lKSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uID0gZmFsc2U7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9IGZhbHNlOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChkZWZ2YWwgJiYgIXR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0eXBlLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICBwcmludF9jb25zdF9kZWZfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbjsKK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKQoreworICAgICh2b2lkKW5hbWU7CisgICAgb3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgeworICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPih0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgc3dpdGNoICh0YmFzZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkKKyAgICB7CisgICAgICAgIHJlbmRlciA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUsIHRydWUsIHRydWUpOworICAgICAgICByZW5kZXIgPDwgdDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBpZiAodW5pb25fICYmIHRzdHJ1Y3QtPmlzX3VuaW9uKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uKHRzdHJ1Y3QpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pCit7CisgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pCit7CisgICAgaW50IGljID0gaW5kZW50X2NvdW50KCk7CisKKyAgICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgKHRzdHJ1Y3QtPmdldF9uYW1lKCkpICsgIi5jcyI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3N0cnVjdDsKKworICAgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKworICAgIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IG5ldGNvcmVfdHlwZV91c2luZ3MoKSA8PCBuZXRjb3JlX3RocmlmdF91c2luZ3MoKSA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKworICAgIGZfc3RydWN0LmNsb3NlKCk7CisKKyAgICBpbmRlbnRfdmFsaWRhdGUoaWMsICJnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdCIpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24sIGJvb2wgaW5fY2xhc3MsIGJvb2wgaXNfcmVzdWx0KQoreworICAgIGlmICghaW5fY2xhc3MpCisgICAgeworICAgICAgICBzdGFydF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCB0c3RydWN0KTsKKyAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodHN0cnVjdCk7CisKKyAgICBpZiAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgJiYgIWlzX2V4Y2VwdGlvbikKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFDb250cmFjdChOYW1lc3BhY2U9XCIiIDw8IHdjZl9uYW1lc3BhY2VfIDw8ICJcIildIiA8PCBlbmRsOworICAgIH0KKworICAgIGJvb2wgaXNfZmluYWwgPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCk7CisKKyAgICBzdHJpbmcgc2hhcnBfc3RydWN0X25hbWUgPSBjaGVja19hbmRfY29ycmVjdF9zdHJ1Y3RfbmFtZShub3JtYWxpemVfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJzZWFsZWQgIiA6ICIiKSA8PCAicGFydGlhbCBjbGFzcyAiIDw8IHNoYXJwX3N0cnVjdF9uYW1lIDw8ICIgOiAiOworCisgICAgaWYgKGlzX2V4Y2VwdGlvbikKKyAgICB7CisgICAgICAgIG91dCA8PCAiVEV4Y2VwdGlvbiwgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIlRCYXNlIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgICAgLy8gbWFrZSBwcml2YXRlIG1lbWJlcnMgd2l0aCBwdWJsaWMgUHJvcGVydGllcworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCisgICAgeworICAgICAgICAvLyBpZiB0aGUgZmllbGQgaXMgcmVxdWllZCwgdGhlbiB3ZSB1c2UgYXV0by1wcm9wZXJ0aWVzCisgICAgICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSAmJiAoIW51bGxhYmxlXyB8fCBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcml2YXRlICIgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgIl8iKSA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorICAgIG91dCA8PCBlbmRsOworCisgICAgYm9vbCBoYXNfbm9uX3JlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICAgIGJvb2wgaGFzX25vbl9yZXF1aXJlZF9kZWZhdWx0X3ZhbHVlX2ZpZWxkcyA9IGZhbHNlOworICAgIGJvb2wgaGFzX3JlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvdXQsICptX2l0ZXIpOworICAgICAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIHRydWUpOworICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKTsKKyAgICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqbV9pdGVyKSk7CisgICAgICAgIGlmIChpc19yZXF1aXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgaGFzX3JlcXVpcmVkX2ZpZWxkcyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaGFzX2RlZmF1bHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFzX25vbl9yZXF1aXJlZF9kZWZhdWx0X3ZhbHVlX2ZpZWxkcyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYXNfbm9uX3JlcXVpcmVkX2ZpZWxkcyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGdlbmVyYXRlX2lzc2V0ID0gKG51bGxhYmxlXyAmJiBoYXNfbm9uX3JlcXVpcmVkX2RlZmF1bHRfdmFsdWVfZmllbGRzKSB8fCAoIW51bGxhYmxlXyAmJiBoYXNfbm9uX3JlcXVpcmVkX2ZpZWxkcyk7CisgICAgaWYgKGdlbmVyYXRlX2lzc2V0KQorICAgIHsKKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICAgIGlmIChzZXJpYWxpemVfIHx8IHdjZl8pCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFNZW1iZXIoT3JkZXIgPSAxKV0iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgSXNzZXQgX19pc3NldDsiIDw8IGVuZGw7CisgICAgICAgIGlmIChzZXJpYWxpemVfIHx8IHdjZl8pCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFDb250cmFjdF0iIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBzdHJ1Y3QgSXNzZXQiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKTsKKyAgICAgICAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpOworICAgICAgICAgICAgLy8gaWYgaXQgaXMgcmVxdWlyZWQsIGRvbid0IG5lZWQgSXNzZXQgZm9yIHRoYXQgdmFyaWFibGUKKyAgICAgICAgICAgIC8vIGlmIGl0IGlzIG5vdCByZXF1aXJlZCwgaWYgaXQgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgd2UgbmVlZCB0byBnZW5lcmF0ZSBJc3NldAorICAgICAgICAgICAgLy8gaWYgd2UgYXJlIG5vdCBudWxsYWJsZSwgdGhlbiB3ZSBnZW5lcmF0ZSBJc3NldAorICAgICAgICAgICAgaWYgKCFpc19yZXF1aXJlZCAmJiAoIW51bGxhYmxlXyB8fCBoYXNfZGVmYXVsdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZV8gfHwgd2NmXykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFNZW1iZXJdIiA8PCBlbmRsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBib29sICIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICAgIGlmIChnZW5lcmF0ZV9pc3NldCAmJiAoc2VyaWFsaXplXyB8fCB3Y2ZfKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIjcmVnaW9uIFhtbFNlcmlhbGl6ZXIgc3VwcG9ydCIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICAgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgqbV9pdGVyKTsKKyAgICAgICAgICAgICAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKm1faXRlcik7CisgICAgICAgICAgICAgICAgLy8gaWYgaXQgaXMgcmVxdWlyZWQsIGRvbid0IG5lZWQgSXNzZXQgZm9yIHRoYXQgdmFyaWFibGUKKyAgICAgICAgICAgICAgICAvLyBpZiBpdCBpcyBub3QgcmVxdWlyZWQsIGlmIGl0IGhhcyBhIGRlZmF1bHQgdmFsdWUsIHdlIG5lZWQgdG8gZ2VuZXJhdGUgSXNzZXQKKyAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IG51bGxhYmxlLCB0aGVuIHdlIGdlbmVyYXRlIElzc2V0CisgICAgICAgICAgICAgICAgaWYgKCFpc19yZXF1aXJlZCAmJiAoIW51bGxhYmxlXyB8fCBoYXNfZGVmYXVsdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBib29sIFNob3VsZFNlcmlhbGl6ZSIgPDwgcHJvcF9uYW1lKCptX2l0ZXIpIDw8ICIoKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiNlbmRyZWdpb24gWG1sU2VyaWFsaXplciBzdXBwb3J0IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXZSBhbHdheXMgd2FudCBhIGRlZmF1bHQsIG5vIGFyZ3VtZW50IGNvbnN0cnVjdG9yIGZvciBSZWFkaW5nCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCBzaGFycF9zdHJ1Y3RfbmFtZSA8PCAiKCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgIHsKKyAgICAgICAgdF90eXBlKiB0ID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKQorICAgICAgICB7CisgICAgICAgICAgICB0ID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odCktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy4iICsgcHJvcF9uYW1lKCptX2l0ZXIpLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICJ0aGlzLl8iICsgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAvLyBPcHRpb25hbHMgd2l0aCBkZWZhdWx0cyBhcmUgbWFya2VkIHNldAorICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy5fX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGlmIChoYXNfcmVxdWlyZWRfZmllbGRzKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCBzaGFycF9zdHJ1Y3RfbmFtZSA8PCAiKCI7CisgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKm1faXRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dCA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG91dCA8PCAiKSA6IHRoaXMoKSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgqbV9pdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMuIiA8PCBwcm9wX25hbWUoKm1faXRlcikgPDwgIiA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgICAgaWYgKGlzX3Jlc3VsdCkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgICAgfQorICAgIGlmIChoYXNoY29kZV8pCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9lcXVhbHMob3V0LCB0c3RydWN0KTsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfaGFzaGNvZGUob3V0LCB0c3RydWN0KTsKKyAgICB9CisgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBnZW5lcmF0ZSBhIGNvcnJlc3BvbmRpbmcgV0NGIGZhdWx0IHRvIHdyYXAgdGhlIGV4Y2VwdGlvbgorICAgIGlmICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSAmJiBpc19leGNlcHRpb24pCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3djZmZhdWx0KG91dCwgdHN0cnVjdCk7CisgICAgfQorCisgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHRzdHJ1Y3QpOworICAgIGlmICghaW5fY2xhc3MpCisgICAgeworICAgICAgICBlbmRfbmV0Y29yZV9uYW1lc3BhY2Uob3V0KTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV93Y2ZmYXVsdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFDb250cmFjdF0iIDw8IGVuZGw7CisKKyAgICBib29sIGlzX2ZpbmFsID0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAic2VhbGVkICIgOiAiIikgPDwgInBhcnRpYWwgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJGYXVsdCIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICAgIC8vIG1ha2UgcHJpdmF0ZSBtZW1iZXJzIHdpdGggcHVibGljIFByb3BlcnRpZXMKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcml2YXRlICIgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgIl8iKSA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFzeW5jIFRhc2sgUmVhZEFzeW5jKFRQcm90b2NvbCBpcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgLy8gUmVxdWlyZWQgdmFyaWFibGVzIGFyZW4ndCBpbiBfX2lzc2V0LCBzbyB3ZSBuZWVkIHRtcCB2YXJzIHRvIGNoZWNrIHRoZW0KKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgqZl9pdGVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sIGlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRGaWVsZCBmaWVsZDsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZpZWxkID0gYXdhaXQgaXByb3QuUmVhZEZpZWxkQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggKGZpZWxkLklEKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCpmX2l0ZXIpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7CisgICAgICAgIGlmIChpc19yZXF1aXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgVFByb3RvY29sVXRpbC5Ta2lwQXN5bmMoaXByb3QsIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6ICIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlwcm90LCBmaWVsZC5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIWlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7CisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhc3luYyBUYXNrIFdyaXRlQXN5bmMoVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgc3RydWMgPSBuZXcgVFN0cnVjdChcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKHN0cnVjLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsOworICAgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCpmX2l0ZXIpOworICAgICAgICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCpmX2l0ZXIpOworICAgICAgICAgICAgaWYgKG51bGxhYmxlXyAmJiAhaGFzX2RlZmF1bHQgJiYgIWlzX3JlcXVpcmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICIgIT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghaXNfcmVxdWlyZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICAgICAgICAgICAgaWYgKG51bGxfYWxsb3dlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICIgIT0gbnVsbCAmJiBfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmllbGQuTmFtZSA9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5UeXBlID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5JRCA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZmllbGQsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICAgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOworCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgICAgICAgICAgaWYgKCFpc19yZXF1aXJlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZFN0b3BBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZVN0cnVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhc3luYyBUYXNrIFdyaXRlQXN5bmMoVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgc3RydWMgPSBuZXcgVFN0cnVjdChcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKHN0cnVjLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsOworICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbHNlIGlmIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG51bGxhYmxlXykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIih0aGlzLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIih0aGlzLl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gIW51bGxhYmxlXyAmJiB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICAgICAgICBpZiAobnVsbF9hbGxvd2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICIgIT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmllbGQuTmFtZSA9IFwiIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIlwiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5UeXBlID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5JRCA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZmllbGQsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICAgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOworCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgICAgICAgICBpZiAobnVsbF9hbGxvd2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUZpZWxkU3RvcEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIgPDwgZW5kbDsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgYm9vbCB1c2VGaXJzdEZsYWcgPSBmYWxzZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sIF9fZmlyc3QgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIHVzZUZpcnN0RmxhZyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYm9vbCBoYWRfcmVxdWlyZWQgPSBmYWxzZTsgLy8gc2V0IHRvIHRydWUgYWZ0ZXIgZmlyc3QgcmVxdWlyZWQgZmllbGQgaGFzIGJlZW4gcHJvY2Vzc2VkCisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpOworICAgICAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKTsKKyAgICAgICAgaWYgKG51bGxhYmxlXyAmJiAhaGFzX2RlZmF1bHQgJiYgIWlzX3JlcXVpcmVkKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFpc19yZXF1aXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICAgICAgICBpZiAobnVsbF9hbGxvd2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsICYmIF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHVzZUZpcnN0RmxhZyAmJiAoIWhhZF9yZXF1aXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYoIV9fZmlyc3QpIHsgc2IuQXBwZW5kKFwiLCBcIik7IH0iIDw8IGVuZGw7CisgICAgICAgICAgICBpZiAoIWlzX3JlcXVpcmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX19maXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2IuQXBwZW5kKFwiIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIjogXCIpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2IuQXBwZW5kKFwiLCAiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiOiBcIik7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgaWYgKHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzYi5BcHBlbmQoIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIj09IG51bGwgPyBcIjxudWxsPlwiIDogIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIi5Ub1N0cmluZygpKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNiLkFwcGVuZCgiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzX3JlcXVpcmVkKQorICAgICAgICB7CisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaGFkX3JlcXVpcmVkID0gdHJ1ZTsgLy8gbm93IF9fZmlyc3QgbXVzdCBiZSBmYWxzZSwgc28gd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBpdCBhbnltb3JlCisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNiLkFwcGVuZChcIilcIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2IuVG9TdHJpbmcoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV91bmlvbih0X3N0cnVjdCogdHVuaW9uKQoreworICAgIGludCBpYyA9IGluZGVudF9jb3VudCgpOworCisgICAgc3RyaW5nIGZfdW5pb25fbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgKHR1bmlvbi0+Z2V0X25hbWUoKSkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdW5pb247CisKKyAgICBmX3VuaW9uLm9wZW4oZl91bmlvbl9uYW1lLmNfc3RyKCkpOworCisgICAgZl91bmlvbiA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBuZXRjb3JlX3R5cGVfdXNpbmdzKCkgPDwgbmV0Y29yZV90aHJpZnRfdXNpbmdzKCkgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX25ldGNvcmVfdW5pb25fZGVmaW5pdGlvbihmX3VuaW9uLCB0dW5pb24pOworCisgICAgZl91bmlvbi5jbG9zZSgpOworCisgICAgaW5kZW50X3ZhbGlkYXRlKGljLCAiZ2VuZXJhdGVfbmV0Y29yZV91bmlvbi4iKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKQoreworICAgIC8vIExldCdzIGRlZmluZSB0aGUgY2xhc3MgZmlyc3QKKyAgICBzdGFydF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYWJzdHJhY3QgcGFydGlhbCBjbGFzcyAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIDogVEFic3RyYWN0QmFzZSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgdFByb3RvY29sLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgcmVhZG9ubHkgYm9vbCBJc3NldDsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhYnN0cmFjdCBvYmplY3QgRGF0YSB7IGdldDsgfSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIoYm9vbCBpc3NldCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJJc3NldCA9IGlzc2V0OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgY2xhc3MgX19fdW5kZWZpbmVkIDogIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIG9iamVjdCBEYXRhIHsgZ2V0IHsgcmV0dXJuIG51bGw7IH0gfSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIF9fX3VuZGVmaW5lZCgpIDogYmFzZShmYWxzZSkge30iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsIFwiQ2Fubm90IHBlcnNpc3QgYW4gdW5pb24gdHlwZSB3aGljaCBpcyBub3Qgc2V0LlwiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHVuaW9uLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV91bmlvbl9jbGFzcyhvdXQsIHR1bmlvbiwgKCpmX2l0ZXIpKTsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX3JlYWRlcihvdXQsIHR1bmlvbik7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgZW5kX25ldGNvcmVfbmFtZXNwYWNlKG91dCk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV91bmlvbl9jbGFzcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24sIHRfZmllbGQqIHRmaWVsZCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIDogIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICIgX2RhdGE7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IERhdGEgeyBnZXQgeyByZXR1cm4gX2RhdGE7IH0gfSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIGRhdGEpIDogYmFzZSh0cnVlKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMuX2RhdGEgPSBkYXRhOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgc3RydWMgPSBuZXcgVFN0cnVjdChcIiIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luQXN5bmMoc3RydWMsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBmaWVsZCA9IG5ldyBURmllbGQoKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZpZWxkLk5hbWUgPSBcIiIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZpZWxkLlR5cGUgPSAiIDw8IHR5cGVfdG9fZW51bSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5JRCA9ICIgPDwgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRCZWdpbkFzeW5jKGZpZWxkLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgdGZpZWxkLCAiX2RhdGEiLCB0cnVlLCB0cnVlKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRTdG9wQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfZXF1YWxzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IHRoYXQpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIG90aGVyID0gdGhhdCBhcyAiIDw8IGNoZWNrX2FuZF9jb3JyZWN0X3N0cnVjdF9uYW1lKG5vcm1hbGl6ZV9uYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKG90aGVyID09IG51bGwpIHJldHVybiBmYWxzZTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChSZWZlcmVuY2VFcXVhbHModGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiOworICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJiYgIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkgJiYgIShudWxsYWJsZV8gJiYgIWZpZWxkX2hhc19kZWZhdWx0KCgqZl9pdGVyKSkpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIigoX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9PSBvdGhlci5fX2lzc2V0LiIKKyAgICAgICAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpICYmICgoIV9faXNzZXQuIgorICAgICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgfHwgKCI7CisgICAgICAgIH0KKyAgICAgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfYmluYXJ5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiVENvbGxlY3Rpb25zLkVxdWFscygiOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICJTeXN0ZW0uT2JqZWN0LkVxdWFscygiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiLCBvdGhlci4iIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIpIjsKKyAgICAgICAgaWYgKCFmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpICYmICEobnVsbGFibGVfICYmICFmaWVsZF9oYXNfZGVmYXVsdCgoKmZfaXRlcikpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIpKSkiOworICAgICAgICB9CisgICAgfQorICAgIGlmIChmaXJzdCkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9oYXNoY29kZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImludCBoYXNoY29kZSA9IDA7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidW5jaGVja2VkIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJoYXNoY29kZSA9IChoYXNoY29kZSAqIDM5NykgXiAiOworICAgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChudWxsYWJsZV8pCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiA9PSBudWxsID8gMCA6ICI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIighX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA/IDAgOiAiOworICAgICAgICB9CisgICAgICAgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKFRDb2xsZWN0aW9ucy5HZXRIYXNoQ29kZSgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIpKSI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIigiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIuR2V0SGFzaENvZGUoKSkiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gaGFzaGNvZGU7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpCit7CisgICAgaW50IGljID0gaW5kZW50X2NvdW50KCk7CisKKyAgICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiLmNzIjsKKyAgICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZTsKKyAgICBmX3NlcnZpY2Uub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICAgIGZfc2VydmljZSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBuZXRjb3JlX3R5cGVfdXNpbmdzKCkgPDwgbmV0Y29yZV90aHJpZnRfdXNpbmdzKCkgPDwgZW5kbDsKKworICAgIHN0YXJ0X25ldGNvcmVfbmFtZXNwYWNlKGZfc2VydmljZSk7CisKKyAgICBmX3NlcnZpY2UgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBwYXJ0aWFsIGNsYXNzICIgPDwgbm9ybWFsaXplX25hbWUoc2VydmljZV9uYW1lXykgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKGZfc2VydmljZSwgdHNlcnZpY2UpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KGZfc2VydmljZSwgdHNlcnZpY2UpOworICAgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKGZfc2VydmljZSwgdHNlcnZpY2UpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyhmX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgZW5kX25ldGNvcmVfbmFtZXNwYWNlKGZfc2VydmljZSk7CisgICAgZl9zZXJ2aWNlLmNsb3NlKCk7CisKKyAgICBpbmRlbnRfdmFsaWRhdGUoaWMsICJnZW5lcmF0ZV9zZXJ2aWNlLiIpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkKK3sKKyAgICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICAgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7CisgICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpCisgICAgeworICAgICAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICAgICAgZXh0ZW5kc19pZmFjZSA9ICIgOiAiICsgZXh0ZW5kcyArICIuSUFzeW5jIjsKKyAgICB9CisKKyAgICAvL291dCA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvdXQsIHRzZXJ2aWNlKTsKKworICAgIGlmICh3Y2ZfKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbU2VydmljZUNvbnRyYWN0KE5hbWVzcGFjZT1cIiIgPDwgd2NmX25hbWVzcGFjZV8gPDwgIlwiKV0iIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElBc3luYyIgPDwgZXh0ZW5kc19pZmFjZSA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfZG9jKG91dCwgKmZfaXRlcik7CisKKyAgICAgICAgLy8gaWYgd2UncmUgdXNpbmcgV0NGLCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlcworICAgICAgICBpZiAod2NmXykKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbT3BlcmF0aW9uQ29udHJhY3RdIiA8PCBlbmRsOworCisgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0ZhdWx0Q29udHJhY3QodHlwZW9mKCIgKyB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIkZhdWx0KSldIiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYygqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpCit7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgdHMsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyhvdXQsICpmX2l0ZXIpOworICAgIH0KK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpCit7CisgICAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgICAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLkNsaWVudCwgIjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXh0ZW5kc19jbGllbnQgPSAiVEJhc2VDbGllbnQsIElEaXNwb3NhYmxlLCAiOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCB0c2VydmljZSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBjbGFzcyBDbGllbnQgOiAiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICJJQXN5bmMiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBDbGllbnQoVFByb3RvY29sIHByb3RvY29sKSA6IHRoaXMocHJvdG9jb2wsIHByb3RvY29sKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBpbnB1dFByb3RvY29sLCBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wpIDogYmFzZShpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkiCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZ1bmN0aW9uc19pdGVyYXRvcjsKKworICAgIGZvciAoZnVuY3Rpb25zX2l0ZXJhdG9yID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uc19pdGVyYXRvciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY3Rpb25zX2l0ZXJhdG9yKQorICAgIHsKKyAgICAgICAgc3RyaW5nIGZ1bmN0aW9uX25hbWUgPSBjb3JyZWN0X2Z1bmN0aW9uX25hbWVfZm9yX2FzeW5jKCgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X25hbWUoKSk7CisKKyAgICAgICAgLy8gYXN5bmMKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYXN5bmMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmMoKmZ1bmN0aW9uc19pdGVyYXRvciwgIiIpIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF9uYW1lKCkgKyAiQXJncyI7CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBPdXRwdXRQcm90b2NvbC5Xcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVuY3Rpb25fbmFtZQorICAgICAgICAgICAgPDwgIlwiLCAiIDw8ICgoKmZ1bmN0aW9uc19pdGVyYXRvciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PbmV3YXkiIDogIlRNZXNzYWdlVHlwZS5DYWxsIikgPDwgIiwgU2VxSWQpLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidmFyIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfYXJnbGlzdCgpOworICAgICAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworCisgICAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZsZF9pdGVyKSA8PCAiID0gIiA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGFyZ3MuV3JpdGVBc3luYyhPdXRwdXRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IE91dHB1dFByb3RvY29sLldyaXRlTWVzc2FnZUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBPdXRwdXRQcm90b2NvbC5UcmFuc3BvcnQuRmx1c2hBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgICAgIGlmICghKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5pc19vbmV3YXkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF9uYW1lKCkgKyAiUmVzdWx0IjsKKyAgICAgICAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICAgICAgICB0X3N0cnVjdCogeHMgPSAoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgICAgICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh4cywgeHMtPmdldF9tZW1iZXJzKCksIHJlc3VsdG5hbWUpOworCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ2YXIgbXNnID0gYXdhaXQgSW5wdXRQcm90b2NvbC5SZWFkTWVzc2FnZUJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAobXNnLlR5cGUgPT0gVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciB4ID0gYXdhaXQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlJlYWRBc3luYyhJbnB1dFByb3RvY29sLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IElucHV0UHJvdG9jb2wuUmVhZE1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocm93IHg7IiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IHJlc3VsdC5SZWFkQXN5bmMoSW5wdXRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBJbnB1dFByb3RvY29sLlJlYWRNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgICAgICAgICAgaWYgKCEoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobnVsbGFibGVfKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfcmV0dXJudHlwZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LlN1Y2Nlc3MgIT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmVzdWx0LlN1Y2Nlc3M7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5TdWNjZXNzLkhhc1ZhbHVlKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiByZXN1bHQuU3VjY2Vzcy5WYWx1ZTsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LnN1Y2Nlc3MpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHJlc3VsdC5TdWNjZXNzOyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICAgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobnVsbGFibGVfKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgIT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aHJvdyByZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKnhfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgcmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5NaXNzaW5nUmVzdWx0LCBcIiIKKyAgICAgICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25fbmFtZSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfeGNlcHRpb25zKCkpOworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKQoreworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICAgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuQXN5bmNQcm9jZXNzb3IsICI7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgY2xhc3MgQXN5bmNQcm9jZXNzb3IgOiAiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJJVEFzeW5jUHJvY2Vzc29yIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInByaXZhdGUgSUFzeW5jIF9pQXN5bmM7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBBc3luY1Byb2Nlc3NvcihJQXN5bmMgaUFzeW5jKSI7CisKKyAgICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCAiIDogYmFzZShpQXN5bmMpIjsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGlBc3luYyA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihpQXN5bmMpKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiX2lBc3luYyA9IGlBc3luYzsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIHN0cmluZyBmdW5jdGlvbl9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfW1wiIiA8PCBjb3JyZWN0X2Z1bmN0aW9uX25hbWVfZm9yX2FzeW5jKGZ1bmN0aW9uX25hbWUpIDw8ICJcIl0gPSAiIDw8IGZ1bmN0aW9uX25hbWUgPDwgIl9Qcm9jZXNzQXN5bmM7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgZGVsZWdhdGUgVGFzayBQcm9jZXNzRnVuY3Rpb24oaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgRGljdGlvbmFyeTxzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4gcHJvY2Vzc01hcF8gPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4oKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYXN5bmMgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGF3YWl0IFByb2Nlc3NBc3luYyhpcHJvdCwgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYXN5bmMgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgbmV3IGFzeW5jIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBhd2FpdCBQcm9jZXNzQXN5bmMoaXByb3QsIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG5ldyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBtc2cgPSBhd2FpdCBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJQcm9jZXNzRnVuY3Rpb24gZm47IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwcm9jZXNzTWFwXy5UcnlHZXRWYWx1ZShtc2cuTmFtZSwgb3V0IGZuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuID09IG51bGwpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgVFByb3RvY29sVXRpbC5Ta2lwQXN5bmMoaXByb3QsIFRUeXBlLlN0cnVjdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZE1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ2YXIgeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24gKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd25NZXRob2QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiICsgbXNnLk5hbWUgKyBcIidcIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKG5ldyBUTWVzc2FnZShtc2cuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbXNnLlNlcUlEKSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgeC5Xcml0ZUFzeW5jKG9wcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5UcmFuc3BvcnQuRmx1c2hBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgZm4obXNnLlNlcUlELCBpcHJvdCwgb3Byb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNhdGNoIChJT0V4Y2VwdGlvbikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uX2FzeW5jKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIpOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikKK3sKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQorICAgIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25fYXN5bmMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pCit7CisgICAgKHZvaWQpdHNlcnZpY2U7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYXN5bmMgVGFzayAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICA8PCAiX1Byb2Nlc3NBc3luYyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiQXJncyI7CisgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiUmVzdWx0IjsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBhcmdzLlJlYWRBc3luYyhpcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZE1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisKKyAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgb3V0IDw8IGluZGVudCgpOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgeworICAgICAgICBvdXQgPDwgInJlc3VsdC5TdWNjZXNzID0gIjsKKyAgICB9CisKKyAgICBvdXQgPDwgImF3YWl0IF9pQXN5bmMuIiA8PCBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICJBc3luYygiOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKGFyZ19zdHJ1Y3QpOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZfaXRlcik7CisgICAgICAgIGlmIChudWxsYWJsZV8gJiYgIXR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIuVmFsdWUiOworICAgICAgICB9CisgICAgfQorCisgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKGFyZ19zdHJ1Y3QpOworCisgICAgaWYgKCFmaXJzdCkKKyAgICB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgIH0KKworICAgIG91dCA8PCAiY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh4cywgeHMtPmdldF9tZW1iZXJzKCksIHJlc3VsdG5hbWUpOworICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkKKyAgICB7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKworICAgICAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKG5ldyBUTWVzc2FnZShcIiIKKyAgICAgICAgICAgICAgICA8PCBjb3JyZWN0X2Z1bmN0aW9uX25hbWVfZm9yX2FzeW5jKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUmVwbHksIHNlcWlkKSwgY2FuY2VsbGF0aW9uVG9rZW4pOyAiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCByZXN1bHQuV3JpdGVBc3luYyhvcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh4cyk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdzsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImNhdGNoIChFeGNlcHRpb24gZXgpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJDb25zb2xlLkVycm9yLldyaXRlTGluZShcIkVycm9yIG9jY3VycmVkIGluIHByb2Nlc3NvcjpcIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJDb25zb2xlLkVycm9yLldyaXRlTGluZShleC5Ub1N0cmluZygpKTsiIDw8IGVuZGw7CisKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKKyAgICB7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJuYWxFcnJvcixcIiBJbnRlcm5hbCBlcnJvci5cIik7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhuZXcgVE1lc3NhZ2UoXCIiIDw8IGNvcnJlY3RfZnVuY3Rpb25fbmFtZV9mb3JfYXN5bmModGZ1bmN0aW9uLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBzZXFpZCksIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCB4LldyaXRlQXN5bmMob3Byb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LlRyYW5zcG9ydC5GbHVzaEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24pCit7CisgICAgLy8gVGhhbmtzIHRvIFRIUklGVC0xNzY4LCB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgaW4gdGhlIHVuaW9uCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHVuaW9uLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHN0YXRpYyBhc3luYyBUYXNrPCIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICI+IFJlYWRBc3luYyhUUHJvdG9jb2wgaXByb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIHJldHZhbDsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkU3RydWN0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVEZpZWxkIGZpZWxkID0gYXdhaXQgaXByb3QuUmVhZEZpZWxkQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIC8vIHdlIGNhbm5vdCBoYXZlIHRoZSBmaXJzdCBmaWVsZCBiZSBhIHN0b3AgLS0gd2UgbXVzdCBoYXZlIGEgc2luZ2xlIGZpZWxkIGRlZmluZWQKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dmFsID0gbmV3IF9fX3VuZGVmaW5lZCgpOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggKGZpZWxkLklEKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiB0ZW1wOyIgPDwgZW5kbDsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJ0ZW1wIiwgdHJ1ZSk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dmFsID0gbmV3ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIodGVtcCk7IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgYXdhaXQgVFByb3RvY29sVXRpbC5Ta2lwQXN5bmMoaXByb3QsIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsiCisgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHZhbCA9IG5ldyBfX191bmRlZmluZWQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiAiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBUUHJvdG9jb2xVdGlsLlNraXBBc3luYyhpcHJvdCwgZmllbGQuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAicmV0dmFsID0gbmV3IF9fX3VuZGVmaW5lZCgpOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKGF3YWl0IGlwcm90LlJlYWRGaWVsZEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pKS5UeXBlICE9IFRUeXBlLlN0b3ApIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICAvLyBlbmQgb2YgZWxzZSBmb3IgVFN0b3AKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiByZXR2YWw7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCwgYm9vbCBpc19wcm9wZXJ0eWxlc3MpCit7CisgICAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICAgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpCisgICAgeworICAgICAgICB0eXBlID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odHlwZSktPmdldF90eXBlKCk7CisgICAgfQorCisgICAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkKKyAgICB7CisgICAgICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgIH0KKworICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgKGlzX3Byb3BlcnR5bGVzcyA/ICIiIDogcHJvcF9uYW1lKHRmaWVsZCkpOworCisgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCBzdGF0aWNfY2FzdDx0X3N0cnVjdCo+KHR5cGUpLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIiA9ICI7CisKKyAgICAgICAgaWYgKHR5cGUtPmlzX2VudW0oKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIpIjsKKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCAiYXdhaXQgaXByb3QuIjsKKworICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSBzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICAgICAgc3dpdGNoICh0YmFzZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRCaW5hcnlBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkU3RyaW5nQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZEJvb2xBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkSTE2QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZEk2NEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkRG91YmxlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICJSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLCB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICAgIH0KK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICBpZiAodW5pb25fICYmIHRzdHJ1Y3QtPmlzX3VuaW9uKCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBhd2FpdCAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLlJlYWRBc3luYyhpcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCAiIDw8IHByZWZpeCA8PCAiLlJlYWRBc3luYyhpcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdHJpbmcgb2JqOworCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG9iaiA9IHRtcCgiX21hcCIpOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBvYmogPSB0bXAoIl9zZXQiKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRNYXAgIiA8PCBvYmogPDwgIiA9IGF3YWl0IGlwcm90LlJlYWRNYXBCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVFNldCAiIDw8IG9iaiA8PCAiID0gYXdhaXQgaXByb3QuUmVhZFNldEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVExpc3QgIiA8PCBvYmogPDwgIiA9IGF3YWl0IGlwcm90LlJlYWRMaXN0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKworICAgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yKGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5Db3VudDsgKysiIDw8IGkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCBzdGF0aWNfY2FzdDx0X21hcCo+KHR0eXBlKSwgcHJlZml4KTsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCBzdGF0aWNfY2FzdDx0X3NldCo+KHR0eXBlKSwgcHJlZml4KTsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsIHN0YXRpY19jYXN0PHRfbGlzdCo+KHR0eXBlKSwgcHJlZml4KTsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRNYXBFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRTZXRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkTGlzdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgICAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworCisgICAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICAgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsKSA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KQoreworICAgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICAgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgcHJlZml4KQoreworICAgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICAgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIuQWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4LCBib29sIGlzX2VsZW1lbnQsIGJvb2wgaXNfcHJvcGVydHlsZXNzKQoreworICAgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKQorICAgIHsKKyAgICAgICAgdHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgKGlzX3Byb3BlcnR5bGVzcyA/ICIiIDogcHJvcF9uYW1lKHRmaWVsZCkpOworCisgICAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkKKyAgICB7CisgICAgICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7CisgICAgfQorCisgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgc3RhdGljX2Nhc3Q8dF9zdHJ1Y3QqPih0eXBlKSwgbmFtZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LiI7CisKKyAgICAgICAgc3RyaW5nIG51bGxhYmxlX25hbWUgPSBudWxsYWJsZV8gJiYgIWlzX2VsZW1lbnQgJiYgIWZpZWxkX2lzX3JlcXVpcmVkKHRmaWVsZCkgPyBuYW1lICsgIi5WYWx1ZSIgOiBuYW1lOworCisgICAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHN0YXRpY19jYXN0PHRfYmFzZV90eXBlKj4odHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgICAgICBzd2l0Y2ggKHRiYXNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVCaW5hcnlBc3luYygiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlU3RyaW5nQXN5bmMoIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0IDw8IG5hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUJvb2xBc3luYygiIDw8IG51bGxhYmxlX25hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVCeXRlQXN5bmMoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUkxNkFzeW5jKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVJMzJBc3luYygiIDw8IG51bGxhYmxlX25hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlSTY0QXN5bmMoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZURvdWJsZUFzeW5jKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIldyaXRlSTMyQXN5bmMoKGludCkiIDw8IG51bGxhYmxlX25hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSAnJXMlcycgVFlQRSAnJXMnXG4iLCBwcmVmaXguY19zdHIoKSwgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KQoreworICAgICh2b2lkKXRzdHJ1Y3Q7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCAiIDw8IHByZWZpeCA8PCAiLldyaXRlQXN5bmMob3Byb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNYXBCZWdpbkFzeW5jKG5ldyBUTWFwKCIgPDwgdHlwZV90b19lbnVtKHN0YXRpY19jYXN0PHRfbWFwKj4odHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKHN0YXRpY19jYXN0PHRfbWFwKj4odHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKKyAgICAgICAgICAgIDw8ICIuQ291bnQpLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU2V0QmVnaW5Bc3luYyhuZXcgVFNldCgiIDw8IHR5cGVfdG9fZW51bShzdGF0aWNfY2FzdDx0X3NldCo+KHR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5Db3VudCksIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTGlzdEJlZ2luQXN5bmMobmV3IFRMaXN0KCIKKyAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bShzdGF0aWNfY2FzdDx0X2xpc3QqPih0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5Db3VudCksIGNhbmNlbGxhdGlvblRva2VuKTsiCisgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZvcmVhY2ggKCIgPDwgdHlwZV9uYW1lKHN0YXRpY19jYXN0PHRfbWFwKj4odHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIKKyAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi5LZXlzKSI7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yZWFjaCAoIiA8PCB0eXBlX25hbWUoc3RhdGljX2Nhc3Q8dF9zZXQqPih0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIKKyAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3JlYWNoICgiIDw8IHR5cGVfbmFtZShzdGF0aWNfY2FzdDx0X2xpc3QqPih0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIKKyAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCBzdGF0aWNfY2FzdDx0X21hcCo+KHR0eXBlKSwgaXRlciwgcHJlZml4KTsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgc3RhdGljX2Nhc3Q8dF9zZXQqPih0dHlwZSksIGl0ZXIpOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsIHN0YXRpY19jYXN0PHRfbGlzdCo+KHR0eXBlKSwgaXRlcik7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZU1hcEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTZXRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUxpc3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgaXRlciwgc3RyaW5nIG1hcCkKK3sKKyAgICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIsIHRydWUpOworICAgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiWyIgKyBpdGVyICsgIl0iKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKQoreworICAgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsIHRydWUpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikKK3sKKyAgICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvcGVydHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIGJvb2wgZ2VuZXJhdGVJc3NldCkKK3sKKyAgICBnZW5lcmF0ZV9uZXRjb3JlX3Byb3BlcnR5KG91dCwgdGZpZWxkLCBpc1B1YmxpYywgZ2VuZXJhdGVJc3NldCwgIl8iKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBib29sIGdlbmVyYXRlSXNzZXQsIHN0cmluZyBmaWVsZFByZWZpeCkKK3sKKyAgICBpZiAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgJiYgaXNQdWJsaWMpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltEYXRhTWVtYmVyKE9yZGVyID0gMCldIiA8PCBlbmRsOworICAgIH0KKyAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQodGZpZWxkKTsKKyAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQodGZpZWxkKTsKKyAgICBpZiAoKG51bGxhYmxlXyAmJiAhaGFzX2RlZmF1bHQpIHx8IGlzX3JlcXVpcmVkKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IChpc1B1YmxpYyA/ICJwdWJsaWMgIiA6ICJwcml2YXRlICIpIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgaXNfcmVxdWlyZWQpIDw8ICIgIiA8PCBwcm9wX25hbWUodGZpZWxkKSA8PCAiIHsgZ2V0OyBzZXQ7IH0iIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAoaXNQdWJsaWMgPyAicHVibGljICIgOiAicHJpdmF0ZSAiKSAgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlLCB0cnVlKSA8PCAiICIgPDwgcHJvcF9uYW1lKHRmaWVsZCkgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ2V0IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgYm9vbCB1c2VfbnVsbGFibGUgPSBmYWxzZTsKKyAgICAgICAgaWYgKG51bGxhYmxlXykKKyAgICAgICAgeworICAgICAgICAgICAgdF90eXBlKiB0dHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICAgICAgICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHR0eXBlID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odHR5cGUpLT5nZXRfdHlwZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2VfbnVsbGFibGUgPSBzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KHR0eXBlKS0+Z2V0X2Jhc2UoKSAhPSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGZpZWxkUHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZXQiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBpZiAodXNlX251bGxhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGVJc3NldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIgPSB2YWx1ZS5IYXNWYWx1ZTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh2YWx1ZS5IYXNWYWx1ZSkgdGhpcy4iIDw8IGZpZWxkUHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSB2YWx1ZS5WYWx1ZTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGVJc3NldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy4iIDw8IGZpZWxkUHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSB2YWx1ZTsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjptYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHN0cmluZyBjb25zdCYgZnJvbU5hbWUpCit7CisgICAgc3RyaW5nIHN0ciA9IGZyb21OYW1lOworICAgIGlmIChzdHIuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBzdHI7CisgICAgfQorCisgICAgLy8gdGVzdHMgcmVseSBvbiB0aGlzCisgICAgYXNzZXJ0KCgnQScgPCAnWicpICYmICgnYScgPCAneicpICYmICgnMCcgPCAnOScpKTsKKworICAgIC8vIGlmIHRoZSBmaXJzdCBsZXR0ZXIgaXMgYSBudW1iZXIsIHdlIGFkZCBhbiBhZGRpdGlvbmFsIHVuZGVyc2NvcmUgaW4gZnJvbnQgb2YgaXQKKyAgICBjaGFyIGMgPSBzdHIuYXQoMCk7CisgICAgaWYgKCgnMCcgPD0gYykgJiYgKGMgPD0gJzknKSkKKyAgICB7CisgICAgICAgIHN0ciA9ICJfIiArIHN0cjsKKyAgICB9CisKKyAgICAvLyBmb2xsb3dpbmcgY2hhcnM6IGxldHRlciwgbnVtYmVyIG9yIHVuZGVyc2NvcmUKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0ci5zaXplKCk7ICsraSkKKyAgICB7CisgICAgICAgIGMgPSBzdHIuYXQoaSk7CisgICAgICAgIGlmICgoJ0EnID4gYyB8fCBjID4gJ1onKSAmJiAoJ2EnID4gYyB8fCBjID4gJ3onKSAmJiAoJzAnID4gYyB8fCBjID4gJzknKSAmJiAnXycgIT0gYykKKyAgICAgICAgeworICAgICAgICAgICAgc3RyLnJlcGxhY2UoaSwgMSwgIl8iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdHI7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Y2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHZvaWQqIHNjb3BlKQoreworICAgIGlmIChtZW1iZXJfbWFwcGluZ19zY29wZXMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIHRocm93ICJpbnRlcm5hbCBlcnJvcjogY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCkgbm8gc2NvcGUgYWN0aXZlIjsKKyAgICB9CisKKyAgICBtZW1iZXJfbWFwcGluZ19zY29wZSYgYWN0aXZlID0gbWVtYmVyX21hcHBpbmdfc2NvcGVzLmJhY2soKTsKKyAgICBpZiAoYWN0aXZlLnNjb3BlX21lbWJlciAhPSBzY29wZSkKKyAgICB7CisgICAgICAgIHRocm93ICJpbnRlcm5hbCBlcnJvcjogY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCkgY2FsbGVkIGZvciB3cm9uZyBzdHJ1Y3QiOworICAgIH0KKworICAgIG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5wb3BfYmFjaygpOworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2V0X21hcHBlZF9tZW1iZXJfbmFtZShzdHJpbmcgbmFtZSkKK3sKKyAgICBpZiAoIW1lbWJlcl9tYXBwaW5nX3Njb3Blcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgbWVtYmVyX21hcHBpbmdfc2NvcGUmIGFjdGl2ZSA9IG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5iYWNrKCk7CisgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ZXIgPSBhY3RpdmUubWFwcGluZ190YWJsZS5maW5kKG5hbWUpOworICAgICAgICBpZiAoYWN0aXZlLm1hcHBpbmdfdGFibGUuZW5kKCkgIT0gaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGl0ZXItPnNlY29uZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB2ZXJib3NlKCJubyBtYXBwaW5nIGZvciBtZW1iZXIgJXNcbiIsIG5hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuIG5hbWU7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6cHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0c3RydWN0LCB0c3RydWN0LT5nZXRfbWVtYmVycygpLCB0c3RydWN0LT5nZXRfbmFtZSgpKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUsIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMsIGNvbnN0IHN0cmluZyYgc3RydWN0bmFtZSkKK3sKKyAgICAvLyBiZWdpbiBuZXcgc2NvcGUKKyAgICBtZW1iZXJfbWFwcGluZ19zY29wZXMucHVzaF9iYWNrKG1lbWJlcl9tYXBwaW5nX3Njb3BlKCkpOworICAgIG1lbWJlcl9tYXBwaW5nX3Njb3BlJiBhY3RpdmUgPSBtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpOworICAgIGFjdGl2ZS5zY29wZV9tZW1iZXIgPSBzY29wZTsKKworICAgIC8vIGN1cnJlbnQgQyMgZ2VuZXJhdG9yIHBvbGljeToKKyAgICAvLyAtIHByb3AgbmFtZXMgYXJlIGFsd2F5cyByZW5kZXJlZCB3aXRoIGFuIFVwcGVyY2FzZSBmaXJzdCBsZXR0ZXIKKyAgICAvLyAtIHN0cnVjdCBuYW1lcyBhcmUgdXNlZCBhcyBnaXZlbgorICAgIHN0ZDo6c2V0PHN0cmluZz4gdXNlZF9tZW1iZXJfbmFtZXM7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIC8vIHByZXZlbnQgbmFtZSBjb25mbGljdHMgd2l0aCBzdHJ1Y3QgKENTMDU0MiBlcnJvcikKKyAgICB1c2VkX21lbWJlcl9uYW1lcy5pbnNlcnQoc3RydWN0bmFtZSk7CisKKyAgICAvLyBwcmV2ZW50IG5hbWUgY29uZmxpY3RzIHdpdGgga25vd24gbWV0aG9kcyAoVEhSSUZULTI5NDIpCisgICAgdXNlZF9tZW1iZXJfbmFtZXMuaW5zZXJ0KCJSZWFkIik7CisgICAgdXNlZF9tZW1iZXJfbmFtZXMuaW5zZXJ0KCJXcml0ZSIpOworCisgICAgZm9yIChpdGVyID0gbWVtYmVycy5iZWdpbigpOyBpdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsraXRlcikKKyAgICB7CisgICAgICAgIHN0cmluZyBvbGRuYW1lID0gKCppdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgc3RyaW5nIG5ld25hbWUgPSBwcm9wX25hbWUoKml0ZXIsIHRydWUpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbmV3IG5hbWUgY29uZmxpY3RzIHdpdGggYW5vdGhlciBtZW1iZXIKKyAgICAgICAgICAgIGlmICh1c2VkX21lbWJlcl9uYW1lcy5maW5kKG5ld25hbWUpICE9IHVzZWRfbWVtYmVyX25hbWVzLmVuZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHB2ZXJib3NlKCJzdHJ1Y3QgJXM6IG1lbWJlciAlcyBjb25mbGljdHMgd2l0aCBhbm90aGVyIG1lbWJlclxuIiwgc3RydWN0bmFtZS5jX3N0cigpLCBuZXduYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIG5ld25hbWUgKz0gJ18nOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBhZGQgYWx3YXlzLCB0aGlzIGhlbHBzIHVzIHRvIGRldGVjdCBlZGdlIGNhc2VzIGxpa2UKKyAgICAgICAgICAgIC8vIGRpZmZlcmVudCBzcGVsbGluZ3MgKCJmb28iIGFuZCAiRm9vIikgd2l0aGluIHRoZSBzYW1lIHN0cnVjdAorICAgICAgICAgICAgcHZlcmJvc2UoInN0cnVjdCAlczogbWVtYmVyIG1hcHBpbmcgJXMgPT4gJXNcbiIsIHN0cnVjdG5hbWUuY19zdHIoKSwgb2xkbmFtZS5jX3N0cigpLCBuZXduYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgYWN0aXZlLm1hcHBpbmdfdGFibGVbb2xkbmFtZV0gPSBuZXduYW1lOworICAgICAgICAgICAgdXNlZF9tZW1iZXJfbmFtZXMuaW5zZXJ0KG5ld25hbWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpwcm9wX25hbWUodF9maWVsZCogdGZpZWxkLCBib29sIHN1cHByZXNzX21hcHBpbmcpCit7CisgICAgc3RyaW5nIG5hbWUodGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgICBpZiAoc3VwcHJlc3NfbWFwcGluZykKKyAgICB7CisgICAgICAgIG5hbWVbMF0gPSB0b3VwcGVyKG5hbWVbMF0pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBuYW1lID0gZ2V0X21hcHBlZF9tZW1iZXJfbmFtZShuYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIG5hbWU7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXIsIGJvb2wgaW5faW5pdCwgYm9vbCBpbl9wYXJhbSwgYm9vbCBpc19yZXF1aXJlZCkKK3sKKyAgICAodm9pZClpbl9pbml0OworCisgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpCisgICAgeworICAgICAgICB0dHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisKKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKHN0YXRpY19jYXN0PHRfYmFzZV90eXBlKj4odHR5cGUpLCBpbl9jb250YWluZXIsIGluX3BhcmFtLCBpc19yZXF1aXJlZCk7CisgICAgfQorCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIHRfbWFwKiB0bWFwID0gc3RhdGljX2Nhc3Q8dF9tYXAqPih0dHlwZSk7CisgICAgICAgIHJldHVybiAiRGljdGlvbmFyeTwiICsgdHlwZV9uYW1lKHRtYXAtPmdldF9rZXlfdHlwZSgpLCB0cnVlKSArICIsICIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHRydWUpICsgIj4iOworICAgIH0KKworICAgIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICB0X3NldCogdHNldCA9IHN0YXRpY19jYXN0PHRfc2V0Kj4odHR5cGUpOworICAgICAgICByZXR1cm4gIlRIYXNoU2V0PCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+IjsKKyAgICB9CisKKyAgICBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIHRfbGlzdCogdGxpc3QgPSBzdGF0aWNfY2FzdDx0X2xpc3QqPih0dHlwZSk7CisgICAgICAgIHJldHVybiAiTGlzdDwiICsgdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iOworICAgIH0KKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICAgIHN0cmluZyBwb3N0Zml4ID0gKCFpc19yZXF1aXJlZCAmJiBudWxsYWJsZV8gJiYgaW5fcGFyYW0gJiYgdHR5cGUtPmlzX2VudW0oKSkgPyAiPyIgOiAiIjsKKyAgICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pCisgICAgeworICAgICAgICBzdHJpbmcgbnMgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJuZXRjb3JlIik7CisgICAgICAgIGlmICghbnMuZW1wdHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5zICsgIi4iICsgbm9ybWFsaXplX25hbWUodHR5cGUtPmdldF9uYW1lKCkpICsgcG9zdGZpeDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBub3JtYWxpemVfbmFtZSh0dHlwZS0+Z2V0X25hbWUoKSkgKyBwb3N0Zml4OworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLCBib29sIGluX2NvbnRhaW5lciwgYm9vbCBpbl9wYXJhbSwgYm9vbCBpc19yZXF1aXJlZCkKK3sKKyAgICAodm9pZClpbl9jb250YWluZXI7CisgICAgc3RyaW5nIHBvc3RmaXggPSAoIWlzX3JlcXVpcmVkICYmIG51bGxhYmxlXyAmJiBpbl9wYXJhbSkgPyAiPyIgOiAiIjsKKyAgICBzd2l0Y2ggKHRiYXNlLT5nZXRfYmFzZSgpKQorICAgIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHJldHVybiAidm9pZCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0YmFzZS0+aXNfYmluYXJ5KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJieXRlW10iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOworICAgICAgICB9CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICByZXR1cm4gImJvb2wiICsgcG9zdGZpeDsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICByZXR1cm4gInNieXRlIiArIHBvc3RmaXg7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIHJldHVybiAic2hvcnQiICsgcG9zdGZpeDsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgcmV0dXJuICJpbnQiICsgcG9zdGZpeDsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmV0dXJuICJsb25nIiArIHBvc3RmaXg7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJldHVybiAiZG91YmxlIiArIHBvc3RmaXg7CisgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZS0+Z2V0X2Jhc2UoKSk7CisgICAgfQorfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICBzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgaWYgKGluaXQpCisgICAgeworICAgICAgICB0X3R5cGUqIHR0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICAgICAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdHR5cGUgPSBzdGF0aWNfY2FzdDx0X3R5cGVkZWYqPih0dHlwZSktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiBmaWVsZF9oYXNfZGVmYXVsdCh0ZmllbGQpKQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6Om9mc3RyZWFtIGR1bW15OworICAgICAgICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSBzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KHR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgICAgIHN3aXRjaCAodGJhc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gIiA9ICgiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKTAiOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdCArICI7IjsKK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpCit7CisgICAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICByZXR1cm4gdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIG5vcm1hbGl6ZV9uYW1lKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmModF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KQoreworICAgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgICAgc3RyaW5nIHRhc2sgPSAiVGFzayI7CisgICAgaWYgKCF0dHlwZS0+aXNfdm9pZCgpKQorICAgIHsKKyAgICAgICAgdGFzayArPSAiPCIgKyB0eXBlX25hbWUodHR5cGUpICsgIj4iOworICAgIH0KKworICAgIHN0cmluZyByZXN1bHQgPSB0YXNrICsgIiAiICsgbm9ybWFsaXplX25hbWUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJBc3luYygiOworICAgIHN0cmluZyBhcmdzID0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOworICAgIHJlc3VsdCArPSBhcmdzOworICAgIGlmICghYXJncy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSAiQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIjsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSAiLCAiOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIiArIG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKQoreworICAgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpCisgICAgeworICAgICAgICB0eXBlID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odHlwZSktPmdldF90eXBlKCk7CisgICAgfQorCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHN0YXRpY19jYXN0PHRfYmFzZV90eXBlKj4odHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgIHN3aXRjaCAodGJhc2UpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgIHJldHVybiAiVFR5cGUuU3RyaW5nIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgICAgcmV0dXJuICJUVHlwZS5Cb29sIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICAgIHJldHVybiAiVFR5cGUuQnl0ZSI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgcmV0dXJuICJUVHlwZS5Eb3VibGUiOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkKKyAgICB7CisgICAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkKKyAgICB7CisgICAgICAgIHJldHVybiAiVFR5cGUuU3RydWN0IjsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICByZXR1cm4gIlRUeXBlLk1hcCI7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJUVHlwZS5TZXQiOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICByZXR1cm4gIlRUeXBlLkxpc3QiOworICAgIH0KKworICAgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX2RvY3N0cmluZ19jb21tZW50KG9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKQoreworICAgIGRvY3N0cmluZ19jb21tZW50KG91dCwgIi8vLyA8c3VtbWFyeT4iICsgZW5kbCwgIi8vLyAiLCBjb250ZW50cywgIi8vLyA8L3N1bW1hcnk+IiArIGVuZGwpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfZG9jKG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpCit7CisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICBzdHJpbmcgY29tYmluZWRfbWVzc2FnZSA9IGZpZWxkLT5nZXRfZG9jKCkgKyBlbmRsICsgIjxzZWVhbHNvIGNyZWY9XCIiICsgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiXCIvPiI7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCBzdGF0aWNfY2FzdDx0X2RvYyo+KGZpZWxkKSk7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpCit7CisgICAgaWYgKHRkb2MtPmhhc19kb2MoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCB0ZG9jLT5nZXRfZG9jKCkpOworICAgIH0KK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikKK3sKKyAgICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpCisgICAgeworICAgICAgICBzdHJpbmdzdHJlYW0gcHM7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOworICAgICAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICAgICAgICBwcyA8PCBlbmRsIDw8ICI8cGFyYW0gbmFtZT1cIiIgPDwgcC0+Z2V0X25hbWUoKSA8PCAiXCI+IjsKKyAgICAgICAgICAgIGlmIChwLT5oYXNfZG9jKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHN0ciA9IHAtPmdldF9kb2MoKTsKKyAgICAgICAgICAgICAgICBzdHIuZXJhc2UocmVtb3ZlKHN0ci5iZWdpbigpLCBzdHIuZW5kKCksICdcbicpLCBzdHIuZW5kKCkpOworICAgICAgICAgICAgICAgIHBzIDw8IHN0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBzIDw8ICI8L3BhcmFtPiI7CisgICAgICAgIH0KKworICAgICAgICBkb2NzdHJpbmdfY29tbWVudChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8vICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VtbWFyeT4iICsgZW5kbCArIHRmdW5jdGlvbi0+Z2V0X2RvYygpICsgIjwvc3VtbWFyeT4iICsgcHMuc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiKTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6ZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBjb25zdCBzdHJpbmcmIGNvbW1lbnRfc3RhcnQsIGNvbnN0IHN0cmluZyYgbGluZV9wcmVmaXgsIGNvbnN0IHN0cmluZyYgY29udGVudHMsIGNvbnN0IHN0cmluZyYgY29tbWVudF9lbmQpCit7CisgICAgaWYgKGNvbW1lbnRfc3RhcnQgIT0gIiIpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgY29tbWVudF9zdGFydDsKKyAgICB9CisKKyAgICBzdHJpbmdzdHJlYW0gZG9jcyhjb250ZW50cywgc3RkOjppb3NfYmFzZTo6aW4pOworCisgICAgd2hpbGUgKCEoZG9jcy5lb2YoKSB8fCBkb2NzLmZhaWwoKSkpCisgICAgeworICAgICAgICBjaGFyIGxpbmVbMTAyNF07CisgICAgICAgIGRvY3MuZ2V0bGluZShsaW5lLCAxMDI0KTsKKworICAgICAgICAvLyBKdXN0IHBybnQgYSBuZXdsaW5lIHdoZW4gdGhlIGxpbmUgJiBwcmVmaXggYXJlIGVtcHR5LgorICAgICAgICBpZiAoc3RybGVuKGxpbmUpID09IDAgJiYgbGluZV9wcmVmaXggPT0gIiIgJiYgIWRvY3MuZW9mKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0cmxlbihsaW5lKSA+IDAgfHwgIWRvY3MuZW9mKCkpCisgICAgICAgIHsgLy8gc2tpcCB0aGUgZW1wdHkgbGFzdCBsaW5lCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgbGluZV9wcmVmaXggPDwgbGluZSA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjb21tZW50X2VuZCAhPSAiIikKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBjb21tZW50X2VuZDsKKyAgICB9Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkKK3sKKyAgICBzdHJpbmcgcGFja2FnZSA9ICIiOworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKQorICAgIHsKKyAgICAgICAgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoIm5ldGNvcmUiKSArICIuIjsKKyAgICB9CisgICAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIG5ldGNvcmUsCisgICAgIkMjIiwKKyAgICAiICAgIHdjZjogICAgICAgICAgICAgQWRkcyBiaW5kaW5ncyBmb3IgV0NGIHRvIGdlbmVyYXRlZCBjbGFzc2VzLlxuIgorICAgICIgICAgc2VyaWFsOiAgICAgICAgICBBZGQgc2VyaWFsaXphdGlvbiBzdXBwb3J0IHRvIGdlbmVyYXRlZCBjbGFzc2VzLlxuIgorICAgICIgICAgbnVsbGFibGU6ICAgICAgICBVc2UgbnVsbGFibGUgdHlwZXMgZm9yIHByb3BlcnRpZXMuXG4iCisgICAgIiAgICBoYXNoY29kZTogICAgICAgIEdlbmVyYXRlIGEgaGFzaGNvZGUgYW5kIGVxdWFscyBpbXBsZW1lbnRhdGlvbiBmb3IgY2xhc3Nlcy5cbiIKKyAgICAiICAgIHVuaW9uOiAgICAgICAgICAgVXNlIG5ldyB1bmlvbiB0eXBpbmcsIHdoaWNoIGluY2x1ZGVzIGEgc3RhdGljIHJlYWQgZnVuY3Rpb24gZm9yIHVuaW9uIHR5cGVzLlxuIgorKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZmM5MjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmgKQEAgLTAsMCArMSwxMzcgQEAKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworY2xhc3MgdF9uZXRjb3JlX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IKK3sKKworICAgIHN0cnVjdCBtZW1iZXJfbWFwcGluZ19zY29wZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIG1lbWJlcl9tYXBwaW5nX3Njb3BlKCkgOiBzY29wZV9tZW1iZXIoMCkgeyB9CisgICAgICAgIHZvaWQqIHNjb3BlX21lbWJlcjsKKyAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiBtYXBwaW5nX3RhYmxlOworICAgIH07CisKK3B1YmxpYzoKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsIGNvbnN0IHN0cmluZyYgb3B0aW9uX3N0cmluZyk7CisKKyAgICBib29sIGlzX3djZl9lbmFibGVkKCkgY29uc3Q7CisgICAgYm9vbCBpc19udWxsYWJsZV9lbmFibGVkKCkgY29uc3Q7CisgICAgYm9vbCBpc19oYXNoY29kZV9lbmFibGVkKCkgY29uc3Q7CisgICAgYm9vbCBpc19zZXJpYWxpemVfZW5hYmxlZCgpIGNvbnN0OworICAgIGJvb2wgaXNfdW5pb25fZW5hYmxlZCgpIGNvbnN0OworICAgIG1hcDxzdHJpbmcsIGludD4gZ2V0X2tleXdvcmRzX2xpc3QoKSBjb25zdDsKKworICAgIC8vIG92ZXJyaWRlcworICAgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworICAgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKyAgICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhvc3RyZWFtJiBvdXQsIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKyAgICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgICAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICAgIHZvaWQgZ2VuZXJhdGVfZW51bShvc3RyZWFtJiBvdXQsIHRfZW51bSogdGVudW0pOworICAgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAgIHZvaWQgZ2VuZXJhdGVfcHJvcGVydHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIGJvb2wgZ2VuZXJhdGVJc3NldCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBib29sIGluY2x1ZGVJc3NldCA9IHRydWUsIHN0cmluZyBmaWVsZFByZWZpeCA9ICIiKTsKKyAgICBib29sIHByaW50X2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbCA9IGZhbHNlLCBib29sIG5lZWR0eXBlID0gZmFsc2UpOworICAgIHN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgICAgdm9pZCBwcmludF9jb25zdF9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKyAgICB2b2lkIHByaW50X2NvbnN0X2RlZl92YWx1ZShvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uKHRfc3RydWN0KiB0dW5pb24pOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsIGJvb2wgaW5fY2xhc3MgPSBmYWxzZSwgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfdW5pb25fY2xhc3Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uLCB0X2ZpZWxkKiB0ZmllbGQpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV93Y2ZmYXVsdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF90b3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2VxdWFscyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV91bmlvbl9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2Uob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uX2FzeW5jKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogZnVuY3Rpb24pOworICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXggPSAiIiwgYm9vbCBpc19wcm9wZXJ0eWxlc3MgPSBmYWxzZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogbGlzdCwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCA9ICIiLCBib29sIGlzX2VsZW1lbnQgPSBmYWxzZSwgYm9vbCBpc19wcm9wZXJ0eWxlc3MgPSBmYWxzZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgaXRlciwgc3RyaW5nIG1hcCk7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RyaW5nIGl0ZXIpOworICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfZG9jKG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9kb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cyk7CisgICAgdm9pZCBkb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIGNvbnN0IHN0cmluZyYgY29tbWVudF9zdGFydCwgY29uc3Qgc3RyaW5nJiBsaW5lX3ByZWZpeCwgY29uc3Qgc3RyaW5nJiBjb250ZW50cywgY29uc3Qgc3RyaW5nJiBjb21tZW50X2VuZCk7CisgICAgdm9pZCBzdGFydF9uZXRjb3JlX25hbWVzcGFjZShvc3RyZWFtJiBvdXQpOworICAgIHZvaWQgZW5kX25ldGNvcmVfbmFtZXNwYWNlKG9zdHJlYW0mIG91dCk7CisKKyAgICBzdHJpbmcgbmV0Y29yZV90eXBlX3VzaW5ncygpIGNvbnN0OworICAgIHN0cmluZyBuZXRjb3JlX3RocmlmdF91c2luZ3MoKSBjb25zdDsKKworICAgIHN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb3VudGFpbmVyID0gZmFsc2UsIGJvb2wgaW5faW5pdCA9IGZhbHNlLCBib29sIGluX3BhcmFtID0gZmFsc2UsIGJvb2wgaXNfcmVxdWlyZWQgPSBmYWxzZSk7CisgICAgc3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSwgYm9vbCBpbl9wYXJhbSA9IGZhbHNlLCBib29sIGlzX3JlcXVpcmVkID0gZmFsc2UpOworICAgIHN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgc3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgc3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgc3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICAgIHN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgICAgc3RyaW5nIHByb3BfbmFtZSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgc3VwcHJlc3NfbWFwcGluZyA9IGZhbHNlKTsKKyAgICBzdHJpbmcgZ2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpOworCitwcml2YXRlOgorICAgIHN0cmluZyBuYW1lc3BhY2VfbmFtZV87CisgICAgc3RyaW5nIG5hbWVzcGFjZV9kaXJfOworCisgICAgYm9vbCBudWxsYWJsZV87CisgICAgYm9vbCB1bmlvbl87CisgICAgYm9vbCBoYXNoY29kZV87CisgICAgYm9vbCBzZXJpYWxpemVfOworICAgIGJvb2wgd2NmXzsKKworICAgIHN0cmluZyB3Y2ZfbmFtZXNwYWNlXzsKKyAgICBtYXA8c3RyaW5nLCBpbnQ+IG5ldGNvcmVfa2V5d29yZHM7CisgICAgdmVjdG9yPG1lbWJlcl9tYXBwaW5nX3Njb3BlPiBtZW1iZXJfbWFwcGluZ19zY29wZXM7CisKKyAgICB2b2lkIGluaXRfa2V5d29yZHMoKTsKKyAgICBzdHJpbmcgbm9ybWFsaXplX25hbWUoc3RyaW5nIG5hbWUpOworICAgIHN0cmluZyBtYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHN0cmluZyBjb25zdCYgZnJvbU5hbWUpOworICAgIHZvaWQgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh2b2lkKiBzY29wZSwgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycywgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RuYW1lKTsKKyAgICB2b2lkIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh2b2lkKiBzY29wZSk7CisgICAgc3RyaW5nIGdldF9tYXBwZWRfbWVtYmVyX25hbWUoc3RyaW5nIG9sZG5hbWUpOworfTsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVjODFiYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTc2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6OmlvczsKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogT0NhbWwgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X29jYW1sX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X29jYW1sX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgLyogbm8gb3B0aW9ucyB5ZXQgKi8KKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBvY2FtbDoiICsgaXRlci0+Zmlyc3Q7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tb2NhbWwiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX3Byb2dyYW0oKTsKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICBib29sIHN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCh0X2ZpZWxkKiB0bWVtYmVyKTsKKyAgYm9vbCBzdHJ1Y3RfbWVtYmVyX29taXRhYmxlKHRfZmllbGQqIHRtZW1iZXIpOworICBib29sIHN0cnVjdF9tZW1iZXJfZGVmYXVsdF9jaGVhcGx5X2NvbXBhcmFibGUodF9maWVsZCogdG1lbWJlcik7CisgIHN0ZDo6c3RyaW5nIHN0cnVjdF9tZW1iZXJfY29weV9vZih0X3R5cGUqIHR5cGUsIHN0cmluZyB3aGF0KTsKKworICAvKioKKyAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQorICAgKi8KKworICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X21lbWJlcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIHRuYW1lLCB0X2ZpZWxkKiB0bWVtYmVyKTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfc2lnKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfb2NhbWxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX29jYW1sX21ldGhvZF9jb3B5KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzKTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9tZW1iZXJfY29weShzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogbWVtYmVyKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBuYW1lID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgc3RkOjpzdHJpbmcgb2NhbWxfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCBtZXRob2QgPSBmYWxzZSwgYm9vbCBvcHRpb25zID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyByZW5kZXJfb2NhbWxfdHlwZSh0X3R5cGUqIHR5cGUpOworCitwcml2YXRlOgorICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzX2lfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV9pXzsKK307CisKKy8qCisgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIHdhbnQgdHlwZWRlZnMgdG8gYXBwZWFyIGxhdGVyLAorICogYWZ0ZXIgYWxsIHRoZSB0eXBlcyBoYXZlIGJlZW4gZGVjbGFyZWQuCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW0oKSB7CisgIC8vIEluaXRpYWxpemUgdGhlIGdlbmVyYXRvcgorICBpbml0X2dlbmVyYXRvcigpOworCisgIC8vIEdlbmVyYXRlIGVudW1zCisgIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKKyAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOworICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHN0cnVjdHMKKyAgdmVjdG9yPHRfc3RydWN0Kj4gc3RydWN0cyA9IHByb2dyYW1fLT5nZXRfc3RydWN0cygpOworICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igc3RfaXRlcjsKKyAgZm9yIChzdF9pdGVyID0gc3RydWN0cy5iZWdpbigpOyBzdF9pdGVyICE9IHN0cnVjdHMuZW5kKCk7ICsrc3RfaXRlcikgeworICAgIGdlbmVyYXRlX3N0cnVjdCgqc3RfaXRlcik7CisgIH0KKworICAvLyBHZW5lcmF0ZSB4Y2VwdGlvbnMKKyAgdmVjdG9yPHRfc3RydWN0Kj4geGNlcHRpb25zID0gcHJvZ3JhbV8tPmdldF94Y2VwdGlvbnMoKTsKKyAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIHhfaXRlcjsKKyAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV94Y2VwdGlvbigqeF9pdGVyKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHR5cGVkZWZzCisgIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKTsKKyAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOworICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV90eXBlZGVmKCp0ZF9pdGVyKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHNlcnZpY2VzCisgIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW1fLT5nZXRfc2VydmljZXMoKTsKKyAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOworICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKKyAgICBzZXJ2aWNlX25hbWVfID0gZ2V0X3NlcnZpY2VfbmFtZSgqc3ZfaXRlcik7CisgICAgZ2VuZXJhdGVfc2VydmljZSgqc3ZfaXRlcik7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjb25zdGFudHMKKyAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOworICBnZW5lcmF0ZV9jb25zdHMoY29uc3RzKTsKKworICAvLyBDbG9zZSB0aGUgZ2VuZXJhdG9yCisgIGNsb3NlX2dlbmVyYXRvcigpOworfQorCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX3R5cGVzLm1sIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisgIHN0cmluZyBmX3R5cGVzX2lfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl90eXBlcy5tbGkiOworICBmX3R5cGVzX2lfLm9wZW4oZl90eXBlc19pX25hbWUuY19zdHIoKSk7CisKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfY29uc3RzLm1sIjsKKyAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl90eXBlc18gPDwgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKKyAgZl90eXBlc19pXyA8PCBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IG9jYW1sX2ltcG9ydHMoKSA8PCBlbmRsOworICBmX2NvbnN0c18gPDwgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbCA8PCAib3BlbiAiCisgICAgICAgICAgICA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJfdHlwZXMiIDw8IGVuZGw7Cit9CisKKy8qKgorICogQXV0b2dlbidkIGNvbW1lbnQKKyAqLworc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSB7CisgIHJldHVybiBzdGQ6OnN0cmluZygiKCpcbiIpICsgIiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIgKyAiXG4iCisgICAgICAgICArICIgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKyAiKilcbiI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCisgKi8KK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6b2NhbWxfaW1wb3J0cygpIHsKKyAgcmV0dXJuICJvcGVuIFRocmlmdCI7Cit9CisKKy8qKgorICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gQ2xvc2UgdHlwZXMgZmlsZQorICBmX3R5cGVzXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIEV6LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IGRlY2FwaXRhbGl6ZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpIDw8ICIgPSAiCisgICAgICAgICAgIDw8IHJlbmRlcl9vY2FtbF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCBlbmRsIDw8IGVuZGw7CisgIGZfdHlwZXNfaV8gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBkZWNhcGl0YWxpemUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKSA8PCAiID0gIgorICAgICAgICAgICAgIDw8IHJlbmRlcl9vY2FtbF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4KKyAqIHRoZSB2YWx1ZXMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIiA9ICIgPDwgZW5kbCA8PCAic3RydWN0IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChmX3R5cGVzX2lfKSA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIgPDwgZW5kbCA8PCAic2lnIgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3R5cGVzXykgPDwgInR5cGUgdCA9ICIgPDwgZW5kbDsKKyAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJ0eXBlIHQgPSAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgaW5kZW50KGZfdHlwZXNfKSA8PCAifCAiIDw8IG5hbWUgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl90eXBlc19pXykgPDwgInwgIiA8PCBuYW1lIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQoZl90eXBlc18pIDw8ICJsZXQgdG9faSA9IGZ1bmN0aW9uIiA8PCBlbmRsOworICBpbmRlbnQoZl90eXBlc19pXykgPDwgInZhbCB0b19pIDogdCAtPiBJbnQzMi50IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgIGluZGVudChmX3R5cGVzXykgPDwgInwgIiA8PCBuYW1lIDw8ICIgLT4gIiA8PCB2YWx1ZSA8PCAibCIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChmX3R5cGVzXykgPDwgImxldCBvZl9pID0gZnVuY3Rpb24iIDw8IGVuZGw7CisgIGluZGVudChmX3R5cGVzX2lfKSA8PCAidmFsIG9mX2kgOiBJbnQzMi50IC0+IHQiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgaW5kZW50KGZfdHlwZXNfKSA8PCAifCAiIDw8IHZhbHVlIDw8ICJsIC0+ICIgPDwgbmFtZSA8PCBlbmRsOworICB9CisgIGluZGVudChmX3R5cGVzXykgPDwgInwgXyAtPiByYWlzZSBUaHJpZnRfZXJyb3IiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3R5cGVzXykgPDwgImVuZCIgPDwgZW5kbDsKKyAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJlbmQiIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0Y29uc3QtPmdldF9uYW1lKCkpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgaW5kZW50KGZfY29uc3RzXykgPDwgImxldCAiIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLworc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgLy8gT0NhbWwgcmVxdWlyZXMgYWxsIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgY29udGFpbiBhIGRlY2ltYWwgcG9pbnQKKyAgb3V0LnNldGYoaW9zOjpzaG93cG9pbnQpOworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgImwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIi4wIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICB0X2VudW0qIHRlbnVtID0gKHRfZW51bSopdHlwZTsKKyAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgaW50IHZhbCA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgICBpZiAodmFsID09IHZhbHVlLT5nZXRfaW50ZWdlcigpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIuIiA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgc3RyaW5nIGNuYW1lID0gdHlwZV9uYW1lKHR5cGUpOworICAgIHN0cmluZyBjdCA9IHRtcCgiX2MiKTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAiIDw8IGN0IDw8ICIgPSBuZXcgIiA8PCBjbmFtZSA8PCAiIGluIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgZm5hbWUgPSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgY3QgPDwgIiNzZXRfIiA8PCBmbmFtZSA8PCAiICI7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgY3QgPDwgIikiOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIHN0cmluZyBobSA9IHRtcCgiX2htIik7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgIihsZXQgIiA8PCBobSA8PCAiID0gSGFzaHRibC5jcmVhdGUgIiA8PCB2YWwuc2l6ZSgpIDw8ICIgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuYWRkICIgPDwgaG0gPDwgIiAiIDw8IGtleSA8PCAiICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCBobSA8PCAiKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBvdXQgPDwgIlsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiXSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgc3RyaW5nIGhtID0gdG1wKCJfaG0iKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAiIDw8IGhtIDw8ICIgPSBIYXNodGJsLmNyZWF0ZSAiIDw8IHZhbC5zaXplKCkgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5hZGQgIiA8PCBobSA8PCAiICIgPDwgdmFsIDw8ICIgdHJ1ZTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8IGhtIDw8ICIpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSAic3RydWN0IgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0LCBidXQgYWxzbyBoYXMgYW4gZXhjZXB0aW9uIGRlY2xhcmF0aW9uLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIE9DYW1sIHN0cnVjdAorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfc2lnKGZfdHlwZXNfaV8sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Cit9CisKK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX21ldGhvZF9jb3B5KG9zdHJlYW0mIG91dCwgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycykgeworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgLyogQ3JlYXRlIGEgY29weSBvZiB0aGUgY3VycmVudCBvYmplY3QgKi8KKyAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBjb3B5ID0iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImxldCBfbmV3ID0gT28uY29weSBzZWxmIGluIiA8PCBlbmRsOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgIGdlbmVyYXRlX29jYW1sX21lbWJlcl9jb3B5KG91dCwgKm1faXRlcik7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIl9uZXciIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6c3RydWN0X21lbWJlcl9jb3B5X29mKHRfdHlwZSogdHlwZSwgc3RyaW5nIHdoYXQpIHsKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gd2hhdCArIHN0cmluZygiI2NvcHkiKTsKKyAgfQorICBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcgY29weV9vZl9rID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgImsiKTsKKyAgICBzdHJpbmcgY29weV9vZl92ID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgInYiKTsKKworICAgIGlmIChjb3B5X29mX2sgPT0gImsiICYmIGNvcHlfb2ZfdiA9PSAidiIpIHsKKyAgICAgIHJldHVybiBzdHJpbmcoIihIYXNodGJsLmNvcHkgIikgKyB3aGF0ICsgc3RyaW5nKCIpIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBzdHJpbmcoCisgICAgICAgICAgICAgICAgICIoKGZ1biBvaCAtPiBsZXQgbmggPSBIYXNodGJsLmNyZWF0ZSAoSGFzaHRibC5sZW5ndGggb2gpIGluIEhhc2h0YmwuaXRlciAoZnVuIGsgdiAiCisgICAgICAgICAgICAgICAgICItPiBIYXNodGJsLmFkZCBuaCAiKSArIGNvcHlfb2ZfayArIHN0cmluZygiICIpICsgY29weV9vZl92ICsgc3RyaW5nKCIpIG9oOyBuaCkgIikKKyAgICAgICAgICAgICArIHdoYXQgKyAiKSI7CisgICAgfQorICB9CisgIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHN0cmluZyBjb3B5X29mID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCksICJrIik7CisKKyAgICBpZiAoY29weV9vZiA9PSAiayIpIHsKKyAgICAgIHJldHVybiBzdHJpbmcoIihIYXNodGJsLmNvcHkgIikgKyB3aGF0ICsgc3RyaW5nKCIpIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBzdHJpbmcoCisgICAgICAgICAgICAgICAgICIoKGZ1biBvaCAtPiBsZXQgbmggPSBIYXNodGJsLmNyZWF0ZSAoSGFzaHRibC5sZW5ndGggb2gpIGluIEhhc2h0YmwuaXRlciAoZnVuIGsgdiAiCisgICAgICAgICAgICAgICAgICItPiBIYXNodGJsLmFkZCBuaCAiKSArIGNvcHlfb2YgKyBzdHJpbmcoIiB0cnVlIikgKyBzdHJpbmcoIikgb2g7IG5oKSAiKSArIHdoYXQKKyAgICAgICAgICAgICArICIpIjsKKyAgICB9CisgIH0KKyAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBjb3B5X29mID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCAieCIpOworICAgIGlmIChjb3B5X29mICE9ICJ4IikgeworICAgICAgcmV0dXJuIHN0cmluZygiKExpc3QubWFwIChmdW4geCAtPiAiKSArIGNvcHlfb2YgKyBzdHJpbmcoIikgIikgKyB3aGF0ICsgc3RyaW5nKCIpIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB3aGF0OworICAgIH0KKyAgfQorICByZXR1cm4gd2hhdDsKK30KKwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfbWVtYmVyX2NvcHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0bWVtYmVyKSB7CisgIHN0cmluZyBtbmFtZSA9IGRlY2FwaXRhbGl6ZSh0bWVtYmVyLT5nZXRfbmFtZSgpKTsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0bWVtYmVyLT5nZXRfdHlwZSgpKTsKKworICBzdHJpbmcgZ3JhYl9maWVsZCA9IHN0cmluZygic2VsZiNncmFiXyIpICsgbW5hbWU7CisgIHN0cmluZyBjb3B5X29mID0gc3RydWN0X21lbWJlcl9jb3B5X29mKHR5cGUsIGdyYWJfZmllbGQpOworICBpZiAoY29weV9vZiAhPSBncmFiX2ZpZWxkKSB7CisgICAgaW5kZW50KG91dCk7CisgICAgaWYgKCFzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpIHsKKyAgICAgIG91dCA8PCAiaWYgXyIgPDwgbW5hbWUgPDwgIiA8PiBOb25lIHRoZW4iIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICAiOworICAgIH0KKyAgICBvdXQgPDwgIl9uZXcjc2V0XyIgPDwgbW5hbWUgPDwgIiAiIDw8IGNvcHlfb2YgPDwgIjsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgdG5hbWUgPDwgIiA9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib2JqZWN0IChzZWxmKSIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X21lbWJlcihvdXQsIHRuYW1lLCAoKm1faXRlcikpOworICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICB9CisgIGdlbmVyYXRlX29jYW1sX21ldGhvZF9jb3B5KG91dCwgbWVtYmVycyk7CisgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgaW5kZW50KG91dCkgPDwgImV4Y2VwdGlvbiAiIDw8IGNhcGl0YWxpemUodG5hbWUpIDw8ICIgb2YgIiA8PCB0bmFtZSA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdHVyZSBtZW1iZXIgZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KKyAqCisgKiBAcGFyYW0gdG5hbWUgTmFtZSBvZiB0aGUgcGFyZW50IHN0cnVjdHVyZSBmb3IgdGhlIG1lbWJlcgorICogQHBhcmFtIHRtZW1iZXIgTWVtYmVyIGRlZmluaXRpb24KKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X21lbWJlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdG1lbWJlcikgeworICBzdHJpbmcgeCA9IHRtcCgiX3giKTsKKyAgc3RyaW5nIG1uYW1lID0gZGVjYXBpdGFsaXplKHRtZW1iZXItPmdldF9uYW1lKCkpOworCisgIGluZGVudChvdXQpIDw8ICJ2YWwgbXV0YWJsZSBfIiA8PCBtbmFtZSA8PCAiIDogIiA8PCByZW5kZXJfb2NhbWxfdHlwZSh0bWVtYmVyLT5nZXRfdHlwZSgpKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsID0gdG1lbWJlci0+Z2V0X3ZhbHVlKCk7CisgIGlmICh2YWwpIHsKKyAgICBpZiAoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKQorICAgICAgb3V0IDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkgPDwgZW5kbDsKKyAgICBlbHNlCisgICAgICBvdXQgPDwgIiBvcHRpb24gPSBTb21lICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHRtZW1iZXItPmdldF90eXBlKCksIHRtZW1iZXItPmdldF92YWx1ZSgpKQorICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgLy8gYXNzZXJ0KCFzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpCisgICAgb3V0IDw8ICIgb3B0aW9uID0gTm9uZSIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGdldF8iIDw8IG1uYW1lIDw8ICIgPSBTb21lIF8iIDw8IG1uYW1lIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBncmFiXyIgPDwgbW5hbWUgPDwgIiA9IF8iIDw8IG1uYW1lIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBzZXRfIiA8PCBtbmFtZSA8PCAiICIgPDwgeCA8PCAiID0gXyIgPDwgbW5hbWUgPDwgIiA8LSAiIDw8IHggPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGdldF8iIDw8IG1uYW1lIDw8ICIgPSBfIiA8PCBtbmFtZSA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ3JhYl8iIDw8IG1uYW1lIDw8ICIgPSBtYXRjaCBfIiA8PCBtbmFtZQorICAgICAgICAgICAgICAgIDw8ICIgd2l0aCBOb25lLT5yYWlzZSAoRmllbGRfZW1wdHkgXCIiIDw8IHRuYW1lIDw8ICIuIiA8PCBtbmFtZSA8PCAiXCIpIHwgU29tZSAiCisgICAgICAgICAgICAgICAgPDwgeCA8PCAiIC0+ICIgPDwgeCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgc2V0XyIgPDwgbW5hbWUgPDwgIiAiIDw8IHggPDwgIiA9IF8iIDw8IG1uYW1lIDw8ICIgPC0gU29tZSAiIDw8IHgKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgdW5zZXRfIiA8PCBtbmFtZSA8PCAiID0gXyIgPDwgbW5hbWUgPDwgIiA8LSBOb25lIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCByZXNldF8iIDw8IG1uYW1lIDw8ICIgPSBfIiA8PCBtbmFtZSA8PCAiIDwtICI7CisgIGlmICh2YWwpIHsKKyAgICBpZiAoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKQorICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkgPDwgZW5kbDsKKyAgICBlbHNlCisgICAgICBvdXQgPDwgIlNvbWUgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICJOb25lIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogQ2hlY2sgd2hldGhlciBhIG1lbWJlciBvZiB0aGUgc3RydWN0dXJlIGNhbiBub3QgaGF2ZSB1bmRlZmluZWQgdmFsdWUKKyAqCisgKiBAcGFyYW0gdG1lbWJlciBNZW1iZXIgZGVmaW5pdGlvbgorICovCitib29sIHRfb2NhbWxfZ2VuZXJhdG9yOjpzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodF9maWVsZCogdG1lbWJlcikgeworICB0X2NvbnN0X3ZhbHVlKiB2YWwgPSB0bWVtYmVyLT5nZXRfdmFsdWUoKTsKKyAgcmV0dXJuICh2YWwgPyB0cnVlIDogZmFsc2UpOworfQorCisvKioKKyAqIENoZWNrIHdoZXRoZXIgYSBtZW1iZXIgb2YgdGhlIHN0cnVjdHVyZSBjYW4gYmUgc2tpcHBlZCBkdXJpbmcgZW5jb2RpbmcKKyAqCisgKiBAcGFyYW0gdG1lbWJlciBNZW1iZXIgZGVmaW5pdGlvbgorICovCitib29sIHRfb2NhbWxfZ2VuZXJhdG9yOjpzdHJ1Y3RfbWVtYmVyX29taXRhYmxlKHRfZmllbGQqIHRtZW1iZXIpIHsKKyAgcmV0dXJuICh0bWVtYmVyLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCk7Cit9CisKKy8qKgorICogRmlndXJlIG91dCB3aGV0aGVyIGEgbWVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUgaGFzCisgKiBhIGNoZWFwbHkgY29tcGFyYWJsZSBkZWZhdWx0IHZhbHVlLgorICoKKyAqIEBwYXJhbSB0bWVtYmVyIE1lbWJlciBkZWZpbml0aW9uCisgKi8KK2Jvb2wgdF9vY2FtbF9nZW5lcmF0b3I6OnN0cnVjdF9tZW1iZXJfZGVmYXVsdF9jaGVhcGx5X2NvbXBhcmFibGUodF9maWVsZCogdG1lbWJlcikgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRtZW1iZXItPmdldF90eXBlKCkpOworICB0X2NvbnN0X3ZhbHVlKiB2YWwgPSB0bWVtYmVyLT5nZXRfdmFsdWUoKTsKKyAgaWYgKCF2YWwpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAvLyBCYXNlIHR5cGVzIGFyZSBnZW5lcmFsbHkgY2hlYXBseSBjb21wYXJlZCBmb3Igc3RydWN0dXJhbCBlcXVpdmFsZW5jZS4KKyAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsLT5nZXRfZG91YmxlKCkgPT0gMC4wKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgLy8gRW1wdHkgbGlzdHMgYXJlIGNoZWFwbHkgY29tcGFyZWQgZm9yIHN0cnVjdHVyYWwgZXF1aXZhbGVuY2UuCisgICAgLy8gSXMgZW1wdHkgbGlzdD8KKyAgICBpZiAodmFsLT5nZXRfbGlzdCgpLnNpemUoKSA9PSAwKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9zaWcob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgIiA8PCB0bmFtZSA8PCAiIDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvYmplY3QgKCdhKSIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgeCA9IHRtcCgiX3giKTsKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBtbmFtZSA9IGRlY2FwaXRhbGl6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpOworICAgICAgc3RyaW5nIHR5cGUgPSByZW5kZXJfb2NhbWxfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBnZXRfIiA8PCBtbmFtZSA8PCAiIDogIiA8PCB0eXBlIDw8ICIgb3B0aW9uIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBncmFiXyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgdHlwZSA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBzZXRfIiA8PCBtbmFtZSA8PCAiIDogIiA8PCB0eXBlIDw8ICIgLT4gdW5pdCIgPDwgZW5kbDsKKyAgICAgIGlmICghc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KCptX2l0ZXIpKQorICAgICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHVuc2V0XyIgPDwgbW5hbWUgPDwgIiA6IHVuaXQiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHJlc2V0XyIgPDwgbW5hbWUgPDwgIiA6IHVuaXQiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGluZGVudChvdXQpIDw8ICJtZXRob2QgY29weSA6ICdhIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHdyaXRlIDogUHJvdG9jb2wudCAtPiB1bml0IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZXhjZXB0aW9uICIgPDwgY2FwaXRhbGl6ZSh0bmFtZSkgPDwgIiBvZiAiIDw8IHRuYW1lIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAidmFsIHJlYWRfIiA8PCB0bmFtZSA8PCAiIDogUHJvdG9jb2wudCAtPiAiIDw8IHRuYW1lIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgc3RyaW5nIHNuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBzdHJpbmcgc3RyID0gdG1wKCJfc3RyIik7CisgIHN0cmluZyB0ID0gdG1wKCJfdCIpOworICBzdHJpbmcgaWQgPSB0bXAoIl9pZCIpOworICBpbmRlbnQob3V0KSA8PCAibGV0IHJlYyByZWFkXyIgPDwgc25hbWUgPDwgIiAoaXByb3QgOiBQcm90b2NvbC50KSA9IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImxldCAiIDw8IHN0ciA8PCAiID0gbmV3ICIgPDwgc25hbWUgPDwgIiBpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJpZ25vcmUoaXByb3QjcmVhZFN0cnVjdEJlZ2luKTsiIDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICIodHJ5IHdoaWxlIHRydWUgZG8iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnRfdXAoKTsKKworICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImxldCAoXywiIDw8IHQgPDwgIiwiIDw8IGlkIDw8ICIpID0gaXByb3QjcmVhZEZpZWxkQmVnaW4gaW4iIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgIiA8PCB0IDw8ICIgPSBQcm90b2NvbC5UX1NUT1AgdGhlbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyYWlzZSBCcmVhayIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVsc2UgKCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICIobWF0Y2ggIiA8PCBpZCA8PCAiIHdpdGggIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgInwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiIC0+ICgiOworICAgIG91dCA8PCAiaWYgIiA8PCB0IDw8ICIgPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIgdGhlbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsIHN0cik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaXByb3Qjc2tpcCAiIDw8IHQgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ8IF8gLT4gIgorICAgICAgPDwgImlwcm90I3NraXAgIiA8PCB0IDw8ICIpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJpcHJvdCNyZWFkRmllbGRFbmQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZG9uZTsgKCkiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ3aXRoIEJyZWFrIC0+ICgpKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgImlwcm90I3JlYWRTdHJ1Y3RFbmQ7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8IHN0ciA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIHN0cmluZyBzdHIgPSB0bXAoIl9zdHIiKTsKKyAgc3RyaW5nIGYgPSB0bXAoIl9mIik7CisKKyAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCB3cml0ZSAob3Byb3QgOiBQcm90b2NvbC50KSA9IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlU3RydWN0QmVnaW4gXCIiIDw8IG5hbWUgPDwgIlwiOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIHRtZW1iZXIgPSAoKmZfaXRlcik7CisgICAgc3RyaW5nIG1uYW1lID0gIl8iICsgZGVjYXBpdGFsaXplKHRtZW1iZXItPmdldF9uYW1lKCkpOworICAgIHN0cmluZyBfdjsKKworICAgIGlmIChzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpIHsKKworICAgICAgaWYgKHN0cnVjdF9tZW1iZXJfb21pdGFibGUodG1lbWJlcikgJiYgc3RydWN0X21lbWJlcl9kZWZhdWx0X2NoZWFwbHlfY29tcGFyYWJsZSh0bWVtYmVyKSkgeworICAgICAgICBfdiA9ICJfdiI7CisgICAgICAgIC8vIEF2b2lkIHJlZHVuZGFudCBlbmNvZGluZyBvZiBtZW1iZXJzIGhhdmluZyBkZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgaW5kZW50KG91dCkgPDwgIihtYXRjaCAiIDw8IG1uYW1lIDw8ICIgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkgPDwgIiAtPiAoKSB8ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgX3YgPDwgIiAtPiAiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBfdiA9IG1uYW1lOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiKCIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgIH0gZWxzZSB7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICIobWF0Y2ggIiA8PCBtbmFtZSA8PCAiIHdpdGggIjsKKworICAgICAgaWYgKHN0cnVjdF9tZW1iZXJfb21pdGFibGUodG1lbWJlcikpIHsKKyAgICAgICAgb3V0IDw8ICJOb25lIC0+ICgpIjsKKworICAgICAgICBpZiAoc3RydWN0X21lbWJlcl9kZWZhdWx0X2NoZWFwbHlfY29tcGFyYWJsZSh0bWVtYmVyKSkgeworICAgICAgICAgIC8vIEF2b2lkIHJlZHVuZGFudCBlbmNvZGluZyBvZiBtZW1iZXJzIGhhdmluZyBkZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgICBvdXQgPDwgIiB8IFNvbWUgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpCisgICAgICAgICAgICAgIDw8ICIgLT4gKCkiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCAiIHwgU29tZSBfdiAtPiAiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInwgTm9uZSAtPiByYWlzZSAoRmllbGRfZW1wdHkgXCIiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLiIgPDwgbW5hbWUKKyAgICAgICAgICAgICAgICAgICAgPDwgIlwiKSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInwgU29tZSBfdiAtPiAiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIF92ID0gIl92IjsKKyAgICB9CisgICAgaW5kZW50X3VwKCk7CisgICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlRmllbGRCZWdpbihcIiIgPDwgdG1lbWJlci0+Z2V0X25hbWUoKSA8PCAiXCIsIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSh0bWVtYmVyLT5nZXRfdHlwZSgpKSA8PCAiLCIgPDwgdG1lbWJlci0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgdG1lbWJlciwgX3YpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlRmllbGRFbmQiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVGaWVsZFN0b3A7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZVN0cnVjdEVuZCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpICsgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICIubWwiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisgIHN0cmluZyBmX3NlcnZpY2VfaV9uYW1lID0gZ2V0X291dF9kaXIoKSArIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiLm1saSI7CisgIGZfc2VydmljZV9pXy5vcGVuKGZfc2VydmljZV9pX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IG9jYW1sX2ltcG9ydHMoKSA8PCBlbmRsOworICBmX3NlcnZpY2VfaV8gPDwgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKKworICAvKiBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGZfc2VydmljZV8gPDwKKyAgICAgICJvcGVuICIgPDwgY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfaV8gPDwKKyAgICAgICJvcGVuICIgPDwgY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgfQorICAqLworICBmX3NlcnZpY2VfIDw8ICJvcGVuICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlX2lfIDw8ICJvcGVuICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKKworICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworICBmX3NlcnZpY2VfaV8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigqIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMgKikiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX29jYW1sX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfcmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKyAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2xhc3MgdmlydHVhbCBpZmFjZSA9IiA8PCBlbmRsIDw8ICJvYmplY3QgKHNlbGYpIiA8PCBlbmRsOworICBmX3NlcnZpY2VfaV8gPDwgaW5kZW50KCkgPDwgImNsYXNzIHZpcnR1YWwgaWZhY2UgOiIgPDwgZW5kbCA8PCAib2JqZWN0IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgc3RyaW5nIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5oZXJpdCAiIDw8IGV4dGVuZHMgPDwgIi5pZmFjZSIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiaW5oZXJpdCAiIDw8IGV4dGVuZHMgPDwgIi5pZmFjZSIgPDwgZW5kbDsKKyAgfQorCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdCA9IGZ1bmN0aW9uX3R5cGUoKmZfaXRlciwgdHJ1ZSwgdHJ1ZSk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibWV0aG9kIHZpcnR1YWwgIiA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDogIgorICAgICAgICAgICAgICAgPDwgZnQgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfaV8gPDwgaW5kZW50KCkgPDwgIm1ldGhvZCB2aXJ0dWFsICIgPDwgZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIKKyAgICAgICAgICAgICAgICAgPDwgZnQgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4gTm90ZSB0aGF0IGluIE9DYW1sLCB0aGUgY2xpZW50IGRvZXNuJ3QgaW1wbGVtZW50IGlmYWNlLgorICpUaGlzIGlzIGJlY2F1c2UKKyAqIFRoZSBjbGllbnQgZG9lcyBub3QgKGFuZCBzaG91bGQgbm90IGhhdmUgdG8pIGRlYWwgd2l0aCBhcmd1bWVudHMgYmVpbmcgTm9uZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2xhc3MgY2xpZW50IChpcHJvdCA6IFByb3RvY29sLnQpIChvcHJvdCA6IFByb3RvY29sLnQpID0iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJvYmplY3QgKHNlbGYpIiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiY2xhc3MgY2xpZW50IDogUHJvdG9jb2wudCAtPiBQcm90b2NvbC50IC0+ICIgPDwgZW5kbCA8PCAib2JqZWN0IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5oZXJpdCAiIDw8IGV4dGVuZHMgPDwgIi5jbGllbnQgaXByb3Qgb3Byb3QgYXMgc3VwZXIiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuY2xpZW50IiA8PCBlbmRsOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFsIG11dGFibGUgc2VxaWQgPSAwIiA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtZXRob2QgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIiA9ICIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAibWV0aG9kICIgPDwgZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBmdW5jdGlvbl90eXBlKCpmX2l0ZXIsIHRydWUsIGZhbHNlKSA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZiNzZW5kXyIgPDwgZnVubmFtZTsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgIiA8PCBkZWNhcGl0YWxpemUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICI7IiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCAic2VsZiNyZWN2XyIgPDwgZnVubmFtZSA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtZXRob2QgcHJpdmF0ZSBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICIgPSAiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZU1lc3NhZ2VCZWdpbiAoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlByb3RvY29sLk9ORVdBWSIgOiAiUHJvdG9jb2wuQ0FMTCIpIDw8ICIsIHNlcWlkKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibGV0IGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiIGluIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mjc2V0XyIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiAiCisgICAgICAgICAgICAgICAgIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzI3dyaXRlIG9wcm90OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVNZXNzYWdlRW5kOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90I2dldFRyYW5zcG9ydCNmbHVzaCIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7CisgICAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJtZXRob2QgcHJpdmF0ZSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgIiA9IgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIC8vIFRPRE8obWNzbGVlKTogVmFsaWRhdGUgbWVzc2FnZSByZXBseSBoZXJlLCBzZXEgaWRzIGV0Yy4KKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibGV0IChmbmFtZSwgbXR5cGUsIHJzZXFpZCkgPSBpcHJvdCNyZWFkTWVzc2FnZUJlZ2luIGluIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIoaWYgbXR5cGUgPSBQcm90b2NvbC5FWENFUFRJT04gdGhlbiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICBsZXQgeCA9IEFwcGxpY2F0aW9uX0V4bi5yZWFkIGlwcm90IGluIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIChpcHJvdCNyZWFkTWVzc2FnZUVuZDsiIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgICByYWlzZSAoQXBwbGljYXRpb25fRXhuLkUgeCkpIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImVsc2UgKCkpOyIgPDwgZW5kbDsKKyAgICAgIHN0cmluZyByZXMgPSAiXyI7CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSB8fCB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICByZXMgPSAicmVzdWx0IjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHJlcyA8PCAiID0gcmVhZF8iIDw8IHJlc3VsdG5hbWUgPDwgIiBpcHJvdCBpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibWF0Y2ggcmVzdWx0I2dldF9zdWNjZXNzIHdpdGggU29tZSB2IC0+IHYgfCBOb25lIC0+ICgiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgfQorCisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIobWF0Y2ggcmVzdWx0I2dldF8iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgIDw8ICIgd2l0aCBOb25lIC0+ICgpIHwgU29tZSBfdiAtPiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHJhaXNlICgiIDw8IGNhcGl0YWxpemUodHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIF92KSk7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigpIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXworICAgICAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJyYWlzZSAoQXBwbGljYXRpb25fRXhuLkUgKEFwcGxpY2F0aW9uX0V4bi5jcmVhdGUgQXBwbGljYXRpb25fRXhuLk1JU1NJTkdfUkVTVUxUIFwiIgorICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSkpIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfQorCisgICAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2xhc3MgcHJvY2Vzc29yIChoYW5kbGVyIDogaWZhY2UpID0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9iamVjdCAoc2VsZikiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiY2xhc3MgcHJvY2Vzc29yIDogaWZhY2UgLT4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9iamVjdCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaW5oZXJpdCBQcm9jZXNzb3IudCIgPDwgZW5kbCA8PCBlbmRsOworICBmX3NlcnZpY2VfaV8gPDwgaW5kZW50KCkgPDwgImluaGVyaXQgUHJvY2Vzc29yLnQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5oZXJpdCAiICsgZXh0ZW5kcyArICIucHJvY2Vzc29yIChoYW5kbGVyIDo+ICIgKyBleHRlbmRzICsgIi5pZmFjZSkiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImluaGVyaXQgIiArIGV4dGVuZHMgKyAiLnByb2Nlc3NvciIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhbCBwcm9jZXNzTWFwID0gSGFzaHRibC5jcmVhdGUgIiA8PCBmdW5jdGlvbnMuc2l6ZSgpIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KGZfc2VydmljZV9pXykKKyAgICAgIDw8ICJ2YWwgcHJvY2Vzc01hcCA6IChzdHJpbmcsIGludCAqIFByb3RvY29sLnQgKiBQcm90b2NvbC50IC0+IHVuaXQpIEhhc2h0YmwudCIgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibWV0aG9kIHByb2Nlc3MgaXByb3Qgb3Byb3QgPSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgIm1ldGhvZCBwcm9jZXNzIDogUHJvdG9jb2wudCAtPiBQcm90b2NvbC50IC0+IGJvb2wiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCAobmFtZSwgdHlwLCBzZXFpZCkgID0gaXByb3QjcmVhZE1lc3NhZ2VCZWdpbiBpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZQorCisgIC8vIEhPVDogZGljdGlvbmFyeSBmdW5jdGlvbiBsb29rdXAKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgSGFzaHRibC5tZW0gcHJvY2Vzc01hcCBuYW1lIHRoZW4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICAoSGFzaHRibC5maW5kIHByb2Nlc3NNYXAgbmFtZSkgKHNlcWlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgImVsc2UgKCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdCNza2lwKFByb3RvY29sLlRfU1RSVUNUKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdCNyZWFkTWVzc2FnZUVuZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICBsZXQgeCA9IEFwcGxpY2F0aW9uX0V4bi5jcmVhdGUgQXBwbGljYXRpb25fRXhuLlVOS05PV05fTUVUSE9EIChcIlVua25vd24gIgorICAgICAgICAgICAgICAgICJmdW5jdGlvbiBcIl5uYW1lKSBpbiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIgICAgb3Byb3Qjd3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgUHJvdG9jb2wuRVhDRVBUSU9OLCBzZXFpZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgICB4I3dyaXRlIG9wcm90OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAgIG9wcm90I3dyaXRlTWVzc2FnZUVuZDsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgIG9wcm90I2dldFRyYW5zcG9ydCNmbHVzaCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgLy8gUmVhZCBlbmQgb2YgYXJncyBmaWVsZCwgdGhlIFRfU1RPUCwgYW5kIHRoZSBzdHJ1Y3QgY2xvc2UKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ1ZSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaXRpYWxpemVyIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJIYXNodGJsLmFkZCBwcm9jZXNzTWFwIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIiBzZWxmI3Byb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtZXRob2QgcHJpdmF0ZSBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICA8PCAiIChzZXFpZCwgaXByb3QsIG9wcm90KSA9IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBhcmdzID0gImFyZ3MiOworICBpZiAoZmllbGRzLnNpemUoKSA9PSAwKSB7CisgICAgYXJncyA9ICJfIjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IGFyZ3MgPDwgIiA9IHJlYWRfIiA8PCBhcmdzbmFtZSA8PCAiIGlwcm90IGluIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKHRyeSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQjc2V0X3N1Y2Nlc3MgIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICIoaGFuZGxlciMiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIgYXJncyNnZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIndpdGgiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInwgIiA8PCBjYXBpdGFsaXplKHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpKSA8PCAiICIKKyAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgLT4gIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQjc2V0XyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIgorICAgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKSI7CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKCkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIHJldHVybjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlTWVzc2FnZUJlZ2luIChcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiLCBQcm90b2NvbC5SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0I3dyaXRlIG9wcm90OyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZU1lc3NhZ2VFbmQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIm9wcm90I2dldFRyYW5zcG9ydCNmbHVzaCIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisKKyAgc3RyaW5nIG5hbWUgPSBkZWNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIjc2V0XyIgPDwgbmFtZSA8PCAiICI7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCB0eXBlKTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFIjsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgb3V0IDw8ICJpcHJvdCMiOworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3QiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgInJlYWRTdHJpbmciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICJyZWFkQm9vbCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgb3V0IDw8ICJyZWFkQnl0ZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIG91dCA8PCAicmVhZEkxNiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIG91dCA8PCAicmVhZEkzMiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCAicmVhZEk2NCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIG91dCA8PCAicmVhZERvdWJsZSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBvY2FtbCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSk7CisgICAgb3V0IDw8ICIoIiA8PCBlbmFtZSA8PCAiLm9mX2kgaXByb3QjcmVhZEkzMikiOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIFRZUEUgJyVzJ1xuIiwgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBjYWxsaW5nIHJlYWQoKQorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcHJlZml4ID0gIiI7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHByZWZpeCA9IGNhcGl0YWxpemUocHJvZ3JhbS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzLiI7CisgIH0KKyAgc3RyaW5nIG5hbWUgPSBkZWNhcGl0YWxpemUodHN0cnVjdC0+Z2V0X25hbWUoKSk7CisgIG91dCA8PCAiKCIgPDwgcHJlZml4IDw8ICJyZWFkXyIgPDwgbmFtZSA8PCAiIGlwcm90KSI7Cit9CisKKy8qKgorICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKKyAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUpIHsKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7CisgIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7CisgIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7CisgIHN0cmluZyBjb24gPSB0bXAoIl9jb24iKTsKKworICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOworICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfaTgsIGt0eXBlKTsKKyAgdF9maWVsZCBmdnR5cGUoZ190eXBlX2k4LCB2dHlwZSk7CisgIHRfZmllbGQgZmV0eXBlKGdfdHlwZV9pOCwgZXR5cGUpOworCisgIG91dCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIiA8PCBrdHlwZSA8PCAiLCIgPDwgdnR5cGUgPDwgIiwiIDw8IHNpemUgPDwgIikgPSBpcHJvdCNyZWFkTWFwQmVnaW4gaW4iCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0ICIgPDwgY29uIDw8ICIgPSBIYXNodGJsLmNyZWF0ZSAiIDw8IHNpemUgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIGkgPSAxIHRvICIgPDwgc2l6ZSA8PCAiIGRvIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJsZXQgX2sgPSAiOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKKyAgICBvdXQgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0IF92ID0gIjsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7CisgICAgb3V0IDw8ICIgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuYWRkICIgPDwgY29uIDw8ICIgX2sgX3YiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJkb25lOyBpcHJvdCNyZWFkTWFwRW5kOyAiIDw8IGNvbiA8PCAiKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIiA8PCBldHlwZSA8PCAiLCIgPDwgc2l6ZSA8PCAiKSA9IGlwcm90I3JlYWRTZXRCZWdpbiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0ICIgPDwgY29uIDw8ICIgPSBIYXNodGJsLmNyZWF0ZSAiIDw8IHNpemUgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIGkgPSAxIHRvICIgPDwgc2l6ZSA8PCAiIGRvIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLmFkZCAiIDw8IGNvbiA8PCAiICI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICBvdXQgPDwgIiB0cnVlIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImRvbmU7IGlwcm90I3JlYWRTZXRFbmQ7ICIgPDwgY29uIDw8ICIpIjsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIiA8PCBldHlwZSA8PCAiLCIgPDwgc2l6ZSA8PCAiKSA9IGlwcm90I3JlYWRMaXN0QmVnaW4gaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImxldCAiIDw8IGNvbiA8PCAiID0gKEFycmF5LnRvX2xpc3QgKEFycmF5LmluaXQgIiA8PCBzaXplIDw8ICIgKGZ1biBfIC0+ICI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgb3V0IDw8ICIpKSkgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90I3JlYWRMaXN0RW5kOyAiIDw8IGNvbiA8PCAiKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBuYW1lKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCMiOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBvY2FtbCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSk7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgZW5hbWUgPDwgIi50b19pICIgPDwgbmFtZSA8PCAiKSI7CisgICAgfQorCisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorICBvdXQgPDwgIjsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiI3dyaXRlKG9wcm90KSI7Cit9CisKK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVNYXBCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCI7CisgICAgb3V0IDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCI7CisgICAgb3V0IDw8ICJIYXNodGJsLmxlbmd0aCAiIDw8IHByZWZpeCA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlU2V0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsIjsKKyAgICBvdXQgPDwgIkhhc2h0YmwubGVuZ3RoICIgPDwgcHJlZml4IDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlTGlzdEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCI7CisgICAgb3V0IDw8ICJMaXN0Lmxlbmd0aCAiIDw8IHByZWZpeCA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGtpdGVyID0gdG1wKCJfa2l0ZXIiKTsKKyAgICBzdHJpbmcgdml0ZXIgPSB0bXAoIl92aXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLml0ZXIgKGZ1biAiIDw8IGtpdGVyIDw8ICIgLT4gZnVuICIgPDwgdml0ZXIgPDwgIiAtPiAiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpICIgPDwgcHJlZml4IDw8ICI7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLml0ZXIgKGZ1biAiIDw8IGl0ZXIgPDwgIiAtPiBmdW4gXyAtPiAiOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIikgIiA8PCBwcmVmaXggPDwgIjsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJMaXN0Lml0ZXIgKGZ1biAiIDw8IGl0ZXIgPDwgIiAtPiAiOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSAiIDw8IHByZWZpeCA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVNYXBFbmQiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZVNldEVuZCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZUxpc3RFbmQiOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkKTsKKworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAnbmFtZSBhcmdzJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgcmV0dXJuIHByZWZpeCArIGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIiAiCisgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKK30KKworc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpmdW5jdGlvbl90eXBlKHRfZnVuY3Rpb24qIHRmdW5jLCBib29sIG1ldGhvZCwgYm9vbCBvcHRpb25zKSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdCArPSByZW5kZXJfb2NhbWxfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGlmIChvcHRpb25zKQorICAgICAgcmVzdWx0ICs9ICIgb3B0aW9uIjsKKyAgICByZXN1bHQgKz0gIiAtPiAiOworICB9CisgIGlmIChmaWVsZHMuZW1wdHkoKSAmJiAhbWV0aG9kKSB7CisgICAgcmVzdWx0ICs9ICJ1bml0IC0+ICI7CisgIH0KKyAgcmVzdWx0ICs9IHJlbmRlcl9vY2FtbF90eXBlKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgbGlzdAorICovCitzdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiAiOworICAgIH0KKyAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgc3RyaW5nIHByZWZpeCA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgaWYgKCF0dHlwZS0+aXNfc2VydmljZSgpKSB7CisgICAgICBwcmVmaXggPSBjYXBpdGFsaXplKHByb2dyYW0tPmdldF9uYW1lKCkpICsgIl90eXBlcy4iOworICAgIH0KKyAgfQorCisgIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7CisgIGlmICh0dHlwZS0+aXNfc2VydmljZSgpKSB7CisgICAgbmFtZSA9IGNhcGl0YWxpemUobmFtZSk7CisgIH0gZWxzZSB7CisgICAgbmFtZSA9IGRlY2FwaXRhbGl6ZShuYW1lKTsKKyAgfQorICByZXR1cm4gcHJlZml4ICsgbmFtZTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIFByb3RvY29sLnRfdHlwZSBlbnVtCisgKi8KK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9WT0lEIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0JZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0kxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlByb3RvY29sLlRfSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0RPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiUHJvdG9jb2wuVF9JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlByb3RvY29sLlRfU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiUHJvdG9jb2wuVF9NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJQcm90b2NvbC5UX1NFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJQcm90b2NvbC5UX0xJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGFuIG9jYW1sIHR5cGUKKyAqLworc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpyZW5kZXJfb2NhbWxfdHlwZSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gInVuaXQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJzdHJpbmciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiYm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiSW50MzIudCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIkludDY0LnQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJmbG9hdCI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiBjYXBpdGFsaXplKCgodF9lbnVtKil0eXBlKS0+Z2V0X25hbWUoKSkgKyAiLnQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKCh0X3N0cnVjdCopdHlwZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgcmV0dXJuICIoIiArIHJlbmRlcl9vY2FtbF90eXBlKGt0eXBlKSArICIsIiArIHJlbmRlcl9vY2FtbF90eXBlKHZ0eXBlKSArICIpIEhhc2h0YmwudCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICByZXR1cm4gIigiICsgcmVuZGVyX29jYW1sX3R5cGUoZXR5cGUpICsgIixib29sKSBIYXNodGJsLnQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICByZXR1cm4gcmVuZGVyX29jYW1sX3R5cGUoZXR5cGUpICsgIiBsaXN0IjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihvY2FtbCwgIk9DYW1sIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZGE1NDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfT09QX0dFTkVSQVRPUl9ICisjZGVmaW5lIFRfT09QX0dFTkVSQVRPUl9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvY29tbW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKy8qKgorICogQ2xhc3Mgd2l0aCB1dGlsaXR5IG1ldGhvZHMgc2hhcmVkIGFjcm9zcyBjb21tb24gb2JqZWN0IG9yaWVudGVkIGxhbmd1YWdlcy4KKyAqIFNwZWNpZmljYWxseSwgbW9zdCBvZiB0aGlzIHN0dWZmIGlzIGZvciBDKysvSmF2YS4KKyAqCisgKi8KK2NsYXNzIHRfb29wX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfb29wX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0pIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkge30KKworICAvKioKKyAgICogU2NvcGluZywgdXNpbmcgY3VybHkgYnJhY2VzIQorICAgKi8KKworICB2b2lkIHNjb3BlX3VwKHN0ZDo6b3N0cmVhbSYgb3V0KSB7CisgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IHN0ZDo6ZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIHZvaWQgc2NvcGVfZG93bihzdGQ6Om9zdHJlYW0mIG91dCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IHN0ZDo6ZW5kbDsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHVwY2FzZV9zdHJpbmcoc3RkOjpzdHJpbmcgb3JpZ2luYWwpIHsKKyAgICBzdGQ6OnRyYW5zZm9ybShvcmlnaW5hbC5iZWdpbigpLCBvcmlnaW5hbC5lbmQoKSwgb3JpZ2luYWwuYmVnaW4oKSwgKGludCAoKikoaW50KSl0b3VwcGVyKTsKKyAgICByZXR1cm4gb3JpZ2luYWw7CisgIH0KKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7CisgICAgc3RkOjpzdHJpbmcgcGFja2FnZSA9ICIiOworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpICsgIi4iOworICAgIH0KKyAgICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY29udGVudHMpIHsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBjb250ZW50cywgIiAqL1xuIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSBmaWVsZC0+Z2V0X2RvYygpICsgIlxuQHNlZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRfZW51bV9jbGFzc19uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCAodF9kb2MqKWZpZWxkKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRW1pdHMgYSBKYXZhRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgICAqLworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgICAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgICAgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvdXQsIHRkb2MtPmdldF9kb2MoKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEVtaXRzIGEgSmF2YURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICAgKi8KKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgc3MgPDwgdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOworICAgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IHAtPmdldF9uYW1lKCk7CisgICAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgICBzcyA8PCAiICIgPDwgcC0+Z2V0X2RvYygpOworICAgICAgICB9CisgICAgICB9CisgICAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBzcy5zdHIoKSwgIiAqL1xuIik7CisgICAgfQorICB9Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcGVybF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MjRhNzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTY4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogUEVSTCBjb2RlIGdlbmVyYXRvci4KKyAqCisgKi8KK2NsYXNzIHRfcGVybF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9wZXJsX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSksIGZfdHlwZXNfdXNlX2luY2x1ZGVzX2VtaXR0ZWRfKGZhbHNlKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgLyogbm8gb3B0aW9ucyB5ZXQgKi8KKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBwZXJsOiIgKyBpdGVyLT5maXJzdDsKKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1wZXJsIjsKKyAgICBlc2NhcGVfWyckJ10gPSAiXFwkIjsKKyAgICBlc2NhcGVfWydAJ10gPSAiXFxAIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFN0cnVjdHMhCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfcGVybF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3Blcmxfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3Blcmxfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3BlcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfdXNlX2luY2x1ZGVzKHN0ZDo6b3N0cmVhbSYgb3MsIGJvb2wmIGRvbmUsIHRfdHlwZSAqdHlwZSwgYm9vbCBzZWxmaXNoKTsKKworICAvKioKKyAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcyA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgcGVybF9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIGJvb2wgb2JqID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisKKyAgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiI1xuIikgKyAiIyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKKyAgICAgICAgICAgKyAiI1xuIiArICIjIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKyAiI1xuIjsKKyAgfQorCisgIHZvaWQgcGVybF9uYW1lc3BhY2VfZGlycyh0X3Byb2dyYW0qIHAsIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4mIGRpcnMpIHsKKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBlcmwiKTsKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKworICAgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgZGlycy5wdXNoX2JhY2sobnMuc3Vic3RyKDAsIGxvYykpOworICAgICAgICBucyA9IG5zLnN1YnN0cihsb2MgKyAxKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobnMuc2l6ZSgpID4gMCkgeworICAgICAgZGlycy5wdXNoX2JhY2sobnMpOworICAgIH0KKyAgfQorCisgIHN0ZDo6c3RyaW5nIHBlcmxfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgeworICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgicGVybCIpOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICIiOworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbG9jOworCisgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKKyAgICAgIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICByZXN1bHQgKz0gbnMuc3Vic3RyKDAsIGxvYyk7CisgICAgICAgIHJlc3VsdCArPSAiOjoiOworICAgICAgICBucyA9IG5zLnN1YnN0cihsb2MgKyAxKTsKKyAgICAgIH0KKworICAgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKKyAgICAgICAgcmVzdWx0ICs9IG5zICsgIjo6IjsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0X25hbWVzcGFjZV9vdXRfZGlyKCkgeworICAgIHN0ZDo6c3RyaW5nIG91dGRpciA9IGdldF9vdXRfZGlyKCk7CisgICAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiBkaXJzOworICAgIHBlcmxfbmFtZXNwYWNlX2RpcnMocHJvZ3JhbV8sIGRpcnMpOworICAgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0OworICAgIGZvciAoaXQgPSBkaXJzLmJlZ2luKCk7IGl0ICE9IGRpcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgIG91dGRpciArPSAqaXQgKyAiLyI7CisgICAgfQorICAgIHJldHVybiBvdXRkaXI7CisgIH0KKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0c187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9oZWxwZXJzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworCisgIGJvb2wgZl90eXBlc191c2VfaW5jbHVkZXNfZW1pdHRlZF87Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICBzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKKyAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiBkaXJzOworICBwZXJsX25hbWVzcGFjZV9kaXJzKHByb2dyYW1fLCBkaXJzKTsKKyAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXQ7CisgIGZvciAoaXQgPSBkaXJzLmJlZ2luKCk7IGl0ICE9IGRpcnMuZW5kKCk7IGl0KyspIHsKKyAgICBvdXRkaXIgKz0gKml0ICsgIi8iOworICAgIE1LRElSKG91dGRpci5jX3N0cigpKTsKKyAgfQorCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IG91dGRpciArICJUeXBlcy5wbSI7CisgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IG91dGRpciArICJDb25zdGFudHMucG0iOworICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBwZXJsX2luY2x1ZGVzKCk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfY29uc3RzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCAiQ29uc3RhbnRzOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgcGVybF9pbmNsdWRlcygpIDw8IGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIGphdmEgaW1wb3J0cworICovCitzdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6cGVybF9pbmNsdWRlcygpIHsKKyAgc3RyaW5nIGluYzsKKworICBpbmMgID0gInVzZSA1LjEwLjA7XG4iOworICBpbmMgKz0gInVzZSBzdHJpY3Q7XG4iOworICBpbmMgKz0gInVzZSB3YXJuaW5ncztcbiI7CisgIGluYyArPSAidXNlIFRocmlmdDo6RXhjZXB0aW9uO1xuIjsKKyAgaW5jICs9ICJ1c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTtcbiI7CisgIGluYyArPSAidXNlIFRocmlmdDo6VHlwZTtcblxuIjsKKworICByZXR1cm4gaW5jOworfQorCisvKioKKyAqIENsb3NlIHVwIChvciBkb3duKSBzb21lIGZpbGV6LgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gQ2xvc2UgdHlwZXMgZmlsZQorICBmX3R5cGVzXyA8PCAiMTsiIDw8IGVuZGw7CisgIGZfdHlwZXNfLmNsb3NlKCk7CisKKyAgZl9jb25zdHNfIDw8ICIxOyIgPDwgZW5kbDsKKyAgZl9jb25zdHNfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBQRVJMLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIFNpbmNlIGRlZmluZSBpcyBleHBlbnNpdmUgdG8gbG9va3VwCisgKiBpbiBQRVJMLCB3ZSB1c2UgYSBnbG9iYWwgYXJyYXkgZm9yIHRoaXMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBmX3R5cGVzXyA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBmX3R5cGVzXyA8PCAidXNlIGNvbnN0YW50ICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT4gIiA8PCB2YWx1ZSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGZfY29uc3RzXyA8PCAidXNlIGNvbnN0YW50ICIgPDwgbmFtZSA8PCAiID0+ICI7CisgIGZfY29uc3RzXyA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOworICBmX2NvbnN0c18gPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCitzdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gIjEiIDogIjAiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCBwZXJsX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICItPm5ldyh7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIG91dCA8PCAiID0+ICI7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIG91dCA8PCAiLCI7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIG91dCA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBvdXQgPDwgIiA9PiAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgb3V0IDw8ICJbIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisKKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgb3V0IDw8ICIgPT4gMSI7CisgICAgICB9CisgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIl0iOworICB9CisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogTWFrZSBhIHN0cnVjdAorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9wZXJsX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9wZXJsX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIFN0cnVjdHMgY2FuIGJlIG5vcm1hbCBvciBleGNlcHRpb25zLgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV91c2VfaW5jbHVkZXMoZl90eXBlc18sIGZfdHlwZXNfdXNlX2luY2x1ZGVzX2VtaXR0ZWRfLCB0c3RydWN0LCBmYWxzZSk7CisgIGdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBub3RoaW5nIGluIFBFUkwKKyAqIHdoZXJlIHRoZSBvYmplY3RzIGFyZSBhbGwganVzdCBhc3NvY2lhdGl2ZSBhcnJheXMgKHVubGVzcyBvZiBjb3Vyc2Ugd2UKKyAqIGRlY2lkZSB0byBzdGFydCB1c2luZyBvYmplY3RzIGZvciB0aGVtLi4uKQorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgb3V0IDw8ICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiO1xuIjsKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAidXNlIGJhc2UgcXcoVGhyaWZ0OjpURXhjZXB0aW9uKTtcbiI7CisgIH0KKworICAvLyBDcmVhdGUgc2ltcGxlIGFjZXNzb3IgbWV0aG9kcworICBvdXQgPDwgInVzZSBiYXNlIHF3KENsYXNzOjpBY2Nlc3Nvcik7XG4iOworCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgcGVybF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLT5ta19hY2Nlc3NvcnMoIHF3KCAiOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICghdC0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgIikgKTtcbiI7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBuZXcoKQorICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8ICJzdWIgbmV3IHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICRjbGFzc25hbWUgPSBzaGlmdDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJteSAkc2VsZiAgICAgID0ge307IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkdmFscyAgICAgID0gc2hpZnQgfHwge307IiA8PCBlbmRsOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBzdHJpbmcgZHZhbCA9ICJ1bmRlZiI7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgISh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgeworICAgICAgZHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSgoKm1faXRlciktPmdldF90eXBlKCksICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRzZWxmLT57IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAiIDw8IGR2YWwgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjb25zdHJ1Y3RvciBmcm9tIGFycmF5CisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIkc2VsZi0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJ9ID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoVU5JVkVSU0FMOjppc2EoJHZhbHMsJ0hBU0gnKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChkZWZpbmVkICR2YWxzLT57IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIn0pIHsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAkc2VsZi0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gJHZhbHMtPnsiCisgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBibGVzcyAoJHNlbGYsICRjbGFzc25hbWUpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8ICJ9XG5cbiI7CisKKyAgb3V0IDw8ICJzdWIgZ2V0TmFtZSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWFkKCkgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgInN1YiByZWFkIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJteSAoJHNlbGYsICRpbnB1dCkgPSBAXzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICR4ZmVyICA9IDA7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAibXkgJGZuYW1lOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJGZ0eXBlID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJteSAkZmlkICAgPSAwOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oXFwkZm5hbWUpOyIgPDwgZW5kbDsKKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICgxKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKFxcJGZuYW1lLCBcXCRmdHlwZSwgXFwkZmlkKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgKCRmdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVE9QKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImxhc3Q7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBpbmRlbnQob3V0KSA8PCAiU1dJVENIOiBmb3IoJGZpZCkiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgIGluZGVudChvdXQpIDw8ICIvXiIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiQvICYmIGRveyI7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgkZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic2VsZi0+Iik7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICIgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibGFzdDsgfTsiIDw8IGVuZGw7CisgIH0KKyAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAorCisgIGluZGVudChvdXQpIDw8ICIgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gJHhmZXI7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgd3JpdGUoKSBtZXRob2QgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGVybF9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIG91dCA8PCAic3ViIHdyaXRlIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJteSAoJHNlbGYsICRvdXRwdXQpID0gQF87IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAibXkgJHhmZXIgICA9IDA7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHNlbGYtPnsiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oIgorICAgICAgICAgICAgICAgIDw8ICInIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYtPiIpOworCisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICR4ZmVyOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdXNlIGNsYXVzZXMgZm9yIGluY2x1ZGVkIGVudGl0aWVzCisgKgorICogQHBhcmFtICBvcyAgICAgICBUaGUgb3V0cHV0IHN0cmVhbQorICogQHBhcmFtICBkb25lICAgICBBIGZsYWcgcmVmZXJlbmNlIHRvIGRlYm91bmNlIHRoZSBhY3Rpb24KKyAqIEBwYXJhbSAgdHlwZSAgICAgVGhlIHR5cGUgYmVpbmcgcHJvY2Vzc2VkCisgKiBAcGFyYW0gIHNlbGZpc2ggIEZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIGN1cnJlbnQgbmFtZXNwYWNlIHR5cGVzIHNob3VsZCBiZSAidXNlImQgYXMgd2VsbC4KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91c2VfaW5jbHVkZXMoc3RkOjpvc3RyZWFtJiBvcywgYm9vbCYgZG9uZSwgdF90eXBlICp0eXBlLCBib29sIHNlbGZpc2gpIHsKKyAgdF9wcm9ncmFtICpjdXJyZW50ID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKGN1cnJlbnQgJiYgIWRvbmUpIHsKKyAgICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiYgY3VyckluYyA9IGN1cnJlbnQtPmdldF9pbmNsdWRlcygpOworICAgIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+OjpzaXplX3R5cGUgbnVtSW5jID0gY3VyckluYy5zaXplKCk7CisgICAgaWYgKHNlbGZpc2gpIHsKKyAgICAgIG9zIDw8ICJ1c2UgIiA8PCBwZXJsX25hbWVzcGFjZShjdXJyZW50KSA8PCAiVHlwZXM7IiA8PCBlbmRsOworICAgIH0KKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+OjpzaXplX3R5cGUgaSA9IDA7IGkgPCBudW1JbmM7ICsraSkgeworICAgICAgdF9wcm9ncmFtKiBpbmNQcm9ncmFtID0gY3VyckluYy5hdChpKTsKKyAgICAgIG9zIDw8ICJ1c2UgIiA8PCBwZXJsX25hbWVzcGFjZShpbmNQcm9ncmFtKSA8PCAiVHlwZXM7IiA8PCBlbmRsOworICAgIH0KKyAgICBvcyA8PCBlbmRsOworICAgIGRvbmUgPSB0cnVlOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X25hbWVzcGFjZV9vdXRfZGlyKCkgKyBzZXJ2aWNlX25hbWVfICsgIi5wbSI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IHBlcmxfaW5jbHVkZXMoKTsKKworICBib29sIGRvbmUgPSBmYWxzZTsKKyAgZ2VuZXJhdGVfdXNlX2luY2x1ZGVzKGZfc2VydmljZV8sIGRvbmUsIHRzZXJ2aWNlLCB0cnVlKTsKKworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJ1c2UgIiA8PCBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpIDw8IGV4dGVuZHNfcy0+Z2V0X25hbWUoKSA8PCAiOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UgKHdlbGwsIHR3byBmb3Igbm93IGluIFBFUkwpCisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9yZXN0KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSk7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCisgIGZfc2VydmljZV8gPDwgIjE7IiA8PCBlbmRsOworICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kc19zLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gInVzZSBiYXNlIHF3KCIgKyBleHRlbmRzICsgIlByb2Nlc3Nvcik7IjsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBmX3NlcnZpY2VfIDw8ICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvcjsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICJ1c2Ugc3RyaWN0OyIgPDwgZW5kbCA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgInN1YiBuZXcgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgKCRjbGFzc25hbWUsICRoYW5kbGVyKSA9IEBfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm15ICRzZWxmICAgICAgPSB7fTsiIDw8IGVuZGw7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkc2VsZi0+e2hhbmRsZXJ9ID0gJGhhbmRsZXI7IiA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGJsZXNzICgkc2VsZiwgJGNsYXNzbmFtZSk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyAgZl9zZXJ2aWNlXyA8PCAic3ViIHByb2Nlc3MgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgKCRzZWxmLCAkaW5wdXQsICRvdXRwdXQpID0gQF87IiA8PCBlbmRsOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICRyc2VxaWQgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJGZuYW1lICA9IHVuZGVmOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJteSAkbXR5cGUgID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlQmVnaW4oXFwkZm5hbWUsIFxcJG10eXBlLCBcXCRyc2VxaWQpOyIgPDwgZW5kbDsKKworICAvLyBIT1Q6IGNoZWNrIGZvciBtZXRob2QgaW1wbGVtZW50YXRpb24KKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJG1ldGhvZG5hbWUgPSAncHJvY2Vzc18nLiRmbmFtZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiaWYgKCEkc2VsZi0+Y2FuKCRtZXRob2RuYW1lKSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGlucHV0LT5za2lwKFRocmlmdDo6VFR5cGU6OlNUUlVDVCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAibXkgJHggPSBUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi0+bmV3KCdGdW5jdGlvbiAnLiRmbmFtZS4nIG5vdCBpbXBsZW1lbnRlZC4nLCAiCisgICAgICAgICAgICAgICAgIlRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCRmbmFtZSwgVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTiwgJHJzZXFpZCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR4LT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiRzZWxmLT4kbWV0aG9kbmFtZSgkcnNlcWlkLCAkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIDE7IgorICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgZl9zZXJ2aWNlXyA8PCAic3ViIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICgkc2VsZiwgJHNlcWlkLCAkaW5wdXQsICRvdXRwdXQpID0gQF87IiA8PCBlbmRsOworCisgIHN0cmluZyBhcmdzbmFtZSA9IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIi0+bmV3KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiRhcmdzLT5yZWFkKCRpbnB1dCk7IiA8PCBlbmRsOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkcmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICItPm5ldygpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXZhbCB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIkcmVzdWx0LT57c3VjY2Vzc30gPSAiOworICB9CisgIGZfc2VydmljZV8gPDwgIiRzZWxmLT57aGFuZGxlcn0tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIiRhcmdzLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9OyBpZiggVU5JVkVSU0FMOjppc2EoJEAsJyIKKyAgICAgICAgICAgICAgICAgPDwgcGVybF9uYW1lc3BhY2UoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgIicpICl7ICIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkcmVzdWx0LT57IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAkQDsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkQCA9IHVuZGVmOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOworCisgICAgLy8gY2F0Y2gtYWxsIGZvciB1bmV4cGVjdGVkIGV4Y2VwdGlvbnMgKFRIUklGVC0zMTkxKQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgkQCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkQCA9fiBzL15cXHMrfFxccyskLy9nOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm15ICRlcnIgPSBUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi0+bmV3KFwiVW5leHBlY3RlZCBFeGNlcHRpb246IFwiIC4gJEAsIFRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OLCAkc2VxaWQpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRlcnItPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRAID0gdW5kZWY7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFNlcmlhbGl6ZSB0aGUgcmVwbHkKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6UkVQTFksICRzZXFpZCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQtPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOworCisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8gPDwgIiMgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHN0cmluZyBuYW1lID0gdHMtPmdldF9uYW1lKCk7CisgICAgdHMtPnNldF9uYW1lKHNlcnZpY2VfbmFtZV8gKyAiXyIgKyBuYW1lKTsKKyAgICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfcGVybF9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICAgIHRzLT5zZXRfbmFtZShuYW1lKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BlcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKKyAgICBleHRlbmRzX2lmID0gInVzZSBiYXNlIHF3KCIgKyBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kc19zLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICsgIklmKTsiOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZjsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ1c2Ugc3RyaWN0OyIgPDwgZW5kbCA8PCBleHRlbmRzX2lmIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAic3ViICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGwgPDwgIiAgZGllICdpbXBsZW1lbnQgaW50ZXJmYWNlJztcbn0iCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBSRVNUIGludGVyZmFjZQorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2lmID0gIiI7CisgIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBleHRlbmRzX3MtPmdldF9uYW1lKCk7CisgICAgZXh0ZW5kc19pZiA9ICJ1c2UgYmFzZSBxdygiICsgcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHNfcy0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICArICJSZXN0KTsiOworICB9CisgIGZfc2VydmljZV8gPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiUmVzdDsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ1c2Ugc3RyaWN0OyIgPDwgZW5kbCA8PCBleHRlbmRzX2lmIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAic3ViIG5ldyB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAoJGNsYXNzbmFtZSwgJGltcGwpID0gQF87IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAibXkgJHNlbGYgICAgID17IGltcGwgPT4gJGltcGwgfTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAic3ViICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAoJHNlbGYsICRyZXF1ZXN0KSA9IEBfOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7CisgICAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgeworICAgICAgdF90eXBlKiBhdHlwZSA9IGdldF90cnVlX3R5cGUoKCphX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIHN0cmluZyByZXEgPSAiJHJlcXVlc3QtPnsnIiArICgqYV9pdGVyKS0+Z2V0X25hbWUoKSArICInfSI7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICgiIDw8IHJlcSA8PCAiKSA/ICIgPDwgcmVxCisgICAgICAgICAgICAgICAgIDw8ICIgOiB1bmRlZjsiIDw8IGVuZGw7CisgICAgICBpZiAoYXR5cGUtPmlzX3N0cmluZygpICYmICgodF9iYXNlX3R5cGUqKWF0eXBlKS0+aXNfc3RyaW5nX2xpc3QoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSBAIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHNwbGl0KC8sLywgJCIKKyAgICAgICAgICAgICAgICAgICA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIgorICAgICAgICAgICAgICAgICAgIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gXFxAIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICRzZWxmLT57aW1wbH0tPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIgorICAgICAgICAgICAgICAgPDwgYXJndW1lbnRfbGlzdCgoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kc19zLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfY2xpZW50ID0gInVzZSBiYXNlIHF3KCIgKyBleHRlbmRzICsgIkNsaWVudCk7IjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50OyIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgPDwgZXh0ZW5kc19jbGllbnQgPDwgZW5kbCA8PCAidXNlIGJhc2UgcXcoIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykKKyAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZik7IiA8PCBlbmRsOworCisgIC8vIENvbnN0cnVjdG9yIGZ1bmN0aW9uCisgIGZfc2VydmljZV8gPDwgInN1YiBuZXcgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAoJGNsYXNzbmFtZSwgJGlucHV0LCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJteSAkc2VsZiAgICAgID0ge307IiA8PCBlbmRsOworCisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHNlbGYgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCRpbnB1dCwgJG91dHB1dCk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRzZWxmLT57aW5wdXR9ICA9ICRpbnB1dDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIkc2VsZi0+e291dHB1dH0gPSBkZWZpbmVkICRvdXRwdXQgPyAkb3V0cHV0IDogJGlucHV0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIiRzZWxmLT57c2VxaWR9ICA9IDA7IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGZfc2VydmljZV8gPDwgInN1YiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgaW5kZW50KCkgPDwgIiRzZWxmLT5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICIkIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiJHNlbGYtPnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV8gPDwgInN1YiBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0gcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRzZWxmLT57b3V0cHV0fS0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiJywgIiA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6T05FV0FZIiA6ICJUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6Q0FMTCIpCisgICAgICAgICAgICAgICA8PCAiLCAkc2VsZi0+e3NlcWlkfSk7IiA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJGFyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICItPm5ldygpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkYXJncy0+eyIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAkIgorICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MtPndyaXRlKCRzZWxmLT57b3V0cHV0fSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiJHNlbGYtPntvdXRwdXR9LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIkc2VsZi0+e291dHB1dH0tPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0gcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7CisgICAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgInN1YiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICRyc2VxaWQgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJGZuYW1lOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXkgJG10eXBlID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHNlbGYtPntpbnB1dH0tPnJlYWRNZXNzYWdlQmVnaW4oXFwkZm5hbWUsIFxcJG10eXBlLCBcXCRyc2VxaWQpOyIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRtdHlwZSA9PSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIG15ICR4ID0gVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24tPm5ldygpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICAkeC0+cmVhZCgkc2VsZi0+e2lucHV0fSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgICRzZWxmLT57aW5wdXR9LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBkaWUgJHg7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkcmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICItPm5ldygpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiJHJlc3VsdC0+cmVhZCgkc2VsZi0+e2lucHV0fSk7IiA8PCBlbmRsOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkc2VsZi0+e2lucHV0fS0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHJlc3VsdC0+e3N1Y2Nlc3N9ICkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiAkcmVzdWx0LT57c3VjY2Vzc307IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoZGVmaW5lZCAkcmVzdWx0LT57IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIn0pIHsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBkaWUgJHJlc3VsdC0+eyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9OyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkaWUgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIjsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MpIHsKKyAgKHZvaWQpaW5jbGFzczsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gdGZpZWxkLT5nZXRfbmFtZSgpOworCisgIC8vIEhhY2sgZm9yIHdoZW4gcHJlZml4IGlzIGRlZmluZWQgKGFsd2F5cyBhIGhhc2ggcmVmKQorICBpZiAoIXByZWZpeC5lbXB0eSgpKSB7CisgICAgbmFtZSA9IHByZWZpeCArICJ7IiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICJ9IjsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoXFwkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgInJlYWRCb29sKFxcJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoXFwkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAicmVhZEkxNihcXCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTMyKFxcJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgInJlYWRJNjQoXFwkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAicmVhZERvdWJsZShcXCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBFUkwgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgInJlYWRJMzIoXFwkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworCisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAorICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCisgKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAorICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gIiA8PCBwZXJsX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKQorICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLT5uZXcoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICQiIDw8IHByZWZpeAorICAgICAgPDwgIi0+cmVhZCgkaW5wdXQpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7CisgIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7CisgIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7CisKKyAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKKyAgdF9maWVsZCBma3R5cGUoZ190eXBlX2k4LCBrdHlwZSk7CisgIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9pOCwgdnR5cGUpOworICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfaTgsIGV0eXBlKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIm15ICQiIDw8IHNpemUgPDwgIiA9IDA7IiA8PCBlbmRsOworCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IHt9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJCIgPDwga3R5cGUgPDwgIiA9IDA7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkIiA8PCB2dHlwZSA8PCAiID0gMDsiIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEJlZ2luKCIKKyAgICAgICAgPDwgIlxcJCIgPDwga3R5cGUgPDwgIiwgXFwkIiA8PCB2dHlwZSA8PCAiLCBcXCQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0ge307IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkIiA8PCBldHlwZSA8PCAiID0gMDsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCIKKyAgICAgICAgPDwgIlxcJCIgPDwgZXR5cGUgPDwgIiwgXFwkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSBbXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICQiIDw8IGV0eXBlIDw8ICIgPSAwOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEJlZ2luKCIKKyAgICAgICAgPDwgIlxcJCIgPDwgZXR5cGUgPDwgIiwgXFwkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IgKG15ICQiIDw8IGkgPDwgIiA9IDA7ICQiIDw8IGkgPDwgIiA8ICQiIDw8IHNpemUgPDwgIjsgKyskIiA8PCBpIDw8ICIpIgorICAgICAgICAgICAgICA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgia2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoInZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5LCB0cnVlLCB0cnVlKSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsLCB0cnVlLCB0cnVlKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCAiJCIgPDwgcHJlZml4IDw8ICItPnskIiA8PCBrZXkgPDwgIn0gPSAkIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgIm15ICQiIDw8IGVsZW0gPDwgIiA9IHVuZGVmOyIgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiLT57JCIgPDwgZWxlbSA8PCAifSA9IDE7IiA8PCBlbmRsOworfQorCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8ICJteSAkIiA8PCBlbGVtIDw8ICIgPSB1bmRlZjsiIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8ICJwdXNoKEB7JCIgPDwgcHJlZml4IDw8ICJ9LCQiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgInsiICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIn0iKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyAieyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAifSIpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgc3RyaW5nIG5hbWUgPSB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgICAvLyBIYWNrIGZvciB3aGVuIHByZWZpeCBpcyBkZWZpbmVkIChhbHdheXMgYSBoYXNoIHJlZikKKyAgICBpZiAoIXByZWZpeC5lbXB0eSgpKQorICAgICAgbmFtZSA9IHByZWZpeCArICJ7IiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICJ9IjsKKworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBFUkwgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICQiIDw8IHByZWZpeCA8PCAiLT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogV3JpdGVzIG91dCBhIGNvbnRhaW5lcgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEJlZ2luKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInNjYWxhcihrZXlzICV7JCIgPDwgcHJlZml4IDw8ICJ9KSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEJlZ2luKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAic2NhbGFyKEB7JCIgPDwgcHJlZml4IDw8ICJ9KSk7IiA8PCBlbmRsOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworCisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEJlZ2luKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInNjYWxhcihAeyQiIDw8IHByZWZpeCA8PCAifSkpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKKyAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgIndoaWxlKCBteSAoJCIgPDwga2l0ZXIgPDwgIiwkIiA8PCB2aXRlciA8PCAiKSA9IGVhY2ggJXskIiA8PCBwcmVmaXggPDwgIn0pICIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggbXkgJCIgPDwgaXRlciA8PCAiIChAeyQiIDw8IHByZWZpeCA8PCAifSkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCBteSAkIiA8PCBpdGVyIDw8ICIgKEB7JCIgPDwgcHJlZml4IDw8ICJ9KSAiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICoKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCk7CisKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKi8KK3N0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBib29sIG9iaikgeworICBzdHJpbmcgcmVzdWx0ID0gIm15ICQiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICBpZiAoaW5pdCkgeworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAnJyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gMC4wIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBFUkwgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiCisgICAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBbXSI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBpZiAob2JqKSB7CisgICAgICAgIHJlc3VsdCArPSAiID0gIiArIHBlcmxfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpICsgdHlwZS0+Z2V0X25hbWUoKSArICItPm5ldygpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSAiID0gdW5kZWYiOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0ICsgIjsiOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKworICBzdHJpbmcgc3RyOworCisgIHN0ciA9IHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJ7XG4iOworICBzdHIgKz0gIiAgbXkgJHNlbGYgPSBzaGlmdDtcbiI7CisKKyAgLy8gTmVlZCB0byBjcmVhdGUgcGVybCBmdW5jdGlvbiBhcmcgaW5wdXRzCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyICs9ICIgIG15ICQiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiA9IHNoaWZ0O1xuIjsKKyAgfQorCisgIHJldHVybiBzdHI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqLworc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICIkIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpCT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpCWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6STE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6STMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6STY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6RE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpJMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6Ok1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpMSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihwZXJsLCAiUGVybCIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYTQ0MTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3BocF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwyNzg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisjZGVmaW5lIE5TR0xPQkFMIChuc2dsb2JhbF8uc2l6ZSgpID8gbnNnbG9iYWxfIDogIiIpCisjZGVmaW5lIE5TR0xPQkFMX0EgKCJcXCIgKyBOU0dMT0JBTCkKKyNkZWZpbmUgTlNHTE9CQUxfQiAoTlNHTE9CQUwgKyAiXFwiKQorI2RlZmluZSBOU0dMT0JBTF9BQiAoIlxcIiArIE5TR0xPQkFMICsgIlxcIikKKworLyoqCisgKiBQSFAgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X3BocF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9waHBfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGJpbmFyeV9pbmxpbmVfID0gZmFsc2U7CisgICAgcmVzdF8gPSBmYWxzZTsKKyAgICBwaHBzXyA9IGZhbHNlOworICAgIG9vcF8gPSBmYWxzZTsKKyAgICB2YWxpZGF0ZV8gPSBmYWxzZTsKKyAgICBqc29uX3NlcmlhbGl6YWJsZV8gPSBmYWxzZTsKKyAgICBuc2dsb2JhbF8gPSAiIjsgLy8gYnkgZGVmYXVsdCBnbG9iYWwgbmFtZXNwYWNlIGlzIGVtcHR5CisgICAgY2xhc3NtYXBfID0gZmFsc2U7CisgICAgZm9yIChpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgiaW5saW5lZCIpID09IDApIHsKKyAgICAgICAgYmluYXJ5X2lubGluZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJyZXN0IikgPT0gMCkgeworICAgICAgICByZXN0XyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoInNlcnZlciIpID09IDApIHsKKyAgICAgICAgcGhwc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJvb3AiKSA9PSAwKSB7CisgICAgICAgIG9vcF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJ2YWxpZGF0ZSIpID09IDApIHsKKyAgICAgICAgdmFsaWRhdGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgianNvbiIpID09IDApIHsKKyAgICAgICAganNvbl9zZXJpYWxpemFibGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgibnNnbG9iYWwiKSA9PSAwKSB7CisgICAgICAgIG5zZ2xvYmFsXyA9IGl0ZXItPnNlY29uZDsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgiY2xhc3NtYXAiKSA9PSAwKSB7CisgICAgICAgIGNsYXNzbWFwXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoInBzcjQiKSA9PSAwKSB7CisgICAgICAgIGlmKGNsYXNzbWFwXyl7CisgICAgICAgICAgdGhyb3cgInBzcjQgYW5kIGNsYXNzbWFwIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwd2FybmluZygwLCAicHNyNCBpcyBkZWZhdWx0IG9wdGlvbiEgbmVlZG4ndCBhZGQgcHNyNCBvcHRpb24hXG4iKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIHBocDoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG9vcF8gJiYgYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIHRocm93ICJvb3AgYW5kIGlubGluZWQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4iOworICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAoYmluYXJ5X2lubGluZV8gPyAiZ2VuLXBocGkiIDogImdlbi1waHAiKTsKKyAgICBlc2NhcGVfWyckJ10gPSAiXFwkIjsKKyAgfQorCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgaW5kZW50X3N0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gIiAgICAiOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKTsKKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTdHJ1Y3RzIQorICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOworICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOworICB2b2lkIGdlbmVyYXRlX3BocF9mdW5jdGlvbl9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1ldGhvZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGVfbW9kZSk7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X2pzb25fc2VyaWFsaXplKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKKyAgYm9vbCBuZWVkc19waHBfd3JpdGVfdmFsaWRhdG9yKHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7CisgIGJvb2wgbmVlZHNfcGhwX3JlYWRfdmFsaWRhdG9yKHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7CisgIGludCBnZXRfcGhwX251bV9yZXF1aXJlZF9maWVsZHMoY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzLCBib29sIHdyaXRlX21vZGUpOworCisgIHZvaWQgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0KTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3NwZWMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdGQ6Om9zdHJlYW0mIGZpbGUpOworICB2b2lkIGdlbmVyYXRlX3Byb2dyYW1faGVhZGVyKHN0ZDo6b3N0cmVhbSYgZmlsZSk7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MgPSBmYWxzZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9waHBfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisKKyAgdm9pZCBnZW5lcmF0ZV9waHBfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQpOworCisgIHZvaWQgZ2VuZXJhdGVfcGhwX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX3BocF9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgcGhwX2luY2x1ZGVzKCk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQgPSBmYWxzZSwgYm9vbCBvYmogPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBhZGRUeXBlSGludHMgPSB0cnVlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19jYXN0KHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fcGhwZG9jKHRfdHlwZSogdHR5cGUpOworCisgIGJvb2wgcGhwX2lzX3NjYWxhcih0X3R5cGUgKnR0eXBlKSB7CisgICAgdHR5cGUgPSB0dHlwZS0+Z2V0X3RydWVfdHlwZSgpOworICAgIGlmKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgc3RkOjpzdHJpbmcgcGhwX25hbWVzcGFjZV9iYXNlKGNvbnN0IHRfcHJvZ3JhbSogcCkgeworICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgicGhwIik7CisgICAgY29uc3QgY2hhciogZGVsaW1pdGVyID0gIlxcIjsKKyAgICBzaXplX3QgcG9zaXRpb24gPSBucy5maW5kKCcuJyk7CisgICAgd2hpbGUgKHBvc2l0aW9uICE9IHN0cmluZzo6bnBvcykgeworICAgICAgbnMucmVwbGFjZShwb3NpdGlvbiwgMSwgZGVsaW1pdGVyKTsKKyAgICAgIHBvc2l0aW9uID0gbnMuZmluZCgnLicsIHBvc2l0aW9uICsgMSk7CisgICAgfQorICAgIHJldHVybiBuczsKKyAgfQorCisgIC8vIGdlbmVyYWwgdXNlIG5hbWVzcGFjZSBwcmVmaXhpbmc6IFxteVxuYW1lc3BhY2VcIG9yIG15X25hbWVzcGFjZV8KKyAgc3RyaW5nIHBocF9uYW1lc3BhY2UoY29uc3QgdF9wcm9ncmFtKiBwKSB7CisgICAgc3RyaW5nIG5zID0gcGhwX25hbWVzcGFjZV9iYXNlKHApOworICAgIHJldHVybiAobnNnbG9iYWxfLnNpemUoKSA/IE5TR0xPQkFMX0FCIDogTlNHTE9CQUxfQikgKyAobnMuc2l6ZSgpID8gKG5zICsgIlxcIikgOiAiIik7CisgIH0KKworICAvLyByZXR1cm4gdGhlIG5hbWVzcGFjZSBvZiBhIGZpbGU6CisgIC8vIGdsb2JhbFxuc1xzdWJcbnMgb3IgZ2xvYmFsXG5zIG9yIHN1YlxucworICBzdHJpbmcgcGhwX25hbWVzcGFjZV9zdWZmaXgoY29uc3QgdF9wcm9ncmFtKiBwKSB7CisgICAgc3RyaW5nIG5zID0gcGhwX25hbWVzcGFjZV9iYXNlKHApOworCisgICAgcmV0dXJuIE5TR0xPQkFMCisgICAgICArIChucy5zaXplKCkgJiYgTlNHTE9CQUwuc2l6ZSgpID8gIlxcIiA6ICIiKQorICAgICAgKyBuczsKKyAgfQorCisgIC8vIGFkZCBhIGRpcmVjdG9yeSB0byBhbHJlYWR5IGV4aXN0aW5nIG5hbWVzcGFjZQorICBzdHJpbmcgcGhwX25hbWVzcGFjZV9kaXJlY3Rvcnkoc3RyaW5nIGRpcmVjdG9yeSwgYm9vbCBlbmQgPSB0cnVlKSB7CisgICAgKHZvaWQpZGlyZWN0b3J5OworICAgIGlmIChlbmQpIHsKKyAgICAgIHJldHVybiAiOyI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiIjsKKyAgICB9CisgIH0KKworICAvLyB3cml0aW5nIGFuIGF1dGxvYWQgaWRlbnRpZmllciBpbnRvIGdsb2JhO2xzOiBteVxuYW1lc3BhY2VcIG9yIG15X25hbWVzcGFjZV8KKyAgc3RyaW5nIHBocF9uYW1lc3BhY2VfYXV0b2xvYWQoY29uc3QgdF9wcm9ncmFtKiBwKSB7CisgICAgc3RkOjpzdHJpbmcgbnMgPSBwaHBfbmFtZXNwYWNlX2Jhc2UocCk7CisgICAgcmV0dXJuIChuc2dsb2JhbF8uc2l6ZSgpID8gTlNHTE9CQUxfQiA6IE5TR0xPQkFMKSArIChucy5zaXplKCkgPyAobnMgKyAiXFwiKSA6ICIiKTsKKyAgfQorCisgIC8vIGRlY2xhcmluZyBhIHR5cGU6IHR5cGVuYW1lIG9yIG15X25hbWVzcGFjZV90eXBlbmFtZQorICBzdHJpbmcgcGhwX25hbWVzcGFjZV9kZWNsYXJhdGlvbih0X3R5cGUqIHQpIHsgcmV0dXJuIHQtPmdldF9uYW1lKCk7IH0KKworICBzdGQ6OnN0cmluZyBwaHBfcGF0aCh0X3Byb2dyYW0qIHApIHsKKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBocC5wYXRoIik7CisgICAgaWYgKG5zLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBwLT5nZXRfbmFtZSgpOworICAgIH0KKworICAgIC8vIFRyYW5zZm9ybSB0aGUgamF2YS1zdHlsZSBuYW1lc3BhY2UgaW50byBhIHBhdGguCisgICAgZm9yIChzdGQ6OnN0cmluZzo6aXRlcmF0b3IgaXQgPSBucy5iZWdpbigpOyBpdCAhPSBucy5lbmQoKTsgKytpdCkgeworICAgICAgaWYgKCppdCA9PSAnLicpIHsKKyAgICAgICAgKml0ID0gJy8nOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBucyArICcvJzsKKyAgfQorCisgIC8qKgorICAgKiBUcmFuc2Zvcm0gY2xhc3NfbWV0aG9kIGludG8gQ2xhc3NNZXRob2QKKyAgICoKKyAgICogQHBhcmFtIHN0cgorICAgKiBAcmV0dXJuIHN0aXJuZworICAgKi8KKyAgc3RyaW5nIGNsYXNzaWZ5KHN0cmluZyBzdHIpIHsKKyAgICBzdHJpbmcgY2xhc3NlID0gIiI7CisKKyAgICB2ZWN0b3I8c3RyaW5nPiB4ID0gc3BsaXQoc3RyLCAnXycpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB4LnNpemUoKTsgKytpKSB7CisgICAgICBjbGFzc2UgPSBjbGFzc2UgKyBjYXBpdGFsaXplKHhbaV0pOworICAgIH0KKworICAgIHJldHVybiBjbGFzc2U7CisgIH0KKworICAvKioKKyAgICogU3BsaXQgbWV0aG9kCisgICAqIEBwYXJhbSBzCisgICAqIEBwYXJhbSBkZWxpbQorICAgKiBAcGFyYW0gZWxlbXMKKyAgICogQHJldHVybgorICAgKi8KKyAgdmVjdG9yPHN0cmluZz4mIHNwbGl0KGNvbnN0IHN0cmluZyYgcywgY2hhciBkZWxpbSwgdmVjdG9yPHN0cmluZz4mIGVsZW1zKSB7CisgICAgc3RyaW5nc3RyZWFtIHNzKHMpOworICAgIHN0cmluZyBpdGVtOworCisgICAgd2hpbGUgKGdldGxpbmUoc3MsIGl0ZW0sIGRlbGltKSkgeworICAgICAgZWxlbXMucHVzaF9iYWNrKGl0ZW0pOworICAgIH0KKworICAgIHJldHVybiBlbGVtczsKKyAgfQorCisgIHZlY3RvcjxzdHJpbmc+IHNwbGl0KGNvbnN0IHN0cmluZyYgcywgY2hhciBkZWxpbSkgeworICAgIHZlY3RvcjxzdHJpbmc+IGVsZW1zOworCisgICAgcmV0dXJuIHNwbGl0KHMsIGRlbGltLCBlbGVtcyk7CisgIH0KKworICAvKioKKyAgICogQ2FwaXRhbGl6ZSBtZXRob2QKKyAgICogQHBhcmFtIHN0cgorICAgKiBAcmV0dXJuCisgICAqLworICBzdHJpbmcgY2FwaXRhbGl6ZShzdHJpbmcgc3RyKSB7CisgICAgc3RyaW5nOjppdGVyYXRvciBpdChzdHIuYmVnaW4oKSk7CisKKyAgICBpZiAoaXQgIT0gc3RyLmVuZCgpKQorICAgICAgc3RyWzBdID0gdG91cHBlcigodW5zaWduZWQgY2hhcilzdHJbMF0pOworCisgICAgLy8gICAgd2hpbGUoKytpdCAhPSBzdHIuZW5kKCkpCisgICAgLy8gICAgeworICAgIC8vICAgICAgKml0ID0gdG9sb3dlcigodW5zaWduZWQgY2hhcikqaXQpOworICAgIC8vICAgIH0KKyAgICByZXR1cm4gc3RyOworICB9CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKworICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87CisgIC8qKgorICAgKiBHZW5lcmF0ZSBwcm90b2NvbC1pbmRlcGVuZGVudCB0ZW1wbGF0ZT8gT3IgQmluYXJ5IGlubGluZSBjb2RlPworICAgKi8KKyAgYm9vbCBiaW5hcnlfaW5saW5lXzsKKworICAvKioKKyAgICogR2VuZXJhdGUgYSBSRVNUIGhhbmRsZXIgY2xhc3MKKyAgICovCisgIGJvb2wgcmVzdF87CisKKyAgLyoqCisgICAqIEdlbmVyYXRlIHN0dWJzIGZvciBhIFBIUCBzZXJ2ZXIKKyAgICovCisgIGJvb2wgcGhwc187CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gdXNlIE9PUCBiYXNlIGNsYXNzIFRCYXNlCisgICAqLworICBib29sIG9vcF87CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgb2xkLXN0eWxlIFBIUCBmaWxlIHRvIHVzZSBjbGFzc21hcCBhdXRvbG9hZGluZworICAgKi8KKyAgYm9vbCBjbGFzc21hcF87CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgdmFsaWRhdG9yIGNvZGUKKyAgICovCisgIGJvb2wgdmFsaWRhdGVfOworCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIEpzb25TZXJpYWxpemFibGUgY2xhc3NlcworICAgKi8KKyAgYm9vbCBqc29uX3NlcmlhbGl6YWJsZV87CisKKyAgLyoqCisgICAqIEdsb2JhbCBuYW1lc3BhY2UgZm9yIFBIUCA1LjMKKyAgICovCisgIHN0ZDo6c3RyaW5nIG5zZ2xvYmFsXzsKK307CisKK2Jvb2wgdF9waHBfZ2VuZXJhdG9yOjppc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpIHsKKyAgcmV0dXJuIHN1Yl9uYW1lc3BhY2UgPT0gInBhdGgiOworfQorCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIC8vIENyZWF0ZSBSZWFsIGRpcmVjdG9yeSBOYW1lc3BhY2VzCisgIHZlY3RvcjxzdHJpbmc+IE5TeCA9IHNwbGl0KHBocF9uYW1lc3BhY2Vfc3VmZml4KGdldF9wcm9ncmFtKCkpLCAnXFwnKTsKKyAgcGFja2FnZV9kaXJfID0gZ2V0X291dF9kaXIoKTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE5TeC5zaXplKCk7ICsraSkgeworICAgIHBhY2thZ2VfZGlyXyA9IHBhY2thZ2VfZGlyXyArICIvIiArIE5TeFtpXSArICIvIjsKKyAgICBNS0RJUihwYWNrYWdlX2Rpcl8uY19zdHIoKSk7CisgIH0KKworICAvLyBQcmVwYXJlIG91dHB1dCBmaWxlIGZvciBhbGwgdGhlIHR5cGVzIGluIGNsYXNzbWFwIG1vZGUKKyAgaWYgKGNsYXNzbWFwXykgeworICAgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgICBzdHJpbmcgZl90eXBlc19uYW1lID0gcGFja2FnZV9kaXJfICsgIlR5cGVzLnBocCI7CisgICAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisgICAgZ2VuZXJhdGVfcHJvZ3JhbV9oZWFkZXIoZl90eXBlc18pOworICB9Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIHBocCBpbmNsdWRlcworICovCitzdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjpwaHBfaW5jbHVkZXMoKSB7CisgIHN0cmluZyBpbmNsdWRlcyA9ICJ1c2UgVGhyaWZ0XFxCYXNlXFxUQmFzZTtcbiIKKyAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXFR5cGVcXFRUeXBlO1xuIgorICAgICAgICAgICAgICAgICAgICAidXNlIFRocmlmdFxcVHlwZVxcVE1lc3NhZ2VUeXBlO1xuIgorICAgICAgICAgICAgICAgICAgICAidXNlIFRocmlmdFxcRXhjZXB0aW9uXFxURXhjZXB0aW9uO1xuIgorICAgICAgICAgICAgICAgICAgICAidXNlIFRocmlmdFxcRXhjZXB0aW9uXFxUUHJvdG9jb2xFeGNlcHRpb247XG4iCisgICAgICAgICAgICAgICAgICAgICJ1c2UgVGhyaWZ0XFxQcm90b2NvbFxcVFByb3RvY29sO1xuIgorICAgICAgICAgICAgICAgICAgICAidXNlIFRocmlmdFxcUHJvdG9jb2xcXFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkO1xuIgorICAgICAgICAgICAgICAgICAgICAidXNlIFRocmlmdFxcRXhjZXB0aW9uXFxUQXBwbGljYXRpb25FeGNlcHRpb247XG4iOworCisgIGlmIChqc29uX3NlcmlhbGl6YWJsZV8pIHsKKyAgICBpbmNsdWRlcyArPSAidXNlIEpzb25TZXJpYWxpemFibGU7XG4iCisgICAgICAgICAgICAgICAgInVzZSBzdGRDbGFzcztcbiI7CisgIH0KKworICByZXR1cm4gaW5jbHVkZXM7Cit9CisKKy8qKgorICogQ2xvc2UgdXAgKG9yIGRvd24pIHNvbWUgZmlsZXouCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGlmIChjbGFzc21hcF8pIHsKKyAgICAvLyBDbG9zZSB0eXBlcyBmaWxlCisgICAgZl90eXBlc18uY2xvc2UoKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUEhQLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHNlcnZpY2UgaGVhZGVyIGNvbnRhaW5zIG5hbWVzcGFjZSBzdWZmaXggYW5kIGluY2x1ZGVzIGluc2lkZSBmaWxlIHNwZWNpZmllZAorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWFkZXIodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RkOjpvc3RyZWFtJiBmaWxlKSB7CisgIGZpbGUgPDwgIjw/cGhwIiA8PCBlbmRsOworICBpZiAoIXBocF9uYW1lc3BhY2Vfc3VmZml4KHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKS5lbXB0eSgpKSB7CisgICAgZmlsZSA8PCAibmFtZXNwYWNlICIgPDwgcGhwX25hbWVzcGFjZV9zdWZmaXgodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICA8PCBlbmRsOworICB9CisgIGZpbGUgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgcGhwX2luY2x1ZGVzKCk7CisKKyAgZmlsZSA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBwcm9ncmFtIGhlYWRlciBjb250YWlucyBuYW1lc3BhY2Ugc3VmZml4IGFuZCBpbmNsdWRlcyBpbnNpZGUgZmlsZSBzcGVjaWZpZWQKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW1faGVhZGVyKHN0ZDo6b3N0cmVhbSYgZmlsZSkgeworICBmaWxlIDw8ICI8P3BocCIgPDwgZW5kbDsKKyAgaWYgKCFwaHBfbmFtZXNwYWNlX3N1ZmZpeChnZXRfcHJvZ3JhbSgpKS5lbXB0eSgpKSB7CisgICAgZmlsZSA8PCAibmFtZXNwYWNlICIgPDwgcGhwX25hbWVzcGFjZV9zdWZmaXgoZ2V0X3Byb2dyYW0oKSkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgIDw8IGVuZGw7CisgIH0KKyAgZmlsZSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBwaHBfaW5jbHVkZXMoKTsKKworICBmaWxlIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gU2luY2UgZGVmaW5lIGlzIGV4cGVuc2l2ZSB0byBsb29rdXAKKyAqIGluIFBIUCwgd2UgdXNlIGEgZ2xvYmFsIGFycmF5IGZvciB0aGlzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlJiBmX2VudW0gPSBmX3R5cGVzXzsKKyAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICBzdHJpbmcgZl9lbnVtX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyB0ZW51bS0+Z2V0X25hbWUoKSArICIucGhwIjsKKyAgICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKKyAgICBnZW5lcmF0ZV9wcm9ncmFtX2hlYWRlcihmX2VudW0pOworICB9CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworCisgIC8vIFdlJ3JlIGFsc28gZG9pbmcgaXQgdGhpcyB3YXkgdG8gc2VlIGhvdyBpdCBwZXJmb3Jtcy4gSXQncyBtb3JlIGxlZ2libGUKKyAgLy8gY29kZSBidXQgeW91IGNhbid0IGRvIHRoaW5ncyBsaWtlIGFuICdleHRyYWN0JyBvbiBpdCwgd2hpY2ggaXMgYSBiaXQgb2YKKyAgLy8gYSBkb3duZXIuCisgIGdlbmVyYXRlX3BocF9kb2MoZl9lbnVtLCB0ZW51bSk7CisgIGZfZW51bSA8PCAiZmluYWwgY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCBlbmRsCisgICAgICAgICA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIGdlbmVyYXRlX3BocF9kb2MoZl9lbnVtLCAqY19pdGVyKTsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAiY29uc3QgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInN0YXRpYyBwdWJsaWMgJF9fbmFtZXMgPSBhcnJheSgiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCB2YWx1ZSA8PCAiID0+ICciIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfZW51bSkgPDwgIik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgZl9lbnVtIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgZl9lbnVtLmNsb3NlKCk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZSBjb25zdGFudCBjbGFzcworICoKKyAqIE92ZXJyaWRlIHRoZSBvbmUgZnJvbSB0X2dlbmVyYXRvcgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKworICAvLyBDcmVhdGUgY2xhc3Mgb25seSBpZiBuZWVkZWQKKyAgaWYgKGNvbnN0cy5zaXplKCkgPiAwKSB7CisKKyAgICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlJiBmX2NvbnN0cyA9IGZfdHlwZXNfOworICAgIGlmICghY2xhc3NtYXBfKSB7CisgICAgICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICJDb25zdGFudC5waHAiOworICAgICAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworICAgICAgZ2VuZXJhdGVfcHJvZ3JhbV9oZWFkZXIoZl9jb25zdHMpOworICAgIH0KKyAgICBmX2NvbnN0cyA8PCAiZmluYWwgY2xhc3MgQ29uc3RhbnQgZXh0ZW5kcyBcXFRocmlmdFxcVHlwZVxcVENvbnN0YW50Ijw8IGVuZGwKKyAgICAgICAgICAgICA8PCAieyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgLy8gQ3JlYXRlIHN0YXRpYyBwcm9wZXJ0eQorICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgICAgaW5kZW50KGZfY29uc3RzKSA8PCAic3RhdGljIHByb3RlY3RlZCAkIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIENyZWF0ZSBpbml0IGZ1bmN0aW9uCisgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgICBmX2NvbnN0cyA8PCBlbmRsOworCisgICAgICBmX2NvbnN0cyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBpbml0XyIgPDwgbmFtZSA8PCAiKCkiIDw8ZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgaW5kZW50KGZfY29uc3RzKSA8PCAicmV0dXJuICI7CisgICAgICBnZW5lcmF0ZV9waHBfZG9jKGZfY29uc3RzLCAqY19pdGVyKTsKKyAgICAgIGZfY29uc3RzIDw8IHJlbmRlcl9jb25zdF92YWx1ZSgoKmNfaXRlciktPmdldF90eXBlKCksICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgICAgZl9jb25zdHMgPDwgIjsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9jb25zdHMpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9jb25zdHMgPDwgIn0iIDw8IGVuZGw7CisgICAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICAgIGZfY29uc3RzLmNsb3NlKCk7CisgICAgfQorICB9Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLworc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8ICJuZXcgIiA8PCBwaHBfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpIDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIihhcnJheSgiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCk7CisgICAgICBvdXQgPDwgIiA9PiAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIikpIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBvdXQgPDwgImFycmF5KCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIG91dCA8PCAiID0+ICI7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIikiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBvdXQgPDwgImFycmF5KCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIG91dCA8PCAiID0+IHRydWUiOworICAgICAgfQorICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpIjsKKyAgfQorICByZXR1cm4gb3V0LnN0cigpOworfQorCisvKioKKyAqIE1ha2UgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9waHBfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCisgKgorICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfcGhwX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIFN0cnVjdHMgY2FuIGJlIG5vcm1hbCBvciBleGNlcHRpb25zLgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSYgZl9zdHJ1Y3QgPSBmX3R5cGVzXzsKKyAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiLnBocCI7CisgICAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOworICAgIGdlbmVyYXRlX3Byb2dyYW1faGVhZGVyKGZfc3RydWN0KTsKKyAgfQorICBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgZl9zdHJ1Y3QuY2xvc2UoKTsKKyAgfQorfQorCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvc3RyZWFtJiBvdXQsIHRfdHlwZSogdCkgeworICB0ID0gZ2V0X3RydWVfdHlwZSh0KTsKKyAgaW5kZW50KG91dCkgPDwgIid0eXBlJyA9PiAiIDw8IHR5cGVfdG9fZW51bSh0KSA8PCAiLCIgPDwgZW5kbDsKKworICBpZiAodC0+aXNfYmFzZV90eXBlKCkgfHwgdC0+aXNfZW51bSgpKSB7CisgICAgLy8gTm9vcCwgdHlwZSBpcyBhbGwgd2UgbmVlZAorICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJ2NsYXNzJyA9PiAnIiA8PCBwaHBfbmFtZXNwYWNlKHQtPmdldF9wcm9ncmFtKCkpIDw8IHQtPmdldF9uYW1lKCkgPDwgIicsIgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbWFwKil0KS0+Z2V0X2tleV90eXBlKCkpOworICAgIHRfdHlwZSogdnR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgodF9tYXAqKXQpLT5nZXRfdmFsX3R5cGUoKSk7CisgICAgaW5kZW50KG91dCkgPDwgIidrdHlwZScgPT4gIiA8PCB0eXBlX3RvX2VudW0oa3R5cGUpIDw8ICIsIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIndnR5cGUnID0+ICIgPDwgdHlwZV90b19lbnVtKHZ0eXBlKSA8PCAiLCIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiJ2tleScgPT4gYXJyYXkoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3BocF90eXBlX3NwZWMob3V0LCBrdHlwZSk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSwiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIid2YWwnID0+IGFycmF5KCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG91dCwgdnR5cGUpOworICAgIGluZGVudChvdXQpIDw8ICIpLCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSB8fCB0LT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHQtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgodF9saXN0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgodF9zZXQqKXQpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiJ2V0eXBlJyA9PiAiIDw8IHR5cGVfdG9fZW51bShldHlwZSkgPDwgIiwiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIidlbGVtJyA9PiBhcnJheSgiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvdXQsIGV0eXBlKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSwiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIHR5cGUgZm9yIHBocCBzdHJ1Y3Qgc3BlYyBmaWVsZCI7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHN0cnVjdCBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSwgd2hpY2ggZnVsbHkgcXVhbGlmaWVzIGVub3VnaAorICogdHlwZSBpbmZvcm1hdGlvbiB0byBnZW5lcmFsaXplIHNlcmlhbGl6YXRpb24gcm91dGluZXMuCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3NwZWMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHB1YmxpYyAkX1RTUEVDID0gYXJyYXkoIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGluZGVudChvdXQpIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIgPT4gYXJyYXkoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJ3ZhcicgPT4gJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIidpc1JlcXVpcmVkJyA9PiAiIDw8ICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEID8gInRydWUiIDogImZhbHNlIikgPDwgIiwiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvdXQsIHQpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIiksIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBub3RoaW5nIGluIFBIUAorICogd2hlcmUgdGhlIG9iamVjdHMgYXJlIGFsbCBqdXN0IGFzc29jaWF0aXZlIGFycmF5cyAodW5sZXNzIG9mIGNvdXJzZSB3ZQorICogZGVjaWRlIHRvIHN0YXJ0IHVzaW5nIG9iamVjdHMgZm9yIHRoZW0uLi4pCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgZ2VuZXJhdGVfcGhwX2RvYyhvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgImNsYXNzICIgPDwgcGhwX25hbWVzcGFjZV9kZWNsYXJhdGlvbih0c3RydWN0KTsKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiIGV4dGVuZHMgIgorICAgICAgICA8PCAiVEV4Y2VwdGlvbiI7CisgIH0gZWxzZSBpZiAob29wXykgeworICAgIG91dCA8PCAiIGV4dGVuZHMgIgorICAgICAgICA8PCAiVEJhc2UiOworICB9CisgIGlmIChqc29uX3NlcmlhbGl6YWJsZV8pIHsKKyAgICBvdXQgPDwgIiBpbXBsZW1lbnRzIEpzb25TZXJpYWxpemFibGUiOworICB9CisgIG91dCA8PCBlbmRsCisgICAgICA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzdGF0aWMgcHVibGljICRpc1ZhbGlkYXRlID0gIiA8PCAodmFsaWRhdGVfID8gInRydWUiIDogImZhbHNlIikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9waHBfc3RydWN0X3NwZWMob3V0LCB0c3RydWN0KTsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgc3RyaW5nIGR2YWwgPSAibnVsbCI7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgISh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgeworICAgICAgZHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSgoKm1faXRlciktPmdldF90eXBlKCksICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgIH0KKyAgICBnZW5lcmF0ZV9waHBfZG9jKG91dCwgKm1faXRlcik7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAkIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGNvbnN0cnVjdG9yIGZyb20gYXJyYXkKKyAgc3RyaW5nIHBhcmFtID0gKG1lbWJlcnMuc2l6ZSgpID4gMCkgPyAiJHZhbHMgPSBudWxsIiA6ICIiOworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgiIDw8IHBhcmFtIDw8ICIpIjw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiR0aGlzLT4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGlzX2FycmF5KCR2YWxzKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAob29wXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwYXJlbnQ6Ol9fY29uc3RydWN0KHNlbGY6OiRfVFNQRUMsICR2YWxzKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoaXNzZXQoJHZhbHNbJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInXSkpIHsiIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAkdmFsc1snIgorICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInXTsiIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICciIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCk7CisgIGlmIChuZWVkc19waHBfcmVhZF92YWxpZGF0b3IodHN0cnVjdCwgaXNfcmVzdWx0KSkgeworICAgIG91dCA8PCBlbmRsOworICAgIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZF92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKyAgfQorICBpZiAobmVlZHNfcGhwX3dyaXRlX3ZhbGlkYXRvcih0c3RydWN0LCBpc19yZXN1bHQpKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZV92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKyAgfQorICBpZiAoanNvbl9zZXJpYWxpemFibGVfKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9qc29uX3NlcmlhbGl6ZShvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWFkKCkgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gcmVhZCgkaW5wdXQpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGlmIChvb3BfKSB7CisgICAgaWYgKG5lZWRzX3BocF9yZWFkX3ZhbGlkYXRvcih0c3RydWN0LCBpc19yZXN1bHQpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJHRtcCA9ICR0aGlzLT5fcmVhZCgnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInLCBzZWxmOjokX1RTUEVDLCAkaW5wdXQpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJHRoaXMtPl92YWxpZGF0ZUZvclJlYWQoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICR0bXA7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICR0aGlzLT5fcmVhZCgnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInLCBzZWxmOjokX1RTUEVDLCAkaW5wdXQpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICByZXR1cm47CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgIiR4ZmVyID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRmbmFtZSA9IG51bGw7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiJGZ0eXBlID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRmaWQgPSAwOyIgPDwgZW5kbDsKKworICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMKKyAgaWYgKCFiaW5hcnlfaW5saW5lXykgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RCZWdpbigkZm5hbWUpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgIHRfZmllbGQgZmZ0eXBlKGdfdHlwZV9pOCwgImZ0eXBlIik7CisgICAgdF9maWVsZCBmZmlkKGdfdHlwZV9pMTYsICJmaWQiKTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZnR5cGUpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRmdHlwZSA9PSAiCisgICAgICAgIDw8ICJUVHlwZTo6U1RPUCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmZpZCk7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oJGZuYW1lLCAkZnR5cGUsICRmaWQpOyIgPDwgZW5kbDsKKyAgICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCisgICAgaW5kZW50KG91dCkgPDwgImlmICgkZnR5cGUgPT0gIgorICAgICAgICAgICAgICAgIDw8ICJUVHlwZTo6U1RPUCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoICgkZmlkKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgkZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9IFRQcm90b2NvbDo6c2tpcEJpbmFyeSgkaW5wdXQsICRmdHlwZSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gIgorICAgICAgICAgICAgICAgIDw8ICJUUHJvdG9jb2w6OnNraXBCaW5hcnkoJGlucHV0LCAkZnR5cGUpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7IiA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICghYmluYXJ5X2lubGluZV8pIHsKKyAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKCFiaW5hcnlfaW5saW5lXykgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAobmVlZHNfcGhwX3JlYWRfdmFsaWRhdG9yKHRzdHJ1Y3QsIGlzX3Jlc3VsdCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHRoaXMtPl92YWxpZGF0ZUZvclJlYWQoKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICR4ZmVyOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSB3cml0ZSgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHdyaXRlKCYkb3V0cHV0KSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHdyaXRlKCRvdXRwdXQpIiA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAobmVlZHNfcGhwX3dyaXRlX3ZhbGlkYXRvcih0c3RydWN0LCBpc19yZXN1bHQpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR0aGlzLT5fdmFsaWRhdGVGb3JXcml0ZSgpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChvb3BfKSB7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAkdGhpcy0+X3dyaXRlKCciIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIicsIHNlbGY6OiRfVFNQRUMsICRvdXRwdXQpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICByZXR1cm47CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgPSAwOyIgPDwgZW5kbDsKKworICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJyIgPDwgbmFtZSA8PCAiJyk7IiA8PCBlbmRsOworICB9CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgkdGhpcy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBzdHJpbmcgZXhwZWN0OworICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgZXhwZWN0ID0gImFycmF5IjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICBleHBlY3QgPSAib2JqZWN0IjsKKyAgICB9CisgICAgaWYgKCFleHBlY3QuZW1wdHkoKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIWlzXyIgPDwgZXhwZWN0IDw8ICIoJHRoaXMtPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpKSB7IgorICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3ICIKKyAgICAgICAgICA8PCAiVFByb3RvY29sRXhjZXB0aW9uKCdCYWQgdHlwZSBpbiBzdHJ1Y3R1cmUuJywgIgorICAgICAgICAgIDw8ICJUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0KKworICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgorICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpOyIKKyAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ24nLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigiCisgICAgICAgICAgICAgICAgICA8PCAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgICA8PCAiLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLT4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGlmICghYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIKKyAgICAgICAgPDwgIlRUeXBlOjpTVE9QKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAkeGZlcjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCwgIl92YWxpZGF0ZUZvclJlYWQiLCBmYWxzZSk7Cit9CisKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCwgIl92YWxpZGF0ZUZvcldyaXRlIiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWV0aG9kX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3cml0ZV9tb2RlKSB7CisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIGZ1bmN0aW9uICIgPDwgbWV0aG9kX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRAorICAgICAgICAgIHx8IChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQgJiYgd3JpdGVfbW9kZSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgkdGhpcy0+IiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID09PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ1JlcXVpcmVkIGZpZWxkICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiBpcyB1bnNldCEnKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9qc29uX3NlcmlhbGl6ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24ganNvblNlcmlhbGl6ZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChuZWVkc19waHBfd3JpdGVfdmFsaWRhdG9yKHRzdHJ1Y3QsIGlzX3Jlc3VsdCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHRoaXMtPl92YWxpZGF0ZUZvcldyaXRlKCk7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgIiRqc29uID0gbmV3IHN0ZENsYXNzOyIgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisgICAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICAgIGNvbnN0IHN0cmluZyYgbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgICAgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgICAgIGlmICghKGtleV90eXBlLT5pc19iYXNlX3R5cGUoKSB8fCBrZXlfdHlwZS0+aXNfZW51bSgpKSkgeworICAgICAgICAgIC8vIEpTT04gb2JqZWN0IGtleXMgbXVzdCBiZSBzdHJpbmdzLiBQSFAncyBqc29uX2VuY29kZSgpCisgICAgICAgICAgLy8gZnVuY3Rpb24gd2lsbCBjb252ZXJ0IGFueSBzY2FsYXIga2V5IHRvIHN0cmluZ3MsIGJ1dAorICAgICAgICAgIC8vIHdlIHNraXAgdGhyaWZ0IG1hcHMgd2l0aCBub24tc2NhbGFyIGtleXMuCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoJHRoaXMtPiIgPDwgbmFtZSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJGpzb24tPiIgPDwgbmFtZSA8PCAiID0gIjsKKyAgICAgIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgICAgICBvdXQgPDwgIihvYmplY3QpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB0eXBlX3RvX2Nhc3QodHlwZSk7CisgICAgICB9CisgICAgICBvdXQgPDwgIiR0aGlzLT4iIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiAkanNvbjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK2ludCB0X3BocF9nZW5lcmF0b3I6OmdldF9waHBfbnVtX3JlcXVpcmVkX2ZpZWxkcyhjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMsIGJvb2wgd3JpdGVfbW9kZSkgeworICBpbnQgbnVtX3JlcSA9IDA7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRAorICAgICAgICAgIHx8ICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUICYmIHdyaXRlX21vZGUpKSB7CisgICAgICAgICsrbnVtX3JlcTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9yZXE7Cit9CisKK2Jvb2wgdF9waHBfZ2VuZXJhdG9yOjpuZWVkc19waHBfd3JpdGVfdmFsaWRhdG9yKHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCkgeworICByZXR1cm4gKHZhbGlkYXRlXyAmJiAhaXNfcmVzdWx0ICYmICF0c3RydWN0LT5pc191bmlvbigpCisgICAgICAgICAgJiYgZ2V0X3BocF9udW1fcmVxdWlyZWRfZmllbGRzKHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCksIHRydWUpID4gMCk7Cit9CisKK2Jvb2wgdF9waHBfZ2VuZXJhdG9yOjpuZWVkc19waHBfcmVhZF92YWxpZGF0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KSB7CisgIHJldHVybiAodmFsaWRhdGVfICYmICFpc19yZXN1bHQKKyAgICAgICAgICAmJiAoZ2V0X3BocF9udW1fcmVxdWlyZWRfZmllbGRzKHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCksIGZhbHNlKSA+IDApKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGlmKGNsYXNzbWFwXykgeworICAgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHNlcnZpY2VfbmFtZV8gKyAiLnBocCI7CisgICAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfaGVhZGVyKHRzZXJ2aWNlLCBmX3NlcnZpY2VfKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQSFApCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgaWYgKHJlc3RfKSB7CisgICAgZ2VuZXJhdGVfc2VydmljZV9yZXN0KHRzZXJ2aWNlKTsKKyAgfQorICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGlmIChwaHBzXykgeworICAgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlKTsKKyAgfQorCisgIGlmKGNsYXNzbWFwXykgeworICAgIC8vIENsb3NlIHNlcnZpY2UgZmlsZQorICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfLmNsb3NlKCk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUmIGZfc2VydmljZV9wcm9jZXNzb3IgPSBmX3NlcnZpY2VfOworICBpZiAoIWNsYXNzbWFwXykgeworICAgIHN0cmluZyBmX3NlcnZpY2VfcHJvY2Vzc29yX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzZXJ2aWNlX25hbWVfICsgIlByb2Nlc3Nvci5waHAiOworICAgIGZfc2VydmljZV9wcm9jZXNzb3Iub3BlbihmX3NlcnZpY2VfcHJvY2Vzc29yX25hbWUuY19zdHIoKSk7CisgICAgZ2VuZXJhdGVfc2VydmljZV9oZWFkZXIodHNlcnZpY2UsIGZfc2VydmljZV9wcm9jZXNzb3IpOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgKyBleHRlbmRzICsgIlByb2Nlc3NvciI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCAkaGFuZGxlcl8gPSBudWxsOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaGFuZGxlcikiPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPmhhbmRsZXJfID0gJGhhbmRsZXI7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgInBhcmVudDo6X19jb25zdHJ1Y3QoJGhhbmRsZXIpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKCRpbnB1dCwgJG91dHB1dCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAiJHJzZXFpZCA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkZm5hbWUgPSBudWxsOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkbXR5cGUgPSAwOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgIHRfZmllbGQgZmZuYW1lKGdfdHlwZV9zdHJpbmcsICJmbmFtZSIpOworICAgIHRfZmllbGQgZm10eXBlKGdfdHlwZV9pOCwgIm10eXBlIik7CisgICAgdF9maWVsZCBmc2VxaWQoZ190eXBlX2kzMiwgInJzZXFpZCIpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGZfc2VydmljZV9wcm9jZXNzb3IsICZmZm5hbWUsICIiLCB0cnVlKTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfcHJvY2Vzc29yLCAmZm10eXBlLCAiIiwgdHJ1ZSk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoZl9zZXJ2aWNlX3Byb2Nlc3NvciwgJmZzZXFpZCwgIiIsIHRydWUpOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VCZWdpbigkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCk7IiA8PCBlbmRsOworICB9CisKKyAgLy8gSE9UOiBjaGVjayBmb3IgbWV0aG9kIGltcGxlbWVudGF0aW9uCisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgIiRtZXRob2RuYW1lID0gJ3Byb2Nlc3NfJy4kZm5hbWU7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICghbWV0aG9kX2V4aXN0cygkdGhpcywgJG1ldGhvZG5hbWUpKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgXFxFeGNlcHRpb24oJ0Z1bmN0aW9uICcuJGZuYW1lLicgbm90IGltcGxlbWVudGVkLicpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICIgICRpbnB1dC0+c2tpcCgiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiVFR5cGU6OlNUUlVDVCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICR4ID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24oJ0Z1bmN0aW9uICcuJGZuYW1lLicgbm90IGltcGxlbWVudGVkLicsICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9EKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgICRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCRmbmFtZSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OLCAkcnNlcWlkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgICR4LT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJG91dHB1dC0+d3JpdGVNZXNzYWdlRW5kKCk7IgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT4kbWV0aG9kbmFtZSgkcnNlcWlkLCAkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oZl9zZXJ2aWNlX3Byb2Nlc3NvciwgdHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCAifSIgPDwgZW5kbDsKKworICBpZiAoIWNsYXNzbWFwXykgeworICAgIGZfc2VydmljZV9wcm9jZXNzb3IuY2xvc2UoKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBvdXQgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBmdW5jdGlvbiBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoJHNlcWlkLCAkaW5wdXQsICRvdXRwdXQpIiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCisgICAgICAgICAgICAgICAgICAgICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIiRiaW5fYWNjZWwgPSAoJGlucHV0IGluc3RhbmNlb2YgIgorICAgICAgICAgICAgIDw8ICJUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnlfYWZ0ZXJfbWVzc2FnZV9iZWdpbicpOyIKKyAgICAgICAgICAgICA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgkYmluX2FjY2VsKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIiRhcmdzID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5X2FmdGVyX21lc3NhZ2VfYmVnaW4oIiA8PGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGlucHV0LCI8PGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICInIiA8PCBhcmdzbmFtZSA8PCAiJywiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIkaW5wdXQtPmlzU3RyaWN0UmVhZCgpIiA8PGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8Iik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MtPnJlYWQoJGlucHV0KTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGlmICghYmluYXJ5X2lubGluZV8pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgaW5kZW50KCk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBvdXQgPDwgIiRyZXN1bHQtPnN1Y2Nlc3MgPSAiOworICB9CisgIG91dCA8PCAiJHRoaXMtPmhhbmRsZXJfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIsICI7CisgICAgfQorICAgIG91dCA8PCAiJGFyZ3MtPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoICgiCisgICAgICAgICAgICAgICAgIDw8IHBocF9uYW1lc3BhY2UoZ2V0X3RydWVfdHlwZSgoKnhfaXRlciktPmdldF90eXBlKCkpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgIiAkIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkcmVzdWx0LT4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJCIKKyAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkYmluX2FjY2VsID0gKCRvdXRwdXQgaW5zdGFuY2VvZiAiCisgICAgICAgICAgICAgPDwgIlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnknKTsiCisgICAgICAgICAgICAgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgkYmluX2FjY2VsKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkoIiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQsIjw8ZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTw8ICInLCIgPDxlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiVE1lc3NhZ2VUeXBlOjpSRVBMWSwiPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQsIiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiJHNlcWlkLCIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPmlzU3RyaWN0V3JpdGUoKSI8PGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCisgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGJ1ZmYgPSBwYWNrKCdOJywgKDB4ODAwMTAwMDAgfCAiCisgICAgICAgIDw8ICJUTWVzc2FnZVR5cGU6OlJFUExZKSk7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJGJ1ZmYgLj0gcGFjaygnTicsIHN0cmxlbignIgorICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRidWZmIC49ICciCisgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRidWZmIC49IHBhY2soJ04nLCAkc2VxaWQpOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+d3JpdGUoJGJ1ZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiJG91dHB1dC0+d3JpdGUoJGJ1ZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+Zmx1c2goKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsICIKKyAgICAgICAgPDwgIlRNZXNzYWdlVHlwZTo6UkVQTFksICRzZXFpZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkcmVzdWx0LT53cml0ZSgkb3V0cHV0KTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiJG91dHB1dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSYgZl9zdHJ1Y3RfZGVmaW5pdGlvbiA9IGZfc2VydmljZV87CisgIGlmIChjbGFzc21hcF8pIHsKKyAgICBmX3N0cnVjdF9kZWZpbml0aW9uIDw8ICIvLyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBzdHJpbmcgbmFtZSA9IHRzLT5nZXRfbmFtZSgpOworICAgIHRzLT5zZXRfbmFtZShzZXJ2aWNlX25hbWVfICsgIl8iICsgbmFtZSk7CisKKyAgICBpZiAoIWNsYXNzbWFwXykgeworICAgICAgc3RyaW5nIGZfc3RydWN0X2RlZmluaXRpb25fbmFtZSA9IHBhY2thZ2VfZGlyXyArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyBuYW1lICsgIi5waHAiOworICAgICAgZl9zdHJ1Y3RfZGVmaW5pdGlvbi5vcGVuKGZfc3RydWN0X2RlZmluaXRpb25fbmFtZS5jX3N0cigpKTsKKyAgICAgIGdlbmVyYXRlX3NlcnZpY2VfaGVhZGVyKHRzZXJ2aWNlLCBmX3N0cnVjdF9kZWZpbml0aW9uKTsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3RfZGVmaW5pdGlvbiwgdHMpOworICAgIGlmICghY2xhc3NtYXBfKSB7CisgICAgICBmX3N0cnVjdF9kZWZpbml0aW9uLmNsb3NlKCk7CisgICAgfQorCisgICAgZ2VuZXJhdGVfcGhwX2Z1bmN0aW9uX2hlbHBlcnModHNlcnZpY2UsICpmX2l0ZXIpOworICAgIHRzLT5zZXRfbmFtZShuYW1lKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgICAgfQorCisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSYgZl9zdHJ1Y3RfaGVscGVyID0gZl9zZXJ2aWNlXzsKKyAgICBpZiAoIWNsYXNzbWFwXykgeworICAgICAgc3RyaW5nIGZfc3RydWN0X2hlbHBlcl9uYW1lID0gcGFja2FnZV9kaXJfICsgcmVzdWx0LmdldF9uYW1lKCkgKyAiLnBocCI7CisgICAgICBmX3N0cnVjdF9oZWxwZXIub3BlbihmX3N0cnVjdF9oZWxwZXJfbmFtZS5jX3N0cigpKTsKKyAgICAgIGdlbmVyYXRlX3NlcnZpY2VfaGVhZGVyKHRzZXJ2aWNlLCBmX3N0cnVjdF9oZWxwZXIpOworICAgIH0KKyAgICBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3RfaGVscGVyLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSk7CisgICAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICAgIGZfc3RydWN0X2hlbHBlci5jbG9zZSgpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUmIGZfc2VydmljZV9pbnRlcmZhY2UgPSBmX3NlcnZpY2VfOworICBpZiAoIWNsYXNzbWFwXykgeworICAgIHN0cmluZyBmX3NlcnZpY2VfaW50ZXJmYWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzZXJ2aWNlX25hbWVfICsgIklmLnBocCI7CisgICAgZl9zZXJ2aWNlX2ludGVyZmFjZS5vcGVuKGZfc2VydmljZV9pbnRlcmZhY2VfbmFtZS5jX3N0cigpKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0c2VydmljZSwgZl9zZXJ2aWNlX2ludGVyZmFjZSk7CisgIH0KKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7CisgICAgZXh0ZW5kc19pZiA9ICIgZXh0ZW5kcyAiICsgcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgKyB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSArICJJZiI7CisgIH0KKyAgZ2VuZXJhdGVfcGhwX2RvYyhmX3NlcnZpY2VfaW50ZXJmYWNlLCB0c2VydmljZSk7CisgIGZfc2VydmljZV9pbnRlcmZhY2UgPDwgImludGVyZmFjZSAiIDw8IHBocF9uYW1lc3BhY2VfZGVjbGFyYXRpb24odHNlcnZpY2UpIDw8ICJJZiIgPDwgZXh0ZW5kc19pZiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgPDwgInsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3BocF9kb2MoZl9zZXJ2aWNlX2ludGVyZmFjZSwgKmZfaXRlcik7CisgICAgaW5kZW50KGZfc2VydmljZV9pbnRlcmZhY2UpIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlX2ludGVyZmFjZSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBzZXJ2aWNlIGludGVyZmFjZSBmaWxlCisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgZl9zZXJ2aWNlX2ludGVyZmFjZS5jbG9zZSgpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgUkVTVCBpbnRlcmZhY2UKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUmIGZfc2VydmljZV9yZXN0ID0gZl9zZXJ2aWNlXzsKKyAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICBzdHJpbmcgZl9zZXJ2aWNlX3Jlc3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHNlcnZpY2VfbmFtZV8gKyAiUmVzdC5waHAiOworICAgIGZfc2VydmljZV9yZXN0Lm9wZW4oZl9zZXJ2aWNlX3Jlc3RfbmFtZS5jX3N0cigpKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0c2VydmljZSwgZl9zZXJ2aWNlX3Jlc3QpOworICB9CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfaWYgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgKyAiUmVzdCI7CisgIH0KKyAgZl9zZXJ2aWNlX3Jlc3QgPDwgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiUmVzdCIgPDwgZXh0ZW5kc19pZiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlX3Jlc3QgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCAkaW1wbF87IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfcmVzdCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRpbXBsKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgJHRoaXMtPmltcGxfID0gJGltcGw7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KGZfc2VydmljZV9yZXN0KSA8PCAicHVibGljIGZ1bmN0aW9uICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoJHJlcXVlc3QpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7CisgICAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgeworICAgICAgdF90eXBlKiBhdHlwZSA9IGdldF90cnVlX3R5cGUoKCphX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIHN0cmluZyBjYXN0ID0gdHlwZV90b19jYXN0KGF0eXBlKTsKKyAgICAgIHN0cmluZyByZXEgPSAiJHJlcXVlc3RbJyIgKyAoKmFfaXRlciktPmdldF9uYW1lKCkgKyAiJ10iOworICAgICAgaWYgKGF0eXBlLT5pc19ib29sKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlX3Jlc3QgPDwgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCBjYXN0IDw8ICIoIWVtcHR5KCIgPDwgcmVxCisgICAgICAgICAgICAgICAgICAgPDwgIikgJiYgKCIgPDwgcmVxIDw8ICIgIT09ICdmYWxzZScpKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfcmVzdCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBpc3NldCgiIDw8IHJlcSA8PCAiKSA/ICIKKyAgICAgICAgICAgICAgICAgICA8PCBjYXN0IDw8IHJlcSA8PCAiIDogbnVsbDsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpZiAoYXR5cGUtPmlzX3N0cmluZygpICYmICgodF9iYXNlX3R5cGUqKWF0eXBlKS0+aXNfc3RyaW5nX2xpc3QoKSkgeworICAgICAgICBmX3NlcnZpY2VfcmVzdCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBleHBsb2RlKCcsJywgJCIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAoYXR5cGUtPmlzX21hcCgpIHx8IGF0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlX3Jlc3QgPDwgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0ganNvbl9kZWNvZGUoJCIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIHRydWUpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAoYXR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIGZfc2VydmljZV9yZXN0IDw8IGluZGVudCgpIDw8ICIkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGFycmF5X2ZpbGxfa2V5cyhqc29uX2RlY29kZSgkIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgdHJ1ZSksIDEpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAoYXR5cGUtPmlzX3N0cnVjdCgpIHx8IGF0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIGZfc2VydmljZV9yZXN0IDw8IGluZGVudCgpIDw8ICJpZiAoJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IG51bGwpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBuZXcgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBwaHBfbmFtZXNwYWNlKGF0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCBhdHlwZS0+Z2V0X25hbWUoKSA8PCAiKGpzb25fZGVjb2RlKCQiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCB0cnVlKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBmX3NlcnZpY2VfcmVzdCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICR0aGlzLT5pbXBsXy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiCisgICAgICAgICAgICAgICA8PCBhcmd1bWVudF9saXN0KCgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSwgZmFsc2UpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfcmVzdCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfcmVzdCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIENsb3NlIHNlcnZpY2UgcmVzdCBmaWxlCisgIGZfc2VydmljZV9yZXN0IDw8IGVuZGw7CisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgZl9zZXJ2aWNlX3Jlc3QuY2xvc2UoKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSYgZl9zZXJ2aWNlX2NsaWVudCA9IGZfc2VydmljZV87CisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgc3RyaW5nIGZfc2VydmljZV9jbGllbnRfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHNlcnZpY2VfbmFtZV8gKyAiQ2xpZW50LnBocCI7CisgICAgZl9zZXJ2aWNlX2NsaWVudC5vcGVuKGZfc2VydmljZV9jbGllbnRfbmFtZS5jX3N0cigpKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0c2VydmljZSwgZl9zZXJ2aWNlX2NsaWVudCk7CisgIH0KKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7CisgICAgZXh0ZW5kc19jbGllbnQgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kcworICAgICAgICAgICAgICAgICAgICAgKyAiQ2xpZW50IjsKKyAgfQorCisgIGZfc2VydmljZV9jbGllbnQgPDwgImNsYXNzICIgPDwgcGhwX25hbWVzcGFjZV9kZWNsYXJhdGlvbih0c2VydmljZSkgPDwgIkNsaWVudCIgPDwgZXh0ZW5kc19jbGllbnQKKyAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgIiA8PCBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8InsiPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gUHJpdmF0ZSBtZW1iZXJzCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJGlucHV0XyA9IG51bGw7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicHJvdGVjdGVkICRvdXRwdXRfID0gbnVsbDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJHNlcWlkXyA9IDA7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgorICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGlucHV0LCAkb3V0cHV0ID0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJwYXJlbnQ6Ol9fY29uc3RydWN0KCRpbnB1dCwgJG91dHB1dCk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8gPSAkaW5wdXQ7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPm91dHB1dF8gPSAkb3V0cHV0ID8gJG91dHB1dCA6ICRpbnB1dDsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIGZfc2VydmljZV9jbGllbnQgPDwgZW5kbDsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQoZl9zZXJ2aWNlX2NsaWVudCkgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV9jbGllbnQpOworICAgIGluZGVudChmX3NlcnZpY2VfY2xpZW50KSA8PCAiJHRoaXMtPnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgIiQiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8ICIpOyIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKTsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCAicmV0dXJuICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8ICIkdGhpcy0+cmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfY2xpZW50KTsKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGVuZGw7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlX2NsaWVudCkgPDwgInB1YmxpYyBmdW5jdGlvbiBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlX2NsaWVudCk7CisKKyAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworCisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiRhcmdzLT4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAkIgorICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkYmluX2FjY2VsID0gKCR0aGlzLT5vdXRwdXRfIGluc3RhbmNlb2YgIgorICAgICAgICAgICAgICAgPDwgIlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnknKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRiaW5fYWNjZWwpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdHJpbmcgbWVzc2FnZVR5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZTo6T05FV0FZIiA6ICJUTWVzc2FnZVR5cGU6OkNBTEwiOworCisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkdGhpcy0+b3V0cHV0XywiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICInIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBtZXNzYWdlVHlwZSA8PCAiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRhcmdzLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5zZXFpZF8sIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPm91dHB1dF8tPmlzU3RyaWN0V3JpdGUoKSIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgorICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJGJ1ZmYgPSBwYWNrKCdOJywgKDB4ODAwMTAwMDAgfCAiIDw8IG1lc3NhZ2VUeXBlIDw8ICIpKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRidWZmIC49IHBhY2soJ04nLCBzdHJsZW4oJyIgPDwgZnVubmFtZSA8PCAiJykpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJGJ1ZmYgLj0gJyIgPDwgZnVubmFtZSA8PCAiJzsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiRidWZmIC49IHBhY2soJ04nLCAkdGhpcy0+c2VxaWRfKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5vdXRwdXRfLT53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIicsICIgPDwgbWVzc2FnZVR5cGUgPDwgIiwgJHRoaXMtPnNlcWlkXyk7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiRhcmdzLT53cml0ZSgkYnVmZik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIkdGhpcy0+b3V0cHV0Xy0+d3JpdGUoJGJ1ZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiJHRoaXMtPm91dHB1dF8tPmZsdXNoKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkYXJncy0+d3JpdGUoJHRoaXMtPm91dHB1dF8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiJHRoaXMtPm91dHB1dF8tPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiJHRoaXMtPm91dHB1dF8tPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV9jbGllbnQpOworCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfY2xpZW50KTsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7CisgICAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV9jbGllbnQpOworCisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkYmluX2FjY2VsID0gKCR0aGlzLT5pbnB1dF8gaW5zdGFuY2VvZiAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnknKTsiIDw8IGVuZGw7CisKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgImlmICgkYmluX2FjY2VsKSB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkoIiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8sIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICInIiA8PCByZXN1bHRuYW1lIDw8ICInLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPmlucHV0Xy0+aXNTdHJpY3RSZWFkKCkiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIpOyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiRyc2VxaWQgPSAwOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJGZuYW1lID0gbnVsbDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRtdHlwZSA9IDA7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgICB0X2ZpZWxkIGZmbmFtZShnX3R5cGVfc3RyaW5nLCAiZm5hbWUiKTsKKyAgICAgICAgdF9maWVsZCBmc2VxaWQoZ190eXBlX2kzMiwgInJzZXFpZCIpOworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkdmVyID0gdW5wYWNrKCdOJywgJHRoaXMtPmlucHV0Xy0+cmVhZEFsbCg0KSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR2ZXIgPSAkdmVyWzFdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJG10eXBlID0gJHZlciAmIDB4ZmY7IgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiR2ZXIgPSAkdmVyICYgMHhmZmZmMDAwMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiaWYgKCR2ZXIgIT0gMHg4MDAxMDAwMCkgdGhyb3cgbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiVFByb3RvY29sRXhjZXB0aW9uKCdCYWQgdmVyc2lvbiBpZGVudGlmaWVyOiAnLiR2ZXIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7IiA8PCBlbmRsOworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfY2xpZW50LCAmZmZuYW1lLCAiIiwgdHJ1ZSk7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGZfc2VydmljZV9jbGllbnQsICZmc2VxaWQsICIiLCB0cnVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8tPnJlYWRNZXNzYWdlQmVnaW4oJGZuYW1lLCAkbXR5cGUsICRyc2VxaWQpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoJG10eXBlID09IFRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJHgtPnJlYWQoJHRoaXMtPmlucHV0Xyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocm93ICR4OyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+cmVhZCgkdGhpcy0+aW5wdXRfKTsiIDw8IGVuZGw7CisKKyAgICAgIGlmICghYmluYXJ5X2lubGluZV8pIHsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPmlucHV0Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlX2NsaWVudCk7CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIHJlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgImlmICgkcmVzdWx0LT5zdWNjZXNzICE9PSBudWxsKSB7IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gJHJlc3VsdC0+c3VjY2VzczsiIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRyZXN1bHQtPiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IG51bGwpIHsiIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgInRocm93ICRyZXN1bHQtPiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfY2xpZW50KSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyBcXEV4Y2VwdGlvbihcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlX2NsaWVudCk7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlX2NsaWVudCA8PCAifSIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBzZXJ2aWNlIGNsaWVudCBmaWxlCisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgZl9zZXJ2aWNlX2NsaWVudC5jbG9zZSgpOworICB9Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSB7CisKKyAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgICBzdGQ6OnN0cmluZyBpdHJhbnMgPSAoaW5jbGFzcyA/ICIkdGhpcy0+aW5wdXRfIiA6ICIkaW5wdXQiKTsKKworICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkbGVuID0gdW5wYWNrKCdOJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCg0KSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRsZW4gPSAkbGVuWzFdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRsZW4gPiAweDdmZmZmZmZmKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJGxlbiA9IDAgLSAoKCRsZW4gLSAxKSBeIDB4ZmZmZmZmZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKCRsZW4pOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSB1bnBhY2soJ2MnLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDEpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gKGJvb2wpJCIgPDwgbmFtZSA8PCAiWzFdOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9IHVucGFjaygnYycsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoMSkpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAkIiA8PCBuYW1lIDw8ICJbMV07IiA8PCBlbmRsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiR2YWwgPSB1bnBhY2soJ24nLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDIpKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJHZhbCA9ICR2YWxbMV07IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAoJHZhbCA+IDB4N2ZmZikgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICR2YWwgPSAwIC0gKCgkdmFsIC0gMSkgXiAweGZmZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAkdmFsOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkdmFsID0gdW5wYWNrKCdOJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCg0KSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR2YWwgPSAkdmFsWzFdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCR2YWwgPiAweDdmZmZmZmZmKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJHZhbCA9IDAgLSAoKCR2YWwgLSAxKSBeIDB4ZmZmZmZmZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAkdmFsOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkYXJyID0gdW5wYWNrKCdOMicsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoOCkpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoJGFyclsxXSAmIDB4ODAwMDAwMDApIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAiICAkYXJyWzFdID0gJGFyclsxXSBeIDB4RkZGRkZGRkY7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIiAgJGFyclsyXSA9ICRhcnJbMl0gXiAweEZGRkZGRkZGOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAkIiA8PCBuYW1lCisgICAgICAgICAgICAgICAgPDwgIiA9IDAgLSAkYXJyWzFdKjQyOTQ5NjcyOTYgLSAkYXJyWzJdIC0gMTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJCIgPDwgbmFtZSA8PCAiID0gJGFyclsxXSo0Mjk0OTY3Mjk2ICsgJGFyclsyXTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkYXJyID0gdW5wYWNrKCdkJywgc3RycmV2KCIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoOCkpKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJGFyclsxXTsiIDw8IGVuZGw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpCisgICAgICAgICAgICAgICAgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHZhbCA9IHVucGFjaygnTicsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoNCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAiJHZhbCA9ICR2YWxbMV07IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAoJHZhbCA+IDB4N2ZmZmZmZmYpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgJHZhbCA9IDAgLSAoKCR2YWwgLSAxKSBeIDB4ZmZmZmZmZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIKKyAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJHZhbDsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+IjsKKworICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgIG91dCA8PCAicmVhZEJvb2woJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgICBvdXQgPDwgInJlYWRJMTYoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgICBvdXQgPDwgInJlYWRJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICBvdXQgPDwgInJlYWRJNjQoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHZhcmlhYmxlLiBUaGlzIG1ha2VzIHR3byBrZXkgYXNzdW1wdGlvbnMsCisgKiBmaXJzdCB0aGF0IHRoZXJlIGlzIGEgY29uc3QgY2hhciogdmFyaWFibGUgbmFtZWQgZGF0YSB0aGF0IHBvaW50cyB0byB0aGUKKyAqIGJ1ZmZlciBmb3IgZGVzZXJpYWxpemF0aW9uLCBhbmQgdGhhdCB0aGVyZSBpcyBhIHZhcmlhYmxlIHByb3RvY29sIHdoaWNoCisgKiBpcyBhIHJlZmVyZW5jZSB0byBhIFRQcm90b2NvbCBzZXJpYWxpemF0aW9uIG9iamVjdC4KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCBwaHBfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpCisgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICQiIDw8IHByZWZpeAorICAgICAgPDwgIi0+cmVhZCgkaW5wdXQpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7CisgIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7CisgIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7CisKKyAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKKyAgdF9maWVsZCBma3R5cGUoZ190eXBlX2k4LCBrdHlwZSk7CisgIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9pOCwgdnR5cGUpOworICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfaTgsIGV0eXBlKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gYXJyYXkoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHNpemUgPDwgIiA9IDA7IgorICAgICAgPDwgZW5kbDsKKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwga3R5cGUgPDwgIiA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCB2dHlwZSA8PCAiID0gMDsiCisgICAgICAgIDw8IGVuZGw7CisgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma3R5cGUpOworICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZ0eXBlKTsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZzaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBCZWdpbigiCisgICAgICAgICAgPDwgIiQiIDw8IGt0eXBlIDw8ICIsICQiIDw8IHZ0eXBlIDw8ICIsICQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZldHlwZSk7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgZXR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCIKKyAgICAgICAgICA8PCAiJCIgPDwgZXR5cGUgPDwgIiwgJCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZldHlwZSk7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgZXR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RCZWdpbigiCisgICAgICAgICAgPDwgIiQiIDw8IGV0eXBlIDw8ICIsICQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IgKCQiIDw8IGkgPDwgIiA9IDA7ICQiIDw8IGkgPDwgIiA8ICQiIDw8IHNpemUgPDwgIjsgKyskIiA8PCBpIDw8ICIpIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICghYmluYXJ5X2lubGluZV8pIHsKKyAgICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgia2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoInZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5LCB0cnVlLCB0cnVlKSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsLCB0cnVlLCB0cnVlKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCAiJCIgPDwgcHJlZml4IDw8ICJbJCIgPDwga2V5IDw8ICJdID0gJCIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworfQorCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgIiQiIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICB0X3R5cGUqIGVsZW1fdHlwZSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKKyAgaWYocGhwX2lzX3NjYWxhcihlbGVtX3R5cGUpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiWyQiIDw8IGVsZW0gPDwgIl0gPSB0cnVlOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJCIgPDwgcHJlZml4IDw8ICJbXSA9ICQiIDw8IGVsZW0gPDwgIjsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCAiJCIgPDwgZWxlbSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiBbXT0gJCIgPDwgZWxlbSA8PCAiOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ04nLCBzdHJsZW4oJCIgPDwgbmFtZSA8PCAiKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICIkb3V0cHV0IC49ICQiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICQiIDw8IG5hbWUgPDwgIiA/IDEgOiAwKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAkIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ24nLCAkIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ04nLCAkIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ04yJywgJCIgPDwgbmFtZSA8PCAiID4+IDMyLCAkIiA8PCBuYW1lCisgICAgICAgICAgICAgIDw8ICIgJiAweEZGRkZGRkZGKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBzdHJyZXYocGFjaygnZCcsICQiIDw8IG5hbWUgPDwgIikpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdOJywgJCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKworICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPiI7CisKKyAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIG91dCA8PCAid3JpdGVJNjQoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgIG91dCA8PCAid3JpdGVJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgfQorICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkIiA8PCBwcmVmaXggPDwgIi0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFdyaXRlcyBvdXQgYSBjb250YWluZXIKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgICAgICA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIKKyAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiRvdXRwdXQgLj0gc3RycmV2KHBhY2soJ2wnLCBjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIkb3V0cHV0LT53cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCAiY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKTsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gc3RycmV2KHBhY2soJ2wnLCBjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpKTsiCisgICAgICAgICAgPDwgZW5kbDsKKworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJG91dHB1dC0+d3JpdGVTZXRCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICAgIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgIDw8ICJjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHN0cnJldihwYWNrKCdsJywgY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKSk7IgorICAgICAgICAgIDw8IGVuZGw7CisKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIiRvdXRwdXQtPndyaXRlTGlzdEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICAgIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgIDw8ICJjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGtpdGVyID0gdG1wKCJraXRlciIpOworICAgIHN0cmluZyB2aXRlciA9IHRtcCgidml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCAoJCIgPDwgcHJlZml4IDw8ICIgYXMgIgorICAgICAgICAgICAgICAgIDw8ICIkIiA8PCBraXRlciA8PCAiID0+ICQiIDw8IHZpdGVyIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBzdHJpbmcgaXRlcl92YWwgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCAoJCIgPDwgcHJlZml4IDw8ICIgYXMgJCIgPDwgaXRlciA8PCAiID0+ICQiIDw8IGl0ZXJfdmFsIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGlmKHBocF9pc19zY2FsYXIoZWxlbV90eXBlKSkgeworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXJfdmFsKTsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3JlYWNoICgkIiA8PCBwcmVmaXggPDwgIiBhcyAkIiA8PCBpdGVyIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7CisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiRvdXRwdXQtPndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJG91dHB1dC0+d3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKKworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiBFbWl0cyBhIFBIUERvYyBjb21tZW50IGZvciB0aGUgZ2l2ZW4gY29udGVudHMKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9kb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cykgeworICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBjb250ZW50cywgIiAqL1xuIik7Cit9CisKKy8qKgorICogRW1pdHMgYSBQSFBEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9kb2Mob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgZ2VuZXJhdGVfcGhwX2RvY3N0cmluZ19jb21tZW50KG91dCwgdGRvYy0+Z2V0X2RvYygpKTsKKyAgfQorfQorCisvKioKKyAqIEVtaXRzIGEgUEhQRG9jIGNvbW1lbnQgZm9yIGEgZmllbGQKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9kb2Mob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgeworICBzdHJpbmdzdHJlYW0gc3M7CisKKyAgLy8gcHJlcGVuZCBmcmVlLXN0eWxlIGRvYyBpZiBhdmFpbGFibGUKKyAgaWYgKGZpZWxkLT5oYXNfZG9jKCkpIHsKKyAgICBzcyA8PCBmaWVsZC0+Z2V0X2RvYygpIDw8IGVuZGw7CisgIH0KKworICAvLyBhcHBlbmQgQHZhciB0YWcKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIHNzIDw8ICJAdmFyICIgPDwgdHlwZV90b19waHBkb2ModHlwZSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9waHBfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBzcy5zdHIoKSk7Cit9CisKKy8qKgorICogRW1pdHMgYSBQSFBEb2MgY29tbWVudCBmb3IgYSBmdW5jdGlvbgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIGZ1bmN0aW9uKSB7CisgIHN0cmluZ3N0cmVhbSBzczsKKyAgaWYgKGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKKyAgICBzcyA8PCBmdW5jdGlvbi0+Z2V0X2RvYygpIDw8IGVuZGw7CisgIH0KKworICAvLyBnZW5lcmF0ZSBwYXJhbWV0ZXIgdHlwZXMgZG9jCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOworICBmb3IgKGFfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYV9pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYV9pdGVyKSB7CisgICAgdF9maWVsZCogYXJnID0gKmFfaXRlcjsKKyAgICBzcyA8PCAiQHBhcmFtICIgPDwgdHlwZV90b19waHBkb2MoYXJnLT5nZXRfdHlwZSgpKSA8PCAiICQiIDw8IGFyZy0+Z2V0X25hbWUoKTsKKyAgICBpZiAoYXJnLT5oYXNfZG9jKCkpIHsKKyAgICAgIHNzIDw8ICIgIiA8PCBhcmctPmdldF9kb2MoKTsKKyAgICB9CisgICAgc3MgPDwgZW5kbDsKKyAgfQorCisgIC8vIGdlbmVyYXRlIHJldHVybiB0eXBlIGRvYworICB0X3R5cGUqIHJldF90eXBlID0gZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIGlmICghcmV0X3R5cGUtPmlzX3ZvaWQoKSB8fCByZXRfdHlwZS0+aGFzX2RvYygpKSB7CisgICAgc3MgPDwgIkByZXR1cm4gIiA8PCB0eXBlX3RvX3BocGRvYyhyZXRfdHlwZSk7CisgICAgaWYgKHJldF90eXBlLT5oYXNfZG9jKCkpIHsKKyAgICAgIHNzIDw8ICIgIiA8PCByZXRfdHlwZS0+Z2V0X2RvYygpOworICAgIH0KKyAgICBzcyA8PCBlbmRsOworICB9CisKKyAgLy8gZ2VuZXJhdGUgZXhjZXB0aW9ucyBkb2MKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZXhjcyA9IGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGVfaXRlcjsKKyAgZm9yIChlX2l0ZXIgPSBleGNzLmJlZ2luKCk7IGVfaXRlciAhPSBleGNzLmVuZCgpOyArK2VfaXRlcikgeworICAgIHRfZmllbGQqIGV4YyA9ICplX2l0ZXI7CisgICAgc3MgPDwgIkB0aHJvd3MgIiA8PCB0eXBlX3RvX3BocGRvYyhleGMtPmdldF90eXBlKCkpOworICAgIGlmIChleGMtPmhhc19kb2MoKSkgeworICAgICAgc3MgPDwgIiAiIDw8IGV4Yy0+Z2V0X2RvYygpOworICAgIH0KKyAgICBzcyA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgc3Muc3RyKCksICIgKi9cbiIpOworfQorCisvKioKKyAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqLworc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgYm9vbCBvYmopIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIkIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgaWYgKGluaXQpIHsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHJlc3VsdCArPSAiID0gJyciOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwLjAiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIGluaXRpYWxpemVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBhcnJheSgpIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGlmIChvYmopIHsKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHBocF9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgKyB0eXBlLT5nZXRfbmFtZSgpICsgIigpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQgKyAiOyI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHJldHVybiBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqLworc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBhZGRUeXBlSGludHMpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisKKyAgICB0X3R5cGUqIHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisKKyAgICAvLyBTZXQgdHlwZSBuYW1lCisgICAgaWYgKGFkZFR5cGVIaW50cykgeworICAgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICAgIHN0cmluZyBjbGFzc05hbWUgPSBwaHBfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBocF9uYW1lc3BhY2VfZGlyZWN0b3J5KCJEZWZpbml0aW9uIiwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNsYXNzaWZ5KHR5cGUtPmdldF9uYW1lKCkpOworCisgICAgICAgIHJlc3VsdCArPSBjbGFzc05hbWUgKyAiICI7CisgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgIHJlc3VsdCArPSAiYXJyYXkgIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXN1bHQgKz0gIiQiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogR2V0cyBhIHR5cGVjYXN0IHN0cmluZyBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUuCisgKi8KK3N0cmluZyB0X3BocF9nZW5lcmF0b3I6OnR5cGVfdG9fY2FzdCh0X3R5cGUqIHR5cGUpIHsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIGJ0eXBlID0gKHRfYmFzZV90eXBlKil0eXBlOworICAgIHN3aXRjaCAoYnR5cGUtPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIihib29sKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiKGludCkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICIoZG91YmxlKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIihzdHJpbmcpIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIihpbnQpIjsKKyAgfQorICByZXR1cm4gIiI7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgorICovCitzdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZTo6U1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlOjpCT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZTo6QllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlOjpJMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZTo6STMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGU6Okk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlOjpET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlOjpJMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlOjpTVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6TUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGU6OlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6TFNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIFBIUERvYyBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgorICovCitzdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjp0eXBlX3RvX3BocGRvYyh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gInZvaWQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJzdHJpbmciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiYm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZG91YmxlIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJpbnQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gcGhwX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gImFycmF5IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0KiB0c2V0ID0gc3RhdGljX2Nhc3Q8dF9zZXQqPih0eXBlKTsKKyAgICB0X3R5cGUqIHRfZWxlbSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKKyAgICBpZiAodF9lbGVtLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmV0dXJuICIoIiArIHR5cGVfdG9fcGhwZG9jKHRfZWxlbSkgKyAiKVtdIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHR5cGVfdG9fcGhwZG9jKHRfZWxlbSkgKyAiW10iOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QqIHRsaXN0ID0gc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHlwZSk7CisgICAgdF90eXBlKiB0X2VsZW0gPSB0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGlmICh0X2VsZW0tPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICByZXR1cm4gIigiICsgdHlwZV90b19waHBkb2ModF9lbGVtKSArICIpW10iOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gdHlwZV90b19waHBkb2ModF9lbGVtKSArICJbXSI7CisgICAgfQorICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIHBocCwKKyAgICAiUEhQIiwKKyAgICAiICAgIGlubGluZWQ6ICAgICAgICAgR2VuZXJhdGUgUEhQIGlubGluZWQgZmlsZXNcbiIKKyAgICAiICAgIHNlcnZlcjogICAgICAgICAgR2VuZXJhdGUgUEhQIHNlcnZlciBzdHVic1xuIgorICAgICIgICAgb29wOiAgICAgICAgICAgICBHZW5lcmF0ZSBQSFAgd2l0aCBvYmplY3Qgb3JpZW50ZWQgc3ViY2xhc3Nlc1xuIgorICAgICIgICAgY2xhc3NtYXA6ICAgICAgICBHZW5lcmF0ZSBvbGQtc3R5bGUgUEhQIGZpbGVzICh1c2UgY2xhc3NtYXAgYXV0b2xvYWRpbmcpXG4iCisgICAgIiAgICByZXN0OiAgICAgICAgICAgIEdlbmVyYXRlIFBIUCBSRVNUIHByb2Nlc3NvcnNcbiIKKyAgICAiICAgIG5zZ2xvYmFsPU5BTUU6ICAgU2V0IGdsb2JhbCBuYW1lc3BhY2VcbiIKKyAgICAiICAgIHZhbGlkYXRlOiAgICAgICAgR2VuZXJhdGUgUEhQIHZhbGlkYXRvciBtZXRob2RzXG4iCisgICAgIiAgICBqc29uOiAgICAgICAgICAgIEdlbmVyYXRlIEpzb25TZXJpYWxpemFibGUgY2xhc3NlcyAocmVxdWlyZXMgUEhQID49IDUuNClcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcHlfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NjIwN2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDI3NjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBQeXRob24gY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X3B5X2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfcHlfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9nZW5lcmF0b3IgKHByb2dyYW0pIHsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgZ2VuX25ld3N0eWxlXyA9IHRydWU7CisgICAgZ2VuX3V0ZjhzdHJpbmdzXyA9IHRydWU7CisgICAgZ2VuX2R5bmJhc2VfID0gZmFsc2U7CisgICAgZ2VuX3Nsb3RzXyA9IGZhbHNlOworICAgIGdlbl90b3JuYWRvXyA9IGZhbHNlOworICAgIGdlbl96b3BlX2ludGVyZmFjZV8gPSBmYWxzZTsKKyAgICBnZW5fdHdpc3RlZF8gPSBmYWxzZTsKKyAgICBnZW5fZHluYW1pY18gPSBmYWxzZTsKKyAgICBjb2RpbmdfID0gIiI7CisgICAgZ2VuX2R5bmJhc2VjbGFzc18gPSAiIjsKKyAgICBnZW5fZHluYmFzZWNsYXNzX2V4Y18gPSAiIjsKKyAgICBnZW5fZHluYmFzZWNsYXNzX2Zyb3plbl8gPSAiIjsKKyAgICBpbXBvcnRfZHluYmFzZV8gPSAiIjsKKyAgICBwYWNrYWdlX3ByZWZpeF8gPSAiIjsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJuZXdfc3R5bGUiKSA9PSAwKSB7CisgICAgICAgIHB3YXJuaW5nKDAsICJuZXdfc3R5bGUgaXMgZW5hYmxlZCBieSBkZWZhdWx0LCBzbyB0aGUgb3B0aW9uIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUuXG4iKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgib2xkX3N0eWxlIikgPT0gMCkgeworICAgICAgICBnZW5fbmV3c3R5bGVfID0gZmFsc2U7CisgICAgICAgIHB3YXJuaW5nKDAsICJvbGRfc3R5bGUgaXMgZGVwcmVjYXRlZCBhbmQgbWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS5cbiIpOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ1dGY4c3RyaW5ncyIpID09IDApIHsKKyAgICAgICAgcHdhcm5pbmcoMCwgInV0ZjhzdHJpbmdzIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCwgc28gdGhlIG9wdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlLlxuIik7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vX3V0ZjhzdHJpbmdzIikgPT0gMCkgeworICAgICAgICBnZW5fdXRmOHN0cmluZ3NfID0gZmFsc2U7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInNsb3RzIikgPT0gMCkgeworICAgICAgICBnZW5fc2xvdHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicGFja2FnZV9wcmVmaXgiKSA9PSAwKSB7CisgICAgICAgIHBhY2thZ2VfcHJlZml4XyA9IGl0ZXItPnNlY29uZDsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZHluYW1pYyIpID09IDApIHsKKyAgICAgICAgZ2VuX2R5bmFtaWNfID0gdHJ1ZTsKKyAgICAgICAgZ2VuX25ld3N0eWxlXyA9IGZhbHNlOyAvLyBkeW5hbWljIGlzIG5ld3N0eWxlCisgICAgICAgIGlmKCBnZW5fZHluYmFzZWNsYXNzXy5lbXB0eSgpKSB7CisgICAgICAgICAgZ2VuX2R5bmJhc2VjbGFzc18gPSAiVEJhc2UiOworICAgICAgICB9CisgICAgICAgIGlmKCBnZW5fZHluYmFzZWNsYXNzX2Zyb3plbl8uZW1wdHkoKSkgeworICAgICAgICAgIGdlbl9keW5iYXNlY2xhc3NfZnJvemVuXyA9ICJURnJvemVuQmFzZSI7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGdlbl9keW5iYXNlY2xhc3NfZXhjXy5lbXB0eSgpKSB7CisgICAgICAgICAgZ2VuX2R5bmJhc2VjbGFzc19leGNfID0gIlRFeGNlcHRpb25CYXNlIjsKKyAgICAgICAgfQorICAgICAgICBpZiggaW1wb3J0X2R5bmJhc2VfLmVtcHR5KCkpIHsKKyAgICAgICAgICBpbXBvcnRfZHluYmFzZV8gPSAiZnJvbSB0aHJpZnQucHJvdG9jb2wuVEJhc2UgaW1wb3J0IFRCYXNlLCBURnJvemVuQmFzZSwgVEV4Y2VwdGlvbkJhc2UsIFRUcmFuc3BvcnRcbiI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZHluYmFzZSIpID09IDApIHsKKyAgICAgICAgZ2VuX2R5bmJhc2VfID0gdHJ1ZTsKKyAgICAgICAgZ2VuX2R5bmJhc2VjbGFzc18gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZHluZnJvemVuIikgPT0gMCkgeworICAgICAgICBnZW5fZHluYmFzZWNsYXNzX2Zyb3plbl8gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZHluZXhjIikgPT0gMCkgeworICAgICAgICBnZW5fZHluYmFzZWNsYXNzX2V4Y18gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZHluaW1wb3J0IikgPT0gMCkgeworICAgICAgICBnZW5fZHluYmFzZV8gPSB0cnVlOworICAgICAgICBpbXBvcnRfZHluYmFzZV8gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiem9wZS5pbnRlcmZhY2UiKSA9PSAwKSB7CisgICAgICAgIGdlbl96b3BlX2ludGVyZmFjZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ0d2lzdGVkIikgPT0gMCkgeworICAgICAgICBnZW5fdHdpc3RlZF8gPSB0cnVlOworICAgICAgICBnZW5fem9wZV9pbnRlcmZhY2VfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidG9ybmFkbyIpID09IDApIHsKKyAgICAgICAgZ2VuX3Rvcm5hZG9fID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiY29kaW5nIikgPT0gMCkgeworICAgICAgICBjb2RpbmdfID0gaXRlci0+c2Vjb25kOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIHB5OiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ2VuX3R3aXN0ZWRfICYmIGdlbl90b3JuYWRvXykgeworICAgICAgdGhyb3cgImF0IG1vc3Qgb25lIG9mICd0d2lzdGVkJyBhbmQgJ3Rvcm5hZG8nIGFyZSBhbGxvd2VkIjsKKyAgICB9CisKKyAgICBjb3B5X29wdGlvbnNfID0gb3B0aW9uX3N0cmluZzsKKworICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXB5LnR3aXN0ZWQiOworICAgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7CisgICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1weS50b3JuYWRvIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcHkiOworICAgIH0KKyAgfQorCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgaW5kZW50X3N0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gIiAgICAiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICAvKioKKyAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQorICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3B5X3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3B5X3RocmlmdF9zcGVjKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3B5X3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcHlfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqIHRkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YmhlYWRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIHB5X2F1dG9nZW5fY29tbWVudCgpOworICBzdGQ6OnN0cmluZyBweV9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2FyZ3VtZW50KHRfZmllbGQqIHRmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKHRfZmllbGQqIHRmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbnRlcmZhY2UgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBwcmUgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcG9zdCA9IE5VTEwpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fc3BlY19hcmdzKHRfdHlwZSogdHR5cGUpOworCisgIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgeworICAgIHJldHVybiBzdWJfbmFtZXNwYWNlID09ICJ0d2lzdGVkIjsKKyAgfQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfcmVhbF9weV9tb2R1bGUoY29uc3QgdF9wcm9ncmFtKiBwcm9ncmFtLCBib29sIGdlbl90d2lzdGVkLCBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcj0iIikgeworICAgIGlmIChnZW5fdHdpc3RlZCkgeworICAgICAgc3RkOjpzdHJpbmcgdHdpc3RlZF9tb2R1bGUgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJweS50d2lzdGVkIik7CisgICAgICBpZiAoIXR3aXN0ZWRfbW9kdWxlLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIHR3aXN0ZWRfbW9kdWxlOworICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHJlYWxfbW9kdWxlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgicHkiKTsKKyAgICBpZiAocmVhbF9tb2R1bGUuZW1wdHkoKSkgeworICAgICAgcmV0dXJuIHByb2dyYW0tPmdldF9uYW1lKCk7CisgICAgfQorICAgIHJldHVybiBwYWNrYWdlX2RpciArIHJlYWxfbW9kdWxlOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNfaW1tdXRhYmxlKHRfdHlwZSogdHR5cGUpIHsKKyAgICByZXR1cm4gdHR5cGUtPmFubm90YXRpb25zXy5maW5kKCJweXRob24uaW1tdXRhYmxlIikgIT0gdHR5cGUtPmFubm90YXRpb25zXy5lbmQoKTsKKyAgfQorCitwcml2YXRlOgorCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBuZXctc3R5bGUgY2xhc3Nlcy4KKyAgICovCisgIGJvb2wgZ2VuX25ld3N0eWxlXzsKKworICAvKioKKyAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBkeW5hbWljIHN0eWxlIGNsYXNzZXMuCisgICovCisgIGJvb2wgZ2VuX2R5bmFtaWNfOworCisgIGJvb2wgZ2VuX2R5bmJhc2VfOworICBzdGQ6OnN0cmluZyBnZW5fZHluYmFzZWNsYXNzXzsKKyAgc3RkOjpzdHJpbmcgZ2VuX2R5bmJhc2VjbGFzc19mcm96ZW5fOworICBzdGQ6OnN0cmluZyBnZW5fZHluYmFzZWNsYXNzX2V4Y187CisKKyAgc3RkOjpzdHJpbmcgaW1wb3J0X2R5bmJhc2VfOworCisgIGJvb2wgZ2VuX3Nsb3RzXzsKKworICBzdGQ6OnN0cmluZyBjb3B5X29wdGlvbnNfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBjb2RlIGZvciB1c2Ugd2l0aCB6b3BlLmludGVyZmFjZS4KKyAgICovCisgIGJvb2wgZ2VuX3pvcGVfaW50ZXJmYWNlXzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgVHdpc3RlZC1mcmllbmRseSBSUEMgc2VydmljZXMuCisgICAqLworICBib29sIGdlbl90d2lzdGVkXzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgY29kZSBmb3IgdXNlIHdpdGggVG9ybmFkbworICAgKi8KKyAgYm9vbCBnZW5fdG9ybmFkb187CisKKyAgLyoqCisgICAqIFRydWUgaWYgc3RyaW5ncyBzaG91bGQgYmUgZW5jb2RlZCB1c2luZyB1dGYtOC4KKyAgICovCisgIGJvb2wgZ2VuX3V0ZjhzdHJpbmdzXzsKKworICAvKioKKyAgICogc3BlY2lmeSBnZW5lcmF0ZWQgZmlsZSBlbmNvZGluZworICAgKiBlZy4gIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyAgICovCisgIHN0cmluZyBjb2RpbmdfOworCisgIHN0cmluZyBwYWNrYWdlX3ByZWZpeF87CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworCisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKKyAgc3RkOjpzdHJpbmcgbW9kdWxlXzsKKworcHJvdGVjdGVkOgorICB2aXJ0dWFsIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBsYW5nX2tleXdvcmRzKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nIGtleXdvcmRzW10gPSB7ICJGYWxzZSIsICJOb25lIiwgIlRydWUiLCAiYW5kIiwgImFzIiwgImFzc2VydCIsICJicmVhayIsICJjbGFzcyIsCisgICAgICAgICAgImNvbnRpbnVlIiwgImRlZiIsICJkZWwiLCAiZWxpZiIsICJlbHNlIiwgImV4Y2VwdCIsICJleGVjIiwgImZpbmFsbHkiLCAiZm9yIiwgImZyb20iLAorICAgICAgICAgICJnbG9iYWwiLCAiaWYiLCAiaW1wb3J0IiwgImluIiwgImlzIiwgImxhbWJkYSIsICJub25sb2NhbCIsICJub3QiLCAib3IiLCAicGFzcyIsICJwcmludCIsCisgICAgICAgICAgInJhaXNlIiwgInJldHVybiIsICJ0cnkiLCAid2hpbGUiLCAid2l0aCIsICJ5aWVsZCIgfTsKKyAgICByZXR1cm4gc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KGtleXdvcmRzLCBrZXl3b3JkcyArIHNpemVvZihrZXl3b3Jkcykvc2l6ZW9mKGtleXdvcmRzWzBdKSApOworICB9Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIHN0cmluZyBtb2R1bGUgPSBnZXRfcmVhbF9weV9tb2R1bGUocHJvZ3JhbV8sIGdlbl90d2lzdGVkXyk7CisgIHBhY2thZ2VfZGlyXyA9IGdldF9vdXRfZGlyKCk7CisgIG1vZHVsZV8gPSBtb2R1bGU7CisgIHdoaWxlICh0cnVlKSB7CisgICAgLy8gVE9ETzogRG8gYmV0dGVyIGVycm9yIGNoZWNraW5nIGhlcmUuCisgICAgTUtESVIocGFja2FnZV9kaXJfLmNfc3RyKCkpOworICAgIHN0ZDo6b2ZzdHJlYW0gaW5pdF9weSgocGFja2FnZV9kaXJfICsgIi9fX2luaXRfXy5weSIpLmNfc3RyKCksIHN0ZDo6aW9zX2Jhc2U6OmFwcCk7CisgICAgaW5pdF9weS5jbG9zZSgpOworICAgIGlmIChtb2R1bGUuZW1wdHkoKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IG1vZHVsZS5maW5kKCcuJyk7CisgICAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHBhY2thZ2VfZGlyXyArPSAiLyI7CisgICAgICBwYWNrYWdlX2Rpcl8gKz0gbW9kdWxlOworICAgICAgbW9kdWxlLmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBhY2thZ2VfZGlyXyArPSAiLyI7CisgICAgICBwYWNrYWdlX2Rpcl8gKz0gbW9kdWxlLnN1YnN0cigwLCBwb3MpOworICAgICAgbW9kdWxlLmVyYXNlKDAsIHBvcyArIDEpOworICAgIH0KKyAgfQorCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICJ0dHlwZXMucHkiOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICJjb25zdGFudHMucHkiOworICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworCisgIHN0cmluZyBmX2luaXRfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvX19pbml0X18ucHkiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaW5pdDsKKyAgZl9pbml0Lm9wZW4oZl9pbml0X25hbWUuY19zdHIoKSk7CisgIGZfaW5pdCA8PCAiX19hbGxfXyA9IFsndHR5cGVzJywgJ2NvbnN0YW50cyciOworICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7CisgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKKyAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7CisgICAgZl9pbml0IDw8ICIsICciIDw8ICgqc3ZfaXRlciktPmdldF9uYW1lKCkgPDwgIiciOworICB9CisgIGZfaW5pdCA8PCAiXSIgPDwgZW5kbDsKKyAgZl9pbml0LmNsb3NlKCk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfdHlwZXNfIDw8IHB5X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwKKyAgICAgICAgICAgPDwgcHlfaW1wb3J0cygpIDw8IGVuZGwKKyAgICAgICAgICAgPDwgcmVuZGVyX2luY2x1ZGVzKCkgPDwgZW5kbAorICAgICAgICAgICA8PCAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGltcG9ydF9keW5iYXNlXzsKKworICBmX3R5cGVzXyA8PCAiYWxsX3N0cnVjdHMgPSBbXSIgPDwgZW5kbDsKKworICBmX2NvbnN0c18gPDwKKyAgICBweV9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8CisgICAgcHlfaW1wb3J0cygpIDw8IGVuZGwgPDwKKyAgICAiZnJvbSAudHR5cGVzIGltcG9ydCAqIiA8PCBlbmRsOworfQorCisvKioKKyAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KKyAqLworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIHJlc3VsdCArPSAiaW1wb3J0ICIgKyBnZXRfcmVhbF9weV9tb2R1bGUoaW5jbHVkZXNbaV0sIGdlbl90d2lzdGVkXywgcGFja2FnZV9wcmVmaXhfKSArICIudHR5cGVzXG4iOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQXV0b2dlbidkIGNvbW1lbnQKKyAqLworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpweV9hdXRvZ2VuX2NvbW1lbnQoKSB7CisgIHN0cmluZyBjb2Rpbmc7CisgIGlmICghY29kaW5nXy5lbXB0eSgpKSB7CisgICAgICBjb2RpbmcgPSAiIyAtKi0gY29kaW5nOiAiICsgY29kaW5nXyArICIgLSotXG4iOworICB9CisgIHJldHVybiBjb2RpbmcgKyBzdGQ6OnN0cmluZygiI1xuIikgKyAiIyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKKyAgICAgICAgICsgIiNcbiIgKyAiIyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsgIiNcbiIKKyAgICAgICAgICsgIiMgIG9wdGlvbnMgc3RyaW5nOiAiICsgY29weV9vcHRpb25zXyArICJcbiIgKyAiI1xuIjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgdGhyaWZ0IGltcG9ydHMKKyAqLworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpweV9pbXBvcnRzKCkgeworICBvc3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCAiZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUVHlwZSwgVE1lc3NhZ2VUeXBlLCBURnJvemVuRGljdCwgVEV4Y2VwdGlvbiwgIgorICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIgorICAgICA8PCBlbmRsCisgICAgIDw8ICJmcm9tIHRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaW1wb3J0IFRQcm90b2NvbEV4Y2VwdGlvbiIKKyAgICAgPDwgZW5kbAorICAgICA8PCAiZnJvbSB0aHJpZnQuVFJlY3Vyc2l2ZSBpbXBvcnQgZml4X3NwZWMiCisgICAgIDw8IGVuZGw7CisKKyAgaWYgKGdlbl91dGY4c3RyaW5nc18pIHsKKyAgICBzcyA8PCBlbmRsIDw8ICJpbXBvcnQgc3lzIjsKKyAgfQorICByZXR1cm4gc3Muc3RyKCk7Cit9CisKKy8qKgorICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKworICAvLyBGaXggdGhyaWZ0X3NwZWMgZGVmaW5pdGlvbnMgZm9yIHJlY3Vyc2l2ZSBzdHJ1Y3RzLgorICBmX3R5cGVzXyA8PCAiZml4X3NwZWMoYWxsX3N0cnVjdHMpIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAiZGVsIGFsbF9zdHJ1Y3RzIiA8PCBlbmRsOworCisgIC8vIENsb3NlIHR5cGVzIGZpbGUKKyAgZl90eXBlc18uY2xvc2UoKTsKKyAgZl9jb25zdHNfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBQeXRob24sIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQorICogdGhlIHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gdG9fc3RyaW5nX21hcHBpbmcsIGZyb21fc3RyaW5nX21hcHBpbmc7CisKKyAgZl90eXBlc18gPDwgZW5kbCA8PCBlbmRsIDw8ICJjbGFzcyAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8IChnZW5fbmV3c3R5bGVfID8gIihvYmplY3QpIiA6ICIiKQorICAgICAgICAgICA8PCAoZ2VuX2R5bmFtaWNfID8gIigiICsgZ2VuX2R5bmJhc2VjbGFzc18gKyAiKSIgOiAiIikgPDwgIjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKGZfdHlwZXNfLCB0ZW51bSk7CisKKyAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIl9WQUxVRVNfVE9fTkFNRVMgPSB7IiA8PCBlbmRsOworICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJfTkFNRVNfVE9fVkFMVUVTID0geyIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpbmRlbnQoZl90eXBlc18pIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZSA8PCBlbmRsOworCisgICAgLy8gRGljdGlvbmFyaWVzIHRvL2Zyb20gc3RyaW5nIG5hbWVzIG9mIGVudW1zCisgICAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgdmFsdWUgPDwgIjogXCIiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZXNjYXBlX3N0cmluZygoKmNfaXRlciktPmdldF9uYW1lKCkpIDw8ICJcIiwiIDw8IGVuZGw7CisgICAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAnIicgPDwgZXNjYXBlX3N0cmluZygoKmNfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCI6ICIgPDwgdmFsdWUgPDwgJywnIDw8IGVuZGw7CisgIH0KKyAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgdG9fc3RyaW5nX21hcHBpbmcuc3RyKCkgPDwgZW5kbCA8PCBmcm9tX3N0cmluZ19tYXBwaW5nLnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKKworICBpbmRlbnQoZl9jb25zdHNfKSA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSk7CisgIGZfY29uc3RzXyA8PCBlbmRsOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJUcnVlIiA6ICJGYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgb3V0IDw8ICJmbG9hdCgiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCBlbWl0X2RvdWJsZV9hc19zdHJpbmcodmFsdWUtPmdldF9kb3VibGUoKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCoqeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpIDw8ICI6ICIKKyAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9KSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0eXBlKSkgeworICAgICAgb3V0IDw8ICJURnJvemVuRGljdCgiOworICAgIH0KKyAgICBvdXQgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KSA8PCAiOiAiCisgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICAgIGlmIChpc19pbW11dGFibGUodHlwZSkpIHsKKyAgICAgIG91dCA8PCAiKSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGlmIChpc19pbW11dGFibGUodHlwZSkpIHsKKyAgICAgICAgb3V0IDw8ICJmcm96ZW4iOworICAgICAgfQorICAgICAgb3V0IDw8ICJzZXQoIjsKKyAgICB9CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0eXBlKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgICAgb3V0IDw8ICIoIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIlsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpZiAoaXNfaW1tdXRhYmxlKHR5cGUpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJdIjsKKyAgICB9CisgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBvdXQgPDwgIikiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSAiZm9yd2FyZCBkZWNsYXJhdGlvbnMiIGZvciBweXRob24gc3RydWN0cy4KKyAqIFRoZXNlIGFyZSBhY3R1YWxseSBmdWxsIGNsYXNzIGRlZmluaXRpb25zIHNvIHRoYXQgY2FsbHMgdG8gZ2VuZXJhdGVfc3RydWN0CisgKiBjYW4gYWRkIHRoZSB0aHJpZnRfc3BlYyBmaWVsZC4gIFRoaXMgaXMgbmVlZGVkIHNvIHRoYXQgYWxsIHRocmlmdF9zcGVjCisgKiBkZWZpbml0aW9ucyBhcmUgZ3JvdXBlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIHRvIGVuYWJsZSBjby1yZWN1cnNpdmUgc3RydWN0cy4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCkgeworICAgIGdlbmVyYXRlX3B5X3N0cnVjdCh0c3RydWN0LCB0c3RydWN0LT5pc194Y2VwdGlvbigpKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBweXRob24gc3RydWN0CisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9weV90aHJpZnRfc3BlYyhmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQorICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX3B5X3RocmlmdF9zcGVjKGZfdHlwZXNfLCB0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHB5dGhvbiBzdHJ1Y3QKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKK30KKworCisvKioKKyAqIEdlbmVyYXRlIHRoZSB0aHJpZnRfc3BlYyBmb3IgYSBzdHJ1Y3QKKyAqIEZvciBleGFtcGxlLAorICogICBhbGxfc3RydWN0cy5hcHBlbmQoUmVjdXJzaXZlKQorICogICBSZWN1cnNpdmUudGhyaWZ0X3NwZWMgPSAoCisgKiAgICAgICBOb25lLCAgIyAwCisgKiAgICAgICAoMSwgVFR5cGUuTElTVCwgJ0NoaWxkcmVuJywgKFRUeXBlLlNUUlVDVCwgKFJlY3Vyc2l2ZSwgTm9uZSksIEZhbHNlKSwgTm9uZSwgKSwgICMgMQorICogICApCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3RocmlmdF9zcGVjKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAvKmlzX2V4Y2VwdGlvbiovKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHNvcnRlZF9tZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICAvLyBBZGQgc3RydWN0IGRlZmluaXRpb24gdG8gbGlzdCBzbyB0aHJpZnRfc3BlYyBjYW4gYmUgZml4ZWQgZm9yIHJlY3Vyc2l2ZSBzdHJ1Y3R1cmVzLgorICBpbmRlbnQob3V0KSA8PCAiYWxsX3N0cnVjdHMuYXBwZW5kKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbDsKKworICBpZiAoc29ydGVkX21lbWJlcnMuZW1wdHkoKSB8fCAoc29ydGVkX21lbWJlcnNbMF0tPmdldF9rZXkoKSA+PSAwKSkgeworICAgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi50aHJpZnRfc3BlYyA9ICgiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbnQgc29ydGVkX2tleXNfcG9zID0gMDsKKyAgICBmb3IgKG1faXRlciA9IHNvcnRlZF9tZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBzb3J0ZWRfbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKworICAgICAgZm9yICg7IHNvcnRlZF9rZXlzX3BvcyAhPSAoKm1faXRlciktPmdldF9rZXkoKTsgc29ydGVkX2tleXNfcG9zKyspIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIk5vbmUsICAjICIgPDwgc29ydGVkX2tleXNfcG9zIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGluZGVudChvdXQpIDw8ICIoIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgICA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCAiJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIgorICAgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX3NwZWNfYXJncygoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKCptX2l0ZXIpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgIDw8ICIpLCIKKyAgICAgICAgICAgICAgICAgIDw8ICIgICMgIiA8PCBzb3J0ZWRfa2V5c19wb3MgPDwgZW5kbDsKKworICAgICAgc29ydGVkX2tleXNfcG9zKys7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIudGhyaWZ0X3NwZWMgPSAoKSIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHNvcnRlZF9tZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBvdXQgPDwgZW5kbCA8PCBlbmRsIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBpZiAoZ2VuX2R5bmFtaWNfKSB7CisgICAgICBvdXQgPDwgIigiIDw8IGdlbl9keW5iYXNlY2xhc3NfZXhjXyA8PCAiKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiKFRFeGNlcHRpb24pIjsKKyAgICB9CisgIH0gZWxzZSBpZiAoZ2VuX2R5bmFtaWNfKSB7CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0c3RydWN0KSkgeworICAgICAgb3V0IDw8ICIoIiA8PCBnZW5fZHluYmFzZWNsYXNzX2Zyb3plbl8gPDwgIikiOworICAgIH0gZWxzZSAgeworICAgICAgb3V0IDw8ICIoIiA8PCBnZW5fZHluYmFzZWNsYXNzXyA8PCAiKSI7CisgICAgfQorICB9IGVsc2UgaWYgKGdlbl9uZXdzdHlsZV8pIHsKKyAgICBvdXQgPDwgIihvYmplY3QpIjsKKyAgfQorICBvdXQgPDwgIjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG91dCwgdHN0cnVjdCk7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLyoKKyAgICAgSGVyZSB3ZSBnZW5lcmF0ZSB0aGUgc3RydWN0dXJlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBmYXN0YmluYXJ5IGNvZGVjLgorICAgICBUaGVzZSBzcGVjaWZpY2F0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorICAgICB0aHJpZnRfc3BlYyAtPiB0dXBsZSBvZiBpdGVtX3NwZWMKKyAgICAgaXRlbV9zcGVjIC0+IE5vbmUgfCAodGFnLCB0eXBlX2VudW0sIG5hbWUsIHNwZWNfYXJncywgZGVmYXVsdCkKKyAgICAgdGFnIC0+IGludGVnZXIKKyAgICAgdHlwZV9lbnVtIC0+IFRUeXBlLkkzMiB8IFRUeXBlLlNUUklORyB8IFRUeXBlLlNUUlVDVCB8IC4uLgorICAgICBuYW1lIC0+IHN0cmluZ19saXRlcmFsCisgICAgIGRlZmF1bHQgLT4gTm9uZSAgIyBIYW5kbGVkIGJ5IF9faW5pdF9fCisgICAgIHNwZWNfYXJncyAtPiBOb25lICAjIEZvciBzaW1wbGUgdHlwZXMKKyAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncykgICMgVmFsdWUgdHlwZSBmb3IgbGlzdC9zZXQKKyAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncywgdHlwZV9lbnVtLCBzcGVjX2FyZ3MpCisgICAgICAgICAgICAgICAgICAjIEtleSBhbmQgdmFsdWUgZm9yIG1hcAorICAgICAgICAgICAgICAgIHwgKGNsYXNzX25hbWUsIHNwZWNfYXJnc19wdHIpICMgRm9yIHN0cnVjdC9leGNlcHRpb24KKyAgICAgY2xhc3NfbmFtZSAtPiBpZGVudGlmaWVyICAjIEJhc2ljYWxseSBhIHBvaW50ZXIgdG8gdGhlIGNsYXNzCisgICAgIHNwZWNfYXJnc19wdHIgLT4gZXhwcmVzc2lvbiAgIyBqdXN0IGNsYXNzX25hbWUuc3BlY19hcmdzCisKKyAgICAgVE9ETyhkcmVpc3MpOiBDb25zaWRlciBtYWtpbmcgdGhpcyB3b3JrIGZvciBzdHJ1Y3RzIHdpdGggbmVnYXRpdmUgdGFncy4KKyAgKi8KKworICBpZiAoZ2VuX3Nsb3RzXykgeworICAgIGluZGVudChvdXQpIDw8ICJfX3Nsb3RzX18gPSAoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZvciAobV9pdGVyID0gc29ydGVkX21lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IHNvcnRlZF9tZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgIiciIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIikiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIFRPRE8oZHJlaXNzKTogTG9vayBpbnRvIGdlbmVyYXRpbmcgYW4gZW1wdHkgdHVwbGUgaW5zdGVhZCBvZiBOb25lCisgIC8vIGZvciBzdHJ1Y3R1cmVzIHdpdGggbm8gbWVtYmVycy4KKyAgLy8gVE9ETyhkcmVpc3MpOiBUZXN0IGVuY29kaW5nIG9mIHN0cnVjdHMgd2hlcmUgc29tZSBpbm5lciBzdHJ1Y3RzCisgIC8vIGRvbid0IGhhdmUgdGhyaWZ0X3NwZWMuCisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9faW5pdF9fKHNlbGYsIjsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIG91dCA8PCAiICIgPDwgZGVjbGFyZV9hcmd1bWVudCgqbV9pdGVyKSA8PCAiLCI7CisgICAgfQorICAgIG91dCA8PCAiKToiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIC8vIEluaXRpYWxpemUgZmllbGRzCisgICAgICB0X3R5cGUqIHR5cGUgPSAoKm1faXRlciktPmdldF90eXBlKCk7CisgICAgICBpZiAoIXR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0eXBlLT5pc19lbnVtKCkgJiYgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGlzICIKKyAgICAgICAgICAgICAgICAgICAgPDwgInNlbGYudGhyaWZ0X3NwZWNbIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiXVs0XToiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUoKm1faXRlcikKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0KKworICAgICAgaWYgKGlzX2ltbXV0YWJsZSh0c3RydWN0KSkgeworICAgICAgICBpZiAoZ2VuX25ld3N0eWxlXyB8fCBnZW5fZHluYW1pY18pIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAic3VwZXIoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIsIHNlbGYpLl9fc2V0YXR0cl9fKCciCisgICAgICAgICAgICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAic2VsZi5fX2RpY3RfX1snIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiJ10gPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAic2VsZi4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaWYgKGlzX2ltbXV0YWJsZSh0c3RydWN0KSkgeworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fc2V0YXR0cl9fKHNlbGYsICphcmdzKToiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyYWlzZSBUeXBlRXJyb3IoXCJjYW4ndCBtb2RpZnkgaW1tdXRhYmxlIGluc3RhbmNlXCIpIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19kZWxhdHRyX18oc2VsZiwgKmFyZ3MpOiIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIFR5cGVFcnJvcihcImNhbid0IG1vZGlmeSBpbW11dGFibGUgaW5zdGFuY2VcIikiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKworICAgIC8vIEhhc2ggYWxsIG9mIHRoZSBtZW1iZXJzIGluIG9yZGVyLCBhbmQgYWxzbyBoYXNoIGluIHRoZSBjbGFzcworICAgIC8vIHRvIGF2b2lkIGNvbGxpc2lvbnMgZm9yIHN0dWZmIGxpa2Ugc2luZ2xlLWZpZWxkIHN0cnVjdHVyZXMuCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19oYXNoX18oc2VsZik6IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIGhhc2goc2VsZi5fX2NsYXNzX18pIF4gaGFzaCgoIjsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIG91dCA8PCAic2VsZi4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCAiOworICAgIH0KKworICAgIG91dCA8PCAiKSkiIDw8IGVuZGw7CisgIH0KKworICBpZiAoIWdlbl9keW5hbWljXykgeworICAgIG91dCA8PCBlbmRsOworICAgIGdlbmVyYXRlX3B5X3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgICBnZW5lcmF0ZV9weV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0KKworICAvLyBGb3IgZXhjZXB0aW9ucyBvbmx5LCBnZW5lcmF0ZSBhIF9fc3RyX18gbWV0aG9kLiBUaGlzIGlzCisgIC8vIGJlY2F1c2Ugd2hlbiByYWlzZWQgZXhjZXB0aW9ucyBhcmUgcHJpbnRlZCB0byB0aGUgY29uc29sZSwgX19yZXByX18KKyAgLy8gaXNuJ3QgdXNlZC4gU2VlIHB5dGhvbiBidWcgIzU4ODIKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fc3RyX18oc2VsZik6IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIHJlcHIoc2VsZikiIDw8IGVuZGw7CisgIH0KKworICBpZiAoIWdlbl9zbG90c18pIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICAvLyBQcmludGluZyB1dGlsaXRpZXMgc28gdGhhdCBvbiB0aGUgY29tbWFuZCBsaW5lIHRocmlmdAorICAgIC8vIHN0cnVjdHMgbG9vayBwcmV0dHkgbGlrZSBkaWN0aW9uYXJpZXMKKyAgICBpbmRlbnQob3V0KSA8PCAiZGVmIF9fcmVwcl9fKHNlbGYpOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIkwgPSBbJyVzPSVyJyAlIChrZXksIHZhbHVlKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9fZGljdF9fLml0ZW1zKCldIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgLy8gRXF1YWxpdHkgYW5kIGluZXF1YWxpdHkgbWV0aG9kcyB0aGF0IGNvbXBhcmUgYnkgdmFsdWUKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgInNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19kaWN0X18iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gbm90IChzZWxmID09IG90aGVyKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKCFnZW5fZHluYW1pY18pIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICAvLyBubyBiYXNlIGNsYXNzIGF2YWlsYWJsZSB0byBpbXBsZW1lbnQgX19lcV9fIGFuZCBfX3JlcHJfXyBhbmQgX19uZV9fIGZvciB1cworICAgIC8vIHNvIHdlIG11c3QgcHJvdmlkZSBvbmUgdGhhdCB1c2VzIF9fc2xvdHNfXworICAgIGluZGVudChvdXQpIDw8ICJkZWYgX19yZXByX18oc2VsZik6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTCA9IFsnJXM9JXInICUgKGtleSwgZ2V0YXR0cihzZWxmLCBrZXkpKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICBmb3Iga2V5IGluIHNlbGYuX19zbG90c19fXSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICclcyglcyknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCAnLCAnLmpvaW4oTCkpIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIC8vIEVxdWFsaXR5IG1ldGhvZCB0aGF0IGNvbXBhcmVzIGVhY2ggYXR0cmlidXRlIGJ5IHZhbHVlIGFuZCB0eXBlLCB3YWxraW5nIF9fc2xvdHNfXworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4gRmFsc2UiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciBhdHRyIGluIHNlbGYuX19zbG90c19fOiIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgIm15X3ZhbCA9IGdldGF0dHIoc2VsZiwgYXR0cikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJvdGhlcl92YWwgPSBnZXRhdHRyKG90aGVyLCBhdHRyKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImlmIG15X3ZhbCAhPSBvdGhlcl92YWw6IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJldHVybiBGYWxzZSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFRydWUiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19uZV9fKHNlbGYsIG90aGVyKToiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4gbm90IChzZWxmID09IG90aGVyKSIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgcmVhZCBtZXRob2QgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKGlzX2ltbXV0YWJsZSh0c3RydWN0KSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiQGNsYXNzbWV0aG9kIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJkZWYgcmVhZChjbHMsIGlwcm90KToiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgImRlZiByZWFkKHNlbGYsIGlwcm90KToiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgY2hhciogaWQgPSBpc19pbW11dGFibGUodHN0cnVjdCkgPyAiY2xzIiA6ICJzZWxmIjsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgaXByb3QuX2Zhc3RfZGVjb2RlIGlzIG5vdCBOb25lICIKKyAgICAgICAgICAgICAgICAgImFuZCBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgIgorICAgICAgICAgICAgICAgICAiYW5kICIKKyAgICAgICAgICAgICAgPDwgaWQgPDwgIi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZToiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGlwcm90Ll9mYXN0X2RlY29kZShOb25lLCBpcHJvdCwgW2NscywgY2xzLnRocmlmdF9zcGVjXSkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90Ll9mYXN0X2RlY29kZShzZWxmLCBpcHJvdCwgW3NlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjXSkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKSIgPDwgZW5kbDsKKyAgCisgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgdF9maWVsZCogdGZpZWxkID0gKmZfaXRlcjsKKyAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZXN1bHQ7CisgICAgICByZXN1bHQgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSAiOworICAgICAgaWYgKHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgICByZXN1bHQgPDwgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUodGZpZWxkKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA8PCAiTm9uZSI7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHQuc3RyKCkgPDwgZW5kbDsKKyAgICAgfQorICB9CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSBUcnVlOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICIoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKSIgPDwgZW5kbDsKKworICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCisgIGluZGVudChvdXQpIDw8ICJpZiBmdHlwZSA9PSBUVHlwZS5TVE9QOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJicmVhayIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBib29sIGZpcnN0ID0gdHJ1ZTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxpZiAiOworICAgIH0KKyAgICBvdXQgPDwgImZpZCA9PSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiBmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYuIik7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbHNlOiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImlwcm90LnNraXAoZnR5cGUpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZToiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJpcHJvdC5za2lwKGZ0eXBlKSIgPDwgZW5kbDsKKworICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRGaWVsZEVuZCgpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKKworICBpZiAoaXNfaW1tdXRhYmxlKHRzdHJ1Y3QpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBjbHMoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIj0iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlmIG9wcm90Ll9mYXN0X2VuY29kZSBpcyBub3QgTm9uZSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZToiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpCisgICAgICA8PCAib3Byb3QudHJhbnMud3JpdGUob3Byb3QuX2Zhc3RfZW5jb2RlKHNlbGYsIFtzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlY10pKSIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oJyIgPDwgbmFtZSA8PCAiJykiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgc2VsZi4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGlzIG5vdCBOb25lOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIKKyAgICAgICAgICAgICAgICA8PCAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKSIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYuIik7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpIiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKSIKKyAgICAgIDw8IGVuZGw7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZ2VuZXJhdGVfcHlfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworfQorCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgImRlZiB2YWxpZGF0ZShzZWxmKToiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgc2VsZi4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgaXMgTm9uZToiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8IGluZGVudF9zdHIoKSA8PCAicmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKG1lc3NhZ2U9J1JlcXVpcmVkIGZpZWxkICIKKyAgICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiBpcyB1bnNldCEnKSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIi5weSI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IHB5X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgcHlfaW1wb3J0cygpIDw8IGVuZGw7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIgorICAgICAgICAgICAgICAgPDwgZ2V0X3JlYWxfcHlfbW9kdWxlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpLCBnZW5fdHdpc3RlZF8sIHBhY2thZ2VfcHJlZml4XykgPDwgIi4iCisgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0IGxvZ2dpbmciIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiZnJvbSAudHR5cGVzIGltcG9ydCAqIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgImZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVFByb2Nlc3NvciIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbXBvcnRfZHluYmFzZV87CisgIGlmIChnZW5fem9wZV9pbnRlcmZhY2VfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgSW50ZXJmYWNlLCBpbXBsZW1lbnRlciIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJmcm9tIHR3aXN0ZWQuaW50ZXJuZXQgaW1wb3J0IGRlZmVyIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHdpc3RlZCIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJmcm9tIHRvcm5hZG8gaW1wb3J0IGdlbiIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8ICJmcm9tIHRvcm5hZG8gaW1wb3J0IGNvbmN1cnJlbnQiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8ICJhbGxfc3RydWN0cyA9IFtdIiA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlKHRzZXJ2aWNlKTsKKworICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKKyAgZl9zZXJ2aWNlXyA8PCAiZml4X3NwZWMoYWxsX3N0cnVjdHMpIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgImRlbCBhbGxfc3RydWN0cyIgPDwgZW5kbCA8PCBlbmRsOworICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8ICIjIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9weV90aHJpZnRfc3BlYyhmX3NlcnZpY2VfLCB0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX3B5X2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICAgIH0KKyAgICBnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfcHlfdGhyaWZ0X3NwZWMoZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfaWYgPSAiKCIgKyBleHRlbmRzICsgIi5JZmFjZSkiOworICB9IGVsc2UgeworICAgIGlmIChnZW5fem9wZV9pbnRlcmZhY2VfKSB7CisgICAgICBleHRlbmRzX2lmID0gIihJbnRlcmZhY2UpIjsKKyAgICB9IGVsc2UgaWYgKGdlbl9uZXdzdHlsZV8gfHwgZ2VuX2R5bmFtaWNfIHx8IGdlbl90b3JuYWRvXykgeworICAgICAgZXh0ZW5kc19pZiA9ICIob2JqZWN0KSI7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGVuZGwgPDwgImNsYXNzIElmYWNlIiA8PCBleHRlbmRzX2lmIDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgaWYgKGZ1bmN0aW9ucy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUpIDw8ICI6IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKGZfc2VydmljZV8sICgqZl9pdGVyKSk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwYXNzIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBpZiAoZ2VuX3pvcGVfaW50ZXJmYWNlXykgeworICAgICAgZXh0ZW5kc19jbGllbnQgPSAiKCIgKyBleHRlbmRzICsgIi5DbGllbnQpIjsKKyAgICB9IGVsc2UgeworICAgICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5DbGllbnQsICI7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChnZW5fem9wZV9pbnRlcmZhY2VfICYmIChnZW5fbmV3c3R5bGVfIHx8IGdlbl9keW5hbWljXykpIHsKKyAgICAgIGV4dGVuZHNfY2xpZW50ID0gIihvYmplY3QpIjsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoZ2VuX3pvcGVfaW50ZXJmYWNlXykgeworICAgIGZfc2VydmljZV8gPDwgIkBpbXBsZW1lbnRlcihJZmFjZSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICJjbGFzcyBDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICI6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgImNsYXNzIENsaWVudCgiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICJJZmFjZSk6IiA8PCBlbmRsOworICB9CisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKworICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgorICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgb3Byb3RfZmFjdG9yeSk6IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJkZWYgX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBpcHJvdF9mYWN0b3J5LCBvcHJvdF9mYWN0b3J5PU5vbmUpOiIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWYgX19pbml0X18oc2VsZiwgaXByb3QsIG9wcm90PU5vbmUpOiIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2VsZi5fb3Byb3RfZmFjdG9yeSA9IG9wcm90X2ZhY3RvcnkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNlbGYuX3NlcWlkID0gMCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2VsZi5fcmVxcyA9IHt9IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNlbGYuX2lwcm90X2ZhY3RvcnkgPSBpcHJvdF9mYWN0b3J5IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZWxmLl9vcHJvdF9mYWN0b3J5ID0gKG9wcm90X2ZhY3RvcnkgaWYgb3Byb3RfZmFjdG9yeSBpcyBub3QgTm9uZSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlwcm90X2ZhY3RvcnkpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZWxmLl9zZXFpZCA9IDAiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNlbGYuX3JlcXMgPSB7fSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2VsZi5fdHJhbnNwb3J0LmlvX2xvb3Auc3Bhd25fY2FsbGJhY2soc2VsZi5fc3RhcnRfcmVjZWl2aW5nKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5faXByb3QgPSBzZWxmLl9vcHJvdCA9IGlwcm90IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiBvcHJvdCBpcyBub3QgTm9uZToiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJzZWxmLl9vcHJvdCA9IG9wcm90IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZWxmLl9zZXFpZCA9IDAiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgZXh0ZW5kcworICAgICAgICAgICAgICAgICA8PCAiLkNsaWVudC5fX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIG9wcm90X2ZhY3RvcnkpIiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGV4dGVuZHMKKyAgICAgICAgICAgICAgICAgPDwgIi5DbGllbnQuX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBpcHJvdF9mYWN0b3J5LCBvcHJvdF9mYWN0b3J5KSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBleHRlbmRzIDw8ICIuQ2xpZW50Ll9faW5pdF9fKHNlbGYsIGlwcm90LCBvcHJvdCkiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKGdlbl90b3JuYWRvXyAmJiBleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwKKyAgICAgIGluZGVudCgpIDw8ICJAZ2VuLmVuZ2luZSIgPDwgZW5kbCA8PAorICAgICAgaW5kZW50KCkgPDwgImRlZiBfc3RhcnRfcmVjZWl2aW5nKHNlbGYpOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIndoaWxlIFRydWU6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeToiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiZnJhbWUgPSB5aWVsZCBzZWxmLl90cmFuc3BvcnQucmVhZEZyYW1lKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uIGFzIGU6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImZvciBmdXR1cmUgaW4gc2VsZi5fcmVxcy52YWx1ZXMoKToiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImZ1dHVyZS5zZXRfZXhjZXB0aW9uKGUpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInNlbGYuX3JlcXMgPSB7fSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4iIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0ciA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihmcmFtZSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpcHJvdCA9IHNlbGYuX2lwcm90X2ZhY3RvcnkuZ2V0UHJvdG9jb2wodHIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiKGZuYW1lLCBtdHlwZSwgcnNlcWlkKSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm1ldGhvZCA9IGdldGF0dHIoc2VsZiwgJ3JlY3ZfJyArIGZuYW1lKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImZ1dHVyZSA9IHNlbGYuX3JlcXMucG9wKHJzZXFpZCwgTm9uZSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiBub3QgZnV0dXJlOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICIjIGZ1dHVyZSBoYXMgYWxyZWFkeSBiZWVuIGRpc2NhcmRlZCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJjb250aW51ZSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeToiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmVzdWx0ID0gbWV0aG9kKGlwcm90LCBtdHlwZSwgcnNlcWlkKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImV4Y2VwdCBFeGNlcHRpb24gYXMgZToiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiZnV0dXJlLnNldF9leGNlcHRpb24oZSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJlbHNlOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJmdXR1cmUuc2V0X3Jlc3VsdChyZXN1bHQpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGZhbHNlKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKGZfc2VydmljZV8sICgqZl9pdGVyKSk7CisgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZXFpZCA9IHNlbGYuX3NlcWlkID0gc2VsZi5fc2VxaWQgKyAxIiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZWxmLl9yZXFzW3NlcWlkXSA9IGRlZmVyLkRlZmVycmVkKCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZCA9IGRlZmVyLm1heWJlRGVmZXJyZWQoc2VsZi5zZW5kXyIgPDwgZnVubmFtZTsKKworICAgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYuX3NlcWlkICs9IDEiIDw8IGVuZGw7CisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmdXR1cmUgPSBzZWxmLl9yZXFzW3NlbGYuX3NlcWlkXSA9IGNvbmN1cnJlbnQuRnV0dXJlKCkiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOworCisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZi5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7CisgICAgfQorCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgLy8gd2UgbmVlZCBhIGxlYWRpbmcgY29tbWEgaWYgdGhlcmUgYXJlIGFyZ3MsIHNpbmNlIGl0J3MgY2FsbGVkIGFzIG1heWJlRGVmZXJyZWQoZnVuY25hbWUsCisgICAgICAvLyBhcmcpCisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgICAgLy8gbm90aGluZy4gU2VlIHRoZSBuZXh0IGJsb2NrLgorICAgICAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gZnV0dXJlIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgICB9CisgICAgICAgIGZfc2VydmljZV8gPDwgInNlbGYucmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpIiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgLy8gVGhpcyBibG9jayBpbmplY3RzIHRoZSBib2R5IG9mIHRoZSBzZW5kXzw+IG1ldGhvZCBmb3IgdHdpc3RlZCAoYW5kIGEgY2IvZWIgcGFpcikKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkLmFkZENhbGxiYWNrcygiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FsbGJhY2s9c2VsZi5jYl9zZW5kXyIgPDwgZnVubmFtZSA8PCAiLCIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiY2FsbGJhY2tBcmdzPShzZXFpZCwpLCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZXJyYmFjaz1zZWxmLmViX3NlbmRfIgorICAgICAgICAgICAgICAgICA8PCBmdW5uYW1lIDw8ICIsIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJlcnJiYWNrQXJncz0oc2VxaWQsKSkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBkIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkZWYgY2Jfc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIihzZWxmLCBfLCBzZXFpZCk6IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpZiAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICAvLyBpZiBvbmUtd2F5LCBmaXJlIHRoZSBkZWZlcnJlZCAmIHJlbW92ZSBpdCBmcm9tIF9yZXFzCisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImQgPSBzZWxmLl9yZXFzLnBvcChzZXFpZCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCAiZC5jYWxsYmFjayhOb25lKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGQiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZi5fcmVxc1tzZXFpZF0iIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgICAvLyBhZGQgYW4gZXJyYmFjayB0byBmYWlsIHRoZSByZXF1ZXN0IGlmIHRoZSBjYWxsIHRvIHNlbmRfPD4gcmFpc2VkIGFuIGV4Y2VwdGlvbgorICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkZWYgZWJfc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIihzZWxmLCBmLCBzZXFpZCk6IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkID0gc2VsZi5fcmVxcy5wb3Aoc2VxaWQpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJkLmVycmJhY2soZikiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBkIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkZWYgc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgICAgc3RkOjpzdHJpbmcgbWVzc2FnZVR5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PTkVXQVkiIDogIlRNZXNzYWdlVHlwZS5DQUxMIjsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKKyAgICBpZiAoZ2VuX3R3aXN0ZWRfIHx8IGdlbl90b3JuYWRvXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3QgPSBzZWxmLl9vcHJvdF9mYWN0b3J5LmdldFByb3RvY29sKHNlbGYuX3RyYW5zcG9ydCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIgorICAgICAgICAgICAgICAgICA8PCBtZXNzYWdlVHlwZSA8PCAiLCBzZWxmLl9zZXFpZCkiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuX29wcm90LndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIgorICAgICAgICAgICAgICAgICA8PCBtZXNzYWdlVHlwZSA8PCAiLCBzZWxmLl9zZXFpZCkiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIigpIiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KKyAgICBpZiAoZ2VuX3R3aXN0ZWRfIHx8IGdlbl90b3JuYWRvXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShvcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIgorICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLndyaXRlKHNlbGYuX29wcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAic2VsZi5fb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgInNlbGYuX29wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAgIGlmIChnZW5fdHdpc3RlZF8gfHwgZ2VuX3Rvcm5hZG9fKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZiByZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIihzZWxmLCBpcHJvdCwgbXR5cGUsIHJzZXFpZCk6IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKyAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWYgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8ICI6IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIC8vIFRPRE8obWNzbGVlKTogVmFsaWRhdGUgbWVzc2FnZSByZXBseSBoZXJlLCBzZXEgaWRzIGV0Yy4KKworICAgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkID0gc2VsZi5fcmVxcy5wb3AocnNlcWlkKSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdCA9IHNlbGYuX2lwcm90IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgIihmbmFtZSwgbXR5cGUsIHJzZXFpZCkgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIG10eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT046IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAieCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIiA8PCBlbmRsOworCisgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJ4LnJlYWQoaXByb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIGQuZXJyYmFjayh4KSIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIigpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgInJlc3VsdC5yZWFkKGlwcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJ4LnJlYWQoaXByb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmFpc2UgeCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIigpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgInJlc3VsdC5yZWFkKGlwcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIHJlc3VsdC5zdWNjZXNzIGlzIG5vdCBOb25lOiIgPDwgZW5kbDsKKyAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4gZC5jYWxsYmFjayhyZXN1bHQuc3VjY2VzcykiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJldHVybiByZXN1bHQuc3VjY2VzcyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBjb25zdCBzdHJpbmcmIHhuYW1lID0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiByZXN1bHQuIiA8PCB4bmFtZSA8PCAiIGlzIG5vdCBOb25lOiIgPDwgZW5kbDsKKyAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4gZC5lcnJiYWNrKHJlc3VsdC4iIDw8IHhuYW1lIDw8ICIpIgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmFpc2UgcmVzdWx0LiIgPDwgeG5hbWUgPDwgIiIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGQuY2FsbGJhY2soTm9uZSkiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXworICAgICAgICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAicmV0dXJuIGQuZXJyYmFjayhUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCBcIiIKKyAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSkiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgPDwgInJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsIFwiIgorICAgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNvbW1hbmQgbGluZSB0b29sIGZvciBtYWtpbmcgcmVtb3RlIHJlcXVlc3RzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcmVtb3RlIGZvci4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZW1vdGUodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIC8vIEdldCBhbGwgZnVuY3Rpb24gZnJvbSBwYXJlbnRzCisgIHRfc2VydmljZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIHdoaWxlIChwYXJlbnQgIT0gTlVMTCkgeworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gcF9mdW5jdGlvbnMgPSBwYXJlbnQtPmdldF9mdW5jdGlvbnMoKTsKKyAgICBmdW5jdGlvbnMuaW5zZXJ0KGZ1bmN0aW9ucy5lbmQoKSwgcF9mdW5jdGlvbnMuYmVnaW4oKSwgcF9mdW5jdGlvbnMuZW5kKCkpOworICAgIHBhcmVudCA9IHBhcmVudC0+Z2V0X2V4dGVuZHMoKTsKKyAgfQorICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGZfcmVtb3RlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIi1yZW1vdGUiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfcmVtb3RlOworICBmX3JlbW90ZS5vcGVuKGZfcmVtb3RlX25hbWUuY19zdHIoKSk7CisKKyAgZl9yZW1vdGUgPDwKKyAgICAiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uIiA8PCBlbmRsIDw8CisgICAgcHlfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAorICAgICJpbXBvcnQgc3lzIiA8PCBlbmRsIDw8CisgICAgImltcG9ydCBwcHJpbnQiIDw8IGVuZGwgPDwKKyAgICAiaWYgc3lzLnZlcnNpb25faW5mb1swXSA+IDI6IiA8PCBlbmRsIDw8CisgICAgaW5kZW50X3N0cigpIDw8ICJmcm9tIHVybGxpYi5wYXJzZSBpbXBvcnQgdXJscGFyc2UiIDw8IGVuZGwgPDwKKyAgICAiZWxzZToiIDw8IGVuZGwgPDwKKyAgICBpbmRlbnRfc3RyKCkgPDwgImZyb20gdXJscGFyc2UgaW1wb3J0IHVybHBhcnNlIiA8PCBlbmRsIDw8CisgICAgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydCwgVFNvY2tldCwgVFNTTFNvY2tldCwgVEh0dHBDbGllbnQiIDw8IGVuZGwgPDwKKyAgICAiZnJvbSB0aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wiIDw8IGVuZGwgPDwKKyAgICBlbmRsOworCisgIGZfcmVtb3RlIDw8CisgICAgImZyb20gIiA8PCBtb2R1bGVfIDw8ICIgaW1wb3J0ICIgPDwgc2VydmljZV9uYW1lXyA8PCBlbmRsIDw8CisgICAgImZyb20gIiA8PCBtb2R1bGVfIDw8ICIudHR5cGVzIGltcG9ydCAqIiA8PCBlbmRsIDw8CisgICAgZW5kbDsKKworICBmX3JlbW90ZSA8PAorICAgICJpZiBsZW4oc3lzLmFyZ3YpIDw9IDEgb3Igc3lzLmFyZ3ZbMV0gPT0gJy0taGVscCc6IiA8PCBlbmRsIDw8CisgICAgaW5kZW50X3N0cigpIDw8ICJwcmludCgnJykiIDw8IGVuZGwgPDwKKyAgICBpbmRlbnRfc3RyKCkgPDwgInByaW50KCdVc2FnZTogJyArIHN5cy5hcmd2WzBdICsgJyBbLWggaG9zdFs6cG9ydF1dIFstdSB1cmxdIFstZltyYW1lZF1dIFstc1tzbF1dIFstbm92YWxpZGF0ZV0gWy1jYV9jZXJ0cyBjZXJ0c10gWy1rZXlmaWxlIGtleWZpbGVdIFstY2VydGZpbGUgY2VydGZpbGVdIGZ1bmN0aW9uIFthcmcxIFthcmcyLi4uXV0nKSIgPDwgZW5kbCA8PAorICAgIGluZGVudF9zdHIoKSA8PCAicHJpbnQoJycpIiA8PCBlbmRsIDw8CisgICAgaW5kZW50X3N0cigpIDw8ICJwcmludCgnRnVuY3Rpb25zOicpIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfcmVtb3RlIDw8IGluZGVudF9zdHIoKSA8PCAicHJpbnQoJyAgIiA8PCAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkgPDwgIiAiCisgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIG51bV9hcmdzID0gYXJncy5zaXplKCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBpID0gMDsgaSA8IG51bV9hcmdzOyArK2kpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9yZW1vdGUgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfcmVtb3RlIDw8IGFyZ3NbaV0tPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgIiAiIDw8IGFyZ3NbaV0tPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfcmVtb3RlIDw8ICIpJykiIDw8IGVuZGw7CisgIH0KKyAgZl9yZW1vdGUgPDwgaW5kZW50X3N0cigpIDw8ICJwcmludCgnJykiIDw8IGVuZGwgPDwgaW5kZW50X3N0cigpIDw8ICJzeXMuZXhpdCgwKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfcmVtb3RlIDw8ICJwcCA9IHBwcmludC5QcmV0dHlQcmludGVyKGluZGVudD0yKSIgPDwgZW5kbAorICAgICAgICAgICA8PCAiaG9zdCA9ICdsb2NhbGhvc3QnIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJwb3J0ID0gOTA5MCIgPDwgZW5kbAorICAgICAgICAgICA8PCAidXJpID0gJyciIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImZyYW1lZCA9IEZhbHNlIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJzc2wgPSBGYWxzZSIgPDwgZW5kbAorICAgICAgICAgICA8PCAidmFsaWRhdGUgPSBUcnVlIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJjYV9jZXJ0cyA9IE5vbmUiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImtleWZpbGUgPSBOb25lIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJjZXJ0ZmlsZSA9IE5vbmUiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImh0dHAgPSBGYWxzZSIgPDwgZW5kbAorICAgICAgICAgICA8PCAiYXJnaSA9IDEiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy1oJzoiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJwYXJ0cyA9IHN5cy5hcmd2W2FyZ2kgKyAxXS5zcGxpdCgnOicpIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaG9zdCA9IHBhcnRzWzBdIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaWYgbGVuKHBhcnRzKSA+IDE6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInBvcnQgPSBpbnQocGFydHNbMV0pIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiYXJnaSArPSAyIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctdSc6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAidXJsID0gdXJscGFyc2Uoc3lzLmFyZ3ZbYXJnaSArIDFdKSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgInBhcnRzID0gdXJsWzFdLnNwbGl0KCc6JykiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJob3N0ID0gcGFydHNbMF0iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJpZiBsZW4ocGFydHMpID4gMToiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8IGluZGVudF9zdHIoKSA8PCAicG9ydCA9IGludChwYXJ0c1sxXSkiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJlbHNlOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJwb3J0ID0gODAiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJ1cmkgPSB1cmxbMl0iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJpZiB1cmxbNF06IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInVyaSArPSAnPyVzJyAlIHVybFs0XSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImh0dHAgPSBUcnVlIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiYXJnaSArPSAyIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctZicgb3Igc3lzLmFyZ3ZbYXJnaV0gPT0gJy1mcmFtZWQnOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImZyYW1lZCA9IFRydWUiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJhcmdpICs9IDEiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy1zJyBvciBzeXMuYXJndlthcmdpXSA9PSAnLXNzbCc6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAic3NsID0gVHJ1ZSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImFyZ2kgKz0gMSIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJpZiBzeXMuYXJndlthcmdpXSA9PSAnLW5vdmFsaWRhdGUnOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgInZhbGlkYXRlID0gRmFsc2UiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJhcmdpICs9IDEiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy1jYV9jZXJ0cyc6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiY2FfY2VydHMgPSBzeXMuYXJndlthcmdpKzFdIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiYXJnaSArPSAyIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICcta2V5ZmlsZSc6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAia2V5ZmlsZSA9IHN5cy5hcmd2W2FyZ2krMV0iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJhcmdpICs9IDIiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy1jZXJ0ZmlsZSc6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiY2VydGZpbGUgPSBzeXMuYXJndlthcmdpKzFdIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiYXJnaSArPSAyIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImNtZCA9IHN5cy5hcmd2W2FyZ2ldIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJhcmdzID0gc3lzLmFyZ3ZbYXJnaSArIDE6XSIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJpZiBodHRwOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgInRyYW5zcG9ydCA9IFRIdHRwQ2xpZW50LlRIdHRwQ2xpZW50KGhvc3QsIHBvcnQsIHVyaSkiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImVsc2U6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaWYgc3NsOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJzb2NrZXQgPSBUU1NMU29ja2V0LlRTU0xTb2NrZXQoaG9zdCwgcG9ydCwgIgorICAgICAgICAgICAgICAidmFsaWRhdGU9dmFsaWRhdGUsIGNhX2NlcnRzPWNhX2NlcnRzLCBrZXlmaWxlPWtleWZpbGUsIGNlcnRmaWxlPWNlcnRmaWxlKSIKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImVsc2U6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInNvY2tldCA9IFRTb2NrZXQuVFNvY2tldChob3N0LCBwb3J0KSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImlmIGZyYW1lZDoiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8IGluZGVudF9zdHIoKSA8PCAidHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0KHNvY2tldCkiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJlbHNlOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJ0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJwcm90b2NvbCA9IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJjbGllbnQgPSAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIi5DbGllbnQocHJvdG9jb2wpIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJ0cmFuc3BvcnQub3BlbigpIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfcmVtb3RlIDw8ICJlbCI7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBudW1fYXJncyA9IGFyZ3Muc2l6ZSgpOworCisgICAgZl9yZW1vdGUgPDwgImlmIGNtZCA9PSAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIic6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiBsZW4oYXJncykgIT0gIiA8PCBudW1fYXJncyA8PCAiOiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicHJpbnQoJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgcmVxdWlyZXMgIiA8PCBudW1fYXJncworICAgICAgICAgICAgIDw8ICIgYXJncycpIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJzeXMuZXhpdCgxKSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJwcC5wcHJpbnQoY2xpZW50LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGJvb2wgZmlyc3RfYXJnID0gdHJ1ZTsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgeworICAgICAgaWYgKGZpcnN0X2FyZykKKyAgICAgICAgZmlyc3RfYXJnID0gZmFsc2U7CisgICAgICBlbHNlCisgICAgICAgIGZfcmVtb3RlIDw8ICIgIjsKKyAgICAgIGlmIChhcmdzW2ldLT5nZXRfdHlwZSgpLT5pc19zdHJpbmcoKSkgeworICAgICAgICBmX3JlbW90ZSA8PCAiYXJnc1siIDw8IGkgPDwgIl0sIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfcmVtb3RlIDw8ICJldmFsKGFyZ3NbIiA8PCBpIDw8ICJdKSwiOworICAgICAgfQorICAgIH0KKyAgICBmX3JlbW90ZSA8PCAiKSkiIDw8IGVuZGw7CisKKyAgICBmX3JlbW90ZSA8PCBlbmRsOworICB9CisKKyAgaWYgKGZ1bmN0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9yZW1vdGUgPDwgImVsc2U6IiA8PCBlbmRsOworICAgIGZfcmVtb3RlIDw8IGluZGVudF9zdHIoKSA8PCAicHJpbnQoJ1VucmVjb2duaXplZCBtZXRob2QgJXMnICUgY21kKSIgPDwgZW5kbDsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnRfc3RyKCkgPDwgInN5cy5leGl0KDEpIiA8PCBlbmRsOworICAgIGZfcmVtb3RlIDw8IGVuZGw7CisgIH0KKworICBmX3JlbW90ZSA8PCAidHJhbnNwb3J0LmNsb3NlKCkiIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCisgIGZfcmVtb3RlLmNsb3NlKCk7CisKKyNpZm5kZWYgX01TQ19WRVIKKworICAvLyBNYWtlIGZpbGUgZXhlY3V0YWJsZSwgbG92ZSB0aGF0IGJpdHdpc2UgT1IgYWN0aW9uCisgIGNobW9kKGZfcmVtb3RlX25hbWUuY19zdHIoKSwKKyAgICAgICAgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lYVVNSCisjaWZuZGVmIF9XSU4zMgorICAgICAgICB8IFNfSVJHUlAgfCBTX0lYR1JQIHwgU19JUk9USCB8IFNfSVhPVEgKKyNlbmRpZgorICAgICAgICApOworCisjZW5kaWYgLy8gX01TQ19WRVIKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5Qcm9jZXNzb3IsICI7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgaWYgKGdlbl96b3BlX2ludGVyZmFjZV8pIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJAaW1wbGVtZW50ZXIoSWZhY2UpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiY2xhc3MgUHJvY2Vzc29yKCIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIlRQcm9jZXNzb3IpOiIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJjbGFzcyBQcm9jZXNzb3IoIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiSWZhY2UsIFRQcm9jZXNzb3IpOiIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIF9faW5pdF9fKHNlbGYsIGhhbmRsZXIpOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpZiAoZ2VuX3pvcGVfaW50ZXJmYWNlXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5faGFuZGxlciA9IElmYWNlKGhhbmRsZXIpIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl9oYW5kbGVyID0gaGFuZGxlciIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl9wcm9jZXNzTWFwID0ge30iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaWYgKGdlbl96b3BlX2ludGVyZmFjZV8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgZXh0ZW5kcyA8PCAiLlByb2Nlc3Nvci5fX2luaXRfXyhzZWxmLCBJZmFjZShoYW5kbGVyKSkiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgZXh0ZW5kcyA8PCAiLlByb2Nlc3Nvci5fX2luaXRfXyhzZWxmLCBoYW5kbGVyKSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl9wcm9jZXNzTWFwW1wiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIl0gPSBQcm9jZXNzb3IucHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZiBwcm9jZXNzKHNlbGYsIGlwcm90LCBvcHJvdCk6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIobmFtZSwgdHlwZSwgc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOworCisgIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZQorCisgIC8vIEhPVDogZGljdGlvbmFyeSBmdW5jdGlvbiBsb29rdXAKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgbmFtZSBub3QgaW4gc2VsZi5fcHJvY2Vzc01hcDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdC5za2lwKFRUeXBlLlNUUlVDVCkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgInggPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlVOS05PV05fTUVUSE9ELCAnVW5rbm93biAiCisgICAgICAgICAgICAgICAgImZ1bmN0aW9uICVzJyAlIChuYW1lKSkiCisgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieC53cml0ZShvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKKworICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGRlZmVyLnN1Y2NlZWQoTm9uZSkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZWxzZToiIDw8IGVuZGw7CisKKyAgaWYgKGdlbl90d2lzdGVkXyB8fCBnZW5fdG9ybmFkb18pIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKQorICAgICAgICAgICAgICAgPDwgInJldHVybiBzZWxmLl9wcm9jZXNzTWFwW25hbWVdKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJzZWxmLl9wcm9jZXNzTWFwW25hbWVdKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpIgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIC8vIFJlYWQgZW5kIG9mIGFyZ3MgZmllbGQsIHRoZSBUX1NUT1AsIGFuZCB0aGUgc3RydWN0IGNsb3NlCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFRydWUiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgaWYgKGdlbl90b3JuYWRvXykgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIkBnZW4uY29yb3V0aW5lIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJkZWYgcHJvY2Vzc18iCisgICAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90KToiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgc2VxaWQsIGlwcm90LCBvcHJvdCk6IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIigpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIigpIiA8PCBlbmRsOworICB9CisKKyAgaWYgKGdlbl90d2lzdGVkXykgeworICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImQgPSBkZWZlci5tYXliZURlZmVycmVkKHNlbGYuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICIsICI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKKworICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkLmFkZEVycmJhY2soc2VsZi5oYW5kbGVfZXhjZXB0aW9uXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICIsIHNlcWlkKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZC5hZGRDYWxsYmFjayhzZWxmLndyaXRlX3Jlc3VsdHNfc3VjY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiLCByZXN1bHQsIHNlcWlkLCBvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImQuYWRkRXJyYmFjayhzZWxmLndyaXRlX3Jlc3VsdHNfZXhjZXB0aW9uXyIKKyAgICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIsIHJlc3VsdCwgc2VxaWQsIG9wcm90KSIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGQiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkZWYgaGFuZGxlX2V4Y2VwdGlvbl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgZXJyb3IsIHNlcWlkKToiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIHdyaXRlX3Jlc3VsdHNfc3VjY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgc3VjY2VzcywgcmVzdWx0LCBzZXFpZCwgb3Byb3QpOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuc3VjY2VzcyA9IHN1Y2Nlc3MiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImRlZiB3cml0ZV9yZXN1bHRzX2V4Y2VwdGlvbl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgZXJyb3IsIHJlc3VsdCwgc2VxaWQsIG9wcm90KToiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF91cCgpOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkiIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeToiIDw8IGVuZGw7CisKKyAgICAvLyBLaW5kYSBhYnN1cmQKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiZXJyb3IucmFpc2VFeGNlcHRpb24oKSIgPDwgZW5kbDsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGNvbnN0IHN0cmluZyYgeG5hbWUgPSAoKnhfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV4Y2VwdCAiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIgYXMgIiA8PCB4bmFtZQorICAgICAgICAgICAgICAgICAgIDw8ICI6IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgeG5hbWUgPDwgIiA9ICIgPDwgeG5hbWUgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0KKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmFpc2UiIDw8IGVuZGw7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFzIGV4OiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdUQXBwbGljYXRpb24gZXhjZXB0aW9uIGluIGhhbmRsZXInKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJlc3VsdCA9IGV4IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdVbmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiBoYW5kbGVyJykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHQgPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICInSW50ZXJuYWwgZXJyb3InKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiXCIsIG1zZ190eXBlLCBzZXFpZCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdFeGNlcHRpb24gaW4gb25ld2F5IGhhbmRsZXInKSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKworICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWSIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5OiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAieWllbGQgZ2VuLm1heWJlX2Z1dHVyZShzZWxmLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIpKSIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBjb25zdCBzdHJpbmcmIHhuYW1lID0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIGFzICIgPDwgeG5hbWUKKyAgICAgICAgICAgICAgICAgICA8PCAiOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmVzdWx0LiIgPDwgeG5hbWUgPDwgIiA9ICIgPDwgeG5hbWUgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmFpc2UiIDw8IGVuZGw7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFzIGV4OiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdUQXBwbGljYXRpb24gZXhjZXB0aW9uIGluIGhhbmRsZXInKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJlc3VsdCA9IGV4IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdVbmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiBoYW5kbGVyJykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHQgPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICInSW50ZXJuYWwgZXJyb3InKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignRXhjZXB0aW9uIGluIG9uZXdheSBoYW5kbGVyJykiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICJcIiwgbXNnX3R5cGUsIHNlcWlkKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICBpbmRlbnRfZG93bigpOworCisgIH0gZWxzZSB7IC8vIHB5CisgICAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucworICAgIC8vIEl0IGFsc28gY2F0Y2hlcyBhcmJpdHJhcnkgZXhjZXB0aW9ucyByYWlzZWQgYnkgaGFuZGxlciBtZXRob2QgdG8gcHJvcGFnYXRlIHRoZW0gdG8gdGhlIGNsaWVudAorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAic2VsZi5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZIiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgImV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb246IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIiA8PCBlbmRsOworCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBjb25zdCBzdHJpbmcmIHhuYW1lID0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIGFzICIgPDwgeG5hbWUKKyAgICAgICAgICAgICAgICAgICA8PCAiOiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZIiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCB4bmFtZSA8PCAiID0gIiA8PCB4bmFtZSA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfQorCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFzIGV4OiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdUQXBwbGljYXRpb24gZXhjZXB0aW9uIGluIGhhbmRsZXInKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJlc3VsdCA9IGV4IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdVbmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiBoYW5kbGVyJykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHQgPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICInSW50ZXJuYWwgZXJyb3InKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiXCIsIG1zZ190eXBlLCBzZXFpZCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdFeGNlcHRpb24gaW4gb25ld2F5IGhhbmRsZXInKSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgIGluZGVudF9kb3duKCk7CisgIH0KK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaXByb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCkiOworICAgICAgICB9IGVsc2UgaWYoIWdlbl91dGY4c3RyaW5nc18pIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBlbHNlIGlwcm90LnJlYWRTdHJpbmcoKSI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAicmVhZEJvb2woKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgInJlYWRJMzIoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAicmVhZEk2NCgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUHl0aG9uIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBjYWxsaW5nIHJlYWQoKQorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICBpZiAoaXNfaW1tdXRhYmxlKHRzdHJ1Y3QpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIi5yZWFkKGlwcm90KSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCkiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemUgYSBjb250YWluZXIgYnkgd3JpdGluZyBvdXQgdGhlIGhlYWRlciBmb2xsb3dlZCBieQorICogZGF0YSBhbmQgdGhlbiBhIGZvb3Rlci4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKKyAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKKyAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKKyAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKKworICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOworICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfaTgsIGt0eXBlKTsKKyAgdF9maWVsZCBmdnR5cGUoZ190eXBlX2k4LCB2dHlwZSk7CisgIHRfZmllbGQgZmV0eXBlKGdfdHlwZV9pOCwgZXR5cGUpOworCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0ge30iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIigiIDw8IGt0eXBlIDw8ICIsICIgPDwgdnR5cGUKKyAgICAgICAgPDwgIiwgIiA8PCBzaXplIDw8ICIpID0gaXByb3QucmVhZE1hcEJlZ2luKCkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gc2V0KCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIigiIDw8IGV0eXBlIDw8ICIsICIgPDwgc2l6ZQorICAgICAgICA8PCAiKSA9IGlwcm90LnJlYWRTZXRCZWdpbigpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBbXSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiKCIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplCisgICAgICAgIDw8ICIpID0gaXByb3QucmVhZExpc3RCZWdpbigpIiA8PCBlbmRsOworICB9CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwKKyAgICAiZm9yICIgPDwgaSA8PCAiIGluIHJhbmdlKCIgPDwgc2l6ZSA8PCAiKToiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCkiIDw8IGVuZGw7CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0dHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gVEZyb3plbkRpY3QoIiA8PCBwcmVmaXggPDwgIikiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCkiIDw8IGVuZGw7CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0dHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gZnJvemVuc2V0KCIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0dHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gdHVwbGUoIiA8PCBwcmVmaXggPDwgIikiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgZW5kbDsKK30KKworLyoqCisgKiBXcml0ZSBhIHNldCBlbGVtZW50CisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBXcml0ZSBhIGxpc3QgZWxlbWVudAorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYXBwZW5kKCIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICB9IGVsc2UgaWYgKCFnZW5fdXRmOHN0cmluZ3NfKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIikiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIuZW5jb2RlKCd1dGYtOCcpIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBlbHNlICIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUHl0aG9uIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgImxlbigiIDw8IHByZWZpeCA8PCAiKSkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKKyAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAiIDw8IGtpdGVyIDw8ICIsICIgPDwgdml0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiLml0ZW1zKCk6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEVuZCgpIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7CisKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdpdmVuIHN0cnVjdC4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3V0LCB0c3RydWN0LCB0c3RydWN0LCAiQXR0cmlidXRlcyIpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdpdmVuIGZ1bmN0aW9uLgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3V0LCB0ZnVuY3Rpb24sIHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIlBhcmFtZXRlcnMiKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBzdHJ1Y3Qgb3IgZnVuY3Rpb24uCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YmhlYWRlcikgeworICBib29sIGhhc19kb2MgPSBmYWxzZTsKKyAgc3RyaW5nc3RyZWFtIHNzOworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgaGFzX2RvYyA9IHRydWU7CisgICAgc3MgPDwgdGRvYy0+Z2V0X2RvYygpOworICB9CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaWYgKGhhc19kb2MpIHsKKyAgICAgIHNzIDw8IGVuZGw7CisgICAgfQorICAgIGhhc19kb2MgPSB0cnVlOworICAgIHNzIDw8IHN1YmhlYWRlciA8PCAiOlxuIjsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgc3MgPDwgIiAtICIgPDwgcC0+Z2V0X25hbWUoKTsKKyAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgc3MgPDwgIjogIiA8PCBwLT5nZXRfZG9jKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcyA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChoYXNfZG9jKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiXCJcIlwiXG4iLCAiIiwgc3Muc3RyKCksICJcIlwiXCJcbiIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2VuZXJpYyBvYmplY3QuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiXCJcIlwiXG4iLCAiIiwgdGRvYy0+Z2V0X2RvYygpLCAiXCJcIlwiXG4iKTsKKyAgfQorfQorCisvKioKKyAqIERlY2xhcmVzIGFuIGFyZ3VtZW50LCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKKyAqLworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpkZWNsYXJlX2FyZ3VtZW50KHRfZmllbGQqIHRmaWVsZCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVzdWx0OworICByZXN1bHQgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI9IjsKKyAgaWYgKHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgIHJlc3VsdCA8PCByZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSh0ZmllbGQpOworICB9IGVsc2UgeworICAgIHJlc3VsdCA8PCAiTm9uZSI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgZGVmYXVsdCB2YWx1ZSwgcmV0dXJucyBOb25lIG90aGVyd2lzZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAorICovCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OnJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKHRfZmllbGQqIHRmaWVsZCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIGlmICh0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICByZXR1cm4gcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOworICB9IGVsc2UgeworICAgIHJldHVybiAiTm9uZSI7CisgIH0KK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbnRlcmZhY2UpIHsKKyAgdmVjdG9yPHN0cmluZz4gcHJlOworICB2ZWN0b3I8c3RyaW5nPiBwb3N0OworICBzdHJpbmcgc2lnbmF0dXJlID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiOworCisgIGlmICghKGdlbl96b3BlX2ludGVyZmFjZV8gJiYgaW50ZXJmYWNlKSkgeworICAgIHByZS5wdXNoX2JhY2soInNlbGYiKTsKKyAgfQorCisgIHNpZ25hdHVyZSArPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgJnByZSwgJnBvc3QpICsgIikiOworICByZXR1cm4gc2lnbmF0dXJlOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgdmVjdG9yPHN0cmluZz4qIHByZSwgdmVjdG9yPHN0cmluZz4qIHBvc3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgdmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGlmIChwcmUpIHsKKyAgICBmb3IgKHNfaXRlciA9IHByZS0+YmVnaW4oKTsgc19pdGVyICE9IHByZS0+ZW5kKCk7ICsrc19pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSAiLCAiOworICAgICAgfQorICAgICAgcmVzdWx0ICs9ICpzX2l0ZXI7CisgICAgfQorICB9CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBpZiAocG9zdCkgeworICAgIGZvciAoc19pdGVyID0gcG9zdC0+YmVnaW4oKTsgc19pdGVyICE9IHBvc3QtPmVuZCgpOyArK3NfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCArPSAqc19pdGVyOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmICh0dHlwZS0+aXNfc2VydmljZSgpKSB7CisgICAgcmV0dXJuIGdldF9yZWFsX3B5X21vZHVsZShwcm9ncmFtLCBnZW5fdHdpc3RlZF8sIHBhY2thZ2VfcHJlZml4XykgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICByZXR1cm4gZ2V0X3JlYWxfcHlfbW9kdWxlKHByb2dyYW0sIGdlbl90d2lzdGVkXywgcGFja2FnZV9wcmVmaXhfKSArICIudHR5cGVzLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBQeXRob24gdHlvZQorICovCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqIFNlZSB0aGUgY29tbWVudCBpbnNpZGUgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24gZm9yIHdoYXQgdGhpcyBpcy4gKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6dHlwZV90b19zcGVjX2FyZ3ModF90eXBlKiB0dHlwZSkgeworICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICByZXR1cm4gICInQklOQVJZJyI7CisgIH0gZWxzZSBpZiAoZ2VuX3V0ZjhzdHJpbmdzXyAmJiB0dHlwZS0+aXNfYmFzZV90eXBlKCkKKyAgICAgICAgICAgICAmJiByZWludGVycHJldF9jYXN0PHRfYmFzZV90eXBlKj4odHR5cGUpLT5pc19zdHJpbmcoKSkgeworICAgIHJldHVybiAiJ1VURjgnIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAgIk5vbmUiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiWyIgKyB0eXBlX25hbWUodHR5cGUpICsgIiwgTm9uZV0iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiKCIgKyB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiCisgICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiCisgICAgICAgICAgICsgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpICsgIiwgIgorICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpICsgIiwgIgorICAgICAgICAgICArIChpc19pbW11dGFibGUodHR5cGUpID8gIlRydWUiIDogIkZhbHNlIikgKyAiKSI7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIigiICsgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIsICIKKyAgICAgICAgICAgKyB0eXBlX3RvX3NwZWNfYXJncygoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCAiCisgICAgICAgICAgICsgKGlzX2ltbXV0YWJsZSh0dHlwZSkgPyAiVHJ1ZSIgOiAiRmFsc2UiKSArICIpIjsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIigiICsgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCAiCisgICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIsICIKKyAgICAgICAgICAgKyAoaXNfaW1tdXRhYmxlKHR0eXBlKSA/ICJUcnVlIiA6ICJGYWxzZSIpICsgIikiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX3NwZWNfYXJnczogIiArIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIHB5LAorICAgICJQeXRob24iLAorICAgICIgICAgem9wZS5pbnRlcmZhY2U6ICBHZW5lcmF0ZSBjb2RlIGZvciB1c2Ugd2l0aCB6b3BlLmludGVyZmFjZS5cbiIKKyAgICAiICAgIHR3aXN0ZWQ6ICAgICAgICAgR2VuZXJhdGUgVHdpc3RlZC1mcmllbmRseSBSUEMgc2VydmljZXMuXG4iCisgICAgIiAgICB0b3JuYWRvOiAgICAgICAgIEdlbmVyYXRlIGNvZGUgZm9yIHVzZSB3aXRoIFRvcm5hZG8uXG4iCisgICAgIiAgICBub191dGY4c3RyaW5nczogIERvIG5vdCBFbmNvZGUvZGVjb2RlIHN0cmluZ3MgdXNpbmcgdXRmOCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuIEJhc2ljYWxseSBubyBlZmZlY3QgZm9yIFB5dGhvbiAzLlxuIgorICAgICIgICAgY29kaW5nPUNPRElORzogICBBZGQgZmlsZSBlbmNvZGluZyBkZWNsYXJlIGluIGdlbmVyYXRlZCBmaWxlLlxuIgorICAgICIgICAgc2xvdHM6ICAgICAgICAgICBHZW5lcmF0ZSBjb2RlIHVzaW5nIHNsb3RzIGZvciBpbnN0YW5jZSBtZW1iZXJzLlxuIgorICAgICIgICAgZHluYW1pYzogICAgICAgICBHZW5lcmF0ZSBkeW5hbWljIGNvZGUsIGxlc3MgY29kZSBnZW5lcmF0ZWQgYnV0IHNsb3dlci5cbiIKKyAgICAiICAgIGR5bmJhc2U9Q0xTICAgICAgRGVyaXZlIGdlbmVyYXRlZCBjbGFzc2VzIGZyb20gY2xhc3MgQ0xTIGluc3RlYWQgb2YgVEJhc2UuXG4iCisgICAgIiAgICBkeW5mcm96ZW49Q0xTICAgIERlcml2ZSBnZW5lcmF0ZWQgaW1tdXRhYmxlIGNsYXNzZXMgZnJvbSBjbGFzcyBDTFMgaW5zdGVhZCBvZiBURnJvemVuQmFzZS5cbiIKKyAgICAiICAgIGR5bmV4Yz1DTFMgICAgICAgRGVyaXZlIGdlbmVyYXRlZCBleGNlcHRpb25zIGZyb20gQ0xTIGluc3RlYWQgb2YgVEV4Y2VwdGlvbkJhc2UuXG4iCisgICAgIiAgICBkeW5pbXBvcnQ9J2Zyb20gZm9vLmJhciBpbXBvcnQgQ0xTJ1xuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBBZGQgYW4gaW1wb3J0IGxpbmUgdG8gZ2VuZXJhdGVkIGNvZGUgdG8gZmluZCB0aGUgZHluYmFzZSBjbGFzcy5cbiIKKyAgICAiICAgIHBhY2thZ2VfcHJlZml4PSd0b3AucGFja2FnZS4nXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIFBhY2thZ2UgcHJlZml4IGZvciBnZW5lcmF0ZWQgZmlsZXMuXG4iCisgICAgIiAgICBvbGRfc3R5bGU6ICAgICAgIERlcHJlY2F0ZWQuIEdlbmVyYXRlIG9sZC1zdHlsZSBjbGFzc2VzLlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlYTI0OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTI4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogQSBzdWJjbGFzcyBvZiBzdGQ6Om9mc3RyZWFtIHRoYXQgaW5jbHVkZXMgaW5kZW50aW5nIGZ1bmN0aW9uYWxpdHkuCisgKi8KK2NsYXNzIHRfcmJfb2ZzdHJlYW0gOiBwdWJsaWMgc3RkOjpvZnN0cmVhbSB7Citwcml2YXRlOgorICBpbnQgaW5kZW50XzsKKworcHVibGljOgorICB0X3JiX29mc3RyZWFtKCkgOiBzdGQ6Om9mc3RyZWFtKCksIGluZGVudF8oMCkge30KKyAgZXhwbGljaXQgdF9yYl9vZnN0cmVhbShjb25zdCBjaGFyKiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IGlvc19iYXNlOjpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGVudCA9IDApCisgICAgOiBzdGQ6Om9mc3RyZWFtKGZpbGVuYW1lLCBtb2RlKSwgaW5kZW50XyhpbmRlbnQpIHt9CisKKyAgdF9yYl9vZnN0cmVhbSYgaW5kZW50KCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50XzsgKytpKSB7CisgICAgICAqdGhpcyA8PCAiICAiOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2b2lkIGluZGVudF91cCgpIHsgaW5kZW50XysrOyB9CisgIHZvaWQgaW5kZW50X2Rvd24oKSB7IGluZGVudF8tLTsgfQorfTsKKworLyoqCisgKiBSdWJ5IGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9yYl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9yYl9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIHJlcXVpcmVfcnVieWdlbXNfID0gZmFsc2U7CisgICAgbmFtZXNwYWNlZF8gPSBmYWxzZTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJydWJ5Z2VtcyIpID09IDApIHsKKyAgICAgICAgcmVxdWlyZV9ydWJ5Z2Vtc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJuYW1lc3BhY2VkIikgPT0gMCkgeworICAgICAgICBuYW1lc3BhY2VkXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gcnVieToiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcmIiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbih0X3N0cnVjdCogdHVuaW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHRfcmJfb2ZzdHJlYW0mIHJlbmRlcl9jb25zdF92YWx1ZSh0X3JiX29mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfcmJfc3RydWN0X2RlY2xhcmF0aW9uKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9yYl9zdHJ1Y3QodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3JiX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcmJfdW5pb24odF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3JiX3VuaW9uX3ZhbGlkYXRvcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9yYl9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcmJfc2ltcGxlX2NvbnN0cnVjdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3JiX3NpbXBsZV9leGNlcHRpb25fY29uc3RydWN0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfY29uc3RhbnRzKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2NvbnN0cnVjdG9ycyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF9kZWZucyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF9kYXRhKHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogZmllbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCh0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9yZG9jKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyByYl9hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX3JlcXVpcmVfdGhyaWZ0KCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZShjb25zdCB0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZnVsbF90eXBlX25hbWUoY29uc3QgdF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgcmJfbmFtZXNwYWNlX3RvX3BhdGhfcHJlZml4KHN0ZDo6c3RyaW5nIHJiX25hbWVzcGFjZSk7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJ1YnlfbW9kdWxlcyhjb25zdCB0X3Byb2dyYW0qIHApIHsKKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInJiIik7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXM7CisgICAgaWYgKG5zLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBtb2R1bGVzOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nOjppdGVyYXRvciBwb3MgPSBucy5iZWdpbigpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzdGQ6OnN0cmluZzo6aXRlcmF0b3IgZGVsaW0gPSBzdGQ6OmZpbmQocG9zLCBucy5lbmQoKSwgJy4nKTsKKyAgICAgIG1vZHVsZXMucHVzaF9iYWNrKGNhcGl0YWxpemUoc3RkOjpzdHJpbmcocG9zLCBkZWxpbSkpKTsKKyAgICAgIHBvcyA9IGRlbGltOworICAgICAgaWYgKHBvcyA9PSBucy5lbmQoKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgICsrcG9zOworICAgIH0KKworICAgIHJldHVybiBtb2R1bGVzOworICB9CisKKyAgdm9pZCBiZWdpbl9uYW1lc3BhY2UodF9yYl9vZnN0cmVhbSYsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPik7CisgIHZvaWQgZW5kX25hbWVzcGFjZSh0X3JiX29mc3RyZWFtJiwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICB0X3JiX29mc3RyZWFtIGZfdHlwZXNfOworICB0X3JiX29mc3RyZWFtIGZfY29uc3RzXzsKKyAgdF9yYl9vZnN0cmVhbSBmX3NlcnZpY2VfOworCisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9kaXJfOworICBzdGQ6OnN0cmluZyByZXF1aXJlX3ByZWZpeF87CisKKyAgLyoqIElmIHRydWUsIGFkZCBhICJyZXF1aXJlICdydWJ5Z2VtcyciIGxpbmUgdG8gdGhlIHRvcCBvZiBlYWNoIGdlbi1yYiBmaWxlLiAqLworICBib29sIHJlcXVpcmVfcnVieWdlbXNfOworCisgIC8qKiBJZiB0cnVlLCBnZW5lcmF0ZSBmaWxlcyBpbiBpZGlvbWF0aWMgbmFtZXNwYWNlZCBkaXJlY3Rvcmllcy4gKi8KKyAgYm9vbCBuYW1lc3BhY2VkXzsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKTsKKworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworCisgIGlmIChuYW1lc3BhY2VkXykgeworICAgIHJlcXVpcmVfcHJlZml4XyA9IHJiX25hbWVzcGFjZV90b19wYXRoX3ByZWZpeChwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgicmIiKSk7CisKKyAgICBzdHJpbmcgZGlyID0gcmVxdWlyZV9wcmVmaXhfOworICAgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKworICAgIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi8iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBzdWJkaXIgPSBzdWJkaXIgKyBkaXIuc3Vic3RyKDAsIGxvYykgKyAiLyI7CisgICAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOworICAgIH0KKyAgfQorCisgIG5hbWVzcGFjZV9kaXJfID0gc3ViZGlyOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSArICJfdHlwZXMucmIiOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSArICJfY29uc3RhbnRzLnJiIjsKKyAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl90eXBlc18gPDwgcmJfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCByZW5kZXJfcmVxdWlyZV90aHJpZnQoKSA8PCByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOworICBiZWdpbl9uYW1lc3BhY2UoZl90eXBlc18sIHJ1YnlfbW9kdWxlcyhwcm9ncmFtXykpOworCisgIGZfY29uc3RzXyA8PCByYl9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IHJlbmRlcl9yZXF1aXJlX3RocmlmdCgpIDw8ICJyZXF1aXJlICciCisgICAgICAgICAgICA8PCByZXF1aXJlX3ByZWZpeF8gPDwgdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzJyIgPDwgZW5kbCA8PCBlbmRsOworICBiZWdpbl9uYW1lc3BhY2UoZl9jb25zdHNfLCBydWJ5X21vZHVsZXMocHJvZ3JhbV8pKTsKK30KKworLyoqCisgKiBSZW5kZXJzIHRoZSByZXF1aXJlIG9mIHRocmlmdCBpdHNlbGYsIGFuZCBwb3NzaWJseSBvZiB0aGUgcnVieWdlbXMgZGVwZW5kZW5jeS4KKyAqLworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpyZW5kZXJfcmVxdWlyZV90aHJpZnQoKSB7CisgIGlmIChyZXF1aXJlX3J1YnlnZW1zXykgeworICAgIHJldHVybiAicmVxdWlyZSAncnVieWdlbXMnXG5yZXF1aXJlICd0aHJpZnQnXG4iOworICB9IGVsc2UgeworICAgIHJldHVybiAicmVxdWlyZSAndGhyaWZ0J1xuIjsKKyAgfQorfQorCisvKioKKyAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KKyAqLworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIGlmIChuYW1lc3BhY2VkXykgeworICAgICAgdF9wcm9ncmFtKiBpbmNsdWRlZCA9IGluY2x1ZGVzW2ldOworICAgICAgc3RkOjpzdHJpbmcgaW5jbHVkZWRfcmVxdWlyZV9wcmVmaXgKKyAgICAgICAgICA9IHJiX25hbWVzcGFjZV90b19wYXRoX3ByZWZpeChpbmNsdWRlZC0+Z2V0X25hbWVzcGFjZSgicmIiKSk7CisgICAgICBzdGQ6OnN0cmluZyBpbmNsdWRlZF9uYW1lID0gaW5jbHVkZWQtPmdldF9uYW1lKCk7CisgICAgICByZXN1bHQgKz0gInJlcXVpcmUgJyIgKyBpbmNsdWRlZF9yZXF1aXJlX3ByZWZpeCArIHVuZGVyc2NvcmUoaW5jbHVkZWRfbmFtZSkgKyAiX3R5cGVzJ1xuIjsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICJyZXF1aXJlICciICsgdW5kZXJzY29yZShpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzJ1xuIjsKKyAgICB9CisgIH0KKyAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApIHsKKyAgICByZXN1bHQgKz0gIlxuIjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEF1dG9nZW4nZCBjb21tZW50CisgKi8KK3N0cmluZyB0X3JiX2dlbmVyYXRvcjo6cmJfYXV0b2dlbl9jb21tZW50KCkgeworICByZXR1cm4gc3RkOjpzdHJpbmcoIiNcbiIpICsgIiMgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICArICIjXG4iICsgIiMgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArICIjXG4iOworfQorCisvKioKKyAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcworICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIC8vIENsb3NlIHR5cGVzIGZpbGUKKyAgZW5kX25hbWVzcGFjZShmX3R5cGVzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7CisgIGVuZF9uYW1lc3BhY2UoZl9jb25zdHNfLCBydWJ5X21vZHVsZXMocHJvZ3JhbV8pKTsKKyAgZl90eXBlc18uY2xvc2UoKTsKKyAgZl9jb25zdHNfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBSdWJ5LCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBEb25lIHVzaW5nIGEgY2xhc3MgdG8gc2NvcGUKKyAqIHRoZSB2YWx1ZXMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgZl90eXBlc18uaW5kZW50KCkgPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgIGZfdHlwZXNfLmluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworCisgICAgLy8gUnVieSBjbGFzcyBjb25zdGFudHMgaGF2ZSB0byBiZSBjYXBpdGFsaXplZC4uLiBvbWcgaSBhbSBzbyBvbiB0aGUgZmVuY2UKKyAgICAvLyBhYm91dCBsYW5ndWFnZXMgc3RyaWN0bHkgZW5mb3JjaW5nIGNhcGl0YWxpemF0aW9uIHdoeSBjYW4ndCB3ZSBqdXN0IGFsbAorICAgIC8vIGFncmVlIGFuZCBwbGF5IG5pY2UuCisgICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisKKyAgICBnZW5lcmF0ZV9yZG9jKGZfdHlwZXNfLCAqY19pdGVyKTsKKyAgICBmX3R5cGVzXy5pbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSAiIDw8IHZhbHVlIDw8IGVuZGw7CisgIH0KKworICAvLyBDcmVhdGUgYSBoYXNoIG1hcHBpbmcgdmFsdWVzIGJhY2sgdG8gdGhlaXIgbmFtZXMgKGFzIHN0cmluZ3MpIHNpbmNlIHJ1YnkgaGFzIG5vIG5hdGl2ZSBlbnVtCisgIC8vIHR5cGUKKyAgZl90eXBlc18uaW5kZW50KCkgPDwgIlZBTFVFX01BUCA9IHsiOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIC8vIFBvcHVsYXRlIHRoZSBoYXNoCisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpZiAoY19pdGVyICE9IGNvbnN0YW50cy5iZWdpbigpKQorICAgICAgZl90eXBlc18gPDwgIiwgIjsKKyAgICBmX3R5cGVzXyA8PCB2YWx1ZSA8PCAiID0+IFwiIiA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIlwiIjsKKyAgfQorICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbDsKKworICAvLyBDcmVhdGUgYSBzZXQgd2l0aCB2YWxpZCB2YWx1ZXMgZm9yIHRoaXMgZW51bQorICBmX3R5cGVzXy5pbmRlbnQoKSA8PCAiVkFMSURfVkFMVUVTID0gU2V0Lm5ldyhbIjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAvLyBQb3B1bGF0ZSB0aGUgc2V0CisgICAgaWYgKGNfaXRlciAhPSBjb25zdGFudHMuYmVnaW4oKSkKKyAgICAgIGZfdHlwZXNfIDw8ICIsICI7CisgICAgZl90eXBlc18gPDwgY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICB9CisgIGZfdHlwZXNfIDw8ICJdKS5mcmVlemUiIDw8IGVuZGw7CisKKyAgZl90eXBlc18uaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKKworICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKKworICBmX2NvbnN0c18uaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gIjsKKyAgcmVuZGVyX2NvbnN0X3ZhbHVlKGZfY29uc3RzXywgdHlwZSwgdmFsdWUpIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCit0X3JiX29mc3RyZWFtJiB0X3JiX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAiJXFcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dC5pbmRlbnQoKSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8IGZ1bGxfdHlwZV9uYW1lKHR5cGUpIDw8ICIubmV3KHsiIDw8IGVuZGw7CisgICAgb3V0LmluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBvdXQuaW5kZW50KCk7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KSA8PCAiID0+ICI7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIG91dC5pbmRlbnRfZG93bigpOworICAgIG91dC5pbmRlbnQoKSA8PCAifSkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIG91dCA8PCAieyIgPDwgZW5kbDsKKyAgICBvdXQuaW5kZW50X3VwKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0LmluZGVudCgpOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwga3R5cGUsIHZfaXRlci0+Zmlyc3QpIDw8ICIgPT4gIjsKKyAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIG91dC5pbmRlbnRfZG93bigpOworICAgIG91dC5pbmRlbnQoKSA8PCAifSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgb3V0IDw8ICJTZXQubmV3KFsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiWyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0LmluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0LmluZGVudCgpOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZXR5cGUsICp2X2l0ZXIpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAiXSkiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQuaW5kZW50KCkgPDwgIl0iOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gb3V0OworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHJ1Ynkgc3RydWN0CisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIGdlbmVyYXRlX3JiX3VuaW9uKGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfcmJfc3RydWN0KGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7CisgIH0KK30KKworCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgImZvcndhcmQgZGVjbGFyYXRpb25zIiBmb3IgcnVieSBzdHJ1Y3RzLgorICogVGhlc2UgYXJlIHNpbXBseSBhIGRlY2xhcmF0aW9uIG9mIGVhY2ggY2xhc3Mgd2l0aCBwcm9wZXIgaW5oZXJpdGFuY2UuCisgKiBUaGUgcmVzdCBvZiB0aGUgc3RydWN0IGlzIHN0aWxsIGdlbmVyYXRlZCBpbiBnZW5lcmF0ZV9zdHJ1Y3QgYXMgaGFzCisgKiBhbHdheXMgYmVlbiB0aGUgY2FzZS4gVGhlc2UgZGVjbGFyYXRpb25zIGFsbG93IHRocmlmdCB0byBnZW5lcmF0ZSB2YWxpZAorICogcnVieSBpbiBjYXNlcyB3aGVyZSB0aHJpZnQgc3RydWN0cyByZWx5IG9uIHJlY3Vyc2l2ZSBkZWZpbml0aW9ucy4KKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9yYl9zdHJ1Y3RfZGVjbGFyYXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpOworfQorCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl9zdHJ1Y3RfZGVjbGFyYXRpb24odF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgb3V0LmluZGVudCgpIDw8ICJjbGFzcyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBvdXQgPDwgIiA8IDo6VGhyaWZ0OjpVbmlvbiI7CisgIH0KKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiIDwgOjpUaHJpZnQ6OkV4Y2VwdGlvbiI7CisgIH0KKyAgb3V0IDw8ICI7IGVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQorICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX3JiX3N0cnVjdChmX3R5cGVzXywgdHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBydWJ5IHN0cnVjdAorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl9zdHJ1Y3QodF9yYl9vZnN0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uID0gZmFsc2UpIHsKKyAgZ2VuZXJhdGVfcmRvYyhvdXQsIHRzdHJ1Y3QpOworICBvdXQuaW5kZW50KCkgPDwgImNsYXNzICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8ICIgPCA6OlRocmlmdDo6RXhjZXB0aW9uIjsKKyAgfQorICBvdXQgPDwgZW5kbDsKKworICBvdXQuaW5kZW50X3VwKCk7CisgIG91dC5pbmRlbnQoKSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6U3RydWN0LCA6OlRocmlmdDo6U3RydWN0X1VuaW9uIiA8PCBlbmRsOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBnZW5lcmF0ZV9yYl9zaW1wbGVfZXhjZXB0aW9uX2NvbnN0cnVjdG9yKG91dCwgdHN0cnVjdCk7CisgIH0KKworICBnZW5lcmF0ZV9maWVsZF9jb25zdGFudHMob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZmllbGRfZGVmbnMob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfcmJfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworCisgIG91dC5pbmRlbnQoKSA8PCAiOjpUaHJpZnQ6OlN0cnVjdC5nZW5lcmF0ZV9hY2Nlc3NvcnMgc2VsZiIgPDwgZW5kbDsKKworICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBydWJ5IHVuaW9uCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX3VuaW9uKHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24gPSBmYWxzZSkgeworICAodm9pZClpc19leGNlcHRpb247CisgIGdlbmVyYXRlX3Jkb2Mob3V0LCB0c3RydWN0KTsKKyAgb3V0LmluZGVudCgpIDw8ICJjbGFzcyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIDwgOjpUaHJpZnQ6OlVuaW9uIiA8PCBlbmRsOworCisgIG91dC5pbmRlbnRfdXAoKTsKKyAgb3V0LmluZGVudCgpIDw8ICJpbmNsdWRlIDo6VGhyaWZ0OjpTdHJ1Y3RfVW5pb24iIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZmllbGRfY29uc3RydWN0b3JzKG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfZmllbGRfY29uc3RhbnRzKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2ZpZWxkX2RlZm5zKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX3JiX3VuaW9uX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworCisgIG91dC5pbmRlbnQoKSA8PCAiOjpUaHJpZnQ6OlVuaW9uLmdlbmVyYXRlX2FjY2Vzc29ycyBzZWxmIiA8PCBlbmRsOworCisgIG91dC5pbmRlbnRfZG93bigpOworICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9jb25zdHJ1Y3RvcnModF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworCisgIG91dC5pbmRlbnQoKSA8PCAiY2xhc3MgPDwgc2VsZiIgPDwgZW5kbDsKKyAgb3V0LmluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmX2l0ZXIgIT0gZmllbGRzLmJlZ2luKCkpIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgb3V0LmluZGVudCgpIDw8ICJkZWYgIiA8PCBmaWVsZF9uYW1lIDw8ICIodmFsKSIgPDwgZW5kbDsKKyAgICBvdXQuaW5kZW50KCkgPDwgIiAgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIubmV3KDoiIDw8IGZpZWxkX25hbWUgPDwgIiwgdmFsKSIgPDwgZW5kbDsKKyAgICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgfQorCisgIG91dC5pbmRlbnRfZG93bigpOworICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKKworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfc2ltcGxlX2V4Y2VwdGlvbl9jb25zdHJ1Y3Rvcih0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIGlmIChtZW1iZXJzLnNpemUoKSA9PSAxKSB7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOworCisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfc3RyaW5nKCkpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgICBvdXQuaW5kZW50KCkgPDwgImRlZiBpbml0aWFsaXplKG1lc3NhZ2U9bmlsKSIgPDwgZW5kbDsKKyAgICAgIG91dC5pbmRlbnRfdXAoKTsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAic3VwZXIoKSIgPDwgZW5kbDsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAic2VsZi4iIDw8IG5hbWUgPDwgIiA9IG1lc3NhZ2UiIDw8IGVuZGw7CisgICAgICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIGlmIChuYW1lICE9ICJtZXNzYWdlIikgeworICAgICAgICBvdXQuaW5kZW50KCkgPDwgImRlZiBtZXNzYWdlOyAiIDw8IG5hbWUgPDwgIiBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfY29uc3RhbnRzKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfZmllbGRfbmFtZSA9IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSk7CisKKyAgICBvdXQuaW5kZW50KCkgPDwgY2FwX2ZpZWxkX25hbWUgPDwgIiA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGVmbnModF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0LmluZGVudCgpIDw8ICJGSUVMRFMgPSB7IiA8PCBlbmRsOworICBvdXQuaW5kZW50X3VwKCk7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZfaXRlciAhPSBmaWVsZHMuYmVnaW4oKSkgeworICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIGdlbmVyYXRlIHRoZSBmaWVsZCBkb2NzdHJpbmdzIHdpdGhpbiB0aGUgRklFTERTIGNvbnN0YW50LiBubyByZWFsIGJldHRlciBwbGFjZS4uLgorICAgIGdlbmVyYXRlX3Jkb2Mob3V0LCAqZl9pdGVyKTsKKworICAgIG91dC5pbmRlbnQoKSA8PCB1cGNhc2Vfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9PiAiOworCisgICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCk7CisgIH0KKyAgb3V0LmluZGVudF9kb3duKCk7CisgIG91dCA8PCBlbmRsOworICBvdXQuaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBvdXQuaW5kZW50KCkgPDwgImRlZiBzdHJ1Y3RfZmllbGRzOyBGSUVMRFM7IGVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9kYXRhKHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmllbGRfbmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiBmaWVsZF92YWx1ZSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWwgPSBmYWxzZSkgeworICBmaWVsZF90eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZF90eXBlKTsKKworICAvLyBCZWdpbiB0aGlzIGZpZWxkJ3MgZGVmbgorICBvdXQgPDwgIns6dHlwZSA9PiAiIDw8IHR5cGVfdG9fZW51bShmaWVsZF90eXBlKTsKKworICBpZiAoIWZpZWxkX25hbWUuZW1wdHkoKSkgeworICAgIG91dCA8PCAiLCA6bmFtZSA9PiAnIiA8PCBmaWVsZF9uYW1lIDw8ICInIjsKKyAgfQorCisgIGlmIChmaWVsZF92YWx1ZSAhPSBOVUxMKSB7CisgICAgb3V0IDw8ICIsIDpkZWZhdWx0ID0+ICI7CisgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZmllbGRfdHlwZSwgZmllbGRfdmFsdWUpOworICB9CisKKyAgaWYgKCFmaWVsZF90eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGlmIChmaWVsZF90eXBlLT5pc19zdHJ1Y3QoKSB8fCBmaWVsZF90eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBvdXQgPDwgIiwgOmNsYXNzID0+ICIgPDwgZnVsbF90eXBlX25hbWUoKHRfc3RydWN0KilmaWVsZF90eXBlKTsKKyAgICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUtPmlzX2xpc3QoKSkgeworICAgICAgb3V0IDw8ICIsIDplbGVtZW50ID0+ICI7CisgICAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwgKCh0X2xpc3QqKWZpZWxkX3R5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIH0gZWxzZSBpZiAoZmllbGRfdHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIG91dCA8PCAiLCA6a2V5ID0+ICI7CisgICAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwgKCh0X21hcCopZmllbGRfdHlwZSktPmdldF9rZXlfdHlwZSgpKTsKKyAgICAgIG91dCA8PCAiLCA6dmFsdWUgPT4gIjsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX2RhdGEob3V0LCAoKHRfbWFwKilmaWVsZF90eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOworICAgIH0gZWxzZSBpZiAoZmllbGRfdHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIG91dCA8PCAiLCA6ZWxlbWVudCA9PiAiOworICAgICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgodF9zZXQqKWZpZWxkX3R5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoKCh0X2Jhc2VfdHlwZSopZmllbGRfdHlwZSktPmlzX2JpbmFyeSgpKSB7CisgICAgICBvdXQgPDwgIiwgOmJpbmFyeSA9PiB0cnVlIjsKKyAgICB9CisgIH0KKworICBpZiAob3B0aW9uYWwpIHsKKyAgICBvdXQgPDwgIiwgOm9wdGlvbmFsID0+IHRydWUiOworICB9CisKKyAgaWYgKGZpZWxkX3R5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCAiLCA6ZW51bV9jbGFzcyA9PiAiIDw8IGZ1bGxfdHlwZV9uYW1lKGZpZWxkX3R5cGUpOworICB9CisKKyAgLy8gRW5kIG9mIHRoaXMgZmllbGQncyBkZWZuCisgIG91dCA8PCAifSI7Cit9CisKK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmJlZ2luX25hbWVzcGFjZSh0X3JiX29mc3RyZWFtJiBvdXQsIHZlY3RvcjxzdGQ6OnN0cmluZz4gbW9kdWxlcykgeworICBmb3IgKHZlY3RvcjxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIG1faXRlciA9IG1vZHVsZXMuYmVnaW4oKTsgbV9pdGVyICE9IG1vZHVsZXMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgb3V0LmluZGVudCgpIDw8ICJtb2R1bGUgIiA8PCAqbV9pdGVyIDw8IGVuZGw7CisgICAgb3V0LmluZGVudF91cCgpOworICB9Cit9CisKK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmVuZF9uYW1lc3BhY2UodF9yYl9vZnN0cmVhbSYgb3V0LCB2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXMpIHsKKyAgZm9yICh2ZWN0b3I8c3RkOjpzdHJpbmc+OjpyZXZlcnNlX2l0ZXJhdG9yIG1faXRlciA9IG1vZHVsZXMucmJlZ2luKCk7IG1faXRlciAhPSBtb2R1bGVzLnJlbmQoKTsKKyAgICAgICArK21faXRlcikgeworICAgIG91dC5pbmRlbnRfZG93bigpOworICAgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgdW5kZXJzY29yZShzZXJ2aWNlX25hbWVfKSArICIucmIiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCByYl9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IHJlbmRlcl9yZXF1aXJlX3RocmlmdCgpOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgaWYgKG5hbWVzcGFjZWRfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZXF1aXJlICciIDw8IHJiX25hbWVzcGFjZV90b19wYXRoX3ByZWZpeCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJyYiIpKQorICAgICAgICAgICAgICAgICA8PCB1bmRlcnNjb3JlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKSA8PCAiJyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAicmVxdWlyZSAnIiA8PCByZXF1aXJlX3ByZWZpeF8KKyAgICAgICAgICAgICAgICAgPDwgdW5kZXJzY29yZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgIiciIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCAicmVxdWlyZSAnIiA8PCByZXF1aXJlX3ByZWZpeF8gPDwgdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzJyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgYmVnaW5fbmFtZXNwYWNlKGZfc2VydmljZV8sIHJ1YnlfbW9kdWxlcyh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkpOworCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UgKHdlbGwsIHR3byBmb3Igbm93IGluIFBIUCkKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKworICBlbmRfbmFtZXNwYWNlKGZfc2VydmljZV8sIHJ1YnlfbW9kdWxlcyh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkpOworCisgIC8vIENsb3NlIHNlcnZpY2UgZmlsZQorICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiIyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfcmJfc3RydWN0KGZfc2VydmljZV8sIHRzKTsKKyAgICBnZW5lcmF0ZV9yYl9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorICBnZW5lcmF0ZV9yYl9zdHJ1Y3QoZl9zZXJ2aWNlXywgJnJlc3VsdCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBmdWxsX3R5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19jbGllbnQgPSAiIDwgIiArIGV4dGVuZHMgKyAiOjpDbGllbnQgIjsKKyAgfQorCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImNsYXNzIENsaWVudCIgPDwgZXh0ZW5kc19jbGllbnQgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKKworICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJpbmNsdWRlIDo6VGhyaWZ0OjpDbGllbnQiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworICAgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKTsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCkiIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZGVmIHNlbmRfIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfLmluZGVudF91cCgpOworCisgICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyIpOworICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2VTZW5kUHJvYyA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAic2VuZF9vbmV3YXlfbWVzc2FnZSIgOiAic2VuZF9tZXNzYWdlIjsKKworICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgbWVzc2FnZVNlbmRQcm9jIDw8ICIoJyIgPDwgZnVubmFtZSA8PCAiJywgIiA8PCBhcmdzbmFtZTsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsIDoiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT4gIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisKKyAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOworICAgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZGVmICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKKworICAgICAgLy8gVE9ETyhtY3NsZWUpOiBWYWxpZGF0ZSBtZXNzYWdlIHJlcGx5IGhlcmUsIHNlcSBpZHMgZXRjLgorCisgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyZXN1bHQgPSByZWNlaXZlX21lc3NhZ2UoIiA8PCByZXN1bHRuYW1lIDw8ICIpIiA8PCBlbmRsOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmV0dXJuIHJlc3VsdC5zdWNjZXNzIHVubGVzcyByZXN1bHQuc3VjY2Vzcy5uaWw/IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyYWlzZSByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiB1bmxlc3MgcmVzdWx0LiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIi5uaWw/IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyZXR1cm4iIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyYWlzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjo6VGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoOjpUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1JU1NJTkdfUkVTVUxULCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHQnKSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBmdWxsX3R5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIDwgIiArIGV4dGVuZHMgKyAiOjpQcm9jZXNzb3IgIjsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJjbGFzcyBQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8IGVuZGw7CisgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6UHJvY2Vzc29yIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImRlZiBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoc2VxaWQsIGlwcm90LCBvcHJvdCkiIDw8IGVuZGw7CisgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7CisKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiYXJncyA9IHJlYWRfYXJncyhpcHJvdCwgIiA8PCBhcmdzbmFtZSA8PCAiKSIgPDwgZW5kbDsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZSA8PCAiLm5ldygpIiA8PCBlbmRsOworICB9CisKKyAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucworICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfLmluZGVudF91cCgpOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8uaW5kZW50KCk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiQGhhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmVzY3VlICIgPDwgZnVsbF90eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiID0+ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgICAgIH0KKyAgICB9CisgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOworICB9CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyZXR1cm4iIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgIndyaXRlX3Jlc3VsdChyZXN1bHQsIG9wcm90LCAnIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsIHNlcWlkKSIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9yYl9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgLy8gVE9ETyhtY3NsZWUpOiBOaXRwaWNreSwgbm8gJywnIGlmIGFyZ3VtZW50X2xpc3QgaXMgZW1wdHkKKyAgcmV0dXJuIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgbGlzdAorICovCitzdHJpbmcgdF9yYl9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnR5cGVfbmFtZShjb25zdCB0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBwcmVmaXggPSAiIjsKKworICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOworICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBuYW1lID0gY2FwaXRhbGl6ZSh0dHlwZS0+Z2V0X25hbWUoKSk7CisgIH0KKworICByZXR1cm4gcHJlZml4ICsgbmFtZTsKK30KKworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpmdWxsX3R5cGVfbmFtZShjb25zdCB0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBwcmVmaXggPSAiOjoiOworICB2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXMgPSBydWJ5X21vZHVsZXModHR5cGUtPmdldF9wcm9ncmFtKCkpOworICBmb3IgKHZlY3RvcjxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIG1faXRlciA9IG1vZHVsZXMuYmVnaW4oKTsgbV9pdGVyICE9IG1vZHVsZXMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgcHJlZml4ICs9ICptX2l0ZXIgKyAiOjoiOworICB9CisgIHJldHVybiBwcmVmaXggKyB0eXBlX25hbWUodHR5cGUpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgUnVieSB0eW9lCisgKi8KK3N0cmluZyB0X3JiX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpTVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpCT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkJZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6STMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpJNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpJMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6U1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpNQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkxJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitzdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnJiX25hbWVzcGFjZV90b19wYXRoX3ByZWZpeChzdHJpbmcgcmJfbmFtZXNwYWNlKSB7CisgIHN0cmluZyBuYW1lc3BhY2VzX2xlZnQgPSByYl9uYW1lc3BhY2U7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKworICBzdHJpbmcgcGF0aF9wcmVmaXggPSAiIjsKKworICB3aGlsZSAoKGxvYyA9IG5hbWVzcGFjZXNfbGVmdC5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHBhdGhfcHJlZml4ID0gcGF0aF9wcmVmaXggKyB1bmRlcnNjb3JlKG5hbWVzcGFjZXNfbGVmdC5zdWJzdHIoMCwgbG9jKSkgKyAiLyI7CisgICAgbmFtZXNwYWNlc19sZWZ0ID0gbmFtZXNwYWNlc19sZWZ0LnN1YnN0cihsb2MgKyAxKTsKKyAgfQorICBpZiAobmFtZXNwYWNlc19sZWZ0LnNpemUoKSA+IDApIHsKKyAgICBwYXRoX3ByZWZpeCA9IHBhdGhfcHJlZml4ICsgdW5kZXJzY29yZShuYW1lc3BhY2VzX2xlZnQpICsgIi8iOworICB9CisgIHJldHVybiBwYXRoX3ByZWZpeDsKK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmRvYyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBvdXQuaW5kZW50KCk7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiIiwgIiMgIiwgdGRvYy0+Z2V0X2RvYygpLCAiIik7CisgIH0KK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dC5pbmRlbnQoKSA8PCAiZGVmIHZhbGlkYXRlIiA8PCBlbmRsOworICBvdXQuaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgb3V0LmluZGVudCgpIDw8ICJyYWlzZSA6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24ubmV3KDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTiwgIgorICAgICAgICAgICAgICAgICAgICAgICInUmVxdWlyZWQgZmllbGQgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIGlzIHVuc2V0IScpIjsKKyAgICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYm9vbCgpKSB7CisgICAgICAgIG91dCA8PCAiIGlmIEAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIubmlsPyI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIiB1bmxlc3MgQCIgPDwgZmllbGQtPmdldF9uYW1lKCk7CisgICAgICB9CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBpZiBmaWVsZCBpcyBhbiBlbnVtLCBjaGVjayB0aGF0IGl0cyB2YWx1ZSBpcyB2YWxpZAorICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworCisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAidW5sZXNzIEAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIubmlsPyB8fCAiCisgICAgICAgICAgICAgICAgICAgPDwgZnVsbF90eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8ICI6OlZBTElEX1ZBTFVFUy5pbmNsdWRlPyhAIgorICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsOworICAgICAgb3V0LmluZGVudF91cCgpOworICAgICAgb3V0LmluZGVudCgpIDw8ICJyYWlzZSA6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24ubmV3KDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTiwgIgorICAgICAgICAgICAgICAgICAgICAgICInSW52YWxpZCB2YWx1ZSBvZiBmaWVsZCAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIhJykiIDw8IGVuZGw7CisgICAgICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIG91dC5pbmRlbnRfZG93bigpOworICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl91bmlvbl92YWxpZGF0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQuaW5kZW50KCkgPDwgImRlZiB2YWxpZGF0ZSIgPDwgZW5kbDsKKyAgb3V0LmluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQuaW5kZW50KCkKKyAgICAgIDw8ICJyYWlzZShTdGFuZGFyZEVycm9yLCAnVW5pb24gZmllbGRzIGFyZSBub3Qgc2V0LicpIGlmIGdldF9zZXRfZmllbGQubmlsPyB8fCBnZXRfdmFsdWUubmlsPyIKKyAgICAgIDw8IGVuZGw7CisKKyAgLy8gaWYgZmllbGQgaXMgYW4gZW51bSwgY2hlY2sgdGhhdCBpdHMgdmFsdWUgaXMgdmFsaWQKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBjb25zdCB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQuaW5kZW50KCkgPDwgImlmIGdldF9zZXRfZmllbGQgPT0gOiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAiICByYWlzZSAiCisgICAgICAgICAgICAgICAgICAgICAgIjo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbi5uZXcoOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpVTktOT1dOLCAiCisgICAgICAgICAgICAgICAgICAgICAgIidJbnZhbGlkIHZhbHVlIG9mIGZpZWxkICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiEnKSB1bmxlc3MgIgorICAgICAgICAgICAgICAgICAgIDw8IGZ1bGxfdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiOjpWQUxJRF9WQUxVRVMuaW5jbHVkZT8oZ2V0X3ZhbHVlKSIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgb3V0LmluZGVudF9kb3duKCk7CisgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgcmIsCisgICAgIlJ1YnkiLAorICAgICIgICAgcnVieWdlbXM6ICAgICAgICBBZGQgYSBcInJlcXVpcmUgJ3J1YnlnZW1zJ1wiIGxpbmUgdG8gdGhlIHRvcCBvZiBlYWNoIGdlbmVyYXRlZCBmaWxlLlxuIgorICAgICIgICAgbmFtZXNwYWNlZDogICAgICBHZW5lcmF0ZSBmaWxlcyBpbiBpZGlvbWF0aWMgbmFtZXNwYWNlZCBkaXJlY3Rvcmllcy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JzX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcnNfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NDNkN2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JzX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDMzMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7Cit1c2luZyBzdGQ6OnNldDsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsKCJcbiIpOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCitzdGF0aWMgY29uc3Qgc3RyaW5nIFNFUlZJQ0VfUkVTVUxUX1ZBUklBQkxFKCJyZXN1bHRfdmFsdWUiKTsKK3N0YXRpYyBjb25zdCBzdHJpbmcgUkVTVUxUX1NUUlVDVF9TVUZGSVgoIlJlc3VsdCIpOworc3RhdGljIGNvbnN0IHN0cmluZyBSVVNUX1JFU0VSVkVEX1dPUkRTW10gPSB7CisgICJhYnN0cmFjdCIsICJhbGlnbm9mIiwgImFzIiwgImJlY29tZSIsCisgICJib3giLCAiYnJlYWsiLCAiY29uc3QiLCAiY29udGludWUiLAorICAiY3JhdGUiLCAiZG8iLCAiZWxzZSIsICJlbnVtIiwKKyAgImV4dGVybiIsICJmYWxzZSIsICJmaW5hbCIsICJmbiIsCisgICJmb3IiLCAiaWYiLCAiaW1wbCIsICJpbiIsCisgICJsZXQiLCAibG9vcCIsICJtYWNybyIsICJtYXRjaCIsCisgICJtb2QiLCAibW92ZSIsICJtdXQiLCAib2Zmc2V0b2YiLAorICAib3ZlcnJpZGUiLCAicHJpdiIsICJwcm9jIiwgInB1YiIsCisgICJwdXJlIiwgInJlZiIsICJyZXR1cm4iLCAiU2VsZiIsCisgICJzZWxmIiwgInNpemVvZiIsICJzdGF0aWMiLCAic3RydWN0IiwKKyAgInN1cGVyIiwgInRyYWl0IiwgInRydWUiLCAidHlwZSIsCisgICJ0eXBlb2YiLCAidW5zYWZlIiwgInVuc2l6ZWQiLCAidXNlIiwKKyAgInZpcnR1YWwiLCAid2hlcmUiLCAid2hpbGUiLCAieWllbGQiCit9OworY29uc3Qgc2V0PHN0cmluZz4gUlVTVF9SRVNFUlZFRF9XT1JEU19TRVQoCisgIFJVU1RfUkVTRVJWRURfV09SRFMsCisgIFJVU1RfUkVTRVJWRURfV09SRFMgKyBzaXplb2YoUlVTVF9SRVNFUlZFRF9XT1JEUykvc2l6ZW9mKFJVU1RfUkVTRVJWRURfV09SRFNbMF0pCispOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUygiPElQLCBPUD4iKTsKK3N0YXRpYyBjb25zdCBzdHJpbmcgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORFMoIndoZXJlIElQOiBUSW5wdXRQcm90b2NvbCwgT1A6IFRPdXRwdXRQcm90b2NvbCIpOworCisvLyBGSVhNRTogZXh0cmFjdCBjb21tb24gVE1lc3NhZ2VJZGVudGlmaWVyIGZ1bmN0aW9uCisvLyBGSVhNRTogaGF2ZSB0b19ydXN0X3R5cGUgZGVhbCB3aXRoIE9wdGlvbgorCitjbGFzcyB0X3JzX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfcnNfZ2VuZXJhdG9yKAorICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYKKyAgKSA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICBnZW5fZGlyXyA9IGdldF9vdXRfZGlyKCk7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKK3ByaXZhdGU6CisgIC8vIHN0cnVjdCB0eXBlCisgIC8vIFRfUkVHVUxBUjogdXNlci1kZWZpbmVkIHN0cnVjdCBpbiB0aGUgSURMCisgIC8vIFRfQVJHUzogc3RydWN0IHVzZWQgdG8gaG9sZCBhbGwgc2VydmljZS1jYWxsIHBhcmFtZXRlcnMKKyAgLy8gVF9SRVNVTFQ6IHN0cnVjdCB1c2VkIHRvIGhvbGQgYWxsIHNlcnZpY2UtY2FsbCByZXR1cm5zIGFuZCBleGNlcHRpb25zCisgIC8vIFRfRVhDRVBUSU9OOiB1c2VyLWRlZmluZWQgZXhjZXB0aW9uIGluIHRoZSBJREwKKyAgZW51bSBlX3N0cnVjdF90eXBlIHsgVF9SRUdVTEFSLCBUX0FSR1MsIFRfUkVTVUxULCBUX0VYQ0VQVElPTiB9OworCisgIC8vIERpcmVjdG9yeSB0byB3aGljaCBnZW5lcmF0ZWQgY29kZSBpcyB3cml0dGVuLgorICBzdHJpbmcgZ2VuX2Rpcl87CisKKyAgLy8gRmlsZSB0byB3aGljaCBnZW5lcmF0ZWQgY29kZSBpcyB3cml0dGVuLgorICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZ2VuXzsKKworICAvLyBXcml0ZSB0aGUgY29tbW9uIGNvbXBpbGVyIGF0dHJpYnV0ZXMgYW5kIG1vZHVsZSBpbmNsdWRlcyB0byB0aGUgdG9wIG9mIHRoZSBhdXRvLWdlbmVyYXRlZCBmaWxlLgorICB2b2lkIHJlbmRlcl9hdHRyaWJ1dGVzX2FuZF9pbmNsdWRlcygpOworCisgIC8vIENyZWF0ZSB0aGUgY2xvc3VyZSBvZiBSdXN0IG1vZHVsZXMgcmVmZXJlbmNlZCBieSB0aGlzIHNlcnZpY2UuCisgIHZvaWQgY29tcHV0ZV9zZXJ2aWNlX3JlZmVyZW5jZWRfbW9kdWxlcyh0X3NlcnZpY2UgKnRzZXJ2aWNlLCBzZXQ8c3RyaW5nPiAmcmVmZXJlbmNlZF9tb2R1bGVzKTsKKworICAvLyBXcml0ZSB0aGUgcnVzdCByZXByZXNlbnRhdGlvbiBvZiBhbiBlbnVtLgorICB2b2lkIHJlbmRlcl9lbnVtX2RlZmluaXRpb24odF9lbnVtKiB0ZW51bSwgY29uc3Qgc3RyaW5nJiBlbnVtX25hbWUpOworCisgIC8vIFdyaXRlIHRoZSBpbXBsIGJsb2NrcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYWl0cyBuZWNlc3NhcnkgdG8gY29udmVydCBhbiBlbnVtIHRvL2Zyb20gYW4gaTMyLgorICB2b2lkIHJlbmRlcl9lbnVtX2NvbnZlcnNpb24odF9lbnVtKiB0ZW51bSwgY29uc3Qgc3RyaW5nJiBlbnVtX25hbWUpOworCisgIC8vIFdyaXRlIHRoZSBpbXBsIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgcnVzdCByZXByZXNlbnRhdGlvbiBvZiBhbiBlbnVtLiBUaGlzIGluY2x1ZGVzIG1ldGhvZHMKKyAgLy8gdG8gd3JpdGUgdGhlIGVudW0gdG8gYSBwcm90b2NvbCwgcmVhZCBpdCBmcm9tIGEgcHJvdG9jb2wsIGV0Yy4KKyAgdm9pZCByZW5kZXJfZW51bV9pbXBsKGNvbnN0IHN0cmluZyYgZW51bV9uYW1lKTsKKworICAvLyBXcml0ZSBhIHNpbXBsZSBydXN0IGNvbnN0IHZhbHVlIChpZS4gYHB1YiBjb25zdCBGT086IGZvby4uLmApLgorICB2b2lkIHJlbmRlcl9jb25zdF92YWx1ZShjb25zdCBzdHJpbmcmIG5hbWUsIHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7CisKKyAgLy8gV3JpdGUgYSBjb25zdGFudCBsaXN0LCBzZXQsIG1hcCBvciBzdHJ1Y3QuIFRoZXNlIGNvbnN0YW50cyByZXF1aXJlIGFsbG9jYXRpb24gYW5kIGNhbm5vdCBiZSBkZWZpbmVkCisgIC8vIHVzaW5nIGEgJ3B1YiBjb25zdCcuIEFzIGEgcmVzdWx0LCBJIGNyZWF0ZSBhIGhvbGRlciBzdHJ1Y3Qgd2l0aCBhIHNpbmdsZSBgY29uc3RfdmFsdWVgIG1ldGhvZCB0aGF0CisgIC8vIHJldHVybnMgdGhlIGluaXRpYWxpemVkIGluc3RhbmNlLgorICB2b2lkIHJlbmRlcl9jb25zdF92YWx1ZV9ob2xkZXIoY29uc3Qgc3RyaW5nJiBuYW1lLCB0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOworCisgIC8vIFdyaXRlIHRoZSBhY3R1YWwgY29uc3QgdmFsdWUgLSB0aGUgcmlnaHQgc2lkZSBvZiBhIGNvbnN0IGRlZmluaXRpb24uCisgIHZvaWQgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSwgYm9vbCBpc19vd25lZCA9IHRydWUpOworCisgIC8vIFdyaXRlIGEgY29uc3Qgc3RydWN0IChyZXR1cm5lZCBmcm9tIGBjb25zdF92YWx1ZWAgbWV0aG9kKS4KKyAgdm9pZCByZW5kZXJfY29uc3Rfc3RydWN0KHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7CisKKyAgLy8gV3JpdGUgYSBjb25zdCBsaXN0IChyZXR1cm5lZCBmcm9tIGBjb25zdF92YWx1ZWAgbWV0aG9kKS4KKyAgdm9pZCByZW5kZXJfY29uc3RfbGlzdCh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOworCisgIC8vIFdyaXRlIGEgY29uc3Qgc2V0IChyZXR1cm5lZCBmcm9tIGBjb25zdF92YWx1ZWAgbWV0aG9kKS4KKyAgdm9pZCByZW5kZXJfY29uc3Rfc2V0KHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7CisKKyAgLy8gV3JpdGUgYSBjb25zdCBtYXAgKHJldHVybmVkIGZyb20gYGNvbnN0X3ZhbHVlYCBtZXRob2QpLgorICB2b2lkIHJlbmRlcl9jb25zdF9tYXAodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKTsKKworICAvLyBXcml0ZSB0aGUgY29kZSB0byBpbnNlcnQgY29uc3RhbnQgdmFsdWVzIGludG8gYSBydXN0IHZlYyBvciBzZXQuIFRoZQorICAvLyBgaW5zZXJ0X2Z1bmN0aW9uYCBpcyB0aGUgcnVzdCBmdW5jdGlvbiB0aGF0IHdlJ2xsIHVzZSB0byBpbnNlcnQgdGhlIGVsZW1lbnRzLgorICB2b2lkIHJlbmRlcl9jb250YWluZXJfY29uc3RfdmFsdWUoCisgICAgY29uc3Qgc3RyaW5nJiBpbnNlcnRfZnVuY3Rpb24sCisgICAgdF90eXBlKiB0dHlwZSwKKyAgICB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUKKyAgKTsKKworICAvLyBXcml0ZSB0aGUgcnVzdCByZXByZXNlbnRhdGlvbiBvZiBhIHRocmlmdCBzdHJ1Y3QgdG8gdGhlIGdlbmVyYXRlZCBmaWxlLiBTZXQgYHN0cnVjdF90eXBlYCB0byBgVF9BUkdTYAorICAvLyBpZiByZW5kZXJpbmcgdGhlIHN0cnVjdCB1c2VkIHRvIHBhY2sgYXJndW1lbnRzIGZvciBhIHNlcnZpY2UgY2FsbC4gV2hlbiBgc3RydWN0X3R5cGVgIGlzIGBUX0FSR1NgIHRoZQorICAvLyBzdHJ1Y3QgYW5kIGl0cyBtZW1iZXJzIGhhdmUgbW9kdWxlIHZpc2liaWxpdHksIGFuZCBhbGwgZmllbGRzIGFyZSByZXF1aXJlZC4gV2hlbiBgc3RydWN0X3R5cGVgIGlzCisgIC8vIGFueXRoaW5nIGVsc2UgdGhlIHN0cnVjdCBhbmQgaXRzIG1lbWJlcnMgaGF2ZSBwdWJsaWMgdmlzaWJpbGl0eSBhbmQgZmllbGRzIGhhdmUgdGhlIHZpc2liaWxpdHkgc2V0CisgIC8vIGluIHRoZWlyIGRlZmluaXRpb24uCisgIHZvaWQgcmVuZGVyX3N0cnVjdChjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLCB0X3N0cnVjdCogdHN0cnVjdCwgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpOworCisgIC8vIFdyaXRlIHRoZSBjb21tZW50IGJsb2NrIHByZWNlZGluZyBhIHR5cGUgZGVmaW5pdGlvbiAoYW5kIGltcGxlbWVudGF0aW9uKS4KKyAgdm9pZCByZW5kZXJfdHlwZV9jb21tZW50KGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUpOworCisgIC8vIFdyaXRlIHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGEgdGhyaWZ0IHN0cnVjdC4gU3VwcG9ydHMgYXJndW1lbnQgc3RydWN0cywgcmVzdWx0IHN0cnVjdHMsCisgIC8vIHVzZXItZGVmaW5lZCBzdHJ1Y3RzIGFuZCBleGNlcHRpb24gc3RydWN0cy4gVGhlIGV4YWN0IHN0cnVjdCB0eXBlIHRvIGJlIGdlbmVyYXRlZCBpcyBjb250cm9sbGVkCisgIC8vIGJ5IHRoZSBgc3RydWN0X3R5cGVgIHBhcmFtZXRlciwgd2hpY2ggKGFtb25nIG90aGVyIHRoaW5ncykgbW9kaWZpZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlCisgIC8vIHdyaXR0ZW4gc3RydWN0IGFuZCBtZW1iZXJzLCBjb250cm9scyB3aGljaCB0cmFpdCBpbXBsZW1lbnRhdGlvbnMgYXJlIGdlbmVyYXRlZC4KKyAgdm9pZCByZW5kZXJfc3RydWN0X2RlZmluaXRpb24oCisgICAgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwKKyAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorICApOworCisgIC8vIFdyaXRlcyB0aGUgaW1wbCBibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYSBzdHJ1Y3QuIEF0IG1pbmltdW0gdGhpcworICAvLyBjb250YWlucyB0aGUgbWV0aG9kcyB0byByZWFkIGZyb20gYSBwcm90b2NvbCBhbmQgd3JpdGUgdG8gYSBwcm90b2NvbC4gQWRkaXRpb25hbCBtZXRob2RzIG1heQorICAvLyBiZSBnZW5lcmF0ZWQgZGVwZW5kaW5nIG9uIGBzdHJ1Y3RfdHlwZWAuCisgIHZvaWQgcmVuZGVyX3N0cnVjdF9pbXBsKAorICAgIGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsCisgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKyAgKTsKKworICAvLyBHZW5lcmF0ZSBhIGBmbiBuZXcoLi4uKWAgZm9yIGEgc3RydWN0IHdpdGggbmFtZSBgc3RydWN0X25hbWVgIGFuZCB0eXBlIGB0X3N0cnVjdGAuIFRoZSBhdXRvLWdlbmVyYXRlZAorICAvLyBjb2RlIG1heSBpbmNsdWRlIGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXJzIHRvIG1ha2UgdGhlIGNvbnN0cnVjdG9yIG1vcmUgZXJnb25vbWljLiBgc3RydWN0X3R5cGVgIGNvbnRyb2xzCisgIC8vIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBnZW5lcmF0ZWQgY29uc3RydWN0b3IuCisgIHZvaWQgcmVuZGVyX3N0cnVjdF9jb25zdHJ1Y3RvcigKKyAgICBjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLAorICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlCisgICk7CisKKyAgLy8gV3JpdGUgdGhlIGBva19vcmAgbWV0aG9kIGFkZGVkIHRvIGFsbCBUaHJpZnQgc2VydmljZSBjYWxsIHJlc3VsdCBzdHJ1Y3RzLiBZb3UgY2FuIHVzZSB0aGlzIG1ldGhvZAorICAvLyB0byBjb252ZXJ0IGEgc3RydWN0IGludG8gYSBgUmVzdWx0YCBhbmQgdXNlIGl0IGluIGEgYHRyeSFgIG9yIGNvbWJpbmF0b3IgY2hhaW4uCisgIHZvaWQgcmVuZGVyX3Jlc3VsdF9zdHJ1Y3RfdG9fcmVzdWx0X21ldGhvZCh0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLy8gV3JpdGUgdGhlIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIGBFcnJvcmAgYW5kIGBEZWJ1Z2AgdHJhaXRzLiBUaGVzZSB0cmFpdHMgYXJlIG5lY2Vzc2FyeSBmb3IgYQorICAvLyB1c2VyLWRlZmluZWQgZXhjZXB0aW9uIHRvIGJlIHByb3Blcmx5IGhhbmRsZWQgYXMgUnVzdCBlcnJvcnMuCisgIHZvaWQgcmVuZGVyX2V4Y2VwdGlvbl9zdHJ1Y3RfZXJyb3JfdHJhaXRfaW1wbHMoY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8vIFdyaXRlIHRoZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBgRGVmYXVsdGAuIFRoaXMgdHJhaXQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IG9ubHkgdGhlIGZpZWxkcyB5b3Ugd2FudAorICAvLyBhbmQgdXNlIGAuLkRlZmF1bHQ6OmRlZmF1bHQoKWAgdG8gZmlsbCBpbiB0aGUgcmVzdC4KKyAgdm9pZCByZW5kZXJfc3RydWN0X2RlZmF1bHRfdHJhaXRfaW1wbChjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLy8gV3JpdGUgdGhlIGZ1bmN0aW9uIHRoYXQgc2VyaWFsaXplcyBhIHN0cnVjdCB0byBpdHMgd2lyZSByZXByZXNlbnRhdGlvbi4gSWYgYHN0cnVjdF90eXBlYCBpcyBgVF9BUkdTYAorICAvLyB0aGVuIGFsbCBmaWVsZHMgYXJlIGNvbnNpZGVyZWQgInJlcXVpcmVkIiwgaWYgbm90LCB0aGUgZGVmYXVsdCBvcHRpb25hbGl0eSBpcyB1c2VkLgorICB2b2lkIHJlbmRlcl9zdHJ1Y3Rfc3luY193cml0ZSh0X3N0cnVjdCAqdHN0cnVjdCwgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpOworCisgIC8vIEhlbHBlciBmdW5jdGlvbiB0aGF0IHNlcmlhbGl6ZXMgYSBzaW5nbGUgc3RydWN0IGZpZWxkIHRvIGl0cyB3aXJlIHJlcHJlc2VudGF0aW9uLiBVbnBhY2tzIHRoZQorICAvLyB2YXJpYWJsZSAoc2luY2UgaXQgbWF5IGJlIG9wdGlvbmFsKSBhbmQgc2VyaWFsaXplcyBhY2NvcmRpbmcgdG8gdGhlIG9wdGlvbmFsaXR5IHJ1bGVzIHJlcXVpcmVkIGJ5IGByZXFgLgorICAvLyBWYXJpYWJsZXMgaW4gYXV0by1nZW5lcmF0ZWQgY29kZSBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZS4gU2luY2UgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGluCisgIC8vIGNvbnRleHRzIHdoZXJlIHRoZSB2YXJpYWJsZSBpcyAqYWxyZWFkeSogYSByZWZlcmVuY2UgeW91IGNhbiBzZXQgYGZpZWxkX3Zhcl9pc19yZWZgIHRvIGB0cnVlYCB0byBhdm9pZAorICAvLyBnZW5lcmF0aW5nIGFuIGV4dHJhLCB1bm5lY2Vzc2FyeSBgJmAgdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBoYXZlIHRvIGF1dG9tYXRpY2FsbHkgZGVyZWZlcmVuY2UuCisgIHZvaWQgcmVuZGVyX3N0cnVjdF9maWVsZF9zeW5jX3dyaXRlKAorICAgIGNvbnN0IHN0cmluZyAmZmllbGRfdmFyLAorICAgIGJvb2wgZmllbGRfdmFyX2lzX3JlZiwKKyAgICB0X2ZpZWxkICp0ZmllbGQsCisgICAgdF9maWVsZDo6ZV9yZXEgcmVxKTsKKworICAvLyBXcml0ZSB0aGUgcnVzdCBmdW5jdGlvbiB0aGF0IHNlcmlhbGl6ZXMgYSBzaW5nbGUgdHlwZSAoaS5lLiBhIGkzMiBldGMuKSB0byBpdHMgd2lyZSByZXByZXNlbnRhdGlvbi4KKyAgLy8gVmFyaWFibGVzIGluIGF1dG8tZ2VuZXJhdGVkIGNvZGUgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuIFNpbmNlIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBpbgorICAvLyBjb250ZXh0cyB3aGVyZSB0aGUgdmFyaWFibGUgaXMgKmFscmVhZHkqIGEgcmVmZXJlbmNlIHlvdSBjYW4gc2V0IGB0eXBlX3Zhcl9pc19yZWZgIHRvIGB0cnVlYCB0byBhdm9pZAorICAvLyBnZW5lcmF0aW5nIGFuIGV4dHJhLCB1bm5lY2Vzc2FyeSBgJmAgdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBoYXZlIHRvIGF1dG9tYXRpY2FsbHkgZGVyZWZlcmVuY2UuCisgIHZvaWQgcmVuZGVyX3R5cGVfc3luY193cml0ZShjb25zdCBzdHJpbmcgJnR5cGVfdmFyLCBib29sIHR5cGVfdmFyX2lzX3JlZiwgdF90eXBlICp0dHlwZSk7CisKKyAgLy8gV3JpdGUgYSBsaXN0IHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wuIGBsaXN0X3ZhcmlhYmxlYCBpcyB0aGUgdmFyaWFibGUgY29udGFpbmluZyB0aGUgbGlzdAorICAvLyB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHByb3RvY29sLgorICAvLyBWYXJpYWJsZXMgaW4gYXV0by1nZW5lcmF0ZWQgY29kZSBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZS4gU2luY2UgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGluCisgIC8vIGNvbnRleHRzIHdoZXJlIHRoZSB2YXJpYWJsZSBpcyAqYWxyZWFkeSogYSByZWZlcmVuY2UgeW91IGNhbiBzZXQgYGxpc3RfdmFyX2lzX3JlZmAgdG8gYHRydWVgIHRvIGF2b2lkCisgIC8vIGdlbmVyYXRpbmcgYW4gZXh0cmEsIHVubmVjZXNzYXJ5IGAmYCB0aGF0IHRoZSBjb21waWxlciB3aWxsIGhhdmUgdG8gYXV0b21hdGljYWxseSBkZXJlZmVyZW5jZS4KKyAgdm9pZCByZW5kZXJfbGlzdF9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmbGlzdF92YXIsIGJvb2wgbGlzdF92YXJfaXNfcmVmLCB0X2xpc3QgKnRsaXN0KTsKKworICAvLyBXcml0ZSBhIHNldCB0byB0aGUgb3V0cHV0IHByb3RvY29sLiBgc2V0X3ZhcmlhYmxlYCBpcyB0aGUgdmFyaWFibGUgY29udGFpbmluZyB0aGUgc2V0IHRoYXQgd2lsbAorICAvLyBiZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wuCisgIC8vIFZhcmlhYmxlcyBpbiBhdXRvLWdlbmVyYXRlZCBjb2RlIGFyZSBwYXNzZWQgYnkgcmVmZXJlbmNlLiBTaW5jZSB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgaW4KKyAgLy8gY29udGV4dHMgd2hlcmUgdGhlIHZhcmlhYmxlIGlzICphbHJlYWR5KiBhIHJlZmVyZW5jZSB5b3UgY2FuIHNldCBgc2V0X3Zhcl9pc19yZWZgIHRvIGB0cnVlYCB0byBhdm9pZAorICAvLyBnZW5lcmF0aW5nIGFuIGV4dHJhLCB1bm5lY2Vzc2FyeSBgJmAgdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBoYXZlIHRvIGF1dG9tYXRpY2FsbHkgZGVyZWZlcmVuY2UuCisgIHZvaWQgcmVuZGVyX3NldF9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmc2V0X3ZhciwgYm9vbCBzZXRfdmFyX2lzX3JlZiwgdF9zZXQgKnRzZXQpOworCisgIC8vIFdyaXRlIGEgbWFwIHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wuIGBtYXBfdmFyaWFibGVgIGlzIHRoZSB2YXJpYWJsZSBjb250YWluaW5nIHRoZSBtYXAgdGhhdCB3aWxsCisgIC8vIGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBwcm90b2NvbC4KKyAgLy8gVmFyaWFibGVzIGluIGF1dG8tZ2VuZXJhdGVkIGNvZGUgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuIFNpbmNlIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBpbgorICAvLyBjb250ZXh0cyB3aGVyZSB0aGUgdmFyaWFibGUgaXMgKmFscmVhZHkqIGEgcmVmZXJlbmNlIHlvdSBjYW4gc2V0IGBtYXBfdmFyX2lzX3JlZmAgdG8gYHRydWVgIHRvIGF2b2lkCisgIC8vIGdlbmVyYXRpbmcgYW4gZXh0cmEsIHVubmVjZXNzYXJ5IGAmYCB0aGF0IHRoZSBjb21waWxlciB3aWxsIGhhdmUgdG8gYXV0b21hdGljYWxseSBkZXJlZmVyZW5jZS4KKyAgdm9pZCByZW5kZXJfbWFwX3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZtYXBfdmFyLCBib29sIG1hcF92YXJfaXNfcmVmLCB0X21hcCAqdHNldCk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiB3ZSBuZWVkIHRvIGRlcmVmZXJlbmNlIHRocyB0eXBlIHdoZW4gd3JpdGluZyBhbiBlbGVtZW50IGZyb20gYSBjb250YWluZXIuCisgIC8vIEl0ZXJhdGlvbnMgb24gcnVzdCBjb250YWluZXJzIGFyZSBwZXJmb3JtZWQgYXMgZm9sbG93czogYGZvciB2IGluICZ2YWx1ZXMgeyAuLi4gfWAKKyAgLy8gd2hlcmUgYHZgIGhhcyB0eXBlIGAmUlVTVF9UWVBFYCBBbGwgZGVmaW5lZCBmdW5jdGlvbnMgdGFrZSBwcmltaXRpdmVzIGJ5IHZhbHVlLCBzbywgaWYgdGhlCisgIC8vIHJlbmRlcmVkIGNvZGUgaXMgY2FsbGluZyBzdWNoIGEgZnVuY3Rpb24gaXQgaGFzIHRvIGRlcmVmZXJlbmNlIGB2YC4KKyAgYm9vbCBuZWVkc19kZXJlZl9vbl9jb250YWluZXJfd3JpdGUodF90eXBlKiB0dHlwZSk7CisKKyAgLy8gUmV0dXJuIHRoZSB2YXJpYWJsZSAoaW5jbHVkaW5nIGFsbCBkZXJlZmVyZW5jZXMpIHJlcXVpcmVkIHRvIHdyaXRlIHZhbHVlcyBmcm9tIGEgcnVzdCBjb250YWluZXIKKyAgLy8gdG8gdGhlIG91dHB1dCBwcm90b2NvbC4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3ZXJlIGl0ZXJhdGluZyB0aHJvdWdoIGEgY29udGFpbmVyIGFuZCB1c2luZyB0aGUgdGVtcAorICAvLyB2YXJpYWJsZSBgdmAgdG8gcmVwcmVzZW50IGVhY2ggZWxlbWVudCwgdGhlbiBgdHR5cGVgIGlzIHRoZSB0eXBlIHN0b3JlZCBpbiB0aGUgY29udGFpbmVyIGFuZAorICAvLyBgYmFzZV92YXJgIGlzICJ2Ii4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgYWN0dWFsIHN0cmluZyB5b3Ugd2lsbCBoYXZlIHRvIHVzZSB0byBwcm9wZXJseSByZWZlcmVuY2UKKyAgLy8gdGhlIHRlbXAgdmFyaWFibGUgZm9yIHdyaXRpbmcgdG8gdGhlIG91dHB1dCBwcm90b2NvbC4KKyAgc3RyaW5nIHN0cmluZ19jb250YWluZXJfd3JpdGVfdmFyaWFibGUodF90eXBlKiB0dHlwZSwgY29uc3Qgc3RyaW5nJiBiYXNlX3Zhcik7CisKKyAgLy8gV3JpdGUgdGhlIGNvZGUgdG8gcmVhZCBieXRlcyBmcm9tIHRoZSB3aXJlIGludG8gdGhlIGdpdmVuIGB0X3N0cnVjdGAuIGBzdHJ1Y3RfbmFtZWAgaXMgdGhlCisgIC8vIGFjdHVhbCBSdXN0IG5hbWUgb2YgdGhlIGB0X3N0cnVjdGAuIElmIGBzdHJ1Y3RfdHlwZWAgaXMgYFRfQVJHU2AgdGhlbiBhbGwgc3RydWN0IGZpZWxkcyBhcmUKKyAgLy8gbmVjZXNzYXJ5LiBPdGhlcndpc2UsIHRoZSBmaWVsZCdzIGRlZmF1bHQgb3B0aW9uYWxpdHkgaXMgdXNlZC4KKyAgdm9pZCByZW5kZXJfc3RydWN0X3N5bmNfcmVhZChjb25zdCBzdHJpbmcgJnN0cnVjdF9uYW1lLCB0X3N0cnVjdCAqdHN0cnVjdCwgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpOworCisgIC8vIFdyaXRlIHRoZSBydXN0IGZ1bmN0aW9uIHRoYXQgZGVzZXJpYWxpemVzIGEgc2luZ2xlIHR5cGUgKGkuZS4gaTMyIGV0Yy4pIGZyb20gaXRzIHdpcmUgcmVwcmVzZW50YXRpb24uCisgIC8vIFNldCBgaXNfYm94ZWRgIHRvIGB0cnVlYCBpZiB0aGUgcmVzdWx0aW5nIHZhbHVlIHNob3VsZCBiZSB3cmFwcGVkIGluIGEgYEJveDo6bmV3KC4uLilgLgorICB2b2lkIHJlbmRlcl90eXBlX3N5bmNfcmVhZChjb25zdCBzdHJpbmcgJnR5cGVfdmFyLCB0X3R5cGUgKnR0eXBlLCBib29sIGlzX2JveGVkID0gZmFsc2UpOworCisgIC8vIFJlYWQgdGhlIHdpcmUgcmVwcmVzZW50YXRpb24gb2YgYSBsaXN0IGFuZCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nIHJ1c3QgaW1wbGVtZW50YXRpb24uCisgIC8vIFRoZSBkZXNlcmlhbGl6ZWQgbGlzdCBpcyBzdG9yZWQgaW4gYGxpc3RfdmFyaWFibGVgLgorICB2b2lkIHJlbmRlcl9saXN0X3N5bmNfcmVhZCh0X2xpc3QgKnRsaXN0LCBjb25zdCBzdHJpbmcgJmxpc3RfdmFyaWFibGUpOworCisgIC8vIFJlYWQgdGhlIHdpcmUgcmVwcmVzZW50YXRpb24gb2YgYSBzZXQgYW5kIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgcnVzdCBpbXBsZW1lbnRhdGlvbi4KKyAgLy8gVGhlIGRlc2VyaWFsaXplZCBzZXQgaXMgc3RvcmVkIGluIGBzZXRfdmFyaWFibGVgLgorICB2b2lkIHJlbmRlcl9zZXRfc3luY19yZWFkKHRfc2V0ICp0c2V0LCBjb25zdCBzdHJpbmcgJnNldF92YXJpYWJsZSk7CisKKyAgLy8gUmVhZCB0aGUgd2lyZSByZXByZXNlbnRhdGlvbiBvZiBhIG1hcCBhbmQgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZyBydXN0IGltcGxlbWVudGF0aW9uLgorICAvLyBUaGUgZGVzZXJpYWxpemVkIG1hcCBpcyBzdG9yZWQgaW4gYG1hcF92YXJpYWJsZWAuCisgIHZvaWQgcmVuZGVyX21hcF9zeW5jX3JlYWQodF9tYXAgKnRtYXAsIGNvbnN0IHN0cmluZyAmbWFwX3ZhcmlhYmxlKTsKKworICAvLyBSZXR1cm4gYSB0ZW1wb3JhcnkgdmFyaWFibGUgdXNlZCB0byBzdG9yZSB2YWx1ZXMgd2hlbiBkZXNlcmlhbGl6aW5nIG5lc3RlZCBjb250YWluZXJzLgorICBzdHJpbmcgc3RydWN0X2ZpZWxkX3JlYWRfdGVtcF92YXJpYWJsZSh0X2ZpZWxkKiB0ZmllbGQpOworCisgIC8vIFRvcC1sZXZlbCBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSB2YXJpb3VzIHJlbmRlciBmdW5jdGlvbnMgbmVjZXNzYXJ5IHRvIHdyaXRlIHRoZSBydXN0IHJlcHJlc2VudGF0aW9uCisgIC8vIG9mIGEgdGhyaWZ0IHVuaW9uIChpLmUuIGFuIGVudW0pLgorICB2b2lkIHJlbmRlcl91bmlvbih0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLy8gV3JpdGUgdGhlIGVudW0gY29ycmVzcG9uZGluZyB0byB0aGUgVGhyaWZ0IHVuaW9uLgorICB2b2lkIHJlbmRlcl91bmlvbl9kZWZpbml0aW9uKGNvbnN0IHN0cmluZyYgdW5pb25fbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8vIFdyaXRlIHRoZSBlbnVtIGltcGwgKHdpdGggcmVhZC93cml0ZSBmdW5jdGlvbnMpIGZvciB0aGUgVGhyaWZ0IHVuaW9uLgorICB2b2lkIHJlbmRlcl91bmlvbl9pbXBsKGNvbnN0IHN0cmluZyYgdW5pb25fbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8vIFdyaXRlIHRoZSBgRU5VTTo6d3JpdGVfdG9fb3V0X3Byb3RvY29sYCBmdW5jdGlvbi4KKyAgdm9pZCByZW5kZXJfdW5pb25fc3luY193cml0ZShjb25zdCBzdHJpbmcgJnVuaW9uX25hbWUsIHRfc3RydWN0ICp0c3RydWN0KTsKKworICAvLyBXcml0ZSB0aGUgYEVOVU06OnJlYWRfZnJvbV9pbl9wcm90b2NvbGAgZnVuY3Rpb24uCisgIHZvaWQgcmVuZGVyX3VuaW9uX3N5bmNfcmVhZChjb25zdCBzdHJpbmcgJnVuaW9uX25hbWUsIHRfc3RydWN0ICp0c3RydWN0KTsKKworICAvLyBUb3AtbGV2ZWwgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgdmFyaW91cyByZW5kZXIgZnVuY3Rpb25zIG5lY2Vzc2FyeSB0byB3cml0ZSB0aGUgcnVzdCByZXByZXNlbnRhdGlvbgorICAvLyBvZiBhIFRocmlmdCBjbGllbnQuCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8vIFdyaXRlIHRoZSB0cmFpdCB3aXRoIHRoZSBzZXJ2aWNlLWNhbGwgbWV0aG9kcyBmb3IgYHRzZXJ2aWNlYC4KKyAgdm9pZCByZW5kZXJfc3luY19jbGllbnRfdHJhaXQodF9zZXJ2aWNlICp0c2VydmljZSk7CisKKyAgLy8gV3JpdGUgdGhlIHRyYWl0IHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBjbGllbnQgaW1wbCBpZiBlbmQgdXNlcnMgY2FuIHVzZSBpdCB0byBtYWtlIHNlcnZpY2UgY2FsbHMuCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50X21hcmtlcl90cmFpdCh0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKKworICAvLyBXcml0ZSB0aGUgY29kZSB0byBjcmVhdGUgdGhlIFRocmlmdCBzZXJ2aWNlIHN5bmMgY2xpZW50IHN0cnVjdCBhbmQgaXRzIG1hdGNoaW5nICdpbXBsJyBibG9jay4KKyAgdm9pZCByZW5kZXJfc3luY19jbGllbnRfZGVmaW5pdGlvbl9hbmRfaW1wbChjb25zdCBzdHJpbmcmIGNsaWVudF9pbXBsX25hbWUpOworCisgIC8vIFdyaXRlIHRoZSBjb2RlIHRvIGNyZWF0ZSB0aGUgYFN5bmNDbGllbnQ6Om5ld2AgZnVuY3Rpb25zIGFzIHdlbGwgYXMgYW55IG90aGVyIGZ1bmN0aW9ucworICAvLyBjYWxsZXJzIHdvdWxkIGxpa2UgdG8gdXNlIG9uIHRoZSBUaHJpZnQgc2VydmljZSBzeW5jIGNsaWVudC4KKyAgdm9pZCByZW5kZXJfc3luY19jbGllbnRfbGlmZWN5Y2xlX2Z1bmN0aW9ucyhjb25zdCBzdHJpbmcmIGNsaWVudF9zdHJ1Y3QpOworCisgIC8vIFdyaXRlIHRoZSBjb2RlIHRvIGNyZWF0ZSB0aGUgaW1wbCBibG9jayBmb3IgdGhlIGBUVGhyaWZ0Q2xpZW50YCB0cmFpdC4gU2luY2UgZ2VuZXJhdGVkCisgIC8vIFJ1c3QgVGhyaWZ0IGNsaWVudHMgcGVyZm9ybSBhbGwgdGhlaXIgb3BlcmF0aW9ucyB1c2luZyBtZXRob2RzIGRlZmluZWQgaW4gdGhpcyB0cmFpdCwgd2UKKyAgLy8gaGF2ZSB0byBpbXBsZW1lbnQgaXQgZm9yIHRoZSBjbGllbnQgc3RydWN0cy4KKyAgdm9pZCByZW5kZXJfc3luY19jbGllbnRfdHRocmlmdGNsaWVudF9pbXBsKGNvbnN0IHN0cmluZyAmY2xpZW50X2ltcGxfbmFtZSk7CisKKyAgLy8gV3JpdGUgdGhlIG1hcmtlciB0cmFpdHMgZm9yIGFueSBzZXJ2aWNlKHMpIGJlaW5nIGV4dGVuZGVkLCBpbmNsdWRpbmcgdGhlIG9uZSBmb3IgdGhlIGN1cnJlbnQKKyAgLy8gc2VydmljZSBpdHNlbGYgKGkuZS4gYHRzZXJ2aWNlYCkKKyAgdm9pZCByZW5kZXJfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X2ltcGxzKHRfc2VydmljZSAqdHNlcnZpY2UsIGNvbnN0IHN0cmluZyAmaW1wbF9zdHJ1Y3RfbmFtZSk7CisKKyAgLy8gR2VuZXJhdGUgYSBsaXN0IG9mIGFsbCB0aGUgdHJhaXRzIHRoaXMgVGhyaWZ0IGNsaWVudCBzdHJ1Y3QgZXh0ZW5kcy4KKyAgc3RyaW5nIHN5bmNfY2xpZW50X21hcmtlcl90cmFpdHNfZm9yX2V4dGVuc2lvbih0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKKworICAvLyBUb3AtbGV2ZWwgZnVuY3Rpb24gdGhhdCB3cml0ZXMgdGhlIGNvZGUgdG8gbWFrZSB0aGUgVGhyaWZ0IHNlcnZpY2UgY2FsbHMuCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50X3Byb2Nlc3NfaW1wbCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvLyBXcml0ZSB0aGUgYWN0dWFsIGZ1bmN0aW9uIHRoYXQgY2FsbHMgb3V0IHRvIHRoZSByZW1vdGUgc2VydmljZSBhbmQgcHJvY2Vzc2VzIGl0cyByZXNwb25zZS4KKyAgdm9pZCByZW5kZXJfc3luY19zZW5kX3JlY3Zfd3JhcHBlcih0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgLy8gV3JpdGUgdGhlIGBzZW5kYCBmdW5jdGlvbmFsaXR5IGZvciBhIFRocmlmdCBzZXJ2aWNlIGNhbGwgcmVwcmVzZW50ZWQgYnkgYSBgdF9zZXJ2aWNlLT50X2Z1bmN0aW9uYC4KKyAgdm9pZCByZW5kZXJfc3luY19zZW5kKHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICAvLyBXcml0ZSB0aGUgYHJlY3ZgIGZ1bmN0aW9uYWxpdHkgZm9yIGEgVGhyaWZ0IHNlcnZpY2UgY2FsbCByZXByZXNlbnRlZCBieSBhIGB0X3NlcnZpY2UtPnRfZnVuY3Rpb25gLgorICAvLyBUaGlzIG1ldGhvZCBpcyBvbmx5IHJlbmRlcmVkIGlmIHRoZSBmdW5jdGlvbiBpcyAqbm90KiBvbmV3YXkuCisgIHZvaWQgcmVuZGVyX3N5bmNfcmVjdih0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgdm9pZCByZW5kZXJfc3luY19wcm9jZXNzb3IodF9zZXJ2aWNlICp0c2VydmljZSk7CisKKyAgdm9pZCByZW5kZXJfc3luY19oYW5kbGVyX3RyYWl0KHRfc2VydmljZSAqdHNlcnZpY2UpOworICB2b2lkIHJlbmRlcl9zeW5jX3Byb2Nlc3Nvcl9kZWZpbml0aW9uX2FuZF9pbXBsKHRfc2VydmljZSAqdHNlcnZpY2UpOworICB2b2lkIHJlbmRlcl9zeW5jX3Byb2Nlc3NfZGVsZWdhdGlvbl9mdW5jdGlvbnModF9zZXJ2aWNlICp0c2VydmljZSk7CisgIHZvaWQgcmVuZGVyX3N5bmNfcHJvY2Vzc19mdW5jdGlvbih0X2Z1bmN0aW9uICp0ZnVuYywgY29uc3Qgc3RyaW5nICZoYW5kbGVyX3R5cGUpOworICB2b2lkIHJlbmRlcl9wcm9jZXNzX21hdGNoX3N0YXRlbWVudHModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgcmVuZGVyX3N5bmNfaGFuZGxlcl9zdWNjZWVkZWQodF9mdW5jdGlvbiAqdGZ1bmMpOworICB2b2lkIHJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkKHRfZnVuY3Rpb24gKnRmdW5jKTsKKyAgdm9pZCByZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF91c2VyX2V4Y2VwdGlvbl9icmFuY2godF9mdW5jdGlvbiAqdGZ1bmMpOworICB2b2lkIHJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9icmFuY2godF9mdW5jdGlvbiAqdGZ1bmMsIGNvbnN0IHN0cmluZyAmYXBwX2Vycl92YXIpOworICB2b2lkIHJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX2RlZmF1bHRfZXhjZXB0aW9uX2JyYW5jaCh0X2Z1bmN0aW9uICp0ZnVuYyk7CisgIHZvaWQgcmVuZGVyX3N5bmNfaGFuZGxlcl9zZW5kX2V4Y2VwdGlvbl9yZXNwb25zZSh0X2Z1bmN0aW9uICp0ZnVuYywgY29uc3Qgc3RyaW5nICZlcnJfdmFyKTsKKyAgdm9pZCByZW5kZXJfc2VydmljZV9jYWxsX3N0cnVjdHModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgcmVuZGVyX3NlcnZpY2VfY2FsbF9hcmdzX3N0cnVjdCh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisgIHZvaWQgcmVuZGVyX3NlcnZpY2VfY2FsbF9yZXN1bHRfdmFsdWVfc3RydWN0KHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICBzdHJpbmcgaGFuZGxlcl9zdWNjZXNzZnVsX3JldHVybl9zdHJ1Y3QodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIC8vIFdyaXRlcyB0aGUgcmVzdWx0IG9mIGByZW5kZXJfdGhyaWZ0X2Vycm9yX3N0cnVjdGAgd3JhcHBlZCBpbiBhbiBgRXJyKHRocmlmdDo6RXJyb3IoLi4uKSlgLgorICB2b2lkIHJlbmRlcl90aHJpZnRfZXJyb3IoCisgICAgY29uc3Qgc3RyaW5nJiBlcnJvcl9raW5kLAorICAgIGNvbnN0IHN0cmluZyYgZXJyb3Jfc3RydWN0LAorICAgIGNvbnN0IHN0cmluZyYgc3ViX2Vycm9yX2tpbmQsCisgICAgY29uc3Qgc3RyaW5nJiBlcnJvcl9tZXNzYWdlCisgICk7CisKKyAgLy8gV3JpdGUgYSB0aHJpZnQ6OkVycm9yIHZhcmlhbnQgc3RydWN0LiBFcnJvciBzdHJ1Y3RzIHRha2UgdGhlIGZvcm06CisgIC8vIGBgYAorICAvLyBwdWIgc3RydWN0IGVycm9yX3N0cnVjdCB7CisgIC8vICAga2luZDogc3ViX2Vycm9yX2tpbmQsCisgIC8vICAgbWVzc2FnZTogZXJyb3JfbWVzc2FnZSwKKyAgLy8gfQorICAvLyBgYGAKKyAgLy8gQSBjb25jcmV0ZSBleGFtcGxlIGlzOgorICAvLyBgYGAKKyAgLy8gIHB1YiBzdHJ1Y3QgQXBwbGljYXRpb25FcnJvciB7CisgIC8vICAgIGtpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duLAorICAvLyAgICBtZXNzYWdlOiAiVGhpcyBpcyBzb21lIGVycm9yIG1lc3NhZ2UiLAorICAvLyAgfQorICAvLyBgYGAKKyAgdm9pZCByZW5kZXJfdGhyaWZ0X2Vycm9yX3N0cnVjdCgKKyAgICBjb25zdCBzdHJpbmcmIGVycm9yX3N0cnVjdCwKKyAgICBjb25zdCBzdHJpbmcmIHN1Yl9lcnJvcl9raW5kLAorICAgIGNvbnN0IHN0cmluZyYgZXJyb3JfbWVzc2FnZQorICApOworCisgIC8vIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGFsbCB0aGUgdW5wYWNrZWQgc2VydmljZSBjYWxsIGFyZ3MgZ2l2ZW4gYSBzZXJ2aWNlIGNhbGwgZnVuY3Rpb24KKyAgLy8gYHRfZnVuY3Rpb25gLiBQcmVwZW5kcyB0aGUgYXJncyB3aXRoIGVpdGhlciBgJm11dCBzZWxmYCBvciBgJnNlbGZgIGFuZCBpbmNsdWRlcyB0aGUgYXJnIHR5cGVzCisgIC8vIGluIHRoZSByZXR1cm5lZCBzdHJpbmcsIGZvciBleGFtcGxlOgorICAvLyBgZm4gZm9vKCZtdXQgc2VsZiwgZmllbGRfMDogU3RyaW5nKWAuCisgIHN0cmluZyBydXN0X3N5bmNfc2VydmljZV9jYWxsX2RlY2xhcmF0aW9uKHRfZnVuY3Rpb24qIHRmdW5jLCBib29sIHNlbGZfaXNfbXV0YWJsZSk7CisKKyAgLy8gUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIHRoZSB1bnBhY2tlZCBzZXJ2aWNlIGNhbGwgYXJncyBnaXZlbiBhIHNlcnZpY2UgY2FsbCBmdW5jdGlvbgorICAvLyBgdF9mdW5jdGlvbmAuIE9ubHkgaW5jbHVkZXMgdGhlIGFyZyBuYW1lcywgZWFjaCBvZiB3aGljaCBpcyBwcmVmaXhlZCB3aXRoIHRoZSBvcHRpb25hbCBwcmVmaXgKKyAgLy8gYGZpZWxkX3ByZWZpeGAsIGZvciBleGFtcGxlOiBgc2VsZi5maWVsZF8wYC4KKyAgc3RyaW5nIHJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfaW52b2NhdGlvbih0X2Z1bmN0aW9uKiB0ZnVuYywgY29uc3Qgc3RyaW5nJiBmaWVsZF9wcmVmaXggPSAiIik7CisKKyAgLy8gUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGZpZWxkcyBpbiB0aGUgc3RydWN0IGB0c3RydWN0YCBmb3IgdXNlIGluIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24uCisgIC8vIEVhY2ggZmllbGQgaXMgZm9sbG93ZWQgYnkgaXRzIHR5cGUsIGZvciBleGFtcGxlOiBgZmllbGRfMDogU3RyaW5nYC4KKyAgc3RyaW5nIHN0cnVjdF90b19kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCwgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpOworCisgIC8vIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGFsbCBmaWVsZHMgaW4gdGhlIHN0cnVjdCBgdHN0cnVjdGAgZm9yIHVzZSBpbiBhIGZ1bmN0aW9uIGNhbGwsCisgIC8vIGZvciBleGFtcGxlOiBgZmllbGRfMDogU3RyaW5nYC4KKyAgc3RyaW5nIHN0cnVjdF90b19pbnZvY2F0aW9uKHRfc3RydWN0KiB0c3RydWN0LCBjb25zdCBzdHJpbmcmIGZpZWxkX3ByZWZpeCA9ICIiKTsKKworICAvLyBXcml0ZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYSBzdHJ1Y3QsIHNlcnZpY2UtY2FsbCBvciBvdGhlciBkb2N1bWVudGF0aW9uLWFubm90YXRlZCBlbGVtZW50LgorICB2b2lkIHJlbmRlcl9ydXN0ZG9jKHRfZG9jKiB0ZG9jKTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIHRoZSB0cnVlIHR5cGUgb2YgYHR0eXBlYCBpcyBhIHRocmlmdCBkb3VibGUsIGBmYWxzZWAgb3RoZXJ3aXNlLgorICBib29sIGlzX2RvdWJsZSh0X3R5cGUqIHR0eXBlKTsKKworICAvLyBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBydXN0IHR5cGUgZ2l2ZW4gYSBgdF90eXBlYC4KKyAgc3RyaW5nIHRvX3J1c3RfdHlwZSh0X3R5cGUqIHR0eXBlLCBib29sIG9yZGVyZWRfZmxvYXQgPSB0cnVlKTsKKworICAvLyBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBgY29uc3RgIHJ1c3QgdHlwZSBnaXZlbiBhIGB0X3R5cGVgCisgIHN0cmluZyB0b19ydXN0X2NvbnN0X3R5cGUodF90eXBlKiB0dHlwZSwgYm9vbCBvcmRlcmVkX2Zsb2F0ID0gdHJ1ZSk7CisKKyAgLy8gUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcmlmdCBgcHJvdG9jb2w6OlRUeXBlYCBnaXZlbiBhIGB0X3R5cGVgLgorICBzdHJpbmcgdG9fcnVzdF9maWVsZF90eXBlX2VudW0odF90eXBlKiB0dHlwZSk7CisKKyAgLy8gUmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIHRvIGJlIHVzZWQgd2hlbiBpbml0aWFsaXppbmcgYSBzdHJ1Y3QgZmllbGQgd2hpY2ggaGFzIGBPUFRfSU5fUkVRX09VVGAKKyAgLy8gb3B0aW9uYWxpdHkuCisgIHN0cmluZyBvcHRfaW5fcmVxX291dF92YWx1ZSh0X3R5cGUqIHR0eXBlKTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIHdlIGNhbiB3cml0ZSBhIGNvbnN0IG9mIHRoZSBmb3JtIGBwdWIgY29uc3QgRk9POiAuLi5gLgorICBib29sIGNhbl9nZW5lcmF0ZV9zaW1wbGVfY29uc3QodF90eXBlKiB0dHlwZSk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiB3ZSBjYW5ub3Qgd3JpdGUgYSBzdGFuZGFyZCBSdXN0IGNvbnN0YW50IChiZWNhdXNlIHRoZSB0eXBlIG5lZWRzIHNvbWUgYWxsb2NhdGlvbikuCisgIGJvb2wgY2FuX2dlbmVyYXRlX2NvbnN0X2hvbGRlcih0X3R5cGUqIHR0eXBlKTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdHlwZSBpcyBhIHZvaWQsIGFuZCBzaG91bGQgYmUgcmVwcmVzZW50ZWQgYnkgdGhlIHJ1c3QgYCgpYCB0eXBlLgorICBib29sIGlzX3ZvaWQodF90eXBlKiB0dHlwZSk7CisKKyAgdF9maWVsZDo6ZV9yZXEgYWN0dWFsX2ZpZWxkX3JlcSh0X2ZpZWxkKiB0ZmllbGQsIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIHRoaXMgYHRfZmllbGQ6OmVfcmVxYCBpcyBlaXRoZXIgYHRfZmllbGQ6OlRfT1BUSU9OQUxgIG9yIGB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUYAorICAvLyBhbmQgbmVlZHMgdG8gYmUgd3JhcHBlZCBieSBhbiBgT3B0aW9uPFRZUEVfTkFNRT5gLCBgZmFsc2VgIG90aGVyd2lzZS4KKyAgYm9vbCBpc19vcHRpb25hbCh0X2ZpZWxkOjplX3JlcSByZXEpOworCisgIC8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIHNlcnZpY2UgY2FsbCBoYXMgYXJndW1lbnRzLCBgZmFsc2VgIG90aGVyd2lzZS4KKyAgYm9vbCBoYXNfYXJncyh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiBhIHNlcnZpY2UgY2FsbCBoYXMgbm9uLWAoKWAgYXJndW1lbnRzLCBgZmFsc2VgIG90aGVyd2lzZS4KKyAgYm9vbCBoYXNfbm9uX3ZvaWRfYXJncyh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgLy8gUmV0dXJuIGBwdWIgYCAobm90aWNlIHRyYWlsaW5nIHdoaXRlc3BhY2UhKSBpZiB0aGUgc3RydWN0IHNob3VsZCBiZSBwdWJsaWMsIGBgIChlbXB0eSBzdHJpbmcpIG90aGVyd2lzZS4KKyAgc3RyaW5nIHZpc2liaWxpdHlfcXVhbGlmaWVyKHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKTsKKworICAvLyBSZXR1cm5zIHRoZSBuYW1lc3BhY2UgcHJlZml4IGZvciBhIGdpdmVuIFRocmlmdCBzZXJ2aWNlLiBJZiB0aGUgdHlwZSBpcyBkZWZpbmVkIGluIHRoZSBwcmVzZW50bHktY29tcHV0ZWQKKyAgLy8gVGhyaWZ0IHByb2dyYW0sIHRoZW4gYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgorICBzdHJpbmcgcnVzdF9uYW1lc3BhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgLy8gUmV0dXJucyB0aGUgbmFtZXNwYWNlIHByZWZpeCBmb3IgYSBnaXZlbiBUaHJpZnQgdHlwZS4gSWYgdGhlIHR5cGUgaXMgZGVmaW5lZCBpbiB0aGUgcHJlc2VudGx5LWNvbXB1dGVkCisgIC8vIFRocmlmdCBwcm9ncmFtLCB0aGVuIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KKyAgc3RyaW5nIHJ1c3RfbmFtZXNwYWNlKHRfdHlwZSogdHR5cGUpOworCisgIC8vIFJldHVybnMgdGhlIGNhbWVsLWNhc2VkIG5hbWUgZm9yIGEgUnVzdCBzdHJ1Y3QgdHlwZS4gSGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBgdHN0cnVjdC0+Z2V0X25hbWUoKWAgaXMKKyAgLy8gYSByZXNlcnZlZCB3b3JkLgorICBzdHJpbmcgcnVzdF9zdHJ1Y3RfbmFtZSh0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLy8gUmV0dXJucyB0aGUgc25ha2UtY2FzZWQgbmFtZSBmb3IgYSBSdXN0IGZpZWxkIG9yIGxvY2FsIHZhcmlhYmxlLiBIYW5kbGVzIHRoZSBjYXNlIHdoZXJlCisgIC8vIGB0ZmllbGQtPmdldF9uYW1lKClgIGlzIGEgcmVzZXJ2ZWQgd29yZC4KKyAgc3RyaW5nIHJ1c3RfZmllbGRfbmFtZSh0X2ZpZWxkKiB0c3RydWN0KTsKKworICAvLyBSZXR1cm5zIHRoZSBjYW1lbC1jYXNlZCBuYW1lIGZvciBhIFJ1c3QgdW5pb24gdHlwZS4gSGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBgdHN0cnVjdC0+Z2V0X25hbWUoKWAgaXMKKyAgLy8gYSByZXNlcnZlZCB3b3JkLgorICBzdHJpbmcgcnVzdF91bmlvbl9maWVsZF9uYW1lKHRfZmllbGQqIHRzdHJ1Y3QpOworCisgIC8vIENvbnZlcnRzIGFueSB2YXJpYWJsZSBuYW1lIGludG8gYSAnc2FmZScgdmFyaWFudCB0aGF0IGRvZXMgbm90IGNsYXNoIHdpdGggYW55IFJ1c3QgcmVzZXJ2ZWQga2V5d29yZHMuCisgIHN0cmluZyBydXN0X3NhZmVfbmFtZShjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIG5hbWUgaXMgYSByZXNlcnZlZCBSdXN0IGtleXdvcmQsIGBmYWxzZWAgb3RoZXJ3aXNlLgorICBib29sIGlzX3Jlc2VydmVkKGNvbnN0IHN0cmluZyYgbmFtZSk7CisKKyAgLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0aGF0IHVzZXJzIHdpbGwgaW52b2tlIHRvIG1ha2Ugb3V0Z29pbmcgc2VydmljZSBjYWxscy4KKyAgc3RyaW5nIHNlcnZpY2VfY2FsbF9jbGllbnRfZnVuY3Rpb25fbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0aGF0IHVzZXJzIHdpbGwgaGF2ZSB0byBpbXBsZW1lbnQgdG8gaGFuZGxlIGluY29taW5nIHNlcnZpY2UgY2FsbHMuCisgIHN0cmluZyBzZXJ2aWNlX2NhbGxfaGFuZGxlcl9mdW5jdGlvbl9uYW1lKHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICAvLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHN0cnVjdCB1c2VkIHRvIHBhY2sgdGhlIGFyZ3VtZW50cyBmb3IgdGhlIHRocmlmdCBzZXJ2aWNlIGNhbGwuCisgIHN0cmluZyBzZXJ2aWNlX2NhbGxfYXJnc19zdHJ1Y3RfbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QgdXNlZCB0byBwYWNrIHRoZSByZXR1cm4gdmFsdWUKKyAgLy8gYW5kIHVzZXItZGVmaW5lZCBleGNlcHRpb25zIGZvciB0aGUgdGhyaWZ0IHNlcnZpY2UgY2FsbC4KKyAgc3RyaW5nIHNlcnZpY2VfY2FsbF9yZXN1bHRfc3RydWN0X25hbWUodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIHN0cmluZyBydXN0X3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8vIFJldHVybiB0aGUgdHJhaXQgbmFtZSBmb3IgdGhlIHN5bmMgc2VydmljZSBjbGllbnQgZ2l2ZW4gYSBgdF9zZXJ2aWNlYC4KKyAgc3RyaW5nIHJ1c3Rfc3luY19jbGllbnRfdHJhaXRfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvLyBSZXR1cm4gdGhlIG5hbWUgZm9yIHRoZSBzeW5jIHNlcnZpY2UgY2xpZW50IHN0cnVjdCBnaXZlbiBhIGB0X3NlcnZpY2VgLgorICBzdHJpbmcgcnVzdF9zeW5jX2NsaWVudF9pbXBsX25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgLy8gUmV0dXJuIHRoZSB0cmFpdCBuYW1lIHRoYXQgdXNlcnMgd2lsbCBoYXZlIHRvIGltcGxlbWVudCBmb3IgdGhlIHNlcnZlciBoYWxmIG9mIGEgVGhyaWZ0IHNlcnZpY2UuCisgIHN0cmluZyBydXN0X3N5bmNfaGFuZGxlcl90cmFpdF9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8vIFJldHVybiB0aGUgc3RydWN0IG5hbWUgZm9yIHRoZSAgc2VydmVyIGhhbGYgb2YgYSBUaHJpZnQgc2VydmljZS4KKyAgc3RyaW5nIHJ1c3Rfc3luY19wcm9jZXNzb3JfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvLyBSZXR1cm4gdGhlIHN0cnVjdCBuYW1lIGZvciB0aGUgc3RydWN0IHRoYXQgY29udGFpbnMgYWxsIHRoZSBzZXJ2aWNlLWNhbGwgaW1wbGVtZW50YXRpb25zIGZvcgorICAvLyB0aGUgc2VydmVyIGhhbGYgb2YgYSBUaHJpZnQgc2VydmljZS4KKyAgc3RyaW5nIHJ1c3Rfc3luY19wcm9jZXNzb3JfaW1wbF9uYW1lKHRfc2VydmljZSAqdHNlcnZpY2UpOworCisgIC8vIFJldHVybiB0aGUgdmFyaWFudCBuYW1lIGZvciBhbiBlbnVtIHZhcmlhbnQKKyAgc3RyaW5nIHJ1c3RfZW51bV92YXJpYW50X25hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKTsKKworICAvLyBQcm9wZXJseSB1cHBlcmNhc2UgbmFtZXMgZm9yIHVzZSBpbiBSdXN0LgorICBzdHJpbmcgcnVzdF91cHBlcl9jYXNlKGNvbnN0IHN0cmluZyYgbmFtZSk7CisKKyAgLy8gU25ha2UtY2FzZSBmaWVsZCwgcGFyYW1ldGVyIGFuZCBmdW5jdGlvbiBuYW1lcyBhbmQgbWFrZSB0aGVtIFJ1c3QgZnJpZW5kbHkuCisgIHN0cmluZyBydXN0X3NuYWtlX2Nhc2UoY29uc3Qgc3RyaW5nJiBuYW1lKTsKKworICAvLyBDYW1lbC1jYXNlIHR5cGUvdmFyaWFudCBuYW1lcyBhbmQgbWFrZSB0aGVtIFJ1c3QgZnJpZW5kbHkuCisgIHN0cmluZyBydXN0X2NhbWVsX2Nhc2UoY29uc3Qgc3RyaW5nJiBuYW1lKTsKKworICAvLyBSZXBsYWNlIGFsbCBpbnN0YW5jZXMgb2YgYHNlYXJjaF9zdHJpbmdgIHdpdGggYHJlcGxhY2Vfc3RyaW5nYCBpbiBgdGFyZ2V0YC4KKyAgdm9pZCBzdHJpbmdfcmVwbGFjZShzdHJpbmcmIHRhcmdldCwgY29uc3Qgc3RyaW5nJiBzZWFyY2hfc3RyaW5nLCBjb25zdCBzdHJpbmcmIHJlcGxhY2Vfc3RyaW5nKTsKK307CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBtYWtlIG91dHB1dCBkaXJlY3RvcnkgZm9yIHRoaXMgdGhyaWZ0IHByb2dyYW0KKyAgTUtESVIoZ2VuX2Rpcl8uY19zdHIoKSk7CisKKyAgLy8gY3JlYXRlIHRoZSBmaWxlIGludG8gd2hpY2ggd2UncmUgZ29pbmcgdG8gd3JpdGUgdGhlIGdlbmVyYXRlZCBjb2RlCisgIHN0cmluZyBmX2dlbl9uYW1lID0gZ2VuX2Rpcl8gKyAiLyIgKyBydXN0X3NuYWtlX2Nhc2UoZ2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSkgKyAiLnJzIjsKKyAgZl9nZW5fLm9wZW4oZl9nZW5fbmFtZS5jX3N0cigpKTsKKworICAvLyBoZWFkZXIgY29tbWVudAorICBmX2dlbl8gPDwgIi8vICIgPDwgYXV0b2dlbl9zdW1tYXJ5KCkgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICIvLyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HIiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICByZW5kZXJfYXR0cmlidXRlc19hbmRfaW5jbHVkZXMoKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2F0dHJpYnV0ZXNfYW5kX2luY2x1ZGVzKCkgeworICAvLyB0dXJuIG9mZiBzb21lIGNvbXBpbGVyL2NsaXBweSB3YXJuaW5ncworCisgIC8vIGNvZGUgYWx3YXlzIGluY2x1ZGVzIEJUcmVlTWFwL0JUcmVlU2V0L09yZGVyZWRGbG9hdAorICBmX2dlbl8gPDwgIiMhW2FsbG93KHVudXNlZF9pbXBvcnRzKV0iIDw8IGVuZGw7CisgIC8vIGNvZGUgbWlnaHQgbm90IGluY2x1ZGUgaW1wb3J0cyBmcm9tIGNyYXRlcworICBmX2dlbl8gPDwgIiMhW2FsbG93KHVudXNlZF9leHRlcm5fY3JhdGVzKV0iIDw8IGVuZGw7CisgIC8vIGNvbnN0cnVjdG9ycyB0YWtlICphbGwqIHN0cnVjdCBwYXJhbWV0ZXJzLCB3aGljaCBjYW4gdHJpZ2dlciB0aGUgInRvbyBtYW55IGFyZ3VtZW50cyIgd2FybmluZworICAvLyBzb21lIGF1dG8tZ2VuJ2QgdHlwZXMgY2FuIGJlIGRlZXBseSBuZXN0ZWQuIGNsaXBweSByZWNvbW1lbmRzIGZhY3RvcmluZyB0aGVtIG91dCB3aGljaCBpcyBoYXJkIHRvIGF1dG9nZW4KKyAgZl9nZW5fIDw8ICIjIVtjZmdfYXR0cihmZWF0dXJlID0gXCJjYXJnby1jbGlwcHlcIiwgYWxsb3codG9vX21hbnlfYXJndW1lbnRzLCB0eXBlX2NvbXBsZXhpdHkpKV0iIDw8IGVuZGw7CisgIC8vIHByZXZlbnQgcnVzdGZtdCBmcm9tIHJ1bm5pbmcgYWdhaW5zdCB0aGlzIGZpbGUKKyAgLy8gbGluZXMgYXJlIHRvbyBsb25nLCBjb2RlIGlzICh0aGFua2Z1bGx5ISkgbm90IHZpc3VhbC1pbmRlbnRlZCwgZXRjLgorICBmX2dlbl8gPDwgIiMhW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXRfc2tpcCldIiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICAvLyBhZGQgc3RhbmRhcmQgaW5jbHVkZXMKKyAgZl9nZW5fIDw8ICJleHRlcm4gY3JhdGUgb3JkZXJlZF9mbG9hdDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAiZXh0ZXJuIGNyYXRlIHRocmlmdDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAiZXh0ZXJuIGNyYXRlIHRyeV9mcm9tOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIG9yZGVyZWRfZmxvYXQ6Ok9yZGVyZWRGbG9hdDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHN0ZDo6Y2VsbDo6UmVmQ2VsbDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHN0ZDo6Y29sbGVjdGlvbnM6OntCVHJlZU1hcCwgQlRyZWVTZXR9OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2Ugc3RkOjpjb252ZXJ0OjpGcm9tOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2Ugc3RkOjpkZWZhdWx0OjpEZWZhdWx0OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2Ugc3RkOjplcnJvcjo6RXJyb3I7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBzdGQ6OmZtdDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHN0ZDo6Zm10Ojp7RGlzcGxheSwgRm9ybWF0dGVyfTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHN0ZDo6cmM6OlJjOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdHJ5X2Zyb206OlRyeUZyb207IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdGhyaWZ0Ojp7QXBwbGljYXRpb25FcnJvciwgQXBwbGljYXRpb25FcnJvcktpbmQsIFByb3RvY29sRXJyb3IsIFByb3RvY29sRXJyb3JLaW5kLCBUVGhyaWZ0Q2xpZW50fTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRocmlmdDo6cHJvdG9jb2w6OntURmllbGRJZGVudGlmaWVyLCBUTGlzdElkZW50aWZpZXIsIFRNYXBJZGVudGlmaWVyLCBUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZSwgVElucHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbCwgVFNldElkZW50aWZpZXIsIFRTdHJ1Y3RJZGVudGlmaWVyLCBUVHlwZX07IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0aHJpZnQ6OnByb3RvY29sOjpmaWVsZF9pZDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRocmlmdDo6cHJvdG9jb2w6OnZlcmlmeV9leHBlY3RlZF9tZXNzYWdlX3R5cGU7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0aHJpZnQ6OnByb3RvY29sOjp2ZXJpZnlfZXhwZWN0ZWRfc2VxdWVuY2VfbnVtYmVyOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6dmVyaWZ5X2V4cGVjdGVkX3NlcnZpY2VfY2FsbDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRocmlmdDo6cHJvdG9jb2w6OnZlcmlmeV9yZXF1aXJlZF9maWVsZF9leGlzdHM7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0aHJpZnQ6OnNlcnZlcjo6VFByb2Nlc3NvcjsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworCisgIC8vIGFkZCBhbGwgdGhlIHByb2dyYW0gaW5jbHVkZXMKKyAgLy8gTk9URTogdGhpcyBpcyBtb3JlIGludm9sdmVkIHRoYW4geW91IHdvdWxkIGV4cGVjdCBiZWNhdXNlIG9mIHNlcnZpY2UgZXh0ZW5zaW9uCisgIC8vIEJhc2ljYWxseSwgSSBoYXZlIHRvIGZpbmQgdGhlIGNsb3N1cmUgb2YgYWxsIHRoZSBzZXJ2aWNlcyBhbmQgaW5jbHVkZSB0aGVpciBtb2R1bGVzIGF0IHRoZSB0b3AtbGV2ZWwKKworICBzZXQ8c3RyaW5nPiByZWZlcmVuY2VkX21vZHVsZXM7CisKKyAgLy8gZmlyc3QsIHN0YXJ0IGJ5IGFkZGluZyBleHBsaWNpdCB0aHJpZnQgaW5jbHVkZXMKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzID0gZ2V0X3Byb2dyYW0oKS0+Z2V0X2luY2x1ZGVzKCk7CisgIHZlY3Rvcjx0X3Byb2dyYW0qPjo6Y29uc3RfaXRlcmF0b3IgaW5jbHVkZXNfaXRlcjsKKyAgZm9yKGluY2x1ZGVzX2l0ZXIgPSBpbmNsdWRlcy5iZWdpbigpOyBpbmNsdWRlc19pdGVyICE9IGluY2x1ZGVzLmVuZCgpOyArK2luY2x1ZGVzX2l0ZXIpIHsKKyAgICByZWZlcmVuY2VkX21vZHVsZXMuaW5zZXJ0KCgqaW5jbHVkZXNfaXRlciktPmdldF9uYW1lKCkpOworICB9CisKKyAgLy8gbmV4dCwgcmVjdXJzaXZlbHkgaXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUgc2VydmljZXMgYW5kIGFkZCB0aGUgbmFtZXMgb2YgYW55IHByb2dyYW1zIHRoZXkgcmVmZXJlbmNlCisgIGNvbnN0IHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IGdldF9wcm9ncmFtKCktPmdldF9zZXJ2aWNlcygpOworICB2ZWN0b3I8dF9zZXJ2aWNlKj46OmNvbnN0X2l0ZXJhdG9yIHNlcnZpY2VfaXRlcjsKKyAgZm9yIChzZXJ2aWNlX2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzZXJ2aWNlX2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc2VydmljZV9pdGVyKSB7CisgICAgY29tcHV0ZV9zZXJ2aWNlX3JlZmVyZW5jZWRfbW9kdWxlcygqc2VydmljZV9pdGVyLCByZWZlcmVuY2VkX21vZHVsZXMpOworICB9CisKKyAgLy8gZmluYWxseSwgd3JpdGUgYWxsIHRoZSAicHViIHVzZS4uLiIgZGVjbGFyYXRpb25zCisgIGlmICghcmVmZXJlbmNlZF9tb2R1bGVzLmVtcHR5KCkpIHsKKyAgICBzZXQ8c3RyaW5nPjo6aXRlcmF0b3IgbW9kdWxlX2l0ZXI7CisgICAgZm9yIChtb2R1bGVfaXRlciA9IHJlZmVyZW5jZWRfbW9kdWxlcy5iZWdpbigpOyBtb2R1bGVfaXRlciAhPSByZWZlcmVuY2VkX21vZHVsZXMuZW5kKCk7ICsrbW9kdWxlX2l0ZXIpIHsKKyAgICAgIGZfZ2VuXyA8PCAidXNlICIgPDwgcnVzdF9zbmFrZV9jYXNlKCptb2R1bGVfaXRlcikgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGZfZ2VuXyA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmNvbXB1dGVfc2VydmljZV9yZWZlcmVuY2VkX21vZHVsZXMoCisgIHRfc2VydmljZSAqdHNlcnZpY2UsCisgIHNldDxzdHJpbmc+ICZyZWZlcmVuY2VkX21vZHVsZXMKKykgeworICB0X3NlcnZpY2UqIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHMpIHsKKyAgICBpZiAoZXh0ZW5kcy0+Z2V0X3Byb2dyYW0oKSAhPSBnZXRfcHJvZ3JhbSgpKSB7CisgICAgICByZWZlcmVuY2VkX21vZHVsZXMuaW5zZXJ0KGV4dGVuZHMtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpOworICAgIH0KKyAgICBjb21wdXRlX3NlcnZpY2VfcmVmZXJlbmNlZF9tb2R1bGVzKGV4dGVuZHMsIHJlZmVyZW5jZWRfbW9kdWxlcyk7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBmX2dlbl8uY2xvc2UoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENvbnN0cworLy8KKy8vIE5PVEU6IGNvbnNpZGVyIHVzaW5nIG1hY3JvcyB0byBnZW5lcmF0ZSBjb25zdGFudHMKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoaXMgaXMgd29yc2UgdGhhbiBpdCBzaG91bGQgYmUgYmVjYXVzZSBjb25zdGFudHMKKy8vIGFyZW4ndCAoc2Vuc2libHkpIGxpbWl0ZWQgdG8gc2NhbGFyIHR5cGVzCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7CisgIHRfdHlwZSogdHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgaWYgKGNhbl9nZW5lcmF0ZV9zaW1wbGVfY29uc3QodHR5cGUpKSB7CisgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIHR0eXBlLCB0dmFsdWUpOworICB9IGVsc2UgaWYgKGNhbl9nZW5lcmF0ZV9jb25zdF9ob2xkZXIodHR5cGUpKSB7CisgICAgcmVuZGVyX2NvbnN0X3ZhbHVlX2hvbGRlcihuYW1lLCB0dHlwZSwgdHZhbHVlKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIGNvbnN0IGZvciAiICsgbmFtZTsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUoY29uc3Qgc3RyaW5nJiBuYW1lLCB0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKKyAgaWYgKCFjYW5fZ2VuZXJhdGVfc2ltcGxlX2NvbnN0KHR0eXBlKSkgeworICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgc2ltcGxlIHJ1c3QgY29uc3RhbnQgZm9yICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGZfZ2VuXyA8PCAicHViIGNvbnN0ICIgPDwgcnVzdF91cHBlcl9jYXNlKG5hbWUpIDw8ICI6ICIgPDwgdG9fcnVzdF9jb25zdF90eXBlKHR0eXBlKSA8PCAiID0gIjsKKyAgcmVuZGVyX2NvbnN0X3ZhbHVlKHR0eXBlLCB0dmFsdWUsIGZhbHNlKTsKKyAgZl9nZW5fIDw8ICI7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlX2hvbGRlcihjb25zdCBzdHJpbmcmIG5hbWUsIHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSkgeworICBpZiAoIWNhbl9nZW5lcmF0ZV9jb25zdF9ob2xkZXIodHR5cGUpKSB7CisgICAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBjb25zdGFudCBob2xkZXIgZm9yICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBob2xkZXJfbmFtZSgiQ29uc3QiICsgcnVzdF9jYW1lbF9jYXNlKG5hbWUpKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInB1YiBzdHJ1Y3QgIiA8PCBob2xkZXJfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpbXBsICIgPDwgaG9sZGVyX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInB1YiBmbiBjb25zdF92YWx1ZSgpIC0+ICIgPDwgdG9fcnVzdF90eXBlKHR0eXBlKSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfY29uc3RfdmFsdWUodHR5cGUsIHR2YWx1ZSk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlLCBib29sIGlzX293bmVkKSB7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2VfdHlwZSA9ICh0X2Jhc2VfdHlwZSopdHR5cGU7CisgICAgc3dpdGNoICh0YmFzZV90eXBlLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgaWYgKGlzX293bmVkKSB7CisgICAgICAgICAgZl9nZW5fIDw8ICJcIiIgPDwgdHZhbHVlLT5nZXRfc3RyaW5nKCkgPDwgIlwiIjw8ICAiLnRvX293bmVkKCkuaW50b19ieXRlcygpIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX2dlbl8gPDwgImJcIiIgPDwgdHZhbHVlLT5nZXRfc3RyaW5nKCkgPDwgIlwiIjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9nZW5fIDw8ICJcIiIgPDwgdHZhbHVlLT5nZXRfc3RyaW5nKCkgPDwgIlwiIjsKKyAgICAgICAgaWYgKGlzX293bmVkKSB7CisgICAgICAgICAgZl9nZW5fIDw8ICIudG9fb3duZWQoKSI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGZfZ2VuXyA8PCAodHZhbHVlLT5nZXRfaW50ZWdlcigpID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgZl9nZW5fIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgZl9nZW5fIDw8ICJPcmRlcmVkRmxvYXQ6OmZyb20oIiA8PCB0dmFsdWUtPmdldF9kb3VibGUoKSA8PCAiIGFzIGY2NCkiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgY29uc3QgdmFsdWUgZm9yICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZW5kZXJfY29uc3RfdmFsdWUoZ2V0X3RydWVfdHlwZSh0dHlwZSksIHR2YWx1ZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCB0b19ydXN0X3R5cGUodHR5cGUpCisgICAgICA8PCAiOjp0cnlfZnJvbSgiCisgICAgICA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCkKKyAgICAgIDw8ICIpLmV4cGVjdChcImV4cGVjdGluZyB2YWxpZCBjb25zdCB2YWx1ZVwiKSIKKyAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmVuZGVyX2NvbnN0X3N0cnVjdCh0dHlwZSwgdHZhbHVlKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgcmVuZGVyX2NvbnN0X2xpc3QodHR5cGUsIHR2YWx1ZSk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIHJlbmRlcl9jb25zdF9zZXQodHR5cGUsIHR2YWx1ZSk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIHJlbmRlcl9jb25zdF9tYXAodHR5cGUsIHR2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgY29uc3QgY29udGFpbmVyIHZhbHVlIGZvciAiICsgdHR5cGUtPmdldF9uYW1lKCk7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBjb25zdCB2YWx1ZSBmb3IgIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF9zdHJ1Y3QodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSopIHsKKyAgaWYgKCgodF9zdHJ1Y3QqKXR0eXBlKS0+aXNfdW5pb24oKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInVuaW1wbGVtZW50ZWQhKCkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidW5pbXBsZW1lbnRlZCEoKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfbGlzdCh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKKyAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IG11dCBsOiBWZWM8IiA8PCB0b19ydXN0X3R5cGUoZWxlbV90eXBlKSA8PCAiPiA9IFZlYzo6bmV3KCk7IiA8PCBlbmRsOworICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBlbGVtcyA9IHR2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgZWxlbV9pdGVyOworICBmb3IoZWxlbV9pdGVyID0gZWxlbXMuYmVnaW4oKTsgZWxlbV9pdGVyICE9IGVsZW1zLmVuZCgpOyArK2VsZW1faXRlcikgeworICAgIHRfY29uc3RfdmFsdWUqIGVsZW1fdmFsdWUgPSAoKmVsZW1faXRlcik7CisgICAgcmVuZGVyX2NvbnRhaW5lcl9jb25zdF92YWx1ZSgibC5wdXNoIiwgZWxlbV90eXBlLCBlbGVtX3ZhbHVlKTsKKyAgfQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImwiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF9zZXQodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKSB7CisgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IG11dCBzOiBCVHJlZVNldDwiIDw8IHRvX3J1c3RfdHlwZShlbGVtX3R5cGUpIDw8ICI+ID0gQlRyZWVTZXQ6Om5ldygpOyIgPDwgZW5kbDsKKyAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgZWxlbXMgPSB0dmFsdWUtPmdldF9saXN0KCk7CisgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGVsZW1faXRlcjsKKyAgZm9yKGVsZW1faXRlciA9IGVsZW1zLmJlZ2luKCk7IGVsZW1faXRlciAhPSBlbGVtcy5lbmQoKTsgKytlbGVtX2l0ZXIpIHsKKyAgICB0X2NvbnN0X3ZhbHVlKiBlbGVtX3ZhbHVlID0gKCplbGVtX2l0ZXIpOworICAgIHJlbmRlcl9jb250YWluZXJfY29uc3RfdmFsdWUoInMuaW5zZXJ0IiwgZWxlbV90eXBlLCBlbGVtX3ZhbHVlKTsKKyAgfQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInMiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF9tYXAodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKSB7CisgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpOworICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAibGV0IG11dCBtOiBCVHJlZU1hcDwiCisgICAgPDwgdG9fcnVzdF90eXBlKGtleV90eXBlKSA8PCAiLCAiIDw8IHRvX3J1c3RfdHlwZSh2YWxfdHlwZSkKKyAgICA8PCAiPiA9IEJUcmVlTWFwOjpuZXcoKTsiCisgICAgPDwgZW5kbDsKKyAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIGVsZW1zID0gdHZhbHVlLT5nZXRfbWFwKCk7CisgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciBlbGVtX2l0ZXI7CisgIGZvciAoZWxlbV9pdGVyID0gZWxlbXMuYmVnaW4oKTsgZWxlbV9pdGVyICE9IGVsZW1zLmVuZCgpOyArK2VsZW1faXRlcikgeworICAgIHRfY29uc3RfdmFsdWUqIGtleV92YWx1ZSA9IGVsZW1faXRlci0+Zmlyc3Q7CisgICAgdF9jb25zdF92YWx1ZSogdmFsX3ZhbHVlID0gZWxlbV9pdGVyLT5zZWNvbmQ7CisgICAgaWYgKGdldF90cnVlX3R5cGUoa2V5X3R5cGUpLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgayA9ICI7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUoa2V5X3R5cGUsIGtleV92YWx1ZSk7CisgICAgICBmX2dlbl8gPDwgIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGsgPSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUoa2V5X3R5cGUsIGtleV92YWx1ZSk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKGdldF90cnVlX3R5cGUodmFsX3R5cGUpLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgdiA9ICI7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUodmFsX3R5cGUsIHZhbF92YWx1ZSk7CisgICAgICBmX2dlbl8gPDwgIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHYgPSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUodmFsX3R5cGUsIHZhbF92YWx1ZSk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9nZW5fIDw8ICBpbmRlbnQoKSA8PCAibS5pbnNlcnQoaywgdik7IiA8PCBlbmRsOworICB9CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnRhaW5lcl9jb25zdF92YWx1ZSgKKyAgY29uc3Qgc3RyaW5nJiBpbnNlcnRfZnVuY3Rpb24sCisgIHRfdHlwZSogdHR5cGUsCisgIHRfY29uc3RfdmFsdWUqIHR2YWx1ZQorKSB7CisgIGlmIChnZXRfdHJ1ZV90eXBlKHR0eXBlKS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgaW5zZXJ0X2Z1bmN0aW9uIDw8ICIoIjsKKyAgICByZW5kZXJfY29uc3RfdmFsdWUodHR5cGUsIHR2YWx1ZSk7CisgICAgZl9nZW5fIDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgaW5zZXJ0X2Z1bmN0aW9uIDw8ICIoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHJlbmRlcl9jb25zdF92YWx1ZSh0dHlwZSwgdHZhbHVlKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFR5cGVkZWZzCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgc3RkOjpzdHJpbmcgYWN0dWFsX3R5cGUgPSB0b19ydXN0X3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCkpOworICBmX2dlbl8gPDwgInB1YiB0eXBlICIgPDwgcnVzdF9zYWZlX25hbWUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKSA8PCAiID0gIiA8PCBhY3R1YWxfdHlwZSA8PCAiOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBFbnVtcworLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0cmluZyBlbnVtX25hbWUocnVzdF9jYW1lbF9jYXNlKHRlbnVtLT5nZXRfbmFtZSgpKSk7CisgIHJlbmRlcl9lbnVtX2RlZmluaXRpb24odGVudW0sIGVudW1fbmFtZSk7CisgIHJlbmRlcl9lbnVtX2ltcGwoZW51bV9uYW1lKTsKKyAgcmVuZGVyX2VudW1fY29udmVyc2lvbih0ZW51bSwgZW51bV9uYW1lKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2VudW1fZGVmaW5pdGlvbih0X2VudW0qIHRlbnVtLCBjb25zdCBzdHJpbmcmIGVudW1fbmFtZSkgeworICByZW5kZXJfcnVzdGRvYygodF9kb2MqKSB0ZW51bSk7CisgIGZfZ2VuXyA8PCAiI1tkZXJpdmUoQ29weSwgQ2xvbmUsIERlYnVnLCBFcSwgSGFzaCwgT3JkLCBQYXJ0aWFsRXEsIFBhcnRpYWxPcmQpXSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJwdWIgZW51bSAiIDw8IGVudW1fbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNvbnN0YW50c19pdGVyOworICBmb3IgKGNvbnN0YW50c19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNvbnN0YW50c19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjb25zdGFudHNfaXRlcikgeworICAgIHRfZW51bV92YWx1ZSogdmFsID0gKCpjb25zdGFudHNfaXRlcik7CisgICAgcmVuZGVyX3J1c3Rkb2MoKHRfZG9jKikgdmFsKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCBydXN0X2VudW1fdmFyaWFudF9uYW1lKHZhbC0+Z2V0X25hbWUoKSkKKyAgICAgIDw8ICIgPSAiCisgICAgICA8PCB2YWwtPmdldF92YWx1ZSgpCisgICAgICA8PCAiLCIKKyAgICAgIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfZW51bV9pbXBsKGNvbnN0IHN0cmluZyYgZW51bV9uYW1lKSB7CisgIGZfZ2VuXyA8PCAiaW1wbCAiIDw8IGVudW1fbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgInB1YiBmbiB3cml0ZV90b19vdXRfcHJvdG9jb2woJnNlbGYsIG9fcHJvdDogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9pMzIoKnNlbGYgYXMgaTMyKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgInB1YiBmbiByZWFkX2Zyb21faW5fcHJvdG9jb2woaV9wcm90OiAmbXV0IFRJbnB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwiIDw8IGVudW1fbmFtZSA8PCAiPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGVudW1fdmFsdWUgPSBpX3Byb3QucmVhZF9pMzIoKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgZW51bV9uYW1lIDw8ICI6OnRyeV9mcm9tKGVudW1fdmFsdWUpIjsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2VudW1fY29udmVyc2lvbih0X2VudW0qIHRlbnVtLCBjb25zdCBzdHJpbmcmIGVudW1fbmFtZSkgeworICBmX2dlbl8gPDwgImltcGwgVHJ5RnJvbTxpMzI+IGZvciAiIDw8IGVudW1fbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidHlwZSBFcnIgPSB0aHJpZnQ6OkVycm9yOyI7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiB0cnlfZnJvbShpOiBpMzIpIC0+IFJlc3VsdDxTZWxmLCBTZWxmOjpFcnI+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibWF0Y2ggaSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjb25zdGFudHNfaXRlcjsKKyAgZm9yIChjb25zdGFudHNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjb25zdGFudHNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY29uc3RhbnRzX2l0ZXIpIHsKKyAgICB0X2VudW1fdmFsdWUqIHZhbCA9ICgqY29uc3RhbnRzX2l0ZXIpOworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8IHZhbC0+Z2V0X3ZhbHVlKCkKKyAgICAgIDw8ICIgPT4gT2soIiA8PCBlbnVtX25hbWUgPDwgIjo6IiA8PCBydXN0X2VudW1fdmFyaWFudF9uYW1lKHZhbC0+Z2V0X25hbWUoKSkgPDwgIiksIgorICAgICAgPDwgZW5kbDsKKyAgfQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIl8gPT4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90aHJpZnRfZXJyb3IoCisgICAgIlByb3RvY29sIiwKKyAgICAiUHJvdG9jb2xFcnJvciIsCisgICAgIlByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSIsCisgICAgImZvcm1hdCEoXCJjYW5ub3QgY29udmVydCBlbnVtIGNvbnN0YW50IHt9IHRvICIgKyBlbnVtX25hbWUgKyAiXCIsIGkpIgorICApOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFN0cnVjdHMsIFVuaW9ucyBhbmQgRXhjZXB0aW9ucworLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICByZW5kZXJfc3RydWN0KHJ1c3Rfc3RydWN0X25hbWUodHhjZXB0aW9uKSwgdHhjZXB0aW9uLCB0X3JzX2dlbmVyYXRvcjo6VF9FWENFUFRJT04pOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICByZW5kZXJfdW5pb24odHN0cnVjdCk7CisgIH0gZWxzZSBpZiAodHN0cnVjdC0+aXNfc3RydWN0KCkpIHsKKyAgICByZW5kZXJfc3RydWN0KHJ1c3Rfc3RydWN0X25hbWUodHN0cnVjdCksIHRzdHJ1Y3QsIHRfcnNfZ2VuZXJhdG9yOjpUX1JFR1VMQVIpOworICB9IGVsc2UgeworICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgc3RydWN0IGZvciBleGNlcHRpb24iOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zdHJ1Y3QoCisgIGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsCisgIHRfc3RydWN0KiB0c3RydWN0LAorICB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorKSB7CisgIHJlbmRlcl90eXBlX2NvbW1lbnQoc3RydWN0X25hbWUpOworICByZW5kZXJfc3RydWN0X2RlZmluaXRpb24oc3RydWN0X25hbWUsIHRzdHJ1Y3QsIHN0cnVjdF90eXBlKTsKKyAgcmVuZGVyX3N0cnVjdF9pbXBsKHN0cnVjdF9uYW1lLCB0c3RydWN0LCBzdHJ1Y3RfdHlwZSk7CisgIGlmIChzdHJ1Y3RfdHlwZSA9PSB0X3JzX2dlbmVyYXRvcjo6VF9SRUdVTEFSIHx8IHN0cnVjdF90eXBlID09IHRfcnNfZ2VuZXJhdG9yOjpUX0VYQ0VQVElPTikgeworICAgIHJlbmRlcl9zdHJ1Y3RfZGVmYXVsdF90cmFpdF9pbXBsKHN0cnVjdF9uYW1lLCB0c3RydWN0KTsKKyAgfQorICBpZiAoc3RydWN0X3R5cGUgPT0gdF9yc19nZW5lcmF0b3I6OlRfRVhDRVBUSU9OKSB7CisgICAgcmVuZGVyX2V4Y2VwdGlvbl9zdHJ1Y3RfZXJyb3JfdHJhaXRfaW1wbHMoc3RydWN0X25hbWUsIHRzdHJ1Y3QpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zdHJ1Y3RfZGVmaW5pdGlvbigKKyAgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwKKyAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlCispIHsKKyAgcmVuZGVyX3J1c3Rkb2MoKHRfZG9jKikgdHN0cnVjdCk7CisgIGZfZ2VuXyA8PCAiI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgSGFzaCwgT3JkLCBQYXJ0aWFsRXEsIFBhcnRpYWxPcmQpXSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IHZpc2liaWxpdHlfcXVhbGlmaWVyKHN0cnVjdF90eXBlKSA8PCAic3RydWN0ICIgPDwgc3RydWN0X25hbWUgPDwgIiB7IiA8PCBlbmRsOworCisgIC8vIHJlbmRlciB0aGUgbWVtYmVycworICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKyAgICBmb3IobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICAgIHRfZmllbGQ6OmVfcmVxIG1lbWJlcl9yZXEgPSBhY3R1YWxfZmllbGRfcmVxKG1lbWJlciwgc3RydWN0X3R5cGUpOworCisgICAgICBzdHJpbmcgcnVzdF90eXBlID0gdG9fcnVzdF90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSk7CisgICAgICBydXN0X3R5cGUgPSBpc19vcHRpb25hbChtZW1iZXJfcmVxKSA/ICJPcHRpb248IiArIHJ1c3RfdHlwZSArICI+IiA6IHJ1c3RfdHlwZTsKKworICAgICAgcmVuZGVyX3J1c3Rkb2MoKHRfZG9jKikgbWVtYmVyKTsKKyAgICAgIGZfZ2VuXworICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICA8PCB2aXNpYmlsaXR5X3F1YWxpZmllcihzdHJ1Y3RfdHlwZSkKKyAgICAgICAgPDwgcnVzdF9maWVsZF9uYW1lKG1lbWJlcikgPDwgIjogIiA8PCBydXN0X3R5cGUgPDwgIiwiCisgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9leGNlcHRpb25fc3RydWN0X2Vycm9yX3RyYWl0X2ltcGxzKGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIC8vIGVycm9yOjpFcnJvciB0cmFpdAorICBmX2dlbl8gPDwgImltcGwgRXJyb3IgZm9yICIgPDwgc3RydWN0X25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiBkZXNjcmlwdGlvbigmc2VsZikgLT4gJnN0ciB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJcIiIgPDwgInJlbW90ZSBzZXJ2aWNlIHRocmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIiIDw8IGVuZGw7IC8vIHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworCisgIC8vIGNvbnZlcnQ6OkZyb20gdHJhaXQKKyAgZl9nZW5fIDw8ICJpbXBsIEZyb208IiA8PCBzdHJ1Y3RfbmFtZSA8PCAiPiBmb3IgdGhyaWZ0OjpFcnJvciB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiBmcm9tKGU6ICIgPDwgc3RydWN0X25hbWUgPDwgIikgLT4gU2VsZiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ0aHJpZnQ6OkVycm9yOjpVc2VyKEJveDo6bmV3KGUpKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworCisgIC8vIGZtdDo6RGlzcGxheSB0cmFpdAorICBmX2dlbl8gPDwgImltcGwgRGlzcGxheSBmb3IgIiA8PCBzdHJ1Y3RfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInNlbGYuZGVzY3JpcHRpb24oKS5mbXQoZikiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N0cnVjdF9kZWZhdWx0X3RyYWl0X2ltcGwoY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgYm9vbCBoYXNfcmVxdWlyZWRfZmllbGQgPSBmYWxzZTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKyAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIG1lbWJlciA9ICptZW1iZXJzX2l0ZXI7CisgICAgaWYgKCFpc19vcHRpb25hbChtZW1iZXItPmdldF9yZXEoKSkpIHsKKyAgICAgIGhhc19yZXF1aXJlZF9maWVsZCA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoaGFzX3JlcXVpcmVkX2ZpZWxkKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgZl9nZW5fIDw8ICJpbXBsIERlZmF1bHQgZm9yICIgPDwgc3RydWN0X25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiBkZWZhdWx0KCkgLT4gU2VsZiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAobWVtYmVycy5lbXB0eSgpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHN0cnVjdF9uYW1lIDw8ICJ7fSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgc3RydWN0X25hbWUgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgICAgdF9maWVsZCAqbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lKHJ1c3RfZmllbGRfbmFtZShtZW1iZXIpKTsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBtZW1iZXJfbmFtZSA8PCAiOiAiIDw8IG9wdF9pbl9yZXFfb3V0X3ZhbHVlKG1lbWJlci0+Z2V0X3R5cGUoKSkgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3RydWN0X2ltcGwoCisgIGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsCisgIHRfc3RydWN0KiB0c3RydWN0LAorICB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorKSB7CisgIGZfZ2VuXyA8PCAiaW1wbCAiIDw8IHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHN0cnVjdF90eXBlID09IHRfcnNfZ2VuZXJhdG9yOjpUX1JFR1VMQVIgfHwgc3RydWN0X3R5cGUgPT0gdF9yc19nZW5lcmF0b3I6OlRfRVhDRVBUSU9OKSB7CisgICAgcmVuZGVyX3N0cnVjdF9jb25zdHJ1Y3RvcihzdHJ1Y3RfbmFtZSwgdHN0cnVjdCwgc3RydWN0X3R5cGUpOworICB9CisKKyAgcmVuZGVyX3N0cnVjdF9zeW5jX3JlYWQoc3RydWN0X25hbWUsIHRzdHJ1Y3QsIHN0cnVjdF90eXBlKTsKKyAgcmVuZGVyX3N0cnVjdF9zeW5jX3dyaXRlKHRzdHJ1Y3QsIHN0cnVjdF90eXBlKTsKKworICBpZiAoc3RydWN0X3R5cGUgPT0gdF9yc19nZW5lcmF0b3I6OlRfUkVTVUxUKSB7CisgICAgcmVuZGVyX3Jlc3VsdF9zdHJ1Y3RfdG9fcmVzdWx0X21ldGhvZCh0c3RydWN0KTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zdHJ1Y3RfY29uc3RydWN0b3IoCisgIGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsCisgIHRfc3RydWN0KiB0c3RydWN0LAorICB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbWVtYmVyc19pdGVyOworCisgIC8vIGJ1aWxkIHRoZSBjb252ZW5pZW5jZSB0eXBlIHBhcmFtZXRlcnMgdGhhdCBhbGxvd3MgdXMgdG8gcGFzcyB1bndyYXBwZWQgdmFsdWVzIHRvIGEgY29uc3RydWN0b3IgYW5kCisgIC8vIGhhdmUgdGhlbSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCBpbnRvIE9wdGlvbjx2YWx1ZT4KKyAgYm9vbCBmaXJzdF9hcmcgPSB0cnVlOworCisgIG9zdHJpbmdzdHJlYW0gZ2VuZXJpY190eXBlX3BhcmFtZXRlcnM7CisgIG9zdHJpbmdzdHJlYW0gZ2VuZXJpY190eXBlX3F1YWxpZmllcnM7CisgIGZvcihtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICB0X2ZpZWxkOjplX3JlcSBtZW1iZXJfcmVxID0gYWN0dWFsX2ZpZWxkX3JlcShtZW1iZXIsIHN0cnVjdF90eXBlKTsKKworICAgIGlmIChpc19vcHRpb25hbChtZW1iZXJfcmVxKSkgeworICAgICAgaWYgKGZpcnN0X2FyZykgeworICAgICAgICBmaXJzdF9hcmcgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdlbmVyaWNfdHlwZV9wYXJhbWV0ZXJzIDw8ICIsICI7CisgICAgICAgIGdlbmVyaWNfdHlwZV9xdWFsaWZpZXJzIDw8ICIsICI7CisgICAgICB9CisgICAgICBnZW5lcmljX3R5cGVfcGFyYW1ldGVycyA8PCAiRiIgPDwgbWVtYmVyLT5nZXRfa2V5KCk7CisgICAgICBnZW5lcmljX3R5cGVfcXVhbGlmaWVycyA8PCAiRiIgPDwgbWVtYmVyLT5nZXRfa2V5KCkgPDwgIjogSW50bzxPcHRpb248IiA8PCB0b19ydXN0X3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKSA8PCAiPj4iOworICAgIH0KKyAgfQorCisgIHN0cmluZyB0eXBlX3BhcmFtZXRlcl9zdHJpbmcgPSBnZW5lcmljX3R5cGVfcGFyYW1ldGVycy5zdHIoKTsKKyAgaWYgKHR5cGVfcGFyYW1ldGVyX3N0cmluZy5sZW5ndGgoKSAhPSAwKSB7CisgICAgdHlwZV9wYXJhbWV0ZXJfc3RyaW5nID0gIjwiICsgdHlwZV9wYXJhbWV0ZXJfc3RyaW5nICsgIj4iOworICB9CisKKyAgc3RyaW5nIHR5cGVfcXVhbGlmaWVyX3N0cmluZyA9IGdlbmVyaWNfdHlwZV9xdWFsaWZpZXJzLnN0cigpOworICBpZiAodHlwZV9xdWFsaWZpZXJfc3RyaW5nLmxlbmd0aCgpICE9IDApIHsKKyAgICB0eXBlX3F1YWxpZmllcl9zdHJpbmcgPSAid2hlcmUgIiArIHR5cGVfcXVhbGlmaWVyX3N0cmluZyArICIgIjsKKyAgfQorCisgIC8vIG5vdyBidWlsZCB0aGUgYWN0dWFsIGNvbnN0cnVjdG9yIGFyZyBsaXN0CisgIC8vIHdoZW4gd2UncmUgYnVpbGRpbmcgdGhpcyBsaXN0IHdlIGhhdmUgdG8gdXNlIHRoZSB0eXBlIHBhcmFtZXRlcnMgaW4gcGxhY2Ugb2YgdGhlIGFjdHVhbCB0eXBlIG5hbWVzCisgIC8vIGlmIG5lY2Vzc2FyeQorICBvc3RyaW5nc3RyZWFtIGFyZ3M7CisgIGZpcnN0X2FyZyA9IHRydWU7CisgIGZvcihtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICB0X2ZpZWxkOjplX3JlcSBtZW1iZXJfcmVxID0gYWN0dWFsX2ZpZWxkX3JlcShtZW1iZXIsIHN0cnVjdF90eXBlKTsKKyAgICBzdHJpbmcgbWVtYmVyX25hbWUocnVzdF9maWVsZF9uYW1lKG1lbWJlcikpOworCisgICAgaWYgKGZpcnN0X2FyZykgeworICAgICAgZmlyc3RfYXJnID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGFyZ3MgPDwgIiwgIjsKKyAgICB9CisKKyAgICBpZiAoaXNfb3B0aW9uYWwobWVtYmVyX3JlcSkpIHsKKyAgICAgIGFyZ3MgPDwgbWVtYmVyX25hbWUgPDwgIjogIiA8PCAiRiIgPDwgbWVtYmVyLT5nZXRfa2V5KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFyZ3MgPDwgbWVtYmVyX25hbWUgPDwgIjogIiA8PCB0b19ydXN0X3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKTsKKyAgICB9CisgIH0KKworICBzdHJpbmcgYXJnX3N0cmluZyA9IGFyZ3Muc3RyKCk7CisKKyAgc3RyaW5nIHZpc2liaWxpdHkodmlzaWJpbGl0eV9xdWFsaWZpZXIoc3RydWN0X3R5cGUpKTsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCB2aXNpYmlsaXR5CisgICAgPDwgImZuIG5ldyIKKyAgICA8PCB0eXBlX3BhcmFtZXRlcl9zdHJpbmcKKyAgICA8PCAiKCIKKyAgICA8PCBhcmdfc3RyaW5nCisgICAgPDwgIikgLT4gIgorICAgIDw8IHN0cnVjdF9uYW1lCisgICAgPDwgIiAiCisgICAgPDwgdHlwZV9xdWFsaWZpZXJfc3RyaW5nCisgICAgPDwgInsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID09IDApIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgc3RydWN0X25hbWUgPDwgIiB7fSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgc3RydWN0X25hbWUgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZm9yKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgICB0X2ZpZWxkOjplX3JlcSBtZW1iZXJfcmVxID0gYWN0dWFsX2ZpZWxkX3JlcShtZW1iZXIsIHN0cnVjdF90eXBlKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZShydXN0X2ZpZWxkX25hbWUobWVtYmVyKSk7CisKKyAgICAgIGlmIChpc19vcHRpb25hbChtZW1iZXJfcmVxKSkgeworICAgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgbWVtYmVyX25hbWUgPDwgIjogIiA8PCBtZW1iZXJfbmFtZSA8PCAiLmludG8oKSwiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgbWVtYmVyX25hbWUgPDwgIjogIiA8PCBtZW1iZXJfbmFtZSA8PCAiLCIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3Jlc3VsdF9zdHJ1Y3RfdG9fcmVzdWx0X21ldGhvZCh0X3N0cnVjdCogdHN0cnVjdCkgeworICAvLyB3ZSBkb24ndCB1c2UgdGhlIHJ1c3Qgc3RydWN0IG5hbWUgaW4gdGhpcyBtZXRob2QsIGp1c3QgdGhlIHNlcnZpY2UgY2FsbCBuYW1lCisgIHN0cmluZyBzZXJ2aWNlX2NhbGxfbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgLy8gY2hlY2sgdGhhdCB3ZSBhY3R1YWxseSBoYXZlIGEgcmVzdWx0CisgIHNpemVfdCBpbmRleCA9IHNlcnZpY2VfY2FsbF9uYW1lLmZpbmQoUkVTVUxUX1NUUlVDVF9TVUZGSVgsIDApOworICBpZiAoaW5kZXggPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICB0aHJvdyAicmVzdWx0IHN0cnVjdCAiICsgc2VydmljZV9jYWxsX25hbWUgKyAiIG1pc3NpbmcgcmVzdWx0IHN1ZmZpeCI7CisgIH0gZWxzZSB7CisgICAgIHNlcnZpY2VfY2FsbF9uYW1lLnJlcGxhY2UoaW5kZXgsIDYsICIiKTsKKyAgfQorCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbWVtYmVyc19pdGVyOworCisgIC8vIGZpbmQgb3V0IHdoYXQgdGhlIGNhbGwncyBleHBlY3RlZCByZXR1cm4gdHlwZSB3YXMKKyAgc3RyaW5nIHJ1c3RfcmV0dXJuX3R5cGUgPSAiKCkiOworICBmb3IobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgaWYgKG1lbWJlci0+Z2V0X25hbWUoKSA9PSBTRVJWSUNFX1JFU1VMVF9WQVJJQUJMRSkgeyAvLyBkb24ndCBoYXZlIHRvIGNoZWNrIHNhZmUgbmFtZSBoZXJlCisgICAgICBydXN0X3JldHVybl90eXBlID0gdG9fcnVzdF90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBOT1RFOiBpZGVhbGx5IEkgd291bGQgZ2VuZXJhdGUgdGhlIGJyYW5jaGVzIGFuZCByZW5kZXIgdGhlbSBzZXBhcmF0ZWx5CisgIC8vIEkgdHJpZWQgdGhpcyBob3dldmVyLCBhbmQgdGhlIHJlc3VsdGluZyBjb2RlIHdhcyBoYXJkZXIgdG8gdW5kZXJzdGFuZAorICAvLyBtYWludGFpbmluZyBhIHJlbmRlcmVkIGJyYW5jaCBjb3VudCAod2hpbGUgYSBsaXR0bGUgdWdseSkgZ290IG1lIHRoZQorICAvLyByZW5kZXJpbmcgSSB3YW50ZWQgd2l0aCBjb2RlIHRoYXQgd2FzIHJlYXNvbmFibHkgdW5kZXJzdGFuZGFibGUKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuIG9rX29yKHNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PCIgPDwgcnVzdF9yZXR1cm5fdHlwZSA8PCAiPiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbnQgcmVuZGVyZWRfYnJhbmNoX2NvdW50ID0gMDsKKworICAvLyByZW5kZXIgdGhlIGV4Y2VwdGlvbiBicmFuY2hlcworICBmb3IobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0ZmllbGQgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgaWYgKHRmaWVsZC0+Z2V0X25hbWUoKSAhPSBTRVJWSUNFX1JFU1VMVF9WQVJJQUJMRSkgeyAvLyBkb24ndCBoYXZlIHRvIGNoZWNrIHNhZmUgbmFtZSBoZXJlCisgICAgICBzdHJpbmcgZmllbGRfbmFtZSgic2VsZi4iICsgcnVzdF9maWVsZF9uYW1lKHRmaWVsZCkpOworICAgICAgc3RyaW5nIGJyYW5jaF9zdGF0ZW1lbnQgPSByZW5kZXJlZF9icmFuY2hfY291bnQgPT0gMCA/ICJpZiIgOiAifSBlbHNlIGlmIjsKKworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGJyYW5jaF9zdGF0ZW1lbnQgPDwgIiAiIDw8IGZpZWxkX25hbWUgPDwgIi5pc19zb21lKCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcihCb3g6Om5ldygiIDw8IGZpZWxkX25hbWUgPDwgIi51bndyYXAoKSkpKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICAgIHJlbmRlcmVkX2JyYW5jaF9jb3VudCsrOworICAgIH0KKyAgfQorCisgIC8vIHJlbmRlciB0aGUgcmV0dXJuIHZhbHVlIGJyYW5jaGVzCisgIGlmIChydXN0X3JldHVybl90eXBlID09ICIoKSIpIHsKKyAgICBpZiAocmVuZGVyZWRfYnJhbmNoX2NvdW50ID09IDApIHsKKyAgICAgIC8vIHdlIGhhdmUgdGhlIHVuaXQgcmV0dXJuIGFuZCB0aGlzIHNlcnZpY2UgY2FsbCBoYXMgbm8gdXNlci1kZWZpbmVkCisgICAgICAvLyBleGNlcHRpb25zLiB0aGlzIG1lYW5zIHRoYXQgd2UndmUgYSB0cml2aWFsIHJldHVybiAoaGFwcGVucyB3aXRoIG9uZXdheXMpCisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIk9rKCgpKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gd2UgaGF2ZSB0aGUgdW5pdCByZXR1cm4sIGJ1dCB0aGVyZSBhcmUgdXNlci1kZWZpbmVkIGV4Y2VwdGlvbnMKKyAgICAgIC8vIGlmIHdlJ3ZlIGdvdHRlbiB0aGlzIGZhciB0aGVuIHdlIGhhdmUgdGhlIGRlZmF1bHQgcmV0dXJuIChpLmUuIGNhbGwgc3VjY2Vzc2Z1bCkKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiT2soKCkpIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIGJyYW5jaF9zdGF0ZW1lbnQgPSByZW5kZXJlZF9icmFuY2hfY291bnQgPT0gMCA/ICJpZiIgOiAifSBlbHNlIGlmIjsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgYnJhbmNoX3N0YXRlbWVudCA8PCAiIHNlbGYuIiA8PCBTRVJWSUNFX1JFU1VMVF9WQVJJQUJMRSA8PCAiLmlzX3NvbWUoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiT2soc2VsZi4iIDw8IFNFUlZJQ0VfUkVTVUxUX1ZBUklBQkxFIDw8ICIudW53cmFwKCkpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICAvLyBpZiB3ZSBoYXZlbid0IGZvdW5kIGEgdmFsaWQgcmV0dXJuIHZhbHVlICpvciogYSB1c2VyIGV4Y2VwdGlvbgorICAgIC8vIHRoZW4gd2UncmUgaW4gdHJvdWJsZTsgcmV0dXJuIGEgZGVmYXVsdCBlcnJvcgorICAgIHJlbmRlcl90aHJpZnRfZXJyb3IoCisgICAgICAiQXBwbGljYXRpb24iLAorICAgICAgIkFwcGxpY2F0aW9uRXJyb3IiLAorICAgICAgIkFwcGxpY2F0aW9uRXJyb3JLaW5kOjpNaXNzaW5nUmVzdWx0IiwKKyAgICAgICJcIm5vIHJlc3VsdCByZWNlaXZlZCBmb3IgIiArIHNlcnZpY2VfY2FsbF9uYW1lICsgIlwiIgorICAgICk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl91bmlvbih0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgdW5pb25fbmFtZShydXN0X3N0cnVjdF9uYW1lKHRzdHJ1Y3QpKTsKKyAgcmVuZGVyX3R5cGVfY29tbWVudCh1bmlvbl9uYW1lKTsKKyAgcmVuZGVyX3VuaW9uX2RlZmluaXRpb24odW5pb25fbmFtZSwgdHN0cnVjdCk7CisgIHJlbmRlcl91bmlvbl9pbXBsKHVuaW9uX25hbWUsIHRzdHJ1Y3QpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdW5pb25fZGVmaW5pdGlvbihjb25zdCBzdHJpbmcmIHVuaW9uX25hbWUsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgaWYgKG1lbWJlcnMuZW1wdHkoKSkgeworICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgcnVzdCBlbnVtIHdpdGggMCBtZW1iZXJzIjsgLy8gbWF5IGJlIHZhbGlkIHRocmlmdCwgYnV0IGl0J3MgaW52YWxpZCBydXN0CisgIH0KKworICBmX2dlbl8gPDwgIiNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIEhhc2gsIE9yZCwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAicHViIGVudW0gIiA8PCB1bmlvbl9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbWVtYmVyX2l0ZXI7CisgIGZvcihtZW1iZXJfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJfaXRlcikgeworICAgIHRfZmllbGQqIHRmaWVsZCA9ICgqbWVtYmVyX2l0ZXIpOworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8IHJ1c3RfdW5pb25fZmllbGRfbmFtZSh0ZmllbGQpCisgICAgICA8PCAiKCIgPDwgdG9fcnVzdF90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiksIgorICAgICAgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl91bmlvbl9pbXBsKGNvbnN0IHN0cmluZyYgdW5pb25fbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZl9nZW5fIDw8ICJpbXBsICIgPDwgdW5pb25fbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHJlbmRlcl91bmlvbl9zeW5jX3JlYWQodW5pb25fbmFtZSwgdHN0cnVjdCk7CisgIHJlbmRlcl91bmlvbl9zeW5jX3dyaXRlKHVuaW9uX25hbWUsIHRzdHJ1Y3QpOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTeW5jIFN0cnVjdCBXcml0ZQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N0cnVjdF9zeW5jX3dyaXRlKAorICAgIHRfc3RydWN0ICp0c3RydWN0LAorICAgIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlCispIHsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCB2aXNpYmlsaXR5X3F1YWxpZmllcihzdHJ1Y3RfdHlwZSkKKyAgICA8PCAiZm4gd3JpdGVfdG9fb3V0X3Byb3RvY29sKCZzZWxmLCBvX3Byb3Q6ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyB3cml0ZSBzdHJ1Y3QgaGVhZGVyIHRvIG91dHB1dCBwcm90b2NvbAorICAvLyBub3RlOiB1c2UgdGhlICpvcmlnaW5hbCogc3RydWN0IG5hbWUgaGVyZQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBzdHJ1Y3RfaWRlbnQgPSBUU3RydWN0SWRlbnRpZmllcjo6bmV3KFwiIiArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiXCIpOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZzdHJ1Y3RfaWRlbnQpPzsiIDw8IGVuZGw7CisKKyAgLy8gd3JpdGUgc3RydWN0IG1lbWJlcnMgdG8gb3V0cHV0IHByb3RvY29sCisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKyAgICBmb3IobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICAgIHRfZmllbGQ6OmVfcmVxIG1lbWJlcl9yZXEgPSBhY3R1YWxfZmllbGRfcmVxKG1lbWJlciwgc3RydWN0X3R5cGUpOworICAgICAgc3RyaW5nIG1lbWJlcl92YXIoInNlbGYuIiArIHJ1c3RfZmllbGRfbmFtZShtZW1iZXIpKTsKKyAgICAgIHJlbmRlcl9zdHJ1Y3RfZmllbGRfc3luY193cml0ZShtZW1iZXJfdmFyLCBmYWxzZSwgbWVtYmVyLCBtZW1iZXJfcmVxKTsKKyAgICB9CisgIH0KKworICAvLyB3cml0ZSBzdHJ1Y3QgZm9vdGVyIHRvIG91dHB1dCBwcm90b2NvbAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3VuaW9uX3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZ1bmlvbl9uYW1lLCB0X3N0cnVjdCAqdHN0cnVjdCkgeworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJwdWIgZm4gd3JpdGVfdG9fb3V0X3Byb3RvY29sKCZzZWxmLCBvX3Byb3Q6ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyB3cml0ZSBzdHJ1Y3QgaGVhZGVyIHRvIG91dHB1dCBwcm90b2NvbAorICAvLyBub3RlOiB1c2UgdGhlICpvcmlnaW5hbCogc3RydWN0IG5hbWUgaGVyZQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBzdHJ1Y3RfaWRlbnQgPSBUU3RydWN0SWRlbnRpZmllcjo6bmV3KFwiIiArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiXCIpOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZzdHJ1Y3RfaWRlbnQpPzsiIDw8IGVuZGw7CisKKyAgLy8gd3JpdGUgdGhlIGVudW0gZmllbGQgdG8gdGhlIG91dHB1dCBwcm90b2NvbAorICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm1hdGNoICpzZWxmIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtYmVyc19pdGVyOworICAgIGZvcihtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgICAgdF9maWVsZDo6ZV9yZXEgbWVtYmVyX3JlcSA9IHRfZmllbGQ6OlRfUkVRVUlSRUQ7CisgICAgICB0X3R5cGUqIHR0eXBlID0gbWVtYmVyLT5nZXRfdHlwZSgpOworICAgICAgc3RyaW5nIG1hdGNoX3ZhcigodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0dHlwZS0+aXNfc3RyaW5nKCkpID8gImYiIDogInJlZiBmIik7CisgICAgICBmX2dlbl8KKyAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgdW5pb25fbmFtZSA8PCAiOjoiIDw8IHJ1c3RfdW5pb25fZmllbGRfbmFtZShtZW1iZXIpCisgICAgICAgIDw8ICIoIiA8PCBtYXRjaF92YXIgPDwgIikgPT4geyIKKyAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgcmVuZGVyX3N0cnVjdF9maWVsZF9zeW5jX3dyaXRlKCJmIiwgdHJ1ZSwgbWVtYmVyLCBtZW1iZXJfcmVxKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIHdyaXRlIHN0cnVjdCBmb290ZXIgdG8gb3V0cHV0IHByb3RvY29sCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3RydWN0X2ZpZWxkX3N5bmNfd3JpdGUoCisgIGNvbnN0IHN0cmluZyAmZmllbGRfdmFyLAorICBib29sIGZpZWxkX3Zhcl9pc19yZWYsCisgIHRfZmllbGQgKnRmaWVsZCwKKyAgdF9maWVsZDo6ZV9yZXEgcmVxCispIHsKKyAgdF90eXBlKiBmaWVsZF90eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICB0X3R5cGUqIGFjdHVhbF90eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZF90eXBlKTsKKworICBvc3RyaW5nc3RyZWFtIGZpZWxkX3N0cmVhbTsKKyAgZmllbGRfc3RyZWFtCisgICAgPDwgIlRGaWVsZElkZW50aWZpZXI6Om5ldygiCisgICAgPDwgIlwiIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIlwiIiA8PCAiLCAiIC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgICA8PCB0b19ydXN0X2ZpZWxkX3R5cGVfZW51bShmaWVsZF90eXBlKSA8PCAiLCAiCisgICAgPDwgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIikiOworICBzdHJpbmcgZmllbGRfaWRlbnRfc3RyaW5nID0gZmllbGRfc3RyZWFtLnN0cigpOworCisgIGlmIChpc19vcHRpb25hbChyZXEpKSB7CisgICAgc3RyaW5nIGxldF92YXIoKGFjdHVhbF90eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhYWN0dWFsX3R5cGUtPmlzX3N0cmluZygpKSA/ICJmbGRfdmFyIiA6ICJyZWYgZmxkX3ZhciIpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaWYgbGV0IFNvbWUoIiA8PCBsZXRfdmFyIDw8ICIpID0gIiA8PCBmaWVsZF92YXIgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCYiIDw8IGZpZWxkX2lkZW50X3N0cmluZyA8PCAiKT87IiA8PCBlbmRsOworICAgIHJlbmRlcl90eXBlX3N5bmNfd3JpdGUoImZsZF92YXIiLCB0cnVlLCBmaWVsZF90eXBlKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9maWVsZF9lbmQoKT87IiA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiKCkiIDw8IGVuZGw7IC8vIEZJWE1FOiByZW1vdmUgdGhpcyBleHRyYW5lb3VzICcoKScKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7IC8vIEZJWE1FOiByZW1vdmUgZWxzZSBicmFuY2gKKyAgICBpbmRlbnRfdXAoKTsKKyAgICAvKiBGSVhNRTogcmV0aGluayBob3cgSSBkZWFsIHdpdGggT1BUX0lOX1JFUV9PVVQKKyAgICBpZiAocmVxID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGZpZWxkX2lkZW50ID0gIiA8PCBmaWVsZF9pZGVudF9zdHJpbmcgPDwgIjsiIDw8IGVuZGw7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnQpPzsiIDw8IGVuZGw7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9maWVsZF9lbmQoKT87IiA8PCBlbmRsOworICAgIH0qLworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiKCkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJiIgPDwgZmllbGRfaWRlbnRfc3RyaW5nIDw8ICIpPzsiIDw8IGVuZGw7CisgICAgcmVuZGVyX3R5cGVfc3luY193cml0ZShmaWVsZF92YXIsIGZpZWxkX3Zhcl9pc19yZWYsIHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCk/OyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdHlwZV9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmdHlwZV92YXIsIGJvb2wgdHlwZV92YXJfaXNfcmVmLCB0X3R5cGUgKnR0eXBlKSB7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2VfdHlwZSA9ICh0X2Jhc2VfdHlwZSopdHR5cGU7CisgICAgc3dpdGNoICh0YmFzZV90eXBlLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNhbm5vdCB3cml0ZSBmaWVsZCBvZiB0eXBlIFRZUEVfVk9JRCB0byBvdXRwdXQgcHJvdG9jb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOiB7CisgICAgICBzdHJpbmcgcmVmKHR5cGVfdmFyX2lzX3JlZiA/ICIiIDogIiYiKTsKKyAgICAgIGlmICh0YmFzZV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9ieXRlcygiICsgcmVmICsgdHlwZV92YXIgKyAiKT87IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfc3RyaW5nKCIgKyByZWYgKyB0eXBlX3ZhciArICIpPzsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2Jvb2woIiArIHR5cGVfdmFyICsgIik/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfaTgoIiArIHR5cGVfdmFyICsgIik/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2kxNigiICsgdHlwZV92YXIgKyAiKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfaTMyKCIgKyB0eXBlX3ZhciArICIpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9pNjQoIiArIHR5cGVfdmFyICsgIik/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2RvdWJsZSgiICsgdHlwZV92YXIgKyAiLmludG8oKSk/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHRfdHlwZWRlZiogdHR5cGVkZWYgPSAodF90eXBlZGVmKikgdHR5cGU7CisgICAgcmVuZGVyX3R5cGVfc3luY193cml0ZSh0eXBlX3ZhciwgdHlwZV92YXJfaXNfcmVmLCB0dHlwZWRlZi0+Z2V0X3R5cGUoKSk7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHR5cGVfdmFyICsgIi53cml0ZV90b19vdXRfcHJvdG9jb2wob19wcm90KT87IiA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZW5kZXJfbWFwX3N5bmNfd3JpdGUodHlwZV92YXIsIHR5cGVfdmFyX2lzX3JlZiwgKHRfbWFwICopIHR0eXBlKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmVuZGVyX3NldF9zeW5jX3dyaXRlKHR5cGVfdmFyLCB0eXBlX3Zhcl9pc19yZWYsICh0X3NldCAqKSB0dHlwZSk7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZW5kZXJfbGlzdF9zeW5jX3dyaXRlKHR5cGVfdmFyLCB0eXBlX3Zhcl9pc19yZWYsICh0X2xpc3QgKikgdHR5cGUpOworICAgIHJldHVybjsKKyAgfQorCisgIHRocm93ICJjYW5ub3Qgd3JpdGUgdW5zdXBwb3J0ZWQgdHlwZSAiICsgdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9saXN0X3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZsaXN0X3ZhciwgYm9vbCBsaXN0X3Zhcl9pc19yZWYsIHRfbGlzdCAqdGxpc3QpIHsKKyAgdF90eXBlKiBlbGVtX3R5cGUgPSB0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgIm9fcHJvdC53cml0ZV9saXN0X2JlZ2luKCIKKyAgICA8PCAiJlRMaXN0SWRlbnRpZmllcjo6bmV3KCIKKyAgICA8PCB0b19ydXN0X2ZpZWxkX3R5cGVfZW51bShlbGVtX3R5cGUpIDw8ICIsICIKKyAgICA8PCBsaXN0X3ZhciA8PCAiLmxlbigpIGFzIGkzMiIgPDwgIikiCisgICAgPDwgIik/OyIKKyAgICA8PCBlbmRsOworCisgIHN0cmluZyByZWYobGlzdF92YXJfaXNfcmVmID8gIiIgOiAiJiIpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZvciBlIGluICIgPDwgcmVmIDw8IGxpc3RfdmFyIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90eXBlX3N5bmNfd3JpdGUoc3RyaW5nX2NvbnRhaW5lcl93cml0ZV92YXJpYWJsZShlbGVtX3R5cGUsICJlIiksIHRydWUsIGVsZW1fdHlwZSk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2xpc3RfZW5kKCk/OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc2V0X3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZzZXRfdmFyLCBib29sIHNldF92YXJfaXNfcmVmLCB0X3NldCAqdHNldCkgeworICB0X3R5cGUqIGVsZW1fdHlwZSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJvX3Byb3Qud3JpdGVfc2V0X2JlZ2luKCIKKyAgICA8PCAiJlRTZXRJZGVudGlmaWVyOjpuZXcoIgorICAgIDw8IHRvX3J1c3RfZmllbGRfdHlwZV9lbnVtKGVsZW1fdHlwZSkgPDwgIiwgIgorICAgIDw8IHNldF92YXIgPDwgIi5sZW4oKSBhcyBpMzIiIDw8ICIpIgorICAgIDw8ICIpPzsiCisgICAgPDwgZW5kbDsKKworICBzdHJpbmcgcmVmKHNldF92YXJfaXNfcmVmID8gIiIgOiAiJiIpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZvciBlIGluICIgPDwgcmVmIDw8IHNldF92YXIgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3R5cGVfc3luY193cml0ZShzdHJpbmdfY29udGFpbmVyX3dyaXRlX3ZhcmlhYmxlKGVsZW1fdHlwZSwgImUiKSwgdHJ1ZSwgZWxlbV90eXBlKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfc2V0X2VuZCgpPzsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX21hcF9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmbWFwX3ZhciwgYm9vbCBtYXBfdmFyX2lzX3JlZiwgdF9tYXAgKnRtYXApIHsKKyAgdF90eXBlKiBrZXlfdHlwZSA9IHRtYXAtPmdldF9rZXlfdHlwZSgpOworICB0X3R5cGUqIHZhbF90eXBlID0gdG1hcC0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAib19wcm90LndyaXRlX21hcF9iZWdpbigiCisgICAgPDwgIiZUTWFwSWRlbnRpZmllcjo6bmV3KCIKKyAgICA8PCB0b19ydXN0X2ZpZWxkX3R5cGVfZW51bShrZXlfdHlwZSkgPDwgIiwgIgorICAgIDw8IHRvX3J1c3RfZmllbGRfdHlwZV9lbnVtKHZhbF90eXBlKSA8PCAiLCAiCisgICAgPDwgbWFwX3ZhciA8PCAiLmxlbigpIGFzIGkzMikiCisgICAgPDwgIik/OyIKKyAgICA8PCBlbmRsOworCisgIHN0cmluZyByZWYobWFwX3Zhcl9pc19yZWYgPyAiIiA6ICImIik7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm9yIChrLCB2KSBpbiAiIDw8IHJlZiA8PCBtYXBfdmFyIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90eXBlX3N5bmNfd3JpdGUoc3RyaW5nX2NvbnRhaW5lcl93cml0ZV92YXJpYWJsZShrZXlfdHlwZSwgImsiKSwgdHJ1ZSwga2V5X3R5cGUpOworICByZW5kZXJfdHlwZV9zeW5jX3dyaXRlKHN0cmluZ19jb250YWluZXJfd3JpdGVfdmFyaWFibGUodmFsX3R5cGUsICJ2IiksIHRydWUsIHZhbF90eXBlKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfbWFwX2VuZCgpPzsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzdHJpbmdfY29udGFpbmVyX3dyaXRlX3ZhcmlhYmxlKHRfdHlwZSogdHR5cGUsIGNvbnN0IHN0cmluZyYgYmFzZV92YXIpIHsKKyAgYm9vbCB0eXBlX25lZWRzX2RlcmVmID0gbmVlZHNfZGVyZWZfb25fY29udGFpbmVyX3dyaXRlKHR0eXBlKTsKKyAgYm9vbCB0eXBlX2lzX2RvdWJsZSA9IGlzX2RvdWJsZSh0dHlwZSk7CisKKyAgc3RyaW5nIHdyaXRlX3ZhcmlhYmxlOworCisgIGlmICh0eXBlX2lzX2RvdWJsZSAmJiB0eXBlX25lZWRzX2RlcmVmKSB7CisgICAgd3JpdGVfdmFyaWFibGUgPSAiKCoiICsgYmFzZV92YXIgKyAiKSI7CisgIH0gZWxzZSBpZiAodHlwZV9uZWVkc19kZXJlZikgeworICAgIHdyaXRlX3ZhcmlhYmxlID0gIioiICsgYmFzZV92YXI7CisgIH0gZWxzZSB7CisgICAgd3JpdGVfdmFyaWFibGUgPSBiYXNlX3ZhcjsKKyAgfQorCisgIHJldHVybiB3cml0ZV92YXJpYWJsZTsKK30KKworYm9vbCB0X3JzX2dlbmVyYXRvcjo6bmVlZHNfZGVyZWZfb25fY29udGFpbmVyX3dyaXRlKHRfdHlwZSogdHR5cGUpIHsKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgcmV0dXJuIHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHR5cGUtPmlzX3N0cmluZygpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU3luYyBTdHJ1Y3QgUmVhZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N0cnVjdF9zeW5jX3JlYWQoCisgICAgY29uc3Qgc3RyaW5nICZzdHJ1Y3RfbmFtZSwKKyAgICB0X3N0cnVjdCAqdHN0cnVjdCwgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKykgeworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8IHZpc2liaWxpdHlfcXVhbGlmaWVyKHN0cnVjdF90eXBlKQorICAgIDw8ICJmbiByZWFkX2Zyb21faW5fcHJvdG9jb2woaV9wcm90OiAmbXV0IFRJbnB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwiIDw8IHN0cnVjdF9uYW1lIDw8ICI+IHsiCisgICAgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpPzsiIDw8IGVuZGw7CisKKyAgLy8gY3JlYXRlIHRlbXBvcmFyeSB2YXJpYWJsZXM6IG9uZSBmb3IgZWFjaCBmaWVsZCBpbiB0aGUgc3RydWN0CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgdF9maWVsZDo6ZV9yZXEgbWVtYmVyX3JlcSA9IGFjdHVhbF9maWVsZF9yZXEobWVtYmVyLCBzdHJ1Y3RfdHlwZSk7CisKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAibGV0IG11dCAiIDw8IHN0cnVjdF9maWVsZF9yZWFkX3RlbXBfdmFyaWFibGUobWVtYmVyKQorICAgICAgPDwgIjogT3B0aW9uPCIgPDwgdG9fcnVzdF90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSkgPDwgIj4gPSAiOworICAgICAgaWYgKG1lbWJlcl9yZXEgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgeworICAgICAgICBmX2dlbl8gPDwgb3B0X2luX3JlcV9vdXRfdmFsdWUobWVtYmVyLT5nZXRfdHlwZSgpKSA8PCAiOyI7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX2dlbl8gPDwgIk5vbmU7IjsKKyAgICAgIH0KKyAgICAgIGZfZ2VuXyA8PCBlbmRsOworICB9CisKKyAgLy8gbm93IGxvb3AgdGhyb3VnaCB0aGUgZmllbGRzIHdlJ3ZlIHJlY2VpdmVkCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibG9vcCB7IiA8PCBlbmRsOyAvLyBzdGFydCBsb29wCisgIGluZGVudF91cCgpOworCisgIC8vIGJyZWFrIG91dCBpZiB5b3UndmUgZm91bmQgdGhlIFN0b3AgZmllbGQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgZmllbGRfaWRlbnQgPSBpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaWYgZmllbGRfaWRlbnQuZmllbGRfdHlwZSA9PSBUVHlwZTo6U3RvcCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBub3cgcmVhZCBhbGwgdGhlIGZpZWxkcyBmb3VuZAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBmaWVsZF9pZCA9IGZpZWxkX2lkKCZmaWVsZF9pZGVudCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJtYXRjaCBmaWVsZF9pZCB7IiA8PCBlbmRsOyAvLyBzdGFydCBtYXRjaAorICBpbmRlbnRfdXAoKTsKKworICBmb3IgKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogdGZpZWxkID0gKCptZW1iZXJzX2l0ZXIpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCB0ZmllbGQtPmdldF9rZXkoKSA8PCAiID0+IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgcmVuZGVyX3R5cGVfc3luY19yZWFkKCJ2YWwiLCB0ZmllbGQtPmdldF90eXBlKCkpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBzdHJ1Y3RfZmllbGRfcmVhZF90ZW1wX3ZhcmlhYmxlKHRmaWVsZCkgPDwgIiA9IFNvbWUodmFsKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworICB9CisKKyAgLy8gZGVmYXVsdCBjYXNlIChza2lwIGZpZWxkcykKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJfID0+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5za2lwKGZpZWxkX2lkZW50LmZpZWxkX3R5cGUpPzsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsgLy8gZmluaXNoIG1hdGNoCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnJlYWRfZmllbGRfZW5kKCk/OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOyAvLyBmaW5pc2ggbG9vcAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKT87IiA8PCBlbmRsOyAvLyByZWFkIG1lc3NhZ2UgZm9vdGVyIGZyb20gdGhlIHdpcmUKKworICAvLyB2ZXJpZnkgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGV4aXN0CisgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0ZmllbGQgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgdF9maWVsZDo6ZV9yZXEgcmVxID0gYWN0dWFsX2ZpZWxkX3JlcSh0ZmllbGQsIHN0cnVjdF90eXBlKTsKKyAgICBpZiAoIWlzX29wdGlvbmFsKHJlcSkpIHsKKyAgICAgIGZfZ2VuXworICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICA8PCAidmVyaWZ5X3JlcXVpcmVkX2ZpZWxkX2V4aXN0cygiCisgICAgICAgIDw8ICJcIiIgPDwgc3RydWN0X25hbWUgPDwgIi4iIDw8IHJ1c3RfZmllbGRfbmFtZSh0ZmllbGQpIDw8ICJcIiIKKyAgICAgICAgPDwgIiwgIgorICAgICAgICA8PCAiJiIgPDwgc3RydWN0X2ZpZWxkX3JlYWRfdGVtcF92YXJpYWJsZSh0ZmllbGQpCisgICAgICAgIDw8ICIpPzsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gY29uc3RydWN0IHRoZSBzdHJ1Y3QKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID09IDApIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCByZXQgPSAiIDw8IHN0cnVjdF9uYW1lIDw8ICIge307IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJldCA9ICIgPDwgc3RydWN0X25hbWUgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgICAgdF9maWVsZCogdGZpZWxkID0gKCptZW1iZXJzX2l0ZXIpOworICAgICAgdF9maWVsZDo6ZV9yZXEgcmVxID0gYWN0dWFsX2ZpZWxkX3JlcSh0ZmllbGQsIHN0cnVjdF90eXBlKTsKKyAgICAgIHN0cmluZyBmaWVsZF9uYW1lKHJ1c3RfZmllbGRfbmFtZSh0ZmllbGQpKTsKKyAgICAgIHN0cmluZyBmaWVsZF9rZXkgPSBzdHJ1Y3RfZmllbGRfcmVhZF90ZW1wX3ZhcmlhYmxlKHRmaWVsZCk7CisgICAgICBpZiAoaXNfb3B0aW9uYWwocmVxKSkgeworICAgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgZmllbGRfbmFtZSA8PCAiOiAiIDw8IGZpZWxkX2tleSA8PCAiLCIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfZ2VuXworICAgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgZmllbGRfbmFtZQorICAgICAgICAgIDw8ICI6ICIKKyAgICAgICAgICA8PCBmaWVsZF9rZXkKKyAgICAgICAgICA8PCAiLmV4cGVjdChcImF1dG8tZ2VuZXJhdGVkIGNvZGUgc2hvdWxkIGhhdmUgY2hlY2tlZCBmb3IgcHJlc2VuY2Ugb2YgcmVxdWlyZWQgZmllbGRzXCIpIgorICAgICAgICAgIDw8ICIsIgorICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsOworICB9CisKKyAgLy8gcmV0dXJuIHRoZSBjb25zdHJ1Y3RlZCB2YWx1ZQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIk9rKHJldCkiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdW5pb25fc3luY19yZWFkKGNvbnN0IHN0cmluZyAmdW5pb25fbmFtZSwgdF9zdHJ1Y3QgKnRzdHJ1Y3QpIHsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAicHViIGZuIHJlYWRfZnJvbV9pbl9wcm90b2NvbChpX3Byb3Q6ICZtdXQgVElucHV0UHJvdG9jb2wpIC0+IHRocmlmdDo6UmVzdWx0PCIgPDwgdW5pb25fbmFtZSA8PCAiPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIGNyZWF0ZSB0ZW1wb3JhcnkgdmFyaWFibGVzIHRvIGhvbGQgdGhlCisgIC8vIGNvbXBsZXRlZCB1bmlvbiBhcyB3ZWxsIGFzIGEgY291bnQgb2YgZmllbGRzIHJlYWQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgbXV0IHJldDogT3B0aW9uPCIgPDwgdW5pb25fbmFtZSA8PCAiPiA9IE5vbmU7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBtdXQgcmVjZWl2ZWRfZmllbGRfY291bnQgPSAwOyIgPDwgZW5kbDsKKworICAvLyByZWFkIHRoZSBzdHJ1Y3QgcHJlYW1ibGUKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKT87IiA8PCBlbmRsOworCisgIC8vIG5vdyBsb29wIHRocm91Z2ggdGhlIGZpZWxkcyB3ZSd2ZSByZWNlaXZlZAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxvb3AgeyIgPDwgZW5kbDsgLy8gc3RhcnQgbG9vcAorICBpbmRlbnRfdXAoKTsKKworICAvLyBicmVhayBvdXQgaWYgeW91J3ZlIGZvdW5kIHRoZSBTdG9wIGZpZWxkCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGZpZWxkX2lkZW50ID0gaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlmIGZpZWxkX2lkZW50LmZpZWxkX3R5cGUgPT0gVFR5cGU6OlN0b3AgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gbm93IHJlYWQgYWxsIHRoZSBmaWVsZHMgZm91bmQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgZmllbGRfaWQgPSBmaWVsZF9pZCgmZmllbGRfaWRlbnQpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibWF0Y2ggZmllbGRfaWQgeyIgPDwgZW5kbDsgLy8gc3RhcnQgbWF0Y2gKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKyAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgbWVtYmVyLT5nZXRfa2V5KCkgPDwgIiA9PiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHJlbmRlcl90eXBlX3N5bmNfcmVhZCgidmFsIiwgbWVtYmVyLT5nZXRfdHlwZSgpKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlmIHJldC5pc19ub25lKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAicmV0ID0gU29tZSgiIDw8IHVuaW9uX25hbWUgPDwgIjo6IiA8PCBydXN0X3VuaW9uX2ZpZWxkX25hbWUobWVtYmVyKSA8PCAiKHZhbCkpOyIKKyAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJyZWNlaXZlZF9maWVsZF9jb3VudCArPSAxOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisgIH0KKworICAvLyBkZWZhdWx0IGNhc2UgKHNraXAgZmllbGRzKQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIl8gPT4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnNraXAoZmllbGRfaWRlbnQuZmllbGRfdHlwZSk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJyZWNlaXZlZF9maWVsZF9jb3VudCArPSAxOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsOyAvLyBmaW5pc2ggbWF0Y2gKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9maWVsZF9lbmQoKT87IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7IC8vIGZpbmlzaCBsb29wCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpPzsiIDw8IGVuZGw7IC8vIGZpbmlzaCByZWFkaW5nIG1lc3NhZ2UgZnJvbSB3aXJlCisKKyAgLy8gcmV0dXJuIHRoZSB2YWx1ZSBvciBhbiBlcnJvcgorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlmIHJlY2VpdmVkX2ZpZWxkX2NvdW50ID09IDAgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90aHJpZnRfZXJyb3IoCisgICAgIlByb3RvY29sIiwKKyAgICAiUHJvdG9jb2xFcnJvciIsCisgICAgIlByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSIsCisgICAgIlwicmVjZWl2ZWQgZW1wdHkgdW5pb24gZnJvbSByZW1vdGUgIiArIHVuaW9uX25hbWUgKyAiXCIiCisgICk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIGlmIHJlY2VpdmVkX2ZpZWxkX2NvdW50ID4gMSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3RocmlmdF9lcnJvcigKKyAgICAiUHJvdG9jb2wiLAorICAgICJQcm90b2NvbEVycm9yIiwKKyAgICAiUHJvdG9jb2xFcnJvcktpbmQ6OkludmFsaWREYXRhIiwKKyAgICAiXCJyZWNlaXZlZCBtdWx0aXBsZSBmaWVsZHMgZm9yIHVuaW9uIGZyb20gcmVtb3RlICIgKyB1bmlvbl9uYW1lICsgIlwiIgorICApOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJPayhyZXQuZXhwZWN0KFwicmV0dXJuIHZhbHVlIHNob3VsZCBoYXZlIGJlZW4gY29uc3RydWN0ZWRcIikpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCisvLyBDb25zdHJ1Y3QgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYWxsIHN1cHBvcnRlZCB0eXBlcyBmcm9tIHRoZSB3aXJlLgordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3R5cGVfc3luY19yZWFkKGNvbnN0IHN0cmluZyAmdHlwZV92YXIsIHRfdHlwZSAqdHR5cGUsIGJvb2wgaXNfYm94ZWQpIHsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZV90eXBlID0gKHRfYmFzZV90eXBlKil0dHlwZTsKKyAgICBzd2l0Y2ggKHRiYXNlX3R5cGUtPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiY2Fubm90IHJlYWQgZmllbGQgb2YgdHlwZSBUWVBFX1ZPSUQgZnJvbSBpbnB1dCBwcm90b2NvbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gaV9wcm90LnJlYWRfYnl0ZXMoKT87IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gaV9wcm90LnJlYWRfc3RyaW5nKCk/OyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHR5cGVfdmFyIDw8ICIgPSBpX3Byb3QucmVhZF9ib29sKCk/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gaV9wcm90LnJlYWRfaTgoKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gaV9wcm90LnJlYWRfaTE2KCk/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9IGlfcHJvdC5yZWFkX2kzMigpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHR5cGVfdmFyIDw8ICIgPSBpX3Byb3QucmVhZF9pNjQoKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gT3JkZXJlZEZsb2F0Ojpmcm9tKGlfcHJvdC5yZWFkX2RvdWJsZSgpPyk7IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgLy8gRklYTUU6IG5vdCBhIGZhbiBvZiBzZXBhcmF0ZSBgaXNfYm94ZWRgIHBhcmFtZXRlcgorICAgIC8vIFRoaXMgaXMgcHJvYmxlbWF0aWMgYmVjYXVzZSBpdCdzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciwgYW5kIG9ubHkgY29tZXMKKyAgICAvLyBpbnRvIHBsYXkgb25jZS4gVGhlIGNvcmUgaXNzdWUgaXMgdGhhdCBJIGxvc2UgYW4gaW1wb3J0YW50IHBpZWNlIG9mIHR5cGUKKyAgICAvLyBpbmZvcm1hdGlvbiAod2hldGhlciB0aGUgdHlwZSBpcyBhIGZ3ZCByZWYpIGJ5IHVud3JhcHBpbmcgdGhlIHR5cGVkZWYnZAorICAgIC8vIHR5cGUgYW5kIG1ha2luZyB0aGUgcmVjdXJzaXZlIGNhbGwgdXNpbmcgaXQuIEkgY2FuJ3QgbW9kaWZ5IG9yIHdyYXAgdGhlCisgICAgLy8gZ2VuZXJhdGVkIHN0cmluZyBhZnRlciB0aGUgZmFjdCBiZWNhdXNlIGl0J3Mgd3JpdHRlbiBkaXJlY3RseSBpbnRvIHRoZSBmaWxlLAorICAgIC8vIHNvIEkgaGF2ZSB0byBwYXNzIHRoaXMgcGFyYW1ldGVyIGFsb25nLiBHb2luZyB3aXRoIHRoaXMgYXBwcm9hY2ggYmVjYXVzZSBpdAorICAgIC8vIHNlZW1zIGxpa2UgdGhlIGxvd2VzdC1jb3N0IG9wdGlvbiB0byBlYXNpbHkgc3VwcG9ydCByZWN1cnNpdmUgdHlwZXMuCisgICAgdF90eXBlZGVmKiB0dHlwZWRlZiA9ICh0X3R5cGVkZWYqKXR0eXBlOworICAgIHJlbmRlcl90eXBlX3N5bmNfcmVhZCh0eXBlX3ZhciwgdHR5cGVkZWYtPmdldF90eXBlKCksIHR0eXBlZGVmLT5pc19mb3J3YXJkX3R5cGVkZWYoKSk7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgc3RyaW5nIHJlYWRfY2FsbCh0b19ydXN0X3R5cGUodHR5cGUpICsgIjo6cmVhZF9mcm9tX2luX3Byb3RvY29sKGlfcHJvdCk/Iik7CisgICAgcmVhZF9jYWxsID0gaXNfYm94ZWQgPyAiQm94OjpuZXcoIiArIHJlYWRfY2FsbCArICIpIiA6IHJlYWRfY2FsbDsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9ICIgPDwgIHJlYWRfY2FsbCA8PCAiOyIKKyAgICAgIDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJlbmRlcl9tYXBfc3luY19yZWFkKCh0X21hcCAqKSB0dHlwZSwgdHlwZV92YXIpOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZW5kZXJfc2V0X3N5bmNfcmVhZCgodF9zZXQgKikgdHR5cGUsIHR5cGVfdmFyKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJlbmRlcl9saXN0X3N5bmNfcmVhZCgodF9saXN0ICopIHR0eXBlLCB0eXBlX3Zhcik7CisgICAgcmV0dXJuOworICB9CisKKyAgdGhyb3cgImNhbm5vdCByZWFkIHVuc3VwcG9ydGVkIHR5cGUgIiArIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCisvLyBDb25zdHJ1Y3QgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYSBsaXN0IGZyb20gdGhlIHdpcmUuCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfbGlzdF9zeW5jX3JlYWQodF9saXN0ICp0bGlzdCwgY29uc3Qgc3RyaW5nICZsaXN0X3ZhcikgeworICB0X3R5cGUqIGVsZW1fdHlwZSA9IHRsaXN0LT5nZXRfZWxlbV90eXBlKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgbGlzdF9pZGVudCA9IGlfcHJvdC5yZWFkX2xpc3RfYmVnaW4oKT87IiA8PCBlbmRsOworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJsZXQgbXV0ICIgPDwgbGlzdF92YXIgPDwgIjogIiA8PCB0b19ydXN0X3R5cGUoKHRfdHlwZSopIHRsaXN0KQorICAgIDw8ICIgPSBWZWM6OndpdGhfY2FwYWNpdHkobGlzdF9pZGVudC5zaXplIGFzIHVzaXplKTsiCisgICAgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmb3IgXyBpbiAwLi5saXN0X2lkZW50LnNpemUgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbGlzdF9lbGVtX3ZhciA9IHRtcCgibGlzdF9lbGVtXyIpOworICByZW5kZXJfdHlwZV9zeW5jX3JlYWQobGlzdF9lbGVtX3ZhciwgZWxlbV90eXBlKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGxpc3RfdmFyIDw8ICIucHVzaCgiIDw8IGxpc3RfZWxlbV92YXIgPDwgIik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX2xpc3RfZW5kKCk/OyIgPDwgZW5kbDsKK30KKworLy8gQ29uc3RydWN0IHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGEgc2V0IGZyb20gdGhlIHdpcmUuCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc2V0X3N5bmNfcmVhZCh0X3NldCAqdHNldCwgY29uc3Qgc3RyaW5nICZzZXRfdmFyKSB7CisgIHRfdHlwZSogZWxlbV90eXBlID0gdHNldC0+Z2V0X2VsZW1fdHlwZSgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHNldF9pZGVudCA9IGlfcHJvdC5yZWFkX3NldF9iZWdpbigpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImxldCBtdXQgIiA8PCBzZXRfdmFyIDw8ICI6ICIgPDwgdG9fcnVzdF90eXBlKCh0X3R5cGUqKSB0c2V0KQorICAgIDw8ICIgPSBCVHJlZVNldDo6bmV3KCk7IgorICAgIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm9yIF8gaW4gMC4uc2V0X2lkZW50LnNpemUgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgc2V0X2VsZW1fdmFyID0gdG1wKCJzZXRfZWxlbV8iKTsKKyAgcmVuZGVyX3R5cGVfc3luY19yZWFkKHNldF9lbGVtX3ZhciwgZWxlbV90eXBlKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHNldF92YXIgPDwgIi5pbnNlcnQoIiA8PCBzZXRfZWxlbV92YXIgPDwgIik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX3NldF9lbmQoKT87IiA8PCBlbmRsOworfQorCisvLyBDb25zdHJ1Y3QgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYSBtYXAgZnJvbSB0aGUgd2lyZS4KK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9tYXBfc3luY19yZWFkKHRfbWFwICp0bWFwLCBjb25zdCBzdHJpbmcgJm1hcF92YXIpIHsKKyAgdF90eXBlKiBrZXlfdHlwZSA9IHRtYXAtPmdldF9rZXlfdHlwZSgpOworICB0X3R5cGUqIHZhbF90eXBlID0gdG1hcC0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgbWFwX2lkZW50ID0gaV9wcm90LnJlYWRfbWFwX2JlZ2luKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAibGV0IG11dCAiIDw8IG1hcF92YXIgPDwgIjogIiA8PCB0b19ydXN0X3R5cGUoKHRfdHlwZSopIHRtYXApCisgICAgPDwgIiA9IEJUcmVlTWFwOjpuZXcoKTsiCisgICAgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmb3IgXyBpbiAwLi5tYXBfaWRlbnQuc2l6ZSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBrZXlfZWxlbV92YXIgPSB0bXAoIm1hcF9rZXlfIik7CisgIHJlbmRlcl90eXBlX3N5bmNfcmVhZChrZXlfZWxlbV92YXIsIGtleV90eXBlKTsKKyAgc3RyaW5nIHZhbF9lbGVtX3ZhciA9IHRtcCgibWFwX3ZhbF8iKTsKKyAgcmVuZGVyX3R5cGVfc3luY19yZWFkKHZhbF9lbGVtX3ZhciwgdmFsX3R5cGUpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgbWFwX3ZhciA8PCAiLmluc2VydCgiIDw8IGtleV9lbGVtX3ZhciA8PCAiLCAiIDw8IHZhbF9lbGVtX3ZhciA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnJlYWRfbWFwX2VuZCgpPzsiIDw8IGVuZGw7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c3RydWN0X2ZpZWxkX3JlYWRfdGVtcF92YXJpYWJsZSh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGZvc3M7CisgIGZvc3MgPDwgImZfIiA8PCB0ZmllbGQtPmdldF9rZXkoKTsKKyAgcmV0dXJuIGZvc3Muc3RyKCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTeW5jIENsaWVudAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHJlbmRlcl9zeW5jX2NsaWVudCh0c2VydmljZSk7CisgIHJlbmRlcl9zeW5jX3Byb2Nlc3Nvcih0c2VydmljZSk7CisgIHJlbmRlcl9zZXJ2aWNlX2NhbGxfc3RydWN0cyh0c2VydmljZSk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zZXJ2aWNlX2NhbGxfc3RydWN0cyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZ1bmNfaXRlcjsKKworICAvLyB0aHJpZnQgYXJncyBmb3Igc2VydmljZSBjYWxscyBhcmUgcGFja2VkCisgIC8vIGludG8gYSBzdHJ1Y3QgdGhhdCdzIHRyYW5zbWl0dGVkIG92ZXIgdGhlIHdpcmUsIHNvCisgIC8vIGdlbmVyYXRlIHN0cnVjdHMgZm9yIHRob3NlIHRvbworICAvLworICAvLyB0aHJpZnQgcmV0dXJucyBhcmUgKmFsc28qIHBhY2tlZCBpbnRvIGEgc3RydWN0CisgIC8vIHRoYXQncyBwYXNzZWQgb3ZlciB0aGUgd2lyZSwgc28sIGdlbmVyYXRlIHRoZSBzdHJ1Y3QKKyAgLy8gZm9yIHRoYXQgdG9vLiBOb3RlIHRoYXQgdGhpcyByZXN1bHQgc3RydWN0ICphbHNvKgorICAvLyBjb250YWlucyB0aGUgZXhjZXB0aW9ucyBhcyB3ZWxsCisgIGZvcihmdW5jX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY19pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jX2l0ZXIpIHsKKyAgICB0X2Z1bmN0aW9uKiB0ZnVuYyA9ICgqZnVuY19pdGVyKTsKKyAgICByZW5kZXJfc2VydmljZV9jYWxsX2FyZ3Nfc3RydWN0KHRmdW5jKTsKKyAgICBpZiAoIXRmdW5jLT5pc19vbmV3YXkoKSkgeworICAgICAgcmVuZGVyX3NlcnZpY2VfY2FsbF9yZXN1bHRfdmFsdWVfc3RydWN0KHRmdW5jKTsKKyAgICB9CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGNsaWVudF9pbXBsX25hbWUocnVzdF9zeW5jX2NsaWVudF9pbXBsX25hbWUodHNlcnZpY2UpKTsKKworICByZW5kZXJfdHlwZV9jb21tZW50KHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIiBzZXJ2aWNlIGNsaWVudCIpOyAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgIHJlbmRlcl9zeW5jX2NsaWVudF90cmFpdCh0c2VydmljZSk7CisgIHJlbmRlcl9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXQodHNlcnZpY2UpOworICByZW5kZXJfc3luY19jbGllbnRfZGVmaW5pdGlvbl9hbmRfaW1wbChjbGllbnRfaW1wbF9uYW1lKTsKKyAgcmVuZGVyX3N5bmNfY2xpZW50X3R0aHJpZnRjbGllbnRfaW1wbChjbGllbnRfaW1wbF9uYW1lKTsKKyAgcmVuZGVyX3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9pbXBscyh0c2VydmljZSwgY2xpZW50X2ltcGxfbmFtZSk7IGZfZ2VuXyA8PCBlbmRsOworICByZW5kZXJfc3luY19jbGllbnRfcHJvY2Vzc19pbXBsKHRzZXJ2aWNlKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfY2xpZW50X3RyYWl0KHRfc2VydmljZSAqdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuc2lvbiA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpIHsKKyAgICB0X3NlcnZpY2UqIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgICBleHRlbnNpb24gPSAiIDogIiArIHJ1c3RfbmFtZXNwYWNlKGV4dGVuZHMpICsgcnVzdF9zeW5jX2NsaWVudF90cmFpdF9uYW1lKGV4dGVuZHMpOworICB9CisKKyAgcmVuZGVyX3J1c3Rkb2MoKHRfZG9jKikgdHNlcnZpY2UpOworICBmX2dlbl8gPDwgInB1YiB0cmFpdCAiIDw8IHJ1c3Rfc3luY19jbGllbnRfdHJhaXRfbmFtZSh0c2VydmljZSkgPDwgZXh0ZW5zaW9uIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZnVuY19pdGVyOworICBmb3IoZnVuY19pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmNfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY19pdGVyKSB7CisgICAgdF9mdW5jdGlvbiogdGZ1bmMgPSAoKmZ1bmNfaXRlcik7CisgICAgc3RyaW5nIGZ1bmNfbmFtZSA9IHNlcnZpY2VfY2FsbF9jbGllbnRfZnVuY3Rpb25fbmFtZSh0ZnVuYyk7CisgICAgc3RyaW5nIGZ1bmNfYXJncyA9IHJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfZGVjbGFyYXRpb24odGZ1bmMsIHRydWUpOworICAgIHN0cmluZyBmdW5jX3JldHVybiA9IHRvX3J1c3RfdHlwZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSk7CisgICAgcmVuZGVyX3J1c3Rkb2MoKHRfZG9jKikgdGZ1bmMpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gIiA8PCBmdW5jX25hbWUgPDwgIGZ1bmNfYXJncyA8PCAiIC0+IHRocmlmdDo6UmVzdWx0PCIgPDwgZnVuY19yZXR1cm4gPDwgIj47IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfY2xpZW50X21hcmtlcl90cmFpdCh0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicHViIHRyYWl0ICIgPDwgcnVzdF9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfbmFtZSh0c2VydmljZSkgPDwgIiB7fSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfaW1wbHModF9zZXJ2aWNlICp0c2VydmljZSwgY29uc3Qgc3RyaW5nICZpbXBsX3N0cnVjdF9uYW1lKSB7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImltcGwgIgorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUworICAgIDw8ICIgIgorICAgIDw8IHJ1c3RfbmFtZXNwYWNlKHRzZXJ2aWNlKSA8PCBydXN0X3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9uYW1lKHRzZXJ2aWNlKQorICAgIDw8ICIgZm9yICIKKyAgICA8PCBpbXBsX3N0cnVjdF9uYW1lIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUworICAgIDw8ICIgIgorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRTCisgICAgPDwgIiB7fSIKKyAgICA8PCBlbmRsOworCisgIHRfc2VydmljZSogZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kcykgeworICAgIHJlbmRlcl9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfaW1wbHMoZXh0ZW5kcywgaW1wbF9zdHJ1Y3RfbmFtZSk7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfY2xpZW50X2RlZmluaXRpb25fYW5kX2ltcGwoY29uc3Qgc3RyaW5nJiBjbGllbnRfaW1wbF9uYW1lKSB7CisKKyAgLy8gcmVuZGVyIHRoZSBkZWZpbml0aW9uIGZvciB0aGUgY2xpZW50IHN0cnVjdAorICBmX2dlbl8KKyAgICA8PCAicHViIHN0cnVjdCAiCisgICAgPDwgY2xpZW50X2ltcGxfbmFtZQorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUworICAgIDw8ICIgIgorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRTCisgICAgPDwgIiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIl9pX3Byb3Q6IElQLCIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJfb19wcm90OiBPUCwiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiX3NlcXVlbmNlX251bWJlcjogaTMyLCIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICAvLyByZW5kZXIgdGhlIHN0cnVjdCBpbXBsZW1lbnRhdGlvbgorICAvLyB0aGlzIGluY2x1ZGVzIHRoZSBuZXcoKSBmdW5jdGlvbiBhcyB3ZWxsIGFzIHRoZSBoZWxwZXIgc2VuZC9yZWN2IG1ldGhvZHMgZm9yIGVhY2ggc2VydmljZSBjYWxsCisgIGZfZ2VuXworICAgIDw8ICJpbXBsICIKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMKKyAgICA8PCAiICIKKyAgICA8PCBjbGllbnRfaW1wbF9uYW1lCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORF9WQVJTCisgICAgPDwgIiAiCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORFMKKyAgICA8PCAiIHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl9zeW5jX2NsaWVudF9saWZlY3ljbGVfZnVuY3Rpb25zKGNsaWVudF9pbXBsX25hbWUpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19jbGllbnRfbGlmZWN5Y2xlX2Z1bmN0aW9ucyhjb25zdCBzdHJpbmcmIGNsaWVudF9zdHJ1Y3QpIHsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAicHViIGZuIG5ldyhpbnB1dF9wcm90b2NvbDogSVAsIG91dHB1dF9wcm90b2NvbDogT1ApIC0+ICIKKyAgICA8PCBjbGllbnRfc3RydWN0CisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORF9WQVJTCisgICAgPDwgIiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgY2xpZW50X3N0cnVjdAorICAgIDw8ICIgeyBfaV9wcm90OiBpbnB1dF9wcm90b2NvbCwgX29fcHJvdDogb3V0cHV0X3Byb3RvY29sLCBfc2VxdWVuY2VfbnVtYmVyOiAwIH0iCisgICAgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2NsaWVudF90dGhyaWZ0Y2xpZW50X2ltcGwoY29uc3Qgc3RyaW5nICZjbGllbnRfaW1wbF9uYW1lKSB7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImltcGwgIgorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUworICAgIDw8ICIgVFRocmlmdENsaWVudCBmb3IgIgorICAgIDw8IGNsaWVudF9pbXBsX25hbWUKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMKKyAgICA8PCAiICIKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EUworICAgIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiBpX3Byb3RfbXV0KCZtdXQgc2VsZikgLT4gJm11dCBUSW5wdXRQcm90b2NvbCB7ICZtdXQgc2VsZi5faV9wcm90IH0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gb19wcm90X211dCgmbXV0IHNlbGYpIC0+ICZtdXQgVE91dHB1dFByb3RvY29sIHsgJm11dCBzZWxmLl9vX3Byb3QgfSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiBzZXF1ZW5jZV9udW1iZXIoJnNlbGYpIC0+IGkzMiB7IHNlbGYuX3NlcXVlbmNlX251bWJlciB9IiA8PCBlbmRsOworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJmbiBpbmNyZW1lbnRfc2VxdWVuY2VfbnVtYmVyKCZtdXQgc2VsZikgLT4gaTMyIHsgc2VsZi5fc2VxdWVuY2VfbnVtYmVyICs9IDE7IHNlbGYuX3NlcXVlbmNlX251bWJlciB9IgorICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfY2xpZW50X3Byb2Nlc3NfaW1wbCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBtYXJrZXJfZXh0ZW5zaW9uID0gIiIgKyBzeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRzX2Zvcl9leHRlbnNpb24odHNlcnZpY2UpOworCisgIGZfZ2VuXworICAgIDw8ICJpbXBsIDxDOiBUVGhyaWZ0Q2xpZW50ICsgIiA8PCBydXN0X3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9uYW1lKHRzZXJ2aWNlKSA8PCBtYXJrZXJfZXh0ZW5zaW9uIDw8ICI+ICIKKyAgICA8PCBydXN0X3N5bmNfY2xpZW50X3RyYWl0X25hbWUodHNlcnZpY2UpCisgICAgPDwgIiBmb3IgQyB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmdW5jX2l0ZXI7CisgIGZvcihmdW5jX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY19pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jX2l0ZXIpIHsKKyAgICB0X2Z1bmN0aW9uKiBmdW5jID0gKCpmdW5jX2l0ZXIpOworICAgIHJlbmRlcl9zeW5jX3NlbmRfcmVjdl93cmFwcGVyKGZ1bmMpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRzX2Zvcl9leHRlbnNpb24odF9zZXJ2aWNlICp0c2VydmljZSkgeworICBzdHJpbmcgbWFya2VyX2V4dGVuc2lvbjsKKworICB0X3NlcnZpY2UqIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHMpIHsKKyAgICBtYXJrZXJfZXh0ZW5zaW9uID0gIiArICIgKyBydXN0X25hbWVzcGFjZShleHRlbmRzKSArIHJ1c3Rfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X25hbWUoZXh0ZW5kcyk7CisgICAgbWFya2VyX2V4dGVuc2lvbiA9IG1hcmtlcl9leHRlbnNpb24gKyBzeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRzX2Zvcl9leHRlbnNpb24oZXh0ZW5kcyk7CisgIH0KKworICByZXR1cm4gbWFya2VyX2V4dGVuc2lvbjsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfc2VuZF9yZWN2X3dyYXBwZXIodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgc3RyaW5nIGZ1bmNfbmFtZSA9IHNlcnZpY2VfY2FsbF9jbGllbnRfZnVuY3Rpb25fbmFtZSh0ZnVuYyk7CisgIHN0cmluZyBmdW5jX2RlY2xfYXJncyA9IHJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfZGVjbGFyYXRpb24odGZ1bmMsIHRydWUpOworICBzdHJpbmcgZnVuY19jYWxsX2FyZ3MgPSBydXN0X3N5bmNfc2VydmljZV9jYWxsX2ludm9jYXRpb24odGZ1bmMpOworICBzdHJpbmcgZnVuY19yZXR1cm4gPSB0b19ydXN0X3R5cGUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImZuICIgPDwgZnVuY19uYW1lIDw8ICBmdW5jX2RlY2xfYXJncyA8PCAiIC0+IHRocmlmdDo6UmVzdWx0PCIgPDwgZnVuY19yZXR1cm4KKyAgICA8PCAiPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiKCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl9zeW5jX3NlbmQodGZ1bmMpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIik/OyIgPDwgZW5kbDsKKyAgaWYgKHRmdW5jLT5pc19vbmV3YXkoKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiT2soKCkpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHJlbmRlcl9zeW5jX3JlY3YodGZ1bmMpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19zZW5kKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gaW5jcmVtZW50IHRoZSBzZXF1ZW5jZSBudW1iZXIgYW5kIGdlbmVyYXRlIHRoZSBjYWxsIGhlYWRlcgorICBzdHJpbmcgbWVzc2FnZV90eXBlID0gdGZ1bmMtPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZTo6T25lV2F5IiA6ICJUTWVzc2FnZVR5cGU6OkNhbGwiOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInNlbGYuaW5jcmVtZW50X3NlcXVlbmNlX251bWJlcigpOyIgPDwgZW5kbDsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAibGV0IG1lc3NhZ2VfaWRlbnQgPSAiCisgICAgPDwgIlRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KFwiIiA8PCB0ZnVuYy0+Z2V0X25hbWUoKSA8PCAiXCIsICIgLy8gbm90ZTogdXNlICpvcmlnaW5hbCogbmFtZQorICAgIDw8IG1lc3NhZ2VfdHlwZSA8PCAiLCAiCisgICAgPDwgInNlbGYuc2VxdWVuY2VfbnVtYmVyKCkpOyIKKyAgICA8PCBlbmRsOworICAvLyBwYWNrIHRoZSBhcmd1bWVudHMgaW50byB0aGUgY29udGFpbmluZyBzdHJ1Y3QgdGhhdCB3ZSdsbCB3cml0ZSBvdXQgb3ZlciB0aGUgd2lyZQorICAvLyBub3RlIHRoYXQgdGhpcyBzdHJ1Y3QgaXMgZ2VuZXJhdGVkIGV2ZW4gaWYgd2UgaGF2ZSAwIGFyZ3MKKyAgb3N0cmluZ3N0cmVhbSBzdHJ1Y3RfZGVmaW5pdGlvbjsKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgc3RyaW5nIG1lbWJlcl9uYW1lKHJ1c3RfZmllbGRfbmFtZShtZW1iZXIpKTsKKyAgICBzdHJ1Y3RfZGVmaW5pdGlvbiA8PCBtZW1iZXJfbmFtZSA8PCAiOiAiIDw8IG1lbWJlcl9uYW1lIDw8ICIsICI7CisgIH0KKyAgc3RyaW5nIHN0cnVjdF9maWVsZHMgPSBzdHJ1Y3RfZGVmaW5pdGlvbi5zdHIoKTsKKyAgaWYgKHN0cnVjdF9maWVsZHMuc2l6ZSgpID4gMCkgeworICAgIHN0cnVjdF9maWVsZHMgPSBzdHJ1Y3RfZmllbGRzLnN1YnN0cigwLCBzdHJ1Y3RfZmllbGRzLnNpemUoKSAtIDIpOyAvLyBzdHJpcCB0cmFpbGluZyBjb21tYQorICB9CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImxldCBjYWxsX2FyZ3MgPSAiCisgICAgPDwgc2VydmljZV9jYWxsX2FyZ3Nfc3RydWN0X25hbWUodGZ1bmMpCisgICAgPDwgIiB7ICIKKyAgICA8PCBzdHJ1Y3RfZmllbGRzCisgICAgPDwgIiB9OyIKKyAgICA8PCBlbmRsOworICAvLyB3cml0ZSBldmVyeXRoaW5nIG92ZXIgdGhlIHdpcmUKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJzZWxmLm9fcHJvdF9tdXQoKS53cml0ZV9tZXNzYWdlX2JlZ2luKCZtZXNzYWdlX2lkZW50KT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImNhbGxfYXJncy53cml0ZV90b19vdXRfcHJvdG9jb2woc2VsZi5vX3Byb3RfbXV0KCkpPzsiIDw8IGVuZGw7IC8vIHdyaXR0ZW4gZXZlbiBpZiB3ZSBoYXZlIDAgYXJncworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInNlbGYub19wcm90X211dCgpLndyaXRlX21lc3NhZ2VfZW5kKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJzZWxmLm9fcHJvdF9tdXQoKS5mbHVzaCgpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfcmVjdih0X2Z1bmN0aW9uKiB0ZnVuYykgeworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IG1lc3NhZ2VfaWRlbnQgPSBzZWxmLmlfcHJvdF9tdXQoKS5yZWFkX21lc3NhZ2VfYmVnaW4oKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInZlcmlmeV9leHBlY3RlZF9zZXF1ZW5jZV9udW1iZXIoc2VsZi5zZXF1ZW5jZV9udW1iZXIoKSwgbWVzc2FnZV9pZGVudC5zZXF1ZW5jZV9udW1iZXIpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidmVyaWZ5X2V4cGVjdGVkX3NlcnZpY2VfY2FsbChcIiIgPDwgdGZ1bmMtPmdldF9uYW1lKCkgPDwiXCIsICZtZXNzYWdlX2lkZW50Lm5hbWUpPzsiIDw8IGVuZGw7IC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgLy8gRklYTUU6IHJlcGxhY2Ugd2l0aCBhICJ0cnkiIGJsb2NrCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaWYgbWVzc2FnZV9pZGVudC5tZXNzYWdlX3R5cGUgPT0gVE1lc3NhZ2VUeXBlOjpFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJlbW90ZV9lcnJvciA9IHRocmlmdDo6RXJyb3I6OnJlYWRfYXBwbGljYXRpb25fZXJyb3JfZnJvbV9pbl9wcm90b2NvbChzZWxmLmlfcHJvdF9tdXQoKSk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJzZWxmLmlfcHJvdF9tdXQoKS5yZWFkX21lc3NhZ2VfZW5kKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gRXJyKHRocmlmdDo6RXJyb3I6OkFwcGxpY2F0aW9uKHJlbW90ZV9lcnJvcikpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidmVyaWZ5X2V4cGVjdGVkX21lc3NhZ2VfdHlwZShUTWVzc2FnZVR5cGU6OlJlcGx5LCBtZXNzYWdlX2lkZW50Lm1lc3NhZ2VfdHlwZSk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgcmVzdWx0ID0gIiA8PCBzZXJ2aWNlX2NhbGxfcmVzdWx0X3N0cnVjdF9uYW1lKHRmdW5jKSA8PCAiOjpyZWFkX2Zyb21faW5fcHJvdG9jb2woc2VsZi5pX3Byb3RfbXV0KCkpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5pX3Byb3RfbXV0KCkucmVhZF9tZXNzYWdlX2VuZCgpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0Lm9rX29yKCkiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfZGVjbGFyYXRpb24odF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgc2VsZl9pc19tdXRhYmxlKSB7CisgIG9zdHJpbmdzdHJlYW0gZnVuY19hcmdzOworCisgIGlmIChzZWxmX2lzX211dGFibGUpIHsKKyAgICBmdW5jX2FyZ3MgPDwgIigmbXV0IHNlbGYiOworICB9IGVsc2UgeworICAgIGZ1bmNfYXJncyA8PCAiKCZzZWxmIjsKKyAgfQorCisgIGlmIChoYXNfYXJncyh0ZnVuYykpIHsKKyAgICBmdW5jX2FyZ3MgPDwgIiwgIjsgLy8gcHV0IGNvbW1hIGFmdGVyICJzZWxmIgorICAgIGZ1bmNfYXJncyA8PCBzdHJ1Y3RfdG9fZGVjbGFyYXRpb24odGZ1bmMtPmdldF9hcmdsaXN0KCksIFRfQVJHUyk7CisgIH0KKworICBmdW5jX2FyZ3MgPDwgIikiOworICByZXR1cm4gZnVuY19hcmdzLnN0cigpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfaW52b2NhdGlvbih0X2Z1bmN0aW9uKiB0ZnVuYywgY29uc3Qgc3RyaW5nJiBmaWVsZF9wcmVmaXgpIHsKKyAgb3N0cmluZ3N0cmVhbSBmdW5jX2FyZ3M7CisgIGZ1bmNfYXJncyA8PCAiKCI7CisKKyAgaWYgKGhhc19hcmdzKHRmdW5jKSkgeworICAgIGZ1bmNfYXJncyA8PCBzdHJ1Y3RfdG9faW52b2NhdGlvbih0ZnVuYy0+Z2V0X2FyZ2xpc3QoKSwgZmllbGRfcHJlZml4KTsKKyAgfQorCisgIGZ1bmNfYXJncyA8PCAiKSI7CisgIHJldHVybiBmdW5jX2FyZ3Muc3RyKCk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c3RydWN0X3RvX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0LCB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZSkgeworICBvc3RyaW5nc3RyZWFtIGFyZ3M7CisKKyAgYm9vbCBmaXJzdF9hcmcgPSB0cnVlOworICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4gZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgZmllbGRfaXRlcjsKKyAgZm9yIChmaWVsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZpZWxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZpZWxkX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0ZmllbGQgPSAoKmZpZWxkX2l0ZXIpOworICAgIHRfZmllbGQ6OmVfcmVxIGZpZWxkX3JlcSA9IGFjdHVhbF9maWVsZF9yZXEodGZpZWxkLCBzdHJ1Y3RfdHlwZSk7CisgICAgc3RyaW5nIHJ1c3RfdHlwZSA9IHRvX3J1c3RfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICAgIHJ1c3RfdHlwZSA9IGlzX29wdGlvbmFsKGZpZWxkX3JlcSkgPyAiT3B0aW9uPCIgKyBydXN0X3R5cGUgKyAiPiIgOiBydXN0X3R5cGU7CisKKyAgICBpZiAoZmlyc3RfYXJnKSB7CisgICAgICBmaXJzdF9hcmcgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgYXJncyA8PCAiLCAiOworICAgIH0KKworICAgIGFyZ3MgPDwgcnVzdF9maWVsZF9uYW1lKHRmaWVsZCkgPDwgIjogIiA8PCBydXN0X3R5cGU7CisgIH0KKworICByZXR1cm4gYXJncy5zdHIoKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzdHJ1Y3RfdG9faW52b2NhdGlvbih0X3N0cnVjdCogdHN0cnVjdCwgY29uc3Qgc3RyaW5nJiBmaWVsZF9wcmVmaXgpIHsKKyAgb3N0cmluZ3N0cmVhbSBhcmdzOworCisgIGJvb2wgZmlyc3RfYXJnID0gdHJ1ZTsKKyAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+IGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGZpZWxkX2l0ZXI7CisgIGZvciAoZmllbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmaWVsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmaWVsZF9pdGVyKSB7CisgICAgdF9maWVsZCogdGZpZWxkID0gKCpmaWVsZF9pdGVyKTsKKworICAgIGlmIChmaXJzdF9hcmcpIHsKKyAgICAgIGZpcnN0X2FyZyA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBhcmdzIDw8ICIsICI7CisgICAgfQorCisgICAgYXJncyA8PCBmaWVsZF9wcmVmaXggPDwgcnVzdF9maWVsZF9uYW1lKHRmaWVsZCk7CisgIH0KKworICByZXR1cm4gYXJncy5zdHIoKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3NlcnZpY2VfY2FsbF9hcmdzX3N0cnVjdCh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICAgIHN0cmluZyBhcmdzX3N0cnVjdF9uYW1lKHNlcnZpY2VfY2FsbF9hcmdzX3N0cnVjdF9uYW1lKHRmdW5jKSk7CisgICAgcmVuZGVyX3N0cnVjdChhcmdzX3N0cnVjdF9uYW1lLCB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKSwgdF9yc19nZW5lcmF0b3I6OlRfQVJHUyk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zZXJ2aWNlX2NhbGxfcmVzdWx0X3ZhbHVlX3N0cnVjdCh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICBzdHJpbmcgcmVzdWx0X3N0cnVjdF9uYW1lID0gc2VydmljZV9jYWxsX3Jlc3VsdF9zdHJ1Y3RfbmFtZSh0ZnVuYyk7CisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgcmVzdWx0X3N0cnVjdF9uYW1lKTsKKworICB0X2ZpZWxkIHJldHVybl92YWx1ZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSwgU0VSVklDRV9SRVNVTFRfVkFSSUFCTEUsIDApOworICByZXR1cm5fdmFsdWUuc2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKyAgaWYgKCF0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmcmV0dXJuX3ZhbHVlKTsKKyAgfQorCisgIHRfc3RydWN0KiBleGNlcHRpb25zID0gdGZ1bmMtPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZXhjZXB0aW9uX3R5cGVzID0gZXhjZXB0aW9ucy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZXhjZXB0aW9uX2l0ZXI7CisgIGZvcihleGNlcHRpb25faXRlciA9IGV4Y2VwdGlvbl90eXBlcy5iZWdpbigpOyBleGNlcHRpb25faXRlciAhPSBleGNlcHRpb25fdHlwZXMuZW5kKCk7ICsrZXhjZXB0aW9uX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBleGNlcHRpb25fdHlwZSA9ICpleGNlcHRpb25faXRlcjsKKyAgICBleGNlcHRpb25fdHlwZS0+c2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKyAgICByZXN1bHQuYXBwZW5kKGV4Y2VwdGlvbl90eXBlKTsKKyAgfQorCisgIHJlbmRlcl9zdHJ1Y3QocmVzdWx0X3N0cnVjdF9uYW1lLCAmcmVzdWx0LCB0X3JzX2dlbmVyYXRvcjo6VF9SRVNVTFQpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU3luYyBQcm9jZXNzb3IKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX3Byb2Nlc3Nvcih0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7CisgIHJlbmRlcl90eXBlX2NvbW1lbnQodHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiIHNlcnZpY2UgcHJvY2Vzc29yIik7IC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgcmVuZGVyX3N5bmNfaGFuZGxlcl90cmFpdCh0c2VydmljZSk7CisgIHJlbmRlcl9zeW5jX3Byb2Nlc3Nvcl9kZWZpbml0aW9uX2FuZF9pbXBsKHRzZXJ2aWNlKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfaGFuZGxlcl90cmFpdCh0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbnNpb24gPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICB0X3NlcnZpY2UqIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgICBleHRlbnNpb24gPSAiIDogIiArIHJ1c3RfbmFtZXNwYWNlKGV4dGVuZHMpICsgcnVzdF9zeW5jX2hhbmRsZXJfdHJhaXRfbmFtZShleHRlbmRzKTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZ1bmNfaXRlcjsKKworICByZW5kZXJfcnVzdGRvYygodF9kb2MqKSB0c2VydmljZSk7CisgIGZfZ2VuXyA8PCAicHViIHRyYWl0ICIgPDwgcnVzdF9zeW5jX2hhbmRsZXJfdHJhaXRfbmFtZSh0c2VydmljZSkgPDwgZXh0ZW5zaW9uIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvcihmdW5jX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY19pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jX2l0ZXIpIHsKKyAgICB0X2Z1bmN0aW9uKiB0ZnVuYyA9ICgqZnVuY19pdGVyKTsKKyAgICBzdHJpbmcgZnVuY19uYW1lID0gc2VydmljZV9jYWxsX2hhbmRsZXJfZnVuY3Rpb25fbmFtZSh0ZnVuYyk7CisgICAgc3RyaW5nIGZ1bmNfYXJncyA9IHJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfZGVjbGFyYXRpb24odGZ1bmMsIGZhbHNlKTsKKyAgICBzdHJpbmcgZnVuY19yZXR1cm4gPSB0b19ydXN0X3R5cGUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpOworICAgIHJlbmRlcl9ydXN0ZG9jKCh0X2RvYyopIHRmdW5jKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAiZm4gIgorICAgICAgPDwgZnVuY19uYW1lIDw8ICBmdW5jX2FyZ3MKKyAgICAgIDw8ICIgLT4gdGhyaWZ0OjpSZXN1bHQ8IiA8PCBmdW5jX3JldHVybiA8PCAiPjsiCisgICAgICA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX3Byb2Nlc3Nvcl9kZWZpbml0aW9uX2FuZF9pbXBsKHRfc2VydmljZSAqdHNlcnZpY2UpIHsKKyAgc3RyaW5nIHNlcnZpY2VfcHJvY2Vzc29yX25hbWUgPSBydXN0X3N5bmNfcHJvY2Vzc29yX25hbWUodHNlcnZpY2UpOworICBzdHJpbmcgaGFuZGxlcl90cmFpdF9uYW1lID0gcnVzdF9zeW5jX2hhbmRsZXJfdHJhaXRfbmFtZSh0c2VydmljZSk7CisKKyAgLy8gc3RydWN0CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgInB1YiBzdHJ1Y3QgIiA8PCBzZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lCisgICAgPDwgIjxIOiAiIDw8IGhhbmRsZXJfdHJhaXRfbmFtZQorICAgIDw8ICI+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaGFuZGxlcjogSCwiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisKKyAgLy8gZGVsZWdhdGluZyBpbXBsCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImltcGwgPEg6ICIgPDwgaGFuZGxlcl90cmFpdF9uYW1lIDw8ICI+ICIKKyAgICA8PCBzZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lCisgICAgPDwgIjxIPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInB1YiBmbiBuZXcoaGFuZGxlcjogSCkgLT4gIiA8PCBzZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lIDw8ICI8SD4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBzZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaGFuZGxlciwiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICByZW5kZXJfc3luY19wcm9jZXNzX2RlbGVnYXRpb25fZnVuY3Rpb25zKHRzZXJ2aWNlKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICAvLyBhY3R1YWwgaW1wbAorICBzdHJpbmcgc2VydmljZV9hY3R1YWxfcHJvY2Vzc29yX25hbWUgPSBydXN0X3N5bmNfcHJvY2Vzc29yX2ltcGxfbmFtZSh0c2VydmljZSk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicHViIHN0cnVjdCAiIDw8IHNlcnZpY2VfYWN0dWFsX3Byb2Nlc3Nvcl9uYW1lIDw8ICI7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpbXBsICIgPDwgc2VydmljZV9hY3R1YWxfcHJvY2Vzc29yX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZ1bmNfaXRlcjsKKyAgZm9yKGZ1bmNfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmNfaXRlcikgeworICAgIHRfZnVuY3Rpb24qIHRmdW5jID0gKCpmdW5jX2l0ZXIpOworICAgIHJlbmRlcl9zeW5jX3Byb2Nlc3NfZnVuY3Rpb24odGZ1bmMsIGhhbmRsZXJfdHJhaXRfbmFtZSk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworCisgIC8vIHByb2Nlc3NvciBpbXBsCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImltcGwgPEg6ICIKKyAgICA8PCBoYW5kbGVyX3RyYWl0X25hbWUgPDwgIj4gVFByb2Nlc3NvciBmb3IgIgorICAgIDw8IHNlcnZpY2VfcHJvY2Vzc29yX25hbWUKKyAgICA8PCAiPEg+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAiZm4gcHJvY2Vzcygmc2VsZiwgaV9wcm90OiAmbXV0IFRJbnB1dFByb3RvY29sLCBvX3Byb3Q6ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBtZXNzYWdlX2lkZW50ID0gaV9wcm90LnJlYWRfbWVzc2FnZV9iZWdpbigpPzsiIDw8IGVuZGw7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgcmVzID0gbWF0Y2ggJiptZXNzYWdlX2lkZW50Lm5hbWUgeyIgPDwgZW5kbDsgLy8gW3NpZ2hdIGV4cGxpY2l0IGRlcmVmIGNvZXJjaW9uCisgIGluZGVudF91cCgpOworICByZW5kZXJfcHJvY2Vzc19tYXRjaF9zdGF0ZW1lbnRzKHRzZXJ2aWNlKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJtZXRob2QgPT4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90aHJpZnRfZXJyb3IoCisgICAgIkFwcGxpY2F0aW9uIiwKKyAgICAiQXBwbGljYXRpb25FcnJvciIsCisgICAgIkFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duTWV0aG9kIiwKKyAgICAiZm9ybWF0IShcInVua25vd24gbWV0aG9kIHt9XCIsIG1ldGhvZCkiCisgICk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ0aHJpZnQ6OnNlcnZlcjo6aGFuZGxlX3Byb2Nlc3NfcmVzdWx0KCZtZXNzYWdlX2lkZW50LCByZXMsIG9fcHJvdCkiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX3Byb2Nlc3NfZGVsZWdhdGlvbl9mdW5jdGlvbnModF9zZXJ2aWNlICp0c2VydmljZSkgeworICBzdHJpbmcgYWN0dWFsX3Byb2Nlc3NvcihydXN0X25hbWVzcGFjZSh0c2VydmljZSkgKyBydXN0X3N5bmNfcHJvY2Vzc29yX2ltcGxfbmFtZSh0c2VydmljZSkpOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZnVuY19pdGVyOworICBmb3IoZnVuY19pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmNfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY19pdGVyKSB7CisgICAgdF9mdW5jdGlvbiogdGZ1bmMgPSAoKmZ1bmNfaXRlcik7CisgICAgc3RyaW5nIGZ1bmN0aW9uX25hbWUoInByb2Nlc3NfIiArIHJ1c3Rfc25ha2VfY2FzZSh0ZnVuYy0+Z2V0X25hbWUoKSkpOworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJmbiAiIDw8IGZ1bmN0aW9uX25hbWUKKyAgICAgIDw8ICIoJnNlbGYsICIKKyAgICAgIDw8ICJpbmNvbWluZ19zZXF1ZW5jZV9udW1iZXI6IGkzMiwgIgorICAgICAgPDwgImlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCwgIgorICAgICAgPDwgIm9fcHJvdDogJm11dCBUT3V0cHV0UHJvdG9jb2wpICIKKyAgICAgIDw8ICItPiB0aHJpZnQ6OlJlc3VsdDwoKT4geyIKKyAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCBhY3R1YWxfcHJvY2Vzc29yCisgICAgICA8PCAiOjoiIDw8IGZ1bmN0aW9uX25hbWUKKyAgICAgIDw8ICIoIgorICAgICAgPDwgIiZzZWxmLmhhbmRsZXIsICIKKyAgICAgIDw8ICJpbmNvbWluZ19zZXF1ZW5jZV9udW1iZXIsICIKKyAgICAgIDw8ICJpX3Byb3QsICIKKyAgICAgIDw8ICJvX3Byb3QiCisgICAgICA8PCAiKSIKKyAgICAgIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIHRfc2VydmljZSogZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kcykgeworICAgIHJlbmRlcl9zeW5jX3Byb2Nlc3NfZGVsZWdhdGlvbl9mdW5jdGlvbnMoZXh0ZW5kcyk7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3Byb2Nlc3NfbWF0Y2hfc3RhdGVtZW50cyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZnVuY19pdGVyOworICBmb3IoZnVuY19pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmNfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY19pdGVyKSB7CisgICAgdF9mdW5jdGlvbiogdGZ1bmMgPSAoKmZ1bmNfaXRlcik7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJcIiIgPDwgdGZ1bmMtPmdldF9uYW1lKCkgPDwgIlwiIiA8PCAiID0+IHsiIDw8IGVuZGw7IC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAic2VsZi5wcm9jZXNzXyIgPDwgcnVzdF9zbmFrZV9jYXNlKHRmdW5jLT5nZXRfbmFtZSgpKQorICAgICAgPDwgIihtZXNzYWdlX2lkZW50LnNlcXVlbmNlX251bWJlciwgaV9wcm90LCBvX3Byb3QpIgorICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisgIH0KKworICB0X3NlcnZpY2UqIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHMpIHsKKyAgICByZW5kZXJfcHJvY2Vzc19tYXRjaF9zdGF0ZW1lbnRzKGV4dGVuZHMpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX3Byb2Nlc3NfZnVuY3Rpb24odF9mdW5jdGlvbiAqdGZ1bmMsIGNvbnN0IHN0cmluZyAmaGFuZGxlcl90eXBlKSB7CisgIHN0cmluZyBzZXF1ZW5jZV9udW1iZXJfcGFyYW0oImluY29taW5nX3NlcXVlbmNlX251bWJlciIpOworICBzdHJpbmcgb3V0cHV0X3Byb3RvY29sX3BhcmFtKCJvX3Byb3QiKTsKKworICBpZiAodGZ1bmMtPmlzX29uZXdheSgpKSB7CisgICAgc2VxdWVuY2VfbnVtYmVyX3BhcmFtID0gIl8iOworICAgIG91dHB1dF9wcm90b2NvbF9wYXJhbSA9ICJfIjsKKyAgfQorCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgInB1YiBmbiBwcm9jZXNzXyIgPDwgcnVzdF9zbmFrZV9jYXNlKHRmdW5jLT5nZXRfbmFtZSgpKQorICAgIDw8ICI8SDogIiA8PCBoYW5kbGVyX3R5cGUgPDwgIj4iCisgICAgPDwgIihoYW5kbGVyOiAmSCwgIgorICAgIDw8IHNlcXVlbmNlX251bWJlcl9wYXJhbSA8PCAiOiBpMzIsICIKKyAgICA8PCAiaV9wcm90OiAmbXV0IFRJbnB1dFByb3RvY29sLCAiCisgICAgPDwgb3V0cHV0X3Byb3RvY29sX3BhcmFtIDw8ICI6ICZtdXQgVE91dHB1dFByb3RvY29sKSAiCisgICAgPDwgIi0+IHRocmlmdDo6UmVzdWx0PCgpPiB7IgorICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gKmFsd2F5cyogcmVhZCBhcmd1bWVudHMgZnJvbSB0aGUgaW5wdXQgcHJvdG9jb2wKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAibGV0ICIKKyAgICA8PCAoaGFzX25vbl92b2lkX2FyZ3ModGZ1bmMpID8gImFyZ3MiIDogIl8iKQorICAgIDw8ICIgPSAiCisgICAgPDwgc2VydmljZV9jYWxsX2FyZ3Nfc3RydWN0X25hbWUodGZ1bmMpCisgICAgPDwgIjo6cmVhZF9mcm9tX2luX3Byb3RvY29sKGlfcHJvdCk/OyIKKyAgICA8PCBlbmRsOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgIm1hdGNoIGhhbmRsZXIuIgorICAgIDw8IHNlcnZpY2VfY2FsbF9oYW5kbGVyX2Z1bmN0aW9uX25hbWUodGZ1bmMpCisgICAgPDwgcnVzdF9zeW5jX3NlcnZpY2VfY2FsbF9pbnZvY2F0aW9uKHRmdW5jLCAiYXJncy4iKQorICAgIDw8ICIgeyIKKyAgICA8PCBlbmRsOyAvLyBzdGFydCBtYXRjaAorICBpbmRlbnRfdXAoKTsKKworICAvLyBoYW5kbGVyIHN1Y2NlZWRlZAorICBzdHJpbmcgaGFuZGxlcl9yZXR1cm5fdmFyaWFibGUgPSB0ZnVuYy0+aXNfb25ld2F5KCkgfHwgdGZ1bmMtPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSA/ICJfIiA6ICJoYW5kbGVyX3JldHVybiI7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiT2soIiA8PCBoYW5kbGVyX3JldHVybl92YXJpYWJsZSA8PCAiKSA9PiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3N5bmNfaGFuZGxlcl9zdWNjZWVkZWQodGZ1bmMpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworICAvLyBoYW5kbGVyIGZhaWxlZAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIkVycihlKSA9PiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWQodGZ1bmMpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsgLy8gZW5kIG1hdGNoCisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOyAvLyBlbmQgZnVuY3Rpb24KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfaGFuZGxlcl9zdWNjZWVkZWQodF9mdW5jdGlvbiAqdGZ1bmMpIHsKKyAgaWYgKHRmdW5jLT5pc19vbmV3YXkoKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiT2soKCkpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJsZXQgbWVzc2FnZV9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCIKKyAgICAgIDw8ICJcIiIgPDwgdGZ1bmMtPmdldF9uYW1lKCkgPDwgIlwiLCAiIC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgICAgIDw8ICJUTWVzc2FnZVR5cGU6OlJlcGx5LCAiCisgICAgICA8PCAiaW5jb21pbmdfc2VxdWVuY2VfbnVtYmVyKTsiCisgICAgICA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJm1lc3NhZ2VfaWRlbnQpPzsiIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgcmV0ID0gIiA8PCBoYW5kbGVyX3N1Y2Nlc3NmdWxfcmV0dXJuX3N0cnVjdCh0ZnVuYykgPDwiOyIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInJldC53cml0ZV90b19vdXRfcHJvdG9jb2wob19wcm90KT87IiA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX21lc3NhZ2VfZW5kKCk/OyIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC5mbHVzaCgpIiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkKHRfZnVuY3Rpb24gKnRmdW5jKSB7CisgIHN0cmluZyBlcnJfdmFyKCJlIik7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJtYXRjaCAiIDw8IGVycl92YXIgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBpZiB0aGVyZSBhcmUgYW55IHVzZXItZGVmaW5lZCBleGNlcHRpb25zIGZvciB0aGlzIHNlcnZpY2UgY2FsbCBoYW5kbGUgdGhlbSBmaXJzdAorICBpZiAodGZ1bmMtPmdldF94Y2VwdGlvbnMoKSAhPSBOVUxMICYmIHRmdW5jLT5nZXRfeGNlcHRpb25zKCktPmdldF9zb3J0ZWRfbWVtYmVycygpLnNpemUoKSA+IDApIHsKKyAgICBzdHJpbmcgdXNlcl9lcnJfdmFyKCJ1c3JfZXJyIik7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ0aHJpZnQ6OkVycm9yOjpVc2VyKCIgPDwgdXNlcl9lcnJfdmFyIDw8ICIpID0+IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgcmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWRfdXNlcl9leGNlcHRpb25fYnJhbmNoKHRmdW5jKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisgIH0KKworICAvLyBhcHBsaWNhdGlvbiBlcnJvcgorICBzdHJpbmcgYXBwX2Vycl92YXIoImFwcF9lcnIiKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ0aHJpZnQ6OkVycm9yOjpBcHBsaWNhdGlvbigiIDw8IGFwcF9lcnJfdmFyIDw8ICIpID0+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF9hcHBsaWNhdGlvbl9leGNlcHRpb25fYnJhbmNoKHRmdW5jLCBhcHBfZXJyX3Zhcik7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisKKyAgLy8gZGVmYXVsdCBjYXNlCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiXyA9PiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWRfZGVmYXVsdF9leGNlcHRpb25fYnJhbmNoKHRmdW5jKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX3VzZXJfZXhjZXB0aW9uX2JyYW5jaCh0X2Z1bmN0aW9uICp0ZnVuYykgeworICBpZiAodGZ1bmMtPmdldF94Y2VwdGlvbnMoKSA9PSBOVUxMIHx8IHRmdW5jLT5nZXRfeGNlcHRpb25zKCktPmdldF9zb3J0ZWRfbWVtYmVycygpLmVtcHR5KCkpIHsKKyAgICB0aHJvdyAiY2Fubm90IHJlbmRlciB1c2VyIGV4Y2VwdGlvbiBicmFuY2hlcyBpZiBubyB1c2VyIGV4Y2VwdGlvbnMgZGVmaW5lZCI7CisgIH0KKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+IHR4Y2VwdGlvbnMgPSB0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeGNlcHRpb25faXRlcjsKKyAgaW50IGJyYW5jaGVzX3JlbmRlcmVkID0gMDsKKworICAvLyBydW4gdGhyb3VnaCBhbGwgdXNlci1kZWZpbmVkIGV4Y2VwdGlvbnMKKyAgZm9yICh4Y2VwdGlvbl9pdGVyID0gdHhjZXB0aW9ucy5iZWdpbigpOyB4Y2VwdGlvbl9pdGVyICE9IHR4Y2VwdGlvbnMuZW5kKCk7ICsreGNlcHRpb25faXRlcikgeworICAgIHRfZmllbGQqIHhjZXB0aW9uX2ZpZWxkID0gKCp4Y2VwdGlvbl9pdGVyKTsKKworICAgIHN0cmluZyBpZl9zdGF0ZW1lbnQoYnJhbmNoZXNfcmVuZGVyZWQgPT0gMCA/ICJpZiB1c3JfZXJyIiA6ICJ9IGVsc2UgaWYgdXNyX2VyciIpOworICAgIHN0cmluZyBleGNlcHRpb25fdHlwZSh0b19ydXN0X3R5cGUoeGNlcHRpb25fZmllbGQtPmdldF90eXBlKCkpKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgaWZfc3RhdGVtZW50IDw8ICIuZG93bmNhc3RfcmVmOjo8IiA8PCBleGNlcHRpb25fdHlwZSA8PCAiPigpLmlzX3NvbWUoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImxldCBlcnIgPSB1c3JfZXJyLmRvd25jYXN0Ojo8IiA8PCBleGNlcHRpb25fdHlwZSA8PCAiPigpLmV4cGVjdChcImRvd25jYXN0IGFscmVhZHkgY2hlY2tlZFwiKTsiCisgICAgICA8PCBlbmRsOworCisgICAgLy8gcmVuZGVyIHRoZSBtZW1iZXJzIG9mIHRoZSByZXR1cm4gc3RydWN0CisgICAgb3N0cmluZ3N0cmVhbSBtZW1iZXJzOworCisgICAgYm9vbCBoYXNfcmVzdWx0X3ZhcmlhYmxlID0gISh0ZnVuYy0+aXNfb25ld2F5KCkgfHwgdGZ1bmMtPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSk7CisgICAgaWYgKGhhc19yZXN1bHRfdmFyaWFibGUpIHsKKyAgICAgIG1lbWJlcnMgPDwgU0VSVklDRV9SRVNVTFRfVkFSSUFCTEUgPDwgIjogTm9uZSwgIjsKKyAgICB9CisKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4Y2VwdGlvbl9tZW1iZXJzX2l0ZXI7CisgICAgZm9yKHhjZXB0aW9uX21lbWJlcnNfaXRlciA9IHR4Y2VwdGlvbnMuYmVnaW4oKTsgeGNlcHRpb25fbWVtYmVyc19pdGVyICE9IHR4Y2VwdGlvbnMuZW5kKCk7ICsreGNlcHRpb25fbWVtYmVyc19pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKnhjZXB0aW9uX21lbWJlcnNfaXRlcik7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWUocnVzdF9maWVsZF9uYW1lKG1lbWJlcikpOworICAgICAgaWYgKG1lbWJlciA9PSB4Y2VwdGlvbl9maWVsZCkgeworICAgICAgICBtZW1iZXJzIDw8IG1lbWJlcl9uYW1lIDw8ICI6IFNvbWUoKmVyciksICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBtZW1iZXJzIDw8IG1lbWJlcl9uYW1lIDw8ICI6IE5vbmUsICI7CisgICAgICB9CisgICAgfQorCisgICAgc3RyaW5nIG1lbWJlcl9zdHJpbmcgPSBtZW1iZXJzLnN0cigpOworICAgIG1lbWJlcl9zdHJpbmcucmVwbGFjZShtZW1iZXJfc3RyaW5nLnNpemUoKSAtIDIsIDIsICIgIik7IC8vIHRyaW0gdHJhaWxpbmcgY29tbWEKKworICAgIC8vIG5vdyB3cml0ZSBvdXQgdGhlIHJldHVybiBzdHJ1Y3QKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAibGV0IHJldF9lcnIgPSAiCisgICAgICA8PCBzZXJ2aWNlX2NhbGxfcmVzdWx0X3N0cnVjdF9uYW1lKHRmdW5jKQorICAgICAgPDwgInsgIiA8PCBtZW1iZXJfc3RyaW5nIDw8ICJ9OyIKKyAgICAgIDw8IGVuZGw7CisKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAibGV0IG1lc3NhZ2VfaWRlbnQgPSAiCisgICAgICA8PCAiVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoIgorICAgICAgPDwgIlwiIiA8PCB0ZnVuYy0+Z2V0X25hbWUoKSA8PCAiXCIsICIgLy8gbm90ZTogdXNlICpvcmlnaW5hbCogbmFtZQorICAgICAgPDwgIlRNZXNzYWdlVHlwZTo6UmVwbHksICIKKyAgICAgIDw8ICJpbmNvbWluZ19zZXF1ZW5jZV9udW1iZXIpOyIKKyAgICAgIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmbWVzc2FnZV9pZGVudCk/OyIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInJldF9lcnIud3JpdGVfdG9fb3V0X3Byb3RvY29sKG9fcHJvdCk/OyIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9tZXNzYWdlX2VuZCgpPzsiIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3QuZmx1c2goKSIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBicmFuY2hlc19yZW5kZXJlZCsrOworICB9CisKKyAgLy8gdGhlIGNhdGNoIGFsbCwgaWYgc29tZWhvdyBpdCB3YXMgYSB1c2VyIGV4Y2VwdGlvbiB0aGF0IHdlIGRvbid0IHN1cHBvcnQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gRklYTUU6IHNhbWUgYXMgZGVmYXVsdCBibG9jayBiZWxvdworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJldF9lcnIgPSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3RocmlmdF9lcnJvcl9zdHJ1Y3QoIkFwcGxpY2F0aW9uRXJyb3IiLCAiQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24iLCAidXNyX2Vyci5kZXNjcmlwdGlvbigpIik7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGw7CisgIHJlbmRlcl9zeW5jX2hhbmRsZXJfc2VuZF9leGNlcHRpb25fcmVzcG9uc2UodGZ1bmMsICJyZXRfZXJyIik7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF9hcHBsaWNhdGlvbl9leGNlcHRpb25fYnJhbmNoKAorICAgIHRfZnVuY3Rpb24gKnRmdW5jLAorICAgIGNvbnN0IHN0cmluZyAmYXBwX2Vycl92YXIKKykgeworICBpZiAodGZ1bmMtPmlzX29uZXdheSgpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJFcnIodGhyaWZ0OjpFcnJvcjo6QXBwbGljYXRpb24oIiA8PCBhcHBfZXJyX3ZhciA8PCAiKSkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcmVuZGVyX3N5bmNfaGFuZGxlcl9zZW5kX2V4Y2VwdGlvbl9yZXNwb25zZSh0ZnVuYywgYXBwX2Vycl92YXIpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX2RlZmF1bHRfZXhjZXB0aW9uX2JyYW5jaCh0X2Z1bmN0aW9uICp0ZnVuYykgeworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCByZXRfZXJyID0geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90aHJpZnRfZXJyb3Jfc3RydWN0KCJBcHBsaWNhdGlvbkVycm9yIiwgIkFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duIiwgImUuZGVzY3JpcHRpb24oKSIpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsOworICBpZiAodGZ1bmMtPmlzX29uZXdheSgpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJFcnIodGhyaWZ0OjpFcnJvcjo6QXBwbGljYXRpb24ocmV0X2VycikpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHJlbmRlcl9zeW5jX2hhbmRsZXJfc2VuZF9leGNlcHRpb25fcmVzcG9uc2UodGZ1bmMsICJyZXRfZXJyIik7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfaGFuZGxlcl9zZW5kX2V4Y2VwdGlvbl9yZXNwb25zZSh0X2Z1bmN0aW9uICp0ZnVuYywgY29uc3Qgc3RyaW5nICZlcnJfdmFyKSB7CisgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJsZXQgbWVzc2FnZV9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCIKKyAgICAgIDw8ICJcIiIgPDwgdGZ1bmMtPmdldF9uYW1lKCkgPDwgIlwiLCAiIC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgICAgIDw8ICJUTWVzc2FnZVR5cGU6OkV4Y2VwdGlvbiwgIgorICAgICAgPDwgImluY29taW5nX3NlcXVlbmNlX251bWJlcik7IgorICAgICAgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmbWVzc2FnZV9pZGVudCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ0aHJpZnQ6OkVycm9yOjp3cml0ZV9hcHBsaWNhdGlvbl9lcnJvcl90b19vdXRfcHJvdG9jb2woJiIgPDwgZXJyX3ZhciA8PCAiLCBvX3Byb3QpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX21lc3NhZ2VfZW5kKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3QuZmx1c2goKSIgPDwgZW5kbDsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpoYW5kbGVyX3N1Y2Nlc3NmdWxfcmV0dXJuX3N0cnVjdCh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICBpbnQgbWVtYmVyX2NvdW50ID0gMDsKKyAgb3N0cmluZ3N0cmVhbSByZXR1cm5fc3RydWN0OworCisgIHJldHVybl9zdHJ1Y3QgPDwgc2VydmljZV9jYWxsX3Jlc3VsdF9zdHJ1Y3RfbmFtZSh0ZnVuYykgPDwgIiB7ICI7CisKKyAgLy8gYWN0dWFsIHJldHVybgorICBpZiAoIXRmdW5jLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXR1cm5fc3RydWN0IDw8ICJyZXN1bHRfdmFsdWU6IFNvbWUoaGFuZGxlcl9yZXR1cm4pIjsKKyAgICBtZW1iZXJfY291bnQrKzsKKyAgfQorCisgIC8vIGFueSB1c2VyLWRlZmluZWQgZXhjZXB0aW9ucworICBpZiAodGZ1bmMtPmdldF94Y2VwdGlvbnMoKSAhPSBOVUxMKSB7CisgICAgdF9zdHJ1Y3QqIHR4Y2VwdGlvbnMgPSB0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHR4Y2VwdGlvbnMtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKyAgICBmb3IgKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgICB0X2ZpZWxkKiB4Y2VwdGlvbl9maWVsZCA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICAgIGlmIChtZW1iZXJfY291bnQgPiAwKSB7IHJldHVybl9zdHJ1Y3QgPDwgIiwgIjsgfQorICAgICAgcmV0dXJuX3N0cnVjdCA8PCBydXN0X2ZpZWxkX25hbWUoeGNlcHRpb25fZmllbGQpIDw8ICI6IE5vbmUiOworICAgICAgbWVtYmVyX2NvdW50Kys7CisgICAgfQorICB9CisKKyAgcmV0dXJuX3N0cnVjdCA8PCAiIH0iOworCisgIHJldHVybiAgcmV0dXJuX3N0cnVjdC5zdHIoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFV0aWxpdHkKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl90eXBlX2NvbW1lbnQoY29uc3Qgc3RyaW5nJiB0eXBlX25hbWUpIHsKKyAgZl9nZW5fIDw8ICIvLyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICIvLyAiIDw8IHR5cGVfbmFtZSA8PCBlbmRsOworICBmX2dlbl8gPDwgIi8vIiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKworLy8gTk9URTogZG8gKm5vdCogcHV0IGluIGFuIGV4dHJhIG5ld2xpbmUgYWZ0ZXIgZG9jIGlzIGdlbmVyYXRlZC4KKy8vIFRoaXMgaXMgYmVjYXVzZSBydXN0IGRvY3MgaGF2ZSB0byBhYnV0IHRoZSBsaW5lIHRoZXkncmUgZG9jdW1lbnRpbmcuCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfcnVzdGRvYyh0X2RvYyogdGRvYykgeworICBpZiAoIXRkb2MtPmhhc19kb2MoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KGZfZ2VuXywgIiIsICIvLy8gIiwgdGRvYy0+Z2V0X2RvYygpLCAiIik7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl90aHJpZnRfZXJyb3IoCisgIGNvbnN0IHN0cmluZyYgZXJyb3Jfa2luZCwKKyAgY29uc3Qgc3RyaW5nJiBlcnJvcl9zdHJ1Y3QsCisgIGNvbnN0IHN0cmluZyYgc3ViX2Vycm9yX2tpbmQsCisgIGNvbnN0IHN0cmluZyYgZXJyb3JfbWVzc2FnZQorKSB7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiRXJyKCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0OjpFcnJvcjo6IiA8PCBlcnJvcl9raW5kIDw8ICIoIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3RocmlmdF9lcnJvcl9zdHJ1Y3QoZXJyb3Jfc3RydWN0LCBzdWJfZXJyb3Jfa2luZCwgZXJyb3JfbWVzc2FnZSk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICIpIiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdGhyaWZ0X2Vycm9yX3N0cnVjdCgKKyAgY29uc3Qgc3RyaW5nJiBlcnJvcl9zdHJ1Y3QsCisgIGNvbnN0IHN0cmluZyYgc3ViX2Vycm9yX2tpbmQsCisgIGNvbnN0IHN0cmluZyYgZXJyb3JfbWVzc2FnZQorKSB7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBlcnJvcl9zdHJ1Y3QgPDwgIjo6bmV3KCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBzdWJfZXJyb3Jfa2luZCA8PCAiLCIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGVycm9yX21lc3NhZ2UgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICIpIiA8PCBlbmRsOworfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjppc19kb3VibGUodF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6dG9fcnVzdF90eXBlKHRfdHlwZSogdHR5cGUsIGJvb2wgb3JkZXJlZF9mbG9hdCkgeworICAvLyB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOyA8LS0gcmVjdXJzZXMgdGhyb3VnaCBhcyBtYW55IHR5cGVkZWYgbGF5ZXJzIGFzIG5lY2Vzc2FyeQorICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKil0dHlwZSk7CisgICAgc3dpdGNoICh0YmFzZV90eXBlLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICIoKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgcmV0dXJuICJWZWM8dTg+IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiU3RyaW5nIjsKKyAgICAgIH0KKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gImJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gImk4IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiaTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiaTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiaTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmIChvcmRlcmVkX2Zsb2F0KSB7CisgICAgICAgIHJldHVybiAiT3JkZXJlZEZsb2F0PGY2ND4iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICJmNjQiOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdF90eXBlZGVmKiB0dHlwZWRlZiA9ICh0X3R5cGVkZWYqKXR0eXBlOworICAgIHN0cmluZyBydXN0X3R5cGUgPSBydXN0X25hbWVzcGFjZSh0dHlwZSkgKyB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCk7CisgICAgcnVzdF90eXBlID0gIHR0eXBlZGVmLT5pc19mb3J3YXJkX3R5cGVkZWYoKSA/ICJCb3g8IiArIHJ1c3RfdHlwZSArICI+IiA6IHJ1c3RfdHlwZTsKKyAgICByZXR1cm4gcnVzdF90eXBlOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gcnVzdF9uYW1lc3BhY2UodHR5cGUpICsgcnVzdF9jYW1lbF9jYXNlKHR0eXBlLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gcnVzdF9uYW1lc3BhY2UodHR5cGUpICsgcnVzdF9jYW1lbF9jYXNlKHR0eXBlLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgcmV0dXJuICJCVHJlZU1hcDwiICsgdG9fcnVzdF90eXBlKHRtYXAtPmdldF9rZXlfdHlwZSgpKSArICIsICIgKyB0b19ydXN0X3R5cGUodG1hcC0+Z2V0X3ZhbF90eXBlKCkpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICByZXR1cm4gIkJUcmVlU2V0PCIgKyB0b19ydXN0X3R5cGUodHNldC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgIHJldHVybiAiVmVjPCIgKyB0b19ydXN0X3R5cGUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0KKworICB0aHJvdyAiY2Fubm90IGZpbmQgcnVzdCB0eXBlIGZvciAiICsgdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6dG9fcnVzdF9jb25zdF90eXBlKHRfdHlwZSogdHR5cGUsIGJvb2wgb3JkZXJlZF9mbG9hdCkgeworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKil0dHlwZSk7CisgICAgaWYgKHRiYXNlX3R5cGUtPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7CisgICAgICBpZiAodGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgcmV0dXJuICImW3U4XSI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gIiZzdHIiOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiB0b19ydXN0X3R5cGUodHR5cGUsIG9yZGVyZWRfZmxvYXQpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnRvX3J1c3RfZmllbGRfdHlwZV9lbnVtKHRfdHlwZSogdHR5cGUpIHsKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJ3aWxsIG5vdCBnZW5lcmF0ZSBwcm90b2NvbDo6VFR5cGUgZm9yIFRZUEVfVk9JRCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6IC8vIGJvdGggc3RyaW5ncyBhbmQgYmluYXJ5IGFyZSBhY3R1YWxseSBlbmNvZGVkIGFzIFRUeXBlOjpTdHJpbmcKKyAgICAgIHJldHVybiAiVFR5cGU6OlN0cmluZyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZTo6Qm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGU6OkkwOCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlOjpJMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZTo6STMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGU6Okk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlOjpEb3VibGUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6STMyIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlOjpTdHJ1Y3QiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGU6Ok1hcCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6U2V0IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6TGlzdCI7CisgIH0KKworICB0aHJvdyAiY2Fubm90IGZpbmQgVFR5cGUgZm9yICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpvcHRfaW5fcmVxX291dF92YWx1ZSh0X3R5cGUqIHR0eXBlKSB7CisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKTsKKyAgICBzd2l0Y2ggKHRiYXNlX3R5cGUtPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIE9QVF9JTl9SRVFfT1VUIHZhbHVlIGZvciB2b2lkIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0YmFzZV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICByZXR1cm4gIlNvbWUoVmVjOjpuZXcoKSkiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICJTb21lKFwiXCIudG9fb3duZWQoKSkiOworICAgICAgfQorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiU29tZShmYWxzZSkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlNvbWUoMCkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJTb21lKE9yZGVyZWRGbG9hdDo6ZnJvbSgwLjApKSI7CisgICAgfQorCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIk5vbmUiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlNvbWUoVmVjOjpuZXcoKSkiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiU29tZShCVHJlZVNldDo6bmV3KCkpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlNvbWUoQlRyZWVNYXA6Om5ldygpKSI7CisgIH0KKworICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIG9wdC1pbi1yZXEtb3V0IHZhbHVlIGZvciB0eXBlICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworYm9vbCB0X3JzX2dlbmVyYXRvcjo6Y2FuX2dlbmVyYXRlX3NpbXBsZV9jb25zdCh0X3R5cGUqIHR0eXBlKSB7CisgIHRfdHlwZSogYWN0dWFsX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgaWYgKGFjdHVhbF90eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZV90eXBlID0gKHRfYmFzZV90eXBlKilhY3R1YWxfdHlwZTsKKyAgICByZXR1cm4gISh0YmFzZV90eXBlLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6OmNhbl9nZW5lcmF0ZV9jb25zdF9ob2xkZXIodF90eXBlKiB0dHlwZSkgeworICB0X3R5cGUqIGFjdHVhbF90eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIHJldHVybiAhY2FuX2dlbmVyYXRlX3NpbXBsZV9jb25zdChhY3R1YWxfdHlwZSkgJiYgIWFjdHVhbF90eXBlLT5pc19zZXJ2aWNlKCk7Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6OmlzX3ZvaWQodF90eXBlKiB0dHlwZSkgeworICByZXR1cm4gdHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOworfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjppc19vcHRpb25hbCh0X2ZpZWxkOjplX3JlcSByZXEpIHsKKyAgcmV0dXJuIHJlcSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8IHJlcSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUOworfQorCit0X2ZpZWxkOjplX3JlcSB0X3JzX2dlbmVyYXRvcjo6YWN0dWFsX2ZpZWxkX3JlcSh0X2ZpZWxkKiB0ZmllbGQsIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKSB7CisgIHJldHVybiBzdHJ1Y3RfdHlwZSA9PSB0X3JzX2dlbmVyYXRvcjo6VF9BUkdTID8gdF9maWVsZDo6VF9SRVFVSVJFRCA6IHRmaWVsZC0+Z2V0X3JlcSgpOworfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjpoYXNfYXJncyh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICByZXR1cm4gdGZ1bmMtPmdldF9hcmdsaXN0KCkgIT0gTlVMTCAmJiAhdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9zb3J0ZWRfbWVtYmVycygpLmVtcHR5KCk7Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6Omhhc19ub25fdm9pZF9hcmdzKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIGJvb2wgaGFzX25vbl92b2lkX2FyZ3MgPSBmYWxzZTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+IGFyZ3MgPSB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFyZ3NfaXRlcjsKKyAgZm9yIChhcmdzX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFyZ3NfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FyZ3NfaXRlcikgeworICAgIHRfZmllbGQqIHRmaWVsZCA9ICgqYXJnc19pdGVyKTsKKyAgICBpZiAoIXRmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBoYXNfbm9uX3ZvaWRfYXJncyA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gaGFzX25vbl92b2lkX2FyZ3M7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6dmlzaWJpbGl0eV9xdWFsaWZpZXIodF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpIHsKKyAgc3dpdGNoKHN0cnVjdF90eXBlKSB7CisgIGNhc2UgdF9yc19nZW5lcmF0b3I6OlRfQVJHUzoKKyAgY2FzZSB0X3JzX2dlbmVyYXRvcjo6VF9SRVNVTFQ6CisgICAgcmV0dXJuICIiOworICBkZWZhdWx0OgorICAgIHJldHVybiAicHViICI7CisgIH0KK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X25hbWVzcGFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGlmICh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSAhPSBnZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKSB7CisgICAgcmV0dXJuIHJ1c3Rfc25ha2VfY2FzZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSkgKyAiOjoiOworICB9IGVsc2UgeworICAgIHJldHVybiAiIjsKKyAgfQorfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3RfbmFtZXNwYWNlKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpICE9IGdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpIHsKKyAgICByZXR1cm4gcnVzdF9zbmFrZV9jYXNlKHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKSArICI6OiI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuICIiOworICB9Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6OmlzX3Jlc2VydmVkKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICByZXR1cm4gUlVTVF9SRVNFUlZFRF9XT1JEU19TRVQuZmluZChuYW1lKSAhPSBSVVNUX1JFU0VSVkVEX1dPUkRTX1NFVC5lbmQoKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N0cnVjdF9uYW1lKHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBiYXNlX3N0cnVjdF9uYW1lKHJ1c3RfY2FtZWxfY2FzZSh0c3RydWN0LT5nZXRfbmFtZSgpKSk7CisgIHJldHVybiBydXN0X3NhZmVfbmFtZShiYXNlX3N0cnVjdF9uYW1lKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X2ZpZWxkX25hbWUodF9maWVsZCogdGZpZWxkKSB7CisgIHN0cmluZyBiYXNlX2ZpZWxkX25hbWUocnVzdF9zbmFrZV9jYXNlKHRmaWVsZC0+Z2V0X25hbWUoKSkpOworICByZXR1cm4gcnVzdF9zYWZlX25hbWUoYmFzZV9maWVsZF9uYW1lKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3VuaW9uX2ZpZWxkX25hbWUodF9maWVsZCogdGZpZWxkKSB7CisgIHN0cmluZyBiYXNlX2ZpZWxkX25hbWUocnVzdF9jYW1lbF9jYXNlKHRmaWVsZC0+Z2V0X25hbWUoKSkpOworICByZXR1cm4gcnVzdF9zYWZlX25hbWUoYmFzZV9maWVsZF9uYW1lKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3NhZmVfbmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgaWYgKGlzX3Jlc2VydmVkKG5hbWUpKSB7CisgICAgcmV0dXJuIG5hbWUgKyAiXyI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5hbWU7CisgIH0KK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzZXJ2aWNlX2NhbGxfY2xpZW50X2Z1bmN0aW9uX25hbWUodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgcmV0dXJuIHJ1c3Rfc25ha2VfY2FzZSh0ZnVuYy0+Z2V0X25hbWUoKSk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c2VydmljZV9jYWxsX2hhbmRsZXJfZnVuY3Rpb25fbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICByZXR1cm4gImhhbmRsZV8iICsgcnVzdF9zbmFrZV9jYXNlKHRmdW5jLT5nZXRfbmFtZSgpKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzZXJ2aWNlX2NhbGxfYXJnc19zdHJ1Y3RfbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICAvLyBUaHJpZnQgYXV0b21hdGljYWxseSBhcHBlbmRzIGBBcmdzYCB0byB0aGUgYXJnbGlzdCBuYW1lLiBObyBuZWVkIHRvIGRvIGl0IGhlcmUuCisgIHJldHVybiBydXN0X2NhbWVsX2Nhc2Uoc2VydmljZV9uYW1lXykgKyBydXN0X2NhbWVsX2Nhc2UodGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9uYW1lKCkpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnNlcnZpY2VfY2FsbF9yZXN1bHRfc3RydWN0X25hbWUodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgcmV0dXJuIHJ1c3RfY2FtZWxfY2FzZShzZXJ2aWNlX25hbWVfKSArIHJ1c3RfY2FtZWxfY2FzZSh0ZnVuYy0+Z2V0X25hbWUoKSkgKyBSRVNVTFRfU1RSVUNUX1NVRkZJWDsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgcmV0dXJuICJUIiArIHJ1c3RfY2FtZWxfY2FzZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgKyAiU3luY0NsaWVudE1hcmtlciI7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zeW5jX2NsaWVudF90cmFpdF9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgcmV0dXJuICJUIiArIHJ1c3RfY2FtZWxfY2FzZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgKyAiU3luY0NsaWVudCI7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zeW5jX2NsaWVudF9pbXBsX25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICByZXR1cm4gcnVzdF9jYW1lbF9jYXNlKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSArICJTeW5jQ2xpZW50IjsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N5bmNfaGFuZGxlcl90cmFpdF9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgcmV0dXJuIHJ1c3RfY2FtZWxfY2FzZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgKyAiU3luY0hhbmRsZXIiOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3luY19wcm9jZXNzb3JfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHJldHVybiBydXN0X2NhbWVsX2Nhc2UodHNlcnZpY2UtPmdldF9uYW1lKCkpICsgIlN5bmNQcm9jZXNzb3IiOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3luY19wcm9jZXNzb3JfaW1wbF9uYW1lKHRfc2VydmljZSAqdHNlcnZpY2UpIHsKKyAgcmV0dXJuICJUIiArIHJ1c3RfY2FtZWxfY2FzZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgKyAiUHJvY2Vzc0Z1bmN0aW9ucyI7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9lbnVtX3ZhcmlhbnRfbmFtZShjb25zdCBzdHJpbmcgJm5hbWUpIHsKKyAgYm9vbCBhbGxfdXBwZXJjYXNlID0gdHJ1ZTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5hbWUuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoaXNhbG51bShuYW1lW2ldKSAmJiBpc2xvd2VyKG5hbWVbaV0pKSB7CisgICAgICBhbGxfdXBwZXJjYXNlID0gZmFsc2U7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoYWxsX3VwcGVyY2FzZSkgeworICAgIHJldHVybiBjYXBpdGFsaXplKGNhbWVsY2FzZShsb3dlcmNhc2UobmFtZSkpKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gY2FwaXRhbGl6ZShjYW1lbGNhc2UobmFtZSkpOworICB9Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF91cHBlcl9jYXNlKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICBzdHJpbmcgc3RyKHVwcGVyY2FzZSh1bmRlcnNjb3JlKG5hbWUpKSk7CisgIHN0cmluZ19yZXBsYWNlKHN0ciwgIl9fIiwgIl8iKTsKKyAgcmV0dXJuIHN0cjsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3NuYWtlX2Nhc2UoY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIHN0cmluZyBzdHIoZGVjYXBpdGFsaXplKHVuZGVyc2NvcmUobmFtZSkpKTsKKyAgc3RyaW5nX3JlcGxhY2Uoc3RyLCAiX18iLCAiXyIpOworICByZXR1cm4gc3RyOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3RfY2FtZWxfY2FzZShjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgc3RyaW5nIHN0cihjYXBpdGFsaXplKGNhbWVsY2FzZShuYW1lKSkpOworICBzdHJpbmdfcmVwbGFjZShzdHIsICJfIiwgIiIpOworICByZXR1cm4gc3RyOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpzdHJpbmdfcmVwbGFjZShzdHJpbmcmIHRhcmdldCwgY29uc3Qgc3RyaW5nJiBzZWFyY2hfc3RyaW5nLCBjb25zdCBzdHJpbmcmIHJlcGxhY2Vfc3RyaW5nKSB7CisgIGlmICh0YXJnZXQuZW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHNpemVfdCBtYXRjaF9sZW4gPSBzZWFyY2hfc3RyaW5nLmxlbmd0aCgpOworICBzaXplX3QgcmVwbGFjZV9sZW4gPSByZXBsYWNlX3N0cmluZy5sZW5ndGgoKTsKKworICBzaXplX3Qgc2VhcmNoX2lkeCA9IDA7CisgIHNpemVfdCBtYXRjaF9pZHg7CisgIHdoaWxlICgobWF0Y2hfaWR4ID0gdGFyZ2V0LmZpbmQoc2VhcmNoX3N0cmluZywgc2VhcmNoX2lkeCkpICE9IHN0cmluZzo6bnBvcykgeworICAgIHRhcmdldC5yZXBsYWNlKG1hdGNoX2lkeCwgbWF0Y2hfbGVuLCByZXBsYWNlX3N0cmluZyk7CisgICAgc2VhcmNoX2lkeCA9IG1hdGNoX2lkeCArIHJlcGxhY2VfbGVuOworICB9Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgIHJzLAorICAiUnVzdCIsCisgICJcbiIpIC8vIG5vIFJ1c3QtZ2VuZXJhdG9yLXNwZWNpZmljIG9wdGlvbnMKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3RfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk1YTk0OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3RfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTA1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogU21hbGx0YWxrIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9zdF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9zdF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgdGVtcG9yYXJ5X3ZhciA9IDA7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIC8qIG5vIG9wdGlvbnMgeWV0ICovCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gc3Q6IiArIGl0ZXItPmZpcnN0OworICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXN0IjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jbGFzc19zaWRlX2RlZmluaXRpb24oKTsKKyAgdm9pZCBnZW5lcmF0ZV9mb3JjZV9jb25zdHMoKTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zdF9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfYWNjZXNzb3JzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIGdlbmVyYXRlX3NlbmRfbWV0aG9kKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcmVjdl9tZXRob2QodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICBzdGQ6OnN0cmluZyBtYXBfcmVhZGVyKHRfbWFwKiB0bWFwKTsKKyAgc3RkOjpzdHJpbmcgbGlzdF9yZWFkZXIodF9saXN0KiB0bGlzdCk7CisgIHN0ZDo6c3RyaW5nIHNldF9yZWFkZXIodF9zZXQqIHRzZXQpOworICBzdGQ6OnN0cmluZyBzdHJ1Y3RfcmVhZGVyKHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBjbHNOYW1lKTsKKworICBzdGQ6OnN0cmluZyBtYXBfd3JpdGVyKHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgbGlzdF93cml0ZXIodF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIHNldF93cml0ZXIodF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBzdHJ1Y3Rfd3JpdGVyKHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBmbmFtZSk7CisKKyAgc3RkOjpzdHJpbmcgd3JpdGVfdmFsKHRfdHlwZSogdCwgc3RkOjpzdHJpbmcgZm5hbWUpOworICBzdGQ6OnN0cmluZyByZWFkX3ZhbCh0X3R5cGUqIHQpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBzdF9hdXRvZ2VuX2NvbW1lbnQoKTsKKworICB2b2lkIHN0X2NsYXNzX2RlZihzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSk7CisgIHZvaWQgc3RfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUpOworICB2b2lkIHN0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyBjYXRlZ29yeSk7CisgIHZvaWQgc3RfY2xvc2VfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0KTsKKyAgdm9pZCBzdF9jbGFzc19tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSk7CisgIHZvaWQgc3RfY2xhc3NfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIGNhdGVnb3J5KTsKKyAgdm9pZCBzdF9zZXR0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgdHlwZSk7CisgIHZvaWQgc3RfZ2V0dGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUpOworICB2b2lkIHN0X2FjY2Vzc29ycyhzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyB0eXBlKTsKKworICBzdGQ6OnN0cmluZyBjbGFzc19uYW1lKCk7CisgIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSk7CisgIHN0ZDo6c3RyaW5nIGNsaWVudF9jbGFzc19uYW1lKCk7CisgIHN0ZDo6c3RyaW5nIHByZWZpeChzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl90eXBlc19jb21tZW50KHRfZnVuY3Rpb24qIGZuKTsKKworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGFfdHlwZSh0X3R5cGUqIHR5cGUpOworICBib29sIGlzX3Zvd2VsKGNoYXIgYyk7CisgIHN0ZDo6c3RyaW5nIHRlbXBfbmFtZSgpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZWRfY2F0ZWdvcnkoKTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKyAgaW50IHRlbXBvcmFyeV92YXI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl87Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgdGVtcG9yYXJ5X3ZhciA9IDA7CisKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9uYW1lID0gZ2V0X291dF9kaXIoKSArICIvIiArIHByb2dyYW1fbmFtZV8gKyAiLnN0IjsKKyAgZl8ub3BlbihmX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfIDw8IHN0X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgc3RfY2xhc3NfZGVmKGZfLCBwcm9ncmFtX25hbWVfKTsKKyAgZ2VuZXJhdGVfY2xhc3Nfc2lkZV9kZWZpbml0aW9uKCk7CisKKyAgLy8gR2VuZXJhdGUgZW51bXMKKyAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOworICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7CisgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgeworICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOworICB9Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6Y2xhc3NfbmFtZSgpIHsKKyAgcmV0dXJuIGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXyk7Cit9CisKK2Jvb2wgdF9zdF9nZW5lcmF0b3I6OmlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgeworICByZXR1cm4gc3ViX25hbWVzcGFjZSA9PSAicHJlZml4IiB8fCBzdWJfbmFtZXNwYWNlID09ICJjYXRlZ29yeSI7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6cHJlZml4KHN0cmluZyBjbGFzc19uYW1lKSB7CisgIHN0cmluZyBwcmVmaXggPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgic21hbGx0YWxrLnByZWZpeCIpOworICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoY2xhc3NfbmFtZSk7CisgIG5hbWUgPSBwcmVmaXguZW1wdHkoKSA/IG5hbWUgOiAocHJlZml4ICsgbmFtZSk7CisgIHJldHVybiBuYW1lOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmNsaWVudF9jbGFzc19uYW1lKCkgeworICByZXR1cm4gY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICJDbGllbnQiOworfQorCisvKioKKyAqIEF1dG9nZW4nZCBjb21tZW50CisgKi8KK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6c3RfYXV0b2dlbl9jb21tZW50KCkgeworICByZXR1cm4gc3RkOjpzdHJpbmcoIiciKSArICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIgKyAiXG4iCisgICAgICAgICArICJETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsgIichXG4iOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mb3JjZV9jb25zdHMoKSB7CisgIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgZW51bXMga2V5c0FuZFZhbHVlc0RvOiBbOmsgOnYgfCAiIDw8IHByZWZpeChjbGFzc19uYW1lKCkpCisgICAgIDw8ICIgZW51bXMgYXQ6IGsgcHV0OiB2IHZhbHVlXS4hIiA8PCBlbmRsOworCisgIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgY29uc3RhbnRzIGtleXNBbmRWYWx1ZXNEbzogWzprIDp2IHwgIiA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKQorICAgICA8PCAiIGNvbnN0YW50cyBhdDogayBwdXQ6IHYgdmFsdWVdLiEiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgZ2VuZXJhdGVfZm9yY2VfY29uc3RzKCk7CisgIGZfLmNsb3NlKCk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVkX2NhdGVnb3J5KCkgeworICBzdHJpbmcgY2F0ID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoInNtYWxsdGFsay5jYXRlZ29yeSIpOworICAvLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBUaHJpZnQgZ3JhbW1hciwgdGhlIGNhdGVnb3J5IG11c3QKKyAgLy8gYmUgcHVuY3R1YXRlZCBieSBkb3RzLiAgUmVwbGFjZXMgdGhlbSB3aXRoIGRhc2hlcyBoZXJlLgorICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaXRlciA9IGNhdC5iZWdpbigpOyBpdGVyICE9IGNhdC5lbmQoKTsgKytpdGVyKSB7CisgICAgaWYgKCppdGVyID09ICcuJykgeworICAgICAgKml0ZXIgPSAnLSc7CisgICAgfQorICB9CisgIHJldHVybiBjYXQuc2l6ZSgpID8gY2F0IDogIkdlbmVyYXRlZC0iICsgY2xhc3NfbmFtZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gU21hbGx0YWxrLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xhc3NfZGVmKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSkgeworICBvdXQgPDwgIk9iamVjdCBzdWJjbGFzczogIyIgPDwgcHJlZml4KG5hbWUpIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImluc3RhbmNlVmFyaWFibGVOYW1lczogJyciIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImNsYXNzVmFyaWFibGVOYW1lczogJyciCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwb29sRGljdGlvbmFyaWVzOiAnJyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiY2F0ZWdvcnk6ICciCisgICAgICA8PCBnZW5lcmF0ZWRfY2F0ZWdvcnkoKSA8PCAiJyEiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSkgeworICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUsICJhcyB5ZXQgdW5jYXRlZ29yaXplZCIpOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9jbGFzc19tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lKSB7CisgIHN0X21ldGhvZChvdXQsIGNscyArICIgY2xhc3MiLCBuYW1lKTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xhc3NfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSwgc3RyaW5nIGNhdGVnb3J5KSB7CisgIHN0X21ldGhvZChvdXQsIGNscywgbmFtZSwgY2F0ZWdvcnkpOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lLCBzdHJpbmcgY2F0ZWdvcnkpIHsKKyAgY2hhciB0aW1lc3RyWzUwXTsKKyAgdGltZV90IHJhd3RpbWU7CisgIHN0cnVjdCB0bSogdGluZm87CisKKyAgdGltZSgmcmF3dGltZSk7CisgIHRpbmZvID0gbG9jYWx0aW1lKCZyYXd0aW1lKTsKKyAgc3RyZnRpbWUodGltZXN0ciwgNTAsICIlbS8lZC8lWSAlSDolTSIsIHRpbmZvKTsKKworICBvdXQgPDwgIiEiIDw8IHByZWZpeChjbHMpIDw8ICIgbWV0aG9kc0ZvcjogJyIgKyBjYXRlZ29yeSArICInIHN0YW1wOiAndGhyaWZ0ICIgPDwgdGltZXN0cgorICAgICAgPDwgIichXG4iIDw8IG5hbWUgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9jbG9zZV9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQpIHsKKyAgb3V0IDw8ICIhICEiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3Rfc2V0dGVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHR5cGUgPSAiYW5PYmplY3QiKSB7CisgIHN0X21ldGhvZChvdXQsIGNscywgbmFtZSArICI6ICIgKyB0eXBlKTsKKyAgb3V0IDw8IG5hbWUgPDwgIiA6PSAiICsgdHlwZTsKKyAgc3RfY2xvc2VfbWV0aG9kKG91dCk7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2dldHRlcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUpIHsKKyAgc3RfbWV0aG9kKG91dCwgY2xzLCBuYW1lICsgIiIpOworICBvdXQgPDwgIl4gIiA8PCBuYW1lOworICBzdF9jbG9zZV9tZXRob2Qob3V0KTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfYWNjZXNzb3JzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHR5cGUgPSAiYW5PYmplY3QiKSB7CisgIHN0X3NldHRlcihvdXQsIGNscywgbmFtZSwgdHlwZSk7CisgIHN0X2dldHRlcihvdXQsIGNscywgbmFtZSk7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NsYXNzX3NpZGVfZGVmaW5pdGlvbigpIHsKKyAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjbGFzcyIgPDwgZW5kbCA8PCAiXHRpbnN0YW5jZVZhcmlhYmxlTmFtZXM6ICdjb25zdGFudHMgZW51bXMnISIKKyAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgIHN0X2FjY2Vzc29ycyhmXywgY2xhc3NfbmFtZSgpICsgIiBjbGFzcyIsICJlbnVtcyIpOworICBzdF9hY2Nlc3NvcnMoZl8sIGNsYXNzX25hbWUoKSArICIgY2xhc3MiLCAiY29uc3RhbnRzIik7CisKKyAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBlbnVtczogRGljdGlvbmFyeSBuZXchIiA8PCBlbmRsOworICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGNvbnN0YW50czogRGljdGlvbmFyeSBuZXchIiA8PCBlbmRsOworCisgIGZfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCisgKiB0aGUgdmFsdWVzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0cmluZyBjbHNfbmFtZSA9IHByb2dyYW1fbmFtZV8gKyBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKTsKKworICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGVudW1zIGF0OiAnIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiJyBwdXQ6IFsiCisgICAgIDw8ICIoRGljdGlvbmFyeSBuZXcgIiA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIGZfIDw8ICJcdGF0OiAnIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIicgcHV0OiAiIDw8IHZhbHVlIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgZl8gPDwgIlx0eW91cnNlbGYpXSEiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjb25zdGFudHMgYXQ6ICciIDw8IG5hbWUgPDwgIicgcHV0OiBbIgorICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8ICJdISIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8ICIoIiA8PCBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpIDw8ICIgbmV3ICIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiOiAiCisgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ5b3Vyc2VsZikiOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBvdXQgPDwgIihEaWN0aW9uYXJ5IG5ldyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgImF0OiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBvdXQgPDwgIiBwdXQ6ICI7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAieW91cnNlbGYpIjsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgb3V0IDw8ICIoU2V0IG5ldyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIoT3JkZXJlZENvbGxlY3Rpb24gbmV3IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKTsKKyAgICAgIG91dCA8PCAiYWRkOiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAieW91cnNlbGYpIjsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBTbWFsbHRhbGsgc3RydWN0CisgKi8KK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9zdF9zdHJ1Y3QoZl8sIHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCisgKgorICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9zdF9zdHJ1Y3QoZl8sIHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc21hbGx0YWxrIGNsYXNzIHRvIHJlcHJlc2VudCBhIHN0cnVjdAorICovCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdF9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24gPSBmYWxzZSkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGlmIChpc19leGNlcHRpb24pCisgICAgb3V0IDw8ICJFcnJvciI7CisgIGVsc2UKKyAgICBvdXQgPDwgIk9iamVjdCI7CisKKyAgb3V0IDw8ICIgc3ViY2xhc3M6ICMiIDw8IHByZWZpeCh0eXBlX25hbWUodHN0cnVjdCkpIDw8IGVuZGwgPDwgIlx0aW5zdGFuY2VWYXJpYWJsZU5hbWVzOiAnIjsKKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKG1faXRlciAhPSBtZW1iZXJzLmJlZ2luKCkpCisgICAgICAgIG91dCA8PCAiICI7CisgICAgICBvdXQgPDwgY2FtZWxjYXNlKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgfQorICB9CisKKyAgb3V0IDw8ICInXG4iCisgICAgICA8PCAiXHRjbGFzc1ZhcmlhYmxlTmFtZXM6ICcnXG4iCisgICAgICA8PCAiXHRwb29sRGljdGlvbmFyaWVzOiAnJ1xuIgorICAgICAgPDwgIlx0Y2F0ZWdvcnk6ICciIDw8IGdlbmVyYXRlZF9jYXRlZ29yeSgpIDw8ICInIVxuXG4iOworCisgIGdlbmVyYXRlX2FjY2Vzc29ycyhvdXQsIHRzdHJ1Y3QpOworfQorCitib29sIHRfc3RfZ2VuZXJhdG9yOjppc192b3dlbChjaGFyIGMpIHsKKyAgc3dpdGNoICh0b2xvd2VyKGMpKSB7CisgIGNhc2UgJ2EnOgorICBjYXNlICdlJzoKKyAgY2FzZSAnaSc6CisgIGNhc2UgJ28nOgorICBjYXNlICd1JzoKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6YV90eXBlKHRfdHlwZSogdHlwZSkgeworICBzdHJpbmcgcHJlZml4OworCisgIGlmIChpc192b3dlbCh0eXBlX25hbWUodHlwZSlbMF0pKQorICAgIHByZWZpeCA9ICJhbiI7CisgIGVsc2UKKyAgICBwcmVmaXggPSAiYSI7CisKKyAgcmV0dXJuIHByZWZpeCArIGNhcGl0YWxpemUodHlwZV9uYW1lKHR5cGUpKTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfYWNjZXNzb3JzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBzdHJpbmcgdHlwZTsKKyAgc3RyaW5nIHByZWZpeDsKKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgc3RfYWNjZXNzb3JzKG91dCwKKyAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKHR5cGVfbmFtZSh0c3RydWN0KSksCisgICAgICAgICAgICAgICAgICAgY2FtZWxjYXNlKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSksCisgICAgICAgICAgICAgICAgICAgYV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIC8vIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjp0ZW1wX25hbWUoKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIG91dCA8PCAidGVtcCIgPDwgdGVtcG9yYXJ5X3ZhcisrOworICByZXR1cm4gb3V0LnN0cigpOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6Om1hcF93cml0ZXIodF9tYXAqIHRtYXAsIHN0cmluZyBmbmFtZSkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBzdHJpbmcga2V5ID0gdGVtcF9uYW1lKCk7CisgIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKKworICBvdXQgPDwgIltvcHJvdCB3cml0ZU1hcEJlZ2luOiAoVE1hcCBuZXcga2V5VHlwZTogIiA8PCB0eXBlX3RvX2VudW0odG1hcC0+Z2V0X2tleV90eXBlKCkpCisgICAgICA8PCAiOyB2YWx1ZVR5cGU6ICIgPDwgdHlwZV90b19lbnVtKHRtYXAtPmdldF92YWxfdHlwZSgpKSA8PCAiOyBzaXplOiAiIDw8IGZuYW1lIDw8ICIgc2l6ZSkuIgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IGZuYW1lIDw8ICIga2V5c0FuZFZhbHVlc0RvOiBbOiIgPDwga2V5IDw8ICIgOiIgPDwgdmFsIDw8ICIgfCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KSA8PCAiLiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgd3JpdGVfdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlTWFwRW5kXSB2YWx1ZSI7CisgIGluZGVudF9kb3duKCk7CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjptYXBfcmVhZGVyKHRfbWFwKiB0bWFwKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIHN0cmluZyBkZXNjID0gdGVtcF9uYW1lKCk7CisgIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKKworICBvdXQgPDwgIlt8IiA8PCBkZXNjIDw8ICIgIiA8PCB2YWwgPDwgInwgIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgZGVzYyA8PCAiIDo9IGlwcm90IHJlYWRNYXBCZWdpbi4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdmFsCisgICAgICA8PCAiIDo9IERpY3Rpb25hcnkgbmV3LiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBkZXNjIDw8ICIgc2l6ZSB0aW1lc1JlcGVhdDogWyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIGF0OiAiIDw8IHJlYWRfdmFsKHRtYXAtPmdldF9rZXlfdHlwZSgpKQorICAgICAgPDwgIiBwdXQ6ICIgPDwgcmVhZF92YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCkpOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90IHJlYWRNYXBFbmQuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbCA8PCAiXSB2YWx1ZSI7CisgIGluZGVudF9kb3duKCk7CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpsaXN0X3dyaXRlcih0X2xpc3QqIHRsaXN0LCBzdHJpbmcgZm5hbWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOworCisgIG91dCA8PCAiW29wcm90IHdyaXRlTGlzdEJlZ2luOiAoVExpc3QgbmV3IGVsZW1UeXBlOiAiIDw8IHR5cGVfdG9fZW51bSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgPDwgIjsgc2l6ZTogIiA8PCBmbmFtZSA8PCAiIHNpemUpLiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IGZuYW1lIDw8ICIgZG86IFs6IiA8PCB2YWwgPDwgInwiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgdmFsKSA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlTGlzdEVuZF0gdmFsdWUiOworICBpbmRlbnRfZG93bigpOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6bGlzdF9yZWFkZXIodF9saXN0KiB0bGlzdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBzdHJpbmcgZGVzYyA9IHRlbXBfbmFtZSgpOworICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7CisKKyAgb3V0IDw8ICJbfCIgPDwgZGVzYyA8PCAiICIgPDwgdmFsIDw8ICJ8ICIgPDwgZGVzYyA8PCAiIDo9IGlwcm90IHJlYWRMaXN0QmVnaW4uIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgOj0gT3JkZXJlZENvbGxlY3Rpb24gbmV3LiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBkZXNjCisgICAgICA8PCAiIHNpemUgdGltZXNSZXBlYXQ6IFsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiBhZGQ6ICIgPDwgcmVhZF92YWwodGxpc3QtPmdldF9lbGVtX3R5cGUoKSk7CisgIGluZGVudF9kb3duKCk7CisKKyAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QgcmVhZExpc3RFbmQuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbCA8PCAiXSB2YWx1ZSI7CisgIGluZGVudF9kb3duKCk7CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpzZXRfd3JpdGVyKHRfc2V0KiB0c2V0LCBzdHJpbmcgZm5hbWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOworCisgIG91dCA8PCAiW29wcm90IHdyaXRlU2V0QmVnaW46IChUU2V0IG5ldyBlbGVtVHlwZTogIiA8PCB0eXBlX3RvX2VudW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgPDwgIjsgc2l6ZTogIiA8PCBmbmFtZSA8PCAiIHNpemUpLiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IGZuYW1lIDw8ICIgZG86IFs6IiA8PCB2YWwgPDwgInwiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB2YWwpIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVTZXRFbmRdIHZhbHVlIjsKKyAgaW5kZW50X2Rvd24oKTsKKworICByZXR1cm4gb3V0LnN0cigpOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnNldF9yZWFkZXIodF9zZXQqIHRzZXQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgc3RyaW5nIGRlc2MgPSB0ZW1wX25hbWUoKTsKKyAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOworCisgIG91dCA8PCAiW3wiIDw8IGRlc2MgPDwgIiAiIDw8IHZhbCA8PCAifCAiIDw8IGRlc2MgPDwgIiA6PSBpcHJvdCByZWFkU2V0QmVnaW4uIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgOj0gU2V0IG5ldy4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgZGVzYyA8PCAiIHNpemUgdGltZXNSZXBlYXQ6IFsiCisgICAgICA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgYWRkOiAiIDw8IHJlYWRfdmFsKHRzZXQtPmdldF9lbGVtX3R5cGUoKSk7CisgIGluZGVudF9kb3duKCk7CisKKyAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QgcmVhZFNldEVuZC4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICJdIHZhbHVlIjsKKyAgaW5kZW50X2Rvd24oKTsKKworICByZXR1cm4gb3V0LnN0cigpOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnN0cnVjdF93cml0ZXIodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBzbmFtZSkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisKKyAgb3V0IDw8ICJbb3Byb3Qgd3JpdGVTdHJ1Y3RCZWdpbjogIgorICAgICAgPDwgIihUU3RydWN0IG5ldyBuYW1lOiAnIiArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiJykuIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgIGJvb2wgb3B0aW9uYWwgPSAoKmZsZF9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgc3RyaW5nIGZuYW1lID0gY2FtZWxjYXNlKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICBzdHJpbmcgYWNjZXNzb3IgPSBzbmFtZSArICIgIiArIGNhbWVsY2FzZShmbmFtZSk7CisKKyAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBhY2Nlc3NvciA8PCAiIGlmTm90TmlsOiBbIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkQmVnaW46IChURmllbGQgbmV3IG5hbWU6ICciIDw8IGZuYW1lCisgICAgICAgIDw8ICInOyB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgPDwgIjsgaWQ6ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKSA8PCAiKS4iIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgd3JpdGVfdmFsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpLCBhY2Nlc3NvcikgPDwgIi4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIm9wcm90IHdyaXRlRmllbGRFbmQiOworCisgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICBvdXQgPDwgIl0iOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisKKyAgICBvdXQgPDwgIi4iIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRTdG9wOyB3cml0ZVN0cnVjdEVuZF0gdmFsdWUiOworICBpbmRlbnRfZG93bigpOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6c3RydWN0X3JlYWRlcih0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIGNsc05hbWUgPSAiIikgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOworICBzdHJpbmcgZGVzYyA9IHRlbXBfbmFtZSgpOworICBzdHJpbmcgZm91bmQgPSB0ZW1wX25hbWUoKTsKKworICBpZiAoY2xzTmFtZS5zaXplKCkgPT0gMCkgeworICAgIGNsc05hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICB9CisKKyAgb3V0IDw8ICJbfCIgPDwgZGVzYyA8PCAiICIgPDwgdmFsIDw8ICJ8IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBUaGlzIGlzIG5hc3R5LCBidXQgd2l0aG91dCBpdCB3ZSdsbCBicmVhayB0aGluZ3MgYnkgcHJlZml4aW5nIFRSZXN1bHQuCisgIHN0cmluZyBuYW1lID0gKChjYXBpdGFsaXplKGNsc05hbWUpID09ICJUUmVzdWx0IikgPyBjYXBpdGFsaXplKGNsc05hbWUpIDogcHJlZml4KGNsc05hbWUpKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIDo9ICIgPDwgbmFtZSA8PCAiIG5ldy4iIDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdCByZWFkU3RydWN0QmVnaW4uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJbIiA8PCBkZXNjCisgICAgICA8PCAiIDo9IGlwcm90IHJlYWRGaWVsZEJlZ2luLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBkZXNjCisgICAgICA8PCAiIHR5cGUgPSBUVHlwZSBzdG9wXSB3aGlsZUZhbHNlOiBbfCIgPDwgZm91bmQgPDwgInwiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlc2MgPDwgIiBpZCA9ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKSA8PCAiIGlmVHJ1ZTogWyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBmb3VuZCA8PCAiIDo9IHRydWUuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbCA8PCAiICIKKyAgICAgICAgPDwgY2FtZWxjYXNlKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOiAiIDw8IHJlYWRfdmFsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgb3V0IDw8ICJdLiIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCBmb3VuZCA8PCAiIGlmTmlsOiBbaXByb3Qgc2tpcDogIiA8PCBkZXNjIDw8ICIgdHlwZV1dLiIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90IHJlYWRTdHJ1Y3RFbmQuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbCA8PCAiXSB2YWx1ZSI7CisgIGluZGVudF9kb3duKCk7CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjp3cml0ZV92YWwodF90eXBlKiB0LCBzdHJpbmcgZm5hbWUpIHsKKyAgdCA9IGdldF90cnVlX3R5cGUodCk7CisKKyAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXQpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiaXByb3Qgd3JpdGVEb3VibGU6ICIgKyBmbmFtZSArICIgYXNGbG9hdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJpcHJvdCB3cml0ZSIgKyBjYXBpdGFsaXplKHR5cGVfbmFtZSh0KSkgKyAiOiAiICsgZm5hbWUgKyAiIGFzSW50ZWdlciI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiaXByb3Qgd3JpdGUiICsgY2FwaXRhbGl6ZSh0eXBlX25hbWUodCkpICsgIjogIiArIGZuYW1lOworICAgIH0KKyAgfSBlbHNlIGlmICh0LT5pc19tYXAoKSkgeworICAgIHJldHVybiBtYXBfd3JpdGVyKCh0X21hcCopdCwgZm5hbWUpOworICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gc3RydWN0X3dyaXRlcigodF9zdHJ1Y3QqKXQsIGZuYW1lKTsKKyAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gbGlzdF93cml0ZXIoKHRfbGlzdCopdCwgZm5hbWUpOworICB9IGVsc2UgaWYgKHQtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuIHNldF93cml0ZXIoKHRfc2V0Kil0LCBmbmFtZSk7CisgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJpcHJvdCB3cml0ZUkzMjogIiArIGZuYW1lOworICB9IGVsc2UgeworICAgIHRocm93ICJTb3JyeSwgSSBkb24ndCBrbm93IGhvdyB0byB3cml0ZSB0aGlzOiAiICsgdHlwZV9uYW1lKHQpOworICB9Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6cmVhZF92YWwodF90eXBlKiB0KSB7CisgIHQgPSBnZXRfdHJ1ZV90eXBlKHQpOworCisgIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiAiaXByb3QgcmVhZCIgKyBjYXBpdGFsaXplKHR5cGVfbmFtZSh0KSk7CisgIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gbWFwX3JlYWRlcigodF9tYXAqKXQpOworICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gc3RydWN0X3JlYWRlcigodF9zdHJ1Y3QqKXQpOworICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiBsaXN0X3JlYWRlcigodF9saXN0Kil0KTsKKyAgfSBlbHNlIGlmICh0LT5pc19zZXQoKSkgeworICAgIHJldHVybiBzZXRfcmVhZGVyKCh0X3NldCopdCk7CisgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJpcHJvdCByZWFkSTMyIjsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiU29ycnksIEkgZG9uJ3Qga25vdyBob3cgdG8gcmVhZCB0aGlzOiAiICsgdHlwZV9uYW1lKHQpOworICB9Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlbmRfbWV0aG9kKHRfZnVuY3Rpb24qIGZ1bmN0aW9uKSB7CisgIHN0cmluZyBmdW5uYW1lID0gZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoZnVuY3Rpb24pOworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKworICBzdF9tZXRob2QoZl8sIGNsaWVudF9jbGFzc19uYW1lKCksICJzZW5kIiArIGNhcGl0YWxpemUoc2lnbmF0dXJlKSk7CisgIGZfIDw8ICJvcHJvdCB3cml0ZU1lc3NhZ2VCZWdpbjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfIDw8IGluZGVudCgpIDw8ICIoVENhbGxNZXNzYWdlIG5ldyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl8gPDwgaW5kZW50KCkgPDwgIm5hbWU6ICciIDw8IGZ1bm5hbWUgPDwgIic7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2VxaWQ6IHNlbGYgbmV4dFNlcWlkKS4iCisgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7CisKKyAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlU3RydWN0QmVnaW46ICIKKyAgICAgPDwgIihUU3RydWN0IG5ldyBuYW1lOiAnIiArIGNhcGl0YWxpemUoY2FtZWxjYXNlKGZ1bm5hbWUpKSArICJfYXJncycpLiIgPDwgZW5kbDsKKworICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgIHN0cmluZyBmbmFtZSA9IGNhbWVsY2FzZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7CisKKyAgICBmXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVGaWVsZEJlZ2luOiAoVEZpZWxkIG5ldyBuYW1lOiAnIiA8PCBmbmFtZQorICAgICAgIDw8ICInOyB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsgaWQ6ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKQorICAgICAgIDw8ICIpLiIgPDwgZW5kbDsKKworICAgIGZfIDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSwgZm5hbWUpIDw8ICIuIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgPDwgIm9wcm90IHdyaXRlRmllbGRFbmQuIiA8PCBlbmRsOworICB9CisKKyAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRTdG9wOyB3cml0ZVN0cnVjdEVuZDsgd3JpdGVNZXNzYWdlRW5kLiIgPDwgZW5kbDsKKyAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHRyYW5zcG9ydCBmbHVzaCI7CisKKyAgc3RfY2xvc2VfbWV0aG9kKGZfKTsKK30KKworLy8gV2Ugb25seSBzdXBwb3J0IHJlY2VpdmluZyBUUmVzdWx0IHN0cnVjdHVyZXMgKHNvIHRoaXMgd29uJ3Qgd29yayBvbiB0aGUgc2VydmVyIHNpZGUpCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWN2X21ldGhvZCh0X2Z1bmN0aW9uKiBmdW5jdGlvbikgeworICBzdHJpbmcgZnVubmFtZSA9IGNhbWVsY2FzZShmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisgIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoZnVuY3Rpb24pOworCisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgIlRSZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKworICB0X3N0cnVjdCogeHMgPSBmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIC8vIGR1cGxpY2F0ZSB0aGUgZmllbGQsIGJ1dCBjYWxsIGl0ICJleGNlcHRpb24iLi4uIHdlIGRvbid0IG5lZWQgYSBkeW5hbWljIG5hbWUKKyAgICB0X2ZpZWxkKiBleGNlcHRpb24gPSBuZXcgdF9maWVsZCgoKmZfaXRlciktPmdldF90eXBlKCksICJleGNlcHRpb24iLCAoKmZfaXRlciktPmdldF9rZXkoKSk7CisgICAgcmVzdWx0LmFwcGVuZChleGNlcHRpb24pOworICB9CisKKyAgc3RfbWV0aG9kKGZfLCBjbGllbnRfY2xhc3NfbmFtZSgpLCAicmVjdiIgKyBjYXBpdGFsaXplKGZ1bm5hbWUpKTsKKyAgZl8gPDwgInwgZiBtc2cgcmVzIHwgIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJtc2cgOj0gb3Byb3QgcmVhZE1lc3NhZ2VCZWdpbi4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgPDwgInNlbGYgdmFsaWRhdGVSZW1vdGVNZXNzYWdlOiBtc2cuIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgIDw8ICJyZXMgOj0gIiA8PCBzdHJ1Y3RfcmVhZGVyKCZyZXN1bHQpIDw8ICIuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCByZWFkTWVzc2FnZUVuZC4iCisgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90IHRyYW5zcG9ydCBmbHVzaC4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgPDwgInJlcyBleGNlcHRpb24gaWZOb3ROaWw6IFtyZXMgZXhjZXB0aW9uIHNpZ25hbF0uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJeIHJlcyI7CisgIHN0X2Nsb3NlX21ldGhvZChmXyk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fdHlwZXNfY29tbWVudCh0X2Z1bmN0aW9uKiBmbikgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBmbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIG91dCA8PCAiXCIiOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgb3V0IDw8IGNhbWVsY2FzZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6ICIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKChmX2l0ZXIgKyAxKSAhPSBmaWVsZHMuZW5kKCkpIHsKKyAgICAgIG91dCA8PCAiLCAiOworICAgIH0KKyAgfQorCisgIG91dCA8PCAiXCIiOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICJUQ2xpZW50IjsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiQ2xpZW50IjsKKyAgfQorCisgIGZfIDw8IGV4dGVuZHNfY2xpZW50IDw8ICIgc3ViY2xhc3M6ICMiIDw8IHByZWZpeChjbGllbnRfY2xhc3NfbmFtZSgpKSA8PCBlbmRsCisgICAgIDw8ICJcdGluc3RhbmNlVmFyaWFibGVOYW1lczogJydcbiIKKyAgICAgPDwgIlx0Y2xhc3NWYXJpYWJsZU5hbWVzOiAnJ1xuIgorICAgICA8PCAiXHRwb29sRGljdGlvbmFyaWVzOiAnJ1xuIgorICAgICA8PCAiXHRjYXRlZ29yeTogJyIgPDwgZ2VuZXJhdGVkX2NhdGVnb3J5KCkgPDwgIichXG5cbiI7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVubmFtZSA9IGNhbWVsY2FzZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcik7CisKKyAgICBzdF9tZXRob2QoZl8sIGNsaWVudF9jbGFzc19uYW1lKCksIHNpZ25hdHVyZSk7CisgICAgZl8gPDwgZnVuY3Rpb25fdHlwZXNfY29tbWVudCgqZl9pdGVyKSA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzZWxmIHNlbmQiCisgICAgICAgPDwgY2FwaXRhbGl6ZShzaWduYXR1cmUpIDw8ICIuIiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmXyA8PCBpbmRlbnQoKSA8PCAiXiBzZWxmIHJlY3YiIDw8IGNhcGl0YWxpemUoZnVubmFtZSkgPDwgIiBzdWNjZXNzICIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBzdF9jbG9zZV9tZXRob2QoZl8pOworCisgICAgZ2VuZXJhdGVfc2VuZF9tZXRob2QoKmZfaXRlcik7CisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBnZW5lcmF0ZV9yZWN2X21ldGhvZCgqZl9pdGVyKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICByZXR1cm4gY2FtZWxjYXNlKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyBjYXBpdGFsaXplKGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSk7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqLworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIgIjsKKyAgICB9CisgICAgc3RyaW5nIG5hbWUgPSBjYW1lbGNhc2UoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICByZXN1bHQgKz0gbmFtZSArICI6ICIgKyBuYW1lOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgc3RyaW5nIHByZWZpeCA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgaWYgKCF0dHlwZS0+aXNfc2VydmljZSgpKSB7CisgICAgICBwcmVmaXggPSBwcm9ncmFtLT5nZXRfbmFtZSgpICsgIl90eXBlcy4iOworICAgIH0KKyAgfQorCisgIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7CisgIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBuYW1lID0gY2FwaXRhbGl6ZSh0dHlwZS0+Z2V0X25hbWUoKSk7CisgIH0KKworICByZXR1cm4gcHJlZml4ICsgbmFtZTsKK30KKworLyogQ29udmVydCB0X3R5cGUgdG8gU21hbGx0YWxrIHR5cGUgY29kZSAqLworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZSBzdHJpbmciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUgYm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUgYnl0ZSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlIGkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlIGkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlIGk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlIGRvdWJsZSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUgaTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZSBzdHJ1Y3QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZSBtYXAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZSBzZXQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUgbGlzdCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1Ioc3QsICJTbWFsbHRhbGsiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3dpZnRfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9zd2lmdF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFkYjA0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3dpZnRfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMzE5OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHNldD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzZXQ7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBTd2lmdCAzIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqIERlc2lnbmVkIGZyb20gdGhlIFN3aWZ0L0NvY29hIGNvZGUgZ2VuZXJhdG9yKHMpCisgKi8KK2NsYXNzIHRfc3dpZnRfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfc3dpZnRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgbG9nX3VuZXhwZWN0ZWRfID0gZmFsc2U7CisgICAgYXN5bmNfY2xpZW50c18gPSBmYWxzZTsKKyAgICBkZWJ1Z19kZXNjcmlwdGlvbnNfID0gZmFsc2U7CisgICAgbm9fc3RyaWN0XyA9IGZhbHNlOworICAgIG5hbWVzcGFjZWRfID0gZmFsc2U7CisgICAgZ2VuX2NvY29hXyA9IGZhbHNlOworICAgIHByb21pc2Vfa2l0XyA9IGZhbHNlOworICAgIHNhZmVfZW51bXNfID0gZmFsc2U7CisKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJsb2dfdW5leHBlY3RlZCIpID09IDApIHsKKyAgICAgICAgbG9nX3VuZXhwZWN0ZWRfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYXN5bmNfY2xpZW50cyIpID09IDApIHsKKyAgICAgICAgYXN5bmNfY2xpZW50c18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub19zdHJpY3QiKSA9PSAwKSB7CisgICAgICAgIG5vX3N0cmljdF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJkZWJ1Z19kZXNjcmlwdGlvbnMiKSA9PSAwKSB7CisgICAgICAgIGRlYnVnX2Rlc2NyaXB0aW9uc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJuYW1lc3BhY2VkIikgPT0gMCkgeworICAgICAgICBuYW1lc3BhY2VkXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImNvY29hIikgPT0gMCkgeworICAgICAgICBnZW5fY29jb2FfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgic2FmZV9lbnVtcyIpID09IDApIHsKKyAgICAgICAgc2FmZV9lbnVtc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJwcm9taXNlX2tpdCIpID09IDApIHsKKyAgICAgICAgaWYgKGdlbl9jb2NvYV8gPT0gZmFsc2UpIHsKKyAgICAgICAgICB0aHJvdyAiUHJvbWlzZUtpdCBvbmx5IGF2YWlsYWJsZSB3aXRoIFN3aWZ0IDIueCwgdXNlIGBjb2NvYWAgb3B0aW9uIiArIGl0ZXItPmZpcnN0OworICAgICAgICB9CisgICAgICAgIHByb21pc2Vfa2l0XyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gc3dpZnQ6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXN3aWZ0IjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisKKyAgdm9pZCByZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworCisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2luaXQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2hhc2hhYmxlX2V4dGVuc2lvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2VxdWF0YWJsZV9leHRlbnNpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3RocmlmdF9leHRlbnNpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3ByaXZhdGUpOworCisKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfcHJpbnRhYmxlX2V4dGVuc2lvbihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF91bmlvbl9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgc3RyaW5nIGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RyaW5nIGZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X3NlcnZpY2UgKnRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9wcm90b2NvbChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfcHJvdG9jb2xfYXN5bmMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50KG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNfcHJvdG9jb2wpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW52b2NhdGlvbihvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfc2VuZF9hc3luY19mdW5jdGlvbl9pbnZvY2F0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzX3Byb3RvY29sKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2FzeW5jX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3NlcnZlcihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdHJpbmcgc3dpZnRfaW1wb3J0cygpOworICBzdHJpbmcgc3dpZnRfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgc3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGlzX29wdGlvbmFsPWZhbHNlLCBib29sIGlzX2ZvcmNlZD1mYWxzZSk7CisgIHN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UpOworICBzdHJpbmcgZGVjbGFyZV9wcm9wZXJ0eSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNfcHJpdmF0ZSk7CisgIHN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RyaW5nIGFzeW5jX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisKKyAgc3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcm90b2NvbF9uYW1lLCBib29sIGlzX2ludGVybmFsKTsKKyAgc3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlLCBib29sIHF1YWxpZmllZD1mYWxzZSk7CisgIHN0cmluZyBtYXliZV9lc2NhcGVfaWRlbnRpZmllcihjb25zdCBzdHJpbmcmIGlkZW50aWZpZXIpOworICB2b2lkIHBvcHVsYXRlX3Jlc2VydmVkX3dvcmRzKCk7CisgIC8qKiBTd2lmdCAzIHNwZWNpZmljICovCisgIHN0cmluZyBlbnVtX2Nhc2VfbmFtZSh0X2VudW1fdmFsdWUqIHRlbnVtX2Nhc2UsIGJvb2wgZGVjbGFyYXRpb24pOworICBzdHJpbmcgZW51bV9jb25zdF9uYW1lKHN0cmluZyBlbnVtX2lkZW50aWZpZXIpOworICB2b2lkIGZ1bmN0aW9uX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgYXN5bmNfZnVuY3Rpb25fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCBzdHJpbmcmIGRvYyk7CisKKyAgLyoqIFN3aWZ0IDIvQ29jb2EgY2FycnlvdmVyICovCisgIHN0cmluZyBwcm9taXNlX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdHJpbmcgZnVuY3Rpb25fbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCx0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19wcml2YXRlKTsKKyAgdm9pZCBnZW5lcmF0ZV9vbGRfc3dpZnRfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLyoqIFN3aWZ0IDIvQ29jb2EgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkqLworICB2b2lkIGdlbmVyYXRlX29sZF9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworICB2b2lkIGdlbmVyYXRlX29sZF9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfcmVhbF9zd2lmdF9tb2R1bGUoY29uc3QgdF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgICAgc3RkOjpzdHJpbmcgcmVhbF9tb2R1bGUgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJzd2lmdCIpOworICAgIGlmIChyZWFsX21vZHVsZS5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcHJvZ3JhbS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlYWxfbW9kdWxlOworICB9Citwcml2YXRlOgorCisgIHZvaWQgYmxvY2tfb3Blbihvc3RyZWFtJiBvdXQpIHsKKyAgICBvdXQgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisKKyAgdm9pZCBibG9ja19jbG9zZShvc3RyZWFtJiBvdXQsIGJvb2wgZW5kX2xpbmU9dHJ1ZSkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICAgIGlmIChlbmRfbGluZSkgb3V0IDw8IGVuZGw7CisgIH0KKworICBib29sIGZpZWxkX2lzX29wdGlvbmFsKHRfZmllbGQqIHRmaWVsZCkgeworICAgIGJvb2wgb3B0ID0gdGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAodGZpZWxkLT5hbm5vdGF0aW9uc18uZmluZCgic3dpZnQubnVsbGFibGUiKSAhPSB0ZmllbGQtPmFubm90YXRpb25zXy5lbmQoKSAmJiB0ZmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBvcHQgPSB0cnVlOworICAgIH0KKyAgICBpZiAoZ2VuX2NvY29hXykgeyAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgb25seSBpZiBpdHMgYWN0dWFsbHkgIm9wdGlvbmFsIgorICAgICAgb3B0ID0gdGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICB9CisgICAgcmV0dXJuIG9wdDsKKyAgfQorCisgIGJvb2wgc3RydWN0X2hhc19yZXF1aXJlZF9maWVsZHModF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCFmaWVsZF9pc19vcHRpb25hbCgqbV9pdGVyKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBzdHJ1Y3RfaGFzX29wdGlvbmFsX2ZpZWxkcyh0X3N0cnVjdCogdHN0cnVjdCkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoZmllbGRfaXNfb3B0aW9uYWwoKm1faXRlcikpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0cmluZyBjb25zdGFudHNfZGVjbGFyYXRpb25zXzsKKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9kZWNsXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2ltcGxfOworCisgIGJvb2wgbG9nX3VuZXhwZWN0ZWRfOworICBib29sIGFzeW5jX2NsaWVudHNfOworCisgIGJvb2wgZGVidWdfZGVzY3JpcHRpb25zXzsKKyAgYm9vbCBub19zdHJpY3RfOworICBib29sIG5hbWVzcGFjZWRfOworICBib29sIHNhZmVfZW51bXNfOworICBzZXQ8c3RyaW5nPiBzd2lmdF9yZXNlcnZlZF93b3Jkc187CisKKyAgLyoqIFN3aWZ0IDIvQ29jb2EgY29tcGF0aWJpbGl0eSAqLworICBib29sIGdlbl9jb2NvYV87CisgIGJvb2wgcHJvbWlzZV9raXRfOworCit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIHN0cmluZyBtb2R1bGUgPSBnZXRfcmVhbF9zd2lmdF9tb2R1bGUocHJvZ3JhbV8pOworICBzdHJpbmcgb3V0X2RpciA9IGdldF9vdXRfZGlyKCk7CisgIHN0cmluZyBtb2R1bGVfcGF0aCA9IG91dF9kaXI7CisgIHN0cmluZyBuYW1lID0gcHJvZ3JhbV9uYW1lXzsKKyAgaWYgKG5hbWVzcGFjZWRfICYmICFtb2R1bGUuZW1wdHkoKSkgeworICAgIG1vZHVsZV9wYXRoID0gbW9kdWxlX3BhdGggKyAiLyIgKyBtb2R1bGU7CisgICAgbmFtZSA9IG1vZHVsZTsKKyAgfQorICBNS0RJUihtb2R1bGVfcGF0aC5jX3N0cigpKTsKKworICBwb3B1bGF0ZV9yZXNlcnZlZF93b3JkcygpOworCisgIC8vIHdlIGhhdmUgYSAuc3dpZnQgZGVjbGFyYXRpb25zIGZpbGUuLi4KKyAgc3RyaW5nIGZfZGVjbF9uYW1lID0gbmFtZSArICIuc3dpZnQiOworICBzdHJpbmcgZl9kZWNsX2Z1bGxuYW1lID0gbW9kdWxlX3BhdGggKyAiLyIgKyBmX2RlY2xfbmFtZTsKKyAgZl9kZWNsXy5vcGVuKGZfZGVjbF9mdWxsbmFtZS5jX3N0cigpKTsKKworICBmX2RlY2xfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgZl9kZWNsXyA8PCBzd2lmdF9pbXBvcnRzKCkgPDwgc3dpZnRfdGhyaWZ0X2ltcG9ydHMoKSA8PCBlbmRsOworCisgIC8vIC4uLmFuZCBhIC5zd2lmdCBpbXBsZW1lbnRhdGlvbiBleHRlbnNpb25zIGZpbGUKKyAgc3RyaW5nIGZfaW1wbF9uYW1lID0gbmFtZSArICIrRXh0cy5zd2lmdCI7CisgIHN0cmluZyBmX2ltcGxfZnVsbG5hbWUgPSBtb2R1bGVfcGF0aCArICIvIiArIGZfaW1wbF9uYW1lOworICBmX2ltcGxfLm9wZW4oZl9pbXBsX2Z1bGxuYW1lLmNfc3RyKCkpOworCisgIGZfaW1wbF8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKworICBmX2ltcGxfIDw8IHN3aWZ0X2ltcG9ydHMoKSA8PCBzd2lmdF90aHJpZnRfaW1wb3J0cygpIDw8IGVuZGw7CisKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgQ29jb2EgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBDb2NvYSBsaWJyYXJpZXMKKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjpzd2lmdF9pbXBvcnRzKCkgeworCisgIHZlY3RvcjxzdHJpbmc+IGluY2x1ZGVzX2xpc3Q7CisgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJGb3VuZGF0aW9uIik7CisKKyAgb3N0cmluZ3N0cmVhbSBpbmNsdWRlczsKKworICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaV9pdGVyOworICBmb3IgKGlfaXRlcj1pbmNsdWRlc19saXN0LmJlZ2luKCk7IGlfaXRlciE9aW5jbHVkZXNfbGlzdC5lbmQoKTsgKytpX2l0ZXIpIHsKKyAgICBpbmNsdWRlcyA8PCAiaW1wb3J0ICIgPDwgKmlfaXRlciA8PCBlbmRsOworICB9CisKKyAgaWYgKG5hbWVzcGFjZWRfKSB7CisgICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBwcm9ncmFtX2luY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJvZ3JhbV9pbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgICAgaW5jbHVkZXMgPDwgKCJpbXBvcnQgIiArIGdldF9yZWFsX3N3aWZ0X21vZHVsZShwcm9ncmFtX2luY2x1ZGVzW2ldKSkgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaW5jbHVkZXMgPDwgZW5kbDsKKworICByZXR1cm4gaW5jbHVkZXMuc3RyKCk7Cit9CisKKy8qKgorICogUHJpbnRzIFRocmlmdCBydW50aW1lIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIFRocmlmdCBydW50aW1lCisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6c3dpZnRfdGhyaWZ0X2ltcG9ydHMoKSB7CisKKyAgdmVjdG9yPHN0cmluZz4gaW5jbHVkZXNfbGlzdDsKKyAgaW5jbHVkZXNfbGlzdC5wdXNoX2JhY2soIlRocmlmdCIpOworCisgIGlmIChnZW5fY29jb2FfICYmIHByb21pc2Vfa2l0XykgeworICAgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJQcm9taXNlS2l0Iik7CisgIH0KKworICBvc3RyaW5nc3RyZWFtIGluY2x1ZGVzOworCisgIHZlY3RvcjxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpX2l0ZXI7CisgIGZvciAoaV9pdGVyPWluY2x1ZGVzX2xpc3QuYmVnaW4oKTsgaV9pdGVyIT1pbmNsdWRlc19saXN0LmVuZCgpOyArK2lfaXRlcikgeworICAgIGluY2x1ZGVzIDw8ICJpbXBvcnQgIiA8PCAqaV9pdGVyIDw8IGVuZGw7CisgIH0KKworICBpbmNsdWRlcyA8PCBlbmRsOworCisgIHJldHVybiBpbmNsdWRlcy5zdHIoKTsKK30KKworLyoqCisgKiBGaW5pc2ggdXAgZ2VuZXJhdGlvbi4KKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICAvLyBzdGljayBvdXIgY29uc3RhbnRzIGRlY2xhcmF0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBoZWFkZXIgZmlsZQorICAvLyBzaW5jZSB0aGV5IHJlZmVyIHRvIHRoaW5ncyB3ZSBhcmUgZGVmaW5pbmcuCisgIGZfZGVjbF8gPDwgY29uc3RhbnRzX2RlY2xhcmF0aW9uc18gPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIGp1c3QgYSBzaW1wbGUgMS1saW5lciBpbiBTd2lmdAorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgdHlwZWFsaWFzICIgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpCisgICAgICAgICAgPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCBlbmRsOworICBmX2RlY2xfIDw8IGVuZGw7Cit9CisKKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBJbiBTd2lmdCwgdGhpcyBpcworICogZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdGhlIHRocmlmdCBkZWZpbml0aW9uIGl0c2VsZiwgdXNpbmcKKyAqIFN3aWZ0IHN5bnRheC4gIENvbmZvcm1zIHRvIFRFbnVtIHdoaWNoCisgKiBpbXBsZW1lbnRlcyByZWFkL3dyaXRlLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGlmIChnZW5fY29jb2FfKSB7CisgICAgZ2VuZXJhdGVfb2xkX2VudW0odGVudW0pOworICAgIHJldHVybjsKKyAgfQorICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZW51bSAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgOiBURW51bSI7CisgIGJsb2NrX29wZW4oZl9kZWNsXyk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworCisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAiIDw8IGVudW1fY2FzZV9uYW1lKCgqY19pdGVyKSwgdHJ1ZSkgPDwgZW5kbDsKKyAgfQorCisgIC8vIHVua25vd24gYXNzb2NpYXRlZCB2YWx1ZSBjYXNlIGZvciBzYWZldHkgYW5kIHNpbWlsYXIgYmVoYXZpb3IgdG8gb3RoZXIgbGFuZ3VhZ2VzCisgIGlmIChzYWZlX2VudW1zXykgeworICAgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImNhc2UgdW5rbm93bihJbnQzMikiIDw8IGVuZGw7CisgIH0KKyAgZl9kZWNsXyA8PCBlbmRsOworCisgIC8vIFRTZXJpYWxpemFibGUgcmVhZChmcm9tOikKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gIgorICAgICAgICAgIDw8IHRlbnVtLT5nZXRfbmFtZSgpOworICBibG9ja19vcGVuKGZfZGVjbF8pOworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJsZXQgcmF3OiBJbnQzMiA9IHRyeSBwcm90by5yZWFkKCkiIDw8IGVuZGw7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImxldCBuZXcgPSAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIocmF3VmFsdWU6IHJhdykiIDw8IGVuZGw7CisKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAiaWYgbGV0IHVud3JhcHBlZCA9IG5ldyB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHVud3JhcHBlZCIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJ0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmludmFsaWREYXRhLCIgPDwgZW5kbDsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXCJJbnZhbGlkIGVudW0gdmFsdWUgKFxcKHJhdykpIGZvciBcXCgiCisgICAgICAgICAgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIi5zZWxmKVwiKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2UoZl9kZWNsXyk7CisKKyAgLy8gZW1wdHkgaW5pdCBmb3IgVFNlcmlhbGl6YWJsZQorICBmX2RlY2xfIDw8IGVuZGw7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbml0KCkiOworICBibG9ja19vcGVuKGZfZGVjbF8pOworCisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInNlbGYgPSAuIiA8PCBlbnVtX2Nhc2VfbmFtZShjb25zdGFudHMuZnJvbnQoKSwgZmFsc2UpIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKGZfZGVjbF8pOworICBmX2RlY2xfIDw8IGVuZGw7CisKKyAgLy8gcmF3VmFsdWUgZ2V0dGVyCisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2YXIgcmF3VmFsdWU6IEludDMyIjsKKyAgYmxvY2tfb3BlbihmX2RlY2xfKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIHNlbGYgeyIgPDwgZW5kbDsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJjYXNlIC4iIDw8IGVudW1fY2FzZV9uYW1lKCgqY19pdGVyKSwgdHJ1ZSkKKyAgICAgICAgICAgIDw8ICI6IHJldHVybiAiIDw8ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkgPDwgZW5kbDsKKyAgfQorICBpZiAoc2FmZV9lbnVtc18pIHsKKyAgICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJjYXNlIC51bmtub3duKGxldCB2YWx1ZSk6IHJldHVybiB2YWx1ZSIgPDwgZW5kbDsKKyAgfQorICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBibG9ja19jbG9zZShmX2RlY2xfKTsKKyAgZl9kZWNsXyA8PCBlbmRsOworCisgIC8vIGNvbnZlbmllbmNlIHJhd1ZhbHVlIGluaXRhbGl6ZXIKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGluaXQ/KHJhd1ZhbHVlOiBJbnQzMikiOworICBibG9ja19vcGVuKGZfZGVjbF8pOworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggcmF3VmFsdWUgeyIgPDwgZW5kbDs7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAiIDw8ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkKKyAgICAgICAgICAgIDw8ICI6IHNlbGYgPSAuIiA8PCBlbnVtX2Nhc2VfbmFtZSgoKmNfaXRlciksIHRydWUpIDw8IGVuZGw7CisgIH0KKyAgaWYgKCFzYWZlX2VudW1zXykgeworICAgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IHJldHVybiBuaWwiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDogc2VsZiA9IC51bmtub3duKHJhd1ZhbHVlKSIgPDwgZW5kbDsKKyAgfQorICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBibG9ja19jbG9zZShmX2RlY2xfKTsKKworCisKKworICBibG9ja19jbG9zZShmX2RlY2xfKTsKKyAgZl9kZWNsXyA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIFRoaXMgaXMgZm9yIFN3aWZ0IDIueC9Db2NvYQorICogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX29sZF9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGVudW0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIDogSW50MzIiOworICBibG9ja19vcGVuKGZfZGVjbF8pOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgIDw8ICIgPSAiIDw8ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkgPDwgZW5kbDsKKyAgfQorCisgIGZfZGVjbF8gPDwgZW5kbDsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGluaXQoKSB7IHNlbGYuaW5pdChyYXdWYWx1ZTogIiA8PCBjb25zdGFudHMuZnJvbnQoKS0+Z2V0X3ZhbHVlKCkgPDwgIikhIH0iIDw8IGVuZGw7CisKKyAgYmxvY2tfY2xvc2UoZl9kZWNsXyk7CisgIGZfZGVjbF8gPDwgZW5kbDsKKworICBmX2ltcGxfIDw8IGluZGVudCgpIDw8ICJleHRlbnNpb24gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIDogVEVudW0iOworICBibG9ja19vcGVuKGZfaW1wbF8pOworCisgIGZfaW1wbF8gPDwgZW5kbDsKKworICBmX2ltcGxfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpOworICBibG9ja19vcGVuKGZfaW1wbF8pOworICBmX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ2YXIgcmF3ID0gSW50MzIoKSIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgcHJvdG8ucmVhZEkzMigmcmF3KSIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiKHJhd1ZhbHVlOiByYXcpISIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2UoZl9pbXBsXyk7CisgIGZfaW1wbF8gPDwgZW5kbDsKKworICBmX2ltcGxfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiLCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyI7CisgIGJsb2NrX29wZW4oZl9pbXBsXyk7CisgIGZfaW1wbF8gPDwgaW5kZW50KCkgPDwgInRyeSBwcm90by53cml0ZUkzMih2YWx1ZS5yYXdWYWx1ZSkiIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKGZfaW1wbF8pOworICBmX2ltcGxfIDw8IGVuZGw7CisKKyAgYmxvY2tfY2xvc2UoZl9pbXBsXyk7CisgIGZfaW1wbF8gPDwgZW5kbDsKK30KKworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjplbnVtX2Nhc2VfbmFtZSh0X2VudW1fdmFsdWUqIHRlbnVtX2Nhc2UsIGJvb2wgZGVjbGFyYXRpb24pIHsKKyAgc3RyaW5nIG5hbWUgPSB0ZW51bV9jYXNlLT5nZXRfbmFtZSgpOworICAvLyBmb3JjZSB0byBsb3dlcmNhc2UgZm9yIFN3aWZ0IHN0eWxlLCBtYXliZSBlc2NhcGUgaWYgaXRzIGEga2V5d29yZAorICBzdGQ6OnRyYW5zZm9ybShuYW1lLmJlZ2luKCksIG5hbWUuZW5kKCksIG5hbWUuYmVnaW4oKSwgOjp0b2xvd2VyKTsKKyAgaWYgKGRlY2xhcmF0aW9uKSB7CisgICAgbmFtZSA9IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKG5hbWUpOworICB9CisgIHJldHVybiBuYW1lOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBjb25zdGFudCBlbnVtIHZhbHVlIGJ5IHRyYW5zZm9ybWluZyB0aGUgdmFsdWUgcG9ydGlvbiB0byBsb3dlcmNhc2UKKyAqIGZvciBTd2lmdCBzdHlsZS4KKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjplbnVtX2NvbnN0X25hbWUoc3RyaW5nIGVudW1faWRlbnRpZmllcikgeworICBzdHJpbmc6Oml0ZXJhdG9yIGl0OworICBmb3IgKGl0ID0gZW51bV9pZGVudGlmaWVyLmJlZ2luKCk7IGl0IDwgZW51bV9pZGVudGlmaWVyLmVuZCgpOyArK2l0KSB7CisgICAgaWYgKCgqaXQpID09ICcuJykgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHN0ZDo6dHJhbnNmb3JtKGl0LCBlbnVtX2lkZW50aWZpZXIuZW5kKCksIGl0LCA6OnRvbG93ZXIpOworICByZXR1cm4gZW51bV9pZGVudGlmaWVyOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBwdWJsaWMgY29uc3RhbnRzIGZvciBhbGwgVGhyaWZ0IGNvbnN0YW50cy4KKyAqCisgKiBAcGFyYW0gY29uc3RzIENvbnN0YW50cyB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHModmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKworICBvc3RyaW5nc3RyZWFtIGNvbnN0X2ludGVyZmFjZTsKKworICAvLyBQdWJsaWMgY29uc3RhbnRzIGZvciBiYXNlIHR5cGVzICYgc3RyaW5ncworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIGNvbnN0X2ludGVyZmFjZSA8PCAicHVibGljIGxldCAiIDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDogIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiA9ICI7CisgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKGNvbnN0X2ludGVyZmFjZSwgdHlwZSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgY29uc3RfaW50ZXJmYWNlIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIHRoaXMgZ2V0cyBzcGl0IGludG8gdGhlIGhlYWRlciBmaWxlIGluIDo6Y2xvc2VfZ2VuZXJhdG9yCisgIGNvbnN0YW50c19kZWNsYXJhdGlvbnNfID0gY29uc3RfaW50ZXJmYWNlLnN0cigpOworCit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBhIHN0cnVjdAorICogd2l0aCBwdWJsaWMgbWVtYmVycy4gT3B0aW9uYWwgdHlwZXMgYXJlIHVzZWQgZm9yIG9wdGlvbmFsIHByb3BlcnRpZXMgdG8KKyAqIGFsbG93IHRoZW0gdG8gYmUgdGVzdGVkIGZvciBhdmFpbGFiaWxpdHkuIFNlcGFyYXRlIGluaXRzIGFyZSBpbmNsdWRlZCBmb3IKKyAqIHJlcXVpcmVkIHByb3BlcnRpZXMgJiBhbGwgcHJvcGVydGllcy4KKyAqCisgKiBHZW5lcmF0ZXMgZXh0ZW5zaW9ucyB0byBwcm92aWRlIGNvbmZvcm1hbmNlIHRvIFRTdHJ1Y3QsIFRTZXJpYWxpemFibGUsCisgKiBIYXNoYWJsZSAmIEVxdWF0YWJsZQorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0KGZfZGVjbF8sIHRzdHJ1Y3QsIGZhbHNlKTsKKyAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzdHJ1Y3QsIGZhbHNlLCBmYWxzZSk7Cit9CisKKy8qKgorICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgY29uZm9ybSB0byBFcnJvcgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdChmX2RlY2xfLCB0eGNlcHRpb24sIGZhbHNlKTsKKyAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHR4Y2VwdGlvbiwgZmFsc2UsIGZhbHNlKTsKK30KKwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgc3RyaW5nJiBkb2MpIHsKKyAgaWYgKGRvYyAhPSAiIikgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdzOworCisgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSAwOworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcHJldiA9IDA7CisgICAgd2hpbGUgKCgocG9zID0gZG9jLmZpbmQoIlxuIiwgcHJldikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgICAgICB8fCAoKHBvcyA9IGRvYy5maW5kKCJcciIsIHByZXYpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgICAgfHwgKChwb3MgPSBkb2MuZmluZCgiXHJcbiIsIHByZXYpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykpCisgICAgeworICAgICAgICBzdHJpbmdzLnB1c2hfYmFjayhkb2Muc3Vic3RyKHByZXYsIHBvcyAtIHByZXYpKTsKKyAgICAgICAgcHJldiA9IHBvcyArIDE7CisgICAgfQorCisgICAgLy8gVG8gZ2V0IHRoZSBsYXN0IHN1YnN0cmluZyAob3Igb25seSwgaWYgZGVsaW1pdGVyIGlzIG5vdCBmb3VuZCkKKyAgICBzdHJpbmdzLnB1c2hfYmFjayhkb2Muc3Vic3RyKHByZXYpKTsKKworICAgIHZlY3RvcjxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBkX2l0ZXI7CisgICAgZm9yIChkX2l0ZXIgPSBzdHJpbmdzLmJlZ2luKCk7IGRfaXRlciAhPSBzdHJpbmdzLmVuZCgpOyArK2RfaXRlcikgeworICAgICAgaWYgKCgqZF9pdGVyKSAhPSAiIikgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vLyAiIDw8ICgqZF9pdGVyKSA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgaW50ZXJmYWNlIGZvciBhIHN0cnVjdC4gT25seSBwcm9wZXJ0aWVzIGFuZAorICogaW5pdCBtZXRob2RzIGFyZSBpbmNsdWRlZC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19wcml2YXRlCisgKiAgICAgICAgICAgICAgICBJcyB0aGUgc3RydWN0IHB1YmxpYyBvciBwcml2YXRlCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CisKKyAgaWYgKGdlbl9jb2NvYV8pIHsKKyAgICBnZW5lcmF0ZV9vbGRfc3dpZnRfc3RydWN0KG91dCwgdHN0cnVjdCwgaXNfcHJpdmF0ZSk7CisgICAgcmV0dXJuOworICB9CisgIHN0cmluZyBkb2MgPSB0c3RydWN0LT5nZXRfZG9jKCk7CisgIGdlbmVyYXRlX2RvY3N0cmluZyhvdXQsIGRvYyk7CisKKworICAvLyBwcm9wZXJ0aWVzCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKworICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIC8vIHNwZWNpYWwsIHVuaW9ucworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGVudW0gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIHN0cmluZyBkb2MgPSAoKm1faXRlciktPmdldF9kb2MoKTsKKyAgICAgIGdlbmVyYXRlX2RvY3N0cmluZyhvdXQsIGRvYyk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNhc2UgIgorICAgICAgICAgIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIih2YWw6ICIKKyAgICAgICAgICA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSkgPDwgIikiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIE5vcm1hbCBzdHJ1Y3RzCisKKyAgICBzdHJpbmcgdmlzaWJpbGl0eSA9IGlzX3ByaXZhdGUgPyAoZ2VuX2NvY29hXyA/ICJwcml2YXRlIiA6ICJmaWxlcHJpdmF0ZSIpIDogInB1YmxpYyI7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgdmlzaWJpbGl0eSA8PCAiIGZpbmFsIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKworICAgIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7CisgICAgICBvdXQgPDwgIiA6IFN3aWZ0LkVycm9yIjsgLy8gRXJyb3Igc2VlbXMgdG8gYmUgYSBjb21tb24gZXhjZXB0aW9uIG5hbWUgaW4gdGhyaWZ0CisgICAgfQorCisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgLy8gVE9ETzogRGVmYXVsdHMKKworICAgICAgc3RyaW5nIGRvYyA9ICgqbV9pdGVyKS0+Z2V0X2RvYygpOworICAgICAgZ2VuZXJhdGVfZG9jc3RyaW5nKG91dCwgZG9jKTsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfcHJvcGVydHkoKm1faXRlciwgaXNfcHJpdmF0ZSkgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGlmICghc3RydWN0X2hhc19yZXF1aXJlZF9maWVsZHModHN0cnVjdCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHZpc2liaWxpdHkgPDwgIiBpbml0KCkgeyB9IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoc3RydWN0X2hhc19yZXF1aXJlZF9maWVsZHModHN0cnVjdCkpIHsKKyAgICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbml0KG91dCwgdHN0cnVjdCwgZmFsc2UsIGlzX3ByaXZhdGUpOworICAgIH0KKyAgICBpZiAoc3RydWN0X2hhc19vcHRpb25hbF9maWVsZHModHN0cnVjdCkpIHsKKyAgICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbml0KG91dCwgdHN0cnVjdCwgdHJ1ZSwgaXNfcHJpdmF0ZSk7CisgICAgfQorICB9CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBMZWdhY3kgU3dpZnQyL0NvY29hIGdlbmVyYXRvcgorICoKKyAqIEBwYXJhbSB0c3RydWN0CisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICovCisKKwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2xkX3N3aWZ0X3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpIHsKKyAgc3RyaW5nIHZpc2liaWxpdHkgPSBpc19wcml2YXRlID8gInByaXZhdGUiIDogInB1YmxpYyI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IHZpc2liaWxpdHkgPDwgIiBmaW5hbCBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBvdXQgPDwgIiA6IEVycm9yVHlwZSI7CisgIH0KKworICBibG9ja19vcGVuKG91dCk7CisKKyAgLy8gcHJvcGVydGllcworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9wcm9wZXJ0eSgqbV9pdGVyLCBpc19wcml2YXRlKSA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gaW5pdAorCisgIGluZGVudChvdXQpIDw8IHZpc2liaWxpdHkgPDwgIiBpbml0KCkiOworICBibG9ja19vcGVuKG91dCk7CisgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgaWYgKHN0cnVjdF9oYXNfcmVxdWlyZWRfZmllbGRzKHRzdHJ1Y3QpKSB7CisgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2luaXQob3V0LCB0c3RydWN0LCBmYWxzZSwgaXNfcHJpdmF0ZSk7CisgIH0KKyAgaWYgKHN0cnVjdF9oYXNfb3B0aW9uYWxfZmllbGRzKHRzdHJ1Y3QpKSB7CisgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2luaXQob3V0LCB0c3RydWN0LCB0cnVlLCBpc19wcml2YXRlKTsKKyAgfQorCisgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgc3RydWN0IGluaXQgZm9yIHByb3BlcnRpZXMKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAqIEBwYXJhbSBhbGwgICAgIEdlbmVyYXRlIGluaXQgd2l0aCBhbGwgb3IganVzdCByZXF1aXJlZCBwcm9wZXJ0aWVzCisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICogICAgICAgICAgICAgICAgSXMgdGhlIGluaXRpYWxpemVyIHB1YmxpYyBvciBwcml2YXRlCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbml0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpIHsKKworICBzdHJpbmcgdmlzaWJpbGl0eSA9IGlzX3ByaXZhdGUgPyAoZ2VuX2NvY29hXyA/ICJwcml2YXRlIiA6ICJmaWxlcHJpdmF0ZSIpIDogInB1YmxpYyI7CisKKyAgaW5kZW50KG91dCkgPDwgdmlzaWJpbGl0eSA8PCAiIGluaXQoIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGJvb2wgZmlyc3Q9dHJ1ZTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOykgeworICAgIGlmIChhbGwgfHwgIWZpZWxkX2lzX29wdGlvbmFsKCptX2l0ZXIpKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjogIgorICAgICAgICAgIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCksIGZpZWxkX2lzX29wdGlvbmFsKCptX2l0ZXIpKSk7CisgICAgfQorICAgICsrbV9pdGVyOworICB9CisgIG91dCA8PCAiKSI7CisKKyAgYmxvY2tfb3BlbihvdXQpOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAgIGJvb2wgc2hvdWxkX3NldCA9IGFsbDsKKyAgICAgIHNob3VsZF9zZXQgPSBzaG91bGRfc2V0IHx8ICFmaWVsZF9pc19vcHRpb25hbCgoKm1faXRlcikpOworICAgICAgaWYgKHNob3VsZF9zZXQpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmLiIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gIgorICAgICAgICAgICAgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiogbGVnYWN5IFN3aWZ0Mi9Db2NvYSAqLworICAgICAgaWYgKGFsbCB8fCAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEIHx8ICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmLiIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gIgorICAgICAgICAgICAgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgdGhlIGhhc2hhYmxlIHByb3RvY29sIGltcGxtZW50YXRpb24KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19wcml2YXRlCisgKiAgICAgICAgICAgICAgICBJcyB0aGUgc3RydWN0IHB1YmxpYyBvciBwcml2YXRlCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9oYXNoYWJsZV9leHRlbnNpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CisKKyAgc3RyaW5nIHZpc2liaWxpdHkgPSBpc19wcml2YXRlID8gKGdlbl9jb2NvYV8gPyAicHJpdmF0ZSIgOiAiZmlsZXByaXZhdGUiKSA6ICJwdWJsaWMiOworICBpbmRlbnQob3V0KSA8PCAiZXh0ZW5zaW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIDogSGFzaGFibGUiOworICBibG9ja19vcGVuKG91dCk7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCB2aXNpYmlsaXR5IDw8ICIgdmFyIGhhc2hWYWx1ZSA6IEludCI7CisgIGJsb2NrX29wZW4ob3V0KTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGlmICghbWVtYmVycy5lbXB0eSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImxldCBwcmltZSA9IDMxIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ2YXIgcmVzdWx0ID0gMSIgPDwgZW5kbDsKKyAgICBpZiAoIXRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgdF9maWVsZCogdGZpZWxkID0gKm1faXRlcjsKKyAgICAgICAgc3RyaW5nIGFjY2Vzc29yID0gZmllbGRfaXNfb3B0aW9uYWwodGZpZWxkKSA/ICI/LiIgOiAiLiI7CisgICAgICAgIHN0cmluZyBkZWZhdWx0b3IgPSBmaWVsZF9pc19vcHRpb25hbCh0ZmllbGQpID8gIiA/PyAwIiA6ICIiOworICAgICAgICBpbmRlbnQob3V0KSA8PCAicmVzdWx0ID0gcHJpbWUgJiogcmVzdWx0ICYrICgiIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgYWNjZXNzb3IKKyAgICAgICAgICAgICAgICAgICAgPDwgICJoYXNoVmFsdWUiIDw8IGRlZmF1bHRvciA8PCAiKSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCBzZWxmIHsiIDw8IGVuZGw7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1faXRlcisrKSB7CisgICAgICAgIHRfZmllbGQgKnRmaWVsZCA9ICptX2l0ZXI7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlIC4iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKGxldCB2YWwpOiByZXN1bHQgPSBwcmltZSAmKiB2YWwuaGFzaFZhbHVlIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiByZXN1bHQiIDw8IGVuZGw7CisgIH0KKyAgZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAzMSIgPDwgZW5kbDsKKyAgfQorCisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgZXF1YXRhYmxlIHByb3RvY29sIGltcGxlbWVudGF0aW9uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICogICAgICAgICAgICAgICAgSXMgdGhlIHN0cnVjdCBwdWJsaWMgb3IgcHJpdmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfZXF1YXRhYmxlX2V4dGVuc2lvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSkgeworCisgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/IChnZW5fY29jb2FfID8gInByaXZhdGUiIDogImZpbGVwcml2YXRlIikgOiAicHVibGljIjsKKworICBpbmRlbnQob3V0KSA8PCB2aXNpYmlsaXR5IDw8ICIgZnVuYyA9PShsaHM6ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIsIHJoczogIgorICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIikgLT4gQm9vbCI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBpZiAobWVtYmVycy5zaXplKCkpIHsKKyAgICBpZiAoIXRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTspIHsKKyAgICAgICAgdF9maWVsZCogdGZpZWxkID0gKm1faXRlcjsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIihsaHMuIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcih0ZmllbGQtPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgIDw8IChnZW5fY29jb2FfID8gIiA/IiA6ICIgIikgPDwgIj09IHJocy4iIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIikiOyAvLyBzd2lmdCAyID89PSBvcGVyYXRvciBub3QgaW4gMz8KKyAgICAgICAgaWYgKCsrbV9pdGVyICE9IG1lbWJlcnMuZW5kKCkpIHsKKyAgICAgICAgICBvdXQgPDwgIiAmJiI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0gZWxzZSB7CisgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChsaHMsIHJocykgeyIgPDwgZW5kbDsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgdF9maWVsZCogdGZpZWxkID0gKm1faXRlcjsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgKC4iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKGxldCBsdmFsKSwgLiIKKyAgICAgICAgICAgICAgICAgICAgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIobGV0IHJ2YWwpKTogcmV0dXJuIGx2YWwgPT0gcnZhbCIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiByZXR1cm4gZmFsc2UiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSgpIiA8PCBlbmRsOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBvdXQgPDwgIiB0cnVlIiA8PCBlbmRsOworICB9CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgc3RydWN0IGltcGxlbWVudGF0aW9uLiBQcm9kdWNlcyBleHRlbnNpb25zIHRoYXQKKyAqIGZ1bGZpbGwgdGhlIHJlcXVpc2l0ZSBwcm90b2NvbHMgdG8gY29tcGxldGUgdGhlIHZhbHVlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX3Jlc3VsdAorICogICAgICAgICAgICAgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKKyAqIEBwYXJhbSBpc19wcml2YXRlCisgKiAgICAgICAgICAgICAgICBJcyB0aGUgc3RydWN0IHB1YmxpYyBvciBwcml2YXRlCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CisKKyAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2VxdWF0YWJsZV9leHRlbnNpb24ob3V0LCB0c3RydWN0LCBpc19wcml2YXRlKTsKKworICBpZiAoIWlzX3ByaXZhdGUgJiYgIWlzX3Jlc3VsdCAmJiAhZ2VuX2NvY29hXykgeyAgLy8gb2xkIGNvbXBpbGVyIGRpZG4ndCB1c2UgZGVidWdfZGVzY3JpcHRpb25zLCBPUiBpdCB3aXRoIGdlbl9jb2NvYV8gc28gdGhlIGZsYWcgZG9lc24ndCBtYXR0ZXIgdy8gY29jb2EKKyAgICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfcHJpbnRhYmxlX2V4dGVuc2lvbihvdXQsIHRzdHJ1Y3QpOworICB9CisKKyAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2hhc2hhYmxlX2V4dGVuc2lvbihvdXQsIHRzdHJ1Y3QsIGlzX3ByaXZhdGUpOworICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfdGhyaWZ0X2V4dGVuc2lvbihvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCwgaXNfcHJpdmF0ZSk7CisKKyAgb3V0IDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgVFN0cnVjdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19yZXN1bHQKKyAqICAgICAgICAgICAgICAgIElzIHRoZSBzdHJ1Y3QgYSByZXN1bHQgdmFsdWUKKyAqIEBwYXJhbSBpc19wcml2YXRlCisgKiAgICAgICAgICAgICAgICBJcyB0aGUgc3RydWN0IHB1YmxpYyBvciBwcml2YXRlCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF90aHJpZnRfZXh0ZW5zaW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpIHsKKworICBpbmRlbnQob3V0KSA8PCAiZXh0ZW5zaW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIDogVFN0cnVjdCI7CisKKyAgYmxvY2tfb3BlbihvdXQpOworCisgIG91dCA8PCBlbmRsOworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAvKiogU3dpZnQgMywgbm8gd3JpdGVyIHdlIGp1c3Qgd3JpdGUgZmllbGQgSUQncyAqLworICAgIHN0cmluZyBhY2Nlc3MgPSAoaXNfcHJpdmF0ZSkgPyAoZ2VuX2NvY29hXyA/ICJwcml2YXRlIiA6ICJmaWxlcHJpdmF0ZSIpIDogInB1YmxpYyI7CisgICAgLy8gZ2VuZXJhdGUgZmllbGRJRCdzIGRpY3Rpb25hcnkKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgYWNjZXNzIDw8ICIgc3RhdGljIHZhciBmaWVsZElkczogW1N0cmluZzogSW50MzJdIjsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gWyI7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgYm9vbCB3cm90ZSA9IGZhbHNlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICB3cm90ZSA9IHRydWU7CisgICAgICBvdXQgPDwgIlwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiOiAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsICI7CisgICAgfQorICAgIGlmICghd3JvdGUpIHsKKyAgICAgIC8vIHBhZCBhIGNvbG9uCisgICAgICBvdXQgPDwgIjoiOworICAgIH0KKyAgICBvdXQgPDwgIl0iIDw8IGVuZGw7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgYWNjZXNzIDw8ICIgc3RhdGljIHZhciBzdHJ1Y3ROYW1lOiBTdHJpbmcgeyByZXR1cm4gXCIiCisgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiIH0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgICBnZW5lcmF0ZV9zd2lmdF91bmlvbl9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QsIGlzX3ByaXZhdGUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiogTGVnYWN5IFN3aWZ0Mi9Db2NvYSAqLworCisgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QsIGlzX3ByaXZhdGUpOworCisgICAgaWYgKGlzX3Jlc3VsdCkgeworICAgICAgZ2VuZXJhdGVfb2xkX3N3aWZ0X3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZ2VuZXJhdGVfb2xkX3N3aWZ0X3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0LCBpc19wcml2YXRlKTsKKyAgICB9CisgIH0KKworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfdW5pb25fcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+ICIKKyAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgYmxvY2tfb3BlbihvdXQpOworICBpbmRlbnQob3V0KSA8PCAiXyA9IHRyeSBwcm90by5yZWFkU3RydWN0QmVnaW4oKSIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAidmFyIHJldDogIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI/IjsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJmaWVsZHM6IHdoaWxlIHRydWUiOworICBibG9ja19vcGVuKG91dCk7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAibGV0IChfLCBmaWVsZFR5cGUsIGZpZWxkSUQpID0gdHJ5IHByb3RvLnJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCwgZmllbGRUeXBlKSI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgKF8sIC5zdG9wKTogICAgICAgICAgICBicmVhayBmaWVsZHMiIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICgiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIik6IjsKKyAgICBzdHJpbmcgcGFkZGluZyA9ICIiOworCisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAgIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgICAiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSB8fCB0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19tYXAoKSkgeworICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICAgIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgICI7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgcGFkZGluZyA8PCAicmV0ID0gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIuIgorICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKHZhbDogIiA8PCAidHJ5ICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICAgPDwgIi5yZWFkKGZyb206IHByb3RvKSkiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiY2FzZSBsZXQgKF8sIHVua25vd25UeXBlKTogIHRyeSBwcm90by5za2lwKHR5cGU6IHVua25vd25UeXBlKSIgPDwgZW5kbDsKKworICBibG9ja19jbG9zZShvdXQpOworICBpbmRlbnQob3V0KSA8PCAidHJ5IHByb3RvLnJlYWRGaWVsZEVuZCgpIiA8PCBlbmRsOworCisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJ0cnkgcHJvdG8ucmVhZFN0cnVjdEVuZCgpIiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJpZiBsZXQgcmV0ID0gcmV0IjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHJldCIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLnVua25vd24sIG1lc3NhZ2U6IFwiTWlzc2luZyByZXF1aXJlZCB2YWx1ZSBmb3IgdHlwZTogIgorICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIikiOworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKKworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYSBzdHJ1Y3QgZnJvbQorICogZnJvbSBhIHByb3RvY29sLiAoVFN0cnVjdCBjb21wbGlhbmNlKQorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX3ByaXZhdGUKKyAqICAgICAgICAgICAgICAgIElzIHRoZSBzdHJ1Y3QgcHVibGljIG9yIHByaXZhdGUKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpIHsKKworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAvKiogU3dpZnQgMyBjYXNlICovCisgICAgc3RyaW5nIHZpc2liaWxpdHkgPSBpc19wcml2YXRlID8gImZpbGVwcml2YXRlIiA6ICJwdWJsaWMiOworCisgICAgaW5kZW50KG91dCkgPDwgdmlzaWJpbGl0eSA8PCAiIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gIgorICAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAiXyA9IHRyeSBwcm90by5yZWFkU3RydWN0QmVnaW4oKSIgPDwgZW5kbDsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGJvb2wgb3B0aW9uYWwgPSBmaWVsZF9pc19vcHRpb25hbCgqZl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6ICIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCksIG9wdGlvbmFsLCAhb3B0aW9uYWwpIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgICBpbmRlbnQob3V0KSA8PCAiZmllbGRzOiB3aGlsZSB0cnVlIjsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0IChfLCBmaWVsZFR5cGUsIGZpZWxkSUQpID0gdHJ5IHByb3RvLnJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElELCBmaWVsZFR5cGUpIjsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgKF8sIC5zdG9wKTogICAgICAgICAgICBicmVhayBmaWVsZHMiIDw8IGVuZGw7CisKKworICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAoIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpOiI7CisgICAgICBzdHJpbmcgcGFkZGluZyA9ICIiOworCisgICAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgIjsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICAiOworICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICAgIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkgfHwgdHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICAgIjsKKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgIjsKKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAgIjsKKyAgICAgIH0KKworICAgICAgb3V0IDw8IHBhZGRpbmcgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gdHJ5ICIKKyAgICAgICAgICA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIucmVhZChmcm9tOiBwcm90bykiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgbGV0IChfLCB1bmtub3duVHlwZSk6ICB0cnkgcHJvdG8uc2tpcCh0eXBlOiB1bmtub3duVHlwZSkiIDw8IGVuZGw7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgorICAgIGluZGVudChvdXQpIDw8ICJ0cnkgcHJvdG8ucmVhZEZpZWxkRW5kKCkiIDw8IGVuZGw7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IHByb3RvLnJlYWRTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKKworICAgIGlmIChzdHJ1Y3RfaGFzX3JlcXVpcmVkX2ZpZWxkcyh0c3RydWN0KSkgeworICAgICAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gUmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOworCisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoZmllbGRfaXNfb3B0aW9uYWwoKmZfaXRlcikpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQob3V0KSA8PCAidHJ5IHByb3RvLnZhbGlkYXRlVmFsdWUoIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICA8PCAibmFtZWQ6IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiKSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgeworICAgICAgb3V0IDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKworICB9IGVsc2UgeworICAgIC8qKiBMZWdhY3kgU3dpZjIvQ29jb2EgY2FzZSAqLworICAgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/ICJwcml2YXRlIiA6ICJwdWJsaWMiOworCisgICAgaW5kZW50KG91dCkgPDwgdmlzaWJpbGl0eSA8PCAiIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChfX3Byb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiAiCisgICAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ucmVhZFN0cnVjdEJlZ2luKCkiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGJvb2wgb3B0aW9uYWwgPSBmaWVsZF9pc19vcHRpb25hbCgqZl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOiAiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBvcHRpb25hbCwgIW9wdGlvbmFsKSA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgICAgaW5kZW50KG91dCkgPDwgImZpZWxkczogd2hpbGUgdHJ1ZSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImxldCAoXywgZmllbGRUeXBlLCBmaWVsZElEKSA9IHRyeSBfX3Byb3RvLnJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElELCBmaWVsZFR5cGUpIjsKKworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlIChfLCAuU1RPUCk6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJicmVhayBmaWVsZHMiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgKCIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKToiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9IHRyeSBfX3Byb3RvLnJlYWRWYWx1ZSgpIGFzICIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSBsZXQgKF8sIHVua25vd25UeXBlKToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLnNraXBUeXBlKHVua25vd25UeXBlKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ucmVhZEZpZWxkRW5kKCkiIDw8IGVuZGw7CisKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19wcm90by5yZWFkU3RydWN0RW5kKCkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpZiAoc3RydWN0X2hhc19yZXF1aXJlZF9maWVsZHModHN0cnVjdCkpIHsKKyAgICAgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICAgICAgaW5kZW50KG91dCkgPDwgIi8vIFJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKKworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKGZpZWxkX2lzX29wdGlvbmFsKCpmX2l0ZXIpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLnZhbGlkYXRlVmFsdWUoIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICA8PCAibmFtZWQ6IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiKSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgeworICAgICAgb3V0IDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKyAgfQorICBvdXQgPDwgIikiIDw8IGVuZGw7CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhIHN0cnVjdCB0bworICogYSBwcm90b2NvbC4gKFRTdHJ1Y3QgY29tcGxpYW5jZSkgT05MWSBGT1IgU1dJRlQyL0NPQ09BCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICogICAgICAgICAgICAgICAgSXMgdGhlIHN0cnVjdCBwdWJsaWMgb3IgcHJpdmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vbGRfc3dpZnRfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSkgeworCisgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/ICJwcml2YXRlIiA6ICJwdWJsaWMiOworCisgIGluZGVudChvdXQpIDw8IHZpc2liaWxpdHkgPDwgIiBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKF9fdmFsdWU6ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICA8PCAiLCB0b1Byb3RvY29sIF9fcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lKFwiIiA8PCBuYW1lIDw8ICJcIikiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCAqdGZpZWxkID0gKmZfaXRlcjsKKworICAgIGJvb2wgb3B0aW9uYWwgPSBmaWVsZF9pc19vcHRpb25hbCh0ZmllbGQpOworICAgIGlmIChvcHRpb25hbCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmIGxldCAiIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKHRmaWVsZC0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgIDw8ICIgPSBfX3ZhbHVlLiIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIodGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVGaWVsZFZhbHVlKCIKKyAgICAgICAgICAgICAgICA8PCAob3B0aW9uYWwgPyAiIiA6ICJfX3ZhbHVlLiIpIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJuYW1lOiBcIiIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgIDw8ICJ0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAiaWQ6ICIgPDwgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIikiIDw8IGVuZGw7CisKKyAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVGaWVsZFN0b3AoKSIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhIHN0cnVjdCBmcm9tCisgKiBmcm9tIGEgcHJvdG9jb2wuIChUU3RydWN0IGNvbXBsaWFuY2UpICBPTkxZIEZPUiBTV0lGVCAyL0NPQ09BCisgKgorICogVGhpcyBpcyBzcGVjaWZpY2FsbHkgYSBmdW5jdGlvbiByZXN1bHQuIE9ubHkKKyAqIHRoZSBmaXJzdCBhdmFpbGFibGUgZmllbGQgaXMgd3JpdHRlbi4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2xkX3N3aWZ0X3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKF9fdmFsdWU6ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICA8PCAiLCB0b1Byb3RvY29sIF9fcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGluZGVudChvdXQpIDw8ICJ0cnkgX19wcm90by53cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWUoXCIiIDw8IG5hbWUgPDwgIlwiKSIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkICp0ZmllbGQgPSAqZl9pdGVyOworCisgICAgaW5kZW50KG91dCkgPDwgImlmIGxldCByZXN1bHQgPSBfX3ZhbHVlLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLndyaXRlRmllbGRWYWx1ZShyZXN1bHQsICIKKyAgICAgICAgICAgICAgICA8PCAibmFtZTogXCIiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICA8PCAidHlwZTogIiA8PCB0eXBlX3RvX2VudW0odGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgImlkOiAiIDw8IHRmaWVsZC0+Z2V0X2tleSgpIDw8ICIpIiA8PCBlbmRsOworCisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgfQorICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVGaWVsZFN0b3AoKSIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZGVzY3JpcHRpb24gbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9wcmludGFibGVfZXh0ZW5zaW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKworICAvLyBBbGxvdyB1c2Ugb2YgZGVidWdEZXNjcmlwdGlvbiBzbyB0aGUgYXBwIGNhbiBhZGQgZGVzY3JpcHRpb24gdmlhIGEgY2F0ZW9nb3J5L2V4dGVuc2lvbgorCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAiZXh0ZW5zaW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIDogIgorICAgICAgICAgICAgICA8PCAoZGVidWdfZGVzY3JpcHRpb25zXyA/ICJDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIiA6ICJDdXN0b21TdHJpbmdDb252ZXJ0aWJsZSIpOworCisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdmFyIGRlc2NyaXB0aW9uIDogU3RyaW5nIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBpbmRlbnQob3V0KSA8PCAidmFyIGRlc2MgPSBcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpZiAoIXRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICAgIG91dCA8PCAiKFwiIiA8PCBlbmRsOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImRlc2MgKz0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiPVxcKFN0cmluZyhkZXNjcmliaW5nOiBzZWxmLiIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSkiOworICAgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8ICJcIiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIuXCIiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIHNlbGYgeyIgPDwgZW5kbDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7Zl9pdGVyKyspIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIobGV0IHZhbCk6ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgImRlc2MgKz0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKHZhbDogXFwodmFsKSlcIiIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIihcIiIgPDwgZW5kbDsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgeworICAgICAgaW5kZW50KG91dCkgPDwgImRlc2MgKz0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIj1cXChzZWxmLiIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSI7CisgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgICAgb3V0IDw8ICJcIiIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgImRlc2MgKz0gXCIpXCIiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGRlc2MiIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gIEluIFN3aWZ0IHRoaXMgY29uc2lzdHMgb2YgYQorICogcHJvdG9jb2wgZGVmaW5pdGlvbiBhbmQgYSBjbGllbnQgKHdpdGggaXQncyBpbXBsZW1lbnRhdGlvbgorICogc2VwYXJhdGVkIGludG8gZXh0cyBmaWxlKS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3Byb3RvY29sKGZfZGVjbF8sIHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnQoZl9kZWNsXywgdHNlcnZpY2UpOworICBpZiAoYXN5bmNfY2xpZW50c18pIHsKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3Byb3RvY29sX2FzeW5jKGZfZGVjbF8sIHRzZXJ2aWNlKTsKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luYyhmX2RlY2xfLCB0c2VydmljZSk7CisgIH0KKyAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9zZXJ2ZXIoZl9kZWNsXywgdHNlcnZpY2UpOworCisgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHNlcnZpY2UpOworICBpZiAoYXN5bmNfY2xpZW50c18pIHsKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0c2VydmljZSk7CisgIH0KKyAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9zZXJ2ZXJfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHNlcnZpY2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgcmV0dXJuIHR5cGVzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgc3RyaW5nIHFuYW1lID0gZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsICpmX2l0ZXIpOworCisgICAgdF9zdHJ1Y3QgcW5hbWVfdHMgPSB0X3N0cnVjdCh0cy0+Z2V0X3Byb2dyYW0oKSwgcW5hbWUpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBxbmFtZV90cy5hcHBlbmQoKm1faXRlcik7CisgICAgfQorCisgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0KGZfaW1wbF8sICZxbmFtZV90cywgdHJ1ZSk7CisgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sICZxbmFtZV90cywgZmFsc2UsIHRydWUpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModHNlcnZpY2UsICpmX2l0ZXIpOworICB9Cit9CisKK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X3NlcnZpY2UgKnRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXR1cm4gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICB9Cit9CisKK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHJldHVybiB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gY3JlYXRlIGEgcmVzdWx0IHN0cnVjdCB3aXRoIGEgc3VjY2VzcyBmaWVsZCBvZiB0aGUgcmV0dXJuIHR5cGUsCisgIC8vIGFuZCBhIGZpZWxkIGZvciBlYWNoIHR5cGUgb2YgZXhjZXB0aW9uIHRocm93bgorICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsIHRmdW5jdGlvbikpOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgdF9maWVsZCogc3VjY2VzcyA9IG5ldyB0X2ZpZWxkKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgICBzdWNjZXNzLT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICAgIHJlc3VsdC5hcHBlbmQoc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkICp4ID0gKmZfaXRlcjsKKyAgICB0X2ZpZWxkICpveCA9IG5ldyB0X2ZpZWxkKHgtPmdldF90eXBlKCksIHgtPmdldF9uYW1lKCksIHgtPmdldF9rZXkoKSk7CisgICAgb3gtPnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgICAgcmVzdWx0LmFwcGVuZChveCk7CisgIH0KKworICAvLyBnZW5lcmF0ZSB0aGUgcmVzdWx0IHN0cnVjdAorICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3QoZl9pbXBsXywgJnJlc3VsdCwgdHJ1ZSk7CisgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCAmcmVzdWx0LCB0cnVlLCB0cnVlKTsKKworICBmb3IgKGZfaXRlciA9IHJlc3VsdC5nZXRfbWVtYmVycygpLmJlZ2luKCk7IGZfaXRlciAhPSByZXN1bHQuZ2V0X21lbWJlcnMoKS5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBkZWxldGUgKmZfaXRlcjsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgcHJvdG9jb2wgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBwcm90b2NvbCBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3Byb3RvY29sKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBzdHJpbmcgZG9jID0gdHNlcnZpY2UtPmdldF9kb2MoKTsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmcob3V0LCBkb2MpOworCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBwcm90b2NvbCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOworICAgIHRfc2VydmljZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgaWYgKHBhcmVudCAhPSBOVUxMKSB7CisgICAgICBvdXQgPDwgIiA6ICIgPDwgcGFyZW50LT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGZ1bmN0aW9uX2RvY3N0cmluZyhvdXQsICpmX2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHByb3RvY29sICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCk7CisgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiICAvLyBleGNlcHRpb25zOiAiOworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIG91dCA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSArICIsICI7CisgICAgICB9CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIGFzeW5jaHJvbm91cyBzZXJ2aWNlIHByb3RvY29sIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcHJvdG9jb2wgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9wcm90b2NvbF9hc3luYyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgc3RyaW5nIGRvYyA9IHRzZXJ2aWNlLT5nZXRfZG9jKCk7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nKG91dCwgZG9jKTsKKyAgfQorICBpbmRlbnQob3V0KSA8PCAicHVibGljIHByb3RvY29sICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jIjsKKworICBibG9ja19vcGVuKG91dCk7CisgIGlmICghZ2VuX2NvY29hXykgeyAgb3V0IDw8IGVuZGw7IH0KKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgYXN5bmNfZnVuY3Rpb25fZG9jc3RyaW5nKG91dCwgKmZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCBhc3luY19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCBhc3luY19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICAgIGlmIChwcm9taXNlX2tpdF8pIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgcHJvbWlzZV9mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICAgIH0gLy8KKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgfQorICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50KG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3BlbiBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQiOy8vIDogIgorCisgICAgLy8gSW5oZXJpdCBmcm9tIFBhcmVudENsaWVudAorICAgIHRfc2VydmljZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgb3V0IDw8ICIgOiAiIDw8ICgocGFyZW50ID09IE5VTEwpID8gIlRDbGllbnQiIDogcGFyZW50LT5nZXRfbmFtZSgpICsgIkNsaWVudCIpOworICAgIG91dCA8PCAgIiAvKiAsICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiAqLyI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIC8vIGEKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGNsYXNzICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkNsaWVudCAvKiA6ICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiAqLyI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImxldCBfX2luUHJvdG9jb2wgOiBUUHJvdG9jb2wiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0IF9fb3V0UHJvdG9jb2wgOiBUUHJvdG9jb2wiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGluaXQoaW5vdXRQcm90b2NvbDogVFByb3RvY29sKSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgaW5kZW50KG91dCkgPDwgIl9faW5Qcm90b2NvbCA9IGlub3V0UHJvdG9jb2wiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIl9fb3V0UHJvdG9jb2wgPSBpbm91dFByb3RvY29sIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGluaXQoaW5Qcm90b2NvbDogVFByb3RvY29sLCBvdXRQcm90b2NvbDogVFByb3RvY29sKSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIGluZGVudChvdXQpIDw8ICJfX2luUHJvdG9jb2wgPSBpblByb3RvY29sIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJfX291dFByb3RvY29sID0gb3V0UHJvdG9jb2wiIDw8IGVuZGw7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorCisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIGluZGVudChvdXQpIDw8ICJvcGVuIGNsYXNzICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiQXN5bmNDbGllbnQ8UHJvdG9jb2w6IFRQcm90b2NvbCwgRmFjdG9yeTogVEFzeW5jVHJhbnNwb3J0RmFjdG9yeT4iOy8vIDogIgorCisgICAgLy8gSW5oZXJpdCBmcm9tIFBhcmVudENsaWVudAorICAgIHRfc2VydmljZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisKKyAgICBvdXQgPDwgIiA6ICIgPDwgKChwYXJlbnQgPT0gTlVMTCkgPyAiVCIgOiAgcGFyZW50LT5nZXRfbmFtZSgpKSArICJBc3luY0NsaWVudDxQcm90b2NvbCwgRmFjdG9yeT4iOworICAgIG91dCA8PCAgIiAvKiAsICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiAqLyI7CisKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY0NsaWVudCAvKiA6ICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiAqLyI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImxldCBfX3Byb3RvY29sRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0IF9fdHJhbnNwb3J0RmFjdG9yeSA6IFRBc3luY1RyYW5zcG9ydEZhY3RvcnkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGluaXQocHJvdG9jb2xGYWN0b3J5OiBUUHJvdG9jb2xGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5OiBUQXN5bmNUcmFuc3BvcnRGYWN0b3J5KSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgaW5kZW50KG91dCkgPDwgIl9fcHJvdG9jb2xGYWN0b3J5ID0gcHJvdG9jb2xGYWN0b3J5IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJfX3RyYW5zcG9ydEZhY3RvcnkgPSB0cmFuc3BvcnRGYWN0b3J5IiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgaW50ZXJmYWNlIGRlZmluaXRpb24uIEluIG90aGVyIHdvcmRzLAorICogdGhlIFRQcm9jZXNzIGltcGxlbWVudGF0aW9uIGZvciB0aGUgc2VydmljZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9zZXJ2ZXIob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIGluZGVudChvdXQpIDw8ICJvcGVuIGNsYXNzICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciAvKiAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgKi8iOworCisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHlwZWFsaWFzIFByb2Nlc3NvckhhbmRsZXJEaWN0aW9uYXJ5ID0gIgorICAgICAgICA8PCAiW1N0cmluZzogKEludDMyLCBUUHJvdG9jb2wsIFRQcm90b2NvbCwgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiKSB0aHJvd3MgLT4gVm9pZF0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZhciBzZXJ2aWNlOiAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIHJlcXVpcmVkIGluaXQoc2VydmljZTogIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiKSI7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJQcm9jZXNzb3IgOiBOU09iamVjdCAvKiAiCisgICAgICAgICAgICAgICAgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiAqLyI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0eXBlYWxpYXMgUHJvY2Vzc29ySGFuZGxlckRpY3Rpb25hcnkgPSAiCisgICAgICAgIDw8ICJbU3RyaW5nOiAoSW50LCBUUHJvdG9jb2wsIFRQcm90b2NvbCwgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiKSB0aHJvd3MgLT4gVm9pZF0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAibGV0IHNlcnZpY2UgOiAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIGluaXQoc2VydmljZTogIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiKSI7CisgIH0KKworICBibG9ja19vcGVuKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJzZWxmLnNlcnZpY2UgPSBzZXJ2aWNlIiA8PCBlbmRsOworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgc2VuZCB0aGUgYXJndW1lbnRzCisgKiBmb3IgYSBzZXJ2aWNlIGZ1bmN0aW9uIHZpYSBhIHByb3RvY29sLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSAgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlCisgKiBAcGFyYW0gbmVlZHNfcHJvdG9jb2wKKyAqICAgICAgICAgICAgICAgICAgV2V0aGVyIHRoZSBmaXJzdCBwYXJhbWV0ZXIgbXVzdCBiZSBhIHByb3RvY29sIG9yIGlmCisgKiAgICAgICAgICAgICAgICAgIHRoZSBwcm90b2NvbCBpcyB0byBiZSBhc3N1bWVkCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UgKnRzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNfcHJvdG9jb2wpIHsKKworICBzdHJpbmcgZnVubmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKworICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX2Jvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VuZF8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSBmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0c2VydmljZSwgdGZ1bmN0aW9uKTsKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisKKyAgc3RyaW5nIHByb3RvID0gbmVlZHNfcHJvdG9jb2wgPyAoZ2VuX2NvY29hXyA/ICJfX291dFByb3RvY29sIiA6ICJvbiBvdXRQcm90b2NvbCIpIDogIiI7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgZnVuYyAiIDw8IHNlbmRfZnVuY3Rpb24uZ2V0X25hbWUoKSA8PCAiKCIKKyAgICAgICAgICAgICAgPDwgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksIHByb3RvLCB0cnVlKQorICAgICAgICAgICAgICA8PCAiKSB0aHJvd3MiOworICBibG9ja19vcGVuKG91dCk7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgIGluZGVudChvdXQpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4obmFtZTogXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCisgICAgICAgICAgICAgICAgPDwgInR5cGU6ICIgPDwgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgPyAiLm9uZXdheSIgOiAiLmNhbGwiKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInNlcXVlbmNlSUQ6IDApIiA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImxldCBhcmdzID0gIiA8PCBhcmdzbmFtZSA8PCAiKCI7CisKKyAgICAvLyB3cml0ZSBvdXQgZnVuY3Rpb24gcGFyYW1ldGVycworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgeworICAgICAgdF9maWVsZCAqdGZpZWxkID0gKCpmX2l0ZXIpOworICAgICAgb3V0IDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOiAiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICAgIGlmICgrK2ZfaXRlciAhPSBmaWVsZHMuZW5kKCkpIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAiKSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IGFyZ3Mud3JpdGUodG86IG91dFByb3RvY29sKSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IG91dFByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX291dFByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWUoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCisgICAgICAgICAgICAgICAgPDwgInR5cGU6ICIgPDwgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgPyAiLk9ORVdBWSIgOiAiLkNBTEwiKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInNlcXVlbmNlSUQ6IDApIiA8PCBlbmRsOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0IF9fYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIigiOworCisgICAgLy8gd3JpdGUgb3V0IGZ1bmN0aW9uIHBhcmFtZXRlcnMKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICAgIHRfZmllbGQgKnRmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICAgIG91dCA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjogIiA8PCB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSAiIDw8IGFyZ3NuYW1lIDw8ICIud3JpdGVWYWx1ZShfX2FyZ3MsIHRvUHJvdG9jb2w6IF9fb3V0UHJvdG9jb2wpIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX291dFByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICB9CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdGhhdCB3aWxsIHJlY3YgdGhlIHJlc3VsdCBmb3IgYQorICogc2VydmljZSBmdW5jdGlvbiB2aWEgYSBwcm90b2NvbC4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBnZW5lcmF0ZQorICogQHBhcmFtIG5lZWRzX3Byb3RvY29sCisgKiAgICAgICAgICAgICAgICAgIFdldGhlciB0aGUgZmlyc3QgcGFyYW1ldGVyIG11c3QgYmUgYSBwcm90b2NvbCBvciBpZgorICogICAgICAgICAgICAgICAgICB0aGUgcHJvdG9jb2wgaXMgdG8gYmUgYXNzdW1lZAorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzX3Byb3RvY29sKSB7CisKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBmdW5jIHJlY3ZfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpZiAobmVlZHNfcHJvdG9jb2wpIHsKKyAgICAgIG91dCA8PCAib24gaW5Qcm90b2NvbDogVFByb3RvY29sIjsKKyAgICB9CisgICAgb3V0IDw8ICIpIHRocm93cyI7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgb3V0IDw8ICIgLT4gIiA8PCB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKTsKKyAgICB9CisKKyAgICBibG9ja19vcGVuKG91dCk7CisKKyAgICAvLyBjaGVjayBmb3IgYW4gZXhjZXB0aW9uCisKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IGluUHJvdG9jb2wucmVhZFJlc3VsdE1lc3NhZ2VCZWdpbigpICIgPDwgZW5kbDsKKworICAgIHN0cmluZyByZXN1bHRuYW1lID0gZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0c2VydmljZSwgdGZ1bmN0aW9uKTsKKyAgICBpbmRlbnQob3V0KTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpIHx8ICF0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpKSB7CisgICAgICBvdXQgPDwgImxldCByZXN1bHQgPSAiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIl8gPSAiOworICAgIH0KKworICAgIHN0cmluZyByZXR1cm5fdHlwZV9uYW1lID0gdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSk7CisgICAgb3V0IDw8ICJ0cnkgIiA8PCByZXN1bHRuYW1lIDw8ICIucmVhZChmcm9tOiBpblByb3RvY29sKSIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgaW5Qcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgbGV0IHN1Y2Nlc3MgPSByZXN1bHQuc3VjY2VzcyI7CisgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHN1Y2Nlc3MiIDw8IGVuZGw7CisgICAgICBibG9ja19jbG9zZShvdXQpOworICAgIH0KKworICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgbGV0ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgfQorCisgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IFRBcHBsaWNhdGlvbkVycm9yKGVycm9yOiAubWlzc2luZ1Jlc3VsdChtZXRob2ROYW1lOiBcIiIKKyAgICAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpKSIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKG5lZWRzX3Byb3RvY29sKSB7CisgICAgICBvdXQgPDwgIl9faW5Qcm90b2NvbDogVFByb3RvY29sIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIikgdGhyb3dzIjsKKworICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIG91dCA8PCAiIC0+ICIgPDwgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSk7CisgICAgfQorCisgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgLy8gY2hlY2sgZm9yIGFuIGV4Y2VwdGlvbgorICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19pblByb3RvY29sLnJlYWRSZXN1bHRNZXNzYWdlQmVnaW4oKSAiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsIHRmdW5jdGlvbik7CisgICAgaW5kZW50KG91dCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSB8fCAhdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSkgeworICAgICAgb3V0IDw8ICJsZXQgX19yZXN1bHQgPSAiOworICAgIH0KKyAgICBvdXQgPDwgInRyeSAiIDw8IHJlc3VsdG5hbWUgPDwgIi5yZWFkVmFsdWVGcm9tUHJvdG9jb2woX19pblByb3RvY29sKSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX2luUHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmIGxldCBfX3N1Y2Nlc3MgPSBfX3Jlc3VsdC5zdWNjZXNzIjsKKyAgICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19zdWNjZXNzIiA8PCBlbmRsOworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmIGxldCAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gX19yZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgfQorCisgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IE5TRXJyb3IoIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZG9tYWluOiBUQXBwbGljYXRpb25FcnJvckRvbWFpbiwgIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImNvZGU6IEludChUQXBwbGljYXRpb25FcnJvci5NaXNzaW5nUmVzdWx0LnJhd1ZhbHVlKSwiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAidXNlckluZm86IFtUQXBwbGljYXRpb25FcnJvck1ldGhvZEtleTogXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCJdKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICB9CisKKyAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIGludm9jYXRpb24gb2YgYSBnaXZlbiB0aGUgc2VuZCBmdW5jdGlvbiBmb3IgdGhlCisgKiBzZXJ2aWNlIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW52b2NhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisKKyAgaW5kZW50KG91dCkgPDwgInRyeSBzZW5kXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICBvdXQgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGlmICgrK2ZfaXRlciAhPSBmaWVsZHMuZW5kKCkpIHsKKyAgICAgIG91dCA8PCAiLCAiOworICAgIH0KKyAgfQorCisgIG91dCA8PCAiKSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gaW52b2NhdGlvbiBvZiBhIGdpdmVuIHRoZSBzZW5kIGZ1bmN0aW9uIGZvciB0aGUKKyAqIHNlcnZpY2UgZnVuY3Rpb24uIFRoaXMgaXMgZm9yIGFzeW5jaHJvbm91cyBwcm90b2NvbHMuCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfc2VuZF9hc3luY19mdW5jdGlvbl9pbnZvY2F0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGlmICghZ2VuX2NvY29hXykgeworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgc2VuZF8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKG9uOiBwcm90byI7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBzZW5kXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoX19wcm90b2NvbCI7IC8vCisgIH0KKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIG91dCA8PCAiLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIG91dCA8PCAiKSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiB2aWEgZXh0ZW5zaW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworCisgIHN0cmluZyBuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiQ2xpZW50IjsKKyAgaW5kZW50KG91dCkgPDwgImV4dGVuc2lvbiAiIDw8IG5hbWUgPDwgIiA6ICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCk7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIsIGZhbHNlKTsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyLCBmYWxzZSk7CisgICAgfQorCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcik7CisgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgaWYgKGdlbl9jb2NvYV8pIHsgb3V0IDw8IGVuZGw7IH0KKworICAgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW52b2NhdGlvbihvdXQsICpmX2l0ZXIpOworICAgIGlmICghZ2VuX2NvY29hXykgeworICAgICAgaW5kZW50KG91dCkgPDwgInRyeSBvdXRQcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fb3V0UHJvdG9jb2wudHJhbnNwb3J0KCkuZmx1c2goKSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0cnkgcmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCkiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRyeSByZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoKSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGFzeW5jaHJvbm91cyBjbGllbnQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gdmlhIGV4dGVuc2lvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2FzeW5jX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZiAoZ2VuX2NvY29hXykgeworICAgIGdlbmVyYXRlX29sZF9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlKTsKKyAgICByZXR1cm47CisgIH0KKyAgc3RyaW5nIG5hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJBc3luY0NsaWVudCI7CisgIHN0cmluZyBwcm90b2NvbF9uYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiQXN5bmMiOworCisgIGluZGVudChvdXQpIDw8ICJleHRlbnNpb24gIiA8PCBuYW1lIDw8ICIgOiAiIDw8IHByb3RvY29sX25hbWU7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIsIHRydWUpOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIsIHRydWUpOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCBhc3luY19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcik7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAibGV0IHRyYW5zcG9ydCAgID0gZmFjdG9yeS5uZXdUcmFuc3BvcnQoKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAibGV0IHByb3RvID0gUHJvdG9jb2wob246IHRyYW5zcG9ydCkiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZG8iOworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvdXQsICpmX2l0ZXIpOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggbGV0IGVycm9yIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjb21wbGV0aW9uKC5lcnJvcihlcnJvcikpIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGJvb2wgcmV0X2lzX3ZvaWQgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKTsKKyAgICBib29sIGlzX29uZXdheSA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCk7CisKKyAgICBzdHJpbmcgZXJyb3JfY29tcGxldGlvbl9jYWxsID0gImNvbXBsZXRpb24oLmVycm9yKGVycm9yKSkiOworICAgIGluZGVudChvdXQpIDw8ICJ0cmFuc3BvcnQuZmx1c2giOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIih0cmFucywgZXJyb3IpIGluIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBsZXQgZXJyb3IgPSBlcnJvciI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBlcnJvcl9jb21wbGV0aW9uX2NhbGwgPDwgZW5kbDsKKyAgICBibG9ja19jbG9zZShvdXQpOworCisgICAgaWYgKCFpc19vbmV3YXkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZG8iOworICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgaW5kZW50KG91dCk7CisgICAgICBpZiAoIXJldF9pc192b2lkKSB7CisgICAgICAgIG91dCA8PCAibGV0IHJlc3VsdCA9ICI7CisgICAgICB9CisgICAgICBvdXQgPDwgInRyeSBzZWxmLnJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIihvbjogcHJvdG8pIiA8PCBlbmRsOworCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgKHJldF9pc192b2lkID8gImNvbXBsZXRpb24oLnN1Y2Nlc3MoVm9pZCgpKSkiIDogImNvbXBsZXRpb24oLnN1Y2Nlc3MocmVzdWx0KSkiKSA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCBsZXQgZXJyb3IgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGVycm9yX2NvbXBsZXRpb25fY2FsbCA8PCBlbmRsOworCisgICAgICBibG9ja19jbG9zZShvdXQpOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNvbXBsZXRpb24oLnN1Y2Nlc3MoVm9pZCgpKSkiIDw8IGVuZGw7CisgICAgfQorICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKworICB9CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vbGRfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBzdHJpbmcgbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIkFzeW5jQ2xpZW50IjsKKyAgc3RyaW5nIHByb3RvY29sX25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJBc3luYyI7CisKKyAgaW5kZW50KG91dCkgPDwgImV4dGVuc2lvbiAiIDw8IG5hbWUgPDwgIiA6ICIgPDwgcHJvdG9jb2xfbmFtZTsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3V0LCB0c2VydmljZSwgKmZfaXRlciwgdHJ1ZSk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3JlY3ZfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3V0LCB0c2VydmljZSwgKmZfaXRlciwgdHJ1ZSk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IGFzeW5jX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKTsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImxldCBfX3RyYW5zcG9ydCA9IF9fdHJhbnNwb3J0RmFjdG9yeS5uZXdUcmFuc3BvcnQoKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAibGV0IF9fcHJvdG9jb2wgPSBfX3Byb3RvY29sRmFjdG9yeS5uZXdQcm90b2NvbE9uVHJhbnNwb3J0KF9fdHJhbnNwb3J0KSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfc2VuZF9hc3luY19mdW5jdGlvbl9pbnZvY2F0aW9uKG91dCwgKmZfaXRlcik7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiX190cmFuc3BvcnQuZmx1c2hXaXRoQ29tcGxldGlvbigiOworCisgICAgaWYgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIG91dCA8PCAic3VjY2VzcywgZmFpbHVyZTogZmFpbHVyZSkiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgImRvIjsKKyAgICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgICAgaW5kZW50KG91dCk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIG91dCA8PCAibGV0IHJlc3VsdCA9ICI7CisgICAgICB9CisgICAgICBvdXQgPDwgInRyeSBzZWxmLnJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIihfX3Byb3RvY29sKSIgPDwgZW5kbDsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzdWNjZXNzKCI7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIG91dCA8PCAicmVzdWx0IjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiKSIgPDwgZW5kbDsKKworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJjYXRjaCBsZXQgZXJyb3IiOworICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgImZhaWx1cmUoZXJyb3IgYXMgTlNFcnJvcikiIDw8IGVuZGw7CisgICAgICBibG9ja19jbG9zZShvdXQpOworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICIsIGZhaWx1cmU6IGZhaWx1cmUpIiA8PCBlbmRsOworICAgIH0KKworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICAvLyBQcm9taXNlIGZ1bmN0aW9uCisgICAgaWYgKHByb21pc2Vfa2l0XykgeworCisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgcHJvbWlzZV9mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcik7CisgICAgICBibG9ja19vcGVuKG91dCk7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAibGV0IChfX3Byb21pc2UsIF9fZnVsZmlsbCwgX19yZWplY3QpID0gUHJvbWlzZTwiIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpIDw8ICI+LnBlbmRpbmdQcm9taXNlKCkiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJsZXQgX190cmFuc3BvcnQgPSBfX3RyYW5zcG9ydEZhY3RvcnkubmV3VHJhbnNwb3J0KCkiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibGV0IF9fcHJvdG9jb2wgPSBfX3Byb3RvY29sRmFjdG9yeS5uZXdQcm90b2NvbE9uVHJhbnNwb3J0KF9fdHJhbnNwb3J0KSIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvdXQsICpmX2l0ZXIpOworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiX190cmFuc3BvcnQuZmx1c2hXaXRoQ29tcGxldGlvbigiOworCisgICAgICBpZiAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBvdXQgPDwgInsgX19mdWxmaWxsKCkgfSwgZmFpbHVyZTogeyBfX3JlamVjdCgkMCkgfSkiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiZG8iOworICAgICAgICBibG9ja19vcGVuKG91dCk7CisKKyAgICAgICAgaW5kZW50KG91dCk7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBvdXQgPDwgImxldCByZXN1bHQgPSAiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCAidHJ5IHNlbGYucmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKF9fcHJvdG9jb2wpIiA8PCBlbmRsOworCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX19mdWxmaWxsKCI7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBvdXQgPDwgInJlc3VsdCI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8ICIpIiA8PCBlbmRsOworCisgICAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJjYXRjaCBsZXQgZXJyb3IiOworICAgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJfX3JlamVjdChlcnJvcikiIDw8IGVuZGw7CisgICAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiwgZmFpbHVyZTogeyBlcnJvciBpbiAiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiX19yZWplY3QoZXJyb3IpIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSkiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19wcm9taXNlIiA8PCBlbmRsOworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICAgIG91dCA8PCBlbmRsOworCisgICAgfQorCisgIH0KKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uCisgKgorICogSW1wbGVtZW50ZWQgYnkgZ2VuZXJhdGluZyBhIGJsb2NrIGZvciBlYWNoIHNlcnZpY2UgZnVuY3Rpb24gdGhhdAorICogaGFuZGxlcyB0aGUgcHJvY2Vzc2luZyBvZiB0aGF0IGZ1bmN0aW9uLiBUaGUgYmxvY2tzIGFyZSBzdG9yZWQgaW4KKyAqIGEgbWFwIGFuZCBsb29rZWQgdXAgdmlhIGZ1bmN0aW9uL21lc3NhZ2UgbmFtZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBzdHJpbmcgbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIlByb2Nlc3NvciI7CisKKyAgaW5kZW50KG91dCkgPDwgImV4dGVuc2lvbiAiIDw8IG5hbWUgPDwgIiA6IFRQcm9jZXNzb3IiOworICBibG9ja19vcGVuKG91dCk7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAic3RhdGljIGxldCBwcm9jZXNzb3JIYW5kbGVycyIgPDwgKGdlbl9jb2NvYV8gPyAiICIgOiAiIikgPDwgIjogUHJvY2Vzc29ySGFuZGxlckRpY3Rpb25hcnkgPSI7CisgIGJsb2NrX29wZW4ob3V0KTsKKworICBvdXQgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgcHJvY2Vzc29ySGFuZGxlcnMgPSBQcm9jZXNzb3JIYW5kbGVyRGljdGlvbmFyeSgpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgbWV0aG9kIG1hcCBmb3Igcm91dGluZyBpbmNvbWluZyBjYWxscworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiA9ICpmX2l0ZXI7CisKKyAgICBzdHJpbmcgYXJnc190eXBlID0gZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsICpmX2l0ZXIpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcm9jZXNzb3JIYW5kbGVyc1tcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIl0gPSB7IHNlcXVlbmNlSUQsIGluUHJvdG9jb2wsIG91dFByb3RvY29sLCBoYW5kbGVyIGluIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAibGV0IGFyZ3MgPSB0cnkgIiA8PCBhcmdzX3R5cGUgPDwgIi5yZWFkKGZyb206IGluUHJvdG9jb2wpIiA8PCBlbmRsCisgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgaW5Qcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJsZXQgYXJncyA9IHRyeSAiIDw8IGFyZ3NfdHlwZSA8PCAiLnJlYWRWYWx1ZUZyb21Qcm90b2NvbChpblByb3RvY29sKSIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IGluUHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICkgeworICAgICAgc3RyaW5nIHJlc3VsdF90eXBlID0gZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0c2VydmljZSwgdGZ1bmN0aW9uKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ2YXIgcmVzdWx0ID0gIiA8PCByZXN1bHRfdHlwZSA8PCAiKCkiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJkbyI7CisgICAgICBibG9ja19vcGVuKG91dCk7CisKKyAgICAgIGluZGVudChvdXQpOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAidHJ5IGhhbmRsZXIuIiA8PCAoZ2VuX2NvY29hXyA/IGZ1bmN0aW9uX25hbWUodGZ1bmN0aW9uKSA6IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIigiOworCisgICAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7KSB7CisgICAgICAgIHN0cmluZyBmaWVsZE5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIGlmICghZ2VuX2NvY29hXyB8fCBmX2l0ZXIgIT0gZmllbGRzLmJlZ2luKCkpIHsKKyAgICAgICAgICBvdXQgPDwgZmllbGROYW1lIDw8ICI6ICI7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgImFyZ3MuIiA8PCBmaWVsZE5hbWU7CisgICAgICAgIGlmICgrK2ZfaXRlciAhPSBmaWVsZHMuZW5kKCkpIHsKKyAgICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBvdXQgPDwgIikiIDw8IGVuZGw7CisgICAgICBibG9ja19jbG9zZShvdXQpOworCisgICAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAgICAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgICAgIGZvciAoeF9pdGVyID0geGZpZWxkcy5iZWdpbigpOyB4X2l0ZXIgIT0geGZpZWxkcy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiY2F0Y2ggbGV0IGVycm9yIGFzICI7CisKKyAgICAgICAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9wcm9ncmFtKCk7CisgICAgICAgICAgaWYgKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA9PSAiRXJyb3IiICYmIG5hbWVzcGFjZWRfICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICAgICAgICAgIG91dCA8PCBnZXRfcmVhbF9zd2lmdF9tb2R1bGUocHJvZ3JhbSkgPDwgIi4iOworICAgICAgICAgIH0KKyAgICAgICAgICBvdXQgPDwgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpOworCisgICAgICAgICAgb3V0IDw8ICIgeyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGVycm9yIH0iIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnQob3V0KSA8PCAiY2F0Y2ggbGV0IGVycm9yIHsgdGhyb3cgZXJyb3IgfSIgPDwgZW5kbDsKKyAgICAgICAgb3V0IDw8IGVuZGw7CisKKyAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4obmFtZTogXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIHR5cGU6IC5yZXBseSwgc2VxdWVuY2VJRDogc2VxdWVuY2VJRCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSByZXN1bHQud3JpdGUodG86IG91dFByb3RvY29sKSIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IG91dFByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHhfaXRlciA9IHhmaWVsZHMuYmVnaW4oKTsgeF9pdGVyICE9IHhmaWVsZHMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgImNhdGNoIGxldCBlcnJvciBhcyAiIDw8ICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZXJyb3IiIDw8IGVuZGw7CisgICAgICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICAgICAgfQorCisgICAgICAgIGluZGVudChvdXQpIDw8ICJjYXRjaCBsZXQgZXJyb3IiOworICAgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgZXJyb3IiIDw8IGVuZGw7CisgICAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgICAgICAgb3V0IDw8IGVuZGw7CisKKyAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgdHlwZTogLlJFUExZLCBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlEKSIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5ICIgPDwgcmVzdWx0X3R5cGUgPDwgIi53cml0ZVZhbHVlKHJlc3VsdCwgdG9Qcm90b2NvbDogb3V0UHJvdG9jb2wpIiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBwcm9jZXNzb3JIYW5kbGVycyIgPDwgZW5kbDsKKworICBibG9ja19jbG9zZShvdXQsZmFsc2UpOworICBvdXQgPDwgIigpIiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmMgcHJvY2VzcyhvbiBpblByb3RvY29sOiBUUHJvdG9jb2wsIG91dFByb3RvY29sOiBUUHJvdG9jb2wpIHRocm93cyI7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jIHByb2Nlc3NPbklucHV0UHJvdG9jb2woaW5Qcm90b2NvbDogVFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCBvdXRQcm90b2NvbDogVFByb3RvY29sKSB0aHJvd3MiOworICB9CisgIGJsb2NrX29wZW4ob3V0KTsKKworICBvdXQgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJsZXQgKG1lc3NhZ2VOYW1lLCBfLCBzZXF1ZW5jZUlEKSA9IHRyeSBpblByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbAorICAgICAgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmIGxldCBwcm9jZXNzb3JIYW5kbGVyID0gIiA8PCBuYW1lIDw8ICIucHJvY2Vzc29ySGFuZGxlcnNbbWVzc2FnZU5hbWVdIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImRvIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSBwcm9jZXNzb3JIYW5kbGVyKHNlcXVlbmNlSUQsIGluUHJvdG9jb2wsIG91dFByb3RvY29sLCBzZXJ2aWNlKSIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXRjaCBsZXQgZXJyb3IgYXMgVEFwcGxpY2F0aW9uRXJyb3IiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZUV4Y2VwdGlvbihtZXNzYWdlTmFtZTogbWVzc2FnZU5hbWUsIHNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQsIGV4OiBlcnJvcikiIDw8IGVuZGw7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IGluUHJvdG9jb2wuc2tpcCh0eXBlOiAuc3RydWN0KSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IGluUHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAibGV0IGV4ID0gVEFwcGxpY2F0aW9uRXJyb3IoZXJyb3I6IC51bmtub3duTWV0aG9kKG1ldGhvZE5hbWU6IG1lc3NhZ2VOYW1lKSkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZUV4Y2VwdGlvbihtZXNzYWdlTmFtZTogbWVzc2FnZU5hbWUsICIKKyAgICAgICAgPDwgInNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQsIGV4OiBleCkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXRjaCBsZXQgZXJyb3IgYXMgTlNFcnJvciI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IG91dFByb3RvY29sLndyaXRlRXhjZXB0aW9uRm9yTWVzc2FnZU5hbWUobWVzc2FnZU5hbWUsIHNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQsIGV4OiBlcnJvcikiIDw8IGVuZGw7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IGluUHJvdG9jb2wuc2tpcFR5cGUoLlNUUlVDVCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSBpblByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZUV4Y2VwdGlvbkZvck1lc3NhZ2VOYW1lKG1lc3NhZ2VOYW1lLCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQsIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJleDogTlNFcnJvcigiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkb21haW46IFRBcHBsaWNhdGlvbkVycm9yRG9tYWluLCAiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImNvZGU6IEludChUQXBwbGljYXRpb25FcnJvci5Vbmtub3duTWV0aG9kLnJhd1ZhbHVlKSwgIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ1c2VySW5mbzogW1RBcHBsaWNhdGlvbkVycm9yTWV0aG9kS2V5OiBtZXNzYWdlTmFtZV0pKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBibG9ja19jbG9zZShvdXQpOworICBibG9ja19jbG9zZShvdXQpOworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBSZXR1cm5zIGFuIFN3aWZ0IG5hbWUKKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqIEBwYXJhbSBjbGFzc19yZWYgRG8gd2Ugd2FudCBhIENsYXNzIHJlZmVyZW5jZSBpc3RlYWQgb2YgYSB0eXBlIHJlZmVyZW5jZT8KKyAqIEByZXR1cm4gU3dpZnQgdHlwZSBuYW1lLCBpLmUuIERpY3Rpb25hcnk8S2V5LFZhbHVlPgorICovCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGlzX29wdGlvbmFsLCBib29sIGlzX2ZvcmNlZCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJlc3VsdCArPSBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCAqbWFwID0gKHRfbWFwICopdHR5cGU7CisgICAgcmVzdWx0ICs9ICJUTWFwPCIgKyB0eXBlX25hbWUobWFwLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiICsgdHlwZV9uYW1lKG1hcC0+Z2V0X3ZhbF90eXBlKCkpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0ICpzZXQgPSAodF9zZXQgKil0dHlwZTsKKyAgICByZXN1bHQgKz0gIlRTZXQ8IiArIHR5cGVfbmFtZShzZXQtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCAqbGlzdCA9ICh0X2xpc3QgKil0dHlwZTsKKyAgICByZXN1bHQgKz0gIlRMaXN0PCIgKyB0eXBlX25hbWUobGlzdC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKKyAgfQorICBlbHNlIHsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgICBpZiAobmFtZXNwYWNlZF8gJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgICAgcmVzdWx0ICs9IGdldF9yZWFsX3N3aWZ0X21vZHVsZShwcm9ncmFtKSArICIuIjsKKyAgICB9CisgICAgcmVzdWx0ICs9IHR0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKGlzX29wdGlvbmFsKSB7CisgICAgcmVzdWx0ICs9ICI/IjsKKyAgfQorICBpZiAoaXNfZm9yY2VkKSB7CisgICAgcmVzdWx0ICs9ICIhIjsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgU3dpZnQgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICovCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlKSB7CisgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOworCisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAiVm9pZCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgcmV0dXJuIGdlbl9jb2NvYV8gPyAiVEJpbmFyeSIgOiAiRGF0YSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiU3RyaW5nIjsKKyAgICB9CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gIkJvb2wiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIHJldHVybiAiSW50OCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIHJldHVybiAiSW50MTYiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gIkludDMyIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgcmV0dXJuICJJbnQ2NCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiRG91YmxlIjsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFN3aWZ0IG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgfQorfQorCisvKioKKyAqIFJlbmRlcnMgZnVsbCBjb25zdGFudCB2YWx1ZSAoYXMgd291bGQgYmUgc2VlbiBhZnRlciBhbiAnPScpCisgKgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICJcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAiXCIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCI7CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiKSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCAoZ2VuX2NvY29hXyA/IHZhbHVlLT5nZXRfaWRlbnRpZmllcigpIDogZW51bV9jb25zdF9uYW1lKHZhbHVlLT5nZXRfaWRlbnRpZmllcigpKSk7IC8vIFN3aWZ0Mi9Db2NvYSBjb21wYXRpYmlsaXR5CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworCisgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCI7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICAgIHRfZmllbGQqIHRmaWVsZCA9ICpmX2l0ZXI7CisgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IE5VTEw7CisgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICBpZiAodGZpZWxkLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIHZhbHVlID0gdl9pdGVyLT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgIG91dCA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjogIjsKKyAgICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgdGZpZWxkLT5nZXRfdHlwZSgpLCB2YWx1ZSk7CisgICAgICB9CisgICAgICBlbHNlIGlmICghZmllbGRfaXNfb3B0aW9uYWwodGZpZWxkKSkgeworICAgICAgICB0aHJvdyAiY29uc3RhbnQgZXJyb3I6IHJlcXVpcmVkIGZpZWxkICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIi4iICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gdmFsdWUiOworICAgICAgfQorCisgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCAiKSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworCisgICAgb3V0IDw8ICJbIjsKKworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOykgeworCisgICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBvdXQgPDwgIjogIjsKKyAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisKKyAgICAgIGlmICgrK3ZfaXRlciAhPSB2YWwuZW5kKCkpIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8ICJdIjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworCisgICAgb3V0IDw8ICJbIjsKKworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOykgeworCisgICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBldHlwZSwgdl9pdGVyLT5maXJzdCk7CisKKyAgICAgIGlmICgrK3ZfaXRlciAhPSB2YWwuZW5kKCkpIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8ICJdIjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisKKyAgICBvdXQgPDwgIlsiOworCisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZXR5cGUsIHZfaXRlci0+Zmlyc3QpOworCisgICAgICBpZiAoKyt2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCAiXSI7CisKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworfQorCisvKioKKyAqIERlY2xhcmVzIGFuIFN3aWZ0IHByb3BlcnR5LgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIGRlY2xhcmUgYSBwcm9wZXJ0eSBmb3IKKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjpkZWNsYXJlX3Byb3BlcnR5KHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc19wcml2YXRlKSB7CisKKyAgc3RyaW5nIHZpc2liaWxpdHkgPSBpc19wcml2YXRlID8gKGdlbl9jb2NvYV8gPyAicHJpdmF0ZSIgOiAiZmlsZXByaXZhdGUiKSA6ICJwdWJsaWMiOworCisgIG9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIHJlbmRlciA8PCB2aXNpYmlsaXR5IDw8ICIgdmFyICIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIodGZpZWxkLT5nZXRfbmFtZSgpKTsKKworICBpZiAoZmllbGRfaXNfb3B0aW9uYWwodGZpZWxkKSkgeworICAgIHJlbmRlciA8PCAoZ2VuX2NvY29hXyA/ICIgIiA6ICIiKSA8PCAiOiAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIHRydWUpOworICB9CisgIGVsc2UgeworICAgIGlmICghZ2VuX2NvY29hXykgeworICAgICAgcmVuZGVyIDw8ICI6ICIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgZmFsc2UpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBTd2lmdDIvQ29jb2EgYmFja3dhcmQgY29tcGF0LCBCYWQsIGRlZmF1bHQgaW5pdAorICAgICAgcmVuZGVyIDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIGZhbHNlKSA8PCAiKCkiOworICAgIH0KKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZQorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKworICBzdHJpbmcgcmVzdWx0ID0gImZ1bmMgIiArIChnZW5fY29jb2FfID8gZnVuY3Rpb25fbmFtZSh0ZnVuY3Rpb24pIDogdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKKworICByZXN1bHQgKz0gIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICIiLCBmYWxzZSkgKyAiKSB0aHJvd3MiOyAvLy8gYXJnc3JldmlldworCisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIGlmICghdHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdCArPSAiIC0+ICIgKyB0eXBlX25hbWUodHR5cGUpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gZG9jc3RyaW5nCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworCisgICAgLy8gR2VuZXJhdGUgZG9jc3RyaW5nIHdpdGggZm9sbG93aW5nIGZvcm1hdDoKKyAgICAvLyAvLy8gPERlc2NyaXB0aW9uPgorICAgIC8vIC8vLyA8ZW1wdHkgbGluZT4KKyAgICAvLyAvLy8gLSBQYXJhbWV0ZXJzOgorICAgIC8vIC8vLyAgIC0gPHBhcmFtZXRlcj46IDxwYXJhbWV0ZXIgZG9jc3RyaW5nPgorICAgIC8vIC8vLyAtIFJldHVybnM6IDxyZXR1cm4gdHlwZT4gKFRocmlmdCBoYXMgbm8gZG9jc3RyaW5nIG9uIHJldHVybiB2YWwpCisgICAgLy8gLy8vIC0gVGhyb3dzOiA8ZXhjZXB0aW9uIHR5cGVzPgorCisgICAgLy8gRGVzY3JpcHRpb24KKyAgICBzdHJpbmcgZG9jID0gdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nKG91dCwgZG9jKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8vIiA8PCBlbmRsOworCisgICAgLy8gUGFyYW1ldGVycworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIi8vLyAtIFBhcmFtZXRlcnM6IiA8PCBlbmRsOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vLyAgIC0gIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjogIjsKKyAgICAgICAgc3RyaW5nIGRvYyA9ICgqZl9pdGVyKS0+Z2V0X2RvYygpOworICAgICAgICBpZiAoIWRvYy5lbXB0eSgpICYmIGRvY1tkb2MubGVuZ3RoKCktMV0gPT0gJ1xuJykgeworICAgICAgICAgICAgZG9jLmVyYXNlKGRvYy5sZW5ndGgoKS0xKTsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgZG9jIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgLy8gUmV0dXJucworICAgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgICAgaWYgKCF0dHlwZS0+aXNfdm9pZCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiLy8vIC0gUmV0dXJuczogIiA8PCB0eXBlX25hbWUodHR5cGUpIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gVGhyb3dzCisgICAgaW5kZW50KG91dCkgPDwgIi8vLyAtIFRocm93czogIjsKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICgqeF9pdGVyICE9IHhjZXB0aW9ucy5iYWNrKCkpIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9ICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gZG9jc3RyaW5nCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmFzeW5jX2Z1bmN0aW9uX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAgIC8vIEdlbmVyYXRlIGRvY3N0cmluZyB3aXRoIGZvbGxvd2luZyBmb3JtYXQ6CisgICAgLy8gLy8vIDxEZXNjcmlwdGlvbj4KKyAgICAvLyAvLy8gPGVtcHR5IGxpbmU+CisgICAgLy8gLy8vIC0gUGFyYW1ldGVyczoKKyAgICAvLyAvLy8gICAtIDxwYXJhbWV0ZXI+OiA8cGFyYW1ldGVyIGRvY3N0cmluZz4KKyAgICAvLyAvLy8gICAtIGNhbGxiYWNrOiA8Y2FsbGJhY2sgdHlwZXM+CisKKyAgICAvLyBEZXNjcmlwdGlvbgorICAgIHN0cmluZyBkb2MgPSB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmcob3V0LCBkb2MpOworICAgIGluZGVudChvdXQpIDw8ICIvLy8iIDw8IGVuZGw7CisKKyAgICAvLyBQYXJhbWV0ZXJzCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiLy8vIC0gUGFyYW1ldGVyczoiIDw8IGVuZGw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiLy8vICAgLSAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiOworICAgICAgICBzdHJpbmcgZG9jID0gKCpmX2l0ZXIpLT5nZXRfZG9jKCk7CisgICAgICAgIGlmICghZG9jLmVtcHR5KCkgJiYgZG9jW2RvYy5sZW5ndGgoKS0xXSA9PSAnXG4nKSB7CisgICAgICAgICAgICBkb2MuZXJhc2UoZG9jLmxlbmd0aCgpLTEpOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBkb2MgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjb21wbGV0aW9uCisgICAgaW5kZW50KG91dCkgPDwgIi8vLyAgIC0gY29tcGxldGlvbjogVEFzeW5jUmVzdWx0PCIgPDwgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiPiB3cmFwcGluZyByZXR1cm4gYW5kIGZvbGxvd2luZyBFeGNlcHRpb25zOiAiOworICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgb3V0IDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpOworICAgICAgaWYgKCp4X2l0ZXIgIT0geGNlcHRpb25zLmJhY2soKSkgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSB0aGF0IHJldHVybnMgYXN5bmNocm9ub3VzbHkgdmlhIGJsb2Nrcy4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjphc3luY19mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHRfc3RydWN0KiB0YXJnbGlzdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgc3RyaW5nIHJlc3VsdCA9ICJmdW5jICIgKyAoZ2VuX2NvY29hXyA/IGZ1bmN0aW9uX25hbWUodGZ1bmN0aW9uKSA6IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgc3RyaW5nIHJlc3BvbnNlX3N0cmluZyA9ICIoVEFzeW5jUmVzdWx0PCI7CisgICAgcmVzcG9uc2Vfc3RyaW5nICs9ICh0dHlwZS0+aXNfdm9pZCgpKSA/ICJWb2lkIiA6IHR5cGVfbmFtZSh0dHlwZSk7CisgICAgcmVzcG9uc2Vfc3RyaW5nICs9ICI+KSAtPiBWb2lkIjsKKyAgICByZXN1bHQgKz0gIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICIiLCBmYWxzZSkKKyAgICAgICAgICAgICsgKHRhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA/ICIsICIgOiAiIikKKyAgICAgICAgICAgICsgImNvbXBsZXRpb246IEBlc2NhcGluZyAiICsgcmVzcG9uc2Vfc3RyaW5nICsgIikiOworICB9IGVsc2UgeworICAgIHN0cmluZyByZXNwb25zZV9wYXJhbSA9ICIoIiArICgodHR5cGUtPmlzX3ZvaWQoKSkgPyAiIiA6IHR5cGVfbmFtZSh0dHlwZSkpICsgIikgLT4gVm9pZCI7CisgICAgcmVzdWx0ICs9ICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiIiwgZmFsc2UpCisgICAgICAgICAgICArICh0YXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPyAiLCAiIDogIiIpCisgICAgICAgICAgICArICJzdWNjZXNzOiAiICsgcmVzcG9uc2VfcGFyYW0gKyAiLCAiCisgICAgICAgICAgICArICJmYWlsdXJlOiAoTlNFcnJvcikgLT4gVm9pZCkgdGhyb3dzIjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgdGhhdCByZXR1cm5zIGFzeW5jaHJvbm91c2x5IHZpYSBwcm9taXNlcy4KKyAqIE9OTFkgRk9SIFN3aWZ0Mi9Db2NvYSBCQUNLV0FSRFMgQ09NUEFUSUJJTElUWQorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OnByb21pc2VfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICByZXR1cm4gImZ1bmMgIiArIGZ1bmN0aW9uX25hbWUodGZ1bmN0aW9uKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiIiwgZmFsc2UpICsgIikgdGhyb3dzICIKKyAgICAgICAgICsgIi0+IFByb21pc2U8IiArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIj4iOworfQorCisvKioKKyAqIFJlbmRlcnMgYSB2ZXJib3NlIGZ1bmN0aW9uIG5hbWUgc3VpdGFibGUgZm9yIGEgU3dpZnQgbWV0aG9kLiAgT05MWSBGT1IgU3dpZnQyL0NvY29hIEJBQ0tXQVJEUyBDT01QQVRJQklMSVRZCisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgc3RyaW5nIG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpLmVtcHR5KCkpIHsKKyAgICBzdHJpbmcgZmlyc3RfYXJnID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpLmZyb250KCktPmdldF9uYW1lKCk7CisgICAgaWYgKG5hbWUuc2l6ZSgpIDwgZmlyc3RfYXJnLnNpemUoKSB8fAorICAgICAgICBsb3dlcmNhc2UobmFtZS5zdWJzdHIobmFtZS5zaXplKCktZmlyc3RfYXJnLnNpemUoKSkpICE9IGxvd2VyY2FzZShmaXJzdF9hcmcpKSB7CisgICAgICBuYW1lICs9ICJXaXRoIiArIGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpWzBdLT5nZXRfbmFtZSgpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG5hbWU7Cit9CisKKy8qKgorICogUmVuZGVycyBhIFN3aWZ0IG1ldGhvZCBhcmd1bWVudCBsaXN0CisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByb3RvY29sX25hbWUsIGJvb2wgaXNfaW50ZXJuYWwpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBib29sIGluY2x1ZGVfcHJvdG9jb2wgPSAhcHJvdG9jb2xfbmFtZS5lbXB0eSgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoaW5jbHVkZV9wcm90b2NvbCkgeworICAgIHJlc3VsdCArPSBwcm90b2NvbF9uYW1lICsgIjogVFByb3RvY29sIjsKKyAgICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgIH0gZWxzZSBpZiAoIWZpZWxkcy5lbXB0eSgpICYmIGlzX2ludGVybmFsICYmIGdlbl9jb2NvYV8pIHsKKyAgICAvLyBGb3JjZSBmaXJzdCBhcmd1bWVudCB0byBiZSBuYW1lZCwgU3dpZnQyL0NvY29hIGJhY2t3YXJkcyBjb21wYXQKKyAgICByZXN1bHQgKz0gZmllbGRzLmZyb250KCktPmdldF9uYW1lKCkgKyAiICI7CisgIH0KKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgeworICAgIHRfZmllbGQqIGFyZyA9ICpmX2l0ZXI7CisKKyAgICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAgIC8vIG9wdGlvbmFsIGFyZ3Mgbm90IHVzdWFsbHkgcGVybWl0dGVkIGZvciBzb21lIHJlYXNvbiwgZXZlbiB0aG91Z2ggZHluYW1pYyBsYW5ncyBoYW5kbGUgaXQKKyAgICAgIC8vIHVzZSBhbm5vdGF0aW9uICJzd2lmdC5udWxsYWJsZSIgdG8gYWNoaWV2ZQorICAgICAgcmVzdWx0ICs9IGFyZy0+Z2V0X25hbWUoKSArICI6ICIgKyB0eXBlX25hbWUoYXJnLT5nZXRfdHlwZSgpLCBmaWVsZF9pc19vcHRpb25hbChhcmcpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9IGFyZy0+Z2V0X25hbWUoKSArICI6ICIgKyB0eXBlX25hbWUoYXJnLT5nZXRfdHlwZSgpKTsKKyAgICB9CisKKyAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vbGlicmFyeS9pb3MvZG9jdW1lbnRhdGlvbi9Td2lmdC9Db25jZXB0dWFsL1N3aWZ0X1Byb2dyYW1taW5nX0xhbmd1YWdlL0xleGljYWxTdHJ1Y3R1cmUuaHRtbAorICoKKyAqLworCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpwb3B1bGF0ZV9yZXNlcnZlZF93b3JkcygpIHsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiX19DT0xVTU5fXyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIl9fRklMRV9fIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiX19GVU5DVElPTl9fIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiX19MSU5FX18iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJBbnkiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJhcyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImFzc29jaWF0ZWR0eXBlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiYXNzb2NpYXRpdml0eSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImJyZWFrIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiY2FzZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImNhdGNoIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiY2xhc3MiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJjb250aW51ZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImNvbnZlbmllbmNlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZGVmYXVsdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImRlZmVyIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZGVpbml0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZGlkU2V0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZG8iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJkeW5hbWljIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZHluYW1pY1R5cGUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJlbHNlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZW51bSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImV4dGVuc2lvbiIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZhbGx0aHJvdWdoIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZmFsc2UiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJmaWxlcHJpdmF0ZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZpbmFsIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZm9yIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZnVuYyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImdldCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImd1YXJkIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaWYiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpbXBvcnQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpbiIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImluZGlyZWN0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW5maXgiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpbml0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW5vdXQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpbnRlcm5hbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImlzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgibGF6eSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImxlZnQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJsZXQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJtdXRhdGluZyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIm5pbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIm5vbmUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJub25tdXRhdGluZyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIm9wZW4iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJvcGVyYXRvciIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIm9wdGlvbmFsIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgib3ZlcnJpZGUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJwb3N0Zml4Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicHJlY2VkZW5jZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInByZWZpeCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInByaXZhdGUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJwcm90b2NvbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIlByb3RvY29sIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicHVibGljIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicmVwZWF0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicmVxdWlyZWQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJyZXRocm93cyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInJldHVybiIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInJpZ2h0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic2VsZiIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIlNlbGYiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzZXQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzdGF0aWMiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzdHJ1Y3QiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzdWJzY3JpcHQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzdXBlciIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInN3aXRjaCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInRocm93Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidGhyb3dzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidHJ1ZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInRyeSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIlR5cGUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ0eXBlYWxpYXMiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ1bm93bmVkIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidmFyIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgid2VhayIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIndoZXJlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgid2hpbGUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ3aWxsU2V0Iik7CisgIH0gZWxzZSB7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiU2VsZiIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImFzc29jaWF0ZWR0eXBlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZGVmZXIiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJkZWluaXQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJkeW5hbWljVHlwZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImVudW0iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJleHRlbnNpb24iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJmYWxsdGhyb3VnaCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZhbHNlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZnVuYyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImd1YXJkIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW5pdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImlub3V0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW50ZXJuYWwiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJsZXQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJvcGVyYXRvciIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInByb3RvY29sIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicmVwZWF0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicmV0aHJvd3MiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzdHJ1Y3QiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzdWJzY3JpcHQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ0aHJvd3MiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ0cnVlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidHlwZWFsaWFzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgid2hlcmUiKTsKKyAgfQorfQorCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6Om1heWJlX2VzY2FwZV9pZGVudGlmaWVyKGNvbnN0IHN0cmluZyYgaWRlbnRpZmllcikgeworICBpZiAoc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmZpbmQoaWRlbnRpZmllcikgIT0gc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmVuZCgpKSB7CisgICAgcmV0dXJuICJgIiArIGlkZW50aWZpZXIgKyAiYCI7CisgIH0KKyAgcmV0dXJuIGlkZW50aWZpZXI7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBTd2lmdCBUVHlwZSBlbnVtZXJhdGlvbi4KKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlLCBib29sIHF1YWxpZmllZCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBzdHJpbmcgcmVzdWx0ID0gcXVhbGlmaWVkID8gIlRUeXBlLiIgOiAiLiI7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgInN0cmluZyI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgImJvb2wiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiaTgiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgImkxNiI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiaTMyIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJpNjQiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgImRvdWJsZSI7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJldHVybiByZXN1bHQgKyAiaTMyIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIHJldHVybiByZXN1bHQgKyAic3RydWN0IjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgIm1hcCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgcmV0dXJuIHJlc3VsdCArICJzZXQiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgImxpc3QiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJTVFJJTkciOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJCT09MIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgIkJZVEUiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgIkkxNiI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiSTMyIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJJNjQiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgIkRPVUJMRSI7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJldHVybiByZXN1bHQgKyAiSTMyIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIHJldHVybiByZXN1bHQgKyAiU1RSVUNUIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgIk1BUCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgcmV0dXJuIHJlc3VsdCArICJTRVQiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgIkxJU1QiOworICAgIH0KKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIHN3aWZ0LAorICAgICJTd2lmdCAzLjAiLAorICAgICIgICAgbG9nX3VuZXhwZWN0ZWQ6ICBMb2cgZXZlcnkgdGltZSBhbiB1bmV4cGVjdGVkIGZpZWxkIElEIG9yIHR5cGUgaXMgZW5jb3VudGVyZWQuXG4iCisgICAgIiAgICBkZWJ1Z19kZXNjcmlwdGlvbnM6XG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIEFsbG93IHVzZSBvZiBkZWJ1Z0Rlc2NyaXB0aW9uIHNvIHRoZSBhcHAgY2FuIGFkZCBkZXNjcmlwdGlvbiB2aWEgYSBjYXRlb2dvcnkvZXh0ZW5zaW9uXG4iCisgICAgIiAgICBhc3luY19jbGllbnRzOiAgIEdlbmVyYXRlIGNsaWVudHMgd2hpY2ggaW52b2tlIGFzeW5jaHJvbm91c2x5IHZpYSBibG9jayBzeW50YXguXG4iCisgICAgIiAgICBuYW1lc3BhY2VkOiAgICAgIEdlbmVyYXRlIHNvdXJjZSBpbiBNb2R1bGUgc2NvcGVkIG91dHB1dCBkaXJlY3RvcmllcyBmb3IgU3dpZnQgTmFtZXNwYWNpbmcuXG4iCisgICAgIiAgICBjb2NvYTogICAgICAgICAgIEdlbmVyYXRlIFN3aWZ0IDIueCBjb2RlIGNvbXBhdGlibGUgd2l0aCB0aGUgVGhyaWZ0L0NvY29hIGxpYnJhcnlcbiIKKyAgICAiICAgIHByb21pc2Vfa2l0OiAgICAgR2VuZXJhdGUgY2xpZW50cyB3aGljaCBpbnZva2UgYXN5bmNocm9ub3VzbHkgdmlhIHByb21pc2VzIChvbmx5IHVzZSB3aXRoIGNvY29hIGZsYWcpXG4iCisgICAgIiAgICBzYWZlX2VudW1zOiAgICAgIEdlbmVyYXRlIGVudW0gdHlwZXMgd2l0aCBhbiB1bmtub3duIGNhc2UgdG8gaGFuZGxlIHVuc3BlY2lmaWVkIHZhbHVlcyByYXRoZXIgdGhhbiB0aHJvdyBhIHNlcmlhbGl6YXRpb24gZXJyb3JcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3htbF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3htbF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVmZWQxNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfeG1sX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDY5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7Cit1c2luZyBzdGQ6OnN0YWNrOwordXNpbmcgc3RkOjpzZXQ7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7CitzdGF0aWMgY29uc3Qgc3RyaW5nIHF1b3QgPSAiXCIiOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGRlZmF1bHRfbnNfcHJlZml4ID0gImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy94bWwvbnMvIjsKKworLyoqCisgKiBUaGlzIGdlbmVyYXRvciBjcmVhdGVzIGFuIFhNTCBtb2RlbCBvZiB0aGUgcGFyc2VkIElETCB0cmVlLCBhbmQgaXMgZGVzaWduZWQKKyAqIHRvIG1ha2UgaXQgZWFzeSB0byB1c2UgdGhpcyBmaWxlIGFzIHRoZSBpbnB1dCBmb3Igb3RoZXIgdGVtcGxhdGUgZW5naW5lcywKKyAqIHN1Y2ggYXMgWFNMVC4gIFRvIHRoaXMgZW5kLCB0aGUgZ2VuZXJhdGVkIFhNTCBpcyBzbGlnaHRseSBtb3JlIHZlcmJvc2UgdGhhbgorICogeW91IG1pZ2h0IGV4cGVjdC4uLiBmb3IgZXhhbXBsZSwgcmVmZXJlbmNlcyB0byAiaWQiIHR5cGVzIChzdWNoIGFzIHN0cnVjdHMsCisgKiB1bmlvbnMsIGV0YykgYWx3YXlzIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIElETCBkb2N1bWVudCwgZXZlbiBpZiB0aGUgdHlwZQorICogaXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBkb2N1bWVudCBhcyB0aGUgcmVmZXJlbmNlLgorICovCitjbGFzcyB0X3htbF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X3htbF9nZW5lcmF0b3IoIHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBzaG91bGRfbWVyZ2VfaW5jbHVkZXNfID0gZmFsc2U7CisgICAgc2hvdWxkX3VzZV9kZWZhdWx0X25zXyA9IHRydWU7CisgICAgc2hvdWxkX3VzZV9uYW1lc3BhY2VzXyA9IHRydWU7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibWVyZ2UiKSA9PSAwKSB7CisgICAgICAgIHNob3VsZF9tZXJnZV9pbmNsdWRlc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub19kZWZhdWx0X25zIikgPT0gMCkgeworICAgICAgICBzaG91bGRfdXNlX2RlZmF1bHRfbnNfID0gZmFsc2U7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vX25hbWVzcGFjZXMiKSA9PSAwKSB7CisgICAgICAgIHNob3VsZF91c2VfbmFtZXNwYWNlc18gPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiB4bWw6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXhtbCI7CisgIH0KKworICB2aXJ0dWFsIH50X3htbF9nZW5lcmF0b3IoKSB7fQorCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtKCk7CisKKyAgdm9pZCBpdGVyYXRlX3Byb2dyYW0odF9wcm9ncmFtKiBwcm9ncmFtKTsKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmMpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkKHRfZmllbGQqIGZpZWxkKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2Fubm90YXRpb25zKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnMpOworCitwcml2YXRlOgorICBib29sIHNob3VsZF9tZXJnZV9pbmNsdWRlc187CisgIGJvb2wgc2hvdWxkX3VzZV9kZWZhdWx0X25zXzsKKyAgYm9vbCBzaG91bGRfdXNlX25hbWVzcGFjZXNfOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl94bWxfOworCisgIHN0ZDo6c2V0PHN0cmluZz4gcHJvZ3JhbXNfOworICBzdGQ6OnN0YWNrPHN0cmluZz4gZWxlbWVudHNfOworICBib29sIHRvcF9lbGVtZW50X2lzX2VtcHR5OworICBib29sIHRvcF9lbGVtZW50X2lzX29wZW47CisKKyAgc3RyaW5nIHRhcmdldF9uYW1lc3BhY2UodF9wcm9ncmFtKiBwcm9ncmFtKTsKKyAgdm9pZCB3cml0ZV9lbGVtZW50X3N0YXJ0KGNvbnN0IHN0cmluZyBuYW1lKTsKKyAgdm9pZCBjbG9zZV90b3BfZWxlbWVudCgpOworICB2b2lkIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIHZvaWQgd3JpdGVfYXR0cmlidXRlKHN0cmluZyBrZXksIHN0cmluZyB2YWwpOworICB2b2lkIHdyaXRlX2ludF9hdHRyaWJ1dGUoc3RyaW5nIGtleSwgaW50IHZhbCk7CisgIHN0cmluZyBlc2NhcGVfeG1sX3N0cmluZyhjb25zdCBzdHJpbmcmIGlucHV0KTsKKworICB2b2lkIHdyaXRlX3htbF9jb21tZW50KHN0cmluZyBtc2cpOworCisgIHZvaWQgd3JpdGVfdHlwZSh0X3R5cGUqIHR0eXBlKTsKKyAgdm9pZCB3cml0ZV9kb2ModF9kb2MqIHRkb2MpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdHJpbmcgbnVtYmVyX3RvX3N0cmluZyhUIHQpIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICAgIG91dC5pbWJ1ZShzdGQ6OmxvY2FsZTo6Y2xhc3NpYygpKTsKKyAgICBvdXQucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmRpZ2l0czEwKTsKKyAgICBvdXQgPDwgdDsKKyAgICByZXR1cm4gb3V0LnN0cigpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHZvaWQgd3JpdGVfbnVtYmVyKFQgbikgeworICAgIGZfeG1sXyA8PCBudW1iZXJfdG9fc3RyaW5nKG4pOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHZvaWQgd3JpdGVfZWxlbWVudF9udW1iZXIoc3RyaW5nIG5hbWUsIFQgbikgeworICAgIHdyaXRlX2VsZW1lbnRfc3RyaW5nKG5hbWUsIG51bWJlcl90b19zdHJpbmcobikpOworICB9CisKKyAgc3RyaW5nIGdldF90eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdGFudCh0X2NvbnN0KiBjb24pOworCisgIHZvaWQgd3JpdGVfZWxlbWVudF9zdHJpbmcoc3RyaW5nIG5hbWUsIHN0cmluZyB2YWx1ZSk7CisgIHZvaWQgd3JpdGVfdmFsdWUodF90eXBlKiB0dmFsdWUpOworICB2b2lkIHdyaXRlX2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyB4bWxfYXV0b2dlbl9jb21tZW50KCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiXG4iKSArICIgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKKyAgICAgICAgICAgKyAiICpcbiIgKyAiICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIjsKKyAgfQorfTsKKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIHN0cmluZyBmX3htbF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIi54bWwiOworICBmX3htbF8ub3BlbihmX3htbF9uYW1lLmNfc3RyKCkpOworCisgIHRvcF9lbGVtZW50X2lzX29wZW4gPSBmYWxzZTsKK30KKworc3RyaW5nIHRfeG1sX2dlbmVyYXRvcjo6dGFyZ2V0X25hbWVzcGFjZSh0X3Byb2dyYW0qIHByb2dyYW0pIHsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBtYXA7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ZXI7CisgIG1hcCA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2VfYW5ub3RhdGlvbnMoInhtbCIpOworICBpZiAoKGl0ZXIgPSBtYXAuZmluZCgidGFyZ2V0TmFtZXNwYWNlIikpICE9IG1hcC5lbmQoKSkgeworICAgIHJldHVybiBpdGVyLT5zZWNvbmQ7CisgIH0KKyAgbWFwID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZXMoKTsKKyAgaWYgKChpdGVyID0gbWFwLmZpbmQoInhtbCIpKSAhPSBtYXAuZW5kKCkpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9uc19wcmVmaXggKyBpdGVyLT5zZWNvbmQ7CisgIH0KKyAgbWFwID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZV9hbm5vdGF0aW9ucygiKiIpOworICBpZiAoKGl0ZXIgPSBtYXAuZmluZCgieG1sLnRhcmdldE5hbWVzcGFjZSIpKSAhPSBtYXAuZW5kKCkpIHsKKyAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICB9CisgIG1hcCA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2VzKCk7CisgIGlmICgoaXRlciA9IG1hcC5maW5kKCIqIikpICE9IG1hcC5lbmQoKSkgeworICAgIHJldHVybiBkZWZhdWx0X25zX3ByZWZpeCArIGl0ZXItPnNlY29uZDsKKyAgfQorICByZXR1cm4gZGVmYXVsdF9uc19wcmVmaXggKyBwcm9ncmFtLT5nZXRfbmFtZSgpOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfeG1sX2NvbW1lbnQoc3RyaW5nIG1zZykgeworICBjbG9zZV90b3BfZWxlbWVudCgpOworICAvLyBUT0RPOiBpbmRlbnQgYW55IEVPTHMgdGhhdCBtYXkgb2NjdXIgd2l0aCBtc2cKKyAgLy8gVE9ETzogcHJvcGVyIG1zZyBlc2NhcGluZyBuZWVkZWQ/CisgIGZfeG1sXyA8PCBpbmRlbnQoKSA8PCAiPCEtLSAiIDw8IG1zZyA8PCAiIC0tPiIgIDw8IGVuZGw7CisgIHRvcF9lbGVtZW50X2lzX2VtcHR5ID0gZmFsc2U7Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjpjbG9zZV90b3BfZWxlbWVudCgpIHsKKyAgaWYoIHRvcF9lbGVtZW50X2lzX29wZW4pIHsKKyAgICB0b3BfZWxlbWVudF9pc19vcGVuID0gZmFsc2U7CisgICAgaWYgKGVsZW1lbnRzXy5zaXplKCkgPiAwICYmIHRvcF9lbGVtZW50X2lzX2VtcHR5KSB7CisgICAgICBmX3htbF8gPDwgIj4iIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjp3cml0ZV9lbGVtZW50X3N0YXJ0KHN0cmluZyBuYW1lKSB7CisgIGlmIChzaG91bGRfdXNlX25hbWVzcGFjZXNfICYmICFzaG91bGRfdXNlX2RlZmF1bHRfbnNfKSB7CisgICAgbmFtZSA9ICJpZGw6IiArIG5hbWU7CisgIH0KKyAgY2xvc2VfdG9wX2VsZW1lbnQoKTsKKyAgZl94bWxfIDw8IGluZGVudCgpIDw8ICI8IiA8PCBuYW1lOworICBlbGVtZW50c18ucHVzaChuYW1lKTsKKyAgdG9wX2VsZW1lbnRfaXNfZW1wdHkgPSB0cnVlOworICB0b3BfZWxlbWVudF9pc19vcGVuID0gdHJ1ZTsKKyAgaW5kZW50X3VwKCk7Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjp3cml0ZV9lbGVtZW50X2VuZCgpIHsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaWYgKHRvcF9lbGVtZW50X2lzX2VtcHR5ICYmIHRvcF9lbGVtZW50X2lzX29wZW4pIHsKKyAgICBmX3htbF8gPDwgIiAvPiIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3htbF8gPDwgaW5kZW50KCkgPDwgIjwvIiA8PCBlbGVtZW50c18udG9wKCkgPDwgIj4iIDw8IGVuZGw7CisgIH0KKyAgdG9wX2VsZW1lbnRfaXNfZW1wdHkgPSBmYWxzZTsKKyAgZWxlbWVudHNfLnBvcCgpOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfYXR0cmlidXRlKHN0cmluZyBrZXksIHN0cmluZyB2YWwpIHsKKyAgZl94bWxfIDw8ICIgIiA8PCBrZXkgPDwgIj1cIiIgPDwgZXNjYXBlX3htbF9zdHJpbmcodmFsKSA8PCAiXCIiOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfaW50X2F0dHJpYnV0ZShzdHJpbmcga2V5LCBpbnQgdmFsKSB7CisgIHdyaXRlX2F0dHJpYnV0ZShrZXksIG51bWJlcl90b19zdHJpbmcodmFsKSk7Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjp3cml0ZV9lbGVtZW50X3N0cmluZyhzdHJpbmcgbmFtZSwgc3RyaW5nIHZhbCkgeworICBpZiAoc2hvdWxkX3VzZV9uYW1lc3BhY2VzXyAmJiAhc2hvdWxkX3VzZV9kZWZhdWx0X25zXykgeworICAgIG5hbWUgPSAiaWRsOiIgKyBuYW1lOworICB9CisgIGNsb3NlX3RvcF9lbGVtZW50KCk7CisgIHRvcF9lbGVtZW50X2lzX2VtcHR5ID0gZmFsc2U7CisgIGZfeG1sXyA8PCBpbmRlbnQoKQorICAgIDw8ICI8IiA8PCBuYW1lIDw8ICI+IiA8PCBlc2NhcGVfeG1sX3N0cmluZyh2YWwpIDw8ICI8LyIgPDwgbmFtZSA8PCAiPiIKKyAgICA8PCBlbmRsOworfQorCitzdHJpbmcgdF94bWxfZ2VuZXJhdG9yOjplc2NhcGVfeG1sX3N0cmluZyhjb25zdCBzdHJpbmcmIGlucHV0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKKyAgZm9yIChzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGlucHV0LmJlZ2luKCk7IGl0ZXIgIT0gaW5wdXQuZW5kKCk7IGl0ZXIrKykgeworICAgIHN3aXRjaCAoKml0ZXIpIHsKKyAgICBjYXNlICcmJzoKKyAgICAgIHNzIDw8ICImYW1wOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICciJzoKKyAgICAgIHNzIDw8ICImcXVvdDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXCcnOgorICAgICAgc3MgPDwgIiZhcG9zOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICc8JzoKKyAgICAgIHNzIDw8ICImbHQ7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJz4nOgorICAgICAgc3MgPDwgIiZndDsiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHNzIDw8ICppdGVyOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBzcy5zdHIoKTsKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgZl94bWxfLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgeworCisgIGluaXRfZ2VuZXJhdG9yKCk7CisKKyAgd3JpdGVfZWxlbWVudF9zdGFydCgiaWRsIik7CisgIGlmIChzaG91bGRfdXNlX25hbWVzcGFjZXNfKSB7CisgICAgaWYgKHNob3VsZF91c2VfZGVmYXVsdF9uc18pIHsKKyAgICAgIHdyaXRlX2F0dHJpYnV0ZSgieG1sbnMiLCAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL3htbC9pZGwiKTsKKyAgICB9CisgICAgd3JpdGVfYXR0cmlidXRlKCJ4bWxuczppZGwiLCAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL3htbC9pZGwiKTsKKyAgfQorCisgIHdyaXRlX3htbF9jb21tZW50KCB4bWxfYXV0b2dlbl9jb21tZW50KCkpOworCisgIGl0ZXJhdGVfcHJvZ3JhbShwcm9ncmFtXyk7CisKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKworICBjbG9zZV9nZW5lcmF0b3IoKTsKKworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6aXRlcmF0ZV9wcm9ncmFtKHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworCisgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImRvY3VtZW50Iik7CisgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIHByb2dyYW0tPmdldF9uYW1lKCkpOworICBpZiAoc2hvdWxkX3VzZV9uYW1lc3BhY2VzXykgeworICAgIGNvbnN0IHN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSB0YXJnZXRfbmFtZXNwYWNlKHByb2dyYW0pOworICAgIHdyaXRlX2F0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIiwgdGFyZ2V0TmFtZXNwYWNlKTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoInhtbG5zOiIgKyBwcm9ncmFtLT5nZXRfbmFtZSgpLCB0YXJnZXROYW1lc3BhY2UpOworICB9CisgIHdyaXRlX2RvYyhwcm9ncmFtKTsKKworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4gaW5jbHVkZXMgPSBwcm9ncmFtLT5nZXRfaW5jbHVkZXMoKTsKKyAgdmVjdG9yPHRfcHJvZ3JhbSo+Ojpjb25zdF9pdGVyYXRvciBpbmNfaXQ7CisgIGZvciAoaW5jX2l0ID0gaW5jbHVkZXMuYmVnaW4oKTsgaW5jX2l0ICE9IGluY2x1ZGVzLmVuZCgpOyArK2luY19pdCkgeworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImluY2x1ZGUiKTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoIm5hbWUiLCAoKmluY19pdCktPmdldF9uYW1lKCkpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0KKworICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiBuYW1lc3BhY2VzID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZXMoKTsKKyAgbWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgbnNfaXQ7CisgIGZvciAobnNfaXQgPSBuYW1lc3BhY2VzLmJlZ2luKCk7IG5zX2l0ICE9IG5hbWVzcGFjZXMuZW5kKCk7ICsrbnNfaXQpIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJuYW1lc3BhY2UiKTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoIm5hbWUiLCBuc19pdC0+Zmlyc3QpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgidmFsdWUiLCBuc19pdC0+c2Vjb25kKTsKKyAgICBnZW5lcmF0ZV9hbm5vdGF0aW9ucyhwcm9ncmFtLT5nZXRfbmFtZXNwYWNlX2Fubm90YXRpb25zKG5zX2l0LT5maXJzdCkpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0KKworICAvLyBUT0RPOiBjYW4gY29uc3RhbnRzIGhhdmUgYW5ub3RhdGlvbnM/CisgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gcHJvZ3JhbS0+Z2V0X2NvbnN0cygpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZ2VuZXJhdGVfY29uc3RhbnQoKmNfaXRlcik7CisgIH0KKworICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBwcm9ncmFtLT5nZXRfdHlwZWRlZnMoKTsKKyAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOworICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV90eXBlZGVmKCp0ZF9pdGVyKTsKKyAgfQorCisgIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW0tPmdldF9lbnVtcygpOworICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7CisgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgeworICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOworICB9CisKKyAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IHByb2dyYW0tPmdldF9vYmplY3RzKCk7CisgIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciBvX2l0ZXI7CisgIGZvciAob19pdGVyID0gb2JqZWN0cy5iZWdpbigpOyBvX2l0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytvX2l0ZXIpIHsKKyAgICBpZiAoKCpvX2l0ZXIpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBnZW5lcmF0ZV94Y2VwdGlvbigqb19pdGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfc3RydWN0KCpvX2l0ZXIpOworICAgIH0KKyAgfQorCisgIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW0tPmdldF9zZXJ2aWNlcygpOworICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7CisgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgeworICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOworICB9CisKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKworICBpZiAoc2hvdWxkX21lcmdlX2luY2x1ZGVzXykgeworICAgIHByb2dyYW1zXy5pbnNlcnQocHJvZ3JhbS0+Z2V0X25hbWUoKSk7CisgICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+IHByb2dyYW1zID0gcHJvZ3JhbS0+Z2V0X2luY2x1ZGVzKCk7CisgICAgdmVjdG9yPHRfcHJvZ3JhbSo+Ojpjb25zdF9pdGVyYXRvciBwcm9nX2l0OworICAgIGZvciAocHJvZ19pdCA9IHByb2dyYW1zLmJlZ2luKCk7IHByb2dfaXQgIT0gcHJvZ3JhbXMuZW5kKCk7ICsrcHJvZ19pdCkgeworICAgICAgaWYgKCFwcm9ncmFtc18uY291bnQoKCpwcm9nX2l0KS0+Z2V0X25hbWUoKSkpIHsKKyAgICAgICAgaXRlcmF0ZV9wcm9ncmFtKCpwcm9nX2l0KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIHdyaXRlX2VsZW1lbnRfc3RhcnQoInR5cGVkZWYiKTsKKyAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgdHR5cGVkZWYtPmdldF9uYW1lKCkpOworICB3cml0ZV9kb2ModHR5cGVkZWYpOworICB3cml0ZV90eXBlKHR0eXBlZGVmLT5nZXRfdHJ1ZV90eXBlKCkpOworICBnZW5lcmF0ZV9hbm5vdGF0aW9ucyh0dHlwZWRlZi0+YW5ub3RhdGlvbnNfKTsKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgcmV0dXJuOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgIGNvbnN0IHN0cmluZyB0eXBlID0gZ2V0X3R5cGVfbmFtZSh0dHlwZSk7CisgIHdyaXRlX2F0dHJpYnV0ZSgidHlwZSIsIHR5cGUpOworICBpZiAodHlwZSA9PSAiaWQiKSB7CisgICAgd3JpdGVfYXR0cmlidXRlKCJ0eXBlLW1vZHVsZSIsIHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoInR5cGUtaWQiLCB0dHlwZS0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZSA9PSAibGlzdCIpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImVsZW1UeXBlIik7CisgICAgd3JpdGVfdHlwZShldHlwZSk7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfSBlbHNlIGlmICh0eXBlID09ICJzZXQiKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImVsZW1UeXBlIik7CisgICAgd3JpdGVfdHlwZShldHlwZSk7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfSBlbHNlIGlmICh0eXBlID09ICJtYXAiKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgia2V5VHlwZSIpOworICAgIHdyaXRlX3R5cGUoa3R5cGUpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgidmFsdWVUeXBlIik7CisgICAgd3JpdGVfdHlwZSh2dHlwZSk7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfQorfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfZG9jKHRfZG9jKiB0ZG9jKSB7CisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBzdHJpbmcgZG9jID0gdGRvYy0+Z2V0X2RvYygpOworICAgIC8vIGZvciBzb21lIHJlYXNvbiB0aGVyZSBhbHdheXMgc2VlbXMgdG8gYmUgYSB0cmFpbGluZyBuZXdsaW5lIG9uIGRvYworICAgIC8vIGNvbW1lbnRzOyBsb29wIGJlbG93IG5haXZlbHkgdHJpZXMgdG8gc3RyaXAgb2ZmIHRyYWlsaW5nIGNyL2xmCisgICAgaW50IG4gPSAwOworICAgIGZvciAoc3RyaW5nOjpyZXZlcnNlX2l0ZXJhdG9yIGkgPSBkb2MucmJlZ2luKCk7IGkgIT0gZG9jLnJlbmQoKTsgaSsrLG4rKykgeworICAgICAgaWYgKCppICE9ICdcbicgfHwgKmkgPT0gJ1xyJykgeworICAgICAgICBpZiAobiA+IDApIHsKKyAgICAgICAgICBkb2MuZXJhc2UoZG9jLmxlbmd0aCgpIC0gbik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHdyaXRlX2F0dHJpYnV0ZSgiZG9jIiwgZG9jKTsKKyAgfQorfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYW5ub3RhdGlvbnMoCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9ucykgeworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdGVyOworICBmb3IgKGl0ZXIgPSBhbm5vdGF0aW9ucy5iZWdpbigpOyBpdGVyICE9IGFubm90YXRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJhbm5vdGF0aW9uIik7CisgICAgd3JpdGVfYXR0cmlidXRlKCJrZXkiLCBpdGVyLT5maXJzdCk7CisgICAgd3JpdGVfYXR0cmlidXRlKCJ2YWx1ZSIsIGl0ZXItPnNlY29uZCk7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfQorfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RhbnQodF9jb25zdCogY29uKSB7CisgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImNvbnN0Iik7CisgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIGNvbi0+Z2V0X25hbWUoKSk7CisgIHdyaXRlX2RvYyhjb24pOworICB3cml0ZV90eXBlKGNvbi0+Z2V0X3R5cGUoKSk7CisgIHdyaXRlX2NvbnN0X3ZhbHVlKGNvbi0+Z2V0X3ZhbHVlKCkpOworICB3cml0ZV9lbGVtZW50X2VuZCgpOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfY29uc3RfdmFsdWUodF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKworICBzd2l0Y2ggKHZhbHVlLT5nZXRfdHlwZSgpKSB7CisKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgorICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6CisgICAgd3JpdGVfZWxlbWVudF9udW1iZXIoImludCIsIHZhbHVlLT5nZXRfaW50ZWdlcigpKTsKKyAgICBicmVhazsKKworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKKyAgICB3cml0ZV9lbGVtZW50X251bWJlcigiZG91YmxlIiwgdmFsdWUtPmdldF9kb3VibGUoKSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkc6CisgICAgd3JpdGVfZWxlbWVudF9zdHJpbmcoInN0cmluZyIsIHZhbHVlLT5nZXRfc3RyaW5nKCkpOworICAgIGJyZWFrOworCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTElTVDogeworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImxpc3QiKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4gbGlzdCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbGl0OworICAgIGZvciAobGl0ID0gbGlzdC5iZWdpbigpOyBsaXQgIT0gbGlzdC5lbmQoKTsgKytsaXQpIHsKKyAgICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImVudHJ5Iik7CisgICAgICB3cml0ZV9jb25zdF92YWx1ZSgqbGl0KTsKKyAgICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgICAgfQorICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgICAgYnJlYWs7CisgIH0KKworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDogeworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoIm1hcCIpOworICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4gbWFwID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+OjppdGVyYXRvciBtaXQ7CisgICAgZm9yIChtaXQgPSBtYXAuYmVnaW4oKTsgbWl0ICE9IG1hcC5lbmQoKTsgKyttaXQpIHsKKyAgICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImVudHJ5Iik7CisgICAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJrZXkiKTsKKyAgICAgIHdyaXRlX2NvbnN0X3ZhbHVlKG1pdC0+Zmlyc3QpOworICAgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoInZhbHVlIik7CisgICAgICB3cml0ZV9jb25zdF92YWx1ZShtaXQtPnNlY29uZCk7CisgICAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICAgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgICB9CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgICBicmVhazsKKyAgfQorCisgIGRlZmF1bHQ6CisgICAgaW5kZW50X3VwKCk7CisgICAgZl94bWxfIDw8IGluZGVudCgpIDw8ICI8bnVsbCAvPiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGJyZWFrOworICB9CisKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworCisgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImVudW0iKTsKKyAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgdGVudW0tPmdldF9uYW1lKCkpOworICB3cml0ZV9kb2ModGVudW0pOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiB2YWx1ZXMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIHZhbF9pdGVyOworICBmb3IgKHZhbF9pdGVyID0gdmFsdWVzLmJlZ2luKCk7IHZhbF9pdGVyICE9IHZhbHVlcy5lbmQoKTsgKyt2YWxfaXRlcikgeworICAgIHRfZW51bV92YWx1ZSogdmFsID0gKCp2YWxfaXRlcik7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgibWVtYmVyIik7CisgICAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgdmFsLT5nZXRfbmFtZSgpKTsKKyAgICB3cml0ZV9pbnRfYXR0cmlidXRlKCJ2YWx1ZSIsIHZhbC0+Z2V0X3ZhbHVlKCkpOworICAgIHdyaXRlX2RvYyh2YWwpOworICAgIGdlbmVyYXRlX2Fubm90YXRpb25zKHZhbC0+YW5ub3RhdGlvbnNfKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICB9CisKKyAgZ2VuZXJhdGVfYW5ub3RhdGlvbnModGVudW0tPmFubm90YXRpb25zXyk7CisKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisKKyAgc3RyaW5nIHRhZ25hbWUgPSAic3RydWN0IjsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICB0YWduYW1lID0gInVuaW9uIjsKKyAgfSBlbHNlIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7CisgICAgdGFnbmFtZSA9ICJleGNlcHRpb24iOworICB9CisKKyAgd3JpdGVfZWxlbWVudF9zdGFydCh0YWduYW1lKTsKKyAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgdHN0cnVjdC0+Z2V0X25hbWUoKSk7CisgIHdyaXRlX2RvYyh0c3RydWN0KTsKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXI7CisgIGZvciAobWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1lbV9pdGVyKyspIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJmaWVsZCIpOworICAgIGdlbmVyYXRlX2ZpZWxkKCptZW1faXRlcik7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfQorCisgIGdlbmVyYXRlX2Fubm90YXRpb25zKHRzdHJ1Y3QtPmFubm90YXRpb25zXyk7CisKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGQodF9maWVsZCogZmllbGQpIHsKKyAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgZmllbGQtPmdldF9uYW1lKCkpOworICB3cml0ZV9pbnRfYXR0cmlidXRlKCJmaWVsZC1pZCIsIGZpZWxkLT5nZXRfa2V5KCkpOworICB3cml0ZV9kb2MoZmllbGQpOworICBzdHJpbmcgcmVxdWlyZWRuZXNzOworICBzd2l0Y2ggKGZpZWxkLT5nZXRfcmVxKCkpIHsKKyAgY2FzZSB0X2ZpZWxkOjpUX1JFUVVJUkVEOgorICAgIHJlcXVpcmVkbmVzcyA9ICJyZXF1aXJlZCI7CisgICAgYnJlYWs7CisgIGNhc2UgdF9maWVsZDo6VF9PUFRJT05BTDoKKyAgICByZXF1aXJlZG5lc3MgPSAib3B0aW9uYWwiOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHJlcXVpcmVkbmVzcyA9ICIiOworICAgIGJyZWFrOworICB9CisgIGlmIChyZXF1aXJlZG5lc3MgIT0gIiIpIHsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoInJlcXVpcmVkIiwgcmVxdWlyZWRuZXNzKTsKKyAgfQorICB3cml0ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgaWYgKGZpZWxkLT5nZXRfdmFsdWUoKSkgeworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImRlZmF1bHQiKTsKKyAgICB3cml0ZV9jb25zdF92YWx1ZShmaWVsZC0+Z2V0X3ZhbHVlKCkpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0KKyAgZ2VuZXJhdGVfYW5ub3RhdGlvbnMoZmllbGQtPmFubm90YXRpb25zXyk7Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJzZXJ2aWNlIik7CisgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIHRzZXJ2aWNlLT5nZXRfbmFtZSgpKTsKKworICBpZiAoc2hvdWxkX3VzZV9uYW1lc3BhY2VzXykgeworICAgIHN0cmluZyBwcm9nX25zID0gdGFyZ2V0X25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSk7CisgICAgaWYgKCpwcm9nX25zLnJiZWdpbigpICE9ICcvJykgeworICAgICAgcHJvZ19ucy5wdXNoX2JhY2soJy8nKTsKKyAgICB9CisgICAgY29uc3Qgc3RyaW5nIHRucyA9IHByb2dfbnMgKyB0c2VydmljZS0+Z2V0X25hbWUoKTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoInRhcmdldE5hbWVzcGFjZSIsIHRucyk7CisgICAgd3JpdGVfYXR0cmlidXRlKCJ4bWxuczp0bnMiLCB0bnMpOworICB9CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7CisgICAgY29uc3QgdF9zZXJ2aWNlKiBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgd3JpdGVfYXR0cmlidXRlKCJwYXJlbnQtbW9kdWxlIiwgZXh0ZW5kcy0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSk7CisgICAgd3JpdGVfYXR0cmlidXRlKCJwYXJlbnQtaWQiLCBleHRlbmRzLT5nZXRfbmFtZSgpKTsKKyAgfQorCisgIHdyaXRlX2RvYyh0c2VydmljZSk7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7CisgIGZvciAoOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgZm5faXRlcisrKSB7CisgICAgZ2VuZXJhdGVfZnVuY3Rpb24oKmZuX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfYW5ub3RhdGlvbnModHNlcnZpY2UtPmFubm90YXRpb25zXyk7CisKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmMpIHsKKworICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJtZXRob2QiKTsKKworICB3cml0ZV9hdHRyaWJ1dGUoIm5hbWUiLCB0ZnVuYy0+Z2V0X25hbWUoKSk7CisgIGlmICh0ZnVuYy0+aXNfb25ld2F5KCkpIHsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoIm9uZXdheSIsICJ0cnVlIik7CisgIH0KKworICB3cml0ZV9kb2ModGZ1bmMpOworCisgIHdyaXRlX2VsZW1lbnRfc3RhcnQoInJldHVybnMiKTsKKyAgd3JpdGVfdHlwZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSk7CisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOworICBmb3IgKDsgbWVtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgbWVtX2l0ZXIrKykgeworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImFyZyIpOworICAgIGdlbmVyYXRlX2ZpZWxkKCptZW1faXRlcik7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfQorCisgIHZlY3Rvcjx0X2ZpZWxkKj4gZXhjZXB0cyA9IHRmdW5jLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGV4X2l0ZXIgPSBleGNlcHRzLmJlZ2luKCk7CisgIGZvciAoOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgeworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoInRocm93cyIpOworICAgIGdlbmVyYXRlX2ZpZWxkKCpleF9pdGVyKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICB9CisKKyAgZ2VuZXJhdGVfYW5ub3RhdGlvbnModGZ1bmMtPmFubm90YXRpb25zXyk7CisKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKworfQorCitzdHJpbmcgdF94bWxfZ2VuZXJhdG9yOjpnZXRfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gImxpc3QiOworICB9CisgIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gInNldCI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAibWFwIjsKKyAgfQorICBpZiAoKHR0eXBlLT5pc19lbnVtKCkgICAgKXx8CisgICAgICAodHR5cGUtPmlzX3N0cnVjdCgpICApfHwKKyAgICAgICh0dHlwZS0+aXNfdHlwZWRlZigpICl8fAorICAgICAgKHR0eXBlLT5pc194Y2VwdGlvbigpKSl7CisgICAgcmV0dXJuICJpZCI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZXR5cGUgPSAodF9iYXNlX3R5cGUqKXR0eXBlOworICAgIGlmICh0YmFzZXR5cGUtPmlzX2JpbmFyeSgpICkgeworICAgICAgcmV0dXJuICJiaW5hcnkiOworICAgIH0KKyAgICByZXR1cm4gdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNldHlwZS0+Z2V0X2Jhc2UoKSk7CisgIH0KKyAgcmV0dXJuICIodW5rbm93bikiOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICB4bWwsCisgICJYTUwiLAorICAiICAgIG1lcmdlOiAgICAgICAgICAgR2VuZXJhdGUgb3V0cHV0IHdpdGggaW5jbHVkZWQgZmlsZXMgbWVyZ2VkXG4iCisgICIgICAgbm9fZGVmYXVsdF9uczogICBPbWl0IGRlZmF1bHQgeG1sbnMgYW5kIGFkZCBpZGw6IHByZWZpeCB0byBhbGwgZWxlbWVudHNcbiIKKyAgIiAgICBub19uYW1lc3BhY2VzOiAgIERvIG5vdCBhZGQgbmFtZXNwYWNlIGRlZmluaXRpb25zIHRvIHRoZSBYTUwgbW9kZWxcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ4N2ZmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDM3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIFhTRCBnZW5lcmF0b3IsIGNyZWF0ZXMgYW4gWFNEIGZvciB0aGUgYmFzZSB0eXBlcyBldGMuCisgKgorICovCitjbGFzcyB0X3hzZF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X3hzZF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICAvKiBubyBvcHRpb25zIHlldCAqLworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIHhzZDoiICsgaXRlci0+Zmlyc3Q7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4teHNkIjsKKyAgfQorCisgIHZpcnR1YWwgfnRfeHNkX2dlbmVyYXRvcigpIHt9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsgKHZvaWQpdGVudW07IH0KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKworcHJpdmF0ZToKKyAgdm9pZCBnZW5lcmF0ZV9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogYXR0cnMgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25hbCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuaWxsYWJsZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsaXN0X2VsZW1lbnQgPSBmYWxzZSk7CisKKyAgc3RkOjpzdHJpbmcgbnMoc3RkOjpzdHJpbmcgaW4sIHN0ZDo6c3RyaW5nIG5zKSB7IHJldHVybiBucyArICI6IiArIGluOyB9CisKKyAgc3RkOjpzdHJpbmcgeHNkKHN0ZDo6c3RyaW5nIGluKSB7IHJldHVybiBucyhpbiwgInhzZCIpOyB9CisKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlKTsKKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHhtbF9hdXRvZ2VuX2NvbW1lbnQoKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCI8IS0tXG4iKSArICIgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKKyAgICAgICAgICAgKyAiICpcbiIgKyAiICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIgorICAgICAgICAgICArICIgLS0+XG4iOworICB9CisKKyAgLyoqCisgICAqIE91dHB1dCB4c2QvcGhwIGZpbGUKKyAgICovCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl94c2RfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfcGhwXzsKKworICAvKioKKyAgICogT3V0cHV0IHN0cmluZyBzdHJlYW0KKyAgICovCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3hzZF90eXBlc187Cit9OworCit2b2lkIHRfeHNkX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfcGhwX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiX3hzZC5waHAiOworICBmX3BocF8ub3BlbihmX3BocF9uYW1lLmNfc3RyKCkpOworCisgIGZfcGhwXyA8PCAiPD9waHAiIDw8IGVuZGwKKyAgICAgICAgIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF94c2RfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGZfcGhwXyA8PCAiPz4iIDw8IGVuZGw7CisgIGZfcGhwXy5jbG9zZSgpOworfQorCit2b2lkIHRfeHNkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOnNpbXBsZVR5cGUgbmFtZT1cIiIgPDwgdHR5cGVkZWYtPmdldF9uYW1lKCkgPDwgIlwiPiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGlmICh0dHlwZWRlZi0+Z2V0X3R5cGUoKS0+aXNfc3RyaW5nKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHR5cGVkZWYtPmdldF90eXBlKCkpLT5pc19zdHJpbmdfZW51bSgpKSB7CisgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT1cIiIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCAiXCI+IgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHN0cmluZz4mIHZhbHVlcyA9ICgodF9iYXNlX3R5cGUqKXR0eXBlZGVmLT5nZXRfdHlwZSgpKS0+Z2V0X3N0cmluZ19lbnVtX3ZhbHMoKTsKKyAgICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsdWVzLmJlZ2luKCk7IHZfaXRlciAhPSB2YWx1ZXMuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT1cIiIgPDwgKCp2X2l0ZXIpIDw8ICJcIiAvPiIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPC94c2Q6cmVzdHJpY3Rpb24+IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOnJlc3RyaWN0aW9uIGJhc2U9XCIiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgIlwiIC8+IgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjwveHNkOnNpbXBsZVR5cGU+IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF94c2RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgYm9vbCB4c2RfYWxsID0gdHN0cnVjdC0+Z2V0X3hzZF9hbGwoKTsKKworICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDpjb21wbGV4VHlwZSBuYW1lPVwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIj4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAoeHNkX2FsbCkgeworICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOmFsbD4iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6c2VxdWVuY2U+IiA8PCBlbmRsOworICB9CisgIGluZGVudF91cCgpOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9lbGVtZW50KHNfeHNkX3R5cGVzXywKKyAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3hzZF9hdHRycygpLAorICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfeHNkX29wdGlvbmFsKCkgfHwgeHNkX2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3hzZF9uaWxsYWJsZSgpKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGlmICh4c2RfYWxsKSB7CisgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjwveHNkOmFsbD4iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjwveHNkOnNlcXVlbmNlPiIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPC94c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF94c2RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5pbGxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsaXN0X2VsZW1lbnQpIHsKKyAgc3RyaW5nIHNtaW5PY2N1cnMgPSAob3B0aW9uYWwgfHwgbGlzdF9lbGVtZW50KSA/ICIgbWluT2NjdXJzPVwiMFwiIiA6ICIiOworICBzdHJpbmcgc21heE9jY3VycyA9IGxpc3RfZWxlbWVudCA/ICIgbWF4T2NjdXJzPVwidW5ib3VuZGVkXCIiIDogIiI7CisgIHN0cmluZyBzb3B0aW9uYWwgPSBzbWluT2NjdXJzICsgc21heE9jY3VyczsKKyAgc3RyaW5nIHNuaWxsYWJsZSA9IG5pbGxhYmxlID8gIiBuaWxsYWJsZT1cInRydWVcIiIgOiAiIjsKKworICBpZiAodHR5cGUtPmlzX3ZvaWQoKSB8fCB0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6ZWxlbWVudCBuYW1lPVwiIiA8PCBuYW1lIDw8ICJcIiIgPDwgc29wdGlvbmFsIDw8IHNuaWxsYWJsZSA8PCAiPiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAoYXR0cnMgPT0gTlVMTCAmJiB0dHlwZS0+aXNfdm9pZCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpjb21wbGV4VHlwZSAvPiIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpzZXF1ZW5jZSBtaW5PY2N1cnM9XCIwXCIgbWF4T2NjdXJzPVwidW5ib3VuZGVkXCI+IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgc3RyaW5nIHN1Ym5hbWU7CisgICAgICAgIHRfdHlwZSogc3VidHlwZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgaWYgKHN1YnR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHN1YnR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgICAgc3VibmFtZSA9IG5hbWUgKyAiX2VsdCI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3VibmFtZSA9IHR5cGVfbmFtZShzdWJ0eXBlKTsKKyAgICAgICAgfQorICAgICAgICBmX3BocF8gPDwgIiRHTE9CQUxTWyciIDw8IHByb2dyYW1fLT5nZXRfbmFtZSgpIDw8ICJfeHNkX2VsdF8iIDw8IG5hbWUgPDwgIiddID0gJyIgPDwgc3VibmFtZQorICAgICAgICAgICAgICAgPDwgIic7IiA8PCBlbmRsOworICAgICAgICBnZW5lcmF0ZV9lbGVtZW50KG91dCwgc3VibmFtZSwgc3VidHlwZSwgTlVMTCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOnNlcXVlbmNlPiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6YXR0cmlidXRlIG5hbWU9XCJsaXN0XCIgdHlwZT1cInhzZDpib29sZWFuXCIgLz4iIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpZiAoYXR0cnMgIT0gTlVMTCkgeworICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gYXR0cnMtPmdldF9tZW1iZXJzKCk7CisgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKKyAgICAgICAgZm9yIChhX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGFfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK2FfaXRlcikgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmF0dHJpYnV0ZSBuYW1lPVwiIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHR5cGU9XCIiCisgICAgICAgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqYV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIlwiIC8+IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6ZWxlbWVudD4iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaWYgKGF0dHJzID09IE5VTEwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmVsZW1lbnQgbmFtZT1cIiIgPDwgbmFtZSA8PCAiXCIiCisgICAgICAgICAgICAgICAgICA8PCAiIHR5cGU9XCIiIDw8IHR5cGVfbmFtZSh0dHlwZSkgPDwgIlwiIiA8PCBzb3B0aW9uYWwgPDwgc25pbGxhYmxlIDw8ICIgLz4iCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICAvLyBXb3csIGFsbCB0aGlzIHdvcmsgZm9yIGEgU0lNUExFIFRZUEUgd2l0aCBhdHRyaWJ1dGVzPyE/IT8hCisgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDplbGVtZW50IG5hbWU9XCIiIDw8IG5hbWUgPDwgIlwiIiA8PCBzb3B0aW9uYWwgPDwgc25pbGxhYmxlIDw8ICI+IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpjb21wbGV4Q29udGVudD4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmV4dGVuc2lvbiBiYXNlPVwiIiA8PCB0eXBlX25hbWUodHR5cGUpIDw8ICJcIj4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSBhdHRycy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKKyAgICAgIGZvciAoYV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBhX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKythX2l0ZXIpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6YXR0cmlidXRlIG5hbWU9XCIiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIgdHlwZT1cIiIKKyAgICAgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqYV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIlwiIC8+IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpleHRlbnNpb24+IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpjb21wbGV4Q29udGVudD4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6ZWxlbWVudD4iIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKKwordm9pZCB0X3hzZF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3hzZF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIi54c2QiOworICBmX3hzZF8ub3BlbihmX3hzZF9uYW1lLmNfc3RyKCkpOworCisgIHN0cmluZyBucyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJ4c2QiKTsKKyAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdCA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlX2Fubm90YXRpb25zKCJ4c2QiKTsKKyAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgdXJpID0gYW5ub3QuZmluZCgidXJpIik7CisgIGlmICh1cmkgIT0gYW5ub3QuZW5kKCkpIHsKKyAgICBucyA9IHVyaS0+c2Vjb25kOworICB9CisgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgbnMgPSAiIHRhcmdldE5hbWVzcGFjZT1cIiIgKyBucyArICJcIiB4bWxucz1cIiIgKyBucyArICJcIiAiCisgICAgICAgICArICJlbGVtZW50Rm9ybURlZmF1bHQ9XCJxdWFsaWZpZWRcIiI7CisgIH0KKworICAvLyBQcmludCB0aGUgWFNEIGhlYWRlcgorICBmX3hzZF8gPDwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgPz4iIDw8IGVuZGwKKyAgICAgICAgIDw8ICI8eHNkOnNjaGVtYSB4bWxuczp4c2Q9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiIiA8PCBucyA8PCAiPiIgPDwgZW5kbAorICAgICAgICAgPDwgeG1sX2F1dG9nZW5fY29tbWVudCgpCisgICAgICAgICA8PCBlbmRsOworCisgIC8vIFByaW50IG91dCB0aGUgdHlwZSBkZWZpbml0aW9ucworICBpbmRlbnQoZl94c2RfKSA8PCBzX3hzZF90eXBlc18uc3RyKCk7CisKKyAgLy8gS2VlcCBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBleGNlcHRpb25zIHRoYXQgbWlnaHQgZ2V0IHRocm93bgorICBtYXA8c3RyaW5nLCB0X3N0cnVjdCo+IGFsbF94Y2VwdGlvbnM7CisKKyAgLy8gTGlzdCB0aGUgZWxlbWVudHMgdGhhdCB5b3UgbWlnaHQgYWN0dWFsbHkgZ2V0CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBlbGVtbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzcG9uc2UiOworICAgIHRfdHlwZSogcmV0dXJudHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICBnZW5lcmF0ZV9lbGVtZW50KGZfeHNkXywgZWxlbW5hbWUsIHJldHVybnR5cGUpOworICAgIGZfeHNkXyA8PCBlbmRsOworCisgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGFsbF94Y2VwdGlvbnNbKCp4X2l0ZXIpLT5nZXRfbmFtZSgpXSA9ICh0X3N0cnVjdCopKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgfQorICB9CisKKyAgbWFwPHN0cmluZywgdF9zdHJ1Y3QqPjo6aXRlcmF0b3IgYXhfaXRlcjsKKyAgZm9yIChheF9pdGVyID0gYWxsX3hjZXB0aW9ucy5iZWdpbigpOyBheF9pdGVyICE9IGFsbF94Y2VwdGlvbnMuZW5kKCk7ICsrYXhfaXRlcikgeworICAgIGdlbmVyYXRlX2VsZW1lbnQoZl94c2RfLCBheF9pdGVyLT5maXJzdCwgYXhfaXRlci0+c2Vjb25kKTsKKyAgfQorCisgIC8vIENsb3NlIHRoZSBYU0QgZG9jdW1lbnQKKyAgZl94c2RfIDw8IGVuZGwgPDwgIjwveHNkOnNjaGVtYT4iIDw8IGVuZGw7CisgIGZfeHNkXy5jbG9zZSgpOworfQorCitzdHJpbmcgdF94c2RfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgeworICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4geHNkKGJhc2VfdHlwZV9uYW1lKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSkpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4geHNkKCJpbnQiKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICByZXR1cm4gImNvbnRhaW5lciI7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgWFNEIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCisgKgorICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKKyAqIEByZXR1cm4gRXhwbGljaXQgWFNEIHR5cGUsIGkuZS4geHNkOnN0cmluZworICovCitzdHJpbmcgdF94c2RfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlKSB7CisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAidm9pZCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIHJldHVybiAic3RyaW5nIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAiYm9vbGVhbiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgcmV0dXJuICJieXRlIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgcmV0dXJuICJzaG9ydCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIHJldHVybiAiaW50IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgcmV0dXJuICJsb25nIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuICJkZWNpbWFsIjsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFhTRCBiYXNlIHR5cGUgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICB9Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoeHNkLCAiWFNEIiwgIiIpCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVG9TdHJpbmdUZXN0LmphdmEgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90aHJpZnQtdF9waHBfZ2VuZXJhdG9yLm8tYTYwYTM4ZTkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9Ub1N0cmluZ1Rlc3QuamF2YQpyZW5hbWUgdG8gY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdGhyaWZ0LXRfcGhwX2dlbmVyYXRvci5vLWE2MGEzOGU5CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nbG9iYWxzLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nbG9iYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYxYzZlZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dsb2JhbHMuaApAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfR0xPQkFMU19ICisjZGVmaW5lIFRfR0xPQkFMU19ICisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8c3RhY2s+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKworLyoqCisgKiBUaGlzIG1vZHVsZSBjb250YWlucyBhbGwgdGhlIGdsb2JhbCB2YXJpYWJsZXMgKHNsYXAgb24gdGhlIHdyaXN0KSB0aGF0IGFyZQorICogc2hhcmVkIHRocm91Z2hvdXQgdGhlIHByb2dyYW0uIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdG8gZmFjaWxpdGF0ZSBzaW1wbGUKKyAqIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIHBhcnNlciBhbmQgdGhlIHJlc3Qgb2YgdGhlIHByb2dyYW0uIEJlZm9yZSBjYWxsaW5nCisgKiB5eXBhcnNlKCksIHRoZSBtYWluLmNjIHByb2dyYW0gd2lsbCBtYWtlIG5lY2Vzc2FyeSBhZGp1c3RtZW50cyB0byB0aGVzZQorICogZ2xvYmFsIHZhcmlhYmxlcyBzdWNoIHRoYXQgdGhlIHBhcnNlciBkb2VzIHRoZSByaWdodCB0aGluZyBhbmQgcHV0cyBlbnRyaWVzCisgKiBpbnRvIHRoZSByaWdodCBjb250YWluZXJzLCBldGMuCisgKgorICovCisKKy8qKgorICogSG9vcmF5IGZvciBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHR5cGVzIQorICovCisKK2NsYXNzIHRfcHJvZ3JhbTsKK2NsYXNzIHRfc2NvcGU7CitjbGFzcyB0X3R5cGU7CisKKy8qKgorICogUGFyc2luZyBtb2RlLCB0d28gcGFzc2VzIHVwIGluIHRoaXMgZ2luIHJ1bW15IQorICovCisKK2VudW0gUEFSU0VfTU9ERSB7IElOQ0xVREVTID0gMSwgUFJPR1JBTSA9IDIgfTsKKworLyoqCisgKiBTdHJpY3RuZXNzIGxldmVsCisgKi8KK2V4dGVybiBpbnQgZ19zdHJpY3Q7CisKKy8qKgorICogVGhlIG1hc3RlciBwcm9ncmFtIHBhcnNlIHRyZWUuIFRoaXMgaXMgYWNjZXNzZWQgZnJvbSB3aXRoaW4gdGhlIHBhcnNlciBjb2RlCisgKiB0byBidWlsZCB1cCB0aGUgcHJvZ3JhbSBlbGVtZW50cy4KKyAqLworZXh0ZXJuIHRfcHJvZ3JhbSogZ19wcm9ncmFtOworCisvKioKKyAqIFRoZSBzY29wZSB0aGF0IHdlIGFyZSBjdXJyZW50bHkgcGFyc2luZyBpbnRvCisgKi8KK2V4dGVybiB0X3Njb3BlKiBnX3Njb3BlOworCisvKioKKyAqIFRoZSBwYXJlbnQgc2NvcGUgdG8gYWxzbyBsb2FkIHN5bWJvbHMgaW50bworICovCitleHRlcm4gdF9zY29wZSogZ19wYXJlbnRfc2NvcGU7CisKKy8qKgorICogVGhlIHByZWZpeCBmb3IgdGhlIHBhcmVudCBzY29wZSBlbnRyaWVzCisgKi8KK2V4dGVybiBzdGQ6OnN0cmluZyBnX3BhcmVudF9wcmVmaXg7CisKKy8qKgorICogVGhlIHBhcnNpbmcgcGFzcyB0aGF0IHdlIGFyZSBvbi4gV2UgZG8gZGlmZmVyZW50IHRoaW5ncyBvbiBlYWNoIHBhc3MuCisgKi8KK2V4dGVybiBQQVJTRV9NT0RFIGdfcGFyc2VfbW9kZTsKKworLyoqCisgKiBHbG9iYWwgdGltZSBzdHJpbmcsIHVzZWQgaW4gZm9ybWF0dGluZyBlcnJvciBtZXNzYWdlcyBldGMuCisgKi8KK2V4dGVybiBjaGFyKiBnX3RpbWVfc3RyOworCisvKioKKyAqIFRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCisgKi8KK2V4dGVybiBjaGFyKiBnX2RvY3RleHQ7CisKKy8qKgorICogVGhlIGxvY2F0aW9uIG9mIHRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCisgKi8KK2V4dGVybiBpbnQgZ19kb2N0ZXh0X2xpbmVubzsKKworLyoqCisgKiBTdGF0dXMgb2YgcHJvZ3JhbSBsZXZlbCBkb2N0ZXh0IGNhbmRpZGF0ZQorICovCitlbnVtIFBST0dET0NURVhUX1NUQVRVUyB7CisgIElOVkFMSUQgPSAwLAorICBTVElMTF9DQU5ESURBVEUgPSAxLCAgIC8vIHRoZSB0ZXh0IG1heSBvciBtYXkgbm90IGJlIHRoZSBwcm9ncmFtIGRvY3RleHQKKyAgQUxSRUFEWV9QUk9DRVNTRUQgPSAyLCAvLyBkb2N0ZXh0IGhhcyBiZWVuIHVzZWQgYW5kIGlzIG5vIGxvbmdlciBhdmFpbGFibGUKKyAgQUJTT0xVVEVMWV9TVVJFID0gMywgICAvLyB0aGlzIGlzIHRoZSBwcm9ncmFtIGRvY3RleHQKKyAgTk9fUFJPR1JBTV9ET0NURVhUID0gNCAvLyB0aGVyZSBpcyBubyBwcm9ncmFtIGRvY3RleHQKK307CisKKy8qKgorICogVGhlIHByb2dyYW0gbGV2ZWwgZG9jdGV4dC4gU3RvcmVkIHNlcGFyYXRlbHkgdG8gbWFrZSBwYXJzaW5nIGVhc2llci4KKyAqLworZXh0ZXJuIGNoYXIqIGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZTsKK2V4dGVybiBpbnQgZ19wcm9ncmFtX2RvY3RleHRfbGluZW5vOworZXh0ZXJuIFBST0dET0NURVhUX1NUQVRVUyBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXM7CisKKy8qKgorICogV2hldGhlciBvciBub3QgbmVnYXRpdmUgZmllbGQga2V5cyBhcmUgYWNjZXB0ZWQuCisgKgorICogV2hlbiBhIGZpZWxkIGRvZXMgbm90IGhhdmUgYSB1c2VyLXNwZWNpZmllZCBrZXksIHRocmlmdCBhdXRvbWF0aWNhbGx5CisgKiBhc3NpZ25zIGEgbmVnYXRpdmUgdmFsdWUuICBIb3dldmVyLCB0aGlzIGlzIGZyYWdpbGUgc2luY2UgY2hhbmdlcyB0byB0aGUKKyAqIGZpbGUgbWF5IHVuaW50ZW50aW9uYWxseSBjaGFuZ2UgdGhlIGtleSBudW1iZXJpbmcsIHJlc3VsdGluZyBpbiBhIG5ldworICogcHJvdG9jb2wgdGhhdCBpcyBub3QgYmFja3dhcmRzIGNvbXBhdGlibGUuCisgKgorICogV2hlbiBnX2FsbG93X25lZ19maWVsZF9rZXlzIGlzIGVuYWJsZWQsIHVzZXJzIGNhbiBleHBsaWNpdGx5IHNwZWNpZnkKKyAqIG5lZ2F0aXZlIGtleXMuICBUaGlzIHdheSB0aGV5IGNhbiB3cml0ZSBhIC50aHJpZnQgZmlsZSB3aXRoIGV4cGxpY2l0bHkKKyAqIHNwZWNpZmllZCBrZXlzIHRoYXQgaXMgc3RpbGwgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBvbGRlciAudGhyaWZ0IGZpbGVzCisgKiB0aGF0IGRpZCBub3Qgc3BlY2lmeSBrZXkgdmFsdWVzLgorICovCitleHRlcm4gaW50IGdfYWxsb3dfbmVnX2ZpZWxkX2tleXM7CisKKy8qKgorICogV2hldGhlciBvciBub3QgNjQtYml0IGNvbnN0YW50cyB3aWxsIGdlbmVyYXRlIGEgd2FybmluZy4KKyAqCisgKiBTb21lIGxhbmd1YWdlcyBkb24ndCBzdXBwb3J0IDY0LWJpdCBjb25zdGFudHMsIGJ1dCBtYW55IGRvLCBzbyB3ZSBjYW4KKyAqIHN1cHByZXNzIHRoaXMgd2FybmluZyBmb3IgcHJvamVjdHMgdGhhdCBkb24ndCB1c2UgYW55IG5vbi02NC1iaXQtc2FmZQorICogbGFuZ3VhZ2VzLgorICovCitleHRlcm4gaW50IGdfYWxsb3dfNjRiaXRfY29uc3RzOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2xvZ2dpbmcuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9sb2dnaW5nLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjFmNWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9sb2dnaW5nLmNjCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBMb2dnaW5nIGZ1bmN0aW9ucyBjb3BpZWQgZnJvbSBtYWluLmNjIHRvIGF2b2lkIGxpbmsgZXJyb3JzIGZvciBwbHVnaW5zCisgKi8KKworI2luY2x1ZGUgInRocmlmdC9sb2dnaW5nLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dsb2JhbHMuaCIKKyNpbmNsdWRlIDxjc3RkYXJnPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjc3RkbGliPgorCisvLyBUT0RPOiBtYWtlIHBsdWdpbnMgYWNjZXB0IGxvZyBvcHRpb25zIGZyb20gbWFpbiBjb21waWxlcgoraW50IGdfZGVidWcgPSAwOworaW50IGdfd2FybiA9IDE7CitpbnQgZ192ZXJib3NlID0gMDsKKwordm9pZCBwZGVidWcoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgaWYgKGdfZGVidWcgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICB2YV9saXN0IGFyZ3M7CisgIC8vIHByaW50ZigiW1BBUlNFOiVkXSAiLCB5eWxpbmVubyk7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworICBwcmludGYoIlxuIik7Cit9CisKK3ZvaWQgcHZlcmJvc2UoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgaWYgKGdfdmVyYm9zZSA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIHZhX2xpc3QgYXJnczsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdnByaW50ZihmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7Cit9CisKK3ZvaWQgcHdhcm5pbmcoaW50IGxldmVsLCBjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICBpZiAoZ193YXJuIDwgbGV2ZWwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgdmFfbGlzdCBhcmdzOworICAvLyBwcmludGYoIltXQVJOSU5HOiVzOiVkXSAiLCBnX2N1cnBhdGguY19zdHIoKSwgeXlsaW5lbm8pOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2cHJpbnRmKGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgcHJpbnRmKCJcbiIpOworfQorCit2b2lkIGZhaWx1cmUoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgdmFfbGlzdCBhcmdzOworICAvLyBmcHJpbnRmKHN0ZGVyciwgIltGQUlMVVJFOiVzOiVkXSAiLCBnX2N1cnBhdGguY19zdHIoKSwgeXlsaW5lbm8pOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgcHJpbnRmKCJcbiIpOworICBleGl0KDEpOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbG9nZ2luZy5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbG9nZ2luZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZWZiZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9sb2dnaW5nLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfTE9HR0lOR19ICisjZGVmaW5lIFRfTE9HR0lOR19ICisKK2V4dGVybiBpbnQgZ19kZWJ1ZzsKK2V4dGVybiBpbnQgZ193YXJuOworZXh0ZXJuIGludCBnX3ZlcmJvc2U7CisKKy8qKgorICogUGFyc2UgZGVidWdnaW5nIG91dHB1dCwgdXNlZCB0byBwcmludCBoZWxwZnVsIGluZm8KKyAqLwordm9pZCBwZGVidWcoY29uc3QgY2hhciogZm10LCAuLi4pOworCisvKioKKyAqIFBhcnNlciB3YXJuaW5nCisgKi8KK3ZvaWQgcHdhcm5pbmcoaW50IGxldmVsLCBjb25zdCBjaGFyKiBmbXQsIC4uLik7CisKKy8qKgorICogUHJpbnQgdmVyYm9zZSBvdXRwdXQgbWVzc2FnZQorICovCit2b2lkIHB2ZXJib3NlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKKworLyoqCisgKiBGYWlsdXJlIQorICovCit2b2lkIGZhaWx1cmUoY29uc3QgY2hhciogZm10LCAuLi4pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L21haW4uY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYzE3MWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9tYWluLmNjCkBAIC0wLDAgKzEsMTMwOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIHRocmlmdCAtIGEgbGlnaHR3ZWlnaHQgY3Jvc3MtbGFuZ3VhZ2UgcnBjL3NlcmlhbGl6YXRpb24gdG9vbAorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBjb21waWxlciBlbmdpbmUgZm9yIFRocmlmdCwgd2hpY2ggaW52b2tlcyB0aGUKKyAqIHNjYW5uZXIvcGFyc2VyIHRvIGJ1aWxkIHRoZSB0aHJpZnQgb2JqZWN0IHRyZWUuIFRoZSBpbnRlcmZhY2UgZ2VuZXJhdGlvbgorICogY29kZSBmb3IgZWFjaCBsYW5ndWFnZSBsaXZlcyBpbiBhIGZpbGUgYnkgdGhlIGxhbmd1YWdlIG5hbWUgdW5kZXIgdGhlCisgKiBnZW5lcmF0ZS8gZm9sZGVyLCBhbmQgYWxsIHBhcnNlIHN0cnVjdHVyZXMgbGl2ZSBpbiBwYXJzZS8KKyAqCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+IC8qIGZvciBHZXRGdWxsUGF0aE5hbWUgKi8KKyNlbmRpZgorCisvLyBDYXJlZnVsOiBtdXN0IGluY2x1ZGUgZ2xvYmFscyBmaXJzdCBmb3IgZXh0ZXJuIGRlZmluaXRpb25zCisjaW5jbHVkZSAidGhyaWZ0L2NvbW1vbi5oIgorI2luY2x1ZGUgInRocmlmdC9nbG9iYWxzLmgiCisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvbWFpbi5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zY29wZS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorI2luY2x1ZGUgInRocmlmdC9hdWRpdC90X2F1ZGl0LmgiCisjaWZkZWYgVEhSSUZUX0VOQUJMRV9QTFVHSU4KKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworLyoqCisgKiBHbG9iYWwgcHJvZ3JhbSB0cmVlCisgKi8KK3RfcHJvZ3JhbSogZ19wcm9ncmFtOworCisvKioKKyAqIEdsb2JhbCBzY29wZQorICovCit0X3Njb3BlKiBnX3Njb3BlOworCisvKioKKyAqIFBhcmVudCBzY29wZSB0byBhbHNvIHBhcnNlIHR5cGVzCisgKi8KK3Rfc2NvcGUqIGdfcGFyZW50X3Njb3BlOworCisvKioKKyAqIFByZWZpeCBmb3IgcHV0dGluZyB0eXBlcyBpbiBwYXJlbnQgc2NvcGUKKyAqLworc3RyaW5nIGdfcGFyZW50X3ByZWZpeDsKKworLyoqCisgKiBQYXJzaW5nIHBhc3MKKyAqLworUEFSU0VfTU9ERSBnX3BhcnNlX21vZGU7CisKKy8qKgorICogQ3VycmVudCBkaXJlY3Rvcnkgb2YgZmlsZSBiZWluZyBwYXJzZWQKKyAqLworc3RyaW5nIGdfY3VyZGlyOworCisvKioKKyAqIEN1cnJlbnQgZmlsZSBiZWluZyBwYXJzZWQKKyAqLworc3RyaW5nIGdfY3VycGF0aDsKKworLyoqCisgKiBTZWFyY2ggcGF0aCBmb3IgaW5jbHVzaW9ucworICovCit2ZWN0b3I8c3RyaW5nPiBnX2luY2xfc2VhcmNocGF0aDsKKworLyoqCisgKiBHbG9iYWwgZGVidWcgc3RhdGUKKyAqLworaW50IGdfZGVidWcgPSAwOworCisvKioKKyAqIFN0cmljdG5lc3MgbGV2ZWwKKyAqLworaW50IGdfc3RyaWN0ID0gMTI3OworCisvKioKKyAqIFdhcm5pbmcgbGV2ZWwKKyAqLworaW50IGdfd2FybiA9IDE7CisKKy8qKgorICogVmVyYm9zZSBvdXRwdXQKKyAqLworaW50IGdfdmVyYm9zZSA9IDA7CisKKy8qKgorICogR2xvYmFsIHRpbWUgc3RyaW5nCisgKi8KK2NoYXIqIGdfdGltZV9zdHI7CisKKy8qKgorICogVGhlIGxhc3QgcGFyc2VkIGRvY3RleHQgY29tbWVudC4KKyAqLworY2hhciogZ19kb2N0ZXh0OworCisvKioKKyAqIFRoZSBGaXJzdCBkb2N0ZXh0IGNvbW1lbnQKKyAqLworY2hhciogZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlOworCisvKioKKyAqIFdoZXRoZXIgb3Igbm90IG5lZ2F0aXZlIGZpZWxkIGtleXMgYXJlIGFjY2VwdGVkLgorICovCitpbnQgZ19hbGxvd19uZWdfZmllbGRfa2V5czsKKworLyoqCisgKiBXaGV0aGVyIG9yIG5vdCA2NC1iaXQgY29uc3RhbnRzIHdpbGwgZ2VuZXJhdGUgYSB3YXJuaW5nLgorICovCitpbnQgZ19hbGxvd182NGJpdF9jb25zdHMgPSAwOworCisvKioKKyAqIEZsYWdzIHRvIGNvbnRyb2wgY29kZSBnZW5lcmF0aW9uCisgKi8KK2Jvb2wgZ2VuX3JlY3Vyc2UgPSBmYWxzZTsKKworLyoqCisgKiBGbGFncyB0byBjb250cm9sIHRocmlmdCBhdWRpdAorICovCitib29sIGdfYXVkaXQgPSBmYWxzZTsKKworLyoqCisgKiBGbGFnIHRvIGNvbnRyb2wgcmV0dXJuIHN0YXR1cworICovCitib29sIGdfcmV0dXJuX2ZhaWx1cmUgPSBmYWxzZTsKK2Jvb2wgZ19hdWRpdF9mYXRhbCA9IHRydWU7Citib29sIGdfZ2VuZXJhdG9yX2ZhaWx1cmUgPSBmYWxzZTsKKworLyoqCisgKiBXaW4zMiBkb2Vzbid0IGhhdmUgcmVhbHBhdGgsIHNvIHVzZSBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbiBpbiB0aGF0IGNhc2UsCisgKiBvdGhlcndpc2UgdGhpcyBqdXN0IGNhbGxzIHRocm91Z2ggdG8gcmVhbHBhdGgKKyAqLworY2hhciogc2FmZXJlYWxwYXRoKGNvbnN0IGNoYXIqIHBhdGgsIGNoYXIqIHJlc29sdmVkX3BhdGgpIHsKKyNpZmRlZiBfV0lOMzIKKyAgY2hhciBidWZbTUFYX1BBVEhdOworICBjaGFyKiBiYXNlbmFtZTsKKyAgRFdPUkQgbGVuID0gR2V0RnVsbFBhdGhOYW1lKHBhdGgsIE1BWF9QQVRILCBidWYsICZiYXNlbmFtZSk7CisgIGlmIChsZW4gPT0gMCB8fCBsZW4gPiBNQVhfUEFUSCAtIDEpIHsKKyAgICBzdHJjcHkocmVzb2x2ZWRfcGF0aCwgcGF0aCk7CisgIH0gZWxzZSB7CisgICAgc3RyY3B5KHJlc29sdmVkX3BhdGgsIGJ1Zik7CisgIH0KKworICAvLyBSZXBsYWNlIGJhY2tzbGFzaGVzIHdpdGggZm9yd2FyZCBzbGFzaGVzIHNvIHRoZQorICAvLyByZXN0IG9mIHRoZSBjb2RlIGJlaGF2ZXMgY29ycmVjdGx5LgorICBzaXplX3QgcmVzb2x2ZWRfbGVuID0gc3RybGVuKHJlc29sdmVkX3BhdGgpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc29sdmVkX2xlbjsgaSsrKSB7CisgICAgaWYgKHJlc29sdmVkX3BhdGhbaV0gPT0gJ1xcJykgeworICAgICAgcmVzb2x2ZWRfcGF0aFtpXSA9ICcvJzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc29sdmVkX3BhdGg7CisjZWxzZQorICByZXR1cm4gcmVhbHBhdGgocGF0aCwgcmVzb2x2ZWRfcGF0aCk7CisjZW5kaWYKK30KKworYm9vbCBjaGVja19pc19kaXJlY3RvcnkoY29uc3QgY2hhciogZGlyX25hbWUpIHsKKyNpZmRlZiBfV0lOMzIKKyAgRFdPUkQgYXR0cmlidXRlcyA9IDo6R2V0RmlsZUF0dHJpYnV0ZXNBKGRpcl9uYW1lKTsKKyAgaWYgKGF0dHJpYnV0ZXMgPT0gSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJPdXRwdXQgZGlyZWN0b3J5ICVzIGlzIHVudXNhYmxlOiBHZXRMYXN0RXJyb3IoKSA9ICVsZFxuIiwKKyAgICAgICAgICAgIGRpcl9uYW1lLAorICAgICAgICAgICAgR2V0TGFzdEVycm9yKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoKGF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpICE9IEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiT3V0cHV0IGRpcmVjdG9yeSAlcyBleGlzdHMgYnV0IGlzIG5vdCBhIGRpcmVjdG9yeVxuIiwgZGlyX25hbWUpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKKyNlbHNlCisgIHN0cnVjdCBzdGF0IHNiOworICBpZiAoc3RhdChkaXJfbmFtZSwgJnNiKSA8IDApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk91dHB1dCBkaXJlY3RvcnkgJXMgaXMgdW51c2FibGU6ICVzXG4iLCBkaXJfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFTX0lTRElSKHNiLnN0X21vZGUpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJPdXRwdXQgZGlyZWN0b3J5ICVzIGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5XG4iLCBkaXJfbmFtZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworI2VuZGlmCit9CisKKy8qKgorICogUmVwb3J0IGFuIGVycm9yIHRvIHRoZSB1c2VyLiBUaGlzIGlzIGNhbGxlZCB5eWVycm9yIGZvciBoaXN0b3JpY2FsCisgKiByZWFzb25zIChsZXggYW5kIHlhY2MgZXhwZWN0IHRoZSBlcnJvciByZXBvcnRpbmcgcm91dGluZSB0byBiZSBjYWxsZWQKKyAqIHRoaXMpLiBDYWxsIHRoaXMgZnVuY3Rpb24gdG8gcmVwb3J0IGFueSBlcnJvcnMgdG8gdGhlIHVzZXIuCisgKiB5eWVycm9yIHRha2VzIHByaW50ZiBzdHlsZSBhcmd1bWVudHMuCisgKgorICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKKyAqLwordm9pZCB5eWVycm9yKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgZnByaW50ZihzdGRlcnIsICJbRVJST1I6JXM6JWRdIChsYXN0IHRva2VuIHdhcyAnJXMnKVxuIiwgZ19jdXJwYXRoLmNfc3RyKCksIHl5bGluZW5vLCB5eXRleHQpOworCisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworCisgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKK30KKworLyoqCisgKiBQcmludHMgYSBkZWJ1ZyBtZXNzYWdlIGZyb20gdGhlIHBhcnNlci4KKyAqCisgKiBAcGFyYW0gZm10IEMgZm9ybWF0IHN0cmluZyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGFyZ3VtZW50cworICovCit2b2lkIHBkZWJ1Zyhjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICBpZiAoZ19kZWJ1ZyA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIHZhX2xpc3QgYXJnczsKKyAgcHJpbnRmKCJbUEFSU0U6JWRdICIsIHl5bGluZW5vKTsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdnByaW50ZihmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisgIHByaW50ZigiXG4iKTsKK30KKworLyoqCisgKiBQcmludHMgYSB2ZXJib3NlIG91dHB1dCBtb2RlIG1lc3NhZ2UKKyAqCisgKiBAcGFyYW0gZm10IEMgZm9ybWF0IHN0cmluZyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGFyZ3VtZW50cworICovCit2b2lkIHB2ZXJib3NlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIGlmIChnX3ZlcmJvc2UgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICB2YV9saXN0IGFyZ3M7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworfQorCisvKioKKyAqIFByaW50cyBhIHdhcm5pbmcgbWVzc2FnZQorICoKKyAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCisgKi8KK3ZvaWQgcHdhcm5pbmcoaW50IGxldmVsLCBjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICBpZiAoZ193YXJuIDwgbGV2ZWwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgdmFfbGlzdCBhcmdzOworICBwcmludGYoIltXQVJOSU5HOiVzOiVkXSAiLCBnX2N1cnBhdGguY19zdHIoKSwgeXlsaW5lbm8pOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2cHJpbnRmKGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgcHJpbnRmKCJcbiIpOworfQorCisvKioKKyAqIFByaW50cyBhIGZhaWx1cmUgbWVzc2FnZSBhbmQgZXhpdHMKKyAqCisgKiBAcGFyYW0gZm10IEMgZm9ybWF0IHN0cmluZyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGFyZ3VtZW50cworICovCit2b2lkIGZhaWx1cmUoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgdmFfbGlzdCBhcmdzOworICBmcHJpbnRmKHN0ZGVyciwgIltGQUlMVVJFOiVzOiVkXSAiLCBnX2N1cnBhdGguY19zdHIoKSwgeXlsaW5lbm8pOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgcHJpbnRmKCJcbiIpOworICBleGl0KDEpOworfQorCisvKioKKyAqIENvbnZlcnRzIGEgc3RyaW5nIGZpbGVuYW1lIGludG8gYSB0aHJpZnQgcHJvZ3JhbSBuYW1lCisgKi8KK3N0cmluZyBwcm9ncmFtX25hbWUoc3RyaW5nIGZpbGVuYW1lKSB7CisgIHN0cmluZzo6c2l6ZV90eXBlIHNsYXNoID0gZmlsZW5hbWUucmZpbmQoIi8iKTsKKyAgaWYgKHNsYXNoICE9IHN0cmluZzo6bnBvcykgeworICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyKHNsYXNoICsgMSk7CisgIH0KKyAgc3RyaW5nOjpzaXplX3R5cGUgZG90ID0gZmlsZW5hbWUucmZpbmQoIi4iKTsKKyAgaWYgKGRvdCAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cigwLCBkb3QpOworICB9CisgIHJldHVybiBmaWxlbmFtZTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBkaXJlY3RvcnkgcGF0aCBvZiBhIGZpbGVuYW1lCisgKi8KK3N0cmluZyBkaXJlY3RvcnlfbmFtZShzdHJpbmcgZmlsZW5hbWUpIHsKKyAgc3RyaW5nOjpzaXplX3R5cGUgc2xhc2ggPSBmaWxlbmFtZS5yZmluZCgiLyIpOworICAvLyBObyBzbGFzaCwganVzdCB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5CisgIGlmIChzbGFzaCA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICByZXR1cm4gIi4iOworICB9CisgIHJldHVybiBmaWxlbmFtZS5zdWJzdHIoMCwgc2xhc2gpOworfQorCisvKioKKyAqIEZpbmRzIHRoZSBhcHByb3ByaWF0ZSBmaWxlIHBhdGggZm9yIHRoZSBnaXZlbiBmaWxlbmFtZQorICovCitzdHJpbmcgaW5jbHVkZV9maWxlKHN0cmluZyBmaWxlbmFtZSkgeworICAvLyBBYnNvbHV0ZSBwYXRoPyBKdXN0IHRyeSB0aGF0CisgIGlmIChmaWxlbmFtZVswXSA9PSAnLycpIHsKKyAgICAvLyBSZWFscGF0aCEKKyAgICBjaGFyIHJwW1RIUklGVF9QQVRIX01BWF07CisgICAgLy8gY3BwY2hlY2stc3VwcHJlc3MgdW5pbml0dmFyCisgICAgaWYgKHNhZmVyZWFscGF0aChmaWxlbmFtZS5jX3N0cigpLCBycCkgPT0gTlVMTCkgeworICAgICAgcHdhcm5pbmcoMCwgIkNhbm5vdCBvcGVuIGluY2x1ZGUgZmlsZSAlc1xuIiwgZmlsZW5hbWUuY19zdHIoKSk7CisgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKyAgICB9CisKKyAgICAvLyBTdGF0IHRoaXMgZmlsZQorICAgIHN0cnVjdCBzdGF0IGZpbmZvOworICAgIGlmIChzdGF0KHJwLCAmZmluZm8pID09IDApIHsKKyAgICAgIHJldHVybiBycDsKKyAgICB9CisgIH0gZWxzZSB7IC8vIHJlbGF0aXZlIHBhdGgsIHN0YXJ0IHNlYXJjaGluZworICAgIC8vIG5ldyBzZWFyY2ggcGF0aCB3aXRoIGN1cnJlbnQgZGlyIGdsb2JhbAorICAgIHZlY3RvcjxzdHJpbmc+IHNwID0gZ19pbmNsX3NlYXJjaHBhdGg7CisgICAgc3AuaW5zZXJ0KHNwLmJlZ2luKCksIGdfY3VyZGlyKTsKKworICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBwYXRocworICAgIHZlY3RvcjxzdHJpbmc+OjppdGVyYXRvciBpdDsKKyAgICBmb3IgKGl0ID0gc3AuYmVnaW4oKTsgaXQgIT0gc3AuZW5kKCk7IGl0KyspIHsKKyAgICAgIHN0cmluZyBzZmlsZW5hbWUgPSAqKGl0KSArICIvIiArIGZpbGVuYW1lOworCisgICAgICAvLyBSZWFscGF0aCEKKyAgICAgIGNoYXIgcnBbVEhSSUZUX1BBVEhfTUFYXTsKKyAgICAgIC8vIGNwcGNoZWNrLXN1cHByZXNzIHVuaW5pdHZhcgorICAgICAgaWYgKHNhZmVyZWFscGF0aChzZmlsZW5hbWUuY19zdHIoKSwgcnApID09IE5VTEwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIFN0YXQgdGhpcyBmaWxlcworICAgICAgc3RydWN0IHN0YXQgZmluZm87CisgICAgICBpZiAoc3RhdChycCwgJmZpbmZvKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBycDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBVaCBvaAorICBwd2FybmluZygwLCAiQ291bGQgbm90IGZpbmQgaW5jbHVkZSBmaWxlICVzXG4iLCBmaWxlbmFtZS5jX3N0cigpKTsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7Cit9CisKKy8qKgorICogQ2xlYXJzIGFueSBwcmV2aW91c2x5IHN0b3JlZCBkb2N0ZXh0IHN0cmluZy4KKyAqIEFsc28gcHJpbnRzIGEgd2FybmluZyBpZiB3ZSBhcmUgZGlzY2FyZGluZyBpbmZvcm1hdGlvbi4KKyAqLwordm9pZCBjbGVhcl9kb2N0ZXh0KCkgeworICBpZiAoZ19kb2N0ZXh0ICE9IE5VTEwpIHsKKyAgICBwd2FybmluZygyLCAiVW5jYXB0dXJlZCBkb2N0ZXh0IGF0IG9uIGxpbmUgJWQuIiwgZ19kb2N0ZXh0X2xpbmVubyk7CisgIH0KKyAgZnJlZShnX2RvY3RleHQpOworICBnX2RvY3RleHQgPSBOVUxMOworfQorCisvKioKKyAqIFJlc2V0IHByb2dyYW0gZG9jdGV4dCBpbmZvcm1hdGlvbiBhZnRlciBwcm9jZXNzaW5nIGEgZmlsZQorICovCit2b2lkIHJlc2V0X3Byb2dyYW1fZG9jdGV4dF9pbmZvKCkgeworICBpZiAoZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlICE9IE5VTEwpIHsKKyAgICBmcmVlKGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSk7CisgICAgZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlID0gTlVMTDsKKyAgfQorICBnX3Byb2dyYW1fZG9jdGV4dF9saW5lbm8gPSAwOworICBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBJTlZBTElEOworICBwZGVidWcoIiVzIiwgInByb2dyYW0gZG9jdGV4dCBzZXQgdG8gSU5WQUxJRCIpOworfQorCisvKioKKyAqIFdlIGFyZSBzdXJlIHRoZSBwcm9ncmFtIGRvY3RleHQgY2FuZGlkYXRlIGlzIHJlYWxseSB0aGUgcHJvZ3JhbSBkb2N0ZXh0LgorICovCit2b2lkIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCkgeworICBpZiAoKGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSAhPSBOVUxMKSAmJiAoZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID09IFNUSUxMX0NBTkRJREFURSkpIHsKKyAgICBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBBQlNPTFVURUxZX1NVUkU7CisgICAgcGRlYnVnKCIlcyIsICJwcm9ncmFtIGRvY3RleHQgc2V0IHRvIEFCU09MVVRFTFlfU1VSRSIpOworICB9IGVsc2UgeworICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IE5PX1BST0dSQU1fRE9DVEVYVDsKKyAgICBwZGVidWcoIiVzIiwgInByb2dyYW0gZG9jdGV4dCBzZXQgdG8gTk9fUFJPR1JBTV9ET0NURVhUIik7CisgIH0KK30KKworLyoqCisgKiBDbGVhbnMgdXAgdGV4dCBjb21tb25seSBmb3VuZCBpbiBkb3h5Z2VuLWxpa2UgY29tbWVudHMKKyAqCisgKiBXYXJuaW5nOiBpZiB5b3UgbWl4IHRhYnMgYW5kIHNwYWNlcyBpbiBhIG5vbi11bmlmb3JtIHdheSwKKyAqIHlvdSB3aWxsIGdldCB3aGF0IHlvdSBkZXNlcnZlLgorICovCitjaGFyKiBjbGVhbl91cF9kb2N0ZXh0KGNoYXIqIGRvY3RleHQpIHsKKyAgLy8gQ29udmVydCB0byBDKysgc3RyaW5nLCBhbmQgcmVtb3ZlIFdpbmRvd3MncyBjYXJyaWFnZSByZXR1cm5zLgorICBzdHJpbmcgZG9jc3RyaW5nID0gZG9jdGV4dDsKKyAgZG9jc3RyaW5nLmVyYXNlKHJlbW92ZShkb2NzdHJpbmcuYmVnaW4oKSwgZG9jc3RyaW5nLmVuZCgpLCAnXHInKSwgZG9jc3RyaW5nLmVuZCgpKTsKKworICAvLyBTZXBhcmF0ZSBpbnRvIGxpbmVzLgorICB2ZWN0b3I8c3RyaW5nPiBsaW5lczsKKyAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gc3RyaW5nOjpucG9zOworICBzdHJpbmc6OnNpemVfdHlwZSBsYXN0OworICB3aGlsZSAodHJ1ZSkgeworICAgIGxhc3QgPSAocG9zID09IHN0cmluZzo6bnBvcykgPyAwIDogcG9zICsgMTsKKyAgICBwb3MgPSBkb2NzdHJpbmcuZmluZCgnXG4nLCBsYXN0KTsKKyAgICBpZiAocG9zID09IHN0cmluZzo6bnBvcykgeworICAgICAgLy8gRmlyc3QgYml0IG9mIGNsZWFuaW5nLiAgSWYgdGhlIGxhc3QgbGluZSBpcyBvbmx5IHdoaXRlc3BhY2UsIGRyb3AgaXQuCisgICAgICBzdHJpbmc6OnNpemVfdHlwZSBub253aGl0ZSA9IGRvY3N0cmluZy5maW5kX2ZpcnN0X25vdF9vZigiIFx0IiwgbGFzdCk7CisgICAgICBpZiAobm9ud2hpdGUgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgIGxpbmVzLnB1c2hfYmFjayhkb2NzdHJpbmcuc3Vic3RyKGxhc3QpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBsaW5lcy5wdXNoX2JhY2soZG9jc3RyaW5nLnN1YnN0cihsYXN0LCBwb3MgLSBsYXN0KSk7CisgIH0KKworICAvLyBBIHZlcnkgcHJvZm91bmQgZG9jc3RyaW5nLgorICBpZiAobGluZXMuZW1wdHkoKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLy8gQ2xlYXIgbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGZpcnN0IGxpbmUuCisgIHBvcyA9IGxpbmVzLmZyb250KCkuZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIpOworICBsaW5lcy5mcm9udCgpLmVyYXNlKDAsIHBvcyk7CisKKyAgLy8gSWYgZXZlcnkgbm9uYmxhbmsgbGluZSBhZnRlciB0aGUgZmlyc3QgaGFzIHRoZSBzYW1lIG51bWJlciBvZiBzcGFjZXMvdGFicywKKyAgLy8gdGhlbiBhIHN0YXIsIHJlbW92ZSB0aGVtLgorICBib29sIGhhdmVfcHJlZml4ID0gdHJ1ZTsKKyAgYm9vbCBmb3VuZF9wcmVmaXggPSBmYWxzZTsKKyAgc3RyaW5nOjpzaXplX3R5cGUgcHJlZml4X2xlbiA9IDA7CisgIHZlY3RvcjxzdHJpbmc+OjppdGVyYXRvciBsX2l0ZXI7CisgIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKSArIDE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKKyAgICBpZiAobF9pdGVyLT5lbXB0eSgpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBwb3MgPSBsX2l0ZXItPmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiKTsKKyAgICBpZiAoIWZvdW5kX3ByZWZpeCkgeworICAgICAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgaWYgKGxfaXRlci0+YXQocG9zKSA9PSAnKicpIHsKKyAgICAgICAgICBmb3VuZF9wcmVmaXggPSB0cnVlOworICAgICAgICAgIHByZWZpeF9sZW4gPSBwb3M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaGF2ZV9wcmVmaXggPSBmYWxzZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2hpdGVzcGFjZS1vbmx5IGxpbmUuICBUcnVuY2F0ZSBpdC4KKyAgICAgICAgbF9pdGVyLT5jbGVhcigpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAobF9pdGVyLT5zaXplKCkgPiBwb3MgJiYgbF9pdGVyLT5hdChwb3MpID09ICcqJyAmJiBwb3MgPT0gcHJlZml4X2xlbikgeworICAgICAgLy8gQnVzaW5lc3MgYXMgdXN1YWwuCisgICAgfSBlbHNlIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAvLyBXaGl0ZXNwYWNlLW9ubHkgbGluZS4gIExldCdzIHRydW5jYXRlIGl0IGZvciB0aGVtLgorICAgICAgbF9pdGVyLT5jbGVhcigpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBUaGUgcGF0dGVybiBoYXMgYmVlbiBicm9rZW4uCisgICAgICBoYXZlX3ByZWZpeCA9IGZhbHNlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gSWYgb3VyIHByZWZpeCBzdXJ2aXZlZCwgZGVsZXRlIGl0IGZyb20gZXZlcnkgbGluZS4KKyAgaWYgKGhhdmVfcHJlZml4KSB7CisgICAgLy8gR2V0IHRoZSBzdGFyIHRvby4KKyAgICBwcmVmaXhfbGVuKys7CisgICAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpICsgMTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgeworICAgICAgbF9pdGVyLT5lcmFzZSgwLCBwcmVmaXhfbGVuKTsKKyAgICB9CisgIH0KKworICAvLyBOb3cgZGVsZXRlIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSBlYWNoIGxpbmUuCisgIHByZWZpeF9sZW4gPSBzdHJpbmc6Om5wb3M7CisgIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKSArIDE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKKyAgICBpZiAobF9pdGVyLT5lbXB0eSgpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgcG9zID0gbF9pdGVyLT5maW5kX2ZpcnN0X25vdF9vZigiIFx0Iik7CisgICAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MgJiYgKHByZWZpeF9sZW4gPT0gc3RyaW5nOjpucG9zIHx8IHBvcyA8IHByZWZpeF9sZW4pKSB7CisgICAgICBwcmVmaXhfbGVuID0gcG9zOworICAgIH0KKyAgfQorCisgIC8vIElmIG91ciBwcmVmaXggc3Vydml2ZWQsIGRlbGV0ZSBpdCBmcm9tIGV2ZXJ5IGxpbmUuCisgIGlmIChwcmVmaXhfbGVuICE9IHN0cmluZzo6bnBvcykgeworICAgIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKSArIDE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKKyAgICAgIGxfaXRlci0+ZXJhc2UoMCwgcHJlZml4X2xlbik7CisgICAgfQorICB9CisKKyAgLy8gUmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSBldmVyeSBsaW5lLgorICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCk7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKKyAgICBwb3MgPSBsX2l0ZXItPmZpbmRfbGFzdF9ub3Rfb2YoIiBcdCIpOworICAgIGlmIChwb3MgIT0gc3RyaW5nOjpucG9zICYmIHBvcyAhPSBsX2l0ZXItPmxlbmd0aCgpIC0gMSkgeworICAgICAgbF9pdGVyLT5lcmFzZShwb3MgKyAxKTsKKyAgICB9CisgIH0KKworICAvLyBJZiB0aGUgZmlyc3QgbGluZSBpcyBlbXB0eSwgcmVtb3ZlIGl0LgorICAvLyBEb24ndCBkbyB0aGlzIGVhcmxpZXIgYmVjYXVzZSBhIGxvdCBvZiBzdGVwcyBza2lwIHRoZSBmaXJzdCBsaW5lLgorICBpZiAobGluZXMuZnJvbnQoKS5lbXB0eSgpKSB7CisgICAgbGluZXMuZXJhc2UobGluZXMuYmVnaW4oKSk7CisgIH0KKworICAvLyBOb3cgcmVqb2luIHRoZSBsaW5lcyBhbmQgY29weSB0aGVtIGJhY2sgaW50byBkb2N0ZXh0LgorICBkb2NzdHJpbmcuY2xlYXIoKTsKKyAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7CisgICAgZG9jc3RyaW5nICs9ICpsX2l0ZXI7CisgICAgZG9jc3RyaW5nICs9ICdcbic7CisgIH0KKworICAvLyBhc3NlcnQoZG9jc3RyaW5nLmxlbmd0aCgpIDw9IHN0cmxlbihkb2N0ZXh0KSk7ICBtYXkgaGFwcGVuLCBzZWUgVEhSSUZULTE3NTUKKyAgaWYgKGRvY3N0cmluZy5sZW5ndGgoKSA8PSBzdHJsZW4oZG9jdGV4dCkpIHsKKyAgICBzdHJjcHkoZG9jdGV4dCwgZG9jc3RyaW5nLmNfc3RyKCkpOworICB9IGVsc2UgeworICAgIGZyZWUoZG9jdGV4dCk7IC8vIHRvbyBzaG9ydAorICAgIGRvY3RleHQgPSBzdHJkdXAoZG9jc3RyaW5nLmNfc3RyKCkpOworICB9CisgIHJldHVybiBkb2N0ZXh0OworfQorCisvKiogU2V0IHRvIHRydWUgdG8gZGVidWcgZG9jc3RyaW5nIHBhcnNpbmcgKi8KK3N0YXRpYyBib29sIGR1bXBfZG9jcyA9IGZhbHNlOworCisvKioKKyAqIER1bXBzIGRvY3N0cmluZ3MgdG8gc3Rkb3V0CisgKiBPbmx5IHdvcmtzIGZvciB0b3AtbGV2ZWwgZGVmaW5pdGlvbnMgYW5kIHRoZSB3aG9sZSBwcm9ncmFtIGRvYworICogKGkuZS4sIG5vdCBlbnVtIGNvbnN0YW50cywgc3RydWN0IGZpZWxkcywgb3IgZnVuY3Rpb25zLgorICovCit2b2lkIGR1bXBfZG9jc3RyaW5ncyh0X3Byb2dyYW0qIHByb2dyYW0pIHsKKyAgc3RyaW5nIHByb2dkb2MgPSBwcm9ncmFtLT5nZXRfZG9jKCk7CisgIGlmICghcHJvZ2RvYy5lbXB0eSgpKSB7CisgICAgcHJpbnRmKCJXaG9sZSBwcm9ncmFtIGRvYzpcbiVzXG4iLCBwcm9nZG9jLmNfc3RyKCkpOworICB9CisgIGNvbnN0IHZlY3Rvcjx0X3R5cGVkZWYqPiYgdHlwZWRlZnMgPSBwcm9ncmFtLT5nZXRfdHlwZWRlZnMoKTsKKyAgdmVjdG9yPHRfdHlwZWRlZio+Ojpjb25zdF9pdGVyYXRvciB0X2l0ZXI7CisgIGZvciAodF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RfaXRlcikgeworICAgIHRfdHlwZWRlZiogdGQgPSAqdF9pdGVyOworICAgIGlmICh0ZC0+aGFzX2RvYygpKSB7CisgICAgICBwcmludGYoInR5cGVkZWYgJXM6XG4lc1xuIiwgdGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdGQtPmdldF9kb2MoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KKyAgY29uc3QgdmVjdG9yPHRfZW51bSo+JiBlbnVtcyA9IHByb2dyYW0tPmdldF9lbnVtcygpOworICB2ZWN0b3I8dF9lbnVtKj46OmNvbnN0X2l0ZXJhdG9yIGVfaXRlcjsKKyAgZm9yIChlX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZV9pdGVyKSB7CisgICAgdF9lbnVtKiBlbiA9ICplX2l0ZXI7CisgICAgaWYgKGVuLT5oYXNfZG9jKCkpIHsKKyAgICAgIHByaW50ZigiZW51bSAlczpcbiVzXG4iLCBlbi0+Z2V0X25hbWUoKS5jX3N0cigpLCBlbi0+Z2V0X2RvYygpLmNfc3RyKCkpOworICAgIH0KKyAgfQorICBjb25zdCB2ZWN0b3I8dF9jb25zdCo+JiBjb25zdHMgPSBwcm9ncmFtLT5nZXRfY29uc3RzKCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICB0X2NvbnN0KiBjbyA9ICpjX2l0ZXI7CisgICAgaWYgKGNvLT5oYXNfZG9jKCkpIHsKKyAgICAgIHByaW50ZigiY29uc3QgJXM6XG4lc1xuIiwgY28tPmdldF9uYW1lKCkuY19zdHIoKSwgY28tPmdldF9kb2MoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KKyAgY29uc3QgdmVjdG9yPHRfc3RydWN0Kj4mIHN0cnVjdHMgPSBwcm9ncmFtLT5nZXRfc3RydWN0cygpOworICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOworICBmb3IgKHNfaXRlciA9IHN0cnVjdHMuYmVnaW4oKTsgc19pdGVyICE9IHN0cnVjdHMuZW5kKCk7ICsrc19pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHN0ID0gKnNfaXRlcjsKKyAgICBpZiAoc3QtPmhhc19kb2MoKSkgeworICAgICAgcHJpbnRmKCJzdHJ1Y3QgJXM6XG4lc1xuIiwgc3QtPmdldF9uYW1lKCkuY19zdHIoKSwgc3QtPmdldF9kb2MoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KKyAgY29uc3QgdmVjdG9yPHRfc3RydWN0Kj4mIHhjZXB0aW9ucyA9IHByb2dyYW0tPmdldF94Y2VwdGlvbnMoKTsKKyAgdmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogeG4gPSAqeF9pdGVyOworICAgIGlmICh4bi0+aGFzX2RvYygpKSB7CisgICAgICBwcmludGYoInhjZXB0aW9uICVzOlxuJXNcbiIsIHhuLT5nZXRfbmFtZSgpLmNfc3RyKCksIHhuLT5nZXRfZG9jKCkuY19zdHIoKSk7CisgICAgfQorICB9CisgIGNvbnN0IHZlY3Rvcjx0X3NlcnZpY2UqPiYgc2VydmljZXMgPSBwcm9ncmFtLT5nZXRfc2VydmljZXMoKTsKKyAgdmVjdG9yPHRfc2VydmljZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgIGZvciAodl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3ZfaXRlcikgeworICAgIHRfc2VydmljZSogc3YgPSAqdl9pdGVyOworICAgIGlmIChzdi0+aGFzX2RvYygpKSB7CisgICAgICBwcmludGYoInNlcnZpY2UgJXM6XG4lc1xuIiwgc3YtPmdldF9uYW1lKCkuY19zdHIoKSwgc3YtPmdldF9kb2MoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBFbWl0cyBhIHdhcm5pbmcgb24gbGlzdDxieXRlPiwgYmluYXJ5IHR5cGUgaXMgdHlwaWNhbGx5IGEgbXVjaCBiZXR0ZXIgY2hvaWNlLgorICovCit2b2lkIGNoZWNrX2Zvcl9saXN0X29mX2J5dGVzKHRfdHlwZSogbGlzdF9lbGVtX3R5cGUpIHsKKyAgaWYgKChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgJiYgKGxpc3RfZWxlbV90eXBlICE9IE5VTEwpICYmIGxpc3RfZWxlbV90eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZSA9ICh0X2Jhc2VfdHlwZSopbGlzdF9lbGVtX3R5cGU7CisgICAgaWYgKHRiYXNlLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX0k4KSB7CisgICAgICBwd2FybmluZygxLCAiQ29uc2lkZXIgdXNpbmcgdGhlIG1vcmUgZWZmaWNpZW50IFwiYmluYXJ5XCIgdHlwZSBpbnN0ZWFkIG9mIFwibGlzdDxieXRlPlwiLiIpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgYm9vbCBnX2J5dGVfd2FybmluZ19lbWl0dGVkID0gZmFsc2U7CisKKy8qKgorICogRW1pdHMgYSBvbmUtdGltZSB3YXJuaW5nIG9uIGJ5dGUgdHlwZSwgcHJvbW90aW5nIHRoZSBuZXcgaTggdHlwZSBpbnN0ZWFkCisgKi8KK3ZvaWQgZW1pdF9ieXRlX3R5cGVfd2FybmluZygpIHsKKyAgaWYgKCFnX2J5dGVfd2FybmluZ19lbWl0dGVkKSB7CisgICAgcHdhcm5pbmcoMSwKKyAgICAgICAgICAgICAiVGhlIFwiYnl0ZVwiIHR5cGUgaXMgYSBjb21wYXRpYmlsaXR5IGFsaWFzIGZvciBcImk4XCIuIFVzZSBcImk4XCIgdG8gZW1waGFzaXplIHRoZSAiCisgICAgICAgICAgICAgInNpZ25lZG5lc3Mgb2YgdGhpcyB0eXBlLlxuIik7CisgICAgZ19ieXRlX3dhcm5pbmdfZW1pdHRlZCA9IHRydWU7CisgIH0KK30KKworLyoqCisgKiBQcmludHMgZGVwcmVjYXRpb24gbm90aWNlIGZvciBvbGQgTlMgZGVjbGFyYXRpb25zIHRoYXQgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQKKyAqIElmIG5ld19mb3JtIGlzIE5VTEwsIG9sZF9mb3JtIGlzIGFzc3VtZWQgdG8gYmUgYSBsYW5ndWFnZSBpZGVudGlmaWVyLCBzdWNoIGFzICJjcHAiCisgKiBJZiBuZXdfZm9ybSBpcyBub3QgTlVMTCwgYm90aCBhcmd1bWVudHMgYXJlIHVzZWQgZXhhY3RseSBhcyBnaXZlbgorICovCit2b2lkIGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKGNvbnN0IGNoYXIqIG9sZF9mb3JtLCBjb25zdCBjaGFyKiBuZXdfZm9ybSkgeworICBjb25zdCBjaGFyKiByZW1haW5kZXIgPSAiIjsKKyAgaWYoIG5ld19mb3JtID09IE5VTEwpIHsKKyAgICBuZXdfZm9ybSA9IG9sZF9mb3JtOworICAgIHJlbWFpbmRlciA9ICJfbmFtZXNwYWNlIjsKKyAgfQorICBmYWlsdXJlKCJVbnN1cHBvcnRlZCBkZWNsYXJhdGlvbiAnJXMlcycuIFVzZSAnbmFtZXNwYWNlICVzJyBpbnN0ZWFkLiIsIG9sZF9mb3JtLCByZW1haW5kZXIsIG5ld19mb3JtKTsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZlcnNpb24gbnVtYmVyCisgKi8KK3ZvaWQgdmVyc2lvbigpIHsKKyAgcHJpbnRmKCJUaHJpZnQgdmVyc2lvbiAlc1xuIiwgVEhSSUZUX1ZFUlNJT04pOworfQorCisvKioKKyAqIERpc3BsYXkgdGhlIHVzYWdlIG1lc3NhZ2UgYW5kIHRoZW4gZXhpdCB3aXRoIGFuIGVycm9yIGNvZGUuCisgKi8KK3ZvaWQgdXNhZ2UoKSB7CisgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IHRocmlmdCBbb3B0aW9uc10gZmlsZVxuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJVc2UgdGhyaWZ0IC1oZWxwIGZvciBhIGxpc3Qgb2Ygb3B0aW9uc1xuIik7CisgIGV4aXQoMSk7Cit9CisKKy8qKgorICogRGlwbGF5cyB0aGUgaGVscCBtZXNzYWdlIGFuZCB0aGVuIGV4aXRzIHdpdGggYW4gZXJyb3IgY29kZS4KKyAqLwordm9pZCBoZWxwKCkgeworICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiB0aHJpZnQgW29wdGlvbnNdIGZpbGVcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIk9wdGlvbnM6XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC12ZXJzaW9uICAgIFByaW50IHRoZSBjb21waWxlciB2ZXJzaW9uXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1vIGRpciAgICAgIFNldCB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgZ2VuLSogcGFja2FnZXNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgIChkZWZhdWx0OiBjdXJyZW50IGRpcmVjdG9yeSlcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLW91dCBkaXIgICAgU2V0IHRoZSBvdXB1dCBsb2NhdGlvbiBmb3IgZ2VuZXJhdGVkIGZpbGVzLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgKG5vIGdlbi0qIGZvbGRlciB3aWxsIGJlIGNyZWF0ZWQpXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1JIGRpciAgICAgIEFkZCBhIGRpcmVjdG9yeSB0byB0aGUgbGlzdCBvZiBkaXJlY3Rvcmllc1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIHNlYXJjaGVkIGZvciBpbmNsdWRlIGRpcmVjdGl2ZXNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLW5vd2FybiAgICAgU3VwcHJlc3MgYWxsIGNvbXBpbGVyIHdhcm5pbmdzIChCQUQhKVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtc3RyaWN0ICAgICBTdHJpY3QgY29tcGlsZXIgd2FybmluZ3Mgb25cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXZbZXJib3NlXSAgVmVyYm9zZSBtb2RlXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1yW2VjdXJzZV0gIEFsc28gZ2VuZXJhdGUgaW5jbHVkZWQgZmlsZXNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRlYnVnICAgICAgUGFyc2UgZGVidWcgdHJhY2UgdG8gc3Rkb3V0XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgIiAgLS1hbGxvdy1uZWcta2V5cyAgQWxsb3cgbmVnYXRpdmUgZmllbGQga2V5cyAoVXNlZCB0byAiCisgICAgICAgICAgInByZXNlcnZlIHByb3RvY29sXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIC50aHJpZnQgZmlsZXMpXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC0tYWxsb3ctNjRiaXQtY29uc3RzICBEbyBub3QgcHJpbnQgd2FybmluZ3MgYWJvdXQgdXNpbmcgNjQtYml0IGNvbnN0YW50c1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtLWdlbiBTVFIgICBHZW5lcmF0ZSBjb2RlIHdpdGggYSBkeW5hbWljYWxseS1yZWdpc3RlcmVkIGdlbmVyYXRvci5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBTVFIgaGFzIHRoZSBmb3JtIGxhbmd1YWdlWzprZXkxPXZhbDFbLGtleTJbLGtleTM9dmFsM11dXS5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBLZXlzIGFuZCB2YWx1ZXMgYXJlIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSBnZW5lcmF0b3IuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgTWFueSBvcHRpb25zIHdpbGwgbm90IHJlcXVpcmUgdmFsdWVzLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJPcHRpb25zIHJlbGF0ZWQgdG8gYXVkaXQgb3BlcmF0aW9uXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAtLWF1ZGl0IE9sZEZpbGUgICBPbGQgVGhyaWZ0IGZpbGUgdG8gYmUgYXVkaXRlZCB3aXRoICdmaWxlJ1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtSW9sZCBkaXIgICAgQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgc2VhcmNoZWQgZm9yIGluY2x1ZGUgZGlyZWN0aXZlcyBmb3Igb2xkIHRocmlmdCBmaWxlXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1JbmV3IGRpciAgICBBZGQgYSBkaXJlY3RvcnkgdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBzZWFyY2hlZCBmb3IgaW5jbHVkZSBkaXJlY3RpdmVzIGZvciBuZXcgdGhyaWZ0IGZpbGVcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiQXZhaWxhYmxlIGdlbmVyYXRvcnMgKGFuZCBvcHRpb25zKTpcbiIpOworCisgIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3QgZ2VuX21hcCA9IHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yX21hcCgpOworICB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90OjppdGVyYXRvciBpdGVyOworICBmb3IgKGl0ZXIgPSBnZW5fbWFwLmJlZ2luKCk7IGl0ZXIgIT0gZ2VuX21hcC5lbmQoKTsgKytpdGVyKSB7CisgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiICAlcyAoJXMpOlxuIiwKKyAgICAgICAgICAgIGl0ZXItPnNlY29uZC0+Z2V0X3Nob3J0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgaXRlci0+c2Vjb25kLT5nZXRfbG9uZ19uYW1lKCkuY19zdHIoKSk7CisgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIGl0ZXItPnNlY29uZC0+Z2V0X2RvY3VtZW50YXRpb24oKS5jX3N0cigpKTsKKyAgfQorICBleGl0KDEpOworfQorCisvKioKKyAqIFlvdSBrbm93LCB3aGVuIEkgc3RhcnRlZCB3b3JraW5nIG9uIFRocmlmdCBJIHJlYWxseSB0aG91Z2h0IGl0IHdhc24ndCBnb2luZworICogdG8gYmVjb21lIGEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgYmVjYXVzZSBpdCB3YXMganVzdCBhIGdlbmVyYXRvciBhbmQgaXQKKyAqIHdvdWxkbid0IG5lZWQgcnVudGltZSB0eXBlIGluZm9ybWF0aW9uIGFuZCBhbGwgdGhhdCBqYXp6LiBCdXQgdGhlbiB3ZQorICogZGVjaWRlZCB0byBhZGQgY29uc3RhbnRzLCBhbmQgYWxsIG9mIGEgc3VkZGVuIHRoYXQgbWVhbnMgcnVudGltZSB0eXBlCisgKiB2YWxpZGF0aW9uIGFuZCBpbmZlcmVuY2UsIGV4Y2VwdCB0aGUgInJ1bnRpbWUiIGlzIHRoZSBjb2RlIGdlbmVyYXRvcgorICogcnVudGltZS4KKyAqLwordm9pZCB2YWxpZGF0ZV9jb25zdF9yZWMoc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNhbm5vdCBkZWNsYXJlIGEgdm9pZCBjb25zdDogIiArIG5hbWU7CisgIH0KKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX1NUUklORykgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgc3RyaW5nIjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBib29sIjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgYnl0ZSI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBpMTYiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgaTMyIjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGk2NCI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSCisgICAgICAgICAgJiYgdmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBkb3VibGUiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpICsgbmFtZTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVIpIHsKKyAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBlbnVtIjsKKyAgICB9CisKKyAgICAvLyBzZWUgaWYgdGhlcmUncyBhIGRvdCBpbiB0aGUgaWRlbnRpZmllcgorICAgIHN0ZDo6c3RyaW5nIG5hbWVfcG9ydGlvbiA9IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gKCh0X2VudW0qKXR5cGUpLT5nZXRfY29uc3RhbnRzKCk7CisgICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworCisgICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpID09IG5hbWVfcG9ydGlvbikgeworICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWZvdW5kKSB7CisgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgIiArIG5hbWUgKyAiIHdhcyBkZWNsYXJlZCBhcyB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICAgKyAiIHdoaWNoIGlzIGFuIGVudW0sIGJ1dCAiICsgdmFsdWUtPmdldF9pZGVudGlmaWVyKCkKKyAgICAgICAgICArICIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIHRoYXQgZW51bSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfTUFQKSB7CisgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgc3RydWN0L3hjZXB0aW9uIjsKKyAgICB9CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgaWYgKHZfaXRlci0+Zmlyc3QtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgbmFtZSArICIgc3RydWN0IGtleSBtdXN0IGJlIHN0cmluZyI7CisgICAgICB9CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisKKyAgICAgIHZhbGlkYXRlX2NvbnN0X3JlYyhuYW1lICsgIi4iICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiPGtleT4iLCBrX3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiPHZhbD4iLCB2X3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBlX3R5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGVfdHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiPGVsZW0+IiwgZV90eXBlLCAqdl9pdGVyKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBDaGVjayBzaW1wbGUgaWRlbnRpZmllciBuYW1lcworICogSXQncyBlYXNpZXIgdG8gZG8gaXQgdGhpcyB3YXkgaW5zdGVhZCBvZiByZXdyaXRpbmcgdGhlIHdob2xlIGdyYW1tYXIgZXRjLgorICovCit2b2lkIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKGNvbnN0IGNoYXIqIGlkZW50aWZpZXIpIHsKKyAgc3RyaW5nIG5hbWUoaWRlbnRpZmllcik7CisgIGlmIChuYW1lLmZpbmQoIi4iKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICB5eWVycm9yKCJJZGVudGlmaWVyICVzIGNhbid0IGhhdmUgYSBkb3QuIiwgaWRlbnRpZmllcik7CisgICAgZXhpdCgxKTsKKyAgfQorfQorCisvKioKKyAqIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBwYXJzZWQgY29uc3QgaW5mb3JtYXRpb24gYWdhaW5zdCBpdHMgZGVjbGFyZWQgdHlwZQorICovCit2b2lkIHZhbGlkYXRlX2NvbnN0X3R5cGUodF9jb25zdCogYykgeworICB2YWxpZGF0ZV9jb25zdF9yZWMoYy0+Z2V0X25hbWUoKSwgYy0+Z2V0X3R5cGUoKSwgYy0+Z2V0X3ZhbHVlKCkpOworfQorCisvKioKKyAqIENoZWNrIHRoZSB0eXBlIG9mIGEgZGVmYXVsdCB2YWx1ZSBhc3NpZ25lZCB0byBhIGZpZWxkLgorICovCit2b2lkIHZhbGlkYXRlX2ZpZWxkX3ZhbHVlKHRfZmllbGQqIGZpZWxkLCB0X2NvbnN0X3ZhbHVlKiBjdikgeworICB2YWxpZGF0ZV9jb25zdF9yZWMoZmllbGQtPmdldF9uYW1lKCksIGZpZWxkLT5nZXRfdHlwZSgpLCBjdik7Cit9CisKKy8qKgorICogQ2hlY2sgdGhhdCBhbGwgdGhlIGVsZW1lbnRzIG9mIGEgdGhyb3dzIGJsb2NrIGFyZSBhY3R1YWxseSBleGNlcHRpb25zLgorICovCitib29sIHZhbGlkYXRlX3Rocm93cyh0X3N0cnVjdCogdGhyb3dzKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0aHJvd3MtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGlmICghdF9nZW5lcmF0b3I6OmdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBTa2lwcyBVVEYtOCBCT00gaWYgdGhlcmUgaXMgb25lCisgKi8KK2Jvb2wgc2tpcF91dGY4X2JvbShGSUxFKiBmKSB7CisKKyAgLy8gcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCwgYnV0IHdvcmtzCisgIGlmIChmZ2V0YyhmKSA9PSAweEVGKSB7CisgICAgaWYgKGZnZXRjKGYpID09IDB4QkIpIHsKKyAgICAgIGlmIChmZ2V0YyhmKSA9PSAweEJGKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJld2luZChmKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIFBhcnNlcyBhIHByb2dyYW0KKyAqLwordm9pZCBwYXJzZSh0X3Byb2dyYW0qIHByb2dyYW0sIHRfcHJvZ3JhbSogcGFyZW50X3Byb2dyYW0pIHsKKyAgLy8gR2V0IHNjb3BlIGZpbGUgcGF0aAorICBzdHJpbmcgcGF0aCA9IHByb2dyYW0tPmdldF9wYXRoKCk7CisKKyAgLy8gU2V0IGN1cnJlbnQgZGlyIGdsb2JhbCwgd2hpY2ggaXMgdXNlZCBpbiB0aGUgaW5jbHVkZV9maWxlIGZ1bmN0aW9uCisgIGdfY3VyZGlyID0gZGlyZWN0b3J5X25hbWUocGF0aCk7CisgIGdfY3VycGF0aCA9IHBhdGg7CisKKyAgLy8gT3BlbiB0aGUgZmlsZQorICAvLyBza2lwIFVURi04IEJPTSBpZiB0aGVyZSBpcyBvbmUKKyAgeXlpbiA9IGZvcGVuKHBhdGguY19zdHIoKSwgInIiKTsKKyAgaWYgKHl5aW4gPT0gMCkgeworICAgIGZhaWx1cmUoIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGU6IFwiJXNcIiIsIHBhdGguY19zdHIoKSk7CisgIH0KKyAgaWYgKHNraXBfdXRmOF9ib20oeXlpbikpCisgICAgcHZlcmJvc2UoIlNraXBwZWQgVVRGLTggQk9NIGF0ICVzXG4iLCBwYXRoLmNfc3RyKCkpOworCisgIC8vIENyZWF0ZSBuZXcgc2NvcGUgYW5kIHNjYW4gZm9yIGluY2x1ZGVzCisgIHB2ZXJib3NlKCJTY2FubmluZyAlcyBmb3IgaW5jbHVkZXNcbiIsIHBhdGguY19zdHIoKSk7CisgIGdfcGFyc2VfbW9kZSA9IElOQ0xVREVTOworICBnX3Byb2dyYW0gPSBwcm9ncmFtOworICBnX3Njb3BlID0gcHJvZ3JhbS0+c2NvcGUoKTsKKyAgdHJ5IHsKKyAgICB5eWxpbmVubyA9IDE7CisgICAgaWYgKHl5cGFyc2UoKSAhPSAwKSB7CisgICAgICBmYWlsdXJlKCJQYXJzZXIgZXJyb3IgZHVyaW5nIGluY2x1ZGUgcGFzcy4iKTsKKyAgICB9CisgIH0gY2F0Y2ggKHN0cmluZyB4KSB7CisgICAgZmFpbHVyZSh4LmNfc3RyKCkpOworICB9CisgIGZjbG9zZSh5eWluKTsKKworICAvLyBSZWN1cnNpdmVseSBwYXJzZSBhbGwgdGhlIGluY2x1ZGUgcHJvZ3JhbXMKKyAgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW0tPmdldF9pbmNsdWRlcygpOworICB2ZWN0b3I8dF9wcm9ncmFtKj46Oml0ZXJhdG9yIGl0ZXI7CisgIGZvciAoaXRlciA9IGluY2x1ZGVzLmJlZ2luKCk7IGl0ZXIgIT0gaW5jbHVkZXMuZW5kKCk7ICsraXRlcikgeworICAgIHBhcnNlKCppdGVyLCBwcm9ncmFtKTsKKyAgfQorCisgIC8vIHJlc2V0IHByb2dyYW0gZG9jdGV4dCBzdGF0dXMgYmVmb3JlIHBhcnNpbmcgYSBuZXcgZmlsZQorICByZXNldF9wcm9ncmFtX2RvY3RleHRfaW5mbygpOworCisgIC8vIFBhcnNlIHRoZSBwcm9ncmFtIGZpbGUKKyAgZ19wYXJzZV9tb2RlID0gUFJPR1JBTTsKKyAgZ19wcm9ncmFtID0gcHJvZ3JhbTsKKyAgZ19zY29wZSA9IHByb2dyYW0tPnNjb3BlKCk7CisgIGdfcGFyZW50X3Njb3BlID0gKHBhcmVudF9wcm9ncmFtICE9IE5VTEwpID8gcGFyZW50X3Byb2dyYW0tPnNjb3BlKCkgOiBOVUxMOworICBnX3BhcmVudF9wcmVmaXggPSBwcm9ncmFtLT5nZXRfbmFtZSgpICsgIi4iOworICBnX2N1cnBhdGggPSBwYXRoOworCisgIC8vIE9wZW4gdGhlIGZpbGUKKyAgLy8gc2tpcCBVVEYtOCBCT00gaWYgdGhlcmUgaXMgb25lCisgIHl5aW4gPSBmb3BlbihwYXRoLmNfc3RyKCksICJyIik7CisgIGlmICh5eWluID09IDApIHsKKyAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlOiBcIiVzXCIiLCBwYXRoLmNfc3RyKCkpOworICB9CisgIGlmIChza2lwX3V0ZjhfYm9tKHl5aW4pKQorICAgIHB2ZXJib3NlKCJTa2lwcGVkIFVURi04IEJPTSBhdCAlc1xuIiwgcGF0aC5jX3N0cigpKTsKKworICBwdmVyYm9zZSgiUGFyc2luZyAlcyBmb3IgdHlwZXNcbiIsIHBhdGguY19zdHIoKSk7CisgIHl5bGluZW5vID0gMTsKKyAgdHJ5IHsKKyAgICBpZiAoeXlwYXJzZSgpICE9IDApIHsKKyAgICAgIGZhaWx1cmUoIlBhcnNlciBlcnJvciBkdXJpbmcgdHlwZXMgcGFzcy4iKTsKKyAgICB9CisgIH0gY2F0Y2ggKHN0cmluZyB4KSB7CisgICAgZmFpbHVyZSh4LmNfc3RyKCkpOworICB9CisgIGZjbG9zZSh5eWluKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBjb2RlCisgKi8KK3ZvaWQgZ2VuZXJhdGUodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgZ2VuZXJhdG9yX3N0cmluZ3MpIHsKKyAgLy8gT29vb2hoLCByZWN1cnNpdmUgY29kZSBnZW5lcmF0aW9uLCBob3QhIQorICBpZiAoZ2VuX3JlY3Vyc2UpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbS0+Z2V0X2luY2x1ZGVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgICAgLy8gUHJvcGFnYXRlIG91dHB1dCBwYXRoIGZyb20gcGFyZW50IHRvIGNoaWxkIHByb2dyYW1zCisgICAgICBpbmNsdWRlc1tpXS0+c2V0X291dF9wYXRoKHByb2dyYW0tPmdldF9vdXRfcGF0aCgpLCBwcm9ncmFtLT5pc19vdXRfcGF0aF9hYnNvbHV0ZSgpKTsKKworICAgICAgZ2VuZXJhdGUoaW5jbHVkZXNbaV0sIGdlbmVyYXRvcl9zdHJpbmdzKTsKKyAgICB9CisgIH0KKworICAvLyBHZW5lcmF0ZSBjb2RlIQorICB0cnkgeworICAgIHB2ZXJib3NlKCJQcm9ncmFtOiAlc1xuIiwgcHJvZ3JhbS0+Z2V0X3BhdGgoKS5jX3N0cigpKTsKKworICAgIGlmIChkdW1wX2RvY3MpIHsKKyAgICAgIGR1bXBfZG9jc3RyaW5ncyhwcm9ncmFtKTsKKyAgICB9CisKKyAgICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKyAgICBmb3IgKGl0ZXIgPSBnZW5lcmF0b3Jfc3RyaW5ncy5iZWdpbigpOyBpdGVyICE9IGdlbmVyYXRvcl9zdHJpbmdzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRfZ2VuZXJhdG9yKiBnZW5lcmF0b3IgPSB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcihwcm9ncmFtLCAqaXRlcik7CisKKyAgICAgIGlmIChnZW5lcmF0b3IgPT0gTlVMTCkgeworI2lmZGVmIFRIUklGVF9FTkFCTEVfUExVR0lOCisgICAgICAgIHN3aXRjaCAocGx1Z2luX291dHB1dDo6ZGVsZWdhdGVUb1BsdWdpbihwcm9ncmFtLCAqaXRlcikpIHsKKyAgICAgICAgICBjYXNlIHBsdWdpbl9vdXRwdXQ6OlBMVUdJTl9OT1RfRk9VTkQ6CisgICAgICAgICAgICBwd2FybmluZygxLCAiVW5hYmxlIHRvIGdldCBhIGdlbmVyYXRvciBmb3IgXCIlc1wiLlxuIiwgaXRlci0+Y19zdHIoKSk7CisgICAgICAgICAgICBnX2dlbmVyYXRvcl9mYWlsdXJlID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgcGx1Z2luX291dHB1dDo6UExVR0lOX0ZBSUxVUkU6CisgICAgICAgICAgICBwd2FybmluZygxLCAiUGx1Z2luIGdlbmVyYXRvciBmb3IgXCIlc1wiIGZhaWxlZC5cbiIsIGl0ZXItPmNfc3RyKCkpOworICAgICAgICAgICAgZ19nZW5lcmF0b3JfZmFpbHVyZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHBsdWdpbl9vdXRwdXQ6OlBMVUdJTl9TVUNDRUVTUzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIHB3YXJuaW5nKDEsICJVbmFibGUgdG8gZ2V0IGEgZ2VuZXJhdG9yIGZvciBcIiVzXCIuXG4iLCBpdGVyLT5jX3N0cigpKTsKKyAgICAgICAgZ19nZW5lcmF0b3JfZmFpbHVyZSA9IHRydWU7CisjZW5kaWYKKyAgICAgIH0gZWxzZSBpZiAoZ2VuZXJhdG9yKSB7CisgICAgICAgIGdlbmVyYXRvci0+dmFsaWRhdGVfaW5wdXQoKTsKKyAgICAgICAgcHZlcmJvc2UoIkdlbmVyYXRpbmcgXCIlc1wiXG4iLCBpdGVyLT5jX3N0cigpKTsKKyAgICAgICAgZ2VuZXJhdG9yLT5nZW5lcmF0ZV9wcm9ncmFtKCk7CisgICAgICAgIGRlbGV0ZSBnZW5lcmF0b3I7CisgICAgICB9CisgICAgfQorICB9IGNhdGNoIChzdHJpbmcgcykgeworICAgIGZhaWx1cmUoIkVycm9yOiAlc1xuIiwgcy5jX3N0cigpKTsKKyAgfSBjYXRjaCAoY29uc3QgY2hhciogZXhjKSB7CisgICAgZmFpbHVyZSgiRXJyb3I6ICVzXG4iLCBleGMpOworICB9Cit9CisKK3ZvaWQgYXVkaXQodF9wcm9ncmFtKiBuZXdfcHJvZ3JhbSwKKyAgICAgICAgICAgdF9wcm9ncmFtKiBvbGRfcHJvZ3JhbSwKKyAgICAgICAgICAgc3RyaW5nIG5ld190aHJpZnRfaW5jbHVkZV9wYXRoLAorICAgICAgICAgICBzdHJpbmcgb2xkX3RocmlmdF9pbmNsdWRlX3BhdGgpIHsKKyAgdmVjdG9yPHN0cmluZz4gdGVtcF9pbmNsX3NlYXJjaHBhdGggPSBnX2luY2xfc2VhcmNocGF0aDsKKyAgaWYgKCFvbGRfdGhyaWZ0X2luY2x1ZGVfcGF0aC5lbXB0eSgpKSB7CisgICAgZ19pbmNsX3NlYXJjaHBhdGgucHVzaF9iYWNrKG9sZF90aHJpZnRfaW5jbHVkZV9wYXRoKTsKKyAgfQorCisgIHBhcnNlKG9sZF9wcm9ncmFtLCBOVUxMKTsKKworICBnX2luY2xfc2VhcmNocGF0aCA9IHRlbXBfaW5jbF9zZWFyY2hwYXRoOworICBpZiAoIW5ld190aHJpZnRfaW5jbHVkZV9wYXRoLmVtcHR5KCkpIHsKKyAgICBnX2luY2xfc2VhcmNocGF0aC5wdXNoX2JhY2sobmV3X3RocmlmdF9pbmNsdWRlX3BhdGgpOworICB9CisKKyAgcGFyc2UobmV3X3Byb2dyYW0sIE5VTEwpOworCisgIGNvbXBhcmVfbmFtZXNwYWNlKG5ld19wcm9ncmFtLCBvbGRfcHJvZ3JhbSk7CisgIGNvbXBhcmVfc2VydmljZXMobmV3X3Byb2dyYW0tPmdldF9zZXJ2aWNlcygpLCBvbGRfcHJvZ3JhbS0+Z2V0X3NlcnZpY2VzKCkpOworICBjb21wYXJlX2VudW1zKG5ld19wcm9ncmFtLT5nZXRfZW51bXMoKSwgb2xkX3Byb2dyYW0tPmdldF9lbnVtcygpKTsKKyAgY29tcGFyZV9zdHJ1Y3RzKG5ld19wcm9ncmFtLT5nZXRfc3RydWN0cygpLCBvbGRfcHJvZ3JhbS0+Z2V0X3N0cnVjdHMoKSk7CisgIGNvbXBhcmVfc3RydWN0cyhuZXdfcHJvZ3JhbS0+Z2V0X3hjZXB0aW9ucygpLCBvbGRfcHJvZ3JhbS0+Z2V0X3hjZXB0aW9ucygpKTsKKyAgY29tcGFyZV9jb25zdHMobmV3X3Byb2dyYW0tPmdldF9jb25zdHMoKSwgb2xkX3Byb2dyYW0tPmdldF9jb25zdHMoKSk7Cit9CisKKy8qKgorICogUGFyc2UgaXQgdXAuLiB0aGVuIHNwaXQgaXQgYmFjayBvdXQsIGluIHByZXR0eSBtdWNoIGV2ZXJ5IGxhbmd1YWdlLiBBbHJpZ2h0CisgKiBub3QgdGhhdCBtYW55IGxhbmd1YWdlcywgYnV0IHRoZSBjb29sIG9uZXMgdGhhdCB3ZSBjYXJlIGFib3V0LgorICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgaW50IGk7CisgIHN0ZDo6c3RyaW5nIG91dF9wYXRoOworICBib29sIG91dF9wYXRoX2lzX2Fic29sdXRlID0gZmFsc2U7CisKKyAgLy8gU2V0dXAgdGltZSBzdHJpbmcKKyAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisgIGdfdGltZV9zdHIgPSBjdGltZSgmbm93KTsKKworICAvLyBDaGVjayBmb3IgbmVjZXNzYXJ5IGFyZ3VtZW50cywgeW91IGdvdHRhIGhhdmUgYXQgbGVhc3QgYSBmaWxlbmFtZSBhbmQKKyAgLy8gYW4gb3V0cHV0IGxhbmd1YWdlIGZsYWcKKyAgaWYgKGFyZ2MgPCAyKSB7CisgICAgdXNhZ2UoKTsKKyAgfQorCisgIHZlY3RvcjxzdHJpbmc+IGdlbmVyYXRvcl9zdHJpbmdzOworICBzdHJpbmcgb2xkX3RocmlmdF9pbmNsdWRlX3BhdGg7CisgIHN0cmluZyBuZXdfdGhyaWZ0X2luY2x1ZGVfcGF0aDsKKyAgc3RyaW5nIG9sZF9pbnB1dF9maWxlOworCisgIC8vIFNldCB0aGUgY3VycmVudCBwYXRoIHRvIGEgZHVtbXkgdmFsdWUgdG8gbWFrZSB3YXJuaW5nIG1lc3NhZ2VzIGNsZWFyZXIuCisgIGdfY3VycGF0aCA9ICJhcmd1bWVudHMiOworCisgIC8vIEhhY2t5IHBhcmFtZXRlciBoYW5kbGluZy4uLiBJIGRpZG4ndCBmZWVsIGxpa2UgdXNpbmcgYSBsaWJyYXJ5IHNvcnJ5IQorICBmb3IgKGkgPSAxOyBpIDwgYXJnYyAtIDE7IGkrKykgeworICAgIGNoYXIqIGFyZzsKKworICAgIGFyZyA9IHN0cnRvayhhcmd2W2ldLCAiICIpOworICAgIHdoaWxlIChhcmcgIT0gTlVMTCkgeworICAgICAgLy8gVHJlYXQgZG91YmxlIGRhc2hlcyBhcyBzaW5nbGUgZGFzaGVzCisgICAgICBpZiAoYXJnWzBdID09ICctJyAmJiBhcmdbMV0gPT0gJy0nKSB7CisgICAgICAgICsrYXJnOworICAgICAgfQorCisgICAgICBpZiAoc3RyY21wKGFyZywgIi1oZWxwIikgPT0gMCkgeworICAgICAgICBoZWxwKCk7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItdmVyc2lvbiIpID09IDApIHsKKyAgICAgICAgdmVyc2lvbigpOworICAgICAgICBleGl0KDApOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWRlYnVnIikgPT0gMCkgeworICAgICAgICBnX2RlYnVnID0gMTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1ub3dhcm4iKSA9PSAwKSB7CisgICAgICAgIGdfd2FybiA9IDA7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItc3RyaWN0IikgPT0gMCkgeworICAgICAgICBnX3N0cmljdCA9IDI1NTsKKyAgICAgICAgZ193YXJuID0gMjsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi12IikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiLXZlcmJvc2UiKSA9PSAwKSB7CisgICAgICAgIGdfdmVyYm9zZSA9IDE7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItciIpID09IDAgfHwgc3RyY21wKGFyZywgIi1yZWN1cnNlIikgPT0gMCkgeworICAgICAgICBnZW5fcmVjdXJzZSA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItYWxsb3ctbmVnLWtleXMiKSA9PSAwKSB7CisgICAgICAgIGdfYWxsb3dfbmVnX2ZpZWxkX2tleXMgPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWFsbG93LTY0Yml0LWNvbnN0cyIpID09IDApIHsKKyAgICAgICAgZ19hbGxvd182NGJpdF9jb25zdHMgPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWdlbiIpID09IDApIHsKKyAgICAgICAgYXJnID0gYXJndlsrK2ldOworICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgZ2VuZXJhdG9yIHNwZWNpZmljYXRpb25cbiIpOworICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgIH0KKyAgICAgICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKGFyZyk7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItSSIpID09IDApIHsKKyAgICAgICAgLy8gQW4gYXJndW1lbnQgb2YgIi1JXCBhc2RmIiBpcyBpbnZhbGlkIGFuZCBoYXMgdW5rbm93biByZXN1bHRzCisgICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKKworICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgSW5jbHVkZSBkaXJlY3RvcnlcbiIpOworICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgIH0KKyAgICAgICAgZ19pbmNsX3NlYXJjaHBhdGgucHVzaF9iYWNrKGFyZyk7CisgICAgICB9IGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiLW8iKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIi1vdXQiKSA9PSAwKSkgeworICAgICAgICBvdXRfcGF0aF9pc19hYnNvbHV0ZSA9IChzdHJjbXAoYXJnLCAiLW91dCIpID09IDApID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICBhcmcgPSBhcmd2WysraV07CisgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiLW86IG1pc3Npbmcgb3V0cHV0IGRpcmVjdG9yeVxuIik7CisgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBvdXRfcGF0aCA9IGFyZzsKKworI2lmZGVmIF9XSU4zMgorICAgICAgICAvLyBzdHJpcCBvdXQgdHJhaWxpbmcgXCBvbiBXaW5kb3dzCisgICAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGFzdCA9IG91dF9wYXRoLmxlbmd0aCgpIC0gMTsKKyAgICAgICAgaWYgKG91dF9wYXRoW2xhc3RdID09ICdcXCcpIHsKKyAgICAgICAgICBvdXRfcGF0aC5lcmFzZShsYXN0KTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmICghY2hlY2tfaXNfZGlyZWN0b3J5KG91dF9wYXRoLmNfc3RyKCkpKQorICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1hdWRpdCIpID09IDApIHsKKyAgICAgICAgZ19hdWRpdCA9IHRydWU7CisgICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKKyAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIG9sZCB0aHJpZnQgZmlsZSBuYW1lIGZvciBhdWRpdCBvcGVyYXRpb25cbiIpOworICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2hhciBvbGRfdGhyaWZ0X2ZpbGVfcnBbVEhSSUZUX1BBVEhfTUFYXTsKKworICAgICAgICAvLyBjcHBjaGVjay1zdXBwcmVzcyB1bmluaXR2YXIKKyAgICAgICAgaWYgKHNhZmVyZWFscGF0aChhcmcsIG9sZF90aHJpZnRfZmlsZV9ycCkgPT0gTlVMTCkgeworICAgICAgICAgIGZhaWx1cmUoIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGUgd2l0aCByZWFscGF0aDogJXMiLCBhcmcpOworICAgICAgICB9CisgICAgICAgIG9sZF9pbnB1dF9maWxlID0gc3RyaW5nKG9sZF90aHJpZnRfZmlsZV9ycCk7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItYXVkaXQtbm9mYXRhbCIpID09IDApIHsKKyAgICAgICAgZ19hdWRpdF9mYXRhbCA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLUlvbGQiKSA9PSAwKSB7CisgICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKKyAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIEluY2x1ZGUgZGlyZWN0b3J5IGZvciBvbGQgdGhyaWZ0IGZpbGVcbiIpOworICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgIH0KKyAgICAgICAgb2xkX3RocmlmdF9pbmNsdWRlX3BhdGggPSBzdHJpbmcoYXJnKTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1JbmV3IikgPT0gMCkgeworICAgICAgICBhcmcgPSBhcmd2WysraV07CisgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBJbmNsdWRlIGRpcmVjdG9yeSBmb3IgbmV3IHRocmlmdCBmaWxlXG4iKTsKKyAgICAgICAgICB1c2FnZSgpOworICAgICAgICB9CisgICAgICAgIG5ld190aHJpZnRfaW5jbHVkZV9wYXRoID0gc3RyaW5nKGFyZyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVucmVjb2duaXplZCBvcHRpb246ICVzXG4iLCBhcmcpOworICAgICAgICB1c2FnZSgpOworICAgICAgfQorCisgICAgICAvLyBUb2tlbml6ZSBtb3JlCisgICAgICBhcmcgPSBzdHJ0b2soTlVMTCwgIiAiKTsKKyAgICB9CisgIH0KKworICAvLyBkaXNwbGF5IGhlbHAKKyAgaWYgKChzdHJjbXAoYXJndlthcmdjIC0gMV0sICItaGVscCIpID09IDApIHx8IChzdHJjbXAoYXJndlthcmdjIC0gMV0sICItLWhlbHAiKSA9PSAwKSkgeworICAgIGhlbHAoKTsKKyAgfQorCisgIC8vIGlmIHlvdSdyZSBhc2tpbmcgZm9yIHZlcnNpb24sIHlvdSBoYXZlIGEgcmlnaHQgbm90IHRvIHBhc3MgYSBmaWxlCisgIGlmICgoc3RyY21wKGFyZ3ZbYXJnYyAtIDFdLCAiLXZlcnNpb24iKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbYXJnYyAtIDFdLCAiLS12ZXJzaW9uIikgPT0gMCkpIHsKKyAgICB2ZXJzaW9uKCk7CisgICAgZXhpdCgwKTsKKyAgfQorCisgIC8vIEluaXRpYWxpemUgZ2xvYmFsIHR5cGVzCisgIGluaXRHbG9iYWxzKCk7CisKKyAgaWYgKGdfYXVkaXQpIHsKKyAgICAvLyBBdWRpdCBvcGVyYXRpb24KKworICAgIGlmIChvbGRfaW5wdXRfZmlsZS5lbXB0eSgpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgZmlsZSBuYW1lIG9mIG9sZCB0aHJpZnQgZmlsZSBmb3IgYXVkaXRcbiIpOworICAgICAgdXNhZ2UoKTsKKyAgICB9CisKKyAgICBjaGFyIG5ld190aHJpZnRfZmlsZV9ycFtUSFJJRlRfUEFUSF9NQVhdOworICAgIGlmIChhcmd2W2ldID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBmaWxlIG5hbWUgb2YgbmV3IHRocmlmdCBmaWxlIGZvciBhdWRpdFxuIik7CisgICAgICB1c2FnZSgpOworICAgIH0KKyAgICAvLyBjcHBjaGVjay1zdXBwcmVzcyB1bmluaXR2YXIKKyAgICBpZiAoc2FmZXJlYWxwYXRoKGFyZ3ZbaV0sIG5ld190aHJpZnRfZmlsZV9ycCkgPT0gTlVMTCkgeworICAgICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZSB3aXRoIHJlYWxwYXRoOiAlcyIsIGFyZ3ZbaV0pOworICAgIH0KKyAgICBzdHJpbmcgbmV3X2lucHV0X2ZpbGUobmV3X3RocmlmdF9maWxlX3JwKTsKKworICAgIHRfcHJvZ3JhbSBuZXdfcHJvZ3JhbShuZXdfaW5wdXRfZmlsZSk7CisgICAgdF9wcm9ncmFtIG9sZF9wcm9ncmFtKG9sZF9pbnB1dF9maWxlKTsKKworICAgIGF1ZGl0KCZuZXdfcHJvZ3JhbSwgJm9sZF9wcm9ncmFtLCBuZXdfdGhyaWZ0X2luY2x1ZGVfcGF0aCwgb2xkX3RocmlmdF9pbmNsdWRlX3BhdGgpOworCisgIH0gZWxzZSB7CisgICAgLy8gR2VuZXJhdGUgb3B0aW9ucworCisgICAgLy8gWW91IGdvdHRhIGdlbmVyYXRlIHNvbWV0aGluZyEKKyAgICBpZiAoZ2VuZXJhdG9yX3N0cmluZ3MuZW1wdHkoKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJObyBvdXRwdXQgbGFuZ3VhZ2Uocykgc3BlY2lmaWVkXG4iKTsKKyAgICAgIHVzYWdlKCk7CisgICAgfQorCisgICAgLy8gUmVhbC1wYXRoaWZ5IGl0CisgICAgY2hhciBycFtUSFJJRlRfUEFUSF9NQVhdOworICAgIGlmIChhcmd2W2ldID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBmaWxlIG5hbWVcbiIpOworICAgICAgdXNhZ2UoKTsKKyAgICB9CisgICAgLy8gY3BwY2hlY2stc3VwcHJlc3MgdW5pbml0dmFyCisgICAgaWYgKHNhZmVyZWFscGF0aChhcmd2W2ldLCBycCkgPT0gTlVMTCkgeworICAgICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZSB3aXRoIHJlYWxwYXRoOiAlcyIsIGFyZ3ZbaV0pOworICAgIH0KKyAgICBzdHJpbmcgaW5wdXRfZmlsZShycCk7CisKKyAgICAvLyBJbnN0YW5jZSBvZiB0aGUgZ2xvYmFsIHBhcnNlIHRyZWUKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKGlucHV0X2ZpbGUpOworICAgIGlmIChvdXRfcGF0aC5zaXplKCkpIHsKKyAgICAgIHByb2dyYW0tPnNldF9vdXRfcGF0aChvdXRfcGF0aCwgb3V0X3BhdGhfaXNfYWJzb2x1dGUpOworICAgIH0KKworICAgIC8vIENvbXB1dGUgdGhlIGNwcCBpbmNsdWRlIHByZWZpeC4KKyAgICAvLyBpbmZlciB0aGlzIGZyb20gdGhlIGZpbGVuYW1lIHBhc3NlZCBpbgorICAgIHN0cmluZyBpbnB1dF9maWxlbmFtZSA9IGFyZ3ZbaV07CisgICAgc3RyaW5nIGluY2x1ZGVfcHJlZml4OworCisgICAgc3RyaW5nOjpzaXplX3R5cGUgbGFzdF9zbGFzaCA9IHN0cmluZzo6bnBvczsKKyAgICBpZiAoKGxhc3Rfc2xhc2ggPSBpbnB1dF9maWxlbmFtZS5yZmluZCgiLyIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGluY2x1ZGVfcHJlZml4ID0gaW5wdXRfZmlsZW5hbWUuc3Vic3RyKDAsIGxhc3Rfc2xhc2gpOworICAgIH0KKworICAgIHByb2dyYW0tPnNldF9pbmNsdWRlX3ByZWZpeChpbmNsdWRlX3ByZWZpeCk7CisKKyAgICAvLyBQYXJzZSBpdCEKKyAgICBwYXJzZShwcm9ncmFtLCBOVUxMKTsKKworICAgIC8vIFRoZSBjdXJyZW50IHBhdGggaXMgbm90IHJlYWxseSByZWxldmFudCB3aGVuIHdlIGFyZSBkb2luZyBnZW5lcmF0aW9uLgorICAgIC8vIFJlc2V0IHRoZSB2YXJpYWJsZSB0byBtYWtlIHdhcm5pbmcgbWVzc2FnZXMgY2xlYXJlci4KKyAgICBnX2N1cnBhdGggPSAiZ2VuZXJhdGlvbiI7CisgICAgLy8gUmVzZXQgeXlsaW5lbm8gZm9yIHRoZSBoZWNrIG9mIGl0LiAgVXNlIDEgaW5zdGVhZCBvZiAwIGJlY2F1c2UKKyAgICAvLyBUaGF0IGlzIHdoYXQgc2hvd3MgdXAgZHVyaW5nIGFyZ3VtZW50IHBhcnNpbmcuCisgICAgeXlsaW5lbm8gPSAxOworCisgICAgLy8gR2VuZXJhdGUgaXQhCisgICAgZ2VuZXJhdGUocHJvZ3JhbSwgZ2VuZXJhdG9yX3N0cmluZ3MpOworICAgIGRlbGV0ZSBwcm9ncmFtOworICB9CisKKyAgLy8gQ2xlYW4gdXAuIFdobyBhbSBJIGtpZGRpbmcuLi4gdGhpcyBwcm9ncmFtIHByb2JhYmx5IG9ycGhhbnMgaGVhcCBtZW1vcnkKKyAgLy8gYWxsIG92ZXIgdGhlIHBsYWNlLCBidXQgd2hvIGNhcmVzIGJlY2F1c2UgaXQgaXMgYWJvdXQgdG8gZXhpdCBhbmQgaXQgaXMKKyAgLy8gYWxsIHJlZmVyZW5jZWQgYW5kIHVzZWQgYnkgdGhpcyB3YWNreSBwYXJzZSB0cmVlIHVwIHVudGlsIG5vdyBhbnl3YXlzLgorICBjbGVhckdsb2JhbHMoKTsKKworICAvLyBGaW5pc2hlZAorICBpZiAoZ19yZXR1cm5fZmFpbHVyZSAmJiBnX2F1ZGl0X2ZhdGFsKSB7CisgICAgZXhpdCgyKTsKKyAgfQorICBpZiAoZ19nZW5lcmF0b3JfZmFpbHVyZSkgeworICAgIGV4aXQoMyk7CisgIH0KKyAgLy8gRmluaXNoZWQKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9tYWluLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhYmIwMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L21haW4uaApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfTUFJTl9ICisjZGVmaW5lIFRfTUFJTl9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Y3N0ZGlvPgorCisjaW5jbHVkZSAidGhyaWZ0L2xvZ2dpbmcuaCIKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2NvbnN0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZmllbGQuaCIKKworLyoqCisgKiBEZWZpbmVkIGluIHRoZSBmbGV4IGxpYnJhcnkKKyAqLworCitleHRlcm4gIkMiIHsgaW50IHl5bGV4KHZvaWQpOyB9CisKK2ludCB5eXBhcnNlKHZvaWQpOworCisvKioKKyAqIEV4cGVjdGVkIHRvIGJlIGRlZmluZWQgYnkgRmxleC9CaXNvbgorICovCit2b2lkIHl5ZXJyb3IoY29uc3QgY2hhciogZm10LCAuLi4pOworCisvKioKKyAqIENoZWNrIHNpbXBsZSBpZGVudGlmaWVyIG5hbWVzCisgKi8KK3ZvaWQgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoY29uc3QgY2hhciogaWRlbnRpZmllcik7CisKKy8qKgorICogQ2hlY2sgY29uc3RhbnQgdHlwZXMKKyAqLwordm9pZCB2YWxpZGF0ZV9jb25zdF90eXBlKHRfY29uc3QqIGMpOworCisvKioKKyAqIENoZWNrIGNvbnN0YW50IHR5cGVzCisgKi8KK3ZvaWQgdmFsaWRhdGVfZmllbGRfdmFsdWUodF9maWVsZCogZmllbGQsIHRfY29uc3RfdmFsdWUqIGN2KTsKKworLyoqCisgKiBDaGVjayBtZW1iZXJzIG9mIGEgdGhyb3dzIGJsb2NrCisgKi8KK2Jvb2wgdmFsaWRhdGVfdGhyb3dzKHRfc3RydWN0KiB0aHJvd3MpOworCisvKioKKyAqIENvbnZlcnRzIGEgc3RyaW5nIGZpbGVuYW1lIGludG8gYSB0aHJpZnQgcHJvZ3JhbSBuYW1lCisgKi8KK3N0ZDo6c3RyaW5nIHByb2dyYW1fbmFtZShzdGQ6OnN0cmluZyBmaWxlbmFtZSk7CisKKy8qKgorICogR2V0cyB0aGUgZGlyZWN0b3J5IHBhdGggb2YgYSBmaWxlbmFtZQorICovCitzdGQ6OnN0cmluZyBkaXJlY3RvcnlfbmFtZShzdGQ6OnN0cmluZyBmaWxlbmFtZSk7CisKKy8qKgorICogR2V0IHRoZSBhYnNvbHV0ZSBwYXRoIGZvciBhbiBpbmNsdWRlIGZpbGUKKyAqLworc3RkOjpzdHJpbmcgaW5jbHVkZV9maWxlKHN0ZDo6c3RyaW5nIGZpbGVuYW1lKTsKKworLyoqCisgKiBDbGVhcnMgYW55IHByZXZpb3VzbHkgc3RvcmVkIGRvY3RleHQgc3RyaW5nLgorICovCit2b2lkIGNsZWFyX2RvY3RleHQoKTsKKworLyoqCisgKiBDbGVhbnMgdXAgdGV4dCBjb21tb25seSBmb3VuZCBpbiBkb3h5Z2VuLWxpa2UgY29tbWVudHMKKyAqLworY2hhciogY2xlYW5fdXBfZG9jdGV4dChjaGFyKiBkb2N0ZXh0KTsKKworLyoqCisgKiBXZSBhcmUgc3VyZSB0aGUgcHJvZ3JhbSBkb2N0ZXh0IGNhbmRpZGF0ZSBpcyByZWFsbHkgdGhlIHByb2dyYW0gZG9jdGV4dC4KKyAqLwordm9pZCBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOworCisvKioKKyAqIEVtaXRzIGEgd2FybmluZyBvbiBsaXN0PGJ5dGU+LCBiaW5hcnkgdHlwZSBpcyB0eXBpY2FsbHkgYSBtdWNoIGJldHRlciBjaG9pY2UuCisgKi8KK3ZvaWQgY2hlY2tfZm9yX2xpc3Rfb2ZfYnl0ZXModF90eXBlKiBsaXN0X2VsZW1fdHlwZSk7CisKKy8qKgorICogRW1pdHMgYSBvbmUtdGltZSB3YXJuaW5nIG9uIGJ5dGUgdHlwZSwgcHJvbW90aW5nIHRoZSBuZXcgaTggdHlwZSBpbnN0ZWFkCisgKi8KK3ZvaWQgZW1pdF9ieXRlX3R5cGVfd2FybmluZygpOworCisvKioKKyAqIFByaW50cyBkZXByZWNhdGlvbiBub3RpY2UgZm9yIG9sZCBOUyBkZWNsYXJhdGlvbnMgdGhhdCBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZAorICogSWYgbmV3X2Zvcm0gaXMgTlVMTCwgb2xkX2Zvcm0gaXMgYXNzdW1lZCB0byBiZSBhIGxhbmd1YWdlIGlkZW50aWZpZXIsIHN1Y2ggYXMgImNwcCIKKyAqIElmIG5ld19mb3JtIGlzIG5vdCBOVUxMLCBib3RoIGFyZ3VtZW50cyBhcmUgdXNlZCBleGFjdGx5IGFzIGdpdmVuCisgKi8KK3ZvaWQgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woY29uc3QgY2hhciogb2xkX2Zvcm0sIGNvbnN0IGNoYXIqIG5ld19mb3JtID0gTlVMTCk7CisKKy8qKgorICogRmxleCB1dGlsaXRpZXMKKyAqLworCitleHRlcm4gaW50IHl5bGluZW5vOworZXh0ZXJuIGNoYXIgeXl0ZXh0W107CitleHRlcm4gc3RkOjpGSUxFKiB5eWluOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3BhcnNlLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvcGFyc2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFmNzYzNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3BhcnNlLmNjCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlZGVmLmgiCisKKyNpbmNsdWRlICJ0aHJpZnQvbWFpbi5oIgorCit0X3R5cGUqIHRfdHlwZTo6Z2V0X3RydWVfdHlwZSgpIHsKKyAgdF90eXBlKiB0eXBlID0gdGhpczsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKyAgcmV0dXJuIHR5cGU7Cit9CisKK2NvbnN0IHRfdHlwZSogdF90eXBlOjpnZXRfdHJ1ZV90eXBlKCkgY29uc3QgeworICBjb25zdCB0X3R5cGUqIHR5cGUgPSB0aGlzOworICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorICByZXR1cm4gdHlwZTsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMzk4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9CQVNFX1RZUEVfSAorI2RlZmluZSBUX0JBU0VfVFlQRV9ICisKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKworLyoqCisgKiBBIHRocmlmdCBiYXNlIHR5cGUsIHdoaWNoIG11c3QgYmUgb25lIG9mIHRoZSBkZWZpbmVkIGVudW1lcmF0ZWQgdHlwZXMgaW5zaWRlCisgKiB0aGlzIGRlZmluaXRpb24uCisgKgorICovCitjbGFzcyB0X2Jhc2VfdHlwZSA6IHB1YmxpYyB0X3R5cGUgeworcHVibGljOgorICAvKioKKyAgICogRW51bWVyYXRpb24gb2YgdGhyaWZ0IGJhc2UgdHlwZXMKKyAgICovCisgIGVudW0gdF9iYXNlIHsKKyAgICBUWVBFX1ZPSUQsCisgICAgVFlQRV9TVFJJTkcsCisgICAgVFlQRV9CT09MLAorICAgIFRZUEVfSTgsCisgICAgVFlQRV9JMTYsCisgICAgVFlQRV9JMzIsCisgICAgVFlQRV9JNjQsCisgICAgVFlQRV9ET1VCTEUKKyAgfTsKKworICB0X2Jhc2VfdHlwZShzdGQ6OnN0cmluZyBuYW1lLCB0X2Jhc2UgYmFzZSkKKyAgICA6IHRfdHlwZShuYW1lKSwgYmFzZV8oYmFzZSksIHN0cmluZ19saXN0XyhmYWxzZSksIGJpbmFyeV8oZmFsc2UpLCBzdHJpbmdfZW51bV8oZmFsc2UpIHt9CisKKyAgdF9iYXNlIGdldF9iYXNlKCkgY29uc3QgeyByZXR1cm4gYmFzZV87IH0KKworICBib29sIGlzX3ZvaWQoKSBjb25zdCB7IHJldHVybiBiYXNlXyA9PSBUWVBFX1ZPSUQ7IH0KKworICBib29sIGlzX3N0cmluZygpIGNvbnN0IHsgcmV0dXJuIGJhc2VfID09IFRZUEVfU1RSSU5HOyB9CisKKyAgYm9vbCBpc19ib29sKCkgY29uc3QgeyByZXR1cm4gYmFzZV8gPT0gVFlQRV9CT09MOyB9CisKKyAgdm9pZCBzZXRfc3RyaW5nX2xpc3QoYm9vbCB2YWwpIHsgc3RyaW5nX2xpc3RfID0gdmFsOyB9CisKKyAgYm9vbCBpc19zdHJpbmdfbGlzdCgpIGNvbnN0IHsgcmV0dXJuIHN0cmluZ19saXN0XyAmJiAoYmFzZV8gPT0gVFlQRV9TVFJJTkcpOyB9CisKKyAgdm9pZCBzZXRfYmluYXJ5KGJvb2wgdmFsKSB7IGJpbmFyeV8gPSB2YWw7IH0KKworICBib29sIGlzX2JpbmFyeSgpIGNvbnN0IHsgcmV0dXJuIGJpbmFyeV8gJiYgKGJhc2VfID09IFRZUEVfU1RSSU5HKTsgfQorCisgIHZvaWQgc2V0X3N0cmluZ19lbnVtKGJvb2wgdmFsKSB7IHN0cmluZ19lbnVtXyA9IHZhbDsgfQorCisgIGJvb2wgaXNfc3RyaW5nX2VudW0oKSBjb25zdCB7IHJldHVybiBzdHJpbmdfZW51bV8gJiYgYmFzZV8gPT0gVFlQRV9TVFJJTkc7IH0KKworICB2b2lkIGFkZF9zdHJpbmdfZW51bV92YWwoc3RkOjpzdHJpbmcgdmFsKSB7IHN0cmluZ19lbnVtX3ZhbHNfLnB1c2hfYmFjayh2YWwpOyB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBnZXRfc3RyaW5nX2VudW1fdmFscygpIGNvbnN0IHsgcmV0dXJuIHN0cmluZ19lbnVtX3ZhbHNfOyB9CisKKyAgYm9vbCBpc19iYXNlX3R5cGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIHRfYmFzZV9uYW1lKHRfYmFzZSB0YmFzZSkgeworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIFRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAidm9pZCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJzdHJpbmciOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gImJvb2wiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX0k4OgorICAgICAgcmV0dXJuICJpOCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfSTE2OgorICAgICAgcmV0dXJuICJpMTYiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiaTMyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9JNjQ6CisgICAgICByZXR1cm4gImk2NCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJkb3VibGUiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiKHVua25vd24pIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICB0X2Jhc2UgYmFzZV87CisKKyAgYm9vbCBzdHJpbmdfbGlzdF87CisgIGJvb2wgYmluYXJ5XzsKKyAgYm9vbCBzdHJpbmdfZW51bV87CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdfZW51bV92YWxzXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb25zdC5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb25zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMDhlMGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0LmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfQ09OU1RfSAorI2RlZmluZSBUX0NPTlNUX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9jb25zdF92YWx1ZS5oIgorCisvKioKKyAqIEEgY29uc3QgaXMgYSBjb25zdGFudCB2YWx1ZSBkZWZpbmVkIGFjcm9zcyBsYW5ndWFnZXMgdGhhdCBoYXMgYSB0eXBlIGFuZAorICogYSB2YWx1ZS4gVGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB0aGUgZGVjbGFyZWQgdHlwZSBtaWdodCBub3QgbWF0Y2ggdGhlIHR5cGUKKyAqIG9mIHRoZSB2YWx1ZSBvYmplY3QsIHNpbmNlIHRoYXQgaXMgbm90IGRldGVybWluZWQgdW50aWwgYWZ0ZXIgcGFyc2luZyB0aGUKKyAqIHdob2xlIHRoaW5nIG91dC4KKyAqCisgKi8KK2NsYXNzIHRfY29uc3QgOiBwdWJsaWMgdF9kb2MgeworcHVibGljOgorICB0X2NvbnN0KHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgbmFtZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpCisgICAgOiB0eXBlXyh0eXBlKSwgbmFtZV8obmFtZSksIHZhbHVlXyh2YWx1ZSkge30KKworICB0X3R5cGUqIGdldF90eXBlKCkgY29uc3QgeyByZXR1cm4gdHlwZV87IH0KKworICBzdGQ6OnN0cmluZyBnZXRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisKKyAgdF9jb25zdF92YWx1ZSogZ2V0X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisKK3ByaXZhdGU6CisgIHRfdHlwZSogdHlwZV87CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZV87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTExNGNmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb25zdF92YWx1ZS5oCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9DT05TVF9WQUxVRV9ICisjZGVmaW5lIFRfQ09OU1RfVkFMVUVfSAorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZW51bS5oIgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgcGx1Z2luX291dHB1dCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+Cit2b2lkIGNvbnZlcnQoRnJvbSosIFRvJik7Cit9CisKKy8qKgorICogQSBjb25zdCB2YWx1ZSBpcyBzb21ldGhpbmcgcGFyc2VkIHRoYXQgY291bGQgYmUgYSBtYXAsIHNldCwgbGlzdCwgc3RydWN0CisgKiBvciB3aGF0ZXZlci4KKyAqCisgKi8KK2NsYXNzIHRfY29uc3RfdmFsdWUgeworcHVibGljOgorICAvKioKKyAgICogQ29tcGFyYXRvciB0byBzb3J0IGZpZWxkcyBpbiBhc2NlbmRpbmcgb3JkZXIgYnkga2V5LgorICAgKiBNYWtlIHRoaXMgYSBmdW5jdG9yIGluc3RlYWQgb2YgYSBmdW5jdGlvbiB0byBoZWxwIEdDQyBpbmxpbmUgaXQuCisgICAqLworICBzdHJ1Y3QgdmFsdWVfY29tcGFyZSB7CisgIHB1YmxpYzoKKyAgICBib29sIG9wZXJhdG9yKCkodF9jb25zdF92YWx1ZSBjb25zdCogY29uc3QmIGxlZnQsIHRfY29uc3RfdmFsdWUgY29uc3QqIGNvbnN0JiByaWdodCkgY29uc3QgeworICAgICAgcmV0dXJuICpsZWZ0IDwgKnJpZ2h0OworICAgIH0KKyAgfTsKKworICBlbnVtIHRfY29uc3RfdmFsdWVfdHlwZSB7IENWX0lOVEVHRVIsIENWX0RPVUJMRSwgQ1ZfU1RSSU5HLCBDVl9NQVAsIENWX0xJU1QsIENWX0lERU5USUZJRVIsIENWX1VOS05PV04gfTsKKworICB0X2NvbnN0X3ZhbHVlKCkgOiBpbnRWYWxfKDApLCBkb3VibGVWYWxfKDAuMGYpLCBlbnVtXygodF9lbnVtKikwKSwgdmFsVHlwZV8oQ1ZfVU5LTk9XTikge30KKworICB0X2NvbnN0X3ZhbHVlKGludDY0X3QgdmFsKSA6IGRvdWJsZVZhbF8oMC4wZiksIGVudW1fKCh0X2VudW0qKTApLCB2YWxUeXBlXyhDVl9VTktOT1dOKSB7IHNldF9pbnRlZ2VyKHZhbCk7IH0KKworICB0X2NvbnN0X3ZhbHVlKHN0ZDo6c3RyaW5nIHZhbCkgOiBpbnRWYWxfKDApLCBkb3VibGVWYWxfKDAuMGYpLCBlbnVtXygodF9lbnVtKikwKSwgdmFsVHlwZV8oQ1ZfVU5LTk9XTikgeyBzZXRfc3RyaW5nKHZhbCk7IH0KKworICB2b2lkIHNldF9zdHJpbmcoc3RkOjpzdHJpbmcgdmFsKSB7CisgICAgdmFsVHlwZV8gPSBDVl9TVFJJTkc7CisgICAgc3RyaW5nVmFsXyA9IHZhbDsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGdldF9zdHJpbmcoKSBjb25zdCB7IHJldHVybiBzdHJpbmdWYWxfOyB9CisKKyAgdm9pZCBzZXRfaW50ZWdlcihpbnQ2NF90IHZhbCkgeworICAgIHZhbFR5cGVfID0gQ1ZfSU5URUdFUjsKKyAgICBpbnRWYWxfID0gdmFsOworICB9CisKKyAgaW50NjRfdCBnZXRfaW50ZWdlcigpIGNvbnN0IHsKKyAgICBpZiAodmFsVHlwZV8gPT0gQ1ZfSURFTlRJRklFUikgeworICAgICAgaWYgKGVudW1fID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgImhhdmUgaWRlbnRpZmllciBcIiIgKyBnZXRfaWRlbnRpZmllcigpICsgIlwiLCBidXQgdW5zZXQgZW51bSBvbiBsaW5lISI7CisgICAgICB9CisgICAgICBzdGQ6OnN0cmluZyBpZGVudGlmaWVyID0gZ2V0X2lkZW50aWZpZXIoKTsKKyAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZG90ID0gaWRlbnRpZmllci5yZmluZCgnLicpOworICAgICAgaWYgKGRvdCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBpZGVudGlmaWVyID0gaWRlbnRpZmllci5zdWJzdHIoZG90ICsgMSk7CisgICAgICB9CisgICAgICB0X2VudW1fdmFsdWUqIHZhbCA9IGVudW1fLT5nZXRfY29uc3RhbnRfYnlfbmFtZShpZGVudGlmaWVyKTsKKyAgICAgIGlmICh2YWwgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAiVW5hYmxlIHRvIGZpbmQgZW51bSB2YWx1ZSBcIiIgKyBpZGVudGlmaWVyICsgIlwiIGluIGVudW0gXCIiICsgZW51bV8tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICsgIlwiIjsKKyAgICAgIH0KKyAgICAgIHJldHVybiB2YWwtPmdldF92YWx1ZSgpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gaW50VmFsXzsKKyAgICB9CisgIH0KKworICB2b2lkIHNldF9kb3VibGUoZG91YmxlIHZhbCkgeworICAgIHZhbFR5cGVfID0gQ1ZfRE9VQkxFOworICAgIGRvdWJsZVZhbF8gPSB2YWw7CisgIH0KKworICBkb3VibGUgZ2V0X2RvdWJsZSgpIGNvbnN0IHsgcmV0dXJuIGRvdWJsZVZhbF87IH0KKworICB2b2lkIHNldF9tYXAoKSB7IHZhbFR5cGVfID0gQ1ZfTUFQOyB9CisKKyAgdm9pZCBhZGRfbWFwKHRfY29uc3RfdmFsdWUqIGtleSwgdF9jb25zdF92YWx1ZSogdmFsKSB7IG1hcFZhbF9ba2V5XSA9IHZhbDsgfQorCisgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIGdldF9tYXAoKSBjb25zdCB7IHJldHVybiBtYXBWYWxfOyB9CisKKyAgdm9pZCBzZXRfbGlzdCgpIHsgdmFsVHlwZV8gPSBDVl9MSVNUOyB9CisKKyAgdm9pZCBhZGRfbGlzdCh0X2NvbnN0X3ZhbHVlKiB2YWwpIHsgbGlzdFZhbF8ucHVzaF9iYWNrKHZhbCk7IH0KKworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIGdldF9saXN0KCkgY29uc3QgeyByZXR1cm4gbGlzdFZhbF87IH0KKworICB2b2lkIHNldF9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIHZhbCkgeworICAgIHZhbFR5cGVfID0gQ1ZfSURFTlRJRklFUjsKKyAgICBpZGVudGlmaWVyVmFsXyA9IHZhbDsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGdldF9pZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gaWRlbnRpZmllclZhbF87IH0KKworICBzdGQ6OnN0cmluZyBnZXRfaWRlbnRpZmllcl9uYW1lKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nIHJldCA9IGdldF9pZGVudGlmaWVyKCk7CisgICAgc2l6ZV90IHMgPSByZXQuZmluZCgnLicpOworICAgIGlmIChzID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICB0aHJvdyAiZXJyb3I6IGlkZW50aWZpZXIgIiArIHJldCArICIgaXMgdW5xdWFsaWZpZWQhIjsKKyAgICB9CisgICAgcmV0ID0gcmV0LnN1YnN0cihzICsgMSk7CisgICAgcyA9IHJldC5maW5kKCcuJyk7CisgICAgaWYgKHMgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHJldCA9IHJldC5zdWJzdHIocyArIDEpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0X2lkZW50aWZpZXJfd2l0aF9wYXJlbnQoKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmcgcmV0ID0gZ2V0X2lkZW50aWZpZXIoKTsKKyAgICBzaXplX3QgcyA9IHJldC5maW5kKCcuJyk7CisgICAgaWYgKHMgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHRocm93ICJlcnJvcjogaWRlbnRpZmllciAiICsgcmV0ICsgIiBpcyB1bnF1YWxpZmllZCEiOworICAgIH0KKyAgICBzaXplX3QgczIgPSByZXQuZmluZCgnLicsIHMgKyAxKTsKKyAgICBpZiAoczIgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHJldCA9IHJldC5zdWJzdHIocyArIDEpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgdm9pZCBzZXRfZW51bSh0X2VudW0qIHRlbnVtKSB7IGVudW1fID0gdGVudW07IH0KKworICB0X2NvbnN0X3ZhbHVlX3R5cGUgZ2V0X3R5cGUoKSBjb25zdCB7IGlmICh2YWxUeXBlXyA9PSBDVl9VTktOT1dOKSB7IHRocm93IHN0ZDo6c3RyaW5nKCJ1bmtub3duIHRfY29uc3RfdmFsdWUiKTsgfSByZXR1cm4gdmFsVHlwZV87IH0KKworICAvKioKKyAgICogQ29tcGFyYXRvciB0byBzb3J0IG1hcCBmaWVsZHMgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IGtleSBhbmQgdGhlbiB2YWx1ZS4KKyAgICogVGhpcyBpcyB1c2VkIGZvciBtYXAgY29tcGFyaXNvbiBpbiBsZXhpY29ncmFwaGljIG9yZGVyLgorICAgKi8KKyAgc3RydWN0IG1hcF9lbnRyeV9jb21wYXJlIHsKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+IENvbnN0UGFpcjsKKyAgcHVibGljOgorICAgIGJvb2wgb3BlcmF0b3IoKShDb25zdFBhaXIgbGVmdCwgQ29uc3RQYWlyIHJpZ2h0KSBjb25zdCB7CisgICAgICBpZiAoKihsZWZ0LmZpcnN0KSA8ICoocmlnaHQuZmlyc3QpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCoocmlnaHQuZmlyc3QpIDwgKihsZWZ0LmZpcnN0KSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gKihsZWZ0LnNlY29uZCkgPCAqKHJpZ2h0LnNlY29uZCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgYm9vbCBvcGVyYXRvciA8IChjb25zdCB0X2NvbnN0X3ZhbHVlJiB0aGF0KSBjb25zdCB7CisgICAgOjp0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGUgdDEgPSBnZXRfdHlwZSgpOworICAgIDo6dF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlIHQyID0gdGhhdC5nZXRfdHlwZSgpOworICAgIGlmICh0MSAhPSB0MikKKyAgICAgIHJldHVybiB0MSA8IHQyOworICAgIHN3aXRjaCAodDEpIHsKKyAgICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjoKKyAgICAgIHJldHVybiBpbnRWYWxfIDwgdGhhdC5pbnRWYWxfOworICAgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEU6CisgICAgICByZXR1cm4gZG91YmxlVmFsXyA8IHRoYXQuZG91YmxlVmFsXzsKKyAgICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgorICAgICAgcmV0dXJuIHN0cmluZ1ZhbF8gPCB0aGF0LnN0cmluZ1ZhbF87CisgICAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVI6CisgICAgICByZXR1cm4gaWRlbnRpZmllclZhbF8gPCB0aGF0LmlkZW50aWZpZXJWYWxfOworICAgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6CisgICAgICByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSgKKyAgICAgICAgICBtYXBWYWxfLmJlZ2luKCksIG1hcFZhbF8uZW5kKCksIHRoYXQubWFwVmFsXy5iZWdpbigpLCB0aGF0Lm1hcFZhbF8uZW5kKCksIG1hcF9lbnRyeV9jb21wYXJlKCkpOworICAgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOgorICAgICAgcmV0dXJuIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoCisgICAgICAgICAgbGlzdFZhbF8uYmVnaW4oKSwgbGlzdFZhbF8uZW5kKCksIHRoYXQubGlzdFZhbF8uYmVnaW4oKSwgdGhhdC5saXN0VmFsXy5lbmQoKSwgdmFsdWVfY29tcGFyZSgpKTsKKyAgICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgInVua25vd24gdmFsdWUgdHlwZSI7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdmFsdWVfY29tcGFyZT4gbWFwVmFsXzsKKyAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3RWYWxfOworICBzdGQ6OnN0cmluZyBzdHJpbmdWYWxfOworICBpbnQ2NF90IGludFZhbF87CisgIGRvdWJsZSBkb3VibGVWYWxfOworICBzdGQ6OnN0cmluZyBpZGVudGlmaWVyVmFsXzsKKyAgdF9lbnVtKiBlbnVtXzsKKworICB0X2NvbnN0X3ZhbHVlX3R5cGUgdmFsVHlwZV87CisKKyAgLy8gdG8gcmVhZCBlbnVtXworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+CisgIGZyaWVuZCB2b2lkIHBsdWdpbl9vdXRwdXQ6OmNvbnZlcnQoRnJvbSosIFRvJik7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZGFiNzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0NPTlRBSU5FUl9ICisjZGVmaW5lIFRfQ09OVEFJTkVSX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKworY2xhc3MgdF9jb250YWluZXIgOiBwdWJsaWMgdF90eXBlIHsKK3B1YmxpYzoKKyAgdF9jb250YWluZXIoKSA6IGNwcF9uYW1lXygpLCBoYXNfY3BwX25hbWVfKGZhbHNlKSB7fQorCisgIHZpcnR1YWwgfnRfY29udGFpbmVyKCkge30KKworICB2b2lkIHNldF9jcHBfbmFtZShzdGQ6OnN0cmluZyBjcHBfbmFtZSkgeworICAgIGNwcF9uYW1lXyA9IGNwcF9uYW1lOworICAgIGhhc19jcHBfbmFtZV8gPSB0cnVlOworICB9CisKKyAgYm9vbCBoYXNfY3BwX25hbWUoKSBjb25zdCB7IHJldHVybiBoYXNfY3BwX25hbWVfOyB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0X2NwcF9uYW1lKCkgY29uc3QgeyByZXR1cm4gY3BwX25hbWVfOyB9CisKKyAgYm9vbCBpc19jb250YWluZXIoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIGNwcF9uYW1lXzsKKyAgYm9vbCBoYXNfY3BwX25hbWVfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2RvYy5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9kb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmNiOGY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9kb2MuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9ET0NfSAorI2RlZmluZSBUX0RPQ19ICisKKyNpbmNsdWRlICJ0aHJpZnQvZ2xvYmFscy5oIgorI2luY2x1ZGUgInRocmlmdC9sb2dnaW5nLmgiCisKKy8qKgorICogRG9jdW1lbnRhdGlvbiBzdHVicworICoKKyAqLworY2xhc3MgdF9kb2MgeworCitwdWJsaWM6CisgIHRfZG9jKCkgOiBoYXNfZG9jXyhmYWxzZSkge30KKyAgdmlydHVhbCB+dF9kb2MoKSB7fQorCisgIHZvaWQgc2V0X2RvYyhjb25zdCBzdGQ6OnN0cmluZyYgZG9jKSB7CisgICAgZG9jXyA9IGRvYzsKKyAgICBoYXNfZG9jXyA9IHRydWU7CisgICAgaWYgKChnX3Byb2dyYW1fZG9jdGV4dF9saW5lbm8gPT0gZ19kb2N0ZXh0X2xpbmVubykKKyAgICAgICAgJiYgKGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9PSBTVElMTF9DQU5ESURBVEUpKSB7CisgICAgICBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBBTFJFQURZX1BST0NFU1NFRDsKKyAgICAgIHBkZWJ1ZygiJXMiLCAicHJvZ3JhbSBkb2N0ZXh0IHNldCB0byBBTFJFQURZX1BST0NFU1NFRCIpOworICAgIH0KKyAgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfZG9jKCkgY29uc3QgeyByZXR1cm4gZG9jXzsgfQorCisgIGJvb2wgaGFzX2RvYygpIHsgcmV0dXJuIGhhc19kb2NfOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIGRvY187CisgIGJvb2wgaGFzX2RvY187Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZW51bS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9lbnVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyMzc4MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZW51bS5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9FTlVNX0gKKyNkZWZpbmUgVF9FTlVNX0gKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2VudW1fdmFsdWUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisKKy8qKgorICogQW4gZW51bWVyYXRlZCB0eXBlLiBBIGxpc3Qgb2YgY29uc3RhbnQgb2JqZWN0cyB3aXRoIGEgbmFtZSBmb3IgdGhlIHR5cGUuCisgKgorICovCitjbGFzcyB0X2VudW0gOiBwdWJsaWMgdF90eXBlIHsKK3B1YmxpYzoKKyAgdF9lbnVtKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOiB0X3R5cGUocHJvZ3JhbSkge30KKworICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7IG5hbWVfID0gbmFtZTsgfQorCisgIHZvaWQgYXBwZW5kKHRfZW51bV92YWx1ZSogY29uc3RhbnQpIHsgY29uc3RhbnRzXy5wdXNoX2JhY2soY29uc3RhbnQpOyB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGdldF9jb25zdGFudHMoKSBjb25zdCB7IHJldHVybiBjb25zdGFudHNfOyB9CisKKyAgdF9lbnVtX3ZhbHVlKiBnZXRfY29uc3RhbnRfYnlfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9IGdldF9jb25zdGFudHMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X25hbWUoKSA9PSBuYW1lKSB7CisgICAgICAgIHJldHVybiAqY19pdGVyOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHRfZW51bV92YWx1ZSogZ2V0X2NvbnN0YW50X2J5X3ZhbHVlKGludDY0X3QgdmFsdWUpIHsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSBnZXRfY29uc3RhbnRzKCk7CisgICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIGlmICgoKmNfaXRlciktPmdldF92YWx1ZSgpID09IHZhbHVlKSB7CisgICAgICAgIHJldHVybiAqY19pdGVyOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHRfZW51bV92YWx1ZSogZ2V0X21pbl92YWx1ZSgpIHsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSBnZXRfY29uc3RhbnRzKCk7CisgICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgICB0X2VudW1fdmFsdWUqIG1pbl92YWx1ZTsKKyAgICBpZiAoZW51bV92YWx1ZXMuc2l6ZSgpID09IDApIHsKKyAgICAgIG1pbl92YWx1ZSA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgIGludCBtaW5fdmFsdWVfdmFsdWU7CisgICAgICBtaW5fdmFsdWUgPSBlbnVtX3ZhbHVlcy5mcm9udCgpOworICAgICAgbWluX3ZhbHVlX3ZhbHVlID0gbWluX3ZhbHVlLT5nZXRfdmFsdWUoKTsKKyAgICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSA8IG1pbl92YWx1ZV92YWx1ZSkgeworICAgICAgICAgIG1pbl92YWx1ZSA9ICgqY19pdGVyKTsKKyAgICAgICAgICBtaW5fdmFsdWVfdmFsdWUgPSBtaW5fdmFsdWUtPmdldF92YWx1ZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBtaW5fdmFsdWU7CisgIH0KKworICB0X2VudW1fdmFsdWUqIGdldF9tYXhfdmFsdWUoKSB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gZ2V0X2NvbnN0YW50cygpOworICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgICAgdF9lbnVtX3ZhbHVlKiBtYXhfdmFsdWU7CisgICAgaWYgKGVudW1fdmFsdWVzLnNpemUoKSA9PSAwKSB7CisgICAgICBtYXhfdmFsdWUgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICBpbnQgbWF4X3ZhbHVlX3ZhbHVlOworICAgICAgbWF4X3ZhbHVlID0gZW51bV92YWx1ZXMuYmFjaygpOworICAgICAgbWF4X3ZhbHVlX3ZhbHVlID0gbWF4X3ZhbHVlLT5nZXRfdmFsdWUoKTsKKyAgICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSA+IG1heF92YWx1ZV92YWx1ZSkgeworICAgICAgICAgIG1heF92YWx1ZSA9ICgqY19pdGVyKTsKKyAgICAgICAgICBtYXhfdmFsdWVfdmFsdWUgPSBtYXhfdmFsdWUtPmdldF92YWx1ZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBtYXhfdmFsdWU7CisgIH0KKworICBib29sIGlzX2VudW0oKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50c187Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZW51bV92YWx1ZS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9lbnVtX3ZhbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBiZjNhZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZW51bV92YWx1ZS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0VOVU1fVkFMVUVfSAorI2RlZmluZSBUX0VOVU1fVkFMVUVfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9kb2MuaCIKKworLyoqCisgKiBBIGNvbnN0YW50LiBUaGVzZSBhcmUgdXNlZCBpbnNpZGUgb2YgZW51bSBkZWZpbml0aW9ucy4gQ29uc3RhbnRzIGFyZSBqdXN0CisgKiBzeW1ib2wgaWRlbnRpZmllcnMgdGhhdCBtYXkgb3IgbWF5IG5vdCBoYXZlIGFuIGV4cGxpY2l0IHZhbHVlIGFzc29jaWF0ZWQKKyAqIHdpdGggdGhlbS4KKyAqCisgKi8KK2NsYXNzIHRfZW51bV92YWx1ZSA6IHB1YmxpYyB0X2RvYyB7CitwdWJsaWM6CisgIHRfZW51bV92YWx1ZShzdGQ6OnN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIDogbmFtZV8obmFtZSksIHZhbHVlXyh2YWx1ZSkge30KKworICB+dF9lbnVtX3ZhbHVlKCkge30KKworICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorCisgIGludCBnZXRfdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zXzsKKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgbmFtZV87CisgIGludCB2YWx1ZV87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZmllbGQuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZmllbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWYxZjgwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9maWVsZC5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9GSUVMRF9ICisjZGVmaW5lIFRfRklFTERfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZG9jLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorCisvLyBGb3J3YXJkIGRlY2xhcmUgZm9yIHhzZF9hdHRycworY2xhc3MgdF9zdHJ1Y3Q7CisKKy8qKgorICogQ2xhc3MgdG8gcmVwcmVzZW50IGEgZmllbGQgaW4gYSB0aHJpZnQgc3RydWN0dXJlLiBBIGZpZWxkIGhhcyBhIGRhdGEgdHlwZSwKKyAqIGEgc3ltYm9saWMgbmFtZSwgYW5kIGEgbnVtZXJpYyBpZGVudGlmaWVyLgorICoKKyAqLworY2xhc3MgdF9maWVsZCA6IHB1YmxpYyB0X2RvYyB7CitwdWJsaWM6CisgIHRfZmllbGQodF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBuYW1lKQorICAgIDogdHlwZV8odHlwZSksCisgICAgICBuYW1lXyhuYW1lKSwKKyAgICAgIGtleV8oMCksCisgICAgICB2YWx1ZV8oTlVMTCksCisgICAgICB4c2Rfb3B0aW9uYWxfKGZhbHNlKSwKKyAgICAgIHhzZF9uaWxsYWJsZV8oZmFsc2UpLAorICAgICAgeHNkX2F0dHJzXyhOVUxMKSwKKyAgICAgIHJlZmVyZW5jZV8oZmFsc2UpIHt9CisKKyAgdF9maWVsZCh0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIG5hbWUsIGludDMyX3Qga2V5KQorICAgIDogdHlwZV8odHlwZSksCisgICAgICBuYW1lXyhuYW1lKSwKKyAgICAgIGtleV8oa2V5KSwKKyAgICAgIHJlcV8oVF9PUFRfSU5fUkVRX09VVCksCisgICAgICB2YWx1ZV8oTlVMTCksCisgICAgICB4c2Rfb3B0aW9uYWxfKGZhbHNlKSwKKyAgICAgIHhzZF9uaWxsYWJsZV8oZmFsc2UpLAorICAgICAgeHNkX2F0dHJzXyhOVUxMKSwKKyAgICAgIHJlZmVyZW5jZV8oZmFsc2UpIHt9CisKKyAgfnRfZmllbGQoKSB7fQorCisgIHRfdHlwZSogZ2V0X3R5cGUoKSB7IHJldHVybiB0eXBlXzsgfQorCisgIGNvbnN0IHRfdHlwZSogZ2V0X3R5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisKKyAgaW50MzJfdCBnZXRfa2V5KCkgY29uc3QgeyByZXR1cm4ga2V5XzsgfQorCisgIGVudW0gZV9yZXEgeyBUX1JFUVVJUkVELCBUX09QVElPTkFMLCBUX09QVF9JTl9SRVFfT1VUIH07CisKKyAgdm9pZCBzZXRfcmVxKGVfcmVxIHJlcSkgeyByZXFfID0gcmVxOyB9CisKKyAgZV9yZXEgZ2V0X3JlcSgpIGNvbnN0IHsgcmV0dXJuIHJlcV87IH0KKworICB2b2lkIHNldF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeyB2YWx1ZV8gPSB2YWx1ZTsgfQorCisgIHRfY29uc3RfdmFsdWUqIGdldF92YWx1ZSgpIHsgcmV0dXJuIHZhbHVlXzsgfQorCisgIGNvbnN0IHRfY29uc3RfdmFsdWUqIGdldF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorCisgIHZvaWQgc2V0X3hzZF9vcHRpb25hbChib29sIHhzZF9vcHRpb25hbCkgeyB4c2Rfb3B0aW9uYWxfID0geHNkX29wdGlvbmFsOyB9CisKKyAgYm9vbCBnZXRfeHNkX29wdGlvbmFsKCkgY29uc3QgeyByZXR1cm4geHNkX29wdGlvbmFsXzsgfQorCisgIHZvaWQgc2V0X3hzZF9uaWxsYWJsZShib29sIHhzZF9uaWxsYWJsZSkgeyB4c2RfbmlsbGFibGVfID0geHNkX25pbGxhYmxlOyB9CisKKyAgYm9vbCBnZXRfeHNkX25pbGxhYmxlKCkgY29uc3QgeyByZXR1cm4geHNkX25pbGxhYmxlXzsgfQorCisgIHZvaWQgc2V0X3hzZF9hdHRycyh0X3N0cnVjdCogeHNkX2F0dHJzKSB7IHhzZF9hdHRyc18gPSB4c2RfYXR0cnM7IH0KKworICB0X3N0cnVjdCogZ2V0X3hzZF9hdHRycygpIHsgcmV0dXJuIHhzZF9hdHRyc187IH0KKworICAvKioKKyAgICogQ29tcGFyYXRvciB0byBzb3J0IGZpZWxkcyBpbiBhc2NlbmRpbmcgb3JkZXIgYnkga2V5LgorICAgKiBNYWtlIHRoaXMgYSBmdW5jdG9yIGluc3RlYWQgb2YgYSBmdW5jdGlvbiB0byBoZWxwIEdDQyBpbmxpbmUgaXQuCisgICAqIFRoZSBhcmd1bWVudHMgYXJlIChjb25zdCkgcmVmZXJlbmNlcyB0byBjb25zdCBwb2ludGVycyB0byBjb25zdCB0X2ZpZWxkcy4KKyAgICovCisgIHN0cnVjdCBrZXlfY29tcGFyZSB7CisgICAgYm9vbCBvcGVyYXRvcigpKHRfZmllbGQgY29uc3QqIGNvbnN0JiBhLCB0X2ZpZWxkIGNvbnN0KiBjb25zdCYgYikgeworICAgICAgcmV0dXJuIGEtPmdldF9rZXkoKSA8IGItPmdldF9rZXkoKTsKKyAgICB9CisgIH07CisKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9uc187CisKKyAgYm9vbCBnZXRfcmVmZXJlbmNlKCkgeyByZXR1cm4gcmVmZXJlbmNlXzsgfQorCisgIHZvaWQgc2V0X3JlZmVyZW5jZShib29sIHJlZmVyZW5jZSkgeyByZWZlcmVuY2VfID0gcmVmZXJlbmNlOyB9CisKK3ByaXZhdGU6CisgIHRfdHlwZSogdHlwZV87CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworICBpbnQzMl90IGtleV87CisgIGVfcmVxIHJlcV87CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlXzsKKworICBib29sIHhzZF9vcHRpb25hbF87CisgIGJvb2wgeHNkX25pbGxhYmxlXzsKKyAgdF9zdHJ1Y3QqIHhzZF9hdHRyc187CisgIGJvb2wgcmVmZXJlbmNlXzsKK307CisKKy8qKgorICogQSBzaW1wbGUgc3RydWN0IGZvciB0aGUgcGFyc2VyIHRvIHVzZSB0byBzdG9yZSBhIGZpZWxkIElELCBhbmQgd2hldGhlciBvcgorICogbm90IGl0IHdhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgb3IgYXV0b21hdGljYWxseSBjaG9zZW4uCisgKi8KK3N0cnVjdCB0X2ZpZWxkX2lkIHsKKyAgaW50MzJfdCB2YWx1ZTsKKyAgYm9vbCBhdXRvX2Fzc2lnbmVkOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2Z1bmN0aW9uLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2Z1bmN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkMjYwOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaApAQCAtMCwwICsxLDkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9GVU5DVElPTl9ICisjZGVmaW5lIFRfRlVOQ1RJT05fSAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zdHJ1Y3QuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9kb2MuaCIKKworLyoqCisgKiBSZXByZXNlbnRhdGlvbiBvZiBhIGZ1bmN0aW9uLiBLZXkgcGFydHMgYXJlIHJldHVybiB0eXBlLCBmdW5jdGlvbiBuYW1lLAorICogb3B0aW9uYWwgbW9kaWZpZXJzLCBhbmQgYW4gYXJndW1lbnQgbGlzdCwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgYXMgYSB0aHJpZnQKKyAqIHN0cnVjdC4KKyAqCisgKi8KK2NsYXNzIHRfZnVuY3Rpb24gOiBwdWJsaWMgdF9kb2MgeworcHVibGljOgorICB0X2Z1bmN0aW9uKHRfdHlwZSogcmV0dXJudHlwZSwgc3RkOjpzdHJpbmcgbmFtZSwgdF9zdHJ1Y3QqIGFyZ2xpc3QsIGJvb2wgb25ld2F5ID0gZmFsc2UpCisgICAgOiByZXR1cm50eXBlXyhyZXR1cm50eXBlKSwKKyAgICAgIG5hbWVfKG5hbWUpLAorICAgICAgYXJnbGlzdF8oYXJnbGlzdCksCisgICAgICB4Y2VwdGlvbnNfKG5ldyB0X3N0cnVjdChOVUxMKSksCisgICAgICBvd25feGNlcHRpb25zXyh0cnVlKSwKKyAgICAgIG9uZXdheV8ob25ld2F5KSB7CisgICAgaWYgKG9uZXdheV8gJiYgKCFyZXR1cm50eXBlXy0+aXNfdm9pZCgpKSkgeworICAgICAgcHdhcm5pbmcoMSwgIk9uZXdheSBtZXRob2RzIHNob3VsZCByZXR1cm4gdm9pZC5cbiIpOworICAgIH0KKyAgfQorCisgIHRfZnVuY3Rpb24odF90eXBlKiByZXR1cm50eXBlLAorICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgdF9zdHJ1Y3QqIGFyZ2xpc3QsCisgICAgICAgICAgICAgdF9zdHJ1Y3QqIHhjZXB0aW9ucywKKyAgICAgICAgICAgICBib29sIG9uZXdheSA9IGZhbHNlKQorICAgIDogcmV0dXJudHlwZV8ocmV0dXJudHlwZSksCisgICAgICBuYW1lXyhuYW1lKSwKKyAgICAgIGFyZ2xpc3RfKGFyZ2xpc3QpLAorICAgICAgeGNlcHRpb25zXyh4Y2VwdGlvbnMpLAorICAgICAgb3duX3hjZXB0aW9uc18oZmFsc2UpLAorICAgICAgb25ld2F5XyhvbmV3YXkpIHsKKyAgICBpZiAob25ld2F5XyAmJiAheGNlcHRpb25zXy0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpKSB7CisgICAgICB0aHJvdyBzdGQ6OnN0cmluZygiT25ld2F5IG1ldGhvZHMgY2FuJ3QgdGhyb3cgZXhjZXB0aW9ucy4iKTsKKyAgICB9CisgICAgaWYgKG9uZXdheV8gJiYgKCFyZXR1cm50eXBlXy0+aXNfdm9pZCgpKSkgeworICAgICAgcHdhcm5pbmcoMSwgIk9uZXdheSBtZXRob2RzIHNob3VsZCByZXR1cm4gdm9pZC5cbiIpOworICAgIH0KKyAgfQorCisgIH50X2Z1bmN0aW9uKCkgeworICAgIGlmIChvd25feGNlcHRpb25zXykKKyAgICAgIGRlbGV0ZSB4Y2VwdGlvbnNfOworICB9CisKKyAgdF90eXBlKiBnZXRfcmV0dXJudHlwZSgpIGNvbnN0IHsgcmV0dXJuIHJldHVybnR5cGVfOyB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KKworICB0X3N0cnVjdCogZ2V0X2FyZ2xpc3QoKSBjb25zdCB7IHJldHVybiBhcmdsaXN0XzsgfQorCisgIHRfc3RydWN0KiBnZXRfeGNlcHRpb25zKCkgY29uc3QgeyByZXR1cm4geGNlcHRpb25zXzsgfQorCisgIGJvb2wgaXNfb25ld2F5KCkgY29uc3QgeyByZXR1cm4gb25ld2F5XzsgfQorCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnNfOworCitwcml2YXRlOgorICB0X3R5cGUqIHJldHVybnR5cGVfOworICBzdGQ6OnN0cmluZyBuYW1lXzsKKyAgdF9zdHJ1Y3QqIGFyZ2xpc3RfOworICB0X3N0cnVjdCogeGNlcHRpb25zXzsKKyAgYm9vbCBvd25feGNlcHRpb25zXzsKKyAgYm9vbCBvbmV3YXlfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2xpc3QuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZjY4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2xpc3QuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9MSVNUX0gKKyNkZWZpbmUgVF9MSVNUX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oIgorCisvKioKKyAqIEEgbGlzdCBpcyBhIGxpZ2h0d2VpZ2h0IGNvbnRhaW5lciB0eXBlIHRoYXQganVzdCB3cmFwcyBhbm90aGVyIGRhdGEgdHlwZS4KKyAqCisgKi8KK2NsYXNzIHRfbGlzdCA6IHB1YmxpYyB0X2NvbnRhaW5lciB7CitwdWJsaWM6CisgIHRfbGlzdCh0X3R5cGUqIGVsZW1fdHlwZSkgOiBlbGVtX3R5cGVfKGVsZW1fdHlwZSkge30KKworICB0X3R5cGUqIGdldF9lbGVtX3R5cGUoKSBjb25zdCB7IHJldHVybiBlbGVtX3R5cGVfOyB9CisKKyAgYm9vbCBpc19saXN0KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCitwcml2YXRlOgorICB0X3R5cGUqIGVsZW1fdHlwZV87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfbWFwLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkM2YwODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X21hcC5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX01BUF9ICisjZGVmaW5lIFRfTUFQX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oIgorCisvKioKKyAqIEEgbWFwIGlzIGEgbGlnaHR3ZWlnaHQgY29udGFpbmVyIHR5cGUgdGhhdCBqdXN0IHdyYXBzIGFub3RoZXIgdHdvIGRhdGEKKyAqIHR5cGVzLgorICoKKyAqLworY2xhc3MgdF9tYXAgOiBwdWJsaWMgdF9jb250YWluZXIgeworcHVibGljOgorICB0X21hcCh0X3R5cGUqIGtleV90eXBlLCB0X3R5cGUqIHZhbF90eXBlKSA6IGtleV90eXBlXyhrZXlfdHlwZSksIHZhbF90eXBlXyh2YWxfdHlwZSkge30KKworICB0X3R5cGUqIGdldF9rZXlfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGtleV90eXBlXzsgfQorCisgIHRfdHlwZSogZ2V0X3ZhbF90eXBlKCkgY29uc3QgeyByZXR1cm4gdmFsX3R5cGVfOyB9CisKKyAgYm9vbCBpc19tYXAoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHRfdHlwZSoga2V5X3R5cGVfOworICB0X3R5cGUqIHZhbF90eXBlXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3Byb2dyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2RkNDVhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgKQEAgLTAsMCArMSwzOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1BST0dSQU1fSAorI2RlZmluZSBUX1BST0dSQU1fSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIEZvciBwcm9ncmFtX25hbWUoKQorI2luY2x1ZGUgInRocmlmdC9tYWluLmgiCisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9kb2MuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zY29wZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGVkZWYuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9lbnVtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29uc3QuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zdHJ1Y3QuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zZXJ2aWNlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfbGlzdC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X21hcC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3NldC5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIgorLy8jaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZG9jLmgiCisKKy8qKgorICogVG9wIGxldmVsIGNsYXNzIHJlcHJlc2VudGluZyBhbiBlbnRpcmUgdGhyaWZ0IHByb2dyYW0uIEEgcHJvZ3JhbSBjb25zaXN0cworICogZnVuZGFtZW50YWxseSBvZiB0aGUgZm9sbG93aW5nOgorICoKKyAqICAgVHlwZWRlZnMKKyAqICAgRW51bWVyYXRpb25zCisgKiAgIENvbnN0YW50cworICogICBTdHJ1Y3RzCisgKiAgIEV4Y2VwdGlvbnMKKyAqICAgU2VydmljZXMKKyAqCisgKiBUaGUgcHJvZ3JhbSBtb2R1bGUgYWxzbyBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIGJhc2UgdHlwZXMuCisgKgorICovCitjbGFzcyB0X3Byb2dyYW0gOiBwdWJsaWMgdF9kb2MgeworcHVibGljOgorICB0X3Byb2dyYW0oc3RkOjpzdHJpbmcgcGF0aCwgc3RkOjpzdHJpbmcgbmFtZSkKKyAgICA6IHBhdGhfKHBhdGgpLCBuYW1lXyhuYW1lKSwgb3V0X3BhdGhfKCIuLyIpLCBvdXRfcGF0aF9pc19hYnNvbHV0ZV8oZmFsc2UpLCBzY29wZV8obmV3IHRfc2NvcGUpIHt9CisKKyAgdF9wcm9ncmFtKHN0ZDo6c3RyaW5nIHBhdGgpIDogcGF0aF8ocGF0aCksIG91dF9wYXRoXygiLi8iKSwgb3V0X3BhdGhfaXNfYWJzb2x1dGVfKGZhbHNlKSB7CisgICAgbmFtZV8gPSBwcm9ncmFtX25hbWUocGF0aCk7CisgICAgc2NvcGVfID0gbmV3IHRfc2NvcGUoKTsKKyAgfQorCisgIH50X3Byb2dyYW0oKSB7CisgICAgaWYgKHNjb3BlXykgeworICAgICAgZGVsZXRlIHNjb3BlXzsKKyAgICAgIHNjb3BlXyA9IE5VTEw7CisgICAgfQorICB9CisKKyAgLy8gUGF0aCBhY2Nlc3NvcgorICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X3BhdGgoKSBjb25zdCB7IHJldHVybiBwYXRoXzsgfQorCisgIC8vIE91dHB1dCBwYXRoIGFjY2Vzc29yCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfb3V0X3BhdGgoKSBjb25zdCB7IHJldHVybiBvdXRfcGF0aF87IH0KKworICAvLyBDcmVhdGUgZ2VuLSogZGlyIGFjY2Vzc29yCisgIGJvb2wgaXNfb3V0X3BhdGhfYWJzb2x1dGUoKSBjb25zdCB7IHJldHVybiBvdXRfcGF0aF9pc19hYnNvbHV0ZV87IH0KKworICAvLyBOYW1lIGFjY2Vzc29yCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisKKyAgLy8gTmFtZXNwYWNlCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZXNwYWNlKCkgY29uc3QgeyByZXR1cm4gbmFtZXNwYWNlXzsgfQorCisgIC8vIEluY2x1ZGUgcHJlZml4IGFjY2Vzc29yCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfaW5jbHVkZV9wcmVmaXgoKSBjb25zdCB7IHJldHVybiBpbmNsdWRlX3ByZWZpeF87IH0KKworICAvLyBBY2Nlc3NvcnMgZm9yIHByb2dyYW0gZWxlbWVudHMKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF90eXBlZGVmKj4mIGdldF90eXBlZGVmcygpIGNvbnN0IHsgcmV0dXJuIHR5cGVkZWZzXzsgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW0qPiYgZ2V0X2VudW1zKCkgY29uc3QgeyByZXR1cm4gZW51bXNfOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3QqPiYgZ2V0X2NvbnN0cygpIGNvbnN0IHsgcmV0dXJuIGNvbnN0c187IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiYgZ2V0X3N0cnVjdHMoKSBjb25zdCB7IHJldHVybiBzdHJ1Y3RzXzsgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBnZXRfeGNlcHRpb25zKCkgY29uc3QgeyByZXR1cm4geGNlcHRpb25zXzsgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBnZXRfb2JqZWN0cygpIGNvbnN0IHsgcmV0dXJuIG9iamVjdHNfOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+JiBnZXRfc2VydmljZXMoKSBjb25zdCB7IHJldHVybiBzZXJ2aWNlc187IH0KKyAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgZ2V0X25hbWVzcGFjZXMoKSBjb25zdCB7IHJldHVybiBuYW1lc3BhY2VzXzsgfQorCisgIC8vIFByb2dyYW0gZWxlbWVudHMKKyAgdm9pZCBhZGRfdHlwZWRlZih0X3R5cGVkZWYqIHRkKSB7IHR5cGVkZWZzXy5wdXNoX2JhY2sodGQpOyB9CisgIHZvaWQgYWRkX2VudW0odF9lbnVtKiB0ZSkgeyBlbnVtc18ucHVzaF9iYWNrKHRlKTsgfQorICB2b2lkIGFkZF9jb25zdCh0X2NvbnN0KiB0YykgeyBjb25zdHNfLnB1c2hfYmFjayh0Yyk7IH0KKyAgdm9pZCBhZGRfc3RydWN0KHRfc3RydWN0KiB0cykgeworICAgIG9iamVjdHNfLnB1c2hfYmFjayh0cyk7CisgICAgc3RydWN0c18ucHVzaF9iYWNrKHRzKTsKKyAgfQorICB2b2lkIGFkZF94Y2VwdGlvbih0X3N0cnVjdCogdHgpIHsKKyAgICBvYmplY3RzXy5wdXNoX2JhY2sodHgpOworICAgIHhjZXB0aW9uc18ucHVzaF9iYWNrKHR4KTsKKyAgfQorICB2b2lkIGFkZF9zZXJ2aWNlKHRfc2VydmljZSogdHMpIHsgc2VydmljZXNfLnB1c2hfYmFjayh0cyk7IH0KKworICAvLyBQcm9ncmFtcyB0byBpbmNsdWRlCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBnZXRfaW5jbHVkZXMoKSBjb25zdCB7IHJldHVybiBpbmNsdWRlc187IH0KKworICB2b2lkIHNldF9vdXRfcGF0aChzdGQ6OnN0cmluZyBvdXRfcGF0aCwgYm9vbCBvdXRfcGF0aF9pc19hYnNvbHV0ZSkgeworICAgIG91dF9wYXRoXyA9IG91dF9wYXRoOworICAgIG91dF9wYXRoX2lzX2Fic29sdXRlXyA9IG91dF9wYXRoX2lzX2Fic29sdXRlOworICAgIC8vIEVuc3VyZSB0aGF0IGl0IGVuZHMgd2l0aCBhIHRyYWlsaW5nICcvJyAob3IgJ1wnIGZvciB3aW5kb3dzIG1hY2hpbmVzKQorICAgIGNoYXIgYyA9IG91dF9wYXRoXy5hdChvdXRfcGF0aF8uc2l6ZSgpIC0gMSk7CisgICAgaWYgKCEoYyA9PSAnLycgfHwgYyA9PSAnXFwnKSkgeworICAgICAgb3V0X3BhdGhfLnB1c2hfYmFjaygnLycpOworICAgIH0KKyAgfQorCisgIC8vIFR5cGVuYW1lIGNvbGxpc2lvbiBkZXRlY3Rpb24KKyAgLyoqCisgICAqIFNlYXJjaCBmb3IgdHlwZW5hbWUgY29sbGlzaW9ucworICAgKiBAcGFyYW0gdCAgICB0aGUgdHlwZSB0byB0ZXN0IGZvciBjb2xsaXNpb25zCisgICAqIEByZXR1cm4gICAgIHRydWUgaWYgYSBjZXJ0YWluIGNvbGxpc2lvbiB3YXMgZm91bmQsIG90aGVyd2lzZSBmYWxzZQorICAgKi8KKyAgYm9vbCBpc191bmlxdWVfdHlwZW5hbWUodF90eXBlKiB0KSB7CisgICAgaW50IG9jY3VycmVuY2VzID0gcHJvZ3JhbV90eXBlbmFtZV9jb3VudCh0aGlzLCB0KTsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+OjppdGVyYXRvciBpdCA9IGluY2x1ZGVzXy5iZWdpbigpOyBpdCAhPSBpbmNsdWRlc18uZW5kKCk7ICsraXQpIHsKKyAgICAgIG9jY3VycmVuY2VzICs9IHByb2dyYW1fdHlwZW5hbWVfY291bnQoKml0LCB0KTsKKyAgICB9CisgICAgcmV0dXJuIDAgPT0gb2NjdXJyZW5jZXM7CisgIH0KKworICAvKioKKyAgICogU2VhcmNoIGFsbCB0eXBlIGNvbGxlY3Rpb25zIGZvciBkdXBsaWNhdGUgdHlwZW5hbWVzCisgICAqIEBwYXJhbSBwcm9nIHRoZSBwcm9ncmFtIHRvIHNlYXJjaAorICAgKiBAcGFyYW0gdCAgICB0aGUgdHlwZSB0byB0ZXN0IGZvciBjb2xsaXNpb25zCisgICAqIEByZXR1cm4gICAgIHRoZSBudW1iZXIgb2YgY2VydGFpbiB0eXBlbmFtZSBjb2xsaXNpb25zCisgICAqLworICBpbnQgcHJvZ3JhbV90eXBlbmFtZV9jb3VudCh0X3Byb2dyYW0qIHByb2csIHRfdHlwZSogdCkgeworICAgIGludCBvY2N1cnJlbmNlcyA9IDA7CisgICAgb2NjdXJyZW5jZXMgKz0gY29sbGVjdGlvbl90eXBlbmFtZV9jb3VudChwcm9nLCBwcm9nLT50eXBlZGVmc18sIHQpOworICAgIG9jY3VycmVuY2VzICs9IGNvbGxlY3Rpb25fdHlwZW5hbWVfY291bnQocHJvZywgcHJvZy0+ZW51bXNfLCB0KTsKKyAgICBvY2N1cnJlbmNlcyArPSBjb2xsZWN0aW9uX3R5cGVuYW1lX2NvdW50KHByb2csIHByb2ctPm9iamVjdHNfLCB0KTsKKyAgICBvY2N1cnJlbmNlcyArPSBjb2xsZWN0aW9uX3R5cGVuYW1lX2NvdW50KHByb2csIHByb2ctPnNlcnZpY2VzXywgdCk7CisgICAgcmV0dXJuIG9jY3VycmVuY2VzOworICB9CisKKyAgLyoqCisgICAqIFNlYXJjaCBhIHR5cGUgY29sbGVjdGlvbiBmb3IgZHVwbGljYXRlIHR5cGVuYW1lcworICAgKiBAcGFyYW0gcHJvZyAgICAgICAgICAgIHRoZSBwcm9ncmFtIHRvIHNlYXJjaAorICAgKiBAcGFyYW0gdHlwZV9jb2xsZWN0aW9uIHRoZSB0eXBlIGNvbGxlY3Rpb24gdG8gc2VhcmNoCisgICAqIEBwYXJhbSB0ICAgICAgICAgICAgICAgdGhlIHR5cGUgdG8gdGVzdCBmb3IgY29sbGlzaW9ucworICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2VydGFpbiB0eXBlbmFtZSBjb2xsaXNpb25zCisgICAqLworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgaW50IGNvbGxlY3Rpb25fdHlwZW5hbWVfY291bnQodF9wcm9ncmFtKiBwcm9nLCBUIHR5cGVfY29sbGVjdGlvbiwgdF90eXBlKiB0KSB7CisgICAgaW50IG9jY3VycmVuY2VzID0gMDsKKyAgICBmb3IgKHR5cGVuYW1lIFQ6Oml0ZXJhdG9yIGl0ID0gdHlwZV9jb2xsZWN0aW9uLmJlZ2luKCk7IGl0ICE9IHR5cGVfY29sbGVjdGlvbi5lbmQoKTsgKytpdCkKKyAgICAgIGlmICh0ICE9ICppdCAmJiAwID09IHQtPmdldF9uYW1lKCkuY29tcGFyZSgoKml0KS0+Z2V0X25hbWUoKSkgJiYgaXNfY29tbW9uX25hbWVzcGFjZShwcm9nLCB0KSkKKyAgICAgICAgKytvY2N1cnJlbmNlczsKKyAgICByZXR1cm4gb2NjdXJyZW5jZXM7CisgIH0KKworICAvKioKKyAgICogRGV0ZXJtaW5lIHdoZXRoZXIgaWRlbnRpY2FsIHR5cGVuYW1lcyB3aWxsIGNvbGxpZGUgYmFzZWQgb24gbmFtZXNwYWNlcy4KKyAgICoKKyAgICogQmVjYXVzZSB3ZSBkbyBub3Qga25vdyB3aGljaCBsYW5ndWFnZXMgdGhlIHVzZXIgd2lsbCBnZW5lcmF0ZSBjb2RlIGZvciwKKyAgICogY29sbGlzaW9ucyB3aXRoaW4gcHJvZ3JhbXMgKElETCBmaWxlcykgaGF2aW5nIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgY2FuIGJlCisgICAqIGRpZmZpY3VsdCB0byBkZXRlcm1pbmUuIE9ubHkgZ3VhcmFudGVlZCBjb2xsaXNpb25zIHJldHVybiB0cnVlIChjYXVzZSBhbiBlcnJvcikuCisgICAqIFBvc3NpYmxlIGNvbGxpc2lvbnMgaW52b2x2aW5nIGV4cGxpY2l0IG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgcHJvZHVjZSBhIHdhcm5pbmcuCisgICAqIE90aGVyIHBvc3NpYmxlIGNvbGxpc2lvbnMgZ28gdW5yZXBvcnRlZC4KKyAgICogQHBhcmFtIHByb2cgdGhlIHByb2dyYW0gY29udGFpbmluZyB0aGUgcHJlZXhpc3RpbmcgdHlwZW5hbWUKKyAgICogQHBhcmFtIHQgICAgdGhlIHR5cGUgY29udGFpbmluZyB0aGUgdHlwZW5hbWUgbWF0Y2gKKyAgICogQHJldHVybiAgICAgdHJ1ZSBpZiBhIGNvbGxpc2lvbiB3aXRoaW4gbmFtZXNwYWNlcyBpcyBmb3VuZCwgb3RoZXJ3aXNlIGZhbHNlCisgICAqLworICBib29sIGlzX2NvbW1vbl9uYW1lc3BhY2UodF9wcm9ncmFtKiBwcm9nLCB0X3R5cGUqIHQpIHsKKyAgICAvLyBDYXNlIDE6IFR5cGVuYW1lcyBhcmUgaW4gdGhlIHNhbWUgcHJvZ3JhbSBbY29sbGlzaW9uXQorICAgIGlmIChwcm9nID09IHQtPmdldF9wcm9ncmFtKCkpIHsKKyAgICAgIHB3YXJuaW5nKDEsCisgICAgICAgICAgICAgICAiRHVwbGljYXRlIHR5cGVuYW1lICVzIGZvdW5kIGluICVzIiwKKyAgICAgICAgICAgICAgIHQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgIHQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBDYXNlIDI6IEJvdGggcHJvZ3JhbXMgaGF2ZSBpZGVudGljYWwgbmFtZXNwYWNlIHNjb3BlL25hbWUgZGVjbGFyYXRpb25zIFtjb2xsaXNpb25dCisgICAgYm9vbCBtYXRjaCA9IHRydWU7CisgICAgZm9yIChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdCA9IHByb2ctPm5hbWVzcGFjZXNfLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBwcm9nLT5uYW1lc3BhY2VzXy5lbmQoKTsKKyAgICAgICAgICsraXQpIHsKKyAgICAgIGlmICgwID09IGl0LT5zZWNvbmQuY29tcGFyZSh0LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKGl0LT5maXJzdCkpKSB7CisgICAgICAgIHB3YXJuaW5nKDEsCisgICAgICAgICAgICAgICAgICJEdXBsaWNhdGUgdHlwZW5hbWUgJXMgZm91bmQgaW4gJXMsJXMsJXMgYW5kICVzLCVzLCVzIFtmaWxlLHNjb3BlLG5zXSIsCisgICAgICAgICAgICAgICAgIHQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgdC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBpdC0+Zmlyc3QuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5jX3N0cigpLAorICAgICAgICAgICAgICAgICBwcm9nLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIGl0LT5maXJzdC5jX3N0cigpLAorICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmNfc3RyKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWF0Y2ggPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdCA9IHQtPmdldF9wcm9ncmFtKCktPm5hbWVzcGFjZXNfLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSB0LT5nZXRfcHJvZ3JhbSgpLT5uYW1lc3BhY2VzXy5lbmQoKTsKKyAgICAgICAgICsraXQpIHsKKyAgICAgIGlmICgwID09IGl0LT5zZWNvbmQuY29tcGFyZShwcm9nLT5nZXRfbmFtZXNwYWNlKGl0LT5maXJzdCkpKSB7CisgICAgICAgIHB3YXJuaW5nKDEsCisgICAgICAgICAgICAgICAgICJEdXBsaWNhdGUgdHlwZW5hbWUgJXMgZm91bmQgaW4gJXMsJXMsJXMgYW5kICVzLCVzLCVzIFtmaWxlLHNjb3BlLG5zXSIsCisgICAgICAgICAgICAgICAgIHQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgdC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBpdC0+Zmlyc3QuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5jX3N0cigpLAorICAgICAgICAgICAgICAgICBwcm9nLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIGl0LT5maXJzdC5jX3N0cigpLAorICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmNfc3RyKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWF0Y2ggPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKDAgPT0gcHJvZy0+bmFtZXNwYWNlc18uc2l6ZSgpICYmIDAgPT0gdC0+Z2V0X3Byb2dyYW0oKS0+bmFtZXNwYWNlc18uc2l6ZSgpKSB7CisgICAgICBwd2FybmluZygxLAorICAgICAgICAgICAgICAgIkR1cGxpY2F0ZSB0eXBlbmFtZSAlcyBmb3VuZCBpbiAlcyBhbmQgJXMiLAorICAgICAgICAgICAgICAgdC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgdC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgcHJvZy0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIG1hdGNoOworICB9CisKKyAgLy8gU2NvcGluZyBhbmQgbmFtZXNwYWNpbmcKKyAgdm9pZCBzZXRfbmFtZXNwYWNlKHN0ZDo6c3RyaW5nIG5hbWUpIHsgbmFtZXNwYWNlXyA9IG5hbWU7IH0KKworICAvLyBTY29wZSBhY2Nlc3NvcgorICB0X3Njb3BlKiBzY29wZSgpIGNvbnN0IHsgcmV0dXJuIHNjb3BlXzsgfQorCisgIC8vIEluY2x1ZGVzCisKKyAgdm9pZCBhZGRfaW5jbHVkZSh0X3Byb2dyYW0qIHByb2dyYW0pIHsKKyAgICBpbmNsdWRlc18ucHVzaF9iYWNrKHByb2dyYW0pOworICB9CisKKyAgdm9pZCBhZGRfaW5jbHVkZShzdGQ6OnN0cmluZyBwYXRoLCBzdGQ6OnN0cmluZyBpbmNsdWRlX3NpdGUpIHsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgpOworCisgICAgLy8gaW5jbHVkZSBwcmVmaXggZm9yIHRoaXMgcHJvZ3JhbSBpcyB0aGUgc2l0ZSBhdCB3aGljaCBpdCB3YXMgaW5jbHVkZWQKKyAgICAvLyAobWludXMgdGhlIGZpbGVuYW1lKQorICAgIHN0ZDo6c3RyaW5nIGluY2x1ZGVfcHJlZml4OworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGFzdF9zbGFzaCA9IHN0ZDo6c3RyaW5nOjpucG9zOworICAgIGlmICgobGFzdF9zbGFzaCA9IGluY2x1ZGVfc2l0ZS5yZmluZCgiLyIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgaW5jbHVkZV9wcmVmaXggPSBpbmNsdWRlX3NpdGUuc3Vic3RyKDAsIGxhc3Rfc2xhc2gpOworICAgIH0KKworICAgIHByb2dyYW0tPnNldF9pbmNsdWRlX3ByZWZpeChpbmNsdWRlX3ByZWZpeCk7CisgICAgaW5jbHVkZXNfLnB1c2hfYmFjayhwcm9ncmFtKTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBnZXRfaW5jbHVkZXMoKSB7IHJldHVybiBpbmNsdWRlc187IH0KKworICB2b2lkIHNldF9pbmNsdWRlX3ByZWZpeChzdGQ6OnN0cmluZyBpbmNsdWRlX3ByZWZpeCkgeworICAgIGluY2x1ZGVfcHJlZml4XyA9IGluY2x1ZGVfcHJlZml4OworCisgICAgLy8gdGhpcyBpcyBpbnRlbmRlZCB0byBiZSBhIGRpcmVjdG9yeTsgYWRkIGEgdHJhaWxpbmcgc2xhc2ggaWYgbmVjZXNzYXJ5CisgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsZW4gPSBpbmNsdWRlX3ByZWZpeF8uc2l6ZSgpOworICAgIGlmIChsZW4gPiAwICYmIGluY2x1ZGVfcHJlZml4X1tsZW4gLSAxXSAhPSAnLycpIHsKKyAgICAgIGluY2x1ZGVfcHJlZml4XyArPSAnLyc7CisgICAgfQorICB9CisKKyAgLy8gTGFuZ3VhZ2UgbmV1dHJhbCBuYW1lc3BhY2UgLyBwYWNrYWdpbmcKKyAgdm9pZCBzZXRfbmFtZXNwYWNlKHN0ZDo6c3RyaW5nIGxhbmd1YWdlLCBzdGQ6OnN0cmluZyBuYW1lX3NwYWNlKSB7CisgICAgaWYgKGxhbmd1YWdlICE9ICIqIikgeworICAgICAgc2l6ZV90IHN1Yl9pbmRleCA9IGxhbmd1YWdlLmZpbmQoJy4nKTsKKyAgICAgIHN0ZDo6c3RyaW5nIGJhc2VfbGFuZ3VhZ2UgPSBsYW5ndWFnZS5zdWJzdHIoMCwgc3ViX2luZGV4KTsKKyAgICAgIHN0ZDo6c3RyaW5nIHN1Yl9uYW1lc3BhY2U7CisKKyAgICAgIGlmIChiYXNlX2xhbmd1YWdlID09ICJzbWFsbHRhbGsiKSB7CisgICAgICAgIHB3YXJuaW5nKDEsICJOYW1lc3BhY2UgJ3NtYWxsdGFsaycgaXMgZGVwcmVjYXRlZC4gVXNlICdzdCcgaW5zdGVhZCIpOworICAgICAgICBiYXNlX2xhbmd1YWdlID0gInN0IjsKKyAgICAgIH0KKworICAgICAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdCBteV9jb3B5ID0gdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3JfbWFwKCk7CisKKyAgICAgIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3Q6Oml0ZXJhdG9yIGl0OworICAgICAgaXQgPSBteV9jb3B5LmZpbmQoYmFzZV9sYW5ndWFnZSk7CisKKyAgICAgIGlmIChpdCA9PSBteV9jb3B5LmVuZCgpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHdhcm5pbmcgPSAiTm8gZ2VuZXJhdG9yIG5hbWVkICciICsgYmFzZV9sYW5ndWFnZSArICInIGNvdWxkIGJlIGZvdW5kISI7CisgICAgICAgIHB3YXJuaW5nKDEsIHdhcm5pbmcuY19zdHIoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoc3ViX2luZGV4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgc3RkOjpzdHJpbmcgc3ViX25hbWVzcGFjZSA9IGxhbmd1YWdlLnN1YnN0cihzdWJfaW5kZXggKyAxKTsKKyAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmlzX3ZhbGlkX25hbWVzcGFjZShzdWJfbmFtZXNwYWNlKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgd2FybmluZyA9IGJhc2VfbGFuZ3VhZ2UgKyAiIGdlbmVyYXRvciBkb2VzIG5vdCBhY2NlcHQgJyIgKyBzdWJfbmFtZXNwYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBhcyBzdWItbmFtZXNwYWNlISI7CisgICAgICAgICAgICBwd2FybmluZygxLCB3YXJuaW5nLmNfc3RyKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIG5hbWVzcGFjZXNfW2xhbmd1YWdlXSA9IG5hbWVfc3BhY2U7CisgIH0KKworICBzdGQ6OnN0cmluZyBnZXRfbmFtZXNwYWNlKHN0ZDo6c3RyaW5nIGxhbmd1YWdlKSBjb25zdCB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKyAgICBpZiAoKGl0ZXIgPSBuYW1lc3BhY2VzXy5maW5kKGxhbmd1YWdlKSkgIT0gbmFtZXNwYWNlc18uZW5kKCkKKyAgICAgICAgfHwgKGl0ZXIgPSBuYW1lc3BhY2VzXy5maW5kKCIqIikpICE9IG5hbWVzcGFjZXNfLmVuZCgpKSB7CisgICAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIGdldF9hbGxfbmFtZXNwYWNlcygpeworICAgICByZXR1cm4gbmFtZXNwYWNlc187CisgIH0KKworICB2b2lkIHNldF9uYW1lc3BhY2VfYW5ub3RhdGlvbnMoc3RkOjpzdHJpbmcgbGFuZ3VhZ2UsIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnMpIHsKKyAgICBuYW1lc3BhY2VfYW5ub3RhdGlvbnNfW2xhbmd1YWdlXSA9IGFubm90YXRpb25zOworICB9CisKKyAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgZ2V0X25hbWVzcGFjZV9hbm5vdGF0aW9ucyhzdGQ6OnN0cmluZyBsYW5ndWFnZSkgeworICAgIHJldHVybiBuYW1lc3BhY2VfYW5ub3RhdGlvbnNfW2xhbmd1YWdlXTsKKyAgfQorCisgIC8vIExhbmd1YWdlIHNwZWNpZmljIG5hbWVzcGFjZSAvIHBhY2thZ2luZworCisgIHZvaWQgYWRkX2NwcF9pbmNsdWRlKHN0ZDo6c3RyaW5nIHBhdGgpIHsgY3BwX2luY2x1ZGVzXy5wdXNoX2JhY2socGF0aCk7IH0KKworICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGdldF9jcHBfaW5jbHVkZXMoKSB7IHJldHVybiBjcHBfaW5jbHVkZXNfOyB9CisKKyAgdm9pZCBhZGRfY19pbmNsdWRlKHN0ZDo6c3RyaW5nIHBhdGgpIHsgY19pbmNsdWRlc18ucHVzaF9iYWNrKHBhdGgpOyB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBnZXRfY19pbmNsdWRlcygpIHsgcmV0dXJuIGNfaW5jbHVkZXNfOyB9CisKK3ByaXZhdGU6CisgIC8vIEZpbGUgcGF0aAorICBzdGQ6OnN0cmluZyBwYXRoXzsKKworICAvLyBOYW1lCisgIHN0ZDo6c3RyaW5nIG5hbWVfOworCisgIC8vIE91dHB1dCBkaXJlY3RvcnkKKyAgc3RkOjpzdHJpbmcgb3V0X3BhdGhfOworCisgIC8vIE91dHB1dCBkaXJlY3RvcnkgaXMgYWJzb2x1dGUgbG9jYXRpb24gZm9yIGdlbmVyYXRlZCBzb3VyY2UgKG5vIGdlbi0qKQorICBib29sIG91dF9wYXRoX2lzX2Fic29sdXRlXzsKKworICAvLyBOYW1lc3BhY2UKKyAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlXzsKKworICAvLyBJbmNsdWRlZCBwcm9ncmFtcworICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiBpbmNsdWRlc187CisKKyAgLy8gSW5jbHVkZSBwcmVmaXggZm9yIHRoaXMgcHJvZ3JhbSwgaWYgYW55CisgIHN0ZDo6c3RyaW5nIGluY2x1ZGVfcHJlZml4XzsKKworICAvLyBJZGVudGlmaWVyIGxvb2t1cCBzY29wZQorICB0X3Njb3BlKiBzY29wZV87CisKKyAgLy8gQ29tcG9uZW50cyB0byBnZW5lcmF0ZSBjb2RlIGZvcgorICBzdGQ6OnZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmc187CisgIHN0ZDo6dmVjdG9yPHRfZW51bSo+IGVudW1zXzsKKyAgc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0c187CisgIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4gc3RydWN0c187CisgIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4geGNlcHRpb25zXzsKKyAgc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXNfOworCisgIC8vIER5bmFtaWMgbmFtZXNwYWNlcworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG5hbWVzcGFjZXNfOworCisgIC8vIEFubm90YXRpb25zIGZvciBkeW5hbWljIG5hbWVzcGFjZXMKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gPiBuYW1lc3BhY2VfYW5ub3RhdGlvbnNfOworCisgIC8vIEMrKyBleHRyYSBpbmNsdWRlcworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY3BwX2luY2x1ZGVzXzsKKworICAvLyBDIGV4dHJhIGluY2x1ZGVzCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjX2luY2x1ZGVzXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zY29wZS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zY29wZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMTYwYTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3Njb3BlLmgKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1NDT1BFX0gKKyNkZWZpbmUgVF9TQ09QRV9ICisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2NvbnN0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9tYXAuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9saXN0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc2V0LmgiCisKK25hbWVzcGFjZSBwbHVnaW5fb3V0cHV0IHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KK3ZvaWQgY29udmVydChGcm9tKiwgVG8mKTsKK30KKworLyoqCisgKiBUaGlzIHJlcHJlc2VudHMgYSB2YXJpYWJsZSBzY29wZSB1c2VkIGZvciBsb29raW5nIHVwIHByZWRlZmluZWQgdHlwZXMgYW5kCisgKiBzZXJ2aWNlcy4gVHlwaWNhbGx5LCBhIHNjb3BlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHRfcHJvZ3JhbS4gU2NvcGVzIGFyZSBub3QKKyAqIHVzZWQgdG8gZGV0ZXJtaW5lIGNvZGUgZ2VuZXJhdGlvbiwgYnV0IHJhdGhlciB0byByZXNvbHZlIGlkZW50aWZpZXJzIGF0CisgKiBwYXJzZSB0aW1lLgorICoKKyAqLworY2xhc3MgdF9zY29wZSB7CitwdWJsaWM6CisgIHRfc2NvcGUoKSB7fQorCisgIHZvaWQgYWRkX3R5cGUoc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlKSB7IHR5cGVzX1tuYW1lXSA9IHR5cGU7IH0KKworICB0X3R5cGUqIGdldF90eXBlKHN0ZDo6c3RyaW5nIG5hbWUpIHsgcmV0dXJuIHR5cGVzX1tuYW1lXTsgfQorCisgIHZvaWQgYWRkX3NlcnZpY2Uoc3RkOjpzdHJpbmcgbmFtZSwgdF9zZXJ2aWNlKiBzZXJ2aWNlKSB7IHNlcnZpY2VzX1tuYW1lXSA9IHNlcnZpY2U7IH0KKworICB0X3NlcnZpY2UqIGdldF9zZXJ2aWNlKHN0ZDo6c3RyaW5nIG5hbWUpIHsgcmV0dXJuIHNlcnZpY2VzX1tuYW1lXTsgfQorCisgIHZvaWQgYWRkX2NvbnN0YW50KHN0ZDo6c3RyaW5nIG5hbWUsIHRfY29uc3QqIGNvbnN0YW50KSB7CisgICAgaWYgKGNvbnN0YW50c18uZmluZChuYW1lKSAhPSBjb25zdGFudHNfLmVuZCgpKSB7CisgICAgICB0aHJvdyAiRW51bSAiICsgbmFtZSArICIgaXMgYWxyZWFkeSBkZWZpbmVkISI7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0YW50c19bbmFtZV0gPSBjb25zdGFudDsKKyAgICB9CisgIH0KKworICB0X2NvbnN0KiBnZXRfY29uc3RhbnQoc3RkOjpzdHJpbmcgbmFtZSkgeyByZXR1cm4gY29uc3RhbnRzX1tuYW1lXTsgfQorCisgIHZvaWQgcHJpbnQoKSB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfdHlwZSo+OjppdGVyYXRvciBpdGVyOworICAgIGZvciAoaXRlciA9IHR5cGVzXy5iZWdpbigpOyBpdGVyICE9IHR5cGVzXy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBwcmludGYoIiVzID0+ICVzXG4iLCBpdGVyLT5maXJzdC5jX3N0cigpLCBpdGVyLT5zZWNvbmQtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgfQorICB9CisKKyAgdm9pZCByZXNvbHZlX2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbCwgdF90eXBlKiB0dHlwZSkgeworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIG1hcCA9IGNvbnN0X3ZhbC0+Z2V0X21hcCgpOworICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgZm9yICh2X2l0ZXIgPSBtYXAuYmVnaW4oKTsgdl9pdGVyICE9IG1hcC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSh2X2l0ZXItPmZpcnN0LCAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKKyAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSh2X2l0ZXItPnNlY29uZCwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IGNvbnN0X3ZhbC0+Z2V0X2xpc3QoKTsKKyAgICAgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSgoKnZfaXRlciksICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gY29uc3RfdmFsLT5nZXRfbGlzdCgpOworICAgICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICByZXNvbHZlX2NvbnN0X3ZhbHVlKCgqdl9pdGVyKSwgKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICB0X3N0cnVjdCogdHN0cnVjdCA9ICh0X3N0cnVjdCopdHR5cGU7CisgICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiBtYXAgPSBjb25zdF92YWwtPmdldF9tYXAoKTsKKyAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgIGZvciAodl9pdGVyID0gbWFwLmJlZ2luKCk7IHZfaXRlciAhPSBtYXAuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICAgIHRfZmllbGQqIGZpZWxkID0gdHN0cnVjdC0+Z2V0X2ZpZWxkX2J5X25hbWUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKTsKKyAgICAgICAgaWYgKGZpZWxkID09IE5VTEwpIHsKKyAgICAgICAgICB0aHJvdyAiTm8gZmllbGQgbmFtZWQgXCIiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpCisgICAgICAgICAgICAgICsgIlwiIHdhcyBmb3VuZCBpbiBzdHJ1Y3Qgb2YgdHlwZSBcIiIgKyB0c3RydWN0LT5nZXRfbmFtZSgpICsgIlwiIjsKKyAgICAgICAgfQorICAgICAgICByZXNvbHZlX2NvbnN0X3ZhbHVlKHZfaXRlci0+c2Vjb25kLCBmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChjb25zdF92YWwtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUikgeworICAgICAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgICAgY29uc3RfdmFsLT5zZXRfZW51bSgodF9lbnVtKil0dHlwZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0X2NvbnN0KiBjb25zdGFudCA9IGdldF9jb25zdGFudChjb25zdF92YWwtPmdldF9pZGVudGlmaWVyKCkpOworICAgICAgICBpZiAoY29uc3RhbnQgPT0gTlVMTCkgeworICAgICAgICAgIHRocm93ICJObyBlbnVtIHZhbHVlIG9yIGNvbnN0YW50IGZvdW5kIG5hbWVkIFwiIiArIGNvbnN0X3ZhbC0+Z2V0X2lkZW50aWZpZXIoKSArICJcIiEiOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVzb2x2ZSB0eXBlZGVmcyB0byB0aGUgdW5kZXJseWluZyB0eXBlCisgICAgICAgIHRfdHlwZSogY29uc3RfdHlwZSA9IGNvbnN0YW50LT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisKKyAgICAgICAgaWYgKGNvbnN0X3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKiljb25zdF90eXBlKS0+Z2V0X2Jhc2UoKSkgeworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgICAgY29uc3RfdmFsLT5zZXRfaW50ZWdlcihjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9pbnRlZ2VyKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgICBjb25zdF92YWwtPnNldF9zdHJpbmcoY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfc3RyaW5nKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICBjb25zdF92YWwtPnNldF9kb3VibGUoY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfZG91YmxlKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgICAgdGhyb3cgIkNvbnN0YW50cyBjYW5ub3QgYmUgb2YgdHlwZSBWT0lEIjsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY29uc3RfdHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiBtYXAgPSBjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9tYXAoKTsKKyAgICAgICAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICAgICAgICBjb25zdF92YWwtPnNldF9tYXAoKTsKKyAgICAgICAgICBmb3IgKHZfaXRlciA9IG1hcC5iZWdpbigpOyB2X2l0ZXIgIT0gbWFwLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICAgICAgY29uc3RfdmFsLT5hZGRfbWFwKHZfaXRlci0+Zmlyc3QsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY29uc3RfdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSBjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9saXN0KCk7CisgICAgICAgICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICAgICAgICBjb25zdF92YWwtPnNldF9saXN0KCk7CisgICAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgICAgIGNvbnN0X3ZhbC0+YWRkX2xpc3QoKnZfaXRlcik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAvLyBlbnVtIGNvbnN0YW50IHdpdGggbm9uLWlkZW50aWZpZXIgdmFsdWUuIHNldCB0aGUgZW51bSBhbmQgZmluZCB0aGUKKyAgICAgIC8vIHZhbHVlJ3MgbmFtZS4KKyAgICAgIHRfZW51bSogdGVudW0gPSAodF9lbnVtKil0dHlwZTsKKyAgICAgIHRfZW51bV92YWx1ZSogZW51bV92YWx1ZSA9IHRlbnVtLT5nZXRfY29uc3RhbnRfYnlfdmFsdWUoY29uc3RfdmFsLT5nZXRfaW50ZWdlcigpKTsKKyAgICAgIGlmIChlbnVtX3ZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHZhbHN0bTsKKyAgICAgICAgdmFsc3RtIDw8IGNvbnN0X3ZhbC0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgdGhyb3cgIkNvdWxkbid0IGZpbmQgYSBuYW1lZCB2YWx1ZSBpbiBlbnVtICIgKyB0ZW51bS0+Z2V0X25hbWUoKSArICIgZm9yIHZhbHVlICIKKyAgICAgICAgICAgICsgdmFsc3RtLnN0cigpOworICAgICAgfQorICAgICAgY29uc3RfdmFsLT5zZXRfaWRlbnRpZmllcih0ZW51bS0+Z2V0X25hbWUoKSArICIuIiArIGVudW1fdmFsdWUtPmdldF9uYW1lKCkpOworICAgICAgY29uc3RfdmFsLT5zZXRfZW51bSh0ZW51bSk7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIC8vIE1hcCBvZiBuYW1lcyB0byB0eXBlcworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF90eXBlKj4gdHlwZXNfOworCisgIC8vIE1hcCBvZiBuYW1lcyB0byBjb25zdGFudHMKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfY29uc3QqPiBjb25zdGFudHNfOworCisgIC8vIE1hcCBvZiBuYW1lcyB0byBzZXJ2aWNlcworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9zZXJ2aWNlKj4gc2VydmljZXNfOworCisgIC8vIHRvIGxpc3QgbWFwIGVudHJpZXMKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgorICAgIGZyaWVuZCB2b2lkIHBsdWdpbl9vdXRwdXQ6OmNvbnZlcnQoRnJvbSosIFRvJik7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIyMDRjYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1NFUlZJQ0VfSAorI2RlZmluZSBUX1NFUlZJQ0VfSAorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK2NsYXNzIHRfcHJvZ3JhbTsKKworLyoqCisgKiBBIHNlcnZpY2UgY29uc2lzdHMgb2YgYSBzZXQgb2YgZnVuY3Rpb25zLgorICoKKyAqLworY2xhc3MgdF9zZXJ2aWNlIDogcHVibGljIHRfdHlwZSB7CitwdWJsaWM6CisgIHRfc2VydmljZSh0X3Byb2dyYW0qIHByb2dyYW0pIDogdF90eXBlKHByb2dyYW0pLCBleHRlbmRzXyhOVUxMKSB7fQorCisgIGJvb2wgaXNfc2VydmljZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICB2b2lkIHNldF9leHRlbmRzKHRfc2VydmljZSogZXh0ZW5kcykgeyBleHRlbmRzXyA9IGV4dGVuZHM7IH0KKworICB2b2lkIGFkZF9mdW5jdGlvbih0X2Z1bmN0aW9uKiBmdW5jKSB7CisgICAgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworICAgIGZvciAoaXRlciA9IGZ1bmN0aW9uc18uYmVnaW4oKTsgaXRlciAhPSBmdW5jdGlvbnNfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmIChmdW5jLT5nZXRfbmFtZSgpID09ICgqaXRlciktPmdldF9uYW1lKCkpIHsKKyAgICAgICAgdGhyb3cgIkZ1bmN0aW9uICIgKyBmdW5jLT5nZXRfbmFtZSgpICsgIiBpcyBhbHJlYWR5IGRlZmluZWQiOworICAgICAgfQorICAgIH0KKyAgICBmdW5jdGlvbnNfLnB1c2hfYmFjayhmdW5jKTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiYgZ2V0X2Z1bmN0aW9ucygpIGNvbnN0IHsgcmV0dXJuIGZ1bmN0aW9uc187IH0KKworICB0X3NlcnZpY2UqIGdldF9leHRlbmRzKCkgeyByZXR1cm4gZXh0ZW5kc187IH0KKworICBjb25zdCB0X3NlcnZpY2UqIGdldF9leHRlbmRzKCkgY29uc3QgeyByZXR1cm4gZXh0ZW5kc187IH0KKworcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9uc187CisgIHRfc2VydmljZSogZXh0ZW5kc187Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc2V0LmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3NldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MTNiZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3NldC5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1NFVF9ICisjZGVmaW5lIFRfU0VUX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oIgorCisvKioKKyAqIEEgc2V0IGlzIGEgbGlnaHR3ZWlnaHQgY29udGFpbmVyIHR5cGUgdGhhdCBqdXN0IHdyYXBzIGFub3RoZXIgZGF0YSB0eXBlLgorICoKKyAqLworY2xhc3MgdF9zZXQgOiBwdWJsaWMgdF9jb250YWluZXIgeworcHVibGljOgorICB0X3NldCh0X3R5cGUqIGVsZW1fdHlwZSkgOiBlbGVtX3R5cGVfKGVsZW1fdHlwZSkge30KKworICB0X3R5cGUqIGdldF9lbGVtX3R5cGUoKSBjb25zdCB7IHJldHVybiBlbGVtX3R5cGVfOyB9CisKKyAgYm9vbCBpc19zZXQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHRfdHlwZSogZWxlbV90eXBlXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zdHJ1Y3QuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEwMmRhNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1NUUlVDVF9ICisjZGVmaW5lIFRfU1RSVUNUX0gKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZmllbGQuaCIKKworLy8gRm9yd2FyZCBkZWNsYXJlIHRoYXQgcHVwcHkKK2NsYXNzIHRfcHJvZ3JhbTsKKworLyoqCisgKiBBIHN0cnVjdCBpcyBhIGNvbnRhaW5lciBmb3IgYSBzZXQgb2YgbWVtYmVyIGZpZWxkcyB0aGF0IGhhcyBhIG5hbWUuIFN0cnVjdHMKKyAqIGFyZSBhbHNvIHVzZWQgdG8gaW1wbGVtZW50IGV4Y2VwdGlvbiB0eXBlcy4KKyAqCisgKi8KK2NsYXNzIHRfc3RydWN0IDogcHVibGljIHRfdHlwZSB7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnNfdHlwZTsKKworICB0X3N0cnVjdCh0X3Byb2dyYW0qIHByb2dyYW0pCisgICAgOiB0X3R5cGUocHJvZ3JhbSksCisgICAgICBpc194Y2VwdGlvbl8oZmFsc2UpLAorICAgICAgaXNfdW5pb25fKGZhbHNlKSwKKyAgICAgIG1lbWJlcnNfdmFsaWRhdGVkKGZhbHNlKSwKKyAgICAgIG1lbWJlcnNfd2l0aF92YWx1ZSgwKSwKKyAgICAgIHhzZF9hbGxfKGZhbHNlKSB7fQorCisgIHRfc3RydWN0KHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpCisgICAgOiB0X3R5cGUocHJvZ3JhbSwgbmFtZSksCisgICAgICBpc194Y2VwdGlvbl8oZmFsc2UpLAorICAgICAgaXNfdW5pb25fKGZhbHNlKSwKKyAgICAgIG1lbWJlcnNfdmFsaWRhdGVkKGZhbHNlKSwKKyAgICAgIG1lbWJlcnNfd2l0aF92YWx1ZSgwKSwKKyAgICAgIHhzZF9hbGxfKGZhbHNlKSB7fQorCisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICBuYW1lXyA9IG5hbWU7CisgICAgdmFsaWRhdGVfdW5pb25fbWVtYmVycygpOworICB9CisKKyAgdm9pZCBzZXRfeGNlcHRpb24oYm9vbCBpc194Y2VwdGlvbikgeyBpc194Y2VwdGlvbl8gPSBpc194Y2VwdGlvbjsgfQorCisgIHZvaWQgdmFsaWRhdGVfdW5pb25fbWVtYmVyKHRfZmllbGQqIGZpZWxkKSB7CisgICAgaWYgKGlzX3VuaW9uXyAmJiAoIW5hbWVfLmVtcHR5KCkpKSB7CisKKyAgICAgIC8vIDEpIHVuaW9ucyBjYW4ndCBoYXZlIHJlcXVpcmVkIGZpZWxkcworICAgICAgLy8gMikgdW5pb24gbWVtYmVycyBhcmUgaW1wbGljaXRseSBvcHRpb25hbCwgb3RoZXJ3aXNlIGJ1Z3MgbGlrZSBUSFJJRlQtMzY1MCB3YWl0IHRvIGhhcHBlbgorICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgICAvLyBubyB3YXJuaW5nIG9uIGRlZmF1bHQgcmVxdWlyZWRuZXNzLCBidXQgZG8gd2FybiBvbiBhbnl0aGluZyBlbHNlIHRoYXQgaXMgZXhwbGljaXRseSBhc2tlZCBmb3IKKyAgICAgICAgaWYoZmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7CisgICAgICAgICAgcHdhcm5pbmcoMSwKKyAgICAgICAgICAgICAgICAgICAiVW5pb24gJXMgZmllbGQgJXM6IHVuaW9uIG1lbWJlcnMgbXVzdCBiZSBvcHRpb25hbCwgaWdub3Jpbmcgc3BlY2lmaWVkIHJlcXVpcmVkbmVzcy5cbiIsCisgICAgICAgICAgICAgICAgICAgbmFtZV8uY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICBmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBmaWVsZC0+c2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKyAgICAgIH0KKworICAgICAgLy8gdW5pb25zIG1heSBoYXZlIHVwIHRvIG9uZSBtZW1iZXIgZGVmYXVsdGVkLCBidXQgbm90IG1vcmUKKyAgICAgIGlmIChmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgICBpZiAoMSA8ICsrbWVtYmVyc193aXRoX3ZhbHVlKSB7CisgICAgICAgICAgdGhyb3cgIkVycm9yOiBGaWVsZCAiICsgZmllbGQtPmdldF9uYW1lKCkgKyAiIHByb3ZpZGVzIGFub3RoZXIgZGVmYXVsdCB2YWx1ZSBmb3IgdW5pb24gIgorICAgICAgICAgICAgICArIG5hbWVfOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgdm9pZCB2YWxpZGF0ZV91bmlvbl9tZW1iZXJzKCkgeworICAgIGlmIChpc191bmlvbl8gJiYgKCFuYW1lXy5lbXB0eSgpKSAmJiAoIW1lbWJlcnNfdmFsaWRhdGVkKSkgeworICAgICAgbWVtYmVyc190eXBlOjpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzX2luX2lkX29yZGVyXy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgdmFsaWRhdGVfdW5pb25fbWVtYmVyKCptX2l0ZXIpOworICAgICAgfQorICAgICAgbWVtYmVyc192YWxpZGF0ZWQgPSB0cnVlOworICAgIH0KKyAgfQorCisgIHZvaWQgc2V0X3VuaW9uKGJvb2wgaXNfdW5pb24pIHsKKyAgICBpc191bmlvbl8gPSBpc191bmlvbjsKKyAgICB2YWxpZGF0ZV91bmlvbl9tZW1iZXJzKCk7CisgIH0KKworICB2b2lkIHNldF94c2RfYWxsKGJvb2wgeHNkX2FsbCkgeyB4c2RfYWxsXyA9IHhzZF9hbGw7IH0KKworICBib29sIGdldF94c2RfYWxsKCkgY29uc3QgeyByZXR1cm4geHNkX2FsbF87IH0KKworICBib29sIGFwcGVuZCh0X2ZpZWxkKiBlbGVtKSB7CisgICAgdHlwZWRlZiBtZW1iZXJzX3R5cGU6Oml0ZXJhdG9yIGl0ZXJfdHlwZTsKKyAgICBzdGQ6OnBhaXI8aXRlcl90eXBlLCBpdGVyX3R5cGU+IGJvdW5kcyA9IHN0ZDo6ZXF1YWxfcmFuZ2UobWVtYmVyc19pbl9pZF9vcmRlcl8uYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyc19pbl9pZF9vcmRlcl8uZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQ6OmtleV9jb21wYXJlKCkpOworICAgIGlmIChib3VuZHMuZmlyc3QgIT0gYm91bmRzLnNlY29uZCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyByZXR1cm5zIGZhbHNlIHdoZW4gdGhlcmUgaXMgYSBjb25mbGljdCBvZiBmaWVsZCBuYW1lcworICAgIGlmIChnZXRfZmllbGRfYnlfbmFtZShlbGVtLT5nZXRfbmFtZSgpKSAhPSBOVUxMKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1lbWJlcnNfLnB1c2hfYmFjayhlbGVtKTsKKyAgICBtZW1iZXJzX2luX2lkX29yZGVyXy5pbnNlcnQoYm91bmRzLnNlY29uZCwgZWxlbSk7CisgICAgdmFsaWRhdGVfdW5pb25fbWVtYmVyKGVsZW0pOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY29uc3QgbWVtYmVyc190eXBlJiBnZXRfbWVtYmVycygpIGNvbnN0IHsgcmV0dXJuIG1lbWJlcnNfOyB9CisKKyAgY29uc3QgbWVtYmVyc190eXBlJiBnZXRfc29ydGVkX21lbWJlcnMoKSB7IHJldHVybiBtZW1iZXJzX2luX2lkX29yZGVyXzsgfQorCisgIGJvb2wgaXNfc3RydWN0KCkgY29uc3QgeyByZXR1cm4gIWlzX3hjZXB0aW9uXzsgfQorCisgIGJvb2wgaXNfeGNlcHRpb24oKSBjb25zdCB7IHJldHVybiBpc194Y2VwdGlvbl87IH0KKworICBib29sIGlzX3VuaW9uKCkgY29uc3QgeyByZXR1cm4gaXNfdW5pb25fOyB9CisKKyAgdF9maWVsZCogZ2V0X2ZpZWxkX2J5X25hbWUoc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgeworICAgIG1lbWJlcnNfdHlwZTo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICAgIGZvciAobV9pdGVyID0gbWVtYmVyc19pbl9pZF9vcmRlcl8uYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSA9PSBmaWVsZF9uYW1lKSB7CisgICAgICAgIHJldHVybiAqbV9pdGVyOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGNvbnN0IHRfZmllbGQqIGdldF9maWVsZF9ieV9uYW1lKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIGNvbnN0IHsKKyAgICBtZW1iZXJzX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzX2luX2lkX29yZGVyXy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9uYW1lKCkgPT0gZmllbGRfbmFtZSkgeworICAgICAgICByZXR1cm4gKm1faXRlcjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworcHJpdmF0ZToKKyAgbWVtYmVyc190eXBlIG1lbWJlcnNfOworICBtZW1iZXJzX3R5cGUgbWVtYmVyc19pbl9pZF9vcmRlcl87CisgIGJvb2wgaXNfeGNlcHRpb25fOworICBib29sIGlzX3VuaW9uXzsKKyAgYm9vbCBtZW1iZXJzX3ZhbGlkYXRlZDsKKyAgaW50IG1lbWJlcnNfd2l0aF92YWx1ZTsKKworICBib29sIHhzZF9hbGxfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNmQxZTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGUuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfVFlQRV9ICisjZGVmaW5lIFRfVFlQRV9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZG9jLmgiCisKK2NsYXNzIHRfcHJvZ3JhbTsKKworLyoqCisgKiBHZW5lcmljIHJlcHJlc2VudGF0aW9uIG9mIGEgdGhyaWZ0IHR5cGUuIFRoZXNlIG9iamVjdHMgYXJlIHVzZWQgYnkgdGhlCisgKiBwYXJzZXIgbW9kdWxlIHRvIGJ1aWxkIHVwIGEgdHJlZSBvZiBvYmplY3QgdGhhdCBhcmUgYWxsIGV4cGxpY2l0bHkgdHlwZWQuCisgKiBUaGUgZ2VuZXJpYyB0X3R5cGUgY2xhc3MgZXhwb3J0cyBhIHZhcmlldHkgb2YgdXNlZnVsIG1ldGhvZHMgdGhhdCBhcmUKKyAqIHVzZWQgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yIHRvIGJyYW5jaCBiYXNlZCB1cG9uIGRpZmZlcmVudCBoYW5kbGluZyBmb3IgdGhlCisgKiB2YXJpb3VzIHR5cGVzLgorICoKKyAqLworY2xhc3MgdF90eXBlIDogcHVibGljIHRfZG9jIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+dF90eXBlKCkge30KKworICB2aXJ0dWFsIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsgbmFtZV8gPSBuYW1lOyB9CisKKyAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorCisgIHZpcnR1YWwgYm9vbCBpc192b2lkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX2Jhc2VfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19zdHJpbmcoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfYmluYXJ5KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX2Jvb2woKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfdHlwZWRlZigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19lbnVtKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX3N0cnVjdCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc194Y2VwdGlvbigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19jb250YWluZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfbGlzdCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19zZXQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfbWFwKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX3NlcnZpY2UoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIHRfcHJvZ3JhbSogZ2V0X3Byb2dyYW0oKSB7IHJldHVybiBwcm9ncmFtXzsgfQorCisgIGNvbnN0IHRfcHJvZ3JhbSogZ2V0X3Byb2dyYW0oKSBjb25zdCB7IHJldHVybiBwcm9ncmFtXzsgfQorCisgIHRfdHlwZSogZ2V0X3RydWVfdHlwZSgpOworICBjb25zdCB0X3R5cGUqIGdldF90cnVlX3R5cGUoKSBjb25zdDsKKworICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYnJlYWsgKG1heWJlIGJhZGx5KSB1bmxlc3MgMCA8PSBudW0gPD0gMTYuCisgIHN0YXRpYyBjaGFyIG55YmJsZV90b194ZGlnaXQoaW50IG51bSkgeworICAgIGlmIChudW0gPCAxMCkgeworICAgICAgcmV0dXJuICcwJyArIG51bTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICdBJyArIG51bSAtIDEwOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBieXRlX3RvX2hleCh1aW50OF90IGJ5dGUpIHsKKyAgICBzdGQ6OnN0cmluZyBydjsKKyAgICBydiArPSBueWJibGVfdG9feGRpZ2l0KGJ5dGUgPj4gNCk7CisgICAgcnYgKz0gbnliYmxlX3RvX3hkaWdpdChieXRlICYgMHgwZik7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9uc187CisKK3Byb3RlY3RlZDoKKyAgdF90eXBlKCkgOiBwcm9ncmFtXyhOVUxMKSB7IDsgfQorCisgIHRfdHlwZSh0X3Byb2dyYW0qIHByb2dyYW0pIDogcHJvZ3JhbV8ocHJvZ3JhbSkgeyA7IH0KKworICB0X3R5cGUodF9wcm9ncmFtKiBwcm9ncmFtLCBzdGQ6OnN0cmluZyBuYW1lKSA6IHByb2dyYW1fKHByb2dyYW0pLCBuYW1lXyhuYW1lKSB7IDsgfQorCisgIHRfdHlwZShzdGQ6OnN0cmluZyBuYW1lKSA6IHByb2dyYW1fKE5VTEwpLCBuYW1lXyhuYW1lKSB7IDsgfQorCisgIHRfcHJvZ3JhbSogcHJvZ3JhbV87CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworfTsKKworLyoqCisgKiBQbGFjZWhvbGRlciBzdHJ1Y3QgZm9yIHJldHVybmluZyB0aGUga2V5IGFuZCB2YWx1ZSBvZiBhbiBhbm5vdGF0aW9uCisgKiBkdXJpbmcgcGFyc2luZy4KKyAqLworc3RydWN0IHRfYW5ub3RhdGlvbiB7CisgIHN0ZDo6c3RyaW5nIGtleTsKKyAgc3RkOjpzdHJpbmcgdmFsOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmZmRiOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5jYwpAQCAtMCwwICsxLDM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8Y3N0ZGlvPgorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKKwordF90eXBlKiB0X3R5cGVkZWY6OmdldF90eXBlKCkgY29uc3QgeworICBpZiAodHlwZV8gPT0gTlVMTCkgeworICAgIHRfdHlwZSogdHlwZSA9IGdldF9wcm9ncmFtKCktPnNjb3BlKCktPmdldF90eXBlKHN5bWJvbGljXyk7CisgICAgaWYgKHR5cGUgPT0gTlVMTCkgeworICAgICAgcHJpbnRmKCJUeXBlIFwiJXNcIiBub3QgZGVmaW5lZFxuIiwgc3ltYm9saWNfLmNfc3RyKCkpOworICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgcmV0dXJuIHR5cGU7CisgIH0KKyAgcmV0dXJuIHR5cGVfOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWQzYTUwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfVFlQRURFRl9ICisjZGVmaW5lIFRfVFlQRURFRl9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorCisvKioKKyAqIEEgdHlwZWRlZiBpcyBhIG1hcHBpbmcgZnJvbSBhIHN5bWJvbGljIG5hbWUgdG8gYW5vdGhlciB0eXBlLiBJbiBkeW1hbmljYWxseQorICogdHlwZWQgbGFuZ3VhZ2VzIChpLmUuIHBocC9weXRob24pIHRoZSBjb2RlIGdlbmVyYXRvciBjYW4gYWN0dWFsbHkgdXN1YWxseQorICogaWdub3JlIHR5cGVkZWZzIGFuZCBqdXN0IHVzZSB0aGUgdW5kZXJseWluZyB0eXBlIGRpcmVjdGx5LCB0aG91Z2ggaW4gQysrCisgKiB0aGUgc3ltYm9saWMgbmFtaW5nIGNhbiBiZSBxdWl0ZSB1c2VmdWwgZm9yIGNvZGUgY2xhcml0eS4KKyAqCisgKi8KK2NsYXNzIHRfdHlwZWRlZiA6IHB1YmxpYyB0X3R5cGUgeworcHVibGljOgorICB0X3R5cGVkZWYodF9wcm9ncmFtKiBwcm9ncmFtLCB0X3R5cGUqIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzeW1ib2xpYykKKyAgICA6IHRfdHlwZShwcm9ncmFtLCBzeW1ib2xpYyksIHR5cGVfKHR5cGUpLCBzeW1ib2xpY18oc3ltYm9saWMpLCBmb3J3YXJkXyhmYWxzZSkge30KKworICAvKioKKyAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIHRvIHJlZmVyIHRvIGEgdHlwZSB0aGF0IGlzIGxhemlseQorICAgKiByZXNvbHZlZCBhdCBhIGxhdGVyIHRpbWUsIGxpa2UgZm9yIGZvcndhcmQgZGVjbGFyYXRpb25zIG9yCisgICAqIHJlY3Vyc2l2ZSB0eXBlcy4KKyAgICovCisgIHRfdHlwZWRlZih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBzeW1ib2xpYywgYm9vbCBmb3J3YXJkKQorICAgIDogdF90eXBlKHByb2dyYW0sIHN5bWJvbGljKSwKKyAgICAgIHR5cGVfKE5VTEwpLAorICAgICAgc3ltYm9saWNfKHN5bWJvbGljKSwKKyAgICAgIGZvcndhcmRfKGZvcndhcmQpCisgIHt9CisKKyAgfnRfdHlwZWRlZigpIHt9CisKKyAgdF90eXBlKiBnZXRfdHlwZSgpIGNvbnN0OworCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfc3ltYm9saWMoKSBjb25zdCB7IHJldHVybiBzeW1ib2xpY187IH0KKworICBib29sIGlzX2ZvcndhcmRfdHlwZWRlZigpIGNvbnN0IHsgcmV0dXJuIGZvcndhcmRfOyB9CisKKyAgYm9vbCBpc190eXBlZGVmKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCitwcml2YXRlOgorICB0X3R5cGUqIHR5cGVfOworICBzdGQ6OnN0cmluZyBzeW1ib2xpY187CisgIGJvb2wgZm9yd2FyZF87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsYXRmb3JtLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OWFkYjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbGF0Zm9ybS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBkZWZpbmUgZm9yIG1rZGlyLHNpbmNlIHRoZSBtZXRob2Qgc2lnbmF0dXJlCisgKiBpcyBkaWZmZXJlbnQgZm9yIHRoZSBub24tUE9TSVggTWluR1cKKyAqLworCisjaWZkZWYgX01TQ19WRVIKKyNpbmNsdWRlICJ0aHJpZnQvd2luZG93cy9jb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8ZGlyZWN0Lmg+CisjaW5jbHVkZSA8aW8uaD4KKyNlbHNlCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y2Vycm5vPgorCisvLyBpZ25vcmUgRUVYSVNULCB0aHJvdyBvbiBhbnkgb3RoZXIgZXJyb3IKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgTUtESVIoeCkgeyBpbnQgciA9IF9ta2Rpcih4KTsgaWYgKHIgPT0gLTEgJiYgZXJybm8gIT0gRUVYSVNUKSB7IHRocm93IChzdGQ6OnN0cmluZyh4KSArICI6ICIpICsgc3RyZXJyb3IoZXJybm8pOyB9IH0KKyNlbHNlCisjZGVmaW5lIE1LRElSKHgpIHsgaW50IHIgPSBta2Rpcih4LCBTX0lSV1hVIHwgU19JUldYRyB8IFNfSVJXWE8pOyBpZiAociA9PSAtMSAmJiBlcnJubyAhPSBFRVhJU1QpIHsgdGhyb3cgKHN0ZDo6c3RyaW5nKHgpICsgIjogIikgKyBzdHJlcnJvcihlcnJubyk7IH0gfQorI2VuZGlmCisKKyNpZmRlZiBQQVRIX01BWAorI2RlZmluZSBUSFJJRlRfUEFUSF9NQVggUEFUSF9NQVgKKyNlbHNlCisjZGVmaW5lIFRIUklGVF9QQVRIX01BWCBNQVhfUEFUSAorI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vTWFrZWZpbGUuYW0gYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg0Y2RiZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMKKyMgQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyMgUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyMgZGV0YWlscy4KKworQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzCisKK2lmIFdJVEhfUExVR0lOCitwbHVnaW5fZ2VuID0gcGx1Z2luX3R5cGVzLmggXAorICAgICAgICAgICAgIHBsdWdpbl90eXBlcy5jcHAgXAorICAgICAgICAgICAgIHBsdWdpbl9jb25zdGFudHMuaCBcCisgICAgICAgICAgICAgcGx1Z2luX2NvbnN0YW50cy5jcHAKKworQlVJTFRfU09VUkNFUyA9ICQocGx1Z2luX2dlbikKK2dlbi5zdGFtcDogcGx1Z2luLnRocmlmdCAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0LWJvb3RzdHJhcAorCUAkKFJNKSAtZiBnZW4udG1wCisJQHRvdWNoIGdlbi50bXAKKwkkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0LWJvb3RzdHJhcCAtZ2VuIGNwcCAtb3V0IC4gJDwKKwlAbXYgLWYgZ2VuLnRtcCAkQAorCiskKHBsdWdpbl9nZW4pOiBnZW4uc3RhbXAKKwlAaWYgdGVzdCAtZiAkQDsgdGhlbiA6OyBlbHNlIFwKKwkkKFJNKSAtZiBnZW4uc3RhbXA7IFwKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBnZW4uc3RhbXA7IFwKKwlmaQorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSB2ZXJzaW9uLmggd2luZG93cy92ZXJzaW9uLmggJChwbHVnaW5fZ2VuKQorZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNGM0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmNjCkBAIC0wLDAgKzEsNTExIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3BsdWdpbi5oIgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpby5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8Ym9vc3QvcmFuZ2UvYWRhcHRvci9tYXAuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3JhbmdlL2FsZ29yaXRobS9mb3JfZWFjaC5ocHA+CisKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oIgorI2luY2x1ZGUgInRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmgiCisjaW5jbHVkZSAidGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5oIgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHBsdWdpbiB7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEZEVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEZyYW1lZFRyYW5zcG9ydDsKKworI2RlZmluZSBUSFJJRlRfQ09OVkVSVF9GT1JXQVJEKGZyb21fdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlbmFtZSBUb1R5cGU8ZnJvbV90eXBlPjo6dHlwZSogY29udmVydF9mb3J3YXJkPGZyb21fdHlwZT4oY29uc3QgZnJvbV90eXBlJiBmcm9tKQorCisjZGVmaW5lIFRIUklGVF9DT05WRVJUX0NPTVBMRVRFX0RFQ0woZnJvbV90eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgY29udmVydChjb25zdCBmcm9tX3R5cGUmIGZyb20sIFRvVHlwZTxmcm9tX3R5cGU+Ojp0eXBlKiB0bykKKworI2RlZmluZSBUSFJJRlRfQ09OVkVSVF9VTkFSWV9ERUNMKGZyb21fdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlbmFtZSBUb1R5cGU8ZnJvbV90eXBlPjo6dHlwZSogY29udmVydDxmcm9tX3R5cGU+KGNvbnN0IGZyb21fdHlwZSYgZnJvbSkKKworI2RlZmluZSBUSFJJRlRfQ09OVkVSU0lPTl9ERUNMKGZyb21fdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQ09OVkVSVF9GT1JXQVJEKGZyb21fdHlwZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQ09OVkVSVF9DT01QTEVURV9ERUNMKGZyb21fdHlwZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQ09OVkVSVF9VTkFSWV9ERUNMKGZyb21fdHlwZSkKKworI2RlZmluZSBUSFJJRlRfQ09OVkVSVF9DT01QTEVURShmcm9tX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQ09OVkVSU0lPTl9ERUNMKGZyb21fdHlwZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRvVHlwZTxmcm9tX3R5cGU+Ojp0eXBlKiB0byA9IGNvbnZlcnRfZm9yd2FyZChmcm9tKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnZlcnQoZnJvbSwgdG8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0bzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQ09OVkVSVF9DT01QTEVURV9ERUNMKGZyb21fdHlwZSkKKworI2RlZmluZSBUSFJJRlRfQ09OVkVSU0lPTihmcm9tX3R5cGUsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQ09OVkVSVF9GT1JXQVJEKGZyb21fdHlwZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICh2b2lkKWZyb207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBuZXcgVG9UeXBlPGZyb21fdHlwZT46OnR5cGUoX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQ09OVkVSVF9DT01QTEVURShmcm9tX3R5cGUpCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9ET0MoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnJvbS5fX2lzc2V0LmRvYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRvLT5zZXRfZG9jKGZyb20uZG9jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOX0FOTk9UQVRJT05TKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQVNTSUdOX0RPQygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcm9tLl9faXNzZXQuYW5ub3RhdGlvbnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdG8tPmFubm90YXRpb25zXyA9IGZyb20uYW5ub3RhdGlvbnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG8tPnNldF9uYW1lKGZyb20ubWV0YWRhdGEubmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20ubWV0YWRhdGEuX19pc3NldC5kb2MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0by0+c2V0X2RvYyhmcm9tLm1ldGFkYXRhLmRvYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20ubWV0YWRhdGEuX19pc3NldC5hbm5vdGF0aW9ucykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0by0+YW5ub3RhdGlvbnNfID0gZnJvbS5tZXRhZGF0YS5hbm5vdGF0aW9uczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKzo6dF9wcm9ncmFtKiBnX3Byb2dyYW0gPSAwOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQywgdHlwZW5hbWUgUz4KK3N0cnVjdCBUeXBlQ2FjaGUgeworICBDKiBvcGVyYXRvcltdKGNvbnN0IGludDY0X3QmIGspIHsKKyAgICB0eXBlbmFtZSBzdGQ6Om1hcDxpbnQ2NF90LCBDKj46Oml0ZXJhdG9yIGl0ID0gY2FjaGUuZmluZChrKTsKKyAgICBpZiAoaXQgIT0gY2FjaGUuZW5kKCkpIHsKKyAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICB0eXBlbmFtZSBzdGQ6Om1hcDxpbnQ2NF90LCBTPjo6Y29uc3RfaXRlcmF0b3IgY2l0ID0gc291cmNlLT5maW5kKGspOworICAgICAgaWYgKGNpdCA9PSBzb3VyY2UtPmVuZCgpKSB7CisgICAgICAgIHRocm93IFRocmlmdFBsdWdpbkVycm9yKCJUeXBlIG5vdCBmb3VuZCIpOworICAgICAgfQorICAgICAgcmV0dXJuIChjYWNoZSlba10gPSBjb252ZXJ0X2ZvcndhcmQoY2l0LT5zZWNvbmQpOworICAgIH0KKyAgfQorCisgIHZvaWQgY29tcGlsZUFsbCgpIHsKKyAgICBib29zdDo6Zm9yX2VhY2goKnNvdXJjZSB8IGJvb3N0OjphZGFwdG9yczo6bWFwX2tleXMsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmVHlwZUNhY2hlOjpjb21waWxlLCB0aGlzLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKyAgfQorCisgIHN0ZDo6bWFwPGludDY0X3QsIFM+IGNvbnN0KiBzb3VyY2U7CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBzb3VyY2UgPSBudWxscHRyIDsKKyAgICBjYWNoZS5jbGVhcigpIDsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHN0ZDo6bWFwPGludDY0X3QsIEMqPiBjYWNoZTsKKworcHJpdmF0ZToKKyAgdm9pZCBjb21waWxlKGNvbnN0IGludDY0X3QmIGspIHsKKyAgICB0eXBlbmFtZSBzdGQ6Om1hcDxpbnQ2NF90LCBTPjo6Y29uc3RfaXRlcmF0b3IgY2l0ID0gc291cmNlLT5maW5kKGspOworICAgIGlmIChjaXQgPT0gc291cmNlLT5lbmQoKSkgeworICAgICAgdGhyb3cgVGhyaWZ0UGx1Z2luRXJyb3IoIlR5cGUgbm90IGZvdW5kICIpOworICAgIH0KKyAgICBjb252ZXJ0KGNpdC0+c2Vjb25kLCAoKnRoaXMpW2tdKTsKKyAgfQorfTsKK3N0ZDo6bWFwPGludDY0X3QsIDo6dF9wcm9ncmFtKj4gZ19wcm9ncmFtX2NhY2hlOworVHlwZUNhY2hlPCA6OnRfdHlwZSwgdF90eXBlPiBnX3R5cGVfY2FjaGU7CitUeXBlQ2FjaGU8IDo6dF9jb25zdCwgdF9jb25zdD4gZ19jb25zdF9jYWNoZTsKK1R5cGVDYWNoZTwgOjp0X3NlcnZpY2UsIHRfc2VydmljZT4gZ19zZXJ2aWNlX2NhY2hlOworCit2b2lkIGNsZWFyX2dsb2JhbF9jYWNoZSgpIHsKKyAgZ190eXBlX2NhY2hlLmNsZWFyKCk7CisgIGdfY29uc3RfY2FjaGUuY2xlYXIoKTsKKyAgZ19zZXJ2aWNlX2NhY2hlLmNsZWFyKCk7Cit9CisKK3ZvaWQgc2V0X2dsb2JhbF9jYWNoZShjb25zdCBUeXBlUmVnaXN0cnkmIGZyb20pIHsKKyAgZ190eXBlX2NhY2hlLnNvdXJjZSA9ICZmcm9tLnR5cGVzOworICBnX2NvbnN0X2NhY2hlLnNvdXJjZSA9ICZmcm9tLmNvbnN0YW50czsKKyAgZ19zZXJ2aWNlX2NhY2hlLnNvdXJjZSA9ICZmcm9tLnNlcnZpY2VzOworCisgIGdfdHlwZV9jYWNoZS5jb21waWxlQWxsKCk7CisgIGdfY29uc3RfY2FjaGUuY29tcGlsZUFsbCgpOworICBnX3NlcnZpY2VfY2FjaGUuY29tcGlsZUFsbCgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QqIHJlc29sdmVfdHlwZShpbnQ2NF90IG5hbWUpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KGdfdHlwZV9jYWNoZVtuYW1lXSk7Cit9CisKKzo6dF9jb25zdCogcmVzb2x2ZV9jb25zdChpbnQ2NF90IG5hbWUpIHsKKyAgcmV0dXJuIGdfY29uc3RfY2FjaGVbbmFtZV07Cit9CisKKzo6dF9zZXJ2aWNlKiByZXNvbHZlX3NlcnZpY2UoaW50NjRfdCBuYW1lKSB7CisgIHJldHVybiBnX3NlcnZpY2VfY2FjaGVbbmFtZV07Cit9CisKK1RIUklGVF9DT05WRVJUX0ZPUldBUkQodF9iYXNlX3R5cGUpIHsKKyNkZWZpbmUgVF9CQVNFVFlQRV9DQVNFKHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSB0X2Jhc2U6OlRZUEVfIyN0eXBlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ID0gOjp0X2Jhc2VfdHlwZTo6VFlQRV8jI3R5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBicmVhaworCisgIDo6dF9iYXNlX3R5cGU6OnRfYmFzZSB0ID0gOjp0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOworICBib29sIGlzX2JpbmFyeSA9IGZhbHNlOworICBzd2l0Y2ggKGZyb20udmFsdWUpIHsKKyAgICBUX0JBU0VUWVBFX0NBU0UoVk9JRCk7CisgICAgVF9CQVNFVFlQRV9DQVNFKFNUUklORyk7CisgICAgVF9CQVNFVFlQRV9DQVNFKEJPT0wpOworICAgIFRfQkFTRVRZUEVfQ0FTRShJOCk7CisgICAgVF9CQVNFVFlQRV9DQVNFKEkxNik7CisgICAgVF9CQVNFVFlQRV9DQVNFKEkzMik7CisgICAgVF9CQVNFVFlQRV9DQVNFKEk2NCk7CisgICAgVF9CQVNFVFlQRV9DQVNFKERPVUJMRSk7CisgIGNhc2UgdF9iYXNlOjpUWVBFX0JJTkFSWToKKyAgICB0ID0gOjp0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc7CisgICAgaXNfYmluYXJ5ID0gdHJ1ZTsKKyAgICBicmVhazsKKyAgfQorICA6OnRfYmFzZV90eXBlKiB0byA9IG5ldyA6OnRfYmFzZV90eXBlKGZyb20ubWV0YWRhdGEubmFtZSwgdCk7CisgIHRvLT5zZXRfYmluYXJ5KGlzX2JpbmFyeSk7CisgIHJldHVybiB0bzsKKyN1bmRlZiBUX0JBU0VUWVBFX0NBU0UKK30KK1RIUklGVF9DT05WRVJUX0NPTVBMRVRFKHRfYmFzZV90eXBlKSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKK30KKworVEhSSUZUX0NPTlZFUlRfRk9SV0FSRCh0X3R5cGVkZWYpIHsKKyAgOjp0X3R5cGVkZWYqIHRvOworICBpZiAoZnJvbS5mb3J3YXJkKSB7CisgICAgdG8gPSBuZXcgOjp0X3R5cGVkZWYoZ19wcm9ncmFtX2NhY2hlW2Zyb20ubWV0YWRhdGEucHJvZ3JhbV9pZF0sIGZyb20uc3ltYm9saWMsIHRydWUpOworICB9IGVsc2UgeworICAgIHRvID0gbmV3IDo6dF90eXBlZGVmKGdfcHJvZ3JhbV9jYWNoZVtmcm9tLm1ldGFkYXRhLnByb2dyYW1faWRdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVfdHlwZTwgOjp0X3R5cGU+KGZyb20udHlwZSksIGZyb20uc3ltYm9saWMpOworICB9CisgIHJldHVybiB0bzsKK30KK1RIUklGVF9DT05WRVJUX0NPTVBMRVRFKHRfdHlwZWRlZikgeworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2VudW1fdmFsdWUsIGZyb20ubmFtZSwgZnJvbS52YWx1ZSkgeworICBhc3NlcnQodG8pOworICBUSFJJRlRfQVNTSUdOX0FOTk9UQVRJT05TKCk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2VudW0sIGdfcHJvZ3JhbV9jYWNoZVtmcm9tLm1ldGFkYXRhLnByb2dyYW1faWRdKSB7CisgIGFzc2VydCh0byk7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgYm9vc3Q6OmZvcl9lYWNoKGZyb20uY29uc3RhbnRzIHwgYm9vc3Q6OmFkYXB0b3JzOjp0cmFuc2Zvcm1lZChjb252ZXJ0PHRfZW51bV92YWx1ZT4pLAorICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfZW51bTo6YXBwZW5kLCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2xpc3QsIHJlc29sdmVfdHlwZTwgOjp0X3R5cGU+KGZyb20uZWxlbV90eXBlKSkgeworICBhc3NlcnQodG8pOworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIGlmIChmcm9tLl9faXNzZXQuY3BwX25hbWUpCisgICAgdG8tPnNldF9jcHBfbmFtZShmcm9tLmNwcF9uYW1lKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfc2V0LCByZXNvbHZlX3R5cGU8IDo6dF90eXBlPihmcm9tLmVsZW1fdHlwZSkpIHsKKyAgYXNzZXJ0KHRvKTsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBpZiAoZnJvbS5fX2lzc2V0LmNwcF9uYW1lKQorICAgIHRvLT5zZXRfY3BwX25hbWUoZnJvbS5jcHBfbmFtZSk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X21hcCwKKyAgICAgICAgICAgICAgICAgIHJlc29sdmVfdHlwZTwgOjp0X3R5cGU+KGZyb20ua2V5X3R5cGUpLAorICAgICAgICAgICAgICAgICAgcmVzb2x2ZV90eXBlPCA6OnRfdHlwZT4oZnJvbS52YWxfdHlwZSkpIHsKKyAgYXNzZXJ0KHRvKTsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBpZiAoZnJvbS5fX2lzc2V0LmNwcF9uYW1lKQorICAgIHRvLT5zZXRfY3BwX25hbWUoZnJvbS5jcHBfbmFtZSk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2NvbnN0X3ZhbHVlLCApIHsKKyNkZWZpbmUgVF9DT05TVF9WQUxVRV9DQVNFKHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGZyb20uX19pc3NldC50eXBlIyNfdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdG8tPnNldF8jI3R5cGUoZnJvbS50eXBlIyNfdmFsKQorCisgIGFzc2VydCh0byk7CisgIGlmIChmcm9tLl9faXNzZXQubWFwX3ZhbCkgeworICAgIHRvLT5zZXRfbWFwKCk7CisgICAgZm9yIChzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlLCB0X2NvbnN0X3ZhbHVlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBmcm9tLm1hcF92YWwuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IGZyb20ubWFwX3ZhbC5lbmQoKTsgaXQrKykgeworICAgICAgdG8tPmFkZF9tYXAoY29udmVydChpdC0+Zmlyc3QpLCBjb252ZXJ0KGl0LT5zZWNvbmQpKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoZnJvbS5fX2lzc2V0Lmxpc3RfdmFsKSB7CisgICAgdG8tPnNldF9saXN0KCk7CisgICAgYm9vc3Q6OmZvcl9lYWNoKGZyb20ubGlzdF92YWwgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKCZjb252ZXJ0PHRfY29uc3RfdmFsdWU+KSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfY29uc3RfdmFsdWU6OmFkZF9saXN0LCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisgIH0gZWxzZQorICAgIFRfQ09OU1RfVkFMVUVfQ0FTRShzdHJpbmcpOworICBlbHNlIFRfQ09OU1RfVkFMVUVfQ0FTRShpbnRlZ2VyKTsKKyAgZWxzZSBUX0NPTlNUX1ZBTFVFX0NBU0UoZG91YmxlKTsKKyAgZWxzZSBpZiAoZnJvbS5fX2lzc2V0LmNvbnN0X2lkZW50aWZpZXJfdmFsKSB7CisgICAgdG8tPnNldF9pZGVudGlmaWVyKGZyb20uY29uc3RfaWRlbnRpZmllcl92YWwuaWRlbnRpZmllcl92YWwpIDsKKyAgICB0by0+c2V0X2VudW0ocmVzb2x2ZV90eXBlPCA6OnRfZW51bT4oZnJvbS5jb25zdF9pZGVudGlmaWVyX3ZhbC5lbnVtX3ZhbCkpIDsKKyAgfQorCisjdW5kZWYgVF9DT05TVF9WQUxVRV9DQVNFCit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2ZpZWxkLCByZXNvbHZlX3R5cGU8IDo6dF90eXBlPihmcm9tLnR5cGUpLCBmcm9tLm5hbWUsIGZyb20ua2V5KSB7CisgIGFzc2VydCh0byk7CisgIFRIUklGVF9BU1NJR05fQU5OT1RBVElPTlMoKTsKKyAgdG8tPnNldF9yZWZlcmVuY2UoZnJvbS5yZWZlcmVuY2UpOworICB0by0+c2V0X3JlcShzdGF0aWNfY2FzdDwgOjp0X2ZpZWxkOjplX3JlcT4oZnJvbS5yZXEpKTsKKyAgaWYgKGZyb20uX19pc3NldC52YWx1ZSkgeworICAgIHRvLT5zZXRfdmFsdWUoY29udmVydChmcm9tLnZhbHVlKSk7CisgIH0KK30KK1RIUklGVF9DT05WRVJTSU9OKHRfc3RydWN0LCBnX3Byb2dyYW1fY2FjaGVbZnJvbS5tZXRhZGF0YS5wcm9ncmFtX2lkXSkgeworICBhc3NlcnQodG8pOworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIHRvLT5zZXRfdW5pb24oZnJvbS5pc191bmlvbik7CisgIHRvLT5zZXRfeGNlcHRpb24oZnJvbS5pc194Y2VwdGlvbik7CisgIGJvb3N0Ojpmb3JfZWFjaChmcm9tLm1lbWJlcnMgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKGNvbnZlcnQ8dF9maWVsZD4pLAorICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfc3RydWN0OjphcHBlbmQsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfY29uc3QsCisgICAgICAgICAgICAgICAgICByZXNvbHZlX3R5cGU8IDo6dF90eXBlPihmcm9tLnR5cGUpLAorICAgICAgICAgICAgICAgICAgZnJvbS5uYW1lLAorICAgICAgICAgICAgICAgICAgY29udmVydDx0X2NvbnN0X3ZhbHVlPihmcm9tLnZhbHVlKSkgeworICBhc3NlcnQodG8pOworICBUSFJJRlRfQVNTSUdOX0RPQygpOworfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgcmVzb2x2ZV90eXBlPCA6OnRfdHlwZT4oZnJvbS5yZXR1cm50eXBlKSwKKyAgICAgICAgICAgICAgICAgIGZyb20ubmFtZSwKKyAgICAgICAgICAgICAgICAgIHJlc29sdmVfdHlwZTwgOjp0X3N0cnVjdD4oZnJvbS5hcmdsaXN0KSwKKyAgICAgICAgICAgICAgICAgIHJlc29sdmVfdHlwZTwgOjp0X3N0cnVjdD4oZnJvbS54Y2VwdGlvbnMpLAorICAgICAgICAgICAgICAgICAgZnJvbS5pc19vbmV3YXkpIHsKKyAgYXNzZXJ0KHRvKTsKKyAgVEhSSUZUX0FTU0lHTl9ET0MoKTsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9zZXJ2aWNlLCBnX3Byb2dyYW1fY2FjaGVbZnJvbS5tZXRhZGF0YS5wcm9ncmFtX2lkXSkgeworICBhc3NlcnQodG8pOworICBhc3NlcnQoZnJvbS5tZXRhZGF0YS5wcm9ncmFtX2lkKTsKKyAgYXNzZXJ0KGdfcHJvZ3JhbV9jYWNoZVtmcm9tLm1ldGFkYXRhLnByb2dyYW1faWRdKTsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworCisgIGJvb3N0Ojpmb3JfZWFjaChmcm9tLmZ1bmN0aW9ucyB8IGJvb3N0OjphZGFwdG9yczo6dHJhbnNmb3JtZWQoY29udmVydDx0X2Z1bmN0aW9uPiksCisgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9zZXJ2aWNlOjphZGRfZnVuY3Rpb24sIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKworICBpZiAoZnJvbS5fX2lzc2V0LmV4dGVuZHNfKQorICAgIHRvLT5zZXRfZXh0ZW5kcyhyZXNvbHZlX3NlcnZpY2UoZnJvbS5leHRlbmRzXykpOworfQorCitUSFJJRlRfQ09OVkVSVF9GT1JXQVJEKHRfdHlwZSkgeworI2RlZmluZSBUX1RZUEVfQ0FTRV9GV19UKGNhc2UsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoZnJvbS5fX2lzc2V0LmNhc2UjI192YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gY29udmVydF9mb3J3YXJkPHR5cGU+KGZyb20uY2FzZSMjX3ZhbCkKKyNkZWZpbmUgVF9UWVBFX0NBU0VfRlcoY2FzZSkgVF9UWVBFX0NBU0VfRldfVChjYXNlLCB0XyMjY2FzZSkKKworICBUX1RZUEVfQ0FTRV9GVyhiYXNlX3R5cGUpOworICBUX1RZUEVfQ0FTRV9GVyh0eXBlZGVmKTsKKyAgVF9UWVBFX0NBU0VfRlcoZW51bSk7CisgIFRfVFlQRV9DQVNFX0ZXKHN0cnVjdCk7CisgIFRfVFlQRV9DQVNFX0ZXX1QoeGNlcHRpb24sIHRfc3RydWN0KTsKKyAgVF9UWVBFX0NBU0VfRlcobGlzdCk7CisgIFRfVFlQRV9DQVNFX0ZXKHNldCk7CisgIFRfVFlQRV9DQVNFX0ZXKG1hcCk7CisgIFRfVFlQRV9DQVNFX0ZXKHNlcnZpY2UpOworICB0aHJvdyBUaHJpZnRQbHVnaW5FcnJvcigiSW52YWxpZCBkYXRhOiBUeXBlIHVuaW9uIGhhcyBubyB2YWx1ZS4iKTsKKyN1bmRlZiBUX1RZUEVfQ0FTRV9GV19UCisjdW5kZWYgVF9UWVBFX0NBU0VfRlcKK30KK1RIUklGVF9DT05WRVJUX0NPTVBMRVRFKHRfdHlwZSkgeworI2RlZmluZSBUX1RZUEVfQ0FTRV9UKGNhc2UsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBlbHNlIGlmIChmcm9tLl9faXNzZXQuY2FzZSMjX3ZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29udmVydDx0eXBlLCA6OnR5cGU+KGZyb20uY2FzZSMjX3ZhbCwgcmVpbnRlcnByZXRfY2FzdDwgOjp0eXBlKj4odG8pKQorI2RlZmluZSBUX1RZUEVfQ0FTRShjYXNlKSBUX1RZUEVfQ0FTRV9UKGNhc2UsIHRfIyNjYXNlKQorCisgIGlmIChmYWxzZSkgeworICB9CisgIFRfVFlQRV9DQVNFKGJhc2VfdHlwZSk7CisgIFRfVFlQRV9DQVNFKHR5cGVkZWYpOworICBUX1RZUEVfQ0FTRShlbnVtKTsKKyAgVF9UWVBFX0NBU0Uoc3RydWN0KTsKKyAgVF9UWVBFX0NBU0VfVCh4Y2VwdGlvbiwgdF9zdHJ1Y3QpOworICBUX1RZUEVfQ0FTRShsaXN0KTsKKyAgVF9UWVBFX0NBU0Uoc2V0KTsKKyAgVF9UWVBFX0NBU0UobWFwKTsKKyAgVF9UWVBFX0NBU0Uoc2VydmljZSk7CisgIGVsc2UgeworICAgIHRocm93IFRocmlmdFBsdWdpbkVycm9yKCJJbnZhbGlkIGRhdGE6IFR5cGUgdW5pb24gaGFzIG5vIHZhbHVlLiIpOworICB9CisjdW5kZWYgVF9UWVBFX0NBU0VfVAorI3VuZGVmIFRfVFlQRV9DQVNFCit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfc2NvcGUsICkgeworICBhc3NlcnQodG8pOworI2RlZmluZSBUX1NDT1BFX1JFU09MVkUodHlwZSwgbmFtZSwgYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKHN0ZDo6dmVjdG9yPGludDY0X3Q+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZyb20ubmFtZSMjcy5iZWdpbigpOyBpdCAhPSBmcm9tLm5hbWUjI3MuZW5kKCk7ICAgXAorICAgICAgIGl0KyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDo6dF8jI3R5cGUqIHQgPSByZXNvbHZlXyMjdHlwZSBhKCppdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRvLT5hZGRfIyNuYW1lKHQtPmdldF9uYW1lKCksIHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisgIFRfU0NPUEVfUkVTT0xWRSh0eXBlLCB0eXBlLCA8IDo6dF90eXBlPik7CisgIFRfU0NPUEVfUkVTT0xWRShjb25zdCwgY29uc3RhbnQsICk7CisgIFRfU0NPUEVfUkVTT0xWRShzZXJ2aWNlLCBzZXJ2aWNlLCApOworI3VuZGVmIFRfU0NPUEVfUkVTT0xWRQorfQorCitUSFJJRlRfQ09OVkVSVF9GT1JXQVJEKHRfcHJvZ3JhbSkgeworICA6OnRfcHJvZ3JhbSogdG8gPSBuZXcgOjp0X3Byb2dyYW0oZnJvbS5wYXRoLCBmcm9tLm5hbWUpOworICBmb3IgKHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZnJvbS5pbmNsdWRlcy5iZWdpbigpOyBpdCAhPSBmcm9tLmluY2x1ZGVzLmVuZCgpOworICAgICAgIGl0KyspIHsKKyAgICB0by0+YWRkX2luY2x1ZGUoY29udmVydF9mb3J3YXJkKCppdCkpOworICB9CisgIGdfcHJvZ3JhbV9jYWNoZVtmcm9tLnByb2dyYW1faWRdID0gdG87CisgIHJldHVybiB0bzsKK30KK1RIUklGVF9DT05WRVJUX0NPTVBMRVRFKHRfcHJvZ3JhbSkgeworICBhc3NlcnQodG8pOworICBnX3Byb2dyYW0gPSB0bzsKKyAgY29udmVydDx0X3Njb3BlLCA6OnRfc2NvcGU+KGZyb20uc2NvcGUsIHRvLT5zY29wZSgpKTsKKyAgVEhSSUZUX0FTU0lHTl9ET0MoKTsKKworICB0by0+c2V0X291dF9wYXRoKGZyb20ub3V0X3BhdGgsIGZyb20ub3V0X3BhdGhfaXNfYWJzb2x1dGUpOworCisgIGJvb3N0Ojpmb3JfZWFjaChmcm9tLnR5cGVkZWZzIHwgYm9vc3Q6OmFkYXB0b3JzOjp0cmFuc2Zvcm1lZCgmcmVzb2x2ZV90eXBlPCA6OnRfdHlwZWRlZj4pLAorICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfcHJvZ3JhbTo6YWRkX3R5cGVkZWYsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKyAgYm9vc3Q6OmZvcl9lYWNoKGZyb20uZW51bXMgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKCZyZXNvbHZlX3R5cGU8IDo6dF9lbnVtPiksCisgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9wcm9ncmFtOjphZGRfZW51bSwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworICBmb3IgKHN0ZDo6dmVjdG9yPGludDY0X3Q+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZyb20ub2JqZWN0cy5iZWdpbigpOyBpdCAhPSBmcm9tLm9iamVjdHMuZW5kKCk7CisgICAgICAgaXQrKykgeworICAgIDo6dF9zdHJ1Y3QqIHQyID0gcmVzb2x2ZV90eXBlPCA6OnRfc3RydWN0PigqaXQpOworICAgIGlmICh0Mi0+aXNfeGNlcHRpb24oKSkgeworICAgICAgdG8tPmFkZF94Y2VwdGlvbih0Mik7CisgICAgfSBlbHNlIHsKKyAgICAgIHRvLT5hZGRfc3RydWN0KHQyKTsKKyAgICB9CisgIH0KKyAgYm9vc3Q6OmZvcl9lYWNoKGZyb20uY29uc3RzIHwgYm9vc3Q6OmFkYXB0b3JzOjp0cmFuc2Zvcm1lZCgmcmVzb2x2ZV9jb25zdCksCisgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9wcm9ncmFtOjphZGRfY29uc3QsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKyAgYm9vc3Q6OmZvcl9lYWNoKGZyb20uc2VydmljZXMgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKCZyZXNvbHZlX3NlcnZpY2UpLAorICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfcHJvZ3JhbTo6YWRkX3NlcnZpY2UsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKworICBmb3IgKHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZnJvbS5pbmNsdWRlcy5iZWdpbigpOyBpdCAhPSBmcm9tLmluY2x1ZGVzLmVuZCgpOworICAgICAgIGl0KyspIHsKKyAgICBjb252ZXJ0KCppdCwgZ19wcm9ncmFtX2NhY2hlW2l0LT5wcm9ncmFtX2lkXSk7CisgIH0KKyAgc3RkOjpmb3JfZWFjaChmcm9tLmNfaW5jbHVkZXMuYmVnaW4oKSwgZnJvbS5jX2luY2x1ZGVzLmVuZCgpLAorICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X3Byb2dyYW06OmFkZF9jX2luY2x1ZGUsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKyAgc3RkOjpmb3JfZWFjaChmcm9tLmNwcF9pbmNsdWRlcy5iZWdpbigpLCBmcm9tLmNwcF9pbmNsdWRlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9wcm9ncmFtOjphZGRfY3BwX2luY2x1ZGUsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKyAgZm9yIChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZyb20ubmFtZXNwYWNlcy5iZWdpbigpOworICAgICAgIGl0ICE9IGZyb20ubmFtZXNwYWNlcy5lbmQoKTsgaXQrKykgeworICAgIHRvLT5zZXRfbmFtZXNwYWNlKGl0LT5maXJzdCwgaXQtPnNlY29uZCk7CisgIH0KKworICB0by0+c2V0X2luY2x1ZGVfcHJlZml4KGZyb20uaW5jbHVkZV9wcmVmaXgpOworICB0by0+c2V0X25hbWVzcGFjZShmcm9tLm5hbWVzcGFjZV8pOworfQorCitpbnQgR2VuZXJhdG9yUGx1Z2luOjpleGVjKGludCwgY2hhciogW10pIHsKKyNpZmRlZiBfV0lOMzIKKyAgX3NldG1vZGUoZmlsZW5vKHN0ZGluKSwgX09fQklOQVJZKTsKKyNlbmRpZgorICBzdGQ6OnNoYXJlZF9wdHI8VEZyYW1lZFRyYW5zcG9ydD4gdHJhbnNwb3J0KAorICAgICAgbmV3IFRGcmFtZWRUcmFuc3BvcnQoc3RkOjptYWtlX3NoYXJlZDxURkRUcmFuc3BvcnQ+KGZpbGVubyhzdGRpbikpKSk7CisgIFRCaW5hcnlQcm90b2NvbCBwcm90byh0cmFuc3BvcnQpOworICBHZW5lcmF0b3JJbnB1dCBpbnB1dDsKKyAgdHJ5IHsKKyAgICBpbnB1dC5yZWFkKCZwcm90byk7CisgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlcnIpIHsKKyAgICBzdGQ6OmNlcnIgPDwgIkVycm9yIHdoaWxlIHJlY2VpdmluZyBwbHVnaW4gZGF0YTogIiA8PCBlcnIud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaW5pdEdsb2JhbHMoKTsKKyAgOjp0X3Byb2dyYW0qIHAgPSBnX3Byb2dyYW0gPSBjb252ZXJ0X2ZvcndhcmQoaW5wdXQucHJvZ3JhbSk7CisgIHNldF9nbG9iYWxfY2FjaGUoaW5wdXQudHlwZV9yZWdpc3RyeSk7CisgIGNvbnZlcnQoaW5wdXQucHJvZ3JhbSwgcCk7CisKKyAgaW50IHJldCA9IGdlbmVyYXRlKHAsIGlucHV0LnBhcnNlZF9vcHRpb25zKTsKKyAgY2xlYXJHbG9iYWxzKCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworOjp0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGUgY29uc3RfdmFsdWVfY2FzZShjb25zdCB0X2NvbnN0X3ZhbHVlJiB2KSB7CisgIGlmICh2Ll9faXNzZXQubWFwX3ZhbCkKKyAgICByZXR1cm4gOjp0X2NvbnN0X3ZhbHVlOjpDVl9NQVA7CisgIGlmICh2Ll9faXNzZXQubGlzdF92YWwpCisgICAgcmV0dXJuIDo6dF9jb25zdF92YWx1ZTo6Q1ZfTElTVDsKKyAgaWYgKHYuX19pc3NldC5zdHJpbmdfdmFsKQorICAgIHJldHVybiA6OnRfY29uc3RfdmFsdWU6OkNWX1NUUklORzsKKyAgaWYgKHYuX19pc3NldC5pbnRlZ2VyX3ZhbCkKKyAgICByZXR1cm4gOjp0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSOworICBpZiAodi5fX2lzc2V0LmRvdWJsZV92YWwpCisgICAgcmV0dXJuIDo6dF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFOworICBpZiAodi5fX2lzc2V0LmNvbnN0X2lkZW50aWZpZXJfdmFsKQorICAgIHJldHVybiA6OnRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVI7CisgIHRocm93IFRocmlmdFBsdWdpbkVycm9yKCJVbmtub3duIGNvbnN0IHZhbHVlIHR5cGUiKTsKK30KKworYm9vbCB0X2NvbnN0X3ZhbHVlOjpvcGVyYXRvcjwoY29uc3QgdF9jb25zdF92YWx1ZSYgdGhhdCkgY29uc3QgeworICA6OnRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZSB0MSA9IGNvbnN0X3ZhbHVlX2Nhc2UoKnRoaXMpOworICA6OnRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZSB0MiA9IGNvbnN0X3ZhbHVlX2Nhc2UodGhhdCk7CisgIGlmICh0MSAhPSB0MikKKyAgICByZXR1cm4gdDEgPCB0MjsKKyAgc3dpdGNoICh0MSkgeworICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjoKKyAgICByZXR1cm4gaW50ZWdlcl92YWwgPCB0aGF0LmludGVnZXJfdmFsOworICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFOgorICAgIHJldHVybiBkb3VibGVfdmFsIDwgdGhhdC5kb3VibGVfdmFsOworICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgorICAgIHJldHVybiBzdHJpbmdfdmFsIDwgdGhhdC5zdHJpbmdfdmFsOworICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfTUFQOgorICAgIGlmICh0aGF0Lm1hcF92YWwuZW1wdHkoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBlbHNlIGlmIChtYXBfdmFsLmVtcHR5KCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbWFwX3ZhbC5iZWdpbigpLT5maXJzdCA8IHRoYXQubWFwX3ZhbC5iZWdpbigpLT5maXJzdDsKKyAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6CisgICAgaWYgKHRoYXQubGlzdF92YWwuZW1wdHkoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBlbHNlIGlmIChsaXN0X3ZhbC5lbXB0eSgpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGxpc3RfdmFsLmZyb250KCkgPCB0aGF0Lmxpc3RfdmFsLmZyb250KCk7CisgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgorICAgIHJldHVybiBpbnRlZ2VyX3ZhbCA8IHRoYXQuaW50ZWdlcl92YWw7CisgIH0KKyAgdGhyb3cgVGhyaWZ0UGx1Z2luRXJyb3IoIlVua25vd24gY29uc3QgdmFsdWUgdHlwZSIpOworfQorfQorfQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNWNkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfUExVR0lOX1BMVUdJTl9ICisjZGVmaW5lIFRfUExVR0lOX1BMVUdJTl9ICisKKyNpbmNsdWRlICJ0aHJpZnQvVGhyaWZ0LmgiCisKK2NsYXNzIHRfcHJvZ3JhbTsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwbHVnaW4geworCitzdHJ1Y3QgVGhyaWZ0UGx1Z2luRXJyb3IgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24geworICBUaHJpZnRQbHVnaW5FcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1zZykge30KK307CisKK2NsYXNzIEdlbmVyYXRvclBsdWdpbiB7CitwdWJsaWM6CisgIGludCBleGVjKGludCBhcmdjLCBjaGFyKiBhcmd2W10pOworICB2aXJ0dWFsIGludCBnZW5lcmF0ZSg6OnRfcHJvZ3JhbSosIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mKSA9IDA7Cit9OworfQorfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ5OGY5OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4udGhyaWZ0CkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBhczMgb3JnLmFwYWNoZS50aHJpZnQucGx1Z2luCituYW1lc3BhY2UgY3BwIGFwYWNoZS50aHJpZnQucGx1Z2luCituYW1lc3BhY2UgY3NoYXJwIFRocmlmdC5QbHVnaW4KK25hbWVzcGFjZSBkIHRocmlmdC5wbHVnaW4KK25hbWVzcGFjZSBkZWxwaGkgVGhyaWZ0LlBsdWdpbgorbmFtZXNwYWNlIGVybCB0aHJpZnQucGx1Z2luCituYW1lc3BhY2UgZ28gdGhyaWZ0CituYW1lc3BhY2UgaGF4ZSBvcmcuYXBhY2hlLnRocmlmdC5wbHVnaW4KK25hbWVzcGFjZSBocyBUaHJpZnQuUGx1Z2luCituYW1lc3BhY2UgamF2YSBvcmcuYXBhY2hlLnRocmlmdC5wbHVnaW4KK25hbWVzcGFjZSBvY2FtbCBUaHJpZnQKK25hbWVzcGFjZSBwZXJsIFRocmlmdC5QbHVnaW4KK25hbWVzcGFjZSBwaHAgdGhyaWZ0LnBsdWdpbgorbmFtZXNwYWNlIHB5IHRocmlmdC5wbHVnaW4KK25hbWVzcGFjZSByYiBUaHJpZnQKKwordHlwZWRlZiBpNjQgdF9wcm9ncmFtX2lkCit0eXBlZGVmIGk2NCB0X3R5cGVfaWQKK3R5cGVkZWYgaTY0IHRfY29uc3RfaWQKK3R5cGVkZWYgaTY0IHRfc2VydmljZV9pZAorCitlbnVtIHRfYmFzZSB7CisgICAgVFlQRV9WT0lECisgICAgVFlQRV9TVFJJTkcKKyAgICBUWVBFX0JPT0wKKyAgICBUWVBFX0k4CisgICAgVFlQRV9JMTYKKyAgICBUWVBFX0kzMgorICAgIFRZUEVfSTY0CisgICAgVFlQRV9ET1VCTEUKKyAgICBUWVBFX0JJTkFSWQorfQorCitzdHJ1Y3QgVHlwZU1ldGFkYXRhIHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIG5hbWUKKyAgMjogcmVxdWlyZWQgdF9wcm9ncmFtX2lkIHByb2dyYW1faWQKKyAgOTk6IG9wdGlvbmFsIG1hcDxzdHJpbmcsIHN0cmluZz4gYW5ub3RhdGlvbnMKKyAgMTAwOiBvcHRpb25hbCBzdHJpbmcgZG9jCit9CisKK3N0cnVjdCB0X2Jhc2VfdHlwZSB7CisgIDE6IHJlcXVpcmVkIFR5cGVNZXRhZGF0YSBtZXRhZGF0YQorICAyOiByZXF1aXJlZCB0X2Jhc2UgdmFsdWUKK30KKworc3RydWN0IHRfbGlzdCB7CisgIDE6IHJlcXVpcmVkIFR5cGVNZXRhZGF0YSBtZXRhZGF0YQorICAyOiBvcHRpb25hbCBzdHJpbmcgY3BwX25hbWUKKyAgMzogcmVxdWlyZWQgdF90eXBlX2lkIGVsZW1fdHlwZQorfQorCitzdHJ1Y3QgdF9zZXQgeworICAxOiByZXF1aXJlZCBUeXBlTWV0YWRhdGEgbWV0YWRhdGEKKyAgMjogb3B0aW9uYWwgc3RyaW5nIGNwcF9uYW1lCisgIDM6IHJlcXVpcmVkIHRfdHlwZV9pZCBlbGVtX3R5cGUKK30KKworc3RydWN0IHRfbWFwIHsKKyAgMTogcmVxdWlyZWQgVHlwZU1ldGFkYXRhIG1ldGFkYXRhCisgIDI6IG9wdGlvbmFsIHN0cmluZyBjcHBfbmFtZQorICAzOiByZXF1aXJlZCB0X3R5cGVfaWQga2V5X3R5cGUKKyAgNDogcmVxdWlyZWQgdF90eXBlX2lkIHZhbF90eXBlCit9CisKK3N0cnVjdCB0X3R5cGVkZWYgeworICAxOiByZXF1aXJlZCBUeXBlTWV0YWRhdGEgbWV0YWRhdGEKKyAgMjogcmVxdWlyZWQgdF90eXBlX2lkIHR5cGUKKyAgMzogcmVxdWlyZWQgc3RyaW5nIHN5bWJvbGljCisgIDQ6IHJlcXVpcmVkIGJvb2wgZm9yd2FyZAorfQorCitzdHJ1Y3QgdF9lbnVtX3ZhbHVlIHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIG5hbWUKKyAgMjogcmVxdWlyZWQgaTMyIHZhbHVlCisgIDk5OiBvcHRpb25hbCBtYXA8c3RyaW5nLCBzdHJpbmc+IGFubm90YXRpb25zCisgIDEwMDogb3B0aW9uYWwgc3RyaW5nIGRvYworfQorc3RydWN0IHRfZW51bSB7CisgIDE6IHJlcXVpcmVkIFR5cGVNZXRhZGF0YSBtZXRhZGF0YQorICAyOiByZXF1aXJlZCBsaXN0PHRfZW51bV92YWx1ZT4gY29uc3RhbnRzCit9CisKK2VudW0gUmVxdWlyZWRuZXNzIHsKKyAgVF9SRVFVSVJFRCA9IDAKKyAgVF9PUFRJT05BTCA9IDEKKyAgVF9PUFRfSU5fUkVRX09VVCA9IDIKK30KKworc3RydWN0IHRfY29uc3RfaWRlbnRpZmllcl92YWx1ZSB7CisgIDE6IHJlcXVpcmVkIHN0cmluZyBpZGVudGlmaWVyX3ZhbAorICAyOiByZXF1aXJlZCB0X3R5cGVfaWQgZW51bV92YWwKK30KKwordW5pb24gdF9jb25zdF92YWx1ZSB7CisgIDE6IG9wdGlvbmFsIG1hcDx0X2NvbnN0X3ZhbHVlLCB0X2NvbnN0X3ZhbHVlPiBtYXBfdmFsCisgIDI6IG9wdGlvbmFsIGxpc3Q8dF9jb25zdF92YWx1ZT4gbGlzdF92YWwKKyAgMzogb3B0aW9uYWwgc3RyaW5nIHN0cmluZ192YWwKKyAgNDogb3B0aW9uYWwgaTY0IGludGVnZXJfdmFsCisgIDU6IG9wdGlvbmFsIGRvdWJsZSBkb3VibGVfdmFsCisgIDg6IG9wdGlvbmFsIHRfY29uc3RfaWRlbnRpZmllcl92YWx1ZSBjb25zdF9pZGVudGlmaWVyX3ZhbAorfQorCitzdHJ1Y3QgdF9jb25zdCB7CisgIDE6IHJlcXVpcmVkIHN0cmluZyBuYW1lCisgIDI6IHJlcXVpcmVkIHRfdHlwZV9pZCB0eXBlCisgIDM6IHJlcXVpcmVkIHRfY29uc3RfdmFsdWUgdmFsdWUKKyAgMTAwOiBvcHRpb25hbCBzdHJpbmcgZG9jCit9CitzdHJ1Y3QgdF9maWVsZCB7CisgIDE6IHJlcXVpcmVkIHN0cmluZyBuYW1lCisgIDI6IHJlcXVpcmVkIHRfdHlwZV9pZCB0eXBlCisgIDM6IHJlcXVpcmVkIGkzMiBrZXkKKyAgNDogcmVxdWlyZWQgUmVxdWlyZWRuZXNzIHJlcQorICA1OiBvcHRpb25hbCB0X2NvbnN0X3ZhbHVlIHZhbHVlCisgIDEwOiByZXF1aXJlZCBib29sIHJlZmVyZW5jZQorICA5OTogb3B0aW9uYWwgbWFwPHN0cmluZywgc3RyaW5nPiBhbm5vdGF0aW9ucworICAxMDA6IG9wdGlvbmFsIHN0cmluZyBkb2MKK30KK3N0cnVjdCB0X3N0cnVjdCB7CisgIDE6IHJlcXVpcmVkIFR5cGVNZXRhZGF0YSBtZXRhZGF0YQorICAyOiByZXF1aXJlZCBsaXN0PHRfZmllbGQ+IG1lbWJlcnMKKyAgMzogcmVxdWlyZWQgYm9vbCBpc191bmlvbgorICA0OiByZXF1aXJlZCBib29sIGlzX3hjZXB0aW9uCit9CitzdHJ1Y3QgdF9mdW5jdGlvbiB7CisgIDE6IHJlcXVpcmVkIHN0cmluZyBuYW1lCisgIDI6IHJlcXVpcmVkIHRfdHlwZV9pZCByZXR1cm50eXBlCisgIDM6IHJlcXVpcmVkIHRfdHlwZV9pZCBhcmdsaXN0CisgIDQ6IHJlcXVpcmVkIHRfdHlwZV9pZCB4Y2VwdGlvbnMKKyAgNTogcmVxdWlyZWQgYm9vbCBpc19vbmV3YXkKKyAgMTAwOiBvcHRpb25hbCBzdHJpbmcgZG9jCit9CitzdHJ1Y3QgdF9zZXJ2aWNlIHsKKyAgMTogcmVxdWlyZWQgVHlwZU1ldGFkYXRhIG1ldGFkYXRhCisgIDI6IHJlcXVpcmVkIGxpc3Q8dF9mdW5jdGlvbj4gZnVuY3Rpb25zCisgIDM6IG9wdGlvbmFsIHRfc2VydmljZV9pZCBleHRlbmRzXworfQordW5pb24gdF90eXBlIHsKKyAgMTogb3B0aW9uYWwgdF9iYXNlX3R5cGUgYmFzZV90eXBlX3ZhbAorICAyOiBvcHRpb25hbCB0X3R5cGVkZWYgdHlwZWRlZl92YWwKKyAgMzogb3B0aW9uYWwgdF9lbnVtIGVudW1fdmFsCisgIDQ6IG9wdGlvbmFsIHRfc3RydWN0IHN0cnVjdF92YWwKKyAgNTogb3B0aW9uYWwgdF9zdHJ1Y3QgeGNlcHRpb25fdmFsCisgIDY6IG9wdGlvbmFsIHRfbGlzdCBsaXN0X3ZhbAorICA3OiBvcHRpb25hbCB0X3NldCBzZXRfdmFsCisgIDg6IG9wdGlvbmFsIHRfbWFwIG1hcF92YWwKKyAgOTogb3B0aW9uYWwgdF9zZXJ2aWNlIHNlcnZpY2VfdmFsCit9CitzdHJ1Y3QgdF9zY29wZSB7CisgIDE6IHJlcXVpcmVkIGxpc3Q8dF90eXBlX2lkPiB0eXBlcworICAyOiByZXF1aXJlZCBsaXN0PHRfY29uc3RfaWQ+IGNvbnN0YW50cworICAzOiByZXF1aXJlZCBsaXN0PHRfc2VydmljZV9pZD4gc2VydmljZXMKK30KKworc3RydWN0IFR5cGVSZWdpc3RyeSB7CisgIDE6IHJlcXVpcmVkIG1hcDx0X3R5cGVfaWQsIHRfdHlwZT4gdHlwZXMKKyAgMjogcmVxdWlyZWQgbWFwPHRfY29uc3RfaWQsIHRfY29uc3Q+IGNvbnN0YW50cworICAzOiByZXF1aXJlZCBtYXA8dF9zZXJ2aWNlX2lkLCB0X3NlcnZpY2U+IHNlcnZpY2VzCit9CisKK3N0cnVjdCB0X3Byb2dyYW0geworICAxOiByZXF1aXJlZCBzdHJpbmcgbmFtZQorICAyOiByZXF1aXJlZCB0X3Byb2dyYW1faWQgcHJvZ3JhbV9pZAorICAzOiByZXF1aXJlZCBzdHJpbmcgcGF0aAorICA0OiByZXF1aXJlZCBzdHJpbmcgbmFtZXNwYWNlXworICA1OiByZXF1aXJlZCBzdHJpbmcgb3V0X3BhdGgKKyAgNjogcmVxdWlyZWQgYm9vbCBvdXRfcGF0aF9pc19hYnNvbHV0ZQorICA4OiByZXF1aXJlZCBsaXN0PHRfcHJvZ3JhbT4gaW5jbHVkZXMKKyAgOTogcmVxdWlyZWQgc3RyaW5nIGluY2x1ZGVfcHJlZml4CisgIDEwOiByZXF1aXJlZCB0X3Njb3BlIHNjb3BlCisKKyAgMTE6IHJlcXVpcmVkIGxpc3Q8dF90eXBlX2lkPiB0eXBlZGVmcworICAxMjogcmVxdWlyZWQgbGlzdDx0X3R5cGVfaWQ+IGVudW1zCisgIDEzOiByZXF1aXJlZCBsaXN0PHRfY29uc3RfaWQ+IGNvbnN0cworICAxNDogcmVxdWlyZWQgbGlzdDx0X3R5cGVfaWQ+IG9iamVjdHMKKyAgMTU6IHJlcXVpcmVkIGxpc3Q8dF9zZXJ2aWNlX2lkPiBzZXJ2aWNlcworCisgIDE2OiByZXF1aXJlZCBtYXA8c3RyaW5nLCBzdHJpbmc+IG5hbWVzcGFjZXMKKyAgMTc6IHJlcXVpcmVkIGxpc3Q8c3RyaW5nPiBjcHBfaW5jbHVkZXMKKyAgMTg6IHJlcXVpcmVkIGxpc3Q8c3RyaW5nPiBjX2luY2x1ZGVzCisgIDEwMDogb3B0aW9uYWwgc3RyaW5nIGRvYworfQorCitzdHJ1Y3QgR2VuZXJhdG9ySW5wdXQgeworICAxOiByZXF1aXJlZCB0X3Byb2dyYW0gcHJvZ3JhbQorICAyOiByZXF1aXJlZCBUeXBlUmVnaXN0cnkgdHlwZV9yZWdpc3RyeQorICAzOiByZXF1aXJlZCBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjIzZGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5jYwpAQCAtMCwwICsxLDQ1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW8uaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNkZWZpbmUgVEhSSUZUX1BPUEVOKGNtZCkgX3BvcGVuKGNtZCwgIndiIikKKyNkZWZpbmUgVEhSSUZUX1BDTE9TRSBfcGNsb3NlCisjZWxzZQorI2RlZmluZSBUSFJJRlRfUE9QRU4oY21kKSBwb3BlbihjbWQsICJ3IikKKyNkZWZpbmUgVEhSSUZUX1BDTE9TRSBwY2xvc2UKKyNlbmRpZgorCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmgiCisKKyNpbmNsdWRlIDxib29zdC9yYW5nZS9hZGFwdG9yL21hcC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcmFuZ2UvYWxnb3JpdGhtL2NvcHkuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3JhbmdlL2FsZ29yaXRobS90cmFuc2Zvcm0uaHBwPgorCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi9wbHVnaW4uaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oIgorI2luY2x1ZGUgInRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmgiCisjaW5jbHVkZSAidGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaCIKKworI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vcGx1Z2luX3R5cGVzLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBwbHVnaW5fb3V0cHV0IHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20+Cit0eXBlbmFtZSBhcGFjaGU6OnRocmlmdDo6cGx1Z2luOjpUb1R5cGU8RnJvbT46OnR5cGUgY29udmVydChGcm9tKiBmcm9tKSB7CisgIHR5cGVuYW1lIGFwYWNoZTo6dGhyaWZ0OjpwbHVnaW46OlRvVHlwZTxGcm9tPjo6dHlwZSB0bzsKKyAgY29udmVydChmcm9tLCB0byk7CisgIHJldHVybiB0bzsKK30KKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7Cit1c2luZyBzdGQ6Om1ha2Vfc2hhcmVkOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEZEVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEZyYW1lZFRyYW5zcG9ydDsKKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OworCisjZGVmaW5lIFRIUklGVF9DT05WRVJTSU9OX04oZnJvbV90eXBlLCB0b190eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgY29udmVydDxmcm9tX3R5cGUsIHRvX3R5cGU+KGZyb21fdHlwZSAqIGZyb20sIHRvX3R5cGUgJiB0bykKKyNkZWZpbmUgVEhSSUZUX0NPTlZFUlNJT04odHlwZSkgVEhSSUZUX0NPTlZFUlNJT05fTig6OnR5cGUsIHBsdWdpbjo6dHlwZSkKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOX04oZnJvbV9uYW1lLCB0b19uYW1lLCBwcmVmaXgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcm9tKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdG8uX19zZXRfIyN0b19uYW1lKHByZWZpeChmcm9tLT5mcm9tX25hbWUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRIUklGVF9BU1NJR04obmFtZSkgVEhSSUZUX0FTU0lHTl9OKGdldF8jI25hbWUoKSwgbmFtZSwgKQorI2RlZmluZSBUSFJJRlRfQVNTSUdOX0NPTlZFUlQodHlwZSwgZnJvbV9uYW1lLCB0b19uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcm9tICYmIGZyb20tPmZyb21fbmFtZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdG8uX19zZXRfIyN0b19uYW1lKGNvbnZlcnQoZnJvbS0+ZnJvbV9uYW1lKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRIUklGVF9BU1NJR05fT1BUKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20tPmhhc18jI25hbWUoKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUSFJJRlRfQVNTSUdOKG5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9MSVNUX04odHlwZSwgZnJvbV9uYW1lLCB0b19uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnJvbSAmJiAhZnJvbS0+ZnJvbV9uYW1lLmVtcHR5KCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0ZDo6dHJhbnNmb3JtKGZyb20tPmZyb21fbmFtZS5iZWdpbigpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGZyb20tPmZyb21fbmFtZS5lbmQoKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcih0by50b19uYW1lKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnQ8IDo6dHlwZT4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCkgY29udmVydChyZWludGVycHJldF9jYXN0PHRfdHlwZSo+KGZyb20pLCB0by5tZXRhZGF0YSkKKworLy8gYSBnZW5lcmF0b3Igb2Ygc2VxdWVudGlhbCB1bmlxdWUgaWRlbnRpZmllcnMgZm9yIGFkZHJlc3NlcyAtLSBzbworLy8gdGhhdCB0aGUgVHlwZUNhY2hlIGJlbG93IGNhbiB1c2UgdGhvc2UgSURzIGluc3RlYWQgb2YKKy8vIGFkZHJlc3Nlcy4gVGhpcyBhbGxvd3MgR2VuZXJhdG9ySW5wdXQncyB2YXJpb3VzCisvLyB0X3twcm9ncmFtLHR5cGUsZXRjfV9pZCB0eXBlcyB0byBiZSBkZW5zZSBjb25zZWN1dGl2ZWx5LW51bWJlcmVkCisvLyBpbnRlZ2VycywgaW5zdGVhZCBvZiBsYXJnZSByYW5kb20tc2VlbWluZyBpbnRlZ2Vycy4KKy8vCisvLyBGdXJ0aGVybW9yZSwgdGhpcyBhbGxvd3MgR2VuZXJhdG9ySW5wdXQgdG8gYmUgZGV0ZXJtaW5pc3RpYyAobm8KKy8vIGFkZHJlc3Nlcywgc28gbm8gcHNldWRvLXJhbmRvbW5lc3MpIGFuZCB0aGF0IG1lYW5zIHJlcHJvZHVjaWJpbGl0eQorLy8gb2Ygb3V0cHV0LgorY29uc3QgaW50NjRfdCBPTkVfTUlMTElPTiA9IDEwMDAgKiAxMDAwOworY2xhc3MgaWRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgaWRfZ2VuZXJhdG9yKCkgOiBhZGRyMmlkXygpLCBuZXh0X2lkXyhPTkVfTUlMTElPTikge30KKworICB2b2lkIGNsZWFyKCkgeworICAgIGFkZHIyaWRfLmNsZWFyKCkgOworICAgIG5leHRfaWRfID0gT05FX01JTExJT04gOworICB9CisKKyAgaW50NjRfdCBnZW5zeW0oY29uc3QgaW50NjRfdCBhZGRyKSB7CisgICAgaWYgKCFhZGRyKSByZXR1cm4gMEwgOworICAgIHN0ZDo6bWFwPGludDY0X3QsIGludDY0X3Q+OjppdGVyYXRvciBpdCA9IGFkZHIyaWRfLmZpbmQoYWRkcik7CisgICAgaWYgKGl0ICE9IGFkZHIyaWRfLmVuZCgpKSByZXR1cm4gaXQtPnNlY29uZCA7CisgICAgaW50NjRfdCBpZCA9IG5leHRfaWRfKysgOworICAgIGFkZHIyaWRfLmluc2VydChzdGQ6Om1ha2VfcGFpcihhZGRyLCBpZCkpIDsKKyAgICByZXR1cm4gaWQgOworICB9CisKKyAgc3RkOjptYXA8aW50NjRfdCwgaW50NjRfdD4gYWRkcjJpZF8gOworICBpbnQ2NF90IG5leHRfaWRfIDsKK30gOworCisvLyBUbyBhdm9pZCBtdWx0aXBsZSBpbnN0YW5jZXMgb2Ygc2FtZSB0eXBlLCB0X3R5cGUsIHRfY29uc3QgYW5kIHRfc2VydmljZSBhcmUgc3RvcmVkIGluIG9uZSBwbGFjZQorLy8gYW5kIHJlZmVyZW5jZWQgYnkgSUQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBUeXBlQ2FjaGUgeworICB0eXBlZGVmIHR5cGVuYW1lIHBsdWdpbjo6VG9UeXBlPFQ+Ojp0eXBlIHRvX3R5cGU7CisgIGlkX2dlbmVyYXRvciBpZGdlbiA7CisgIHN0ZDo6bWFwPGludDY0X3QsIHRvX3R5cGU+IGNhY2hlOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMj4KKyAgaW50NjRfdCBzdG9yZShUMiogdCkgeworICAgIGludHB0cl90IGFkZHIgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pih0KTsKKyAgICBpZiAoIWFkZHIpIHJldHVybiAwTCA7CisKKyAgICBpbnQ2NF90IGlkID0gaWRnZW4uZ2Vuc3ltKGFkZHIpIDsKKyAgICBpZiAoY2FjaGUuZW5kKCkgIT0gY2FjaGUuZmluZChpZCkpIHJldHVybiBpZCA7CisKKyAgICAvLyBIQUNLOiBmYWtlIHJlc29sdmUgZm9yIHJlY3Vyc2l2ZSB0eXBlCisgICAgY2FjaGUuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGlkLCB0b190eXBlKCkpKTsKKyAgICAvLyBvdmVyd3JpdGUgd2l0aCB0cnVlIHZhbHVlCisgICAgY2FjaGVbaWRdID0gY29udmVydCh0KTsKKyAgICByZXR1cm4gaWQgOworICB9CisKKyAgdm9pZCBjbGVhcigpIHsgY2FjaGUuY2xlYXIoKSA7IGlkZ2VuLmNsZWFyKCk7IH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW50NjRfdCBzdG9yZV90eXBlKFQqIHQpOworCisjZGVmaW5lIFRfU1RPUkUodHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFR5cGVDYWNoZTx0XyMjdHlwZT4gdHlwZSMjX2NhY2hlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHBsdWdpbjo6dF8jI3R5cGUjI19pZCBzdG9yZV90eXBlPHRfIyN0eXBlPih0XyMjdHlwZSAqIHQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHR5cGUjI19jYWNoZS5zdG9yZTx0XyMjdHlwZT4odCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KK1RfU1RPUkUodHlwZSkKK1RfU1RPUkUoY29uc3QpCitUX1NUT1JFKHNlcnZpY2UpCisjdW5kZWYgVF9TVE9SRQorLy8gdGhpcyBpZF9nZW5lcmF0b3IgaXMgZm9yIGdlbnN5bW0taW5nIHRfcHJvZ3JhbV9pZAoraWRfZ2VuZXJhdG9yIHByb2dyYW1fY2FjaGUgOworCisjZGVmaW5lIFRIUklGVF9BU1NJR05fSURfTih0LCBmcm9tX25hbWUsIHRvX25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20gJiYgZnJvbS0+ZnJvbV9uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0by5fX3NldF8jI3RvX25hbWUoc3RvcmVfdHlwZTx0Pihmcm9tLT5mcm9tX25hbWUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9JRChuYW1lKSBUSFJJRlRfQVNTSUdOX0lEX04odF90eXBlLCBnZXRfIyNuYW1lKCksIG5hbWUpCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9MSVNUX0lEKHQsIG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnJvbSAmJiAhZnJvbS0+Z2V0XyMjbmFtZSMjcygpLmVtcHR5KCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0ZDo6dHJhbnNmb3JtKGZyb20tPmdldF8jI25hbWUjI3MoKS5iZWdpbigpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGZyb20tPmdldF8jI25hbWUjI3MoKS5lbmQoKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcih0by5uYW1lIyNzKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICZzdG9yZV90eXBlPHQ+KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworVEhSSUZUX0NPTlZFUlNJT05fTig6OnRfdHlwZSwgcGx1Z2luOjpUeXBlTWV0YWRhdGEpIHsKKyAgdG8ucHJvZ3JhbV9pZCA9IHByb2dyYW1fY2FjaGUuZ2Vuc3ltKHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdD4oZnJvbS0+Z2V0X3Byb2dyYW0oKSkpOworICBUSFJJRlRfQVNTSUdOX04oYW5ub3RhdGlvbnNfLCBhbm5vdGF0aW9ucywgKTsKKyAgaWYgKGZyb20tPmhhc19kb2MoKSkgeworICAgIHRvLl9fc2V0X2RvYyhmcm9tLT5nZXRfZG9jKCkpOworICB9CisgIFRIUklGVF9BU1NJR04obmFtZSk7Cit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfdHlwZWRlZikgeworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIFRIUklGVF9BU1NJR05fSUQodHlwZSk7CisgIFRIUklGVF9BU1NJR04oc3ltYm9saWMpOworICBUSFJJRlRfQVNTSUdOX04oaXNfZm9yd2FyZF90eXBlZGVmKCksIGZvcndhcmQsICk7Cit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfZW51bV92YWx1ZSkgeworICBUSFJJRlRfQVNTSUdOX09QVChkb2MpOworICBUSFJJRlRfQVNTSUdOKG5hbWUpOworICBUSFJJRlRfQVNTSUdOKHZhbHVlKTsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9lbnVtKSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgVEhSSUZUX0FTU0lHTl9MSVNUX04odF9lbnVtX3ZhbHVlLCBnZXRfY29uc3RhbnRzKCksIGNvbnN0YW50cyk7Cit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfY29uc3RfdmFsdWUpIHsKKyAgc3dpdGNoIChmcm9tLT5nZXRfdHlwZSgpKSB7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjoKKyAgICBUSFJJRlRfQVNTSUdOX04oZ2V0X2ludGVnZXIoKSwgaW50ZWdlcl92YWwsICk7CisgICAgYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFOgorICAgIFRIUklGVF9BU1NJR05fTihnZXRfZG91YmxlKCksIGRvdWJsZV92YWwsICk7CisgICAgYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgorICAgIFRIUklGVF9BU1NJR05fTihnZXRfc3RyaW5nKCksIHN0cmluZ192YWwsICk7CisgICAgYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjoKKyAgICBpZiAoZnJvbSkgeworICAgICAgYXBhY2hlOjp0aHJpZnQ6OnBsdWdpbjo6dF9jb25zdF9pZGVudGlmaWVyX3ZhbHVlIGNpZHZhbCA7CisgICAgICBpZiAoZnJvbS0+ZW51bV8pCisJY2lkdmFsLl9fc2V0X2VudW1fdmFsKHN0b3JlX3R5cGU8dF90eXBlPihmcm9tLT5lbnVtXykpOworICAgICAgY2lkdmFsLl9fc2V0X2lkZW50aWZpZXJfdmFsKGZyb20tPmdldF9pZGVudGlmaWVyKCkpOworICAgICAgdG8uX19zZXRfY29uc3RfaWRlbnRpZmllcl92YWwoY2lkdmFsKSA7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDoKKyAgICB0by5fX2lzc2V0Lm1hcF92YWwgPSB0cnVlOworICAgIGlmIChmcm9tICYmICFmcm9tLT5nZXRfbWFwKCkuZW1wdHkoKSkgeworICAgICAgZm9yIChzdGQ6Om1hcDwgOjp0X2NvbnN0X3ZhbHVlKiwgOjp0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGl0CisgICAgICAgICAgID0gZnJvbS0+Z2V0X21hcCgpLmJlZ2luKCk7CisgICAgICAgICAgIGl0ICE9IGZyb20tPmdldF9tYXAoKS5lbmQoKTsKKyAgICAgICAgICAgaXQrKykgeworICAgICAgICB0by5tYXBfdmFsLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb252ZXJ0KGl0LT5maXJzdCksIGNvbnZlcnQoaXQtPnNlY29uZCkpKTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTElTVDoKKyAgICB0by5fX2lzc2V0Lmxpc3RfdmFsID0gdHJ1ZTsKKyAgICBUSFJJRlRfQVNTSUdOX0xJU1RfTih0X2NvbnN0X3ZhbHVlLCBnZXRfbGlzdCgpLCBsaXN0X3ZhbCk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgcGx1Z2luOjpUaHJpZnRQbHVnaW5FcnJvcigiY29uc3QgdmFsdWUgaGFzIG5vIHZhbHVlIik7CisgIH0KK30KK1RIUklGVF9DT05WRVJTSU9OKHRfY29uc3QpIHsKKyAgVEhSSUZUX0FTU0lHTl9PUFQoZG9jKTsKKyAgVEhSSUZUX0FTU0lHTihuYW1lKTsKKyAgVEhSSUZUX0FTU0lHTl9JRCh0eXBlKTsKKyAgVEhSSUZUX0FTU0lHTl9DT05WRVJUKHRfY29uc3RfdmFsdWUsIGdldF92YWx1ZSgpLCB2YWx1ZSk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2ZpZWxkKSB7CisgIFRIUklGVF9BU1NJR05fT1BUKGRvYyk7CisgIFRIUklGVF9BU1NJR04obmFtZSk7CisgIFRIUklGVF9BU1NJR04oa2V5KTsKKyAgVEhSSUZUX0FTU0lHTl9OKGdldF9yZXEoKSwgcmVxLCAocGx1Z2luOjpSZXF1aXJlZG5lc3M6OnR5cGUpKTsKKyAgVEhSSUZUX0FTU0lHTihyZWZlcmVuY2UpOworICBUSFJJRlRfQVNTSUdOX0lEKHR5cGUpOworICBUSFJJRlRfQVNTSUdOX0NPTlZFUlQodF9jb25zdF92YWx1ZSwgZ2V0X3ZhbHVlKCksIHZhbHVlKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfc3RydWN0KSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgVEhSSUZUX0FTU0lHTl9MSVNUX04odF9maWVsZCwgZ2V0X21lbWJlcnMoKSwgbWVtYmVycyk7CisgIFRIUklGVF9BU1NJR05fTihpc191bmlvbigpLCBpc191bmlvbiwgKTsKKyAgVEhSSUZUX0FTU0lHTl9OKGlzX3hjZXB0aW9uKCksIGlzX3hjZXB0aW9uLCApOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9mdW5jdGlvbikgeworICBUSFJJRlRfQVNTSUdOX09QVChkb2MpOworICBUSFJJRlRfQVNTSUdOKG5hbWUpOworICBUSFJJRlRfQVNTSUdOX0lEKHJldHVybnR5cGUpOworICBUSFJJRlRfQVNTSUdOX04oaXNfb25ld2F5KCksIGlzX29uZXdheSwgKTsKKyAgVEhSSUZUX0FTU0lHTl9JRChhcmdsaXN0KTsKKyAgVEhSSUZUX0FTU0lHTl9JRCh4Y2VwdGlvbnMpOworfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X2xpc3QpIHsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBUSFJJRlRfQVNTSUdOX09QVChjcHBfbmFtZSk7CisgIFRIUklGVF9BU1NJR05fSUQoZWxlbV90eXBlKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfc2V0KSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgVEhSSUZUX0FTU0lHTl9PUFQoY3BwX25hbWUpOworICBUSFJJRlRfQVNTSUdOX0lEKGVsZW1fdHlwZSk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X21hcCkgeworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIFRIUklGVF9BU1NJR05fT1BUKGNwcF9uYW1lKTsKKyAgVEhSSUZUX0FTU0lHTl9JRChrZXlfdHlwZSk7CisgIFRIUklGVF9BU1NJR05fSUQodmFsX3R5cGUpOworfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X3NlcnZpY2UpIHsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBUSFJJRlRfQVNTSUdOX0xJU1RfTih0X2Z1bmN0aW9uLCBnZXRfZnVuY3Rpb25zKCksIGZ1bmN0aW9ucyk7CisgIFRIUklGVF9BU1NJR05fSURfTih0X3NlcnZpY2UsIGdldF9leHRlbmRzKCksIGV4dGVuZHNfKTsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9iYXNlX3R5cGUpIHsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBpZiAoZnJvbS0+aXNfYmluYXJ5KCkpIHsKKyAgICB0by52YWx1ZSA9IHBsdWdpbjo6dF9iYXNlOjpUWVBFX0JJTkFSWTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZyb20tPmdldF9iYXNlKCkpIHsKKyNkZWZpbmUgVF9CQVNFVFlQRV9DQVNFKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV8jI25hbWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0by52YWx1ZSA9IHBsdWdpbjo6dF9iYXNlOjpUWVBFXyMjbmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBicmVhaworICAgICAgVF9CQVNFVFlQRV9DQVNFKFZPSUQpOworICAgICAgVF9CQVNFVFlQRV9DQVNFKFNUUklORyk7CisgICAgICBUX0JBU0VUWVBFX0NBU0UoQk9PTCk7CisgICAgICBUX0JBU0VUWVBFX0NBU0UoSTgpOworICAgICAgVF9CQVNFVFlQRV9DQVNFKEkxNik7CisgICAgICBUX0JBU0VUWVBFX0NBU0UoSTMyKTsKKyAgICAgIFRfQkFTRVRZUEVfQ0FTRShJNjQpOworICAgICAgVF9CQVNFVFlQRV9DQVNFKERPVUJMRSk7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IHBsdWdpbjo6VGhyaWZ0UGx1Z2luRXJyb3IoIkJhc2UgdHlwZSB1bmlvbiBoYXMgbm8gdmFsdWUiKTsKKyAgICAgIGJyZWFrOworI3VuZGVmIFRfQkFTRVRZUEVfQ0FTRQorICAgIH0KKyAgfQorfQorVEhSSUZUX0NPTlZFUlNJT04odF90eXBlKSB7CisjZGVmaW5lIFRfQ09OVkVSVF9VTklPTl9OKG5hbWUsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVsc2UgaWYgKGZyb20tPmlzXyMjbmFtZSgpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG8uX19pc3NldC5uYW1lIyNfdmFsID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29udmVydChyZWludGVycHJldF9jYXN0PCA6OnR5cGUqPihmcm9tKSwgdG8ubmFtZSMjX3ZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgVF9DT05WRVJUX1VOSU9OKG5hbWUpIFRfQ09OVkVSVF9VTklPTl9OKG5hbWUsIHRfIyNuYW1lKQorICBpZiAoZmFsc2UpIHsKKyAgfQorICBUX0NPTlZFUlRfVU5JT04oYmFzZV90eXBlKQorICBUX0NPTlZFUlRfVU5JT04odHlwZWRlZikKKyAgVF9DT05WRVJUX1VOSU9OKGVudW0pCisgIFRfQ09OVkVSVF9VTklPTihzdHJ1Y3QpCisgIFRfQ09OVkVSVF9VTklPTl9OKHhjZXB0aW9uLCB0X3N0cnVjdCkKKyAgVF9DT05WRVJUX1VOSU9OKGxpc3QpCisgIFRfQ09OVkVSVF9VTklPTihzZXQpCisgIFRfQ09OVkVSVF9VTklPTihtYXApCisgIFRfQ09OVkVSVF9VTklPTihzZXJ2aWNlKQorICBlbHNlIHsKKyAgICB0aHJvdyBwbHVnaW46OlRocmlmdFBsdWdpbkVycm9yKCJUeXBlIHVuaW9uIGhhcyBubyB2YWx1ZSIpOworICB9CisjdW5kZWYgVF9DT05WRVJUX1VOSU9OX04KKyN1bmRlZiBUX0NPTlZFUlRfVU5JT04KK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9zY29wZSkgeworI2RlZmluZSBUX1NDT1BFX0FTU0lHTihuYW1lLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBib29zdDo6Y29weShmcm9tLT5uYW1lIyNzXyB8IGJvb3N0OjphZGFwdG9yczo6bWFwX3ZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICB8IGJvb3N0OjphZGFwdG9yczo6dHJhbnNmb3JtZWQoJnN0b3JlX3R5cGU8dHlwZT4pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIodG8ubmFtZSMjcykpCisgIFRfU0NPUEVfQVNTSUdOKHR5cGUsIHRfdHlwZSk7CisgIFRfU0NPUEVfQVNTSUdOKGNvbnN0YW50LCB0X2NvbnN0KTsKKyAgVF9TQ09QRV9BU1NJR04oc2VydmljZSwgdF9zZXJ2aWNlKTsKKyN1bmRlZiBUX1NDT1BFX0FTU0lHTgorfQorCit2b2lkIGdldF9nbG9iYWxfY2FjaGUocGx1Z2luOjpUeXBlUmVnaXN0cnkmIHJlZykgeworICByZWcudHlwZXMgPSB0eXBlX2NhY2hlLmNhY2hlOworICByZWcuY29uc3RhbnRzID0gY29uc3RfY2FjaGUuY2FjaGU7CisgIHJlZy5zZXJ2aWNlcyA9IHNlcnZpY2VfY2FjaGUuY2FjaGU7Cit9CisKK3ZvaWQgY2xlYXJfZ2xvYmFsX2NhY2hlKCkgeworICB0eXBlX2NhY2hlLmNsZWFyKCk7CisgIGNvbnN0X2NhY2hlLmNsZWFyKCk7CisgIHNlcnZpY2VfY2FjaGUuY2xlYXIoKTsKKyAgcHJvZ3JhbV9jYWNoZS5jbGVhcigpIDsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9wcm9ncmFtKSB7CisgIFRIUklGVF9BU1NJR05fQ09OVkVSVCh0X3Njb3BlLCBzY29wZSgpLCBzY29wZSk7CisgIFRIUklGVF9BU1NJR04ocGF0aCk7CisgIFRIUklGVF9BU1NJR04ob3V0X3BhdGgpOworICBUSFJJRlRfQVNTSUdOKG5hbWUpOworICBUSFJJRlRfQVNTSUdOKGluY2x1ZGVfcHJlZml4KTsKKyAgVEhSSUZUX0FTU0lHTihjcHBfaW5jbHVkZXMpOworICBUSFJJRlRfQVNTSUdOKGNfaW5jbHVkZXMpOworICBUSFJJRlRfQVNTSUdOKG5hbWVzcGFjZXMpOworICBUSFJJRlRfQVNTSUdOX04oaXNfb3V0X3BhdGhfYWJzb2x1dGUoKSwgb3V0X3BhdGhfaXNfYWJzb2x1dGUsICk7CisgIFRIUklGVF9BU1NJR05fTihnZXRfbmFtZXNwYWNlKCksIG5hbWVzcGFjZV8sICk7CisgIFRIUklGVF9BU1NJR05fTElTVF9JRCh0X3R5cGUsIHR5cGVkZWYpOworICBUSFJJRlRfQVNTSUdOX0xJU1RfSUQodF90eXBlLCBlbnVtKTsKKyAgVEhSSUZUX0FTU0lHTl9MSVNUX0lEKHRfdHlwZSwgb2JqZWN0KTsKKyAgVEhSSUZUX0FTU0lHTl9MSVNUX0lEKHRfY29uc3QsIGNvbnN0KTsKKyAgVEhSSUZUX0FTU0lHTl9MSVNUX0lEKHRfc2VydmljZSwgc2VydmljZSk7CisgIFRIUklGVF9BU1NJR05fTElTVF9OKHRfcHJvZ3JhbSwgZ2V0X2luY2x1ZGVzKCksIGluY2x1ZGVzKTsKKyAgdG8ucHJvZ3JhbV9pZCA9IHByb2dyYW1fY2FjaGUuZ2Vuc3ltKHJlaW50ZXJwcmV0X2Nhc3Q8cGx1Z2luOjp0X3Byb2dyYW1faWQ+KGZyb20pKTsKK30KKworUGx1Z2luRGVsZWdhdGVSZXN1bHQgZGVsZWdhdGVUb1BsdWdpbih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25zKSB7CisgIHN0ZDo6c3RyaW5nIGxhbmd1YWdlOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHBhcnNlZF9vcHRpb25zOworICB0X2dlbmVyYXRvcjo6cGFyc2Vfb3B0aW9ucyhvcHRpb25zLCBsYW5ndWFnZSwgcGFyc2VkX29wdGlvbnMpOworICBzdGQ6OnN0cmluZyBjbWQgPSAidGhyaWZ0LWdlbi0iOworICBpZiAobGFuZ3VhZ2UuZmluZF9maXJzdF9ub3Rfb2YoImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfLTAxMjM0NTY3ODkiKQorICAgICAgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICBzdGQ6OmNlcnIgPDwgIkludmFsaWQgbGFuZ3VhZ2UgbmFtZSIgPDwgc3RkOjplbmRsOworICAgIHJldHVybiBQTFVHSU5fRkFJTFVSRTsKKyAgfQorICBjbWQuYXBwZW5kKGxhbmd1YWdlKTsKKyAgRklMRSogZmQgPSBUSFJJRlRfUE9QRU4oY21kLmNfc3RyKCkpOworICBpZiAoZmQpIHsKKyNpZmRlZiBfV0lOMzIKKyAgICBfc2V0bW9kZShmaWxlbm8oZmQpLCBfT19CSU5BUlkpOworI2VuZGlmCisgICAgc2hhcmVkX3B0cjxURnJhbWVkVHJhbnNwb3J0PiB0cmFuc3BvcnQoCisgICAgICAgIG5ldyBURnJhbWVkVHJhbnNwb3J0KG1ha2Vfc2hhcmVkPFRGRFRyYW5zcG9ydD4oZmlsZW5vKGZkKSkpKTsKKyAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG8odHJhbnNwb3J0KTsKKworICAgIHBsdWdpbjo6R2VuZXJhdG9ySW5wdXQgaW5wdXQ7CisgICAgaW5wdXQuX19zZXRfcGFyc2VkX29wdGlvbnMocGFyc2VkX29wdGlvbnMpOworICAgIGNsZWFyX2dsb2JhbF9jYWNoZSgpOworICAgIGNvbnZlcnQocHJvZ3JhbSwgaW5wdXQucHJvZ3JhbSk7CisgICAgZ2V0X2dsb2JhbF9jYWNoZShpbnB1dC50eXBlX3JlZ2lzdHJ5KTsKKyAgICB0cnkgeworICAgICAgaW5wdXQud3JpdGUoJnByb3RvKTsKKyAgICAgIHRyYW5zcG9ydC0+Zmx1c2goKTsKKyAgICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZXJyKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIkVycm9yIHdoaWxlIHNlbmRpbmcgZGF0YSB0byBwbHVnaW46ICIgPDwgZXJyLndoYXQoKSA8PCBzdGQ6OmVuZGw7CisgICAgICBUSFJJRlRfUENMT1NFKGZkKTsKKyAgICAgIHJldHVybiBQTFVHSU5fRkFJTFVSRTsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBiZSBwcmVwYXJlZCBmb3IgaGFuZyBvciBjcmFzaCBvZiBjaGlsZCBwcm9jZXNzCisgICAgaW50IHJldCA9IFRIUklGVF9QQ0xPU0UoZmQpOworICAgIGlmICghcmV0KSB7CisgICAgICByZXR1cm4gUExVR0lOX1NVQ0NFRVNTOworICAgIH0gZWxzZSB7CisgICAgICBzdGQ6OmNlcnIgPDwgInBsdWdpbiBwcm9jZXNzIHJldHVybmVkIG5vbiB6ZXJvIGV4aXQgY29kZTogIiA8PCByZXQgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIFBMVUdJTl9GQUlMVVJFOworICAgIH0KKyAgfQorICBjbGVhcl9nbG9iYWxfY2FjaGUoKTsKKyAgcmV0dXJuIFBMVUdJTl9OT1RfRk9VTkQ7Cit9Cit9CisKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjJkMWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1BMVUdJTl9QTFVHSU5fT1VUUFVUX0gKKyNkZWZpbmUgVF9QTFVHSU5fUExVR0lOX09VVFBVVF9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK2NsYXNzIHRfcHJvZ3JhbTsKKworbmFtZXNwYWNlIHBsdWdpbl9vdXRwdXQgeworCitlbnVtIFBsdWdpbkRlbGVnYXRlUmVzdWx0IHsKKyAgUExVR0lOX05PVF9GT1VORCwKKyAgUExVR0lOX0ZBSUxVUkUsCisgIFBMVUdJTl9TVUNDRUVTUywKK307CisKK1BsdWdpbkRlbGVnYXRlUmVzdWx0IGRlbGVnYXRlVG9QbHVnaW4odF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9ucyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NmI1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vdHlwZV91dGlsLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfUExVR0lOX1RZUEVfVVRJTF9ICisjZGVmaW5lIFRfUExVR0lOX1RZUEVfVVRJTF9ICisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcGx1Z2luIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20+CitzdHJ1Y3QgVG9UeXBlIHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbT4KK3R5cGVuYW1lIFRvVHlwZTxGcm9tPjo6dHlwZSogY29udmVydF9mb3J3YXJkKGNvbnN0IEZyb20mKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgordm9pZCBjb252ZXJ0KGNvbnN0IEZyb20mLCBUbyopOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbT4KK3R5cGVuYW1lIFRvVHlwZTxGcm9tPjo6dHlwZSogY29udmVydChjb25zdCBGcm9tJiBmcm9tKTsKKworY2xhc3MgVHlwZVJlZ2lzdHJ5Owordm9pZCBzZXRfZ2xvYmFsX2NhY2hlKGNvbnN0IFR5cGVSZWdpc3RyeSYpOwordm9pZCBjbGVhcl9nbG9iYWxfY2FjaGUoKTsKK30KK30KK30KKworLy8gY29udmVyc2lvbiBmcm9tIHJhdyBjb21waWxlciB0eXBlcyB0byBwbHVnaW4gd2lyZSB0eXBlCituYW1lc3BhY2UgcGx1Z2luX291dHB1dCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KK3ZvaWQgY29udmVydChGcm9tKiBmcm9tLCBUbyYgdG8pOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbT4KK3R5cGVuYW1lIGFwYWNoZTo6dGhyaWZ0OjpwbHVnaW46OlRvVHlwZTxGcm9tPjo6dHlwZSBjb252ZXJ0KEZyb20qIGZyb20pOworCit2b2lkIGdldF9nbG9iYWxfY2FjaGUoYXBhY2hlOjp0aHJpZnQ6OnBsdWdpbjo6VHlwZVJlZ2lzdHJ5Jik7Cit2b2lkIGNsZWFyX2dsb2JhbF9jYWNoZSgpOworfQorCisjZGVmaW5lIFRIUklGVF9UWVBFX01BUFBJTkcoVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNsYXNzIFRZUEU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSBhcGFjaGUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSB0aHJpZnQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSBwbHVnaW4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNsYXNzIFRZUEU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0cnVjdCBUb1R5cGU8IDo6VFlQRT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZWRlZiBUWVBFIHR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0cnVjdCBUb1R5cGU8VFlQRT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZWRlZiA6OlRZUEUgdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KK1RIUklGVF9UWVBFX01BUFBJTkcodF9iYXNlX3R5cGUpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfY29uc3QpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfY29uc3RfdmFsdWUpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfY29udGFpbmVyKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X2RvYykKK1RIUklGVF9UWVBFX01BUFBJTkcodF9lbnVtKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X2VudW1fdmFsdWUpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfZmllbGQpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfZnVuY3Rpb24pCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfbGlzdCkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9tYXApCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfcHJvZ3JhbSkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9zY29wZSkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9zZXJ2aWNlKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X3NldCkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9zdHJ1Y3QpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfdHlwZSkKK1RIUklGVF9UWVBFX01BUFBJTkcodF90eXBlZGVmKQorI3VuZGVmIFRIUklGVF9UWVBFX01BUFBJTkcKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0bC5sbCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdGwubGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY3ODNiZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdGwubGwKQEAgLTAsMCArMSwzNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBUaHJpZnQgc2Nhbm5lci4KKyAqCisgKiBUb2tlbml6ZXMgYSB0aHJpZnQgZGVmaW5pdGlvbiBmaWxlLgorICovCisKKyV7CisKKy8qIFRoaXMgaXMgcmVkdW5kYW50IHdpdGggc29tZSBvZiB0aGUgZmxhZ3MgaW4gTWFrZWZpbGUuYW0sIGJ1dCBpdCB3b3JrcworICogd2hlbiBwZW9wbGUgb3ZlcnJpZGUgQ1hYRkxBR1Mgd2l0aG91dCBiZWluZyBjYXJlZnVsLiBUaGUgcHJhZ21hcyBhcmUKKyAqIHRoZSAncmlnaHQnIHdheSB0byBkbyBpdCwgYnV0IGRvbid0IHdvcmsgb24gb2xkLWVub3VnaCBHQ0MgKGluIHBhcnRpY3VsYXIKKyAqIHRoZSBHQ0MgdGhhdCBzaGlwIG9uIE1hYyBPUyBYIDEwLjYuNSwgKmNvdW50ZXIqIHRvIHdoYXQgdGhlIEdOVSBkb2NzIHNheSkKKyAqCisgKiBXZSBzaG91bGQgcmV2ZXJ0IHRoZSBNYWtlZmlsZS5hbSBjaGFuZ2VzIG9uY2UgQXBwbGUgc2hpcHMgYSByZWFzb25hYmxlCisgKiBHQ0MuCisgKi8KKyNpZmRlZiBfX0dOVUNfXworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC1mdW5jdGlvbiIKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtbGFiZWwiCisjZW5kaWYKKworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorCisvLyB3YXJuaW5nIEM0MTAyOiAnZmluZF9ydWxlJyA6IHVucmVmZXJlbmNlZCBsYWJlbAorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDEwMiApCisKKy8vIHdhcm5pbmcgQzQyNjc6ICdhcmd1bWVudCcgOiBjb252ZXJzaW9uIGZyb20gJ3NpemVfdCcgdG8gJ2ludCcsIHBvc3NpYmxlIGxvc3Mgb2YgZGF0YQorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDI2NyApCisKKy8vIGF2b2lkIGlzYXR0eSByZWRlZmluaXRpb24KKyNkZWZpbmUgWVlfTkVWRVJfSU5URVJBQ1RJVkUgMQorCisjZGVmaW5lIFlZX05PX1VOSVNURF9IIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSAidGhyaWZ0L3dpbmRvd3MvY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlICJ0aHJpZnQvbWFpbi5oIgorI2luY2x1ZGUgInRocmlmdC9jb21tb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2xvYmFscy5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKKworLyoqCisgKiBNdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHBhcnNlL3RfcHJvZ3JhbS5oLCBidXQgSSBjYW4ndCByZW1lbWJlciB3aHkgYW55bW9yZQorICogYmVjYXVzZSBJIHdyb3RlIHRoaXMgYSB3aGlsZSBhZ28uCisgKi8KKyNpZiBkZWZpbmVkKEJJU09OX1VTRV9QQVJTRVJfSF9FWFRFTlNJT04pCisjaW5jbHVkZSAidGhyaWZ0L3RocmlmdHkuaCIKKyNlbHNlCisjaW5jbHVkZSAidGhyaWZ0L3RocmlmdHkuaGgiCisjZW5kaWYKKwordm9pZCBpbnRlZ2VyX292ZXJmbG93KGNoYXIqIHRleHQpIHsKKyAgeXllcnJvcigiVGhpcyBpbnRlZ2VyIGlzIHRvbyBiaWc6IFwiJXNcIlxuIiwgdGV4dCk7CisgIGV4aXQoMSk7Cit9CisKK3ZvaWQgdW5leHBlY3RlZF90b2tlbihjaGFyKiB0ZXh0KSB7CisgIHl5ZXJyb3IoIlVuZXhwZWN0ZWQgdG9rZW4gaW4gaW5wdXQ6IFwiJXNcIlxuIiwgdGV4dCk7CisgIGV4aXQoMSk7Cit9CisKKyV9CisKKy8qKgorICogUHJvdmlkZXMgdGhlIHl5bGluZW5vIGdsb2JhbCwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgb3V0cHV0CisgKi8KKyVvcHRpb24gbGV4LWNvbXBhdAorCisvKioKKyAqIE91ciBpbnB1dHMgYXJlIGFsbCBzaW5nbGUgZmlsZXMsIHNvIG5vIG5lZWQgZm9yIHl5d3JhcAorICovCislb3B0aW9uIG5veXl3cmFwCisKKy8qKgorICogV2UgZG9uJ3QgdXNlIGl0LCBhbmQgaXQgZmlyZXMgdXAgd2FybmluZ3MgYXQgLVdhbGwKKyAqLworJW9wdGlvbiBub3VucHV0CisKKy8qKgorICogSGVscGVyIGRlZmluaXRpb25zLCBjb21tZW50cywgY29uc3RhbnRzLCBhbmQgd2hhdG5vdAorICovCisKK2ludGNvbnN0YW50ICAgKFsrLV0/WzAtOV0rKQoraGV4Y29uc3RhbnQgICAoWystXT8iMHgiWzAtOUEtRmEtZl0rKQorZHViY29uc3RhbnQgICAoWystXT9bMC05XSooXC5bMC05XSspPyhbZUVdWystXT9bMC05XSspPykKK2lkZW50aWZpZXIgICAgKFthLXpBLVpfXShcLlthLXpBLVpfMC05XXxbYS16QS1aXzAtOV0pKikKK3doaXRlc3BhY2UgICAgKFsgXHRcclxuXSopCitzaWxseWNvbW0gICAgICgiLyoiIioiKiIqLyIpCittdWx0aWNtX2JlZ2luICgiLyoiKQorZG9jdGV4dF9iZWdpbiAoIi8qKiIpCitjb21tZW50ICAgICAgICgiLy8iW15cbl0qKQordW5peGNvbW1lbnQgICAoIiMiW15cbl0qKQorc3ltYm9sICAgICAgICAoWzo7XCxce1x9XChcKVw9PD5cW1xdXSkKK2xpdGVyYWxfYmVnaW4gKFsnXCJdKQorCislJQorCit7d2hpdGVzcGFjZX0gICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KK3tzaWxseWNvbW19ICAgICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQorCit7ZG9jdGV4dF9iZWdpbn0geworICBzdGQ6OnN0cmluZyBwYXJzZWQoIi8qKiIpOworICBpbnQgc3RhdGUgPSAwOyAgLy8gMCA9IG5vcm1hbCwgMSA9ICIqIiBzZWVuLCAiKi8iIHNlZW4KKyAgd2hpbGUoc3RhdGUgPCAyKQorICB7CisgICAgaW50IGNoID0geXlpbnB1dCgpOworICAgIHBhcnNlZC5wdXNoX2JhY2soY2gpOworICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgIGNhc2UgRU9GOgorICAgICAgICB5eWVycm9yKCJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIGRvYy1jb21tZW50IGF0ICVkXG4iLCB5eWxpbmVubyk7CisgICAgICAgIGV4aXQoMSk7CisgICAgICBjYXNlICcqJzoKKyAgICAgICAgc3RhdGUgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJy8nOgorICAgICAgICBzdGF0ZSA9IChzdGF0ZSA9PSAxKSA/IDIgOiAwOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHN0YXRlID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHBkZWJ1ZygiZG9jdGV4dCA9IFwiJXNcIlxuIixwYXJzZWQuY19zdHIoKSk7CisKKyAvKiBUaGlzIGRvZXMgbm90IHNob3cgdXAgaW4gdGhlIHBhcnNlIHRyZWUuICovCisgLyogUmF0aGVyLCB0aGUgcGFyc2VyIHdpbGwgZ3JhYiBpdCBvdXQgb2YgdGhlIGdsb2JhbC4gKi8KKyAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgY2xlYXJfZG9jdGV4dCgpOworICAgIGdfZG9jdGV4dCA9IHN0cmR1cChwYXJzZWQuY19zdHIoKSArIDMpOworICAgIGFzc2VydChzdHJsZW4oZ19kb2N0ZXh0KSA+PSAyKTsKKyAgICBnX2RvY3RleHRbc3RybGVuKGdfZG9jdGV4dCkgLSAyXSA9ICcgJzsKKyAgICBnX2RvY3RleHRbc3RybGVuKGdfZG9jdGV4dCkgLSAxXSA9ICdcMCc7CisgICAgZ19kb2N0ZXh0ID0gY2xlYW5fdXBfZG9jdGV4dChnX2RvY3RleHQpOworICAgIGdfZG9jdGV4dF9saW5lbm8gPSB5eWxpbmVubzsKKyAgICBpZiggKGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSA9PSBOVUxMKSAmJiAoZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID09IElOVkFMSUQpKXsKKyAgICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSA9IHN0cmR1cChnX2RvY3RleHQpOworICAgICAgZ19wcm9ncmFtX2RvY3RleHRfbGluZW5vID0gZ19kb2N0ZXh0X2xpbmVubzsKKyAgICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IFNUSUxMX0NBTkRJREFURTsKKyAgICAgIHBkZWJ1ZygiJXMiLCJwcm9ncmFtIGRvY3RleHQgc2V0IHRvIFNUSUxMX0NBTkRJREFURSIpOworICAgIH0KKyAgfQorfQorCit7bXVsdGljbV9iZWdpbn0gIHsgLyogcGFyc2VkLCBidXQgdGhyb3duIGF3YXkgKi8KKyAgc3RkOjpzdHJpbmcgcGFyc2VkKCIvKiIpOworICBpbnQgc3RhdGUgPSAwOyAgLy8gMCA9IG5vcm1hbCwgMSA9ICIqIiBzZWVuLCAiKi8iIHNlZW4KKyAgd2hpbGUoc3RhdGUgPCAyKQorICB7CisgICAgaW50IGNoID0geXlpbnB1dCgpOworICAgIHBhcnNlZC5wdXNoX2JhY2soY2gpOworICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgIGNhc2UgRU9GOgorICAgICAgICB5eWVycm9yKCJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIG11bHRpbGluZSBjb21tZW50IGF0ICVkXG4iLCB5eWxpbmVubyk7CisgICAgICAgIGV4aXQoMSk7CisgICAgICBjYXNlICcqJzoKKyAgICAgICAgc3RhdGUgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJy8nOgorICAgICAgICBzdGF0ZSA9IChzdGF0ZSA9PSAxKSA/IDIgOiAwOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHN0YXRlID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHBkZWJ1ZygibXVsdGlfY29tbSA9IFwiJXNcIlxuIixwYXJzZWQuY19zdHIoKSk7Cit9CisKK3tjb21tZW50fSAgICAgICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQore3VuaXhjb21tZW50fSAgICAgICAgeyAvKiBkbyBub3RoaW5nICovICAgICAgICAgICAgICAgICB9CisKK3tzeW1ib2x9ICAgICAgICAgICAgIHsgcmV0dXJuIHl5dGV4dFswXTsgICAgICAgICAgICAgICAgfQorIioiICAgICAgICAgICAgICAgICAgeyByZXR1cm4geXl0ZXh0WzBdOyAgICAgICAgICAgICAgICB9CisKKyJmYWxzZSIgICAgICAgICAgICAgIHsgeXlsdmFsLmljb25zdD0wOyByZXR1cm4gdG9rX2ludF9jb25zdGFudDsgfQorInRydWUiICAgICAgICAgICAgICAgeyB5eWx2YWwuaWNvbnN0PTE7IHJldHVybiB0b2tfaW50X2NvbnN0YW50OyB9CisKKyJuYW1lc3BhY2UiICAgICAgICAgIHsgcmV0dXJuIHRva19uYW1lc3BhY2U7ICAgICAgICAgICAgfQorImNwcF9uYW1lc3BhY2UiICAgICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgiY3BwIik7IC8qIGRvIG5vdGhpbmcgKi8gfQorImNwcF9pbmNsdWRlIiAgICAgICAgeyByZXR1cm4gdG9rX2NwcF9pbmNsdWRlOyAgICAgICAgICB9CisiY3BwX3R5cGUiICAgICAgICAgICB7IHJldHVybiB0b2tfY3BwX3R5cGU7ICAgICAgICAgICAgIH0KKyJqYXZhX3BhY2thZ2UiICAgICAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woImphdmFfcGFja2FnZSIsICJqYXZhIik7IC8qIGRvIG5vdGhpbmcgKi8gfQorImNvY29hX3ByZWZpeCIgICAgICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgiY29jb2FfcHJlZml4IiwgImNvY29hIik7IC8qIGRvIG5vdGhpbmcgKi8gfQorImNzaGFycF9uYW1lc3BhY2UiICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgiY3NoYXJwIik7IC8qIGRvIG5vdGhpbmcgKi8gfQorImRlbHBoaV9uYW1lc3BhY2UiICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgiZGVscGhpIik7IC8qIGRvIG5vdGhpbmcgKi8gfQorInBocF9uYW1lc3BhY2UiICAgICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgicGhwIik7IC8qIGRvIG5vdGhpbmcgKi8gfQorInB5X21vZHVsZSIgICAgICAgICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgicHlfbW9kdWxlIiwgInB5Iik7IC8qIGRvIG5vdGhpbmcgKi8gfQorInBlcmxfcGFja2FnZSIgICAgICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgicGVybF9wYWNrYWdlIiwgInBlcmwiKTsgLyogZG8gbm90aGluZyAqLyB9CisicnVieV9uYW1lc3BhY2UiICAgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJydWJ5Iik7IC8qIGRvIG5vdGhpbmcgKi8gfQorInNtYWxsdGFsa19jYXRlZ29yeSIgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgic21hbGx0YWxrX2NhdGVnb3J5IiwgInNtYWxsdGFsay5jYXRlZ29yeSIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJzbWFsbHRhbGtfcHJlZml4IiAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woInNtYWxsdGFsa19jYXRlZ29yeSIsICJzbWFsbHRhbGsuY2F0ZWdvcnkiKTsgLyogZG8gbm90aGluZyAqLyB9CisieHNkX2FsbCIgICAgICAgICAgICB7IHJldHVybiB0b2tfeHNkX2FsbDsgICAgICAgICAgICAgIH0KKyJ4c2Rfb3B0aW9uYWwiICAgICAgIHsgcmV0dXJuIHRva194c2Rfb3B0aW9uYWw7ICAgICAgICAgfQorInhzZF9uaWxsYWJsZSIgICAgICAgeyByZXR1cm4gdG9rX3hzZF9uaWxsYWJsZTsgICAgICAgICB9CisieHNkX25hbWVzcGFjZSIgICAgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJ4c2QiKTsgLyogZG8gbm90aGluZyAqLyB9CisieHNkX2F0dHJzIiAgICAgICAgICB7IHJldHVybiB0b2tfeHNkX2F0dHJzOyAgICAgICAgICAgIH0KKyJpbmNsdWRlIiAgICAgICAgICAgIHsgcmV0dXJuIHRva19pbmNsdWRlOyAgICAgICAgICAgICAgfQorInZvaWQiICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3ZvaWQ7ICAgICAgICAgICAgICAgICB9CisiYm9vbCIgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfYm9vbDsgICAgICAgICAgICAgICAgIH0KKyJieXRlIiAgICAgICAgICAgICAgIHsKKyAgZW1pdF9ieXRlX3R5cGVfd2FybmluZygpOworICByZXR1cm4gdG9rX2k4OworfQorImk4IiAgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2k4OyAgICAgICAgICAgICAgICAgICB9CisiaTE2IiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfaTE2OyAgICAgICAgICAgICAgICAgIH0KKyJpMzIiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19pMzI7ICAgICAgICAgICAgICAgICAgfQorImk2NCIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2k2NDsgICAgICAgICAgICAgICAgICB9CisiZG91YmxlIiAgICAgICAgICAgICB7IHJldHVybiB0b2tfZG91YmxlOyAgICAgICAgICAgICAgIH0KKyJzdHJpbmciICAgICAgICAgICAgIHsgcmV0dXJuIHRva19zdHJpbmc7ICAgICAgICAgICAgICAgfQorImJpbmFyeSIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2JpbmFyeTsgICAgICAgICAgICAgICB9Cisic2xpc3QiIHsKKyAgcHdhcm5pbmcoMCwgIlwic2xpc3RcIiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgY29tcGlsZXIgdmVyc2lvbi4gIFRoaXMgdHlwZSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBcInN0cmluZ1wiLlxuIik7CisgIHJldHVybiB0b2tfc2xpc3Q7Cit9Cisic2VudW0iIHsKKyAgcHdhcm5pbmcoMCwgIlwic2VudW1cIiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgY29tcGlsZXIgdmVyc2lvbi4gIFRoaXMgdHlwZSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBcInN0cmluZ1wiLlxuIik7CisgIHJldHVybiB0b2tfc2VudW07Cit9CisibWFwIiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfbWFwOyAgICAgICAgICAgICAgICAgIH0KKyJsaXN0IiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19saXN0OyAgICAgICAgICAgICAgICAgfQorInNldCIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3NldDsgICAgICAgICAgICAgICAgICB9Cisib25ld2F5IiAgICAgICAgICAgICB7IHJldHVybiB0b2tfb25ld2F5OyAgICAgICAgICAgICAgIH0KKyJ0eXBlZGVmIiAgICAgICAgICAgIHsgcmV0dXJuIHRva190eXBlZGVmOyAgICAgICAgICAgICAgfQorInN0cnVjdCIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3N0cnVjdDsgICAgICAgICAgICAgICB9CisidW5pb24iICAgICAgICAgICAgICB7IHJldHVybiB0b2tfdW5pb247ICAgICAgICAgICAgICAgIH0KKyJleGNlcHRpb24iICAgICAgICAgIHsgcmV0dXJuIHRva194Y2VwdGlvbjsgICAgICAgICAgICAgfQorImV4dGVuZHMiICAgICAgICAgICAgeyByZXR1cm4gdG9rX2V4dGVuZHM7ICAgICAgICAgICAgICB9CisidGhyb3dzIiAgICAgICAgICAgICB7IHJldHVybiB0b2tfdGhyb3dzOyAgICAgICAgICAgICAgIH0KKyJzZXJ2aWNlIiAgICAgICAgICAgIHsgcmV0dXJuIHRva19zZXJ2aWNlOyAgICAgICAgICAgICAgfQorImVudW0iICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2VudW07ICAgICAgICAgICAgICAgICB9CisiY29uc3QiICAgICAgICAgICAgICB7IHJldHVybiB0b2tfY29uc3Q7ICAgICAgICAgICAgICAgIH0KKyJyZXF1aXJlZCIgICAgICAgICAgIHsgcmV0dXJuIHRva19yZXF1aXJlZDsgICAgICAgICAgICAgfQorIm9wdGlvbmFsIiAgICAgICAgICAgeyByZXR1cm4gdG9rX29wdGlvbmFsOyAgICAgICAgICAgICB9CisiYXN5bmMiIHsKKyAgcHdhcm5pbmcoMCwgIlwiYXN5bmNcIiBpcyBkZXByZWNhdGVkLiAgSXQgaXMgY2FsbGVkIFwib25ld2F5XCIgbm93LlxuIik7CisgIHJldHVybiB0b2tfb25ld2F5OworfQorIiYiICAgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3JlZmVyZW5jZTsgICAgICAgICAgICB9CisKK3tpbnRjb25zdGFudH0geworICBlcnJubyA9IDA7CisgIHl5bHZhbC5pY29uc3QgPSBzdHJ0b2xsKHl5dGV4dCwgTlVMTCwgMTApOworICBpZiAoZXJybm8gPT0gRVJBTkdFKSB7CisgICAgaW50ZWdlcl9vdmVyZmxvdyh5eXRleHQpOworICB9CisgIHJldHVybiB0b2tfaW50X2NvbnN0YW50OworfQorCit7aGV4Y29uc3RhbnR9IHsKKyAgZXJybm8gPSAwOworICBjaGFyIHNpZ24gPSB5eXRleHRbMF07CisgIGludCBzaGlmdCA9IHNpZ24gPT0gJzAnID8gMiA6IDM7CisgIHl5bHZhbC5pY29uc3QgPSBzdHJ0b2xsKHl5dGV4dCtzaGlmdCwgTlVMTCwgMTYpOworICBpZiAoc2lnbiA9PSAnLScpIHsKKyAgICB5eWx2YWwuaWNvbnN0ID0gLXl5bHZhbC5pY29uc3Q7CisgIH0KKyAgaWYgKGVycm5vID09IEVSQU5HRSkgeworICAgIGludGVnZXJfb3ZlcmZsb3coeXl0ZXh0KTsKKyAgfQorICByZXR1cm4gdG9rX2ludF9jb25zdGFudDsKK30KKwore2lkZW50aWZpZXJ9IHsKKyAgeXlsdmFsLmlkID0gc3RyZHVwKHl5dGV4dCk7CisgIHJldHVybiB0b2tfaWRlbnRpZmllcjsKK30KKwore2R1YmNvbnN0YW50fSB7CisgLyogRGVsaWJlcmF0ZWx5IHBsYWNlZCBhZnRlciBpZGVudGlmaWVyLCBzaW5jZSAiZTEwIiBpcyBOT1QgYSBkb3VibGUgbGl0ZXJhbCAoVEhSSUZULTM0NzcpICovCisgIHl5bHZhbC5kY29uc3QgPSBhdG9mKHl5dGV4dCk7CisgIHJldHVybiB0b2tfZHViX2NvbnN0YW50OworfQorCit7bGl0ZXJhbF9iZWdpbn0geworICBjaGFyIG1hcmsgPSB5eXRleHRbMF07CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgZm9yKDs7KQorICB7CisgICAgaW50IGNoID0geXlpbnB1dCgpOworICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgIGNhc2UgRU9GOgorICAgICAgICB5eWVycm9yKCJFbmQgb2YgZmlsZSB3aGlsZSByZWFkIHN0cmluZyBhdCAlZFxuIiwgeXlsaW5lbm8pOworICAgICAgICBleGl0KDEpOworICAgICAgY2FzZSAnXG4nOgorICAgICAgICB5eWVycm9yKCJFbmQgb2YgbGluZSB3aGlsZSByZWFkIHN0cmluZyBhdCAlZFxuIiwgeXlsaW5lbm8gLSAxKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgY2ggPSB5eWlucHV0KCk7CisgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1xyJyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1xuJyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1x0Jyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJyInKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1wnJyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdcXCcpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHl5ZXJyb3IoIkJhZCBlc2NhcGUgY2hhcmFjdGVyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChjaCA9PSBtYXJrKSB7CisgICAgICAgICAgeXlsdmFsLmlkID0gc3RyZHVwKHJlc3VsdC5jX3N0cigpKTsKKyAgICAgICAgICByZXR1cm4gdG9rX2xpdGVyYWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhjaCk7CisgICAgICAgIH0KKyAgICB9CisgIH0KK30KKworCisuIHsKKyAgdW5leHBlY3RlZF90b2tlbih5eXRleHQpOworfQorCislJQorCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyggcG9wICkKKyNlbmRpZgorCisvKiB2aW06IGZpbGV0eXBlPWxleAorKi8KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdHkueXkgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnR5Lnl5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMzRhZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnR5Lnl5CkBAIC0wLDAgKzEsMTIwMSBAQAorJWNvZGUgcmVxdWlyZXMgeworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKK30KKyV7CisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogVGhyaWZ0IHBhcnNlci4KKyAqCisgKiBUaGlzIHBhcnNlciBpcyB1c2VkIG9uIGEgdGhyaWZ0IGRlZmluaXRpb24gZmlsZS4KKyAqCisgKi8KKworI2lmbmRlZiBfX1NURENfTElNSVRfTUFDUk9TCisjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKKyNlbmRpZgorI2lmbmRlZiBfX1NURENfRk9STUFUX01BQ1JPUworI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUworI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZm5kZWYgX01TQ19WRVIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSAidGhyaWZ0L3dpbmRvd3MvY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlICJ0aHJpZnQvbWFpbi5oIgorI2luY2x1ZGUgInRocmlmdC9jb21tb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2xvYmFscy5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zY29wZS5oIgorCisjaWZkZWYgX01TQ19WRVIKKy8vd2FybmluZyBDNDA2NTogc3dpdGNoIHN0YXRlbWVudCBjb250YWlucyAnZGVmYXVsdCcgYnV0IG5vICdjYXNlJyBsYWJlbHMKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQwNjUpCisjZW5kaWYKKworLyoqCisgKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBpcyB1c2VkIGZvciBhdXRvbWF0aWMgbnVtYmVyaW5nIG9mIGZpZWxkIGluZGljZXMgZXRjLgorICogd2hlbiBwYXJzaW5nIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LiBGaWVsZCB2YWx1ZXMgYXJlIGF1dG9tYXRpY2FsbHkKKyAqIGFzc2lnbmVkIHN0YXJ0aW5nIGZyb20gLTEgYW5kIHdvcmtpbmcgdGhlaXIgd2F5IGRvd24uCisgKi8KK2ludCB5X2ZpZWxkX3ZhbCA9IC0xOworLyoqCisgKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBpcyB1c2VkIGZvciBhdXRvbWF0aWMgbnVtYmVyaW5nIG9mIGVudW0gdmFsdWVzLgorICogeV9lbnVtX3ZhbCBpcyB0aGUgbGFzdCB2YWx1ZSBhc3NpZ25lZDsgdGhlIG5leHQgYXV0by1hc3NpZ25lZCB2YWx1ZSB3aWxsIGJlCisgKiB5X2VudW1fdmFsKzEsIGFuZCB0aGVuIGl0IGNvbnRpbnVlcyB3b3JraW5nIHVwd2FyZHMuICBFeHBsaWNpdGx5IHNwZWNpZmllZAorICogZW51bSB2YWx1ZXMgcmVzZXQgeV9lbnVtX3ZhbCB0byB0aGF0IHZhbHVlLgorICovCitpbnQzMl90IHlfZW51bV92YWwgPSAtMTsKK2ludCBnX2FyZ2xpc3QgPSAwOworY29uc3QgaW50IHN0cnVjdF9pc19zdHJ1Y3QgPSAwOworY29uc3QgaW50IHN0cnVjdF9pc191bmlvbiA9IDE7CisKKyV9CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSB0aGUgcGFyc2VyIHRvIGhvbGQgdGhlIGRhdGEgdHlwZXMgYXNzb2NpYXRlZCB3aXRoCisgKiB2YXJpb3VzIHBhcnNlIG5vZGVzLgorICovCisldW5pb24geworICBjaGFyKiAgICAgICAgICBpZDsKKyAgaW50NjRfdCAgICAgICAgaWNvbnN0OworICBkb3VibGUgICAgICAgICBkY29uc3Q7CisgIGJvb2wgICAgICAgICAgIHRib29sOworICB0X2RvYyogICAgICAgICB0ZG9jOworICB0X3R5cGUqICAgICAgICB0dHlwZTsKKyAgdF9iYXNlX3R5cGUqICAgdGJhc2U7CisgIHRfdHlwZWRlZiogICAgIHR0eXBlZGVmOworICB0X2VudW0qICAgICAgICB0ZW51bTsKKyAgdF9lbnVtX3ZhbHVlKiAgdGVudW12OworICB0X2NvbnN0KiAgICAgICB0Y29uc3Q7CisgIHRfY29uc3RfdmFsdWUqIHRjb25zdHY7CisgIHRfc3RydWN0KiAgICAgIHRzdHJ1Y3Q7CisgIHRfc2VydmljZSogICAgIHRzZXJ2aWNlOworICB0X2Z1bmN0aW9uKiAgICB0ZnVuY3Rpb247CisgIHRfZmllbGQqICAgICAgIHRmaWVsZDsKKyAgY2hhciogICAgICAgICAgZHRleHQ7CisgIHRfZmllbGQ6OmVfcmVxIGVyZXE7CisgIHRfYW5ub3RhdGlvbiogIHRhbm5vdDsKKyAgdF9maWVsZF9pZCAgICAgdGZpZWxkaWQ7Cit9CisKKy8qKgorICogU3RyaW5ncyBpZGVudGlmaWVyCisgKi8KKyV0b2tlbjxpZD4gICAgIHRva19pZGVudGlmaWVyCisldG9rZW48aWQ+ICAgICB0b2tfbGl0ZXJhbAorJXRva2VuPGR0ZXh0PiAgdG9rX2RvY3RleHQKKworLyoqCisgKiBDb25zdGFudCB2YWx1ZXMKKyAqLworJXRva2VuPGljb25zdD4gdG9rX2ludF9jb25zdGFudAorJXRva2VuPGRjb25zdD4gdG9rX2R1Yl9jb25zdGFudAorCisvKioKKyAqIEhlYWRlciBrZXl3b3JkcworICovCisldG9rZW4gdG9rX2luY2x1ZGUKKyV0b2tlbiB0b2tfbmFtZXNwYWNlCisldG9rZW4gdG9rX2NwcF9pbmNsdWRlCisldG9rZW4gdG9rX2NwcF90eXBlCisldG9rZW4gdG9rX3hzZF9hbGwKKyV0b2tlbiB0b2tfeHNkX29wdGlvbmFsCisldG9rZW4gdG9rX3hzZF9uaWxsYWJsZQorJXRva2VuIHRva194c2RfYXR0cnMKKworLyoqCisgKiBCYXNlIGRhdGF0eXBlIGtleXdvcmRzCisgKi8KKyV0b2tlbiB0b2tfdm9pZAorJXRva2VuIHRva19ib29sCisldG9rZW4gdG9rX3N0cmluZworJXRva2VuIHRva19iaW5hcnkKKyV0b2tlbiB0b2tfc2xpc3QKKyV0b2tlbiB0b2tfc2VudW0KKyV0b2tlbiB0b2tfaTgKKyV0b2tlbiB0b2tfaTE2CisldG9rZW4gdG9rX2kzMgorJXRva2VuIHRva19pNjQKKyV0b2tlbiB0b2tfZG91YmxlCisKKy8qKgorICogQ29tcGxleCB0eXBlIGtleXdvcmRzCisgKi8KKyV0b2tlbiB0b2tfbWFwCisldG9rZW4gdG9rX2xpc3QKKyV0b2tlbiB0b2tfc2V0CisKKy8qKgorICogRnVuY3Rpb24gbW9kaWZpZXJzCisgKi8KKyV0b2tlbiB0b2tfb25ld2F5CisKKy8qKgorICogVGhyaWZ0IGxhbmd1YWdlIGtleXdvcmRzCisgKi8KKyV0b2tlbiB0b2tfdHlwZWRlZgorJXRva2VuIHRva19zdHJ1Y3QKKyV0b2tlbiB0b2tfeGNlcHRpb24KKyV0b2tlbiB0b2tfdGhyb3dzCisldG9rZW4gdG9rX2V4dGVuZHMKKyV0b2tlbiB0b2tfc2VydmljZQorJXRva2VuIHRva19lbnVtCisldG9rZW4gdG9rX2NvbnN0CisldG9rZW4gdG9rX3JlcXVpcmVkCisldG9rZW4gdG9rX29wdGlvbmFsCisldG9rZW4gdG9rX3VuaW9uCisldG9rZW4gdG9rX3JlZmVyZW5jZQorCisvKioKKyAqIEdyYW1tYXIgbm9kZXMKKyAqLworCisldHlwZTx0dHlwZT4gICAgIEJhc2VUeXBlCisldHlwZTx0dHlwZT4gICAgIFNpbXBsZUJhc2VUeXBlCisldHlwZTx0dHlwZT4gICAgIENvbnRhaW5lclR5cGUKKyV0eXBlPHR0eXBlPiAgICAgU2ltcGxlQ29udGFpbmVyVHlwZQorJXR5cGU8dHR5cGU+ICAgICBNYXBUeXBlCisldHlwZTx0dHlwZT4gICAgIFNldFR5cGUKKyV0eXBlPHR0eXBlPiAgICAgTGlzdFR5cGUKKworJXR5cGU8dGRvYz4gICAgICBEZWZpbml0aW9uCisldHlwZTx0dHlwZT4gICAgIFR5cGVEZWZpbml0aW9uCisKKyV0eXBlPHR0eXBlZGVmPiAgVHlwZWRlZgorCisldHlwZTx0dHlwZT4gICAgIFR5cGVBbm5vdGF0aW9ucworJXR5cGU8dHR5cGU+ICAgICBUeXBlQW5ub3RhdGlvbkxpc3QKKyV0eXBlPHRhbm5vdD4gICAgVHlwZUFubm90YXRpb24KKyV0eXBlPGlkPiAgICAgICAgVHlwZUFubm90YXRpb25WYWx1ZQorCisldHlwZTx0ZmllbGQ+ICAgIEZpZWxkCisldHlwZTx0ZmllbGRpZD4gIEZpZWxkSWRlbnRpZmllcgorJXR5cGU8ZXJlcT4gICAgICBGaWVsZFJlcXVpcmVkbmVzcworJXR5cGU8dHR5cGU+ICAgICBGaWVsZFR5cGUKKyV0eXBlPHRjb25zdHY+ICAgRmllbGRWYWx1ZQorJXR5cGU8dHN0cnVjdD4gICBGaWVsZExpc3QKKyV0eXBlPHRib29sPiAgICAgRmllbGRSZWZlcmVuY2UKKworJXR5cGU8dGVudW0+ICAgICBFbnVtCisldHlwZTx0ZW51bT4gICAgIEVudW1EZWZMaXN0CisldHlwZTx0ZW51bXY+ICAgIEVudW1EZWYKKyV0eXBlPHRlbnVtdj4gICAgRW51bVZhbHVlCisKKyV0eXBlPHR0eXBlZGVmPiAgU2VudW0KKyV0eXBlPHRiYXNlPiAgICAgU2VudW1EZWZMaXN0CisldHlwZTxpZD4gICAgICAgIFNlbnVtRGVmCisKKyV0eXBlPHRjb25zdD4gICAgQ29uc3QKKyV0eXBlPHRjb25zdHY+ICAgQ29uc3RWYWx1ZQorJXR5cGU8dGNvbnN0dj4gICBDb25zdExpc3QKKyV0eXBlPHRjb25zdHY+ICAgQ29uc3RMaXN0Q29udGVudHMKKyV0eXBlPHRjb25zdHY+ICAgQ29uc3RNYXAKKyV0eXBlPHRjb25zdHY+ICAgQ29uc3RNYXBDb250ZW50cworCisldHlwZTxpY29uc3Q+ICAgIFN0cnVjdEhlYWQKKyV0eXBlPHRzdHJ1Y3Q+ICAgU3RydWN0CisldHlwZTx0c3RydWN0PiAgIFhjZXB0aW9uCisldHlwZTx0c2VydmljZT4gIFNlcnZpY2UKKworJXR5cGU8dGZ1bmN0aW9uPiBGdW5jdGlvbgorJXR5cGU8dHR5cGU+ICAgICBGdW5jdGlvblR5cGUKKyV0eXBlPHRzZXJ2aWNlPiAgRnVuY3Rpb25MaXN0CisKKyV0eXBlPHRzdHJ1Y3Q+ICAgVGhyb3dzCisldHlwZTx0c2VydmljZT4gIEV4dGVuZHMKKyV0eXBlPHRib29sPiAgICAgT25ld2F5CisldHlwZTx0Ym9vbD4gICAgIFhzZEFsbAorJXR5cGU8dGJvb2w+ICAgICBYc2RPcHRpb25hbAorJXR5cGU8dGJvb2w+ICAgICBYc2ROaWxsYWJsZQorJXR5cGU8dHN0cnVjdD4gICBYc2RBdHRyaWJ1dGVzCisldHlwZTxpZD4gICAgICAgIENwcFR5cGUKKworJXR5cGU8ZHRleHQ+ICAgICBDYXB0dXJlRG9jVGV4dAorCislJQorCisvKioKKyAqIFRocmlmdCBHcmFtbWFyIEltcGxlbWVudGF0aW9uLgorICoKKyAqIEZvciB0aGUgbW9zdCBwYXJ0IHRoaXMgc291cmNlIGZpbGUgd29ya3MgaXRzIHdheSB0b3AgZG93biBmcm9tIHdoYXQgeW91CisgKiBtaWdodCBleHBlY3QgdG8gZmluZCBpbiBhIHR5cGljYWwgLnRocmlmdCBmaWxlLCBpLmUuIHR5cGUgZGVmaW5pdGlvbnMgYW5kCisgKiBuYW1lc3BhY2VzIHVwIHRvcCBmb2xsb3dlZCBieSBzZXJ2aWNlIGRlZmluaXRpb25zIHVzaW5nIHRob3NlIHR5cGVzLgorICovCisKK1Byb2dyYW06CisgIEhlYWRlckxpc3QgRGVmaW5pdGlvbkxpc3QKKyAgICB7CisgICAgICBwZGVidWcoIlByb2dyYW0gLT4gSGVhZGVycyBEZWZpbml0aW9uTGlzdCIpOworICAgICAgaWYoKGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSAhPSBOVUxMKSAmJiAoZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzICE9IEFMUkVBRFlfUFJPQ0VTU0VEKSkKKyAgICAgIHsKKyAgICAgICAgZ19wcm9ncmFtLT5zZXRfZG9jKGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSk7CisgICAgICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IEFMUkVBRFlfUFJPQ0VTU0VEOworICAgICAgfQorICAgICAgY2xlYXJfZG9jdGV4dCgpOworICAgIH0KKworQ2FwdHVyZURvY1RleHQ6CisgICAgeworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgICQkID0gZ19kb2N0ZXh0OworICAgICAgICBnX2RvY3RleHQgPSBOVUxMOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgJCQgPSBOVUxMOworICAgICAgfQorICAgIH0KKworLyogVE9ETyhkcmVpc3MpOiBUcnkgdG8gRGVzdHJveURvY1RleHQgaW4gYWxsIHNvcnRzIG9yIHJhbmRvbSBwbGFjZXMuICovCitEZXN0cm95RG9jVGV4dDoKKyAgICB7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgY2xlYXJfZG9jdGV4dCgpOworICAgICAgfQorICAgIH0KKworLyogV2UgaGF2ZSB0byBEZXN0cm95RG9jVGV4dCBoZXJlLCBvdGhlcndpc2UgaXQgY2F0Y2hlcyB0aGUgZG9jdGV4dAorICAgb24gdGhlIGZpcnN0IHJlYWwgZWxlbWVudC4gKi8KK0hlYWRlckxpc3Q6CisgIEhlYWRlckxpc3QgRGVzdHJveURvY1RleHQgSGVhZGVyCisgICAgeworICAgICAgcGRlYnVnKCJIZWFkZXJMaXN0IC0+IEhlYWRlckxpc3QgSGVhZGVyIik7CisgICAgfQorfAorICAgIHsKKyAgICAgIHBkZWJ1ZygiSGVhZGVyTGlzdCAtPiAiKTsKKyAgICB9CisKK0hlYWRlcjoKKyAgSW5jbHVkZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IEluY2x1ZGUiKTsKKyAgICB9Cit8IHRva19uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIgdG9rX2lkZW50aWZpZXIgVHlwZUFubm90YXRpb25zCisgICAgeworICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciB0b2tfaWRlbnRpZmllciIpOworICAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoJDIsICQzKTsKKyAgICAgIH0KKyAgICAgIGlmICgkNCAhPSBOVUxMKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZV9hbm5vdGF0aW9ucygkMiwgJDQtPmFubm90YXRpb25zXyk7CisgICAgICAgIGRlbGV0ZSAkNDsKKyAgICAgIH0KKyAgICB9Cit8IHRva19uYW1lc3BhY2UgJyonIHRva19pZGVudGlmaWVyCisgICAgeworICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX25hbWVzcGFjZSAqIHRva19pZGVudGlmaWVyIik7CisgICAgICBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgiKiIsICQzKTsKKyAgICAgIH0KKyAgICB9Cit8IHRva19jcHBfaW5jbHVkZSB0b2tfbGl0ZXJhbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19jcHBfaW5jbHVkZSB0b2tfbGl0ZXJhbCIpOworICAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Byb2dyYW0tPmFkZF9jcHBfaW5jbHVkZSgkMik7CisgICAgICB9CisgICAgfQorCitJbmNsdWRlOgorICB0b2tfaW5jbHVkZSB0b2tfbGl0ZXJhbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiSW5jbHVkZSAtPiB0b2tfaW5jbHVkZSB0b2tfbGl0ZXJhbCIpOworICAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gSU5DTFVERVMpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgcGF0aCA9IGluY2x1ZGVfZmlsZShzdGQ6OnN0cmluZygkMikpOworICAgICAgICBpZiAoIXBhdGguZW1wdHkoKSkgeworICAgICAgICAgIGdfcHJvZ3JhbS0+YWRkX2luY2x1ZGUocGF0aCwgc3RkOjpzdHJpbmcoJDIpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworRGVmaW5pdGlvbkxpc3Q6CisgIERlZmluaXRpb25MaXN0IENhcHR1cmVEb2NUZXh0IERlZmluaXRpb24KKyAgICB7CisgICAgICBwZGVidWcoIkRlZmluaXRpb25MaXN0IC0+IERlZmluaXRpb25MaXN0IERlZmluaXRpb24iKTsKKyAgICAgIGlmICgkMiAhPSBOVUxMICYmICQzICE9IE5VTEwpIHsKKyAgICAgICAgJDMtPnNldF9kb2MoJDIpOworICAgICAgfQorICAgIH0KK3wKKyAgICB7CisgICAgICBwZGVidWcoIkRlZmluaXRpb25MaXN0IC0+ICIpOworICAgIH0KKworRGVmaW5pdGlvbjoKKyAgQ29uc3QKKyAgICB7CisgICAgICBwZGVidWcoIkRlZmluaXRpb24gLT4gQ29uc3QiKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Byb2dyYW0tPmFkZF9jb25zdCgkMSk7CisgICAgICB9CisgICAgICAkJCA9ICQxOworICAgIH0KK3wgVHlwZURlZmluaXRpb24KKyAgICB7CisgICAgICBwZGVidWcoIkRlZmluaXRpb24gLT4gVHlwZURlZmluaXRpb24iKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Njb3BlLT5hZGRfdHlwZSgkMS0+Z2V0X25hbWUoKSwgJDEpOworICAgICAgICBpZiAoZ19wYXJlbnRfc2NvcGUgIT0gTlVMTCkgeworICAgICAgICAgIGdfcGFyZW50X3Njb3BlLT5hZGRfdHlwZShnX3BhcmVudF9wcmVmaXggKyAkMS0+Z2V0X25hbWUoKSwgJDEpOworICAgICAgICB9CisgICAgICAgIGlmICghIGdfcHJvZ3JhbS0+aXNfdW5pcXVlX3R5cGVuYW1lKCQxKSkgeworICAgICAgICAgIHl5ZXJyb3IoIlR5cGUgXCIlc1wiIGlzIGFscmVhZHkgZGVmaW5lZC4iLCAkMS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICB9CisgICAgICAkJCA9ICQxOworICAgIH0KK3wgU2VydmljZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiRGVmaW5pdGlvbiAtPiBTZXJ2aWNlIik7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19zY29wZS0+YWRkX3NlcnZpY2UoJDEtPmdldF9uYW1lKCksICQxKTsKKyAgICAgICAgaWYgKGdfcGFyZW50X3Njb3BlICE9IE5VTEwpIHsKKyAgICAgICAgICBnX3BhcmVudF9zY29wZS0+YWRkX3NlcnZpY2UoZ19wYXJlbnRfcHJlZml4ICsgJDEtPmdldF9uYW1lKCksICQxKTsKKyAgICAgICAgfQorICAgICAgICBnX3Byb2dyYW0tPmFkZF9zZXJ2aWNlKCQxKTsKKyAgICAgICAgaWYgKCEgZ19wcm9ncmFtLT5pc191bmlxdWVfdHlwZW5hbWUoJDEpKSB7CisgICAgICAgICAgeXllcnJvcigiVHlwZSBcIiVzXCIgaXMgYWxyZWFkeSBkZWZpbmVkLiIsICQxLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICQkID0gJDE7CisgICAgfQorCitUeXBlRGVmaW5pdGlvbjoKKyAgVHlwZWRlZgorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZURlZmluaXRpb24gLT4gVHlwZWRlZiIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+YWRkX3R5cGVkZWYoJDEpOworICAgICAgfQorICAgIH0KK3wgRW51bQorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZURlZmluaXRpb24gLT4gRW51bSIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+YWRkX2VudW0oJDEpOworICAgICAgfQorICAgIH0KK3wgU2VudW0KKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFNlbnVtIik7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19wcm9ncmFtLT5hZGRfdHlwZWRlZigkMSk7CisgICAgICB9CisgICAgfQorfCBTdHJ1Y3QKKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFN0cnVjdCIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+YWRkX3N0cnVjdCgkMSk7CisgICAgICB9CisgICAgfQorfCBYY2VwdGlvbgorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZURlZmluaXRpb24gLT4gWGNlcHRpb24iKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Byb2dyYW0tPmFkZF94Y2VwdGlvbigkMSk7CisgICAgICB9CisgICAgfQorCitDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWw6CisgICcsJworICAgIHt9Cit8ICc7JworICAgIHt9Cit8CisgICAge30KKworVHlwZWRlZjoKKyAgdG9rX3R5cGVkZWYgRmllbGRUeXBlIHRva19pZGVudGlmaWVyIFR5cGVBbm5vdGF0aW9ucyBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVEZWYgLT4gdG9rX3R5cGVkZWYgRmllbGRUeXBlIHRva19pZGVudGlmaWVyIik7CisgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDMpOworICAgICAgdF90eXBlZGVmICp0ZCA9IG5ldyB0X3R5cGVkZWYoZ19wcm9ncmFtLCAkMiwgJDMpOworICAgICAgJCQgPSB0ZDsKKyAgICAgIGlmICgkNCAhPSBOVUxMKSB7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNC0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDQ7CisgICAgICB9CisgICAgfQorCitFbnVtOgorICB0b2tfZW51bSB0b2tfaWRlbnRpZmllciAneycgRW51bURlZkxpc3QgJ30nIFR5cGVBbm5vdGF0aW9ucworICAgIHsKKyAgICAgIHBkZWJ1ZygiRW51bSAtPiB0b2tfZW51bSB0b2tfaWRlbnRpZmllciB7IEVudW1EZWZMaXN0IH0iKTsKKyAgICAgICQkID0gJDQ7CisgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDIpOworICAgICAgJCQtPnNldF9uYW1lKCQyKTsKKyAgICAgIGlmICgkNiAhPSBOVUxMKSB7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNi0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDY7CisgICAgICB9CisKKyAgICAgIC8vIG1ha2UgY29uc3RhbnRzIGZvciBhbGwgdGhlIGVudW0gdmFsdWVzCisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gJCQtPmdldF9jb25zdGFudHMoKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgICAgICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3RfbmFtZSA9ICQkLT5nZXRfbmFtZSgpICsgIi4iICsgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2VudW0oJCQpOworICAgICAgICAgIGdfc2NvcGUtPmFkZF9jb25zdGFudChjb25zdF9uYW1lLCBuZXcgdF9jb25zdChnX3R5cGVfaTMyLCAoKmNfaXRlciktPmdldF9uYW1lKCksIGNvbnN0X3ZhbCkpOworICAgICAgICAgIGlmIChnX3BhcmVudF9zY29wZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBnX3BhcmVudF9zY29wZS0+YWRkX2NvbnN0YW50KGdfcGFyZW50X3ByZWZpeCArIGNvbnN0X25hbWUsIG5ldyB0X2NvbnN0KGdfdHlwZV9pMzIsICgqY19pdGVyKS0+Z2V0X25hbWUoKSwgY29uc3RfdmFsKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCitFbnVtRGVmTGlzdDoKKyAgRW51bURlZkxpc3QgRW51bURlZgorICAgIHsKKyAgICAgIHBkZWJ1ZygiRW51bURlZkxpc3QgLT4gRW51bURlZkxpc3QgRW51bURlZiIpOworICAgICAgJCQgPSAkMTsKKyAgICAgICQkLT5hcHBlbmQoJDIpOworICAgIH0KK3wKKyAgICB7CisgICAgICBwZGVidWcoIkVudW1EZWZMaXN0IC0+ICIpOworICAgICAgJCQgPSBuZXcgdF9lbnVtKGdfcHJvZ3JhbSk7CisgICAgICB5X2VudW1fdmFsID0gLTE7CisgICAgfQorCitFbnVtRGVmOgorICBDYXB0dXJlRG9jVGV4dCBFbnVtVmFsdWUgVHlwZUFubm90YXRpb25zIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiRW51bURlZiAtPiBFbnVtVmFsdWUiKTsKKyAgICAgICQkID0gJDI7CisgICAgICBpZiAoJDEgIT0gTlVMTCkgeworICAgICAgICAkJC0+c2V0X2RvYygkMSk7CisgICAgICB9CisJICBpZiAoJDMgIT0gTlVMTCkgeworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDMtPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQzOworICAgICAgfQorICAgIH0KKworRW51bVZhbHVlOgorICB0b2tfaWRlbnRpZmllciAnPScgdG9rX2ludF9jb25zdGFudAorICAgIHsKKyAgICAgIHBkZWJ1ZygiRW51bVZhbHVlIC0+IHRva19pZGVudGlmaWVyID0gdG9rX2ludF9jb25zdGFudCIpOworICAgICAgaWYgKCQzIDwgSU5UMzJfTUlOIHx8ICQzID4gSU5UMzJfTUFYKSB7CisgICAgICAgIC8vIE5vdGU6IHRoaXMgdXNlZCB0byBiZSBqdXN0IGEgd2FybmluZy4gIEhvd2V2ZXIsIHNpbmNlIHRocmlmdCBhbHdheXMKKyAgICAgICAgLy8gdHJlYXRzIGVudW1zIGFzIGkzMiB2YWx1ZXMsIEknbSBjaGFuZ2luZyBpdCB0byBhIGZhdGFsIGVycm9yLgorICAgICAgICAvLyBJIGRvdWJ0IHRoaXMgd2lsbCBhZmZlY3QgbWFueSBwZW9wbGUsIGJ1dCB1c2VycyB3aG8gcnVuIGludG8gdGhpcworICAgICAgICAvLyB3aWxsIGhhdmUgdG8gdXBkYXRlIHRoZWlyIHRocmlmdCBmaWxlcyB0byBtYW51YWxseSBzcGVjaWZ5IHRoZQorICAgICAgICAvLyB0cnVuY2F0ZWQgaTMyIHZhbHVlIHRoYXQgdGhyaWZ0IGhhcyBhbHdheXMgYmVlbiB1c2luZyBhbnl3YXkuCisgICAgICAgIGZhaWx1cmUoIjY0LWJpdCB2YWx1ZSBzdXBwbGllZCBmb3IgZW51bSAlcyB3aWxsIGJlIHRydW5jYXRlZC4iLCAkMSk7CisgICAgICB9CisgICAgICB5X2VudW1fdmFsID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oJDMpOworICAgICAgJCQgPSBuZXcgdF9lbnVtX3ZhbHVlKCQxLCB5X2VudW1fdmFsKTsKKyAgICB9CisgfAorICB0b2tfaWRlbnRpZmllcgorICAgIHsKKyAgICAgIHBkZWJ1ZygiRW51bVZhbHVlIC0+IHRva19pZGVudGlmaWVyIik7CisgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDEpOworICAgICAgaWYgKHlfZW51bV92YWwgPT0gSU5UMzJfTUFYKSB7CisgICAgICAgIGZhaWx1cmUoImVudW0gdmFsdWUgb3ZlcmZsb3cgYXQgZW51bSAlcyIsICQxKTsKKyAgICAgIH0KKyAgICAgICsreV9lbnVtX3ZhbDsKKyAgICAgICQkID0gbmV3IHRfZW51bV92YWx1ZSgkMSwgeV9lbnVtX3ZhbCk7CisgICAgfQorCitTZW51bToKKyAgdG9rX3NlbnVtIHRva19pZGVudGlmaWVyICd7JyBTZW51bURlZkxpc3QgJ30nIFR5cGVBbm5vdGF0aW9ucworICAgIHsKKyAgICAgIHBkZWJ1ZygiU2VudW0gLT4gdG9rX3NlbnVtIHRva19pZGVudGlmaWVyIHsgU2VudW1EZWZMaXN0IH0iKTsKKyAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMik7CisgICAgICAkJCA9IG5ldyB0X3R5cGVkZWYoZ19wcm9ncmFtLCAkNCwgJDIpOworICAgICAgaWYgKCQ2ICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ2LT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkNjsKKyAgICAgIH0KKyAgICB9CisKK1NlbnVtRGVmTGlzdDoKKyAgU2VudW1EZWZMaXN0IFNlbnVtRGVmCisgICAgeworICAgICAgcGRlYnVnKCJTZW51bURlZkxpc3QgLT4gU2VudW1EZWZMaXN0IFNlbnVtRGVmIik7CisgICAgICAkJCA9ICQxOworICAgICAgJCQtPmFkZF9zdHJpbmdfZW51bV92YWwoJDIpOworICAgIH0KK3wKKyAgICB7CisgICAgICBwZGVidWcoIlNlbnVtRGVmTGlzdCAtPiAiKTsKKyAgICAgICQkID0gbmV3IHRfYmFzZV90eXBlKCJzdHJpbmciLCB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpOworICAgICAgJCQtPnNldF9zdHJpbmdfZW51bSh0cnVlKTsKKyAgICB9CisKK1NlbnVtRGVmOgorICB0b2tfbGl0ZXJhbCBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKKyAgICB7CisgICAgICBwZGVidWcoIlNlbnVtRGVmIC0+IHRva19saXRlcmFsIik7CisgICAgICAkJCA9ICQxOworICAgIH0KKworQ29uc3Q6CisgIHRva19jb25zdCBGaWVsZFR5cGUgdG9rX2lkZW50aWZpZXIgJz0nIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCisgICAgeworICAgICAgcGRlYnVnKCJDb25zdCAtPiB0b2tfY29uc3QgRmllbGRUeXBlIHRva19pZGVudGlmaWVyID0gQ29uc3RWYWx1ZSIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMyk7CisgICAgICAgIGdfc2NvcGUtPnJlc29sdmVfY29uc3RfdmFsdWUoJDUsICQyKTsKKyAgICAgICAgJCQgPSBuZXcgdF9jb25zdCgkMiwgJDMsICQ1KTsKKyAgICAgICAgdmFsaWRhdGVfY29uc3RfdHlwZSgkJCk7CisKKyAgICAgICAgZ19zY29wZS0+YWRkX2NvbnN0YW50KCQzLCAkJCk7CisgICAgICAgIGlmIChnX3BhcmVudF9zY29wZSAhPSBOVUxMKSB7CisgICAgICAgICAgZ19wYXJlbnRfc2NvcGUtPmFkZF9jb25zdGFudChnX3BhcmVudF9wcmVmaXggKyAkMywgJCQpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAkJCA9IE5VTEw7CisgICAgICB9CisgICAgfQorCitDb25zdFZhbHVlOgorICB0b2tfaW50X2NvbnN0YW50CisgICAgeworICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IHRva19pbnRfY29uc3RhbnQiKTsKKyAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICAgICQkLT5zZXRfaW50ZWdlcigkMSk7CisgICAgICBpZiAoIWdfYWxsb3dfNjRiaXRfY29uc3RzICYmICgkMSA8IElOVDMyX01JTiB8fCAkMSA+IElOVDMyX01BWCkpIHsKKyAgICAgICAgcHdhcm5pbmcoMSwgIjY0LWJpdCBjb25zdGFudCBcIiUiIFBSSWk2NCJcIiBtYXkgbm90IHdvcmsgaW4gYWxsIGxhbmd1YWdlcy5cbiIsICQxKTsKKyAgICAgIH0KKyAgICB9Cit8IHRva19kdWJfY29uc3RhbnQKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2R1Yl9jb25zdGFudCIpOworICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgICAgJCQtPnNldF9kb3VibGUoJDEpOworICAgIH0KK3wgdG9rX2xpdGVyYWwKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2xpdGVyYWwiKTsKKyAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoJDEpOworICAgIH0KK3wgdG9rX2lkZW50aWZpZXIKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2lkZW50aWZpZXIiKTsKKyAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICAgICQkLT5zZXRfaWRlbnRpZmllcigkMSk7CisgICAgfQorfCBDb25zdExpc3QKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gQ29uc3RMaXN0Iik7CisgICAgICAkJCA9ICQxOworICAgIH0KK3wgQ29uc3RNYXAKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gQ29uc3RNYXAiKTsKKyAgICAgICQkID0gJDE7CisgICAgfQorCitDb25zdExpc3Q6CisgICdbJyBDb25zdExpc3RDb250ZW50cyAnXScKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0TGlzdCA9PiBbIENvbnN0TGlzdENvbnRlbnRzIF0iKTsKKyAgICAgICQkID0gJDI7CisgICAgfQorCitDb25zdExpc3RDb250ZW50czoKKyAgQ29uc3RMaXN0Q29udGVudHMgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0TGlzdENvbnRlbnRzID0+IENvbnN0TGlzdENvbnRlbnRzIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsIik7CisgICAgICAkJCA9ICQxOworICAgICAgJCQtPmFkZF9saXN0KCQyKTsKKyAgICB9Cit8CisgICAgeworICAgICAgcGRlYnVnKCJDb25zdExpc3RDb250ZW50cyA9PiIpOworICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgICAgJCQtPnNldF9saXN0KCk7CisgICAgfQorCitDb25zdE1hcDoKKyAgJ3snIENvbnN0TWFwQ29udGVudHMgJ30nCisgICAgeworICAgICAgcGRlYnVnKCJDb25zdE1hcCA9PiB7IENvbnN0TWFwQ29udGVudHMgfSIpOworICAgICAgJCQgPSAkMjsKKyAgICB9CisKK0NvbnN0TWFwQ29udGVudHM6CisgIENvbnN0TWFwQ29udGVudHMgQ29uc3RWYWx1ZSAnOicgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0TWFwQ29udGVudHMgPT4gQ29uc3RNYXBDb250ZW50cyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbCIpOworICAgICAgJCQgPSAkMTsKKyAgICAgICQkLT5hZGRfbWFwKCQyLCAkNCk7CisgICAgfQorfAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RNYXBDb250ZW50cyA9PiIpOworICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgICAgJCQtPnNldF9tYXAoKTsKKyAgICB9CisKK1N0cnVjdEhlYWQ6CisgIHRva19zdHJ1Y3QKKyAgICB7CisgICAgICAkJCA9IHN0cnVjdF9pc19zdHJ1Y3Q7CisgICAgfQorfCB0b2tfdW5pb24KKyAgICB7CisgICAgICAkJCA9IHN0cnVjdF9pc191bmlvbjsKKyAgICB9CisKK1N0cnVjdDoKKyAgU3RydWN0SGVhZCB0b2tfaWRlbnRpZmllciBYc2RBbGwgJ3snIEZpZWxkTGlzdCAnfScgVHlwZUFubm90YXRpb25zCisgICAgeworICAgICAgcGRlYnVnKCJTdHJ1Y3QgLT4gdG9rX3N0cnVjdCB0b2tfaWRlbnRpZmllciB7IEZpZWxkTGlzdCB9Iik7CisgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDIpOworICAgICAgJDUtPnNldF94c2RfYWxsKCQzKTsKKyAgICAgICQ1LT5zZXRfdW5pb24oJDEgPT0gc3RydWN0X2lzX3VuaW9uKTsKKyAgICAgICQkID0gJDU7CisgICAgICAkJC0+c2V0X25hbWUoJDIpOworICAgICAgaWYgKCQ3ICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ3LT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkNzsKKyAgICAgIH0KKyAgICB9CisKK1hzZEFsbDoKKyAgdG9rX3hzZF9hbGwKKyAgICB7CisgICAgICAkJCA9IHRydWU7CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gZmFsc2U7CisgICAgfQorCitYc2RPcHRpb25hbDoKKyAgdG9rX3hzZF9vcHRpb25hbAorICAgIHsKKyAgICAgICQkID0gdHJ1ZTsKKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSBmYWxzZTsKKyAgICB9CisKK1hzZE5pbGxhYmxlOgorICB0b2tfeHNkX25pbGxhYmxlCisgICAgeworICAgICAgJCQgPSB0cnVlOworICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IGZhbHNlOworICAgIH0KKworWHNkQXR0cmlidXRlczoKKyAgdG9rX3hzZF9hdHRycyAneycgRmllbGRMaXN0ICd9JworICAgIHsKKyAgICAgICQkID0gJDM7CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gTlVMTDsKKyAgICB9CisKK1hjZXB0aW9uOgorICB0b2tfeGNlcHRpb24gdG9rX2lkZW50aWZpZXIgJ3snIEZpZWxkTGlzdCAnfScgVHlwZUFubm90YXRpb25zCisgICAgeworICAgICAgcGRlYnVnKCJYY2VwdGlvbiAtPiB0b2tfeGNlcHRpb24gdG9rX2lkZW50aWZpZXIgeyBGaWVsZExpc3QgfSIpOworICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQyKTsKKyAgICAgICQ0LT5zZXRfbmFtZSgkMik7CisgICAgICAkNC0+c2V0X3hjZXB0aW9uKHRydWUpOworICAgICAgJCQgPSAkNDsKKyAgICAgIGlmICgkNiAhPSBOVUxMKSB7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNi0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDY7CisgICAgICB9CisgICAgfQorCitTZXJ2aWNlOgorICB0b2tfc2VydmljZSB0b2tfaWRlbnRpZmllciBFeHRlbmRzICd7JyBGbGFnQXJncyBGdW5jdGlvbkxpc3QgVW5mbGFnQXJncyAnfScgVHlwZUFubm90YXRpb25zCisgICAgeworICAgICAgcGRlYnVnKCJTZXJ2aWNlIC0+IHRva19zZXJ2aWNlIHRva19pZGVudGlmaWVyIHsgRnVuY3Rpb25MaXN0IH0iKTsKKyAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMik7CisgICAgICAkJCA9ICQ2OworICAgICAgJCQtPnNldF9uYW1lKCQyKTsKKyAgICAgICQkLT5zZXRfZXh0ZW5kcygkMyk7CisgICAgICBpZiAoJDkgIT0gTlVMTCkgeworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDktPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQ5OworICAgICAgfQorICAgIH0KKworRmxhZ0FyZ3M6CisgICAgeworICAgICAgIGdfYXJnbGlzdCA9IDE7CisgICAgfQorCitVbmZsYWdBcmdzOgorICAgIHsKKyAgICAgICBnX2FyZ2xpc3QgPSAwOworICAgIH0KKworRXh0ZW5kczoKKyAgdG9rX2V4dGVuZHMgdG9rX2lkZW50aWZpZXIKKyAgICB7CisgICAgICBwZGVidWcoIkV4dGVuZHMgLT4gdG9rX2V4dGVuZHMgdG9rX2lkZW50aWZpZXIiKTsKKyAgICAgICQkID0gTlVMTDsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICAkJCA9IGdfc2NvcGUtPmdldF9zZXJ2aWNlKCQyKTsKKyAgICAgICAgaWYgKCQkID09IE5VTEwpIHsKKyAgICAgICAgICB5eWVycm9yKCJTZXJ2aWNlIFwiJXNcIiBoYXMgbm90IGJlZW4gZGVmaW5lZC4iLCAkMik7CisgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IE5VTEw7CisgICAgfQorCitGdW5jdGlvbkxpc3Q6CisgIEZ1bmN0aW9uTGlzdCBGdW5jdGlvbgorICAgIHsKKyAgICAgIHBkZWJ1ZygiRnVuY3Rpb25MaXN0IC0+IEZ1bmN0aW9uTGlzdCBGdW5jdGlvbiIpOworICAgICAgJCQgPSAkMTsKKyAgICAgICQxLT5hZGRfZnVuY3Rpb24oJDIpOworICAgIH0KK3wKKyAgICB7CisgICAgICBwZGVidWcoIkZ1bmN0aW9uTGlzdCAtPiAiKTsKKyAgICAgICQkID0gbmV3IHRfc2VydmljZShnX3Byb2dyYW0pOworICAgIH0KKworRnVuY3Rpb246CisgIENhcHR1cmVEb2NUZXh0IE9uZXdheSBGdW5jdGlvblR5cGUgdG9rX2lkZW50aWZpZXIgJygnIEZpZWxkTGlzdCAnKScgVGhyb3dzIFR5cGVBbm5vdGF0aW9ucyBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKKyAgICB7CisgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDQpOworICAgICAgJDYtPnNldF9uYW1lKHN0ZDo6c3RyaW5nKCQ0KSArICJfYXJncyIpOworICAgICAgJCQgPSBuZXcgdF9mdW5jdGlvbigkMywgJDQsICQ2LCAkOCwgJDIpOworICAgICAgaWYgKCQxICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPnNldF9kb2MoJDEpOworICAgICAgfQorICAgICAgaWYgKCQ5ICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ5LT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkOTsKKyAgICAgIH0KKyAgICB9CisKK09uZXdheToKKyAgdG9rX29uZXdheQorICAgIHsKKyAgICAgICQkID0gdHJ1ZTsKKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSBmYWxzZTsKKyAgICB9CisKK1Rocm93czoKKyAgdG9rX3Rocm93cyAnKCcgRmllbGRMaXN0ICcpJworICAgIHsKKyAgICAgIHBkZWJ1ZygiVGhyb3dzIC0+IHRva190aHJvd3MgKCBGaWVsZExpc3QgKSIpOworICAgICAgJCQgPSAkMzsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSAmJiAhdmFsaWRhdGVfdGhyb3dzKCQkKSkgeworICAgICAgICB5eWVycm9yKCJUaHJvd3MgY2xhdXNlIG1heSBub3QgY29udGFpbiBub24tZXhjZXB0aW9uIHR5cGVzIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgICB9CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gbmV3IHRfc3RydWN0KGdfcHJvZ3JhbSk7CisgICAgfQorCitGaWVsZExpc3Q6CisgIEZpZWxkTGlzdCBGaWVsZAorICAgIHsKKyAgICAgIHBkZWJ1ZygiRmllbGRMaXN0IC0+IEZpZWxkTGlzdCAsIEZpZWxkIik7CisgICAgICAkJCA9ICQxOworICAgICAgaWYgKCEoJCQtPmFwcGVuZCgkMikpKSB7CisgICAgICAgIHl5ZXJyb3IoIlwiJWQ6ICVzXCIgLSBmaWVsZCBpZGVudGlmaWVyL25hbWUgaGFzIGFscmVhZHkgYmVlbiB1c2VkIiwgJDItPmdldF9rZXkoKSwgJDItPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgICB9CisgICAgfQorfAorICAgIHsKKyAgICAgIHBkZWJ1ZygiRmllbGRMaXN0IC0+ICIpOworICAgICAgeV9maWVsZF92YWwgPSAtMTsKKyAgICAgICQkID0gbmV3IHRfc3RydWN0KGdfcHJvZ3JhbSk7CisgICAgfQorCitGaWVsZDoKKyAgQ2FwdHVyZURvY1RleHQgRmllbGRJZGVudGlmaWVyIEZpZWxkUmVxdWlyZWRuZXNzIEZpZWxkVHlwZSBGaWVsZFJlZmVyZW5jZSB0b2tfaWRlbnRpZmllciBGaWVsZFZhbHVlIFhzZE9wdGlvbmFsIFhzZE5pbGxhYmxlIFhzZEF0dHJpYnV0ZXMgVHlwZUFubm90YXRpb25zIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAorICAgIHsKKyAgICAgIHBkZWJ1ZygidG9rX2ludF9jb25zdGFudCA6IEZpZWxkIC0+IEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciIpOworICAgICAgaWYgKCQyLmF1dG9fYXNzaWduZWQpIHsKKyAgICAgICAgcHdhcm5pbmcoMSwgIk5vIGZpZWxkIGtleSBzcGVjaWZpZWQgZm9yICVzLCByZXN1bHRpbmcgcHJvdG9jb2wgbWF5IGhhdmUgY29uZmxpY3RzIG9yIG5vdCBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZSFcbiIsICQ2KTsKKyAgICAgICAgaWYgKGdfc3RyaWN0ID49IDE5MikgeworICAgICAgICAgIHl5ZXJyb3IoIkltcGxpY2l0IGZpZWxkIGtleXMgYXJlIGRlcHJlY2F0ZWQgYW5kIG5vdCBhbGxvd2VkIHdpdGggLXN0cmljdCIpOworICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCQ2KTsKKyAgICAgICQkID0gbmV3IHRfZmllbGQoJDQsICQ2LCAkMi52YWx1ZSk7CisgICAgICAkJC0+c2V0X3JlZmVyZW5jZSgkNSk7CisgICAgICAkJC0+c2V0X3JlcSgkMyk7CisgICAgICBpZiAoJDcgIT0gTlVMTCkgeworICAgICAgICBnX3Njb3BlLT5yZXNvbHZlX2NvbnN0X3ZhbHVlKCQ3LCAkNCk7CisgICAgICAgIHZhbGlkYXRlX2ZpZWxkX3ZhbHVlKCQkLCAkNyk7CisgICAgICAgICQkLT5zZXRfdmFsdWUoJDcpOworICAgICAgfQorICAgICAgJCQtPnNldF94c2Rfb3B0aW9uYWwoJDgpOworICAgICAgJCQtPnNldF94c2RfbmlsbGFibGUoJDkpOworICAgICAgaWYgKCQxICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPnNldF9kb2MoJDEpOworICAgICAgfQorICAgICAgaWYgKCQxMCAhPSBOVUxMKSB7CisgICAgICAgICQkLT5zZXRfeHNkX2F0dHJzKCQxMCk7CisgICAgICB9CisgICAgICBpZiAoJDExICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQxMS0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDExOworICAgICAgfQorICAgIH0KKworRmllbGRJZGVudGlmaWVyOgorICB0b2tfaW50X2NvbnN0YW50ICc6JworICAgIHsKKyAgICAgIGlmICgkMSA8PSAwKSB7CisgICAgICAgIGlmIChnX2FsbG93X25lZ19maWVsZF9rZXlzKSB7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBnX2FsbG93X25lZ19maWVsZF9rZXlzIGV4aXN0cyB0byBhbGxvdyB1c2VycyB0byBhZGQgZXhwbGljaXRseQorICAgICAgICAgICAqIHNwZWNpZmllZCBrZXkgdmFsdWVzIHRvIG9sZCAudGhyaWZ0IGZpbGVzIHdpdGhvdXQgYnJlYWtpbmcKKyAgICAgICAgICAgKiBwcm90b2NvbCBjb21wYXRpYmlsaXR5LgorICAgICAgICAgICAqLworICAgICAgICAgIGlmICgkMSAhPSB5X2ZpZWxkX3ZhbCkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIHdhcm4gaWYgdGhlIHVzZXItc3BlY2lmaWVkIG5lZ2F0aXZlIHZhbHVlIGlzbid0IHdoYXQKKyAgICAgICAgICAgICAqIHRocmlmdCB3b3VsZCBoYXZlIGF1dG8tYXNzaWduZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB3YXJuaW5nKDEsICJOb25wb3NpdGl2ZSBmaWVsZCBrZXkgKCUiIFBSSWk2NCIpIGRpZmZlcnMgZnJvbSB3aGF0IHdvdWxkIGJlICIKKyAgICAgICAgICAgICAgICAgICAgICJhdXRvLWFzc2lnbmVkIGJ5IHRocmlmdCAoJWQpLlxuIiwgJDEsIHlfZmllbGRfdmFsKTsKKyAgICAgICAgICB9CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBMZWF2ZSAkMSBhcy1pcywgYW5kIHVwZGF0ZSB5X2ZpZWxkX3ZhbCB0byBiZSBvbmUgbGVzcyB0aGFuICQxLgorICAgICAgICAgICAqIFRoZSBGaWVsZExpc3QgcGFyc2luZyB3aWxsIGNhdGNoIGFueSBkdXBsaWNhdGUga2V5IHZhbHVlcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICB5X2ZpZWxkX3ZhbCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KCQxIC0gMSk7CisgICAgICAgICAgJCQudmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQzMl90PigkMSk7CisgICAgICAgICAgJCQuYXV0b19hc3NpZ25lZCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHB3YXJuaW5nKDEsICJOb25wb3NpdGl2ZSB2YWx1ZSAoJWQpIG5vdCBhbGxvd2VkIGFzIGEgZmllbGQga2V5LlxuIiwKKyAgICAgICAgICAgICAgICAgICAkMSk7CisgICAgICAgICAgJCQudmFsdWUgPSB5X2ZpZWxkX3ZhbC0tOworICAgICAgICAgICQkLmF1dG9fYXNzaWduZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAkJC52YWx1ZSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KCQxKTsKKyAgICAgICAgJCQuYXV0b19hc3NpZ25lZCA9IGZhbHNlOworICAgICAgfQorICAgICAgaWYoIChTSFJUX01JTiA+ICQkLnZhbHVlKSB8fCAoJCQudmFsdWUgPiBTSFJUX01BWCkpIHsKKyAgICAgICAgcHdhcm5pbmcoMSwgIkZpZWxkIGtleSAoJWQpIGV4Y2VlZHMgYWxsb3dlZCByYW5nZSAoJWQuLiVkKS5cbiIsCisgICAgICAgICAgICAgICAgICQkLnZhbHVlLCBTSFJUX01JTiwgU0hSVF9NQVgpOworICAgICAgfQorICAgIH0KK3wKKyAgICB7CisgICAgICAkJC52YWx1ZSA9IHlfZmllbGRfdmFsLS07CisgICAgICAkJC5hdXRvX2Fzc2lnbmVkID0gdHJ1ZTsKKyAgICAgIGlmKCAoU0hSVF9NSU4gPiAkJC52YWx1ZSkgfHwgKCQkLnZhbHVlID4gU0hSVF9NQVgpKSB7CisgICAgICAgIHB3YXJuaW5nKDEsICJGaWVsZCBrZXkgKCVkKSBleGNlZWRzIGFsbG93ZWQgcmFuZ2UgKCVkLi4lZCkuXG4iLAorICAgICAgICAgICAgICAgICAkJC52YWx1ZSwgU0hSVF9NSU4sIFNIUlRfTUFYKTsKKyAgICAgIH0KKyAgICB9CisKK0ZpZWxkUmVmZXJlbmNlOgorICB0b2tfcmVmZXJlbmNlCisgICAgeworICAgICAgJCQgPSB0cnVlOworICAgIH0KK3wKKyAgIHsKKyAgICAgJCQgPSBmYWxzZTsKKyAgIH0KKworRmllbGRSZXF1aXJlZG5lc3M6CisgIHRva19yZXF1aXJlZAorICAgIHsKKyAgICAgICQkID0gdF9maWVsZDo6VF9SRVFVSVJFRDsKKyAgICB9Cit8IHRva19vcHRpb25hbAorICAgIHsKKyAgICAgIGlmIChnX2FyZ2xpc3QpIHsKKyAgICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgICAgcHdhcm5pbmcoMSwgIm9wdGlvbmFsIGtleXdvcmQgaXMgaWdub3JlZCBpbiBhcmd1bWVudCBsaXN0cy5cbiIpOworICAgICAgICB9CisgICAgICAgICQkID0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICQkID0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICAgIH0KKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUOworICAgIH0KKworRmllbGRWYWx1ZToKKyAgJz0nIENvbnN0VmFsdWUKKyAgICB7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgJCQgPSAkMjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICQkID0gTlVMTDsKKyAgICAgIH0KKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSBOVUxMOworICAgIH0KKworRnVuY3Rpb25UeXBlOgorICBGaWVsZFR5cGUKKyAgICB7CisgICAgICBwZGVidWcoIkZ1bmN0aW9uVHlwZSAtPiBGaWVsZFR5cGUiKTsKKyAgICAgICQkID0gJDE7CisgICAgfQorfCB0b2tfdm9pZAorICAgIHsKKyAgICAgIHBkZWJ1ZygiRnVuY3Rpb25UeXBlIC0+IHRva192b2lkIik7CisgICAgICAkJCA9IGdfdHlwZV92b2lkOworICAgIH0KKworRmllbGRUeXBlOgorICB0b2tfaWRlbnRpZmllcgorICAgIHsKKyAgICAgIHBkZWJ1ZygiRmllbGRUeXBlIC0+IHRva19pZGVudGlmaWVyIik7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IElOQ0xVREVTKSB7CisgICAgICAgIC8vIElnbm9yZSBpZGVudGlmaWVycyBpbiBpbmNsdWRlIG1vZGUKKyAgICAgICAgJCQgPSBOVUxMOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTG9va3VwIHRoZSBpZGVudGlmaWVyIGluIHRoZSBjdXJyZW50IHNjb3BlCisgICAgICAgICQkID0gZ19zY29wZS0+Z2V0X3R5cGUoJDEpOworICAgICAgICBpZiAoJCQgPT0gTlVMTCkgeworICAgICAgICAgIC8qCisgICAgICAgICAgICogRWl0aGVyIHRoaXMgdHlwZSBpc24ndCB5ZXQgZGVjbGFyZWQsIG9yIGl0J3MgbmV2ZXIKKyAgICAgICAgICAgICBkZWNsYXJlZC4gIEVpdGhlciB3YXkgYWxsb3cgaXQgYW5kIHdlJ2xsIGZpZ3VyZSBpdCBvdXQKKyAgICAgICAgICAgICBkdXJpbmcgZ2VuZXJhdGlvbi4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICAkJCA9IG5ldyB0X3R5cGVkZWYoZ19wcm9ncmFtLCAkMSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9Cit8IEJhc2VUeXBlCisgICAgeworICAgICAgcGRlYnVnKCJGaWVsZFR5cGUgLT4gQmFzZVR5cGUiKTsKKyAgICAgICQkID0gJDE7CisgICAgfQorfCBDb250YWluZXJUeXBlCisgICAgeworICAgICAgcGRlYnVnKCJGaWVsZFR5cGUgLT4gQ29udGFpbmVyVHlwZSIpOworICAgICAgJCQgPSAkMTsKKyAgICB9CisKK0Jhc2VUeXBlOiBTaW1wbGVCYXNlVHlwZSBUeXBlQW5ub3RhdGlvbnMKKyAgICB7CisgICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IFNpbXBsZUJhc2VUeXBlIFR5cGVBbm5vdGF0aW9ucyIpOworICAgICAgaWYgKCQyICE9IE5VTEwpIHsKKyAgICAgICAgJCQgPSBuZXcgdF9iYXNlX3R5cGUoKnN0YXRpY19jYXN0PHRfYmFzZV90eXBlKj4oJDEpKTsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQyLT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkMjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICQkID0gJDE7CisgICAgICB9CisgICAgfQorCitTaW1wbGVCYXNlVHlwZToKKyAgdG9rX3N0cmluZworICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX3N0cmluZyIpOworICAgICAgJCQgPSBnX3R5cGVfc3RyaW5nOworICAgIH0KK3wgdG9rX2JpbmFyeQorICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2JpbmFyeSIpOworICAgICAgJCQgPSBnX3R5cGVfYmluYXJ5OworICAgIH0KK3wgdG9rX3NsaXN0CisgICAgeworICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfc2xpc3QiKTsKKyAgICAgICQkID0gZ190eXBlX3NsaXN0OworICAgIH0KK3wgdG9rX2Jvb2wKKyAgICB7CisgICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19ib29sIik7CisgICAgICAkJCA9IGdfdHlwZV9ib29sOworICAgIH0KK3wgdG9rX2k4CisgICAgeworICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfaTgiKTsKKyAgICAgICQkID0gZ190eXBlX2k4OworICAgIH0KK3wgdG9rX2kxNgorICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2kxNiIpOworICAgICAgJCQgPSBnX3R5cGVfaTE2OworICAgIH0KK3wgdG9rX2kzMgorICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2kzMiIpOworICAgICAgJCQgPSBnX3R5cGVfaTMyOworICAgIH0KK3wgdG9rX2k2NAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2k2NCIpOworICAgICAgJCQgPSBnX3R5cGVfaTY0OworICAgIH0KK3wgdG9rX2RvdWJsZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2RvdWJsZSIpOworICAgICAgJCQgPSBnX3R5cGVfZG91YmxlOworICAgIH0KKworQ29udGFpbmVyVHlwZTogU2ltcGxlQ29udGFpbmVyVHlwZSBUeXBlQW5ub3RhdGlvbnMKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnRhaW5lclR5cGUgLT4gU2ltcGxlQ29udGFpbmVyVHlwZSBUeXBlQW5ub3RhdGlvbnMiKTsKKyAgICAgICQkID0gJDE7CisgICAgICBpZiAoJDIgIT0gTlVMTCkgeworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDItPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQyOworICAgICAgfQorICAgIH0KKworU2ltcGxlQ29udGFpbmVyVHlwZToKKyAgTWFwVHlwZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiU2ltcGxlQ29udGFpbmVyVHlwZSAtPiBNYXBUeXBlIik7CisgICAgICAkJCA9ICQxOworICAgIH0KK3wgU2V0VHlwZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiU2ltcGxlQ29udGFpbmVyVHlwZSAtPiBTZXRUeXBlIik7CisgICAgICAkJCA9ICQxOworICAgIH0KK3wgTGlzdFR5cGUKKyAgICB7CisgICAgICBwZGVidWcoIlNpbXBsZUNvbnRhaW5lclR5cGUgLT4gTGlzdFR5cGUiKTsKKyAgICAgICQkID0gJDE7CisgICAgfQorCitNYXBUeXBlOgorICB0b2tfbWFwIENwcFR5cGUgJzwnIEZpZWxkVHlwZSAnLCcgRmllbGRUeXBlICc+JworICAgIHsKKyAgICAgIHBkZWJ1ZygiTWFwVHlwZSAtPiB0b2tfbWFwIDxGaWVsZFR5cGUsIEZpZWxkVHlwZT4iKTsKKyAgICAgICQkID0gbmV3IHRfbWFwKCQ0LCAkNik7CisgICAgICBpZiAoJDIgIT0gTlVMTCkgeworICAgICAgICAoKHRfY29udGFpbmVyKikkJCktPnNldF9jcHBfbmFtZShzdGQ6OnN0cmluZygkMikpOworICAgICAgfQorICAgIH0KKworU2V0VHlwZToKKyAgdG9rX3NldCBDcHBUeXBlICc8JyBGaWVsZFR5cGUgJz4nCisgICAgeworICAgICAgcGRlYnVnKCJTZXRUeXBlIC0+IHRva19zZXQ8RmllbGRUeXBlPiIpOworICAgICAgJCQgPSBuZXcgdF9zZXQoJDQpOworICAgICAgaWYgKCQyICE9IE5VTEwpIHsKKyAgICAgICAgKCh0X2NvbnRhaW5lciopJCQpLT5zZXRfY3BwX25hbWUoc3RkOjpzdHJpbmcoJDIpKTsKKyAgICAgIH0KKyAgICB9CisKK0xpc3RUeXBlOgorICB0b2tfbGlzdCAnPCcgRmllbGRUeXBlICc+JyBDcHBUeXBlCisgICAgeworICAgICAgcGRlYnVnKCJMaXN0VHlwZSAtPiB0b2tfbGlzdDxGaWVsZFR5cGU+Iik7CisgICAgICBjaGVja19mb3JfbGlzdF9vZl9ieXRlcygkMyk7CisgICAgICAkJCA9IG5ldyB0X2xpc3QoJDMpOworICAgICAgaWYgKCQ1ICE9IE5VTEwpIHsKKyAgICAgICAgKCh0X2NvbnRhaW5lciopJCQpLT5zZXRfY3BwX25hbWUoc3RkOjpzdHJpbmcoJDUpKTsKKyAgICAgIH0KKyAgICB9CisKK0NwcFR5cGU6CisgIHRva19jcHBfdHlwZSB0b2tfbGl0ZXJhbAorICAgIHsKKyAgICAgICQkID0gJDI7CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gTlVMTDsKKyAgICB9CisKK1R5cGVBbm5vdGF0aW9uczoKKyAgJygnIFR5cGVBbm5vdGF0aW9uTGlzdCAnKScKKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVBbm5vdGF0aW9ucyAtPiAoIFR5cGVBbm5vdGF0aW9uTGlzdCApIik7CisgICAgICAkJCA9ICQyOworICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IE5VTEw7CisgICAgfQorCitUeXBlQW5ub3RhdGlvbkxpc3Q6CisgIFR5cGVBbm5vdGF0aW9uTGlzdCBUeXBlQW5ub3RhdGlvbgorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb25MaXN0IC0+IFR5cGVBbm5vdGF0aW9uTGlzdCAsIFR5cGVBbm5vdGF0aW9uIik7CisgICAgICAkJCA9ICQxOworICAgICAgJCQtPmFubm90YXRpb25zX1skMi0+a2V5XSA9ICQyLT52YWw7CisgICAgICBkZWxldGUgJDI7CisgICAgfQorfAorICAgIHsKKyAgICAgIC8qIEp1c3QgdXNlIGEgZHVtbXkgc3RydWN0dXJlIHRvIGhvbGQgdGhlIGFubm90YXRpb25zLiAqLworICAgICAgJCQgPSBuZXcgdF9zdHJ1Y3QoZ19wcm9ncmFtKTsKKyAgICB9CisKK1R5cGVBbm5vdGF0aW9uOgorICB0b2tfaWRlbnRpZmllciBUeXBlQW5ub3RhdGlvblZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb24gLT4gVHlwZUFubm90YXRpb25WYWx1ZSIpOworICAgICAgJCQgPSBuZXcgdF9hbm5vdGF0aW9uOworICAgICAgJCQtPmtleSA9ICQxOworICAgICAgJCQtPnZhbCA9ICQyOworICAgIH0KKworVHlwZUFubm90YXRpb25WYWx1ZToKKyAgJz0nIHRva19saXRlcmFsCisgICAgeworICAgICAgcGRlYnVnKCJUeXBlQW5ub3RhdGlvblZhbHVlIC0+ID0gdG9rX2xpdGVyYWwiKTsKKyAgICAgICQkID0gJDI7CisgICAgfQorfAorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb25WYWx1ZSAtPiIpOworICAgICAgJCQgPSBzdHJkdXAoIjEiKTsKKyAgICB9CisKKyUlCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC92ZXJzaW9uLmguaW4gYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC92ZXJzaW9uLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmMDc2ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3ZlcnNpb24uaC5pbgpAQCAtMCwwICsxLDI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9WRVJTSU9OX0hfCisjZGVmaW5lIF9USFJJRlRfVkVSU0lPTl9IXyAxCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPiAxMjAwKQorI3ByYWdtYSBvbmNlCisjZW5kaWYgLy8gX01TQ19WRVIKKworI2RlZmluZSBUSFJJRlRfVkVSU0lPTiAiQFBBQ0tBR0VfVkVSU0lPTkAiCisKKyNlbmRpZiAvLyBfVEhSSUZUX1ZFUlNJT05fSF8KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvY29uZmlnLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMjY5Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1dJTkRPV1NfQ09ORklHX0hfCisjZGVmaW5lIF9USFJJRlRfV0lORE9XU19DT05GSUdfSF8gMQorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gMTIwMCkKKyNwcmFnbWEgb25jZQorI2VuZGlmIC8vIF9NU0NfVkVSCisKKyNpZm5kZWYgX1dJTjMyCisjZXJyb3IgIlRoaXMgaXMgYSBXaW5kb3dzIGhlYWRlciBvbmx5IgorI2VuZGlmCisKKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGRpcmVjdC5oPgorCisjZGVmaW5lIHN0cnRvbGwoYmVnaW5fcHRyLCBlbmRfcHRyLCBsZW5ndGgpIF9zdHJ0b2k2NChiZWdpbl9wdHIsIGVuZF9wdHIsIGxlbmd0aCkKKworI2lmbmRlZiBQUkl1NjQKKyNkZWZpbmUgUFJJdTY0ICJJNjR1IgorI2VuZGlmCisKKyNpZm5kZWYgUFJJaTY0CisjZGVmaW5lIFBSSWk2NCAiSTY0aSIKKyNlbmRpZgorLy8gc3F1ZWxjaCBkZXByZWNhdGlvbiB3YXJuaW5ncworI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0OTk2KQorLy8gc3F1ZWxjaCBib29sIGNvbnZlcnNpb24gcGVyZm9ybWFuY2Ugd2FybmluZworI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0ODAwKQorCisvLyBNU1ZDMTAgKDIwMTApIG9yIGxhdGVyIGhhcyBzdGRpbnQuaAorI2lmIF9NU0NfVkVSID49IDE2MDAKKyNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisjZW5kaWYKKworLy8gTXVzdCBiZSB1c2luZyBWUzIwMTAgb3IgbGF0ZXIsIG9yIGJvb3N0LCBzbyB0aGF0IEM5OSB0eXBlcyBhcmUgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZQorI2lmZGVmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbHNlCisjaW5jbHVkZSA8Ym9vc3QvY3N0ZGludC5ocHA+CisKK3R5cGVkZWYgYm9vc3Q6OmludDY0X3QgaW50NjRfdDsKK3R5cGVkZWYgYm9vc3Q6OnVpbnQ2NF90IHVpbnQ2NF90OwordHlwZWRlZiBib29zdDo6aW50MzJfdCBpbnQzMl90OwordHlwZWRlZiBib29zdDo6dWludDMyX3QgdWludDMyX3Q7Cit0eXBlZGVmIGJvb3N0OjppbnQxNl90IGludDE2X3Q7Cit0eXBlZGVmIGJvb3N0Ojp1aW50MTZfdCB1aW50MTZfdDsKK3R5cGVkZWYgYm9vc3Q6OmludDhfdCBpbnQ4X3Q7Cit0eXBlZGVmIGJvb3N0Ojp1aW50OF90IHVpbnQ4X3Q7CisjZW5kaWYKKworI2VuZGlmIC8vIF9USFJJRlRfV0lORE9XU19DT05GSUdfSF8KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0bC5sbCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0bC5sbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYyY2IyZi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3RocmlmdGwubGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFRocmlmdCBzY2FubmVyLgotICoKLSAqIFRva2VuaXplcyBhIHRocmlmdCBkZWZpbml0aW9uIGZpbGUuCi0gKi8KLQotJXsKLQotLyogVGhpcyBpcyByZWR1bmRhbnQgd2l0aCBzb21lIG9mIHRoZSBmbGFncyBpbiBNYWtlZmlsZS5hbSwgYnV0IGl0IHdvcmtzCi0gKiB3aGVuIHBlb3BsZSBvdmVycmlkZSBDWFhGTEFHUyB3aXRob3V0IGJlaW5nIGNhcmVmdWwuIFRoZSBwcmFnbWFzIGFyZQotICogdGhlICdyaWdodCcgd2F5IHRvIGRvIGl0LCBidXQgZG9uJ3Qgd29yayBvbiBvbGQtZW5vdWdoIEdDQyAoaW4gcGFydGljdWxhcgotICogdGhlIEdDQyB0aGF0IHNoaXAgb24gTWFjIE9TIFggMTAuNi41LCAqY291bnRlciogdG8gd2hhdCB0aGUgR05VIGRvY3Mgc2F5KQotICoKLSAqIFdlIHNob3VsZCByZXZlcnQgdGhlIE1ha2VmaWxlLmFtIGNoYW5nZXMgb25jZSBBcHBsZSBzaGlwcyBhIHJlYXNvbmFibGUKLSAqIEdDQy4KLSAqLwotI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC1mdW5jdGlvbiIKLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtbGFiZWwiCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJnbG9iYWxzLmgiCi0jaW5jbHVkZSAicGFyc2UvdF9wcm9ncmFtLmgiCi0KLS8qKgotICogTXVzdCBiZSBpbmNsdWRlZCBBRlRFUiBwYXJzZS90X3Byb2dyYW0uaCwgYnV0IEkgY2FuJ3QgcmVtZW1iZXIgd2h5IGFueW1vcmUKLSAqIGJlY2F1c2UgSSB3cm90ZSB0aGlzIGEgd2hpbGUgYWdvLgotICovCi0jaW5jbHVkZSAidGhyaWZ0eS5oIgotCi12b2lkIHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKGNoYXIqIGtleXdvcmQpIHsKLSAgeXllcnJvcigiQ2Fubm90IHVzZSByZXNlcnZlZCBsYW5ndWFnZSBrZXl3b3JkOiBcIiVzXCJcbiIsIGtleXdvcmQpOwotICBleGl0KDEpOwotfQotCi12b2lkIGludGVnZXJfb3ZlcmZsb3coY2hhciogdGV4dCkgewotICB5eWVycm9yKCJUaGlzIGludGVnZXIgaXMgdG9vIGJpZzogXCIlc1wiXG4iLCB0ZXh0KTsKLSAgZXhpdCgxKTsKLX0KLQotJX0KLQotLyoqCi0gKiBQcm92aWRlcyB0aGUgeXlsaW5lbm8gZ2xvYmFsLCB1c2VmdWwgZm9yIGRlYnVnZ2luZyBvdXRwdXQKLSAqLwotJW9wdGlvbiBsZXgtY29tcGF0Ci0KLS8qKgotICogT3VyIGlucHV0cyBhcmUgYWxsIHNpbmdsZSBmaWxlcywgc28gbm8gbmVlZCBmb3IgeXl3cmFwCi0gKi8KLSVvcHRpb24gbm95eXdyYXAKLQotLyoqCi0gKiBXZSBkb24ndCB1c2UgaXQsIGFuZCBpdCBmaXJlcyB1cCB3YXJuaW5ncyBhdCAtV2FsbAotICovCi0lb3B0aW9uIG5vdW5wdXQKLQotLyoqCi0gKiBIZWxwZXIgZGVmaW5pdGlvbnMsIGNvbW1lbnRzLCBjb25zdGFudHMsIGFuZCB3aGF0bm90Ci0gKi8KLQotaW50Y29uc3RhbnQgICAoWystXT9bMC05XSspCi1oZXhjb25zdGFudCAgICgiMHgiWzAtOUEtRmEtZl0rKQotZHViY29uc3RhbnQgICAoWystXT9bMC05XSooXC5bMC05XSspPyhbZUVdWystXT9bMC05XSspPykKLWlkZW50aWZpZXIgICAgKFthLXpBLVpfXVtcLmEtekEtWl8wLTldKikKLXdoaXRlc3BhY2UgICAgKFsgXHRcclxuXSopCi1zaWxseWNvbW0gICAgICgiLyoiIioiKiIqLyIpCi1tdWx0aWNvbW0gICAgICgiLyoiW14qXSIvIiooW14qL118W14qXSIvInwiKiJbXi9dKSoiKiIqIiovIikKLWRvY3RleHQgICAgICAgKCIvKioiKFteKi9dfFteKl0iLyJ8IioiW14vXSkqIioiKiIqLyIpCi1jb21tZW50ICAgICAgICgiLy8iW15cbl0qKQotdW5peGNvbW1lbnQgICAoIiMiW15cbl0qKQotc3ltYm9sICAgICAgICAoWzo7XCxce1x9XChcKVw9PD5cW1xdXSkKLXN0X2lkZW50aWZpZXIgKFthLXpBLVotXVtcLmEtekEtWl8wLTktXSopCi1saXRlcmFsX2JlZ2luIChbJ1wiXSkKLQotJSUKLQote3doaXRlc3BhY2V9ICAgICAgICAgeyAvKiBkbyBub3RoaW5nICovICAgICAgICAgICAgICAgICB9Ci17c2lsbHljb21tfSAgICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KLXttdWx0aWNvbW19ICAgICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQote2NvbW1lbnR9ICAgICAgICAgICAgeyAvKiBkbyBub3RoaW5nICovICAgICAgICAgICAgICAgICB9Ci17dW5peGNvbW1lbnR9ICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KLQote3N5bWJvbH0gICAgICAgICAgICAgeyByZXR1cm4geXl0ZXh0WzBdOyAgICAgICAgICAgICAgICB9Ci0KLSJuYW1lc3BhY2UiICAgICAgICAgIHsgcmV0dXJuIHRva19uYW1lc3BhY2U7ICAgICAgICAgICAgfQotImNwcF9uYW1lc3BhY2UiICAgICAgeyByZXR1cm4gdG9rX2NwcF9uYW1lc3BhY2U7ICAgICAgICB9Ci0iY3BwX2luY2x1ZGUiICAgICAgICB7IHJldHVybiB0b2tfY3BwX2luY2x1ZGU7ICAgICAgICAgIH0KLSJjcHBfdHlwZSIgICAgICAgICAgIHsgcmV0dXJuIHRva19jcHBfdHlwZTsgICAgICAgICAgICAgfQotImphdmFfcGFja2FnZSIgICAgICAgeyByZXR1cm4gdG9rX2phdmFfcGFja2FnZTsgICAgICAgICB9Ci0iY29jb2FfcHJlZml4IiAgICAgICB7IHJldHVybiB0b2tfY29jb2FfcHJlZml4OyAgICAgICAgIH0KLSJjc2hhcnBfbmFtZXNwYWNlIiAgIHsgcmV0dXJuIHRva19jc2hhcnBfbmFtZXNwYWNlOyAgICAgfQotInBocF9uYW1lc3BhY2UiICAgICAgeyByZXR1cm4gdG9rX3BocF9uYW1lc3BhY2U7ICAgICAgICB9Ci0icHlfbW9kdWxlIiAgICAgICAgICB7IHJldHVybiB0b2tfcHlfbW9kdWxlOyAgICAgICAgICAgIH0KLSJwZXJsX3BhY2thZ2UiICAgICAgIHsgcmV0dXJuIHRva19wZXJsX3BhY2thZ2U7ICAgICAgICAgfQotInJ1YnlfbmFtZXNwYWNlIiAgICAgeyByZXR1cm4gdG9rX3J1YnlfbmFtZXNwYWNlOyAgICAgICB9Ci0ic21hbGx0YWxrX2NhdGVnb3J5IiB7IHJldHVybiB0b2tfc21hbGx0YWxrX2NhdGVnb3J5OyAgIH0KLSJzbWFsbHRhbGtfcHJlZml4IiAgIHsgcmV0dXJuIHRva19zbWFsbHRhbGtfcHJlZml4OyAgICAgfQotInhzZF9hbGwiICAgICAgICAgICAgeyByZXR1cm4gdG9rX3hzZF9hbGw7ICAgICAgICAgICAgICB9Ci0ieHNkX29wdGlvbmFsIiAgICAgICB7IHJldHVybiB0b2tfeHNkX29wdGlvbmFsOyAgICAgICAgIH0KLSJ4c2RfbmlsbGFibGUiICAgICAgIHsgcmV0dXJuIHRva194c2RfbmlsbGFibGU7ICAgICAgICAgfQotInhzZF9uYW1lc3BhY2UiICAgICAgeyByZXR1cm4gdG9rX3hzZF9uYW1lc3BhY2U7ICAgICAgICB9Ci0ieHNkX2F0dHJzIiAgICAgICAgICB7IHJldHVybiB0b2tfeHNkX2F0dHJzOyAgICAgICAgICAgIH0KLSJpbmNsdWRlIiAgICAgICAgICAgIHsgcmV0dXJuIHRva19pbmNsdWRlOyAgICAgICAgICAgICAgfQotInZvaWQiICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3ZvaWQ7ICAgICAgICAgICAgICAgICB9Ci0iYm9vbCIgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfYm9vbDsgICAgICAgICAgICAgICAgIH0KLSJieXRlIiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19ieXRlOyAgICAgICAgICAgICAgICAgfQotImkxNiIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2kxNjsgICAgICAgICAgICAgICAgICB9Ci0iaTMyIiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfaTMyOyAgICAgICAgICAgICAgICAgIH0KLSJpNjQiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19pNjQ7ICAgICAgICAgICAgICAgICAgfQotImRvdWJsZSIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2RvdWJsZTsgICAgICAgICAgICAgICB9Ci0ic3RyaW5nIiAgICAgICAgICAgICB7IHJldHVybiB0b2tfc3RyaW5nOyAgICAgICAgICAgICAgIH0KLSJiaW5hcnkiICAgICAgICAgICAgIHsgcmV0dXJuIHRva19iaW5hcnk7ICAgICAgICAgICAgICAgfQotInNsaXN0IiAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3NsaXN0OyAgICAgICAgICAgICAgICB9Ci0ic2VudW0iICAgICAgICAgICAgICB7IHJldHVybiB0b2tfc2VudW07ICAgICAgICAgICAgICAgIH0KLSJtYXAiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19tYXA7ICAgICAgICAgICAgICAgICAgfQotImxpc3QiICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2xpc3Q7ICAgICAgICAgICAgICAgICB9Ci0ic2V0IiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfc2V0OyAgICAgICAgICAgICAgICAgIH0KLSJvbmV3YXkiICAgICAgICAgICAgIHsgcmV0dXJuIHRva19vbmV3YXk7ICAgICAgICAgICAgICAgfQotInR5cGVkZWYiICAgICAgICAgICAgeyByZXR1cm4gdG9rX3R5cGVkZWY7ICAgICAgICAgICAgICB9Ci0ic3RydWN0IiAgICAgICAgICAgICB7IHJldHVybiB0b2tfc3RydWN0OyAgICAgICAgICAgICAgIH0KLSJ1bmlvbiIgICAgICAgICAgICAgIHsgcmV0dXJuIHRva191bmlvbjsgICAgICAgICAgICAgICAgfQotImV4Y2VwdGlvbiIgICAgICAgICAgeyByZXR1cm4gdG9rX3hjZXB0aW9uOyAgICAgICAgICAgICB9Ci0iZXh0ZW5kcyIgICAgICAgICAgICB7IHJldHVybiB0b2tfZXh0ZW5kczsgICAgICAgICAgICAgIH0KLSJ0aHJvd3MiICAgICAgICAgICAgIHsgcmV0dXJuIHRva190aHJvd3M7ICAgICAgICAgICAgICAgfQotInNlcnZpY2UiICAgICAgICAgICAgeyByZXR1cm4gdG9rX3NlcnZpY2U7ICAgICAgICAgICAgICB9Ci0iZW51bSIgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfZW51bTsgICAgICAgICAgICAgICAgIH0KLSJjb25zdCIgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19jb25zdDsgICAgICAgICAgICAgICAgfQotInJlcXVpcmVkIiAgICAgICAgICAgeyByZXR1cm4gdG9rX3JlcXVpcmVkOyAgICAgICAgICAgICB9Ci0ib3B0aW9uYWwiICAgICAgICAgICB7IHJldHVybiB0b2tfb3B0aW9uYWw7ICAgICAgICAgICAgIH0KLSJhc3luYyIgewotICBwd2FybmluZygwLCAiXCJhc3luY1wiIGlzIGRlcHJlY2F0ZWQuICBJdCBpcyBjYWxsZWQgXCJvbmV3YXlcIiBub3cuXG4iKTsKLSAgcmV0dXJuIHRva19vbmV3YXk7Ci19Ci0KLQotIkJFR0lOIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iRU5EIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJfX0NMQVNTX18iICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIl9fRElSX18iICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iX19GSUxFX18iICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJfX0ZVTkNUSU9OX18iICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIl9fTElORV9fIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iX19NRVRIT0RfXyIgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJfX05BTUVTUEFDRV9fIiAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImFic3RyYWN0IiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iYWxpYXMiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJhbmQiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImFyZ3MiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iYXMiICAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJhc3NlcnQiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImJlZ2luIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iYnJlYWsiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJjYXNlIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImNhdGNoIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iY2xhc3MiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJjbG9uZSIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImNvbnRpbnVlIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZGVjbGFyZSIgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJkZWYiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImRlZmF1bHQiICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZGVsIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJkZWxldGUiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImRvIiAgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZHluYW1pYyIgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbGlmIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVsc2UiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZWxzZWlmIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbHNpZiIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuZCIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZW5kZGVjbGFyZSIgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbmRmb3IiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuZGZvcmVhY2giICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZW5kaWYiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbmRzd2l0Y2giICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuZHdoaWxlIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZW5zdXJlIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJleGNlcHQiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImV4ZWMiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZmFsc2UiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJmaW5hbGx5IiAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImZsb2F0IiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZm9yIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJmb3JlYWNoIiAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImZ1bmN0aW9uIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZ2xvYmFsIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJnb3RvIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImlmIiAgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iaW1wbGVtZW50cyIgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpbXBvcnQiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImluIiAgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iaW5saW5lIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpbnN0YW5jZW9mIiAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImludGVyZmFjZSIgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iaXMiICAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJsYW1iZGEiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIm1vZHVsZSIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ibmF0aXZlIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJuZXciICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIm5leHQiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ibmlsIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJub3QiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIm9yIiAgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icGFzcyIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJwdWJsaWMiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInByaW50IiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icHJpdmF0ZSIgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJwcm90ZWN0ZWQiICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInB1YmxpYyIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icmFpc2UiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJyZWRvIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInJlc2N1ZSIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icmV0cnkiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJyZWdpc3RlciIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInJldHVybiIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ic2VsZiIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJzaXplb2YiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInN0YXRpYyIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ic3VwZXIiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJzd2l0Y2giICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInN5bmNocm9uaXplZCIgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idGhlbiIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ0aGlzIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInRocm93IiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idHJhbnNpZW50IiAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ0cnVlIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInRyeSIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idW5kZWYiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ1bmlvbiIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInVubGVzcyIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idW5zaWduZWQiICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ1bnRpbCIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInVzZSIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idmFyIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ2aXJ0dWFsIiAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInZvbGF0aWxlIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0id2hlbiIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ3aGlsZSIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIndpdGgiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ieG9yIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ5aWVsZCIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotCi17aW50Y29uc3RhbnR9IHsKLSAgZXJybm8gPSAwOwotICB5eWx2YWwuaWNvbnN0ID0gc3RydG9sbCh5eXRleHQsIE5VTEwsIDEwKTsKLSAgaWYgKGVycm5vID09IEVSQU5HRSkgewotICAgIGludGVnZXJfb3ZlcmZsb3coeXl0ZXh0KTsKLSAgfQotICByZXR1cm4gdG9rX2ludF9jb25zdGFudDsKLX0KLQote2hleGNvbnN0YW50fSB7Ci0gIGVycm5vID0gMDsKLSAgeXlsdmFsLmljb25zdCA9IHN0cnRvbGwoeXl0ZXh0KzIsIE5VTEwsIDE2KTsKLSAgaWYgKGVycm5vID09IEVSQU5HRSkgewotICAgIGludGVnZXJfb3ZlcmZsb3coeXl0ZXh0KTsKLSAgfQotICByZXR1cm4gdG9rX2ludF9jb25zdGFudDsKLX0KLQote2R1YmNvbnN0YW50fSB7Ci0gIHl5bHZhbC5kY29uc3QgPSBhdG9mKHl5dGV4dCk7Ci0gIHJldHVybiB0b2tfZHViX2NvbnN0YW50OwotfQotCi17aWRlbnRpZmllcn0gewotICB5eWx2YWwuaWQgPSBzdHJkdXAoeXl0ZXh0KTsKLSAgcmV0dXJuIHRva19pZGVudGlmaWVyOwotfQotCi17c3RfaWRlbnRpZmllcn0gewotICB5eWx2YWwuaWQgPSBzdHJkdXAoeXl0ZXh0KTsKLSAgcmV0dXJuIHRva19zdF9pZGVudGlmaWVyOwotfQotCi17bGl0ZXJhbF9iZWdpbn0gewotICBjaGFyIG1hcmsgPSB5eXRleHRbMF07Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgZm9yKDs7KQotICB7Ci0gICAgaW50IGNoID0geXlpbnB1dCgpOwotICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgIGNhc2UgRU9GOgotICAgICAgICB5eWVycm9yKCJFbmQgb2YgZmlsZSB3aGlsZSByZWFkIHN0cmluZyBhdCAlZFxuIiwgeXlsaW5lbm8pOwotICAgICAgICBleGl0KDEpOwotICAgICAgY2FzZSAnXG4nOgotICAgICAgICB5eWVycm9yKCJFbmQgb2YgbGluZSB3aGlsZSByZWFkIHN0cmluZyBhdCAlZFxuIiwgeXlsaW5lbm8gLSAxKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgY2ggPSB5eWlucHV0KCk7Ci0gICAgICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgICAgICBjYXNlICdyJzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1xyJyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBjYXNlICduJzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1xuJyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBjYXNlICd0JzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1x0Jyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBjYXNlICciJzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJyInKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIGNhc2UgJ1wnJzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1wnJyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdcXCcpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHl5ZXJyb3IoIkJhZCBlc2NhcGUgY2hhcmFjdGVyXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmIChjaCA9PSBtYXJrKSB7Ci0gICAgICAgICAgeXlsdmFsLmlkID0gc3RyZHVwKHJlc3VsdC5jX3N0cigpKTsKLSAgICAgICAgICByZXR1cm4gdG9rX2xpdGVyYWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhjaCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi17ZG9jdGV4dH0gewotIC8qIFRoaXMgZG9lcyBub3Qgc2hvdyB1cCBpbiB0aGUgcGFyc2UgdHJlZS4gKi8KLSAvKiBSYXRoZXIsIHRoZSBwYXJzZXIgd2lsbCBncmFiIGl0IG91dCBvZiB0aGUgZ2xvYmFsLiAqLwotICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICBjbGVhcl9kb2N0ZXh0KCk7Ci0gICAgZ19kb2N0ZXh0ID0gc3RyZHVwKHl5dGV4dCArIDMpOwotICAgIGdfZG9jdGV4dFtzdHJsZW4oZ19kb2N0ZXh0KSAtIDJdID0gJ1wwJzsKLSAgICBnX2RvY3RleHQgPSBjbGVhbl91cF9kb2N0ZXh0KGdfZG9jdGV4dCk7Ci0gICAgZ19kb2N0ZXh0X2xpbmVubyA9IHl5bGluZW5vOwotICB9Ci19Ci0KLQotLiB7Ci0gIC8qIENhdGNoLWFsbCB0byBsZXQgdXMgY2F0Y2ggIioiIGluIHRoZSBwYXJzZXIuICovCi0gIHJldHVybiAoaW50KSB5eXRleHRbMF07Ci19Ci0KLSUlCi0KLS8qIHZpbTogZmlsZXR5cGU9bGV4Ci0qLwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnR5Lnl5IGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnR5Lnl5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE0OWNkLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0eS55eQorKysgL2Rldi9udWxsCkBAIC0xLDExNDkgKzAsMCBAQAotJXsKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBUaHJpZnQgcGFyc2VyLgotICoKLSAqIFRoaXMgcGFyc2VyIGlzIHVzZWQgb24gYSB0aHJpZnQgZGVmaW5pdGlvbiBmaWxlLgotICoKLSAqLwotCi0jZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKLSNkZWZpbmUgX19TVERDX0ZPUk1BVF9NQUNST1MKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgImdsb2JhbHMuaCIKLSNpbmNsdWRlICJwYXJzZS90X3Byb2dyYW0uaCIKLSNpbmNsdWRlICJwYXJzZS90X3Njb3BlLmgiCi0KLS8qKgotICogVGhpcyBnbG9iYWwgdmFyaWFibGUgaXMgdXNlZCBmb3IgYXV0b21hdGljIG51bWJlcmluZyBvZiBmaWVsZCBpbmRpY2VzIGV0Yy4KLSAqIHdoZW4gcGFyc2luZyB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4gRmllbGQgdmFsdWVzIGFyZSBhdXRvbWF0aWNhbGx5Ci0gKiBhc3NpZ25lZCBzdGFydGluZyBmcm9tIC0xIGFuZCB3b3JraW5nIHRoZWlyIHdheSBkb3duLgotICovCi1pbnQgeV9maWVsZF92YWwgPSAtMTsKLWludCBnX2FyZ2xpc3QgPSAwOwotY29uc3QgaW50IHN0cnVjdF9pc19zdHJ1Y3QgPSAwOwotY29uc3QgaW50IHN0cnVjdF9pc191bmlvbiA9IDE7Ci0KLSV9Ci0KLS8qKgotICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSB0aGUgcGFyc2VyIHRvIGhvbGQgdGhlIGRhdGEgdHlwZXMgYXNzb2NpYXRlZCB3aXRoCi0gKiB2YXJpb3VzIHBhcnNlIG5vZGVzLgotICovCi0ldW5pb24gewotICBjaGFyKiAgICAgICAgICBpZDsKLSAgaW50NjRfdCAgICAgICAgaWNvbnN0OwotICBkb3VibGUgICAgICAgICBkY29uc3Q7Ci0gIGJvb2wgICAgICAgICAgIHRib29sOwotICB0X2RvYyogICAgICAgICB0ZG9jOwotICB0X3R5cGUqICAgICAgICB0dHlwZTsKLSAgdF9iYXNlX3R5cGUqICAgdGJhc2U7Ci0gIHRfdHlwZWRlZiogICAgIHR0eXBlZGVmOwotICB0X2VudW0qICAgICAgICB0ZW51bTsKLSAgdF9lbnVtX3ZhbHVlKiAgdGVudW12OwotICB0X2NvbnN0KiAgICAgICB0Y29uc3Q7Ci0gIHRfY29uc3RfdmFsdWUqIHRjb25zdHY7Ci0gIHRfc3RydWN0KiAgICAgIHRzdHJ1Y3Q7Ci0gIHRfc2VydmljZSogICAgIHRzZXJ2aWNlOwotICB0X2Z1bmN0aW9uKiAgICB0ZnVuY3Rpb247Ci0gIHRfZmllbGQqICAgICAgIHRmaWVsZDsKLSAgY2hhciogICAgICAgICAgZHRleHQ7Ci0gIHRfZmllbGQ6OmVfcmVxIGVyZXE7Ci0gIHRfYW5ub3RhdGlvbiogIHRhbm5vdDsKLX0KLQotLyoqCi0gKiBTdHJpbmdzIGlkZW50aWZpZXIKLSAqLwotJXRva2VuPGlkPiAgICAgdG9rX2lkZW50aWZpZXIKLSV0b2tlbjxpZD4gICAgIHRva19saXRlcmFsCi0ldG9rZW48ZHRleHQ+ICB0b2tfZG9jdGV4dAotJXRva2VuPGlkPiAgICAgdG9rX3N0X2lkZW50aWZpZXIKLQotLyoqCi0gKiBDb25zdGFudCB2YWx1ZXMKLSAqLwotJXRva2VuPGljb25zdD4gdG9rX2ludF9jb25zdGFudAotJXRva2VuPGRjb25zdD4gdG9rX2R1Yl9jb25zdGFudAotCi0vKioKLSAqIEhlYWRlciBrZXl3b3JkcwotICovCi0ldG9rZW4gdG9rX2luY2x1ZGUKLSV0b2tlbiB0b2tfbmFtZXNwYWNlCi0ldG9rZW4gdG9rX2NwcF9uYW1lc3BhY2UKLSV0b2tlbiB0b2tfY3BwX2luY2x1ZGUKLSV0b2tlbiB0b2tfY3BwX3R5cGUKLSV0b2tlbiB0b2tfcGhwX25hbWVzcGFjZQotJXRva2VuIHRva19weV9tb2R1bGUKLSV0b2tlbiB0b2tfcGVybF9wYWNrYWdlCi0ldG9rZW4gdG9rX2phdmFfcGFja2FnZQotJXRva2VuIHRva194c2RfYWxsCi0ldG9rZW4gdG9rX3hzZF9vcHRpb25hbAotJXRva2VuIHRva194c2RfbmlsbGFibGUKLSV0b2tlbiB0b2tfeHNkX25hbWVzcGFjZQotJXRva2VuIHRva194c2RfYXR0cnMKLSV0b2tlbiB0b2tfcnVieV9uYW1lc3BhY2UKLSV0b2tlbiB0b2tfc21hbGx0YWxrX2NhdGVnb3J5Ci0ldG9rZW4gdG9rX3NtYWxsdGFsa19wcmVmaXgKLSV0b2tlbiB0b2tfY29jb2FfcHJlZml4Ci0ldG9rZW4gdG9rX2NzaGFycF9uYW1lc3BhY2UKLQotLyoqCi0gKiBCYXNlIGRhdGF0eXBlIGtleXdvcmRzCi0gKi8KLSV0b2tlbiB0b2tfdm9pZAotJXRva2VuIHRva19ib29sCi0ldG9rZW4gdG9rX2J5dGUKLSV0b2tlbiB0b2tfc3RyaW5nCi0ldG9rZW4gdG9rX2JpbmFyeQotJXRva2VuIHRva19zbGlzdAotJXRva2VuIHRva19zZW51bQotJXRva2VuIHRva19pMTYKLSV0b2tlbiB0b2tfaTMyCi0ldG9rZW4gdG9rX2k2NAotJXRva2VuIHRva19kb3VibGUKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUga2V5d29yZHMKLSAqLwotJXRva2VuIHRva19tYXAKLSV0b2tlbiB0b2tfbGlzdAotJXRva2VuIHRva19zZXQKLQotLyoqCi0gKiBGdW5jdGlvbiBtb2RpZmllcnMKLSAqLwotJXRva2VuIHRva19vbmV3YXkKLQotLyoqCi0gKiBUaHJpZnQgbGFuZ3VhZ2Uga2V5d29yZHMKLSAqLwotJXRva2VuIHRva190eXBlZGVmCi0ldG9rZW4gdG9rX3N0cnVjdAotJXRva2VuIHRva194Y2VwdGlvbgotJXRva2VuIHRva190aHJvd3MKLSV0b2tlbiB0b2tfZXh0ZW5kcwotJXRva2VuIHRva19zZXJ2aWNlCi0ldG9rZW4gdG9rX2VudW0KLSV0b2tlbiB0b2tfY29uc3QKLSV0b2tlbiB0b2tfcmVxdWlyZWQKLSV0b2tlbiB0b2tfb3B0aW9uYWwKLSV0b2tlbiB0b2tfdW5pb24KLQotLyoqCi0gKiBHcmFtbWFyIG5vZGVzCi0gKi8KLQotJXR5cGU8dHR5cGU+ICAgICBCYXNlVHlwZQotJXR5cGU8dHR5cGU+ICAgICBTaW1wbGVCYXNlVHlwZQotJXR5cGU8dHR5cGU+ICAgICBDb250YWluZXJUeXBlCi0ldHlwZTx0dHlwZT4gICAgIFNpbXBsZUNvbnRhaW5lclR5cGUKLSV0eXBlPHR0eXBlPiAgICAgTWFwVHlwZQotJXR5cGU8dHR5cGU+ICAgICBTZXRUeXBlCi0ldHlwZTx0dHlwZT4gICAgIExpc3RUeXBlCi0KLSV0eXBlPHRkb2M+ICAgICAgRGVmaW5pdGlvbgotJXR5cGU8dHR5cGU+ICAgICBUeXBlRGVmaW5pdGlvbgotCi0ldHlwZTx0dHlwZWRlZj4gIFR5cGVkZWYKLQotJXR5cGU8dHR5cGU+ICAgICBUeXBlQW5ub3RhdGlvbnMKLSV0eXBlPHR0eXBlPiAgICAgVHlwZUFubm90YXRpb25MaXN0Ci0ldHlwZTx0YW5ub3Q+ICAgIFR5cGVBbm5vdGF0aW9uCi0KLSV0eXBlPHRmaWVsZD4gICAgRmllbGQKLSV0eXBlPGljb25zdD4gICAgRmllbGRJZGVudGlmaWVyCi0ldHlwZTxlcmVxPiAgICAgIEZpZWxkUmVxdWlyZWRuZXNzCi0ldHlwZTx0dHlwZT4gICAgIEZpZWxkVHlwZQotJXR5cGU8dGNvbnN0dj4gICBGaWVsZFZhbHVlCi0ldHlwZTx0c3RydWN0PiAgIEZpZWxkTGlzdAotCi0ldHlwZTx0ZW51bT4gICAgIEVudW0KLSV0eXBlPHRlbnVtPiAgICAgRW51bURlZkxpc3QKLSV0eXBlPHRlbnVtdj4gICAgRW51bURlZgotCi0ldHlwZTx0dHlwZWRlZj4gIFNlbnVtCi0ldHlwZTx0YmFzZT4gICAgIFNlbnVtRGVmTGlzdAotJXR5cGU8aWQ+ICAgICAgICBTZW51bURlZgotCi0ldHlwZTx0Y29uc3Q+ICAgIENvbnN0Ci0ldHlwZTx0Y29uc3R2PiAgIENvbnN0VmFsdWUKLSV0eXBlPHRjb25zdHY+ICAgQ29uc3RMaXN0Ci0ldHlwZTx0Y29uc3R2PiAgIENvbnN0TGlzdENvbnRlbnRzCi0ldHlwZTx0Y29uc3R2PiAgIENvbnN0TWFwCi0ldHlwZTx0Y29uc3R2PiAgIENvbnN0TWFwQ29udGVudHMKLQotJXR5cGU8aWNvbnN0PiAgICBTdHJ1Y3RIZWFkCi0ldHlwZTx0c3RydWN0PiAgIFN0cnVjdAotJXR5cGU8dHN0cnVjdD4gICBYY2VwdGlvbgotJXR5cGU8dHNlcnZpY2U+ICBTZXJ2aWNlCi0KLSV0eXBlPHRmdW5jdGlvbj4gRnVuY3Rpb24KLSV0eXBlPHR0eXBlPiAgICAgRnVuY3Rpb25UeXBlCi0ldHlwZTx0c2VydmljZT4gIEZ1bmN0aW9uTGlzdAotCi0ldHlwZTx0c3RydWN0PiAgIFRocm93cwotJXR5cGU8dHNlcnZpY2U+ICBFeHRlbmRzCi0ldHlwZTx0Ym9vbD4gICAgIE9uZXdheQotJXR5cGU8dGJvb2w+ICAgICBYc2RBbGwKLSV0eXBlPHRib29sPiAgICAgWHNkT3B0aW9uYWwKLSV0eXBlPHRib29sPiAgICAgWHNkTmlsbGFibGUKLSV0eXBlPHRzdHJ1Y3Q+ICAgWHNkQXR0cmlidXRlcwotJXR5cGU8aWQ+ICAgICAgICBDcHBUeXBlCi0KLSV0eXBlPGR0ZXh0PiAgICAgQ2FwdHVyZURvY1RleHQKLQotJSUKLQotLyoqCi0gKiBUaHJpZnQgR3JhbW1hciBJbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBGb3IgdGhlIG1vc3QgcGFydCB0aGlzIHNvdXJjZSBmaWxlIHdvcmtzIGl0cyB3YXkgdG9wIGRvd24gZnJvbSB3aGF0IHlvdQotICogbWlnaHQgZXhwZWN0IHRvIGZpbmQgaW4gYSB0eXBpY2FsIC50aHJpZnQgZmlsZSwgaS5lLiB0eXBlIGRlZmluaXRpb25zIGFuZAotICogbmFtZXNwYWNlcyB1cCB0b3AgZm9sbG93ZWQgYnkgc2VydmljZSBkZWZpbml0aW9ucyB1c2luZyB0aG9zZSB0eXBlcy4KLSAqLwotCi1Qcm9ncmFtOgotICBIZWFkZXJMaXN0IERlZmluaXRpb25MaXN0Ci0gICAgewotICAgICAgcGRlYnVnKCJQcm9ncmFtIC0+IEhlYWRlcnMgRGVmaW5pdGlvbkxpc3QiKTsKLSAgICAgIC8qCi0gICAgICBUT0RPKGRyZWlzcyk6IERlY2lkZSB3aGV0aGVyIGZ1bGwtcHJvZ3JhbSBkb2N0ZXh0IGlzIHdvcnRoIHRoZSB0cm91YmxlLgotICAgICAgaWYgKCQxICE9IE5VTEwpIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfZG9jKCQxKTsKLSAgICAgIH0KLSAgICAgICovCi0gICAgICBjbGVhcl9kb2N0ZXh0KCk7Ci0gICAgfQotCi1DYXB0dXJlRG9jVGV4dDoKLSAgICB7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgJCQgPSBnX2RvY3RleHQ7Ci0gICAgICAgIGdfZG9jdGV4dCA9IE5VTEw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkJCA9IE5VTEw7Ci0gICAgICB9Ci0gICAgfQotCi0vKiBUT0RPKGRyZWlzcyk6IFRyeSB0byBEZXN0cm95RG9jVGV4dCBpbiBhbGwgc29ydHMgb3IgcmFuZG9tIHBsYWNlcy4gKi8KLURlc3Ryb3lEb2NUZXh0OgotICAgIHsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBjbGVhcl9kb2N0ZXh0KCk7Ci0gICAgICB9Ci0gICAgfQotCi0vKiBXZSBoYXZlIHRvIERlc3Ryb3lEb2NUZXh0IGhlcmUsIG90aGVyd2lzZSBpdCBjYXRjaGVzIHRoZSBkb2N0ZXh0Ci0gICBvbiB0aGUgZmlyc3QgcmVhbCBlbGVtZW50LiAqLwotSGVhZGVyTGlzdDoKLSAgSGVhZGVyTGlzdCBEZXN0cm95RG9jVGV4dCBIZWFkZXIKLSAgICB7Ci0gICAgICBwZGVidWcoIkhlYWRlckxpc3QgLT4gSGVhZGVyTGlzdCBIZWFkZXIiKTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJIZWFkZXJMaXN0IC0+ICIpOwotICAgIH0KLQotSGVhZGVyOgotICBJbmNsdWRlCi0gICAgewotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gSW5jbHVkZSIpOwotICAgIH0KLXwgdG9rX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoJDIsICQzKTsKLSAgICAgIH0KLSAgICB9Ci18IHRva19uYW1lc3BhY2UgJyonIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX25hbWVzcGFjZSAqIHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCIqIiwgJDMpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfY3BwX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICInY3BwX25hbWVzcGFjZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgY3BwJyBpbnN0ZWFkIik7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfY3BwX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgiY3BwIiwgJDIpOwotICAgICAgfQotICAgIH0KLXwgdG9rX2NwcF9pbmNsdWRlIHRva19saXRlcmFsCi0gICAgewotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX2NwcF9pbmNsdWRlIHRva19saXRlcmFsIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfY3BwX2luY2x1ZGUoJDIpOwotICAgICAgfQotICAgIH0KLXwgdG9rX3BocF9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3BocF9uYW1lc3BhY2UnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIHBocCcgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3BocF9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoInBocCIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX3B5X21vZHVsZSB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICIncHlfbW9kdWxlJyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSBweScgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3B5X21vZHVsZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgicHkiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19wZXJsX3BhY2thZ2UgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3BlcmxfcGFja2FnZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgcGVybCcgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3BlcmxfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJwZXJsIiwgJDIpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfcnVieV9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3J1YnlfbmFtZXNwYWNlJyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSByYicgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3J1YnlfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJyYiIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX3NtYWxsdGFsa19jYXRlZ29yeSB0b2tfc3RfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICInc21hbGx0YWxrX2NhdGVnb3J5JyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSBzbWFsbHRhbGsuY2F0ZWdvcnknIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19zbWFsbHRhbGtfY2F0ZWdvcnkgdG9rX3N0X2lkZW50aWZpZXIiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoInNtYWxsdGFsay5jYXRlZ29yeSIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX3NtYWxsdGFsa19wcmVmaXggdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3NtYWxsdGFsa19wcmVmaXgnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIHNtYWxsdGFsay5wcmVmaXgnIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19zbWFsbHRhbGtfcHJlZml4IHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJzbWFsbHRhbGsucHJlZml4IiwgJDIpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfamF2YV9wYWNrYWdlIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcHdhcm5pbmcoMSwgIidqYXZhX3BhY2thZ2UnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIGphdmEnIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19qYXZhX3BhY2thZ2UgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoImphdmEiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19jb2NvYV9wcmVmaXggdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ2NvY29hX3ByZWZpeCcgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgY29jb2EnIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19jb2NvYV9wcmVmaXggdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoImNvY29hIiwgJDIpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfeHNkX25hbWVzcGFjZSB0b2tfbGl0ZXJhbAotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICIneHNkX25hbWVzcGFjZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgeHNkJyBpbnN0ZWFkIik7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfeHNkX25hbWVzcGFjZSB0b2tfbGl0ZXJhbCIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgiY29jb2EiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19jc2hhcnBfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyCi0gICB7Ci0gICAgIHB3YXJuaW5nKDEsICInY3NoYXJwX25hbWVzcGFjZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgY3NoYXJwJyBpbnN0ZWFkIik7Ci0gICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19jc2hhcnBfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIik7Ci0gICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgiY3NoYXJwIiwgJDIpOwotICAgICB9Ci0gICB9Ci0KLUluY2x1ZGU6Ci0gIHRva19pbmNsdWRlIHRva19saXRlcmFsCi0gICAgewotICAgICAgcGRlYnVnKCJJbmNsdWRlIC0+IHRva19pbmNsdWRlIHRva19saXRlcmFsIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IElOQ0xVREVTKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBpbmNsdWRlX2ZpbGUoc3RkOjpzdHJpbmcoJDIpKTsKLSAgICAgICAgaWYgKCFwYXRoLmVtcHR5KCkpIHsKLSAgICAgICAgICBnX3Byb2dyYW0tPmFkZF9pbmNsdWRlKHBhdGgsIHN0ZDo6c3RyaW5nKCQyKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLURlZmluaXRpb25MaXN0OgotICBEZWZpbml0aW9uTGlzdCBDYXB0dXJlRG9jVGV4dCBEZWZpbml0aW9uCi0gICAgewotICAgICAgcGRlYnVnKCJEZWZpbml0aW9uTGlzdCAtPiBEZWZpbml0aW9uTGlzdCBEZWZpbml0aW9uIik7Ci0gICAgICBpZiAoJDIgIT0gTlVMTCAmJiAkMyAhPSBOVUxMKSB7Ci0gICAgICAgICQzLT5zZXRfZG9jKCQyKTsKLSAgICAgIH0KLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJEZWZpbml0aW9uTGlzdCAtPiAiKTsKLSAgICB9Ci0KLURlZmluaXRpb246Ci0gIENvbnN0Ci0gICAgewotICAgICAgcGRlYnVnKCJEZWZpbml0aW9uIC0+IENvbnN0Iik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfY29uc3QoJDEpOwotICAgICAgfQotICAgICAgJCQgPSAkMTsKLSAgICB9Ci18IFR5cGVEZWZpbml0aW9uCi0gICAgewotICAgICAgcGRlYnVnKCJEZWZpbml0aW9uIC0+IFR5cGVEZWZpbml0aW9uIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19zY29wZS0+YWRkX3R5cGUoJDEtPmdldF9uYW1lKCksICQxKTsKLSAgICAgICAgaWYgKGdfcGFyZW50X3Njb3BlICE9IE5VTEwpIHsKLSAgICAgICAgICBnX3BhcmVudF9zY29wZS0+YWRkX3R5cGUoZ19wYXJlbnRfcHJlZml4ICsgJDEtPmdldF9uYW1lKCksICQxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgJCQgPSAkMTsKLSAgICB9Ci18IFNlcnZpY2UKLSAgICB7Ci0gICAgICBwZGVidWcoIkRlZmluaXRpb24gLT4gU2VydmljZSIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfc2NvcGUtPmFkZF9zZXJ2aWNlKCQxLT5nZXRfbmFtZSgpLCAkMSk7Ci0gICAgICAgIGlmIChnX3BhcmVudF9zY29wZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgZ19wYXJlbnRfc2NvcGUtPmFkZF9zZXJ2aWNlKGdfcGFyZW50X3ByZWZpeCArICQxLT5nZXRfbmFtZSgpLCAkMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfc2VydmljZSgkMSk7Ci0gICAgICB9Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLQotVHlwZURlZmluaXRpb246Ci0gIFR5cGVkZWYKLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFR5cGVkZWYiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPmFkZF90eXBlZGVmKCQxKTsKLSAgICAgIH0KLSAgICB9Ci18IEVudW0KLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IEVudW0iKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPmFkZF9lbnVtKCQxKTsKLSAgICAgIH0KLSAgICB9Ci18IFNlbnVtCi0gICAgewotICAgICAgcGRlYnVnKCJUeXBlRGVmaW5pdGlvbiAtPiBTZW51bSIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+YWRkX3R5cGVkZWYoJDEpOwotICAgICAgfQotICAgIH0KLXwgU3RydWN0Ci0gICAgewotICAgICAgcGRlYnVnKCJUeXBlRGVmaW5pdGlvbiAtPiBTdHJ1Y3QiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPmFkZF9zdHJ1Y3QoJDEpOwotICAgICAgfQotICAgIH0KLXwgWGNlcHRpb24KLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFhjZXB0aW9uIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfeGNlcHRpb24oJDEpOwotICAgICAgfQotICAgIH0KLQotVHlwZWRlZjoKLSAgdG9rX3R5cGVkZWYgRmllbGRUeXBlIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcGRlYnVnKCJUeXBlRGVmIC0+IHRva190eXBlZGVmIEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgdF90eXBlZGVmICp0ZCA9IG5ldyB0X3R5cGVkZWYoZ19wcm9ncmFtLCAkMiwgJDMpOwotICAgICAgJCQgPSB0ZDsKLSAgICB9Ci0KLUNvbW1hT3JTZW1pY29sb25PcHRpb25hbDoKLSAgJywnCi0gICAge30KLXwgJzsnCi0gICAge30KLXwKLSAgICB7fQotCi1FbnVtOgotICB0b2tfZW51bSB0b2tfaWRlbnRpZmllciAneycgRW51bURlZkxpc3QgJ30nCi0gICAgewotICAgICAgcGRlYnVnKCJFbnVtIC0+IHRva19lbnVtIHRva19pZGVudGlmaWVyIHsgRW51bURlZkxpc3QgfSIpOwotICAgICAgJCQgPSAkNDsKLSAgICAgICQkLT5zZXRfbmFtZSgkMik7Ci0gICAgICAkJC0+cmVzb2x2ZV92YWx1ZXMoKTsKLSAgICAgIC8vIG1ha2UgY29uc3RhbnRzIGZvciBhbGwgdGhlIGVudW0gdmFsdWVzCi0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gJCQtPmdldF9jb25zdGFudHMoKTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKLSAgICAgICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3RfbmFtZSA9ICQkLT5nZXRfbmFtZSgpICsgIi4iICsgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2VudW0oJCQpOwotICAgICAgICAgIGdfc2NvcGUtPmFkZF9jb25zdGFudChjb25zdF9uYW1lLCBuZXcgdF9jb25zdChnX3R5cGVfaTMyLCAoKmNfaXRlciktPmdldF9uYW1lKCksIGNvbnN0X3ZhbCkpOwotICAgICAgICAgIGlmIChnX3BhcmVudF9zY29wZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBnX3BhcmVudF9zY29wZS0+YWRkX2NvbnN0YW50KGdfcGFyZW50X3ByZWZpeCArIGNvbnN0X25hbWUsIG5ldyB0X2NvbnN0KGdfdHlwZV9pMzIsICgqY19pdGVyKS0+Z2V0X25hbWUoKSwgY29uc3RfdmFsKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi1FbnVtRGVmTGlzdDoKLSAgRW51bURlZkxpc3QgRW51bURlZgotICAgIHsKLSAgICAgIHBkZWJ1ZygiRW51bURlZkxpc3QgLT4gRW51bURlZkxpc3QgRW51bURlZiIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQkLT5hcHBlbmQoJDIpOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICBwZGVidWcoIkVudW1EZWZMaXN0IC0+ICIpOwotICAgICAgJCQgPSBuZXcgdF9lbnVtKGdfcHJvZ3JhbSk7Ci0gICAgfQotCi1FbnVtRGVmOgotICBDYXB0dXJlRG9jVGV4dCB0b2tfaWRlbnRpZmllciAnPScgdG9rX2ludF9jb25zdGFudCBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkVudW1EZWYgLT4gdG9rX2lkZW50aWZpZXIgPSB0b2tfaW50X2NvbnN0YW50Iik7Ci0gICAgICBpZiAoJDQgPCAwKSB7Ci0gICAgICAgIHB3YXJuaW5nKDEsICJOZWdhdGl2ZSB2YWx1ZSBzdXBwbGllZCBmb3IgZW51bSAlcy5cbiIsICQyKTsKLSAgICAgIH0KLSAgICAgIGlmICgkNCA+IElOVF9NQVgpIHsKLSAgICAgICAgcHdhcm5pbmcoMSwgIjY0LWJpdCB2YWx1ZSBzdXBwbGllZCBmb3IgZW51bSAlcy5cbiIsICQyKTsKLSAgICAgIH0KLSAgICAgICQkID0gbmV3IHRfZW51bV92YWx1ZSgkMiwgJDQpOwotICAgICAgaWYgKCQxICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPnNldF9kb2MoJDEpOwotICAgICAgfQotICAgIH0KLXwKLSAgQ2FwdHVyZURvY1RleHQgdG9rX2lkZW50aWZpZXIgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJFbnVtRGVmIC0+IHRva19pZGVudGlmaWVyIik7Ci0gICAgICAkJCA9IG5ldyB0X2VudW1fdmFsdWUoJDIpOwotICAgICAgaWYgKCQxICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPnNldF9kb2MoJDEpOwotICAgICAgfQotICAgIH0KLQotU2VudW06Ci0gIHRva19zZW51bSB0b2tfaWRlbnRpZmllciAneycgU2VudW1EZWZMaXN0ICd9JwotICAgIHsKLSAgICAgIHBkZWJ1ZygiU2VudW0gLT4gdG9rX3NlbnVtIHRva19pZGVudGlmaWVyIHsgU2VudW1EZWZMaXN0IH0iKTsKLSAgICAgICQkID0gbmV3IHRfdHlwZWRlZihnX3Byb2dyYW0sICQ0LCAkMik7Ci0gICAgfQotCi1TZW51bURlZkxpc3Q6Ci0gIFNlbnVtRGVmTGlzdCBTZW51bURlZgotICAgIHsKLSAgICAgIHBkZWJ1ZygiU2VudW1EZWZMaXN0IC0+IFNlbnVtRGVmTGlzdCBTZW51bURlZiIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQkLT5hZGRfc3RyaW5nX2VudW1fdmFsKCQyKTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJTZW51bURlZkxpc3QgLT4gIik7Ci0gICAgICAkJCA9IG5ldyB0X2Jhc2VfdHlwZSgic3RyaW5nIiwgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKTsKLSAgICAgICQkLT5zZXRfc3RyaW5nX2VudW0odHJ1ZSk7Ci0gICAgfQotCi1TZW51bURlZjoKLSAgdG9rX2xpdGVyYWwgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJTZW51bURlZiAtPiB0b2tfbGl0ZXJhbCIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci0KLUNvbnN0OgotICB0b2tfY29uc3QgRmllbGRUeXBlIHRva19pZGVudGlmaWVyICc9JyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3QgLT4gdG9rX2NvbnN0IEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciA9IENvbnN0VmFsdWUiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Njb3BlLT5yZXNvbHZlX2NvbnN0X3ZhbHVlKCQ1LCAkMik7Ci0gICAgICAgICQkID0gbmV3IHRfY29uc3QoJDIsICQzLCAkNSk7Ci0gICAgICAgIHZhbGlkYXRlX2NvbnN0X3R5cGUoJCQpOwotCi0gICAgICAgIGdfc2NvcGUtPmFkZF9jb25zdGFudCgkMywgJCQpOwotICAgICAgICBpZiAoZ19wYXJlbnRfc2NvcGUgIT0gTlVMTCkgewotICAgICAgICAgIGdfcGFyZW50X3Njb3BlLT5hZGRfY29uc3RhbnQoZ19wYXJlbnRfcHJlZml4ICsgJDMsICQkKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJCQgPSBOVUxMOwotICAgICAgfQotICAgIH0KLQotQ29uc3RWYWx1ZToKLSAgdG9rX2ludF9jb25zdGFudAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3RWYWx1ZSA9PiB0b2tfaW50X2NvbnN0YW50Iik7Ci0gICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7Ci0gICAgICAkJC0+c2V0X2ludGVnZXIoJDEpOwotICAgICAgaWYgKCQxIDwgSU5UMzJfTUlOIHx8ICQxID4gSU5UMzJfTUFYKSB7Ci0gICAgICAgIHB3YXJuaW5nKDEsICI2NC1iaXQgY29uc3RhbnQgXCIlIlBSSWk2NCJcIiBtYXkgbm90IHdvcmsgaW4gYWxsIGxhbmd1YWdlcy5cbiIsICQxKTsKLSAgICAgIH0KLSAgICB9Ci18IHRva19kdWJfY29uc3RhbnQKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2R1Yl9jb25zdGFudCIpOwotICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOwotICAgICAgJCQtPnNldF9kb3VibGUoJDEpOwotICAgIH0KLXwgdG9rX2xpdGVyYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2xpdGVyYWwiKTsKLSAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoJDEpOwotICAgIH0KLXwgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKLSAgICAgICQkLT5zZXRfaWRlbnRpZmllcigkMSk7Ci0gICAgfQotfCBDb25zdExpc3QKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gQ29uc3RMaXN0Iik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLXwgQ29uc3RNYXAKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gQ29uc3RNYXAiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgfQotCi1Db25zdExpc3Q6Ci0gICdbJyBDb25zdExpc3RDb250ZW50cyAnXScKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0TGlzdCA9PiBbIENvbnN0TGlzdENvbnRlbnRzIF0iKTsKLSAgICAgICQkID0gJDI7Ci0gICAgfQotCi1Db25zdExpc3RDb250ZW50czoKLSAgQ29uc3RMaXN0Q29udGVudHMgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0TGlzdENvbnRlbnRzID0+IENvbnN0TGlzdENvbnRlbnRzIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsIik7Ci0gICAgICAkJCA9ICQxOwotICAgICAgJCQtPmFkZF9saXN0KCQyKTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJDb25zdExpc3RDb250ZW50cyA9PiIpOwotICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOwotICAgICAgJCQtPnNldF9saXN0KCk7Ci0gICAgfQotCi1Db25zdE1hcDoKLSAgJ3snIENvbnN0TWFwQ29udGVudHMgJ30nCi0gICAgewotICAgICAgcGRlYnVnKCJDb25zdE1hcCA9PiB7IENvbnN0TWFwQ29udGVudHMgfSIpOwotICAgICAgJCQgPSAkMjsKLSAgICB9Ci0KLUNvbnN0TWFwQ29udGVudHM6Ci0gIENvbnN0TWFwQ29udGVudHMgQ29uc3RWYWx1ZSAnOicgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0TWFwQ29udGVudHMgPT4gQ29uc3RNYXBDb250ZW50cyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbCIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQkLT5hZGRfbWFwKCQyLCAkNCk7Ci0gICAgfQotfAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3RNYXBDb250ZW50cyA9PiIpOwotICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOwotICAgICAgJCQtPnNldF9tYXAoKTsKLSAgICB9Ci0KLVN0cnVjdEhlYWQ6Ci0gIHRva19zdHJ1Y3QKLSAgICB7Ci0gICAgICAkJCA9IHN0cnVjdF9pc19zdHJ1Y3Q7Ci0gICAgfQotfCB0b2tfdW5pb24KLSAgICB7Ci0gICAgICAkJCA9IHN0cnVjdF9pc191bmlvbjsKLSAgICB9Ci0KLVN0cnVjdDoKLSAgU3RydWN0SGVhZCB0b2tfaWRlbnRpZmllciBYc2RBbGwgJ3snIEZpZWxkTGlzdCAnfScgVHlwZUFubm90YXRpb25zCi0gICAgewotICAgICAgcGRlYnVnKCJTdHJ1Y3QgLT4gdG9rX3N0cnVjdCB0b2tfaWRlbnRpZmllciB7IEZpZWxkTGlzdCB9Iik7Ci0gICAgICAkNS0+c2V0X3hzZF9hbGwoJDMpOwotICAgICAgJDUtPnNldF91bmlvbigkMSA9PSBzdHJ1Y3RfaXNfdW5pb24pOwotICAgICAgJCQgPSAkNTsKLSAgICAgICQkLT5zZXRfbmFtZSgkMik7Ci0gICAgICBpZiAoJDcgIT0gTlVMTCkgewotICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDctPmFubm90YXRpb25zXzsKLSAgICAgICAgZGVsZXRlICQ3OwotICAgICAgfQotICAgIH0KLSAgICAKLVhzZEFsbDoKLSAgdG9rX3hzZF9hbGwKLSAgICB7Ci0gICAgICAkJCA9IHRydWU7Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gZmFsc2U7Ci0gICAgfQotCi1Yc2RPcHRpb25hbDoKLSAgdG9rX3hzZF9vcHRpb25hbAotICAgIHsKLSAgICAgICQkID0gdHJ1ZTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBmYWxzZTsKLSAgICB9Ci0KLVhzZE5pbGxhYmxlOgotICB0b2tfeHNkX25pbGxhYmxlCi0gICAgewotICAgICAgJCQgPSB0cnVlOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IGZhbHNlOwotICAgIH0KLQotWHNkQXR0cmlidXRlczoKLSAgdG9rX3hzZF9hdHRycyAneycgRmllbGRMaXN0ICd9JwotICAgIHsKLSAgICAgICQkID0gJDM7Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gTlVMTDsKLSAgICB9Ci0KLVhjZXB0aW9uOgotICB0b2tfeGNlcHRpb24gdG9rX2lkZW50aWZpZXIgJ3snIEZpZWxkTGlzdCAnfScKLSAgICB7Ci0gICAgICBwZGVidWcoIlhjZXB0aW9uIC0+IHRva194Y2VwdGlvbiB0b2tfaWRlbnRpZmllciB7IEZpZWxkTGlzdCB9Iik7Ci0gICAgICAkNC0+c2V0X25hbWUoJDIpOwotICAgICAgJDQtPnNldF94Y2VwdGlvbih0cnVlKTsKLSAgICAgICQkID0gJDQ7Ci0gICAgfQotCi1TZXJ2aWNlOgotICB0b2tfc2VydmljZSB0b2tfaWRlbnRpZmllciBFeHRlbmRzICd7JyBGbGFnQXJncyBGdW5jdGlvbkxpc3QgVW5mbGFnQXJncyAnfScKLSAgICB7Ci0gICAgICBwZGVidWcoIlNlcnZpY2UgLT4gdG9rX3NlcnZpY2UgdG9rX2lkZW50aWZpZXIgeyBGdW5jdGlvbkxpc3QgfSIpOwotICAgICAgJCQgPSAkNjsKLSAgICAgICQkLT5zZXRfbmFtZSgkMik7Ci0gICAgICAkJC0+c2V0X2V4dGVuZHMoJDMpOwotICAgIH0KLQotRmxhZ0FyZ3M6Ci0gICAgewotICAgICAgIGdfYXJnbGlzdCA9IDE7Ci0gICAgfQotCi1VbmZsYWdBcmdzOgotICAgIHsKLSAgICAgICBnX2FyZ2xpc3QgPSAwOwotICAgIH0KLQotRXh0ZW5kczoKLSAgdG9rX2V4dGVuZHMgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwZGVidWcoIkV4dGVuZHMgLT4gdG9rX2V4dGVuZHMgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgICQkID0gTlVMTDsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICAkJCA9IGdfc2NvcGUtPmdldF9zZXJ2aWNlKCQyKTsKLSAgICAgICAgaWYgKCQkID09IE5VTEwpIHsKLSAgICAgICAgICB5eWVycm9yKCJTZXJ2aWNlIFwiJXNcIiBoYXMgbm90IGJlZW4gZGVmaW5lZC4iLCAkMik7Ci0gICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IE5VTEw7Ci0gICAgfQotCi1GdW5jdGlvbkxpc3Q6Ci0gIEZ1bmN0aW9uTGlzdCBGdW5jdGlvbgotICAgIHsKLSAgICAgIHBkZWJ1ZygiRnVuY3Rpb25MaXN0IC0+IEZ1bmN0aW9uTGlzdCBGdW5jdGlvbiIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQxLT5hZGRfZnVuY3Rpb24oJDIpOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICBwZGVidWcoIkZ1bmN0aW9uTGlzdCAtPiAiKTsKLSAgICAgICQkID0gbmV3IHRfc2VydmljZShnX3Byb2dyYW0pOwotICAgIH0KLQotRnVuY3Rpb246Ci0gIENhcHR1cmVEb2NUZXh0IE9uZXdheSBGdW5jdGlvblR5cGUgdG9rX2lkZW50aWZpZXIgJygnIEZpZWxkTGlzdCAnKScgVGhyb3dzIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAotICAgIHsKLSAgICAgICQ2LT5zZXRfbmFtZShzdGQ6OnN0cmluZygkNCkgKyAiX2FyZ3MiKTsKLSAgICAgICQkID0gbmV3IHRfZnVuY3Rpb24oJDMsICQ0LCAkNiwgJDgsICQyKTsKLSAgICAgIGlmICgkMSAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5zZXRfZG9jKCQxKTsKLSAgICAgIH0KLSAgICB9Ci0KLU9uZXdheToKLSAgdG9rX29uZXdheQotICAgIHsKLSAgICAgICQkID0gdHJ1ZTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBmYWxzZTsKLSAgICB9Ci0KLVRocm93czoKLSAgdG9rX3Rocm93cyAnKCcgRmllbGRMaXN0ICcpJwotICAgIHsKLSAgICAgIHBkZWJ1ZygiVGhyb3dzIC0+IHRva190aHJvd3MgKCBGaWVsZExpc3QgKSIpOwotICAgICAgJCQgPSAkMzsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSAmJiAhdmFsaWRhdGVfdGhyb3dzKCQkKSkgewotICAgICAgICB5eWVycm9yKCJUaHJvd3MgY2xhdXNlIG1heSBub3QgY29udGFpbiBub24tZXhjZXB0aW9uIHR5cGVzIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgICB9Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gbmV3IHRfc3RydWN0KGdfcHJvZ3JhbSk7Ci0gICAgfQotCi1GaWVsZExpc3Q6Ci0gIEZpZWxkTGlzdCBGaWVsZAotICAgIHsKLSAgICAgIHBkZWJ1ZygiRmllbGRMaXN0IC0+IEZpZWxkTGlzdCAsIEZpZWxkIik7Ci0gICAgICAkJCA9ICQxOwotICAgICAgaWYgKCEoJCQtPmFwcGVuZCgkMikpKSB7Ci0gICAgICAgIHl5ZXJyb3IoIkZpZWxkIGlkZW50aWZpZXIgJWQgZm9yIFwiJXNcIiBoYXMgYWxyZWFkeSBiZWVuIHVzZWQiLCAkMi0+Z2V0X2tleSgpLCAkMi0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICAgIH0KLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJGaWVsZExpc3QgLT4gIik7Ci0gICAgICB5X2ZpZWxkX3ZhbCA9IC0xOwotICAgICAgJCQgPSBuZXcgdF9zdHJ1Y3QoZ19wcm9ncmFtKTsKLSAgICB9Ci0KLUZpZWxkOgotICBDYXB0dXJlRG9jVGV4dCBGaWVsZElkZW50aWZpZXIgRmllbGRSZXF1aXJlZG5lc3MgRmllbGRUeXBlIHRva19pZGVudGlmaWVyIEZpZWxkVmFsdWUgWHNkT3B0aW9uYWwgWHNkTmlsbGFibGUgWHNkQXR0cmlidXRlcyBUeXBlQW5ub3RhdGlvbnMgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJ0b2tfaW50X2NvbnN0YW50IDogRmllbGQgLT4gRmllbGRUeXBlIHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoJDIgPCAwKSB7Ci0gICAgICAgIHB3YXJuaW5nKDEsICJObyBmaWVsZCBrZXkgc3BlY2lmaWVkIGZvciAlcywgcmVzdWx0aW5nIHByb3RvY29sIG1heSBoYXZlIGNvbmZsaWN0cyBvciBub3QgYmUgYmFja3dhcmRzIGNvbXBhdGlibGUhXG4iLCAkNSk7Ci0gICAgICAgIGlmIChnX3N0cmljdCA+PSAxOTIpIHsKLSAgICAgICAgICB5eWVycm9yKCJJbXBsaWNpdCBmaWVsZCBrZXlzIGFyZSBkZXByZWNhdGVkIGFuZCBub3QgYWxsb3dlZCB3aXRoIC1zdHJpY3QiKTsKLSAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAkJCA9IG5ldyB0X2ZpZWxkKCQ0LCAkNSwgJDIpOwotICAgICAgJCQtPnNldF9yZXEoJDMpOwotICAgICAgaWYgKCQ2ICE9IE5VTEwpIHsKLSAgICAgICAgZ19zY29wZS0+cmVzb2x2ZV9jb25zdF92YWx1ZSgkNiwgJDQpOwotICAgICAgICB2YWxpZGF0ZV9maWVsZF92YWx1ZSgkJCwgJDYpOwotICAgICAgICAkJC0+c2V0X3ZhbHVlKCQ2KTsKLSAgICAgIH0KLSAgICAgICQkLT5zZXRfeHNkX29wdGlvbmFsKCQ3KTsKLSAgICAgICQkLT5zZXRfeHNkX25pbGxhYmxlKCQ4KTsKLSAgICAgIGlmICgkMSAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5zZXRfZG9jKCQxKTsKLSAgICAgIH0KLSAgICAgIGlmICgkOSAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5zZXRfeHNkX2F0dHJzKCQ5KTsKLSAgICAgIH0KLSAgICAgIGlmICgkMTAgIT0gTlVMTCkgewotICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDEwLT5hbm5vdGF0aW9uc187Ci0gICAgICAgIGRlbGV0ZSAkMTA7Ci0gICAgICB9Ci0gICAgfQotCi1GaWVsZElkZW50aWZpZXI6Ci0gIHRva19pbnRfY29uc3RhbnQgJzonCi0gICAgewotICAgICAgaWYgKCQxIDw9IDApIHsKLSAgICAgICAgcHdhcm5pbmcoMSwgIk5vbnBvc2l0aXZlIHZhbHVlICglZCkgbm90IGFsbG93ZWQgYXMgYSBmaWVsZCBrZXkuXG4iLCAkMSk7Ci0gICAgICAgICQxID0geV9maWVsZF92YWwtLTsKLSAgICAgIH0KLSAgICAgICQkID0gJDE7Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0geV9maWVsZF92YWwtLTsKLSAgICB9Ci0KLUZpZWxkUmVxdWlyZWRuZXNzOgotICB0b2tfcmVxdWlyZWQKLSAgICB7Ci0gICAgICAkJCA9IHRfZmllbGQ6OlRfUkVRVUlSRUQ7Ci0gICAgfQotfCB0b2tfb3B0aW9uYWwKLSAgICB7Ci0gICAgICBpZiAoZ19hcmdsaXN0KSB7Ci0gICAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICAgIHB3YXJuaW5nKDEsICJvcHRpb25hbCBrZXl3b3JkIGlzIGlnbm9yZWQgaW4gYXJndW1lbnQgbGlzdHMuXG4iKTsKLSAgICAgICAgfQotICAgICAgICAkJCA9IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkJCA9IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgICB9Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVDsKLSAgICB9Ci0KLUZpZWxkVmFsdWU6Ci0gICc9JyBDb25zdFZhbHVlCi0gICAgewotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgICQkID0gJDI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkJCA9IE5VTEw7Ci0gICAgICB9Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gTlVMTDsKLSAgICB9Ci0KLUZ1bmN0aW9uVHlwZToKLSAgRmllbGRUeXBlCi0gICAgewotICAgICAgcGRlYnVnKCJGdW5jdGlvblR5cGUgLT4gRmllbGRUeXBlIik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLXwgdG9rX3ZvaWQKLSAgICB7Ci0gICAgICBwZGVidWcoIkZ1bmN0aW9uVHlwZSAtPiB0b2tfdm9pZCIpOwotICAgICAgJCQgPSBnX3R5cGVfdm9pZDsKLSAgICB9Ci0KLUZpZWxkVHlwZToKLSAgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwZGVidWcoIkZpZWxkVHlwZSAtPiB0b2tfaWRlbnRpZmllciIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBJTkNMVURFUykgewotICAgICAgICAvLyBJZ25vcmUgaWRlbnRpZmllcnMgaW4gaW5jbHVkZSBtb2RlCi0gICAgICAgICQkID0gTlVMTDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIExvb2t1cCB0aGUgaWRlbnRpZmllciBpbiB0aGUgY3VycmVudCBzY29wZQotICAgICAgICAkJCA9IGdfc2NvcGUtPmdldF90eXBlKCQxKTsKLSAgICAgICAgaWYgKCQkID09IE5VTEwpIHsKLSAgICAgICAgICB5eWVycm9yKCJUeXBlIFwiJXNcIiBoYXMgbm90IGJlZW4gZGVmaW5lZC4iLCAkMSk7Ci0gICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLXwgQmFzZVR5cGUKLSAgICB7Ci0gICAgICBwZGVidWcoIkZpZWxkVHlwZSAtPiBCYXNlVHlwZSIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci18IENvbnRhaW5lclR5cGUKLSAgICB7Ci0gICAgICBwZGVidWcoIkZpZWxkVHlwZSAtPiBDb250YWluZXJUeXBlIik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLQotQmFzZVR5cGU6IFNpbXBsZUJhc2VUeXBlIFR5cGVBbm5vdGF0aW9ucwotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gU2ltcGxlQmFzZVR5cGUgVHlwZUFubm90YXRpb25zIik7Ci0gICAgICBpZiAoJDIgIT0gTlVMTCkgewotICAgICAgICAkJCA9IG5ldyB0X2Jhc2VfdHlwZSgqc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPigkMSkpOwotICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDItPmFubm90YXRpb25zXzsKLSAgICAgICAgZGVsZXRlICQyOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJCQgPSAkMTsKLSAgICAgIH0KLSAgICB9Ci0KLVNpbXBsZUJhc2VUeXBlOgotICB0b2tfc3RyaW5nCi0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfc3RyaW5nIik7Ci0gICAgICAkJCA9IGdfdHlwZV9zdHJpbmc7Ci0gICAgfQotfCB0b2tfYmluYXJ5Ci0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfYmluYXJ5Iik7Ci0gICAgICAkJCA9IGdfdHlwZV9iaW5hcnk7Ci0gICAgfQotfCB0b2tfc2xpc3QKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19zbGlzdCIpOwotICAgICAgJCQgPSBnX3R5cGVfc2xpc3Q7Ci0gICAgfQotfCB0b2tfYm9vbAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2Jvb2wiKTsKLSAgICAgICQkID0gZ190eXBlX2Jvb2w7Ci0gICAgfQotfCB0b2tfYnl0ZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2J5dGUiKTsKLSAgICAgICQkID0gZ190eXBlX2J5dGU7Ci0gICAgfQotfCB0b2tfaTE2Ci0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfaTE2Iik7Ci0gICAgICAkJCA9IGdfdHlwZV9pMTY7Ci0gICAgfQotfCB0b2tfaTMyCi0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfaTMyIik7Ci0gICAgICAkJCA9IGdfdHlwZV9pMzI7Ci0gICAgfQotfCB0b2tfaTY0Ci0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfaTY0Iik7Ci0gICAgICAkJCA9IGdfdHlwZV9pNjQ7Ci0gICAgfQotfCB0b2tfZG91YmxlCi0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfZG91YmxlIik7Ci0gICAgICAkJCA9IGdfdHlwZV9kb3VibGU7Ci0gICAgfQotCi1Db250YWluZXJUeXBlOiBTaW1wbGVDb250YWluZXJUeXBlIFR5cGVBbm5vdGF0aW9ucwotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29udGFpbmVyVHlwZSAtPiBTaW1wbGVDb250YWluZXJUeXBlIFR5cGVBbm5vdGF0aW9ucyIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgIGlmICgkMiAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkMi0+YW5ub3RhdGlvbnNfOwotICAgICAgICBkZWxldGUgJDI7Ci0gICAgICB9Ci0gICAgfQotCi1TaW1wbGVDb250YWluZXJUeXBlOgotICBNYXBUeXBlCi0gICAgewotICAgICAgcGRlYnVnKCJTaW1wbGVDb250YWluZXJUeXBlIC0+IE1hcFR5cGUiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgfQotfCBTZXRUeXBlCi0gICAgewotICAgICAgcGRlYnVnKCJTaW1wbGVDb250YWluZXJUeXBlIC0+IFNldFR5cGUiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgfQotfCBMaXN0VHlwZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiU2ltcGxlQ29udGFpbmVyVHlwZSAtPiBMaXN0VHlwZSIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci0KLU1hcFR5cGU6Ci0gIHRva19tYXAgQ3BwVHlwZSAnPCcgRmllbGRUeXBlICcsJyBGaWVsZFR5cGUgJz4nCi0gICAgewotICAgICAgcGRlYnVnKCJNYXBUeXBlIC0+IHRva19tYXAgPEZpZWxkVHlwZSwgRmllbGRUeXBlPiIpOwotICAgICAgJCQgPSBuZXcgdF9tYXAoJDQsICQ2KTsKLSAgICAgIGlmICgkMiAhPSBOVUxMKSB7Ci0gICAgICAgICgodF9jb250YWluZXIqKSQkKS0+c2V0X2NwcF9uYW1lKHN0ZDo6c3RyaW5nKCQyKSk7Ci0gICAgICB9Ci0gICAgfQotCi1TZXRUeXBlOgotICB0b2tfc2V0IENwcFR5cGUgJzwnIEZpZWxkVHlwZSAnPicKLSAgICB7Ci0gICAgICBwZGVidWcoIlNldFR5cGUgLT4gdG9rX3NldDxGaWVsZFR5cGU+Iik7Ci0gICAgICAkJCA9IG5ldyB0X3NldCgkNCk7Ci0gICAgICBpZiAoJDIgIT0gTlVMTCkgewotICAgICAgICAoKHRfY29udGFpbmVyKikkJCktPnNldF9jcHBfbmFtZShzdGQ6OnN0cmluZygkMikpOwotICAgICAgfQotICAgIH0KLQotTGlzdFR5cGU6Ci0gIHRva19saXN0ICc8JyBGaWVsZFR5cGUgJz4nIENwcFR5cGUKLSAgICB7Ci0gICAgICBwZGVidWcoIkxpc3RUeXBlIC0+IHRva19saXN0PEZpZWxkVHlwZT4iKTsKLSAgICAgICQkID0gbmV3IHRfbGlzdCgkMyk7Ci0gICAgICBpZiAoJDUgIT0gTlVMTCkgewotICAgICAgICAoKHRfY29udGFpbmVyKikkJCktPnNldF9jcHBfbmFtZShzdGQ6OnN0cmluZygkNSkpOwotICAgICAgfQotICAgIH0KLQotQ3BwVHlwZToKLSAgdG9rX2NwcF90eXBlIHRva19saXRlcmFsCi0gICAgewotICAgICAgJCQgPSAkMjsKLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBOVUxMOwotICAgIH0KLQotVHlwZUFubm90YXRpb25zOgotICAnKCcgVHlwZUFubm90YXRpb25MaXN0ICcpJwotICAgIHsKLSAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb25zIC0+ICggVHlwZUFubm90YXRpb25MaXN0ICkiKTsKLSAgICAgICQkID0gJDI7Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gTlVMTDsKLSAgICB9Ci0KLVR5cGVBbm5vdGF0aW9uTGlzdDoKLSAgVHlwZUFubm90YXRpb25MaXN0IFR5cGVBbm5vdGF0aW9uCi0gICAgewotICAgICAgcGRlYnVnKCJUeXBlQW5ub3RhdGlvbkxpc3QgLT4gVHlwZUFubm90YXRpb25MaXN0ICwgVHlwZUFubm90YXRpb24iKTsKLSAgICAgICQkID0gJDE7Ci0gICAgICAkJC0+YW5ub3RhdGlvbnNfWyQyLT5rZXldID0gJDItPnZhbDsKLSAgICAgIGRlbGV0ZSAkMjsKLSAgICB9Ci18Ci0gICAgewotICAgICAgLyogSnVzdCB1c2UgYSBkdW1teSBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgYW5ub3RhdGlvbnMuICovCi0gICAgICAkJCA9IG5ldyB0X3N0cnVjdChnX3Byb2dyYW0pOwotICAgIH0KLQotVHlwZUFubm90YXRpb246Ci0gIHRva19pZGVudGlmaWVyICc9JyB0b2tfbGl0ZXJhbCBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVBbm5vdGF0aW9uIC0+IHRva19pZGVudGlmaWVyID0gdG9rX2xpdGVyYWwiKTsKLSAgICAgICQkID0gbmV3IHRfYW5ub3RhdGlvbjsKLSAgICAgICQkLT5rZXkgPSAkMTsKLSAgICAgICQkLT52YWwgPSAkMzsKLSAgICB9Ci0KLSUlCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9DTWFrZUxpc3RzLnR4dCBiL2NvbXBpbGVyL2NwcC90ZXN0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOWYyM2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDkyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCitpZigke1dJVEhfUExVR0lOfSkKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtCb29zdF9JTkNMVURFX0RJUlN9IikKKworICAgICMgTWFrZSBzdXJlIGdlbi1jcHAgZmlsZXMgY2FuIGJlIGluY2x1ZGVkCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IikKKworICAgIHNldChwbHVnaW50ZXN0X1NPVVJDRVMKKyAgICAgICAgcGx1Z2luL2NvbnZlcnNpb25fdGVzdC5jYworICAgICkKKyAgICBhZGRfZXhlY3V0YWJsZShwbHVnaW50ZXN0ICR7cGx1Z2ludGVzdF9TT1VSQ0VTfSkKKyAgICBpZihXSVRIX1NIQVJFRF9MSUIgQU5EIE5PVCBNU1ZDKQorICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXMocGx1Z2ludGVzdAorICAgICAgICAgICAgdGhyaWZ0YworICAgICAgICAgICAgJHtCb29zdF9MSUJSQVJJRVN9CisgICAgICAgICkKKyAgICBlbHNlKCkKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHBsdWdpbnRlc3QKKyAgICAgICAgICAgIHRocmlmdGNfc3RhdGljCisgICAgICAgICAgICB0aHJpZnRfc3RhdGljCisgICAgICAgICAgICAke0Jvb3N0X0xJQlJBUklFU30KKyAgICAgICAgKQorICAgIGVuZGlmKCkKKyAgICBhZGRfdGVzdChOQU1FIFBsdWdpblVuaXRUZXN0IENPTU1BTkQgcGx1Z2ludGVzdCkKKworICAgIHNldCh0aHJpZnQtZ2VuLW15Y3BwX1NPVVJDRVMKKyAgICAgICAgLi4vc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MKKyAgICAgICAgcGx1Z2luL2NwcF9wbHVnaW4uY2MKKyAgICApCisgICAgYWRkX2V4ZWN1dGFibGUodGhyaWZ0LWdlbi1teWNwcCAke3RocmlmdC1nZW4tbXljcHBfU09VUkNFU30pCisgICAgaWYoV0lUSF9TSEFSRURfTElCIEFORCBOT1QgTVNWQykKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRocmlmdC1nZW4tbXljcHAgdGhyaWZ0YykKKyAgICBlbHNlKCkKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRocmlmdC1nZW4tbXljcHAgdGhyaWZ0Y19zdGF0aWMgdGhyaWZ0X3N0YXRpYykKKyAgICBlbmRpZigpCisKKyAgICBpZihDTUFLRV9CVUlMRF9UWVBFIFNUUkVRVUFMICJEZWJ1ZyIpCisgICAgICAgIHNldChCVUlMRFRZUEUgIkRlYnVnIikKKyAgICBlbHNlKCkKKyAgICAgICAgIyBSZWxXaXRoRGViSW5mbyBnZW5lcmF0ZXMgYmluYXJpZXMgaW4gIlJlbGVhc2UiIGRpcmVjdG9yeSB0b28KKyAgICAgICAgc2V0KEJVSUxEVFlQRSAiUmVsZWFzZSIpCisgICAgZW5kaWYoKQorCisgICAgc2V0X2RpcmVjdG9yeV9wcm9wZXJ0aWVzKFBST1BFUlRJRVMKKyAgICAgICAgQURESVRJT05BTF9NQUtFX0NMRUFOX0ZJTEVTIGdlbi1jcHAKKyAgICAgICAgQURESVRJT05BTF9NQUtFX0NMRUFOX0ZJTEVTIGdlbi1teWNwcCkKKworICAgIGZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1jcHApCisgICAgZmlsZShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLW15Y3BwKQorICAgIGFkZF90ZXN0KE5BTUUgUGx1Z2luSW50ZWdyYXRpb25UZXN0CisgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9CisgICAgICAgICAgICAgICAgIC1EVEhSSUZUX0NPTVBJTEVSPSR7VEhSSUZUX0NPTVBJTEVSfQorICAgICAgICAgICAgICAgICAtREJJTkRJUj0ke0NNQUtFX1JVTlRJTUVfT1VUUFVUX0RJUkVDVE9SWX0KKyAgICAgICAgICAgICAgICAgLURCVUlMRFRZUEU9JHtCVUlMRFRZUEV9CisgICAgICAgICAgICAgICAgIC1EQ1VSRElSPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfQorICAgICAgICAgICAgICAgICAtRFNSQ0RJUj0ke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0KKyAgICAgICAgICAgICAgICAgLVAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NwcF9wbHVnaW5fdGVzdC5jbWFrZSkKK2VuZGlmKCkKKworZmlsZShHTE9CIEtFWVdPUkRfU0FNUExFUyAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2tleXdvcmQtc2FtcGxlcy8qLnRocmlmdCIpCitmb3JlYWNoKExBTkcgJHt0aHJpZnRfY29tcGlsZXJfTEFOR1N9KQorICAgIGZvcmVhY2goU0FNUExFICR7S0VZV09SRF9TQU1QTEVTfSkKKyAgICAgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChGSUxFTkFNRSAke1NBTVBMRX0gTkFNRV9XRSkKKyAgICAgICAgYWRkX3Rlc3QoTkFNRSAiJHtMQU5HfV8ke0ZJTEVOQU1FfSIKKyAgICAgICAgICAgIENPTU1BTkQgdGhyaWZ0LWNvbXBpbGVyIC0tZ2VuICR7TEFOR30gJHtTQU1QTEV9KQorICAgICAgICBzZXRfdGVzdHNfcHJvcGVydGllcygiJHtMQU5HfV8ke0ZJTEVOQU1FfSIgUFJPUEVSVElFUworICAgICAgICAgICAgUEFTU19SRUdVTEFSX0VYUFJFU1NJT04gIkNhbm5vdCB1c2UgcmVzZXJ2ZWQgbGFuZ3VhZ2Uga2V5d29yZCIpCisgICAgZW5kZm9yZWFjaCgpCitlbmRmb3JlYWNoKCkKKworCitmaW5kX3BhY2thZ2UoUHl0aG9uSW50ZXJwIFJFUVVJUkVEKQorYWRkX3Rlc3QoTkFNRSBTdGFsZW5lc3NDaGVja1Rlc3QgQ09NTUFORCAke1BZVEhPTl9FWEVDVVRBQkxFfSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY29tcGlsZXIvc3RhbGVuZXNzX2NoZWNrLnB5ICR7VEhSSUZUX0NPTVBJTEVSfSkKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L01ha2VmaWxlLmFtIGIvY29tcGlsZXIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdmYzkxZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNjAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIworIyBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorIyBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorIyBkZXRhaWxzLgorCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMgc2VyaWFsLXRlc3RzCisKK0FNX0NQUEZMQUdTID0gJChCT09TVF9DUFBGTEFHUykgLUkkKHRvcF9zcmNkaXIpL2NvbXBpbGVyL2NwcC9zcmMKK0FNX0xERkxBR1MgPSAkKEJPT1NUX0xERkxBR1MpCitBTV9DWFhGTEFHUyA9IC1XYWxsIC1XZXh0cmEgLXBlZGFudGljCisKK2lmIFdJVEhfUExVR0lOCitjaGVja19QUk9HUkFNUyA9IHBsdWdpbnRlc3QKKworbm9pbnN0X1BST0dSQU1TID0gdGhyaWZ0LWdlbi1teWNwcAorCithbGwtbG9jYWw6IHRocmlmdC1nZW4tYmluY2F0CisKK0FNX0NQUEZMQUdTICs9IC1JJCh0b3Bfc3JjZGlyKS9saWIvY3BwL3NyYyAtSSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL3NyYworCitwbHVnaW50ZXN0X1NPVVJDRVMgPSBwbHVnaW4vY29udmVyc2lvbl90ZXN0LmNjCitwbHVnaW50ZXN0X0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC9saWJ0aHJpZnRjLmxhCisKK3RocmlmdF9nZW5fbXljcHBfU09VUkNFUyA9IHBsdWdpbi9jcHBfcGx1Z2luLmNjIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi90X2NwcF9nZW5lcmF0b3IuY2MKK3RocmlmdF9nZW5fbXljcHBfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAtSSQodG9wX3NyY2RpcikvY29tcGlsZXIvY3BwIC1JJCh0b3Bfc3JjZGlyKS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlCit0aHJpZnRfZ2VuX215Y3BwX0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC9saWJ0aHJpZnRjLmxhCisKK2NwcF9wbHVnaW5fdGVzdC5zaDogdGhyaWZ0LWdlbi1teWNwcAorCit0aHJpZnQtZ2VuLWJpbmNhdDoKKwljcCBiaW5jYXQuc2ggJEAKKwljaG1vZCA3NTUgJEAKKworcGx1Z2luX3N0YWJpbGl0eV90ZXN0LnNoOiB0aHJpZnQtZ2VuLWJpbmNhdAorCitURVNUUyA9ICQoY2hlY2tfUFJPR1JBTVMpIGNwcF9wbHVnaW5fdGVzdC5zaCBwbHVnaW5fc3RhYmlsaXR5X3Rlc3Quc2gKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXJmIGdlbi1jcHAgZ2VuLW15Y3BwIGdlbi1iaW5jYXQgdGhyaWZ0LWdlbi1iaW5jYXQKKworZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2JpbmNhdC5zaCBiL2NvbXBpbGVyL2NwcC90ZXN0L2JpbmNhdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jN2Y5MDc4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvYmluY2F0LnNoCkBAIC0wLDAgKzEsMyBAQAorIyEvYmluL2Jhc2gKKworZXhlYyAvYmluL2NhdApkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvSW5jbHVkZWQudGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvSW5jbHVkZWQudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlODRhYjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9JbmNsdWRlZC50aHJpZnQKQEAgLTAsMCArMSwxOCBAQAorY29uc3Qgc3RyaW5nIGZvbyA9ICJiYXIiCisKK3N0cnVjdCBhX3N0cnVjdCB7CisgIDE6IGJvb2wgaW1fdHJ1ZSwKKyAgMjogYm9vbCBpbV9mYWxzZSwKKyAgMzogaTggYV9iaXRlLAorICA0OiBpMTYgaW50ZWdlcjE2LAorICA1OiBpMzIgaW50ZWdlcjMyLAorICA2OiBpNjQgaW50ZWdlcjY0LAorICA3OiBkb3VibGUgZG91YmxlX3ByZWNpc2lvbiwKKyAgODogc3RyaW5nIHNvbWVfY2hhcmFjdGVycywKKyAgOTogc3RyaW5nIHpvbWdfdW5pY29kZSwKKyAgMTA6IGJvb2wgd2hhdF93aG8sCit9CisKK3NlcnZpY2UgQVNlcnZpY2UgeworICBpMzIgYV9wcm9jZWR1cmUoMTogaTMyIGFyZykKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL0luY2x1ZGluZy50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9JbmNsdWRpbmcudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3N2FmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9JbmNsdWRpbmcudGhyaWZ0CkBAIC0wLDAgKzEsNyBAQAoraW5jbHVkZSAiSW5jbHVkZWQudGhyaWZ0IgorCitjb25zdCBzdHJpbmcgcyA9ICJzdHJpbmciCisKK3N0cnVjdCBCU3RydWN0IHsKKyAgMTogSW5jbHVkZWQuYV9zdHJ1Y3Qgb25lX29mX2VhY2gKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL1NpbmdsZS50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9TaW5nbGUudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYzMwMWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9TaW5nbGUudGhyaWZ0CkBAIC0wLDAgKzEgQEAKK2NvbnN0IHN0cmluZyBmb28gPSAiYmFyIgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvc3RhbGVuZXNzX2NoZWNrLnB5IGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvc3RhbGVuZXNzX2NoZWNrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjViMTFkZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9zdGFsZW5lc3NfY2hlY2sucHkKQEAgLTAsMCArMSwxNDIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoraW1wb3J0IG9zCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGltZQoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgVGVzdFN0YWxlbmVzc0NoZWNrKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIENVUlJFTlRfRElSX1BBVEggPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5yZWFscGF0aChfX2ZpbGVfXykpCisgICAgVEhSSUZUX0VYRUNVVEFCTEVfUEFUSCA9IE5vbmUKKyAgICBTSU5HTEVfVEhSSUZUX0ZJTEVfUEFUSCA9IG9zLnBhdGguam9pbihDVVJSRU5UX0RJUl9QQVRILCAiU2luZ2xlLnRocmlmdCIpCisgICAgSU5DTFVESU5HX1RIUklGVF9GSUxFX1BBVEggPSBvcy5wYXRoLmpvaW4oQ1VSUkVOVF9ESVJfUEFUSCwgIkluY2x1ZGluZy50aHJpZnQiKQorICAgIElOQ0xVREVEX1RIUklGVF9GSUxFX1BBVEggPSBvcy5wYXRoLmpvaW4oQ1VSUkVOVF9ESVJfUEFUSCwgIkluY2x1ZGVkLnRocmlmdCIpCisKKyAgICBkZWYgdGVzdF9zdGFsZW5lc3NfY2hlY2tfb2Zfc2luZ2xlX3RocmlmdF9maWxlX3dpdGhvdXRfY2hhbmdlZF9vdXRwdXQoc2VsZik6CisgICAgICAgIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcChkaXI9VGVzdFN0YWxlbmVzc0NoZWNrLkNVUlJFTlRfRElSX1BBVEgpCisKKyAgICAgICAgY29tbWFuZCA9IFtUZXN0U3RhbGVuZXNzQ2hlY2suVEhSSUZUX0VYRUNVVEFCTEVfUEFUSCwgIi1nZW4iLCAiY3BwIiwgIi1vIiwgdGVtcF9kaXJdCisgICAgICAgIGNvbW1hbmQgKz0gW1Rlc3RTdGFsZW5lc3NDaGVjay5TSU5HTEVfVEhSSUZUX0ZJTEVfUEFUSF0KKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKGNvbW1hbmQpCisKKyAgICAgICAgdXNlZF9maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJnZW4tY3BwIiwgIlNpbmdsZV9jb25zdGFudHMuY3BwIikKKworICAgICAgICBmaXJzdF9tb2RpZmljYXRpb25fdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUob3MucGF0aC5qb2luKHVzZWRfZmlsZV9wYXRoKSkKKworICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKworICAgICAgICBzdWJwcm9jZXNzLmNhbGwoY29tbWFuZCkKKworICAgICAgICBzZWNvbmRfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKHVzZWRfZmlsZV9wYXRoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lLCBmaXJzdF9tb2RpZmljYXRpb25fdGltZSkKKworICAgICAgICBzaHV0aWwucm10cmVlKHRlbXBfZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpCisKKyAgICBkZWYgdGVzdF9zdGFsZW5lc3NfY2hlY2tfb2Zfc2luZ2xlX3RocmlmdF9maWxlX3dpdGhfY2hhbmdlZF9vdXRwdXQoc2VsZik6CisgICAgICAgIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcChkaXI9VGVzdFN0YWxlbmVzc0NoZWNrLkNVUlJFTlRfRElSX1BBVEgpCisKKyAgICAgICAgY29tbWFuZCA9IFtUZXN0U3RhbGVuZXNzQ2hlY2suVEhSSUZUX0VYRUNVVEFCTEVfUEFUSCwgIi1nZW4iLCAiY3BwIiwgIi1vIiwgdGVtcF9kaXJdCisgICAgICAgIGNvbW1hbmQgKz0gW1Rlc3RTdGFsZW5lc3NDaGVjay5TSU5HTEVfVEhSSUZUX0ZJTEVfUEFUSF0KKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKGNvbW1hbmQpCisKKyAgICAgICAgdXNlZF9maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJnZW4tY3BwIiwgIlNpbmdsZV9jb25zdGFudHMuY3BwIikKKworICAgICAgICBmaXJzdF9tb2RpZmljYXRpb25fdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUob3MucGF0aC5qb2luKHVzZWRfZmlsZV9wYXRoKSkKKyAgICAgICAgdXNlZF9maWxlID0gb3Blbih1c2VkX2ZpbGVfcGF0aCwgInIiKQorICAgICAgICBmaXJzdF9jb250ZW50cyA9IHVzZWRfZmlsZS5yZWFkKCkKKyAgICAgICAgdXNlZF9maWxlLmNsb3NlKCkKKworICAgICAgICB1c2VkX2ZpbGUgPSBvcGVuKHVzZWRfZmlsZV9wYXRoLCAiYSIpCisgICAgICAgIHVzZWRfZmlsZS53cml0ZSgiXG4vKiBUaGlzIGlzIGEgY29tbWVudCAqL1xuIikKKyAgICAgICAgdXNlZF9maWxlLmNsb3NlKCkKKworICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKworICAgICAgICBzdWJwcm9jZXNzLmNhbGwoY29tbWFuZCkKKworICAgICAgICBzZWNvbmRfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKHVzZWRfZmlsZV9wYXRoKQorICAgICAgICB1c2VkX2ZpbGUgPSBvcGVuKHVzZWRfZmlsZV9wYXRoLCAiciIpCisgICAgICAgIHNlY29uZF9jb250ZW50cyA9IHVzZWRfZmlsZS5yZWFkKCkKKyAgICAgICAgdXNlZF9maWxlLmNsb3NlKCkKKworICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lLCBmaXJzdF9tb2RpZmljYXRpb25fdGltZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9jb250ZW50cywgc2Vjb25kX2NvbnRlbnRzKQorCisgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcF9kaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X3N0YWxlbmVzc19jaGVja19vZl9pbmNsdWRlZF9maWxlKHNlbGYpOgorICAgICAgICB0ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoZGlyPVRlc3RTdGFsZW5lc3NDaGVjay5DVVJSRU5UX0RJUl9QQVRIKQorCisgICAgICAgIHRlbXBfaW5jbHVkZWRfZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAiSW5jbHVkZWQudGhyaWZ0IikKKyAgICAgICAgdGVtcF9pbmNsdWRpbmdfZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAiSW5jbHVkaW5nLnRocmlmdCIpCisKKyAgICAgICAgc2h1dGlsLmNvcHkyKFRlc3RTdGFsZW5lc3NDaGVjay5JTkNMVURFRF9USFJJRlRfRklMRV9QQVRILCB0ZW1wX2luY2x1ZGVkX2ZpbGVfcGF0aCkKKyAgICAgICAgc2h1dGlsLmNvcHkyKFRlc3RTdGFsZW5lc3NDaGVjay5JTkNMVURJTkdfVEhSSUZUX0ZJTEVfUEFUSCwgdGVtcF9pbmNsdWRpbmdfZmlsZV9wYXRoKQorCisgICAgICAgIGNvbW1hbmQgPSBbVGVzdFN0YWxlbmVzc0NoZWNrLlRIUklGVF9FWEVDVVRBQkxFX1BBVEgsICItZ2VuIiwgImNwcCIsICItcmVjdXJzZSIsICItbyIsIHRlbXBfZGlyXQorICAgICAgICBjb21tYW5kICs9IFt0ZW1wX2luY2x1ZGluZ19maWxlX3BhdGhdCisKKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKGNvbW1hbmQpCisKKyAgICAgICAgaW5jbHVkZWRfY29uc3RhbnRzX2NwcF9maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJnZW4tY3BwIiwgIkluY2x1ZGVkX2NvbnN0YW50cy5jcHAiKQorICAgICAgICBpbmNsdWRpbmdfY29uc3RhbnRzX2NwcF9maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJnZW4tY3BwIiwgIkluY2x1ZGluZ19jb25zdGFudHMuY3BwIikKKworICAgICAgICBpbmNsdWRlZF9jb25zdGFudHNfY3BwX2ZpcnN0X21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZShpbmNsdWRlZF9jb25zdGFudHNfY3BwX2ZpbGVfcGF0aCkKKyAgICAgICAgaW5jbHVkaW5nX2NvbnN0YW50c19jcHBfZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKGluY2x1ZGluZ19jb25zdGFudHNfY3BwX2ZpbGVfcGF0aCkKKworICAgICAgICB0ZW1wX2luY2x1ZGVkX2ZpbGUgPSBvcGVuKHRlbXBfaW5jbHVkZWRfZmlsZV9wYXRoLCAiYSIpCisgICAgICAgIHRlbXBfaW5jbHVkZWRfZmlsZS53cml0ZSgiXG5jb25zdCBpMzIgYW5faW50ZWdlciA9IDQyXG4iKQorICAgICAgICB0ZW1wX2luY2x1ZGVkX2ZpbGUuY2xvc2UoKQorCisgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorCisgICAgICAgIHN1YnByb2Nlc3MuY2FsbChjb21tYW5kKQorCisgICAgICAgIGluY2x1ZGVkX2NvbnN0YW50c19jcHBfc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZShpbmNsdWRlZF9jb25zdGFudHNfY3BwX2ZpbGVfcGF0aCkKKyAgICAgICAgaW5jbHVkaW5nX2NvbnN0YW50c19jcHBfc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZShpbmNsdWRpbmdfY29uc3RhbnRzX2NwcF9maWxlX3BhdGgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKAorICAgICAgICAgICAgaW5jbHVkZWRfY29uc3RhbnRzX2NwcF9zZWNvbmRfbW9kaWZpY2F0aW9uX3RpbWUsIGluY2x1ZGVkX2NvbnN0YW50c19jcHBfZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBpbmNsdWRpbmdfY29uc3RhbnRzX2NwcF9maXJzdF9tb2RpZmljYXRpb25fdGltZSwgaW5jbHVkaW5nX2NvbnN0YW50c19jcHBfc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lKQorCisgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcF9kaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKKworCitkZWYgc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRlc3RTdGFsZW5lc3NDaGVjaykpCisgICAgcmV0dXJuIHN1aXRlCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICAjIFRoZSBwYXRoIG9mIFRocmlmdCBjb21waWxlciAgaXMgIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byB0aGUgdGVzdCBzY3JpcHQuCisgICAgIyBSZW1vdmUgaXQgdG8gbm90IGNvbmZ1c2UgdGhlIHVuaXQgdGVzdGluZyBmcmFtZXdvcmsKKyAgICBUZXN0U3RhbGVuZXNzQ2hlY2suVEhSSUZUX0VYRUNVVEFCTEVfUEFUSCA9IHN5cy5hcmd2Wy0xXQorICAgIGRlbCBzeXMuYXJndlstMV0KKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvY3BwX3BsdWdpbl90ZXN0LmNtYWtlIGIvY29tcGlsZXIvY3BwL3Rlc3QvY3BwX3BsdWdpbl90ZXN0LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMTgyODEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9jcHBfcGx1Z2luX3Rlc3QuY21ha2UKQEAgLTAsMCArMSw0NSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtDVVJESVJ9L2dlbi1jcHApCitleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLXIgLW91dCAke0NVUkRJUn0vZ2VuLWNwcCAtZ2VuIGNwcCAke1NSQ0RJUn0vLi4vLi4vLi4vdGVzdC9JbmNsdWRlLnRocmlmdCkKK2lmKEVYSVRDT0RFKQorICBtZXNzYWdlKEZBVEFMX0VSUk9SICJGQUlMRUQ6IFwiJHtBUkdWfVwiOiBcIiR7RVhJVENPREV9XCIiKQorZW5kaWYoKQoraWYoV0lOMzIpCisgICAgc2V0KEVOVntQQVRIfSAiJHtCSU5ESVJ9LyR7QlVJTERUWVBFfTske0JJTkRJUn07JEVOVntQQVRIfSIpCitlbHNlKCkKKyAgICBzZXQoRU5We1BBVEh9ICIke0JJTkRJUn06JEVOVntQQVRIfSIpCitlbmRpZigpCisKK2ZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtDVVJESVJ9L2dlbi1teWNwcCkKK2V4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtciAtb3V0ICR7Q1VSRElSfS9nZW4tbXljcHAgLWdlbiBteWNwcCAke1NSQ0RJUn0vLi4vLi4vLi4vdGVzdC9JbmNsdWRlLnRocmlmdCBSRVNVTFRfVkFSSUFCTEUgRVhJVENPREUpCitpZihFWElUQ09ERSkKKyAgbWVzc2FnZShGQVRBTF9FUlJPUiAiRkFJTEVEOiBcIiR7RVhJVENPREV9XCIiKQorZW5kaWYoKQorCitmaW5kX3Byb2dyYW0oRElGRiBkaWZmKQoraWYoRElGRikKKyAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtESUZGfSAtdXJOIGdlbi1jcHAgZ2VuLW15Y3BwIFJFU1VMVF9WQVJJQUJMRSBFWElUQ09ERSkKKyAgaWYoRVhJVENPREUpCisgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiRkFJTEVEOiBcIiR7RVhJVENPREV9XCIiKQorICBlbmRpZigpCitlbHNlKCkKKyAgICBtZXNzYWdlKFdBUk5JTkcgImRpZmYgZXhlY3V0YWJsZSBpcyBub3QgYXZhaWxhYmxlLiBOb3QgdmFsaWRhdGluZyBwbHVnaW4tZ2VuZXJhdGVkIGNvZGUuIikKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2NwcF9wbHVnaW5fdGVzdC5zaCBiL2NvbXBpbGVyL2NwcC90ZXN0L2NwcF9wbHVnaW5fdGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZGIyZTBhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvY3BwX3BsdWdpbl90ZXN0LnNoCkBAIC0wLDAgKzEsMjcgQEAKKyMhL2Jpbi9zaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyB0aGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgaW52b2tlZCBieSBtYWtlLgorc2V0IC1lCitta2RpciAtcCBnZW4tY3BwIGdlbi1teWNwcAorUEFUSD0uOiIkUEFUSCIgLi4vdGhyaWZ0IC1yIC1vdXQgZ2VuLWNwcCAtZ2VuIGNwcCAuLi8uLi8uLi90ZXN0L0luY2x1ZGUudGhyaWZ0CitQQVRIPS46IiRQQVRIIiAuLi90aHJpZnQgLXIgLW91dCBnZW4tbXljcHAgLWdlbiBteWNwcCAuLi8uLi8uLi90ZXN0L0luY2x1ZGUudGhyaWZ0CitkaWZmIC11ck4gZ2VuLWNwcCBnZW4tbXljcHAKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9jb25zdDFfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9jb25zdDFfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzVlNGFjCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2NvbnN0MV9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEgQEAKK2NvbnN0IGJvb2wgcmV0dXJuID0gMApkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2VudW0xX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZW51bTFfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDgzNGUxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2VudW0xX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSwyIEBACitlbnVtIHJldHVybiB7Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZW51bTJfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9lbnVtMl9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyY2FhOGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZW51bTJfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxLDMgQEAKK2VudW0gZW51bV9uYW1lIHsKKyAgcmV0dXJuCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZXhjZXB0aW9uMV9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2V4Y2VwdGlvbjFfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWRiMzM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2V4Y2VwdGlvbjFfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxIEBACitleGNlcHRpb24gcmV0dXJuIHt9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZXhjZXB0aW9uMl9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2V4Y2VwdGlvbjJfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTNjMzUyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2V4Y2VwdGlvbjJfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxLDMgQEAKK2V4Y2VwdGlvbiBleGNlcHRpb25fbmFtZSB7CisgIDE6IHJlcXVpcmVkIGk4IHJldHVybgorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UxX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTFfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjg2YTM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UxX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSBAQAorc2VydmljZSByZXR1cm4ge30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlMl9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UyX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY3MzMxZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlMl9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAorc2VydmljZSBzZXJ2aWNlX25hbWUgeworICBib29sIGZ1bmN0aW9uX25hbWUoMTogaTMyIHJldHVybikKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlM19yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UzX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkZDk0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlM19yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAorc2VydmljZSBzZXJ2aWNlX25hbWUgeworICB2b2lkIHJldHVybigpCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTRfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlNF9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNzg3ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTRfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxLDUgQEAKK2V4Y2VwdGlvbiBleGNlcHRpb25fbmFtZSB7fQorCitzZXJ2aWNlIHNlcnZpY2VfbmFtZSB7CisgIHZvaWQgZnVuY3Rpb25fbmFtZSgpIHRocm93cyAoIDE6IGV4Y2VwdGlvbl9uYW1lIHJldHVybikKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zdHJ1Y3QxX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc3RydWN0MV9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MmI4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc3RydWN0MV9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEgQEAKK3N0cnVjdCByZXR1cm4ge30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zdHJ1Y3QyX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc3RydWN0Ml9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNzAwZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc3RydWN0Ml9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAorc3RydWN0IHN0cnVjdF9uYW1lIHsKKyAgMTogcmVxdWlyZWQgYm9vbCByZXR1cm4gPSAxCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdHlwZWRlZjFfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy90eXBlZGVmMV9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNTliYjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdHlwZWRlZjFfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxIEBACit0eXBlZGVmIGJvb2wgcmV0dXJuCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdW5pb24xX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdW5pb24xX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY4ZGYxMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy91bmlvbjFfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxIEBACit1bmlvbiByZXR1cm4ge30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy91bmlvbjJfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy91bmlvbjJfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzE5ZDFlCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3VuaW9uMl9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAordW5pb24gdW5pb25fbmFtZSB7CisgIDE6IG9wdGlvbmFsIGJvb2wgcmV0dXJuPTEKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbi9jb252ZXJzaW9uX3Rlc3QuY2MgYi9jb21waWxlci9jcHAvdGVzdC9wbHVnaW4vY29udmVyc2lvbl90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOGQ4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9wbHVnaW4vY29udmVyc2lvbl90ZXN0LmNjCkBAIC0wLDAgKzEsNDk4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi90eXBlX3V0aWwuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5oIgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC9pbmNsdWRlZC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvcGFyYW1ldGVyaXplZF90ZXN0LmhwcD4KKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojp1bml0X3Rlc3Q7CisKK25hbWVzcGFjZSB0ZXN0X2RhdGEgeworI2RlZmluZSBUX1RFU1RfVFlQRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDE0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9ncmFtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtX3ZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF92YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlZGVmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlKSkKKyNkZWZpbmUgVF9ERUxFVEVfVEVTVERBVEEociwgZCwgZWxlbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChzdGQ6OnZlY3Rvcjx0XyMjZWxlbSo+OjpyZXZlcnNlX2l0ZXJhdG9yIGl0ID0gZWxlbSMjcy5yYmVnaW4oKTsgaXQgIT0gZWxlbSMjcy5yZW5kKCk7IGl0KyspIFwKKyAgICBkZWxldGUgKml0OworI2RlZmluZSBUX0RFQ0xfVEVTVERBVEEociwgZCwgZWxlbSkgc3RhdGljIHN0ZDo6dmVjdG9yPCA6OnRfIyNlbGVtKj4gZWxlbSMjczsKK0JPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVF9ERUNMX1RFU1REQVRBLCBfLCBUX1RFU1RfVFlQRVMpCisjdW5kZWYgVF9ERUNMX1RFU1REQVRBCisKK2Jvb2wgaGFzX2RhdGEgPSBmYWxzZTsKK3ZvaWQgY2xlYW51cCgpIHsKKyAgaWYgKGhhc19kYXRhKSB7CisgICAgaGFzX2RhdGEgPSBmYWxzZTsKKyAgICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRfREVMRVRFX1RFU1REQVRBLCBfLCBUX1RFU1RfVFlQRVMpCisgIH0KK30KKwordm9pZCBpbml0X3Byb2dyYW1zKCkgeworICBwcm9ncmFtcy5wdXNoX2JhY2sobmV3IHRfcHJvZ3JhbSgicHJvZyBwYXRoIiwgInByb2dfbmFtZSIpKTsKK30KKwordm9pZCBpbml0X2Jhc2VfdHlwZXMoKSB7CisgIGJhc2VfdHlwZXMucHVzaF9iYWNrKG5ldyA6OnRfYmFzZV90eXBlKCJuYW1lMCIsIDo6dF9iYXNlX3R5cGU6OlRZUEVfVk9JRCkpOworICBiYXNlX3R5cGVzLnB1c2hfYmFjayhuZXcgOjp0X2Jhc2VfdHlwZSgibmFtZTEiLCA6OnRfYmFzZV90eXBlOjpUWVBFX1NUUklORykpOworICBiYXNlX3R5cGVzLnB1c2hfYmFjayhuZXcgOjp0X2Jhc2VfdHlwZSgibmFtZTIiLCA6OnRfYmFzZV90eXBlOjpUWVBFX0JPT0wpKTsKKyAgYmFzZV90eXBlcy5wdXNoX2JhY2sobmV3IDo6dF9iYXNlX3R5cGUoIm5hbWUzIiwgOjp0X2Jhc2VfdHlwZTo6VFlQRV9JOCkpOworICBiYXNlX3R5cGVzLnB1c2hfYmFjayhuZXcgOjp0X2Jhc2VfdHlwZSgibmFtZTQiLCA6OnRfYmFzZV90eXBlOjpUWVBFX0kxNikpOworICBiYXNlX3R5cGVzLnB1c2hfYmFjayhuZXcgOjp0X2Jhc2VfdHlwZSgibmFtZTUiLCA6OnRfYmFzZV90eXBlOjpUWVBFX0kzMikpOworICBiYXNlX3R5cGVzLnB1c2hfYmFjayhuZXcgOjp0X2Jhc2VfdHlwZSgibmFtZTYiLCA6OnRfYmFzZV90eXBlOjpUWVBFX0k2NCkpOworICBiYXNlX3R5cGVzLnB1c2hfYmFjayhuZXcgOjp0X2Jhc2VfdHlwZSgibmFtZTciLCA6OnRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSkpOworfQorCit2b2lkIGluaXRfY29uc3RfdmFsdWVzKCkgeworICBjb25zdF92YWx1ZXMucHVzaF9iYWNrKG5ldyB0X2NvbnN0X3ZhbHVlKDQyKSk7CisgIGNvbnN0X3ZhbHVlcy5wdXNoX2JhY2sobmV3IHRfY29uc3RfdmFsdWUoImZvbyIpKTsKKyAgeworICAgIHRfY29uc3RfdmFsdWUqIHggPSBuZXcgdF9jb25zdF92YWx1ZTsKKyAgICB4LT5zZXRfZG91YmxlKDMuMTQxNSk7CisgICAgY29uc3RfdmFsdWVzLnB1c2hfYmFjayh4KTsKKyAgfQorICB7CisgICAgdF9jb25zdF92YWx1ZSogeCA9IG5ldyB0X2NvbnN0X3ZhbHVlOworICAgIHgtPnNldF9pZGVudGlmaWVyKCJiYXIiKTsKKyAgICB4LT5zZXRfZW51bShlbnVtc1swXSk7CisgICAgY29uc3RfdmFsdWVzLnB1c2hfYmFjayh4KTsKKyAgfQorICB7CisgICAgdF9jb25zdF92YWx1ZSogeCA9IG5ldyB0X2NvbnN0X3ZhbHVlOworICAgIHgtPnNldF9tYXAoKTsKKyAgICB4LT5hZGRfbWFwKGNvbnN0X3ZhbHVlc1swXSwgY29uc3RfdmFsdWVzWzFdKTsKKyAgICB4LT5hZGRfbWFwKGNvbnN0X3ZhbHVlc1sxXSwgY29uc3RfdmFsdWVzWzBdKTsKKyAgICBjb25zdF92YWx1ZXMucHVzaF9iYWNrKHgpOworICB9CisgIHsKKyAgICB0X2NvbnN0X3ZhbHVlKiB4ID0gbmV3IHRfY29uc3RfdmFsdWU7CisgICAgeC0+c2V0X2xpc3QoKTsKKyAgICB4LT5hZGRfbGlzdChjb25zdF92YWx1ZXNbMF0pOworICAgIHgtPmFkZF9saXN0KGNvbnN0X3ZhbHVlc1sxXSk7CisgICAgY29uc3RfdmFsdWVzLnB1c2hfYmFjayh4KTsKKyAgfQorfQorCit2b2lkIGluaXRfY29uc3RzKCkgeworICAvLyBiYXNlX3R5cGUvZW51bSBpbmRleGVzIGZvciB0aGlzIGFuZCBvdGhlciB0ZXN0cyBhcmUgYXJiaXRyYXJ5CisgIGNvbnN0cy5wdXNoX2JhY2sobmV3IHRfY29uc3QoYmFzZV90eXBlc1syXSwgImFhYSIsIGNvbnN0X3ZhbHVlc1swXSkpOworICBjb25zdHMuYmFjaygpLT5zZXRfZG9jKCJzb2VtIGRvYyIpOworICBjb25zdHMucHVzaF9iYWNrKG5ldyB0X2NvbnN0KGJhc2VfdHlwZXNbM10sICJiYmIiLCBjb25zdF92YWx1ZXNbMV0pKTsKK30KKwordm9pZCBpbml0X2VudW1fdmFsdWVzKCkgeworICBlbnVtX3ZhbHVlcy5wdXNoX2JhY2sobmV3IHRfZW51bV92YWx1ZSgiVkFMMSIsIDExKSk7CisgIGVudW1fdmFsdWVzLmJhY2soKS0+c2V0X2RvYygiZW51bSBkb2MgMSIpOworICBlbnVtX3ZhbHVlcy5iYWNrKCktPmFubm90YXRpb25zXy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoImFubm8xIiwgInZhbDEiKSk7CisKKyAgZW51bV92YWx1ZXMucHVzaF9iYWNrKG5ldyB0X2VudW1fdmFsdWUoIlZBTDIiLCAyMikpOworfQorCit2b2lkIGluaXRfZW51bXMoKSB7CisgIGVudW1zLnB1c2hfYmFjayhuZXcgdF9lbnVtKHByb2dyYW1zWzBdKSk7CisgIGVudW1zLmJhY2soKS0+c2V0X2RvYygiZW51bSBkb2MgMSIpOworICBlbnVtcy5iYWNrKCktPmFubm90YXRpb25zXy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoImFubm8xIiwgInZhbDEiKSk7CisgIGVudW1zLmJhY2soKS0+c2V0X25hbWUoImZvb28iKTsKKyAgZW51bXMuYmFjaygpLT5hcHBlbmQoZW51bV92YWx1ZXNbMF0pOworICBlbnVtcy5iYWNrKCktPmFwcGVuZChlbnVtX3ZhbHVlc1sxXSk7Cit9CisKK3ZvaWQgaW5pdF9saXN0cygpIHsKKyAgbGlzdHMucHVzaF9iYWNrKG5ldyB0X2xpc3QoZW51bXNbMF0pKTsKKyAgbGlzdHMucHVzaF9iYWNrKG5ldyB0X2xpc3QoYmFzZV90eXBlc1s1XSkpOworICBsaXN0cy5iYWNrKCktPnNldF9jcHBfbmFtZSgibGlzdF9jcHBfbmFtZV8xIik7Cit9Cit2b2lkIGluaXRfc2V0cygpIHsKKyAgc2V0cy5wdXNoX2JhY2sobmV3IHRfc2V0KGJhc2VfdHlwZXNbNF0pKTsKKyAgc2V0cy5wdXNoX2JhY2sobmV3IHRfc2V0KGVudW1zWzBdKSk7CisgIHNldHMuYmFjaygpLT5zZXRfY3BwX25hbWUoInNldF9jcHBfbmFtZV8xIik7Cit9Cit2b2lkIGluaXRfbWFwcygpIHsKKyAgbWFwcy5wdXNoX2JhY2sobmV3IHRfbWFwKGJhc2VfdHlwZXNbNF0sIGJhc2VfdHlwZXNbMV0pKTsKKyAgbWFwcy5wdXNoX2JhY2sobmV3IHRfbWFwKGJhc2VfdHlwZXNbNV0sIGVudW1zWzBdKSk7CisgIG1hcHMuYmFjaygpLT5zZXRfY3BwX25hbWUoIm1hcF9jcHBfbmFtZV8xIik7Cit9CisKK3ZvaWQgaW5pdF90eXBlZGVmcygpIHsKKyAgdHlwZWRlZnMucHVzaF9iYWNrKG5ldyB0X3R5cGVkZWYocHJvZ3JhbXNbMF0sIGJhc2VfdHlwZXNbM10sICJWQUwxIikpOworfQordm9pZCBpbml0X2ZpZWxkcygpIHsKKyAgZmllbGRzLnB1c2hfYmFjayhuZXcgdF9maWVsZChiYXNlX3R5cGVzWzFdLCAiZjEiKSk7CisgIGZpZWxkcy5iYWNrKCktPnNldF9yZWZlcmVuY2UoZmFsc2UpOworICBmaWVsZHMuYmFjaygpLT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICBmaWVsZHMucHVzaF9iYWNrKG5ldyB0X2ZpZWxkKGJhc2VfdHlwZXNbMl0sICJmMiIsIDkpKTsKKyAgZmllbGRzLmJhY2soKS0+c2V0X3JlZmVyZW5jZSh0cnVlKTsKKyAgZmllbGRzLnB1c2hfYmFjayhuZXcgdF9maWVsZChiYXNlX3R5cGVzWzNdLCAiZjMiLCAxMSkpOworICBmaWVsZHMuYmFjaygpLT5zZXRfcmVxKHRfZmllbGQ6OlRfUkVRVUlSRUQpOworICBmaWVsZHMuYmFjaygpLT5zZXRfdmFsdWUoY29uc3RfdmFsdWVzWzBdKTsKK30KK3ZvaWQgaW5pdF9zdHJ1Y3RzKCkgeworICBzdHJ1Y3RzLnB1c2hfYmFjayhuZXcgdF9zdHJ1Y3QocHJvZ3JhbXNbMF0sICJzdHJ1Y3QxIikpOworICBzdHJ1Y3RzLmJhY2soKS0+YXBwZW5kKGZpZWxkc1swXSk7CisgIHN0cnVjdHMuYmFjaygpLT5hcHBlbmQoZmllbGRzWzFdKTsKKyAgc3RydWN0cy5wdXNoX2JhY2sobmV3IHRfc3RydWN0KHByb2dyYW1zWzBdLCAidW5pb24xIikpOworICBzdHJ1Y3RzLmJhY2soKS0+YXBwZW5kKGZpZWxkc1swXSk7CisgIHN0cnVjdHMuYmFjaygpLT5hcHBlbmQoZmllbGRzWzFdKTsKKyAgc3RydWN0cy5iYWNrKCktPnNldF91bmlvbih0cnVlKTsKKyAgc3RydWN0cy5wdXNoX2JhY2sobmV3IHRfc3RydWN0KHByb2dyYW1zWzBdLCAieGNlcHQxIikpOworICBzdHJ1Y3RzLmJhY2soKS0+c2V0X3hjZXB0aW9uKHRydWUpOworfQordm9pZCBpbml0X2Z1bmN0aW9ucygpIHsKKyAgc3RydWN0cy5wdXNoX2JhY2sobmV3IHRfc3RydWN0KHByb2dyYW1zWzBdLCAiZXJyczEiKSk7CisgIHRfc3RydWN0KiBlcnJvcnMgPSBzdHJ1Y3RzLmJhY2soKTsKKyAgc3RydWN0cy5wdXNoX2JhY2sobmV3IHRfc3RydWN0KHByb2dyYW1zWzBdLCAiYXJnczEiKSk7CisgIHRfc3RydWN0KiBhcmdsaXN0ID0gc3RydWN0cy5iYWNrKCk7CisgIGZ1bmN0aW9ucy5wdXNoX2JhY2sobmV3IHRfZnVuY3Rpb24oYmFzZV90eXBlc1swXSwgImZ1bmMxIiwgZXJyb3JzLCBhcmdsaXN0LCBmYWxzZSkpOworICBmdW5jdGlvbnMucHVzaF9iYWNrKG5ldyB0X2Z1bmN0aW9uKGJhc2VfdHlwZXNbMF0sICJmdW5jMiIsIGVycm9ycywgYXJnbGlzdCwgdHJ1ZSkpOworfQordm9pZCBpbml0X3NlcnZpY2VzKCkgeworICBzZXJ2aWNlcy5wdXNoX2JhY2sobmV3IHRfc2VydmljZShwcm9ncmFtc1swXSkpOworICBzZXJ2aWNlcy5iYWNrKCktPnNldF9kb2MoInNydjEgZG9jIik7CisgIHNlcnZpY2VzLmJhY2soKS0+c2V0X25hbWUoInNydjEiKTsKKyAgc2VydmljZXMuYmFjaygpLT5hZGRfZnVuY3Rpb24oZnVuY3Rpb25zWzBdKTsKKyAgc2VydmljZXMuYmFjaygpLT5hZGRfZnVuY3Rpb24oZnVuY3Rpb25zWzFdKTsKKworICBzZXJ2aWNlcy5wdXNoX2JhY2sobmV3IHRfc2VydmljZShwcm9ncmFtc1swXSkpOworICBzZXJ2aWNlcy5iYWNrKCktPnNldF9uYW1lKCJzcnYyIik7CisgIHNlcnZpY2VzLmJhY2soKS0+c2V0X2V4dGVuZHMoc2VydmljZXNbMF0pOworfQorCitzdGQ6OnZlY3Rvcjx0X3R5cGUqPiB0eXBlczsKK3ZvaWQgaW5pdF90eXBlcygpIHsKKyNkZWZpbmUgVF9DT1BZX1RZUEVTKHR5cGUpIHN0ZDo6Y29weSh0eXBlIyNzLmJlZ2luKCksIHR5cGUjI3MuZW5kKCksIHN0ZDo6YmFja19pbnNlcnRlcih0eXBlcykpCisgIFRfQ09QWV9UWVBFUyhiYXNlX3R5cGUpOworICBUX0NPUFlfVFlQRVMoZW51bSk7CisgIFRfQ09QWV9UWVBFUyh0eXBlZGVmKTsKKyAgVF9DT1BZX1RZUEVTKHN0cnVjdCk7CisgIFRfQ09QWV9UWVBFUyhsaXN0KTsKKyAgVF9DT1BZX1RZUEVTKHNldCk7CisgIFRfQ09QWV9UWVBFUyhtYXApOworLy8gVF9DT1BZX1RZUEVTKHNlcnZpY2UpOworI3VuZGVmIFRfQ09QWV9UWVBFUworfQorCit2b2lkIGluaXQoKSB7CisgIGlmICghaGFzX2RhdGEpIHsKKyAgICBoYXNfZGF0YSA9IHRydWU7CisjZGVmaW5lIFRfSU5JVF9URVNUREFUQShyLCBkLCBlbGVtKSBpbml0XyMjZWxlbSMjcygpOworICAgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVF9JTklUX1RFU1REQVRBLCBfLCBUX1RFU1RfVFlQRVMpCisgICAgaW5pdF90eXBlcygpOworI3VuZGVmIFRfSU5JVF9URVNUREFUQQorICB9Cit9Cit9CitzdHJ1Y3QgR2xvYmFsRml4dHVyZSB7CisgIH5HbG9iYWxGaXh0dXJlKCkgeyB0ZXN0X2RhdGE6OmNsZWFudXAoKTsgfQorfTsKKyNpZiAoQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDApCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlKTsKKyNlbHNlCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlKQorI2VuZGlmCisKK3ZvaWQgbWlncmF0ZV9nbG9iYWxfY2FjaGUoKSB7CisgIHBsdWdpbjo6VHlwZVJlZ2lzdHJ5IHJlZzsKKyAgcGx1Z2luX291dHB1dDo6Z2V0X2dsb2JhbF9jYWNoZShyZWcpOworICBwbHVnaW46OnNldF9nbG9iYWxfY2FjaGUocmVnKTsKKyAgcGx1Z2luX291dHB1dDo6Y2xlYXJfZ2xvYmFsX2NhY2hlKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QqIHJvdW5kX3RyaXAoVCogdCkgeworICB0eXBlbmFtZSBwbHVnaW46OlRvVHlwZTxUPjo6dHlwZSBwOworICBwbHVnaW46OmNsZWFyX2dsb2JhbF9jYWNoZSgpOworICBwbHVnaW5fb3V0cHV0OjpjbGVhcl9nbG9iYWxfY2FjaGUoKTsKKyAgcGx1Z2luX291dHB1dDo6Y29udmVydCh0LCBwKTsKKyAgbWlncmF0ZV9nbG9iYWxfY2FjaGUoKTsKKyAgcmV0dXJuIHBsdWdpbjo6Y29udmVydChwKTsKK30KKwordm9pZCB0ZXN0X2Jhc2VfdHlwZSg6OnRfYmFzZV90eXBlKiBzdXQpIHsKKyAgcGx1Z2luOjp0X2Jhc2VfdHlwZSBwOworICBwbHVnaW5fb3V0cHV0Ojpjb252ZXJ0KHN1dCwgcCk7CisgIGJvb3N0OjpzY29wZWRfcHRyPCA6OnRfYmFzZV90eXBlPiBzdXQyKHBsdWdpbjo6Y29udmVydChwKSk7CisKKyNkZWZpbmUgVEhSSUZUX0NIRUNLKHIsIGRhdGEsIGVsZW0pIEJPT1NUX1BQX0VYUEFORChCT09TVF9DSEVDS19FUVVBTChkYXRhIGVsZW0sIHN1dDItPmVsZW0pKTsKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCg3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzX3ZvaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19ib29sKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfc3RyaW5nX2xpc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19iaW5hcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zdHJpbmdfZW51bSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2Jhc2VfdHlwZSgpKSkpCit9CisKK3ZvaWQgdGVzdF9jb25zdF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9jb25zdF92YWx1ZT4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKHN1dC0+Z2V0X3R5cGUoKSwgc3V0Mi0+Z2V0X3R5cGUoKSk7CisgIHN3aXRjaCAoc3V0LT5nZXRfdHlwZSgpKSB7CisjZGVmaW5lIFRfQ09OU1RfVkFMVUVfQ0FTRSh0eXBlLCBuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6dHlwZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3V0LT5nZXRfIyNuYW1lKCksIHN1dDItPmdldF8jI25hbWUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYnJlYWsKKyAgICBUX0NPTlNUX1ZBTFVFX0NBU0UoQ1ZfSU5URUdFUiwgaW50ZWdlcik7CisgICAgVF9DT05TVF9WQUxVRV9DQVNFKENWX0RPVUJMRSwgZG91YmxlKTsKKyAgICBUX0NPTlNUX1ZBTFVFX0NBU0UoQ1ZfU1RSSU5HLCBzdHJpbmcpOworICAgIFRfQ09OU1RfVkFMVUVfQ0FTRShDVl9JREVOVElGSUVSLCBpZGVudGlmaWVyKTsKKyN1bmRlZiBUX0NPTlNUX1ZBTFVFX0NBU0UKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3V0LT5nZXRfbWFwKCkuc2l6ZSgpLCBzdXQyLT5nZXRfbWFwKCkuc2l6ZSgpKTsKKyAgICB7CisgICAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGUsIHRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZT4gc3V0X3ZhbHVlczsKKyAgICAgIGZvciAoc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdXQtPmdldF9tYXAoKS5iZWdpbigpOworICAgICAgICAgICBpdCAhPSBzdXQtPmdldF9tYXAoKS5lbmQoKTsgaXQrKykgeworICAgICAgICBzdXRfdmFsdWVzW2l0LT5maXJzdC0+Z2V0X3R5cGUoKV0gPSBpdC0+c2Vjb25kLT5nZXRfdHlwZSgpOworICAgICAgfQorICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlLCB0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGU+IHN1dDJfdmFsdWVzOworICAgICAgZm9yIChzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHN1dDItPmdldF9tYXAoKS5iZWdpbigpOworICAgICAgICAgICBpdCAhPSBzdXQyLT5nZXRfbWFwKCkuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgc3V0Ml92YWx1ZXNbaXQtPmZpcnN0LT5nZXRfdHlwZSgpXSA9IGl0LT5zZWNvbmQtPmdldF90eXBlKCk7CisgICAgICB9CisgICAgICBCT09TVF9DSEVDS19FUVVBTChzdXRfdmFsdWVzLmJlZ2luKCktPmZpcnN0LCBzdXQyX3ZhbHVlcy5iZWdpbigpLT5maXJzdCk7CisgICAgICBCT09TVF9DSEVDS19FUVVBTChzdXRfdmFsdWVzLmJlZ2luKCktPnNlY29uZCwgc3V0Ml92YWx1ZXMuYmVnaW4oKS0+c2Vjb25kKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTElTVDoKKyAgICBCT09TVF9DSEVDS19FUVVBTChzdXQtPmdldF9saXN0KCkuc2l6ZSgpLCBzdXQyLT5nZXRfbGlzdCgpLnNpemUoKSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3V0LT5nZXRfbGlzdCgpLmZyb250KCktPmdldF90eXBlKCksIHN1dDItPmdldF9saXN0KCkuZnJvbnQoKS0+Z2V0X3R5cGUoKSk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgQk9PU1RfQVNTRVJUKGZhbHNlKTsKKyAgICBicmVhazsKKyAgfQorfQorCit2b2lkIHRlc3RfY29uc3QodF9jb25zdCogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPCA6OnRfY29uc3Q+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0X3R5cGUoKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF92YWx1ZSgpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9kb2MoKSkpKQorfQorCit2b2lkIHRlc3RfZW51bV92YWx1ZSh0X2VudW1fdmFsdWUqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X2VudW1fdmFsdWU+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDMsIChnZXRfbmFtZSgpLCBnZXRfdmFsdWUoKSwgZ2V0X2RvYygpKSkpCit9CisKK3ZvaWQgdGVzdF9lbnVtKHRfZW51bSogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPCA6OnRfZW51bT4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9taW5fdmFsdWUoKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X21heF92YWx1ZSgpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfY29uc3RhbnRfYnlfdmFsdWUoMTEpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfY29uc3RhbnRfYnlfbmFtZSgiVkFMMSIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZG9jKCkpKSkKK30KKwordm9pZCB0ZXN0X2xpc3QodF9saXN0KiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9saXN0PiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCg0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldF9lbGVtX3R5cGUoKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfY3BwX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X25hbWUoKSkpKQorICBpZiAoc3V0LT5oYXNfY3BwX25hbWUoKSkKKyAgICBCT09TVF9DSEVDS19FUVVBTChzdXQtPmdldF9jcHBfbmFtZSgpLCBzdXQyLT5nZXRfY3BwX25hbWUoKSk7Cit9Cit2b2lkIHRlc3Rfc2V0KHRfc2V0KiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9zZXQ+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0X2VsZW1fdHlwZSgpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19jcHBfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9kb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbmFtZSgpKSkpCisgIGlmIChzdXQtPmhhc19jcHBfbmFtZSgpKQorICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN1dC0+Z2V0X2NwcF9uYW1lKCksIHN1dDItPmdldF9jcHBfbmFtZSgpKTsKK30KK3ZvaWQgdGVzdF9tYXAodF9tYXAqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X21hcD4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRfa2V5X3R5cGUoKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdmFsX3R5cGUoKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfY3BwX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X25hbWUoKSkpKQorICBpZiAoc3V0LT5oYXNfY3BwX25hbWUoKSkKKyAgICBCT09TVF9DSEVDS19FUVVBTChzdXQtPmdldF9jcHBfbmFtZSgpLCBzdXQyLT5nZXRfY3BwX25hbWUoKSk7Cit9CisKK3ZvaWQgdGVzdF90eXBlZGVmKHRfdHlwZWRlZiogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfdHlwZWRlZj4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRfZG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfc3ltYm9saWMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19mb3J3YXJkX3R5cGVkZWYoKSkpKQorfQorCit2b2lkIHRlc3RfdHlwZSh0X3R5cGUqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X3R5cGU+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzX3ZvaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19iYXNlX3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19ib29sKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfdHlwZWRlZigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2VudW0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zdHJ1Y3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc194Y2VwdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2NvbnRhaW5lcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2xpc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19tYXAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zZXJ2aWNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2RvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9uYW1lKCkpKSkKK30KKwordm9pZCB0ZXN0X2ZpZWxkKHRfZmllbGQqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X2ZpZWxkPiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCg1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldF9yZXEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcmVmZXJlbmNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2tleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9kb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbmFtZSgpKSkpCisgIGlmIChzdXQtPmdldF92YWx1ZSgpKSB7CisgICAgVEhSSUZUX0NIRUNLKCwgc3V0LT4sIGdldF92YWx1ZSgpLT5nZXRfdHlwZSgpKTsKKyAgfSBlbHNlIHsKKyAgICBCT09TVF9DSEVDSyghc3V0Mi0+Z2V0X3ZhbHVlKCkpOworICB9CisgIGlmIChzdXQtPmdldF90eXBlKCkpIHsKKyAgICBUSFJJRlRfQ0hFQ0soLCBzdXQtPiwgZ2V0X3R5cGUoKS0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSB7CisgICAgQk9PU1RfQ0hFQ0soIXN1dDItPmdldF90eXBlKCkpOworICB9Cit9Cit2b2lkIHRlc3Rfc3RydWN0KHRfc3RydWN0KiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9zdHJ1Y3Q+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNfdW5pb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc194Y2VwdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3N0cnVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9kb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbmFtZSgpKSkpCit9CisKK3ZvaWQgdGVzdF9mdW5jdGlvbih0X2Z1bmN0aW9uKiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9mdW5jdGlvbj4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goCisgICAgICBUSFJJRlRfQ0hFQ0ssCisgICAgICBzdXQtPiwKKyAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNCwgKGdldF9kb2MoKSwgZ2V0X25hbWUoKSwgZ2V0X3JldHVybnR5cGUoKS0+Z2V0X25hbWUoKSwgaXNfb25ld2F5KCkpKSkKK30KK3ZvaWQgdGVzdF9zZXJ2aWNlKHRfc2VydmljZSogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfc2VydmljZT4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoMywgKGdldF9kb2MoKSwgZ2V0X25hbWUoKSwgZ2V0X2Z1bmN0aW9ucygpLnNpemUoKSkpKQorICBpZiAoc3V0LT5nZXRfZXh0ZW5kcygpKSB7CisgICAgVEhSSUZUX0NIRUNLKCwgc3V0LT4sIGdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpOworICB9IGVsc2UgeworICAgIEJPT1NUX0NIRUNLKCFzdXQyLT5nZXRfZXh0ZW5kcygpKTsKKyAgfQorfQorCit2b2lkIHRlc3RfcHJvZ3JhbSh0X3Byb2dyYW0qIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X3Byb2dyYW0+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywgc3V0LT4sIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoMiwgKGdldF9kb2MoKSwgZ2V0X25hbWUoKSkpKQorfQorYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogZG9faW5pdF91bml0X3Rlc3Rfc3VpdGUoKSB7CisgIHRlc3RfZGF0YTo6aW5pdCgpOworICB0ZXN0X3N1aXRlKiB0cyA9IEJPT1NUX1RFU1RfU1VJVEUoIlBsdWdpbkNvbnZlcnNpb25UZXN0Iik7CisKKyNkZWZpbmUgVF9URVNUX0NBU0UociwgZCwgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHMtPmFkZChCT09TVF9QQVJBTV9URVNUX0NBU0UodGVzdF8jI3R5cGUsIHRlc3RfZGF0YTo6dHlwZSMjcy5iZWdpbigpLCB0ZXN0X2RhdGE6OnR5cGUjI3MuZW5kKCkpKTsKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUX1RFU1RfQ0FTRSwgXywgVF9URVNUX1RZUEVTKQorICBUX1RFU1RfQ0FTRShfLCBfLCB0eXBlKQorI3VuZGVmIFRfVEVTVF9DQVNFCisgIHJldHVybiB0czsKK30KKworI2lmZGVmIEJPT1NUX1RFU1RfRFlOX0xJTksKK2Jvb2wgaW5pdF91bml0X3Rlc3Rfc3VpdGUoKSB7CisgIGZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5hZGQoZG9faW5pdF91bml0X3Rlc3Rfc3VpdGUoKSk7CisgIHJldHVybiB0cnVlOworfQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICByZXR1cm4gOjpib29zdDo6dW5pdF90ZXN0Ojp1bml0X3Rlc3RfbWFpbigmaW5pdF91bml0X3Rlc3Rfc3VpdGUsIGFyZ2MsIGFyZ3YpOworfQorI2Vsc2UKK2Jvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgcmV0dXJuIGRvX2luaXRfdW5pdF90ZXN0X3N1aXRlKCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbi9jcHBfcGx1Z2luLmNjIGIvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luL2NwcF9wbHVnaW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNjMTlmMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbi9jcHBfcGx1Z2luLmNjCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vcGx1Z2luLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcGx1Z2luIHsKKworY2xhc3MgTXlDcHBHZW5lcmF0b3IgOiBwdWJsaWMgR2VuZXJhdG9yUGx1Z2luIHsKKyAgdmlydHVhbCBpbnQgZ2VuZXJhdGUoOjp0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zKSB7CisgICAgdF9nZW5lcmF0b3IqIGdlbiA9IHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yKHByb2dyYW0sICJjcHAiLCBwYXJzZWRfb3B0aW9ucywgIiIpOworICAgIGdlbi0+Z2VuZXJhdGVfcHJvZ3JhbSgpOworICAgIGRlbGV0ZSBnZW47CisgICAgcmV0dXJuIDA7CisgIH0KK307Cit9Cit9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgYXBhY2hlOjp0aHJpZnQ6OnBsdWdpbjo6TXlDcHBHZW5lcmF0b3IgcDsKKyAgcmV0dXJuIHAuZXhlYyhhcmdjLCBhcmd2KTsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbl9zdGFiaWxpdHlfdGVzdC5zaCBiL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbl9zdGFiaWxpdHlfdGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYjdjOTNkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luX3N0YWJpbGl0eV90ZXN0LnNoCkBAIC0wLDAgKzEsMzIgQEAKKyMhL2Jpbi9zaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyB0aGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgaW52b2tlZCBieSBtYWtlLgorIworIyBUaGlzIGZpbGUgcnVucyB0aGUgY29tcGlsZXIgdHdpY2UsIHVzaW5nIGEgcGx1Z2luIHRoYXQganVzdCBpbnZva2VzCisjIC9iaW4vY2F0LCBhbmQgY29tcGFyZXMgdGhlIG91dHB1dC4gIElmIEdlbmVyYXRvcklucHV0IGlzCisjIG5vbmRldGVybWluc2l0aWMsIHlvdSdkIGV4cGVjdCB0aGUgb3V0cHV0IHRvIGRpZmZlciBmcm9tIHJ1bi10by1ydW4uCisjIFNvIHRoaXMgdGVzdHMgdGhhdCBpbiBmYWN0LCB0aGUgb3V0cHV0IGlzIHN0YWJsZSBmcm9tIHJ1bi10by1ydW4uCitzZXQgLWUKK21rZGlyIC1wIGdlbi1iaW5jYXQKK1BBVEg9LjoiJFBBVEgiIC4uL3RocmlmdCAtciAtZ2VuIGJpbmNhdCAuLi8uLi8uLi90ZXN0L0luY2x1ZGUudGhyaWZ0ID4gZ2VuLWJpbmNhdC8xLnNlcgorUEFUSD0uOiIkUEFUSCIgLi4vdGhyaWZ0IC1yIC1nZW4gYmluY2F0IC4uLy4uLy4uL3Rlc3QvSW5jbHVkZS50aHJpZnQgPiBnZW4tYmluY2F0LzIuc2VyCitkaWZmIC0tYmluYXJ5IGdlbi1iaW5jYXQvMS5zZXIgZ2VuLWJpbmNhdC8yLnNlcgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL0NNYWtlTGlzdHMudHh0IGIvY29tcGlsZXIvY3BwL3Rlc3RzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYjEwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNTMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOC4xMikKKworcHJvamVjdCh0aHJpZnRfY29tcGlsZXJfdGVzdHMpCisKK3NldChUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUgorICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLgorKQorCisjIGRvbid0IGdlbmVyYXRlIFpFUk9fQ0hFQ0sKK3NldChDTUFLRV9TVVBQUkVTU19SRUdFTkVSQVRJT04gdHJ1ZSkKKworY29uZmlndXJlX2ZpbGUoJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC92ZXJzaW9uLmguaW4gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC92ZXJzaW9uLmgpCitpZihNU1ZDKQorICAgICMgVGhlIHdpbmZsZXhiaXNvbiBnZW5lcmF0b3Igb3V0cHV0cyBzb21lIG1hY3JvcyB0aGF0IGNvbmZsaWN0IHdpdGggdGhlIFZpc3VhbCBTdHVkaW8gMjAxMCBjb3B5IG9mIHN0ZGludC5oCisgICAgIyBUaGlzIG1pZ2h0IGJlIGZpeGVkIGluIGxhdGVyIHZlcnNpb25zIG9mIFZpc3VhbCBTdHVkaW8sIGJ1dCBhbiBlYXN5IHNvbHV0aW9uIGlzIHRvIGluY2x1ZGUgc3RkaW50LmggZmlyc3QKKyAgICBpZihIQVZFX1NURElOVF9IKQorICAgICAgICBhZGRfZGVmaW5pdGlvbnMoLURfX1NURENfTElNSVRfTUFDUk9TKQorICAgICAgICBhZGRfZGVmaW5pdGlvbnMoL0ZJInN0ZGludC5oIikKKyAgICBlbmRpZihIQVZFX1NURElOVF9IKQorZW5kaWYoKQorCitmaW5kX3BhY2thZ2UoRkxFWCBSRVFVSVJFRCkKK2ZpbmRfcGFja2FnZShCSVNPTiBSRVFVSVJFRCkKKworIyBjcmVhdGUgZGlyZWN0b3J5IGZvciB0aHJpZnR5IGFuZCB0aHJpZnRsCitmaWxlKE1BS0VfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvKQorCisjIENyZWF0ZSBmbGV4IGFuZCBiaXNvbiBmaWxlcyBhbmQgYnVpbGQgdGhlIGxpYiBwYXJzZSBzdGF0aWMgbGlicmFyeQorQklTT05fVEFSR0VUKHRocmlmdHkgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC90aHJpZnR5Lnl5ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5jYykKK0ZMRVhfVEFSR0VUKHRocmlmdGwgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC90aHJpZnRsLmxsICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0bC5jYykKK0FERF9GTEVYX0JJU09OX0RFUEVOREVOQ1kodGhyaWZ0bCB0aHJpZnR5KQorCitzZXQocGFyc2VfU09VUkNFUworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5jYworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0bC5jYworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5oaAorKQorCithZGRfbGlicmFyeShwYXJzZSBTVEFUSUMgJHtwYXJzZV9TT1VSQ0VTfSkKKworIyBUaHJpZnQgY29tcGlsZXIgdGVzdHMKK3NldCh0aHJpZnRfY29tcGlsZXJfdGVzdHMKKykKKworIyB5b3UgY2FuIGFkZCBzb21lIGZpbGVzIG1hbnVhbGx5IHRoZXJlIAorc2V0KHRocmlmdF9jb21waWxlcl90ZXN0c19tYW51YWxfU09VUkNFUworICAgICMgdGVzdHMgZmlsZSB0byBhdm9pZCBtYWluIGluIGV2ZXJ5IHRlc3QgZmlsZQorICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS90ZXN0c19tYWluLmNjCispCisKKyMgc2V0IHZhcmlhYmxlIGZvciB0ZXN0cyBzb3VyY2VzIC0gd2lsbCBiZSBmaWxsZWQgbGF0ZXIKK3NldCh0aHJpZnRfY29tcGlsZXJfdGVzdHNfU09VUkNFUworKQorCitzZXQodGhyaWZ0X2NvbXBpbGVyX1NPVVJDRVMKKyAgICAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L2xvZ2dpbmcuY2MgIyB3ZSB1c2UgbG9nZ2luZyBpbnN0ZWFkIG9mIG1haW4gdG8gYXZvaWQgYnJlYWtpbmcgY29tcGlsbGF0aW9uICgyIG1haW4gdikKKyAgICAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuY3BwCisgICAgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC9jb21tb24uY2MKKyAgICAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjCisgICAgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuY2MKKyAgICAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3BhcnNlL3BhcnNlLmNjCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC92ZXJzaW9uLmgKKykKKworIyBUaGlzIG1hY3JvIGFkZHMgYW4gb3B0aW9uIFRIUklGVF9DT01QSUxFUl8ke05BTUV9CisjIHRoYXQgYWxsb3dzIGVuYWJsaW5nIG9yIGRpc2FibGluZyBjZXJ0YWluIGxhbmd1YWdlcworbWFjcm8oVEhSSUZUX0FERF9DT01QSUxFUiBuYW1lIGRlc2NyaXB0aW9uIGluaXRpYWwpCisgICAgc3RyaW5nKFRPVVBQRVIgIlRIUklGVF9DT01QSUxFUl8ke25hbWV9IiBlbmFibGVyKQorICAgIHNldChzcmMgIiR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvZ2VuZXJhdGUvdF8ke25hbWV9X2dlbmVyYXRvci5jYyIpCisgICAgb3B0aW9uKCR7ZW5hYmxlcn0gJHtkZXNjcmlwdGlvbn0gJHtpbml0aWFsfSkKKyAgICBpZigke2VuYWJsZXJ9KQorICAgICAgICBsaXN0KEFQUEVORCB0aHJpZnRfY29tcGlsZXJfU09VUkNFUyAke3NyY30pCisgICAgICAgIGZpbGUoR0xPQiB0aHJpZnRfY29tcGlsZXJfdGVzdHNfU09VUkNFUworICAgICAgICAgICAgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8ke25hbWV9LyouYyoiCisgICAgICAgICAgICAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7bmFtZX0vKi50aHJpZnQiCisgICAgICAgICkKKyAgICBlbmRpZigpCitlbmRtYWNybygpCisKKyMgVGhlIGZvbGxvd2luZyBjb21waWxlciB3aXRoIHVuaXQgdGVzdHMgY2FuIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQKK1RIUklGVF9BRERfQ09NUElMRVIoY19nbGliICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDIHdpdGggR2xpYiIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihjcHAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEMrKyIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihqYXZhICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEphdmEiICAgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihhczMgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEFjdGlvblNjcmlwdCAzIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGRhcnQgICAgIkVuYWJsZSBjb21waWxlciBmb3IgRGFydCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihoYXhlICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEhheGUiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoY3NoYXJwICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDIyIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihuZXRjb3JlICJFbmFibGUgY29tcGlsZXIgZm9yIC5ORVQgQ29yZSIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHB5ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUHl0aG9uIDIuMCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihyYiAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFJ1YnkiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIocGVybCAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBQZXJsIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHBocCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUEhQIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGVybCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgRXJsYW5nIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGNvY29hICAgIkVuYWJsZSBjb21waWxlciBmb3IgQ29jb2EgT2JqZWN0aXZlLUMiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoc3dpZnQgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDb2NvYSBTd2lmdCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihzdCAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFNtYWxsdGFsayIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihvY2FtbCAgICJFbmFibGUgY29tcGlsZXIgZm9yIE9DYW1sIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGhzICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSGFza2VsbCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUih4c2QgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFhTRCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihodG1sICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEhUTUwgRG9jdW1lbnRhdGlvbiIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihqcyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEphdmFTY3JpcHQiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoanNvbiAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBKU09OIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGphdmFtZSAgIkVuYWJsZSBjb21waWxlciBmb3IgSmF2YSBNRSIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihkZWxwaGkgICJFbmFibGUgY29tcGlsZXIgZm9yIERlbHBoaSIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihnbyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEdvIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGQgICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgRCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihsdWEgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEx1YSIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihndiAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEdyYXBoVml6IiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHJzICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUnVzdCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUih4bWwgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFhNTCIgT0ZGKQorCisjIFRocmlmdCBpcyBsb29raW5nIGZvciBpbmNsdWRlIGZpbGVzIGluIHRoZSBzcmMgZGlyZWN0b3J5CisjIHdlIGFsc28gYWRkIHRoZSBjdXJyZW50IGJpbmFyeSBkaXJlY3RvcnkgZm9yIGdlbmVyYXRlZCBmaWxlcworaW5jbHVkZV9kaXJlY3Rvcmllcygke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0gJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jYXRjaCkKKworYWRkX2xpYnJhcnkodGhyaWZ0X2NvbXBpbGVyICR7dGhyaWZ0X2NvbXBpbGVyX1NPVVJDRVN9KQorCisjbGluayBwYXJzZSBsaWIgdG8gdGhyaWZ0X2NvbXBpbGVyIGxpYgordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRocmlmdF9jb21waWxlciBwYXJzZSkKKworIyBhZGQgdGVzdHMgZXhlY3V0YWJsZQorYWRkX2V4ZWN1dGFibGUodGhyaWZ0X2NvbXBpbGVyX3Rlc3RzICR7dGhyaWZ0X2NvbXBpbGVyX3Rlc3RzX21hbnVhbF9TT1VSQ0VTfSAke3RocmlmdF9jb21waWxlcl90ZXN0c19TT1VSQ0VTfSkKKworIyBpZiBnZW5lcmF0ZXMgZm9yIFZpc3VhbCBTdHVkaW8gc2V0IHRocmlmdF9jb21waWxlcl90ZXN0cyBhcyBkZWZhdWx0IHByb2plY3QKK2lmKE1TVkMpCisgICAgc2V0X3Byb3BlcnR5KFRBUkdFVCB0aHJpZnRfY29tcGlsZXJfdGVzdHMgUFJPUEVSVFkgVlNfU1RBUlRVUF9QUk9KRUNUIHRocmlmdF9jb21waWxlcl90ZXN0cykKK2VuZGlmKCkKKworc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHRocmlmdF9jb21waWxlcl90ZXN0cyBQUk9QRVJUSUVTIFJVTlRJTUVfT1VUUFVUX0RJUkVDVE9SWSBiaW4vKQorc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHRocmlmdF9jb21waWxlcl90ZXN0cyBQUk9QRVJUSUVTIE9VVFBVVF9OQU1FIHRocmlmdF9jb21waWxlcl90ZXN0cykKKwordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRocmlmdF9jb21waWxlcl90ZXN0cyB0aHJpZnRfY29tcGlsZXIpCisKK2VuYWJsZV90ZXN0aW5nKCkKK2FkZF90ZXN0KE5BTUUgVGhyaWZ0VGVzdHMgQ09NTUFORCB0aHJpZnRfY29tcGlsZXJfdGVzdHMpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL1JFQURNRS5tZCBiL2NvbXBpbGVyL2NwcC90ZXN0cy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdiZTQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9SRUFETUUubWQKQEAgLTAsMCArMSw4OCBAQAorIyBCdWlsZCBhbmQgcnVuIGNvbXBpbGVyIHRlc3RzIHVzaW5nIENNYWtlCisKKzwhLS0gVE9DIC0tPgorCistIFtCdWlsZCBhbmQgcnVuIGNvbXBpbGVyIHRlc3RzIHVzaW5nIENNYWtlXSgjYnVpbGQtYW5kLXJ1bi1jb21waWxlci10ZXN0cy11c2luZy1jbWFrZSkKKyAgICAtIFtHZW5lcmFsIGluZm9ybWF0aW9uXSgjZ2VuZXJhbC1pbmZvcm1hdGlvbikKKyAgICAtIFtIb3cgdG8gYWRkIHlvdXIgdGVzdHNdKCNob3ctdG8tYWRkLXlvdXItdGVzdHMpCisgICAgLSBbQnVpbGQgYW5kIHJ1biB0ZXN0cyBvbiBVbml4LWxpa2Ugc3lzdGVtc10oI2J1aWxkLWFuZC1ydW4tdGVzdHMtb24tdW5peC1saWtlLXN5c3RlbXMpCisgICAgICAgIC0gW1ByZXJlcXVpc2l0ZXM6XSgjcHJlcmVxdWlzaXRlcykKKyAgICAgICAgLSBbQnVpbGQgYW5kIHJ1biB0ZXN0IHdpdGggQ01ha2VdKCNidWlsZC1hbmQtcnVuLXRlc3Qtd2l0aC1jbWFrZSkKKyAgICAtIFtCdWlsZCBhbmQgcnVuIHRlc3RzIG9uIFdpbmRvd3NdKCNidWlsZC1hbmQtcnVuLXRlc3RzLW9uLXdpbmRvd3MpCisgICAgICAgIC0gW1ByZXJlcXVpc2l0ZXM6XSgjcHJlcmVxdWlzaXRlcy0xKQorICAgICAgICAtIFtHZW5lcmF0aW9uIG9mIFZTIHByb2plY3Qgd2l0aCBDTWFrZSwgYnVpbGQgYW5kIHJ1biBvbiBXaW5kb3dzXSgjZ2VuZXJhdGlvbi1vZi12cy1wcm9qZWN0LXdpdGgtY21ha2UtYnVpbGQtYW5kLXJ1bi1vbi13aW5kb3dzKQorCis8IS0tIC9UT0MgLS0+CisKKyMjIEdlbmVyYWwgaW5mb3JtYXRpb24gCisKK0FkZGVkIGdlbmVyaWMgd2F5IHRvIGNvdmVyIGNvZGUgYnkgdGVzdHMgZm9yIG1hbnkgbGFuZ3VhZ2VzICh5b3UganVzdCBuZWVkIHRvIG1ha2UgYSBjb3JyZWN0IGhlYWRlciBmaWxlIGZvciBnZW5lcmF0b3IgZm9yIHlvdXIgbGFuZ3VhZ2UgLSBleGFtcGxlIGluICoqbmV0Y29yZSoqIGltcGxlbWVudGF0aW9uKQorCitBdCBjdXJyZW50IG1vbWVudCB0aGVzZSB0ZXN0cyB1c2UgZnJlZSBDYXRjaCBsaWJyYXJ5IChodHRwczovL2dpdGh1Yi5jb20vY2F0Y2hvcmcvQ2F0Y2gyL3RyZWUvQ2F0Y2gxLngpIGZvciBlYXN5IHRlc3QgY3JlYXRpb24gYW5kIHVzYWdlLgorRGVjaXNpb24gdG8gdXNlIGl0IHdhcyBiZWNhdXNlIG9mIHNpbXBsaWNpdHksIGVhc3kgdXNhZ2UsIG9uZSBoZWFkZXIgZmlsZSB0byB1c2UsIHN0YWJsZSBjb21tdW5pdHkgYW5kIGdyb3dpbmcgaW50ZXJlc3QgIChodHRwczovL2NwcC5saWJodW50LmNvbS9wcm9qZWN0L2dvb2dsZXRlc3QtZ29vZ2xlL3ZzL2NhdGNoP3JlbD1jbXAtY21wKQorCitBbHNvLCBtYXliZSwgbGF0ZXIgaXQgd2lsbCBiZSBtaWdyYXRlZCB0byBDYXRjaDIgKGh0dHBzOi8vZ2l0aHViLmNvbS9waGlsc3F1YXJlZC9DYXRjaCkgLSBkZXBlbmRzIG9uIG5lZWQgdG8gc3VwcG9ydCBsZWdhY3kgY29tcGlsZXJzIChjKys5OCkKKworIyMgSG93IHRvIGFkZCB5b3VyIHRlc3RzCisKKy0gT3BlbiAqKkNNYWtlTGlzdHMudHh0KioKKy0gU2V0ICoqT24qKiB0byBjYWxsIG9mICoqVEhSSUZUX0FERF9DT01QSUxFUioqIGZvciB5b3VyIGxhbmd1YWdlCisKK2BgYCBjbWFrZSAKK1RIUklGVF9BRERfQ09NUElMRVIobmV0Y29yZSAiRW5hYmxlIGNvbXBpbGVyIGZvciAuTkVUIENvcmUiIE9OKQorYGBgCisKKy0gQ3JlYXRlIGZvbGRlciB3aXRoIG5hbWUgc3BlY2lmaWVkIGluIGxpc3Qgb2YgbGFuZ3VhZ2VzIGluICoqQ01ha2VMaXN0cy50eHQqKgorLSBDcmVhdGUgdGVzdHMgaW4gZm9sZGVyIGZvciB5b3VyIGxhbmd1YWdlICh3aXRoIGV4dGVuc2lvbnMgbGlrZSAqLmMqIC0gY2MsIGNwcCwgZXRjKQorICAtIERvbid0IGZvcmdldCB0byBhZGQgaW5jbHVkZSBvZiBjYXRjaC5ocHAgaW4geW91ciB0ZXN0IGZpbGUKKyAgYGBgIEMKKyAgI2luY2x1ZGUgIi4uL2NhdGNoL2NhdGNoLmhwcCIKKyAgYGBgCisKKy0gSWYgeW91IG5lZWQgLSBhZGQgZmlsZXMgbWFudWFsbHkgdG8gKip0aHJpZnRfY29tcGlsZXJfdGVzdHNfbWFudWFsX1NPVVJDRVMqKiBpbiAqKkNNYWtlTGlzdHMudHh0Kiogc2ltaWxhciB0byAKKworYGBgIGNtYWtlCisjIHlvdSBjYW4gYWRkIHNvbWUgZmlsZXMgbWFudWFsbHkgdGhlcmUgCitzZXQodGhyaWZ0X2NvbXBpbGVyX3Rlc3RzX21hbnVhbF9TT1VSQ0VTCisgICAgIyB0ZXN0cyBmaWxlIHRvIGF2b2lkIG1haW4gaW4gZXZlcnkgdGVzdCBmaWxlCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Rlc3RzX21haW4uY2MKKykKK2BgYAorCistIFJ1biAqKmNtYWtlKiogd2l0aCBhcmd1bWVudHMgZm9yIHlvdXIgZW52aXJvbm1lbnQgYW5kIGNvbXBpbGVyIAorLSBFbmpveQorCisjIyBCdWlsZCBhbmQgcnVuIHRlc3RzIG9uIFVuaXgtbGlrZSBzeXN0ZW1zCisKKyMjIyBQcmVyZXF1aXNpdGVzOgorLSBJbnN0YWxsIENNYWtlIC0gPGh0dHBzOi8vY21ha2Uub3JnL2Rvd25sb2FkLz4KKy0gSW5zdGFsbCB3aW5mbGV4Ymlzb24gLSA8aHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvd2luZmxleGJpc29uLz4KKworIyMjIEJ1aWxkIGFuZCBydW4gdGVzdCB3aXRoIENNYWtlCisKKy0gUnVuIGNvbW1hbmRzIGluIGNvbW1hbmQgbGluZSBpbiBjdXJyZW50IGRpcmVjdG9yeToKKworYGBgCitta2RpciBjbWFrZS12cyAmJiBjZCBjbWFrZS12cworY21ha2UgLi4KK2NtYWtlIC0tYnVpbGQgLgorY3Rlc3QgLUMgRGVidWcgLVYKK2BgYAorCisjIyBCdWlsZCBhbmQgcnVuIHRlc3RzIG9uIFdpbmRvd3MKKworIyMjIFByZXJlcXVpc2l0ZXM6CistIEluc3RhbGwgQ01ha2UgLSA8aHR0cHM6Ly9jbWFrZS5vcmcvZG93bmxvYWQvPgorLSBJbnN0YWxsIHdpbmZsZXhiaXNvbiAtIDxodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy93aW5mbGV4Ymlzb24vPgorLSBJbnN0YWxsIFZTMjAxNyBDb21tdW5pdHkgRWRpdGlvbiAtIDxodHRwczovL3d3dy52aXN1YWxzdHVkaW8uY29tL3ZzL3doYXRzbmV3Lz4gKGVuc3VyZSB0aGF0IHlvdSBpbnN0YWxsZWQgd29ya2xvYWQgIkRlc2t0b3AgRGV2ZWxvcG1lbnQgd2l0aCBDKysiIGZvciBWUzIwMTcpCisKKyMjIyBHZW5lcmF0aW9uIG9mIFZTIHByb2plY3Qgd2l0aCBDTWFrZSwgYnVpbGQgYW5kIHJ1biBvbiBXaW5kb3dzCistIFJ1biBjb21tYW5kcyBpbiBjb21tYW5kIGxpbmUgaW4gY3VycmVudCBkaXJlY3RvcnkgKGVuc3VyZSB0aGF0IFZTIGluc3RhbGxlZCk6CisKK2BgYAorbWtkaXIgY21ha2UtdnMKK2NkIGNtYWtlLXZzCitjbWFrZSAuLgorY21ha2UgLS1idWlsZCAuCitjdGVzdCAtQyBEZWJ1ZyAtVgorYGBgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL2NhdGNoL2NhdGNoLmhwcCBiL2NvbXBpbGVyL2NwcC90ZXN0cy9jYXRjaC9jYXRjaC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkMDM3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9jYXRjaC9jYXRjaC5ocHAKQEAgLTAsMCArMSwxMTUwOCBAQAorLyoKKyAqICBDYXRjaCB2MS45LjQKKyAqICBHZW5lcmF0ZWQ6IDIwMTctMDUtMTYgMTM6NTE6NTUuNTA2NTE5CisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFRoaXMgZmlsZSBoYXMgYmVlbiBtZXJnZWQgZnJvbSBtdWx0aXBsZSBoZWFkZXJzLiBQbGVhc2UgZG9uJ3QgZWRpdCBpdCBkaXJlY3RseQorICogIENvcHlyaWdodCAoYykgMjAxMiBUd28gQmx1ZSBDdWJlcyBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKKyAqICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAqLworI2lmbmRlZiBUV09CTFVFQ1VCRVNfU0lOR0xFX0lOQ0xVREVfQ0FUQ0hfSFBQX0lOQ0xVREVECisjZGVmaW5lIFRXT0JMVUVDVUJFU19TSU5HTEVfSU5DTFVERV9DQVRDSF9IUFBfSU5DTFVERUQKKworI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSFBQX0lOQ0xVREVECisKKyNpZmRlZiBfX2NsYW5nX18KKyMgICAgcHJhZ21hIGNsYW5nIHN5c3RlbV9oZWFkZXIKKyNlbGlmIGRlZmluZWQgX19HTlVDX18KKyMgICAgcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX3N1cHByZXNzX3dhcm5pbmdzLmgKKworI2lmZGVmIF9fY2xhbmdfXworIyAgIGlmZGVmIF9fSUNDIC8vIGljcGMgZGVmaW5lcyB0aGUgX19jbGFuZ19fIG1hY3JvCisjICAgICAgIHByYWdtYSB3YXJuaW5nKHB1c2gpCisjICAgICAgIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDE2MSAxNjgyKQorIyAgIGVsc2UgLy8gX19JQ0MKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdnbG9iYWwtY29uc3RydWN0b3JzIgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3ZhcmlhZGljLW1hY3JvcyIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjOTktZXh0ZW5zaW9ucyIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtdmFyaWFibGUiCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYWRkZWQiCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrOTgtY29tcGF0IgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2MrKzk4LWNvbXBhdC1wZWRhbnRpYyIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdzd2l0Y2gtZW51bSIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjb3ZlcmVkLXN3aXRjaC1kZWZhdWx0IgorIyAgICBlbmRpZgorI2VsaWYgZGVmaW5lZCBfX0dOVUNfXworIyAgICBwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd2YXJpYWRpYy1tYWNyb3MiCisjICAgIHByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC12YXJpYWJsZSIKKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFyZW50aGVzZXMiCisKKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFkZGVkIgorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfTUFJTikgfHwgZGVmaW5lZChDQVRDSF9DT05GSUdfUlVOTkVSKQorIyAgZGVmaW5lIENBVENIX0lNUEwKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfSU1QTAorIyAgaWZuZGVmIENMQVJBX0NPTkZJR19NQUlOCisjICAgIGRlZmluZSBDTEFSQV9DT05GSUdfTUFJTl9OT1RfREVGSU5FRAorIyAgICBkZWZpbmUgQ0xBUkFfQ09ORklHX01BSU4KKyMgIGVuZGlmCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX25vdGltcGxlbWVudGVkX2V4Y2VwdGlvbi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9OT1RJTVBMRU1FTlRFRF9FWENFUFRJT05fSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29tbW9uLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTU1PTl9IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jb21waWxlcl9jYXBhYmlsaXRpZXMuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09NUElMRVJfQ0FQQUJJTElUSUVTX0hQUF9JTkNMVURFRAorCisvLyBEZXRlY3QgYSBudW1iZXIgb2YgY29tcGlsZXIgZmVhdHVyZXMgLSBtb3N0bHkgQysrMTEvMTQgY29uZm9ybWFuY2UgLSBieSBjb21waWxlcgorLy8gVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgZGVmaW5lZDoKKy8vCisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUiA6IGlzIG51bGxwdHIgc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX05PRVhDRVBUIDogaXMgbm9leGNlcHQgc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTIDogVGhlIGRlbGV0ZSBhbmQgZGVmYXVsdCBrZXl3b3JkcyBmb3IgY29tcGlsZXIgZ2VuZXJhdGVkIG1ldGhvZHMKKy8vIENBVENIX0NPTkZJR19DUFAxMV9JU19FTlVNIDogc3RkOjppc19lbnVtIGlzIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19DUFAxMV9UVVBMRSA6IHN0ZDo6dHVwbGUgaXMgc3VwcG9ydGVkCisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HIDogaXMgbG9uZyBsb25nIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19DUFAxMV9PVkVSUklERSA6IGlzIG92ZXJyaWRlIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSIDogaXMgdW5pcXVlX3B0ciBzdXBwb3J0ZWQgKG90aGVyd2lzZSB1c2UgYXV0b19wdHIpCisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfU0hVRkZMRSA6IGlzIHN0ZDo6c2h1ZmZsZSBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMgOiBhcmUgdHlwZV90cmFpdHMgYW5kIGVuYWJsZV9pZiBzdXBwb3J0ZWQ/CisKKy8vIENBVENIX0NPTkZJR19DUFAxMV9PUl9HUkVBVEVSIDogSXMgQysrMTEgc3VwcG9ydGVkPworCisvLyBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TIDogYXJlIHZhcmlhZGljIG1hY3JvcyBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfQ09VTlRFUiA6IGlzIHRoZSBfX0NPVU5URVJfXyBtYWNybyBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfV0lORE9XU19TRUggOiBpcyBXaW5kb3dzIFNFSCBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUyA6IGFyZSBQT1NJWCBzaWduYWxzIHN1cHBvcnRlZD8KKy8vICoqKioqKioqKioqKioqKioKKy8vIE5vdGUgdG8gbWFpbnRhaW5lcnM6IGlmIG5ldyB0b2dnbGVzIGFyZSBhZGRlZCBwbGVhc2UgZG9jdW1lbnQgdGhlbQorLy8gaW4gY29uZmlndXJhdGlvbi5tZCwgdG9vCisvLyAqKioqKioqKioqKioqKioqCisKKy8vIEluIGdlbmVyYWwgZWFjaCBtYWNybyBoYXMgYSBfTk9fPGZlYXR1cmUgbmFtZT4gZm9ybQorLy8gKGUuZy4gQ0FUQ0hfQ09ORklHX0NQUDExX05PX05VTExQVFIpIHdoaWNoIGRpc2FibGVzIHRoZSBmZWF0dXJlLgorLy8gTWFueSBmZWF0dXJlcywgYXQgcG9pbnQgb2YgZGV0ZWN0aW9uLCBkZWZpbmUgYW4gX0lOVEVSTkFMXyBtYWNybywgc28gdGhleQorLy8gY2FuIGJlIGNvbWJpbmVkLCBlbi1tYXNzLCB3aXRoIHRoZSBfTk9fIGZvcm1zIGxhdGVyLgorCisvLyBBbGwgdGhlIEMrKzExIGZlYXR1cmVzIGNhbiBiZSBkaXNhYmxlZCB3aXRoIENBVENIX0NPTkZJR19OT19DUFAxMQorCisjaWZkZWYgX19jcGx1c3BsdXMKKworIyAgaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorIyAgICBkZWZpbmUgQ0FUQ0hfQ1BQMTFfT1JfR1JFQVRFUgorIyAgZW5kaWYKKworIyAgaWYgX19jcGx1c3BsdXMgPj0gMjAxNDAyTAorIyAgICBkZWZpbmUgQ0FUQ0hfQ1BQMTRfT1JfR1JFQVRFUgorIyAgZW5kaWYKKworI2VuZGlmCisKKyNpZmRlZiBfX2NsYW5nX18KKworIyAgaWYgX19oYXNfZmVhdHVyZShjeHhfbnVsbHB0cikKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjICBlbmRpZgorCisjICBpZiBfX2hhc19mZWF0dXJlKGN4eF9ub2V4Y2VwdCkKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorIyAgZW5kaWYKKworIyAgIGlmIGRlZmluZWQoQ0FUQ0hfQ1BQMTFfT1JfR1JFQVRFUikKKyMgICAgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgICAgICBfUHJhZ21hKCAiY2xhbmcgZGlhZ25vc3RpYyBwdXNoIiApIFwKKyAgICAgICAgICAgIF9QcmFnbWEoICJjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgXCItV2V4aXQtdGltZS1kZXN0cnVjdG9yc1wiIiApCisjICAgICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgICAgICBfUHJhZ21hKCAiY2xhbmcgZGlhZ25vc3RpYyBwb3AiICkKKworIyAgICAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MgXAorICAgICAgICAgICAgX1ByYWdtYSggImNsYW5nIGRpYWdub3N0aWMgcHVzaCIgKSBcCisgICAgICAgICAgICBfUHJhZ21hKCAiY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdwYXJlbnRoZXNlc1wiIiApCisjICAgICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTIFwKKyAgICAgICAgICAgIF9QcmFnbWEoICJjbGFuZyBkaWFnbm9zdGljIHBvcCIgKQorIyAgIGVuZGlmCisKKyNlbmRpZiAvLyBfX2NsYW5nX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFdlIGtub3cgc29tZSBlbnZpcm9ubWVudHMgbm90IHRvIHN1cHBvcnQgZnVsbCBQT1NJWCBzaWduYWxzCisjaWYgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fUU5YX18pCisKKyMgICBpZiAhZGVmaW5lZChDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUykKKyMgICAgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19OT19QT1NJWF9TSUdOQUxTCisjICAgZW5kaWYKKworI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDeWd3aW4KKyNpZmRlZiBfX0NZR1dJTl9fCisKKy8vIFJlcXVpcmVkIGZvciBzb21lIHZlcnNpb25zIG9mIEN5Z3dpbiB0byBkZWNsYXJlIGdldHRpbWVvZmRheQorLy8gc2VlOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM2OTAxODAzL2dldHRpbWVvZmRheS1ub3QtZGVjbGFyZWQtaW4tdGhpcy1zY29wZS1jeWd3aW4KKyMgICBkZWZpbmUgX0JTRF9TT1VSQ0UKKworI2VuZGlmIC8vIF9fQ1lHV0lOX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEJvcmxhbmQKKyNpZmRlZiBfX0JPUkxBTkRDX18KKworI2VuZGlmIC8vIF9fQk9STEFORENfXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRURHCisjaWZkZWYgX19FREdfVkVSU0lPTl9fCisKKyNlbmRpZiAvLyBfX0VER19WRVJTSU9OX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERpZ2l0YWwgTWFycworI2lmZGVmIF9fRE1DX18KKworI2VuZGlmIC8vIF9fRE1DX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEdDQworI2lmZGVmIF9fR05VQ19fCisKKyMgICBpZiBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDYgJiYgZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykKKyMgICAgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjICAgZW5kaWYKKworLy8gLSBvdGhlcndpc2UgbW9yZSByZWNlbnQgdmVyc2lvbnMgZGVmaW5lIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKy8vIGFuZCB3aWxsIGdldCBwaWNrZWQgdXAgYmVsb3cKKworI2VuZGlmIC8vIF9fR05VQ19fCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBWaXN1YWwgQysrCisjaWZkZWYgX01TQ19WRVIKKworI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfV0lORE9XU19TRUgKKworI2lmIChfTVNDX1ZFUiA+PSAxNjAwKQorIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUgorI2VuZGlmCisKKyNpZiAoX01TQ19WRVIgPj0gMTkwMCApIC8vIChWQysrIDEzIChWUzIwMTUpKQorI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9TSFVGRkxFCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUworI2VuZGlmCisKKyNlbmRpZiAvLyBfTVNDX1ZFUgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBVc2UgdmFyaWFkaWMgbWFjcm9zIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGVtCisjaWYgKCBkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID4gMTQwMCAmJiAhZGVmaW5lZCBfX0VER0VfXykgfHwgXAorICAgICggZGVmaW5lZCBfX1dBVkVfXyAmJiBfX1dBVkVfSEFTX1ZBUklBRElDUyApIHx8IFwKKyAgICAoIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMyApIHx8IFwKKyAgICAoICFkZWZpbmVkIF9fY3BsdXNwbHVzICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCB8fCBfX2NwbHVzcGx1cyA+PSAyMDExMDNMICkKKworI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisKKyNlbmRpZgorCisvLyBVc2UgX19DT1VOVEVSX18gaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGl0CisjaWYgKCBkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID49IDEzMDAgKSB8fCBcCisgICAgKCBkZWZpbmVkIF9fR05VQ19fICAmJiBfX0dOVUNfXyA+PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDMgKSB8fCBcCisgICAgKCBkZWZpbmVkIF9fY2xhbmdfXyAmJiBfX2NsYW5nX21ham9yX18gPj0gMyApCisKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NPVU5URVIKKworI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDKysgbGFuZ3VhZ2UgZmVhdHVyZSBzdXBwb3J0CisKKy8vIGNhdGNoIGFsbCBzdXBwb3J0IGZvciBDKysxMQorI2lmIGRlZmluZWQoQ0FUQ0hfQ1BQMTFfT1JfR1JFQVRFUikKKworIyAgaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIpCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorIyAgZW5kaWYKKworIyAgaWZuZGVmIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjICBlbmRpZgorCisjICBpZm5kZWYgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfSVNfRU5VTQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0lTX0VOVU0KKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVFVQTEUKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UVVBMRQorIyAgZW5kaWYKKworIyAgaWZuZGVmIENBVENIX0lOVEVSTkFMX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyMgIGVuZGlmCisKKyMgIGlmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9MT05HX0xPTkcpCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCisjICBlbmRpZgorCisjICBpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUpCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUikKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjICBlbmRpZgorIyBpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfU0hVRkZMRSkKKyMgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1NIVUZGTEUKKyMgIGVuZGlmCisjIGlmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUykKKyMgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMKKyMgZW5kaWYKKworI2VuZGlmIC8vIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKworLy8gTm93IHNldCB0aGUgYWN0dWFsIGRlZmluZXMgYmFzZWQgb24gdGhlIGFib3ZlICsgYW55dGhpbmcgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fTlVMTFBUUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fTk9FWENFUFQpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fR0VORVJBVEVEX01FVEhPRFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0lTX0VOVU0pICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19JU19FTlVNKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfSVNfRU5VTSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfSVNfRU5VTQorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVFVQTEUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19UVVBMRSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX1RVUExFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9UVVBMRQorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfVkFSSUFESUNfTUFDUk9TKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fVkFSSUFESUNfTUFDUk9TKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9MT05HX0xPTkcpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19MT05HX0xPTkcpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX0xPTkdfTE9ORworI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19PVkVSUklERSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX09WRVJSSURFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9PVkVSUklERQorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX1VOSVFVRV9QVFIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjZW5kaWYKKy8vIFVzZSBvZiBfX0NPVU5URVJfXyBpcyBzdXBwcmVzc2VkIGlmIF9fSkVUQlJBSU5TX0lERV9fIGlzICNkZWZpbmVkIChtZWFuaW5nIHdlJ3JlIGJlaW5nIHBhcnNlZCBieSBhIEpldEJyYWlucyBJREUgZm9yCisvLyBhbmFseXRpY3MpIGJlY2F1c2UsIGF0IHRpbWUgb2Ygd3JpdGluZywgX19DT1VOVEVSX18gaXMgbm90IHByb3Blcmx5IGhhbmRsZWQgYnkgaXQuCisvLyBUaGlzIGRvZXMgbm90IGFmZmVjdCBjb21waWxhdGlvbgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NPVU5URVIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DT1VOVEVSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ09VTlRFUikgJiYgIWRlZmluZWQoX19KRVRCUkFJTlNfSURFX18pCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DT1VOVEVSCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9TSFVGRkxFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fU0hVRkZMRSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX1NIVUZGTEUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX1NIVUZGTEUKKyNlbmRpZgorIyBpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX1RZUEVfVFJBSVRTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMKKyMgZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19XSU5ET1dTX1NFSCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX1dJTkRPV1NfU0VIKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfV0lORE9XU19TRUgpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19XSU5ET1dTX1NFSAorI2VuZGlmCisvLyBUaGlzIGlzIHNldCBieSBkZWZhdWx0LCBiZWNhdXNlIHdlIGFzc3VtZSB0aGF0IHVuaXggY29tcGlsZXJzIGFyZSBwb3NpeC1zaWduYWwtY29tcGF0aWJsZSBieSBkZWZhdWx0LgorI2lmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19OT19QT1NJWF9TSUdOQUxTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fUE9TSVhfU0lHTkFMUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX1BPU0lYX1NJR05BTFMpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTCisjZW5kaWYKKworI2lmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTKQorIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUworIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTCisjZW5kaWYKKyNpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MpCisjICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUworIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUworI2VuZGlmCisKKy8vIG5vZXhjZXB0IHN1cHBvcnQ6CisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9FWENFUFQpICYmICFkZWZpbmVkKENBVENIX05PRVhDRVBUKQorIyAgZGVmaW5lIENBVENIX05PRVhDRVBUIG5vZXhjZXB0CisjICBkZWZpbmUgQ0FUQ0hfTk9FWENFUFRfSVMoeCkgbm9leGNlcHQoeCkKKyNlbHNlCisjICBkZWZpbmUgQ0FUQ0hfTk9FWENFUFQgdGhyb3coKQorIyAgZGVmaW5lIENBVENIX05PRVhDRVBUX0lTKHgpCisjZW5kaWYKKworLy8gbnVsbHB0ciBzdXBwb3J0CisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKKyMgICBkZWZpbmUgQ0FUQ0hfTlVMTCBudWxscHRyCisjZWxzZQorIyAgIGRlZmluZSBDQVRDSF9OVUxMIE5VTEwKKyNlbmRpZgorCisvLyBvdmVycmlkZSBzdXBwb3J0CisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX09WRVJSSURFCisjICAgZGVmaW5lIENBVENIX09WRVJSSURFIG92ZXJyaWRlCisjZWxzZQorIyAgIGRlZmluZSBDQVRDSF9PVkVSUklERQorI2VuZGlmCisKKy8vIHVuaXF1ZV9wdHIgc3VwcG9ydAorI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjICAgZGVmaW5lIENBVENIX0FVVE9fUFRSKCBUICkgc3RkOjp1bmlxdWVfcHRyPFQ+CisjZWxzZQorIyAgIGRlZmluZSBDQVRDSF9BVVRPX1BUUiggVCApIHN0ZDo6YXV0b19wdHI8VD4KKyNlbmRpZgorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FX0xJTkUyKCBuYW1lLCBsaW5lICkgbmFtZSMjbGluZQorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRV9MSU5FKCBuYW1lLCBsaW5lICkgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUVfTElORTIoIG5hbWUsIGxpbmUgKQorI2lmZGVmIENBVENIX0NPTkZJR19DT1VOVEVSCisjICBkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIG5hbWUgKSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRV9MSU5FKCBuYW1lLCBfX0NPVU5URVJfXyApCisjZWxzZQorIyAgZGVmaW5lIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBuYW1lICkgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUVfTElORSggbmFtZSwgX19MSU5FX18gKQorI2VuZGlmCisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfU1RSSU5HSUZZMiggZXhwciApICNleHByCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1NUUklOR0lGWSggZXhwciApIElOVEVSTkFMX0NBVENIX1NUUklOR0lGWTIoIGV4cHIgKQorCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgSUNvbmZpZzsKKworICAgIHN0cnVjdCBDYXNlU2Vuc2l0aXZlIHsgZW51bSBDaG9pY2UgeworICAgICAgICBZZXMsCisgICAgICAgIE5vCisgICAgfTsgfTsKKworICAgIGNsYXNzIE5vbkNvcHlhYmxlIHsKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgTm9uQ29weWFibGUoIE5vbkNvcHlhYmxlIGNvbnN0JiApICAgICAgICAgICAgICA9IGRlbGV0ZTsKKyAgICAgICAgTm9uQ29weWFibGUoIE5vbkNvcHlhYmxlICYmICkgICAgICAgICAgICAgICAgICA9IGRlbGV0ZTsKKyAgICAgICAgTm9uQ29weWFibGUmIG9wZXJhdG9yID0gKCBOb25Db3B5YWJsZSBjb25zdCYgKSA9IGRlbGV0ZTsKKyAgICAgICAgTm9uQ29weWFibGUmIG9wZXJhdG9yID0gKCBOb25Db3B5YWJsZSAmJiApICAgICA9IGRlbGV0ZTsKKyNlbHNlCisgICAgICAgIE5vbkNvcHlhYmxlKCBOb25Db3B5YWJsZSBjb25zdCYgaW5mbyApOworICAgICAgICBOb25Db3B5YWJsZSYgb3BlcmF0b3IgPSAoIE5vbkNvcHlhYmxlIGNvbnN0JiApOworI2VuZGlmCisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIE5vbkNvcHlhYmxlKCkge30KKyAgICAgICAgdmlydHVhbCB+Tm9uQ29weWFibGUoKTsKKyAgICB9OworCisgICAgY2xhc3MgU2FmZUJvb2wgeworICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiB2b2lkIChTYWZlQm9vbDo6KnR5cGUpKCkgY29uc3Q7CisKKyAgICAgICAgc3RhdGljIHR5cGUgbWFrZVNhZmUoIGJvb2wgdmFsdWUgKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUgPyAmU2FmZUJvb2w6OnRydWVWYWx1ZSA6IDA7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIHRydWVWYWx1ZSgpIGNvbnN0IHt9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbnRhaW5lclQ+CisgICAgaW5saW5lIHZvaWQgZGVsZXRlQWxsKCBDb250YWluZXJUJiBjb250YWluZXIgKSB7CisgICAgICAgIHR5cGVuYW1lIENvbnRhaW5lclQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY29udGFpbmVyLmJlZ2luKCk7CisgICAgICAgIHR5cGVuYW1lIENvbnRhaW5lclQ6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gY29udGFpbmVyLmVuZCgpOworICAgICAgICBmb3IoOyBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgICAgICBkZWxldGUgKml0OworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBc3NvY2lhdGl2ZUNvbnRhaW5lclQ+CisgICAgaW5saW5lIHZvaWQgZGVsZXRlQWxsVmFsdWVzKCBBc3NvY2lhdGl2ZUNvbnRhaW5lclQmIGNvbnRhaW5lciApIHsKKyAgICAgICAgdHlwZW5hbWUgQXNzb2NpYXRpdmVDb250YWluZXJUOjpjb25zdF9pdGVyYXRvciBpdCA9IGNvbnRhaW5lci5iZWdpbigpOworICAgICAgICB0eXBlbmFtZSBBc3NvY2lhdGl2ZUNvbnRhaW5lclQ6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gY29udGFpbmVyLmVuZCgpOworICAgICAgICBmb3IoOyBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgICAgICBkZWxldGUgaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICBib29sIHN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBzdGQ6OnN0cmluZyBjb25zdCYgcHJlZml4ICk7CisgICAgYm9vbCBzdGFydHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgY2hhciBwcmVmaXggKTsKKyAgICBib29sIGVuZHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgc3RkOjpzdHJpbmcgY29uc3QmIHN1ZmZpeCApOworICAgIGJvb2wgZW5kc1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBjaGFyIHN1ZmZpeCApOworICAgIGJvb2wgY29udGFpbnMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBzdGQ6OnN0cmluZyBjb25zdCYgaW5maXggKTsKKyAgICB2b2lkIHRvTG93ZXJJblBsYWNlKCBzdGQ6OnN0cmluZyYgcyApOworICAgIHN0ZDo6c3RyaW5nIHRvTG93ZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzICk7CisgICAgc3RkOjpzdHJpbmcgdHJpbSggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciApOworICAgIGJvb2wgcmVwbGFjZUluUGxhY2UoIHN0ZDo6c3RyaW5nJiBzdHIsIHN0ZDo6c3RyaW5nIGNvbnN0JiByZXBsYWNlVGhpcywgc3RkOjpzdHJpbmcgY29uc3QmIHdpdGhUaGlzICk7CisKKyAgICBzdHJ1Y3QgcGx1cmFsaXNlIHsKKyAgICAgICAgcGx1cmFsaXNlKCBzdGQ6OnNpemVfdCBjb3VudCwgc3RkOjpzdHJpbmcgY29uc3QmIGxhYmVsICk7CisKKyAgICAgICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBwbHVyYWxpc2UgY29uc3QmIHBsdXJhbGlzZXIgKTsKKworICAgICAgICBzdGQ6OnNpemVfdCBtX2NvdW50OworICAgICAgICBzdGQ6OnN0cmluZyBtX2xhYmVsOworICAgIH07CisKKyAgICBzdHJ1Y3QgU291cmNlTGluZUluZm8geworCisgICAgICAgIFNvdXJjZUxpbmVJbmZvKCk7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvKCBjaGFyIGNvbnN0KiBfZmlsZSwgc3RkOjpzaXplX3QgX2xpbmUgKTsKKyMgIGlmZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICBTb3VyY2VMaW5lSW5mbyhTb3VyY2VMaW5lSW5mbyBjb25zdCYgb3RoZXIpICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgU291cmNlTGluZUluZm8oIFNvdXJjZUxpbmVJbmZvICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvJiBvcGVyYXRvciA9ICggU291cmNlTGluZUluZm8gY29uc3QmICkgPSBkZWZhdWx0OworICAgICAgICBTb3VyY2VMaW5lSW5mbyYgb3BlcmF0b3IgPSAoIFNvdXJjZUxpbmVJbmZvICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisgICAgICAgIGJvb2wgZW1wdHkoKSBjb25zdDsKKyAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBvdGhlciApIGNvbnN0OworICAgICAgICBib29sIG9wZXJhdG9yIDwgKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgb3RoZXIgKSBjb25zdDsKKworICAgICAgICBjaGFyIGNvbnN0KiBmaWxlOworICAgICAgICBzdGQ6OnNpemVfdCBsaW5lOworICAgIH07CisKKyAgICBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgU291cmNlTGluZUluZm8gY29uc3QmIGluZm8gKTsKKworICAgIC8vIFRoaXMgaXMganVzdCBoZXJlIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzIHdpdGggbWFjcm8gY29uc3RhbnRzIGFuZCBib29sZWFuIGxpdGVyYWxzCisgICAgaW5saW5lIGJvb2wgaXNUcnVlKCBib29sIHZhbHVlICl7IHJldHVybiB2YWx1ZTsgfQorICAgIGlubGluZSBib29sIGFsd2F5c1RydWUoKSB7IHJldHVybiB0cnVlOyB9CisgICAgaW5saW5lIGJvb2wgYWx3YXlzRmFsc2UoKSB7IHJldHVybiBmYWxzZTsgfQorCisgICAgdm9pZCB0aHJvd0xvZ2ljRXJyb3IoIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbG9jYXRpb25JbmZvICk7CisKKyAgICB2b2lkIHNlZWRSbmcoIElDb25maWcgY29uc3QmIGNvbmZpZyApOworICAgIHVuc2lnbmVkIGludCBybmdTZWVkKCk7CisKKyAgICAvLyBVc2UgdGhpcyBpbiB2YXJpYWRpYyBzdHJlYW1pbmcgbWFjcm9zIHRvIGFsbG93CisgICAgLy8gICAgPj4gK1N0cmVhbUVuZFN0b3AKKyAgICAvLyBhcyB3ZWxsIGFzCisgICAgLy8gICAgPj4gc3R1ZmYgK1N0cmVhbUVuZFN0b3AKKyAgICBzdHJ1Y3QgU3RyZWFtRW5kU3RvcCB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG9wZXJhdG9yKygpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICAgICAgICB9CisgICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFQgY29uc3QmIG9wZXJhdG9yICsgKCBUIGNvbnN0JiB2YWx1ZSwgU3RyZWFtRW5kU3RvcCApIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KK30KKworI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyA6OkNhdGNoOjpTb3VyY2VMaW5lSW5mbyggX19GSUxFX18sIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PiggX19MSU5FX18gKSApCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0VSUk9SKCBtc2cgKSA6OkNhdGNoOjp0aHJvd0xvZ2ljRXJyb3IoIG1zZywgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKTsKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApOworICAgICAgICBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiggTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gY29uc3QmICkge30KKworICAgICAgICB2aXJ0dWFsIH5Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpIENBVENIX05PRVhDRVBUIHt9CisKKyAgICAgICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgQ0FUQ0hfTk9FWENFUFQ7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnN0cmluZyBtX3doYXQ7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIG1fbGluZUluZm87CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgQ0FUQ0hfTk9UX0lNUExFTUVOVEVEIHRocm93IENhdGNoOjpOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiggQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKQorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfY29udGV4dC5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT05URVhUX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2ludGVyZmFjZXNfZ2VuZXJhdG9ycy5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX0dFTkVSQVRPUlNfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IElHZW5lcmF0b3JJbmZvIHsKKyAgICAgICAgdmlydHVhbCB+SUdlbmVyYXRvckluZm8oKTsKKyAgICAgICAgdmlydHVhbCBib29sIG1vdmVOZXh0KCkgPSAwOworICAgICAgICB2aXJ0dWFsIHN0ZDo6c2l6ZV90IGdldEN1cnJlbnRJbmRleCgpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgc3RydWN0IElHZW5lcmF0b3JzRm9yVGVzdCB7CisgICAgICAgIHZpcnR1YWwgfklHZW5lcmF0b3JzRm9yVGVzdCgpOworCisgICAgICAgIHZpcnR1YWwgSUdlbmVyYXRvckluZm8mIGdldEdlbmVyYXRvckluZm8oIHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWxlSW5mbywgc3RkOjpzaXplX3Qgc2l6ZSApID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIG1vdmVOZXh0KCkgPSAwOworICAgIH07CisKKyAgICBJR2VuZXJhdG9yc0ZvclRlc3QqIGNyZWF0ZUdlbmVyYXRvcnNGb3JUZXN0KCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcHRyLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUFRSX0hQUF9JTkNMVURFRAorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFkZGVkIgorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICAvLyBBbiBpbnRydXNpdmUgcmVmZXJlbmNlIGNvdW50aW5nIHNtYXJ0IHBvaW50ZXIuCisgICAgLy8gVCBtdXN0IGltcGxlbWVudCBhZGRSZWYoKSBhbmQgcmVsZWFzZSgpIG1ldGhvZHMKKyAgICAvLyB0eXBpY2FsbHkgaW1wbGVtZW50aW5nIHRoZSBJU2hhcmVkIGludGVyZmFjZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgUHRyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFB0cigpIDogbV9wKCBDQVRDSF9OVUxMICl7fQorICAgICAgICBQdHIoIFQqIHAgKSA6IG1fcCggcCApeworICAgICAgICAgICAgaWYoIG1fcCApCisgICAgICAgICAgICAgICAgbV9wLT5hZGRSZWYoKTsKKyAgICAgICAgfQorICAgICAgICBQdHIoIFB0ciBjb25zdCYgb3RoZXIgKSA6IG1fcCggb3RoZXIubV9wICl7CisgICAgICAgICAgICBpZiggbV9wICkKKyAgICAgICAgICAgICAgICBtX3AtPmFkZFJlZigpOworICAgICAgICB9CisgICAgICAgIH5QdHIoKXsKKyAgICAgICAgICAgIGlmKCBtX3AgKQorICAgICAgICAgICAgICAgIG1fcC0+cmVsZWFzZSgpOworICAgICAgICB9CisgICAgICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBpZiggbV9wICkKKyAgICAgICAgICAgICAgICBtX3AtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1fcCA9IENBVENIX05VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHRyJiBvcGVyYXRvciA9ICggVCogcCApeworICAgICAgICAgICAgUHRyIHRlbXAoIHAgKTsKKyAgICAgICAgICAgIHN3YXAoIHRlbXAgKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICBQdHImIG9wZXJhdG9yID0gKCBQdHIgY29uc3QmIG90aGVyICl7CisgICAgICAgICAgICBQdHIgdGVtcCggb3RoZXIgKTsKKyAgICAgICAgICAgIHN3YXAoIHRlbXAgKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHN3YXAoIFB0ciYgb3RoZXIgKSB7IHN0ZDo6c3dhcCggbV9wLCBvdGhlci5tX3AgKTsgfQorICAgICAgICBUKiBnZXQoKSBjb25zdHsgcmV0dXJuIG1fcDsgfQorICAgICAgICBUJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqbV9wOyB9CisgICAgICAgIFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBtX3A7IH0KKyAgICAgICAgYm9vbCBvcGVyYXRvciAhKCkgY29uc3QgeyByZXR1cm4gbV9wID09IENBVENIX05VTEw7IH0KKyAgICAgICAgb3BlcmF0b3IgU2FmZUJvb2w6OnR5cGUoKSBjb25zdCB7IHJldHVybiBTYWZlQm9vbDo6bWFrZVNhZmUoIG1fcCAhPSBDQVRDSF9OVUxMICk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFQqIG1fcDsKKyAgICB9OworCisgICAgc3RydWN0IElTaGFyZWQgOiBOb25Db3B5YWJsZSB7CisgICAgICAgIHZpcnR1YWwgfklTaGFyZWQoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGFkZFJlZigpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQgPSBJU2hhcmVkPgorICAgIHN0cnVjdCBTaGFyZWRJbXBsIDogVCB7CisKKyAgICAgICAgU2hhcmVkSW1wbCgpIDogbV9yYyggMCApe30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYWRkUmVmKCkgY29uc3QgeworICAgICAgICAgICAgKyttX3JjOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgY29uc3QgeworICAgICAgICAgICAgaWYoIC0tbV9yYyA9PSAwICkKKyAgICAgICAgICAgICAgICBkZWxldGUgdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIG11dGFibGUgdW5zaWduZWQgaW50IG1fcmM7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGVzdENhc2U7CisgICAgY2xhc3MgU3RyZWFtOworICAgIHN0cnVjdCBJUmVzdWx0Q2FwdHVyZTsKKyAgICBzdHJ1Y3QgSVJ1bm5lcjsKKyAgICBzdHJ1Y3QgSUdlbmVyYXRvcnNGb3JUZXN0OworICAgIHN0cnVjdCBJQ29uZmlnOworCisgICAgc3RydWN0IElDb250ZXh0CisgICAgeworICAgICAgICB2aXJ0dWFsIH5JQ29udGV4dCgpOworCisgICAgICAgIHZpcnR1YWwgSVJlc3VsdENhcHR1cmUqIGdldFJlc3VsdENhcHR1cmUoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgSVJ1bm5lciogZ2V0UnVubmVyKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHNpemVfdCBnZXRHZW5lcmF0b3JJbmRleCggc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVJbmZvLCBzaXplX3QgdG90YWxTaXplICkgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgYWR2YW5jZUdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpID0gMDsKKyAgICAgICAgdmlydHVhbCBQdHI8SUNvbmZpZyBjb25zdD4gZ2V0Q29uZmlnKCkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBzdHJ1Y3QgSU11dGFibGVDb250ZXh0IDogSUNvbnRleHQKKyAgICB7CisgICAgICAgIHZpcnR1YWwgfklNdXRhYmxlQ29udGV4dCgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UmVzdWx0Q2FwdHVyZSggSVJlc3VsdENhcHR1cmUqIHJlc3VsdENhcHR1cmUgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRSdW5uZXIoIElSdW5uZXIqIHJ1bm5lciApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldENvbmZpZyggUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBjb25maWcgKSA9IDA7CisgICAgfTsKKworICAgIElDb250ZXh0JiBnZXRDdXJyZW50Q29udGV4dCgpOworICAgIElNdXRhYmxlQ29udGV4dCYgZ2V0Q3VycmVudE11dGFibGVDb250ZXh0KCk7CisgICAgdm9pZCBjbGVhblVwQ29udGV4dCgpOworICAgIFN0cmVhbSBjcmVhdGVTdHJlYW0oIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHJlYW1OYW1lICk7CisKK30KKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX3Rlc3RfcmVnaXN0cnkuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9URVNUX1JFR0lTVFJZX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfaW50ZXJmYWNlc190ZXN0Y2FzZS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX1RFU1RDQVNFX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFRlc3RTcGVjOworCisgICAgc3RydWN0IElUZXN0Q2FzZSA6IElTaGFyZWQgeworICAgICAgICB2aXJ0dWFsIHZvaWQgaW52b2tlICgpIGNvbnN0ID0gMDsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHZpcnR1YWwgfklUZXN0Q2FzZSgpOworICAgIH07CisKKyAgICBjbGFzcyBUZXN0Q2FzZTsKKyAgICBzdHJ1Y3QgSUNvbmZpZzsKKworICAgIHN0cnVjdCBJVGVzdENhc2VSZWdpc3RyeSB7CisgICAgICAgIHZpcnR1YWwgfklUZXN0Q2FzZVJlZ2lzdHJ5KCk7CisgICAgICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBnZXRBbGxUZXN0cygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFsbFRlc3RzU29ydGVkKCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIGJvb2wgbWF0Y2hUZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdENhc2UsIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYywgSUNvbmZpZyBjb25zdCYgY29uZmlnICk7CisgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGZpbHRlclRlc3RzKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIHRlc3RDYXNlcywgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjLCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKTsKKyAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFsbFRlc3RDYXNlc1NvcnRlZCggSUNvbmZpZyBjb25zdCYgY29uZmlnICk7CisKK30KKworbmFtZXNwYWNlIENhdGNoIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgQz4KK2NsYXNzIE1ldGhvZFRlc3RDYXNlIDogcHVibGljIFNoYXJlZEltcGw8SVRlc3RDYXNlPiB7CisKK3B1YmxpYzoKKyAgICBNZXRob2RUZXN0Q2FzZSggdm9pZCAoQzo6Km1ldGhvZCkoKSApIDogbV9tZXRob2QoIG1ldGhvZCApIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgaW52b2tlKCkgY29uc3QgeworICAgICAgICBDIG9iajsKKyAgICAgICAgKG9iai4qbV9tZXRob2QpKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHZpcnR1YWwgfk1ldGhvZFRlc3RDYXNlKCkge30KKworICAgIHZvaWQgKEM6OiptX21ldGhvZCkoKTsKK307CisKK3R5cGVkZWYgdm9pZCgqVGVzdEZ1bmN0aW9uKSgpOworCitzdHJ1Y3QgTmFtZUFuZERlc2MgeworICAgIE5hbWVBbmREZXNjKCBjb25zdCBjaGFyKiBfbmFtZSA9ICIiLCBjb25zdCBjaGFyKiBfZGVzY3JpcHRpb249ICIiICkKKyAgICA6IG5hbWUoIF9uYW1lICksIGRlc2NyaXB0aW9uKCBfZGVzY3JpcHRpb24gKQorICAgIHt9CisKKyAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uOworfTsKKwordm9pZCByZWdpc3RlclRlc3RDYXNlCisgICAgKCAgIElUZXN0Q2FzZSogdGVzdENhc2UsCisgICAgICAgIGNoYXIgY29uc3QqIGNsYXNzTmFtZSwKKyAgICAgICAgTmFtZUFuZERlc2MgY29uc3QmIG5hbWVBbmREZXNjLAorICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKTsKKworc3RydWN0IEF1dG9SZWcgeworCisgICAgQXV0b1JlZworICAgICAgICAoICAgVGVzdEZ1bmN0aW9uIGZ1bmN0aW9uLAorICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICAgICAgTmFtZUFuZERlc2MgY29uc3QmIG5hbWVBbmREZXNjICk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgIEF1dG9SZWcKKyAgICAgICAgKCAgIHZvaWQgKEM6OiptZXRob2QpKCksCisgICAgICAgICAgICBjaGFyIGNvbnN0KiBjbGFzc05hbWUsCisgICAgICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MsCisgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKSB7CisKKyAgICAgICAgcmVnaXN0ZXJUZXN0Q2FzZQorICAgICAgICAgICAgKCAgIG5ldyBNZXRob2RUZXN0Q2FzZTxDPiggbWV0aG9kICksCisgICAgICAgICAgICAgICAgY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgIG5hbWVBbmREZXNjLAorICAgICAgICAgICAgICAgIGxpbmVJbmZvICk7CisgICAgfQorCisgICAgfkF1dG9SZWcoKTsKKworcHJpdmF0ZToKKyAgICBBdXRvUmVnKCBBdXRvUmVnIGNvbnN0JiApOworICAgIHZvaWQgb3BlcmF0b3I9ICggQXV0b1JlZyBjb25zdCYgKTsKK307CisKK3ZvaWQgcmVnaXN0ZXJUZXN0Q2FzZUZ1bmN0aW9uCisgICAgKCAgIFRlc3RGdW5jdGlvbiBmdW5jdGlvbiwKKyAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MgKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UyKCBUZXN0TmFtZSwgLi4uICkgXAorICAgICAgICBzdGF0aWMgdm9pZCBUZXN0TmFtZSgpOyBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OkF1dG9SZWcgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGF1dG9SZWdpc3RyYXIgKSggJlRlc3ROYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBfX1ZBX0FSR1NfXyApICk7IH0gXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIHN0YXRpYyB2b2lkIFRlc3ROYW1lKCkKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCAuLi4gKSBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIF9fX19DX0FfVF9DX0hfX19fVF9FX1NfVF9fX18gKSwgX19WQV9BUkdTX18gKQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggUXVhbGlmaWVkTWV0aG9kLCAuLi4gKSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OkF1dG9SZWcgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGF1dG9SZWdpc3RyYXIgKSggJlF1YWxpZmllZE1ldGhvZCwgIiYiICNRdWFsaWZpZWRNZXRob2QsIENhdGNoOjpOYW1lQW5kRGVzYyggX19WQV9BUkdTX18gKSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKTsgfSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EMiggVGVzdE5hbWUsIENsYXNzTmFtZSwgLi4uIClcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIG5hbWVzcGFjZXsgXAorICAgICAgICAgICAgc3RydWN0IFRlc3ROYW1lIDogQ2xhc3NOYW1leyBcCisgICAgICAgICAgICAgICAgdm9pZCB0ZXN0KCk7IFwKKyAgICAgICAgICAgIH07IFwKKyAgICAgICAgICAgIENhdGNoOjpBdXRvUmVnIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBhdXRvUmVnaXN0cmFyICkgKCAmVGVzdE5hbWU6OnRlc3QsICNDbGFzc05hbWUsIENhdGNoOjpOYW1lQW5kRGVzYyggX19WQV9BUkdTX18gKSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICB2b2lkIFRlc3ROYW1lOjp0ZXN0KCkKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIENsYXNzTmFtZSwgLi4uICkgXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIF9fX19DX0FfVF9DX0hfX19fVF9FX1NfVF9fX18gKSwgQ2xhc3NOYW1lLCBfX1ZBX0FSR1NfXyApCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9URVNUQ0FTRSggRnVuY3Rpb24sIC4uLiApIFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgQ2F0Y2g6OkF1dG9SZWcoIEZ1bmN0aW9uLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBfX1ZBX0FSR1NfXyApICk7IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MKKworI2Vsc2UKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRTIoIFRlc3ROYW1lLCBOYW1lLCBEZXNjICkgXAorICAgICAgICBzdGF0aWMgdm9pZCBUZXN0TmFtZSgpOyBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OkF1dG9SZWcgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGF1dG9SZWdpc3RyYXIgKSggJlRlc3ROYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBOYW1lLCBEZXNjICkgKTsgfVwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBzdGF0aWMgdm9pZCBUZXN0TmFtZSgpCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRSggTmFtZSwgRGVzYyApIFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UyKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggX19fX0NfQV9UX0NfSF9fX19UX0VfU19UX19fXyApLCBOYW1lLCBEZXNjICkKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIFF1YWxpZmllZE1ldGhvZCwgTmFtZSwgRGVzYyApIFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgbmFtZXNwYWNleyBDYXRjaDo6QXV0b1JlZyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggYXV0b1JlZ2lzdHJhciApKCAmUXVhbGlmaWVkTWV0aG9kLCAiJiIgI1F1YWxpZmllZE1ldGhvZCwgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBOYW1lLCBEZXNjICksIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPICk7IH0gXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRDIoIFRlc3RDYXNlTmFtZSwgQ2xhc3NOYW1lLCBUZXN0TmFtZSwgRGVzYyApXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBuYW1lc3BhY2V7IFwKKyAgICAgICAgICAgIHN0cnVjdCBUZXN0Q2FzZU5hbWUgOiBDbGFzc05hbWV7IFwKKyAgICAgICAgICAgICAgICB2b2lkIHRlc3QoKTsgXAorICAgICAgICAgICAgfTsgXAorICAgICAgICAgICAgQ2F0Y2g6OkF1dG9SZWcgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGF1dG9SZWdpc3RyYXIgKSAoICZUZXN0Q2FzZU5hbWU6OnRlc3QsICNDbGFzc05hbWUsIENhdGNoOjpOYW1lQW5kRGVzYyggVGVzdE5hbWUsIERlc2MgKSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICB2b2lkIFRlc3RDYXNlTmFtZTo6dGVzdCgpCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBDbGFzc05hbWUsIFRlc3ROYW1lLCBEZXNjIClcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QyKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggX19fX0NfQV9UX0NfSF9fX19UX0VfU19UX19fXyApLCBDbGFzc05hbWUsIFRlc3ROYW1lLCBEZXNjICkKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1RFU1RDQVNFKCBGdW5jdGlvbiwgTmFtZSwgRGVzYyApIFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgQ2F0Y2g6OkF1dG9SZWcoIEZ1bmN0aW9uLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBOYW1lLCBEZXNjICkgKTsgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUworCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2NhcHR1cmUuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DQVBUVVJFX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVzdWx0X2J1aWxkZXIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVTVUxUX0JVSUxERVJfSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVzdWx0X3R5cGUuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVTVUxUX1RZUEVfSF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgLy8gUmVzdWx0V2FzOjpPZlR5cGUgZW51bQorICAgIHN0cnVjdCBSZXN1bHRXYXMgeyBlbnVtIE9mVHlwZSB7CisgICAgICAgIFVua25vd24gPSAtMSwKKyAgICAgICAgT2sgPSAwLAorICAgICAgICBJbmZvID0gMSwKKyAgICAgICAgV2FybmluZyA9IDIsCisKKyAgICAgICAgRmFpbHVyZUJpdCA9IDB4MTAsCisKKyAgICAgICAgRXhwcmVzc2lvbkZhaWxlZCA9IEZhaWx1cmVCaXQgfCAxLAorICAgICAgICBFeHBsaWNpdEZhaWx1cmUgPSBGYWlsdXJlQml0IHwgMiwKKworICAgICAgICBFeGNlcHRpb24gPSAweDEwMCB8IEZhaWx1cmVCaXQsCisKKyAgICAgICAgVGhyZXdFeGNlcHRpb24gPSBFeGNlcHRpb24gfCAxLAorICAgICAgICBEaWRudFRocm93RXhjZXB0aW9uID0gRXhjZXB0aW9uIHwgMiwKKworICAgICAgICBGYXRhbEVycm9yQ29uZGl0aW9uID0gMHgyMDAgfCBGYWlsdXJlQml0CisKKyAgICB9OyB9OworCisgICAgaW5saW5lIGJvb2wgaXNPayggUmVzdWx0V2FzOjpPZlR5cGUgcmVzdWx0VHlwZSApIHsKKyAgICAgICAgcmV0dXJuICggcmVzdWx0VHlwZSAmIFJlc3VsdFdhczo6RmFpbHVyZUJpdCApID09IDA7CisgICAgfQorICAgIGlubGluZSBib29sIGlzSnVzdEluZm8oIGludCBmbGFncyApIHsKKyAgICAgICAgcmV0dXJuIGZsYWdzID09IFJlc3VsdFdhczo6SW5mbzsKKyAgICB9CisKKyAgICAvLyBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgZW51bQorICAgIHN0cnVjdCBSZXN1bHREaXNwb3NpdGlvbiB7IGVudW0gRmxhZ3MgeworICAgICAgICBOb3JtYWwgPSAweDAxLAorCisgICAgICAgIENvbnRpbnVlT25GYWlsdXJlID0gMHgwMiwgICAvLyBGYWlsdXJlcyBmYWlsIHRlc3QsIGJ1dCBleGVjdXRpb24gY29udGludWVzCisgICAgICAgIEZhbHNlVGVzdCA9IDB4MDQsICAgICAgICAgICAvLyBQcmVmaXggZXhwcmVzc2lvbiB3aXRoICEKKyAgICAgICAgU3VwcHJlc3NGYWlsID0gMHgwOCAgICAgICAgIC8vIEZhaWx1cmVzIGFyZSByZXBvcnRlZCBidXQgZG8gbm90IGZhaWwgdGhlIHRlc3QKKyAgICB9OyB9OworCisgICAgaW5saW5lIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyBvcGVyYXRvciB8ICggUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIGxocywgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJocyApIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncz4oIHN0YXRpY19jYXN0PGludD4oIGxocyApIHwgc3RhdGljX2Nhc3Q8aW50PiggcmhzICkgKTsKKyAgICB9CisKKyAgICBpbmxpbmUgYm9vbCBzaG91bGRDb250aW51ZU9uRmFpbHVyZSggaW50IGZsYWdzICkgICAgeyByZXR1cm4gKCBmbGFncyAmIFJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSApICE9IDA7IH0KKyAgICBpbmxpbmUgYm9vbCBpc0ZhbHNlVGVzdCggaW50IGZsYWdzICkgICAgICAgICAgICAgICAgeyByZXR1cm4gKCBmbGFncyAmIFJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QgKSAhPSAwOyB9CisgICAgaW5saW5lIGJvb2wgc2hvdWxkU3VwcHJlc3NGYWlsdXJlKCBpbnQgZmxhZ3MgKSAgICAgIHsgcmV0dXJuICggZmxhZ3MgJiBSZXN1bHREaXNwb3NpdGlvbjo6U3VwcHJlc3NGYWlsICkgIT0gMDsgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2Fzc2VydGlvbnJlc3VsdC5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9BU1NFUlRJT05SRVNVTFRfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbjsKKworICAgIHN0cnVjdCBEZWNvbXBvc2VkRXhwcmVzc2lvbgorICAgIHsKKyAgICAgICAgdmlydHVhbCB+RGVjb21wb3NlZEV4cHJlc3Npb24oKSB7fQorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNCaW5hcnlFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWNvbnN0cnVjdEV4cHJlc3Npb24oIHN0ZDo6c3RyaW5nJiBkZXN0ICkgY29uc3QgPSAwOworCisgICAgICAgIC8vIE9ubHkgc2ltcGxlIGJpbmFyeSBjb21wYXJpc29ucyBjYW4gYmUgZGVjb21wb3NlZC4KKyAgICAgICAgLy8gSWYgbW9yZSBjb21wbGV4IGNoZWNrIGlzIHJlcXVpcmVkIHRoZW4gd3JhcCBzdWItZXhwcmVzc2lvbnMgaW4gcGFyZW50aGVzZXMuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgKyAoIFQgY29uc3QmICk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgLSAoIFQgY29uc3QmICk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgKiAoIFQgY29uc3QmICk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgLyAoIFQgY29uc3QmICk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgJSAoIFQgY29uc3QmICk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgJiYgKCBUIGNvbnN0JiApOworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBTVEFUSUNfQVNTRVJUX0V4cHJlc3Npb25fVG9vX0NvbXBsZXhfUGxlYXNlX1Jld3JpdGVfQXNfQmluYXJ5X0NvbXBhcmlzb24mIG9wZXJhdG9yIHx8ICggVCBjb25zdCYgKTsKKworCXByaXZhdGU6CisJCURlY29tcG9zZWRFeHByZXNzaW9uJiBvcGVyYXRvciA9IChEZWNvbXBvc2VkRXhwcmVzc2lvbiBjb25zdCYpOworICAgIH07CisKKyAgICBzdHJ1Y3QgQXNzZXJ0aW9uSW5mbworICAgIHsKKyAgICAgICAgQXNzZXJ0aW9uSW5mbygpIHt9CisgICAgICAgIEFzc2VydGlvbkluZm8oICBzdGQ6OnN0cmluZyBjb25zdCYgX21hY3JvTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2NhcHR1cmVkRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyBfcmVzdWx0RGlzcG9zaXRpb24gKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBtYWNyb05hbWU7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGxpbmVJbmZvOworICAgICAgICBzdGQ6OnN0cmluZyBjYXB0dXJlZEV4cHJlc3Npb247CisgICAgICAgIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyByZXN1bHREaXNwb3NpdGlvbjsKKyAgICB9OworCisgICAgc3RydWN0IEFzc2VydGlvblJlc3VsdERhdGEKKyAgICB7CisgICAgICAgIEFzc2VydGlvblJlc3VsdERhdGEoKSA6IGRlY29tcG9zZWRFeHByZXNzaW9uKCBDQVRDSF9OVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgcmVzdWx0VHlwZSggUmVzdWx0V2FzOjpVbmtub3duICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbmVnYXRlZCggZmFsc2UgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBwYXJlbnRoZXNpemVkKCBmYWxzZSApIHt9CisKKyAgICAgICAgdm9pZCBuZWdhdGUoIGJvb2wgcGFyZW50aGVzaXplICkgeworICAgICAgICAgICAgbmVnYXRlZCA9ICFuZWdhdGVkOworICAgICAgICAgICAgcGFyZW50aGVzaXplZCA9IHBhcmVudGhlc2l6ZTsKKyAgICAgICAgICAgIGlmKCByZXN1bHRUeXBlID09IFJlc3VsdFdhczo6T2sgKQorICAgICAgICAgICAgICAgIHJlc3VsdFR5cGUgPSBSZXN1bHRXYXM6OkV4cHJlc3Npb25GYWlsZWQ7CisgICAgICAgICAgICBlbHNlIGlmKCByZXN1bHRUeXBlID09IFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZCApCisgICAgICAgICAgICAgICAgcmVzdWx0VHlwZSA9IFJlc3VsdFdhczo6T2s7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgcmVjb25zdHJ1Y3RFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICAgICAgaWYoIGRlY29tcG9zZWRFeHByZXNzaW9uICE9IENBVENIX05VTEwgKSB7CisgICAgICAgICAgICAgICAgZGVjb21wb3NlZEV4cHJlc3Npb24tPnJlY29uc3RydWN0RXhwcmVzc2lvbiggcmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24gKTsKKyAgICAgICAgICAgICAgICBpZiggcGFyZW50aGVzaXplZCApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24uaW5zZXJ0KCAwLCAxLCAnKCcgKTsKKyAgICAgICAgICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24uYXBwZW5kKCAxLCAnKScgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIG5lZ2F0ZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHJlY29uc3RydWN0ZWRFeHByZXNzaW9uLmluc2VydCggMCwgMSwgJyEnICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlY29tcG9zZWRFeHByZXNzaW9uID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZWNvbnN0cnVjdGVkRXhwcmVzc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIG11dGFibGUgRGVjb21wb3NlZEV4cHJlc3Npb24gY29uc3QqIGRlY29tcG9zZWRFeHByZXNzaW9uOworICAgICAgICBtdXRhYmxlIHN0ZDo6c3RyaW5nIHJlY29uc3RydWN0ZWRFeHByZXNzaW9uOworICAgICAgICBzdGQ6OnN0cmluZyBtZXNzYWdlOworICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHRUeXBlOworICAgICAgICBib29sIG5lZ2F0ZWQ7CisgICAgICAgIGJvb2wgcGFyZW50aGVzaXplZDsKKyAgICB9OworCisgICAgY2xhc3MgQXNzZXJ0aW9uUmVzdWx0IHsKKyAgICBwdWJsaWM6CisgICAgICAgIEFzc2VydGlvblJlc3VsdCgpOworICAgICAgICBBc3NlcnRpb25SZXN1bHQoIEFzc2VydGlvbkluZm8gY29uc3QmIGluZm8sIEFzc2VydGlvblJlc3VsdERhdGEgY29uc3QmIGRhdGEgKTsKKyAgICAgICAgfkFzc2VydGlvblJlc3VsdCgpOworIyAgaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgICBBc3NlcnRpb25SZXN1bHQoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgKSAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0KCBBc3NlcnRpb25SZXN1bHQgJiYgKSAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgIEFzc2VydGlvblJlc3VsdCYgb3BlcmF0b3IgPSAoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgICBBc3NlcnRpb25SZXN1bHQmIG9wZXJhdG9yID0gKCBBc3NlcnRpb25SZXN1bHQgJiYgKSAgICAgPSBkZWZhdWx0OworIyAgZW5kaWYKKworICAgICAgICBib29sIGlzT2soKSBjb25zdDsKKyAgICAgICAgYm9vbCBzdWNjZWVkZWQoKSBjb25zdDsKKyAgICAgICAgUmVzdWx0V2FzOjpPZlR5cGUgZ2V0UmVzdWx0VHlwZSgpIGNvbnN0OworICAgICAgICBib29sIGhhc0V4cHJlc3Npb24oKSBjb25zdDsKKyAgICAgICAgYm9vbCBoYXNNZXNzYWdlKCkgY29uc3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIGdldEV4cHJlc3Npb24oKSBjb25zdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0RXhwcmVzc2lvbkluTWFjcm8oKSBjb25zdDsKKyAgICAgICAgYm9vbCBoYXNFeHBhbmRlZEV4cHJlc3Npb24oKSBjb25zdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCkgY29uc3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIGdldE1lc3NhZ2UoKSBjb25zdDsKKyAgICAgICAgU291cmNlTGluZUluZm8gZ2V0U291cmNlSW5mbygpIGNvbnN0OworICAgICAgICBzdGQ6OnN0cmluZyBnZXRUZXN0TWFjcm9OYW1lKCkgY29uc3Q7CisgICAgICAgIHZvaWQgZGlzY2FyZERlY29tcG9zZWRFeHByZXNzaW9uKCkgY29uc3Q7CisgICAgICAgIHZvaWQgZXhwYW5kRGVjb21wb3NlZEV4cHJlc3Npb24oKSBjb25zdDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgQXNzZXJ0aW9uSW5mbyBtX2luZm87CisgICAgICAgIEFzc2VydGlvblJlc3VsdERhdGEgbV9yZXN1bHREYXRhOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfbWF0Y2hlcnMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9NQVRDSEVSU19IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBNYXRjaGVycyB7CisgICAgbmFtZXNwYWNlIEltcGwgeworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1Q+IHN0cnVjdCBNYXRjaEFsbE9mOworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUPiBzdHJ1Y3QgTWF0Y2hBbnlPZjsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVD4gc3RydWN0IE1hdGNoTm90T2Y7CisKKyAgICAgICAgY2xhc3MgTWF0Y2hlclVudHlwZWRCYXNlIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoIG1fY2FjaGVkVG9TdHJpbmcuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIG1fY2FjaGVkVG9TdHJpbmcgPSBkZXNjcmliZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBtX2NhY2hlZFRvU3RyaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgICAgIHZpcnR1YWwgfk1hdGNoZXJVbnR5cGVkQmFzZSgpOworICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgICAgIG11dGFibGUgc3RkOjpzdHJpbmcgbV9jYWNoZWRUb1N0cmluZzsKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIE1hdGNoZXJVbnR5cGVkQmFzZSYgb3BlcmF0b3IgPSAoIE1hdGNoZXJVbnR5cGVkQmFzZSBjb25zdCYgKTsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPYmplY3RUPgorICAgICAgICBzdHJ1Y3QgTWF0Y2hlck1ldGhvZCB7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIE9iamVjdFQgY29uc3QmIGFyZyApIGNvbnN0ID0gMDsKKyAgICAgICAgfTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHRyVD4KKyAgICAgICAgc3RydWN0IE1hdGNoZXJNZXRob2Q8UHRyVCo+IHsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggUHRyVCogYXJnICkgY29uc3QgPSAwOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE9iamVjdFQsIHR5cGVuYW1lIENvbXBhcmF0b3JUID0gT2JqZWN0VD4KKyAgICAgICAgc3RydWN0IE1hdGNoZXJCYXNlIDogTWF0Y2hlclVudHlwZWRCYXNlLCBNYXRjaGVyTWV0aG9kPE9iamVjdFQ+IHsKKworICAgICAgICAgICAgTWF0Y2hBbGxPZjxDb21wYXJhdG9yVD4gb3BlcmF0b3IgJiYgKCBNYXRjaGVyQmFzZSBjb25zdCYgb3RoZXIgKSBjb25zdDsKKyAgICAgICAgICAgIE1hdGNoQW55T2Y8Q29tcGFyYXRvclQ+IG9wZXJhdG9yIHx8ICggTWF0Y2hlckJhc2UgY29uc3QmIG90aGVyICkgY29uc3Q7CisgICAgICAgICAgICBNYXRjaE5vdE9mPENvbXBhcmF0b3JUPiBvcGVyYXRvciAhICgpIGNvbnN0OworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1Q+CisgICAgICAgIHN0cnVjdCBNYXRjaEFsbE9mIDogTWF0Y2hlckJhc2U8QXJnVD4geworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBBcmdUIGNvbnN0JiBhcmcgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG1fbWF0Y2hlcnMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghbV9tYXRjaGVyc1tpXS0+bWF0Y2goYXJnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLnJlc2VydmUoIDQgKyBtX21hdGNoZXJzLnNpemUoKSozMiApOworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICIoICI7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG1fbWF0Y2hlcnMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIiBhbmQgIjsKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gbV9tYXRjaGVyc1tpXS0+dG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIiApIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1hdGNoQWxsT2Y8QXJnVD4mIG9wZXJhdG9yICYmICggTWF0Y2hlckJhc2U8QXJnVD4gY29uc3QmIG90aGVyICkgeworICAgICAgICAgICAgICAgIG1fbWF0Y2hlcnMucHVzaF9iYWNrKCAmb3RoZXIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hdGNoZXJCYXNlPEFyZ1Q+IGNvbnN0Kj4gbV9tYXRjaGVyczsKKyAgICAgICAgfTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVD4KKyAgICAgICAgc3RydWN0IE1hdGNoQW55T2YgOiBNYXRjaGVyQmFzZTxBcmdUPiB7CisKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggQXJnVCBjb25zdCYgYXJnICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBtX21hdGNoZXJzLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgICAgICAgICBpZiAobV9tYXRjaGVyc1tpXS0+bWF0Y2goYXJnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLnJlc2VydmUoIDQgKyBtX21hdGNoZXJzLnNpemUoKSozMiApOworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICIoICI7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG1fbWF0Y2hlcnMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIiBvciAiOworICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSBtX21hdGNoZXJzW2ldLT50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiICkiOworICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWF0Y2hBbnlPZjxBcmdUPiYgb3BlcmF0b3IgfHwgKCBNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICAgICAgbV9tYXRjaGVycy5wdXNoX2JhY2soICZvdGhlciApOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWF0Y2hlckJhc2U8QXJnVD4gY29uc3QqPiBtX21hdGNoZXJzOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1Q+CisgICAgICAgIHN0cnVjdCBNYXRjaE5vdE9mIDogTWF0Y2hlckJhc2U8QXJnVD4geworCisgICAgICAgICAgICBNYXRjaE5vdE9mKCBNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCYgdW5kZXJseWluZ01hdGNoZXIgKSA6IG1fdW5kZXJseWluZ01hdGNoZXIoIHVuZGVybHlpbmdNYXRjaGVyICkge30KKworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBBcmdUIGNvbnN0JiBhcmcgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICFtX3VuZGVybHlpbmdNYXRjaGVyLm1hdGNoKCBhcmcgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIm5vdCAiICsgbV91bmRlcmx5aW5nTWF0Y2hlci50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWF0Y2hlckJhc2U8QXJnVD4gY29uc3QmIG1fdW5kZXJseWluZ01hdGNoZXI7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgT2JqZWN0VCwgdHlwZW5hbWUgQ29tcGFyYXRvclQ+CisgICAgICAgIE1hdGNoQWxsT2Y8Q29tcGFyYXRvclQ+IE1hdGNoZXJCYXNlPE9iamVjdFQsIENvbXBhcmF0b3JUPjo6b3BlcmF0b3IgJiYgKCBNYXRjaGVyQmFzZSBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gTWF0Y2hBbGxPZjxDb21wYXJhdG9yVD4oKSAmJiAqdGhpcyAmJiBvdGhlcjsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPYmplY3RULCB0eXBlbmFtZSBDb21wYXJhdG9yVD4KKyAgICAgICAgTWF0Y2hBbnlPZjxDb21wYXJhdG9yVD4gTWF0Y2hlckJhc2U8T2JqZWN0VCwgQ29tcGFyYXRvclQ+OjpvcGVyYXRvciB8fCAoIE1hdGNoZXJCYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBNYXRjaEFueU9mPENvbXBhcmF0b3JUPigpIHx8ICp0aGlzIHx8IG90aGVyOworICAgICAgICB9CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE9iamVjdFQsIHR5cGVuYW1lIENvbXBhcmF0b3JUPgorICAgICAgICBNYXRjaE5vdE9mPENvbXBhcmF0b3JUPiBNYXRjaGVyQmFzZTxPYmplY3RULCBDb21wYXJhdG9yVD46Om9wZXJhdG9yICEgKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIE1hdGNoTm90T2Y8Q29tcGFyYXRvclQ+KCAqdGhpcyApOworICAgICAgICB9CisKKyAgICB9IC8vIG5hbWVzcGFjZSBJbXBsCisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjcmVhdGUgdGhlIGFjdHVhbCBtYXRjaGVyIG9iamVjdHMuCisgICAgLy8gVGhpcyBhbGxvd3MgdGhlIHR5cGVzIHRvIGJlIGluZmVycmVkCisgICAgLy8gLSBkZXByZWNhdGVkOiBwcmVmZXIgfHwsICYmIGFuZCAhCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgSW1wbDo6TWF0Y2hOb3RPZjxUPiBOb3QoIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiB1bmRlcmx5aW5nTWF0Y2hlciApIHsKKyAgICAgICAgcmV0dXJuIEltcGw6Ok1hdGNoTm90T2Y8VD4oIHVuZGVybHlpbmdNYXRjaGVyICk7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEltcGw6Ok1hdGNoQWxsT2Y8VD4gQWxsT2YoIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMSwgSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0yICkgeworICAgICAgICByZXR1cm4gSW1wbDo6TWF0Y2hBbGxPZjxUPigpICYmIG0xICYmIG0yOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBJbXBsOjpNYXRjaEFsbE9mPFQ+IEFsbE9mKCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTEsIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMiwgSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0zICkgeworICAgICAgICByZXR1cm4gSW1wbDo6TWF0Y2hBbGxPZjxUPigpICYmIG0xICYmIG0yICYmIG0zOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBJbXBsOjpNYXRjaEFueU9mPFQ+IEFueU9mKCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTEsIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMiApIHsKKyAgICAgICAgcmV0dXJuIEltcGw6Ok1hdGNoQW55T2Y8VD4oKSB8fCBtMSB8fCBtMjsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgSW1wbDo6TWF0Y2hBbnlPZjxUPiBBbnlPZiggSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0xLCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTIsIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMyApIHsKKyAgICAgICAgcmV0dXJuIEltcGw6Ok1hdGNoQW55T2Y8VD4oKSB8fCBtMSB8fCBtMiB8fCBtMzsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIE1hdGNoZXJzCisKK3VzaW5nIG5hbWVzcGFjZSBNYXRjaGVyczsKK3VzaW5nIE1hdGNoZXJzOjpJbXBsOjpNYXRjaGVyQmFzZTsKKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBUZXN0RmFpbHVyZUV4Y2VwdGlvbnt9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgRXhwcmVzc2lvbkxoczsKKworICAgIHN0cnVjdCBDb3B5YWJsZVN0cmVhbSB7CisgICAgICAgIENvcHlhYmxlU3RyZWFtKCkge30KKyAgICAgICAgQ29weWFibGVTdHJlYW0oIENvcHlhYmxlU3RyZWFtIGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAgICAgIG9zcyA8PCBvdGhlci5vc3Muc3RyKCk7CisgICAgICAgIH0KKyAgICAgICAgQ29weWFibGVTdHJlYW0mIG9wZXJhdG9yPSggQ29weWFibGVTdHJlYW0gY29uc3QmIG90aGVyICkgeworICAgICAgICAgICAgb3NzLnN0cihzdGQ6OnN0cmluZygpKTsKKyAgICAgICAgICAgIG9zcyA8PCBvdGhlci5vc3Muc3RyKCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICB9OworCisgICAgY2xhc3MgUmVzdWx0QnVpbGRlciA6IHB1YmxpYyBEZWNvbXBvc2VkRXhwcmVzc2lvbiB7CisgICAgcHVibGljOgorICAgICAgICBSZXN1bHRCdWlsZGVyKCAgY2hhciBjb25zdCogbWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCogY2FwdHVyZWRFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJlc3VsdERpc3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCogc2Vjb25kQXJnID0gIiIgKTsKKyAgICAgICAgflJlc3VsdEJ1aWxkZXIoKTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBFeHByZXNzaW9uTGhzPFQgY29uc3QmPiBvcGVyYXRvciA8PSAoIFQgY29uc3QmIG9wZXJhbmQgKTsKKyAgICAgICAgRXhwcmVzc2lvbkxoczxib29sPiBvcGVyYXRvciA8PSAoIGJvb2wgdmFsdWUgKTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBSZXN1bHRCdWlsZGVyJiBvcGVyYXRvciA8PCAoIFQgY29uc3QmIHZhbHVlICkgeworICAgICAgICAgICAgbV9zdHJlYW0ub3NzIDw8IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgUmVzdWx0QnVpbGRlciYgc2V0UmVzdWx0VHlwZSggUmVzdWx0V2FzOjpPZlR5cGUgcmVzdWx0ICk7CisgICAgICAgIFJlc3VsdEJ1aWxkZXImIHNldFJlc3VsdFR5cGUoIGJvb2wgcmVzdWx0ICk7CisKKyAgICAgICAgdm9pZCBlbmRFeHByZXNzaW9uKCBEZWNvbXBvc2VkRXhwcmVzc2lvbiBjb25zdCYgZXhwciApOworCisgICAgICAgIHZpcnR1YWwgdm9pZCByZWNvbnN0cnVjdEV4cHJlc3Npb24oIHN0ZDo6c3RyaW5nJiBkZXN0ICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGJ1aWxkKCkgY29uc3Q7CisgICAgICAgIEFzc2VydGlvblJlc3VsdCBidWlsZCggRGVjb21wb3NlZEV4cHJlc3Npb24gY29uc3QmIGV4cHIgKSBjb25zdDsKKworICAgICAgICB2b2lkIHVzZUFjdGl2ZUV4Y2VwdGlvbiggUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJlc3VsdERpc3Bvc2l0aW9uID0gUmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCApOworICAgICAgICB2b2lkIGNhcHR1cmVSZXN1bHQoIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdFR5cGUgKTsKKyAgICAgICAgdm9pZCBjYXB0dXJlRXhwcmVzc2lvbigpOworICAgICAgICB2b2lkIGNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIGV4cGVjdGVkTWVzc2FnZSApOworICAgICAgICB2b2lkIGNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggTWF0Y2hlcnM6OkltcGw6Ok1hdGNoZXJCYXNlPHN0ZDo6c3RyaW5nPiBjb25zdCYgbWF0Y2hlciApOworICAgICAgICB2b2lkIGhhbmRsZVJlc3VsdCggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgKTsKKyAgICAgICAgdm9pZCByZWFjdCgpOworICAgICAgICBib29sIHNob3VsZERlYnVnQnJlYWsoKSBjb25zdDsKKyAgICAgICAgYm9vbCBhbGxvd1Rocm93cygpIGNvbnN0OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1QsIHR5cGVuYW1lIE1hdGNoZXJUPgorICAgICAgICB2b2lkIGNhcHR1cmVNYXRjaCggQXJnVCBjb25zdCYgYXJnLCBNYXRjaGVyVCBjb25zdCYgbWF0Y2hlciwgY2hhciBjb25zdCogbWF0Y2hlclN0cmluZyApOworCisgICAgICAgIHZvaWQgc2V0RXhjZXB0aW9uR3VhcmQoKTsKKyAgICAgICAgdm9pZCB1bnNldEV4Y2VwdGlvbkd1YXJkKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBBc3NlcnRpb25JbmZvIG1fYXNzZXJ0aW9uSW5mbzsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSBtX2RhdGE7CisgICAgICAgIENvcHlhYmxlU3RyZWFtIG1fc3RyZWFtOworCisgICAgICAgIGJvb2wgbV9zaG91bGREZWJ1Z0JyZWFrOworICAgICAgICBib29sIG1fc2hvdWxkVGhyb3c7CisgICAgICAgIGJvb2wgbV9ndWFyZEV4Y2VwdGlvbjsKKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisvLyBJbmNsdWRlIGFmdGVyIGR1ZSB0byBjaXJjdWxhciBkZXBlbmRlbmN5OgorLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2V4cHJlc3Npb25fbGhzLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfRVhQUkVTU0lPTl9MSFNfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9ldmFsdWF0ZS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0VWQUxVQVRFX0hQUF9JTkNMVURFRAorCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyhwdXNoKQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDM4OSkgLy8gJz09JyA6IHNpZ25lZC91bnNpZ25lZCBtaXNtYXRjaAorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDMxMikgLy8gQ29udmVydGluZyBpbnQgdG8gVCogdXNpbmcgcmVpbnRlcnByZXRfY2FzdCAoaXNzdWUgb24geDY0IHBsYXRmb3JtKQorI2VuZGlmCisKKyNpbmNsdWRlIDxjc3RkZGVmPgorCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIEludGVybmFsIHsKKworICAgIGVudW0gT3BlcmF0b3IgeworICAgICAgICBJc0VxdWFsVG8sCisgICAgICAgIElzTm90RXF1YWxUbywKKyAgICAgICAgSXNMZXNzVGhhbiwKKyAgICAgICAgSXNHcmVhdGVyVGhhbiwKKyAgICAgICAgSXNMZXNzVGhhbk9yRXF1YWxUbywKKyAgICAgICAgSXNHcmVhdGVyVGhhbk9yRXF1YWxUbworICAgIH07CisKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzICAgICAgICAgICAgIHsgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKXsgcmV0dXJuICIqZXJyb3IqIjsgfSB9OworICAgIHRlbXBsYXRlPD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzPElzRXF1YWxUbz4gICAgICAgICAgICAgeyBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpeyByZXR1cm4gIj09IjsgfSB9OworICAgIHRlbXBsYXRlPD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzPElzTm90RXF1YWxUbz4gICAgICAgICAgeyBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpeyByZXR1cm4gIiE9IjsgfSB9OworICAgIHRlbXBsYXRlPD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzPElzTGVzc1RoYW4+ICAgICAgICAgICAgeyBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpeyByZXR1cm4gIjwiOyB9IH07CisgICAgdGVtcGxhdGU8PiBzdHJ1Y3QgT3BlcmF0b3JUcmFpdHM8SXNHcmVhdGVyVGhhbj4gICAgICAgICB7IHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCl7IHJldHVybiAiPiI7IH0gfTsKKyAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBPcGVyYXRvclRyYWl0czxJc0xlc3NUaGFuT3JFcXVhbFRvPiAgIHsgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKXsgcmV0dXJuICI8PSI7IH0gfTsKKyAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBPcGVyYXRvclRyYWl0czxJc0dyZWF0ZXJUaGFuT3JFcXVhbFRvPnsgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKXsgcmV0dXJuICI+PSI7IH0gfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIFQmIG9wQ2FzdChUIGNvbnN0JiB0KSB7IHJldHVybiBjb25zdF9jYXN0PFQmPih0KTsgfQorCisvLyBudWxscHRyX3Qgc3VwcG9ydCBiYXNlZCBvbiBwdWxsIHJlcXVlc3QgIzE1NCBmcm9tIEtvbnN0YW50aW4gQmF1bWFubgorI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSCisgICAgaW5saW5lIHN0ZDo6bnVsbHB0cl90IG9wQ2FzdChzdGQ6Om51bGxwdHJfdCkgeyByZXR1cm4gbnVsbHB0cjsgfQorI2VuZGlmIC8vIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSCisKKyAgICAvLyBTbyB0aGUgY29tcGFyZSBvdmVybG9hZHMgY2FuIGJlIG9wZXJhdG9yIGFnbm9zdGljIHdlIGNvbnZleSB0aGUgb3BlcmF0b3IgYXMgYSB0ZW1wbGF0ZQorICAgIC8vIGVudW0sIHdoaWNoIGlzIHVzZWQgdG8gc3BlY2lhbGlzZSBhbiBFdmFsdWF0b3IgZm9yIGRvaW5nIHRoZSBjb21wYXJpc29uLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgT3BlcmF0b3IgT3A+CisgICAgY2xhc3MgRXZhbHVhdG9ye307CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgc3RydWN0IEV2YWx1YXRvcjxUMSwgVDIsIElzRXF1YWxUbz4geworICAgICAgICBzdGF0aWMgYm9vbCBldmFsdWF0ZSggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocykgeworICAgICAgICAgICAgcmV0dXJuIGJvb2woIG9wQ2FzdCggbGhzICkgPT0gIG9wQ2FzdCggcmhzICkgKTsKKyAgICAgICAgfQorICAgIH07CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIHN0cnVjdCBFdmFsdWF0b3I8VDEsIFQyLCBJc05vdEVxdWFsVG8+IHsKKyAgICAgICAgc3RhdGljIGJvb2wgZXZhbHVhdGUoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gYm9vbCggb3BDYXN0KCBsaHMgKSAhPSBvcENhc3QoIHJocyApICk7CisgICAgICAgIH0KKyAgICB9OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBzdHJ1Y3QgRXZhbHVhdG9yPFQxLCBUMiwgSXNMZXNzVGhhbj4geworICAgICAgICBzdGF0aWMgYm9vbCBldmFsdWF0ZSggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBib29sKCBvcENhc3QoIGxocyApIDwgb3BDYXN0KCByaHMgKSApOworICAgICAgICB9CisgICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgc3RydWN0IEV2YWx1YXRvcjxUMSwgVDIsIElzR3JlYXRlclRoYW4+IHsKKyAgICAgICAgc3RhdGljIGJvb2wgZXZhbHVhdGUoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gYm9vbCggb3BDYXN0KCBsaHMgKSA+IG9wQ2FzdCggcmhzICkgKTsKKyAgICAgICAgfQorICAgIH07CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIHN0cnVjdCBFdmFsdWF0b3I8VDEsIFQyLCBJc0dyZWF0ZXJUaGFuT3JFcXVhbFRvPiB7CisgICAgICAgIHN0YXRpYyBib29sIGV2YWx1YXRlKCBUMSBjb25zdCYgbGhzLCBUMiBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGJvb2woIG9wQ2FzdCggbGhzICkgPj0gb3BDYXN0KCByaHMgKSApOworICAgICAgICB9CisgICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgc3RydWN0IEV2YWx1YXRvcjxUMSwgVDIsIElzTGVzc1RoYW5PckVxdWFsVG8+IHsKKyAgICAgICAgc3RhdGljIGJvb2wgZXZhbHVhdGUoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gYm9vbCggb3BDYXN0KCBsaHMgKSA8PSBvcENhc3QoIHJocyApICk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBib29sIGFwcGx5RXZhbHVhdG9yKCBUMSBjb25zdCYgbGhzLCBUMiBjb25zdCYgcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQxLCBUMiwgT3A+OjpldmFsdWF0ZSggbGhzLCByaHMgKTsKKyAgICB9CisKKyAgICAvLyBUaGlzIGxldmVsIG9mIGluZGlyZWN0aW9uIGFsbG93cyB1cyB0byBzcGVjaWFsaXNlIGZvciBpbnRlZ2VyIHR5cGVzCisgICAgLy8gdG8gYXZvaWQgc2lnbmVkLyB1bnNpZ25lZCB3YXJuaW5ncworCisgICAgLy8gImJhc2UiIG92ZXJsb2FkCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBib29sIGNvbXBhcmUoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VDEsIFQyLCBPcD46OmV2YWx1YXRlKCBsaHMsIHJocyApOworICAgIH0KKworICAgIC8vIHVuc2lnbmVkIFggdG8gaW50CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgaW50IGxocywgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggbGhzLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCByaHMgKSApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBsb25nIGxocywgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggbGhzLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCByaHMgKSApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBjaGFyIGxocywgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggbGhzLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCByaHMgKSApOworICAgIH0KKworICAgIC8vIHVuc2lnbmVkIFggdG8gbG9uZworICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGludCBsaHMsIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBsaHMsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCByaHMgKSApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBsb25nIGxocywgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIGxocywgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIHJocyApICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGNoYXIgbGhzLCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggbGhzLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggcmhzICkgKTsKKyAgICB9CisKKyAgICAvLyBpbnQgdG8gdW5zaWduZWQgWAorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGludCBsaHMsIHVuc2lnbmVkIGludCByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggaW50IGxocywgdW5zaWduZWQgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggaW50IGxocywgdW5zaWduZWQgY2hhciByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIGxocyApLCByaHMgKTsKKyAgICB9CisKKyAgICAvLyBsb25nIHRvIHVuc2lnbmVkIFgKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxocywgdW5zaWduZWQgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggbG9uZyBsaHMsIHVuc2lnbmVkIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxocywgdW5zaWduZWQgY2hhciByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorCisgICAgLy8gcG9pbnRlciB0byBsb25nICh3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IE5VTEwpCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggbG9uZyBsaHMsIFQqIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUKiwgVCosIE9wPjo6ZXZhbHVhdGUoIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUPiBib29sIGNvbXBhcmUoIFQqIGxocywgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCBsaHMsIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCByaHMgKSApOworICAgIH0KKworICAgIC8vIHBvaW50ZXIgdG8gaW50ICh3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IE5VTEwpCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggaW50IGxocywgVCogcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggcmVpbnRlcnByZXRfY2FzdDxUKj4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggVCogbGhzLCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggbGhzLCByZWludGVycHJldF9jYXN0PFQqPiggcmhzICkgKTsKKyAgICB9CisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCisgICAgLy8gbG9uZyBsb25nIHRvIHVuc2lnbmVkIFgKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxvbmcgbGhzLCB1bnNpZ25lZCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxvbmcgbGhzLCB1bnNpZ25lZCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggbG9uZyBsb25nIGxocywgdW5zaWduZWQgbG9uZyBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggbG9uZyBsb25nIGxocywgdW5zaWduZWQgY2hhciByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorCisgICAgLy8gdW5zaWduZWQgbG9uZyBsb25nIHRvIFgKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBsb25nIGxvbmcgbGhzLCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDxsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBsb25nIGxvbmcgbGhzLCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8bG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgbG9uZyBsb25nIGxocywgbG9uZyBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8bG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgbG9uZyBsb25nIGxocywgY2hhciByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorCisgICAgLy8gcG9pbnRlciB0byBsb25nIGxvbmcgKHdoZW4gY29tcGFyaW5nIGFnYWluc3QgTlVMTCkKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBsb25nIGxvbmcgbGhzLCBUKiByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCByZWludGVycHJldF9jYXN0PFQqPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBUKiBsaHMsIGxvbmcgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCBsaHMsIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCByaHMgKSApOworICAgIH0KKyNlbmRpZiAvLyBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorICAgIC8vIHBvaW50ZXIgdG8gbnVsbHB0cl90ICh3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IG51bGxwdHIpCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggc3RkOjpudWxscHRyX3QsIFQqIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUKiwgVCosIE9wPjo6ZXZhbHVhdGUoIG51bGxwdHIsIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBUKiBsaHMsIHN0ZDo6bnVsbHB0cl90ICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggbGhzLCBudWxscHRyICk7CisgICAgfQorI2VuZGlmIC8vIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSCisKK30gLy8gZW5kIG9mIG5hbWVzcGFjZSBJbnRlcm5hbAorfSAvLyBlbmQgb2YgbmFtZXNwYWNlIENhdGNoCisKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdG9zdHJpbmcuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVE9TVFJJTkdfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworI2lmZGVmIF9fT0JKQ19fCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfb2JqY19hcmMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9PQkpDX0FSQ19IUFBfSU5DTFVERUQKKworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisKKyNpZmRlZiBfX2hhc19mZWF0dXJlCisjZGVmaW5lIENBVENIX0FSQ19FTkFCTEVEIF9faGFzX2ZlYXR1cmUob2JqY19hcmMpCisjZWxzZQorI2RlZmluZSBDQVRDSF9BUkNfRU5BQkxFRCAwCisjZW5kaWYKKwordm9pZCBhcmNTYWZlUmVsZWFzZSggTlNPYmplY3QqIG9iaiApOworaWQgcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIGlkIG9iaiwgU0VMIHNlbCApOworCisjaWYgIUNBVENIX0FSQ19FTkFCTEVECitpbmxpbmUgdm9pZCBhcmNTYWZlUmVsZWFzZSggTlNPYmplY3QqIG9iaiApIHsKKyAgICBbb2JqIHJlbGVhc2VdOworfQoraW5saW5lIGlkIHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBpZCBvYmosIFNFTCBzZWwgKSB7CisgICAgaWYoIFtvYmogcmVzcG9uZHNUb1NlbGVjdG9yOiBzZWxdICkKKyAgICAgICAgcmV0dXJuIFtvYmogcGVyZm9ybVNlbGVjdG9yOiBzZWxdOworICAgIHJldHVybiBuaWw7Cit9CisjZGVmaW5lIENBVENIX1VOU0FGRV9VTlJFVEFJTkVECisjZGVmaW5lIENBVENIX0FSQ19TVFJPTkcKKyNlbHNlCitpbmxpbmUgdm9pZCBhcmNTYWZlUmVsZWFzZSggTlNPYmplY3QqICl7fQoraW5saW5lIGlkIHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBpZCBvYmosIFNFTCBzZWwgKSB7CisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYXJjLXBlcmZvcm1TZWxlY3Rvci1sZWFrcyIKKyNlbmRpZgorICAgIGlmKCBbb2JqIHJlc3BvbmRzVG9TZWxlY3Rvcjogc2VsXSApCisgICAgICAgIHJldHVybiBbb2JqIHBlcmZvcm1TZWxlY3Rvcjogc2VsXTsKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorICAgIHJldHVybiBuaWw7Cit9CisjZGVmaW5lIENBVENIX1VOU0FGRV9VTlJFVEFJTkVEIF9fdW5zYWZlX3VucmV0YWluZWQKKyNkZWZpbmUgQ0FUQ0hfQVJDX1NUUk9ORyBfX3N0cm9uZworI2VuZGlmCisKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX1RVUExFCisjaW5jbHVkZSA8dHVwbGU+CisjZW5kaWYKKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9JU19FTlVNCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKworLy8gV2h5IHdlJ3JlIGhlcmUuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIFQgY29uc3QmIHZhbHVlICk7CisKKy8vIEJ1aWx0IGluIG92ZXJsb2FkcworCitzdGQ6OnN0cmluZyB0b1N0cmluZyggc3RkOjpzdHJpbmcgY29uc3QmIHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggc3RkOjp3c3RyaW5nIGNvbnN0JiB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggY2hhciogY29uc3QgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjb25zdCB3Y2hhcl90KiBjb25zdCB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHdjaGFyX3QqIGNvbnN0IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggaW50IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgbG9uZyB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGludCB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IGRvdWJsZSB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IGZsb2F0IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggYm9vbCB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNoYXIgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzaWduZWQgY2hhciB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGNoYXIgdmFsdWUgKTsKKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBsb25nIGxvbmcgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUgKTsKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6Om51bGxwdHJfdCApOworI2VuZGlmCisKKyNpZmRlZiBfX09CSkNfXworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCBOU1N0cmluZyBjb25zdCAqIGNvbnN0JiBuc3N0cmluZyApOworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCBOU1N0cmluZyAqIENBVENIX0FSQ19TVFJPTkcgY29uc3QmIG5zc3RyaW5nICk7CisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoIE5TT2JqZWN0KiBjb25zdCYgbnNPYmplY3QgKTsKKyNlbmRpZgorCituYW1lc3BhY2UgRGV0YWlsIHsKKworICAgIGV4dGVybiBjb25zdCBzdGQ6OnN0cmluZyB1bnByaW50YWJsZVN0cmluZzsKKworICNpZiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfU1RSRUFNX0lOU0VSVEFCTEVfQ0hFQ0spCisgICAgc3RydWN0IEJvcmdUeXBlIHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gQm9yZ1R5cGUoIFQgY29uc3QmICk7CisgICAgfTsKKworICAgIHN0cnVjdCBUcnVlVHlwZSB7IGNoYXIgc2l6ZXJbMV07IH07CisgICAgc3RydWN0IEZhbHNlVHlwZSB7IGNoYXIgc2l6ZXJbMl07IH07CisKKyAgICBUcnVlVHlwZSYgdGVzdFN0cmVhbWFibGUoIHN0ZDo6b3N0cmVhbSYgKTsKKyAgICBGYWxzZVR5cGUgdGVzdFN0cmVhbWFibGUoIEZhbHNlVHlwZSApOworCisgICAgRmFsc2VUeXBlIG9wZXJhdG9yPDwoIHN0ZDo6b3N0cmVhbSBjb25zdCYsIEJvcmdUeXBlIGNvbnN0JiApOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgSXNTdHJlYW1JbnNlcnRhYmxlIHsKKyAgICAgICAgc3RhdGljIHN0ZDo6b3N0cmVhbSAmczsKKyAgICAgICAgc3RhdGljIFQgIGNvbnN0JnQ7CisgICAgICAgIGVudW0geyB2YWx1ZSA9IHNpemVvZiggdGVzdFN0cmVhbWFibGUocyA8PCB0KSApID09IHNpemVvZiggVHJ1ZVR5cGUgKSB9OworICAgIH07CisjZWxzZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgSXNTdHJlYW1JbnNlcnRhYmxlIHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgU1MsIHR5cGVuYW1lIFRUPgorICAgICAgICBzdGF0aWMgYXV0byB0ZXN0KGludCkKKyAgICAgICAgLT4gZGVjbHR5cGUoIHN0ZDo6ZGVjbHZhbDxTUyY+KCkgPDwgc3RkOjpkZWNsdmFsPFRUPigpLCBzdGQ6OnRydWVfdHlwZSgpICk7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPgorICAgICAgICBzdGF0aWMgYXV0byB0ZXN0KC4uLikgLT4gc3RkOjpmYWxzZV90eXBlOworCisgICAgcHVibGljOgorICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGRlY2x0eXBlKHRlc3Q8c3RkOjpvc3RyZWFtLGNvbnN0IFQmPigwKSk6OnZhbHVlOworICAgIH07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX0lTX0VOVU0pCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwKKyAgICAgICAgICAgICBib29sIElzRW51bSA9IHN0ZDo6aXNfZW51bTxUPjo6dmFsdWUKKyAgICAgICAgICAgICA+CisgICAgc3RydWN0IEVudW1TdHJpbmdNYWtlcgorICAgIHsKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIFQgY29uc3QmICkgeyByZXR1cm4gdW5wcmludGFibGVTdHJpbmc7IH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgRW51bVN0cmluZ01ha2VyPFQsdHJ1ZT4KKyAgICB7CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBUIGNvbnN0JiB2ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDo6Q2F0Y2g6OnRvU3RyaW5nKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlPih2KQorICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9OworI2VuZGlmCisgICAgdGVtcGxhdGU8Ym9vbCBDPgorICAgIHN0cnVjdCBTdHJpbmdNYWtlckJhc2UgeworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX0lTX0VOVU0pCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBUIGNvbnN0JiB2ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEVudW1TdHJpbmdNYWtlcjxUPjo6Y29udmVydCggdiApOworICAgICAgICB9CisjZWxzZQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggVCBjb25zdCYgKSB7IHJldHVybiB1bnByaW50YWJsZVN0cmluZzsgfQorI2VuZGlmCisgICAgfTsKKworICAgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgU3RyaW5nTWFrZXJCYXNlPHRydWU+IHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIFQgY29uc3QmIF92YWx1ZSApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgX3ZhbHVlOworICAgICAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBzdGQ6OnN0cmluZyByYXdNZW1vcnlUb1N0cmluZyggY29uc3Qgdm9pZCAqb2JqZWN0LCBzdGQ6OnNpemVfdCBzaXplICk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBzdGQ6OnN0cmluZyByYXdNZW1vcnlUb1N0cmluZyggY29uc3QgVCYgb2JqZWN0ICkgeworICAgICAgcmV0dXJuIHJhd01lbW9yeVRvU3RyaW5nKCAmb2JqZWN0LCBzaXplb2Yob2JqZWN0KSApOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIERldGFpbAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IFN0cmluZ01ha2VyIDoKKyAgICBEZXRhaWw6OlN0cmluZ01ha2VyQmFzZTxEZXRhaWw6OklzU3RyZWFtSW5zZXJ0YWJsZTxUPjo6dmFsdWU+IHt9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IFN0cmluZ01ha2VyPFQqPiB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4KKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggVSogcCApIHsKKyAgICAgICAgaWYoICFwICkKKyAgICAgICAgICAgIHJldHVybiAiTlVMTCI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBEZXRhaWw6OnJhd01lbW9yeVRvU3RyaW5nKCBwICk7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQz4KK3N0cnVjdCBTdHJpbmdNYWtlcjxSIEM6Oio+IHsKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggUiBDOjoqIHAgKSB7CisgICAgICAgIGlmKCAhcCApCisgICAgICAgICAgICByZXR1cm4gIk5VTEwiOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gRGV0YWlsOjpyYXdNZW1vcnlUb1N0cmluZyggcCApOworICAgIH0KK307CisKK25hbWVzcGFjZSBEZXRhaWwgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CisgICAgc3RkOjpzdHJpbmcgcmFuZ2VUb1N0cmluZyggSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0ICk7Cit9CisKKy8vdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQWxsb2NhdG9yPgorLy9zdHJ1Y3QgU3RyaW5nTWFrZXI8c3RkOjp2ZWN0b3I8VCwgQWxsb2NhdG9yPiA+IHsKKy8vICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBzdGQ6OnZlY3RvcjxULEFsbG9jYXRvcj4gY29uc3QmIHYgKSB7CisvLyAgICAgICAgcmV0dXJuIERldGFpbDo6cmFuZ2VUb1N0cmluZyggdi5iZWdpbigpLCB2LmVuZCgpICk7CisvLyAgICB9CisvL307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFsbG9jYXRvcj4KK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6OnZlY3RvcjxULEFsbG9jYXRvcj4gY29uc3QmIHYgKSB7CisgICAgcmV0dXJuIERldGFpbDo6cmFuZ2VUb1N0cmluZyggdi5iZWdpbigpLCB2LmVuZCgpICk7Cit9CisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfVFVQTEUKKworLy8gdG9TdHJpbmcgZm9yIHR1cGxlcworbmFtZXNwYWNlIFR1cGxlRGV0YWlsIHsKKyAgdGVtcGxhdGU8CisgICAgICB0eXBlbmFtZSBUdXBsZSwKKyAgICAgIHN0ZDo6c2l6ZV90IE4gPSAwLAorICAgICAgYm9vbCA9IChOIDwgc3RkOjp0dXBsZV9zaXplPFR1cGxlPjo6dmFsdWUpCisgICAgICA+CisgIHN0cnVjdCBFbGVtZW50UHJpbnRlciB7CisgICAgICBzdGF0aWMgdm9pZCBwcmludCggY29uc3QgVHVwbGUmIHR1cGxlLCBzdGQ6Om9zdHJlYW0mIG9zICkKKyAgICAgIHsKKyAgICAgICAgICBvcyA8PCAoIE4gPyAiLCAiIDogIiAiICkKKyAgICAgICAgICAgICA8PCBDYXRjaDo6dG9TdHJpbmcoc3RkOjpnZXQ8Tj4odHVwbGUpKTsKKyAgICAgICAgICBFbGVtZW50UHJpbnRlcjxUdXBsZSxOKzE+OjpwcmludCh0dXBsZSxvcyk7CisgICAgICB9CisgIH07CisKKyAgdGVtcGxhdGU8CisgICAgICB0eXBlbmFtZSBUdXBsZSwKKyAgICAgIHN0ZDo6c2l6ZV90IE4KKyAgICAgID4KKyAgc3RydWN0IEVsZW1lbnRQcmludGVyPFR1cGxlLE4sZmFsc2U+IHsKKyAgICAgIHN0YXRpYyB2b2lkIHByaW50KCBjb25zdCBUdXBsZSYsIHN0ZDo6b3N0cmVhbSYgKSB7fQorICB9OworCit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIC4uLlR5cGVzPgorc3RydWN0IFN0cmluZ01ha2VyPHN0ZDo6dHVwbGU8VHlwZXMuLi4+PiB7CisKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggY29uc3Qgc3RkOjp0dXBsZTxUeXBlcy4uLj4mIHR1cGxlICkKKyAgICB7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgICAgb3MgPDwgJ3snOworICAgICAgICBUdXBsZURldGFpbDo6RWxlbWVudFByaW50ZXI8c3RkOjp0dXBsZTxUeXBlcy4uLj4+OjpwcmludCggdHVwbGUsIG9zICk7CisgICAgICAgIG9zIDw8ICIgfSI7CisgICAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9Cit9OworI2VuZGlmIC8vIENBVENIX0NPTkZJR19DUFAxMV9UVVBMRQorCituYW1lc3BhY2UgRGV0YWlsIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0ZDo6c3RyaW5nIG1ha2VTdHJpbmcoIFQgY29uc3QmIHZhbHVlICkgeworICAgICAgICByZXR1cm4gU3RyaW5nTWFrZXI8VD46OmNvbnZlcnQoIHZhbHVlICk7CisgICAgfQorfSAvLyBlbmQgbmFtZXNwYWNlIERldGFpbAorCisvLy8gXGJyaWVmIGNvbnZlcnRzIGFueSB0eXBlIHRvIGEgc3RyaW5nCisvLy8KKy8vLyBUaGUgZGVmYXVsdCB0ZW1wbGF0ZSBmb3J3YXJkcyBvbiB0byBvc3RyaW5nc3RyZWFtIC0gZXhjZXB0IHdoZW4gYW4KKy8vLyBvc3RyaW5nc3RyZWFtIG92ZXJsb2FkIGRvZXMgbm90IGV4aXN0IC0gaW4gd2hpY2ggY2FzZSBpdCBhdHRlbXB0cyB0byBkZXRlY3QKKy8vLyB0aGF0IGFuZCB3cml0ZXMgez99LgorLy8vIE92ZXJsb2FkIChub3Qgc3BlY2lhbGlzZSkgdGhpcyB0ZW1wbGF0ZSBmb3IgY3VzdG9tIHR5cHMgdGhhdCB5b3UgZG9uJ3Qgd2FudAorLy8vIHRvIHByb3ZpZGUgYW4gb3N0cmVhbSBvdmVybG9hZCBmb3IuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIFQgY29uc3QmIHZhbHVlICkgeworICAgIHJldHVybiBTdHJpbmdNYWtlcjxUPjo6Y29udmVydCggdmFsdWUgKTsKK30KKworICAgIG5hbWVzcGFjZSBEZXRhaWwgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CisgICAgc3RkOjpzdHJpbmcgcmFuZ2VUb1N0cmluZyggSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0ICkgeworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICBvc3MgPDwgInsgIjsKKyAgICAgICAgaWYoIGZpcnN0ICE9IGxhc3QgKSB7CisgICAgICAgICAgICBvc3MgPDwgQ2F0Y2g6OnRvU3RyaW5nKCAqZmlyc3QgKTsKKyAgICAgICAgICAgIGZvciggKytmaXJzdCA7IGZpcnN0ICE9IGxhc3QgOyArK2ZpcnN0ICkKKyAgICAgICAgICAgICAgICBvc3MgPDwgIiwgIiA8PCBDYXRjaDo6dG9TdHJpbmcoICpmaXJzdCApOworICAgICAgICB9CisgICAgICAgIG9zcyA8PCAiIH0iOworICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgIH0KK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKK25hbWVzcGFjZSBDYXRjaCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1QsIEludGVybmFsOjpPcGVyYXRvciBPcCwgdHlwZW5hbWUgUmhzVD4KK2NsYXNzIEJpbmFyeUV4cHJlc3Npb247CisKK3RlbXBsYXRlPHR5cGVuYW1lIEFyZ1QsIHR5cGVuYW1lIE1hdGNoZXJUPgorY2xhc3MgTWF0Y2hFeHByZXNzaW9uOworCisvLyBXcmFwcyB0aGUgTEhTIG9mIGFuIGV4cHJlc3Npb24gYW5kIG92ZXJsb2FkcyBjb21wYXJpc29uIG9wZXJhdG9ycworLy8gZm9yIGFsc28gY2FwdHVyaW5nIHRob3NlIGFuZCBSSFMgKGlmIGFueSkKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBFeHByZXNzaW9uTGhzIDogcHVibGljIERlY29tcG9zZWRFeHByZXNzaW9uIHsKK3B1YmxpYzoKKyAgICBFeHByZXNzaW9uTGhzKCBSZXN1bHRCdWlsZGVyJiByYiwgVCBsaHMgKSA6IG1fcmIoIHJiICksIG1fbGhzKCBsaHMgKSwgbV90cnV0aHkoZmFsc2UpIHt9CisKKyAgICBFeHByZXNzaW9uTGhzJiBvcGVyYXRvciA9ICggY29uc3QgRXhwcmVzc2lvbkxocyYgKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1Q+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNFcXVhbFRvLCBSaHNUIGNvbnN0Jj4KKyAgICBvcGVyYXRvciA9PSAoIFJoc1QgY29uc3QmIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc0VxdWFsVG8+KCByaHMgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUPgorICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzTm90RXF1YWxUbywgUmhzVCBjb25zdCY+CisgICAgb3BlcmF0b3IgIT0gKCBSaHNUIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNOb3RFcXVhbFRvPiggcmhzICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzVD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIEludGVybmFsOjpJc0xlc3NUaGFuLCBSaHNUIGNvbnN0Jj4KKyAgICBvcGVyYXRvciA8ICggUmhzVCBjb25zdCYgcmhzICkgeworICAgICAgICByZXR1cm4gY2FwdHVyZUV4cHJlc3Npb248SW50ZXJuYWw6OklzTGVzc1RoYW4+KCByaHMgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUPgorICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzR3JlYXRlclRoYW4sIFJoc1QgY29uc3QmPgorICAgIG9wZXJhdG9yID4gKCBSaHNUIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNHcmVhdGVyVGhhbj4oIHJocyApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1Q+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNMZXNzVGhhbk9yRXF1YWxUbywgUmhzVCBjb25zdCY+CisgICAgb3BlcmF0b3IgPD0gKCBSaHNUIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNMZXNzVGhhbk9yRXF1YWxUbz4oIHJocyApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1Q+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNHcmVhdGVyVGhhbk9yRXF1YWxUbywgUmhzVCBjb25zdCY+CisgICAgb3BlcmF0b3IgPj0gKCBSaHNUIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNHcmVhdGVyVGhhbk9yRXF1YWxUbz4oIHJocyApOworICAgIH0KKworICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzRXF1YWxUbywgYm9vbD4gb3BlcmF0b3IgPT0gKCBib29sIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc0VxdWFsVG8+KCByaHMgKTsKKyAgICB9CisKKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIEludGVybmFsOjpJc05vdEVxdWFsVG8sIGJvb2w+IG9wZXJhdG9yICE9ICggYm9vbCByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNOb3RFcXVhbFRvPiggcmhzICk7CisgICAgfQorCisgICAgdm9pZCBlbmRFeHByZXNzaW9uKCkgeworICAgICAgICBtX3RydXRoeSA9IG1fbGhzID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICBtX3JiCisgICAgICAgICAgICAuc2V0UmVzdWx0VHlwZSggbV90cnV0aHkgKQorICAgICAgICAgICAgLmVuZEV4cHJlc3Npb24oICp0aGlzICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHJlY29uc3RydWN0RXhwcmVzc2lvbiggc3RkOjpzdHJpbmcmIGRlc3QgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGRlc3QgPSBDYXRjaDo6dG9TdHJpbmcoIG1fdHJ1dGh5ICk7CisgICAgfQorCitwcml2YXRlOgorICAgIHRlbXBsYXRlPEludGVybmFsOjpPcGVyYXRvciBPcCwgdHlwZW5hbWUgUmhzVD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIE9wLCBSaHNUJj4gY2FwdHVyZUV4cHJlc3Npb24oIFJoc1QmIHJocyApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEJpbmFyeUV4cHJlc3Npb248VCwgT3AsIFJoc1QmPiggbV9yYiwgbV9saHMsIHJocyApOworICAgIH0KKworICAgIHRlbXBsYXRlPEludGVybmFsOjpPcGVyYXRvciBPcD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIE9wLCBib29sPiBjYXB0dXJlRXhwcmVzc2lvbiggYm9vbCByaHMgKSBjb25zdCB7CisgICAgICAgIHJldHVybiBCaW5hcnlFeHByZXNzaW9uPFQsIE9wLCBib29sPiggbV9yYiwgbV9saHMsIHJocyApOworICAgIH0KKworcHJpdmF0ZToKKyAgICBSZXN1bHRCdWlsZGVyJiBtX3JiOworICAgIFQgbV9saHM7CisgICAgYm9vbCBtX3RydXRoeTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1QsIEludGVybmFsOjpPcGVyYXRvciBPcCwgdHlwZW5hbWUgUmhzVD4KK2NsYXNzIEJpbmFyeUV4cHJlc3Npb24gOiBwdWJsaWMgRGVjb21wb3NlZEV4cHJlc3Npb24geworcHVibGljOgorICAgIEJpbmFyeUV4cHJlc3Npb24oIFJlc3VsdEJ1aWxkZXImIHJiLCBMaHNUIGxocywgUmhzVCByaHMgKQorICAgICAgICA6IG1fcmIoIHJiICksIG1fbGhzKCBsaHMgKSwgbV9yaHMoIHJocyApIHt9CisKKyAgICBCaW5hcnlFeHByZXNzaW9uJiBvcGVyYXRvciA9ICggQmluYXJ5RXhwcmVzc2lvbiYgKTsKKworICAgIHZvaWQgZW5kRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgbV9yYgorICAgICAgICAgICAgLnNldFJlc3VsdFR5cGUoIEludGVybmFsOjpjb21wYXJlPE9wPiggbV9saHMsIG1fcmhzICkgKQorICAgICAgICAgICAgLmVuZEV4cHJlc3Npb24oICp0aGlzICk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGlzQmluYXJ5RXhwcmVzc2lvbigpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHJlY29uc3RydWN0RXhwcmVzc2lvbiggc3RkOjpzdHJpbmcmIGRlc3QgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGxocyA9IENhdGNoOjp0b1N0cmluZyggbV9saHMgKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgcmhzID0gQ2F0Y2g6OnRvU3RyaW5nKCBtX3JocyApOworICAgICAgICBjaGFyIGRlbGltID0gbGhzLnNpemUoKSArIHJocy5zaXplKCkgPCA0MCAmJgorICAgICAgICAgICAgICAgICAgICAgbGhzLmZpbmQoJ1xuJykgPT0gc3RkOjpzdHJpbmc6Om5wb3MgJiYKKyAgICAgICAgICAgICAgICAgICAgIHJocy5maW5kKCdcbicpID09IHN0ZDo6c3RyaW5nOjpucG9zID8gJyAnIDogJ1xuJzsKKyAgICAgICAgZGVzdC5yZXNlcnZlKCA3ICsgbGhzLnNpemUoKSArIHJocy5zaXplKCkgKTsKKyAgICAgICAgICAgICAgICAgICAvLyAyIGZvciBzcGFjZXMgYXJvdW5kIG9wZXJhdG9yCisgICAgICAgICAgICAgICAgICAgLy8gMiBmb3Igb3BlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAvLyAyIGZvciBwYXJlbnRoZXNlcyAoY29uZGl0aW9uYWxseSBhZGRlZCBsYXRlcikKKyAgICAgICAgICAgICAgICAgICAvLyAxIGZvciBuZWdhdGlvbiAoY29uZGl0aW9uYWxseSBhZGRlZCBsYXRlcikKKyAgICAgICAgZGVzdCA9IGxoczsKKyAgICAgICAgZGVzdCArPSBkZWxpbTsKKyAgICAgICAgZGVzdCArPSBJbnRlcm5hbDo6T3BlcmF0b3JUcmFpdHM8T3A+OjpnZXROYW1lKCk7CisgICAgICAgIGRlc3QgKz0gZGVsaW07CisgICAgICAgIGRlc3QgKz0gcmhzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBSZXN1bHRCdWlsZGVyJiBtX3JiOworICAgIExoc1QgbV9saHM7CisgICAgUmhzVCBtX3JoczsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEFyZ1QsIHR5cGVuYW1lIE1hdGNoZXJUPgorY2xhc3MgTWF0Y2hFeHByZXNzaW9uIDogcHVibGljIERlY29tcG9zZWRFeHByZXNzaW9uIHsKK3B1YmxpYzoKKyAgICBNYXRjaEV4cHJlc3Npb24oIEFyZ1QgYXJnLCBNYXRjaGVyVCBtYXRjaGVyLCBjaGFyIGNvbnN0KiBtYXRjaGVyU3RyaW5nICkKKyAgICAgICAgOiBtX2FyZyggYXJnICksIG1fbWF0Y2hlciggbWF0Y2hlciApLCBtX21hdGNoZXJTdHJpbmcoIG1hdGNoZXJTdHJpbmcgKSB7fQorCisgICAgdmlydHVhbCBib29sIGlzQmluYXJ5RXhwcmVzc2lvbigpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHJlY29uc3RydWN0RXhwcmVzc2lvbiggc3RkOjpzdHJpbmcmIGRlc3QgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1hdGNoZXJBc1N0cmluZyA9IG1fbWF0Y2hlci50b1N0cmluZygpOworICAgICAgICBkZXN0ID0gQ2F0Y2g6OnRvU3RyaW5nKCBtX2FyZyApOworICAgICAgICBkZXN0ICs9ICcgJzsKKyAgICAgICAgaWYoIG1hdGNoZXJBc1N0cmluZyA9PSBEZXRhaWw6OnVucHJpbnRhYmxlU3RyaW5nICkKKyAgICAgICAgICAgIGRlc3QgKz0gbV9tYXRjaGVyU3RyaW5nOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkZXN0ICs9IG1hdGNoZXJBc1N0cmluZzsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQXJnVCBtX2FyZzsKKyAgICBNYXRjaGVyVCBtX21hdGNoZXI7CisgICAgY2hhciBjb25zdCogbV9tYXRjaGVyU3RyaW5nOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEV4cHJlc3Npb25MaHM8VCBjb25zdCY+IFJlc3VsdEJ1aWxkZXI6Om9wZXJhdG9yIDw9ICggVCBjb25zdCYgb3BlcmFuZCApIHsKKyAgICAgICAgcmV0dXJuIEV4cHJlc3Npb25MaHM8VCBjb25zdCY+KCAqdGhpcywgb3BlcmFuZCApOworICAgIH0KKworICAgIGlubGluZSBFeHByZXNzaW9uTGhzPGJvb2w+IFJlc3VsdEJ1aWxkZXI6Om9wZXJhdG9yIDw9ICggYm9vbCB2YWx1ZSApIHsKKyAgICAgICAgcmV0dXJuIEV4cHJlc3Npb25MaHM8Ym9vbD4oICp0aGlzLCB2YWx1ZSApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1QsIHR5cGVuYW1lIE1hdGNoZXJUPgorICAgIGlubGluZSB2b2lkIFJlc3VsdEJ1aWxkZXI6OmNhcHR1cmVNYXRjaCggQXJnVCBjb25zdCYgYXJnLCBNYXRjaGVyVCBjb25zdCYgbWF0Y2hlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QqIG1hdGNoZXJTdHJpbmcgKSB7CisgICAgICAgIE1hdGNoRXhwcmVzc2lvbjxBcmdUIGNvbnN0JiwgTWF0Y2hlclQgY29uc3QmPiBleHByKCBhcmcsIG1hdGNoZXIsIG1hdGNoZXJTdHJpbmcgKTsKKyAgICAgICAgc2V0UmVzdWx0VHlwZSggbWF0Y2hlci5tYXRjaCggYXJnICkgKTsKKyAgICAgICAgZW5kRXhwcmVzc2lvbiggZXhwciApOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX21lc3NhZ2UuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTUVTU0FHRV9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgTWVzc2FnZUluZm8geworICAgICAgICBNZXNzYWdlSW5mbyggICAgc3RkOjpzdHJpbmcgY29uc3QmIF9tYWNyb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0V2FzOjpPZlR5cGUgX3R5cGUgKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBtYWNyb05hbWU7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGxpbmVJbmZvOworICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSB0eXBlOworICAgICAgICBzdGQ6OnN0cmluZyBtZXNzYWdlOworICAgICAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoIE1lc3NhZ2VJbmZvIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzZXF1ZW5jZSA9PSBvdGhlci5zZXF1ZW5jZTsKKyAgICAgICAgfQorICAgICAgICBib29sIG9wZXJhdG9yIDwgKCBNZXNzYWdlSW5mbyBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc2VxdWVuY2UgPCBvdGhlci5zZXF1ZW5jZTsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIHN0YXRpYyB1bnNpZ25lZCBpbnQgZ2xvYmFsQ291bnQ7CisgICAgfTsKKworICAgIHN0cnVjdCBNZXNzYWdlQnVpbGRlciB7CisgICAgICAgIE1lc3NhZ2VCdWlsZGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgbWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0V2FzOjpPZlR5cGUgdHlwZSApCisgICAgICAgIDogbV9pbmZvKCBtYWNyb05hbWUsIGxpbmVJbmZvLCB0eXBlICkKKyAgICAgICAge30KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBNZXNzYWdlQnVpbGRlciYgb3BlcmF0b3IgPDwgKCBUIGNvbnN0JiB2YWx1ZSApIHsKKyAgICAgICAgICAgIG1fc3RyZWFtIDw8IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgTWVzc2FnZUluZm8gbV9pbmZvOworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gbV9zdHJlYW07CisgICAgfTsKKworICAgIGNsYXNzIFNjb3BlZE1lc3NhZ2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgU2NvcGVkTWVzc2FnZSggTWVzc2FnZUJ1aWxkZXIgY29uc3QmIGJ1aWxkZXIgKTsKKyAgICAgICAgU2NvcGVkTWVzc2FnZSggU2NvcGVkTWVzc2FnZSBjb25zdCYgb3RoZXIgKTsKKyAgICAgICAgflNjb3BlZE1lc3NhZ2UoKTsKKworICAgICAgICBNZXNzYWdlSW5mbyBtX2luZm87CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9pbnRlcmZhY2VzX2NhcHR1cmUuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19DQVBUVVJFX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFRlc3RDYXNlOworICAgIGNsYXNzIEFzc2VydGlvblJlc3VsdDsKKyAgICBzdHJ1Y3QgQXNzZXJ0aW9uSW5mbzsKKyAgICBzdHJ1Y3QgU2VjdGlvbkluZm87CisgICAgc3RydWN0IFNlY3Rpb25FbmRJbmZvOworICAgIHN0cnVjdCBNZXNzYWdlSW5mbzsKKyAgICBjbGFzcyBTY29wZWRNZXNzYWdlQnVpbGRlcjsKKyAgICBzdHJ1Y3QgQ291bnRzOworCisgICAgc3RydWN0IElSZXN1bHRDYXB0dXJlIHsKKworICAgICAgICB2aXJ0dWFsIH5JUmVzdWx0Q2FwdHVyZSgpOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBzZWN0aW9uU3RhcnRlZCggICAgU2VjdGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50cyYgYXNzZXJ0aW9ucyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvbkVuZEluZm8gY29uc3QmIGVuZEluZm8gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWRFYXJseSggU2VjdGlvbkVuZEluZm8gY29uc3QmIGVuZEluZm8gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBwdXNoU2NvcGVkTWVzc2FnZSggTWVzc2FnZUluZm8gY29uc3QmIG1lc3NhZ2UgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBwb3BTY29wZWRNZXNzYWdlKCBNZXNzYWdlSW5mbyBjb25zdCYgbWVzc2FnZSApID0gMDsKKworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEN1cnJlbnRUZXN0TmFtZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBjb25zdCBBc3NlcnRpb25SZXN1bHQqIGdldExhc3RSZXN1bHQoKSBjb25zdCA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGV4Y2VwdGlvbkVhcmx5UmVwb3J0ZWQoKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGhhbmRsZUZhdGFsRXJyb3JDb25kaXRpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlICkgPSAwOworICAgIH07CisKKyAgICBJUmVzdWx0Q2FwdHVyZSYgZ2V0UmVzdWx0Q2FwdHVyZSgpOworfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfZGVidWdnZXIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfREVCVUdHRVJfSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcGxhdGZvcm0uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUExBVEZPUk1fSF9JTkNMVURFRAorCisjaWYgZGVmaW5lZChfX01BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEKQorIyAgZGVmaW5lIENBVENIX1BMQVRGT1JNX01BQworI2VsaWYgIGRlZmluZWQoX19JUEhPTkVfT1NfVkVSU0lPTl9NSU5fUkVRVUlSRUQpCisjICBkZWZpbmUgQ0FUQ0hfUExBVEZPUk1fSVBIT05FCisjZWxpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fbGludXgpIHx8IGRlZmluZWQoX19saW51eF9fKQorIyAgZGVmaW5lIENBVENIX1BMQVRGT1JNX0xJTlVYCisjZWxpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykgfHwgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX01TQ19WRVIpCisjICBkZWZpbmUgQ0FUQ0hfUExBVEZPUk1fV0lORE9XUworIyAgaWYgIWRlZmluZWQoTk9NSU5NQVgpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19OT01JTk1BWCkKKyMgICAgZGVmaW5lIENBVENIX0RFRklORVNfTk9NSU5NQVgKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZChXSU4zMl9MRUFOX0FORF9NRUFOKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fV0lOMzJfTEVBTl9BTkRfTUVBTikKKyMgICAgZGVmaW5lIENBVENIX0RFRklORVNfV0lOMzJfTEVBTl9BTkRfTUVBTgorIyAgZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2h7CisKKyAgICBib29sIGlzRGVidWdnZXJBY3RpdmUoKTsKKyAgICB2b2lkIHdyaXRlVG9EZWJ1Z0NvbnNvbGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0ICk7Cit9CisKKyNpZmRlZiBDQVRDSF9QTEFURk9STV9NQUMKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBzbmlwcGV0IGJhc2VkIG9uOgorICAgIC8vIGh0dHA6Ly9jb2NvYXdpdGhsb3ZlLmNvbS8yMDA4LzAzL2JyZWFrLWludG8tZGVidWdnZXIuaHRtbAorICAgICNpZiBkZWZpbmVkKF9fcHBjNjRfXykgfHwgZGVmaW5lZChfX3BwY19fKQorICAgICAgICAjZGVmaW5lIENBVENIX1RSQVAoKSBcCisgICAgICAgICAgICAgICAgX19hc21fXygibGkgcjAsIDIwXG5zY1xubm9wXG5saSByMCwgMzdcbmxpIHI0LCAyXG5zY1xubm9wXG4iIFwKKyAgICAgICAgICAgICAgICA6IDogOiAibWVtb3J5IiwicjAiLCJyMyIsInI0IiApCisgICAgI2Vsc2UKKyAgICAgICAgI2RlZmluZSBDQVRDSF9UUkFQKCkgX19hc21fXygiaW50ICQzXG4iIDogOiApCisgICAgI2VuZGlmCisKKyNlbGlmIGRlZmluZWQoQ0FUQ0hfUExBVEZPUk1fTElOVVgpCisgICAgLy8gSWYgd2UgY2FuIHVzZSBpbmxpbmUgYXNzZW1ibGVyLCBkbyBpdCBiZWNhdXNlIHRoaXMgYWxsb3dzIHVzIHRvIGJyZWFrCisgICAgLy8gZGlyZWN0bHkgYXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBmYWlsaW5nIGNoZWNrIGluc3RlYWQgb2YgYnJlYWtpbmcgaW5zaWRlCisgICAgLy8gcmFpc2UoKSBjYWxsZWQgZnJvbSBpdCwgaS5lLiBvbmUgc3RhY2sgZnJhbWUgYmVsb3cuCisgICAgI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChkZWZpbmVkKF9faTM4NikgfHwgZGVmaW5lZChfX3g4Nl82NCkpCisgICAgICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpIGFzbSB2b2xhdGlsZSAoImludCAkMyIpCisgICAgI2Vsc2UgLy8gRmFsbCBiYWNrIHRvIHRoZSBnZW5lcmljIHdheS4KKyAgICAgICAgI2luY2x1ZGUgPHNpZ25hbC5oPgorCisgICAgICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpIHJhaXNlKFNJR1RSQVApCisgICAgI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpIF9fZGVidWdicmVhaygpCisjZWxpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQorICAgIGV4dGVybiAiQyIgX19kZWNsc3BlYyhkbGxpbXBvcnQpIHZvaWQgX19zdGRjYWxsIERlYnVnQnJlYWsoKTsKKyAgICAjZGVmaW5lIENBVENIX1RSQVAoKSBEZWJ1Z0JyZWFrKCkKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfVFJBUAorICAgICNkZWZpbmUgQ0FUQ0hfQlJFQUtfSU5UT19ERUJVR0dFUigpIGlmKCBDYXRjaDo6aXNEZWJ1Z2dlckFjdGl2ZSgpICkgeyBDQVRDSF9UUkFQKCk7IH0KKyNlbHNlCisgICAgI2RlZmluZSBDQVRDSF9CUkVBS19JTlRPX0RFQlVHR0VSKCkgQ2F0Y2g6OmFsd2F5c1RydWUoKTsKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfaW50ZXJmYWNlc19ydW5uZXIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19SVU5ORVJfSF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIGNsYXNzIFRlc3RDYXNlOworCisgICAgc3RydWN0IElSdW5uZXIgeworICAgICAgICB2aXJ0dWFsIH5JUnVubmVyKCk7CisgICAgICAgIHZpcnR1YWwgYm9vbCBhYm9ydGluZygpIGNvbnN0ID0gMDsKKyAgICB9OworfQorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFKQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gV2UgY2FuIHNwZWVkdXAgY29tcGlsYXRpb24gc2lnbmlmaWNhbnRseSBieSBicmVha2luZyBpbnRvIGRlYnVnZ2VyIGxvd2VyIGluCisvLyB0aGUgY2FsbHN0YWNrLCBiZWNhdXNlIHRoZW4gd2UgZG9uJ3QgaGF2ZSB0byBleHBhbmQgQ0FUQ0hfQlJFQUtfSU5UT19ERUJVR0dFUgorLy8gbWFjcm8gaW4gZWFjaCBhc3NlcnRpb24KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIHJlc3VsdEJ1aWxkZXIgKSBcCisgICAgcmVzdWx0QnVpbGRlci5yZWFjdCgpOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBbm90aGVyIHdheSB0byBzcGVlZC11cCBjb21waWxhdGlvbiBpcyB0byBvbWl0IGxvY2FsIHRyeS1jYXRjaCBmb3IgUkVRVUlSRSoKKy8vIG1hY3Jvcy4KKy8vIFRoaXMgY2FuIHBvdGVudGlhbGx5IGNhdXNlIGZhbHNlIG5lZ2F0aXZlLCBpZiB0aGUgdGVzdCBjb2RlIGNhdGNoZXMKKy8vIHRoZSBleGNlcHRpb24gYmVmb3JlIGl0IHByb3BhZ2F0ZXMgYmFjayB1cCB0byB0aGUgcnVubmVyLgorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUX05PX1RSWSggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgZXhwciApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgI2V4cHIsIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgX19jYXRjaFJlc3VsdC5zZXRFeGNlcHRpb25HdWFyZCgpOyBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTIFwKKyAgICAgICAgKCBfX2NhdGNoUmVzdWx0IDw9IGV4cHIgKS5lbmRFeHByZXNzaW9uKCk7IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUyBcCisgICAgICAgIF9fY2F0Y2hSZXN1bHQudW5zZXRFeGNlcHRpb25HdWFyZCgpOyBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgIH0gd2hpbGUoIENhdGNoOjppc1RydWUoIGZhbHNlICYmIHN0YXRpY19jYXN0PGJvb2w+KCAhIShleHByKSApICkgKSAvLyBleHByIGhlcmUgaXMgbmV2ZXIgZXZhbHVhdGVkIGF0IHJ1bnRpbWUgYnV0IGl0IGZvcmNlcyB0aGUgY29tcGlsZXIgdG8gZ2l2ZSBpdCBhIGxvb2sKKy8vIFRoZSBkb3VibGUgbmVnYXRpb24gc2lsZW5jZXMgTVNWQydzIEM0ODAwIHdhcm5pbmcsIHRoZSBzdGF0aWNfY2FzdCBmb3JjZXMgc2hvcnQtY2lyY3VpdCBldmFsdWF0aW9uIGlmIHRoZSB0eXBlIGhhcyBvdmVybG9hZGVkICYmLgorCisjZGVmaW5lIElOVEVSTkFMX0NIRUNLX1RIQVRfTk9fVFJZKCBtYWNyb05hbWUsIG1hdGNoZXIsIHJlc3VsdERpc3Bvc2l0aW9uLCBhcmcgKSBcCisgICAgZG8geyBcCisgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICNhcmcgIiwgIiAjbWF0Y2hlciwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICBfX2NhdGNoUmVzdWx0LnNldEV4Y2VwdGlvbkd1YXJkKCk7IFwKKyAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlTWF0Y2goIGFyZywgbWF0Y2hlciwgI21hdGNoZXIgKTsgXAorICAgICAgICBfX2NhdGNoUmVzdWx0LnVuc2V0RXhjZXB0aW9uR3VhcmQoKTsgXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICB9IHdoaWxlKCBDYXRjaDo6YWx3YXlzRmFsc2UoKSApCisKKyNlbHNlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBJbiB0aGUgZXZlbnQgb2YgYSBmYWlsdXJlIHdvcmtzIG91dCBpZiB0aGUgZGVidWdnZXIgbmVlZHMgdG8gYmUgaW52b2tlZAorLy8gYW5kL29yIGFuIGV4Y2VwdGlvbiB0aHJvd24gYW5kIHRha2VzIGFwcHJvcHJpYXRlIGFjdGlvbi4KKy8vIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBhcyBhIG1hY3JvIHNvIHRoZSBkZWJ1Z2dlciB3aWxsIHN0b3AgaW4gdGhlIHVzZXIKKy8vIHNvdXJjZSBjb2RlIHJhdGhlciB0aGFuIGluIENhdGNoIGxpYnJhcnkgY29kZQorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRUFDVCggcmVzdWx0QnVpbGRlciApIFwKKyAgICBpZiggcmVzdWx0QnVpbGRlci5zaG91bGREZWJ1Z0JyZWFrKCkgKSBDQVRDSF9CUkVBS19JTlRPX0RFQlVHR0VSKCk7IFwKKyAgICByZXN1bHRCdWlsZGVyLnJlYWN0KCk7CisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICkgXAorICAgIGRvIHsgXAorICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjZXhwciwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICB0cnkgeyBcCisgICAgICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUyBcCisgICAgICAgICAgICAoIF9fY2F0Y2hSZXN1bHQgPD0gZXhwciApLmVuZEV4cHJlc3Npb24oKTsgXAorICAgICAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUyBcCisgICAgICAgIH0gXAorICAgICAgICBjYXRjaCggLi4uICkgeyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LnVzZUFjdGl2ZUV4Y2VwdGlvbiggcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgfSB3aGlsZSggQ2F0Y2g6OmlzVHJ1ZSggZmFsc2UgJiYgc3RhdGljX2Nhc3Q8Ym9vbD4oICEhKGV4cHIpICkgKSApIC8vIGV4cHIgaGVyZSBpcyBuZXZlciBldmFsdWF0ZWQgYXQgcnVudGltZSBidXQgaXQgZm9yY2VzIHRoZSBjb21waWxlciB0byBnaXZlIGl0IGEgbG9vaworICAgIC8vIFRoZSBkb3VibGUgbmVnYXRpb24gc2lsZW5jZXMgTVNWQydzIEM0ODAwIHdhcm5pbmcsIHRoZSBzdGF0aWNfY2FzdCBmb3JjZXMgc2hvcnQtY2lyY3VpdCBldmFsdWF0aW9uIGlmIHRoZSB0eXBlIGhhcyBvdmVybG9hZGVkICYmLgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0lGKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICkgXAorICAgIElOVEVSTkFMX0NBVENIX1RFU1QoIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKTsgXAorICAgIGlmKCBDYXRjaDo6Z2V0UmVzdWx0Q2FwdHVyZSgpLmdldExhc3RSZXN1bHQoKS0+c3VjY2VlZGVkKCkgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0VMU0UoIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKSBcCisgICAgSU5URVJOQUxfQ0FUQ0hfVEVTVCggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgZXhwciApOyBcCisgICAgaWYoICFDYXRjaDo6Z2V0UmVzdWx0Q2FwdHVyZSgpLmdldExhc3RSZXN1bHQoKS0+c3VjY2VlZGVkKCkgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX05PX1RIUk9XKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICkgXAorICAgIGRvIHsgXAorICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjZXhwciwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICB0cnkgeyBcCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkPihleHByKTsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBDYXRjaDo6UmVzdWx0V2FzOjpPayApOyBcCisgICAgICAgIH0gXAorICAgICAgICBjYXRjaCggLi4uICkgeyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LnVzZUFjdGl2ZUV4Y2VwdGlvbiggcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgfSB3aGlsZSggQ2F0Y2g6OmFsd2F5c0ZhbHNlKCkgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RIUk9XUyggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgbWF0Y2hlciwgZXhwciApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgI2V4cHIsIHJlc3VsdERpc3Bvc2l0aW9uLCAjbWF0Y2hlciApOyBcCisgICAgICAgIGlmKCBfX2NhdGNoUmVzdWx0LmFsbG93VGhyb3dzKCkgKSBcCisgICAgICAgICAgICB0cnkgeyBcCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZD4oZXhwcik7IFwKKyAgICAgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVSZXN1bHQoIENhdGNoOjpSZXN1bHRXYXM6OkRpZG50VGhyb3dFeGNlcHRpb24gKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBjYXRjaCggLi4uICkgeyBcCisgICAgICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlRXhwZWN0ZWRFeGNlcHRpb24oIG1hdGNoZXIgKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBDYXRjaDo6UmVzdWx0V2FzOjpPayApOyBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgIH0gd2hpbGUoIENhdGNoOjphbHdheXNGYWxzZSgpICkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9USFJPV1NfQVMoIG1hY3JvTmFtZSwgZXhjZXB0aW9uVHlwZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKSBcCisgICAgZG8geyBcCisgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICNleHByICIsICIgI2V4Y2VwdGlvblR5cGUsIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgaWYoIF9fY2F0Y2hSZXN1bHQuYWxsb3dUaHJvd3MoKSApIFwKKyAgICAgICAgICAgIHRyeSB7IFwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkPihleHByKTsgXAorICAgICAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZVJlc3VsdCggQ2F0Y2g6OlJlc3VsdFdhczo6RGlkbnRUaHJvd0V4Y2VwdGlvbiApOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGNhdGNoKCBleGNlcHRpb25UeXBlICkgeyBcCisgICAgICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBDYXRjaDo6UmVzdWx0V2FzOjpPayApOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGNhdGNoKCAuLi4gKSB7IFwKKyAgICAgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LnVzZUFjdGl2ZUV4Y2VwdGlvbiggcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBDYXRjaDo6UmVzdWx0V2FzOjpPayApOyBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgIH0gd2hpbGUoIENhdGNoOjphbHdheXNGYWxzZSgpICkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2lmZGVmIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX01TRyggbWFjcm9OYW1lLCBtZXNzYWdlVHlwZSwgcmVzdWx0RGlzcG9zaXRpb24sIC4uLiApIFwKKyAgICAgICAgZG8geyBcCisgICAgICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAiIiwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdCA8PCBfX1ZBX0FSR1NfXyArIDo6Q2F0Y2g6OlN0cmVhbUVuZFN0b3AoKTsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBtZXNzYWdlVHlwZSApOyBcCisgICAgICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICAgICAgfSB3aGlsZSggQ2F0Y2g6OmFsd2F5c0ZhbHNlKCkgKQorI2Vsc2UKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX01TRyggbWFjcm9OYW1lLCBtZXNzYWdlVHlwZSwgcmVzdWx0RGlzcG9zaXRpb24sIGxvZyApIFwKKyAgICAgICAgZG8geyBcCisgICAgICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAiIiwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdCA8PCBsb2cgKyA6OkNhdGNoOjpTdHJlYW1FbmRTdG9wKCk7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZVJlc3VsdCggbWVzc2FnZVR5cGUgKTsgXAorICAgICAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgICAgIH0gd2hpbGUoIENhdGNoOjphbHdheXNGYWxzZSgpICkKKyNlbmRpZgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0lORk8oIG1hY3JvTmFtZSwgbG9nICkgXAorICAgIENhdGNoOjpTY29wZWRNZXNzYWdlIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBzY29wZWRNZXNzYWdlICkgPSBDYXRjaDo6TWVzc2FnZUJ1aWxkZXIoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIENhdGNoOjpSZXN1bHRXYXM6OkluZm8gKSA8PCBsb2c7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0hFQ0tfVEhBVCggbWFjcm9OYW1lLCBtYXRjaGVyLCByZXN1bHREaXNwb3NpdGlvbiwgYXJnICkgXAorICAgIGRvIHsgXAorICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjYXJnICIsICIgI21hdGNoZXIsIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgdHJ5IHsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlTWF0Y2goIGFyZywgbWF0Y2hlciwgI21hdGNoZXIgKTsgXAorICAgICAgICB9IGNhdGNoKCAuLi4gKSB7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQudXNlQWN0aXZlRXhjZXB0aW9uKCByZXN1bHREaXNwb3NpdGlvbiB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUgKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgfSB3aGlsZSggQ2F0Y2g6OmFsd2F5c0ZhbHNlKCkgKQorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfc2VjdGlvbi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9TRUNUSU9OX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3NlY3Rpb25faW5mby5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9TRUNUSU9OX0lORk9fSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdG90YWxzLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVE9UQUxTX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBDb3VudHMgeworICAgICAgICBDb3VudHMoKSA6IHBhc3NlZCggMCApLCBmYWlsZWQoIDAgKSwgZmFpbGVkQnV0T2soIDAgKSB7fQorCisgICAgICAgIENvdW50cyBvcGVyYXRvciAtICggQ291bnRzIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgIENvdW50cyBkaWZmOworICAgICAgICAgICAgZGlmZi5wYXNzZWQgPSBwYXNzZWQgLSBvdGhlci5wYXNzZWQ7CisgICAgICAgICAgICBkaWZmLmZhaWxlZCA9IGZhaWxlZCAtIG90aGVyLmZhaWxlZDsKKyAgICAgICAgICAgIGRpZmYuZmFpbGVkQnV0T2sgPSBmYWlsZWRCdXRPayAtIG90aGVyLmZhaWxlZEJ1dE9rOworICAgICAgICAgICAgcmV0dXJuIGRpZmY7CisgICAgICAgIH0KKyAgICAgICAgQ291bnRzJiBvcGVyYXRvciArPSAoIENvdW50cyBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICBwYXNzZWQgKz0gb3RoZXIucGFzc2VkOworICAgICAgICAgICAgZmFpbGVkICs9IG90aGVyLmZhaWxlZDsKKyAgICAgICAgICAgIGZhaWxlZEJ1dE9rICs9IG90aGVyLmZhaWxlZEJ1dE9rOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzaXplX3QgdG90YWwoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gcGFzc2VkICsgZmFpbGVkICsgZmFpbGVkQnV0T2s7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBhbGxQYXNzZWQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gZmFpbGVkID09IDAgJiYgZmFpbGVkQnV0T2sgPT0gMDsKKyAgICAgICAgfQorICAgICAgICBib29sIGFsbE9rKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGZhaWxlZCA9PSAwOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzaXplX3QgcGFzc2VkOworICAgICAgICBzdGQ6OnNpemVfdCBmYWlsZWQ7CisgICAgICAgIHN0ZDo6c2l6ZV90IGZhaWxlZEJ1dE9rOworICAgIH07CisKKyAgICBzdHJ1Y3QgVG90YWxzIHsKKworICAgICAgICBUb3RhbHMgb3BlcmF0b3IgLSAoIFRvdGFscyBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgICAgICBUb3RhbHMgZGlmZjsKKyAgICAgICAgICAgIGRpZmYuYXNzZXJ0aW9ucyA9IGFzc2VydGlvbnMgLSBvdGhlci5hc3NlcnRpb25zOworICAgICAgICAgICAgZGlmZi50ZXN0Q2FzZXMgPSB0ZXN0Q2FzZXMgLSBvdGhlci50ZXN0Q2FzZXM7CisgICAgICAgICAgICByZXR1cm4gZGlmZjsKKyAgICAgICAgfQorCisgICAgICAgIFRvdGFscyBkZWx0YSggVG90YWxzIGNvbnN0JiBwcmV2VG90YWxzICkgY29uc3QgeworICAgICAgICAgICAgVG90YWxzIGRpZmYgPSAqdGhpcyAtIHByZXZUb3RhbHM7CisgICAgICAgICAgICBpZiggZGlmZi5hc3NlcnRpb25zLmZhaWxlZCA+IDAgKQorICAgICAgICAgICAgICAgICsrZGlmZi50ZXN0Q2FzZXMuZmFpbGVkOworICAgICAgICAgICAgZWxzZSBpZiggZGlmZi5hc3NlcnRpb25zLmZhaWxlZEJ1dE9rID4gMCApCisgICAgICAgICAgICAgICAgKytkaWZmLnRlc3RDYXNlcy5mYWlsZWRCdXRPazsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICArK2RpZmYudGVzdENhc2VzLnBhc3NlZDsKKyAgICAgICAgICAgIHJldHVybiBkaWZmOworICAgICAgICB9CisKKyAgICAgICAgVG90YWxzJiBvcGVyYXRvciArPSAoIFRvdGFscyBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICBhc3NlcnRpb25zICs9IG90aGVyLmFzc2VydGlvbnM7CisgICAgICAgICAgICB0ZXN0Q2FzZXMgKz0gb3RoZXIudGVzdENhc2VzOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQ291bnRzIGFzc2VydGlvbnM7CisgICAgICAgIENvdW50cyB0ZXN0Q2FzZXM7CisgICAgfTsKK30KKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBTZWN0aW9uSW5mbyB7CisgICAgICAgIFNlY3Rpb25JbmZvCisgICAgICAgICAgICAoICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbywKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUsCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9kZXNjcmlwdGlvbiA9IHN0ZDo6c3RyaW5nKCkgKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgICAgU291cmNlTGluZUluZm8gbGluZUluZm87CisgICAgfTsKKworICAgIHN0cnVjdCBTZWN0aW9uRW5kSW5mbyB7CisgICAgICAgIFNlY3Rpb25FbmRJbmZvKCBTZWN0aW9uSW5mbyBjb25zdCYgX3NlY3Rpb25JbmZvLCBDb3VudHMgY29uc3QmIF9wcmV2QXNzZXJ0aW9ucywgZG91YmxlIF9kdXJhdGlvbkluU2Vjb25kcyApCisgICAgICAgIDogc2VjdGlvbkluZm8oIF9zZWN0aW9uSW5mbyApLCBwcmV2QXNzZXJ0aW9ucyggX3ByZXZBc3NlcnRpb25zICksIGR1cmF0aW9uSW5TZWNvbmRzKCBfZHVyYXRpb25JblNlY29uZHMgKQorICAgICAgICB7fQorCisgICAgICAgIFNlY3Rpb25JbmZvIHNlY3Rpb25JbmZvOworICAgICAgICBDb3VudHMgcHJldkFzc2VydGlvbnM7CisgICAgICAgIGRvdWJsZSBkdXJhdGlvbkluU2Vjb25kczsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3RpbWVyLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RJTUVSX0hfSU5DTFVERUQKKworI2lmZGVmIF9NU0NfVkVSCisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgVUludDY0OworfQorI2Vsc2UKKyNpbmNsdWRlIDxzdGRpbnQuaD4KK25hbWVzcGFjZSBDYXRjaCB7CisgICAgdHlwZWRlZiB1aW50NjRfdCBVSW50NjQ7Cit9CisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBjbGFzcyBUaW1lciB7CisgICAgcHVibGljOgorICAgICAgICBUaW1lcigpIDogbV90aWNrcyggMCApIHt9CisgICAgICAgIHZvaWQgc3RhcnQoKTsKKyAgICAgICAgdW5zaWduZWQgaW50IGdldEVsYXBzZWRNaWNyb3NlY29uZHMoKSBjb25zdDsKKyAgICAgICAgdW5zaWduZWQgaW50IGdldEVsYXBzZWRNaWxsaXNlY29uZHMoKSBjb25zdDsKKyAgICAgICAgZG91YmxlIGdldEVsYXBzZWRTZWNvbmRzKCkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBVSW50NjQgbV90aWNrczsKKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgU2VjdGlvbiA6IE5vbkNvcHlhYmxlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFNlY3Rpb24oIFNlY3Rpb25JbmZvIGNvbnN0JiBpbmZvICk7CisgICAgICAgIH5TZWN0aW9uKCk7CisKKyAgICAgICAgLy8gVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc2VjdGlvbiBzaG91bGQgYmUgZXhlY3V0ZWQgb3Igbm90CisgICAgICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIFNlY3Rpb25JbmZvIG1faW5mbzsKKworICAgICAgICBzdGQ6OnN0cmluZyBtX25hbWU7CisgICAgICAgIENvdW50cyBtX2Fzc2VydGlvbnM7CisgICAgICAgIGJvb2wgbV9zZWN0aW9uSW5jbHVkZWQ7CisgICAgICAgIFRpbWVyIG1fdGltZXI7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9TRUNUSU9OKCAuLi4gKSBcCisgICAgICAgIGlmKCBDYXRjaDo6U2VjdGlvbiBjb25zdCYgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGNhdGNoX2ludGVybmFsX1NlY3Rpb24gKSA9IENhdGNoOjpTZWN0aW9uSW5mbyggQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIF9fVkFfQVJHU19fICkgKQorI2Vsc2UKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1NFQ1RJT04oIG5hbWUsIGRlc2MgKSBcCisgICAgICAgIGlmKCBDYXRjaDo6U2VjdGlvbiBjb25zdCYgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGNhdGNoX2ludGVybmFsX1NlY3Rpb24gKSA9IENhdGNoOjpTZWN0aW9uSW5mbyggQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIG5hbWUsIGRlc2MgKSApCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2dlbmVyYXRvcnMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9HRU5FUkFUT1JTX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworbmFtZXNwYWNlIENhdGNoIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBJR2VuZXJhdG9yIHsKKyAgICB2aXJ0dWFsIH5JR2VuZXJhdG9yKCkge30KKyAgICB2aXJ0dWFsIFQgZ2V0VmFsdWUoIHN0ZDo6c2l6ZV90IGluZGV4ICkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc3RkOjpzaXplX3Qgc2l6ZSAoKSBjb25zdCA9IDA7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQmV0d2VlbkdlbmVyYXRvciA6IHB1YmxpYyBJR2VuZXJhdG9yPFQ+IHsKK3B1YmxpYzoKKyAgICBCZXR3ZWVuR2VuZXJhdG9yKCBUIGZyb20sIFQgdG8gKSA6IG1fZnJvbSggZnJvbSApLCBtX3RvKCB0byApe30KKworICAgIHZpcnR1YWwgVCBnZXRWYWx1ZSggc3RkOjpzaXplX3QgaW5kZXggKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2Zyb20rc3RhdGljX2Nhc3Q8aW50PiggaW5kZXggKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oIDErbV90by1tX2Zyb20gKTsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICBUIG1fZnJvbTsKKyAgICBUIG1fdG87Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgVmFsdWVzR2VuZXJhdG9yIDogcHVibGljIElHZW5lcmF0b3I8VD4geworcHVibGljOgorICAgIFZhbHVlc0dlbmVyYXRvcigpe30KKworICAgIHZvaWQgYWRkKCBUIHZhbHVlICkgeworICAgICAgICBtX3ZhbHVlcy5wdXNoX2JhY2soIHZhbHVlICk7CisgICAgfQorCisgICAgdmlydHVhbCBUIGdldFZhbHVlKCBzdGQ6OnNpemVfdCBpbmRleCApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fdmFsdWVzW2luZGV4XTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3ZhbHVlcy5zaXplKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6dmVjdG9yPFQ+IG1fdmFsdWVzOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIENvbXBvc2l0ZUdlbmVyYXRvciB7CitwdWJsaWM6CisgICAgQ29tcG9zaXRlR2VuZXJhdG9yKCkgOiBtX3RvdGFsU2l6ZSggMCApIHt9CisKKyAgICAvLyAqKiogTW92ZSBzZW1hbnRpY3MsIHNpbWlsYXIgdG8gYXV0b19wdHIgKioqCisgICAgQ29tcG9zaXRlR2VuZXJhdG9yKCBDb21wb3NpdGVHZW5lcmF0b3ImIG90aGVyICkKKyAgICA6ICAgbV9maWxlSW5mbyggb3RoZXIubV9maWxlSW5mbyApLAorICAgICAgICBtX3RvdGFsU2l6ZSggMCApCisgICAgeworICAgICAgICBtb3ZlKCBvdGhlciApOworICAgIH0KKworICAgIENvbXBvc2l0ZUdlbmVyYXRvciYgc2V0RmlsZUluZm8oIGNvbnN0IGNoYXIqIGZpbGVJbmZvICkgeworICAgICAgICBtX2ZpbGVJbmZvID0gZmlsZUluZm87CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB+Q29tcG9zaXRlR2VuZXJhdG9yKCkgeworICAgICAgICBkZWxldGVBbGwoIG1fY29tcG9zZWQgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBUICgpIGNvbnN0IHsKKyAgICAgICAgc2l6ZV90IG92ZXJhbGxJbmRleCA9IGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0R2VuZXJhdG9ySW5kZXgoIG1fZmlsZUluZm8sIG1fdG90YWxTaXplICk7CisKKyAgICAgICAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8Y29uc3QgSUdlbmVyYXRvcjxUPio+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fY29tcG9zZWQuYmVnaW4oKTsKKyAgICAgICAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8Y29uc3QgSUdlbmVyYXRvcjxUPio+Ojpjb25zdF9pdGVyYXRvciBpdEVuZCA9IG1fY29tcG9zZWQuZW5kKCk7CisgICAgICAgIGZvciggc2l6ZV90IGluZGV4ID0gMDsgaXQgIT0gaXRFbmQ7ICsraXQgKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBJR2VuZXJhdG9yPFQ+KiBnZW5lcmF0b3IgPSAqaXQ7CisgICAgICAgICAgICBpZiggb3ZlcmFsbEluZGV4ID49IGluZGV4ICYmIG92ZXJhbGxJbmRleCA8IGluZGV4ICsgZ2VuZXJhdG9yLT5zaXplKCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0b3ItPmdldFZhbHVlKCBvdmVyYWxsSW5kZXgtaW5kZXggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGV4ICs9IGdlbmVyYXRvci0+c2l6ZSgpOworICAgICAgICB9CisgICAgICAgIENBVENIX0lOVEVSTkFMX0VSUk9SKCAiSW5kZXhlZCBwYXN0IGVuZCBvZiBnZW5lcmF0ZWQgcmFuZ2UiICk7CisgICAgICAgIHJldHVybiBUKCk7IC8vIFN1cHByZXNzIHNwdXJpb3VzICJub3QgYWxsIGNvbnRyb2wgcGF0aHMgcmV0dXJuIGEgdmFsdWUiIHdhcm5pbmcgaW4gVmlzdWFsIFN0dWRpbyAtIGlmIHlvdSBrbm93IGhvdyB0byBmaXggdGhpcyBwbGVhc2UgZG8gc28KKyAgICB9CisKKyAgICB2b2lkIGFkZCggY29uc3QgSUdlbmVyYXRvcjxUPiogZ2VuZXJhdG9yICkgeworICAgICAgICBtX3RvdGFsU2l6ZSArPSBnZW5lcmF0b3ItPnNpemUoKTsKKyAgICAgICAgbV9jb21wb3NlZC5wdXNoX2JhY2soIGdlbmVyYXRvciApOworICAgIH0KKworICAgIENvbXBvc2l0ZUdlbmVyYXRvciYgdGhlbiggQ29tcG9zaXRlR2VuZXJhdG9yJiBvdGhlciApIHsKKyAgICAgICAgbW92ZSggb3RoZXIgKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvbXBvc2l0ZUdlbmVyYXRvciYgdGhlbiggVCB2YWx1ZSApIHsKKyAgICAgICAgVmFsdWVzR2VuZXJhdG9yPFQ+KiB2YWx1ZXNHZW4gPSBuZXcgVmFsdWVzR2VuZXJhdG9yPFQ+KCk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWx1ZSApOworICAgICAgICBhZGQoIHZhbHVlc0dlbiApOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCitwcml2YXRlOgorCisgICAgdm9pZCBtb3ZlKCBDb21wb3NpdGVHZW5lcmF0b3ImIG90aGVyICkgeworICAgICAgICBtX2NvbXBvc2VkLmluc2VydCggbV9jb21wb3NlZC5lbmQoKSwgb3RoZXIubV9jb21wb3NlZC5iZWdpbigpLCBvdGhlci5tX2NvbXBvc2VkLmVuZCgpICk7CisgICAgICAgIG1fdG90YWxTaXplICs9IG90aGVyLm1fdG90YWxTaXplOworICAgICAgICBvdGhlci5tX2NvbXBvc2VkLmNsZWFyKCk7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgSUdlbmVyYXRvcjxUPio+IG1fY29tcG9zZWQ7CisgICAgc3RkOjpzdHJpbmcgbV9maWxlSW5mbzsKKyAgICBzaXplX3QgbV90b3RhbFNpemU7Cit9OworCituYW1lc3BhY2UgR2VuZXJhdG9ycworeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IGJldHdlZW4oIFQgZnJvbSwgVCB0byApIHsKKyAgICAgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IGdlbmVyYXRvcnM7CisgICAgICAgIGdlbmVyYXRvcnMuYWRkKCBuZXcgQmV0d2VlbkdlbmVyYXRvcjxUPiggZnJvbSwgdG8gKSApOworICAgICAgICByZXR1cm4gZ2VuZXJhdG9yczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiB2YWx1ZXMoIFQgdmFsMSwgVCB2YWwyICkgeworICAgICAgICBDb21wb3NpdGVHZW5lcmF0b3I8VD4gZ2VuZXJhdG9yczsKKyAgICAgICAgVmFsdWVzR2VuZXJhdG9yPFQ+KiB2YWx1ZXNHZW4gPSBuZXcgVmFsdWVzR2VuZXJhdG9yPFQ+KCk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWwxICk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWwyICk7CisgICAgICAgIGdlbmVyYXRvcnMuYWRkKCB2YWx1ZXNHZW4gKTsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRvcnM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDb21wb3NpdGVHZW5lcmF0b3I8VD4gdmFsdWVzKCBUIHZhbDEsIFQgdmFsMiwgVCB2YWwzICl7CisgICAgICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiBnZW5lcmF0b3JzOworICAgICAgICBWYWx1ZXNHZW5lcmF0b3I8VD4qIHZhbHVlc0dlbiA9IG5ldyBWYWx1ZXNHZW5lcmF0b3I8VD4oKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDEgKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDIgKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDMgKTsKKyAgICAgICAgZ2VuZXJhdG9ycy5hZGQoIHZhbHVlc0dlbiApOworICAgICAgICByZXR1cm4gZ2VuZXJhdG9yczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiB2YWx1ZXMoIFQgdmFsMSwgVCB2YWwyLCBUIHZhbDMsIFQgdmFsNCApIHsKKyAgICAgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IGdlbmVyYXRvcnM7CisgICAgICAgIFZhbHVlc0dlbmVyYXRvcjxUPiogdmFsdWVzR2VuID0gbmV3IFZhbHVlc0dlbmVyYXRvcjxUPigpOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMSApOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMiApOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMyApOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsNCApOworICAgICAgICBnZW5lcmF0b3JzLmFkZCggdmFsdWVzR2VuICk7CisgICAgICAgIHJldHVybiBnZW5lcmF0b3JzOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIEdlbmVyYXRvcnMKKwordXNpbmcgbmFtZXNwYWNlIEdlbmVyYXRvcnM7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0xJTkVTVFIyKCBsaW5lICkgI2xpbmUKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTElORVNUUiggbGluZSApIElOVEVSTkFMX0NBVENIX0xJTkVTVFIyKCBsaW5lICkKKworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9HRU5FUkFURSggZXhwciApIGV4cHIuc2V0RmlsZUluZm8oIF9fRklMRV9fICIoIiBJTlRFUk5BTF9DQVRDSF9MSU5FU1RSKCBfX0xJTkVfXyApICIpIiApCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9pbnRlcmZhY2VzX2V4Y2VwdGlvbi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX0VYQ0VQVElPTl9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfaW50ZXJmYWNlc19yZWdpc3RyeV9odWIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19SRUdJU1RSWV9IVUJfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGVzdENhc2U7CisgICAgc3RydWN0IElUZXN0Q2FzZVJlZ2lzdHJ5OworICAgIHN0cnVjdCBJRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5OworICAgIHN0cnVjdCBJRXhjZXB0aW9uVHJhbnNsYXRvcjsKKyAgICBzdHJ1Y3QgSVJlcG9ydGVyUmVnaXN0cnk7CisgICAgc3RydWN0IElSZXBvcnRlckZhY3Rvcnk7CisgICAgc3RydWN0IElUYWdBbGlhc1JlZ2lzdHJ5OworCisgICAgc3RydWN0IElSZWdpc3RyeUh1YiB7CisgICAgICAgIHZpcnR1YWwgfklSZWdpc3RyeUh1YigpOworCisgICAgICAgIHZpcnR1YWwgSVJlcG9ydGVyUmVnaXN0cnkgY29uc3QmIGdldFJlcG9ydGVyUmVnaXN0cnkoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgSVRlc3RDYXNlUmVnaXN0cnkgY29uc3QmIGdldFRlc3RDYXNlUmVnaXN0cnkoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QmIGdldFRhZ0FsaWFzUmVnaXN0cnkoKSBjb25zdCA9IDA7CisKKyAgICAgICAgdmlydHVhbCBJRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5JiBnZXRFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkoKSA9IDA7CisgICAgfTsKKworICAgIHN0cnVjdCBJTXV0YWJsZVJlZ2lzdHJ5SHViIHsKKyAgICAgICAgdmlydHVhbCB+SU11dGFibGVSZWdpc3RyeUh1YigpOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJSZXBvcnRlciggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiBjb25zdCYgZmFjdG9yeSApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoIFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiBjb25zdCYgZmFjdG9yeSApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVGVzdCggVGVzdENhc2UgY29uc3QmIHRlc3RJbmZvICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUcmFuc2xhdG9yKCBjb25zdCBJRXhjZXB0aW9uVHJhbnNsYXRvciogdHJhbnNsYXRvciApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVGFnQWxpYXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcywgc3RkOjpzdHJpbmcgY29uc3QmIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgPSAwOworICAgIH07CisKKyAgICBJUmVnaXN0cnlIdWImIGdldFJlZ2lzdHJ5SHViKCk7CisgICAgSU11dGFibGVSZWdpc3RyeUh1YiYgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCk7CisgICAgdm9pZCBjbGVhblVwKCk7CisgICAgc3RkOjpzdHJpbmcgdHJhbnNsYXRlQWN0aXZlRXhjZXB0aW9uKCk7CisKK30KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHR5cGVkZWYgc3RkOjpzdHJpbmcoKmV4Y2VwdGlvblRyYW5zbGF0ZUZ1bmN0aW9uKSgpOworCisgICAgc3RydWN0IElFeGNlcHRpb25UcmFuc2xhdG9yOworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8Y29uc3QgSUV4Y2VwdGlvblRyYW5zbGF0b3IqPiBFeGNlcHRpb25UcmFuc2xhdG9yczsKKworICAgIHN0cnVjdCBJRXhjZXB0aW9uVHJhbnNsYXRvciB7CisgICAgICAgIHZpcnR1YWwgfklFeGNlcHRpb25UcmFuc2xhdG9yKCk7CisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgdHJhbnNsYXRlKCBFeGNlcHRpb25UcmFuc2xhdG9yczo6Y29uc3RfaXRlcmF0b3IgaXQsIEV4Y2VwdGlvblRyYW5zbGF0b3JzOjpjb25zdF9pdGVyYXRvciBpdEVuZCApIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgc3RydWN0IElFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkgeworICAgICAgICB2aXJ0dWFsIH5JRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5KCk7CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyB0cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIGNsYXNzIEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyYXIgeworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBjbGFzcyBFeGNlcHRpb25UcmFuc2xhdG9yIDogcHVibGljIElFeGNlcHRpb25UcmFuc2xhdG9yIHsKKyAgICAgICAgcHVibGljOgorCisgICAgICAgICAgICBFeGNlcHRpb25UcmFuc2xhdG9yKCBzdGQ6OnN0cmluZygqdHJhbnNsYXRlRnVuY3Rpb24pKCBUJiApICkKKyAgICAgICAgICAgIDogbV90cmFuc2xhdGVGdW5jdGlvbiggdHJhbnNsYXRlRnVuY3Rpb24gKQorICAgICAgICAgICAge30KKworICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyB0cmFuc2xhdGUoIEV4Y2VwdGlvblRyYW5zbGF0b3JzOjpjb25zdF9pdGVyYXRvciBpdCwgRXhjZXB0aW9uVHJhbnNsYXRvcnM6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpdCA9PSBpdEVuZCApCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgqaXQpLT50cmFuc2xhdGUoIGl0KzEsIGl0RW5kICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoKCBUJiBleCApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fdHJhbnNsYXRlRnVuY3Rpb24oIGV4ICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCptX3RyYW5zbGF0ZUZ1bmN0aW9uKSggVCYgKTsKKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJhciggc3RkOjpzdHJpbmcoKnRyYW5zbGF0ZUZ1bmN0aW9uKSggVCYgKSApIHsKKyAgICAgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyVHJhbnNsYXRvcgorICAgICAgICAgICAgICAgICggbmV3IEV4Y2VwdGlvblRyYW5zbGF0b3I8VD4oIHRyYW5zbGF0ZUZ1bmN0aW9uICkgKTsKKyAgICAgICAgfQorICAgIH07Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVFJBTlNMQVRFX0VYQ0VQVElPTjIoIHRyYW5zbGF0b3JOYW1lLCBzaWduYXR1cmUgKSBcCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIHRyYW5zbGF0b3JOYW1lKCBzaWduYXR1cmUgKTsgXAorICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OkV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyYXIgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGNhdGNoX2ludGVybmFsX0V4Y2VwdGlvblJlZ2lzdHJhciApKCAmdHJhbnNsYXRvck5hbWUgKTsgfVwKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgdHJhbnNsYXRvck5hbWUoIHNpZ25hdHVyZSApCisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVFJBTlNMQVRFX0VYQ0VQVElPTiggc2lnbmF0dXJlICkgSU5URVJOQUxfQ0FUQ0hfVFJBTlNMQVRFX0VYQ0VQVElPTjIoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBjYXRjaF9pbnRlcm5hbF9FeGNlcHRpb25UcmFuc2xhdG9yICksIHNpZ25hdHVyZSApCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9hcHByb3guaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9BUFBST1hfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUykKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIERldGFpbCB7CisKKyAgICBjbGFzcyBBcHByb3ggeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgQXBwcm94ICggZG91YmxlIHZhbHVlICkKKyAgICAgICAgOiAgIG1fZXBzaWxvbiggc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmVwc2lsb24oKSoxMDAgKSwKKyAgICAgICAgICAgIG1fbWFyZ2luKCAwLjAgKSwKKyAgICAgICAgICAgIG1fc2NhbGUoIDEuMCApLAorICAgICAgICAgICAgbV92YWx1ZSggdmFsdWUgKQorICAgICAgICB7fQorCisgICAgICAgIEFwcHJveCggQXBwcm94IGNvbnN0JiBvdGhlciApCisgICAgICAgIDogICBtX2Vwc2lsb24oIG90aGVyLm1fZXBzaWxvbiApLAorICAgICAgICAgICAgbV9tYXJnaW4oIG90aGVyLm1fbWFyZ2luICksCisgICAgICAgICAgICBtX3NjYWxlKCBvdGhlci5tX3NjYWxlICksCisgICAgICAgICAgICBtX3ZhbHVlKCBvdGhlci5tX3ZhbHVlICkKKyAgICAgICAge30KKworICAgICAgICBzdGF0aWMgQXBwcm94IGN1c3RvbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBBcHByb3goIDAgKTsKKyAgICAgICAgfQorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMpCisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgQXBwcm94IG9wZXJhdG9yKCkoIFQgdmFsdWUgKSB7CisgICAgICAgICAgICBBcHByb3ggYXBwcm94KCBzdGF0aWNfY2FzdDxkb3VibGU+KHZhbHVlKSApOworICAgICAgICAgICAgYXBwcm94LmVwc2lsb24oIG1fZXBzaWxvbiApOworICAgICAgICAgICAgYXBwcm94Lm1hcmdpbiggbV9tYXJnaW4gKTsKKyAgICAgICAgICAgIGFwcHJveC5zY2FsZSggbV9zY2FsZSApOworICAgICAgICAgICAgcmV0dXJuIGFwcHJveDsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGV4cGxpY2l0IEFwcHJveCggVCB2YWx1ZSApOiBBcHByb3goc3RhdGljX2Nhc3Q8ZG91YmxlPih2YWx1ZSkpCisgICAgICAgIHt9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPT0gKCBjb25zdCBUJiBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgLy8gVGhhbmtzIHRvIFJpY2hhcmQgSGFycmlzIGZvciBoaXMgaGVscCByZWZpbmluZyB0aGlzIGZvcm11bGEKKyAgICAgICAgICAgIGF1dG8gbGhzX3YgPSBkb3VibGUobGhzKTsKKyAgICAgICAgICAgIGJvb2wgcmVsYXRpdmVPSyA9IHN0ZDo6ZmFicyhsaHNfdiAtIHJocy5tX3ZhbHVlKSA8IHJocy5tX2Vwc2lsb24gKiAocmhzLm1fc2NhbGUgKyAoc3RkOjptYXgpKHN0ZDo6ZmFicyhsaHNfdiksIHN0ZDo6ZmFicyhyaHMubV92YWx1ZSkpKTsKKyAgICAgICAgICAgIGlmIChyZWxhdGl2ZU9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RkOjpmYWJzKGxoc192IC0gcmhzLm1fdmFsdWUpIDwgcmhzLm1fbWFyZ2luOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPT0gKCBBcHByb3ggY29uc3QmIGxocywgY29uc3QgVCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIG9wZXJhdG9yPT0oIHJocywgbGhzICk7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciAhPSAoIFQgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggbGhzLCByaHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yICE9ICggQXBwcm94IGNvbnN0JiBsaHMsIFQgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMsIGxocyApOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPD0gKCBUIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gZG91YmxlKGxocykgPCByaHMubV92YWx1ZSB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPD0gKCBBcHByb3ggY29uc3QmIGxocywgVCByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gbGhzLm1fdmFsdWUgPCBkb3VibGUocmhzKSB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPj0gKCBUIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gZG91YmxlKGxocykgPiByaHMubV92YWx1ZSB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPj0gKCBBcHByb3ggY29uc3QmIGxocywgVCByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gbGhzLm1fdmFsdWUgPiBkb3VibGUocmhzKSB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgQXBwcm94JiBlcHNpbG9uKCBUIG5ld0Vwc2lsb24gKSB7CisgICAgICAgICAgICBtX2Vwc2lsb24gPSBkb3VibGUobmV3RXBzaWxvbik7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBBcHByb3gmIG1hcmdpbiggVCBuZXdNYXJnaW4gKSB7CisgICAgICAgICAgICBtX21hcmdpbiA9IGRvdWJsZShuZXdNYXJnaW4pOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgQXBwcm94JiBzY2FsZSggVCBuZXdTY2FsZSApIHsKKyAgICAgICAgICAgIG1fc2NhbGUgPSBkb3VibGUobmV3U2NhbGUpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyNlbHNlCisKKyAgICAgICAgQXBwcm94IG9wZXJhdG9yKCkoIGRvdWJsZSB2YWx1ZSApIHsKKyAgICAgICAgICAgIEFwcHJveCBhcHByb3goIHZhbHVlICk7CisgICAgICAgICAgICBhcHByb3guZXBzaWxvbiggbV9lcHNpbG9uICk7CisgICAgICAgICAgICBhcHByb3gubWFyZ2luKCBtX21hcmdpbiApOworICAgICAgICAgICAgYXBwcm94LnNjYWxlKCBtX3NjYWxlICk7CisgICAgICAgICAgICByZXR1cm4gYXBwcm94OworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPT0gKCBkb3VibGUgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIC8vIFRoYW5rcyB0byBSaWNoYXJkIEhhcnJpcyBmb3IgaGlzIGhlbHAgcmVmaW5pbmcgdGhpcyBmb3JtdWxhCisgICAgICAgICAgICBib29sIHJlbGF0aXZlT0sgPSBzdGQ6OmZhYnMoIGxocyAtIHJocy5tX3ZhbHVlICkgPCByaHMubV9lcHNpbG9uICogKHJocy5tX3NjYWxlICsgKHN0ZDo6bWF4KSggc3RkOjpmYWJzKGxocyksIHN0ZDo6ZmFicyhyaHMubV92YWx1ZSkgKSApOworICAgICAgICAgICAgaWYgKHJlbGF0aXZlT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdGQ6OmZhYnMobGhzIC0gcmhzLm1fdmFsdWUpIDwgcmhzLm1fbWFyZ2luOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPT0gKCBBcHByb3ggY29uc3QmIGxocywgZG91YmxlIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBvcGVyYXRvcj09KCByaHMsIGxocyApOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgIT0gKCBkb3VibGUgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggbGhzLCByaHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yICE9ICggQXBwcm94IGNvbnN0JiBsaHMsIGRvdWJsZSByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocywgbGhzICk7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA8PSAoIGRvdWJsZSBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGxocyA8IHJocy5tX3ZhbHVlIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA8PSAoIEFwcHJveCBjb25zdCYgbGhzLCBkb3VibGUgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGxocy5tX3ZhbHVlIDwgcmhzIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA+PSAoIGRvdWJsZSBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGxocyA+IHJocy5tX3ZhbHVlIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA+PSAoIEFwcHJveCBjb25zdCYgbGhzLCBkb3VibGUgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGxocy5tX3ZhbHVlID4gcmhzIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICBBcHByb3gmIGVwc2lsb24oIGRvdWJsZSBuZXdFcHNpbG9uICkgeworICAgICAgICAgICAgbV9lcHNpbG9uID0gbmV3RXBzaWxvbjsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEFwcHJveCYgbWFyZ2luKCBkb3VibGUgbmV3TWFyZ2luICkgeworICAgICAgICAgICAgbV9tYXJnaW4gPSBuZXdNYXJnaW47CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBBcHByb3gmIHNjYWxlKCBkb3VibGUgbmV3U2NhbGUgKSB7CisgICAgICAgICAgICBtX3NjYWxlID0gbmV3U2NhbGU7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCAiQXBwcm94KCAiIDw8IENhdGNoOjp0b1N0cmluZyggbV92YWx1ZSApIDw8ICIgKSI7CisgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBkb3VibGUgbV9lcHNpbG9uOworICAgICAgICBkb3VibGUgbV9tYXJnaW47CisgICAgICAgIGRvdWJsZSBtX3NjYWxlOworICAgICAgICBkb3VibGUgbV92YWx1ZTsKKyAgICB9OworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmc8RGV0YWlsOjpBcHByb3g+KCBEZXRhaWw6OkFwcHJveCBjb25zdCYgdmFsdWUgKSB7CisgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfbWF0Y2hlcnNfc3RyaW5nLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX01BVENIRVJTX1NUUklOR19IX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgTWF0Y2hlcnMgeworCisgICAgbmFtZXNwYWNlIFN0ZFN0cmluZyB7CisKKyAgICAgICAgc3RydWN0IENhc2VkU3RyaW5nCisgICAgICAgIHsKKyAgICAgICAgICAgIENhc2VkU3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBhZGp1c3RTdHJpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKSBjb25zdDsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhc2VTZW5zaXRpdml0eVN1ZmZpeCgpIGNvbnN0OworCisgICAgICAgICAgICBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgbV9jYXNlU2Vuc2l0aXZpdHk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBtX3N0cjsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgU3RyaW5nTWF0Y2hlckJhc2UgOiBNYXRjaGVyQmFzZTxzdGQ6OnN0cmluZz4geworICAgICAgICAgICAgU3RyaW5nTWF0Y2hlckJhc2UoIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcGVyYXRpb24sIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICk7CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisKKyAgICAgICAgICAgIENhc2VkU3RyaW5nIG1fY29tcGFyYXRvcjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1fb3BlcmF0aW9uOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBFcXVhbHNNYXRjaGVyIDogU3RyaW5nTWF0Y2hlckJhc2UgeworICAgICAgICAgICAgRXF1YWxzTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IENBVENIX09WRVJSSURFOworICAgICAgICB9OworICAgICAgICBzdHJ1Y3QgQ29udGFpbnNNYXRjaGVyIDogU3RyaW5nTWF0Y2hlckJhc2UgeworICAgICAgICAgICAgQ29udGFpbnNNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisgICAgICAgIH07CisgICAgICAgIHN0cnVjdCBTdGFydHNXaXRoTWF0Y2hlciA6IFN0cmluZ01hdGNoZXJCYXNlIHsKKyAgICAgICAgICAgIFN0YXJ0c1dpdGhNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisgICAgICAgIH07CisgICAgICAgIHN0cnVjdCBFbmRzV2l0aE1hdGNoZXIgOiBTdHJpbmdNYXRjaGVyQmFzZSB7CisgICAgICAgICAgICBFbmRzV2l0aE1hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICk7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKyAgICAgICAgfTsKKworICAgIH0gLy8gbmFtZXNwYWNlIFN0ZFN0cmluZworCisgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY3JlYXRlIHRoZSBhY3R1YWwgbWF0Y2hlciBvYmplY3RzLgorICAgIC8vIFRoaXMgYWxsb3dzIHRoZSB0eXBlcyB0byBiZSBpbmZlcnJlZAorCisgICAgU3RkU3RyaW5nOjpFcXVhbHNNYXRjaGVyIEVxdWFscyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSA9IENhc2VTZW5zaXRpdmU6OlllcyApOworICAgIFN0ZFN0cmluZzo6Q29udGFpbnNNYXRjaGVyIENvbnRhaW5zKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ID0gQ2FzZVNlbnNpdGl2ZTo6WWVzICk7CisgICAgU3RkU3RyaW5nOjpFbmRzV2l0aE1hdGNoZXIgRW5kc1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgPSBDYXNlU2Vuc2l0aXZlOjpZZXMgKTsKKyAgICBTdGRTdHJpbmc6OlN0YXJ0c1dpdGhNYXRjaGVyIFN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgPSBDYXNlU2Vuc2l0aXZlOjpZZXMgKTsKKworfSAvLyBuYW1lc3BhY2UgTWF0Y2hlcnMKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9tYXRjaGVyc192ZWN0b3IuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTUFUQ0hFUlNfVkVDVE9SX0hfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBNYXRjaGVycyB7CisKKyAgICBuYW1lc3BhY2UgVmVjdG9yIHsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdHJ1Y3QgQ29udGFpbnNFbGVtZW50TWF0Y2hlciA6IE1hdGNoZXJCYXNlPHN0ZDo6dmVjdG9yPFQ+LCBUPiB7CisKKyAgICAgICAgICAgIENvbnRhaW5zRWxlbWVudE1hdGNoZXIoVCBjb25zdCAmY29tcGFyYXRvcikgOiBtX2NvbXBhcmF0b3IoIGNvbXBhcmF0b3IpIHt9CisKKyAgICAgICAgICAgIGJvb2wgbWF0Y2goc3RkOjp2ZWN0b3I8VD4gY29uc3QgJnYpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpmaW5kKHYuYmVnaW4oKSwgdi5lbmQoKSwgbV9jb21wYXJhdG9yKSAhPSB2LmVuZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiAiQ29udGFpbnM6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fY29tcGFyYXRvciApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUIGNvbnN0JiBtX2NvbXBhcmF0b3I7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RydWN0IENvbnRhaW5zTWF0Y2hlciA6IE1hdGNoZXJCYXNlPHN0ZDo6dmVjdG9yPFQ+LCBzdGQ6OnZlY3RvcjxUPiA+IHsKKworICAgICAgICAgICAgQ29udGFpbnNNYXRjaGVyKHN0ZDo6dmVjdG9yPFQ+IGNvbnN0ICZjb21wYXJhdG9yKSA6IG1fY29tcGFyYXRvciggY29tcGFyYXRvciApIHt9CisKKyAgICAgICAgICAgIGJvb2wgbWF0Y2goc3RkOjp2ZWN0b3I8VD4gY29uc3QgJnYpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAvLyAhVEJEOiBzZWUgbm90ZSBpbiBFcXVhbHNNYXRjaGVyCisgICAgICAgICAgICAgICAgaWYgKG1fY29tcGFyYXRvci5zaXplKCkgPiB2LnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9jb21wYXJhdG9yLnNpemUoKTsgKytpKQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RkOjpmaW5kKHYuYmVnaW4oKSwgdi5lbmQoKSwgbV9jb21wYXJhdG9yW2ldKSA9PSB2LmVuZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIkNvbnRhaW5zOiAiICsgQ2F0Y2g6OnRvU3RyaW5nKCBtX2NvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VD4gY29uc3QmIG1fY29tcGFyYXRvcjsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdHJ1Y3QgRXF1YWxzTWF0Y2hlciA6IE1hdGNoZXJCYXNlPHN0ZDo6dmVjdG9yPFQ+LCBzdGQ6OnZlY3RvcjxUPiA+IHsKKworICAgICAgICAgICAgRXF1YWxzTWF0Y2hlcihzdGQ6OnZlY3RvcjxUPiBjb25zdCAmY29tcGFyYXRvcikgOiBtX2NvbXBhcmF0b3IoIGNvbXBhcmF0b3IgKSB7fQorCisgICAgICAgICAgICBib29sIG1hdGNoKHN0ZDo6dmVjdG9yPFQ+IGNvbnN0ICZ2KSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgLy8gIVRCRDogVGhpcyBjdXJyZW50bHkgd29ya3MgaWYgYWxsIGVsZW1lbnRzIGNhbiBiZSBjb21wYXJlZCB1c2luZyAhPQorICAgICAgICAgICAgICAgIC8vIC0gYSBtb3JlIGdlbmVyYWwgYXBwcm9hY2ggd291bGQgYmUgdmlhIGEgY29tcGFyZSB0ZW1wbGF0ZSB0aGF0IGRlZmF1bHRzCisgICAgICAgICAgICAgICAgLy8gdG8gdXNpbmcgIT0uIGJ1dCBjb3VsZCBiZSBzcGVjaWFsaXNlZCBmb3IsIGUuZy4gc3RkOjp2ZWN0b3I8VD4gZXRjCisgICAgICAgICAgICAgICAgLy8gLSB0aGVuIGp1c3QgY2FsbCB0aGF0IGRpcmVjdGx5CisgICAgICAgICAgICAgICAgaWYgKG1fY29tcGFyYXRvci5zaXplKCkgIT0gdi5zaXplKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHYuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICAgICAgICAgIGlmIChtX2NvbXBhcmF0b3JbaV0gIT0gdltpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJFcXVhbHM6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fY29tcGFyYXRvciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VD4gY29uc3QmIG1fY29tcGFyYXRvcjsKKyAgICAgICAgfTsKKworICAgIH0gLy8gbmFtZXNwYWNlIFZlY3RvcgorCisgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY3JlYXRlIHRoZSBhY3R1YWwgbWF0Y2hlciBvYmplY3RzLgorICAgIC8vIFRoaXMgYWxsb3dzIHRoZSB0eXBlcyB0byBiZSBpbmZlcnJlZAorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBWZWN0b3I6OkNvbnRhaW5zTWF0Y2hlcjxUPiBDb250YWlucyggc3RkOjp2ZWN0b3I8VD4gY29uc3QmIGNvbXBhcmF0b3IgKSB7CisgICAgICAgIHJldHVybiBWZWN0b3I6OkNvbnRhaW5zTWF0Y2hlcjxUPiggY29tcGFyYXRvciApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgVmVjdG9yOjpDb250YWluc0VsZW1lbnRNYXRjaGVyPFQ+IFZlY3RvckNvbnRhaW5zKCBUIGNvbnN0JiBjb21wYXJhdG9yICkgeworICAgICAgICByZXR1cm4gVmVjdG9yOjpDb250YWluc0VsZW1lbnRNYXRjaGVyPFQ+KCBjb21wYXJhdG9yICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBWZWN0b3I6OkVxdWFsc01hdGNoZXI8VD4gRXF1YWxzKCBzdGQ6OnZlY3RvcjxUPiBjb25zdCYgY29tcGFyYXRvciApIHsKKyAgICAgICAgcmV0dXJuIFZlY3Rvcjo6RXF1YWxzTWF0Y2hlcjxUPiggY29tcGFyYXRvciApOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgTWF0Y2hlcnMKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9pbnRlcmZhY2VzX3RhZ19hbGlhc19yZWdpc3RyeS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX1RBR19BTElBU19SRUdJU1RSWV9IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90YWdfYWxpYXMuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEFHX0FMSUFTX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBUYWdBbGlhcyB7CisgICAgICAgIFRhZ0FsaWFzKCBzdGQ6OnN0cmluZyBjb25zdCYgX3RhZywgU291cmNlTGluZUluZm8gX2xpbmVJbmZvICkgOiB0YWcoIF90YWcgKSwgbGluZUluZm8oIF9saW5lSW5mbyApIHt9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgdGFnOworICAgICAgICBTb3VyY2VMaW5lSW5mbyBsaW5lSW5mbzsKKyAgICB9OworCisgICAgc3RydWN0IFJlZ2lzdHJhckZvclRhZ0FsaWFzZXMgeworICAgICAgICBSZWdpc3RyYXJGb3JUYWdBbGlhc2VzKCBjaGFyIGNvbnN0KiBhbGlhcywgY2hhciBjb25zdCogdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKTsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2RlZmluZSBDQVRDSF9SRUdJU1RFUl9UQUdfQUxJQVMoIGFsaWFzLCBzcGVjICkgbmFtZXNwYWNleyBDYXRjaDo6UmVnaXN0cmFyRm9yVGFnQWxpYXNlcyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQXV0b1JlZ2lzdGVyVGFnQWxpYXMgKSggYWxpYXMsIHNwZWMsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPICk7IH0KKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9vcHRpb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9PUFRJT05fSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICAvLyBBbiBvcHRpb25hbCB0eXBlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBPcHRpb24geworICAgIHB1YmxpYzoKKyAgICAgICAgT3B0aW9uKCkgOiBudWxsYWJsZVZhbHVlKCBDQVRDSF9OVUxMICkge30KKyAgICAgICAgT3B0aW9uKCBUIGNvbnN0JiBfdmFsdWUgKQorICAgICAgICA6IG51bGxhYmxlVmFsdWUoIG5ldyggc3RvcmFnZSApIFQoIF92YWx1ZSApICkKKyAgICAgICAge30KKyAgICAgICAgT3B0aW9uKCBPcHRpb24gY29uc3QmIF9vdGhlciApCisgICAgICAgIDogbnVsbGFibGVWYWx1ZSggX290aGVyID8gbmV3KCBzdG9yYWdlICkgVCggKl9vdGhlciApIDogQ0FUQ0hfTlVMTCApCisgICAgICAgIHt9CisKKyAgICAgICAgfk9wdGlvbigpIHsKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBPcHRpb24mIG9wZXJhdG9yPSAoIE9wdGlvbiBjb25zdCYgX290aGVyICkgeworICAgICAgICAgICAgaWYoICZfb3RoZXIgIT0gdGhpcyApIHsKKyAgICAgICAgICAgICAgICByZXNldCgpOworICAgICAgICAgICAgICAgIGlmKCBfb3RoZXIgKQorICAgICAgICAgICAgICAgICAgICBudWxsYWJsZVZhbHVlID0gbmV3KCBzdG9yYWdlICkgVCggKl9vdGhlciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIE9wdGlvbiYgb3BlcmF0b3IgPSAoIFQgY29uc3QmIF92YWx1ZSApIHsKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgICAgICBudWxsYWJsZVZhbHVlID0gbmV3KCBzdG9yYWdlICkgVCggX3ZhbHVlICk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgaWYoIG51bGxhYmxlVmFsdWUgKQorICAgICAgICAgICAgICAgIG51bGxhYmxlVmFsdWUtPn5UKCk7CisgICAgICAgICAgICBudWxsYWJsZVZhbHVlID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIFQmIG9wZXJhdG9yKigpIHsgcmV0dXJuICpudWxsYWJsZVZhbHVlOyB9CisgICAgICAgIFQgY29uc3QmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpudWxsYWJsZVZhbHVlOyB9CisgICAgICAgIFQqIG9wZXJhdG9yLT4oKSB7IHJldHVybiBudWxsYWJsZVZhbHVlOyB9CisgICAgICAgIGNvbnN0IFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBudWxsYWJsZVZhbHVlOyB9CisKKyAgICAgICAgVCB2YWx1ZU9yKCBUIGNvbnN0JiBkZWZhdWx0VmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbnVsbGFibGVWYWx1ZSA/ICpudWxsYWJsZVZhbHVlIDogZGVmYXVsdFZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBzb21lKCkgY29uc3QgeyByZXR1cm4gbnVsbGFibGVWYWx1ZSAhPSBDQVRDSF9OVUxMOyB9CisgICAgICAgIGJvb2wgbm9uZSgpIGNvbnN0IHsgcmV0dXJuIG51bGxhYmxlVmFsdWUgPT0gQ0FUQ0hfTlVMTDsgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3IgISgpIGNvbnN0IHsgcmV0dXJuIG51bGxhYmxlVmFsdWUgPT0gQ0FUQ0hfTlVMTDsgfQorICAgICAgICBvcGVyYXRvciBTYWZlQm9vbDo6dHlwZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBTYWZlQm9vbDo6bWFrZVNhZmUoIHNvbWUoKSApOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBUICpudWxsYWJsZVZhbHVlOworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICBjaGFyIHN0b3JhZ2Vbc2l6ZW9mKFQpXTsKKworICAgICAgICAgICAgLy8gVGhlc2UgYXJlIGhlcmUgdG8gZm9yY2UgYWxpZ25tZW50IGZvciB0aGUgc3RvcmFnZQorICAgICAgICAgICAgbG9uZyBkb3VibGUgZHVtbXkxOworICAgICAgICAgICAgdm9pZCAoKmR1bW15MikoKTsKKyAgICAgICAgICAgIGxvbmcgZG91YmxlIGR1bW15MzsKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCisgICAgICAgICAgICBsb25nIGxvbmcgZHVtbXk0OworI2VuZGlmCisgICAgICAgIH07CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgSVRhZ0FsaWFzUmVnaXN0cnkgeworICAgICAgICB2aXJ0dWFsIH5JVGFnQWxpYXNSZWdpc3RyeSgpOworICAgICAgICB2aXJ0dWFsIE9wdGlvbjxUYWdBbGlhcz4gZmluZCggc3RkOjpzdHJpbmcgY29uc3QmIGFsaWFzICkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGV4cGFuZEFsaWFzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiB1bmV4cGFuZGVkVGVzdFNwZWMgKSBjb25zdCA9IDA7CisKKyAgICAgICAgc3RhdGljIElUYWdBbGlhc1JlZ2lzdHJ5IGNvbnN0JiBnZXQoKTsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gVGhlc2UgZmlsZXMgYXJlIGluY2x1ZGVkIGhlcmUgc28gdGhlIHNpbmdsZV9pbmNsdWRlIHNjcmlwdCBkb2Vzbid0IHB1dCB0aGVtCisvLyBpbiB0aGUgY29uZGl0aW9uYWxseSBjb21waWxlZCBzZWN0aW9ucworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX3Rlc3RfY2FzZV9pbmZvLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfQ0FTRV9JTkZPX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYWRkZWQiCisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBJVGVzdENhc2U7CisKKyAgICBzdHJ1Y3QgVGVzdENhc2VJbmZvIHsKKyAgICAgICAgZW51bSBTcGVjaWFsUHJvcGVydGllc3sKKyAgICAgICAgICAgIE5vbmUgPSAwLAorICAgICAgICAgICAgSXNIaWRkZW4gPSAxIDw8IDEsCisgICAgICAgICAgICBTaG91bGRGYWlsID0gMSA8PCAyLAorICAgICAgICAgICAgTWF5RmFpbCA9IDEgPDwgMywKKyAgICAgICAgICAgIFRocm93cyA9IDEgPDwgNCwKKyAgICAgICAgICAgIE5vblBvcnRhYmxlID0gMSA8PCA1CisgICAgICAgIH07CisKKyAgICAgICAgVGVzdENhc2VJbmZvKCAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9kZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjb25zdCYgX3RhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvICk7CisKKyAgICAgICAgVGVzdENhc2VJbmZvKCBUZXN0Q2FzZUluZm8gY29uc3QmIG90aGVyICk7CisKKyAgICAgICAgZnJpZW5kIHZvaWQgc2V0VGFncyggVGVzdENhc2VJbmZvJiB0ZXN0Q2FzZUluZm8sIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjb25zdCYgdGFncyApOworCisgICAgICAgIGJvb2wgaXNIaWRkZW4oKSBjb25zdDsKKyAgICAgICAgYm9vbCB0aHJvd3MoKSBjb25zdDsKKyAgICAgICAgYm9vbCBva1RvRmFpbCgpIGNvbnN0OworICAgICAgICBib29sIGV4cGVjdGVkVG9GYWlsKCkgY29uc3Q7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgY2xhc3NOYW1lOworICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHRhZ3M7CisgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBsY2FzZVRhZ3M7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRhZ3NBc1N0cmluZzsKKyAgICAgICAgU291cmNlTGluZUluZm8gbGluZUluZm87CisgICAgICAgIFNwZWNpYWxQcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisgICAgfTsKKworICAgIGNsYXNzIFRlc3RDYXNlIDogcHVibGljIFRlc3RDYXNlSW5mbyB7CisgICAgcHVibGljOgorCisgICAgICAgIFRlc3RDYXNlKCBJVGVzdENhc2UqIHRlc3RDYXNlLCBUZXN0Q2FzZUluZm8gY29uc3QmIGluZm8gKTsKKyAgICAgICAgVGVzdENhc2UoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApOworCisgICAgICAgIFRlc3RDYXNlIHdpdGhOYW1lKCBzdGQ6OnN0cmluZyBjb25zdCYgX25ld05hbWUgKSBjb25zdDsKKworICAgICAgICB2b2lkIGludm9rZSgpIGNvbnN0OworCisgICAgICAgIFRlc3RDYXNlSW5mbyBjb25zdCYgZ2V0VGVzdENhc2VJbmZvKCkgY29uc3Q7CisKKyAgICAgICAgdm9pZCBzd2FwKCBUZXN0Q2FzZSYgb3RoZXIgKTsKKyAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0OworICAgICAgICBib29sIG9wZXJhdG9yIDwgKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKSBjb25zdDsKKyAgICAgICAgVGVzdENhc2UmIG9wZXJhdG9yID0gKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIFB0cjxJVGVzdENhc2U+IHRlc3Q7CisgICAgfTsKKworICAgIFRlc3RDYXNlIG1ha2VUZXN0Q2FzZSggIElUZXN0Q2FzZSogdGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIGNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICk7Cit9CisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCisKKyNpZmRlZiBfX09CSkNfXworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX29iamMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9PQkpDX0hQUF9JTkNMVURFRAorCisjaW1wb3J0IDxvYmpjL3J1bnRpbWUuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKworLy8gTkIuIEFueSBnZW5lcmFsIGNhdGNoIGhlYWRlcnMgaW5jbHVkZWQgaGVyZSBtdXN0IGJlIGluY2x1ZGVkCisvLyBpbiBjYXRjaC5ocHAgZmlyc3QgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIGluY2x1ZGVkIGJ5IHRoZSBzaW5nbGUKKy8vIGhlYWRlciBmb3Igbm9uIG9iai11c2FnZQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUaGlzIHByb3RvY29sIGlzIHJlYWxseSBvbmx5IGhlcmUgZm9yIChzZWxmKSBkb2N1bWVudGluZyBwdXJwb3Nlcywgc2luY2UKKy8vIGFsbCBpdHMgbWV0aG9kcyBhcmUgb3B0aW9uYWwuCitAcHJvdG9jb2wgT2NGaXh0dXJlCisKK0BvcHRpb25hbAorCistKHZvaWQpIHNldFVwOworLSh2b2lkKSB0ZWFyRG93bjsKKworQGVuZAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgT2NNZXRob2QgOiBwdWJsaWMgU2hhcmVkSW1wbDxJVGVzdENhc2U+IHsKKworICAgIHB1YmxpYzoKKyAgICAgICAgT2NNZXRob2QoIENsYXNzIGNscywgU0VMIHNlbCApIDogbV9jbHMoIGNscyApLCBtX3NlbCggc2VsICkge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgaW52b2tlKCkgY29uc3QgeworICAgICAgICAgICAgaWQgb2JqID0gW1ttX2NscyBhbGxvY10gaW5pdF07CisKKyAgICAgICAgICAgIHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBvYmosIEBzZWxlY3RvcihzZXRVcCkgICk7CisgICAgICAgICAgICBwZXJmb3JtT3B0aW9uYWxTZWxlY3Rvciggb2JqLCBtX3NlbCApOworICAgICAgICAgICAgcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIG9iaiwgQHNlbGVjdG9yKHRlYXJEb3duKSAgKTsKKworICAgICAgICAgICAgYXJjU2FmZVJlbGVhc2UoIG9iaiApOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgdmlydHVhbCB+T2NNZXRob2QoKSB7fQorCisgICAgICAgIENsYXNzIG1fY2xzOworICAgICAgICBTRUwgbV9zZWw7CisgICAgfTsKKworICAgIG5hbWVzcGFjZSBEZXRhaWx7CisKKyAgICAgICAgaW5saW5lIHN0ZDo6c3RyaW5nIGdldEFubm90YXRpb24oICAgQ2xhc3MgY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgYW5ub3RhdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXN0Q2FzZU5hbWUgKSB7CisgICAgICAgICAgICBOU1N0cmluZyogc2VsU3RyID0gW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhGb3JtYXQ6QCJDYXRjaF8lc18lcyIsIGFubm90YXRpb25OYW1lLmNfc3RyKCksIHRlc3RDYXNlTmFtZS5jX3N0cigpXTsKKyAgICAgICAgICAgIFNFTCBzZWwgPSBOU1NlbGVjdG9yRnJvbVN0cmluZyggc2VsU3RyICk7CisgICAgICAgICAgICBhcmNTYWZlUmVsZWFzZSggc2VsU3RyICk7CisgICAgICAgICAgICBpZCB2YWx1ZSA9IHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBjbHMsIHNlbCApOworICAgICAgICAgICAgaWYoIHZhbHVlICkKKyAgICAgICAgICAgICAgICByZXR1cm4gWyhOU1N0cmluZyopdmFsdWUgVVRGOFN0cmluZ107CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgc2l6ZV90IHJlZ2lzdGVyVGVzdE1ldGhvZHMoKSB7CisgICAgICAgIHNpemVfdCBub1Rlc3RNZXRob2RzID0gMDsKKyAgICAgICAgaW50IG5vQ2xhc3NlcyA9IG9iamNfZ2V0Q2xhc3NMaXN0KCBDQVRDSF9OVUxMLCAwICk7CisKKyAgICAgICAgQ2xhc3MqIGNsYXNzZXMgPSAoQ0FUQ0hfVU5TQUZFX1VOUkVUQUlORUQgQ2xhc3MgKiltYWxsb2MoIHNpemVvZihDbGFzcykgKiBub0NsYXNzZXMpOworICAgICAgICBvYmpjX2dldENsYXNzTGlzdCggY2xhc3Nlcywgbm9DbGFzc2VzICk7CisKKyAgICAgICAgZm9yKCBpbnQgYyA9IDA7IGMgPCBub0NsYXNzZXM7IGMrKyApIHsKKyAgICAgICAgICAgIENsYXNzIGNscyA9IGNsYXNzZXNbY107CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdV9pbnQgY291bnQ7CisgICAgICAgICAgICAgICAgTWV0aG9kKiBtZXRob2RzID0gY2xhc3NfY29weU1ldGhvZExpc3QoIGNscywgJmNvdW50ICk7CisgICAgICAgICAgICAgICAgZm9yKCB1X2ludCBtID0gMDsgbSA8IGNvdW50IDsgbSsrICkgeworICAgICAgICAgICAgICAgICAgICBTRUwgc2VsZWN0b3IgPSBtZXRob2RfZ2V0TmFtZShtZXRob2RzW21dKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWV0aG9kTmFtZSA9IHNlbF9nZXROYW1lKHNlbGVjdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIG1ldGhvZE5hbWUsICJDYXRjaF9UZXN0Q2FzZV8iICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB0ZXN0Q2FzZU5hbWUgPSBtZXRob2ROYW1lLnN1YnN0ciggMTUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBEZXRhaWw6OmdldEFubm90YXRpb24oIGNscywgIk5hbWUiLCB0ZXN0Q2FzZU5hbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2MgPSBEZXRhaWw6OmdldEFubm90YXRpb24oIGNscywgIkRlc2NyaXB0aW9uIiwgdGVzdENhc2VOYW1lICk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjbGFzc05hbWUgPSBjbGFzc19nZXROYW1lKCBjbHMgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJUZXN0KCBtYWtlVGVzdENhc2UoIG5ldyBPY01ldGhvZCggY2xzLCBzZWxlY3RvciApLCBjbGFzc05hbWUsIG5hbWUuY19zdHIoKSwgZGVzYy5jX3N0cigpLCBTb3VyY2VMaW5lSW5mbygpICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vVGVzdE1ldGhvZHMrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmcmVlKG1ldGhvZHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBub1Rlc3RNZXRob2RzOworICAgIH0KKworICAgIG5hbWVzcGFjZSBNYXRjaGVycyB7CisgICAgICAgIG5hbWVzcGFjZSBJbXBsIHsKKyAgICAgICAgbmFtZXNwYWNlIE5TU3RyaW5nTWF0Y2hlcnMgeworCisgICAgICAgICAgICBzdHJ1Y3QgU3RyaW5nSG9sZGVyIDogTWF0Y2hlckJhc2U8TlNTdHJpbmcqPnsKKyAgICAgICAgICAgICAgICBTdHJpbmdIb2xkZXIoIE5TU3RyaW5nKiBzdWJzdHIgKSA6IG1fc3Vic3RyKCBbc3Vic3RyIGNvcHldICl7fQorICAgICAgICAgICAgICAgIFN0cmluZ0hvbGRlciggU3RyaW5nSG9sZGVyIGNvbnN0JiBvdGhlciApIDogbV9zdWJzdHIoIFtvdGhlci5tX3N1YnN0ciBjb3B5XSApe30KKyAgICAgICAgICAgICAgICBTdHJpbmdIb2xkZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIGFyY1NhZmVSZWxlYXNlKCBtX3N1YnN0ciApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggTlNTdHJpbmcqIGFyZyApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIE5TU3RyaW5nKiBtX3N1YnN0cjsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHN0cnVjdCBFcXVhbHMgOiBTdHJpbmdIb2xkZXIgeworICAgICAgICAgICAgICAgIEVxdWFscyggTlNTdHJpbmcqIHN1YnN0ciApIDogU3RyaW5nSG9sZGVyKCBzdWJzdHIgKXt9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIE5TU3RyaW5nKiBzdHIgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAgKHN0ciAhPSBuaWwgfHwgbV9zdWJzdHIgPT0gbmlsICkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RyIGlzRXF1YWxUb1N0cmluZzptX3N1YnN0cl07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJlcXVhbHMgc3RyaW5nOiAiICsgQ2F0Y2g6OnRvU3RyaW5nKCBtX3N1YnN0ciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHN0cnVjdCBDb250YWlucyA6IFN0cmluZ0hvbGRlciB7CisgICAgICAgICAgICAgICAgQ29udGFpbnMoIE5TU3RyaW5nKiBzdWJzdHIgKSA6IFN0cmluZ0hvbGRlciggc3Vic3RyICl7fQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBOU1N0cmluZyogc3RyICkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIChzdHIgIT0gbmlsIHx8IG1fc3Vic3RyID09IG5pbCApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0ciByYW5nZU9mU3RyaW5nOm1fc3Vic3RyXS5sb2NhdGlvbiAhPSBOU05vdEZvdW5kOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29udGFpbnMgc3RyaW5nOiAiICsgQ2F0Y2g6OnRvU3RyaW5nKCBtX3N1YnN0ciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHN0cnVjdCBTdGFydHNXaXRoIDogU3RyaW5nSG9sZGVyIHsKKyAgICAgICAgICAgICAgICBTdGFydHNXaXRoKCBOU1N0cmluZyogc3Vic3RyICkgOiBTdHJpbmdIb2xkZXIoIHN1YnN0ciApe30KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggTlNTdHJpbmcqIHN0ciApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICAoc3RyICE9IG5pbCB8fCBtX3N1YnN0ciA9PSBuaWwgKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHIgcmFuZ2VPZlN0cmluZzptX3N1YnN0cl0ubG9jYXRpb24gPT0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN0YXJ0cyB3aXRoOiAiICsgQ2F0Y2g6OnRvU3RyaW5nKCBtX3N1YnN0ciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBzdHJ1Y3QgRW5kc1dpdGggOiBTdHJpbmdIb2xkZXIgeworICAgICAgICAgICAgICAgIEVuZHNXaXRoKCBOU1N0cmluZyogc3Vic3RyICkgOiBTdHJpbmdIb2xkZXIoIHN1YnN0ciApe30KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggTlNTdHJpbmcqIHN0ciApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICAoc3RyICE9IG5pbCB8fCBtX3N1YnN0ciA9PSBuaWwgKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHIgcmFuZ2VPZlN0cmluZzptX3N1YnN0cl0ubG9jYXRpb24gPT0gW3N0ciBsZW5ndGhdIC0gW21fc3Vic3RyIGxlbmd0aF07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJlbmRzIHdpdGg6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fc3Vic3RyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICB9IC8vIG5hbWVzcGFjZSBOU1N0cmluZ01hdGNoZXJzCisgICAgICAgIH0gLy8gbmFtZXNwYWNlIEltcGwKKworICAgICAgICBpbmxpbmUgSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6RXF1YWxzCisgICAgICAgICAgICBFcXVhbHMoIE5TU3RyaW5nKiBzdWJzdHIgKXsgcmV0dXJuIEltcGw6Ok5TU3RyaW5nTWF0Y2hlcnM6OkVxdWFscyggc3Vic3RyICk7IH0KKworICAgICAgICBpbmxpbmUgSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6Q29udGFpbnMKKyAgICAgICAgICAgIENvbnRhaW5zKCBOU1N0cmluZyogc3Vic3RyICl7IHJldHVybiBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpDb250YWlucyggc3Vic3RyICk7IH0KKworICAgICAgICBpbmxpbmUgSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6U3RhcnRzV2l0aAorICAgICAgICAgICAgU3RhcnRzV2l0aCggTlNTdHJpbmcqIHN1YnN0ciApeyByZXR1cm4gSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6U3RhcnRzV2l0aCggc3Vic3RyICk7IH0KKworICAgICAgICBpbmxpbmUgSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6RW5kc1dpdGgKKyAgICAgICAgICAgIEVuZHNXaXRoKCBOU1N0cmluZyogc3Vic3RyICl7IHJldHVybiBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpFbmRzV2l0aCggc3Vic3RyICk7IH0KKworICAgIH0gLy8gbmFtZXNwYWNlIE1hdGNoZXJzCisKKyAgICB1c2luZyBuYW1lc3BhY2UgTWF0Y2hlcnM7CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgT0NfVEVTVF9DQVNFKCBuYW1lLCBkZXNjIClcCisrKE5TU3RyaW5nKikgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENhdGNoX05hbWVfdGVzdCApIFwKK3tcCityZXR1cm4gQCBuYW1lOyBcCit9XAorKyhOU1N0cmluZyopIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDYXRjaF9EZXNjcmlwdGlvbl90ZXN0ICkgXAoreyBcCityZXR1cm4gQCBkZXNjOyBcCit9IFwKKy0odm9pZCkgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENhdGNoX1Rlc3RDYXNlX3Rlc3QgKQorCisjZW5kaWYKKworI2lmZGVmIENBVENIX0lNUEwKKworLy8gIVRCRDogTW92ZSB0aGUgbGVhayBkZXRlY3RvciBjb2RlIGludG8gYSBzZXBhcmF0ZSBoZWFkZXIKKyNpZmRlZiBDQVRDSF9DT05GSUdfV0lORE9XU19DUlREQkcKKyNpbmNsdWRlIDxjcnRkYmcuaD4KK2NsYXNzIExlYWtEZXRlY3RvciB7CitwdWJsaWM6CisJTGVha0RldGVjdG9yKCkgeworCQlpbnQgZmxhZyA9IF9DcnRTZXREYmdGbGFnKF9DUlREQkdfUkVQT1JUX0ZMQUcpOworCQlmbGFnIHw9IF9DUlREQkdfTEVBS19DSEVDS19ERjsKKwkJZmxhZyB8PSBfQ1JUREJHX0FMTE9DX01FTV9ERjsKKwkJX0NydFNldERiZ0ZsYWcoZmxhZyk7CisJCV9DcnRTZXRSZXBvcnRNb2RlKF9DUlRfV0FSTiwgX0NSVERCR19NT0RFX0ZJTEUgfCBfQ1JUREJHX01PREVfREVCVUcpOworCQlfQ3J0U2V0UmVwb3J0RmlsZShfQ1JUX1dBUk4sIF9DUlREQkdfRklMRV9TVERFUlIpOworCQkvLyBDaGFuZ2UgdGhpcyB0byBsZWFraW5nIGFsbG9jYXRpb24ncyBudW1iZXIgdG8gYnJlYWsgdGhlcmUKKwkJX0NydFNldEJyZWFrQWxsb2MoLTEpOworCX0KK307CisjZWxzZQorY2xhc3MgTGVha0RldGVjdG9yIHt9OworI2VuZGlmCisKK0xlYWtEZXRlY3RvciBsZWFrRGV0ZWN0b3I7CisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9pbXBsLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU1QTF9IUFBfSU5DTFVERUQKKworLy8gQ29sbGVjdCBhbGwgdGhlIGltcGxlbWVudGF0aW9uIGZpbGVzIHRvZ2V0aGVyIGhlcmUKKy8vIFRoZXNlIGFyZSB0aGUgZXF1aXZhbGVudCBvZiB3aGF0IHdvdWxkIHVzdWFsbHkgYmUgY3BwIGZpbGVzCisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd3ZWFrLXZ0YWJsZXMiCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IC4uL2NhdGNoX3Nlc3Npb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SVU5ORVJfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9jb21tYW5kbGluZS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTU1BTkRMSU5FX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29uZmlnLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09ORklHX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGVzdF9zcGVjX3BhcnNlci5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfU1BFQ19QQVJTRVJfSFBQX0lOQ0xVREVECisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYWRkZWQiCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Rlc3Rfc3BlYy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfU1BFQ19IUFBfSU5DTFVERUQKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3BhZGRlZCIKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfd2lsZGNhcmRfcGF0dGVybi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1dJTERDQVJEX1BBVFRFUk5fSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKK25hbWVzcGFjZSBDYXRjaAoreworICAgIGNsYXNzIFdpbGRjYXJkUGF0dGVybiB7CisgICAgICAgIGVudW0gV2lsZGNhcmRQb3NpdGlvbiB7CisgICAgICAgICAgICBOb1dpbGRjYXJkID0gMCwKKyAgICAgICAgICAgIFdpbGRjYXJkQXRTdGFydCA9IDEsCisgICAgICAgICAgICBXaWxkY2FyZEF0RW5kID0gMiwKKyAgICAgICAgICAgIFdpbGRjYXJkQXRCb3RoRW5kcyA9IFdpbGRjYXJkQXRTdGFydCB8IFdpbGRjYXJkQXRFbmQKKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKworICAgICAgICBXaWxkY2FyZFBhdHRlcm4oIHN0ZDo6c3RyaW5nIGNvbnN0JiBwYXR0ZXJuLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICkKKyAgICAgICAgOiAgIG1fY2FzZVNlbnNpdGl2aXR5KCBjYXNlU2Vuc2l0aXZpdHkgKSwKKyAgICAgICAgICAgIG1fd2lsZGNhcmQoIE5vV2lsZGNhcmQgKSwKKyAgICAgICAgICAgIG1fcGF0dGVybiggYWRqdXN0Q2FzZSggcGF0dGVybiApICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIG1fcGF0dGVybiwgJyonICkgKSB7CisgICAgICAgICAgICAgICAgbV9wYXR0ZXJuID0gbV9wYXR0ZXJuLnN1YnN0ciggMSApOworICAgICAgICAgICAgICAgIG1fd2lsZGNhcmQgPSBXaWxkY2FyZEF0U3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggZW5kc1dpdGgoIG1fcGF0dGVybiwgJyonICkgKSB7CisgICAgICAgICAgICAgICAgbV9wYXR0ZXJuID0gbV9wYXR0ZXJuLnN1YnN0ciggMCwgbV9wYXR0ZXJuLnNpemUoKS0xICk7CisgICAgICAgICAgICAgICAgbV93aWxkY2FyZCA9IHN0YXRpY19jYXN0PFdpbGRjYXJkUG9zaXRpb24+KCBtX3dpbGRjYXJkIHwgV2lsZGNhcmRBdEVuZCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgfldpbGRjYXJkUGF0dGVybigpOworICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2hlcyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciApIGNvbnN0IHsKKyAgICAgICAgICAgIHN3aXRjaCggbV93aWxkY2FyZCApIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5vV2lsZGNhcmQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3BhdHRlcm4gPT0gYWRqdXN0Q2FzZSggc3RyICk7CisgICAgICAgICAgICAgICAgY2FzZSBXaWxkY2FyZEF0U3RhcnQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmRzV2l0aCggYWRqdXN0Q2FzZSggc3RyICksIG1fcGF0dGVybiApOworICAgICAgICAgICAgICAgIGNhc2UgV2lsZGNhcmRBdEVuZDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0c1dpdGgoIGFkanVzdENhc2UoIHN0ciApLCBtX3BhdHRlcm4gKTsKKyAgICAgICAgICAgICAgICBjYXNlIFdpbGRjYXJkQXRCb3RoRW5kczoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zKCBhZGp1c3RDYXNlKCBzdHIgKSwgbV9wYXR0ZXJuICk7CisgICAgICAgICAgICB9CisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnJlYWNoYWJsZS1jb2RlIgorI2VuZGlmCisgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiVW5rbm93biBlbnVtIiApOworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnN0cmluZyBhZGp1c3RDYXNlKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY2FzZVNlbnNpdGl2aXR5ID09IENhc2VTZW5zaXRpdmU6Ok5vID8gdG9Mb3dlciggc3RyICkgOiBzdHI7CisgICAgICAgIH0KKyAgICAgICAgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIG1fY2FzZVNlbnNpdGl2aXR5OworICAgICAgICBXaWxkY2FyZFBvc2l0aW9uIG1fd2lsZGNhcmQ7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1fcGF0dGVybjsKKyAgICB9OworfQorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFRlc3RTcGVjIHsKKyAgICAgICAgc3RydWN0IFBhdHRlcm4gOiBTaGFyZWRJbXBsPD4geworICAgICAgICAgICAgdmlydHVhbCB+UGF0dGVybigpOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2UgKSBjb25zdCA9IDA7CisgICAgICAgIH07CisgICAgICAgIGNsYXNzIE5hbWVQYXR0ZXJuIDogcHVibGljIFBhdHRlcm4geworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBOYW1lUGF0dGVybiggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUgKQorICAgICAgICAgICAgOiBtX3dpbGRjYXJkUGF0dGVybiggdG9Mb3dlciggbmFtZSApLCBDYXNlU2Vuc2l0aXZlOjpObyApCisgICAgICAgICAgICB7fQorICAgICAgICAgICAgdmlydHVhbCB+TmFtZVBhdHRlcm4oKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaGVzKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBtX3dpbGRjYXJkUGF0dGVybi5tYXRjaGVzKCB0b0xvd2VyKCB0ZXN0Q2FzZS5uYW1lICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIFdpbGRjYXJkUGF0dGVybiBtX3dpbGRjYXJkUGF0dGVybjsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBUYWdQYXR0ZXJuIDogcHVibGljIFBhdHRlcm4geworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBUYWdQYXR0ZXJuKCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnICkgOiBtX3RhZyggdG9Mb3dlciggdGFnICkgKSB7fQorICAgICAgICAgICAgdmlydHVhbCB+VGFnUGF0dGVybigpOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2UgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RDYXNlLmxjYXNlVGFncy5maW5kKCBtX3RhZyApICE9IHRlc3RDYXNlLmxjYXNlVGFncy5lbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1fdGFnOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIEV4Y2x1ZGVkUGF0dGVybiA6IHB1YmxpYyBQYXR0ZXJuIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgRXhjbHVkZWRQYXR0ZXJuKCBQdHI8UGF0dGVybj4gY29uc3QmIHVuZGVybHlpbmdQYXR0ZXJuICkgOiBtX3VuZGVybHlpbmdQYXR0ZXJuKCB1bmRlcmx5aW5nUGF0dGVybiApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIH5FeGNsdWRlZFBhdHRlcm4oKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaGVzKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3QgeyByZXR1cm4gIW1fdW5kZXJseWluZ1BhdHRlcm4tPm1hdGNoZXMoIHRlc3RDYXNlICk7IH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIFB0cjxQYXR0ZXJuPiBtX3VuZGVybHlpbmdQYXR0ZXJuOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBGaWx0ZXIgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UHRyPFBhdHRlcm4+ID4gbV9wYXR0ZXJuczsKKworICAgICAgICAgICAgYm9vbCBtYXRjaGVzKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3QgeworICAgICAgICAgICAgICAgIC8vIEFsbCBwYXR0ZXJucyBpbiBhIGZpbHRlciBtdXN0IG1hdGNoIGZvciB0aGUgZmlsdGVyIHRvIGJlIGEgbWF0Y2gKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFB0cjxQYXR0ZXJuPiA+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcGF0dGVybnMuYmVnaW4oKSwgaXRFbmQgPSBtX3BhdHRlcm5zLmVuZCgpOyBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoICEoKml0KS0+bWF0Y2hlcyggdGVzdENhc2UgKSApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgcHVibGljOgorICAgICAgICBib29sIGhhc0ZpbHRlcnMoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gIW1fZmlsdGVycy5lbXB0eSgpOworICAgICAgICB9CisgICAgICAgIGJvb2wgbWF0Y2hlcyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZSApIGNvbnN0IHsKKyAgICAgICAgICAgIC8vIEEgVGVzdFNwZWMgbWF0Y2hlcyBpZiBhbnkgZmlsdGVyIG1hdGNoZXMKKyAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8RmlsdGVyPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2ZpbHRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX2ZpbHRlcnMuZW5kKCk7IGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgICAgICBpZiggaXQtPm1hdGNoZXMoIHRlc3RDYXNlICkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp2ZWN0b3I8RmlsdGVyPiBtX2ZpbHRlcnM7CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIFRlc3RTcGVjUGFyc2VyOworICAgIH07Cit9CisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGVzdFNwZWNQYXJzZXIgeworICAgICAgICBlbnVtIE1vZGV7IE5vbmUsIE5hbWUsIFF1b3RlZE5hbWUsIFRhZywgRXNjYXBlZE5hbWUgfTsKKyAgICAgICAgTW9kZSBtX21vZGU7CisgICAgICAgIGJvb2wgbV9leGNsdXNpb247CisgICAgICAgIHN0ZDo6c2l6ZV90IG1fc3RhcnQsIG1fcG9zOworICAgICAgICBzdGQ6OnN0cmluZyBtX2FyZzsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaXplX3Q+IG1fZXNjYXBlQ2hhcnM7CisgICAgICAgIFRlc3RTcGVjOjpGaWx0ZXIgbV9jdXJyZW50RmlsdGVyOworICAgICAgICBUZXN0U3BlYyBtX3Rlc3RTcGVjOworICAgICAgICBJVGFnQWxpYXNSZWdpc3RyeSBjb25zdCogbV90YWdBbGlhc2VzOworCisgICAgcHVibGljOgorICAgICAgICBUZXN0U3BlY1BhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QmIHRhZ0FsaWFzZXMgKSA6IG1fdGFnQWxpYXNlcyggJnRhZ0FsaWFzZXMgKSB7fQorCisgICAgICAgIFRlc3RTcGVjUGFyc2VyJiBwYXJzZSggc3RkOjpzdHJpbmcgY29uc3QmIGFyZyApIHsKKyAgICAgICAgICAgIG1fbW9kZSA9IE5vbmU7CisgICAgICAgICAgICBtX2V4Y2x1c2lvbiA9IGZhbHNlOworICAgICAgICAgICAgbV9zdGFydCA9IHN0ZDo6c3RyaW5nOjpucG9zOworICAgICAgICAgICAgbV9hcmcgPSBtX3RhZ0FsaWFzZXMtPmV4cGFuZEFsaWFzZXMoIGFyZyApOworICAgICAgICAgICAgbV9lc2NhcGVDaGFycy5jbGVhcigpOworICAgICAgICAgICAgZm9yKCBtX3BvcyA9IDA7IG1fcG9zIDwgbV9hcmcuc2l6ZSgpOyArK21fcG9zICkKKyAgICAgICAgICAgICAgICB2aXNpdENoYXIoIG1fYXJnW21fcG9zXSApOworICAgICAgICAgICAgaWYoIG1fbW9kZSA9PSBOYW1lICkKKyAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuPFRlc3RTcGVjOjpOYW1lUGF0dGVybj4oKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICBUZXN0U3BlYyB0ZXN0U3BlYygpIHsKKyAgICAgICAgICAgIGFkZEZpbHRlcigpOworICAgICAgICAgICAgcmV0dXJuIG1fdGVzdFNwZWM7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIHZpc2l0Q2hhciggY2hhciBjICkgeworICAgICAgICAgICAgaWYoIG1fbW9kZSA9PSBOb25lICkgeworICAgICAgICAgICAgICAgIHN3aXRjaCggYyApIHsKKyAgICAgICAgICAgICAgICBjYXNlICcgJzogcmV0dXJuOworICAgICAgICAgICAgICAgIGNhc2UgJ34nOiBtX2V4Y2x1c2lvbiA9IHRydWU7IHJldHVybjsKKyAgICAgICAgICAgICAgICBjYXNlICdbJzogcmV0dXJuIHN0YXJ0TmV3TW9kZSggVGFnLCArK21fcG9zICk7CisgICAgICAgICAgICAgICAgY2FzZSAnIic6IHJldHVybiBzdGFydE5ld01vZGUoIFF1b3RlZE5hbWUsICsrbV9wb3MgKTsKKyAgICAgICAgICAgICAgICBjYXNlICdcXCc6IHJldHVybiBlc2NhcGUoKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBzdGFydE5ld01vZGUoIE5hbWUsIG1fcG9zICk7IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBtX21vZGUgPT0gTmFtZSApIHsKKyAgICAgICAgICAgICAgICBpZiggYyA9PSAnLCcgKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm48VGVzdFNwZWM6Ok5hbWVQYXR0ZXJuPigpOworICAgICAgICAgICAgICAgICAgICBhZGRGaWx0ZXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggYyA9PSAnWycgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBzdWJTdHJpbmcoKSA9PSAiZXhjbHVkZToiICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZXhjbHVzaW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkUGF0dGVybjxUZXN0U3BlYzo6TmFtZVBhdHRlcm4+KCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0TmV3TW9kZSggVGFnLCArK21fcG9zICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIGMgPT0gJ1xcJyApCisgICAgICAgICAgICAgICAgICAgIGVzY2FwZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggbV9tb2RlID09IEVzY2FwZWROYW1lICkKKyAgICAgICAgICAgICAgICBtX21vZGUgPSBOYW1lOworICAgICAgICAgICAgZWxzZSBpZiggbV9tb2RlID09IFF1b3RlZE5hbWUgJiYgYyA9PSAnIicgKQorICAgICAgICAgICAgICAgIGFkZFBhdHRlcm48VGVzdFNwZWM6Ok5hbWVQYXR0ZXJuPigpOworICAgICAgICAgICAgZWxzZSBpZiggbV9tb2RlID09IFRhZyAmJiBjID09ICddJyApCisgICAgICAgICAgICAgICAgYWRkUGF0dGVybjxUZXN0U3BlYzo6VGFnUGF0dGVybj4oKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHN0YXJ0TmV3TW9kZSggTW9kZSBtb2RlLCBzdGQ6OnNpemVfdCBzdGFydCApIHsKKyAgICAgICAgICAgIG1fbW9kZSA9IG1vZGU7CisgICAgICAgICAgICBtX3N0YXJ0ID0gc3RhcnQ7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBlc2NhcGUoKSB7CisgICAgICAgICAgICBpZiggbV9tb2RlID09IE5vbmUgKQorICAgICAgICAgICAgICAgIG1fc3RhcnQgPSBtX3BvczsKKyAgICAgICAgICAgIG1fbW9kZSA9IEVzY2FwZWROYW1lOworICAgICAgICAgICAgbV9lc2NhcGVDaGFycy5wdXNoX2JhY2soIG1fcG9zICk7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgc3ViU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gbV9hcmcuc3Vic3RyKCBtX3N0YXJ0LCBtX3BvcyAtIG1fc3RhcnQgKTsgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICB2b2lkIGFkZFBhdHRlcm4oKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyB0b2tlbiA9IHN1YlN0cmluZygpOworICAgICAgICAgICAgZm9yKCBzaXplX3QgaSA9IDA7IGkgPCBtX2VzY2FwZUNoYXJzLnNpemUoKTsgKytpICkKKyAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuLnN1YnN0ciggMCwgbV9lc2NhcGVDaGFyc1tpXS1tX3N0YXJ0LWkgKSArIHRva2VuLnN1YnN0ciggbV9lc2NhcGVDaGFyc1tpXS1tX3N0YXJ0LWkrMSApOworICAgICAgICAgICAgbV9lc2NhcGVDaGFycy5jbGVhcigpOworICAgICAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIHRva2VuLCAiZXhjbHVkZToiICkgKSB7CisgICAgICAgICAgICAgICAgbV9leGNsdXNpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW4uc3Vic3RyKCA4ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggIXRva2VuLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgUHRyPFRlc3RTcGVjOjpQYXR0ZXJuPiBwYXR0ZXJuID0gbmV3IFQoIHRva2VuICk7CisgICAgICAgICAgICAgICAgaWYoIG1fZXhjbHVzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9IG5ldyBUZXN0U3BlYzo6RXhjbHVkZWRQYXR0ZXJuKCBwYXR0ZXJuICk7CisgICAgICAgICAgICAgICAgbV9jdXJyZW50RmlsdGVyLm1fcGF0dGVybnMucHVzaF9iYWNrKCBwYXR0ZXJuICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX2V4Y2x1c2lvbiA9IGZhbHNlOworICAgICAgICAgICAgbV9tb2RlID0gTm9uZTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGFkZEZpbHRlcigpIHsKKyAgICAgICAgICAgIGlmKCAhbV9jdXJyZW50RmlsdGVyLm1fcGF0dGVybnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBtX3Rlc3RTcGVjLm1fZmlsdGVycy5wdXNoX2JhY2soIG1fY3VycmVudEZpbHRlciApOworICAgICAgICAgICAgICAgIG1fY3VycmVudEZpbHRlciA9IFRlc3RTcGVjOjpGaWx0ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisgICAgaW5saW5lIFRlc3RTcGVjIHBhcnNlVGVzdFNwZWMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhcmcgKSB7CisgICAgICAgIHJldHVybiBUZXN0U3BlY1BhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpICkucGFyc2UoIGFyZyApLnRlc3RTcGVjKCk7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2ludGVyZmFjZXNfY29uZmlnLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfQ09ORklHX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFZlcmJvc2l0eSB7IGVudW0gTGV2ZWwgeworICAgICAgICBOb091dHB1dCA9IDAsCisgICAgICAgIFF1aWV0LAorICAgICAgICBOb3JtYWwKKyAgICB9OyB9OworCisgICAgc3RydWN0IFdhcm5BYm91dCB7IGVudW0gV2hhdCB7CisgICAgICAgIE5vdGhpbmcgPSAweDAwLAorICAgICAgICBOb0Fzc2VydGlvbnMgPSAweDAxCisgICAgfTsgfTsKKworICAgIHN0cnVjdCBTaG93RHVyYXRpb25zIHsgZW51bSBPck5vdCB7CisgICAgICAgIERlZmF1bHRGb3JSZXBvcnRlciwKKyAgICAgICAgQWx3YXlzLAorICAgICAgICBOZXZlcgorICAgIH07IH07CisgICAgc3RydWN0IFJ1blRlc3RzIHsgZW51bSBJbldoYXRPcmRlciB7CisgICAgICAgIEluRGVjbGFyYXRpb25PcmRlciwKKyAgICAgICAgSW5MZXhpY29ncmFwaGljYWxPcmRlciwKKyAgICAgICAgSW5SYW5kb21PcmRlcgorICAgIH07IH07CisgICAgc3RydWN0IFVzZUNvbG91ciB7IGVudW0gWWVzT3JObyB7CisgICAgICAgIEF1dG8sCisgICAgICAgIFllcywKKyAgICAgICAgTm8KKyAgICB9OyB9OworCisgICAgY2xhc3MgVGVzdFNwZWM7CisKKyAgICBzdHJ1Y3QgSUNvbmZpZyA6IElTaGFyZWQgeworCisgICAgICAgIHZpcnR1YWwgfklDb25maWcoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgYWxsb3dUaHJvd3MoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjpvc3RyZWFtJiBzdHJlYW0oKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgbmFtZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIGluY2x1ZGVTdWNjZXNzZnVsUmVzdWx0cygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIHNob3VsZERlYnVnQnJlYWsoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCB3YXJuQWJvdXRNaXNzaW5nQXNzZXJ0aW9ucygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBpbnQgYWJvcnRBZnRlcigpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIHNob3dJbnZpc2libGVzKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIFNob3dEdXJhdGlvbnM6Ok9yTm90IHNob3dEdXJhdGlvbnMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIFJ1blRlc3RzOjpJbldoYXRPcmRlciBydW5PcmRlcigpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcm5nU2VlZCgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBVc2VDb2xvdXI6Olllc09yTm8gdXNlQ29sb3VyKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgZ2V0U2VjdGlvbnNUb1J1bigpIGNvbnN0ID0gMDsKKworICAgIH07Cit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9zdHJlYW0uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfU1RSRUFNX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3N0cmVhbWJ1Zi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9TVFJFQU1CVUZfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyZWFtYnVmPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgU3RyZWFtQnVmQmFzZSA6IHB1YmxpYyBzdGQ6OnN0cmVhbWJ1ZiB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5TdHJlYW1CdWZCYXNlKCkgQ0FUQ0hfTk9FWENFUFQ7CisgICAgfTsKK30KKworI2luY2x1ZGUgPHN0cmVhbWJ1Zj4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RkOjpvc3RyZWFtJiBjb3V0KCk7CisgICAgc3RkOjpvc3RyZWFtJiBjZXJyKCk7CisKKyAgICBzdHJ1Y3QgSVN0cmVhbSB7CisgICAgICAgIHZpcnR1YWwgfklTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVDsKKyAgICAgICAgdmlydHVhbCBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgY2xhc3MgRmlsZVN0cmVhbSA6IHB1YmxpYyBJU3RyZWFtIHsKKyAgICAgICAgbXV0YWJsZSBzdGQ6Om9mc3RyZWFtIG1fb2ZzOworICAgIHB1YmxpYzoKKyAgICAgICAgRmlsZVN0cmVhbSggc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVuYW1lICk7CisgICAgICAgIHZpcnR1YWwgfkZpbGVTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVDsKKyAgICBwdWJsaWM6IC8vIElTdHJlYW0KKyAgICAgICAgdmlydHVhbCBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0IENBVENIX09WRVJSSURFOworICAgIH07CisKKyAgICBjbGFzcyBDb3V0U3RyZWFtIDogcHVibGljIElTdHJlYW0geworICAgICAgICBtdXRhYmxlIHN0ZDo6b3N0cmVhbSBtX29zOworICAgIHB1YmxpYzoKKyAgICAgICAgQ291dFN0cmVhbSgpOworICAgICAgICB2aXJ0dWFsIH5Db3V0U3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQ7CisKKyAgICBwdWJsaWM6IC8vIElTdHJlYW0KKyAgICAgICAgdmlydHVhbCBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0IENBVENIX09WRVJSSURFOworICAgIH07CisKKyAgICBjbGFzcyBEZWJ1Z091dFN0cmVhbSA6IHB1YmxpYyBJU3RyZWFtIHsKKyAgICAgICAgQ0FUQ0hfQVVUT19QVFIoIFN0cmVhbUJ1ZkJhc2UgKSBtX3N0cmVhbUJ1ZjsKKyAgICAgICAgbXV0YWJsZSBzdGQ6Om9zdHJlYW0gbV9vczsKKyAgICBwdWJsaWM6CisgICAgICAgIERlYnVnT3V0U3RyZWFtKCk7CisgICAgICAgIHZpcnR1YWwgfkRlYnVnT3V0U3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQ7CisKKyAgICBwdWJsaWM6IC8vIElTdHJlYW0KKyAgICAgICAgdmlydHVhbCBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0IENBVENIX09WRVJSSURFOworICAgIH07Cit9CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKKyNpZm5kZWYgQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyNkZWZpbmUgQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEggODAKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IENvbmZpZ0RhdGEgeworCisgICAgICAgIENvbmZpZ0RhdGEoKQorICAgICAgICA6ICAgbGlzdFRlc3RzKCBmYWxzZSApLAorICAgICAgICAgICAgbGlzdFRhZ3MoIGZhbHNlICksCisgICAgICAgICAgICBsaXN0UmVwb3J0ZXJzKCBmYWxzZSApLAorICAgICAgICAgICAgbGlzdFRlc3ROYW1lc09ubHkoIGZhbHNlICksCisgICAgICAgICAgICBzaG93U3VjY2Vzc2Z1bFRlc3RzKCBmYWxzZSApLAorICAgICAgICAgICAgc2hvdWxkRGVidWdCcmVhayggZmFsc2UgKSwKKyAgICAgICAgICAgIG5vVGhyb3coIGZhbHNlICksCisgICAgICAgICAgICBzaG93SGVscCggZmFsc2UgKSwKKyAgICAgICAgICAgIHNob3dJbnZpc2libGVzKCBmYWxzZSApLAorICAgICAgICAgICAgZmlsZW5hbWVzQXNUYWdzKCBmYWxzZSApLAorICAgICAgICAgICAgYWJvcnRBZnRlciggLTEgKSwKKyAgICAgICAgICAgIHJuZ1NlZWQoIDAgKSwKKyAgICAgICAgICAgIHZlcmJvc2l0eSggVmVyYm9zaXR5OjpOb3JtYWwgKSwKKyAgICAgICAgICAgIHdhcm5pbmdzKCBXYXJuQWJvdXQ6Ok5vdGhpbmcgKSwKKyAgICAgICAgICAgIHNob3dEdXJhdGlvbnMoIFNob3dEdXJhdGlvbnM6OkRlZmF1bHRGb3JSZXBvcnRlciApLAorICAgICAgICAgICAgcnVuT3JkZXIoIFJ1blRlc3RzOjpJbkRlY2xhcmF0aW9uT3JkZXIgKSwKKyAgICAgICAgICAgIHVzZUNvbG91ciggVXNlQ29sb3VyOjpBdXRvICkKKyAgICAgICAge30KKworICAgICAgICBib29sIGxpc3RUZXN0czsKKyAgICAgICAgYm9vbCBsaXN0VGFnczsKKyAgICAgICAgYm9vbCBsaXN0UmVwb3J0ZXJzOworICAgICAgICBib29sIGxpc3RUZXN0TmFtZXNPbmx5OworCisgICAgICAgIGJvb2wgc2hvd1N1Y2Nlc3NmdWxUZXN0czsKKyAgICAgICAgYm9vbCBzaG91bGREZWJ1Z0JyZWFrOworICAgICAgICBib29sIG5vVGhyb3c7CisgICAgICAgIGJvb2wgc2hvd0hlbHA7CisgICAgICAgIGJvb2wgc2hvd0ludmlzaWJsZXM7CisgICAgICAgIGJvb2wgZmlsZW5hbWVzQXNUYWdzOworCisgICAgICAgIGludCBhYm9ydEFmdGVyOworICAgICAgICB1bnNpZ25lZCBpbnQgcm5nU2VlZDsKKworICAgICAgICBWZXJib3NpdHk6OkxldmVsIHZlcmJvc2l0eTsKKyAgICAgICAgV2FybkFib3V0OjpXaGF0IHdhcm5pbmdzOworICAgICAgICBTaG93RHVyYXRpb25zOjpPck5vdCBzaG93RHVyYXRpb25zOworICAgICAgICBSdW5UZXN0czo6SW5XaGF0T3JkZXIgcnVuT3JkZXI7CisgICAgICAgIFVzZUNvbG91cjo6WWVzT3JObyB1c2VDb2xvdXI7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgb3V0cHV0RmlsZW5hbWU7CisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIHN0ZDo6c3RyaW5nIHByb2Nlc3NOYW1lOworCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXBvcnRlck5hbWVzOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdGVzdHNPclRhZ3M7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzZWN0aW9uc1RvUnVuOworICAgIH07CisKKyAgICBjbGFzcyBDb25maWcgOiBwdWJsaWMgU2hhcmVkSW1wbDxJQ29uZmlnPiB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgQ29uZmlnKCBDb25maWcgY29uc3QmIG90aGVyICk7CisgICAgICAgIENvbmZpZyYgb3BlcmF0b3IgPSAoIENvbmZpZyBjb25zdCYgb3RoZXIgKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGR1bW15KCk7CisgICAgcHVibGljOgorCisgICAgICAgIENvbmZpZygpCisgICAgICAgIHt9CisKKyAgICAgICAgQ29uZmlnKCBDb25maWdEYXRhIGNvbnN0JiBkYXRhICkKKyAgICAgICAgOiAgIG1fZGF0YSggZGF0YSApLAorICAgICAgICAgICAgbV9zdHJlYW0oIG9wZW5TdHJlYW0oKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAhZGF0YS50ZXN0c09yVGFncy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIFRlc3RTcGVjUGFyc2VyIHBhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpICk7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IGRhdGEudGVzdHNPclRhZ3Muc2l6ZSgpOyArK2kgKQorICAgICAgICAgICAgICAgICAgICBwYXJzZXIucGFyc2UoIGRhdGEudGVzdHNPclRhZ3NbaV0gKTsKKyAgICAgICAgICAgICAgICBtX3Rlc3RTcGVjID0gcGFyc2VyLnRlc3RTcGVjKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5Db25maWcoKSB7fQorCisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBnZXRGaWxlbmFtZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2RhdGEub3V0cHV0RmlsZW5hbWUgOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBsaXN0VGVzdHMoKSBjb25zdCB7IHJldHVybiBtX2RhdGEubGlzdFRlc3RzOyB9CisgICAgICAgIGJvb2wgbGlzdFRlc3ROYW1lc09ubHkoKSBjb25zdCB7IHJldHVybiBtX2RhdGEubGlzdFRlc3ROYW1lc09ubHk7IH0KKyAgICAgICAgYm9vbCBsaXN0VGFncygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5saXN0VGFnczsgfQorICAgICAgICBib29sIGxpc3RSZXBvcnRlcnMoKSBjb25zdCB7IHJldHVybiBtX2RhdGEubGlzdFJlcG9ydGVyczsgfQorCisgICAgICAgIHN0ZDo6c3RyaW5nIGdldFByb2Nlc3NOYW1lKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLnByb2Nlc3NOYW1lOyB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBnZXRSZXBvcnRlck5hbWVzKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLnJlcG9ydGVyTmFtZXM7IH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBnZXRTZWN0aW9uc1RvUnVuKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gbV9kYXRhLnNlY3Rpb25zVG9SdW47IH0KKworICAgICAgICB2aXJ0dWFsIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYygpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIG1fdGVzdFNwZWM7IH0KKworICAgICAgICBib29sIHNob3dIZWxwKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLnNob3dIZWxwOyB9CisKKyAgICAgICAgLy8gSUNvbmZpZyBpbnRlcmZhY2UKKyAgICAgICAgdmlydHVhbCBib29sIGFsbG93VGhyb3dzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgICAgICAgICAgICAgICAgIHsgcmV0dXJuICFtX2RhdGEubm9UaHJvdzsgfQorICAgICAgICB2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgICAgICAgICAgICAgeyByZXR1cm4gbV9zdHJlYW0tPnN0cmVhbSgpOyB9CisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgbmFtZSgpIGNvbnN0IENBVENIX09WRVJSSURFICAgICAgICAgICAgICAgICB7IHJldHVybiBtX2RhdGEubmFtZS5lbXB0eSgpID8gbV9kYXRhLnByb2Nlc3NOYW1lIDogbV9kYXRhLm5hbWU7IH0KKyAgICAgICAgdmlydHVhbCBib29sIGluY2x1ZGVTdWNjZXNzZnVsUmVzdWx0cygpIGNvbnN0IENBVENIX09WRVJSSURFICAgIHsgcmV0dXJuIG1fZGF0YS5zaG93U3VjY2Vzc2Z1bFRlc3RzOyB9CisgICAgICAgIHZpcnR1YWwgYm9vbCB3YXJuQWJvdXRNaXNzaW5nQXNzZXJ0aW9ucygpIGNvbnN0IENBVENIX09WRVJSSURFICB7IHJldHVybiBtX2RhdGEud2FybmluZ3MgJiBXYXJuQWJvdXQ6Ok5vQXNzZXJ0aW9uczsgfQorICAgICAgICB2aXJ0dWFsIFNob3dEdXJhdGlvbnM6Ok9yTm90IHNob3dEdXJhdGlvbnMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBtX2RhdGEuc2hvd0R1cmF0aW9uczsgfQorICAgICAgICB2aXJ0dWFsIFJ1blRlc3RzOjpJbldoYXRPcmRlciBydW5PcmRlcigpIGNvbnN0IENBVENIX09WRVJSSURFICAgeyByZXR1cm4gbV9kYXRhLnJ1bk9yZGVyOyB9CisgICAgICAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJuZ1NlZWQoKSBjb25zdCBDQVRDSF9PVkVSUklERSAgICAgICAgICAgICB7IHJldHVybiBtX2RhdGEucm5nU2VlZDsgfQorICAgICAgICB2aXJ0dWFsIFVzZUNvbG91cjo6WWVzT3JObyB1c2VDb2xvdXIoKSBjb25zdCBDQVRDSF9PVkVSUklERSAgICAgeyByZXR1cm4gbV9kYXRhLnVzZUNvbG91cjsgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkRGVidWdCcmVhaygpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIG1fZGF0YS5zaG91bGREZWJ1Z0JyZWFrOyB9CisgICAgICAgIHZpcnR1YWwgaW50IGFib3J0QWZ0ZXIoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBtX2RhdGEuYWJvcnRBZnRlcjsgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgc2hvd0ludmlzaWJsZXMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBtX2RhdGEuc2hvd0ludmlzaWJsZXM7IH0KKworICAgIHByaXZhdGU6CisKKyAgICAgICAgSVN0cmVhbSBjb25zdCogb3BlblN0cmVhbSgpIHsKKyAgICAgICAgICAgIGlmKCBtX2RhdGEub3V0cHV0RmlsZW5hbWUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb3V0U3RyZWFtKCk7CisgICAgICAgICAgICBlbHNlIGlmKCBtX2RhdGEub3V0cHV0RmlsZW5hbWVbMF0gPT0gJyUnICkgeworICAgICAgICAgICAgICAgIGlmKCBtX2RhdGEub3V0cHV0RmlsZW5hbWUgPT0gIiVkZWJ1ZyIgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERlYnVnT3V0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmRvbWFpbl9lcnJvciggIlVucmVjb2duaXNlZCBzdHJlYW06ICIgKyBtX2RhdGEub3V0cHV0RmlsZW5hbWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVTdHJlYW0oIG1fZGF0YS5vdXRwdXRGaWxlbmFtZSApOworICAgICAgICB9CisgICAgICAgIENvbmZpZ0RhdGEgbV9kYXRhOworCisgICAgICAgIENBVENIX0FVVE9fUFRSKCBJU3RyZWFtIGNvbnN0ICkgbV9zdHJlYW07CisgICAgICAgIFRlc3RTcGVjIG1fdGVzdFNwZWM7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jbGFyYS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DTEFSQV9IX0lOQ0xVREVECisKKy8vIFVzZSBDYXRjaCdzIHZhbHVlIGZvciBjb25zb2xlIHdpZHRoIChzdG9yZSBDbGFyYSdzIG9mZiB0byB0aGUgc2lkZSwgaWYgcHJlc2VudCkKKyNpZmRlZiBDTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSAorI2RlZmluZSBDQVRDSF9URU1QX0NMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRIIENMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRICisjdW5kZWYgQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyNlbmRpZgorI2RlZmluZSBDTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSAorCisvLyBEZWNsYXJlIENsYXJhIGluc2lkZSB0aGUgQ2F0Y2ggbmFtZXNwYWNlCisjZGVmaW5lIFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRSBuYW1lc3BhY2UgQ2F0Y2ggeworLy8gI2luY2x1ZGVkIGZyb206IC4uL2V4dGVybmFsL2NsYXJhLmgKKworLy8gVmVyc2lvbiAwLjAuMi40CisKKy8vIE9ubHkgdXNlIGhlYWRlciBndWFyZCBpZiB3ZSBhcmUgbm90IHVzaW5nIGFuIG91dGVyIG5hbWVzcGFjZQorI2lmICFkZWZpbmVkKFRXT0JMVUVDVUJFU19DTEFSQV9IX0lOQ0xVREVEKSB8fCBkZWZpbmVkKFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRSkKKworI2lmbmRlZiBTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NMQVJBX0hfSU5DTFVERUQKKyNkZWZpbmUgU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFCisjZGVmaW5lIFNUSVRDSF9DTEFSQV9DTE9TRV9OQU1FU1BBQ0UKKyNlbHNlCisjZGVmaW5lIFNUSVRDSF9DTEFSQV9DTE9TRV9OQU1FU1BBQ0UgfQorI2VuZGlmCisKKyNkZWZpbmUgU1RJVENIX1RCQ19URVhUX0ZPUk1BVF9PUEVOX05BTUVTUEFDRSBTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UKKworLy8gLS0tLS0tLS0tLS0gI2luY2x1ZGVkIGZyb20gdGJjX3RleHRfZm9ybWF0LmggLS0tLS0tLS0tLS0KKworLy8gT25seSB1c2UgaGVhZGVyIGd1YXJkIGlmIHdlIGFyZSBub3QgdXNpbmcgYW4gb3V0ZXIgbmFtZXNwYWNlCisjaWYgIWRlZmluZWQoVEJDX1RFWFRfRk9STUFUX0hfSU5DTFVERUQpIHx8IGRlZmluZWQoU1RJVENIX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UpCisjaWZuZGVmIFNUSVRDSF9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFCisjZGVmaW5lIFRCQ19URVhUX0ZPUk1BVF9IX0lOQ0xVREVECisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2N0eXBlPgorCisvLyBVc2Ugb3B0aW9uYWwgb3V0ZXIgbmFtZXNwYWNlCisjaWZkZWYgU1RJVENIX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKK25hbWVzcGFjZSBTVElUQ0hfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRSB7CisjZW5kaWYKKworbmFtZXNwYWNlIFRiYyB7CisKKyNpZmRlZiBUQkNfVEVYVF9GT1JNQVRfQ09OU09MRV9XSURUSAorICAgIGNvbnN0IHVuc2lnbmVkIGludCBjb25zb2xlV2lkdGggPSBUQkNfVEVYVF9GT1JNQVRfQ09OU09MRV9XSURUSDsKKyNlbHNlCisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvbnNvbGVXaWR0aCA9IDgwOworI2VuZGlmCisKKyAgICBzdHJ1Y3QgVGV4dEF0dHJpYnV0ZXMgeworICAgICAgICBUZXh0QXR0cmlidXRlcygpCisgICAgICAgIDogICBpbml0aWFsSW5kZW50KCBzdGQ6OnN0cmluZzo6bnBvcyApLAorICAgICAgICAgICAgaW5kZW50KCAwICksCisgICAgICAgICAgICB3aWR0aCggY29uc29sZVdpZHRoLTEgKSwKKyAgICAgICAgICAgIHRhYkNoYXIoICdcdCcgKQorICAgICAgICB7fQorCisgICAgICAgIFRleHRBdHRyaWJ1dGVzJiBzZXRJbml0aWFsSW5kZW50KCBzdGQ6OnNpemVfdCBfdmFsdWUgKSAgeyBpbml0aWFsSW5kZW50ID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMmIHNldEluZGVudCggc3RkOjpzaXplX3QgX3ZhbHVlICkgICAgICAgICB7IGluZGVudCA9IF92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFRleHRBdHRyaWJ1dGVzJiBzZXRXaWR0aCggc3RkOjpzaXplX3QgX3ZhbHVlICkgICAgICAgICAgeyB3aWR0aCA9IF92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFRleHRBdHRyaWJ1dGVzJiBzZXRUYWJDaGFyKCBjaGFyIF92YWx1ZSApICAgICAgICAgICAgICAgeyB0YWJDaGFyID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgICBzdGQ6OnNpemVfdCBpbml0aWFsSW5kZW50OyAgLy8gaW5kZW50IG9mIGZpcnN0IGxpbmUsIG9yIG5wb3MKKyAgICAgICAgc3RkOjpzaXplX3QgaW5kZW50OyAgICAgICAgIC8vIGluZGVudCBvZiBzdWJzZXF1ZW50IGxpbmVzLCBvciBhbGwgaWYgaW5pdGlhbEluZGVudCBpcyBucG9zCisgICAgICAgIHN0ZDo6c2l6ZV90IHdpZHRoOyAgICAgICAgICAvLyBtYXhpbXVtIHdpZHRoIG9mIHRleHQsIGluY2x1ZGluZyBpbmRlbnQuIExvbmdlciB0ZXh0IHdpbGwgd3JhcAorICAgICAgICBjaGFyIHRhYkNoYXI7ICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBjaGFyIGlzIHNlZW4gdGhlIGluZGVudCBpcyBjaGFuZ2VkIHRvIGN1cnJlbnQgcG9zCisgICAgfTsKKworICAgIGNsYXNzIFRleHQgeworICAgIHB1YmxpYzoKKyAgICAgICAgVGV4dCggc3RkOjpzdHJpbmcgY29uc3QmIF9zdHIsIFRleHRBdHRyaWJ1dGVzIGNvbnN0JiBfYXR0ciA9IFRleHRBdHRyaWJ1dGVzKCkgKQorICAgICAgICA6IGF0dHIoIF9hdHRyICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgd3JhcHBhYmxlQ2hhcnMgPSAiIFsoey4sL3xcXC0iOworICAgICAgICAgICAgc3RkOjpzaXplX3QgaW5kZW50ID0gX2F0dHIuaW5pdGlhbEluZGVudCAhPSBzdGQ6OnN0cmluZzo6bnBvcworICAgICAgICAgICAgICAgID8gX2F0dHIuaW5pdGlhbEluZGVudAorICAgICAgICAgICAgICAgIDogX2F0dHIuaW5kZW50OworICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVtYWluZGVyID0gX3N0cjsKKworICAgICAgICAgICAgd2hpbGUoICFyZW1haW5kZXIuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBpZiggbGluZXMuc2l6ZSgpID49IDEwMDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2hfYmFjayggIi4uLiBtZXNzYWdlIHRydW5jYXRlZCBkdWUgdG8gZXhjZXNzaXZlIHNpemUiICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgdGFiUG9zID0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3Qgd2lkdGggPSAoc3RkOjptaW4pKCByZW1haW5kZXIuc2l6ZSgpLCBfYXR0ci53aWR0aCAtIGluZGVudCApOworICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHBvcyA9IHJlbWFpbmRlci5maW5kX2ZpcnN0X29mKCAnXG4nICk7CisgICAgICAgICAgICAgICAgaWYoIHBvcyA8PSB3aWR0aCApIHsKKyAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBwb3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBvcyA9IHJlbWFpbmRlci5maW5kX2xhc3Rfb2YoIF9hdHRyLnRhYkNoYXIsIHdpZHRoICk7CisgICAgICAgICAgICAgICAgaWYoIHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyApIHsKKyAgICAgICAgICAgICAgICAgICAgdGFiUG9zID0gcG9zOworICAgICAgICAgICAgICAgICAgICBpZiggcmVtYWluZGVyW3dpZHRoXSA9PSAnXG4nICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLS07CisgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlciA9IHJlbWFpbmRlci5zdWJzdHIoIDAsIHRhYlBvcyApICsgcmVtYWluZGVyLnN1YnN0ciggdGFiUG9zKzEgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggd2lkdGggPT0gcmVtYWluZGVyLnNpemUoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgc3BsaWNlTGluZSggaW5kZW50LCByZW1haW5kZXIsIHdpZHRoICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIHJlbWFpbmRlclt3aWR0aF0gPT0gJ1xuJyApIHsKKyAgICAgICAgICAgICAgICAgICAgc3BsaWNlTGluZSggaW5kZW50LCByZW1haW5kZXIsIHdpZHRoICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCB3aWR0aCA8PSAxIHx8IHJlbWFpbmRlci5zaXplKCkgIT0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5kZXIgPSByZW1haW5kZXIuc3Vic3RyKCAxICk7CisgICAgICAgICAgICAgICAgICAgIGluZGVudCA9IF9hdHRyLmluZGVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBvcyA9IHJlbWFpbmRlci5maW5kX2xhc3Rfb2YoIHdyYXBwYWJsZUNoYXJzLCB3aWR0aCApOworICAgICAgICAgICAgICAgICAgICBpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICYmIHBvcyA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGxpY2VMaW5lKCBpbmRlbnQsIHJlbWFpbmRlciwgcG9zICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggcmVtYWluZGVyWzBdID09ICcgJyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyID0gcmVtYWluZGVyLnN1YnN0ciggMSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3BsaWNlTGluZSggaW5kZW50LCByZW1haW5kZXIsIHdpZHRoLTEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLmJhY2soKSArPSAiLSI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoIGxpbmVzLnNpemUoKSA9PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCA9IF9hdHRyLmluZGVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHRhYlBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gdGFiUG9zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc3BsaWNlTGluZSggc3RkOjpzaXplX3QgX2luZGVudCwgc3RkOjpzdHJpbmcmIF9yZW1haW5kZXIsIHN0ZDo6c2l6ZV90IF9wb3MgKSB7CisgICAgICAgICAgICBsaW5lcy5wdXNoX2JhY2soIHN0ZDo6c3RyaW5nKCBfaW5kZW50LCAnICcgKSArIF9yZW1haW5kZXIuc3Vic3RyKCAwLCBfcG9zICkgKTsKKyAgICAgICAgICAgIF9yZW1haW5kZXIgPSBfcmVtYWluZGVyLnN1YnN0ciggX3BvcyApOworICAgICAgICB9CisKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gbGluZXMuYmVnaW4oKTsgfQorICAgICAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBsaW5lcy5lbmQoKTsgfQorICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgbGFzdCgpIGNvbnN0IHsgcmV0dXJuIGxpbmVzLmJhY2soKTsgfQorICAgICAgICBzdGQ6OnNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbGluZXMuc2l6ZSgpOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcGVyYXRvcltdKCBzdGQ6OnNpemVfdCBfaW5kZXggKSBjb25zdCB7IHJldHVybiBsaW5lc1tfaW5kZXhdOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCAqdGhpczsKKyAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIF9zdHJlYW0sIFRleHQgY29uc3QmIF90ZXh0ICkgeworICAgICAgICAgICAgZm9yKCBUZXh0Ojpjb25zdF9pdGVyYXRvciBpdCA9IF90ZXh0LmJlZ2luKCksIGl0RW5kID0gX3RleHQuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgaWYoIGl0ICE9IF90ZXh0LmJlZ2luKCkgKQorICAgICAgICAgICAgICAgICAgICBfc3RyZWFtIDw8ICJcbiI7CisgICAgICAgICAgICAgICAgX3N0cmVhbSA8PCAqaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX3N0cmVhbTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RyOworICAgICAgICBUZXh0QXR0cmlidXRlcyBhdHRyOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGluZXM7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIFRiYworCisjaWZkZWYgU1RJVENIX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKK30gLy8gZW5kIG91dGVyIG5hbWVzcGFjZQorI2VuZGlmCisKKyNlbmRpZiAvLyBUQkNfVEVYVF9GT1JNQVRfSF9JTkNMVURFRAorCisvLyAtLS0tLS0tLS0tLSBlbmQgb2YgI2luY2x1ZGUgZnJvbSB0YmNfdGV4dF9mb3JtYXQuaCAtLS0tLS0tLS0tLQorLy8gLi4uLi4uLi4uLi4gYmFjayBpbiBjbGFyYS5oCisKKyN1bmRlZiBTVElUQ0hfVEJDX1RFWFRfRk9STUFUX09QRU5fTkFNRVNQQUNFCisKKy8vIC0tLS0tLS0tLS0tICNpbmNsdWRlZCBmcm9tIGNsYXJhX2NvbXBpbGVycy5oIC0tLS0tLS0tLS0tCisKKyNpZm5kZWYgVFdPQkxVRUNVQkVTX0NMQVJBX0NPTVBJTEVSU19IX0lOQ0xVREVECisjZGVmaW5lIFRXT0JMVUVDVUJFU19DTEFSQV9DT01QSUxFUlNfSF9JTkNMVURFRAorCisvLyBEZXRlY3QgYSBudW1iZXIgb2YgY29tcGlsZXIgZmVhdHVyZXMgLSBtb3N0bHkgQysrMTEvMTQgY29uZm9ybWFuY2UgLSBieSBjb21waWxlcgorLy8gVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgZGVmaW5lZDoKKy8vCisvLyBDTEFSQV9DT05GSUdfQ1BQMTFfTlVMTFBUUiA6IGlzIG51bGxwdHIgc3VwcG9ydGVkPworLy8gQ0xBUkFfQ09ORklHX0NQUDExX05PRVhDRVBUIDogaXMgbm9leGNlcHQgc3VwcG9ydGVkPworLy8gQ0xBUkFfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTIDogVGhlIGRlbGV0ZSBhbmQgZGVmYXVsdCBrZXl3b3JkcyBmb3IgY29tcGlsZXIgZ2VuZXJhdGVkIG1ldGhvZHMKKy8vIENMQVJBX0NPTkZJR19DUFAxMV9PVkVSUklERSA6IGlzIG92ZXJyaWRlIHN1cHBvcnRlZD8KKy8vIENMQVJBX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSIDogaXMgdW5pcXVlX3B0ciBzdXBwb3J0ZWQgKG90aGVyd2lzZSB1c2UgYXV0b19wdHIpCisKKy8vIENMQVJBX0NPTkZJR19DUFAxMV9PUl9HUkVBVEVSIDogSXMgQysrMTEgc3VwcG9ydGVkPworCisvLyBDTEFSQV9DT05GSUdfVkFSSUFESUNfTUFDUk9TIDogYXJlIHZhcmlhZGljIG1hY3JvcyBzdXBwb3J0ZWQ/CisKKy8vIEluIGdlbmVyYWwgZWFjaCBtYWNybyBoYXMgYSBfTk9fPGZlYXR1cmUgbmFtZT4gZm9ybQorLy8gKGUuZy4gQ0xBUkFfQ09ORklHX0NQUDExX05PX05VTExQVFIpIHdoaWNoIGRpc2FibGVzIHRoZSBmZWF0dXJlLgorLy8gTWFueSBmZWF0dXJlcywgYXQgcG9pbnQgb2YgZGV0ZWN0aW9uLCBkZWZpbmUgYW4gX0lOVEVSTkFMXyBtYWNybywgc28gdGhleQorLy8gY2FuIGJlIGNvbWJpbmVkLCBlbi1tYXNzLCB3aXRoIHRoZSBfTk9fIGZvcm1zIGxhdGVyLgorCisvLyBBbGwgdGhlIEMrKzExIGZlYXR1cmVzIGNhbiBiZSBkaXNhYmxlZCB3aXRoIENMQVJBX0NPTkZJR19OT19DUFAxMQorCisjaWZkZWYgX19jbGFuZ19fCisKKyNpZiBfX2hhc19mZWF0dXJlKGN4eF9udWxscHRyKQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorI2VuZGlmCisKKyNpZiBfX2hhc19mZWF0dXJlKGN4eF9ub2V4Y2VwdCkKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjZW5kaWYKKworI2VuZGlmIC8vIF9fY2xhbmdfXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gR0NDCisjaWZkZWYgX19HTlVDX18KKworI2lmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPj0gNiAmJiBkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorI2VuZGlmCisKKy8vIC0gb3RoZXJ3aXNlIG1vcmUgcmVjZW50IHZlcnNpb25zIGRlZmluZSBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisvLyBhbmQgd2lsbCBnZXQgcGlja2VkIHVwIGJlbG93CisKKyNlbmRpZiAvLyBfX0dOVUNfXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVmlzdWFsIEMrKworI2lmZGVmIF9NU0NfVkVSCisKKyNpZiAoX01TQ19WRVIgPj0gMTYwMCkKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyNlbmRpZgorCisjaWYgKF9NU0NfVkVSID49IDE5MDAgKSAvLyAoVkMrKyAxMyAoVlMyMDE1KSkKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworI2VuZGlmCisKKyNlbmRpZiAvLyBfTVNDX1ZFUgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQysrIGxhbmd1YWdlIGZlYXR1cmUgc3VwcG9ydAorCisvLyBjYXRjaCBhbGwgc3VwcG9ydCBmb3IgQysrMTEKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKKyNkZWZpbmUgQ0xBUkFfQ1BQMTFfT1JfR1JFQVRFUgorCisjaWYgIWRlZmluZWQoQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIpCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjZW5kaWYKKworI2lmbmRlZiBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjZW5kaWYKKworI2lmbmRlZiBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjZW5kaWYKKworI2lmICFkZWZpbmVkKENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9PVkVSUklERSkKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX09WRVJSSURFCisjZW5kaWYKKyNpZiAhZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUikKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyNlbmRpZgorCisjZW5kaWYgLy8gX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCisvLyBOb3cgc2V0IHRoZSBhY3R1YWwgZGVmaW5lcyBiYXNlZCBvbiB0aGUgYWJvdmUgKyBhbnl0aGluZyB0aGUgdXNlciBoYXMgY29uZmlndXJlZAorI2lmIGRlZmluZWQoQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9OT19OVUxMUFRSKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfQ1BQMTFfTlVMTFBUUikgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX05PX0NQUDExKQorI2RlZmluZSBDTEFSQV9DT05GSUdfQ1BQMTFfTlVMTFBUUgorI2VuZGlmCisjaWYgZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9OT19OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX05PRVhDRVBUKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fQ1BQMTEpCisjZGVmaW5lIENMQVJBX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorI2VuZGlmCisjaWYgZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9OT19HRU5FUkFURURfTUVUSE9EUykgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fQ1BQMTEpCisjZGVmaW5lIENMQVJBX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworI2VuZGlmCisjaWYgZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19OT19PVkVSUklERSkgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX09WRVJSSURFKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fQ1BQMTEpCisjZGVmaW5lIENMQVJBX0NPTkZJR19DUFAxMV9PVkVSUklERQorI2VuZGlmCisjaWYgZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUikgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX05PX1VOSVFVRV9QVFIpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fQ1BQMTEpCisjZGVmaW5lIENMQVJBX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjZW5kaWYKKworLy8gbm9leGNlcHQgc3VwcG9ydDoKKyNpZiBkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0xBUkFfTk9FWENFUFQpCisjZGVmaW5lIENMQVJBX05PRVhDRVBUIG5vZXhjZXB0CisjICBkZWZpbmUgQ0xBUkFfTk9FWENFUFRfSVMoeCkgbm9leGNlcHQoeCkKKyNlbHNlCisjZGVmaW5lIENMQVJBX05PRVhDRVBUIHRocm93KCkKKyMgIGRlZmluZSBDTEFSQV9OT0VYQ0VQVF9JUyh4KQorI2VuZGlmCisKKy8vIG51bGxwdHIgc3VwcG9ydAorI2lmZGVmIENMQVJBX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjZGVmaW5lIENMQVJBX05VTEwgbnVsbHB0cgorI2Vsc2UKKyNkZWZpbmUgQ0xBUkFfTlVMTCBOVUxMCisjZW5kaWYKKworLy8gb3ZlcnJpZGUgc3VwcG9ydAorI2lmZGVmIENMQVJBX0NPTkZJR19DUFAxMV9PVkVSUklERQorI2RlZmluZSBDTEFSQV9PVkVSUklERSBvdmVycmlkZQorI2Vsc2UKKyNkZWZpbmUgQ0xBUkFfT1ZFUlJJREUKKyNlbmRpZgorCisvLyB1bmlxdWVfcHRyIHN1cHBvcnQKKyNpZmRlZiBDTEFSQV9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUgorIyAgIGRlZmluZSBDTEFSQV9BVVRPX1BUUiggVCApIHN0ZDo6dW5pcXVlX3B0cjxUPgorI2Vsc2UKKyMgICBkZWZpbmUgQ0xBUkFfQVVUT19QVFIoIFQgKSBzdGQ6OmF1dG9fcHRyPFQ+CisjZW5kaWYKKworI2VuZGlmIC8vIFRXT0JMVUVDVUJFU19DTEFSQV9DT01QSUxFUlNfSF9JTkNMVURFRAorCisvLyAtLS0tLS0tLS0tLSBlbmQgb2YgI2luY2x1ZGUgZnJvbSBjbGFyYV9jb21waWxlcnMuaCAtLS0tLS0tLS0tLQorLy8gLi4uLi4uLi4uLi4gYmFjayBpbiBjbGFyYS5oCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgQ0xBUkFfUExBVEZPUk1fV0lORE9XUworI2VuZGlmCisKKy8vIFVzZSBvcHRpb25hbCBvdXRlciBuYW1lc3BhY2UKKyNpZmRlZiBTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UKK1NUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRQorI2VuZGlmCisKK25hbWVzcGFjZSBDbGFyYSB7CisKKyAgICBzdHJ1Y3QgVW5wb3NpdGlvbmFsVGFnIHt9OworCisgICAgZXh0ZXJuIFVucG9zaXRpb25hbFRhZyBfOworCisjaWZkZWYgQ0xBUkFfQ09ORklHX01BSU4KKyAgICBVbnBvc2l0aW9uYWxUYWcgXzsKKyNlbmRpZgorCisgICAgbmFtZXNwYWNlIERldGFpbCB7CisKKyNpZmRlZiBDTEFSQV9DT05TT0xFX1dJRFRICisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvbnNvbGVXaWR0aCA9IENMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRIOworI2Vsc2UKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgY29uc29sZVdpZHRoID0gODA7CisjZW5kaWYKKworICAgICAgICB1c2luZyBuYW1lc3BhY2UgVGJjOworCisgICAgICAgIGlubGluZSBib29sIHN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIHN0ZDo6c3RyaW5nIGNvbnN0JiBwcmVmaXggKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyLnNpemUoKSA+PSBwcmVmaXguc2l6ZSgpICYmIHN0ci5zdWJzdHIoIDAsIHByZWZpeC5zaXplKCkgKSA9PSBwcmVmaXg7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgUmVtb3ZlQ29uc3RSZWZ7IHR5cGVkZWYgVCB0eXBlOyB9OworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgUmVtb3ZlQ29uc3RSZWY8VCY+eyB0eXBlZGVmIFQgdHlwZTsgfTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFJlbW92ZUNvbnN0UmVmPFQgY29uc3QmPnsgdHlwZWRlZiBUIHR5cGU7IH07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBSZW1vdmVDb25zdFJlZjxUIGNvbnN0PnsgdHlwZWRlZiBUIHR5cGU7IH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gICAgc3RydWN0IElzQm9vbCAgICAgICB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7IH07CisgICAgICAgIHRlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBJc0Jvb2w8Ym9vbD4geyBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7IH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgdm9pZCBjb252ZXJ0SW50byggc3RkOjpzdHJpbmcgY29uc3QmIF9zb3VyY2UsIFQmIF9kZXN0ICkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICBzcyA8PCBfc291cmNlOworICAgICAgICAgICAgc3MgPj4gX2Rlc3Q7CisgICAgICAgICAgICBpZiggc3MuZmFpbCgpICkKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJVbmFibGUgdG8gY29udmVydCAiICsgX3NvdXJjZSArICIgdG8gZGVzdGluYXRpb24gdHlwZSIgKTsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgdm9pZCBjb252ZXJ0SW50byggc3RkOjpzdHJpbmcgY29uc3QmIF9zb3VyY2UsIHN0ZDo6c3RyaW5nJiBfZGVzdCApIHsKKyAgICAgICAgICAgIF9kZXN0ID0gX3NvdXJjZTsKKyAgICAgICAgfQorICAgICAgICBjaGFyIHRvTG93ZXJDaChjaGFyIGMpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjaGFyPiggc3RkOjp0b2xvd2VyKCBjICkgKTsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgdm9pZCBjb252ZXJ0SW50byggc3RkOjpzdHJpbmcgY29uc3QmIF9zb3VyY2UsIGJvb2wmIF9kZXN0ICkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlTEMgPSBfc291cmNlOworICAgICAgICAgICAgc3RkOjp0cmFuc2Zvcm0oIHNvdXJjZUxDLmJlZ2luKCksIHNvdXJjZUxDLmVuZCgpLCBzb3VyY2VMQy5iZWdpbigpLCB0b0xvd2VyQ2ggKTsKKyAgICAgICAgICAgIGlmKCBzb3VyY2VMQyA9PSAieSIgfHwgc291cmNlTEMgPT0gIjEiIHx8IHNvdXJjZUxDID09ICJ0cnVlIiB8fCBzb3VyY2VMQyA9PSAieWVzIiB8fCBzb3VyY2VMQyA9PSAib24iICkKKyAgICAgICAgICAgICAgICBfZGVzdCA9IHRydWU7CisgICAgICAgICAgICBlbHNlIGlmKCBzb3VyY2VMQyA9PSAibiIgfHwgc291cmNlTEMgPT0gIjAiIHx8IHNvdXJjZUxDID09ICJmYWxzZSIgfHwgc291cmNlTEMgPT0gIm5vIiB8fCBzb3VyY2VMQyA9PSAib2ZmIiApCisgICAgICAgICAgICAgICAgX2Rlc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJFeHBlY3RlZCBhIGJvb2xlYW4gdmFsdWUgYnV0IGRpZCBub3QgcmVjb2duaXNlOlxuICAnIiArIF9zb3VyY2UgKyAiJyIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbmZpZ1Q+CisgICAgICAgIHN0cnVjdCBJQXJnRnVuY3Rpb24geworICAgICAgICAgICAgdmlydHVhbCB+SUFyZ0Z1bmN0aW9uKCkge30KKyNpZmRlZiBDTEFSQV9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgICAgIElBcmdGdW5jdGlvbigpICAgICAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgICAgIElBcmdGdW5jdGlvbiggSUFyZ0Z1bmN0aW9uIGNvbnN0JiApID0gZGVmYXVsdDsKKyNlbmRpZgorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHNldCggQ29uZmlnVCYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgdmFsdWUgKSBjb25zdCA9IDA7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgdGFrZXNBcmcoKSBjb25zdCA9IDA7CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbiogY2xvbmUoKSBjb25zdCA9IDA7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uZmlnVD4KKyAgICAgICAgY2xhc3MgQm91bmRBcmdGdW5jdGlvbiB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEJvdW5kQXJnRnVuY3Rpb24oKSA6IGZ1bmN0aW9uT2JqKCBDTEFSQV9OVUxMICkge30KKyAgICAgICAgICAgIEJvdW5kQXJnRnVuY3Rpb24oIElBcmdGdW5jdGlvbjxDb25maWdUPiogX2Z1bmN0aW9uT2JqICkgOiBmdW5jdGlvbk9iaiggX2Z1bmN0aW9uT2JqICkge30KKyAgICAgICAgICAgIEJvdW5kQXJnRnVuY3Rpb24oIEJvdW5kQXJnRnVuY3Rpb24gY29uc3QmIG90aGVyICkgOiBmdW5jdGlvbk9iaiggb3RoZXIuZnVuY3Rpb25PYmogPyBvdGhlci5mdW5jdGlvbk9iai0+Y2xvbmUoKSA6IENMQVJBX05VTEwgKSB7fQorICAgICAgICAgICAgQm91bmRBcmdGdW5jdGlvbiYgb3BlcmF0b3IgPSAoIEJvdW5kQXJnRnVuY3Rpb24gY29uc3QmIG90aGVyICkgeworICAgICAgICAgICAgICAgIElBcmdGdW5jdGlvbjxDb25maWdUPiogbmV3RnVuY3Rpb25PYmogPSBvdGhlci5mdW5jdGlvbk9iaiA/IG90aGVyLmZ1bmN0aW9uT2JqLT5jbG9uZSgpIDogQ0xBUkFfTlVMTDsKKyAgICAgICAgICAgICAgICBkZWxldGUgZnVuY3Rpb25PYmo7CisgICAgICAgICAgICAgICAgZnVuY3Rpb25PYmogPSBuZXdGdW5jdGlvbk9iajsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB+Qm91bmRBcmdGdW5jdGlvbigpIHsgZGVsZXRlIGZ1bmN0aW9uT2JqOyB9CisKKyAgICAgICAgICAgIHZvaWQgc2V0KCBDb25maWdUJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiB2YWx1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBmdW5jdGlvbk9iai0+c2V0KCBjb25maWcsIHZhbHVlICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sIHRha2VzQXJnKCkgY29uc3QgeyByZXR1cm4gZnVuY3Rpb25PYmotPnRha2VzQXJnKCk7IH0KKworICAgICAgICAgICAgYm9vbCBpc1NldCgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb25PYmogIT0gQ0xBUkFfTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIElBcmdGdW5jdGlvbjxDb25maWdUPiogZnVuY3Rpb25PYmo7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgc3RydWN0IE51bGxCaW5kZXIgOiBJQXJnRnVuY3Rpb248Qz57CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KCBDJiwgc3RkOjpzdHJpbmcgY29uc3QmICkgY29uc3Qge30KKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgICAgIHZpcnR1YWwgSUFyZ0Z1bmN0aW9uPEM+KiBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIG5ldyBOdWxsQmluZGVyKCAqdGhpcyApOyB9CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgTT4KKyAgICAgICAgc3RydWN0IEJvdW5kRGF0YU1lbWJlciA6IElBcmdGdW5jdGlvbjxDPnsKKyAgICAgICAgICAgIEJvdW5kRGF0YU1lbWJlciggTSBDOjoqIF9tZW1iZXIgKSA6IG1lbWJlciggX21lbWJlciApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KCBDJiBwLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyaW5nVmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgY29udmVydEludG8oIHN0cmluZ1ZhbHVlLCBwLiptZW1iZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuICFJc0Jvb2w8TT46OnZhbHVlOyB9CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbjxDPiogY2xvbmUoKSBjb25zdCB7IHJldHVybiBuZXcgQm91bmREYXRhTWVtYmVyKCAqdGhpcyApOyB9CisgICAgICAgICAgICBNIEM6OiogbWVtYmVyOworICAgICAgICB9OworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0eXBlbmFtZSBNPgorICAgICAgICBzdHJ1Y3QgQm91bmRVbmFyeU1ldGhvZCA6IElBcmdGdW5jdGlvbjxDPnsKKyAgICAgICAgICAgIEJvdW5kVW5hcnlNZXRob2QoIHZvaWQgKEM6OipfbWVtYmVyKSggTSApICkgOiBtZW1iZXIoIF9tZW1iZXIgKSB7fQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHNldCggQyYgcCwgc3RkOjpzdHJpbmcgY29uc3QmIHN0cmluZ1ZhbHVlICkgY29uc3QgeworICAgICAgICAgICAgICAgIHR5cGVuYW1lIFJlbW92ZUNvbnN0UmVmPE0+Ojp0eXBlIHZhbHVlOworICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRvKCBzdHJpbmdWYWx1ZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICAocC4qbWVtYmVyKSggdmFsdWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuICFJc0Jvb2w8TT46OnZhbHVlOyB9CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbjxDPiogY2xvbmUoKSBjb25zdCB7IHJldHVybiBuZXcgQm91bmRVbmFyeU1ldGhvZCggKnRoaXMgKTsgfQorICAgICAgICAgICAgdm9pZCAoQzo6Km1lbWJlcikoIE0gKTsKKyAgICAgICAgfTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgc3RydWN0IEJvdW5kTnVsbGFyeU1ldGhvZCA6IElBcmdGdW5jdGlvbjxDPnsKKyAgICAgICAgICAgIEJvdW5kTnVsbGFyeU1ldGhvZCggdm9pZCAoQzo6Kl9tZW1iZXIpKCkgKSA6IG1lbWJlciggX21lbWJlciApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KCBDJiBwLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyaW5nVmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgYm9vbCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBjb252ZXJ0SW50byggc3RyaW5nVmFsdWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgaWYoIHZhbHVlICkKKyAgICAgICAgICAgICAgICAgICAgKHAuKm1lbWJlcikoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbjxDPiogY2xvbmUoKSBjb25zdCB7IHJldHVybiBuZXcgQm91bmROdWxsYXJ5TWV0aG9kKCAqdGhpcyApOyB9CisgICAgICAgICAgICB2b2lkIChDOjoqbWVtYmVyKSgpOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEM+CisgICAgICAgIHN0cnVjdCBCb3VuZFVuYXJ5RnVuY3Rpb24gOiBJQXJnRnVuY3Rpb248Qz57CisgICAgICAgICAgICBCb3VuZFVuYXJ5RnVuY3Rpb24oIHZvaWQgKCpfZnVuY3Rpb24pKCBDJiApICkgOiBmdW5jdGlvbiggX2Z1bmN0aW9uICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXQoIEMmIG9iaiwgc3RkOjpzdHJpbmcgY29uc3QmIHN0cmluZ1ZhbHVlICkgY29uc3QgeworICAgICAgICAgICAgICAgIGJvb2wgdmFsdWU7CisgICAgICAgICAgICAgICAgY29udmVydEludG8oIHN0cmluZ1ZhbHVlLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIGlmKCB2YWx1ZSApCisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCBvYmogKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbjxDPiogY2xvbmUoKSBjb25zdCB7IHJldHVybiBuZXcgQm91bmRVbmFyeUZ1bmN0aW9uKCAqdGhpcyApOyB9CisgICAgICAgICAgICB2b2lkICgqZnVuY3Rpb24pKCBDJiApOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIFQ+CisgICAgICAgIHN0cnVjdCBCb3VuZEJpbmFyeUZ1bmN0aW9uIDogSUFyZ0Z1bmN0aW9uPEM+eworICAgICAgICAgICAgQm91bmRCaW5hcnlGdW5jdGlvbiggdm9pZCAoKl9mdW5jdGlvbikoIEMmLCBUICkgKSA6IGZ1bmN0aW9uKCBfZnVuY3Rpb24gKSB7fQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHNldCggQyYgb2JqLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyaW5nVmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgUmVtb3ZlQ29uc3RSZWY8VD46OnR5cGUgdmFsdWU7CisgICAgICAgICAgICAgICAgY29udmVydEludG8oIHN0cmluZ1ZhbHVlLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCBvYmosIHZhbHVlICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgdGFrZXNBcmcoKSBjb25zdCB7IHJldHVybiAhSXNCb29sPFQ+Ojp2YWx1ZTsgfQorICAgICAgICAgICAgdmlydHVhbCBJQXJnRnVuY3Rpb248Qz4qIGNsb25lKCkgY29uc3QgeyByZXR1cm4gbmV3IEJvdW5kQmluYXJ5RnVuY3Rpb24oICp0aGlzICk7IH0KKyAgICAgICAgICAgIHZvaWQgKCpmdW5jdGlvbikoIEMmLCBUICk7CisgICAgICAgIH07CisKKyAgICB9IC8vIG5hbWVzcGFjZSBEZXRhaWwKKworICAgIGlubGluZSBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYXJnc1RvVmVjdG9yKCBpbnQgYXJnYywgY2hhciBjb25zdCogY29uc3QqIGNvbnN0IGFyZ3YgKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmdzKCBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oIGFyZ2MgKSApOworICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KCBhcmdjICk7ICsraSApCisgICAgICAgICAgICBhcmdzW2ldID0gYXJndltpXTsKKworICAgICAgICByZXR1cm4gYXJnczsKKyAgICB9CisKKyAgICBjbGFzcyBQYXJzZXIgeworICAgICAgICBlbnVtIE1vZGUgeyBOb25lLCBNYXliZVNob3J0T3B0LCBTbGFzaE9wdCwgU2hvcnRPcHQsIExvbmdPcHQsIFBvc2l0aW9uYWwgfTsKKyAgICAgICAgTW9kZSBtb2RlOworICAgICAgICBzdGQ6OnNpemVfdCBmcm9tOworICAgICAgICBib29sIGluUXVvdGVzOworICAgIHB1YmxpYzoKKworICAgICAgICBzdHJ1Y3QgVG9rZW4geworICAgICAgICAgICAgZW51bSBUeXBlIHsgUG9zaXRpb25hbCwgU2hvcnRPcHQsIExvbmdPcHQgfTsKKyAgICAgICAgICAgIFRva2VuKCBUeXBlIF90eXBlLCBzdGQ6OnN0cmluZyBjb25zdCYgX2RhdGEgKSA6IHR5cGUoIF90eXBlICksIGRhdGEoIF9kYXRhICkge30KKyAgICAgICAgICAgIFR5cGUgdHlwZTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRhdGE7CisgICAgICAgIH07CisKKyAgICAgICAgUGFyc2VyKCkgOiBtb2RlKCBOb25lICksIGZyb20oIDAgKSwgaW5RdW90ZXMoIGZhbHNlICl7fQorCisgICAgICAgIHZvaWQgcGFyc2VJbnRvVG9rZW5zKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGFyZ3MsIHN0ZDo6dmVjdG9yPFRva2VuPiYgdG9rZW5zICkgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZG91YmxlRGFzaCA9ICItLSI7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAxOyBpIDwgYXJncy5zaXplKCkgJiYgYXJnc1tpXSAhPSBkb3VibGVEYXNoOyArK2kgKQorICAgICAgICAgICAgICAgIHBhcnNlSW50b1Rva2VucyggYXJnc1tpXSwgdG9rZW5zKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcGFyc2VJbnRvVG9rZW5zKCBzdGQ6OnN0cmluZyBjb25zdCYgYXJnLCBzdGQ6OnZlY3RvcjxUb2tlbj4mIHRva2VucyApIHsKKyAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBhcmcuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgY2hhciBjID0gYXJnW2ldOworICAgICAgICAgICAgICAgIGlmKCBjID09ICciJyApCisgICAgICAgICAgICAgICAgICAgIGluUXVvdGVzID0gIWluUXVvdGVzOworICAgICAgICAgICAgICAgIG1vZGUgPSBoYW5kbGVNb2RlKCBpLCBjLCBhcmcsIHRva2VucyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbW9kZSA9IGhhbmRsZU1vZGUoIGFyZy5zaXplKCksICdcMCcsIGFyZywgdG9rZW5zICk7CisgICAgICAgIH0KKyAgICAgICAgTW9kZSBoYW5kbGVNb2RlKCBzdGQ6OnNpemVfdCBpLCBjaGFyIGMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBhcmcsIHN0ZDo6dmVjdG9yPFRva2VuPiYgdG9rZW5zICkgeworICAgICAgICAgICAgc3dpdGNoKCBtb2RlICkgeworICAgICAgICAgICAgICAgIGNhc2UgTm9uZTogcmV0dXJuIGhhbmRsZU5vbmUoIGksIGMgKTsKKyAgICAgICAgICAgICAgICBjYXNlIE1heWJlU2hvcnRPcHQ6IHJldHVybiBoYW5kbGVNYXliZVNob3J0T3B0KCBpLCBjICk7CisgICAgICAgICAgICAgICAgY2FzZSBTaG9ydE9wdDoKKyAgICAgICAgICAgICAgICBjYXNlIExvbmdPcHQ6CisgICAgICAgICAgICAgICAgY2FzZSBTbGFzaE9wdDogcmV0dXJuIGhhbmRsZU9wdCggaSwgYywgYXJnLCB0b2tlbnMgKTsKKyAgICAgICAgICAgICAgICBjYXNlIFBvc2l0aW9uYWw6IHJldHVybiBoYW5kbGVQb3NpdGlvbmFsKCBpLCBjLCBhcmcsIHRva2VucyApOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJVbmtub3duIG1vZGUiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBNb2RlIGhhbmRsZU5vbmUoIHN0ZDo6c2l6ZV90IGksIGNoYXIgYyApIHsKKyAgICAgICAgICAgIGlmKCBpblF1b3RlcyApIHsKKyAgICAgICAgICAgICAgICBmcm9tID0gaTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUG9zaXRpb25hbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCggYyApIHsKKyAgICAgICAgICAgICAgICBjYXNlICctJzogcmV0dXJuIE1heWJlU2hvcnRPcHQ7CisjaWZkZWYgQ0xBUkFfUExBVEZPUk1fV0lORE9XUworICAgICAgICAgICAgICAgIGNhc2UgJy8nOiBmcm9tID0gaSsxOyByZXR1cm4gU2xhc2hPcHQ7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBmcm9tID0gaTsgcmV0dXJuIFBvc2l0aW9uYWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTW9kZSBoYW5kbGVNYXliZVNob3J0T3B0KCBzdGQ6OnNpemVfdCBpLCBjaGFyIGMgKSB7CisgICAgICAgICAgICBzd2l0Y2goIGMgKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnLSc6IGZyb20gPSBpKzE7IHJldHVybiBMb25nT3B0OworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGZyb20gPSBpOyByZXR1cm4gU2hvcnRPcHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBNb2RlIGhhbmRsZU9wdCggc3RkOjpzaXplX3QgaSwgY2hhciBjLCBzdGQ6OnN0cmluZyBjb25zdCYgYXJnLCBzdGQ6OnZlY3RvcjxUb2tlbj4mIHRva2VucyApIHsKKyAgICAgICAgICAgIGlmKCBzdGQ6OnN0cmluZyggIjo9XDAiLCAzICkuZmluZCggYyApID09IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICByZXR1cm4gbW9kZTsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgb3B0TmFtZSA9IGFyZy5zdWJzdHIoIGZyb20sIGktZnJvbSApOworICAgICAgICAgICAgaWYoIG1vZGUgPT0gU2hvcnRPcHQgKQorICAgICAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaiA9IDA7IGogPCBvcHROYW1lLnNpemUoKTsgKytqICkKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2hfYmFjayggVG9rZW4oIFRva2VuOjpTaG9ydE9wdCwgb3B0TmFtZS5zdWJzdHIoIGosIDEgKSApICk7CisgICAgICAgICAgICBlbHNlIGlmKCBtb2RlID09IFNsYXNoT3B0ICYmIG9wdE5hbWUuc2l6ZSgpID09IDEgKQorICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoX2JhY2soIFRva2VuKCBUb2tlbjo6U2hvcnRPcHQsIG9wdE5hbWUgKSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoX2JhY2soIFRva2VuKCBUb2tlbjo6TG9uZ09wdCwgb3B0TmFtZSApICk7CisgICAgICAgICAgICByZXR1cm4gTm9uZTsKKyAgICAgICAgfQorICAgICAgICBNb2RlIGhhbmRsZVBvc2l0aW9uYWwoIHN0ZDo6c2l6ZV90IGksIGNoYXIgYywgc3RkOjpzdHJpbmcgY29uc3QmIGFyZywgc3RkOjp2ZWN0b3I8VG9rZW4+JiB0b2tlbnMgKSB7CisgICAgICAgICAgICBpZiggaW5RdW90ZXMgfHwgc3RkOjpzdHJpbmcoICJcMCIsIDEgKS5maW5kKCBjICkgPT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgIHJldHVybiBtb2RlOworCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBkYXRhID0gYXJnLnN1YnN0ciggZnJvbSwgaS1mcm9tICk7CisgICAgICAgICAgICB0b2tlbnMucHVzaF9iYWNrKCBUb2tlbiggVG9rZW46OlBvc2l0aW9uYWwsIGRhdGEgKSApOworICAgICAgICAgICAgcmV0dXJuIE5vbmU7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uZmlnVD4KKyAgICBzdHJ1Y3QgQ29tbW9uQXJnUHJvcGVydGllcyB7CisgICAgICAgIENvbW1vbkFyZ1Byb3BlcnRpZXMoKSB7fQorICAgICAgICBDb21tb25BcmdQcm9wZXJ0aWVzKCBEZXRhaWw6OkJvdW5kQXJnRnVuY3Rpb248Q29uZmlnVD4gY29uc3QmIF9ib3VuZEZpZWxkICkgOiBib3VuZEZpZWxkKCBfYm91bmRGaWVsZCApIHt9CisKKyAgICAgICAgRGV0YWlsOjpCb3VuZEFyZ0Z1bmN0aW9uPENvbmZpZ1Q+IGJvdW5kRmllbGQ7CisgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICBzdGQ6OnN0cmluZyBkZXRhaWw7CisgICAgICAgIHN0ZDo6c3RyaW5nIHBsYWNlaG9sZGVyOyAvLyBPbmx5IHZhbHVlIGlmIGJvdW5kRmllbGQgdGFrZXMgYW4gYXJnCisKKyAgICAgICAgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAhcGxhY2Vob2xkZXIuZW1wdHkoKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHZhbGlkYXRlKCkgY29uc3QgeworICAgICAgICAgICAgaWYoICFib3VuZEZpZWxkLmlzU2V0KCkgKQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJvcHRpb24gbm90IGJvdW5kIiApOworICAgICAgICB9CisgICAgfTsKKyAgICBzdHJ1Y3QgT3B0aW9uQXJnUHJvcGVydGllcyB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzaG9ydE5hbWVzOworICAgICAgICBzdGQ6OnN0cmluZyBsb25nTmFtZTsKKworICAgICAgICBib29sIGhhc1Nob3J0TmFtZSggc3RkOjpzdHJpbmcgY29uc3QmIHNob3J0TmFtZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OmZpbmQoIHNob3J0TmFtZXMuYmVnaW4oKSwgc2hvcnROYW1lcy5lbmQoKSwgc2hvcnROYW1lICkgIT0gc2hvcnROYW1lcy5lbmQoKTsKKyAgICAgICAgfQorICAgICAgICBib29sIGhhc0xvbmdOYW1lKCBzdGQ6OnN0cmluZyBjb25zdCYgX2xvbmdOYW1lICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIF9sb25nTmFtZSA9PSBsb25nTmFtZTsKKyAgICAgICAgfQorICAgIH07CisgICAgc3RydWN0IFBvc2l0aW9uYWxBcmdQcm9wZXJ0aWVzIHsKKyAgICAgICAgUG9zaXRpb25hbEFyZ1Byb3BlcnRpZXMoKSA6IHBvc2l0aW9uKCAtMSApIHt9CisgICAgICAgIGludCBwb3NpdGlvbjsgLy8gLTEgbWVhbnMgbm9uLXBvc2l0aW9uYWwgKGZsb2F0aW5nKQorCisgICAgICAgIGJvb2wgaXNGaXhlZFBvc2l0aW9uYWwoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gcG9zaXRpb24gIT0gLTE7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uZmlnVD4KKyAgICBjbGFzcyBDb21tYW5kTGluZSB7CisKKyAgICAgICAgc3RydWN0IEFyZyA6IENvbW1vbkFyZ1Byb3BlcnRpZXM8Q29uZmlnVD4sIE9wdGlvbkFyZ1Byb3BlcnRpZXMsIFBvc2l0aW9uYWxBcmdQcm9wZXJ0aWVzIHsKKyAgICAgICAgICAgIEFyZygpIHt9CisgICAgICAgICAgICBBcmcoIERldGFpbDo6Qm91bmRBcmdGdW5jdGlvbjxDb25maWdUPiBjb25zdCYgX2JvdW5kRmllbGQgKSA6IENvbW1vbkFyZ1Byb3BlcnRpZXM8Q29uZmlnVD4oIF9ib3VuZEZpZWxkICkge30KKworICAgICAgICAgICAgdXNpbmcgQ29tbW9uQXJnUHJvcGVydGllczxDb25maWdUPjo6cGxhY2Vob2xkZXI7IC8vICFUQkQKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGJnTmFtZSgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggIWxvbmdOYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIi0tIiArIGxvbmdOYW1lOworICAgICAgICAgICAgICAgIGlmKCAhc2hvcnROYW1lcy5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICItIiArIHNob3J0TmFtZXNbMF07CisgICAgICAgICAgICAgICAgcmV0dXJuICJwb3NpdGlvbmFsIGFyZ3MiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29tbWFuZHMoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc2hvcnROYW1lcy5iZWdpbigpLCBpdEVuZCA9IHNob3J0TmFtZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgZm9yKDsgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBmaXJzdCApCisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBvc3MgPDwgIiwgIjsKKyAgICAgICAgICAgICAgICAgICAgb3NzIDw8ICItIiA8PCAqaXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCAhbG9uZ05hbWUuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoICFmaXJzdCApCisgICAgICAgICAgICAgICAgICAgICAgICBvc3MgPDwgIiwgIjsKKyAgICAgICAgICAgICAgICAgICAgb3NzIDw8ICItLSIgPDwgbG9uZ05hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCAhcGxhY2Vob2xkZXIuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIG9zcyA8PCAiIDwiIDw8IHBsYWNlaG9sZGVyIDw8ICI+IjsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHR5cGVkZWYgQ0xBUkFfQVVUT19QVFIoIEFyZyApIEFyZ0F1dG9QdHI7CisKKyAgICAgICAgZnJpZW5kIHZvaWQgYWRkT3B0TmFtZSggQXJnJiBhcmcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcHROYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIG9wdE5hbWUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYoIERldGFpbDo6c3RhcnRzV2l0aCggb3B0TmFtZSwgIi0tIiApICkgeworICAgICAgICAgICAgICAgIGlmKCAhYXJnLmxvbmdOYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiT25seSBvbmUgbG9uZyBvcHQgbWF5IGJlIHNwZWNpZmllZC4gJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgYXJnLmxvbmdOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICArICInIGFscmVhZHkgc3BlY2lmaWVkLCBub3cgYXR0ZW1wdGluZyB0byBhZGQgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgb3B0TmFtZSArICInIiApOworICAgICAgICAgICAgICAgIGFyZy5sb25nTmFtZSA9IG9wdE5hbWUuc3Vic3RyKCAyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCBEZXRhaWw6OnN0YXJ0c1dpdGgoIG9wdE5hbWUsICItIiApICkKKyAgICAgICAgICAgICAgICBhcmcuc2hvcnROYW1lcy5wdXNoX2JhY2soIG9wdE5hbWUuc3Vic3RyKCAxICkgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAib3B0aW9uIG11c3QgYmVnaW4gd2l0aCAtIG9yIC0tLiBPcHRpb24gd2FzOiAnIiArIG9wdE5hbWUgKyAiJyIgKTsKKyAgICAgICAgfQorICAgICAgICBmcmllbmQgdm9pZCBzZXRQb3NpdGlvbmFsQXJnKCBBcmcmIGFyZywgaW50IHBvc2l0aW9uICkKKyAgICAgICAgeworICAgICAgICAgICAgYXJnLnBvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBBcmdCdWlsZGVyIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXJnQnVpbGRlciggQXJnKiBhcmcgKSA6IG1fYXJnKCBhcmcgKSB7fQorCisgICAgICAgICAgICAvLyBCaW5kIGEgbm9uLWJvb2xlYW4gZGF0YSBtZW1iZXIgKHJlcXVpcmVzIHBsYWNlaG9sZGVyIHN0cmluZykKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIE0+CisgICAgICAgICAgICB2b2lkIGJpbmQoIE0gQzo6KiBmaWVsZCwgc3RkOjpzdHJpbmcgY29uc3QmIHBsYWNlaG9sZGVyICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5ib3VuZEZpZWxkID0gbmV3IERldGFpbDo6Qm91bmREYXRhTWVtYmVyPEMsTT4oIGZpZWxkICk7CisgICAgICAgICAgICAgICAgbV9hcmctPnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBCaW5kIGEgYm9vbGVhbiBkYXRhIG1lbWJlciAobm8gcGxhY2Vob2xkZXIgcmVxdWlyZWQpCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgICAgICAgICAgdm9pZCBiaW5kKCBib29sIEM6OiogZmllbGQgKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmJvdW5kRmllbGQgPSBuZXcgRGV0YWlsOjpCb3VuZERhdGFNZW1iZXI8Qyxib29sPiggZmllbGQgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQmluZCBhIG1ldGhvZCB0YWtpbmcgYSBzaW5nbGUsIG5vbi1ib29sZWFuIGFyZ3VtZW50IChyZXF1aXJlcyBhIHBsYWNlaG9sZGVyIHN0cmluZykKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIE0+CisgICAgICAgICAgICB2b2lkIGJpbmQoIHZvaWQgKEM6OiogdW5hcnlNZXRob2QpKCBNICksIHN0ZDo6c3RyaW5nIGNvbnN0JiBwbGFjZWhvbGRlciApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+Ym91bmRGaWVsZCA9IG5ldyBEZXRhaWw6OkJvdW5kVW5hcnlNZXRob2Q8QyxNPiggdW5hcnlNZXRob2QgKTsKKyAgICAgICAgICAgICAgICBtX2FyZy0+cGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQmluZCBhIG1ldGhvZCB0YWtpbmcgYSBzaW5nbGUsIGJvb2xlYW4gYXJndW1lbnQgKG5vIHBsYWNlaG9sZGVyIHN0cmluZyByZXF1aXJlZCkKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEM+CisgICAgICAgICAgICB2b2lkIGJpbmQoIHZvaWQgKEM6OiogdW5hcnlNZXRob2QpKCBib29sICkgKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmJvdW5kRmllbGQgPSBuZXcgRGV0YWlsOjpCb3VuZFVuYXJ5TWV0aG9kPEMsYm9vbD4oIHVuYXJ5TWV0aG9kICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJpbmQgYSBtZXRob2QgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMgKHdpbGwgYmUgY2FsbGVkIGlmIG9wdCBpcyBwcmVzZW50KQorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgICAgIHZvaWQgYmluZCggdm9pZCAoQzo6KiBudWxsYXJ5TWV0aG9kKSgpICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5ib3VuZEZpZWxkID0gbmV3IERldGFpbDo6Qm91bmROdWxsYXJ5TWV0aG9kPEM+KCBudWxsYXJ5TWV0aG9kICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJpbmQgYSBmcmVlIGZ1bmN0aW9uIHRha2luZyBhIHNpbmdsZSBhcmd1bWVudCAtIHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBvbiAobm8gcGxhY2Vob2xkZXIgc3RyaW5nIHJlcXVpcmVkKQorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgICAgIHZvaWQgYmluZCggdm9pZCAoKiB1bmFyeUZ1bmN0aW9uKSggQyYgKSApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+Ym91bmRGaWVsZCA9IG5ldyBEZXRhaWw6OkJvdW5kVW5hcnlGdW5jdGlvbjxDPiggdW5hcnlGdW5jdGlvbiApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBCaW5kIGEgZnJlZSBmdW5jdGlvbiB0YWtpbmcgYSBzaW5nbGUgYXJndW1lbnQgLSB0aGUgb2JqZWN0IHRvIG9wZXJhdGUgb24gKHJlcXVpcmVzIGEgcGxhY2Vob2xkZXIgc3RyaW5nKQorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgVD4KKyAgICAgICAgICAgIHZvaWQgYmluZCggdm9pZCAoKiBiaW5hcnlGdW5jdGlvbikoIEMmLCBUICksIHN0ZDo6c3RyaW5nIGNvbnN0JiBwbGFjZWhvbGRlciApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+Ym91bmRGaWVsZCA9IG5ldyBEZXRhaWw6OkJvdW5kQmluYXJ5RnVuY3Rpb248QywgVD4oIGJpbmFyeUZ1bmN0aW9uICk7CisgICAgICAgICAgICAgICAgbV9hcmctPnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFyZ0J1aWxkZXImIGRlc2NyaWJlKCBzdGQ6OnN0cmluZyBjb25zdCYgZGVzY3JpcHRpb24gKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXJnQnVpbGRlciYgZGV0YWlsKCBzdGQ6OnN0cmluZyBjb25zdCYgZGV0YWlsICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5kZXRhaWwgPSBkZXRhaWw7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgICAgIEFyZyogbV9hcmc7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgT3B0QnVpbGRlciA6IHB1YmxpYyBBcmdCdWlsZGVyIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgT3B0QnVpbGRlciggQXJnKiBhcmcgKSA6IEFyZ0J1aWxkZXIoIGFyZyApIHt9CisgICAgICAgICAgICBPcHRCdWlsZGVyKCBPcHRCdWlsZGVyJiBvdGhlciApIDogQXJnQnVpbGRlciggb3RoZXIgKSB7fQorCisgICAgICAgICAgICBPcHRCdWlsZGVyJiBvcGVyYXRvcltdKCBzdGQ6OnN0cmluZyBjb25zdCYgb3B0TmFtZSApIHsKKyAgICAgICAgICAgICAgICBhZGRPcHROYW1lKCAqQXJnQnVpbGRlcjo6bV9hcmcsIG9wdE5hbWUgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgQ29tbWFuZExpbmUoKQorICAgICAgICA6ICAgbV9ib3VuZFByb2Nlc3NOYW1lKCBuZXcgRGV0YWlsOjpOdWxsQmluZGVyPENvbmZpZ1Q+KCkgKSwKKyAgICAgICAgICAgIG1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uKCAwICksCisgICAgICAgICAgICBtX3Rocm93T25VbnJlY29nbmlzZWRUb2tlbnMoIGZhbHNlICkKKyAgICAgICAge30KKyAgICAgICAgQ29tbWFuZExpbmUoIENvbW1hbmRMaW5lIGNvbnN0JiBvdGhlciApCisgICAgICAgIDogICBtX2JvdW5kUHJvY2Vzc05hbWUoIG90aGVyLm1fYm91bmRQcm9jZXNzTmFtZSApLAorICAgICAgICAgICAgbV9vcHRpb25zICggb3RoZXIubV9vcHRpb25zICksCisgICAgICAgICAgICBtX3Bvc2l0aW9uYWxBcmdzKCBvdGhlci5tX3Bvc2l0aW9uYWxBcmdzICksCisgICAgICAgICAgICBtX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbiggb3RoZXIubV9oaWdoZXN0U3BlY2lmaWVkQXJnUG9zaXRpb24gKSwKKyAgICAgICAgICAgIG1fdGhyb3dPblVucmVjb2duaXNlZFRva2Vucyggb3RoZXIubV90aHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIG90aGVyLm1fZmxvYXRpbmdBcmcuZ2V0KCkgKQorICAgICAgICAgICAgICAgIG1fZmxvYXRpbmdBcmcucmVzZXQoIG5ldyBBcmcoICpvdGhlci5tX2Zsb2F0aW5nQXJnICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIENvbW1hbmRMaW5lJiBzZXRUaHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zKCBib29sIHNob3VsZFRocm93ID0gdHJ1ZSApIHsKKyAgICAgICAgICAgIG1fdGhyb3dPblVucmVjb2duaXNlZFRva2VucyA9IHNob3VsZFRocm93OworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgT3B0QnVpbGRlciBvcGVyYXRvcltdKCBzdGQ6OnN0cmluZyBjb25zdCYgb3B0TmFtZSApIHsKKyAgICAgICAgICAgIG1fb3B0aW9ucy5wdXNoX2JhY2soIEFyZygpICk7CisgICAgICAgICAgICBhZGRPcHROYW1lKCBtX29wdGlvbnMuYmFjaygpLCBvcHROYW1lICk7CisgICAgICAgICAgICBPcHRCdWlsZGVyIGJ1aWxkZXIoICZtX29wdGlvbnMuYmFjaygpICk7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEFyZ0J1aWxkZXIgb3BlcmF0b3JbXSggaW50IHBvc2l0aW9uICkgeworICAgICAgICAgICAgbV9wb3NpdGlvbmFsQXJncy5pbnNlcnQoIHN0ZDo6bWFrZV9wYWlyKCBwb3NpdGlvbiwgQXJnKCkgKSApOworICAgICAgICAgICAgaWYoIHBvc2l0aW9uID4gbV9oaWdoZXN0U3BlY2lmaWVkQXJnUG9zaXRpb24gKQorICAgICAgICAgICAgICAgIG1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgICAgICBzZXRQb3NpdGlvbmFsQXJnKCBtX3Bvc2l0aW9uYWxBcmdzW3Bvc2l0aW9uXSwgcG9zaXRpb24gKTsKKyAgICAgICAgICAgIEFyZ0J1aWxkZXIgYnVpbGRlciggJm1fcG9zaXRpb25hbEFyZ3NbcG9zaXRpb25dICk7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlcjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEludm9rZSB0aGlzIHdpdGggdGhlIF8gaW5zdGFuY2UKKyAgICAgICAgQXJnQnVpbGRlciBvcGVyYXRvcltdKCBVbnBvc2l0aW9uYWxUYWcgKSB7CisgICAgICAgICAgICBpZiggbV9mbG9hdGluZ0FyZy5nZXQoKSApCisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIk9ubHkgb25lIHVucG9zaXRpb25hbCBhcmd1bWVudCBjYW4gYmUgYWRkZWQiICk7CisgICAgICAgICAgICBtX2Zsb2F0aW5nQXJnLnJlc2V0KCBuZXcgQXJnKCkgKTsKKyAgICAgICAgICAgIEFyZ0J1aWxkZXIgYnVpbGRlciggbV9mbG9hdGluZ0FyZy5nZXQoKSApOworICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXI7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0eXBlbmFtZSBNPgorICAgICAgICB2b2lkIGJpbmRQcm9jZXNzTmFtZSggTSBDOjoqIGZpZWxkICkgeworICAgICAgICAgICAgbV9ib3VuZFByb2Nlc3NOYW1lID0gbmV3IERldGFpbDo6Qm91bmREYXRhTWVtYmVyPEMsTT4oIGZpZWxkICk7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgTT4KKyAgICAgICAgdm9pZCBiaW5kUHJvY2Vzc05hbWUoIHZvaWQgKEM6OipfdW5hcnlNZXRob2QpKCBNICkgKSB7CisgICAgICAgICAgICBtX2JvdW5kUHJvY2Vzc05hbWUgPSBuZXcgRGV0YWlsOjpCb3VuZFVuYXJ5TWV0aG9kPEMsTT4oIF91bmFyeU1ldGhvZCApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBvcHRVc2FnZSggc3RkOjpvc3RyZWFtJiBvcywgc3RkOjpzaXplX3QgaW5kZW50ID0gMCwgc3RkOjpzaXplX3Qgd2lkdGggPSBEZXRhaWw6OmNvbnNvbGVXaWR0aCApIGNvbnN0IHsKKyAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPEFyZz46OmNvbnN0X2l0ZXJhdG9yIGl0QmVnaW4gPSBtX29wdGlvbnMuYmVnaW4oKSwgaXRFbmQgPSBtX29wdGlvbnMuZW5kKCksIGl0OworICAgICAgICAgICAgc3RkOjpzaXplX3QgbWF4V2lkdGggPSAwOworICAgICAgICAgICAgZm9yKCBpdCA9IGl0QmVnaW47IGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgICAgICBtYXhXaWR0aCA9IChzdGQ6Om1heCkoIG1heFdpZHRoLCBpdC0+Y29tbWFuZHMoKS5zaXplKCkgKTsKKworICAgICAgICAgICAgZm9yKCBpdCA9IGl0QmVnaW47IGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgICAgIERldGFpbDo6VGV4dCB1c2FnZSggaXQtPmNvbW1hbmRzKCksIERldGFpbDo6VGV4dEF0dHJpYnV0ZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0V2lkdGgoIG1heFdpZHRoK2luZGVudCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbmRlbnQoIGluZGVudCApICk7CisgICAgICAgICAgICAgICAgRGV0YWlsOjpUZXh0IGRlc2MoIGl0LT5kZXNjcmlwdGlvbiwgRGV0YWlsOjpUZXh0QXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXaWR0aCggd2lkdGggLSBtYXhXaWR0aCAtIDMgKSApOworCisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IChzdGQ6Om1heCkoIHVzYWdlLnNpemUoKSwgZGVzYy5zaXplKCkgKTsgKytpICkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB1c2FnZUNvbCA9IGkgPCB1c2FnZS5zaXplKCkgPyB1c2FnZVtpXSA6ICIiOworICAgICAgICAgICAgICAgICAgICBvcyA8PCB1c2FnZUNvbDsKKworICAgICAgICAgICAgICAgICAgICBpZiggaSA8IGRlc2Muc2l6ZSgpICYmICFkZXNjW2ldLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgb3MgIDw8IHN0ZDo6c3RyaW5nKCBpbmRlbnQgKyAyICsgbWF4V2lkdGggLSB1c2FnZUNvbC5zaXplKCksICcgJyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZGVzY1tpXTsKKyAgICAgICAgICAgICAgICAgICAgb3MgPDwgIlxuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgb3B0VXNhZ2UoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3B0VXNhZ2UoIG9zcyApOworICAgICAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYXJnU3lub3BzaXMoIHN0ZDo6b3N0cmVhbSYgb3MgKSBjb25zdCB7CisgICAgICAgICAgICBmb3IoIGludCBpID0gMTsgaSA8PSBtX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbjsgKytpICkgeworICAgICAgICAgICAgICAgIGlmKCBpID4gMSApCisgICAgICAgICAgICAgICAgICAgIG9zIDw8ICIgIjsKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6Om1hcDxpbnQsIEFyZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9wb3NpdGlvbmFsQXJncy5maW5kKCBpICk7CisgICAgICAgICAgICAgICAgaWYoIGl0ICE9IG1fcG9zaXRpb25hbEFyZ3MuZW5kKCkgKQorICAgICAgICAgICAgICAgICAgICBvcyA8PCAiPCIgPDwgaXQtPnNlY29uZC5wbGFjZWhvbGRlciA8PCAiPiI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiggbV9mbG9hdGluZ0FyZy5nZXQoKSApCisgICAgICAgICAgICAgICAgICAgIG9zIDw8ICI8IiA8PCBtX2Zsb2F0aW5nQXJnLT5wbGFjZWhvbGRlciA8PCAiPiI7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAibm9uIGNvbnNlY3V0aXZlIHBvc2l0aW9uYWwgYXJndW1lbnRzIHdpdGggbm8gZmxvYXRpbmcgYXJncyIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vICFUQkQgTm8gaW5kaWNhdGlvbiBvZiBtYW5kYXRvcnkgYXJncworICAgICAgICAgICAgaWYoIG1fZmxvYXRpbmdBcmcuZ2V0KCkgKSB7CisgICAgICAgICAgICAgICAgaWYoIG1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uID4gMSApCisgICAgICAgICAgICAgICAgICAgIG9zIDw8ICIgIjsKKyAgICAgICAgICAgICAgICBvcyA8PCAiWzwiIDw8IG1fZmxvYXRpbmdBcmctPnBsYWNlaG9sZGVyIDw8ICI+IC4uLl0iOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGFyZ1N5bm9wc2lzKCkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIGFyZ1N5bm9wc2lzKCBvc3MgKTsKKyAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHVzYWdlKCBzdGQ6Om9zdHJlYW0mIG9zLCBzdGQ6OnN0cmluZyBjb25zdCYgcHJvY05hbWUgKSBjb25zdCB7CisgICAgICAgICAgICB2YWxpZGF0ZSgpOworICAgICAgICAgICAgb3MgPDwgInVzYWdlOlxuICAiIDw8IHByb2NOYW1lIDw8ICIgIjsKKyAgICAgICAgICAgIGFyZ1N5bm9wc2lzKCBvcyApOworICAgICAgICAgICAgaWYoICFtX29wdGlvbnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBvcyA8PCAiIFtvcHRpb25zXVxuXG53aGVyZSBvcHRpb25zIGFyZTogXG4iOworICAgICAgICAgICAgICAgIG9wdFVzYWdlKCBvcywgMiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3MgPDwgIlxuIjsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyB1c2FnZSggc3RkOjpzdHJpbmcgY29uc3QmIHByb2NOYW1lICkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIHVzYWdlKCBvc3MsIHByb2NOYW1lICk7CisgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICB9CisKKyAgICAgICAgQ29uZmlnVCBwYXJzZSggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBhcmdzICkgY29uc3QgeworICAgICAgICAgICAgQ29uZmlnVCBjb25maWc7CisgICAgICAgICAgICBwYXJzZUludG8oIGFyZ3MsIGNvbmZpZyApOworICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHBhcnNlSW50byggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBhcmdzLCBDb25maWdUJiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcm9jZXNzTmFtZSA9IGFyZ3MuZW1wdHkoKSA/IHN0ZDo6c3RyaW5nKCkgOiBhcmdzWzBdOworICAgICAgICAgICAgc3RkOjpzaXplX3QgbGFzdFNsYXNoID0gcHJvY2Vzc05hbWUuZmluZF9sYXN0X29mKCAiL1xcIiApOworICAgICAgICAgICAgaWYoIGxhc3RTbGFzaCAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgcHJvY2Vzc05hbWUgPSBwcm9jZXNzTmFtZS5zdWJzdHIoIGxhc3RTbGFzaCsxICk7CisgICAgICAgICAgICBtX2JvdW5kUHJvY2Vzc05hbWUuc2V0KCBjb25maWcsIHByb2Nlc3NOYW1lICk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiB0b2tlbnM7CisgICAgICAgICAgICBQYXJzZXIgcGFyc2VyOworICAgICAgICAgICAgcGFyc2VyLnBhcnNlSW50b1Rva2VucyggYXJncywgdG9rZW5zICk7CisgICAgICAgICAgICByZXR1cm4gcG9wdWxhdGUoIHRva2VucywgY29uZmlnICk7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBwb3B1bGF0ZSggc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gY29uc3QmIHRva2VucywgQ29uZmlnVCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgdmFsaWRhdGUoKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHVudXNlZFRva2VucyA9IHBvcHVsYXRlT3B0aW9ucyggdG9rZW5zLCBjb25maWcgKTsKKyAgICAgICAgICAgIHVudXNlZFRva2VucyA9IHBvcHVsYXRlRml4ZWRBcmdzKCB1bnVzZWRUb2tlbnMsIGNvbmZpZyApOworICAgICAgICAgICAgdW51c2VkVG9rZW5zID0gcG9wdWxhdGVGbG9hdGluZ0FyZ3MoIHVudXNlZFRva2VucywgY29uZmlnICk7CisgICAgICAgICAgICByZXR1cm4gdW51c2VkVG9rZW5zOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gcG9wdWxhdGVPcHRpb25zKCBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBjb25zdCYgdG9rZW5zLCBDb25maWdUJiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiB1bnVzZWRUb2tlbnM7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZXJyb3JzOworICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHRva2Vucy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgICAgICBQYXJzZXI6OlRva2VuIGNvbnN0JiB0b2tlbiA9IHRva2Vuc1tpXTsKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxBcmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fb3B0aW9ucy5iZWdpbigpLCBpdEVuZCA9IG1fb3B0aW9ucy5lbmQoKTsKKyAgICAgICAgICAgICAgICBmb3IoOyBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgICAgICAgICAgQXJnIGNvbnN0JiBhcmcgPSAqaXQ7CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoIHRva2VuLnR5cGUgPT0gUGFyc2VyOjpUb2tlbjo6U2hvcnRPcHQgJiYgYXJnLmhhc1Nob3J0TmFtZSggdG9rZW4uZGF0YSApICkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHRva2VuLnR5cGUgPT0gUGFyc2VyOjpUb2tlbjo6TG9uZ09wdCAmJiBhcmcuaGFzTG9uZ05hbWUoIHRva2VuLmRhdGEgKSApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhcmcudGFrZXNBcmcoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGkgPT0gdG9rZW5zLnNpemUoKS0xIHx8IHRva2Vuc1tpKzFdLnR5cGUgIT0gUGFyc2VyOjpUb2tlbjo6UG9zaXRpb25hbCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaF9iYWNrKCAiRXhwZWN0ZWQgYXJndW1lbnQgdG8gb3B0aW9uOiAiICsgdG9rZW4uZGF0YSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcuYm91bmRGaWVsZC5zZXQoIGNvbmZpZywgdG9rZW5zWysraV0uZGF0YSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLmJvdW5kRmllbGQuc2V0KCBjb25maWcsICJ0cnVlIiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCggc3RkOjpleGNlcHRpb24mIGV4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2hfYmFjayggc3RkOjpzdHJpbmcoIGV4LndoYXQoKSApICsgIlxuLSB3aGlsZSBwYXJzaW5nOiAoIiArIGFyZy5jb21tYW5kcygpICsgIikiICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIGl0ID09IGl0RW5kICkgeworICAgICAgICAgICAgICAgICAgICBpZiggdG9rZW4udHlwZSA9PSBQYXJzZXI6OlRva2VuOjpQb3NpdGlvbmFsIHx8ICFtX3Rocm93T25VbnJlY29nbmlzZWRUb2tlbnMgKQorICAgICAgICAgICAgICAgICAgICAgICAgdW51c2VkVG9rZW5zLnB1c2hfYmFjayggdG9rZW4gKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggZXJyb3JzLmVtcHR5KCkgJiYgbV90aHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoX2JhY2soICJ1bnJlY29nbmlzZWQgb3B0aW9uOiAiICsgdG9rZW4uZGF0YSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhZXJyb3JzLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBlcnJvcnMuYmVnaW4oKSwgaXRFbmQgPSBlcnJvcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpdCAhPSBlcnJvcnMuYmVnaW4oKSApCisgICAgICAgICAgICAgICAgICAgICAgICBvc3MgPDwgIlxuIjsKKyAgICAgICAgICAgICAgICAgICAgb3NzIDw8ICppdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCBvc3Muc3RyKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB1bnVzZWRUb2tlbnM7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gcG9wdWxhdGVGaXhlZEFyZ3MoIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IGNvbnN0JiB0b2tlbnMsIENvbmZpZ1QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHVudXNlZFRva2VuczsKKyAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IDE7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgdG9rZW5zLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgICAgIFBhcnNlcjo6VG9rZW4gY29uc3QmIHRva2VuID0gdG9rZW5zW2ldOworICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6bWFwPGludCwgQXJnPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3Bvc2l0aW9uYWxBcmdzLmZpbmQoIHBvc2l0aW9uICk7CisgICAgICAgICAgICAgICAgaWYoIGl0ICE9IG1fcG9zaXRpb25hbEFyZ3MuZW5kKCkgKQorICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmJvdW5kRmllbGQuc2V0KCBjb25maWcsIHRva2VuLmRhdGEgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHVudXNlZFRva2Vucy5wdXNoX2JhY2soIHRva2VuICk7CisgICAgICAgICAgICAgICAgaWYoIHRva2VuLnR5cGUgPT0gUGFyc2VyOjpUb2tlbjo6UG9zaXRpb25hbCApCisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdW51c2VkVG9rZW5zOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHBvcHVsYXRlRmxvYXRpbmdBcmdzKCBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBjb25zdCYgdG9rZW5zLCBDb25maWdUJiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICBpZiggIW1fZmxvYXRpbmdBcmcuZ2V0KCkgKQorICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbnM7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiB1bnVzZWRUb2tlbnM7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgdG9rZW5zLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgICAgIFBhcnNlcjo6VG9rZW4gY29uc3QmIHRva2VuID0gdG9rZW5zW2ldOworICAgICAgICAgICAgICAgIGlmKCB0b2tlbi50eXBlID09IFBhcnNlcjo6VG9rZW46OlBvc2l0aW9uYWwgKQorICAgICAgICAgICAgICAgICAgICBtX2Zsb2F0aW5nQXJnLT5ib3VuZEZpZWxkLnNldCggY29uZmlnLCB0b2tlbi5kYXRhICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB1bnVzZWRUb2tlbnMucHVzaF9iYWNrKCB0b2tlbiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHVudXNlZFRva2VuczsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdmFsaWRhdGUoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBpZiggbV9vcHRpb25zLmVtcHR5KCkgJiYgbV9wb3NpdGlvbmFsQXJncy5lbXB0eSgpICYmICFtX2Zsb2F0aW5nQXJnLmdldCgpICkKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiTm8gb3B0aW9ucyBvciBhcmd1bWVudHMgc3BlY2lmaWVkIiApOworCisgICAgICAgICAgICBmb3IoIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPEFyZz46OmNvbnN0X2l0ZXJhdG9yICBpdCA9IG1fb3B0aW9ucy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBtX29wdGlvbnMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgICAgICBpdC0+dmFsaWRhdGUoKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgRGV0YWlsOjpCb3VuZEFyZ0Z1bmN0aW9uPENvbmZpZ1Q+IG1fYm91bmRQcm9jZXNzTmFtZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QXJnPiBtX29wdGlvbnM7CisgICAgICAgIHN0ZDo6bWFwPGludCwgQXJnPiBtX3Bvc2l0aW9uYWxBcmdzOworICAgICAgICBBcmdBdXRvUHRyIG1fZmxvYXRpbmdBcmc7CisgICAgICAgIGludCBtX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbjsKKyAgICAgICAgYm9vbCBtX3Rocm93T25VbnJlY29nbmlzZWRUb2tlbnM7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENsYXJhCisKK1NUSVRDSF9DTEFSQV9DTE9TRV9OQU1FU1BBQ0UKKyN1bmRlZiBTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UKKyN1bmRlZiBTVElUQ0hfQ0xBUkFfQ0xPU0VfTkFNRVNQQUNFCisKKyNlbmRpZiAvLyBUV09CTFVFQ1VCRVNfQ0xBUkFfSF9JTkNMVURFRAorI3VuZGVmIFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRQorCisvLyBSZXN0b3JlIENsYXJhJ3MgdmFsdWUgZm9yIGNvbnNvbGUgd2lkdGgsIGlmIHByZXNlbnQKKyNpZmRlZiBDQVRDSF9URU1QX0NMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRICisjZGVmaW5lIENMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRIIENBVENIX1RFTVBfQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyN1bmRlZiBDQVRDSF9URU1QX0NMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRICisjZW5kaWYKKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8Y3RpbWU+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBpbmxpbmUgdm9pZCBhYm9ydEFmdGVyRmlyc3QoIENvbmZpZ0RhdGEmIGNvbmZpZyApIHsgY29uZmlnLmFib3J0QWZ0ZXIgPSAxOyB9CisgICAgaW5saW5lIHZvaWQgYWJvcnRBZnRlclgoIENvbmZpZ0RhdGEmIGNvbmZpZywgaW50IHggKSB7CisgICAgICAgIGlmKCB4IDwgMSApCisgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJWYWx1ZSBhZnRlciAteCBvciAtLWFib3J0QWZ0ZXIgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyIgKTsKKyAgICAgICAgY29uZmlnLmFib3J0QWZ0ZXIgPSB4OworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBhZGRUZXN0T3JUYWdzKCBDb25maWdEYXRhJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBfdGVzdFNwZWMgKSB7IGNvbmZpZy50ZXN0c09yVGFncy5wdXNoX2JhY2soIF90ZXN0U3BlYyApOyB9CisgICAgaW5saW5lIHZvaWQgYWRkU2VjdGlvblRvUnVuKCBDb25maWdEYXRhJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzZWN0aW9uTmFtZSApIHsgY29uZmlnLnNlY3Rpb25zVG9SdW4ucHVzaF9iYWNrKCBzZWN0aW9uTmFtZSApOyB9CisgICAgaW5saW5lIHZvaWQgYWRkUmVwb3J0ZXJOYW1lKCBDb25maWdEYXRhJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBfcmVwb3J0ZXJOYW1lICkgeyBjb25maWcucmVwb3J0ZXJOYW1lcy5wdXNoX2JhY2soIF9yZXBvcnRlck5hbWUgKTsgfQorCisgICAgaW5saW5lIHZvaWQgYWRkV2FybmluZyggQ29uZmlnRGF0YSYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgX3dhcm5pbmcgKSB7CisgICAgICAgIGlmKCBfd2FybmluZyA9PSAiTm9Bc3NlcnRpb25zIiApCisgICAgICAgICAgICBjb25maWcud2FybmluZ3MgPSBzdGF0aWNfY2FzdDxXYXJuQWJvdXQ6OldoYXQ+KCBjb25maWcud2FybmluZ3MgfCBXYXJuQWJvdXQ6Ok5vQXNzZXJ0aW9ucyApOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJVbnJlY29nbmlzZWQgd2FybmluZzogJyIgKyBfd2FybmluZyArICdcJycgKTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgc2V0T3JkZXIoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIG9yZGVyICkgeworICAgICAgICBpZiggc3RhcnRzV2l0aCggImRlY2xhcmVkIiwgb3JkZXIgKSApCisgICAgICAgICAgICBjb25maWcucnVuT3JkZXIgPSBSdW5UZXN0czo6SW5EZWNsYXJhdGlvbk9yZGVyOworICAgICAgICBlbHNlIGlmKCBzdGFydHNXaXRoKCAibGV4aWNhbCIsIG9yZGVyICkgKQorICAgICAgICAgICAgY29uZmlnLnJ1bk9yZGVyID0gUnVuVGVzdHM6OkluTGV4aWNvZ3JhcGhpY2FsT3JkZXI7CisgICAgICAgIGVsc2UgaWYoIHN0YXJ0c1dpdGgoICJyYW5kb20iLCBvcmRlciApICkKKyAgICAgICAgICAgIGNvbmZpZy5ydW5PcmRlciA9IFJ1blRlc3RzOjpJblJhbmRvbU9yZGVyOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJVbnJlY29nbmlzZWQgb3JkZXJpbmc6ICciICsgb3JkZXIgKyAnXCcnICk7CisgICAgfQorICAgIGlubGluZSB2b2lkIHNldFJuZ1NlZWQoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIHNlZWQgKSB7CisgICAgICAgIGlmKCBzZWVkID09ICJ0aW1lIiApIHsKKyAgICAgICAgICAgIGNvbmZpZy5ybmdTZWVkID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50Piggc3RkOjp0aW1lKDApICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgIHNzIDw8IHNlZWQ7CisgICAgICAgICAgICBzcyA+PiBjb25maWcucm5nU2VlZDsKKyAgICAgICAgICAgIGlmKCBzcy5mYWlsKCkgKQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggIkFyZ3VtZW50IHRvIC0tcm5nLXNlZWQgc2hvdWxkIGJlIHRoZSB3b3JkICd0aW1lJyBvciBhIG51bWJlciIgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpbmxpbmUgdm9pZCBzZXRWZXJib3NpdHkoIENvbmZpZ0RhdGEmIGNvbmZpZywgaW50IGxldmVsICkgeworICAgICAgICAvLyAhVEJEOiBhY2NlcHQgc3RyaW5ncz8KKyAgICAgICAgY29uZmlnLnZlcmJvc2l0eSA9IHN0YXRpY19jYXN0PFZlcmJvc2l0eTo6TGV2ZWw+KCBsZXZlbCApOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBzZXRTaG93RHVyYXRpb25zKCBDb25maWdEYXRhJiBjb25maWcsIGJvb2wgX3Nob3dEdXJhdGlvbnMgKSB7CisgICAgICAgIGNvbmZpZy5zaG93RHVyYXRpb25zID0gX3Nob3dEdXJhdGlvbnMKKyAgICAgICAgICAgID8gU2hvd0R1cmF0aW9uczo6QWx3YXlzCisgICAgICAgICAgICA6IFNob3dEdXJhdGlvbnM6Ok5ldmVyOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBzZXRVc2VDb2xvdXIoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIHZhbHVlICkgeworICAgICAgICBzdGQ6OnN0cmluZyBtb2RlID0gdG9Mb3dlciggdmFsdWUgKTsKKworICAgICAgICBpZiggbW9kZSA9PSAieWVzIiApCisgICAgICAgICAgICBjb25maWcudXNlQ29sb3VyID0gVXNlQ29sb3VyOjpZZXM7CisgICAgICAgIGVsc2UgaWYoIG1vZGUgPT0gIm5vIiApCisgICAgICAgICAgICBjb25maWcudXNlQ29sb3VyID0gVXNlQ29sb3VyOjpObzsKKyAgICAgICAgZWxzZSBpZiggbW9kZSA9PSAiYXV0byIgKQorICAgICAgICAgICAgY29uZmlnLnVzZUNvbG91ciA9IFVzZUNvbG91cjo6QXV0bzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCAiY29sb3VyIG1vZGUgbXVzdCBiZSBvbmUgb2Y6IGF1dG8sIHllcyBvciBubyIgKTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgZm9yY2VDb2xvdXIoIENvbmZpZ0RhdGEmIGNvbmZpZyApIHsKKyAgICAgICAgY29uZmlnLnVzZUNvbG91ciA9IFVzZUNvbG91cjo6WWVzOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBsb2FkVGVzdE5hbWVzRnJvbUZpbGUoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIF9maWxlbmFtZSApIHsKKyAgICAgICAgc3RkOjppZnN0cmVhbSBmKCBfZmlsZW5hbWUuY19zdHIoKSApOworICAgICAgICBpZiggIWYuaXNfb3BlbigpICkKKyAgICAgICAgICAgIHRocm93IHN0ZDo6ZG9tYWluX2Vycm9yKCAiVW5hYmxlIHRvIGxvYWQgaW5wdXQgZmlsZTogIiArIF9maWxlbmFtZSApOworCisgICAgICAgIHN0ZDo6c3RyaW5nIGxpbmU7CisgICAgICAgIHdoaWxlKCBzdGQ6OmdldGxpbmUoIGYsIGxpbmUgKSApIHsKKyAgICAgICAgICAgIGxpbmUgPSB0cmltKGxpbmUpOworICAgICAgICAgICAgaWYoICFsaW5lLmVtcHR5KCkgJiYgIXN0YXJ0c1dpdGgoIGxpbmUsICcjJyApICkgeworICAgICAgICAgICAgICAgIGlmKCAhc3RhcnRzV2l0aCggbGluZSwgJyInICkgKQorICAgICAgICAgICAgICAgICAgICBsaW5lID0gJyInICsgbGluZSArICciJzsKKyAgICAgICAgICAgICAgICBhZGRUZXN0T3JUYWdzKCBjb25maWcsIGxpbmUgKyAnLCcgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBDbGFyYTo6Q29tbWFuZExpbmU8Q29uZmlnRGF0YT4gbWFrZUNvbW1hbmRMaW5lUGFyc2VyKCkgeworCisgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBDbGFyYTsKKyAgICAgICAgQ29tbWFuZExpbmU8Q29uZmlnRGF0YT4gY2xpOworCisgICAgICAgIGNsaS5iaW5kUHJvY2Vzc05hbWUoICZDb25maWdEYXRhOjpwcm9jZXNzTmFtZSApOworCisgICAgICAgIGNsaVsiLT8iXVsiLWgiXVsiLS1oZWxwIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImRpc3BsYXkgdXNhZ2UgaW5mb3JtYXRpb24iICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6c2hvd0hlbHAgKTsKKworICAgICAgICBjbGlbIi1sIl1bIi0tbGlzdC10ZXN0cyJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJsaXN0IGFsbC9tYXRjaGluZyB0ZXN0IGNhc2VzIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Omxpc3RUZXN0cyApOworCisgICAgICAgIGNsaVsiLXQiXVsiLS1saXN0LXRhZ3MiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAibGlzdCBhbGwvbWF0Y2hpbmcgdGFncyIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpsaXN0VGFncyApOworCisgICAgICAgIGNsaVsiLXMiXVsiLS1zdWNjZXNzIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImluY2x1ZGUgc3VjY2Vzc2Z1bCB0ZXN0cyBpbiBvdXRwdXQiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6c2hvd1N1Y2Nlc3NmdWxUZXN0cyApOworCisgICAgICAgIGNsaVsiLWIiXVsiLS1icmVhayJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJicmVhayBpbnRvIGRlYnVnZ2VyIG9uIGZhaWx1cmUiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6c2hvdWxkRGVidWdCcmVhayApOworCisgICAgICAgIGNsaVsiLWUiXVsiLS1ub3Rocm93Il0KKyAgICAgICAgICAgIC5kZXNjcmliZSggInNraXAgZXhjZXB0aW9uIHRlc3RzIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Om5vVGhyb3cgKTsKKworICAgICAgICBjbGlbIi1pIl1bIi0taW52aXNpYmxlcyJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJzaG93IGludmlzaWJsZXMgKHRhYnMsIG5ld2xpbmVzKSIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpzaG93SW52aXNpYmxlcyApOworCisgICAgICAgIGNsaVsiLW8iXVsiLS1vdXQiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAib3V0cHV0IGZpbGVuYW1lIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Om91dHB1dEZpbGVuYW1lLCAiZmlsZW5hbWUiICk7CisKKyAgICAgICAgY2xpWyItciJdWyItLXJlcG9ydGVyIl0KKy8vICAgICAgICAgICAgLnBsYWNlaG9sZGVyKCAibmFtZVs6ZmlsZW5hbWVdIiApCisgICAgICAgICAgICAuZGVzY3JpYmUoICJyZXBvcnRlciB0byB1c2UgKGRlZmF1bHRzIHRvIGNvbnNvbGUpIiApCisgICAgICAgICAgICAuYmluZCggJmFkZFJlcG9ydGVyTmFtZSwgIm5hbWUiICk7CisKKyAgICAgICAgY2xpWyItbiJdWyItLW5hbWUiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAic3VpdGUgbmFtZSIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpuYW1lLCAibmFtZSIgKTsKKworICAgICAgICBjbGlbIi1hIl1bIi0tYWJvcnQiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiYWJvcnQgYXQgZmlyc3QgZmFpbHVyZSIgKQorICAgICAgICAgICAgLmJpbmQoICZhYm9ydEFmdGVyRmlyc3QgKTsKKworICAgICAgICBjbGlbIi14Il1bIi0tYWJvcnR4Il0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImFib3J0IGFmdGVyIHggZmFpbHVyZXMiICkKKyAgICAgICAgICAgIC5iaW5kKCAmYWJvcnRBZnRlclgsICJuby4gZmFpbHVyZXMiICk7CisKKyAgICAgICAgY2xpWyItdyJdWyItLXdhcm4iXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiZW5hYmxlIHdhcm5pbmdzIiApCisgICAgICAgICAgICAuYmluZCggJmFkZFdhcm5pbmcsICJ3YXJuaW5nIG5hbWUiICk7CisKKy8vIC0gbmVlZHMgdXBkYXRpbmcgaWYgcmVpbnN0YXRlZAorLy8gICAgICAgIGNsaS5pbnRvKCAmc2V0VmVyYm9zaXR5ICkKKy8vICAgICAgICAgICAgLmRlc2NyaWJlKCAibGV2ZWwgb2YgdmVyYm9zaXR5ICgwPW5vIG91dHB1dCkiICkKKy8vICAgICAgICAgICAgLnNob3J0T3B0KCAidiIpCisvLyAgICAgICAgICAgIC5sb25nT3B0KCAidmVyYm9zaXR5IiApCisvLyAgICAgICAgICAgIC5wbGFjZWhvbGRlciggImxldmVsIiApOworCisgICAgICAgIGNsaVtfXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAid2hpY2ggdGVzdCBvciB0ZXN0cyB0byB1c2UiICkKKyAgICAgICAgICAgIC5iaW5kKCAmYWRkVGVzdE9yVGFncywgInRlc3QgbmFtZSwgcGF0dGVybiBvciB0YWdzIiApOworCisgICAgICAgIGNsaVsiLWQiXVsiLS1kdXJhdGlvbnMiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAic2hvdyB0ZXN0IGR1cmF0aW9ucyIgKQorICAgICAgICAgICAgLmJpbmQoICZzZXRTaG93RHVyYXRpb25zLCAieWVzfG5vIiApOworCisgICAgICAgIGNsaVsiLWYiXVsiLS1pbnB1dC1maWxlIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImxvYWQgdGVzdCBuYW1lcyB0byBydW4gZnJvbSBhIGZpbGUiICkKKyAgICAgICAgICAgIC5iaW5kKCAmbG9hZFRlc3ROYW1lc0Zyb21GaWxlLCAiZmlsZW5hbWUiICk7CisKKyAgICAgICAgY2xpWyItIyJdWyItLWZpbGVuYW1lcy1hcy10YWdzIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImFkZHMgYSB0YWcgZm9yIHRoZSBmaWxlbmFtZSIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpmaWxlbmFtZXNBc1RhZ3MgKTsKKworICAgICAgICBjbGlbIi1jIl1bIi0tc2VjdGlvbiJdCisgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCAic3BlY2lmeSBzZWN0aW9uIHRvIHJ1biIgKQorICAgICAgICAgICAgICAgIC5iaW5kKCAmYWRkU2VjdGlvblRvUnVuLCAic2VjdGlvbiBuYW1lIiApOworCisgICAgICAgIC8vIExlc3MgY29tbW9uIGNvbW1hbmRzIHdoaWNoIGRvbid0IGhhdmUgYSBzaG9ydCBmb3JtCisgICAgICAgIGNsaVsiLS1saXN0LXRlc3QtbmFtZXMtb25seSJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJsaXN0IGFsbC9tYXRjaGluZyB0ZXN0IGNhc2VzIG5hbWVzIG9ubHkiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6bGlzdFRlc3ROYW1lc09ubHkgKTsKKworICAgICAgICBjbGlbIi0tbGlzdC1yZXBvcnRlcnMiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAibGlzdCBhbGwgcmVwb3J0ZXJzIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Omxpc3RSZXBvcnRlcnMgKTsKKworICAgICAgICBjbGlbIi0tb3JkZXIiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAidGVzdCBjYXNlIG9yZGVyIChkZWZhdWx0cyB0byBkZWNsKSIgKQorICAgICAgICAgICAgLmJpbmQoICZzZXRPcmRlciwgImRlY2x8bGV4fHJhbmQiICk7CisKKyAgICAgICAgY2xpWyItLXJuZy1zZWVkIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggInNldCBhIHNwZWNpZmljIHNlZWQgZm9yIHJhbmRvbSBudW1iZXJzIiApCisgICAgICAgICAgICAuYmluZCggJnNldFJuZ1NlZWQsICIndGltZSd8bnVtYmVyIiApOworCisgICAgICAgIGNsaVsiLS1mb3JjZS1jb2xvdXIiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiZm9yY2UgY29sb3VyaXNlZCBvdXRwdXQgKGRlcHJlY2F0ZWQpIiApCisgICAgICAgICAgICAuYmluZCggJmZvcmNlQ29sb3VyICk7CisKKyAgICAgICAgY2xpWyItLXVzZS1jb2xvdXIiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAic2hvdWxkIG91dHB1dCBiZSBjb2xvdXJpc2VkIiApCisgICAgICAgICAgICAuYmluZCggJnNldFVzZUNvbG91ciwgInllc3xubyIgKTsKKworICAgICAgICByZXR1cm4gY2xpOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9saXN0LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTElTVF9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3RleHQuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVYVF9IX0lOQ0xVREVECisKKyNkZWZpbmUgVEJDX1RFWFRfRk9STUFUX0NPTlNPTEVfV0lEVEggQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgKKworI2RlZmluZSBDTElDSEVfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRSBDYXRjaAorLy8gI2luY2x1ZGVkIGZyb206IC4uL2V4dGVybmFsL3RiY190ZXh0X2Zvcm1hdC5oCisvLyBPbmx5IHVzZSBoZWFkZXIgZ3VhcmQgaWYgd2UgYXJlIG5vdCB1c2luZyBhbiBvdXRlciBuYW1lc3BhY2UKKyNpZm5kZWYgQ0xJQ0hFX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKKyMgaWZkZWYgVFdPQkxVRUNVQkVTX1RFWFRfRk9STUFUX0hfSU5DTFVERUQKKyMgIGlmbmRlZiBUV09CTFVFQ1VCRVNfVEVYVF9GT1JNQVRfSF9BTFJFQURZX0lOQ0xVREVECisjICAgZGVmaW5lIFRXT0JMVUVDVUJFU19URVhUX0ZPUk1BVF9IX0FMUkVBRFlfSU5DTFVERUQKKyMgIGVuZGlmCisjIGVsc2UKKyMgIGRlZmluZSBUV09CTFVFQ1VCRVNfVEVYVF9GT1JNQVRfSF9JTkNMVURFRAorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFRXT0JMVUVDVUJFU19URVhUX0ZPUk1BVF9IX0FMUkVBRFlfSU5DTFVERUQKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKy8vIFVzZSBvcHRpb25hbCBvdXRlciBuYW1lc3BhY2UKKyNpZmRlZiBDTElDSEVfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRQorbmFtZXNwYWNlIENMSUNIRV9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFIHsKKyNlbmRpZgorCituYW1lc3BhY2UgVGJjIHsKKworI2lmZGVmIFRCQ19URVhUX0ZPUk1BVF9DT05TT0xFX1dJRFRICisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvbnNvbGVXaWR0aCA9IFRCQ19URVhUX0ZPUk1BVF9DT05TT0xFX1dJRFRIOworI2Vsc2UKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgY29uc29sZVdpZHRoID0gODA7CisjZW5kaWYKKworICAgIHN0cnVjdCBUZXh0QXR0cmlidXRlcyB7CisgICAgICAgIFRleHRBdHRyaWJ1dGVzKCkKKyAgICAgICAgOiAgIGluaXRpYWxJbmRlbnQoIHN0ZDo6c3RyaW5nOjpucG9zICksCisgICAgICAgICAgICBpbmRlbnQoIDAgKSwKKyAgICAgICAgICAgIHdpZHRoKCBjb25zb2xlV2lkdGgtMSApCisgICAgICAgIHt9CisKKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMmIHNldEluaXRpYWxJbmRlbnQoIHN0ZDo6c2l6ZV90IF92YWx1ZSApICB7IGluaXRpYWxJbmRlbnQgPSBfdmFsdWU7IHJldHVybiAqdGhpczsgfQorICAgICAgICBUZXh0QXR0cmlidXRlcyYgc2V0SW5kZW50KCBzdGQ6OnNpemVfdCBfdmFsdWUgKSAgICAgICAgIHsgaW5kZW50ID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMmIHNldFdpZHRoKCBzdGQ6OnNpemVfdCBfdmFsdWUgKSAgICAgICAgICB7IHdpZHRoID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgICBzdGQ6OnNpemVfdCBpbml0aWFsSW5kZW50OyAgLy8gaW5kZW50IG9mIGZpcnN0IGxpbmUsIG9yIG5wb3MKKyAgICAgICAgc3RkOjpzaXplX3QgaW5kZW50OyAgICAgICAgIC8vIGluZGVudCBvZiBzdWJzZXF1ZW50IGxpbmVzLCBvciBhbGwgaWYgaW5pdGlhbEluZGVudCBpcyBucG9zCisgICAgICAgIHN0ZDo6c2l6ZV90IHdpZHRoOyAgICAgICAgICAvLyBtYXhpbXVtIHdpZHRoIG9mIHRleHQsIGluY2x1ZGluZyBpbmRlbnQuIExvbmdlciB0ZXh0IHdpbGwgd3JhcAorICAgIH07CisKKyAgICBjbGFzcyBUZXh0IHsKKyAgICBwdWJsaWM6CisgICAgICAgIFRleHQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfc3RyLCBUZXh0QXR0cmlidXRlcyBjb25zdCYgX2F0dHIgPSBUZXh0QXR0cmlidXRlcygpICkKKyAgICAgICAgOiBhdHRyKCBfYXR0ciApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHdyYXBwYWJsZUJlZm9yZUNoYXJzID0gIlsoezxcdCI7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyB3cmFwcGFibGVBZnRlckNoYXJzID0gIl0pfT4tLC4vfFxcIjsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHdyYXBwYWJsZUluc3RlYWRPZkNoYXJzID0gIiBcblxyIjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGluZGVudCA9IF9hdHRyLmluaXRpYWxJbmRlbnQgIT0gc3RkOjpzdHJpbmc6Om5wb3MKKyAgICAgICAgICAgICAgICA/IHN0ZDo6c3RyaW5nKCBfYXR0ci5pbml0aWFsSW5kZW50LCAnICcgKQorICAgICAgICAgICAgICAgIDogc3RkOjpzdHJpbmcoIF9hdHRyLmluZGVudCwgJyAnICk7CisKKyAgICAgICAgICAgIHR5cGVkZWYgc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgICAgICAgaXRlcmF0b3IgaXQgPSBfc3RyLmJlZ2luKCk7CisgICAgICAgICAgICBjb25zdCBpdGVyYXRvciBzdHJFbmQgPSBfc3RyLmVuZCgpOworCisgICAgICAgICAgICB3aGlsZSggaXQgIT0gc3RyRW5kICkgeworCisgICAgICAgICAgICAgICAgaWYoIGxpbmVzLnNpemUoKSA+PSAxMDAwICkgeworICAgICAgICAgICAgICAgICAgICBsaW5lcy5wdXNoX2JhY2soICIuLi4gbWVzc2FnZSB0cnVuY2F0ZWQgZHVlIHRvIGV4Y2Vzc2l2ZSBzaXplIiApOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3VmZml4OworICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHdpZHRoID0gKHN0ZDo6bWluKSggc3RhdGljX2Nhc3Q8c2l6ZV90Piggc3RyRW5kLWl0ICksIF9hdHRyLndpZHRoLXN0YXRpY19jYXN0PHNpemVfdD4oIGluZGVudC5zaXplKCkgKSApOworICAgICAgICAgICAgICAgIGl0ZXJhdG9yIGl0RW5kID0gaXQrd2lkdGg7CisgICAgICAgICAgICAgICAgaXRlcmF0b3IgaXROZXh0ID0gX3N0ci5lbmQoKTsKKworICAgICAgICAgICAgICAgIGl0ZXJhdG9yIGl0TmV3TGluZSA9IHN0ZDo6ZmluZCggaXQsIGl0RW5kLCAnXG4nICk7CisgICAgICAgICAgICAgICAgaWYoIGl0TmV3TGluZSAhPSBpdEVuZCApCisgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gaXROZXdMaW5lOworCisgICAgICAgICAgICAgICAgaWYoIGl0RW5kICE9IHN0ckVuZCAgKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgZm91bmRXcmFwUG9pbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IgZmluZEl0ID0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB3cmFwcGFibGVBZnRlckNoYXJzLmZpbmQoICpmaW5kSXQgKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyAmJiBmaW5kSXQgIT0gaXRFbmQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBmaW5kSXQrMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdE5leHQgPSBmaW5kSXQrMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFdyYXBQb2ludCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBmaW5kSXQgPiBpdCAmJiB3cmFwcGFibGVCZWZvcmVDaGFycy5maW5kKCAqZmluZEl0ICkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBmaW5kSXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXROZXh0ID0gZmluZEl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV3JhcFBvaW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHdyYXBwYWJsZUluc3RlYWRPZkNoYXJzLmZpbmQoICpmaW5kSXQgKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdE5leHQgPSBmaW5kSXQrMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IGZpbmRJdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFdyYXBQb2ludCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggZmluZEl0ID09IGl0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWZpbmRJdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSggIWZvdW5kV3JhcFBvaW50ICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoICFmb3VuZFdyYXBQb2ludCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGdvb2Qgd3JhcCBjaGFyLCBzbyB3ZSdsbCBicmVhayBtaWQgd29yZCBhbmQgYWRkIGEgaHlwaGVuCisgICAgICAgICAgICAgICAgICAgICAgICAtLWl0RW5kOworICAgICAgICAgICAgICAgICAgICAgICAgaXROZXh0ID0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSAiLSI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggaXRFbmQgPiBpdCAmJiB3cmFwcGFibGVJbnN0ZWFkT2ZDaGFycy5maW5kKCAqKGl0RW5kLTEpICkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0taXRFbmQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGluZXMucHVzaF9iYWNrKCBpbmRlbnQgKyBzdGQ6OnN0cmluZyggaXQsIGl0RW5kICkgKyBzdWZmaXggKTsKKworICAgICAgICAgICAgICAgIGlmKCBpbmRlbnQuc2l6ZSgpICE9IF9hdHRyLmluZGVudCApCisgICAgICAgICAgICAgICAgICAgIGluZGVudCA9IHN0ZDo6c3RyaW5nKCBfYXR0ci5pbmRlbnQsICcgJyApOworICAgICAgICAgICAgICAgIGl0ID0gaXROZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gbGluZXMuYmVnaW4oKTsgfQorICAgICAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBsaW5lcy5lbmQoKTsgfQorICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgbGFzdCgpIGNvbnN0IHsgcmV0dXJuIGxpbmVzLmJhY2soKTsgfQorICAgICAgICBzdGQ6OnNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbGluZXMuc2l6ZSgpOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcGVyYXRvcltdKCBzdGQ6OnNpemVfdCBfaW5kZXggKSBjb25zdCB7IHJldHVybiBsaW5lc1tfaW5kZXhdOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCAqdGhpczsKKyAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIF9zdHJlYW0sIFRleHQgY29uc3QmIF90ZXh0ICkgeworICAgICAgICAgICAgZm9yKCBUZXh0Ojpjb25zdF9pdGVyYXRvciBpdCA9IF90ZXh0LmJlZ2luKCksIGl0RW5kID0gX3RleHQuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgaWYoIGl0ICE9IF90ZXh0LmJlZ2luKCkgKQorICAgICAgICAgICAgICAgICAgICBfc3RyZWFtIDw8ICJcbiI7CisgICAgICAgICAgICAgICAgX3N0cmVhbSA8PCAqaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX3N0cmVhbTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RyOworICAgICAgICBUZXh0QXR0cmlidXRlcyBhdHRyOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGluZXM7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIFRiYworCisjaWZkZWYgQ0xJQ0hFX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKK30gLy8gZW5kIG91dGVyIG5hbWVzcGFjZQorI2VuZGlmCisKKyNlbmRpZiAvLyBUV09CTFVFQ1VCRVNfVEVYVF9GT1JNQVRfSF9BTFJFQURZX0lOQ0xVREVECisjdW5kZWYgQ0xJQ0hFX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICB1c2luZyBUYmM6OlRleHQ7CisgICAgdXNpbmcgVGJjOjpUZXh0QXR0cmlidXRlczsKK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2NvbnNvbGVfY29sb3VyLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09OU09MRV9DT0xPVVJfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgQ29sb3VyIHsKKyAgICAgICAgZW51bSBDb2RlIHsKKyAgICAgICAgICAgIE5vbmUgPSAwLAorCisgICAgICAgICAgICBXaGl0ZSwKKyAgICAgICAgICAgIFJlZCwKKyAgICAgICAgICAgIEdyZWVuLAorICAgICAgICAgICAgQmx1ZSwKKyAgICAgICAgICAgIEN5YW4sCisgICAgICAgICAgICBZZWxsb3csCisgICAgICAgICAgICBHcmV5LAorCisgICAgICAgICAgICBCcmlnaHQgPSAweDEwLAorCisgICAgICAgICAgICBCcmlnaHRSZWQgPSBCcmlnaHQgfCBSZWQsCisgICAgICAgICAgICBCcmlnaHRHcmVlbiA9IEJyaWdodCB8IEdyZWVuLAorICAgICAgICAgICAgTGlnaHRHcmV5ID0gQnJpZ2h0IHwgR3JleSwKKyAgICAgICAgICAgIEJyaWdodFdoaXRlID0gQnJpZ2h0IHwgV2hpdGUsCisKKyAgICAgICAgICAgIC8vIEJ5IGludGVudGlvbgorICAgICAgICAgICAgRmlsZU5hbWUgPSBMaWdodEdyZXksCisgICAgICAgICAgICBXYXJuaW5nID0gWWVsbG93LAorICAgICAgICAgICAgUmVzdWx0RXJyb3IgPSBCcmlnaHRSZWQsCisgICAgICAgICAgICBSZXN1bHRTdWNjZXNzID0gQnJpZ2h0R3JlZW4sCisgICAgICAgICAgICBSZXN1bHRFeHBlY3RlZEZhaWx1cmUgPSBXYXJuaW5nLAorCisgICAgICAgICAgICBFcnJvciA9IEJyaWdodFJlZCwKKyAgICAgICAgICAgIFN1Y2Nlc3MgPSBHcmVlbiwKKworICAgICAgICAgICAgT3JpZ2luYWxFeHByZXNzaW9uID0gQ3lhbiwKKyAgICAgICAgICAgIFJlY29uc3RydWN0ZWRFeHByZXNzaW9uID0gWWVsbG93LAorCisgICAgICAgICAgICBTZWNvbmRhcnlUZXh0ID0gTGlnaHRHcmV5LAorICAgICAgICAgICAgSGVhZGVycyA9IFdoaXRlCisgICAgICAgIH07CisKKyAgICAgICAgLy8gVXNlIGNvbnN0cnVjdGVkIG9iamVjdCBmb3IgUkFJSSBndWFyZAorICAgICAgICBDb2xvdXIoIENvZGUgX2NvbG91ckNvZGUgKTsKKyAgICAgICAgQ29sb3VyKCBDb2xvdXIgY29uc3QmIG90aGVyICk7CisgICAgICAgIH5Db2xvdXIoKTsKKworICAgICAgICAvLyBVc2Ugc3RhdGljIG1ldGhvZCBmb3Igb25lLXNob3QgY2hhbmdlcworICAgICAgICBzdGF0aWMgdm9pZCB1c2UoIENvZGUgX2NvbG91ckNvZGUgKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIGJvb2wgbV9tb3ZlZDsKKyAgICB9OworCisgICAgaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBDb2xvdXIgY29uc3QmICkgeyByZXR1cm4gb3M7IH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9pbnRlcmZhY2VzX3JlcG9ydGVyLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfUkVQT1JURVJfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgQ2F0Y2gKK3sKKyAgICBzdHJ1Y3QgUmVwb3J0ZXJDb25maWcgeworICAgICAgICBleHBsaWNpdCBSZXBvcnRlckNvbmZpZyggUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBfZnVsbENvbmZpZyApCisgICAgICAgIDogICBtX3N0cmVhbSggJl9mdWxsQ29uZmlnLT5zdHJlYW0oKSApLCBtX2Z1bGxDb25maWcoIF9mdWxsQ29uZmlnICkge30KKworICAgICAgICBSZXBvcnRlckNvbmZpZyggUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBfZnVsbENvbmZpZywgc3RkOjpvc3RyZWFtJiBfc3RyZWFtICkKKyAgICAgICAgOiAgIG1fc3RyZWFtKCAmX3N0cmVhbSApLCBtX2Z1bGxDb25maWcoIF9mdWxsQ29uZmlnICkge30KKworICAgICAgICBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0ICAgIHsgcmV0dXJuICptX3N0cmVhbTsgfQorICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gZnVsbENvbmZpZygpIGNvbnN0IHsgcmV0dXJuIG1fZnVsbENvbmZpZzsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpvc3RyZWFtKiBtX3N0cmVhbTsKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IG1fZnVsbENvbmZpZzsKKyAgICB9OworCisgICAgc3RydWN0IFJlcG9ydGVyUHJlZmVyZW5jZXMgeworICAgICAgICBSZXBvcnRlclByZWZlcmVuY2VzKCkKKyAgICAgICAgOiBzaG91bGRSZWRpcmVjdFN0ZE91dCggZmFsc2UgKQorICAgICAgICB7fQorCisgICAgICAgIGJvb2wgc2hvdWxkUmVkaXJlY3RTdGRPdXQ7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IExhenlTdGF0IDogT3B0aW9uPFQ+IHsKKyAgICAgICAgTGF6eVN0YXQoKSA6IHVzZWQoIGZhbHNlICkge30KKyAgICAgICAgTGF6eVN0YXQmIG9wZXJhdG9yPSggVCBjb25zdCYgX3ZhbHVlICkgeworICAgICAgICAgICAgT3B0aW9uPFQ+OjpvcGVyYXRvcj0oIF92YWx1ZSApOworICAgICAgICAgICAgdXNlZCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBPcHRpb248VD46OnJlc2V0KCk7CisgICAgICAgICAgICB1c2VkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCB1c2VkOworICAgIH07CisKKyAgICBzdHJ1Y3QgVGVzdFJ1bkluZm8geworICAgICAgICBUZXN0UnVuSW5mbyggc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lICkgOiBuYW1lKCBfbmFtZSApIHt9CisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgfTsKKyAgICBzdHJ1Y3QgR3JvdXBJbmZvIHsKKyAgICAgICAgR3JvdXBJbmZvKCAgc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCBfZ3JvdXBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgX2dyb3Vwc0NvdW50ICkKKyAgICAgICAgOiAgIG5hbWUoIF9uYW1lICksCisgICAgICAgICAgICBncm91cEluZGV4KCBfZ3JvdXBJbmRleCApLAorICAgICAgICAgICAgZ3JvdXBzQ291bnRzKCBfZ3JvdXBzQ291bnQgKQorICAgICAgICB7fQorCisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIHN0ZDo6c2l6ZV90IGdyb3VwSW5kZXg7CisgICAgICAgIHN0ZDo6c2l6ZV90IGdyb3Vwc0NvdW50czsKKyAgICB9OworCisgICAgc3RydWN0IEFzc2VydGlvblN0YXRzIHsKKyAgICAgICAgQXNzZXJ0aW9uU3RhdHMoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgX2Fzc2VydGlvblJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPiBjb25zdCYgX2luZm9NZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFscyBjb25zdCYgX3RvdGFscyApCisgICAgICAgIDogICBhc3NlcnRpb25SZXN1bHQoIF9hc3NlcnRpb25SZXN1bHQgKSwKKyAgICAgICAgICAgIGluZm9NZXNzYWdlcyggX2luZm9NZXNzYWdlcyApLAorICAgICAgICAgICAgdG90YWxzKCBfdG90YWxzICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGFzc2VydGlvblJlc3VsdC5oYXNNZXNzYWdlKCkgKSB7CisgICAgICAgICAgICAgICAgLy8gQ29weSBtZXNzYWdlIGludG8gbWVzc2FnZXMgbGlzdC4KKyAgICAgICAgICAgICAgICAvLyAhVEJEIFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBkb25lIGVhcmxpZXIsIHNvbWV3aGVyZQorICAgICAgICAgICAgICAgIE1lc3NhZ2VCdWlsZGVyIGJ1aWxkZXIoIGFzc2VydGlvblJlc3VsdC5nZXRUZXN0TWFjcm9OYW1lKCksIGFzc2VydGlvblJlc3VsdC5nZXRTb3VyY2VJbmZvKCksIGFzc2VydGlvblJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyIDw8IGFzc2VydGlvblJlc3VsdC5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5tX2luZm8ubWVzc2FnZSA9IGJ1aWxkZXIubV9zdHJlYW0uc3RyKCk7CisKKyAgICAgICAgICAgICAgICBpbmZvTWVzc2FnZXMucHVzaF9iYWNrKCBidWlsZGVyLm1faW5mbyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgfkFzc2VydGlvblN0YXRzKCk7CisKKyMgIGlmZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICBBc3NlcnRpb25TdGF0cyggQXNzZXJ0aW9uU3RhdHMgY29uc3QmICkgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgQXNzZXJ0aW9uU3RhdHMoIEFzc2VydGlvblN0YXRzICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIEFzc2VydGlvblN0YXRzJiBvcGVyYXRvciA9ICggQXNzZXJ0aW9uU3RhdHMgY29uc3QmICkgPSBkZWZhdWx0OworICAgICAgICBBc3NlcnRpb25TdGF0cyYgb3BlcmF0b3IgPSAoIEFzc2VydGlvblN0YXRzICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGFzc2VydGlvblJlc3VsdDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+IGluZm9NZXNzYWdlczsKKyAgICAgICAgVG90YWxzIHRvdGFsczsKKyAgICB9OworCisgICAgc3RydWN0IFNlY3Rpb25TdGF0cyB7CisgICAgICAgIFNlY3Rpb25TdGF0cyggICBTZWN0aW9uSW5mbyBjb25zdCYgX3NlY3Rpb25JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRzIGNvbnN0JiBfYXNzZXJ0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBfZHVyYXRpb25JblNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9taXNzaW5nQXNzZXJ0aW9ucyApCisgICAgICAgIDogICBzZWN0aW9uSW5mbyggX3NlY3Rpb25JbmZvICksCisgICAgICAgICAgICBhc3NlcnRpb25zKCBfYXNzZXJ0aW9ucyApLAorICAgICAgICAgICAgZHVyYXRpb25JblNlY29uZHMoIF9kdXJhdGlvbkluU2Vjb25kcyApLAorICAgICAgICAgICAgbWlzc2luZ0Fzc2VydGlvbnMoIF9taXNzaW5nQXNzZXJ0aW9ucyApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgflNlY3Rpb25TdGF0cygpOworIyAgaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgIFNlY3Rpb25TdGF0cyggU2VjdGlvblN0YXRzIGNvbnN0JiApICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFNlY3Rpb25TdGF0cyggU2VjdGlvblN0YXRzICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFNlY3Rpb25TdGF0cyYgb3BlcmF0b3IgPSAoIFNlY3Rpb25TdGF0cyBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgIFNlY3Rpb25TdGF0cyYgb3BlcmF0b3IgPSAoIFNlY3Rpb25TdGF0cyAmJiApICAgICA9IGRlZmF1bHQ7CisjICBlbmRpZgorCisgICAgICAgIFNlY3Rpb25JbmZvIHNlY3Rpb25JbmZvOworICAgICAgICBDb3VudHMgYXNzZXJ0aW9uczsKKyAgICAgICAgZG91YmxlIGR1cmF0aW9uSW5TZWNvbmRzOworICAgICAgICBib29sIG1pc3NpbmdBc3NlcnRpb25zOworICAgIH07CisKKyAgICBzdHJ1Y3QgVGVzdENhc2VTdGF0cyB7CisgICAgICAgIFRlc3RDYXNlU3RhdHMoICBUZXN0Q2FzZUluZm8gY29uc3QmIF90ZXN0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFscyBjb25zdCYgX3RvdGFscywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfc3RkT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9zdGRFcnIsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9hYm9ydGluZyApCisgICAgICAgIDogdGVzdEluZm8oIF90ZXN0SW5mbyApLAorICAgICAgICAgICAgdG90YWxzKCBfdG90YWxzICksCisgICAgICAgICAgICBzdGRPdXQoIF9zdGRPdXQgKSwKKyAgICAgICAgICAgIHN0ZEVyciggX3N0ZEVyciApLAorICAgICAgICAgICAgYWJvcnRpbmcoIF9hYm9ydGluZyApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgflRlc3RDYXNlU3RhdHMoKTsKKworIyAgaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgIFRlc3RDYXNlU3RhdHMoIFRlc3RDYXNlU3RhdHMgY29uc3QmICkgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdENhc2VTdGF0cyggVGVzdENhc2VTdGF0cyAmJiApICAgICAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBUZXN0Q2FzZVN0YXRzJiBvcGVyYXRvciA9ICggVGVzdENhc2VTdGF0cyBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RDYXNlU3RhdHMmIG9wZXJhdG9yID0gKCBUZXN0Q2FzZVN0YXRzICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisKKyAgICAgICAgVGVzdENhc2VJbmZvIHRlc3RJbmZvOworICAgICAgICBUb3RhbHMgdG90YWxzOworICAgICAgICBzdGQ6OnN0cmluZyBzdGRPdXQ7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0ZEVycjsKKyAgICAgICAgYm9vbCBhYm9ydGluZzsKKyAgICB9OworCisgICAgc3RydWN0IFRlc3RHcm91cFN0YXRzIHsKKyAgICAgICAgVGVzdEdyb3VwU3RhdHMoIEdyb3VwSW5mbyBjb25zdCYgX2dyb3VwSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFscyBjb25zdCYgX3RvdGFscywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX2Fib3J0aW5nICkKKyAgICAgICAgOiAgIGdyb3VwSW5mbyggX2dyb3VwSW5mbyApLAorICAgICAgICAgICAgdG90YWxzKCBfdG90YWxzICksCisgICAgICAgICAgICBhYm9ydGluZyggX2Fib3J0aW5nICkKKyAgICAgICAge30KKyAgICAgICAgVGVzdEdyb3VwU3RhdHMoIEdyb3VwSW5mbyBjb25zdCYgX2dyb3VwSW5mbyApCisgICAgICAgIDogICBncm91cEluZm8oIF9ncm91cEluZm8gKSwKKyAgICAgICAgICAgIGFib3J0aW5nKCBmYWxzZSApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgflRlc3RHcm91cFN0YXRzKCk7CisKKyMgIGlmZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICBUZXN0R3JvdXBTdGF0cyggVGVzdEdyb3VwU3RhdHMgY29uc3QmICkgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdEdyb3VwU3RhdHMoIFRlc3RHcm91cFN0YXRzICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RHcm91cFN0YXRzJiBvcGVyYXRvciA9ICggVGVzdEdyb3VwU3RhdHMgY29uc3QmICkgPSBkZWZhdWx0OworICAgICAgICBUZXN0R3JvdXBTdGF0cyYgb3BlcmF0b3IgPSAoIFRlc3RHcm91cFN0YXRzICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisKKyAgICAgICAgR3JvdXBJbmZvIGdyb3VwSW5mbzsKKyAgICAgICAgVG90YWxzIHRvdGFsczsKKyAgICAgICAgYm9vbCBhYm9ydGluZzsKKyAgICB9OworCisgICAgc3RydWN0IFRlc3RSdW5TdGF0cyB7CisgICAgICAgIFRlc3RSdW5TdGF0cyggICBUZXN0UnVuSW5mbyBjb25zdCYgX3J1bkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBUb3RhbHMgY29uc3QmIF90b3RhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9hYm9ydGluZyApCisgICAgICAgIDogICBydW5JbmZvKCBfcnVuSW5mbyApLAorICAgICAgICAgICAgdG90YWxzKCBfdG90YWxzICksCisgICAgICAgICAgICBhYm9ydGluZyggX2Fib3J0aW5nICkKKyAgICAgICAge30KKyAgICAgICAgdmlydHVhbCB+VGVzdFJ1blN0YXRzKCk7CisKKyMgIGlmbmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgVGVzdFJ1blN0YXRzKCBUZXN0UnVuU3RhdHMgY29uc3QmIF9vdGhlciApCisgICAgICAgIDogICBydW5JbmZvKCBfb3RoZXIucnVuSW5mbyApLAorICAgICAgICAgICAgdG90YWxzKCBfb3RoZXIudG90YWxzICksCisgICAgICAgICAgICBhYm9ydGluZyggX290aGVyLmFib3J0aW5nICkKKyAgICAgICAge30KKyMgIGVsc2UKKyAgICAgICAgVGVzdFJ1blN0YXRzKCBUZXN0UnVuU3RhdHMgY29uc3QmICkgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdFJ1blN0YXRzKCBUZXN0UnVuU3RhdHMgJiYgKSAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdFJ1blN0YXRzJiBvcGVyYXRvciA9ICggVGVzdFJ1blN0YXRzIGNvbnN0JiApID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdFJ1blN0YXRzJiBvcGVyYXRvciA9ICggVGVzdFJ1blN0YXRzICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisKKyAgICAgICAgVGVzdFJ1bkluZm8gcnVuSW5mbzsKKyAgICAgICAgVG90YWxzIHRvdGFsczsKKyAgICAgICAgYm9vbCBhYm9ydGluZzsKKyAgICB9OworCisgICAgY2xhc3MgTXVsdGlwbGVSZXBvcnRlcnM7CisKKyAgICBzdHJ1Y3QgSVN0cmVhbWluZ1JlcG9ydGVyIDogSVNoYXJlZCB7CisgICAgICAgIHZpcnR1YWwgfklTdHJlYW1pbmdSZXBvcnRlcigpOworCisgICAgICAgIC8vIEltcGxlbWVudGluZyBjbGFzcyBtdXN0IGFsc28gcHJvdmlkZSB0aGUgZm9sbG93aW5nIHN0YXRpYyBtZXRob2Q6CisgICAgICAgIC8vIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpOworCisgICAgICAgIHZpcnR1YWwgUmVwb3J0ZXJQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIGNvbnN0ID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHNwZWMgKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmIHRlc3RSdW5JbmZvICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyBjb25zdCYgZ3JvdXBJbmZvICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8gKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiBhc3NlcnRpb25JbmZvICkgPSAwOworCisgICAgICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIGlmIHRoZSBtZXNzYWdlcyBidWZmZXIgc2hvdWxkIGJlIGNsZWFyZWQ6CisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgdGVzdEdyb3VwU3RhdHMgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgdGVzdFJ1blN0YXRzICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBza2lwVGVzdCggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApID0gMDsKKworICAgICAgICB2aXJ0dWFsIE11bHRpcGxlUmVwb3J0ZXJzKiB0cnlBc011bHRpKCkgeyByZXR1cm4gQ0FUQ0hfTlVMTDsgfQorICAgIH07CisKKyAgICBzdHJ1Y3QgSVJlcG9ydGVyRmFjdG9yeSA6IElTaGFyZWQgeworICAgICAgICB2aXJ0dWFsIH5JUmVwb3J0ZXJGYWN0b3J5KCk7CisgICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9ydGVyKiBjcmVhdGUoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBjb25maWcgKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIHN0cnVjdCBJUmVwb3J0ZXJSZWdpc3RyeSB7CisgICAgICAgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiA+IEZhY3RvcnlNYXA7CisgICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8UHRyPElSZXBvcnRlckZhY3Rvcnk+ID4gTGlzdGVuZXJzOworCisgICAgICAgIHZpcnR1YWwgfklSZXBvcnRlclJlZ2lzdHJ5KCk7CisgICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9ydGVyKiBjcmVhdGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBQdHI8SUNvbmZpZyBjb25zdD4gY29uc3QmIGNvbmZpZyApIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBGYWN0b3J5TWFwIGNvbnN0JiBnZXRGYWN0b3JpZXMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgTGlzdGVuZXJzIGNvbnN0JiBnZXRMaXN0ZW5lcnMoKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGFkZFJlcG9ydGVyKCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBjb25zdCYgZXhpc3RpbmdSZXBvcnRlciwgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gY29uc3QmIGFkZGl0aW9uYWxSZXBvcnRlciApOworCit9CisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgaW5saW5lIHN0ZDo6c2l6ZV90IGxpc3RUZXN0cyggQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisKKyAgICAgICAgVGVzdFNwZWMgdGVzdFNwZWMgPSBjb25maWcudGVzdFNwZWMoKTsKKyAgICAgICAgaWYoIGNvbmZpZy50ZXN0U3BlYygpLmhhc0ZpbHRlcnMoKSApCisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICJNYXRjaGluZyB0ZXN0IGNhc2VzOlxuIjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICJBbGwgYXZhaWxhYmxlIHRlc3QgY2FzZXM6XG4iOworICAgICAgICAgICAgdGVzdFNwZWMgPSBUZXN0U3BlY1BhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpICkucGFyc2UoICIqIiApLnRlc3RTcGVjKCk7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNpemVfdCBtYXRjaGVkVGVzdHMgPSAwOworICAgICAgICBUZXh0QXR0cmlidXRlcyBuYW1lQXR0ciwgdGFnc0F0dHI7CisgICAgICAgIG5hbWVBdHRyLnNldEluaXRpYWxJbmRlbnQoIDIgKS5zZXRJbmRlbnQoIDQgKTsKKyAgICAgICAgdGFnc0F0dHIuc2V0SW5kZW50KCA2ICk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IG1hdGNoZWRUZXN0Q2FzZXMgPSBmaWx0ZXJUZXN0cyggZ2V0QWxsVGVzdENhc2VzU29ydGVkKCBjb25maWcgKSwgdGVzdFNwZWMsIGNvbmZpZyApOworICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtYXRjaGVkVGVzdENhc2VzLmJlZ2luKCksIGl0RW5kID0gbWF0Y2hlZFRlc3RDYXNlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgbWF0Y2hlZFRlc3RzKys7CisgICAgICAgICAgICBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlSW5mbyA9IGl0LT5nZXRUZXN0Q2FzZUluZm8oKTsKKyAgICAgICAgICAgIENvbG91cjo6Q29kZSBjb2xvdXIgPSB0ZXN0Q2FzZUluZm8uaXNIaWRkZW4oKQorICAgICAgICAgICAgICAgID8gQ29sb3VyOjpTZWNvbmRhcnlUZXh0CisgICAgICAgICAgICAgICAgOiBDb2xvdXI6Ok5vbmU7CisgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIGNvbG91ciApOworCisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IFRleHQoIHRlc3RDYXNlSW5mby5uYW1lLCBuYW1lQXR0ciApIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIGlmKCAhdGVzdENhc2VJbmZvLnRhZ3MuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBUZXh0KCB0ZXN0Q2FzZUluZm8udGFnc0FzU3RyaW5nLCB0YWdzQXR0ciApIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhY29uZmlnLnRlc3RTcGVjKCkuaGFzRmlsdGVycygpICkKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgcGx1cmFsaXNlKCBtYXRjaGVkVGVzdHMsICJ0ZXN0IGNhc2UiICkgPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgcGx1cmFsaXNlKCBtYXRjaGVkVGVzdHMsICJtYXRjaGluZyB0ZXN0IGNhc2UiICkgPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiBtYXRjaGVkVGVzdHM7CisgICAgfQorCisgICAgaW5saW5lIHN0ZDo6c2l6ZV90IGxpc3RUZXN0c05hbWVzT25seSggQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIFRlc3RTcGVjIHRlc3RTcGVjID0gY29uZmlnLnRlc3RTcGVjKCk7CisgICAgICAgIGlmKCAhY29uZmlnLnRlc3RTcGVjKCkuaGFzRmlsdGVycygpICkKKyAgICAgICAgICAgIHRlc3RTcGVjID0gVGVzdFNwZWNQYXJzZXIoIElUYWdBbGlhc1JlZ2lzdHJ5OjpnZXQoKSApLnBhcnNlKCAiKiIgKS50ZXN0U3BlYygpOworICAgICAgICBzdGQ6OnNpemVfdCBtYXRjaGVkVGVzdHMgPSAwOworICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gbWF0Y2hlZFRlc3RDYXNlcyA9IGZpbHRlclRlc3RzKCBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoIGNvbmZpZyApLCB0ZXN0U3BlYywgY29uZmlnICk7CisgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8VGVzdENhc2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1hdGNoZWRUZXN0Q2FzZXMuYmVnaW4oKSwgaXRFbmQgPSBtYXRjaGVkVGVzdENhc2VzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICBtYXRjaGVkVGVzdHMrKzsKKyAgICAgICAgICAgIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2VJbmZvID0gaXQtPmdldFRlc3RDYXNlSW5mbygpOworICAgICAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIHRlc3RDYXNlSW5mby5uYW1lLCAnIycgKSApCisgICAgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICciJyA8PCB0ZXN0Q2FzZUluZm8ubmFtZSA8PCAnIicgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCB0ZXN0Q2FzZUluZm8ubmFtZSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1hdGNoZWRUZXN0czsKKyAgICB9CisKKyAgICBzdHJ1Y3QgVGFnSW5mbyB7CisgICAgICAgIFRhZ0luZm8oKSA6IGNvdW50ICggMCApIHt9CisgICAgICAgIHZvaWQgYWRkKCBzdGQ6OnN0cmluZyBjb25zdCYgc3BlbGxpbmcgKSB7CisgICAgICAgICAgICArK2NvdW50OworICAgICAgICAgICAgc3BlbGxpbmdzLmluc2VydCggc3BlbGxpbmcgKTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyBhbGwoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBvdXQ7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzcGVsbGluZ3MuYmVnaW4oKSwgaXRFbmQgPSBzcGVsbGluZ3MuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgICAgIG91dCArPSAiWyIgKyAqaXQgKyAiXSI7CisgICAgICAgICAgICByZXR1cm4gb3V0OworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBzcGVsbGluZ3M7CisgICAgICAgIHN0ZDo6c2l6ZV90IGNvdW50OworICAgIH07CisKKyAgICBpbmxpbmUgc3RkOjpzaXplX3QgbGlzdFRhZ3MoIENvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICBUZXN0U3BlYyB0ZXN0U3BlYyA9IGNvbmZpZy50ZXN0U3BlYygpOworICAgICAgICBpZiggY29uZmlnLnRlc3RTcGVjKCkuaGFzRmlsdGVycygpICkKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIlRhZ3MgZm9yIG1hdGNoaW5nIHRlc3QgY2FzZXM6XG4iOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIkFsbCBhdmFpbGFibGUgdGFnczpcbiI7CisgICAgICAgICAgICB0ZXN0U3BlYyA9IFRlc3RTcGVjUGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeTo6Z2V0KCkgKS5wYXJzZSggIioiICkudGVzdFNwZWMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUYWdJbmZvPiB0YWdDb3VudHM7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IG1hdGNoZWRUZXN0Q2FzZXMgPSBmaWx0ZXJUZXN0cyggZ2V0QWxsVGVzdENhc2VzU29ydGVkKCBjb25maWcgKSwgdGVzdFNwZWMsIGNvbmZpZyApOworICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtYXRjaGVkVGVzdENhc2VzLmJlZ2luKCksIGl0RW5kID0gbWF0Y2hlZFRlc3RDYXNlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgZm9yKCBzdGQ6OnNldDxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yICB0YWdJdCA9IGl0LT5nZXRUZXN0Q2FzZUluZm8oKS50YWdzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0l0RW5kID0gaXQtPmdldFRlc3RDYXNlSW5mbygpLnRhZ3MuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIHRhZ0l0ICE9IHRhZ0l0RW5kOworICAgICAgICAgICAgICAgICAgICArK3RhZ0l0ICkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRhZ05hbWUgPSAqdGFnSXQ7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbGNhc2VUYWdOYW1lID0gdG9Mb3dlciggdGFnTmFtZSApOworICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUYWdJbmZvPjo6aXRlcmF0b3IgY291bnRJdCA9IHRhZ0NvdW50cy5maW5kKCBsY2FzZVRhZ05hbWUgKTsKKyAgICAgICAgICAgICAgICBpZiggY291bnRJdCA9PSB0YWdDb3VudHMuZW5kKCkgKQorICAgICAgICAgICAgICAgICAgICBjb3VudEl0ID0gdGFnQ291bnRzLmluc2VydCggc3RkOjptYWtlX3BhaXIoIGxjYXNlVGFnTmFtZSwgVGFnSW5mbygpICkgKS5maXJzdDsKKyAgICAgICAgICAgICAgICBjb3VudEl0LT5zZWNvbmQuYWRkKCB0YWdOYW1lICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IoIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUYWdJbmZvPjo6Y29uc3RfaXRlcmF0b3IgY291bnRJdCA9IHRhZ0NvdW50cy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRJdEVuZCA9IHRhZ0NvdW50cy5lbmQoKTsKKyAgICAgICAgICAgICAgICBjb3VudEl0ICE9IGNvdW50SXRFbmQ7CisgICAgICAgICAgICAgICAgKytjb3VudEl0ICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCAiICAiIDw8IHN0ZDo6c2V0dygyKSA8PCBjb3VudEl0LT5zZWNvbmQuY291bnQgPDwgIiAgIjsKKyAgICAgICAgICAgIFRleHQgd3JhcHBlciggY291bnRJdC0+c2Vjb25kLmFsbCgpLCBUZXh0QXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluaXRpYWxJbmRlbnQoIDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbmRlbnQoIG9zcy5zdHIoKS5zaXplKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXaWR0aCggQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgtMTAgKSApOworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBvc3Muc3RyKCkgPDwgd3JhcHBlciA8PCAnXG4nOworICAgICAgICB9CisgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgcGx1cmFsaXNlKCB0YWdDb3VudHMuc2l6ZSgpLCAidGFnIiApIDw8ICdcbicgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gdGFnQ291bnRzLnNpemUoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RkOjpzaXplX3QgbGlzdFJlcG9ydGVycyggQ29uZmlnIGNvbnN0JiAvKmNvbmZpZyovICkgeworICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICJBdmFpbGFibGUgcmVwb3J0ZXJzOlxuIjsKKyAgICAgICAgSVJlcG9ydGVyUmVnaXN0cnk6OkZhY3RvcnlNYXAgY29uc3QmIGZhY3RvcmllcyA9IGdldFJlZ2lzdHJ5SHViKCkuZ2V0UmVwb3J0ZXJSZWdpc3RyeSgpLmdldEZhY3RvcmllcygpOworICAgICAgICBJUmVwb3J0ZXJSZWdpc3RyeTo6RmFjdG9yeU1hcDo6Y29uc3RfaXRlcmF0b3IgaXRCZWdpbiA9IGZhY3Rvcmllcy5iZWdpbigpLCBpdEVuZCA9IGZhY3Rvcmllcy5lbmQoKSwgaXQ7CisgICAgICAgIHN0ZDo6c2l6ZV90IG1heE5hbWVMZW4gPSAwOworICAgICAgICBmb3IoaXQgPSBpdEJlZ2luOyBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgICAgICBtYXhOYW1lTGVuID0gKHN0ZDo6bWF4KSggbWF4TmFtZUxlbiwgaXQtPmZpcnN0LnNpemUoKSApOworCisgICAgICAgIGZvcihpdCA9IGl0QmVnaW47IGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgVGV4dCB3cmFwcGVyKCBpdC0+c2Vjb25kLT5nZXREZXNjcmlwdGlvbigpLCBUZXh0QXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbml0aWFsSW5kZW50KCAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluZGVudCggNyttYXhOYW1lTGVuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdpZHRoKCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSCAtIG1heE5hbWVMZW4tOCApICk7CisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICIgICIKKyAgICAgICAgICAgICAgICAgICAgPDwgaXQtPmZpcnN0CisgICAgICAgICAgICAgICAgICAgIDw8ICc6JworICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OnN0cmluZyggbWF4TmFtZUxlbiAtIGl0LT5maXJzdC5zaXplKCkgKyAyLCAnICcgKQorICAgICAgICAgICAgICAgICAgICA8PCB3cmFwcGVyIDw8ICdcbic7CisgICAgICAgIH0KKyAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiBmYWN0b3JpZXMuc2l6ZSgpOworICAgIH0KKworICAgIGlubGluZSBPcHRpb248c3RkOjpzaXplX3Q+IGxpc3QoIENvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICBPcHRpb248c3RkOjpzaXplX3Q+IGxpc3RlZENvdW50OworICAgICAgICBpZiggY29uZmlnLmxpc3RUZXN0cygpICkKKyAgICAgICAgICAgIGxpc3RlZENvdW50ID0gbGlzdGVkQ291bnQudmFsdWVPcigwKSArIGxpc3RUZXN0cyggY29uZmlnICk7CisgICAgICAgIGlmKCBjb25maWcubGlzdFRlc3ROYW1lc09ubHkoKSApCisgICAgICAgICAgICBsaXN0ZWRDb3VudCA9IGxpc3RlZENvdW50LnZhbHVlT3IoMCkgKyBsaXN0VGVzdHNOYW1lc09ubHkoIGNvbmZpZyApOworICAgICAgICBpZiggY29uZmlnLmxpc3RUYWdzKCkgKQorICAgICAgICAgICAgbGlzdGVkQ291bnQgPSBsaXN0ZWRDb3VudC52YWx1ZU9yKDApICsgbGlzdFRhZ3MoIGNvbmZpZyApOworICAgICAgICBpZiggY29uZmlnLmxpc3RSZXBvcnRlcnMoKSApCisgICAgICAgICAgICBsaXN0ZWRDb3VudCA9IGxpc3RlZENvdW50LnZhbHVlT3IoMCkgKyBsaXN0UmVwb3J0ZXJzKCBjb25maWcgKTsKKyAgICAgICAgcmV0dXJuIGxpc3RlZENvdW50OworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9ydW5fY29udGV4dC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JVTk5FUl9JTVBMX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGVzdF9jYXNlX3RyYWNrZXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9URVNUX0NBU0VfVFJBQ0tFUl9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTCisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgVGVzdENhc2VUcmFja2luZyB7CisKKyAgICBzdHJ1Y3QgTmFtZUFuZExvY2F0aW9uIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgU291cmNlTGluZUluZm8gbG9jYXRpb247CisKKyAgICAgICAgTmFtZUFuZExvY2F0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbG9jYXRpb24gKQorICAgICAgICA6ICAgbmFtZSggX25hbWUgKSwKKyAgICAgICAgICAgIGxvY2F0aW9uKCBfbG9jYXRpb24gKQorICAgICAgICB7fQorICAgIH07CisKKyAgICBzdHJ1Y3QgSVRyYWNrZXIgOiBTaGFyZWRJbXBsPD4geworICAgICAgICB2aXJ0dWFsIH5JVHJhY2tlcigpOworCisgICAgICAgIC8vIHN0YXRpYyBxdWVyaWVzCisgICAgICAgIHZpcnR1YWwgTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24oKSBjb25zdCA9IDA7CisKKyAgICAgICAgLy8gZHluYW1pYyBxdWVyaWVzCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0NvbXBsZXRlKCkgY29uc3QgPSAwOyAvLyBTdWNjZXNzZnVsbHkgY29tcGxldGVkIG9yIGZhaWxlZAorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdWNjZXNzZnVsbHlDb21wbGV0ZWQoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc09wZW4oKSBjb25zdCA9IDA7IC8vIFN0YXJ0ZWQgYnV0IG5vdCBjb21wbGV0ZQorICAgICAgICB2aXJ0dWFsIGJvb2wgaGFzQ2hpbGRyZW4oKSBjb25zdCA9IDA7CisKKyAgICAgICAgdmlydHVhbCBJVHJhY2tlciYgcGFyZW50KCkgPSAwOworCisgICAgICAgIC8vIGFjdGlvbnMKKyAgICAgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkgPSAwOyAvLyBTdWNjZXNzZnVsbHkgY29tcGxldGUKKyAgICAgICAgdmlydHVhbCB2b2lkIGZhaWwoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBtYXJrQXNOZWVkaW5nQW5vdGhlclJ1bigpID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGQoIFB0cjxJVHJhY2tlcj4gY29uc3QmIGNoaWxkICkgPSAwOworICAgICAgICB2aXJ0dWFsIElUcmFja2VyKiBmaW5kQ2hpbGQoIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgb3BlbkNoaWxkKCkgPSAwOworCisgICAgICAgIC8vIERlYnVnLyBjaGVja2luZworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTZWN0aW9uVHJhY2tlcigpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIGlzSW5kZXhUcmFja2VyKCkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBjbGFzcyAgVHJhY2tlckNvbnRleHQgeworCisgICAgICAgIGVudW0gUnVuU3RhdGUgeworICAgICAgICAgICAgTm90U3RhcnRlZCwKKyAgICAgICAgICAgIEV4ZWN1dGluZywKKyAgICAgICAgICAgIENvbXBsZXRlZEN5Y2xlCisgICAgICAgIH07CisKKyAgICAgICAgUHRyPElUcmFja2VyPiBtX3Jvb3RUcmFja2VyOworICAgICAgICBJVHJhY2tlciogbV9jdXJyZW50VHJhY2tlcjsKKyAgICAgICAgUnVuU3RhdGUgbV9ydW5TdGF0ZTsKKworICAgIHB1YmxpYzoKKworICAgICAgICBzdGF0aWMgVHJhY2tlckNvbnRleHQmIGluc3RhbmNlKCkgeworICAgICAgICAgICAgc3RhdGljIFRyYWNrZXJDb250ZXh0IHNfaW5zdGFuY2U7CisgICAgICAgICAgICByZXR1cm4gc19pbnN0YW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIFRyYWNrZXJDb250ZXh0KCkKKyAgICAgICAgOiAgIG1fY3VycmVudFRyYWNrZXIoIENBVENIX05VTEwgKSwKKyAgICAgICAgICAgIG1fcnVuU3RhdGUoIE5vdFN0YXJ0ZWQgKQorICAgICAgICB7fQorCisgICAgICAgIElUcmFja2VyJiBzdGFydFJ1bigpOworCisgICAgICAgIHZvaWQgZW5kUnVuKCkgeworICAgICAgICAgICAgbV9yb290VHJhY2tlci5yZXNldCgpOworICAgICAgICAgICAgbV9jdXJyZW50VHJhY2tlciA9IENBVENIX05VTEw7CisgICAgICAgICAgICBtX3J1blN0YXRlID0gTm90U3RhcnRlZDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc3RhcnRDeWNsZSgpIHsKKyAgICAgICAgICAgIG1fY3VycmVudFRyYWNrZXIgPSBtX3Jvb3RUcmFja2VyLmdldCgpOworICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IEV4ZWN1dGluZzsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGNvbXBsZXRlQ3ljbGUoKSB7CisgICAgICAgICAgICBtX3J1blN0YXRlID0gQ29tcGxldGVkQ3ljbGU7CisgICAgICAgIH0KKworICAgICAgICBib29sIGNvbXBsZXRlZEN5Y2xlKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fcnVuU3RhdGUgPT0gQ29tcGxldGVkQ3ljbGU7CisgICAgICAgIH0KKyAgICAgICAgSVRyYWNrZXImIGN1cnJlbnRUcmFja2VyKCkgeworICAgICAgICAgICAgcmV0dXJuICptX2N1cnJlbnRUcmFja2VyOworICAgICAgICB9CisgICAgICAgIHZvaWQgc2V0Q3VycmVudFRyYWNrZXIoIElUcmFja2VyKiB0cmFja2VyICkgeworICAgICAgICAgICAgbV9jdXJyZW50VHJhY2tlciA9IHRyYWNrZXI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgY2xhc3MgVHJhY2tlckJhc2UgOiBwdWJsaWMgSVRyYWNrZXIgeworICAgIHByb3RlY3RlZDoKKyAgICAgICAgZW51bSBDeWNsZVN0YXRlIHsKKyAgICAgICAgICAgIE5vdFN0YXJ0ZWQsCisgICAgICAgICAgICBFeGVjdXRpbmcsCisgICAgICAgICAgICBFeGVjdXRpbmdDaGlsZHJlbiwKKyAgICAgICAgICAgIE5lZWRzQW5vdGhlclJ1biwKKyAgICAgICAgICAgIENvbXBsZXRlZFN1Y2Nlc3NmdWxseSwKKyAgICAgICAgICAgIEZhaWxlZAorICAgICAgICB9OworICAgICAgICBjbGFzcyBUcmFja2VySGFzTmFtZSB7CisgICAgICAgICAgICBOYW1lQW5kTG9jYXRpb24gbV9uYW1lQW5kTG9jYXRpb247CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIFRyYWNrZXJIYXNOYW1lKCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiApIDogbV9uYW1lQW5kTG9jYXRpb24oIG5hbWVBbmRMb2NhdGlvbiApIHt9CisgICAgICAgICAgICBib29sIG9wZXJhdG9yICgpKCBQdHI8SVRyYWNrZXI+IGNvbnN0JiB0cmFja2VyICkgeworICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICB0cmFja2VyLT5uYW1lQW5kTG9jYXRpb24oKS5uYW1lID09IG1fbmFtZUFuZExvY2F0aW9uLm5hbWUgJiYKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tlci0+bmFtZUFuZExvY2F0aW9uKCkubG9jYXRpb24gPT0gbV9uYW1lQW5kTG9jYXRpb24ubG9jYXRpb247CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8UHRyPElUcmFja2VyPiA+IENoaWxkcmVuOworICAgICAgICBOYW1lQW5kTG9jYXRpb24gbV9uYW1lQW5kTG9jYXRpb247CisgICAgICAgIFRyYWNrZXJDb250ZXh0JiBtX2N0eDsKKyAgICAgICAgSVRyYWNrZXIqIG1fcGFyZW50OworICAgICAgICBDaGlsZHJlbiBtX2NoaWxkcmVuOworICAgICAgICBDeWNsZVN0YXRlIG1fcnVuU3RhdGU7CisgICAgcHVibGljOgorICAgICAgICBUcmFja2VyQmFzZSggTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24sIFRyYWNrZXJDb250ZXh0JiBjdHgsIElUcmFja2VyKiBwYXJlbnQgKQorICAgICAgICA6ICAgbV9uYW1lQW5kTG9jYXRpb24oIG5hbWVBbmRMb2NhdGlvbiApLAorICAgICAgICAgICAgbV9jdHgoIGN0eCApLAorICAgICAgICAgICAgbV9wYXJlbnQoIHBhcmVudCApLAorICAgICAgICAgICAgbV9ydW5TdGF0ZSggTm90U3RhcnRlZCApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgflRyYWNrZXJCYXNlKCk7CisKKyAgICAgICAgdmlydHVhbCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbigpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX25hbWVBbmRMb2NhdGlvbjsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX3J1blN0YXRlID09IENvbXBsZXRlZFN1Y2Nlc3NmdWxseSB8fCBtX3J1blN0YXRlID09IEZhaWxlZDsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdWNjZXNzZnVsbHlDb21wbGV0ZWQoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gbV9ydW5TdGF0ZSA9PSBDb21wbGV0ZWRTdWNjZXNzZnVsbHk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBib29sIGlzT3BlbigpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX3J1blN0YXRlICE9IE5vdFN0YXJ0ZWQgJiYgIWlzQ29tcGxldGUoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgaGFzQ2hpbGRyZW4oKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gIW1fY2hpbGRyZW4uZW1wdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZCggUHRyPElUcmFja2VyPiBjb25zdCYgY2hpbGQgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBtX2NoaWxkcmVuLnB1c2hfYmFjayggY2hpbGQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgSVRyYWNrZXIqIGZpbmRDaGlsZCggTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBDaGlsZHJlbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdGQ6OmZpbmRfaWYoIG1fY2hpbGRyZW4uYmVnaW4oKSwgbV9jaGlsZHJlbi5lbmQoKSwgVHJhY2tlckhhc05hbWUoIG5hbWVBbmRMb2NhdGlvbiApICk7CisgICAgICAgICAgICByZXR1cm4oIGl0ICE9IG1fY2hpbGRyZW4uZW5kKCkgKQorICAgICAgICAgICAgICAgID8gaXQtPmdldCgpCisgICAgICAgICAgICAgICAgOiBDQVRDSF9OVUxMOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgSVRyYWNrZXImIHBhcmVudCgpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGFzc2VydCggbV9wYXJlbnQgKTsgLy8gU2hvdWxkIGFsd2F5cyBiZSBub24tbnVsbCBleGNlcHQgZm9yIHJvb3QKKyAgICAgICAgICAgIHJldHVybiAqbV9wYXJlbnQ7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgb3BlbkNoaWxkKCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgaWYoIG1fcnVuU3RhdGUgIT0gRXhlY3V0aW5nQ2hpbGRyZW4gKSB7CisgICAgICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IEV4ZWN1dGluZ0NoaWxkcmVuOworICAgICAgICAgICAgICAgIGlmKCBtX3BhcmVudCApCisgICAgICAgICAgICAgICAgICAgIG1fcGFyZW50LT5vcGVuQ2hpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1NlY3Rpb25UcmFja2VyKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgdmlydHVhbCBib29sIGlzSW5kZXhUcmFja2VyKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgICB2b2lkIG9wZW4oKSB7CisgICAgICAgICAgICBtX3J1blN0YXRlID0gRXhlY3V0aW5nOworICAgICAgICAgICAgbW92ZVRvVGhpcygpOworICAgICAgICAgICAgaWYoIG1fcGFyZW50ICkKKyAgICAgICAgICAgICAgICBtX3BhcmVudC0+b3BlbkNoaWxkKCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSBDQVRDSF9PVkVSUklERSB7CisKKyAgICAgICAgICAgIC8vIENsb3NlIGFueSBzdGlsbCBvcGVuIGNoaWxkcmVuIChlLmcuIGdlbmVyYXRvcnMpCisgICAgICAgICAgICB3aGlsZSggJm1fY3R4LmN1cnJlbnRUcmFja2VyKCkgIT0gdGhpcyApCisgICAgICAgICAgICAgICAgbV9jdHguY3VycmVudFRyYWNrZXIoKS5jbG9zZSgpOworCisgICAgICAgICAgICBzd2l0Y2goIG1fcnVuU3RhdGUgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOb3RTdGFydGVkOgorICAgICAgICAgICAgICAgIGNhc2UgQ29tcGxldGVkU3VjY2Vzc2Z1bGx5OgorICAgICAgICAgICAgICAgIGNhc2UgRmFpbGVkOgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiSWxsb2dpY2FsIHN0YXRlIiApOworCisgICAgICAgICAgICAgICAgY2FzZSBOZWVkc0Fub3RoZXJSdW46CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOzsKKworICAgICAgICAgICAgICAgIGNhc2UgRXhlY3V0aW5nOgorICAgICAgICAgICAgICAgICAgICBtX3J1blN0YXRlID0gQ29tcGxldGVkU3VjY2Vzc2Z1bGx5OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEV4ZWN1dGluZ0NoaWxkcmVuOgorICAgICAgICAgICAgICAgICAgICBpZiggbV9jaGlsZHJlbi5lbXB0eSgpIHx8IG1fY2hpbGRyZW4uYmFjaygpLT5pc0NvbXBsZXRlKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IENvbXBsZXRlZFN1Y2Nlc3NmdWxseTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiVW5leHBlY3RlZCBzdGF0ZSIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1vdmVUb1BhcmVudCgpOworICAgICAgICAgICAgbV9jdHguY29tcGxldGVDeWNsZSgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBmYWlsKCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IEZhaWxlZDsKKyAgICAgICAgICAgIGlmKCBtX3BhcmVudCApCisgICAgICAgICAgICAgICAgbV9wYXJlbnQtPm1hcmtBc05lZWRpbmdBbm90aGVyUnVuKCk7CisgICAgICAgICAgICBtb3ZlVG9QYXJlbnQoKTsKKyAgICAgICAgICAgIG1fY3R4LmNvbXBsZXRlQ3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgbWFya0FzTmVlZGluZ0Fub3RoZXJSdW4oKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBtX3J1blN0YXRlID0gTmVlZHNBbm90aGVyUnVuOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBtb3ZlVG9QYXJlbnQoKSB7CisgICAgICAgICAgICBhc3NlcnQoIG1fcGFyZW50ICk7CisgICAgICAgICAgICBtX2N0eC5zZXRDdXJyZW50VHJhY2tlciggbV9wYXJlbnQgKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIG1vdmVUb1RoaXMoKSB7CisgICAgICAgICAgICBtX2N0eC5zZXRDdXJyZW50VHJhY2tlciggdGhpcyApOworICAgICAgICB9CisgICAgfTsKKworICAgIGNsYXNzIFNlY3Rpb25UcmFja2VyIDogcHVibGljIFRyYWNrZXJCYXNlIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1fZmlsdGVyczsKKyAgICBwdWJsaWM6CisgICAgICAgIFNlY3Rpb25UcmFja2VyKCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiwgVHJhY2tlckNvbnRleHQmIGN0eCwgSVRyYWNrZXIqIHBhcmVudCApCisgICAgICAgIDogICBUcmFja2VyQmFzZSggbmFtZUFuZExvY2F0aW9uLCBjdHgsIHBhcmVudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBwYXJlbnQgKSB7CisgICAgICAgICAgICAgICAgd2hpbGUoICFwYXJlbnQtPmlzU2VjdGlvblRyYWNrZXIoKSApCisgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9ICZwYXJlbnQtPnBhcmVudCgpOworCisgICAgICAgICAgICAgICAgU2VjdGlvblRyYWNrZXImIHBhcmVudFNlY3Rpb24gPSBzdGF0aWNfY2FzdDxTZWN0aW9uVHJhY2tlciY+KCAqcGFyZW50ICk7CisgICAgICAgICAgICAgICAgYWRkTmV4dEZpbHRlcnMoIHBhcmVudFNlY3Rpb24ubV9maWx0ZXJzICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB+U2VjdGlvblRyYWNrZXIoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTZWN0aW9uVHJhY2tlcigpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIHRydWU7IH0KKworICAgICAgICBzdGF0aWMgU2VjdGlvblRyYWNrZXImIGFjcXVpcmUoIFRyYWNrZXJDb250ZXh0JiBjdHgsIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uICkgeworICAgICAgICAgICAgU2VjdGlvblRyYWNrZXIqIHNlY3Rpb24gPSBDQVRDSF9OVUxMOworCisgICAgICAgICAgICBJVHJhY2tlciYgY3VycmVudFRyYWNrZXIgPSBjdHguY3VycmVudFRyYWNrZXIoKTsKKyAgICAgICAgICAgIGlmKCBJVHJhY2tlciogY2hpbGRUcmFja2VyID0gY3VycmVudFRyYWNrZXIuZmluZENoaWxkKCBuYW1lQW5kTG9jYXRpb24gKSApIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIGNoaWxkVHJhY2tlciApOworICAgICAgICAgICAgICAgIGFzc2VydCggY2hpbGRUcmFja2VyLT5pc1NlY3Rpb25UcmFja2VyKCkgKTsKKyAgICAgICAgICAgICAgICBzZWN0aW9uID0gc3RhdGljX2Nhc3Q8U2VjdGlvblRyYWNrZXIqPiggY2hpbGRUcmFja2VyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZWN0aW9uID0gbmV3IFNlY3Rpb25UcmFja2VyKCBuYW1lQW5kTG9jYXRpb24sIGN0eCwgJmN1cnJlbnRUcmFja2VyICk7CisgICAgICAgICAgICAgICAgY3VycmVudFRyYWNrZXIuYWRkQ2hpbGQoIHNlY3Rpb24gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhY3R4LmNvbXBsZXRlZEN5Y2xlKCkgKQorICAgICAgICAgICAgICAgIHNlY3Rpb24tPnRyeU9wZW4oKTsKKyAgICAgICAgICAgIHJldHVybiAqc2VjdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdHJ5T3BlbigpIHsKKyAgICAgICAgICAgIGlmKCAhaXNDb21wbGV0ZSgpICYmIChtX2ZpbHRlcnMuZW1wdHkoKSB8fCBtX2ZpbHRlcnNbMF0uZW1wdHkoKSB8fCAgbV9maWx0ZXJzWzBdID09IG1fbmFtZUFuZExvY2F0aW9uLm5hbWUgKSApCisgICAgICAgICAgICAgICAgb3BlbigpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhZGRJbml0aWFsRmlsdGVycyggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBmaWx0ZXJzICkgeworICAgICAgICAgICAgaWYoICFmaWx0ZXJzLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgbV9maWx0ZXJzLnB1c2hfYmFjaygiIik7IC8vIFJvb3QgLSBzaG91bGQgbmV2ZXIgYmUgY29uc3VsdGVkCisgICAgICAgICAgICAgICAgbV9maWx0ZXJzLnB1c2hfYmFjaygiIik7IC8vIFRlc3QgQ2FzZSAtIG5vdCBhIHNlY3Rpb24gZmlsdGVyCisgICAgICAgICAgICAgICAgbV9maWx0ZXJzLmluc2VydCggbV9maWx0ZXJzLmVuZCgpLCBmaWx0ZXJzLmJlZ2luKCksIGZpbHRlcnMuZW5kKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2b2lkIGFkZE5leHRGaWx0ZXJzKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGZpbHRlcnMgKSB7CisgICAgICAgICAgICBpZiggZmlsdGVycy5zaXplKCkgPiAxICkKKyAgICAgICAgICAgICAgICBtX2ZpbHRlcnMuaW5zZXJ0KCBtX2ZpbHRlcnMuZW5kKCksICsrZmlsdGVycy5iZWdpbigpLCBmaWx0ZXJzLmVuZCgpICk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgY2xhc3MgSW5kZXhUcmFja2VyIDogcHVibGljIFRyYWNrZXJCYXNlIHsKKyAgICAgICAgaW50IG1fc2l6ZTsKKyAgICAgICAgaW50IG1faW5kZXg7CisgICAgcHVibGljOgorICAgICAgICBJbmRleFRyYWNrZXIoIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uLCBUcmFja2VyQ29udGV4dCYgY3R4LCBJVHJhY2tlciogcGFyZW50LCBpbnQgc2l6ZSApCisgICAgICAgIDogICBUcmFja2VyQmFzZSggbmFtZUFuZExvY2F0aW9uLCBjdHgsIHBhcmVudCApLAorICAgICAgICAgICAgbV9zaXplKCBzaXplICksCisgICAgICAgICAgICBtX2luZGV4KCAtMSApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgfkluZGV4VHJhY2tlcigpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0luZGV4VHJhY2tlcigpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIHRydWU7IH0KKworICAgICAgICBzdGF0aWMgSW5kZXhUcmFja2VyJiBhY3F1aXJlKCBUcmFja2VyQ29udGV4dCYgY3R4LCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiwgaW50IHNpemUgKSB7CisgICAgICAgICAgICBJbmRleFRyYWNrZXIqIHRyYWNrZXIgPSBDQVRDSF9OVUxMOworCisgICAgICAgICAgICBJVHJhY2tlciYgY3VycmVudFRyYWNrZXIgPSBjdHguY3VycmVudFRyYWNrZXIoKTsKKyAgICAgICAgICAgIGlmKCBJVHJhY2tlciogY2hpbGRUcmFja2VyID0gY3VycmVudFRyYWNrZXIuZmluZENoaWxkKCBuYW1lQW5kTG9jYXRpb24gKSApIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIGNoaWxkVHJhY2tlciApOworICAgICAgICAgICAgICAgIGFzc2VydCggY2hpbGRUcmFja2VyLT5pc0luZGV4VHJhY2tlcigpICk7CisgICAgICAgICAgICAgICAgdHJhY2tlciA9IHN0YXRpY19jYXN0PEluZGV4VHJhY2tlcio+KCBjaGlsZFRyYWNrZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHRyYWNrZXIgPSBuZXcgSW5kZXhUcmFja2VyKCBuYW1lQW5kTG9jYXRpb24sIGN0eCwgJmN1cnJlbnRUcmFja2VyLCBzaXplICk7CisgICAgICAgICAgICAgICAgY3VycmVudFRyYWNrZXIuYWRkQ2hpbGQoIHRyYWNrZXIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoICFjdHguY29tcGxldGVkQ3ljbGUoKSAmJiAhdHJhY2tlci0+aXNDb21wbGV0ZSgpICkgeworICAgICAgICAgICAgICAgIGlmKCB0cmFja2VyLT5tX3J1blN0YXRlICE9IEV4ZWN1dGluZ0NoaWxkcmVuICYmIHRyYWNrZXItPm1fcnVuU3RhdGUgIT0gTmVlZHNBbm90aGVyUnVuICkKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tlci0+bW92ZU5leHQoKTsKKyAgICAgICAgICAgICAgICB0cmFja2VyLT5vcGVuKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAqdHJhY2tlcjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXg7IH0KKworICAgICAgICB2b2lkIG1vdmVOZXh0KCkgeworICAgICAgICAgICAgbV9pbmRleCsrOworICAgICAgICAgICAgbV9jaGlsZHJlbi5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgVHJhY2tlckJhc2U6OmNsb3NlKCk7CisgICAgICAgICAgICBpZiggbV9ydW5TdGF0ZSA9PSBDb21wbGV0ZWRTdWNjZXNzZnVsbHkgJiYgbV9pbmRleCA8IG1fc2l6ZS0xICkKKyAgICAgICAgICAgICAgICBtX3J1blN0YXRlID0gRXhlY3V0aW5nOworICAgICAgICB9CisgICAgfTsKKworICAgIGlubGluZSBJVHJhY2tlciYgVHJhY2tlckNvbnRleHQ6OnN0YXJ0UnVuKCkgeworICAgICAgICBtX3Jvb3RUcmFja2VyID0gbmV3IFNlY3Rpb25UcmFja2VyKCBOYW1lQW5kTG9jYXRpb24oICJ7cm9vdH0iLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApLCAqdGhpcywgQ0FUQ0hfTlVMTCApOworICAgICAgICBtX2N1cnJlbnRUcmFja2VyID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgbV9ydW5TdGF0ZSA9IEV4ZWN1dGluZzsKKyAgICAgICAgcmV0dXJuICptX3Jvb3RUcmFja2VyOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgVGVzdENhc2VUcmFja2luZworCit1c2luZyBUZXN0Q2FzZVRyYWNraW5nOjpJVHJhY2tlcjsKK3VzaW5nIFRlc3RDYXNlVHJhY2tpbmc6OlRyYWNrZXJDb250ZXh0OwordXNpbmcgVGVzdENhc2VUcmFja2luZzo6U2VjdGlvblRyYWNrZXI7Cit1c2luZyBUZXN0Q2FzZVRyYWNraW5nOjpJbmRleFRyYWNrZXI7CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKK0NBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9mYXRhbF9jb25kaXRpb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9GQVRBTF9DT05ESVRJT05fSF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgLy8gUmVwb3J0IHRoZSBlcnJvciBjb25kaXRpb24KKyAgICBpbmxpbmUgdm9pZCByZXBvcnRGYXRhbCggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UgKSB7CisgICAgICAgIElDb250ZXh0JiBjb250ZXh0ID0gQ2F0Y2g6OmdldEN1cnJlbnRDb250ZXh0KCk7CisgICAgICAgIElSZXN1bHRDYXB0dXJlKiByZXN1bHRDYXB0dXJlID0gY29udGV4dC5nZXRSZXN1bHRDYXB0dXJlKCk7CisgICAgICAgIHJlc3VsdENhcHR1cmUtPmhhbmRsZUZhdGFsRXJyb3JDb25kaXRpb24oIG1lc3NhZ2UgKTsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyNpZiBkZWZpbmVkICggQ0FUQ0hfUExBVEZPUk1fV0lORE9XUyApIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfd2luZG93c19oX3Byb3h5LmgKKworI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfV0lORE9XU19IX1BST1hZX0hfSU5DTFVERUQKKworI2lmZGVmIENBVENIX0RFRklORVNfTk9NSU5NQVgKKyMgIGRlZmluZSBOT01JTk1BWAorI2VuZGlmCisjaWZkZWYgQ0FUQ0hfREVGSU5FU19XSU4zMl9MRUFOX0FORF9NRUFOCisjICBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2VuZGlmCisKKyNpZmRlZiBfX0FGWERMTAorI2luY2x1ZGUgPEFmeFdpbi5oPgorI2Vsc2UKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2lmZGVmIENBVENIX0RFRklORVNfTk9NSU5NQVgKKyMgIHVuZGVmIE5PTUlOTUFYCisjZW5kaWYKKyNpZmRlZiBDQVRDSF9ERUZJTkVTX1dJTjMyX0xFQU5fQU5EX01FQU4KKyMgIHVuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNlbmRpZgorCisKKyMgIGlmICFkZWZpbmVkICggQ0FUQ0hfQ09ORklHX1dJTkRPV1NfU0VIICkKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBzdHJ1Y3QgRmF0YWxDb25kaXRpb25IYW5kbGVyIHsKKyAgICAgICAgdm9pZCByZXNldCgpIHt9CisgICAgfTsKK30KKworIyAgZWxzZSAvLyBDQVRDSF9DT05GSUdfV0lORE9XU19TRUggaXMgZGVmaW5lZAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFNpZ25hbERlZnMgeyBEV09SRCBpZDsgY29uc3QgY2hhciogbmFtZTsgfTsKKyAgICBleHRlcm4gU2lnbmFsRGVmcyBzaWduYWxEZWZzW107CisgICAgLy8gVGhlcmUgaXMgbm8gMS0xIG1hcHBpbmcgYmV0d2VlbiBzaWduYWxzIGFuZCB3aW5kb3dzIGV4Y2VwdGlvbnMuCisgICAgLy8gV2luZG93cyBjYW4gZWFzaWx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gU08gYW5kIFNpZ1NlZ1YsCisgICAgLy8gYnV0IFNpZ0ludCwgU2lnVGVybSwgZXRjIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LgorICAgIFNpZ25hbERlZnMgc2lnbmFsRGVmc1tdID0geworICAgICAgICB7IEVYQ0VQVElPTl9JTExFR0FMX0lOU1RSVUNUSU9OLCAgIlNJR0lMTCAtIElsbGVnYWwgaW5zdHJ1Y3Rpb24gc2lnbmFsIiB9LAorICAgICAgICB7IEVYQ0VQVElPTl9TVEFDS19PVkVSRkxPVywgIlNJR1NFR1YgLSBTdGFjayBvdmVyZmxvdyIgfSwKKyAgICAgICAgeyBFWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTiwgIlNJR1NFR1YgLSBTZWdtZW50YXRpb24gdmlvbGF0aW9uIHNpZ25hbCIgfSwKKyAgICAgICAgeyBFWENFUFRJT05fSU5UX0RJVklERV9CWV9aRVJPLCAiRGl2aWRlIGJ5IHplcm8gZXJyb3IiIH0sCisgICAgfTsKKworICAgIHN0cnVjdCBGYXRhbENvbmRpdGlvbkhhbmRsZXIgeworCisgICAgICAgIHN0YXRpYyBMT05HIENBTExCQUNLIGhhbmRsZVZlY3RvcmVkRXhjZXB0aW9uKFBFWENFUFRJT05fUE9JTlRFUlMgRXhjZXB0aW9uSW5mbykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplb2Yoc2lnbmFsRGVmcykgLyBzaXplb2YoU2lnbmFsRGVmcyk7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChFeGNlcHRpb25JbmZvLT5FeGNlcHRpb25SZWNvcmQtPkV4Y2VwdGlvbkNvZGUgPT0gc2lnbmFsRGVmc1tpXS5pZCkgeworICAgICAgICAgICAgICAgICAgICByZXBvcnRGYXRhbChzaWduYWxEZWZzW2ldLm5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIGl0cyBub3QgYW4gZXhjZXB0aW9uIHdlIGNhcmUgYWJvdXQsIHBhc3MgaXQgYWxvbmcuCisgICAgICAgICAgICAvLyBUaGlzIHN0b3BzIHVzIGZyb20gZWF0aW5nIGRlYnVnZ2VyIGJyZWFrcyBldGMuCisgICAgICAgICAgICByZXR1cm4gRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSDsKKyAgICAgICAgfQorCisgICAgICAgIEZhdGFsQ29uZGl0aW9uSGFuZGxlcigpIHsKKyAgICAgICAgICAgIGlzU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIDMyayBzZWVtcyBlbm91Z2ggZm9yIENhdGNoIHRvIGhhbmRsZSBzdGFjayBvdmVyZmxvdywKKyAgICAgICAgICAgIC8vIGJ1dCB0aGUgdmFsdWUgd2FzIGZvdW5kIGV4cGVyaW1lbnRhbGx5LCBzbyB0aGVyZSBpcyBubyBzdHJvbmcgZ3VhcmFudGVlCisgICAgICAgICAgICBndWFyYW50ZWVTaXplID0gMzIgKiAxMDI0OworICAgICAgICAgICAgZXhjZXB0aW9uSGFuZGxlckhhbmRsZSA9IENBVENIX05VTEw7CisgICAgICAgICAgICAvLyBSZWdpc3RlciBhcyBmaXJzdCBoYW5kbGVyIGluIGN1cnJlbnQgY2hhaW4KKyAgICAgICAgICAgIGV4Y2VwdGlvbkhhbmRsZXJIYW5kbGUgPSBBZGRWZWN0b3JlZEV4Y2VwdGlvbkhhbmRsZXIoMSwgaGFuZGxlVmVjdG9yZWRFeGNlcHRpb24pOworICAgICAgICAgICAgLy8gUGFzcyBpbiBndWFyYW50ZWUgc2l6ZSB0byBiZSBmaWxsZWQKKyAgICAgICAgICAgIFNldFRocmVhZFN0YWNrR3VhcmFudGVlKCZndWFyYW50ZWVTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgaWYgKGlzU2V0KSB7CisgICAgICAgICAgICAgICAgLy8gVW5yZWdpc3RlciBoYW5kbGVyIGFuZCByZXN0b3JlIHRoZSBvbGQgZ3VhcmFudGVlCisgICAgICAgICAgICAgICAgUmVtb3ZlVmVjdG9yZWRFeGNlcHRpb25IYW5kbGVyKGV4Y2VwdGlvbkhhbmRsZXJIYW5kbGUpOworICAgICAgICAgICAgICAgIFNldFRocmVhZFN0YWNrR3VhcmFudGVlKCZndWFyYW50ZWVTaXplKTsKKyAgICAgICAgICAgICAgICBleGNlcHRpb25IYW5kbGVySGFuZGxlID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgICAgICAgICBpc1NldCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgfkZhdGFsQ29uZGl0aW9uSGFuZGxlcigpIHsKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICBzdGF0aWMgYm9vbCBpc1NldDsKKyAgICAgICAgc3RhdGljIFVMT05HIGd1YXJhbnRlZVNpemU7CisgICAgICAgIHN0YXRpYyBQVk9JRCBleGNlcHRpb25IYW5kbGVySGFuZGxlOworICAgIH07CisKKyAgICBib29sIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6aXNTZXQgPSBmYWxzZTsKKyAgICBVTE9ORyBGYXRhbENvbmRpdGlvbkhhbmRsZXI6Omd1YXJhbnRlZVNpemUgPSAwOworICAgIFBWT0lEIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6ZXhjZXB0aW9uSGFuZGxlckhhbmRsZSA9IENBVENIX05VTEw7CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyMgIGVuZGlmIC8vIENBVENIX0NPTkZJR19XSU5ET1dTX1NFSAorCisjZWxzZSAvLyBOb3QgV2luZG93cyAtIGFzc3VtZWQgdG8gYmUgUE9TSVggY29tcGF0aWJsZSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjICBpZiAhZGVmaW5lZChDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUykKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBzdHJ1Y3QgRmF0YWxDb25kaXRpb25IYW5kbGVyIHsKKyAgICAgICAgdm9pZCByZXNldCgpIHt9CisgICAgfTsKK30KKworIyAgZWxzZSAvLyBDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUyBpcyBkZWZpbmVkCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBTaWduYWxEZWZzIHsKKyAgICAgICAgaW50IGlkOworICAgICAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIH07CisgICAgZXh0ZXJuIFNpZ25hbERlZnMgc2lnbmFsRGVmc1tdOworICAgIFNpZ25hbERlZnMgc2lnbmFsRGVmc1tdID0geworICAgICAgICAgICAgeyBTSUdJTlQsICAiU0lHSU5UIC0gVGVybWluYWwgaW50ZXJydXB0IHNpZ25hbCIgfSwKKyAgICAgICAgICAgIHsgU0lHSUxMLCAgIlNJR0lMTCAtIElsbGVnYWwgaW5zdHJ1Y3Rpb24gc2lnbmFsIiB9LAorICAgICAgICAgICAgeyBTSUdGUEUsICAiU0lHRlBFIC0gRmxvYXRpbmcgcG9pbnQgZXJyb3Igc2lnbmFsIiB9LAorICAgICAgICAgICAgeyBTSUdTRUdWLCAiU0lHU0VHViAtIFNlZ21lbnRhdGlvbiB2aW9sYXRpb24gc2lnbmFsIiB9LAorICAgICAgICAgICAgeyBTSUdURVJNLCAiU0lHVEVSTSAtIFRlcm1pbmF0aW9uIHJlcXVlc3Qgc2lnbmFsIiB9LAorICAgICAgICAgICAgeyBTSUdBQlJULCAiU0lHQUJSVCAtIEFib3J0IChhYm5vcm1hbCB0ZXJtaW5hdGlvbikgc2lnbmFsIiB9CisgICAgfTsKKworICAgIHN0cnVjdCBGYXRhbENvbmRpdGlvbkhhbmRsZXIgeworCisgICAgICAgIHN0YXRpYyBib29sIGlzU2V0OworICAgICAgICBzdGF0aWMgc3RydWN0IHNpZ2FjdGlvbiBvbGRTaWdBY3Rpb25zIFtzaXplb2Yoc2lnbmFsRGVmcykvc2l6ZW9mKFNpZ25hbERlZnMpXTsKKyAgICAgICAgc3RhdGljIHN0YWNrX3Qgb2xkU2lnU3RhY2s7CisgICAgICAgIHN0YXRpYyBjaGFyIGFsdFN0YWNrTWVtW1NJR1NUS1NaXTsKKworICAgICAgICBzdGF0aWMgdm9pZCBoYW5kbGVTaWduYWwoIGludCBzaWcgKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gIjx1bmtub3duIHNpZ25hbD4iOworICAgICAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHNpemVvZihzaWduYWxEZWZzKSAvIHNpemVvZihTaWduYWxEZWZzKTsgKytpKSB7CisgICAgICAgICAgICAgICAgU2lnbmFsRGVmcyAmZGVmID0gc2lnbmFsRGVmc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoc2lnID09IGRlZi5pZCkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gZGVmLm5hbWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgICAgICByZXBvcnRGYXRhbChuYW1lKTsKKyAgICAgICAgICAgIHJhaXNlKCBzaWcgKTsKKyAgICAgICAgfQorCisgICAgICAgIEZhdGFsQ29uZGl0aW9uSGFuZGxlcigpIHsKKyAgICAgICAgICAgIGlzU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHN0YWNrX3Qgc2lnU3RhY2s7CisgICAgICAgICAgICBzaWdTdGFjay5zc19zcCA9IGFsdFN0YWNrTWVtOworICAgICAgICAgICAgc2lnU3RhY2suc3Nfc2l6ZSA9IFNJR1NUS1NaOworICAgICAgICAgICAgc2lnU3RhY2suc3NfZmxhZ3MgPSAwOworICAgICAgICAgICAgc2lnYWx0c3RhY2soJnNpZ1N0YWNrLCAmb2xkU2lnU3RhY2spOworICAgICAgICAgICAgc3RydWN0IHNpZ2FjdGlvbiBzYSA9IHsgMCB9OworCisgICAgICAgICAgICBzYS5zYV9oYW5kbGVyID0gaGFuZGxlU2lnbmFsOworICAgICAgICAgICAgc2Euc2FfZmxhZ3MgPSBTQV9PTlNUQUNLOworICAgICAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHNpemVvZihzaWduYWxEZWZzKS9zaXplb2YoU2lnbmFsRGVmcyk7ICsraSkgeworICAgICAgICAgICAgICAgIHNpZ2FjdGlvbihzaWduYWxEZWZzW2ldLmlkLCAmc2EsICZvbGRTaWdBY3Rpb25zW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIH5GYXRhbENvbmRpdGlvbkhhbmRsZXIoKSB7CisgICAgICAgICAgICByZXNldCgpOworICAgICAgICB9CisgICAgICAgIHN0YXRpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgaWYoIGlzU2V0ICkgeworICAgICAgICAgICAgICAgIC8vIFNldCBzaWduYWxzIGJhY2sgdG8gcHJldmlvdXMgdmFsdWVzIC0tIGhvcGVmdWxseSBub2JvZHkgb3Zlcndyb3RlIHRoZW0gaW4gdGhlIG1lYW50aW1lCisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHNpemVvZihzaWduYWxEZWZzKS9zaXplb2YoU2lnbmFsRGVmcyk7ICsraSApIHsKKyAgICAgICAgICAgICAgICAgICAgc2lnYWN0aW9uKHNpZ25hbERlZnNbaV0uaWQsICZvbGRTaWdBY3Rpb25zW2ldLCBDQVRDSF9OVUxMKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBvbGQgc3RhY2sKKyAgICAgICAgICAgICAgICBzaWdhbHRzdGFjaygmb2xkU2lnU3RhY2ssIENBVENIX05VTEwpOworICAgICAgICAgICAgICAgIGlzU2V0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgYm9vbCBGYXRhbENvbmRpdGlvbkhhbmRsZXI6OmlzU2V0ID0gZmFsc2U7CisgICAgc3RydWN0IHNpZ2FjdGlvbiBGYXRhbENvbmRpdGlvbkhhbmRsZXI6Om9sZFNpZ0FjdGlvbnNbc2l6ZW9mKHNpZ25hbERlZnMpL3NpemVvZihTaWduYWxEZWZzKV0gPSB7fTsKKyAgICBzdGFja190IEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6b2xkU2lnU3RhY2sgPSB7fTsKKyAgICBjaGFyIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6YWx0U3RhY2tNZW1bU0lHU1RLU1pdID0ge307CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyMgIGVuZGlmIC8vIENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTCisKKyNlbmRpZiAvLyBub3QgV2luZG93cworCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFN0cmVhbVJlZGlyZWN0IHsKKworICAgIHB1YmxpYzoKKyAgICAgICAgU3RyZWFtUmVkaXJlY3QoIHN0ZDo6b3N0cmVhbSYgc3RyZWFtLCBzdGQ6OnN0cmluZyYgdGFyZ2V0U3RyaW5nICkKKyAgICAgICAgOiAgIG1fc3RyZWFtKCBzdHJlYW0gKSwKKyAgICAgICAgICAgIG1fcHJldkJ1Ziggc3RyZWFtLnJkYnVmKCkgKSwKKyAgICAgICAgICAgIG1fdGFyZ2V0U3RyaW5nKCB0YXJnZXRTdHJpbmcgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJlYW0ucmRidWYoIG1fb3NzLnJkYnVmKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIH5TdHJlYW1SZWRpcmVjdCgpIHsKKyAgICAgICAgICAgIG1fdGFyZ2V0U3RyaW5nICs9IG1fb3NzLnN0cigpOworICAgICAgICAgICAgbV9zdHJlYW0ucmRidWYoIG1fcHJldkJ1ZiApOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om9zdHJlYW0mIG1fc3RyZWFtOworICAgICAgICBzdGQ6OnN0cmVhbWJ1ZiogbV9wcmV2QnVmOworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gbV9vc3M7CisgICAgICAgIHN0ZDo6c3RyaW5nJiBtX3RhcmdldFN0cmluZzsKKyAgICB9OworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBjbGFzcyBSdW5Db250ZXh0IDogcHVibGljIElSZXN1bHRDYXB0dXJlLCBwdWJsaWMgSVJ1bm5lciB7CisKKyAgICAgICAgUnVuQ29udGV4dCggUnVuQ29udGV4dCBjb25zdCYgKTsKKyAgICAgICAgdm9pZCBvcGVyYXRvciA9KCBSdW5Db250ZXh0IGNvbnN0JiApOworCisgICAgcHVibGljOgorCisgICAgICAgIGV4cGxpY2l0IFJ1bkNvbnRleHQoIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgX2NvbmZpZywgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gY29uc3QmIHJlcG9ydGVyICkKKyAgICAgICAgOiAgIG1fcnVuSW5mbyggX2NvbmZpZy0+bmFtZSgpICksCisgICAgICAgICAgICBtX2NvbnRleHQoIGdldEN1cnJlbnRNdXRhYmxlQ29udGV4dCgpICksCisgICAgICAgICAgICBtX2FjdGl2ZVRlc3RDYXNlKCBDQVRDSF9OVUxMICksCisgICAgICAgICAgICBtX2NvbmZpZyggX2NvbmZpZyApLAorICAgICAgICAgICAgbV9yZXBvcnRlciggcmVwb3J0ZXIgKSwKKyAgICAgICAgICAgIG1fc2hvdWxkUmVwb3J0VW5leHBlY3RlZCAoIHRydWUgKQorICAgICAgICB7CisgICAgICAgICAgICBtX2NvbnRleHQuc2V0UnVubmVyKCB0aGlzICk7CisgICAgICAgICAgICBtX2NvbnRleHQuc2V0Q29uZmlnKCBtX2NvbmZpZyApOworICAgICAgICAgICAgbV9jb250ZXh0LnNldFJlc3VsdENhcHR1cmUoIHRoaXMgKTsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RSdW5TdGFydGluZyggbV9ydW5JbmZvICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5SdW5Db250ZXh0KCkgeworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMoIG1fcnVuSW5mbywgbV90b3RhbHMsIGFib3J0aW5nKCkgKSApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggc3RkOjpzdHJpbmcgY29uc3QmIHRlc3RTcGVjLCBzdGQ6OnNpemVfdCBncm91cEluZGV4LCBzdGQ6OnNpemVfdCBncm91cHNDb3VudCApIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8oIHRlc3RTcGVjLCBncm91cEluZGV4LCBncm91cHNDb3VudCApICk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCB0ZXN0R3JvdXBFbmRlZCggc3RkOjpzdHJpbmcgY29uc3QmIHRlc3RTcGVjLCBUb3RhbHMgY29uc3QmIHRvdGFscywgc3RkOjpzaXplX3QgZ3JvdXBJbmRleCwgc3RkOjpzaXplX3QgZ3JvdXBzQ291bnQgKSB7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT50ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMoIEdyb3VwSW5mbyggdGVzdFNwZWMsIGdyb3VwSW5kZXgsIGdyb3Vwc0NvdW50ICksIHRvdGFscywgYWJvcnRpbmcoKSApICk7CisgICAgICAgIH0KKworICAgICAgICBUb3RhbHMgcnVuVGVzdCggVGVzdENhc2UgY29uc3QmIHRlc3RDYXNlICkgeworICAgICAgICAgICAgVG90YWxzIHByZXZUb3RhbHMgPSBtX3RvdGFsczsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVkaXJlY3RlZENvdXQ7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyByZWRpcmVjdGVkQ2VycjsKKworICAgICAgICAgICAgVGVzdENhc2VJbmZvIHRlc3RJbmZvID0gdGVzdENhc2UuZ2V0VGVzdENhc2VJbmZvKCk7CisKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RDYXNlU3RhcnRpbmcoIHRlc3RJbmZvICk7CisKKyAgICAgICAgICAgIG1fYWN0aXZlVGVzdENhc2UgPSAmdGVzdENhc2U7CisKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBJVHJhY2tlciYgcm9vdFRyYWNrZXIgPSBtX3RyYWNrZXJDb250ZXh0LnN0YXJ0UnVuKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KCByb290VHJhY2tlci5pc1NlY3Rpb25UcmFja2VyKCkgKTsKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTZWN0aW9uVHJhY2tlciY+KCByb290VHJhY2tlciApLmFkZEluaXRpYWxGaWx0ZXJzKCBtX2NvbmZpZy0+Z2V0U2VjdGlvbnNUb1J1bigpICk7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBtX3RyYWNrZXJDb250ZXh0LnN0YXJ0Q3ljbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbV90ZXN0Q2FzZVRyYWNrZXIgPSAmU2VjdGlvblRyYWNrZXI6OmFjcXVpcmUoIG1fdHJhY2tlckNvbnRleHQsIFRlc3RDYXNlVHJhY2tpbmc6Ok5hbWVBbmRMb2NhdGlvbiggdGVzdEluZm8ubmFtZSwgdGVzdEluZm8ubGluZUluZm8gKSApOworICAgICAgICAgICAgICAgICAgICBydW5DdXJyZW50VGVzdCggcmVkaXJlY3RlZENvdXQsIHJlZGlyZWN0ZWRDZXJyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlKCAhbV90ZXN0Q2FzZVRyYWNrZXItPmlzU3VjY2Vzc2Z1bGx5Q29tcGxldGVkKCkgJiYgIWFib3J0aW5nKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vICFUQkQ6IGRlcHJlY2F0ZWQgLSB0aGlzIHdpbGwgYmUgcmVwbGFjZWQgYnkgaW5kZXhlZCB0cmFja2VycworICAgICAgICAgICAgd2hpbGUoIGdldEN1cnJlbnRDb250ZXh0KCkuYWR2YW5jZUdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpICYmICFhYm9ydGluZygpICk7CisKKyAgICAgICAgICAgIFRvdGFscyBkZWx0YVRvdGFscyA9IG1fdG90YWxzLmRlbHRhKCBwcmV2VG90YWxzICk7CisgICAgICAgICAgICBpZiggdGVzdEluZm8uZXhwZWN0ZWRUb0ZhaWwoKSAmJiBkZWx0YVRvdGFscy50ZXN0Q2FzZXMucGFzc2VkID4gMCApIHsKKyAgICAgICAgICAgICAgICBkZWx0YVRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCsrOworICAgICAgICAgICAgICAgIGRlbHRhVG90YWxzLnRlc3RDYXNlcy5wYXNzZWQtLTsKKyAgICAgICAgICAgICAgICBkZWx0YVRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3RvdGFscy50ZXN0Q2FzZXMgKz0gZGVsdGFUb3RhbHMudGVzdENhc2VzOworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyggICB0ZXN0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFUb3RhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0ZWRDb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdGVkQ2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRpbmcoKSApICk7CisKKyAgICAgICAgICAgIG1fYWN0aXZlVGVzdENhc2UgPSBDQVRDSF9OVUxMOworICAgICAgICAgICAgbV90ZXN0Q2FzZVRyYWNrZXIgPSBDQVRDSF9OVUxMOworCisgICAgICAgICAgICByZXR1cm4gZGVsdGFUb3RhbHM7CisgICAgICAgIH0KKworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gY29uZmlnKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY29uZmlnOworICAgICAgICB9CisKKyAgICBwcml2YXRlOiAvLyBJUmVzdWx0Q2FwdHVyZQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgKSB7CisgICAgICAgICAgICBpZiggcmVzdWx0LmdldFJlc3VsdFR5cGUoKSA9PSBSZXN1bHRXYXM6Ok9rICkgeworICAgICAgICAgICAgICAgIG1fdG90YWxzLmFzc2VydGlvbnMucGFzc2VkKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCAhcmVzdWx0LmlzT2soKSApIHsKKyAgICAgICAgICAgICAgICBtX3RvdGFscy5hc3NlcnRpb25zLmZhaWxlZCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBXZSBoYXZlIG5vIHVzZSBmb3IgdGhlIHJldHVybiB2YWx1ZSAod2hldGhlciBtZXNzYWdlcyBzaG91bGQgYmUgY2xlYXJlZCksIGJlY2F1c2UgbWVzc2FnZXMgd2VyZSBtYWRlIHNjb3BlZAorICAgICAgICAgICAgLy8gYW5kIHNob3VsZCBiZSBsZXQgdG8gY2xlYXIgdGhlbXNlbHZlcyBvdXQuCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkPihtX3JlcG9ydGVyLT5hc3NlcnRpb25FbmRlZChBc3NlcnRpb25TdGF0cyhyZXN1bHQsIG1fbWVzc2FnZXMsIG1fdG90YWxzKSkpOworCisgICAgICAgICAgICAvLyBSZXNldCB3b3JraW5nIHN0YXRlCisgICAgICAgICAgICBtX2xhc3RBc3NlcnRpb25JbmZvID0gQXNzZXJ0aW9uSW5mbyggc3RkOjpzdHJpbmcoKSwgbV9sYXN0QXNzZXJ0aW9uSW5mby5saW5lSW5mbywgIntVbmtub3duIGV4cHJlc3Npb24gYWZ0ZXIgdGhlIHJlcG9ydGVkIGxpbmV9IiAsIG1fbGFzdEFzc2VydGlvbkluZm8ucmVzdWx0RGlzcG9zaXRpb24gKTsKKyAgICAgICAgICAgIG1fbGFzdFJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBzZWN0aW9uU3RhcnRlZCAoCisgICAgICAgICAgICBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8sCisgICAgICAgICAgICBDb3VudHMmIGFzc2VydGlvbnMKKyAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICBJVHJhY2tlciYgc2VjdGlvblRyYWNrZXIgPSBTZWN0aW9uVHJhY2tlcjo6YWNxdWlyZSggbV90cmFja2VyQ29udGV4dCwgVGVzdENhc2VUcmFja2luZzo6TmFtZUFuZExvY2F0aW9uKCBzZWN0aW9uSW5mby5uYW1lLCBzZWN0aW9uSW5mby5saW5lSW5mbyApICk7CisgICAgICAgICAgICBpZiggIXNlY3Rpb25UcmFja2VyLmlzT3BlbigpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBtX2FjdGl2ZVNlY3Rpb25zLnB1c2hfYmFjayggJnNlY3Rpb25UcmFja2VyICk7CisKKyAgICAgICAgICAgIG1fbGFzdEFzc2VydGlvbkluZm8ubGluZUluZm8gPSBzZWN0aW9uSW5mby5saW5lSW5mbzsKKworICAgICAgICAgICAgbV9yZXBvcnRlci0+c2VjdGlvblN0YXJ0aW5nKCBzZWN0aW9uSW5mbyApOworCisgICAgICAgICAgICBhc3NlcnRpb25zID0gbV90b3RhbHMuYXNzZXJ0aW9uczsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCB0ZXN0Rm9yTWlzc2luZ0Fzc2VydGlvbnMoIENvdW50cyYgYXNzZXJ0aW9ucyApIHsKKyAgICAgICAgICAgIGlmKCBhc3NlcnRpb25zLnRvdGFsKCkgIT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYoICFtX2NvbmZpZy0+d2FybkFib3V0TWlzc2luZ0Fzc2VydGlvbnMoKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYoIG1fdHJhY2tlckNvbnRleHQuY3VycmVudFRyYWNrZXIoKS5oYXNDaGlsZHJlbigpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBtX3RvdGFscy5hc3NlcnRpb25zLmZhaWxlZCsrOworICAgICAgICAgICAgYXNzZXJ0aW9ucy5mYWlsZWQrKzsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvbkVuZEluZm8gY29uc3QmIGVuZEluZm8gKSB7CisgICAgICAgICAgICBDb3VudHMgYXNzZXJ0aW9ucyA9IG1fdG90YWxzLmFzc2VydGlvbnMgLSBlbmRJbmZvLnByZXZBc3NlcnRpb25zOworICAgICAgICAgICAgYm9vbCBtaXNzaW5nQXNzZXJ0aW9ucyA9IHRlc3RGb3JNaXNzaW5nQXNzZXJ0aW9ucyggYXNzZXJ0aW9ucyApOworCisgICAgICAgICAgICBpZiggIW1fYWN0aXZlU2VjdGlvbnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBtX2FjdGl2ZVNlY3Rpb25zLmJhY2soKS0+Y2xvc2UoKTsKKyAgICAgICAgICAgICAgICBtX2FjdGl2ZVNlY3Rpb25zLnBvcF9iYWNrKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzKCBlbmRJbmZvLnNlY3Rpb25JbmZvLCBhc3NlcnRpb25zLCBlbmRJbmZvLmR1cmF0aW9uSW5TZWNvbmRzLCBtaXNzaW5nQXNzZXJ0aW9ucyApICk7CisgICAgICAgICAgICBtX21lc3NhZ2VzLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkRWFybHkoIFNlY3Rpb25FbmRJbmZvIGNvbnN0JiBlbmRJbmZvICkgeworICAgICAgICAgICAgaWYoIG1fdW5maW5pc2hlZFNlY3Rpb25zLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIG1fYWN0aXZlU2VjdGlvbnMuYmFjaygpLT5mYWlsKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9hY3RpdmVTZWN0aW9ucy5iYWNrKCktPmNsb3NlKCk7CisgICAgICAgICAgICBtX2FjdGl2ZVNlY3Rpb25zLnBvcF9iYWNrKCk7CisKKyAgICAgICAgICAgIG1fdW5maW5pc2hlZFNlY3Rpb25zLnB1c2hfYmFjayggZW5kSW5mbyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHB1c2hTY29wZWRNZXNzYWdlKCBNZXNzYWdlSW5mbyBjb25zdCYgbWVzc2FnZSApIHsKKyAgICAgICAgICAgIG1fbWVzc2FnZXMucHVzaF9iYWNrKCBtZXNzYWdlICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgcG9wU2NvcGVkTWVzc2FnZSggTWVzc2FnZUluZm8gY29uc3QmIG1lc3NhZ2UgKSB7CisgICAgICAgICAgICBtX21lc3NhZ2VzLmVyYXNlKCBzdGQ6OnJlbW92ZSggbV9tZXNzYWdlcy5iZWdpbigpLCBtX21lc3NhZ2VzLmVuZCgpLCBtZXNzYWdlICksIG1fbWVzc2FnZXMuZW5kKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0Q3VycmVudFRlc3ROYW1lKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fYWN0aXZlVGVzdENhc2UKKyAgICAgICAgICAgICAgICA/IG1fYWN0aXZlVGVzdENhc2UtPmdldFRlc3RDYXNlSW5mbygpLm5hbWUKKyAgICAgICAgICAgICAgICA6IHN0ZDo6c3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIGNvbnN0IEFzc2VydGlvblJlc3VsdCogZ2V0TGFzdFJlc3VsdCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAmbV9sYXN0UmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGV4Y2VwdGlvbkVhcmx5UmVwb3J0ZWQoKSB7CisgICAgICAgICAgICBtX3Nob3VsZFJlcG9ydFVuZXhwZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVGYXRhbEVycm9yQ29uZGl0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgbWVzc2FnZSApIHsKKyAgICAgICAgICAgIC8vIERvbid0IHJlYnVpbGQgdGhlIHJlc3VsdCAtLSB0aGUgc3RyaW5naWZpY2F0aW9uIGl0c2VsZiBjYW4gY2F1c2UgbW9yZSBmYXRhbCBlcnJvcnMKKyAgICAgICAgICAgIC8vIEluc3RlYWQsIGZha2UgYSByZXN1bHQgZGF0YS4KKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdERhdGEgdGVtcFJlc3VsdDsKKyAgICAgICAgICAgIHRlbXBSZXN1bHQucmVzdWx0VHlwZSA9IFJlc3VsdFdhczo6RmF0YWxFcnJvckNvbmRpdGlvbjsKKyAgICAgICAgICAgIHRlbXBSZXN1bHQubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgcmVzdWx0KG1fbGFzdEFzc2VydGlvbkluZm8sIHRlbXBSZXN1bHQpOworCisgICAgICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkuYXNzZXJ0aW9uRW5kZWQocmVzdWx0KTsKKworICAgICAgICAgICAgaGFuZGxlVW5maW5pc2hlZFNlY3Rpb25zKCk7CisKKyAgICAgICAgICAgIC8vIFJlY3JlYXRlIHNlY3Rpb24gZm9yIHRlc3QgY2FzZSAoYXMgd2Ugd2lsbCBsb3NlIHRoZSBvbmUgdGhhdCB3YXMgaW4gc2NvcGUpCisgICAgICAgICAgICBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlSW5mbyA9IG1fYWN0aXZlVGVzdENhc2UtPmdldFRlc3RDYXNlSW5mbygpOworICAgICAgICAgICAgU2VjdGlvbkluZm8gdGVzdENhc2VTZWN0aW9uKCB0ZXN0Q2FzZUluZm8ubGluZUluZm8sIHRlc3RDYXNlSW5mby5uYW1lLCB0ZXN0Q2FzZUluZm8uZGVzY3JpcHRpb24gKTsKKworICAgICAgICAgICAgQ291bnRzIGFzc2VydGlvbnM7CisgICAgICAgICAgICBhc3NlcnRpb25zLmZhaWxlZCA9IDE7CisgICAgICAgICAgICBTZWN0aW9uU3RhdHMgdGVzdENhc2VTZWN0aW9uU3RhdHMoIHRlc3RDYXNlU2VjdGlvbiwgYXNzZXJ0aW9ucywgMCwgZmFsc2UgKTsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnNlY3Rpb25FbmRlZCggdGVzdENhc2VTZWN0aW9uU3RhdHMgKTsKKworICAgICAgICAgICAgVGVzdENhc2VJbmZvIHRlc3RJbmZvID0gbV9hY3RpdmVUZXN0Q2FzZS0+Z2V0VGVzdENhc2VJbmZvKCk7CisKKyAgICAgICAgICAgIFRvdGFscyBkZWx0YVRvdGFsczsKKyAgICAgICAgICAgIGRlbHRhVG90YWxzLnRlc3RDYXNlcy5mYWlsZWQgPSAxOworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyggICB0ZXN0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFUb3RhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlICkgKTsKKyAgICAgICAgICAgIG1fdG90YWxzLnRlc3RDYXNlcy5mYWlsZWQrKzsKKyAgICAgICAgICAgIHRlc3RHcm91cEVuZGVkKCBzdGQ6OnN0cmluZygpLCBtX3RvdGFscywgMSwgMSApOworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMoIG1fcnVuSW5mbywgbV90b3RhbHMsIGZhbHNlICkgKTsKKyAgICAgICAgfQorCisgICAgcHVibGljOgorICAgICAgICAvLyAhVEJEIFdlIG5lZWQgdG8gZG8gdGhpcyBhbm90aGVyIHdheSEKKyAgICAgICAgYm9vbCBhYm9ydGluZygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX3RvdGFscy5hc3NlcnRpb25zLmZhaWxlZCA9PSBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oIG1fY29uZmlnLT5hYm9ydEFmdGVyKCkgKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKworICAgICAgICB2b2lkIHJ1bkN1cnJlbnRUZXN0KCBzdGQ6OnN0cmluZyYgcmVkaXJlY3RlZENvdXQsIHN0ZDo6c3RyaW5nJiByZWRpcmVjdGVkQ2VyciApIHsKKyAgICAgICAgICAgIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2VJbmZvID0gbV9hY3RpdmVUZXN0Q2FzZS0+Z2V0VGVzdENhc2VJbmZvKCk7CisgICAgICAgICAgICBTZWN0aW9uSW5mbyB0ZXN0Q2FzZVNlY3Rpb24oIHRlc3RDYXNlSW5mby5saW5lSW5mbywgdGVzdENhc2VJbmZvLm5hbWUsIHRlc3RDYXNlSW5mby5kZXNjcmlwdGlvbiApOworICAgICAgICAgICAgbV9yZXBvcnRlci0+c2VjdGlvblN0YXJ0aW5nKCB0ZXN0Q2FzZVNlY3Rpb24gKTsKKyAgICAgICAgICAgIENvdW50cyBwcmV2QXNzZXJ0aW9ucyA9IG1fdG90YWxzLmFzc2VydGlvbnM7CisgICAgICAgICAgICBkb3VibGUgZHVyYXRpb24gPSAwOworICAgICAgICAgICAgbV9zaG91bGRSZXBvcnRVbmV4cGVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mbyA9IEFzc2VydGlvbkluZm8oICJURVNUX0NBU0UiLCB0ZXN0Q2FzZUluZm8ubGluZUluZm8sIHN0ZDo6c3RyaW5nKCksIFJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwgKTsKKworICAgICAgICAgICAgICAgIHNlZWRSbmcoICptX2NvbmZpZyApOworCisgICAgICAgICAgICAgICAgVGltZXIgdGltZXI7CisgICAgICAgICAgICAgICAgdGltZXIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBpZiggbV9yZXBvcnRlci0+Z2V0UHJlZmVyZW5jZXMoKS5zaG91bGRSZWRpcmVjdFN0ZE91dCApIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyZWFtUmVkaXJlY3QgY291dFJlZGlyKCBDYXRjaDo6Y291dCgpLCByZWRpcmVjdGVkQ291dCApOworICAgICAgICAgICAgICAgICAgICBTdHJlYW1SZWRpcmVjdCBjZXJyUmVkaXIoIENhdGNoOjpjZXJyKCksIHJlZGlyZWN0ZWRDZXJyICk7CisgICAgICAgICAgICAgICAgICAgIGludm9rZUFjdGl2ZVRlc3RDYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnZva2VBY3RpdmVUZXN0Q2FzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IHRpbWVyLmdldEVsYXBzZWRTZWNvbmRzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggVGVzdEZhaWx1cmVFeGNlcHRpb24mICkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMganVzdCBtZWFucyB0aGUgdGVzdCB3YXMgYWJvcnRlZCBkdWUgdG8gZmFpbHVyZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goLi4uKSB7CisgICAgICAgICAgICAgICAgLy8gVW5kZXIgQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSwgdW5leHBlY3RlZCBleGNlcHRpb25zIHVuZGVyIFJFUVVJUkUgYXNzZXJ0aW9ucworICAgICAgICAgICAgICAgIC8vIGFyZSByZXBvcnRlZCB3aXRob3V0IHRyYW5zbGF0aW9uIGF0IHRoZSBwb2ludCBvZiBvcmlnaW4uCisgICAgICAgICAgICAgICAgaWYgKG1fc2hvdWxkUmVwb3J0VW5leHBlY3RlZCkgeworICAgICAgICAgICAgICAgICAgICBtYWtlVW5leHBlY3RlZFJlc3VsdEJ1aWxkZXIoKS51c2VBY3RpdmVFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3Rlc3RDYXNlVHJhY2tlci0+Y2xvc2UoKTsKKyAgICAgICAgICAgIGhhbmRsZVVuZmluaXNoZWRTZWN0aW9ucygpOworICAgICAgICAgICAgbV9tZXNzYWdlcy5jbGVhcigpOworCisgICAgICAgICAgICBDb3VudHMgYXNzZXJ0aW9ucyA9IG1fdG90YWxzLmFzc2VydGlvbnMgLSBwcmV2QXNzZXJ0aW9uczsKKyAgICAgICAgICAgIGJvb2wgbWlzc2luZ0Fzc2VydGlvbnMgPSB0ZXN0Rm9yTWlzc2luZ0Fzc2VydGlvbnMoIGFzc2VydGlvbnMgKTsKKworICAgICAgICAgICAgaWYoIHRlc3RDYXNlSW5mby5va1RvRmFpbCgpICkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3dhcCggYXNzZXJ0aW9ucy5mYWlsZWRCdXRPaywgYXNzZXJ0aW9ucy5mYWlsZWQgKTsKKyAgICAgICAgICAgICAgICBtX3RvdGFscy5hc3NlcnRpb25zLmZhaWxlZCAtPSBhc3NlcnRpb25zLmZhaWxlZEJ1dE9rOworICAgICAgICAgICAgICAgIG1fdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkQnV0T2sgKz0gYXNzZXJ0aW9ucy5mYWlsZWRCdXRPazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2VjdGlvblN0YXRzIHRlc3RDYXNlU2VjdGlvblN0YXRzKCB0ZXN0Q2FzZVNlY3Rpb24sIGFzc2VydGlvbnMsIGR1cmF0aW9uLCBtaXNzaW5nQXNzZXJ0aW9ucyApOworICAgICAgICAgICAgbV9yZXBvcnRlci0+c2VjdGlvbkVuZGVkKCB0ZXN0Q2FzZVNlY3Rpb25TdGF0cyApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBpbnZva2VBY3RpdmVUZXN0Q2FzZSgpIHsKKyAgICAgICAgICAgIEZhdGFsQ29uZGl0aW9uSGFuZGxlciBmYXRhbENvbmRpdGlvbkhhbmRsZXI7IC8vIEhhbmRsZSBzaWduYWxzCisgICAgICAgICAgICBtX2FjdGl2ZVRlc3RDYXNlLT5pbnZva2UoKTsKKyAgICAgICAgICAgIGZhdGFsQ29uZGl0aW9uSGFuZGxlci5yZXNldCgpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorCisgICAgICAgIFJlc3VsdEJ1aWxkZXIgbWFrZVVuZXhwZWN0ZWRSZXN1bHRCdWlsZGVyKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdEJ1aWxkZXIoICAgbV9sYXN0QXNzZXJ0aW9uSW5mby5tYWNyb05hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbGFzdEFzc2VydGlvbkluZm8ubGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2xhc3RBc3NlcnRpb25JbmZvLmNhcHR1cmVkRXhwcmVzc2lvbi5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mby5yZXN1bHREaXNwb3NpdGlvbiApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBoYW5kbGVVbmZpbmlzaGVkU2VjdGlvbnMoKSB7CisgICAgICAgICAgICAvLyBJZiBzZWN0aW9ucyBlbmRlZCBwcmVtYXR1cmVseSBkdWUgdG8gYW4gZXhjZXB0aW9uIHdlIHN0b3JlZCB0aGVpcgorICAgICAgICAgICAgLy8gaW5mb3MgaGVyZSBzbyB3ZSBjYW4gdGVhciB0aGVtIGRvd24gb3V0c2lkZSB0aGUgdW53aW5kIHByb2Nlc3MuCisgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFNlY3Rpb25FbmRJbmZvPjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdCA9IG1fdW5maW5pc2hlZFNlY3Rpb25zLnJiZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBtX3VuZmluaXNoZWRTZWN0aW9ucy5yZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICAgICBzZWN0aW9uRW5kZWQoICppdCApOworICAgICAgICAgICAgbV91bmZpbmlzaGVkU2VjdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIFRlc3RSdW5JbmZvIG1fcnVuSW5mbzsKKyAgICAgICAgSU11dGFibGVDb250ZXh0JiBtX2NvbnRleHQ7CisgICAgICAgIFRlc3RDYXNlIGNvbnN0KiBtX2FjdGl2ZVRlc3RDYXNlOworICAgICAgICBJVHJhY2tlciogbV90ZXN0Q2FzZVRyYWNrZXI7CisgICAgICAgIElUcmFja2VyKiBtX2N1cnJlbnRTZWN0aW9uVHJhY2tlcjsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IG1fbGFzdFJlc3VsdDsKKworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gbV9jb25maWc7CisgICAgICAgIFRvdGFscyBtX3RvdGFsczsKKyAgICAgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gbV9yZXBvcnRlcjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+IG1fbWVzc2FnZXM7CisgICAgICAgIEFzc2VydGlvbkluZm8gbV9sYXN0QXNzZXJ0aW9uSW5mbzsKKyAgICAgICAgc3RkOjp2ZWN0b3I8U2VjdGlvbkVuZEluZm8+IG1fdW5maW5pc2hlZFNlY3Rpb25zOworICAgICAgICBzdGQ6OnZlY3RvcjxJVHJhY2tlcio+IG1fYWN0aXZlU2VjdGlvbnM7CisgICAgICAgIFRyYWNrZXJDb250ZXh0IG1fdHJhY2tlckNvbnRleHQ7CisgICAgICAgIGJvb2wgbV9zaG91bGRSZXBvcnRVbmV4cGVjdGVkOworICAgIH07CisKKyAgICBJUmVzdWx0Q2FwdHVyZSYgZ2V0UmVzdWx0Q2FwdHVyZSgpIHsKKyAgICAgICAgaWYoIElSZXN1bHRDYXB0dXJlKiBjYXB0dXJlID0gZ2V0Q3VycmVudENvbnRleHQoKS5nZXRSZXN1bHRDYXB0dXJlKCkgKQorICAgICAgICAgICAgcmV0dXJuICpjYXB0dXJlOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiTm8gcmVzdWx0IGNhcHR1cmUgaW5zdGFuY2UiICk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX3ZlcnNpb24uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVkVSU0lPTl9IX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICAvLyBWZXJzaW9uaW5nIGluZm9ybWF0aW9uCisgICAgc3RydWN0IFZlcnNpb24geworICAgICAgICBWZXJzaW9uKCAgICB1bnNpZ25lZCBpbnQgX21ham9yVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IF9taW5vclZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBfcGF0Y2hOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBfYnJhbmNoTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IF9idWlsZE51bWJlciApOworCisgICAgICAgIHVuc2lnbmVkIGludCBjb25zdCBtYWpvclZlcnNpb247CisgICAgICAgIHVuc2lnbmVkIGludCBjb25zdCBtaW5vclZlcnNpb247CisgICAgICAgIHVuc2lnbmVkIGludCBjb25zdCBwYXRjaE51bWJlcjsKKworICAgICAgICAvLyBidWlsZE51bWJlciBpcyBvbmx5IHVzZWQgaWYgYnJhbmNoTmFtZSBpcyBub3QgbnVsbAorICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgYnJhbmNoTmFtZTsKKyAgICAgICAgdW5zaWduZWQgaW50IGNvbnN0IGJ1aWxkTnVtYmVyOworCisgICAgICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgVmVyc2lvbiBjb25zdCYgdmVyc2lvbiApOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBvcGVyYXRvcj0oIFZlcnNpb24gY29uc3QmICk7CisgICAgfTsKKworICAgIGlubGluZSBWZXJzaW9uIGxpYnJhcnlWZXJzaW9uKCk7Cit9CisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpbWl0cz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGNyZWF0ZVJlcG9ydGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgcmVwb3J0ZXJOYW1lLCBQdHI8Q29uZmlnPiBjb25zdCYgY29uZmlnICkgeworICAgICAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiByZXBvcnRlciA9IGdldFJlZ2lzdHJ5SHViKCkuZ2V0UmVwb3J0ZXJSZWdpc3RyeSgpLmNyZWF0ZSggcmVwb3J0ZXJOYW1lLCBjb25maWcuZ2V0KCkgKTsKKyAgICAgICAgaWYoICFyZXBvcnRlciApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgIk5vIHJlcG9ydGVyIHJlZ2lzdGVyZWQgd2l0aCBuYW1lOiAnIiA8PCByZXBvcnRlck5hbWUgPDwgIiciOworICAgICAgICAgICAgdGhyb3cgc3RkOjpkb21haW5fZXJyb3IoIG9zcy5zdHIoKSApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBvcnRlcjsKKyAgICB9CisKKyAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBtYWtlUmVwb3J0ZXIoIFB0cjxDb25maWc+IGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXBvcnRlcnMgPSBjb25maWctPmdldFJlcG9ydGVyTmFtZXMoKTsKKyAgICAgICAgaWYoIHJlcG9ydGVycy5lbXB0eSgpICkKKyAgICAgICAgICAgIHJlcG9ydGVycy5wdXNoX2JhY2soICJjb25zb2xlIiApOworCisgICAgICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IHJlcG9ydGVyOworICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSByZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSByZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICByZXBvcnRlciA9IGFkZFJlcG9ydGVyKCByZXBvcnRlciwgY3JlYXRlUmVwb3J0ZXIoICppdCwgY29uZmlnICkgKTsKKyAgICAgICAgcmV0dXJuIHJlcG9ydGVyOworICAgIH0KKyAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBhZGRMaXN0ZW5lcnMoIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgY29uZmlnLCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiByZXBvcnRlcnMgKSB7CisgICAgICAgIElSZXBvcnRlclJlZ2lzdHJ5OjpMaXN0ZW5lcnMgbGlzdGVuZXJzID0gZ2V0UmVnaXN0cnlIdWIoKS5nZXRSZXBvcnRlclJlZ2lzdHJ5KCkuZ2V0TGlzdGVuZXJzKCk7CisgICAgICAgIGZvciggSVJlcG9ydGVyUmVnaXN0cnk6Okxpc3RlbmVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBsaXN0ZW5lcnMuYmVnaW4oKSwgaXRFbmQgPSBsaXN0ZW5lcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICByZXBvcnRlcnMgPSBhZGRSZXBvcnRlcihyZXBvcnRlcnMsICgqaXQpLT5jcmVhdGUoIFJlcG9ydGVyQ29uZmlnKCBjb25maWcgKSApICk7CisgICAgICAgIHJldHVybiByZXBvcnRlcnM7CisgICAgfQorCisgICAgVG90YWxzIHJ1blRlc3RzKCBQdHI8Q29uZmlnPiBjb25zdCYgY29uZmlnICkgeworCisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBpY29uZmlnID0gY29uZmlnLmdldCgpOworCisgICAgICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IHJlcG9ydGVyID0gbWFrZVJlcG9ydGVyKCBjb25maWcgKTsKKyAgICAgICAgcmVwb3J0ZXIgPSBhZGRMaXN0ZW5lcnMoIGljb25maWcsIHJlcG9ydGVyICk7CisKKyAgICAgICAgUnVuQ29udGV4dCBjb250ZXh0KCBpY29uZmlnLCByZXBvcnRlciApOworCisgICAgICAgIFRvdGFscyB0b3RhbHM7CisKKyAgICAgICAgY29udGV4dC50ZXN0R3JvdXBTdGFydGluZyggY29uZmlnLT5uYW1lKCksIDEsIDEgKTsKKworICAgICAgICBUZXN0U3BlYyB0ZXN0U3BlYyA9IGNvbmZpZy0+dGVzdFNwZWMoKTsKKyAgICAgICAgaWYoICF0ZXN0U3BlYy5oYXNGaWx0ZXJzKCkgKQorICAgICAgICAgICAgdGVzdFNwZWMgPSBUZXN0U3BlY1BhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpICkucGFyc2UoICJ+Wy5dIiApLnRlc3RTcGVjKCk7IC8vIEFsbCBub3QgaGlkZGVuIHRlc3RzCisKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBhbGxUZXN0Q2FzZXMgPSBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoICppY29uZmlnICk7CisgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8VGVzdENhc2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGFsbFRlc3RDYXNlcy5iZWdpbigpLCBpdEVuZCA9IGFsbFRlc3RDYXNlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgaWYoICFjb250ZXh0LmFib3J0aW5nKCkgJiYgbWF0Y2hUZXN0KCAqaXQsIHRlc3RTcGVjLCAqaWNvbmZpZyApICkKKyAgICAgICAgICAgICAgICB0b3RhbHMgKz0gY29udGV4dC5ydW5UZXN0KCAqaXQgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXBvcnRlci0+c2tpcFRlc3QoICppdCApOworICAgICAgICB9CisKKyAgICAgICAgY29udGV4dC50ZXN0R3JvdXBFbmRlZCggaWNvbmZpZy0+bmFtZSgpLCB0b3RhbHMsIDEsIDEgKTsKKyAgICAgICAgcmV0dXJuIHRvdGFsczsKKyAgICB9CisKKyAgICB2b2lkIGFwcGx5RmlsZW5hbWVzQXNUYWdzKCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgdGVzdHMgPSBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoIGNvbmZpZyApOworICAgICAgICBmb3Ioc3RkOjpzaXplX3QgaSA9IDA7IGkgPCB0ZXN0cy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgIFRlc3RDYXNlJiB0ZXN0ID0gY29uc3RfY2FzdDxUZXN0Q2FzZSY+KCB0ZXN0c1tpXSApOworICAgICAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHRhZ3MgPSB0ZXN0LnRhZ3M7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gdGVzdC5saW5lSW5mby5maWxlOworICAgICAgICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsYXN0U2xhc2ggPSBmaWxlbmFtZS5maW5kX2xhc3Rfb2YoICJcXC8iICk7CisgICAgICAgICAgICBpZiggbGFzdFNsYXNoICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0ciggbGFzdFNsYXNoKzEgKTsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsYXN0RG90ID0gZmlsZW5hbWUuZmluZF9sYXN0X29mKCAiLiIgKTsKKyAgICAgICAgICAgIGlmKCBsYXN0RG90ICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0ciggMCwgbGFzdERvdCApOworCisgICAgICAgICAgICB0YWdzLmluc2VydCggIiMiICsgZmlsZW5hbWUgKTsKKyAgICAgICAgICAgIHNldFRhZ3MoIHRlc3QsIHRhZ3MgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIFNlc3Npb24gOiBOb25Db3B5YWJsZSB7CisgICAgICAgIHN0YXRpYyBib29sIGFscmVhZHlJbnN0YW50aWF0ZWQ7CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgc3RydWN0IE9uVW51c2VkT3B0aW9ucyB7IGVudW0gRG9XaGF0IHsgSWdub3JlLCBGYWlsIH07IH07CisKKyAgICAgICAgU2Vzc2lvbigpCisgICAgICAgIDogbV9jbGkoIG1ha2VDb21tYW5kTGluZVBhcnNlcigpICkgeworICAgICAgICAgICAgaWYoIGFscmVhZHlJbnN0YW50aWF0ZWQgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbXNnID0gIk9ubHkgb25lIGluc3RhbmNlIG9mIENhdGNoOjpTZXNzaW9uIGNhbiBldmVyIGJlIHVzZWQiOworICAgICAgICAgICAgICAgIENhdGNoOjpjZXJyKCkgPDwgbXNnIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCBtc2cgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFscmVhZHlJbnN0YW50aWF0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIH5TZXNzaW9uKCkgeworICAgICAgICAgICAgQ2F0Y2g6OmNsZWFuVXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2hvd0hlbHAoIHN0ZDo6c3RyaW5nIGNvbnN0JiBwcm9jZXNzTmFtZSApIHsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIlxuQ2F0Y2ggdiIgPDwgbGlicmFyeVZlcnNpb24oKSA8PCAiXG4iOworCisgICAgICAgICAgICBtX2NsaS51c2FnZSggQ2F0Y2g6OmNvdXQoKSwgcHJvY2Vzc05hbWUgKTsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIkZvciBtb3JlIGRldGFpbCB1c2FnZSBwbGVhc2Ugc2VlIHRoZSBwcm9qZWN0IGRvY3NcbiIgPDwgc3RkOjplbmRsOworICAgICAgICB9CisKKyAgICAgICAgaW50IGFwcGx5Q29tbWFuZExpbmUoIGludCBhcmdjLCBjaGFyIGNvbnN0KiBjb25zdCogY29uc3QgYXJndiwgT25VbnVzZWRPcHRpb25zOjpEb1doYXQgdW51c2VkT3B0aW9uQmVoYXZpb3VyID0gT25VbnVzZWRPcHRpb25zOjpGYWlsICkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtX2NsaS5zZXRUaHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zKCB1bnVzZWRPcHRpb25CZWhhdmlvdXIgPT0gT25VbnVzZWRPcHRpb25zOjpGYWlsICk7CisgICAgICAgICAgICAgICAgbV91bnVzZWRUb2tlbnMgPSBtX2NsaS5wYXJzZUludG8oIENsYXJhOjphcmdzVG9WZWN0b3IoIGFyZ2MsIGFyZ3YgKSwgbV9jb25maWdEYXRhICk7CisgICAgICAgICAgICAgICAgaWYoIG1fY29uZmlnRGF0YS5zaG93SGVscCApCisgICAgICAgICAgICAgICAgICAgIHNob3dIZWxwKCBtX2NvbmZpZ0RhdGEucHJvY2Vzc05hbWUgKTsKKyAgICAgICAgICAgICAgICBtX2NvbmZpZy5yZXNldCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIHN0ZDo6ZXhjZXB0aW9uJiBleCApIHsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpSZWQgKTsKKyAgICAgICAgICAgICAgICAgICAgQ2F0Y2g6OmNlcnIoKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuRXJyb3IocykgaW4gaW5wdXQ6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBUZXh0KCBleC53aGF0KCksIFRleHRBdHRyaWJ1dGVzKCkuc2V0SW5kZW50KDIpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcblxuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbV9jbGkudXNhZ2UoIENhdGNoOjpjb3V0KCksIG1fY29uZmlnRGF0YS5wcm9jZXNzTmFtZSApOworICAgICAgICAgICAgICAgIHJldHVybiAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgpKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdXNlQ29uZmlnRGF0YSggQ29uZmlnRGF0YSBjb25zdCYgX2NvbmZpZ0RhdGEgKSB7CisgICAgICAgICAgICBtX2NvbmZpZ0RhdGEgPSBfY29uZmlnRGF0YTsKKyAgICAgICAgICAgIG1fY29uZmlnLnJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcnVuKCBpbnQgYXJnYywgY2hhciBjb25zdCogY29uc3QqIGNvbnN0IGFyZ3YgKSB7CisKKyAgICAgICAgICAgIGludCByZXR1cm5Db2RlID0gYXBwbHlDb21tYW5kTGluZSggYXJnYywgYXJndiApOworICAgICAgICAgICAgaWYoIHJldHVybkNvZGUgPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSA9IHJ1bigpOworICAgICAgICAgICAgcmV0dXJuIHJldHVybkNvZGU7CisgICAgICAgIH0KKworICAgICNpZiBkZWZpbmVkKFdJTjMyKSAmJiBkZWZpbmVkKFVOSUNPREUpCisgICAgICAgIGludCBydW4oIGludCBhcmdjLCB3Y2hhcl90IGNvbnN0KiBjb25zdCogY29uc3QgYXJndiApIHsKKworICAgICAgICAgICAgY2hhciAqKnV0ZjhBcmd2ID0gbmV3IGNoYXIgKlsgYXJnYyBdOworCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBhcmdjOyArK2kgKSB7CisgICAgICAgICAgICAgICAgaW50IGJ1ZlNpemUgPSBXaWRlQ2hhclRvTXVsdGlCeXRlKCBDUF9VVEY4LCAwLCBhcmd2W2ldLCAtMSwgTlVMTCwgMCwgTlVMTCwgTlVMTCApOworCisgICAgICAgICAgICAgICAgdXRmOEFyZ3ZbIGkgXSA9IG5ldyBjaGFyWyBidWZTaXplIF07CisKKyAgICAgICAgICAgICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKCBDUF9VVEY4LCAwLCBhcmd2W2ldLCAtMSwgdXRmOEFyZ3ZbaV0sIGJ1ZlNpemUsIE5VTEwsIE5VTEwgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHJldHVybkNvZGUgPSBhcHBseUNvbW1hbmRMaW5lKCBhcmdjLCB1dGY4QXJndiApOworICAgICAgICAgICAgaWYoIHJldHVybkNvZGUgPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSA9IHJ1bigpOworCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBhcmdjOyArK2kgKQorICAgICAgICAgICAgICAgIGRlbGV0ZSBbXSB1dGY4QXJndlsgaSBdOworCisgICAgICAgICAgICBkZWxldGUgW10gdXRmOEFyZ3Y7CisKKyAgICAgICAgICAgIHJldHVybiByZXR1cm5Db2RlOworICAgICAgICB9CisgICAgI2VuZGlmCisKKyAgICAgICAgaW50IHJ1bigpIHsKKyAgICAgICAgICAgIGlmKCBtX2NvbmZpZ0RhdGEuc2hvd0hlbHAgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25maWcoKTsgLy8gRm9yY2UgY29uZmlnIHRvIGJlIGNvbnN0cnVjdGVkCisKKyAgICAgICAgICAgICAgICBzZWVkUm5nKCAqbV9jb25maWcgKTsKKworICAgICAgICAgICAgICAgIGlmKCBtX2NvbmZpZ0RhdGEuZmlsZW5hbWVzQXNUYWdzICkKKyAgICAgICAgICAgICAgICAgICAgYXBwbHlGaWxlbmFtZXNBc1RhZ3MoICptX2NvbmZpZyApOworCisgICAgICAgICAgICAgICAgLy8gSGFuZGxlIGxpc3QgcmVxdWVzdAorICAgICAgICAgICAgICAgIGlmKCBPcHRpb248c3RkOjpzaXplX3Q+IGxpc3RlZCA9IGxpc3QoIGNvbmZpZygpICkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PiggKmxpc3RlZCApOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oIHJ1blRlc3RzKCBtX2NvbmZpZyApLmFzc2VydGlvbnMuZmFpbGVkICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggc3RkOjpleGNlcHRpb24mIGV4ICkgeworICAgICAgICAgICAgICAgIENhdGNoOjpjZXJyKCkgPDwgZXgud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQ2xhcmE6OkNvbW1hbmRMaW5lPENvbmZpZ0RhdGE+IGNvbnN0JiBjbGkoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jbGk7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8Q2xhcmE6OlBhcnNlcjo6VG9rZW4+IGNvbnN0JiB1bnVzZWRUb2tlbnMoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV91bnVzZWRUb2tlbnM7CisgICAgICAgIH0KKyAgICAgICAgQ29uZmlnRGF0YSYgY29uZmlnRGF0YSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtX2NvbmZpZ0RhdGE7CisgICAgICAgIH0KKyAgICAgICAgQ29uZmlnJiBjb25maWcoKSB7CisgICAgICAgICAgICBpZiggIW1fY29uZmlnICkKKyAgICAgICAgICAgICAgICBtX2NvbmZpZyA9IG5ldyBDb25maWcoIG1fY29uZmlnRGF0YSApOworICAgICAgICAgICAgcmV0dXJuICptX2NvbmZpZzsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIENsYXJhOjpDb21tYW5kTGluZTxDb25maWdEYXRhPiBtX2NsaTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Q2xhcmE6OlBhcnNlcjo6VG9rZW4+IG1fdW51c2VkVG9rZW5zOworICAgICAgICBDb25maWdEYXRhIG1fY29uZmlnRGF0YTsKKyAgICAgICAgUHRyPENvbmZpZz4gbV9jb25maWc7CisgICAgfTsKKworICAgIGJvb2wgU2Vzc2lvbjo6YWxyZWFkeUluc3RhbnRpYXRlZCA9IGZhbHNlOworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3JlZ2lzdHJ5X2h1Yi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFR0lTVFJZX0hVQl9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Rlc3RfY2FzZV9yZWdpc3RyeV9pbXBsLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVTVF9DQVNFX1JFR0lTVFJZX0lNUExfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFJhbmRvbU51bWJlckdlbmVyYXRvciB7CisgICAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgcmVzdWx0X3R5cGU7CisKKyAgICAgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSggcmVzdWx0X3R5cGUgbiApIGNvbnN0IHsgcmV0dXJuIHN0ZDo6cmFuZCgpICUgbjsgfQorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX1NIVUZGTEUKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZSBtaW4oKSB7IHJldHVybiAwOyB9CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgbWF4KCkgeyByZXR1cm4gMTAwMDAwMDsgfQorICAgICAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKCkgY29uc3QgeyByZXR1cm4gc3RkOjpyYW5kKCkgJSBtYXgoKTsgfQorI2VuZGlmCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFY+CisgICAgICAgIHN0YXRpYyB2b2lkIHNodWZmbGUoIFYmIHZlY3RvciApIHsKKyAgICAgICAgICAgIFJhbmRvbU51bWJlckdlbmVyYXRvciBybmc7CisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX1NIVUZGTEUKKyAgICAgICAgICAgIHN0ZDo6c2h1ZmZsZSggdmVjdG9yLmJlZ2luKCksIHZlY3Rvci5lbmQoKSwgcm5nICk7CisjZWxzZQorICAgICAgICAgICAgc3RkOjpyYW5kb21fc2h1ZmZsZSggdmVjdG9yLmJlZ2luKCksIHZlY3Rvci5lbmQoKSwgcm5nICk7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH07CisKKyAgICBpbmxpbmUgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IHNvcnRUZXN0cyggSUNvbmZpZyBjb25zdCYgY29uZmlnLCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIHVuc29ydGVkVGVzdENhc2VzICkgeworCisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBzb3J0ZWQgPSB1bnNvcnRlZFRlc3RDYXNlczsKKworICAgICAgICBzd2l0Y2goIGNvbmZpZy5ydW5PcmRlcigpICkgeworICAgICAgICAgICAgY2FzZSBSdW5UZXN0czo6SW5MZXhpY29ncmFwaGljYWxPcmRlcjoKKyAgICAgICAgICAgICAgICBzdGQ6OnNvcnQoIHNvcnRlZC5iZWdpbigpLCBzb3J0ZWQuZW5kKCkgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUnVuVGVzdHM6OkluUmFuZG9tT3JkZXI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZWVkUm5nKCBjb25maWcgKTsKKyAgICAgICAgICAgICAgICAgICAgUmFuZG9tTnVtYmVyR2VuZXJhdG9yOjpzaHVmZmxlKCBzb3J0ZWQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJ1blRlc3RzOjpJbkRlY2xhcmF0aW9uT3JkZXI6CisgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBpbiBkZWNsYXJhdGlvbiBvcmRlcgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzb3J0ZWQ7CisgICAgfQorICAgIGJvb2wgbWF0Y2hUZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdENhc2UsIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYywgSUNvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICByZXR1cm4gdGVzdFNwZWMubWF0Y2hlcyggdGVzdENhc2UgKSAmJiAoIGNvbmZpZy5hbGxvd1Rocm93cygpIHx8ICF0ZXN0Q2FzZS50aHJvd3MoKSApOworICAgIH0KKworICAgIHZvaWQgZW5mb3JjZU5vRHVwbGljYXRlVGVzdENhc2VzKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGZ1bmN0aW9ucyApIHsKKyAgICAgICAgc3RkOjpzZXQ8VGVzdENhc2U+IHNlZW5GdW5jdGlvbnM7CisgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8VGVzdENhc2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZ1bmN0aW9ucy5iZWdpbigpLCBpdEVuZCA9IGZ1bmN0aW9ucy5lbmQoKTsKKyAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgIHN0ZDo6cGFpcjxzdGQ6OnNldDxUZXN0Q2FzZT46OmNvbnN0X2l0ZXJhdG9yLCBib29sPiBwcmV2ID0gc2VlbkZ1bmN0aW9ucy5pbnNlcnQoICppdCApOworICAgICAgICAgICAgaWYoICFwcmV2LnNlY29uZCApIHsKKyAgICAgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3M7CisKKyAgICAgICAgICAgICAgICBzcyAgPDwgQ29sb3VyKCBDb2xvdXI6OlJlZCApCisgICAgICAgICAgICAgICAgICAgIDw8ICJlcnJvcjogVEVTVF9DQVNFKCBcIiIgPDwgaXQtPm5hbWUgPDwgIlwiICkgYWxyZWFkeSBkZWZpbmVkLlxuIgorICAgICAgICAgICAgICAgICAgICA8PCAiXHRGaXJzdCBzZWVuIGF0ICIgPDwgcHJldi5maXJzdC0+Z2V0VGVzdENhc2VJbmZvKCkubGluZUluZm8gPDwgJ1xuJworICAgICAgICAgICAgICAgICAgICA8PCAiXHRSZWRlZmluZWQgYXQgIiA8PCBpdC0+Z2V0VGVzdENhc2VJbmZvKCkubGluZUluZm8gPDwgc3RkOjplbmRsOworCisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKHNzLnN0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBmaWx0ZXJUZXN0cyggc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiB0ZXN0Q2FzZXMsIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYywgSUNvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gZmlsdGVyZWQ7CisgICAgICAgIGZpbHRlcmVkLnJlc2VydmUoIHRlc3RDYXNlcy5zaXplKCkgKTsKKyAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdGVzdENhc2VzLmJlZ2luKCksIGl0RW5kID0gdGVzdENhc2VzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgaWYoIG1hdGNoVGVzdCggKml0LCB0ZXN0U3BlYywgY29uZmlnICkgKQorICAgICAgICAgICAgICAgIGZpbHRlcmVkLnB1c2hfYmFjayggKml0ICk7CisgICAgICAgIHJldHVybiBmaWx0ZXJlZDsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoIElDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgcmV0dXJuIGdldFJlZ2lzdHJ5SHViKCkuZ2V0VGVzdENhc2VSZWdpc3RyeSgpLmdldEFsbFRlc3RzU29ydGVkKCBjb25maWcgKTsKKyAgICB9CisKKyAgICBjbGFzcyBUZXN0UmVnaXN0cnkgOiBwdWJsaWMgSVRlc3RDYXNlUmVnaXN0cnkgeworICAgIHB1YmxpYzoKKyAgICAgICAgVGVzdFJlZ2lzdHJ5KCkKKyAgICAgICAgOiAgIG1fY3VycmVudFNvcnRPcmRlciggUnVuVGVzdHM6OkluRGVjbGFyYXRpb25PcmRlciApLAorICAgICAgICAgICAgbV91bm5hbWVkQ291bnQoIDAgKQorICAgICAgICB7fQorICAgICAgICB2aXJ0dWFsIH5UZXN0UmVnaXN0cnkoKTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdENhc2UgKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gdGVzdENhc2UuZ2V0VGVzdENhc2VJbmZvKCkubmFtZTsKKyAgICAgICAgICAgIGlmKCBuYW1lLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgICAgICBvc3MgPDwgIkFub255bW91cyB0ZXN0IGNhc2UgIiA8PCArK21fdW5uYW1lZENvdW50OworICAgICAgICAgICAgICAgIHJldHVybiByZWdpc3RlclRlc3QoIHRlc3RDYXNlLndpdGhOYW1lKCBvc3Muc3RyKCkgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9mdW5jdGlvbnMucHVzaF9iYWNrKCB0ZXN0Q2FzZSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFsbFRlc3RzKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fZnVuY3Rpb25zOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBnZXRBbGxUZXN0c1NvcnRlZCggSUNvbmZpZyBjb25zdCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgaWYoIG1fc29ydGVkRnVuY3Rpb25zLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIGVuZm9yY2VOb0R1cGxpY2F0ZVRlc3RDYXNlcyggbV9mdW5jdGlvbnMgKTsKKworICAgICAgICAgICAgaWYoICBtX2N1cnJlbnRTb3J0T3JkZXIgIT0gY29uZmlnLnJ1bk9yZGVyKCkgfHwgbV9zb3J0ZWRGdW5jdGlvbnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBtX3NvcnRlZEZ1bmN0aW9ucyA9IHNvcnRUZXN0cyggY29uZmlnLCBtX2Z1bmN0aW9ucyApOworICAgICAgICAgICAgICAgIG1fY3VycmVudFNvcnRPcmRlciA9IGNvbmZpZy5ydW5PcmRlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1fc29ydGVkRnVuY3Rpb25zOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gbV9mdW5jdGlvbnM7CisgICAgICAgIG11dGFibGUgUnVuVGVzdHM6OkluV2hhdE9yZGVyIG1fY3VycmVudFNvcnRPcmRlcjsKKyAgICAgICAgbXV0YWJsZSBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gbV9zb3J0ZWRGdW5jdGlvbnM7CisgICAgICAgIHNpemVfdCBtX3VubmFtZWRDb3VudDsKKyAgICAgICAgc3RkOjppb3NfYmFzZTo6SW5pdCBtX29zdHJlYW1Jbml0OyAvLyBGb3JjZXMgY291dC8gY2VyciB0byBiZSBpbml0aWFsaXNlZAorICAgIH07CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIGNsYXNzIEZyZWVGdW5jdGlvblRlc3RDYXNlIDogcHVibGljIFNoYXJlZEltcGw8SVRlc3RDYXNlPiB7CisgICAgcHVibGljOgorCisgICAgICAgIEZyZWVGdW5jdGlvblRlc3RDYXNlKCBUZXN0RnVuY3Rpb24gZnVuICkgOiBtX2Z1biggZnVuICkge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgaW52b2tlKCkgY29uc3QgeworICAgICAgICAgICAgbV9mdW4oKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdmlydHVhbCB+RnJlZUZ1bmN0aW9uVGVzdENhc2UoKTsKKworICAgICAgICBUZXN0RnVuY3Rpb24gbV9mdW47CisgICAgfTsKKworICAgIGlubGluZSBzdGQ6OnN0cmluZyBleHRyYWN0Q2xhc3NOYW1lKCBzdGQ6OnN0cmluZyBjb25zdCYgY2xhc3NPclF1YWxpZmllZE1ldGhvZE5hbWUgKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGNsYXNzTmFtZSA9IGNsYXNzT3JRdWFsaWZpZWRNZXRob2ROYW1lOworICAgICAgICBpZiggc3RhcnRzV2l0aCggY2xhc3NOYW1lLCAnJicgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IGxhc3RDb2xvbnMgPSBjbGFzc05hbWUucmZpbmQoICI6OiIgKTsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHBlbnVsdGltYXRlQ29sb25zID0gY2xhc3NOYW1lLnJmaW5kKCAiOjoiLCBsYXN0Q29sb25zLTEgKTsKKyAgICAgICAgICAgIGlmKCBwZW51bHRpbWF0ZUNvbG9ucyA9PSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgcGVudWx0aW1hdGVDb2xvbnMgPSAxOworICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0ciggcGVudWx0aW1hdGVDb2xvbnMsIGxhc3RDb2xvbnMtcGVudWx0aW1hdGVDb2xvbnMgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xhc3NOYW1lOworICAgIH0KKworICAgIHZvaWQgcmVnaXN0ZXJUZXN0Q2FzZQorICAgICAgICAoICAgSVRlc3RDYXNlKiB0ZXN0Q2FzZSwKKyAgICAgICAgICAgIGNoYXIgY29uc3QqIGNsYXNzT3JRdWFsaWZpZWRNZXRob2ROYW1lLAorICAgICAgICAgICAgTmFtZUFuZERlc2MgY29uc3QmIG5hbWVBbmREZXNjLAorICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgeworCisgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyVGVzdAorICAgICAgICAgICAgKCBtYWtlVGVzdENhc2UKKyAgICAgICAgICAgICAgICAoICAgdGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RDbGFzc05hbWUoIGNsYXNzT3JRdWFsaWZpZWRNZXRob2ROYW1lICksCisgICAgICAgICAgICAgICAgICAgIG5hbWVBbmREZXNjLm5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5hbWVBbmREZXNjLmRlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICBsaW5lSW5mbyApICk7CisgICAgfQorICAgIHZvaWQgcmVnaXN0ZXJUZXN0Q2FzZUZ1bmN0aW9uCisgICAgICAgICggICBUZXN0RnVuY3Rpb24gZnVuY3Rpb24sCisgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sCisgICAgICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MgKSB7CisgICAgICAgIHJlZ2lzdGVyVGVzdENhc2UoIG5ldyBGcmVlRnVuY3Rpb25UZXN0Q2FzZSggZnVuY3Rpb24gKSwgIiIsIG5hbWVBbmREZXNjLCBsaW5lSW5mbyApOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQXV0b1JlZzo6QXV0b1JlZworICAgICAgICAoICAgVGVzdEZ1bmN0aW9uIGZ1bmN0aW9uLAorICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICAgICAgTmFtZUFuZERlc2MgY29uc3QmIG5hbWVBbmREZXNjICkgeworICAgICAgICByZWdpc3RlclRlc3RDYXNlRnVuY3Rpb24oIGZ1bmN0aW9uLCBsaW5lSW5mbywgbmFtZUFuZERlc2MgKTsKKyAgICB9CisKKyAgICBBdXRvUmVnOjp+QXV0b1JlZygpIHt9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVwb3J0ZXJfcmVnaXN0cnkuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9SRUdJU1RSWV9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFJlcG9ydGVyUmVnaXN0cnkgOiBwdWJsaWMgSVJlcG9ydGVyUmVnaXN0cnkgeworCisgICAgcHVibGljOgorCisgICAgICAgIHZpcnR1YWwgflJlcG9ydGVyUmVnaXN0cnkoKSBDQVRDSF9PVkVSUklERSB7fQorCisgICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9ydGVyKiBjcmVhdGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBQdHI8SUNvbmZpZyBjb25zdD4gY29uc3QmIGNvbmZpZyApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIEZhY3RvcnlNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gIG1fZmFjdG9yaWVzLmZpbmQoIG5hbWUgKTsKKyAgICAgICAgICAgIGlmKCBpdCA9PSBtX2ZhY3Rvcmllcy5lbmQoKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIENBVENIX05VTEw7CisgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZC0+Y3JlYXRlKCBSZXBvcnRlckNvbmZpZyggY29uZmlnICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcmVnaXN0ZXJSZXBvcnRlciggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiBjb25zdCYgZmFjdG9yeSApIHsKKyAgICAgICAgICAgIG1fZmFjdG9yaWVzLmluc2VydCggc3RkOjptYWtlX3BhaXIoIG5hbWUsIGZhY3RvcnkgKSApOworICAgICAgICB9CisgICAgICAgIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lciggUHRyPElSZXBvcnRlckZhY3Rvcnk+IGNvbnN0JiBmYWN0b3J5ICkgeworICAgICAgICAgICAgbV9saXN0ZW5lcnMucHVzaF9iYWNrKCBmYWN0b3J5ICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIEZhY3RvcnlNYXAgY29uc3QmIGdldEZhY3RvcmllcygpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX2ZhY3RvcmllczsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIExpc3RlbmVycyBjb25zdCYgZ2V0TGlzdGVuZXJzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fbGlzdGVuZXJzOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBGYWN0b3J5TWFwIG1fZmFjdG9yaWVzOworICAgICAgICBMaXN0ZW5lcnMgbV9saXN0ZW5lcnM7CisgICAgfTsKK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2V4Y2VwdGlvbl90cmFuc2xhdG9yX3JlZ2lzdHJ5LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfRVhDRVBUSU9OX1RSQU5TTEFUT1JfUkVHSVNUUllfSFBQX0lOQ0xVREVECisKKyNpZmRlZiBfX09CSkNfXworI2ltcG9ydCAiRm91bmRhdGlvbi9Gb3VuZGF0aW9uLmgiCisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSA6IHB1YmxpYyBJRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIH5FeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkoKSB7CisgICAgICAgICAgICBkZWxldGVBbGwoIG1fdHJhbnNsYXRvcnMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRyYW5zbGF0b3IoIGNvbnN0IElFeGNlcHRpb25UcmFuc2xhdG9yKiB0cmFuc2xhdG9yICkgeworICAgICAgICAgICAgbV90cmFuc2xhdG9ycy5wdXNoX2JhY2soIHRyYW5zbGF0b3IgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgdHJhbnNsYXRlQWN0aXZlRXhjZXB0aW9uKCkgY29uc3QgeworICAgICAgICAgICAgdHJ5IHsKKyNpZmRlZiBfX09CSkNfXworICAgICAgICAgICAgICAgIC8vIEluIE9iamVjdGl2ZS1DIHRyeSBvYmplY3RpdmUtYyBleGNlcHRpb25zIGZpcnN0CisgICAgICAgICAgICAgICAgQHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnlUcmFuc2xhdG9ycygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBAY2F0Y2ggKE5TRXhjZXB0aW9uICpleGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENhdGNoOjp0b1N0cmluZyggW2V4Y2VwdGlvbiBkZXNjcmlwdGlvbl0gKTsKKyAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiB0cnlUcmFuc2xhdG9ycygpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggVGVzdEZhaWx1cmVFeGNlcHRpb24mICkgeworICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIHN0ZDo6ZXhjZXB0aW9uJiBleCApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXgud2hhdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIHN0ZDo6c3RyaW5nJiBtc2cgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCBjb25zdCBjaGFyKiBtc2cgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKC4uLikgeworICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biBleGNlcHRpb24iOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgdHJ5VHJhbnNsYXRvcnMoKSBjb25zdCB7CisgICAgICAgICAgICBpZiggbV90cmFuc2xhdG9ycy5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gbV90cmFuc2xhdG9yc1swXS0+dHJhbnNsYXRlKCBtX3RyYW5zbGF0b3JzLmJlZ2luKCkrMSwgbV90cmFuc2xhdG9ycy5lbmQoKSApOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBJRXhjZXB0aW9uVHJhbnNsYXRvcio+IG1fdHJhbnNsYXRvcnM7CisgICAgfTsKK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3RhZ19hbGlhc19yZWdpc3RyeS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9UQUdfQUxJQVNfUkVHSVNUUllfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGFnQWxpYXNSZWdpc3RyeSA6IHB1YmxpYyBJVGFnQWxpYXNSZWdpc3RyeSB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5UYWdBbGlhc1JlZ2lzdHJ5KCk7CisgICAgICAgIHZpcnR1YWwgT3B0aW9uPFRhZ0FsaWFzPiBmaW5kKCBzdGQ6OnN0cmluZyBjb25zdCYgYWxpYXMgKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBleHBhbmRBbGlhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgdW5leHBhbmRlZFRlc3RTcGVjICkgY29uc3Q7CisgICAgICAgIHZvaWQgYWRkKCBzdGQ6OnN0cmluZyBjb25zdCYgYWxpYXMsIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFRhZ0FsaWFzPiBtX3JlZ2lzdHJ5OworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgbmFtZXNwYWNlIHsKKworICAgICAgICBjbGFzcyBSZWdpc3RyeUh1YiA6IHB1YmxpYyBJUmVnaXN0cnlIdWIsIHB1YmxpYyBJTXV0YWJsZVJlZ2lzdHJ5SHViIHsKKworICAgICAgICAgICAgUmVnaXN0cnlIdWIoIFJlZ2lzdHJ5SHViIGNvbnN0JiApOworICAgICAgICAgICAgdm9pZCBvcGVyYXRvcj0oIFJlZ2lzdHJ5SHViIGNvbnN0JiApOworCisgICAgICAgIHB1YmxpYzogLy8gSVJlZ2lzdHJ5SHViCisgICAgICAgICAgICBSZWdpc3RyeUh1YigpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgSVJlcG9ydGVyUmVnaXN0cnkgY29uc3QmIGdldFJlcG9ydGVyUmVnaXN0cnkoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fcmVwb3J0ZXJSZWdpc3RyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgSVRlc3RDYXNlUmVnaXN0cnkgY29uc3QmIGdldFRlc3RDYXNlUmVnaXN0cnkoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fdGVzdENhc2VSZWdpc3RyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgSUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSYgZ2V0RXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5KCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2V4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QmIGdldFRhZ0FsaWFzUmVnaXN0cnkoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fdGFnQWxpYXNSZWdpc3RyeTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwdWJsaWM6IC8vIElNdXRhYmxlUmVnaXN0cnlIdWIKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclJlcG9ydGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgUHRyPElSZXBvcnRlckZhY3Rvcnk+IGNvbnN0JiBmYWN0b3J5ICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIG1fcmVwb3J0ZXJSZWdpc3RyeS5yZWdpc3RlclJlcG9ydGVyKCBuYW1lLCBmYWN0b3J5ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lciggUHRyPElSZXBvcnRlckZhY3Rvcnk+IGNvbnN0JiBmYWN0b3J5ICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIG1fcmVwb3J0ZXJSZWdpc3RyeS5yZWdpc3Rlckxpc3RlbmVyKCBmYWN0b3J5ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgbV90ZXN0Q2FzZVJlZ2lzdHJ5LnJlZ2lzdGVyVGVzdCggdGVzdEluZm8gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRyYW5zbGF0b3IoIGNvbnN0IElFeGNlcHRpb25UcmFuc2xhdG9yKiB0cmFuc2xhdG9yICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIG1fZXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5LnJlZ2lzdGVyVHJhbnNsYXRvciggdHJhbnNsYXRvciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVGFnQWxpYXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcywgc3RkOjpzdHJpbmcgY29uc3QmIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIG1fdGFnQWxpYXNSZWdpc3RyeS5hZGQoIGFsaWFzLCB0YWcsIGxpbmVJbmZvICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIFRlc3RSZWdpc3RyeSBtX3Rlc3RDYXNlUmVnaXN0cnk7CisgICAgICAgICAgICBSZXBvcnRlclJlZ2lzdHJ5IG1fcmVwb3J0ZXJSZWdpc3RyeTsKKyAgICAgICAgICAgIEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSBtX2V4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeTsKKyAgICAgICAgICAgIFRhZ0FsaWFzUmVnaXN0cnkgbV90YWdBbGlhc1JlZ2lzdHJ5OworICAgICAgICB9OworCisgICAgICAgIC8vIFNpbmdsZSwgZ2xvYmFsLCBpbnN0YW5jZQorICAgICAgICBpbmxpbmUgUmVnaXN0cnlIdWIqJiBnZXRUaGVSZWdpc3RyeUh1YigpIHsKKyAgICAgICAgICAgIHN0YXRpYyBSZWdpc3RyeUh1YiogdGhlUmVnaXN0cnlIdWIgPSBDQVRDSF9OVUxMOworICAgICAgICAgICAgaWYoICF0aGVSZWdpc3RyeUh1YiApCisgICAgICAgICAgICAgICAgdGhlUmVnaXN0cnlIdWIgPSBuZXcgUmVnaXN0cnlIdWIoKTsKKyAgICAgICAgICAgIHJldHVybiB0aGVSZWdpc3RyeUh1YjsKKyAgICAgICAgfQorICAgIH0KKworICAgIElSZWdpc3RyeUh1YiYgZ2V0UmVnaXN0cnlIdWIoKSB7CisgICAgICAgIHJldHVybiAqZ2V0VGhlUmVnaXN0cnlIdWIoKTsKKyAgICB9CisgICAgSU11dGFibGVSZWdpc3RyeUh1YiYgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkgeworICAgICAgICByZXR1cm4gKmdldFRoZVJlZ2lzdHJ5SHViKCk7CisgICAgfQorICAgIHZvaWQgY2xlYW5VcCgpIHsKKyAgICAgICAgZGVsZXRlIGdldFRoZVJlZ2lzdHJ5SHViKCk7CisgICAgICAgIGdldFRoZVJlZ2lzdHJ5SHViKCkgPSBDQVRDSF9OVUxMOworICAgICAgICBjbGVhblVwQ29udGV4dCgpOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB0cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKSB7CisgICAgICAgIHJldHVybiBnZXRSZWdpc3RyeUh1YigpLmdldEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSgpLnRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9ub3RpbXBsZW1lbnRlZF9leGNlcHRpb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9OT1RJTVBMRU1FTlRFRF9FWENFUFRJT05fSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzc3RyZWFtPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgTm90SW1wbGVtZW50ZWRFeGNlcHRpb246Ok5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKQorICAgIDogICBtX2xpbmVJbmZvKCBsaW5lSW5mbyApIHsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgb3NzIDw8IGxpbmVJbmZvIDw8ICI6IGZ1bmN0aW9uICI7CisgICAgICAgIG9zcyA8PCAibm90IGltcGxlbWVudGVkIjsKKyAgICAgICAgbV93aGF0ID0gb3NzLnN0cigpOworICAgIH0KKworICAgIGNvbnN0IGNoYXIqIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uOjp3aGF0KCkgY29uc3QgQ0FUQ0hfTk9FWENFUFQgeworICAgICAgICByZXR1cm4gbV93aGF0LmNfc3RyKCk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2NvbnRleHRfaW1wbC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTlRFWFRfSU1QTF9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3N0cmVhbS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1NUUkVBTV9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBXcml0ZXJGLCBzaXplX3QgYnVmZmVyU2l6ZT0yNTY+CisgICAgY2xhc3MgU3RyZWFtQnVmSW1wbCA6IHB1YmxpYyBTdHJlYW1CdWZCYXNlIHsKKyAgICAgICAgY2hhciBkYXRhW2J1ZmZlclNpemVdOworICAgICAgICBXcml0ZXJGIG1fd3JpdGVyOworCisgICAgcHVibGljOgorICAgICAgICBTdHJlYW1CdWZJbXBsKCkgeworICAgICAgICAgICAgc2V0cCggZGF0YSwgZGF0YSArIHNpemVvZihkYXRhKSApOworICAgICAgICB9CisKKyAgICAgICAgflN0cmVhbUJ1ZkltcGwoKSBDQVRDSF9OT0VYQ0VQVCB7CisgICAgICAgICAgICBzeW5jKCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGludCBvdmVyZmxvdyggaW50IGMgKSB7CisgICAgICAgICAgICBzeW5jKCk7CisKKyAgICAgICAgICAgIGlmKCBjICE9IEVPRiApIHsKKyAgICAgICAgICAgICAgICBpZiggcGJhc2UoKSA9PSBlcHB0cigpICkKKyAgICAgICAgICAgICAgICAgICAgbV93cml0ZXIoIHN0ZDo6c3RyaW5nKCAxLCBzdGF0aWNfY2FzdDxjaGFyPiggYyApICkgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNwdXRjKCBzdGF0aWNfY2FzdDxjaGFyPiggYyApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBzeW5jKCkgeworICAgICAgICAgICAgaWYoIHBiYXNlKCkgIT0gcHB0cigpICkgeworICAgICAgICAgICAgICAgIG1fd3JpdGVyKCBzdGQ6OnN0cmluZyggcGJhc2UoKSwgc3RhdGljX2Nhc3Q8c3RkOjpzdHJpbmc6OnNpemVfdHlwZT4oIHBwdHIoKSAtIHBiYXNlKCkgKSApICk7CisgICAgICAgICAgICAgICAgc2V0cCggcGJhc2UoKSwgZXBwdHIoKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBGaWxlU3RyZWFtOjpGaWxlU3RyZWFtKCBzdGQ6OnN0cmluZyBjb25zdCYgZmlsZW5hbWUgKSB7CisgICAgICAgIG1fb2ZzLm9wZW4oIGZpbGVuYW1lLmNfc3RyKCkgKTsKKyAgICAgICAgaWYoIG1fb2ZzLmZhaWwoKSApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgIlVuYWJsZSB0byBvcGVuIGZpbGU6ICciIDw8IGZpbGVuYW1lIDw8ICdcJyc7CisgICAgICAgICAgICB0aHJvdyBzdGQ6OmRvbWFpbl9lcnJvciggb3NzLnN0cigpICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6Om9zdHJlYW0mIEZpbGVTdHJlYW06OnN0cmVhbSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fb2ZzOworICAgIH0KKworICAgIHN0cnVjdCBPdXRwdXREZWJ1Z1dyaXRlciB7CisKKyAgICAgICAgdm9pZCBvcGVyYXRvcigpKCBzdGQ6OnN0cmluZyBjb25zdCZzdHIgKSB7CisgICAgICAgICAgICB3cml0ZVRvRGVidWdDb25zb2xlKCBzdHIgKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBEZWJ1Z091dFN0cmVhbTo6RGVidWdPdXRTdHJlYW0oKQorICAgIDogICBtX3N0cmVhbUJ1ZiggbmV3IFN0cmVhbUJ1ZkltcGw8T3V0cHV0RGVidWdXcml0ZXI+KCkgKSwKKyAgICAgICAgbV9vcyggbV9zdHJlYW1CdWYuZ2V0KCkgKQorICAgIHt9CisKKyAgICBzdGQ6Om9zdHJlYW0mIERlYnVnT3V0U3RyZWFtOjpzdHJlYW0oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX29zOworICAgIH0KKworICAgIC8vIFN0b3JlIHRoZSBzdHJlYW1idWYgZnJvbSBjb3V0IHVwLWZyb250IGJlY2F1c2UKKyAgICAvLyBjb3V0IG1heSBnZXQgcmVkaXJlY3RlZCB3aGVuIHJ1bm5pbmcgdGVzdHMKKyAgICBDb3V0U3RyZWFtOjpDb3V0U3RyZWFtKCkKKyAgICA6ICAgbV9vcyggQ2F0Y2g6OmNvdXQoKS5yZGJ1ZigpICkKKyAgICB7fQorCisgICAgc3RkOjpvc3RyZWFtJiBDb3V0U3RyZWFtOjpzdHJlYW0oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX29zOworICAgIH0KKworI2lmbmRlZiBDQVRDSF9DT05GSUdfTk9TVERPVVQgLy8gSWYgeW91ICNkZWZpbmUgdGhpcyB5b3UgbXVzdCBpbXBsZW1lbnQgdGhlc2UgZnVuY3Rpb25zCisgICAgc3RkOjpvc3RyZWFtJiBjb3V0KCkgeworICAgICAgICByZXR1cm4gc3RkOjpjb3V0OworICAgIH0KKyAgICBzdGQ6Om9zdHJlYW0mIGNlcnIoKSB7CisgICAgICAgIHJldHVybiBzdGQ6OmNlcnI7CisgICAgfQorI2VuZGlmCit9CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBDb250ZXh0IDogcHVibGljIElNdXRhYmxlQ29udGV4dCB7CisKKyAgICAgICAgQ29udGV4dCgpIDogbV9jb25maWcoIENBVENIX05VTEwgKSwgbV9ydW5uZXIoIENBVENIX05VTEwgKSwgbV9yZXN1bHRDYXB0dXJlKCBDQVRDSF9OVUxMICkge30KKyAgICAgICAgQ29udGV4dCggQ29udGV4dCBjb25zdCYgKTsKKyAgICAgICAgdm9pZCBvcGVyYXRvcj0oIENvbnRleHQgY29uc3QmICk7CisKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgfkNvbnRleHQoKSB7CisgICAgICAgICAgICBkZWxldGVBbGxWYWx1ZXMoIG1fZ2VuZXJhdG9yc0J5VGVzdE5hbWUgKTsKKyAgICAgICAgfQorCisgICAgcHVibGljOiAvLyBJQ29udGV4dAorICAgICAgICB2aXJ0dWFsIElSZXN1bHRDYXB0dXJlKiBnZXRSZXN1bHRDYXB0dXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1fcmVzdWx0Q2FwdHVyZTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIElSdW5uZXIqIGdldFJ1bm5lcigpIHsKKyAgICAgICAgICAgIHJldHVybiBtX3J1bm5lcjsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHNpemVfdCBnZXRHZW5lcmF0b3JJbmRleCggc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVJbmZvLCBzaXplX3QgdG90YWxTaXplICkgeworICAgICAgICAgICAgcmV0dXJuIGdldEdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpCisgICAgICAgICAgICAuZ2V0R2VuZXJhdG9ySW5mbyggZmlsZUluZm8sIHRvdGFsU2l6ZSApCisgICAgICAgICAgICAuZ2V0Q3VycmVudEluZGV4KCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBib29sIGFkdmFuY2VHZW5lcmF0b3JzRm9yQ3VycmVudFRlc3QoKSB7CisgICAgICAgICAgICBJR2VuZXJhdG9yc0ZvclRlc3QqIGdlbmVyYXRvcnMgPSBmaW5kR2VuZXJhdG9yc0ZvckN1cnJlbnRUZXN0KCk7CisgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdG9ycyAmJiBnZW5lcmF0b3JzLT5tb3ZlTmV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBQdHI8SUNvbmZpZyBjb25zdD4gZ2V0Q29uZmlnKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY29uZmlnOworICAgICAgICB9CisKKyAgICBwdWJsaWM6IC8vIElNdXRhYmxlQ29udGV4dAorICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UmVzdWx0Q2FwdHVyZSggSVJlc3VsdENhcHR1cmUqIHJlc3VsdENhcHR1cmUgKSB7CisgICAgICAgICAgICBtX3Jlc3VsdENhcHR1cmUgPSByZXN1bHRDYXB0dXJlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRSdW5uZXIoIElSdW5uZXIqIHJ1bm5lciApIHsKKyAgICAgICAgICAgIG1fcnVubmVyID0gcnVubmVyOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRDb25maWcoIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgY29uZmlnICkgeworICAgICAgICAgICAgbV9jb25maWcgPSBjb25maWc7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgSU11dGFibGVDb250ZXh0JiBnZXRDdXJyZW50TXV0YWJsZUNvbnRleHQoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIElHZW5lcmF0b3JzRm9yVGVzdCogZmluZEdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRlc3ROYW1lID0gZ2V0UmVzdWx0Q2FwdHVyZSgpLT5nZXRDdXJyZW50VGVzdE5hbWUoKTsKKworICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIElHZW5lcmF0b3JzRm9yVGVzdCo+Ojpjb25zdF9pdGVyYXRvciBpdCA9CisgICAgICAgICAgICAgICAgbV9nZW5lcmF0b3JzQnlUZXN0TmFtZS5maW5kKCB0ZXN0TmFtZSApOworICAgICAgICAgICAgcmV0dXJuIGl0ICE9IG1fZ2VuZXJhdG9yc0J5VGVzdE5hbWUuZW5kKCkKKyAgICAgICAgICAgICAgICA/IGl0LT5zZWNvbmQKKyAgICAgICAgICAgICAgICA6IENBVENIX05VTEw7CisgICAgICAgIH0KKworICAgICAgICBJR2VuZXJhdG9yc0ZvclRlc3QmIGdldEdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpIHsKKyAgICAgICAgICAgIElHZW5lcmF0b3JzRm9yVGVzdCogZ2VuZXJhdG9ycyA9IGZpbmRHZW5lcmF0b3JzRm9yQ3VycmVudFRlc3QoKTsKKyAgICAgICAgICAgIGlmKCAhZ2VuZXJhdG9ycyApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB0ZXN0TmFtZSA9IGdldFJlc3VsdENhcHR1cmUoKS0+Z2V0Q3VycmVudFRlc3ROYW1lKCk7CisgICAgICAgICAgICAgICAgZ2VuZXJhdG9ycyA9IGNyZWF0ZUdlbmVyYXRvcnNGb3JUZXN0KCk7CisgICAgICAgICAgICAgICAgbV9nZW5lcmF0b3JzQnlUZXN0TmFtZS5pbnNlcnQoIHN0ZDo6bWFrZV9wYWlyKCB0ZXN0TmFtZSwgZ2VuZXJhdG9ycyApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKmdlbmVyYXRvcnM7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBtX2NvbmZpZzsKKyAgICAgICAgSVJ1bm5lciogbV9ydW5uZXI7CisgICAgICAgIElSZXN1bHRDYXB0dXJlKiBtX3Jlc3VsdENhcHR1cmU7CisgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBJR2VuZXJhdG9yc0ZvclRlc3QqPiBtX2dlbmVyYXRvcnNCeVRlc3ROYW1lOworICAgIH07CisKKyAgICBuYW1lc3BhY2UgeworICAgICAgICBDb250ZXh0KiBjdXJyZW50Q29udGV4dCA9IENBVENIX05VTEw7CisgICAgfQorICAgIElNdXRhYmxlQ29udGV4dCYgZ2V0Q3VycmVudE11dGFibGVDb250ZXh0KCkgeworICAgICAgICBpZiggIWN1cnJlbnRDb250ZXh0ICkKKyAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gbmV3IENvbnRleHQoKTsKKyAgICAgICAgcmV0dXJuICpjdXJyZW50Q29udGV4dDsKKyAgICB9CisgICAgSUNvbnRleHQmIGdldEN1cnJlbnRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gZ2V0Q3VycmVudE11dGFibGVDb250ZXh0KCk7CisgICAgfQorCisgICAgdm9pZCBjbGVhblVwQ29udGV4dCgpIHsKKyAgICAgICAgZGVsZXRlIGN1cnJlbnRDb250ZXh0OworICAgICAgICBjdXJyZW50Q29udGV4dCA9IENBVENIX05VTEw7CisgICAgfQorfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29uc29sZV9jb2xvdXJfaW1wbC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTlNPTEVfQ09MT1VSX0lNUExfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9lcnJub19ndWFyZC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0VSUk5PX0dVQVJEX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y2Vycm5vPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgRXJybm9HdWFyZCB7CisgICAgcHVibGljOgorICAgICAgICBFcnJub0d1YXJkKCk6bV9vbGRFcnJubyhlcnJubyl7fQorICAgICAgICB+RXJybm9HdWFyZCgpIHsgZXJybm8gPSBtX29sZEVycm5vOyB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgaW50IG1fb2xkRXJybm87CisgICAgfTsKKworfQorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIG5hbWVzcGFjZSB7CisKKyAgICAgICAgc3RydWN0IElDb2xvdXJJbXBsIHsKKyAgICAgICAgICAgIHZpcnR1YWwgfklDb2xvdXJJbXBsKCkge30KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCB1c2UoIENvbG91cjo6Q29kZSBfY29sb3VyQ29kZSApID0gMDsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgTm9Db2xvdXJJbXBsIDogSUNvbG91ckltcGwgeworICAgICAgICAgICAgdm9pZCB1c2UoIENvbG91cjo6Q29kZSApIHt9CisKKyAgICAgICAgICAgIHN0YXRpYyBJQ29sb3VySW1wbCogaW5zdGFuY2UoKSB7CisgICAgICAgICAgICAgICAgc3RhdGljIE5vQ29sb3VySW1wbCBzX2luc3RhbmNlOworICAgICAgICAgICAgICAgIHJldHVybiAmc19pbnN0YW5jZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIH0gLy8gYW5vbiBuYW1lc3BhY2UKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyNpZiAhZGVmaW5lZCggQ0FUQ0hfQ09ORklHX0NPTE9VUl9OT05FICkgJiYgIWRlZmluZWQoIENBVENIX0NPTkZJR19DT0xPVVJfV0lORE9XUyApICYmICFkZWZpbmVkKCBDQVRDSF9DT05GSUdfQ09MT1VSX0FOU0kgKQorIyAgIGlmZGVmIENBVENIX1BMQVRGT1JNX1dJTkRPV1MKKyMgICAgICAgZGVmaW5lIENBVENIX0NPTkZJR19DT0xPVVJfV0lORE9XUworIyAgIGVsc2UKKyMgICAgICAgZGVmaW5lIENBVENIX0NPTkZJR19DT0xPVVJfQU5TSQorIyAgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKCBDQVRDSF9DT05GSUdfQ09MT1VSX1dJTkRPV1MgKSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIHsKKworICAgIGNsYXNzIFdpbjMyQ29sb3VySW1wbCA6IHB1YmxpYyBJQ29sb3VySW1wbCB7CisgICAgcHVibGljOgorICAgICAgICBXaW4zMkNvbG91ckltcGwoKSA6IHN0ZG91dEhhbmRsZSggR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENPTlNPTEVfU0NSRUVOX0JVRkZFUl9JTkZPIGNzYmlJbmZvOworICAgICAgICAgICAgR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oIHN0ZG91dEhhbmRsZSwgJmNzYmlJbmZvICk7CisgICAgICAgICAgICBvcmlnaW5hbEZvcmVncm91bmRBdHRyaWJ1dGVzID0gY3NiaUluZm8ud0F0dHJpYnV0ZXMgJiB+KCBCQUNLR1JPVU5EX0dSRUVOIHwgQkFDS0dST1VORF9SRUQgfCBCQUNLR1JPVU5EX0JMVUUgfCBCQUNLR1JPVU5EX0lOVEVOU0lUWSApOworICAgICAgICAgICAgb3JpZ2luYWxCYWNrZ3JvdW5kQXR0cmlidXRlcyA9IGNzYmlJbmZvLndBdHRyaWJ1dGVzICYgfiggRk9SRUdST1VORF9HUkVFTiB8IEZPUkVHUk9VTkRfUkVEIHwgRk9SRUdST1VORF9CTFVFIHwgRk9SRUdST1VORF9JTlRFTlNJVFkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB1c2UoIENvbG91cjo6Q29kZSBfY29sb3VyQ29kZSApIHsKKyAgICAgICAgICAgIHN3aXRjaCggX2NvbG91ckNvZGUgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6Ok5vbmU6ICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIG9yaWdpbmFsRm9yZWdyb3VuZEF0dHJpYnV0ZXMgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6V2hpdGU6ICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9HUkVFTiB8IEZPUkVHUk9VTkRfUkVEIHwgRk9SRUdST1VORF9CTFVFICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OlJlZDogICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfUkVEICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkdyZWVuOiAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfR1JFRU4gKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6Qmx1ZTogICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9CTFVFICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkN5YW46ICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfQkxVRSB8IEZPUkVHUk9VTkRfR1JFRU4gKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6WWVsbG93OiAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9SRUQgfCBGT1JFR1JPVU5EX0dSRUVOICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkdyZXk6ICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIDAgKTsKKworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpMaWdodEdyZXk6ICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9JTlRFTlNJVFkgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0UmVkOiAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfSU5URU5TSVRZIHwgRk9SRUdST1VORF9SRUQgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0R3JlZW46ICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfSU5URU5TSVRZIHwgRk9SRUdST1VORF9HUkVFTiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmlnaHRXaGl0ZTogICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9JTlRFTlNJVFkgfCBGT1JFR1JPVU5EX0dSRUVOIHwgRk9SRUdST1VORF9SRUQgfCBGT1JFR1JPVU5EX0JMVUUgKTsKKworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmlnaHQ6IHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJub3QgYSBjb2xvdXIiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgc2V0VGV4dEF0dHJpYnV0ZSggV09SRCBfdGV4dEF0dHJpYnV0ZSApIHsKKyAgICAgICAgICAgIFNldENvbnNvbGVUZXh0QXR0cmlidXRlKCBzdGRvdXRIYW5kbGUsIF90ZXh0QXR0cmlidXRlIHwgb3JpZ2luYWxCYWNrZ3JvdW5kQXR0cmlidXRlcyApOworICAgICAgICB9CisgICAgICAgIEhBTkRMRSBzdGRvdXRIYW5kbGU7CisgICAgICAgIFdPUkQgb3JpZ2luYWxGb3JlZ3JvdW5kQXR0cmlidXRlczsKKyAgICAgICAgV09SRCBvcmlnaW5hbEJhY2tncm91bmRBdHRyaWJ1dGVzOworICAgIH07CisKKyAgICBJQ29sb3VySW1wbCogcGxhdGZvcm1Db2xvdXJJbnN0YW5jZSgpIHsKKyAgICAgICAgc3RhdGljIFdpbjMyQ29sb3VySW1wbCBzX2luc3RhbmNlOworCisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25maWcgPSBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZpZygpOworICAgICAgICBVc2VDb2xvdXI6Olllc09yTm8gY29sb3VyTW9kZSA9IGNvbmZpZworICAgICAgICAgICAgPyBjb25maWctPnVzZUNvbG91cigpCisgICAgICAgICAgICA6IFVzZUNvbG91cjo6QXV0bzsKKyAgICAgICAgaWYoIGNvbG91ck1vZGUgPT0gVXNlQ29sb3VyOjpBdXRvICkKKyAgICAgICAgICAgIGNvbG91ck1vZGUgPSAhaXNEZWJ1Z2dlckFjdGl2ZSgpCisgICAgICAgICAgICAgICAgPyBVc2VDb2xvdXI6OlllcworICAgICAgICAgICAgICAgIDogVXNlQ29sb3VyOjpObzsKKyAgICAgICAgcmV0dXJuIGNvbG91ck1vZGUgPT0gVXNlQ29sb3VyOjpZZXMKKyAgICAgICAgICAgID8gJnNfaW5zdGFuY2UKKyAgICAgICAgICAgIDogTm9Db2xvdXJJbXBsOjppbnN0YW5jZSgpOworICAgIH0KKworfSAvLyBlbmQgYW5vbiBuYW1lc3BhY2UKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjZWxpZiBkZWZpbmVkKCBDQVRDSF9DT05GSUdfQ09MT1VSX0FOU0kgKSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgeworCisgICAgLy8gdXNlIFBPU0lYLyBBTlNJIGNvbnNvbGUgdGVybWluYWwgY29kZXMKKyAgICAvLyBUaGFua3MgdG8gQWRhbSBTdHJ6ZWxlY2tpIGZvciBvcmlnaW5hbCBjb250cmlidXRpb24KKyAgICAvLyAoaHR0cDovL2dpdGh1Yi5jb20vbmFub2FudCkKKyAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcGhpbHNxdWFyZWQvQ2F0Y2gvcHVsbC8xMzEKKyAgICBjbGFzcyBQb3NpeENvbG91ckltcGwgOiBwdWJsaWMgSUNvbG91ckltcGwgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB2b2lkIHVzZSggQ29sb3VyOjpDb2RlIF9jb2xvdXJDb2RlICkgeworICAgICAgICAgICAgc3dpdGNoKCBfY29sb3VyQ29kZSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6Tm9uZToKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6V2hpdGU6ICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzBtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpSZWQ6ICAgICAgIHJldHVybiBzZXRDb2xvdXIoICJbMDszMW0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkdyZWVuOiAgICAgcmV0dXJuIHNldENvbG91ciggIlswOzMybSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6Qmx1ZTogICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzA7MzRtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpDeWFuOiAgICAgIHJldHVybiBzZXRDb2xvdXIoICJbMDszNm0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OlllbGxvdzogICAgcmV0dXJuIHNldENvbG91ciggIlswOzMzbSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6R3JleTogICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzE7MzBtIiApOworCisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkxpZ2h0R3JleTogICAgIHJldHVybiBzZXRDb2xvdXIoICJbMDszN20iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodFJlZDogICAgIHJldHVybiBzZXRDb2xvdXIoICJbMTszMW0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodEdyZWVuOiAgIHJldHVybiBzZXRDb2xvdXIoICJbMTszMm0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodFdoaXRlOiAgIHJldHVybiBzZXRDb2xvdXIoICJbMTszN20iICk7CisKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0OiB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAibm90IGEgY29sb3VyIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0YXRpYyBJQ29sb3VySW1wbCogaW5zdGFuY2UoKSB7CisgICAgICAgICAgICBzdGF0aWMgUG9zaXhDb2xvdXJJbXBsIHNfaW5zdGFuY2U7CisgICAgICAgICAgICByZXR1cm4gJnNfaW5zdGFuY2U7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgc2V0Q29sb3VyKCBjb25zdCBjaGFyKiBfZXNjYXBlQ29kZSApIHsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgJ1wwMzMnIDw8IF9lc2NhcGVDb2RlOworICAgICAgICB9CisgICAgfTsKKworICAgIElDb2xvdXJJbXBsKiBwbGF0Zm9ybUNvbG91ckluc3RhbmNlKCkgeworICAgICAgICBFcnJub0d1YXJkIGd1YXJkOworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gY29uZmlnID0gZ2V0Q3VycmVudENvbnRleHQoKS5nZXRDb25maWcoKTsKKyAgICAgICAgVXNlQ29sb3VyOjpZZXNPck5vIGNvbG91ck1vZGUgPSBjb25maWcKKyAgICAgICAgICAgID8gY29uZmlnLT51c2VDb2xvdXIoKQorICAgICAgICAgICAgOiBVc2VDb2xvdXI6OkF1dG87CisgICAgICAgIGlmKCBjb2xvdXJNb2RlID09IFVzZUNvbG91cjo6QXV0byApCisgICAgICAgICAgICBjb2xvdXJNb2RlID0gKCFpc0RlYnVnZ2VyQWN0aXZlKCkgJiYgaXNhdHR5KFNURE9VVF9GSUxFTk8pICkKKyAgICAgICAgICAgICAgICA/IFVzZUNvbG91cjo6WWVzCisgICAgICAgICAgICAgICAgOiBVc2VDb2xvdXI6Ok5vOworICAgICAgICByZXR1cm4gY29sb3VyTW9kZSA9PSBVc2VDb2xvdXI6OlllcworICAgICAgICAgICAgPyBQb3NpeENvbG91ckltcGw6Omluc3RhbmNlKCkKKyAgICAgICAgICAgIDogTm9Db2xvdXJJbXBsOjppbnN0YW5jZSgpOworICAgIH0KKworfSAvLyBlbmQgYW5vbiBuYW1lc3BhY2UKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjZWxzZSAgLy8gbm90IFdpbmRvd3Mgb3IgQU5TSSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RhdGljIElDb2xvdXJJbXBsKiBwbGF0Zm9ybUNvbG91ckluc3RhbmNlKCkgeyByZXR1cm4gTm9Db2xvdXJJbXBsOjppbnN0YW5jZSgpOyB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjZW5kaWYgLy8gV2luZG93cy8gQU5TSS8gTm9uZQorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgQ29sb3VyOjpDb2xvdXIoIENvZGUgX2NvbG91ckNvZGUgKSA6IG1fbW92ZWQoIGZhbHNlICkgeyB1c2UoIF9jb2xvdXJDb2RlICk7IH0KKyAgICBDb2xvdXI6OkNvbG91ciggQ29sb3VyIGNvbnN0JiBfb3RoZXIgKSA6IG1fbW92ZWQoIGZhbHNlICkgeyBjb25zdF9jYXN0PENvbG91ciY+KCBfb3RoZXIgKS5tX21vdmVkID0gdHJ1ZTsgfQorICAgIENvbG91cjo6fkNvbG91cigpeyBpZiggIW1fbW92ZWQgKSB1c2UoIE5vbmUgKTsgfQorCisgICAgdm9pZCBDb2xvdXI6OnVzZSggQ29kZSBfY29sb3VyQ29kZSApIHsKKyAgICAgICAgc3RhdGljIElDb2xvdXJJbXBsKiBpbXBsID0gcGxhdGZvcm1Db2xvdXJJbnN0YW5jZSgpOworICAgICAgICBpbXBsLT51c2UoIF9jb2xvdXJDb2RlICk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2dlbmVyYXRvcnNfaW1wbC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0dFTkVSQVRPUlNfSU1QTF9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IEdlbmVyYXRvckluZm8gOiBJR2VuZXJhdG9ySW5mbyB7CisKKyAgICAgICAgR2VuZXJhdG9ySW5mbyggc3RkOjpzaXplX3Qgc2l6ZSApCisgICAgICAgIDogICBtX3NpemUoIHNpemUgKSwKKyAgICAgICAgICAgIG1fY3VycmVudEluZGV4KCAwICkKKyAgICAgICAge30KKworICAgICAgICBib29sIG1vdmVOZXh0KCkgeworICAgICAgICAgICAgaWYoICsrbV9jdXJyZW50SW5kZXggPT0gbV9zaXplICkgeworICAgICAgICAgICAgICAgIG1fY3VycmVudEluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c2l6ZV90IGdldEN1cnJlbnRJbmRleCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2N1cnJlbnRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c2l6ZV90IG1fc2l6ZTsKKyAgICAgICAgc3RkOjpzaXplX3QgbV9jdXJyZW50SW5kZXg7CisgICAgfTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgY2xhc3MgR2VuZXJhdG9yc0ZvclRlc3QgOiBwdWJsaWMgSUdlbmVyYXRvcnNGb3JUZXN0IHsKKworICAgIHB1YmxpYzoKKyAgICAgICAgfkdlbmVyYXRvcnNGb3JUZXN0KCkgeworICAgICAgICAgICAgZGVsZXRlQWxsKCBtX2dlbmVyYXRvcnNJbk9yZGVyICk7CisgICAgICAgIH0KKworICAgICAgICBJR2VuZXJhdG9ySW5mbyYgZ2V0R2VuZXJhdG9ySW5mbyggc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVJbmZvLCBzdGQ6OnNpemVfdCBzaXplICkgeworICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIElHZW5lcmF0b3JJbmZvKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9nZW5lcmF0b3JzQnlOYW1lLmZpbmQoIGZpbGVJbmZvICk7CisgICAgICAgICAgICBpZiggaXQgPT0gbV9nZW5lcmF0b3JzQnlOYW1lLmVuZCgpICkgeworICAgICAgICAgICAgICAgIElHZW5lcmF0b3JJbmZvKiBpbmZvID0gbmV3IEdlbmVyYXRvckluZm8oIHNpemUgKTsKKyAgICAgICAgICAgICAgICBtX2dlbmVyYXRvcnNCeU5hbWUuaW5zZXJ0KCBzdGQ6Om1ha2VfcGFpciggZmlsZUluZm8sIGluZm8gKSApOworICAgICAgICAgICAgICAgIG1fZ2VuZXJhdG9yc0luT3JkZXIucHVzaF9iYWNrKCBpbmZvICk7CisgICAgICAgICAgICAgICAgcmV0dXJuICppbmZvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICppdC0+c2Vjb25kOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBtb3ZlTmV4dCgpIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPElHZW5lcmF0b3JJbmZvKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9nZW5lcmF0b3JzSW5PcmRlci5iZWdpbigpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8SUdlbmVyYXRvckluZm8qPjo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBtX2dlbmVyYXRvcnNJbk9yZGVyLmVuZCgpOworICAgICAgICAgICAgZm9yKDsgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgaWYoICgqaXQpLT5tb3ZlTmV4dCgpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBJR2VuZXJhdG9ySW5mbyo+IG1fZ2VuZXJhdG9yc0J5TmFtZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8SUdlbmVyYXRvckluZm8qPiBtX2dlbmVyYXRvcnNJbk9yZGVyOworICAgIH07CisKKyAgICBJR2VuZXJhdG9yc0ZvclRlc3QqIGNyZWF0ZUdlbmVyYXRvcnNGb3JUZXN0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgR2VuZXJhdG9yc0ZvclRlc3QoKTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfYXNzZXJ0aW9ucmVzdWx0LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQVNTRVJUSU9OUkVTVUxUX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgQXNzZXJ0aW9uSW5mbzo6QXNzZXJ0aW9uSW5mbyggICBzdGQ6OnN0cmluZyBjb25zdCYgX21hY3JvTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2NhcHR1cmVkRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyBfcmVzdWx0RGlzcG9zaXRpb24gKQorICAgIDogICBtYWNyb05hbWUoIF9tYWNyb05hbWUgKSwKKyAgICAgICAgbGluZUluZm8oIF9saW5lSW5mbyApLAorICAgICAgICBjYXB0dXJlZEV4cHJlc3Npb24oIF9jYXB0dXJlZEV4cHJlc3Npb24gKSwKKyAgICAgICAgcmVzdWx0RGlzcG9zaXRpb24oIF9yZXN1bHREaXNwb3NpdGlvbiApCisgICAge30KKworICAgIEFzc2VydGlvblJlc3VsdDo6QXNzZXJ0aW9uUmVzdWx0KCkge30KKworICAgIEFzc2VydGlvblJlc3VsdDo6QXNzZXJ0aW9uUmVzdWx0KCBBc3NlcnRpb25JbmZvIGNvbnN0JiBpbmZvLCBBc3NlcnRpb25SZXN1bHREYXRhIGNvbnN0JiBkYXRhICkKKyAgICA6ICAgbV9pbmZvKCBpbmZvICksCisgICAgICAgIG1fcmVzdWx0RGF0YSggZGF0YSApCisgICAge30KKworICAgIEFzc2VydGlvblJlc3VsdDo6fkFzc2VydGlvblJlc3VsdCgpIHt9CisKKyAgICAvLyBSZXN1bHQgd2FzIGEgc3VjY2VzcworICAgIGJvb2wgQXNzZXJ0aW9uUmVzdWx0OjpzdWNjZWVkZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDYXRjaDo6aXNPayggbV9yZXN1bHREYXRhLnJlc3VsdFR5cGUgKTsKKyAgICB9CisKKyAgICAvLyBSZXN1bHQgd2FzIGEgc3VjY2Vzcywgb3IgZmFpbHVyZSBpcyBzdXBwcmVzc2VkCisgICAgYm9vbCBBc3NlcnRpb25SZXN1bHQ6OmlzT2soKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDYXRjaDo6aXNPayggbV9yZXN1bHREYXRhLnJlc3VsdFR5cGUgKSB8fCBzaG91bGRTdXBwcmVzc0ZhaWx1cmUoIG1faW5mby5yZXN1bHREaXNwb3NpdGlvbiApOworICAgIH0KKworICAgIFJlc3VsdFdhczo6T2ZUeXBlIEFzc2VydGlvblJlc3VsdDo6Z2V0UmVzdWx0VHlwZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fcmVzdWx0RGF0YS5yZXN1bHRUeXBlOworICAgIH0KKworICAgIGJvb2wgQXNzZXJ0aW9uUmVzdWx0OjpoYXNFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICByZXR1cm4gIW1faW5mby5jYXB0dXJlZEV4cHJlc3Npb24uZW1wdHkoKTsKKyAgICB9CisKKyAgICBib29sIEFzc2VydGlvblJlc3VsdDo6aGFzTWVzc2FnZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFtX3Jlc3VsdERhdGEubWVzc2FnZS5lbXB0eSgpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIEFzc2VydGlvblJlc3VsdDo6Z2V0RXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgaWYoIGlzRmFsc2VUZXN0KCBtX2luZm8ucmVzdWx0RGlzcG9zaXRpb24gKSApCisgICAgICAgICAgICByZXR1cm4gJyEnICsgbV9pbmZvLmNhcHR1cmVkRXhwcmVzc2lvbjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG1faW5mby5jYXB0dXJlZEV4cHJlc3Npb247CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIEFzc2VydGlvblJlc3VsdDo6Z2V0RXhwcmVzc2lvbkluTWFjcm8oKSBjb25zdCB7CisgICAgICAgIGlmKCBtX2luZm8ubWFjcm9OYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgcmV0dXJuIG1faW5mby5jYXB0dXJlZEV4cHJlc3Npb247CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBtX2luZm8ubWFjcm9OYW1lICsgIiggIiArIG1faW5mby5jYXB0dXJlZEV4cHJlc3Npb24gKyAiICkiOworICAgIH0KKworICAgIGJvb2wgQXNzZXJ0aW9uUmVzdWx0OjpoYXNFeHBhbmRlZEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBoYXNFeHByZXNzaW9uKCkgJiYgZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCkgIT0gZ2V0RXhwcmVzc2lvbigpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIEFzc2VydGlvblJlc3VsdDo6Z2V0RXhwYW5kZWRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9yZXN1bHREYXRhLnJlY29uc3RydWN0RXhwcmVzc2lvbigpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIEFzc2VydGlvblJlc3VsdDo6Z2V0TWVzc2FnZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fcmVzdWx0RGF0YS5tZXNzYWdlOworICAgIH0KKyAgICBTb3VyY2VMaW5lSW5mbyBBc3NlcnRpb25SZXN1bHQ6OmdldFNvdXJjZUluZm8oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2luZm8ubGluZUluZm87CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgQXNzZXJ0aW9uUmVzdWx0OjpnZXRUZXN0TWFjcm9OYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9pbmZvLm1hY3JvTmFtZTsKKyAgICB9CisKKyAgICB2b2lkIEFzc2VydGlvblJlc3VsdDo6ZGlzY2FyZERlY29tcG9zZWRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICBtX3Jlc3VsdERhdGEuZGVjb21wb3NlZEV4cHJlc3Npb24gPSBDQVRDSF9OVUxMOworICAgIH0KKworICAgIHZvaWQgQXNzZXJ0aW9uUmVzdWx0OjpleHBhbmREZWNvbXBvc2VkRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgbV9yZXN1bHREYXRhLnJlY29uc3RydWN0RXhwcmVzc2lvbigpOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90ZXN0X2Nhc2VfaW5mby5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfQ0FTRV9JTkZPX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y2N0eXBlPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgaW5saW5lIFRlc3RDYXNlSW5mbzo6U3BlY2lhbFByb3BlcnRpZXMgcGFyc2VTcGVjaWFsVGFnKCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnICkgeworICAgICAgICBpZiggc3RhcnRzV2l0aCggdGFnLCAnLicgKSB8fAorICAgICAgICAgICAgdGFnID09ICJoaWRlIiB8fAorICAgICAgICAgICAgdGFnID09ICIhaGlkZSIgKQorICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNlSW5mbzo6SXNIaWRkZW47CisgICAgICAgIGVsc2UgaWYoIHRhZyA9PSAiIXRocm93cyIgKQorICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNlSW5mbzo6VGhyb3dzOworICAgICAgICBlbHNlIGlmKCB0YWcgPT0gIiFzaG91bGRmYWlsIiApCisgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VJbmZvOjpTaG91bGRGYWlsOworICAgICAgICBlbHNlIGlmKCB0YWcgPT0gIiFtYXlmYWlsIiApCisgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VJbmZvOjpNYXlGYWlsOworICAgICAgICBlbHNlIGlmKCB0YWcgPT0gIiFub25wb3J0YWJsZSIgKQorICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNlSW5mbzo6Tm9uUG9ydGFibGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBUZXN0Q2FzZUluZm86Ok5vbmU7CisgICAgfQorICAgIGlubGluZSBib29sIGlzUmVzZXJ2ZWRUYWcoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcgKSB7CisgICAgICAgIHJldHVybiBwYXJzZVNwZWNpYWxUYWcoIHRhZyApID09IFRlc3RDYXNlSW5mbzo6Tm9uZSAmJiB0YWcuc2l6ZSgpID4gMCAmJiAhc3RkOjppc2FsbnVtKCB0YWdbMF0gKTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgZW5mb3JjZU5vdFJlc2VydmVkVGFnKCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvICkgeworICAgICAgICBpZiggaXNSZXNlcnZlZFRhZyggdGFnICkgKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICBzcyA8PCBDb2xvdXIoQ29sb3VyOjpSZWQpCisgICAgICAgICAgICAgICA8PCAiVGFnIG5hbWUgWyIgPDwgdGFnIDw8ICJdIG5vdCBhbGxvd2VkLlxuIgorICAgICAgICAgICAgICAgPDwgIlRhZyBuYW1lcyBzdGFydGluZyB3aXRoIG5vbiBhbHBoYS1udW1lcmljIGNoYXJhY3RlcnMgYXJlIHJlc2VydmVkXG4iCisgICAgICAgICAgICAgICA8PCBDb2xvdXIoQ29sb3VyOjpGaWxlTmFtZSkKKyAgICAgICAgICAgICAgIDw8IF9saW5lSW5mbyA8PCAnXG4nOworICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKHNzLnN0cigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFRlc3RDYXNlIG1ha2VUZXN0Q2FzZSggIElUZXN0Q2FzZSogX3Rlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2Rlc2NPclRhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbyApCisgICAgeworICAgICAgICBib29sIGlzSGlkZGVuKCBzdGFydHNXaXRoKCBfbmFtZSwgIi4vIiApICk7IC8vIExlZ2FjeSBzdXBwb3J0CisKKyAgICAgICAgLy8gUGFyc2Ugb3V0IHRhZ3MKKyAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHRhZ3M7CisgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2MsIHRhZzsKKyAgICAgICAgYm9vbCBpblRhZyA9IGZhbHNlOworICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgX2Rlc2NPclRhZ3Muc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBfZGVzY09yVGFnc1tpXTsKKyAgICAgICAgICAgIGlmKCAhaW5UYWcgKSB7CisgICAgICAgICAgICAgICAgaWYoIGMgPT0gJ1snICkKKyAgICAgICAgICAgICAgICAgICAgaW5UYWcgPSB0cnVlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZGVzYyArPSBjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYoIGMgPT0gJ10nICkgeworICAgICAgICAgICAgICAgICAgICBUZXN0Q2FzZUluZm86OlNwZWNpYWxQcm9wZXJ0aWVzIHByb3AgPSBwYXJzZVNwZWNpYWxUYWcoIHRhZyApOworICAgICAgICAgICAgICAgICAgICBpZiggcHJvcCA9PSBUZXN0Q2FzZUluZm86OklzSGlkZGVuICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzSGlkZGVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggcHJvcCA9PSBUZXN0Q2FzZUluZm86Ok5vbmUgKQorICAgICAgICAgICAgICAgICAgICAgICAgZW5mb3JjZU5vdFJlc2VydmVkVGFnKCB0YWcsIF9saW5lSW5mbyApOworCisgICAgICAgICAgICAgICAgICAgIHRhZ3MuaW5zZXJ0KCB0YWcgKTsKKyAgICAgICAgICAgICAgICAgICAgdGFnLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIGluVGFnID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGFnICs9IGM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoIGlzSGlkZGVuICkgeworICAgICAgICAgICAgdGFncy5pbnNlcnQoICJoaWRlIiApOworICAgICAgICAgICAgdGFncy5pbnNlcnQoICIuIiApOworICAgICAgICB9CisKKyAgICAgICAgVGVzdENhc2VJbmZvIGluZm8oIF9uYW1lLCBfY2xhc3NOYW1lLCBkZXNjLCB0YWdzLCBfbGluZUluZm8gKTsKKyAgICAgICAgcmV0dXJuIFRlc3RDYXNlKCBfdGVzdENhc2UsIGluZm8gKTsKKyAgICB9CisKKyAgICB2b2lkIHNldFRhZ3MoIFRlc3RDYXNlSW5mbyYgdGVzdENhc2VJbmZvLCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gY29uc3QmIHRhZ3MgKQorICAgIHsKKyAgICAgICAgdGVzdENhc2VJbmZvLnRhZ3MgPSB0YWdzOworICAgICAgICB0ZXN0Q2FzZUluZm8ubGNhc2VUYWdzLmNsZWFyKCk7CisKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgZm9yKCBzdGQ6OnNldDxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdGFncy5iZWdpbigpLCBpdEVuZCA9IHRhZ3MuZW5kKCk7IGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgb3NzIDw8ICdbJyA8PCAqaXQgPDwgJ10nOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbGNhc2VUYWcgPSB0b0xvd2VyKCAqaXQgKTsKKyAgICAgICAgICAgIHRlc3RDYXNlSW5mby5wcm9wZXJ0aWVzID0gc3RhdGljX2Nhc3Q8VGVzdENhc2VJbmZvOjpTcGVjaWFsUHJvcGVydGllcz4oIHRlc3RDYXNlSW5mby5wcm9wZXJ0aWVzIHwgcGFyc2VTcGVjaWFsVGFnKCBsY2FzZVRhZyApICk7CisgICAgICAgICAgICB0ZXN0Q2FzZUluZm8ubGNhc2VUYWdzLmluc2VydCggbGNhc2VUYWcgKTsKKyAgICAgICAgfQorICAgICAgICB0ZXN0Q2FzZUluZm8udGFnc0FzU3RyaW5nID0gb3NzLnN0cigpOworICAgIH0KKworICAgIFRlc3RDYXNlSW5mbzo6VGVzdENhc2VJbmZvKCBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2Rlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gY29uc3QmIF90YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvICkKKyAgICA6ICAgbmFtZSggX25hbWUgKSwKKyAgICAgICAgY2xhc3NOYW1lKCBfY2xhc3NOYW1lICksCisgICAgICAgIGRlc2NyaXB0aW9uKCBfZGVzY3JpcHRpb24gKSwKKyAgICAgICAgbGluZUluZm8oIF9saW5lSW5mbyApLAorICAgICAgICBwcm9wZXJ0aWVzKCBOb25lICkKKyAgICB7CisgICAgICAgIHNldFRhZ3MoICp0aGlzLCBfdGFncyApOworICAgIH0KKworICAgIFRlc3RDYXNlSW5mbzo6VGVzdENhc2VJbmZvKCBUZXN0Q2FzZUluZm8gY29uc3QmIG90aGVyICkKKyAgICA6ICAgbmFtZSggb3RoZXIubmFtZSApLAorICAgICAgICBjbGFzc05hbWUoIG90aGVyLmNsYXNzTmFtZSApLAorICAgICAgICBkZXNjcmlwdGlvbiggb3RoZXIuZGVzY3JpcHRpb24gKSwKKyAgICAgICAgdGFncyggb3RoZXIudGFncyApLAorICAgICAgICBsY2FzZVRhZ3MoIG90aGVyLmxjYXNlVGFncyApLAorICAgICAgICB0YWdzQXNTdHJpbmcoIG90aGVyLnRhZ3NBc1N0cmluZyApLAorICAgICAgICBsaW5lSW5mbyggb3RoZXIubGluZUluZm8gKSwKKyAgICAgICAgcHJvcGVydGllcyggb3RoZXIucHJvcGVydGllcyApCisgICAge30KKworICAgIGJvb2wgVGVzdENhc2VJbmZvOjppc0hpZGRlbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICggcHJvcGVydGllcyAmIElzSGlkZGVuICkgIT0gMDsKKyAgICB9CisgICAgYm9vbCBUZXN0Q2FzZUluZm86OnRocm93cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICggcHJvcGVydGllcyAmIFRocm93cyApICE9IDA7CisgICAgfQorICAgIGJvb2wgVGVzdENhc2VJbmZvOjpva1RvRmFpbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICggcHJvcGVydGllcyAmIChTaG91bGRGYWlsIHwgTWF5RmFpbCApICkgIT0gMDsKKyAgICB9CisgICAgYm9vbCBUZXN0Q2FzZUluZm86OmV4cGVjdGVkVG9GYWlsKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKCBwcm9wZXJ0aWVzICYgKFNob3VsZEZhaWwgKSApICE9IDA7CisgICAgfQorCisgICAgVGVzdENhc2U6OlRlc3RDYXNlKCBJVGVzdENhc2UqIHRlc3RDYXNlLCBUZXN0Q2FzZUluZm8gY29uc3QmIGluZm8gKSA6IFRlc3RDYXNlSW5mbyggaW5mbyApLCB0ZXN0KCB0ZXN0Q2FzZSApIHt9CisKKyAgICBUZXN0Q2FzZTo6VGVzdENhc2UoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApCisgICAgOiAgIFRlc3RDYXNlSW5mbyggb3RoZXIgKSwKKyAgICAgICAgdGVzdCggb3RoZXIudGVzdCApCisgICAge30KKworICAgIFRlc3RDYXNlIFRlc3RDYXNlOjp3aXRoTmFtZSggc3RkOjpzdHJpbmcgY29uc3QmIF9uZXdOYW1lICkgY29uc3QgeworICAgICAgICBUZXN0Q2FzZSBvdGhlciggKnRoaXMgKTsKKyAgICAgICAgb3RoZXIubmFtZSA9IF9uZXdOYW1lOworICAgICAgICByZXR1cm4gb3RoZXI7CisgICAgfQorCisgICAgdm9pZCBUZXN0Q2FzZTo6c3dhcCggVGVzdENhc2UmIG90aGVyICkgeworICAgICAgICB0ZXN0LnN3YXAoIG90aGVyLnRlc3QgKTsKKyAgICAgICAgbmFtZS5zd2FwKCBvdGhlci5uYW1lICk7CisgICAgICAgIGNsYXNzTmFtZS5zd2FwKCBvdGhlci5jbGFzc05hbWUgKTsKKyAgICAgICAgZGVzY3JpcHRpb24uc3dhcCggb3RoZXIuZGVzY3JpcHRpb24gKTsKKyAgICAgICAgdGFncy5zd2FwKCBvdGhlci50YWdzICk7CisgICAgICAgIGxjYXNlVGFncy5zd2FwKCBvdGhlci5sY2FzZVRhZ3MgKTsKKyAgICAgICAgdGFnc0FzU3RyaW5nLnN3YXAoIG90aGVyLnRhZ3NBc1N0cmluZyApOworICAgICAgICBzdGQ6OnN3YXAoIFRlc3RDYXNlSW5mbzo6cHJvcGVydGllcywgc3RhdGljX2Nhc3Q8VGVzdENhc2VJbmZvJj4oIG90aGVyICkucHJvcGVydGllcyApOworICAgICAgICBzdGQ6OnN3YXAoIGxpbmVJbmZvLCBvdGhlci5saW5lSW5mbyApOworICAgIH0KKworICAgIHZvaWQgVGVzdENhc2U6Omludm9rZSgpIGNvbnN0IHsKKyAgICAgICAgdGVzdC0+aW52b2tlKCk7CisgICAgfQorCisgICAgYm9vbCBUZXN0Q2FzZTo6b3BlcmF0b3IgPT0gKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgIHJldHVybiAgdGVzdC5nZXQoKSA9PSBvdGhlci50ZXN0LmdldCgpICYmCisgICAgICAgICAgICAgICAgbmFtZSA9PSBvdGhlci5uYW1lICYmCisgICAgICAgICAgICAgICAgY2xhc3NOYW1lID09IG90aGVyLmNsYXNzTmFtZTsKKyAgICB9CisKKyAgICBib29sIFRlc3RDYXNlOjpvcGVyYXRvciA8ICggVGVzdENhc2UgY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICByZXR1cm4gbmFtZSA8IG90aGVyLm5hbWU7CisgICAgfQorICAgIFRlc3RDYXNlJiBUZXN0Q2FzZTo6b3BlcmF0b3IgPSAoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAgVGVzdENhc2UgdGVtcCggb3RoZXIgKTsKKyAgICAgICAgc3dhcCggdGVtcCApOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVGVzdENhc2VJbmZvIGNvbnN0JiBUZXN0Q2FzZTo6Z2V0VGVzdENhc2VJbmZvKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdmVyc2lvbi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1ZFUlNJT05fSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBWZXJzaW9uOjpWZXJzaW9uCisgICAgICAgICggICB1bnNpZ25lZCBpbnQgX21ham9yVmVyc2lvbiwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBfbWlub3JWZXJzaW9uLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IF9wYXRjaE51bWJlciwKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBfYnJhbmNoTmFtZSwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBfYnVpbGROdW1iZXIgKQorICAgIDogICBtYWpvclZlcnNpb24oIF9tYWpvclZlcnNpb24gKSwKKyAgICAgICAgbWlub3JWZXJzaW9uKCBfbWlub3JWZXJzaW9uICksCisgICAgICAgIHBhdGNoTnVtYmVyKCBfcGF0Y2hOdW1iZXIgKSwKKyAgICAgICAgYnJhbmNoTmFtZSggX2JyYW5jaE5hbWUgKSwKKyAgICAgICAgYnVpbGROdW1iZXIoIF9idWlsZE51bWJlciApCisgICAge30KKworICAgIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBWZXJzaW9uIGNvbnN0JiB2ZXJzaW9uICkgeworICAgICAgICBvcyAgPDwgdmVyc2lvbi5tYWpvclZlcnNpb24gPDwgJy4nCisgICAgICAgICAgICA8PCB2ZXJzaW9uLm1pbm9yVmVyc2lvbiA8PCAnLicKKyAgICAgICAgICAgIDw8IHZlcnNpb24ucGF0Y2hOdW1iZXI7CisgICAgICAgIC8vIGJyYW5jaE5hbWUgaXMgbmV2ZXIgbnVsbCAtPiAwdGggY2hhciBpcyBcMCBpZiBpdCBpcyBlbXB0eQorICAgICAgICBpZiAodmVyc2lvbi5icmFuY2hOYW1lWzBdKSB7CisgICAgICAgICAgICBvcyA8PCAnLScgPDwgdmVyc2lvbi5icmFuY2hOYW1lCisgICAgICAgICAgICAgICA8PCAnLicgPDwgdmVyc2lvbi5idWlsZE51bWJlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3M7CisgICAgfQorCisgICAgaW5saW5lIFZlcnNpb24gbGlicmFyeVZlcnNpb24oKSB7CisgICAgICAgIHN0YXRpYyBWZXJzaW9uIHZlcnNpb24oIDEsIDksIDQsICIiLCAwICk7CisgICAgICAgIHJldHVybiB2ZXJzaW9uOworICAgIH0KKworfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfbWVzc2FnZS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX01FU1NBR0VfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBNZXNzYWdlSW5mbzo6TWVzc2FnZUluZm8oICAgc3RkOjpzdHJpbmcgY29uc3QmIF9tYWNyb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIF90eXBlICkKKyAgICA6ICAgbWFjcm9OYW1lKCBfbWFjcm9OYW1lICksCisgICAgICAgIGxpbmVJbmZvKCBfbGluZUluZm8gKSwKKyAgICAgICAgdHlwZSggX3R5cGUgKSwKKyAgICAgICAgc2VxdWVuY2UoICsrZ2xvYmFsQ291bnQgKQorICAgIHt9CisKKyAgICAvLyBUaGlzIG1heSBuZWVkIHByb3RlY3RpbmcgaWYgdGhyZWFkaW5nIHN1cHBvcnQgaXMgYWRkZWQKKyAgICB1bnNpZ25lZCBpbnQgTWVzc2FnZUluZm86Omdsb2JhbENvdW50ID0gMDsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIFNjb3BlZE1lc3NhZ2U6OlNjb3BlZE1lc3NhZ2UoIE1lc3NhZ2VCdWlsZGVyIGNvbnN0JiBidWlsZGVyICkKKyAgICA6IG1faW5mbyggYnVpbGRlci5tX2luZm8gKQorICAgIHsKKyAgICAgICAgbV9pbmZvLm1lc3NhZ2UgPSBidWlsZGVyLm1fc3RyZWFtLnN0cigpOworICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkucHVzaFNjb3BlZE1lc3NhZ2UoIG1faW5mbyApOworICAgIH0KKyAgICBTY29wZWRNZXNzYWdlOjpTY29wZWRNZXNzYWdlKCBTY29wZWRNZXNzYWdlIGNvbnN0JiBvdGhlciApCisgICAgOiBtX2luZm8oIG90aGVyLm1faW5mbyApCisgICAge30KKworICAgIFNjb3BlZE1lc3NhZ2U6On5TY29wZWRNZXNzYWdlKCkgeworICAgICAgICBpZiAoICFzdGQ6OnVuY2F1Z2h0X2V4Y2VwdGlvbigpICl7CisgICAgICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkucG9wU2NvcGVkTWVzc2FnZShtX2luZm8pOworICAgICAgICB9CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2xlZ2FjeV9yZXBvcnRlcl9hZGFwdGVyLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTEVHQUNZX1JFUE9SVEVSX0FEQVBURVJfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9sZWdhY3lfcmVwb3J0ZXJfYWRhcHRlci5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9MRUdBQ1lfUkVQT1JURVJfQURBUFRFUl9IX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaAoreworICAgIC8vIERlcHJlY2F0ZWQKKyAgICBzdHJ1Y3QgSVJlcG9ydGVyIDogSVNoYXJlZCB7CisgICAgICAgIHZpcnR1YWwgfklSZXBvcnRlcigpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBzaG91bGRSZWRpcmVjdFN0ZG91dCgpIGNvbnN0ID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgU3RhcnRUZXN0aW5nKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgRW5kVGVzdGluZyggVG90YWxzIGNvbnN0JiB0b3RhbHMgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBTdGFydEdyb3VwKCBzdGQ6OnN0cmluZyBjb25zdCYgZ3JvdXBOYW1lICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgRW5kR3JvdXAoIHN0ZDo6c3RyaW5nIGNvbnN0JiBncm91cE5hbWUsIFRvdGFscyBjb25zdCYgdG90YWxzICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgU3RhcnRUZXN0Q2FzZSggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIEVuZFRlc3RDYXNlKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvLCBUb3RhbHMgY29uc3QmIHRvdGFscywgc3RkOjpzdHJpbmcgY29uc3QmIHN0ZE91dCwgc3RkOjpzdHJpbmcgY29uc3QmIHN0ZEVyciApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIFN0YXJ0U2VjdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIHNlY3Rpb25OYW1lLCBzdGQ6OnN0cmluZyBjb25zdCYgZGVzY3JpcHRpb24gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBFbmRTZWN0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgc2VjdGlvbk5hbWUsIENvdW50cyBjb25zdCYgYXNzZXJ0aW9ucyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIE5vQXNzZXJ0aW9uc0luU2VjdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIHNlY3Rpb25OYW1lICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgTm9Bc3NlcnRpb25zSW5UZXN0Q2FzZSggc3RkOjpzdHJpbmcgY29uc3QmIHRlc3ROYW1lICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgQWJvcnRlZCgpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIFJlc3VsdCggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgKSA9IDA7CisgICAgfTsKKworICAgIGNsYXNzIExlZ2FjeVJlcG9ydGVyQWRhcHRlciA6IHB1YmxpYyBTaGFyZWRJbXBsPElTdHJlYW1pbmdSZXBvcnRlcj4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBMZWdhY3lSZXBvcnRlckFkYXB0ZXIoIFB0cjxJUmVwb3J0ZXI+IGNvbnN0JiBsZWdhY3lSZXBvcnRlciApOworICAgICAgICB2aXJ0dWFsIH5MZWdhY3lSZXBvcnRlckFkYXB0ZXIoKTsKKworICAgICAgICB2aXJ0dWFsIFJlcG9ydGVyUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiApOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1blN0YXJ0aW5nKCBUZXN0UnVuSW5mbyBjb25zdCYgKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VTdGFydGluZyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8gKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApOworICAgICAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIHNlY3Rpb25TdGF0cyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiB0ZXN0R3JvdXBTdGF0cyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIHRlc3RSdW5TdGF0cyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2tpcFRlc3QoIFRlc3RDYXNlSW5mbyBjb25zdCYgKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIFB0cjxJUmVwb3J0ZXI+IG1fbGVnYWN5UmVwb3J0ZXI7CisgICAgfTsKK30KKworbmFtZXNwYWNlIENhdGNoCit7CisgICAgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjpMZWdhY3lSZXBvcnRlckFkYXB0ZXIoIFB0cjxJUmVwb3J0ZXI+IGNvbnN0JiBsZWdhY3lSZXBvcnRlciApCisgICAgOiAgIG1fbGVnYWN5UmVwb3J0ZXIoIGxlZ2FjeVJlcG9ydGVyICkKKyAgICB7fQorICAgIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6fkxlZ2FjeVJlcG9ydGVyQWRhcHRlcigpIHt9CisKKyAgICBSZXBvcnRlclByZWZlcmVuY2VzIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6Z2V0UHJlZmVyZW5jZXMoKSBjb25zdCB7CisgICAgICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMgcHJlZnM7CisgICAgICAgIHByZWZzLnNob3VsZFJlZGlyZWN0U3RkT3V0ID0gbV9sZWdhY3lSZXBvcnRlci0+c2hvdWxkUmVkaXJlY3RTdGRvdXQoKTsKKyAgICAgICAgcmV0dXJuIHByZWZzOworICAgIH0KKworICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjpub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgKSB7fQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiApIHsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+U3RhcnRUZXN0aW5nKCk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp0ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvIGNvbnN0JiBncm91cEluZm8gKSB7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPlN0YXJ0R3JvdXAoIGdyb3VwSW5mby5uYW1lICk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgeworICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5TdGFydFRlc3RDYXNlKCB0ZXN0SW5mbyApOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6c2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8gKSB7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPlN0YXJ0U2VjdGlvbiggc2VjdGlvbkluZm8ubmFtZSwgc2VjdGlvbkluZm8uZGVzY3JpcHRpb24gKTsKKyAgICB9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OmFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApIHsKKyAgICAgICAgLy8gTm90IG9uIGxlZ2FjeSBpbnRlcmZhY2UKKyAgICB9CisKKyAgICBib29sIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6YXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApIHsKKyAgICAgICAgaWYoIGFzc2VydGlvblN0YXRzLmFzc2VydGlvblJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgIT0gUmVzdWx0V2FzOjpPayApIHsKKyAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGFzc2VydGlvblN0YXRzLmluZm9NZXNzYWdlcy5iZWdpbigpLCBpdEVuZCA9IGFzc2VydGlvblN0YXRzLmluZm9NZXNzYWdlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICAgICAgaWYoIGl0LT50eXBlID09IFJlc3VsdFdhczo6SW5mbyApIHsKKyAgICAgICAgICAgICAgICAgICAgUmVzdWx0QnVpbGRlciByYiggaXQtPm1hY3JvTmFtZS5jX3N0cigpLCBpdC0+bGluZUluZm8sICIiLCBSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsICk7CisgICAgICAgICAgICAgICAgICAgIHJiIDw8IGl0LT5tZXNzYWdlOworICAgICAgICAgICAgICAgICAgICByYi5zZXRSZXN1bHRUeXBlKCBSZXN1bHRXYXM6OkluZm8gKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IHJlc3VsdCA9IHJiLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPlJlc3VsdCggcmVzdWx0ICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPlJlc3VsdCggYXNzZXJ0aW9uU3RhdHMuYXNzZXJ0aW9uUmVzdWx0ICk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6c2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIHNlY3Rpb25TdGF0cyApIHsKKyAgICAgICAgaWYoIHNlY3Rpb25TdGF0cy5taXNzaW5nQXNzZXJ0aW9ucyApCisgICAgICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5Ob0Fzc2VydGlvbnNJblNlY3Rpb24oIHNlY3Rpb25TdGF0cy5zZWN0aW9uSW5mby5uYW1lICk7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPkVuZFNlY3Rpb24oIHNlY3Rpb25TdGF0cy5zZWN0aW9uSW5mby5uYW1lLCBzZWN0aW9uU3RhdHMuYXNzZXJ0aW9ucyApOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6dGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApIHsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+RW5kVGVzdENhc2UKKyAgICAgICAgICAgICggICB0ZXN0Q2FzZVN0YXRzLnRlc3RJbmZvLAorICAgICAgICAgICAgICAgIHRlc3RDYXNlU3RhdHMudG90YWxzLAorICAgICAgICAgICAgICAgIHRlc3RDYXNlU3RhdHMuc3RkT3V0LAorICAgICAgICAgICAgICAgIHRlc3RDYXNlU3RhdHMuc3RkRXJyICk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICkgeworICAgICAgICBpZiggdGVzdEdyb3VwU3RhdHMuYWJvcnRpbmcgKQorICAgICAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+QWJvcnRlZCgpOworICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5FbmRHcm91cCggdGVzdEdyb3VwU3RhdHMuZ3JvdXBJbmZvLm5hbWUsIHRlc3RHcm91cFN0YXRzLnRvdGFscyApOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6dGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIHRlc3RSdW5TdGF0cyApIHsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+RW5kVGVzdGluZyggdGVzdFJ1blN0YXRzLnRvdGFscyApOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6c2tpcFRlc3QoIFRlc3RDYXNlSW5mbyBjb25zdCYgKSB7CisgICAgfQorfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGltZXIuaHBwCisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxMS1sb25nLWxvbmciCisjZW5kaWYKKworI2lmZGVmIENBVENIX1BMQVRGT1JNX1dJTkRPV1MKKworI2Vsc2UKKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgbmFtZXNwYWNlIHsKKyNpZmRlZiBDQVRDSF9QTEFURk9STV9XSU5ET1dTCisgICAgICAgIFVJbnQ2NCBnZXRDdXJyZW50VGlja3MoKSB7CisgICAgICAgICAgICBzdGF0aWMgVUludDY0IGh6PTAsIGh6bz0wOworICAgICAgICAgICAgaWYgKCFoeikgeworICAgICAgICAgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koIHJlaW50ZXJwcmV0X2Nhc3Q8TEFSR0VfSU5URUdFUio+KCAmaHogKSApOworICAgICAgICAgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCByZWludGVycHJldF9jYXN0PExBUkdFX0lOVEVHRVIqPiggJmh6byApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVSW50NjQgdDsKKyAgICAgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCByZWludGVycHJldF9jYXN0PExBUkdFX0lOVEVHRVIqPiggJnQgKSApOworICAgICAgICAgICAgcmV0dXJuICgodC1oem8pKjEwMDAwMDApL2h6OworICAgICAgICB9CisjZWxzZQorICAgICAgICBVSW50NjQgZ2V0Q3VycmVudFRpY2tzKCkgeworICAgICAgICAgICAgdGltZXZhbCB0OworICAgICAgICAgICAgZ2V0dGltZW9mZGF5KCZ0LENBVENIX05VTEwpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFVJbnQ2ND4oIHQudHZfc2VjICkgKiAxMDAwMDAwdWxsICsgc3RhdGljX2Nhc3Q8VUludDY0PiggdC50dl91c2VjICk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIHZvaWQgVGltZXI6OnN0YXJ0KCkgeworICAgICAgICBtX3RpY2tzID0gZ2V0Q3VycmVudFRpY2tzKCk7CisgICAgfQorICAgIHVuc2lnbmVkIGludCBUaW1lcjo6Z2V0RWxhcHNlZE1pY3Jvc2Vjb25kcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oZ2V0Q3VycmVudFRpY2tzKCkgLSBtX3RpY2tzKTsKKyAgICB9CisgICAgdW5zaWduZWQgaW50IFRpbWVyOjpnZXRFbGFwc2VkTWlsbGlzZWNvbmRzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihnZXRFbGFwc2VkTWljcm9zZWNvbmRzKCkvMTAwMCk7CisgICAgfQorICAgIGRvdWJsZSBUaW1lcjo6Z2V0RWxhcHNlZFNlY29uZHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBnZXRFbGFwc2VkTWljcm9zZWNvbmRzKCkvMTAwMDAwMC4wOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29tbW9uLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09NTU9OX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxjY3R5cGU+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBib29sIHN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBzdGQ6OnN0cmluZyBjb25zdCYgcHJlZml4ICkgeworICAgICAgICByZXR1cm4gcy5zaXplKCkgPj0gcHJlZml4LnNpemUoKSAmJiBzdGQ6OmVxdWFsKHByZWZpeC5iZWdpbigpLCBwcmVmaXguZW5kKCksIHMuYmVnaW4oKSk7CisgICAgfQorICAgIGJvb2wgc3RhcnRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIGNoYXIgcHJlZml4ICkgeworICAgICAgICByZXR1cm4gIXMuZW1wdHkoKSAmJiBzWzBdID09IHByZWZpeDsKKyAgICB9CisgICAgYm9vbCBlbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdWZmaXggKSB7CisgICAgICAgIHJldHVybiBzLnNpemUoKSA+PSBzdWZmaXguc2l6ZSgpICYmIHN0ZDo6ZXF1YWwoc3VmZml4LnJiZWdpbigpLCBzdWZmaXgucmVuZCgpLCBzLnJiZWdpbigpKTsKKyAgICB9CisgICAgYm9vbCBlbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIGNoYXIgc3VmZml4ICkgeworICAgICAgICByZXR1cm4gIXMuZW1wdHkoKSAmJiBzW3Muc2l6ZSgpLTFdID09IHN1ZmZpeDsKKyAgICB9CisgICAgYm9vbCBjb250YWlucyggc3RkOjpzdHJpbmcgY29uc3QmIHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBpbmZpeCApIHsKKyAgICAgICAgcmV0dXJuIHMuZmluZCggaW5maXggKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgICB9CisgICAgY2hhciB0b0xvd2VyQ2goY2hhciBjKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjaGFyPiggc3RkOjp0b2xvd2VyKCBjICkgKTsKKyAgICB9CisgICAgdm9pZCB0b0xvd2VySW5QbGFjZSggc3RkOjpzdHJpbmcmIHMgKSB7CisgICAgICAgIHN0ZDo6dHJhbnNmb3JtKCBzLmJlZ2luKCksIHMuZW5kKCksIHMuYmVnaW4oKSwgdG9Mb3dlckNoICk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHRvTG93ZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzICkgeworICAgICAgICBzdGQ6OnN0cmluZyBsYyA9IHM7CisgICAgICAgIHRvTG93ZXJJblBsYWNlKCBsYyApOworICAgICAgICByZXR1cm4gbGM7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHRyaW0oIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKSB7CisgICAgICAgIHN0YXRpYyBjaGFyIGNvbnN0KiB3aGl0ZXNwYWNlQ2hhcnMgPSAiXG5cclx0ICI7CisgICAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgc3RhcnQgPSBzdHIuZmluZF9maXJzdF9ub3Rfb2YoIHdoaXRlc3BhY2VDaGFycyApOworICAgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGVuZCA9IHN0ci5maW5kX2xhc3Rfbm90X29mKCB3aGl0ZXNwYWNlQ2hhcnMgKTsKKworICAgICAgICByZXR1cm4gc3RhcnQgIT0gc3RkOjpzdHJpbmc6Om5wb3MgPyBzdHIuc3Vic3RyKCBzdGFydCwgMStlbmQtc3RhcnQgKSA6IHN0ZDo6c3RyaW5nKCk7CisgICAgfQorCisgICAgYm9vbCByZXBsYWNlSW5QbGFjZSggc3RkOjpzdHJpbmcmIHN0ciwgc3RkOjpzdHJpbmcgY29uc3QmIHJlcGxhY2VUaGlzLCBzdGQ6OnN0cmluZyBjb25zdCYgd2l0aFRoaXMgKSB7CisgICAgICAgIGJvb2wgcmVwbGFjZWQgPSBmYWxzZTsKKyAgICAgICAgc3RkOjpzaXplX3QgaSA9IHN0ci5maW5kKCByZXBsYWNlVGhpcyApOworICAgICAgICB3aGlsZSggaSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApIHsKKyAgICAgICAgICAgIHJlcGxhY2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoIDAsIGkgKSArIHdpdGhUaGlzICsgc3RyLnN1YnN0ciggaStyZXBsYWNlVGhpcy5zaXplKCkgKTsKKyAgICAgICAgICAgIGlmKCBpIDwgc3RyLnNpemUoKS13aXRoVGhpcy5zaXplKCkgKQorICAgICAgICAgICAgICAgIGkgPSBzdHIuZmluZCggcmVwbGFjZVRoaXMsIGkrd2l0aFRoaXMuc2l6ZSgpICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaSA9IHN0ZDo6c3RyaW5nOjpucG9zOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBsYWNlZDsKKyAgICB9CisKKyAgICBwbHVyYWxpc2U6OnBsdXJhbGlzZSggc3RkOjpzaXplX3QgY291bnQsIHN0ZDo6c3RyaW5nIGNvbnN0JiBsYWJlbCApCisgICAgOiAgIG1fY291bnQoIGNvdW50ICksCisgICAgICAgIG1fbGFiZWwoIGxhYmVsICkKKyAgICB7fQorCisgICAgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIHBsdXJhbGlzZSBjb25zdCYgcGx1cmFsaXNlciApIHsKKyAgICAgICAgb3MgPDwgcGx1cmFsaXNlci5tX2NvdW50IDw8ICcgJyA8PCBwbHVyYWxpc2VyLm1fbGFiZWw7CisgICAgICAgIGlmKCBwbHVyYWxpc2VyLm1fY291bnQgIT0gMSApCisgICAgICAgICAgICBvcyA8PCAncyc7CisgICAgICAgIHJldHVybiBvczsKKyAgICB9CisKKyAgICBTb3VyY2VMaW5lSW5mbzo6U291cmNlTGluZUluZm8oKSA6IGZpbGUoIiIpLCBsaW5lKCAwICl7fQorICAgIFNvdXJjZUxpbmVJbmZvOjpTb3VyY2VMaW5lSW5mbyggY2hhciBjb25zdCogX2ZpbGUsIHN0ZDo6c2l6ZV90IF9saW5lICkKKyAgICA6ICAgZmlsZSggX2ZpbGUgKSwKKyAgICAgICAgbGluZSggX2xpbmUgKQorICAgIHt9CisgICAgYm9vbCBTb3VyY2VMaW5lSW5mbzo6ZW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBmaWxlWzBdID09ICdcMCc7CisgICAgfQorICAgIGJvb2wgU291cmNlTGluZUluZm86Om9wZXJhdG9yID09ICggU291cmNlTGluZUluZm8gY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICByZXR1cm4gbGluZSA9PSBvdGhlci5saW5lICYmIChmaWxlID09IG90aGVyLmZpbGUgfHwgc3RkOjpzdHJjbXAoZmlsZSwgb3RoZXIuZmlsZSkgPT0gMCk7CisgICAgfQorICAgIGJvb2wgU291cmNlTGluZUluZm86Om9wZXJhdG9yIDwgKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsaW5lIDwgb3RoZXIubGluZSB8fCAoIGxpbmUgPT0gb3RoZXIubGluZSAmJiAoc3RkOjpzdHJjbXAoZmlsZSwgb3RoZXIuZmlsZSkgPCAwKSk7CisgICAgfQorCisgICAgdm9pZCBzZWVkUm5nKCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIGlmKCBjb25maWcucm5nU2VlZCgpICE9IDAgKQorICAgICAgICAgICAgc3RkOjpzcmFuZCggY29uZmlnLnJuZ1NlZWQoKSApOworICAgIH0KKyAgICB1bnNpZ25lZCBpbnQgcm5nU2VlZCgpIHsKKyAgICAgICAgcmV0dXJuIGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0Q29uZmlnKCktPnJuZ1NlZWQoKTsKKyAgICB9CisKKyAgICBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgU291cmNlTGluZUluZm8gY29uc3QmIGluZm8gKSB7CisjaWZuZGVmIF9fR05VR19fCisgICAgICAgIG9zIDw8IGluZm8uZmlsZSA8PCAnKCcgPDwgaW5mby5saW5lIDw8ICcpJzsKKyNlbHNlCisgICAgICAgIG9zIDw8IGluZm8uZmlsZSA8PCAnOicgPDwgaW5mby5saW5lOworI2VuZGlmCisgICAgICAgIHJldHVybiBvczsKKyAgICB9CisKKyAgICB2b2lkIHRocm93TG9naWNFcnJvciggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsb2NhdGlvbkluZm8gKSB7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgIG9zcyA8PCBsb2NhdGlvbkluZm8gPDwgIjogSW50ZXJuYWwgQ2F0Y2ggZXJyb3I6ICciIDw8IG1lc3NhZ2UgPDwgJ1wnJzsKKyAgICAgICAgaWYoIGFsd2F5c1RydWUoKSApCisgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCBvc3Muc3RyKCkgKTsKKyAgICB9Cit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9zZWN0aW9uLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfU0VDVElPTl9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIFNlY3Rpb25JbmZvOjpTZWN0aW9uSW5mbworICAgICAgICAoICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbywKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfZGVzY3JpcHRpb24gKQorICAgIDogICBuYW1lKCBfbmFtZSApLAorICAgICAgICBkZXNjcmlwdGlvbiggX2Rlc2NyaXB0aW9uICksCisgICAgICAgIGxpbmVJbmZvKCBfbGluZUluZm8gKQorICAgIHt9CisKKyAgICBTZWN0aW9uOjpTZWN0aW9uKCBTZWN0aW9uSW5mbyBjb25zdCYgaW5mbyApCisgICAgOiAgIG1faW5mbyggaW5mbyApLAorICAgICAgICBtX3NlY3Rpb25JbmNsdWRlZCggZ2V0UmVzdWx0Q2FwdHVyZSgpLnNlY3Rpb25TdGFydGVkKCBtX2luZm8sIG1fYXNzZXJ0aW9ucyApICkKKyAgICB7CisgICAgICAgIG1fdGltZXIuc3RhcnQoKTsKKyAgICB9CisKKyAgICBTZWN0aW9uOjp+U2VjdGlvbigpIHsKKyAgICAgICAgaWYoIG1fc2VjdGlvbkluY2x1ZGVkICkgeworICAgICAgICAgICAgU2VjdGlvbkVuZEluZm8gZW5kSW5mbyggbV9pbmZvLCBtX2Fzc2VydGlvbnMsIG1fdGltZXIuZ2V0RWxhcHNlZFNlY29uZHMoKSApOworICAgICAgICAgICAgaWYoIHN0ZDo6dW5jYXVnaHRfZXhjZXB0aW9uKCkgKQorICAgICAgICAgICAgICAgIGdldFJlc3VsdENhcHR1cmUoKS5zZWN0aW9uRW5kZWRFYXJseSggZW5kSW5mbyApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdldFJlc3VsdENhcHR1cmUoKS5zZWN0aW9uRW5kZWQoIGVuZEluZm8gKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNlY3Rpb24gc2hvdWxkIGJlIGV4ZWN1dGVkIG9yIG5vdAorICAgIFNlY3Rpb246Om9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3NlY3Rpb25JbmNsdWRlZDsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfZGVidWdnZXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9ERUJVR0dFUl9IUFBfSU5DTFVERUQKKworI2lmZGVmIENBVENIX1BMQVRGT1JNX01BQworCisgICAgI2luY2x1ZGUgPGFzc2VydC5oPgorICAgICNpbmNsdWRlIDxzdGRib29sLmg+CisgICAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KKyAgICAjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorCisgICAgbmFtZXNwYWNlIENhdGNoeworCisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgdGFrZW4gZGlyZWN0bHkgZnJvbSB0aGUgZm9sbG93aW5nIHRlY2huaWNhbCBub3RlOgorICAgICAgICAvLyBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9saWJyYXJ5L21hYy8jcWEvcWEyMDA0L3FhMTM2MS5odG1sCisKKyAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IHByb2Nlc3MgaXMgYmVpbmcgZGVidWdnZWQgKGVpdGhlcgorICAgICAgICAvLyBydW5uaW5nIHVuZGVyIHRoZSBkZWJ1Z2dlciBvciBoYXMgYSBkZWJ1Z2dlciBhdHRhY2hlZCBwb3N0IGZhY3RvKS4KKyAgICAgICAgYm9vbCBpc0RlYnVnZ2VyQWN0aXZlKCl7CisKKyAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbWliWzRdOworICAgICAgICAgICAgc3RydWN0IGtpbmZvX3Byb2MgICBpbmZvOworICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICBzaXplOworCisgICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBmbGFncyBzbyB0aGF0LCBpZiBzeXNjdGwgZmFpbHMgZm9yIHNvbWUgYml6YXJyZQorICAgICAgICAgICAgLy8gcmVhc29uLCB3ZSBnZXQgYSBwcmVkaWN0YWJsZSByZXN1bHQuCisKKyAgICAgICAgICAgIGluZm8ua3BfcHJvYy5wX2ZsYWcgPSAwOworCisgICAgICAgICAgICAvLyBJbml0aWFsaXplIG1pYiwgd2hpY2ggdGVsbHMgc3lzY3RsIHRoZSBpbmZvIHdlIHdhbnQsIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgLy8gd2UncmUgbG9va2luZyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBwcm9jZXNzIElELgorCisgICAgICAgICAgICBtaWJbMF0gPSBDVExfS0VSTjsKKyAgICAgICAgICAgIG1pYlsxXSA9IEtFUk5fUFJPQzsKKyAgICAgICAgICAgIG1pYlsyXSA9IEtFUk5fUFJPQ19QSUQ7CisgICAgICAgICAgICBtaWJbM10gPSBnZXRwaWQoKTsKKworICAgICAgICAgICAgLy8gQ2FsbCBzeXNjdGwuCisKKyAgICAgICAgICAgIHNpemUgPSBzaXplb2YoaW5mbyk7CisgICAgICAgICAgICBpZiggc3lzY3RsKG1pYiwgc2l6ZW9mKG1pYikgLyBzaXplb2YoKm1pYiksICZpbmZvLCAmc2l6ZSwgQ0FUQ0hfTlVMTCwgMCkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBDYXRjaDo6Y2VycigpIDw8ICJcbioqIENhbGwgdG8gc3lzY3RsIGZhaWxlZCAtIHVuYWJsZSB0byBkZXRlcm1pbmUgaWYgZGVidWdnZXIgaXMgYWN0aXZlICoqXG4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFdlJ3JlIGJlaW5nIGRlYnVnZ2VkIGlmIHRoZSBQX1RSQUNFRCBmbGFnIGlzIHNldC4KKworICAgICAgICAgICAgcmV0dXJuICggKGluZm8ua3BfcHJvYy5wX2ZsYWcgJiBQX1RSQUNFRCkgIT0gMCApOworICAgICAgICB9CisgICAgfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworI2VsaWYgZGVmaW5lZChDQVRDSF9QTEFURk9STV9MSU5VWCkKKyAgICAjaW5jbHVkZSA8ZnN0cmVhbT4KKyAgICAjaW5jbHVkZSA8c3RyaW5nPgorCisgICAgbmFtZXNwYWNlIENhdGNoeworICAgICAgICAvLyBUaGUgc3RhbmRhcmQgUE9TSVggd2F5IG9mIGRldGVjdGluZyBhIGRlYnVnZ2VyIGlzIHRvIGF0dGVtcHQgdG8KKyAgICAgICAgLy8gcHRyYWNlKCkgdGhlIHByb2Nlc3MsIGJ1dCB0aGlzIG5lZWRzIHRvIGJlIGRvbmUgZnJvbSBhIGNoaWxkIGFuZCBub3QKKyAgICAgICAgLy8gdGhpcyBwcm9jZXNzIGl0c2VsZiB0byBzdGlsbCBhbGxvdyBhdHRhY2hpbmcgdG8gdGhpcyBwcm9jZXNzIGxhdGVyCisgICAgICAgIC8vIGlmIHdhbnRlZCwgc28gaXMgcmF0aGVyIGhlYXZ5LiBVbmRlciBMaW51eCB3ZSBoYXZlIHRoZSBQSUQgb2YgdGhlCisgICAgICAgIC8vICJkZWJ1Z2dlciIgKHdoaWNoIGRvZXNuJ3QgbmVlZCB0byBiZSBnZGIsIG9mIGNvdXJzZSwgaXQgY291bGQgYWxzbworICAgICAgICAvLyBiZSBzdHJhY2UsIGZvciBleGFtcGxlKSBpbiAvcHJvYy8kUElEL3N0YXR1cywgc28ganVzdCBnZXQgaXQgZnJvbQorICAgICAgICAvLyB0aGVyZSBpbnN0ZWFkLgorICAgICAgICBib29sIGlzRGVidWdnZXJBY3RpdmUoKXsKKyAgICAgICAgICAgIC8vIExpYnN0ZGMrKyBoYXMgYSBidWcsIHdoZXJlIHN0ZDo6aWZzdHJlYW0gc2V0cyBlcnJubyB0byAwCisgICAgICAgICAgICAvLyBUaGlzIHdheSBvdXIgdXNlcnMgY2FuIHByb3Blcmx5IGFzc2VydCBvdmVyIGVycm5vIHZhbHVlcworICAgICAgICAgICAgRXJybm9HdWFyZCBndWFyZDsKKyAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0gaW4oIi9wcm9jL3NlbGYvc3RhdHVzIik7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c3RyaW5nIGxpbmU7IHN0ZDo6Z2V0bGluZShpbiwgbGluZSk7ICkgeworICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgUFJFRklYX0xFTiA9IDExOworICAgICAgICAgICAgICAgIGlmKCBsaW5lLmNvbXBhcmUoMCwgUFJFRklYX0xFTiwgIlRyYWNlclBpZDpcdCIpID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIHRyYWNlZCBpZiB0aGUgUElEIGlzIG5vdCAwIGFuZCBubyBvdGhlciBQSUQgc3RhcnRzCisgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggMCBkaWdpdCwgc28gaXQncyBlbm91Z2ggdG8gY2hlY2sgZm9yIGp1c3QgYSBzaW5nbGUKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVyLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGluZS5sZW5ndGgoKSA+IFBSRUZJWF9MRU4gJiYgbGluZVtQUkVGSVhfTEVOXSAhPSAnMCc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IC8vIG5hbWVzcGFjZSBDYXRjaAorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgICBleHRlcm4gIkMiIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbnQgX19zdGRjYWxsIElzRGVidWdnZXJQcmVzZW50KCk7CisgICAgbmFtZXNwYWNlIENhdGNoIHsKKyAgICAgICAgYm9vbCBpc0RlYnVnZ2VyQWN0aXZlKCkgeworICAgICAgICAgICAgcmV0dXJuIElzRGVidWdnZXJQcmVzZW50KCkgIT0gMDsKKyAgICAgICAgfQorICAgIH0KKyNlbGlmIGRlZmluZWQoX19NSU5HVzMyX18pCisgICAgZXh0ZXJuICJDIiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgaW50IF9fc3RkY2FsbCBJc0RlYnVnZ2VyUHJlc2VudCgpOworICAgIG5hbWVzcGFjZSBDYXRjaCB7CisgICAgICAgIGJvb2wgaXNEZWJ1Z2dlckFjdGl2ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBJc0RlYnVnZ2VyUHJlc2VudCgpICE9IDA7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIG5hbWVzcGFjZSBDYXRjaCB7CisgICAgICAgaW5saW5lIGJvb2wgaXNEZWJ1Z2dlckFjdGl2ZSgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgfQorI2VuZGlmIC8vIFBsYXRmb3JtCisKKyNpZmRlZiBDQVRDSF9QTEFURk9STV9XSU5ET1dTCisKKyAgICBuYW1lc3BhY2UgQ2F0Y2ggeworICAgICAgICB2b2lkIHdyaXRlVG9EZWJ1Z0NvbnNvbGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0ICkgeworICAgICAgICAgICAgOjpPdXRwdXREZWJ1Z1N0cmluZ0EoIHRleHQuY19zdHIoKSApOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBuYW1lc3BhY2UgQ2F0Y2ggeworICAgICAgICB2b2lkIHdyaXRlVG9EZWJ1Z0NvbnNvbGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0ICkgeworICAgICAgICAgICAgLy8gIVRCRDogTmVlZCBhIHZlcnNpb24gZm9yIE1hYy8gWENvZGUgYW5kIG90aGVyIElERXMKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgdGV4dDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvLyBQbGF0Zm9ybQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdG9zdHJpbmcuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9UT1NUUklOR19IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworbmFtZXNwYWNlIERldGFpbCB7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyB1bnByaW50YWJsZVN0cmluZyA9ICJ7P30iOworCisgICAgbmFtZXNwYWNlIHsKKyAgICAgICAgY29uc3QgaW50IGhleFRocmVzaG9sZCA9IDI1NTsKKworICAgICAgICBzdHJ1Y3QgRW5kaWFubmVzcyB7CisgICAgICAgICAgICBlbnVtIEFyY2ggeyBCaWcsIExpdHRsZSB9OworCisgICAgICAgICAgICBzdGF0aWMgQXJjaCB3aGljaCgpIHsKKyAgICAgICAgICAgICAgICB1bmlvbiBfeworICAgICAgICAgICAgICAgICAgICBpbnQgYXNJbnQ7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgYXNDaGFyW3NpemVvZiAoaW50KV07CisgICAgICAgICAgICAgICAgfSB1OworCisgICAgICAgICAgICAgICAgdS5hc0ludCA9IDE7CisgICAgICAgICAgICAgICAgcmV0dXJuICggdS5hc0NoYXJbc2l6ZW9mKGludCktMV0gPT0gMSApID8gQmlnIDogTGl0dGxlOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHJhd01lbW9yeVRvU3RyaW5nKCBjb25zdCB2b2lkICpvYmplY3QsIHN0ZDo6c2l6ZV90IHNpemUgKQorICAgIHsKKyAgICAgICAgLy8gUmV2ZXJzZSBvcmRlciBmb3IgbGl0dGxlIGVuZGlhbiBhcmNoaXRlY3R1cmVzCisgICAgICAgIGludCBpID0gMCwgZW5kID0gc3RhdGljX2Nhc3Q8aW50Piggc2l6ZSApLCBpbmMgPSAxOworICAgICAgICBpZiggRW5kaWFubmVzczo6d2hpY2goKSA9PSBFbmRpYW5uZXNzOjpMaXR0bGUgKSB7CisgICAgICAgICAgICBpID0gZW5kLTE7CisgICAgICAgICAgICBlbmQgPSBpbmMgPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHVuc2lnbmVkIGNoYXIgY29uc3QgKmJ5dGVzID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhciBjb25zdCAqPihvYmplY3QpOworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICAgIG9zIDw8ICIweCIgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpoZXg7CisgICAgICAgIGZvciggOyBpICE9IGVuZDsgaSArPSBpbmMgKQorICAgICAgICAgICAgIG9zIDw8IHN0ZDo6c2V0dygyKSA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oYnl0ZXNbaV0pOworICAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgdmFsdWUgKSB7CisgICAgc3RkOjpzdHJpbmcgcyA9IHZhbHVlOworICAgIGlmKCBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZpZygpLT5zaG93SW52aXNpYmxlcygpICkgeworICAgICAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgcy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN1YnM7CisgICAgICAgICAgICBzd2l0Y2goIHNbaV0gKSB7CisgICAgICAgICAgICBjYXNlICdcbic6IHN1YnMgPSAiXFxuIjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdcdCc6IHN1YnMgPSAiXFx0IjsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhc3Vicy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIHMgPSBzLnN1YnN0ciggMCwgaSApICsgc3VicyArIHMuc3Vic3RyKCBpKzEgKTsKKyAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICciJyArIHMgKyAnIic7Cit9CitzdGQ6OnN0cmluZyB0b1N0cmluZyggc3RkOjp3c3RyaW5nIGNvbnN0JiB2YWx1ZSApIHsKKworICAgIHN0ZDo6c3RyaW5nIHM7CisgICAgcy5yZXNlcnZlKCB2YWx1ZS5zaXplKCkgKTsKKyAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgdmFsdWUuc2l6ZSgpOyArK2kgKQorICAgICAgICBzICs9IHZhbHVlW2ldIDw9IDB4ZmYgPyBzdGF0aWNfY2FzdDxjaGFyPiggdmFsdWVbaV0gKSA6ICc/JzsKKyAgICByZXR1cm4gQ2F0Y2g6OnRvU3RyaW5nKCBzICk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZSApIHsKKyAgICByZXR1cm4gdmFsdWUgPyBDYXRjaDo6dG9TdHJpbmcoIHN0ZDo6c3RyaW5nKCB2YWx1ZSApICkgOiBzdGQ6OnN0cmluZyggIntudWxsIHN0cmluZ30iICk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjaGFyKiBjb25zdCB2YWx1ZSApIHsKKyAgICByZXR1cm4gQ2F0Y2g6OnRvU3RyaW5nKCBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oIHZhbHVlICkgKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IHdjaGFyX3QqIGNvbnN0IHZhbHVlICkKK3sKKyAgICByZXR1cm4gdmFsdWUgPyBDYXRjaDo6dG9TdHJpbmcoIHN0ZDo6d3N0cmluZyh2YWx1ZSkgKSA6IHN0ZDo6c3RyaW5nKCAie251bGwgc3RyaW5nfSIgKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHdjaGFyX3QqIGNvbnN0IHZhbHVlICkKK3sKKyAgICByZXR1cm4gQ2F0Y2g6OnRvU3RyaW5nKCBzdGF0aWNfY2FzdDxjb25zdCB3Y2hhcl90Kj4oIHZhbHVlICkgKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGludCB2YWx1ZSApIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgIG9zcyA8PCB2YWx1ZTsKKyAgICBpZiggdmFsdWUgPiBEZXRhaWw6OmhleFRocmVzaG9sZCApCisgICAgICAgIG9zcyA8PCAiICgweCIgPDwgc3RkOjpoZXggPDwgdmFsdWUgPDwgJyknOworICAgIHJldHVybiBvc3Muc3RyKCk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB1bnNpZ25lZCBsb25nIHZhbHVlICkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgb3NzIDw8IHZhbHVlOworICAgIGlmKCB2YWx1ZSA+IERldGFpbDo6aGV4VGhyZXNob2xkICkKKyAgICAgICAgb3NzIDw8ICIgKDB4IiA8PCBzdGQ6OmhleCA8PCB2YWx1ZSA8PCAnKSc7CisgICAgcmV0dXJuIG9zcy5zdHIoKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGludCB2YWx1ZSApIHsKKyAgICByZXR1cm4gQ2F0Y2g6OnRvU3RyaW5nKCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggdmFsdWUgKSApOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgZnBUb1N0cmluZyggVCB2YWx1ZSwgaW50IHByZWNpc2lvbiApIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgIG9zcyA8PCBzdGQ6OnNldHByZWNpc2lvbiggcHJlY2lzaW9uICkKKyAgICAgICAgPDwgc3RkOjpmaXhlZAorICAgICAgICA8PCB2YWx1ZTsKKyAgICBzdGQ6OnN0cmluZyBkID0gb3NzLnN0cigpOworICAgIHN0ZDo6c2l6ZV90IGkgPSBkLmZpbmRfbGFzdF9ub3Rfb2YoICcwJyApOworICAgIGlmKCBpICE9IHN0ZDo6c3RyaW5nOjpucG9zICYmIGkgIT0gZC5zaXplKCktMSApIHsKKyAgICAgICAgaWYoIGRbaV0gPT0gJy4nICkKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgZCA9IGQuc3Vic3RyKCAwLCBpKzEgKTsKKyAgICB9CisgICAgcmV0dXJuIGQ7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjb25zdCBkb3VibGUgdmFsdWUgKSB7CisgICAgcmV0dXJuIGZwVG9TdHJpbmcoIHZhbHVlLCAxMCApOworfQorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IGZsb2F0IHZhbHVlICkgeworICAgIHJldHVybiBmcFRvU3RyaW5nKCB2YWx1ZSwgNSApICsgJ2YnOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggYm9vbCB2YWx1ZSApIHsKKyAgICByZXR1cm4gdmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggY2hhciB2YWx1ZSApIHsKKyAgICBpZiAoIHZhbHVlID09ICdccicgKQorICAgICAgICByZXR1cm4gIidcXHInIjsKKyAgICBpZiAoIHZhbHVlID09ICdcZicgKQorICAgICAgICByZXR1cm4gIidcXGYnIjsKKyAgICBpZiAoIHZhbHVlID09ICdcbicgKQorICAgICAgICByZXR1cm4gIidcXG4nIjsKKyAgICBpZiAoIHZhbHVlID09ICdcdCcgKQorICAgICAgICByZXR1cm4gIidcXHQnIjsKKyAgICBpZiAoICdcMCcgPD0gdmFsdWUgJiYgdmFsdWUgPCAnICcgKQorICAgICAgICByZXR1cm4gdG9TdHJpbmcoIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIHZhbHVlICkgKTsKKyAgICBjaGFyIGNoc3RyW10gPSAiJyAnIjsKKyAgICBjaHN0clsxXSA9IHZhbHVlOworICAgIHJldHVybiBjaHN0cjsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHNpZ25lZCBjaGFyIHZhbHVlICkgeworICAgIHJldHVybiB0b1N0cmluZyggc3RhdGljX2Nhc3Q8Y2hhcj4oIHZhbHVlICkgKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGNoYXIgdmFsdWUgKSB7CisgICAgcmV0dXJuIHRvU3RyaW5nKCBzdGF0aWNfY2FzdDxjaGFyPiggdmFsdWUgKSApOworfQorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0xPTkdfTE9ORworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGxvbmcgbG9uZyB2YWx1ZSApIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgIG9zcyA8PCB2YWx1ZTsKKyAgICBpZiggdmFsdWUgPiBEZXRhaWw6OmhleFRocmVzaG9sZCApCisgICAgICAgIG9zcyA8PCAiICgweCIgPDwgc3RkOjpoZXggPDwgdmFsdWUgPDwgJyknOworICAgIHJldHVybiBvc3Muc3RyKCk7Cit9CitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlICkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgb3NzIDw8IHZhbHVlOworICAgIGlmKCB2YWx1ZSA+IERldGFpbDo6aGV4VGhyZXNob2xkICkKKyAgICAgICAgb3NzIDw8ICIgKDB4IiA8PCBzdGQ6OmhleCA8PCB2YWx1ZSA8PCAnKSc7CisgICAgcmV0dXJuIG9zcy5zdHIoKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6Om51bGxwdHJfdCApIHsKKyAgICByZXR1cm4gIm51bGxwdHIiOworfQorI2VuZGlmCisKKyNpZmRlZiBfX09CSkNfXworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCBOU1N0cmluZyBjb25zdCAqIGNvbnN0JiBuc3N0cmluZyApIHsKKyAgICAgICAgaWYoICFuc3N0cmluZyApCisgICAgICAgICAgICByZXR1cm4gIm5pbCI7CisgICAgICAgIHJldHVybiAiQCIgKyB0b1N0cmluZyhbbnNzdHJpbmcgVVRGOFN0cmluZ10pOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyggTlNTdHJpbmcgKiBDQVRDSF9BUkNfU1RST05HIGNvbnN0JiBuc3N0cmluZyApIHsKKyAgICAgICAgaWYoICFuc3N0cmluZyApCisgICAgICAgICAgICByZXR1cm4gIm5pbCI7CisgICAgICAgIHJldHVybiAiQCIgKyB0b1N0cmluZyhbbnNzdHJpbmcgVVRGOFN0cmluZ10pOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyggTlNPYmplY3QqIGNvbnN0JiBuc09iamVjdCApIHsKKyAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCBbbnNPYmplY3QgZGVzY3JpcHRpb25dICk7CisgICAgfQorI2VuZGlmCisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVzdWx0X2J1aWxkZXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVNVTFRfQlVJTERFUl9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0ZDo6c3RyaW5nIGNhcHR1cmVkRXhwcmVzc2lvbldpdGhTZWNvbmRBcmd1bWVudCggc3RkOjpzdHJpbmcgY29uc3QmIGNhcHR1cmVkRXhwcmVzc2lvbiwgc3RkOjpzdHJpbmcgY29uc3QmIHNlY29uZEFyZyApIHsKKyAgICAgICAgcmV0dXJuIHNlY29uZEFyZy5lbXB0eSgpIHx8IHNlY29uZEFyZyA9PSAiXCJcIiIKKyAgICAgICAgICAgID8gY2FwdHVyZWRFeHByZXNzaW9uCisgICAgICAgICAgICA6IGNhcHR1cmVkRXhwcmVzc2lvbiArICIsICIgKyBzZWNvbmRBcmc7CisgICAgfQorICAgIFJlc3VsdEJ1aWxkZXI6OlJlc3VsdEJ1aWxkZXIoICAgY2hhciBjb25zdCogbWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCogY2FwdHVyZWRFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJlc3VsdERpc3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCogc2Vjb25kQXJnICkKKyAgICA6ICAgbV9hc3NlcnRpb25JbmZvKCBtYWNyb05hbWUsIGxpbmVJbmZvLCBjYXB0dXJlZEV4cHJlc3Npb25XaXRoU2Vjb25kQXJndW1lbnQoIGNhcHR1cmVkRXhwcmVzc2lvbiwgc2Vjb25kQXJnICksIHJlc3VsdERpc3Bvc2l0aW9uICksCisgICAgICAgIG1fc2hvdWxkRGVidWdCcmVhayggZmFsc2UgKSwKKyAgICAgICAgbV9zaG91bGRUaHJvdyggZmFsc2UgKSwKKyAgICAgICAgbV9ndWFyZEV4Y2VwdGlvbiggZmFsc2UgKQorICAgIHt9CisKKyAgICBSZXN1bHRCdWlsZGVyOjp+UmVzdWx0QnVpbGRlcigpIHsKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUpCisgICAgICAgIGlmICggbV9ndWFyZEV4Y2VwdGlvbiApIHsKKyAgICAgICAgICAgIG1fc3RyZWFtLm9zcyA8PCAiRXhjZXB0aW9uIHRyYW5zbGF0aW9uIHdhcyBkaXNhYmxlZCBieSBDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFIjsKKyAgICAgICAgICAgIGNhcHR1cmVSZXN1bHQoIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb24gKTsKKyAgICAgICAgICAgIGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0UmVzdWx0Q2FwdHVyZSgpLT5leGNlcHRpb25FYXJseVJlcG9ydGVkKCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIFJlc3VsdEJ1aWxkZXImIFJlc3VsdEJ1aWxkZXI6OnNldFJlc3VsdFR5cGUoIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdCApIHsKKyAgICAgICAgbV9kYXRhLnJlc3VsdFR5cGUgPSByZXN1bHQ7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgUmVzdWx0QnVpbGRlciYgUmVzdWx0QnVpbGRlcjo6c2V0UmVzdWx0VHlwZSggYm9vbCByZXN1bHQgKSB7CisgICAgICAgIG1fZGF0YS5yZXN1bHRUeXBlID0gcmVzdWx0ID8gUmVzdWx0V2FzOjpPayA6IFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6ZW5kRXhwcmVzc2lvbiggRGVjb21wb3NlZEV4cHJlc3Npb24gY29uc3QmIGV4cHIgKSB7CisgICAgICAgIEFzc2VydGlvblJlc3VsdCByZXN1bHQgPSBidWlsZCggZXhwciApOworICAgICAgICBoYW5kbGVSZXN1bHQoIHJlc3VsdCApOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6dXNlQWN0aXZlRXhjZXB0aW9uKCBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgcmVzdWx0RGlzcG9zaXRpb24gKSB7CisgICAgICAgIG1fYXNzZXJ0aW9uSW5mby5yZXN1bHREaXNwb3NpdGlvbiA9IHJlc3VsdERpc3Bvc2l0aW9uOworICAgICAgICBtX3N0cmVhbS5vc3MgPDwgQ2F0Y2g6OnRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpOworICAgICAgICBjYXB0dXJlUmVzdWx0KCBSZXN1bHRXYXM6OlRocmV3RXhjZXB0aW9uICk7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpjYXB0dXJlUmVzdWx0KCBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHRUeXBlICkgeworICAgICAgICBzZXRSZXN1bHRUeXBlKCByZXN1bHRUeXBlICk7CisgICAgICAgIGNhcHR1cmVFeHByZXNzaW9uKCk7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpjYXB0dXJlRXhwZWN0ZWRFeGNlcHRpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBleHBlY3RlZE1lc3NhZ2UgKSB7CisgICAgICAgIGlmKCBleHBlY3RlZE1lc3NhZ2UuZW1wdHkoKSApCisgICAgICAgICAgICBjYXB0dXJlRXhwZWN0ZWRFeGNlcHRpb24oIE1hdGNoZXJzOjpJbXBsOjpNYXRjaEFsbE9mPHN0ZDo6c3RyaW5nPigpICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggTWF0Y2hlcnM6OkVxdWFscyggZXhwZWN0ZWRNZXNzYWdlICkgKTsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OmNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggTWF0Y2hlcnM6OkltcGw6Ok1hdGNoZXJCYXNlPHN0ZDo6c3RyaW5nPiBjb25zdCYgbWF0Y2hlciApIHsKKworICAgICAgICBhc3NlcnQoICFpc0ZhbHNlVGVzdCggbV9hc3NlcnRpb25JbmZvLnJlc3VsdERpc3Bvc2l0aW9uICkgKTsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSBkYXRhID0gbV9kYXRhOworICAgICAgICBkYXRhLnJlc3VsdFR5cGUgPSBSZXN1bHRXYXM6Ok9rOworICAgICAgICBkYXRhLnJlY29uc3RydWN0ZWRFeHByZXNzaW9uID0gbV9hc3NlcnRpb25JbmZvLmNhcHR1cmVkRXhwcmVzc2lvbjsKKworICAgICAgICBzdGQ6OnN0cmluZyBhY3R1YWxNZXNzYWdlID0gQ2F0Y2g6OnRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpOworICAgICAgICBpZiggIW1hdGNoZXIubWF0Y2goIGFjdHVhbE1lc3NhZ2UgKSApIHsKKyAgICAgICAgICAgIGRhdGEucmVzdWx0VHlwZSA9IFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZDsKKyAgICAgICAgICAgIGRhdGEucmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24gPSBhY3R1YWxNZXNzYWdlOworICAgICAgICB9CisgICAgICAgIEFzc2VydGlvblJlc3VsdCByZXN1bHQoIG1fYXNzZXJ0aW9uSW5mbywgZGF0YSApOworICAgICAgICBoYW5kbGVSZXN1bHQoIHJlc3VsdCApOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6Y2FwdHVyZUV4cHJlc3Npb24oKSB7CisgICAgICAgIEFzc2VydGlvblJlc3VsdCByZXN1bHQgPSBidWlsZCgpOworICAgICAgICBoYW5kbGVSZXN1bHQoIHJlc3VsdCApOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6aGFuZGxlUmVzdWx0KCBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCApCisgICAgeworICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkuYXNzZXJ0aW9uRW5kZWQoIHJlc3VsdCApOworCisgICAgICAgIGlmKCAhcmVzdWx0LmlzT2soKSApIHsKKyAgICAgICAgICAgIGlmKCBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZpZygpLT5zaG91bGREZWJ1Z0JyZWFrKCkgKQorICAgICAgICAgICAgICAgIG1fc2hvdWxkRGVidWdCcmVhayA9IHRydWU7CisgICAgICAgICAgICBpZiggZ2V0Q3VycmVudENvbnRleHQoKS5nZXRSdW5uZXIoKS0+YWJvcnRpbmcoKSB8fCAobV9hc3NlcnRpb25JbmZvLnJlc3VsdERpc3Bvc2l0aW9uICYgUmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCkgKQorICAgICAgICAgICAgICAgIG1fc2hvdWxkVGhyb3cgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpyZWFjdCgpIHsKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUpCisgICAgICAgIGlmIChtX3Nob3VsZERlYnVnQnJlYWspIHsKKyAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgIC8vIFRvIGluc3BlY3QgdGhlIHN0YXRlIGR1cmluZyB0ZXN0LCB5b3UgbmVlZCB0byBnbyBvbmUgbGV2ZWwgdXAgdGhlIGNhbGxzdGFjaworICAgICAgICAgICAgLy8gVG8gZ28gYmFjayB0byB0aGUgdGVzdCBhbmQgY2hhbmdlIGV4ZWN1dGlvbiwganVtcCBvdmVyIHRoZSB0aHJvdyBzdGF0ZW1lbnQKKyAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgIENBVENIX0JSRUFLX0lOVE9fREVCVUdHRVIoKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmKCBtX3Nob3VsZFRocm93ICkKKyAgICAgICAgICAgIHRocm93IENhdGNoOjpUZXN0RmFpbHVyZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIGJvb2wgUmVzdWx0QnVpbGRlcjo6c2hvdWxkRGVidWdCcmVhaygpIGNvbnN0IHsgcmV0dXJuIG1fc2hvdWxkRGVidWdCcmVhazsgfQorICAgIGJvb2wgUmVzdWx0QnVpbGRlcjo6YWxsb3dUaHJvd3MoKSBjb25zdCB7IHJldHVybiBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZpZygpLT5hbGxvd1Rocm93cygpOyB9CisKKyAgICBBc3NlcnRpb25SZXN1bHQgUmVzdWx0QnVpbGRlcjo6YnVpbGQoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGJ1aWxkKCAqdGhpcyApOworICAgIH0KKworICAgIC8vIENBVkVBVDogVGhlIHJldHVybmVkIEFzc2VydGlvblJlc3VsdCBzdG9yZXMgYSBwb2ludGVyIHRvIHRoZSBhcmd1bWVudCBleHByLAorICAgIC8vICAgICAgICAgYSB0ZW1wb3JhcnkgRGVjb21wb3NlZEV4cHJlc3Npb24sIHdoaWNoIGluIHR1cm4gaG9sZHMgcmVmZXJlbmNlcyB0bworICAgIC8vICAgICAgICAgb3BlcmFuZHMsIHBvc3NpYmx5IHRlbXBvcmFyeSBhcyB3ZWxsLgorICAgIC8vICAgICAgICAgSXQgc2hvdWxkIGltbWVkaWF0ZWx5IGJlIHBhc3NlZCB0byBoYW5kbGVSZXN1bHQ7IGlmIHRoZSBleHByZXNzaW9uCisgICAgLy8gICAgICAgICBuZWVkcyB0byBiZSByZXBvcnRlZCwgaXRzIHN0cmluZyBleHBhbnNpb24gbXVzdCBiZSBjb21wb3NlZCBiZWZvcmUKKyAgICAvLyAgICAgICAgIHRoZSB0ZW1wb3JhcmllcyBhcmUgZGVzdHJveWVkLgorICAgIEFzc2VydGlvblJlc3VsdCBSZXN1bHRCdWlsZGVyOjpidWlsZCggRGVjb21wb3NlZEV4cHJlc3Npb24gY29uc3QmIGV4cHIgKSBjb25zdAorICAgIHsKKyAgICAgICAgYXNzZXJ0KCBtX2RhdGEucmVzdWx0VHlwZSAhPSBSZXN1bHRXYXM6OlVua25vd24gKTsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSBkYXRhID0gbV9kYXRhOworCisgICAgICAgIC8vIEZsaXAgYm9vbCByZXN1bHRzIGlmIEZhbHNlVGVzdCBmbGFnIGlzIHNldAorICAgICAgICBpZiggaXNGYWxzZVRlc3QoIG1fYXNzZXJ0aW9uSW5mby5yZXN1bHREaXNwb3NpdGlvbiApICkgeworICAgICAgICAgICAgZGF0YS5uZWdhdGUoIGV4cHIuaXNCaW5hcnlFeHByZXNzaW9uKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIGRhdGEubWVzc2FnZSA9IG1fc3RyZWFtLm9zcy5zdHIoKTsKKyAgICAgICAgZGF0YS5kZWNvbXBvc2VkRXhwcmVzc2lvbiA9ICZleHByOyAvLyBmb3IgbGF6eSByZWNvbnN0cnVjdGlvbgorICAgICAgICByZXR1cm4gQXNzZXJ0aW9uUmVzdWx0KCBtX2Fzc2VydGlvbkluZm8sIGRhdGEgKTsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OnJlY29uc3RydWN0RXhwcmVzc2lvbiggc3RkOjpzdHJpbmcmIGRlc3QgKSBjb25zdCB7CisgICAgICAgIGRlc3QgPSBtX2Fzc2VydGlvbkluZm8uY2FwdHVyZWRFeHByZXNzaW9uOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6c2V0RXhjZXB0aW9uR3VhcmQoKSB7CisgICAgICAgIG1fZ3VhcmRFeGNlcHRpb24gPSB0cnVlOworICAgIH0KKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OnVuc2V0RXhjZXB0aW9uR3VhcmQoKSB7CisgICAgICAgIG1fZ3VhcmRFeGNlcHRpb24gPSBmYWxzZTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGFnX2FsaWFzX3JlZ2lzdHJ5LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEFHX0FMSUFTX1JFR0lTVFJZX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgVGFnQWxpYXNSZWdpc3RyeTo6flRhZ0FsaWFzUmVnaXN0cnkoKSB7fQorCisgICAgT3B0aW9uPFRhZ0FsaWFzPiBUYWdBbGlhc1JlZ2lzdHJ5OjpmaW5kKCBzdGQ6OnN0cmluZyBjb25zdCYgYWxpYXMgKSBjb25zdCB7CisgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUYWdBbGlhcz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZWdpc3RyeS5maW5kKCBhbGlhcyApOworICAgICAgICBpZiggaXQgIT0gbV9yZWdpc3RyeS5lbmQoKSApCisgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE9wdGlvbjxUYWdBbGlhcz4oKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBUYWdBbGlhc1JlZ2lzdHJ5OjpleHBhbmRBbGlhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgdW5leHBhbmRlZFRlc3RTcGVjICkgY29uc3QgeworICAgICAgICBzdGQ6OnN0cmluZyBleHBhbmRlZFRlc3RTcGVjID0gdW5leHBhbmRlZFRlc3RTcGVjOworICAgICAgICBmb3IoIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUYWdBbGlhcz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZWdpc3RyeS5iZWdpbigpLCBpdEVuZCA9IG1fcmVnaXN0cnkuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHBvcyA9IGV4cGFuZGVkVGVzdFNwZWMuZmluZCggaXQtPmZpcnN0ICk7CisgICAgICAgICAgICBpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkgeworICAgICAgICAgICAgICAgIGV4cGFuZGVkVGVzdFNwZWMgPSAgZXhwYW5kZWRUZXN0U3BlYy5zdWJzdHIoIDAsIHBvcyApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQudGFnICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkVGVzdFNwZWMuc3Vic3RyKCBwb3MgKyBpdC0+Zmlyc3Quc2l6ZSgpICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV4cGFuZGVkVGVzdFNwZWM7CisgICAgfQorCisgICAgdm9pZCBUYWdBbGlhc1JlZ2lzdHJ5OjphZGQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcywgc3RkOjpzdHJpbmcgY29uc3QmIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgeworCisgICAgICAgIGlmKCAhc3RhcnRzV2l0aCggYWxpYXMsICJbQCIgKSB8fCAhZW5kc1dpdGgoIGFsaWFzLCAnXScgKSApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgQ29sb3VyKCBDb2xvdXI6OlJlZCApCisgICAgICAgICAgICAgICAgPDwgImVycm9yOiB0YWcgYWxpYXMsIFwiIiA8PCBhbGlhcyA8PCAiXCIgaXMgbm90IG9mIHRoZSBmb3JtIFtAYWxpYXMgbmFtZV0uXG4iCisgICAgICAgICAgICAgICAgPDwgQ29sb3VyKCBDb2xvdXI6OkZpbGVOYW1lICkKKyAgICAgICAgICAgICAgICA8PCBsaW5lSW5mbyA8PCAnXG4nOworICAgICAgICAgICAgdGhyb3cgc3RkOjpkb21haW5fZXJyb3IoIG9zcy5zdHIoKS5jX3N0cigpICk7CisgICAgICAgIH0KKyAgICAgICAgaWYoICFtX3JlZ2lzdHJ5Lmluc2VydCggc3RkOjptYWtlX3BhaXIoIGFsaWFzLCBUYWdBbGlhcyggdGFnLCBsaW5lSW5mbyApICkgKS5zZWNvbmQgKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8IENvbG91ciggQ29sb3VyOjpSZWQgKQorICAgICAgICAgICAgICAgIDw8ICJlcnJvcjogdGFnIGFsaWFzLCBcIiIgPDwgYWxpYXMgPDwgIlwiIGFscmVhZHkgcmVnaXN0ZXJlZC5cbiIKKyAgICAgICAgICAgICAgICA8PCAiXHRGaXJzdCBzZWVuIGF0ICIKKyAgICAgICAgICAgICAgICA8PCBDb2xvdXIoIENvbG91cjo6UmVkICkgPDwgZmluZChhbGlhcyktPmxpbmVJbmZvIDw8ICdcbicKKyAgICAgICAgICAgICAgICA8PCBDb2xvdXIoIENvbG91cjo6UmVkICkgPDwgIlx0UmVkZWZpbmVkIGF0ICIKKyAgICAgICAgICAgICAgICA8PCBDb2xvdXIoIENvbG91cjo6RmlsZU5hbWUpIDw8IGxpbmVJbmZvIDw8ICdcbic7CisgICAgICAgICAgICB0aHJvdyBzdGQ6OmRvbWFpbl9lcnJvciggb3NzLnN0cigpLmNfc3RyKCkgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIElUYWdBbGlhc1JlZ2lzdHJ5Ojp+SVRhZ0FsaWFzUmVnaXN0cnkoKSB7fQorCisgICAgSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QmIElUYWdBbGlhc1JlZ2lzdHJ5OjpnZXQoKSB7CisgICAgICAgIHJldHVybiBnZXRSZWdpc3RyeUh1YigpLmdldFRhZ0FsaWFzUmVnaXN0cnkoKTsKKyAgICB9CisKKyAgICBSZWdpc3RyYXJGb3JUYWdBbGlhc2VzOjpSZWdpc3RyYXJGb3JUYWdBbGlhc2VzKCBjaGFyIGNvbnN0KiBhbGlhcywgY2hhciBjb25zdCogdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKSB7CisgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyVGFnQWxpYXMoIGFsaWFzLCB0YWcsIGxpbmVJbmZvICk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX21hdGNoZXJzX3N0cmluZy5ocHAKKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBNYXRjaGVycyB7CisKKyAgICBuYW1lc3BhY2UgU3RkU3RyaW5nIHsKKworICAgICAgICBDYXNlZFN0cmluZzo6Q2FzZWRTdHJpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgKQorICAgICAgICA6ICAgbV9jYXNlU2Vuc2l0aXZpdHkoIGNhc2VTZW5zaXRpdml0eSApLAorICAgICAgICAgICAgbV9zdHIoIGFkanVzdFN0cmluZyggc3RyICkgKQorICAgICAgICB7fQorICAgICAgICBzdGQ6OnN0cmluZyBDYXNlZFN0cmluZzo6YWRqdXN0U3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY2FzZVNlbnNpdGl2aXR5ID09IENhc2VTZW5zaXRpdmU6Ok5vCisgICAgICAgICAgICAgICAgICAgPyB0b0xvd2VyKCBzdHIgKQorICAgICAgICAgICAgICAgICAgIDogc3RyOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIENhc2VkU3RyaW5nOjpjYXNlU2Vuc2l0aXZpdHlTdWZmaXgoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jYXNlU2Vuc2l0aXZpdHkgPT0gQ2FzZVNlbnNpdGl2ZTo6Tm8KKyAgICAgICAgICAgICAgICAgICA/ICIgKGNhc2UgaW5zZW5zaXRpdmUpIgorICAgICAgICAgICAgICAgICAgIDogc3RkOjpzdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ01hdGNoZXJCYXNlOjpTdHJpbmdNYXRjaGVyQmFzZSggc3RkOjpzdHJpbmcgY29uc3QmIG9wZXJhdGlvbiwgQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKQorICAgICAgICA6IG1fY29tcGFyYXRvciggY29tcGFyYXRvciApLAorICAgICAgICAgIG1fb3BlcmF0aW9uKCBvcGVyYXRpb24gKSB7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnN0cmluZyBTdHJpbmdNYXRjaGVyQmFzZTo6ZGVzY3JpYmUoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uLnJlc2VydmUoNSArIG1fb3BlcmF0aW9uLnNpemUoKSArIG1fY29tcGFyYXRvci5tX3N0ci5zaXplKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY29tcGFyYXRvci5jYXNlU2Vuc2l0aXZpdHlTdWZmaXgoKS5zaXplKCkpOworICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gbV9vcGVyYXRpb247CisgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiOiBcIiI7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSBtX2NvbXBhcmF0b3IubV9zdHI7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiXCIiOworICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gbV9jb21wYXJhdG9yLmNhc2VTZW5zaXRpdml0eVN1ZmZpeCgpOworICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOworICAgICAgICB9CisKKyAgICAgICAgRXF1YWxzTWF0Y2hlcjo6RXF1YWxzTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKSA6IFN0cmluZ01hdGNoZXJCYXNlKCAiZXF1YWxzIiwgY29tcGFyYXRvciApIHt9CisKKyAgICAgICAgYm9vbCBFcXVhbHNNYXRjaGVyOjptYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2NvbXBhcmF0b3IuYWRqdXN0U3RyaW5nKCBzb3VyY2UgKSA9PSBtX2NvbXBhcmF0b3IubV9zdHI7CisgICAgICAgIH0KKworICAgICAgICBDb250YWluc01hdGNoZXI6OkNvbnRhaW5zTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKSA6IFN0cmluZ01hdGNoZXJCYXNlKCAiY29udGFpbnMiLCBjb21wYXJhdG9yICkge30KKworICAgICAgICBib29sIENvbnRhaW5zTWF0Y2hlcjo6bWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gY29udGFpbnMoIG1fY29tcGFyYXRvci5hZGp1c3RTdHJpbmcoIHNvdXJjZSApLCBtX2NvbXBhcmF0b3IubV9zdHIgKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0YXJ0c1dpdGhNYXRjaGVyOjpTdGFydHNXaXRoTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKSA6IFN0cmluZ01hdGNoZXJCYXNlKCAic3RhcnRzIHdpdGgiLCBjb21wYXJhdG9yICkge30KKworICAgICAgICBib29sIFN0YXJ0c1dpdGhNYXRjaGVyOjptYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzdGFydHNXaXRoKCBtX2NvbXBhcmF0b3IuYWRqdXN0U3RyaW5nKCBzb3VyY2UgKSwgbV9jb21wYXJhdG9yLm1fc3RyICk7CisgICAgICAgIH0KKworICAgICAgICBFbmRzV2l0aE1hdGNoZXI6OkVuZHNXaXRoTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKSA6IFN0cmluZ01hdGNoZXJCYXNlKCAiZW5kcyB3aXRoIiwgY29tcGFyYXRvciApIHt9CisKKyAgICAgICAgYm9vbCBFbmRzV2l0aE1hdGNoZXI6Om1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGVuZHNXaXRoKCBtX2NvbXBhcmF0b3IuYWRqdXN0U3RyaW5nKCBzb3VyY2UgKSwgbV9jb21wYXJhdG9yLm1fc3RyICk7CisgICAgICAgIH0KKworICAgIH0gLy8gbmFtZXNwYWNlIFN0ZFN0cmluZworCisgICAgU3RkU3RyaW5nOjpFcXVhbHNNYXRjaGVyIEVxdWFscyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApIHsKKyAgICAgICAgcmV0dXJuIFN0ZFN0cmluZzo6RXF1YWxzTWF0Y2hlciggU3RkU3RyaW5nOjpDYXNlZFN0cmluZyggc3RyLCBjYXNlU2Vuc2l0aXZpdHkpICk7CisgICAgfQorICAgIFN0ZFN0cmluZzo6Q29udGFpbnNNYXRjaGVyIENvbnRhaW5zKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICkgeworICAgICAgICByZXR1cm4gU3RkU3RyaW5nOjpDb250YWluc01hdGNoZXIoIFN0ZFN0cmluZzo6Q2FzZWRTdHJpbmcoIHN0ciwgY2FzZVNlbnNpdGl2aXR5KSApOworICAgIH0KKyAgICBTdGRTdHJpbmc6OkVuZHNXaXRoTWF0Y2hlciBFbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApIHsKKyAgICAgICAgcmV0dXJuIFN0ZFN0cmluZzo6RW5kc1dpdGhNYXRjaGVyKCBTdGRTdHJpbmc6OkNhc2VkU3RyaW5nKCBzdHIsIGNhc2VTZW5zaXRpdml0eSkgKTsKKyAgICB9CisgICAgU3RkU3RyaW5nOjpTdGFydHNXaXRoTWF0Y2hlciBTdGFydHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICkgeworICAgICAgICByZXR1cm4gU3RkU3RyaW5nOjpTdGFydHNXaXRoTWF0Y2hlciggU3RkU3RyaW5nOjpDYXNlZFN0cmluZyggc3RyLCBjYXNlU2Vuc2l0aXZpdHkpICk7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBNYXRjaGVycworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9yZXBvcnRlcnMvY2F0Y2hfcmVwb3J0ZXJfbXVsdGkuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9NVUxUSV9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworY2xhc3MgTXVsdGlwbGVSZXBvcnRlcnMgOiBwdWJsaWMgU2hhcmVkSW1wbDxJU3RyZWFtaW5nUmVwb3J0ZXI+IHsKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+ID4gUmVwb3J0ZXJzOworICAgIFJlcG9ydGVycyBtX3JlcG9ydGVyczsKKworcHVibGljOgorICAgIHZvaWQgYWRkKCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBjb25zdCYgcmVwb3J0ZXIgKSB7CisgICAgICAgIG1fcmVwb3J0ZXJzLnB1c2hfYmFjayggcmVwb3J0ZXIgKTsKKyAgICB9CisKK3B1YmxpYzogLy8gSVN0cmVhbWluZ1JlcG9ydGVyCisKKyAgICB2aXJ0dWFsIFJlcG9ydGVyUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIHJldHVybiBtX3JlcG9ydGVyc1swXS0+Z2V0UHJlZmVyZW5jZXMoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHNwZWMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+bm9NYXRjaGluZ1Rlc3RDYXNlcyggc3BlYyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiB0ZXN0UnVuSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT50ZXN0UnVuU3RhcnRpbmcoIHRlc3RSdW5JbmZvICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT50ZXN0R3JvdXBTdGFydGluZyggZ3JvdXBJbmZvICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+dGVzdENhc2VTdGFydGluZyggdGVzdEluZm8gKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+c2VjdGlvblN0YXJ0aW5nKCBzZWN0aW9uSW5mbyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25TdGFydGluZyggQXNzZXJ0aW9uSW5mbyBjb25zdCYgYXNzZXJ0aW9uSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT5hc3NlcnRpb25TdGFydGluZyggYXNzZXJ0aW9uSW5mbyApOworICAgIH0KKworICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIGlmIHRoZSBtZXNzYWdlcyBidWZmZXIgc2hvdWxkIGJlIGNsZWFyZWQ6CisgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgYXNzZXJ0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGJvb2wgY2xlYXJCdWZmZXIgPSBmYWxzZTsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgIGNsZWFyQnVmZmVyIHw9ICgqaXQpLT5hc3NlcnRpb25FbmRlZCggYXNzZXJ0aW9uU3RhdHMgKTsKKyAgICAgICAgcmV0dXJuIGNsZWFyQnVmZmVyOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnNlY3Rpb25FbmRlZCggc2VjdGlvblN0YXRzICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+dGVzdENhc2VFbmRlZCggdGVzdENhc2VTdGF0cyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnRlc3RHcm91cEVuZGVkKCB0ZXN0R3JvdXBTdGF0cyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgdGVzdFJ1blN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnRlc3RSdW5FbmRlZCggdGVzdFJ1blN0YXRzICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHNraXBUZXN0KCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnNraXBUZXN0KCB0ZXN0SW5mbyApOworICAgIH0KKworICAgIHZpcnR1YWwgTXVsdGlwbGVSZXBvcnRlcnMqIHRyeUFzTXVsdGkoKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworfTsKKworUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gYWRkUmVwb3J0ZXIoIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGNvbnN0JiBleGlzdGluZ1JlcG9ydGVyLCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBjb25zdCYgYWRkaXRpb25hbFJlcG9ydGVyICkgeworICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IHJlc3VsdGluZ1JlcG9ydGVyOworCisgICAgaWYoIGV4aXN0aW5nUmVwb3J0ZXIgKSB7CisgICAgICAgIE11bHRpcGxlUmVwb3J0ZXJzKiBtdWx0aSA9IGV4aXN0aW5nUmVwb3J0ZXItPnRyeUFzTXVsdGkoKTsKKyAgICAgICAgaWYoICFtdWx0aSApIHsKKyAgICAgICAgICAgIG11bHRpID0gbmV3IE11bHRpcGxlUmVwb3J0ZXJzOworICAgICAgICAgICAgcmVzdWx0aW5nUmVwb3J0ZXIgPSBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiggbXVsdGkgKTsKKyAgICAgICAgICAgIGlmKCBleGlzdGluZ1JlcG9ydGVyICkKKyAgICAgICAgICAgICAgICBtdWx0aS0+YWRkKCBleGlzdGluZ1JlcG9ydGVyICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0aW5nUmVwb3J0ZXIgPSBleGlzdGluZ1JlcG9ydGVyOworICAgICAgICBtdWx0aS0+YWRkKCBhZGRpdGlvbmFsUmVwb3J0ZXIgKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXN1bHRpbmdSZXBvcnRlciA9IGFkZGl0aW9uYWxSZXBvcnRlcjsKKworICAgIHJldHVybiByZXN1bHRpbmdSZXBvcnRlcjsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9yZXBvcnRlcnMvY2F0Y2hfcmVwb3J0ZXJfeG1sLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfWE1MX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVwb3J0ZXJfYmFzZXMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9CQVNFU19IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8Y2Zsb2F0PgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIG5hbWVzcGFjZSB7CisgICAgICAgIC8vIEJlY2F1c2UgZm9ybWF0dGluZyB1c2luZyBjKysgc3RyZWFtcyBpcyBzdGF0ZWZ1bCwgZHJvcCBkb3duIHRvIEMgaXMgcmVxdWlyZWQKKyAgICAgICAgLy8gQWx0ZXJuYXRpdmVseSB3ZSBjb3VsZCB1c2Ugc3RyaW5nc3RyZWFtLCBidXQgaXRzIHBlcmZvcm1hbmNlIGlzLi4uIG5vdCBnb29kLgorICAgICAgICBzdGQ6OnN0cmluZyBnZXRGb3JtYXR0ZWREdXJhdGlvbiggZG91YmxlIGR1cmF0aW9uICkgeworICAgICAgICAgICAgLy8gTWF4IGV4cG9uZW50ICsgMSBpcyByZXF1aXJlZCB0byByZXByZXNlbnQgdGhlIHdob2xlIHBhcnQKKyAgICAgICAgICAgIC8vICsgMSBmb3IgZGVjaW1hbCBwb2ludAorICAgICAgICAgICAgLy8gKyAzIGZvciB0aGUgMyBkZWNpbWFsIHBsYWNlcworICAgICAgICAgICAgLy8gKyAxIGZvciBudWxsIHRlcm1pbmF0b3IKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBtYXhEb3VibGVTaXplID0gREJMX01BWF8xMF9FWFAgKyAxICsgMSArIDMgKyAxOworICAgICAgICAgICAgY2hhciBidWZmZXJbbWF4RG91YmxlU2l6ZV07CisKKyAgICAgICAgICAgIC8vIFNhdmUgcHJldmlvdXMgZXJybm8sIHRvIHByZXZlbnQgc3ByaW50ZiBmcm9tIG92ZXJ3cml0aW5nIGl0CisgICAgICAgICAgICBFcnJub0d1YXJkIGd1YXJkOworI2lmZGVmIF9NU0NfVkVSCisgICAgICAgICAgICBzcHJpbnRmX3MoYnVmZmVyLCAiJS4zZiIsIGR1cmF0aW9uKTsKKyNlbHNlCisgICAgICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiUuM2YiLCBkdXJhdGlvbik7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZyhidWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RydWN0IFN0cmVhbWluZ1JlcG9ydGVyQmFzZSA6IFNoYXJlZEltcGw8SVN0cmVhbWluZ1JlcG9ydGVyPiB7CisKKyAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyApCisgICAgICAgIDogICBtX2NvbmZpZyggX2NvbmZpZy5mdWxsQ29uZmlnKCkgKSwKKyAgICAgICAgICAgIHN0cmVhbSggX2NvbmZpZy5zdHJlYW0oKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXJQcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBSZXBvcnRlclByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fcmVwb3J0ZXJQcmVmczsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgflN0cmVhbWluZ1JlcG9ydGVyQmFzZSgpIENBVENIX09WRVJSSURFOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiBfdGVzdFJ1bkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBjdXJyZW50VGVzdFJ1bkluZm8gPSBfdGVzdFJ1bkluZm87CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIF9ncm91cEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBjdXJyZW50R3JvdXBJbmZvID0gX2dyb3VwSW5mbzsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIF90ZXN0SW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0Q2FzZUluZm8gPSBfdGVzdEluZm87CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25TdGFydGluZyggU2VjdGlvbkluZm8gY29uc3QmIF9zZWN0aW9uSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIG1fc2VjdGlvblN0YWNrLnB1c2hfYmFjayggX3NlY3Rpb25JbmZvICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIC8qIF9zZWN0aW9uU3RhdHMgKi8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBtX3NlY3Rpb25TdGFjay5wb3BfYmFjaygpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiAvKiBfdGVzdENhc2VTdGF0cyAqLyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0Q2FzZUluZm8ucmVzZXQoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiAvKiBfdGVzdEdyb3VwU3RhdHMgKi8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBjdXJyZW50R3JvdXBJbmZvLnJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiAvKiBfdGVzdFJ1blN0YXRzICovICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgY3VycmVudFRlc3RDYXNlSW5mby5yZXNldCgpOworICAgICAgICAgICAgY3VycmVudEdyb3VwSW5mby5yZXNldCgpOworICAgICAgICAgICAgY3VycmVudFRlc3RSdW5JbmZvLnJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2tpcFRlc3QoIFRlc3RDYXNlSW5mbyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAvLyBEb24ndCBkbyBhbnl0aGluZyB3aXRoIHRoaXMgYnkgZGVmYXVsdC4KKyAgICAgICAgICAgIC8vIEl0IGNhbiBvcHRpb25hbGx5IGJlIG92ZXJyaWRkZW4gaW4gdGhlIGRlcml2ZWQgY2xhc3MuCisgICAgICAgIH0KKworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gbV9jb25maWc7CisgICAgICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtOworCisgICAgICAgIExhenlTdGF0PFRlc3RSdW5JbmZvPiBjdXJyZW50VGVzdFJ1bkluZm87CisgICAgICAgIExhenlTdGF0PEdyb3VwSW5mbz4gY3VycmVudEdyb3VwSW5mbzsKKyAgICAgICAgTGF6eVN0YXQ8VGVzdENhc2VJbmZvPiBjdXJyZW50VGVzdENhc2VJbmZvOworCisgICAgICAgIHN0ZDo6dmVjdG9yPFNlY3Rpb25JbmZvPiBtX3NlY3Rpb25TdGFjazsKKyAgICAgICAgUmVwb3J0ZXJQcmVmZXJlbmNlcyBtX3JlcG9ydGVyUHJlZnM7CisgICAgfTsKKworICAgIHN0cnVjdCBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlIDogU2hhcmVkSW1wbDxJU3RyZWFtaW5nUmVwb3J0ZXI+IHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ2hpbGROb2RlVD4KKyAgICAgICAgc3RydWN0IE5vZGUgOiBTaGFyZWRJbXBsPD4geworICAgICAgICAgICAgZXhwbGljaXQgTm9kZSggVCBjb25zdCYgX3ZhbHVlICkgOiB2YWx1ZSggX3ZhbHVlICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgfk5vZGUoKSB7fQorCisgICAgICAgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFB0cjxDaGlsZE5vZGVUPiA+IENoaWxkTm9kZXM7CisgICAgICAgICAgICBUIHZhbHVlOworICAgICAgICAgICAgQ2hpbGROb2RlcyBjaGlsZHJlbjsKKyAgICAgICAgfTsKKyAgICAgICAgc3RydWN0IFNlY3Rpb25Ob2RlIDogU2hhcmVkSW1wbDw+IHsKKyAgICAgICAgICAgIGV4cGxpY2l0IFNlY3Rpb25Ob2RlKCBTZWN0aW9uU3RhdHMgY29uc3QmIF9zdGF0cyApIDogc3RhdHMoIF9zdGF0cyApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIH5TZWN0aW9uTm9kZSgpOworCisgICAgICAgICAgICBib29sIG9wZXJhdG9yID09ICggU2VjdGlvbk5vZGUgY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0cy5zZWN0aW9uSW5mby5saW5lSW5mbyA9PSBvdGhlci5zdGF0cy5zZWN0aW9uSW5mby5saW5lSW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IgPT0gKCBQdHI8U2VjdGlvbk5vZGU+IGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3BlcmF0b3I9PSggKm90aGVyICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNlY3Rpb25TdGF0cyBzdGF0czsKKyAgICAgICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8UHRyPFNlY3Rpb25Ob2RlPiA+IENoaWxkU2VjdGlvbnM7CisgICAgICAgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPEFzc2VydGlvblN0YXRzPiBBc3NlcnRpb25zOworICAgICAgICAgICAgQ2hpbGRTZWN0aW9ucyBjaGlsZFNlY3Rpb25zOworICAgICAgICAgICAgQXNzZXJ0aW9ucyBhc3NlcnRpb25zOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3RkT3V0OworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3RkRXJyOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBCeVNlY3Rpb25JbmZvIHsKKyAgICAgICAgICAgIEJ5U2VjdGlvbkluZm8oIFNlY3Rpb25JbmZvIGNvbnN0JiBvdGhlciApIDogbV9vdGhlciggb3RoZXIgKSB7fQorICAgICAgICAgICAgQnlTZWN0aW9uSW5mbyggQnlTZWN0aW9uSW5mbyBjb25zdCYgb3RoZXIgKSA6IG1fb3RoZXIoIG90aGVyLm1fb3RoZXIgKSB7fQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvcigpICggUHRyPFNlY3Rpb25Ob2RlPiBjb25zdCYgbm9kZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS0+c3RhdHMuc2VjdGlvbkluZm8ubGluZUluZm8gPT0gbV9vdGhlci5saW5lSW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHZvaWQgb3BlcmF0b3I9KCBCeVNlY3Rpb25JbmZvIGNvbnN0JiApOworICAgICAgICAgICAgU2VjdGlvbkluZm8gY29uc3QmIG1fb3RoZXI7CisgICAgICAgIH07CisKKyAgICAgICAgdHlwZWRlZiBOb2RlPFRlc3RDYXNlU3RhdHMsIFNlY3Rpb25Ob2RlPiBUZXN0Q2FzZU5vZGU7CisgICAgICAgIHR5cGVkZWYgTm9kZTxUZXN0R3JvdXBTdGF0cywgVGVzdENhc2VOb2RlPiBUZXN0R3JvdXBOb2RlOworICAgICAgICB0eXBlZGVmIE5vZGU8VGVzdFJ1blN0YXRzLCBUZXN0R3JvdXBOb2RlPiBUZXN0UnVuTm9kZTsKKworICAgICAgICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyApCisgICAgICAgIDogICBtX2NvbmZpZyggX2NvbmZpZy5mdWxsQ29uZmlnKCkgKSwKKyAgICAgICAgICAgIHN0cmVhbSggX2NvbmZpZy5zdHJlYW0oKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXJQcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIH5DdW11bGF0aXZlUmVwb3J0ZXJCYXNlKCk7CisKKyAgICAgICAgdmlydHVhbCBSZXBvcnRlclByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fcmVwb3J0ZXJQcmVmczsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFNlY3Rpb25TdGF0cyBpbmNvbXBsZXRlU3RhdHMoIHNlY3Rpb25JbmZvLCBDb3VudHMoKSwgMCwgZmFsc2UgKTsKKyAgICAgICAgICAgIFB0cjxTZWN0aW9uTm9kZT4gbm9kZTsKKyAgICAgICAgICAgIGlmKCBtX3NlY3Rpb25TdGFjay5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIGlmKCAhbV9yb290U2VjdGlvbiApCisgICAgICAgICAgICAgICAgICAgIG1fcm9vdFNlY3Rpb24gPSBuZXcgU2VjdGlvbk5vZGUoIGluY29tcGxldGVTdGF0cyApOworICAgICAgICAgICAgICAgIG5vZGUgPSBtX3Jvb3RTZWN0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgU2VjdGlvbk5vZGUmIHBhcmVudE5vZGUgPSAqbV9zZWN0aW9uU3RhY2suYmFjaygpOworICAgICAgICAgICAgICAgIFNlY3Rpb25Ob2RlOjpDaGlsZFNlY3Rpb25zOjpjb25zdF9pdGVyYXRvciBpdCA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZmluZF9pZiggICBwYXJlbnROb2RlLmNoaWxkU2VjdGlvbnMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuY2hpbGRTZWN0aW9ucy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5U2VjdGlvbkluZm8oIHNlY3Rpb25JbmZvICkgKTsKKyAgICAgICAgICAgICAgICBpZiggaXQgPT0gcGFyZW50Tm9kZS5jaGlsZFNlY3Rpb25zLmVuZCgpICkgeworICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV3IFNlY3Rpb25Ob2RlKCBpbmNvbXBsZXRlU3RhdHMgKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5jaGlsZFNlY3Rpb25zLnB1c2hfYmFjayggbm9kZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSAqaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3NlY3Rpb25TdGFjay5wdXNoX2JhY2soIG5vZGUgKTsKKyAgICAgICAgICAgIG1fZGVlcGVzdFNlY3Rpb24gPSBub2RlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgYXNzZXJ0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBhc3NlcnQoICFtX3NlY3Rpb25TdGFjay5lbXB0eSgpICk7CisgICAgICAgICAgICBTZWN0aW9uTm9kZSYgc2VjdGlvbk5vZGUgPSAqbV9zZWN0aW9uU3RhY2suYmFjaygpOworICAgICAgICAgICAgc2VjdGlvbk5vZGUuYXNzZXJ0aW9ucy5wdXNoX2JhY2soIGFzc2VydGlvblN0YXRzICk7CisgICAgICAgICAgICAvLyBBc3NlcnRpb25SZXN1bHQgaG9sZHMgYSBwb2ludGVyIHRvIGEgdGVtcG9yYXJ5IERlY29tcG9zZWRFeHByZXNzaW9uLAorICAgICAgICAgICAgLy8gd2hpY2ggZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCkgY2FsbHMgdG8gYnVpbGQgdGhlIGV4cHJlc3Npb24gc3RyaW5nLgorICAgICAgICAgICAgLy8gT3VyIHNlY3Rpb24gc3RhY2sgY29weSBvZiB0aGUgYXNzZXJ0aW9uUmVzdWx0IHdpbGwgbGlrZWx5IG91dGxpdmUgdGhlCisgICAgICAgICAgICAvLyB0ZW1wb3JhcnksIHNvIGl0IG11c3QgYmUgZXhwYW5kZWQgb3IgZGlzY2FyZGVkIG5vdyB0byBhdm9pZCBjYWxsaW5nCisgICAgICAgICAgICAvLyBhIGRlc3Ryb3llZCBvYmplY3QgbGF0ZXIuCisgICAgICAgICAgICBwcmVwYXJlRXhwYW5kZWRFeHByZXNzaW9uKCBzZWN0aW9uTm9kZS5hc3NlcnRpb25zLmJhY2soKS5hc3NlcnRpb25SZXN1bHQgKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgYXNzZXJ0KCAhbV9zZWN0aW9uU3RhY2suZW1wdHkoKSApOworICAgICAgICAgICAgU2VjdGlvbk5vZGUmIG5vZGUgPSAqbV9zZWN0aW9uU3RhY2suYmFjaygpOworICAgICAgICAgICAgbm9kZS5zdGF0cyA9IHNlY3Rpb25TdGF0czsKKyAgICAgICAgICAgIG1fc2VjdGlvblN0YWNrLnBvcF9iYWNrKCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBQdHI8VGVzdENhc2VOb2RlPiBub2RlID0gbmV3IFRlc3RDYXNlTm9kZSggdGVzdENhc2VTdGF0cyApOworICAgICAgICAgICAgYXNzZXJ0KCBtX3NlY3Rpb25TdGFjay5zaXplKCkgPT0gMCApOworICAgICAgICAgICAgbm9kZS0+Y2hpbGRyZW4ucHVzaF9iYWNrKCBtX3Jvb3RTZWN0aW9uICk7CisgICAgICAgICAgICBtX3Rlc3RDYXNlcy5wdXNoX2JhY2soIG5vZGUgKTsKKyAgICAgICAgICAgIG1fcm9vdFNlY3Rpb24ucmVzZXQoKTsKKworICAgICAgICAgICAgYXNzZXJ0KCBtX2RlZXBlc3RTZWN0aW9uICk7CisgICAgICAgICAgICBtX2RlZXBlc3RTZWN0aW9uLT5zdGRPdXQgPSB0ZXN0Q2FzZVN0YXRzLnN0ZE91dDsKKyAgICAgICAgICAgIG1fZGVlcGVzdFNlY3Rpb24tPnN0ZEVyciA9IHRlc3RDYXNlU3RhdHMuc3RkRXJyOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgUHRyPFRlc3RHcm91cE5vZGU+IG5vZGUgPSBuZXcgVGVzdEdyb3VwTm9kZSggdGVzdEdyb3VwU3RhdHMgKTsKKyAgICAgICAgICAgIG5vZGUtPmNoaWxkcmVuLnN3YXAoIG1fdGVzdENhc2VzICk7CisgICAgICAgICAgICBtX3Rlc3RHcm91cHMucHVzaF9iYWNrKCBub2RlICk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiB0ZXN0UnVuU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBQdHI8VGVzdFJ1bk5vZGU+IG5vZGUgPSBuZXcgVGVzdFJ1bk5vZGUoIHRlc3RSdW5TdGF0cyApOworICAgICAgICAgICAgbm9kZS0+Y2hpbGRyZW4uc3dhcCggbV90ZXN0R3JvdXBzICk7CisgICAgICAgICAgICBtX3Rlc3RSdW5zLnB1c2hfYmFjayggbm9kZSApOworICAgICAgICAgICAgdGVzdFJ1bkVuZGVkQ3VtdWxhdGl2ZSgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWRDdW11bGF0aXZlKCkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBza2lwVGVzdCggVGVzdENhc2VJbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHByZXBhcmVFeHBhbmRlZEV4cHJlc3Npb24oIEFzc2VydGlvblJlc3VsdCYgcmVzdWx0ICkgY29uc3QgeworICAgICAgICAgICAgaWYoIHJlc3VsdC5pc09rKCkgKQorICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNjYXJkRGVjb21wb3NlZEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXN1bHQuZXhwYW5kRGVjb21wb3NlZEV4cHJlc3Npb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBtX2NvbmZpZzsKKyAgICAgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW07CisgICAgICAgIHN0ZDo6dmVjdG9yPEFzc2VydGlvblN0YXRzPiBtX2Fzc2VydGlvbnM7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPFB0cjxTZWN0aW9uTm9kZT4gPiA+IG1fc2VjdGlvbnM7CisgICAgICAgIHN0ZDo6dmVjdG9yPFB0cjxUZXN0Q2FzZU5vZGU+ID4gbV90ZXN0Q2FzZXM7CisgICAgICAgIHN0ZDo6dmVjdG9yPFB0cjxUZXN0R3JvdXBOb2RlPiA+IG1fdGVzdEdyb3VwczsKKworICAgICAgICBzdGQ6OnZlY3RvcjxQdHI8VGVzdFJ1bk5vZGU+ID4gbV90ZXN0UnVuczsKKworICAgICAgICBQdHI8U2VjdGlvbk5vZGU+IG1fcm9vdFNlY3Rpb247CisgICAgICAgIFB0cjxTZWN0aW9uTm9kZT4gbV9kZWVwZXN0U2VjdGlvbjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8UHRyPFNlY3Rpb25Ob2RlPiA+IG1fc2VjdGlvblN0YWNrOworICAgICAgICBSZXBvcnRlclByZWZlcmVuY2VzIG1fcmVwb3J0ZXJQcmVmczsKKworICAgIH07CisKKyAgICB0ZW1wbGF0ZTxjaGFyIEM+CisgICAgY2hhciBjb25zdCogZ2V0TGluZU9mQ2hhcnMoKSB7CisgICAgICAgIHN0YXRpYyBjaGFyIGxpbmVbQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEhdID0gezB9OworICAgICAgICBpZiggISpsaW5lICkgeworICAgICAgICAgICAgc3RkOjptZW1zZXQoIGxpbmUsIEMsIENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRILTEgKTsKKyAgICAgICAgICAgIGxpbmVbQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgtMV0gPSAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsaW5lOworICAgIH0KKworICAgIHN0cnVjdCBUZXN0RXZlbnRMaXN0ZW5lckJhc2UgOiBTdHJlYW1pbmdSZXBvcnRlckJhc2UgeworICAgICAgICBUZXN0RXZlbnRMaXN0ZW5lckJhc2UoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBfY29uZmlnICkKKyAgICAgICAgOiAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZSggX2NvbmZpZyApCisgICAgICAgIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9pbnRlcm5hbC9jYXRjaF9yZXBvcnRlcl9yZWdpc3RyYXJzLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfUkVHSVNUUkFSU19IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgTGVnYWN5UmVwb3J0ZXJSZWdpc3RyYXIgeworCisgICAgICAgIGNsYXNzIFJlcG9ydGVyRmFjdG9yeSA6IHB1YmxpYyBJUmVwb3J0ZXJGYWN0b3J5IHsKKyAgICAgICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9ydGVyKiBjcmVhdGUoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMZWdhY3lSZXBvcnRlckFkYXB0ZXIoIG5ldyBUKCBjb25maWcgKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBUOjpnZXREZXNjcmlwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgcHVibGljOgorCisgICAgICAgIExlZ2FjeVJlcG9ydGVyUmVnaXN0cmFyKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSApIHsKKyAgICAgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyUmVwb3J0ZXIoIG5hbWUsIG5ldyBSZXBvcnRlckZhY3RvcnkoKSApOworICAgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgUmVwb3J0ZXJSZWdpc3RyYXIgeworCisgICAgICAgIGNsYXNzIFJlcG9ydGVyRmFjdG9yeSA6IHB1YmxpYyBTaGFyZWRJbXBsPElSZXBvcnRlckZhY3Rvcnk+IHsKKworICAgICAgICAgICAgLy8gKioqIFBsZWFzZSBOb3RlICoqKjoKKyAgICAgICAgICAgIC8vIC0gSWYgeW91IGVuZCB1cCBoZXJlIGxvb2tpbmcgYXQgYSBjb21waWxlciBlcnJvciBiZWNhdXNlIGl0J3MgdHJ5aW5nIHRvIHJlZ2lzdGVyCisgICAgICAgICAgICAvLyB5b3VyIGN1c3RvbSByZXBvcnRlciBjbGFzcyBiZSBhd2FyZSB0aGF0IHRoZSBuYXRpdmUgcmVwb3J0ZXIgaW50ZXJmYWNlIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAvLyB0byBJU3RyZWFtaW5nUmVwb3J0ZXIuIFRoZSAibGVnYWN5IiBpbnRlcmZhY2UsIElSZXBvcnRlciwgaXMgc3RpbGwgc3VwcG9ydGVkIHZpYQorICAgICAgICAgICAgLy8gYW4gYWRhcHRlci4gSnVzdCB1c2UgUkVHSVNURVJfTEVHQUNZX1JFUE9SVEVSIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBhZGFwdGVyLgorICAgICAgICAgICAgLy8gSG93ZXZlciBwbGVhc2UgY29uc2lkZXIgdXBkYXRpbmcgdG8gdGhlIG5ldyBpbnRlcmZhY2UgYXMgdGhlIG9sZCBvbmUgaXMgbm93CisgICAgICAgICAgICAvLyBkZXByZWNhdGVkIGFuZCB3aWxsIHByb2JhYmx5IGJlIHJlbW92ZWQgcXVpdGUgc29vbiEKKyAgICAgICAgICAgIC8vIFBsZWFzZSBjb250YWN0IG1lIHZpYSBnaXRodWIgaWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucyBhdCBhbGwgYWJvdXQgdGhpcy4KKyAgICAgICAgICAgIC8vIEluIGZhY3QsIGlkZWFsbHksIHBsZWFzZSBjb250YWN0IG1lIGFueXdheSB0byBsZXQgbWUga25vdyB5b3UndmUgaGl0IHRoaXMgLSBhcyBJIGhhdmUKKyAgICAgICAgICAgIC8vIG5vIGlkZWEgd2hvIGlzIGFjdHVhbGx5IHVzaW5nIGN1c3RvbSByZXBvcnRlcnMgYXQgYWxsIChwb3NzaWJseSBuby1vbmUhKS4KKyAgICAgICAgICAgIC8vIFRoZSBuZXcgaW50ZXJmYWNlIGlzIGRlc2lnbmVkIHRvIG1pbmltaXNlIGV4cG9zdXJlIHRvIGludGVyZmFjZSBjaGFuZ2VzIGluIHRoZSBmdXR1cmUuCisgICAgICAgICAgICB2aXJ0dWFsIElTdHJlYW1pbmdSZXBvcnRlciogY3JlYXRlKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVCggY29uZmlnICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFQ6OmdldERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgUmVwb3J0ZXJSZWdpc3RyYXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lICkgeworICAgICAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJSZXBvcnRlciggbmFtZSwgbmV3IFJlcG9ydGVyRmFjdG9yeSgpICk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBMaXN0ZW5lclJlZ2lzdHJhciB7CisKKyAgICAgICAgY2xhc3MgTGlzdGVuZXJGYWN0b3J5IDogcHVibGljIFNoYXJlZEltcGw8SVJlcG9ydGVyRmFjdG9yeT4geworCisgICAgICAgICAgICB2aXJ0dWFsIElTdHJlYW1pbmdSZXBvcnRlciogY3JlYXRlKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVCggY29uZmlnICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgcHVibGljOgorCisgICAgICAgIExpc3RlbmVyUmVnaXN0cmFyKCkgeworICAgICAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJMaXN0ZW5lciggbmV3IExpc3RlbmVyRmFjdG9yeSgpICk7CisgICAgICAgIH0KKyAgICB9OworfQorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX0xFR0FDWV9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkgXAorICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OkxlZ2FjeVJlcG9ydGVyUmVnaXN0cmFyPHJlcG9ydGVyVHlwZT4gY2F0Y2hfaW50ZXJuYWxfUmVnaXN0cmFyRm9yIyNyZXBvcnRlclR5cGUoIG5hbWUgKTsgfQorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKSBcCisgICAgbmFtZXNwYWNleyBDYXRjaDo6UmVwb3J0ZXJSZWdpc3RyYXI8cmVwb3J0ZXJUeXBlPiBjYXRjaF9pbnRlcm5hbF9SZWdpc3RyYXJGb3IjI3JlcG9ydGVyVHlwZSggbmFtZSApOyB9CisKKy8vIERlcHJlY2F0ZWQgLSB1c2UgdGhlIGZvcm0gd2l0aG91dCBJTlRFUk5BTF8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfTElTVEVORVIoIGxpc3RlbmVyVHlwZSApIFwKKyAgICBuYW1lc3BhY2V7IENhdGNoOjpMaXN0ZW5lclJlZ2lzdHJhcjxsaXN0ZW5lclR5cGU+IGNhdGNoX2ludGVybmFsX1JlZ2lzdHJhckZvciMjbGlzdGVuZXJUeXBlOyB9CisKKyNkZWZpbmUgQ0FUQ0hfUkVHSVNURVJfTElTVEVORVIoIGxpc3RlbmVyVHlwZSApIFwKKyAgICBuYW1lc3BhY2V7IENhdGNoOjpMaXN0ZW5lclJlZ2lzdHJhcjxsaXN0ZW5lclR5cGU+IGNhdGNoX2ludGVybmFsX1JlZ2lzdHJhckZvciMjbGlzdGVuZXJUeXBlOyB9CisKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9pbnRlcm5hbC9jYXRjaF94bWx3cml0ZXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9YTUxXUklURVJfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8aW9tYW5pcD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFhtbEVuY29kZSB7CisgICAgcHVibGljOgorICAgICAgICBlbnVtIEZvcldoYXQgeyBGb3JUZXh0Tm9kZXMsIEZvckF0dHJpYnV0ZXMgfTsKKworICAgICAgICBYbWxFbmNvZGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIEZvcldoYXQgZm9yV2hhdCA9IEZvclRleHROb2RlcyApCisgICAgICAgIDogICBtX3N0ciggc3RyICksCisgICAgICAgICAgICBtX2ZvcldoYXQoIGZvcldoYXQgKQorICAgICAgICB7fQorCisgICAgICAgIHZvaWQgZW5jb2RlVG8oIHN0ZDo6b3N0cmVhbSYgb3MgKSBjb25zdCB7CisKKyAgICAgICAgICAgIC8vIEFwb3N0cm9waGUgZXNjYXBpbmcgbm90IG5lY2Vzc2FyeSBpZiB3ZSBhbHdheXMgdXNlICIgdG8gd3JpdGUgYXR0cmlidXRlcworICAgICAgICAgICAgLy8gKHNlZTogaHR0cDovL3d3dy53My5vcmcvVFIveG1sLyNzeW50YXgpCisKKyAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBtX3N0ci5zaXplKCk7ICsrIGkgKSB7CisgICAgICAgICAgICAgICAgY2hhciBjID0gbV9zdHJbaV07CisgICAgICAgICAgICAgICAgc3dpdGNoKCBjICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlICc8JzogICBvcyA8PCAiJmx0OyI7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICcmJzogICBvcyA8PCAiJmFtcDsiOyBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlICc+JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZTogaHR0cDovL3d3dy53My5vcmcvVFIveG1sLyNzeW50YXgKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpID4gMiAmJiBtX3N0cltpLTFdID09ICddJyAmJiBtX3N0cltpLTJdID09ICddJyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MgPDwgIiZndDsiOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zIDw8IGM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlICdcIic6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggbV9mb3JXaGF0ID09IEZvckF0dHJpYnV0ZXMgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zIDw8ICImcXVvdDsiOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zIDw8IGM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXNjYXBlIGNvbnRyb2wgY2hhcnMgLSBiYXNlZCBvbiBjb250cmlidXRpb24gYnkgQGVzcGVuYWxiIGluIFBSICM0NjUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBieSBAbXJwaSBQUiAjNTg4CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICggYyA+PSAwICYmIGMgPCAnXHgwOScgKSB8fCAoIGMgPiAnXHgwRCcgJiYgYyA8ICdceDIwJykgfHwgYz09J1x4N0YnICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQwNDEwNy93aHktYXJlLWNvbnRyb2wtY2hhcmFjdGVycy1pbGxlZ2FsLWluLXhtbC0xLTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcyA8PCAiXFx4IiA8PCBzdGQ6OnVwcGVyY2FzZSA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnNldHcoMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQ+KCBjICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MgPDwgYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIFhtbEVuY29kZSBjb25zdCYgeG1sRW5jb2RlICkgeworICAgICAgICAgICAgeG1sRW5jb2RlLmVuY29kZVRvKCBvcyApOworICAgICAgICAgICAgcmV0dXJuIG9zOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnN0cmluZyBtX3N0cjsKKyAgICAgICAgRm9yV2hhdCBtX2ZvcldoYXQ7CisgICAgfTsKKworICAgIGNsYXNzIFhtbFdyaXRlciB7CisgICAgcHVibGljOgorCisgICAgICAgIGNsYXNzIFNjb3BlZEVsZW1lbnQgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBTY29wZWRFbGVtZW50KCBYbWxXcml0ZXIqIHdyaXRlciApCisgICAgICAgICAgICA6ICAgbV93cml0ZXIoIHdyaXRlciApCisgICAgICAgICAgICB7fQorCisgICAgICAgICAgICBTY29wZWRFbGVtZW50KCBTY29wZWRFbGVtZW50IGNvbnN0JiBvdGhlciApCisgICAgICAgICAgICA6ICAgbV93cml0ZXIoIG90aGVyLm1fd3JpdGVyICl7CisgICAgICAgICAgICAgICAgb3RoZXIubV93cml0ZXIgPSBDQVRDSF9OVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB+U2NvcGVkRWxlbWVudCgpIHsKKyAgICAgICAgICAgICAgICBpZiggbV93cml0ZXIgKQorICAgICAgICAgICAgICAgICAgICBtX3dyaXRlci0+ZW5kRWxlbWVudCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTY29wZWRFbGVtZW50JiB3cml0ZVRleHQoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0LCBib29sIGluZGVudCA9IHRydWUgKSB7CisgICAgICAgICAgICAgICAgbV93cml0ZXItPndyaXRlVGV4dCggdGV4dCwgaW5kZW50ICk7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICAgICAgU2NvcGVkRWxlbWVudCYgd3JpdGVBdHRyaWJ1dGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBUIGNvbnN0JiBhdHRyaWJ1dGUgKSB7CisgICAgICAgICAgICAgICAgbV93cml0ZXItPndyaXRlQXR0cmlidXRlKCBuYW1lLCBhdHRyaWJ1dGUgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIG11dGFibGUgWG1sV3JpdGVyKiBtX3dyaXRlcjsKKyAgICAgICAgfTsKKworICAgICAgICBYbWxXcml0ZXIoKQorICAgICAgICA6ICAgbV90YWdJc09wZW4oIGZhbHNlICksCisgICAgICAgICAgICBtX25lZWRzTmV3bGluZSggZmFsc2UgKSwKKyAgICAgICAgICAgIG1fb3MoIENhdGNoOjpjb3V0KCkgKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZURlY2xhcmF0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXIoIHN0ZDo6b3N0cmVhbSYgb3MgKQorICAgICAgICA6ICAgbV90YWdJc09wZW4oIGZhbHNlICksCisgICAgICAgICAgICBtX25lZWRzTmV3bGluZSggZmFsc2UgKSwKKyAgICAgICAgICAgIG1fb3MoIG9zICkKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGVEZWNsYXJhdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgflhtbFdyaXRlcigpIHsKKyAgICAgICAgICAgIHdoaWxlKCAhbV90YWdzLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIGVuZEVsZW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFdyaXRlciYgc3RhcnRFbGVtZW50KCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSApIHsKKyAgICAgICAgICAgIGVuc3VyZVRhZ0Nsb3NlZCgpOworICAgICAgICAgICAgbmV3bGluZUlmTmVjZXNzYXJ5KCk7CisgICAgICAgICAgICBtX29zIDw8IG1faW5kZW50IDw8ICc8JyA8PCBuYW1lOworICAgICAgICAgICAgbV90YWdzLnB1c2hfYmFjayggbmFtZSApOworICAgICAgICAgICAgbV9pbmRlbnQgKz0gIiAgIjsKKyAgICAgICAgICAgIG1fdGFnSXNPcGVuID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIFNjb3BlZEVsZW1lbnQgc2NvcGVkRWxlbWVudCggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUgKSB7CisgICAgICAgICAgICBTY29wZWRFbGVtZW50IHNjb3BlZCggdGhpcyApOworICAgICAgICAgICAgc3RhcnRFbGVtZW50KCBuYW1lICk7CisgICAgICAgICAgICByZXR1cm4gc2NvcGVkOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyJiBlbmRFbGVtZW50KCkgeworICAgICAgICAgICAgbmV3bGluZUlmTmVjZXNzYXJ5KCk7CisgICAgICAgICAgICBtX2luZGVudCA9IG1faW5kZW50LnN1YnN0ciggMCwgbV9pbmRlbnQuc2l6ZSgpLTIgKTsKKyAgICAgICAgICAgIGlmKCBtX3RhZ0lzT3BlbiApIHsKKyAgICAgICAgICAgICAgICBtX29zIDw8ICIvPiI7CisgICAgICAgICAgICAgICAgbV90YWdJc09wZW4gPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG1fb3MgPDwgbV9pbmRlbnQgPDwgIjwvIiA8PCBtX3RhZ3MuYmFjaygpIDw8ICI+IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fb3MgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgbV90YWdzLnBvcF9iYWNrKCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXImIHdyaXRlQXR0cmlidXRlKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgc3RkOjpzdHJpbmcgY29uc3QmIGF0dHJpYnV0ZSApIHsKKyAgICAgICAgICAgIGlmKCAhbmFtZS5lbXB0eSgpICYmICFhdHRyaWJ1dGUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbV9vcyA8PCAnICcgPDwgbmFtZSA8PCAiPVwiIiA8PCBYbWxFbmNvZGUoIGF0dHJpYnV0ZSwgWG1sRW5jb2RlOjpGb3JBdHRyaWJ1dGVzICkgPDwgJyInOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyJiB3cml0ZUF0dHJpYnV0ZSggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIGJvb2wgYXR0cmlidXRlICkgeworICAgICAgICAgICAgbV9vcyA8PCAnICcgPDwgbmFtZSA8PCAiPVwiIiA8PCAoIGF0dHJpYnV0ZSA/ICJ0cnVlIiA6ICJmYWxzZSIgKSA8PCAnIic7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBYbWxXcml0ZXImIHdyaXRlQXR0cmlidXRlKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgVCBjb25zdCYgYXR0cmlidXRlICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCBhdHRyaWJ1dGU7CisgICAgICAgICAgICByZXR1cm4gd3JpdGVBdHRyaWJ1dGUoIG5hbWUsIG9zcy5zdHIoKSApOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyJiB3cml0ZVRleHQoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0LCBib29sIGluZGVudCA9IHRydWUgKSB7CisgICAgICAgICAgICBpZiggIXRleHQuZW1wdHkoKSApeworICAgICAgICAgICAgICAgIGJvb2wgdGFnV2FzT3BlbiA9IG1fdGFnSXNPcGVuOworICAgICAgICAgICAgICAgIGVuc3VyZVRhZ0Nsb3NlZCgpOworICAgICAgICAgICAgICAgIGlmKCB0YWdXYXNPcGVuICYmIGluZGVudCApCisgICAgICAgICAgICAgICAgICAgIG1fb3MgPDwgbV9pbmRlbnQ7CisgICAgICAgICAgICAgICAgbV9vcyA8PCBYbWxFbmNvZGUoIHRleHQgKTsKKyAgICAgICAgICAgICAgICBtX25lZWRzTmV3bGluZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXImIHdyaXRlQ29tbWVudCggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQgKSB7CisgICAgICAgICAgICBlbnN1cmVUYWdDbG9zZWQoKTsKKyAgICAgICAgICAgIG1fb3MgPDwgbV9pbmRlbnQgPDwgIjwhLS0iIDw8IHRleHQgPDwgIi0tPiI7CisgICAgICAgICAgICBtX25lZWRzTmV3bGluZSA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlU3R5bGVzaGVldFJlZiggc3RkOjpzdHJpbmcgY29uc3QmIHVybCApIHsKKyAgICAgICAgICAgIG1fb3MgPDwgIjw/eG1sLXN0eWxlc2hlZXQgdHlwZT1cInRleHQveHNsXCIgaHJlZj1cIiIgPDwgdXJsIDw8ICJcIj8+XG4iOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyJiB3cml0ZUJsYW5rTGluZSgpIHsKKyAgICAgICAgICAgIGVuc3VyZVRhZ0Nsb3NlZCgpOworICAgICAgICAgICAgbV9vcyA8PCAnXG4nOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBlbnN1cmVUYWdDbG9zZWQoKSB7CisgICAgICAgICAgICBpZiggbV90YWdJc09wZW4gKSB7CisgICAgICAgICAgICAgICAgbV9vcyA8PCAiPiIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIG1fdGFnSXNPcGVuID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFhtbFdyaXRlciggWG1sV3JpdGVyIGNvbnN0JiApOworICAgICAgICB2b2lkIG9wZXJhdG9yPSggWG1sV3JpdGVyIGNvbnN0JiApOworCisgICAgICAgIHZvaWQgd3JpdGVEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgICAgIG1fb3MgPDwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIjsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgbmV3bGluZUlmTmVjZXNzYXJ5KCkgeworICAgICAgICAgICAgaWYoIG1fbmVlZHNOZXdsaW5lICkgeworICAgICAgICAgICAgICAgIG1fb3MgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIG1fbmVlZHNOZXdsaW5lID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib29sIG1fdGFnSXNPcGVuOworICAgICAgICBib29sIG1fbmVlZHNOZXdsaW5lOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbV90YWdzOworICAgICAgICBzdGQ6OnN0cmluZyBtX2luZGVudDsKKyAgICAgICAgc3RkOjpvc3RyZWFtJiBtX29zOworICAgIH07CisKK30KKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9yZWVuYWJsZV93YXJuaW5ncy5oCisKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFRU5BQkxFX1dBUk5JTkdTX0hfSU5DTFVERUQKKworI2lmZGVmIF9fY2xhbmdfXworIyAgICBpZmRlZiBfX0lDQyAvLyBpY3BjIGRlZmluZXMgdGhlIF9fY2xhbmdfXyBtYWNybworIyAgICAgICAgcHJhZ21hIHdhcm5pbmcocG9wKQorIyAgICBlbHNlCisjICAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyMgICAgZW5kaWYKKyNlbGlmIGRlZmluZWQgX19HTlVDX18KKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBjbGFzcyBYbWxSZXBvcnRlciA6IHB1YmxpYyBTdHJlYW1pbmdSZXBvcnRlckJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgWG1sUmVwb3J0ZXIoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBfY29uZmlnICkKKyAgICAgICAgOiAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZSggX2NvbmZpZyApLAorICAgICAgICAgICAgbV94bWwoX2NvbmZpZy5zdHJlYW0oKSksCisgICAgICAgICAgICBtX3NlY3Rpb25EZXB0aCggMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXJQcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5YbWxSZXBvcnRlcigpIENBVENIX09WRVJSSURFOworCisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiUmVwb3J0cyB0ZXN0IHJlc3VsdHMgYXMgYW4gWE1MIGRvY3VtZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0U3R5bGVzaGVldFJlZigpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZVNvdXJjZUluZm8oIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBzb3VyY2VJbmZvICkgeworICAgICAgICAgICAgbV94bWwKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJmaWxlbmFtZSIsIHNvdXJjZUluZm8uZmlsZSApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAibGluZSIsIHNvdXJjZUluZm8ubGluZSApOworICAgICAgICB9CisKKyAgICBwdWJsaWM6IC8vIFN0cmVhbWluZ1JlcG9ydGVyQmFzZQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgcyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6bm9NYXRjaGluZ1Rlc3RDYXNlcyggcyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmIHRlc3RJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0UnVuU3RhcnRpbmcoIHRlc3RJbmZvICk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdHlsZXNoZWV0UmVmID0gZ2V0U3R5bGVzaGVldFJlZigpOworICAgICAgICAgICAgaWYoICFzdHlsZXNoZWV0UmVmLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIG1feG1sLndyaXRlU3R5bGVzaGVldFJlZiggc3R5bGVzaGVldFJlZiApOworICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiQ2F0Y2giICk7CisgICAgICAgICAgICBpZiggIW1fY29uZmlnLT5uYW1lKCkuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbV94bWwud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgbV9jb25maWctPm5hbWUoKSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdEdyb3VwU3RhcnRpbmcoIGdyb3VwSW5mbyApOworICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiR3JvdXAiICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgZ3JvdXBJbmZvLm5hbWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0Q2FzZVN0YXJ0aW5nKHRlc3RJbmZvKTsKKyAgICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIlRlc3RDYXNlIiApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAibmFtZSIsIHRyaW0oIHRlc3RJbmZvLm5hbWUgKSApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZGVzY3JpcHRpb24iLCB0ZXN0SW5mby5kZXNjcmlwdGlvbiApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAidGFncyIsIHRlc3RJbmZvLnRhZ3NBc1N0cmluZyApOworCisgICAgICAgICAgICB3cml0ZVNvdXJjZUluZm8oIHRlc3RJbmZvLmxpbmVJbmZvICk7CisKKyAgICAgICAgICAgIGlmICggbV9jb25maWctPnNob3dEdXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpBbHdheXMgKQorICAgICAgICAgICAgICAgIG1fdGVzdENhc2VUaW1lci5zdGFydCgpOworICAgICAgICAgICAgbV94bWwuZW5zdXJlVGFnQ2xvc2VkKCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnNlY3Rpb25TdGFydGluZyggc2VjdGlvbkluZm8gKTsKKyAgICAgICAgICAgIGlmKCBtX3NlY3Rpb25EZXB0aCsrID4gMCApIHsKKyAgICAgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJTZWN0aW9uIiApCisgICAgICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggIm5hbWUiLCB0cmltKCBzZWN0aW9uSW5mby5uYW1lICkgKQorICAgICAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJkZXNjcmlwdGlvbiIsIHNlY3Rpb25JbmZvLmRlc2NyaXB0aW9uICk7CisgICAgICAgICAgICAgICAgd3JpdGVTb3VyY2VJbmZvKCBzZWN0aW9uSW5mby5saW5lSW5mbyApOworICAgICAgICAgICAgICAgIG1feG1sLmVuc3VyZVRhZ0Nsb3NlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHsgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworCisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCA9IGFzc2VydGlvblN0YXRzLmFzc2VydGlvblJlc3VsdDsKKworICAgICAgICAgICAgYm9vbCBpbmNsdWRlUmVzdWx0cyA9IG1fY29uZmlnLT5pbmNsdWRlU3VjY2Vzc2Z1bFJlc3VsdHMoKSB8fCAhcmVzdWx0LmlzT2soKTsKKworICAgICAgICAgICAgaWYoIGluY2x1ZGVSZXN1bHRzICkgeworICAgICAgICAgICAgICAgIC8vIFByaW50IGFueSBpbmZvIG1lc3NhZ2VzIGluIDxJbmZvPiB0YWdzLgorICAgICAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGFzc2VydGlvblN0YXRzLmluZm9NZXNzYWdlcy5iZWdpbigpLCBpdEVuZCA9IGFzc2VydGlvblN0YXRzLmluZm9NZXNzYWdlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGl0LT50eXBlID09IFJlc3VsdFdhczo6SW5mbyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJJbmZvIiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53cml0ZVRleHQoIGl0LT5tZXNzYWdlICk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGl0LT50eXBlID09IFJlc3VsdFdhczo6V2FybmluZyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJXYXJuaW5nIiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53cml0ZVRleHQoIGl0LT5tZXNzYWdlICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIERyb3Agb3V0IGlmIHJlc3VsdCB3YXMgc3VjY2Vzc2Z1bCBidXQgd2UncmUgbm90IHByaW50aW5nIHRoZW0uCisgICAgICAgICAgICBpZiggIWluY2x1ZGVSZXN1bHRzICYmIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgIT0gUmVzdWx0V2FzOjpXYXJuaW5nICkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgLy8gUHJpbnQgdGhlIGV4cHJlc3Npb24gaWYgdGhlcmUgaXMgb25lLgorICAgICAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHByZXNzaW9uKCkgKSB7CisgICAgICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiRXhwcmVzc2lvbiIgKQorICAgICAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJzdWNjZXNzIiwgcmVzdWx0LnN1Y2NlZWRlZCgpICkKKyAgICAgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAidHlwZSIsIHJlc3VsdC5nZXRUZXN0TWFjcm9OYW1lKCkgKTsKKworICAgICAgICAgICAgICAgIHdyaXRlU291cmNlSW5mbyggcmVzdWx0LmdldFNvdXJjZUluZm8oKSApOworCisgICAgICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIk9yaWdpbmFsIiApCisgICAgICAgICAgICAgICAgICAgIC53cml0ZVRleHQoIHJlc3VsdC5nZXRFeHByZXNzaW9uKCkgKTsKKyAgICAgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiRXhwYW5kZWQiICkKKyAgICAgICAgICAgICAgICAgICAgLndyaXRlVGV4dCggcmVzdWx0LmdldEV4cGFuZGVkRXhwcmVzc2lvbigpICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFuZC4uLiBQcmludCBhIHJlc3VsdCBhcHBsaWNhYmxlIHRvIGVhY2ggcmVzdWx0IHR5cGUuCisgICAgICAgICAgICBzd2l0Y2goIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OlRocmV3RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJFeGNlcHRpb24iICk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlU291cmNlSW5mbyggcmVzdWx0LmdldFNvdXJjZUluZm8oKSApOworICAgICAgICAgICAgICAgICAgICBtX3htbC53cml0ZVRleHQoIHJlc3VsdC5nZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmF0YWxFcnJvckNvbmRpdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiRmF0YWxFcnJvckNvbmRpdGlvbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTb3VyY2VJbmZvKCByZXN1bHQuZ2V0U291cmNlSW5mbygpICk7CisgICAgICAgICAgICAgICAgICAgIG1feG1sLndyaXRlVGV4dCggcmVzdWx0LmdldE1lc3NhZ2UoKSApOworICAgICAgICAgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpJbmZvOgorICAgICAgICAgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiSW5mbyIgKQorICAgICAgICAgICAgICAgICAgICAgICAgLndyaXRlVGV4dCggcmVzdWx0LmdldE1lc3NhZ2UoKSApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6V2FybmluZzoKKyAgICAgICAgICAgICAgICAgICAgLy8gV2FybmluZyB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIHdyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZToKKyAgICAgICAgICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiRmFpbHVyZSIgKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTb3VyY2VJbmZvKCByZXN1bHQuZ2V0U291cmNlSW5mbygpICk7CisgICAgICAgICAgICAgICAgICAgIG1feG1sLndyaXRlVGV4dCggcmVzdWx0LmdldE1lc3NhZ2UoKSApOworICAgICAgICAgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cHJlc3Npb24oKSApCisgICAgICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjpzZWN0aW9uRW5kZWQoIHNlY3Rpb25TdGF0cyApOworICAgICAgICAgICAgaWYoIC0tbV9zZWN0aW9uRGVwdGggPiAwICkgeworICAgICAgICAgICAgICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVudCBlID0gbV94bWwuc2NvcGVkRWxlbWVudCggIk92ZXJhbGxSZXN1bHRzIiApOworICAgICAgICAgICAgICAgIGUud3JpdGVBdHRyaWJ1dGUoICJzdWNjZXNzZXMiLCBzZWN0aW9uU3RhdHMuYXNzZXJ0aW9ucy5wYXNzZWQgKTsKKyAgICAgICAgICAgICAgICBlLndyaXRlQXR0cmlidXRlKCAiZmFpbHVyZXMiLCBzZWN0aW9uU3RhdHMuYXNzZXJ0aW9ucy5mYWlsZWQgKTsKKyAgICAgICAgICAgICAgICBlLndyaXRlQXR0cmlidXRlKCAiZXhwZWN0ZWRGYWlsdXJlcyIsIHNlY3Rpb25TdGF0cy5hc3NlcnRpb25zLmZhaWxlZEJ1dE9rICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIG1fY29uZmlnLT5zaG93RHVyYXRpb25zKCkgPT0gU2hvd0R1cmF0aW9uczo6QWx3YXlzICkKKyAgICAgICAgICAgICAgICAgICAgZS53cml0ZUF0dHJpYnV0ZSggImR1cmF0aW9uSW5TZWNvbmRzIiwgc2VjdGlvblN0YXRzLmR1cmF0aW9uSW5TZWNvbmRzICk7CisKKyAgICAgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdENhc2VFbmRlZCggdGVzdENhc2VTdGF0cyApOworICAgICAgICAgICAgWG1sV3JpdGVyOjpTY29wZWRFbGVtZW50IGUgPSBtX3htbC5zY29wZWRFbGVtZW50KCAiT3ZlcmFsbFJlc3VsdCIgKTsKKyAgICAgICAgICAgIGUud3JpdGVBdHRyaWJ1dGUoICJzdWNjZXNzIiwgdGVzdENhc2VTdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5hbGxPaygpICk7CisKKyAgICAgICAgICAgIGlmICggbV9jb25maWctPnNob3dEdXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpBbHdheXMgKQorICAgICAgICAgICAgICAgIGUud3JpdGVBdHRyaWJ1dGUoICJkdXJhdGlvbkluU2Vjb25kcyIsIG1fdGVzdENhc2VUaW1lci5nZXRFbGFwc2VkU2Vjb25kcygpICk7CisKKyAgICAgICAgICAgIGlmKCAhdGVzdENhc2VTdGF0cy5zdGRPdXQuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIlN0ZE91dCIgKS53cml0ZVRleHQoIHRyaW0oIHRlc3RDYXNlU3RhdHMuc3RkT3V0ICksIGZhbHNlICk7CisgICAgICAgICAgICBpZiggIXRlc3RDYXNlU3RhdHMuc3RkRXJyLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJTdGRFcnIiICkud3JpdGVUZXh0KCB0cmltKCB0ZXN0Q2FzZVN0YXRzLnN0ZEVyciApLCBmYWxzZSApOworCisgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiB0ZXN0R3JvdXBTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdEdyb3VwRW5kZWQoIHRlc3RHcm91cFN0YXRzICk7CisgICAgICAgICAgICAvLyBUT0RPOiBDaGVjayB0ZXN0R3JvdXBTdGF0cy5hYm9ydGluZyBhbmQgYWN0IGFjY29yZGluZ2x5LgorICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIk92ZXJhbGxSZXN1bHRzIiApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAic3VjY2Vzc2VzIiwgdGVzdEdyb3VwU3RhdHMudG90YWxzLmFzc2VydGlvbnMucGFzc2VkICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJmYWlsdXJlcyIsIHRlc3RHcm91cFN0YXRzLnRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZXhwZWN0ZWRGYWlsdXJlcyIsIHRlc3RHcm91cFN0YXRzLnRvdGFscy5hc3NlcnRpb25zLmZhaWxlZEJ1dE9rICk7CisgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIHRlc3RSdW5TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdFJ1bkVuZGVkKCB0ZXN0UnVuU3RhdHMgKTsKKyAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJPdmVyYWxsUmVzdWx0cyIgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggInN1Y2Nlc3NlcyIsIHRlc3RSdW5TdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImZhaWx1cmVzIiwgdGVzdFJ1blN0YXRzLnRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZXhwZWN0ZWRGYWlsdXJlcyIsIHRlc3RSdW5TdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWRCdXRPayApOworICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBUaW1lciBtX3Rlc3RDYXNlVGltZXI7CisgICAgICAgIFhtbFdyaXRlciBtX3htbDsKKyAgICAgICAgaW50IG1fc2VjdGlvbkRlcHRoOworICAgIH07CisKKyAgICAgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIoICJ4bWwiLCBYbWxSZXBvcnRlciApCisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vcmVwb3J0ZXJzL2NhdGNoX3JlcG9ydGVyX2p1bml0LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfSlVOSVRfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIG5hbWVzcGFjZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGdldEN1cnJlbnRUaW1lc3RhbXAoKSB7CisgICAgICAgICAgICAvLyBCZXdhcmUsIHRoaXMgaXMgbm90IHJlZW50cmFudCBiZWNhdXNlIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaXNzdWVzCisgICAgICAgICAgICAvLyBBbHNvLCBVVEMgb25seSwgYWdhaW4gYmVjYXVzZSBvZiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICgleiBpcyBDKysxMSkKKyAgICAgICAgICAgIHRpbWVfdCByYXd0aW1lOworICAgICAgICAgICAgc3RkOjp0aW1lKCZyYXd0aW1lKTsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCB0aW1lU3RhbXBTaXplID0gc2l6ZW9mKCIyMDE3LTAxLTE2VDE3OjA2OjQ1WiIpOworCisjaWZkZWYgX01TQ19WRVIKKyAgICAgICAgICAgIHN0ZDo6dG0gdGltZUluZm8gPSB7fTsKKyAgICAgICAgICAgIGdtdGltZV9zKCZ0aW1lSW5mbywgJnJhd3RpbWUpOworI2Vsc2UKKyAgICAgICAgICAgIHN0ZDo6dG0qIHRpbWVJbmZvOworICAgICAgICAgICAgdGltZUluZm8gPSBzdGQ6OmdtdGltZSgmcmF3dGltZSk7CisjZW5kaWYKKworICAgICAgICAgICAgY2hhciB0aW1lU3RhbXBbdGltZVN0YW1wU2l6ZV07CisgICAgICAgICAgICBjb25zdCBjaGFyICogY29uc3QgZm10ID0gIiVZLSVtLSVkVCVIOiVNOiVTWiI7CisKKyNpZmRlZiBfTVNDX1ZFUgorICAgICAgICAgICAgc3RkOjpzdHJmdGltZSh0aW1lU3RhbXAsIHRpbWVTdGFtcFNpemUsIGZtdCwgJnRpbWVJbmZvKTsKKyNlbHNlCisgICAgICAgICAgICBzdGQ6OnN0cmZ0aW1lKHRpbWVTdGFtcCwgdGltZVN0YW1wU2l6ZSwgZm10LCB0aW1lSW5mbyk7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZyh0aW1lU3RhbXApOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBjbGFzcyBKdW5pdFJlcG9ydGVyIDogcHVibGljIEN1bXVsYXRpdmVSZXBvcnRlckJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgSnVuaXRSZXBvcnRlciggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKQorICAgICAgICA6ICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZSggX2NvbmZpZyApLAorICAgICAgICAgICAgeG1sKCBfY29uZmlnLnN0cmVhbSgpICksCisgICAgICAgICAgICBtX29rVG9GYWlsKCBmYWxzZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXJQcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5KdW5pdFJlcG9ydGVyKCkgQ0FUQ0hfT1ZFUlJJREU7CisKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICJSZXBvcnRzIHRlc3QgcmVzdWx0cyBpbiBhbiBYTUwgZm9ybWF0IHRoYXQgbG9va3MgbGlrZSBBbnQncyBqdW5pdHJlcG9ydCB0YXJnZXQiOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiAvKnNwZWMqLyApIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmIHJ1bkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjp0ZXN0UnVuU3RhcnRpbmcoIHJ1bkluZm8gKTsKKyAgICAgICAgICAgIHhtbC5zdGFydEVsZW1lbnQoICJ0ZXN0c3VpdGVzIiApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHN1aXRlVGltZXIuc3RhcnQoKTsKKyAgICAgICAgICAgIHN0ZE91dEZvclN1aXRlLnN0cigiIik7CisgICAgICAgICAgICBzdGRFcnJGb3JTdWl0ZS5zdHIoIiIpOworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbnMgPSAwOworICAgICAgICAgICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZTo6dGVzdEdyb3VwU3RhcnRpbmcoIGdyb3VwSW5mbyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2VJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgbV9va1RvRmFpbCA9IHRlc3RDYXNlSW5mby5va1RvRmFpbCgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgaWYoIGFzc2VydGlvblN0YXRzLmFzc2VydGlvblJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgPT0gUmVzdWx0V2FzOjpUaHJld0V4Y2VwdGlvbiAmJiAhbV9va1RvRmFpbCApCisgICAgICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbnMrKzsKKyAgICAgICAgICAgIHJldHVybiBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjphc3NlcnRpb25FbmRlZCggYXNzZXJ0aW9uU3RhdHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgc3RkT3V0Rm9yU3VpdGUgPDwgdGVzdENhc2VTdGF0cy5zdGRPdXQ7CisgICAgICAgICAgICBzdGRFcnJGb3JTdWl0ZSA8PCB0ZXN0Q2FzZVN0YXRzLnN0ZEVycjsKKyAgICAgICAgICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6OnRlc3RDYXNlRW5kZWQoIHRlc3RDYXNlU3RhdHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgZG91YmxlIHN1aXRlVGltZSA9IHN1aXRlVGltZXIuZ2V0RWxhcHNlZFNlY29uZHMoKTsKKyAgICAgICAgICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6OnRlc3RHcm91cEVuZGVkKCB0ZXN0R3JvdXBTdGF0cyApOworICAgICAgICAgICAgd3JpdGVHcm91cCggKm1fdGVzdEdyb3Vwcy5iYWNrKCksIHN1aXRlVGltZSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZEN1bXVsYXRpdmUoKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICB4bWwuZW5kRWxlbWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZUdyb3VwKCBUZXN0R3JvdXBOb2RlIGNvbnN0JiBncm91cE5vZGUsIGRvdWJsZSBzdWl0ZVRpbWUgKSB7CisgICAgICAgICAgICBYbWxXcml0ZXI6OlNjb3BlZEVsZW1lbnQgZSA9IHhtbC5zY29wZWRFbGVtZW50KCAidGVzdHN1aXRlIiApOworICAgICAgICAgICAgVGVzdEdyb3VwU3RhdHMgY29uc3QmIHN0YXRzID0gZ3JvdXBOb2RlLnZhbHVlOworICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAibmFtZSIsIHN0YXRzLmdyb3VwSW5mby5uYW1lICk7CisgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJlcnJvcnMiLCB1bmV4cGVjdGVkRXhjZXB0aW9ucyApOworICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAiZmFpbHVyZXMiLCBzdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQtdW5leHBlY3RlZEV4Y2VwdGlvbnMgKTsKKyAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggInRlc3RzIiwgc3RhdHMudG90YWxzLmFzc2VydGlvbnMudG90YWwoKSApOworICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAiaG9zdG5hbWUiLCAidGJkIiApOyAvLyAhVEJECisgICAgICAgICAgICBpZiggbV9jb25maWctPnNob3dEdXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpOZXZlciApCisgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidGltZSIsICIiICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidGltZSIsIHN1aXRlVGltZSApOworICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidGltZXN0YW1wIiwgZ2V0Q3VycmVudFRpbWVzdGFtcCgpICk7CisKKyAgICAgICAgICAgIC8vIFdyaXRlIHRlc3QgY2FzZXMKKyAgICAgICAgICAgIGZvciggVGVzdEdyb3VwTm9kZTo6Q2hpbGROb2Rlczo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBncm91cE5vZGUuY2hpbGRyZW4uYmVnaW4oKSwgaXRFbmQgPSBncm91cE5vZGUuY2hpbGRyZW4uZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICAgICB3cml0ZVRlc3RDYXNlKCAqKml0ICk7CisKKyAgICAgICAgICAgIHhtbC5zY29wZWRFbGVtZW50KCAic3lzdGVtLW91dCIgKS53cml0ZVRleHQoIHRyaW0oIHN0ZE91dEZvclN1aXRlLnN0cigpICksIGZhbHNlICk7CisgICAgICAgICAgICB4bWwuc2NvcGVkRWxlbWVudCggInN5c3RlbS1lcnIiICkud3JpdGVUZXh0KCB0cmltKCBzdGRFcnJGb3JTdWl0ZS5zdHIoKSApLCBmYWxzZSApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZVRlc3RDYXNlKCBUZXN0Q2FzZU5vZGUgY29uc3QmIHRlc3RDYXNlTm9kZSApIHsKKyAgICAgICAgICAgIFRlc3RDYXNlU3RhdHMgY29uc3QmIHN0YXRzID0gdGVzdENhc2VOb2RlLnZhbHVlOworCisgICAgICAgICAgICAvLyBBbGwgdGVzdCBjYXNlcyBoYXZlIGV4YWN0bHkgb25lIHNlY3Rpb24gLSB3aGljaCByZXByZXNlbnRzIHRoZQorICAgICAgICAgICAgLy8gdGVzdCBjYXNlIGl0c2VsZi4gVGhhdCBzZWN0aW9uIG1heSBoYXZlIDAtbiBuZXN0ZWQgc2VjdGlvbnMKKyAgICAgICAgICAgIGFzc2VydCggdGVzdENhc2VOb2RlLmNoaWxkcmVuLnNpemUoKSA9PSAxICk7CisgICAgICAgICAgICBTZWN0aW9uTm9kZSBjb25zdCYgcm9vdFNlY3Rpb24gPSAqdGVzdENhc2VOb2RlLmNoaWxkcmVuLmZyb250KCk7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsYXNzTmFtZSA9IHN0YXRzLnRlc3RJbmZvLmNsYXNzTmFtZTsKKworICAgICAgICAgICAgaWYoIGNsYXNzTmFtZS5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIGlmKCByb290U2VjdGlvbi5jaGlsZFNlY3Rpb25zLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAiZ2xvYmFsIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlU2VjdGlvbiggY2xhc3NOYW1lLCAiIiwgcm9vdFNlY3Rpb24gKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVTZWN0aW9uKCAgc3RkOjpzdHJpbmcgY29uc3QmIGNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgcm9vdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdGlvbk5vZGUgY29uc3QmIHNlY3Rpb25Ob2RlICkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IHRyaW0oIHNlY3Rpb25Ob2RlLnN0YXRzLnNlY3Rpb25JbmZvLm5hbWUgKTsKKyAgICAgICAgICAgIGlmKCAhcm9vdE5hbWUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbmFtZSA9IHJvb3ROYW1lICsgJy8nICsgbmFtZTsKKworICAgICAgICAgICAgaWYoICFzZWN0aW9uTm9kZS5hc3NlcnRpb25zLmVtcHR5KCkgfHwKKyAgICAgICAgICAgICAgICAhc2VjdGlvbk5vZGUuc3RkT3V0LmVtcHR5KCkgfHwKKyAgICAgICAgICAgICAgICAhc2VjdGlvbk5vZGUuc3RkRXJyLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgWG1sV3JpdGVyOjpTY29wZWRFbGVtZW50IGUgPSB4bWwuc2NvcGVkRWxlbWVudCggInRlc3RjYXNlIiApOworICAgICAgICAgICAgICAgIGlmKCBjbGFzc05hbWUuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAiY2xhc3NuYW1lIiwgbmFtZSApOworICAgICAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgInJvb3QiICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJjbGFzc25hbWUiLCBjbGFzc05hbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAibmFtZSIsIG5hbWUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidGltZSIsIENhdGNoOjp0b1N0cmluZyggc2VjdGlvbk5vZGUuc3RhdHMuZHVyYXRpb25JblNlY29uZHMgKSApOworCisgICAgICAgICAgICAgICAgd3JpdGVBc3NlcnRpb25zKCBzZWN0aW9uTm9kZSApOworCisgICAgICAgICAgICAgICAgaWYoICFzZWN0aW9uTm9kZS5zdGRPdXQuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIHhtbC5zY29wZWRFbGVtZW50KCAic3lzdGVtLW91dCIgKS53cml0ZVRleHQoIHRyaW0oIHNlY3Rpb25Ob2RlLnN0ZE91dCApLCBmYWxzZSApOworICAgICAgICAgICAgICAgIGlmKCAhc2VjdGlvbk5vZGUuc3RkRXJyLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICB4bWwuc2NvcGVkRWxlbWVudCggInN5c3RlbS1lcnIiICkud3JpdGVUZXh0KCB0cmltKCBzZWN0aW9uTm9kZS5zdGRFcnIgKSwgZmFsc2UgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciggU2VjdGlvbk5vZGU6OkNoaWxkU2VjdGlvbnM6OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgIGl0ID0gc2VjdGlvbk5vZGUuY2hpbGRTZWN0aW9ucy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IHNlY3Rpb25Ob2RlLmNoaWxkU2VjdGlvbnMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICAgICBpZiggY2xhc3NOYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICB3cml0ZVNlY3Rpb24oIG5hbWUsICIiLCAqKml0ICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB3cml0ZVNlY3Rpb24oIGNsYXNzTmFtZSwgbmFtZSwgKippdCApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZUFzc2VydGlvbnMoIFNlY3Rpb25Ob2RlIGNvbnN0JiBzZWN0aW9uTm9kZSApIHsKKyAgICAgICAgICAgIGZvciggU2VjdGlvbk5vZGU6OkFzc2VydGlvbnM6OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgIGl0ID0gc2VjdGlvbk5vZGUuYXNzZXJ0aW9ucy5iZWdpbigpLCBpdEVuZCA9IHNlY3Rpb25Ob2RlLmFzc2VydGlvbnMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICAgICB3cml0ZUFzc2VydGlvbiggKml0ICk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCB3cml0ZUFzc2VydGlvbiggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIHN0YXRzICkgeworICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgPSBzdGF0cy5hc3NlcnRpb25SZXN1bHQ7CisgICAgICAgICAgICBpZiggIXJlc3VsdC5pc09rKCkgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZWxlbWVudE5hbWU7CisgICAgICAgICAgICAgICAgc3dpdGNoKCByZXN1bHQuZ2V0UmVzdWx0VHlwZSgpICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpGYXRhbEVycm9yQ29uZGl0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSAiZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmU6CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9ICJmYWlsdXJlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gImZhaWx1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpEaWRudFRocm93RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSAiZmFpbHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgbmV2ZXIgc2VlIHRoZXNlIGhlcmU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpJbmZvOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6V2FybmluZzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6Ok9rOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VW5rbm93bjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhaWx1cmVCaXQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9ICJpbnRlcm5hbEVycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVudCBlID0geG1sLnNjb3BlZEVsZW1lbnQoIGVsZW1lbnROYW1lICk7CisKKyAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJtZXNzYWdlIiwgcmVzdWx0LmdldEV4cGFuZGVkRXhwcmVzc2lvbigpICk7CisgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidHlwZSIsIHJlc3VsdC5nZXRUZXN0TWFjcm9OYW1lKCkgKTsKKworICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICAgICAgaWYoICFyZXN1bHQuZ2V0TWVzc2FnZSgpLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICBvc3MgPDwgcmVzdWx0LmdldE1lc3NhZ2UoKSA8PCAnXG4nOworICAgICAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgaXQgPSBzdGF0cy5pbmZvTWVzc2FnZXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gc3RhdHMuaW5mb01lc3NhZ2VzLmVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgICAgICAgICBpZiggaXQtPnR5cGUgPT0gUmVzdWx0V2FzOjpJbmZvICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zcyA8PCBpdC0+bWVzc2FnZSA8PCAnXG4nOworCisgICAgICAgICAgICAgICAgb3NzIDw8ICJhdCAiIDw8IHJlc3VsdC5nZXRTb3VyY2VJbmZvKCk7CisgICAgICAgICAgICAgICAgeG1sLndyaXRlVGV4dCggb3NzLnN0cigpLCBmYWxzZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyIHhtbDsKKyAgICAgICAgVGltZXIgc3VpdGVUaW1lcjsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHN0ZE91dEZvclN1aXRlOworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3RkRXJyRm9yU3VpdGU7CisgICAgICAgIHVuc2lnbmVkIGludCB1bmV4cGVjdGVkRXhjZXB0aW9uczsKKyAgICAgICAgYm9vbCBtX29rVG9GYWlsOworICAgIH07CisKKyAgICBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggImp1bml0IiwgSnVuaXRSZXBvcnRlciApCisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vcmVwb3J0ZXJzL2NhdGNoX3JlcG9ydGVyX2NvbnNvbGUuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9DT05TT0xFX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y2Zsb2F0PgorI2luY2x1ZGUgPGNzdGRpbz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBDb25zb2xlUmVwb3J0ZXIgOiBTdHJlYW1pbmdSZXBvcnRlckJhc2UgeworICAgICAgICBDb25zb2xlUmVwb3J0ZXIoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBfY29uZmlnICkKKyAgICAgICAgOiAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZSggX2NvbmZpZyApLAorICAgICAgICAgICAgbV9oZWFkZXJQcmludGVkKCBmYWxzZSApCisgICAgICAgIHt9CisKKyAgICAgICAgdmlydHVhbCB+Q29uc29sZVJlcG9ydGVyKCkgQ0FUQ0hfT1ZFUlJJREU7CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiUmVwb3J0cyB0ZXN0IHJlc3VsdHMgYXMgcGxhaW4gbGluZXMgb2YgdGV4dCI7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHNwZWMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBzdHJlYW0gPDwgIk5vIHRlc3QgY2FzZXMgbWF0Y2hlZCAnIiA8PCBzcGVjIDw8ICdcJycgPDwgc3RkOjplbmRsOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIF9hc3NlcnRpb25TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ID0gX2Fzc2VydGlvblN0YXRzLmFzc2VydGlvblJlc3VsdDsKKworICAgICAgICAgICAgYm9vbCBpbmNsdWRlUmVzdWx0cyA9IG1fY29uZmlnLT5pbmNsdWRlU3VjY2Vzc2Z1bFJlc3VsdHMoKSB8fCAhcmVzdWx0LmlzT2soKTsKKworICAgICAgICAgICAgLy8gRHJvcCBvdXQgaWYgcmVzdWx0IHdhcyBzdWNjZXNzZnVsIGJ1dCB3ZSdyZSBub3QgcHJpbnRpbmcgdGhlbS4KKyAgICAgICAgICAgIGlmKCAhaW5jbHVkZVJlc3VsdHMgJiYgcmVzdWx0LmdldFJlc3VsdFR5cGUoKSAhPSBSZXN1bHRXYXM6Oldhcm5pbmcgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgbGF6eVByaW50KCk7CisKKyAgICAgICAgICAgIEFzc2VydGlvblByaW50ZXIgcHJpbnRlciggc3RyZWFtLCBfYXNzZXJ0aW9uU3RhdHMsIGluY2x1ZGVSZXN1bHRzICk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCk7CisgICAgICAgICAgICBzdHJlYW0gPDwgc3RkOjplbmRsOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgX3NlY3Rpb25JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgbV9oZWFkZXJQcmludGVkID0gZmFsc2U7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnNlY3Rpb25TdGFydGluZyggX3NlY3Rpb25JbmZvICk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiBfc2VjdGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgaWYoIF9zZWN0aW9uU3RhdHMubWlzc2luZ0Fzc2VydGlvbnMgKSB7CisgICAgICAgICAgICAgICAgbGF6eVByaW50KCk7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ciggQ29sb3VyOjpSZXN1bHRFcnJvciApOworICAgICAgICAgICAgICAgIGlmKCBtX3NlY3Rpb25TdGFjay5zaXplKCkgPiAxICkKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICJcbk5vIGFzc2VydGlvbnMgaW4gc2VjdGlvbiI7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIlxuTm8gYXNzZXJ0aW9ucyBpbiB0ZXN0IGNhc2UiOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiICciIDw8IF9zZWN0aW9uU3RhdHMuc2VjdGlvbkluZm8ubmFtZSA8PCAiJ1xuIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggbV9jb25maWctPnNob3dEdXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpBbHdheXMgKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IGdldEZvcm1hdHRlZER1cmF0aW9uKF9zZWN0aW9uU3RhdHMuZHVyYXRpb25JblNlY29uZHMpIDw8ICIgczogIiA8PCBfc2VjdGlvblN0YXRzLnNlY3Rpb25JbmZvLm5hbWUgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIG1faGVhZGVyUHJpbnRlZCApIHsKKyAgICAgICAgICAgICAgICBtX2hlYWRlclByaW50ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6c2VjdGlvbkVuZGVkKCBfc2VjdGlvblN0YXRzICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgX3Rlc3RDYXNlU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RDYXNlRW5kZWQoIF90ZXN0Q2FzZVN0YXRzICk7CisgICAgICAgICAgICBtX2hlYWRlclByaW50ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiBfdGVzdEdyb3VwU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBpZiggY3VycmVudEdyb3VwSW5mby51c2VkICkgeworICAgICAgICAgICAgICAgIHByaW50U3VtbWFyeURpdmlkZXIoKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIlN1bW1hcnkgZm9yIGdyb3VwICciIDw8IF90ZXN0R3JvdXBTdGF0cy5ncm91cEluZm8ubmFtZSA8PCAiJzpcbiI7CisgICAgICAgICAgICAgICAgcHJpbnRUb3RhbHMoIF90ZXN0R3JvdXBTdGF0cy50b3RhbHMgKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RHcm91cEVuZGVkKCBfdGVzdEdyb3VwU3RhdHMgKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIF90ZXN0UnVuU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBwcmludFRvdGFsc0RpdmlkZXIoIF90ZXN0UnVuU3RhdHMudG90YWxzICk7CisgICAgICAgICAgICBwcmludFRvdGFscyggX3Rlc3RSdW5TdGF0cy50b3RhbHMgKTsKKyAgICAgICAgICAgIHN0cmVhbSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RSdW5FbmRlZCggX3Rlc3RSdW5TdGF0cyApOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorCisgICAgICAgIGNsYXNzIEFzc2VydGlvblByaW50ZXIgeworICAgICAgICAgICAgdm9pZCBvcGVyYXRvcj0gKCBBc3NlcnRpb25QcmludGVyIGNvbnN0JiApOworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBBc3NlcnRpb25QcmludGVyKCBzdGQ6Om9zdHJlYW0mIF9zdHJlYW0sIEFzc2VydGlvblN0YXRzIGNvbnN0JiBfc3RhdHMsIGJvb2wgX3ByaW50SW5mb01lc3NhZ2VzICkKKyAgICAgICAgICAgIDogICBzdHJlYW0oIF9zdHJlYW0gKSwKKyAgICAgICAgICAgICAgICBzdGF0cyggX3N0YXRzICksCisgICAgICAgICAgICAgICAgcmVzdWx0KCBfc3RhdHMuYXNzZXJ0aW9uUmVzdWx0ICksCisgICAgICAgICAgICAgICAgY29sb3VyKCBDb2xvdXI6Ok5vbmUgKSwKKyAgICAgICAgICAgICAgICBtZXNzYWdlKCByZXN1bHQuZ2V0TWVzc2FnZSgpICksCisgICAgICAgICAgICAgICAgbWVzc2FnZXMoIF9zdGF0cy5pbmZvTWVzc2FnZXMgKSwKKyAgICAgICAgICAgICAgICBwcmludEluZm9NZXNzYWdlcyggX3ByaW50SW5mb01lc3NhZ2VzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2goIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpPazoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6U3VjY2VzczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiUEFTU0VEIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYoIHJlc3VsdC5oYXNNZXNzYWdlKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID09IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJ3aXRoIG1lc3NhZ2UiOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID4gMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gIndpdGggbWVzc2FnZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHByZXNzaW9uRmFpbGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5pc09rKCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpTdWNjZXNzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiRkFJTEVEIC0gYnV0IHdhcyBvayI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBDb2xvdXI6OkVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiRkFJTEVEIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA9PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAid2l0aCBtZXNzYWdlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA+IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJ3aXRoIG1lc3NhZ2VzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBDb2xvdXI6OkVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJGQUlMRUQiOworICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gImR1ZSB0byB1bmV4cGVjdGVkIGV4Y2VwdGlvbiB3aXRoICI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgKz0gIm1lc3NhZ2UiOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgKz0gIm1lc3NhZ2VzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmF0YWxFcnJvckNvbmRpdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIkZBSUxFRCI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAiZHVlIHRvIGEgZmF0YWwgZXJyb3IgY29uZGl0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RGlkbnRUaHJvd0V4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIkZBSUxFRCI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAiYmVjYXVzZSBubyBleGNlcHRpb24gd2FzIHRocm93biB3aGVyZSBvbmUgd2FzIGV4cGVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6SW5mbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJpbmZvIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6V2FybmluZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJ3YXJuaW5nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJGQUlMRUQiOworICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA9PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAiZXhwbGljaXRseSB3aXRoIG1lc3NhZ2UiOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID4gMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gImV4cGxpY2l0bHkgd2l0aCBtZXNzYWdlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2UgY2FzZXMgYXJlIGhlcmUgdG8gcHJldmVudCBjb21waWxlciB3YXJuaW5ncworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VW5rbm93bjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhaWx1cmVCaXQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIioqIGludGVybmFsIGVycm9yICoqIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnQoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcHJpbnRTb3VyY2VJbmZvKCk7CisgICAgICAgICAgICAgICAgaWYoIHN0YXRzLnRvdGFscy5hc3NlcnRpb25zLnRvdGFsKCkgPiAwICkgeworICAgICAgICAgICAgICAgICAgICBpZiggcmVzdWx0LmlzT2soKSApCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIHByaW50T3JpZ2luYWxFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHByaW50UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnXG4nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgdm9pZCBwcmludFJlc3VsdFR5cGUoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoICFwYXNzT3JGYWlsLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggY29sb3VyICk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBwYXNzT3JGYWlsIDw8ICI6XG4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvaWQgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHByZXNzaW9uKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpPcmlnaW5hbEV4cHJlc3Npb24gKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtICA8PCAiICAiOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgcmVzdWx0LmdldEV4cHJlc3Npb25Jbk1hY3JvKCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnXG4nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvaWQgcHJpbnRSZWNvbnN0cnVjdGVkRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cGFuZGVkRXhwcmVzc2lvbigpICkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIndpdGggZXhwYW5zaW9uOlxuIjsKKyAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6OlJlY29uc3RydWN0ZWRFeHByZXNzaW9uICk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBUZXh0KCByZXN1bHQuZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCksIFRleHRBdHRyaWJ1dGVzKCkuc2V0SW5kZW50KDIpICkgPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lkIHByaW50TWVzc2FnZSgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggIW1lc3NhZ2VMYWJlbC5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IG1lc3NhZ2VMYWJlbCA8PCAnOicgPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtZXNzYWdlcy5iZWdpbigpLCBpdEVuZCA9IG1lc3NhZ2VzLmVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGFzc2VydGlvbiBpcyBhIHdhcm5pbmcgaWdub3JlIGFueSBJTkZPIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgIGlmKCBwcmludEluZm9NZXNzYWdlcyB8fCBpdC0+dHlwZSAhPSBSZXN1bHRXYXM6OkluZm8gKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IFRleHQoIGl0LT5tZXNzYWdlLCBUZXh0QXR0cmlidXRlcygpLnNldEluZGVudCgyKSApIDw8ICdcbic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdm9pZCBwcmludFNvdXJjZUluZm8oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6OkZpbGVOYW1lICk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IHJlc3VsdC5nZXRTb3VyY2VJbmZvKCkgPDwgIjogIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW07CisgICAgICAgICAgICBBc3NlcnRpb25TdGF0cyBjb25zdCYgc3RhdHM7CisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdDsKKyAgICAgICAgICAgIENvbG91cjo6Q29kZSBjb2xvdXI7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBwYXNzT3JGYWlsOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWVzc2FnZUxhYmVsOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWVzc2FnZTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPiBtZXNzYWdlczsKKyAgICAgICAgICAgIGJvb2wgcHJpbnRJbmZvTWVzc2FnZXM7CisgICAgICAgIH07CisKKyAgICAgICAgdm9pZCBsYXp5UHJpbnQoKSB7CisKKyAgICAgICAgICAgIGlmKCAhY3VycmVudFRlc3RSdW5JbmZvLnVzZWQgKQorICAgICAgICAgICAgICAgIGxhenlQcmludFJ1bkluZm8oKTsKKyAgICAgICAgICAgIGlmKCAhY3VycmVudEdyb3VwSW5mby51c2VkICkKKyAgICAgICAgICAgICAgICBsYXp5UHJpbnRHcm91cEluZm8oKTsKKworICAgICAgICAgICAgaWYoICFtX2hlYWRlclByaW50ZWQgKSB7CisgICAgICAgICAgICAgICAgcHJpbnRUZXN0Q2FzZUFuZFNlY3Rpb25IZWFkZXIoKTsKKyAgICAgICAgICAgICAgICBtX2hlYWRlclByaW50ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZvaWQgbGF6eVByaW50UnVuSW5mbygpIHsKKyAgICAgICAgICAgIHN0cmVhbSAgPDwgJ1xuJyA8PCBnZXRMaW5lT2ZDaGFyczwnfic+KCkgPDwgJ1xuJzsKKyAgICAgICAgICAgIENvbG91ciBjb2xvdXIoIENvbG91cjo6U2Vjb25kYXJ5VGV4dCApOworICAgICAgICAgICAgc3RyZWFtICA8PCBjdXJyZW50VGVzdFJ1bkluZm8tPm5hbWUKKyAgICAgICAgICAgICAgICAgICAgPDwgIiBpcyBhIENhdGNoIHYiICA8PCBsaWJyYXJ5VmVyc2lvbigpIDw8ICIgaG9zdCBhcHBsaWNhdGlvbi5cbiIKKyAgICAgICAgICAgICAgICAgICAgPDwgIlJ1biB3aXRoIC0/IGZvciBvcHRpb25zXG5cbiI7CisKKyAgICAgICAgICAgIGlmKCBtX2NvbmZpZy0+cm5nU2VlZCgpICE9IDAgKQorICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiUmFuZG9tbmVzcyBzZWVkZWQgdG86ICIgPDwgbV9jb25maWctPnJuZ1NlZWQoKSA8PCAiXG5cbiI7CisKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0UnVuSW5mby51c2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGxhenlQcmludEdyb3VwSW5mbygpIHsKKyAgICAgICAgICAgIGlmKCAhY3VycmVudEdyb3VwSW5mby0+bmFtZS5lbXB0eSgpICYmIGN1cnJlbnRHcm91cEluZm8tPmdyb3Vwc0NvdW50cyA+IDEgKSB7CisgICAgICAgICAgICAgICAgcHJpbnRDbG9zZWRIZWFkZXIoICJHcm91cDogIiArIGN1cnJlbnRHcm91cEluZm8tPm5hbWUgKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50R3JvdXBJbmZvLnVzZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZvaWQgcHJpbnRUZXN0Q2FzZUFuZFNlY3Rpb25IZWFkZXIoKSB7CisgICAgICAgICAgICBhc3NlcnQoICFtX3NlY3Rpb25TdGFjay5lbXB0eSgpICk7CisgICAgICAgICAgICBwcmludE9wZW5IZWFkZXIoIGN1cnJlbnRUZXN0Q2FzZUluZm8tPm5hbWUgKTsKKworICAgICAgICAgICAgaWYoIG1fc2VjdGlvblN0YWNrLnNpemUoKSA+IDEgKSB7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6OkhlYWRlcnMgKTsKKworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNlY3Rpb25JbmZvPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBtX3NlY3Rpb25TdGFjay5iZWdpbigpKzEsIC8vIFNraXAgZmlyc3Qgc2VjdGlvbiAodGVzdCBjYXNlKQorICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IG1fc2VjdGlvblN0YWNrLmVuZCgpOworICAgICAgICAgICAgICAgIGZvciggOyBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgICAgICAgICAgICAgIHByaW50SGVhZGVyU3RyaW5nKCBpdC0+bmFtZSwgMiApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBsaW5lSW5mbyA9IG1fc2VjdGlvblN0YWNrLmJhY2soKS5saW5lSW5mbzsKKworICAgICAgICAgICAgaWYoICFsaW5lSW5mby5lbXB0eSgpICl7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IGdldExpbmVPZkNoYXJzPCctJz4oKSA8PCAnXG4nOworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpGaWxlTmFtZSApOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBsaW5lSW5mbyA8PCAnXG4nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyZWFtIDw8IGdldExpbmVPZkNoYXJzPCcuJz4oKSA8PCAnXG4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcHJpbnRDbG9zZWRIZWFkZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSApIHsKKyAgICAgICAgICAgIHByaW50T3BlbkhlYWRlciggX25hbWUgKTsKKyAgICAgICAgICAgIHN0cmVhbSA8PCBnZXRMaW5lT2ZDaGFyczwnLic+KCkgPDwgJ1xuJzsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHByaW50T3BlbkhlYWRlciggc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lICkgeworICAgICAgICAgICAgc3RyZWFtICA8PCBnZXRMaW5lT2ZDaGFyczwnLSc+KCkgPDwgJ1xuJzsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIENvbG91cjo6SGVhZGVycyApOworICAgICAgICAgICAgICAgIHByaW50SGVhZGVyU3RyaW5nKCBfbmFtZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgc3RyaW5nIGhhcyBhIDogaW4gZmlyc3QgbGluZSB3aWxsIHNldCBpbmRlbnQgdG8gZm9sbG93IGl0IG9uCisgICAgICAgIC8vIHN1YnNlcXVlbnQgbGluZXMKKyAgICAgICAgdm9pZCBwcmludEhlYWRlclN0cmluZyggc3RkOjpzdHJpbmcgY29uc3QmIF9zdHJpbmcsIHN0ZDo6c2l6ZV90IGluZGVudCA9IDAgKSB7CisgICAgICAgICAgICBzdGQ6OnNpemVfdCBpID0gX3N0cmluZy5maW5kKCAiOiAiICk7CisgICAgICAgICAgICBpZiggaSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgaSs9MjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIHN0cmVhbSA8PCBUZXh0KCBfc3RyaW5nLCBUZXh0QXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluZGVudCggaW5kZW50K2kpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluaXRpYWxJbmRlbnQoIGluZGVudCApICkgPDwgJ1xuJzsKKyAgICAgICAgfQorCisgICAgICAgIHN0cnVjdCBTdW1tYXJ5Q29sdW1uIHsKKworICAgICAgICAgICAgU3VtbWFyeUNvbHVtbiggc3RkOjpzdHJpbmcgY29uc3QmIF9sYWJlbCwgQ29sb3VyOjpDb2RlIF9jb2xvdXIgKQorICAgICAgICAgICAgOiAgIGxhYmVsKCBfbGFiZWwgKSwKKyAgICAgICAgICAgICAgICBjb2xvdXIoIF9jb2xvdXIgKQorICAgICAgICAgICAge30KKyAgICAgICAgICAgIFN1bW1hcnlDb2x1bW4gYWRkUm93KCBzdGQ6OnNpemVfdCBjb3VudCApIHsKKyAgICAgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgICAgIG9zcyA8PCBjb3VudDsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyByb3cgPSBvc3Muc3RyKCk7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ID0gcm93cy5iZWdpbigpOyBpdCAhPSByb3dzLmVuZCgpOyArK2l0ICkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSggaXQtPnNpemUoKSA8IHJvdy5zaXplKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgKml0ID0gJyAnICsgKml0OworICAgICAgICAgICAgICAgICAgICB3aGlsZSggaXQtPnNpemUoKSA+IHJvdy5zaXplKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgcm93ID0gJyAnICsgcm93OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByb3dzLnB1c2hfYmFjayggcm93ICk7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBsYWJlbDsKKyAgICAgICAgICAgIENvbG91cjo6Q29kZSBjb2xvdXI7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcm93czsKKworICAgICAgICB9OworCisgICAgICAgIHZvaWQgcHJpbnRUb3RhbHMoIFRvdGFscyBjb25zdCYgdG90YWxzICkgeworICAgICAgICAgICAgaWYoIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSA9PSAwICkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6V2FybmluZyApIDw8ICJObyB0ZXN0cyByYW5cbiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpID4gMCAmJiB0b3RhbHMudGVzdENhc2VzLmFsbFBhc3NlZCgpICkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6UmVzdWx0U3VjY2VzcyApIDw8ICJBbGwgdGVzdHMgcGFzc2VkIjsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiAoIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgcGx1cmFsaXNlKCB0b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQsICJhc3NlcnRpb24iICkgPDwgIiBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBwbHVyYWxpc2UoIHRvdGFscy50ZXN0Q2FzZXMucGFzc2VkLCAidGVzdCBjYXNlIiApIDw8ICcpJworICAgICAgICAgICAgICAgICAgICAgICAgPDwgJ1xuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3VtbWFyeUNvbHVtbj4gY29sdW1uczsKKyAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2hfYmFjayggU3VtbWFyeUNvbHVtbiggIiIsIENvbG91cjo6Tm9uZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyggdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpICkgKTsKKyAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2hfYmFjayggU3VtbWFyeUNvbHVtbiggInBhc3NlZCIsIENvbG91cjo6U3VjY2VzcyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyggdG90YWxzLnRlc3RDYXNlcy5wYXNzZWQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSb3coIHRvdGFscy5hc3NlcnRpb25zLnBhc3NlZCApICk7CisgICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoX2JhY2soIFN1bW1hcnlDb2x1bW4oICJmYWlsZWQiLCBDb2xvdXI6OlJlc3VsdEVycm9yICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyggdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkICkgKTsKKyAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2hfYmFjayggU3VtbWFyeUNvbHVtbiggImZhaWxlZCBhcyBleHBlY3RlZCIsIENvbG91cjo6UmVzdWx0RXhwZWN0ZWRGYWlsdXJlICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZEJ1dE9rICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWRCdXRPayApICk7CisKKyAgICAgICAgICAgICAgICBwcmludFN1bW1hcnlSb3coICJ0ZXN0IGNhc2VzIiwgY29sdW1ucywgMCApOworICAgICAgICAgICAgICAgIHByaW50U3VtbWFyeVJvdyggImFzc2VydGlvbnMiLCBjb2x1bW5zLCAxICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBwcmludFN1bW1hcnlSb3coIHN0ZDo6c3RyaW5nIGNvbnN0JiBsYWJlbCwgc3RkOjp2ZWN0b3I8U3VtbWFyeUNvbHVtbj4gY29uc3QmIGNvbHMsIHN0ZDo6c2l6ZV90IHJvdyApIHsKKyAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8U3VtbWFyeUNvbHVtbj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY29scy5iZWdpbigpOyBpdCAhPSBjb2xzLmVuZCgpOyArK2l0ICkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZhbHVlID0gaXQtPnJvd3Nbcm93XTsKKyAgICAgICAgICAgICAgICBpZiggaXQtPmxhYmVsLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBsYWJlbCA8PCAiOiAiOworICAgICAgICAgICAgICAgICAgICBpZiggdmFsdWUgIT0gIjAiICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpXYXJuaW5nICkgPDwgIi0gbm9uZSAtIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggdmFsdWUgIT0gIjAiICkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gIDw8IENvbG91ciggQ29sb3VyOjpMaWdodEdyZXkgKSA8PCAiIHwgIjsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtICA8PCBDb2xvdXIoIGl0LT5jb2xvdXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHZhbHVlIDw8ICcgJyA8PCBpdC0+bGFiZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyZWFtIDw8ICdcbic7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgc3RkOjpzaXplX3QgbWFrZVJhdGlvKCBzdGQ6OnNpemVfdCBudW1iZXIsIHN0ZDo6c2l6ZV90IHRvdGFsICkgeworICAgICAgICAgICAgc3RkOjpzaXplX3QgcmF0aW8gPSB0b3RhbCA+IDAgPyBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSCAqIG51bWJlci8gdG90YWwgOiAwOworICAgICAgICAgICAgcmV0dXJuICggcmF0aW8gPT0gMCAmJiBudW1iZXIgPiAwICkgPyAxIDogcmF0aW87CisgICAgICAgIH0KKyAgICAgICAgc3RhdGljIHN0ZDo6c2l6ZV90JiBmaW5kTWF4KCBzdGQ6OnNpemVfdCYgaSwgc3RkOjpzaXplX3QmIGosIHN0ZDo6c2l6ZV90JiBrICkgeworICAgICAgICAgICAgaWYoIGkgPiBqICYmIGkgPiBrICkKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIGVsc2UgaWYoIGogPiBrICkKKyAgICAgICAgICAgICAgICByZXR1cm4gajsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gazsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcHJpbnRUb3RhbHNEaXZpZGVyKCBUb3RhbHMgY29uc3QmIHRvdGFscyApIHsKKyAgICAgICAgICAgIGlmKCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgPiAwICkgeworICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IGZhaWxlZFJhdGlvID0gbWFrZVJhdGlvKCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZCwgdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpICk7CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgZmFpbGVkQnV0T2tSYXRpbyA9IG1ha2VSYXRpbyggdG90YWxzLnRlc3RDYXNlcy5mYWlsZWRCdXRPaywgdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpICk7CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgcGFzc2VkUmF0aW8gPSBtYWtlUmF0aW8oIHRvdGFscy50ZXN0Q2FzZXMucGFzc2VkLCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgKTsKKyAgICAgICAgICAgICAgICB3aGlsZSggZmFpbGVkUmF0aW8gKyBmYWlsZWRCdXRPa1JhdGlvICsgcGFzc2VkUmF0aW8gPCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSC0xICkKKyAgICAgICAgICAgICAgICAgICAgZmluZE1heCggZmFpbGVkUmF0aW8sIGZhaWxlZEJ1dE9rUmF0aW8sIHBhc3NlZFJhdGlvICkrKzsKKyAgICAgICAgICAgICAgICB3aGlsZSggZmFpbGVkUmF0aW8gKyBmYWlsZWRCdXRPa1JhdGlvICsgcGFzc2VkUmF0aW8gPiBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSC0xICkKKyAgICAgICAgICAgICAgICAgICAgZmluZE1heCggZmFpbGVkUmF0aW8sIGZhaWxlZEJ1dE9rUmF0aW8sIHBhc3NlZFJhdGlvICktLTsKKworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6RXJyb3IgKSA8PCBzdGQ6OnN0cmluZyggZmFpbGVkUmF0aW8sICc9JyApOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6UmVzdWx0RXhwZWN0ZWRGYWlsdXJlICkgPDwgc3RkOjpzdHJpbmcoIGZhaWxlZEJ1dE9rUmF0aW8sICc9JyApOworICAgICAgICAgICAgICAgIGlmKCB0b3RhbHMudGVzdENhc2VzLmFsbFBhc3NlZCgpICkKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpSZXN1bHRTdWNjZXNzICkgPDwgc3RkOjpzdHJpbmcoIHBhc3NlZFJhdGlvLCAnPScgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6U3VjY2VzcyApIDw8IHN0ZDo6c3RyaW5nKCBwYXNzZWRSYXRpbywgJz0nICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKCBDb2xvdXI6Oldhcm5pbmcgKSA8PCBzdGQ6OnN0cmluZyggQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgtMSwgJz0nICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJzsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHByaW50U3VtbWFyeURpdmlkZXIoKSB7CisgICAgICAgICAgICBzdHJlYW0gPDwgZ2V0TGluZU9mQ2hhcnM8Jy0nPigpIDw8ICdcbic7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGJvb2wgbV9oZWFkZXJQcmludGVkOworICAgIH07CisKKyAgICBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggImNvbnNvbGUiLCBDb25zb2xlUmVwb3J0ZXIgKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IC4uL3JlcG9ydGVycy9jYXRjaF9yZXBvcnRlcl9jb21wYWN0LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfQ09NUEFDVF9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBDb21wYWN0UmVwb3J0ZXIgOiBTdHJlYW1pbmdSZXBvcnRlckJhc2UgeworCisgICAgICAgIENvbXBhY3RSZXBvcnRlciggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKQorICAgICAgICA6IFN0cmVhbWluZ1JlcG9ydGVyQmFzZSggX2NvbmZpZyApCisgICAgICAgIHt9CisKKyAgICAgICAgdmlydHVhbCB+Q29tcGFjdFJlcG9ydGVyKCk7CisKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICJSZXBvcnRzIHRlc3QgcmVzdWx0cyBvbiBhIHNpbmdsZSBsaW5lLCBzdWl0YWJsZSBmb3IgSURFcyI7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIFJlcG9ydGVyUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSBjb25zdCB7CisgICAgICAgICAgICBSZXBvcnRlclByZWZlcmVuY2VzIHByZWZzOworICAgICAgICAgICAgcHJlZnMuc2hvdWxkUmVkaXJlY3RTdGRPdXQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBwcmVmczsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3BlYyApIHsKKyAgICAgICAgICAgIHN0cmVhbSA8PCAiTm8gdGVzdCBjYXNlcyBtYXRjaGVkICciIDw8IHNwZWMgPDwgJ1wnJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmICkge30KKworICAgICAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBfYXNzZXJ0aW9uU3RhdHMgKSB7CisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCA9IF9hc3NlcnRpb25TdGF0cy5hc3NlcnRpb25SZXN1bHQ7CisKKyAgICAgICAgICAgIGJvb2wgcHJpbnRJbmZvTWVzc2FnZXMgPSB0cnVlOworCisgICAgICAgICAgICAvLyBEcm9wIG91dCBpZiByZXN1bHQgd2FzIHN1Y2Nlc3NmdWwgYW5kIHdlJ3JlIG5vdCBwcmludGluZyB0aG9zZQorICAgICAgICAgICAgaWYoICFtX2NvbmZpZy0+aW5jbHVkZVN1Y2Nlc3NmdWxSZXN1bHRzKCkgJiYgcmVzdWx0LmlzT2soKSApIHsKKyAgICAgICAgICAgICAgICBpZiggcmVzdWx0LmdldFJlc3VsdFR5cGUoKSAhPSBSZXN1bHRXYXM6Oldhcm5pbmcgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcHJpbnRJbmZvTWVzc2FnZXMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQXNzZXJ0aW9uUHJpbnRlciBwcmludGVyKCBzdHJlYW0sIF9hc3NlcnRpb25TdGF0cywgcHJpbnRJbmZvTWVzc2FnZXMgKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoKTsKKworICAgICAgICAgICAgc3RyZWFtIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZChTZWN0aW9uU3RhdHMgY29uc3QmIF9zZWN0aW9uU3RhdHMpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGlmIChtX2NvbmZpZy0+c2hvd0R1cmF0aW9ucygpID09IFNob3dEdXJhdGlvbnM6OkFsd2F5cykgeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBnZXRGb3JtYXR0ZWREdXJhdGlvbihfc2VjdGlvblN0YXRzLmR1cmF0aW9uSW5TZWNvbmRzKSA8PCAiIHM6ICIgPDwgX3NlY3Rpb25TdGF0cy5zZWN0aW9uSW5mby5uYW1lIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgX3Rlc3RSdW5TdGF0cyApIHsKKyAgICAgICAgICAgIHByaW50VG90YWxzKCBfdGVzdFJ1blN0YXRzLnRvdGFscyApOworICAgICAgICAgICAgc3RyZWFtIDw8ICdcbicgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0UnVuRW5kZWQoIF90ZXN0UnVuU3RhdHMgKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY2xhc3MgQXNzZXJ0aW9uUHJpbnRlciB7CisgICAgICAgICAgICB2b2lkIG9wZXJhdG9yPSAoIEFzc2VydGlvblByaW50ZXIgY29uc3QmICk7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEFzc2VydGlvblByaW50ZXIoIHN0ZDo6b3N0cmVhbSYgX3N0cmVhbSwgQXNzZXJ0aW9uU3RhdHMgY29uc3QmIF9zdGF0cywgYm9vbCBfcHJpbnRJbmZvTWVzc2FnZXMgKQorICAgICAgICAgICAgOiBzdHJlYW0oIF9zdHJlYW0gKQorICAgICAgICAgICAgLCBzdGF0cyggX3N0YXRzICkKKyAgICAgICAgICAgICwgcmVzdWx0KCBfc3RhdHMuYXNzZXJ0aW9uUmVzdWx0ICkKKyAgICAgICAgICAgICwgbWVzc2FnZXMoIF9zdGF0cy5pbmZvTWVzc2FnZXMgKQorICAgICAgICAgICAgLCBpdE1lc3NhZ2UoIF9zdGF0cy5pbmZvTWVzc2FnZXMuYmVnaW4oKSApCisgICAgICAgICAgICAsIHByaW50SW5mb01lc3NhZ2VzKCBfcHJpbnRJbmZvTWVzc2FnZXMgKQorICAgICAgICAgICAge30KKworICAgICAgICAgICAgdm9pZCBwcmludCgpIHsKKyAgICAgICAgICAgICAgICBwcmludFNvdXJjZUluZm8oKTsKKworICAgICAgICAgICAgICAgIGl0TWVzc2FnZSA9IG1lc3NhZ2VzLmJlZ2luKCk7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2goIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpPazoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpSZXN1bHRTdWNjZXNzLCBwYXNzZWRTdHJpbmcoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISByZXN1bHQuaGFzRXhwcmVzc2lvbigpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCBDb2xvdXI6Ok5vbmUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4cHJlc3Npb25GYWlsZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggcmVzdWx0LmlzT2soKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OlJlc3VsdFN1Y2Nlc3MsIGZhaWxlZFN0cmluZygpICsgc3RkOjpzdHJpbmcoICIgLSBidXQgd2FzIG9rIiApICk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OkVycm9yLCBmYWlsZWRTdHJpbmcoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6RXJyb3IsIGZhaWxlZFN0cmluZygpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludElzc3VlKCAidW5leHBlY3RlZCBleGNlcHRpb24gd2l0aCBtZXNzYWdlOiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFeHByZXNzaW9uV2FzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhdGFsRXJyb3JDb25kaXRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6RXJyb3IsIGZhaWxlZFN0cmluZygpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludElzc3VlKCAiZmF0YWwgZXJyb3IgY29uZGl0aW9uIHdpdGggbWVzc2FnZToiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXhwcmVzc2lvbldhcygpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpEaWRudFRocm93RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OkVycm9yLCBmYWlsZWRTdHJpbmcoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRJc3N1ZSggImV4cGVjdGVkIGV4Y2VwdGlvbiwgZ290IG5vbmUiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludEV4cHJlc3Npb25XYXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6SW5mbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpOb25lLCAiaW5mbyIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpXYXJuaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6Ok5vbmUsICJ3YXJuaW5nIiApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpFcnJvciwgZmFpbGVkU3RyaW5nKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50SXNzdWUoICJleHBsaWNpdGx5IiApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcyggQ29sb3VyOjpOb25lICk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2UgY2FzZXMgYXJlIGhlcmUgdG8gcHJldmVudCBjb21waWxlciB3YXJuaW5ncworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VW5rbm93bjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhaWx1cmVCaXQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6RXJyb3IsICIqKiBpbnRlcm5hbCBlcnJvciAqKiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgLy8gQ29sb3VyOjpMaWdodEdyZXkKKworICAgICAgICAgICAgc3RhdGljIENvbG91cjo6Q29kZSBkaW1Db2xvdXIoKSB7IHJldHVybiBDb2xvdXI6OkZpbGVOYW1lOyB9CisKKyNpZmRlZiBDQVRDSF9QTEFURk9STV9NQUMKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBmYWlsZWRTdHJpbmcoKSB7IHJldHVybiAiRkFJTEVEIjsgfQorICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIHBhc3NlZFN0cmluZygpIHsgcmV0dXJuICJQQVNTRUQiOyB9CisjZWxzZQorICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGZhaWxlZFN0cmluZygpIHsgcmV0dXJuICJmYWlsZWQiOyB9CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogcGFzc2VkU3RyaW5nKCkgeyByZXR1cm4gInBhc3NlZCI7IH0KKyNlbmRpZgorCisgICAgICAgICAgICB2b2lkIHByaW50U291cmNlSW5mbygpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIENvbG91cjo6RmlsZU5hbWUgKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgcmVzdWx0LmdldFNvdXJjZUluZm8oKSA8PCAnOic7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OkNvZGUgY29sb3VyLCBzdGQ6OnN0cmluZyBjb25zdCYgcGFzc09yRmFpbCApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggIXBhc3NPckZhaWwuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBjb2xvdXIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnICcgPDwgcGFzc09yRmFpbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJzonOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludElzc3VlKCBzdGQ6OnN0cmluZyBjb25zdCYgaXNzdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICcgJyA8PCBpc3N1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludEV4cHJlc3Npb25XYXMoKSB7CisgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHByZXNzaW9uKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnOyc7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXIoIGRpbUNvbG91cigpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiBleHByZXNzaW9uIHdhczoiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHByaW50T3JpZ2luYWxFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHByaW50T3JpZ2luYWxFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuaGFzRXhwcmVzc2lvbigpICkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJyAnIDw8IHJlc3VsdC5nZXRFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHByaW50UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHBhbmRlZEV4cHJlc3Npb24oKSApIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ciggZGltQ29sb3VyKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiIGZvcjogIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgcmVzdWx0LmdldEV4cGFuZGVkRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludE1lc3NhZ2UoKSB7CisgICAgICAgICAgICAgICAgaWYgKCBpdE1lc3NhZ2UgIT0gbWVzc2FnZXMuZW5kKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiICciIDw8IGl0TWVzc2FnZS0+bWVzc2FnZSA8PCAnXCcnOworICAgICAgICAgICAgICAgICAgICArK2l0TWVzc2FnZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnRSZW1haW5pbmdNZXNzYWdlcyggQ29sb3VyOjpDb2RlIGNvbG91ciA9IGRpbUNvbG91cigpICkgeworICAgICAgICAgICAgICAgIGlmICggaXRNZXNzYWdlID09IG1lc3NhZ2VzLmVuZCgpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgLy8gdXNpbmcgbWVzc2FnZXMuZW5kKCkgZGlyZWN0bHkgeWllbGRzIGNvbXBpbGF0aW9uIGVycm9yOgorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPjo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBtZXNzYWdlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNpemVfdCBOID0gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KCBzdGQ6OmRpc3RhbmNlKCBpdE1lc3NhZ2UsIGl0RW5kICkgKTsKKworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBjb2xvdXIgKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICIgd2l0aCAiIDw8IHBsdXJhbGlzZSggTiwgIm1lc3NhZ2UiICkgPDwgJzonOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvcig7IGl0TWVzc2FnZSAhPSBpdEVuZDsgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgYXNzZXJ0aW9uIGlzIGEgd2FybmluZyBpZ25vcmUgYW55IElORk8gbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgaWYoIHByaW50SW5mb01lc3NhZ2VzIHx8IGl0TWVzc2FnZS0+dHlwZSAhPSBSZXN1bHRXYXM6OkluZm8gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiAnIiA8PCBpdE1lc3NhZ2UtPm1lc3NhZ2UgPDwgJ1wnJzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKytpdE1lc3NhZ2UgIT0gaXRFbmQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBkaW1Db2xvdXIoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiIGFuZCI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtOworICAgICAgICAgICAgQXNzZXJ0aW9uU3RhdHMgY29uc3QmIHN0YXRzOworICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQ7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz4gbWVzc2FnZXM7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGl0TWVzc2FnZTsKKyAgICAgICAgICAgIGJvb2wgcHJpbnRJbmZvTWVzc2FnZXM7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gQ29sb3VyLCBtZXNzYWdlIHZhcmlhbnRzOgorICAgICAgICAvLyAtIHdoaXRlOiBObyB0ZXN0cyByYW4uCisgICAgICAgIC8vIC0gICByZWQ6IEZhaWxlZCBbYm90aC9hbGxdIE4gdGVzdCBjYXNlcywgZmFpbGVkIFtib3RoL2FsbF0gTSBhc3NlcnRpb25zLgorICAgICAgICAvLyAtIHdoaXRlOiBQYXNzZWQgW2JvdGgvYWxsXSBOIHRlc3QgY2FzZXMgKG5vIGFzc2VydGlvbnMpLgorICAgICAgICAvLyAtICAgcmVkOiBGYWlsZWQgTiB0ZXN0cyBjYXNlcywgZmFpbGVkIE0gYXNzZXJ0aW9ucy4KKyAgICAgICAgLy8gLSBncmVlbjogUGFzc2VkIFtib3RoL2FsbF0gTiB0ZXN0cyBjYXNlcyB3aXRoIE0gYXNzZXJ0aW9ucy4KKworICAgICAgICBzdGQ6OnN0cmluZyBib3RoT3JBbGwoIHN0ZDo6c2l6ZV90IGNvdW50ICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGNvdW50ID09IDEgPyBzdGQ6OnN0cmluZygpIDogY291bnQgPT0gMiA/ICJib3RoICIgOiAiYWxsICIgOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBwcmludFRvdGFscyggY29uc3QgVG90YWxzJiB0b3RhbHMgKSBjb25zdCB7CisgICAgICAgICAgICBpZiggdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpID09IDAgKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICJObyB0ZXN0cyByYW4uIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkID09IHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSApIHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyKCBDb2xvdXI6OlJlc3VsdEVycm9yICk7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcXVhbGlmeV9hc3NlcnRpb25zX2ZhaWxlZCA9CisgICAgICAgICAgICAgICAgICAgIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCA9PSB0b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJvdGhPckFsbCggdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkICkgOiBzdGQ6OnN0cmluZygpOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkICIgPDwgYm90aE9yQWxsKCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBwbHVyYWxpc2UoIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkLCAidGVzdCBjYXNlIiAgKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgIiA8PCBxdWFsaWZ5X2Fzc2VydGlvbnNfZmFpbGVkIDw8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVyYWxpc2UoIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCwgImFzc2VydGlvbiIgKSA8PCAnLic7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpID09IDAgKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8CisgICAgICAgICAgICAgICAgICAgICJQYXNzZWQgIiA8PCBib3RoT3JBbGwoIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBwbHVyYWxpc2UoIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSwgInRlc3QgY2FzZSIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAobm8gYXNzZXJ0aW9ucykuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCApIHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyKCBDb2xvdXI6OlJlc3VsdEVycm9yICk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8CisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgIiA8PCBwbHVyYWxpc2UoIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkLCAidGVzdCBjYXNlIiAgKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgIiA8PCBwbHVyYWxpc2UoIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCwgImFzc2VydGlvbiIgKSA8PCAnLic7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyKCBDb2xvdXI6OlJlc3VsdFN1Y2Nlc3MgKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwKKyAgICAgICAgICAgICAgICAgICAgIlBhc3NlZCAiIDw8IGJvdGhPckFsbCggdG90YWxzLnRlc3RDYXNlcy5wYXNzZWQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcGx1cmFsaXNlKCB0b3RhbHMudGVzdENhc2VzLnBhc3NlZCwgInRlc3QgY2FzZSIgICkgPDwKKyAgICAgICAgICAgICAgICAgICAgIiB3aXRoICIgIDw8IHBsdXJhbGlzZSggdG90YWxzLmFzc2VydGlvbnMucGFzc2VkLCAiYXNzZXJ0aW9uIiApIDw8ICcuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggImNvbXBhY3QiLCBDb21wYWN0UmVwb3J0ZXIgKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICAvLyBUaGVzZSBhcmUgYWxsIGhlcmUgdG8gYXZvaWQgd2FybmluZ3MgYWJvdXQgbm90IGhhdmluZyBhbnkgb3V0IG9mIGxpbmUKKyAgICAvLyB2aXJ0dWFsIG1ldGhvZHMKKyAgICBOb25Db3B5YWJsZTo6fk5vbkNvcHlhYmxlKCkge30KKyAgICBJU2hhcmVkOjp+SVNoYXJlZCgpIHt9CisgICAgSVN0cmVhbTo6fklTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVCB7fQorICAgIEZpbGVTdHJlYW06On5GaWxlU3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQge30KKyAgICBDb3V0U3RyZWFtOjp+Q291dFN0cmVhbSgpIENBVENIX05PRVhDRVBUIHt9CisgICAgRGVidWdPdXRTdHJlYW06On5EZWJ1Z091dFN0cmVhbSgpIENBVENIX05PRVhDRVBUIHt9CisgICAgU3RyZWFtQnVmQmFzZTo6flN0cmVhbUJ1ZkJhc2UoKSBDQVRDSF9OT0VYQ0VQVCB7fQorICAgIElDb250ZXh0Ojp+SUNvbnRleHQoKSB7fQorICAgIElSZXN1bHRDYXB0dXJlOjp+SVJlc3VsdENhcHR1cmUoKSB7fQorICAgIElUZXN0Q2FzZTo6fklUZXN0Q2FzZSgpIHt9CisgICAgSVRlc3RDYXNlUmVnaXN0cnk6On5JVGVzdENhc2VSZWdpc3RyeSgpIHt9CisgICAgSVJlZ2lzdHJ5SHViOjp+SVJlZ2lzdHJ5SHViKCkge30KKyAgICBJTXV0YWJsZVJlZ2lzdHJ5SHViOjp+SU11dGFibGVSZWdpc3RyeUh1YigpIHt9CisgICAgSUV4Y2VwdGlvblRyYW5zbGF0b3I6On5JRXhjZXB0aW9uVHJhbnNsYXRvcigpIHt9CisgICAgSUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeTo6fklFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkoKSB7fQorICAgIElSZXBvcnRlcjo6fklSZXBvcnRlcigpIHt9CisgICAgSVJlcG9ydGVyRmFjdG9yeTo6fklSZXBvcnRlckZhY3RvcnkoKSB7fQorICAgIElSZXBvcnRlclJlZ2lzdHJ5Ojp+SVJlcG9ydGVyUmVnaXN0cnkoKSB7fQorICAgIElTdHJlYW1pbmdSZXBvcnRlcjo6fklTdHJlYW1pbmdSZXBvcnRlcigpIHt9CisgICAgQXNzZXJ0aW9uU3RhdHM6On5Bc3NlcnRpb25TdGF0cygpIHt9CisgICAgU2VjdGlvblN0YXRzOjp+U2VjdGlvblN0YXRzKCkge30KKyAgICBUZXN0Q2FzZVN0YXRzOjp+VGVzdENhc2VTdGF0cygpIHt9CisgICAgVGVzdEdyb3VwU3RhdHM6On5UZXN0R3JvdXBTdGF0cygpIHt9CisgICAgVGVzdFJ1blN0YXRzOjp+VGVzdFJ1blN0YXRzKCkge30KKyAgICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjpTZWN0aW9uTm9kZTo6flNlY3Rpb25Ob2RlKCkge30KKyAgICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjp+Q3VtdWxhdGl2ZVJlcG9ydGVyQmFzZSgpIHt9CisKKyAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6On5TdHJlYW1pbmdSZXBvcnRlckJhc2UoKSB7fQorICAgIENvbnNvbGVSZXBvcnRlcjo6fkNvbnNvbGVSZXBvcnRlcigpIHt9CisgICAgQ29tcGFjdFJlcG9ydGVyOjp+Q29tcGFjdFJlcG9ydGVyKCkge30KKyAgICBJUnVubmVyOjp+SVJ1bm5lcigpIHt9CisgICAgSU11dGFibGVDb250ZXh0Ojp+SU11dGFibGVDb250ZXh0KCkge30KKyAgICBJQ29uZmlnOjp+SUNvbmZpZygpIHt9CisgICAgWG1sUmVwb3J0ZXI6On5YbWxSZXBvcnRlcigpIHt9CisgICAgSnVuaXRSZXBvcnRlcjo6fkp1bml0UmVwb3J0ZXIoKSB7fQorICAgIFRlc3RSZWdpc3RyeTo6flRlc3RSZWdpc3RyeSgpIHt9CisgICAgRnJlZUZ1bmN0aW9uVGVzdENhc2U6On5GcmVlRnVuY3Rpb25UZXN0Q2FzZSgpIHt9CisgICAgSUdlbmVyYXRvckluZm86On5JR2VuZXJhdG9ySW5mbygpIHt9CisgICAgSUdlbmVyYXRvcnNGb3JUZXN0Ojp+SUdlbmVyYXRvcnNGb3JUZXN0KCkge30KKyAgICBXaWxkY2FyZFBhdHRlcm46On5XaWxkY2FyZFBhdHRlcm4oKSB7fQorICAgIFRlc3RTcGVjOjpQYXR0ZXJuOjp+UGF0dGVybigpIHt9CisgICAgVGVzdFNwZWM6Ok5hbWVQYXR0ZXJuOjp+TmFtZVBhdHRlcm4oKSB7fQorICAgIFRlc3RTcGVjOjpUYWdQYXR0ZXJuOjp+VGFnUGF0dGVybigpIHt9CisgICAgVGVzdFNwZWM6OkV4Y2x1ZGVkUGF0dGVybjo6fkV4Y2x1ZGVkUGF0dGVybigpIHt9CisgICAgTWF0Y2hlcnM6OkltcGw6Ok1hdGNoZXJVbnR5cGVkQmFzZTo6fk1hdGNoZXJVbnR5cGVkQmFzZSgpIHt9CisKKyAgICB2b2lkIENvbmZpZzo6ZHVtbXkoKSB7fQorCisgICAgbmFtZXNwYWNlIFRlc3RDYXNlVHJhY2tpbmcgeworICAgICAgICBJVHJhY2tlcjo6fklUcmFja2VyKCkge30KKyAgICAgICAgVHJhY2tlckJhc2U6On5UcmFja2VyQmFzZSgpIHt9CisgICAgICAgIFNlY3Rpb25UcmFja2VyOjp+U2VjdGlvblRyYWNrZXIoKSB7fQorICAgICAgICBJbmRleFRyYWNrZXI6On5JbmRleFRyYWNrZXIoKSB7fQorICAgIH0KK30KKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX01BSU4KKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9kZWZhdWx0X21haW4uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9ERUZBVUxUX01BSU5fSFBQX0lOQ0xVREVECisKKyNpZm5kZWYgX19PQkpDX18KKworI2lmIGRlZmluZWQoV0lOMzIpICYmIGRlZmluZWQoX1VOSUNPREUpICYmICFkZWZpbmVkKERPX05PVF9VU0VfV01BSU4pCisvLyBTdGFuZGFyZCBDL0MrKyBXaW4zMiBVbmljb2RlIHdtYWluIGVudHJ5IHBvaW50CitleHRlcm4gIkMiIGludCB3bWFpbiAoaW50IGFyZ2MsIHdjaGFyX3QgKiBhcmd2W10sIHdjaGFyX3QgKiBbXSkgeworI2Vsc2UKKy8vIFN0YW5kYXJkIEMvQysrIG1haW4gZW50cnkgcG9pbnQKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqIGFyZ3ZbXSkgeworI2VuZGlmCisKKwlpbnQgcmVzdWx0ID0gQ2F0Y2g6OlNlc3Npb24oKS5ydW4oIGFyZ2MsIGFyZ3YgKTsKKyAgICByZXR1cm4gKCByZXN1bHQgPCAweGZmID8gcmVzdWx0IDogMHhmZiApOworfQorCisjZWxzZSAvLyBfX09CSkNfXworCisvLyBPYmplY3RpdmUtQyBlbnRyeSBwb2ludAoraW50IG1haW4gKGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKSB7CisjaWYgIUNBVENIX0FSQ19FTkFCTEVECisgICAgTlNBdXRvcmVsZWFzZVBvb2wgKiBwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07CisjZW5kaWYKKworICAgIENhdGNoOjpyZWdpc3RlclRlc3RNZXRob2RzKCk7CisgICAgaW50IHJlc3VsdCA9IENhdGNoOjpTZXNzaW9uKCkucnVuKCBhcmdjLCAoY2hhciogY29uc3QqKWFyZ3YgKTsKKworI2lmICFDQVRDSF9BUkNfRU5BQkxFRAorICAgIFtwb29sIGRyYWluXTsKKyNlbmRpZgorCisgICAgcmV0dXJuICggcmVzdWx0IDwgMHhmZiA/IHJlc3VsdCA6IDB4ZmYgKTsKK30KKworI2VuZGlmIC8vIF9fT0JKQ19fCisKKyNlbmRpZgorCisjaWZkZWYgQ0xBUkFfQ09ORklHX01BSU5fTk9UX0RFRklORUQKKyMgIHVuZGVmIENMQVJBX0NPTkZJR19NQUlOCisjZW5kaWYKKworLy8vLy8vCisKKy8vIElmIHRoaXMgY29uZmlnIGlkZW50aWZpZXIgaXMgZGVmaW5lZCB0aGVuIGFsbCBDQVRDSCBtYWNyb3MgYXJlIHByZWZpeGVkIHdpdGggQ0FUQ0hfCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1BSRUZJWF9BTEwKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1RfTk9fVFJZKCAiQ0FUQ0hfUkVRVUlSRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9GQUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1RfTk9fVFJZKCAiQ0FUQ0hfUkVRVUlSRV9GQUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIGV4cHIgKQorI2Vsc2UKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJDQVRDSF9SRVFVSVJFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9SRVFVSVJFX0ZBTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNBVENIX1JFUVVJUkVfRkFMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6RmFsc2VUZXN0LCBleHByICApCisjZW5kaWYKKworI2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIUk9XUyggZXhwciApIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIkNBVENIX1JFUVVJUkVfVEhST1dTIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsICIiLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9USFJPV1NfQVMoIGV4cHIsIGV4Y2VwdGlvblR5cGUgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1NfQVMoICJDQVRDSF9SRVFVSVJFX1RIUk9XU19BUyIsIGV4Y2VwdGlvblR5cGUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9USFJPV1NfV0lUSCggZXhwciwgbWF0Y2hlciApIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIkNBVENIX1JFUVVJUkVfVEhST1dTX1dJVEgiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgbWF0Y2hlciwgZXhwciApCisjZGVmaW5lIENBVENIX1JFUVVJUkVfTk9USFJPVyggZXhwciApIElOVEVSTkFMX0NBVENIX05PX1RIUk9XKCAiQ0FUQ0hfUkVRVUlSRV9OT1RIUk9XIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorCisjZGVmaW5lIENBVENIX0NIRUNLKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNBVENIX0NIRUNLIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLX0ZBTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNBVENIX0NIRUNLX0ZBTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6RmFsc2VUZXN0LCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tFRF9JRiggZXhwciApIElOVEVSTkFMX0NBVENIX0lGKCAiQ0FUQ0hfQ0hFQ0tFRF9JRiIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9DSEVDS0VEX0VMU0UoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9FTFNFKCAiQ0FUQ0hfQ0hFQ0tFRF9FTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLX05PRkFJTCggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJDQVRDSF9DSEVDS19OT0ZBSUwiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpTdXBwcmVzc0ZhaWwsIGV4cHIgKQorCisjZGVmaW5lIENBVENIX0NIRUNLX1RIUk9XUyggZXhwciApICBJTlRFUk5BTF9DQVRDSF9USFJPV1MoICJDQVRDSF9DSEVDS19USFJPV1MiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCAiIiwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLX1RIUk9XU19BUyggZXhwciwgZXhjZXB0aW9uVHlwZSApIElOVEVSTkFMX0NBVENIX1RIUk9XU19BUyggIkNBVENIX0NIRUNLX1RIUk9XU19BUyIsIGV4Y2VwdGlvblR5cGUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9DSEVDS19USFJPV1NfV0lUSCggZXhwciwgbWF0Y2hlciApIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIkNBVENIX0NIRUNLX1RIUk9XU19XSVRIIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbWF0Y2hlciwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLX05PVEhST1coIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9OT19USFJPVyggIkNBVENIX0NIRUNLX05PVEhST1ciLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKworI2RlZmluZSBDQVRDSF9DSEVDS19USEFUKCBhcmcsIG1hdGNoZXIgKSBJTlRFUk5BTF9DSEVDS19USEFUKCAiQ0FUQ0hfQ0hFQ0tfVEhBVCIsIG1hdGNoZXIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGFyZyApCisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUpCisjZGVmaW5lIENBVENIX1JFUVVJUkVfVEhBVCggYXJnLCBtYXRjaGVyICkgSU5URVJOQUxfQ0hFQ0tfVEhBVF9OT19UUlkoICJDQVRDSF9SRVFVSVJFX1RIQVQiLCBtYXRjaGVyLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgYXJnICkKKyNlbHNlCisjZGVmaW5lIENBVENIX1JFUVVJUkVfVEhBVCggYXJnLCBtYXRjaGVyICkgSU5URVJOQUxfQ0hFQ0tfVEhBVCggIkNBVENIX1JFUVVJUkVfVEhBVCIsIG1hdGNoZXIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBhcmcgKQorI2VuZGlmCisKKyNkZWZpbmUgQ0FUQ0hfSU5GTyggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIkNBVENIX0lORk8iLCBtc2cgKQorI2RlZmluZSBDQVRDSF9XQVJOKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9XQVJOIiwgQ2F0Y2g6OlJlc3VsdFdhczo6V2FybmluZywgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbXNnICkKKyNkZWZpbmUgQ0FUQ0hfU0NPUEVEX0lORk8oIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJDQVRDSF9JTkZPIiwgbXNnICkKKyNkZWZpbmUgQ0FUQ0hfQ0FQVFVSRSggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIkNBVENIX0NBUFRVUkUiLCAjbXNnICIgOj0gIiA8PCBDYXRjaDo6dG9TdHJpbmcobXNnKSApCisjZGVmaW5lIENBVENIX1NDT1BFRF9DQVBUVVJFKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiQ0FUQ0hfQ0FQVFVSRSIsICNtc2cgIiA6PSAiIDw8IENhdGNoOjp0b1N0cmluZyhtc2cpICkKKworI2lmZGVmIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyAgICAjZGVmaW5lIENBVENIX1RFU1RfQ0FTRSggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoIF9fVkFfQVJHU19fICkKKyAgICAjZGVmaW5lIENBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCBfX1ZBX0FSR1NfXyApCisgICAgI2RlZmluZSBDQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIC4uLiApIElOVEVSTkFMX0NBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgX19WQV9BUkdTX18gKQorICAgICNkZWZpbmUgQ0FUQ0hfUkVHSVNURVJfVEVTVF9DQVNFKCBGdW5jdGlvbiwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfVEVTVENBU0UoIEZ1bmN0aW9uLCBfX1ZBX0FSR1NfXyApCisgICAgI2RlZmluZSBDQVRDSF9TRUNUSU9OKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9TRUNUSU9OKCBfX1ZBX0FSR1NfXyApCisgICAgI2RlZmluZSBDQVRDSF9GQUlMKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9GQUlMIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgX19WQV9BUkdTX18gKQorICAgICNkZWZpbmUgQ0FUQ0hfRkFJTF9DSEVDSyggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiQ0FUQ0hfRkFJTF9DSEVDSyIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgX19WQV9BUkdTX18gKQorICAgICNkZWZpbmUgQ0FUQ0hfU1VDQ0VFRCggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiQ0FUQ0hfU1VDQ0VFRCIsIENhdGNoOjpSZXN1bHRXYXM6Ok9rLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBfX1ZBX0FSR1NfXyApCisjZWxzZQorICAgICNkZWZpbmUgQ0FUQ0hfVEVTVF9DQVNFKCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBDQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBDQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBDQVRDSF9SRUdJU1RFUl9URVNUX0NBU0UoIGZ1bmN0aW9uLCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1RFU1RDQVNFKCBmdW5jdGlvbiwgbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgQ0FUQ0hfU0VDVElPTiggbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9TRUNUSU9OKCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBDQVRDSF9GQUlMKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9GQUlMIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgbXNnICkKKyAgICAjZGVmaW5lIENBVENIX0ZBSUxfQ0hFQ0soIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIkNBVENIX0ZBSUxfQ0hFQ0siLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1zZyApCisgICAgI2RlZmluZSBDQVRDSF9TVUNDRUVEKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9TVUNDRUVEIiwgQ2F0Y2g6OlJlc3VsdFdhczo6T2ssIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1zZyApCisjZW5kaWYKKyNkZWZpbmUgQ0FUQ0hfQU5PTl9URVNUX0NBU0UoKSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRSggIiIsICIiICkKKworI2RlZmluZSBDQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApCisjZGVmaW5lIENBVENIX1JFR0lTVEVSX0xFR0FDWV9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfTEVHQUNZX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKQorCisjZGVmaW5lIENBVENIX0dFTkVSQVRFKCBleHByKSBJTlRFUk5BTF9DQVRDSF9HRU5FUkFURSggZXhwciApCisKKy8vICJCREQtc3R5bGUiIGNvbnZlbmllbmNlIHdyYXBwZXJzCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUworI2RlZmluZSBDQVRDSF9TQ0VOQVJJTyggLi4uICkgQ0FUQ0hfVEVTVF9DQVNFKCAiU2NlbmFyaW86ICIgX19WQV9BUkdTX18gKQorI2RlZmluZSBDQVRDSF9TQ0VOQVJJT19NRVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAiU2NlbmFyaW86ICIgX19WQV9BUkdTX18gKQorI2Vsc2UKKyNkZWZpbmUgQ0FUQ0hfU0NFTkFSSU8oIG5hbWUsIHRhZ3MgKSBDQVRDSF9URVNUX0NBU0UoICJTY2VuYXJpbzogIiBuYW1lLCB0YWdzICkKKyNkZWZpbmUgQ0FUQ0hfU0NFTkFSSU9fTUVUSE9EKCBjbGFzc05hbWUsIG5hbWUsIHRhZ3MgKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsICJTY2VuYXJpbzogIiBuYW1lLCB0YWdzICkKKyNlbmRpZgorI2RlZmluZSBDQVRDSF9HSVZFTiggZGVzYyApICAgIENBVENIX1NFQ1RJT04oIHN0ZDo6c3RyaW5nKCAiR2l2ZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBDQVRDSF9XSEVOKCBkZXNjICkgICAgIENBVENIX1NFQ1RJT04oIHN0ZDo6c3RyaW5nKCAiIFdoZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBDQVRDSF9BTkRfV0hFTiggZGVzYyApIENBVENIX1NFQ1RJT04oIHN0ZDo6c3RyaW5nKCAiICBBbmQ6ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBDQVRDSF9USEVOKCBkZXNjICkgICAgIENBVENIX1NFQ1RJT04oIHN0ZDo6c3RyaW5nKCAiIFRoZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBDQVRDSF9BTkRfVEhFTiggZGVzYyApIENBVENIX1NFQ1RJT04oIHN0ZDo6c3RyaW5nKCAiICBBbmQ6ICIpICsgZGVzYywgIiIgKQorCisvLyBJZiBDQVRDSF9DT05GSUdfUFJFRklYX0FMTCBpcyBub3QgZGVmaW5lZCB0aGVuIHRoZSBDQVRDSF8gcHJlZml4IGlzIG5vdCByZXF1aXJlZAorI2Vsc2UKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkKKyNkZWZpbmUgUkVRVUlSRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1RfTk9fVFJZKCAiUkVRVUlSRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICkKKyNkZWZpbmUgUkVRVUlSRV9GQUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1RfTk9fVFJZKCAiUkVRVUlSRV9GQUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIGV4cHIgKQorCisjZWxzZQorI2RlZmluZSBSRVFVSVJFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIlJFUVVJUkUiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgZXhwciAgKQorI2RlZmluZSBSRVFVSVJFX0ZBTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIlJFUVVJUkVfRkFMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6RmFsc2VUZXN0LCBleHByICkKKyNlbmRpZgorCisjZGVmaW5lIFJFUVVJUkVfVEhST1dTKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiUkVRVUlSRV9USFJPV1MiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgIiIsIGV4cHIgKQorI2RlZmluZSBSRVFVSVJFX1RIUk9XU19BUyggZXhwciwgZXhjZXB0aW9uVHlwZSApIElOVEVSTkFMX0NBVENIX1RIUk9XU19BUyggIlJFUVVJUkVfVEhST1dTX0FTIiwgZXhjZXB0aW9uVHlwZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorI2RlZmluZSBSRVFVSVJFX1RIUk9XU19XSVRIKCBleHByLCBtYXRjaGVyICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiUkVRVUlSRV9USFJPV1NfV0lUSCIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBtYXRjaGVyLCBleHByICkKKyNkZWZpbmUgUkVRVUlSRV9OT1RIUk9XKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfTk9fVEhST1coICJSRVFVSVJFX05PVEhST1ciLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgZXhwciApCisKKyNkZWZpbmUgQ0hFQ0soIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0hFQ0siLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0hFQ0tfRkFMU0UoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0hFQ0tfRkFMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIGV4cHIgKQorI2RlZmluZSBDSEVDS0VEX0lGKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfSUYoICJDSEVDS0VEX0lGIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENIRUNLRURfRUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX0VMU0UoICJDSEVDS0VEX0VMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0hFQ0tfTk9GQUlMKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNIRUNLX05PRkFJTCIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OlN1cHByZXNzRmFpbCwgZXhwciApCisKKyNkZWZpbmUgQ0hFQ0tfVEhST1dTKCBleHByICkgIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIkNIRUNLX1RIUk9XUyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsICIiLCBleHByICkKKyNkZWZpbmUgQ0hFQ0tfVEhST1dTX0FTKCBleHByLCBleGNlcHRpb25UeXBlICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTX0FTKCAiQ0hFQ0tfVEhST1dTX0FTIiwgZXhjZXB0aW9uVHlwZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENIRUNLX1RIUk9XU19XSVRIKCBleHByLCBtYXRjaGVyICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiQ0hFQ0tfVEhST1dTX1dJVEgiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtYXRjaGVyLCBleHByICkKKyNkZWZpbmUgQ0hFQ0tfTk9USFJPVyggZXhwciApIElOVEVSTkFMX0NBVENIX05PX1RIUk9XKCAiQ0hFQ0tfTk9USFJPVyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorCisjZGVmaW5lIENIRUNLX1RIQVQoIGFyZywgbWF0Y2hlciApIElOVEVSTkFMX0NIRUNLX1RIQVQoICJDSEVDS19USEFUIiwgbWF0Y2hlciwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgYXJnICkKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkKKyNkZWZpbmUgUkVRVUlSRV9USEFUKCBhcmcsIG1hdGNoZXIgKSBJTlRFUk5BTF9DSEVDS19USEFUX05PX1RSWSggIlJFUVVJUkVfVEhBVCIsIG1hdGNoZXIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBhcmcgKQorI2Vsc2UKKyNkZWZpbmUgUkVRVUlSRV9USEFUKCBhcmcsIG1hdGNoZXIgKSBJTlRFUk5BTF9DSEVDS19USEFUKCAiUkVRVUlSRV9USEFUIiwgbWF0Y2hlciwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGFyZyApCisjZW5kaWYKKworI2RlZmluZSBJTkZPKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiSU5GTyIsIG1zZyApCisjZGVmaW5lIFdBUk4oIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIldBUk4iLCBDYXRjaDo6UmVzdWx0V2FzOjpXYXJuaW5nLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtc2cgKQorI2RlZmluZSBTQ09QRURfSU5GTyggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIklORk8iLCBtc2cgKQorI2RlZmluZSBDQVBUVVJFKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiQ0FQVFVSRSIsICNtc2cgIiA6PSAiIDw8IENhdGNoOjp0b1N0cmluZyhtc2cpICkKKyNkZWZpbmUgU0NPUEVEX0NBUFRVUkUoIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJDQVBUVVJFIiwgI21zZyAiIDo9ICIgPDwgQ2F0Y2g6OnRvU3RyaW5nKG1zZykgKQorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUworI2RlZmluZSBURVNUX0NBU0UoIC4uLiApIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIFRFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIE1FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIFJFR0lTVEVSX1RFU1RfQ0FTRSggRnVuY3Rpb24sIC4uLiApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1RFU1RDQVNFKCBGdW5jdGlvbiwgX19WQV9BUkdTX18gKQorI2RlZmluZSBTRUNUSU9OKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9TRUNUSU9OKCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEZBSUwoIC4uLiApIElOVEVSTkFMX0NBVENIX01TRyggIkZBSUwiLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEZBSUxfQ0hFQ0soIC4uLiApIElOVEVSTkFMX0NBVENIX01TRyggIkZBSUxfQ0hFQ0siLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgU1VDQ0VFRCggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiU1VDQ0VFRCIsIENhdGNoOjpSZXN1bHRXYXM6Ok9rLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBfX1ZBX0FSR1NfXyApCisjZWxzZQorI2RlZmluZSBURVNUX0NBU0UoIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIFRFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIE1FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIFJFR0lTVEVSX1RFU1RfQ0FTRSggbWV0aG9kLCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1RFU1RDQVNFKCBtZXRob2QsIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIFNFQ1RJT04oIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfU0VDVElPTiggbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgRkFJTCggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiRkFJTCIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIG1zZyApCisgICAgI2RlZmluZSBGQUlMX0NIRUNLKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJGQUlMX0NIRUNLIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtc2cgKQorICAgICNkZWZpbmUgU1VDQ0VFRCggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiU1VDQ0VFRCIsIENhdGNoOjpSZXN1bHRXYXM6Ok9rLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtc2cgKQorI2VuZGlmCisjZGVmaW5lIEFOT05fVEVTVF9DQVNFKCkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoICIiLCAiIiApCisKKyNkZWZpbmUgUkVHSVNURVJfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKQorI2RlZmluZSBSRUdJU1RFUl9MRUdBQ1lfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX0xFR0FDWV9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkKKworI2RlZmluZSBHRU5FUkFURSggZXhwcikgSU5URVJOQUxfQ0FUQ0hfR0VORVJBVEUoIGV4cHIgKQorCisjZW5kaWYKKworI2RlZmluZSBDQVRDSF9UUkFOU0xBVEVfRVhDRVBUSU9OKCBzaWduYXR1cmUgKSBJTlRFUk5BTF9DQVRDSF9UUkFOU0xBVEVfRVhDRVBUSU9OKCBzaWduYXR1cmUgKQorCisvLyAiQkRELXN0eWxlIiBjb252ZW5pZW5jZSB3cmFwcGVycworI2lmZGVmIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyNkZWZpbmUgU0NFTkFSSU8oIC4uLiApIFRFU1RfQ0FTRSggIlNjZW5hcmlvOiAiIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgU0NFTkFSSU9fTUVUSE9EKCBjbGFzc05hbWUsIC4uLiApIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgIlNjZW5hcmlvOiAiIF9fVkFfQVJHU19fICkKKyNlbHNlCisjZGVmaW5lIFNDRU5BUklPKCBuYW1lLCB0YWdzICkgVEVTVF9DQVNFKCAiU2NlbmFyaW86ICIgbmFtZSwgdGFncyApCisjZGVmaW5lIFNDRU5BUklPX01FVEhPRCggY2xhc3NOYW1lLCBuYW1lLCB0YWdzICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAiU2NlbmFyaW86ICIgbmFtZSwgdGFncyApCisjZW5kaWYKKyNkZWZpbmUgR0lWRU4oIGRlc2MgKSAgICBTRUNUSU9OKCBzdGQ6OnN0cmluZygiICAgR2l2ZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBXSEVOKCBkZXNjICkgICAgIFNFQ1RJT04oIHN0ZDo6c3RyaW5nKCIgICAgV2hlbjogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIEFORF9XSEVOKCBkZXNjICkgU0VDVElPTiggc3RkOjpzdHJpbmcoIkFuZCB3aGVuOiAiKSArIGRlc2MsICIiICkKKyNkZWZpbmUgVEhFTiggZGVzYyApICAgICBTRUNUSU9OKCBzdGQ6OnN0cmluZygiICAgIFRoZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBBTkRfVEhFTiggZGVzYyApIFNFQ1RJT04oIHN0ZDo6c3RyaW5nKCIgICAgIEFuZDogIikgKyBkZXNjLCAiIiApCisKK3VzaW5nIENhdGNoOjpEZXRhaWw6OkFwcHJveDsKKworI2VuZGlmIC8vIFRXT0JMVUVDVUJFU19TSU5HTEVfSU5DTFVERV9DQVRDSF9IUFBfSU5DTFVERUQKKwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzLmNjIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiOGM4MzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHMuY2MKQEAgLTAsMCArMSwzMzkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICIuLi9jYXRjaC9jYXRjaC5ocHAiCisjaW5jbHVkZSA8dGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oPgorI2luY2x1ZGUgPHRocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSAidF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuaCIKKworVEVTVF9DQVNFKCAidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgZW51bSIsICJbZnVuY3Rpb25hbF0iICkKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfZW51bSo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfZW51bV9kYXRhKHByb2dyYW0pOworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBwYWlyLmZpcnN0OworICAgIHRfZW51bSogdGVzdF9lbnVtID0gcGFpci5zZWNvbmQ7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gdGVzdF9lbnVtLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2VudW0ob3V0LCB0ZXN0X2VudW0pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSB0ZXN0X2VudW07CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsJCit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgdm9pZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3Rfdm9pZF9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfVEhST1dTKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBzdHJpbmcgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3Rfc3RyaW5nX2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIGJvb2wgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfYm9vbF9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBzYnl0ZSAoaTgpIHdpdGggZXNjYXBpbmcga2V5d29yZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2k4X2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIHNob3J0IChpMTYpIHdpdGggZXNjYXBpbmcga2V5d29yZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2kxNl9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBpbnRlZ2VyIChpMzIpIHdpdGggZXNjYXBpbmcga2V5d29yZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2kzMl9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBsb25nIChpNjQpIHdpdGggZXNjYXBpbmcga2V5d29yZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2k2NF9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBkb3VibGUgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfZG91YmxlX2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuY2MgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHNfaGVscGVycy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmMxNzBiCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuY2MKQEAgLTAsMCArMSwyMzcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlIDx0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmg+CisjaW5jbHVkZSAidGhyaWZ0L2NvbW1vbi5oIgorI2luY2x1ZGUgPHRocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSAidF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuaCIKKworY29uc3Qgc3RyaW5nIFRlc3REYXRhR2VuZXJhdG9yOjpERUZBVUxUX0ZJTEVfSEVBREVSID0gIi8qKiIgIlxuIgorICAgICAgICAgICAgIiAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgpIiAiXG4iCisgICAgICAgICAgICAiICoiICJcbiIKKyAgICAgICAgICAgICIgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HIiAiXG4iCisgICAgICAgICAgICAiICogIEBnZW5lcmF0ZWQiICJcbiIKKyAgICAgICAgICAgICIgKi8iOworCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2VudW0qPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfZW51bV9kYXRhKHRfcHJvZ3JhbSogcHJvZ3JhbSkKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArCisgICAgICAgICJcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiLy8vIFRlc3REb2NcbiIKKyAgICAgICAgIi8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICJwdWJsaWMgZW51bSBUZXN0TmFtZVxuIgorICAgICAgICAie1xuIgorICAgICAgICAiICBOb25lID0gMCxcbiIKKyAgICAgICAgIiAgRmlyc3QgPSAxLFxuIgorICAgICAgICAiICBTZWNvbmQgPSAyLFxuIgorICAgICAgICAifVxuIjsKKworICAgIHRfZW51bSogZW51bV8gPSBuZXcgdF9lbnVtKHByb2dyYW0pOworICAgIGVudW1fLT5zZXRfbmFtZSgiVGVzdE5hbWUiKTsKKyAgICBlbnVtXy0+c2V0X2RvYygiVGVzdERvYyIpOworICAgIGVudW1fLT5hcHBlbmQobmV3IHRfZW51bV92YWx1ZSgiTm9uZSIsIDApKTsKKyAgICBlbnVtXy0+YXBwZW5kKG5ldyB0X2VudW1fdmFsdWUoIkZpcnN0IiwgMSkpOworICAgIGVudW1fLT5hcHBlbmQobmV3IHRfZW51bV92YWx1ZSgiU2Vjb25kIiwgMikpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfZW51bSo+KGV4cGVjdGVkX3Jlc3VsdCwgZW51bV8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X3ZvaWRfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJ2b2lkIiwgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRCk7CisgICAgdHlwZV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbHVlXyA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgY29uc3RfdmFsdWVfLT5zZXRfc3RyaW5nKCJWb2lkVmFsdWUiKTsKKworICAgIHRfY29uc3QqIGNvbnN0XyA9IG5ldyB0X2NvbnN0KHR5cGVfLCAidm9pZCIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9zdHJpbmdfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArIAorICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIG5ldGNvcmVDb25zdGFudHNcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiICAvLy8gVGVzdERvY1xuIgorICAgICAgICAiICAvLy8gPC9zdW1tYXJ5PlxuIgorICAgICAgICAiICBwdWJsaWMgY29uc3Qgc3RyaW5nIEBzdHJpbmcgPSBcIlN0cmluZ1ZhbHVlXCI7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgic3RyaW5nIiwgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9zdHJpbmcoIlN0cmluZ1ZhbHVlIik7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgInN0cmluZyIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9ib29sX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSICsgIlxuIiArZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgKworICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIG5ldGNvcmVDb25zdGFudHNcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiICAvLy8gVGVzdERvY1xuIgorICAgICAgICAiICAvLy8gPC9zdW1tYXJ5PlxuIgorICAgICAgICAiICBwdWJsaWMgY29uc3QgYm9vbCBAYm9vbCA9IHRydWU7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgiYm9vbCIsIHRfYmFzZV90eXBlOjpUWVBFX0JPT0wpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X2ludGVnZXIoMSk7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgImJvb2wiLCBjb25zdF92YWx1ZV8pOworICAgIGNvbnN0Xy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPihleHBlY3RlZF9yZXN1bHQsIGNvbnN0Xyk7Cit9CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaThfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgbmV0Y29yZUNvbnN0YW50c1xuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIgIC8vLyBUZXN0RG9jXG4iCisgICAgICAgICIgIC8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICIgIHB1YmxpYyBjb25zdCBzYnl0ZSBAc2J5dGUgPSAxMjc7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgiSTgiLCB0X2Jhc2VfdHlwZTo6VFlQRV9JOCk7CisgICAgdHlwZV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbHVlXyA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgY29uc3RfdmFsdWVfLT5zZXRfaW50ZWdlcigxMjcpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJzYnl0ZSIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9pMTZfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgbmV0Y29yZUNvbnN0YW50c1xuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIgIC8vLyBUZXN0RG9jXG4iCisgICAgICAgICIgIC8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICIgIHB1YmxpYyBjb25zdCBzaG9ydCBAc2hvcnQgPSAzMjc2NztcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJpMTYiLCB0X2Jhc2VfdHlwZTo6VFlQRV9JMTYpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X2ludGVnZXIoMzI3NjcpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJzaG9ydCIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9pMzJfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgbmV0Y29yZUNvbnN0YW50c1xuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIgIC8vLyBUZXN0RG9jXG4iCisgICAgICAgICIgIC8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICIgIHB1YmxpYyBjb25zdCBpbnQgQGludCA9IDIxNDc0ODM2NDc7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgiaTMyIiwgdF9iYXNlX3R5cGU6OlRZUEVfSTMyKTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9pbnRlZ2VyKDIxNDc0ODM2NDcpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJpbnQiLCBjb25zdF92YWx1ZV8pOworICAgIGNvbnN0Xy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPihleHBlY3RlZF9yZXN1bHQsIGNvbnN0Xyk7Cit9CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaTY0X2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSICsgIlxuIiArZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgKworICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIG5ldGNvcmVDb25zdGFudHNcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiICAvLy8gVGVzdERvY1xuIgorICAgICAgICAiICAvLy8gPC9zdW1tYXJ5PlxuIgorICAgICAgICAiICBwdWJsaWMgY29uc3QgbG9uZyBAbG9uZyA9IDkyMjMzNzIwMzY4NTQ3NzU4MDc7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgiaTY0IiwgdF9iYXNlX3R5cGU6OlRZUEVfSTY0KTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9pbnRlZ2VyKDkyMjMzNzIwMzY4NTQ3NzU4MDcpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJsb25nIiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2RvdWJsZV9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbikKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArICJcbiIgK2dlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpICsKKyAgICAgICAgIlxuIgorICAgICAgICAicHVibGljIHN0YXRpYyBjbGFzcyBuZXRjb3JlQ29uc3RhbnRzXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgIC8vLyA8c3VtbWFyeT5cbiIKKyAgICAgICAgIiAgLy8vIFRlc3REb2NcbiIKKyAgICAgICAgIiAgLy8vIDwvc3VtbWFyeT5cbiIKKyAgICAgICAgIiAgcHVibGljIGNvbnN0IGRvdWJsZSBAZG91YmxlID0gOS4yMjMzN2UrMTg7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgiZG91YmxlIiwgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFKTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9kb3VibGUoOTIyMzM3MjAzNjg1NDc3NTgwNy4xKTsKKworICAgIHRfY29uc3QqIGNvbnN0XyA9IG5ldyB0X2NvbnN0KHR5cGVfLCAiZG91YmxlIiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuaCBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0c19oZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlYWFjMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0c19oZWxwZXJzLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgPHRocmlmdC9wYXJzZS90X3Byb2dyYW0uaD4KKworY2xhc3MgVGVzdERhdGFHZW5lcmF0b3IKK3sKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3Qgc3RyaW5nIERFRkFVTFRfRklMRV9IRUFERVI7CisKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9lbnVtKj4gZ2V0X3Rlc3RfZW51bV9kYXRhKHRfcHJvZ3JhbSogcHJvZ3JhbSk7CisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBnZXRfdGVzdF92b2lkX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X3N0cmluZ19jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbik7CisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBnZXRfdGVzdF9ib29sX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X2k4X2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X2kxNl9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbik7CisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBnZXRfdGVzdF9pMzJfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pOworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gZ2V0X3Rlc3RfaTY0X2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X2RvdWJsZV9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbik7Cit9OwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9oZWxwZXJzX3Rlc3RzLmNjIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9oZWxwZXJzX3Rlc3RzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiY2JlZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2hlbHBlcnNfdGVzdHMuY2MKQEAgLTAsMCArMSwyMDkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICIuLi9jYXRjaC9jYXRjaC5ocHAiCisjaW5jbHVkZSA8dGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oPgorI2luY2x1ZGUgPHRocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmg+CisKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3I6Om5ldGNvcmVfdHlwZV91c2luZ3MoKSB3aXRob3V0IG9wdGlvbiB3Y2Ygc2hvdWxkIHJldHVybiB2YWxpZCBuYW1lc3BhY2VzIiwgIltoZWxwZXJzXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgInVuaW9uIiwgInVuaW9uIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHN0cmluZyBleHBlY3RlZF9uYW1lc3BhY2VzID0gInVzaW5nIFN5c3RlbTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlRleHQ7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uSU87XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrcztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFRocmlmdDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFRocmlmdC5Db2xsZWN0aW9ucztcbiIgKyBlbmRsOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisKKyAgICBSRVFVSVJFX0ZBTFNFKGdlbi0+aXNfd2NmX2VuYWJsZWQoKSk7CisgICAgUkVRVUlSRShnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSA9PSBleHBlY3RlZF9uYW1lc3BhY2VzKTsKKworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvcjo6bmV0Y29yZV90eXBlX3VzaW5ncygpIHdpdGggb3B0aW9uIHdjZiBzaG91bGQgcmV0dXJuIHZhbGlkIG5hbWVzcGFjZXMiLCAiW2hlbHBlcnNdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICBzdHJpbmcgZXhwZWN0ZWRfbmFtZXNwYWNlc193Y2YgPSAidXNpbmcgU3lzdGVtO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uVGV4dDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uSU87XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlRocmVhZGluZztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFRocmlmdDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlNlcnZpY2VNb2RlbDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uO1xuIiArIGVuZGw7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKworICAgIFJFUVVJUkUoZ2VuLT5pc193Y2ZfZW5hYmxlZCgpKTsKKyAgICBSRVFVSVJFKGdlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpID09IGV4cGVjdGVkX25hbWVzcGFjZXNfd2NmKTsKKworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgY29udGFpbnMgbGF0ZXN0IEMjIGtleXdvcmRzIHRvIG5vcm1hbGl6ZSB3aXRoIEAiLCAiW2hlbHBlcnNdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisgICAgdmVjdG9yPHN0cmluZz4gY3VycmVudF9rZXl3b3JkcyA9IHsKKyAgICAgICAgeyAiYWJzdHJhY3QiIH0sCisgICAgICAgIHsgImFzIiB9LAorICAgICAgICB7ICJiYXNlIiB9LAorICAgICAgICB7ICJib29sIiB9LAorICAgICAgICB7ICJicmVhayIgfSwKKyAgICAgICAgeyAiYnl0ZSIgfSwKKyAgICAgICAgeyAiY2FzZSIgfSwKKyAgICAgICAgeyAiY2F0Y2giIH0sCisgICAgICAgIHsgImNoYXIiIH0sCisgICAgICAgIHsgImNoZWNrZWQiIH0sCisgICAgICAgIHsgImNsYXNzIiB9LAorICAgICAgICB7ICJjb25zdCIgfSwKKyAgICAgICAgeyAiY29udGludWUiIH0sCisgICAgICAgIHsgImRlY2ltYWwiIH0sCisgICAgICAgIHsgImRlZmF1bHQiIH0sCisgICAgICAgIHsgImRlbGVnYXRlIiB9LAorICAgICAgICB7ICJkbyIgfSwKKyAgICAgICAgeyAiZG91YmxlIiB9LAorICAgICAgICB7ICJlbHNlIiB9LAorICAgICAgICB7ICJlbnVtIiB9LAorICAgICAgICB7ICJldmVudCIgfSwKKyAgICAgICAgeyAiZXhwbGljaXQiIH0sCisgICAgICAgIHsgImV4dGVybiIgfSwKKyAgICAgICAgeyAiZmFsc2UiIH0sCisgICAgICAgIHsgImZpbmFsbHkiIH0sCisgICAgICAgIHsgImZpeGVkIiB9LAorICAgICAgICB7ICJmbG9hdCIgfSwKKyAgICAgICAgeyAiZm9yIiB9LAorICAgICAgICB7ICJmb3JlYWNoIiB9LAorICAgICAgICB7ICJnb3RvIiB9LAorICAgICAgICB7ICJpZiIgfSwKKyAgICAgICAgeyAiaW1wbGljaXQiIH0sCisgICAgICAgIHsgImluIiB9LAorICAgICAgICB7ICJpbnQiIH0sCisgICAgICAgIHsgImludGVyZmFjZSIgfSwKKyAgICAgICAgeyAiaW50ZXJuYWwiIH0sCisgICAgICAgIHsgImlzIiB9LAorICAgICAgICB7ICJsb2NrIiB9LAorICAgICAgICB7ICJsb25nIiB9LAorICAgICAgICB7ICJuYW1lc3BhY2UiIH0sCisgICAgICAgIHsgIm5ldyIgfSwKKyAgICAgICAgeyAibnVsbCIgfSwKKyAgICAgICAgeyAib2JqZWN0IiB9LAorICAgICAgICB7ICJvcGVyYXRvciIgfSwKKyAgICAgICAgeyAib3V0IiB9LAorICAgICAgICB7ICJvdmVycmlkZSIgfSwKKyAgICAgICAgeyAicGFyYW1zIiB9LAorICAgICAgICB7ICJwcml2YXRlIiB9LAorICAgICAgICB7ICJwcm90ZWN0ZWQiIH0sCisgICAgICAgIHsgInB1YmxpYyIgfSwKKyAgICAgICAgeyAicmVhZG9ubHkiIH0sCisgICAgICAgIHsgInJlZiIgfSwKKyAgICAgICAgeyAicmV0dXJuIiB9LAorICAgICAgICB7ICJzYnl0ZSIgfSwKKyAgICAgICAgeyAic2VhbGVkIiB9LAorICAgICAgICB7ICJzaG9ydCIgfSwKKyAgICAgICAgeyAic2l6ZW9mIiB9LAorICAgICAgICB7ICJzdGFja2FsbG9jIiB9LAorICAgICAgICB7ICJzdGF0aWMiIH0sCisgICAgICAgIHsgInN0cmluZyIgfSwKKyAgICAgICAgeyAic3RydWN0IiB9LAorICAgICAgICB7ICJzd2l0Y2giIH0sCisgICAgICAgIHsgInRoaXMiIH0sCisgICAgICAgIHsgInRocm93IiB9LAorICAgICAgICB7ICJ0cnVlIiB9LAorICAgICAgICB7ICJ0cnkiIH0sCisgICAgICAgIHsgInR5cGVvZiIgfSwKKyAgICAgICAgeyAidWludCIgfSwKKyAgICAgICAgeyAidWxvbmciIH0sCisgICAgICAgIHsgInVuY2hlY2tlZCIgfSwKKyAgICAgICAgeyAidW5zYWZlIiB9LAorICAgICAgICB7ICJ1c2hvcnQiIH0sCisgICAgICAgIHsgInVzaW5nIiB9LAorICAgICAgICB7ICJ2b2lkIiB9LAorICAgICAgICB7ICJ2b2xhdGlsZSIgfSwKKyAgICAgICAgeyAid2hpbGUiIH0sCisgICAgICAgIC8vIENvbnRleHR1YWwgS2V5d29yZHMKKyAgICAgICAgeyAiYWRkIiB9LAorICAgICAgICB7ICJhbGlhcyIgfSwKKyAgICAgICAgeyAiYXNjZW5kaW5nIiB9LAorICAgICAgICB7ICJhc3luYyIgfSwKKyAgICAgICAgeyAiYXdhaXQiIH0sCisgICAgICAgIHsgImRlc2NlbmRpbmciIH0sCisgICAgICAgIHsgImR5bmFtaWMiIH0sCisgICAgICAgIHsgImZyb20iIH0sCisgICAgICAgIHsgImdldCIgfSwKKyAgICAgICAgeyAiZ2xvYmFsIiB9LAorICAgICAgICB7ICJncm91cCIgfSwKKyAgICAgICAgeyAiaW50byIgfSwKKyAgICAgICAgeyAiam9pbiIgfSwKKyAgICAgICAgeyAibGV0IiB9LAorICAgICAgICB7ICJvcmRlcmJ5IiB9LAorICAgICAgICB7ICJwYXJ0aWFsIiB9LAorICAgICAgICB7ICJyZW1vdmUiIH0sCisgICAgICAgIHsgInNlbGVjdCIgfSwKKyAgICAgICAgeyAic2V0IiB9LAorICAgICAgICB7ICJ2YWx1ZSIgfSwKKyAgICAgICAgeyAidmFyIiB9LAorICAgICAgICB7ICJ3aGVuIiB9LAorICAgICAgICB7ICJ3aGVyZSIgfSwKKyAgICAgICAgeyAieWllbGQiIH0KKyAgICB9OworCisgICAgc3RyaW5nIG1pc3NlZF9rZXl3b3JkcyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworICAgIG1hcDxzdHJpbmcsIGludD4gZ2VuZXJhdG9yc19rZXl3b3JkcyA9IGdlbi0+Z2V0X2tleXdvcmRzX2xpc3QoKTsKKworICAgIGZvciAodmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gY3VycmVudF9rZXl3b3Jkcy5iZWdpbigpOyBpdCAhPSBjdXJyZW50X2tleXdvcmRzLmVuZCgpOyArK2l0KQorICAgIHsKKyAgICAgICAgaWYgKGdlbmVyYXRvcnNfa2V5d29yZHMuZmluZCgqaXQpID09IGdlbmVyYXRvcnNfa2V5d29yZHMuZW5kKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1pc3NlZF9rZXl3b3JkcyA9IG1pc3NlZF9rZXl3b3JkcyArICppdCArICIsIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIFJFUVVJUkUobWlzc2VkX2tleXdvcmRzID09ICIiKTsKKworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2luaXRpYWxpemF0aW9uX3Rlc3RzLmNjIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9pbml0aWFsaXphdGlvbl90ZXN0cy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzE3NzMzCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9pbml0aWFsaXphdGlvbl90ZXN0cy5jYwpAQCAtMCwwICsxLDc0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiLi4vY2F0Y2gvY2F0Y2guaHBwIgorI2luY2x1ZGUgPHRocmlmdC9wYXJzZS90X3Byb2dyYW0uaD4KKyNpbmNsdWRlIDx0aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oPgorCitURVNUX0NBU0UoICJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCB0aHJvdyBlcnJvciB3aXRoIHVua25vd24gb3B0aW9ucyIsICJbaW5pdGlhbGl6YXRpb25dIiApCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgImtleXMiLCAia2V5cyIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG51bGxwdHI7CisKKyAgICBSRVFVSVJFX1RIUk9XUyhnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZykpOwkKKworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07CQorfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGNyZWF0ZSB2YWxpZCBpbnN0YW5jZSB3aXRoIHZhbGlkIG9wdGlvbnMiLCAiW2luaXRpYWxpemF0aW9uXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0sIHsgIm51bGxhYmxlIiwgIm51bGxhYmxlIn0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBudWxscHRyOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKSk7CisgICAgUkVRVUlSRShnZW4gIT0gbnVsbHB0cik7CisgICAgUkVRVUlSRShnZW4tPmlzX3djZl9lbmFibGVkKCkpOworICAgIFJFUVVJUkUoZ2VuLT5pc19udWxsYWJsZV9lbmFibGVkKCkpOworICAgIFJFUVVJUkVfRkFMU0UoZ2VuLT5pc19oYXNoY29kZV9lbmFibGVkKCkpOworICAgIFJFUVVJUkVfRkFMU0UoZ2VuLT5pc19zZXJpYWxpemVfZW5hYmxlZCgpKTsKKyAgICBSRVFVSVJFX0ZBTFNFKGdlbi0+aXNfdW5pb25fZW5hYmxlZCgpKTsKKworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgcGFzcyBpbml0IHN1Y2Nlc2Z1bGx5IiwgIltpbml0aWFsaXphdGlvbl0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9LHsgIm51bGxhYmxlIiwgIm51bGxhYmxlIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+aW5pdF9nZW5lcmF0b3IoKSk7CisKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL3Rlc3RzX21haW4uY2MgYi9jb21waWxlci9jcHAvdGVzdHMvdGVzdHNfbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWQwOWI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL3Rlc3RzX21haW4uY2MKQEAgLTAsMCArMSwxOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI2RlZmluZSBDQVRDSF9DT05GSUdfTUFJTgorI2luY2x1ZGUgImNhdGNoL2NhdGNoLmhwcCIKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC92ZXJzaW9uLmguaW4gYi9jb21waWxlci9jcHAvdmVyc2lvbi5oLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzcwZWM5Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC92ZXJzaW9uLmguaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jZGVmaW5lIFRIUklGVF9WRVJTSU9OICJAUEFDS0FHRV9WRVJTSU9OQCIKZGlmZiAtLWdpdCBhL2NvbXBvc2VyLmpzb24gYi9jb21wb3Nlci5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkM2E2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wb3Nlci5qc29uCkBAIC0wLDAgKzEsMzkgQEAKK3sKKyAgICAibmFtZSI6ICJhcGFjaGUvdGhyaWZ0IiwKKyAgICAiZGVzY3JpcHRpb24iOiAiQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtIiwKKyAgICAiaG9tZXBhZ2UiOiAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIiwKKyAgICAidHlwZSI6ICJsaWJyYXJ5IiwKKyAgICAia2V5d29yZHMiOiBbIlJQQyJdLAorICAgICJsaWNlbnNlIjogIkFwYWNoZS0yLjAiLAorICAgICJyZWFkbWUiOiAiUkVBRE1FLm1kIiwKKyAgICAiYXV0aG9ycyI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgIm5hbWUiOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIiwKKyAgICAgICAgICAgICJlbWFpbCI6ICJkZXZAdGhyaWZ0LmFwYWNoZS5vcmciLAorICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKKyAgICAgICAgfQorICAgIF0sCisgICAgInN1cHBvcnQiOiB7CisgICAgICAgICJlbWFpbCI6ICJkZXZAdGhyaWZ0LmFwYWNoZS5vcmciLAorICAgICAgICAiaXNzdWVzIjogImh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUIgorICAgIH0sCisgICAgInJlcXVpcmUiOiB7CisgICAgICAgICJwaHAiOiAiXjUuNSB8fCBeNy4wIgorICAgIH0sCisgICAgInJlcXVpcmUtZGV2IjogeworICAgICAgICAicGhwdW5pdC9waHB1bml0IjogIn40LjguMzYiLAorICAgICAgICAic3F1aXpsYWJzL3BocF9jb2Rlc25pZmZlciI6ICIzLioiCisgICAgfSwKKyAgICAiYXV0b2xvYWQiOiB7CisgICAgICAgICJwc3ItNCI6IHsiVGhyaWZ0XFwiOiAibGliL3BocC9saWIvIn0KKyAgICB9LAorICAgICJhdXRvbG9hZC1kZXYiOiB7CisgICAgICAgICJwc3ItNCI6IHsiVGVzdFxcVGhyaWZ0XFwiOiAibGliL3BocC90ZXN0LyJ9CisgICAgfSwKKyAgICAibWluaW11bS1zdGFiaWxpdHkiOiAic3RhYmxlIiwKKyAgICAiZXh0cmEiOiB7CisgICAgICAgICJicmFuY2gtYWxpYXMiOiB7CisgICAgICAgICAgICAiZGV2LW1hc3RlciI6ICIxLjAueC1kZXYiCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBlZmFiZWZmLi4yMTc0NjI5Ci0tLSBhL2NvbmZpZ3VyZS5hYworKysgYi9jb25maWd1cmUuYWMKQEAgLTE4LDEyICsxOCwxMyBAQAogIwogCiBBQ19QUkVSRVEoMi42NSkKK0FDX0NPTkZJR19NQUNST19ESVIoWy4vYWNsb2NhbF0pCiAKLUFDX0lOSVQoW3RocmlmdF0sIFswLjcuMF0pCitBQ19JTklUKFt0aHJpZnRdLCBbMS4wLjBdKQogCiBBQ19DT05GSUdfQVVYX0RJUihbLl0pCiAKLUFNX0lOSVRfQVVUT01BS0UoWzEuOSB0YXItdXN0YXJdKQorQU1fSU5JVF9BVVRPTUFLRShbMS4xMyBzdWJkaXItb2JqZWN0cyB0YXItdXN0YXJdKQogUEtHX1BST0dfUEtHX0NPTkZJRwogCiBBQ19BUkdfVkFSKFtQWV9QUkVGSVhdLCBbUHJlZml4IGZvciBpbnN0YWxsaW5nIFB5dGhvbiBtb2R1bGVzLgpAQCAtMzMsMTAgKzM0LDEwIEBACiBBU19JRihbdGVzdCAieCRQWV9QUkVGSVgiID0geF0sIFtQWV9QUkVGSVg9Ii91c3IiXSkKIAogQUNfQVJHX1ZBUihbSkFWQV9QUkVGSVhdLCBbUHJlZml4IGZvciBpbnN0YWxsaW5nIHRoZSBKYXZhIGxpYiBqYXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoTm9ybWFsIC0tcHJlZml4IGlzIGlnbm9yZWQgZm9yIEphdmEgYmVjYXVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YSBoYXMgZGlmZmVyZW50IGNvbnZlbnRpb25zLikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgPSAiL3Vzci9sb2NhbC9saWIiXSkKLUFTX0lGKFt0ZXN0ICJ4JEpBVkFfUFJFRklYIiA9IHhdLCBbSkFWQV9QUkVGSVg9Ii91c3IvbG9jYWwvbGliIl0pCitBU19JRihbdGVzdCAieCRKQVZBX1BSRUZJWCIgIT0geF0sIFtKQVZBX1BSRUZJWD0iJEpBVkFfUFJFRklYL3Vzci9sb2NhbC9saWIiXSwKKyAgICAgIFt0ZXN0ICJ4JFBSRUZJWCIgIT0geF0sIFtKQVZBX1BSRUZJWD0iJFBSRUZJWC91c3IvbG9jYWwvbGliIl0sCisgICAgICBbSkFWQV9QUkVGSVg9Ii91c3IvbG9jYWwvbGliIl0pCiAKIEFDX0FSR19WQVIoW1JVQllfUFJFRklYXSwgW1ByZWZpeCBmb3IgaW5zdGFsbGluZyBSdWJ5IG1vZHVsZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTm9ybWFsIC0tcHJlZml4IGlzIGlnbm9yZWQgZm9yIFJ1YnkgYmVjYXVzZQpAQCAtNzUsMTkgKzc2LDE1IEBACiAKIEFDX1NVQlNUKENBQkFMX0NPTkZJR1VSRV9GTEFHUykKIAotQUNfQVJHX1ZBUihbR09ST09UXSwgW1ByZWZpeCBmb3IgdGhlIEdvIHNvdXJjZSBkaXJlY3RvcnkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoTm9ybWFsIC0tcHJlZml4IGlzIGlnbm9yZWQgZm9yIEdvIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdvIGhhcyBkaWZmZXJlbnQgY29udmVudGlvbnMuKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCA9ICIvdXNyL2xvY2FsL3NoYXJlL2dvIl0pCi1BU19JRihbdGVzdCAieCRHT1JPT1QiID0geF0sIFtHT1JPT1Q9Ii91c3IvbG9jYWwvc2hhcmUvZ28iXSkKK0FDX0FSR19WQVIoW0RfSU1QT1JUX1BSRUZJWF0sIFtQcmVmaXggZm9yIGluc3RhbGxpbmcgRCBtb2R1bGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgW0lOQ0xVREVESVIvZDJdXSkKK0FTX0lGKFt0ZXN0ICJ4JERfSU1QT1JUX1BSRUZJWCIgPSB4XSwgW0RfSU1QT1JUX1BSRUZJWD0iJHtpbmNsdWRlZGlyfS9kMiJdKQogCi1BQ19BUkdfVkFSKFtHT0FSQ0hdLCBbQXJjaGl0ZWN0dXJlIGRlZmF1bHQgZm9yIEdvLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCA9ICJhbWQ2NCJdKQotQVNfSUYoW3Rlc3QgIngkR09BUkNIIiA9IHhdLCBbR09BUkNIPSJhbWQ2NCJdKQorQUNfQVJHX1ZBUihbRE1EX0xJQkVWRU5UX0ZMQUdTXSwgW0RNRCBmbGFncyBmb3IgbGlua2luZyBsaWJldmVudCAoYXV0by1kZXRlY3RlZCBpZiBub3Qgc2V0KS5dKQorQUNfQVJHX1ZBUihbRE1EX09QRU5TU0xfRkxBR1NdLCBbRE1EIGZsYWdzIGZvciBsaW5raW5nIE9wZW5TU0wgKGF1dG8tZGV0ZWN0ZWQgaWYgbm90IHNldCkuXSkKIAotQUNfQVJHX1ZBUihbR09CSU5dLCBbQmluYXJ5IGRpcmVjdG9yeSBmb3IgR28uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ID0gIi91c3IvbG9jYWwvYmluIl0pCi1BU19JRihbdGVzdCAieCRHT0JJTiIgPSB4XSwgW0dPQklOPSIvdXNyL2xvY2FsL2JpbiJdKQorQUNfQVJHX1ZBUihbVEhSSUZUXSwgW1BhdGggdG8gdGhlIHRocmlmdCB0b29sIChuZWVkZWQgZm9yIGNyb3NzLWNvbXBpbGF0aW9uKS5dKQorQVNfSUYoW3Rlc3QgIngkVEhSSUZUIiA9IHhdLCBbVEhSSUZUPWBwd2RgL2NvbXBpbGVyL2NwcC90aHJpZnRdKQogCiBBQ19QUk9HX0NDCiBBQ19QUk9HX0NQUApAQCAtOTUsNiArOTIsNyBAQAogQUNfUFJPR19JTlNUQUxMCiBBQ19QUk9HX0xJQlRPT0wKIEFDX1BST0dfTUFLRV9TRVQKK0FDX1BST0dfQklTT04oMi41KQogQUNfUFJPR19ZQUNDCiBBQ19QUk9HX0xFWAogQU1fUFJPR19MRVgKQEAgLTEwNCwyNiArMTAyLDEwMCBAQAogQUNfUFJPR19SQU5MSUIKIAogQUNfTEFORyhbQysrXSkKK0FYX0NYWF9DT01QSUxFX1NURENYWF8xMShbbm9leHRdLCBbbWFuZGF0b3J5XSkKKworQU1fRVhUUkFfUkVDVVJTSVZFX1RBUkdFVFMoW3N0eWxlXSkKK0FDX1NVQlNUKENQUFNUWUxFX0NNRCwgJ2ZpbmQgLiAtdHlwZSBmIFwoIC1pbmFtZSAiKi5oIiAtb3IgLWluYW1lICIqLmNwcCIgLW9yIC1pbmFtZSAiKi5jYyIgLW9yIC1pbmFtZSAiKi50Y2MiIFwpIC1wcmludGYgIlJlZm9ybWF0dGluZzogJWgvJWZcbiIgLWV4ZWMgY2xhbmctZm9ybWF0IC1pIHt9IFw7JykKKyMgJworIyBUaGUgYWJvdmUgY29tbWVudCBpcyB0byBmaXggZWRpdG9yIHN5bnRheCBoaWdobGlnaHRpbmcKKworQUNfQVJHX0VOQUJMRShbbGlic10sCisgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1saWJzXSwgW2J1aWxkIHRoZSBBcGFjaGUgVGhyaWZ0IGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdXSksCisgIFtdLCBlbmFibGVfbGlicz15ZXMKKykKK2hhdmVfbGlicz15ZXMKK2lmIHRlc3QgIiRlbmFibGVfbGlicyIgPSAibm8iOyB0aGVuCisgIGhhdmVfbGlicz0ibm8iCisgIHdpdGhfY3BwPSJubyIKKyAgd2l0aF9jX2dsaWI9Im5vIgorICB3aXRoX2NsPSJubyIKKyAgd2l0aF9qYXZhPSJubyIKKyAgd2l0aF9jc2hhcnA9Im5vIgorICB3aXRoX3B5dGhvbj0ibm8iCisgIHdpdGhfcHkzPSJubyIKKyAgd2l0aF9ydWJ5PSJubyIKKyAgd2l0aF9oYXNrZWxsPSJubyIKKyAgd2l0aF9oYXhlPSJubyIKKyAgd2l0aF9kb3RuZXRjb3JlPSJubyIKKyAgd2l0aF9wZXJsPSJubyIKKyAgd2l0aF9waHA9Im5vIgorICB3aXRoX3BocF9leHRlbnNpb249Im5vIgorICB3aXRoX2RhcnQ9Im5vIgorICB3aXRoX2VybGFuZz0ibm8iCisgIHdpdGhfZ289Im5vIgorICB3aXRoX2Q9Im5vIgorICB3aXRoX25vZGVqcz0ibm8iCisgIHdpdGhfbm9kZXRzPSJubyIKKyAgd2l0aF9sdWE9Im5vIgorICB3aXRoX3JzPSJubyIKKyAgd2l0aF9zd2lmdD0ibm8iCitmaQogCiBBWF9USFJJRlRfTElCKGNwcCwgW0MrK10sIHllcykKIGhhdmVfY3BwPW5vCiBpZiB0ZXN0ICIkd2l0aF9jcHAiID0gInllcyI7ICB0aGVuCi0gIEFYX0JPT1NUX0JBU0UoWzEuMzMuMV0pCisgIEFYX0JPT1NUX0JBU0UoWzEuNTMuMF0pCiAgIGlmIHRlc3QgIngkc3VjY2VlZGVkIiA9ICJ4eWVzIiA7IHRoZW4KKyAgICBBQ19TVUJTVChbQk9PU1RfTElCX0RJUl0sIFskKGVjaG8gIiRCT09TVF9MREZMQUdTIiB8IHNlZCAtZSAncy9eXC1MLy8nKV0pCisgICAgQUNfU1VCU1QoW0JPT1NUX0NIUk9OT19MREFERF0sIFskKGVjaG8gIiRCT09TVF9MSUJfRElSL2xpYmJvb3N0X2Nocm9uby5hIildKQorICAgIEFDX1NVQlNUKFtCT09TVF9GSUxFU1lTVEVNX0xEQUREXSwgWyQoZWNobyAiJEJPT1NUX0xJQl9ESVIvbGliYm9vc3RfZmlsZXN5c3RlbS5hIildKQorICAgIEFDX1NVQlNUKFtCT09TVF9TWVNURU1fTERBRERdLCBbJChlY2hvICIkQk9PU1RfTElCX0RJUi9saWJib29zdF9zeXN0ZW0uYSIpXSkKKyAgICBBQ19TVUJTVChbQk9PU1RfVEVTVF9MREFERF0sIFskKGVjaG8gIiRCT09TVF9MSUJfRElSL2xpYmJvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsuYSIpXSkKKyAgICBBQ19TVUJTVChbQk9PU1RfVEhSRUFEX0xEQUREXSwgWyQoZWNobyAiJEJPT1NUX0xJQl9ESVIvbGliYm9vc3RfdGhyZWFkLmEiKV0pCiAgICAgaGF2ZV9jcHA9InllcyIKICAgZmkKIAotICBBWF9MSUJfRVZFTlQoWzEuMF0pCisgIEFYX0xJQl9FVkVOVChbMi4wXSkKICAgaGF2ZV9saWJldmVudD0kc3VjY2VzcwogCiAgIEFYX0xJQl9aTElCKFsxLjIuM10pCiAgIGhhdmVfemxpYj0kc3VjY2VzcworCisgIEFYX1RIUklGVF9MSUIocXQ0LCBbUXRdLCB5ZXMpCisgIGhhdmVfcXQ9bm8KKyAgaWYgdGVzdCAiJHdpdGhfcXQ0IiA9ICJ5ZXMiOyAgdGhlbgorICAgIFBLR19DSEVDS19NT0RVTEVTKFtRVF0sIFtRdENvcmUgPj0gNC4zLCBRdE5ldHdvcmsgPj0gNC4zXSwgaGF2ZV9xdD15ZXMsIGhhdmVfcXQ9bm8pCisgIGZpCisgIGlmIHRlc3QgIiRoYXZlX3F0IiA9ICJ5ZXMiOyB0aGVuCisgICAgQUNfUEFUSF9QUk9HUyhbUVRfTU9DXSwgW21vYy1xdDQgbW9jXSwgImZhaWwiKQorICAgIGlmIHRlc3QgIiRRVF9NT0MiID0gImZhaWwiOyB0aGVuCisgICAgICBoYXZlX3F0PW5vCisgICAgZmkKKyAgZmkKKworICBBWF9USFJJRlRfTElCKHF0NSwgW1F0NV0sIHllcykKKyAgaGF2ZV9xdDU9bm8KKyAgcXRfcmVkdWNlX3JlbG9jPSIiCisgIGlmIHRlc3QgIiR3aXRoX3F0NSIgPSAieWVzIjsgIHRoZW4KKyAgICBQS0dfQ0hFQ0tfTU9EVUxFUyhbUVQ1XSwgW1F0NUNvcmUgPj0gNS4wLCBRdDVOZXR3b3JrID49IDUuMF0sCisgICAgICAgICAgICAgICAgICAgICAgW2hhdmVfcXQ1PXllcztxdF9yZWR1Y2VfcmVsb2M9YCRQS0dfQ09ORklHIC0tdmFyaWFibGU9cXRfY29uZmlnIFF0NUNvcmUgfCBncmVwICJyZWR1Y2VfcmVsb2NhdGlvbnMiYF0sCisgICAgICAgICAgICAgICAgICAgICAgW2hhdmVfcXQ1PW5vXSkKKyAgZmkKKyAgaWYgdGVzdCAiJGhhdmVfcXQ1IiA9ICJ5ZXMiOyB0aGVuCisgICAgQUNfUEFUSF9QUk9HUyhbUVQ1X01PQ10sIFttb2MtcXQ1IG1vY10sICJmYWlsIikKKyAgICBpZiB0ZXN0ICIkUVQ1X01PQyIgPSAiZmFpbCI7IHRoZW4KKyAgICAgIGhhdmVfcXQ1PW5vCisgICAgZmkKKyAgZmkKIGZpCiBBTV9DT05ESVRJT05BTChbV0lUSF9DUFBdLCBbdGVzdCAiJGhhdmVfY3BwIiA9ICJ5ZXMiXSkKIEFNX0NPTkRJVElPTkFMKFtBTVhfSEFWRV9MSUJFVkVOVF0sIFt0ZXN0ICIkaGF2ZV9saWJldmVudCIgPSAieWVzIl0pCiBBTV9DT05ESVRJT05BTChbQU1YX0hBVkVfWkxJQl0sIFt0ZXN0ICIkaGF2ZV96bGliIiA9ICJ5ZXMiXSkKK0FNX0NPTkRJVElPTkFMKFtBTVhfSEFWRV9RVF0sIFt0ZXN0ICIkaGF2ZV9xdCIgPSAieWVzIl0pCitBTV9DT05ESVRJT05BTChbQU1YX0hBVkVfUVQ1XSwgW3Rlc3QgIiRoYXZlX3F0NSIgPSAieWVzIl0pCitBTV9DT05ESVRJT05BTChbUVQ1X1JFRFVDRV9SRUxPQ0FUSU9OU10sIFt0ZXN0ICJ4JHF0X3JlZHVjZV9yZWxvYyIgIT0gIngiXSkKIAotQVhfVEhSSUZUX0xJQihjX2dsaWIsIFtDIChHTGliKV0sIG5vKQorQVhfVEhSSUZUX0xJQihjX2dsaWIsIFtDIChHTGliKV0sIHllcykKIGlmIHRlc3QgIiR3aXRoX2NfZ2xpYiIgPSAieWVzIjsgdGhlbgogICBQS0dfQ0hFQ0tfTU9EVUxFUyhbR0xJQl0sIFtnbGliLTIuMCA+PSAyLjBdLCBoYXZlX2dsaWIyPXllcywgaGF2ZV9nbGliMj1ubykKICAgUEtHX0NIRUNLX01PRFVMRVMoW0dPQkpFQ1RdLCBbZ29iamVjdC0yLjAgPj0gMi4wXSwgaGF2ZV9nb2JqZWN0Mj15ZXMsIGhhdmVfZ29iamVjdDI9bm8pCkBAIC0xMzMsOCArMjA1LDIxIEBACiBmaQogQU1fQ09ORElUSU9OQUwoV0lUSF9DX0dMSUIsIFt0ZXN0ICIkaGF2ZV9nbGliMiIgPSAieWVzIiAtYSAiJGhhdmVfZ29iamVjdDIiID0gInllcyJdKQogCitlY2hvICJPcGVuU1NMIGNoZWNrIgoraWYgdGVzdCAiJGhhdmVfY3BwIiA9ICJ5ZXMiIC1vICIkaGF2ZV9jX2dsaWIiID0gInllcyI7ICB0aGVuCisgIGVjaG8gIkhhdmUgY3BwIG9yIGMgc28gd2UgY2hlY2sgZm9yIE9wZW5TU0wiCisgIEFYX0NIRUNLX09QRU5TU0woKQorZmkKKwogQVhfVEhSSUZUX0xJQihjc2hhcnAsIFtDI10sIHllcykKIGlmIHRlc3QgIiR3aXRoX2NzaGFycCIgPSAieWVzIjsgIHRoZW4KKyAgUEtHX0NIRUNLX01PRFVMRVMoTU9OTywgbW9ubyA+PSAyLjExLjAsIG1vbm9fMl8xMT15ZXMsIG1vbm9fMl8xMT1ubykKKyAgaWYgdGVzdCAiJG1vbm9fMl8xMSIgPT0gInllcyI7IHRoZW4KKyAgICBBQ19QQVRIX1BST0coW01DU10sIFttY3NdKQorICAgIGlmIHRlc3QgIngkTUNTIiAhPSAieCI7IHRoZW4KKyAgICAgIG1vbm9fbWNzPSJ5ZXMiCisgICAgZmkKKyAgZmkKICAgUEtHX0NIRUNLX01PRFVMRVMoTU9OTywgbW9ubyA+PSAyLjAuMCwgbmV0XzNfNT15ZXMsIG5ldF8zXzU9bm8pCiAgIFBLR19DSEVDS19NT0RVTEVTKE1PTk8sIG1vbm8gPj0gMS4yLjQsIGhhdmVfbW9ubz15ZXMsIGhhdmVfbW9ubz1ubykKICAgaWYgdGVzdCAiJGhhdmVfbW9ubyIgPSAieWVzIiA7IHRoZW4KQEAgLTE0Myw2ICsyMjgsNyBAQAogZmkKIEFNX0NPTkRJVElPTkFMKFdJVEhfTU9OTywgW3Rlc3QgIiRoYXZlX2NzaGFycCIgPSAieWVzIl0pCiBBTV9DT05ESVRJT05BTChORVRfMl8wLCBbdGVzdCAiJG5ldF8zXzUiID0gIm5vIl0pCitBTV9DT05ESVRJT05BTChNT05PX01DUywgW3Rlc3QgIiRtb25vX21jcyIgPSAieWVzIl0pCiAKIEFYX1RIUklGVF9MSUIoamF2YSwgW0phdmFdLCB5ZXMpCiBpZiB0ZXN0ICIkd2l0aF9qYXZhIiA9ICJ5ZXMiOyAgdGhlbgpAQCAtMTUxLDcgKzIzNyw4IEBACiAgIEFYX0NIRUNLX0FOVF9WRVJTSU9OKCRBTlQsIDEuNykKICAgQUNfU1VCU1QoQ0xBU1NQQVRIKQogICBBQ19TVUJTVChBTlRfRkxBR1MpCi0gIGlmIHRlc3QgIngkSkFWQUMiICE9ICJ4IiAmJiB0ZXN0ICJ4JEpBVkFDIiAhPSAieCIgJiYgdGVzdCAieCRBTlQiICE9ICJ4IiA7IHRoZW4KKyAgQUNfU1VCU1QoR1JBRExFX09QVFMpCisgIGlmIHRlc3QgIngkSkFWQSIgIT0gIngiICYmIHRlc3QgIngkSkFWQUMiICE9ICJ4IiAmJiB0ZXN0ICJ4JEFOVCIgIT0gIngiIDsgdGhlbgogICAgIGhhdmVfamF2YT0ieWVzIgogICBmaQogZmkKQEAgLTE2MSwyOCArMjQ4LDkwIEBACiBpZiB0ZXN0ICIkd2l0aF9lcmxhbmciID0gInllcyI7ICB0aGVuCiAgIEFDX0VSTEFOR19QQVRIX0VSTAogICBBQ19FUkxBTkdfUEFUSF9FUkxDCisgIEFDX1BBVEhfUFJPRyhbUkVCQVJdLCBbcmViYXJdKQogICBpZiB0ZXN0IC1uICIkRVJMQyIgOyB0aGVuCiAgICAgQUNfRVJMQU5HX1NVQlNUX0xJQl9ESVIKICAgICAjIEluc3RhbGwgaW50byB0aGUgZGV0ZWN0ZWQgRXJsYW5nIGRpcmVjdG9yeSBpbnN0ZWFkIG9mICRsaWJkaXIvZXJsYW5nL2xpYgogICAgIEVSTEFOR19JTlNUQUxMX0xJQl9ESVI9IiRFUkxBTkdfTElCX0RJUiIKICAgICBBQ19FUkxBTkdfU1VCU1RfSU5TVEFMTF9MSUJfU1VCRElSKEFDX1BBQ0tBR0VfTkFNRSwgQUNfUEFDS0FHRV9WRVJTSU9OKQogICBmaQotICBpZiB0ZXN0IC1uICIkRVJMIiAtYSAtbiAiJEVSTEMiIDsgdGhlbgorICBpZiB0ZXN0IC1uICIkRVJMIiAtYSAtbiAiJEVSTEMiICYmIHRlc3QgIngkUkVCQVIiICE9ICJ4IiA7IHRoZW4KICAgICBoYXZlX2VybGFuZz0ieWVzIgorCisgICAgIyBvdHBfcmVsZWFzZSBpcyBzaW1wbHkgYSBudW1iZXIgKGxpa2UgIjE3IikgZm9yIE9UUDE3KyB3aGlsZSAiUjE2Li4uIiBmb3IgT1RQMTYgb3IgbGVzcy4KKyAgICAjIE9UUCB2ZXJzaW9uIGlzIGN1cnJlbnRseSBvbmx5IHVzZWQgZm9yIHJ1bm5pbmcgdGVzdHMuCisgICAgaWYgJEVSTCAtZXZhbCAnZXJsYW5nOmRpc3BsYXkoZXJsYW5nOnN5c3RlbV9pbmZvKG90cF9yZWxlYXNlKSksaGFsdCgpLicgLW5vc2hlbGwgfCBncmVwICJeXCJSIiA+L2Rldi9udWxsOyB0aGVuCisgICAgICBlcmxhbmdfb3RwMTZfb3JfbGVzcz0ieWVzIgorICAgIGZpCiAgIGZpCiBmaQogQU1fQ09ORElUSU9OQUwoV0lUSF9FUkxBTkcsIFt0ZXN0ICIkaGF2ZV9lcmxhbmciID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoRVJMQU5HX09UUDE2LCBbdGVzdCAiJGVybGFuZ19vdHAxNl9vcl9sZXNzIiA9ICJ5ZXMiXSkKIAorQVhfVEhSSUZUX0xJQihub2RlanMsIFtOb2RlanNdLCB5ZXMpCitoYXZlX25vZGVqcz1ubworaWYgdGVzdCAiJHdpdGhfbm9kZWpzIiA9ICJ5ZXMiOyB0aGVuCisgIEFDX1BBVEhfUFJPR1MoW05PREVKU10sIFtub2RlanMgbm9kZV0pCisgIEFDX1BBVEhfUFJPRyhbTlBNXSwgW25wbV0pCisgIGlmIHRlc3QgIngkTk9ERUpTIiAhPSAieCIgLWEgIngkTlBNIiAhPSAieCI7IHRoZW4KKyAgICBoYXZlX25vZGVqcz0ieWVzIgorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfTk9ERUpTLCBbdGVzdCAiJGhhdmVfbm9kZWpzIiA9ICJ5ZXMiXSkKK0FNX0NPTkRJVElPTkFMKEhBVkVfTlBNLCBbdGVzdCAieCROUE0iICE9ICJ4Il0pCisKK0FYX1RIUklGVF9MSUIobm9kZXRzLCBbTm9kZXRzXSwgeWVzKQoraGF2ZV9ub2RldHM9bm8KK2lmIHRlc3QgIiR3aXRoX25vZGV0cyIgPSAieWVzIjsgdGhlbgorICBBQ19QQVRIX1BST0dTKFtOT0RFVFNdLCBbbm9kZXRzIG5vZGVdKQorICBBQ19QQVRIX1BST0coW05QTV0sIFtucG1dKQorICBpZiB0ZXN0ICJ4JE5PREVUUyIgIT0gIngiIC1hICJ4JE5QTSIgIT0gIngiOyB0aGVuCisgICAgaGF2ZV9ub2RldHM9InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX05PREVUUywgW3Rlc3QgIiRoYXZlX25vZGV0cyIgPSAieWVzIl0pCitBTV9DT05ESVRJT05BTChIQVZFX05QTSwgW3Rlc3QgIngkTlBNIiAhPSAieCJdKQorCitBWF9USFJJRlRfTElCKGx1YSwgW0x1YV0sIHllcykKK2hhdmVfbHVhPW5vCitpZiB0ZXN0ICIkd2l0aF9sdWEiID0gInllcyI7IHRoZW4KKyAgQVhfUFJPR19MVUEoNS4yLCwgaGF2ZV9sdWE9InllcyIsIGhhdmVfbHVhPSJubyIpCisgIGlmIHRlc3QgIiRoYXZlX2x1YSIgPSAieWVzIjsgdGhlbgorICAgIEFYX0xVQV9IRUFERVJTKCwgaGF2ZV9sdWE9Im5vIikKKyAgICBBWF9MVUFfTElCUygsIGhhdmVfbHVhPSJubyIpCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9MVUEsIFt0ZXN0ICIkaGF2ZV9sdWEiID0gInllcyJdKQorCisjIEZpbmQgcHl0aG9uIHJlZ2FyZGxlc3Mgb2Ygd2l0aF9weXRob24gdmFsdWUsIGJlY2F1c2UgaXQncyBuZWVkZWQgYnkgbWFrZSBjcm9zcworQU1fUEFUSF9QWVRIT04oMi42LCwgOikKIEFYX1RIUklGVF9MSUIocHl0aG9uLCBbUHl0aG9uXSwgeWVzKQogaWYgdGVzdCAiJHdpdGhfcHl0aG9uIiA9ICJ5ZXMiOyAgdGhlbgotICBBTV9QQVRIX1BZVEhPTigyLjQsLCA6KQotICBpZiB0ZXN0ICJ4JFBZVEhPTiIgIT0gIngiICYmIHRlc3QgIngkUFlUSE9OIiAhPSAieDoiIDsgdGhlbgorICBpZiB0ZXN0IC1uICIkUFlUSE9OIjsgdGhlbgogICAgIGhhdmVfcHl0aG9uPSJ5ZXMiCiAgIGZpCisgIEFDX1BBVEhfUFJPRyhbVFJJQUxdLCBbdHJpYWxdKQorICBpZiB0ZXN0IC1uICIkVFJJQUwiOyB0aGVuCisgICAgaGF2ZV90cmlhbD0ieWVzIgorICBmaQogZmkKIEFNX0NPTkRJVElPTkFMKFdJVEhfUFlUSE9OLCBbdGVzdCAiJGhhdmVfcHl0aG9uIiA9ICJ5ZXMiXSkKK0FNX0NPTkRJVElPTkFMKFdJVEhfVFdJU1RFRF9URVNULCBbdGVzdCAiJGhhdmVfdHJpYWwiID0gInllcyJdKQogCi1BQ19QQVRIX1BST0coW1RSSUFMXSwgW3RyaWFsXSkKKyMgRmluZCAicHl0aG9uMyIgZXhlY3V0YWJsZS4KKyMgSXQncyBkaXN0cm8gc3BlY2lmaWMgYW5kIGZhciBmcm9tIGlkZWFsIGJ1dCBuZWVkZWQgdG8gY3Jvc3MgdGVzdCBweTItMyBhdCBvbmNlLgorIyBUT0RPOiBmaW5kICJweXRob24yIiBpZiBpdCdzIDMueAoraGF2ZV9weTM9Im5vIgorQVhfVEhSSUZUX0xJQihweTMsIFtQeTNdLCB5ZXMpCitpZiB0ZXN0ICIkd2l0aF9weTMiID0gInllcyI7IHRoZW4KKyAgaWYgJFBZVEhPTiAtLXZlcnNpb24gMj4mMSB8IGdyZXAgLXEgIlB5dGhvbiAyIjsgdGhlbgorICAgIEFDX1BBVEhfUFJPR1MoW1BZVEhPTjNdLCBbcHl0aG9uMyBweXRob24zLjcgcHl0aG9uMzcgcHl0aG9uMy42IHB5dGhvbjM2IHB5dGhvbjMuNSBweXRob24zNSBweXRob24zLjQgcHl0aG9uMzRdKQorICAgIGlmIHRlc3QgLW4gIiRQWVRIT04zIjsgdGhlbgorICAgICAgaGF2ZV9weTM9InllcyIKKyAgICBmaQorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfUFkzLCBbdGVzdCAiJGhhdmVfcHkzIiA9ICJ5ZXMiXSkKIAogQVhfVEhSSUZUX0xJQihwZXJsLCBbUGVybF0sIHllcykKIGlmIHRlc3QgIiR3aXRoX3BlcmwiID0gInllcyI7IHRoZW4KQEAgLTE5MCw5ICszMzksMTMgQEAKICAgaWYgdGVzdCAtbiAiJFBFUkwiIDsgdGhlbgogICAgIEFDX1BST0dfUEVSTF9NT0RVTEVTKFtCaXQ6OlZlY3Rvcl0sIHN1Y2Nlc3M9InllcyIsIHN1Y2Nlc3M9Im5vIikKICAgICBoYXZlX3BlcmxfYml0X3ZlY3Rvcj0iJHN1Y2Nlc3MiCisgICAgQUNfUFJPR19QRVJMX01PRFVMRVMoW0NsYXNzOjpBY2Nlc3Nvcl0sIHN1Y2Nlc3M9InllcyIsIHN1Y2Nlc3M9Im5vIikKKyAgICBoYXZlX3BlcmxfY2xhc3NfYWNjZXNzb3I9IiRzdWNjZXNzIgogICBmaQogICBpZiB0ZXN0IC1uICIkUEVSTCIgLWEgIiRoYXZlX3BlcmxfYml0X3ZlY3RvciIgPSAieWVzIiA7IHRoZW4KLSAgICBoYXZlX3Blcmw9InllcyIKKyAgICBpZiB0ZXN0IC1uICIkUEVSTCIgLWEgIiRoYXZlX3BlcmxfY2xhc3NfYWNjZXNzb3IiID0gInllcyIgOyB0aGVuCisgICAgICBoYXZlX3Blcmw9InllcyIKKyAgICBmaQogICBmaQogZmkKIEFNX0NPTkRJVElPTkFMKFdJVEhfUEVSTCwgW3Rlc3QgIiRoYXZlX3BlcmwiID0gInllcyJdKQpAQCAtMjA4LDI1ICszNjEsMzcgQEAKIAogQVhfVEhSSUZUX0xJQihwaHBfZXh0ZW5zaW9uLCBbUEhQX0VYVEVOU0lPTl0sIHllcykKIGlmIHRlc3QgIiR3aXRoX3BocF9leHRlbnNpb24iID0gInllcyI7IHRoZW4KLSAgQUNfUEFUSF9QUk9HKFtQSFBfQ09ORklHXSwgW3BocC1jb25maWddKQotICBpZiB0ZXN0IC1uICIkUEhQX0NPTkZJRyIgOyB0aGVuCi0gICAgQUNfQ09ORklHX1NVQkRJUlMoW2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2xdKQotICAgIGhhdmVfcGhwX2V4dGVuc2lvbj0ieWVzIgorICBpZiB0ZXN0IC1mICJsaWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZ3VyZSI7IHRoZW4KKyAgICBBQ19QQVRIX1BST0coW1BIUF9DT05GSUddLCBbcGhwLWNvbmZpZ10pCisgICAgaWYgdGVzdCAtbiAiJFBIUF9DT05GSUciIDsgdGhlbgorICAgICAgQUNfQ09ORklHX1NVQkRJUlMoW2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2xdKQorICAgICAgaGF2ZV9waHBfZXh0ZW5zaW9uPSJ5ZXMiCisgICAgZmkKICAgZmkKIGZpCiBBTV9DT05ESVRJT05BTChXSVRIX1BIUF9FWFRFTlNJT04sIFt0ZXN0ICIkaGF2ZV9waHBfZXh0ZW5zaW9uIiA9ICJ5ZXMiXSkKIAorQVhfVEhSSUZUX0xJQihkYXJ0LCBbREFSVF0sIHllcykKK2lmIHRlc3QgIiR3aXRoX2RhcnQiID0gInllcyI7IHRoZW4KKyAgQUNfUEFUSF9QUk9HKFtEQVJUXSwgW2RhcnRdKQorICBBQ19QQVRIX1BST0coW0RBUlRQVUJdLCBbcHViXSkKKyAgaWYgdGVzdCAieCREQVJUIiAhPSAieCIgLWEgIngkREFSVFBVQiIgIT0gIngiOyB0aGVuCisgICAgaGF2ZV9kYXJ0PSJ5ZXMiCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9EQVJULCBbdGVzdCAiJGhhdmVfZGFydCIgPSAieWVzIl0pCisKIEFYX1RIUklGVF9MSUIocnVieSwgW1J1YnldLCB5ZXMpCiBoYXZlX3J1Ynk9bm8KIGlmIHRlc3QgIiR3aXRoX3J1YnkiID0gInllcyI7IHRoZW4KICAgQUNfUEFUSF9QUk9HKFtSVUJZXSwgW3J1YnldKQotICBBQ19QQVRIX1BST0coW1JTUEVDXSwgW3NwZWNdKQotICBpZiB0ZXN0ICJ4JFJVQlkiICE9ICJ4IiA7IHRoZW4KKyAgQUNfUEFUSF9QUk9HKFtCVU5ETEVSXSwgW2J1bmRsZV0pCisgIGlmIHRlc3QgIngkUlVCWSIgIT0gIngiIC1hICJ4JEJVTkRMRVIiICE9ICJ4IjsgdGhlbgogICAgIGhhdmVfcnVieT0ieWVzIgogICBmaQogZmkKIEFNX0NPTkRJVElPTkFMKFdJVEhfUlVCWSwgW3Rlc3QgIiRoYXZlX3J1YnkiID0gInllcyJdKQotQU1fQ09ORElUSU9OQUwoSEFWRV9SU1BFQywgW3Rlc3QgIngkUlNQRUMiICE9ICJ4Il0pCitBTV9DT05ESVRJT05BTChIQVZFX0JVTkRMRVIsIFt0ZXN0ICJ4JEJVTkRMRVIiICE9ICJ4Il0pCiAKIEFYX1RIUklGVF9MSUIoaGFza2VsbCwgW0hhc2tlbGxdLCB5ZXMpCiBoYXZlX2hhc2tlbGw9bm8KQEAgLTI0OCwzMyArNDEzLDIzNCBAQAogCiBBWF9USFJJRlRfTElCKGdvLCBbR29dLCB5ZXMpCiBpZiB0ZXN0ICIkd2l0aF9nbyIgPSAieWVzIjsgIHRoZW4KLSAgY2FzZSBYIiRHT0FSQ0giIGluCi0gIFhhbWQ2NCkKLSAgICBHT0FSQ0hfTlVNPTYKLSAgCTs7Ci0gIFgzODYpCi0gICAgR09BUkNIX05VTT04Ci0gIAk7OwotICBYYXJtKQotICAgIEdPQVJDSF9OVU09NQotICAJOzsKLSAgKikKLSAgICBHT0FSQ0hfTlVNPTYKLSAgICA7OwotICBlc2FjCi0gIEdPX0M9JHtHT0JJTn0vJHtHT0FSQ0hfTlVNfWcKLSAgR09fTD0ke0dPQklOfS8ke0dPQVJDSF9OVU19bAotICBHT01BS0U9JHtHT0JJTn0vZ29tYWtlCi0gIEdPSU5TVEFMTD0ke0dPQklOfS9nb2luc3RhbGwKLSAgQUNfUEFUSF9QUk9HKFtHT19DXSwgWyR7R09BUkNIX05VTX1nXSkKLSAgQUNfUEFUSF9QUk9HKFtHT19MXSwgWyR7R09BUkNIX05VTX1sXSkKLSAgQUNfUEFUSF9QUk9HKFtHT01BS0VdLCBbZ29tYWtlXSkKLSAgQUNfUEFUSF9QUk9HKFtHT0lOU1RBTExdLCBbZ29pbnN0YWxsXSkKLSAgaWYgW1sgLXggIiRHT19DIiAtYSAteCAiJEdPX0wiIC1hIC14ICIkR09NQUtFIiAtYSAteCAiJEdPSU5TVEFMTCIgXV0gOyB0aGVuCi0gICAgaGF2ZV9nbz0ieWVzIgorICBBQ19QQVRIX1BST0coW0dPXSwgW2dvXSkKKyAgaWYgW1sgLXggIiRHTyIgXV0gOyB0aGVuCisgICAgQVNfSUYoW3Rlc3QgLW4gIiRHTyJdLFsKKyAgICAgIGF4X2dvX3ZlcnNpb249IjEuNCIKKyAgICAgIGF4X2dvMTdfdmVyc2lvbj0iMS43IgorCisgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHbyB2ZXJzaW9uXSkKKyAgICAgIGdvbGFuZ192ZXJzaW9uPWAkR08gdmVyc2lvbiAyPiYxIHwgJFNFRCAtZSAncy9cKGdvIFwpXCh2ZXJzaW9uIFwpXChnb1wpXChAPDpAMC05QDo+QC5APDpAMC05QDo+QC5APDpAMC05QDo+QFwpXChAPDpAXCpAOj5AKlwpLiovXDQvJ2AKKyAgICAgIEFDX01TR19SRVNVTFQoJGdvbGFuZ192ZXJzaW9uKQorICAgICAgQUNfU1VCU1QoW2dvbGFuZ192ZXJzaW9uXSxbJGdvbGFuZ192ZXJzaW9uXSkKKyAgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbJGF4X2dvX3ZlcnNpb25dLFtsZV0sWyRnb2xhbmdfdmVyc2lvbl0sWworICAgICAgOgorICAgICAgICBoYXZlX2dvPSJ5ZXMiCisgICAgICBdLFsKKyAgICAgIDoKKyAgICAgICAgaGF2ZV9nbz0ibm8iCisgICAgICBdKQorICAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFskZ29sYW5nX3ZlcnNpb25dLFtsdF0sWyRheF9nbzE3X3ZlcnNpb25dLFsKKyAgICAgIDoKKyAgICAgICAgZ29fdmVyc2lvbl9sdF8xNz0ieWVzIgorICAgICAgXSxbCisgICAgICA6CisgICAgICAgIGdvX3ZlcnNpb25fbHRfMTc9Im5vIgorICAgICAgXSkKKyAgICBdLFsKKyAgICAgIEFDX01TR19XQVJOKFtjb3VsZCBub3QgZmluZCBHbyBdKQorICAgICAgaGF2ZV9nbz0ibm8iCisgICAgXSkKICAgZmkKIGZpCiBBTV9DT05ESVRJT05BTChXSVRIX0dPLCBbdGVzdCAiJGhhdmVfZ28iID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoW0dPVkVSU0lPTl9MVF8xN10sIFt0ZXN0ICIkZ29fdmVyc2lvbl9sdF8xNyIgPSAieWVzIl0pCisKK0FYX1RIUklGVF9MSUIoc3dpZnQsIFtTd2lmdF0sIHllcykKK2hhdmVfc3dpZnQ9Im5vIgoraWYgdGVzdCAiJHdpdGhfc3dpZnQiID0gInllcyI7IHRoZW4KKyAgQUNfUEFUSF9QUk9HKFtTV0lGVF0sIFtzd2lmdF0pCisgIGlmIHRlc3QgIngkU1dJRlQiICE9ICJ4IiAtYSAieCRTV0lGVCIgIT0gIngiOyB0aGVuCisgICAgaGF2ZV9zd2lmdD0ieWVzIgorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFtXSVRIX1NXSUZUXSwgW3Rlc3QgIiRoYXZlX3N3aWZ0IiA9ICJ5ZXMiXSkKKworQVhfVEhSSUZUX0xJQihycywgW1J1c3RdLCB5ZXMpCitoYXZlX3JzPSJubyIKK2lmIHRlc3QgIiR3aXRoX3JzIiA9ICJ5ZXMiOyAgdGhlbgorICBBQ19QQVRIX1BST0coW0NBUkdPXSwgW2NhcmdvXSkKKyAgQUNfUEFUSF9QUk9HKFtSVVNUQ10sIFtydXN0Y10pCisgIGlmIFtbIC14ICIkQ0FSR08iIF1dICYmIFtbIC14ICIkUlVTVEMiIF1dOyB0aGVuCisgICAgICBtaW5fcnVzdGNfdmVyc2lvbj0iMS4xMyIKKworICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgcnVzdGMgdmVyc2lvbl0pCisgICAgICBydXN0Y192ZXJzaW9uPWAkUlVTVEMgLS12ZXJzaW9uIDI+JjEgfCAkU0VEIC1lICdzL1wocnVzdGMgXClcKFswLTldXClcLlwoWzAtOV1bMC05XSpcKVwuXChbMC05XVswLTldKlwpLiovXDIuXDMvJ2AKKyAgICAgIEFDX01TR19SRVNVTFQoJHJ1c3RjX3ZlcnNpb24pCisgICAgICBBQ19TVUJTVChbcnVzdGNfdmVyc2lvbl0sWyRydXN0Y192ZXJzaW9uXSkKKworICAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFskbWluX3J1c3RjX3ZlcnNpb25dLFtsZV0sWyRydXN0Y192ZXJzaW9uXSxbCisgICAgICA6CisgICAgICAgIGhhdmVfcnM9InllcyIKKyAgICAgIF0sWworICAgICAgOgorICAgICAgICBoYXZlX3JzPSJubyIKKyAgICAgIF0pCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9SUywgW3Rlc3QgIiRoYXZlX3JzIiA9ICJ5ZXMiXSkKKworQVhfVEhSSUZUX0xJQihjbCwgW0NvbW1vbiBMaXNwXSwgeWVzKQoraGF2ZV9jbD0ibm8iCitpZiB0ZXN0ICIkd2l0aF9jbCIgPSAieWVzIjsgIHRoZW4KKyAgQUNfUEFUSF9QUk9HKFtTQkNMXSwgW3NiY2xdKQorICBpZiB0ZXN0ICJ4JFNCQ0wiICE9ICJ4IjsgdGhlbgorICAgIGhhdmVfY2w9InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX0NMLCBbdGVzdCAiJGhhdmVfY2wiID0gInllcyJdKQorCitBWF9USFJJRlRfTElCKGhheGUsIFtIYXhlXSwgeWVzKQoraWYgdGVzdCAiJHdpdGhfaGF4ZSIgPSAieWVzIjsgIHRoZW4KKyAgQUNfUEFUSF9QUk9HKFtIQVhFXSwgW2hheGVdKQorICBpZiBbWyAteCAiJEhBWEUiIF1dIDsgdGhlbgorICAgIEFYX1BST0dfSEFYRV9WRVJTSU9OKCBbMy4xLjNdLCBoYXZlX2hheGU9InllcyIsIGhhdmVfaGF4ZT0ibm8iKQorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfSEFYRSwgW3Rlc3QgIiRoYXZlX2hheGUiID0gInllcyJdKQorCisKK0FYX1RIUklGVF9MSUIoZG90bmV0Y29yZSwgWy5ORVQgQ29yZV0sIHllcykKK2lmIHRlc3QgIiR3aXRoX2RvdG5ldGNvcmUiID0gInllcyI7ICB0aGVuCisgIEFDX1BBVEhfUFJPRyhbRE9UTkVUQ09SRV0sIFtkb3RuZXRdKQorICBpZiBbWyAteCAiJERPVE5FVENPUkUiIF1dIDsgdGhlbgorICAgIEFYX1BST0dfRE9UTkVUQ09SRV9WRVJTSU9OKCBbMi4wLjBdLCBoYXZlX2RvdG5ldGNvcmU9InllcyIsIGhhdmVfZG90bmV0Y29yZT0ibm8iKQorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfRE9UTkVUQ09SRSwgW3Rlc3QgIiRoYXZlX2RvdG5ldGNvcmUiID0gInllcyJdKQorCisKK0FYX1RIUklGVF9MSUIoZCwgW0RdLCB5ZXMpCitpZiB0ZXN0ICIkd2l0aF9kIiA9ICJ5ZXMiOyAgdGhlbgorICBBWF9ETUQKKyAgQUNfU1VCU1QoRE1EKQorICBpZiB0ZXN0ICJ4JERNRCIgIT0gIngiOyB0aGVuCisgICAgaGF2ZV9kPSJ5ZXMiCisgIGZpCitmaQorCisjIERldGVybWluZSBhY3R1YWwgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIEQgbGlicmFyeSBmb3IgdXNlIGluIHRoZSBjb21tYW5kIGxpbmUKKyMgd2hlbiBjb21waWxpbmcgdGVzdHMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIC1sPGxpYj4gc3ludGF4IGRvZXNuJ3Qgd29yaworIyB3aXRoIE9QVExJTksgKFdpbmRvd3MpLgorbGliX3ByZWZpeD1saWIKK2xpYl9zdWZmaXg9YQorY2FzZSAiJGhvc3Rfb3MiIGluCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICBsaWJfcHJlZml4PSIiCisgICAgbGliX3N1ZmZpeD1saWIKKyAgICA7OworZXNhYworRF9MSUJfTkFNRT0iJHtsaWJfcHJlZml4fXRocmlmdGQuJHtsaWJfc3VmZml4fSIKK0FDX1NVQlNUKERfTElCX05BTUUpCitEX0VWRU5UX0xJQl9OQU1FPSIke2xpYl9wcmVmaXh9dGhyaWZ0ZC1ldmVudC4ke2xpYl9zdWZmaXh9IgorQUNfU1VCU1QoRF9FVkVOVF9MSUJfTkFNRSkKK0RfU1NMX0xJQl9OQU1FPSIke2xpYl9wcmVmaXh9dGhyaWZ0ZC1zc2wuJHtsaWJfc3VmZml4fSIKK0FDX1NVQlNUKERfU1NMX0xJQl9OQU1FKQorCitpZiB0ZXN0ICIkaGF2ZV9kIiA9ICJ5ZXMiOyB0aGVuCisgIEFYX0NIRUNLX0RfTU9EVUxFKGRlaW1vcy5ldmVudDIuZXZlbnQpCisgIGhhdmVfZGVpbW9zX2V2ZW50Mj0kc3VjY2VzcworCisgIHdpdGhfZF9ldmVudF90ZXN0cz0ibm8iCisgIGlmIHRlc3QgIiRoYXZlX2RlaW1vc19ldmVudDIiID0gInllcyI7IHRoZW4KKyAgICBpZiB0ZXN0ICJ4JERNRF9MSUJFVkVOVF9GTEFHUyIgPSAieCI7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRkbWRfb3B0bGluayIgPSAieWVzIjsgdGhlbgorICAgICAgICBBQ19NU0dfV0FSTihbRCBsaWJldmVudCBpbnRlcmZhY2UgZm91bmQsIGJ1dCBjYW5ub3QgYXV0by1kZXRlY3QgXAorbGlua2VyIGZsYWdzIGZvciBPUFRMSU5LLiBQbGVhc2Ugc2V0IERNRF9MSUJFVkVOVF9GTEFHUyBtYW51YWxseS5dKQorICAgICAgZWxzZQorICAgICAgICBBWF9MSUJfRVZFTlQoWzIuMF0pCisgICAgICAgIGlmIHRlc3QgIiRzdWNjZXNzIiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgRE1EX0xJQkVWRU5UX0ZMQUdTPSQoZWNobyAiLWZ1c2UtbGQ9Z29sZCAkTElCRVZFTlRfTERGTEFHUyAkTElCRVZFTlRfTElCUyIgfCBcCisgICAgICAgICAgICBzZWQgLWUgJ3MvXiAqLy9nO3MvICokLy9nO3MvXlwoLlwpLy1MXDEvZztzLyAgKi8gLUwvZycpCisgICAgICAgICAgd2l0aF9kX2V2ZW50X3Rlc3RzPSJ5ZXMiCisgICAgICAgIGVsc2UKKyAgICAgICAgICBBQ19NU0dfV0FSTihbRCBsaWJldmVudCBpbnRlcmZhY2UgcHJlc2VudCwgYnV0IGxpYmV2ZW50IGxpYnJhcnkgbm90IGZvdW5kLl0pCisgICAgICAgIGZpCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIHdpdGhfZF9ldmVudF90ZXN0cz0ieWVzIgorICAgIGZpCisgIGZpCisKKyAgQVhfQ0hFQ0tfRF9NT0RVTEUoZGVpbW9zLm9wZW5zc2wuc3NsKQorICBoYXZlX2RlaW1vc19vcGVuc3NsPSRzdWNjZXNzCisKKyAgd2l0aF9kX3NzbF90ZXN0cz0ibm8iCisgIGlmIHRlc3QgIiRoYXZlX2RlaW1vc19vcGVuc3NsIiA9ICJ5ZXMiOyB0aGVuCisgICAgaWYgdGVzdCAieCRETURfT1BFTlNTTF9GTEFHUyIgPSAieCI7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRkbWRfb3B0bGluayIgPSAieWVzIjsgdGhlbgorICAgICAgICBBQ19NU0dfV0FSTihbRCBPcGVuU1NMIGludGVyZmFjZSBmb3VuZCwgYnV0IGNhbm5vdCBhdXRvLWRldGVjdCBcCitsaW5rZXIgZmxhZ3MgZm9yIE9QVExJTksuIFBsZWFzZSBzZXQgRE1EX09QRU5TU0xfRkxBR1MgbWFudWFsbHkuXSkKKyAgICAgIGVsc2UKKyAgICAgICAgQVhfQ0hFQ0tfT1BFTlNTTChbd2l0aF9kX3NzbF90ZXN0cz0ieWVzIl0pCisgICAgICAgIGlmIHRlc3QgIiR3aXRoX2Rfc3NsX3Rlc3RzIiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgRE1EX09QRU5TU0xfRkxBR1M9JChlY2hvICItZnVzZS1sZD1nb2xkICRPUEVOU1NMX0xERkxBR1MgJE9QRU5TU0xfTElCUyIgfCBcCisgICAgICAgICAgICBzZWQgLWUgJ3MvXiAqLy9nO3MvICokLy9nO3MvXlwoLlwpLy1MXDEvZztzLyAgKi8gLUwvZycpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBBQ19NU0dfV0FSTihbRCBPcGVuU1NMIGludGVyZmFjZSBwcmVzZW50LCBidXQgT3BlblNTTCBsaWJyYXJ5IG5vdCBmb3VuZC5dKQorICAgICAgICBmaQorICAgICAgZmkKKyAgICBlbHNlCisgICAgICB3aXRoX2Rfc3NsX3Rlc3RzPSJ5ZXMiCisgICAgZmkKKyAgZmkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKFdJVEhfRCwgW3Rlc3QgIiRoYXZlX2QiID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoRE1EX09QVExJTkssIFt0ZXN0ICIkZG1kX29wdGxpbmsiID0gInllcyJdKQorQUNfU1VCU1QoRE1EX09GX0RJUlNFUCwgIiRkbWRfb2ZfZGlyc2VwIikKK0FNX0NPTkRJVElPTkFMKEhBVkVfREVJTU9TX0VWRU5UMiwgW3Rlc3QgIiRoYXZlX2RlaW1vc19ldmVudDIiID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoV0lUSF9EX0VWRU5UX1RFU1RTLCBbdGVzdCAiJHdpdGhfZF9ldmVudF90ZXN0cyIgPSAieWVzIl0pCitBQ19TVUJTVChETURfTElCRVZFTlRfRkxBR1MpCitBTV9DT05ESVRJT05BTChIQVZFX0RFSU1PU19PUEVOU1NMLCBbdGVzdCAiJGhhdmVfZGVpbW9zX29wZW5zc2wiID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoV0lUSF9EX1NTTF9URVNUUywgW3Rlc3QgIiR3aXRoX2Rfc3NsX3Rlc3RzIiA9ICJ5ZXMiXSkKK0FDX1NVQlNUKERNRF9PUEVOU1NMX0ZMQUdTKQorCitBQ19BUkdfRU5BQkxFKFt0ZXN0c10sCisgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS10ZXN0c10sIFtidWlsZCB0ZXN0cyBbZGVmYXVsdD15ZXNdXSksCisgIFtdLCBlbmFibGVfdGVzdHM9eWVzCispCitoYXZlX3Rlc3RzPXllcworaWYgdGVzdCAiJGVuYWJsZV90ZXN0cyIgPSAibm8iOyB0aGVuCisgIGhhdmVfdGVzdHM9Im5vIgorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfVEVTVFMsIFt0ZXN0ICIkaGF2ZV90ZXN0cyIgPSAieWVzIl0pCisKK0FDX0FSR19FTkFCTEUoW3BsdWdpbl0sCisgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1wbHVnaW5dLCBbYnVpbGQgY29tcGlsZXIgcGx1Z2luIHN1cHBvcnQgW2RlZmF1bHQ9bm9dXSksCisgIFtdLCBlbmFibGVfcGx1Z2luPW5vCispCitoYXZlX3BsdWdpbj15ZXMKK2lmIHRlc3QgIiRoYXZlX2NwcCIgPSAibm8iIDsgdGhlbgorICBoYXZlX3BsdWdpbj0ibm8iCitmaQoraWYgdGVzdCAiJGVuYWJsZV9wbHVnaW4iID0gIm5vIjsgdGhlbgorICBoYXZlX3BsdWdpbj0ibm8iCitmaQorQUNfQ09ORklHX0xJTktTKFtjb21waWxlci9jcHAvdGVzdC9wbHVnaW4vdF9jcHBfZ2VuZXJhdG9yLmNjOmNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jY10pCitBTV9DT05ESVRJT05BTChXSVRIX1BMVUdJTiwgW3Rlc3QgIiRoYXZlX3BsdWdpbiIgPSAieWVzIl0pCisKK0FDX0FSR19FTkFCTEUoW3R1dG9yaWFsXSwKKyAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXR1dG9yaWFsXSwgW2J1aWxkIHR1dG9yaWFsIFtkZWZhdWx0PXllc11dKSwKKyAgW10sIGVuYWJsZV90dXRvcmlhbD15ZXMKKykKK2hhdmVfdHV0b3JpYWw9eWVzCitpZiB0ZXN0ICIkZW5hYmxlX3R1dG9yaWFsIiA9ICJubyI7IHRoZW4KKyAgaGF2ZV90dXRvcmlhbD0ibm8iCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9UVVRPUklBTCwgW3Rlc3QgIiRoYXZlX3R1dG9yaWFsIiA9ICJ5ZXMiXSkKKworQU1fQ09ORElUSU9OQUwoTUlOR1csIGZhbHNlKQorY2FzZSAiJHtob3N0X29zfSIgaW4KKyptaW5ndyopCisgIG1pbmd3MzJfc3VwcG9ydD0ieWVzIgorICBBQ19DSEVDS19IRUFERVIod2luZG93cy5oKQorICBBTV9DT05ESVRJT05BTChNSU5HVywgdHJ1ZSkKKyAgOzsKKyopCisgIEFDX0lTQ19QT1NJWAorICA7OworZXNhYwogCiBBQ19DX0NPTlNUCiBBQ19DX0lOTElORQpAQCAtMjkzLDE2ICs2NTksMjQgQEAKIEFDX0NIRUNLX0hFQURFUlMoW25ldGRiLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbbmV0aW5ldC9pbi5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW3B0aHJlYWQuaF0pCitBQ19DSEVDS19IRUFERVJTKFtzaWduYWwuaF0pCiBBQ19DSEVDS19IRUFERVJTKFtzdGRkZWYuaF0pCiBBQ19DSEVDS19IRUFERVJTKFtzdGRsaWIuaF0pCitBQ19DSEVDS19IRUFERVJTKFtzeXMvaW9jdGwuaF0pCiBBQ19DSEVDS19IRUFERVJTKFtzeXMvc29ja2V0LmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3RpbWUuaF0pCitBQ19DSEVDS19IRUFERVJTKFtzeXMvdW4uaF0pCitBQ19DSEVDS19IRUFERVJTKFtwb2xsLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3BvbGwuaF0pCitBQ19DSEVDS19IRUFERVJTKFtzeXMvcmVzb3VyY2UuaF0pCiBBQ19DSEVDS19IRUFERVJTKFt1bmlzdGQuaF0pCiBBQ19DSEVDS19IRUFERVJTKFtsaWJpbnRsLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbbWFsbG9jLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbb3BlbnNzbC9zc2wuaF0pCiBBQ19DSEVDS19IRUFERVJTKFtvcGVuc3NsL3JhbmQuaF0pCiBBQ19DSEVDS19IRUFERVJTKFtvcGVuc3NsL3g1MDl2My5oXSkKK0FDX0NIRUNLX0hFQURFUlMoW3NjaGVkLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbd2NoYXIuaF0pCiAKIEFDX0NIRUNLX0xJQihwdGhyZWFkLCBwdGhyZWFkX2NyZWF0ZSkKIGRubCBOT1RFKGRyZWlzcyk6IEkgaGF2ZW4ndCBiZWVuIGFibGUgdG8gZmluZCBhbnkgcmVhbGx5IHNvbGlkIGRvY3MKQEAgLTMxMiw3ICs2ODYsNiBAQAogZG5sIGFuZCB3ZSBoYXZlbid0IHlldCBmb3VuZCBhIHN5c3RlbSB3aGVyZSB0aGlzIGlzIGEgcHJvYmxlbS4KIEFDX0NIRUNLX0xJQihydCwgY2xvY2tfZ2V0dGltZSkKIEFDX0NIRUNLX0xJQihzb2NrZXQsIHNldHNvY2tvcHQpCi1BQ19DSEVDS19MSUIoc3NsLCBTU0xfY3RybCkKIAogQUNfVFlQRV9JTlQxNl9UCiBBQ19UWVBFX0lOVDMyX1QKQEAgLTMyNiw3ICs2OTksNyBAQAogQUNfVFlQRV9VSU5UMzJfVAogQUNfVFlQRV9VSU5UNjRfVAogQUNfVFlQRV9VSU5UOF9UCi1BQ19DSEVDS19UWVBFUyhbcHRyZGlmZl90XSwgW10sIFtleGl0IDFdKQorQUNfQ0hFQ0tfVFlQRVMoW3B0cmRpZmZfdF0sIFtdLCBbZWNobyAicHRyZGlmZl90IG5vdCBmb3VuZCBvciBnKysgbm90IGluc3RhbGxlZCAtIGNhbm5vdCBjb250aW51ZSIgJiYgZXhpdCAxXSkKIAogQUNfU1RSVUNUX1RNCiAKQEAgLTM1NCwxMiArNzI3LDE0IEBACiBBQ19DSEVDS19GVU5DUyhbYnplcm9dKQogQUNfQ0hFQ0tfRlVOQ1MoW2Z0cnVuY2F0ZV0pCiBBQ19DSEVDS19GVU5DUyhbZ2V0aG9zdGJ5bmFtZV0pCitBQ19DSEVDS19GVU5DUyhbZ2V0aG9zdGJ5bmFtZV9yXSkKIEFDX0NIRUNLX0ZVTkNTKFtnZXR0aW1lb2ZkYXldKQogQUNfQ0hFQ0tfRlVOQ1MoW21lbW1vdmVdKQogQUNfQ0hFQ0tfRlVOQ1MoW21lbXNldF0pCiBBQ19DSEVDS19GVU5DUyhbbWtkaXJdKQogQUNfQ0hFQ0tfRlVOQ1MoW3JlYWxwYXRoXSkKIEFDX0NIRUNLX0ZVTkNTKFtzZWxlY3RdKQorQUNfQ0hFQ0tfRlVOQ1MoW3NldGxvY2FsZV0pCiBBQ19DSEVDS19GVU5DUyhbc29ja2V0XSkKIEFDX0NIRUNLX0ZVTkNTKFtzdHJjaHJdKQogQUNfQ0hFQ0tfRlVOQ1MoW3N0cmR1cF0pCkBAIC0zNzIsNiArNzQ3LDggQEAKIEFDX0NIRUNLX0ZVTkNTKFtjbG9ja19nZXR0aW1lXSkKIEFDX0NIRUNLX0ZVTkNTKFtzY2hlZF9nZXRfcHJpb3JpdHlfbWluXSkKIEFDX0NIRUNLX0ZVTkNTKFtzY2hlZF9nZXRfcHJpb3JpdHlfbWF4XSkKK0FDX0NIRUNLX0ZVTkNTKFtpbmV0X250b2FdKQorQUNfQ0hFQ0tfRlVOQ1MoW3Bvd10pCiAKIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0gIm5vIiA7IHRoZW4KICAgQVhfU0lHTkVEX1JJR0hUX1NISUZUCkBAIC0zODUsNDUgKzc2Miw2IEBACiAgIEFDX0ZVTkNfRVJST1JfQVRfTElORQogZmkKIAotQVhfVEhSSUZUX0dFTihjcHAsIFtDKytdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9jcHBdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fY3BwIiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4oY19nbGliLCBbQyAoR0xpYildLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9jX2dsaWJdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fY19nbGliIiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4oamF2YSwgW0phdmFdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9qYXZhXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX2phdmEiID0gInllcyJdKQotQVhfVEhSSUZUX0dFTihhczMsIFtBUzNdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9hczNdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fYXMzIiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4oY3NoYXJwLCBbQyNdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9jc2hhcnBdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fY3NoYXJwIiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4ocHksIFtQeXRob25dLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9weV0sIFt0ZXN0ICIkYXhfdGhyaWZ0X2dlbl9weSIgPSAieWVzIl0pCi1BWF9USFJJRlRfR0VOKHJiLCBbUnVieV0sIHllcykKLUFNX0NPTkRJVElPTkFMKFtUSFJJRlRfR0VOX3JiXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX3JiIiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4ocGVybCwgW1BlcmxdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9wZXJsXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX3BlcmwiID0gInllcyJdKQotQVhfVEhSSUZUX0dFTihwaHAsIFtQSFBdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9waHBdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fcGhwIiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4oZXJsLCBbRXJsYW5nXSwgeWVzKQotQU1fQ09ORElUSU9OQUwoW1RIUklGVF9HRU5fZXJsXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX2VybCIgPSAieWVzIl0pCi1BWF9USFJJRlRfR0VOKGNvY29hLCBbQ29jb2FdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9jb2NvYV0sIFt0ZXN0ICIkYXhfdGhyaWZ0X2dlbl9jb2NvYSIgPSAieWVzIl0pCi1BWF9USFJJRlRfR0VOKHN0LCBbU21hbGx0YWxrXSwgeWVzKQotQU1fQ09ORElUSU9OQUwoW1RIUklGVF9HRU5fc3RdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fc3QiID0gInllcyJdKQotQVhfVEhSSUZUX0dFTihvY2FtbCwgW09DYW1sXSwgeWVzKQotQU1fQ09ORElUSU9OQUwoW1RIUklGVF9HRU5fb2NhbWxdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fb2NhbWwiID0gInllcyJdKQotQVhfVEhSSUZUX0dFTihocywgW0hhc2tlbGxdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9oc10sIFt0ZXN0ICIkYXhfdGhyaWZ0X2dlbl9ocyIgPSAieWVzIl0pCi1BWF9USFJJRlRfR0VOKHhzZCwgW1hTRF0sIHllcykKLUFNX0NPTkRJVElPTkFMKFtUSFJJRlRfR0VOX3hzZF0sIFt0ZXN0ICIkYXhfdGhyaWZ0X2dlbl94c2QiID0gInllcyJdKQotQVhfVEhSSUZUX0dFTihodG1sLCBbSFRNTF0sIHllcykKLUFNX0NPTkRJVElPTkFMKFtUSFJJRlRfR0VOX2h0bWxdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5faHRtbCIgPSAieWVzIl0pCi1BWF9USFJJRlRfR0VOKGpzLCBbSmF2YVNjcmlwdF0sIHllcykKLUFNX0NPTkRJVElPTkFMKFtUSFJJRlRfR0VOX2pzXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX2pzIiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4oamF2YW1lLCBbSmF2YU1FXSwgeWVzKQotQU1fQ09ORElUSU9OQUwoW1RIUklGVF9HRU5famF2YW1lXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX2phdmFtZSIgPSAieWVzIl0pCi1BWF9USFJJRlRfR0VOKGdvLCBbR09fQ10sIHllcykKLUFNX0NPTkRJVElPTkFMKFtUSFJJRlRfR0VOX2dvXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX2dvIiA9ICJ5ZXMiXSkKLQogIyAtLS0gQ292ZXJhZ2UgaG9va3MgLS0tCiAKIEFDX0FSR19FTkFCTEUoY292ZXJhZ2UsCkBAIC00NDgsMTA4ICs3ODYsMzE1IEBACiBBQ19TVUJTVChHQ09WX0xERkxBR1MpCiAKIEFDX0NPTkZJR19IRUFERVJTKGNvbmZpZy5oOmNvbmZpZy5oaW4pCitBQ19DT05GSUdfSEVBREVSUyhsaWIvY3BwL3NyYy90aHJpZnQvY29uZmlnLmg6Y29uZmlnLmhpbikKK0FDX0NPTkZJR19IRUFERVJTKGxpYi9jX2dsaWIvc3JjL3RocmlmdC9jb25maWcuaDpjb25maWcuaGluKQorIyBncnVhcmQgYWdhaW5zdCBwcmUgZGVmaW5lZCBjb25maWcuaAorQUhfVE9QKFsKKyNpZm5kZWYgQ09ORklHX0gKKyNkZWZpbmUgQ09ORklHX0gKK10pCitBSF9CT1RUT00oWworI2VuZGlmCitdKQorCiAKIEFDX0NPTkZJR19GSUxFUyhbCiAgIE1ha2VmaWxlCiAgIGNvbXBpbGVyL2NwcC9NYWtlZmlsZQotICBjb21waWxlci9jcHAvdmVyc2lvbi5oCisgIGNvbXBpbGVyL2NwcC9zcmMvTWFrZWZpbGUKKyAgY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL01ha2VmaWxlCisgIGNvbXBpbGVyL2NwcC90ZXN0L01ha2VmaWxlCisgIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3ZlcnNpb24uaAogICBsaWIvTWFrZWZpbGUKKyAgbGliL2NsL01ha2VmaWxlCiAgIGxpYi9jcHAvTWFrZWZpbGUKICAgbGliL2NwcC90ZXN0L01ha2VmaWxlCiAgIGxpYi9jcHAvdGhyaWZ0LW5iLnBjCiAgIGxpYi9jcHAvdGhyaWZ0LXoucGMKKyAgbGliL2NwcC90aHJpZnQtcXQucGMKKyAgbGliL2NwcC90aHJpZnQtcXQ1LnBjCiAgIGxpYi9jcHAvdGhyaWZ0LnBjCiAgIGxpYi9jX2dsaWIvTWFrZWZpbGUKICAgbGliL2NfZ2xpYi90aHJpZnRfY19nbGliLnBjCiAgIGxpYi9jX2dsaWIvdGVzdC9NYWtlZmlsZQogICBsaWIvY3NoYXJwL01ha2VmaWxlCisgIGxpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvTWFrZWZpbGUKKyAgbGliL2QvTWFrZWZpbGUKKyAgbGliL2QvdGVzdC9NYWtlZmlsZQogICBsaWIvZXJsL01ha2VmaWxlCi0gIGxpYi9lcmwvc3JjL3RocmlmdC5hcHAuc3JjCisgIGxpYi9nby9NYWtlZmlsZQorICBsaWIvZ28vdGVzdC9NYWtlZmlsZQorICBsaWIvaGF4ZS90ZXN0L01ha2VmaWxlCiAgIGxpYi9ocy9NYWtlZmlsZQogICBsaWIvamF2YS9NYWtlZmlsZQorICBsaWIvanMvTWFrZWZpbGUKICAgbGliL2pzL3Rlc3QvTWFrZWZpbGUKKyAgbGliL2pzb24vTWFrZWZpbGUKKyAgbGliL2pzb24vdGVzdC9NYWtlZmlsZQorICBsaWIvbmV0Y29yZS9NYWtlZmlsZQorICBsaWIvbm9kZWpzL01ha2VmaWxlCisgIGxpYi9ub2RldHMvTWFrZWZpbGUKICAgbGliL3BlcmwvTWFrZWZpbGUKICAgbGliL3BlcmwvdGVzdC9NYWtlZmlsZQogICBsaWIvcGhwL01ha2VmaWxlCisgIGxpYi9waHAvdGVzdC9NYWtlZmlsZQorICBsaWIvZGFydC9NYWtlZmlsZQogICBsaWIvcHkvTWFrZWZpbGUKICAgbGliL3JiL01ha2VmaWxlCisgIGxpYi9ycy9NYWtlZmlsZQorICBsaWIvcnMvdGVzdC9NYWtlZmlsZQorICBsaWIvbHVhL01ha2VmaWxlCisgIGxpYi9zd2lmdC9NYWtlZmlsZQorICBsaWIveG1sL01ha2VmaWxlCisgIGxpYi94bWwvdGVzdC9NYWtlZmlsZQogICB0ZXN0L01ha2VmaWxlCisgIHRlc3QvZmVhdHVyZXMvTWFrZWZpbGUKKyAgdGVzdC9jX2dsaWIvTWFrZWZpbGUKKyAgdGVzdC9jbC9NYWtlZmlsZQogICB0ZXN0L2NwcC9NYWtlZmlsZQorICB0ZXN0L2NzaGFycC9NYWtlZmlsZQorICB0ZXN0L2VybC9NYWtlZmlsZQorICB0ZXN0L2dvL01ha2VmaWxlCisgIHRlc3QvaGF4ZS9NYWtlZmlsZQogICB0ZXN0L2hzL01ha2VmaWxlCisgIHRlc3QvbHVhL01ha2VmaWxlCisgIHRlc3QvbmV0Y29yZS9NYWtlZmlsZQorICB0ZXN0L3BocC9NYWtlZmlsZQorICB0ZXN0L2RhcnQvTWFrZWZpbGUKKyAgdGVzdC9wZXJsL01ha2VmaWxlCiAgIHRlc3QvcHkvTWFrZWZpbGUKICAgdGVzdC9weS50d2lzdGVkL01ha2VmaWxlCisgIHRlc3QvcHkudG9ybmFkby9NYWtlZmlsZQogICB0ZXN0L3JiL01ha2VmaWxlCisgIHRlc3QvcnMvTWFrZWZpbGUKKyAgdHV0b3JpYWwvTWFrZWZpbGUKKyAgdHV0b3JpYWwvY19nbGliL01ha2VmaWxlCisgIHR1dG9yaWFsL2NsL01ha2VmaWxlCisgIHR1dG9yaWFsL2NwcC9NYWtlZmlsZQorICB0dXRvcmlhbC9kL01ha2VmaWxlCisgIHR1dG9yaWFsL2dvL01ha2VmaWxlCisgIHR1dG9yaWFsL2hheGUvTWFrZWZpbGUKKyAgdHV0b3JpYWwvaHMvTWFrZWZpbGUKKyAgdHV0b3JpYWwvamF2YS9NYWtlZmlsZQorICB0dXRvcmlhbC9qcy9NYWtlZmlsZQorICB0dXRvcmlhbC9uZXRjb3JlL01ha2VmaWxlCisgIHR1dG9yaWFsL25vZGVqcy9NYWtlZmlsZQorICB0dXRvcmlhbC9kYXJ0L01ha2VmaWxlCisgIHR1dG9yaWFsL3B5L01ha2VmaWxlCisgIHR1dG9yaWFsL3B5LnR3aXN0ZWQvTWFrZWZpbGUKKyAgdHV0b3JpYWwvcHkudG9ybmFkby9NYWtlZmlsZQorICB0dXRvcmlhbC9yYi9NYWtlZmlsZQorICB0dXRvcmlhbC9ycy9NYWtlZmlsZQogXSkKIAoraWYgdGVzdCAiJGhhdmVfY3BwIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9DUFA9ImNwcCIgOyBlbHNlIE1BWUJFX0NQUD0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfQ1BQXSkKK2lmIHRlc3QgIiRoYXZlX2NfZ2xpYiIgPSAieWVzIiA7IHRoZW4gTUFZQkVfQ19HTElCPSJjX2dsaWIiIDsgZWxzZSBNQVlCRV9DX0dMSUI9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0NfR0xJQl0pCitpZiB0ZXN0ICIkaGF2ZV9kIiA9ICJ5ZXMiIC1hICIkaGF2ZV9kZWltb3NfZXZlbnQyIiA9ICJ5ZXMiIC1hICIkaGF2ZV9kZWltb3Nfb3BlbnNzbCIgPSAieWVzIjsgdGhlbiBNQVlCRV9EPSJkIiA7IGVsc2UgTUFZQkVfRD0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfRF0pCitpZiB0ZXN0ICIkaGF2ZV9qYXZhIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9KQVZBPSJqYXZhIiA7IGVsc2UgTUFZQkVfSkFWQT0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfSkFWQV0pCitpZiB0ZXN0ICIkaGF2ZV9jc2hhcnAiID0gInllcyIgOyB0aGVuIE1BWUJFX0NTSEFSUD0iY3NoYXJwIiA7IGVsc2UgTUFZQkVfQ1NIQVJQPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9DU0hBUlBdKQoraWYgdGVzdCAiJGhhdmVfcHl0aG9uIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9QWVRIT049InB5IiA7IGVsc2UgTUFZQkVfUFlUSE9OPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9QWVRIT05dKQoraWYgdGVzdCAiJGhhdmVfcHkzIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9QWTM9InB5MyIgOyBlbHNlIE1BWUJFX1BZMz0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfUFkzXSkKK2lmIHRlc3QgIiRoYXZlX3J1YnkiID0gInllcyIgOyB0aGVuIE1BWUJFX1JVQlk9InJiIiA7IGVsc2UgTUFZQkVfUlVCWT0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfUlVCWV0pCitpZiB0ZXN0ICIkaGF2ZV9oYXNrZWxsIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9IQVNLRUxMPSJocyIgOyBlbHNlIE1BWUJFX0hBU0tFTEw9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0hBU0tFTExdKQoraWYgdGVzdCAiJGhhdmVfcGVybCIgPSAieWVzIiA7IHRoZW4gTUFZQkVfUEVSTD0icGVybCIgOyBlbHNlIE1BWUJFX1BFUkw9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX1BFUkxdKQoraWYgdGVzdCAiJGhhdmVfcGhwIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9QSFA9InBocCIgOyBlbHNlIE1BWUJFX1BIUD0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfUEhQXSkKK2lmIHRlc3QgIiRoYXZlX2RhcnQiID0gInllcyIgOyB0aGVuIE1BWUJFX0RBUlQ9ImRhcnQiIDsgZWxzZSBNQVlCRV9EQVJUPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9EQVJUXSkKK2lmIHRlc3QgIiRoYXZlX2dvIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9HTz0iZ28iIDsgZWxzZSBNQVlCRV9HTz0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfR09dKQoraWYgdGVzdCAiJGhhdmVfbm9kZWpzIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9OT0RFSlM9Im5vZGVqcyIgOyBlbHNlIE1BWUJFX05PREVKUz0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfTk9ERUpTXSkKK2lmIHRlc3QgIiRoYXZlX25vZGV0cyIgPSAieWVzIiA7IHRoZW4gTUFZQkVfTk9ERVRTPSJub2RldHMiIDsgZWxzZSBNQVlCRV9OT0RFVFM9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX05PREVUU10pCitpZiB0ZXN0ICIkaGF2ZV9lcmxhbmciID0gInllcyIgOyB0aGVuIE1BWUJFX0VSTEFORz0iZXJsIiA7IGVsc2UgTUFZQkVfRVJMQU5HPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9FUkxBTkddKQoraWYgdGVzdCAiJGhhdmVfbHVhIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9MVUE9Imx1YSIgOyBlbHNlIE1BWUJFX0xVQT0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfTFVBXSkKK2lmIHRlc3QgIiRoYXZlX3JzIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9SUz0icnMiIDsgZWxzZSBNQVlCRV9SUz0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfUlNdKQoraWYgdGVzdCAiJGhhdmVfc3dpZnQiID0gInllcyIgOyB0aGVuIE1BWUJFX1NXSUZUPSJzd2lmdCIgOyBlbHNlIE1BWUJFX1NXSUZUPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9TV0lGVF0pCitpZiB0ZXN0ICIkaGF2ZV9kb3RuZXRjb3JlIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9ET1RORVRDT1JFPSJuZXRjb3JlIiA7IGVsc2UgTUFZQkVfRE9UTkVUQ09SRT0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfRE9UTkVUQ09SRV0pCitpZiB0ZXN0ICIkaGF2ZV9jbCIgPSAieWVzIiA7IHRoZW4gTUFZQkVfQ0w9ImNsIiA7IGVsc2UgTUFZQkVfQ0w9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0NMXSkKKwogQUNfT1VUUFVUCiAKIAogZWNobwogZWNobyAiJFBBQ0tBR0UgJFZFUlNJT04iCiBlY2hvCi1lY2hvICJCdWlsZGluZyBjb2RlIGdlbmVyYXRvcnMgLi4uLi4gOiR0aHJpZnRfZ2VuZXJhdG9ycyIKLWVjaG8KLWVjaG8gIkJ1aWxkaW5nIEMrKyBMaWJyYXJ5IC4uLi4uLi4uLiA6ICRoYXZlX2NwcCIKIGVjaG8gIkJ1aWxkaW5nIEMgKEdMaWIpIExpYnJhcnkgLi4uLiA6ICRoYXZlX2NfZ2xpYiIKLWVjaG8gIkJ1aWxkaW5nIEphdmEgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX2phdmEiCi1lY2hvICJCdWlsZGluZyBDIyBMaWJyYXJ5IC4uLi4uLi4uLi4gOiAkaGF2ZV9jc2hhcnAiCi1lY2hvICJCdWlsZGluZyBQeXRob24gTGlicmFyeSAuLi4uLi4gOiAkaGF2ZV9weXRob24iCi1lY2hvICJCdWlsZGluZyBSdWJ5IExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9ydWJ5IgotZWNobyAiQnVpbGRpbmcgSGFza2VsbCBMaWJyYXJ5IC4uLi4uIDogJGhhdmVfaGFza2VsbCIKLWVjaG8gIkJ1aWxkaW5nIFBlcmwgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX3BlcmwiCi1lY2hvICJCdWlsZGluZyBQSFAgTGlicmFyeSAuLi4uLi4uLi4gOiAkaGF2ZV9waHAiCitlY2hvICJCdWlsZGluZyBDIyAoTW9ubykgTGlicmFyeSAuLi4gOiAkaGF2ZV9jc2hhcnAiCitlY2hvICJCdWlsZGluZyBDKysgTGlicmFyeSAuLi4uLi4uLi4gOiAkaGF2ZV9jcHAiCitlY2hvICJCdWlsZGluZyBDb21tb24gTGlzcCBMaWJyYXJ5Li4gOiAkaGF2ZV9jbCIKK2VjaG8gIkJ1aWxkaW5nIEQgTGlicmFyeSAuLi4uLi4uLi4uLiA6ICRoYXZlX2QiCitlY2hvICJCdWlsZGluZyBEYXJ0IExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9kYXJ0IgorZWNobyAiQnVpbGRpbmcgZG90bmV0Y29yZSBMaWJyYXJ5IC4uIDogJGhhdmVfZG90bmV0Y29yZSIKIGVjaG8gIkJ1aWxkaW5nIEVybGFuZyBMaWJyYXJ5IC4uLi4uLiA6ICRoYXZlX2VybGFuZyIKIGVjaG8gIkJ1aWxkaW5nIEdvIExpYnJhcnkgLi4uLi4uLi4uLiA6ICRoYXZlX2dvIgotaWYgdGVzdCAiJGhhdmVfY3BwIiA9ICJ5ZXMiIDsgdGhlbgotICBlY2hvCi0gIGVjaG8gIkJ1aWxkaW5nIFRabGliVHJhbnNwb3J0IC4uLi4uLiA6ICRoYXZlX3psaWIiCi0gIGVjaG8gIkJ1aWxkaW5nIFROb25ibG9ja2luZ1NlcnZlciAuLiA6ICRoYXZlX2xpYmV2ZW50IgotZmkKLWlmIHRlc3QgIiRoYXZlX2phdmEiID0gInllcyIgOyB0aGVuCi0gIGVjaG8KLSAgZWNobyAiVXNpbmcgamF2YWMgLi4uLi4uLi4uLi4uLi4uLi4uIDogJEpBVkFDIgotICBlY2hvICJVc2luZyBqYXZhIC4uLi4uLi4uLi4uLi4uLi4uLi4gOiAkSkFWQSIKLSAgZWNobyAiVXNpbmcgYW50IC4uLi4uLi4uLi4uLi4uLi4uLi4uIDogJEFOVCIKLWZpCitlY2hvICJCdWlsZGluZyBIYXNrZWxsIExpYnJhcnkgLi4uLi4gOiAkaGF2ZV9oYXNrZWxsIgorZWNobyAiQnVpbGRpbmcgSGF4ZSBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfaGF4ZSIKK2VjaG8gIkJ1aWxkaW5nIEphdmEgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX2phdmEiCitlY2hvICJCdWlsZGluZyBMdWEgTGlicmFyeSAuLi4uLi4uLi4gOiAkaGF2ZV9sdWEiCitlY2hvICJCdWlsZGluZyBOb2RlSlMgTGlicmFyeSAuLi4uLi4gOiAkaGF2ZV9ub2RlanMiCitlY2hvICJCdWlsZGluZyBQZXJsIExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9wZXJsIgorZWNobyAiQnVpbGRpbmcgUEhQIExpYnJhcnkgLi4uLi4uLi4uIDogJGhhdmVfcGhwIgorZWNobyAiQnVpbGRpbmcgUGx1Z2luIFN1cHBvcnQgLi4uLi4uIDogJGhhdmVfcGx1Z2luIgorZWNobyAiQnVpbGRpbmcgUHl0aG9uIExpYnJhcnkgLi4uLi4uIDogJGhhdmVfcHl0aG9uIgorZWNobyAiQnVpbGRpbmcgUHkzIExpYnJhcnkgLi4uLi4uLi4uIDogJGhhdmVfcHkzIgorZWNobyAiQnVpbGRpbmcgUnVieSBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfcnVieSIKK2VjaG8gIkJ1aWxkaW5nIFJ1c3QgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX3JzIgorZWNobyAiQnVpbGRpbmcgU3dpZnQgTGlicmFyeSAuLi4uLi4uIDogJGhhdmVfc3dpZnQiCisKIGlmIHRlc3QgIiRoYXZlX2NzaGFycCIgPSAieWVzIiA7IHRoZW4KICAgZWNobwotICBlY2hvICJVc2luZyAuTkVUIDMuNSAuLi4uLi4uLi4uLi4uLi4gOiAkbmV0XzNfNSIKKyAgZWNobyAiQyMgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIC5ORVQgMy41IC4uLi4uLi4uLi4uLiA6ICRuZXRfM181IgorICBlY2hvICIgICBVc2luZyBtb25vIHZlcnNpb24gLi4uLi4uLi4gOiAkKCRNQ1MgLS12ZXJzaW9uIHwgaGVhZCAtMSkiCiBmaQotaWYgdGVzdCAiJGhhdmVfcHl0aG9uIiA9ICJ5ZXMiIDsgdGhlbgoraWYgdGVzdCAiJGhhdmVfY3BwIiA9ICJ5ZXMiIDsgdGhlbgogICBlY2hvCi0gIGVjaG8gIlVzaW5nIFB5dGhvbiAuLi4uLi4uLi4uLi4uLi4uLiA6ICRQWVRIT04iCisgIGVjaG8gIkMrKyBMaWJyYXJ5OiIKKyAgZWNobyAiICAgQysrIGNvbXBpbGVyIC4uLi4uLi4uLi4uLi4uIDogJENYWCIKKyAgZWNobyAiICAgQnVpbGQgVFpsaWJUcmFuc3BvcnQgLi4uLi4uIDogJGhhdmVfemxpYiIKKyAgZWNobyAiICAgQnVpbGQgVE5vbmJsb2NraW5nU2VydmVyIC4uIDogJGhhdmVfbGliZXZlbnQiCisgIGVjaG8gIiAgIEJ1aWxkIFRRVGNwU2VydmVyIChRdDQpIC4uLiA6ICRoYXZlX3F0IgorICBlY2hvICIgICBCdWlsZCBUUVRjcFNlcnZlciAoUXQ1KSAuLi4gOiAkaGF2ZV9xdDUiCisgIGVjaG8gIiAgIEMrKyBjb21waWxlciB2ZXJzaW9uIC4uLi4uLiA6ICQoJENYWCAtLXZlcnNpb24gfCBoZWFkIC0xKSIKIGZpCi1pZiB0ZXN0ICIkaGF2ZV9waHAiID0gInllcyIgOyB0aGVuCitpZiB0ZXN0ICIkaGF2ZV9jbCIgPSAieWVzIiA7IHRoZW4KICAgZWNobwotICBlY2hvICJVc2luZyBwaHAtY29uZmlnIC4uLi4uLi4uLi4uLi4gOiAkUEhQX0NPTkZJRyIKKyAgZWNobyAiQ29tbW9uIExpc3AgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIENvbW1vbiBMaXNwIC4uLi4uLi4uLiA6ICRTQkNMIgorICBlY2hvICIgICBVc2luZyBDb21tb24gTGlzcCB2ZXJzaW9uIC4gOiAkKCRTQkNMIC0tdmVyc2lvbikiCiBmaQotaWYgdGVzdCAiJGhhdmVfcnVieSIgPSAieWVzIiA7IHRoZW4KK2lmIHRlc3QgIiRoYXZlX2QiID0gInllcyIgOyB0aGVuCiAgIGVjaG8KLSAgZWNobyAiVXNpbmcgUnVieSAuLi4uLi4uLi4uLi4uLi4uLi4uIDogJFJVQlkiCi0gIGVjaG8gIlVzaW5nIHJzcGVjIC4uLi4uLi4uLi4uLi4uLi4uLiA6ICRSU1BFQyIKKyAgZWNobyAiRCBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgRCBDb21waWxlciAuLi4uLi4uLi4uIDogJERNRCIKKyAgZWNobyAiICAgQnVpbGRpbmcgRCBsaWJldmVudCB0ZXN0cyAuIDogJHdpdGhfZF9ldmVudF90ZXN0cyIKKyAgZWNobyAiICAgQnVpbGRpbmcgRCBTU0wgdGVzdHMgLi4uLi4uIDogJHdpdGhfZF9zc2xfdGVzdHMiCisgIGVjaG8gIiAgIFVzaW5nIEQgdmVyc2lvbiAuLi4uLi4uLi4uLiA6ICQoJERNRCAtLXZlcnNpb24gfCBoZWFkIC0xKSIKIGZpCi1pZiB0ZXN0ICIkaGF2ZV9oYXNrZWxsIiA9ICJ5ZXMiIDsgdGhlbgoraWYgdGVzdCAiJGhhdmVfZGFydCIgPSAieWVzIiA7IHRoZW4KICAgZWNobwotICBlY2hvICJVc2luZyBIYXNrZWxsIC4uLi4uLi4uLi4uLi4uLi4gOiAkUlVOSEFTS0VMTCIKLSAgZWNobyAiVXNpbmcgQ2FiYWwgLi4uLi4uLi4uLi4uLi4uLi4uIDogJENBQkFMIgorICBlY2hvICJEYXJ0IExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBEYXJ0IC4uLi4uLi4uLi4uLi4uLi4gOiAkREFSVCIKKyAgZWNobyAiICAgVXNpbmcgUHViIC4uLi4uLi4uLi4uLi4uLi4uIDogJERBUlRQVUIiCisgIGVjaG8gIiAgIFVzaW5nIERhcnQgdmVyc2lvbiAuLi4uLi4uLiA6ICQoJERBUlQgLS12ZXJzaW9uIDI+JjEpIgogZmkKLWlmIHRlc3QgIiRoYXZlX3BlcmwiID0gInllcyIgOyB0aGVuCitpZiB0ZXN0ICIkaGF2ZV9kb3RuZXRjb3JlIiA9ICJ5ZXMiIDsgdGhlbgogICBlY2hvCi0gIGVjaG8gIlVzaW5nIFBlcmwgLi4uLi4uLi4uLi4uLi4uLi4uLiA6ICRQRVJMIgorICBlY2hvICIuTkVUIENvcmUgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIC5ORVQgQ29yZSAuLi4uLi4uLi4uLiA6ICRET1RORVRDT1JFIgorICBlY2hvICIgICBVc2luZyAuTkVUIENvcmUgdmVyc2lvbiAuLi4gOiAkRE9UTkVUQ09SRV9WRVJTSU9OIgogZmkKIGlmIHRlc3QgIiRoYXZlX2VybGFuZyIgPSAieWVzIiA7IHRoZW4KICAgZWNobwotICBlY2hvICJVc2luZyBlcmxjIC4uLi4uLi4uLi4uLi4uLi4uLi4gOiAkRVJMQyIKKyAgZWNobyAiRXJsYW5nIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBlcmxjIC4uLi4uLi4uLi4uLi4uLi4gOiAkRVJMQyIKKyAgZWNobyAiICAgVXNpbmcgcmViYXIgLi4uLi4uLi4uLi4uLi4uIDogJFJFQkFSIgorICBlY2hvICIgICBVc2luZyBlcmxjIHZlcnNpb24gLi4uLi4uLi4gOiAkKCRFUkwgLWV2YWwgJ2VybGFuZzpkaXNwbGF5KGVybGFuZzpzeXN0ZW1faW5mbyhvdHBfcmVsZWFzZSkpLCBoYWx0KCkuJyAtbm9zaGVsbCB8IHRyIC1kICdcIicpIgogZmkKIGlmIHRlc3QgIiRoYXZlX2dvIiA9ICJ5ZXMiIDsgdGhlbgogICBlY2hvCi0gIGVjaG8gIlVzaW5nIEdPUk9PVC4uLi4uLi4uLi4uLi4uLi4uLiA6ICRHT1JPT1QiCi0gIGVjaG8gIlVzaW5nIEdPQklOLi4uLi4uLi4uLi4uLi4uLi4uLiA6ICRHT0JJTiIKLSAgZWNobyAiVXNpbmcgR09BUkNILi4uLi4uLi4uLi4uLi4uLi4uIDogJEdPQVJDSCIKLSAgZWNobyAiVXNpbmcgR08gQ29tcGlsZXIuLi4uLi4uLi4uLi4uIDogJEdPX0MiCi0gIGVjaG8gIlVzaW5nIEdPIExpbmtlci4uLi4uLi4uLi4uLi4uLiA6ICRHT19MIgorICBlY2hvICJHbyBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgR28uLi4uLi4uLi4uLi4uLi4uLi4uIDogJEdPIgorICBlY2hvICIgICBVc2luZyBHbyB2ZXJzaW9uLi4uLi4uLi4uLi4gOiAkKCRHTyB2ZXJzaW9uKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9oYXNrZWxsIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIkhhc2tlbGwgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIENhYmFsIC4uLi4uLi4uLi4uLi4uLiA6ICRDQUJBTCIKKyAgZWNobyAiICAgVXNpbmcgSGFza2VsbCAuLi4uLi4uLi4uLi4uIDogJFJVTkhBU0tFTEwiCisgIGVjaG8gIiAgIFVzaW5nIEhhc2tlbGwgdmVyc2lvbiAuLi4uLiA6ICQoJFJVTkhBU0tFTEwgLS12ZXJzaW9uKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9oYXhlIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIkhheGUgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIEhheGUgLi4uLi4uLi4uLi4uLi4uLiA6ICRIQVhFIgorICBlY2hvICIgICBVc2luZyBIYXhlIHZlcnNpb24gLi4uLi4uLi4gOiAkSEFYRV9WRVJTSU9OIgorZmkKK2lmIHRlc3QgIiRoYXZlX2phdmEiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiSmF2YSBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgZ3JhZGxldyAuLi4uLi4uLi4uLi4uIDogbGliL2phdmEvZ3JhZGxldyIKKyAgZWNobyAiICAgVXNpbmcgamF2YSAuLi4uLi4uLi4uLi4uLi4uIDogJEpBVkEiCisgIGVjaG8gIiAgIFVzaW5nIGphdmFjIC4uLi4uLi4uLi4uLi4uLiA6ICRKQVZBQyIKKyAgZWNobyAiICAgVXNpbmcgR3JhZGxlIHZlcnNpb24gLi4uLi4uIDogJChsaWIvamF2YS9ncmFkbGV3IC0tdmVyc2lvbiAtLXF1aWV0IHwgZ3JlcCBHcmFkbGUgMj4mMSkiCisgIGVjaG8gIiAgIFVzaW5nIGphdmEgdmVyc2lvbiAuLi4uLi4uLiA6ICQoJEpBVkEgLXZlcnNpb24gMj4mMSB8IGdyZXAgJ3ZlcnNpb24gJykiCitmaQoraWYgdGVzdCAiJGhhdmVfbHVhIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIkx1YSBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgTHVhIC4uLi4uLi4uLi4uLi4uLi4uIDogJExVQSIKKyAgZWNobyAiICAgVXNpbmcgTHVhIHZlcnNpb24uLi4uLi4uLi4uIDogJCgkTFVBIC12KSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9ub2RlanMiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiTm9kZUpTIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBOb2RlSlMgLi4uLi4uLi4uLi4uLi4gOiAkTk9ERUpTIgorICBlY2hvICIgICBVc2luZyBOb2RlSlMgdmVyc2lvbi4uLi4uLi4gOiAkKCROT0RFSlMgLS12ZXJzaW9uKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9wZXJsIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIlBlcmwgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIFBlcmwgLi4uLi4uLi4uLi4uLi4uLiA6ICRQRVJMIgorICBlY2hvICIgICBVc2luZyBQZXJsIHZlcnNpb24gLi4uLi4uLi4gOiAkKCRQRVJMIC12IHwgZ3JlcCAndmVyc2lvbiAnKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9waHAiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiUEhQIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBwaHAtY29uZmlnIC4uLi4uLi4uLi4gOiAkUEhQX0NPTkZJRyIKKyAgZWNobyAiICAgVXNpbmcgcGhwIHZlcnNpb24gLi4uLi4uLi4uIDogJCgkUEhQIC0tdmVyc2lvbiB8IGhlYWQgLTEpIgorZmkKK2lmIHRlc3QgIiRoYXZlX3B5dGhvbiIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJQeXRob24gTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIFB5dGhvbiAuLi4uLi4uLi4uLi4uLiA6ICRQWVRIT04iCisgIGVjaG8gIiAgIFVzaW5nIFB5dGhvbiB2ZXJzaW9uIC4uLi4uLiA6ICQoJFBZVEhPTiAtLXZlcnNpb24gMj4mMSkiCisgIGlmIHRlc3QgIiRoYXZlX3B5MyIgPSAieWVzIiA7IHRoZW4KKyAgZWNobyAiICAgVXNpbmcgUHl0aG9uMyAuLi4uLi4uLi4uLi4uIDogJFBZVEhPTjMiCisgIGVjaG8gIiAgIFVzaW5nIFB5dGhvbjMgdmVyc2lvbiAuLi4uLiA6ICQoJFBZVEhPTjMgLS12ZXJzaW9uKSIKKyAgZmkKKyAgaWYgdGVzdCAiJGhhdmVfdHJpYWwiID0gInllcyI7IHRoZW4KKyAgZWNobyAiICAgVXNpbmcgdHJpYWwgLi4uLi4uLi4uLi4uLi4uIDogJFRSSUFMIgorICBmaQorZmkKK2lmIHRlc3QgIiRoYXZlX3J1YnkiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiUnVieSBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgUnVieSAuLi4uLi4uLi4uLi4uLi4uIDogJFJVQlkiCisgIGVjaG8gIiAgIFVzaW5nIFJ1YnkgdmVyc2lvbiAuLi4uLi4uLiA6ICQoJFJVQlkgLS12ZXJzaW9uKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9ycyIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJSdXN0IExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBDYXJnby4uLi4uLi4uLi4uLi4uLi4gOiAkQ0FSR08iCisgIGVjaG8gIiAgIFVzaW5nIHJ1c3RjLi4uLi4uLi4uLi4uLi4uLiA6ICRSVVNUQyIKKyAgZWNobyAiICAgVXNpbmcgUnVzdCB2ZXJzaW9uLi4uLi4uLi4uIDogJCgkUlVTVEMgLS12ZXJzaW9uKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9zd2lmdCIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJTd2lmdCBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgU3dpZnQgLi4uLi4uLi4uLi4uLi4uIDogJFNXSUZUIgorICBlY2hvICIgICBVc2luZyBTd2lmdCB2ZXJzaW9uIC4uLi4uLi4gOiAkKCRTV0lGVCAtLXZlcnNpb24gfCBoZWFkIC0xKSIKIGZpCiBlY2hvCiBlY2hvICJJZiBzb21ldGhpbmcgaXMgbWlzc2luZyB0aGF0IHlvdSB0aGluayBzaG91bGQgYmUgcHJlc2VudCwiCiBlY2hvICJwbGVhc2Ugc2tpbSB0aGUgb3V0cHV0IG9mIGNvbmZpZ3VyZSB0byBmaW5kIHRoZSBtaXNzaW5nIgogZWNobyAiY29tcG9uZW50LiAgRGV0YWlscyBhcmUgcHJlc2VudCBpbiBjb25maWcubG9nLiIKK2VjaG8KZGlmZiAtLWdpdCBhL2NvbnRyaWIvUmVidXMvQXBwLmNvbmZpZyBiL2NvbnRyaWIvUmVidXMvQXBwLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjA4YWY2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9SZWJ1cy9BcHAuY29uZmlnCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbj4KKyAgCisgIDxjb25maWdTZWN0aW9ucz4KKyAgICA8c2VjdGlvbiBuYW1lPSJyZWJ1cyIgdHlwZT0iUmVidXMuQ29uZmlndXJhdGlvbi5SZWJ1c0NvbmZpZ3VyYXRpb25TZWN0aW9uLCBSZWJ1cyIvPgorICA8L2NvbmZpZ1NlY3Rpb25zPgorCisgIDxyZWJ1cyBpbnB1dFF1ZXVlPSJNeVJlc3BvbnNlcyIgZXJyb3JRdWV1ZT0iTXlFcnJvcnMiIHdvcmtlcnM9IjEiPgorICAgIDxlbmRwb2ludHM+CisgICAgICA8YWRkIG1lc3NhZ2VzPSJSZWJ1c1NhbXBsZS5NYXRoUmVxdWVzdENhbGwsIFJlYnVzU2FtcGxlIiBlbmRwb2ludD0iTWF0aFJlcXVlc3RzIi8+CisgICAgICA8YWRkIG1lc3NhZ2VzPSJSZWJ1c1NhbXBsZS5NYXRoUmVzcG9uc2VDYWxsLCBSZWJ1c1NhbXBsZSIgZW5kcG9pbnQ9Ik1hdGhSZXNwb25zZXMiLz4KKyAgICA8L2VuZHBvaW50cz4KKyAgPC9yZWJ1cz4KKworICA8c3RhcnR1cD48c3VwcG9ydGVkUnVudGltZSB2ZXJzaW9uPSJ2NC4wIiBza3U9Ii5ORVRGcmFtZXdvcmssVmVyc2lvbj12NC4wIi8+PC9zdGFydHVwPjwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvUmVidXMvUHJvZ3JhbS5jcyBiL2NvbnRyaWIvUmVidXMvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjNjNjJhCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9SZWJ1cy9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsODEgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFJlYnVzLkNvbmZpZ3VyYXRpb247Cit1c2luZyBSZWJ1cy5SYWJiaXRNUTsKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBSZWJ1c1NhbXBsZS5DbGllbnQ7Cit1c2luZyBSZWJ1c1NhbXBsZS5TZXJ2ZXI7CisKK25hbWVzcGFjZSBSZWJ1c1NhbXBsZQoreworICAgIGNsYXNzIFByb2dyYW0KKyAgICB7CisgICAgICAgIHN0YXRpYyBCdWlsdGluQ29udGFpbmVyQWRhcHRlciBTdGFydFJlcXVlc3RTZXJ2ZXIoc3RyaW5nIHNlcnZlcikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY2xpZW50IFJlYnVzIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIHZhciBhZGFwdGVyID0gbmV3IEJ1aWx0aW5Db250YWluZXJBZGFwdGVyKCk7CisgICAgICAgICAgICBDb25maWd1cmUuV2l0aChhZGFwdGVyKQorICAgICAgICAgICAgICAgIC5UcmFuc3BvcnQodCA9PiB0LlVzZVJhYmJpdE1xKCJhbXFwOi8vIiArIHNlcnZlciwgIk1hdGhSZXF1ZXN0cyIsICJNYXRoUmVxdWVzdEVycm9ycyIpKQorICAgICAgICAgICAgICAgIC5NZXNzYWdlT3duZXJzaGlwKG8gPT4gby5Gcm9tUmVidXNDb25maWd1cmF0aW9uU2VjdGlvbigpKQorICAgICAgICAgICAgICAgIC5DcmVhdGVCdXMoKS5TdGFydCgpOworCisgICAgICAgICAgICAvLyByZWdpc3RlciBhbGwgcmVsZXZhbnQgbWVzc2FnZSBoYW5kbGVycyAKKyAgICAgICAgICAgIGFkYXB0ZXIuUmVnaXN0ZXIodHlwZW9mKE1hdGhSZXF1ZXN0Q2FsbEhhbmRsZXIpKTsKKyAgICAgICAgICAgIHJldHVybiBhZGFwdGVyOworICAgICAgICB9CisKKworICAgICAgICBzdGF0aWMgQnVpbHRpbkNvbnRhaW5lckFkYXB0ZXIgU3RhcnRSZXNwb25zZVNlcnZlcihzdHJpbmcgc2VydmVyKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBjbGllbnQgUmVidXMgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgdmFyIGFkYXB0ZXIgPSBuZXcgQnVpbHRpbkNvbnRhaW5lckFkYXB0ZXIoKTsKKyAgICAgICAgICAgIENvbmZpZ3VyZS5XaXRoKGFkYXB0ZXIpCisgICAgICAgICAgICAgICAgLlRyYW5zcG9ydCh0ID0+IHQuVXNlUmFiYml0TXEoImFtcXA6Ly8iICsgc2VydmVyLCAiTWF0aFJlc3BvbnNlcyIsICJNYXRoUmVzcG9uc2VFcnJvcnMiKSkKKyAgICAgICAgICAgICAgICAuTWVzc2FnZU93bmVyc2hpcChvID0+IG8uRnJvbVJlYnVzQ29uZmlndXJhdGlvblNlY3Rpb24oKSkKKyAgICAgICAgICAgICAgICAuQ3JlYXRlQnVzKCkuU3RhcnQoKTsKKworICAgICAgICAgICAgLy8gcmVnaXN0ZXIgYWxsIHJlbGV2YW50IG1lc3NhZ2UgaGFuZGxlcnMgCisgICAgICAgICAgICBhZGFwdGVyLlJlZ2lzdGVyKHR5cGVvZihNYXRoUmVzcG9uc2VDYWxsSGFuZGxlcikpOworICAgICAgICAgICAgcmV0dXJuIGFkYXB0ZXI7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBzZXJ2ZXIgPSAibG9jYWxob3N0IjsKKworICAgICAgICAgICAgLy8gc3RhcnQgYWxsIHNlcnZlcnMKKyAgICAgICAgICAgIHZhciByZXEgPSBTdGFydFJlcXVlc3RTZXJ2ZXIoc2VydmVyKTsKKyAgICAgICAgICAgIHZhciByc3AgPSBTdGFydFJlc3BvbnNlU2VydmVyKHNlcnZlcik7CisKKyAgICAgICAgICAgIC8vIHNlbmQgdGhlIGZpcnN0IG1lc3NhZ2UKKyAgICAgICAgICAgIHZhciByYW5kb20gPSBuZXcgUmFuZG9tKCk7CisgICAgICAgICAgICB2YXIgY2xpZW50ID0gbmV3IE1hdGhSZXF1ZXN0Q2xpZW50KHNlcnZlcik7CisgICAgICAgICAgICBjbGllbnQuRG9UaGVNYXRoKHJhbmRvbS5OZXh0KCksIHJhbmRvbS5OZXh0KCkpOworCisgICAgICAgICAgICAvLyBub3cgd2hhdD8KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIkhpdCA8RU5URVI+IHRvIHN0b3AgLi4uICIpOworICAgICAgICAgICAgQ29uc29sZS5SZWFkTGluZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9SZWJ1cy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2NvbnRyaWIvUmVidXMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ3NmVhYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvUmVidXMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSwzOCBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlJlYnVzU2FtcGxlIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlJlYnVzU2FtcGxlIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgIDIwMTQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCitbYXNzZW1ibHk6IEd1aWQoIjBhZjEwOTg0LTQwZDMtNDUzZC1iMWU1LTQyMTUyOWU4YzdlMiIpXQorCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS9jb250cmliL1JlYnVzL1JFQURNRS5tZCBiL2NvbnRyaWIvUmVidXMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYjljNDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1JlYnVzL1JFQURNRS5tZApAQCAtMCwwICsxLDIxIEBACitTYW1wbGUgY29kZSBmb3IgdGhlIGNvbWJpbmF0aW9uIG9mIFRocmlmdCB3aXRoIFJlYnVzLgorCitSZWJ1cyBpcyBhIC5ORVQgc2VydmljZSBidXMsIHNpbWlsYXIgdG8gTlNlcnZpY2VCdXMsIGJ1dCBtb3JlIGxpZ2h0d2VpZ2h0LiAKK0l0IGloYXMgYmVlbiBtYWlubHkgd3JpdHRlbiBieSBNb2dlbnMgSGVsbGVyIEdyYWJlIGFuZCBpcyBjdXJyZW50bHkgaG9zdGVkIAorb24gR2l0SHViIChodHRwczovL2dpdGh1Yi5jb20vcmVidXMtb3JnL1JlYnVzKQorCitBcyB3aXRoIGFsbCBTZXJ2aWNlQnVzIG9yIE1RIHNjZW5hcmlvcywgZHVlIHRvIHRoZSBoaWdobHkgYXN5bmNocm9ub3VzIAorb3BlcmF0aW9ucyBpdCBpcyByZWNvbW1lbmRlZCB0byBkbyBhbGwgY2FsbHMgYXMgIm9uZXdheSB2b2lkIiBjYWxscy4KKworVGhlIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGRvbmUgdmlhIEFwcC5Db25maWcsIHZpYSBjb2RlIG9yIGV2ZW4gbWl4ZWQgZnJvbSAKK2JvdGggbG9jYXRpb25zLiBSZWZlciB0byB0aGUgUmVidXMgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzLiBGb3IgCit0aGlzIGV4YW1wbGUsIHNpbmNlIHdlIGFyZSBlZmZlY3RpdmVseSBpbXBsZW1lbnRpbmcgdHdvIHF1ZXVlIGxpc3RlbmVycyBpbiAKK29ubHkgb25lIHNpbmdsZSBwcm9jZXNzLCB3ZSBkbyBjb25maWd1cmF0aW9uIG9mIGluY29taW5nIGFuZCBlcnJvciBxdWV1ZXMgCitpbiB0aGUgY29kZS4KKworSWYgeW91IHdhbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBub24tTkVUIGxhbmd1YWdlcywgeW91IG1heSBuZWVkIGEgY3VzdG9taXplZCAKK3NlcmlhbGl6ZXIgYXMgd2VsbCwgaW4gb3JkZXIgdG8gb3ZlcnJpZGUgUmVidXMnIGRlZmF1bHQgd2lyZSBmb3JtYXQuIFBsZWFzZSAKK3JlZmVyIHRvIHRoZSBSZWJ1cyBkb2NzIG9uIGhvdyB0byBkbyB0aGF0IChpdCdzIG5vdCB0aGF0IGhhcmQsIHJlYWxseSkuCisKK0FkZGl0aW9uYWwgcmVxdWlyZW1lbnRzOgorLSBSYWJiaXRNUSAuTkVUIGNsaWVudCAoc2VlIG51Z2V0KQpkaWZmIC0tZ2l0IGEvY29udHJpYi9SZWJ1cy9SZWJ1c1NhbXBsZS5jc3Byb2ogYi9jb250cmliL1JlYnVzL1JlYnVzU2FtcGxlLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDU4YTZkCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9SZWJ1cy9SZWJ1c1NhbXBsZS5jc3Byb2oKQEAgLTAsMCArMSwxMDIgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMTIuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aClcJChNU0J1aWxkVG9vbHNWZXJzaW9uKVxNaWNyb3NvZnQuQ29tbW9uLnByb3BzIiBDb25kaXRpb249IkV4aXN0cygnJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgpXCQoTVNCdWlsZFRvb2xzVmVyc2lvbilcTWljcm9zb2Z0LkNvbW1vbi5wcm9wcycpIiAvPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2plY3RHdWlkPnsyNjRFMjEyNi1FREUwLTRCNDctODlDMS1CMzk3QjI1QkIxM0R9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPlJlYnVzU2FtcGxlPC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+UmVidXNTYW1wbGU8L0Fzc2VtYmx5TmFtZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52NC41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8UGxhdGZvcm1UYXJnZXQ+QW55Q1BVPC9QbGF0Zm9ybVRhcmdldD4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPFBsYXRmb3JtVGFyZ2V0PkFueUNQVTwvUGxhdGZvcm1UYXJnZXQ+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlJhYmJpdE1RLkNsaWVudCI+CisgICAgICA8SGludFBhdGg+Li5cLi5cLi5cLi5cLi5cVG9vbGJveFxTZXJ2aWNlQnVzXDNyZHBhcnR5XHJhYmJpdG1xLWRvdG5ldC1jbGllbnQtMy4yLjEtZG90bmV0LTMuMFxiaW5cUmFiYml0TVEuQ2xpZW50LmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJSZWJ1cyI+CisgICAgICA8SGludFBhdGg+Li5cLi5cLi5cLi5cLi5cVG9vbGJveFxTZXJ2aWNlQnVzXDNyZHBhcnR5XFJlYnVzLW1hc3RlclxkZXBsb3lcTkVUNDBcUmVidXMuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlJlYnVzLlJhYmJpdE1RIj4KKyAgICAgIDxIaW50UGF0aD4uLlwuLlwuLlwuLlwuLlxUb29sYm94XFNlcnZpY2VCdXNcM3JkcGFydHlcUmVidXMtbWFzdGVyXGRlcGxveVxORVQ0MFxSZWJ1cy5SYWJiaXRNUS5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sLkxpbnEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YS5EYXRhU2V0RXh0ZW5zaW9ucyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5DU2hhcnAiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9Imdlbi1jc2hhcnBcQmFzaWNNYXRoQ2xpZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Imdlbi1jc2hhcnBcQmFzaWNNYXRoU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZpY2VJbXBsXEJvdGguY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmljZUltcGxcQ2xpZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb2dyYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmljZUltcGxcU2VydmVyLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Tm9uZSBJbmNsdWRlPSJBcHAuY29uZmlnIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cCAvPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXGxpYlxjc2hhcnBcc3JjXFRocmlmdC5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+ezQ5OWViNjNjLWQ3NGMtNDdlOC1hZTQ4LWEyZmM5NDUzOGU5ZH08L1Byb2plY3Q+CisgICAgICA8TmFtZT5UaHJpZnQ8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFByZUJ1aWxkRXZlbnQ+Y2QgJChQcm9qZWN0RGlyKQoraWYgbm90IGV4aXN0IGdlbi1jc2hhcnBcKi5jcyAgIHRocmlmdCAgLWdlbiBjc2hhcnAgc2FtcGxlLnRocmlmdAorPC9QcmVCdWlsZEV2ZW50PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIAorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9SZWJ1cy9SZWJ1c1NhbXBsZS5zbG4gYi9jb250cmliL1JlYnVzL1JlYnVzU2FtcGxlLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODRlZjM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9SZWJ1cy9SZWJ1c1NhbXBsZS5zbG4KQEAgLTAsMCArMSwyOCBAQAor77u/CitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMi4wMAorIyBWaXN1YWwgU3R1ZGlvIDIwMTMKK1Zpc3VhbFN0dWRpb1ZlcnNpb24gPSAxMi4wLjMwMTEwLjAKK01pbmltdW1WaXN1YWxTdHVkaW9WZXJzaW9uID0gMTAuMC40MDIxOS4xCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlJlYnVzU2FtcGxlIiwgIlJlYnVzU2FtcGxlLmNzcHJvaiIsICJ7MjY0RTIxMjYtRURFMC00QjQ3LTg5QzEtQjM5N0IyNUJCMTNEfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0IiwgIi4uXC4uXGxpYlxjc2hhcnBcc3JjXFRocmlmdC5jc3Byb2oiLCAiezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJezI2NEUyMTI2LUVERTAtNEI0Ny04OUMxLUIzOTdCMjVCQjEzRH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyNjRFMjEyNi1FREUwLTRCNDctODlDMS1CMzk3QjI1QkIxM0R9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezI2NEUyMTI2LUVERTAtNEI0Ny04OUMxLUIzOTdCMjVCQjEzRH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MjY0RTIxMjYtRURFMC00QjQ3LTg5QzEtQjM5N0IyNUJCMTNEfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvY29udHJpYi9SZWJ1cy9TZXJ2aWNlSW1wbC9Cb3RoLmNzIGIvY29udHJpYi9SZWJ1cy9TZXJ2aWNlSW1wbC9Cb3RoLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYTY3ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1JlYnVzL1NlcnZpY2VJbXBsL0JvdGguY3MKQEAgLTAsMCArMSwzNSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOworCisKK25hbWVzcGFjZSBSZWJ1c1NhbXBsZQoreworICAgIC8vIGdlbmVyaWMgZGF0YSBjb250YWluZXIgZm9yIHNlcmlhbGl6ZWQgVGhyaWZ0IGNhbGxzCisgICAgcHVibGljIGNsYXNzIEdlbmVyaWNUaHJpZnRTZXJ2aWNlQ2FsbAorICAgIHsKKyAgICAgICAgcHVibGljIGJ5dGVbXSByYXdCeXRlczsKKyAgICB9CisKKyAgICAvLyBzcGVjaWZpYyBjb250YWluZXJzIChvbmUgcGVyIFRocmlmdCBzZXJ2aWNlKSB0byBsZXZlcmFnZSBSZWJ1cycgaGFuZGxlciByb3V0aW5nCisgICAgcHVibGljIGNsYXNzIE1hdGhSZXF1ZXN0Q2FsbCA6IEdlbmVyaWNUaHJpZnRTZXJ2aWNlQ2FsbCB7IH0KKyAgICBwdWJsaWMgY2xhc3MgTWF0aFJlc3BvbnNlQ2FsbCA6IEdlbmVyaWNUaHJpZnRTZXJ2aWNlQ2FsbCB7IH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvUmVidXMvU2VydmljZUltcGwvQ2xpZW50LmNzIGIvY29udHJpYi9SZWJ1cy9TZXJ2aWNlSW1wbC9DbGllbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwODA0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvUmVidXMvU2VydmljZUltcGwvQ2xpZW50LmNzCkBAIC0wLDAgKzEsMTU3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBSZWJ1czsKK3VzaW5nIFJlYnVzLkNvbmZpZ3VyYXRpb247Cit1c2luZyBSZWJ1cy5NZXNzYWdlczsKK3VzaW5nIFJlYnVzLlJhYmJpdE1ROwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCisvKgorICogVGhlIGNsaWVudCBlbWl0cyBjYWxscyB0byBCYXNpY01hdGhTZXJ2ZXJzCisgKiAKKyAqIFRoZSBjbGllbnQgaW1wbGVtZW50cyB0aGUgQmFzaWNNYXRoQ2xpZW50IHNlcnZpY2UuIAorICogSWYgdGhlIHNlcnZlciBoYXMgcHJvY2Vzc2VkIG91ciByZXF1ZXN0LCB3ZSBnZXQgdGhlIHJlc3VsdHMgYmFjayB0aHJvdWdoIHRoaXMgc2VydmljZQorICovCisKK25hbWVzcGFjZSBSZWJ1c1NhbXBsZS5DbGllbnQKK3sKKworICAgIC8vIGhhbmRsZXIgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIFJlYnVzCisgICAgY2xhc3MgTWF0aFJlc3BvbnNlQ2FsbEhhbmRsZXIgOiBJSGFuZGxlTWVzc2FnZXM8TWF0aFJlc3BvbnNlQ2FsbD4KKyAgICB7CisgICAgICAgIHB1YmxpYyB2b2lkIEhhbmRsZShNYXRoUmVzcG9uc2VDYWxsIG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRocmlmdCBwcm90b2NvbC90cmFuc3BvcnQgc3RhY2sKKyAgICAgICAgICAgIHZhciBzdG0gPSBuZXcgTWVtb3J5U3RyZWFtKG1lc3NhZ2UucmF3Qnl0ZXMpOworICAgICAgICAgICAgdmFyIHRybnMgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChzdG0sIG51bGwpOworICAgICAgICAgICAgdmFyIHByb3QgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRybnMpOworCisgICAgICAgICAgICAvLyBjcmVhdGUgYSBwcm9jZXNzb3IgYW5kIGxldCBoaW0gaGFuZGxlIHRoZSBjYWxsCisgICAgICAgICAgICB2YXIgaG5kbCA9IG5ldyBNYXRoUmVzcG9uc2VzSGFuZGxlcigpOworICAgICAgICAgICAgdmFyIHByb2MgPSBuZXcgQmFzaWNNYXRoQ2xpZW50LlByb2Nlc3NvcihobmRsKTsKKyAgICAgICAgICAgIHByb2MuUHJvY2Vzcyhwcm90LCBudWxsKTsgIC8vIG9uZXdheSBvbmx5CisgICAgICAgIH0gICAgICAKKyAgICB9CisKKworICAgIC8vIHNlcnZlcyBpbmNvbWluZyByZXNwb25zZXMgd2l0aCBjYWxjdWxhdGlvbiByZXN1bHRzCisgICAgaW50ZXJuYWwgY2xhc3MgTWF0aFJlc3BvbnNlc0hhbmRsZXIgOiBCYXNpY01hdGhDbGllbnQuSWZhY2UKKyAgICB7CisgICAgICAgIHB1YmxpYyB2b2lkIEZvdXJSZXN1bHRzKGludCBhZGRlZCwgaW50IG11bHRpcGxpZWQsIGludCBzdWJ0cmFjdGVkLCBpbnQgZGl2aWRlZCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImFkZGVkID0gezB9IiwgYWRkZWQpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIm11bHRpcGxpZWQ9IHswfSIsIG11bHRpcGxpZWQpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInN1YnRyYWN0ZWQgPSB7MH0iLCBzdWJ0cmFjdGVkKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJkaXZpZGVkID0gezB9IiwgZGl2aWRlZCk7CisKKyAgICAgICAgICAgIFBpbmdBbmREb0Fub3RoZXJDYWxjdWxhdGlvbigpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBUaHJlZVJlc3VsdHMoaW50IGFkZGVkLCBpbnQgbXVsdGlwbGllZCwgaW50IHN1YnRyYWN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJhZGRlZCA9IHswfSIsIGFkZGVkKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJtdWx0aXBsaWVkPSB7MH0iLCBtdWx0aXBsaWVkKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJzdWJ0cmFjdGVkID0gezB9Iiwgc3VidHJhY3RlZCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRElWLzAgZXJyb3IgZHVyaW5nIGRpdmlzaW9uIik7CisKKyAgICAgICAgICAgIFBpbmdBbmREb0Fub3RoZXJDYWxjdWxhdGlvbigpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBQb25nKGxvbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBsYXRlbmN5ID0gRGF0ZVRpbWUuTm93LlRpY2tzIC0gdmFsdWU7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUGluZyB0b29rIHswfSBtcyIsIG5ldyBEYXRlVGltZShsYXRlbmN5KS5NaWxsaXNlY29uZCk7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgdm9pZCBQaW5nQW5kRG9Bbm90aGVyQ2FsY3VsYXRpb24oKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmFuZG9tID0gbmV3IFJhbmRvbSgpOworICAgICAgICAgICAgdmFyIGNsaWVudCA9IG5ldyBNYXRoUmVxdWVzdENsaWVudCgibG9jYWxob3N0Iik7CisgICAgICAgICAgICBjbGllbnQuUGluZyhEYXRlVGltZS5Ob3cuVGlja3MpOworICAgICAgICAgICAgY2xpZW50LkRvVGhlTWF0aChyYW5kb20uTmV4dCgpLCByYW5kb20uTmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gcHJvdmlkZXMgdGhlIGNsaWVudC1zaWRlIGludGVyZmFjZSBmb3IgY2FsY3VsYXRpb24gcmVxdWVzdHMKKyAgICBpbnRlcm5hbCBjbGFzcyBNYXRoUmVxdWVzdENsaWVudCA6IEJhc2ljTWF0aFNlcnZlci5JZmFjZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBCdWlsdGluQ29udGFpbmVyQWRhcHRlciBNUUFkYXB0ZXI7CisKKworICAgICAgICBwdWJsaWMgTWF0aFJlcXVlc3RDbGllbnQoc3RyaW5nIHNlcnZlcikKKyAgICAgICAgeworICAgICAgICAgICAgTVFBZGFwdGVyID0gbmV3IEJ1aWx0aW5Db250YWluZXJBZGFwdGVyKCk7CisgICAgICAgICAgICBDb25maWd1cmUuV2l0aChNUUFkYXB0ZXIpCisgICAgICAgICAgICAgICAgLlRyYW5zcG9ydCh0ID0+IHQuVXNlUmFiYml0TXFJbk9uZVdheU1vZGUoImFtcXA6Ly8iICsgc2VydmVyKSkgIC8vIHdlIG5lZWQgc2VuZCBvbmx5CisgICAgICAgICAgICAgICAgLk1lc3NhZ2VPd25lcnNoaXAobyA9PiBvLkZyb21SZWJ1c0NvbmZpZ3VyYXRpb25TZWN0aW9uKCkpCisgICAgICAgICAgICAgICAgLkNyZWF0ZUJ1cygpLlN0YXJ0KCk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyB2b2lkIFNlcmlhbGl6ZVRocmlmdENhbGwoQWN0aW9uPEJhc2ljTWF0aFNlcnZlci5JZmFjZT4gYWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaHJpZnQgcHJvdG9jb2wvdHJhbnNwb3J0IHN0YWNrCisgICAgICAgICAgICB2YXIgc3RtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgdmFyIHRybnMgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChudWxsLCBzdG0pOworICAgICAgICAgICAgdmFyIHByb3QgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRybnMpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBzZXJpYWxpemUgdGhlIGNhbGwgaW50byBhIGJ1bmNoIG9mIGJ5dGVzCisgICAgICAgICAgICB2YXIgY2xpZW50ID0gbmV3IEJhc2ljTWF0aFNlcnZlci5DbGllbnQocHJvdCk7CisgICAgICAgICAgICBpZiggYWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgYWN0aW9uKGNsaWVudCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJhY3Rpb24gbXVzdCBub3QgYmUgbnVsbCIpOworCisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgZXZlcnl0aGluZyBpcyB3cml0dGVuIHRvIHRoZSBNZW1vcnlTdHJlYW0KKyAgICAgICAgICAgIHRybnMuRmx1c2goKTsKKworICAgICAgICAgICAgLy8gc2VuZCB0aGUgbWVzc2FnZQorICAgICAgICAgICAgdmFyIG1zZyA9IG5ldyBNYXRoUmVxdWVzdENhbGwoKSB7IHJhd0J5dGVzID0gc3RtLlRvQXJyYXkoKSB9OworICAgICAgICAgICAgTVFBZGFwdGVyLkJ1cy5TZW5kKG1zZyk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyB2b2lkIFBpbmcobG9uZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2VyaWFsaXplVGhyaWZ0Q2FsbChjbGllbnQgPT4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbGllbnQuUGluZyh2YWx1ZSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIHZvaWQgRG9UaGVNYXRoKCBpbnQgYXJnMSwgaW50IGFyZzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcmlhbGl6ZVRocmlmdENhbGwoY2xpZW50ID0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LkRvVGhlTWF0aChhcmcxLCBhcmcyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jb250cmliL1JlYnVzL1NlcnZpY2VJbXBsL1NlcnZlci5jcyBiL2NvbnRyaWIvUmVidXMvU2VydmljZUltcGwvU2VydmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OWQ1MTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1JlYnVzL1NlcnZpY2VJbXBsL1NlcnZlci5jcwpAQCAtMCwwICsxLDE0MyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgUmVidXM7Cit1c2luZyBSZWJ1cy5Db25maWd1cmF0aW9uOwordXNpbmcgUmVidXMuTWVzc2FnZXM7Cit1c2luZyBSZWJ1cy5SYWJiaXRNUTsKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworLyoKKyAqIFRoZSBzZXJ2ZXIgaW1wbGVtZW50cyB0aGUgQmFzaWNNYXRoU2VydmVyIHNlcnZpY2UgLgorICogQWxsIHJlc3VsdHMgYXJlIHNlbnQgYmFjayB0byB0aGUgY2xpZW50IHZpYSB0aGUgQmFzaWNNYXRoQ2xpZW50IHNlcnZpY2UKKyAqLworCisKK25hbWVzcGFjZSBSZWJ1c1NhbXBsZS5TZXJ2ZXIKK3sKKyAgICAvLyBoYW5kbGVyIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBSZWJ1cworICAgIGNsYXNzIE1hdGhSZXF1ZXN0Q2FsbEhhbmRsZXIgOiBJSGFuZGxlTWVzc2FnZXM8TWF0aFJlcXVlc3RDYWxsPgorICAgIHsKKyAgICAgICAgcHVibGljIHZvaWQgSGFuZGxlKE1hdGhSZXF1ZXN0Q2FsbCBtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaHJpZnQgcHJvdG9jb2wvdHJhbnNwb3J0IHN0YWNrCisgICAgICAgICAgICB2YXIgc3RtID0gbmV3IE1lbW9yeVN0cmVhbShtZXNzYWdlLnJhd0J5dGVzKTsKKyAgICAgICAgICAgIHZhciB0cm5zID0gbmV3IFRTdHJlYW1UcmFuc3BvcnQoc3RtLCBudWxsKTsKKyAgICAgICAgICAgIHZhciBwcm90ID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cm5zKTsKKworICAgICAgICAgICAgLy8gY3JlYXRlIGEgcHJvY2Vzc29yIGFuZCBsZXQgaGltIGhhbmRsZSB0aGUgY2FsbAorICAgICAgICAgICAgdmFyIGhuZGwgPSBuZXcgTWF0aFJlcXVlc3RzSGFuZGxlcigpOworICAgICAgICAgICAgdmFyIHByb2MgPSBuZXcgQmFzaWNNYXRoU2VydmVyLlByb2Nlc3NvcihobmRsKTsKKyAgICAgICAgICAgIHByb2MuUHJvY2Vzcyhwcm90LCBudWxsKTsgIC8vIG9uZXdheSBvbmx5CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIHNlcnZlcyBpbmNvbWluZyBjYWxjdWxhdGlvbiByZXF1ZXN0cworICAgIGludGVybmFsIGNsYXNzIE1hdGhSZXF1ZXN0c0hhbmRsZXIgOiBCYXNpY01hdGhTZXJ2ZXIuSWZhY2UKKyAgICB7CisgICAgICAgIHB1YmxpYyB2b2lkIFBpbmcobG9uZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNsaWVudCA9IG5ldyBNYXRoUmVzcG9uc2VDbGllbnQoImxvY2FsaG9zdCIpOworICAgICAgICAgICAgY2xpZW50LlBvbmcodmFsdWUpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBEb1RoZU1hdGgoaW50IGFyZzEsIGludCBhcmcyKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY2xpZW50ID0gbmV3IE1hdGhSZXNwb25zZUNsaWVudCgibG9jYWxob3N0Iik7CisgICAgICAgICAgICBpZiggYXJnMiAhPSAwKQorICAgICAgICAgICAgICAgIGNsaWVudC5Gb3VyUmVzdWx0cyggYXJnMSthcmcyLCBhcmcxKmFyZzIsIGFyZzEtYXJnMiwgYXJnMS9hcmcyKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjbGllbnQuVGhyZWVSZXN1bHRzKCBhcmcxK2FyZzIsIGFyZzEqYXJnMiwgYXJnMS1hcmcyKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gcHJvdmlkZXMgdGhlIGNsaWVudC1zaWRlIGludGVyZmFjZSBmb3IgY2FsY3VsYXRpb24gcmVzcG9uc2VzCisgICAgaW50ZXJuYWwgY2xhc3MgTWF0aFJlc3BvbnNlQ2xpZW50IDogQmFzaWNNYXRoQ2xpZW50LklmYWNlCisgICAgeworICAgICAgICBwcml2YXRlIEJ1aWx0aW5Db250YWluZXJBZGFwdGVyIE1RQWRhcHRlcjsKKworCisgICAgICAgIHB1YmxpYyBNYXRoUmVzcG9uc2VDbGllbnQoc3RyaW5nIHNlcnZlcikKKyAgICAgICAgeworICAgICAgICAgICAgTVFBZGFwdGVyID0gbmV3IEJ1aWx0aW5Db250YWluZXJBZGFwdGVyKCk7CisgICAgICAgICAgICBDb25maWd1cmUuV2l0aChNUUFkYXB0ZXIpCisgICAgICAgICAgICAgICAgLlRyYW5zcG9ydCh0ID0+IHQuVXNlUmFiYml0TXFJbk9uZVdheU1vZGUoImFtcXA6Ly8iICsgc2VydmVyKSkgIC8vIHdlIG5lZWQgc2VuZCBvbmx5CisgICAgICAgICAgICAgICAgLk1lc3NhZ2VPd25lcnNoaXAobyA9PiBvLkZyb21SZWJ1c0NvbmZpZ3VyYXRpb25TZWN0aW9uKCkpCisgICAgICAgICAgICAgICAgLkNyZWF0ZUJ1cygpLlN0YXJ0KCk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyB2b2lkIFNlcmlhbGl6ZVRocmlmdENhbGwoQWN0aW9uPEJhc2ljTWF0aENsaWVudC5JZmFjZT4gYWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaHJpZnQgcHJvdG9jb2wvdHJhbnNwb3J0IHN0YWNrCisgICAgICAgICAgICB2YXIgc3RtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgdmFyIHRybnMgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChudWxsLCBzdG0pOworICAgICAgICAgICAgdmFyIHByb3QgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRybnMpOworCisgICAgICAgICAgICAvLyBzZXJpYWxpemUgdGhlIGNhbGwgaW50byBhIGJ1bmNoIG9mIGJ5dGVzCisgICAgICAgICAgICB2YXIgY2xpZW50ID0gbmV3IEJhc2ljTWF0aENsaWVudC5DbGllbnQocHJvdCk7CisgICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgYWN0aW9uKGNsaWVudCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJhY3Rpb24gbXVzdCBub3QgYmUgbnVsbCIpOworCisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgZXZlcnl0aGluZyBpcyB3cml0dGVuIHRvIHRoZSBNZW1vcnlTdHJlYW0KKyAgICAgICAgICAgIHRybnMuRmx1c2goKTsKKworICAgICAgICAgICAgLy8gc2VuZCB0aGUgbWVzc2FnZQorICAgICAgICAgICAgdmFyIG1zZyA9IG5ldyBNYXRoUmVzcG9uc2VDYWxsKCkgeyByYXdCeXRlcyA9IHN0bS5Ub0FycmF5KCkgfTsKKyAgICAgICAgICAgIE1RQWRhcHRlci5CdXMuU2VuZChtc2cpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBQb25nKGxvbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcmlhbGl6ZVRocmlmdENhbGwoY2xpZW50ID0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LlBvbmcodmFsdWUpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyB2b2lkIFRocmVlUmVzdWx0cyhpbnQgYWRkZWQsIGludCBtdWx0aXBsaWVkLCBpbnQgc3VjdHJhY3RlZCkKKyAgICAgICAgeworICAgICAgICAgICAgU2VyaWFsaXplVGhyaWZ0Q2FsbChjbGllbnQgPT4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbGllbnQuVGhyZWVSZXN1bHRzKGFkZGVkLCBtdWx0aXBsaWVkLCBzdWN0cmFjdGVkKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBGb3VyUmVzdWx0cyhpbnQgYWRkZWQsIGludCBtdWx0aXBsaWVkLCBpbnQgc3VjdHJhY3RlZCwgaW50IGRpdmlkZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcmlhbGl6ZVRocmlmdENhbGwoY2xpZW50ID0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LkZvdXJSZXN1bHRzKGFkZGVkLCBtdWx0aXBsaWVkLCBzdWN0cmFjdGVkLCBkaXZpZGVkKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jb250cmliL1JlYnVzL3NhbXBsZS50aHJpZnQgYi9jb250cmliL1JlYnVzL3NhbXBsZS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1ZTJkMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvUmVidXMvc2FtcGxlLnRocmlmdApAQCAtMCwwICsxLDMwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3NlcnZpY2UgQmFzaWNNYXRoU2VydmVyIHsKKyAgICBvbmV3YXkgdm9pZCBEb1RoZU1hdGgoIDE6IGkzMiBhcmcxLCAgMjogaTMyIGFyZzIpCisgICAgb25ld2F5IHZvaWQgUGluZygxOiBpNjQgdmFsdWUpCit9CisKK3NlcnZpY2UgQmFzaWNNYXRoQ2xpZW50IHsKKyAgICBvbmV3YXkgdm9pZCBUaHJlZVJlc3VsdHMoIDEgOiBpMzIgYWRkZWQsIDIgOiBpMzIgbXVsdGlwbGllZCwgMyA6IGkzMiBzdWJ0cmFjdGVkKTsKKyAgICBvbmV3YXkgdm9pZCBGb3VyUmVzdWx0cyggIDEgOiBpMzIgYWRkZWQsIDIgOiBpMzIgbXVsdGlwbGllZCwgMyA6IGkzMiBzdWJ0cmFjdGVkLCA0IDogaTMyIGRpdmlkZWQpOworICAgIG9uZXdheSB2b2lkIFBvbmcoMTogaTY0IHZhbHVlKQorfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9TdG9tcC9SRUFETUUubWQgYi9jb250cmliL1N0b21wL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTVmMjFjCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9TdG9tcC9SRUFETUUubWQKQEAgLTAsMCArMSwxOCBAQAorU2FtcGxlIGNvZGUgZm9yIFNUT01QLWJhc2VkIFRocmlmdCBjbGllbnRzIGFuZC9vciBzZXJ2ZXJzLgorCitBbHRob3VnaCB0aGUgc2FtcGxlIFRocmlmdCBTVE9NUCBUcmFuc3BvcnQgaXMgd3JpdHRlbiBpbiAKK0RlbHBoaS9QYXNjYWwsIGl0IGNhbiBlYXNpbHkgc2VydmUgYXMgYSBzdGFydGluZyBwb2ludCBmb3IgCitzaW1pbGFyIGltcGxlbWVudGF0aW9ucyBpbiBvdGhlciBsYW5ndWFnZXMuCisKK1NUT01QIGlzIGEgcHJvdG9jb2wgd2lkZWx5IHN1cHBvcnRlZCBieSBtYW55IG1lc3NhZ2luZyBzeXN0ZW1zLAorc3VjaCBhcyBBcGFjaGUgQWN0aXZlTVEsIFJhYmJpdE1RIGFuZCBtYW55IG90aGVycy4gSW4gcGFydGljdWxhciwKK2l0IGNhbiBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggU2VydmljZS1CdXMgcHJvZHVjdHMgbGlrZSBSZWJ1cworb3IgTlNlcnZpY2VCdXMsIHdoZW4gcnVubmluZyBhZ2FpbnN0IGEgU1RPTVAtY2FwYWJsZSBNUSBzeXN0ZW0uCisKK0EgcHJlcmVxdWlzaXRlIGZvciB0aGlzIHNhbXBsZSBpcyB0aGUgRGVscGhpIFNUT01QIEFkYXB0ZXIgd3JpdHRlbgorYnkgRGFuaWVsZSBUZXRpIChodHRwOi8vd3d3LmRhbmllbGV0ZXRpLml0L3N0b21wLWNsaWVudCksIGN1cnJlbnRseQoraG9zdGVkIGF0IEdvb2dsZSBDb2RlIChodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZGVscGhpc3RvbXBjbGllbnQpLgorCitBdCB0aGUgdGltZSBvZiB3cml0aW5nLCB0aGUgU1RPTVAgYWRhcHRlciBkb2VzIG5vdCBmdWxseSBzdXBwb3J0IAorYmluYXJ5IGRhdGEuIFBsZWFzZSBjaGVjayB3aGV0aGVyIHRoaXMgaGFzIGJlZW4gZml4ZWQsIG90aGVyd2lzZSAKK3lvdSBoYXZlIHRvIHVzZSB0aGUgSlNPTiBwcm90b2NvbCAob3IgdG8gZml4IGl0IG9uIHlvdXIgb3duKS4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvU3RvbXAvVGhyaWZ0LlRyYW5zcG9ydC5TVE9NUC5wYXMgYi9jb250cmliL1N0b21wL1RocmlmdC5UcmFuc3BvcnQuU1RPTVAucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmIzNzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1N0b21wL1RocmlmdC5UcmFuc3BvcnQuU1RPTVAucGFzCkBAIC0wLDAgKzEsMjAwIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGhyaWZ0LlRyYW5zcG9ydC5TVE9NUDsKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgQ2xhc3NlcyxXaW5kb3dzLCBTeXNVdGlscywKKyAgVGhyaWZ0LAorICBUaHJpZnQuVHJhbnNwb3J0LAorICBUaHJpZnQuUHJvdG9jb2wsCisgIFRocmlmdC5TdHJlYW0sCisgIFN0b21wQ2xpZW50LAorICBTdG9tcFR5cGVzOworCit0eXBlCisgIFRTdG9tcFRyYW5zcG9ydEltcGwgPSBjbGFzcyggVFN0cmVhbVRyYW5zcG9ydEltcGwpCisgIHN0cmljdCBwcml2YXRlCisgICAgRkRhdGEgICAgIDogVFN0cmluZ1N0cmVhbTsKKyAgICBGU2VydmVyICAgOiBzdHJpbmc7CisgICAgRk91dFF1ZXVlIDogc3RyaW5nOworICAgIEZTdG9tcENsaSA6IElTdG9tcENsaWVudDsKKyAgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBQZWVrOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhU2VydmVyQW5kUG9ydCwgYU91dFF1ZXVlIDogc3RyaW5nKTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKworICAgIHByb2NlZHVyZSBPcGVuKCk7ICBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2UoKTsgIG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBGbHVzaDsgIG92ZXJyaWRlOworICBlbmQ7CisKKworICBUU3RvbXBTZXJ2ZXJUcmFuc3BvcnRJbXBsID0gY2xhc3MoIFRTZXJ2ZXJUcmFuc3BvcnRJbXBsKQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZTZXJ2ZXIgIDogc3RyaW5nOworICAgIEZJblF1ZXVlIDogc3RyaW5nOworICAgIEZDbGllbnQgIDogSVN0b21wQ2xpZW50OworICBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgTGlzdGVuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIEFjY2VwdCggY29uc3QgZm5BY2NlcHRpbmc6IFRQcm9jKTogSVRyYW5zcG9ydDsgb3ZlcnJpZGU7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVNlcnZlckFuZFBvcnQsIGFJblF1ZXVlIDogc3RyaW5nKTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKyAgZW5kOworCisKK2NvbnN0CisgIFFVRVVFX1BSRUZJWCAgICA9ICcvcXVldWUvJzsKKyAgVE9QSUNfUFJFRklYICAgID0gJy90b3BpYy8nOworICBFWENIQU5HRV9QUkVGSVggPSAnL2V4Y2hhbmdlLyc7CisKKworaW1wbGVtZW50YXRpb24KKworCisKK2NvbnN0cnVjdG9yIFRTdG9tcFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBjb25zdCBhU2VydmVyQW5kUG9ydCwgYU91dFF1ZXVlIDogc3RyaW5nKTsKK3ZhciBhZGFwdGVyIDogSVRocmlmdFN0cmVhbTsKK2JlZ2luCisgIEZEYXRhICAgICA6PSBUU3RyaW5nU3RyZWFtLkNyZWF0ZTsKKyAgRlNlcnZlciAgIDo9IGFTZXJ2ZXJBbmRQb3J0OworICBGT3V0UXVldWUgOj0gYU91dFF1ZXVlOworCisgIGFkYXB0ZXIgOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBGRGF0YSwgRkFMU0UpOworICBpbmhlcml0ZWQgQ3JlYXRlKCBuaWwsIGFkYXB0ZXIpOyAgLy8gb3V0cHV0IG9ubHkKK2VuZDsKKworCitkZXN0cnVjdG9yIFRTdG9tcFRyYW5zcG9ydEltcGwuRGVzdHJveTsKK2JlZ2luCisgIGluaGVyaXRlZCBEZXN0cm95OworICBGcmVlQW5kTmlsKCBGRGF0YSk7CisgIEZTdG9tcENsaSA6PSBuaWw7CitlbmQ7CisKKworZnVuY3Rpb24gVFN0b21wVHJhbnNwb3J0SW1wbC5HZXRJc09wZW46IEJvb2xlYW47CitiZWdpbgorICByZXN1bHQgOj0gKEZTdG9tcENsaSA8PiBuaWwpOworZW5kOworCisKK2Z1bmN0aW9uIFRTdG9tcFRyYW5zcG9ydEltcGwuUGVlazogQm9vbGVhbjsKK2JlZ2luCisgIHJlc3VsdCA6PSBGQUxTRTsgIC8vIG91dHB1dCBvbmx5CitlbmQ7CisKKworcHJvY2VkdXJlIFRTdG9tcFRyYW5zcG9ydEltcGwuT3BlbjsKK2JlZ2luCisgIGlmIEZTdG9tcENsaSA8PiBuaWwKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbiwgJ2FscmVhZHkgb3BlbicpCisgIGVsc2UgRlN0b21wQ2xpIDo9IFN0b21wVXRpbHMuTmV3U3RvbXAoIEZTZXJ2ZXIpOworZW5kOworCisKK3Byb2NlZHVyZSBUU3RvbXBUcmFuc3BvcnRJbXBsLkNsb3NlOworYmVnaW4KKyAgRlN0b21wQ2xpIDo9IG5pbDsKKyAgRkRhdGEuQ2xlYXI7CitlbmQ7CisKKworcHJvY2VkdXJlIFRTdG9tcFRyYW5zcG9ydEltcGwuRmx1c2g7CitiZWdpbgorICBpZiBGU3RvbXBDbGkgPSBuaWwKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAnbm90IG9wZW4nKTsKKworICBGU3RvbXBDbGkuU2VuZCggRk91dFF1ZXVlLCBGRGF0YS5EYXRhU3RyaW5nKTsKKyAgRkRhdGEuQ2xlYXI7CitlbmQ7CisKKworLy8tLS0gVFN0b21wU2VydmVyVHJhbnNwb3J0SW1wbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2NvbnN0cnVjdG9yIFRTdG9tcFNlcnZlclRyYW5zcG9ydEltcGwuQ3JlYXRlKCBjb25zdCBhU2VydmVyQW5kUG9ydCwgYUluUXVldWUgOiBzdHJpbmcpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlNlcnZlciAgOj0gYVNlcnZlckFuZFBvcnQ7CisgIEZJblF1ZXVlIDo9IGFJblF1ZXVlOworZW5kOworCisKK2Rlc3RydWN0b3IgVFN0b21wU2VydmVyVHJhbnNwb3J0SW1wbC5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgQ2xvc2U7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUU3RvbXBTZXJ2ZXJUcmFuc3BvcnRJbXBsLkxpc3RlbjsKK2JlZ2luCisgIEZDbGllbnQgOj0gU3RvbXBVdGlscy5OZXdTdG9tcChGU2VydmVyKTsKKyAgRkNsaWVudC5TdWJzY3JpYmUoIEZJblF1ZXVlKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFN0b21wU2VydmVyVHJhbnNwb3J0SW1wbC5DbG9zZTsKK2JlZ2luCisgIGlmIEZDbGllbnQgPD4gbmlsIHRoZW4gYmVnaW4KKyAgICBGQ2xpZW50LlVuc3Vic2NyaWJlKCBGSW5RdWV1ZSk7CisgICAgRkNsaWVudCA6PSBuaWw7CisgIGVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUU3RvbXBTZXJ2ZXJUcmFuc3BvcnRJbXBsLkFjY2VwdCggY29uc3QgZm5BY2NlcHRpbmc6IFRQcm9jKTogSVRyYW5zcG9ydDsKK3ZhciBmcmFtZSAgIDogSVN0b21wRnJhbWU7CisgICAgYWRhcHRlciA6IElUaHJpZnRTdHJlYW07CisgICAgc3RyZWFtICA6IFRTdHJpbmdTdHJlYW07CitiZWdpbgorICBpZiBGQ2xpZW50ID0gbmlsCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vdCBjb25uZWN0ZWQuJyk7CisKKyAgaWYgQXNzaWduZWQoZm5BY2NlcHRpbmcpCisgIHRoZW4gZm5BY2NlcHRpbmcoKTsKKworICB0cnkKKyAgICBmcmFtZSA6PSBGQ2xpZW50LlJlY2VpdmUoTUFYSU5UKTsKKyAgICBpZiBmcmFtZSA9IG5pbCB0aGVuIEV4aXQobmlsKTsKKworICAgIHN0cmVhbSAgOj0gVFN0cmluZ1N0cmVhbS5DcmVhdGUoIGZyYW1lLkdldEJvZHkpOworICAgIGFkYXB0ZXIgOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBzdHJlYW0sIFRSVUUpOworICAgIHJlc3VsdCAgOj0gVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBhZGFwdGVyLCBuaWwpOworCisgIGV4Y2VwdAorICAgIG9uIEU6IEV4Y2VwdGlvbgorICAgIGRvIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBFLlRvU3RyaW5nICk7CisgIGVuZDsKK2VuZDsKKworCitlbmQuCisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvVmFncmFudGZpbGUgYi9jb250cmliL1ZhZ3JhbnRmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNTMzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1ZhZ3JhbnRmaWxlCkBAIC0wLDAgKzEsMTMzIEBACisjIC0qLSBtb2RlOiBydWJ5IC0qLQorIyB2aTogc2V0IGZ0PXJ1YnkgOgorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworJGJ1aWxkX2FuZF90ZXN0ID0gPDxTQ1JJUFQKK2VjaG8gIlByb3Zpc2lvbmluZyBzeXN0ZW0gdG8gY29tcGlsZSBhbmQgdGVzdCBBcGFjaGUgVGhyaWZ0LiIKKworIyBDcmVhdGUgc3dhcCBzcGFjZQorc3VkbyBmYWxsb2NhdGUgLWwgMkcgL3N3YXBmaWxlCitzdWRvIGNobW9kIDYwMCAvc3dhcGZpbGUKK3N1ZG8gbWtzd2FwIC9zd2FwZmlsZQorc3VkbyBzd2Fwb24gL3N3YXBmaWxlCitzdWRvIHN3YXBvbiAtcworCisjIFVwZGF0ZSB0aGUgc3lzdGVtCitzdWRvIERFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IHVwZGF0ZSAtcXEgLXkKK3N1ZG8gREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgdXBncmFkZSAtcXEgLXkKKworIyBJbnN0YWxsIERlcGVuZGVuY2llcworIyAtLS0KKyMgR2VuZXJhbCBkZXBlbmRlbmNpZXMKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBhdXRvbWFrZSBsaWJ0b29sIGZsZXggYmlzb24gcGtnLWNvbmZpZyBnKysgbGlic3NsLWRldiBtYWtlIGxpYnF0NC1kZXYgZ2l0IGRlYmhlbHBlcgorCisjIEMrKyBkZXBlbmRlbmNpZXMKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBsaWJib29zdC1kZXYgbGliYm9vc3QtdGVzdC1kZXYgbGliYm9vc3QtcHJvZ3JhbS1vcHRpb25zLWRldiBsaWJib29zdC1maWxlc3lzdGVtLWRldiBsaWJib29zdC1zeXN0ZW0tZGV2IGxpYmV2ZW50LWRldiAKKworIyBKYXZhIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGFudCBvcGVuamRrLTgtamRrIG1hdmVuCisKKyMgUHl0aG9uIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIHB5dGhvbi1hbGwgcHl0aG9uLWFsbC1kZXYgcHl0aG9uLWFsbC1kYmcgcHl0aG9uLXNldHVwdG9vbHMgcHl0aG9uLXN1cHBvcnQgcHl0aG9uLXNpeCBweXRob24zLXNpeAorCisjIFJ1YnkgZGVwZW5kZW5jaWVzCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgcnVieSBydWJ5LWRldgorc3VkbyBnZW0gaW5zdGFsbCBidW5kbGVyIHJha2UKKworIyBQZXJsIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGxpYmJpdC12ZWN0b3ItcGVybCBsaWJjbGFzcy1hY2Nlc3Nvci1jbGFzcy1wZXJsCisKKyMgUGhwIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIHBocDUgcGhwNS1kZXYgcGhwNS1jbGkgcGhwLXBlYXIgcmUyYworCisjIEdsaWJDIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGxpYmdsaWIyLjAtZGV2CisKKyMgRXJsYW5nIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGVybGFuZy1iYXNlIGVybGFuZy1ldW5pdCBlcmxhbmctZGV2IGVybGFuZy10b29scworCisjIEdPIGRlcGVuZGVuY2llcworZWNobyAiZ29sYW5nLWdvIGdvbGFuZy1nby9kYXNoYm9hcmQgYm9vbGVhbiBmYWxzZSIgfCBkZWJjb25mLXNldC1zZWxlY3Rpb25zCitzdWRvIGFwdC1nZXQgLXkgaW5zdGFsbCAtcXEgZ29sYW5nIGdvbGFuZy1nbworCisjIEhhc2tlbGwgZGVwZW5kZW5jaWVzCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgZ2hjIGNhYmFsLWluc3RhbGwgbGliZ2hjLWJpbmFyeS1kZXYgbGliZ2hjLW5ldHdvcmstZGV2IGxpYmdoYy1odHRwLWRldiBsaWJnaGMtaGFzaGFibGUtZGV2IGxpYmdoYy11bm9yZGVyZWQtY29udGFpbmVycy1kZXYgbGliZ2hjLXZlY3Rvci1kZXYKK3N1ZG8gY2FiYWwgdXBkYXRlCisKKyMgTHVhIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGx1YTUuMiBsdWE1LjItZGV2CisKKyMgTm9kZS5qcyBkZXBlbmRlbmNpZXMKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBub2RlanMgbm9kZWpzLWRldiBub2RlanMtbGVnYWN5IG5wbQorCisjIENTaGFycAorc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIG1vbm8tZ21jcyBtb25vLWRldmVsIG1vbm8teGJ1aWxkIG1vbm8tY29tcGxldGUgbGlibW9uby1zeXN0ZW0td2ViMi4wLWNpbAorc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIG1pbmd3MzIgbWluZ3czMi1iaW51dGlscyBtaW5ndzMyLXJ1bnRpbWUgbnNpcworCisjIEQgZGVwZW5kZW5jaWVzCitzdWRvIHdnZXQgaHR0cDovL21hc3Rlci5kbC5zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9kLWFwdC9maWxlcy9kLWFwdC5saXN0IC1PIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2QtYXB0Lmxpc3QKK3N1ZG8gYXB0LWdldCB1cGRhdGUgJiYgc3VkbyBhcHQtZ2V0IC15IC0tYWxsb3ctdW5hdXRoZW50aWNhdGVkIGluc3RhbGwgLS1yZWluc3RhbGwgZC1hcHQta2V5cmluZyAmJiBzdWRvIGFwdC1nZXQgdXBkYXRlCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgeGRnLXV0aWxzIGRtZC1iaW4KKworIyBDdXN0b21pemUgdGhlIHN5c3RlbQorIyAtLS0KKyMgRGVmYXVsdCBqYXZhIHRvIGxhdGVzdCAxLjggdmVyc2lvbgordXBkYXRlLWphdmEtYWx0ZXJuYXRpdmVzIC1zIGphdmEtMS44LjAtb3Blbmpkay1hbWQ2NCAKKworIyBQSFBVbml0IHBhY2thZ2UgYnJva2VuIGluIHVidW50dS4gc2VlIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL3BocHVuaXQvK2J1Zy83MDE1NDQKK3N1ZG8gYXB0LWdldCB1cGdyYWRlIHBlYXIKK3N1ZG8gcGVhciBjaGFubmVsLWRpc2NvdmVyIHBlYXIucGhwdW5pdC5kZQorc3VkbyBwZWFyIGNoYW5uZWwtZGlzY292ZXIgcGVhci5zeW1mb255LmNvbQorc3VkbyBwZWFyIGNoYW5uZWwtZGlzY292ZXIgY29tcG9uZW50cy5lei5ubworc3VkbyBwZWFyIHVwZGF0ZS1jaGFubmVscworc3VkbyBwZWFyIHVwZ3JhZGUtYWxsCitzdWRvIHBlYXIgaW5zdGFsbCAtLWFsbGRlcHMgcGhwdW5pdC9QSFBVbml0CisKK2RhdGUgPiAvZXRjL3ZhZ3JhbnQucHJvdmlzaW9uZWQKKworIyBTdGFydCB0aGUgc291cmNlIGJ1aWxkCisjIC0tLQorZWNobyAiU3RhcnRpbmcgQXBhY2hlIFRocmlmdCBidWlsZC4uLiIKK2NkIC90aHJpZnQKK3NoIGJvb3RzdHJhcC5zaAorc2ggY29uZmlndXJlCittYWtlCittYWtlIGNoZWNrCitlY2hvICJGaW5pc2hlZCBidWlsZGluZyBBcGFjaGUgVGhyaWZ0LiIKKworU0NSSVBUCisKK1ZhZ3JhbnQuY29uZmlndXJlKCIyIikgZG8gfGNvbmZpZ3wKKyAgIyBVYnVudHUgMTQuMDQgTFRTIChUcnVzdHkgVGFocikKKyAgY29uZmlnLnZtLmJveCA9ICJ0cnVzdHk2NCIKKyAgY29uZmlnLnZtLmJveF91cmwgPSAiaHR0cHM6Ly9jbG91ZC1pbWFnZXMudWJ1bnR1LmNvbS92YWdyYW50L3RydXN0eS9jdXJyZW50L3RydXN0eS1zZXJ2ZXItY2xvdWRpbWctYW1kNjQtdmFncmFudC1kaXNrMS5ib3giCisKKyAgY29uZmlnLnZtLnN5bmNlZF9mb2xkZXIgIi4uLyIsICIvdGhyaWZ0IgorCisgIGNvbmZpZy52bS5wcm92aWRlciA6dmlydHVhbGJveCBkbyB8dmJveHwKKyAgICB2Ym94LmN1c3RvbWl6ZSBbIm1vZGlmeXZtIiwgOmlkLCAiLS1tZW1vcnkiLCAiMTAyNCJdCisgICAgdmJveC5jdXN0b21pemUgWyJtb2RpZnl2bSIsIDppZCwgIi0tY3B1cyIsICIyIl0KKyAgICB2Ym94LmN1c3RvbWl6ZSBbIm1vZGlmeXZtIiwgOmlkLCAiLS1ydGN1c2V1dGMiLCAib24iXQorICBlbmQKKworICAjIFJ1biB0aGUgYnVpbGQgc2NyaXB0IHRvIGNvbmZpZ3VyZSB0aGUgc3lzdGVtCisgIGNvbmZpZy52bS5wcm92aXNpb24gOnNoZWxsLCA6aW5saW5lID0+ICRidWlsZF9hbmRfdGVzdAorZW5kCmRpZmYgLS1naXQgYS9jb250cmliL2FzeW5jLXRlc3QvdGVzdC1sZWFmLnB5IGIvY29udHJpYi9hc3luYy10ZXN0L3Rlc3QtbGVhZi5weQppbmRleCA4YjdjM2UzLi40ZWE0YTliIDEwMDc1NQotLS0gYS9jb250cmliL2FzeW5jLXRlc3QvdGVzdC1sZWFmLnB5CisrKyBiL2NvbnRyaWIvYXN5bmMtdGVzdC90ZXN0LWxlYWYucHkKQEAgLTcsMTYgKzcsMTcgQEAKIGZyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVEh0dHBTZXJ2ZXIKIGZyb20gYWdnciBpbXBvcnQgQWdncgogCisKIGNsYXNzIEFnZ3JIYW5kbGVyKEFnZ3IuSWZhY2UpOgotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgc2VsZi52YWx1ZXMgPSBbXQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi52YWx1ZXMgPSBbXQogCi0gIGRlZiBhZGRWYWx1ZShzZWxmLCB2YWx1ZSk6Ci0gICAgc2VsZi52YWx1ZXMuYXBwZW5kKHZhbHVlKQorICAgIGRlZiBhZGRWYWx1ZShzZWxmLCB2YWx1ZSk6CisgICAgICAgIHNlbGYudmFsdWVzLmFwcGVuZCh2YWx1ZSkKIAotICBkZWYgZ2V0VmFsdWVzKHNlbGYsICk6Ci0gICAgdGltZS5zbGVlcCgxKQotICAgIHJldHVybiBzZWxmLnZhbHVlcworICAgIGRlZiBnZXRWYWx1ZXMoc2VsZiwgKToKKyAgICAgICAgdGltZS5zbGVlcCgxKQorICAgICAgICByZXR1cm4gc2VsZi52YWx1ZXMKIAogcHJvY2Vzc29yID0gQWdnci5Qcm9jZXNzb3IoQWdnckhhbmRsZXIoKSkKIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQpkaWZmIC0tZ2l0IGEvY29udHJpYi9hc3luYy10ZXN0L3Rlc3Qtc2VydmVyLmNwcCBiL2NvbnRyaWIvYXN5bmMtdGVzdC90ZXN0LXNlcnZlci5jcHAKaW5kZXggYTU1YzM0OC4uYjMwNGUxYiAxMDA2NDQKLS0tIGEvY29udHJpYi9hc3luYy10ZXN0L3Rlc3Qtc2VydmVyLmNwcAorKysgYi9jb250cmliL2FzeW5jLXRlc3QvdGVzdC1zZXJ2ZXIuY3BwCkBAIC0xLDggKzEsOCBAQAogI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsPgotI2luY2x1ZGUgInByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIgotI2luY2x1ZGUgImFzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgiCi0jaW5jbHVkZSAiYXN5bmMvVEV2aHR0cFNlcnZlci5oIgotI2luY2x1ZGUgImFzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmgiCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmg+CiAjaW5jbHVkZSAiQWdnci5oIgogCiB1c2luZyBzdGQ6OnRyMTo6YmluZDsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvY3JlYXRlLWRlYmlhbi1wYWNrYWdlcy5zaCBiL2NvbnRyaWIvY3JlYXRlLWRlYmlhbi1wYWNrYWdlcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg5MDZmMS4uMDAwMDAwMAotLS0gYS9jb250cmliL2NyZWF0ZS1kZWJpYW4tcGFja2FnZXMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIS9iaW4vc2gKLXNldCAtZQotCi1sbiAtcyBjb250cmliL2RlYmlhbiBkZWJpYW4KLQotZHBrZy1idWlsZHBhY2thZ2UgLXJmYWtlcm9vdCAtdGMKLQotIyByZXN1bHRzCi1scyAuLi8qLmRlYiAuLi8qLmRzYyAuLi8qLnRhci5neiAuLi8qLmNoYW5nZXMKLQotIyBjbGVhbnVwCi1ybSBkZWJpYW4KLQpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vY2hhbmdlbG9nIGIvY29udHJpYi9kZWJpYW4vY2hhbmdlbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzc2ODVhLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvZGViaWFuL2NoYW5nZWxvZworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLXRocmlmdCAoMC43LjApIHN0YWJsZTsgdXJnZW5jeT1sb3cKLQotICAqIHVwZGF0ZSB0byAwLjcuMAotCi0gLS0gSmFrZSBGYXJyZWxsIDxqZmFycmVsbEBhcGFjaGUub3JnPiBUdWUsIDEwIEF1ZyAyMDExIDE3OjAxOjUzIC0wNTAwCi0KLXRocmlmdCAoMC43LjAtZGV2MSkgc3RhYmxlOyB1cmdlbmN5PWxvdwotICAqIGFkZGVkIGdsaWIKLSAgKiBmaXggbG9jYXRpb24gb2YgbGlidGhyaWZ0LmphcgotCi0gLS0gUm9nZXIgTWVpZXIgPHJvZ2VyQGFwYWNoZS5vcmc+ICBUdWUsIDEyIEFwciAyMDExIDIxOjQxOjE4ICswMjAwCi0KLXRocmlmdCAoMC42LjAtZGV2MSkgc3RhYmxlOyB1cmdlbmN5PWxvdwotCi0gICogdXBkYXRlIHZlcnNpb24gZmllbGQKLSAgKiBhZGRlZCBkZWJpYW4gZm9sZGVyIHRvIHRocmlmdC9jb250cmliCi0gICogY2hhbmdlZCBhIGZldyBkZXRhaWxzIGluIGNvbnRyb2wgZmlsZQotICAqIHVwZGF0ZSBjb3B5cmlnaHQgZmlsZQotCi0gLS0gUm9nZXIgTWVpZXIgPHJvZ2VyQGFwYWNoZS5vcmc+ICBUdWUsIDE0IERlYyAyMDEwIDEyOjEyOjMzIC0wODAwCi0KLXRocmlmdCAoMC41LjArbm11Mikgc3RhYmxlOyB1cmdlbmN5PWxvdwotCi0gICogTm9uLW1haW50YWluZXIgdXBsb2FkLgotICAqIE1lcmdlZCBUSFJJRlQtNzFfdjkucGF0Y2ggdG8gc2tpcCAuL2Jvb3RzdHJhcC5zaCBpZiBub3QgZXhpc3RzLgotICAgIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9zZWN1cmUvYXR0YWNobWVudC8xMjQ2NTM2MC9USFJJRlQtNzFfdjkucGF0Y2gKLQotIC0tIFlhbWFzaGl0YSBZdXUgPHlhbWFzaGl0YUBnZWlzaGF0b2t5by5jb20+ICBUdWUsIDA3IERlYyAyMDEwIDE1OjAwOjU1ICswOTAwCi0KLXRocmlmdCAoMC41LjArbm11MSkgc3RhYmxlOyB1cmdlbmN5PWxvdwotCi0gICogTm9uLW1haW50YWluZXIgdXBsb2FkLgotICAqIEltcG9ydGVkIHBhY2thZ2UgaW5mb3JtYXRpb24gZm9yIHBocDUtdGhyaWZ0IGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3NpbXBsZWdlby90aHJpZnQuCi0KLSAtLSBZYW1hc2hpdGEgWXV1IDx5YW1hc2hpdGFAZ2Vpc2hhdG9reW8uY29tPiAgVHVlLCAwNyBEZWMgMjAxMCAwMTowMDoxNyArMDkwMAotCi10aHJpZnQgKDAuNS4wKSBzdGFibGU7IHVyZ2VuY3k9bG93Ci0KLSAgKiB1cGRhdGUgdG8gMC41LjAKLQotIC0tIFJvZ2VyIE1laWVyIDxyb2dlckBhcGFjaGUub3JnPiAgRnJpLCAwOCBPY3QgMjAxMCAxMToyMzo1MyArMDIwMAotCi10aHJpZnQgKDAuNC4wKSBzdGFibGU7IHVyZ2VuY3k9bG93Ci0KLSAgKiB1cGRhdGUgdG8gMC40LjAKLQotIC0tIFJvZ2VyIE1laWVyIDxyb2dlckBidWZmZXJvdmVyZmxvdy5jaD4gIFN1biwgMjIgQXVnIDIwMTAgMjE6MjY6MDAgKzAxMDAKLQotdGhyaWZ0ICgwLjIwMDguMTIuMzB+OC4wNCkgaGFyZHk7IHVyZ2VuY3k9bG93Ci0KLSAgKiBJbml0aWFsIHJlbGVhc2UuCi0KLSAtLSBFc3RldmUgRmVybmFuZGV6IDxlc3RldmVAZmx1aWRpbmZvLmNvbT4gIFRodSwgMTUgSmFuIDIwMDkgMTE6MzQ6MjQgKzAxMDAKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZGViaWFuL2NvbXBhdCBiL2NvbnRyaWIvZGViaWFuL2NvbXBhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VkNmZmOC4uMDAwMDAwMAotLS0gYS9jb250cmliL2RlYmlhbi9jb21wYXQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi01CmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9jb250cm9sIGIvY29udHJpYi9kZWJpYW4vY29udHJvbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFhZmUzMy4uMDAwMDAwMAotLS0gYS9jb250cmliL2RlYmlhbi9jb250cm9sCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLVNvdXJjZTogdGhyaWZ0Ci1TZWN0aW9uOiBkZXZlbAotUHJpb3JpdHk6IGV4dHJhCi1CdWlsZC1EZXBlbmRzOiBkZWJoZWxwZXIgKD49IDUpLCBidWlsZC1lc3NlbnRpYWwsIG1vbm8tZ21jcywgcHl0aG9uLWRldiwgYW50LAotICAgIGxpYm1vbm8tZGV2LCBlcmxhbmctYmFzZSwgcnVieTEuOC1kZXYsIGF1dG9jb25mLCBweXRob24tc3VwcG9ydCwgYXV0b21ha2UsCi0gICAgcGtnLWNvbmZpZywgbGlidG9vbCwgYmlzb24sIGZsZXgsIGxpYmJvb3N0LWRldiB8IGxpYmJvb3N0MS40MC1kZXYsIHB5dGhvbi1hbGwsIHB5dGhvbi1hbGwtZGV2LAotICAgIHB5dGhvbi1hbGwtZGJnLCBydWJ5LCBvcGVuamRrLTYtamRrIHwgamF2YS1zZGssIGxpYmNvbW1vbnMtbGFuZy1qYXZhLAotICAgIGxpYmJvb3N0LXRlc3QtZGV2IHwgbGliYm9vc3QtdGVzdDEuNDAtZGV2LCBsaWJldmVudC1kZXYsIHBlcmwgKD49IDUuOC4wLTcpLAotICAgIHBocDUsIHBocDUtZGV2Ci1NYWludGFpbmVyOiBUaHJpZnQgRGV2ZWxvcGVyJ3MgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KLUhvbWVwYWdlOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvCi1WY3MtU3ZuOiBodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQKLVZjcy1Ccm93c2VyOiBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL3RocmlmdAotU3RhbmRhcmRzLVZlcnNpb246IDMuNy4yCi1YUy1QeXRob24tVmVyc2lvbjogPj0gMi40Ci0KLVBhY2thZ2U6IHRocmlmdC1jb21waWxlcgotQXJjaGl0ZWN0dXJlOiBhbnkKLURlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30KLURlc2NyaXB0aW9uOiBDb21waWxlciBmb3IgVGhyaWZ0IGRlZmluaXRpb24gZmlsZXMKLSBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCi0gZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KLSBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCi0gVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBUaHJpZnQgY29tcGlsZXIgdGhhdCBpcyB1c2VkIGZvciB0cmFuc2xhdGluZyBmcm9tCi0gLnRocmlmdCBmaWxlcyAoY29udGFpbmluZyB0aGUgZGVmaW5pdGlvbnMpIHRvIHRoZSBsYW5ndWFnZSBiaW5kaW5nIGZvciB0aGUKLSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLgotCi1QYWNrYWdlOiBweXRob24tdGhyaWZ0Ci1BcmNoaXRlY3R1cmU6IGFueQotU2VjdGlvbjogcHl0aG9uCi1EZXBlbmRzOiAke3B5dGhvbjpEZXBlbmRzfSwgJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfQotUmVjb21tZW5kczogcHl0aG9uLXR3aXN0ZWQtY29yZQotUHJvdmlkZXM6ICR7cHl0aG9uOlByb3ZpZGVzfQotRGVzY3JpcHRpb246IFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0Ci0gVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcwotIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCi0gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgotIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQuIFlvdSB3aWxsIG5lZWQgdGhlIHRocmlmdAotIHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyIGRlZmluaXRpb24gdG8gUHl0aG9uCi0gY2xhc3NlcywgYW5kIHRoZW4gdGhlIG1vZHVsZXMgaW4gdGhpcyBwYWNrYWdlIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB0aG9zZQotIGNsYXNzZXMgaW4geW91ciBwcm9ncmFtcy4KLQotUGFja2FnZTogcHl0aG9uLXRocmlmdC1kYmcKLUFyY2hpdGVjdHVyZTogYW55Ci1TZWN0aW9uOiBweXRob24KLURlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIHB5dGhvbi10aHJpZnQgKD0gJHtiaW5hcnk6VmVyc2lvbn0pLCBweXRob24tYWxsLWRiZwotUHJvdmlkZXM6ICR7cHl0aG9uOlByb3ZpZGVzfQotRGVzY3JpcHRpb246IFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0IChkZWJ1ZyB2ZXJzaW9uKQotIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKLSBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bwotIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KLSBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0IHdpdGggZGVidWdnaW5nIHN5bWJvbHMuCi0gWW91IHdpbGwgbmVlZCB0aGUgdGhyaWZ0IHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyCi0gZGVmaW5pdGlvbiB0byBQeXRob24gY2xhc3NlcywgYW5kIHRoZW4gdGhlIG1vZHVsZXMgaW4gdGhpcyBwYWNrYWdlIHdpbGwgYWxsb3cKLSB5b3UgdG8gdXNlIHRob3NlIGNsYXNzZXMgaW4geW91ciBwcm9ncmFtcy4KLQotUGFja2FnZTogbGlidGhyaWZ0LXJ1YnkKLUFyY2hpdGVjdHVyZTogYW55Ci1TZWN0aW9uOiBsaWJzCi1EZXBlbmRzOiAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9LCBydWJ5MS44ICg+PSAxLjgpLCBydWJ5MS44ICg8PCAxLjkpCi1EZXNjcmlwdGlvbjogUnVieSBiaW5kaW5ncyBmb3IgVGhyaWZ0Ci0gVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcwotIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCi0gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgotIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgUnVieSBiaW5kaW5ncyBmb3IgVGhyaWZ0LiBZb3Ugd2lsbCBuZWVkIHRoZSB0aHJpZnQKLSB0b29sIChpbiB0aGUgdGhyaWZ0LWNvbXBpbGVyIHBhY2thZ2UpIHRvIGNvbXBpbGUgeW91ciBkZWZpbml0aW9uIHRvIFJ1YnkKLSBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRob3NlCi0gY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgotCi1QYWNrYWdlOiBsaWJ0aHJpZnQtamF2YQotQXJjaGl0ZWN0dXJlOiBhbGwKLVNlY3Rpb246IGxpYnMKLURlcGVuZHM6IGphdmEtZ2NqLWNvbXBhdCB8IGphdmExLXJ1bnRpbWUgfCBqYXZhMi1ydW50aW1lLCAke21pc2M6RGVwZW5kc30KLVJlY29tbWVuZHM6IGxpYmNvbW1vbnMtbGFuZy1qYXZhCi1EZXNjcmlwdGlvbjogSmF2YSBiaW5kaW5ncyBmb3IgVGhyaWZ0Ci0gVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcwotIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCi0gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgotIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgSmF2YSBiaW5kaW5ncyBmb3IgVGhyaWZ0LiBZb3Ugd2lsbCBuZWVkIHRoZSB0aHJpZnQKLSB0b29sIChpbiB0aGUgdGhyaWZ0LWNvbXBpbGVyIHBhY2thZ2UpIHRvIGNvbXBpbGUgeW91ciBkZWZpbml0aW9uIHRvIEphdmEKLSBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRob3NlCi0gY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgotCi1QYWNrYWdlOiBsaWJ0aHJpZnQtY2lsCi1BcmNoaXRlY3R1cmU6IGFsbAotU2VjdGlvbjogbGlicwotRGVwZW5kczogY2xpLWNvbW1vbiwgbGlibW9uby1jb3JsaWIxLjAtY2lsICg+PSAxLjApLCBsaWJtb25vLXN5c3RlbTEuMC1jaWwgKD49IDEuMCksICR7bWlzYzpEZXBlbmRzfQotRGVzY3JpcHRpb246IENMSSBiaW5kaW5ncyBmb3IgVGhyaWZ0Ci0gVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcwotIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCi0gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgotIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgQ0xJIGJpbmRpbmdzIGZvciBUaHJpZnQuIFlvdSB3aWxsIG5lZWQgdGhlIHRocmlmdAotIHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyIGRlZmluaXRpb24gdG8gQyMKLSBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRob3NlCi0gY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgotCi1QYWNrYWdlOiBsaWJ0aHJpZnQtZXJsYW5nCi1BcmNoaXRlY3R1cmU6IGFsbAotU2VjdGlvbjogbGlicwotRGVwZW5kczogZXJsYW5nLW5veCwgJHttaXNjOkRlcGVuZHN9Ci1EZXNjcmlwdGlvbjogRXJsYW5nIGJpbmRpbmdzIGZvciBUaHJpZnQKLSBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCi0gZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KLSBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCi0gVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBFcmxhbmcgYmluZGluZ3MgZm9yIFRocmlmdC4gWW91IHdpbGwgbmVlZCB0aGUgdGhyaWZ0Ci0gdG9vbCAoaW4gdGhlIHRocmlmdC1jb21waWxlciBwYWNrYWdlKSB0byBjb21waWxlIHlvdXIgZGVmaW5pdGlvbiB0byBFcmxhbmcKLSBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRob3NlCi0gY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgotCi1QYWNrYWdlOiBsaWJ0aHJpZnQtcGVybAotQXJjaGl0ZWN0dXJlOiBhbGwKLVNlY3Rpb246IHBlcmwKLURlcGVuZHM6IHBlcmwgKD49IDUuOC4wLTcpLCAke21pc2M6RGVwZW5kc30KLURlc2NyaXB0aW9uOiBQZXJsIGJpbmRpbmdzIGZvciBUaHJpZnQKLSBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCi0gZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KLSBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCi0gVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBQZXJsIGJpbmRpbmdzIGZvciBUaHJpZnQuIFlvdSB3aWxsIG5lZWQgdGhlIHRocmlmdAotIHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyIGRlZmluaXRpb24gdG8gUGVybAotIGNsYXNzZXMsIGFuZCB0aGVuIHRoZSBtb2R1bGVzIGluIHRoaXMgcGFja2FnZSB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhvc2UKLSBjbGFzc2VzIGluIHlvdXIgcHJvZ3JhbXMuCi0KLVBhY2thZ2U6IGxpYnRocmlmdDAKLUFyY2hpdGVjdHVyZTogYW55Ci1EZXBlbmRzOiAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9Ci1EZXNjcmlwdGlvbjogVGhyaWZ0IEMrKyBsaWJyYXJ5Ci0gVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcwotIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCi0gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgotIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgcnVudGltZSBsaWJyYXJpZXMgbmVlZGVkIGZvciBDKysgYXBwbGljYXRpb25zLgotCi1QYWNrYWdlOiBsaWJ0aHJpZnQtZGV2Ci1BcmNoaXRlY3R1cmU6IGFueQotU2VjdGlvbjogbGliZGV2ZWwKLURlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIGxpYnRocmlmdDAsIGxpYmdsaWIyLjAtZGV2Ci1EZXNjcmlwdGlvbjogVGhyaWZ0IEMrKyBsaWJyYXJ5IChkZXZlbG9wbWVudCBoZWFkZXJzKQotIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKLSBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bwotIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KLSBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIGRldmVsb3BtZW50IGxpYnJhcmllcyByZXF1aXJlZCBmb3Igd3JpdGluZyBDKysKLSBhcHBsaWNhdGlvbnMuCi0KLVBhY2thZ2U6IHBocDUtdGhyaWZ0Ci1BcmNoaXRlY3R1cmU6IGFueQotU2VjdGlvbjogcGhwCi1EZXBlbmRzOiAke3BocDpEZXBlbmRzfSwgJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfQotUHJvdmlkZXM6ICR7cGhwOlByb3ZpZGVzfQotRGVzY3JpcHRpb246IFBIUCBiaW5kaW5ncyBmb3IgVGhyaWZ0Ci0gVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcwotIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCi0gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgotIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgUEhQIGJpbmRpbmdzIGZvciBUaHJpZnQuCmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9jb3B5cmlnaHQgYi9jb250cmliL2RlYmlhbi9jb3B5cmlnaHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NTQ2YjQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9kZWJpYW4vY29weXJpZ2h0CisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLVRoaXMgcGFja2FnZSB3YXMgZGViaWFuaXplZCBieSBUaHJpZnQgRGV2ZWxvcGVyJ3MgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4uCi0KLQotVGhpcyBwYWNrYWdlIGFuZCB0aGUgRGViaWFuIHBhY2thZ2luZyBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsCi1zZWUgYC91c3Ivc2hhcmUvY29tbW9uLWxpY2Vuc2VzL0FwYWNoZS0yLjAnLgotCi1UaGUgZm9sbG93aW5nIGluZm9ybWF0aW9ucyB3YXMgY29waWVkIGZyb20gQXBhY2hlIFRocmlmdCBMSUNFTlNFIGZpbGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TT0ZUV0FSRSBESVNUUklCVVRFRCBXSVRIIFRIUklGVDoKLQotVGhlIEFwYWNoZSBUaHJpZnQgc29mdHdhcmUgaW5jbHVkZXMgYSBudW1iZXIgb2Ygc3ViY29tcG9uZW50cyB3aXRoCi1zZXBhcmF0ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgbGljZW5zZSB0ZXJtcy4gWW91ciB1c2Ugb2YgdGhlIHNvdXJjZQotY29kZSBmb3IgdGhlIHRoZXNlIHN1YmNvbXBvbmVudHMgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kCi1jb25kaXRpb25zIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXMuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Qb3J0aW9ucyBvZiB0aGUgZm9sbG93aW5nIGZpbGVzIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2U6Ci0KLSAgbGliL2VybC9zcmMvTWFrZWZpbGUuYW0KLQotUGxlYXNlIHNlZSBkb2Mvb3RwLWJhc2UtbGljZW5zZS50eHQgZm9yIHRoZSBmdWxsIHRlcm1zIG9mIHRoaXMgbGljZW5zZS4KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGhlIGZvbGxvd2luZyBmaWxlcyBjb250YWluIHNvbWUgcG9ydGlvbnMgb2YgY29kZSBjb250cmlidXRlZCB1bmRlcgotdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlIChzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQpLCBhbmQgcmVsaWNlbnNlZAotdW5kZXIgdGhlIEFwYWNoZSAyLjAgTGljZW5zZToKLQotICBjb21waWxlci9jcHAvTWFrZWZpbGUuYW0KLSAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcHlfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MKLSAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL21haW4uY2MKLSAgY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2ZpZWxkLmgKLSAgY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Byb2dyYW0uaAotICBjb21waWxlci9jcHAvc3JjL3BsYXRmb3JtLmgKLSAgY29tcGlsZXIvY3BwL3NyYy90aHJpZnRsLmxsCi0gIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0eS55eQotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEZpZWxkLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RMaXN0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNYXAuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2UuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2VUeXBlLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbC5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xVdGlsLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RTZXQuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFN0cnVjdC5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UVHlwZS5jcwotICBsaWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlci5jcwotICBsaWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcwotICBsaWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3MKLSAgbGliL2NzaGFycC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RocmlmdC5jc3Byb2oKLSAgbGliL2NzaGFycC9zcmMvVGhyaWZ0LnNsbgotICBsaWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5jcwotICBsaWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCi0gIGxpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0QnVpbGQuY3MKLSAgbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRNU0J1aWxkVGFzay5jc3Byb2oKLSAgbGliL3JiL2xpYi90aHJpZnQucmIKLSAgbGliL3N0L1JFQURNRQotICBsaWIvc3QvdGhyaWZ0LnN0Ci0gIHRlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwCi0gIHRlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0Ci0gIHRlc3QvVGhyaWZ0VGVzdC50aHJpZnQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUZvciB0aGUgYWNsb2NhbC9heF9ib29zdF9iYXNlLm00IGFuZCBjb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNCBjb21wb25lbnRzOgotCi0jICAgQ29weXJpZ2h0IChjKSAyMDA3IFRob21hcyBQb3JzY2hiZXJnIDx0aG9tYXNAcmFuZHNwcmluZ2VyLmRlPgotIwotIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dAotIyAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZAotIyAgIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRm9yIHRoZSBjb21waWxlci9jcHAvc3JjL21kNS5bY2hdIGNvbXBvbmVudHM6Ci0KLS8qCi0gIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiBBbGFkZGluIEVudGVycHJpc2VzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgTC4gUGV0ZXIgRGV1dHNjaAotICBnaG9zdEBhbGFkZGluLmNvbQotCi0gKi8KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Gb3IgdGhlIGxpYi9yYi9zZXR1cC5yYjogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgTWluZXJvIEFva2ksCi1saWIvb2NhbWwvT0NhbWxNYWtlZmlsZSBhbmQgbGliL29jYW1sL1JFQURNRS1PQ2FtbE1ha2VmaWxlIGNvbXBvbmVudHM6Ci0gICAgIENvcHlyaWdodCAoQykgMTk5OSAtIDIwMDcgIE1hcmt1cyBNb3R0bAotCi1MaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAyLjEKLShzZWUgZG9jL2xncGwtMi4xLnR4dCBmb3IgdGhlIGZ1bGwgdGVybXMgb2YgdGhpcyBsaWNlbnNlKQpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vZGViaWFuIGIvY29udHJpYi9kZWJpYW4vZGViaWFuCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwYzJhMjVjLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvZGViaWFuL2RlYmlhbgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWNvbnRyaWIvZGViaWFuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vZG9jcyBiL2NvbnRyaWIvZGViaWFuL2RvY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYmQ4MjQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9kZWJpYW4vZG9jcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTkVXUwotUkVBRE1FCmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9saWJ0aHJpZnQwLmluc3RhbGwgYi9jb250cmliL2RlYmlhbi9saWJ0aHJpZnQwLmluc3RhbGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYWE4Y2QuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9kZWJpYW4vbGlidGhyaWZ0MC5pbnN0YWxsCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdXNyL2xpYi9saWJ0aHJpZnQqLnNvLioKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZGViaWFuL3J1bGVzIGIvY29udHJpYi9kZWJpYW4vcnVsZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFlZWYyNmUuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9kZWJpYW4vcnVsZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotIyEvdXNyL2Jpbi9tYWtlIC1mCi0jIC0qLSBtYWtlZmlsZSAtKi0KLSMgU2FtcGxlIGRlYmlhbi9ydWxlcyB0aGF0IHVzZXMgZGViaGVscGVyLgotIwotIyBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBKb2V5IEhlc3MgYW5kIENyYWlnIFNtYWxsLgotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGVuIHRoaXMgZmlsZSBpcyBjb3BpZWQgYnkgZGgtbWFrZSBpbnRvIGEKLSMgZGgtbWFrZSBvdXRwdXQgZmlsZSwgeW91IG1heSB1c2UgdGhhdCBvdXRwdXQgZmlsZSB3aXRob3V0IHJlc3RyaWN0aW9uLgotIyBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSBDcmFpZyBTbWFsbCBpbiB2ZXJzaW9uIDAuMzcgb2YgZGgtbWFrZS4KLSMKLSMgTW9kaWZpZWQgdG8gbWFrZSBhIHRlbXBsYXRlIGZpbGUgZm9yIGEgbXVsdGktYmluYXJ5IHBhY2thZ2Ugd2l0aCBzZXBhcmF0ZWQKLSMgYnVpbGQtYXJjaCBhbmQgYnVpbGQtaW5kZXAgdGFyZ2V0cyAgYnkgQmlsbCBBbGxvbWJlcnQgMjAwMQotCi0jIFVuY29tbWVudCB0aGlzIHRvIHR1cm4gb24gdmVyYm9zZSBtb2RlLgotI2V4cG9ydCBESF9WRVJCT1NFPTEKLQotIyBUaGlzIGhhcyB0byBiZSBleHBvcnRlZCB0byBtYWtlIHNvbWUgbWFnaWMgYmVsb3cgd29yay4KLWV4cG9ydCBESF9PUFRJT05TCi0KLVBZVkVSUyA6PSAkKHNoZWxsIHB5dmVyc2lvbnMgLXIpCi0KLWNvbmZpZ3VyZTogY29uZmlndXJlLXN0YW1wCi1jb25maWd1cmUtc3RhbXA6Ci0JZGhfdGVzdGRpcgotCSMgQWRkIGhlcmUgY29tbWFuZHMgdG8gY29uZmlndXJlIHRoZSBwYWNrYWdlLgotCWlmIFsgLWYgYm9vdHN0cmFwLnNoIF07IHRoZW4gJChDVVJESVIpL2Jvb3RzdHJhcC5zaDsgZmkKLQkkKENVUkRJUikvY29uZmlndXJlIC0tcHJlZml4PS91c3IgLS13aXRoLWNfZ2xpYgotCi0JdG91Y2ggY29uZmlndXJlLXN0YW1wCi0KLQotI0FyY2hpdGVjdHVyZQotYnVpbGQ6IGJ1aWxkLWFyY2ggYnVpbGQtaW5kZXAKLQkjIFRlc3RzIGRpc2FibGVkCi0JIyAkKE1BS0UpIC1DIHRlc3QgY2hlY2sKLQotYnVpbGQtYXJjaDogYnVpbGQtYXJjaC1zdGFtcAotYnVpbGQtYXJjaC1zdGFtcDogY29uZmlndXJlLXN0YW1wCi0KLQkjIENvbXBpbGUgY29tcGlsZXIKLQkkKE1BS0UpIC1DICQoQ1VSRElSKS9jb21waWxlci9jcHAKLQotCSMgQ29tcGlsZSBDKysgbGlicmFyeQotCSQoTUFLRSkgLUMgJChDVVJESVIpL2xpYi9jcHAKLQotCSMgQ29tcGlsZSBDIChnbGliKSBsaWJyYXJ5Ci0JJChNQUtFKSAtQyAkKENVUkRJUikvbGliL2NfZ2xpYgotCi0JIyBQeXRob24gbGlicmFyeQotCWNkICQoQ1VSRElSKS9saWIvcHkgJiYgXAotICAgIGZvciBweSBpbiAkKFBZVkVSUyk7IGRvICBcCi0gICAgICAgICQkcHkgc2V0dXAucHkgYnVpbGQ7IFwKLSAgICAgICAgJCRweS1kYmcgc2V0dXAucHkgYnVpbGQ7IFwKLSAgICBkb25lCi0KLQkjIFJ1YnkgbGlicmFyeQotCWNkICQoQ1VSRElSKS9saWIvcmIJJiYgXAotCQlydWJ5IHNldHVwLnJiIGNvbmZpZyAtLWluc3RhbGxkaXJzPXN0ZCAmJiBcCi0JCXJ1Ynkgc2V0dXAucmIgc2V0dXAKLQotCSMgUEhQCi0JY2QgJChDVVJESVIpL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wgJiYgXAotCQlwaHBpemUgJiYgXAotCQkuL2NvbmZpZ3VyZSAmJiBtYWtlCi0KLQl0b3VjaCAkQAotCi1idWlsZC1pbmRlcDogYnVpbGQtaW5kZXAtc3RhbXAKLWJ1aWxkLWluZGVwLXN0YW1wOiBjb25maWd1cmUtc3RhbXAKLQotCSMgQWRkIGhlcmUgY29tbWFuZHMgdG8gY29tcGlsZSB0aGUgaW5kZXAgcGFydCBvZiB0aGUgcGFja2FnZS4KLQkjJChNQUtFKSBkb2MKLQotCSMgSmF2YQotCWNkICQoQ1VSRElSKS9saWIvamF2YSAmJiBcCi0JCWFudAotCi0JIyBFcmxhbmcKLQkkKE1BS0UpIC1DICQoQ1VSRElSKS9saWIvZXJsCi0KLQkjIEMjCi0JJChNQUtFKSAtQyAkKENVUkRJUikvbGliL2NzaGFycAotCi0JIyBQZXJsCi0JJChNQUtFKSAtQyAkKENVUkRJUikvbGliL3BlcmwgSU5TVEFMTERJUlM9dmVuZG9yCi0KLQl0b3VjaCAkQAotCi1jbGVhbjoKLQlkaF90ZXN0ZGlyCi0JZGhfdGVzdHJvb3QKLQlybSAtZiBidWlsZC1hcmNoLXN0YW1wIGJ1aWxkLWluZGVwLXN0YW1wIGNvbmZpZ3VyZS1zdGFtcAotCi0JIyBBZGQgaGVyZSBjb21tYW5kcyB0byBjbGVhbiB1cCBhZnRlciB0aGUgYnVpbGQgcHJvY2Vzcy4KLQktJChNQUtFKSBjbGVhbgotCi0JZGhfY2xlYW4KLQotaW5zdGFsbDogaW5zdGFsbC1pbmRlcCBpbnN0YWxsLWFyY2gKLWluc3RhbGwtaW5kZXA6Ci0JZGhfdGVzdGRpcgotCWRoX3Rlc3Ryb290Ci0JZGhfY2xlYW4gLWsgLWkKLQlkaF9pbnN0YWxsZGlycyAtaQotCi0JIyBBZGQgaGVyZSBjb21tYW5kcyB0byBpbnN0YWxsIHRoZSBpbmRlcCBwYXJ0IG9mIHRoZSBwYWNrYWdlIGludG8KLQkjIGRlYmlhbi88cGFja2FnZT4tZG9jLgotCSNJTlNUQUxMRE9DIwotCi0gICAgIyBKYXZhCi0JbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtamF2YS91c3Ivc2hhcmUvamF2YS8gJiYgXAotCWNwICQoQ1VSRElSKS9saWIvamF2YS9idWlsZC9saWJ0aHJpZnQqLmphciBcCi0JCSQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LWphdmEvdXNyL3NoYXJlL2phdmEvCi0KLQkjIEVybGFuZwotCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LWVybGFuZy91c3IvbGliL2VybGFuZy9saWIvdGhyaWZ0LyAmJiBcCi0JY3AgLXIgJChDVVJESVIpL2xpYi9lcmwvZWJpbiBcCi0JCSQoQ1VSRElSKS9saWIvZXJsL2luY2x1ZGUgXAotCQkkKENVUkRJUikvbGliL2VybC9zcmMgXAotCQkkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1lcmxhbmcvdXNyL2xpYi9lcmxhbmcvbGliL3RocmlmdC8KLQotCSMgQyMKLQlta2RpciAtcCAkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1jaWwvdXNyL2xpYi9jbGkvdGhyaWZ0LyAmJiBcCi0JY3AgJChDVVJESVIpL2xpYi9jc2hhcnAvVGhyaWZ0LmRsbCBcCi0JCSQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LWNpbC91c3IvbGliL2NsaS90aHJpZnQvVGhyaWZ0LmRsbAotCi0JIyBQZXJsCi0JJChNQUtFKSAtQyAkKENVUkRJUikvbGliL3BlcmwgaW5zdGFsbCBERVNURElSPSQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LXBlcmwvdXNyCi0KLQlkaF9pbnN0YWxsIC1pCi0KLWluc3RhbGwtYXJjaDoKLQlkaF90ZXN0ZGlyCi0JZGhfdGVzdHJvb3QKLQlkaF9jbGVhbiAtayAtcwotCWRoX2luc3RhbGxkaXJzIC1zCi0KLQkjIEFkZCBoZXJlIGNvbW1hbmRzIHRvIGluc3RhbGwgdGhlIGFyY2ggcGFydCBvZiB0aGUgcGFja2FnZSBpbnRvCi0JIyBkZWJpYW4vdG1wLgotCSMkKE1BS0UpIERFU1RESVI9JChDVVJESVIpL2RlYmlhbi90aHJpZnQgaW5zdGFsbAotCi0JI2NvbXBpbGVyCi0JbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi90aHJpZnQtY29tcGlsZXIvdXNyL2JpbiAmJiBcCi0JY3AgJChDVVJESVIpL2NvbXBpbGVyL2NwcC90aHJpZnQgXAotCQkkKENVUkRJUikvZGViaWFuL3RocmlmdC1jb21waWxlci91c3IvYmluL3RocmlmdCAmJiBcCi0Jcm1kaXIgJChDVVJESVIpL2RlYmlhbi90aHJpZnQtY29tcGlsZXIvdXNyL3NiaW4KLQotCSNweXRob24KLQljZCAkKENVUkRJUikvbGliL3B5ICYmIFwKLQlmb3IgcHkgaW4gJChQWVZFUlMpOyBkbyBcCi0JCSQkcHkgc2V0dXAucHkgaW5zdGFsbCAtLW5vLWNvbXBpbGUgLS1yb290PSQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdDsgXAotCQkkJHB5LWRiZyBzZXR1cC5weSBpbnN0YWxsIC0tbm8tY29tcGlsZSAtLXJvb3Q9JChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZzsgXAotCWRvbmUKLQotCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAtbmFtZSAiKi5weWMiIC1wcmludDAgfCB4YXJncyAtMCBybSAtZgotCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAtbmFtZSAiKi5weSIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mCi0JZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQtZGJnIC1uYW1lICIqLmVnZy1pbmZvIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKLQlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdC1kYmcgLWRlcHRoIC10eXBlIGQgLWVtcHR5IC1leGVjIHJtZGlyIHt9IFw7Ci0KLQkjcnVieQotCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LXJ1YnkgJiYgXAotCWNkICQoQ1VSRElSKS9saWIvcmIgJiYgXAotCQlydWJ5IHNldHVwLnJiIGluc3RhbGwgLS1wcmVmaXg9JChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcnVieQotCi0JIyBQSFAKLQlta2RpciAtcCAkKENVUkRJUikvZGViaWFuL3BocDUtdGhyaWZ0Ci0JY2QgJChDVVJESVIpL2xpYi9waHAgJiYgXAotCQkkKE1BS0UpIERFU1RESVI9JChDVVJESVIpL2RlYmlhbi9waHA1LXRocmlmdCBpbnN0YWxsCi0KLQkjIEMrKyBhbmQgQyAoZ2xpYikKLQlta2RpciAtcCAkKENVUkRJUikvZGViaWFuL3RtcDsgXAotCWNkICQoQ1VSRElSKS9saWIvY3BwICYmIFwKLQkJbWFrZSBERVNURElSPSQoQ1VSRElSKS9kZWJpYW4vdG1wIGluc3RhbGwKLQljZCAkKENVUkRJUikvbGliL2NfZ2xpYiAmJiBcCi0JCW1ha2UgREVTVERJUj0kKENVUkRJUikvZGViaWFuL3RtcCBpbnN0YWxsCi0KLQlkaF9pbnN0YWxsIC0tc291cmNlZGlyPWRlYmlhbi90bXAgLXMKLQotCi0jIE11c3Qgbm90IGRlcGVuZCBvbiBhbnl0aGluZy4gVGhpcyBpcyB0byBiZSBjYWxsZWQgYnkKLSMgYmluYXJ5LWFyY2gvYmluYXJ5LWluZGVwCi0jIGluIGFub3RoZXIgJ21ha2UnIHRocmVhZC4KLWJpbmFyeS1jb21tb246Ci0JZGhfdGVzdGRpcgotCWRoX3Rlc3Ryb290Ci0JZGhfaW5zdGFsbGNoYW5nZWxvZ3MKLQlkaF9pbnN0YWxsZG9jcwotCWRoX2luc3RhbGxleGFtcGxlcwotCWRoX2luc3RhbGxtYW4KLQlkaF9saW5rCi0JZGhfc3RyaXAgLU5weXRob24tdGhyaWZ0LWRiZyAtTnRocmlmdC1jb21waWxlciAtTmxpYnRocmlmdDAgLU5saWJ0aHJpZnQtcnVieSAtLWRiZz1weXRob24tdGhyaWZ0LWRiZwotCWRoX3N0cmlwIC1OcHl0aG9uLXRocmlmdC1kYmcKLQlkaF9jb21wcmVzcwotCWRoX2ZpeHBlcm1zCi0JZGhfcHlzdXBwb3J0Ci0JZGhfbWFrZXNobGlicwotCWRoX2luc3RhbGxkZWIKLQlkaF9wZXJsCi0JZGhfc2hsaWJkZXBzCi0JZGhfZ2VuY29udHJvbAotCWRoX21kNXN1bXMKLQlkaF9idWlsZGRlYgotIyBCdWlsZCBhcmNoaXRlY3R1cmUgaW5kZXBlbmRhbnQgcGFja2FnZXMgdXNpbmcgdGhlIGNvbW1vbiB0YXJnZXQuCi1iaW5hcnktaW5kZXA6IGJ1aWxkLWluZGVwIGluc3RhbGwtaW5kZXAKLQkkKE1BS0UpIC1mIGRlYmlhbi9ydWxlcyBESF9PUFRJT05TPS1pIGJpbmFyeS1jb21tb24KLQotIyBCdWlsZCBhcmNoaXRlY3R1cmUgZGVwZW5kYW50IHBhY2thZ2VzIHVzaW5nIHRoZSBjb21tb24gdGFyZ2V0LgotYmluYXJ5LWFyY2g6IGJ1aWxkLWFyY2ggaW5zdGFsbC1hcmNoCi0JZWNobyAicGhwOkRlcGVuZHM9cGhwYXBpLSQocGhwLWNvbmZpZzUgLS1waHBhcGkpIiA+IGRlYmlhbi9zdWJzdHZhcnMKLQkkKE1BS0UpIC1mIGRlYmlhbi9ydWxlcyBESF9PUFRJT05TPS1zIGJpbmFyeS1jb21tb24KLQotYmluYXJ5OiBiaW5hcnktYXJjaCBiaW5hcnktaW5kZXAKLS5QSE9OWTogYnVpbGQgY2xlYW4gYmluYXJ5LWluZGVwIGJpbmFyeS1hcmNoIGJpbmFyeSBpbnN0YWxsIGluc3RhbGwtaW5kZXAgaW5zdGFsbC1hcmNoIGNvbmZpZ3VyZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vc3Vic3R2YXJzIGIvY29udHJpYi9kZWJpYW4vc3Vic3R2YXJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWRmNTcyLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvZGViaWFuL3N1YnN0dmFycworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXBocDpEZXBlbmRzPXBocGFwaS0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvTWFrZWZpbGUuYW0gYi9jb250cmliL2ZiMzAzL01ha2VmaWxlLmFtCmluZGV4IGRlN2ZiYjYuLmU3NzNlNTIgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvTWFrZWZpbGUuYW0KKysrIGIvY29udHJpYi9mYjMwMy9NYWtlZmlsZS5hbQpAQCAtMjEsMTEgKzIxLDI2IEBACiAKIEBQUk9EVUNUX01LQAogCi1TVUJESVJTID0gLiBjcHAgcHkKK1NVQkRJUlMgPSAuCisKK2lmIFdJVEhfQ1BQCitTVUJESVJTICs9IGNwcAorZW5kaWYKKworaWYgV0lUSF9KQVZBCitTVUJESVJTICs9IGphdmEKK2VuZGlmCisKK2lmIFdJVEhfUEhQCitTVUJESVJTICs9IHBocAorZW5kaWYKKworaWYgV0lUSF9QWVRIT04KK1NVQkRJUlMgKz0gcHkKK2VuZGlmCiAKIEJVSUxUX1NPVVJDRVMgPQogCi0KIGNsZWFuLWxvY2FsOiBjbGVhbi1jb21tb24KIAogQEdMT0JBTF9GT09URVJfTUtACmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL1JFQURNRSBiL2NvbnRyaWIvZmIzMDMvUkVBRE1FLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb250cmliL2ZiMzAzL1JFQURNRQpyZW5hbWUgdG8gY29udHJpYi9mYjMwMy9SRUFETUUubWQKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvVENsaWVudEluZm8uY3BwIGIvY29udHJpYi9mYjMwMy9UQ2xpZW50SW5mby5jcHAKaW5kZXggZTA3ZWFhOC4uMWZjNjYxMiAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9UQ2xpZW50SW5mby5jcHAKKysrIGIvY29udHJpYi9mYjMwMy9UQ2xpZW50SW5mby5jcHAKQEAgLTE3LDcgKzE3LDcgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxzZXJ2ZXIvVENsaWVudEluZm8uaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RDbGllbnRJbmZvLmg+CiAKIG5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7CiAKQEAgLTE1NCw5ICsxNTQsOCBAQAogICAgIH0KIAogICAgIHRpbWVzcGVjIHN0YXJ0OwotICAgIGRvdWJsZSBzZWNzID0gMC4wOwogICAgIGluZm8tPmdldFRpbWUoJnN0YXJ0KTsKLSAgICBzZWNzID0gKGRvdWJsZSkobm93LnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgKyAobm93LnR2X25zZWMgLSBzdGFydC50dl9uc2VjKSowLjAwMDAwMDAwMTsKKyAgICBkb3VibGUgc2VjcyA9IChkb3VibGUpKG5vdy50dl9zZWMgLSBzdGFydC50dl9zZWMpICsgKG5vdy50dl9uc2VjIC0gc3RhcnQudHZfbnNlYykqMC4wMDAwMDAwMDE7CiAKICAgICBjaGFyIGJ1ZlsyNTZdOwogICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIiVkICVzICVzICUuM2YgJWxsdSIsIGksIGFkZHJTdHIsIGNhbGxTdHIsIHNlY3MsCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL1RDbGllbnRJbmZvLmggYi9jb250cmliL2ZiMzAzL1RDbGllbnRJbmZvLmgKaW5kZXggOWIyZDI4NC4uNjY2OGMxOSAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9UQ2xpZW50SW5mby5oCisrKyBiL2NvbnRyaWIvZmIzMDMvVENsaWVudEluZm8uaApAQCAtMjIsOSArMjIsOSBAQAogCiAvLyBmb3IgaW5ldF9udG9wIC0tCiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0jaW5jbHVkZSA8c2VydmVyL1RTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNvY2tldC5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L011dGV4Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CiAKIG5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7CiAKQEAgLTE5Miw3ICsxOTIsNyBAQAogCiAgIC8qKgogICAgKiBSZXR1cm4gYXMgc3RyaW5nIHRoZSB0aHJpZnQgY2FsbCBlaXRoZXIgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCBvcgotICAgKiBtb3N0IHJlY2VudGx5IHByb2Nlc3NlZCBpZiB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCBvcGVuIGZvciBhZGRpdG9uYWwKKyAgICogbW9zdCByZWNlbnRseSBwcm9jZXNzZWQgaWYgdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgb3BlbiBmb3IgYWRkaXRpb25hbAogICAgKiBjYWxscy4gIFJldHVybnMgTlVMTCBpZiBhIGNhbGwgaGFzbid0IGJlZW4gbWFkZSB5ZXQgb3IgcHJvY2Vzc2luZwogICAgKiBoYXMgZW5kZWQuCiAgICAqLwpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5tNCBiL2NvbnRyaWIvZmIzMDMvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHhfMTEubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRjOTE4OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZmIzMDMvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHhfMTEubTQKQEAgLTAsMCArMSwxMzQgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY3h4X2NvbXBpbGVfc3RkY3h4XzExLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0NYWF9DT01QSUxFX1NURENYWF8xMShbZXh0fG5vZXh0XSxbbWFuZGF0b3J5fG9wdGlvbmFsXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBDaGVjayBmb3IgYmFzZWxpbmUgbGFuZ3VhZ2UgY292ZXJhZ2UgaW4gdGhlIGNvbXBpbGVyIGZvciB0aGUgQysrMTEKKyMgICBzdGFuZGFyZDsgaWYgbmVjZXNzYXJ5LCBhZGQgc3dpdGNoZXMgdG8gQ1hYRkxBR1MgdG8gZW5hYmxlIHN1cHBvcnQuCisjCisjICAgVGhlIGZpcnN0IGFyZ3VtZW50LCBpZiBzcGVjaWZpZWQsIGluZGljYXRlcyB3aGV0aGVyIHlvdSBpbnNpc3Qgb24gYW4KKyMgICBleHRlbmRlZCBtb2RlIChlLmcuIC1zdGQ9Z251KysxMSkgb3IgYSBzdHJpY3QgY29uZm9ybWFuY2UgbW9kZSAoZS5nLgorIyAgIC1zdGQ9YysrMTEpLiAgSWYgbmVpdGhlciBpcyBzcGVjaWZpZWQsIHlvdSBnZXQgd2hhdGV2ZXIgd29ya3MsIHdpdGgKKyMgICBwcmVmZXJlbmNlIGZvciBhbiBleHRlbmRlZCBtb2RlLgorIworIyAgIFRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHNwZWNpZmllZCAnbWFuZGF0b3J5JyBvciBpZiBsZWZ0IHVuc3BlY2lmaWVkLAorIyAgIGluZGljYXRlcyB0aGF0IGJhc2VsaW5lIEMrKzExIHN1cHBvcnQgaXMgcmVxdWlyZWQgYW5kIHRoYXQgdGhlIG1hY3JvCisjICAgc2hvdWxkIGVycm9yIG91dCBpZiBubyBtb2RlIHdpdGggdGhhdCBzdXBwb3J0IGlzIGZvdW5kLiAgSWYgc3BlY2lmaWVkCisjICAgJ29wdGlvbmFsJywgdGhlbiBjb25maWd1cmF0aW9uIHByb2NlZWRzIHJlZ2FyZGxlc3MsIGFmdGVyIGRlZmluaW5nCisjICAgSEFWRV9DWFgxMSBpZiBhbmQgb25seSBpZiBhIHN1cHBvcnRpbmcgbW9kZSBpcyBmb3VuZC4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAwOCBCZW5qYW1pbiBLb3NuaWsgPGJrb3pAcmVkaGF0LmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTIgWmFjayBXZWluYmVyZyA8emFja3dAcGFuaXguY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxMyBSb3kgU3RvZ25lciA8cm95c3RnbnJAaWNlcy51dGV4YXMuZWR1PgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorIyAgIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZQorIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKKyMgICB3YXJyYW50eS4KKworI3NlcmlhbCAzCisKK200X2RlZmluZShbX0FYX0NYWF9DT01QSUxFX1NURENYWF8xMV90ZXN0Ym9keV0sIFsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IGNoZWNrCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoaW50KSA8PSBzaXplb2YoVCksICJub3QgYmlnIGVub3VnaCIpOworICAgIH07CisKKyAgICB0eXBlZGVmIGNoZWNrPGNoZWNrPGJvb2w+PiByaWdodF9hbmdsZV9icmFja2V0czsKKworICAgIGludCBhOworICAgIGRlY2x0eXBlKGEpIGI7CisKKyAgICB0eXBlZGVmIGNoZWNrPGludD4gY2hlY2tfdHlwZTsKKyAgICBjaGVja190eXBlIGM7CisgICAgY2hlY2tfdHlwZSYmIGNyID0gc3RhdGljX2Nhc3Q8Y2hlY2tfdHlwZSYmPihjKTsKKworICAgIGF1dG8gZCA9IGE7CitdKQorCitBQ19ERUZVTihbQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExXSwgW2RubAorICBtNF9pZihbJDFdLCBbXSwgW10sCisgICAgICAgIFskMV0sIFtleHRdLCBbXSwKKyAgICAgICAgWyQxXSwgW25vZXh0XSwgW10sCisgICAgICAgIFttNF9mYXRhbChbaW52YWxpZCBhcmd1bWVudCBgJDEnIHRvIEFYX0NYWF9DT01QSUxFX1NURENYWF8xMV0pXSlkbmwKKyAgbTRfaWYoWyQyXSwgW10sIFtheF9jeHhfY29tcGlsZV9jeHgxMV9yZXF1aXJlZD10cnVlXSwKKyAgICAgICAgWyQyXSwgW21hbmRhdG9yeV0sIFtheF9jeHhfY29tcGlsZV9jeHgxMV9yZXF1aXJlZD10cnVlXSwKKyAgICAgICAgWyQyXSwgW29wdGlvbmFsXSwgW2F4X2N4eF9jb21waWxlX2N4eDExX3JlcXVpcmVkPWZhbHNlXSwKKyAgICAgICAgW200X2ZhdGFsKFtpbnZhbGlkIHNlY29uZCBhcmd1bWVudCBgJDInIHRvIEFYX0NYWF9DT01QSUxFX1NURENYWF8xMV0pXSlkbmwKKyAgQUNfTEFOR19QVVNIKFtDKytdKWRubAorICBhY19zdWNjZXNzPW5vCisgIEFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgJENYWCBzdXBwb3J0cyBDKysxMSBmZWF0dXJlcyBieSBkZWZhdWx0LAorICBheF9jdl9jeHhfY29tcGlsZV9jeHgxMSwKKyAgW0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbX0FYX0NYWF9DT01QSUxFX1NURENYWF8xMV90ZXN0Ym9keV0pXSwKKyAgICBbYXhfY3ZfY3h4X2NvbXBpbGVfY3h4MTE9eWVzXSwKKyAgICBbYXhfY3ZfY3h4X2NvbXBpbGVfY3h4MTE9bm9dKV0pCisgIGlmIHRlc3QgeCRheF9jdl9jeHhfY29tcGlsZV9jeHgxMSA9IHh5ZXM7IHRoZW4KKyAgICBhY19zdWNjZXNzPXllcworICBmaQorCisgIG00X2lmKFskMV0sIFtub2V4dF0sIFtdLCBbZG5sCisgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCisgICAgZm9yIHN3aXRjaCBpbiAtc3RkPWdudSsrMTE7IGRvCisgICAgICBjYWNoZXZhcj1BU19UUl9TSChbYXhfY3ZfY3h4X2NvbXBpbGVfY3h4MTFfJHN3aXRjaF0pCisgICAgICBBQ19DQUNIRV9DSEVDSyh3aGV0aGVyICRDWFggc3VwcG9ydHMgQysrMTEgZmVhdHVyZXMgd2l0aCAkc3dpdGNoLAorICAgICAgICAgICAgICAgICAgICAgJGNhY2hldmFyLAorICAgICAgICBbYWNfc2F2ZV9DWFhGTEFHUz0iJENYWEZMQUdTIgorICAgICAgICAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAkc3dpdGNoIgorICAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExX3Rlc3Rib2R5XSldLAorICAgICAgICAgIFtldmFsICRjYWNoZXZhcj15ZXNdLAorICAgICAgICAgIFtldmFsICRjYWNoZXZhcj1ub10pCisgICAgICAgICBDWFhGTEFHUz0iJGFjX3NhdmVfQ1hYRkxBR1MiXSkKKyAgICAgIGlmIGV2YWwgdGVzdCB4XCQkY2FjaGV2YXIgPSB4eWVzOyB0aGVuCisgICAgICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgJHN3aXRjaCIKKyAgICAgICAgYWNfc3VjY2Vzcz15ZXMKKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICBmaV0pCisKKyAgbTRfaWYoWyQxXSwgW2V4dF0sIFtdLCBbZG5sCisgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCisgICAgZm9yIHN3aXRjaCBpbiAtc3RkPWMrKzExOyBkbworICAgICAgY2FjaGV2YXI9QVNfVFJfU0goW2F4X2N2X2N4eF9jb21waWxlX2N4eDExXyRzd2l0Y2hdKQorICAgICAgQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciAkQ1hYIHN1cHBvcnRzIEMrKzExIGZlYXR1cmVzIHdpdGggJHN3aXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICRjYWNoZXZhciwKKyAgICAgICAgW2FjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKKyAgICAgICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgJHN3aXRjaCIKKyAgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbX0FYX0NYWF9DT01QSUxFX1NURENYWF8xMV90ZXN0Ym9keV0pXSwKKyAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9eWVzXSwKKyAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9bm9dKQorICAgICAgICAgQ1hYRkxBR1M9IiRhY19zYXZlX0NYWEZMQUdTIl0pCisgICAgICBpZiBldmFsIHRlc3QgeFwkJGNhY2hldmFyID0geHllczsgdGhlbgorICAgICAgICBDWFhGTEFHUz0iJENYWEZMQUdTICRzd2l0Y2giCisgICAgICAgIGFjX3N1Y2Nlc3M9eWVzCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmldKQorICBBQ19MQU5HX1BPUChbQysrXSkKKyAgaWYgdGVzdCB4JGF4X2N4eF9jb21waWxlX2N4eDExX3JlcXVpcmVkID0geHRydWU7IHRoZW4KKyAgICBpZiB0ZXN0IHgkYWNfc3VjY2VzcyA9IHhubzsgdGhlbgorICAgICAgQUNfTVNHX0VSUk9SKFsqKiogQSBjb21waWxlciB3aXRoIHN1cHBvcnQgZm9yIEMrKzExIGxhbmd1YWdlIGZlYXR1cmVzIGlzIHJlcXVpcmVkLl0pCisgICAgZmkKKyAgZWxzZQorICAgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCisgICAgICBIQVZFX0NYWDExPTAKKyAgICAgIEFDX01TR19OT1RJQ0UoW05vIGNvbXBpbGVyIHdpdGggQysrMTEgc3VwcG9ydCB3YXMgZm91bmRdKQorICAgIGVsc2UKKyAgICAgIEhBVkVfQ1hYMTE9MQorICAgICAgQUNfREVGSU5FKEhBVkVfQ1hYMTEsMSwKKyAgICAgICAgICAgICAgICBbZGVmaW5lIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyBiYXNpYyBDKysxMSBzeW50YXhdKQorICAgIGZpCisKKyAgICBBQ19TVUJTVChIQVZFX0NYWDExKQorICBmaQorXSkKKwpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9hY2xvY2FsL2F4X2phdmFjX2FuZF9qYXZhLm00IGIvY29udHJpYi9mYjMwMy9hY2xvY2FsL2F4X2phdmFjX2FuZF9qYXZhLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MWI0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfamF2YWNfYW5kX2phdmEubTQKQEAgLTAsMCArMSwxMjEgQEAKK2RubCBAc3lub3BzaXMgQVhfSkFWQUNfQU5EX0pBVkEKK2RubCBAc3lub3BzaXMgQVhfQ0hFQ0tfSkFWQV9DTEFTUyhDTEFTU05BTUUpCitkbmwKK2RubCBUZXN0IGZvciB0aGUgcHJlc2VuY2Ugb2YgYSBKREssIGFuZCAob3B0aW9uYWxseSkgc3BlY2lmaWMgY2xhc3Nlcy4KK2RubAorZG5sIElmICJKQVZBIiBpcyBkZWZpbmVkIGluIHRoZSBlbnZpcm9ubWVudCwgdGhhdCB3aWxsIGJlIHRoZSBvbmx5CitkbmwgamF2YSBjb21tYW5kIHRlc3RlZC4gIE90aGVyd2lzZSwgYSBoYXJkLWNvZGVkIGxpc3Qgd2lsbCBiZSB1c2VkLgorZG5sIFNpbWlsYXJseSBmb3IgIkpBVkFDIi4KK2RubAorZG5sIEFYX0pBVkFDX0FORF9KQVZBIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IHRlc3RpbmcgZm9yIGEgcGFydGljdWxhcgorZG5sIEphdmEgdmVyc2lvbiwgdGVzdGluZyBmb3Igb25seSBvbmUgb2YgImphdmEiIGFuZCAiamF2YWMiLCBvcgorZG5sIGNvbXBpbGluZyBvciBydW5uaW5nIHVzZXItcHJvdmlkZWQgSmF2YSBjb2RlLgorZG5sCitkbmwgQWZ0ZXIgQVhfSkFWQUNfQU5EX0pBVkEgcnVucywgdGhlIHNoZWxsIHZhcmlhYmxlcyAic3VjY2VzcyIgYW5kCitkbmwgImF4X2phdmFjX2FuZF9qYXZhIiBhcmUgc2V0IHRvICJ5ZXMiIG9yICJubyIsIGFuZCAiSkFWQUMiIGFuZAorZG5sICJKQVZBIiBhcmUgc2V0IHRvIHRoZSBhcHByb3ByaWF0ZSBjb21tYW5kcy4KK2RubAorZG5sIEFYX0NIRUNLX0pBVkFfQ0xBU1MgbXVzdCBiZSBydW4gYWZ0ZXIgQVhfSkFWQUNfQU5EX0pBVkEuCitkbmwgSXQgdGVzdHMgZm9yIHRoZSBwcmVzZW5jZSBvZiBhIGNsYXNzIGJhc2VkIG9uIGEgZnVsbHktcXVhbGlmaWVkIG5hbWUuCitkbmwgSXQgc2V0cyB0aGUgc2hlbGwgdmFyaWFibGUgInN1Y2Nlc3MiIHRvICJ5ZXMiIG9yICJubyIuCitkbmwKK2RubCBAY2F0ZWdvcnkgSmF2YQorZG5sIEB2ZXJzaW9uIDIwMDktMDItMDkKK2RubCBAbGljZW5zZSBBbGxQZXJtaXNzaXZlCitkbmwKK2RubCBDb3B5cmlnaHQgKEMpIDIwMDkgRGF2aWQgUmVpc3MKK2RubCBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorZG5sIGFyZSBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodAorZG5sIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4KKworCitBQ19ERUZVTihbQVhfSkFWQUNfQU5EX0pBVkFdLAorICAgICAgICAgWworCisgICAgICAgICAgZG5sIEhhcmQtY29kZWQgZGVmYXVsdCBjb21tYW5kcyB0byB0ZXN0LgorICAgICAgICAgIEpBVkFDX1BST0dTPSJqYXZhYyxqaWtlcyxnY2ogLUMiCisgICAgICAgICAgSkFWQV9QUk9HUz0iamF2YSxrYWZmZSIKKworICAgICAgICAgIGRubCBBbGxvdyB0aGUgdXNlciB0byBzcGVjaWZ5IGFuIGFsdGVybmF0aXZlLgorICAgICAgICAgIGlmIHRlc3QgLW4gIiRKQVZBQyIgOyB0aGVuCisgICAgICAgICAgICBKQVZBQ19QUk9HUz0iJEpBVkFDIgorICAgICAgICAgIGZpCisgICAgICAgICAgaWYgdGVzdCAtbiAiJEpBVkEiIDsgdGhlbgorICAgICAgICAgICAgSkFWQV9QUk9HUz0iJEpBVkEiCisgICAgICAgICAgZmkKKworICAgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgamF2YWMgYW5kIGphdmEpCisKKyAgICAgICAgICBlY2hvICJwdWJsaWMgY2xhc3MgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YSB7IHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzQDw6QEA6PkApIHsgfSB9IiA+IGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuamF2YQorICAgICAgICAgIHN1Y2Nlc3M9bm8KKyAgICAgICAgICBvSUZTPSIkSUZTIgorCisgICAgICAgICAgSUZTPSIsIgorICAgICAgICAgIGZvciBKQVZBQyBpbiAkSkFWQUNfUFJPR1MgOyBkbworICAgICAgICAgICAgSUZTPSIkb0lGUyIKKworICAgICAgICAgICAgZWNobyAiUnVubmluZyBcIiRKQVZBQyBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhLmphdmFcIiIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgICAgICAgaWYgJEpBVkFDIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuamF2YSA+JkFTX01FU1NBR0VfTE9HX0ZEIDI+JjEgOyB0aGVuCisKKyAgICAgICAgICAgICAgSUZTPSIsIgorICAgICAgICAgICAgICBmb3IgSkFWQSBpbiAkSkFWQV9QUk9HUyA7IGRvCisgICAgICAgICAgICAgICAgSUZTPSIkb0lGUyIKKworICAgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgXCIkSkFWQSBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICAgICAgICAgICBpZiAkSkFWQSBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhID4mQVNfTUVTU0FHRV9MT0dfRkQgMj4mMSA7IHRoZW4KKyAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M9eWVzCisgICAgICAgICAgICAgICAgICBicmVhayAyCisgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICBkb25lCisKKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICBkb25lCisKKyAgICAgICAgICBybSAtZiBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhLmphdmEgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YS5jbGFzcworCisgICAgICAgICAgaWYgdGVzdCAiJHN1Y2Nlc3MiICE9ICJ5ZXMiIDsgdGhlbgorICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgICAgICAgIEpBVkFDPSIiCisgICAgICAgICAgICBKQVZBPSIiCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgICAgICAgZmkKKworICAgICAgICAgIGF4X2phdmFjX2FuZF9qYXZhPSIkc3VjY2VzcyIKKworICAgICAgICAgIF0pCisKKworQUNfREVGVU4oW0FYX0NIRUNLX0pBVkFfQ0xBU1NdLAorICAgICAgICAgWworICAgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgSmF2YSBjbGFzcyBbJDFdKQorCisgICAgICAgICAgZWNobyAiaW1wb3J0ICQxOyBwdWJsaWMgY2xhc3MgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YSB7IHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzQDw6QEA6PkApIHsgfSB9IiA+IGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuamF2YQorCisgICAgICAgICAgZWNobyAiUnVubmluZyBcIiRKQVZBQyBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhLmphdmFcIiIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgICAgIGlmICRKQVZBQyBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhLmphdmEgPiZBU19NRVNTQUdFX0xPR19GRCAyPiYxIDsgdGhlbgorICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgICAgICAgICBzdWNjZXNzPXllcworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEFDX01TR19SRVNVTFQobm8pCisgICAgICAgICAgICBzdWNjZXNzPW5vCisgICAgICAgICAgZmkKKworICAgICAgICAgIHJtIC1mIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuamF2YSBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhLmNsYXNzCisgICAgICAgICAgXSkKKworCitBQ19ERUZVTihbQVhfQ0hFQ0tfQU5UX1ZFUlNJT05dLAorICAgICAgICAgWworICAgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgYW50IHZlcnNpb24gPiAkMikKKyAgICAgICAgICBBTlRfVkFMSUQ9YGV4cHIgJCgkMSAtdmVyc2lvbiAyPi9kZXYvbnVsbCB8IHNlZCAtbiAncy8uKnZlcnNpb24gXChAPDpAMC05XC5AOj5AKlwpLiovXDEvcCcpIFw+PSAkMmAKKyAgICAgICAgICBpZiB0ZXN0ICJ4JEFOVF9WQUxJRCIgPSAieDEiIDsgdGhlbgorICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgICAgICAgIEFOVD0iIgorICAgICAgICAgIGZpCisgICAgICAgICAgXSkKKwpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9hY2xvY2FsL2F4X3RocmlmdF9pbnRlcm5hbC5tNCBiL2NvbnRyaWIvZmIzMDMvYWNsb2NhbC9heF90aHJpZnRfaW50ZXJuYWwubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwZTNjYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZmIzMDMvYWNsb2NhbC9heF90aHJpZnRfaW50ZXJuYWwubTQKQEAgLTAsMCArMSwyOCBAQAorZG5sIEBzeW5vcHNpcyBBWF9USFJJRlRfR0VOKFNIT1JUX0xBTkdVQUdFLCBMT05HX0xBTkdVQUdFLCBERUZBVUxUKQorZG5sIEBzeW5vcHNpcyBBWF9USFJJRlRfTElCKFNIT1JUX0xBTkdVQUdFLCBMT05HX0xBTkdVQUdFLCBERUZBVUxUKQorZG5sCitkbmwgQWxsb3cgYSBwYXJ0aWN1bGFyIGxhbmd1YWdlIGdlbmVyYXRvciB0byBiZSBkaXNhYmxlZC4KK2RubCBBbGxvdyBhIHBhcnRpY3VsYXIgbGFuZ3VhZ2UgbGlicmFyeSB0byBiZSBkaXNhYmxlZC4KK2RubAorZG5sIFRoZXNlIG1hY3JvcyBoYXZlIHBvb3IgZXJyb3IgaGFuZGxpbmcgYW5kIGFyZSBwb29ybHkgZG9jdW1lbnRlZC4KK2RubCBUaGV5IGFyZSBpbnRlbmRlZCBvbmx5IGZvciBpbnRlcm5hbCB1c2UgYnkgdGhlIFRocmlmdCBjb21waWxlci4KK2RubAorZG5sIEB2ZXJzaW9uIDIwMDgtMDItMjAKK2RubCBAbGljZW5zZSBBbGxQZXJtaXNzaXZlCitkbmwKK2RubCBDb3B5cmlnaHQgKEMpIDIwMDkgRGF2aWQgUmVpc3MKK2RubCBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorZG5sIGFyZSBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodAorZG5sIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4KKworQUNfREVGVU4oW0FYX1RIUklGVF9MSUJdLAorICAgICAgICAgWworICAgICAgICAgIEFDX0FSR19XSVRIKCQxLAorICAgICAgICAgICAgICAgICAgICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtJDFdLCBbYnVpbGQgdGhlICQyIGxpYnJhcnkgQDw6QGRlZmF1bHQ9JDNAOj5AXSksCisgICAgICAgICAgICAgICAgICAgICAgW3dpdGhfJDE9IiR3aXRodmFsIl0sCisgICAgICAgICAgICAgICAgICAgICAgW3dpdGhfJDE9JDNdCisgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgIGhhdmVfJDE9bm8KKyAgICAgICAgICBkbmwgV2hhdCB3ZSBkbyBoZXJlIGlzIGdvaW5nIHRvIHZhcnkgZnJvbSBsaWJyYXJ5IHRvIGxpYnJhcnksCisgICAgICAgICAgZG5sIHNvIHdlIGNhbid0IHJlYWxseSBnZW5lcmFsaXplICh5ZXQhKS4KKyAgICAgICAgIF0pCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL2NvbmZpZ3VyZS5hYyBiL2NvbnRyaWIvZmIzMDMvY29uZmlndXJlLmFjCmluZGV4IDY3Y2MxMTAuLjczYjM1YmEgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvY29uZmlndXJlLmFjCisrKyBiL2NvbnRyaWIvZmIzMDMvY29uZmlndXJlLmFjCkBAIC03MSwxMyArNzEsNTcgQEAKICMgRXhhbXBsZTogc2V0cyAkKHRocmlmdF9ob21lKSB2YXJpYWJsZSB3aXRoIGRlZmF1bHQgcGF0aCBzZXQgdG8gL3Vzci9sb2NhbC4KIEZCX1dJVEhfUEFUSChbdGhyaWZ0X2hvbWVdLCBbdGhyaWZ0cGF0aF0sIFsvdXNyL2xvY2FsXSkKIAotIyBSZXF1aXJlIGJvb3N0IDEuMzMuMSBvciBsYXRlcgotQVhfQk9PU1RfQkFTRShbMS4zMy4xXSkKK0FYX0NYWF9DT01QSUxFX1NURENYWF8xMShbbm9leHRdKQorQVhfVEhSSUZUX0xJQihjcHAsIFtDKytdLCB5ZXMpCitoYXZlX2NwcD1ubworaWYgdGVzdCAiJHdpdGhfY3BwIiA9ICJ5ZXMiOyB0aGVuCisgICMgUmVxdWlyZSBib29zdCAxLjQwLjAgb3IgbGF0ZXIKKyAgQVhfQk9PU1RfQkFTRShbMS40MC4wXSkKKyAgaWYgdGVzdCAieCRzdWNjZWVkZWQiID0gInh5ZXMiOyB0aGVuCisgICAgaGF2ZV9jcHA9InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChbV0lUSF9DUFBdLCBbdGVzdCAiJGhhdmVfY3BwIiA9ICJ5ZXMiXSkKKworQVhfVEhSSUZUX0xJQihqYXZhLCBbSmF2YV0sIHllcykKK2lmIHRlc3QgIiR3aXRoX2phdmEiID0gInllcyI7IHRoZW4KKyAgQVhfSkFWQUNfQU5EX0pBVkEKKyAgQUNfUEFUSF9QUk9HKFtBTlRdLCBbYW50XSkKKyAgQVhfQ0hFQ0tfQU5UX1ZFUlNJT04oJEFOVCwgMS43KQorICBBQ19TVUJTVChDTEFTU1BBVEgpCisgIEFDX1NVQlNUKEFOVF9GTEFHUykKKyAgaWYgdGVzdCAieCRKQVZBQyIgIT0gIngiICYmIHRlc3QgIngkSkFWQUMiICE9ICJ4IiAmJiB0ZXN0ICJ4JEFOVCIgIT0gIngiIDsgdGhlbgorICAgIGhhdmVfamF2YT0ieWVzIgorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfSkFWQSwgW3Rlc3QgIiRoYXZlX2phdmEiID0gInllcyJdKQorCitBWF9USFJJRlRfTElCKHBocCwgW1BIUF0sIHllcykKK2lmIHRlc3QgIiR3aXRoX3BocCIgPSAieWVzIjsgdGhlbgorICBBQ19QQVRIX1BST0coW1BIUF0sIFtwaHBdKQorICBpZiB0ZXN0ICJ4JFBIUCIgIT0gIngiICYmIHRlc3QgIngkUEhQIiAhPSAieDoiIDsgdGhlbgorICAgIGhhdmVfcGhwPSJ5ZXMiCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9QSFAsIFt0ZXN0ICIkaGF2ZV9waHAiID0gInllcyJdKQorCitBWF9USFJJRlRfTElCKHB5dGhvbiwgW1B5dGhvbl0sIHllcykKK2lmIHRlc3QgIiR3aXRoX3B5dGhvbiIgPSAieWVzIjsgdGhlbgorICBBTV9QQVRIX1BZVEhPTigyLjQsLCA6KQorICBpZiB0ZXN0ICJ4JFBZVEhPTiIgIT0gIngiICYmIHRlc3QgIngkUFlUSE9OIiAhPSAieDoiIDsgdGhlbgorICAgIGhhdmVfcHl0aG9uPSJ5ZXMiCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9QWVRIT04sIFt0ZXN0ICIkaGF2ZV9weXRob24iID0gInllcyJdKQogCiAjIEdlbmVyYXRlcyBNYWtlZmlsZSBmcm9tIE1ha2VmaWxlLmFtLiBNb2RpZnkgd2hlbiBuZXcgc3ViZGlycyBhcmUgYWRkZWQuCiAjIENoYW5nZSBNYWtlZmlsZS5hbSBhbHNvIHRvIGFkZCBzdWJkaXJlY3RseS4KIEFDX0NPTkZJR19GSUxFUyhNYWtlZmlsZSBjcHAvTWFrZWZpbGUgcHkvTWFrZWZpbGUpCiAKKyMgQ2hlY2sgZm9yIGhlYWRlcnMKK0FDX0NIRUNLX0hFQURFUlMoW2ludHR5cGVzLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbbmV0aW5ldC9pbi5oXSkKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBETyBOT1QgVE9VQ0guCiAKQEAgLTg4LDYgKzEzMiwxMSBAQAogIyMjIyMjIyMjIEZJTklTSCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogZWNobyAiRVhURVJOQUxfUEFUSCAkRVhURVJOQUxfUEFUSCIKK2VjaG8KK2VjaG8gIkJ1aWxkaW5nIEMrKyBMaWJyYXJ5IC4uLi4uLi4uLiA6ICRoYXZlX2NwcCIKK2VjaG8gIkJ1aWxkaW5nIEphdmEgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX2phdmEiCitlY2hvICJCdWlsZGluZyBQeXRob24gTGlicmFyeSAuLi4uLi4gOiAkaGF2ZV9weXRob24iCitlY2hvICJCdWlsZGluZyBQSFAgTGlicmFyeSAuLi4uLi4uLi4gOiAkaGF2ZV9waHAiCiAKIAogIwpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9jcHAvRmFjZWJvb2tCYXNlLmNwcCBiL2NvbnRyaWIvZmIzMDMvY3BwL0ZhY2Vib29rQmFzZS5jcHAKaW5kZXggODAwMzM0MC4uM2M1Njk3NSAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9jcHAvRmFjZWJvb2tCYXNlLmNwcAorKysgYi9jb250cmliL2ZiMzAzL2NwcC9GYWNlYm9va0Jhc2UuY3BwCkBAIC05OCw3ICs5OCw3IEBACiAgIC8vIHdhbnQgb3VyIHJlYWQvd3JpdGUgc3RydWN0dXJlIHRvIGdvIG92ZXIgdGhlIHdpcmUKICAgY291bnRlcnNfLmFjcXVpcmVSZWFkKCk7CiAgIGZvcihSZWFkV3JpdGVDb3VudGVyTWFwOjppdGVyYXRvciBpdCA9IGNvdW50ZXJzXy5iZWdpbigpOwotICAgICAgaXQgIT0gY291bnRlcnNfLmVuZCgpOyBpdCsrKQorICAgICAgaXQgIT0gY291bnRlcnNfLmVuZCgpOyArK2l0KQogICB7CiAgICAgX3JldHVybltpdC0+Zmlyc3RdID0gaXQtPnNlY29uZC52YWx1ZTsKICAgfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9jcHAvRmFjZWJvb2tCYXNlLmggYi9jb250cmliL2ZiMzAzL2NwcC9GYWNlYm9va0Jhc2UuaAppbmRleCBmZDE2OWU2Li5kYWE1MjQ2IDEwMDY0NAotLS0gYS9jb250cmliL2ZiMzAzL2NwcC9GYWNlYm9va0Jhc2UuaAorKysgYi9jb250cmliL2ZiMzAzL2NwcC9GYWNlYm9va0Jhc2UuaApAQCAtMjIsOCArMjIsOSBAQAogCiAjaW5jbHVkZSAiRmFjZWJvb2tTZXJ2aWNlLmgiCiAKLSNpbmNsdWRlICJzZXJ2ZXIvVFNlcnZlci5oIgotI2luY2x1ZGUgImNvbmN1cnJlbmN5L011dGV4LmgiCisjaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CiAKICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8c3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9jcHAvU2VydmljZVRyYWNrZXIuY3BwIGIvY29udHJpYi9mYjMwMy9jcHAvU2VydmljZVRyYWNrZXIuY3BwCmluZGV4IGMyMGEwNjguLjdhNjFiMjEgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvY3BwL1NlcnZpY2VUcmFja2VyLmNwcAorKysgYi9jb250cmliL2ZiMzAzL2NwcC9TZXJ2aWNlVHJhY2tlci5jcHAKQEAgLTIxLDcgKzIxLDcgQEAKIAogI2luY2x1ZGUgIkZhY2Vib29rQmFzZS5oIgogI2luY2x1ZGUgIlNlcnZpY2VUcmFja2VyLmgiCi0jaW5jbHVkZSAiY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oIgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBuYW1lc3BhY2UgZmFjZWJvb2s6OmZiMzAzOwpAQCAtMjUxLDcgKzI1MSw3IEBACiAgIHVpbnQ2NF90IGNvdW50OwogICBmb3IgKGl0ZXIgPSBjaGVja3BvaW50U2VydmljZUR1cmF0aW9uXy5iZWdpbigpOwogICAgICAgIGl0ZXIgIT0gY2hlY2twb2ludFNlcnZpY2VEdXJhdGlvbl8uZW5kKCk7Ci0gICAgICAgaXRlcisrKSB7CisgICAgICAgKytpdGVyKSB7CiAgICAgY291bnQgPSBpdGVyLT5zZWNvbmQuZmlyc3Q7CiAgICAgaGFuZGxlcl8tPnNldENvdW50ZXIoc3RyaW5nKCJjaGVja3BvaW50X2NvdW50XyIpICsgaXRlci0+Zmlyc3QsIGNvdW50KTsKICAgICBpZiAoY291bnQgPT0gMCkgewpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9jcHAvU2VydmljZVRyYWNrZXIuaCBiL2NvbnRyaWIvZmIzMDMvY3BwL1NlcnZpY2VUcmFja2VyLmgKaW5kZXggOTMwNDM4Ni4uOWEzZWRkOCAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9jcHAvU2VydmljZVRyYWNrZXIuaAorKysgYi9jb250cmliL2ZiMzAzL2NwcC9TZXJ2aWNlVHJhY2tlci5oCkBAIC0xMDAsNyArMTAwLDcgQEAKICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CiAKLSNpbmNsdWRlICJjb25jdXJyZW5jeS9NdXRleC5oIgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgogCiAKIG5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvaWYvZmIzMDMudGhyaWZ0IGIvY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQKaW5kZXggNjZjODMxNS4uODliZDZlYiAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQKKysrIGIvY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQKQEAgLTI0LDYgKzI0LDcgQEAKIG5hbWVzcGFjZSBqYXZhIGNvbS5mYWNlYm9vay5mYjMwMwogbmFtZXNwYWNlIGNwcCBmYWNlYm9vay5mYjMwMwogbmFtZXNwYWNlIHBlcmwgRmFjZWJvb2suRkIzMDMKK25hbWVzcGFjZSBuZXRjb3JlIEZhY2Vib29rLkZCMzAzLlRlc3QKIAogLyoqCiAgKiBDb21tb24gc3RhdHVzIHJlcG9ydGluZyBtZWNoYW5pc20gYWNyb3NzIGFsbCBzZXJ2aWNlcwpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLnByb3BlcnRpZXMgYi9jb250cmliL2ZiMzAzL2phdmEvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDYzNjY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1IEBACisjIE1hdmVuIEFudCB0YXNrcyBKYXIgZGV0YWlscworbXZuLmFudC50YXNrLnZlcnNpb249Mi4xLjMKK212bi5yZXBvPWh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yCittdm4uYW50LnRhc2sudXJsPSR7bXZuLnJlcG99L29yZy9hcGFjaGUvbWF2ZW4vbWF2ZW4tYW50LXRhc2tzLyR7bXZuLmFudC50YXNrLnZlcnNpb259Cittdm4uYW50LnRhc2suamFyPW1hdmVuLWFudC10YXNrcy0ke212bi5hbnQudGFzay52ZXJzaW9ufS5qYXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvamF2YS9idWlsZC54bWwgYi9jb250cmliL2ZiMzAzL2phdmEvYnVpbGQueG1sCmluZGV4IGM5NmU0YmUuLjdhMWI4ZjEgMTAwNzU1Ci0tLSBhL2NvbnRyaWIvZmIzMDMvamF2YS9idWlsZC54bWwKKysrIGIvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLnhtbApAQCAtNyw5ICs3LDkgQEAKICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIAorCiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gCisKICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKQEAgLTI2LDIwICsyNiwyMCBAQAogICA8cHJvcGVydHkgbmFtZT0iaW50ZXJmYWNlLmRpciIgdmFsdWU9IiR7YmFzZWRpcn0vLi4vaWYiLz4KICAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5qYXZhLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LnJvb3R9L2xpYi9qYXZhIi8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC50b29scy5kaXIiIGxvY2F0aW9uPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvdG9vbHMvIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnRfY29tcGlsZXIiIHZhbHVlPSIke3RocmlmdC5yb290fS9jb21waWxlci9jcHAvdGhyaWZ0Ii8+IAorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0X2NvbXBpbGVyIiB2YWx1ZT0iJHt0aHJpZnQucm9vdH0vY29tcGlsZXIvY3BwL3RocmlmdCIvPgorICA8cHJvcGVydHkgZmlsZT0iJHtiYXNlZGlyfS9idWlsZC5wcm9wZXJ0aWVzIi8+CiAKICAgPCEtLSBpbmhlcml0IGZyb20gdGhlIGphdmEgYnVpbGQgZmlsZSBmb3IgdmVyc2lvbiBhbmQgb3RoZXIgcHJvcGVydGllcyAtLT4KLSAgPHByb3BlcnR5IGZpbGU9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC5wcm9wZXJ0aWVzIiAvPgorICA8cHJvcGVydHkgZmlsZT0iJHt0aHJpZnQuamF2YS5kaXJ9L2dyYWRsZS5wcm9wZXJ0aWVzIiAvPgogCiAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+CiAKICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idmVyc2lvbiIgdmFsdWU9IiR7dGhyaWZ0LnZlcnNpb259Ij4KICAgICA8aXNzZXQgcHJvcGVydHk9InJlbGVhc2UiLz4KICAgPC9jb25kaXRpb24+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiB2YWx1ZT0iJHt0aHJpZnQudmVyc2lvbn0tc25hcHNob3QiLz4KKyAgPHByb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIke3RocmlmdC52ZXJzaW9ufS1TTkFQU0hPVCIvPgogCiAgIDxwcm9wZXJ0eSBuYW1lPSJmYjMwMy5maW5hbC5uYW1lIiB2YWx1ZT0iJHtmYjMwMy5hcnRpZmFjdGlkfS0ke3ZlcnNpb259Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuamF2YS5saWJ0aHJpZnQiIHZhbHVlPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvbGlidGhyaWZ0LSR7dmVyc2lvbn0uamFyIi8+CiAKICAgPHByb3BlcnR5IG5hbWU9InNyYyIgdmFsdWU9IiR7YmFzZWRpcn0vc3JjIi8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJnZW4iIHZhbHVlPSIke2Jhc2VkaXJ9L2dlbi1qYXZhIi8+CkBAIC03NCw4ICs3NCwxMiBAQAogICAgIDxlY2hvIG1lc3NhZ2U9IkJ1aWxkaW5nICR7ZmIzMDMuZmluYWwubmFtZX0uamFyIi8+CiAgICAgPGphdmFjIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlcy5kaXJ9IiBkZWJ1Zz0ib24iPgogICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3RocmlmdC5qYXZhLmxpYnRocmlmdH0iLz4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke3RocmlmdC5yb290fS9saWIvamF2YS9idWlsZC9saWIiPgorICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9saWJzIj4KKyAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJsaWJ0aHJpZnQqLmphciIgLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqamF2YWRvYy5qYXIiIC8+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KnNvdXJjZXMuamFyIiAvPgorICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2RlcHMiPgogICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+CiAgICAgICAgIDwvZmlsZXNldD4KICAgICAgIDwvY2xhc3NwYXRoPgpAQCAtMTIwLDIxICsxMjQsMjEgQEAKICAgICA8YXJ0aWZhY3Q6cmVtb3RlUmVwb3NpdG9yeSBpZD0iYXBhY2hlIiB1cmw9IiR7YXBhY2hlLnJlcG99Ii8+CiAKICAgICA8IS0tIFBvbSBmaWxlIGluZm9ybWF0aW9uIC0tPgotICAgIDxhcnRpZmFjdDpwb20gaWQ9InBvbSIgCi0gICAgICBncm91cElkPSIke3RocmlmdC5ncm91cGlkfSIgCisgICAgPGFydGlmYWN0OnBvbSBpZD0icG9tIgorICAgICAgZ3JvdXBJZD0iJHt0aHJpZnQuZ3JvdXBpZH0iCiAgICAgICBhcnRpZmFjdElkPSIke2ZiMzAzLmFydGlmYWN0aWR9IgotICAgICAgdmVyc2lvbj0iJHt2ZXJzaW9ufSIgCisgICAgICB2ZXJzaW9uPSIke3ZlcnNpb259IgogICAgICAgdXJsPSJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciCiAgICAgICBuYW1lPSJBcGFjaGUgVGhyaWZ0IgogICAgICAgZGVzY3JpcHRpb249IlRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMgZGV2ZWxvcG1lbnQuIgotICAgICAgcGFja2FnaW5nPSJwb20iCisgICAgICBwYWNrYWdpbmc9ImphciIKICAgICA+CiAgICAgICA8cmVtb3RlUmVwb3NpdG9yeSByZWZpZD0iY2VudHJhbCIvPgogICAgICAgPHJlbW90ZVJlcG9zaXRvcnkgcmVmaWQ9ImFwYWNoZSIvPgogICAgICAgPGxpY2Vuc2UgbmFtZT0iVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCIgdXJsPSIke2xpY2Vuc2V9Ii8+Ci0gICAgICA8c2NtIGNvbm5lY3Rpb249InNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQvdHJ1bmsvIiAKLSAgICAgIGRldmVsb3BlckNvbm5lY3Rpb249InNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQvdHJ1bmsvIgotICAgICAgdXJsPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvdGhyaWZ0IgorICAgICAgPHNjbSBjb25uZWN0aW9uPSJzY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCIKKyAgICAgIGRldmVsb3BlckNvbm5lY3Rpb249InNjbTpnaXQ6aHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IgorICAgICAgdXJsPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdCIKICAgICAvPgogICAgICAgPCEtLSBUaHJpZnQgRGV2ZWxvcGVycyAtLT4KICAgICAgIDxkZXZlbG9wZXIgaWQ9Im1jc2xlZSIgbmFtZT0iTWFyayBTbGVlIi8+CkBAIC0xNTMsNiArMTU3LDggQEAKICAgICAgIDxkZXZlbG9wZXIgaWQ9Im1vbGluYXJvIiBuYW1lPSJBbnRob255IE1vbGluYXJvIi8+CiAgICAgICA8ZGV2ZWxvcGVyIGlkPSJyb2dlciIgbmFtZT0iUm9nZXIgTWVpZXIiLz4KICAgICAgIDxkZXZlbG9wZXIgaWQ9ImpmYXJyZWxsIiBuYW1lPSJKYWtlIEZhcnJlbGwiLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9ImplbnNnIiBuYW1lPSJKZW5zIEdleWVyIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJjYXJsIiBuYW1lPSJDYXJsIFlla3NpZ2lhbiIvPgogCiAgICAgICA8IS0tIFRocmlmdCBkZXBlbmRlbmNpZXMgbGlzdCAtLT4KICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5hcGFjaGUudGhyaWZ0IiBhcnRpZmFjdElkPSJsaWJ0aHJpZnQiIHZlcnNpb249IiR7dmVyc2lvbn0iLz4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDMvRmFjZWJvb2tCYXNlLnB5IGIvY29udHJpYi9mYjMwMy9weS9mYjMwMy9GYWNlYm9va0Jhc2UucHkKaW5kZXggNjg1ZmYyMC4uMDdkYjEwYyAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9weS9mYjMwMy9GYWNlYm9va0Jhc2UucHkKKysrIGIvY29udHJpYi9mYjMwMy9weS9mYjMwMy9GYWNlYm9va0Jhc2UucHkKQEAgLTI0LDU5ICsyNCw2MCBAQAogaW1wb3J0IHRocmlmdC5yZWZsZWN0aW9uLmxpbWl0ZWQKIGZyb20gdHR5cGVzIGltcG9ydCBmYl9zdGF0dXMKIAorCiBjbGFzcyBGYWNlYm9va0Jhc2UoRmFjZWJvb2tTZXJ2aWNlLklmYWNlKToKIAotICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6Ci0gICAgc2VsZi5uYW1lID0gbmFtZQotICAgIHNlbGYuYWxpdmUgPSBpbnQodGltZS50aW1lKCkpCi0gICAgc2VsZi5jb3VudGVycyA9IHt9CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuYWxpdmUgPSBpbnQodGltZS50aW1lKCkpCisgICAgICAgIHNlbGYuY291bnRlcnMgPSB7fQogCi0gIGRlZiBnZXROYW1lKHNlbGYsICk6Ci0gICAgcmV0dXJuIHNlbGYubmFtZQorICAgIGRlZiBnZXROYW1lKHNlbGYsICk6CisgICAgICAgIHJldHVybiBzZWxmLm5hbWUKIAotICBkZWYgZ2V0VmVyc2lvbihzZWxmLCApOgotICAgIHJldHVybiAnJworICAgIGRlZiBnZXRWZXJzaW9uKHNlbGYsICk6CisgICAgICAgIHJldHVybiAnJwogCi0gIGRlZiBnZXRTdGF0dXMoc2VsZiwgKToKLSAgICByZXR1cm4gZmJfc3RhdHVzLkFMSVZFCisgICAgZGVmIGdldFN0YXR1cyhzZWxmLCApOgorICAgICAgICByZXR1cm4gZmJfc3RhdHVzLkFMSVZFCiAKLSAgZGVmIGdldENvdW50ZXJzKHNlbGYpOgotICAgIHJldHVybiBzZWxmLmNvdW50ZXJzCisgICAgZGVmIGdldENvdW50ZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jb3VudGVycwogCi0gIGRlZiByZXNldENvdW50ZXIoc2VsZiwga2V5KToKLSAgICBzZWxmLmNvdW50ZXJzW2tleV0gPSAwCisgICAgZGVmIHJlc2V0Q291bnRlcihzZWxmLCBrZXkpOgorICAgICAgICBzZWxmLmNvdW50ZXJzW2tleV0gPSAwCiAKLSAgZGVmIGdldENvdW50ZXIoc2VsZiwga2V5KToKLSAgICBpZiBzZWxmLmNvdW50ZXJzLmhhc19rZXkoa2V5KToKLSAgICAgIHJldHVybiBzZWxmLmNvdW50ZXJzW2tleV0KLSAgICByZXR1cm4gMAorICAgIGRlZiBnZXRDb3VudGVyKHNlbGYsIGtleSk6CisgICAgICAgIGlmIHNlbGYuY291bnRlcnMuaGFzX2tleShrZXkpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY291bnRlcnNba2V5XQorICAgICAgICByZXR1cm4gMAogCi0gIGRlZiBpbmNyZW1lbnRDb3VudGVyKHNlbGYsIGtleSk6Ci0gICAgc2VsZi5jb3VudGVyc1trZXldID0gc2VsZi5nZXRDb3VudGVyKGtleSkgKyAxCisgICAgZGVmIGluY3JlbWVudENvdW50ZXIoc2VsZiwga2V5KToKKyAgICAgICAgc2VsZi5jb3VudGVyc1trZXldID0gc2VsZi5nZXRDb3VudGVyKGtleSkgKyAxCiAKLSAgZGVmIHNldE9wdGlvbihzZWxmLCBrZXksIHZhbHVlKToKLSAgICBwYXNzCisgICAgZGVmIHNldE9wdGlvbihzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBnZXRPcHRpb24oc2VsZiwga2V5KToKLSAgICByZXR1cm4gIiIKKyAgICBkZWYgZ2V0T3B0aW9uKHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiAiIgogCi0gIGRlZiBnZXRPcHRpb25zKHNlbGYpOgotICAgIHJldHVybiB7fQorICAgIGRlZiBnZXRPcHRpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4ge30KIAotICBkZWYgZ2V0T3B0aW9ucyhzZWxmKToKLSAgICByZXR1cm4ge30KKyAgICBkZWYgZ2V0T3B0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHt9CiAKLSAgZGVmIGFsaXZlU2luY2Uoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuYWxpdmUKKyAgICBkZWYgYWxpdmVTaW5jZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYWxpdmUKIAotICBkZWYgZ2V0Q3B1UHJvZmlsZShzZWxmLCBkdXJhdGlvbik6Ci0gICAgcmV0dXJuICIiCisgICAgZGVmIGdldENwdVByb2ZpbGUoc2VsZiwgZHVyYXRpb24pOgorICAgICAgICByZXR1cm4gIiIKIAotICBkZWYgZ2V0TGltaXRlZFJlZmxlY3Rpb24oc2VsZik6Ci0gICAgcmV0dXJuIHRocmlmdC5yZWZsZWN0aW9uLmxpbWl0ZWQuU2VydmljZSgpCisgICAgZGVmIGdldExpbWl0ZWRSZWZsZWN0aW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gdGhyaWZ0LnJlZmxlY3Rpb24ubGltaXRlZC5TZXJ2aWNlKCkKIAotICBkZWYgcmVpbml0aWFsaXplKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVpbml0aWFsaXplKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHNodXRkb3duKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgc2h1dGRvd24oc2VsZik6CisgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDNfc2NyaXB0cy9mYjMwM19zaW1wbGVfbWdtdC5weSBiL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDNfc2NyaXB0cy9mYjMwM19zaW1wbGVfbWdtdC5weQppbmRleCA0ZjhjZTk5Li41YzhmNDA5IDEwMDY0NAotLS0gYS9jb250cmliL2ZiMzAzL3B5L2ZiMzAzX3NjcmlwdHMvZmIzMDNfc2ltcGxlX21nbXQucHkKKysrIGIvY29udHJpYi9mYjMwMy9weS9mYjMwM19zY3JpcHRzL2ZiMzAzX3NpbXBsZV9tZ210LnB5CkBAIC0xLDQgKzEsNCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIS91c3IvYmluL2VudiBweXRob24gCiAKICMKICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQpAQCAtMTksNyArMTksOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHN5cywgb3MKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2ltcG9ydCBzeXMKK2ltcG9ydCBvcwogZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCiAKIGZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgKgpAQCAtMzEsMTEgKzMzLDEyIEBACiBmcm9tIGZiMzAzIGltcG9ydCAqCiBmcm9tIGZiMzAzLnR0eXBlcyBpbXBvcnQgKgogCisKIGRlZiBzZXJ2aWNlX2N0cmwoCi0gICAgICAgICAgICAgICAgIGNvbW1hbmQsCi0gICAgICAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICAgICAgIHRyYW5zX2ZhY3RvcnkgPSBOb25lLAotICAgICAgICAgICAgICAgICBwcm90X2ZhY3RvcnkgPSBOb25lKToKKyAgICAgICAgY29tbWFuZCwKKyAgICAgICAgcG9ydCwKKyAgICAgICAgdHJhbnNfZmFjdG9yeT1Ob25lLAorICAgICAgICBwcm90X2ZhY3Rvcnk9Tm9uZSk6CiAgICAgIiIiCiAgICAgc2VydmljZV9jdHJsIGlzIGEgZ2VuZXJpYyBmdW5jdGlvbiB0byBleGVjdXRlIHN0YW5kYXJkIGZiMzAzIGZ1bmN0aW9ucwogCkBAIC01NSw2NiArNTgsNTkgQEAKICAgICAgICAgICAgIG1zZyA9IGZiX3N0YXR1c19zdHJpbmcoc3RhdHVzKQogICAgICAgICAgICAgaWYgKGxlbihzdGF0dXNfZGV0YWlscykpOgogICAgICAgICAgICAgICAgIG1zZyArPSAiIC0gJXMiICUgc3RhdHVzX2RldGFpbHMKLSAgICAgICAgICAgIHByaW50IG1zZwotCi0gICAgICAgICAgICBpZiAoc3RhdHVzID09IGZiX3N0YXR1cy5BTElWRSk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDIKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDMKKyAgICAgICAgICAgIHByaW50KG1zZykKKyAgICAgICAgICAgIHJldHVybiAyIGlmIHN0YXR1cyA9PSBmYl9zdGF0dXMuQUxJVkUgZWxzZSAzCiAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHByaW50ICJGYWlsZWQgdG8gZ2V0IHN0YXR1cyIKKyAgICAgICAgICAgIHByaW50KCJGYWlsZWQgdG8gZ2V0IHN0YXR1cyIpCiAgICAgICAgICAgICByZXR1cm4gMwogCiAgICAgIyBzY2FsYXIgY29tbWFuZHMKLSAgICBpZiBjb21tYW5kIGluIFsidmVyc2lvbiIsImFsaXZlIiwibmFtZSJdOgorICAgIGlmIGNvbW1hbmQgaW4gWyJ2ZXJzaW9uIiwgImFsaXZlIiwgIm5hbWUiXToKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmVzdWx0ID0gZmIzMDNfd3JhcHBlcihjb21tYW5kLCAgcG9ydCwgdHJhbnNfZmFjdG9yeSwgcHJvdF9mYWN0b3J5KQotICAgICAgICAgICAgcHJpbnQgcmVzdWx0CisgICAgICAgICAgICByZXN1bHQgPSBmYjMwM193cmFwcGVyKGNvbW1hbmQsIHBvcnQsIHRyYW5zX2ZhY3RvcnksIHByb3RfZmFjdG9yeSkKKyAgICAgICAgICAgIHByaW50KHJlc3VsdCkKICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHByaW50ICJmYWlsZWQgdG8gZ2V0ICIsY29tbWFuZAorICAgICAgICAgICAgcHJpbnQoImZhaWxlZCB0byBnZXQgIiwgY29tbWFuZCkKICAgICAgICAgICAgIHJldHVybiAzCiAKICAgICAjIGNvdW50ZXJzCiAgICAgaWYgY29tbWFuZCBpbiBbImNvdW50ZXJzIl06CiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIGNvdW50ZXJzID0gZmIzMDNfd3JhcHBlcignY291bnRlcnMnLCAgcG9ydCwgdHJhbnNfZmFjdG9yeSwgcHJvdF9mYWN0b3J5KQorICAgICAgICAgICAgY291bnRlcnMgPSBmYjMwM193cmFwcGVyKCdjb3VudGVycycsIHBvcnQsIHRyYW5zX2ZhY3RvcnksIHByb3RfZmFjdG9yeSkKICAgICAgICAgICAgIGZvciBjb3VudGVyIGluIGNvdW50ZXJzOgotICAgICAgICAgICAgICAgIHByaW50ICIlczogJWQiICUgKGNvdW50ZXIsIGNvdW50ZXJzW2NvdW50ZXJdKQorICAgICAgICAgICAgICAgIHByaW50KCIlczogJWQiICUgKGNvdW50ZXIuZW5jb2RlKCd1dGYtOCcpLCBjb3VudGVyc1tjb3VudGVyXSkpCiAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBwcmludCAiZmFpbGVkIHRvIGdldCBjb3VudGVycyIKKyAgICAgICAgICAgIHByaW50KCJmYWlsZWQgdG8gZ2V0IGNvdW50ZXJzIikKICAgICAgICAgICAgIHJldHVybiAzCiAKLQogICAgICMgT25seSByb290IHNob3VsZCBiZSBhYmxlIHRvIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmRzCiAgICAgaWYgb3MuZ2V0dWlkKCkgPT0gMDoKICAgICAgICAgIyBhc3luYyBjb21tYW5kcwotICAgICAgICBpZiBjb21tYW5kIGluIFsic3RvcCIsInJlbG9hZCJdIDoKKyAgICAgICAgaWYgY29tbWFuZCBpbiBbInN0b3AiLCAicmVsb2FkIl06CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgZmIzMDNfd3JhcHBlcihjb21tYW5kLCBwb3J0LCB0cmFuc19mYWN0b3J5LCBwcm90X2ZhY3RvcnkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICBwcmludCAiZmFpbGVkIHRvIHRlbGwgdGhlIHNlcnZpY2UgdG8gIiwgY29tbWFuZAorICAgICAgICAgICAgICAgIHByaW50KCJmYWlsZWQgdG8gdGVsbCB0aGUgc2VydmljZSB0byAiLCBjb21tYW5kKQogICAgICAgICAgICAgICAgIHJldHVybiAzCiAgICAgZWxzZToKLSAgICAgICAgaWYgY29tbWFuZCBpbiBbInN0b3AiLCJyZWxvYWQiXToKLSAgICAgICAgICAgIHByaW50ICJyb290IHByaXZpbGVnZXMgYXJlIHJlcXVpcmVkIHRvIHN0b3Agb3IgcmVsb2FkIHRoZSBzZXJ2aWNlLiIKKyAgICAgICAgaWYgY29tbWFuZCBpbiBbInN0b3AiLCAicmVsb2FkIl06CisgICAgICAgICAgICBwcmludCgicm9vdCBwcml2aWxlZ2VzIGFyZSByZXF1aXJlZCB0byBzdG9wIG9yIHJlbG9hZCB0aGUgc2VydmljZS4iKQogICAgICAgICAgICAgcmV0dXJuIDQKIAotICAgIHByaW50ICJUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFyZSBhdmFpbGFibGU6IgotICAgIGZvciBjb21tYW5kIGluIFsiY291bnRlcnMiLCJuYW1lIiwidmVyc2lvbiIsImFsaXZlIiwic3RhdHVzIl06Ci0gICAgICAgIHByaW50ICJcdCVzIiAlIGNvbW1hbmQKLSAgICBwcmludCAiVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgYXZhaWxhYmxlIGZvciB1c2VycyB3aXRoIHJvb3QgcHJpdmlsZWdlczoiCi0gICAgZm9yIGNvbW1hbmQgaW4gWyJzdG9wIiwicmVsb2FkIl06Ci0gICAgICAgIHByaW50ICJcdCVzIiAlIGNvbW1hbmQKKyAgICBwcmludCgiVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgYXZhaWxhYmxlOiIpCisgICAgZm9yIGNvbW1hbmQgaW4gWyJjb3VudGVycyIsICJuYW1lIiwgInZlcnNpb24iLCAiYWxpdmUiLCAic3RhdHVzIl06CisgICAgICAgIHByaW50KCJcdCVzIiAlIGNvbW1hbmQpCisgICAgcHJpbnQoIlRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGF2YWlsYWJsZSBmb3IgdXNlcnMgd2l0aCByb290IHByaXZpbGVnZXM6IikKKyAgICBmb3IgY29tbWFuZCBpbiBbInN0b3AiLCAicmVsb2FkIl06CisgICAgICAgIHByaW50KCJcdCVzIiAlIGNvbW1hbmQpCisKKyAgICByZXR1cm4gMAogCiAKLQotICAgIHJldHVybiAwOwotCi0KLWRlZiBmYjMwM193cmFwcGVyKGNvbW1hbmQsIHBvcnQsIHRyYW5zX2ZhY3RvcnkgPSBOb25lLCBwcm90X2ZhY3RvcnkgPSBOb25lKToKK2RlZiBmYjMwM193cmFwcGVyKGNvbW1hbmQsIHBvcnQsIHRyYW5zX2ZhY3Rvcnk9Tm9uZSwgcHJvdF9mYWN0b3J5PU5vbmUpOgogICAgIHNvY2sgPSBUU29ja2V0LlRTb2NrZXQoJ2xvY2FsaG9zdCcsIHBvcnQpCiAKICAgICAjIHVzZSBpbnB1dCB0cmFuc3BvcnQgZmFjdG9yeSBpZiBwcm92aWRlZApAQCAtMTc5LDExICsxNzUsMTEgQEAKIAogICAgICMgcGFyc2UgY29tbWFuZCBsaW5lIG9wdGlvbnMKICAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIoKQotICAgIGNvbW1hbmRzPVsic3RvcCIsImNvdW50ZXJzIiwic3RhdHVzIiwicmVsb2FkIiwidmVyc2lvbiIsIm5hbWUiLCJhbGl2ZSJdCisgICAgY29tbWFuZHMgPSBbInN0b3AiLCAiY291bnRlcnMiLCAic3RhdHVzIiwgInJlbG9hZCIsICJ2ZXJzaW9uIiwgIm5hbWUiLCAiYWxpdmUiXQogCiAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1jIiwgIi0tY29tbWFuZCIsIGRlc3Q9ImNvbW1hbmQiLCBoZWxwPSJleGVjdXRlIHRoaXMgQVBJIiwKICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPWNvbW1hbmRzLCBkZWZhdWx0PSJzdGF0dXMiKQotICAgIHBhcnNlci5hZGRfb3B0aW9uKCItcCIsIi0tcG9ydCIsZGVzdD0icG9ydCIsaGVscD0idGhlIHNlcnZpY2UncyBwb3J0IiwKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLXAiLCAiLS1wb3J0IiwgZGVzdD0icG9ydCIsIGhlbHA9InRoZSBzZXJ2aWNlJ3MgcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD05MDgyKQogCiAgICAgKG9wdGlvbnMsIGFyZ3MpID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9weS9zZXR1cC5weSBiL2NvbnRyaWIvZmIzMDMvcHkvc2V0dXAucHkKaW5kZXggYTI5Zjk2NC4uZDI3YzI5NiAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9weS9zZXR1cC5weQorKysgYi9jb250cmliL2ZiMzAzL3B5L3NldHVwLnB5CkBAIC0xLDMgKzEsNSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKICMKICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtNyw3ICs5LDcgQEAKICMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMJaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KQEAgLTE3LDExICsxOSwzMCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAKK2ltcG9ydCBzeXMKK3RyeToKKyAgICBmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwLCBFeHRlbnNpb24KK2V4Y2VwdDoKKyAgICBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uLCBDb21tYW5kCiAKLXNldHVwKG5hbWU9J2ZiMzAzJywKLSAgICAgIHZlcnNpb249JzEuMCcsCi0gICAgICBwYWNrYWdlcz1bJ2ZiMzAzJywgJ2ZiMzAzX3NjcmlwdHMnXSwKK3NldHVwKG5hbWU9J3RocmlmdF9mYjMwMycsCisgICAgICB2ZXJzaW9uPScxLjAuMCcsCisgICAgICBkZXNjcmlwdGlvbj0nUHl0aG9uIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBGQjMwMycsCisgICAgICBhdXRob3I9WydBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMnXSwKKyAgICAgIGF1dGhvcl9lbWFpbD1bJ2RldkB0aHJpZnQuYXBhY2hlLm9yZyddLAorICAgICAgdXJsPSdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcnLAorICAgICAgbGljZW5zZT0nQXBhY2hlIExpY2Vuc2UgMi4wJywKKyAgICAgIHBhY2thZ2VzPVsKKyAgICAgICAgICAnZmIzMDMnLAorICAgICAgICAgICdmYjMwM19zY3JpcHRzJywKKyAgICAgIF0sCisgICAgICBjbGFzc2lmaWVycz1bCisgICAgICAgICAgJ0RldmVsb3BtZW50IFN0YXR1cyA6OiA3IC0gSW5hY3RpdmUnLAorICAgICAgICAgICdFbnZpcm9ubWVudCA6OiBDb25zb2xlJywKKyAgICAgICAgICAnSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycycsCisgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbicsCisgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyJywKKyAgICAgICAgICAnVG9waWMgOjogU29mdHdhcmUgRGV2ZWxvcG1lbnQgOjogTGlicmFyaWVzJywKKyAgICAgICAgICAnVG9waWMgOjogU3lzdGVtIDo6IE5ldHdvcmtpbmcnCisgICAgICBdLAogICAgICAgKQotCi0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvbWluZ3ctY3Jvc3MtY29tcGlsZS5zaCBiL2NvbnRyaWIvbWluZ3ctY3Jvc3MtY29tcGlsZS5zaAppbmRleCBmMGIwM2EzLi43ZWQ1ZDQ3IDEwMDc1NQotLS0gYS9jb250cmliL21pbmd3LWNyb3NzLWNvbXBpbGUuc2gKKysrIGIvY29udHJpYi9taW5ndy1jcm9zcy1jb21waWxlLnNoCkBAIC0yLDI2ICsyLDE4IEBACiBzZXQgLWUKIAogLi9jb25maWd1cmUgXAotICAtLXdpdGhvdXQtY3BwIFwKLSAgLS13aXRob3V0LWphdmEgXAotICAtLXdpdGhvdXQtY3NoYXJwIFwKLSAgLS13aXRob3V0LXB5dGhvbiBcCi0gIC0td2l0aG91dC1ydWJ5IFwKLSAgLS13aXRob3V0LWhhc2tlbGwgXAotICAtLXdpdGhvdXQtcGVybCBcCi0gIC0td2l0aG91dC1waHAgXAotICAtLXdpdGhvdXQtZXJsYW5nIFwKKyAgLS1kaXNhYmxlLWxpYnMgXAogICAtLWJ1aWxkPWk2ODYtcGMtbGludXgtZ251IFwKICAgLS1ob3N0PWk1ODYtbWluZ3czMm1zdmMgXAotICBDUFBGTEFHUz0nLURNSU5HVycKKyAgQ0M9aTU4Ni1taW5ndzMybXN2Yy1nY2MgQ1hYPWk1ODYtbWluZ3czMm1zdmMtZysrCiAKIG1ha2UKIAogIyBDaGVjayB0d28gbG9jYXRpb25zIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBsaWJ0b29sIDEuNS4yNiBvciAyLjIuNmIuCi1pZiB0ZXN0IC1mIGNvbXBpbGVyL2NwcC8ubGlicy90aHJpZnQuZXhlCi0gIHRoZW4gY3AgY29tcGlsZXIvY3BwLy5saWJzL3RocmlmdC5leGUgLi90aHJpZnQuZXhlCi0gIGVsc2UgY3AgY29tcGlsZXIvY3BwL3RocmlmdC5leGUgLi90aHJpZnQuZXhlCitpZiB0ZXN0IC1mIGNvbXBpbGVyL2NwcC8ubGlicy90aHJpZnQuZXhlIDsgdGhlbgorICBpNTg2LW1pbmd3MzJtc3ZjLXN0cmlwIGNvbXBpbGVyL2NwcC8ubGlicy90aHJpZnQuZXhlIC1vIC4vdGhyaWZ0LmV4ZQorZWxzZSAKKyAgaTU4Ni1taW5ndzMybXN2Yy1zdHJpcCBjb21waWxlci9jcHAvdGhyaWZ0LmV4ZSAtbyAuL3RocmlmdC5leGUKIGZpCi1pNTg2LW1pbmd3MzJtc3ZjLXN0cmlwIC4vdGhyaWZ0LmV4ZQotZWNobworZWNobyAiRmluaXNoZWQgY29tcGlsaW5nIHdpdGggcmVzdWx0aW5nIGV4ZSIKIGxzIC1sIC4vdGhyaWZ0LmV4ZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9wYXJzZV9wcm9maWxpbmcucHkgYi9jb250cmliL3BhcnNlX3Byb2ZpbGluZy5weQppbmRleCA1MmQyMjExLi4wYmU1ZjI5IDEwMDc1NQotLS0gYS9jb250cmliL3BhcnNlX3Byb2ZpbGluZy5weQorKysgYi9jb250cmliL3BhcnNlX3Byb2ZpbGluZy5weQpAQCAtNDIsMTAgKzQyLDEyIEBACiAgICAgICAgIHNlbGYuYWRkcmVzcyA9IGFkZHJlc3MKICAgICAgICAgc2VsZi5zb3VyY2VGaWxlID0gTm9uZQogICAgICAgICBzZWxmLnNvdXJjZUxpbmUgPSBOb25lCi0gICAgICAgIHNlbGYuZnVudGlvbiA9IE5vbmUKKyAgICAgICAgc2VsZi5mdW5jdGlvbiA9IE5vbmUKIAogCiBnX2FkZHJzX2J5X2ZpbGVuYW1lID0ge30KKworCiBkZWYgZ2V0X2FkZHJlc3MoZmlsZW5hbWUsIGFkZHJlc3MpOgogICAgICIiIgogICAgIFJldHJpZXZlIGFuIEFkZHJlc3NJbmZvIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QgZmlsZSBhbmQgYWRkcmVzcy4KQEAgLTEwMywxMiArMTA1LDEyIEBACiAgICAgICAgIGlkeCA9IGZpbGVfYW5kX2xpbmUucmZpbmQoJzonKQogICAgICAgICBpZiBpZHggPCAwOgogICAgICAgICAgICAgbXNnID0gJ2V4cGVjdGVkIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZyb20gYWRkcjJsaW5lOyBnb3QgJXInICUgXAotICAgICAgICAgICAgICAgICAgICAoZmlsZV9hbmRfbGluZSwpCisgICAgICAgICAgICAgICAgKGZpbGVfYW5kX2xpbmUsKQogICAgICAgICAgICAgbXNnICs9ICdcbmZpbGU9JXIsIGFkZHJlc3M9JXInICUgKGZpbGVuYW1lLCBhZGRyZXNzLmFkZHJlc3MpCiAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24obXNnKQogCiAgICAgICAgIGFkZHJlc3Muc291cmNlRmlsZSA9IGZpbGVfYW5kX2xpbmVbOmlkeF0KLSAgICAgICAgYWRkcmVzcy5zb3VyY2VMaW5lID0gZmlsZV9hbmRfbGluZVtpZHgrMTpdCisgICAgICAgIGFkZHJlc3Muc291cmNlTGluZSA9IGZpbGVfYW5kX2xpbmVbaWR4ICsgMTpdCiAKICAgICAocmVtYWluaW5nX291dCwgY21kX2VycikgPSBwcm9jLmNvbW11bmljYXRlKCkKICAgICByZXRjb2RlID0gcHJvYy53YWl0KCkKQEAgLTE4MCw3ICsxODIsNyBAQAogCiAgICAgdmlydF9jYWxsX3JlZ2V4ID0gcmUuY29tcGlsZShyJ15ccypUX1ZJUlRVQUxfQ0FMTDogKFxkKykgY2FsbHMgb24gKC4qKTokJykKICAgICBnZW5fcHJvdF9yZWdleCA9IHJlLmNvbXBpbGUoCi0gICAgICAgICAgICByJ15ccypUX0dFTkVSSUNfUFJPVE9DT0w6IChcZCspIGNhbGxzIHRvICguKikgd2l0aCBhICguKik6JCcpCisgICAgICAgIHInXlxzKlRfR0VORVJJQ19QUk9UT0NPTDogKFxkKykgY2FsbHMgdG8gKC4qKSB3aXRoIGEgKC4qKTokJykKICAgICBidF9yZWdleCA9IHJlLmNvbXBpbGUocideXHMqIyhcZCspXHMqKC4qKSBcWygweFswLTlBLVphLXpdKylcXSQnKQogCiAgICAgIyBQYXJzZSBhbGwgb2YgdGhlIGlucHV0LCBhbmQgc3RvcmUgaXQgYXMgRW50cnkgb2JqZWN0cwpAQCAtMjA5LDcgKzIxMSw3IEBACiAgICAgICAgICAgICAgICAgIyAiX1oiIHRvIHRoZSB0eXBlIG5hbWUgdG8gbWFrZSBpdCBsb29rIGxpa2UgYW4gZXh0ZXJuYWwgbmFtZS4KICAgICAgICAgICAgICAgICB0eXBlX25hbWUgPSAnX1onICsgdHlwZV9uYW1lCiAgICAgICAgICAgICBoZWFkZXIgPSAnVF9WSVJUVUFMX0NBTEw6ICVkIGNhbGxzIG9uICIlcyInICUgXAotICAgICAgICAgICAgICAgICAgICAobnVtX2NhbGxzLCB0eXBlX25hbWUpCisgICAgICAgICAgICAgICAgKG51bV9jYWxscywgdHlwZV9uYW1lKQogICAgICAgICAgICAgaWYgY3VycmVudF9lbnRyeSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICBlbnRyaWVzLmFwcGVuZChjdXJyZW50X2VudHJ5KQogICAgICAgICAgICAgY3VycmVudF9lbnRyeSA9IEVudHJ5KGhlYWRlcikKQEAgLTIyNCw3ICsyMjYsNyBAQAogICAgICAgICAgICAgICAgIHR5cGVfbmFtZTEgPSAnX1onICsgdHlwZV9uYW1lMQogICAgICAgICAgICAgICAgIHR5cGVfbmFtZTIgPSAnX1onICsgdHlwZV9uYW1lMgogICAgICAgICAgICAgaGVhZGVyID0gJ1RfR0VORVJJQ19QUk9UT0NPTDogJWQgY2FsbHMgdG8gIiVzIiB3aXRoIGEgIiVzIicgJSBcCi0gICAgICAgICAgICAgICAgICAgIChudW1fY2FsbHMsIHR5cGVfbmFtZTEsIHR5cGVfbmFtZTIpCisgICAgICAgICAgICAgICAgKG51bV9jYWxscywgdHlwZV9uYW1lMSwgdHlwZV9uYW1lMikKICAgICAgICAgICAgIGlmIGN1cnJlbnRfZW50cnkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgZW50cmllcy5hcHBlbmQoY3VycmVudF9lbnRyeSkKICAgICAgICAgICAgIGN1cnJlbnRfZW50cnkgPSBFbnRyeShoZWFkZXIpCmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vcG9tLnhtbCBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNjZiYzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vcG9tLnhtbApAQCAtMCwwICsxLDkyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorPHByb2plY3QgCisgIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIAorICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKworICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxncm91cElkPm9yZy5hcGFjaGUudGhyaWZ0PC9ncm91cElkPgorICA8YXJ0aWZhY3RJZD50aHJpZnQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICA8cGFja2FnaW5nPm1hdmVuLXBsdWdpbjwvcGFja2FnaW5nPgorICA8bmFtZT50aHJpZnQtbWF2ZW4tcGx1Z2luPC9uYW1lPgorICA8dmVyc2lvbj4xLjAuMDwvdmVyc2lvbj4KKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxzb3VyY2U+MS44PC9zb3VyY2U+CisgICAgICAgICAgPHRhcmdldD4xLjg8L3RhcmdldD4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4xNC4xPC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICA8dGhyaWZ0RXhlY3V0YWJsZT4ke3RocmlmdC5jb21waWxlcn08L3RocmlmdEV4ZWN1dGFibGU+CisgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorICA8ZGVwZW5kZW5jaWVzPgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+NC4xMTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjMuMS4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4yLjE8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5ndWF2YTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmd1YXZhPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MTQuMC4xPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtdXRpbHM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4zLjAuMTQ8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLm1vY2tpdG88L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5tb2NraXRvLWFsbDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMTAuMTk8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorICA8cHJvcGVydGllcz4KKyAgICA8dGhyaWZ0LnJvb3Q+JHtiYXNlZGlyfS8uLi8uLjwvdGhyaWZ0LnJvb3Q+CisgICAgPHRocmlmdC5jb21waWxlcj4ke3RocmlmdC5yb290fS9jb21waWxlci9jcHAvdGhyaWZ0PC90aHJpZnQuY29tcGlsZXI+CisgICAgPHRocmlmdC50ZXN0LmhvbWU+JHt0aHJpZnQucm9vdH0vdGVzdDwvdGhyaWZ0LnRlc3QuaG9tZT4KKyAgPC9wcm9wZXJ0aWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vQWJzdHJhY3RUaHJpZnRNb2pvLmphdmEgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9BYnN0cmFjdFRocmlmdE1vam8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjliZTk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vQWJzdHJhY3RUaHJpZnRNb2pvLmphdmEKQEAgLTAsMCArMSwzODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tYXZlbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuSm9pbmVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0UmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5BYnN0cmFjdE1vam87CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3RIZWxwZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLmNsaS5Db21tYW5kTGluZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuaW8uUmF3SW5wdXRTdHJlYW1GYWNhZGU7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHMubmV3SGFzaFNldDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5BcnJheXMuYXNMaXN0OworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMubGlzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlscy5jbGVhbkRpcmVjdG9yeTsKK2ltcG9ydCBzdGF0aWMgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlscy5jb3B5U3RyZWFtVG9GaWxlOworaW1wb3J0IHN0YXRpYyBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRmlsZVV0aWxzLmdldEZpbGVzOworCisvKioKKyAqIEFic3RyYWN0IE1vam8gaW1wbGVtZW50YXRpb24uCisgKiA8cC8+CisgKiBUaGlzIGNsYXNzIGlzIGV4dGVuZGVkIGJ5IHtAbGluayBvcmcuYXBhY2hlLnRocmlmdC5tYXZlbi5UaHJpZnRDb21waWxlTW9qb30gYW5kCisgKiB7QGxpbmsgb3JnLmFwYWNoZS50aHJpZnQubWF2ZW4uVGhyaWZ0VGVzdENvbXBpbGVNb2pvfSBpbiBvcmRlciB0byBvdmVycmlkZSB0aGUgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmb3IKKyAqIGNvbXBpbGluZyB0aGUgbWFpbiBvciB0ZXN0IGNsYXNzZXMgcmVzcGVjdGl2ZWx5LgorICovCithYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRocmlmdE1vam8gZXh0ZW5kcyBBYnN0cmFjdE1vam8geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRIUklGVF9GSUxFX1NVRkZJWCA9ICIudGhyaWZ0IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lOQ0xVREVTID0gIioqLyoiICsgVEhSSUZUX0ZJTEVfU1VGRklYOworCisgICAgLyoqCisgICAgICogVGhlIGN1cnJlbnQgTWF2ZW4gcHJvamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtwcm9qZWN0fSIKKyAgICAgKiBAcmVhZG9ubHkKKyAgICAgKiBAcmVxdWlyZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7CisKKyAgICAvKioKKyAgICAgKiBBIGhlbHBlciB1c2VkIHRvIGFkZCByZXNvdXJjZXMgdG8gdGhlIHByb2plY3QuCisgICAgICoKKyAgICAgKiBAY29tcG9uZW50CisgICAgICogQHJlcXVpcmVkCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hdmVuUHJvamVjdEhlbHBlciBwcm9qZWN0SGVscGVyOworCisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgcGF0aCB0byB0aGUge0Bjb2RlIHRocmlmdH0gZXhlY3V0YWJsZS4gQnkgZGVmYXVsdCBpdCB3aWxsIHNlYXJjaCB0aGUge0Bjb2RlICRQQVRIfS4KKyAgICAgKgorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0idGhyaWZ0IgorICAgICAqIEByZXF1aXJlZAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHRocmlmdEV4ZWN1dGFibGU7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHN0cmluZyBpcyBwYXNzZWQgdG8gdGhlIHtAY29kZSAtLWdlbn0gb3B0aW9uIG9mIHRoZSB7QGNvZGUgdGhyaWZ0fSBwYXJhbWV0ZXIuIEJ5IGRlZmF1bHQKKyAgICAgKiBpdCB3aWxsIGdlbmVyYXRlIEphdmEgb3V0cHV0LiBUaGUgbWFpbiByZWFzb24gZm9yIHRoaXMgb3B0aW9uIGlzIHRvIGJlIGFibGUgdG8gYWRkIG9wdGlvbnMKKyAgICAgKiB0byB0aGUgSmF2YSBnZW5lcmF0b3IgLSBpZiB5b3UgZ2VuZXJhdGUgc29tZXRoaW5nIGVsc2UsIHlvdSdyZSBvbiB5b3VyIG93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iamF2YSIKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZW5lcmF0b3I7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW1ldGVyCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlW10gYWRkaXRpb25hbFRocmlmdFBhdGhFbGVtZW50cyA9IG5ldyBGaWxlW117fTsKKworICAgIC8qKgorICAgICAqIFNpbmNlIHtAY29kZSB0aHJpZnR9IGNhbm5vdCBhY2Nlc3MgamFycywgdGhyaWZ0IGZpbGVzIGluIGRlcGVuZGVuY2llcyBhcmUgZXh0cmFjdGVkIHRvIHRoaXMgbG9jYXRpb24KKyAgICAgKiBhbmQgZGVsZXRlZCBvbiBleGl0LiBUaGlzIGRpcmVjdG9yeSBpcyBhbHdheXMgY2xlYW5lZCBkdXJpbmcgZXhlY3V0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90aHJpZnQtZGVwZW5kZW5jaWVzIgorICAgICAqIEByZXF1aXJlZAorICAgICAqLworICAgIHByaXZhdGUgRmlsZSB0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5OworCisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgcGF0aCB0byB0aGUgbG9jYWwgbWF2ZW4ge0Bjb2RlIHJlcG9zaXRvcnl9LgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke2xvY2FsUmVwb3NpdG9yeX0iCisgICAgICogQHJlcXVpcmVkCisgICAgICovCisgICAgcHJvdGVjdGVkIEFydGlmYWN0UmVwb3NpdG9yeSBsb2NhbFJlcG9zaXRvcnk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhpcyB0byB7QGNvZGUgZmFsc2V9IHRvIGRpc2FibGUgaGFzaGluZyBvZiBkZXBlbmRlbnQgamFyIHBhdGhzLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGlzIHBsdWdpbiBleHBhbmRzIGphcnMgb24gdGhlIGNsYXNzcGF0aCBsb29raW5nIGZvciBlbWJlZGRlZCAudGhyaWZ0IGZpbGVzLgorICAgICAqIE5vcm1hbGx5IHRoZXNlIHBhdGhzIGFyZSBoYXNoZWQgKE1ENSkgdG8gYXZvaWQgaXNzdWVzIHdpdGggbG9uZyBmaWxlIG5hbWVzIG9uIHdpbmRvd3MuCisgICAgICogSG93ZXZlciBpZiB0aGlzIHByb3BlcnR5IGlzIHNldCB0byB7QGNvZGUgZmFsc2V9IGxvbmdlciBwYXRocyB3aWxsIGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9InRydWUiCisgICAgICogQHJlcXVpcmVkCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzaERlcGVuZGVudFBhdGhzOworCisgICAgLyoqCisgICAgICogQHBhcmFtZXRlcgorICAgICAqLworICAgIHByaXZhdGUgU2V0PFN0cmluZz4gaW5jbHVkZXMgPSBJbW11dGFibGVTZXQub2YoREVGQVVMVF9JTkNMVURFUyk7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW1ldGVyCisgICAgICovCisgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBleGNsdWRlcyA9IEltbXV0YWJsZVNldC5vZigpOworCisgICAgLyoqCisgICAgICogQHBhcmFtZXRlcgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBzdGFsZU1pbGxpcyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW1ldGVyCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrU3RhbGVuZXNzID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgbW9qby4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tQYXJhbWV0ZXJzKCk7CisgICAgICAgIGZpbmFsIEZpbGUgdGhyaWZ0U291cmNlUm9vdCA9IGdldFRocmlmdFNvdXJjZVJvb3QoKTsKKyAgICAgICAgaWYgKHRocmlmdFNvdXJjZVJvb3QuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSW1tdXRhYmxlU2V0PEZpbGU+IHRocmlmdEZpbGVzID0gZmluZFRocmlmdEZpbGVzSW5EaXJlY3RvcnkodGhyaWZ0U291cmNlUm9vdCk7CisgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBvdXRwdXREaXJlY3RvcnkgPSBnZXRPdXRwdXREaXJlY3RvcnkoKTsKKyAgICAgICAgICAgICAgICBJbW11dGFibGVTZXQ8RmlsZT4gb3V0cHV0RmlsZXMgPSBmaW5kR2VuZXJhdGVkRmlsZXNJbkRpcmVjdG9yeShnZXRPdXRwdXREaXJlY3RvcnkoKSk7CisKKyAgICAgICAgICAgICAgICBpZiAodGhyaWZ0RmlsZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGdldExvZygpLmluZm8oIk5vIHRocmlmdCBmaWxlcyB0byBjb21waWxlLiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tTdGFsZW5lc3MgJiYgKChsYXN0TW9kaWZpZWQodGhyaWZ0RmlsZXMpICsgc3RhbGVNaWxsaXMpIDwgbGFzdE1vZGlmaWVkKG91dHB1dEZpbGVzKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygiU2tpcHBpbmcgY29tcGlsYXRpb24gYmVjYXVzZSB0YXJnZXQgZGlyZWN0b3J5IG5ld2VyIHRoYW4gc291cmNlcy4iKTsKKyAgICAgICAgICAgICAgICAgICAgYXR0YWNoRmlsZXMoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVTZXQ8RmlsZT4gZGVyaXZlZFRocmlmdFBhdGhFbGVtZW50cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZVRocmlmdFBhdGhGcm9tSmFycyh0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5LCBnZXREZXBlbmRlbmN5QXJ0aWZhY3RGaWxlcygpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGlyZWN0b3J5Lm1rZGlycygpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFF1aWNrIGZpeCB0byBmaXggaXNzdWVzIHdpdGggdHdvIG12biBpbnN0YWxscyBpbiBhIHJvdyAoaWUgbm8gY2xlYW4pCisgICAgICAgICAgICAgICAgICAgIC8vIGNsZWFuRGlyZWN0b3J5KG91dHB1dERpcmVjdG9yeSk7CisKKyAgICAgICAgICAgICAgICAgICAgVGhyaWZ0IHRocmlmdCA9IG5ldyBUaHJpZnQuQnVpbGRlcih0aHJpZnRFeGVjdXRhYmxlLCBvdXRwdXREaXJlY3RvcnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEdlbmVyYXRvcihnZW5lcmF0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFRocmlmdFBhdGhFbGVtZW50KHRocmlmdFNvdXJjZVJvb3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFRocmlmdFBhdGhFbGVtZW50cyhkZXJpdmVkVGhyaWZ0UGF0aEVsZW1lbnRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRUaHJpZnRQYXRoRWxlbWVudHMoYXNMaXN0KGFkZGl0aW9uYWxUaHJpZnRQYXRoRWxlbWVudHMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRUaHJpZnRGaWxlcyh0aHJpZnRGaWxlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGV4aXRTdGF0dXMgPSB0aHJpZnQuY29tcGlsZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXhpdFN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5lcnJvcigidGhyaWZ0IGZhaWxlZCBvdXRwdXQ6ICIgKyB0aHJpZnQuZ2V0T3V0cHV0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkuZXJyb3IoInRocmlmdCBmYWlsZWQgZXJyb3I6ICIgKyB0aHJpZnQuZ2V0RXJyb3IoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0ZhaWx1cmVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJpZnQgZGlkIG5vdCBleGl0IGNsZWFubHkuIFJldmlldyBvdXRwdXQgZm9yIG1vcmUgaW5mb3JtYXRpb24uIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXR0YWNoRmlsZXMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkFuIElPIGVycm9yIG9jY3VycmVkIiwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRmFpbHVyZUV4Y2VwdGlvbigidGhyaWZ0IGZhaWxlZCB0byBleGVjdXRlIGJlY2F1c2U6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChDb21tYW5kTGluZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGludm9raW5nIHRocmlmdC4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldExvZygpLmluZm8oZm9ybWF0KCIlcyBkb2VzIG5vdCBleGlzdC4gUmV2aWV3IHRoZSBjb25maWd1cmF0aW9uIG9yIGNvbnNpZGVyIGRpc2FibGluZyB0aGUgcGx1Z2luLiIsCisgICAgICAgICAgICAgICAgICAgIHRocmlmdFNvdXJjZVJvb3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEltbXV0YWJsZVNldDxGaWxlPiBmaW5kR2VuZXJhdGVkRmlsZXNJbkRpcmVjdG9yeShGaWxlIGRpcmVjdG9yeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRpcmVjdG9yeSA9PSBudWxsIHx8ICFkaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkKKyAgICAgICAgICAgIHJldHVybiBJbW11dGFibGVTZXQub2YoKTsKKworICAgICAgICBMaXN0PEZpbGU+IGphdmFGaWxlc0luRGlyZWN0b3J5ID0gZ2V0RmlsZXMoZGlyZWN0b3J5LCAiKiovKi5qYXZhIiwgbnVsbCk7CisgICAgICAgIHJldHVybiBJbW11dGFibGVTZXQuY29weU9mKGphdmFGaWxlc0luRGlyZWN0b3J5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgbGFzdE1vZGlmaWVkKEltbXV0YWJsZVNldDxGaWxlPiBmaWxlcykgeworICAgICAgICBsb25nIHJlc3VsdCA9IDA7CisgICAgICAgIGZvciAoRmlsZSBmaWxlIDogZmlsZXMpIHsKKyAgICAgICAgICAgIGlmIChmaWxlLmxhc3RNb2RpZmllZCgpID4gcmVzdWx0KQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZpbGUubGFzdE1vZGlmaWVkKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tQYXJhbWV0ZXJzKCkgeworICAgICAgICBjaGVja05vdE51bGwocHJvamVjdCwgInByb2plY3QiKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKHByb2plY3RIZWxwZXIsICJwcm9qZWN0SGVscGVyIik7CisgICAgICAgIGNoZWNrTm90TnVsbCh0aHJpZnRFeGVjdXRhYmxlLCAidGhyaWZ0RXhlY3V0YWJsZSIpOworICAgICAgICBjaGVja05vdE51bGwoZ2VuZXJhdG9yLCAiZ2VuZXJhdG9yIik7CisgICAgICAgIGZpbmFsIEZpbGUgdGhyaWZ0U291cmNlUm9vdCA9IGdldFRocmlmdFNvdXJjZVJvb3QoKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKHRocmlmdFNvdXJjZVJvb3QpOworICAgICAgICBjaGVja0FyZ3VtZW50KCF0aHJpZnRTb3VyY2VSb290LmlzRmlsZSgpLCAidGhyaWZ0U291cmNlUm9vdCBpcyBhIGZpbGUsIG5vdCBhIGRpcmVjdG9yeSIpOworICAgICAgICBjaGVja05vdE51bGwodGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSwgInRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnkiKTsKKyAgICAgICAgY2hlY2tTdGF0ZSghdGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeS5pc0ZpbGUoKSwgInRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnkgaXMgYSBmaWxlLCBub3QgYSBkaXJlY3RvcnkiKTsKKyAgICAgICAgZmluYWwgRmlsZSBvdXRwdXREaXJlY3RvcnkgPSBnZXRPdXRwdXREaXJlY3RvcnkoKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKG91dHB1dERpcmVjdG9yeSk7CisgICAgICAgIGNoZWNrU3RhdGUoIW91dHB1dERpcmVjdG9yeS5pc0ZpbGUoKSwgInRoZSBvdXRwdXREaXJlY3RvcnkgaXMgYSBmaWxlLCBub3QgYSBkaXJlY3RvcnkiKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRmlsZSBnZXRUaHJpZnRTb3VyY2VSb290KCk7CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdDxBcnRpZmFjdD4gZ2V0RGVwZW5kZW5jeUFydGlmYWN0cygpOworCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IEZpbGUgZ2V0T3V0cHV0RGlyZWN0b3J5KCk7CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhdHRhY2hGaWxlcygpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUge0BsaW5rIEZpbGV9IGZvciBlYWNoIGRlcGVuZGVuY3kgYXJ0aWZhY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgc2V0IG9mIGFsbCBkZXBlbmRlbmN5IGFydGlmYWN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEltbXV0YWJsZVNldDxGaWxlPiBnZXREZXBlbmRlbmN5QXJ0aWZhY3RGaWxlcygpIHsKKyAgICAgICAgU2V0PEZpbGU+IGRlcGVuZGVuY3lBcnRpZmFjdEZpbGVzID0gbmV3SGFzaFNldCgpOworICAgICAgICBmb3IgKEFydGlmYWN0IGFydGlmYWN0IDogZ2V0RGVwZW5kZW5jeUFydGlmYWN0cygpKSB7CisgICAgICAgICAgICBkZXBlbmRlbmN5QXJ0aWZhY3RGaWxlcy5hZGQoYXJ0aWZhY3QuZ2V0RmlsZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0LmNvcHlPZihkZXBlbmRlbmN5QXJ0aWZhY3RGaWxlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIEltbXV0YWJsZVNldDxGaWxlPiBtYWtlVGhyaWZ0UGF0aEZyb21KYXJzKEZpbGUgdGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSwgSXRlcmFibGU8RmlsZT4gY2xhc3NwYXRoRWxlbWVudEZpbGVzKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGNsYXNzcGF0aEVsZW1lbnRGaWxlcywgImNsYXNzcGF0aEVsZW1lbnRGaWxlcyIpOworICAgICAgICAvLyBjbGVhbiB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0byBlbnN1cmUgdGhhdCBzdGFsZSBmaWxlcyBhcmVuJ3QgdXNlZAorICAgICAgICBpZiAodGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeS5leGlzdHMoKSkgeworICAgICAgICAgICAgY2xlYW5EaXJlY3RvcnkodGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSk7CisgICAgICAgIH0KKworICAgICAgICBTZXQ8RmlsZT4gdGhyaWZ0RGlyZWN0b3JpZXMgPSBuZXdIYXNoU2V0KCk7CisKKyAgICAgICAgZm9yIChGaWxlIGNsYXNzcGF0aEVsZW1lbnRGaWxlIDogY2xhc3NwYXRoRWxlbWVudEZpbGVzKSB7CisgICAgICAgICAgICAvLyBmb3Igc29tZSByZWFzb24gdW5kZXIgSUFNLCB3ZSByZWNlaXZlIHBvbXMgYXMgZGVwZW5kZW50IGZpbGVzCisgICAgICAgICAgICAvLyBJIGFtIGV4Y2x1ZGluZyAueG1sIHJhdGhlciB0aGFuIGluY2x1ZGluZyAuamFyIGFzIHRoZXJlIG1heSBiZSBvdGhlciBleHRlbnNpb25zIGluIHVzZSAoc2FyLCBoYXIsIHppcCkKKyAgICAgICAgICAgIGlmIChjbGFzc3BhdGhFbGVtZW50RmlsZS5pc0ZpbGUoKSAmJiBjbGFzc3BhdGhFbGVtZW50RmlsZS5jYW5SZWFkKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgIWNsYXNzcGF0aEVsZW1lbnRGaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLnhtbCIpKSB7CisKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIGphciBmaWxlLiB0aGUgY29uc3RydWN0b3IgdmFsaWRhdGVzLgorICAgICAgICAgICAgICAgIEphckZpbGUgY2xhc3NwYXRoSmFyOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aEphciA9IG5ldyBKYXJGaWxlKGNsYXNzcGF0aEVsZW1lbnRGaWxlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyB3YXMgbm90IGEgcmVhZGFibGUgYXJ0aWZhY3QiLCBjbGFzc3BhdGhFbGVtZW50RmlsZSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIENvcHkgZWFjaCAudGhyaWZ0IGZpbGUgZm91bmQgaW4gdGhlIEpBUiBpbnRvIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgcHJlc2VydmluZyB0aGUKKyAgICAgICAgICAgICAgICAgKiBkaXJlY3RvcnkgcGF0aCBpdCBoYWQgcmVsYXRpdmUgdG8gaXRzIGNvbnRhaW5pbmcgSkFSLiBBZGQgdGhlIHJlc3VsdGluZyByb290IGRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAqICh1bmlxdWUgZm9yIGVhY2ggSkFSIHByb2Nlc3NlZCkgdG8gdGhlIHNldCBvZiB0aHJpZnQgaW5jbHVkZSBkaXJlY3RvcmllcyB0byB1c2Ugd2hlbgorICAgICAgICAgICAgICAgICAqIGNvbXBpbGluZy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBmb3IgKEphckVudHJ5IGphckVudHJ5IDogbGlzdChjbGFzc3BhdGhKYXIuZW50cmllcygpKSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgamFyRW50cnlOYW1lID0gamFyRW50cnkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoamFyRW50cnkuZ2V0TmFtZSgpLmVuZHNXaXRoKFRIUklGVF9GSUxFX1NVRkZJWCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0cnVuY2F0ZWRKYXJQYXRoID0gdHJ1bmNhdGVQYXRoKGNsYXNzcGF0aEphci5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZSB0aHJpZnRSb290RGlyZWN0b3J5ID0gbmV3IEZpbGUodGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSwgdHJ1bmNhdGVkSmFyUGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIHVuY29tcHJlc3NlZENvcHkgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSh0aHJpZnRSb290RGlyZWN0b3J5LCBqYXJFbnRyeU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkQ29weS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5U3RyZWFtVG9GaWxlKG5ldyBSYXdJbnB1dFN0cmVhbUZhY2FkZShjbGFzc3BhdGhKYXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldElucHV0U3RyZWFtKGphckVudHJ5KSksIHVuY29tcHJlc3NlZENvcHkpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0RGlyZWN0b3JpZXMuYWRkKHRocmlmdFJvb3REaXJlY3RvcnkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgaWYgKGNsYXNzcGF0aEVsZW1lbnRGaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBGaWxlW10gdGhyaWZ0RmlsZXMgPSBjbGFzc3BhdGhFbGVtZW50RmlsZS5saXN0RmlsZXMobmV3IEZpbGVuYW1lRmlsdGVyKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZS5lbmRzV2l0aChUSFJJRlRfRklMRV9TVUZGSVgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICBpZiAodGhyaWZ0RmlsZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJpZnREaXJlY3Rvcmllcy5hZGQoY2xhc3NwYXRoRWxlbWVudEZpbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBJbW11dGFibGVTZXQuY29weU9mKHRocmlmdERpcmVjdG9yaWVzKTsKKyAgICB9CisKKyAgICBJbW11dGFibGVTZXQ8RmlsZT4gZmluZFRocmlmdEZpbGVzSW5EaXJlY3RvcnkoRmlsZSBkaXJlY3RvcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrTm90TnVsbChkaXJlY3RvcnkpOworICAgICAgICBjaGVja0FyZ3VtZW50KGRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpLCAiJXMgaXMgbm90IGEgZGlyZWN0b3J5IiwgZGlyZWN0b3J5KTsKKyAgICAgICAgTGlzdDxGaWxlPiB0aHJpZnRGaWxlc0luRGlyZWN0b3J5ID0gZ2V0RmlsZXMoZGlyZWN0b3J5LCAKKyAgICAgICAgCQlKb2luZXIub24oIiwiKS5qb2luKGluY2x1ZGVzKSwKKyAgICAgICAgCQlKb2luZXIub24oIiwiKS5qb2luKGV4Y2x1ZGVzKSk7CisgICAgICAgIHJldHVybiBJbW11dGFibGVTZXQuY29weU9mKHRocmlmdEZpbGVzSW5EaXJlY3RvcnkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRydW5jYXRlcyB0aGUgcGF0aCBvZiBqYXIgZmlsZXMgc28gdGhhdCB0aGV5IGFyZSByZWxhdGl2ZSB0byB0aGUgbG9jYWwgcmVwb3NpdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqYXJQYXRoIHRoZSBmdWxsIHBhdGggb2YgYSBqYXIgZmlsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB0cnVuY2F0ZWQgcGF0aCByZWxhdGl2ZSB0byB0aGUgbG9jYWwgcmVwb3NpdG9yeSBvciByb290IG9mIHRoZSBkcml2ZS4KKyAgICAgKi8KKyAgICBTdHJpbmcgdHJ1bmNhdGVQYXRoKGZpbmFsIFN0cmluZyBqYXJQYXRoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGhhc2hEZXBlbmRlbnRQYXRocykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9IZXhTdHJpbmcoTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiTUQ1IikuZGlnZXN0KGphclBhdGguZ2V0Qnl0ZXMoKSkpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIGV4cGFuZCBkZXBlbmRlbnQgamFyIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeSA9IGxvY2FsUmVwb3NpdG9yeS5nZXRCYXNlZGlyKCkucmVwbGFjZSgnXFwnLCAnLycpOworICAgICAgICBpZiAoIXJlcG9zaXRvcnkuZW5kc1dpdGgoIi8iKSkgeworICAgICAgICAgICAgcmVwb3NpdG9yeSArPSAiLyI7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcGF0aCA9IGphclBhdGgucmVwbGFjZSgnXFwnLCAnLycpOworICAgICAgICBpbnQgcmVwb3NpdG9yeUluZGV4ID0gcGF0aC5pbmRleE9mKHJlcG9zaXRvcnkpOworICAgICAgICBpZiAocmVwb3NpdG9yeUluZGV4ICE9IC0xKSB7CisgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcocmVwb3NpdG9yeUluZGV4ICsgcmVwb3NpdG9yeS5sZW5ndGgoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBCeSBub3cgdGhlIHBhdGggc2hvdWxkIGJlIGdvb2QsIGJ1dCBkbyBhIGZpbmFsIGNoZWNrIHRvIGZpeCB3aW5kb3dzIG1hY2hpbmVzLgorICAgICAgICBpbnQgY29sb25JbmRleCA9IHBhdGguaW5kZXhPZignOicpOworICAgICAgICBpZiAoY29sb25JbmRleCAhPSAtMSkgeworICAgICAgICAgICAgLy8gMiA9IDpcIGluIEM6XAorICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKGNvbG9uSW5kZXggKyAyKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwYXRoOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBIRVhfQ0hBUlMgPSAiMDEyMzQ1Njc4OWFiY2RlZiIudG9DaGFyQXJyYXkoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSGV4U3RyaW5nKGJ5dGVbXSBieXRlQXJyYXkpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBoZXhTdHJpbmcgPSBuZXcgU3RyaW5nQnVpbGRlcigyICogYnl0ZUFycmF5Lmxlbmd0aCk7CisgICAgICAgIGZvciAoZmluYWwgYnl0ZSBiIDogYnl0ZUFycmF5KSB7CisgICAgICAgICAgICBoZXhTdHJpbmcuYXBwZW5kKEhFWF9DSEFSU1soYiAmIDB4RjApID4+IDRdKS5hcHBlbmQoSEVYX0NIQVJTW2IgJiAweDBGXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhleFN0cmluZy50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1RocmlmdC5qYXZhIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGhyaWZ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVlYTk1NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1RocmlmdC5qYXZhCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWF2ZW47CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLmNsaS5Db21tYW5kTGluZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuY2xpLkNvbW1hbmRMaW5lVXRpbHM7CitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLmNsaS5Db21tYW5kbGluZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzLm5ld0xpbmtlZExpc3Q7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0cy5uZXdIYXNoU2V0OworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBpbnZva2FibGUgY29uZmlndXJhdGlvbiBvZiB0aGUge0Bjb2RlIHRocmlmdH0KKyAqIGNvbXBpbGVyLiBUaGUgYWN0dWFsIGV4ZWN1dGFibGUgaXMgaW52b2tlZCB1c2luZyB0aGUgcGxleHVzCisgKiB7QGxpbmsgQ29tbWFuZGxpbmV9LgorICogPHAvPgorICogVGhpcyBjbGFzcyBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBnZW5lcmF0aW5nIGphdmEgc291cmNlIGZpbGVzLgorICovCitmaW5hbCBjbGFzcyBUaHJpZnQgeworCisgICAgZmluYWwgc3RhdGljIFN0cmluZyBHRU5FUkFURURfSkFWQSA9ICJnZW4tamF2YSI7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBleGVjdXRhYmxlOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGdlbmVyYXRvcjsKKyAgICBwcml2YXRlIGZpbmFsIEltbXV0YWJsZVNldDxGaWxlPiB0aHJpZnRQYXRoRWxlbWVudHM7CisgICAgcHJpdmF0ZSBmaW5hbCBJbW11dGFibGVTZXQ8RmlsZT4gdGhyaWZ0RmlsZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIGphdmFPdXRwdXREaXJlY3Rvcnk7CisgICAgcHJpdmF0ZSBmaW5hbCBDb21tYW5kTGluZVV0aWxzLlN0cmluZ1N0cmVhbUNvbnN1bWVyIG91dHB1dDsKKyAgICBwcml2YXRlIGZpbmFsIENvbW1hbmRMaW5lVXRpbHMuU3RyaW5nU3RyZWFtQ29uc3VtZXIgZXJyb3I7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgdGhlIHtAbGluayBCdWlsZGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGVjdXRhYmxlICAgICAgICAgIFRoZSBwYXRoIHRvIHRoZSB7QGNvZGUgdGhyaWZ0fSBleGVjdXRhYmxlLgorICAgICAqIEBwYXJhbSBnZW5lcmF0b3IgICAgICAgICAgIFRoZSB2YWx1ZSBmb3IgdGhlIHtAY29kZSAtLWdlbn0gb3B0aW9uLgorICAgICAqIEBwYXJhbSB0aHJpZnRQYXRoICAgICAgICAgIFRoZSBkaXJlY3RvcmllcyBpbiB3aGljaCB0byBzZWFyY2ggZm9yIGltcG9ydHMuCisgICAgICogQHBhcmFtIHRocmlmdEZpbGVzICAgICAgICAgVGhlIHRocmlmdCBzb3VyY2UgZmlsZXMgdG8gY29tcGlsZS4KKyAgICAgKiBAcGFyYW0gamF2YU91dHB1dERpcmVjdG9yeSBUaGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIGphdmEgc291cmNlIGZpbGVzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBnZW5lcmF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBUaHJpZnQoU3RyaW5nIGV4ZWN1dGFibGUsIFN0cmluZyBnZW5lcmF0b3IsIEltbXV0YWJsZVNldDxGaWxlPiB0aHJpZnRQYXRoLAorICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZVNldDxGaWxlPiB0aHJpZnRGaWxlcywgRmlsZSBqYXZhT3V0cHV0RGlyZWN0b3J5KSB7CisgICAgICAgIHRoaXMuZXhlY3V0YWJsZSA9IGNoZWNrTm90TnVsbChleGVjdXRhYmxlLCAiZXhlY3V0YWJsZSIpOworICAgICAgICB0aGlzLmdlbmVyYXRvciA9IGNoZWNrTm90TnVsbChnZW5lcmF0b3IsICJnZW5lcmF0b3IiKTsKKyAgICAgICAgdGhpcy50aHJpZnRQYXRoRWxlbWVudHMgPSBjaGVja05vdE51bGwodGhyaWZ0UGF0aCwgInRocmlmdFBhdGgiKTsKKyAgICAgICAgdGhpcy50aHJpZnRGaWxlcyA9IGNoZWNrTm90TnVsbCh0aHJpZnRGaWxlcywgInRocmlmdEZpbGVzIik7CisgICAgICAgIHRoaXMuamF2YU91dHB1dERpcmVjdG9yeSA9IGNoZWNrTm90TnVsbChqYXZhT3V0cHV0RGlyZWN0b3J5LCAiamF2YU91dHB1dERpcmVjdG9yeSIpOworICAgICAgICB0aGlzLmVycm9yID0gbmV3IENvbW1hbmRMaW5lVXRpbHMuU3RyaW5nU3RyZWFtQ29uc3VtZXIoKTsKKyAgICAgICAgdGhpcy5vdXRwdXQgPSBuZXcgQ29tbWFuZExpbmVVdGlscy5TdHJpbmdTdHJlYW1Db25zdW1lcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZXMgdGhlIHtAY29kZSB0aHJpZnR9IGNvbXBpbGVyIHVzaW5nIHRoZSBjb25maWd1cmF0aW9uIHNwZWNpZmllZCBhdAorICAgICAqIGNvbnN0cnVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGV4aXQgc3RhdHVzIG9mIHtAY29kZSB0aHJpZnR9LgorICAgICAqIEB0aHJvd3MgQ29tbWFuZExpbmVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNvbXBpbGUoKSB0aHJvd3MgQ29tbWFuZExpbmVFeGNlcHRpb24geworCisgICAgICAgIGZvciAoRmlsZSB0aHJpZnRGaWxlIDogdGhyaWZ0RmlsZXMpIHsKKyAgICAgICAgICAgIENvbW1hbmRsaW5lIGNsID0gbmV3IENvbW1hbmRsaW5lKCk7CisgICAgICAgICAgICBjbC5zZXRFeGVjdXRhYmxlKGV4ZWN1dGFibGUpOworICAgICAgICAgICAgY2wuYWRkQXJndW1lbnRzKGJ1aWxkVGhyaWZ0Q29tbWFuZCh0aHJpZnRGaWxlKS50b0FycmF5KG5ldyBTdHJpbmdbXXt9KSk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcmVzdWx0ID0gQ29tbWFuZExpbmVVdGlscy5leGVjdXRlQ29tbWFuZExpbmUoY2wsIG51bGwsIG91dHB1dCwgZXJyb3IpOworCisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gcmVzdWx0IHdpbGwgYWx3YXlzIGJlIDAgaGVyZS4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBtZXRob2QgaGFzIGJlZW4gbWFkZSB2aXNpYmxlIGZvciB0ZXN0aW5nIG9ubHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhyaWZ0RmlsZQorICAgICAqIEByZXR1cm4gQSBsaXN0IGNvbnNpc3Rpbmcgb2YgdGhlIGV4ZWN1dGFibGUgZm9sbG93ZWQgYnkgYW55IGFyZ3VtZW50cy4KKyAgICAgKi8KKyAgICBJbW11dGFibGVMaXN0PFN0cmluZz4gYnVpbGRUaHJpZnRDb21tYW5kKGZpbmFsIEZpbGUgdGhyaWZ0RmlsZSkgeworICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gY29tbWFuZCA9IG5ld0xpbmtlZExpc3QoKTsKKyAgICAgICAgLy8gYWRkIHRoZSBleGVjdXRhYmxlCisgICAgICAgIGZvciAoRmlsZSB0aHJpZnRQYXRoRWxlbWVudCA6IHRocmlmdFBhdGhFbGVtZW50cykgeworICAgICAgICAgICAgY29tbWFuZC5hZGQoIi1JIik7CisgICAgICAgICAgICBjb21tYW5kLmFkZCh0aHJpZnRQYXRoRWxlbWVudC50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBjb21tYW5kLmFkZCgiLW91dCIpOworICAgICAgICBjb21tYW5kLmFkZChqYXZhT3V0cHV0RGlyZWN0b3J5LnRvU3RyaW5nKCkpOworICAgICAgICBjb21tYW5kLmFkZCgiLS1nZW4iKTsKKyAgICAgICAgY29tbWFuZC5hZGQoZ2VuZXJhdG9yKTsKKyAgICAgICAgY29tbWFuZC5hZGQodGhyaWZ0RmlsZS50b1N0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEltbXV0YWJsZUxpc3QuY29weU9mKGNvbW1hbmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIG91dHB1dAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0KCkgeworICAgICAgICByZXR1cm4gb3V0cHV0LmdldE91dHB1dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGVycm9yCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFcnJvcigpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yLmdldE91dHB1dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgYnVpbGRzIHtAbGluayBUaHJpZnR9IGluc3RhbmNlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGV4ZWN1dGFibGU7CisgICAgICAgIHByaXZhdGUgZmluYWwgRmlsZSBqYXZhT3V0cHV0RGlyZWN0b3J5OworICAgICAgICBwcml2YXRlIFNldDxGaWxlPiB0aHJpZnRQYXRoRWxlbWVudHM7CisgICAgICAgIHByaXZhdGUgU2V0PEZpbGU+IHRocmlmdEZpbGVzOworICAgICAgICBwcml2YXRlIFN0cmluZyBnZW5lcmF0b3I7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgYnVpbGRlci4gVGhlIHR3byBwYXJhbWV0ZXJzIGFyZSBwcmVzZW50IGFzIHRoZXkgYXJlCisgICAgICAgICAqIHJlcXVpcmVkIGZvciBhbGwge0BsaW5rIFRocmlmdH0gaW5zdGFuY2VzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXhlY3V0YWJsZSAgICAgICAgICBUaGUgcGF0aCB0byB0aGUge0Bjb2RlIHRocmlmdH0gZXhlY3V0YWJsZS4KKyAgICAgICAgICogQHBhcmFtIGphdmFPdXRwdXREaXJlY3RvcnkgVGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBqYXZhIHNvdXJjZSBmaWxlcworICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGdlbmVyYXRlZC4KKyAgICAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgICAgSWYgZWl0aGVyIG9mIHRoZSBhcmd1bWVudHMgYXJlIHtAY29kZSBudWxsfS4KKyAgICAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYgdGhlIHtAY29kZSBqYXZhT3V0cHV0RGlyZWN0b3J5fSBpcworICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYSBkaXJlY3RvcnkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcihTdHJpbmcgZXhlY3V0YWJsZSwgRmlsZSBqYXZhT3V0cHV0RGlyZWN0b3J5KSB7CisgICAgICAgICAgICB0aGlzLmV4ZWN1dGFibGUgPSBjaGVja05vdE51bGwoZXhlY3V0YWJsZSwgImV4ZWN1dGFibGUiKTsKKyAgICAgICAgICAgIHRoaXMuamF2YU91dHB1dERpcmVjdG9yeSA9IGNoZWNrTm90TnVsbChqYXZhT3V0cHV0RGlyZWN0b3J5KTsKKyAgICAgICAgICAgIGNoZWNrQXJndW1lbnQoamF2YU91dHB1dERpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKTsKKyAgICAgICAgICAgIHRoaXMudGhyaWZ0RmlsZXMgPSBuZXdIYXNoU2V0KCk7CisgICAgICAgICAgICB0aGlzLnRocmlmdFBhdGhFbGVtZW50cyA9IG5ld0hhc2hTZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgdGhyaWZ0IGZpbGUgdG8gYmUgY29tcGlsZWQuIFRocmlmdCBmaWxlcyBtdXN0IGJlIG9uIHRoZSB0aHJpZnRwYXRoCisgICAgICAgICAqIGFuZCB0aGlzIG1ldGhvZCB3aWxsIGZhaWwgaWYgYSB0aHJpZnQgZmlsZSBpcyBhZGRlZCB3aXRob3V0IGZpcnN0IGFkZGluZyBhCisgICAgICAgICAqIHBhcmVudCBkaXJlY3RvcnkgdG8gdGhlIHRocmlmdHBhdGguCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0aHJpZnRGaWxlCisgICAgICAgICAqIEByZXR1cm4gVGhlIGJ1aWxkZXIuCisgICAgICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGEgdGhyaWZ0IGZpbGUgaXMgYWRkZWQgd2l0aG91dCBmaXJzdAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpbmcgYSBwYXJlbnQgZGlyZWN0b3J5IHRvIHRoZSB0aHJpZnRwYXRoLgorICAgICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICBJZiB7QGNvZGUgdGhyaWZ0RmlsZX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkVGhyaWZ0RmlsZShGaWxlIHRocmlmdEZpbGUpIHsKKyAgICAgICAgICAgIGNoZWNrTm90TnVsbCh0aHJpZnRGaWxlKTsKKyAgICAgICAgICAgIGNoZWNrQXJndW1lbnQodGhyaWZ0RmlsZS5pc0ZpbGUoKSk7CisgICAgICAgICAgICBjaGVja0FyZ3VtZW50KHRocmlmdEZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIudGhyaWZ0IikpOworICAgICAgICAgICAgY2hlY2tUaHJpZnRGaWxlSXNJblRocmlmdFBhdGgodGhyaWZ0RmlsZSk7CisgICAgICAgICAgICB0aHJpZnRGaWxlcy5hZGQodGhyaWZ0RmlsZSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIHRoZSBvcHRpb24gc3RyaW5nIGZvciB0aGUgVGhyaWZ0IGV4ZWN1dGFibGUncyB7QGNvZGUgLS1nZW59IHBhcmFtZXRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGdlbmVyYXRvcgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyCisgICAgICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gSWYge0Bjb2RlIGdlbmVyYXRvcn0gaXMge0Bjb2RlIG51bGx9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0R2VuZXJhdG9yKFN0cmluZyBnZW5lcmF0b3IpIHsKKyAgICAgICAgICAgIGNoZWNrTm90TnVsbChnZW5lcmF0b3IpOworICAgICAgICAgICAgdGhpcy5nZW5lcmF0b3IgPSBnZW5lcmF0b3I7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja1RocmlmdEZpbGVJc0luVGhyaWZ0UGF0aChGaWxlIHRocmlmdEZpbGUpIHsKKyAgICAgICAgICAgIGFzc2VydCB0aHJpZnRGaWxlLmlzRmlsZSgpOworICAgICAgICAgICAgY2hlY2tTdGF0ZShjaGVja1RocmlmdEZpbGVJc0luVGhyaWZ0UGF0aEhlbHBlcih0aHJpZnRGaWxlLmdldFBhcmVudEZpbGUoKSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrVGhyaWZ0RmlsZUlzSW5UaHJpZnRQYXRoSGVscGVyKEZpbGUgZGlyZWN0b3J5KSB7CisgICAgICAgICAgICBhc3NlcnQgZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCk7CisgICAgICAgICAgICBpZiAodGhyaWZ0UGF0aEVsZW1lbnRzLmNvbnRhaW5zKGRpcmVjdG9yeSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBwYXJlbnREaXJlY3RvcnkgPSBkaXJlY3RvcnkuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiAocGFyZW50RGlyZWN0b3J5ID09IG51bGwpID8gZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIDogY2hlY2tUaHJpZnRGaWxlSXNJblRocmlmdFBhdGhIZWxwZXIocGFyZW50RGlyZWN0b3J5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlICNhZGRUaHJpZnRGaWxlKEZpbGUpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRUaHJpZnRGaWxlcyhJdGVyYWJsZTxGaWxlPiB0aHJpZnRGaWxlcykgeworICAgICAgICAgICAgZm9yIChGaWxlIHRocmlmdEZpbGUgOiB0aHJpZnRGaWxlcykgeworICAgICAgICAgICAgICAgIGFkZFRocmlmdEZpbGUodGhyaWZ0RmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIHRoZSB7QGNvZGUgdGhyaWZ0UGF0aEVsZW1lbnR9IHRvIHRoZSB0aHJpZnRQYXRoLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdGhyaWZ0UGF0aEVsZW1lbnQgQSBkaXJlY3RvcnkgdG8gYmUgc2VhcmNoZWQgZm9yIGltcG9ydGVkIHRocmlmdCBtZXNzYWdlCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgZGVmaW5pdGlvbnMuCisgICAgICAgICAqIEByZXR1cm4gVGhlIGJ1aWxkZXIuCisgICAgICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gICAgIElmIHtAY29kZSB0aHJpZnRQYXRoRWxlbWVudH0gaXMge0Bjb2RlIG51bGx9LgorICAgICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiB7QGNvZGUgdGhyaWZ0UGF0aEVsZW1lbnR9IGlzIG5vdCBhCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFRocmlmdFBhdGhFbGVtZW50KEZpbGUgdGhyaWZ0UGF0aEVsZW1lbnQpIHsKKyAgICAgICAgICAgIGNoZWNrTm90TnVsbCh0aHJpZnRQYXRoRWxlbWVudCk7CisgICAgICAgICAgICBjaGVja0FyZ3VtZW50KHRocmlmdFBhdGhFbGVtZW50LmlzRGlyZWN0b3J5KCkpOworICAgICAgICAgICAgdGhyaWZ0UGF0aEVsZW1lbnRzLmFkZCh0aHJpZnRQYXRoRWxlbWVudCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlICNhZGRUaHJpZnRQYXRoRWxlbWVudChGaWxlKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkVGhyaWZ0UGF0aEVsZW1lbnRzKEl0ZXJhYmxlPEZpbGU+IHRocmlmdFBhdGhFbGVtZW50cykgeworICAgICAgICAgICAgZm9yIChGaWxlIHRocmlmdFBhdGhFbGVtZW50IDogdGhyaWZ0UGF0aEVsZW1lbnRzKSB7CisgICAgICAgICAgICAgICAgYWRkVGhyaWZ0UGF0aEVsZW1lbnQodGhyaWZ0UGF0aEVsZW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBBIGNvbmZpZ3VyZWQge0BsaW5rIFRocmlmdH0gaW5zdGFuY2UuCisgICAgICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIG5vIHRocmlmdCBmaWxlcyBoYXZlIGJlZW4gYWRkZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgVGhyaWZ0IGJ1aWxkKCkgeworICAgICAgICAgICAgY2hlY2tTdGF0ZSghdGhyaWZ0RmlsZXMuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVGhyaWZ0KGV4ZWN1dGFibGUsIGdlbmVyYXRvciwgSW1tdXRhYmxlU2V0LmNvcHlPZih0aHJpZnRQYXRoRWxlbWVudHMpLAorICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVTZXQuY29weU9mKHRocmlmdEZpbGVzKSwgamF2YU91dHB1dERpcmVjdG9yeSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UaHJpZnRDb21waWxlTW9qby5qYXZhIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGhyaWZ0Q29tcGlsZU1vam8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGY3NTcxCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGhyaWZ0Q29tcGlsZU1vam8uamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWF2ZW47CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CisKKy8qKgorICogVGhpcyBtb2pvIGV4ZWN1dGVzIHRoZSB7QGNvZGUgdGhyaWZ0fSBjb21waWxlciBmb3IgZ2VuZXJhdGluZyBqYXZhIHNvdXJjZXMKKyAqIGZyb20gdGhyaWZ0IGRlZmluaXRpb25zLiBJdCBhbHNvIHNlYXJjaGVzIGRlcGVuZGVuY3kgYXJ0aWZhY3RzIGZvcgorICogdGhyaWZ0IGZpbGVzIGFuZCBpbmNsdWRlcyB0aGVtIGluIHRoZSB0aHJpZnRQYXRoIHNvIHRoYXQgdGhleSBjYW4gYmUKKyAqIHJlZmVyZW5jZWQuIEZpbmFsbHksIGl0IGFkZHMgdGhlIHRocmlmdCBmaWxlcyB0byB0aGUgcHJvamVjdCBhcyByZXNvdXJjZXMgc28KKyAqIHRoYXQgdGhleSBhcmUgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIGFydGlmYWN0LgorICoKKyAqIEBwaGFzZSBnZW5lcmF0ZS1zb3VyY2VzCisgKiBAZ29hbCBjb21waWxlCisgKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiBjb21waWxlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUaHJpZnRDb21waWxlTW9qbyBleHRlbmRzIEFic3RyYWN0VGhyaWZ0TW9qbyB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc291cmNlIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgdGhlIHNvdXJjZXMgdG8gYmUgY29tcGlsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7YmFzZWRpcn0vc3JjL21haW4vdGhyaWZ0IgorICAgICAqIEByZXF1aXJlZAorICAgICAqLworICAgIHByaXZhdGUgRmlsZSB0aHJpZnRTb3VyY2VSb290OworCisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIHtAY29kZSAuamF2YX0gd2lsbCBiZSBjcmVhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nZW5lcmF0ZWQtc291cmNlcy90aHJpZnQiCisgICAgICogQHJlcXVpcmVkCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIG91dHB1dERpcmVjdG9yeTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBMaXN0PEFydGlmYWN0PiBnZXREZXBlbmRlbmN5QXJ0aWZhY3RzKCkgeworICAgICAgICBMaXN0PEFydGlmYWN0PiBjb21waWxlQXJ0aWZhY3RzID0gcHJvamVjdC5nZXRDb21waWxlQXJ0aWZhY3RzKCk7CisgICAgICAgIHJldHVybiBjb21waWxlQXJ0aWZhY3RzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBGaWxlIGdldE91dHB1dERpcmVjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dERpcmVjdG9yeTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRmlsZSBnZXRUaHJpZnRTb3VyY2VSb290KCkgeworICAgICAgICByZXR1cm4gdGhyaWZ0U291cmNlUm9vdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBhdHRhY2hGaWxlcygpIHsKKyAgICAgICAgcHJvamVjdC5hZGRDb21waWxlU291cmNlUm9vdChvdXRwdXREaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICBwcm9qZWN0SGVscGVyLmFkZFJlc291cmNlKHByb2plY3QsIHRocmlmdFNvdXJjZVJvb3QuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgIAkJSW1tdXRhYmxlTGlzdC5vZigiKiovKi50aHJpZnQiKSwgbnVsbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGhyaWZ0VGVzdENvbXBpbGVNb2pvLmphdmEgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UaHJpZnRUZXN0Q29tcGlsZU1vam8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjFkOTllCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGhyaWZ0VGVzdENvbXBpbGVNb2pvLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0Lm1hdmVuOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdFJlcG9zaXRvcnk7CisKKy8qKgorICogQHBoYXNlIGdlbmVyYXRlLXRlc3Qtc291cmNlcworICogQGdvYWwgdGVzdENvbXBpbGUKKyAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIHRlc3QKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRocmlmdFRlc3RDb21waWxlTW9qbyBleHRlbmRzIEFic3RyYWN0VGhyaWZ0TW9qbyB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc291cmNlIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgdGhlIHNvdXJjZXMgdG8gYmUgY29tcGlsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7YmFzZWRpcn0vc3JjL3Rlc3QvdGhyaWZ0IgorICAgICAqIEByZXF1aXJlZAorICAgICAqLworICAgIHByaXZhdGUgRmlsZSB0aHJpZnRUZXN0U291cmNlUm9vdDsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSB7QGNvZGUgLmphdmF9IHdpbGwgYmUgY3JlYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZ2VuZXJhdGVkLXRlc3Qtc291cmNlcy90aHJpZnQiCisgICAgICogQHJlcXVpcmVkCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIG91dHB1dERpcmVjdG9yeTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGF0dGFjaEZpbGVzKCkgeworICAgICAgICBwcm9qZWN0LmFkZFRlc3RDb21waWxlU291cmNlUm9vdChvdXRwdXREaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICBwcm9qZWN0SGVscGVyLmFkZFRlc3RSZXNvdXJjZShwcm9qZWN0LCB0aHJpZnRUZXN0U291cmNlUm9vdC5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgCQlJbW11dGFibGVMaXN0Lm9mKCIqKi8qLnRocmlmdCIpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTGlzdDxBcnRpZmFjdD4gZ2V0RGVwZW5kZW5jeUFydGlmYWN0cygpIHsKKyAgICAgICAgLy8gVE9ETyhnYWspOiBtYXZlbi1wcm9qZWN0IG5lZWRzIGdlbmVyaWNzCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBMaXN0PEFydGlmYWN0PiB0ZXN0QXJ0aWZhY3RzID0gcHJvamVjdC5nZXRUZXN0QXJ0aWZhY3RzKCk7CisgICAgICAgIHJldHVybiB0ZXN0QXJ0aWZhY3RzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBGaWxlIGdldE91dHB1dERpcmVjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dERpcmVjdG9yeTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRmlsZSBnZXRUaHJpZnRTb3VyY2VSb290KCkgeworICAgICAgICByZXR1cm4gdGhyaWZ0VGVzdFNvdXJjZVJvb3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2NhbCBtYXZlbiBBcnRpZmFjdFJlcG9zaXRvcnkuIEV4cG9zZWQgb25seSB0byBhbGxvdyB0ZXN0aW5nIG91dHNpZGUgb2YgTWF2ZW4gaXRzZWxmLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2FsUmVwb3NpdG9yeSBsb2NhbCBBcnRpZmFjdFJlcG9zaXRvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbE1hdmVuUmVwb3NpdG9yeShmaW5hbCBBcnRpZmFjdFJlcG9zaXRvcnkgbG9jYWxSZXBvc2l0b3J5KSB7CisgICAgICAgIHRoaXMubG9jYWxSZXBvc2l0b3J5ID0gbG9jYWxSZXBvc2l0b3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb3B0aW9uIHRvIGhhc2ggZGVwZW5kZW50IEpBUiBwYXRocy4gRXhwb3NlZCBvbmx5IHRvIGFsbG93IHRlc3Rpbmcgb3V0c2lkZSBvZiBNYXZlbiBpdHNlbGYuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFzaERlcGVuZGVudFBhdGhzIHdoZXRoZXIgb3Igbm90IHRvIGhhc2ggcGF0aHMgdG8gZGVwZW5kZW50IEpBUnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIYXNoRGVwZW5kZW50UGF0aHMoZmluYWwgYm9vbGVhbiBoYXNoRGVwZW5kZW50UGF0aHMpIHsKKyAgICAgICAgdGhpcy5oYXNoRGVwZW5kZW50UGF0aHMgPSBoYXNoRGVwZW5kZW50UGF0aHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGVzdEFic3RyYWN0VGhyaWZ0TW9qby5qYXZhIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGVzdEFic3RyYWN0VGhyaWZ0TW9qby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMTc2NzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UZXN0QWJzdHJhY3RUaHJpZnRNb2pvLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWF2ZW47CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3RSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZS5hc3NlcnRFcXVhbHM7CisKKworcHVibGljIGNsYXNzIFRlc3RBYnN0cmFjdFRocmlmdE1vam8geworCisgICAgcHJpdmF0ZSBUaHJpZnRUZXN0Q29tcGlsZU1vam8gbW9qbzsKKyAgICBwcml2YXRlIEZpbGUgdGVzdFJvb3REaXI7CisgICAgcHJpdmF0ZSBBcnRpZmFjdFJlcG9zaXRvcnkgbWF2ZW5SZXBvc2l0b3J5OworCisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRmlsZSB0bXBEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikpOworICAgICAgICB0ZXN0Um9vdERpciA9IG5ldyBGaWxlKHRtcERpciwgInRocmlmdC10ZXN0Iik7CisKKyAgICAgICAgLy8gdGhlIHRydW5jYXRlUGF0aCBtZXRob2QgYXNzdW1lcyBhIG1hdmVuIHJlcG9zaXRvcnksIGJ1dCBpdCBvbmx5IGNhcmVzIGFib3V0IHRoZSBiYXNlIGRpcgorICAgICAgICBtYXZlblJlcG9zaXRvcnkgPSBNb2NraXRvLm1vY2soQXJ0aWZhY3RSZXBvc2l0b3J5LmNsYXNzKTsKKyAgICAgICAgTW9ja2l0by53aGVuKG1hdmVuUmVwb3NpdG9yeS5nZXRCYXNlZGlyKCkpLnRoZW5SZXR1cm4oIi90ZXN0L21hdmVuL3JlcG8vYmFzZWRpciIpOworCisgICAgICAgIG1vam8gPSBuZXcgVGhyaWZ0VGVzdENvbXBpbGVNb2pvKCk7CisgICAgICAgIG1vam8uc2V0TG9jYWxNYXZlblJlcG9zaXRvcnkobWF2ZW5SZXBvc2l0b3J5KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYWtlVGhyaWZ0UGF0aEZyb21KYXJzKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIEZpbGUgdGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSA9IHRlc3RSb290RGlyOworCisgICAgICAgIC8vIFRoZSBTaGFyZWRJZGwuamFyIGZpbGUgY29udGFpbnMgdGhlIHNhbWUgaWRsL3NoYXJlZC50aHJpZnQgYW5kIGlkbC90dXRvcmlhbC50aHJpZnQgaGllcmFyY2h5CisgICAgICAgIC8vIHVzZWQgYnkgb3RoZXIgdGVzdHMuIEl0J3MgdXNlZCBoZXJlIHRvIHJlcHJlc2VudCBhIGRlcGVuZGVuY3kgb2YgdGhlIHByb2plY3QgbWF2ZW4gaXMgYnVpbGRpbmcsCisgICAgICAgIC8vIG9uZSB0aGF0IGlzIGNvbnRyaWJ1dGluZyAudGhyaWZ0IElETCBmaWxlcyBhcyB3ZWxsIGFzIGFueSBvdGhlciBhcnRpZmFjdHMuCisgICAgICAgIGZpbmFsIEl0ZXJhYmxlPEZpbGU+IGNsYXNzcGF0aEVsZW1lbnRGaWxlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgKKyAgICAgICAgICAgICAgICBuZXcgRmlsZSgic3JjL3Rlc3QvcmVzb3VyY2VzL2RlcGVuZGVuY3ktamFyLXRlc3QvU2hhcmVkSWRsLmphciIpCisgICAgICAgICk7CisKKyAgICAgICAgZmluYWwgU2V0PEZpbGU+IHRocmlmdERpcmVjdG9yaWVzID0gbW9qby5tYWtlVGhyaWZ0UGF0aEZyb21KYXJzKHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnksIGNsYXNzcGF0aEVsZW1lbnRGaWxlcyk7CisKKyAgICAgICAgLy8gVGhlIHJlc3VsdHMgc2hvdWxkIGJlIGEgcGF0aCB0byBhIGRpcmVjdG9yeSBuYW1lZCBhZnRlciB0aGUgSkFSIGl0c2VsZiAoYXNzdW1pbmcgbm8gcGF0aCBoYXNoaW5nLAorICAgICAgICAvLyBidXQgc2VlIGJlbG93IGZvciBhIHNlcGFyYXRlIHRlc3Qgb2YgdGhhdCkgcmVwcmVzZW50aW5nIHRoZSByb290IG9mIGEgaGllcmFyY2h5IGNvbnRhaW5pbmcgdGhyaWZ0CisgICAgICAgIC8vIGZpbGVzLCBzdWl0YWJsZSBmb3IgcHJvdmlkaW5nIHRvIHRoZSB0aHJpZnQgY29tcGlsZXIgYXMgYW4gaW5jbHVkZSBkaXJlY3RvcnkuIEluIHRoaXMgY2FzZSwgdGhhdAorICAgICAgICAvLyBtZWFucyBpdCBwb2ludHMgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSAiaWRsIiBoaWVyYXJjaHkgcmF0aGVyIHRoYW4gdG8gdGhlIGlkbCBkaXJlY3RvcnkKKyAgICAgICAgLy8gaXRzZWxmLgorICAgICAgICBmaW5hbCBTZXQ8RmlsZT4gZXhwZWN0ZWQgPSBTZXRzLm5ld0hhc2hTZXQoCisgICAgICAgICAgICAgICAgbmV3IEZpbGUodGVzdFJvb3REaXIsICJzcmMvdGVzdC9yZXNvdXJjZXMvZGVwZW5kZW5jeS1qYXItdGVzdC9TaGFyZWRJZGwuamFyIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIm1ha2VUaHJpZnRQYXRoRnJvbUphcnMgc2hvdWxkIHJldHVybiB0aHJpZnQgSURMIGJhc2UgcGF0aCBmcm9tIHdpdGhpbiBKQVIiLCBleHBlY3RlZCwgdGhyaWZ0RGlyZWN0b3JpZXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRydW5jYXRlUGF0aCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAvLyBKQVIgcGF0aCBpcyB1bnJlbGF0ZWQgdG8gbWF2ZW4gcmVwbywgYW5kIHNob3VsZCBiZSB1bmNoYW5nZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvcGF0aC90by9zb21lamFyLmphciIsIG1vam8udHJ1bmNhdGVQYXRoKCIvcGF0aC90by9zb21lamFyLmphciIpKTsKKworICAgICAgICAvLyBKQVIgcGF0aCBpcyB3aXRoaW4gbWF2ZW4gcmVwbywgYW5kIHNob3VsZCBiZSBtYWRlIHJlbGF0aXZlIHRvIHRoZSByZXBvCisgICAgICAgIGFzc2VydEVxdWFscygicGF0aC90by9zb21lamFyLmphciIsIG1vam8udHJ1bmNhdGVQYXRoKCIvdGVzdC9tYXZlbi9yZXBvL2Jhc2VkaXIvcGF0aC90by9zb21lamFyLmphciIpKTsKKworICAgICAgICAvLyBKQVIgcGF0aCBjb250YWlucyBmb3J3YXJkIHNsYXNoZXMgdGhhdCBzaG91bGQgYmUgbm9ybWFsaXplZAorICAgICAgICBhc3NlcnRFcXVhbHMoIi9wYXRoL3RvL3NvbWVqYXIuamFyIiwgbW9qby50cnVuY2F0ZVBhdGgoIlxccGF0aFxcdG9cXHNvbWVqYXIuamFyIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRydW5jYXRlUGF0aFdpdGhEZXBlbmRlbnRQYXRoSGFzaGluZygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBtb2pvLnNldEhhc2hEZXBlbmRlbnRQYXRocyh0cnVlKTsKKworICAgICAgICAvLyBoYXNoRGVwZW5kZW50UGF0aHMgc2V0IHRvIHRydWUsIHRoZSBKQVIgcGF0aCBpcyBpbW1lZGlhdGVseSBoYXNoZWQgKE1ENSkgYW5kIGNvbnZlcnRlZCB0byBhIGhleCBzdHJpbmcKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjFjODU5NTA5ODdiMjM0OTM0NjJjZjNjMjYxZDk1MTBhIiwgbW9qby50cnVuY2F0ZVBhdGgoIi9wYXRoL3RvL3NvbWVqYXIuamFyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjM5ZmMyYjRjMzRjYjZjYjBkYTM4YmVkNWQ4YjVmYzY3IiwgbW9qby50cnVuY2F0ZVBhdGgoIi90ZXN0L21hdmVuL3JlcG8vYmFzZWRpci9wYXRoL3RvL3NvbWVqYXIuamFyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjI1YjY5MjRmNWIwZTE5NDg2ZDBmZjg4NDQ4ZTk5OWQ1IiwgbW9qby50cnVuY2F0ZVBhdGgoIlxccGF0aFxcdG9cXHNvbWVqYXIuamFyIikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGVzdFRocmlmdC5qYXZhIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGVzdFRocmlmdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNzg5MWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UZXN0VGhyaWZ0LmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWF2ZW47CisKK2ltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5jbGkuQ29tbWFuZExpbmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitwdWJsaWMgY2xhc3MgVGVzdFRocmlmdCB7CisKKyAgICBwcml2YXRlIEZpbGUgdGVzdFJvb3REaXI7CisgICAgcHJpdmF0ZSBGaWxlIGlkbERpcjsKKyAgICBwcml2YXRlIEZpbGUgZ2VuSmF2YURpcjsKKyAgICBwcml2YXRlIFRocmlmdC5CdWlsZGVyIGJ1aWxkZXI7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRmlsZSB0bXBEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikpOworICAgICAgICB0ZXN0Um9vdERpciA9IG5ldyBGaWxlKHRtcERpciwgInRocmlmdC10ZXN0Iik7CisKKyAgICAgICAgaWYgKHRlc3RSb290RGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xlYW5EaXJlY3RvcnkodGVzdFJvb3REaXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIGNyZWF0ZSBvdXRwdXQgZGlyZWN0b3J5IGZvciB0ZXN0OiAiICsgdGVzdFJvb3REaXIuZ2V0UGF0aCgpLCB0ZXN0Um9vdERpci5ta2RpcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGUgdGVzdFJlc291cmNlRGlyID0gbmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcyIpOworICAgICAgICBhc3NlcnRUcnVlKCJVbmFibGUgdG8gZmluZCB0ZXN0IHJlc291cmNlcyIsIHRlc3RSb290RGlyLmV4aXN0cygpKTsKKworICAgICAgICBTdHJpbmcgdGhyaWZ0RXhlY3V0YWJsZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidGhyaWZ0RXhlY3V0YWJsZSIsICJ0aHJpZnQiKTsKKyAgICAgICAgaWYgKCEobmV3IEZpbGUodGhyaWZ0RXhlY3V0YWJsZSkuZXhpc3RzKCkpKSB7CisgICAgICAgICAgICB0aHJpZnRFeGVjdXRhYmxlID0gInRocmlmdCI7CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaHJpZnQgY29tcGlsZXI6ICIgKyB0aHJpZnRFeGVjdXRhYmxlKTsKKworICAgICAgICBpZGxEaXIgPSBuZXcgRmlsZSh0ZXN0UmVzb3VyY2VEaXIsICJpZGwiKTsKKyAgICAgICAgZ2VuSmF2YURpciA9IG5ldyBGaWxlKHRlc3RSb290RGlyLCBUaHJpZnQuR0VORVJBVEVEX0pBVkEpOworICAgICAgICBidWlsZGVyID0gbmV3IFRocmlmdC5CdWlsZGVyKHRocmlmdEV4ZWN1dGFibGUsIHRlc3RSb290RGlyKTsKKyAgICAgICAgYnVpbGRlcgorICAgICAgICAgICAgLnNldEdlbmVyYXRvcigiamF2YSIpCisgICAgICAgICAgICAuYWRkVGhyaWZ0UGF0aEVsZW1lbnQoaWRsRGlyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaHJpZnRDb21waWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUaHJpZnRDb21waWxlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGhyaWZ0Q29tcGlsZVdpdGhHZW5lcmF0b3JPcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYnVpbGRlci5zZXRHZW5lcmF0b3IoImphdmE6cHJpdmF0ZS1tZW1iZXJzIik7CisgICAgICAgIGV4ZWN1dGVUaHJpZnRDb21waWxlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVUaHJpZnRDb21waWxlKCkgdGhyb3dzIENvbW1hbmRMaW5lRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRmlsZSB0aHJpZnRGaWxlID0gbmV3IEZpbGUoaWRsRGlyLCAic2hhcmVkLnRocmlmdCIpOworCisgICAgICAgIGJ1aWxkZXIuYWRkVGhyaWZ0RmlsZSh0aHJpZnRGaWxlKTsKKworICAgICAgICBmaW5hbCBUaHJpZnQgdGhyaWZ0ID0gYnVpbGRlci5idWlsZCgpOworCisgICAgICAgIGFzc2VydFRydWUoIkZpbGUgbm90IGZvdW5kOiBzaGFyZWQudGhyaWZ0IiwgdGhyaWZ0RmlsZS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJnZW4tamF2YSBkaXJlY3Rvcnkgc2hvdWxkIG5vdCBleGlzdCIsIGdlbkphdmFEaXIuZXhpc3RzKCkpOworCisgICAgICAgIC8vIGV4ZWN1dGUgdGhlIGNvbXBpbGUKKyAgICAgICAgZmluYWwgaW50IHJlc3VsdCA9IHRocmlmdC5jb21waWxlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCByZXN1bHQpOworCisgICAgICAgIGFzc2VydEZhbHNlKCJnZW4tamF2YSBkaXJlY3Rvcnkgd2FzIG5vdCByZW1vdmVkIiwgZ2VuSmF2YURpci5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUoImdlbmVyYXRlZCBqYXZhIGNvZGUgZG9lc24ndCBleGlzdCIsCisgICAgICAgICAgICBuZXcgRmlsZSh0ZXN0Um9vdERpciwgInNoYXJlZC9TaGFyZWRTZXJ2aWNlLmphdmEiKS5leGlzdHMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGhyaWZ0TXVsdGlwbGVGaWxlQ29tcGlsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGaWxlIHNoYXJlZFRocmlmdCA9IG5ldyBGaWxlKGlkbERpciwgInNoYXJlZC50aHJpZnQiKTsKKyAgICAgICAgZmluYWwgRmlsZSB0dXRvcmlhbFRocmlmdCA9IG5ldyBGaWxlKGlkbERpciwgInR1dG9yaWFsLnRocmlmdCIpOworCisgICAgICAgIGJ1aWxkZXIuYWRkVGhyaWZ0RmlsZShzaGFyZWRUaHJpZnQpOworICAgICAgICBidWlsZGVyLmFkZFRocmlmdEZpbGUodHV0b3JpYWxUaHJpZnQpOworCisgICAgICAgIGZpbmFsIFRocmlmdCB0aHJpZnQgPSBidWlsZGVyLmJ1aWxkKCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSBub3QgZm91bmQ6IHNoYXJlZC50aHJpZnQiLCBzaGFyZWRUaHJpZnQuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiZ2VuLWphdmEgZGlyZWN0b3J5IHNob3VsZCBub3QgZXhpc3QiLCBnZW5KYXZhRGlyLmV4aXN0cygpKTsKKworICAgICAgICAvLyBleGVjdXRlIHRoZSBjb21waWxlCisgICAgICAgIGZpbmFsIGludCByZXN1bHQgPSB0aHJpZnQuY29tcGlsZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzdWx0KTsKKworICAgICAgICBhc3NlcnRGYWxzZSgiZ2VuLWphdmEgZGlyZWN0b3J5IHdhcyBub3QgcmVtb3ZlZCIsIGdlbkphdmFEaXIuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJnZW5lcmF0ZWQgamF2YSBjb2RlIGRvZXNuJ3QgZXhpc3QiLAorICAgICAgICAgICAgbmV3IEZpbGUodGVzdFJvb3REaXIsICJzaGFyZWQvU2hhcmVkU2VydmljZS5qYXZhIikuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJnZW5lcmF0ZWQgamF2YSBjb2RlIGRvZXNuJ3QgZXhpc3QiLAorICAgICAgICAgICAgbmV3IEZpbGUodGVzdFJvb3REaXIsICJ0dXRvcmlhbC9JbnZhbGlkT3BlcmF0aW9uLmphdmEiKS5leGlzdHMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkQ29tcGlsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGaWxlIHRocmlmdEZpbGUgPSBuZXcgRmlsZSh0ZXN0Um9vdERpciwgIm1pc3NpbmcudGhyaWZ0Iik7CisgICAgICAgIGJ1aWxkZXIuYWRkVGhyaWZ0UGF0aEVsZW1lbnQodGVzdFJvb3REaXIpOworCisgICAgICAgIC8vIEhhY2tpbmcgYXJvdW5kIGNoZWNrcyBpbiBhZGRUaHJpZnQgZmlsZS4KKyAgICAgICAgYXNzZXJ0VHJ1ZSh0aHJpZnRGaWxlLmNyZWF0ZU5ld0ZpbGUoKSk7CisgICAgICAgIGJ1aWxkZXIuYWRkVGhyaWZ0RmlsZSh0aHJpZnRGaWxlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0aHJpZnRGaWxlLmRlbGV0ZSgpKTsKKworICAgICAgICBmaW5hbCBUaHJpZnQgdGhyaWZ0ID0gYnVpbGRlci5idWlsZCgpOworCisgICAgICAgIGFzc2VydFRydWUoIXRocmlmdEZpbGUuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiZ2VuLWphdmEgZGlyZWN0b3J5IHNob3VsZCBub3QgZXhpc3QiLCBnZW5KYXZhRGlyLmV4aXN0cygpKTsKKworICAgICAgICAvLyBleGVjdXRlIHRoZSBjb21waWxlCisgICAgICAgIGZpbmFsIGludCByZXN1bHQgPSB0aHJpZnQuY29tcGlsZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlSW5QYXRoUHJlQ29uZGl0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZpbGUgdGhyaWZ0RmlsZSA9IG5ldyBGaWxlKHRlc3RSb290RGlyLCAibWlzc2luZy50aHJpZnQiKTsKKworICAgICAgICAvLyBIYWNraW5nIGFyb3VuZCBjaGVja3MgaW4gYWRkVGhyaWZ0IGZpbGUuCisgICAgICAgIGFzc2VydFRydWUodGhyaWZ0RmlsZS5jcmVhdGVOZXdGaWxlKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRUaHJpZnRGaWxlKHRocmlmdEZpbGUpOworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0ZXN0Um9vdERpci5leGlzdHMoKSkgeworICAgICAgICAgICAgRmlsZVV0aWxzLmNsZWFuRGlyZWN0b3J5KHRlc3RSb290RGlyKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byBkZWxldGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGVzdDogIiArIHRlc3RSb290RGlyLmdldFBhdGgoKSwgdGVzdFJvb3REaXIuZGVsZXRlKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9pZGwvc2hhcmVkLnRocmlmdCBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvaWRsL3NoYXJlZC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc1ZTdmOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvaWRsL3NoYXJlZC50aHJpZnQKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFRoaXMgVGhyaWZ0IGZpbGUgY2FuIGJlIGluY2x1ZGVkIGJ5IG90aGVyIFRocmlmdCBmaWxlcyB0aGF0IHdhbnQgdG8gc2hhcmUKKyAqIHRoZXNlIGRlZmluaXRpb25zLgorICovCisKK25hbWVzcGFjZSBjcHAgc2hhcmVkCituYW1lc3BhY2UgamF2YSBzaGFyZWQKK25hbWVzcGFjZSBwZXJsIHNoYXJlZAorCitzdHJ1Y3QgU2hhcmVkU3RydWN0IHsKKyAgMTogaTMyIGtleQorICAyOiBzdHJpbmcgdmFsdWUKK30KKworc2VydmljZSBTaGFyZWRTZXJ2aWNlIHsKKyAgU2hhcmVkU3RydWN0IGdldFN0cnVjdCgxOiBpMzIga2V5KQorfQpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9pZGwvdHV0b3JpYWwudGhyaWZ0IGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9pZGwvdHV0b3JpYWwudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZTQzM2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2lkbC90dXRvcmlhbC50aHJpZnQKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworIyBUaHJpZnQgVHV0b3JpYWwKKyMgTWFyayBTbGVlIChtY3NsZWVAZmFjZWJvb2suY29tKQorIworIyBUaGlzIGZpbGUgYWltcyB0byB0ZWFjaCB5b3UgaG93IHRvIHVzZSBUaHJpZnQsIGluIGEgLnRocmlmdCBmaWxlLiBOZWF0by4gVGhlCisjIGZpcnN0IHRoaW5nIHRvIG5vdGljZSBpcyB0aGF0IC50aHJpZnQgZmlsZXMgc3VwcG9ydCBzdGFuZGFyZCBzaGVsbCBjb21tZW50cy4KKyMgVGhpcyBsZXRzIHlvdSBtYWtlIHlvdXIgdGhyaWZ0IGZpbGUgZXhlY3V0YWJsZSBhbmQgaW5jbHVkZSB5b3VyIFRocmlmdCBidWlsZAorIyBzdGVwIG9uIHRoZSB0b3AgbGluZS4gQW5kIHlvdSBjYW4gcGxhY2UgY29tbWVudHMgbGlrZSB0aGlzIGFueXdoZXJlIHlvdSBsaWtlLgorIworIyBCZWZvcmUgcnVubmluZyB0aGlzIGZpbGUsIHlvdSB3aWxsIG5lZWQgdG8gaGF2ZSBpbnN0YWxsZWQgdGhlIHRocmlmdCBjb21waWxlcgorIyBpbnRvIC91c3IvbG9jYWwvYmluLgorCisvKioKKyAqIFRoZSBmaXJzdCB0aGluZyB0byBrbm93IGFib3V0IGFyZSB0eXBlcy4gVGhlIGF2YWlsYWJsZSB0eXBlcyBpbiBUaHJpZnQgYXJlOgorICoKKyAqICBib29sICAgICAgICBCb29sZWFuLCBvbmUgYnl0ZQorICogIGJ5dGUgICAgICAgIFNpZ25lZCBieXRlCisgKiAgaTE2ICAgICAgICAgU2lnbmVkIDE2LWJpdCBpbnRlZ2VyCisgKiAgaTMyICAgICAgICAgU2lnbmVkIDMyLWJpdCBpbnRlZ2VyCisgKiAgaTY0ICAgICAgICAgU2lnbmVkIDY0LWJpdCBpbnRlZ2VyCisgKiAgZG91YmxlICAgICAgNjQtYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlCisgKiAgc3RyaW5nICAgICAgU3RyaW5nCisgKiAgYmluYXJ5ICAgICAgQmxvYiAoYnl0ZSBhcnJheSkKKyAqICBtYXA8dDEsdDI+ICBNYXAgZnJvbSBvbmUgdHlwZSB0byBhbm90aGVyCisgKiAgbGlzdDx0MT4gICAgT3JkZXJlZCBsaXN0IG9mIG9uZSB0eXBlCisgKiAgc2V0PHQxPiAgICAgU2V0IG9mIHVuaXF1ZSBlbGVtZW50cyBvZiBvbmUgdHlwZQorICoKKyAqIERpZCB5b3UgYWxzbyBub3RpY2UgdGhhdCBUaHJpZnQgc3VwcG9ydHMgQyBzdHlsZSBjb21tZW50cz8KKyAqLworCisvLyBKdXN0IGluIGNhc2UgeW91IHdlcmUgd29uZGVyaW5nLi4uIHllcy4gV2Ugc3VwcG9ydCBzaW1wbGUgQyBjb21tZW50cyB0b28uCisKKy8qKgorICogVGhyaWZ0IGZpbGVzIGNhbiByZWZlcmVuY2Ugb3RoZXIgVGhyaWZ0IGZpbGVzIHRvIGluY2x1ZGUgY29tbW9uIHN0cnVjdAorICogYW5kIHNlcnZpY2UgZGVmaW5pdGlvbnMuIFRoZXNlIGFyZSBmb3VuZCB1c2luZyB0aGUgY3VycmVudCBwYXRoLCBvciBieQorICogc2VhcmNoaW5nIHJlbGF0aXZlIHRvIGFueSBwYXRocyBzcGVjaWZpZWQgd2l0aCB0aGUgLUkgY29tcGlsZXIgZmxhZy4KKyAqCisgKiBJbmNsdWRlZCBvYmplY3RzIGFyZSBhY2Nlc3NlZCB1c2luZyB0aGUgbmFtZSBvZiB0aGUgLnRocmlmdCBmaWxlIGFzIGEKKyAqIHByZWZpeC4gaS5lLiBzaGFyZWQuU2hhcmVkT2JqZWN0CisgKi8KK2luY2x1ZGUgInNoYXJlZC50aHJpZnQiCisKKy8qKgorICogVGhyaWZ0IGZpbGVzIGNhbiBuYW1lc3BhY2UsIHBhY2thZ2UsIG9yIHByZWZpeCB0aGVpciBvdXRwdXQgaW4gdmFyaW91cworICogdGFyZ2V0IGxhbmd1YWdlcy4KKyAqLworbmFtZXNwYWNlIGNwcCB0dXRvcmlhbAorbmFtZXNwYWNlIGphdmEgdHV0b3JpYWwKK25hbWVzcGFjZSBwaHAgdHV0b3JpYWwKK25hbWVzcGFjZSBwZXJsIHR1dG9yaWFsCituYW1lc3BhY2Ugc21hbGx0YWxrLmNhdGVnb3J5IFRocmlmdC5UdXRvcmlhbAorCisvKioKKyAqIFRocmlmdCBsZXRzIHlvdSBkbyB0eXBlZGVmcyB0byBnZXQgcHJldHR5IG5hbWVzIGZvciB5b3VyIHR5cGVzLiBTdGFuZGFyZAorICogQyBzdHlsZSBoZXJlLgorICovCit0eXBlZGVmIGkzMiBNeUludGVnZXIKKworLyoqCisgKiBUaHJpZnQgYWxzbyBsZXRzIHlvdSBkZWZpbmUgY29uc3RhbnRzIGZvciB1c2UgYWNyb3NzIGxhbmd1YWdlcy4gQ29tcGxleAorICogdHlwZXMgYW5kIHN0cnVjdHMgYXJlIHNwZWNpZmllZCB1c2luZyBKU09OIG5vdGF0aW9uLgorICovCitjb25zdCBpMzIgSU5UMzJDT05TVEFOVCA9IDk4NTMKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBNQVBDT05TVEFOVCA9IHsnaGVsbG8nOid3b3JsZCcsICdnb29kbmlnaHQnOidtb29uJ30KKworLyoqCisgKiBZb3UgY2FuIGRlZmluZSBlbnVtcywgd2hpY2ggYXJlIGp1c3QgMzIgYml0IGludGVnZXJzLiBWYWx1ZXMgYXJlIG9wdGlvbmFsCisgKiBhbmQgc3RhcnQgYXQgMSBpZiBub3Qgc3VwcGxpZWQsIEMgc3R5bGUgYWdhaW4uCisgKi8KK2VudW0gT3BlcmF0aW9uIHsKKyAgQUREID0gMSwKKyAgU1VCVFJBQ1QgPSAyLAorICBNVUxUSVBMWSA9IDMsCisgIERJVklERSA9IDQKK30KKworLyoqCisgKiBTdHJ1Y3RzIGFyZSB0aGUgYmFzaWMgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMuIFRoZXkgYXJlIGNvbXByaXNlZCBvZiBmaWVsZHMKKyAqIHdoaWNoIGVhY2ggaGF2ZSBhbiBpbnRlZ2VyIGlkZW50aWZpZXIsIGEgdHlwZSwgYSBzeW1ib2xpYyBuYW1lLCBhbmQgYW4KKyAqIG9wdGlvbmFsIGRlZmF1bHQgdmFsdWUuCisgKgorICogRmllbGRzIGNhbiBiZSBkZWNsYXJlZCAib3B0aW9uYWwiLCB3aGljaCBlbnN1cmVzIHRoZXkgd2lsbCBub3QgYmUgaW5jbHVkZWQKKyAqIGluIHRoZSBzZXJpYWxpemVkIG91dHB1dCBpZiB0aGV5IGFyZW4ndCBzZXQuICBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyBzb21lCisgKiBtYW51YWwgbWFuYWdlbWVudCBpbiBzb21lIGxhbmd1YWdlcy4KKyAqLworc3RydWN0IFdvcmsgeworICAxOiBpMzIgbnVtMSA9IDAsCisgIDI6IGkzMiBudW0yLAorICAzOiBPcGVyYXRpb24gb3AsCisgIDQ6IG9wdGlvbmFsIHN0cmluZyBjb21tZW50LAorfQorCisvKioKKyAqIFN0cnVjdHMgY2FuIGFsc28gYmUgZXhjZXB0aW9ucywgaWYgdGhleSBhcmUgbmFzdHkuCisgKi8KK2V4Y2VwdGlvbiBJbnZhbGlkT3BlcmF0aW9uIHsKKyAgMTogaTMyIHdoYXQsCisgIDI6IHN0cmluZyB3aHkKK30KKworLyoqCisgKiBBaGgsIG5vdyBvbnRvIHRoZSBjb29sIHBhcnQsIGRlZmluaW5nIGEgc2VydmljZS4gU2VydmljZXMganVzdCBuZWVkIGEgbmFtZQorICogYW5kIGNhbiBvcHRpb25hbGx5IGluaGVyaXQgZnJvbSBhbm90aGVyIHNlcnZpY2UgdXNpbmcgdGhlIGV4dGVuZHMga2V5d29yZC4KKyAqLworc2VydmljZSBDYWxjdWxhdG9yIGV4dGVuZHMgc2hhcmVkLlNoYXJlZFNlcnZpY2UgeworCisgIC8qKgorICAgKiBBIG1ldGhvZCBkZWZpbml0aW9uIGxvb2tzIGxpa2UgQyBjb2RlLiBJdCBoYXMgYSByZXR1cm4gdHlwZSwgYXJndW1lbnRzLAorICAgKiBhbmQgb3B0aW9uYWxseSBhIGxpc3Qgb2YgZXhjZXB0aW9ucyB0aGF0IGl0IG1heSB0aHJvdy4gTm90ZSB0aGF0IGFyZ3VtZW50CisgICAqIGxpc3RzIGFuZCBleGNlcHRpb24gbGlzdHMgYXJlIHNwZWNpZmllZCB1c2luZyB0aGUgZXhhY3Qgc2FtZSBzeW50YXggYXMKKyAgICogZmllbGQgbGlzdHMgaW4gc3RydWN0IG9yIGV4Y2VwdGlvbiBkZWZpbml0aW9ucy4KKyAgICovCisKKyAgIHZvaWQgcGluZygpLAorCisgICBpMzIgYWRkKDE6aTMyIG51bTEsIDI6aTMyIG51bTIpLAorCisgICBpMzIgY2FsY3VsYXRlKDE6aTMyIGxvZ2lkLCAyOldvcmsgdykgdGhyb3dzICgxOkludmFsaWRPcGVyYXRpb24gb3VjaCksCisKKyAgIC8qKgorICAgICogVGhpcyBtZXRob2QgaGFzIGEgb25ld2F5IG1vZGlmaWVyLiBUaGF0IG1lYW5zIHRoZSBjbGllbnQgb25seSBtYWtlcworICAgICogYSByZXF1ZXN0IGFuZCBkb2VzIG5vdCBsaXN0ZW4gZm9yIGFueSByZXNwb25zZSBhdCBhbGwuIE9uZXdheSBtZXRob2RzCisgICAgKiBtdXN0IGJlIHZvaWQuCisgICAgKi8KKyAgIG9uZXdheSB2b2lkIHppcCgpCisKK30KKworLyoqCisgKiBUaGF0IGp1c3QgYWJvdXQgY292ZXJzIHRoZSBiYXNpY3MuIFRha2UgYSBsb29rIGluIHRoZSB0ZXN0LyBmb2xkZXIgZm9yIG1vcmUKKyAqIGRldGFpbGVkIGV4YW1wbGVzLiBBZnRlciB5b3UgcnVuIHRoaXMgZmlsZSwgeW91ciBnZW5lcmF0ZWQgY29kZSBzaG93cyB1cAorICogaW4gZm9sZGVycyB3aXRoIG5hbWVzIGdlbi08bGFuZ3VhZ2U+LiBUaGUgZ2VuZXJhdGVkIGNvZGUgaXNuJ3QgdG9vIHNjYXJ5CisgKiB0byBsb29rIGF0LiBJdCBldmVuIGhhcyBwcmV0dHkgaW5kZW50YXRpb24uCisgKi8KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LmVsIGIvY29udHJpYi90aHJpZnQuZWwKaW5kZXggY2QzZTBlOC4uOTQxYTk5ZiAxMDA2NDQKLS0tIGEvY29udHJpYi90aHJpZnQuZWwKKysrIGIvY29udHJpYi90aHJpZnQuZWwKQEAgLTEsNCArMSw3IEBACi07OworOzs7IHRocmlmdC5lbCAtLS0gTWFqb3IgbW9kZSBmb3IgQXBhY2hlIFRocmlmdCBmaWxlcworCis7OyBLZXl3b3JkczogZmlsZXMKKwogOzsgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogOzsgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKIDs7IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCkBAIC0xNyw5ICsyMCwxNiBAQAogOzsgdW5kZXIgdGhlIExpY2Vuc2UuCiA7OwogCis7OzsgQ29tbWVudGFyeToKKworOzsKKworOzs7IENvZGU6CisKIChyZXF1aXJlICdmb250LWxvY2spCiAKIChkZWZ2YXIgdGhyaWZ0LW1vZGUtaG9vayBuaWwpCis7OzsjIyNhdXRvbG9hZAogKGFkZC10by1saXN0ICdhdXRvLW1vZGUtYWxpc3QgJygiXFwudGhyaWZ0XFwnIiAuIHRocmlmdC1tb2RlKSkKIAogKGRlZnZhciB0aHJpZnQtaW5kZW50LWxldmVsIDIKQEAgLTI4LDEzICszOCwxMiBAQAogOzsgc3ludGF4IGNvbG9yaW5nCiAoZGVmY29uc3QgdGhyaWZ0LWZvbnQtbG9jay1rZXl3b3JkcwogICAobGlzdAotICAgJygiIy4qJCIgLiBmb250LWxvY2stY29tbWVudC1mYWNlKSAgOzsgcGVybCBzdHlsZSBjb21tZW50cwogICAgJygiXFw8XFwoaW5jbHVkZVxcfHN0cnVjdFxcfGV4Y2VwdGlvblxcfHR5cGVkZWZcXHxjb25zdFxcfGVudW1cXHxzZXJ2aWNlXFx8ZXh0ZW5kc1xcfHZvaWRcXHxvbmV3YXlcXHx0aHJvd3NcXHxvcHRpb25hbFxcfHJlcXVpcmVkXFwpXFw+IiAuIGZvbnQtbG9jay1rZXl3b3JkLWZhY2UpICA7OyBrZXl3b3JkcwogICAgJygiXFw8XFwoYm9vbFxcfGJ5dGVcXHxpMTZcXHxpMzJcXHxpNjRcXHxkb3VibGVcXHxzdHJpbmdcXHxiaW5hcnlcXHxtYXBcXHxsaXN0XFx8c2V0XFwpXFw+IiAuIGZvbnQtbG9jay10eXBlLWZhY2UpICA7OyBidWlsdC1pbiB0eXBlcwogICAgJygiXFw8XFwoWzAtOV0rXFwpXFw+IiAuIGZvbnQtbG9jay12YXJpYWJsZS1uYW1lLWZhY2UpICAgOzsgb3JkaW5hbHMKICAgICcoIlxcPFxcKFxcdytcXClcXHMtKigiICgxIGZvbnQtbG9jay1mdW5jdGlvbi1uYW1lLWZhY2UpKSAgOzsgZnVuY3Rpb25zCiAgICApCi0gICJUaHJpZnQgS2V5d29yZHMiKQorICAiVGhyaWZ0IEtleXdvcmRzLiIpCiAKIDs7IGluZGVudGF0aW9uCiAoZGVmdW4gdGhyaWZ0LWluZGVudC1saW5lICgpCkBAIC0xMDIsMTggKzExMSwyMCBAQAogICAgICAgICAgIChpbmRlbnQtbGluZS10byBjdXItaW5kZW50KQogICAgICAgICAoaW5kZW50LWxpbmUtdG8gMCkpKSkpCiAKLTs7IEMvQysrIGNvbW1lbnRzOyBhbHNvIGFsbG93aW5nIHVuZGVyc2NvcmUgaW4gd29yZHMKKzs7IEMvQysrLSBhbmQgc2gtc3R5bGUgY29tbWVudHM7IGFsc28gYWxsb3dpbmcgdW5kZXJzY29yZSBpbiB3b3JkcwogKGRlZnZhciB0aHJpZnQtbW9kZS1zeW50YXgtdGFibGUKICAgKGxldCAoKHRocmlmdC1tb2RlLXN5bnRheC10YWJsZSAobWFrZS1zeW50YXgtdGFibGUpKSkKICAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/XyAidyIgdGhyaWZ0LW1vZGUtc3ludGF4LXRhYmxlKQotICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID8vICIuIDE0NTYiIHRocmlmdC1tb2RlLXN5bnRheC10YWJsZSkKLSAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/KiAiLiAyMyIgdGhyaWZ0LW1vZGUtc3ludGF4LXRhYmxlKQotICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID9cbiAiPiBiIiB0aHJpZnQtbW9kZS1zeW50YXgtdGFibGUpCisgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgPyMgIjwiIHRocmlmdC1tb2RlLXN5bnRheC10YWJsZSkgOyBzaC1zdHlsZSBjb21tZW50cworICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID8vICIuIDEyNCIgdGhyaWZ0LW1vZGUtc3ludGF4LXRhYmxlKSA7IGMvYysrLXN0eWxlIGNvbW1lbnRzCisgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgPyogIi4gMjNiIiB0aHJpZnQtbW9kZS1zeW50YXgtdGFibGUpCisgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgP1xuICI+IiB0aHJpZnQtbW9kZS1zeW50YXgtdGFibGUpCiAgICAgdGhyaWZ0LW1vZGUtc3ludGF4LXRhYmxlKQogICAiU3ludGF4IHRhYmxlIGZvciB0aHJpZnQtbW9kZSIpCiAKKzs7OyMjI2F1dG9sb2FkCiAoZGVmdW4gdGhyaWZ0LW1vZGUgKCkKLSAgIk1vZGUgZm9yIGVkaXRpbmcgVGhyaWZ0IGZpbGVzIgorICAiTW9kZSBmb3IgZWRpdGluZyBUaHJpZnQgZmlsZXMuIgogICAoaW50ZXJhY3RpdmUpCiAgIChraWxsLWFsbC1sb2NhbC12YXJpYWJsZXMpCiAgIChzZXQtc3ludGF4LXRhYmxlIHRocmlmdC1tb2RlLXN5bnRheC10YWJsZSkKQEAgLTEyMyw0ICsxMzQsNyBAQAogICAocnVuLWhvb2tzICd0aHJpZnQtbW9kZS1ob29rKQogICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdpbmRlbnQtbGluZS1mdW5jdGlvbikgJ3RocmlmdC1pbmRlbnQtbGluZSkKICAgKQotKHByb3ZpZGUgJ3RocmlmdC1tb2RlKQorCisocHJvdmlkZSAndGhyaWZ0KQorOzs7IHRocmlmdC5lbCBlbmRzIGhlcmUKKwpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQuc3BlYyBiL2NvbnRyaWIvdGhyaWZ0LnNwZWMKaW5kZXggZWNlZTYzMS4uYmU1MjZlMiAxMDA2NDQKLS0tIGEvY29udHJpYi90aHJpZnQuc3BlYworKysgYi9jb250cmliL3RocmlmdC5zcGVjCkBAIC0xNywzOCArMTcsMzkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLSMgVE9ETyhkcmVpc3MpOiBIYXZlIGEgUHl0aG9uIGJ1aWxkIHdpdGggYW5kIHdpdGhvdXQgdGhlIGV4dGVuc2lvbi4KKyVkZWZpbmUgd2l0aG91dF9qYXZhIDEKKyVkZWZpbmUgd2l0aG91dF9weXRob24gMQorJWRlZmluZSB3aXRob3V0X3Rlc3RzIDEKKwogJXshP3B5dGhvbl9zaXRlbGliOiAlZGVmaW5lIHB5dGhvbl9zaXRlbGliICUoJXtfX3B5dGhvbn0gLWMgImZyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgZ2V0X3B5dGhvbl9saWI7IHByaW50IGdldF9weXRob25fbGliKCkiKX0KICV7IT9weXRob25fc2l0ZWFyY2g6ICVkZWZpbmUgcHl0aG9uX3NpdGVhcmNoICUoJXtfX3B5dGhvbn0gLWMgImZyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgZ2V0X3B5dGhvbl9saWI7IHByaW50IGdldF9weXRob25fbGliKDEpIil9Ci0jIFRPRE8oZHJlaXNzKTogV2hlcmUgaXMgdGhpcyBzdXBwb3NlZCB0byBnbz8KLSV7IT90aHJpZnRfZXJsYW5nX3Jvb3Q6ICVkZWZpbmUgdGhyaWZ0X2VybGFuZ19yb290IC9vcHQvdGhyaWZ0LWVybH0KIAogTmFtZTogICAgICAgICAgIHRocmlmdAogTGljZW5zZTogICAgICAgIEFwYWNoZSBMaWNlbnNlIHYyLjAKIEdyb3VwOiAgICAgICAgICBEZXZlbG9wbWVudAogU3VtbWFyeTogICAgICAgIFJQQyBhbmQgc2VyaWFsaXphdGlvbiBmcmFtZXdvcmsKLVZlcnNpb246ICAgICAgICAyMDA4MDUyOXN2bgotRXBvY2g6ICAgICAgICAgIDEKLVJlbGVhc2U6ICAgICAgICAxCi1VUkw6ICAgICAgICAgICAgaHR0cDovL2RldmVsb3BlcnMuZmFjZWJvb2suY29tL3RocmlmdAotUGFja2FnZXI6ICAgICAgIERhdmlkIFJlaXNzIDxkcmVpc3NAZmFjZWJvb2suY29tPgorVmVyc2lvbjogICAgICAgIDEuMC4wCitSZWxlYXNlOiAgICAgICAgMAorVVJMOiAgICAgICAgICAgIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworUGFja2FnZXI6ICAgICAgIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CiBTb3VyY2UwOiAgICAgICAgJXtuYW1lfS0le3ZlcnNpb259LnRhci5negogCiBCdWlsZFJlcXVpcmVzOiAgZ2NjID49IDMuNC42CiBCdWlsZFJlcXVpcmVzOiAgZ2NjLWMrKwogCi0jIFRPRE8oZHJlaXNzKTogQ2FuIHRoZXNlIGJlIG1vdmVkIGludG8gdGhlIGluZGl2aWR1YWwgcGFja2FnZXM/Ci0laWYgJXshP3dpdGhvdXRfamF2YTogMX0KKyVpZiAwJXshP3dpdGhvdXRfamF2YToxfQogQnVpbGRSZXF1aXJlczogIGphdmEtZGV2ZWwgPj0gMDoxLjUuMAogQnVpbGRSZXF1aXJlczogIGFudCA+PSAwOjEuNi41CiAlZW5kaWYKIAotJWlmICV7IT93aXRob3V0X3B5dGhvbjogMX0KKyVpZiAwJXshP3dpdGhvdXRfcHl0aG9uOjF9CiBCdWlsZFJlcXVpcmVzOiAgcHl0aG9uLWRldmVsCiAlZW5kaWYKIAotJWlmICV7IT93aXRob3V0X2VybGFuZzogMX0KLUJ1aWxkUmVxdWlyZXM6ICBlcmxhbmcKKyVpZiAwJXshP3dpdGhvdXRfcnVieToxfQorJWRlZmluZSBnZW1fbmFtZSAle25hbWV9CitCdWlsZFJlcXVpcmVzOiAgcnVieS1kZXZlbAorQnVpbGRSZXF1aXJlczogIHJ1YnlnZW1zLWRldmVsCiAlZW5kaWYKIAogQnVpbGRSb290OiAgICAgICV7X3RtcHBhdGh9LyV7bmFtZX0tJXt2ZXJzaW9ufS0le3JlbGVhc2V9LXJvb3QtJSgle19faWRfdX0gLW4pCkBAIC03NSw2ICs3Niw3IEBACiAlZmlsZXMgbGliLWNwcAogJWRlZmF0dHIoLSxyb290LHJvb3QpCiAle19saWJkaXJ9L2xpYnRocmlmdCouc28uKgorJXtfbGliZGlyfS9saWJ0aHJpZnQqLnNvCiAKIAogJXBhY2thZ2UgbGliLWNwcC1kZXZlbApAQCAtODIsMTAgKzg0LDEwIEBACiBHcm91cDogICAgIExpYnJhcmllcwogUmVxdWlyZXM6ICAle25hbWV9ID0gJXt2ZXJzaW9ufS0le3JlbGVhc2V9CiBSZXF1aXJlczogIGJvb3N0LWRldmVsCi0laWYgJXshP3dpdGhvdXRfbGliZXZlbnQ6IDF9CislaWYgMCV7IT93aXRob3V0X2xpYmV2ZW50OjF9CiBSZXF1aXJlczogIGxpYmV2ZW50LWRldmVsID49IDEuMgogJWVuZGlmCi0laWYgJXshP3dpdGhvdXRfemxpYjogMX0KKyVpZiAwJXshP3dpdGhvdXRfemxpYjoxfQogUmVxdWlyZXM6ICB6bGliLWRldmVsCiAlZW5kaWYKIApAQCAtOTYsMTEgKzk4LDEwIEBACiAlZGVmYXR0cigtLHJvb3Qscm9vdCkKICV7X2luY2x1ZGVkaXJ9L3RocmlmdC8KICV7X2xpYmRpcn0vbGlidGhyaWZ0Ki4qYQotJXtfbGliZGlyfS9saWJ0aHJpZnQqLnNvCiAle19saWJkaXJ9L3BrZ2NvbmZpZy90aHJpZnQqLnBjCiAKIAotJWlmICV7IT93aXRob3V0X2phdmE6IDF9CislaWYgMCV7IT93aXRob3V0X2phdmE6MX0KICVwYWNrYWdlIGxpYi1qYXZhCiBTdW1tYXJ5OiAgIFRocmlmdCBKYXZhIGxpYnJhcnkKIEdyb3VwOiAgICAgTGlicmFyaWVzCkBAIC0xMTUsNyArMTE2LDcgQEAKICVlbmRpZgogCiAKLSVpZiAleyE/d2l0aG91dF9weXRob246IDF9CislaWYgMCV7IT93aXRob3V0X3B5dGhvbjoxfQogJXBhY2thZ2UgbGliLXB5dGhvbgogU3VtbWFyeTogVGhyaWZ0IFB5dGhvbiBsaWJyYXJ5CiBHcm91cDogICBMaWJyYXJpZXMKQEAgLTEyOSwxOCArMTMwLDMyIEBACiAlZW5kaWYKIAogCi0laWYgJXshP3dpdGhvdXRfZXJsYW5nOiAxfQotJXBhY2thZ2UgbGliLWVybGFuZwotU3VtbWFyeTogIFRocmlmdCBQeXRob24gbGlicmFyeQotR3JvdXA6ICAgIExpYnJhcmllcwotUmVxdWlyZXM6IGVybGFuZworJWlmIDAleyE/d2l0aG91dF9ydWJ5OjF9CislcGFja2FnZSAtbiBydWJ5Z2VtLSV7Z2VtX25hbWV9CitTdW1tYXJ5OiBUaHJpZnQgUnVieSBsaWJyYXJ5CitHcm91cDogICBMaWJyYXJpZXMKK09ic29sZXRlczogJXtuYW1lfS1saWItcnVieQogCi0lZGVzY3JpcHRpb24gbGliLWVybGFuZwotRXJsYW5nIGxpYnJhcmllcyBmb3IgVGhyaWZ0LgorJWRlc2NyaXB0aW9uIC1uIHJ1YnlnZW0tJXtnZW1fbmFtZX0KK1J1YnkgbGlicmFyaWVzIGZvciBUaHJpZnQuCiAKLSVmaWxlcyBsaWItZXJsYW5nCislZmlsZXMgLW4gcnVieWdlbS0le2dlbV9uYW1lfQogJWRlZmF0dHIoLSxyb290LHJvb3QpCi0le3RocmlmdF9lcmxhbmdfcm9vdH0KKyV7Z2VtX2Rpcn0vKgorJWVuZGlmCisKKworJWlmIDAleyE/d2l0aG91dF9waHA6MX0KKyVwYWNrYWdlIGxpYi1waHAKK1N1bW1hcnk6IFRocmlmdCBQSFAgbGlicmFyeQorR3JvdXA6ICAgTGlicmFyaWVzCisKKyVkZXNjcmlwdGlvbiBsaWItcGhwCitQSFAgbGlicmFyaWVzIGZvciBUaHJpZnQuCisKKyVmaWxlcyBsaWItcGhwCislZGVmYXR0cigtLHJvb3Qscm9vdCkKKy91c3IvbGliL3BocC8qCiAlZW5kaWYKIAogCkBAIC0xNDgsNTkgKzE2Myw4OSBAQAogJXNldHVwIC1xCiAKICVidWlsZAotIyBUT0RPKGRyZWlzcyk6IEltcGxlbWVudCBhIHNpbmdsZSAtLXdpdGhvdXQtYnVpbGQta2x1ZGdlcy4KK1tbIC1lIE1ha2VmaWxlLmluIF1dIHx8IC4vYm9vdHN0cmFwLnNoCitleHBvcnQgR0VNX0hPTUU9JHtQV0R9Ly5nZW0taG9tZQorZXhwb3J0IFJVQllMSUI9JHtQV0R9L2xpYi9yYi9saWIKICVjb25maWd1cmUgXAogICAlez93aXRob3V0X2xpYmV2ZW50OiAtLXdpdGhvdXQtbGliZXZlbnQgfSBcCiAgICV7P3dpdGhvdXRfemxpYjogICAgIC0td2l0aG91dC16bGliICAgICB9IFwKLSAgLS13aXRob3V0LWphdmEgXAorICAlez93aXRob3V0X3Rlc3RzOiAgICAtLXdpdGhvdXQtdGVzdHMgICAgfSBcCisgICV7P3dpdGhvdXRfamF2YTogICAgIC0td2l0aG91dC1qYXZhICAgICB9IFwKKyAgJXs/d2l0aG91dF9weXRob246ICAgLS13aXRob3V0LXB5dGhvbiAgIH0gXAorICAlez93aXRob3V0X3J1Ynk6ICAgICAtLXdpdGhvdXQtcnVieSAgICAgfSBcCisgICV7P3dpdGhvdXRfcGhwOiAgICAgIC0td2l0aG91dC1waHAgICAgICB9IFwKKyAgJXshP3dpdGhvdXRfcGhwOiAgICAgUEhQX1BSRUZJWD0ke1JQTV9CVUlMRF9ST09UfS91c3IvbGliL3BocCB9IFwKICAgLS13aXRob3V0LWNzaGFycCBcCi0gIC0td2l0aG91dC1weSBcCiAgIC0td2l0aG91dC1lcmxhbmcgXAogCi1tYWtlCislaWYgMCV7IT93aXRob3V0X3J1Ynk6MX0KK2V2YWwgJChncmVwICJeV0lUSF9SVUJZX1RSVUUiIGNvbmZpZy5sb2cpCitpZiBbWyAiJHtXSVRIX1JVQllfVFJVRX0iICE9ICIiIF1dOyB0aGVuCisgIHNldCAreAorICBlY2hvICIiCisgIGVjaG8gImNvbmZpZ3VyZSBkZXRlcm1pbmVkIHRoYXQgcnVieSByZXF1aXJlbWVudHMgYXJlIG1pc3NpbmcgKGJ1bmRsZXIgZ2VtPyksIGVpdGhlciBpbnN0YWxsIG1pc3NpbmcgY29tcG9uZW50cyIgPiYyCisgIGVjaG8gIm9yIGRpc2FibGUgdGhlIHJ1Ynkgc3ViLXBhY2thZ2VzIGFzIGZvbGxvd3M6IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiYyCisgIGVjaG8gIiAgICAgcnBtYnVpbGQgLUQnJXdpdGhvdXRfcnVieSAxJyAuLi4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiYyCisgIGVjaG8gIiIKKyAgZXhpdCAxCitmaQorJWVuZGlmCiAKLSVpZiAleyE/d2l0aG91dF9qYXZhOiAxfQorbWFrZSAlez9fc21wX21mbGFnc30KKworJWlmIDAleyE/d2l0aG91dF9qYXZhOjF9CiBjZCBsaWIvamF2YQogJWFudAogY2QgLi4vLi4KICVlbmRpZgogCi0laWYgJXshP3dpdGhvdXRfcHl0aG9uOiAxfQorJWlmIDAleyE/d2l0aG91dF9weXRob246MX0KIGNkIGxpYi9weQogQ0ZMQUdTPSIle29wdGZsYWdzfSIgJXtfX3B5dGhvbn0gc2V0dXAucHkgYnVpbGQKIGNkIC4uLy4uCiAlZW5kaWYKIAotJWlmICV7IT93aXRob3V0X2VybGFuZzogMX0KLWNkIGxpYi9lcmwKLW1ha2UKLWNkIC4uLy4uCislaWYgMCV7IT93aXRob3V0X3J1Ynk6MX0KKyVnZW1faW5zdGFsbCAtbiBsaWIvcmIvdGhyaWZ0Ki5nZW0KICVlbmRpZgogCiAlaW5zdGFsbAorZXhwb3J0IEdFTV9IT01FPSR7UFdEfS8uZ2VtLWhvbWUKK2V4cG9ydCBSVUJZTElCPSR7UFdEfS9saWIvcmIvbGliCiAlbWFrZWluc3RhbGwKK2xuIC1zIGxpYnRocmlmdC0le3ZlcnNpb259LnNvICR7UlBNX0JVSUxEX1JPT1R9JXtfbGliZGlyfS9saWJ0aHJpZnQuc28uMAorbG4gLXMgbGlidGhyaWZ0bmItJXt2ZXJzaW9ufS5zbyAke1JQTV9CVUlMRF9ST09UfSV7X2xpYmRpcn0vbGlidGhyaWZ0bmIuc28uMAorbG4gLXMgbGlidGhyaWZ0ei0le3ZlcnNpb259LnNvICR7UlBNX0JVSUxEX1JPT1R9JXtfbGliZGlyfS9saWJ0aHJpZnR6LnNvLjAKIAotJWlmICV7IT93aXRob3V0X2phdmE6IDF9CislaWYgMCV7IT93aXRob3V0X2phdmE6MX0KIG1rZGlyIC1wICRSUE1fQlVJTERfUk9PVCV7X2phdmFkaXJ9Ci1jcCAtcCBsaWIvamF2YS8qLmphciAkUlBNX0JVSUxEX1JPT1Qle19qYXZhZGlyfQorY3AgLXAgbGliL2phdmEvYnVpbGQvKi5qYXIgJFJQTV9CVUlMRF9ST09UJXtfamF2YWRpcn0KICVlbmRpZgogCi0laWYgJXshP3dpdGhvdXRfcHl0aG9uOiAxfQorJWlmIDAleyE/d2l0aG91dF9weXRob246MX0KIGNkIGxpYi9weQogJXtfX3B5dGhvbn0gc2V0dXAucHkgaW5zdGFsbCAtTzEgLS1za2lwLWJ1aWxkIC0tcm9vdCAkUlBNX0JVSUxEX1JPT1QKIGNkIC4uLy4uCiAlZW5kaWYKIAotJWlmICV7IT93aXRob3V0X2VybGFuZzogMX0KLW1rZGlyIC1wICR7UlBNX0JVSUxEX1JPT1R9JXt0aHJpZnRfZXJsYW5nX3Jvb3R9Ci1jcCAtciBsaWIvZXJsL2ViaW4gJHtSUE1fQlVJTERfUk9PVH0le3RocmlmdF9lcmxhbmdfcm9vdH0KKyVpZiAwJXshP3dpdGhvdXRfcnVieToxfQorbWtkaXIgLXAgJXtidWlsZHJvb3R9JXtnZW1fZGlyfQorY3AgLWEgLi8le2dlbV9kaXJ9LyogJXtidWlsZHJvb3R9JXtnZW1fZGlyfS8KICVlbmRpZgogCi0KICVjbGVhbgogcm0gLXJmICR7UlBNX0JVSUxEX1JPT1R9CiAKIAorJXBvc3QKK3VtYXNrIDAwNworL3NiaW4vbGRjb25maWcgPiAvZGV2L251bGwgMj4mMQorCisKKyVwb3N0dW4KK3VtYXNrIDAwNworL3NiaW4vbGRjb25maWcgPiAvZGV2L251bGwgMj4mMQorCiAlY2hhbmdlbG9nCi0qIFdlZCBNYXkgMjggMjAwOCBEYXZpZCBSZWlzcyA8ZHJlaXNzQGZhY2Vib29rLmNvbT4gLSAyMDA4MDUyOXN2bgotLSBJbml0aWFsIGJ1aWxkLCBiYXNlZCBvbiB0aGUgd29yayBvZiBLZXZpbiBTbWl0aCBhbmQgQmVuIE1hdXJlci4KKyogV2VkIE9jdCAxMCAyMDEyIFRocmlmdCBEZXYgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4gCistIFRocmlmdCAwLjkuMCByZWxlYXNlLgpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQudmltIGIvY29udHJpYi90aHJpZnQudmltCmluZGV4IDc5Y2U1NDcuLjYyMzE5NTUgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvdGhyaWZ0LnZpbQorKysgYi9jb250cmliL3RocmlmdC52aW0KQEAgLTUxLDggKzUxLDggQEAKIHN5biBrZXl3b3JkIHRocmlmdEtleXdvcmQgbmFtZXNwYWNlCiBzeW4ga2V5d29yZCB0aHJpZnRLZXl3b3JkIHhzZF9hbGwgeHNkX29wdGlvbmFsIHhzZF9uaWxsYWJsZSB4c2RfYXR0cnMKIHN5biBrZXl3b3JkIHRocmlmdEtleXdvcmQgaW5jbHVkZSBjcHBfaW5jbHVkZSBjcHBfdHlwZSBjb25zdCBvcHRpb25hbCByZXF1aXJlZAotc3luIGtleXdvcmQgdGhyaWZ0QmFzaWNUeXBlcyB2b2lkIGJvb2wgYnl0ZSBpMTYgaTMyIGk2NCBkb3VibGUgc3RyaW5nIGJpbmFyeQotc3luIGtleXdvcmQgdGhyaWZ0U3RydWN0dXJlIG1hcCBsaXN0IHNldCBzdHJ1Y3QgdHlwZWRlZiBleGNlcHRpb24gZW51bSB0aHJvd3MKK3N5biBrZXl3b3JkIHRocmlmdEJhc2ljVHlwZXMgdm9pZCBib29sIGJ5dGUgaTggaTE2IGkzMiBpNjQgZG91YmxlIHN0cmluZyBiaW5hcnkKK3N5biBrZXl3b3JkIHRocmlmdFN0cnVjdHVyZSBtYXAgbGlzdCBzZXQgc3RydWN0IHR5cGVkZWYgZXhjZXB0aW9uIGVudW0gdGhyb3dzIHVuaW9uCiAKICIgU3BlY2lhbAogc3luIG1hdGNoIHRocmlmdFNwZWNpYWwgIlxkXCs6IgpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnRfZHVtcC5jcHAgYi9jb250cmliL3RocmlmdF9kdW1wLmNwcAppbmRleCAwZGRmY2VjLi41OWM4YWM4IDEwMDY0NAotLS0gYS9jb250cmliL3RocmlmdF9kdW1wLmNwcAorKysgYi9jb250cmliL3RocmlmdF9kdW1wLmNwcApAQCAtMjAsMTEgKzIwLDExIEBACiAjaW5jbHVkZSA8Y3N0ZGxpYj4KICNpbmNsdWRlIDxpb3N0cmVhbT4KIAotI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9URkRUcmFuc3BvcnQuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9URGVidWdQcm90b2NvbC5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RQcm90b2NvbFRhcC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVGFwLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBib29zdDo6c2hhcmVkX3B0cjsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9NYWtlZmlsZSBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWUwM2I4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL01ha2VmaWxlCkBAIC0wLDAgKzEsMjUgQEAKK1RIUklGVF9ESVIgPS4uLy4uCitJTkNTX0RJUlMgID0tSSR7VEhSSUZUX0RJUn0vbGliL2NwcC9zcmMgLUkuCitUSFJJRlRfTElCID0ke1RIUklGVF9ESVJ9L2xpYi9jcHAvLmxpYnMvbGlidGhyaWZ0LmEKK0JPT1NUX0xJQiAgPQorQ1BQX0RFRlMgICA9CitDUFBfT1BUUyAgID0tV2FsbCAtTzIKKworR0VOX1NSQyAgICA9IGdlbi1jcHAvU2FtcGxlU2VydmljZS5jcHAgIFwKKyAgICAgICAgICAgICBnZW4tY3BwL1NhbXBsZV90eXBlcy5jcHAgICBcCisgICAgICAgICAgICAgZ2VuLWNwcC9TYW1wbGVDYWxsYmFjay5jcHAgXAorICAgICAgICAgICAgIGdlbi1jcHAvU2FtcGxlX2NvbnN0YW50cy5jcHAKK0dFTl9JTkMgICAgPSAtSWdlbi1jcHAKKworZGVmYXVsdDogc2VydmVyIGNsaWVudAorLlBIT05ZOiBzZXJ2ZXIgY2xpZW50CisKK3NlcnZlcjoKKwlnKysgJHtDUFBfT1BUU30gJHtDUFBfREVGU30gLW8gc2VydmVyL3NlcnZlciAke0dFTl9JTkN9ICR7SU5DU19ESVJTfSBzZXJ2ZXIvc2VydmVyLmNwcCAke0dFTl9TUkN9ICR7VEhSSUZUX0xJQn0gJHtCT09TVF9MSUJ9CisKK2NsaWVudDoKKwlnKysgJHtDUFBfT1BUU30gJHtDUFBfREVGU30gLW8gY2xpZW50L2NsaWVudCAke0dFTl9JTkN9ICR7SU5DU19ESVJTfSBjbGllbnQvY2xpZW50LmNwcCAke0dFTl9TUkN9ICR7VEhSSUZUX0xJQn0gJHtCT09TVF9MSUJ9CisKK2NsZWFuOgorCSQoUk0pIC1yIGNsaWVudC9jbGllbnQgc2VydmVyL3NlcnZlcgorCmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvUkVBRE1FLm1kIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWRmYzBhCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL1JFQURNRS5tZApAQCAtMCwwICsxLDYxIEBACitUaHJpZnQgdHJhbnNwb3J0IHNhbXBsZSBwcm9qZWN0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgY3Jvc3MtcGxhdGZvcm0gcHJvamVjdCBoYXMgYmVlbiBidWlsdCB3aXRoIFdpbmRvd3MgVmlzdWFsIFN0dWRpbyAxMCBhbmQgCitPU1ggMTAuNy4xJ3MgZysrLiAgVGhlIGNsaWVudCBhbmQgc2VydmVyIHN1cHBvcnQgc29ja2V0IGFuZCBwaXBlIHRyYW5zcG9ydHMgCit0aHJvdWdoIGNvbW1hbmQtbGluZSBzd2l0Y2hlcy4KKworV2luZG93cyBzdXBwb3J0cyBib3RoIG5hbWVkICYgYW5vbnltb3VzIHBpcGVzOyAqTklYIGdldHMgb25seSBuYW1lZCAKKydwaXBlcycgYXQgdGhpcyB0aW1lLgorCitXaW5kb3dzLW9ubHkgYXQgdGhpcyB0aW1lOgorVGhlIGNsaWVudCAmIHNlcnZlciBhcmUgZG91YmxlLWVuZGVkLiBCb3RoIHNpZGVzIHJ1biBhIHNlcnZlciBhbmQgY2xpZW50IHRvIAorZW5hYmxlIGZ1bGwgZHVwbGV4IGJpZGlyZWN0aW9uYWwgZXZlbnQgc2lnbmFsaW5nLiBUaGV5IGFyZSBzaW1wbGUgY29tbWFuZCAKK2xpbmUgYXBwcy4gVGhlIHNlcnZlciBydW5zIHVudGlsIGl0J3MgYWJvcnRlZCAoQ3RsLUMpLiBUaGUgY2xpZW50IGNvbm5lY3RzIHRvCit0aGUgc2VydmVyLCBpbmZvcm1zIHRoZSBzZXJ2ZXIgb2YgaXRzIGxpc3RlbmluZyBwaXBlL3BvcnQsIHJ1bnMgc29tZSBtb3JlIFJQQ3MgCithbmQgZXhpdHMuIFRoZSBzZXJ2ZXIgYWxzbyBtYWtlcyBSUEMgY2FsbHMgdG8gdGhlIGNsaWVudCB0byBkZW1vbnN0cmF0ZSAKK2JpZGlyZWN0aW9uYWwgb3BlcmF0aW9uLgorCitQcmVxdWlzaXRlczoKK0Jvb3N0IC0tIHRlc3RlZCB3aXRoIEJvb3N0IDEuNDcsIG90aGVyIHZlcnNpb25zIG1heSB3b3JrLgorbGlidGhyaWZ0IGxpYnJhcnkgLS0gYnVpbGQgdGhlIGxpYnJhcnkgdW5kZXIgInRocmlmdC9saWIvY3BwLyIKK3RocmlmdCBJREwgY29tcGlsZXIgLS0gZG93bmxvYWQgZnJvbSBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvZG93bmxvYWQvIAorICAgb3IgYnVpbGQgZnJvbSAidGhyaWZ0L2NvbXBpbGVyL2NwcCIuICBUaGUgSURMIGNvbXBpbGVyIHZlcnNpb24gc2hvdWxkCisgICBtYXRjaCB0aGUgdGhyaWZ0IHNvdXJjZSBkaXN0cmlidXRpb24ncyB2ZXJzaW9uLiBGb3IgaW5zdGFuY2UsIHRocmlmdC0wLjkuMAorICAgaGFzIGEgZGlmZmVyZW50IGRpcmVjdG9yeSBzdHJ1Y3R1cmUgdGhhbiB0aHJpZnQtMC44LjAgYW5kIHRoZSBnZW5lcmF0ZWQKKyAgIGZpbGVzIGFyZSBub3QgY29tcGF0aWJsZS4KKworTm90ZTogQnVsZGluZyB0aGUgdGhyaWZ0IElETCBjb21waWxlciBhbmQgbGlicmFyeSBhcmUgYmV5b25kIHRoZSBzY29wZQorb2YgdGhpcyBhcnRpY2xlLiBQbGVhc2UgcmVmZXIgdG8gdGhlIFRocmlmdCBkb2N1bWVudGF0aW9uIGluIHRoZSByZXNwZWN0aXZlCitkaXJlY3RvcmllcyBhbmQgb25saW5lLgorCisKK01pY3Jvc29mdCBXaW5kb3dzIHdpdGggVmlzdWFsIFN0dWRpbyAxMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ29weSB0aGUgSURMIGNvbXBpbGVyICd0aHJpZnQuZXhlJyB0byB0aGlzIHByb2plY3QgZm9sZGVyIG9yIHRvIGEgbG9jYXRpb24gaW4gdGhlIHBhdGguCitSdW4gdGhyaWZ0bWUuYmF0IHRvIGdlbmVyYXRlIHRoZSBpbnRlcmZhY2Ugc291cmNlIGZyb20gdGhlIHRocmlmdCBmaWxlcy4KKworT3BlbiB0cmFuc3BvcnQtc2FtcGxlLnNsbiBhbmQuLi4KK0FkYXB0IHRoZSBCb29zdCBwYXRocyBmb3IgdGhlIGNsaWVudCBhbmQgc2VydmVyIHByb2plY3RzLiBSaWdodC1jbGljayBvbiBlYWNoIHByb2plY3QsIHNlbGVjdAorUHJvcGVydGllcywgdGhlbjoKK0NvbmZpZ3VyYXRpb24gUHJvcGVydGllcyAtPiBDL0MrKyAtPiBHZW5lcmFsIC0+IEFkZGl0aW9uYWwgSW5jbHVkZSBEaXJlY3RvcmllcworQ29uZmlndXJhdGlvbiBQcm9wZXJ0aWVzIC0+IExpbmtlciAtPiBHZW5lcmFsIC0+IEFkZGl0aW9uYWwgSW5jbHVkZSBEaXJlY3RvcmllcworCitUaGUgc3RvY2sgcGF0aCBhc3N1bWVzIHRoYXQgQm9vc3QgaXMgbG9jYXRlZCBhdCB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgdGhyaWZ0IHJlcG8gcm9vdC4KKworUnVuIHRoZSBmb2xsb3dpbmcgaW4gc2VwYXJhdGUgY29tbWFuZCBwcm9tcHRzIGZyb20gdGhlIFJlbGVhc2Ugb3IgRGVidWcgCitidWlsZCBmb2xkZXI6Cisgc2VydmVyLmV4ZSAtbnAgdGVzdAorIGNsaWVudC5leGUgLW5wIHRlc3QKKworCisqTklYIGZsYXZvcnMKKy0tLS0tLS0tLS0tLQorQnVpbGQgdGhlIHRocmlmdCBjcHAgbGlicmFyeS4KK0J1aWxkIHRoZSBJREwgY29tcGlsZXIgYW5kIGNvcHkgaXQgdG8gdGhpcyBwcm9qZWN0IGZvbGRlci4KK1J1biB0aHJpZnRtZS5zaCB0byBnZW5lcmF0ZSB0aGUgaW50ZXJmYWNlIHNvdXJjZSBmcm9tIHRoZSB0aHJpZnQgZmlsZXMuCitSdW4gJ21ha2UnCisKK1J1biB0aGUgZm9sbG93aW5nIGluIHNlcGFyYXRlIHNoZWxsczoKKyBzZXJ2ZXIvc2VydmVyIC1ucCAvdG1wL3Rlc3QKKyBjbGllbnQvY2xpZW50IC1ucCAvdG1wL3Rlc3QKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9TYW1wbGUudGhyaWZ0IGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL1NhbXBsZS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0MGUyNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9TYW1wbGUudGhyaWZ0CkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgdHJhbnNwb3J0LXNhbXBsZSB0aHJpZnQgSURMIGZpbGUgLgorIEV4ZWN1dGUgdGhyaWZ0bWUuYmF0IHVuZGVyIFdpbmRvd3MgdG8gZ2VuZXJhdGUgdGhlIGNwcCBzdHVicyBmcm9tIHRoaXMgSURMLgorICovCisKKy8vIFNlZSB0aHJpZnQvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0IGFuZCBzaGFyZWQudGhyaWZ0IGZvciBtb3JlIGV4dGVuc2l2ZSBleGFtcGxlcy4KKworCituYW1lc3BhY2UgY3BwIFNhbXBsZQorbmFtZXNwYWNlIGphdmEgU2FtcGxlCituYW1lc3BhY2UgcGVybCBTYW1wbGUKKworLy9UaGlzIHN0cnVjdCBpcyBub3QgdXNlZCBpbiB0aGUgc2FtcGxlLiBTaG93biBoZXJlIGZvciBpbGx1c3RyYXRpdmUgcHVycG9zZXMgb25seS4KKy8vCitzdHJ1Y3QgU2FtcGxlU3RydWN0Cit7CisgIDE6IGkzMiBrZXkKKyAgMjogc3RyaW5nIHZhbHVlCit9CisKKworLy9BIHNlcnZpY2UgY29udGFpbnMgdGhlIFJQQyhzKS4KKy8vCitzZXJ2aWNlIFNhbXBsZVNlcnZpY2UKK3sKKyAgc3RyaW5nIEhlbGxvVGhlcmUoMTpzdHJpbmcgSGVsbG9TdHJpbmcpLAorICB2b2lkIFNlcnZlckRvU29tZXRoaW5nKCksCisKKyAgLy9DbGllbnQgY2FsbHMgdGhpcyB0byB0ZWxsIHNlcnZlciB3aGljaCBwb3J0IHRvIGNvbm5lY3QgYmFjayBvbi4KKyAgdm9pZCBDbGllbnRTaWRlTGlzdGVuUG9ydCgxOmkxNiBQb3J0KSwKKyAgLy9OYW1lZCBwaXBlIHZlcnNpb24KKyAgdm9pZCBDbGllbnRTaWRlUGlwZU5hbWUoMTpzdHJpbmcgbmFtZSksCit9CisKKy8vU2FtcGxlIFJQQyBvbiB0aGUgJ2NsaWVudCcgc2lkZSB0aGF0IHRoZSBtYXN0ZXIgc2VydmVyIGNhbiBjYWxsLgorc2VydmljZSBTYW1wbGVDYWxsYmFjaworeworICB2b2lkIHBpbmdjbGllbnQoKSwKK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9UaHJpZnRDb21tb24uY3BwIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL1RocmlmdENvbW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBlYmY3YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9UaHJpZnRDb21tb24uY3BwCkBAIC0wLDAgKzEsMzcgQEAKKy8vIFRocmlmdENvbW1vbi5jcHAgOiBDb21tb24gZnVuY3Rpb25zIGZvciBzYW1wbGUgVGhyaWZ0IGNsaWVudCBhbmQgc2VydmVyCisvLworCisjaW5jbHVkZSAiVGhyaWZ0Q29tbW9uLmgiCisKK25hbWVzcGFjZSB0aHJpZnRjb21tb24KK3sKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvL0xhdW5jaCBjaGlsZCBwcm9jZXNzIGFuZCBwYXNzIFIvVyBhbm9ueW1vdXMgcGlwZSBoYW5kbGVzIG9uIGNtZCBsaW5lLgorCS8vVGhpcyBpcyBhIHNpbXBsZSBleGFtcGxlIGFuZCBkb2VzIG5vdCBpbmNsdWRlIGVsZXZhdGlvbiBvciBvdGhlciAKKwkvL2FkdmFuY2VkIGZlYXR1cmVzLgorCS8vCisJYm9vbCBMYXVuY2hBbm9uUGlwZUNoaWxkKHN0ZDo6c3RyaW5nIGFwcCwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gdHJhbnNwb3J0KQorCXsKKyNpZmRlZiBfV0lOMzIKKwkJUFJPQ0VTU19JTkZPUk1BVElPTiBwaTsKKwkJU1RBUlRVUElORk9BIHNpOworCQlHZXRTdGFydHVwSW5mb0EoJnNpKTsgIC8vc2V0IHN0YXJ0dXBpbmZvIGZvciB0aGUgc3Bhd25lZCBwcm9jZXNzCisJCWNoYXIgaGFuZGxlc1tNQVhfUEFUSF07ICAvL1N0b3JlcyBwaXBlIGhhbmRsZXMgY29udmVydGVkIHRvIHRleHQKKworCQlzcHJpbnRmKGhhbmRsZXMsICIlcyAlZCAlZCIsIGFwcC5jX3N0cigpLAorCQkJKGludClib29zdDo6c2hhcmVkX2R5bmFtaWNfY2FzdDxUUGlwZVNlcnZlcj4odHJhbnNwb3J0KS0+Z2V0Q2xpZW50UmRQaXBlSGFuZGxlKCksCisJCQkoaW50KWJvb3N0OjpzaGFyZWRfZHluYW1pY19jYXN0PFRQaXBlU2VydmVyPih0cmFuc3BvcnQpLT5nZXRDbGllbnRXcnRQaXBlSGFuZGxlKCkpOworCisJCS8vc3Bhd24gdGhlIGNoaWxkIHByb2Nlc3MKKwkJaWYgKCFDcmVhdGVQcm9jZXNzQShOVUxMLCBoYW5kbGVzLCBOVUxMLE5VTEwsVFJVRSwwLE5VTEwsTlVMTCwmc2ksJnBpKSkKKwkJeworCQkJR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXIgQ3JlYXRlUHJvY2VzcyBmYWlsZWQsIEdMRT0iLCBHZXRMYXN0RXJyb3IoKSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlDbG9zZUhhbmRsZShwaS5oVGhyZWFkKTsKKwkJQ2xvc2VIYW5kbGUocGkuaFByb2Nlc3MpOworI2VuZGlmCisJCXJldHVybiB0cnVlOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9UaHJpZnRDb21tb24uaCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9UaHJpZnRDb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTZkODdkCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL1RocmlmdENvbW1vbi5oCkBAIC0wLDAgKzEsMjA1IEBACisvLyBUaHJpZnRDb21tb24uaCA6IENvbW1vbiBpbmNsdWRlcywgbmFtZXNwYWNlcyBhbmQgdGVtcGxhdGVzIAorLy8gZm9yIHNhbXBsZSBUaHJpZnQgY2xpZW50IGFuZCBzZXJ2ZXIKKy8vCisvLyBBZGQgdGhlIGZvbGxvd2luZyBwYXRocyB0byB0aGUgUHJvamVjdCdzIHByb3BlcnRpZXM6CisvLworLy8gQ29uZmlndXJhdGlvbiBQcm9wZXJ0aWVzIC0+IEMvQysrIC0+IEdlbmVyYWwtPiBBZGRpdGlvbmFsIEluY2x1ZGUgRGlyZWN0b3JpZXMgLS0KKy8vIC4uLzsuLi8uLi8uLi9saWIvY3BwL3NyYzsuLi8uLi8uLi8uLi9ib29zdDsuLi8uLi8uLi8uLi9ib29zdC9ib29zdC90cjE7CisvLworLy8gQ29uZmlndXJhdGlvbiBQcm9wZXJ0aWVzIC0+IExpbmtlciAtPiBHZW5lcmFsIC0+IEFkZGl0aW9uYWwgTGlicmFyeSBEaXJlY3RvcmllcyAtLQorLy8gLi4vLi4vLi4vbGliL2NwcC8kKENvbmZpZ3VyYXRpb24pOy4uLy4uLy4uLy4uL0Jvb3N0L2xpYgorLy8KKy8vIENvbmZpZ3VyYXRpb24gUHJvcGVydGllcyAtPiBMaW5rZXIgLT4gSW5wdXQgLT4gQWRkaXRpb25hbCBEZXBlbmRlbmNpZXMgLS0KKy8vIGxpYnRocmlmdC5saWIKKy8vCisvLyAuLi4gYWRqdXN0IHJlbGF0aXZlIHBhdGhzIGFzIG5lY2Vzc2FyeS4KKy8vCisKKyNpZmRlZiBfV0lOMzIgLy90aHJpZnQgaXMgY3Jhc2hpbmcgd2hlbiB1c2luZyBib29zdCB0aHJlYWRzIG9uIE1hYyBPU1gKKyNlbHNlCisjICBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjICBpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjZW5kaWYKKworLy9+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKy8vIFJlcXVpcmVkIEluY2x1ZGVzCisvLydzZXJ2ZXInIHNpZGUgI2luY2x1ZGVzCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgorLy8nY2xpZW50JyBzaWRlICNpbmNsdWRlcworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorCisKKy8vfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKKy8vfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisvLyBSZXF1aXJlZCBOYW1lc3BhY2VzCisvLydzZXJ2ZXInIHNpZGUgbmFtZXNwYWNlcwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OworLy9jb21tb24gbmFtZXNwYWNlcwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OworLy91c2luZyBuYW1lc3BhY2UgYm9vc3Q7IC8vdXNpbmcgbnMgYm9vc3QgY2FuIGludHJvZHVjZSB0eXBlIGNvbmZsaWN0cworLy9+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworbmFtZXNwYWNlIHRocmlmdGNvbW1vbgoreworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vCisJLy9TdGFydCB0aGUgdGhyaWZ0ICdzZXJ2ZXInIChib3RoIHNlcnZlciAmIGNsaWVudCBzaWRlIHJ1biBvbmUgZm9yIGJpZGlyIGV2ZW50IHNpZ25hbGluZykKKwkvLyAqKiogVGhpcyBmdW5jdGlvbiB0ZW1wbGF0ZSB3aWxsIGJsb2NrICoqKgorCS8vCisJdGVtcGxhdGUgPGNsYXNzIE15SGFuZGxlciwgY2xhc3MgTXlQcm9jZXNzb3I+CisJdm9pZCBSdW5UaHJpZnRTZXJ2ZXIgKGJvb3N0OjpzaGFyZWRfcHRyPE15SGFuZGxlcj4gaG5kbHIsIAorCQkgICAgICAgICAgICAgICAgICBpbnQgTnVtVGhyZWFkcywgCisJCQkJCQkgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKKwkJCQkJCSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlcj4gJnNlcnZlcikKKwl7CisjaWZkZWYgX1dJTjMyCisJCWlmICghaG5kbHIuZ2V0KCkpCisJCQl0aHJvdyBzdGQ6OmV4Y2VwdGlvbigiUnVuVGhyaWZ0U2VydmVyKCkgaW52YWxpZCBoYW5kbGVyIik7CisJCWlmICghdHJhbnNwb3J0LmdldCgpKQorCQkJdGhyb3cgc3RkOjpleGNlcHRpb24oIlJ1blRocmlmdFNlcnZlcigpIGludmFsaWQgdHJhbnNwb3J0Iik7CisjZWxzZQorCQlpZiAoICFobmRsci5nZXQoKSB8fCAhdHJhbnNwb3J0LmdldCgpICkKKwkJCXRocm93IHN0ZDo6ZXhjZXB0aW9uKCk7CisjZW5kaWYKKworCQlib29zdDo6c2hhcmVkX3B0cjxNeUhhbmRsZXI+IGhhbmRsZXIoaG5kbHIpOworCQlib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IobmV3IE15UHJvY2Vzc29yKGhhbmRsZXIpKTsKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRmYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOworCQlib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwZmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKKworCQlpZihOdW1UaHJlYWRzIDw9IDEpCisJCXsJLy9TaW5nbGUtdGhyZWFkZWQgc2VydmVyCisJCQlzZXJ2ZXIucmVzZXQobmV3IFRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkpOworCQl9CisJCWVsc2UKKwkJewkvL011bHRpLXRocmVhZGVkIHNlcnZlcgorCQkJYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoTnVtVGhyZWFkcyk7CisJCQlib29zdDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkgPSBib29zdDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSk7CisJCQl0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOworCQkJdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKKwkJCXNlcnZlci5yZXNldChuZXcgVFRocmVhZFBvb2xTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSwgdGhyZWFkTWFuYWdlcikpOworCQl9CisKKwkJcHJpbnRmKCJTdGFydGluZyB0aGUgJ3NlcnZlcicuLi5cbiIpOworCQlzZXJ2ZXItPnNlcnZlKCk7CisJCXByaW50ZigiZG9uZS5cbiIpOworCX0KKworCS8vIFRocmlmdCBzZXJ2ZXIgd3JhcHBlciBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBwaXBlIG5hbWUuCisJLy8gQSBoYW5kbGVyIG11c3QgYmUgcGFzc2VkIGluIHRvIHRoaXMgdmVyc2lvbi4KKwl0ZW1wbGF0ZSA8Y2xhc3MgTXlIYW5kbGVyLCBjbGFzcyBNeVByb2Nlc3Nvcj4KKwl2b2lkIFJ1blRocmlmdFNlcnZlciAoYm9vc3Q6OnNoYXJlZF9wdHI8TXlIYW5kbGVyPiBobmRsciwgaW50IE51bVRocmVhZHMsIHN0ZDo6c3RyaW5nIHBpcGVuYW1lLCBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyPiAmc3ZyKQorCXsKKyNpZm5kZWYgX1dJTjMyICAvL01hYywgKm5peAorCQl1bmxpbmsocGlwZW5hbWUuY19zdHIoKSk7CisjZW5kaWYKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUUGlwZVNlcnZlcihwaXBlbmFtZSwgMTAyNCwgTnVtVGhyZWFkcykpOyAvL05hbWVkIHBpcGUKKwkJUnVuVGhyaWZ0U2VydmVyPE15SGFuZGxlciwgTXlQcm9jZXNzb3I+KGhuZGxyLCBOdW1UaHJlYWRzLCB0cmFuc3BvcnQsIHN2cik7CisJfQorCisJLy8gVGhyaWZ0IHNlcnZlciB3cmFwcGVyIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhIHBpcGUgbmFtZS4KKwkvLyBUaGlzIHZlcnNpb24gaW5zdGFudGlhdGVzIGl0cyBvd24gaGFuZGxlci4KKwl0ZW1wbGF0ZSA8Y2xhc3MgTXlIYW5kbGVyLCBjbGFzcyBNeVByb2Nlc3Nvcj4KKwl2b2lkIFJ1blRocmlmdFNlcnZlciAoaW50IE51bVRocmVhZHMsIHN0ZDo6c3RyaW5nIHBpcGVuYW1lKQorCXsKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8TXlIYW5kbGVyPiBoYW5kbGVyKG5ldyBNeUhhbmRsZXIoKSk7CisJCWJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXI+IHNlcnZlcjsKKworCQlSdW5UaHJpZnRTZXJ2ZXI8TXlIYW5kbGVyLCBNeVByb2Nlc3Nvcj4oaGFuZGxlciwgTnVtVGhyZWFkcywgcGlwZW5hbWUsIHNlcnZlcik7CisJfQorCisJLy8gVGhyaWZ0IHNlcnZlciB3cmFwcGVyIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhIHNvY2tldCBwb3J0IG51bWJlci4KKwkvLyBBIGhhbmRsZXIgbXVzdCBiZSBwYXNzZWQgaW4gdG8gdGhpcyB2ZXJzaW9uLgorCXRlbXBsYXRlIDxjbGFzcyBNeUhhbmRsZXIsIGNsYXNzIE15UHJvY2Vzc29yPgorCXZvaWQgUnVuVGhyaWZ0U2VydmVyIChib29zdDo6c2hhcmVkX3B0cjxNeUhhbmRsZXI+IGhuZGxyLCBpbnQgTnVtVGhyZWFkcywgaW50IFBvcnQpCisJeworCQlib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRTZXJ2ZXJTb2NrZXQoUG9ydCkpOworCQlib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyPiBzZXJ2ZXI7CisJCVJ1blRocmlmdFNlcnZlcjxNeUhhbmRsZXIsIE15UHJvY2Vzc29yPihobmRsciwgTnVtVGhyZWFkcywgdHJhbnNwb3J0LCBzZXJ2ZXIpOworCX0KKworCS8vIFRocmlmdCBzZXJ2ZXIgd3JhcHBlciBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBzb2NrZXQgcG9ydCBudW1iZXIuCisJLy8gVGhpcyB2ZXJzaW9uIGluc3RhbnRpYXRlcyBpdHMgb3duIGhhbmRsZXIuCisJdGVtcGxhdGUgPGNsYXNzIE15SGFuZGxlciwgY2xhc3MgTXlQcm9jZXNzb3I+CisJdm9pZCBSdW5UaHJpZnRTZXJ2ZXIgKGludCBOdW1UaHJlYWRzLCBpbnQgUG9ydCkKKwl7CisJCWJvb3N0OjpzaGFyZWRfcHRyPE15SGFuZGxlcj4gaGFuZGxlcihuZXcgTXlIYW5kbGVyKCkpOworCisJCVJ1blRocmlmdFNlcnZlcjxNeUhhbmRsZXIsIE15UHJvY2Vzc29yPihoYW5kbGVyLCBOdW1UaHJlYWRzLCBQb3J0KTsKKwl9CisKKwkvLworCXRlbXBsYXRlIDxjbGFzcyBNeUhhbmRsZXIsIGNsYXNzIE15UHJvY2Vzc29yPgorCXZvaWQgUnVuVGhyaWZ0U2VydmVyIChib29zdDo6c2hhcmVkX3B0cjxNeUhhbmRsZXI+IGhuZGxyLCBpbnQgTnVtVGhyZWFkcywgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gdHJhbnNwb3J0KQorCXsKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlcj4gc2VydmVyOworCQlSdW5UaHJpZnRTZXJ2ZXI8TXlIYW5kbGVyLCBNeVByb2Nlc3Nvcj4oaG5kbHIsIE51bVRocmVhZHMsIHRyYW5zcG9ydCwgc2VydmVyKTsKKwl9CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvL0Nvbm5lY3QgdG8gdGhyaWZ0ICdzZXJ2ZXInIC0gU29ja2V0IHZlcnNpb24KKwkvLyhib3RoIHNlcnZlciAmIGNsaWVudCBzaWRlIHJ1biBvbmUgZm9yIGJpZGlyIGV2ZW50IHNpZ25hbGluZykKKwkvLworCXRlbXBsYXRlIDxjbGFzcyBNeUNsaWVudCwgY2xhc3MgTXlUcmFuc3BvcnQ+CisJdm9pZCBDb25uZWN0VG9TZXJ2ZXIgKGJvb3N0OjpzaGFyZWRfcHRyPE15Q2xpZW50PiAmY2xpZW50LCBib29zdDo6c2hhcmVkX3B0cjxNeVRyYW5zcG9ydD4gJnRyYW5zcG9ydCwgaW50IFBvcnQpCisJeworCQkvL0NsaWVudCBzaWRlIGNvbm5lY3Rpb24gdXNpbmcgc29ja2V0cyB0cmFuc3BvcnQuCisJCWJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNvY2tldChuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgUG9ydCkpOworCQl0cmFuc3BvcnQucmVzZXQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpKTsKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOworCisJCWNsaWVudC5yZXNldChuZXcgTXlDbGllbnQocHJvdG9jb2wpKTsKKwl9CisKKwkvL0Nvbm5lY3QgdG8gdGhyaWZ0ICdzZXJ2ZXInIC0gTmFtZWQgUGlwZSB2ZXJzaW9uCisJdGVtcGxhdGUgPGNsYXNzIE15Q2xpZW50LCBjbGFzcyBNeVRyYW5zcG9ydD4KKwl2b2lkIENvbm5lY3RUb1NlcnZlciAoYm9vc3Q6OnNoYXJlZF9wdHI8TXlDbGllbnQ+ICZjbGllbnQsIGJvb3N0OjpzaGFyZWRfcHRyPE15VHJhbnNwb3J0PiAmdHJhbnNwb3J0LCBzdGQ6OnN0cmluZyBwaXBlbmFtZSkKKwl7CisJCS8vQ2xpZW50IHNpZGUgY29ubmVjdGlvbiB1c2luZyBOYW1lZCBQaXBlIHRyYW5zcG9ydC4KKwkJYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcGlwZShuZXcgVFBpcGUocGlwZW5hbWUpKTsKKwkJdHJhbnNwb3J0LnJlc2V0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQocGlwZSkpOworCQlib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSk7CisKKwkJY2xpZW50LnJlc2V0KG5ldyBNeUNsaWVudChwcm90b2NvbCkpOworCX0KKworCS8vQ29ubmVjdCB0byB0aHJpZnQgJ3NlcnZlcicgLSBBbm9ueW1vdXMgUGlwZSB2ZXJzaW9uCisJLy9DdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgdW5kZXIgV2luZG93cworI2lmZGVmIF9XSU4zMgorCXRlbXBsYXRlIDxjbGFzcyBNeUNsaWVudCwgY2xhc3MgTXlUcmFuc3BvcnQ+CisJdm9pZCBDb25uZWN0VG9TZXJ2ZXIgKGJvb3N0OjpzaGFyZWRfcHRyPE15Q2xpZW50PiAmY2xpZW50LCBib29zdDo6c2hhcmVkX3B0cjxNeVRyYW5zcG9ydD4gJnRyYW5zcG9ydCwgSEFORExFIFJkUGlwZSwgSEFORExFIFdydFBpcGUpCisJeworCQkvL0NsaWVudCBzaWRlIGNvbm5lY3Rpb24gdXNpbmcgc29ja2V0cyB0cmFuc3BvcnQuCisjaWZkZWYgX1dJTjMyCisJCWJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHBpcGUobmV3IFRQaXBlKChpbnQpUmRQaXBlLCAoaW50KVdydFBpcGUpKTsKKwkJdHJhbnNwb3J0LnJlc2V0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQocGlwZSkpOworI2Vsc2UKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc29ja2V0KG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiKSk7CisJCXRyYW5zcG9ydC5yZXNldChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkpOworI2VuZGlmCisJCWJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKKworCQljbGllbnQucmVzZXQobmV3IE15Q2xpZW50KHByb3RvY29sKSk7CisJfQorI2VuZGlmCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvL0xhdW5jaCBjaGlsZCBwcm9jZXNzIGFuZCBwYXNzIFIvVyBhbm9ueW1vdXMgcGlwZSBoYW5kbGVzIG9uIGNtZCBsaW5lLgorCS8vQ3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIHVuZGVyIFdpbmRvd3MKKyNpZmRlZiBfV0lOMzIKKwlib29sIExhdW5jaEFub25QaXBlQ2hpbGQoc3RkOjpzdHJpbmcgYXBwLCBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiB0cmFuc3BvcnQpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L1JlYWRNZS50eHQgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L1JlYWRNZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM0OWE5NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jbGllbnQvUmVhZE1lLnR4dApAQCAtMCwwICsxLDQwIEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBDT05TT0xFIEFQUExJQ0FUSU9OIDogY2xpZW50IFByb2plY3QgT3ZlcnZpZXcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitBcHBXaXphcmQgaGFzIGNyZWF0ZWQgdGhpcyBjbGllbnQgYXBwbGljYXRpb24gZm9yIHlvdS4KKworVGhpcyBmaWxlIGNvbnRhaW5zIGEgc3VtbWFyeSBvZiB3aGF0IHlvdSB3aWxsIGZpbmQgaW4gZWFjaCBvZiB0aGUgZmlsZXMgdGhhdAorbWFrZSB1cCB5b3VyIGNsaWVudCBhcHBsaWNhdGlvbi4KKworCitjbGllbnQudmN4cHJvagorICAgIFRoaXMgaXMgdGhlIG1haW4gcHJvamVjdCBmaWxlIGZvciBWQysrIHByb2plY3RzIGdlbmVyYXRlZCB1c2luZyBhbiBBcHBsaWNhdGlvbiBXaXphcmQuCisgICAgSXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZlcnNpb24gb2YgVmlzdWFsIEMrKyB0aGF0IGdlbmVyYXRlZCB0aGUgZmlsZSwgYW5kCisgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBsYXRmb3JtcywgY29uZmlndXJhdGlvbnMsIGFuZCBwcm9qZWN0IGZlYXR1cmVzIHNlbGVjdGVkIHdpdGggdGhlCisgICAgQXBwbGljYXRpb24gV2l6YXJkLgorCitjbGllbnQudmN4cHJvai5maWx0ZXJzCisgICAgVGhpcyBpcyB0aGUgZmlsdGVycyBmaWxlIGZvciBWQysrIHByb2plY3RzIGdlbmVyYXRlZCB1c2luZyBhbiBBcHBsaWNhdGlvbiBXaXphcmQuIAorICAgIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBmaWxlcyBpbiB5b3VyIHByb2plY3QgCisgICAgYW5kIHRoZSBmaWx0ZXJzLiBUaGlzIGFzc29jaWF0aW9uIGlzIHVzZWQgaW4gdGhlIElERSB0byBzaG93IGdyb3VwaW5nIG9mIGZpbGVzIHdpdGgKKyAgICBzaW1pbGFyIGV4dGVuc2lvbnMgdW5kZXIgYSBzcGVjaWZpYyBub2RlIChmb3IgZS5nLiAiLmNwcCIgZmlsZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAiU291cmNlIEZpbGVzIiBmaWx0ZXIpLgorCitjbGllbnQuY3BwCisgICAgVGhpcyBpcyB0aGUgbWFpbiBhcHBsaWNhdGlvbiBzb3VyY2UgZmlsZS4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK090aGVyIHN0YW5kYXJkIGZpbGVzOgorCitTdGRBZnguaCwgU3RkQWZ4LmNwcAorICAgIFRoZXNlIGZpbGVzIGFyZSB1c2VkIHRvIGJ1aWxkIGEgcHJlY29tcGlsZWQgaGVhZGVyIChQQ0gpIGZpbGUKKyAgICBuYW1lZCBjbGllbnQucGNoIGFuZCBhIHByZWNvbXBpbGVkIHR5cGVzIGZpbGUgbmFtZWQgU3RkQWZ4Lm9iai4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK090aGVyIG5vdGVzOgorCitBcHBXaXphcmQgdXNlcyAiVE9ETzoiIGNvbW1lbnRzIHRvIGluZGljYXRlIHBhcnRzIG9mIHRoZSBzb3VyY2UgY29kZSB5b3UKK3Nob3VsZCBhZGQgdG8gb3IgY3VzdG9taXplLgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9jbGllbnQuY3BwIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9jbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZmJlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L2NsaWVudC5jcHAKQEAgLTAsMCArMSwxOTUgQEAKKy8vIGNsaWVudC0+Y3BwIDogRGVmaW5lcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBjb25zb2xlIGFwcGxpY2F0aW9uLgorLy8KKy8vIHNhbXBsZSBjbGllbnQgY29tbWFuZCBsaW5lIGFwcCB1c2luZyBUaHJpZnQgSVBDLgorLy8gUXVpY2sgbiBEaXJ0eSBleGFtcGxlLCBtYXkgbm90IGhhdmUgdmVyeSByb2J1c3QgZXJyb3IgaGFuZGxpbmcKKy8vIGZvciB0aGUgc2FrZSBvZiBzaW1wbGljaXR5LgorCisjaWZkZWYgX1dJTjMyCisjICBpbmNsdWRlICJzdGRhZnguaCIKKyNlbHNlCisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisKKy8vfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisvL0luY2x1ZGUgdGhpcyBiZWZvcmUgdGhlIGdlbmVyYXRlZCBpbmNsdWRlcworI2luY2x1ZGUgIlRocmlmdENvbW1vbi5oIgorLy9+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKy8vVGFpbG9yIHRoZXNlIHRvIHlvdXIgZ2VuZXJhdGVkIGZpbGVzCisjaW5jbHVkZSAiLi4vZ2VuLWNwcC9TYW1wbGVTZXJ2aWNlLmgiCisjaW5jbHVkZSAiLi4vZ2VuLWNwcC9TYW1wbGVDYWxsYmFjay5oIgorCit1c2luZyBuYW1lc3BhY2UgU2FtcGxlOyAvL2RlY2xhcmVkIGluIC50aHJpZnQgZmlsZQorLy9+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKwordm9pZCBDbGllbnRMaXN0ZW5lclRocmVhZFByb2MoKTsKK2Jvb2wgYlNvY2tldCA9IGZhbHNlOworYm9vbCBiQW5vblBpcGUgPSBmYWxzZTsKK2ludCBzcnZQb3J0Oworc3RkOjpzdHJpbmcgcGlwZW5hbWU7CitzdGQ6OnN0cmluZyBwaXBlbmFtZV9jbGllbnQ7CisjaWZkZWYgX1dJTjMyCisgSEFORExFIGhDb25zb2xlOworI2VuZGlmCisKKy8vQ3VzdG9taXplZCB2ZXJzaW9uIG9mIHByaW50ZiB0aGF0IGNoYW5nZXMgdGhlIHRleHQgY29sb3IKKy8vVGhpcyBkZXBlbmRzIG9uIGhDb25zb2xlIGdsb2JhbCBiZWluZyBpbml0aWFsaXplZAordm9pZCBobHByaW50Zihjb25zdCBjaGFyKiBfRm9ybWF0LCAuLi4pCit7CisjaWZkZWYgX1dJTjMyCisJU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoaENvbnNvbGUsIDB4RSk7CisjZW5kaWYKKwl2YV9saXN0IGFwOworCWludCByOworCXZhX3N0YXJ0IChhcCwgX0Zvcm1hdCk7CisJciA9IHZwcmludGYgKF9Gb3JtYXQsIGFwKTsKKwl2YV9lbmQgKGFwKTsKKyNpZmRlZiBfV0lOMzIKKwlTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZShoQ29uc29sZSwgNyk7CisjZW5kaWYKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2xpZW50LXNpZGUgUlBDIGltcGxlbWVudGF0aW9uczogQ2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgdG8gdGhlIGNsaWVudCBmb3IgCisvLyBiaWRpcmVjdGlvbmFsIGV2ZW50aW5nLgorLy8KK2NsYXNzIFNhbXBsZUNhbGxiYWNrSGFuZGxlciA6IHZpcnR1YWwgcHVibGljIFNhbXBsZUNhbGxiYWNrSWYgeworIHB1YmxpYzoKKyAgU2FtcGxlQ2FsbGJhY2tIYW5kbGVyKCkgeworICAgIC8vIGluaXRpYWxpemF0aW9uIGdvZXMgaGVyZQorICB9CisKKyAgdm9pZCBwaW5nY2xpZW50KCkKKyAgeworICAgIGhscHJpbnRmKCI8PDxQaW5nIHJlY2VpdmVkIGZyb20gc2VydmVyIChzZXJ2ZXItdG8tY2xpZW50IGV2ZW50KS5cbiIpOworICB9CisKK307CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworI2lmZGVmIF9XSU4zMgoraW50IF90bWFpbihpbnQgYXJnYywgX1RDSEFSKiBhcmd2W10pCisjZWxzZQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorI2VuZGlmCit7CisJLy9Qcm9jZXNzIGNtZCBsaW5lIGFyZ3MgdG8gZGV0ZXJtaW5lIG5hbWVkIHZzIGFub24gcGlwZXMuCisJYm9vbCB1c2FnZSA9IGZhbHNlOworI2lmZGVmIF9XSU4zMgorCUhBTkRMRSBSZWFkUGlwZSwgV3JpdGVQaXBlOworCWhDb25zb2xlID0gR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKTsKKyNlbmRpZgorCisJLy9Qcm9jZXNzIGNvbW1hbmQgbGluZSBwYXJhbXMKKwlpZihhcmdjID4gMSkKKwl7CisJCWlmKF90Y3NjbXAoYXJndlsxXSwgVEVYVCgiLXNwIikpID09IDApCisJCXsJLy9Tb2NrZXQgUG9ydCBzcGVjaWZpZWQKKwkJCXNydlBvcnQgPSBfdHN0b2koYXJndlsyXSk7CisJCQliU29ja2V0ID0gdHJ1ZTsKKwkJfQorCQllbHNlIGlmKF90Y3NjbXAoYXJndlsxXSwgVEVYVCgiLW5wIikpID09IDApCisJCXsJLy9OYW1lZCBQaXBlIHNwZWNpZmllZAorI2lmZGVmIF9XSU4zMgorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp3c3RyaW5nIHdwaXBlKGFyZ3ZbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgcGlwZW5hbWUucmVzaXplKHdwaXBlLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y29weSh3cGlwZS5iZWdpbigpLCB3cGlwZS5lbmQoKSwgcGlwZW5hbWUuYmVnaW4oKSk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcGlwZW5hbWUgPSBhcmd2WzJdOworI2VuZGlmCisJCQlwaXBlbmFtZV9jbGllbnQgPSBwaXBlbmFtZSArICJfY2xpZW50IjsKKwkJfQorCQllbHNlIGlmKGFyZ2MgPT0gMykKKwkJewkvL0Fub255bW91cyBQaXBlIHNwZWNpZmllZAorI2lmZGVmIF9XSU4zMgorCQkJUmVhZFBpcGUgID0gKEhBTkRMRSlfdHN0b2koYXJndlsxXSk7CisJCQlXcml0ZVBpcGUgPSAoSEFORExFKV90c3RvaShhcmd2WzJdKTsKKwkJCWJBbm9uUGlwZSA9IHRydWU7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJBbm9ueW1vdXMgcGlwZXMgbm90ICh5ZXQpIHN1cHBvcnRlZCB1bmRlciAqTklYXG4iKTsKKyNlbmRpZgorCQl9CisJCWVsc2UKKwkJCXVzYWdlID0gdHJ1ZTsKKwl9CisJZWxzZQorCQl1c2FnZSA9IHRydWU7CisKKwlpZih1c2FnZSkKKwl7CisJCWhscHJpbnRmKCJUaHJpZnQgc2FtcGxlIGNsaWVudCB1c2FnZTpcblxuIik7CisJCWhscHJpbnRmKCJTb2NrZXQgUG9ydCB0byBjb25uZWN0IHRvOiAtc3AgPHBvcnQjPlxuIik7CisJCWhscHJpbnRmKCJOYW1lZCBQaXBlIHRvIGNvbm5lY3QgdG86ICAtbnAgPHBpcGVuYW1lPiAoZS5nLiBhZmZwaXBlKVxuIik7CisJCWhscHJpbnRmKCJBbm9ueW1vdXMgUGlwZSAobXVzdCBiZSBsYXVuY2hlZCBieSBhbm9uIHBpcGUgY3JlYXRvcik6XG4iKTsKKwkJaGxwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxSZWFkIEhhbmRsZT4gPFdyaXRlIEhhbmRsZT5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvL0NsaWVudCBzaWRlIGNvbm5lY3Rpb24gdG8gc2VydmVyLgorCWJvb3N0OjpzaGFyZWRfcHRyPFNhbXBsZVNlcnZpY2VDbGllbnQ+IGNsaWVudDsgLy9DbGllbnQgY2xhc3MgZnJvbSBUaHJpZnQtZ2VuZXJhdGVkIGNvZGUuCisJYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0OworCisJaWYoYlNvY2tldCkKKwl7CS8vU29ja2V0IHRyYW5zcG9ydAorI2lmZGVmIF9XSU4zMgorCQlUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CisjZW5kaWYKKwkJaGxwcmludGYoIlVzaW5nIHNvY2tldCB0cmFuc3BvcnQgcG9ydCAlZFxuIiwgc3J2UG9ydCk7CisJCXRocmlmdGNvbW1vbjo6Q29ubmVjdFRvU2VydmVyPFNhbXBsZVNlcnZpY2VDbGllbnQsIFRUcmFuc3BvcnQ+KGNsaWVudCwgdHJhbnNwb3J0LCBzcnZQb3J0KTsKKwl9CisJZWxzZSBpZighYkFub25QaXBlKQorCXsKKwkJaGxwcmludGYoIlVzaW5nIE5hbWVkIFBpcGUgJXNcbiIsIHBpcGVuYW1lLmNfc3RyKCkpOworCQl0aHJpZnRjb21tb246OkNvbm5lY3RUb1NlcnZlcjxTYW1wbGVTZXJ2aWNlQ2xpZW50LCBUVHJhbnNwb3J0PihjbGllbnQsIHRyYW5zcG9ydCwgcGlwZW5hbWUpOworCX0KKwllbHNlCisJeworI2lmZGVmIF9XSU4zMgorCQlobHByaW50ZigiVXNpbmcgQW5vbnltb3VzIFBpcGUgdHJhbnNwb3J0XG4iKTsKKwkJdGhyaWZ0Y29tbW9uOjpDb25uZWN0VG9TZXJ2ZXI8U2FtcGxlU2VydmljZUNsaWVudCwgVFRyYW5zcG9ydD4oY2xpZW50LCB0cmFuc3BvcnQsIFJlYWRQaXBlLCBXcml0ZVBpcGUpOworI2VuZGlmCisJfQorCisjaWZkZWYgX1dJTjMyCisJLy9TdGFydCBhIHRocmVhZCB0byByZWNlaXZlIGluYm91bmQgY29ubmVjdGlvbiBmcm9tIHNlcnZlciBmb3IgMi13YXkgZXZlbnQgc2lnbmFsaW5nLgorCWJvb3N0Ojp0aHJlYWQgQ2xpZW50TGlzdGVuZXJUaHJlYWQoQ2xpZW50TGlzdGVuZXJUaHJlYWRQcm9jKTsKKyNlbmRpZgorCisJdHJ5IHsKKwkJdHJhbnNwb3J0LT5vcGVuKCk7CisKKwkJLy9Ob3RpZnkgc2VydmVyIHdoYXQgdG8gY29ubmVjdCBiYWNrIG9uLgorCQlpZihiU29ja2V0KQorCQkJY2xpZW50LT5DbGllbnRTaWRlTGlzdGVuUG9ydChzcnZQb3J0ICsgMSk7IC8vU29ja2V0CisJCWVsc2UgaWYoIWJBbm9uUGlwZSkKKwkJCWNsaWVudC0+Q2xpZW50U2lkZVBpcGVOYW1lKHBpcGVuYW1lX2NsaWVudCk7IC8vTmFtZWQgUGlwZQorCisJCS8vUnVuIHNvbWUgbW9yZSBSUENzCisJCXN0ZDo6c3RyaW5nIGhlbGxvc3RyID0gIkhlbGxvIGhvdyBhcmUgeW91PyI7CisJCXN0ZDo6c3RyaW5nIHJldHVybnN0cjsKKwkJY2xpZW50LT5IZWxsb1RoZXJlKHJldHVybnN0ciwgaGVsbG9zdHIpOworCQlobHByaW50ZigiXG4+Pj5TZW50OiAlc1xuIiwgaGVsbG9zdHIuY19zdHIoKSk7CisJCWhscHJpbnRmKCI8PDxSZWNlaXZlZDogJXNcbiIsIHJldHVybnN0ci5jX3N0cigpKTsKKworCQlobHByaW50ZigiXG4+Pj5DYWxsaW5nIFNlcnZlckRvU29tZXRoaW5nKCkgd2hpY2ggZGVsYXlzIGZvciA1IHNlY29uZHMuXG4iKTsKKwkJY2xpZW50LT5TZXJ2ZXJEb1NvbWV0aGluZygpOworCQlobHByaW50ZigiPj4+U2VydmVyRG9Tb21ldGhpbmcoKSBkb25lLlxuXG4iKTsKKworCQl0cmFuc3BvcnQtPmNsb3NlKCk7CisJfSBjYXRjaCAoVEV4Y2VwdGlvbiAmdHgpIHsKKwkJaGxwcmludGYoIkVSUk9SOiAlc1xuIiwgdHgud2hhdCgpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvL1RocmVhZCBSb3V0aW5lCit2b2lkIENsaWVudExpc3RlbmVyVGhyZWFkUHJvYygpCit7CisJaWYoYlNvY2tldCkKKwkJdGhyaWZ0Y29tbW9uOjpSdW5UaHJpZnRTZXJ2ZXI8U2FtcGxlQ2FsbGJhY2tIYW5kbGVyLCBTYW1wbGVDYWxsYmFja1Byb2Nlc3Nvcj4oMSwgc3J2UG9ydCArIDEpOworCWVsc2UgaWYoIWJBbm9uUGlwZSkKKwkJdGhyaWZ0Y29tbW9uOjpSdW5UaHJpZnRTZXJ2ZXI8U2FtcGxlQ2FsbGJhY2tIYW5kbGVyLCBTYW1wbGVDYWxsYmFja1Byb2Nlc3Nvcj4oMSwgcGlwZW5hbWVfY2xpZW50KTsKK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jbGllbnQvY2xpZW50LnZjeHByb2ogYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L2NsaWVudC52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OWMzMzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L2NsaWVudC52Y3hwcm9qCkBAIC0wLDAgKzEsMTA1IEBACis/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICA8L0l0ZW1Hcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPgorICAgIDxQcm9qZWN0R3VpZD57ODVGQkZCNTQtNTMwQi00OThGLTlGMzgtNDRCQTIwNEZBRTZBfTwvUHJvamVjdEd1aWQ+CisgICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPgorICAgIDxSb290TmFtZXNwYWNlPmNsaWVudDwvUm9vdE5hbWVzcGFjZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPnRydWU8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz5mYWxzZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAucHJvcHMiIC8+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD50cnVlPC9MaW5rSW5jcmVtZW50YWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uLzsuLi8uLi8uLi9saWIvY3BwL3NyYzsuLi8uLi8uLi8uLi9ib29zdDsuLi8uLi8uLi8uLi9ib29zdC9ib29zdC90cjE7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4uLi8uLi8uLi9saWIvY3BwLyQoQ29uZmlndXJhdGlvbik7Li4vLi4vLi4vLi4vQm9vc3QvbGliOyUoQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+CisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5saWJ0aHJpZnQubGliO3dzMl8zMi5saWI7a2VybmVsMzIubGliO3VzZXIzMi5saWI7Z2RpMzIubGliO3dpbnNwb29sLmxpYjtjb21kbGczMi5saWI7YWR2YXBpMzIubGliO3NoZWxsMzIubGliO29sZTMyLmxpYjtvbGVhdXQzMi5saWI7dXVpZC5saWI7b2RiYzMyLmxpYjtvZGJjY3AzMi5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uLzsuLi8uLi8uLi9saWIvY3BwL3NyYzsuLi8uLi8uLi8uLi9ib29zdDsuLi8uLi8uLi8uLi9ib29zdC9ib29zdC90cjE7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+CisgICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4uLi8uLi8uLi9saWIvY3BwLyQoQ29uZmlndXJhdGlvbik7Li4vLi4vLi4vLi4vQm9vc3QvbGliOyUoQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+CisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5saWJ0aHJpZnQubGliO3dzMl8zMi5saWI7a2VybmVsMzIubGliO3VzZXIzMi5saWI7Z2RpMzIubGliO3dpbnNwb29sLmxpYjtjb21kbGczMi5saWI7YWR2YXBpMzIubGliO3NoZWxsMzIubGliO29sZTMyLmxpYjtvbGVhdXQzMi5saWI7dXVpZC5saWI7b2RiYzMyLmxpYjtvZGJjY3AzMi5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Tm9uZSBJbmNsdWRlPSJSZWFkTWUudHh0IiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlQ2FsbGJhY2suaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlU2VydmljZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfY29uc3RhbnRzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZV90eXBlcy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3RkYWZ4LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJ0YXJnZXR2ZXIuaCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxUaHJpZnRDb21tb24uY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVDYWxsYmFjay5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZVNlcnZpY2UuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfY29uc3RhbnRzLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlX3R5cGVzLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9ImNsaWVudC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzdGRhZnguY3BwIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4KKyAgPC9JbXBvcnRHcm91cD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L2NsaWVudC52Y3hwcm9qLmZpbHRlcnMgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L2NsaWVudC52Y3hwcm9qLmZpbHRlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VjN2JkZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jbGllbnQvY2xpZW50LnZjeHByb2ouZmlsdGVycwpAQCAtMCwwICsxLDY2IEBACis/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlNvdXJjZSBGaWxlcyI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICAgIDxFeHRlbnNpb25zPmNwcDtjO2NjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214PC9FeHRlbnNpb25zPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0iSGVhZGVyIEZpbGVzIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgICAgPEV4dGVuc2lvbnM+aDtocHA7aHh4O2htO2lubDtpbmM7eHNkPC9FeHRlbnNpb25zPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0iUmVzb3VyY2UgRmlsZXMiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezY3REE2QUI2LUY4MDAtNGMwOC04QjdBLTgzQkIxMjFBQUQwMX08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgICA8RXh0ZW5zaW9ucz5yYztpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGU7cmVzeDt0aWZmO3RpZjtwbmc7d2F2O21mY3JpYmJvbi1tczwvRXh0ZW5zaW9ucz4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlNvdXJjZSBGaWxlc1xnZW4tY3BwIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnsxMjY1YjNkYy05MWRlLTQxNmYtYWJhNi03Yjc1MGRlNDIyMWV9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Tm9uZSBJbmNsdWRlPSJSZWFkTWUudHh0IiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InN0ZGFmeC5oIj4KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJ0YXJnZXR2ZXIuaCI+CisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfdHlwZXMuaCI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xnZW4tY3BwPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZVNlcnZpY2UuaCI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xnZW4tY3BwPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZV9jb25zdGFudHMuaCI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xnZW4tY3BwPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZUNhbGxiYWNrLmgiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InN0ZGFmeC5jcHAiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9ImNsaWVudC5jcHAiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlU2VydmljZS5jcHAiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfY29uc3RhbnRzLmNwcCI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xnZW4tY3BwPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZV90eXBlcy5jcHAiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVDYWxsYmFjay5jcHAiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cVGhyaWZ0Q29tbW9uLmNwcCI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICA8L0l0ZW1Hcm91cD4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jbGllbnQvc3RkYWZ4LmNwcCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jbGllbnQvc3RkYWZ4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmQxNTFlCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9zdGRhZnguY3BwCkBAIC0wLDAgKzEsOCBAQAorLy8gc3RkYWZ4LmNwcCA6IHNvdXJjZSBmaWxlIHRoYXQgaW5jbHVkZXMganVzdCB0aGUgc3RhbmRhcmQgaW5jbHVkZXMKKy8vIGNsaWVudC5wY2ggd2lsbCBiZSB0aGUgcHJlLWNvbXBpbGVkIGhlYWRlcgorLy8gc3RkYWZ4Lm9iaiB3aWxsIGNvbnRhaW4gdGhlIHByZS1jb21waWxlZCB0eXBlIGluZm9ybWF0aW9uCisKKyNpbmNsdWRlICJzdGRhZnguaCIKKworLy8gVE9ETzogcmVmZXJlbmNlIGFueSBhZGRpdGlvbmFsIGhlYWRlcnMgeW91IG5lZWQgaW4gU1REQUZYLkgKKy8vIGFuZCBub3QgaW4gdGhpcyBmaWxlCmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L3N0ZGFmeC5oIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9zdGRhZnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDA1YTgzCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9zdGRhZnguaApAQCAtMCwwICsxLDE1IEBACisvLyBzdGRhZnguaCA6IGluY2x1ZGUgZmlsZSBmb3Igc3RhbmRhcmQgc3lzdGVtIGluY2x1ZGUgZmlsZXMsCisvLyBvciBwcm9qZWN0IHNwZWNpZmljIGluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgdXNlZCBmcmVxdWVudGx5LCBidXQKKy8vIGFyZSBjaGFuZ2VkIGluZnJlcXVlbnRseQorLy8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJ0YXJnZXR2ZXIuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGNoYXIuaD4KKworCisKKy8vIFRPRE86IHJlZmVyZW5jZSBhZGRpdGlvbmFsIGhlYWRlcnMgeW91ciBwcm9ncmFtIHJlcXVpcmVzIGhlcmUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jbGllbnQvdGFyZ2V0dmVyLmggYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L3RhcmdldHZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YzAwODYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L3RhcmdldHZlci5oCkBAIC0wLDAgKzEsOCBAQAorI3ByYWdtYSBvbmNlCisKKy8vIEluY2x1ZGluZyBTREtEREtWZXIuaCBkZWZpbmVzIHRoZSBoaWdoZXN0IGF2YWlsYWJsZSBXaW5kb3dzIHBsYXRmb3JtLgorCisvLyBJZiB5b3Ugd2lzaCB0byBidWlsZCB5b3VyIGFwcGxpY2F0aW9uIGZvciBhIHByZXZpb3VzIFdpbmRvd3MgcGxhdGZvcm0sIGluY2x1ZGUgV2luU0RLVmVyLmggYW5kCisvLyBzZXQgdGhlIF9XSU4zMl9XSU5OVCBtYWNybyB0byB0aGUgcGxhdGZvcm0geW91IHdpc2ggdG8gc3VwcG9ydCBiZWZvcmUgaW5jbHVkaW5nIFNES0RES1Zlci5oLgorCisjaW5jbHVkZSA8U0RLRERLVmVyLmg+CmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY29uZmlnLmggYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIwZDc4NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jb25maWcuaApAQCAtMCwwICsxLDI0IEBACisvL01pc3NpbmcgZGVmaW5pdGlvbnMgZm9yICpOSVggc3lzdGVtcy4gVGhpcyBzYW1wbGUgcHJvamVjdAorLy93YXMgaW5pdGlhbGx5IGNyZWF0ZWQgb24gV2luZG93cy4KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIFRFWFQoc3RyKSBzdHIKKworaW5saW5lIGludCBTbGVlcChpbnQgbXMpCit7CisJcmV0dXJuIHNsZWVwKG1zLzEwMDApOyAvL3NsZWVwKCkgcGFyYW0gaXMgaW4gc2Vjb25kcworfQorCitpbmxpbmUgaW50IF90Y3NjbXAoY29uc3QgY2hhciogc3RyMSwgY29uc3QgY2hhciogc3RyMikKK3sKKwlyZXR1cm4gc3RyY21wKHN0cjEsIHN0cjIpOworfQorCitpbmxpbmUgaW50IF90c3RvaShjb25zdCBjaGFyKiBzdHIpCit7CisJcmV0dXJuIGF0b2koc3RyKTsKK30KKwpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci9SZWFkTWUudHh0IGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci9SZWFkTWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYzBlZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL1JlYWRNZS50eHQKQEAgLTAsMCArMSw0MCBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgQ09OU09MRSBBUFBMSUNBVElPTiA6IHNlcnZlciBQcm9qZWN0IE92ZXJ2aWV3Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQXBwV2l6YXJkIGhhcyBjcmVhdGVkIHRoaXMgc2VydmVyIGFwcGxpY2F0aW9uIGZvciB5b3UuCisKK1RoaXMgZmlsZSBjb250YWlucyBhIHN1bW1hcnkgb2Ygd2hhdCB5b3Ugd2lsbCBmaW5kIGluIGVhY2ggb2YgdGhlIGZpbGVzIHRoYXQKK21ha2UgdXAgeW91ciBzZXJ2ZXIgYXBwbGljYXRpb24uCisKKworc2VydmVyLnZjeHByb2oKKyAgICBUaGlzIGlzIHRoZSBtYWluIHByb2plY3QgZmlsZSBmb3IgVkMrKyBwcm9qZWN0cyBnZW5lcmF0ZWQgdXNpbmcgYW4gQXBwbGljYXRpb24gV2l6YXJkLgorICAgIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2ZXJzaW9uIG9mIFZpc3VhbCBDKysgdGhhdCBnZW5lcmF0ZWQgdGhlIGZpbGUsIGFuZAorICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwbGF0Zm9ybXMsIGNvbmZpZ3VyYXRpb25zLCBhbmQgcHJvamVjdCBmZWF0dXJlcyBzZWxlY3RlZCB3aXRoIHRoZQorICAgIEFwcGxpY2F0aW9uIFdpemFyZC4KKworc2VydmVyLnZjeHByb2ouZmlsdGVycworICAgIFRoaXMgaXMgdGhlIGZpbHRlcnMgZmlsZSBmb3IgVkMrKyBwcm9qZWN0cyBnZW5lcmF0ZWQgdXNpbmcgYW4gQXBwbGljYXRpb24gV2l6YXJkLiAKKyAgICBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgZmlsZXMgaW4geW91ciBwcm9qZWN0IAorICAgIGFuZCB0aGUgZmlsdGVycy4gVGhpcyBhc3NvY2lhdGlvbiBpcyB1c2VkIGluIHRoZSBJREUgdG8gc2hvdyBncm91cGluZyBvZiBmaWxlcyB3aXRoCisgICAgc2ltaWxhciBleHRlbnNpb25zIHVuZGVyIGEgc3BlY2lmaWMgbm9kZSAoZm9yIGUuZy4gIi5jcHAiIGZpbGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgIlNvdXJjZSBGaWxlcyIgZmlsdGVyKS4KKworc2VydmVyLmNwcAorICAgIFRoaXMgaXMgdGhlIG1haW4gYXBwbGljYXRpb24gc291cmNlIGZpbGUuCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitPdGhlciBzdGFuZGFyZCBmaWxlczoKKworU3RkQWZ4LmgsIFN0ZEFmeC5jcHAKKyAgICBUaGVzZSBmaWxlcyBhcmUgdXNlZCB0byBidWlsZCBhIHByZWNvbXBpbGVkIGhlYWRlciAoUENIKSBmaWxlCisgICAgbmFtZWQgc2VydmVyLnBjaCBhbmQgYSBwcmVjb21waWxlZCB0eXBlcyBmaWxlIG5hbWVkIFN0ZEFmeC5vYmouCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitPdGhlciBub3RlczoKKworQXBwV2l6YXJkIHVzZXMgIlRPRE86IiBjb21tZW50cyB0byBpbmRpY2F0ZSBwYXJ0cyBvZiB0aGUgc291cmNlIGNvZGUgeW91CitzaG91bGQgYWRkIHRvIG9yIGN1c3RvbWl6ZS4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc2VydmVyLmNwcCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmE4MzY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci9zZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsMTY4IEBACisvLyBzZXJ2ZXIuY3BwIDogRGVmaW5lcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBjb25zb2xlIGFwcGxpY2F0aW9uLgorLy8KKy8vIHNhbXBsZSBzZXJ2ZXIgY29tbWFuZCBsaW5lIGFwcCB1c2luZyBUaHJpZnQgSVBDLgorLy8KKy8vIFRoaXMgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBmdWxsIGR1cGxleCBSUEMuIFRoYXQgaXMsIGVhY2gKKy8vIHNpZGUgcnVucyBib3RoIGEgY2xpZW50IGFuZCBzZXJ2ZXIgdG8gZW5hYmxlIGJpZGlyZWN0aW9uYWwgZXZlbnQgCisvLyBzaWduYWxpbmcuCisvLworCisjaWZkZWYgX1dJTjMyCisjICBpbmNsdWRlICJzdGRhZnguaCIKKyNlbHNlCisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisvL35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorLy9JbmNsdWRlIHRoaXMgYmVmb3JlIHRoZSBnZW5lcmF0ZWQgaW5jbHVkZXMKKyNpbmNsdWRlICJUaHJpZnRDb21tb24uaCIKKy8vfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisvL1RhaWxvciB0aGVzZSB0byB5b3VyIGdlbmVyYXRlZCBmaWxlcworI2luY2x1ZGUgIi4uL2dlbi1jcHAvU2FtcGxlU2VydmljZS5oIgorI2luY2x1ZGUgIi4uL2dlbi1jcHAvU2FtcGxlQ2FsbGJhY2suaCIKKwordXNpbmcgbmFtZXNwYWNlIFNhbXBsZTsgLy9kZWNsYXJlZCBpbiAudGhyaWZ0IGZpbGUKKy8vfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK2ludDE2X3QgQ2xpZW50UG9ydF87CitzdGQ6OnN0cmluZyBDbGllbnRQaXBlTmFtZV87Cit2b2lkIFMyQ1RocmVhZFByb2MoKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUlBDIGltcGxlbWVudGF0aW9ucworLy8KK2NsYXNzIFNhbXBsZVNlcnZpY2VIYW5kbGVyIDogdmlydHVhbCBwdWJsaWMgU2FtcGxlU2VydmljZUlmIHsKKyBwdWJsaWM6CisgIFNhbXBsZVNlcnZpY2VIYW5kbGVyKCkgeworICAgIC8vIFlvdXIgaW5pdGlhbGl6YXRpb24gZ29lcyBoZXJlCisgIH0KKworICB2b2lkIEhlbGxvVGhlcmUoc3RkOjpzdHJpbmcmIF9yZXR1cm4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBIZWxsb1N0cmluZykgeworICAgIC8vIFlvdXIgaW1wbGVtZW50YXRpb24gZ29lcyBoZXJlCisgICAgcHJpbnRmKCI8PDxIZWxsb1RoZXJlKCkgcmVjZWl2ZWQgc3RyaW5nOiAlc1xuIiwgSGVsbG9TdHJpbmcuY19zdHIoKSk7CisJX3JldHVybiA9ICJHb29kIHRoYW5rIHlvdS4iOworICB9CisKKyAgdm9pZCBTZXJ2ZXJEb1NvbWV0aGluZygpIHsKKyAgICAvLyBZb3VyIGltcGxlbWVudGF0aW9uIGdvZXMgaGVyZQorICAgIHByaW50ZigiU2VydmVyRG9Tb21ldGhpbmcoKTogU2ltdWxhdGluZyB3b3JrIGZvciA1IHNlY29uZHNcbiIpOworICAgIFNsZWVwKDUwMDApOworICAgIHByaW50ZigiU2VydmVyRG9Tb21ldGhpbmcoKTogRG9uZVxuIik7CisgIH0KKworICB2b2lkIENsaWVudFNpZGVMaXN0ZW5Qb3J0KGNvbnN0IGludDE2X3QgQ2xpZW50TGlzdGVuUG9ydCkKKyAgeworCUNsaWVudFBvcnRfID0gQ2xpZW50TGlzdGVuUG9ydDsKKwlDbGllbnRQaXBlTmFtZV8gPSAiIjsKKyNpZmRlZiBfV0lOMzIKKwlwcmludGYoIj4+PkNvbm5lY3RpbmcgdG8gY2xpZW50IG9uIHBvcnQgJWRcbiIsIENsaWVudFBvcnRfKTsKKwlib29zdDo6dGhyZWFkIENvbm5lY3QyQ2xpZW50VGhyZWFkKFMyQ1RocmVhZFByb2MpOworI2VuZGlmCisgIH0KKworICB2b2lkIENsaWVudFNpZGVQaXBlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgQ2xpZW50UGlwZU5hbWUpCisgIHsKKwlDbGllbnRQaXBlTmFtZV8gPSBDbGllbnRQaXBlTmFtZTsKKwlDbGllbnRQb3J0XyA9IDA7CisjaWZkZWYgX1dJTjMyCisJcHJpbnRmKCI+Pj5Db25uZWN0aW5nIHRvIGNsaWVudCBwaXBlICVzXG4iLCBDbGllbnRQaXBlTmFtZV8uY19zdHIoKSk7CisJYm9vc3Q6OnRocmVhZCBDb25uZWN0MkNsaWVudFRocmVhZChTMkNUaHJlYWRQcm9jKTsKKyNlbmRpZgorICB9Cit9OworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX1dJTjMyCitpbnQgX3RtYWluKGludCBhcmdjLCBfVENIQVIqIGFyZ3ZbXSkKKyNlbHNlCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisjZW5kaWYKK3sKKwlpbnQgcG9ydDsKKwlzdGQ6OnN0cmluZyBwaXBlbmFtZTsgLy9lLmcuICJhZmZwaXBlIgorCisJYm9vbCB1c2FnZSA9IGZhbHNlOworCisJLy9Qcm9jZXNzIGNvbW1hbmQgbGluZSBwYXJhbXMKKwlpZihhcmdjID4gMSkKKwl7CisJCWlmKF90Y3NjbXAoYXJndlsxXSwgVEVYVCgiLXNwIikpID09IDApCisJCXsJLy9Tb2NrZXQgUG9ydCBzcGVjaWZpZWQKKwkJCXBvcnQgPSBfdHN0b2koYXJndlsyXSk7CisjaWZkZWYgX1dJTjMyCisJCQlUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CisjZW5kaWYKKwkJCS8vIFN0YXJ0IHRoZSB0aHJpZnQgc2VydmVyIHdoaWNoIGlzIGEgYmxvY2tpbmcgY2FsbC4KKwkJCXRocmlmdGNvbW1vbjo6UnVuVGhyaWZ0U2VydmVyPFNhbXBsZVNlcnZpY2VIYW5kbGVyLCBTYW1wbGVTZXJ2aWNlUHJvY2Vzc29yPigxMCwgcG9ydCk7CisJCX0KKwkJZWxzZSBpZihfdGNzY21wKGFyZ3ZbMV0sIFRFWFQoIi1ucCIpKSA9PSAwKQorCQl7CS8vTmFtZWQgUGlwZSBzcGVjaWZpZWQKKyNpZmRlZiBfV0lOMzIKKwkJCXN0ZDo6d3N0cmluZyB3cGlwZShhcmd2WzJdKTsKKwkJCXBpcGVuYW1lLnJlc2l6ZSh3cGlwZS5sZW5ndGgoKSk7CisJCQlzdGQ6OmNvcHkod3BpcGUuYmVnaW4oKSwgd3BpcGUuZW5kKCksIHBpcGVuYW1lLmJlZ2luKCkpOworI2Vsc2UKKwkJCXBpcGVuYW1lID0gYXJndlsyXTsKKyNlbmRpZgorCQkJcHJpbnRmKCJVc2luZyBOYW1lZCBQaXBlICVzXG4iLCBwaXBlbmFtZS5jX3N0cigpKTsKKworCQkJLy9UaHJpZnQgb3ZlciBOYW1lZCBQaXBlLgorCQkJdGhyaWZ0Y29tbW9uOjpSdW5UaHJpZnRTZXJ2ZXI8U2FtcGxlU2VydmljZUhhbmRsZXIsIFNhbXBsZVNlcnZpY2VQcm9jZXNzb3I+KDEwLCBwaXBlbmFtZSk7CisJCX0KKwkJZWxzZSBpZihfdGNzY21wKGFyZ3ZbMV0sIFRFWFQoIi1hcCIpKSA9PSAwKQorCQl7CS8vQW5vbnltb3VzIFBpcGUgc3BlY2lmaWVkCisJCQkvL1RoaXMgaXMgbW9yZSBpbnZvbHZlZCBiZWNhdXNlIHRoZSBjaGlsZCBuZWVkcyB0byBiZSBsYXVuY2hlZCAKKwkJCS8vYWZ0ZXIgdGhlIHRyYW5zcG9ydCBpcyBjcmVhdGVkIGJ1dCBiZWZvcmUgdGhlIGJsb2NraW5nIHNlcnZlciAKKwkJCS8vY2FsbC4KKyNpZmRlZiBfV0lOMzIKKwkJCWJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVFBpcGVTZXJ2ZXIoKSk7IC8vQW5vbnltb3VzIHBpcGUKKwkJCXRocmlmdGNvbW1vbjo6TGF1bmNoQW5vblBpcGVDaGlsZCgiLlxcY2xpZW50LmV4ZSIsIHRyYW5zcG9ydCk7CisJCQlib29zdDo6c2hhcmVkX3B0cjxTYW1wbGVTZXJ2aWNlSGFuZGxlcj4gaGFuZGxlcihuZXcgU2FtcGxlU2VydmljZUhhbmRsZXIoKSk7CisJCQl0aHJpZnRjb21tb246OlJ1blRocmlmdFNlcnZlcjxTYW1wbGVTZXJ2aWNlSGFuZGxlciwgU2FtcGxlU2VydmljZVByb2Nlc3Nvcj4oaGFuZGxlciwgMTAsIHRyYW5zcG9ydCk7CisjZWxzZQorCQkJcHJpbnRmKCJBbm9ueW1vdXMgcGlwZXMgbm90ICh5ZXQpIHN1cHBvcnRlZCB1bmRlciAqTklYXG4iKTsKKyNlbmRpZgorCQl9CisJCWVsc2UKKwkJCXVzYWdlID0gdHJ1ZTsKKwl9CisJZWxzZQorCQl1c2FnZSA9IHRydWU7CisKKwlpZih1c2FnZSkKKwl7CisJCXByaW50ZigiVGhyaWZ0IHNhbXBsZSBzZXJ2ZXIgdXNhZ2U6XG5cbiIpOworCQlwcmludGYoIlNvY2tldCBQb3J0IDogICAtc3AgPHBvcnQjPlxuIik7CisJCXByaW50ZigiTmFtZWQgUGlwZSA6ICAgIC1ucCA8cGlwZW5hbWU+IChlLmcuIGFmZnBpcGUpXG4iKTsKKwkJcHJpbnRmKCJBbm9ueW1vdXMgUGlwZTogLWFwXG4iKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLy9UaHJlYWQgUm91dGluZSB0aGF0IGNvbm5lY3RzIHRvIHRoZSAnY2xpZW50Jy4KK3ZvaWQgUzJDVGhyZWFkUHJvYygpCit7CisJLy9NYXN0ZXIgc2VydmVyJ3MgY29ubmVjdGlvbiB0byBjbGllbnQtc2lkZSdzIHNlcnZlci4KKwlib29zdDo6c2hhcmVkX3B0cjxTYW1wbGVDYWxsYmFja0NsaWVudD4gY2xpZW50c3J2OyAvL0NsaWVudCBjbGFzcyBmcm9tIFRocmlmdC1nZW5lcmF0ZWQgY29kZS4KKwlib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CisJaWYoQ2xpZW50UG9ydF8gIT0gMCkKKwkJdGhyaWZ0Y29tbW9uOjpDb25uZWN0VG9TZXJ2ZXI8U2FtcGxlQ2FsbGJhY2tDbGllbnQsIFRUcmFuc3BvcnQ+KGNsaWVudHNydiwgdHJhbnNwb3J0LCBDbGllbnRQb3J0Xyk7CisJaWYoIUNsaWVudFBpcGVOYW1lXy5lbXB0eSgpKQorCQl0aHJpZnRjb21tb246OkNvbm5lY3RUb1NlcnZlcjxTYW1wbGVDYWxsYmFja0NsaWVudCwgVFRyYW5zcG9ydD4oY2xpZW50c3J2LCB0cmFuc3BvcnQsIENsaWVudFBpcGVOYW1lXyk7CisKKwl0cnkgeworCQl0cmFuc3BvcnQtPm9wZW4oKTsKKworCQljbGllbnRzcnYtPnBpbmdjbGllbnQoKTsKKwkJU2xlZXAoMTUwMCk7CisJCWNsaWVudHNydi0+cGluZ2NsaWVudCgpOworCQlTbGVlcCgxNTAwKTsKKwkJY2xpZW50c3J2LT5waW5nY2xpZW50KCk7CisKKwkJdHJhbnNwb3J0LT5jbG9zZSgpOworCX0gY2F0Y2ggKFRFeGNlcHRpb24gJnR4KSB7CisJCXByaW50ZigiRVJST1I6ICVzXG4iLCB0eC53aGF0KCkpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci9zZXJ2ZXIudmN4cHJvaiBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc2VydmVyLnZjeHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUzOWIyNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc2VydmVyLnZjeHByb2oKQEAgLTAsMCArMSwxMDYgQEAKKz88P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgIDwvSXRlbUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+CisgICAgPFByb2plY3RHdWlkPns3MkZDQUYyOS01MDZELTQxNjQtOUZBNi1GNTRDNUMyOEU3OUR9PC9Qcm9qZWN0R3VpZD4KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+CisgICAgPFJvb3ROYW1lc3BhY2U+c2VydmVyPC9Sb290TmFtZXNwYWNlPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+dHJ1ZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPmZhbHNlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KKyAgICA8Q2hhcmFjdGVyU2V0PlVuaWNvZGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8TGlua0luY3JlbWVudGFsPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KKyAgICA8TGlua0luY3JlbWVudGFsPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+Tm90VXNpbmc8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li4vOy4uLy4uLy4uL2xpYi9jcHAvc3JjOy4uLy4uLy4uLy4uL0Jvb3N0LzsuLi8uLi8uLi8uLi9Cb29zdC9ib29zdC90cjE7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4uLi8uLi8uLi9saWIvY3BwLyQoQ29uZmlndXJhdGlvbik7Li4vLi4vLi4vLi4vQm9vc3QvbGliOyUoQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+CisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5saWJ0aHJpZnQubGliO3dzMl8zMi5saWI7a2VybmVsMzIubGliO3VzZXIzMi5saWI7Z2RpMzIubGliO3dpbnNwb29sLmxpYjtjb21kbGczMi5saWI7YWR2YXBpMzIubGliO3NoZWxsMzIubGliO29sZTMyLmxpYjtvbGVhdXQzMi5saWI7dXVpZC5saWI7b2RiYzMyLmxpYjtvZGJjY3AzMi5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+Tm90VXNpbmc8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uLzsuLi8uLi8uLi9saWIvY3BwL3NyYzsuLi8uLi8uLi8uLi9Cb29zdC87Li4vLi4vLi4vLi4vQm9vc3QvYm9vc3QvdHIxOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgorICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+Li4vLi4vLi4vbGliL2NwcC8kKENvbmZpZ3VyYXRpb24pOy4uLy4uLy4uLy4uL0Jvb3N0L2xpYjslKEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+bGlidGhyaWZ0LmxpYjt3czJfMzIubGliO2tlcm5lbDMyLmxpYjt1c2VyMzIubGliO2dkaTMyLmxpYjt3aW5zcG9vbC5saWI7Y29tZGxnMzIubGliO2FkdmFwaTMyLmxpYjtzaGVsbDMyLmxpYjtvbGUzMi5saWI7b2xlYXV0MzIubGliO3V1aWQubGliO29kYmMzMi5saWI7b2RiY2NwMzIubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPE5vbmUgSW5jbHVkZT0iUmVhZE1lLnR4dCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZUNhbGxiYWNrLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZVNlcnZpY2UuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlX2NvbnN0YW50cy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfdHlwZXMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InN0ZGFmeC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0idGFyZ2V0dmVyLmgiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cVGhyaWZ0Q29tbW9uLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlQ2FsbGJhY2suY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVTZXJ2aWNlLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlX2NvbnN0YW50cy5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZV90eXBlcy5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzZXJ2ZXIuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3RkYWZ4LmNwcCI+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkNyZWF0ZTwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+Q3JlYXRlPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+CisgIDwvSW1wb3J0R3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci9zZXJ2ZXIudmN4cHJvai5maWx0ZXJzIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci9zZXJ2ZXIudmN4cHJvai5maWx0ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYjZkZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL3NlcnZlci52Y3hwcm9qLmZpbHRlcnMKQEAgLTAsMCArMSw2NiBAQAorPzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxJdGVtR3JvdXA+CisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXMiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgICA8RXh0ZW5zaW9ucz5jcHA7YztjYztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteDwvRXh0ZW5zaW9ucz4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9IkhlYWRlciBGaWxlcyI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICAgIDxFeHRlbnNpb25zPmg7aHBwO2h4eDtobTtpbmw7aW5jO3hzZDwvRXh0ZW5zaW9ucz4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlJlc291cmNlIEZpbGVzIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns2N0RBNkFCNi1GODAwLTRjMDgtOEI3QS04M0JCMTIxQUFEMDF9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgICAgPEV4dGVuc2lvbnM+cmM7aWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlO3Jlc3g7dGlmZjt0aWY7cG5nO3dhdjttZmNyaWJib24tbXM8L0V4dGVuc2lvbnM+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXNcZ2VuLWNwcCI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57ZGFiNjZkYjgtYmM0NS00NTE4LWFhZDItN2E3NTY5NjIyNmUzfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPE5vbmUgSW5jbHVkZT0iUmVhZE1lLnR4dCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzdGRhZnguaCI+CisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0idGFyZ2V0dmVyLmgiPgorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlX3R5cGVzLmgiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVTZXJ2aWNlLmgiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfY29uc3RhbnRzLmgiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVDYWxsYmFjay5oIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXGdlbi1jcHA8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzdGRhZnguY3BwIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzZXJ2ZXIuY3BwIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZV90eXBlcy5jcHAiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVTZXJ2aWNlLmNwcCI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xnZW4tY3BwPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZV9jb25zdGFudHMuY3BwIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXGdlbi1jcHA8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlQ2FsbGJhY2suY3BwIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXGdlbi1jcHA8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFRocmlmdENvbW1vbi5jcHAiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL3N0ZGFmeC5jcHAgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL3N0ZGFmeC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI1ZmY2MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc3RkYWZ4LmNwcApAQCAtMCwwICsxLDggQEAKKy8vIHN0ZGFmeC5jcHAgOiBzb3VyY2UgZmlsZSB0aGF0IGluY2x1ZGVzIGp1c3QgdGhlIHN0YW5kYXJkIGluY2x1ZGVzCisvLyBzZXJ2ZXIucGNoIHdpbGwgYmUgdGhlIHByZS1jb21waWxlZCBoZWFkZXIKKy8vIHN0ZGFmeC5vYmogd2lsbCBjb250YWluIHRoZSBwcmUtY29tcGlsZWQgdHlwZSBpbmZvcm1hdGlvbgorCisjaW5jbHVkZSAic3RkYWZ4LmgiCisKKy8vIFRPRE86IHJlZmVyZW5jZSBhbnkgYWRkaXRpb25hbCBoZWFkZXJzIHlvdSBuZWVkIGluIFNUREFGWC5ICisvLyBhbmQgbm90IGluIHRoaXMgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci9zdGRhZnguaCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc3RkYWZ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAwNWE4MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc3RkYWZ4LmgKQEAgLTAsMCArMSwxNSBAQAorLy8gc3RkYWZ4LmggOiBpbmNsdWRlIGZpbGUgZm9yIHN0YW5kYXJkIHN5c3RlbSBpbmNsdWRlIGZpbGVzLAorLy8gb3IgcHJvamVjdCBzcGVjaWZpYyBpbmNsdWRlIGZpbGVzIHRoYXQgYXJlIHVzZWQgZnJlcXVlbnRseSwgYnV0CisvLyBhcmUgY2hhbmdlZCBpbmZyZXF1ZW50bHkKKy8vCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAidGFyZ2V0dmVyLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRjaGFyLmg+CisKKworCisvLyBUT0RPOiByZWZlcmVuY2UgYWRkaXRpb25hbCBoZWFkZXJzIHlvdXIgcHJvZ3JhbSByZXF1aXJlcyBoZXJlCmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL3RhcmdldHZlci5oIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci90YXJnZXR2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2MwMDg2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci90YXJnZXR2ZXIuaApAQCAtMCwwICsxLDggQEAKKyNwcmFnbWEgb25jZQorCisvLyBJbmNsdWRpbmcgU0RLRERLVmVyLmggZGVmaW5lcyB0aGUgaGlnaGVzdCBhdmFpbGFibGUgV2luZG93cyBwbGF0Zm9ybS4KKworLy8gSWYgeW91IHdpc2ggdG8gYnVpbGQgeW91ciBhcHBsaWNhdGlvbiBmb3IgYSBwcmV2aW91cyBXaW5kb3dzIHBsYXRmb3JtLCBpbmNsdWRlIFdpblNES1Zlci5oIGFuZAorLy8gc2V0IHRoZSBfV0lOMzJfV0lOTlQgbWFjcm8gdG8gdGhlIHBsYXRmb3JtIHlvdSB3aXNoIHRvIHN1cHBvcnQgYmVmb3JlIGluY2x1ZGluZyBTREtEREtWZXIuaC4KKworI2luY2x1ZGUgPFNES0RES1Zlci5oPgpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3RocmlmdG1lLmJhdCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS90aHJpZnRtZS5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxZWY3OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS90aHJpZnRtZS5iYXQKQEAgLTAsMCArMSBAQAordGhyaWZ0LmV4ZSAtLWdlbiBjcHAgU2FtcGxlLnRocmlmdApkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3RocmlmdG1lLnNoIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3RocmlmdG1lLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMThmOTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvdGhyaWZ0bWUuc2gKQEAgLTAsMCArMSwyNCBAQAorIyEvYmluL2Jhc2gKKworVEhSSUZUX0NPTVBJTEVSPS4vdGhyaWZ0CitPVVRQVVRfRk9MREVSPSRQV0QKKworaWYgWyAhIC1lICIke1RIUklGVF9DT01QSUxFUn0iIF0KK3RoZW4KKyAgIFRIUklGVF9DT01QSUxFUj10aHJpZnQKKyAgIGNvbW1hbmQgLXYgICR7VEhSSUZUX0NPTVBJTEVSfSA+L2Rldi9udWxsIDI+JjEKKyAgIGlmIFsgJD8gLWVxIDEgXTsgdGhlbgorICAgICAgZWNobworICAgICAgZWNobyAidGhyaWZ0IGNvbXBpbGVyIG5vdCBmb3VuZC4iCisgICAgICBlY2hvCisgICAgICBleGl0CisgICBmaQorZmkKKworJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCBTYW1wbGUudGhyaWZ0CisKK2VjaG8KK2VjaG8gIkZpbGVzIGhhdmUgYmVlbiBnZW5lcmF0ZWQgaW4gZ2VuLWNwcC4iCisKK2V4aXQKKwpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3RyYW5zcG9ydC1zYW1wbGUuc2xuIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3RyYW5zcG9ydC1zYW1wbGUuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZmExZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvdHJhbnNwb3J0LXNhbXBsZS5zbG4KQEAgLTAsMCArMSwyNiBAQAorPworTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTEuMDAKKyMgVmlzdWFsIFN0dWRpbyAyMDEwCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInNlcnZlciIsICJzZXJ2ZXJcc2VydmVyLnZjeHByb2oiLCAiezcyRkNBRjI5LTUwNkQtNDE2NC05RkE2LUY1NEM1QzI4RTc5RH0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImNsaWVudCIsICJjbGllbnRcY2xpZW50LnZjeHByb2oiLCAiezg1RkJGQjU0LTUzMEItNDk4Ri05RjM4LTQ0QkEyMDRGQUU2QX0iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xXaW4zMiA9IERlYnVnfFdpbjMyCisJCVJlbGVhc2V8V2luMzIgPSBSZWxlYXNlfFdpbjMyCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXs3MkZDQUYyOS01MDZELTQxNjQtOUZBNi1GNTRDNUMyOEU3OUR9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCisJCXs3MkZDQUYyOS01MDZELTQxNjQtOUZBNi1GNTRDNUMyOEU3OUR9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgorCQl7NzJGQ0FGMjktNTA2RC00MTY0LTlGQTYtRjU0QzVDMjhFNzlEfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJezcyRkNBRjI5LTUwNkQtNDE2NC05RkE2LUY1NEM1QzI4RTc5RH0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCQl7ODVGQkZCNTQtNTMwQi00OThGLTlGMzgtNDRCQTIwNEZBRTZBfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7ODVGQkZCNTQtNTMwQi00OThGLTlGMzgtNDRCQTIwNEZBRTZBfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJezg1RkJGQjU0LTUzMEItNDk4Ri05RjM4LTQ0QkEyMDRGQUU2QX0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXs4NUZCRkI1NC01MzBCLTQ5OEYtOUYzOC00NEJBMjA0RkFFNkF9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisJRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS9jb250cmliL3ZhZ3JhbnQvY2VudG9zLTYuNS9SRUFETUUubWQgYi9jb250cmliL3ZhZ3JhbnQvY2VudG9zLTYuNS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1ODNmOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdmFncmFudC9jZW50b3MtNi41L1JFQURNRS5tZApAQCAtMCwwICsxLDYxIEBACitBcGFjaGUgVGhyaWZ0IENlbnRvcyA2LjUgVmFncmFudCBTdXBwb3J0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaGlzIGRpcmVjdG9yeSBpcyB0aGUgVmFncmFudCBwcm9qZWN0IGRpcmVjdG9yeSBmb3IgQXBhY2hlIFRocmlmdCBydW5uaW5nIG9uIENlbnRvcyA2LjUuIFRoZSBWYWdyYW50ZmlsZSBpbiB0aGlzIGRpcmVjdG9yeSBjb25maWd1cmVzIGEgVmFncmFudCBwcm92aXNpb25lZCBWTSBsYXVuY2hlZCB1bmRlciBWaXJ0dWFsQm94LiBUbyB1c2UgdGhpcyBwcm9qZWN0IHlvdSBtdXN0IGhhdmUgYSByZWNlbnQgdmVyc2lvbiBvZiBWaXJ0dWFsQm94IGFuZCBWYWdyYW50IGluc3RhbGxlZCAoaW4gdGhhdCBvcmRlcikuIFRvIHJ1biB0aGUgVk0sIG9wZW4gYSBzaGVsbCwgY2xvbmUgQXBhY2hlIFRocmlmdCwgY2hhbmdlIHRvIHRoaXMgZGlyZWN0b3J5IGFuZCBlbnRlciB0aGUgVmFncmFudCB1cCBjb21tYW5kLgorCisgICAkIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdAorICAgJCBjZCB0aHJpZnQvY29udHJpYi92YWdyYW50L2NlbnRvcy02LjUKKyAgICQgdmFncmFudCB1cAorCitUaGlzIHdpbGwgZG93bmxvYWQgYW5kIGxhdW5jaCB0aGUgYmFzZSBib3ggVk0gdW5kZXIgVmlydHVhbEJveCBhbmQgcnVuIHRoZSBBcGFjaGUgVGhyaWZ0IHByb3Zpc2lvbmluZyBzY3JpcHQuIFRoaXMgd2lsbCB0YWtlIHVwIHRvIGFuIGhvdXIgZGVwZW5kaW5nIG9uIHlvdXIgaGFyZHdhcmUgYW5kIG5ldHdvcmsuIE9uY2UgY29tcGxldGUgeW91IGNhbiBsb2dpbiB0byB0aGUgYm94IHdpdGggVmFncmFudCBzc2guIFRoZSB0aHJpZnQgc291cmNlIHRyZWUgZnJvbSB5b3VyIGhvc3Qgb3MgaXMgbW91bnRlZCBhdCAvdGhyaWZ0LgorCisgICAkIHZhZ3JhbnQgc3NoCisgICBbdmFncmFudEB0aHJpZnQgfl0kIGNkIC90aHJpZnQKKyAgIFt2YWdyYW50QHRocmlmdCB0aHJpZnRdJCBjb21waWxlci9jcHAvdGhyaWZ0IC0tdmVyc2lvbgorICAgVGhyaWZ0IHZlcnNpb24gPHZlcnNpb24+CisKK1RoZSBwcm92aXNpb25pbmcgc2NyaXB0IChpbnNpZGUgdGhlIFZhZ3JhbnRmaWxlKSBydW5zIC4vYm9vdHN0cmFwLnNoLCAuL2NvbmZpZ3VyZSwgbWFrZSBhbmQgbWFrZSBjaGVjaywgYnV0IGRvZXMgbm90IGluc3RhbGwgdGhyaWZ0LiBUbyBpbnN0YWxsIHRocmlmdCBydW4gIm1ha2UgaW5zdGFsbCIuCisKK1RoZSBWYWdyYW50IGJhc2UgYm94IHVzZWQgaGVyZSBpcyBhIG1pbmltYWwgQ2VudG9zIDYuNSBWaXJ0dWFsQm94IHdpdGggMkdCIFJBTSBhbmQgMiBDUFVzLiBGb3IgbW9yZSBWYWdyYW50IGluZm9ybWF0aW9uOiBodHRwczovL3d3dy52YWdyYW50dXAuY29tLiBBIHN1bW1hcnkgb2YgdGhlIGJhc2UgYm94IHByZXBhcmF0aW9uIGZvbGxvd3M6CisKK3Jvb3QgcGFzc3dvcmQ6IHZhZ3JhbnQKKworI0NyZWF0ZSB0aGUgdmFncmFudCB1c2VyIGFuZCBnaXZlIGl0IHN1ZG8gcGVybWlzc2lvbgorYWRkdXNlciB2YWdyYW50CitwYXNzd2QgdmFncmFudAordmlzdWRvICA6ICB2YWdyYW50IEFMTD0oQUxMKSBOT1BBU1NXRDogQUxMCisgICAgICAgICAgICNEZWZhdWx0cyByZXF1aXJldHR5CisKKyNTaHV0IGRvd24gdGhlIGZpcmV3YWxsIGFuZCBkaXNhYmxlIGl0CitzZXJ2aWNlIGlwdGFibGVzIHN0b3AKK2Noa2NvbmZpZyBpcHRhYmxlcyBvZmYKKworI1NldHVwIHRoZSB2YWdyYW50IHNzaCBwdWJsaWMga2V5IHRvIGFsbG93IHZhZ3JhbnQgdG8gc3NoCitta2RpciAvaG9tZS92YWdyYW50Ly5zc2gKK2NobW9kIDcwMCAvaG9tZS92YWdyYW50Ly5zc2gKK2NkIC9ob21lL3ZhZ3JhbnQvLnNzaAord2dldCAtLW5vLWNoZWNrLWNlcnRpZmljYXRlICdodHRwczovL3Jhdy5naXRodWIuY29tL21pdGNoZWxsaC92YWdyYW50L21hc3Rlci9rZXlzL3ZhZ3JhbnQucHViJyAtTyBhdXRob3JpemVkX2tleXMKK2NobW9kIDYwMCAvaG9tZS92YWdyYW50Ly5zc2gvYXV0aG9yaXplZF9rZXlzCitjaG93biAtUiB2YWdyYW50IC9ob21lL3ZhZ3JhbnQvLnNzaAorCisjSW5zdGFsbCBFUEVMIChFeHRyYSBQYWNrYWdlcyBmb3IgRW50ZXJwcmlzZSBMaW51eCkgYnV0IHByb3RlY3QgdGhlIGJhc2UKKyNyZXBvc2l0b3JpZXMgc28gdGhhdCBFUEVMIGRvZXMgbm90IG1hc2sgYmFzZSBwYWNrYWdlcworeXVtIC15IGluc3RhbGwgeXVtLXBsdWdpbi1wcm90ZWN0YmFzZQorcnBtIC1VdmggaHR0cDovL2Rvd25sb2FkLmZlZG9yYXByb2plY3Qub3JnL3B1Yi9lcGVsLzYvaTM4Ni9lcGVsLXJlbGVhc2UtNi04Lm5vYXJjaC5ycG0KKworI0luc3RhbGwgcGVybCwgZHluYW1pYyBrZXJuZWwgbW9kdWxlcywgZGV2IHRvb2xzIGFuZCBrZXJuZWwgaGVhZGVycyB0byBzdXBwb3J0CisjVmlydHVhbCBib3ggYWRkaXRpb25zCit5dW0gLXkgaW5zdGFsbCBwZXJsCit5dW0gLXkgLS1lbmFibGVyZXBvIGVwZWwgaW5zdGFsbCBka21zCit5dW0gLXkgZ3JvdXBpbnN0YWxsICJEZXZlbG9wbWVudCBUb29scyIKK3l1bSAteSBpbnN0YWxsIGtlcm5lbC1kZXZlbAorCisjVXBkYXRlIGV2ZXJ5dGhpbmcgYW5kIHJlYm9vdAoreXVtIHVwZGF0ZQorcmVib290CisKKyNJbnN0YWxsIHRoZSBWaXJ0dWFsQm94IEd1ZXN0IGFkZGl0aW9ucyAodXNpbmcgVmlydHVhbEJveCBpc28pCittb3VudCAvZGV2L2Nkcm9tIC9tbnQKKy9tbnQvVkJveExpbnV4QWRkaXRpb25zLnJ1bgordW1vdW50IC9tbnQKKworU2VlIHRoZSBWYWdyYW50ZmlsZSBmb3IgZnVydGhlciBkZXRhaWxzCmRpZmYgLS1naXQgYS9jb250cmliL3ZhZ3JhbnQvY2VudG9zLTYuNS9WYWdyYW50ZmlsZSBiL2NvbnRyaWIvdmFncmFudC9jZW50b3MtNi41L1ZhZ3JhbnRmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYTIyMzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3ZhZ3JhbnQvY2VudG9zLTYuNS9WYWdyYW50ZmlsZQpAQCAtMCwwICsxLDI3NCBAQAorIyAtKi0gbW9kZTogcnVieSAtKi0KKyMgdmk6IHNldCBmdD1ydWJ5IDoKKworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgQVBBQ0hFIFRIUklGVCBQUk9WSVNJT05JTkcgU0NSSVBUCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBUaGlzIHNjcmlwdCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYmFzZSBDZW50b3MgNi41CisjIFZhZ3JhbnQgYm94IGZvciBBcGFjaGUgVGhyaWZ0IGNvbXBpbGVyIGFuZCBsaWIgYnVpbGRzLgorIyBUaGUgYmFzZSBib3ggaXMgQ2VudG9zIDYuNSB3aXRoIG5vIGFkZGl0aW9uYWwgcGFja2FnZXMKKyMgZXhjZXB0IHRob3NlIHJlcXVpcmVkIHRvIHN1cHBvcnQgVmlydHVhbEJveCBHdWVzdCB0b29sczoKKyMgcGVybCwgZGttcywga2VybmVsLWRldmVsIGFuZCB0aGUgIkRldmVsb3BtZW50IFRvb2xzIiBncm91cC4KKyMgVGhlIGVwZWwgcmVwbyB3YXMgYWxzbyBhZGRlZCBhbG9uZyB3aXRoIHRoZQorIyB5dW0tcGx1Z2luLXByb3RlY3RiYXNlIHBhY2thZ2UgdG8gcHJlZmVyIGJhc2UgcmVwbyBwYWNrYWdlcy4KKyMgVGhlIHNjcmlwdCBiZWxvdyBwcm92aXNpb25zIEFMTCBsYW5ndWFnZXMuIFRoaXMgd2lsbCB0YWtlCisjIHRpbWUuIFlvdSBjYW4gZ3JlYXRseSByZWR1Y2UgdGhlIGJ1aWxkIHRpbWUgYnkgY29tbWVudGluZworIyBvdXQgdGhlIExJQiBwcm92aXNpb25pbmcgZm9yIHVuZWVkZWQgbGFuZ3VhZ2UgbGlicmFyaWVzLgorIyBFeHBlY3QgZnVsbCBwcm92aXNpb25pbmcgdG8gdGFrZSAzMCBtaW51dGVzIG9uIGEgZmFzdAorIyBtYWNoaW5lIHdpdGggYW4gZXhjZWxsZW50IEludGVybmV0IGNvbm5lY3Rpb24gKGFuZCBhbm90aGVyCisjIDE1IG1pbnV0ZXMgZm9yIHRoZSBidWlsZCkuCisjCisjIE1hY2hpbmUgYWNjb3VudHM6CisjIC0gVXNlcjogdmFncmFudC92YWdyYW50CisjIC0gQWRtaW46IHJvb3QvdmFncmFudAorIyBWYWdyYW50IHB1YmxpYyBzc2gga2V5IGFsc28gaW5zdGFsbGVkCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCiskYnVpbGRfYW5kX3Rlc3QgPSA8PFNDUklQVAorZWNobyAiUHJvdmlzaW9uaW5nIHN5c3RlbSB0byBjb21waWxlIGFuZCB0ZXN0IEFwYWNoZSBUaHJpZnQuIgorZGF0ZSA+IC9ldGMvdmFncmFudC5wcm92aXNpb25fYmVnaW4KKworIyBBcGFjaGUgVGhyaWZ0IGNvbXBpbGVyIGRlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjaW5zdGFsbCBhbiB1cGRhdGVkIGF1dG9jb25mCit3Z2V0IGh0dHA6Ly9mdHAuZ251Lm9yZy9nbnUvYXV0b2NvbmYvYXV0b2NvbmYtMi42OS50YXIuZ3oKK3RhciB4dmYgYXV0b2NvbmYtMi42OS50YXIuZ3oKK2NkIGF1dG9jb25mLTIuNjkKKy4vY29uZmlndXJlIC0tcHJlZml4PS91c3IKK21ha2UKK3N1ZG8gbWFrZSBpbnN0YWxsCitjZCAuLgorCisjaW5zdGFsbCBhbiB1cGRhdGVkIGF1dG9tYWtlCit3Z2V0IGh0dHA6Ly9mdHAuZ251Lm9yZy9nbnUvYXV0b21ha2UvYXV0b21ha2UtMS4xNC50YXIuZ3oKK3RhciB4dmYgYXV0b21ha2UtMS4xNC50YXIuZ3oKK2NkIGF1dG9tYWtlLTEuMTQKKy4vY29uZmlndXJlIC0tcHJlZml4PS91c3IKK21ha2UKK3N1ZG8gbWFrZSBpbnN0YWxsCitjZCAuLgorCisjaW5zdGFsbCBhbiB1cGRhdGVkIGJpc29uCit3Z2V0IGh0dHA6Ly9mdHAuZ251Lm9yZy9nbnUvYmlzb24vYmlzb24tMi41LjEudGFyLmd6Cit0YXIgeHZmIGJpc29uLTIuNS4xLnRhci5negorY2QgYmlzb24tMi41LjEKKy4vY29uZmlndXJlIC0tcHJlZml4PS91c3IKK21ha2UKK3N1ZG8gbWFrZSBpbnN0YWxsCitjZCAuLgorCisjIEMrKzk4IExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIC15IGluc3RhbGwgbGliZXZlbnQtZGV2ZWwgemxpYi1kZXZlbCBvcGVuc3NsLWRldmVsCisKKyNJbnN0YWxsIGFuIHVwZGF0ZWQgQm9vc3QgbGlicmFyeQord2dldCBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2Jvb3N0L2ZpbGVzL2Jvb3N0LzEuNTUuMC9ib29zdF8xXzU1XzAudGFyLmd6Cit0YXIgeHZmIGJvb3N0XzFfNTVfMC50YXIuZ3oKK2NkIGJvb3N0XzFfNTVfMAorLi9ib290c3RyYXAuc2gKK3N1ZG8gLi9iMiBpbnN0YWxsCisKKyMgSmF2YSBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWRvIHl1bSBpbnN0YWxsIC15IGFudCBqdW5pdCBhbnQtbm9kZXBzIGFudC1qdW5pdCBqYXZhLTEuOC4wLW9wZW5qZGstZGV2ZWwKKworIyBQeXRob24gTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gaW5zdGFsbCAteSBweXRob24tZGV2ZWwgcHl0aG9uLXNldHVwdG9vbHMgcHl0aG9uLXR3aXN0ZWQKKworIyBSdWJ5IExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgcnVieSBydWJ5LWRldmVsIHJ1YnlnZW1zCitzdWRvIGdlbSBpbnN0YWxsIGJ1bmRsZXIgcmFrZQorCisjIE5vZGUuanMgTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gaW5zdGFsbCAteSBub2RlanMgbm9kZWpzLWRldmVsIG5wbQorCisjIFBlcmwgTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gaW5zdGFsbCAteSBwZXJsLUJpdC1WZWN0b3IgcGVybC1DbGFzcy1BY2Nlc3NvciBwZXJsLUV4dFV0aWxzLU1ha2VNYWtlciBwZXJsLVRlc3QtU2ltcGxlCisKKyMgUEhQIExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgcGhwIHBocC1kZXZlbCBwaHAtcGVhciByZTJjCisKKyMgR0xpYkMgTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gaW5zdGFsbCAteSBnbGliMi1kZXZlbAorCisjIEVybGFuZyBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWRvIHl1bSBpbnN0YWxsIC15IGVybGFuZy1rZXJuZWwgZXJsYW5nLWVydHMgZXJsYW5nLXN0ZGxpYiBlcmxhbmctZXVuaXQgZXJsYW5nLXJlYmFyCisKKyMgTHVhIExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgbHVhLWRldmVsCisKKyMgR28gTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gaW5zdGFsbCAteSBnb2xhbmcgZ29sYW5nLXBrZy1saW51eC1hbWQ2NAorCisjIEMjIExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgbW9uby1jb3JlIG1vbm8tZGV2ZWwgbW9uby13ZWItZGV2ZWwgbW9uby1leHRyYXMgbWluZ3czMi1iaW51dGlscyBtaW5ndzMyLXJ1bnRpbWUgbWluZ3czMi1uc2lzCisKKyMgSGFza2VsbCBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit3Z2V0IGh0dHA6Ly9zaGVya2luLmp1c3RodWIub3JnL2VsNi9SUE1TL3g4Nl82NC9qdXN0aHViLXJlbGVhc2UtMi4wLTQuMC5lbDYueDg2XzY0LnJwbQorc3VkbyBycG0gLWl2aCBqdXN0aHViLXJlbGVhc2UtMi4wLTQuMC5lbDYueDg2XzY0LnJwbQorc3VkbyB5dW0gLXkgaW5zdGFsbCBoYXNrZWxsCitzdWRvIGNhYmFsIHVwZGF0ZQorc3VkbyBjYWJhbCBpbnN0YWxsIGNhYmFsLWluc3RhbGwKKworIyBCdWlsZCBhbmQgVGVzdCBBcGFjaGUgVGhyaWZ0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkYXRlID4gL2V0Yy92YWdyYW50LnByb3Zpc2lvbl9lbmQKK2VjaG8gIlN0YXJ0aW5nIEFwYWNoZSBUaHJpZnQgYnVpbGQuLi4iCitjZCAvdGhyaWZ0CitzaCBib290c3RyYXAuc2gKKworIyBBdCB0aGUgdGltZSBvZiB0aGlzIGZpbGUncyBjcmVhdGlvbiBSdWJ5LCBQeXRob24sIEdvIGFuZCBMdWEgZmFpbAorIyB0aGVpciB1bml0IHRlc3RzIGluIHRoaXMgZW52aXJvbm1lbnQuIFRvIGJ1aWxkIGFuZCB0ZXN0IGFueSBvZiB0aGVzZQorIyBsaWJyYXJpZXMgdW5jb21tZW50IHRoZSBhcHByb3ByaWF0ZSAtLXdpdGhvdXQgc3dpdGNoZXMgYmVsb3cuCisKK3NoIGNvbmZpZ3VyZSAtLXdpdGhvdXQtcnVieSAtLXdpdGhvdXQtZ28gLS13aXRob3V0LWx1YSAtLXdpdGhvdXQtcHl0aG9uCittYWtlCitlY2hvICJTdGFydGluZyBBcGFjaGUgVGhyaWZ0IHRlc3RzLi4uIgorbWFrZSBjaGVjaworZWNobyAiRmluaXNoZWQgYnVpbGRpbmcgYW5kIHRlc3RpbmcgQXBhY2hlIFRocmlmdC4iCitlY2hvICdVc2UgIm1ha2UgaW5zdGFsbCIgdG8gaW5zdGFsbCB0aGUgY29tcGlsZXIgYW5kIGxpYnJhcmllcy4nCitkYXRlID4gL2V0Yy92YWdyYW50Lm1ha2VfZW5kCisKK1NDUklQVAorCitWYWdyYW50LmNvbmZpZ3VyZSgiMiIpIGRvIHxjb25maWd8CisgICMgRXZlcnkgVmFncmFudCB2aXJ0dWFsIGVudmlyb25tZW50IHJlcXVpcmVzIGEgYm94IHRvIGJ1aWxkIG9mZiBvZi4KKyAgIyMjIyMgQ2VudG9zIDYuNSBtaW5pbWFsIHN5c3RlbSB3aXRoIFZpcnR1YWxCb3ggR3Vlc3QgQWRkaXRpb25zCisgICMjIyMjIEJveCBtYWludGFpbmVkIGJ5IHJhQGFwYWNoZS5vcmcsIHNlZSBSRUFETUUubWQgZm9yIGJveCBjb25maWcKKyAgY29uZmlnLnZtLmJveCA9ICJSYW5keUFiZXJuZXRoeS90aHJpZnQtY2VudG9zLTYuNS02NCIKKworICAjIERpc2FibGUgYXV0b21hdGljIGJveCB1cGRhdGUgY2hlY2tpbmcuIElmIHlvdSBkaXNhYmxlIHRoaXMsIHRoZW4KKyAgIyBib3hlcyB3aWxsIG9ubHkgYmUgY2hlY2tlZCBmb3IgdXBkYXRlcyB3aGVuIHRoZSB1c2VyIHJ1bnMKKyAgIyBgdmFncmFudCBib3ggb3V0ZGF0ZWRgLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZC4KKyAgIyMjIyMgVGhpcyBib3ggd2lsbCBuZXZlciBjaGFuZ2UKKyAgY29uZmlnLnZtLmJveF9jaGVja191cGRhdGUgPSBmYWxzZQorCisgICMgQ3JlYXRlIGEgZm9yd2FyZGVkIHBvcnQgbWFwcGluZyB3aGljaCBhbGxvd3MgYWNjZXNzIHRvIGEgc3BlY2lmaWMgcG9ydAorICAjIHdpdGhpbiB0aGUgbWFjaGluZSBmcm9tIGEgcG9ydCBvbiB0aGUgaG9zdCBtYWNoaW5lLiBJbiB0aGUgZXhhbXBsZSBiZWxvdywKKyAgIyBhY2Nlc3NpbmcgImxvY2FsaG9zdDo4MDgwIiB3aWxsIGFjY2VzcyBwb3J0IDgwIG9uIHRoZSBndWVzdCBtYWNoaW5lLgorICAjIGNvbmZpZy52bS5uZXR3b3JrICJmb3J3YXJkZWRfcG9ydCIsIGd1ZXN0OiA4MCwgaG9zdDogODA4MAorCisgICMgQ3JlYXRlIGEgcHJpdmF0ZSBuZXR3b3JrLCB3aGljaCBhbGxvd3MgaG9zdC1vbmx5IGFjY2VzcyB0byB0aGUgbWFjaGluZQorICAjIHVzaW5nIGEgc3BlY2lmaWMgSVAuCisgICMgY29uZmlnLnZtLm5ldHdvcmsgInByaXZhdGVfbmV0d29yayIsIGlwOiAiMTkyLjE2OC4zMy4xMCIKKworICAjIENyZWF0ZSBhIHB1YmxpYyBuZXR3b3JrLCB3aGljaCBnZW5lcmFsbHkgbWF0Y2hlZCB0byBicmlkZ2VkIG5ldHdvcmsuCisgICMgQnJpZGdlZCBuZXR3b3JrcyBtYWtlIHRoZSBtYWNoaW5lIGFwcGVhciBhcyBhbm90aGVyIHBoeXNpY2FsIGRldmljZSBvbgorICAjIHlvdXIgbmV0d29yay4KKyAgIyBjb25maWcudm0ubmV0d29yayAicHVibGljX25ldHdvcmsiCisKKyAgIyBJZiB0cnVlLCB0aGVuIGFueSBTU0ggY29ubmVjdGlvbnMgbWFkZSB3aWxsIGVuYWJsZSBhZ2VudCBmb3J3YXJkaW5nLgorICAjIERlZmF1bHQgdmFsdWU6IGZhbHNlCisgICMgY29uZmlnLnNzaC5mb3J3YXJkX2FnZW50ID0gdHJ1ZQorCisgICMgU2hhcmUgYW4gYWRkaXRpb25hbCBmb2xkZXIgdG8gdGhlIGd1ZXN0IFZNLiBUaGUgZmlyc3QgYXJndW1lbnQgaXMKKyAgIyB0aGUgcGF0aCBvbiB0aGUgaG9zdCB0byB0aGUgYWN0dWFsIGZvbGRlci4gVGhlIHNlY29uZCBhcmd1bWVudCBpcworICAjIHRoZSBwYXRoIG9uIHRoZSBndWVzdCB0byBtb3VudCB0aGUgZm9sZGVyLiBBbmQgdGhlIG9wdGlvbmFsIHRoaXJkCisgICMgYXJndW1lbnQgaXMgYSBzZXQgb2Ygbm9uLXJlcXVpcmVkIG9wdGlvbnMuCisgICMgY29uZmlnLnZtLnN5bmNlZF9mb2xkZXIgIi4uL2RhdGEiLCAiL3ZhZ3JhbnRfZGF0YSIKKyAgIyMjIyMgQnkgY29udmVudGlvbiB0aGUgdGhyaWZ0IHNvdXJjZSB0cmVlIGlzIG1hcHBlZCB0byAvdGhyaWZ0CisgIGNvbmZpZy52bS5zeW5jZWRfZm9sZGVyICIuLi8uLi8uLi8iLCAiL3RocmlmdCIKKworICAjIFByb3ZpZGVyLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gc28geW91IGNhbiBmaW5lLXR1bmUgdmFyaW91cworICAjIGJhY2tpbmcgcHJvdmlkZXJzIGZvciBWYWdyYW50LiBUaGVzZSBleHBvc2UgcHJvdmlkZXItc3BlY2lmaWMgb3B0aW9ucy4KKyAgIyMjIyMgVGhlIG1hY2hpbmUgbmVlZHMgMiBDUFVzIGFuZCAyR0IgUkFNIGZvciByZWFzb25hYmxlIHBlcmZvcm1hbmNlCisgIGNvbmZpZy52bS5wcm92aWRlciAidmlydHVhbGJveCIgZG8gfHZifAorICAgIHZiLmN1c3RvbWl6ZSBbIm1vZGlmeXZtIiwgOmlkLCAiLS1tZW1vcnkiLCAiMjA0OCJdCisgICAgdmIuY3VzdG9taXplIFsibW9kaWZ5dm0iLCA6aWQsICItLWNwdXMiLCAiMiJdCisgIGVuZAorCisgICMgRW5hYmxlIHByb3Zpc2lvbmluZyB3aXRoIENGRW5naW5lLiBDRkVuZ2luZSBDb21tdW5pdHkgcGFja2FnZXMgYXJlCisgICMgYXV0b21hdGljYWxseSBpbnN0YWxsZWQuIEZvciBleGFtcGxlLCBjb25maWd1cmUgdGhlIGhvc3QgYXMgYQorICAjIHBvbGljeSBzZXJ2ZXIgYW5kIG9wdGlvbmFsbHkgYSBwb2xpY3kgZmlsZSB0byBydW46CisgICMKKyAgIyBjb25maWcudm0ucHJvdmlzaW9uICJjZmVuZ2luZSIgZG8gfGNmfAorICAjICAgY2YuYW1fcG9saWN5X2h1YiA9IHRydWUKKyAgIyAgICMgY2YucnVuX2ZpbGUgPSAibW90ZC5jZiIKKyAgIyBlbmQKKyAgIworICAjIFlvdSBjYW4gYWxzbyBjb25maWd1cmUgYW5kIGJvb3RzdHJhcCBhIGNsaWVudCB0byBhbiBleGlzdGluZworICAjIHBvbGljeSBzZXJ2ZXI6CisgICMKKyAgIyBjb25maWcudm0ucHJvdmlzaW9uICJjZmVuZ2luZSIgZG8gfGNmfAorICAjICAgY2YucG9saWN5X3NlcnZlcl9hZGRyZXNzID0gIjEwLjAuMi4xNSIKKyAgIyBlbmQKKworICAjIEVuYWJsZSBwcm92aXNpb25pbmcgd2l0aCBQdXBwZXQgc3RhbmQgYWxvbmUuICBQdXBwZXQgbWFuaWZlc3RzCisgICMgYXJlIGNvbnRhaW5lZCBpbiBhIGRpcmVjdG9yeSBwYXRoIHJlbGF0aXZlIHRvIHRoaXMgVmFncmFudGZpbGUuCisgICMgWW91IHdpbGwgbmVlZCB0byBjcmVhdGUgdGhlIG1hbmlmZXN0cyBkaXJlY3RvcnkgYW5kIGEgbWFuaWZlc3QgaW4KKyAgIyB0aGUgZmlsZSBkZWZhdWx0LnBwIGluIHRoZSBtYW5pZmVzdHNfcGF0aCBkaXJlY3RvcnkuCisgICMKKyAgIyBjb25maWcudm0ucHJvdmlzaW9uICJwdXBwZXQiIGRvIHxwdXBwZXR8CisgICMgICBwdXBwZXQubWFuaWZlc3RzX3BhdGggPSAibWFuaWZlc3RzIgorICAjICAgcHVwcGV0Lm1hbmlmZXN0X2ZpbGUgID0gImRlZmF1bHQucHAiCisgICMgZW5kCisKKyAgIyBFbmFibGUgcHJvdmlzaW9uaW5nIHdpdGggY2hlZiBzb2xvLCBzcGVjaWZ5aW5nIGEgY29va2Jvb2tzIHBhdGgsIHJvbGVzCisgICMgcGF0aCwgYW5kIGRhdGFfYmFncyBwYXRoIChhbGwgcmVsYXRpdmUgdG8gdGhpcyBWYWdyYW50ZmlsZSksIGFuZCBhZGRpbmcKKyAgIyBzb21lIHJlY2lwZXMgYW5kL29yIHJvbGVzLgorICAjCisgICMgY29uZmlnLnZtLnByb3Zpc2lvbiAiY2hlZl9zb2xvIiBkbyB8Y2hlZnwKKyAgIyAgIGNoZWYuY29va2Jvb2tzX3BhdGggPSAiLi4vbXktcmVjaXBlcy9jb29rYm9va3MiCisgICMgICBjaGVmLnJvbGVzX3BhdGggPSAiLi4vbXktcmVjaXBlcy9yb2xlcyIKKyAgIyAgIGNoZWYuZGF0YV9iYWdzX3BhdGggPSAiLi4vbXktcmVjaXBlcy9kYXRhX2JhZ3MiCisgICMgICBjaGVmLmFkZF9yZWNpcGUgIm15c3FsIgorICAjICAgY2hlZi5hZGRfcm9sZSAid2ViIgorICAjCisgICMgICAjIFlvdSBtYXkgYWxzbyBzcGVjaWZ5IGN1c3RvbSBKU09OIGF0dHJpYnV0ZXM6CisgICMgICBjaGVmLmpzb24gPSB7IG15c3FsX3Bhc3N3b3JkOiAiZm9vIiB9CisgICMgZW5kCisKKyAgIyBFbmFibGUgcHJvdmlzaW9uaW5nIHdpdGggY2hlZiBzZXJ2ZXIsIHNwZWNpZnlpbmcgdGhlIGNoZWYgc2VydmVyIFVSTCwKKyAgIyBhbmQgdGhlIHBhdGggdG8gdGhlIHZhbGlkYXRpb24ga2V5IChyZWxhdGl2ZSB0byB0aGlzIFZhZ3JhbnRmaWxlKS4KKyAgIworICAjIFRoZSBPcHNjb2RlIFBsYXRmb3JtIHVzZXMgSFRUUFMuIFN1YnN0aXR1dGUgeW91ciBvcmdhbml6YXRpb24gZm9yCisgICMgT1JHTkFNRSBpbiB0aGUgVVJMIGFuZCB2YWxpZGF0aW9uIGtleS4KKyAgIworICAjIElmIHlvdSBoYXZlIHlvdXIgb3duIENoZWYgU2VydmVyLCB1c2UgdGhlIGFwcHJvcHJpYXRlIFVSTCwgd2hpY2ggbWF5IGJlCisgICMgSFRUUCBpbnN0ZWFkIG9mIEhUVFBTIGRlcGVuZGluZyBvbiB5b3VyIGNvbmZpZ3VyYXRpb24uIEFsc28gY2hhbmdlIHRoZQorICAjIHZhbGlkYXRpb24ga2V5IHRvIHZhbGlkYXRpb24ucGVtLgorICAjCisgICMgY29uZmlnLnZtLnByb3Zpc2lvbiAiY2hlZl9jbGllbnQiIGRvIHxjaGVmfAorICAjICAgY2hlZi5jaGVmX3NlcnZlcl91cmwgPSAiaHR0cHM6Ly9hcGkub3BzY29kZS5jb20vb3JnYW5pemF0aW9ucy9PUkdOQU1FIgorICAjICAgY2hlZi52YWxpZGF0aW9uX2tleV9wYXRoID0gIk9SR05BTUUtdmFsaWRhdG9yLnBlbSIKKyAgIyBlbmQKKyAgIworICAjIElmIHlvdSdyZSB1c2luZyB0aGUgT3BzY29kZSBwbGF0Zm9ybSwgeW91ciB2YWxpZGF0b3IgY2xpZW50IGlzCisgICMgT1JHTkFNRS12YWxpZGF0b3IsIHJlcGxhY2luZyBPUkdOQU1FIHdpdGggeW91ciBvcmdhbml6YXRpb24gbmFtZS4KKyAgIworICAjIElmIHlvdSBoYXZlIHlvdXIgb3duIENoZWYgU2VydmVyLCB0aGUgZGVmYXVsdCB2YWxpZGF0aW9uIGNsaWVudCBuYW1lIGlzCisgICMgY2hlZi12YWxpZGF0b3IsIHVubGVzcyB5b3UgY2hhbmdlZCB0aGUgY29uZmlndXJhdGlvbi4KKyAgIworICAjICAgY2hlZi52YWxpZGF0aW9uX2NsaWVudF9uYW1lID0gIk9SR05BTUUtdmFsaWRhdG9yIgorCisgICMjIyMjIFJ1biB0aGUgQXBhY2hlIFRocmlmdCBwcm92aXNpb25pbmcgc2NyaXB0IChkZWNsYXJlZCBhYm92ZSkKKyAgY29uZmlnLnZtLnByb3Zpc2lvbiA6c2hlbGwsIDppbmxpbmUgPT4gJGJ1aWxkX2FuZF90ZXN0CitlbmQKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL01ha2VmaWxlIGIvY29udHJpYi96ZXJvbXEvTWFrZWZpbGUKaW5kZXggYTFkNzE1Ni4uZWUzOThlMiAxMDA2NDQKLS0tIGEvY29udHJpYi96ZXJvbXEvTWFrZWZpbGUKKysrIGIvY29udHJpYi96ZXJvbXEvTWFrZWZpbGUKQEAgLTEsNiArMSw0IEBACiBUSFJJRlQgPSB0aHJpZnQKLUNYWEZMQUdTID0gYHBrZy1jb25maWcgLS1jZmxhZ3MgbGliem1xIHRocmlmdGAKLUxETElCUyA9IGBwa2ctY29uZmlnIC0tbGlicyBsaWJ6bXEgdGhyaWZ0YAogCiBDWFhGTEFHUyArPSAtZzMgLU8wCiAKQEAgLTE2LDE1ICsxNCwxOSBAQAogYWxsOiAkKFBZTElCUykgJChQUk9HUykKIAogdGVzdC1jbGllbnQ6IHRlc3QtY2xpZW50Lm8gVFptcUNsaWVudC5vICQoR0VOT0JKUykKKwkkKENYWCkgJF4gLW8gJEAgLWx6bXEgLWx0aHJpZnQKIHRlc3Qtc2VydmVyOiB0ZXN0LXNlcnZlci5vIFRabXFTZXJ2ZXIubyAkKEdFTk9CSlMpCisJJChDWFgpICReIC1vICRAIC1sem1xIC1sdGhyaWZ0CiB0ZXN0LXNlbmRlcjogdGVzdC1zZW5kZXIubyBUWm1xQ2xpZW50Lm8gJChHRU5PQkpTKQorCSQoQ1hYKSAkXiAtbyAkQCAtbHptcSAtbHRocmlmdAogdGVzdC1yZWNlaXZlcjogdGVzdC1yZWNlaXZlci5vIFRabXFTZXJ2ZXIubyAkKEdFTk9CSlMpCisJJChDWFgpICReIC1vICRAIC1sem1xIC1sdGhyaWZ0CiAKIHRlc3QtY2xpZW50Lm8gdGVzdC1zZXJ2ZXIubyB0ZXN0LXNlbmRlci5vIHRlc3QtcmVjZWl2ZXIubzogJChHRU5TUkNTKQogCiBzdG9yYWdlL19faW5pdF9fLnB5OiBzdG9yYWdlLnRocmlmdAogCSQoUk0pICQoZGlyICRAKQotCSQoVEhSSUZUKSAtLWdlbiBweTpuZXdzdHlsZSAkPAorCSQoVEhSSUZUKSAtLWdlbiBweSAkPAogCW12IGdlbi1weS8kKGRpciAkQCkgLgogCiAkKEdFTlNSQ1MpOiBzdG9yYWdlLnRocmlmdApkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvUkVBRE1FIGIvY29udHJpYi96ZXJvbXEvUkVBRE1FLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb250cmliL3plcm9tcS9SRUFETUUKcmVuYW1lIHRvIGNvbnRyaWIvemVyb21xL1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5jcHAgYi9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LmNwcAppbmRleCAxMzMyMDRlLi41NjI3OGYzIDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LmNwcAorKysgYi9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LmNwcApAQCAtMjIsNyArMjIsNyBAQAogCiBuYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewogCi11aW50MzJfdCBUWm1xQ2xpZW50OjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Cit1aW50MzJfdCBUWm1xQ2xpZW50OjpyZWFkX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKICAgaWYgKHJidWZfLmF2YWlsYWJsZV9yZWFkKCkgPT0gMCkgewogICAgICh2b2lkKXNvY2tfLnJlY3YoJm1zZ18pOwogICAgIHJidWZfLnJlc2V0QnVmZmVyKCh1aW50OF90Kiltc2dfLmRhdGEoKSwgbXNnXy5zaXplKCkpOwpAQCAtMzAsMTEgKzMwLDExIEBACiAgIHJldHVybiByYnVmXy5yZWFkKGJ1ZiwgbGVuKTsKIH0KIAotdm9pZCBUWm1xQ2xpZW50Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewordm9pZCBUWm1xQ2xpZW50Ojp3cml0ZV92aXJ0KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CiAgIHJldHVybiB3YnVmXy53cml0ZShidWYsIGxlbik7CiB9CiAKLXZvaWQgVFptcUNsaWVudDo6d3JpdGVFbmQoKSB7Cit1aW50MzJfdCBUWm1xQ2xpZW50Ojp3cml0ZUVuZCgpIHsKICAgdWludDhfdCogYnVmOwogICB1aW50MzJfdCBzaXplOwogICB3YnVmXy5nZXRCdWZmZXIoJmJ1ZiwgJnNpemUpOwpAQCAtNDIsNiArNDIsNyBAQAogICBzdGQ6Om1lbWNweShtc2cuZGF0YSgpLCBidWYsIHNpemUpOwogICAodm9pZClzb2NrXy5zZW5kKG1zZyk7CiAgIHdidWZfLnJlc2V0QnVmZmVyKHRydWUpOworICByZXR1cm4gc2l6ZTsKIH0KIAogfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL1RabXFDbGllbnQuaCBiL2NvbnRyaWIvemVyb21xL1RabXFDbGllbnQuaAppbmRleCA5NTQ0NTAzLi5kZjE2ZTAzIDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LmgKKysrIGIvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5oCkBAIC0yMSw3ICsyMSw3IEBACiAjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RaTVFDTElFTlRfSF8gMQogCiAjaW5jbHVkZSA8em1xLmhwcD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAKIG5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKQEAgLTQ1LDE1ICs0NSwxNSBAQAogICAgIH0KICAgfQogCi0gIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB1aW50MzJfdCByZWFkX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwogCi0gIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB2b2lkIHdyaXRlX3ZpcnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwogCi0gIHZvaWQgd3JpdGVFbmQoKTsKKyAgdWludDMyX3Qgd3JpdGVFbmQoKTsKIAogIHByb3RlY3RlZDoKLSAgc3RkOjpzdHJpbmcgZW5kcG9pbnRfOwogICB6bXE6OnNvY2tldF90IHNvY2tfOworICBzdGQ6OnN0cmluZyBlbmRwb2ludF87CiAgIFRNZW1vcnlCdWZmZXIgd2J1Zl87CiAgIFRNZW1vcnlCdWZmZXIgcmJ1Zl87CiAgIHptcTo6bWVzc2FnZV90IG1zZ187CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LnB5IGIvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5weQppbmRleCBkNTYwNjk3Li4xYmQ2MGExIDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LnB5CisrKyBiL2NvbnRyaWIvemVyb21xL1RabXFDbGllbnQucHkKQEAgLTIwLDQ0ICsyMCw0NSBAQAogZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiBmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydAogCisKIGNsYXNzIFRabXFDbGllbnQoVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydCk6Ci0gIGRlZiBfX2luaXRfXyhzZWxmLCBjdHgsIGVuZHBvaW50LCBzb2NrX3R5cGUpOgotICAgIHNlbGYuX3NvY2sgPSBjdHguc29ja2V0KHNvY2tfdHlwZSkKLSAgICBzZWxmLl9lbmRwb2ludCA9IGVuZHBvaW50Ci0gICAgc2VsZi5fd2J1ZiA9IFN0cmluZ0lPKCkKLSAgICBzZWxmLl9yYnVmID0gU3RyaW5nSU8oKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjdHgsIGVuZHBvaW50LCBzb2NrX3R5cGUpOgorICAgICAgICBzZWxmLl9zb2NrID0gY3R4LnNvY2tldChzb2NrX3R5cGUpCisgICAgICAgIHNlbGYuX2VuZHBvaW50ID0gZW5kcG9pbnQKKyAgICAgICAgc2VsZi5fd2J1ZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5fcmJ1ZiA9IFN0cmluZ0lPKCkKIAotICBkZWYgb3BlbihzZWxmKToKLSAgICBzZWxmLl9zb2NrLmNvbm5lY3Qoc2VsZi5fZW5kcG9pbnQpCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHNlbGYuX3NvY2suY29ubmVjdChzZWxmLl9lbmRwb2ludCkKIAotICBkZWYgcmVhZChzZWxmLCBzaXplKToKLSAgICByZXQgPSBzZWxmLl9yYnVmLnJlYWQoc2l6ZSkKLSAgICBpZiBsZW4ocmV0KSAhPSAwOgotICAgICAgcmV0dXJuIHJldAotICAgIHNlbGYuX3JlYWRfbWVzc2FnZSgpCi0gICAgcmV0dXJuIHNlbGYuX3JidWYucmVhZChzaXplKQorICAgIGRlZiByZWFkKHNlbGYsIHNpemUpOgorICAgICAgICByZXQgPSBzZWxmLl9yYnVmLnJlYWQoc2l6ZSkKKyAgICAgICAgaWYgbGVuKHJldCkgIT0gMDoKKyAgICAgICAgICAgIHJldHVybiByZXQKKyAgICAgICAgc2VsZi5fcmVhZF9tZXNzYWdlKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JidWYucmVhZChzaXplKQogCi0gIGRlZiBfcmVhZF9tZXNzYWdlKHNlbGYpOgotICAgIG1zZyA9IHNlbGYuX3NvY2sucmVjdigpCi0gICAgc2VsZi5fcmJ1ZiA9IFN0cmluZ0lPKG1zZykKKyAgICBkZWYgX3JlYWRfbWVzc2FnZShzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fc29jay5yZWN2KCkKKyAgICAgICAgc2VsZi5fcmJ1ZiA9IFN0cmluZ0lPKG1zZykKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICBzZWxmLl93YnVmLndyaXRlKGJ1ZikKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5fd2J1Zi53cml0ZShidWYpCiAKLSAgZGVmIGZsdXNoKHNlbGYpOgotICAgIG1zZyA9IHNlbGYuX3didWYuZ2V0dmFsdWUoKQotICAgIHNlbGYuX3didWYgPSBTdHJpbmdJTygpCi0gICAgc2VsZi5fc29jay5zZW5kKG1zZykKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX3didWYuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLl93YnVmID0gU3RyaW5nSU8oKQorICAgICAgICBzZWxmLl9zb2NrLnNlbmQobXNnKQogCi0gICMgSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlLgotICBAcHJvcGVydHkKLSAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX3JidWYKKyAgICAjIEltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZS4KKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JidWYKIAotICAjIE5PVEU6IFRoaXMgd2lsbCBwcm9iYWJseSBub3QgYWN0dWFsbHkgd29yay4KLSAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcHJlZml4LCByZXFsZW4pOgotICAgIHdoaWxlIGxlbihwcmVmaXgpIDwgcmVxbGVuOgotICAgICAgc2VsZi5yZWFkX21lc3NhZ2UoKQotICAgICAgcHJlZml4ICs9IHNlbGYuX3JidWYuZ2V0dmFsdWUoKQotICAgIHNlbGYuX3JidWYgPSBTdHJpbmdJTyhwcmVmaXgpCi0gICAgcmV0dXJuIHNlbGYuX3JidWYKKyAgICAjIE5PVEU6IFRoaXMgd2lsbCBwcm9iYWJseSBub3QgYWN0dWFsbHkgd29yay4KKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwcmVmaXgsIHJlcWxlbik6CisgICAgICAgIHdoaWxlIGxlbihwcmVmaXgpIDwgcmVxbGVuOgorICAgICAgICAgICAgc2VsZi5yZWFkX21lc3NhZ2UoKQorICAgICAgICAgICAgcHJlZml4ICs9IHNlbGYuX3JidWYuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLl9yYnVmID0gU3RyaW5nSU8ocHJlZml4KQorICAgICAgICByZXR1cm4gc2VsZi5fcmJ1ZgpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5jcHAgYi9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmNwcAppbmRleCBjNjE0MmQ3Li44ODY2MGEzIDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmNwcAorKysgYi9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmNwcApAQCAtMTgsMTYgKzE4LDE1IEBACiAgKi8KIAogI2luY2x1ZGUgIlRabXFTZXJ2ZXIuaCIKLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAjaW5jbHVkZSA8Ym9vc3Qvc2NvcGVkX3B0ci5ocHA+CiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKIAogbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKIAotCiBib29sIFRabXFTZXJ2ZXI6OnNlcnZlT25lKGludCByZWN2X2ZsYWdzKSB7CiAgIHptcTo6bWVzc2FnZV90IG1zZzsKICAgYm9vbCByZWNlaXZlZCA9IHNvY2tfLnJlY3YoJm1zZywgcmVjdl9mbGFncyk7CkBAIC00MCw4ICszOSw5IEBACiAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KSk7CiAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbCgKICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCkpOworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IHRyYW5zcG9ydChuZXcgVE1lbW9yeUJ1ZmZlcik7CiAKLSAgcHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisgIHByb2Nlc3Nvcl8tPnByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsIE5VTEwpOwogCiAgIGlmICh6bXFfdHlwZV8gPT0gWk1RX1JFUCkgewogICAgIHVpbnQ4X3QqIGJ1ZjsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIuaCBiL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIuaAppbmRleCAxNjAzZWFjLi5lY2QxM2I0IDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmgKKysrIGIvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5oCkBAIC0yMCwxNyArMjAsMTkgQEAKICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFpNUVNFUlZFUl9IXwogI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UWk1RU0VSVkVSX0hfIDEKIAorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx6bXEuaHBwPgotI2luY2x1ZGUgPHNlcnZlci9UU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyLmg+CiAKIG5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7CiAKIGNsYXNzIFRabXFTZXJ2ZXIgOiBwdWJsaWMgVFNlcnZlciB7CiAgcHVibGljOgogICBUWm1xU2VydmVyKAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKICAgICAgIHptcTo6Y29udGV4dF90JiBjdHgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmRwb2ludCwgaW50IHR5cGUpCiAgICAgOiBUU2VydmVyKHByb2Nlc3NvcikKKyAgICAsIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKQogICAgICwgem1xX3R5cGVfKHR5cGUpCiAgICAgLCBzb2NrXyhjdHgsIHR5cGUpCiAgIHsKQEAgLTU1LDYgKzU3LDcgQEAKICAgfQogCiAgcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CiAgIGludCB6bXFfdHlwZV87CiAgIHptcTo6c29ja2V0X3Qgc29ja187CiB9OwpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5weSBiL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIucHkKaW5kZXggYzgzY2M4ZC4uMTVjMTU0MyAxMDA2NDQKLS0tIGEvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5weQorKysgYi9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLnB5CkBAIC0yMSw1OCArMjEsNTkgQEAKIGltcG9ydCB0aHJpZnQuc2VydmVyLlRTZXJ2ZXIKIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQKIAorCiBjbGFzcyBUWm1xU2VydmVyKHRocmlmdC5zZXJ2ZXIuVFNlcnZlci5UU2VydmVyKToKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgY3R4LCBlbmRwb2ludCwgc29ja190eXBlKToKLSAgICB0aHJpZnQuc2VydmVyLlRTZXJ2ZXIuVFNlcnZlci5fX2luaXRfXyhzZWxmLCBwcm9jZXNzb3IsIE5vbmUpCi0gICAgc2VsZi56bXFfdHlwZSA9IHNvY2tfdHlwZQotICAgIHNlbGYuc29ja2V0ID0gY3R4LnNvY2tldChzb2NrX3R5cGUpCi0gICAgc2VsZi5zb2NrZXQuYmluZChlbmRwb2ludCkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBjdHgsIGVuZHBvaW50LCBzb2NrX3R5cGUpOgorICAgICAgICB0aHJpZnQuc2VydmVyLlRTZXJ2ZXIuVFNlcnZlci5fX2luaXRfXyhzZWxmLCBwcm9jZXNzb3IsIE5vbmUpCisgICAgICAgIHNlbGYuem1xX3R5cGUgPSBzb2NrX3R5cGUKKyAgICAgICAgc2VsZi5zb2NrZXQgPSBjdHguc29ja2V0KHNvY2tfdHlwZSkKKyAgICAgICAgc2VsZi5zb2NrZXQuYmluZChlbmRwb2ludCkKIAotICBkZWYgc2VydmVPbmUoc2VsZik6Ci0gICAgbXNnID0gc2VsZi5zb2NrZXQucmVjdigpCi0gICAgaXRyYW5zID0gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIobXNnKQotICAgIG90cmFucyA9IHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKLSAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQotICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQorICAgIGRlZiBzZXJ2ZU9uZShzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5zb2NrZXQucmVjdigpCisgICAgICAgIGl0cmFucyA9IHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKG1zZykKKyAgICAgICAgb3RyYW5zID0gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQorICAgICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKIAotICAgIHRyeToKLSAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQotICAgIGV4Y2VwdCBFeGNlcHRpb246Ci0gICAgICBsb2dnaW5nLmV4Y2VwdGlvbigiRXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcgcmVxdWVzdCIpCi0gICAgICAjIEZhbGwgdGhyb3VnaCBhbmQgc2VuZCBiYWNrIGEgcmVzcG9uc2UsIGV2ZW4gaWYgZW1wdHkgb3IgaW5jb21wbGV0ZS4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbigiRXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcgcmVxdWVzdCIpCisgICAgICAgICAgICAjIEZhbGwgdGhyb3VnaCBhbmQgc2VuZCBiYWNrIGEgcmVzcG9uc2UsIGV2ZW4gaWYgZW1wdHkgb3IgaW5jb21wbGV0ZS4KIAotICAgIGlmIHNlbGYuem1xX3R5cGUgPT0gem1xLlJFUDoKLSAgICAgIG1zZyA9IG90cmFucy5nZXR2YWx1ZSgpCi0gICAgICBzZWxmLnNvY2tldC5zZW5kKG1zZykKKyAgICAgICAgaWYgc2VsZi56bXFfdHlwZSA9PSB6bXEuUkVQOgorICAgICAgICAgICAgbXNnID0gb3RyYW5zLmdldHZhbHVlKCkKKyAgICAgICAgICAgIHNlbGYuc29ja2V0LnNlbmQobXNnKQogCi0gIGRlZiBzZXJ2ZShzZWxmKToKLSAgICB3aGlsZSBUcnVlOgotICAgICAgc2VsZi5zZXJ2ZU9uZSgpCisgICAgZGVmIHNlcnZlKHNlbGYpOgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgc2VsZi5zZXJ2ZU9uZSgpCiAKIAogY2xhc3MgVFptcU11bHRpU2VydmVyKG9iamVjdCk6Ci0gIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICBzZWxmLnNlcnZlcnMgPSBbXQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2ZXJzID0gW10KIAotICBkZWYgc2VydmVPbmUoc2VsZiwgdGltZW91dCA9IC0xKToKLSAgICBzZWxmLl9zZXJ2ZUFjdGl2ZShzZWxmLl9zZXR1cFBvbGwoKSwgdGltZW91dCkKKyAgICBkZWYgc2VydmVPbmUoc2VsZiwgdGltZW91dD0tMSk6CisgICAgICAgIHNlbGYuX3NlcnZlQWN0aXZlKHNlbGYuX3NldHVwUG9sbCgpLCB0aW1lb3V0KQogCi0gIGRlZiBzZXJ2ZUZvcmV2ZXIoc2VsZik6Ci0gICAgcG9sbF9pbmZvID0gc2VsZi5fc2V0dXBQb2xsKCkKLSAgICB3aGlsZSBUcnVlOgotICAgICAgc2VsZi5fc2VydmVBY3RpdmUocG9sbF9pbmZvLCAtMSkKKyAgICBkZWYgc2VydmVGb3JldmVyKHNlbGYpOgorICAgICAgICBwb2xsX2luZm8gPSBzZWxmLl9zZXR1cFBvbGwoKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgc2VsZi5fc2VydmVBY3RpdmUocG9sbF9pbmZvLCAtMSkKIAotICBkZWYgX3NldHVwUG9sbChzZWxmKToKLSAgICBzZXJ2ZXJfbWFwID0ge30KLSAgICBwb2xsZXIgPSB6bXEuUG9sbGVyKCkKLSAgICBmb3Igc2VydmVyIGluIHNlbGYuc2VydmVyczoKLSAgICAgIHNlcnZlcl9tYXBbc2VydmVyLnNvY2tldF0gPSBzZXJ2ZXIKLSAgICAgIHBvbGxlci5yZWdpc3RlcihzZXJ2ZXIuc29ja2V0LCB6bXEuUE9MTElOKQotICAgIHJldHVybiAoc2VydmVyX21hcCwgcG9sbGVyKQorICAgIGRlZiBfc2V0dXBQb2xsKHNlbGYpOgorICAgICAgICBzZXJ2ZXJfbWFwID0ge30KKyAgICAgICAgcG9sbGVyID0gem1xLlBvbGxlcigpCisgICAgICAgIGZvciBzZXJ2ZXIgaW4gc2VsZi5zZXJ2ZXJzOgorICAgICAgICAgICAgc2VydmVyX21hcFtzZXJ2ZXIuc29ja2V0XSA9IHNlcnZlcgorICAgICAgICAgICAgcG9sbGVyLnJlZ2lzdGVyKHNlcnZlci5zb2NrZXQsIHptcS5QT0xMSU4pCisgICAgICAgIHJldHVybiAoc2VydmVyX21hcCwgcG9sbGVyKQogCi0gIGRlZiBfc2VydmVBY3RpdmUoc2VsZiwgcG9sbF9pbmZvLCB0aW1lb3V0KToKLSAgICAoc2VydmVyX21hcCwgcG9sbGVyKSA9IHBvbGxfaW5mbwotICAgIHJlYWR5ID0gZGljdChwb2xsZXIucG9sbCgpKQotICAgIGZvciBzb2NrLCBzdGF0ZSBpbiByZWFkeS5pdGVtcygpOgotICAgICAgYXNzZXJ0IChzdGF0ZSAmIHptcS5QT0xMSU4pICE9IDAKLSAgICAgIHNlcnZlcl9tYXBbc29ja10uc2VydmVPbmUoKQorICAgIGRlZiBfc2VydmVBY3RpdmUoc2VsZiwgcG9sbF9pbmZvLCB0aW1lb3V0KToKKyAgICAgICAgKHNlcnZlcl9tYXAsIHBvbGxlcikgPSBwb2xsX2luZm8KKyAgICAgICAgcmVhZHkgPSBkaWN0KHBvbGxlci5wb2xsKCkpCisgICAgICAgIGZvciBzb2NrLCBzdGF0ZSBpbiByZWFkeS5pdGVtcygpOgorICAgICAgICAgICAgYXNzZXJ0IChzdGF0ZSAmIHptcS5QT0xMSU4pICE9IDAKKyAgICAgICAgICAgIHNlcnZlcl9tYXBbc29ja10uc2VydmVPbmUoKQpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvY3NoYXJwL0Fzc2VtYmx5SW5mby5jcyBiL2NvbnRyaWIvemVyb21xL2NzaGFycC9Bc3NlbWJseUluZm8uY3MKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA5YWQ0OGM2Li4xMmNkNDM0Ci0tLSBhL2NvbnRyaWIvemVyb21xL2NzaGFycC9Bc3NlbWJseUluZm8uY3MKKysrIGIvY29udHJpYi96ZXJvbXEvY3NoYXJwL0Fzc2VtYmx5SW5mby5jcwpAQCAtMTQsMjAgKzE0LDIwIEBACiAgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwogCiB1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKIHVzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7CiAKLS8vIEluZm9ybWF0aW9uIGFib3V0IHRoaXMgYXNzZW1ibHkgaXMgZGVmaW5lZCBieSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMuIAorLy8gSW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhc3NlbWJseSBpcyBkZWZpbmVkIGJ5IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcy4KIC8vIENoYW5nZSB0aGVtIHRvIHRoZSB2YWx1ZXMgc3BlY2lmaWMgdG8geW91ciBwcm9qZWN0LgogCiBbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlptcVNlcnZlciIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCJabXEgRXhhbXBsZXMiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KQEAgLTM4LDcgKzM4LDcgQEAKIAogW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCiAKLS8vIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBzaWduaW5nIGtleSBmb3IgdGhlIGFzc2VtYmx5LCAKKy8vIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBzaWduaW5nIGtleSBmb3IgdGhlIGFzc2VtYmx5LAogLy8gaWYgZGVzaXJlZC4gU2VlIHRoZSBNb25vIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgc2lnbmluZy4KIAogLy9bYXNzZW1ibHk6IEFzc2VtYmx5RGVsYXlTaWduKGZhbHNlKV0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL2NzaGFycC9UWm1xQ2xpZW50LmNzIGIvY29udHJpYi96ZXJvbXEvY3NoYXJwL1RabXFDbGllbnQuY3MKaW5kZXggYzc5Mjg4Mi4uZTlhYjUxNiAxMDA2NDQKLS0tIGEvY29udHJpYi96ZXJvbXEvY3NoYXJwL1RabXFDbGllbnQuY3MKKysrIGIvY29udHJpYi96ZXJvbXEvY3NoYXJwL1RabXFDbGllbnQuY3MKQEAgLTQ3LDcgKzQ3LDcgQEAKIAkJCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gKCk7CiAKIAkJCWlmIChfcmJ1Zi5MZW5ndGggPT0gMCkgewotCQkJCS8vRmlsbCB0aGUgQnVmZmVyIHdpdGggdGhlIGNvbXBsZXRlIFpNUSBNZXNzYWdlIHdoaWNoIG5lZWRzIHRvIGJlKD8hKSB0aGUgY29tcGxldGUgVGhyaWZ0IHJlcG9uc2UKKwkJCQkvL0ZpbGwgdGhlIEJ1ZmZlciB3aXRoIHRoZSBjb21wbGV0ZSBaTVEgTWVzc2FnZSB3aGljaCBuZWVkcyB0byBiZSg/ISkgdGhlIGNvbXBsZXRlIFRocmlmdCByZXNwb25zZQogCQkJCWRlYnVnICgiQ2xpZW50X1JlYWQgRmlsbGluZyBidWZmZXIuLiIpOwogCQkJCWJ5dGVbXSB0bXBCdWYgPSBfc29jay5SZWN2ICgpOwogCQkJCWRlYnVnIChzdHJpbmcuRm9ybWF0KCJDbGllbnRfUmVhZCBmaWxsZWQgd2l0aCB7MH1iIix0bXBCdWYuTGVuZ3RoKSk7CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9jc2hhcnAvVGhyaWZ0Wk1RLmNzcHJvaiBiL2NvbnRyaWIvemVyb21xL2NzaGFycC9UaHJpZnRaTVEuY3Nwcm9qCmluZGV4IDFkNWYxM2MuLjgwYWQxZGIgMTAwNzU1Ci0tLSBhL2NvbnRyaWIvemVyb21xL2NzaGFycC9UaHJpZnRaTVEuY3Nwcm9qCisrKyBiL2NvbnRyaWIvemVyb21xL2NzaGFycC9UaHJpZnRaTVEuY3Nwcm9qCkBAIC0xLDkxICsxLDkxIEBACi3vu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KLSAgPFByb3BlcnR5R3JvdXA+DQotICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KLSAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPng4NjwvUGxhdGZvcm0+DQotICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMjEwMjI8L1Byb2R1Y3RWZXJzaW9uPg0KLSAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQotICAgIDxQcm9qZWN0R3VpZD57MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfTwvUHJvamVjdEd1aWQ+DQotICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4NCi0gICAgPFJvb3ROYW1lc3BhY2U+Wm1xU2VydmVyPC9Sb290TmFtZXNwYWNlPg0KLSAgICA8QXNzZW1ibHlOYW1lPlRocmlmdFpNUTwvQXNzZW1ibHlOYW1lPg0KLSAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KLSAgICA8RmlsZVVwZ3JhZGVGbGFncz4NCi0gICAgPC9GaWxlVXBncmFkZUZsYWdzPg0KLSAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPg0KLSAgICA8VXBncmFkZUJhY2t1cExvY2F0aW9uIC8+DQotICAgIDxQdWJsaXNoVXJsPnB1Ymxpc2hcPC9QdWJsaXNoVXJsPg0KLSAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPg0KLSAgICA8SW5zdGFsbEZyb20+RGlzazwvSW5zdGFsbEZyb20+DQotICAgIDxVcGRhdGVFbmFibGVkPmZhbHNlPC9VcGRhdGVFbmFibGVkPg0KLSAgICA8VXBkYXRlTW9kZT5Gb3JlZ3JvdW5kPC9VcGRhdGVNb2RlPg0KLSAgICA8VXBkYXRlSW50ZXJ2YWw+NzwvVXBkYXRlSW50ZXJ2YWw+DQotICAgIDxVcGRhdGVJbnRlcnZhbFVuaXRzPkRheXM8L1VwZGF0ZUludGVydmFsVW5pdHM+DQotICAgIDxVcGRhdGVQZXJpb2RpY2FsbHk+ZmFsc2U8L1VwZGF0ZVBlcmlvZGljYWxseT4NCi0gICAgPFVwZGF0ZVJlcXVpcmVkPmZhbHNlPC9VcGRhdGVSZXF1aXJlZD4NCi0gICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPg0KLSAgICA8QXBwbGljYXRpb25SZXZpc2lvbj4wPC9BcHBsaWNhdGlvblJldmlzaW9uPg0KLSAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLiUyYTwvQXBwbGljYXRpb25WZXJzaW9uPg0KLSAgICA8SXNXZWJCb290c3RyYXBwZXI+ZmFsc2U8L0lzV2ViQm9vdHN0cmFwcGVyPg0KLSAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4NCi0gICAgPEJvb3RzdHJhcHBlckVuYWJsZWQ+dHJ1ZTwvQm9vdHN0cmFwcGVyRW5hYmxlZD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8eDg2JyAiPg0KLSAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCi0gICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQotICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQotICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1ZzwvT3V0cHV0UGF0aD4NCi0gICAgPERlZmluZUNvbnN0YW50cz5ERUJVRzwvRGVmaW5lQ29uc3RhbnRzPg0KLSAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCi0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQotICAgIDxQbGF0Zm9ybVRhcmdldD54ODY8L1BsYXRmb3JtVGFyZ2V0Pg0KLSAgICA8RXh0ZXJuYWxjb25zb2xlPnRydWU8L0V4dGVybmFsY29uc29sZT4NCi0gICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXx4ODYnICI+DQotICAgIDxEZWJ1Z1R5cGU+bm9uZTwvRGVidWdUeXBlPg0KLSAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KLSAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZTwvT3V0cHV0UGF0aD4NCi0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQotICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KLSAgICA8UGxhdGZvcm1UYXJnZXQ+eDg2PC9QbGF0Zm9ybVRhcmdldD4NCi0gICAgPEV4dGVybmFsY29uc29sZT50cnVlPC9FeHRlcm5hbGNvbnNvbGU+DQotICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8SXRlbUdyb3VwPg0KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9ImNscnptcSwgVmVyc2lvbj0yLjEuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT14ODYiPg0KLSAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCi0gICAgICA8SGludFBhdGg+LlxjbHJ6bXEuZGxsPC9IaW50UGF0aD4NCi0gICAgPC9SZWZlcmVuY2U+DQotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlRocmlmdCwgVmVyc2lvbj0wLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGwiPg0KLSAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCi0gICAgICA8SGludFBhdGg+Li5cLi5cLi5cbGliXGNzaGFycFxUaHJpZnQuZGxsPC9IaW50UGF0aD4NCi0gICAgPC9SZWZlcmVuY2U+DQotICA8L0l0ZW1Hcm91cD4NCi0gIDxJdGVtR3JvdXA+DQotICAgIDxDb21waWxlIEluY2x1ZGU9Ik1haW4uY3MiIC8+DQotICAgIDxDb21waWxlIEluY2x1ZGU9IkFzc2VtYmx5SW5mby5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iVFptcVNlcnZlci5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iVFptcUNsaWVudC5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxTdG9yYWdlLmNzIiAvPg0KLSAgPC9JdGVtR3JvdXA+DQotICA8SXRlbUdyb3VwPg0KLSAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkNsaWVudC4zLjUiPg0KLSAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPg0KLSAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxIENsaWVudCBQcm9maWxlPC9Qcm9kdWN0TmFtZT4NCi0gICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4NCi0gICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPg0KLSAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUuU1AxIj4NCi0gICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4NCi0gICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMTwvUHJvZHVjdE5hbWU+DQotICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4NCi0gICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPg0KLSAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2luZG93cy5JbnN0YWxsZXIuMy4xIj4NCi0gICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4NCi0gICAgICA8UHJvZHVjdE5hbWU+V2luZG93cyBJbnN0YWxsZXIgMy4xPC9Qcm9kdWN0TmFtZT4NCi0gICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPg0KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+DQotICA8L0l0ZW1Hcm91cD4NCi0gIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPg0KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+eDg2PC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjIxMDIyPC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPnsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPFJvb3ROYW1lc3BhY2U+Wm1xU2VydmVyPC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0Wk1RPC9Bc3NlbWJseU5hbWU+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgICA8RmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8L0ZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4KKyAgICA8VXBncmFkZUJhY2t1cExvY2F0aW9uIC8+CisgICAgPFB1Ymxpc2hVcmw+cHVibGlzaFw8L1B1Ymxpc2hVcmw+CisgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8SW5zdGFsbEZyb20+RGlzazwvSW5zdGFsbEZyb20+CisgICAgPFVwZGF0ZUVuYWJsZWQ+ZmFsc2U8L1VwZGF0ZUVuYWJsZWQ+CisgICAgPFVwZGF0ZU1vZGU+Rm9yZWdyb3VuZDwvVXBkYXRlTW9kZT4KKyAgICA8VXBkYXRlSW50ZXJ2YWw+NzwvVXBkYXRlSW50ZXJ2YWw+CisgICAgPFVwZGF0ZUludGVydmFsVW5pdHM+RGF5czwvVXBkYXRlSW50ZXJ2YWxVbml0cz4KKyAgICA8VXBkYXRlUGVyaW9kaWNhbGx5PmZhbHNlPC9VcGRhdGVQZXJpb2RpY2FsbHk+CisgICAgPFVwZGF0ZVJlcXVpcmVkPmZhbHNlPC9VcGRhdGVSZXF1aXJlZD4KKyAgICA8TWFwRmlsZUV4dGVuc2lvbnM+dHJ1ZTwvTWFwRmlsZUV4dGVuc2lvbnM+CisgICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4KKyAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLjA8L0FwcGxpY2F0aW9uVmVyc2lvbj4KKyAgICA8SXNXZWJCb290c3RyYXBwZXI+ZmFsc2U8L0lzV2ViQm9vdHN0cmFwcGVyPgorICAgIDxVc2VBcHBsaWNhdGlvblRydXN0PmZhbHNlPC9Vc2VBcHBsaWNhdGlvblRydXN0PgorICAgIDxCb290c3RyYXBwZXJFbmFibGVkPnRydWU8L0Jvb3RzdHJhcHBlckVuYWJsZWQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3x4ODYnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWc8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRzwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxQbGF0Zm9ybVRhcmdldD54ODY8L1BsYXRmb3JtVGFyZ2V0PgorICAgIDxFeHRlcm5hbGNvbnNvbGU+dHJ1ZTwvRXh0ZXJuYWxjb25zb2xlPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfHg4NicgIj4KKyAgICA8RGVidWdUeXBlPm5vbmU8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlPC9PdXRwdXRQYXRoPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxQbGF0Zm9ybVRhcmdldD54ODY8L1BsYXRmb3JtVGFyZ2V0PgorICAgIDxFeHRlcm5hbGNvbnNvbGU+dHJ1ZTwvRXh0ZXJuYWxjb25zb2xlPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9ImNscnptcSwgVmVyc2lvbj0yLjEuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT14ODYiPgorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPgorICAgICAgPEhpbnRQYXRoPi5cY2xyem1xLmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJUaHJpZnQsIFZlcnNpb249MC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsIj4KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4KKyAgICAgIDxIaW50UGF0aD4uLlwuLlwuLlxsaWJcY3NoYXJwXFRocmlmdC5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNYWluLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFzc2VtYmx5SW5mby5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUWm1xU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRabXFDbGllbnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxTdG9yYWdlLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkNsaWVudC4zLjUiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMSBDbGllbnQgUHJvZmlsZTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41LlNQMSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5XaW5kb3dzLkluc3RhbGxlci4zLjEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+V2luZG93cyBJbnN0YWxsZXIgMy4xPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9jc2hhcnAvVGhyaWZ0Wk1RLnNsbiBiL2NvbnRyaWIvemVyb21xL2NzaGFycC9UaHJpZnRaTVEuc2xuCmluZGV4IDQwNGE3NDcuLjZhZjU3YjYgMTAwNzU1Ci0tLSBhL2NvbnRyaWIvemVyb21xL2NzaGFycC9UaHJpZnRaTVEuc2xuCisrKyBiL2NvbnRyaWIvemVyb21xL2NzaGFycC9UaHJpZnRaTVEuc2xuCkBAIC0xLDQyICsxLDQyIEBACi3vu78NCi1NaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMS4wMA0KLSMgVmlzdWFsIFN0dWRpbyAyMDEwDQotUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnRaTVEiLCAiVGhyaWZ0Wk1RLmNzcHJvaiIsICJ7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfSINCi1FbmRQcm9qZWN0DQotUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnQiLCAiLi5cLi5cLi5cbGliXGNzaGFycFxzcmNcVGhyaWZ0LmNzcHJvaiIsICJ7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfSINCi1FbmRQcm9qZWN0DQotR2xvYmFsDQotCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uDQotCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQ0KLQkJRGVidWd8TWl4ZWQgUGxhdGZvcm1zID0gRGVidWd8TWl4ZWQgUGxhdGZvcm1zDQotCQlEZWJ1Z3x4ODYgPSBEZWJ1Z3x4ODYNCi0JCVJlbGVhc2V8QW55IENQVSA9IFJlbGVhc2V8QW55IENQVQ0KLQkJUmVsZWFzZXxNaXhlZCBQbGF0Zm9ybXMgPSBSZWxlYXNlfE1peGVkIFBsYXRmb3Jtcw0KLQkJUmVsZWFzZXx4ODYgPSBSZWxlYXNlfHg4Ng0KLQlFbmRHbG9iYWxTZWN0aW9uDQotCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uDQotCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfHg4Ng0KLQkJezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX0uRGVidWd8TWl4ZWQgUGxhdGZvcm1zLkFjdGl2ZUNmZyA9IERlYnVnfHg4Ng0KLQkJezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX0uRGVidWd8TWl4ZWQgUGxhdGZvcm1zLkJ1aWxkLjAgPSBEZWJ1Z3x4ODYNCi0JCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3x4ODYNCi0JCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8eDg2DQotCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4ODYNCi0JCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LlJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zLkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDg2DQotCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5SZWxlYXNlfE1peGVkIFBsYXRmb3Jtcy5CdWlsZC4wID0gUmVsZWFzZXx4ODYNCi0JCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDg2DQotCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXx4ODYNCi0JCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KLQkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KLQkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8TWl4ZWQgUGxhdGZvcm1zLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCi0JCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfE1peGVkIFBsYXRmb3Jtcy5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KLQkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCi0JCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCi0JCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQotCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfE1peGVkIFBsYXRmb3Jtcy5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCi0JCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCi0JCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KLQlFbmRHbG9iYWxTZWN0aW9uDQotCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uDQotCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UNCi0JRW5kR2xvYmFsU2VjdGlvbg0KLUVuZEdsb2JhbA0KK++7vworTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTEuMDAKKyMgVmlzdWFsIFN0dWRpbyAyMDEwCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRocmlmdFpNUSIsICJUaHJpZnRaTVEuY3Nwcm9qIiwgInsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9IgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnQiLCAiLi5cLi5cLi5cbGliXGNzaGFycFxzcmNcVGhyaWZ0LmNzcHJvaiIsICJ7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisJCURlYnVnfE1peGVkIFBsYXRmb3JtcyA9IERlYnVnfE1peGVkIFBsYXRmb3JtcworCQlEZWJ1Z3x4ODYgPSBEZWJ1Z3x4ODYKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJCVJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zID0gUmVsZWFzZXxNaXhlZCBQbGF0Zm9ybXMKKwkJUmVsZWFzZXx4ODYgPSBSZWxlYXNlfHg4NgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfHg4NgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5EZWJ1Z3xNaXhlZCBQbGF0Zm9ybXMuQWN0aXZlQ2ZnID0gRGVidWd8eDg2CisJCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LkRlYnVnfE1peGVkIFBsYXRmb3Jtcy5CdWlsZC4wID0gRGVidWd8eDg2CisJCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3x4ODYKKwkJezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3x4ODYKKwkJezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDg2CisJCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LlJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zLkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDg2CisJCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LlJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zLkJ1aWxkLjAgPSBSZWxlYXNlfHg4NgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfHg4NgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXx4ODYKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8TWl4ZWQgUGxhdGZvcm1zLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8TWl4ZWQgUGxhdGZvcm1zLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXxNaXhlZCBQbGF0Zm9ybXMuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQuY3BwIGIvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQuY3BwCmluZGV4IDY0ZTIwZjYuLjE1OWMyNTAgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL3Rlc3QtY2xpZW50LmNwcAorKysgYi9jb250cmliL3plcm9tcS90ZXN0LWNsaWVudC5jcHAKQEAgLTEsMTIgKzEsMTIgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KIAogI2luY2x1ZGUgInptcS5ocHAiCiAjaW5jbHVkZSAiVFptcUNsaWVudC5oIgogI2luY2x1ZGUgIlN0b3JhZ2UuaCIKIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c3RkOjpzaGFyZWRfcHRyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFptcUNsaWVudDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwogCkBAIC0xNyw3ICsxNyw3IEBACiAgIGlmIChhcmdjID4gMSkgewogICAgIGluY3IgPSBhdG9pKGFyZ3ZbMV0pOwogICAgIGlmIChpbmNyKSB7Ci0gICAgICBzb2NrdHlwZSA9IFpNUV9ET1dOU1RSRUFNOworICAgICAgc29ja3R5cGUgPSBaTVFfUFVTSDsKICAgICAgIGVuZHBvaW50ID0gInRjcDovLzEyNy4wLjAuMTo5MDkxIjsKICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL3Rlc3QtY2xpZW50LnB5IGIvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQucHkKaW5kZXggMTg4NmQ5Yy4uZDUxMjE2ZSAxMDA3NTUKLS0tIGEvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQucHkKKysrIGIvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQucHkKQEAgLTksMjggKzksMjggQEAKIAogCiBkZWYgbWFpbihhcmdzKToKLSAgZW5kcG9pbnQgPSAidGNwOi8vMTI3LjAuMC4xOjkwOTAiCi0gIHNvY2t0eXBlID0gem1xLlJFUQotICBpbmNyID0gMAotICBpZiBsZW4oYXJncykgPiAxOgotICAgIGluY3IgPSBpbnQoYXJnc1sxXSkKKyAgICBlbmRwb2ludCA9ICJ0Y3A6Ly8xMjcuMC4wLjE6OTA5MCIKKyAgICBzb2NrdHlwZSA9IHptcS5SRVEKKyAgICBpbmNyID0gMAorICAgIGlmIGxlbihhcmdzKSA+IDE6CisgICAgICAgIGluY3IgPSBpbnQoYXJnc1sxXSkKKyAgICAgICAgaWYgaW5jcjoKKyAgICAgICAgICAgIHNvY2t0eXBlID0gem1xLlBVU0gKKyAgICAgICAgICAgIGVuZHBvaW50ID0gInRjcDovLzEyNy4wLjAuMTo5MDkxIgorCisgICAgY3R4ID0gem1xLkNvbnRleHQoKQorICAgIHRyYW5zcG9ydCA9IFRabXFDbGllbnQuVFptcUNsaWVudChjdHgsIGVuZHBvaW50LCBzb2NrdHlwZSkKKyAgICBwcm90b2NvbCA9IHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQodHJhbnNwb3J0KQorICAgIGNsaWVudCA9IHN0b3JhZ2UuU3RvcmFnZS5DbGllbnQocHJvdG9jb2wpCisgICAgdHJhbnNwb3J0Lm9wZW4oKQorCiAgICAgaWYgaW5jcjoKLSAgICAgIHNvY2t0eXBlID0gem1xLkRPV05TVFJFQU0KLSAgICAgIGVuZHBvaW50ID0gInRjcDovLzEyNy4wLjAuMTo5MDkxIgotCi0gIGN0eCA9IHptcS5Db250ZXh0KCkKLSAgdHJhbnNwb3J0ID0gVFptcUNsaWVudC5UWm1xQ2xpZW50KGN0eCwgZW5kcG9pbnQsIHNvY2t0eXBlKQotICBwcm90b2NvbCA9IHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQodHJhbnNwb3J0KQotICBjbGllbnQgPSBzdG9yYWdlLlN0b3JhZ2UuQ2xpZW50KHByb3RvY29sKQotICB0cmFuc3BvcnQub3BlbigpCi0KLSAgaWYgaW5jcjoKLSAgICBjbGllbnQuaW5jcihpbmNyKQotICAgIHRpbWUuc2xlZXAoMC4wNSkKLSAgZWxzZToKLSAgICB2YWx1ZSA9IGNsaWVudC5nZXQoKQotICAgIHByaW50IHZhbHVlCisgICAgICAgIGNsaWVudC5pbmNyKGluY3IpCisgICAgICAgIHRpbWUuc2xlZXAoMC4wNSkKKyAgICBlbHNlOgorICAgICAgICB2YWx1ZSA9IGNsaWVudC5nZXQoKQorICAgICAgICBwcmludCh2YWx1ZSkKIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICBtYWluKHN5cy5hcmd2KQorICAgIG1haW4oc3lzLmFyZ3YpCmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS90ZXN0LXJlY2VpdmVyLmNwcCBiL2NvbnRyaWIvemVyb21xL3Rlc3QtcmVjZWl2ZXIuY3BwCmluZGV4IDhmZTY5ZGEuLmQ0NjViZmYgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL3Rlc3QtcmVjZWl2ZXIuY3BwCisrKyBiL2NvbnRyaWIvemVyb21xL3Rlc3QtcmVjZWl2ZXIuY3BwCkBAIC0yLDcgKzIsNyBAQAogI2luY2x1ZGUgIlRabXFTZXJ2ZXIuaCIKICNpbmNsdWRlICJTdG9yYWdlLmgiCiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFptcVNlcnZlcjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRabXFNdWx0aVNlcnZlcjsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VuZGVyLmNwcCBiL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VuZGVyLmNwcAppbmRleCBjYTA1NzA5Li41YzA4NmExIDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS90ZXN0LXNlbmRlci5jcHAKKysrIGIvY29udHJpYi96ZXJvbXEvdGVzdC1zZW5kZXIuY3BwCkBAIC0xLDEyICsxLDEyIEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CiAKICNpbmNsdWRlICJ6bXEuaHBwIgogI2luY2x1ZGUgIlRabXFDbGllbnQuaCIKICNpbmNsdWRlICJTdG9yYWdlLmgiCiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRabXFDbGllbnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKIApkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvdGVzdC1zZXJ2ZXIuY3BwIGIvY29udHJpYi96ZXJvbXEvdGVzdC1zZXJ2ZXIuY3BwCmluZGV4IGM2MjRiMGQuLmU2ZjFiMjAgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLmNwcAorKysgYi9jb250cmliL3plcm9tcS90ZXN0LXNlcnZlci5jcHAKQEAgLTIsNyArMiw3IEBACiAjaW5jbHVkZSAiVFptcVNlcnZlci5oIgogI2luY2x1ZGUgIlN0b3JhZ2UuaCIKIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c3RkOjpzaGFyZWRfcHRyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUWm1xU2VydmVyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFptcU11bHRpU2VydmVyOwpAQCAtMzMsNyArMzMsNyBAQAogCiAgIHptcTo6Y29udGV4dF90IGN0eCgxKTsKICAgVFptcVNlcnZlciByZXFyZXBfc2VydmVyKHByb2Nlc3NvciwgY3R4LCAidGNwOi8vMC4wLjAuMDo5MDkwIiwgWk1RX1JFUCk7Ci0gIFRabXFTZXJ2ZXIgb25ld2F5X3NlcnZlcihwcm9jZXNzb3IsIGN0eCwgInRjcDovLzAuMC4wLjA6OTA5MSIsIFpNUV9VUFNUUkVBTSk7CisgIFRabXFTZXJ2ZXIgb25ld2F5X3NlcnZlcihwcm9jZXNzb3IsIGN0eCwgInRjcDovLzAuMC4wLjA6OTA5MSIsIFpNUV9QVUxMKTsKICAgVFptcU11bHRpU2VydmVyIG11bHRpc2VydmVyOwogICBtdWx0aXNlcnZlci5zZXJ2ZXJzKCkucHVzaF9iYWNrKCZyZXFyZXBfc2VydmVyKTsKICAgbXVsdGlzZXJ2ZXIuc2VydmVycygpLnB1c2hfYmFjaygmb25ld2F5X3NlcnZlcik7CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS90ZXN0LXNlcnZlci5weSBiL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLnB5CmluZGV4IDU3NjdiNzEuLmQ4OWIzN2IgMTAwNzU1Ci0tLSBhL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLnB5CisrKyBiL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLnB5CkBAIC02LDI4ICs2LDI4IEBACiAKIAogY2xhc3MgU3RvcmFnZUhhbmRsZXIoc3RvcmFnZS5TdG9yYWdlLklmYWNlKToKLSAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgIHNlbGYudmFsdWUgPSAwCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnZhbHVlID0gMAogCi0gIGRlZiBpbmNyKHNlbGYsIGFtb3VudCk6Ci0gICAgc2VsZi52YWx1ZSArPSBhbW91bnQKKyAgICBkZWYgaW5jcihzZWxmLCBhbW91bnQpOgorICAgICAgICBzZWxmLnZhbHVlICs9IGFtb3VudAogCi0gIGRlZiBnZXQoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYudmFsdWUKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52YWx1ZQogCiAKIGRlZiBtYWluKCk6Ci0gIGhhbmRsZXIgPSBTdG9yYWdlSGFuZGxlcigpCi0gIHByb2Nlc3NvciA9IHN0b3JhZ2UuU3RvcmFnZS5Qcm9jZXNzb3IoaGFuZGxlcikKKyAgICBoYW5kbGVyID0gU3RvcmFnZUhhbmRsZXIoKQorICAgIHByb2Nlc3NvciA9IHN0b3JhZ2UuU3RvcmFnZS5Qcm9jZXNzb3IoaGFuZGxlcikKIAotICBjdHggPSB6bXEuQ29udGV4dCgpCi0gIHJlcXJlcF9zZXJ2ZXIgPSBUWm1xU2VydmVyLlRabXFTZXJ2ZXIocHJvY2Vzc29yLCBjdHgsICJ0Y3A6Ly8wLjAuMC4wOjkwOTAiLCB6bXEuUkVQKQotICBvbmV3YXlfc2VydmVyID0gVFptcVNlcnZlci5UWm1xU2VydmVyKHByb2Nlc3NvciwgY3R4LCAidGNwOi8vMC4wLjAuMDo5MDkxIiwgem1xLlVQU1RSRUFNKQotICBtdWx0aXNlcnZlciA9IFRabXFTZXJ2ZXIuVFptcU11bHRpU2VydmVyKCkKLSAgbXVsdGlzZXJ2ZXIuc2VydmVycy5hcHBlbmQocmVxcmVwX3NlcnZlcikKLSAgbXVsdGlzZXJ2ZXIuc2VydmVycy5hcHBlbmQob25ld2F5X3NlcnZlcikKLSAgbXVsdGlzZXJ2ZXIuc2VydmVGb3JldmVyKCkKKyAgICBjdHggPSB6bXEuQ29udGV4dCgpCisgICAgcmVxcmVwX3NlcnZlciA9IFRabXFTZXJ2ZXIuVFptcVNlcnZlcihwcm9jZXNzb3IsIGN0eCwgInRjcDovLzAuMC4wLjA6OTA5MCIsIHptcS5SRVApCisgICAgb25ld2F5X3NlcnZlciA9IFRabXFTZXJ2ZXIuVFptcVNlcnZlcihwcm9jZXNzb3IsIGN0eCwgInRjcDovLzAuMC4wLjA6OTA5MSIsIHptcS5QVUxMKQorICAgIG11bHRpc2VydmVyID0gVFptcVNlcnZlci5UWm1xTXVsdGlTZXJ2ZXIoKQorICAgIG11bHRpc2VydmVyLnNlcnZlcnMuYXBwZW5kKHJlcXJlcF9zZXJ2ZXIpCisgICAgbXVsdGlzZXJ2ZXIuc2VydmVycy5hcHBlbmQob25ld2F5X3NlcnZlcikKKyAgICBtdWx0aXNlcnZlci5zZXJ2ZUZvcmV2ZXIoKQogCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gIG1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvZGViaWFuL1JFQURNRS5tZCBiL2RlYmlhbi9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGViZmVlYQotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9SRUFETUUubWQKQEAgLTAsMCArMSw0MSBAQAorIyMgU29tZSB0aXBzIG9uIERlYmlhbiBQYWNrYWdpbmcKKworLSBEZWJpYW4gTmV3IE1haW50YWluZXJzJyBHdWlkZSBbaHR0cDovL3d3dy5kZWJpYW4ub3JnL2RvYy9kZWJpYW4tcG9saWN5L10KKy0gRGViaWFuIFBvbGljeSBNYW51YWwgW2h0dHA6Ly93d3cuZGViaWFuLm9yZy9kb2MvbWFudWFscy9tYWludC1ndWlkZS9dCistIE1hY2hpbmUtcmVhZGFibGUgZGViaWFuL2NvcHlyaWdodCBmaWxlIFtodHRwOi8vZGVwLmRlYmlhbi5uZXQvZGVwcy9kZXA1L10KKy0gRGViU3JjIDMuMCBndWlkZWxpbmVzIFtodHRwczovL3dpa2kuZGViaWFuLm9yZy9Qcm9qZWN0cy9EZWJTcmMzLjBdCisKKworIyMgQnVpbGQgdXNpbmcgZHBrZy1idWlsZHBhY2thZ2U6CisKK2BgYGJhc2gKKyQgZHBrZy1idWlsZHBhY2thZ2UgLWQgLXRjCisgIC1kICAgIyBkbyBub3QgY2hlY2sgYnVpbGQgZGVwZW5kZW5jaWVzIGFuZCBjb25mbGljdHMuCisgIC10YyAgIyBjbGVhbiBzb3VyY2UgdHJlZSB3aGVuIGZpbmlzaGVkLgorYGBgCisKKworIyMgVXBkYXRlIGNoYW5nZWxvZzoKKworYGBgYmFzaAorJCBkYXRlIC1SCitgYGAKKworT25lIGNhbiBhbHNvIGluc3RhbGwgYGRldnNjcmlwdHNgIHBhY2thZ2UgYW5kIHJ1bjoKKworYGBgYmFzaAorJCBkY2ggLWkKK2BgYAorCisKKyMjIENoZWNrIHBhY2thZ2VzOgorCitgYGBiYXNoCiskIGRwa2cgLWMgKi5kZWIKKyQgbGludGlhbiAqLmRlYgorYGBgCisKKworIyMgVE9ETworCitNYWtlIGl0IHBlcmZlY3QhCmRpZmYgLS1naXQgYS9kZWJpYW4vY2hhbmdlbG9nIGIvZGViaWFuL2NoYW5nZWxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWI1ZjIwCi0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL2NoYW5nZWxvZwpAQCAtMCwwICsxLDgzIEBACit0aHJpZnQgKDAuMTIuMCkgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogdXBkYXRlIHRvIDAuMTIuMAorCisgLS0gQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+ICBXZWQsIDI4IERlYyAyMDE4IDEyOjAwOjAwIC0wNTAwCisKK3RocmlmdCAoMC4xMS4wKSBzdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiB1cGRhdGUgdG8gMC4xMS4wCisKKyAtLSBKYWtlIEZhcnJlbGwgPGpmYXJyZWxsQGFwYWNoZS5vcmc+ICBXZWQsIDA3IERlYyAyMDE3IDIwOjA3OjAwIC0wNTAwCisKK3RocmlmdCAoMC4xMC4wKSBzdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiB1cGRhdGUgdG8gMC4xMC4wCisKKyAtLSBKYWtlIEZhcnJlbGwgPGpmYXJyZWxsQGFwYWNoZS5vcmc+ICBXZWQsIDAzIEphbiAyMDE3IDE2OjUyOjAwIC0wNTAwCisKK3RocmlmdCAoMC45LjMpIHN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIHVwZGF0ZSB0byAwLjkuMworCisgLS0gSmFrZSBGYXJyZWxsIDxqZmFycmVsbEBhcGFjaGUub3JnPiAgV2VkLCAxMSBPY3QgMjAxNSAxNzoyMjowMCAtMDUwMAorCit0aHJpZnQgKDAuOS4wKSBzdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiB1cGRhdGUgdG8gMC45LjAKKworIC0tIEpha2UgRmFycmVsbCA8amZhcnJlbGxAYXBhY2hlLm9yZz4gIFdlZCwgMTAgT2N0IDIwMTIgMTI6MDA6MDAgLTA1MDAKKwordGhyaWZ0ICgwLjcuMCkgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogdXBkYXRlIHRvIDAuNy4wCisKKyAtLSBKYWtlIEZhcnJlbGwgPGpmYXJyZWxsQGFwYWNoZS5vcmc+ICBUdWUsIDEwIEF1ZyAyMDExIDE3OjAxOjUzIC0wNTAwCisKK3RocmlmdCAoMC43LjAtZGV2MSkgc3RhYmxlOyB1cmdlbmN5PWxvdworICAqIGFkZGVkIGdsaWIKKyAgKiBmaXggbG9jYXRpb24gb2YgbGlidGhyaWZ0LmphcgorCisgLS0gUm9nZXIgTWVpZXIgPHJvZ2VyQGFwYWNoZS5vcmc+ICBUdWUsIDEyIEFwciAyMDExIDIxOjQxOjE4ICswMjAwCisKK3RocmlmdCAoMC42LjAtZGV2MSkgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogdXBkYXRlIHZlcnNpb24gZmllbGQKKyAgKiBhZGRlZCBkZWJpYW4gZm9sZGVyIHRvIHRocmlmdC9jb250cmliCisgICogY2hhbmdlZCBhIGZldyBkZXRhaWxzIGluIGNvbnRyb2wgZmlsZQorICAqIHVwZGF0ZSBjb3B5cmlnaHQgZmlsZQorCisgLS0gUm9nZXIgTWVpZXIgPHJvZ2VyQGFwYWNoZS5vcmc+ICBUdWUsIDE0IERlYyAyMDEwIDEyOjEyOjMzIC0wODAwCisKK3RocmlmdCAoMC41LjArbm11Mikgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogTm9uLW1haW50YWluZXIgdXBsb2FkLgorICAqIE1lcmdlZCBUSFJJRlQtNzFfdjkucGF0Y2ggdG8gc2tpcCAuL2Jvb3RzdHJhcC5zaCBpZiBub3QgZXhpc3RzLgorICAgIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9zZWN1cmUvYXR0YWNobWVudC8xMjQ2NTM2MC9USFJJRlQtNzFfdjkucGF0Y2gKKworIC0tIFlhbWFzaGl0YSBZdXUgPHlhbWFzaGl0YUBnZWlzaGF0b2t5by5jb20+ICBUdWUsIDA3IERlYyAyMDEwIDE1OjAwOjU1ICswOTAwCisKK3RocmlmdCAoMC41LjArbm11MSkgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogTm9uLW1haW50YWluZXIgdXBsb2FkLgorICAqIEltcG9ydGVkIHBhY2thZ2UgaW5mb3JtYXRpb24gZm9yIHBocDUtdGhyaWZ0IGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3NpbXBsZWdlby90aHJpZnQuCisKKyAtLSBZYW1hc2hpdGEgWXV1IDx5YW1hc2hpdGFAZ2Vpc2hhdG9reW8uY29tPiAgVHVlLCAwNyBEZWMgMjAxMCAwMTowMDoxNyArMDkwMAorCit0aHJpZnQgKDAuNS4wKSBzdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiB1cGRhdGUgdG8gMC41LjAKKworIC0tIFJvZ2VyIE1laWVyIDxyb2dlckBhcGFjaGUub3JnPiAgRnJpLCAwOCBPY3QgMjAxMCAxMToyMzo1MyArMDIwMAorCit0aHJpZnQgKDAuNC4wKSBzdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiB1cGRhdGUgdG8gMC40LjAKKworIC0tIFJvZ2VyIE1laWVyIDxyb2dlckBidWZmZXJvdmVyZmxvdy5jaD4gIFN1biwgMjIgQXVnIDIwMTAgMjE6MjY6MDAgKzAxMDAKKwordGhyaWZ0ICgwLjIwMDguMTIuMzB+OC4wNCkgaGFyZHk7IHVyZ2VuY3k9bG93CisKKyAgKiBJbml0aWFsIHJlbGVhc2UuCisKKyAtLSBFc3RldmUgRmVybmFuZGV6IDxlc3RldmVAZmx1aWRpbmZvLmNvbT4gIFRodSwgMTUgSmFuIDIwMDkgMTE6MzQ6MjQgKzAxMDAKZGlmZiAtLWdpdCBhL2RlYmlhbi9jb21wYXQgYi9kZWJpYW4vY29tcGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNjM1MTQKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vY29tcGF0CkBAIC0wLDAgKzEgQEAKKzkKZGlmZiAtLWdpdCBhL2RlYmlhbi9jb250cm9sIGIvZGViaWFuL2NvbnRyb2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxOGEzNwotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9jb250cm9sCkBAIC0wLDAgKzEsMjAyIEBACitTb3VyY2U6IHRocmlmdAorU2VjdGlvbjogZGV2ZWwKK1ByaW9yaXR5OiBleHRyYQorQnVpbGQtRGVwZW5kczogZGViaGVscGVyICg+PSA5KSwgYnVpbGQtZXNzZW50aWFsLCBtb25vLW1jcywgcHl0aG9uLWRldiwgYW50LAorICAgIG1vbm8tZGV2ZWwsICBsaWJtb25vLXN5c3RlbS13ZWI0LjAtY2lsLCBlcmxhbmctYmFzZSwgcnVieS1kZXYgfCBydWJ5MS45LjEtZGV2LCBydWJ5LWJ1bmRsZXIgLGF1dG9jb25mLCBhdXRvbWFrZSwKKyAgICBwa2ctY29uZmlnLCBsaWJ0b29sLCBiaXNvbiwgZmxleCwgbGliYm9vc3QtZGV2IHwgbGliYm9vc3QxLjUzLWRldiB8IGxpYmJvb3N0MS42My1hbGwtZGV2LAorICAgIHB5dGhvbi1hbGwsIHB5dGhvbi1zZXR1cHRvb2xzLCBweXRob24tYWxsLWRldiwgcHl0aG9uLWFsbC1kYmcsCisgICAgcHl0aG9uMy1hbGwsIHB5dGhvbjMtc2V0dXB0b29scywgcHl0aG9uMy1hbGwtZGV2LCBweXRob24zLWFsbC1kYmcsCisgICAgb3Blbmpkay03LWpkayB8IG9wZW5qZGstOC1qZGsgfCBkZWZhdWx0LWpkaywKKyAgICBsaWJib29zdC10ZXN0LWRldiB8IGxpYmJvb3N0LXRlc3QxLjUzLWRldiB8IGxpYmJvb3N0LXRlc3QxLjYzLWRldiwgbGliZXZlbnQtZGV2LCBsaWJzc2wtZGV2LCBwZXJsICg+PSA1LjguMC03KSwKKyAgICBwaHAgKD49IDUpLCBwaHAtZGV2ICg+PSA1KSwgbGliZ2xpYjIuMC1kZXYsIHF0Y2hvb3NlciwgcXRiYXNlNS1kZXYtdG9vbHMKK01haW50YWluZXI6IFRocmlmdCBEZXZlbG9wZXIncyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorSG9tZXBhZ2U6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy8KK1Zjcy1HaXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdAorVmNzLUJyb3dzZXI6IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0CitTdGFuZGFyZHMtVmVyc2lvbjogMy45LjcKK1gtUHl0aG9uLVZlcnNpb246ID49IDIuNgorWC1QeXRob24zLVZlcnNpb246ID49IDMuMworCitQYWNrYWdlOiB0aHJpZnQtY29tcGlsZXIKK0FyY2hpdGVjdHVyZTogYW55CitEZXBlbmRzOiAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9CitEZXNjcmlwdGlvbjogQ29tcGlsZXIgZm9yIFRocmlmdCBkZWZpbml0aW9uIGZpbGVzCisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIFRocmlmdCBjb21waWxlciB0aGF0IGlzIHVzZWQgZm9yIHRyYW5zbGF0aW5nCisgZnJvbSAudGhyaWZ0IGZpbGVzIChjb250YWluaW5nIHRoZSBkZWZpbml0aW9ucykgdG8gdGhlIGxhbmd1YWdlIGJpbmRpbmcKKyBmb3IgdGhlIHN1cHBvcnRlZCBsYW5ndWFnZXMuCisKK1BhY2thZ2U6IHB5dGhvbi10aHJpZnQKK0FyY2hpdGVjdHVyZTogYW55CitTZWN0aW9uOiBweXRob24KK0RlcGVuZHM6ICR7cHl0aG9uOkRlcGVuZHN9LCAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9LCBweXRob24tc2l4CitSZWNvbW1lbmRzOiBweXRob24tdHdpc3RlZC13ZWIsIHB5dGhvbi1iYWNrcG9ydHMuc3NsLW1hdGNoLWhvc3RuYW1lLCBweXRob24taXBhZGRyZXNzCitQcm92aWRlczogJHtweXRob246UHJvdmlkZXN9CitEZXNjcmlwdGlvbjogUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQgKFB5dGhvbiAyKQorIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBQeXRob24gYmluZGluZ3MgZm9yIFRocmlmdC4gWW91IHdpbGwgbmVlZCB0aGUgdGhyaWZ0CisgdG9vbCAoaW4gdGhlIHRocmlmdC1jb21waWxlciBwYWNrYWdlKSB0byBjb21waWxlIHlvdXIgZGVmaW5pdGlvbiB0byBQeXRob24KKyBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRob3NlCisgY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgorIC4KKyBUaGlzIHBhY2thZ2UgaW5zdGFsbHMgdGhlIGxpYnJhcnkgZm9yIFB5dGhvbiAyLgorCitQYWNrYWdlOiBweXRob24tdGhyaWZ0LWRiZworQXJjaGl0ZWN0dXJlOiBhbnkKK1NlY3Rpb246IGRlYnVnCitEZXBlbmRzOiAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9LCBweXRob24tdGhyaWZ0ICg9ICR7YmluYXJ5OlZlcnNpb259KSwgcHl0aG9uLWFsbC1kYmcKK1Byb3ZpZGVzOiAke3B5dGhvbjpQcm92aWRlc30KK0Rlc2NyaXB0aW9uOiBQeXRob24gYmluZGluZ3MgZm9yIFRocmlmdCAoZGVidWcgdmVyc2lvbikKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQgd2l0aCBkZWJ1Z2dpbmcgc3ltYm9scy4KKyBZb3Ugd2lsbCBuZWVkIHRoZSB0aHJpZnQgdG9vbCAoaW4gdGhlIHRocmlmdC1jb21waWxlciBwYWNrYWdlKSB0byBjb21waWxlIHlvdXIKKyBkZWZpbml0aW9uIHRvIFB5dGhvbiBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdworIHlvdSB0byB1c2UgdGhvc2UgY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgorCitQYWNrYWdlOiBweXRob24zLXRocmlmdAorQXJjaGl0ZWN0dXJlOiBhbnkKK1NlY3Rpb246IHB5dGhvbgorRGVwZW5kczogJHtweXRob24zOkRlcGVuZHN9LCAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9LCBweXRob24zLXNpeAorUmVjb21tZW5kczogcHl0aG9uMy10d2lzdGVkLXdlYgorUHJvdmlkZXM6ICR7cHl0aG9uOlByb3ZpZGVzfQorRGVzY3JpcHRpb246IFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0IChQeXRob24gMykKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQuIFlvdSB3aWxsIG5lZWQgdGhlIHRocmlmdAorIHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyIGRlZmluaXRpb24gdG8gUHl0aG9uCisgY2xhc3NlcywgYW5kIHRoZW4gdGhlIG1vZHVsZXMgaW4gdGhpcyBwYWNrYWdlIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB0aG9zZQorIGNsYXNzZXMgaW4geW91ciBwcm9ncmFtcy4KKyAuCisgVGhpcyBwYWNrYWdlIGluc3RhbGxzIHRoZSBsaWJyYXJ5IGZvciBQeXRob24gMy4KKworUGFja2FnZTogcHl0aG9uMy10aHJpZnQtZGJnCitBcmNoaXRlY3R1cmU6IGFueQorU2VjdGlvbjogZGVidWcKK0RlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIHB5dGhvbjMtdGhyaWZ0ICg9ICR7YmluYXJ5OlZlcnNpb259KSwgcHl0aG9uMy1hbGwtZGJnCitQcm92aWRlczogJHtweXRob246UHJvdmlkZXN9CitEZXNjcmlwdGlvbjogUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQgKGRlYnVnIHZlcnNpb24pCisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0IHdpdGggZGVidWdnaW5nIHN5bWJvbHMuCisgWW91IHdpbGwgbmVlZCB0aGUgdGhyaWZ0IHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyCisgZGVmaW5pdGlvbiB0byBQeXRob24gY2xhc3NlcywgYW5kIHRoZW4gdGhlIG1vZHVsZXMgaW4gdGhpcyBwYWNrYWdlIHdpbGwgYWxsb3cKKyB5b3UgdG8gdXNlIHRob3NlIGNsYXNzZXMgaW4geW91ciBwcm9ncmFtcy4KKworUGFja2FnZTogcnVieS10aHJpZnQKK0FyY2hpdGVjdHVyZTogYWxsCitTZWN0aW9uOiBsaWJzCitEZXBlbmRzOiBydWJ5IHwgcnVieS1pbnRlcnByZXRlciwgJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfQorUHJvdmlkZXM6IGxpYnRocmlmdC1ydWJ5CitSZXBsYWNlczogbGlidGhyaWZ0LXJ1YnkKK0JyZWFrczogbGlidGhyaWZ0LXJ1YnkKK0Rlc2NyaXB0aW9uOiBSdWJ5IGJpbmRpbmdzIGZvciBUaHJpZnQKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgUnVieSBiaW5kaW5ncyBmb3IgVGhyaWZ0LiBZb3Ugd2lsbCBuZWVkIHRoZSB0aHJpZnQKKyB0b29sIChpbiB0aGUgdGhyaWZ0LWNvbXBpbGVyIHBhY2thZ2UpIHRvIGNvbXBpbGUgeW91ciBkZWZpbml0aW9uIHRvIFJ1YnkKKyBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRob3NlCisgY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgorCitQYWNrYWdlOiBsaWJ0aHJpZnQtamF2YQorQXJjaGl0ZWN0dXJlOiBhbGwKK1NlY3Rpb246IGphdmEKK0RlcGVuZHM6ICR7bWlzYzpEZXBlbmRzfQorRGVzY3JpcHRpb246IEphdmEgYmluZGluZ3MgZm9yIFRocmlmdAorIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBKYXZhIGJpbmRpbmdzIGZvciBUaHJpZnQuIFlvdSB3aWxsIG5lZWQgdGhlIHRocmlmdAorIHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyIGRlZmluaXRpb24gdG8gSmF2YQorIGNsYXNzZXMsIGFuZCB0aGVuIHRoZSBtb2R1bGVzIGluIHRoaXMgcGFja2FnZSB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhvc2UKKyBjbGFzc2VzIGluIHlvdXIgcHJvZ3JhbXMuCisKK1BhY2thZ2U6IGxpYnRocmlmdC1jaWwKK0FyY2hpdGVjdHVyZTogYWxsCitTZWN0aW9uOiBjbGktbW9ubworRGVwZW5kczogY2xpLWNvbW1vbiwgbGlibW9uby1jb3JsaWI0LjAtY2lsICg+PSAyLjEwKSB8IGxpYm1vbm8tY29ybGliNC41LWNpbCAoPj0zLjIpLCBsaWJtb25vLXN5c3RlbTQuMC1jaWwgKD49IDIuMTApLAorICAgIGxpYm1vbm8tc3lzdGVtLXdlYjQuMC1jaWwgKD49IDIuMTApLCAke21pc2M6RGVwZW5kc30KK0Rlc2NyaXB0aW9uOiBDTEkgYmluZGluZ3MgZm9yIFRocmlmdAorIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBDTEkgYmluZGluZ3MgZm9yIFRocmlmdC4gWW91IHdpbGwgbmVlZCB0aGUgdGhyaWZ0CisgdG9vbCAoaW4gdGhlIHRocmlmdC1jb21waWxlciBwYWNrYWdlKSB0byBjb21waWxlIHlvdXIgZGVmaW5pdGlvbiB0byBDIworIGNsYXNzZXMsIGFuZCB0aGVuIHRoZSBtb2R1bGVzIGluIHRoaXMgcGFja2FnZSB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhvc2UKKyBjbGFzc2VzIGluIHlvdXIgcHJvZ3JhbXMuCisKK1BhY2thZ2U6IGxpYnRocmlmdC1wZXJsCitBcmNoaXRlY3R1cmU6IGFsbAorU2VjdGlvbjogcGVybAorRGVwZW5kczogcGVybCAoPj0gNS44LjAtNyksICR7bWlzYzpEZXBlbmRzfQorRGVzY3JpcHRpb246IFBlcmwgYmluZGluZ3MgZm9yIFRocmlmdAorIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBQZXJsIGJpbmRpbmdzIGZvciBUaHJpZnQuIFlvdSB3aWxsIG5lZWQgdGhlIHRocmlmdAorIHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyIGRlZmluaXRpb24gdG8gUGVybAorIGNsYXNzZXMsIGFuZCB0aGVuIHRoZSBtb2R1bGVzIGluIHRoaXMgcGFja2FnZSB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhvc2UKKyBjbGFzc2VzIGluIHlvdXIgcHJvZ3JhbXMuCisKK1BhY2thZ2U6IGxpYnRocmlmdDAKK0FyY2hpdGVjdHVyZTogYW55CitEZXBlbmRzOiAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9CitEZXNjcmlwdGlvbjogVGhyaWZ0IEMrKyBsaWJyYXJ5CisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIHJ1bnRpbWUgbGlicmFyaWVzIG5lZWRlZCBmb3IgQysrIGFwcGxpY2F0aW9ucworIHVzaW5nIFRocmlmdC4KKworUGFja2FnZTogbGlidGhyaWZ0MC1kYmcKK0FyY2hpdGVjdHVyZTogYW55CitTZWN0aW9uOiBkZWJ1ZworRGVwZW5kczogJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfSwgbGlidGhyaWZ0MCAoPSAke2JpbmFyeTpWZXJzaW9ufSkKK0Rlc2NyaXB0aW9uOiBUaHJpZnQgQysrIGxpYnJhcnkgZGVidWcgc3ltYm9scworIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBkZWJ1ZyBzeW1ib2xzIGZvciB0aGUgVGhyaWZ0IEMrKyBydW50aW1lIGxpYnJhcmllcy4KKworUGFja2FnZTogbGlidGhyaWZ0LWRldgorQXJjaGl0ZWN0dXJlOiBhbnkKK1NlY3Rpb246IGxpYmRldmVsCitEZXBlbmRzOiAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9LCBsaWJ0aHJpZnQwICg9ICR7YmluYXJ5OlZlcnNpb259KSwgbGliZ2xpYjIuMC1kZXYKK0Rlc2NyaXB0aW9uOiBUaHJpZnQgQysrIGxpYnJhcnkgKGRldmVsb3BtZW50IGhlYWRlcnMpCisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIGRldmVsb3BtZW50IGxpYnJhcmllcyByZXF1aXJlZCBmb3Igd3JpdGluZyBDKysKKyBhcHBsaWNhdGlvbnMgdXNpbmcgVGhyaWZ0LgorCitQYWNrYWdlOiBwaHA1LXRocmlmdAorQXJjaGl0ZWN0dXJlOiBhbnkKK1NlY3Rpb246IHBocAorRGVwZW5kczogJHtwaHA6RGVwZW5kc30sICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30KK1Byb3ZpZGVzOiAke3BocDpQcm92aWRlc30KK0Rlc2NyaXB0aW9uOiBQSFAgYmluZGluZ3MgZm9yIFRocmlmdAorIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBQSFAgYmluZGluZ3MgZm9yIFRocmlmdC4KZGlmZiAtLWdpdCBhL2RlYmlhbi9jb3B5cmlnaHQgYi9kZWJpYW4vY29weXJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MDY0M2MKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vY29weXJpZ2h0CkBAIC0wLDAgKzEsMTI5IEBACitUaGlzIHBhY2thZ2Ugd2FzIGRlYmlhbml6ZWQgYnkgVGhyaWZ0IERldmVsb3BlcidzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+LgorCisKK1RoaXMgcGFja2FnZSBhbmQgdGhlIERlYmlhbiBwYWNrYWdpbmcgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLAorc2VlIGAvdXNyL3NoYXJlL2NvbW1vbi1saWNlbnNlcy9BcGFjaGUtMi4wJy4KKworVGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiB3YXMgY29waWVkIGZyb20gQXBhY2hlIFRocmlmdCBMSUNFTlNFIGZpbGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTT0ZUV0FSRSBESVNUUklCVVRFRCBXSVRIIFRIUklGVDoKKworVGhlIEFwYWNoZSBUaHJpZnQgc29mdHdhcmUgaW5jbHVkZXMgYSBudW1iZXIgb2Ygc3ViY29tcG9uZW50cyB3aXRoCitzZXBhcmF0ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgbGljZW5zZSB0ZXJtcy4gWW91ciB1c2Ugb2YgdGhlIHNvdXJjZQorY29kZSBmb3IgdGhlIHRoZXNlIHN1YmNvbXBvbmVudHMgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQb3J0aW9ucyBvZiB0aGUgZm9sbG93aW5nIGZpbGVzIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2U6CisKKyAgbGliL2VybC9zcmMvTWFrZWZpbGUuYW0KKworUGxlYXNlIHNlZSBkb2Mvb3RwLWJhc2UtbGljZW5zZS50eHQgZm9yIHRoZSBmdWxsIHRlcm1zIG9mIHRoaXMgbGljZW5zZS4KKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIGZvbGxvd2luZyBmaWxlcyBjb250YWluIHNvbWUgcG9ydGlvbnMgb2YgY29kZSBjb250cmlidXRlZCB1bmRlcgordGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlIChzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQpLCBhbmQgcmVsaWNlbnNlZAordW5kZXIgdGhlIEFwYWNoZSAyLjAgTGljZW5zZToKKworICBjb21waWxlci9jcHAvTWFrZWZpbGUuYW0KKyAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjCisgIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjCisgIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcHlfZ2VuZXJhdG9yLmNjCisgIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL21haW4uY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2ZpZWxkLmgKKyAgY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Byb2dyYW0uaAorICBjb21waWxlci9jcHAvc3JjL3BsYXRmb3JtLmgKKyAgY29tcGlsZXIvY3BwL3NyYy90aHJpZnRsLmxsCisgIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0eS55eQorICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3MKKyAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEZpZWxkLmNzCisgIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RMaXN0LmNzCisgIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNYXAuY3MKKyAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2UuY3MKKyAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2VUeXBlLmNzCisgIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbC5jcworICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uY3MKKyAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5jcworICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xVdGlsLmNzCisgIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RTZXQuY3MKKyAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFN0cnVjdC5jcworICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UVHlwZS5jcworICBsaWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlci5jcworICBsaWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcworICBsaWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3MKKyAgbGliL2NzaGFycC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCisgIGxpYi9jc2hhcnAvc3JjL1RocmlmdC5jc3Byb2oKKyAgbGliL2NzaGFycC9zcmMvVGhyaWZ0LnNsbgorICBsaWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yLmNzCisgIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNzCisgIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmNzCisgIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0LmNzCisgIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzCisgIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzCisgIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzCisgIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5jcworICBsaWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisgIGxpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0QnVpbGQuY3MKKyAgbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRNU0J1aWxkVGFzay5jc3Byb2oKKyAgbGliL3JiL2xpYi90aHJpZnQucmIKKyAgbGliL3N0L1JFQURNRQorICBsaWIvc3QvdGhyaWZ0LnN0CisgIHRlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwCisgIHRlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CisgIHRlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZvciB0aGUgYWNsb2NhbC9heF9ib29zdF9iYXNlLm00IGFuZCBjb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNCBjb21wb25lbnRzOgorCisjICAgQ29weXJpZ2h0IChjKSAyMDA3IFRob21hcyBQb3JzY2hiZXJnIDx0aG9tYXNAcmFuZHNwcmluZ2VyLmRlPgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dAorIyAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZAorIyAgIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRm9yIHRoZSBjb21waWxlci9jcHAvc3JjL21kNS5bY2hdIGNvbXBvbmVudHM6CisKKy8qCisgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiBBbGFkZGluIEVudGVycHJpc2VzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisKKyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKKyAgTC4gUGV0ZXIgRGV1dHNjaAorICBnaG9zdEBhbGFkZGluLmNvbQorCisgKi8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGb3IgdGhlIGxpYi9yYi9zZXR1cC5yYjogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgTWluZXJvIEFva2ksCitsaWIvb2NhbWwvT0NhbWxNYWtlZmlsZSBhbmQgbGliL29jYW1sL1JFQURNRS1PQ2FtbE1ha2VmaWxlIGNvbXBvbmVudHM6CisgICAgIENvcHlyaWdodCAoQykgMTk5OSAtIDIwMDcgIE1hcmt1cyBNb3R0bAorCitMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAyLjEKKyhzZWUgZG9jL2xncGwtMi4xLnR4dCBmb3IgdGhlIGZ1bGwgdGVybXMgb2YgdGhpcyBsaWNlbnNlKQpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vZGlycyBiL2RlYmlhbi9kaXJzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb250cmliL2RlYmlhbi9kaXJzCnJlbmFtZSB0byBkZWJpYW4vZGlycwpkaWZmIC0tZ2l0IGEvZGViaWFuL2RvY3MgYi9kZWJpYW4vZG9jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDNiZjg2Ci0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL2RvY3MKQEAgLTAsMCArMSBAQAorUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9saWJ0aHJpZnQtZGV2Lmluc3RhbGwgYi9kZWJpYW4vbGlidGhyaWZ0LWRldi5pbnN0YWxsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb250cmliL2RlYmlhbi9saWJ0aHJpZnQtZGV2Lmluc3RhbGwKcmVuYW1lIHRvIGRlYmlhbi9saWJ0aHJpZnQtZGV2Lmluc3RhbGwKZGlmZiAtLWdpdCBhL2RlYmlhbi9saWJ0aHJpZnQwLmluc3RhbGwgYi9kZWJpYW4vbGlidGhyaWZ0MC5pbnN0YWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNzRlZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vbGlidGhyaWZ0MC5pbnN0YWxsCkBAIC0wLDAgKzEsNSBAQAordXNyL2xpYi9saWJ0aHJpZnQuc28qCit1c3IvbGliL2xpYnRocmlmdC0qLnNvKgordXNyL2xpYi9saWJ0aHJpZnRuYiouc28qCit1c3IvbGliL2xpYnRocmlmdHF0Ki5zbyoKK3Vzci9saWIvbGlidGhyaWZ0eiouc28qCmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9waHA1LXRocmlmdC5kaXJzIGIvZGViaWFuL3BocDUtdGhyaWZ0LmRpcnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbnRyaWIvZGViaWFuL3BocDUtdGhyaWZ0LmRpcnMKcmVuYW1lIHRvIGRlYmlhbi9waHA1LXRocmlmdC5kaXJzCmRpZmYgLS1naXQgYS9kZWJpYW4vcnVsZXMgYi9kZWJpYW4vcnVsZXMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWI0MzZkOQotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9ydWxlcwpAQCAtMCwwICsxLDIyOCBAQAorIyEvdXNyL2Jpbi9tYWtlIC1mCisjIC0qLSBtYWtlZmlsZSAtKi0KKyMgU2FtcGxlIGRlYmlhbi9ydWxlcyB0aGF0IHVzZXMgZGViaGVscGVyLgorIworIyBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBKb2V5IEhlc3MgYW5kIENyYWlnIFNtYWxsLgorIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGVuIHRoaXMgZmlsZSBpcyBjb3BpZWQgYnkgZGgtbWFrZSBpbnRvIGEKKyMgZGgtbWFrZSBvdXRwdXQgZmlsZSwgeW91IG1heSB1c2UgdGhhdCBvdXRwdXQgZmlsZSB3aXRob3V0IHJlc3RyaWN0aW9uLgorIyBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSBDcmFpZyBTbWFsbCBpbiB2ZXJzaW9uIDAuMzcgb2YgZGgtbWFrZS4KKyMKKyMgTW9kaWZpZWQgdG8gbWFrZSBhIHRlbXBsYXRlIGZpbGUgZm9yIGEgbXVsdGktYmluYXJ5IHBhY2thZ2Ugd2l0aCBzZXBhcmF0ZWQKKyMgYnVpbGQtYXJjaCBhbmQgYnVpbGQtaW5kZXAgdGFyZ2V0cyAgYnkgQmlsbCBBbGxvbWJlcnQgMjAwMQorCisjIFVuY29tbWVudCB0aGlzIHRvIHR1cm4gb24gdmVyYm9zZSBtb2RlLgorI2V4cG9ydCBESF9WRVJCT1NFPTEKKworIyBUaGlzIGhhcyB0byBiZSBleHBvcnRlZCB0byBtYWtlIHNvbWUgbWFnaWMgYmVsb3cgd29yay4KK2V4cG9ydCBESF9PUFRJT05TCisKK1BZVkVSUyA6PSAkKHNoZWxsIHB5dmVyc2lvbnMgLXIpCisKK2V4cG9ydCBDUFBGTEFHUzo9JChzaGVsbCBkcGtnLWJ1aWxkZmxhZ3MgLS1nZXQgQ1BQRkxBR1MpCitleHBvcnQgQ0ZMQUdTOj0kKHNoZWxsIGRwa2ctYnVpbGRmbGFncyAtLWdldCBDRkxBR1MpCitleHBvcnQgQ1hYRkxBR1M6PSQoc2hlbGwgZHBrZy1idWlsZGZsYWdzIC0tZ2V0IENYWEZMQUdTKQorZXhwb3J0IExERkxBR1M6PSQoc2hlbGwgZHBrZy1idWlsZGZsYWdzIC0tZ2V0IExERkxBR1MpCisKK2NvbmZpZ3VyZTogY29uZmlndXJlLXN0YW1wCitjb25maWd1cmUtc3RhbXA6CisJZGhfdGVzdGRpcgorCisJIyBBZGQgaGVyZSBjb21tYW5kcyB0byBjb25maWd1cmUgdGhlIHBhY2thZ2UuCisJaWYgWyAtZiBib290c3RyYXAuc2ggXTsgdGhlbiAkKENVUkRJUikvYm9vdHN0cmFwLnNoOyBmaQorCSQoQ1VSRElSKS9jb25maWd1cmUgLS1wcmVmaXg9L3VzciAtLWVuYWJsZS1wbHVnaW49bm8KKworCXRvdWNoIGNvbmZpZ3VyZS1zdGFtcAorCisKKyNBcmNoaXRlY3R1cmUKK2J1aWxkOiBidWlsZC1hcmNoIGJ1aWxkLWluZGVwCisJIyBUZXN0cyBkaXNhYmxlZAorCSMgJChNQUtFKSAtQyB0ZXN0IGNoZWNrCisKK2J1aWxkLWFyY2g6IGJ1aWxkLWFyY2gtc3RhbXAKKyQoQ1VSRElSKS9jb21waWxlci9jcHAvdGhyaWZ0IGJ1aWxkLWFyY2gtc3RhbXA6IGNvbmZpZ3VyZS1zdGFtcAorCisJIyBDb21waWxlIGNvbXBpbGVyCisJJChNQUtFKSAtQyAkKENVUkRJUikvY29tcGlsZXIvY3BwCisKKwkjIENvbXBpbGUgQysrIGxpYnJhcnkKKwkkKE1BS0UpIC1DICQoQ1VSRElSKS9saWIvY3BwCisKKwkjIENvbXBpbGUgQyAoZ2xpYikgbGlicmFyeQorCSQoTUFLRSkgLUMgJChDVVJESVIpL2xpYi9jX2dsaWIKKworCSMgUHl0aG9uIGxpYnJhcnkKKwljZCAkKENVUkRJUikvbGliL3B5ICYmIFwKKyAgICBmb3IgcHkgaW4gJChQWVZFUlMpOyBkbyAgXAorICAgICAgICAkJHB5IHNldHVwLnB5IGJ1aWxkOyBcCisgICAgICAgICQkcHktZGJnIHNldHVwLnB5IGJ1aWxkOyBcCisgICAgZG9uZQorCisJIyBQSFAKKwljZCAkKENVUkRJUikvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbCAmJiBcCisJCXBocGl6ZSAmJiBcCisJCS4vY29uZmlndXJlICYmICQoTUFLRSkKKworCXRvdWNoICRACisKK2J1aWxkLWluZGVwOiBidWlsZC1pbmRlcC1zdGFtcAorYnVpbGQtaW5kZXAtc3RhbXA6IGNvbmZpZ3VyZS1zdGFtcCAkKENVUkRJUikvY29tcGlsZXIvY3BwL3RocmlmdAorCisJIyBBZGQgaGVyZSBjb21tYW5kcyB0byBjb21waWxlIHRoZSBpbmRlcCBwYXJ0IG9mIHRoZSBwYWNrYWdlLgorCSMkKE1BS0UpIGRvYworCisJIyBKYXZhCisJY2QgJChDVVJESVIpL2xpYi9qYXZhICYmIFwKKwkJLi9ncmFkbGV3IC0tbm8tZGFlbW9uIC1QcmVsZWFzZT10cnVlIGphcgorCisJIyBDIworCSQoTUFLRSkgLUMgJChDVVJESVIpL2xpYi9jc2hhcnAKKworCSMgUnVieQorCSQoTUFLRSkgLUMgJChDVVJESVIpL2xpYi9yYgorCisJIyBQZXJsCisJJChNQUtFKSAtQyAkKENVUkRJUikvbGliL3BlcmwgSU5TVEFMTERJUlM9dmVuZG9yCisKKwl0b3VjaCAkQAorCitjbGVhbjoKKwlkaF90ZXN0ZGlyCisJZGhfdGVzdHJvb3QKKwlybSAtZiBidWlsZC1hcmNoLXN0YW1wIGJ1aWxkLWluZGVwLXN0YW1wIGNvbmZpZ3VyZS1zdGFtcAorCisJY2QgJChDVVJESVIpL2xpYi9weSAmJiBweXRob24gc2V0dXAucHkgY2xlYW4gLS1hbGwKKworCSMgQWRkIGhlcmUgY29tbWFuZHMgdG8gY2xlYW4gdXAgYWZ0ZXIgdGhlIGJ1aWxkIHByb2Nlc3MuCisJLSQoTUFLRSkgY2xlYW4KKworCSQoQ1VSRElSKS9jbGVhbnVwLnNoCisKKwlkaF9jbGVhbgorCitpbnN0YWxsOiBpbnN0YWxsLWluZGVwIGluc3RhbGwtYXJjaAoraW5zdGFsbC1pbmRlcDoKKwlkaF90ZXN0ZGlyCisJZGhfdGVzdHJvb3QKKwlkaF9wcmVwIC1pCisJZGhfaW5zdGFsbGRpcnMgLWkKKworCSMgQWRkIGhlcmUgY29tbWFuZHMgdG8gaW5zdGFsbCB0aGUgaW5kZXAgcGFydCBvZiB0aGUgcGFja2FnZSBpbnRvCisJIyBkZWJpYW4vPHBhY2thZ2U+LWRvYy4KKwkjSU5TVEFMTERPQyMKKworCSMgSmF2YQorCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LWphdmEvdXNyL3NoYXJlL2phdmEvICYmIFwKKwljcCAkKENVUkRJUikvbGliL2phdmEvYnVpbGQvbGlicy9saWJ0aHJpZnQqLmphciBcCisJCSQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LWphdmEvdXNyL3NoYXJlL2phdmEvCisKKwkjIFJ1YnkKKwlta2RpciAtcCAkKENVUkRJUikvZGViaWFuL3J1YnktdGhyaWZ0L3Vzci9saWIvcnVieS8xLjkuMSAmJiBcCisJY3AgJChDVVJESVIpL2xpYi9yYi9saWIvdGhyaWZ0LnJiIFwKKwkJJChDVVJESVIpL2RlYmlhbi9ydWJ5LXRocmlmdC91c3IvbGliL3J1YnkvMS45LjEKKwljcCAtciAkKENVUkRJUikvbGliL3JiL2xpYi90aHJpZnQgXAorCQkkKENVUkRJUikvZGViaWFuL3J1YnktdGhyaWZ0L3Vzci9saWIvcnVieS8xLjkuMQorCisJIyBDIworCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LWNpbC91c3IvbGliL2NsaS90aHJpZnQvICYmIFwKKwljcCAkKENVUkRJUikvbGliL2NzaGFycC9UaHJpZnQuZGxsIFwKKwkJJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtY2lsL3Vzci9saWIvY2xpL3RocmlmdC9UaHJpZnQuZGxsCisKKwkjIFBlcmwKKwkkKE1BS0UpIC1DICQoQ1VSRElSKS9saWIvcGVybCBpbnN0YWxsIERFU1RESVI9JChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybAorCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LXBlcmwvdXNyL3NoYXJlCisJbXYgJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybC91c3IvbG9jYWwvbGliL3Blcmw1ICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LXBlcmwvdXNyL3NoYXJlCisJcm1kaXIgJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybC91c3IvbG9jYWwvbGliCisJcm1kaXIgJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybC91c3IvbG9jYWwKKworCWRoX2luc3RhbGwgLWkKKworaW5zdGFsbC1hcmNoOgorCWRoX3Rlc3RkaXIKKwlkaF90ZXN0cm9vdAorCWRoX2NsZWFuIC1rIC1zCisJZGhfaW5zdGFsbGRpcnMgLXMKKworCSMgQWRkIGhlcmUgY29tbWFuZHMgdG8gaW5zdGFsbCB0aGUgYXJjaCBwYXJ0IG9mIHRoZSBwYWNrYWdlIGludG8KKwkjIGRlYmlhbi90bXAuCisJIyQoTUFLRSkgREVTVERJUj0kKENVUkRJUikvZGViaWFuL3RocmlmdCBpbnN0YWxsCisKKwkjIENvbXBpbGVyCisJbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi90aHJpZnQtY29tcGlsZXIvdXNyL2JpbiAmJiBcCisJY3AgJChDVVJESVIpL2NvbXBpbGVyL2NwcC90aHJpZnQgXAorCQkkKENVUkRJUikvZGViaWFuL3RocmlmdC1jb21waWxlci91c3IvYmluL3RocmlmdCAmJiBcCisJcm1kaXIgJChDVVJESVIpL2RlYmlhbi90aHJpZnQtY29tcGlsZXIvdXNyL3NiaW4KKworCSMgUHl0aG9uCisJY2QgJChDVVJESVIpL2xpYi9weSAmJiBcCisJcHl0aG9uMiBzZXR1cC5weSBpbnN0YWxsIC0taW5zdGFsbC1sYXlvdXQ9ZGViIC0tbm8tY29tcGlsZSAtLXJvb3Q9JChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0ICYmIFwKKwlweXRob24yLWRiZyBzZXR1cC5weSBpbnN0YWxsIC0taW5zdGFsbC1sYXlvdXQ9ZGViIC0tbm8tY29tcGlsZSAtLXJvb3Q9JChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAmJiBcCisJcHl0aG9uMyBzZXR1cC5weSBpbnN0YWxsIC0taW5zdGFsbC1sYXlvdXQ9ZGViIC0tbm8tY29tcGlsZSAtLXJvb3Q9JChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdCAmJiBcCisJcHl0aG9uMy1kYmcgc2V0dXAucHkgaW5zdGFsbCAtLWluc3RhbGwtbGF5b3V0PWRlYiAtLW5vLWNvbXBpbGUgLS1yb290PSQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQtZGJnCisKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdCAtbmFtZSAiKi5weVtjb10iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0IC1uYW1lICJfX3B5Y2FjaGVfXyIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mcgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAtbmFtZSAiX19weWNhY2hlX18iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZnIKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdC1kYmcgLW5hbWUgIioucHlbY29dIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdC1kYmcgLW5hbWUgIioucHkiIC1wcmludDAgfCB4YXJncyAtMCBybSAtZgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAtbmFtZSAiKi5lZ2ctaW5mbyIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1yZgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAtZGVwdGggLXR5cGUgZCAtZW1wdHkgLWV4ZWMgcm1kaXIge30gXDsKKworCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdCAtbmFtZSAiKi5weVtjb10iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdCAtbmFtZSAiX19weWNhY2hlX18iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZnIKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQtZGJnIC1uYW1lICJfX3B5Y2FjaGVfXyIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mcgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdC1kYmcgLW5hbWUgIioucHlbY29dIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQtZGJnIC1uYW1lICIqLnB5IiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQtZGJnIC1uYW1lICIqLmVnZy1pbmZvIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLXJmCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbjMtdGhyaWZ0LWRiZyAtZGVwdGggLXR5cGUgZCAtZW1wdHkgLWV4ZWMgcm1kaXIge30gXDsKKworCSMgUEhQCisJbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi9waHA1LXRocmlmdAorCWNkICQoQ1VSRElSKS9saWIvcGhwICYmIFwKKwkJJChNQUtFKSBERVNURElSPSQoQ1VSRElSKS9kZWJpYW4vcGhwNS10aHJpZnQgaW5zdGFsbAorCisJIyBDKysgYW5kIEMgKGdsaWIpCisJbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi90bXA7IFwKKwljZCAkKENVUkRJUikvbGliL2NwcCAmJiBcCisJCSQoTUFLRSkgREVTVERJUj0kKENVUkRJUikvZGViaWFuL3RtcCBpbnN0YWxsCisJY2QgJChDVVJESVIpL2xpYi9jX2dsaWIgJiYgXAorCQkkKE1BS0UpIERFU1RESVI9JChDVVJESVIpL2RlYmlhbi90bXAgaW5zdGFsbAorCisJZGhfaW5zdGFsbCAtLXNvdXJjZWRpcj1kZWJpYW4vdG1wIC1zCisKKworIyBNdXN0IG5vdCBkZXBlbmQgb24gYW55dGhpbmcuIFRoaXMgaXMgdG8gYmUgY2FsbGVkIGJ5CisjIGJpbmFyeS1hcmNoL2JpbmFyeS1pbmRlcAorIyBpbiBhbm90aGVyICdtYWtlJyB0aHJlYWQuCitiaW5hcnktY29tbW9uOgorCWRoX3Rlc3RkaXIKKwlkaF90ZXN0cm9vdAorCWRoX2luc3RhbGxjaGFuZ2Vsb2dzCisJZGhfaW5zdGFsbGRvY3MKKwlkaF9pbnN0YWxsZXhhbXBsZXMKKwlkaF9pbnN0YWxsbWFuCisJZGhfbGluaworCWRoX3N0cmlwIC1wbGlidGhyaWZ0MCAtLWRiZy1wYWNrYWdlPWxpYnRocmlmdDAtZGJnCisJZGhfc3RyaXAgLXBweXRob24tdGhyaWZ0IC0tZGJnLXBhY2thZ2U9cHl0aG9uLXRocmlmdC1kYmcKKwlkaF9zdHJpcCAtcHB5dGhvbjMtdGhyaWZ0IC0tZGJnLXBhY2thZ2U9cHl0aG9uMy10aHJpZnQtZGJnCisJZGhfc3RyaXAgLXB0aHJpZnQtY29tcGlsZXIKKwlkaF9jb21wcmVzcworCWRoX2ZpeHBlcm1zCisJZGhfbWFrZXNobGlicworCWRoX2luc3RhbGxkZWIKKwlkaF9wZXJsCisJZGhfc2hsaWJkZXBzCisJZGhfZ2VuY29udHJvbAorCWRoX21kNXN1bXMKKwlkaF9idWlsZGRlYgorIyBCdWlsZCBhcmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQgcGFja2FnZXMgdXNpbmcgdGhlIGNvbW1vbiB0YXJnZXQuCitiaW5hcnktaW5kZXA6IGJ1aWxkLWluZGVwIGluc3RhbGwtaW5kZXAKKwkkKE1BS0UpIC1mIGRlYmlhbi9ydWxlcyBESF9PUFRJT05TPS1pIGJpbmFyeS1jb21tb24KKworIyBCdWlsZCBhcmNoaXRlY3R1cmUgZGVwZW5kZW50IHBhY2thZ2VzIHVzaW5nIHRoZSBjb21tb24gdGFyZ2V0LgorYmluYXJ5LWFyY2g6IGJ1aWxkLWFyY2ggaW5zdGFsbC1hcmNoCisJZWNobyAicGhwOkRlcGVuZHM9cGhwYXBpLSQoc2hlbGwgcGhwLWNvbmZpZzUgLS1waHBhcGkpIiA+ICQoQ1VSRElSKS9kZWJpYW4vc3Vic3R2YXJzCisJJChNQUtFKSAtZiBkZWJpYW4vcnVsZXMgREhfT1BUSU9OUz0tcyBiaW5hcnktY29tbW9uCisKK2JpbmFyeTogYmluYXJ5LWFyY2ggYmluYXJ5LWluZGVwCisuUEhPTlk6IGJ1aWxkIGNsZWFuIGJpbmFyeS1pbmRlcCBiaW5hcnktYXJjaCBiaW5hcnkgaW5zdGFsbCBpbnN0YWxsLWluZGVwIGluc3RhbGwtYXJjaCBjb25maWd1cmUKZGlmZiAtLWdpdCBhL2RlYmlhbi9zdWJzdHZhcnMgYi9kZWJpYW4vc3Vic3R2YXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NDFmMmQKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vc3Vic3R2YXJzCkBAIC0wLDAgKzEgQEAKK3BocDpEZXBlbmRzPXBocGFwaS0yMDEyMTIxMgpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vdGhyaWZ0LWRvYy5kb2NzIGIvZGViaWFuL3RocmlmdC1kb2MuZG9jcwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29udHJpYi9kZWJpYW4vdGhyaWZ0LWRvYy5kb2NzCnJlbmFtZSB0byBkZWJpYW4vdGhyaWZ0LWRvYy5kb2NzCmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi90aHJpZnQtZG9jLmluc3RhbGwgYi9kZWJpYW4vdGhyaWZ0LWRvYy5pbnN0YWxsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb250cmliL2RlYmlhbi90aHJpZnQtZG9jLmluc3RhbGwKcmVuYW1lIHRvIGRlYmlhbi90aHJpZnQtZG9jLmluc3RhbGwKZGlmZiAtLWdpdCBhL2RvYXAucmRmIGIvZG9hcC5yZGYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2I3NmZhYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYXAucmRmCkBAIC0wLDAgKzEsMTUwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiPz4KKzxyZGY6UkRGIHhtbDpsYW5nPSJlbiIKKyAgICAgICAgIHhtbG5zPSJodHRwOi8vdXNlZnVsaW5jLmNvbS9ucy9kb2FwIyIgCisgICAgICAgICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiIAorICAgICAgICAgeG1sbnM6YXNmZXh0PSJodHRwOi8vcHJvamVjdHMuYXBhY2hlLm9yZy9ucy9hc2ZleHQjIgorICAgICAgICAgeG1sbnM6Zm9hZj0iaHR0cDovL3htbG5zLmNvbS9mb2FmLzAuMS8iPgorPCEtLQorICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgIAorICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAKKyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKyAgPFByb2plY3QgcmRmOmFib3V0PSJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciPgorICAgIDxjcmVhdGVkPjIwMTItMDQtMTQ8L2NyZWF0ZWQ+CisgICAgPGxpY2Vuc2UgcmRmOnJlc291cmNlPSJodHRwOi8vdXNlZnVsaW5jLmNvbS9kb2FwL2xpY2Vuc2VzL2FzbDIwIiAvPgorICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgPGhvbWVwYWdlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIiAvPgorICAgIDxhc2ZleHQ6cG1jIHJkZjpyZXNvdXJjZT0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIiAvPgorICAgIDxzaG9ydGRlc2M+QXBhY2hlIFRocmlmdCBzb2Z0d2FyZSBwcm92aWRlcyBhIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMgZGV2ZWxvcG1lbnQsIGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5IGJldHdlZW4gQysrLCBKYXZhLCBQeXRob24sIFBIUCwgUnVieSwgRXJsYW5nLCBQZXJsLCBIYXNrZWxsLCBDIywgQ29jb2EsIEphdmFTY3JpcHQsIE5vZGUuanMsIFNtYWxsdGFsaywgT0NhbWwgYW5kIERlbHBoaSBhbmQgb3RoZXIgbGFuZ3VhZ2VzLiA8L3Nob3J0ZGVzYz4KKyAgICA8ZGVzY3JpcHRpb24+QXBhY2hlIFRocmlmdCBhbGxvd3MgeW91IHRvIGRlZmluZSBkYXRhIHR5cGVzIGFuZCBzZXJ2aWNlIGludGVyZmFjZXMgaW4gYSBzaW1wbGUgZGVmaW5pdGlvbiBmaWxlLiBUYWtpbmcgdGhhdCBmaWxlIGFzIGlucHV0LCB0aGUgY29tcGlsZXIgZ2VuZXJhdGVzIGNvZGUgdG8gYmUgdXNlZCB0byBlYXNpbHkgYnVpbGQgUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMgdGhhdCBjb21tdW5pY2F0ZSBzZWFtbGVzc2x5IGFjcm9zcyBwcm9ncmFtbWluZyBsYW5ndWFnZXMuIEluc3RlYWQgb2Ygd3JpdGluZyBhIGxvYWQgb2YgYm9pbGVycGxhdGUgY29kZSB0byBzZXJpYWxpemUgYW5kIHRyYW5zcG9ydCB5b3VyIG9iamVjdHMgYW5kIGludm9rZSByZW1vdGUgbWV0aG9kcywgeW91IGNhbiBnZXQgcmlnaHQgZG93biB0byBidXNpbmVzcy4gPC9kZXNjcmlwdGlvbj4KKyAgICA8YnVnLWRhdGFiYXNlIHJkZjpyZXNvdXJjZT0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQiIC8+CisgICAgPG1haWxpbmctbGlzdCByZGY6cmVzb3VyY2U9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9tYWlsaW5nLyIgLz4KKyAgICA8ZG93bmxvYWQtcGFnZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9kb3dubG9hZC8iIC8+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkFjdGlvblNjcmlwdDwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkM8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5DIzwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkMrKzwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkNvY29hPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+RDwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkRhcnQ8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5EZWxwaGk8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5Fcmxhbmc8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5HbzwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkhhc2tlbGw8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5IYXhlPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+SmF2YTwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkphdmFTY3JpcHQ8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5ub2RlLmpzPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+T0NhbWw8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5QZXJsPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+UEhQPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+UHl0aG9uPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+UnVzdDwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPlNtYWxsVGFsazwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPGNhdGVnb3J5IHJkZjpyZXNvdXJjZT0iaHR0cDovL3Byb2plY3RzLmFwYWNoZS5vcmcvY2F0ZWdvcnkvaHR0cCIgLz4KKyAgICA8Y2F0ZWdvcnkgcmRmOnJlc291cmNlPSJodHRwOi8vcHJvamVjdHMuYXBhY2hlLm9yZy9jYXRlZ29yeS9saWJyYXJ5IiAvPgorICAgIDxjYXRlZ29yeSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wcm9qZWN0cy5hcGFjaGUub3JnL2NhdGVnb3J5L25ldHdvcmstY2xpZW50IiAvPgorICAgIDxjYXRlZ29yeSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wcm9qZWN0cy5hcGFjaGUub3JnL2NhdGVnb3J5L25ldHdvcmstc2VydmVyIiAvPgorICAgIDxyZWxlYXNlIHJkZjpwYXJzZVR5cGU9IkNvbGxlY3Rpb24iPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTgtMTItMjg8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjEyLjA8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTctMTEtMzA8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjExLjA8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTctMDMtMDE8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjEwLjA8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTUtMDktMjU8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjkuMzwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdDwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxNC0xMS0wNTwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuOS4yPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDEzLTA4LTIyPC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC45LjE8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTItMTAtMTU8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjkuMDwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdDwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxMS0xMS0yOTwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuOC4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDExLTA4LTEzPC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC43LjA8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTEtMDQtMjU8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjYuMTwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdDwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxMS0wMi0wODwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuNi4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0IChpbmN1YmF0aW5nKTwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxMC0xMC0wNzwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuNS4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0IChpbmN1YmF0aW5nKTwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxMC0wOC0yMzwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuNC4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0IChpbmN1YmF0aW5nKTwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxMC0wOC0wNDwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuMy4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0IChpbmN1YmF0aW5nKTwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAwOS0xMi0xMTwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuMi4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICA8L3JlbGVhc2U+CisgICAgPHJlcG9zaXRvcnk+CisgICAgICA8R2l0UmVwb3NpdG9yeT4KKyAgICAgICAgPGxvY2F0aW9uIHJkZjpyZXNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0Ii8+CisgICAgICAgIDxicm93c2UgcmRmOnJlc291cmNlPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdCIvPgorICAgICAgPC9HaXRSZXBvc2l0b3J5PgorICAgIDwvcmVwb3NpdG9yeT4KKyAgICA8bWFpbnRhaW5lcj4KKyAgICAgIDxmb2FmOlBlcnNvbj4KKyAgICAgICAgPGZvYWY6bmFtZT5BcGFjaGUgVGhyaWZ0IFBNQzwvZm9hZjpuYW1lPgorICAgICAgICAgIDxmb2FmOm1ib3ggcmRmOnJlc291cmNlPSJtYWlsdG86ZGV2QHRocmlmdC5hcGFjaGUub3JnIi8+CisgICAgICA8L2ZvYWY6UGVyc29uPgorICAgIDwvbWFpbnRhaW5lcj4KKyAgPC9Qcm9qZWN0PgorPC9yZGY6UkRGPgpkaWZmIC0tZ2l0IGEvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQgYi9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDgxMDBhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSw0OCBAQAorIyBUaHJpZnQgQ29kaW5nIFN0YW5kYXJkcworCisgICBBbnkgZm9vbCBjYW4gd3JpdGUgY29kZSB0aGF0IGEgY29tcHV0ZXIgY2FuIHVuZGVyc3RhbmQuCisgICBHb29kIHByb2dyYW1tZXJzIHdyaXRlIGNvZGUgdGhhdCBodW1hbnMgY2FuIHVuZGVyc3RhbmQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gTWFydGluIEZvd2xlciwgMTk5OQorCitUaGUgcHVycG9zZSBvZiB0aGlzIGRvY3VtZW50IGlzIHRvIG1ha2UgZXZlcnlvbmUncyBsaWZlIGVhc2llci4KKworSXQncyBlYXNpZXIgd2hlbiB5b3UgcmVhZCBnb29kLCB3ZWxsIGZvcm1hdHRlZCwgd2l0aCBjbGVhcmx5IGRlZmluZWQgcHVycG9zZSwgY29kZS4KK0J1dCB0aGUgb25seSB3YXkgdG8gcmVhZCBjbGVhbiBjb2RlIGlzIHRvIHdyaXRlIHN1Y2guCisKK1RoaXMgZG9jdW1lbnQgY2FuIGhlbHAgYWNoaWV2ZSB0aGF0LCBidXQga2VlcCBpbiBtaW5kIHRoYXQKK3Rob3NlIGFyZSBub3Qgc2lsdmVyLWJ1bGxldCwgZml4LWFsbC1hdC1vbmNlIHJ1bGVzLiBKdXN0IHRoaW5rIGFib3V0IHJlYWRhYmlsaXR5IHdoaWxlIHdyaXRpbmcgY29kZS4KK1dyaXRlIGNvZGUgbGlrZSB5b3Ugd291bGQgaGF2ZSB0byByZWFkIGl0IGluIHRlbiB5ZWFycyBmcm9tIG5vdy4KKworIyMgR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzCisKK1RocmlmdCBoYXMgc29tZSBoaXN0b3J5LiBOb3QgYWxsIGV4aXN0aW5nIGNvZGUgZm9sbG93cyB0aG9zZSBydWxlcy4KK0J1dCB3ZSB3YW50IHRvIGltcHJvdmUgb3ZlciB0aW1lLgorV2hlbiBtYWtpbmcgc21hbGwgY2hhbmdlIC8gYnVnZml4IC0gbGlrZSBzaW5nbGUgbGluZSBmaXggLSBkbyAqbm90KiByZWZhY3RvciB3aG9sZSBmdW5jdGlvbi4KK1RoYXQgZGlzdHVyYnMgY29kZSByZXBvc2l0b3J5IGhpc3RvcnkuCitXaGVuZXZlciBhZGRpbmcgc29tZXRoaW5nIG5ldyBhbmQgLyBvciBtYWtpbmcgYmlnZ2VyIHJlZmFjdG9yaW5nCisgLSBmb2xsb3cgdGhvc2UgcnVsZXMgYXMgc3RyaWN0bHkgYXMgeW91IGNhbi4KKworV2hlbiBpbiBkb3VidCAtIGNvbnRhY3Qgb3RoZXIgZGV2ZWxvcGVycyAodXNpbmcgZGV2QCBtYWlsaW5nIGxpc3Qgb3IgSVJDKS4KK0NvZGUgcmV2aWV3IGlzIHRoZSBiZXN0IHdheSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgorCisjIyMgQmFzaWNzCisgKiBVc2Ugc3BhY2VzIG5vdCB0YWJzCisgKiBVc2Ugb25seSBBU0NJSSBjaGFyYWN0ZXJzIGluIGZpbGUgYW5kIGRpcmVjdG9yeSBuYW1lcworICogQ29tbWl0IHRvIHJlcG9zaXRvcnkgdXNpbmcgVW5peC1zdHlsZSBsaW5lIGVuZGluZ3MgKExGKQorICAgICBPbiBXaW5kb3dzOgorICAgICAgIGdpdCBjb25maWcgY29yZS5hdXRvY3JsZiB0cnVlCisgKiBNYXhpbXVtIGxpbmUgd2lkdGggLSAxMDAgY2hhcmFjdGVycworICogSWYgbm90IHNwZWNpZmllZCBvdGhlcndpc2UgaW4gbGFuZ3VhZ2Ugc3BlY2lmaWMgc3RhbmRhcmQgLSB1c2UgMiBzcGFjZXMgYXMgaW5kZW50L3RhYgorCisjIyMgQ29tbWVudHMKKyAqIEVhY2ggZmlsZSBoYXMgdG8gc3RhcnQgd2l0aCBjb21tZW50IGNvbnRhaW5pbmcgW0FwYWNoZSBMaWNlbnNlXShodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApCisgKiBQdWJsaWMgQVBJIG9mIGxpYnJhcnkgc2hvdWxkIGJlIGRvY3VtZW50ZWQsIHByZWZlcmFibHkgdXNpbmcgZm9ybWF0IG5hdGl2ZSBmb3IgbGFuZ3VhZ2Ugc3BlY2lmaWMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uIHRvb2xzIChKYXZhZG9jLCBEb3h5Z2VuIGV0Yy4pCisgKiBPdGhlciBjb21tZW50cyBhcmUgZGlzY291cmFnZWQgLSBjb21tZW50cyBhcmUgbGllcy4gV2hlbiBvbmUgaGFzIHRvIG1ha2UgY29tbWVudCBpdCBtZWFucyBvbmUgZmFpbGVkIHRvIHdyaXRlIHJlYWRhYmxlIGNvZGUuIEluc3RlYWQgb2YgIkkgc2hvdWxkIHdyaXRlIGEgY29tbWVudCBoZXJlIiB0aGluayAiSSBzaG91bGQgY2xlYW4gaXQgdXAiCisgKiBEbyBub3QgbGVhdmUgIlRPRE8vRklYTUUiIGNvbW1lbnRzIC0gZmlsZSBbSmlyYV0oaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCkgaXNzdWUgaW5zdGVhZAorCisjIyMgTmFtaW5nCisgRmluZGluZyBwcm9wZXIgbmFtZXMgaXMgdGhlIG1vc3QgaW1wb3J0YW50IGFuZCBtb3N0IGRpZmZpY3VsdCB0YXNrIGluIHNvZnR3YXJlIGRldmVsb3BtZW50LgorCisjIyBMYW5ndWFnZSBTcGVjaWZpYyBDb2RpbmcgU3RhbmRhcmRzCisKK0ZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBzZWUgYGxpYi9MQU5HL2NvZGluZ19zdGFuZGFyZHMubWRgCmRpZmYgLS1naXQgYS9kb2MvY29tbWl0dGVycy5tZCBiL2RvYy9jb21taXR0ZXJzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZGQ3YjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvY29tbWl0dGVycy5tZApAQCAtMCwwICsxLDU0IEBACisjIyBQcm9jZXNzIHVzZWQgYnkgY29tbWl0dGVycyB0byByZXZpZXcgYW5kIHN1Ym1pdCBwYXRjaGVzCisKKzEuIE1ha2Ugc3VyZSB0aGF0IHRoZXJlIGlzIGFuIGlzc3VlIGZvciB0aGUgcGF0Y2gocykgeW91IGFyZSBhYm91dCB0byBjb21taXQgaW4gb3VyIFtKaXJhIGlzc3VlIHRyYWNrZXJdKGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQpCisKKzEuIENoZWNrIG91dCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHNvdXJjZSBjb2RlCisKKyAgKiBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IHRocmlmdAorCisxLiBBcHBseSB0aGUgcGF0Y2gKKworICAqIGN1cmwgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhLy4uLiB8Z2l0IGFwcGx5IC0taWdub3JlLXNwYWNlLWNoYW5nZQorCisgIG9yCisKKyAgKiBjdXJsIGh0dHBzOi8vZ2l0aHViLmNvbS88R2l0SHViIFVzZXI+L3RocmlmdC9jb21taXQvPENvbW1pdCBJRD4ucGF0Y2ggfGdpdCBhcHBseSAtLWlnbm9yZS1zcGFjZS1jaGFuZ2UKKworCisxLiBJbnNwZWN0IHRoZSBhcHBsaWVkIHBhdGNoIHRvIGVuc3VyZSB0aGF0IGFsbCBbTGVnYWwgYXNwZWN0cyBvbiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMgKFBhdGNoZXMpXShodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbCNjb250cmlidXRpb25zKSBhcmUgbWV0CisKKzEuIFJ1biB0aGUgbmVjZXNzYXJ5IHVuaXQgdGVzdHMgYW5kIGNyb3NzIGxhbmd1YWdlIHRlc3QgY2FzZXMgdG8gdmVyaWZ5IHRoZSBwYXRjaAorCisxLiBDb21taXQgdGhlIHBhdGNoCisKKyAgICAgICAgZ2l0IC0tY29uZmlnIHVzZXIubmFtZSAiWW91ciBOYW1lIgorICAgICAgICBnaXQgLS1jb25maWcgdXNlci5lbWFpbCAiWW91ckFwYWNoZUlEQGFwYWNoZS5vcmciCisgICAgICAgIGdpdCBhZGQgLUEKKyAgICAgICAgZ2l0IGNvbW1pdAorCisxLiBUaGUgY29tbWl0IG1lc3NhZ2Ugc2hvdWxkIGJlIGluIHRoZSBmb3JtYXQ6CisKKyAgICAgICBUSFJJRlQtIyMjOjxKaXJhIGRlc2NyaXB0aW9uPgorICAgICAgIENsaWVudDogPGNvbXBvbmVudD4KKyAgICAgICBQYXRjaDogPE5hbWUgb2YgcGVyc29uIGNvbnRyaWJ1dGluZyB0aGUgcGF0Y2g+CisKKyAgICAgICBEZXNjcmlwdGlvbiBvZiB3aGF0IHdhcyBmaXhlZCBvciBhZGRyZXNzZWQuCisKKyAgICAgICA8JQorICAgICAgICAgICBpZiB0aGlzIGlzIGEgZ2l0aHViIHB1bGwgcmVxdWVzdCB0aGVuIGFkZCBiZWxvdyBjb21tZW50CisgICAgICAgICAgICB0byBhdXRvbWF0aWNhbHkgY2xvc2UgR2l0SHViIHJlcXVlc3QuCisgICAgICAgJT4KKyAgICAgICBUaGlzIGNsb3NlcyAjWFgKKworCisxLiBEb3VibGUgY2hlY2sgdGhlIHBhdGNoIGNvbW1pdHRlZCBhbmQgdGhhdCBub3RoaW5nIHdhcyBtaXNzZWQgdGhlbiBwdXNoIHRoZSBwYXRjaAorCisgICAgICAgZ2l0IHN0YXR1cworICAgICAgIGdpdCBzaG93IEhFQUQKKyAgICAgICBnaXQgcHVzaCBvcmlnaW4gbWFzdGVyCisKKworMS4gUmVzb2x2ZSB0aGUgamlyYSBpc3N1ZSBhbmQgc2V0IHRoZSBmb2xsb3dpbmcgZm9yIHRoZSBjaGFuZ2Vsb2cKKworICAqIENvbXBvbmVudCB0aGUgcGF0Y2ggaXMgZm9yCisgICogZml4VmVyc2lvbiB0byB0aGUgY3VycmVudCB2ZXJzaW9uIG9uIG1hc3RlcgpkaWZmIC0tZ2l0IGEvZG9jL2ltYWdlcy9jZ3JuLnBuZyBiL2RvYy9pbWFnZXMvY2dybi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMwOTY0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbWFnZXMvY2dybi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2ltYWdlcy9jcmVkLnBuZyBiL2RvYy9pbWFnZXMvY3JlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg2YTVmYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbWFnZXMvY3JlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2ltYWdlcy9jcmVkZnVsbC5wbmcgYi9kb2MvaW1hZ2VzL2NyZWRmdWxsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjY2NDA0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2ltYWdlcy9jcmVkZnVsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2ltYWdlcy9jeWVsLnBuZyBiL2RvYy9pbWFnZXMvY3llbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MxZGZjNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbWFnZXMvY3llbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2ltYWdlcy90aHJpZnQtbGF5ZXJzLnBuZyBiL2RvYy9pbWFnZXMvdGhyaWZ0LWxheWVycy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFhY2NmNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbWFnZXMvdGhyaWZ0LWxheWVycy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2luc3RhbGwvUkVBRE1FLm1kIGIvZG9jL2luc3RhbGwvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMjMxY2QKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW5zdGFsbC9SRUFETUUubWQKQEAgLTAsMCArMSw0MyBAQAorCisjIyBCYXNpYyByZXF1aXJlbWVudHMKKyogQSByZWxhdGl2ZWx5IFBPU0lYLWNvbXBsaWFudCAqTklYIHN5c3RlbQorICAgICogQ3lnd2luIG9yIE1pbkdXIGNhbiBiZSB1c2VkIG9uIFdpbmRvd3MgKGJ1dCB0aGVyZSBhcmUgYmV0dGVyIG9wdGlvbnMsIHNlZSBiZWxvdykKKyogZysrIDQuMgorKiBib29zdCAxLjUzLjAKKyogUnVudGltZSBsaWJyYXJpZXMgZm9yIGxleCBhbmQgeWFjYyBtaWdodCBiZSBuZWVkZWQgZm9yIHRoZSBjb21waWxlci4KKworIyMgUmVxdWlyZW1lbnRzIGZvciBidWlsZGluZyBmcm9tIHNvdXJjZQorKiBHTlUgYnVpbGQgdG9vbHM6IAorICAgICogYXV0b2NvbmYgMi42NQorICAgICogYXV0b21ha2UgMS4xMworICAgICogbGlidG9vbCAxLjUuMjQKKyogcGtnLWNvbmZpZyBhdXRvY29uZiBtYWNyb3MgKHBrZy5tNCkKKyogbGV4IGFuZCB5YWNjIChkZXZlbG9wZWQgcHJpbWFyaWx5IHdpdGggZmxleCBhbmQgYmlzb24pCisqIGxpYnNzbC1kZXYKKworIyMgUmVxdWlyZW1lbnRzIGZvciBidWlsZGluZyB0aGUgY29tcGlsZXIgZnJvbSBzb3VyY2Ugb24gV2luZG93cworKiBWaXN1YWwgU3R1ZGlvIEMrKworKiBGbGV4IGFuZCBCaXNvbiAoZS5nLiB0aGUgV2luRmxleEJpc29uIHBhY2thZ2UpCisKKyMjIExhbmd1YWdlIHJlcXVpcmVtZW50cworVGhlc2UgYXJlIG9ubHkgcmVxdWlyZWQgaWYgeW91IGNob29zZSB0byBidWlsZCB0aGUgbGlicmFyaWVzIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UKKworKiBDKysKKyAgICAqIEJvb3N0IDEuNTMuMAorICAgICogbGliZXZlbnQgKG9wdGlvbmFsLCB0byBidWlsZCB0aGUgbm9uYmxvY2tpbmcgc2VydmVyKQorICAgICogemxpYiAob3B0aW9uYWwpCisqIEphdmEKKyAgICAqIEphdmEgMS44CisgICAgKiBBcGFjaGUgQW50CisqIEMjOiBNb25vIDEuMi40IChhbmQgcGtnLWNvbmZpZyB0byBkZXRlY3QgaXQpIG9yIFZpc3VhbCBTdHVkaW8gMjAwNSsKKyogUHl0aG9uIDIuNiAoaW5jbHVkaW5nIGhlYWRlciBmaWxlcyBmb3IgZXh0ZW5zaW9uIG1vZHVsZXMpCisqIFBIUCA1LjAgKG9wdGlvbmFsbHkgaW5jbHVkaW5nIGhlYWRlciBmaWxlcyBmb3IgZXh0ZW5zaW9uIG1vZHVsZXMpCisqIFJ1YnkgMS44CisgICAgKiBidW5kbGVyIGdlbQorKiBFcmxhbmcgUjEyIChSMTEgd29ya3MgYnV0IG5vdCByZWNvbW1lbmRlZCkKKyogUGVybCA1CisgICAgKiBCaXQ6OlZlY3RvcgorICAgICogQ2xhc3M6OkFjY2Vzc29yCisqIEhheGUgMy4xLjMKKyogR28gMS40CisqIERlbHBoaSAyMDEwCmRpZmYgLS1naXQgYS9kb2MvaW5zdGFsbC9jZW50b3MubWQgYi9kb2MvaW5zdGFsbC9jZW50b3MubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5MzJjMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbnN0YWxsL2NlbnRvcy5tZApAQCAtMCwwICsxLDc1IEBACisjIEJ1aWxkaW5nIEFwYWNoZSBUaHJpZnQgb24gQ2VudE9TIDYuNQorCitTdGFydGluZyB3aXRoIGEgbWluaW1hbCBpbnN0YWxsYXRpb24sIHRoZSBmb2xsb3dpbmcgc3RlcHMgYXJlIHJlcXVpcmVkIHRvIGJ1aWxkIEFwYWNoZSBUaHJpZnQgb24gQ2VudG9zIDYuNS4gVGhpcyBleGFtcGxlIGJ1aWxkcyBmcm9tIHNvdXJjZSwgdXNpbmcgdGhlIGN1cnJlbnQgZGV2ZWxvcG1lbnQgbWFzdGVyIGJyYW5jaC4gVGhlc2UgaW5zdHJ1Y3Rpb25zIHNob3VsZCBhbHNvIHdvcmsgd2l0aCBBcGFjaGUgVGhyaWZ0IHJlbGVhc2VzIGJlZ2lubmluZyB3aXRoIDAuOS4yLgorCisjIyBVcGRhdGUgdGhlIFN5c3RlbQorCisJc3VkbyB5dW0gLXkgdXBkYXRlCisKKyMjIEluc3RhbGwgdGhlIFBsYXRmb3JtIERldmVsb3BtZW50IFRvb2xzCisKKwlzdWRvIHl1bSAteSBncm91cGluc3RhbGwgIkRldmVsb3BtZW50IFRvb2xzIgorCisjIyBVcGdyYWRlIGF1dG9jb25mL2F1dG9tYWtlL2Jpc29uCisKKwlzdWRvIHl1bSBpbnN0YWxsIC15IHdnZXQKKworIyMjIFVwZ3JhZGUgYXV0b2NvbmYKKworCXdnZXQgaHR0cDovL2Z0cC5nbnUub3JnL2dudS9hdXRvY29uZi9hdXRvY29uZi0yLjY5LnRhci5negorCXRhciB4dmYgYXV0b2NvbmYtMi42OS50YXIuZ3oKKwljZCBhdXRvY29uZi0yLjY5CisJLi9jb25maWd1cmUgLS1wcmVmaXg9L3VzcgorCW1ha2UKKwlzdWRvIG1ha2UgaW5zdGFsbAorCWNkIC4uCisKKyMjIyBVcGdyYWRlIGF1dG9tYWtlCisKKwl3Z2V0IGh0dHA6Ly9mdHAuZ251Lm9yZy9nbnUvYXV0b21ha2UvYXV0b21ha2UtMS4xNC50YXIuZ3oKKwl0YXIgeHZmIGF1dG9tYWtlLTEuMTQudGFyLmd6CisJY2QgYXV0b21ha2UtMS4xNAorCS4vY29uZmlndXJlIC0tcHJlZml4PS91c3IKKwltYWtlCisJc3VkbyBtYWtlIGluc3RhbGwKKwljZCAuLgorCisjIyMgVXBncmFkZSBiaXNvbgorCisJd2dldCBodHRwOi8vZnRwLmdudS5vcmcvZ251L2Jpc29uL2Jpc29uLTIuNS4xLnRhci5negorCXRhciB4dmYgYmlzb24tMi41LjEudGFyLmd6CisJY2QgYmlzb24tMi41LjEKKwkuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyCisJbWFrZQorCXN1ZG8gbWFrZSBpbnN0YWxsCisJY2QgLi4KKworIyMgQWRkIE9wdGlvbmFsIEMrKyBMYW5ndWFnZSBMaWJyYXJ5IERlcGVuZGVuY2llcworCitBbGwgbGFuZ3VhZ2VzIHJlcXVpcmUgdGhlIEFwYWNoZSBUaHJpZnQgSURMIENvbXBpbGVyIGFuZCBhdCB0aGlzIHBvaW50IGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIG1ha2UgdGhlIElETCBDb21waWxlciBpcyBpbnN0YWxsZWQgKGlmIHlvdSBvbmx5IG5lZWQgdGhlIGNvbXBpbGVyIHlvdSBjYW4gc2tpcCB0byB0aGUgQnVpbGQgc3RlcCkuIAorCitJZiB5b3Ugd2lsbCBiZSBkZXZlbG9waW5nIEFwYWNoZSBUaHJpZnQgY2xpZW50cy9zZXJ2ZXJzIGluIEMrKyB5b3Ugd2lsbCBhbHNvIG5lZWQgYWRkaXRpb25hbCBwYWNrYWdlcyB0byBzdXBwb3J0IHRoZSBDKysgc2hhcmVkIGxpYnJhcnkgYnVpbGQuCisKKyMjIyBJbnN0YWxsIEMrKyBMaWIgRGVwZW5kZW5jaWVzCisKKwlzdWRvIHl1bSAteSBpbnN0YWxsIGxpYmV2ZW50LWRldmVsIHpsaWItZGV2ZWwgb3BlbnNzbC1kZXZlbAorCisjIyMgVXBncmFkZSBCb29zdCA+PSAxLjUzCisKKwl3Z2V0IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvYm9vc3QvZmlsZXMvYm9vc3QvMS41My4wL2Jvb3N0XzFfNTNfMC50YXIuZ3oKKwl0YXIgeHZmIGJvb3N0XzFfNTNfMC50YXIuZ3oKKwljZCBib29zdF8xXzUzXzAKKwkuL2Jvb3RzdHJhcC5zaAorCXN1ZG8gLi9iMiBpbnN0YWxsCisKKyMjIEJ1aWxkIGFuZCBJbnN0YWxsIHRoZSBBcGFjaGUgVGhyaWZ0IElETCBDb21waWxlcgorCisJZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdAorCWNkIHRocmlmdAorCS4vYm9vdHN0cmFwLnNoCisJLi9jb25maWd1cmUgLS13aXRoLWx1YT1ubworCW1ha2UKKwlzdWRvIG1ha2UgaW5zdGFsbAorCitUaGlzIHdpbGwgYnVpbGQgdGhlIGNvbXBpbGVyICh0aHJpZnQvY29tcGlsZXIvY3BwL3RocmlmdCAtLXZlcnNpb24pIGFuZCBhbnkgbGFuZ3VhZ2UgbGlicmFyaWVzIHN1cHBvcnRlZC4gVGhlIG1ha2UgaW5zdGFsbCBzdGVwIGluc3RhbGxzIHRoZSBjb21waWxlciBvbiB0aGUgcGF0aDogL3Vzci9sb2NhbC9iaW4vdGhyaWZ0CitZb3UgY2FuIHVzZSB0aGUgLi9jb25maWd1cmUgLS1lbmFibGUtbGlicz1ubyBzd2l0Y2ggdG8gYnVpbGQgdGhlIEFwYWNoZSBUaHJpZnQgSURMIENvbXBpbGVyIG9ubHkgd2l0aG91dCBsaWIgYnVpbGRzLiBUbyBydW4gdGVzdHMgdXNlICJtYWtlIGNoZWNrIi4KZGlmZiAtLWdpdCBhL2RvYy9pbnN0YWxsL2RlYmlhbi5tZCBiL2RvYy9pbnN0YWxsL2RlYmlhbi5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGY2OTZlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2luc3RhbGwvZGViaWFuLm1kCkBAIC0wLDAgKzEsNjIgQEAKKyMjIERlYmlhbi9VYnVudHUgaW5zdGFsbAorVGhlIGZvbGxvd2luZyBjb21tYW5kIHdpbGwgaW5zdGFsbCB0b29scyBhbmQgbGlicmFyaWVzIHJlcXVpcmVkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBBcGFjaGUgVGhyaWZ0IGNvbXBpbGVyIGFuZCBDKysgbGlicmFyaWVzIG9uIGEgRGViaWFuL1VidW50dSBMaW51eCBiYXNlZCBzeXN0ZW0uCisKKwlzdWRvIGFwdC1nZXQgaW5zdGFsbCBhdXRvbWFrZSBiaXNvbiBmbGV4IGcrKyBnaXQgbGliYm9vc3QtYWxsLWRldiBsaWJldmVudC1kZXYgbGlic3NsLWRldiBsaWJ0b29sIG1ha2UgcGtnLWNvbmZpZworCitEZWJpYW4gNy9VYnVudHUgMTIgdXNlcnMgbmVlZCB0byBtYW51YWxseSBpbnN0YWxsIGEgbW9yZSByZWNlbnQgdmVyc2lvbiBvZiBhdXRvbWFrZSBhbmQgKGZvciBDKysgbGlicmFyeSBhbmQgdGVzdCBzdXBwb3J0KSBib29zdDoKKworICAgIHdnZXQgaHR0cDovL2Z0cC5kZWJpYW4ub3JnL2RlYmlhbi9wb29sL21haW4vYS9hdXRvbWFrZS0xLjE1L2F1dG9tYWtlXzEuMTUtM19hbGwuZGViCisgICAgc3VkbyBkcGtnIC1pIGF1dG9tYWtlXzEuMTUtM19hbGwuZGViCisKKyAgICB3Z2V0IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvYm9vc3QvZmlsZXMvYm9vc3QvMS42MC4wL2Jvb3N0XzFfNjBfMC50YXIuZ3ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyIHh2ZiBib29zdF8xXzYwXzAudGFyLmd6CisgICAgY2QgYm9vc3RfMV82MF8wCisgICAgLi9ib290c3RyYXAuc2gKKyAgICBzdWRvIC4vYjIgaW5zdGFsbAorCisjIyBPcHRpb25hbCBwYWNrYWdlcworCitJZiB5b3Ugd291bGQgbGlrZSB0byBidWlsZCBBcGFjaGUgVGhyaWZ0IGxpYnJhcmllcyBmb3Igb3RoZXIgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIHlvdSBtYXkgbmVlZCB0byBpbnN0YWxsIGFkZGl0aW9uYWwgcGFja2FnZXMuIFRoZSBmb2xsb3dpbmcgbGFuZ3VhZ2VzIHJlcXVpcmUgdGhlIHNwZWNpZmllZCBhZGRpdGlvbmFsIHBhY2thZ2VzOgorCisgKiBKYXZhCisJKiBwYWNrYWdlczogYW50ICAKKwkqIFlvdSB3aWxsIGFsc28gbmVlZCBKYXZhIEpESyB2MS44IG9yIGhpZ2hlci4gVHlwZSAqKmphdmFjKiogdG8gc2VlIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFja2FnZXMsIHBpY2sgdGhlIG9uZSB5b3UgcHJlZmVyIGFuZCAqKmFwdC1nZXQgaW5zdGFsbCoqIGl0IChlLmcuIGRlZmF1bHQtamRrKS4KKyAqIFJ1YnkKKwkqIHJ1YnktZnVsbCBydWJ5LWRldiBydWJ5LXJzcGVjIHJha2UgcnVieWdlbXMgYnVuZGxlcgorICogUHl0aG9uCisJKiBweXRob24tYWxsIHB5dGhvbi1hbGwtZGV2IHB5dGhvbi1hbGwtZGJnCisgKiBQZXJsCisJKiBsaWJiaXQtdmVjdG9yLXBlcmwgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybAorICogUGhwLCBpbnN0YWxsCisJKiBwaHA1LWRldiBwaHA1LWNsaSBwaHB1bml0CisgKiBDX2dsaWIKKwkqIGxpYmdsaWIyLjAtZGV2CisgKiBFcmxhbmcKKwkqIGVybGFuZy1iYXNlIGVybGFuZy1ldW5pdCBlcmxhbmctZGV2IHJlYmFyCisgKiBDc2hhcnAKKwkqIG1vbm8tZ21jcyBtb25vLWRldmVsIGxpYm1vbm8tc3lzdGVtLXdlYjIuMC1jaWwgbnVuaXQgbnVuaXQtY29uc29sZQorICogSGFza2VsbAorCSogZ2hjIGNhYmFsLWluc3RhbGwgbGliZ2hjLWJpbmFyeS1kZXYgbGliZ2hjLW5ldHdvcmstZGV2IGxpYmdoYy1odHRwLWRldgorICogVGhyaWZ0IENvbXBpbGVyIGZvciBXaW5kb3dzCisJKiBtaW5ndy13NjQgbWluZ3ctdzY0LXg4Ni02NC1kZXYgbnNpcworICogUnVzdAorCSogcnVzdGMgY2FyZ28KKyAqIEhheGUKKwkqIGhheGUKKyAqIEx1YQorICAgICogbHVhNS4zIGxpYmx1YTUuMy1kZXYKKyAqIE5vZGVKcworICAgICogbm9kZWpzIG5wbQorICogZG90bmV0Y29yZQorICAgICogaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS9uZXQvbGVhcm4vZ2V0LXN0YXJ0ZWQvbGludXh1YnVudHUKKyAqIGQtbGFuZworICAgICogY3VybCAtZnNTIGh0dHBzOi8vZGxhbmcub3JnL2luc3RhbGwuc2ggfCBiYXNoIC1zIGRtZAorICogZGFydCAmIHB1YgorICAgICogaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2luc3RhbGwvbGludXgKKyAgICAqIGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy90b29scy9wdWIvaW5zdGFsbGluZworCQorCisjIyBBZGRpdGlvbmFsIHJlYWRpbmcKKworRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHJlcXVpcmVtZW50cyBzZWU6IFtBcGFjaGUgVGhyaWZ0IFJlcXVpcmVtZW50c10oL2RvY3MvaW5zdGFsbCkKKworRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gYnVpbGRpbmcgYW5kIGluc3RhbGxpbmcgVGhyaWZ0IHNlZTogW0J1aWxkaW5nIGZyb20gc291cmNlXSgvZG9jcy9CdWlsZGluZ0Zyb21Tb3VyY2UpCmRpZmYgLS1naXQgYS9kb2MvaW5zdGFsbC9vc194Lm1kIGIvZG9jL2luc3RhbGwvb3NfeC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDk5ZWY0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2luc3RhbGwvb3NfeC5tZApAQCAtMCwwICsxLDI3IEBACisjIyBPUyBYIFNldHVwCitUaGUgZm9sbG93aW5nIGNvbW1hbmQgaW5zdGFsbCBhbGwgdGhlIHJlcXVpcmVkIHRvb2xzIGFuZCBsaWJyYXJpZXMgdG8gYnVpbGQgYW5kIGluc3RhbGwgdGhlIEFwYWNoZSBUaHJpZnQgY29tcGlsZXIgb24gYSBPUyBYIGJhc2VkIHN5c3RlbS4gCisKKyMjIyBJbnN0YWxsIEJvb3N0CitEb3dubG9hZCB0aGUgYm9vc3QgbGlicmFyeSBmcm9tIFtib29zdC5vcmddKGh0dHA6Ly93d3cuYm9vc3Qub3JnKSB1bnRhciBjb21waWxlIHdpdGgKKworCS4vYm9vdHN0cmFwLnNoCisJc3VkbyAuL2IyIHRocmVhZGluZz1tdWx0aSBhZGRyZXNzLW1vZGVsPTY0IHZhcmlhbnQ9cmVsZWFzZSBzdGFnZSBpbnN0YWxsCisKKyMjIyBJbnN0YWxsIGxpYmV2ZW50CitEb3dubG9hZCBbbGliZXZlbnRdKGh0dHA6Ly9tb25rZXkub3JnL35wcm92b3MvbGliZXZlbnQpLCB1bnRhciBhbmQgY29tcGlsZSB3aXRoCisKKwkuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyL2xvY2FsIAorCW1ha2UKKwlzdWRvIG1ha2UgaW5zdGFsbAorCisjIyMgQnVpbGRpbmcgQXBhY2hlIFRocmlmdAorRG93bmxvYWQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFtBcGFjaGUgVGhyaWZ0XSgvZG93bmxvYWQpLCB1bnRhciBhbmQgY29tcGlsZSB3aXRoCisKKwkuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyL2xvY2FsLyAtLXdpdGgtYm9vc3Q9L3Vzci9sb2NhbCAtLXdpdGgtbGliZXZlbnQ9L3Vzci9sb2NhbAorCisjIyBBZGRpdGlvbmFsIHJlYWRpbmcKKworRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHJlcXVpcmVtZW50cyBzZWU6IFtBcGFjaGUgVGhyaWZ0IFJlcXVpcmVtZW50c10oL2RvY3MvaW5zdGFsbCkKKworRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gYnVpbGRpbmcgYW5kIGluc3RhbGxpbmcgVGhyaWZ0IHNlZTogW0J1aWxkaW5nIGZyb20gc291cmNlXSgvZG9jcy9CdWlsZGluZ0Zyb21Tb3VyY2UpCisKZGlmZiAtLWdpdCBhL2RvYy9pbnN0YWxsL3dpbmRvd3MubWQgYi9kb2MvaW5zdGFsbC93aW5kb3dzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MTg5MzQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW5zdGFsbC93aW5kb3dzLm1kCkBAIC0wLDAgKzEsMTg2IEBACisjIyBXaW5kb3dzIFNldHVwCisKK1RoZSBUaHJpZnQgZW52aXJvbm1lbnQgY29uc2lzdHMgb2YgdHdvIG1haW4gcGFydHM6IFRoZSBUaHJpZnQgY29tcGlsZXIgRVhFIGFuZCB0aGUgbGFuZ3VhZ2UtZGVwZW5kZW50IGxpYnJhcmllcy4gTW9zdCBvZiB0aGVzZSBsaWJyYXJpZXMgd2lsbCByZXF1aXJlIHNvbWUga2luZCBvZiBidWlsZCBhbmQvb3IgaW5zdGFsbGF0aW9uLiBCdXQgcmVnYXJkaW5nIHRoZSBUaHJpZnQgY29tcGlsZXIgdXRpbGl0eSB0aGVyZSBhcmUgYSBudW1iZXIgb2YgZGlmZmVyZW50IGFsdGVybmF0aXZlcy4gCisKK1RoZSBmaXJzdCBvbmUgb2YgdGhlc2UgYWx0ZXJuYXRpdmVzIGlzIHRvIGRvd25sb2FkIHRoZSAqKnByZS1idWlsdCBUaHJpZnQgQ29tcGlsZXIgRVhFKiogYW5kIG9ubHkgYnVpbGQgdGhlIGxpYnJhcmllcyBuZWVkZWQgZnJvbSBzb3VyY2UsIGZvbGxvd2luZyBvbmUgb2YgdGhlICJTZXR1cCBmcm9tIHNvdXJjZSIgbWV0aG9kcyBvdXRsaW5lZCBiZWxvdy4KKworVGhlIG90aGVyIHR3byBvcHRpb25zIGFyZSB0byBidWlsZCB0aGUgVGhyaWZ0IGNvbXBpbGVyIGZyb20gc291cmNlLiBUaGUgbW9zdCByZWNvbW1lbmRlZCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIGJ5IG1lYW5zIG9mIHRoZSAqKlZpc3VhbCBTdHVkaW8gQysrIGJ1aWxkIHByb2plY3QqKi4gQWx0ZXJuYXRpdmVseSwgdGhlIFRocmlmdCBjb21waWxlciBjYW4gYWxzbyBiZSBidWlsdCB2aWEgKipDeWd3aW4qKiBvciAqKk1pbkdXKiogYnVpbGQgZW52aXJvbm1lbnRzLCBob3dldmVyIHRoaXMgbWV0aG9kIGlzIG5vdCBvbmx5IGxlc3MgY29tZm9ydGFibGUsIGJ1dCBtb3JlIHRpbWUtY29uc3VtaW5nIGFuZCByZXF1aXJlcyBtdWNoIG1vcmUgbWFudWFsIGVmZm9ydC4gCisKKworIyMgUHJlYnVpbHQgVGhyaWZ0IGNvbXBpbGVyCisKK1RoZSB3aW5kb3dzIFRocmlmdCBjb21waWxlciBpcyBhdmFpbGFibGUgYXMgYSBwcmVidWlsdCBleGUgYXZhaWxhYmxlIFtoZXJlXSgvZG93bmxvYWQpLiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gaW5zdGFsbGF0aW9uIHRvb2wsIHJhdGhlciB0aGlzIEVYRSBmaWxlICppcyogYWxyZWFkeSB0aGUgVGhyaWZ0IGNvbXBpbGVyIHV0aWxpdHkuIERvd25sb2FkIHRoZSBmaWxlIGFuZCBwdXQgaXQgaW50byBzb21lIHN1aXRhYmxlIGxvY2F0aW9uIG9mIHlvdXIgY2hvaWNlLgorCitOb3cgcGljayBvbmUgb2YgdGhlICJCdWlsZCBhbmQgaW5zdGFsbCB0YXJnZXQgbGlicmFyaWVzIiBiZWxvdyB0byBjb250aW51ZS4KKworIAorIyMgU2V0dXAgZnJvbSBzb3VyY2UgdmlhIFZpc3VhbCBTdHVkaW8gQysrIChyZWNvbW1lbmRlZCkKKworIyMjIFJlcXVpcmVtZW50cworCitUaHJpZnQncyBjb21waWxlciBpcyB3cml0dGVuIGluIEMrKyBhbmQgZGVzaWduZWQgdG8gYmUgcG9ydGFibGUsIGJ1dCB0aGVyZSBhcmUgc29tZSBzeXN0ZW0gcmVxdWlyZW1lbnRzLiBUaHJpZnQncyBydW50aW1lIGxpYnJhcmllcyBhcmUgd3JpdHRlbiBpbiB2YXJpb3VzIGxhbmd1YWdlcywgd2hpY2ggYXJlIGFsc28gcmVxdWlyZWQgZm9yIHRoZSBwYXJ0aWN1bGFyIGxhbmd1YWdlIGludGVyZmFjZS4KKworICogVmlzdWFsIFN0dWRpbyBDKyssIGFueSByZWNlbnQgdmVyc2lvbiBzaG91bGQgZG8KKyAqIEZsZXggYW5kIEJpc29uLCBlLmcuIHRoZSBXaW5GbGV4Qmlzb24gcGFja2FnZQorICogW0FwYWNoZSBUaHJpZnQgUmVxdWlyZW1lbnRzXSgvZG9jcy9pbnN0YWxsKQorCisjIyMgQnVpbGQgYW5kIGluc3RhbGwgdGhlIGNvbXBpbGVyCisgCitBZnRlciBhbGwgcmVxdWlyZW1lbnRzIGFyZSBpbiBwbGFjZSwgdXNlIHRoZSBgY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2pgIGJ1aWxkIHByb2plY3QgdG8gYnVpbGQgdGhlIFRocmlmdCBjb21waWxlci4gQ29weSB0aGUgcmVzdWx0aW5nIEVYRSBmaWxlIHRvIGEgbG9jYXRpb24gb2YgeW91ciBjaG9pY2UuIAorCisjIyMgQnVpbGQgYW5kIGluc3RhbGwgdGFyZ2V0IGxpYnJhcmllcworCitBIGZldyBvZiB0aGUgdGFyZ2V0IGxhbmd1YWdlIGxpYnJhcmllcyBhbHNvIGRvIHByb3ZpZGUgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGZpbGVzLCBzdWNoIGFzIEMrKyBhbmQgQyMuIFRoZXNlIGFyZSBsb2NhdGVkIGluIHRoZSBgbGliLzxsYW5ndWFnZT4vYCBmb2xkZXJzLiAKKworTW9zdCBvZiB0aGUgbGFuZ3VhZ2UgcGFja2FnZXMgbXVzdCBiZSBidWlsdCBhbmQgaW5zdGFsbGVkIG1hbnVhbGx5IHVzaW5nIGJ1aWxkIHRvb2xzIGJldHRlciBzdWl0ZWQgdG8gdGhvc2UgbGFuZ3VhZ2VzLiBUeXBpY2FsIGV4YW1wbGVzIGFyZSBKYXZhLCBSdWJ5LCBEZWxwaGksIG9yIFBIUC4gTG9vayBmb3IgdGhlIGBSRUFETUUubWRgIGZpbGUgaW4gdGhlIGBsaWIvPGxhbmd1YWdlPi9gIGZvbGRlciBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byBidWlsZCBhbmQgaW5zdGFsbCBlYWNoIGxhbmd1YWdlJ3MgbGlicmFyeSBwYWNrYWdlLgorIAorCisjIyBTZXR1cCBmcm9tIHNvdXJjZSB2aWEgQ3lnd2luCisKKyMjIyBSZXF1aXJlbWVudHMKKworVGhyaWZ0J3MgY29tcGlsZXIgaXMgd3JpdHRlbiBpbiBDKysgYW5kIGRlc2lnbmVkIHRvIGJlIHBvcnRhYmxlLCBidXQgdGhlcmUgYXJlIHNvbWUgc3lzdGVtIHJlcXVpcmVtZW50cy4gVGhyaWZ0J3MgcnVudGltZSBsaWJyYXJpZXMgYXJlIHdyaXR0ZW4gaW4gdmFyaW91cyBsYW5ndWFnZXMsIHdoaWNoIGFyZSBhbHNvIHJlcXVpcmVkIGZvciB0aGUgcGFydGljdWxhciBsYW5ndWFnZSBpbnRlcmZhY2UuCisKKyAqIEN5Z3dpbiBvciBNaW5HVyAKKyAqIFtBcGFjaGUgVGhyaWZ0IFJlcXVpcmVtZW50c10oL2RvY3MvaW5zdGFsbCkKKworIyMjIEluc3RhbGxpbmcgZnJvbSBzb3VyY2UKKworSWYgeW91IGFyZSBidWlsZGluZyBmcm9tIHRoZSBmaXJzdCB0aW1lIG91dCBvZiB0aGUgc291cmNlIHJlcG9zaXRvcnksIHlvdSB3aWxsIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHRzLiAgKFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBpZiB5b3UgZG93bmxvYWRlZCBhIHRhcmJhbGwuKSAgRnJvbSB0aGUgdG9wIGRpcmVjdG9yeSwgZG86CisKKwkuL2Jvb3RzdHJhcC5zaAorCitPbmNlIHRoZSBjb25maWd1cmUgc2NyaXB0cyBhcmUgZ2VuZXJhdGVkLCB0aHJpZnQgY2FuIGJlIGNvbmZpZ3VyZWQuIEZyb20gdGhlIHRvcCBkaXJlY3RvcnksIGRvOgorCisJZXhwb3J0IENYWEZMQUdTPSItRCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUD1QVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSIKKwkuL2NvbmZpZ3VyZQorCitTZXR0aW5nIHRoZSBDWFhGTEFHUyBlbnZpcm9ubWVudGFsIHZhcmlhYmxlIHdvcmtzIGFyb3VuZCBjb21waWxlIGVycm9ycyB3aXRoIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QIGJlaW5nIHVuZGVjbGFyZWQsIGJ5IHJlcGxhY2luZyBpdCB3aXRoIHRoZSBuZXdlciwgcG9ydGFibGUgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUuIChUZXN0ZWQgb24gY3lnd2luIDIwMTAwMzIwLCBUaHJpZnQgcjc2MDE4NCwgbGF0ZXN0IHB0aHJlYWQuKQorCisqKk9wdGlvbmFsOioqIFlvdSAqKm1heSBub3QqKiBiZSBhYmxlIHRvIG1ha2UgZnJvbSB0aGUgcm9vdCAgVGhyaWZ0IGRpcmVjdG9yeSBkdWUgdG8gZXJyb3JzIChzZWUgYmVsb3cgdG8gcmVzb2x2ZSkuIFRvIG1ha2UgdGhlIGNvbXBpbGVyIG9ubHksIGNoYW5nZSB0byB0aGUgY29tcGlsZXIgZGlyZWN0b3J5IGJlZm9yZSBydW5uaW5nIG1ha2U6CisKKwljZCBjb21waWxlci9jcHAKKworTm93IG1ha2UgdGhlIHRocmlmdCBjb21waWxlciAoJiBydW50aW1lIGxpYnJhcmllcyBpZiBtYWtlIGlzIHJ1biBmcm9tIHRoZSB0aHJpZnQgcm9vdCBkaXJlY3RvcnkpOgorCisJbWFrZQorCW1ha2UgaW5zdGFsbAorCisjIyMgQnVpbGQgYW5kIGluc3RhbGwgdGFyZ2V0IGxpYnJhcmllcworCitTb21lIGxhbmd1YWdlIHBhY2thZ2VzIG11c3QgYmUgaW5zdGFsbGVkIG1hbnVhbGx5IHVzaW5nIGJ1aWxkIHRvb2xzIGJldHRlciBzdWl0ZWQgdG8gdGhvc2UgbGFuZ3VhZ2VzLiBUeXBpY2FsIGV4YW1wbGVzIGFyZSBKYXZhLCBSdWJ5LCBvciBQSFAuIExvb2sgZm9yIHRoZSBSRUFETUUgZmlsZSBpbiB0aGUgYGxpYi88bGFuZ3VhZ2U+L2AgZm9sZGVyIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIGluc3RhbGxhdGlvbiBvZiBlYWNoIGxhbmd1YWdlIGxpYnJhcnkgcGFja2FnZS4KKworIyMjIFBvc3NpYmxlIGlzc3VlcyB3aXRoIEN5Z3dpbiBpbnN0YWxsCisKK1NlZSBhbHNvIFBvc3NpYmxlIGlzc3VlcyB3aXRoIE1pbkdXIGluc3RhbGwuCisKKyMjIyMgU3ludGF4IGVycm9yIGluIC4vY29uZmlndXJlCisKK1RoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJzIGZvciBzb21lIHVzZXJzIHdoZW4gcnVubmluZyAuL2NvbmZpZ3VyZToKKworCS4vY29uZmlndXJlOiBsaW5lIDIxMTgzOiBzeW50YXggZXJyb3IgbmVhciB1bmV4cGVjdGVkIHRva2VuIGBNT05PLCcKKwkuL2NvbmZpZ3VyZTogbGluZSAyMTE4MzogYCAgUEtHX0NIRUNLX01PRFVMRVMoTU9OTywgbW9ubyA+PSAxLjIuNiwgaGF2ZV9tb25vPXllcywgaGF2ZV9tb25vPW5vKScKKworVG8gcmVzb2x2ZSB0aGlzLCB5b3UnbGwgbmVlZCB0byBmaW5kIHlvdXIgcGtnLm00IChpbnN0YWxsZWQgYnkgdGhlIHBrZy1jb25maWcgcGFja2FnZSkgZmlsZSBhbmQgY29weSBpdCB0byB0aGUgdGhyaWZ0L2FjbG9jYWwgZGlyZWN0b3J5LiAgRnJvbSB0aGUgdG9wLWxldmVsIHRocmlmdCBkaXJlY3RvcnksIHlvdSBjYW4gY29weSB0aGUgZmlsZSBieSBydW5uaW5nCisKKwljcCAvdXNyL3NoYXJlL2FjbG9jYWwvcGtnLm00IGFjbG9jYWwKKworRmluYWxseSwgcmUtcnVuIC4vYm9vdHN0cmFwLnNoIGFuZCAuL2NvbmZpZ3VyZS4gIChOb3RlIHRoYXQgcGtnLm00IGlzIGNyZWF0ZWQgYnkgdGhlIHBrZy1jb25maWcgdG9vbC4gIElmIHlvdXIgL3Vzci9zaGFyZS9hY2xvY2FsIGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gdGhlIHBrZy5tNCBmaWxlLCB5b3UgbWF5IG5vdCBoYXZlIHBrZy1jb25maWcgaW5zdGFsbGVkLikKKworIyMjIyBJbnN0YWxsaW5nIHBlcmwgcnVudGltZSBsaWJyYXJpZXMKKworU29tZXRpbWVzLCB0aGVyZSB3aWxsIGJlIGFuIGVycm9yIGR1cmluZyB0aGUgaW5zdGFsbCBvZiB0aGUgcGVybCBsaWJyYXJpZXMgd2l0aCBjaG1vZC4KKworQSB3b3JrYXJvdW5kIGlzIHRvIGF2b2lkIGluc3RhbGxpbmcgdGhlIHBlcmwgbGlicmFyaWVzIGlmIHRoZXkgYXJlIG5vdCBuZWVkZWQuCisKK0lmIHlvdSBkb24ndCBuZWVkIHBlcmwsIHJ1biBjb25maWd1cmUgd2l0aCAtLXdpdGhvdXQtcGVybC4KKworSWYgeW91IG5lZWQgcGVybCwgYW5kIGFyZSBoYXBweSB0byBtYW51YWxseSBpbnN0YWxsIGl0LCByZXBsYWNlIHRoZSBjb250ZW50cyBvZiB0aHJpZnQvbGliL3BlcmwvTWFrZWZpbGUgd2l0aCB0aGUgZm9sbG93aW5nLCBhZnRlciBidWlsZGluZyB0aHJpZnQ6CisJCisJVE9ETworCisjIyMjIExpbmtpbmcgdG8gaW5zdGFsbGVkIEMrKyBydW50aW1lIGxpYnJhcmllcworCitTb21ldGltZXMsIHRoZSBpbnN0YWxsZWQgbGlidGhyaWZ0LmEgd2lsbCBub3QgbGluayB1c2luZyBnKyssIHdpdGggbGlua2VyIGVycm9ycyBhYm91dCBtaXNzaW5nIHZ0YWJsZXMgYW5kIGV4Y2VwdGlvbnMgZm9yIFRocmlmdCBjbGFzc2VzLgorCitBIHdvcmthcm91bmQgaXMgdG8gbGluayB0aGUgY29tcGlsZWQgb2JqZWN0IGZpbGVzIGRpcmVjdGx5IGZyb20geW91ciBUaHJpZnQgYnVpbGQsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1pc3NpbmcgY2xhc3Nlcy4KKworVGhpcyBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gYSBNYWtlZmlsZSB1c2luZyB0aGUgZm9sbG93aW5nIGxpbmVzOgorCisJVEhSSUZUX089PHBhdGggdG8+L3RocmlmdC9saWIvY3BwCisJTFRIUklGVD0kKFRIUklGVF9PKS9UaHJpZnQubyAkKFRIUklGVF9PKS9UU29ja2V0Lm8gJChUSFJJRlRfTykvVEJpbmFyeVByb3RvY29sLm8gJChUSFJJRlRfTykvVEJ1ZmZlclRyYW5zcG9ydHMubworCitUaGVuIGxpbmtpbmcgdXNpbmcgJChMVEhSSUZUKSBpbnN0ZWFkIG9mIC1sdGhyaWZ0LgorCisJVE9ETyAtIGRpYWdub3NlIGlzc3VlIGZ1cnRoZXIKKworIyMjIyBDKysgcnVudGltZSBzZWdmYXVsdCB3aXRoIGN5Z3dpbiAxLjcuNS0xLCBnKystNC4zLjQsIGZvcmsoKSBhbmQgdGhyb3cKKworSWYgeW91ciB0aHJpZnQgQysrIHByb2dyYW1zIHNlZ2ZhdWx0IG9uIHRocm93IGFmdGVyIGZvcmsoKWluZywgY29tcGlsZSB0aGVtIHdpdGggZysrLTMuCisKK1RoZSBpc3N1ZSBhbmQgcGF0Y2ggYXJlIGRlc2NyaWJlZCBvbiB0aGUgQ3lnd2luIG1haWxpbmcgbGlzdCBhdCBodHRwOi8vY3lnd2luLmNvbS9tbC9jeWd3aW4vMjAxMC0wNS9tc2cwMDIwMy5odG1sCisKK1RoaXMgaXNzdWUgc2hvdWxkIGJlIGZpeGVkIGluIEN5Z3dpbiB2ZXJzaW9ucyBhZnRlciAxLjcuNS0xLCBvciBnKysgNC41LjAuCisKKyMjIFNldHVwIGZyb20gc291cmNlIHZpYSBNaW5HVworCisjIyMgUmVxdWlyZW1lbnRzCisKK1RvIGNvbXBpbGUgdGhlIFRocmlmdCBnZW5lcmF0b3IgJiBydW50aW1lIGxpYnJhcmllcyAodW50ZXN0ZWQpIHdpdGhvdXQgdGhlIGN5Z3dpbi5kbGwgZGVwZW5kZW5jeSB5b3UgbmVlZCB0byBpbnN0YWxsIE1pbkdXICh3d3cubWluZ3cub3JnKS4gCisKKyAqIE1pbkdXIAorICogW0FwYWNoZSBUaHJpZnQgUmVxdWlyZW1lbnRzXSgvZG9jcy9pbnN0YWxsKQorCitJbiBhZGRpdGlvbiB5b3UgbmVlZCB0byBhZGQgdGhlIGZvbGxvd2luZyBlbnRyeSB0byB5b3VyIHdpbmRvd3MgUEFUSCB2YXJpYWJsZS4KKworCUM6XE1JTkdXXEJJTgorCQorTmV4dCwgb3BlbiBjb21waWxlci9jcHAvTWFrZWZpbGUuYW0gYW5kIGFkZCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gdGhyaWZ0X0NYWEZMQUdTCisKKwktRE1JTkdXIC1tbm8tY3lnd2luIC1sZmwKKwkKK1J1biBib290c3RyYXAuc2g6CisKKwkuL2Jvb3RzdHJhcC5zaAorCitNYWtlIHN1cmUgeW91IGhhdmUgamF2YSBpbiB5b3VyICRQQVRIIHZhcmlhYmxlLCBpZiBub3QgZG8oYWRqdXN0IHBhdGggaWYgbmVjZXNzYXJ5KToKKworCWV4cG9ydCBQQVRIPSRQQVRIOiIvY3lnZHJpdmUvYy9wcm9ncmFtIGZpbGVzL2phdmEvanJlMS44LjBfMTkxL2JpbiIKKworUnVuIGNvbmZpZ3VyZSAtIHVzaW5nIENYWEZMQUdTIHRvIHdvcmsgYXJvdW5kIGFuIGlzc3VlIHdpdGggYW4gb2xkIHB0aHJlYWRzIGRlZmluZSAodW50ZXN0ZWQgb24gTWluR1cgLSB3b3JrcyBvbiBDeWd3aW4pOgorCisJZXhwb3J0IENYWEZMQUdTPSItRCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUD1QVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSIKKwkuL2NvbmZpZ3VyZQorCisnJ09wdGlvbmFsOicnIFRvIG1ha2UgdGhlIGNvbXBpbGVyIG9ubHksIGNoYW5nZSB0byB0aGUgY29tcGlsZXIgIGRpcmVjdG9yeSBiZWZvcmUgcnVubmluZyBtYWtlOgorCisJY2QgY29tcGlsZXIvY3BwCisJCitSdW4gbWFrZToKKworCW1pbmd3MzItbWFrZS5leGUKKworIyMjIFBvc3NpYmxlIGlzc3VlcyB3aXRoIE1pbkdXIGluc3RhbGwKKworU2VlIGFsc28gUG9zc2libGUgaXNzdWVzIHdpdGggQ3lnd2luIGluc3RhbGwsIGluY2x1ZGluZyB0aGUgZGlzY3Vzc2lvbiBhYm91dCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUC4KKworIyMjIyB5eXdyYXAgaXMgbm90IGZvdW5kCisKK01ha2Ugc3VyZSB5b3UgYWRkIC1sZmwgaW4geW91ciBjeHhmbGFncyBpbiBNYWtlZmlsZSwgYWxzbyB0cnkgYWRkaW5nIC1MYzovY3lnd2luL2xpYnMKKworIyMjIyBib29zdCBpcyBub3QgZm91bmQKKworVHJ5IGFuZCBjaGFuZ2UgdGhlIGluY2x1ZGUgZGlyIHRvIHVzZSB0aGUgd2luZG93cyBwYXRoIGZyb20gYyBsaWtlIHRoaXM6IEVkaXQgY29tcGlsZXIvY3BwL01ha2VmaWxlLCBsb29rIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgQk9PU1RfQ1BQRkxBR1MsIGNoYW5nZSB0aGF0IGxpbmUgZm9yCisKKwlCT09TVF9DUFBGTEFHUyA9IC1JYzovY3lnd2luL3Vzci9pbmNsdWRlL2Jvb3N0LTFfNTNfMAorCQorIyMjIyByZWFscGF0aCBpcyBub3QgZm91bmQKKworYWRkIC1ETUlOR1cgLW1uby1jeWd3aW4gdG8gdGhlIENYWERFRlMgdmFyaWFibGUgaW4gTWFrZWZpbGUKKworIyMgQWRkaXRpb25hbCByZWFkaW5nCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSByZXF1aXJlbWVudHMgc2VlOiBbQXBhY2hlIFRocmlmdCBSZXF1aXJlbWVudHNdKC9kb2NzL2luc3RhbGwpCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGJ1aWxkaW5nIGFuZCBpbnN0YWxsaW5nIFRocmlmdCBzZWU6IFtCdWlsZGluZyBmcm9tIHNvdXJjZV0oL2RvY3MvQnVpbGRpbmdGcm9tU291cmNlKQorCmRpZmYgLS1naXQgYS9kb2MvbGdwbC0yLjEudHh0IGIvZG9jL2xpY2Vuc2VzL2xncGwtMi4xLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL2xncGwtMi4xLnR4dApyZW5hbWUgdG8gZG9jL2xpY2Vuc2VzL2xncGwtMi4xLnR4dApkaWZmIC0tZ2l0IGEvZG9jL290cC1iYXNlLWxpY2Vuc2UudHh0IGIvZG9jL2xpY2Vuc2VzL290cC1iYXNlLWxpY2Vuc2UudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2Mvb3RwLWJhc2UtbGljZW5zZS50eHQKcmVuYW1lIHRvIGRvYy9saWNlbnNlcy9vdHAtYmFzZS1saWNlbnNlLnR4dApkaWZmIC0tZ2l0IGEvZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgYi9kb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEwMWE3ZC4uMDAwMDAwMAotLS0gYS9kb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLVRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlCi1Db3B5cmlnaHQgKGMpIDIwMDYtIEZhY2Vib29rLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9yIG9yZ2FuaXphdGlvbgotb2J0YWluaW5nIGEgY29weSBvZiB0aGUgc29mdHdhcmUgYW5kIGFjY29tcGFueWluZyBkb2N1bWVudGF0aW9uIGNvdmVyZWQgYnkKLXRoaXMgbGljZW5zZSAodGhlICJTb2Z0d2FyZSIpIHRvIHVzZSwgcmVwcm9kdWNlLCBkaXNwbGF5LCBkaXN0cmlidXRlLAotZXhlY3V0ZSwgYW5kIHRyYW5zbWl0IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUKLVNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHRoaXJkLXBhcnRpZXMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvCi1kbyBzbywgYWxsIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZzoKLQotVGhlIGNvcHlyaWdodCBub3RpY2VzIGluIHRoZSBTb2Z0d2FyZSBhbmQgdGhpcyBlbnRpcmUgc3RhdGVtZW50LCBpbmNsdWRpbmcKLXRoZSBhYm92ZSBsaWNlbnNlIGdyYW50LCB0aGlzIHJlc3RyaWN0aW9uIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi1tdXN0IGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBpbiB3aG9sZSBvciBpbiBwYXJ0LCBhbmQKLWFsbCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTb2Z0d2FyZSwgdW5sZXNzIHN1Y2ggY29waWVzIG9yIGRlcml2YXRpdmUKLXdvcmtzIGFyZSBzb2xlbHkgaW4gdGhlIGZvcm0gb2YgbWFjaGluZS1leGVjdXRhYmxlIG9iamVjdCBjb2RlIGdlbmVyYXRlZCBieQotYSBzb3VyY2UgbGFuZ3VhZ2UgcHJvY2Vzc29yLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UCi1TSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQU5ZT05FIERJU1RSSUJVVElORyBUSEUgU09GVFdBUkUgQkUgTElBQkxFCi1GT1IgQU5ZIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKLUFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgotREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgpkaWZmIC0tZ2l0IGEvZG9jL3NwZWNzL0hlYWRlckZvcm1hdC5tZCBiL2RvYy9zcGVjcy9IZWFkZXJGb3JtYXQubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJlYzdhZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zcGVjcy9IZWFkZXJGb3JtYXQubWQKQEAgLTAsMCArMSw4MiBAQAorPGxpbmsgaHJlZj0iaHR0cDovL2tldmluYnVya2UuYml0YnVja2V0Lm9yZy9tYXJrZG93bmNzcy9tYXJrZG93bi5jc3MiIHJlbD0ic3R5bGVzaGVldCI+PC9saW5rPgorCitIZWFkZXIgZm9ybWF0IGZvciB0aGUgVEhlYWRlci5oCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZgorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgMHwgICAgICAgICAgICAgICAgICAgICAgICAgIExFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgMHwgICAgICAgSEVBREVSIE1BR0lDICAgICAgICAgIHwgICAgICAgICAgICBGTEFHUyAgICAgICAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgU0VRVUVOQ0UgTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgMHwgICAgIEhlYWRlciBTaXplKC8zMikgICAgICAgIHwgLi4uCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyIGlzIG9mIHZhcmlhYmxlIHNpemU6CisgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc3RhcnRzIGF0IG9mZnNldCAxNCkKKworICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgICAgICAgICBQUk9UT0NPTCBJRCAgKHZhcmludCkgIHwgICBOVU0gVFJBTlNGT1JNUyAodmFyaW50KSAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgICAgICBUUkFOU0ZPUk0gMCBJRCAodmFyaW50KSAgIHwgICAgICAgIFRSQU5TRk9STSAwIERBVEEgLi4uCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgSU5GTyAwIElEICh2YXJpbnQpICAgICAgfCAgICAgICBJTkZPIDAgIERBVEEgLi4uCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBWUxPQUQgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKK1RoZSBgTEVOR1RIYCBmaWVsZCBpcyAzMiBiaXRzLCBhbmQgY291bnRzIHRoZSByZW1haW5pbmcgYnl0ZXMgaW4gdGhlCitwYWNrZXQsIE5PVCBpbmNsdWRpbmcgdGhlIGxlbmd0aCBmaWVsZC4gIFRoZSBoZWFkZXIgc2l6ZSBmaWVsZCBpcyAxNgorYml0cywgYW5kIGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIGhlYWRlciByZW1haW5pbmcgTk9UIGluY2x1ZGluZyB0aGUKK2BIRUFERVIgTUFHSUNgLCBgRkxBR1NgLCBgU0VRVUVOQ0UgTlVNQkVSYCBhbmQgaGVhZGVyIHNpemUgZmllbGRzLiAgVGhlCitIZWFkZXIgc2l6ZSBmaWVsZCBpcyBpbiBieXRlcy80LgorCitUaGUgdHJhbnNmb3JtIElEJ3MgYXJlIHZhcmludHMuICBUaGUgZGF0YSBmb3IgZWFjaCB0cmFuc2Zvcm0gaXMKK2RlZmluZWQgYnkgdGhlIHRyYW5zZm9ybSBJRCBpbiB0aGUgY29kZSAtIG5vIHNpemUgaXMgZ2l2ZW4gaW4gdGhlCitoZWFkZXIuICBJZiBhIHRyYW5zZm9ybSBJRCBpcyBzcGVjaWZpZWQgZnJvbSBhIGNsaWVudCBhbmQgdGhlIHNlcnZlcgorZG9lc24ndCBrbm93IGFib3V0IHRoZSB0cmFuc2Zvcm0gSUQsIGFuIGVycm9yIE1VU1QgYmUgcmV0dXJuZWQgYXMgd2UKK2Rvbid0IGtub3cgaG93IHRvIHRyYW5zZm9ybSB0aGUgZGF0YS4KKworQ29udmVyc2VseSwgZGF0YSBpbiB0aGUgaW5mbyBoZWFkZXJzIGlzIGlnbm9yYWJsZS4gIFRoaXMgc2hvdWxkIG9ubHkKK2JlIHRoaW5ncyBsaWtlIHRpbWVzdGFtcHMsIGRlYnVnaW5nIHRyYWNpbmcsIGV0Yy4gIFVzaW5nIHRoZSBoZWFkZXIKK3NpemUgeW91IHNob3VsZCBiZSBhYmxlIHRvIHNraXAgdGhpcyBkYXRhIGFuZCByZWFkIHRoZSBwYXlsb2FkIHNhZmVseQoraWYgeW91IGRvbid0IGtub3cgdGhlIGluZm8gSUQuCisKK0luZm8ncyBzaG91bGQgYmUgb2xkZXN0IHN1cHBvcnRlZCB0byBuZXdlc3Qgc3VwcG9ydGVkIG9yZGVyLCBzbyB0aGF0CitpZiB3ZSByZWFkIGFuIGluZm8gSUQgd2UgZG9uJ3Qgc3VwcG9ydCwgbm9uZSBvZiB0aGUgcmVtYWluaW5nIGluZm8KK0lEJ3Mgd2lsbCBiZSBzdXBwb3J0ZWQgZWl0aGVyLCBhbmQgd2UgY2FuIHNhZmVseSBza2lwIHRvIHRoZSBwYXlsb2FkLgorCitJbmZvIElEJ3MgYW5kIHRyYW5zZm9ybSBJRCdzIHNob3VsZCBzaGFyZSB0aGUgc2FtZSBJRCBzcGFjZS4KKworIyMjIFBBRERJTkc6CisKK0hlYWRlciB3aWxsIGJlIHBhZGRlZCBvdXQgdG8gbmV4dCA0LWJ5dGUgYm91bmRhcnkgd2l0aCBgMHgwMGAuCisKK01heCBmcmFtZSBzaXplIGlzIGAweDNGRkZGRkZGYCwgd2hpY2ggaXMgc2xpZ2h0bHkgbGVzcyB0aGFuIGBIVFRQX01BR0lDYC4KK1RoaXMgYWxsb3dzIHVzIHRvIGRpc3Rpbmd1c2ggYmV0d2VlbiBkaWZmZXJlbnQgKG9sZGVyKSB0cmFuc3BvcnRzLgorCisjIyMgVHJhbnNmb3JtIElEczoKKworICAgIFpMSUJfVFJBTlNGT1JNIDB4MDEgLSBObyBkYXRhIGZvciB0aGlzLiAgVXNlIHpsaWIgdG8gKGRlKWNvbXByZXNzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLgorCisgICAgSE1BQ19UUkFOU0ZPUk0gMHgwMiAtIFZhcmlhYmxlIGFtb3VudCBvZiBtYWMgZGF0YS4gIE9uZSBieXRlIHRvIHNwZWNpZnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS4gTWFjIGRhdGEgaXMgYXBwZW5kZWQgYXQgdGhlIGVuZCBvZiB0aGUgcGFja2V0LgorICAgIFNOQVBQWV9UUkFOU0ZPUk0gIDB4MDMgIC0gTm8gZGF0YSBmb3IgdGhpcy4gIFVzZSBzbmFwcHkgdG8gKGRlKWNvbXByZXNzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLgorCisKKyMjI0luZm8gSURzOgorCisgICAgSU5GT19LRVlWQUxVRSAweDAxIC0gdmFyaW50MzIgbnVtYmVyIG9mIGhlYWRlcnMuCisgICAgICAgICAgICAgICAgICAgICAgIC0ga2V5L3ZhbHVlIHBhaXJzIG9mIHZhcnN0cmluZ3MgKHZhcmludDE2IGxlbmd0aCBwbHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgbm8tdHJhaWxpbmctbnVsbCBzdHJpbmcpLgorCmRpZmYgLS1naXQgYS9kb2Mvc3BlY3MvaWRsLm1kIGIvZG9jL3NwZWNzL2lkbC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjIyZjU0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NwZWNzL2lkbC5tZApAQCAtMCwwICsxLDI3MiBAQAorIyMgVGhyaWZ0IGludGVyZmFjZSBkZXNjcmlwdGlvbiBsYW5ndWFnZQorVGhlIFRocmlmdCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBsYW5ndWFnZSAoSURMKSBhbGxvd3MgZm9yIHRoZSBkZWZpbml0aW9uIG9mIFtUaHJpZnQgVHlwZXNdKC9kb2NzL3R5cGVzKS4gQSBUaHJpZnQgSURMIGZpbGUgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBUaHJpZnQgY29kZSBnZW5lcmF0b3IgdG8gcHJvZHVjZSBjb2RlIGZvciB0aGUgdmFyaW91cyB0YXJnZXQgbGFuZ3VhZ2VzIHRvIHN1cHBvcnQgdGhlIGRlZmluZWQgc3RydWN0cyBhbmQgc2VydmljZXMgaW4gdGhlIElETCBmaWxlLgorCisjIyBEZXNjcmlwdGlvbgorCisqVW5kZXIgY29uc3RydWN0aW9uKgorCitIZXJlIGlzIGEgZGVzY3JpcHRpb24gb2YgdGhlIFRocmlmdCBJREwuCisKKyMjIERvY3VtZW50CisKK0V2ZXJ5IFRocmlmdCBkb2N1bWVudCBjb250YWlucyAwIG9yIG1vcmUgaGVhZGVycyBmb2xsb3dlZCBieSAwIG9yIG1vcmUgZGVmaW5pdGlvbnMuCisKKyAgICBbMV0gIERvY3VtZW50ICAgICAgICA6Oj0gIEhlYWRlciogRGVmaW5pdGlvbioKKworIyMgSGVhZGVyCisKK0EgaGVhZGVyIGlzIGVpdGhlciBhIFRocmlmdCBpbmNsdWRlLCBhIEMrKyBpbmNsdWRlLCBvciBhIG5hbWVzcGFjZSBkZWNsYXJhdGlvbi4KKworICAgIFsyXSAgSGVhZGVyICAgICAgICAgIDo6PSAgSW5jbHVkZSB8IENwcEluY2x1ZGUgfCBOYW1lc3BhY2UKKworIyMjIFRocmlmdCBJbmNsdWRlCisKK0FuIGluY2x1ZGUgbWFrZXMgYWxsIHRoZSBzeW1ib2xzIGZyb20gYW5vdGhlciBmaWxlIHZpc2libGUgKHdpdGggYSBwcmVmaXgpIGFuZCBhZGRzIGNvcnJlc3BvbmRpbmcgaW5jbHVkZSBzdGF0ZW1lbnRzIGludG8gdGhlIGNvZGUgZ2VuZXJhdGVkIGZvciB0aGlzIFRocmlmdCBkb2N1bWVudC4KKworICAgIFszXSAgSW5jbHVkZSAgICAgICAgIDo6PSAgJ2luY2x1ZGUnIExpdGVyYWwKKworIyMjIEMrKyBJbmNsdWRlCisKK0EgQysrIGluY2x1ZGUgYWRkcyBhIGN1c3RvbSBDKysgaW5jbHVkZSB0byB0aGUgb3V0cHV0IG9mIHRoZSBDKysgY29kZSBnZW5lcmF0b3IgZm9yIHRoaXMgVGhyaWZ0IGRvY3VtZW50LiAKKworICAgIFs0XSAgQ3BwSW5jbHVkZSAgICAgIDo6PSAgJ2NwcF9pbmNsdWRlJyBMaXRlcmFsCisKKyMjIyBOYW1lc3BhY2UKKworQSBuYW1lc3BhY2UgZGVjbGFyZXMgd2hpY2ggbmFtZXNwYWNlcy9wYWNrYWdlL21vZHVsZS9ldGMuIHRoZSB0eXBlIGRlZmluaXRpb25zIGluIHRoaXMgZmlsZSB3aWxsIGJlIGRlY2xhcmVkIGluIGZvciB0aGUgdGFyZ2V0IGxhbmd1YWdlcy4gVGhlIG5hbWVzcGFjZSBzY29wZSBpbmRpY2F0ZXMgd2hpY2ggbGFuZ3VhZ2UgdGhlIG5hbWVzcGFjZSBhcHBsaWVzIHRvOyBhIHNjb3BlIG9mICcqJyBpbmRpY2F0ZXMgdGhhdCB0aGUgbmFtZXNwYWNlIGFwcGxpZXMgdG8gYWxsIHRhcmdldCBsYW5ndWFnZXMuCisKKyAgICBbNV0gIE5hbWVzcGFjZSAgICAgICA6Oj0gICggJ25hbWVzcGFjZScgKCBOYW1lc3BhY2VTY29wZSBJZGVudGlmaWVyICkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICdzbWFsbHRhbGsuY2F0ZWdvcnknIFNUSWRlbnRpZmllciApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAnc21hbGx0YWxrLnByZWZpeCcgSWRlbnRpZmllciApICkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAncGhwX25hbWVzcGFjZScgTGl0ZXJhbCApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggJ3hzZF9uYW1lc3BhY2UnIExpdGVyYWwgKQorCisgICAgWzZdICBOYW1lc3BhY2VTY29wZSAgOjo9ICAnKicgfCAnY3BwJyB8ICdqYXZhJyB8ICdweScgfCAncGVybCcgfCAncmInIHwgJ2NvY29hJyB8ICdjc2hhcnAnCisKK04uQi46IFNtYWxsdGFsayBoYXMgdHdvIGRpc3RpbmN0IHR5cGVzIG9mIG5hbWVzcGFjZSBjb21tYW5kczoKKworLSBzbWFsbHRhbGsucHJlZml4OiBQcmVwZW5kZWQgdG8gZ2VuZXJhdGVkIGNsYXNzbmFtZXMuCisgIC0gU21hbGx0YWxrIGRvZXMgbm90IGhhdmUgbmFtZXNwYWNlcyBmb3IgY2xhc3Nlcywgc28gcHJlZml4ZXMKKyAgICBhcmUgdXNlZCB0byBhdm9pZCBjbGFzcy1uYW1lIGNvbGxpc2lvbnMuCisgICAgT2Z0ZW4sIHRoZSBwcmVmaXggaXMgdGhlIGF1dGhvcidzIGluaXRpYWxzLCBsaWtlICJLQiIgb3IgIkpXUyIsCisgICAgb3IgYW4gYWJicmV2aWF0aW9uIG9mIHRoZSBwYWNrYWdlIG5hbWUsIGxpa2UgIk1DIiBmb3IgIk1vbnRpY2VsbG8iLgorLSBzbWFsbHRhbGsuY2F0ZWdvcnk6IERldGVybWluZXMgdGhlIGNhdGVnb3J5IGZvciBnZW5lcmF0ZWQgY2xhc3Nlcy4KKyAgQW55IGRvdHMgaW4gdGhlIGlkZW50aWZpZXIgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGh5cGhlbnMgd2hlbiBnZW5lcmF0aW5nCisgIHRoZSBjYXRlZ29yeSBuYW1lLgorICBJZiBub3QgcHJvdmlkZWQsIGRlZmF1bHRzIHRvICJHZW5lcmF0ZWQtIiArIHRoZSBwcm9ncmFtIG5hbWUuCisgIE1ldGhvZHMgd2lsbCBub3QgYmUgY2F0ZWdvcml6ZWQgYmV5b25kICJhcyB5ZXQgdW5jYXRlZ29yaXplZCIuCisgIC0gU21hbGx0YWxrIGFsbG93cyBmaWxpbmcgYm90aCBjbGFzc2VzIGFuZCBtZXRob2RzIHdpdGhpbiBjbGFzc2VzIGludG8gbmFtZWQKKyAgICBncm91cHMuIFRoZXNlIG5hbWVkIGdyb3VwcyBvZiBtZXRob2RzIGFyZSBjYWxsZWQgY2F0ZWdvcmllcy4KKworTi5CLjogVGhlIGBwaHBfbmFtZXNwYWNlYCBkaXJlY3RpdmUgd2lsbCBiZSBkZXByZWNhdGVkIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZSBpbiBmYXZvciBvZiB0aGUgc2NvcGVkIHN5bnRheCwgYnV0IHRoZSBzY29wZWQgc3ludGF4IGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBQSFAuCisKK04uQi46IFRoZSBgeHNkX25hbWVzcGFjZWAgZGlyZWN0aXZlIGhhcyBzb21lIHB1cnBvc2UgaW50ZXJuYWwgdG8gRmFjZWJvb2sgYnV0IHNlcnZlcyBubyBwdXJwb3NlIGluIFRocmlmdCBpdHNlbGYuIFVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQKKworIyMgRGVmaW5pdGlvbgorCisgICAgWzddICBEZWZpbml0aW9uICAgICAgOjo9ICBDb25zdCB8IFR5cGVkZWYgfCBFbnVtIHwgU2VudW0gfCBTdHJ1Y3QgfCBVbmlvbiB8IEV4Y2VwdGlvbiB8IFNlcnZpY2UKKworIyMjIENvbnN0CisKKyAgICBbOF0gIENvbnN0ICAgICAgICAgICA6Oj0gICdjb25zdCcgRmllbGRUeXBlIElkZW50aWZpZXIgJz0nIENvbnN0VmFsdWUgTGlzdFNlcGFyYXRvcj8KKworIyMjIFR5cGVkZWYKKworQSB0eXBlZGVmIGNyZWF0ZXMgYW4gYWx0ZXJuYXRlIG5hbWUgZm9yIGEgdHlwZS4KKworICAgIFs5XSAgVHlwZWRlZiAgICAgICAgIDo6PSAgJ3R5cGVkZWYnIERlZmluaXRpb25UeXBlIElkZW50aWZpZXIKKworIyMjIEVudW0KKworQW4gZW51bSBjcmVhdGVzIGFuIGVudW1lcmF0ZWQgdHlwZSwgd2l0aCBuYW1lZCB2YWx1ZXMuIElmIG5vIGNvbnN0YW50IHZhbHVlIGlzIHN1cHBsaWVkLCB0aGUgdmFsdWUgaXMgZWl0aGVyIDAgZm9yIHRoZSBmaXJzdCBlbGVtZW50LCBvciBvbmUgZ3JlYXRlciB0aGFuIHRoZSBwcmVjZWRpbmcgdmFsdWUgZm9yIGFueSBzdWJzZXF1ZW50IGVsZW1lbnQuIEFueSBjb25zdGFudCB2YWx1ZSB0aGF0IGlzIHN1cHBsaWVkIG11c3QgYmUgbm9uLW5lZ2F0aXZlLgorCisgICAgWzEwXSBFbnVtICAgICAgICAgICAgOjo9ICAnZW51bScgSWRlbnRpZmllciAneycgKElkZW50aWZpZXIgKCc9JyBJbnRDb25zdGFudCk/IExpc3RTZXBhcmF0b3I/KSogJ30nCisKKyMjIyBTZW51bQorCitTZW51bSAoYW5kIFNsaXN0KSBhcmUgbm93IGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBib3RoIGJlIHJlcGxhY2VkIHdpdGggU3RyaW5nLgorCisgICAgWzExXSBTZW51bSAgICAgICAgICAgOjo9ICAnc2VudW0nIElkZW50aWZpZXIgJ3snIChMaXRlcmFsIExpc3RTZXBhcmF0b3I/KSogJ30nCisKKyMjIyBTdHJ1Y3QKKworU3RydWN0cyBhcmUgdGhlIGZ1bmRhbWVudGFsIGNvbXBvc2l0aW9uYWwgdHlwZSBpbiBUaHJpZnQuIFRoZSBuYW1lIG9mIGVhY2ggZmllbGQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBzdHJ1Y3QuCisKKyAgICBbMTJdIFN0cnVjdCAgICAgICAgICA6Oj0gICdzdHJ1Y3QnIElkZW50aWZpZXIgJ3hzZF9hbGwnPyAneycgRmllbGQqICd9JworCitOLkIuOiBUaGUgYHhzZF9hbGxgIGtleXdvcmQgaGFzIHNvbWUgcHVycG9zZSBpbnRlcm5hbCB0byBGYWNlYm9vayBidXQgc2VydmVzIG5vIHB1cnBvc2UgaW4gVGhyaWZ0IGl0c2VsZi4gVXNlIG9mIHRoaXMgZmVhdHVyZSBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZAorCisjIyMgVW5pb24KKworVW5pb25zIGFyZSBzaW1pbGFyIHRvIHN0cnVjdHMsIGV4Y2VwdCB0aGF0IHRoZXkgcHJvdmlkZSBhIG1lYW5zIHRvIHRyYW5zcG9ydCBleGFjdGx5IG9uZSBmaWVsZCBvZiBhIHBvc3NpYmxlIHNldCBvZiBmaWVsZHMsIGp1c3QgbGlrZSB1bmlvbiB7fSBpbiBDKysuIENvbnNlcXVlbnRseSwgdW5pb24gbWVtYmVycyBhcmUgaW1wbGljaXRseSBjb25zaWRlcmVkIG9wdGlvbmFsIChzZWUgcmVxdWlyZWRuZXNzKS4KKworICAgIFsxM10gVW5pb24gICAgICAgICAgOjo9ICAndW5pb24nIElkZW50aWZpZXIgJ3hzZF9hbGwnPyAneycgRmllbGQqICd9JworCitOLkIuOiBUaGUgYHhzZF9hbGxgIGtleXdvcmQgaGFzIHNvbWUgcHVycG9zZSBpbnRlcm5hbCB0byBGYWNlYm9vayBidXQgc2VydmVzIG5vIHB1cnBvc2UgaW4gVGhyaWZ0IGl0c2VsZi4gVXNlIG9mIHRoaXMgZmVhdHVyZSBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZAorCisjIyMgRXhjZXB0aW9uCisKK0V4Y2VwdGlvbnMgYXJlIHNpbWlsYXIgdG8gc3RydWN0cyBleGNlcHQgdGhhdCB0aGV5IGFyZSBpbnRlbmRlZCB0byBpbnRlZ3JhdGUgd2l0aCB0aGUgbmF0aXZlIGV4Y2VwdGlvbiBoYW5kbGluZyBtZWNoYW5pc21zIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2VzLiBUaGUgbmFtZSBvZiBlYWNoIGZpZWxkIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZXhjZXB0aW9uLgorCisgICAgWzE0XSBFeGNlcHRpb24gICAgICAgOjo9ICAnZXhjZXB0aW9uJyBJZGVudGlmaWVyICd7JyBGaWVsZCogJ30nCisKKyMjIyBTZXJ2aWNlCisKK0Egc2VydmljZSBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIGZvciBhIHNldCBvZiBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5IGEgVGhyaWZ0IHNlcnZlci4gVGhlIGludGVyZmFjZSBpcyBzaW1wbHkgYSBsaXN0IG9mIGZ1bmN0aW9ucy4gQSBzZXJ2aWNlIGNhbiBleHRlbmQgYW5vdGhlciBzZXJ2aWNlLCB3aGljaCBzaW1wbHkgbWVhbnMgdGhhdCBpdCBwcm92aWRlcyB0aGUgZnVuY3Rpb25zIG9mIHRoZSBleHRlbmRlZCBzZXJ2aWNlIGluIGFkZGl0aW9uIHRvIGl0cyBvd24uCisKKyAgICBbMTVdIFNlcnZpY2UgICAgICAgICA6Oj0gICdzZXJ2aWNlJyBJZGVudGlmaWVyICggJ2V4dGVuZHMnIElkZW50aWZpZXIgKT8gJ3snIEZ1bmN0aW9uKiAnfScKKworIyMgRmllbGQKKworICAgIFsxNl0gRmllbGQgICAgICAgICAgIDo6PSAgRmllbGRJRD8gRmllbGRSZXE/IEZpZWxkVHlwZSBJZGVudGlmaWVyICgnPSBDb25zdFZhbHVlKT8gWHNkRmllbGRPcHRpb25zIExpc3RTZXBhcmF0b3I/CisKKyMjIyBGaWVsZCBJRAorCisgICAgWzE3XSBGaWVsZElEICAgICAgICAgOjo9ICBJbnRDb25zdGFudCAnOicKKworIyMjIEZpZWxkIFJlcXVpcmVkbmVzcworCitUaGVyZSBhcmUgdHdvIGV4cGxpY2l0IHJlcXVpcmVkbmVzcyB2YWx1ZXMsIGFuZCBhIHRoaXJkIG9uZSB0aGF0IGlzIGFwcGxpZWQgaW1wbGljaXR5IGlmIG5laXRoZXIgICpyZXF1aXJlZCogbm9yICpvcHRpb25hbCogYXJlIGdpdmVuOiAqZGVmYXVsdCogcmVxdWlyZWRuZXNzLgorCisgICAgWzE4XSBGaWVsZFJlcSAgICAgICAgOjo9ICAncmVxdWlyZWQnIHwgJ29wdGlvbmFsJyAKKworVGhlIGdlbmVyYWwgcnVsZXMgZm9yIHJlcXVpcmVkbmVzcyBhcmUgYXMgZm9sbG93czoKKworIyMjIyByZXF1aXJlZAorCistIFdyaXRlOiBSZXF1aXJlZCBmaWVsZHMgYXJlIGFsd2F5cyB3cml0dGVuIGFuZCBhcmUgZXhwZWN0ZWQgdG8gYmUgc2V0LgorLSBSZWFkOiBSZXF1aXJlZCBmaWVsZHMgYXJlIGFsd2F5cyByZWFkIGFuZCBhcmUgZXhwZWN0ZWQgdG8gYmUgY29udGFpbmVkIGluIHRoZSBpbnB1dCBzdHJlYW0uCistIERlZmF1bHRzIHZhbHVlczogYXJlIGFsd2F5cyB3cml0dGVuCisKK0lmIGEgcmVxdWlyZWQgZmllbGQgaXMgbWlzc2luZyBkdXJpbmcgcmVhZCwgdGhlIGV4cGVjdGVkIGJlaGF2aW91ciBpcyB0byBpbmRpY2F0ZSBhbiB1bnN1Y2Nlc3NmdWwgcmVhZCBvcGVyYXRpb24gdG8gdGhlIGNhbGxlciwgZS5nLiBieSB0aHJvd2luZyBhbiBleGNlcHRpb24gb3IgcmV0dXJuaW5nIGFuIGVycm9yLiAKKworQmVjYXVzZSBvZiB0aGlzIGJlaGF2aW91ciwgcmVxdWlyZWQgZmllbGRzIGRyYXN0aWNhbGx5IGxpbWl0IHRoZSBvcHRpb25zIHdpdGggcmVnYXJkIHRvIHNvZnQgdmVyc2lvbmluZy4gQmVjYXVzZSB0aGV5IG11c3QgYmUgcHJlc2VudCBvbiByZWFkLCB0aGUgZmllbGRzIGNhbm5vdCBiZSBkZXByZWNhdGVkLiBJZiBhIHJlcXVpcmVkIGZpZWxkIHdvdWxkIGJlIHJlbW92ZWQgKG9yIGNoYW5nZWQgdG8gb3B0aW9uYWwpLCB0aGUgZGF0YSBhcmUgbm8gbG9uZ2VyIGNvbXBhdGlibGUgYmV0d2VlbiB2ZXJzaW9ucy4KKwkKKyMjIyMgb3B0aW9uYWwKKworLSBXcml0ZTogT3B0aW9uYWwgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4gd2hlbiB0aGV5IGFyZSBzZXQKKy0gUmVhZDogT3B0aW9uYWwgZmllbGRzIG1heSwgb3IgbWF5IG5vdCBiZSBwYXJ0IG9mIHRoZSBpbnB1dCBzdHJlYW0uIAorLSBEZWZhdWx0IHZhbHVlczogYXJlIHdyaXR0ZW4gd2hlbiB0aGUgaXNzZXQgZmxhZyBpcyBzZXQKKworTW9zdCBsYW5ndWFnZSBpbXBsZW1lbnRhdGlvbnMgdXNlIHRoZSByZWNvbW1lbmRlZCBwcmF0aWNlIG9mIHNvLWNhbGxlZCAiaXNzZXQiIGZsYWdzIHRvIGluZGljYXRlIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIG9wdGlvbmFsIGZpZWxkIGlzIHNldCBvciBub3QuIE9ubHkgZmllbGRzIHdpdGggdGhpcyBmbGFnIHNldCBhcmUgd3JpdHRlbiwgYW5kIGNvbnZlcnNlbHkgdGhlIGZsYWcgaXMgb25seSBzZXQgd2hlbiBhIGZpZWxkIHZhbHVlIGhhcyBiZWVuIHJlYWQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiAKKwkKKyMjIyMgZGVmYXVsdCByZXF1aXJlZG5lc3MgKGltcGxpY2l0KQorCistIFdyaXRlOiBJbiB0aGVvcnksIHRoZSBmaWVsZHMgYXJlIGFsd2F5cyB3cml0dGVuLiBUaGVyZSBhcmUgc29tZSBleGNlcHRpb25zIHRvIHRoYXQgcnVsZSwgc2VlIGJlbG93LgorLSBSZWFkOiBMaWtlIG9wdGlvbmFsLCB0aGUgZmllbGQgbWF5LCBvciBtYXkgbm90IGJlIHBhcnQgb2YgdGhlIGlucHV0IHN0cmVhbS4gCistIERlZmF1bHQgdmFsdWVzOiBtYXkgbm90IGJlIHdyaXR0ZW4gKHNlZSBuZXh0IHNlY3Rpb24pCisKK0RlZmF1bHQgcmVxdWlyZWRuZXNzIGlzIGEgZ29vZCBzdGFydGluZyBwb2ludC4gVGhlIGRlc2lyZWQgYmVoYXZpb3VyIGlzIGEgbWl4IG9mIG9wdGlvbmFsIGFuZCByZXF1aXJlZCwgaGVuY2UgdGhlIGludGVybmFsIG5hbWUgIm9wdC1pbiwgcmVxLW91dCIuIEFsdGhvdWdoIGluIHRoZW9yeSB0aGVzZSBmaWVsZHMgYXJlIHN1cHBvc2VkIHRvIGJlIHdyaXR0ZW4gKCJyZXEtb3V0IiksIGluIHJlYWxpdHkgdW5zZXQgZmllbGRzIGFyZSBub3QgYWx3YXlzIHdyaXR0ZW4uIFRoaXMgaXMgZXNwZWNpYWxseSB0aGUgY2FzZSwgd2hlbiB0aGUgZmllbGQgY29udGFpbnMgYSA8bnVsbD4gdmFsdWUsIHdoaWNoIGJ5IGRlZmluaXRpb24gY2Fubm90IGJlIHRyYW5zcG9ydGVkIHRocm91Z2ggdGhyaWZ0LiBUaGUgb25seSB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIGJ5IG5vdCB3cml0aW5nIHRoYXQgZmllbGQgYXQgYWxsLCBhbmQgdGhhdCdzIHdoYXQgbW9zdCBsYW5ndWFnZXMgZG8uCisJCisjIyMjIFNlbWFudGljcyBvZiBEZWZhdWx0IFZhbHVlcworCitUaGVyZSBhcmUgb25nb2luZyBkaXNjdXNzaW9ucyBhYm91dCB0aGF0IHRvcGljLCBzZWUgSklSQSBmb3IgZGV0YWlscy4gTm90IGFsbCBpbXBsZW1lbnRhdGlvbnMgdHJlYXQgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIHZlcnkgc2FtZSB3YXksIGJ1dCB0aGUgY3VycmVudCBzdGF0dXMgcXVvIGlzIG1vcmUgb3IgbGVzcyB0aGF0IGRlZmF1bHQgZmllbGRzIGFyZSB0eXBpY2FsbHkgc2V0IGF0IGluaXRpYWxpemF0aW9uIHRpbWUuIFRoZXJlZm9yZSwgYSB2YWx1ZSB0aGF0IGVxdWFscyB0aGUgZGVmYXVsdCBtYXkgbm90IGJlIHdyaXR0ZW4sIGJlY2F1c2UgdGhlIHJlYWQgZW5kIHdpbGwgc2V0IHRoZSB2YWx1ZSBpbXBsaWNpdGx5LiBPbiB0aGUgb3RoZXIgaGFuZCwgYW4gaW1wbGVtZW50YXRpb24gaXMgZnJlZSB0byB3cml0ZSB0aGUgZGVmYXVsdCB2YWx1ZSBhbnl3YXlzLCBhcyB0aGVyZSBpcyBubyBoYXJkIHJlc3RyaWN0aW9uIHRoYXQgcHJldmVudHMgdGhpcy4gCisKK1RoZSBtYWpvciBwb2ludCB0byBrZWVwIGluIG1pbmQgaGVyZSBpcyB0aGUgZmFjdCwgdGhhdCBhbnkgdW53cml0dGVuIGRlZmF1bHQgdmFsdWUgaW1wbGljaXRseSBiZWNvbWVzIHBhcnQgb2YgdGhlIGludGVyZmFjZSB2ZXJzaW9uLiBJZiB0aGF0IGRlZmF1bHQgaXMgY2hhbmdlZCwgdGhlIGludGVyZmFjZSBjaGFuZ2VzLiBJZiwgaW4gY29udHJhc3QsIHRoZSBkZWZhdWx0IHZhbHVlIGlzIHdyaXR0ZW4gaW50byB0aGUgb3V0cHV0IGRhdGEsIHRoZSBkZWZhdWx0IGluIHRoZSBJREwgY2FuIGNoYW5nZSBhdCBhbnkgdGltZSB3aXRob3V0IGFmZmVjdGluZyBzZXJpYWxpemVkIGRhdGEuCisKKyMjIyBYU0QgT3B0aW9ucworCitOLkIuOiBUaGVzZSBoYXZlICBzb21lIGludGVybmFsIHB1cnBvc2UgYXQgRmFjZWJvb2sgYnV0IHNlcnZlIG5vIGN1cnJlbnQgcHVycG9zZSBpbiBUaHJpZnQuIFVzZSBvZiB0aGVzZSBvcHRpb25zIGlzIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkLgorCisgICAgWzE5XSBYc2RGaWVsZE9wdGlvbnMgOjo9ICAneHNkX29wdGlvbmFsJz8gJ3hzZF9uaWxsYWJsZSc/IFhzZEF0dHJzPworCisgICAgWzIwXSBYc2RBdHRycyAgICAgICAgOjo9ICAneHNkX2F0dHJzJyAneycgRmllbGQqICd9JworCisjIyBGdW5jdGlvbnMKKworICAgIFsyMV0gRnVuY3Rpb24gICAgICAgIDo6PSAgJ29uZXdheSc/IEZ1bmN0aW9uVHlwZSBJZGVudGlmaWVyICcoJyBGaWVsZCogJyknIFRocm93cz8gTGlzdFNlcGFyYXRvcj8KKworICAgIFsyMl0gRnVuY3Rpb25UeXBlICAgIDo6PSAgRmllbGRUeXBlIHwgJ3ZvaWQnCisKKyAgICBbMjNdIFRocm93cyAgICAgICAgICA6Oj0gICd0aHJvd3MnICcoJyBGaWVsZCogJyknCisKKyMjIFR5cGVzCisKKyAgICBbMjRdIEZpZWxkVHlwZSAgICAgICA6Oj0gIElkZW50aWZpZXIgfCBCYXNlVHlwZSB8IENvbnRhaW5lclR5cGUKKworICAgIFsyNV0gRGVmaW5pdGlvblR5cGUgIDo6PSAgQmFzZVR5cGUgfCBDb250YWluZXJUeXBlCisKKyAgICBbMjZdIEJhc2VUeXBlICAgICAgICA6Oj0gICdib29sJyB8ICdieXRlJyB8ICdpOCcgfCAnaTE2JyB8ICdpMzInIHwgJ2k2NCcgfCAnZG91YmxlJyB8ICdzdHJpbmcnIHwgJ2JpbmFyeScgfCAnc2xpc3QnCisKKyAgICBbMjddIENvbnRhaW5lclR5cGUgICA6Oj0gIE1hcFR5cGUgfCBTZXRUeXBlIHwgTGlzdFR5cGUKKworICAgIFsyOF0gTWFwVHlwZSAgICAgICAgIDo6PSAgJ21hcCcgQ3BwVHlwZT8gJzwnIEZpZWxkVHlwZSAnLCcgRmllbGRUeXBlICc+JworCisgICAgWzI5XSBTZXRUeXBlICAgICAgICAgOjo9ICAnc2V0JyBDcHBUeXBlPyAnPCcgRmllbGRUeXBlICc+JworCisgICAgWzMwXSBMaXN0VHlwZSAgICAgICAgOjo9ICAnbGlzdCcgJzwnIEZpZWxkVHlwZSAnPicgQ3BwVHlwZT8KKworICAgIFszMV0gQ3BwVHlwZSAgICAgICAgIDo6PSAgJ2NwcF90eXBlJyBMaXRlcmFsCisKKyMjIENvbnN0YW50IFZhbHVlcworCisgICAgWzMyXSBDb25zdFZhbHVlICAgICAgOjo9ICBJbnRDb25zdGFudCB8IERvdWJsZUNvbnN0YW50IHwgTGl0ZXJhbCB8IElkZW50aWZpZXIgfCBDb25zdExpc3QgfCBDb25zdE1hcAorCisgICAgWzMzXSBJbnRDb25zdGFudCAgICAgOjo9ICAoJysnIHwgJy0nKT8gRGlnaXQrCisKKyAgICBbMzRdIERvdWJsZUNvbnN0YW50ICA6Oj0gICgnKycgfCAnLScpPyBEaWdpdCogKCcuJyBEaWdpdCspPyAoICgnRScgfCAnZScpIEludENvbnN0YW50ICk/CisKKyAgICBbMzVdIENvbnN0TGlzdCAgICAgICA6Oj0gICdbJyAoQ29uc3RWYWx1ZSBMaXN0U2VwYXJhdG9yPykqICddJworCisgICAgWzM2XSBDb25zdE1hcCAgICAgICAgOjo9ICAneycgKENvbnN0VmFsdWUgJzonIENvbnN0VmFsdWUgTGlzdFNlcGFyYXRvcj8pKiAnfScKKworIyMgQmFzaWMgRGVmaW5pdGlvbnMKKworIyMjIExpdGVyYWwKKworICAgIFszN10gTGl0ZXJhbCAgICAgICAgIDo6PSAgKCciJyBbXiJdKiAnIicpIHwgKCInIiBbXiddKiAiJyIpCisKKyMjIyBJZGVudGlmaWVyCisKKyAgICBbMzhdIElkZW50aWZpZXIgICAgICA6Oj0gICggTGV0dGVyIHwgJ18nICkgKCBMZXR0ZXIgfCBEaWdpdCB8ICcuJyB8ICdfJyApKgorCisgICAgWzM5XSBTVElkZW50aWZpZXIgICAgOjo9ICAoIExldHRlciB8ICdfJyApICggTGV0dGVyIHwgRGlnaXQgfCAnLicgfCAnXycgfCAnLScgKSoKKworIyMjIExpc3QgU2VwYXJhdG9yCisKKyAgICBbNDBdIExpc3RTZXBhcmF0b3IgICA6Oj0gICcsJyB8ICc7JworCisjIyMgTGV0dGVycyBhbmQgRGlnaXRzCisKKyAgICBbNDFdIExldHRlciAgICAgICAgICA6Oj0gIFsnQSctJ1onXSB8IFsnYSctJ3onXQorCisgICAgWzQyXSBEaWdpdCAgICAgICAgICAgOjo9ICBbJzAnLSc5J10KKworIyMgRXhhbXBsZXMKKworSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBUaHJpZnQgZGVmaW5pdGlvbnMsIHVzaW5nIHRoZSBUaHJpZnQgSURMOgorCisgKiBbVGhyaWZ0VGVzdC50aHJpZnRdW10gdXNlZCBieSB0aGUgVGhyaWZ0IFRlc3RGcmFtZXdvcmsKKyAqIFRocmlmdCBbdHV0b3JpYWxdW10KKyAqIEZhY2Vib29rJ3MgW2ZiMzAzLnRocmlmdF1bXQorICogW0FwYWNoZSBDYXNzYW5kcmEnc11bXSBUaHJpZnQgSURMOiBbY2Fzc2FuZHJhLnRocmlmdF1bXQorICogW0V2ZXJub3RlIEFQSV1bXQorCisgW1RocmlmdFRlc3QudGhyaWZ0XTogIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hcGFjaGUvdGhyaWZ0L21hc3Rlci90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgW3R1dG9yaWFsXTogICAgICAgICAgIC90dXRvcmlhbC8KKyBbZmIzMDMudGhyaWZ0XTogICAgICAgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2FwYWNoZS90aHJpZnQvbWFzdGVyL2NvbnRyaWIvZmIzMDMvaWYvZmIzMDMudGhyaWZ0CisgW0FwYWNoZSBDYXNzYW5kcmEnc106IGh0dHA6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZy8KKyBbY2Fzc2FuZHJhLnRocmlmdF06ICAgaHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9jYXNzYW5kcmEvdHJ1bmsvaW50ZXJmYWNlL2Nhc3NhbmRyYS50aHJpZnQ/dmlldz1jbworIFtFdmVybm90ZSBBUEldOiAgICAgICBodHRwOi8vd3d3LmV2ZXJub3RlLmNvbS9hYm91dC9kZXZlbG9wZXIvYXBpLworCisjIyBUbyBEby9RdWVzdGlvbnMKKworSW5pdGlhbGl6YXRpb24gb2YgQmFzZSBUeXBlcyBmb3IgYWxsIExhbmd1YWdlcz8KKworICogRG8gYWxsIExhbmd1YWdlcyBpbml0aWFsaXplIHRoZW0gdG8gMCwgYm9vbD1mYWxzZSBhbmQgc3RyaW5nPSIiPyBvciBudWxsLCB1bmRlZmluZWQ/CisKK1doeSBkb2VzIHBvc2l0aW9uIG9mIGBDcHBUeXBlYCB2YXJ5IGJldHdlZW4gYFNldFR5cGVgIGFuZCBgTGlzdFR5cGVgPworCisgKiBzdGQ6OnNldCBkb2VzIHNvcnQgdGhlIGVsZW1lbnRzIGF1dG9tYXRpY2FsbHksIHRoYXQncyB0aGUgZGVzaWduLiBzZWUgW1RocmlmdCBUeXBlc10oL2RvY3MvdHlwZXMpIG9yIHRoZSBbQysrIHN0ZDpzZXQgcmVmZXJlbmNlXVtdIGZvciBmdXJ0aGVyIGRldGFpbHMKKyAqIFRoZSBxdWVzdGlvbiBpcywgaG93IG90aGVyIGxhbmd1YWdlcyBhcmUgZG9pbmcgdGhhdD8gV2hhdCBhYm91dCBjdXN0b20gb2JqZWN0cywgZG8gdGhleSBoYXZlIGEgQ29tcGFyZSBmdW5jdGlvbiB0aGUgc2V0IHRoZSBvcmRlciBjb3JyZWN0bHk/CisKKyBbQysrIHN0ZDpzZXQgcmVmZXJlbmNlXTogaHR0cDovL3d3dy5jcGx1c3BsdXMuY29tL3JlZmVyZW5jZS9zdGwvc2V0LworCitXaHkgY2FuJ3QgYERlZmluaXRpb25UeXBlYCBiZSB0aGUgc2FtZSBhcyBgRmllbGRUeXBlYCAoaS5lLiBpbmNsdWRlIGBJZGVudGlmaWVyYCk/CisKK0V4YW1pbmUgdGhlIGBzbWFsbHRhbGsucHJlZml4YCBhbmQgYHNtYWxsdGFsay5jYXRlZ29yeWAgc3RhdHVzIChlc3AgYHNtYWxsdGFsay5jYXRlZ29yeWAsIHdoaWNoIHRha2VzIGBTVElkZW50aWZpZXJgIGFzIGl0cyBhcmd1bWVudCkuLi4KKworV2hhdCB0byBkbyBhYm91dCBgTGlzdFNlcGFyYXRvcmA/IERvIHdlIHJlYWxseSB3YW50IHRvIGJlIGFzIGxheCBhcyB3ZSBjdXJyZW50bHkgYXJlPworCitTaG91bGQgYEZpZWxkKmAgcmVhbGx5IGJlIGBGaWVsZCtgIGluIGBTdHJ1Y3RgLCBgRW51bWAsIGV0Yy4/CisKZGlmZiAtLWdpdCBhL2RvYy9zcGVjcy90aHJpZnQtYmluYXJ5LXByb3RvY29sLm1kIGIvZG9jL3NwZWNzL3RocmlmdC1iaW5hcnktcHJvdG9jb2wubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1MjY4NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zcGVjcy90aHJpZnQtYmluYXJ5LXByb3RvY29sLm1kCkBAIC0wLDAgKzEsMjU0IEBACitUaHJpZnQgQmluYXJ5IHByb3RvY29sIGVuY29kaW5nIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis8IS0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tPgorCitUaGlzIGRvY3VtZW50cyBkZXNjcmliZXMgdGhlIHdpcmUgZW5jb2RpbmcgZm9yIFJQQyB1c2luZyB0aGUgb2xkZXIgVGhyaWZ0ICpiaW5hcnkgcHJvdG9jb2wqLgorCitUaGUgaW5mb3JtYXRpb24gaGVyZSBpcyBfbW9zdGx5XyBiYXNlZCBvbiB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgQXBhY2hlIHRocmlmdCBsaWJyYXJ5ICh2ZXJzaW9uIDAuOS4xIGFuZAorMC45LjMpLiBPdGhlciBpbXBsZW1lbnRhdGlvbiBob3dldmVyLCBzaG91bGQgYmVoYXZlIHRoZSBzYW1lLgorCitGb3IgYmFja2dyb3VuZCBvbiBUaHJpZnQgc2VlIHRoZSBbVGhyaWZ0IHdoaXRlcGFwZXIgKHBkZildKGh0dHBzOi8vdGhyaWZ0LmFwYWNoZS5vcmcvc3RhdGljL2ZpbGVzL3RocmlmdC0yMDA3MDQwMS5wZGYpLgorCisjIENvbnRlbnRzCisKKyogQmluYXJ5IHByb3RvY29sCisgICogQmFzZSB0eXBlcworICAqIE1lc3NhZ2UKKyAgKiBTdHJ1Y3QKKyAgKiBMaXN0IGFuZCBTZXQKKyAgKiBNYXAKKyogQk5GIG5vdGF0aW9uIHVzZWQgaW4gdGhpcyBkb2N1bWVudAorCisjIEJpbmFyeSBwcm90b2NvbAorCisjIyBCYXNlIHR5cGVzCisKKyMjIyBJbnRlZ2VyIGVuY29kaW5nCisKK0luIHRoZSBfYmluYXJ5IHByb3RvY29sXyBpbnRlZ2VycyBhcmUgZW5jb2RlZCB3aXRoIHRoZSBtb3N0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKGJpZyBlbmRpYW4gYnl0ZSBvcmRlciwgYWthIG5ldHdvcmsKK29yZGVyKS4gQW4gYGludDhgIG5lZWRzIDEgYnl0ZSwgYW4gYGludDE2YCAyLCBhbiBgaW50MzJgIDQgYW5kIGFuIGBpbnQ2NGAgbmVlZHMgOCBieXRlcy4KKworVGhlIENQUCB2ZXJzaW9uIGhhcyB0aGUgb3B0aW9uIHRvIHVzZSB0aGUgYmluYXJ5IHByb3RvY29sIHdpdGggbGl0dGxlIGVuZGlhbiBvcmRlci4gTGl0dGxlIGVuZGlhbiBnaXZlcyBhIHNtYWxsIGJ1dAorbm90aWNlYWJsZSBwZXJmb3JtYW5jZSBib29zdCBiZWNhdXNlIGNvbnRlbXBvcmFyeSBDUFVzIHVzZSBsaXR0bGUgZW5kaWFuIHdoZW4gc3RvcmluZyBpbnRlZ2VycyB0byBSQU0uCisKKyMjIyBFbnVtIGVuY29kaW5nCisKK1RoZSBnZW5lcmF0ZWQgY29kZSBlbmNvZGVzIGBFbnVtYHMgYnkgdGFraW5nIHRoZSBvcmRpbmFsIHZhbHVlIGFuZCB0aGVuIGVuY29kaW5nIHRoYXQgYXMgYW4gaW50MzIuCisKKyMjIyBCaW5hcnkgZW5jb2RpbmcKKworQmluYXJ5IGlzIHNlbnQgYXMgZm9sbG93czoKKworYGBgCitCaW5hcnkgcHJvdG9jb2wsIGJpbmFyeSBkYXRhLCA0KyBieXRlczoKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8IGJ5dGUgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICB8IGJ5dGVzICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYGJ5dGUgbGVuZ3RoYCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBieXRlIGFycmF5LCBhIHNpZ25lZCAzMiBiaXQgaW50ZWdlciBlbmNvZGVkIGluIG5ldHdvcmsgKGJpZyBlbmRpYW4pIG9yZGVyIChtdXN0IGJlID49IDApLgorKiBgYnl0ZXNgIGFyZSB0aGUgYnl0ZXMgb2YgdGhlIGJ5dGUgYXJyYXkuCisKKyMjIyBTdHJpbmcgZW5jb2RpbmcKKworKlN0cmluZypzIGFyZSBmaXJzdCBlbmNvZGVkIHRvIFVURi04LCBhbmQgdGhlbiBzZW5kIGFzIGJpbmFyeS4KKworIyMjIERvdWJsZSBlbmNvZGluZworCitWYWx1ZXMgb2YgdHlwZSBgZG91YmxlYCBhcmUgZmlyc3QgY29udmVydGVkIHRvIGFuIGludDY0IGFjY29yZGluZyB0byB0aGUgSUVFRSA3NTQgZmxvYXRpbmctcG9pbnQgImRvdWJsZSBmb3JtYXQiIGJpdAorbGF5b3V0LiBNb3N0IHJ1bi10aW1lcyBwcm92aWRlIGEgbGlicmFyeSB0byBtYWtlIHRoaXMgY29udmVyc2lvbi4gQm90aCB0aGUgYmluYXJ5IHByb3RvY29sIGFzIHRoZSBjb21wYWN0IHByb3RvY29sIHRoZW4KK2VuY29kZSB0aGUgaW50NjQgaW4gOCBieXRlcyBpbiBiaWcgZW5kaWFuIG9yZGVyLgorCisjIyMgQm9vbGVhbiBlbmNvZGluZworCitWYWx1ZXMgb2YgYGJvb2xgIHR5cGUgYXJlIGZpcnN0IGNvbnZlcnRlZCB0byBhbiBpbnQ4LiBUcnVlIGlzIGNvbnZlcnRlZCB0byBgMWAsIGZhbHNlIHRvIGAwYC4KKworIyMgTWVzc2FnZQorCitBIGBNZXNzYWdlYCBjYW4gYmUgZW5jb2RlZCBpbiB0d28gZGlmZmVyZW50IHdheXM6CisKK2BgYAorQmluYXJ5IHByb3RvY29sIE1lc3NhZ2UsIHN0cmljdCBlbmNvZGluZywgMTIrIGJ5dGVzOgorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsKK3wxdnZ2dnZ2dnx2dnZ2dnZ2dnx1bnVzZWQgIHwwMDAwMG1tbXwgbmFtZSBsZW5ndGggICAgICAgICAgICAgICAgICAgICAgIHwgbmFtZSAgICAgICAgICAgICAgICB8IHNlcSBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGB2dnZ2dnZ2dnZ2dnZ2dnZgIGlzIHRoZSB2ZXJzaW9uLCBhbiB1bnNpZ25lZCAxNSBiaXQgbnVtYmVyIGZpeGVkIHRvIGAxYCAoaW4gYmluYXJ5OiBgMDAwIDAwMDAgMDAwMCAwMDAxYCkuCisgIFRoZSBsZWFkaW5nIGJpdCBpcyBgMWAuCisqIGB1bnVzZWRgIGlzIGFuIGlnbm9yZWQgYnl0ZS4KKyogYG1tbWAgaXMgdGhlIG1lc3NhZ2UgdHlwZSwgYW4gdW5zaWduZWQgMyBiaXQgaW50ZWdlci4gVGhlIDUgbGVhZGluZyBiaXRzIG11c3QgYmUgYDBgIGFzIHNvbWUgY2xpZW50cyAoY2hlY2tlZCBmb3IKKyAgamF2YSBpbiAwLjkuMSkgdGFrZSB0aGUgd2hvbGUgYnl0ZS4KKyogYG5hbWUgbGVuZ3RoYCBpcyB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIG5hbWUgZmllbGQsIGEgc2lnbmVkIDMyIGJpdCBpbnRlZ2VyIGVuY29kZWQgaW4gbmV0d29yayAoYmlnIGVuZGlhbikgb3JkZXIgKG11c3QgYmUgPj0gMCkuCisqIGBuYW1lYCBpcyB0aGUgbWV0aG9kIG5hbWUsIGEgVVRGLTggZW5jb2RlZCBzdHJpbmcuCisqIGBzZXEgaWRgIGlzIHRoZSBzZXF1ZW5jZSBpZCwgYSBzaWduZWQgMzIgYml0IGludGVnZXIgZW5jb2RlZCBpbiBuZXR3b3JrIChiaWcgZW5kaWFuKSBvcmRlci4KKworVGhlIHNlY29uZCwgb2xkZXIgZW5jb2RpbmcgKGFrYSBub24tc3RyaWN0KSBpczoKKworYGBgCitCaW5hcnkgcHJvdG9jb2wgTWVzc2FnZSwgb2xkIGVuY29kaW5nLCA5KyBieXRlczoKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCit8IG5hbWUgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICB8IG5hbWUgICAgICAgICAgICAgICAgfDAwMDAwbW1tfCBzZXEgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsKK2BgYAorCitXaGVyZSBgbmFtZSBsZW5ndGhgLCBgbmFtZWAsIGBtbW1gLCBgc2VxIGlkYCBhcmUgYXMgYWJvdmUuCisKK0JlY2F1c2UgYG5hbWUgbGVuZ3RoYCBtdXN0IGJlIHBvc2l0aXZlICh0aGVyZWZvcmUgdGhlIGZpcnN0IGJpdCBpcyBhbHdheXMgYDBgKSwgdGhlIGZpcnN0IGJpdCBhbGxvd3MgdGhlIHJlY2VpdmVyIHRvIHNlZQord2hldGhlciB0aGUgc3RyaWN0IGZvcm1hdCBvciB0aGUgb2xkIGZvcm1hdCBpcyB1c2VkLiBUaGVyZWZvcmUgYSBzZXJ2ZXIgYW5kIGNsaWVudCB1c2luZyB0aGUgZGlmZmVyZW50IHZhcmlhbnRzIG9mIHRoZQorYmluYXJ5IHByb3RvY29sIGNhbiB0cmFuc3BhcmVudGx5IHRhbGsgd2l0aCBlYWNoIG90aGVyLiBIb3dldmVyLCB3aGVuIHN0cmljdCBtb2RlIGlzIGVuZm9yY2VkLCB0aGUgb2xkIGZvcm1hdCBpcworcmVqZWN0ZWQuCisKK01lc3NhZ2UgdHlwZXMgYXJlIGVuY29kZWQgd2l0aCB0aGUgZm9sbG93aW5nIHZhbHVlczoKKworKiBfQ2FsbF86IDEKKyogX1JlcGx5XzogMgorKiBfRXhjZXB0aW9uXzogMworKiBfT25ld2F5XzogNAorCisjIyBTdHJ1Y3QKKworQSAqU3RydWN0KiBpcyBhIHNlcXVlbmNlIG9mIHplcm8gb3IgbW9yZSBmaWVsZHMsIGZvbGxvd2VkIGJ5IGEgc3RvcCBmaWVsZC4gRWFjaCBmaWVsZCBzdGFydHMgd2l0aCBhIGZpZWxkIGhlYWRlciBhbmQKK2lzIGZvbGxvd2VkIGJ5IHRoZSBlbmNvZGVkIGZpZWxkIHZhbHVlLiBUaGUgZW5jb2RpbmcgY2FuIGJlIHN1bW1hcml6ZWQgYnkgdGhlIGZvbGxvd2luZyBCTkY6CisKK2BgYAorc3RydWN0ICAgICAgICA6Oj0gKCBmaWVsZC1oZWFkZXIgZmllbGQtdmFsdWUgKSogc3RvcC1maWVsZAorZmllbGQtaGVhZGVyICA6Oj0gZmllbGQtdHlwZSBmaWVsZC1pZAorYGBgCisKK0JlY2F1c2UgZWFjaCBmaWVsZCBoZWFkZXIgY29udGFpbnMgdGhlIGZpZWxkLWlkIChhcyBkZWZpbmVkIGJ5IHRoZSBUaHJpZnQgSURMIGZpbGUpLCB0aGUgZmllbGRzIGNhbiBiZSBlbmNvZGVkIGluIGFueQorb3JkZXIuIFRocmlmdCdzIHR5cGUgc3lzdGVtIGlzIG5vdCBleHRlbnNpYmxlOyB5b3UgY2FuIG9ubHkgZW5jb2RlIHRoZSBwcmltaXRpdmUgdHlwZXMgYW5kIHN0cnVjdHMuIFRoZXJlZm9yZSBpcyBhbHNvCitwb3NzaWJsZSB0byBoYW5kbGUgdW5rbm93biBmaWVsZHMgd2hpbGUgZGVjb2Rpbmc7IHRoZXNlIGFyZSBzaW1wbHkgaWdub3JlZC4gV2hpbGUgZGVjb2RpbmcgdGhlIGZpZWxkIHR5cGUgY2FuIGJlIHVzZWQgdG8KK2RldGVybWluZSBob3cgdG8gZGVjb2RlIHRoZSBmaWVsZCB2YWx1ZS4KKworTm90ZSB0aGF0IHRoZSBmaWVsZCBuYW1lIGlzIG5vdCBlbmNvZGVkIHNvIGZpZWxkIHJlbmFtZXMgaW4gdGhlIElETCBkbyBub3QgYWZmZWN0IGZvcndhcmQgYW5kIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisKK1RoZSBkZWZhdWx0IEphdmEgaW1wbGVtZW50YXRpb24gKEFwYWNoZSBUaHJpZnQgMC45LjEpIGhhcyB1bmRlZmluZWQgYmVoYXZpb3Igd2hlbiBpdCB0cmllcyB0byBkZWNvZGUgYSBmaWVsZCB0aGF0IGhhcworYW5vdGhlciBmaWVsZC10eXBlIHRoZW4gd2hhdCBpcyBleHBlY3RlZC4gVGhlb3JldGljYWxseSB0aGlzIGNvdWxkIGJlIGRldGVjdGVkIGF0IHRoZSBjb3N0IG9mIHNvbWUgYWRkaXRpb25hbCBjaGVja2luZy4KK090aGVyIGltcGxlbWVudGF0aW9uIG1heSBwZXJmb3JtIHRoaXMgY2hlY2sgYW5kIHRoZW4gZWl0aGVyIGlnbm9yZSB0aGUgZmllbGQsIG9yIHJldHVybiBhIHByb3RvY29sIGV4Y2VwdGlvbi4KKworQSAqVW5pb24qIGlzIGVuY29kZWQgZXhhY3RseSB0aGUgc2FtZSBhcyBhIHN0cnVjdCB3aXRoIHRoZSBhZGRpdGlvbmFsIHJlc3RyaWN0aW9uIHRoYXQgYXQgbW9zdCAxIGZpZWxkIG1heSBiZSBlbmNvZGVkLgorCitBbiAqRXhjZXB0aW9uKiBpcyBlbmNvZGVkIGV4YWN0bHkgdGhlIHNhbWUgYXMgYSBzdHJ1Y3QuCisKKyMjIyBTdHJ1Y3QgZW5jb2RpbmcKKworSW4gdGhlIGJpbmFyeSBwcm90b2NvbCBmaWVsZCBoZWFkZXJzIGFuZCB0aGUgc3RvcCBmaWVsZCBhcmUgZW5jb2RlZCBhcyBmb2xsb3dzOgorCitgYGAKK0JpbmFyeSBwcm90b2NvbCBmaWVsZCBoZWFkZXIgYW5kIGZpZWxkIHZhbHVlOgorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3x0dHR0dHR0dHwgZmllbGQgaWQgICAgICAgIHwgZmllbGQgdmFsdWUgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworCitCaW5hcnkgcHJvdG9jb2wgc3RvcCBmaWVsZDoKKystLS0tLS0tLSsKK3wwMDAwMDAwMHwKKystLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgdHR0dHR0dHRgIHRoZSBmaWVsZC10eXBlLCBhIHNpZ25lZCA4IGJpdCBpbnRlZ2VyLgorKiBgZmllbGQgaWRgIHRoZSBmaWVsZC1pZCwgYSBzaWduZWQgMTYgYml0IGludGVnZXIgaW4gYmlnIGVuZGlhbiBvcmRlci4KKyogYGZpZWxkLXZhbHVlYCB0aGUgZW5jb2RlZCBmaWVsZCB2YWx1ZS4KKworVGhlIGZvbGxvd2luZyBmaWVsZC10eXBlcyBhcmUgdXNlZDoKKworKiBgQk9PTGAsIGVuY29kZWQgYXMgYDJgCisqIGBCWVRFYCwgZW5jb2RlZCBhcyBgM2AKKyogYERPVUJMRWAsIGVuY29kZWQgYXMgYDRgCisqIGBJMTZgLCBlbmNvZGVkIGFzIGA2YAorKiBgSTMyYCwgZW5jb2RlZCBhcyBgOGAKKyogYEk2NGAsIGVuY29kZWQgYXMgYDEwYAorKiBgU1RSSU5HYCwgdXNlZCBmb3IgYmluYXJ5IGFuZCBzdHJpbmcgZmllbGRzLCBlbmNvZGVkIGFzIGAxMWAKKyogYFNUUlVDVGAsIHVzZWQgZm9yIHN0cnVjdHMgYW5kIHVuaW9uIGZpZWxkcywgZW5jb2RlZCBhcyBgMTJgCisqIGBNQVBgLCBlbmNvZGVkIGFzIGAxM2AKKyogYFNFVGAsIGVuY29kZWQgYXMgYDE0YAorKiBgTElTVGAsIGVuY29kZWQgYXMgYDE1YAorCisjIyBMaXN0IGFuZCBTZXQKKworTGlzdCBhbmQgc2V0cyBhcmUgZW5jb2RlZCB0aGUgc2FtZTogYSBoZWFkZXIgaW5kaWNhdGluZyB0aGUgc2l6ZSBhbmQgdGhlIGVsZW1lbnQtdHlwZSBvZiB0aGUgZWxlbWVudHMsIGZvbGxvd2VkIGJ5IHRoZQorZW5jb2RlZCBlbGVtZW50cy4KKworYGBgCitCaW5hcnkgcHJvdG9jb2wgbGlzdCAoNSsgYnl0ZXMpIGFuZCBlbGVtZW50czoKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8dHR0dHR0dHR8IHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVsZW1lbnRzICAgICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgdHR0dHR0dHRgIGlzIHRoZSBlbGVtZW50LXR5cGUsIGVuY29kZWQgYXMgYW4gaW50OAorKiBgc2l6ZWAgaXMgdGhlIHNpemUsIGVuY29kZWQgYXMgYW4gaW50MzIsIHBvc2l0aXZlIHZhbHVlcyBvbmx5CisqIGBlbGVtZW50c2AgdGhlIGVsZW1lbnQgdmFsdWVzCisKK1RoZSBlbGVtZW50LXR5cGUgdmFsdWVzIGFyZSB0aGUgc2FtZSBhcyBmaWVsZC10eXBlcy4gVGhlIGZ1bGwgbGlzdCBpcyBpbmNsdWRlZCBpbiB0aGUgc3RydWN0IHNlY3Rpb24gYWJvdmUuCisKK1RoZSBtYXhpbXVtIGxpc3Qvc2V0IHNpemUgaXMgY29uZmlndXJhYmxlLiBCeSBkZWZhdWx0IHRoZXJlIGlzIG5vIGxpbWl0IChtZWFuaW5nIHRoZSBsaW1pdCBpcyB0aGUgbWF4aW11bSBpbnQzMiB2YWx1ZToKKzIxNDc0ODM2NDcpLgorCisjIyBNYXAKKworTWFwcyBhcmUgZW5jb2RlZCB3aXRoIGEgaGVhZGVyIGluZGljYXRpbmcgdGhlIHNpemUsIHRoZSBlbGVtZW50LXR5cGUgb2YgdGhlIGtleXMgYW5kIHRoZSBlbGVtZW50LXR5cGUgb2YgdGhlIGVsZW1lbnRzLAorZm9sbG93ZWQgYnkgdGhlIGVuY29kZWQgZWxlbWVudHMuIFRoZSBlbmNvZGluZyBmb2xsb3dzIHRoaXMgQk5GOgorCitgYGAKK21hcCAgOjo9ICBrZXktZWxlbWVudC10eXBlIHZhbHVlLWVsZW1lbnQtdHlwZSBzaXplICgga2V5IHZhbHVlICkqCitgYGAKKworYGBgCitCaW5hcnkgcHJvdG9jb2wgbWFwICg2KyBieXRlcykgYW5kIGtleSB2YWx1ZSBwYWlyczoKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8a2tra2tra2t8dnZ2dnZ2dnZ8IHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtleSB2YWx1ZSBwYWlycyAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBga2tra2tra2tgIGlzIHRoZSBrZXkgZWxlbWVudC10eXBlLCBlbmNvZGVkIGFzIGFuIGludDgKKyogYHZ2dnZ2dnZ2YCBpcyB0aGUgdmFsdWUgZWxlbWVudC10eXBlLCBlbmNvZGVkIGFzIGFuIGludDgKKyogYHNpemVgIGlzIHRoZSBzaXplIG9mIHRoZSBtYXAsIGVuY29kZWQgYXMgYW4gaW50MzIsIHBvc2l0aXZlIHZhbHVlcyBvbmx5CisqIGBrZXkgdmFsdWUgcGFpcnNgIGFyZSB0aGUgZW5jb2RlZCBrZXlzIGFuZCB2YWx1ZXMKKworVGhlIGVsZW1lbnQtdHlwZSB2YWx1ZXMgYXJlIHRoZSBzYW1lIGFzIGZpZWxkLXR5cGVzLiBUaGUgZnVsbCBsaXN0IGlzIGluY2x1ZGVkIGluIHRoZSBzdHJ1Y3Qgc2VjdGlvbiBhYm92ZS4KKworVGhlIG1heGltdW0gbWFwIHNpemUgaXMgY29uZmlndXJhYmxlLiBCeSBkZWZhdWx0IHRoZXJlIGlzIG5vIGxpbWl0IChtZWFuaW5nIHRoZSBsaW1pdCBpcyB0aGUgbWF4aW11bSBpbnQzMiB2YWx1ZToKKzIxNDc0ODM2NDcpLgorCisjIEJORiBub3RhdGlvbiB1c2VkIGluIHRoaXMgZG9jdW1lbnQKKworVGhlIGZvbGxvd2luZyBCTkYgbm90YXRpb24gaXMgdXNlZDoKKworKiBhIHBsdXMgYCtgIGFwcGVuZGVkIHRvIGFuIGl0ZW0gcmVwcmVzZW50cyByZXBldGl0aW9uOyB0aGUgaXRlbSBpcyByZXBlYXRlZCAxIG9yIG1vcmUgdGltZXMKKyogYSBzdGFyIGAqYCBhcHBlbmRlZCB0byBhbiBpdGVtIHJlcHJlc2VudHMgb3B0aW9uYWwgcmVwZXRpdGlvbjsgdGhlIGl0ZW0gaXMgcmVwZWF0ZWQgMCBvciBtb3JlIHRpbWVzCisqIGEgcGlwZSBgfGAgYmV0d2VlbiBpdGVtcyByZXByZXNlbnRzIGNob2ljZSwgdGhlIGZpcnN0IG1hdGNoaW5nIGl0ZW0gaXMgc2VsZWN0ZWQKKyogcGFyZW50aGVzaXMgYChgIGFuZCBgKWAgYXJlIHVzZWQgZm9yIGdyb3VwaW5nIG11bHRpcGxlIGl0ZW1zCmRpZmYgLS1naXQgYS9kb2Mvc3BlY3MvdGhyaWZ0LWNvbXBhY3QtcHJvdG9jb2wubWQgYi9kb2Mvc3BlY3MvdGhyaWZ0LWNvbXBhY3QtcHJvdG9jb2wubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0NjdkZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zcGVjcy90aHJpZnQtY29tcGFjdC1wcm90b2NvbC5tZApAQCAtMCwwICsxLDI5NCBAQAorVGhyaWZ0IENvbXBhY3QgcHJvdG9jb2wgZW5jb2RpbmcgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis8IS0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tPgorCitUaGlzIGRvY3VtZW50cyBkZXNjcmliZXMgdGhlIHdpcmUgZW5jb2RpbmcgZm9yIFJQQyB1c2luZyB0aGUgVGhyaWZ0ICpjb21wYWN0IHByb3RvY29sKi4KKworVGhlIGluZm9ybWF0aW9uIGhlcmUgaXMgX21vc3RseV8gYmFzZWQgb24gdGhlIEphdmEgaW1wbGVtZW50YXRpb24gaW4gdGhlIEFwYWNoZSB0aHJpZnQgbGlicmFyeSAodmVyc2lvbiAwLjkuMSkgYW5kCitbVEhSSUZULTExMCBBIG1vcmUgY29tcGFjdCBmb3JtYXRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExMCkuIE90aGVyIGltcGxlbWVudGF0aW9uIGhvd2V2ZXIsCitzaG91bGQgYmVoYXZlIHRoZSBzYW1lLgorCitGb3IgYmFja2dyb3VuZCBvbiBUaHJpZnQgc2VlIHRoZSBbVGhyaWZ0IHdoaXRlcGFwZXIgKHBkZildKGh0dHBzOi8vdGhyaWZ0LmFwYWNoZS5vcmcvc3RhdGljL2ZpbGVzL3RocmlmdC0yMDA3MDQwMS5wZGYpLgorCisjIENvbnRlbnRzCisKKyogQ29tcGFjdCBwcm90b2NvbAorICAqIEJhc2UgdHlwZXMKKyAgKiBNZXNzYWdlCisgICogU3RydWN0CisgICogTGlzdCBhbmQgU2V0CisgICogTWFwCisqIEJORiBub3RhdGlvbiB1c2VkIGluIHRoaXMgZG9jdW1lbnQKKworIyBDb21wYWN0IHByb3RvY29sCisKKyMjIEJhc2UgdHlwZXMKKworIyMjIEludGVnZXIgZW5jb2RpbmcKKworVGhlIF9jb21wYWN0IHByb3RvY29sXyB1c2VzIG11bHRpcGxlIGVuY29kaW5ncyBmb3IgaW50czogdGhlIF96aWd6YWcgaW50XywgYW5kIHRoZSBfdmFyIGludF8uCisKK1ZhbHVlcyBvZiB0eXBlIGBpbnQzMmAgYW5kIGBpbnQ2NGAgYXJlIGZpcnN0IHRyYW5zZm9ybWVkIHRvIGEgKnppZ3phZyBpbnQqLiBBIHppZ3phZyBpbnQgZm9sZHMgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlCitudW1iZXJzIGludG8gdGhlIHBvc2l0aXZlIG51bWJlciBzcGFjZS4gV2hlbiB3ZSByZWFkIDAsIDEsIDIsIDMsIDQgb3IgNSBmcm9tIHRoZSB3aXJlLCB0aGlzIGlzIHRyYW5zbGF0ZWQgdG8gMCwgLTEsIDEsCistMiBvciAyIHJlc3BlY3RpdmVseS4gSGVyZSBhcmUgdGhlIChTY2FsYSkgZm9ybXVsYXMgdG8gY29udmVydCBmcm9tIGludDMyL2ludDY0IHRvIGEgemlnemFnIGludCBhbmQgYmFjazoKKworYGBgc2NhbGEKK2RlZiBpbnRUb1ppZ1phZyhuOiBJbnQpOiBJbnQgPSAobiA8PCAxKSBeIChuID4+IDMxKQorZGVmIHppZ3phZ1RvSW50KG46IEludCk6IEludCA9IChuID4+PiAxKSBeIC0gKG4gJiAxKQorZGVmIGxvbmdUb1ppZ1phZyhuOiBMb25nKTogTG9uZyA9IChuIDw8IDEpIF4gKG4gPj4gNjMpCitkZWYgemlnemFnVG9Mb25nKG46IExvbmcpOiBMb25nID0gKG4gPj4+IDEpIF4gLSAobiAmIDEpCitgYGAKKworVGhlIHppZ3phZyBpbnQgaXMgdGhlbiBlbmNvZGVkIGFzIGEgKnZhciBpbnQqLiBWYXIgaW50cyB0YWtlIDEgdG8gNSBieXRlcyAoaW50MzIpIG9yIDEgdG8gMTAgYnl0ZXMgKGludDY0KS4gVGhlIG1vc3QKK3NpZ25pZmljYW50IGJpdCBvZiBlYWNoIGJ5dGUgaW5kaWNhdGVzIGlmIG1vcmUgYnl0ZXMgZm9sbG93LiBUaGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgNyBiaXRzIGZyb20gZWFjaAorYnl0ZSBmb3JtIHRoZSBudW1iZXIsIHdoZXJlIHRoZSBmaXJzdCBieXRlIGhhcyB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXRzIChzbyB0aGV5IGFyZSBpbiBiaWcgZW5kaWFuIG9yIG5ldHdvcmsgb3JkZXIpLgorCitWYXIgaW50cyBhcmUgc29tZXRpbWVzIHVzZWQgZGlyZWN0bHkgaW5zaWRlIHRoZSBjb21wYWN0IHByb3RvY29sIHRvIHJlcHJlc2VudCBwb3NpdGl2ZSBudW1iZXJzLgorCitUbyBlbmNvZGUgYW4gYGludDE2YCBhcyB6aWd6YWcgaW50LCBpdCBpcyBmaXJzdCBjb252ZXJ0ZWQgdG8gYW4gYGludDMyYCBhbmQgdGhlbiBlbmNvZGVkIGFzIHN1Y2guIFRoZSB0eXBlIGBpbnQ4YCBzaW1wbHkKK3VzZXMgYSBzaW5nbGUgYnl0ZSBhcyBpbiB0aGUgYmluYXJ5IHByb3RvY29sLgorCisjIyMgRW51bSBlbmNvZGluZworCitUaGUgZ2VuZXJhdGVkIGNvZGUgZW5jb2RlcyBgRW51bWBzIGJ5IHRha2luZyB0aGUgb3JkaW5hbCB2YWx1ZSBhbmQgdGhlbiBlbmNvZGluZyB0aGF0IGFzIGFuIGludDMyLgorCisjIyMgQmluYXJ5IGVuY29kaW5nCisKK0JpbmFyeSBpcyBzZW50IGFzIGZvbGxvd3M6CisKK2BgYAorQmluYXJ5IHByb3RvY29sLCBiaW5hcnkgZGF0YSwgMSsgYnl0ZXM6CisrLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3wgYnl0ZSBsZW5ndGggICAgICAgICB8IGJ5dGVzICAgICAgICAgICAgICAgfAorKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYGJ5dGUgbGVuZ3RoYCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBieXRlIGFycmF5LCB1c2luZyB2YXIgaW50IGVuY29kaW5nIChtdXN0IGJlID49IDApLgorKiBgYnl0ZXNgIGFyZSB0aGUgYnl0ZXMgb2YgdGhlIGJ5dGUgYXJyYXkuCisKKyMjIyBTdHJpbmcgZW5jb2RpbmcKKworKlN0cmluZypzIGFyZSBmaXJzdCBlbmNvZGVkIHRvIFVURi04LCBhbmQgdGhlbiBzZW5kIGFzIGJpbmFyeS4KKworIyMjIERvdWJsZSBlbmNvZGluZworCitWYWx1ZXMgb2YgdHlwZSBgZG91YmxlYCBhcmUgZmlyc3QgY29udmVydGVkIHRvIGFuIGludDY0IGFjY29yZGluZyB0byB0aGUgSUVFRSA3NTQgZmxvYXRpbmctcG9pbnQgImRvdWJsZSBmb3JtYXQiIGJpdAorbGF5b3V0LiBNb3N0IHJ1bi10aW1lcyBwcm92aWRlIGEgbGlicmFyeSB0byBtYWtlIHRoaXMgY29udmVyc2lvbi4gQm90aCB0aGUgYmluYXJ5IHByb3RvY29sIGFzIHRoZSBjb21wYWN0IHByb3RvY29sIHRoZW4KK2VuY29kZSB0aGUgaW50NjQgaW4gOCBieXRlcyBpbiBiaWcgZW5kaWFuIG9yZGVyLgorCisjIyMgQm9vbGVhbiBlbmNvZGluZworCitCb29sZWFucyBhcmUgZW5jb2RlZCBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gd2hldGhlciBpdCBpcyBhIGZpZWxkIHZhbHVlIChpbiBhIHN0cnVjdCkgb3IgYW4gZWxlbWVudCB2YWx1ZSAoaW4gYSBzZXQsCitsaXN0IG9yIG1hcCkuIEZpZWxkIHZhbHVlcyBhcmUgZW5jb2RlZCBkaXJlY3RseSBpbiB0aGUgZmllbGQgaGVhZGVyLiBFbGVtZW50IHZhbHVlcyBvZiB0eXBlIGBib29sYCBhcmUgc2VudCBhcyBhbiBpbnQ4OwordHJ1ZSBhcyBgMWAgYW5kIGZhbHNlIGFzIGAwYC4KKworIyMgTWVzc2FnZQorCitBIGBNZXNzYWdlYCBvbiB0aGUgd2lyZSBsb29rcyBhcyBmb2xsb3dzOgorCitgYGAKK0NvbXBhY3QgcHJvdG9jb2wgTWVzc2FnZSAoNCsgYnl0ZXMpOgorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfHBwcHBwcHBwfG1tbXZ2dnZ2fCBzZXEgaWQgICAgICAgICAgICAgIHwgbmFtZSBsZW5ndGggICAgICAgICB8IG5hbWUgICAgICAgICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGBwcHBwcHBwcGAgaXMgdGhlIHByb3RvY29sIGlkLCBmaXhlZCB0byBgMTAwMCAwMDEwYCwgMHg4Mi4KKyogYG1tbWAgaXMgdGhlIG1lc3NhZ2UgdHlwZSwgYW4gdW5zaWduZWQgMyBiaXQgaW50ZWdlci4KKyogYHZ2dnZ2YCBpcyB0aGUgdmVyc2lvbiwgYW4gdW5zaWduZWQgNSBiaXQgaW50ZWdlciwgZml4ZWQgdG8gYDAwMDAxYC4KKyogYHNlcSBpZGAgaXMgdGhlIHNlcXVlbmNlIGlkLCBhIHNpZ25lZCAzMiBiaXQgaW50ZWdlciBlbmNvZGVkIGFzIGEgdmFyIGludC4KKyogYG5hbWUgbGVuZ3RoYCBpcyB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIG5hbWUgZmllbGQsIGEgc2lnbmVkIDMyIGJpdCBpbnRlZ2VyIGVuY29kZWQgYXMgYSB2YXIgaW50IChtdXN0IGJlID49IDApLgorKiBgbmFtZWAgaXMgdGhlIG1ldGhvZCBuYW1lIHRvIGludm9rZSwgYSBVVEYtOCBlbmNvZGVkIHN0cmluZy4KKworTWVzc2FnZSB0eXBlcyBhcmUgZW5jb2RlZCB3aXRoIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorCisqIF9DYWxsXzogMQorKiBfUmVwbHlfOiAyCisqIF9FeGNlcHRpb25fOiAzCisqIF9PbmV3YXlfOiA0CisKKyMjIyBTdHJ1Y3QKKworQSAqU3RydWN0KiBpcyBhIHNlcXVlbmNlIG9mIHplcm8gb3IgbW9yZSBmaWVsZHMsIGZvbGxvd2VkIGJ5IGEgc3RvcCBmaWVsZC4gRWFjaCBmaWVsZCBzdGFydHMgd2l0aCBhIGZpZWxkIGhlYWRlciBhbmQKK2lzIGZvbGxvd2VkIGJ5IHRoZSBlbmNvZGVkIGZpZWxkIHZhbHVlLiBUaGUgZW5jb2RpbmcgY2FuIGJlIHN1bW1hcml6ZWQgYnkgdGhlIGZvbGxvd2luZyBCTkY6CisKK2BgYAorc3RydWN0ICAgICAgICA6Oj0gKCBmaWVsZC1oZWFkZXIgZmllbGQtdmFsdWUgKSogc3RvcC1maWVsZAorZmllbGQtaGVhZGVyICA6Oj0gZmllbGQtdHlwZSBmaWVsZC1pZAorYGBgCisKK0JlY2F1c2UgZWFjaCBmaWVsZCBoZWFkZXIgY29udGFpbnMgdGhlIGZpZWxkLWlkIChhcyBkZWZpbmVkIGJ5IHRoZSBUaHJpZnQgSURMIGZpbGUpLCB0aGUgZmllbGRzIGNhbiBiZSBlbmNvZGVkIGluIGFueQorb3JkZXIuIFRocmlmdCdzIHR5cGUgc3lzdGVtIGlzIG5vdCBleHRlbnNpYmxlOyB5b3UgY2FuIG9ubHkgZW5jb2RlIHRoZSBwcmltaXRpdmUgdHlwZXMgYW5kIHN0cnVjdHMuIFRoZXJlZm9yZSBpcyBhbHNvCitwb3NzaWJsZSB0byBoYW5kbGUgdW5rbm93biBmaWVsZHMgd2hpbGUgZGVjb2Rpbmc7IHRoZXNlIGFyZSBzaW1wbHkgaWdub3JlZC4gV2hpbGUgZGVjb2RpbmcgdGhlIGZpZWxkIHR5cGUgY2FuIGJlIHVzZWQgdG8KK2RldGVybWluZSBob3cgdG8gZGVjb2RlIHRoZSBmaWVsZCB2YWx1ZS4KKworTm90ZSB0aGF0IHRoZSBmaWVsZCBuYW1lIGlzIG5vdCBlbmNvZGVkIHNvIGZpZWxkIHJlbmFtZXMgaW4gdGhlIElETCBkbyBub3QgYWZmZWN0IGZvcndhcmQgYW5kIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisKK1RoZSBkZWZhdWx0IEphdmEgaW1wbGVtZW50YXRpb24gKEFwYWNoZSBUaHJpZnQgMC45LjEpIGhhcyB1bmRlZmluZWQgYmVoYXZpb3Igd2hlbiBpdCB0cmllcyB0byBkZWNvZGUgYSBmaWVsZCB0aGF0IGhhcworYW5vdGhlciBmaWVsZC10eXBlIHRoYW4gd2hhdCBpcyBleHBlY3RlZC4gVGhlb3JldGljYWxseSB0aGlzIGNvdWxkIGJlIGRldGVjdGVkIGF0IHRoZSBjb3N0IG9mIHNvbWUgYWRkaXRpb25hbCBjaGVja2luZy4KK090aGVyIGltcGxlbWVudGF0aW9uIG1heSBwZXJmb3JtIHRoaXMgY2hlY2sgYW5kIHRoZW4gZWl0aGVyIGlnbm9yZSB0aGUgZmllbGQsIG9yIHJldHVybiBhIHByb3RvY29sIGV4Y2VwdGlvbi4KKworQSAqVW5pb24qIGlzIGVuY29kZWQgZXhhY3RseSB0aGUgc2FtZSBhcyBhIHN0cnVjdCB3aXRoIHRoZSBhZGRpdGlvbmFsIHJlc3RyaWN0aW9uIHRoYXQgYXQgbW9zdCAxIGZpZWxkIG1heSBiZSBlbmNvZGVkLgorCitBbiAqRXhjZXB0aW9uKiBpcyBlbmNvZGVkIGV4YWN0bHkgdGhlIHNhbWUgYXMgYSBzdHJ1Y3QuCisKKyMjIyBTdHJ1Y3QgZW5jb2RpbmcKKworYGBgCitDb21wYWN0IHByb3RvY29sIGZpZWxkIGhlYWRlciAoc2hvcnQgZm9ybSkgYW5kIGZpZWxkIHZhbHVlOgorKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3xkZGRkdHR0dHwgZmllbGQgdmFsdWUgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworCitDb21wYWN0IHByb3RvY29sIGZpZWxkIGhlYWRlciAoMSB0byAzIGJ5dGVzLCBsb25nIGZvcm0pIGFuZCBmaWVsZCB2YWx1ZToKKystLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfDAwMDB0dHR0fCBmaWVsZCBpZCAgICAgICAgICAgIHwgZmllbGQgdmFsdWUgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKKworQ29tcGFjdCBwcm90b2NvbCBzdG9wIGZpZWxkOgorKy0tLS0tLS0tKworfDAwMDAwMDAwfAorKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGBkZGRkYCBpcyB0aGUgZmllbGQgaWQgZGVsdGEsIGFuIHVuc2lnbmVkIDQgYml0cyBpbnRlZ2VyLCBzdHJpY3RseSBwb3NpdGl2ZS4KKyogYHR0dHRgIGlzIGZpZWxkLXR5cGUgaWQsIGFuIHVuc2lnbmVkIDQgYml0IGludGVnZXIuCisqIGBmaWVsZCBpZGAgdGhlIGZpZWxkIGlkLCBhIHNpZ25lZCAxNiBiaXQgaW50ZWdlciBlbmNvZGVkIGFzIHppZ3phZyBpbnQuCisqIGBmaWVsZC12YWx1ZWAgdGhlIGVuY29kZWQgZmllbGQgdmFsdWUuCisKK1RoZSBmaWVsZCBpZCBkZWx0YSBjYW4gYmUgY29tcHV0ZWQgYnkgYGN1cnJlbnQtZmllbGQtaWQgLSBwcmV2aW91cy1maWVsZC1pZGAsIG9yIGp1c3QgYGN1cnJlbnQtZmllbGQtaWRgIGlmIHRoaXMgaXMgdGhlCitmaXJzdCBvZiB0aGUgc3RydWN0LiBUaGUgc2hvcnQgZm9ybSBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZSBmaWVsZCBpZCBkZWx0YSBpcyBpbiB0aGUgcmFuZ2UgMSAtIDE1IChpbmNsdXNpdmUpLgorCitUaGUgZm9sbG93aW5nIGZpZWxkLXR5cGVzIGNhbiBiZSBlbmNvZGVkOgorCisqIGBCT09MRUFOX1RSVUVgLCBlbmNvZGVkIGFzIGAxYAorKiBgQk9PTEVBTl9GQUxTRWAsIGVuY29kZWQgYXMgYDJgCisqIGBCWVRFYCwgZW5jb2RlZCBhcyBgM2AKKyogYEkxNmAsIGVuY29kZWQgYXMgYDRgCisqIGBJMzJgLCBlbmNvZGVkIGFzIGA1YAorKiBgSTY0YCwgZW5jb2RlZCBhcyBgNmAKKyogYERPVUJMRWAsIGVuY29kZWQgYXMgYDdgCisqIGBCSU5BUllgLCB1c2VkIGZvciBiaW5hcnkgYW5kIHN0cmluZyBmaWVsZHMsIGVuY29kZWQgYXMgYDhgCisqIGBMSVNUYCwgZW5jb2RlZCBhcyBgOWAKKyogYFNFVGAsIGVuY29kZWQgYXMgYDEwYAorKiBgTUFQYCwgZW5jb2RlZCBhcyBgMTFgCisqIGBTVFJVQ1RgLCB1c2VkIGZvciBib3RoIHN0cnVjdHMgYW5kIHVuaW9uIGZpZWxkcywgZW5jb2RlZCBhcyBgMTJgCisKK05vdGUgdGhhdCBiZWNhdXNlIHRoZXJlIGFyZSAyIHNwZWNpZmljIGZpZWxkIHR5cGVzIGZvciB0aGUgYm9vbGVhbiB2YWx1ZXMsIHRoZSBlbmNvZGluZyBvZiBhIGJvb2xlYW4gZmllbGQgdmFsdWUgaGFzIG5vCitsZW5ndGggKDAgYnl0ZXMpLgorCisjIyBMaXN0IGFuZCBTZXQKKworTGlzdCBhbmQgc2V0cyBhcmUgZW5jb2RlZCB0aGUgc2FtZTogYSBoZWFkZXIgaW5kaWNhdGluZyB0aGUgc2l6ZSBhbmQgdGhlIGVsZW1lbnQtdHlwZSBvZiB0aGUgZWxlbWVudHMsIGZvbGxvd2VkIGJ5IHRoZQorZW5jb2RlZCBlbGVtZW50cy4KKworYGBgCitDb21wYWN0IHByb3RvY29sIGxpc3QgaGVhZGVyICgxIGJ5dGUsIHNob3J0IGZvcm0pIGFuZCBlbGVtZW50czoKKystLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8c3Nzc3R0dHR8IGVsZW1lbnRzICAgICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKKworQ29tcGFjdCBwcm90b2NvbCBsaXN0IGhlYWRlciAoMisgYnl0ZXMsIGxvbmcgZm9ybSkgYW5kIGVsZW1lbnRzOgorKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8MTExMXR0dHR8IHNpemUgICAgICAgICAgICAgICAgfCBlbGVtZW50cyAgICAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGBzc3NzYCBpcyB0aGUgc2l6ZSwgNCBiaXQgdW5zaWduZWQgaW50LCB2YWx1ZXMgYDBgIC0gYDE0YAorKiBgdHR0dGAgaXMgdGhlIGVsZW1lbnQtdHlwZSwgYSA0IGJpdCB1bnNpZ25lZCBpbnQKKyogYHNpemVgIGlzIHRoZSBzaXplLCBhIHZhciBpbnQgKGludDMyKSwgcG9zaXRpdmUgdmFsdWVzIGAxNWAgb3IgaGlnaGVyCisqIGBlbGVtZW50c2AgYXJlIHRoZSBlbmNvZGVkIGVsZW1lbnRzCisKK1RoZSBzaG9ydCBmb3JtIHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlIGxlbmd0aCBpcyBpbiB0aGUgcmFuZ2UgMCAtIDE0IChpbmNsdXNpdmUpLgorCitUaGUgZm9sbG93aW5nIGVsZW1lbnQtdHlwZXMgYXJlIHVzZWQgKG5vdGUgdGhhdCB0aGVzZSBhcmUgX2RpZmZlcmVudF8gZnJvbSB0aGUgZmllbGQtdHlwZXMpOgorCisqIGBCT09MYCwgZW5jb2RlZCBhcyBgMmAKKyogYEJZVEVgLCBlbmNvZGVkIGFzIGAzYAorKiBgRE9VQkxFYCwgZW5jb2RlZCBhcyBgNGAKKyogYEkxNmAsIGVuY29kZWQgYXMgYDZgCisqIGBJMzJgLCBlbmNvZGVkIGFzIGA4YAorKiBgSTY0YCwgZW5jb2RlZCBhcyBgMTBgCisqIGBTVFJJTkdgLCB1c2VkIGZvciBiaW5hcnkgYW5kIHN0cmluZyBmaWVsZHMsIGVuY29kZWQgYXMgYDExYAorKiBgU1RSVUNUYCwgdXNlZCBmb3Igc3RydWN0cyBhbmQgdW5pb24gZmllbGRzLCBlbmNvZGVkIGFzIGAxMmAKKyogYE1BUGAsIGVuY29kZWQgYXMgYDEzYAorKiBgU0VUYCwgZW5jb2RlZCBhcyBgMTRgCisqIGBMSVNUYCwgZW5jb2RlZCBhcyBgMTVgCisKKworVGhlIG1heGltdW0gbGlzdC9zZXQgc2l6ZSBpcyBjb25maWd1cmFibGUuIEJ5IGRlZmF1bHQgdGhlcmUgaXMgbm8gbGltaXQgKG1lYW5pbmcgdGhlIGxpbWl0IGlzIHRoZSBtYXhpbXVtIGludDMyIHZhbHVlOgorMjE0NzQ4MzY0NykuCisKKyMjIE1hcAorCitNYXBzIGFyZSBlbmNvZGVkIHdpdGggYSBoZWFkZXIgaW5kaWNhdGluZyB0aGUgc2l6ZSwgdGhlIHR5cGUgb2YgdGhlIGtleXMgYW5kIHRoZSBlbGVtZW50LXR5cGUgb2YgdGhlIGVsZW1lbnRzLCBmb2xsb3dlZAorYnkgdGhlIGVuY29kZWQgZWxlbWVudHMuIFRoZSBlbmNvZGluZyBmb2xsb3dzIHRoaXMgQk5GOgorCitgYGAKK21hcCAgICAgICAgICAgOjo9IGVtcHR5LW1hcCB8IG5vbi1lbXB0eS1tYXAKK2VtcHR5LW1hcCAgICAgOjo9IGAwYAorbm9uLWVtcHR5LW1hcCA6Oj0gc2l6ZSBrZXktZWxlbWVudC10eXBlIHZhbHVlLWVsZW1lbnQtdHlwZSAoa2V5IHZhbHVlKSsKK2BgYAorCitgYGAKK0NvbXBhY3QgcHJvdG9jb2wgbWFwIGhlYWRlciAoMSBieXRlLCBlbXB0eSBtYXApOgorKy0tLS0tLS0tKworfDAwMDAwMDAwfAorKy0tLS0tLS0tKworCitDb21wYWN0IHByb3RvY29sIG1hcCBoZWFkZXIgKDIrIGJ5dGVzLCBub24gZW1wdHkgbWFwKSBhbmQga2V5IHZhbHVlIHBhaXJzOgorKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8IHNpemUgICAgICAgICAgICAgICAgfGtra2t2dnZ2fCBrZXkgdmFsdWUgcGFpcnMgICAgIHwKKystLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGBzaXplYCBpcyB0aGUgc2l6ZSwgYSB2YXIgaW50IChpbnQzMiksIHN0cmljdGx5IHBvc2l0aXZlIHZhbHVlcworKiBga2tra2AgaXMgdGhlIGtleSBlbGVtZW50LXR5cGUsIGEgNCBiaXQgdW5zaWduZWQgaW50CisqIGB2dnZ2YCBpcyB0aGUgdmFsdWUgZWxlbWVudC10eXBlLCBhIDQgYml0IHVuc2lnbmVkIGludAorKiBga2V5IHZhbHVlIHBhaXJzYCBhcmUgdGhlIGVuY29kZWQga2V5cyBhbmQgdmFsdWVzCisKK1RoZSBlbGVtZW50LXR5cGVzIGFyZSB0aGUgc2FtZSBhcyBmb3IgbGlzdHMuIFRoZSBmdWxsIGxpc3QgaXMgaW5jbHVkZWQgaW4gdGhlICdMaXN0IGFuZCBzZXQnIHNlY3Rpb24uCisKK1RoZSBtYXhpbXVtIG1hcCBzaXplIGlzIGNvbmZpZ3VyYWJsZS4gQnkgZGVmYXVsdCB0aGVyZSBpcyBubyBsaW1pdCAobWVhbmluZyB0aGUgbGltaXQgaXMgdGhlIG1heGltdW0gaW50MzIgdmFsdWU6CisyMTQ3NDgzNjQ3KS4KKworIyBCTkYgbm90YXRpb24gdXNlZCBpbiB0aGlzIGRvY3VtZW50CisKK1RoZSBmb2xsb3dpbmcgQk5GIG5vdGF0aW9uIGlzIHVzZWQ6CisKKyogYSBwbHVzIGArYCBhcHBlbmRlZCB0byBhbiBpdGVtIHJlcHJlc2VudHMgcmVwZXRpdGlvbjsgdGhlIGl0ZW0gaXMgcmVwZWF0ZWQgMSBvciBtb3JlIHRpbWVzCisqIGEgc3RhciBgKmAgYXBwZW5kZWQgdG8gYW4gaXRlbSByZXByZXNlbnRzIG9wdGlvbmFsIHJlcGV0aXRpb247IHRoZSBpdGVtIGlzIHJlcGVhdGVkIDAgb3IgbW9yZSB0aW1lcworKiBhIHBpcGUgYHxgIGJldHdlZW4gaXRlbXMgcmVwcmVzZW50cyBjaG9pY2UsIHRoZSBmaXJzdCBtYXRjaGluZyBpdGVtIGlzIHNlbGVjdGVkCisqIHBhcmVudGhlc2lzIGAoYCBhbmQgYClgIGFyZSB1c2VkIGZvciBncm91cGluZyBtdWx0aXBsZSBpdGVtcwpkaWZmIC0tZ2l0IGEvZG9jL3NwZWNzL3RocmlmdC1wcm90b2NvbC1zcGVjLm1kIGIvZG9jL3NwZWNzL3RocmlmdC1wcm90b2NvbC1zcGVjLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMWE2MWMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3BlY3MvdGhyaWZ0LXByb3RvY29sLXNwZWMubWQKQEAgLTAsMCArMSwxMDEgQEAKK1RocmlmdCBQcm90b2NvbCBTdHJ1Y3R1cmUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0xhc3QgTW9kaWZpZWQ6IDIwMDctSnVuLTI5CisKKzwhLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0+CisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIFRocmlmdCBwcm90b2NvbAord2l0aG91dCBzcGVjaWZ5aW5nIHRoZSBlbmNvZGluZy4gVGh1cywgdGhlIG9yZGVyIG9mIGVsZW1lbnRzCitjb3VsZCBpbiBzb21lIGNhc2VzIGJlIHJlYXJyYW5nZWQgZGVwZW5kaW5nIHVwb24gdGhlIFRQcm90b2NvbAoraW1wbGVtZW50YXRpb24sIGJ1dCB0aGlzIGRvY3VtZW50IHNwZWNpZmllcyB0aGUgbWluaW11bSByZXF1aXJlZAorc3RydWN0dXJlLiBUaGVyZSBhcmUgc29tZSAiZHVtYiIgdGVybWluYWxzIGxpa2UgU1RSSU5HIGFuZCBJTlQKK3RoYXQgdGFrZSB0aGUgcGxhY2Ugb2YgYW4gYWN0dWFsIGVuY29kaW5nIHNwZWNpZmljYXRpb24uCisKK1RoZXkga2V5IHBvaW50IHRvIG5vdGljZSBpcyB0aGF0IEFMTCBtZXNzYWdlcyBhcmUganVzdCBvbmUgd3JhcHBlZAorYDxzdHJ1Y3Q+YC4gRGVwZW5kaW5nIHVwb24gdGhlIG1lc3NhZ2UgdHlwZSwgdGhlIGA8c3RydWN0PmAgY2FuIGJlCitpbnRlcnByZXRlZCBhcyB0aGUgYXJndW1lbnQgbGlzdCB0byBhIGZ1bmN0aW9uLCB0aGUgcmV0dXJuIHZhbHVlCitvZiBhIGZ1bmN0aW9uLCBvciBhbiBleGNlcHRpb24uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2BgYAorICAgICAgIDxtZXNzYWdlPiA6Oj0gPG1lc3NhZ2UtYmVnaW4+IDxzdHJ1Y3Q+IDxtZXNzYWdlLWVuZD4KKworIDxtZXNzYWdlLWJlZ2luPiA6Oj0gPG1ldGhvZC1uYW1lPiA8bWVzc2FnZS10eXBlPiA8bWVzc2FnZS1zZXFpZD4KKworICAgPG1ldGhvZC1uYW1lPiA6Oj0gU1RSSU5HCisKKyAgPG1lc3NhZ2UtdHlwZT4gOjo9IFRfQ0FMTCB8IFRfUkVQTFkgfCBUX0VYQ0VQVElPTiB8IFRfT05FV0FZCisKKyA8bWVzc2FnZS1zZXFpZD4gOjo9IEkzMgorCisgICAgICAgIDxzdHJ1Y3Q+IDo6PSA8c3RydWN0LWJlZ2luPiA8ZmllbGQ+KiA8ZmllbGQtc3RvcD4gPHN0cnVjdC1lbmQ+CisKKyAgPHN0cnVjdC1iZWdpbj4gOjo9IDxzdHJ1Y3QtbmFtZT4KKworICAgPHN0cnVjdC1uYW1lPiA6Oj0gU1RSSU5HCisKKyAgICA8ZmllbGQtc3RvcD4gOjo9IFRfU1RPUAorCisgICAgICAgICA8ZmllbGQ+IDo6PSA8ZmllbGQtYmVnaW4+IDxmaWVsZC1kYXRhPiA8ZmllbGQtZW5kPgorCisgICA8ZmllbGQtYmVnaW4+IDo6PSA8ZmllbGQtbmFtZT4gPGZpZWxkLXR5cGU+IDxmaWVsZC1pZD4KKworICAgIDxmaWVsZC1uYW1lPiA6Oj0gU1RSSU5HCisKKyAgICA8ZmllbGQtdHlwZT4gOjo9IFRfQk9PTCB8IFRfQllURSB8IFRfSTggfCBUX0kxNiB8IFRfSTMyIHwgVF9JNjQgfCBUX0RPVUJMRQorICAgICAgICAgICAgICAgICAgICAgfCBUX1NUUklORyB8IFRfQklOQVJZIHwgVF9TVFJVQ1QgfCBUX01BUCB8IFRfU0VUIHwgVF9MSVNUCisKKyAgICAgIDxmaWVsZC1pZD4gOjo9IEkxNgorCisgICAgPGZpZWxkLWRhdGE+IDo6PSBJOCB8IEkxNiB8IEkzMiB8IEk2NCB8IERPVUJMRSB8IFNUUklORyB8IEJJTkFSWQorICAgICAgICAgICAgICAgICAgICAgPHN0cnVjdD4gfCA8bWFwPiB8IDxsaXN0PiB8IDxzZXQ+CisKKyAgICAgICAgICAgPG1hcD4gOjo9IDxtYXAtYmVnaW4+IDxmaWVsZC1kYXR1bT4qIDxtYXAtZW5kPgorCisgICAgIDxtYXAtYmVnaW4+IDo6PSA8bWFwLWtleS10eXBlPiA8bWFwLXZhbHVlLXR5cGU+IDxtYXAtc2l6ZT4KKworICA8bWFwLWtleS10eXBlPiA6Oj0gPGZpZWxkLXR5cGU+CisKKzxtYXAtdmFsdWUtdHlwZT4gOjo9IDxmaWVsZC10eXBlPgorCisgICAgICA8bWFwLXNpemU+IDo6PSBJMzIKKworICAgICAgICAgIDxsaXN0PiA6Oj0gPGxpc3QtYmVnaW4+IDxmaWVsZC1kYXRhPiogPGxpc3QtZW5kPgorCisgICAgPGxpc3QtYmVnaW4+IDo6PSA8bGlzdC1lbGVtLXR5cGU+IDxsaXN0LXNpemU+CisKKzxsaXN0LWVsZW0tdHlwZT4gOjo9IDxmaWVsZC10eXBlPgorCisgICAgIDxsaXN0LXNpemU+IDo6PSBJMzIKKworICAgICAgICAgICA8c2V0PiA6Oj0gPHNldC1iZWdpbj4gPGZpZWxkLWRhdGE+KiA8c2V0LWVuZD4KKworICAgICA8c2V0LWJlZ2luPiA6Oj0gPHNldC1lbGVtLXR5cGU+IDxzZXQtc2l6ZT4KKworIDxzZXQtZWxlbS10eXBlPiA6Oj0gPGZpZWxkLXR5cGU+CisKKyAgICAgIDxzZXQtc2l6ZT4gOjo9IEkzMgorYGBgCmRpZmYgLS1naXQgYS9kb2Mvc3BlY3MvdGhyaWZ0LXJwYy5tZCBiL2RvYy9zcGVjcy90aHJpZnQtcnBjLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NWMwNmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3BlY3MvdGhyaWZ0LXJwYy5tZApAQCAtMCwwICsxLDE3OCBAQAorVGhyaWZ0IFJlbW90ZSBQcm9jZWR1cmUgQ2FsbAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis8IS0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tPgorCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgaGlnaCBsZXZlbCBtZXNzYWdlIGV4Y2hhbmdlIGJldHdlZW4gdGhlIFRocmlmdCBSUEMgY2xpZW50IGFuZCBzZXJ2ZXIuCitTZWUgW3RocmlmdC1iaW5hcnktcHJvdG9jb2wubWRdIGFuZCBbdGhyaWZ0LWNvbXBhY3QtcHJvdG9jb2wubWRdIGZvciBhIGRlc2NyaXB0aW9uIG9mIGhvdyB0aGUgZXhjaGFuZ2VzIGFyZSBlbmNvZGVkIG9uCit0aGUgd2lyZS4KKworSW4gYWRkaXRpb24sIHRoaXMgZG9jdW1lbnQgY29tcGFyZXMgdGhlIGJpbmFyeSBwcm90b2NvbCB3aXRoIHRoZSBjb21wYWN0IHByb3RvY29sLiBGaW5hbGx5IGl0IGRlc2NyaWJlcyB0aGUgZnJhbWVkIHZzLgordW5mcmFtZWQgdHJhbnNwb3J0LgorCitUaGUgaW5mb3JtYXRpb24gaGVyZSBpcyBfbW9zdGx5XyBiYXNlZCBvbiB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgQXBhY2hlIHRocmlmdCBsaWJyYXJ5ICh2ZXJzaW9uIDAuOS4xIGFuZAorMC45LjMpLiBPdGhlciBpbXBsZW1lbnRhdGlvbiBob3dldmVyLCBzaG91bGQgYmVoYXZlIHRoZSBzYW1lLgorCitGb3IgYmFja2dyb3VuZCBvbiBUaHJpZnQgc2VlIHRoZSBbVGhyaWZ0IHdoaXRlcGFwZXIgKHBkZildKGh0dHBzOi8vdGhyaWZ0LmFwYWNoZS5vcmcvc3RhdGljL2ZpbGVzL3RocmlmdC0yMDA3MDQwMS5wZGYpLgorCisjIENvbnRlbnRzCisKKyogVGhyaWZ0IE1lc3NhZ2UgZXhjaGFuZ2UgZm9yIFJlbW90ZSBQcm9jZWR1cmUgQ2FsbAorICAqIE1lc3NhZ2UKKyAgKiBSZXF1ZXN0IHN0cnVjdAorICAqIFJlc3BvbnNlIHN0cnVjdAorKiBQcm90b2NvbCBjb25zaWRlcmF0aW9ucworICAqIENvbXBhcmluZyBiaW5hcnkgYW5kIGNvbXBhY3QgcHJvdG9jb2wKKyAgKiBDb21wYXRpYmlsaXR5CisgICogRnJhbWVkIHZzIHVuZnJhbWVkIHRyYW5zcG9ydAorCisjIFRocmlmdCBSZW1vdGUgUHJvY2VkdXJlIENhbGwgTWVzc2FnZSBleGNoYW5nZQorCitCb3RoIHRoZSBiaW5hcnkgcHJvdG9jb2wgYW5kIHRoZSBjb21wYWN0IHByb3RvY29sIGFzc3VtZSBhIHRyYW5zcG9ydCBsYXllciB0aGF0IGV4cG9zZXMgYSBiaS1kaXJlY3Rpb25hbCBieXRlIHN0cmVhbSwKK2ZvciBleGFtcGxlIGEgVENQIHNvY2tldC4gQm90aCB1c2UgdGhlIGZvbGxvd2luZyBleGNoYW5nZToKKworMS4gQ2xpZW50IHNlbmRzIGEgYE1lc3NhZ2VgICh0eXBlIGBDYWxsYCBvciBgT25ld2F5YCkuIFRoZSBUTWVzc2FnZSBjb250YWlucyBzb21lIG1ldGFkYXRhIGFuZCB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kCisgICB0byBpbnZva2UuCisyLiBDbGllbnQgc2VuZHMgbWV0aG9kIGFyZ3VtZW50cyAoYSBzdHJ1Y3QgZGVmaW5lZCBieSB0aGUgZ2VuZXJhdGUgY29kZSkuCiszLiBTZXJ2ZXIgc2VuZHMgYSBgTWVzc2FnZWAgKHR5cGUgYFJlcGx5YCBvciBgRXhjZXB0aW9uYCkgdG8gc3RhcnQgdGhlIHJlc3BvbnNlLgorNC4gU2VydmVyIHNlbmRzIGEgc3RydWN0IGNvbnRhaW5pbmcgdGhlIG1ldGhvZCByZXN1bHQgb3IgZXhjZXB0aW9uLgorCitUaGUgcGF0dGVybiBpcyBhIHNpbXBsZSBoYWxmIGR1cGxleCBwcm90b2NvbCB3aGVyZSB0aGUgcGFydGllcyBhbHRlcm5hdGUgaW4gc2VuZGluZyBhIGBNZXNzYWdlYCBmb2xsb3dlZCBieSBhIHN0cnVjdC4KK1doYXQgdGhlc2UgYXJlIGlzIGRlc2NyaWJlZCBiZWxvdy4KKworQWx0aG91Z2ggdGhlIHN0YW5kYXJkIEFwYWNoZSBUaHJpZnQgSmF2YSBjbGllbnRzIGRvIG5vdCBzdXBwb3J0IHBpcGVsaW5pbmcgKHNlbmRpbmcgbXVsdGlwbGUgcmVxdWVzdHMgd2l0aG91dCB3YWl0aW5nCitmb3IgYW4gcmVzcG9uc2UpLCB0aGUgc3RhbmRhcmQgQXBhY2hlIFRocmlmdCBKYXZhIHNlcnZlcnMgZG8gc3VwcG9ydCBpdC4KKworIyMgTWVzc2FnZQorCitBICpNZXNzYWdlKiBjb250YWluczoKKworKiBfTmFtZV8sIGEgc3RyaW5nIChjYW4gYmUgZW1wdHkpLgorKiBfTWVzc2FnZSB0eXBlXywgYSBtZXNzYWdlIHR5cGVzLCBvbmUgb2YgYENhbGxgLCBgUmVwbHlgLCBgRXhjZXB0aW9uYCBhbmQgYE9uZXdheWAuCisqIF9TZXF1ZW5jZSBpZF8sIGEgc2lnbmVkIGludDMyIGludGVnZXIuCisKK1RoZSAqc2VxdWVuY2UgaWQqIGlzIGEgc2ltcGxlIG1lc3NhZ2UgaWQgYXNzaWduZWQgYnkgdGhlIGNsaWVudC4gVGhlIHNlcnZlciB3aWxsIHVzZSB0aGUgc2FtZSBzZXF1ZW5jZSBpZCBpbiB0aGUKK21lc3NhZ2Ugb2YgdGhlIHJlc3BvbnNlLiBUaGUgY2xpZW50IHVzZXMgdGhpcyBudW1iZXIgdG8gZGV0ZWN0IG91dCBvZiBvcmRlciByZXNwb25zZXMuIEVhY2ggY2xpZW50IGhhcyBhbiBpbnQzMiBmaWVsZAord2hpY2ggaXMgaW5jcmVhc2VkIGZvciBlYWNoIG1lc3NhZ2UuIFRoZSBzZXF1ZW5jZSBpZCBzaW1wbHkgd3JhcHMgYXJvdW5kIHdoZW4gaXQgb3ZlcmZsb3dzLgorCitUaGUgKm5hbWUqIGluZGljYXRlcyB0aGUgc2VydmljZSBtZXRob2QgbmFtZSB0byBpbnZva2UuIFRoZSBzZXJ2ZXIgY29waWVzIHRoZSBuYW1lIGluIHRoZSByZXNwb25zZSBtZXNzYWdlLgorCitXaGVuIHRoZSAqbXVsdGlwbGV4ZWQgcHJvdG9jb2wqIGlzIHVzZWQsIHRoZSBuYW1lIGNvbnRhaW5zIHRoZSBzZXJ2aWNlIG5hbWUsIGEgY29sb24gYDpgIGFuZCB0aGUgbWV0aG9kIG5hbWUuIFRoZQorbXVsdGlwbGV4ZWQgcHJvdG9jb2wgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBvdGhlciBwcm90b2NvbHMuCisKK1RoZSAqbWVzc2FnZSB0eXBlKiBpbmRpY2F0ZXMgd2hhdCBraW5kIG9mIG1lc3NhZ2UgaXMgc2VudC4gQ2xpZW50cyBzZW5kIHJlcXVlc3RzIHdpdGggVE1lc3NhZ2VzIG9mIHR5cGUgYENhbGxgIG9yCitgT25ld2F5YCAoc3RlcCAxIGluIHRoZSBwcm90b2NvbCBleGNoYW5nZSkuIFNlcnZlcnMgc2VuZCByZXNwb25zZXMgd2l0aCBtZXNzYWdlcyBvZiB0eXBlIGBFeGNlcHRpb25gIG9yIGBSZXBseWAgKHN0ZXAKKzMpLgorCitUeXBlIGBSZXBseWAgaXMgdXNlZCB3aGVuIHRoZSBzZXJ2aWNlIG1ldGhvZCBjb21wbGV0ZXMgbm9ybWFsbHkuIFRoYXQgaXMsIGl0IHJldHVybnMgYSB2YWx1ZSBvciBpdCB0aHJvd3Mgb25lIG9mIHRoZQorZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSBUaHJpZnQgSURMIGZpbGUuCisKK1R5cGUgYEV4Y2VwdGlvbmAgaXMgdXNlZCBmb3Igb3RoZXIgZXhjZXB0aW9ucy4gVGhhdCBpczogd2hlbiB0aGUgc2VydmljZSBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiB0aGF0IGlzIG5vdCBkZWNsYXJlZAoraW4gdGhlIFRocmlmdCBJREwgZmlsZSwgb3Igc29tZSBvdGhlciBwYXJ0IG9mIHRoZSBUaHJpZnQgc3RhY2sgdGhyb3dzIGFuIGV4Y2VwdGlvbi4gRm9yIGV4YW1wbGUgd2hlbiB0aGUgc2VydmVyIGNvdWxkCitub3QgZW5jb2RlIG9yIGRlY29kZSBhIG1lc3NhZ2Ugb3Igc3RydWN0LgorCitJbiB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbiAoMC45LjMpIHRoZXJlIGlzIGRpZmZlcmVudCBiZWhhdmlvciBmb3IgdGhlIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgc2VydmVyLiBJbiB0aGUgYXN5bmMKK3NlcnZlciBhbGwgZXhjZXB0aW9ucyBhcmUgc2VuZCBhcyBhIGBUQXBwbGljYXRpb25FeGNlcHRpb25gIChzZWUgJ1Jlc3BvbnNlIHN0cnVjdCcgYmVsb3cpLiBJbiB0aGUgc3luY2hyb25vdXMgSmF2YQoraW1wbGVtZW50YXRpb24gb25seSAodW5kZWNsYXJlZCkgZXhjZXB0aW9ucyB0aGF0IGV4dGVuZCBgVEV4Y2VwdGlvbmAgYXJlIHNlbmQgYXMgYSBgVEFwcGxpY2F0aW9uRXhjZXB0aW9uYC4gVW5jaGVja2VkCitleGNlcHRpb25zIGxlYWQgdG8gYW4gaW1tZWRpYXRlIGNsb3NlIG9mIHRoZSBjb25uZWN0aW9uLgorCitUeXBlIGBPbmV3YXlgIGlzIG9ubHkgdXNlZCBzdGFydGluZyBmcm9tIEFwYWNoZSBUaHJpZnQgMC45LjMuIEVhcmxpZXIgdmVyc2lvbnMgZG8gX25vdF8gc2VuZCBUTWVzc2FnZXMgb2YgdHlwZSBgT25ld2F5YCwKK2V2ZW4gZm9yIHNlcnZpY2UgbWV0aG9kcyBkZWZpbmVkIHdpdGggdGhlIGBvbmV3YXlgIG1vZGlmaWVyLgorCitXaGVuIGNsaWVudCBzZW5kcyBhIHJlcXVlc3Qgd2l0aCB0eXBlIGBPbmV3YXlgLCB0aGUgc2VydmVyIG11c3QgX25vdF8gc2VuZCBhIHJlc3BvbnNlIChzdGVwcyAzIGFuZCA0IGFyZSBza2lwcGVkKS4gTm90ZQordGhhdCB0aGUgVGhyaWZ0IElETCBlbmZvcmNlcyBhIHJldHVybiB0eXBlIG9mIGB2b2lkYCBhbmQgZG9lcyBub3QgYWxsb3cgZXhjZXB0aW9ucyBmb3Igb25ld2F5IHNlcnZpY2VzLgorCisjIyBSZXF1ZXN0IHN0cnVjdAorCitUaGUgc3RydWN0IHRoYXQgZm9sbG93cyB0aGUgbWVzc2FnZSBvZiB0eXBlIGBDYWxsYCBvciBgT25ld2F5YCBjb250YWlucyB0aGUgYXJndW1lbnRzIG9mIHRoZSBzZXJ2aWNlIG1ldGhvZC4gVGhlCithcmd1bWVudCBpZHMgY29ycmVzcG9uZCB0byB0aGUgZmllbGQgaWRzLiBUaGUgbmFtZSBvZiB0aGUgc3RydWN0IGlzIHRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgd2l0aCBgX2FyZ3NgIGFwcGVuZGVkLgorRm9yIG1ldGhvZHMgd2l0aG91dCBhcmd1bWVudHMgYW4gc3RydWN0IGlzIHNlbnQgd2l0aG91dCBmaWVsZHMuCisKKyMjIFJlc3BvbnNlIHN0cnVjdAorCitUaGUgc3RydWN0IHRoYXQgZm9sbG93cyB0aGUgbWVzc2FnZSBvZiB0eXBlIGBSZXBseWAgYXJlIHN0cnVjdHMgaW4gd2hpY2ggZXhhY3RseSAxIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRzIGlzIGVuY29kZWQ6CisKKyogQSBmaWVsZCB3aXRoIG5hbWUgYHN1Y2Nlc3NgIGFuZCBpZCBgMGAsIHVzZWQgaW4gY2FzZSB0aGUgbWV0aG9kIGNvbXBsZXRlZCBub3JtYWxseS4KKyogQW4gZXhjZXB0aW9uIGZpZWxkLCBuYW1lIGFuZCBpZCBhcmUgYXMgZGVmaW5lZCBpbiB0aGUgYHRocm93c2AgY2xhdXNlIGluIHRoZSBUaHJpZnQgSURMJ3Mgc2VydmljZSBtZXRob2QgZGVmaW5pdGlvbi4KKworV2hlbiB0aGUgbWVzc2FnZSBpcyBvZiB0eXBlIGBFeGNlcHRpb25gIHRoZSBzdHJ1Y3QgaXMgZW5jb2RlZCBhcyBpZiBpdCB3YXMgZGVjbGFyZWQgYnkgdGhlIGZvbGxvd2luZyBJREw6CisKK2BgYAorZXhjZXB0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgIDE6IHN0cmluZyBtZXNzYWdlLAorICAyOiBpMzIgdHlwZQorfQorYGBgCisKK1RoZSBmb2xsb3dpbmcgZXhjZXB0aW9uIHR5cGVzIGFyZSBkZWZpbmVkIGluIHRoZSBqYXZhIGltcGxlbWVudGF0aW9uICgwLjkuMyk6CisKKyogX3Vua25vd25fOiAwLCB1c2VkIGluIGNhc2UgdGhlIHR5cGUgZnJvbSB0aGUgcGVlciBpcyB1bmtub3duLgorKiBfdW5rbm93biBtZXRob2RfOiAxLCB1c2VkIGluIGNhc2UgdGhlIG1ldGhvZCByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudCBpcyB1bmtub3duIGJ5IHRoZSBzZXJ2ZXIuCisqIF9pbnZhbGlkIG1lc3NhZ2UgdHlwZV86IDIsIG5vIHVzYWdlIHdhcyBmb3VuZC4KKyogX3dyb25nIG1ldGhvZCBuYW1lXzogMywgbm8gdXNhZ2Ugd2FzIGZvdW5kLgorKiBfYmFkIHNlcXVlbmNlIGlkXzogNCwgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjbGllbnQgdG8gaW5kaWNhdGUgYSB3cm9uZyBzZXF1ZW5jZSBpZCBpbiB0aGUgcmVzcG9uc2UuCisqIF9taXNzaW5nIHJlc3VsdF86IDUsIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY2xpZW50IHRvIGluZGljYXRlIGEgcmVzcG9uc2Ugd2l0aG91dCBhbnkgZmllbGQgKHJlc3VsdCBub3IgZXhjZXB0aW9uKS4KKyogX2ludGVybmFsIGVycm9yXzogNiwgdXNlZCB3aGVuIHRoZSBzZXJ2ZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbiB0aGF0IGlzIG5vdCBkZWNsYXJlZCBpbiB0aGUgVGhyaWZ0IElETCBmaWxlLiAKKyogX3Byb3RvY29sIGVycm9yXzogNywgdXNlZCB3aGVuIHNvbWV0aGluZyBnb2VzIHdyb25nIGR1cmluZyBkZWNvZGluZy4gRm9yIGV4YW1wbGUgd2hlbiBhIGxpc3QgaXMgdG9vIGxvbmcgb3IgYSByZXF1aXJlZAorIGZpZWxkIGlzIG1pc3NpbmcuIAorKiBfaW52YWxpZCB0cmFuc2Zvcm1fOiA4LCBubyB1c2FnZSB3YXMgZm91bmQuCisqIF9pbnZhbGlkIHByb3RvY29sXzogOSwgbm8gdXNhZ2Ugd2FzIGZvdW5kLgorKiBfdW5zdXBwb3J0ZWQgY2xpZW50IHR5cGVfOiAxMCwgbm8gdXNhZ2Ugd2FzIGZvdW5kLgorCisjIFByb3RvY29sIGNvbnNpZGVyYXRpb25zCisKKyMjIENvbXBhcmluZyBiaW5hcnkgYW5kIGNvbXBhY3QgcHJvdG9jb2wKKworVGhlIGJpbmFyeSBwcm90b2NvbCBpcyBmYWlybHkgc2ltcGxlIGFuZCB0aGVyZWZvcmUgZWFzeSB0byBwcm9jZXNzLiBUaGUgY29tcGFjdCBwcm90b2NvbCBuZWVkcyBsZXNzIGJ5dGVzIHRvIHNlbmQgdGhlCitzYW1lIGRhdGEgYXQgdGhlIGNvc3Qgb2YgYWRkaXRpb25hbCBwcm9jZXNzaW5nLiBBcyBiYW5kd2lkdGggaXMgdXN1YWxseSB0aGUgYm90dGxlbmVjaywgdGhlIGNvbXBhY3QgcHJvdG9jb2wgaXMgYWxtb3N0CithbHdheXMgc2xpZ2h0bHkgZmFzdGVyLgorCisjIyBDb21wYXRpYmlsaXR5CisKK0Egc2VydmVyIGNvdWxkIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHdoZXRoZXIgYSBjbGllbnQgdGFsa3MgdGhlIGJpbmFyeSBwcm90b2NvbCBvciB0aGUgY29tcGFjdCBwcm90b2NvbCBieQoraW52ZXN0aWdhdGluZyB0aGUgZmlyc3QgYnl0ZS4gSWYgdGhlIHZhbHVlIGlzIGAxMDAwIDAwMDFgIG9yIGAwMDAwIDAwMDBgIChhc3N1bWluZyBhIG5hbWUgc2hvcnRlciB0aGVuIMKxMTYgTUIpIGl0IGlzIHRoZQorYmluYXJ5IHByb3RvY29sLiBXaGVuIHRoZSB2YWx1ZSBpcyBgMTAwMCAwMDEwYCBpdCBpcyB0YWxraW5nIHRoZSBjb21wYWN0IHByb3RvY29sLgorCisjIyBGcmFtZWQgdnMuIHVuZnJhbWVkIHRyYW5zcG9ydAorCitUaGUgZmlyc3QgdGhyaWZ0IGJpbmFyeSB3aXJlIGZvcm1hdCB3YXMgdW5mcmFtZWQuIFRoaXMgbWVhbnMgdGhhdCBpbmZvcm1hdGlvbiBpcyBzZW50IG91dCBpbiBhIHNpbmdsZSBzdHJlYW0gb2YgYnl0ZXMuCitXaXRoIHVuZnJhbWVkIHRyYW5zcG9ydCB0aGUgKGdlbmVyYXRlZCkgcHJvY2Vzc29ycyB3aWxsIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgc29ja2V0ICh0aG91Z2ggQXBhY2hlIFRocmlmdCBkb2VzIHRyeSB0bworZ3JhYiBhbGwgYXZhaWxhYmxlIGJ5dGVzIGZyb20gdGhlIHNvY2tldCBpbiBhIGJ1ZmZlciB3aGVuIGl0IGNhbikuCisKK0xhdGVyLCBUaHJpZnQgaW50cm9kdWNlZCB0aGUgZnJhbWVkIHRyYW5zcG9ydC4KKworV2l0aCBmcmFtZWQgdHJhbnNwb3J0IHRoZSBmdWxsIHJlcXVlc3QgYW5kIHJlc3BvbnNlICh0aGUgVE1lc3NhZ2UgYW5kIHRoZSBmb2xsb3dpbmcgc3RydWN0KSBhcmUgZmlyc3Qgd3JpdHRlbiB0byBhCitidWZmZXIuIFRoZW4gd2hlbiB0aGUgc3RydWN0IGlzIGNvbXBsZXRlICh0cmFuc3BvcnQgbWV0aG9kIGBmbHVzaGAgaXMgaGlqYWNrZWQgZm9yIHRoaXMpLCB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgaXMKK3dyaXR0ZW4gdG8gdGhlIHNvY2tldCBmaXJzdCwgZm9sbG93ZWQgYnkgdGhlIGJ1ZmZlcmVkIGJ5dGVzLiBUaGUgY29tYmluYXRpb24gaXMgY2FsbGVkIGEgX2ZyYW1lXy4gT24gdGhlIHJlY2VpdmVyIHNpZGUKK3RoZSBjb21wbGV0ZSBmcmFtZSBpcyBmaXJzdCByZWFkIGluIGEgYnVmZmVyIGJlZm9yZSB0aGUgbWVzc2FnZSBpcyBwYXNzZWQgdG8gYSBwcm9jZXNzb3IuCisKK1RoZSBsZW5ndGggcHJlZml4IGlzIGEgNCBieXRlIHNpZ25lZCBpbnQsIHNlbmQgaW4gbmV0d29yayAoYmlnIGVuZGlhbikgb3JkZXIuCitUaGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZTogYDBgIDw9IGxlbmd0aCA8PSBgMTYzODQwMDBgICgxNk0pLgorCitGcmFtZWQgdHJhbnNwb3J0IHdhcyBpbnRyb2R1Y2VkIHRvIGVhc2UgdGhlIGltcGxlbWVudGF0aW9uIG9mIGFzeW5jIHByb2Nlc3NvcnMuIEFuIGFzeW5jIHByb2Nlc3NvciBpcyBvbmx5IGludm9rZWQgd2hlbgorYWxsIGRhdGEgaXMgcmVjZWl2ZWQuIFVuZm9ydHVuYXRlbHksIGZyYW1lZCB0cmFuc3BvcnQgaXMgbm90IGlkZWFsIGZvciBsYXJnZSBtZXNzYWdlcyBhcyB0aGUgZW50aXJlIGZyYW1lIHN0YXlzIGluCittZW1vcnkgdW50aWwgdGhlIG1lc3NhZ2UgaGFzIGJlZW4gcHJvY2Vzc2VkLiBJbiBhZGRpdGlvbiwgdGhlIGphdmEgaW1wbGVtZW50YXRpb24gbWVyZ2VzIHRoZSBpbmNvbWluZyBkYXRhIHRvIGEgc2luZ2xlLAorZ3Jvd2luZyBieXRlIGFycmF5LiBFdmVyeSB0aW1lIHRoZSBieXRlIGFycmF5IGlzIGZ1bGwgaXQgbmVlZHMgdG8gYmUgY29waWVkIHRvIGEgbmV3IGxhcmdlciBieXRlIGFycmF5LgorCitGcmFtZWQgYW5kIHVuZnJhbWVkIHRyYW5zcG9ydHMgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZWFjaCBvdGhlci4KZGlmZiAtLWdpdCBhL2RvYy90aHJpZnQtc2FzbC1zcGVjLnR4dCBiL2RvYy9zcGVjcy90aHJpZnQtc2FzbC1zcGVjLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL3RocmlmdC1zYXNsLXNwZWMudHh0CnJlbmFtZSB0byBkb2Mvc3BlY3MvdGhyaWZ0LXNhc2wtc3BlYy50eHQKZGlmZiAtLWdpdCBhL2RvYy90aHJpZnQudGV4IGIvZG9jL3NwZWNzL3RocmlmdC50ZXgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy90aHJpZnQudGV4CnJlbmFtZSB0byBkb2Mvc3BlY3MvdGhyaWZ0LnRleApkaWZmIC0tZ2l0IGEvZG9jL3RocmlmdC5ibmYgYi9kb2MvdGhyaWZ0LmJuZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRkODNmNi4uMDAwMDAwMAotLS0gYS9kb2MvdGhyaWZ0LmJuZgorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLVRocmlmdCBQcm90b2NvbCBTdHJ1Y3R1cmUKLQotTGFzdCBNb2RpZmllZDogMjAwNy1KdW4tMjkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIFRocmlmdCBwcm90b2NvbAotd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSBlbmNvZGluZy4gVGh1cywgdGhlIG9yZGVyIG9mIGVsZW1lbnRzCi1jb3VsZCBpbiBzb21lIGNhc2VzIGJlIHJlYXJyYW5nZWQgZGVwZW5kaW5nIHVwb24gdGhlIFRQcm90b2NvbAotaW1wbGVtZW50YXRpb24sIGJ1dCB0aGlzIGRvY3VtZW50IHNwZWNpZmllcyB0aGUgbWluaW11bSByZXF1aXJlZAotc3RydWN0dXJlLiBUaGVyZSBhcmUgc29tZSAiZHVtYiIgdGVybWluYWxzIGxpa2UgU1RSSU5HIGFuZCBJTlQKLXRoYXQgdGFrZSB0aGUgcGxhY2Ugb2YgYW4gYWN0dWFsIGVuY29kaW5nIHNwZWNpZmljYXRpb24uCi0KLVRoZXkga2V5IHBvaW50IHRvIG5vdGljZSBpcyB0aGF0IEFMTCBtZXNzYWdlcyBhcmUganVzdCBvbmUgd3JhcHBlZAotPHN0cnVjdD4uIERlcGVuZGluZyB1cG9uIHRoZSBtZXNzYWdlIHR5cGUsIHRoZSA8c3RydWN0PiBjYW4gYmUKLWludGVycHJldGVkIGFzIHRoZSBhcmd1bWVudCBsaXN0IHRvIGEgZnVuY3Rpb24sIHRoZSByZXR1cm4gdmFsdWUKLW9mIGEgZnVuY3Rpb24sIG9yIGFuIGV4Y2VwdGlvbi4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgIDxtZXNzYWdlPiA6Oj0gPG1lc3NhZ2UtYmVnaW4+IDxzdHJ1Y3Q+IDxtZXNzYWdlLWVuZD4KLQotIDxtZXNzYWdlLWJlZ2luPiA6Oj0gPG1ldGhvZC1uYW1lPiA8bWVzc2FnZS10eXBlPiA8bWVzc2FnZS1zZXFpZD4KLQotICAgPG1ldGhvZC1uYW1lPiA6Oj0gU1RSSU5HCi0KLSAgPG1lc3NhZ2UtdHlwZT4gOjo9IFRfQ0FMTCB8IFRfUkVQTFkgfCBUX0VYQ0VQVElPTgotCi0gPG1lc3NhZ2Utc2VxaWQ+IDo6PSBJMzIKLQotICAgICAgICA8c3RydWN0PiA6Oj0gPHN0cnVjdC1iZWdpbj4gPGZpZWxkPiogPGZpZWxkLXN0b3A+IDxzdHJ1Y3QtZW5kPgotCi0gIDxzdHJ1Y3QtYmVnaW4+IDo6PSA8c3RydWN0LW5hbWU+Ci0KLSAgIDxzdHJ1Y3QtbmFtZT4gOjo9IFNUUklORwotCi0gICAgPGZpZWxkLXN0b3A+IDo6PSBUX1NUT1AKLQotICAgICAgICAgPGZpZWxkPiA6Oj0gPGZpZWxkLWJlZ2luPiA8ZmllbGQtZGF0YT4gPGZpZWxkLWVuZD4KLQotICAgPGZpZWxkLWJlZ2luPiA6Oj0gPGZpZWxkLW5hbWU+IDxmaWVsZC10eXBlPiA8ZmllbGQtaWQ+Ci0KLSAgICA8ZmllbGQtbmFtZT4gOjo9IFNUUklORwotCi0gICAgPGZpZWxkLXR5cGU+IDo6PSBUX0JPT0wgfCBUX0JZVEUgfCBUX0k4IHwgVF9JMTYgfCBUX0kzMiB8IFRfSTY0IHwgVF9ET1VCTEUKLSAgICAgICAgICAgICAgICAgICAgIHwgVF9TVFJJTkcgfCBUX0JJTkFSWSB8IFRfU1RSVUNUIHwgVF9NQVAgfCBUX1NFVCB8IFRfTElTVAotCi0gICAgICA8ZmllbGQtaWQ+IDo6PSBJMTYKLQotICAgIDxmaWVsZC1kYXRhPiA6Oj0gSTggfCBJMTYgfCBJMzIgfCBJNjQgfCBET1VCTEUgfCBTVFJJTkcgfCBCSU5BUlkKLSAgICAgICAgICAgICAgICAgICAgIDxzdHJ1Y3Q+IHwgPG1hcD4gfCA8bGlzdD4gfCA8c2V0PgotCi0gICAgICAgICAgIDxtYXA+IDo6PSA8bWFwLWJlZ2luPiA8ZmllbGQtZGF0dW0+KiA8bWFwLWVuZD4KLQotICAgICA8bWFwLWJlZ2luPiA6Oj0gPG1hcC1rZXktdHlwZT4gPG1hcC12YWx1ZS10eXBlPiA8bWFwLXNpemU+Ci0KLSAgPG1hcC1rZXktdHlwZT4gOjo9IDxmaWVsZC10eXBlPgotCi08bWFwLXZhbHVlLXR5cGU+IDo6PSA8ZmllbGQtdHlwZT4KLQotICAgICAgPG1hcC1zaXplPiA6Oj0gSTMyCi0KLSAgICAgICAgICA8bGlzdD4gOjo9IDxsaXN0LWJlZ2luPiA8ZmllbGQtZGF0YT4qIDxsaXN0LWVuZD4KLQotICAgIDxsaXN0LWJlZ2luPiA6Oj0gPGxpc3QtZWxlbS10eXBlPiA8bGlzdC1zaXplPgotCi08bGlzdC1lbGVtLXR5cGU+IDo6PSA8ZmllbGQtdHlwZT4KLQotICAgICA8bGlzdC1zaXplPiA6Oj0gSTMyCi0KLSAgICAgICAgICAgPHNldD4gOjo9IDxzZXQtYmVnaW4+IDxmaWVsZC1kYXRhPiogPHNldC1lbmQ+Ci0KLSAgICAgPHNldC1iZWdpbj4gOjo9IDxzZXQtZWxlbS10eXBlPiA8c2V0LXNpemU+Ci0KLSA8c2V0LWVsZW0tdHlwZT4gOjo9IDxmaWVsZC10eXBlPgotCi0gICAgICA8c2V0LXNpemU+IDo6PSBJMzIKZGlmZiAtLWdpdCBhL2R1Yi5qc29uIGIvZHViLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY3NmFmYwotLS0gL2Rldi9udWxsCisrKyBiL2R1Yi5qc29uCkBAIC0wLDAgKzEsMjggQEAKK3sKKyAgIm5hbWUiOiAiYXBhY2hlLXRocmlmdCIsCisgICJkZXNjcmlwdGlvbiI6ICJBcGFjaGUgVGhyaWZ0IEQgbGlicmFyeSIsCisgICJhdXRob3JzIjogWworICAgICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iCisgIF0sCisgICJob21lcGFnZSI6ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciLAorICAibGljZW5zZSI6ICJBcGFjaGUtMi4wIiwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAibGliZXZlbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICJ+PjIuMC4yIgorICAgIH0sCisgICAgIm9wZW5zc2wiOiB7CisgICAgICAidmVyc2lvbiI6ICI+PTEuMS42IgorICAgIH0KKyAgfSwKKyAgInN5c3RlbURlcGVuZGVuY2llcyI6ICJPbiBzeXN0ZW1zIHdpdGggbmF0aXZlIG9wZW5zc2wgMS4wLnggdXNlIGR1YiBwYWNrYWdlIG9wZW5zc2x+PjEuMSwgb24gc3lzdGVtcyB3aXRoIG5hdGl2ZSBvcGVuc3NsIDEuMS54IHVzZSBkdWIgcGFja2FnZSBvcGVuc3Nsfj4yLjAiLAorICAidGFyZ2V0VHlwZSI6ICJsaWJyYXJ5IiwKKyAgInNvdXJjZVBhdGhzIjogWworICAgICJsaWIvZC9zcmMiIAorICBdLAorICAiaW1wb3J0UGF0aHMiOiBbCisgICAgImxpYi9kL3NyYyIKKyAgXSwKKyAgImV4Y2x1ZGVkU291cmNlRmlsZXMiOiBbCisgICAgImxpYi9kL3NyYy90aHJpZnQvaW5kZXguZCIKKyAgXQorfQpkaWZmIC0tZ2l0IGEvbGliL01ha2VmaWxlLmFtIGIvbGliL01ha2VmaWxlLmFtCmluZGV4IDNiNGM4YmEuLmI2Y2UyMGUgMTAwNjQ0Ci0tLSBhL2xpYi9NYWtlZmlsZS5hbQorKysgYi9saWIvTWFrZWZpbGUuYW0KQEAgLTE3LDExICsxNywxNSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotU1VCRElSUyA9CitTVUJESVJTID0ganNvbiB4bWwKK1BSRUNST1NTX1RBUkdFVCA9CiAKIGlmIFdJVEhfQ1BQCisjIGNwcCBkaXIgaXMgcGlja2VkIGRpcmVjdGx5IGJ5IHBsdWdpbiBidWlsZAoraWYgIVdJVEhfUExVR0lOCiBTVUJESVJTICs9IGNwcAogZW5kaWYKK2VuZGlmCiAKIGlmIFdJVEhfQ19HTElCCiBTVUJESVJTICs9IGNfZ2xpYgpAQCAtMzMsOSArMzcsMTAgQEAKIAogaWYgV0lUSF9KQVZBCiBTVUJESVJTICs9IGphdmEKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1qYXZhCiAjIEphdmFTY3JpcHQgdW5pdCB0ZXN0IGRlcGVuZHMgb24gamF2YQogIyBzbyB0ZXN0IG9ubHkgaWYgamF2YSwgYW50ICYgY28gaXMgYXZhaWxhYmxlCi1TVUJESVJTICs9IGpzL3Rlc3QKK1NVQkRJUlMgKz0ganMKIGVuZGlmCiAKIGlmIFdJVEhfUFlUSE9OCkBAIC02MiwxMiArNjcsNjAgQEAKIFNVQkRJUlMgKz0gcGhwCiBlbmRpZgogCitpZiBXSVRIX0RBUlQKK1NVQkRJUlMgKz0gZGFydAorZW5kaWYKKworaWYgV0lUSF9ET1RORVRDT1JFCitTVUJESVJTICs9IG5ldGNvcmUKK2VuZGlmCisKK2lmIFdJVEhfR08KK1NVQkRJUlMgKz0gZ28KK2VuZGlmCisKK2lmIFdJVEhfRAorU1VCRElSUyArPSBkCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtZAorZW5kaWYKKworaWYgV0lUSF9OT0RFSlMKK1NVQkRJUlMgKz0gbm9kZWpzCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3Mtbm9kZWpzCitTVUJESVJTICs9IG5vZGV0cworZW5kaWYKKworaWYgV0lUSF9MVUEKK1NVQkRJUlMgKz0gbHVhCitlbmRpZgorCitpZiBXSVRIX1JTCitTVUJESVJTICs9IHJzCitlbmRpZgorCitpZiBXSVRIX0NMCitTVUJESVJTICs9IGNsCitlbmRpZgorCitpZiBXSVRIX1NXSUZUCitTVUJESVJTICs9IHN3aWZ0CitlbmRpZgorCiAjIEFsbCBvZiB0aGUgbGlicyB0aGF0IGRvbid0IHVzZSBBdXRvbWFrZSBuZWVkIHRvIGdvIGluIGhlcmUKICMgc28gdGhleSB3aWxsIGVuZCB1cCBpbiBvdXIgcmVsZWFzZSB0YXJiYWxscy4KIEVYVFJBX0RJU1QgPSBcCi0gIGNvY29hIFwKLSAgb2NhbWwgXAotICBqcyBcCi0gIGFzMyBcCi0gIHN0IFwKLSAgZ28KKwlhczMgXAorCWNvY29hIFwKKwlkIFwKKwlkYXJ0IFwKKwlkZWxwaGkgXAorCWhheGUgXAorCWphdmFtZSBcCisJanMgXAorCW9jYW1sIFwKKwlzdCBcCisJdHMKKworcHJlY3Jvc3MtJToKKwkkKE1BS0UpIC1DICQqIHByZWNyb3NzCitwcmVjcm9zczogJChQUkVDUk9TU19UQVJHRVQpCmRpZmYgLS1naXQgYS9saWIvYXMzL2J1aWxkLnByb3BlcnRpZXMgYi9saWIvYXMzL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ2MzY2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9hczMvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDUgQEAKKyMgTWF2ZW4gQW50IHRhc2tzIEphciBkZXRhaWxzCittdm4uYW50LnRhc2sudmVyc2lvbj0yLjEuMworbXZuLnJlcG89aHR0cDovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIKK212bi5hbnQudGFzay51cmw9JHttdm4ucmVwb30vb3JnL2FwYWNoZS9tYXZlbi9tYXZlbi1hbnQtdGFza3MvJHttdm4uYW50LnRhc2sudmVyc2lvbn0KK212bi5hbnQudGFzay5qYXI9bWF2ZW4tYW50LXRhc2tzLSR7bXZuLmFudC50YXNrLnZlcnNpb259LmphcgpkaWZmIC0tZ2l0IGEvbGliL2FzMy9idWlsZC54bWwgYi9saWIvYXMzL2J1aWxkLnhtbApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGFhNTIzZjAuLmIwYzRjODUKLS0tIGEvbGliL2FzMy9idWlsZC54bWwKKysrIGIvbGliL2FzMy9idWlsZC54bWwKQEAgLTcsOSArNyw5IEBACiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAKKwogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIAorCiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCkBAIC0xOSwyMyArMTksMjQgQEAKICAtLT4KIDxwcm9qZWN0IG5hbWU9ImxpYnRocmlmdC1hczMiIGRlZmF1bHQ9ImNvbXBpbGUiIGJhc2VkaXI9Ii4iCiAgIHhtbG5zOmFydGlmYWN0PSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiPgotCQorCiAgIDxwcm9wZXJ0eSBuYW1lPSJhczMuYXJ0aWZhY3RpZCIgdmFsdWU9IiR7YW50LnByb2plY3QubmFtZX0iLz4KLQkKKwogICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LnJvb3QiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uLy4uLyIvPgogICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmphdmEuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQucm9vdH0vbGliL2phdmEiLz4KICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRvb2xzLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC90b29scy8iLz4KLSAgPHByb3BlcnR5IG5hbWU9InRocmlmdF9jb21waWxlciIgdmFsdWU9IiR7dGhyaWZ0LnJvb3R9L2NvbXBpbGVyL2NwcC90aHJpZnQiLz4gCisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnRfY29tcGlsZXIiIHZhbHVlPSIke3RocmlmdC5yb290fS9jb21waWxlci9jcHAvdGhyaWZ0Ii8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke2Jhc2VkaXJ9L2J1aWxkLnByb3BlcnRpZXMiLz4KIAogICA8IS0tIGluaGVyaXQgZnJvbSB0aGUgamF2YSBidWlsZCBmaWxlIGZvciB2ZXJzaW9uIGFuZCBvdGhlciBwcm9wZXJ0aWVzIC0tPgotICA8cHJvcGVydHkgZmlsZT0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkLnByb3BlcnRpZXMiIC8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke3RocmlmdC5qYXZhLmRpcn0vZ3JhZGxlLnByb3BlcnRpZXMiIC8+CiAKICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KIAogICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ2ZXJzaW9uIiB2YWx1ZT0iJHt0aHJpZnQudmVyc2lvbn0iPgogICAgIDxpc3NldCBwcm9wZXJ0eT0icmVsZWFzZSIvPgogICA8L2NvbmRpdGlvbj4KLSAgPHByb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIke3RocmlmdC52ZXJzaW9ufS1zbmFwc2hvdCIvPgorICA8cHJvcGVydHkgbmFtZT0idmVyc2lvbiIgdmFsdWU9IiR7dGhyaWZ0LnZlcnNpb259LVNOQVBTSE9UIi8+CiAKICAgPHByb3BlcnR5IG5hbWU9ImFzMy5maW5hbC5uYW1lIiB2YWx1ZT0iJHthczMuYXJ0aWZhY3RpZH0tJHt2ZXJzaW9ufSIvPgogCkBAIC01MiwxMiArNTMsMTMgQEAKICAgPHRhcmdldCBuYW1lPSJzZXR1cC5pbml0Ij4KICAgICA8dHN0YW1wLz4KICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLnRvb2xzLmRpcn0iLz4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJmbGV4LmNoZWNrIiB1bmxlc3M9IkZMRVhfSE9NRSI+CiAgICAgPGZhaWwgbWVzc2FnZT0nWW91IG11c3Qgc2V0IHRoZSBGTEVYX0hPTUUgcHJvcGVydHkgcG9pbnRpbmcgdG8geW91ciBmbGV4IFNESywgZWcuIGFudCAtREZMRVhfSE9NRT0iL0FwcGxpY2F0aW9ucy9BZG9iZSBGbGV4IEJ1aWxkZXIgMy9zZGtzLzMuMi4wIicvPgogICA8L3RhcmdldD4KLQkKKwogICA8dGFyZ2V0IG5hbWU9ImZsZXguaW5pdCIgZGVwZW5kcz0iZmxleC5jaGVjayIgdW5sZXNzPSJmbGV4LmZpbmlzaGVkIj4KICAgICA8dGFza2RlZiByZXNvdXJjZT0iZmxleFRhc2tzLnRhc2tzIiBjbGFzc3BhdGg9IiR7RkxFWF9IT01FfS9hbnQvbGliL2ZsZXhUYXNrcy5qYXIiIC8+CiAgICAgPHByb3BlcnR5IG5hbWU9ImZsZXguZmluaXNoZWQiIHZhbHVlPSJ0cnVlIi8+CkBAIC02OSwxMCArNzEsMTAgQEAKICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5hcyIvPgogICAgICAgPC9maWxlc2V0PgogICAgIDwvcGF0aD4KLSAgICA8cGF0aGNvbnZlcnQgCi0gICAgICBwcm9wZXJ0eT0iYXMuc3JjLmNsYXNzZXMiIAotICAgICAgcGF0aHNlcD0iICIgCi0gICAgICBkaXJzZXA9Ii4iIAorICAgIDxwYXRoY29udmVydAorICAgICAgcHJvcGVydHk9ImFzLnNyYy5jbGFzc2VzIgorICAgICAgcGF0aHNlcD0iICIKKyAgICAgIGRpcnNlcD0iLiIKICAgICAgIHJlZmlkPSJhcy5zcmMuZmlsZXMiCiAgICAgPgogICAgICAgPG1hcCBmcm9tPSIke3NyY30vIiB0bz0iIi8+CkBAIC0xMDgsMjEgKzExMCwyMSBAQAogICAgIDxhcnRpZmFjdDpyZW1vdGVSZXBvc2l0b3J5IGlkPSJhcGFjaGUiIHVybD0iJHthcGFjaGUucmVwb30iLz4KIAogICAgIDwhLS0gUG9tIGZpbGUgaW5mb3JtYXRpb24gLS0+Ci0gICAgPGFydGlmYWN0OnBvbSBpZD0icG9tIiAKLSAgICAgIGdyb3VwSWQ9IiR7dGhyaWZ0Lmdyb3VwaWR9IiAKKyAgICA8YXJ0aWZhY3Q6cG9tIGlkPSJwb20iCisgICAgICBncm91cElkPSIke3RocmlmdC5ncm91cGlkfSIKICAgICAgIGFydGlmYWN0SWQ9IiR7YXMzLmFydGlmYWN0aWR9IgotICAgICAgdmVyc2lvbj0iJHt2ZXJzaW9ufSIgCisgICAgICB2ZXJzaW9uPSIke3ZlcnNpb259IgogICAgICAgdXJsPSJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciCiAgICAgICBuYW1lPSJBcGFjaGUgVGhyaWZ0IgogICAgICAgZGVzY3JpcHRpb249IlRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMgZGV2ZWxvcG1lbnQuIgotICAgICAgcGFja2FnaW5nPSJwb20iCisgICAgICBwYWNrYWdpbmc9InN3YyIKICAgICA+CiAgICAgICA8cmVtb3RlUmVwb3NpdG9yeSByZWZpZD0iY2VudHJhbCIvPgogICAgICAgPHJlbW90ZVJlcG9zaXRvcnkgcmVmaWQ9ImFwYWNoZSIvPgogICAgICAgPGxpY2Vuc2UgbmFtZT0iVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCIgdXJsPSIke2xpY2Vuc2V9Ii8+Ci0gICAgICA8c2NtIGNvbm5lY3Rpb249InNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQvdHJ1bmsvIiAKLSAgICAgICAgZGV2ZWxvcGVyQ29ubmVjdGlvbj0ic2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC90cnVuay8iCi0gICAgICAgIHVybD0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL3RocmlmdCIKKyAgICAgIDxzY20gY29ubmVjdGlvbj0ic2NtOmdpdDpodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiCisgICAgICBkZXZlbG9wZXJDb25uZWN0aW9uPSJzY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCIKKyAgICAgIHVybD0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQiCiAgICAgICAvPgogICAgICAgPCEtLSBUaHJpZnQgRGV2ZWxvcGVycyAtLT4KICAgICAgIDxkZXZlbG9wZXIgaWQ9Im1jc2xlZSIgbmFtZT0iTWFyayBTbGVlIi8+CkBAIC0xNDEsNiArMTQzLDggQEAKICAgICAgIDxkZXZlbG9wZXIgaWQ9Im1vbGluYXJvIiBuYW1lPSJBbnRob255IE1vbGluYXJvIi8+CiAgICAgICA8ZGV2ZWxvcGVyIGlkPSJyb2dlciIgbmFtZT0iUm9nZXIgTWVpZXIiLz4KICAgICAgIDxkZXZlbG9wZXIgaWQ9ImpmYXJyZWxsIiBuYW1lPSJKYWtlIEZhcnJlbGwiLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9ImplbnNnIiBuYW1lPSJKZW5zIEdleWVyIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJjYXJsIiBuYW1lPSJDYXJsIFlla3NpZ2lhbiIvPgogICAgIDwvYXJ0aWZhY3Q6cG9tPgogCiAgICAgPCEtLSBHZW5lcmF0ZSB0aGUgcG9tIGZpbGUgLS0+CkBAIC0xNzQsNSArMTc4LDUgQEAKICAgICA8IS0tIHJ1biB3aXRoOiBhbnQgLURyZWxlYXNlPXRydWUgcHVibGlzaCAtLT4KICAgICA8c2lnbkFuZERlcGxveSBmaWxlPSIke2FzMy5wb20ueG1sfSIgcGFja2FnaW5nPSJwb20iIGNsYXNzaWZpZXI9IiIgcG9tPSIke2FzMy5wb20ueG1sfSIvPgogICAgIDxzaWduQW5kRGVwbG95IGZpbGU9IiR7YXMzLnN3Yy5maWxlfSIgcGFja2FnaW5nPSJzd2MiIGNsYXNzaWZpZXI9IiIgcG9tPSIke2FzMy5wb20ueG1sfSIvPgotICA8L3RhcmdldD4JCisgIDwvdGFyZ2V0PgogPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2FzMy9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2FzMy9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvYXMzL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FcnJvci5hcyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkVycm9yLmFzCmluZGV4IGFhMzI3OGQuLjM0NDhmY2UgMTAwNjQ0Ci0tLSBhL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkVycm9yLmFzCisrKyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkVycm9yLmFzCkBAIC00MiwxMSArNDIsMTQgQEAKICAgICBwdWJsaWMgc3RhdGljIGNvbnN0IE1JU1NJTkdfUkVTVUxUOmludCA9IDU7CiAgICAgcHVibGljIHN0YXRpYyBjb25zdCBJTlRFUk5BTF9FUlJPUjppbnQgPSA2OwogICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgUFJPVE9DT0xfRVJST1I6aW50ID0gNzsKKyAgICBwdWJsaWMgc3RhdGljIGNvbnN0IElOVkFMSURfVFJBTlNGT1JNOmludCA9IDg7CisgICAgcHVibGljIHN0YXRpYyBjb25zdCBJTlZBTElEX1BST1RPQ09MOmludCA9IDk7CisgICAgcHVibGljIHN0YXRpYyBjb25zdCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRTppbnQgPSAxMDsKIAogICAgIHB1YmxpYyBmdW5jdGlvbiBUQXBwbGljYXRpb25FcnJvcih0eXBlOmludCA9IFVOS05PV04sIG1lc3NhZ2U6U3RyaW5nID0gIiIpIHsKICAgICAgIHN1cGVyKG1lc3NhZ2UsIHR5cGUpOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVhZChpcHJvdDpUUHJvdG9jb2wpOlRBcHBsaWNhdGlvbkVycm9yIHsKICAgICAgIHZhciBmaWVsZDpURmllbGQ7CiAgICAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKZGlmZiAtLWdpdCBhL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5hcyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5hcwppbmRleCA0NDEyNDc5Li5iMmZmOWQ4IDEwMDY0NAotLS0gYS9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuYXMKKysrIGIvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmFzCkBAIC0zOCw5ICszOCw2IEBACiAgICAgcHJvdGVjdGVkIHZhciBzdHJpY3RSZWFkXzpCb29sZWFuID0gZmFsc2U7CiAgICAgcHJvdGVjdGVkIHZhciBzdHJpY3RXcml0ZV86Qm9vbGVhbiA9IHRydWU7CiAgICAgCi0gICAgcHJvdGVjdGVkIHZhciByZWFkTGVuZ3RoXzppbnQ7Ci0gICAgcHJvdGVjdGVkIHZhciBjaGVja1JlYWRMZW5ndGhfOkJvb2xlYW4gPSBmYWxzZTsKLQogICAvKioKICAgICogRmFjdG9yeQogICAgKi8KQEAgLTI5OCw3ICsyOTUsNiBAQAogICAKICAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJpbmFyeSgpOkJ5dGVBcnJheSB7CiAgICAgICAgIHZhciBzaXplOmludCA9IHJlYWRJMzIoKTsKLSAgICAgICAgY2hlY2tSZWFkTGVuZ3RoKHNpemUpOwogICAgICAgICB2YXIgYnVmOkJ5dGVBcnJheSA9IG5ldyBCeXRlQXJyYXkoKTsKICAgICAgICAgdHJhbnNfLnJlYWRBbGwoYnVmLCAwLCBzaXplKTsKICAgICAgICAgcmV0dXJuIGJ1ZjsKQEAgLTMwNywyNSArMzAzLDEwIEBACiAgICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkQWxsKGxlbjppbnQpOnZvaWQgewogICAgICAgcmVzZXQoYnl0ZXMpOwogICAgICAgCi0gICAgICBjaGVja1JlYWRMZW5ndGgobGVuKTsKICAgICAgICAgdHJhbnNfLnJlYWRBbGwoYnl0ZXMsIDAsIGxlbik7CiAgICAgICAgIAogICAgICAgICBieXRlcy5wb3NpdGlvbiA9IDA7CiAgICAgICB9Ci0gIAotICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRSZWFkTGVuZ3RoKHJlYWRMZW5ndGg6aW50KTp2b2lkIHsKLSAgICAgIHJlYWRMZW5ndGhfID0gcmVhZExlbmd0aDsKLSAgICAgIGNoZWNrUmVhZExlbmd0aF8gPSB0cnVlOwotICAgIH0KLSAgCi0gICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGNoZWNrUmVhZExlbmd0aChsZW5ndGg6aW50KTp2b2lkIHsKLSAgICAgICAgaWYgKGNoZWNrUmVhZExlbmd0aF8pIHsKLSAgICAgICAgICAgIHJlYWRMZW5ndGhfIC09IGxlbmd0aDsKLSAgICAgICAgICAgIGlmIChyZWFkTGVuZ3RoXyA8IDApIHsKLSAgICAgICAgICAgICAgdGhyb3cgbmV3IFRFcnJvcigiTWVzc2FnZSBsZW5ndGggZXhjZWVkZWQ6ICIgKyBsZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9CiAgICAgCiAgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gcmVzZXQoYXJyOkJ5dGVBcnJheSk6dm9pZCB7CiAgICAgICBhcnIubGVuZ3RoID0gMDsKZGlmZiAtLWdpdCBhL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEVycm9yLmFzIGIvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXJyb3IuYXMKaW5kZXggYzU3ODhkYi4uOWZmZjczMCAxMDA2NDQKLS0tIGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXJyb3IuYXMKKysrIGIvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXJyb3IuYXMKQEAgLTI5LDYgKzI5LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGNvbnN0IFNJWkVfTElNSVQ6aW50ID0gMzsKICAgICBwdWJsaWMgc3RhdGljIGNvbnN0IEJBRF9WRVJTSU9OOmludCA9IDQ7CiAgICAgcHVibGljIHN0YXRpYyBjb25zdCBOT1RfSU1QTEVNRU5URUQ6aW50ID0gNTsKKyAgICBwdWJsaWMgc3RhdGljIGNvbnN0IERFUFRIX0xJTUlUOmludCA9IDY7CiAgIAogICAgIHB1YmxpYyBmdW5jdGlvbiBUUHJvdG9jb2xFcnJvcihlcnJvcjppbnQgPSBVTktOT1dOLCBtZXNzYWdlOlN0cmluZyA9ICIiKSB7CiAgICAgICBzdXBlcihtZXNzYWdlLCBlcnJvcik7CmRpZmYgLS1naXQgYS9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZ1bGxEdXBsZXhIdHRwQ2xpZW50LmFzIGIvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGdWxsRHVwbGV4SHR0cENsaWVudC5hcwppbmRleCAzMzc0OTg2Li44NjNjNTliIDEwMDY0NAotLS0gYS9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZ1bGxEdXBsZXhIdHRwQ2xpZW50LmFzCisrKyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnVsbER1cGxleEh0dHBDbGllbnQuYXMKQEAgLTE5NSw3ICsxOTUsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzLm91dHB1dCA9IHRoaXMuc29ja2V0OwogICAgICAgICAgICAgdGhpcy5pbnB1dCA9IHRoaXMuc29ja2V0OwotICAgICAgICAgICAgdGhpcy5vdXRwdXQud3JpdGVVVEYoIkNPTk5FQ1QgIiArIHJlc291cmNlICsgIiBIVFRQLzEuMVxuIiArICJIb3N0OiAiICsgaG9zdCArICI6IiArIHBvcnQgKyAiXHJcbiIgKyAiVXNlci1BZ2VudDogQmF0dGxlTmV0XHJcbiIgKyAiVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWRcclxuIiArICJjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0XHJcbiIgKyAiQWNjZXB0OiAqLypcclxuXHJcbiIpOworICAgICAgICAgICAgdGhpcy5vdXRwdXQud3JpdGVVVEYoIkNPTk5FQ1QgIiArIHJlc291cmNlICsgIiBIVFRQLzEuMVxuIiArICJIb3N0OiAiICsgaG9zdCArICI6IiArIHBvcnQgKyAiXHJcbiIgKyAiVXNlci1BZ2VudDogVGhyaWZ0L0FTM1xyXG4iICsgIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkXHJcbiIgKyAiY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdFxyXG4iICsgIkFjY2VwdDogKi8qXHJcblxyXG4iKTsKICAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmFzIGIvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYwZDcxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmFzCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqCQlodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQKK3sKKworICBpbXBvcnQgZmxhc2guZXZlbnRzLkV2ZW50RGlzcGF0Y2hlcjsKKyAgaW1wb3J0IGZsYXNoLmV2ZW50cy5FdmVudDsKKyAgaW1wb3J0IGZsYXNoLmV2ZW50cy5JT0Vycm9yRXZlbnQ7CisgIGltcG9ydCBmbGFzaC5ldmVudHMuUHJvZ3Jlc3NFdmVudDsKKyAgaW1wb3J0IGZsYXNoLmV2ZW50cy5TZWN1cml0eUVycm9yRXZlbnQ7CisgIGltcG9ydCBmbGFzaC5lcnJvcnMuRU9GRXJyb3I7CisgIGltcG9ydCBmbGFzaC5lcnJvcnMuSU9FcnJvcjsKKyAgaW1wb3J0IGZsYXNoLm5ldC5VUkxMb2FkZXI7CisgIGltcG9ydCBmbGFzaC5uZXQuVVJMTG9hZGVyRGF0YUZvcm1hdDsKKyAgaW1wb3J0IGZsYXNoLm5ldC5VUkxSZXF1ZXN0OworICBpbXBvcnQgZmxhc2gubmV0LlVSTFJlcXVlc3RNZXRob2Q7CisgIGltcG9ydCBmbGFzaC51dGlscy5JRGF0YUlucHV0OworICBpbXBvcnQgZmxhc2gudXRpbHMuSURhdGFPdXRwdXQ7CisgIGltcG9ydCBmbGFzaC51dGlscy5CeXRlQXJyYXk7CisgIGltcG9ydCBmbGFzaC5uZXQuU29ja2V0OworCisKKyAgLyoqCisgICAqIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuIFVzZWQgZm9yIHdvcmtpbmcgd2l0aCBhCisgICAqIFRocmlmdCBTb2NrZXQgU2VydmVyIGJhc2VkIGltcGxlbWVudGF0aW9ucy4KKyAgICovCisKKyAgcHVibGljIGNsYXNzIFRTb2NrZXQgZXh0ZW5kcyBUVHJhbnNwb3J0CisgIHsKKyAgICBwcml2YXRlIHZhciBzb2NrZXQ6U29ja2V0ID0gbnVsbDsKKworICAgIHByaXZhdGUgdmFyIGhvc3Q6U3RyaW5nOworCisgICAgcHJpdmF0ZSB2YXIgcG9ydDppbnQ7CisKKyAgICBwcml2YXRlIHZhciBvYnVmZmVyOkJ5dGVBcnJheSA9IG5ldyBCeXRlQXJyYXkoKTsKKworICAgIHByaXZhdGUgdmFyIGlucHV0OklEYXRhSW5wdXQ7CisKKyAgICBwcml2YXRlIHZhciBvdXRwdXQ6SURhdGFPdXRwdXQ7CisKKyAgICBwcml2YXRlIHZhciBpb0NhbGxiYWNrOkZ1bmN0aW9uID0gbnVsbDsKKworICAgIHByaXZhdGUgdmFyIGV2ZW50RGlzcGF0Y2hlcjpFdmVudERpc3BhdGNoZXIgPSBuZXcgRXZlbnREaXNwYXRjaGVyKCk7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gVFNvY2tldChob3N0OlN0cmluZywgcG9ydDppbnQpOnZvaWQKKyAgICB7CisgICAgICB0aGlzLmhvc3QgPSBob3N0OworICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gY2xvc2UoKTp2b2lkCisgICAgeworICAgICAgdGhpcy5pbnB1dCA9IG51bGw7CisgICAgICB0aGlzLm91dHB1dCA9IG51bGw7CisgICAgICBzb2NrZXQuY2xvc2UoKQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBwZWVrKCk6Qm9vbGVhbgorICAgIHsKKyAgICAgIGlmKHNvY2tldC5jb25uZWN0ZWQpCisgICAgICB7CisgICAgICAgIHRyYWNlKCJCeXRlcyByZW1haW5lZDoiICsgc29ja2V0LmJ5dGVzQXZhaWxhYmxlKTsKKyAgICAgICAgcmV0dXJuIHNvY2tldC5ieXRlc0F2YWlsYWJsZT4wOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiByZWFkKGJ1ZjpCeXRlQXJyYXksIG9mZjppbnQsIGxlbjppbnQpOmludAorICAgIHsKKyAgICAgIHZhciBuMTppbnQgPSAwLCBuMjppbnQgPSAwLCBuMzppbnQgPSAwLCBuNDppbnQgPSAwLCBjaWR4OmludCA9IDI7CisgICAgICB2YXIgY2h1bmtTaXplOkJ5dGVBcnJheSA9IG5ldyBCeXRlQXJyYXkoKTsKKworICAgICAgdHJ5CisgICAgICB7CisgICAgICAgIGlucHV0LnJlYWRCeXRlcyhidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgcmV0dXJuIGxlbjsKKyAgICAgIH0KKyAgICAgIGNhdGNoIChlOkVPRkVycm9yKQorICAgICAgeworICAgICAgICB0cmFjZShlKTsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcihUVHJhbnNwb3J0RXJyb3IuRU5EX09GX0ZJTEUsICJObyBtb3JlIGRhdGEgYXZhaWxhYmxlLiIpOworICAgICAgfQorICAgICAgY2F0Y2ggKGU6SU9FcnJvcikKKyAgICAgIHsKKyAgICAgICAgdHJhY2UoZSk7CisgICAgICAgIGlmKGlzT3BlbigpKQorICAgICAgICB7CisgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcihUVHJhbnNwb3J0RXJyb3IuVU5LTk9XTiwgIklPIGVycm9yIHdoaWxlIHJlYWRpbmc6ICIgKyBlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEVycm9yKFRUcmFuc3BvcnRFcnJvci5OT1RfT1BFTiwgIlNvY2tldCBzZWVtIG5vdCB0byBiZSBvcGVuZWQ6ICIgKyBlKTsKKyAgICAJfQorICAgICAgfQorICAgICAgY2F0Y2ggKGU6RXJyb3IpCisgICAgICB7CisgICAgICAgIHRyYWNlKGUpOworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEVycm9yKFRUcmFuc3BvcnRFcnJvci5VTktOT1dOLCAiQmFkIElPIGVycm9yOiAiICsgZSk7CisgICAgICB9CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gd3JpdGUoYnVmOkJ5dGVBcnJheSwgb2ZmOmludCwgbGVuOmludCk6dm9pZAorICAgIHsKKyAgICAgIG9idWZmZXIud3JpdGVCeXRlcyhidWYsIG9mZiwgbGVuKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcih0eXBlOlN0cmluZywgbGlzdGVuZXI6RnVuY3Rpb24sIHVzZUNhcHR1cmU6Qm9vbGVhbiA9IGZhbHNlLCBwcmlvcml0eTppbnQgPSAwLCB1c2VXZWFrUmVmZXJlbmNlOkJvb2xlYW4gPSBmYWxzZSk6dm9pZAorICAgIHsKKyAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUsIHByaW9yaXR5LCB1c2VXZWFrUmVmZXJlbmNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZTpTdHJpbmcsIGxpc3RlbmVyOkZ1bmN0aW9uLCB1c2VDYXB0dXJlOkJvb2xlYW4gPSBmYWxzZSk6dm9pZAorICAgIHsKKyAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUpOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBvcGVuKCk6dm9pZAorICAgIHsKKyAgICAgIHRoaXMuc29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihFdmVudC5DT05ORUNULCBzb2NrZXRDb25uZWN0ZWQpOworICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihJT0Vycm9yRXZlbnQuSU9fRVJST1IsIHNvY2tldEVycm9yKTsKKyAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoU2VjdXJpdHlFcnJvckV2ZW50LlNFQ1VSSVRZX0VSUk9SLCBzb2NrZXRTZWN1cml0eUVycm9yKTsKKyAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoUHJvZ3Jlc3NFdmVudC5TT0NLRVRfREFUQSwgc29ja2V0RGF0YUhhbmRsZXIpOworICAgICAgdGhpcy5zb2NrZXQuY29ubmVjdChob3N0LCBwb3J0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gc29ja2V0Q29ubmVjdGVkKGV2ZW50OkV2ZW50KTp2b2lkCisgICAgeworICAgICAgdGhpcy5vdXRwdXQgPSB0aGlzLnNvY2tldDsKKyAgICAgIHRoaXMuaW5wdXQgPSB0aGlzLnNvY2tldDsKKyAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBzb2NrZXRFcnJvcihldmVudDpJT0Vycm9yRXZlbnQpOnZvaWQKKyAgICB7CisgICAgICB0cmFjZSgiRXJyb3IgQ29ubmVjdGluZzoiICsgZXZlbnQpOworICAgICAgdGhpcy5jbG9zZSgpOworICAgICAgaWYgKGlvQ2FsbGJhY2sgPT0gbnVsbCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaW9DYWxsYmFjayhuZXcgVFRyYW5zcG9ydEVycm9yKFRUcmFuc3BvcnRFcnJvci5VTktOT1dOLCAiSU9FcnJvcjogIiArIGV2ZW50LnRleHQpKTsKKyAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBzb2NrZXRTZWN1cml0eUVycm9yKGV2ZW50OlNlY3VyaXR5RXJyb3JFdmVudCk6dm9pZAorICAgIHsKKyAgICAgIHRyYWNlKCJTZWN1cml0eSBFcnJvciBDb25uZWN0aW5nOiIgKyBldmVudCk7CisgICAgICB0aGlzLmNsb3NlKCk7CisgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gc29ja2V0RGF0YUhhbmRsZXIoZXZlbnQ6UHJvZ3Jlc3NFdmVudCk6dm9pZAorICAgIHsKKyAgICAgIGlmIChpb0NhbGxiYWNrICE9IG51bGwpCisgICAgICB7CisgICAgICAgIGlvQ2FsbGJhY2sobnVsbCk7CisgICAgICB9CisgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZmx1c2goY2FsbGJhY2s6RnVuY3Rpb24gPSBudWxsKTp2b2lkCisgICAgeworICAgICAgdGhpcy5pb0NhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICB0aGlzLm91dHB1dC53cml0ZUJ5dGVzKHRoaXMub2J1ZmZlcik7CisgICAgICB0aGlzLnNvY2tldC5mbHVzaCgpOworICAgICAgdGhpcy5vYnVmZmVyLmNsZWFyKCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGlzT3BlbigpOkJvb2xlYW4KKyAgICB7CisgICAgICByZXR1cm4gKHRoaXMuc29ja2V0ID09IG51bGwgPyBmYWxzZSA6IHRoaXMuc29ja2V0LmNvbm5lY3RlZCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL0NNYWtlTGlzdHMudHh0IGIvbGliL2NfZ2xpYi9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzQzYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDg2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBGaW5kIHJlcXVpcmVkIHBhY2thZ2VzCitmaW5kX3BhY2thZ2UoR0xJQiBSRVFVSVJFRCBDT01QT05FTlRTIGdvYmplY3QpCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7R0xJQl9JTkNMVURFX0RJUlN9KQorCitpbmNsdWRlX2RpcmVjdG9yaWVzKHNyYykKKworIyBTWVNMSUJTIGNvbnRhaW5zIGxpYnJhcmllcyB0aGF0IG5lZWQgdG8gYmUgbGlua2VkIHRvIGFsbCBsaWIgdGFyZ2V0cworc2V0KFNZU0xJQlMgJHtHTElCX0xJQlJBUklFU30gJHtHTElCX0dPQkpFQ1RfTElCUkFSSUVTfSkKKworIyBDcmVhdGUgdGhlIHRocmlmdCBDIGdsaWIgbGlicmFyeQorc2V0KHRocmlmdF9jX2dsaWJfU09VUkNFUworICAgIHNyYy90aHJpZnQvY19nbGliL3RocmlmdC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnkuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYworICAgIHNyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5jCispCisKKyMgSWYgT3BlblNTTCBpcyBub3QgZm91bmQganVzdCBpZ25vcmUgdGhlIE9wZW5TU0wgc3R1ZmYKK2ZpbmRfcGFja2FnZShPcGVuU1NMKQoraWYoT1BFTlNTTF9GT1VORCBBTkQgV0lUSF9PUEVOU1NMKQorICAgIGxpc3QoIEFQUEVORCB0aHJpZnRjcHBfU09VUkNFUworCSAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuYworICAgICkKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtPUEVOU1NMX0lOQ0xVREVfRElSfSIpCisgICAgbGlzdChBUFBFTkQgU1lTTElCUyAiJHtPUEVOU1NMX0xJQlJBUklFU30iKQorZW5kaWYoKQorCisKKyMgQ29udGFpbnMgdGhlIHRocmlmdCBzcGVjaWZpYyBBRERfTElCUkFSWV9USFJJRlQgYW5kIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQKK2luY2x1ZGUoVGhyaWZ0TWFjcm9zKQorCitBRERfTElCUkFSWV9USFJJRlQodGhyaWZ0X2NfZ2xpYiAke3RocmlmdF9jX2dsaWJfU09VUkNFU30pCitUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUKHRocmlmdF9jX2dsaWIgJHtTWVNMSUJTfSkKKworIyBJbnN0YWxsIHRoZSBoZWFkZXJzCitpbnN0YWxsKERJUkVDVE9SWSAic3JjL3RocmlmdCIgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0iCisgICAgRklMRVNfTUFUQ0hJTkcgUEFUVEVSTiAiKi5oIikKKyMgQ29weSBjb25maWcuaCBmaWxlCitpbnN0YWxsKERJUkVDVE9SWSAiJHtDTUFLRV9CSU5BUllfRElSfS90aHJpZnQiIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9IgorICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouaCIpCisKK2lmKEJVSUxEX1RFU1RJTkcpCisgICAgYWRkX3N1YmRpcmVjdG9yeSh0ZXN0KQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9NYWtlZmlsZS5hbSBiL2xpYi9jX2dsaWIvTWFrZWZpbGUuYW0Kb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA1YjY2ODE4Li40OWI1YjIzCi0tLSBhL2xpYi9jX2dsaWIvTWFrZWZpbGUuYW0KKysrIGIvbGliL2NfZ2xpYi9NYWtlZmlsZS5hbQpAQCAtMTYsNyArMTYsNyBAQAogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwotCitBVVRPTUFLRV9PUFRJT05TID0gc2VyaWFsLXRlc3RzCiBTVUJESVJTID0gLiB0ZXN0CiAKIHBrZ2NvbmZpZ2RpciA9ICQobGliZGlyKS9wa2djb25maWcKQEAgLTI0LDY4ICsyNCw5MyBAQAogbGliX0xUTElCUkFSSUVTID0gbGlidGhyaWZ0X2NfZ2xpYi5sYQogcGtnY29uZmlnX0RBVEEgPSB0aHJpZnRfY19nbGliLnBjCiAKLWNvbW1vbl9jZmxhZ3MgPSAtZyAtV2FsbCAtVyAtV2Vycm9yIC1Jc3JjICQoR0xJQl9DRkxBR1MpCi1jb21tb25fbGRmbGFncyA9IC1nIC1XYWxsIC1XICQoR0xJQl9MREZMQUdTKSBAR0NPVl9MREZMQUdTQAotCi0jIHRoaXMgcmVtb3ZlcyBvcHRpbWl6YXRpb25zIGFuZCBhZGRzIGNvdmVyYWdlIGZsYWdzCi1DRkxBR1MgPSBAR0NPVl9DRkxBR1NACitBTV9DUFBGTEFHUyA9IC1Jc3JjIC1JIHNyYy90aHJpZnQvY19nbGliCitBTV9DRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYwogCiAjIERlZmluZSB0aGUgc291cmNlIGZpbGVzIGZvciB0aGUgbW9kdWxlCiAKLWxpYnRocmlmdF9jX2dsaWJfbGFfU09VUkNFUyA9IHNyYy90aHJpZnQuYyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0X3N0cnVjdC5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuYyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuYyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYworbGlidGhyaWZ0X2NfZ2xpYl9sYV9TT1VSQ0VTID0gc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYwogCi1saWJ0aHJpZnRfY19nbGliX2xhX0NGTEFHUyA9ICQoY29tbW9uX2NmbGFncykKK2xpYnRocmlmdF9jX2dsaWJfbGFfQ0ZMQUdTID0gJChBTV9DRkxBR1MpICQoR0xJQl9DRkxBR1MpICQoR09CSkVDVF9DRkxBR1MpICQoT1BFTlNTTF9JTkNMVURFUykKK2xpYnRocmlmdF9jX2dsaWJfbGFfTERGTEFHUyA9ICQoQU1fTERGTEFHUykgJChHTElCX0xJQlMpICQoR09CSkVDVF9MSUJTKSAgJChPUEVOU1NMX0xERkxBR1MpICQoT1BFTlNTTF9MSUJTKSAKIAotaW5jbHVkZV90aHJpZnRkaXIgPSAkKGluY2x1ZGVkaXIpL3RocmlmdAoraW5jbHVkZV90aHJpZnRkaXIgPSAkKGluY2x1ZGVkaXIpL3RocmlmdC9jX2dsaWIKIGluY2x1ZGVfdGhyaWZ0X0hFQURFUlMgPSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnRfc3RydWN0LmgKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0LmgKIAogaW5jbHVkZV9wcm90b2NvbGRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3Byb3RvY29sCi1pbmNsdWRlX3Byb3RvY29sX0hFQURFUlMgPSBzcmMvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmgKK2luY2x1ZGVfcHJvdG9jb2xfSEVBREVSUyA9IHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnkuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKIGluY2x1ZGVfdHJhbnNwb3J0ZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvdHJhbnNwb3J0Ci1pbmNsdWRlX3RyYW5zcG9ydF9IRUFERVJTID0gc3JjL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oCitpbmNsdWRlX3RyYW5zcG9ydF9IRUFERVJTID0gc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfcGxhdGZvcm1fc29ja2V0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnkuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnkuaAogCiBpbmNsdWRlX3NlcnZlcmRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3NlcnZlcgotaW5jbHVkZV9zZXJ2ZXJfSEVBREVSUyA9IHNyYy9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmgKK2luY2x1ZGVfc2VydmVyX0hFQURFUlMgPSBzcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuaAogCiBpbmNsdWRlX3Byb2Nlc3NvcmRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3Byb2Nlc3NvcgotaW5jbHVkZV9wcm9jZXNzb3JfSEVBREVSUyA9IHNyYy9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oCitpbmNsdWRlX3Byb2Nlc3Nvcl9IRUFERVJTID0gc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaAogCiAKIEVYVFJBX0RJU1QgPSBcCi0gICAgICAgICAgICAgUkVBRE1FIFwKKyAgICAgICAgICAgICBDTWFrZUxpc3RzLnR4dCBcCisgICAgICAgICAgICAgY29kaW5nX3N0YW5kYXJkcy5tZCBcCisgICAgICAgICAgICAgUkVBRE1FLm1kIFwKKyAgICAgICAgICAgICB0ZXN0L2dsaWIuc3VwcHJlc3MgXAogICAgICAgICAgICAgIHRocmlmdF9jX2dsaWIucGMuaW4KIAogQ0xFQU5GSUxFUyA9IFwKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvUkVBRE1FIGIvbGliL2NfZ2xpYi9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNzBkMDguLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1UaHJpZnQgQyBTb2Z0d2FyZSBMaWJyYXJ5Ci0KLUxpY2Vuc2UKLT09PT09PT0KLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLVVzaW5nIFRocmlmdCB3aXRoIEMKLT09PT09PT09PT09PT09PT09PT0KLQotVGhlIFRocmlmdCBDIGxpYnJhcmllcyBhcmUgYnVpbHQgdXNpbmcgdGhlIEdOVSB0b29scy4gIEZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zCi1pbiB0aGUgdG9wLWxldmVsIFJFQURNRSBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgTWFrZWZpbGVzLgotCi1EZXBlbmRlbmNpZXMKLT09PT09PT09PT09PQotCi1HTGliCi1odHRwOi8vd3d3Lmd0ay5vcmcvCi0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvUkVBRE1FLm1kIGIvbGliL2NfZ2xpYi9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4NGYzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNDkgQEAKK1RocmlmdCBDIFNvZnR3YXJlIExpYnJhcnkKKworTGljZW5zZQorPT09PT09PQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworVXNpbmcgVGhyaWZ0IHdpdGggQworPT09PT09PT09PT09PT09PT09PQorCitUaGUgVGhyaWZ0IEMgbGlicmFyaWVzIGFyZSBidWlsdCB1c2luZyB0aGUgR05VIHRvb2xzLiAgRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMKK2luIHRoZSB0b3AtbGV2ZWwgUkVBRE1FIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBNYWtlZmlsZXMuCisKK0RlcGVuZGVuY2llcworPT09PT09PT09PT09CisKK0dMaWIKK2h0dHA6Ly93d3cuZ3RrLm9yZy8KKworQnJlYWtpbmcgQ2hhbmdlcworPT09PT09PT09PT09PT09PQorCiswLjEyLjAKKy0tLS0tLQorCitUaGUgY29tcGlsZXIncyBoYW5kbGluZyBvZiBuYW1lc3BhY2VzIHdoZW4gZ2VuZXJhdGluZyB0aGUgbmFtZSBvZiB0eXBlcywKK2Z1bmN0aW9ucyBhbmQgaGVhZGVyIGZpbGVzIGhhcyBiZWVuIGltcHJvdmVkLiBUaGlzIG1lYW5zIGNvZGUgd3JpdHRlbiB0byB1c2UKK2NsYXNzZXMgZ2VuZXJhdGVkIGJ5IHByZXZpb3VzIHZlcnNpb25zIG9mIHRoZSBjb21waWxlciBtYXkgbmVlZCB0byBiZSB1cGRhdGVkIHRvCityZWZsZWN0IHRoZSBwcm9wZXIgY29udmVudGlvbiBmb3IgY2xhc3MgbmFtZXMsIHdoaWNoIGlzCisKKy0gQSBsb3dlcmNhc2UsIFtzbmFrZS1jYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TbmFrZV9jYXNlKQorICByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2xhc3MnIG5hbWVzcGFjZSwgZm9sbG93ZWQgYnkKKy0gQW4gdW5kZXJzY29yZSBhbmQKKy0gQSBsb3dlcmNhc2UsIHNuYWtlLWNhc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsYXNzJyBuYW1lLgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2NfZ2xpYi9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YjNhMDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSw1IEBACisjIyBDIEdsaWIgQ29kaW5nIFN0YW5kYXJkcworCitQbGVhc2UgZm9sbG93OgorICogW1RocmlmdCBHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKKyAqIFtHTk9NRSBDIENvZGluZyBTdHlsZV0oaHR0cHM6Ly9oZWxwLmdub21lLm9yZy91c2Vycy9wcm9ncmFtbWluZy1ndWlkZWxpbmVzL3N0YWJsZS9jLWNvZGluZy1zdHlsZS5odG1sLmVuKQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuYyBiL2xpYi9jX2dsaWIvc3JjL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOWY0NTQuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInRocmlmdC5oIgotI2luY2x1ZGUgInByb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmgiCi0KLUdfREVGSU5FX0FCU1RSQUNUX1RZUEUoVGhyaWZ0UHJvY2Vzc29yLCB0aHJpZnRfcHJvY2Vzc29yLCBHX1RZUEVfT0JKRUNUKQotCi1nYm9vbGVhbgotdGhyaWZ0X3Byb2Nlc3Nvcl9wcm9jZXNzIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwgVGhyaWZ0UHJvdG9jb2wgKmluLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqb3V0KQotewotICByZXR1cm4gVEhSSUZUX1BST0NFU1NPUl9HRVRfQ0xBU1MgKHByb2Nlc3NvciktPnByb2Nlc3MgKHByb2Nlc3NvciwgaW4sIG91dCk7Ci19Ci0KLS8qIGNsYXNzIGluaXRpYWxpemVyIGZvciBUaHJpZnRQcm9jZXNzb3IgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfcHJvY2Vzc29yX2NsYXNzX2luaXQgKFRocmlmdFByb2Nlc3NvckNsYXNzICpjbHMpCi17Ci0gIC8qIHNldCB0aGVzZSBhcyB2aXJ0dWFsIG1ldGhvZHMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcyAqLwotICBjbHMtPnByb2Nlc3MgPSB0aHJpZnRfcHJvY2Vzc29yX3Byb2Nlc3M7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHJpZnRfcHJvY2Vzc29yX2luaXQgKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvY2Vzc29yKTsKLX0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmggYi9saWIvY19nbGliL3NyYy9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTBlMzFiLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9QUk9DRVNTT1JfSAotI2RlZmluZSBfVEhSSUZUX1BST0NFU1NPUl9ICi0KLSNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgotCi0jaW5jbHVkZSAicHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmgiCi0KLUdfQkVHSU5fREVDTFMKLQotLyohIFxmaWxlIHRocmlmdF9wcm9jZXNzb3IuaAotICogIFxicmllZiBBYnN0cmFjdCBjbGFzcyBmb3IgVGhyaWZ0IHByb2Nlc3NvcnMuCi0gKi8KLQotLyogdHlwZSBtYWNyb3MgKi8KLSNkZWZpbmUgVEhSSUZUX1RZUEVfUFJPQ0VTU09SICh0aHJpZnRfcHJvY2Vzc29yX2dldF90eXBlICgpKQotI2RlZmluZSBUSFJJRlRfUFJPQ0VTU09SKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPQ0VTU09SLCBUaHJpZnRQcm9jZXNzb3IpKQotI2RlZmluZSBUSFJJRlRfSVNfUFJPQ0VTU09SKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPQ0VTU09SKSkKLSNkZWZpbmUgVEhSSUZUX1BST0NFU1NPUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfUFJPQ0VTU09SLCBUaHJpZnRQcm9jZXNzb3JDbGFzcykpCi0jZGVmaW5lIFRIUklGVF9JU19QUk9DRVNTT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1BST0NFU1NPUikpCi0jZGVmaW5lIFRIUklGVF9QUk9DRVNTT1JfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9DRVNTT1IsIFRocmlmdFByb2Nlc3NvckNsYXNzKSkKLQotLyohCi0gKiBUaHJpZnQgUHJvY2Vzc29yb2JqZWN0Ci0gKi8KLXN0cnVjdCBfVGhyaWZ0UHJvY2Vzc29yCi17Ci0gIEdPYmplY3QgcGFyZW50OwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRQcm9jZXNzb3IgVGhyaWZ0UHJvY2Vzc29yOwotCi0vKiEKLSAqIFRocmlmdCBQcm9jZXNzb3IgY2xhc3MKLSAqLwotc3RydWN0IF9UaHJpZnRQcm9jZXNzb3JDbGFzcwotewotICBHT2JqZWN0Q2xhc3MgcGFyZW50OwotCi0gIC8qIHZ0YWJsZSAqLwotICBnYm9vbGVhbiAoKnByb2Nlc3MpIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwgVGhyaWZ0UHJvdG9jb2wgKmluLAotICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqb3V0KTsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvY2Vzc29yQ2xhc3MgVGhyaWZ0UHJvY2Vzc29yQ2xhc3M7Ci0KLS8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfUFJPQ0VTU09SICovCi1HVHlwZSB0aHJpZnRfcHJvY2Vzc29yX2dldF90eXBlICh2b2lkKTsKLQotLyohCi0gKiBQcm9jZXNzZXMgdGhlIHJlcXVlc3QuCi0gKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRQcm9jZXNzb3JDbGFzcwotICovCi1nYm9vbGVhbiB0aHJpZnRfcHJvY2Vzc29yX3Byb2Nlc3MgKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqaW4sIFRocmlmdFByb3RvY29sICpvdXQpOwotCi1HX0VORF9ERUNMUwotCi0jZW5kaWYgLyogX1RIUklGVF9QUk9DRVNTT1JfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5jIGIvbGliL2NfZ2xpYi9zcmMvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWUyOGU4Li4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYworKysgL2Rldi9udWxsCkBAIC0xLDg2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAidGhyaWZ0LmgiCi0jaW5jbHVkZSAicHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmgiCi0jaW5jbHVkZSAicHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oIgotCi1HX0RFRklORV9UWVBFKFRocmlmdEJpbmFyeVByb3RvY29sLCB0aHJpZnRfYmluYXJ5X3Byb3RvY29sLCBUSFJJRlRfVFlQRV9QUk9UT0NPTCkKLQotc3RhdGljIGd1aW50NjQKLXRocmlmdF9iaXR3aXNlX2Nhc3RfZ3VpbnQ2NCAoZ2RvdWJsZSB2KQotewotICB1bmlvbiB7Ci0gICAgZ2RvdWJsZSBmcm9tOwotICAgIGd1aW50NjQgdG87Ci0gIH0gdTsKLSAgdS5mcm9tID0gdjsKLSAgcmV0dXJuIHUudG87Ci19Ci0KLXN0YXRpYyBnZG91YmxlCi10aHJpZnRfYml0d2lzZV9jYXN0X2dkb3VibGUgKGd1aW50NjQgdikKLXsKLSAgdW5pb24gewotICAgIGd1aW50NjQgZnJvbTsKLSAgICBnZG91YmxlIHRvOwotICB9IHU7Ci0gIHUuZnJvbSA9IHY7Ci0gIHJldHVybiB1LnRvOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgIGNvbnN0IGdjaGFyICpuYW1lLCBjb25zdCBUaHJpZnRNZXNzYWdlVHlwZSBtZXNzYWdlX3R5cGUsCi0gICAgY29uc3QgZ2ludDMyIHNlcWlkLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotCi0gIGdpbnQzMiB2ZXJzaW9uID0gKFRIUklGVF9CSU5BUllfUFJPVE9DT0xfVkVSU0lPTl8xKQotICAgICAgICAgICAgICAgICAgIHwgKChnaW50MzIpIG1lc3NhZ2VfdHlwZSk7Ci0gIGdpbnQzMiByZXQ7Ci0gIGdpbnQzMiB4ZmVyID0gMDsKLQotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCB2ZXJzaW9uLCBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICB4ZmVyICs9IHJldDsKLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgbmFtZSwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgeGZlciArPSByZXQ7Ci0gIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIHNlcWlkLCBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICB4ZmVyICs9IHJldDsKLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIC8qIHNhdGlzZnkgLVdhbGwgKi8KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgLyogc2F0aXNmeSAtV2FsbCAqLwotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAobmFtZSk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiAwOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgLyogc2F0aXNmeSAtV2FsbCAqLwotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICByZXR1cm4gMDsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZmllbGRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQxNiBmaWVsZF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAobmFtZSk7Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLQotICBnaW50MzIgcmV0OwotICBnaW50MzIgeGZlciA9IDA7Ci0KLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgZmllbGRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgeGZlciArPSByZXQ7Ci0gIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIGZpZWxkX2lkLCBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICB4ZmVyICs9IHJldDsKLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgLyogc2F0aXNmeSAtV2FsbCAqLwotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICByZXR1cm4gMDsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3AgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLSAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSBUX1NUT1AsIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUga2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSB2YWx1ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotCi0gIGdpbnQzMiByZXQ7Ci0gIGdpbnQzMiB4ZmVyID0gMDsKLQotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSBrZXlfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgeGZlciArPSByZXQ7Ci0gIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIHZhbHVlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHhmZXIgKz0gcmV0OwotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAoZ2ludDMyKSBzaXplLCBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICB4ZmVyICs9IHJldDsKLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICByZXR1cm4gMDsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7IAotCi0gIGdpbnQzMiByZXQ7Ci0gIGdpbnQzMiB4ZmVyID0gMDsKLQotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSBlbGVtZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHhmZXIgKz0gcmV0OwotCi0gIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIChnaW50MzIpIHNpemUsIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHhmZXIgKz0gcmV0OwotCi0gIHJldHVybiB4ZmVyOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICByZXR1cm4gMDsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLQotICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBlbGVtZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdib29sZWFuIHZhbHVlLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotICBndWludDggdG1wID0gdmFsdWUgPyAxIDogMDsKLSAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgdG1wLCBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ4IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotICAgCi0gIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSAmdmFsdWUsIDEsIGVycm9yKSkKLSAgewotICAgIHJldHVybiAxOwotICB9IGVsc2UgewotICAgIHJldHVybiAtMTsKLSAgfQotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQxNiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotCi0gIGdpbnQxNiBuZXQgPSBnX2h0b25zICh2YWx1ZSk7Ci0gIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSAmbmV0LCAyLCBlcnJvcikpCi0gIHsKLSAgICByZXR1cm4gMjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MzIgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLQotICBnaW50MzIgbmV0ID0gZ19odG9ubCAodmFsdWUpOwotICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgJm5ldCwgNCwgZXJyb3IpKQotICB7Ci0gICAgcmV0dXJuIDQ7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDY0IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0KLSAgZ2ludDY0IG5ldCA9IEdVSU5UNjRfVE9fQkUgKHZhbHVlKTsKLSAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHByb3RvY29sLT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpICZuZXQsIDgsIGVycm9yKSkKLSAgewotICAgIHJldHVybiA4OwotICB9IGVsc2UgewotICAgIHJldHVybiAtMTsKLSAgfQotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2RvdWJsZSB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLQotICBndWludDY0IGJpdHMgPSBHVUlOVDY0X0ZST01fQkUgKHRocmlmdF9iaXR3aXNlX2Nhc3RfZ3VpbnQ2NCAodmFsdWUpKTsKLSAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHByb3RvY29sLT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpICZiaXRzLCA4LCBlcnJvcikpCi0gIHsKLSAgICByZXR1cm4gODsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpzdHIsIEdFcnJvciAqKmVycm9yKQotewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0KLSAgZ3VpbnQzMiBsZW4gPSBzdHIgIT0gTlVMTCA/IHN0cmxlbiAoc3RyKSA6IDA7Ci0gIC8qIHdyaXRlIHRoZSBzdHJpbmcgbGVuZ3RoICsgMSB3aGljaCBpbmNsdWRlcyB0aGUgbnVsbCB0ZXJtaW5hdG9yICovCi0gIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgKGNvbnN0IGdwb2ludGVyKSBzdHIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncG9pbnRlciBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQotewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0gIGdpbnQzMiByZXQ7Ci0gIGdpbnQzMiB4ZmVyID0gMDsKLQotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBsZW4sIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHhmZXIgKz0gcmV0OwotCi0gIGlmIChsZW4gPiAwKQotICB7Ci0gICAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHByb3RvY29sLT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgYnVmLCBsZW4sIGVycm9yKSA9PSBGQUxTRSkKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHhmZXIgKz0gbGVuOwotICB9Ci0KLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0TWVzc2FnZVR5cGUgKm1lc3NhZ2VfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgKnNlcWlkLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotCi0gIGdpbnQzMiByZXQ7Ci0gIGdpbnQzMiB4ZmVyID0gMDsKLSAgZ2ludDMyIHN6OwotCi0gIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnN6LCBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICB4ZmVyICs9IHJldDsKLQotICBpZiAoc3ogPCAwKQotICB7Ci0gICAgLyogY2hlY2sgZm9yIHZlcnNpb24gKi8KLSAgICBndWludDMyIHZlcnNpb24gPSBzeiAmIFRIUklGVF9CSU5BUllfUFJPVE9DT0xfVkVSU0lPTl9NQVNLOwotICAgIGlmICh2ZXJzaW9uICE9IFRIUklGVF9CSU5BUllfUFJPVE9DT0xfVkVSU0lPTl8xKQotICAgIHsKLSAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAotICAgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9CQURfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgdmVyc2lvbiAlZCwgZ290ICVkIiwKLSAgICAgICAgICAgICAgICAgICBUSFJJRlRfQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fMSwgdmVyc2lvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgKm1lc3NhZ2VfdHlwZSA9IChUaHJpZnRNZXNzYWdlVHlwZSkgKHN6ICYgMHgwMDAwMDBmZik7Ci0KLSAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsIG5hbWUsIGVycm9yKSkgPCAwKQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgeGZlciArPSByZXQ7Ci0KLSAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsIHNlcWlkLCBlcnJvcikpIDwgMCkKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHhmZXIgKz0gcmV0OwotICB9Ci0gIHJldHVybiB4ZmVyOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gICpuYW1lID0gTlVMTDsKLSAgcmV0dXJuIDA7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZmllbGRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDE2ICpmaWVsZF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChuYW1lKTsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotCi0gIGdpbnQzMiByZXQ7Ci0gIGdpbnQzMiB4ZmVyID0gMDsKLSAgZ2ludDggdHlwZTsKLQotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdHlwZSwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgeGZlciArPSByZXQ7Ci0gICpmaWVsZF90eXBlID0gKFRocmlmdFR5cGUpIHR5cGU7Ci0gIGlmICgqZmllbGRfdHlwZSA9PSBUX1NUT1ApCi0gIHsKLSAgICAqZmllbGRfaWQgPSAwOwotICAgIHJldHVybiB4ZmVyOwotICB9Ci0gIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgZmllbGRfaWQsIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHhmZXIgKz0gcmV0OwotICByZXR1cm4geGZlcjsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqa2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICp2YWx1ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0KLSAgZ2ludDMyIHJldDsKLSAgZ2ludDMyIHhmZXIgPSAwOwotICBnaW50OCBrLCB2OwotICBnaW50MzIgc2l6ZWk7Ci0KLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJmssIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHhmZXIgKz0gcmV0OwotICAqa2V5X3R5cGUgPSAoVGhyaWZ0VHlwZSkgazsKLQotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdiwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgeGZlciArPSByZXQ7Ci0gICp2YWx1ZV90eXBlID0gKFRocmlmdFR5cGUpIHY7Ci0KLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmc2l6ZWksIGVycm9yKSkgPDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgeGZlciArPSByZXQ7Ci0KLSAgaWYgKHNpemVpIDwgMCkKLSAgewotICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAotICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTkVHQVRJVkVfU0laRSwKLSAgICAgICAgICAgICAgICAgImdvdCBuZWdhdGl2ZSBzaXplIG9mICVkIiwgc2l6ZWkpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gICpzaXplID0gKGd1aW50MzIpIHNpemVpOwotICByZXR1cm4geGZlcjsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICByZXR1cm4gMDsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotCi0gIGdpbnQzMiByZXQ7Ci0gIGdpbnQzMiB4ZmVyID0gMDsKLSAgZ2ludDggZTsKLSAgZ2ludDMyIHNpemVpOwotCi0gIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZlLCBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICB4ZmVyICs9IHJldDsKLSAgKmVsZW1lbnRfdHlwZSA9IChUaHJpZnRUeXBlKSBlOwotCi0gIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnNpemVpLCBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICB4ZmVyICs9IHJldDsKLQotICBpZiAoc2l6ZWkgPCAwKQotICB7Ci0gICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCi0gICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ORUdBVElWRV9TSVpFLAotICAgICAgICAgICAgICAgICAiZ290IG5lZ2F0aXZlIHNpemUgb2YgJWQiLCBzaXplaSk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgKnNpemUgPSAoZ3VpbnQzMikgc2l6ZWk7Ci0gIHJldHVybiB4ZmVyOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLQotICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsIGVsZW1lbnRfdHlwZSwgc2l6ZSwgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiAwOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdib29sZWFuICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotICBnaW50MzIgcmV0OwotICBncG9pbnRlciBiWzFdOwotCi0gIGlmICgocmV0ID0gCi0gICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiwgMSwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgKnZhbHVlID0gKihnaW50OCAqKSBiICE9IDA7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDggKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0gIGdpbnQzMiByZXQ7Ci0gIGdwb2ludGVyIGJbMV07Ci0KLSAgaWYgKChyZXQgPQotICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIsIDEsIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gICp2YWx1ZSA9ICooZ2ludDggKikgYjsKLSAgcmV0dXJuIHJldDsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQxNiAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotICBnaW50MzIgcmV0OwotICBncG9pbnRlciBiWzJdOwotCi0gIGlmICgocmV0ID0KLSAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKHByb3RvY29sLT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLCAyLCBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICAqdmFsdWUgPSAqKGdpbnQxNiAqKSBiOwotICAqdmFsdWUgPSBnX250b2hzICgqdmFsdWUpOwotICByZXR1cm4gcmV0OwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDMyICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0gIGdpbnQzMiByZXQ7Ci0gIGdwb2ludGVyIGJbNF07Ci0KLSAgaWYgKChyZXQgPQotICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIsIDQsIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gICp2YWx1ZSA9ICooZ2ludDMyICopIGI7Ci0gICp2YWx1ZSA9IGdfbnRvaGwgKCp2YWx1ZSk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50NjQgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLSAgZ2ludDMyIHJldDsKLSAgZ3BvaW50ZXIgYls4XTsKLQotICBpZiAoKHJldCA9Ci0gICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiwgOCwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgKnZhbHVlID0gKihnaW50NjQgKikgYjsKLSAgKnZhbHVlID0gR1VJTlQ2NF9GUk9NX0JFICgqdmFsdWUpOwotICByZXR1cm4gcmV0OwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9kb3VibGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUgKnZhbHVlLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotICBnaW50MzIgcmV0OwotICBncG9pbnRlciBiWzhdOwotCi0gIGlmICgocmV0ID0KLSAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKHByb3RvY29sLT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLCA4LCBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICBndWludDY0IGJpdHMgPSAqKGd1aW50NjQgKikgYjsKLSAgYml0cyA9IEdVSU5UNjRfRlJPTV9CRSAoYml0cyk7Ci0gICp2YWx1ZSA9IHRocmlmdF9iaXR3aXNlX2Nhc3RfZ2RvdWJsZSAoYml0cyk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipzdHIsIEdFcnJvciAqKmVycm9yKQotewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0gIGd1aW50MzIgbGVuOwotICBnaW50MzIgcmV0OwotICBnaW50MzIgeGZlciA9IDA7Ci0gIGdpbnQzMiByZWFkX2xlbiA9IDA7Ci0KLSAgLyogcmVhZCB0aGUgbGVuZ3RoIGludG8gcmVhZF9sZW4gKi8KLSAgaWYgKChyZXQgPQotICAgICAgIHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZyZWFkX2xlbiwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgeGZlciArPSByZXQ7Ci0KLSAgaWYgKHJlYWRfbGVuID4gMCkKLSAgewotICAgIC8qIGFsbG9jYXRlIHRoZSBtZW1vcnkgZm9yIHRoZSBzdHJpbmcgKi8KLSAgICBsZW4gPSAoZ3VpbnQzMikgcmVhZF9sZW4gKyAxOyAvLyBzcGFjZSBmb3IgbnVsbCB0ZXJtaW5hdG9yCi0gICAgKnN0ciA9IGdfbmV3MCAoZ2NoYXIsIGxlbik7Ci0gICAgaWYgKChyZXQgPQotICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyLCByZWFkX2xlbiwgZXJyb3IpKSA8IDApCi0gICAgewotICAgICAgZ19mcmVlICgqc3RyKTsKLSAgICAgICpzdHIgPSBOVUxMOwotICAgICAgbGVuID0gMDsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgeGZlciArPSByZXQ7Ci0gIH0gZWxzZSB7Ci0gICAgKnN0ciA9IE5VTEw7Ci0gIH0KLQotICByZXR1cm4geGZlcjsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciAqYnVmLCBndWludDMyICpsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotICBnaW50MzIgcmV0OwotICBnaW50MzIgeGZlciA9IDA7Ci0gIGdpbnQzMiByZWFkX2xlbiA9IDA7Ci0gCi0gIC8qIHJlYWQgdGhlIGxlbmd0aCBpbnRvIHJlYWRfbGVuICovCi0gIGlmICgocmV0ID0KLSAgICAgICB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmcmVhZF9sZW4sIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHhmZXIgKz0gcmV0OwotCi0gIGlmIChyZWFkX2xlbiA+IDApCi0gIHsKLSAgICAvKiBhbGxvY2F0ZSB0aGUgbWVtb3J5IGFzIGFuIGFycmF5IG9mIHVuc2lnbmVkIGNoYXIgZm9yIGJpbmFyeSBkYXRhICovCi0gICAgKmxlbiA9IChndWludDMyKSByZWFkX2xlbjsKLSAgICAqYnVmID0gZ19uZXcgKGd1Y2hhciwgKmxlbik7Ci0gICAgaWYgKChyZXQgPQotICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmLCAqbGVuLCBlcnJvcikpIDwgMCkKLSAgICB7Ci0gICAgICBnX2ZyZWUgKCpidWYpOwotICAgICAgKmJ1ZiA9IE5VTEw7Ci0gICAgICAqbGVuID0gMDsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgeGZlciArPSByZXQ7Ci0gIH0gZWxzZSB7Ci0gICAgKmJ1ZiA9IE5VTEw7Ci0gIH0KLQotICByZXR1cm4geGZlcjsKLX0KLQotc3RhdGljIHZvaWQKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfaW5pdCAoVGhyaWZ0QmluYXJ5UHJvdG9jb2wgKnByb3RvY29sKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOwotfQotCi0vKiBpbml0aWFsaXplIHRoZSBjbGFzcyAqLwotc3RhdGljIHZvaWQKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfY2xhc3NfaW5pdCAoVGhyaWZ0QmluYXJ5UHJvdG9jb2xDbGFzcyAqa2xhc3MpCi17Ci0gIFRocmlmdFByb3RvY29sQ2xhc3MgKmNscyA9IFRIUklGVF9QUk9UT0NPTF9DTEFTUyAoa2xhc3MpOwotCi0gIGNscy0+d3JpdGVfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbjsKLSAgY2xzLT53cml0ZV9tZXNzYWdlX2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQ7Ci0gIGNscy0+d3JpdGVfc3RydWN0X2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW47Ci0gIGNscy0+d3JpdGVfc3RydWN0X2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZDsKLSAgY2xzLT53cml0ZV9maWVsZF9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW47Ci0gIGNscy0+d3JpdGVfZmllbGRfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQ7Ci0gIGNscy0+d3JpdGVfZmllbGRfc3RvcCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcDsKLSAgY2xzLT53cml0ZV9tYXBfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbjsKLSAgY2xzLT53cml0ZV9tYXBfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfZW5kOwotICBjbHMtPndyaXRlX2xpc3RfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW47Ci0gIGNscy0+d3JpdGVfbGlzdF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kOwotICBjbHMtPndyaXRlX3NldF9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luOwotICBjbHMtPndyaXRlX3NldF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3NldF9lbmQ7Ci0gIGNscy0+d3JpdGVfYm9vbCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYm9vbDsKLSAgY2xzLT53cml0ZV9ieXRlID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlOwotICBjbHMtPndyaXRlX2kxNiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTE2OwotICBjbHMtPndyaXRlX2kzMiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyOwotICBjbHMtPndyaXRlX2k2NCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTY0OwotICBjbHMtPndyaXRlX2RvdWJsZSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZG91YmxlOwotICBjbHMtPndyaXRlX3N0cmluZyA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RyaW5nOwotICBjbHMtPndyaXRlX2JpbmFyeSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5OwotICBjbHMtPnJlYWRfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luOwotICBjbHMtPnJlYWRfbWVzc2FnZV9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQ7Ci0gIGNscy0+cmVhZF9zdHJ1Y3RfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luOwotICBjbHMtPnJlYWRfc3RydWN0X2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kOwotICBjbHMtPnJlYWRfZmllbGRfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW47Ci0gIGNscy0+cmVhZF9maWVsZF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kOwotICBjbHMtPnJlYWRfbWFwX2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbjsKLSAgY2xzLT5yZWFkX21hcF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2VuZDsKLSAgY2xzLT5yZWFkX2xpc3RfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbjsKLSAgY2xzLT5yZWFkX2xpc3RfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2xpc3RfZW5kOwotICBjbHMtPnJlYWRfc2V0X2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3NldF9iZWdpbjsKLSAgY2xzLT5yZWFkX3NldF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc2V0X2VuZDsKLSAgY2xzLT5yZWFkX2Jvb2wgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYm9vbDsKLSAgY2xzLT5yZWFkX2J5dGUgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZTsKLSAgY2xzLT5yZWFkX2kxNiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMTY7Ci0gIGNscy0+cmVhZF9pMzIgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyOwotICBjbHMtPnJlYWRfaTY0ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2k2NDsKLSAgY2xzLT5yZWFkX2RvdWJsZSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9kb3VibGU7Ci0gIGNscy0+cmVhZF9zdHJpbmcgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RyaW5nOwotICBjbHMtPnJlYWRfYmluYXJ5ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeTsKLX0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaCBiL2xpYi9jX2dsaWIvc3JjL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVkY2VkOS4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9CSU5BUllfUFJPVE9DT0xfSAotI2RlZmluZSBfVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9ICi0KLSNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgotCi0jaW5jbHVkZSAicHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaCIKLQotR19CRUdJTl9ERUNMUwotCi0vKiEgXGZpbGUgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oCi0gKiAgXGJyaWVmIEJpbmFyeSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBwcm90b2NvbC4gIEltcGxlbWVudHMgdGhlCi0gKiAgICAgICAgIFRocmlmdFByb3RvY29sIGludGVyZmFjZS4KLSAqLwotCi0vKiB0eXBlIG1hY3JvcyAqLwotI2RlZmluZSBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZ2V0X3R5cGUgKCkpCi0jZGVmaW5lIFRIUklGVF9CSU5BUllfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsIFRocmlmdEJpbmFyeVByb3RvY29sKSkKLSNkZWZpbmUgVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCkpCi0jZGVmaW5lIFRIUklGVF9CSU5BUllfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgVGhyaWZ0QmluYXJ5UHJvdG9jb2xDbGFzcykpCi0jZGVmaW5lIFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCkpCi0jZGVmaW5lIFRIUklGVF9CSU5BUllfUFJPVE9DT0xfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsIFRocmlmdEJpbmFyeVByb3RvY29sQ2xhc3MpKQotCi0vKiB2ZXJzaW9uIG51bWJlcnMgKi8KLSNkZWZpbmUgVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9WRVJTSU9OXzEgMHg4MDAxMDAwMAotI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fTUFTSyAweGZmZmYwMDAwCi0KLS8qIQotICogVGhyaWZ0IEJpbmFyeSBQcm90b2NvbCBpbnN0YW5jZS4KLSAqLwotc3RydWN0IF9UaHJpZnRCaW5hcnlQcm90b2NvbAotewotICBUaHJpZnRQcm90b2NvbCBwYXJlbnQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEJpbmFyeVByb3RvY29sIFRocmlmdEJpbmFyeVByb3RvY29sOwotCi0vKiEKLSAqIFRocmlmdCBCaW5hcnkgUHJvdG9jb2wgY2xhc3MuCi0gKi8KLXN0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2xDbGFzcwotewotICBUaHJpZnRQcm90b2NvbENsYXNzIHBhcmVudDsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2xDbGFzcyBUaHJpZnRCaW5hcnlQcm90b2NvbENsYXNzOwotCi0vKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCAqLwotR1R5cGUgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9nZXRfdHlwZSAodm9pZCk7Ci0KLUdfRU5EX0RFQ0xTCi0KLSNlbmRpZiAvKiBfVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuYyBiL2xpYi9jX2dsaWIvc3JjL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzlmNTIyLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAidGhyaWZ0LmgiCi0jaW5jbHVkZSAicHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oIgotI2luY2x1ZGUgInByb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oIgotCi1HX0RFRklORV9UWVBFKFRocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeSwgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZKQotCi1UaHJpZnRQcm90b2NvbCAqCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3Byb3RvY29sIChUaHJpZnRQcm90b2NvbEZhY3RvcnkgKmZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGZhY3RvcnkpOwotCi0gIFRocmlmdEJpbmFyeVByb3RvY29sICp0YiA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsIE5VTEwpOwotCi0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0wgKHRiKTsKLX0KLQotc3RhdGljIHZvaWQKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeV9jbGFzc19pbml0IChUaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnlDbGFzcyAqY2xzKQotewotICBUaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcyAqcHJvdG9jb2xfZmFjdG9yeV9jbGFzcyA9IFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0NMQVNTIChjbHMpOwotCi0gIHByb3RvY29sX2ZhY3RvcnlfY2xhc3MtPmdldF9wcm90b2NvbCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeV9nZXRfcHJvdG9jb2w7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnlfaW5pdCAoVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5KQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZmFjdG9yeSk7Ci19CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuaCBiL2xpYi9jX2dsaWIvc3JjL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjdmY2MyLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUllfSAotI2RlZmluZSBfVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZX0gKLQotI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+Ci0KLSNpbmNsdWRlICJwcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oIgotCi1HX0JFR0lOX0RFQ0xTCi0KLS8qIHR5cGUgbWFjcm9zICovCi0jZGVmaW5lIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3R5cGUgKCkpCi0jZGVmaW5lIFRIUklGVF9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWShvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZLCBUaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnkpKQotI2RlZmluZSBUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlkob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSkpCi0jZGVmaW5lIFRIUklGVF9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWV9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlksIFRocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeUNsYXNzKSkKLSNkZWZpbmUgVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSkpCi0jZGVmaW5lIFRIUklGVF9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWV9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZLCBUaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnlDbGFzcykpCi0KLXN0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Ci17Ci0gIFRocmlmdFByb3RvY29sRmFjdG9yeSBwYXJlbnQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeSBUaHJpZnRCaW5hcnlQcm90b2NvbEZhY3Rvcnk7Ci0KLXN0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Q2xhc3MKLXsKLSAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MgcGFyZW50OwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnlDbGFzcyBUaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnlDbGFzczsKLQotLyogdXNlZCBieSBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSAqLwotR1R5cGUgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5X2dldF90eXBlICh2b2lkKTsKLQotR19FTkRfREVDTFMKLQotI2VuZGlmIC8qIF9USFJJRlRfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUllfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmMgYi9saWIvY19nbGliL3NyYy9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk1MTAzMS4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuYworKysgL2Rldi9udWxsCkBAIC0xLDU4OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ0aHJpZnQuaCIKLSNpbmNsdWRlICJwcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oIgotCi0vKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gc3RyaW5nICovCi0jZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ET01BSU4gInRocmlmdC1wcm90b2NvbC1lcnJvci1xdWFyayIKLQotLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KLWVudW0gX1RocmlmdFByb3RvY29sUHJvcGVydGllcwotewotICBQUk9QXzAsCi0gIFBST1BfVEhSSUZUX1BST1RPQ09MX1RSQU5TUE9SVAotfTsKLQotR19ERUZJTkVfQUJTVFJBQ1RfVFlQRShUaHJpZnRQcm90b2NvbCwgdGhyaWZ0X3Byb3RvY29sLCBHX1RZUEVfT0JKRUNUKQotCi12b2lkCi10aHJpZnRfcHJvdG9jb2xfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCi17Ci0gIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAob2JqZWN0KTsKLQotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOwotCi0gIHN3aXRjaCAocHJvcGVydHlfaWQpCi0gIHsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1BST1RPQ09MX1RSQU5TUE9SVDoKLSAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHByb3RvY29sLT50cmFuc3BvcnQpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZAotdGhyaWZ0X3Byb3RvY29sX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQotewotCi0gIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAob2JqZWN0KTsKLQotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOwotCi0gIHN3aXRjaCAocHJvcGVydHlfaWQpCi0gIHsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1BST1RPQ09MX1RSQU5TUE9SVDoKLSAgICAgIHByb3RvY29sLT50cmFuc3BvcnQgPSBnX3ZhbHVlX2dldF9vYmplY3QgKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiBzZXFpZCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX21lc3NhZ2VfYmVnaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm90b2NvbCwgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX3R5cGUsIHNlcWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX21lc3NhZ2VfZW5kIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGZpZWxkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQxNiBmaWVsZF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGZpZWxkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9pZCwgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9maWVsZF9zdG9wIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUga2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIHZhbHVlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUsIHZhbHVlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX21hcF9lbmQgKHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2xpc3RfZW5kIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX3NldF9iZWdpbiAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX3NldF9lbmQgKHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYm9vbGVhbiB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2Jvb2wgKHByb3RvY29sLCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ4IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9ieXRlIChwcm90b2NvbCwgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQxNiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9pMTYgKHByb3RvY29sLCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MzIgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfaTMyIChwcm90b2NvbCwgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF93cml0ZV9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDY0IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2k2NCAocHJvdG9jb2wsIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZG91YmxlIHZhbHVlLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfZG91YmxlIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpzdHIsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9zdHJpbmcgKHByb3RvY29sLCBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ3BvaW50ZXIgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9iaW5hcnkgKHByb3RvY29sLCBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7Ci19Ci0KLWdpbnQzMiAKLXRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdE1lc3NhZ2VUeXBlICptZXNzYWdlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgKnNlcWlkLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIG1lc3NhZ2VfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkLCBlcnJvcik7Ci19Ci0KLWdpbnQzMiAKLXRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMiAKLXRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfc3RydWN0X2VuZCAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIgCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICpmaWVsZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQxNiAqZmllbGRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIgCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfZmllbGRfZW5kIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyIAotdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmtleV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICp2YWx1ZV90eXBlLCBndWludDMyICpzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsgCi19Ci0KLWdpbnQzMiAKLXRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfbWFwX2VuZCAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIgCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2xpc3RfZW5kIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX3NldF9iZWdpbiAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9zZXRfZW5kIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3JlYWRfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnYm9vbGVhbiAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9ib29sIChwcm90b2NvbCwgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDggKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfYnl0ZSAocHJvdG9jb2wsIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9pMTYgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDE2ICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfaTE2IChwcm90b2NvbCwgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQzMiAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2kzMiAocHJvdG9jb2wsIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF9yZWFkX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50NjQgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9pNjQgKHByb3RvY29sLCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9kb3VibGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSAqdmFsdWUsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2RvdWJsZSAocHJvdG9jb2wsIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF9yZWFkX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKnN0ciwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfc3RyaW5nIChwcm90b2NvbCwgc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBncG9pbnRlciAqYnVmLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqbGVuLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9iaW5hcnkgKHByb3RvY29sLCBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfc2tpcCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBUaHJpZnRUeXBlIHR5cGUsIEdFcnJvciAqKmVycm9yKQotewotICBzd2l0Y2ggKHR5cGUpCi0gIHsKLSAgICBjYXNlIFRfQk9PTDoKLSAgICAgIHsKLSAgICAgICAgZ2Jvb2xlYW4gYm9vbHY7Ci0gICAgICAgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwgJmJvb2x2LCBlcnJvcik7Ci0gICAgICB9Ci0gICAgY2FzZSBUX0JZVEU6Ci0gICAgICB7Ci0gICAgICAgIGdpbnQ4IGJ5dGV2OwotICAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZieXRldiwgZXJyb3IpOwotICAgICAgfQotCi0gICAgY2FzZSBUX0kxNjoKLSAgICAgIHsKLSAgICAgICAgZ2ludDE2IGkxNjsKLSAgICAgICAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZpMTYsIGVycm9yKTsKLSAgICAgIH0KLSAgICBjYXNlIFRfSTMyOgotICAgICAgewotICAgICAgICBnaW50MzIgaTMyOwotICAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJmkzMiwgZXJyb3IpOwotICAgICAgfQotICAgIGNhc2UgVF9JNjQ6Ci0gICAgICB7Ci0gICAgICAgIGdpbnQ2NCBpNjQ7Ci0gICAgICAgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmaTY0LCBlcnJvcik7Ci0gICAgICB9Ci0gICAgY2FzZSBUX0RPVUJMRToKLSAgICAgIHsKLSAgICAgICAgZ2RvdWJsZSBkdWI7Ci0gICAgICAgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9kb3VibGUgKHByb3RvY29sLCAmZHViLCBlcnJvcik7Ci0gICAgICB9Ci0gICAgY2FzZSBUX1NUUklORzoKLSAgICAgIHsKLSAgICAgICAgZ3BvaW50ZXIgZGF0YTsKLSAgICAgICAgZ3VpbnQzMiBsZW47Ci0gICAgICAgIGdpbnQzMiByZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmZGF0YSwgJmxlbiwgZXJyb3IpOwotICAgICAgICBnX2ZyZWUgKGRhdGEpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgICAgfQotICAgIGNhc2UgVF9TVFJVQ1Q6Ci0gICAgICB7Ci0gICAgICAgIGd1aW50MzIgcmVzdWx0ID0gMDsKLSAgICAgICAgZ2NoYXIgKm5hbWU7Ci0gICAgICAgIGdpbnQxNiBmaWQ7Ci0gICAgICAgIFRocmlmdFR5cGUgZnR5cGU7Ci0gICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLCAmbmFtZSwgZXJyb3IpOwotCi0gICAgICAgIHdoaWxlICgxKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJm5hbWUsICZmdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWQsIGVycm9yKTsKLSAgICAgICAgICBpZiAoZnR5cGUgPT0gVF9TVE9QKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBmdHlwZSwgZXJyb3IpOwotICAgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBlcnJvcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKHByb3RvY29sLCBlcnJvcik7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0gICAgY2FzZSBUX01BUDoKLSAgICAgIHsKLSAgICAgICAgZ3VpbnQzMiByZXN1bHQgPSAwOwotICAgICAgICBUaHJpZnRUeXBlIGVsZW1fdHlwZTsKLSAgICAgICAgZ3VpbnQzMiBpLCBzaXplOwotICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1fdHlwZSwgJnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGVsZW1fdHlwZSwgZXJyb3IpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfZW5kIChwcm90b2NvbCwgZXJyb3IpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotICAgIGNhc2UgVF9MSVNUOgotICAgICAgewotICAgICAgICBndWludDMyIHJlc3VsdCA9IDA7Ci0gICAgICAgIFRocmlmdFR5cGUgZWxlbV90eXBlOwotICAgICAgICBndWludDMyIGksIHNpemU7Ci0gICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1fdHlwZSwgJnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBlbGVtX3R5cGUsIGVycm9yKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9lbmQgKHByb3RvY29sLCBlcnJvcik7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICB9Ci19Ci0KLS8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBmb3IgVGhyaWZ0IHByb3RvY29scyAqLwotR1F1YXJrCi10aHJpZnRfcHJvdG9jb2xfZXJyb3JfcXVhcmsgKHZvaWQpCi17Ci0gIHJldHVybiBnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZyAoVEhSSUZUX1BST1RPQ09MX0VSUk9SX0RPTUFJTik7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXRocmlmdF9wcm90b2NvbF9pbml0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wpCi17Ci0gIHByb3RvY29sLT50cmFuc3BvcnQgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3Byb3RvY29sX2NsYXNzX2luaXQgKFRocmlmdFByb3RvY29sQ2xhc3MgKmNscykKLXsKLSAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7Ci0KLSAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3Byb3RvY29sX2dldF9wcm9wZXJ0eTsKLSAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3Byb3RvY29sX3NldF9wcm9wZXJ0eTsKLQotICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAotICAgICAgUFJPUF9USFJJRlRfUFJPVE9DT0xfVFJBTlNQT1JULAotICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoInRyYW5zcG9ydCIsICJUcmFuc3BvcnQiLCAiVGhyaWZ0IFRyYW5zcG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9UUkFOU1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpKTsKLQotICBjbHMtPndyaXRlX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbjsKLSAgY2xzLT53cml0ZV9tZXNzYWdlX2VuZCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZDsKLSAgY2xzLT53cml0ZV9zdHJ1Y3RfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luOwotICBjbHMtPndyaXRlX3N0cnVjdF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZDsKLSAgY2xzLT53cml0ZV9maWVsZF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbjsKLSAgY2xzLT53cml0ZV9maWVsZF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kOwotICBjbHMtPndyaXRlX2ZpZWxkX3N0b3AgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcDsKLSAgY2xzLT53cml0ZV9tYXBfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luOwotICBjbHMtPndyaXRlX21hcF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZDsKLSAgY2xzLT53cml0ZV9saXN0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW47Ci0gIGNscy0+d3JpdGVfbGlzdF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQ7Ci0gIGNscy0+d3JpdGVfc2V0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbjsKLSAgY2xzLT53cml0ZV9zZXRfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9lbmQ7Ci0gIGNscy0+d3JpdGVfYm9vbCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ib29sOwotICBjbHMtPndyaXRlX2J5dGUgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZTsKLSAgY2xzLT53cml0ZV9pMTYgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTE2OwotICBjbHMtPndyaXRlX2kzMiA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzI7Ci0gIGNscy0+d3JpdGVfaTY0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2k2NDsKLSAgY2xzLT53cml0ZV9kb3VibGUgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZG91YmxlOwotICBjbHMtPndyaXRlX3N0cmluZyA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJpbmc7Ci0gIGNscy0+d3JpdGVfYmluYXJ5ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeTsKLSAgY2xzLT5yZWFkX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luOwotICBjbHMtPnJlYWRfbWVzc2FnZV9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZDsKLSAgY2xzLT5yZWFkX3N0cnVjdF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbjsKLSAgY2xzLT5yZWFkX3N0cnVjdF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kOwotICBjbHMtPnJlYWRfZmllbGRfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbjsKLSAgY2xzLT5yZWFkX2ZpZWxkX2VuZCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZDsKLSAgY2xzLT5yZWFkX21hcF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbjsKLSAgY2xzLT5yZWFkX21hcF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfZW5kOwotICBjbHMtPnJlYWRfbGlzdF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW47Ci0gIGNscy0+cmVhZF9zZXRfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW47Ci0gIGNscy0+cmVhZF9zZXRfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2VuZDsKLSAgY2xzLT5yZWFkX2Jvb2wgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ib29sOwotICBjbHMtPnJlYWRfYnl0ZSA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGU7Ci0gIGNscy0+cmVhZF9pMTYgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMTY7Ci0gIGNscy0+cmVhZF9pMzIgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzI7Ci0gIGNscy0+cmVhZF9pNjQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pNjQ7Ci0gIGNscy0+cmVhZF9kb3VibGUgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9kb3VibGU7Ci0gIGNscy0+cmVhZF9zdHJpbmcgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJpbmc7Ci0gIGNscy0+cmVhZF9iaW5hcnkgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnk7Ci19CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaCBiL2xpYi9jX2dsaWIvc3JjL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWVhZWQ5Li4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX0gKLSNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9ICi0KLSNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgotCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaCIKLQotR19CRUdJTl9ERUNMUwotCi0vKiEgXGZpbGUgdGhyaWZ0X3Byb3RvY29sLmgKLSAqICBcYnJpZWYgQWJzdHJhY3QgY2xhc3MgZm9yIFRocmlmdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbnMuCi0gKi8KLQotLyoqCi0gKiBFbnVtZXJhdGVkIGRlZmluaXRpb24gb2YgdGhlIHR5cGVzIHRoYXQgdGhlIFRocmlmdCBwcm90b2NvbCBzdXBwb3J0cy4KLSAqIFRha2Ugc3BlY2lhbCBub3RlIG9mIHRoZSBUX0VORCB0eXBlIHdoaWNoIGlzIHVzZWQgc3BlY2lmaWNhbGx5IHRvIG1hcmsKLSAqIHRoZSBlbmQgb2YgYSBzZXF1ZW5jZSBvZiBmaWVsZHMuCi0gKi8KLXR5cGVkZWYgZW51bSB7Ci0gIFRfU1RPUCAgID0gMCwKLSAgVF9WT0lEICAgPSAxLAotICBUX0JPT0wgICA9IDIsCi0gIFRfQllURSAgID0gMywKLSAgVF9JMDggICAgPSAzLAotICBUX0kxNiAgICA9IDYsCi0gIFRfSTMyICAgID0gOCwKLSAgVF9VNjQgICAgPSA5LAotICBUX0k2NCAgICA9IDEwLAotICBUX0RPVUJMRSA9IDQsCi0gIFRfU1RSSU5HID0gMTEsCi0gIFRfVVRGNyAgID0gMTEsCi0gIFRfU1RSVUNUID0gMTIsCi0gIFRfTUFQICAgID0gMTMsCi0gIFRfU0VUICAgID0gMTQsCi0gIFRfTElTVCAgID0gMTUsCi0gIFRfVVRGOCAgID0gMTYsCi0gIFRfVVRGMTYgID0gMTcKLX0gVGhyaWZ0VHlwZTsKLQotLyoqCi0gKiBFbnVtZXJhdGVkIGRlZmluaXRpb24gb2YgdGhlIG1lc3NhZ2UgdHlwZXMgdGhhdCB0aGUgVGhyaWZ0IHByb3RvY29sCi0gKiBzdXBwb3J0cy4KLSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgVF9DQUxMICAgICAgPSAxLAotICBUX1JFUExZICAgICA9IDIsCi0gIFRfRVhDRVBUSU9OID0gMywKLSAgVF9PTkVXQVkgICAgPSA0Ci19IFRocmlmdE1lc3NhZ2VUeXBlOwotCi0vKiB0eXBlIG1hY3JvcyAqLwotI2RlZmluZSBUSFJJRlRfVFlQRV9QUk9UT0NPTCAodGhyaWZ0X3Byb3RvY29sX2dldF90eXBlICgpKQotI2RlZmluZSBUSFJJRlRfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTCwgVGhyaWZ0UHJvdG9jb2wpKQotI2RlZmluZSBUSFJJRlRfSVNfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTCkpCi0jZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0wsIFRocmlmdFByb3RvY29sQ2xhc3MpKQotI2RlZmluZSBUSFJJRlRfSVNfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1BST1RPQ09MKSkKLSNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0wsIFRocmlmdFByb3RvY29sQ2xhc3MpKQotCi0vKiEKLSAqIFRocmlmdCBQcm90b2NvbCBvYmplY3QKLSAqLwotc3RydWN0IF9UaHJpZnRQcm90b2NvbAotewotICBHT2JqZWN0IHBhcmVudDsKLQotICAvKiBwcm90ZWN0ZWQgKi8KLSAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFByb3RvY29sIFRocmlmdFByb3RvY29sOwotCi0vKiEKLSAqIFRocmlmdCBQcm90b2NvbCBjbGFzcwotICovCi1zdHJ1Y3QgX1RocmlmdFByb3RvY29sQ2xhc3MKLXsKLSAgR09iamVjdENsYXNzIHBhcmVudDsKLQotICBnaW50MzIgKCp3cml0ZV9tZXNzYWdlX2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiBzZXFpZCwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCp3cml0ZV9tZXNzYWdlX2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCp3cml0ZV9zdHJ1Y3RfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKndyaXRlX3N0cnVjdF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqd3JpdGVfZmllbGRfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZmllbGRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MTYgZmllbGRfaWQsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqd3JpdGVfZmllbGRfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKndyaXRlX2ZpZWxkX3N0b3ApIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqd3JpdGVfbWFwX2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGtleV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIHZhbHVlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCp3cml0ZV9tYXBfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKndyaXRlX2xpc3RfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCp3cml0ZV9saXN0X2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCp3cml0ZV9zZXRfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqd3JpdGVfc2V0X2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCp3cml0ZV9ib29sKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnYm9vbGVhbiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqd3JpdGVfYnl0ZSkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDggdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKndyaXRlX2kxNikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDE2IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKndyaXRlX2kzMikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDMyIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKndyaXRlX2k2NCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDY0IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKndyaXRlX2RvdWJsZSkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2RvdWJsZSB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCp3cml0ZV9zdHJpbmcpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdjaGFyICpzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqd3JpdGVfYmluYXJ5KSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBncG9pbnRlciBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcik7Ci0KLSAgZ2ludDMyICgqcmVhZF9tZXNzYWdlX2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnRocmlmdF9wcm90b2NvbCwgZ2NoYXIgKipuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRNZXNzYWdlVHlwZSAqbWVzc2FnZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgKnNlcWlkLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKnJlYWRfbWVzc2FnZV9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqcmVhZF9zdHJ1Y3RfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdjaGFyICoqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKnJlYWRfc3RydWN0X2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCpyZWFkX2ZpZWxkX2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnY2hhciAqKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICpmaWVsZF90eXBlLCBnaW50MTYgKmZpZWxkX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCpyZWFkX2ZpZWxkX2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCpyZWFkX21hcF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgVGhyaWZ0VHlwZSAqa2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqdmFsdWVfdHlwZSwgZ3VpbnQzMiAqc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKnJlYWRfbWFwX2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCpyZWFkX2xpc3RfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCpyZWFkX2xpc3RfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKnJlYWRfc2V0X2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCpyZWFkX3NldF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqcmVhZF9ib29sKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnYm9vbGVhbiAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqcmVhZF9ieXRlKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50OCAqdmFsdWUsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqcmVhZF9pMTYpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQxNiAqdmFsdWUsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqcmVhZF9pMzIpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQzMiAqdmFsdWUsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqcmVhZF9pNjQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ2NCAqdmFsdWUsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqcmVhZF9kb3VibGUpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdkb3VibGUgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqcmVhZF9zdHJpbmcpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdjaGFyICoqc3RyLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKnJlYWRfYmluYXJ5KSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBncG9pbnRlciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKmxlbiwgR0Vycm9yICoqZXJyb3IpOwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRQcm90b2NvbENsYXNzIFRocmlmdFByb3RvY29sQ2xhc3M7Ci0KLS8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfUFJPVE9DT0wgKi8KLUdUeXBlIHRocmlmdF9wcm90b2NvbF9nZXRfdHlwZSAodm9pZCk7Ci0KLS8qIHZpcnR1YWwgcHVibGljIG1ldGhvZHMgKi8KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwgY29uc3QgVGhyaWZ0TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlLAotICAgICAgICAgICBjb25zdCBnaW50MzIgc2VxaWQsIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGZpZWxkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MTYgZmllbGRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3AgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUga2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSB2YWx1ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYm9vbGVhbiB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDggdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9pMTYgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDE2IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDMyIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDY0IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9kb3VibGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZG91YmxlIHZhbHVlLCBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKnN0ciwgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnRocmlmdF9wcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0TWVzc2FnZVR5cGUgKm1lc3NhZ2VfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgKnNlcWlkLCBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmZpZWxkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQxNiAqZmllbGRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICprZXlfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKnZhbHVlX3R5cGUsIGd1aW50MzIgKnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2Jvb2xlYW4gKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDggKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MTYgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQzMiAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDY0ICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSAqdmFsdWUsIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipzdHIsIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgKmJ1ZiwgZ3VpbnQzMiAqbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3NraXAgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgVGhyaWZ0VHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLS8qIGRlZmluZSBlcnJvciB0eXBlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9VTktOT1dOLAotICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfSU5WQUxJRF9EQVRBLAotICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTkVHQVRJVkVfU0laRSwKLSAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX1NJWkVfTElNSVQsCi0gIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9CQURfVkVSU0lPTiwKLSAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05PVF9JTVBMRU1FTlRFRAotfSBUaHJpZnRQcm90b2NvbEVycm9yOwotCi0vKiBkZWZpbmUgYW4gZXJyb3IgZG9tYWluIGZvciBHRXJyb3IgdG8gdXNlICovCi1HUXVhcmsgdGhyaWZ0X3Byb3RvY29sX2Vycm9yX3F1YXJrICh2b2lkKTsKLSNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0VSUk9SICh0aHJpZnRfcHJvdG9jb2xfZXJyb3JfcXVhcmsgKCkpCi0KLUdfRU5EX0RFQ0xTCi0KLSNlbmRpZiAvKiBfVEhSSUZUX1BST1RPQ09MX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmMgYi9saWIvY19nbGliL3NyYy9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzNiMzNjLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ0aHJpZnQuaCIKLSNpbmNsdWRlICJwcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oIgotCi1HX0RFRklORV9BQlNUUkFDVF9UWVBFKFRocmlmdFByb3RvY29sRmFjdG9yeSwgdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnksIEdfVFlQRV9PQkpFQ1QpCi0KLVRocmlmdFByb3RvY29sICoKLXRocmlmdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm90b2NvbChUaHJpZnRQcm90b2NvbEZhY3RvcnkgKmZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9HRVRfQ0xBU1MgKGZhY3RvcnkpLT5nZXRfcHJvdG9jb2wgKGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHJpZnRfcHJvdG9jb2xfZmFjdG9yeV9pbml0IChUaHJpZnRQcm90b2NvbEZhY3RvcnkgKmZhY3RvcnkpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChmYWN0b3J5KTsKLX0KLQotc3RhdGljIHZvaWQKLXRocmlmdF9wcm90b2NvbF9mYWN0b3J5X2NsYXNzX2luaXQgKFRocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzICpjbHMpCi17Ci0gIGNscy0+Z2V0X3Byb3RvY29sID0gdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3Byb3RvY29sOwotfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaCBiL2xpYi9jX2dsaWIvc3JjL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YWViMWIuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfSAotI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfSAotCi0jaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KLQotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAicHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmgiCi0KLUdfQkVHSU5fREVDTFMKLQotLyohIFxmaWxlIHRocmlmdF9wcm90b2NvbF9mYWN0b3J5LmgKLSAqICBcYnJpZWYgQWJzdHJhY3QgY2xhc3MgZm9yIFRocmlmdCBwcm90b2NvbCBmYWN0b3J5IGltcGxlbWVudGF0aW9ucy4KLSAqLwotCi0vKiB0eXBlIG1hY3JvcyAqLwotI2RlZmluZSBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZICh0aHJpZnRfcHJvdG9jb2xfZmFjdG9yeV9nZXRfdHlwZSAoKSkKLSNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUlkob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZLCBUaHJpZnRQcm90b2NvbEZhY3RvcnkpKQotI2RlZmluZSBUSFJJRlRfSVNfUFJPVE9DT0xfRkFDVE9SWShvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlkpKQotI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSwgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MpKQotI2RlZmluZSBUSFJJRlRfSVNfUFJPVE9DT0xfRkFDVE9SWV9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSkpCi0jZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSwgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MpKQotCi0vKiEKLSAqIFRocmlmdCBQcm90b2NvbCBGYWN0b3J5IG9iamVjdAotICovCi1zdHJ1Y3QgX1RocmlmdFByb3RvY29sRmFjdG9yeQotewotICBHT2JqZWN0IHBhcmVudDsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvdG9jb2xGYWN0b3J5IFRocmlmdFByb3RvY29sRmFjdG9yeTsKLQotLyohCi0gKiBUaHJpZnQgUHJvdG9jb2wgRmFjdG9yeSBjbGFzcwotICovCi1zdHJ1Y3QgX1RocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzCi17Ci0gIEdPYmplY3RDbGFzcyBwYXJlbnQ7Ci0KLSAgVGhyaWZ0UHJvdG9jb2wgKigqZ2V0X3Byb3RvY29sKSAoVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzIFRocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzOwotCi0vKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlkgKi8KLUdUeXBlIHRocmlmdF9wcm90b2NvbF9mYWN0b3J5X2dldF90eXBlICh2b2lkKTsKLQotLyogdmlydHVhbCBwdWJsaWMgbWV0aG9kcyAqLwotVGhyaWZ0UHJvdG9jb2wgKnRocmlmdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm90b2NvbChUaHJpZnRQcm90b2NvbEZhY3RvcnkgKmZhY3RvcnksIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKLQotR19FTkRfREVDTFMKLQotI2VuZGlmIC8qIF9USFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5jIGIvbGliL2NfZ2xpYi9zcmMvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE5OTU3Ni4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInRocmlmdC5oIgotI2luY2x1ZGUgInRocmlmdF9zZXJ2ZXIuaCIKLQotLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KLWVudW0gX1RocmlmdFNlcnZlclByb3BlcnRpZXMKLXsKLSAgUFJPUF8wLAotICBQUk9QX1RIUklGVF9TRVJWRVJfUFJPQ0VTU09SLAotICBQUk9QX1RIUklGVF9TRVJWRVJfU0VSVkVSX1RSQU5TUE9SVCwKLSAgUFJPUF9USFJJRlRfU0VSVkVSX0lOUFVUX1RSQU5TUE9SVF9GQUNUT1JZLAotICBQUk9QX1RIUklGVF9TRVJWRVJfT1VUUFVUX1RSQU5TUE9SVF9GQUNUT1JZLAotICBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfUFJPVE9DT0xfRkFDVE9SWSwKLSAgUFJPUF9USFJJRlRfU0VSVkVSX09VVFBVVF9QUk9UT0NPTF9GQUNUT1JZCi19OwotCi1HX0RFRklORV9BQlNUUkFDVF9UWVBFKFRocmlmdFNlcnZlciwgdGhyaWZ0X3NlcnZlciwgR19UWVBFX09CSkVDVCkKLQotdm9pZAotdGhyaWZ0X3NlcnZlcl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCi17Ci0gIFRocmlmdFNlcnZlciAqc2VydmVyID0gVEhSSUZUX1NFUlZFUiAob2JqZWN0KTsKLQotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOwotCi0gIHN3aXRjaCAocHJvcGVydHlfaWQpCi0gIHsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9QUk9DRVNTT1I6Ci0gICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBzZXJ2ZXItPnByb2Nlc3Nvcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9TRVJWRVJfVFJBTlNQT1JUOgotICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX0lOUFVUX1RSQU5TUE9SVF9GQUNUT1JZOgotICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VydmVyLT5pbnB1dF90cmFuc3BvcnRfZmFjdG9yeSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfVFJBTlNQT1JUX0ZBQ1RPUlk6Ci0gICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBzZXJ2ZXItPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9QUk9UT0NPTF9GQUNUT1JZOgotICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VydmVyLT5pbnB1dF9wcm90b2NvbF9mYWN0b3J5KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX09VVFBVVF9QUk9UT0NPTF9GQUNUT1JZOgotICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VydmVyLT5vdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkCi10aHJpZnRfc2VydmVyX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKLXsKLSAgVGhyaWZ0U2VydmVyICpzZXJ2ZXIgPSBUSFJJRlRfU0VSVkVSIChvYmplY3QpOwotCi0gIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7Ci0KLSAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKLSAgewotICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX1BST0NFU1NPUjoKLSAgICAgIHNlcnZlci0+cHJvY2Vzc29yID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9TRVJWRVJfVFJBTlNQT1JUOgotICAgICAgc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0ID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9UUkFOU1BPUlRfRkFDVE9SWToKLSAgICAgIHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPSBnX3ZhbHVlX2dldF9vYmplY3QgKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX09VVFBVVF9UUkFOU1BPUlRfRkFDVE9SWToKLSAgICAgIHNlcnZlci0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5ID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9QUk9UT0NPTF9GQUNUT1JZOgotICAgICAgc2VydmVyLT5pbnB1dF9wcm90b2NvbF9mYWN0b3J5ID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfUFJPVE9DT0xfRkFDVE9SWToKLSAgICAgIHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkgPSBnX3ZhbHVlX2dldF9vYmplY3QgKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQKLXRocmlmdF9zZXJ2ZXJfc2VydmUgKFRocmlmdFNlcnZlciAqc2VydmVyKQotewotICBUSFJJRlRfU0VSVkVSX0dFVF9DTEFTUyAoc2VydmVyKS0+c2VydmUgKHNlcnZlcik7Ci19Ci0KLXZvaWQKLXRocmlmdF9zZXJ2ZXJfc3RvcCAoVGhyaWZ0U2VydmVyICpzZXJ2ZXIpCi17Ci0gIFRIUklGVF9TRVJWRVJfR0VUX0NMQVNTIChzZXJ2ZXIpLT5zdG9wIChzZXJ2ZXIpOwotfQotCi0vKiBpbnN0YW5jZSBpbml0aWFsaXplciBmb3IgVGhyaWZ0IFNlcnZlciAqLwotc3RhdGljIHZvaWQKLXRocmlmdF9zZXJ2ZXJfaW5pdCAoVGhyaWZ0U2VydmVyICpzZXJ2ZXIpCi17Ci0gIHNlcnZlci0+cHJvY2Vzc29yID0gTlVMTDsKLSAgc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0ID0gTlVMTDsKLSAgc2VydmVyLT5pbnB1dF90cmFuc3BvcnRfZmFjdG9yeSA9IE5VTEw7Ci0gIHNlcnZlci0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5ID0gTlVMTDsKLSAgc2VydmVyLT5pbnB1dF9wcm90b2NvbF9mYWN0b3J5ID0gTlVMTDsKLSAgc2VydmVyLT5vdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSA9IE5VTEw7Ci19Ci0KLS8qIGNsYXNzIGluaXRpYWxpemVyIGZvciBUaHJpZnRTZXJ2ZXIKLSAqIFRPRE86IGltcGxlbWVudCBTZXJ2ZXJFdmVudEhhbmRsZXIgYXMgYSBHQ2xvc3VyZQotICovCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3NlcnZlcl9jbGFzc19pbml0IChUaHJpZnRTZXJ2ZXJDbGFzcyAqY2xzKQotewotICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKLQotICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfc2VydmVyX2dldF9wcm9wZXJ0eTsKLSAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NlcnZlcl9zZXRfcHJvcGVydHk7Ci0KLSAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKLSAgICAgIFBST1BfVEhSSUZUX1NFUlZFUl9QUk9DRVNTT1IsCi0gICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgicHJvY2Vzc29yIiwgIlByb2Nlc3NvciIsICJUaHJpZnQgUHJvY2Vzc29yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST0NFU1NPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSkpOwotICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAotICAgICAgUFJPUF9USFJJRlRfU0VSVkVSX1NFUlZFUl9UUkFOU1BPUlQsCi0gICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgic2VydmVyX3RyYW5zcG9ydCIsICJTZXJ2ZXIgVHJhbnNwb3J0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQgU2VydmVyIFRyYW5zcG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKSk7Ci0gIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCi0gICAgICBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfVFJBTlNQT1JUX0ZBQ1RPUlksCi0gICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgiaW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkiLCAiSW5wdXQgVHJhbnNwb3J0IEZhY3RvcnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdCBTZXJ2ZXIgSW5wdXQgVHJhbnNwb3J0IEZhY3RvcnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpKTsKLSAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKLSAgICAgIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfVFJBTlNQT1JUX0ZBQ1RPUlksCi0gICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgib3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJPdXRwdXQgVHJhbnNwb3J0IEZhY3RvcnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdCBTZXJ2ZXIgT3V0cHV0IFRyYW5zcG9ydCBGYWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKSk7Ci0gIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCi0gICAgICBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfUFJPVE9DT0xfRkFDVE9SWSwKLSAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJpbnB1dF9wcm90b2NvbF9mYWN0b3J5IiwgIklucHV0IFByb3RvY29sIEZhY3RvcnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdCBTZXJ2ZXIgSW5wdXQgUHJvdG9jb2wgRmFjdG9yeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKSk7Ci0gIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCi0gICAgICBQUk9QX1RIUklGVF9TRVJWRVJfT1VUUFVUX1BST1RPQ09MX0ZBQ1RPUlksCi0gICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgib3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkiLCAiT3V0cHV0IFByb3RvY29sIEZhY3RvcnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdCBTZXJ2ZXIgT3V0cHV0IFByb3RvY29sIEZhY3RvcnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSkpOwotCi0gIC8qIHNldCB0aGVzZSBhcyB2aXJ0dWFsIG1ldGhvZHMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcyAqLwotICBjbHMtPnNlcnZlID0gdGhyaWZ0X3NlcnZlcl9zZXJ2ZTsKLSAgY2xzLT5zdG9wID0gdGhyaWZ0X3NlcnZlcl9zdG9wOwotfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvc2VydmVyL3RocmlmdF9zZXJ2ZXIuaCBiL2xpYi9jX2dsaWIvc3JjL3NlcnZlci90aHJpZnRfc2VydmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMTEzZjguLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvc2VydmVyL3RocmlmdF9zZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9ICi0jZGVmaW5lIF9USFJJRlRfU0VSVkVSX0gKLQotI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+Ci0KLSNpbmNsdWRlICJwcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJwcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oIgotCi1HX0JFR0lOX0RFQ0xTCi0KLS8qISBcZmlsZSB0aHJpZnRfc2VydmVyLmgKLSAqICBcYnJpZWYgQWJzdHJhY3QgY2xhc3MgZm9yIFRocmlmdCBzZXJ2ZXJzLgotICovCi0KLS8qIHR5cGUgbWFjcm9zICovCi0jZGVmaW5lIFRIUklGVF9UWVBFX1NFUlZFUiAodGhyaWZ0X3NlcnZlcl9nZXRfdHlwZSAoKSkKLSNkZWZpbmUgVEhSSUZUX1NFUlZFUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUiwgVGhyaWZ0U2VydmVyKSkKLSNkZWZpbmUgVEhSSUZUX0lTX1NFUlZFUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUikpCi0jZGVmaW5lIFRIUklGVF9TRVJWRVJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1NFUlZFUiwgVGhyaWZ0U2VydmVyQ2xhc3MpKQotI2RlZmluZSBUSFJJRlRfSVNfU0VSVkVSX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TRVJWRVIpKQotI2RlZmluZSBUSFJJRlRfU0VSVkVSX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfU0VSVkVSLCBUaHJpZnRTZXJ2ZXJDbGFzcykpCi0KLS8qIQotICogVGhyaWZ0IFNlcnZlciBvYmplY3QKLSAqLwotc3RydWN0IF9UaHJpZnRTZXJ2ZXIKLXsKLSAgR09iamVjdCBwYXJlbnQ7Ci0KLSAgLyogcHJvdGVjdGVkICovCi0gIFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yOwotICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnNlcnZlcl90cmFuc3BvcnQ7Ci0gIFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5OwotICBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpvdXRwdXRfdHJhbnNwb3J0X2ZhY3Rvcnk7Ci0gIFRocmlmdFByb3RvY29sRmFjdG9yeSAqaW5wdXRfcHJvdG9jb2xfZmFjdG9yeTsKLSAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpvdXRwdXRfcHJvdG9jb2xfZmFjdG9yeTsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U2VydmVyIFRocmlmdFNlcnZlcjsKLQotLyohCi0gKiBUaHJpZnQgU2VydmVyIGNsYXNzCi0gKi8KLXN0cnVjdCBfVGhyaWZ0U2VydmVyQ2xhc3MKLXsKLSAgR09iamVjdENsYXNzIHBhcmVudDsKLQotICAvKiB2dGFibGUgKi8KLSAgdm9pZCAoKnNlcnZlKSAoVGhyaWZ0U2VydmVyICpzZXJ2ZXIpOwotICB2b2lkICgqc3RvcCkgKFRocmlmdFNlcnZlciAqc2VydmVyKTsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U2VydmVyQ2xhc3MgVGhyaWZ0U2VydmVyQ2xhc3M7Ci0KLS8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfU0VSVkVSICovCi1HVHlwZSB0aHJpZnRfc2VydmVyX2dldF90eXBlICh2b2lkKTsKLQotLyohCi0gKiBQcm9jZXNzZXMgdGhlIHJlcXVlc3QuCi0gKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRTZXJ2ZXJDbGFzcwotICovCi12b2lkIHRocmlmdF9zZXJ2ZXJfc2VydmUgKFRocmlmdFNlcnZlciAqc2VydmVyKTsKLQotLyohCi0gKiBTdG9wIGhhbmRsaW5nIHJlcXVlc3RzLgotICovCi12b2lkIHRocmlmdF9zZXJ2ZXJfc3RvcCAoVGhyaWZ0U2VydmVyICpzZXJ2ZXIpOwotCi1HX0VORF9ERUNMUwotCi0jZW5kaWYgLyogX1RIUklGVF9TRVJWRVJfSCAqLwotCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYyBiL2xpYi9jX2dsaWIvc3JjL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTMwNjdhLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInNlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJwcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oIgotI2luY2x1ZGUgInByb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oIgotCi1HX0RFRklORV9UWVBFKFRocmlmdFNpbXBsZVNlcnZlciwgdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIsIFRIUklGVF9UWVBFX1NFUlZFUikKLQotdm9pZAotdGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfc2VydmUgKFRocmlmdFNlcnZlciAqc2VydmVyKQotewotICBnX3JldHVybl9pZl9mYWlsIChUSFJJRlRfSVNfU0lNUExFX1NFUlZFUiAoc2VydmVyKSk7Ci0KLSAgVGhyaWZ0VHJhbnNwb3J0ICp0ID0gTlVMTDsKLSAgVGhyaWZ0VHJhbnNwb3J0ICppbnB1dF90cmFuc3BvcnQgPSBOVUxMLCAqb3V0cHV0X3RyYW5zcG9ydCA9IE5VTEw7Ci0gIFRocmlmdFByb3RvY29sICppbnB1dF9wcm90b2NvbCA9IE5VTEwsICpvdXRwdXRfcHJvdG9jb2wgPSBOVUxMOwotICBUaHJpZnRTaW1wbGVTZXJ2ZXIgKnRzcyA9IFRIUklGVF9TSU1QTEVfU0VSVkVSKHNlcnZlcik7Ci0KLSAgVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfR0VUX0NMQVNTIChzZXJ2ZXItPnNlcnZlcl90cmFuc3BvcnQpCi0gICAgICAtPmxpc3RlbiAoc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0LCBOVUxMKTsKLQotICB0c3MtPnJ1bm5pbmcgPSBUUlVFOwotICB3aGlsZSAodHNzLT5ydW5uaW5nID09IFRSVUUpCi0gIHsKLSAgICB0ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0IChzZXJ2ZXItPnNlcnZlcl90cmFuc3BvcnQsIE5VTEwpOwotICAgIGlucHV0X3RyYW5zcG9ydCA9Ci0gICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRkFDVE9SWV9HRVRfQ0xBU1MgKHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkpCi0gICAgICAgICAgICAtPmdldF90cmFuc3BvcnQgKHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnksIHQpOwotICAgIG91dHB1dF90cmFuc3BvcnQgPSAKLSAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZX0dFVF9DTEFTUyAoc2VydmVyLT5vdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkpCi0gICAgICAgICAgICAtPmdldF90cmFuc3BvcnQgKHNlcnZlci0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5LCB0KTsKLSAgICBpbnB1dF9wcm90b2NvbCA9Ci0gICAgICAgIFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0dFVF9DTEFTUyAoc2VydmVyLT5pbnB1dF9wcm90b2NvbF9mYWN0b3J5KQotICAgICAgICAgICAgLT5nZXRfcHJvdG9jb2wgKHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSwgdCk7Ci0gICAgb3V0cHV0X3Byb3RvY29sID0KLSAgICAgICAgVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfR0VUX0NMQVNTIChzZXJ2ZXItPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5KQotICAgICAgICAgICAgLT5nZXRfcHJvdG9jb2wgKHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnksIHQpOwotCi0gICAgd2hpbGUgKFRIUklGVF9QUk9DRVNTT1JfR0VUX0NMQVNTIChzZXJ2ZXItPnByb2Nlc3NvcikKLSAgICAgICAgICAgICAgIC0+cHJvY2VzcyAoc2VydmVyLT5wcm9jZXNzb3IsIGlucHV0X3Byb3RvY29sLCBvdXRwdXRfcHJvdG9jb2wpKQotICAgIHsKLSAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0cmFuc3BvcnQgcGVlayAoKQotICAgIH0KLQotICAgIC8vIFRPRE86IGhhbmRsZSBleGNlcHRpb25zCi0gICAgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKGlucHV0X3RyYW5zcG9ydCktPmNsb3NlIChpbnB1dF90cmFuc3BvcnQsIE5VTEwpOwotICAgIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTIChvdXRwdXRfdHJhbnNwb3J0KS0+Y2xvc2UgKG91dHB1dF90cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gIH0gCi0KLSAgLy8gYXR0ZW1wdCB0byBzaHV0ZG93bgotICBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCkKLSAgICAgIC0+Y2xvc2UgKHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCwgTlVMTCk7IAotfQotCi12b2lkCi10aHJpZnRfc2ltcGxlX3NlcnZlcl9zdG9wIChUaHJpZnRTZXJ2ZXIgKnNlcnZlcikKLXsKLSAgZ19yZXR1cm5faWZfZmFpbCAoVEhSSUZUX0lTX1NJTVBMRV9TRVJWRVIgKHNlcnZlcikpOwotICAoVEhSSUZUX1NJTVBMRV9TRVJWRVIgKHNlcnZlcikpLT5ydW5uaW5nID0gRkFMU0U7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHJpZnRfc2ltcGxlX3NlcnZlcl9pbml0IChUaHJpZnRTaW1wbGVTZXJ2ZXIgKnRzcykKLXsKLSAgdHNzLT5ydW5uaW5nID0gRkFMU0U7Ci0KLSAgVGhyaWZ0U2VydmVyICpzZXJ2ZXIgPSBUSFJJRlRfU0VSVkVSKHRzcyk7Ci0KLSAgaWYgKHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPT0gTlVMTCkKLSAgewotICAgIHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPQotICAgICAgICBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZLCBOVUxMKTsKLSAgfQotICBpZiAoc2VydmVyLT5vdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPT0gTlVMTCkKLSAgewotICAgIHNlcnZlci0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5ID0KLSAgICAgICAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSwgTlVMTCk7Ci0gIH0KLSAgaWYgKHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSA9PSBOVUxMKQotICB7Ci0gICAgc2VydmVyLT5pbnB1dF9wcm90b2NvbF9mYWN0b3J5ID0KLSAgICAgICAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSwgTlVMTCk7Ci0gIH0KLSAgaWYgKHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkgPT0gTlVMTCkKLSAgewotICAgIHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkgPQotICAgICAgICBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZLCBOVUxMKTsKLSAgfQotfQotCi0vKiBpbml0aWFsaXplIHRoZSBjbGFzcyAqLwotc3RhdGljIHZvaWQKLXRocmlmdF9zaW1wbGVfc2VydmVyX2NsYXNzX2luaXQgKFRocmlmdFNpbXBsZVNlcnZlckNsYXNzICpjbGFzcykKLXsKLSAgVGhyaWZ0U2VydmVyQ2xhc3MgKmNscyA9IFRIUklGVF9TRVJWRVJfQ0xBU1MoY2xhc3MpOwotCi0gIGNscy0+c2VydmUgPSB0aHJpZnRfc2ltcGxlX3NlcnZlcl9zZXJ2ZTsKLSAgY2xzLT5zdG9wID0gdGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfc3RvcDsKLX0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5oIGIvbGliL2NfZ2xpYi9zcmMvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNTUwMGMuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9TSU1QTEVfU0VSVkVSX0gKLSNkZWZpbmUgX1RIUklGVF9TSU1QTEVfU0VSVkVSX0gKLQotI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+Ci0KLSNpbmNsdWRlICJzZXJ2ZXIvdGhyaWZ0X3NlcnZlci5oIgotCi1HX0JFR0lOX0RFQ0xTCi0KLS8qISBcZmlsZSB0aHJpZnRfc2ltcGxlX3NlcnZlci5oCi0gKiAgXGJyaWVmIEEgc2ltcGxlIFRocmlmdCBzZXJ2ZXIsIHNpbmdsZS10aHJlYWRlZC4KLSAqLwotCi0vKiB0eXBlIG1hY3JvcyAqLwotI2RlZmluZSBUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSICh0aHJpZnRfc2ltcGxlX3NlcnZlcl9nZXRfdHlwZSAoKSkKLSNkZWZpbmUgVEhSSUZUX1NJTVBMRV9TRVJWRVIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSLCBUaHJpZnRTaW1wbGVTZXJ2ZXIpKQotI2RlZmluZSBUSFJJRlRfSVNfU0lNUExFX1NFUlZFUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1NJTVBMRV9TRVJWRVIpKQotI2RlZmluZSBUSFJJRlRfU0lNUExFX1NFUlZFUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSBUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSLCBUaHJpZnRTaW1wbGVTZXJ2ZXJDbGFzcykpCi0jZGVmaW5lIFRIUklGVF9JU19TSU1QTEVfU0VSVkVSX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSKSkKLSNkZWZpbmUgVEhSSUZUX1NJTVBMRV9TRVJWRVJfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSLCBUaHJpZnRTaW1wbGVTZXJ2ZXJDbGFzcykpCi0KLS8qKgotICogVGhyaWZ0IFNpbXBsZSBTZXJ2ZXIgaW5zdGFuY2UuCi0gKi8KLXN0cnVjdCBfVGhyaWZ0U2ltcGxlU2VydmVyCi17Ci0gIFRocmlmdFNlcnZlciBwYXJlbnQ7Ci0KLSAgLyogcHJpdmF0ZSAqLwotICB2b2xhdGlsZSBnYm9vbGVhbiBydW5uaW5nOwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRTaW1wbGVTZXJ2ZXIgVGhyaWZ0U2ltcGxlU2VydmVyOwotCi0vKioKLSAqIFRocmlmdCBTaW1wbGUgU2VydmVyIGNsYXNzLgotICovCi1zdHJ1Y3QgX1RocmlmdFNpbXBsZVNlcnZlckNsYXNzCi17Ci0gIFRocmlmdFNlcnZlckNsYXNzIHBhcmVudDsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U2ltcGxlU2VydmVyQ2xhc3MgVGhyaWZ0U2ltcGxlU2VydmVyQ2xhc3M7Ci0KLS8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUiAqLwotR1R5cGUgdGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfZ2V0X3R5cGUgKHZvaWQpOwotCi1HX0VORF9ERUNMUwotCi0jZW5kaWYgLyogX1RIUklGVF9TSU1QTEVfU0VSVkVSX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg2ZTVjMy4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQuYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInRocmlmdC5oIgotCi0vKioKLSAqIEdIYXNoVGFibGUgY2FsbGJhY2sgdG8gYWRkIGtleXMgdG8gYSBHTGlzdC4KLSAqLwotdm9pZAotdGhyaWZ0X2hhc2hfdGFibGVfZ2V0X2tleXMgKGdwb2ludGVyIGtleSwgZ3BvaW50ZXIgdmFsdWUsIGdwb2ludGVyIHVzZXJfZGF0YSkKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHZhbHVlKTsKLSAgR0xpc3QgKipsaXN0ID0gKEdMaXN0ICoqKSB1c2VyX2RhdGE7Ci0gICpsaXN0ID0gZ19saXN0X2FwcGVuZCAoKmxpc3QsIGtleSk7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MzZhMmYuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9ICi0jZGVmaW5lIF9USFJJRlRfSAotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDxnbGliLmg+Ci0KLS8qIHRoaXMgbWFjcm8gaXMgY2FsbGVkIHRvIHNhdGlzZnkgLVdhbGwgaGFyZGNvcmUgY29tcGlsYXRpb24gKi8KLSNpZm5kZWYgVEhSSUZUX1VOVVNFRF9WQVIKLSMgZGVmaW5lIFRIUklGVF9VTlVTRURfVkFSKHgpICgodm9pZCkgeCkKLSNlbmRpZgotCi12b2lkIHRocmlmdF9oYXNoX3RhYmxlX2dldF9rZXlzIChncG9pbnRlciBrZXksIGdwb2ludGVyIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9USFJJRlRfSApkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZDYyMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmMKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5oPgorCitHX0RFRklORV9BQlNUUkFDVF9UWVBFIChUaHJpZnREaXNwYXRjaFByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9QUk9DRVNTT1IpCisKK2dib29sZWFuCit0aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yX3Byb2Nlc3MgKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnY2hhciAqZm5hbWU7CisgIFRocmlmdE1lc3NhZ2VUeXBlIG10eXBlOworICBnaW50MzIgc2VxaWQ7CisgIFRocmlmdERpc3BhdGNoUHJvY2Vzc29yICpkaXNwYXRjaF9wcm9jZXNzb3IgPQorICAgIFRIUklGVF9ESVNQQVRDSF9QUk9DRVNTT1IgKHByb2Nlc3Nvcik7CisKKyAgLyogUmVhZCB0aGUgc3RhcnQgb2YgdGhlIG1lc3NhZ2UsIHdoaWNoIHdlIGV4cGVjdCB0byBiZSBhIG1ldGhvZCBjYWxsICovCisgIGlmICh0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSA8IDApIHsKKyAgICBnX3dhcm5pbmcgKCJlcnJvciByZWFkaW5nIHN0YXJ0IG9mIG1lc3NhZ2U6ICVzIiwKKyAgICAgICAgICAgICAgIChlcnJvciAhPSBOVUxMKSA/ICgqZXJyb3IpLT5tZXNzYWdlIDogIihudWxsKSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBlbHNlIGlmIChtdHlwZSAhPSBUX0NBTEwgJiYgbXR5cGUgIT0gVF9PTkVXQVkpIHsKKyAgICBnX3dhcm5pbmcgKCJyZWNlaXZlZCBpbnZhbGlkIG1lc3NhZ2UgdHlwZSAlZCBmcm9tIGNsaWVudCIsIG10eXBlKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBEaXNwYXRjaCB0aGUgbWV0aG9kIGNhbGwgKi8KKyAgcmV0dXJuIFRIUklGVF9ESVNQQVRDSF9QUk9DRVNTT1JfR0VUX0NMQVNTIChkaXNwYXRjaF9wcm9jZXNzb3IpCisgICAgLT5kaXNwYXRjaF9jYWxsIChkaXNwYXRjaF9wcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICBpbiwKKyAgICAgICAgICAgICAgICAgICAgIG91dCwKKyAgICAgICAgICAgICAgICAgICAgIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgordGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvcl9yZWFsX2Rpc3BhdGNoX2NhbGwgKFRocmlmdERpc3BhdGNoUHJvY2Vzc29yICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICpmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0OworICBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqeGNlcHRpb247CisgIGdjaGFyICptZXNzYWdlOworICBnaW50MzIgcmVzdWx0OworICBnYm9vbGVhbiBkaXNwYXRjaF9yZXN1bHQgPSBGQUxTRTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoc2VsZik7CisKKyAgLyogQnkgZGVmYXVsdCwgcmV0dXJuIGFuIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiB0byB0aGUgY2xpZW50IGluZGljYXRpbmcgdGhlCisgICAgIG1ldGhvZCBuYW1lIGlzIG5vdCByZWNvZ25pemVkLiAqLworCisgIGlmICgodGhyaWZ0X3Byb3RvY29sX3NraXAgKGluLCBUX1NUUlVDVCwgZXJyb3IpIDwgMCkgfHwKKyAgICAgICh0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAoaW4sIGVycm9yKSA8IDApKQorICAgIHJldHVybiBGQUxTRTsKKworICBnX29iamVjdF9nZXQgKGluLCAidHJhbnNwb3J0IiwgJnRyYW5zcG9ydCwgTlVMTCk7CisgIHJlc3VsdCA9IHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKHRyYW5zcG9ydCwgZXJyb3IpOworICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKyAgaWYgKHJlc3VsdCA8IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRVhDRVBUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSA8IDApCisgICAgcmV0dXJuIEZBTFNFOworICBtZXNzYWdlID0gZ19zdHJjb25jYXQgKCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnIiwgZm5hbWUsICInIiwgTlVMTCk7CisgIGdfZnJlZSAoZm5hbWUpOworICB4Y2VwdGlvbiA9CisgICAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sCisgICAgICAgICAgICAgICAgICAidHlwZSIsICAgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTl9NRVRIT0QsCisgICAgICAgICAgICAgICAgICAibWVzc2FnZSIsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgZ19mcmVlIChtZXNzYWdlKTsKKyAgcmVzdWx0ID0gdGhyaWZ0X3N0cnVjdF93cml0ZSAoVEhSSUZUX1NUUlVDVCAoeGNlcHRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKKyAgaWYgKChyZXN1bHQgPCAwKSB8fAorICAgICAgKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZCAob3V0LCBlcnJvcikgPCAwKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZ19vYmplY3RfZ2V0IChvdXQsICJ0cmFuc3BvcnQiLCAmdHJhbnNwb3J0LCBOVUxMKTsKKyAgZGlzcGF0Y2hfcmVzdWx0ID0KKyAgICAoKHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIGVycm9yKSA+PSAwKSAmJgorICAgICAodGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBlcnJvcikgPj0gMCkpOworICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKworICByZXR1cm4gZGlzcGF0Y2hfcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvcl9pbml0IChUaHJpZnREaXNwYXRjaFByb2Nlc3NvciAqc2VsZikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHNlbGYpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvcl9jbGFzc19pbml0IChUaHJpZnREaXNwYXRjaFByb2Nlc3NvckNsYXNzICprbGFzcykKK3sKKyAgVGhyaWZ0UHJvY2Vzc29yQ2xhc3MgKnByb2Nlc3Nvcl9jbGFzcyA9CisgICAgVEhSSUZUX1BST0NFU1NPUl9DTEFTUyAoa2xhc3MpOworCisgIC8qIEltcGxlbWVudCBUaHJpZnRQcm9jZXNzb3IncyBwcm9jZXNzIG1ldGhvZCAqLworICBwcm9jZXNzb3JfY2xhc3MtPnByb2Nlc3MgPSB0aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yX3Byb2Nlc3M7CisKKyAgLyogUHJvdmlkZSBhIGRlZmF1bHQgaW1wbGVtZW50IGZvciBkaXNwYXRjaF9jYWxsLCB3aGljaCByZXR1cm5zIGFuIGV4Y2VwdGlvbgorICAgICB0byB0aGUgY2xpZW50IGluZGljYXRpbmcgdGhlIG1ldGhvZCBuYW1lIHdhcyBub3QgcmVjb2duaXplZCAqLworICBrbGFzcy0+ZGlzcGF0Y2hfY2FsbCA9IHRocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3JfcmVhbF9kaXNwYXRjaF9jYWxsOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZmI4NWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfRElTUEFUQ0hfUFJPQ0VTU09SX0gKKyNkZWZpbmUgX1RIUklGVF9ESVNQQVRDSF9QUk9DRVNTT1JfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5oCisgKiAgXGJyaWVmIFBhcnNlcyBhIG1ldGhvZC1jYWxsIG1lc3NhZ2UgaGVhZGVyIGFuZCBpbnZva2VzIGEgZnVuY3Rpb24KKyAqICAgICAgICAgdG8gZGlzcGF0Y2ggdGhlIGNhbGwgYnkgZnVuY3Rpb24gbmFtZS4KKyAqCisgKiBUaHJpZnREaXNwYXRjaFByb2Nlc3NvciBpcyBhbiBhYnN0cmFjdCBoZWxwZXIgY2xhc3MgdGhhdCBwYXJzZXMgdGhlCisgKiBoZWFkZXIgb2YgYSBtZXRob2QtY2FsbCBtZXNzYWdlIGFuZCBpbnZva2VzIGEgbWVtYmVyIGZ1bmN0aW9uLAorICogZGlzcGF0Y2hfY2FsbCwgd2l0aCB0aGUgbWV0aG9kJ3MgbmFtZS4KKyAqCisgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IGRpc3BhdGNoX2NhbGwgdG8gZGlzcGF0Y2ggdGhlIG1ldGhvZCBjYWxsCisgKiB0byB0aGUgaW1wbGVtZW50aW5nIGZ1bmN0aW9uLgorICovCisKKy8qIFR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX0RJU1BBVENIX1BST0NFU1NPUiAodGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvcl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0RJU1BBVENIX1BST0NFU1NPUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX0RJU1BBVENIX1BST0NFU1NPUiwgVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IpKQorI2RlZmluZSBUSFJJRlRfSVNfRElTUEFUQ0hfUFJPQ0VTU09SKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfRElTUEFUQ0hfUFJPQ0VTU09SKSkKKyNkZWZpbmUgVEhSSUZUX0RJU1BBVENIX1BST0NFU1NPUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfRElTUEFUQ0hfUFJPQ0VTU09SLCBUaHJpZnREaXNwYXRjaFByb2Nlc3NvckNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX0RJU1BBVENIX1BST0NFU1NPUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfRElTUEFUQ0hfUFJPQ0VTU09SKSkKKyNkZWZpbmUgVEhSSUZUX0RJU1BBVENIX1BST0NFU1NPUl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX0RJU1BBVENIX1BST0NFU1NPUiwgVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3JDbGFzcykpCisKKy8qIQorICogVGhyaWZ0IERpc3BhdGNoIFByb2Nlc3NvciBvYmplY3QKKyAqLworc3RydWN0IF9UaHJpZnREaXNwYXRjaFByb2Nlc3NvcgoreworICBUaHJpZnRQcm9jZXNzb3IgcGFyZW50OworfTsKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnREaXNwYXRjaFByb2Nlc3NvciBUaHJpZnREaXNwYXRjaFByb2Nlc3NvcjsKKworLyohCisgKiBUaHJpZnQgRGlzcGF0Y2ggUHJvY2Vzc29yIGNsYXNzCisgKi8KK3N0cnVjdCBfVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3JDbGFzcworeworICBUaHJpZnRQcm9jZXNzb3JDbGFzcyBwYXJlbnQ7CisKKyAgLyogcHVibGljICovCisgIGdib29sZWFuICgqcHJvY2VzcykgKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworICAvKiBwcm90ZWN0ZWQgKi8KKyAgZ2Jvb2xlYW4gKCpkaXNwYXRjaF9jYWxsKSAoVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKmZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKK307Cit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3JDbGFzcyBUaHJpZnREaXNwYXRjaFByb2Nlc3NvckNsYXNzOworCisvKiBVc2VkIGJ5IFRIUklGVF9UWVBFX0RJU1BBVENIX1BST0NFU1NPUiAqLworR1R5cGUgdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvcl9nZXRfdHlwZSAodm9pZCk7CisKKy8qIQorICogUHJvY2Vzc2VzIGEgcmVxdWVzdC4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdERpc3BhdGNoUHJvY2Vzc29yQ2xhc3MKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvcl9wcm9jZXNzIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX0RJU1BBVENIX1BST0NFU1NPUl9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhhMGY0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuYwpAQCAtMCwwICsxLDM0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oPgorCitHX0RFRklORV9UWVBFKFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yLCB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLCBUSFJJRlRfVFlQRV9QUk9DRVNTT1IpCisKKworZW51bQoreworICBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfREVGQVVMVF9TRVJWSUNFX05BTUUgPSAxLAorICBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRU5ECit9OworCitzdGF0aWMgR1BhcmFtU3BlYyAqdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRU5EXSA9IHsgTlVMTCwgfTsKKworCitzdGF0aWMgZ2Jvb2xlYW4KK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcmVnaXN0ZXJfcHJvY2Vzc29yX2ltcGwoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IsIGNvbnN0IGdjaGFyICogbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX25hbWUsIFRocmlmdFByb2Nlc3NvciAqIG11bHRpcGxleGVkX3Byb2Nlc3NvciAsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1IocHJvY2Vzc29yKTsKKyAgZ19oYXNoX3RhYmxlX3JlcGxhY2Uoc2VsZi0+bXVsdGlwbGV4ZWRfc2VydmljZXMsCisJCSAgICAgICBnX3N0cmR1cChtdWx0aXBsZXhlZF9wcm9jZXNzb3JfbmFtZSksCisJCSAgICAgICBnX29iamVjdF9yZWYgKG11bHRpcGxleGVkX3Byb2Nlc3NvcikpOworCisgIC8qIE1ha2UgZmlyc3QgcmVnaXN0ZXJlZCBiZWNvbWUgZGVmYXVsdCAqLworICBpZighc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSl7CisgICAgICBzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lID0gZ19zdHJkdXAobXVsdGlwbGV4ZWRfcHJvY2Vzc29yX25hbWUpOworICB9CisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9wcm9jZXNzX2ltcGwgKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLCBUaHJpZnRQcm90b2NvbCAqaW4sCisJCQkJCSAgIFRocmlmdFByb3RvY29sICpvdXQsIEdFcnJvciAqKmVycm9yKQoreworICBnYm9vbGVhbiByZXR2YWwgPSBGQUxTRTsKKyAgZ2Jvb2xlYW4gdG9rZW5fZXJyb3IgPSBGQUxTRTsKKyAgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnhjZXB0aW9uOworICBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgKnN0b3JlZF9tZXNzYWdlX3Byb3RvY29sID0gTlVMTDsKKyAgVGhyaWZ0TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlOworICBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1IocHJvY2Vzc29yKTsKKyAgVGhyaWZ0UHJvY2Vzc29yICptdWx0aXBsZXhlZF9wcm9jZXNzb3IgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydDsKKyAgY2hhciAqdG9rZW49TlVMTDsKKyAgaW50IHRva2VuX2luZGV4PTA7CisgIGNoYXIgKnN0YXRlPU5VTEw7CisgIGdjaGFyICpmbmFtZT1OVUxMOworICBnaW50MzIgc2VxaWQsIHJlc3VsdDsKKworICAvKiBGSVhNRSBJdCBzZWVtcyB0aGF0IHByZXZpb3VzIHByb2Nlc3NvciBpcyBub3QgbWFuYWdpbmcgZXJyb3IgY29ycmVjdGx5ICovCisgIGlmKCplcnJvciE9TlVMTCkgeworICAgICAgZ19kZWJ1ZyAoInRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3I6IGxhc3QgZXJyb3Igbm90IHJlbW92ZWQ6ICVzIiwKKyAgICAgIAkJICAgKmVycm9yICE9IE5VTEwgPyAoKmVycm9yKS0+bWVzc2FnZSA6ICIobnVsbCkiKTsKKyAgICAgIGdfY2xlYXJfZXJyb3IgKGVycm9yKTsKKyAgfQorCisKKyAgVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyhpbiktPnJlYWRfbWVzc2FnZV9iZWdpbihpbiwgJmZuYW1lLCAmbWVzc2FnZV90eXBlLCAmc2VxaWQsIGVycm9yKTsKKworICBpZighKG1lc3NhZ2VfdHlwZSA9PSBUX0NBTEwgfHwgbWVzc2FnZV90eXBlID09IFRfT05FV0FZKSkgeworICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorCQkgICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SLAorCQkgICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX01FU1NBR0VfVFlQRSwKKwkJICAgIm1lc3NhZ2UgdHlwZSBpbnZhbGlkIGZvciB0aGlzIHByb2Nlc3NvciIpOworICB9ZWxzZXsKKyAgICAgIC8qIFNwbGl0IGJ5IHRoZSB0b2tlbiAqLworICAgICAgZm9yICh0b2tlbiA9IHN0cnRva19yKGZuYW1lLCBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfREVGQVVMVF9TRVBBUkFUT1IsICZzdGF0ZSksCisJICB0b2tlbl9pbmRleD0wOworCSAgdG9rZW4gIT0gTlVMTCAmJiAhdG9rZW5fZXJyb3I7CisJICB0b2tlbiA9IHN0cnRva19yKE5VTEwsIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9ERUZBVUxUX1NFUEFSQVRPUiwgJnN0YXRlKSwKKwkgICAgICB0b2tlbl9pbmRleCsrKQorCXsKKwkgIHN3aXRjaCh0b2tlbl9pbmRleCl7CisJICAgIGNhc2UgMDoKKwkgICAgICAvKiBJdCBzaG91bGQgYmUgdGhlIHNlcnZpY2UgbmFtZSAqLworCSAgICAgIG11bHRpcGxleGVkX3Byb2Nlc3NvciA9IGdfaGFzaF90YWJsZV9sb29rdXAoc2VsZi0+bXVsdGlwbGV4ZWRfc2VydmljZXMsIHRva2VuKTsKKwkgICAgICBpZihtdWx0aXBsZXhlZF9wcm9jZXNzb3I9PU5VTEwpeworCQkgIHRva2VuX2Vycm9yPVRSVUU7CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIDE6CisJICAgICAgLyogSXQgc2hvdWxkIGJlIHRoZSBmdW5jdGlvbiBuYW1lICovCisJICAgICAgc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MLAorCQkJCQkJICAgICAgInByb3RvY29sIiwgaW4sCisJCQkJCQkgICAgICAibmFtZSIsIHRva2VuLAorCQkJCQkJICAgICAgInR5cGUiLCBtZXNzYWdlX3R5cGUsCisJCQkJCQkgICAgICAic2VxaWQiLCBzZXFpZCwKKwkJCQkJCSAgICAgIE5VTEwpOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKwkJCSAgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1IsCisJCQkgICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX01FU1NBR0VfV1JPTkdMWV9NVUxUSVBMRVhFRCwKKwkJCSAgICJ0aGUgbWVzc2FnZSBoYXMgbW9yZSB0b2tlbnMgdGhhbiBleHBlY3RlZCEiKTsKKwkgICAgICB0b2tlbl9lcnJvcj1UUlVFOworCSAgICAgIGJyZWFrOworCSAgfQorCX0KKyAgICAgIC8qIFNldCBkZWZhdWx0ICovCisgICAgICBpZighc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wgJiYKKwkgICFtdWx0aXBsZXhlZF9wcm9jZXNzb3IgJiYKKwkgIHRva2VuX2luZGV4PT0xICYmIHNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWUpeworCSAgLyogSXQgc2hvdWxkIGJlIHRoZSBzZXJ2aWNlIG5hbWUgKi8KKwkgIG11bHRpcGxleGVkX3Byb2Nlc3NvciA9IGdfaGFzaF90YWJsZV9sb29rdXAoc2VsZi0+bXVsdGlwbGV4ZWRfc2VydmljZXMsIHNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWUpOworCSAgaWYobXVsdGlwbGV4ZWRfcHJvY2Vzc29yPT1OVUxMKXsKKwkgICAgICBnX3NldF9lcnJvciAoZXJyb3IsCisJCQkgICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SLAorCQkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9TRVJWSUNFX1VOQVZBSUxBQkxFLAorCQkJICAgInNlcnZpY2UgJXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIHByb2Nlc3NvciIsCisJCQkgICBzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKTsKKwkgIH1lbHNleworCSAgICAgIC8qIFNldCB0aGUgbWVzc2FnZSBuYW1lIHRvIHRoZSBvcmlnaW5hbCBuYW1lICovCisJICAgICAgc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MLAorCQkJCQkJICAgICAgInByb3RvY29sIiwgaW4sCisJCQkJCQkgICAgICAibmFtZSIsIGZuYW1lLAorCQkJCQkJICAgICAgInR5cGUiLCBtZXNzYWdlX3R5cGUsCisJCQkJCQkgICAgICAic2VxaWQiLCBzZXFpZCwKKwkJCQkJCSAgICAgIE5VTEwpOworCSAgfQorCisgICAgICB9CisKKyAgICAgIGlmKHN0b3JlZF9tZXNzYWdlX3Byb3RvY29sIT1OVUxMICYmIG11bHRpcGxleGVkX3Byb2Nlc3NvciE9TlVMTCl7CisJICByZXR2YWwgPSBUSFJJRlRfUFJPQ0VTU09SX0dFVF9DTEFTUyAobXVsdGlwbGV4ZWRfcHJvY2Vzc29yKS0+cHJvY2VzcyAobXVsdGlwbGV4ZWRfcHJvY2Vzc29yLCAoVGhyaWZ0UHJvdG9jb2wgKikgc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wsIG91dCwgZXJyb3IpIDsKKyAgICAgIH1lbHNleworCSAgaWYoIWVycm9yKQorCSAgZ19zZXRfZXJyb3IgKGVycm9yLAorCQkgICAgICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUiwKKwkJICAgICAgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfU0VSVklDRV9VTkFWQUlMQUJMRSwKKwkJICAgICAgICJzZXJ2aWNlICVzIGlzIG5vdCBtdWx0aXBsZXhlZCBpbiB0aGlzIHByb2Nlc3NvciIsCisJCSAgICAgICBmbmFtZSk7CisgICAgICB9CisKKworICB9CisKKyAgaWYoIXJldHZhbCl7CisgICAgICAvKiBCeSBkZWZhdWx0LCByZXR1cm4gYW4gYXBwbGljYXRpb24gZXhjZXB0aW9uIHRvIHRoZSBjbGllbnQgaW5kaWNhdGluZyB0aGUKKyAgICAgICAgICBtZXRob2QgbmFtZSBpcyBub3QgcmVjb2duaXplZC4gKi8KKyAgICAgIC8qIENvcGllZCBmcm9tIGRpc3BhY2ggcHJvY2Vzc29yICovCisKKyAgICAgIGlmICgodGhyaWZ0X3Byb3RvY29sX3NraXAgKGluLCBUX1NUUlVDVCwgZXJyb3IpIDwgMCkgfHwKKwkgICh0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAoaW4sIGVycm9yKSA8IDApKQorCXJldHVybiByZXR2YWw7CisKKyAgICAgIGdfb2JqZWN0X2dldCAoaW4sICJ0cmFuc3BvcnQiLCAmdHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIHJlc3VsdCA9IHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKHRyYW5zcG9ydCwgZXJyb3IpOworICAgICAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisgICAgICBpZiAocmVzdWx0IDwgMCkgeworCSAgLyogV2UgbXVzdCBmcmVlIGZuYW1lICovCisJICBnX2ZyZWUoZm5hbWUpOworCSAgcmV0dXJuIHJldHZhbDsKKyAgICAgIH0KKworICAgICAgaWYgKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChvdXQsCisJCQkJCSAgICAgICBmbmFtZSwKKwkJCQkJICAgICAgIFRfRVhDRVBUSU9OLAorCQkJCQkgICAgICAgc2VxaWQsCisJCQkJCSAgICAgICBlcnJvcikgPCAwKXsKKwkgIC8qIFdlIG11c3QgZnJlZSBmbmFtZSAqLworCSAgZ19mcmVlKGZuYW1lKTsKKworCSAgcmV0dXJuIHJldHZhbDsKKyAgICAgIH0KKworCisgICAgICB4Y2VwdGlvbiA9CisJICBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwKKwkJCSJ0eXBlIiwgICAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9VTktOT1dOX01FVEhPRCwKKwkJCSJtZXNzYWdlIiwgKCplcnJvciktPm1lc3NhZ2UsCisJCQlOVUxMKTsKKyAgICAgIHJlc3VsdCA9IHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRIUklGVF9TVFJVQ1QgKHhjZXB0aW9uKSwKKwkJCQkgICAgb3V0LAorCQkJCSAgICBlcnJvcik7CisgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOworICAgICAgaWYgKChyZXN1bHQgPCAwKSB8fAorCSAgKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZCAob3V0LCBlcnJvcikgPCAwKSkKKwlyZXR1cm4gcmV0dmFsOworCisgICAgICBnX29iamVjdF9nZXQgKG91dCwgInRyYW5zcG9ydCIsICZ0cmFuc3BvcnQsIE5VTEwpOworICAgICAgcmV0dmFsID0KKwkgICgodGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgZXJyb3IpID49IDApICYmCisJICAgICAgKHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgZXJyb3IpID49IDApKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworICB9ZWxzZXsKKyAgICAgIC8qIFRoZSBwcm90b2NvbCBub3cgaGFzIGEgY29weSB3ZSBjYW4gZnJlZSBpdCAqLworICAgICAgZ19mcmVlKGZuYW1lKTsKKworICB9CisKKyAgLyoKKyAgRklYTUUgVGhpcyBtYWtlcyBldmVyeXRoaW5nIGZhaWwsIEkgZG9uJ3Qga25vdyB3aHkuCisgIGlmKHN0b3JlZF9tZXNzYWdlX3Byb3RvY29sIT1OVUxMKXsKKwkgIC8vIEFmdGVyIGl0cyB1c2Ugd2UgbXVzdCBmcmVlIGl0CisJICBnX29iamVjdF91bnJlZihzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCk7CisgIH0KKyAgKi8KKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIGZvciBUaHJpZnQgdHJhbnNwb3J0cyAqLworR1F1YXJrCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2Vycm9yX3F1YXJrICh2b2lkKQoreworICByZXR1cm4gZ19xdWFya19mcm9tX3N0YXRpY19zdHJpbmcgKFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfRE9NQUlOKTsKK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9zZXRfcHJvcGVydHkgKEdPYmplY3QgICAgICAqb2JqZWN0LAorICAgIGd1aW50ICAgICAgICAgcHJvcGVydHlfaWQsCisgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICAgKnBzcGVjKQoreworICBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1IgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICBjYXNlIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9ERUZBVUxUX1NFUlZJQ0VfTkFNRToKKyAgICBzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAvKiBXZSBkb24ndCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0eS4uLiAqLworICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2dldF9wcm9wZXJ0eSAoR09iamVjdCAgICAqb2JqZWN0LAorICAgIGd1aW50ICAgICAgIHByb3BlcnR5X2lkLAorICAgIEdWYWx1ZSAgICAgKnZhbHVlLAorICAgIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1IgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICBjYXNlIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9ERUZBVUxUX1NFUlZJQ0VfTkFNRToKKyAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIC8qIFdlIGRvbid0IGhhdmUgYW55IG90aGVyIHByb3BlcnR5Li4uICovCisgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgYnJlYWs7CisgIH0KK30KKworLyogZGVzdHJ1Y3RvciAqLworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SKG9iamVjdCk7CisKKyAgLyogRnJlZSBvdXIgbXVsdGlwbGV4ZWQgaGFzaCB0YWJsZSAqLworICBnX2hhc2hfdGFibGVfdW5yZWYgKHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzKTsKKyAgc2VsZi0+bXVsdGlwbGV4ZWRfc2VydmljZXMgPSBOVUxMOworCisgIGlmKHNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWUpeworICAgICAgZ19mcmVlKHNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWUpOworICAgICAgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZT1OVUxMOworICB9CisKKyAgLyogQ2hhaW4gdXAgdG8gcGFyZW50ICovCisgIGlmIChHX09CSkVDVF9DTEFTUyAodGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSkKKyAgICAoKkdfT0JKRUNUX0NMQVNTICh0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3BhcmVudF9jbGFzcyktPmZpbmFsaXplKSAob2JqZWN0KTsKK30KKworLyogY2xhc3MgaW5pdGlhbGl6ZXIgZm9yIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yICovCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9jbGFzc19pbml0IChUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckNsYXNzICpjbHMpCit7CisgIC8qIE92ZXJyaWRlICovCisgIFRIUklGVF9QUk9DRVNTT1JfQ0xBU1MoY2xzKS0+cHJvY2VzcyA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcHJvY2Vzc19pbXBsOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKKworICAvKiBPYmplY3QgbWV0aG9kcyAqLworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9maW5hbGl6ZTsKKworICAvKiBDbGFzcyBtZXRob2RzICovCisgIGNscy0+cmVnaXN0ZXJfcHJvY2Vzc29yID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wcm9jZXNzb3JfaW1wbDsKKworCisgIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3Jfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0RFRkFVTFRfU0VSVklDRV9OQU1FXSA9CisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiZGVmYXVsdCIsCisgICAgICAgICAgIkRlZmF1bHQgc2VydmljZSBuYW1lIHRoZSBwcm90b2NvbCBwb2ludHMgdG8gd2hlcmUgbm8gbXVsdGlwbGV4ZWQgY2xpZW50IHVzZWQiLAorICAgICAgICAgICJTZXQgdGhlIGRlZmF1bHQgc2VydmljZSBuYW1lIiwKKyAgICAgICAgICBOVUxMLAorICAgICAgICAgIChHX1BBUkFNX1JFQURXUklURSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydGllcyAoZ29iamVjdF9jbGFzcywKKwkJCQkgICAgIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FTkQsCisgICAgICB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX29ial9wcm9wZXJ0aWVzKTsKKworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9pbml0IChUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciAqc2VsZikKK3sKKworICAvKiBDcmVhdGUgb3VyIG11bHRpcGxleGVkIHNlcnZpY2VzIGhhc2ggdGFibGUgKi8KKyAgc2VsZi0+bXVsdGlwbGV4ZWRfc2VydmljZXMgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKAorICAgICAgZ19zdHJfaGFzaCwKKyAgICAgIGdfc3RyX2VxdWFsLAorICAgICAgZ19mcmVlLAorICAgICAgZ19vYmplY3RfdW5yZWYpOworICBzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lID0gTlVMTDsKK30KKworCitnYm9vbGVhbgordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wcm9jZXNzb3IoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IsIGNvbnN0IGdjaGFyICogbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX25hbWUsIFRocmlmdFByb2Nlc3NvciAqIG11bHRpcGxleGVkX3Byb2Nlc3NvciAsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9HRVRfQ0xBU1MocHJvY2Vzc29yKS0+cmVnaXN0ZXJfcHJvY2Vzc29yKHByb2Nlc3NvciwgbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX25hbWUsIG11bHRpcGxleGVkX3Byb2Nlc3NvciwgZXJyb3IpOworfQorCisKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDA2NjE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5oCisgKgorICogIENyZWF0ZWQgb246IDE0IHNlcHQuIDIwMTcKKyAqICAgICAgQXV0aG9yOiBnYWd1aWxhcgorICovCisKKyNpZm5kZWYgX1RIUklGVF9NVUxUSVBMRVhFRF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfSF8KKyNkZWZpbmUgX1RIUklGVF9NVUxUSVBMRVhFRF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfSF8KKworCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuaD4KKworCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmgKKyAqICBcYnJpZWYgVGhlIG11bHRpcGxleGVkIHByb2Nlc3NvciBmb3IgY19nbGliLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUiAodGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUiwgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IpKQorI2RlZmluZSBUSFJJRlRfSVNfTVVMVElQTEVYRURfUFJPQ0VTU09SKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPQ0VTU09SKSkKKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPQ0VTU09SLCBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX01VTFRJUExFWEVEX1BST0NFU1NPUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPQ0VTU09SKSkKKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUiwgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3JDbGFzcykpCisKKy8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBzdHJpbmcgKi8KKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9ET01BSU4gInRocmlmdC1tdWx0aXBsZXhlZC1wcm9jZXNzb3ItZXJyb3ItcXVhcmsiCisKKworLyohCisgKiBUaHJpZnQgTXVsdGlwbGV4ZWRQcm9jZXNzb3Igb2JqZWN0CisgKi8KK3N0cnVjdCBfVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IKK3sKKyAgVGhyaWZ0UHJvY2Vzc29yIHBhcmVudDsKKworICAvKiBwcml2YXRlICovCisgIGdjaGFyICogZGVmYXVsdF9wcm9jZXNzb3JfbmFtZTsKKyAgR0hhc2hUYWJsZSAqbXVsdGlwbGV4ZWRfc2VydmljZXM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yOworCisvKiEKKyAqIFRocmlmdCBNdWx0aXBsZXhlZFByb2Nlc3NvciBjbGFzcworICovCitzdHJ1Y3QgX1RocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yQ2xhc3MKK3sKKyAgVGhyaWZ0UHJvY2Vzc29yQ2xhc3MgcGFyZW50OworCisgIGdib29sZWFuICgqIHJlZ2lzdGVyX3Byb2Nlc3NvcikgKFRocmlmdFByb2Nlc3NvciAqc2VsZiwgY29uc3QgZ2NoYXIgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3JfbmFtZSwgVGhyaWZ0UHJvY2Vzc29yICogbXVsdGlwbGV4ZWRfcHJvY2Vzc29yICwgR0Vycm9yICoqZXJyb3IpOworCit9OwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yQ2xhc3MgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3JDbGFzczsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IgKi8KK0dUeXBlIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZ2V0X3R5cGUgKHZvaWQpOworCisvKiEKKyAqIFByb2Nlc3NlcyB0aGUgcmVxdWVzdC4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yQ2xhc3MKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9wcm9jZXNzIChUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciAqcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqaW4sIFRocmlmdFByb3RvY29sICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworCisvKiBQdWJsaWMgQVBJICovCisKKy8qKgorICogQGJyaWVmIFJlZ2lzdGVycyBhIHByb2Nlc3NvciBpbiB0aGUgbXVsdGlwbGV4ZWQgcHJvY2Vzc29yIHVuZGVyIGl0cyBuYW1lLiBJdAorICogd2lsbCB0YWtlIGEgcmVmZXJlbmNlIHRvIHRoZSBwcm9jZXNzb3Igc28gcmVmY291bnQgd2lsbCBiZSBpbmNyZW1lbnRlZC4KKyAqIEl0IHdpbGwgYWxzbyBiZSBkZWNyZW1lbnRlZCBvbiBvYmplY3QgZGVzdHJ1Y3Rpb24uCisgKgorICogVGhlIGZpcnN0IHJlZ2lzdGVyZWQgcHJvY2Vzc29yIGJlY29tZXMgZGVmYXVsdC4gQnV0IHlvdSBjYW4gb3ZlcnJpZGUgaXQgd2l0aAorICogImRlZmF1bHQiIHByb3BlcnR5LgorICoKKyAqIEl0IHJldHVybnMgYSBjb21wbGlhbnQgZXJyb3IgaWYgaXQgY2Fubm90IGJlIHJlZ2lzdGVyZWQuCisgKgorICogQHBhcmFtIHByb2Nlc3NvciBQb2ludGVyIHRvIHRoZSBtdWx0aXBsZXhlZCBwcm9jZXNzb3IuCisgKiBAcGFyYW0gbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX25hbWUgTmFtZSBvZiB0aGUgcHJvY2Vzc29yIHlvdSB3YW50IHRvIHJlZ2lzdGVyCisgKiBAcGFyYW0gbXVsdGlwbGV4ZWRfcHJvY2Vzc29yIFBvaW50ZXIgdG8gaW1wbGVtZW50ZWQgcHJvY2Vzc29yIHlvdSB3YW50IG11bHRpcGxleC4KKyAqIEBwYXJhbSBlcnJvciBFcnJvciBvYmplY3Qgd2hlcmUgd2Ugc2hvdWxkIHN0b3JlIGVycm9ycy4KKyAqCisgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdub21lLm9yZy9nbGliL3N0YWJsZS9nbGliLUVycm9yLVJlcG9ydGluZy5odG1sI2ctc2V0LWVycm9yCisgKi8KK2dib29sZWFuIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcmVnaXN0ZXJfcHJvY2Vzc29yKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLCBjb25zdCBnY2hhciAqIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lLCBUaHJpZnRQcm9jZXNzb3IgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgLCBHRXJyb3IgKiplcnJvcik7CisKKworLyogZGVmaW5lIGVycm9yL2V4Y2VwdGlvbiB0eXBlcyAqLwordHlwZWRlZiBlbnVtCit7CisgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfVU5LTk9XTiwKKyAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9TRVJWSUNFX1VOQVZBSUxBQkxFLAorICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX01FU1NBR0VfVFlQRSwKKyAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9NRVNTQUdFX1dST05HTFlfTVVMVElQTEVYRUQsCisgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfU0VORCwKKyAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9SRUNFSVZFLAorICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX0NMT1NFCit9IFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yRXJyb3I7CisKKworR1F1YXJrIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZXJyb3JfcXVhcmsgKHZvaWQpOworI2RlZmluZSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SICh0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2Vycm9yX3F1YXJrICgpKQorCisKK0dfRU5EX0RFQ0xTCisKKworI2VuZGlmIC8qIF9USFJJRlRfTVVMVElQTEVYRURfTVVMVElQTEVYRURfUFJPQ0VTU09SX0hfICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI0MmMyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuYwpAQCAtMCwwICsxLDQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuaD4KKworR19ERUZJTkVfQUJTVFJBQ1RfVFlQRShUaHJpZnRQcm9jZXNzb3IsIHRocmlmdF9wcm9jZXNzb3IsIEdfVFlQRV9PQkpFQ1QpCisKK2dib29sZWFuCit0aHJpZnRfcHJvY2Vzc29yX3Byb2Nlc3MgKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLCBUaHJpZnRQcm90b2NvbCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICpvdXQsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4KKyAgICBUSFJJRlRfUFJPQ0VTU09SX0dFVF9DTEFTUyAocHJvY2Vzc29yKS0+cHJvY2VzcyAocHJvY2Vzc29yLCBpbiwgb3V0LCBlcnJvcik7Cit9CisKKy8qIGNsYXNzIGluaXRpYWxpemVyIGZvciBUaHJpZnRQcm9jZXNzb3IgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfcHJvY2Vzc29yX2NsYXNzX2luaXQgKFRocmlmdFByb2Nlc3NvckNsYXNzICpjbHMpCit7CisgIC8qIHNldCB0aGVzZSBhcyB2aXJ0dWFsIG1ldGhvZHMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcyAqLworICBjbHMtPnByb2Nlc3MgPSB0aHJpZnRfcHJvY2Vzc29yX3Byb2Nlc3M7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfcHJvY2Vzc29yX2luaXQgKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvY2Vzc29yKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjJkMmRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1BST0NFU1NPUl9ICisjZGVmaW5lIF9USFJJRlRfUFJPQ0VTU09SX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfcHJvY2Vzc29yLmgKKyAqICBcYnJpZWYgQWJzdHJhY3QgY2xhc3MgZm9yIFRocmlmdCBwcm9jZXNzb3JzLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1BST0NFU1NPUiAodGhyaWZ0X3Byb2Nlc3Nvcl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1BST0NFU1NPUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1BST0NFU1NPUiwgVGhyaWZ0UHJvY2Vzc29yKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1BST0NFU1NPUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1BST0NFU1NPUikpCisjZGVmaW5lIFRIUklGVF9QUk9DRVNTT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1BST0NFU1NPUiwgVGhyaWZ0UHJvY2Vzc29yQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfUFJPQ0VTU09SX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9QUk9DRVNTT1IpKQorI2RlZmluZSBUSFJJRlRfUFJPQ0VTU09SX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPQ0VTU09SLCBUaHJpZnRQcm9jZXNzb3JDbGFzcykpCisKKy8qIQorICogVGhyaWZ0IFByb2Nlc3Nvcm9iamVjdAorICovCitzdHJ1Y3QgX1RocmlmdFByb2Nlc3NvcgoreworICBHT2JqZWN0IHBhcmVudDsKK307Cit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvY2Vzc29yIFRocmlmdFByb2Nlc3NvcjsKKworLyohCisgKiBUaHJpZnQgUHJvY2Vzc29yIGNsYXNzCisgKi8KK3N0cnVjdCBfVGhyaWZ0UHJvY2Vzc29yQ2xhc3MKK3sKKyAgR09iamVjdENsYXNzIHBhcmVudDsKKworICAvKiB2dGFibGUgKi8KKyAgZ2Jvb2xlYW4gKCpwcm9jZXNzKSAoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IsIFRocmlmdFByb3RvY29sICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKm91dCwgR0Vycm9yICoqZXJyb3IpOworfTsKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRQcm9jZXNzb3JDbGFzcyBUaHJpZnRQcm9jZXNzb3JDbGFzczsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9QUk9DRVNTT1IgKi8KK0dUeXBlIHRocmlmdF9wcm9jZXNzb3JfZ2V0X3R5cGUgKHZvaWQpOworCisvKiEKKyAqIFByb2Nlc3NlcyB0aGUgcmVxdWVzdC4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFByb2Nlc3NvckNsYXNzCisgKi8KK2dib29sZWFuIHRocmlmdF9wcm9jZXNzb3JfcHJvY2VzcyAoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICppbiwgVGhyaWZ0UHJvdG9jb2wgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9QUk9DRVNTT1JfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzJkMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmMKQEAgLTAsMCArMSw5MTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+CisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0QmluYXJ5UHJvdG9jb2wsIHRocmlmdF9iaW5hcnlfcHJvdG9jb2wsIFRIUklGVF9UWVBFX1BST1RPQ09MKQorCitzdGF0aWMgZ3VpbnQ2NAordGhyaWZ0X2JpdHdpc2VfY2FzdF9ndWludDY0IChnZG91YmxlIHYpCit7CisgIHVuaW9uIHsKKyAgICBnZG91YmxlIGZyb207CisgICAgZ3VpbnQ2NCB0bzsKKyAgfSB1OworICB1LmZyb20gPSB2OworICByZXR1cm4gdS50bzsKK30KKworc3RhdGljIGdkb3VibGUKK3RocmlmdF9iaXR3aXNlX2Nhc3RfZ2RvdWJsZSAoZ3VpbnQ2NCB2KQoreworICB1bmlvbiB7CisgICAgZ3VpbnQ2NCBmcm9tOworICAgIGdkb3VibGUgdG87CisgIH0gdTsKKyAgdS5mcm9tID0gdjsKKyAgcmV0dXJuIHUudG87Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgY29uc3QgZ2NoYXIgKm5hbWUsIGNvbnN0IFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwKKyAgICBjb25zdCBnaW50MzIgc2VxaWQsIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgdmVyc2lvbiA9IChUSFJJRlRfQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fMSkKKyAgICAgICAgICAgICAgICAgICB8ICgoZ2ludDMyKSBtZXNzYWdlX3R5cGUpOworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlciA9IDA7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIHZlcnNpb24sIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLCBuYW1lLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgc2VxaWQsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChuYW1lKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDE2IGZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyID0gMDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKG5hbWUpOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBmaWVsZF9pZCwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgVF9TVE9QLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyID0gMDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkga2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgKGdpbnQzMikgc2l6ZSwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXIgPSAwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIChnaW50MzIpIHNpemUsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdib29sZWFuIHZhbHVlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ3VpbnQ4IHRtcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgdG1wID0gdmFsdWUgPyAxIDogMDsKKyAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgdG1wLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ4IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworICAgCisgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSAmdmFsdWUsIDEsIGVycm9yKSkKKyAgeworICAgIHJldHVybiAxOworICB9IGVsc2UgeworICAgIHJldHVybiAtMTsKKyAgfQorfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQxNiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDE2IG5ldDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgbmV0ID0gZ19odG9ucyAodmFsdWUpOworICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgJm5ldCwgMiwgZXJyb3IpKQorICB7CisgICAgcmV0dXJuIDI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDMyIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgbmV0OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBuZXQgPSBnX2h0b25sICh2YWx1ZSk7CisgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSAmbmV0LCA0LCBlcnJvcikpCisgIHsKKyAgICByZXR1cm4gNDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQ2NCBuZXQ7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIG5ldCA9IEdVSU5UNjRfVE9fQkUgKHZhbHVlKTsKKyAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpICZuZXQsIDgsIGVycm9yKSkKKyAgeworICAgIHJldHVybiA4OworICB9IGVsc2UgeworICAgIHJldHVybiAtMTsKKyAgfQorfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2RvdWJsZSB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIGd1aW50NjQgYml0czsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgYml0cyA9IEdVSU5UNjRfRlJPTV9CRSAodGhyaWZ0X2JpdHdpc2VfY2FzdF9ndWludDY0ICh2YWx1ZSkpOworICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgJmJpdHMsIDgsIGVycm9yKSkKKyAgeworICAgIHJldHVybiA4OworICB9IGVsc2UgeworICAgIHJldHVybiAtMTsKKyAgfQorfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKnN0ciwgR0Vycm9yICoqZXJyb3IpCit7CisgIGd1aW50MzIgbGVuOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBsZW4gPSBzdHIgIT0gTlVMTCA/IHN0cmxlbiAoc3RyKSA6IDA7CisgIC8qIHdyaXRlIHRoZSBzdHJpbmcgbGVuZ3RoICsgMSB3aGljaCBpbmNsdWRlcyB0aGUgbnVsbCB0ZXJtaW5hdG9yICovCisgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgKGNvbnN0IGdwb2ludGVyKSBzdHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlciA9IDA7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIGxlbiwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKGxlbiA+IDApCisgIHsKKyAgICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSBidWYsIGxlbiwgZXJyb3IpID09IEZBTFNFKQorICAgIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSBsZW47CisgIH0KKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRNZXNzYWdlVHlwZSAqbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMiAqc2VxaWQsIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlciA9IDA7CisgIGdpbnQzMiBzejsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmc3osIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmIChzeiA8IDApCisgIHsKKyAgICAvKiBjaGVjayBmb3IgdmVyc2lvbiAqLworICAgIGd1aW50MzIgdmVyc2lvbiA9IHN6ICYgVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9WRVJTSU9OX01BU0s7CisgICAgaWYgKHZlcnNpb24gIT0gVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9WRVJTSU9OXzEpCisgICAgeworICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX0JBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCB2ZXJzaW9uICVkLCBnb3QgJWQiLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9CSU5BUllfUFJPVE9DT0xfVkVSU0lPTl8xLCB2ZXJzaW9uKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAqbWVzc2FnZV90eXBlID0gKFRocmlmdE1lc3NhZ2VUeXBlKSAoc3ogJiAweDAwMDAwMGZmKTsKKworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgbmFtZSwgZXJyb3IpKSA8IDApCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgc2VxaWQsIGVycm9yKSkgPCAwKQorICAgIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0KKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgKm5hbWUgPSBOVUxMOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICpmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MTYgKmZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXIgPSAwOworICBnaW50OCB0eXBlOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAobmFtZSk7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnR5cGUsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworICAqZmllbGRfdHlwZSA9IChUaHJpZnRUeXBlKSB0eXBlOworICBpZiAoKmZpZWxkX3R5cGUgPT0gVF9TVE9QKQorICB7CisgICAgKmZpZWxkX2lkID0gMDsKKyAgICByZXR1cm4geGZlcjsKKyAgfQorICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsIGZpZWxkX2lkLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXIgPSAwOworICBnaW50OCBrLCB2OworICBnaW50MzIgc2l6ZWk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZrLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgKmtleV90eXBlID0gKFRocmlmdFR5cGUpIGs7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnYsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworICAqdmFsdWVfdHlwZSA9IChUaHJpZnRUeXBlKSB2OworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnNpemVpLCBlcnJvcikpIDwwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmIChzaXplaSA8IDApCisgIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICJnb3QgbmVnYXRpdmUgc2l6ZSBvZiAlZCIsIHNpemVpKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAqc2l6ZSA9IChndWludDMyKSBzaXplaTsKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyID0gMDsKKyAgZ2ludDggZTsKKyAgZ2ludDMyIHNpemVpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmZSwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgICplbGVtZW50X3R5cGUgPSAoVGhyaWZ0VHlwZSkgZTsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZzaXplaSwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKHNpemVpIDwgMCkKKyAgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgImdvdCBuZWdhdGl2ZSBzaXplIG9mICVkIiwgc2l6ZWkpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgICpzaXplID0gKGd1aW50MzIpIHNpemVpOworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbGlzdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCBlbGVtZW50X3R5cGUsIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc2V0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnYm9vbGVhbiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdwb2ludGVyIGJbMV07CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0gCisgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLCAxLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICAqdmFsdWUgPSAqKGdpbnQ4ICopIGIgIT0gMDsKKyAgcmV0dXJuIHJldDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50OCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdwb2ludGVyIGJbMV07CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0KKyAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIsIDEsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgICp2YWx1ZSA9ICooZ2ludDggKikgYjsKKyAgcmV0dXJuIHJldDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQxNiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgdW5pb24KKyAgeworICAgIGdpbnQ4IGJ5dGVfYXJyYXlbMl07CisgICAgZ2ludDE2IGludDE2OworICB9IGI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0KKyAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYnl0ZV9hcnJheSwgMiwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgKnZhbHVlID0gZ19udG9ocyAoYi5pbnQxNik7CisgIHJldHVybiByZXQ7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MzIgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIHVuaW9uCisgIHsKKyAgICBnaW50OCBieXRlX2FycmF5WzRdOworICAgIGdpbnQzMiBpbnQzMjsKKyAgfSBiOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9CisgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmJ5dGVfYXJyYXksIDQsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgICp2YWx1ZSA9IGdfbnRvaGwgKGIuaW50MzIpOworICByZXR1cm4gcmV0OworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDY0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICB1bmlvbgorICB7CisgICAgZ2ludDggYnl0ZV9hcnJheVs4XTsKKyAgICBnaW50NjQgaW50NjQ7CisgIH0gYjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPQorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5ieXRlX2FycmF5LCA4LCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICAqdmFsdWUgPSBHVUlOVDY0X0ZST01fQkUgKGIuaW50NjQpOworICByZXR1cm4gcmV0OworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9kb3VibGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUgKnZhbHVlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgdW5pb24KKyAgeworICAgIGdpbnQ4IGJ5dGVfYXJyYXlbOF07CisgICAgZ3VpbnQ2NCB1aW50NjQ7CisgIH0gYjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPQorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5ieXRlX2FycmF5LCA4LCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICAqdmFsdWUgPSB0aHJpZnRfYml0d2lzZV9jYXN0X2dkb3VibGUgKEdVSU5UNjRfRlJPTV9CRSAoYi51aW50NjQpKTsKKyAgcmV0dXJuIHJldDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKnN0ciwgR0Vycm9yICoqZXJyb3IpCit7CisgIGd1aW50MzIgbGVuOworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlciA9IDA7CisgIGdpbnQzMiByZWFkX2xlbiA9IDA7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIC8qIHJlYWQgdGhlIGxlbmd0aCBpbnRvIHJlYWRfbGVuICovCisgIGlmICgocmV0ID0KKyAgICAgICB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmcmVhZF9sZW4sIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmIChyZWFkX2xlbiA8IDApIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICJnb3QgbmVnYXRpdmUgc2l6ZSBvZiAlZCIsIHJlYWRfbGVuKTsKKyAgICAqc3RyID0gTlVMTDsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBhbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciB0aGUgc3RyaW5nICovCisgIGxlbiA9IChndWludDMyKSByZWFkX2xlbiArIDE7IC8qIHNwYWNlIGZvciBudWxsIHRlcm1pbmF0b3IgKi8KKyAgKnN0ciA9IGdfbmV3MCAoZ2NoYXIsIGxlbik7CisgIGlmIChyZWFkX2xlbiA+IDApIHsKKyAgICBpZiAoKHJldCA9CisgICAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0ciwgcmVhZF9sZW4sIGVycm9yKSkgPCAwKQorICAgIHsKKyAgICAgIGdfZnJlZSAoKnN0cik7CisgICAgICAqc3RyID0gTlVMTDsKKyAgICAgIGxlbiA9IDA7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9IGVsc2UgeworICAgICoqc3RyID0gMDsKKyAgfQorCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyICpidWYsIGd1aW50MzIgKmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlciA9IDA7CisgIGdpbnQzMiByZWFkX2xlbiA9IDA7CisgCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICAvKiByZWFkIHRoZSBsZW5ndGggaW50byByZWFkX2xlbiAqLworICBpZiAoKHJldCA9CisgICAgICAgdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnJlYWRfbGVuLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAocmVhZF9sZW4gPiAwKQorICB7CisgICAgLyogYWxsb2NhdGUgdGhlIG1lbW9yeSBhcyBhbiBhcnJheSBvZiB1bnNpZ25lZCBjaGFyIGZvciBiaW5hcnkgZGF0YSAqLworICAgICpsZW4gPSAoZ3VpbnQzMikgcmVhZF9sZW47CisgICAgKmJ1ZiA9IGdfbmV3IChndWNoYXIsICpsZW4pOworICAgIGlmICgocmV0ID0KKyAgICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmLCAqbGVuLCBlcnJvcikpIDwgMCkKKyAgICB7CisgICAgICBnX2ZyZWUgKCpidWYpOworICAgICAgKmJ1ZiA9IE5VTEw7CisgICAgICAqbGVuID0gMDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0gZWxzZSB7CisgICAgKmxlbiA9IChndWludDMyKSByZWFkX2xlbjsKKyAgICAqYnVmID0gTlVMTDsKKyAgfQorCisgIHJldHVybiB4ZmVyOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9pbml0IChUaHJpZnRCaW5hcnlQcm90b2NvbCAqcHJvdG9jb2wpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7Cit9CisKKy8qIGluaXRpYWxpemUgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9jbGFzc19pbml0IChUaHJpZnRCaW5hcnlQcm90b2NvbENsYXNzICprbGFzcykKK3sKKyAgVGhyaWZ0UHJvdG9jb2xDbGFzcyAqY2xzID0gVEhSSUZUX1BST1RPQ09MX0NMQVNTIChrbGFzcyk7CisKKyAgY2xzLT53cml0ZV9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luOworICBjbHMtPndyaXRlX21lc3NhZ2VfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZDsKKyAgY2xzLT53cml0ZV9zdHJ1Y3RfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbjsKKyAgY2xzLT53cml0ZV9zdHJ1Y3RfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kOworICBjbHMtPndyaXRlX2ZpZWxkX2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbjsKKyAgY2xzLT53cml0ZV9maWVsZF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZDsKKyAgY2xzLT53cml0ZV9maWVsZF9zdG9wID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wOworICBjbHMtPndyaXRlX21hcF9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luOworICBjbHMtPndyaXRlX21hcF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9lbmQ7CisgIGNscy0+d3JpdGVfbGlzdF9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbjsKKyAgY2xzLT53cml0ZV9saXN0X2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQ7CisgIGNscy0+d3JpdGVfc2V0X2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW47CisgIGNscy0+d3JpdGVfc2V0X2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZDsKKyAgY2xzLT53cml0ZV9ib29sID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ib29sOworICBjbHMtPndyaXRlX2J5dGUgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGU7CisgIGNscy0+d3JpdGVfaTE2ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMTY7CisgIGNscy0+d3JpdGVfaTMyID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzI7CisgIGNscy0+d3JpdGVfaTY0ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pNjQ7CisgIGNscy0+d3JpdGVfZG91YmxlID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9kb3VibGU7CisgIGNscy0+d3JpdGVfc3RyaW5nID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJpbmc7CisgIGNscy0+d3JpdGVfYmluYXJ5ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnk7CisgIGNscy0+cmVhZF9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW47CisgIGNscy0+cmVhZF9tZXNzYWdlX2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZDsKKyAgY2xzLT5yZWFkX3N0cnVjdF9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW47CisgIGNscy0+cmVhZF9zdHJ1Y3RfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQ7CisgIGNscy0+cmVhZF9maWVsZF9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbjsKKyAgY2xzLT5yZWFkX2ZpZWxkX2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQ7CisgIGNscy0+cmVhZF9tYXBfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luOworICBjbHMtPnJlYWRfbWFwX2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfZW5kOworICBjbHMtPnJlYWRfbGlzdF9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luOworICBjbHMtPnJlYWRfbGlzdF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbGlzdF9lbmQ7CisgIGNscy0+cmVhZF9zZXRfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luOworICBjbHMtPnJlYWRfc2V0X2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zZXRfZW5kOworICBjbHMtPnJlYWRfYm9vbCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ib29sOworICBjbHMtPnJlYWRfYnl0ZSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlOworICBjbHMtPnJlYWRfaTE2ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kxNjsKKyAgY2xzLT5yZWFkX2kzMiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzI7CisgIGNscy0+cmVhZF9pNjQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTY0OworICBjbHMtPnJlYWRfZG91YmxlID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2RvdWJsZTsKKyAgY2xzLT5yZWFkX3N0cmluZyA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJpbmc7CisgIGNscy0+cmVhZF9iaW5hcnkgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5OworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjMwYmNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQklOQVJZX1BST1RPQ09MX0gKKyNkZWZpbmUgX1RIUklGVF9CSU5BUllfUFJPVE9DT0xfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sLmgKKyAqICBcYnJpZWYgQmluYXJ5IHByb3RvY29sIGltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IHByb3RvY29sLiAgSW1wbGVtZW50cyB0aGUKKyAqICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgaW50ZXJmYWNlLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0JJTkFSWV9QUk9UT0NPTChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgVGhyaWZ0QmluYXJ5UHJvdG9jb2wpKQorI2RlZmluZSBUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCBUaHJpZnRCaW5hcnlQcm90b2NvbENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgVGhyaWZ0QmluYXJ5UHJvdG9jb2xDbGFzcykpCisKKy8qIHZlcnNpb24gbnVtYmVycyAqLworI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fMSAweDgwMDEwMDAwCisjZGVmaW5lIFRIUklGVF9CSU5BUllfUFJPVE9DT0xfVkVSU0lPTl9NQVNLIDB4ZmZmZjAwMDAKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEJpbmFyeVByb3RvY29sIFRocmlmdEJpbmFyeVByb3RvY29sOworCisvKiEKKyAqIFRocmlmdCBCaW5hcnkgUHJvdG9jb2wgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2wKK3sKKyAgVGhyaWZ0UHJvdG9jb2wgcGFyZW50OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEJpbmFyeVByb3RvY29sQ2xhc3MgVGhyaWZ0QmluYXJ5UHJvdG9jb2xDbGFzczsKKworLyohCisgKiBUaHJpZnQgQmluYXJ5IFByb3RvY29sIGNsYXNzLgorICovCitzdHJ1Y3QgX1RocmlmdEJpbmFyeVByb3RvY29sQ2xhc3MKK3sKKyAgVGhyaWZ0UHJvdG9jb2xDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCAqLworR1R5cGUgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzRlOWFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuYwpAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5Lmg+CisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5LCB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnksIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlkpCisKK1RocmlmdFByb3RvY29sICoKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeV9nZXRfcHJvdG9jb2wgKFRocmlmdFByb3RvY29sRmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBUaHJpZnRCaW5hcnlQcm90b2NvbCAqdGIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LCBOVUxMKTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZmFjdG9yeSk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTCAodGIpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5X2NsYXNzX2luaXQgKFRocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeUNsYXNzICpjbHMpCit7CisgIFRocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzICpwcm90b2NvbF9mYWN0b3J5X2NsYXNzID0gVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfQ0xBU1MgKGNscyk7CisKKyAgcHJvdG9jb2xfZmFjdG9yeV9jbGFzcy0+Z2V0X3Byb3RvY29sID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm90b2NvbDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeV9pbml0IChUaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnkgKmZhY3RvcnkpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChmYWN0b3J5KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZGMwNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZX0gKKyNkZWZpbmUgX1RIUklGVF9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWV9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWShvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZLCBUaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnkpKQorI2RlZmluZSBUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlkob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSkpCisjZGVmaW5lIFRIUklGVF9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWV9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlksIFRocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeUNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSkpCisjZGVmaW5lIFRIUklGVF9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWV9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZLCBUaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnlDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnkgVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5OworCitzdHJ1Y3QgX1RocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeQoreworICBUaHJpZnRQcm90b2NvbEZhY3RvcnkgcGFyZW50OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeUNsYXNzIFRocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeUNsYXNzOworCitzdHJ1Y3QgX1RocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeUNsYXNzCit7CisgIFRocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlkgKi8KK0dUeXBlIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWU0NzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5jCkBAIC0wLDAgKzEsMTYwOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY29uZmlnLmg+CisKKy8qCisgKiAqX3RvX3ppZ3phZyBkZXBlbmQgb24gdGhlIGZhY3QgdGhhdCB0aGUgcmlnaHQgc2hpZnQKKyAqIG9wZXJhdG9yIG9uIGEgc2lnbmVkIGludGVnZXIgaXMgYW4gYXJpdGhtZXRpYyAoc2lnbi1leHRlbmRpbmcpIHNoaWZ0LgorICogSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHdpbGwgbm90IHdvcmsuCisgKi8KKyNpZiAhZGVmaW5lZChTSUdORURfUklHSFRfU0hJRlRfSVMpIHx8ICFkZWZpbmVkKEFSSVRITUVUSUNfUklHSFRfU0hJRlQpCisjIGVycm9yICJVbmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBiZWhhdmlvciBvZiBhIHNpZ25lZCByaWdodCBzaGlmdCIKKyNlbmRpZgorI2lmIFNJR05FRF9SSUdIVF9TSElGVF9JUyAhPSBBUklUSE1FVElDX1JJR0hUX1NISUZUCisjIGVycm9yICJ0aHJpZnRfY29tcGFjdF9wcm90b2NvbCBvbmx5IHdvcmtzIGlmIHNpZ25lZCByaWdodCBzaGlmdCBpcyBhcml0aG1ldGljIgorI2VuZGlmCisKKy8qIG9iamVjdCBwcm9wZXJ0aWVzICovCitlbnVtIF9UaHJpZnRDb21wYWN0UHJvdG9jb2xQcm9wZXJ0aWVzCit7CisgICAgUFJPUF8wLAorICAgIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfU1RSSU5HX0xJTUlULAorICAgIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfQ09OVEFJTkVSX0xJTUlUCit9OworCitHX0RFRklORV9UWVBFIChUaHJpZnRDb21wYWN0UHJvdG9jb2wsIHRocmlmdF9jb21wYWN0X3Byb3RvY29sLAorICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfUFJPVE9DT0wpCisKK3N0YXRpYyBjb25zdCBnaW50OCBQUk9UT0NPTF9JRCA9IChnaW50OCkweDgydTsKK3N0YXRpYyBjb25zdCBnaW50OCBWRVJTSU9OX04gPSAxOworc3RhdGljIGNvbnN0IGdpbnQ4IFZFUlNJT05fTUFTSyA9IDB4MWY7ICAgICAgIC8qIDAwMDEgMTExMSAqLworc3RhdGljIGNvbnN0IGdpbnQ4IFRZUEVfTUFTSyA9IChnaW50OCkweGUwdTsgIC8qIDExMTAgMDAwMCAqLworc3RhdGljIGNvbnN0IGdpbnQ4IFRZUEVfQklUUyA9IDB4MDc7ICAgICAgICAgIC8qIDAwMDAgMDExMSAqLworc3RhdGljIGNvbnN0IGdpbnQzMiBUWVBFX1NISUZUX0FNT1VOVCA9IDU7CisKK2VudW0gVHlwZXMgeworICBDVF9TVE9QICAgICAgICAgICA9IDB4MDAsCisgIENUX0JPT0xFQU5fVFJVRSAgID0gMHgwMSwKKyAgQ1RfQk9PTEVBTl9GQUxTRSAgPSAweDAyLAorICBDVF9CWVRFICAgICAgICAgICA9IDB4MDMsCisgIENUX0kxNiAgICAgICAgICAgID0gMHgwNCwKKyAgQ1RfSTMyICAgICAgICAgICAgPSAweDA1LAorICBDVF9JNjQgICAgICAgICAgICA9IDB4MDYsCisgIENUX0RPVUJMRSAgICAgICAgID0gMHgwNywKKyAgQ1RfQklOQVJZICAgICAgICAgPSAweDA4LAorICBDVF9MSVNUICAgICAgICAgICA9IDB4MDksCisgIENUX1NFVCAgICAgICAgICAgID0gMHgwQSwKKyAgQ1RfTUFQICAgICAgICAgICAgPSAweDBCLAorICBDVF9TVFJVQ1QgICAgICAgICA9IDB4MEMKK307CisKK3N0YXRpYyBjb25zdCBnaW50OCBUVHlwZVRvQ1R5cGVbMTZdID0geworICBDVF9TVE9QLCAvKiBUX1NUT1AgKi8KKyAgMCwgLyogdW51c2VkICovCisgIENUX0JPT0xFQU5fVFJVRSwgLyogVF9CT09MICovCisgIENUX0JZVEUsIC8qIFRfQllURSAqLworICBDVF9ET1VCTEUsIC8qIFRfRE9VQkxFICovCisgIDAsIC8qIHVudXNlZCAqLworICBDVF9JMTYsIC8qIFRfSTE2ICovCisgIDAsIC8qIHVudXNlZCAqLworICBDVF9JMzIsIC8qIFRfSTMyICovCisgIDAsIC8qIHVudXNlZCAqLworICBDVF9JNjQsIC8qIFRfSTY0ICovCisgIENUX0JJTkFSWSwgLyogVF9TVFJJTkcgKi8KKyAgQ1RfU1RSVUNULCAvKiBUX1NUUlVDVCAqLworICBDVF9NQVAsIC8qIFRfTUFQICovCisgIENUX1NFVCwgLyogVF9TRVQgKi8KKyAgQ1RfTElTVCwgLyogVF9MSVNUICovCit9OworCitzdGF0aWMgZ3VpbnQ2NAordGhyaWZ0X2JpdHdpc2VfY2FzdF9ndWludDY0IChjb25zdCBnZG91YmxlIHYpCit7CisgIHVuaW9uIHsKKyAgICBnZG91YmxlIGZyb207CisgICAgZ3VpbnQ2NCB0bzsKKyAgfSB1OworICB1LmZyb20gPSB2OworICByZXR1cm4gdS50bzsKK30KKworc3RhdGljIGdkb3VibGUKK3RocmlmdF9iaXR3aXNlX2Nhc3RfZ2RvdWJsZSAoY29uc3QgZ3VpbnQ2NCB2KQoreworICB1bmlvbiB7CisgICAgZ3VpbnQ2NCBmcm9tOworICAgIGdkb3VibGUgdG87CisgIH0gdTsKKyAgdS5mcm9tID0gdjsKKyAgcmV0dXJuIHUudG87Cit9CisKKy8qKgorICogQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICovCitzdGF0aWMgZ3VpbnQ2NAoraTY0X3RvX3ppZ3phZyAoY29uc3QgZ2ludDY0IGwpCit7CisgIHJldHVybiAoKChndWludDY0KWwpIDw8IDEpIF4gKGwgPj4gNjMpOworfQorCisvKioKKyAqIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICovCitzdGF0aWMgZ3VpbnQzMgoraTMyX3RvX3ppZ3phZyAoY29uc3QgZ2ludDMyIG4pCit7CisgIHJldHVybiAoKChndWludDMyKW4pIDw8IDEpIF4gKG4gPj4gMzEpOworfQorCisvKioKKyAqIENvbnZlcnQgZnJvbSB6aWd6YWcgaW50IHRvIGludC4KKyAqLworc3RhdGljIGdpbnQzMgoremlnemFnX3RvX2kzMiAoZ3VpbnQzMiBuKQoreworICByZXR1cm4gKG4gPj4gMSkgXiAoZ3VpbnQzMikgKC0oZ2ludDMyKSAobiAmIDEpKTsKK30KKworLyoqCisgKiBDb252ZXJ0IGZyb20gemlnemFnIGxvbmcgdG8gbG9uZy4KKyAqLworc3RhdGljIGdpbnQ2NAoremlnemFnX3RvX2k2NCAoZ3VpbnQ2NCBuKQoreworICByZXR1cm4gKG4gPj4gMSkgXiAoZ3VpbnQ2NCkgKC0oZ2ludDY0KSAobiAmIDEpKTsKK30KKworVGhyaWZ0VHlwZSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfdHR5cGUgKFRocmlmdENvbXBhY3RQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDggdHlwZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUX1NUT1A6CisgICAgICByZXR1cm4gVF9TVE9QOworICAgIGNhc2UgQ1RfQk9PTEVBTl9GQUxTRToKKyAgICBjYXNlIENUX0JPT0xFQU5fVFJVRToKKyAgICAgIHJldHVybiBUX0JPT0w7CisgICAgY2FzZSBDVF9CWVRFOgorICAgICAgcmV0dXJuIFRfQllURTsKKyAgICBjYXNlIENUX0kxNjoKKyAgICAgIHJldHVybiBUX0kxNjsKKyAgICBjYXNlIENUX0kzMjoKKyAgICAgIHJldHVybiBUX0kzMjsKKyAgICBjYXNlIENUX0k2NDoKKyAgICAgIHJldHVybiBUX0k2NDsKKyAgICBjYXNlIENUX0RPVUJMRToKKyAgICAgIHJldHVybiBUX0RPVUJMRTsKKyAgICBjYXNlIENUX0JJTkFSWToKKyAgICAgIHJldHVybiBUX1NUUklORzsKKyAgICBjYXNlIENUX0xJU1Q6CisgICAgICByZXR1cm4gVF9MSVNUOworICAgIGNhc2UgQ1RfU0VUOgorICAgICAgcmV0dXJuIFRfU0VUOworICAgIGNhc2UgQ1RfTUFQOgorICAgICAgcmV0dXJuIFRfTUFQOworICAgIGNhc2UgQ1RfU1RSVUNUOgorICAgICAgcmV0dXJuIFRfU1RSVUNUOworICAgIGRlZmF1bHQ6CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgdHlwZSIpOworICAgICAgcmV0dXJuIC0xOworICB9Cit9CisKKy8qKgorICogV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgd2lyZS4KKyAqLworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAoVGhyaWZ0Q29tcGFjdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGd1aW50OCBidWZbNV07CisgIGdpbnQzMiB4ZmVyOworICBndWludDMyIG07CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICB4ZmVyID0gMDsKKyAgbSA9IG47CisKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICBpZiAoKG0gJiB+MHg3RikgPT0gMCkgeworICAgICAgYnVmW3hmZXIrK10gPSAoZ2ludDgpbTsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBidWZbeGZlcisrXSA9IChnaW50OCkoKG0gJiAweDdGKSB8IDB4ODApOworICAgICAgbSA+Pj0gNzsKKyAgICB9CisgIH0KKworICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAoVEhSSUZUX1BST1RPQ09MIChwcm90b2NvbCktPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgYnVmLCB4ZmVyLCBlcnJvcikpIHsKKyAgICByZXR1cm4geGZlcjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKworLyoqCisgKiBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KKyAqLworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQ2NCAoVGhyaWZ0Q29tcGFjdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDY0IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGd1aW50OCBidWZbMTBdOworICBnaW50MzIgeGZlcjsKKyAgZ3VpbnQ2NCBtOworCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgeGZlciA9IDA7CisgIG0gPSBuOworCisgIHdoaWxlIChUUlVFKSB7CisgICAgaWYgKChtICYgfjB4N0ZMKSA9PSAwKSB7CisgICAgICBidWZbeGZlcisrXSA9IChnaW50OCltOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1Zlt4ZmVyKytdID0gKGdpbnQ4KSgobSAmIDB4N0YpIHwgMHg4MCk7CisgICAgICBtID4+PSA3OworICAgIH0KKyAgfQorCisgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKS0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSBidWYsIHhmZXIsIGVycm9yKSkgeworICAgIHJldHVybiB4ZmVyOworICB9IGVsc2UgeworICAgIHJldHVybiAtMTsKKyAgfQorfQorCisvKioKKyAqIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSBwcm9wZXIgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gMTAgYnl0ZXMuCisgKi8KK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQ2NCAoVGhyaWZ0Q29tcGFjdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQ2NCAqaTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sICp0cDsKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisgIGd1aW50NjQgdmFsOworICBnaW50IHNoaWZ0OworICBndWludDggYnl0ZTsKKworICB0cCA9IFRIUklGVF9QUk9UT0NPTCAocHJvdG9jb2wpOworICB4ZmVyID0gMDsKKyAgdmFsID0gMDsKKyAgc2hpZnQgPSAwOworICBieXRlID0gMDsKKworICB3aGlsZSAoVFJVRSkgeworICAgIGlmICgocmV0ID0gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAodHAtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgJmJ5dGUsIDEsIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgICsreGZlcjsKKyAgICB2YWwgfD0gKGd1aW50NjQpKGJ5dGUgJiAweDdmKSA8PCBzaGlmdDsKKyAgICBzaGlmdCArPSA3OworICAgIGlmICghKGJ5dGUgJiAweDgwKSkgeworICAgICAgKmk2NCA9IChnaW50NjQpIHZhbDsKKyAgICAgIHJldHVybiB4ZmVyOworICAgIH0KKyAgICBpZiAoR19VTkxJS0VMWSAoeGZlciA9PSAxMCkpIHsgLyogNyAqIDkgPCA2NCA8IDcgKiAxMCAqLworICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX0lOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAidmFyaWFibGUtbGVuZ3RoIGludCBvdmVyIDEwIGJ5dGVzIik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9Cit9CisKKy8qKgorICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDUgYnl0ZXMuCisgKi8KK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAoVGhyaWZ0Q29tcGFjdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMiAqaTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQ2NCB2YWw7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIHhmZXIgPSAwOworCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQ2NCAocHJvdG9jb2wsICZ2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgKmkzMiA9IChnaW50MzIpdmFsOworCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luX2ludGVybmFsIChUaHJpZnRDb21wYWN0UHJvdG9jb2wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDE2IGZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQ4IHR5cGVfb3ZlcnJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworICBnaW50OCB0eXBlX3RvX3dyaXRlOworCisgIFRIUklGVF9VTlVTRURfVkFSIChuYW1lKTsKKworICB4ZmVyID0gMDsKKworICAvKiBpZiB0aGVyZSdzIGEgdHlwZSBvdmVycmlkZSwgdXNlIHRoYXQuICovCisgIHR5cGVfdG9fd3JpdGUKKyAgICA9ICh0eXBlX292ZXJyaWRlID09IC0xID8gVFR5cGVUb0NUeXBlW2ZpZWxkX3R5cGVdIDogdHlwZV9vdmVycmlkZSk7CisKKyAgLyogY2hlY2sgaWYgd2UgY2FuIHVzZSBkZWx0YSBlbmNvZGluZyBmb3IgdGhlIGZpZWxkIGlkICovCisgIGlmIChmaWVsZF9pZCA+IHByb3RvY29sLT5fbGFzdF9maWVsZF9pZAorICAgICAgJiYgZmllbGRfaWQgLSBwcm90b2NvbC0+X2xhc3RfZmllbGRfaWQgPD0gMTUpIHsKKyAgICAvKiB3cml0ZSB0aGVtIHRvZ2V0aGVyICovCisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAoVEhSSUZUX1BST1RPQ09MIChwcm90b2NvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KSAoKGZpZWxkX2lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJvdG9jb2wtPl9sYXN0X2ZpZWxkX2lkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDQgfCB0eXBlX3RvX3dyaXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfSBlbHNlIHsKKyAgICAvKiB3cml0ZSB0aGVtIHNlcGFyYXRlICovCisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAoVEhSSUZUX1BST1RPQ09MIChwcm90b2NvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV90b193cml0ZSwgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMTYgKFRIUklGVF9QUk9UT0NPTCAocHJvdG9jb2wpLCBmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9CisKKyAgcHJvdG9jb2wtPl9sYXN0X2ZpZWxkX2lkID0gZmllbGRfaWQ7CisgIHJldHVybiB4ZmVyOworfQorCisvKioKKyAqIE1ldGhvZCBmb3Igd3JpdGluZyB0aGUgc3RhcnQgb2YgbGlzdHMgYW5kIHNldHMuIExpc3QgYW5kIHNldHMgb24KKyAqIHRoZSB3aXJlIGRpZmZlciBvbmx5IGJ5IHRoZSB0eXBlIGluZGljYXRvci4KKyAqLworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9jb2xsZWN0aW9uX2JlZ2luIChUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICB4ZmVyID0gMDsKKworICBpZiAoc2l6ZSA8PSAxNCkgeworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKFRIUklGVF9QUk9UT0NPTCAocHJvdG9jb2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaW50OCkgKHNpemUgPDwgNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFR5cGVUb0NUeXBlW2VsZW1fdHlwZV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9IGVsc2UgeworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKFRIUklGVF9QUk9UT0NPTCAocHJvdG9jb2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaW50OCkgKDB4ZjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRUeXBlVG9DVHlwZVtlbGVtX3R5cGVdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKworICAgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50MzIgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChndWludDMyKSBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKKy8qCisgKiBwdWJsaWMgbWV0aG9kcworICovCisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRNZXNzYWdlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgc2VxaWQsIEdFcnJvciAqKmVycm9yKQoreworICBnaW50OCB2ZXJzaW9uOworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHZlcnNpb24gPSAoVkVSU0lPTl9OICYgVkVSU0lPTl9NQVNLKQorICAgICAgICAgICAgfCAoKChnaW50MzIpIG1lc3NhZ2VfdHlwZSA8PCBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX01BU0spOworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgUFJPVE9DT0xfSUQsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCB2ZXJzaW9uLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyIChjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGd1aW50MzIpIHNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLCBuYW1lLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisgIEdRdWV1ZSAqcTsKKworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSIChuYW1lKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKyAgcSA9ICYoY3AtPl9sYXN0X2ZpZWxkKTsKKworICBnX3F1ZXVlX3B1c2hfdGFpbCAocSwgR0lOVF9UT19QT0lOVEVSICgoZ2ludCkgY3AtPl9sYXN0X2ZpZWxkX2lkKSk7CisgIGNwLT5fbGFzdF9maWVsZF9pZCA9IDA7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworICBHUXVldWUgKnE7CisKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKyAgcSA9ICYoY3AtPl9sYXN0X2ZpZWxkKTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwLT5fbGFzdF9maWVsZF9pZCA9IChnaW50MTYpIEdQT0lOVEVSX1RPX0lOVCAoZ19xdWV1ZV9wb3BfdGFpbCAocSkpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MTYgZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgaWYgKGZpZWxkX3R5cGUgPT0gVF9CT09MKSB7CisgICAgY3AtPl9ib29sX2ZpZWxkX25hbWUgPSBuYW1lOworICAgIGNwLT5fYm9vbF9maWVsZF90eXBlID0gZmllbGRfdHlwZTsKKyAgICBjcC0+X2Jvb2xfZmllbGRfaWQgPSBmaWVsZF9pZDsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW5faW50ZXJuYWwgKGNwLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2lkLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgfQorfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKyAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSBUX1NUT1AsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBrZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHhmZXIgPSAwOworCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50MzIgKGNwLCAoZ3VpbnQzMikgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKHNpemUgPiAwKSB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KSAoVFR5cGVUb0NUeXBlW2tleV90eXBlXSA8PCA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVHlwZVRvQ1R5cGVbdmFsdWVfdHlwZV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2NvbGxlY3Rpb25fYmVnaW4gKGNwLCBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHJldHVybiB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9jb2xsZWN0aW9uX2JlZ2luIChjcCwgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdib29sZWFuIHZhbHVlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoY3AtPl9ib29sX2ZpZWxkX25hbWUgIT0gTlVMTCkgeworICAgIC8qIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZmllbGQgaGVhZGVyIHlldCAqLworICAgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW5faW50ZXJuYWwgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AtPl9ib29sX2ZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC0+X2Jvb2xfZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLT5fYm9vbF9maWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaW50OCkgKHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IENUX0JPT0xFQU5fVFJVRSA6IENUX0JPT0xFQU5fRkFMU0UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisKKyAgICBjcC0+X2Jvb2xfZmllbGRfbmFtZSA9IE5VTEw7CisgIH0gZWxzZSB7CisgICAgLyogd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCB3cml0ZSB0aGUgdmFsdWUgKi8KKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpICh2YWx1ZSA/IENUX0JPT0xFQU5fVFJVRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ1RfQk9PTEVBTl9GQUxTRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0KKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50OCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSAmdmFsdWUsIDEsIGVycm9yKSkgeworICAgIHJldHVybiAxOworICB9IGVsc2UgeworICAgIHJldHVybiAtMTsKKyAgfQorfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MTYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHJldHVybiB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAoY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RvX3ppZ3phZyAoKGdpbnQzMikgdmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDMyIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICByZXR1cm4gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50MzIgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl90b196aWd6YWcgKHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDY0IChjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpNjRfdG9femlnemFnICh2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZG91YmxlIHZhbHVlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ3VpbnQ2NCBiaXRzOworCisgIGdfYXNzZXJ0IChzaXplb2YgKGdkb3VibGUpID09IHNpemVvZiAoZ3VpbnQ2NCkpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgYml0cyA9IEdVSU5UNjRfVE9fTEUgKHRocmlmdF9iaXR3aXNlX2Nhc3RfZ3VpbnQ2NCAodmFsdWUpKTsKKyAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpICZiaXRzLCA4LCBlcnJvcikpIHsKKyAgICByZXR1cm4gODsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKnN0ciwgR0Vycm9yICoqZXJyb3IpCit7CisgIHNpemVfdCBsZW47CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBsZW4gPSBzdHIgIT0gTlVMTCA/IHN0cmxlbiAoc3RyKSA6IDA7CisgIGlmIChsZW4gPiBHX01BWElOVDMyKSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAic3RyaW5nIHNpemUgKGd1ZXNzOiAlbHUpIGlzIHRvbyBsYXJnZSIsICh1bnNpZ25lZCBsb25nKSBsZW4pOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qIHdyaXRlIHRoZSBzdHJpbmcgbGVuZ3RoICsgMSB3aGljaCBpbmNsdWRlcyB0aGUgbnVsbCB0ZXJtaW5hdG9yICovCisgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgKGNvbnN0IGdwb2ludGVyKSBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3VpbnQzMikgbGVuLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHhmZXIgPSAwOworCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50MzIgKGNwLCBsZW4sIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmIChsZW4gPiAwKSB7CisgICAgLyogY2hlY2tpbmcgbGVuICsgeGZlciA+IHVpbnRfbWF4LCBidXQgd2UgZG9uJ3Qgd2FudCB0byBvdmVyZmxvdyB3aGlsZQorICAgICAqIGNoZWNraW5nIGZvciBvdmVyZmxvd3MuIHRyYW5zZm9ybWluZyB0byBsZW4gPiB1aW50X21heCAtIHhmZXIuCisgICAgICovCisgICAgaWYgKGxlbiA+IChndWludDMyKSAoR19NQVhJTlQzMiAtIHhmZXIpKSB7CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAic2l6ZSAlZCArICVkIGlzIHRvbyBsYXJnZSIsIGxlbiwgeGZlcik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgYnVmLCBsZW4sIGVycm9yKSA9PSBGQUxTRSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IGxlbjsKKyAgfQorCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdE1lc3NhZ2VUeXBlICptZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMiAqc2VxaWQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQ4IHByb3RvY29sX2lkLCB2ZXJzaW9uX2FuZF90eXBlLCB2ZXJzaW9uOworCisgIHhmZXIgPSAwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZwcm90b2NvbF9pZCwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKHByb3RvY29sX2lkICE9IFBST1RPQ09MX0lEKSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgImJhZCBwcm90b2NvbCBpZCIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2ZXJzaW9uX2FuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIHZlcnNpb24gPSAoZ2ludDgpKHZlcnNpb25fYW5kX3R5cGUgJiBWRVJTSU9OX01BU0spOworICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OX04pIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX0JBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAiYmFkIHZlcnNpb24gYW5kL29yIHR5cGUiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAqbWVzc2FnZV90eXBlCisgICAgPSAoVGhyaWZ0TWVzc2FnZVR5cGUpKCh2ZXJzaW9uX2FuZF90eXBlID4+IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfQklUUyk7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgc2VxaWQsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgbmFtZSwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworICBHUXVldWUgKnE7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKyAgcSA9ICYoY3AtPl9sYXN0X2ZpZWxkKTsKKworICAqbmFtZSA9IE5VTEw7CisKKyAgZ19xdWV1ZV9wdXNoX3RhaWwgKHEsIEdJTlRfVE9fUE9JTlRFUiAoKGdpbnQpIGNwLT5fbGFzdF9maWVsZF9pZCkpOworICBjcC0+X2xhc3RfZmllbGRfaWQgPSAwOworCisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKyAgR1F1ZXVlICpxOworCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisgIHEgPSAmKGNwLT5fbGFzdF9maWVsZCk7CisKKyAgY3AtPl9sYXN0X2ZpZWxkX2lkID0gKGdpbnQxNikgR1BPSU5URVJfVE9fSU5UIChnX3F1ZXVlX3BvcF90YWlsIChxKSk7CisKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQxNiAqZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnaW50MTYgbW9kaWZpZXI7CisgIGdpbnQ4IGJ5dGU7CisgIGdpbnQ4IHR5cGU7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKG5hbWUpOworCisgIHhmZXIgPSAwOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZieXRlLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICB0eXBlID0gKGJ5dGUgJiAweDBmKTsKKworICAvKiBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIuICovCisgIGlmICh0eXBlID09IFRfU1RPUCkgeworICAgICpmaWVsZF90eXBlID0gVF9TVE9QOworICAgICpmaWVsZF9pZCA9IDA7CisgICAgcmV0dXJuIHhmZXI7CisgIH0KKworICAvKiBtYXNrIG9mZiB0aGUgNCBNU0Igb2YgdGhlIHR5cGUgaGVhZGVyLgorICAgKiBpdCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQgZGVsdGEuCisgICAqLworICBtb2RpZmllciA9IChnaW50MTYpKCgoZ3VpbnQ4KWJ5dGUgJiAweGYwKSA+PiA0KTsKKyAgaWYgKG1vZGlmaWVyID09IDApIHsKKyAgICAvKiBub3QgYSBkZWx0YSwgbG9vayBhaGVhZCBmb3IgdGhlIHppZ3phZyB2YXJpbnQgZmllbGQgaWQuICovCisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCBmaWVsZF9pZCwgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0gZWxzZSB7CisgICAgKmZpZWxkX2lkID0gKGdpbnQxNikoY3AtPl9sYXN0X2ZpZWxkX2lkICsgbW9kaWZpZXIpOworICB9CisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3R0eXBlIChjcCwgdHlwZSwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgKmZpZWxkX3R5cGUgPSByZXQ7CisKKyAgLyogaWYgdGhpcyBoYXBwZW5zIHRvIGJlIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIGlzIGVuY29kZWQgaW4gdGhlIHR5cGUgKi8KKyAgaWYgKHR5cGUgPT0gQ1RfQk9PTEVBTl9UUlVFIHx8IHR5cGUgPT0gQ1RfQk9PTEVBTl9GQUxTRSkgeworICAgIC8qIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlLiAqLworICAgIGNwLT5faGFzX2Jvb2xfdmFsdWUgPSBUUlVFOworICAgIGNwLT5fYm9vbF92YWx1ZSA9CisgICAgICAodHlwZSA9PSBDVF9CT09MRUFOX1RSVUUgPyBUUlVFIDogRkFMU0UpOworICB9CisKKyAgLyogcHVzaCB0aGUgbmV3IGZpZWxkIG9udG8gdGhlIGZpZWxkIHN0YWNrIHNvIHdlIGNhbiBrZWVwIHRoZSBkZWx0YXMgZ29pbmcuICovCisgIGNwLT5fbGFzdF9maWVsZF9pZCA9ICpmaWVsZF9pZDsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKnZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ2ludDgga3ZfdHlwZTsKKyAgZ2ludDMyIG1zaXplOworCisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBrdl90eXBlID0gMDsKKyAgbXNpemUgPSAwOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50MzIgKGNwLCAmbXNpemUsIGVycm9yKSkgPDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgLyogc3RpbGwgcmVhZCB0aGUga3YgYnl0ZSBpZiBuZWdhdGl2ZSBzaXplICovCisgIGlmIChtc2l6ZSAhPSAwKSB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJmt2X3R5cGUsIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9CisKKyAgaWYgKGNwLT5jb250YWluZXJfbGltaXQgPiAwICYmIG1zaXplID4gY3AtPmNvbnRhaW5lcl9saW1pdCkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgImdvdCBzaXplIG92ZXIgbGltaXQgKCVkID4gJWQpIiwgbXNpemUsIGNwLT5jb250YWluZXJfbGltaXQpOworICAgIHJldHVybiAtMTsKKyAgfSBlbHNlIGlmIChtc2l6ZSA+IDApIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2dldF90dHlwZSAoY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaW50OCkoKGd1aW50OClrdl90eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgICprZXlfdHlwZSA9IHJldDsKKyAgICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2dldF90dHlwZSAoY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaW50OCkoKGd1aW50OClrdl90eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAweGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqdmFsdWVfdHlwZSA9IHJldDsKKyAgICAqc2l6ZSA9IChndWludDMyKSBtc2l6ZTsKKyAgfSBlbHNlIGlmIChtc2l6ZSA9PSAwKSB7CisgICAgKmtleV90eXBlID0gMDsKKyAgICAqdmFsdWVfdHlwZSA9IDA7CisgICAgKnNpemUgPSAwOworICB9IGVsc2UgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgImdvdCBuZWdhdGl2ZSBzaXplIG9mICVkIiwgbXNpemUpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWFwX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ2ludDggc2l6ZV9hbmRfdHlwZTsKKyAgZ2ludDMyIGxzaXplOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHNpemVfYW5kX3R5cGUgPSAwOworCisgIHhmZXIgPSAwOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZzaXplX2FuZF90eXBlLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBsc2l6ZSA9ICgoZ3VpbnQ4KXNpemVfYW5kX3R5cGUgPj4gNCkgJiAweDBmOworICBpZiAobHNpemUgPT0gMTUpIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50MzIgKGNwLCAmbHNpemUsIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9CisKKyAgaWYgKGxzaXplIDwgMCkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgImdvdCBuZWdhdGl2ZSBzaXplIG9mICVkIiwgbHNpemUpOworICAgIHJldHVybiAtMTsKKyAgfSBlbHNlIGlmIChjcC0+Y29udGFpbmVyX2xpbWl0ID4gMCAmJiBsc2l6ZSA+IGNwLT5jb250YWluZXJfbGltaXQpIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX1NJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgICJnb3Qgc2l6ZSBvdmVyIGxpbWl0ICglZCA+ICVkKSIsIGxzaXplLCBjcC0+Y29udGFpbmVyX2xpbWl0KTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2dldF90dHlwZSAoY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpKHNpemVfYW5kX3R5cGUgJiAweDBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgICplbGVtZW50X3R5cGUgPSByZXQ7CisgICpzaXplID0gKGd1aW50MzIpIGxzaXplOworCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsIGVsZW1lbnRfdHlwZSwgc2l6ZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc2V0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdib29sZWFuICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ2ludDggdmFsOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHhmZXIgPSAwOworCisgIGlmIChjcC0+X2hhc19ib29sX3ZhbHVlID09IFRSVUUpIHsKKyAgICAqdmFsdWUgPSBjcC0+X2Jvb2xfdmFsdWU7CisgICAgY3AtPl9oYXNfYm9vbF92YWx1ZSA9IEZBTFNFOworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWwsIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworCisgICAgKnZhbHVlID0gKHZhbCA9PSBDVF9CT09MRUFOX1RSVUUpOworICAgIHJldHVybiB4ZmVyOworICB9Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ4ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdwb2ludGVyIGJbMV07CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9CisgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLCAxLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICAqdmFsdWUgPSAqKGdpbnQ4ICopIGI7CisgIHJldHVybiByZXQ7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMTYgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDE2ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgdmFsOworICBnaW50MzIgeGZlcjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50MzIgKGNwLCAmdmFsLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICAqdmFsdWUgPSAoZ2ludDE2KSB6aWd6YWdfdG9faTMyICgoZ3VpbnQzMikgdmFsKTsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MzIgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB2YWw7CisgIGdpbnQzMiB4ZmVyOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHhmZXIgPSAwOworCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAoY3AsICZ2YWwsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgICp2YWx1ZSA9IHppZ3phZ190b19pMzIgKChndWludDMyKSB2YWwpOworCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ2NCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDY0IHZhbDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDY0IChjcCwgJnZhbCwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgKnZhbHVlID0gemlnemFnX3RvX2k2NCAoKGd1aW50NjQpIHZhbCk7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9kb3VibGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIHVuaW9uIHsKKyAgICBndWludDY0IGJpdHM7CisgICAgZ3VpbnQ4IGJbOF07CisgIH0gdTsKKworICBnX2Fzc2VydCAoc2l6ZW9mIChnZG91YmxlKSA9PSBzaXplb2YgKGd1aW50NjQpKTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0KKyAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUuYiwgOCwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgdS5iaXRzID0gR1VJTlQ2NF9GUk9NX0xFICh1LmJpdHMpOworICAqdmFsdWUgPSB0aHJpZnRfYml0d2lzZV9jYXN0X2dkb3VibGUgKHUuYml0cyk7CisgIHJldHVybiByZXQ7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKnN0ciwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ2ludDMyIHJlYWRfbGVuOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHhmZXIgPSAwOworICByZWFkX2xlbiA9IDA7CisKKyAgLyogcmVhZCB0aGUgbGVuZ3RoIGludG8gcmVhZF9sZW4gKi8KKyAgaWYgKChyZXQgPQorICAgICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50MzIgKGNwLCAmcmVhZF9sZW4sIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmIChjcC0+c3RyaW5nX2xpbWl0ID4gMCAmJiByZWFkX2xlbiA+IGNwLT5zdHJpbmdfbGltaXQpIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX1NJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgICJnb3Qgc2l6ZSBvdmVyIGxpbWl0ICglZCA+ICVkKSIsIHJlYWRfbGVuLCBjcC0+c3RyaW5nX2xpbWl0KTsKKyAgICAqc3RyID0gTlVMTDsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAocmVhZF9sZW4gPCAwKSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgICAgICAiZ290IG5lZ2F0aXZlIHNpemUgb2YgJWQiLCByZWFkX2xlbik7CisgICAgKnN0ciA9IE5VTEw7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogYWxsb2NhdGUgdGhlIG1lbW9yeSBhcyBhbiBhcnJheSBvZiB1bnNpZ25lZCBjaGFyIGZvciBiaW5hcnkgZGF0YSAqLworICAqc3RyID0gZ19uZXcwIChnY2hhciwgcmVhZF9sZW4gKyAxKTsKKyAgaWYgKHJlYWRfbGVuID4gMCkgeworICAgIGlmICgocmV0ID0KKyAgICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyLCByZWFkX2xlbiwgZXJyb3IpKSA8IDApIHsKKyAgICAgIGdfZnJlZSAoKnN0cik7CisgICAgICAqc3RyID0gTlVMTDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0gZWxzZSB7CisgICAgKipzdHIgPSAwOworICB9CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciAqYnVmLCBndWludDMyICpsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ2ludDMyIHJlYWRfbGVuOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHhmZXIgPSAwOworICByZWFkX2xlbiA9IDA7CisKKyAgLyogcmVhZCB0aGUgbGVuZ3RoIGludG8gcmVhZF9sZW4gKi8KKyAgaWYgKChyZXQgPQorICAgICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50MzIgKGNwLCAmcmVhZF9sZW4sIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmIChjcC0+c3RyaW5nX2xpbWl0ID4gMCAmJiByZWFkX2xlbiA+IGNwLT5zdHJpbmdfbGltaXQpIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX1NJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgICJnb3Qgc2l6ZSBvdmVyIGxpbWl0ICglZCA+ICVkKSIsIHJlYWRfbGVuLCBjcC0+c3RyaW5nX2xpbWl0KTsKKyAgICAqYnVmID0gTlVMTDsKKyAgICAqbGVuID0gMDsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAocmVhZF9sZW4gPiAwKSB7CisgICAgLyogYWxsb2NhdGUgdGhlIG1lbW9yeSBhcyBhbiBhcnJheSBvZiB1bnNpZ25lZCBjaGFyIGZvciBiaW5hcnkgZGF0YSAqLworICAgICpsZW4gPSAoZ3VpbnQzMikgcmVhZF9sZW47CisgICAgKmJ1ZiA9IGdfbmV3IChndWNoYXIsICpsZW4pOworICAgIGlmICgocmV0ID0KKyAgICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmLCAqbGVuLCBlcnJvcikpIDwgMCkgeworICAgICAgZ19mcmVlICgqYnVmKTsKKyAgICAgICpidWYgPSBOVUxMOworICAgICAgKmxlbiA9IDA7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworCisgIH0gZWxzZSBpZiAocmVhZF9sZW4gPT0gMCkgeworICAgICpsZW4gPSAoZ3VpbnQzMikgcmVhZF9sZW47CisgICAgKmJ1ZiA9IE5VTEw7CisKKyAgfSBlbHNlIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICJnb3QgbmVnYXRpdmUgc2l6ZSBvZiAlZCIsIHJlYWRfbGVuKTsKKyAgICAqYnVmID0gTlVMTDsKKyAgICAqbGVuID0gMDsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICByZXR1cm4geGZlcjsKK30KKworLyogcHJvcGVydHkgYWNjZXNzb3IgKi8KK3ZvaWQKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqdGM7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICB0YyA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfU1RSSU5HX0xJTUlUOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdGMtPnN0cmluZ19saW1pdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfQ09OVEFJTkVSX0xJTUlUOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdGMtPmNvbnRhaW5lcl9saW1pdCk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBwcm9wZXJ0eSBtdXRhdG9yICovCit2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnRjOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgdGMgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKSB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX1NUUklOR19MSU1JVDoKKyAgICAgIHRjLT5zdHJpbmdfbGltaXQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9DT05UQUlORVJfTElNSVQ6CisgICAgICB0Yy0+Y29udGFpbmVyX2xpbWl0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBpbml0aWFsaXplIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzX2luaXQgKFRocmlmdENvbXBhY3RQcm90b2NvbENsYXNzICprbGFzcykKK3sKKyAgVGhyaWZ0UHJvdG9jb2xDbGFzcyAqY2xzOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWM7CisKKyAgY2xzID0gVEhSSUZUX1BST1RPQ09MX0NMQVNTIChrbGFzcyk7CisgIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBwYXJhbV9zcGVjID0gTlVMTDsKKworICAvKiBzZXR1cCBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzICovCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfc2V0X3Byb3BlcnR5OworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfaW50ICgic3RyaW5nX2xpbWl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXggYWxsb3dlZCBzdHJpbmcgc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBtYXggc3RyaW5nIGxpbWl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19NQVhJTlQzMiwgLyogbWF4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX1NUUklOR19MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19pbnQgKCJjb250YWluZXJfbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1heCBhbGxvd2VkIGNvbnRhaW5lciBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIG1heCBjb250YWluZXIgbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX01BWElOVDMyLCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfCBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfQ09OVEFJTkVSX0xJTUlULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBjbHMtPndyaXRlX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luOworICBjbHMtPndyaXRlX21lc3NhZ2VfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQ7CisgIGNscy0+d3JpdGVfc3RydWN0X2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luOworICBjbHMtPndyaXRlX3N0cnVjdF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kOworICBjbHMtPndyaXRlX2ZpZWxkX2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW47CisgIGNscy0+d3JpdGVfZmllbGRfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kOworICBjbHMtPndyaXRlX2ZpZWxkX3N0b3AgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wOworICBjbHMtPndyaXRlX21hcF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbjsKKyAgY2xzLT53cml0ZV9tYXBfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZDsKKyAgY2xzLT53cml0ZV9saXN0X2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbjsKKyAgY2xzLT53cml0ZV9saXN0X2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kOworICBjbHMtPndyaXRlX3NldF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbjsKKyAgY2xzLT53cml0ZV9zZXRfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZDsKKyAgY2xzLT53cml0ZV9ib29sID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbDsKKyAgY2xzLT53cml0ZV9ieXRlID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZTsKKyAgY2xzLT53cml0ZV9pMTYgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTY7CisgIGNscy0+d3JpdGVfaTMyID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyOworICBjbHMtPndyaXRlX2k2NCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NDsKKyAgY2xzLT53cml0ZV9kb3VibGUgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9kb3VibGU7CisgIGNscy0+d3JpdGVfc3RyaW5nID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RyaW5nOworICBjbHMtPndyaXRlX2JpbmFyeSA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeTsKKyAgY2xzLT5yZWFkX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW47CisgIGNscy0+cmVhZF9tZXNzYWdlX2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQ7CisgIGNscy0+cmVhZF9zdHJ1Y3RfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbjsKKyAgY2xzLT5yZWFkX3N0cnVjdF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQ7CisgIGNscy0+cmVhZF9maWVsZF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW47CisgIGNscy0+cmVhZF9maWVsZF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZDsKKyAgY2xzLT5yZWFkX21hcF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luOworICBjbHMtPnJlYWRfbWFwX2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWFwX2VuZDsKKyAgY2xzLT5yZWFkX2xpc3RfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW47CisgIGNscy0+cmVhZF9saXN0X2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9lbmQ7CisgIGNscy0+cmVhZF9zZXRfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3NldF9iZWdpbjsKKyAgY2xzLT5yZWFkX3NldF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3NldF9lbmQ7CisgIGNscy0+cmVhZF9ib29sID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sOworICBjbHMtPnJlYWRfYnl0ZSA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZTsKKyAgY2xzLT5yZWFkX2kxNiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2OworICBjbHMtPnJlYWRfaTMyID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMzI7CisgIGNscy0+cmVhZF9pNjQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NDsKKyAgY2xzLT5yZWFkX2RvdWJsZSA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZG91YmxlOworICBjbHMtPnJlYWRfc3RyaW5nID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJpbmc7CisgIGNscy0+cmVhZF9iaW5hcnkgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2luaXQgKFRocmlmdENvbXBhY3RQcm90b2NvbCAqc2VsZikKK3sKKyAgZ19xdWV1ZV9pbml0ICgmKHNlbGYtPl9sYXN0X2ZpZWxkKSk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZmY2FhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuaApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9ICisjZGVmaW5lIF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9ICisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbC5oCisgKiAgXGJyaWVmIENvbXBhY3QgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgcHJvdG9jb2wuICBJbXBsZW1lbnRzIHRoZQorICogICAgICAgICBUaHJpZnRQcm90b2NvbCBpbnRlcmZhY2UuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9DT01QQUNUX1BST1RPQ09MKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLCBcCisgICBUaHJpZnRDb21wYWN0UHJvdG9jb2wpKQorI2RlZmluZSBUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCkpCisjZGVmaW5lIFRIUklGVF9DT01QQUNUX1BST1RPQ09MX0NMQVNTKGMpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsIFwKKyAgIFRocmlmdENvbXBhY3RQcm90b2NvbENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0xfQ0xBU1MoYykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCkpCisjZGVmaW5lIFRIUklGVF9DT01QQUNUX1BST1RPQ09MX0dFVF9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLCBcCisgICBUaHJpZnRDb21wYWN0UHJvdG9jb2xDbGFzcykpCisKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdENvbXBhY3RQcm90b2NvbCBUaHJpZnRDb21wYWN0UHJvdG9jb2w7CisKKy8qIQorICogVGhyaWZ0IENvbXBhY3QgUHJvdG9jb2wgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0Q29tcGFjdFByb3RvY29sCit7CisgIFRocmlmdFByb3RvY29sIHBhcmVudDsKKworICAvKiBwcm90ZWN0ZWQgKi8KKyAgZ2ludDMyIHN0cmluZ19saW1pdDsKKyAgZ2ludDMyIGNvbnRhaW5lcl9saW1pdDsKKworICAvKiBwcml2YXRlICovCisKKyAgLyoqCisgICAqIChXcml0aW5nKSBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZQorICAgKiBzbyBpdCBjYW4gaGF2ZSB0aGUgdmFsdWUgaW5jb3Jwb3JhdGVkLgorICAgKi8KKyAgY29uc3QgZ2NoYXIqIF9ib29sX2ZpZWxkX25hbWU7CisgIFRocmlmdFR5cGUgX2Jvb2xfZmllbGRfdHlwZTsKKyAgZ2ludDE2IF9ib29sX2ZpZWxkX2lkOworCisgIC8qKgorICAgKiAoUmVhZGluZykgSWYgd2UgcmVhZCBhIGZpZWxkIGhlYWRlciwgYW5kIGl0J3MgYSBib29sZWFuIGZpZWxkLCBzYXZlCisgICAqIHRoZSBib29sZWFuIHZhbHVlIGhlcmUgc28gdGhhdCByZWFkX2Jvb2wgY2FuIHVzZSBpdC4KKyAgICovCisgIGdib29sZWFuIF9oYXNfYm9vbF92YWx1ZTsKKyAgZ2Jvb2xlYW4gX2Jvb2xfdmFsdWU7CisKKyAgLyoqCisgICAqIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBmaWVsZCBmb3IgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0cnVjdHMsCisgICAqIHNvIHdlIGNhbiBkbyB0aGUgZGVsdGEgc3R1ZmYuCisgICAqLworCisgIEdRdWV1ZSBfbGFzdF9maWVsZDsKKyAgZ2ludDE2IF9sYXN0X2ZpZWxkX2lkOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdENvbXBhY3RQcm90b2NvbENsYXNzIFRocmlmdENvbXBhY3RQcm90b2NvbENsYXNzOworCisvKiEKKyAqIFRocmlmdCBDb21wYWN0IFByb3RvY29sIGNsYXNzLgorICovCitzdHJ1Y3QgX1RocmlmdENvbXBhY3RQcm90b2NvbENsYXNzCit7CisgIFRocmlmdFByb3RvY29sQ2xhc3MgcGFyZW50OworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MICovCitHVHlwZSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzI1ZTFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5oPgorCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeVByb3BlcnRpZXMKK3sKKyAgICBQUk9QXzAsCisgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX1NUUklOR19MSU1JVCwKKyAgICBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfQ09OVEFJTkVSX0xJTUlUCit9OworCitHX0RFRklORV9UWVBFIChUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5LCB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSkKKworVGhyaWZ0UHJvdG9jb2wgKgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9nZXRfcHJvdG9jb2wgKFRocmlmdFByb3RvY29sRmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeSAqdGNmOworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnRjOworCisgIHRjZiA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlkgKGZhY3RvcnkpOworCisgIHRjID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLAorICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdfbGltaXQiLCB0Y2YtPnN0cmluZ19saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICJjb250YWluZXJfbGltaXQiLCB0Y2YtPmNvbnRhaW5lcl9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0wgKHRjKTsKK30KKworLyogcHJvcGVydHkgYWNjZXNzb3IgKi8KK3ZvaWQKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5ICp0Y2Y7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICB0Y2YgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9TVFJJTkdfTElNSVQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB0Y2YtPnN0cmluZ19saW1pdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9DT05UQUlORVJfTElNSVQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB0Y2YtPmNvbnRhaW5lcl9saW1pdCk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBwcm9wZXJ0eSBtdXRhdG9yICovCit2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHNwZWMpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnkgKnRjZjsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHRjZiA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkgeworICAgIGNhc2UgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX1NUUklOR19MSU1JVDoKKyAgICAgIHRjZi0+c3RyaW5nX2xpbWl0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9DT05UQUlORVJfTElNSVQ6CisgICAgICB0Y2YtPmNvbnRhaW5lcl9saW1pdCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnlfY2xhc3NfaW5pdCAoVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeUNsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtsYXNzKQoreworICBUaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcyAqY2xzOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWM7CisKKyAgY2xzID0gVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfQ0xBU1MgKGtsYXNzKTsKKyAgZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIHBhcmFtX3NwZWMgPSBOVUxMOworCisgIC8qIHNldHVwIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgKi8KKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3Rvcnlfc2V0X3Byb3BlcnR5OworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfaW50ICgic3RyaW5nX2xpbWl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXggYWxsb3dlZCBzdHJpbmcgc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBtYXggc3RyaW5nIGxpbWl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19NQVhJTlQzMiwgLyogbWF4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfU1RSSU5HX0xJTUlULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX2ludCAoImNvbnRhaW5lcl9saW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF4IGFsbG93ZWQgY29udGFpbmVyIHNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgbWF4IGNvbnRhaW5lciBsaW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfTUFYSU5UMzIsIC8qIG1heCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfQ09OVEFJTkVSX0xJTUlULCBwYXJhbV9zcGVjKTsKKworICBjbHMtPmdldF9wcm90b2NvbCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3Byb3RvY29sOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9pbml0IChUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5KQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZmFjdG9yeSk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnkuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZjk1M2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnkuaApAQCAtMCwwICsxLDcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfSAorI2RlZmluZSBfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSBcCisgICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlksIFwKKyAgIFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnkpKQorI2RlZmluZSBUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlkpKQorI2RlZmluZSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0NMQVNTKGMpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSwgXAorICAgVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeUNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9DTEFTUyhjKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlkpKQorI2RlZmluZSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0dFVF9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlksIFwKKyAgIFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnlDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5IFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3Rvcnk7CisKK3N0cnVjdCBfVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeQoreworICBUaHJpZnRQcm90b2NvbEZhY3RvcnkgcGFyZW50OworCisgIC8qIHByb3RlY3RlZCAqLworICBnaW50MzIgc3RyaW5nX2xpbWl0OworICBnaW50MzIgY29udGFpbmVyX2xpbWl0OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnlDbGFzcworICBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5Q2xhc3M7CisKK3N0cnVjdCBfVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeUNsYXNzCit7CisgIFRocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZICovCitHVHlwZSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyN2Y0YTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5jCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmg+CisKKworZW51bQoreworICBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9TRVJWSUNFX05BTUUgPSAxLAorICBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9FTkQKK307CisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCwgdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IpCisKKworc3RhdGljIEdQYXJhbVNwZWMgKnRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9FTkRdID0geyBOVUxMLCB9OworCitnaW50MzIKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sICpwcm90b2NvbCwKKyAgICBjb25zdCBnY2hhciAqbmFtZSwgY29uc3QgVGhyaWZ0TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlLAorICAgIGNvbnN0IGdpbnQzMiBzZXFpZCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdjaGFyICpzZXJ2aWNlX25hbWUgPSBOVUxMOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX01VTFRJUExFWEVEX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sICpzZWxmID0gVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MIChwcm90b2NvbCk7CisgIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2xDbGFzcyAqbXVsdGlwbGV4Q2xhc3MgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfR0VUX0NMQVNTKHNlbGYpOworCisgIGlmKCAobWVzc2FnZV90eXBlID09IFRfQ0FMTCB8fCBtZXNzYWdlX3R5cGUgPT0gVF9PTkVXQVkpICYmIHNlbGYtPnNlcnZpY2VfbmFtZSAhPSBOVUxMKSB7CisgICAgc2VydmljZV9uYW1lID0gZ19zdHJkdXBfcHJpbnRmKCIlcyVzJXMiLCBzZWxmLT5zZXJ2aWNlX25hbWUsIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9ERUZBVUxUX1NFUEFSQVRPUiwgbmFtZSk7CisgIH1lbHNleworICAgIHNlcnZpY2VfbmFtZSA9IGdfc3RyZHVwKG5hbWUpOworICB9CisKKyAgLyogcmVsYXkgdG8gdGhlIHByb3RvY29sX2RlY29yYXRvciAqLworICByZXQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX21lc3NhZ2VfYmVnaW4ocHJvdG9jb2wsIHNlcnZpY2VfbmFtZSwgbWVzc2FnZV90eXBlLCBzZXFpZCwgZXJyb3IpOworCisgIGdfZnJlZShzZXJ2aWNlX25hbWUpOworCisgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9zZXRfcHJvcGVydHkgKEdPYmplY3QgICAgICAqb2JqZWN0LAorICAgIGd1aW50ICAgICAgICAgcHJvcGVydHlfaWQsCisgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICAgKnBzcGVjKQoreworICBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sICpzZWxmID0gVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgY2FzZSBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9TRVJWSUNFX05BTUU6CisgICAgc2VsZi0+c2VydmljZV9uYW1lID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAvKiBXZSBkb24ndCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0eS4uLiAqLworICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICpvYmplY3QsCisgICAgZ3VpbnQgICAgICAgcHJvcGVydHlfaWQsCisgICAgR1ZhbHVlICAgICAqdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0wgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICBjYXNlIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX1NFUlZJQ0VfTkFNRToKKyAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzZWxmLT5zZXJ2aWNlX25hbWUpOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgLyogV2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydHkuLi4gKi8KKyAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICBicmVhazsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfaW5pdCAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCAqcHJvdG9jb2wpCit7CisgIHByb3RvY29sLT5zZXJ2aWNlX25hbWUgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX2ZpbmFsaXplIChHT2JqZWN0ICpnb2JqZWN0KQoreworICBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sICpzZWxmID0gVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MIChnb2JqZWN0KTsKKworICBpZiAoc2VsZi0+c2VydmljZV9uYW1lKSB7CisgICAgZ19mcmVlKHNlbGYtPnNlcnZpY2VfbmFtZSk7CisgICAgc2VsZi0+c2VydmljZV9uYW1lID0gTlVMTDsKKyAgfQorCisgIC8qIEFsd2F5cyBjaGFpbiB1cCB0byB0aGUgcGFyZW50IGNsYXNzOyBhcyB3aXRoIGRpc3Bvc2UoKSwgZmluYWxpemUoKQorICAgKiBpcyBndWFyYW50ZWVkIHRvIGV4aXN0IG9uIHRoZSBwYXJlbnQncyBjbGFzcyB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlCisgICAqLworICBHX09CSkVDVF9DTEFTUyAodGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX3BhcmVudF9jbGFzcyktPmZpbmFsaXplKGdvYmplY3QpOworfQorCisKKy8qIGluaXRpYWxpemUgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX2NsYXNzX2luaXQgKFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2xDbGFzcyAqa2xhc3MpCit7CisgIFRocmlmdFByb3RvY29sQ2xhc3MgKmNscyA9IFRIUklGVF9QUk9UT0NPTF9DTEFTUyAoa2xhc3MpOworICBHT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisKKyAgY2xzLT53cml0ZV9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW47CisKKyAgb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfc2V0X3Byb3BlcnR5OworICBvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9nZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfZmluYWxpemU7CisKKyAgdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX1NFUlZJQ0VfTkFNRV0gPQorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInNlcnZpY2UtbmFtZSIsCisgICAgICAgICAgIlNlcnZpY2UgbmFtZSB0aGUgcHJvdG9jb2wgcG9pbnRzIHRvIiwKKyAgICAgICAgICAiU2V0IHRoZSBzZXJ2aWNlIG5hbWUiLAorICAgICAgICAgIE5VTEwsCisgICAgICAgICAgKEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfCBHX1BBUkFNX1JFQURXUklURSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydGllcyAob2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfRU5ELAorICAgICAgdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZTA4ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0gKKyNkZWZpbmUgX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5oCisgKiAgXGJyaWVmIE11bHRpcGxleGVkIHByb3RvY29sIGltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IHByb3RvY29sLiAgSW1wbGVtZW50cyB0aGUKKyAqICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgaW50ZXJmYWNlLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MICh0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MLCBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sKSkKKyNkZWZpbmUgVEhSSUZUX0lTX01VTFRJUExFWEVEX1BST1RPQ09MKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MLCBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfTVVMVElQTEVYRURfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wsIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2xDbGFzcykpCisKKy8qIGNvbnN0YW50ICovCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9ERUZBVUxUX1NFUEFSQVRPUiAiOiIKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdE11bHRpcGxleGVkUHJvdG9jb2wgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbDsKKworCisKKy8qIQorICogVGhyaWZ0IE11bHRpcGxleGVkIFByb3RvY29sIGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdE11bHRpcGxleGVkUHJvdG9jb2wKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgcGFyZW50OworCisgIGdjaGFyICpzZXJ2aWNlX25hbWU7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbENsYXNzIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2xDbGFzczsKKworLyohCisgKiBUaHJpZnQgTXVsdGlwbGV4ZWQgUHJvdG9jb2wgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbENsYXNzCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yQ2xhc3MgcGFyZW50OworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCAqLworR1R5cGUgdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5NmE4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmMKQEAgLTAsMCArMSw2MjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKKy8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBzdHJpbmcgKi8KKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0VSUk9SX0RPTUFJTiAidGhyaWZ0LXByb3RvY29sLWVycm9yLXF1YXJrIgorCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0UHJvdG9jb2xQcm9wZXJ0aWVzCit7CisgIFBST1BfMCwKKyAgUFJPUF9USFJJRlRfUFJPVE9DT0xfVFJBTlNQT1JUCit9OworCitHX0RFRklORV9BQlNUUkFDVF9UWVBFKFRocmlmdFByb3RvY29sLCB0aHJpZnRfcHJvdG9jb2wsIEdfVFlQRV9PQkpFQ1QpCisKK3ZvaWQKK3RocmlmdF9wcm90b2NvbF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MIChvYmplY3QpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfUFJPVE9DT0xfVFJBTlNQT1JUOgorICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgcHJvdG9jb2wtPnRyYW5zcG9ydCk7CisgICAgICBicmVhazsKKyAgfQorfQorCit2b2lkCit0aHJpZnRfcHJvdG9jb2xfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MIChvYmplY3QpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfUFJPVE9DT0xfVFJBTlNQT1JUOgorICAgICAgcHJvdG9jb2wtPnRyYW5zcG9ydCA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgIH0KK30KKworCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiBzZXFpZCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX21lc3NhZ2VfYmVnaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm90b2NvbCwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX3R5cGUsIHNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX21lc3NhZ2VfZW5kIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQxNiBmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9pZCwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9maWVsZF9zdG9wIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUga2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUsIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX21hcF9lbmQgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2xpc3RfZW5kIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX3NldF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX3NldF9lbmQgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYm9vbGVhbiB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2Jvb2wgKHByb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ4IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9ieXRlIChwcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQxNiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9pMTYgKHByb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfaTMyIChwcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2k2NCAocHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZG91YmxlIHZhbHVlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfZG91YmxlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpzdHIsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9zdHJpbmcgKHByb3RvY29sLCBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9iaW5hcnkgKHByb3RvY29sLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0TWVzc2FnZVR5cGUgKm1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMiAqc2VxaWQsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfc3RydWN0X2VuZCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDE2ICpmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICp2YWx1ZV90eXBlLCBndWludDMyICpzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX21hcF9lbmQgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2xpc3RfZW5kIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX3NldF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9zZXRfZW5kIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnYm9vbGVhbiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9ib29sIChwcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDggKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfYnl0ZSAocHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMTYgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDE2ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfaTE2IChwcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQzMiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2kzMiAocHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50NjQgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9pNjQgKHByb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9kb3VibGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSAqdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2RvdWJsZSAocHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKnN0ciwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfc3RyaW5nIChwcm90b2NvbCwgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBncG9pbnRlciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpsZW4sIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2JpbmFyeSAocHJvdG9jb2wsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9za2lwIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIFRocmlmdFR5cGUgdHlwZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIHN3aXRjaCAodHlwZSkKKyAgeworICAgIGNhc2UgVF9CT09MOgorICAgICAgeworICAgICAgICBnYm9vbGVhbiBib29sdjsKKyAgICAgICAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLCAmYm9vbHYsIGVycm9yKTsKKyAgICAgIH0KKyAgICBjYXNlIFRfQllURToKKyAgICAgIHsKKyAgICAgICAgZ2ludDggYnl0ZXY7CisgICAgICAgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJmJ5dGV2LCBlcnJvcik7CisgICAgICB9CisKKyAgICBjYXNlIFRfSTE2OgorICAgICAgeworICAgICAgICBnaW50MTYgaTE2OworICAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgJmkxNiwgZXJyb3IpOworICAgICAgfQorICAgIGNhc2UgVF9JMzI6CisgICAgICB7CisgICAgICAgIGdpbnQzMiBpMzI7CisgICAgICAgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmaTMyLCBlcnJvcik7CisgICAgICB9CisgICAgY2FzZSBUX0k2NDoKKyAgICAgIHsKKyAgICAgICAgZ2ludDY0IGk2NDsKKyAgICAgICAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZpNjQsIGVycm9yKTsKKyAgICAgIH0KKyAgICBjYXNlIFRfRE9VQkxFOgorICAgICAgeworICAgICAgICBnZG91YmxlIGR1YjsKKyAgICAgICAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsICZkdWIsIGVycm9yKTsKKyAgICAgIH0KKyAgICBjYXNlIFRfU1RSSU5HOgorICAgICAgeworICAgICAgICBncG9pbnRlciBkYXRhOworICAgICAgICBndWludDMyIGxlbjsKKyAgICAgICAgZ2ludDMyIHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZkYXRhLCAmbGVuLCBlcnJvcik7CisgICAgICAgIGdfZnJlZSAoZGF0YSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgICB9CisgICAgY2FzZSBUX1NUUlVDVDoKKyAgICAgIHsKKyAgICAgICAgZ2ludDMyIHJlc3VsdCA9IDA7CisgICAgICAgIGdjaGFyICpuYW1lOworICAgICAgICBnaW50MTYgZmlkOworICAgICAgICBUaHJpZnRUeXBlIGZ0eXBlOworICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgJm5hbWUsIGVycm9yKTsKKworICAgICAgICB3aGlsZSAoMSkKKyAgICAgICAgeworICAgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCAmZnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlkLCBlcnJvcik7CisgICAgICAgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsgIAorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoZnR5cGUgPT0gVF9TVE9QKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBmdHlwZSwgZXJyb3IpOworICAgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBlcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKHByb3RvY29sLCBlcnJvcik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgY2FzZSBUX1NFVDoKKyAgICAgIHsKKyAgICAgICAgZ2ludDMyIHJlc3VsdCA9IDA7CisgICAgICAgIFRocmlmdFR5cGUgZWxlbV90eXBlOworICAgICAgICBndWludDMyIGksIHNpemU7CisgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKHByb3RvY29sLCAmZWxlbV90eXBlLCAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZWxlbV90eXBlLCBlcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9lbmQgKHByb3RvY29sLCBlcnJvcik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgY2FzZSBUX01BUDoKKyAgICAgIHsKKyAgICAgICAgZ2ludDMyIHJlc3VsdCA9IDA7CisgICAgICAgIFRocmlmdFR5cGUgZWxlbV90eXBlOworICAgICAgICBUaHJpZnRUeXBlIGtleV90eXBlOworICAgICAgICBndWludDMyIGksIHNpemU7CisgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLCAma2V5X3R5cGUsICZlbGVtX3R5cGUsICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBrZXlfdHlwZSwgZXJyb3IpOworICAgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGVsZW1fdHlwZSwgZXJyb3IpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfZW5kIChwcm90b2NvbCwgZXJyb3IpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAgIGNhc2UgVF9MSVNUOgorICAgICAgeworICAgICAgICBnaW50MzIgcmVzdWx0ID0gMDsKKyAgICAgICAgVGhyaWZ0VHlwZSBlbGVtX3R5cGU7CisgICAgICAgIGd1aW50MzIgaSwgc2l6ZTsKKyAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbV90eXBlLCAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGVsZW1fdHlwZSwgZXJyb3IpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2VuZCAocHJvdG9jb2wsIGVycm9yKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgIH0KK30KKworLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIGZvciBUaHJpZnQgcHJvdG9jb2xzICovCitHUXVhcmsKK3RocmlmdF9wcm90b2NvbF9lcnJvcl9xdWFyayAodm9pZCkKK3sKKyAgcmV0dXJuIGdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nIChUSFJJRlRfUFJPVE9DT0xfRVJST1JfRE9NQUlOKTsKK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X3Byb3RvY29sX2luaXQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCkKK3sKKyAgcHJvdG9jb2wtPnRyYW5zcG9ydCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfcHJvdG9jb2xfZGlzcG9zZSAoR09iamVjdCAqZ29iamVjdCkKK3sKKyAgVGhyaWZ0UHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0wgKGdvYmplY3QpOworCisgIGdfY2xlYXJfb2JqZWN0KCZzZWxmLT50cmFuc3BvcnQpOworCisgIC8qIEFsd2F5cyBjaGFpbiB1cCB0byB0aGUgcGFyZW50IGNsYXNzOyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGlmCisgICAqIHRoZSBwYXJlbnQgY2xhc3MgaW1wbGVtZW50cyB0aGUgZGlzcG9zZSgpIHZpcnR1YWwgZnVuY3Rpb246IGl0IGlzCisgICAqIGFsd2F5cyBndWFyYW50ZWVkIHRvIGRvIHNvCisgICAqLworICBHX09CSkVDVF9DTEFTUyAodGhyaWZ0X3Byb3RvY29sX3BhcmVudF9jbGFzcyktPmRpc3Bvc2UoZ29iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfcHJvdG9jb2xfY2xhc3NfaW5pdCAoVGhyaWZ0UHJvdG9jb2xDbGFzcyAqY2xzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKKworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfcHJvdG9jb2xfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfcHJvdG9jb2xfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gdGhyaWZ0X3Byb3RvY29sX2Rpc3Bvc2U7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfVEhSSUZUX1BST1RPQ09MX1RSQU5TUE9SVCwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJ0cmFuc3BvcnQiLCAiVHJhbnNwb3J0IiwgIlRocmlmdCBUcmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKSk7CisKKyAgY2xzLT53cml0ZV9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW47CisgIGNscy0+d3JpdGVfbWVzc2FnZV9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQ7CisgIGNscy0+d3JpdGVfc3RydWN0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbjsKKyAgY2xzLT53cml0ZV9zdHJ1Y3RfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQ7CisgIGNscy0+d3JpdGVfZmllbGRfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW47CisgIGNscy0+d3JpdGVfZmllbGRfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZDsKKyAgY2xzLT53cml0ZV9maWVsZF9zdG9wID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3A7CisgIGNscy0+d3JpdGVfbWFwX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbjsKKyAgY2xzLT53cml0ZV9tYXBfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9lbmQ7CisgIGNscy0+d3JpdGVfbGlzdF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luOworICBjbHMtPndyaXRlX2xpc3RfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kOworICBjbHMtPndyaXRlX3NldF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW47CisgIGNscy0+d3JpdGVfc2V0X2VuZCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kOworICBjbHMtPndyaXRlX2Jvb2wgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYm9vbDsKKyAgY2xzLT53cml0ZV9ieXRlID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGU7CisgIGNscy0+d3JpdGVfaTE2ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kxNjsKKyAgY2xzLT53cml0ZV9pMzIgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyOworICBjbHMtPndyaXRlX2k2NCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pNjQ7CisgIGNscy0+d3JpdGVfZG91YmxlID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2RvdWJsZTsKKyAgY2xzLT53cml0ZV9zdHJpbmcgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RyaW5nOworICBjbHMtPndyaXRlX2JpbmFyeSA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnk7CisgIGNscy0+cmVhZF9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbjsKKyAgY2xzLT5yZWFkX21lc3NhZ2VfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQ7CisgIGNscy0+cmVhZF9zdHJ1Y3RfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW47CisgIGNscy0+cmVhZF9zdHJ1Y3RfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZDsKKyAgY2xzLT5yZWFkX2ZpZWxkX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW47CisgIGNscy0+cmVhZF9maWVsZF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQ7CisgIGNscy0+cmVhZF9tYXBfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW47CisgIGNscy0+cmVhZF9tYXBfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2VuZDsKKyAgY2xzLT5yZWFkX2xpc3RfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luOworICBjbHMtPnJlYWRfc2V0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luOworICBjbHMtPnJlYWRfc2V0X2VuZCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9lbmQ7CisgIGNscy0+cmVhZF9ib29sID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYm9vbDsKKyAgY2xzLT5yZWFkX2J5dGUgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlOworICBjbHMtPnJlYWRfaTE2ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTE2OworICBjbHMtPnJlYWRfaTMyID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyOworICBjbHMtPnJlYWRfaTY0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTY0OworICBjbHMtPnJlYWRfZG91YmxlID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZG91YmxlOworICBjbHMtPnJlYWRfc3RyaW5nID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RyaW5nOworICBjbHMtPnJlYWRfYmluYXJ5ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5OworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThmZTVlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmgKQEAgLTAsMCArMSwzNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX0gKKyNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfcHJvdG9jb2wuaAorICogIFxicmllZiBBYnN0cmFjdCBjbGFzcyBmb3IgVGhyaWZ0IHByb3RvY29sIGltcGxlbWVudGF0aW9ucy4KKyAqLworCisvKioKKyAqIEVudW1lcmF0ZWQgZGVmaW5pdGlvbiBvZiB0aGUgdHlwZXMgdGhhdCB0aGUgVGhyaWZ0IHByb3RvY29sIHN1cHBvcnRzLgorICogVGFrZSBzcGVjaWFsIG5vdGUgb2YgdGhlIFRfRU5EIHR5cGUgd2hpY2ggaXMgdXNlZCBzcGVjaWZpY2FsbHkgdG8gbWFyaworICogdGhlIGVuZCBvZiBhIHNlcXVlbmNlIG9mIGZpZWxkcy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgVF9TVE9QICAgPSAwLAorICBUX1ZPSUQgICA9IDEsCisgIFRfQk9PTCAgID0gMiwKKyAgVF9CWVRFICAgPSAzLAorICBUX0kwOCAgICA9IDMsCisgIFRfSTE2ICAgID0gNiwKKyAgVF9JMzIgICAgPSA4LAorICBUX1U2NCAgICA9IDksCisgIFRfSTY0ICAgID0gMTAsCisgIFRfRE9VQkxFID0gNCwKKyAgVF9TVFJJTkcgPSAxMSwKKyAgVF9VVEY3ICAgPSAxMSwKKyAgVF9TVFJVQ1QgPSAxMiwKKyAgVF9NQVAgICAgPSAxMywKKyAgVF9TRVQgICAgPSAxNCwKKyAgVF9MSVNUICAgPSAxNSwKKyAgVF9VVEY4ICAgPSAxNiwKKyAgVF9VVEYxNiAgPSAxNworfSBUaHJpZnRUeXBlOworCisvKioKKyAqIEVudW1lcmF0ZWQgZGVmaW5pdGlvbiBvZiB0aGUgbWVzc2FnZSB0eXBlcyB0aGF0IHRoZSBUaHJpZnQgcHJvdG9jb2wKKyAqIHN1cHBvcnRzLgorICovCit0eXBlZGVmIGVudW0geworICBUX0NBTEwgICAgICA9IDEsCisgIFRfUkVQTFkgICAgID0gMiwKKyAgVF9FWENFUFRJT04gPSAzLAorICBUX09ORVdBWSAgICA9IDQKK30gVGhyaWZ0TWVzc2FnZVR5cGU7CisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1BST1RPQ09MICh0aHJpZnRfcHJvdG9jb2xfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MLCBUaHJpZnRQcm90b2NvbCkpCisjZGVmaW5lIFRIUklGVF9JU19QUk9UT0NPTChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9QUk9UT0NPTCwgVGhyaWZ0UHJvdG9jb2xDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19QUk9UT0NPTF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTCwgVGhyaWZ0UHJvdG9jb2xDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRQcm90b2NvbCBUaHJpZnRQcm90b2NvbDsKKworLyohCisgKiBUaHJpZnQgUHJvdG9jb2wgb2JqZWN0CisgKi8KK3N0cnVjdCBfVGhyaWZ0UHJvdG9jb2wKK3sKKyAgR09iamVjdCBwYXJlbnQ7CisKKyAgLyogcHJvdGVjdGVkICovCisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFByb3RvY29sQ2xhc3MgVGhyaWZ0UHJvdG9jb2xDbGFzczsKKworLyohCisgKiBUaHJpZnQgUHJvdG9jb2wgY2xhc3MKKyAqLworc3RydWN0IF9UaHJpZnRQcm90b2NvbENsYXNzCit7CisgIEdPYmplY3RDbGFzcyBwYXJlbnQ7CisKKyAgZ2ludDMyICgqd3JpdGVfbWVzc2FnZV9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRNZXNzYWdlVHlwZSBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgc2VxaWQsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfbWVzc2FnZV9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfc3RydWN0X2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9zdHJ1Y3RfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX2ZpZWxkX2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDE2IGZpZWxkX2lkLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX2ZpZWxkX2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9maWVsZF9zdG9wKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX21hcF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBrZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfbWFwX2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9saXN0X2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfbGlzdF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfc2V0X2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX3NldF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfYm9vbCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2Jvb2xlYW4gdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX2J5dGUpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ4IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9pMTYpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQxNiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9pMzIpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9pNjQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9kb3VibGUpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdkb3VibGUgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfc3RyaW5nKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnY2hhciAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX2JpbmFyeSkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOworCisgIGdpbnQzMiAoKnJlYWRfbWVzc2FnZV9iZWdpbikgKFRocmlmdFByb3RvY29sICp0aHJpZnRfcHJvdG9jb2wsIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0TWVzc2FnZVR5cGUgKm1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICpzZXFpZCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX21lc3NhZ2VfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfc3RydWN0X2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX3N0cnVjdF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9maWVsZF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZmllbGRfdHlwZSwgZ2ludDE2ICpmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9maWVsZF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9tYXBfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIFRocmlmdFR5cGUgKmtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKnZhbHVlX3R5cGUsIGd1aW50MzIgKnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX21hcF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9saXN0X2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9saXN0X2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX3NldF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9zZXRfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfYm9vbCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2Jvb2xlYW4gKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfYnl0ZSkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDggKnZhbHVlLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfaTE2KSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MTYgKnZhbHVlLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfaTMyKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MzIgKnZhbHVlLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfaTY0KSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50NjQgKnZhbHVlLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfZG91YmxlKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnZG91YmxlICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfc3RyaW5nKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnY2hhciAqKnN0ciwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2JpbmFyeSkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ3BvaW50ZXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpsZW4sIEdFcnJvciAqKmVycm9yKTsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfUFJPVE9DT0wgKi8KK0dUeXBlIHRocmlmdF9wcm90b2NvbF9nZXRfdHlwZSAodm9pZCk7CisKKy8qIHZpcnR1YWwgcHVibGljIG1ldGhvZHMgKi8KK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwgY29uc3QgVGhyaWZ0TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlLAorICAgICAgICAgICBjb25zdCBnaW50MzIgc2VxaWQsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MTYgZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3AgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUga2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYm9vbGVhbiB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDggdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9pMTYgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDE2IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDMyIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9kb3VibGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZG91YmxlIHZhbHVlLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKnN0ciwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnRocmlmdF9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0TWVzc2FnZVR5cGUgKm1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgKnNlcWlkLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQxNiAqZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICprZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKnZhbHVlX3R5cGUsIGd1aW50MzIgKnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2Jvb2xlYW4gKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDggKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MTYgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQzMiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDY0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSAqdmFsdWUsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipzdHIsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgKmJ1ZiwgZ3VpbnQzMiAqbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3NraXAgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgVGhyaWZ0VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKKy8qIGRlZmluZSBlcnJvciB0eXBlcyAqLwordHlwZWRlZiBlbnVtCit7CisgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9VTktOT1dOLAorICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfSU5WQUxJRF9EQVRBLAorICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTkVHQVRJVkVfU0laRSwKKyAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX1NJWkVfTElNSVQsCisgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9CQURfVkVSU0lPTiwKKyAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05PVF9JTVBMRU1FTlRFRCwKKyAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX0RFUFRIX0xJTUlUCit9IFRocmlmdFByb3RvY29sRXJyb3I7CisKKy8qIGRlZmluZSBhbiBlcnJvciBkb21haW4gZm9yIEdFcnJvciB0byB1c2UgKi8KK0dRdWFyayB0aHJpZnRfcHJvdG9jb2xfZXJyb3JfcXVhcmsgKHZvaWQpOworI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfRVJST1IgKHRocmlmdF9wcm90b2NvbF9lcnJvcl9xdWFyayAoKSkKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfUFJPVE9DT0xfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2Y5NDIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmMKQEAgLTAsMCArMSw2MjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmg+CisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IsIHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IsIFRIUklGVF9UWVBFX1BST1RPQ09MKQorCisKK2VudW0KK3sKKyAgUFJPUF9USFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1JfQ09OQ1JFVEVfUFJPVE9DT0wgPSAxLAorICBQUk9QX1RIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUl9FTkQKK307CisKK3N0YXRpYyBHUGFyYW1TcGVjICp0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SX0VORF0gPSB7IE5VTEwsIH07CisKKworCisKKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRNZXNzYWdlVHlwZSBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyIHNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKyAgVGhyaWZ0UHJvdG9jb2xDbGFzcyAqcHJvdG8gPSBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCk7CisKKyAgZ19kZWJ1ZygiQ29uY3JldGUgcHJvdG9jb2wgJXAgfCAlcCIsICh2b2lkICopc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsICh2b2lkICopcHJvdG8pOworCisgIHJldHVybiBwcm90by0+d3JpdGVfbWVzc2FnZV9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX3R5cGUsIHNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX21lc3NhZ2VfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9zdHJ1Y3RfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfc3RydWN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfc3RydWN0X2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQxNiBmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9maWVsZF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfaWQsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2ZpZWxkX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfZmllbGRfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9maWVsZF9zdG9wIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9maWVsZF9zdG9wIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfbWFwX2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlLCB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWFwX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfbWFwX2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9saXN0X2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9saXN0X2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfc2V0X2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX3NldF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Jvb2xlYW4gdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9ib29sIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDggdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2J5dGUgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQxNiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9pMTYgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDMyIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2kzMiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfaTY0IChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZG91YmxlIHZhbHVlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfZG91YmxlIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqc3RyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfc3RyaW5nIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2JpbmFyeSAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0TWVzc2FnZVR5cGUgKm1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMiAqc2VxaWQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX21lc3NhZ2VfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9tZXNzYWdlX2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfc3RydWN0X2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfc3RydWN0X2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICpmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQxNiAqZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfZmllbGRfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfZmllbGRfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICp2YWx1ZV90eXBlLCBndWludDMyICpzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9tYXBfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbWFwX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9tYXBfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2xpc3RfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2xpc3RfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9zZXRfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX3NldF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnYm9vbGVhbiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9ib29sIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ4ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2J5dGUgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MTYgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9pMTYgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQzMiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2kzMiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDY0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfaTY0IChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfZG91YmxlIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKnN0ciwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfc3RyaW5nIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ3BvaW50ZXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9iaW5hcnkgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGVycm9yKTsKK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9zZXRfcHJvcGVydHkgKEdPYmplY3QgICAgICAqb2JqZWN0LAorICAgIGd1aW50ICAgICAgICAgcHJvcGVydHlfaWQsCisgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICAgKnBzcGVjKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICBjYXNlIFBST1BfVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SX0NPTkNSRVRFX1BST1RPQ09MOgorICAgIHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAvKiBXZSBkb24ndCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0eS4uLiAqLworICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX2dldF9wcm9wZXJ0eSAoR09iamVjdCAgICAqb2JqZWN0LAorICAgIGd1aW50ICAgICAgIHByb3BlcnR5X2lkLAorICAgIEdWYWx1ZSAgICAgKnZhbHVlLAorICAgIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICBjYXNlIFBST1BfVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SX0NPTkNSRVRFX1BST1RPQ09MOgorICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIC8qIFdlIGRvbid0IGhhdmUgYW55IG90aGVyIHByb3BlcnR5Li4uICovCisgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgYnJlYWs7CisgIH0KK30KKworCitUaHJpZnRQcm90b2NvbCAqCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX2dldF9jb25jcmV0ZV9wcm90b2NvbChUaHJpZnRQcm90b2NvbERlY29yYXRvciAqcHJvdG9jb2wpCit7CisgIFRocmlmdFByb3RvY29sICpyZXR2YWwgPSBOVUxMOworICBpZighVEhSSUZUX0lTX1BST1RPQ09MX0RFQ09SQVRPUihwcm90b2NvbCkpeworICAgIGdfd2FybmluZygiVGhlIHR5cGUgaXMgbm90IHByb3RvY29sIGRlY29yYXRvciIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUihwcm90b2NvbCk7CisgIGdfZGVidWcoIkdldHRpbmcgY29uY3JldGUgcHJvdG9jb2wgZnJvbSAlcCAtPiAlcCIsICh2b2lkICopc2VsZiwgKHZvaWQgKilzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9pbml0IChUaHJpZnRQcm90b2NvbERlY29yYXRvciAqcHJvdG9jb2wpCit7CisgIHByb3RvY29sLT5jb25jcmV0ZV9wcm90b2NvbCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX2Rpc3Bvc2UgKEdPYmplY3QgKmdvYmplY3QpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAoZ29iamVjdCk7CisKKyAgZ19jbGVhcl9vYmplY3QoJnNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKTsKKworICAvKiBBbHdheXMgY2hhaW4gdXAgdG8gdGhlIHBhcmVudCBjbGFzczsgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBpZgorICAgKiB0aGUgcGFyZW50IGNsYXNzIGltcGxlbWVudHMgdGhlIGRpc3Bvc2UoKSB2aXJ0dWFsIGZ1bmN0aW9uOiBpdCBpcworICAgKiBhbHdheXMgZ3VhcmFudGVlZCB0byBkbyBzbworICAgKi8KKyAgR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcGFyZW50X2NsYXNzKS0+ZGlzcG9zZShnb2JqZWN0KTsKK30KKworLyogaW5pdGlhbGl6ZSB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX2NsYXNzX2luaXQgKFRocmlmdFByb3RvY29sRGVjb3JhdG9yQ2xhc3MgKmtsYXNzKQoreworICBUaHJpZnRQcm90b2NvbENsYXNzICpjbHMgPSBUSFJJRlRfUFJPVE9DT0xfQ0xBU1MgKGtsYXNzKTsKKyAgR09iamVjdENsYXNzICpvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfc2V0X3Byb3BlcnR5OworICBvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfZ2V0X3Byb3BlcnR5OworICBvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX2Rpc3Bvc2U7CisKKyAgdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUl9DT05DUkVURV9QUk9UT0NPTF0gPQorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoInByb3RvY29sIiwKKyAgICAgICAgICAiUHJvdG9jb2wiLAorICAgICAgICAgICJTZXQgdGhlIHByb3RvY29sIHRvIGJlIGltcGxlbWVudGVkIiwgVEhSSUZUX1RZUEVfUFJPVE9DT0wsCisgICAgICAgICAgKEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfCBHX1BBUkFNX1JFQURXUklURSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydGllcyAob2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9USFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1JfRU5ELAorICAgICAgdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9vYmpfcHJvcGVydGllcyk7CisKKyAgZ19kZWJ1ZygiQ3VycmVudCBkZWNvcmF0b3Igd3JpdGVfbWVzc2FnZV9iZWdpbiBhZGRyICVwLCBuZXcgJXAiLCBjbHMtPndyaXRlX21lc3NhZ2VfYmVnaW4sIHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWVzc2FnZV9iZWdpbik7CisKKyAgY2xzLT53cml0ZV9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tZXNzYWdlX2JlZ2luOworICBjbHMtPndyaXRlX21lc3NhZ2VfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tZXNzYWdlX2VuZDsKKyAgY2xzLT53cml0ZV9zdHJ1Y3RfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3N0cnVjdF9iZWdpbjsKKyAgY2xzLT53cml0ZV9zdHJ1Y3RfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9zdHJ1Y3RfZW5kOworICBjbHMtPndyaXRlX2ZpZWxkX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9maWVsZF9iZWdpbjsKKyAgY2xzLT53cml0ZV9maWVsZF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2ZpZWxkX2VuZDsKKyAgY2xzLT53cml0ZV9maWVsZF9zdG9wID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9maWVsZF9zdG9wOworICBjbHMtPndyaXRlX21hcF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWFwX2JlZ2luOworICBjbHMtPndyaXRlX21hcF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX21hcF9lbmQ7CisgIGNscy0+d3JpdGVfbGlzdF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbGlzdF9iZWdpbjsKKyAgY2xzLT53cml0ZV9saXN0X2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbGlzdF9lbmQ7CisgIGNscy0+d3JpdGVfc2V0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9zZXRfYmVnaW47CisgIGNscy0+d3JpdGVfc2V0X2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfc2V0X2VuZDsKKyAgY2xzLT53cml0ZV9ib29sID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9ib29sOworICBjbHMtPndyaXRlX2J5dGUgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2J5dGU7CisgIGNscy0+d3JpdGVfaTE2ID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9pMTY7CisgIGNscy0+d3JpdGVfaTMyID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9pMzI7CisgIGNscy0+d3JpdGVfaTY0ID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9pNjQ7CisgIGNscy0+d3JpdGVfZG91YmxlID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9kb3VibGU7CisgIGNscy0+d3JpdGVfc3RyaW5nID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9zdHJpbmc7CisgIGNscy0+d3JpdGVfYmluYXJ5ID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9iaW5hcnk7CisgIGNscy0+cmVhZF9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX21lc3NhZ2VfYmVnaW47CisgIGNscy0+cmVhZF9tZXNzYWdlX2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9tZXNzYWdlX2VuZDsKKyAgY2xzLT5yZWFkX3N0cnVjdF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9zdHJ1Y3RfYmVnaW47CisgIGNscy0+cmVhZF9zdHJ1Y3RfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3N0cnVjdF9lbmQ7CisgIGNscy0+cmVhZF9maWVsZF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9maWVsZF9iZWdpbjsKKyAgY2xzLT5yZWFkX2ZpZWxkX2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9maWVsZF9lbmQ7CisgIGNscy0+cmVhZF9tYXBfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbWFwX2JlZ2luOworICBjbHMtPnJlYWRfbWFwX2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9tYXBfZW5kOworICBjbHMtPnJlYWRfbGlzdF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9saXN0X2JlZ2luOworICBjbHMtPnJlYWRfbGlzdF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbGlzdF9lbmQ7CisgIGNscy0+cmVhZF9zZXRfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfc2V0X2JlZ2luOworICBjbHMtPnJlYWRfc2V0X2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9zZXRfZW5kOworICBjbHMtPnJlYWRfYm9vbCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9ib29sOworICBjbHMtPnJlYWRfYnl0ZSA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9ieXRlOworICBjbHMtPnJlYWRfaTE2ID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2kxNjsKKyAgY2xzLT5yZWFkX2kzMiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9pMzI7CisgIGNscy0+cmVhZF9pNjQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfaTY0OworICBjbHMtPnJlYWRfZG91YmxlID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2RvdWJsZTsKKyAgY2xzLT5yZWFkX3N0cmluZyA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9zdHJpbmc7CisgIGNscy0+cmVhZF9iaW5hcnkgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfYmluYXJ5OworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2I2YWYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SX0gKKyNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1JfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmgKKyAqICBcYnJpZWYgTXVsdGlwbGV4ZWQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgcHJvdG9jb2wuICBJbXBsZW1lbnRzIHRoZQorICogICAgICAgICBUaHJpZnRQcm90b2NvbCBpbnRlcmZhY2UuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SICh0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SLCBUaHJpZnRQcm90b2NvbERlY29yYXRvcikpCisjZGVmaW5lIFRIUklGVF9JU19QUk9UT0NPTF9ERUNPUkFUT1Iob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IpKQorI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IsIFRocmlmdFByb3RvY29sRGVjb3JhdG9yQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfUFJPVE9DT0xfREVDT1JBVE9SX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IpKQorI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SLCBUaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFByb3RvY29sRGVjb3JhdG9yIFRocmlmdFByb3RvY29sRGVjb3JhdG9yOworCisKKy8qIQorICogVGhyaWZ0IFByb3RvY29sIERlY29yYXRvciBpbnN0YW5jZS4KKyAqLworc3RydWN0IF9UaHJpZnRQcm90b2NvbERlY29yYXRvcgoreworICBUaHJpZnRQcm90b2NvbCBwYXJlbnQ7CisKKyAgVGhyaWZ0UHJvdG9jb2wgKmNvbmNyZXRlX3Byb3RvY29sOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFByb3RvY29sRGVjb3JhdG9yQ2xhc3MgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzczsKKworLyohCisgKiBUaHJpZnQgUHJvdG9jb2wgRGVjb3JhdG9yIGNsYXNzLgorICovCitzdHJ1Y3QgX1RocmlmdFByb3RvY29sRGVjb3JhdG9yQ2xhc3MKK3sKKyAgVGhyaWZ0UHJvdG9jb2xDbGFzcyBwYXJlbnQ7CisKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SICovCitHVHlwZSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWY0MDg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oPgorCitHX0RFRklORV9BQlNUUkFDVF9UWVBFKFRocmlmdFByb3RvY29sRmFjdG9yeSwgdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnksIEdfVFlQRV9PQkpFQ1QpCisKK1RocmlmdFByb3RvY29sICoKK3RocmlmdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm90b2NvbChUaHJpZnRQcm90b2NvbEZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9HRVRfQ0xBU1MgKGZhY3RvcnkpLT5nZXRfcHJvdG9jb2wgKGZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfcHJvdG9jb2xfZmFjdG9yeV9pbml0IChUaHJpZnRQcm90b2NvbEZhY3RvcnkgKmZhY3RvcnkpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChmYWN0b3J5KTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9wcm90b2NvbF9mYWN0b3J5X2NsYXNzX2luaXQgKFRocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzICpjbHMpCit7CisgIGNscy0+Z2V0X3Byb3RvY29sID0gdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3Byb3RvY29sOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMTQ2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9ICisjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9wcm90b2NvbF9mYWN0b3J5LmgKKyAqICBcYnJpZWYgQWJzdHJhY3QgY2xhc3MgZm9yIFRocmlmdCBwcm90b2NvbCBmYWN0b3J5IGltcGxlbWVudGF0aW9ucy4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZICh0aHJpZnRfcHJvdG9jb2xfZmFjdG9yeV9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUlkob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZLCBUaHJpZnRQcm90b2NvbEZhY3RvcnkpKQorI2RlZmluZSBUSFJJRlRfSVNfUFJPVE9DT0xfRkFDVE9SWShvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlkpKQorI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSwgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfUFJPVE9DT0xfRkFDVE9SWV9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSkpCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSwgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvdG9jb2xGYWN0b3J5IFRocmlmdFByb3RvY29sRmFjdG9yeTsKKworLyohCisgKiBUaHJpZnQgUHJvdG9jb2wgRmFjdG9yeSBvYmplY3QKKyAqLworc3RydWN0IF9UaHJpZnRQcm90b2NvbEZhY3RvcnkKK3sKKyAgR09iamVjdCBwYXJlbnQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3M7CisKKy8qIQorICogVGhyaWZ0IFByb3RvY29sIEZhY3RvcnkgY2xhc3MKKyAqLworc3RydWN0IF9UaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcworeworICBHT2JqZWN0Q2xhc3MgcGFyZW50OworCisgIFRocmlmdFByb3RvY29sICooKmdldF9wcm90b2NvbCkgKFRocmlmdFByb3RvY29sRmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpOworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZICovCitHVHlwZSB0aHJpZnRfcHJvdG9jb2xfZmFjdG9yeV9nZXRfdHlwZSAodm9pZCk7CisKKy8qIHZpcnR1YWwgcHVibGljIG1ldGhvZHMgKi8KK1RocmlmdFByb3RvY29sICp0aHJpZnRfcHJvdG9jb2xfZmFjdG9yeV9nZXRfcHJvdG9jb2woVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5LCBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBkNTYwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmMKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuaD4KKworCitlbnVtCit7CisgIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX01FU1NBR0VfTkFNRSA9IDEsCisgIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX01FU1NBR0VfVFlQRSwKKyAgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfU0VRVUVOQ0VfSUQsCisgIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX1RSQU5TUE9SVCwgLyogVE9ETyB1Z2x5IGhhY2sgKi8KKyAgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfRU5ECit9OworCitHX0RFRklORV9UWVBFKFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCwgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IpCisKKworc3RhdGljIEdQYXJhbVNwZWMgKnRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9FTkRdID0geyBOVUxMLCB9OworCitnaW50MzIKK3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKwkJCQkJICAgZ2NoYXIgKipuYW1lLAorCQkJCQkgICBUaHJpZnRNZXNzYWdlVHlwZSAqbWVzc2FnZV90eXBlLAorCQkJCQkgICBnaW50MzIgKnNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldCA9IDA7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIC8qIFdlIHJldHVybiB0aGUgc3RvcmVkIHZhbHVlcyBvbiBjb25zdHJ1Y3Rpb24gKi8KKyAgKm5hbWUgPSBzZWxmLT5uYW1lOworICAqbWVzc2FnZV90eXBlID0gc2VsZi0+bXR5cGU7CisgICpzZXFpZCA9IHNlbGYtPnNlcWlkOworCisgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9zZXRfcHJvcGVydHkgKEdPYmplY3QgICAgICAqb2JqZWN0LAorCQkJCQkgICAgIGd1aW50ICAgICAgICAgcHJvcGVydHlfaWQsCisJCQkJCSAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwKKwkJCQkJICAgICBHUGFyYW1TcGVjICAgKnBzcGVjKQoreworICBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfTUVTU0FHRV9OQU1FOgorICAgICAgc2VsZi0+bmFtZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9NRVNTQUdFX1RZUEU6CisgICAgICBzZWxmLT5tdHlwZSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9TRVFVRU5DRV9JRDoKKyAgICAgIHNlbGYtPnNlcWlkID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAvKiBXZSBkb24ndCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0eS4uLiAqLworICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX2dldF9wcm9wZXJ0eSAoR09iamVjdCAgICAqb2JqZWN0LAorCQkJCQkgICAgIGd1aW50ICAgICAgIHByb3BlcnR5X2lkLAorCQkJCQkgICAgIEdWYWx1ZSAgICAgKnZhbHVlLAorCQkJCQkgICAgIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wgKG9iamVjdCk7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpkZWNvcmF0b3IgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChvYmplY3QpOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydD1OVUxMOworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9NRVNTQUdFX05BTUU6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzZWxmLT5uYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfVFJBTlNQT1JUOgorICAgICAgLyogRklYTUUgU2luY2Ugd2UgZG9uJ3Qgb3ZlcnJpZGUgcHJvcGVydGllcyBpbiB0aGUgZGVjb3JhdG9yIGFzIGl0IHNob3VsZAorICAgICAgICAgd2UganVzdCBvdmVycmlkZSB0aGUgcHJvcGVydGllcyB0aGF0IHdlIGtub3cgYXJlIHVzZWQgKi8KKyAgICAgIGdfb2JqZWN0X2dldChkZWNvcmF0b3ItPmNvbmNyZXRlX3Byb3RvY29sLHBzcGVjLT5uYW1lLCAmdHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIGdfdmFsdWVfc2V0X3BvaW50ZXIgKHZhbHVlLCB0cmFuc3BvcnQpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgLyogV2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydHkuLi4gKi8KKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX2luaXQgKFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCAqcHJvdG9jb2wpCit7CisgIHByb3RvY29sLT5uYW1lID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9maW5hbGl6ZSAoR09iamVjdCAqZ29iamVjdCkKK3sKKyAgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sICpzZWxmID0gVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MIChnb2JqZWN0KTsKKworICBpZiAoc2VsZi0+bmFtZSkgeworICAgICAgZ19mcmVlKHNlbGYtPm5hbWUpOworICAgICAgc2VsZi0+bmFtZSA9IE5VTEw7CisgIH0KKworICAvKiBBbHdheXMgY2hhaW4gdXAgdG8gdGhlIHBhcmVudCBjbGFzczsgYXMgd2l0aCBkaXNwb3NlKCksIGZpbmFsaXplKCkKKyAgICogaXMgZ3VhcmFudGVlZCB0byBleGlzdCBvbiB0aGUgcGFyZW50J3MgY2xhc3MgdmlydHVhbCBmdW5jdGlvbiB0YWJsZQorICAgKi8KKyAgR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZShnb2JqZWN0KTsKK30KKworCisvKiBpbml0aWFsaXplIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9jbGFzc19pbml0IChUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2xDbGFzcyAqa2xhc3MpCit7CisgIFRocmlmdFByb3RvY29sQ2xhc3MgKmNscyA9IFRIUklGVF9QUk9UT0NPTF9DTEFTUyAoa2xhc3MpOworICBHT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisKKyAgY2xzLT5yZWFkX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luOworCisgIG9iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX3NldF9wcm9wZXJ0eTsKKyAgb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfZ2V0X3Byb3BlcnR5OworICBvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX2ZpbmFsaXplOworCisgIHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9NRVNTQUdFX05BTUVdID0KKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJuYW1lIiwKKwkJCSAgICJTZXJ2aWNlIG5hbWUgdGhlIHByb3RvY29sIHBvaW50cyB0byIsCisJCQkgICAiU2V0IHRoZSBzZXJ2aWNlIG5hbWUiLAorCQkJICAgTlVMTCwKKwkJCSAgIChHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKyAgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX01FU1NBR0VfVFlQRV0gPQorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInR5cGUiLAorCQkJIk1lc3NhZ2UgdHlwZSBpbiB0aGUgd2lyZSIsCisJCQkiU2V0IHRoZSBtZXNzYWdlIHR5cGUgaW4gdGhlIHdpcmUiLAorCQkJVF9DQUxMLCBUX09ORVdBWSwKKwkJCVRfQ0FMTCwKKwkJCShHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKyAgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX1NFUVVFTkNFX0lEXSA9CisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgic2VxaWQiLAorCQkJIlNlcXVlbmNlIGlkIHR5cGUgaW4gdGhlIHdpcmUiLAorCQkJIlNldCB0aGUgU2VxdWVuY2UgaWQgaW4gdGhlIHdpcmUiLAorCQkJMCwgR19NQVhJTlQsCisJCQkwLAorCQkJKEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfCBHX1BBUkFNX1JFQURXUklURSkpOworCisgIC8qIFRPRE8gVWdseSBoYWNrLCBpbiB0aGVvcnkgd2UgbXVzdCBvdmVycmlkZSBhbGwgcHJvcGVydGllcyBmcm9tIHVuZGVybGF5aW5nCisgICAgIHByb3RvY29sICovCisgIHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9UUkFOU1BPUlRdID0KKyAgICAgIGdfcGFyYW1fc3BlY19wb2ludGVyICgidHJhbnNwb3J0IiwKKwkJCSJUcmFuc3BvcnQgb24gdGhlIHVuZGVybGF5aW5nIGltcGxlbWVudGF0aW9uIiwKKwkJCSJUcmFuc3BvcnQgb2YgZGVjb3JhdGVkIHByb3RvY29sIiwKKwkJCUdfUEFSQU1fUkVBREFCTEUpOworCisKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnRpZXMgKG9iamVjdF9jbGFzcywKKwkJCQkgICAgIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0VORCwKKwkJCQkgICAgIHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9vYmpfcHJvcGVydGllcyk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODc4MmFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9ICisjZGVmaW5lIF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuaAorICogIFxicmllZiBTdG9yZWRNZXNzYWdlIHByb3RvY29sIGltcGxlbWVudGF0aW9uIG9mIGEgcHJlLXN0b3JlZCBtZXNzYWdlIGhlYWRlcgorICogIG9uIFRocmlmdCBwcm90b2NvbC4gIEltcGxlbWVudHMgdGhlIFRocmlmdFByb3RvY29sIGludGVyZmFjZS4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCAodGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCwgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MLCBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2xDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCwgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sQ2xhc3MpKQorCisvKiBjb25zdGFudCAqLworI2RlZmluZSBUSFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfREVGQVVMVF9TRVBBUkFUT1IgIjoiCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sOworCisKKworLyohCisgKiBUaHJpZnQgU3RvcmVkTWVzc2FnZSBQcm90b2NvbCBpbnN0YW5jZS4KKyAqLworc3RydWN0IF9UaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgcGFyZW50OworCisgIGdjaGFyICpuYW1lOworICBUaHJpZnRNZXNzYWdlVHlwZSBtdHlwZTsKKyAgZ2ludDMyIHNlcWlkOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbENsYXNzIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbENsYXNzOworCisvKiEKKyAqIFRocmlmdCBTdG9yZWRNZXNzYWdlIFByb3RvY29sIGNsYXNzLgorICovCitzdHJ1Y3QgX1RocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbENsYXNzCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yQ2xhc3MgcGFyZW50OworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCAqLworR1R5cGUgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZjkxNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmMKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSAidGhyaWZ0X3NlcnZlci5oIgorCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0U2VydmVyUHJvcGVydGllcworeworICBQUk9QXzAsCisgIFBST1BfVEhSSUZUX1NFUlZFUl9QUk9DRVNTT1IsCisgIFBST1BfVEhSSUZUX1NFUlZFUl9TRVJWRVJfVFJBTlNQT1JULAorICBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfVFJBTlNQT1JUX0ZBQ1RPUlksCisgIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfVFJBTlNQT1JUX0ZBQ1RPUlksCisgIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9QUk9UT0NPTF9GQUNUT1JZLAorICBQUk9QX1RIUklGVF9TRVJWRVJfT1VUUFVUX1BST1RPQ09MX0ZBQ1RPUlkKK307CisKK0dfREVGSU5FX0FCU1RSQUNUX1RZUEUoVGhyaWZ0U2VydmVyLCB0aHJpZnRfc2VydmVyLCBHX1RZUEVfT0JKRUNUKQorCit2b2lkCit0aHJpZnRfc2VydmVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0U2VydmVyICpzZXJ2ZXIgPSBUSFJJRlRfU0VSVkVSIChvYmplY3QpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX1BST0NFU1NPUjoKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlcnZlci0+cHJvY2Vzc29yKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX1NFUlZFUl9UUkFOU1BPUlQ6CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBzZXJ2ZXItPnNlcnZlcl90cmFuc3BvcnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfVFJBTlNQT1JUX0ZBQ1RPUlk6CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBzZXJ2ZXItPmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX09VVFBVVF9UUkFOU1BPUlRfRkFDVE9SWToKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlcnZlci0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX0lOUFVUX1BST1RPQ09MX0ZBQ1RPUlk6CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBzZXJ2ZXItPmlucHV0X3Byb3RvY29sX2ZhY3RvcnkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfT1VUUFVUX1BST1RPQ09MX0ZBQ1RPUlk6CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBzZXJ2ZXItPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5KTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQKK3RocmlmdF9zZXJ2ZXJfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRTZXJ2ZXIgKnNlcnZlciA9IFRIUklGVF9TRVJWRVIgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfUFJPQ0VTU09SOgorICAgICAgc2VydmVyLT5wcm9jZXNzb3IgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX1NFUlZFUl9UUkFOU1BPUlQ6CisgICAgICBzZXJ2ZXItPnNlcnZlcl90cmFuc3BvcnQgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX0lOUFVUX1RSQU5TUE9SVF9GQUNUT1JZOgorICAgICAgc2VydmVyLT5pbnB1dF90cmFuc3BvcnRfZmFjdG9yeSA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfT1VUUFVUX1RSQU5TUE9SVF9GQUNUT1JZOgorICAgICAgc2VydmVyLT5vdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX0lOUFVUX1BST1RPQ09MX0ZBQ1RPUlk6CisgICAgICBzZXJ2ZXItPmlucHV0X3Byb3RvY29sX2ZhY3RvcnkgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX09VVFBVVF9QUk9UT0NPTF9GQUNUT1JZOgorICAgICAgc2VydmVyLT5vdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgIH0KK30KKworZ2Jvb2xlYW4KK3RocmlmdF9zZXJ2ZXJfc2VydmUgKFRocmlmdFNlcnZlciAqc2VydmVyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9TRVJWRVJfR0VUX0NMQVNTIChzZXJ2ZXIpLT5zZXJ2ZSAoc2VydmVyLCBlcnJvcik7Cit9CisKK3ZvaWQKK3RocmlmdF9zZXJ2ZXJfc3RvcCAoVGhyaWZ0U2VydmVyICpzZXJ2ZXIpCit7CisgIFRIUklGVF9TRVJWRVJfR0VUX0NMQVNTIChzZXJ2ZXIpLT5zdG9wIChzZXJ2ZXIpOworfQorCisvKiBpbnN0YW5jZSBpbml0aWFsaXplciBmb3IgVGhyaWZ0IFNlcnZlciAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zZXJ2ZXJfaW5pdCAoVGhyaWZ0U2VydmVyICpzZXJ2ZXIpCit7CisgIHNlcnZlci0+cHJvY2Vzc29yID0gTlVMTDsKKyAgc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0ID0gTlVMTDsKKyAgc2VydmVyLT5pbnB1dF90cmFuc3BvcnRfZmFjdG9yeSA9IE5VTEw7CisgIHNlcnZlci0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5ID0gTlVMTDsKKyAgc2VydmVyLT5pbnB1dF9wcm90b2NvbF9mYWN0b3J5ID0gTlVMTDsKKyAgc2VydmVyLT5vdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX2Rpc3Bvc2UgKEdPYmplY3QgKmdvYmplY3QpCit7CisgIFRocmlmdFNlcnZlciAqc2VsZiA9IFRIUklGVF9TRVJWRVIgKGdvYmplY3QpOworCisgIGdfY2xlYXJfb2JqZWN0KCZzZWxmLT5vdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSk7CisgIGdfY2xlYXJfb2JqZWN0KCZzZWxmLT5pbnB1dF9wcm90b2NvbF9mYWN0b3J5KTsKKyAgZ19jbGVhcl9vYmplY3QoJnNlbGYtPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSk7CisgIGdfY2xlYXJfb2JqZWN0KCZzZWxmLT5pbnB1dF90cmFuc3BvcnRfZmFjdG9yeSk7CisgIGdfY2xlYXJfb2JqZWN0KCZzZWxmLT5zZXJ2ZXJfdHJhbnNwb3J0KTsKKyAgZ19jbGVhcl9vYmplY3QoJnNlbGYtPnByb2Nlc3Nvcik7CisKKyAgLyogQWx3YXlzIGNoYWluIHVwIHRvIHRoZSBwYXJlbnQgY2xhc3M7IHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgaWYKKyAgICogdGhlIHBhcmVudCBjbGFzcyBpbXBsZW1lbnRzIHRoZSBkaXNwb3NlKCkgdmlydHVhbCBmdW5jdGlvbjogaXQgaXMKKyAgICogYWx3YXlzIGd1YXJhbnRlZWQgdG8gZG8gc28KKyAgICovCisgIEdfT0JKRUNUX0NMQVNTICh0aHJpZnRfc2VydmVyX3BhcmVudF9jbGFzcyktPmRpc3Bvc2UoZ29iamVjdCk7Cit9CisKKy8qCisgKiBjbGFzcyBpbml0aWFsaXplciBmb3IgVGhyaWZ0U2VydmVyCisgKiBUT0RPOiBpbXBsZW1lbnQgU2VydmVyRXZlbnRIYW5kbGVyIGFzIGEgR0Nsb3N1cmUKKyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zZXJ2ZXJfY2xhc3NfaW5pdCAoVGhyaWZ0U2VydmVyQ2xhc3MgKmNscykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CisKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NlcnZlcl9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9zZXJ2ZXJfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gdGhyaWZ0X3NlcnZlcl9kaXNwb3NlOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfUFJPQ0VTU09SLAorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoInByb2Nlc3NvciIsICJQcm9jZXNzb3IiLCAiVGhyaWZ0IFByb2Nlc3NvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9QUk9DRVNTT1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfVEhSSUZUX1NFUlZFUl9TRVJWRVJfVFJBTlNQT1JULAorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoInNlcnZlcl90cmFuc3BvcnQiLCAiU2VydmVyIFRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyaWZ0IFNlcnZlciBUcmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSkpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9USFJJRlRfU0VSVkVSX0lOUFVUX1RSQU5TUE9SVF9GQUNUT1JZLAorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoImlucHV0X3RyYW5zcG9ydF9mYWN0b3J5IiwgIklucHV0IFRyYW5zcG9ydCBGYWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQgU2VydmVyIElucHV0IFRyYW5zcG9ydCBGYWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfT1VUUFVUX1RSQU5TUE9SVF9GQUNUT1JZLAorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoIm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3V0cHV0IFRyYW5zcG9ydCBGYWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQgU2VydmVyIE91dHB1dCBUcmFuc3BvcnQgRmFjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSkpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9USFJJRlRfU0VSVkVSX0lOUFVUX1BST1RPQ09MX0ZBQ1RPUlksCisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgiaW5wdXRfcHJvdG9jb2xfZmFjdG9yeSIsICJJbnB1dCBQcm90b2NvbCBGYWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQgU2VydmVyIElucHV0IFByb3RvY29sIEZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSkpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9USFJJRlRfU0VSVkVSX09VVFBVVF9QUk9UT0NPTF9GQUNUT1JZLAorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoIm91dHB1dF9wcm90b2NvbF9mYWN0b3J5IiwgIk91dHB1dCBQcm90b2NvbCBGYWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQgU2VydmVyIE91dHB1dCBQcm90b2NvbCBGYWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpKTsKKworICAvKiBzZXQgdGhlc2UgYXMgdmlydHVhbCBtZXRob2RzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MgKi8KKyAgY2xzLT5zZXJ2ZSA9IHRocmlmdF9zZXJ2ZXJfc2VydmU7CisgIGNscy0+c3RvcCA9IHRocmlmdF9zZXJ2ZXJfc3RvcDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWJlZGRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9ICisjZGVmaW5lIF9USFJJRlRfU0VSVkVSX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9zZXJ2ZXIuaAorICogIFxicmllZiBBYnN0cmFjdCBjbGFzcyBmb3IgVGhyaWZ0IHNlcnZlcnMuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfU0VSVkVSICh0aHJpZnRfc2VydmVyX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfU0VSVkVSKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfU0VSVkVSLCBUaHJpZnRTZXJ2ZXIpKQorI2RlZmluZSBUSFJJRlRfSVNfU0VSVkVSKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfU0VSVkVSKSkKKyNkZWZpbmUgVEhSSUZUX1NFUlZFUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfU0VSVkVSLCBUaHJpZnRTZXJ2ZXJDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19TRVJWRVJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1NFUlZFUikpCisjZGVmaW5lIFRIUklGVF9TRVJWRVJfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVIsIFRocmlmdFNlcnZlckNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNlcnZlciBUaHJpZnRTZXJ2ZXI7CisKKy8qIQorICogVGhyaWZ0IFNlcnZlciBvYmplY3QKKyAqLworc3RydWN0IF9UaHJpZnRTZXJ2ZXIKK3sKKyAgR09iamVjdCBwYXJlbnQ7CisKKyAgLyogcHJvdGVjdGVkICovCisgIFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yOworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnNlcnZlcl90cmFuc3BvcnQ7CisgIFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5OworICBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpvdXRwdXRfdHJhbnNwb3J0X2ZhY3Rvcnk7CisgIFRocmlmdFByb3RvY29sRmFjdG9yeSAqaW5wdXRfcHJvdG9jb2xfZmFjdG9yeTsKKyAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpvdXRwdXRfcHJvdG9jb2xfZmFjdG9yeTsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTZXJ2ZXJDbGFzcyBUaHJpZnRTZXJ2ZXJDbGFzczsKKworLyohCisgKiBUaHJpZnQgU2VydmVyIGNsYXNzCisgKi8KK3N0cnVjdCBfVGhyaWZ0U2VydmVyQ2xhc3MKK3sKKyAgR09iamVjdENsYXNzIHBhcmVudDsKKworICAvKiB2dGFibGUgKi8KKyAgZ2Jvb2xlYW4gKCpzZXJ2ZSkgKFRocmlmdFNlcnZlciAqc2VydmVyLCBHRXJyb3IgKiplcnJvcik7CisgIHZvaWQgKCpzdG9wKSAoVGhyaWZ0U2VydmVyICpzZXJ2ZXIpOworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9TRVJWRVIgKi8KK0dUeXBlIHRocmlmdF9zZXJ2ZXJfZ2V0X3R5cGUgKHZvaWQpOworCisvKiEKKyAqIFByb2Nlc3NlcyB0aGUgcmVxdWVzdC4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFNlcnZlckNsYXNzCisgKi8KK2dib29sZWFuIHRocmlmdF9zZXJ2ZXJfc2VydmUgKFRocmlmdFNlcnZlciAqc2VydmVyLCBHRXJyb3IgKiplcnJvcik7CisKKy8qIQorICogU3RvcCBoYW5kbGluZyByZXF1ZXN0cy4KKyAqLwordm9pZCB0aHJpZnRfc2VydmVyX3N0b3AgKFRocmlmdFNlcnZlciAqc2VydmVyKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfU0VSVkVSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhOTZjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmMKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5Lmg+CisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0U2ltcGxlU2VydmVyLCB0aHJpZnRfc2ltcGxlX3NlcnZlciwgVEhSSUZUX1RZUEVfU0VSVkVSKQorCitnYm9vbGVhbgordGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfc2VydmUgKFRocmlmdFNlcnZlciAqc2VydmVyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICppbnB1dF90cmFuc3BvcnQgPSBOVUxMLCAqb3V0cHV0X3RyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICppbnB1dF9wcm90b2NvbCA9IE5VTEwsICpvdXRwdXRfcHJvdG9jb2wgPSBOVUxMOworICBUaHJpZnRTaW1wbGVTZXJ2ZXIgKnRzcyA9IFRIUklGVF9TSU1QTEVfU0VSVkVSKHNlcnZlcik7CisgIEdFcnJvciAqcHJvY2Vzc19lcnJvciA9IE5VTEw7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19TSU1QTEVfU0VSVkVSIChzZXJ2ZXIpLCBGQUxTRSk7CisKKyAgaWYgKHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAoc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0LCBlcnJvcikpIHsKKyAgICB0c3MtPnJ1bm5pbmcgPSBUUlVFOworICAgIHdoaWxlICh0c3MtPnJ1bm5pbmcgPT0gVFJVRSkKKyAgICB7CisgICAgICB0ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0IChzZXJ2ZXItPnNlcnZlcl90cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgICAgICBpZiAodCAhPSBOVUxMICYmIHRzcy0+cnVubmluZykgeworICAgICAgICBpbnB1dF90cmFuc3BvcnQgPQorICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRkFDVE9SWV9HRVRfQ0xBU1MgKHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkpCisgICAgICAgICAgLT5nZXRfdHJhbnNwb3J0IChzZXJ2ZXItPmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5LCB0KTsKKyAgICAgICAgb3V0cHV0X3RyYW5zcG9ydCA9CisgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZX0dFVF9DTEFTUyAoc2VydmVyLT5vdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkpCisgICAgICAgICAgLT5nZXRfdHJhbnNwb3J0IChzZXJ2ZXItPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSwgdCk7CisgICAgICAgIGlucHV0X3Byb3RvY29sID0KKyAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9HRVRfQ0xBU1MgKHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSkKKyAgICAgICAgICAtPmdldF9wcm90b2NvbCAoc2VydmVyLT5pbnB1dF9wcm90b2NvbF9mYWN0b3J5LCBpbnB1dF90cmFuc3BvcnQpOworICAgICAgICBvdXRwdXRfcHJvdG9jb2wgPQorICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0dFVF9DTEFTUyAoc2VydmVyLT5vdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSkKKyAgICAgICAgICAtPmdldF9wcm90b2NvbCAoc2VydmVyLT5vdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSwgb3V0cHV0X3RyYW5zcG9ydCk7CisKKyAgICAgICAgd2hpbGUgKFRIUklGVF9QUk9DRVNTT1JfR0VUX0NMQVNTIChzZXJ2ZXItPnByb2Nlc3NvcikKKyAgICAgICAgICAgICAgIC0+cHJvY2VzcyAoc2VydmVyLT5wcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9jZXNzX2Vycm9yKSAmJgorICAgICAgICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9wZWVrIChpbnB1dF90cmFuc3BvcnQsICZwcm9jZXNzX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgaWYgKHByb2Nlc3NfZXJyb3IgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGdfbWVzc2FnZSAoInRocmlmdF9zaW1wbGVfc2VydmVyX3NlcnZlOiAlcyIsIHByb2Nlc3NfZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICAgIGdfY2xlYXJfZXJyb3IgKCZwcm9jZXNzX2Vycm9yKTsKKworICAgICAgICAgIC8qIE5vdGUgd2UgZG8gbm90IHByb3BhZ2F0ZSBwcm9jZXNzaW5nIGVycm9ycyB0byB0aGUgY2FsbGVyIGFzIHRoZXkKKyAgICAgICAgICAgKiBub3JtYWxseSBhcmUgdHJhbnNpZW50IGFuZCBub3QgZmF0YWwgdG8gdGhlIHNlcnZlciAqLworICAgICAgICB9CisKKyAgICAgICAgLyogVE9ETzogaGFuZGxlIGV4Y2VwdGlvbnMgKi8KKyAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKGlucHV0X3RyYW5zcG9ydCktPmNsb3NlIChpbnB1dF90cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTIChvdXRwdXRfdHJhbnNwb3J0KS0+Y2xvc2UgKG91dHB1dF90cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgfQorICAgIH0KKworICAgIC8qIGF0dGVtcHQgdG8gc2h1dGRvd24gKi8KKyAgICBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCkKKyAgICAgIC0+Y2xvc2UgKHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCwgTlVMTCk7CisgIH0KKworICAvKiBTaW5jZSB0aGlzIG1ldGhvZCBpcyBkZXNpZ25lZCB0byBydW4gZm9yZXZlciwgaXQgY2FuIG9ubHkgZXZlciByZXR1cm4gb24KKyAgICogZXJyb3IgKi8KKyAgcmV0dXJuIEZBTFNFOworfQorCit2b2lkCit0aHJpZnRfc2ltcGxlX3NlcnZlcl9zdG9wIChUaHJpZnRTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoVEhSSUZUX0lTX1NJTVBMRV9TRVJWRVIgKHNlcnZlcikpOworICAoVEhSSUZUX1NJTVBMRV9TRVJWRVIgKHNlcnZlcikpLT5ydW5uaW5nID0gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc2ltcGxlX3NlcnZlcl9pbml0IChUaHJpZnRTaW1wbGVTZXJ2ZXIgKnRzcykKK3sKKyAgVGhyaWZ0U2VydmVyICpzZXJ2ZXIgPSBUSFJJRlRfU0VSVkVSKHRzcyk7CisKKyAgdHNzLT5ydW5uaW5nID0gRkFMU0U7CisKKyAgaWYgKHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPT0gTlVMTCkKKyAgeworICAgIHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPQorICAgICAgICBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZLCBOVUxMKTsKKyAgfQorICBpZiAoc2VydmVyLT5vdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPT0gTlVMTCkKKyAgeworICAgIHNlcnZlci0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5ID0KKyAgICAgICAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSwgTlVMTCk7CisgIH0KKyAgaWYgKHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSA9PSBOVUxMKQorICB7CisgICAgc2VydmVyLT5pbnB1dF9wcm90b2NvbF9mYWN0b3J5ID0KKyAgICAgICAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSwgTlVMTCk7CisgIH0KKyAgaWYgKHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkgPT0gTlVMTCkKKyAgeworICAgIHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkgPQorICAgICAgICBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZLCBOVUxMKTsKKyAgfQorfQorCisvKiBpbml0aWFsaXplIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zaW1wbGVfc2VydmVyX2NsYXNzX2luaXQgKFRocmlmdFNpbXBsZVNlcnZlckNsYXNzICpjbGFzcykKK3sKKyAgVGhyaWZ0U2VydmVyQ2xhc3MgKmNscyA9IFRIUklGVF9TRVJWRVJfQ0xBU1MoY2xhc3MpOworCisgIGNscy0+c2VydmUgPSB0aHJpZnRfc2ltcGxlX3NlcnZlcl9zZXJ2ZTsKKyAgY2xzLT5zdG9wID0gdGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfc3RvcDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YjUzOGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1NJTVBMRV9TRVJWRVJfSAorI2RlZmluZSBfVEhSSUZUX1NJTVBMRV9TRVJWRVJfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuaAorICogIFxicmllZiBBIHNpbXBsZSBUaHJpZnQgc2VydmVyLCBzaW5nbGUtdGhyZWFkZWQuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUiAodGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9TSU1QTEVfU0VSVkVSKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUiwgVGhyaWZ0U2ltcGxlU2VydmVyKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NJTVBMRV9TRVJWRVIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSKSkKKyNkZWZpbmUgVEhSSUZUX1NJTVBMRV9TRVJWRVJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYykgVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUiwgVGhyaWZ0U2ltcGxlU2VydmVyQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfU0lNUExFX1NFUlZFUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUikpCisjZGVmaW5lIFRIUklGVF9TSU1QTEVfU0VSVkVSX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUiwgVGhyaWZ0U2ltcGxlU2VydmVyQ2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U2ltcGxlU2VydmVyIFRocmlmdFNpbXBsZVNlcnZlcjsKKworLyoqCisgKiBUaHJpZnQgU2ltcGxlIFNlcnZlciBpbnN0YW5jZS4KKyAqLworc3RydWN0IF9UaHJpZnRTaW1wbGVTZXJ2ZXIKK3sKKyAgVGhyaWZ0U2VydmVyIHBhcmVudDsKKworICAvKiBwcml2YXRlICovCisgIHZvbGF0aWxlIGdib29sZWFuIHJ1bm5pbmc7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U2ltcGxlU2VydmVyQ2xhc3MgVGhyaWZ0U2ltcGxlU2VydmVyQ2xhc3M7CisKKy8qKgorICogVGhyaWZ0IFNpbXBsZSBTZXJ2ZXIgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0U2ltcGxlU2VydmVyQ2xhc3MKK3sKKyAgVGhyaWZ0U2VydmVyQ2xhc3MgcGFyZW50OworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSICovCitHVHlwZSB0aHJpZnRfc2ltcGxlX3NlcnZlcl9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX1NJTVBMRV9TRVJWRVJfSCAqLworCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGU4NjlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuYwpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKworLyoqCisgKiBHSGFzaFRhYmxlIGNhbGxiYWNrIHRvIGFkZCBrZXlzIHRvIGEgR0xpc3QuCisgKi8KK3ZvaWQKK3RocmlmdF9oYXNoX3RhYmxlX2dldF9rZXlzIChncG9pbnRlciBrZXksIGdwb2ludGVyIHZhbHVlLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdMaXN0ICoqbGlzdCA9IChHTGlzdCAqKikgdXNlcl9kYXRhOworCisgIFRIUklGVF9VTlVTRURfVkFSICh2YWx1ZSk7CisKKyAgKmxpc3QgPSBnX2xpc3RfYXBwZW5kICgqbGlzdCwga2V5KTsKK30KK3ZvaWQgdGhyaWZ0X3NhZmVfaGFzaF90YWJsZV9kZXN0cm95KEdIYXNoVGFibGUqIGhhc2hfdGFibGUpCit7CisgIGlmIChoYXNoX3RhYmxlKQorICB7CisgICAgZ19oYXNoX3RhYmxlX2Rlc3Ryb3koaGFzaF90YWJsZSk7CisgIH0KK30KKworZ3VpbnQgdGhyaWZ0X2Jvb2xlYW5faGFzaChnY29uc3Rwb2ludGVyIHYpCit7CisgIGNvbnN0IGdib29sZWFuKiBwID0gdjsKKyAgcmV0dXJuIHAgJiYgKnAgPyAxIDogMDsKK30KK2dib29sZWFuIHRocmlmdF9ib29sZWFuX2VxdWFsKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKQoreworICBpZiAoYSA9PSBiKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCFhIHx8ICFiKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGNvbnN0IGdib29sZWFuKiBwYSA9IGE7CisgIGNvbnN0IGdib29sZWFuKiBwYiA9IGI7CisgIHJldHVybiAqcGEgPT0gKnBiOworfQorCitndWludCB0aHJpZnRfaW50OF9oYXNoKGdjb25zdHBvaW50ZXIgdikKK3sKKyAgY29uc3QgZ2ludDgqIHAgPSB2OworICByZXR1cm4gcCA/ICpwIDogMDsKK30KK2dib29sZWFuIHRocmlmdF9pbnQ4X2VxdWFsKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKQoreworICBpZiAoYSA9PSBiKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCFhIHx8ICFiKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGNvbnN0IGdpbnQ4KiBwYSA9IGE7CisgIGNvbnN0IGdpbnQ4KiBwYiA9IGI7CisgIHJldHVybiAqcGEgPT0gKnBiOworfQorCitndWludCB0aHJpZnRfaW50MTZfaGFzaChnY29uc3Rwb2ludGVyIHYpCit7CisgIGNvbnN0IGdpbnQxNiogcCA9IHY7CisgIHJldHVybiBwID8gKnAgOiAwOworfQorZ2Jvb2xlYW4gdGhyaWZ0X2ludDE2X2VxdWFsKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKQoreworICBpZiAoYSA9PSBiKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCFhIHx8ICFiKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGNvbnN0IGdpbnQxNiogcGEgPSBhOworICBjb25zdCBnaW50MTYqIHBiID0gYjsKKyAgcmV0dXJuICpwYSA9PSAqcGI7Cit9CisKK3ZvaWQKK3RocmlmdF9zdHJpbmdfZnJlZSAoZ3BvaW50ZXIgc3RyKQoreworCUdCeXRlQXJyYXkqIHB0ciA9IHN0cjsKKwlnX2J5dGVfYXJyYXlfdW5yZWYocHRyKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YTY0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0gKKyNkZWZpbmUgX1RIUklGVF9ICisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdsaWIuaD4KKworLyogdGhpcyBtYWNybyBpcyBjYWxsZWQgdG8gc2F0aXNmeSAtV2FsbCBoYXJkY29yZSBjb21waWxhdGlvbiAqLworI2lmbmRlZiBUSFJJRlRfVU5VU0VEX1ZBUgorIyBkZWZpbmUgVEhSSUZUX1VOVVNFRF9WQVIoeCkgKCh2b2lkKSB4KQorI2VuZGlmCisKK3ZvaWQgdGhyaWZ0X2hhc2hfdGFibGVfZ2V0X2tleXMgKGdwb2ludGVyIGtleSwgZ3BvaW50ZXIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciB1c2VyX2RhdGEpOwordm9pZCB0aHJpZnRfc2FmZV9oYXNoX3RhYmxlX2Rlc3Ryb3koR0hhc2hUYWJsZSogaGFzaF90YWJsZSk7CisKK2d1aW50IHRocmlmdF9ib29sZWFuX2hhc2goZ2NvbnN0cG9pbnRlciB2KTsKK2dib29sZWFuIHRocmlmdF9ib29sZWFuX2VxdWFsKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKTsKKworZ3VpbnQgdGhyaWZ0X2ludDhfaGFzaChnY29uc3Rwb2ludGVyIHYpOworZ2Jvb2xlYW4gdGhyaWZ0X2ludDhfZXF1YWwoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGIpOworCitndWludCB0aHJpZnRfaW50MTZfaGFzaChnY29uc3Rwb2ludGVyIHYpOworZ2Jvb2xlYW4gdGhyaWZ0X2ludDE2X2VxdWFsKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKTsKKwordm9pZCB0aHJpZnRfc3RyaW5nX2ZyZWUgKGdwb2ludGVyIHN0cik7CisKKyNlbmRpZiAvKiAjaWZuZGVmIF9USFJJRlRfVEhSSUZUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIzNGNhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5jCkBAIC0wLDAgKzEsMjc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJ0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmgiCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uUHJvcGVydGllcworeworICBQUk9QXzAsCisgIFBST1BfVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9UWVBFLAorICBQUk9QX1RIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fTUVTU0FHRQorfTsKKworR19ERUZJTkVfVFlQRShUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbiwgVEhSSUZUX1RZUEVfU1RSVUNUKQorCitnaW50MzIKK3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fcmVhZCAoVGhyaWZ0U3RydWN0ICpvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyID0gMDsKKyAgZ2NoYXIgKm5hbWU7CisgIFRocmlmdFR5cGUgZnR5cGU7CisgIGdpbnQxNiBmaWQ7CisgIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp0aGlzID0gVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiAob2JqZWN0KTsKKworICAvKiByZWFkIHRoZSBzdHJ1Y3QgYmVnaW4gbWFya2VyICovCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgJm5hbWUsIGVycm9yKSkgPCAwKQorICB7CisgICAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworICBpZiAobmFtZSkgZ19mcmVlIChuYW1lKTsKKworICB3aGlsZSAoMSkKKyAgeworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmbmFtZSwgJmZ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWQsIGVycm9yKSkgPCAwKQorICAgIHsKKyAgICAgIGlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgICBpZiAobmFtZSkgZ19mcmVlIChuYW1lKTsKKworICAgIC8qIGJyZWFrIGlmIHdlIGdldCBhIFNUT1AgZmllbGQgKi8KKyAgICBpZiAoZnR5cGUgPT0gVF9TVE9QKQorICAgIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAoZmlkKQorICAgIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgaWYgKGZ0eXBlID09IFRfU1RSSU5HKQorICAgICAgICB7CisgICAgICAgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmdGhpcy0+bWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgeGZlciArPSByZXQ7CisgICAgICAgICAgdGhpcy0+X19pc3NldF9tZXNzYWdlID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZnR5cGUsIGVycm9yKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIHhmZXIgKz0gcmV0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBpZiAoZnR5cGUgPT0gVF9JMzIpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ0aGlzLT50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB4ZmVyICs9IHJldDsKKyAgICAgICAgICB0aGlzLT5fX2lzc2V0X3R5cGUgPSBUUlVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBmdHlwZSwgZXJyb3IpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgeGZlciArPSByZXQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZnR5cGUsIGVycm9yKSkgPCAwKQorICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgeGZlciArPSByZXQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKQorICAgICAgcmV0dXJuIC0xOworICAgIHhmZXIgKz0gcmV0OworICB9CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApCisgICAgcmV0dXJuIC0xOworICB4ZmVyICs9IHJldDsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX3dyaXRlIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyID0gMDsKKworICBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqdGhpcyA9IFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT04gKG9iamVjdCk7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIHhmZXIgKz0gcmV0OworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJtZXNzYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfU1RSSU5HLCAxLCBlcnJvcikpIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIHhmZXIgKz0gcmV0OworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLCB0aGlzLT5tZXNzYWdlLCBlcnJvcikpIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIHhmZXIgKz0gcmV0OworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIHhmZXIgKz0gcmV0OworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfSTMyLCAyLCBlcnJvcikpIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIHhmZXIgKz0gcmV0OworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCB0aGlzLT50eXBlLCBlcnJvcikpIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIHhmZXIgKz0gcmV0OworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIHhmZXIgKz0gcmV0OworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChwcm90b2NvbCwgZXJyb3IpKSA8IDApCisgICAgcmV0dXJuIC0xOworICB4ZmVyICs9IHJldDsKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKQorICAgIHJldHVybiAtMTsKKyAgeGZlciArPSByZXQ7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKKworLyogR0Vycm9yIGRvbWFpbiAqLworI2RlZmluZSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0RPTUFJTiAidGhyaWZ0LWFwcGxpY2F0aW9uLWV4Y2VwdGlvbi1lcnJvci1xdWFyayIKKworR1F1YXJrCit0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2Vycm9yX3F1YXJrICh2b2lkKQoreworICByZXR1cm4gZ19xdWFya19mcm9tX3N0YXRpY19zdHJpbmcgKFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfRE9NQUlOKTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnRhZSA9IFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT04gKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX1RZUEU6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB0YWUtPnR5cGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fTUVTU0FHRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHRhZS0+bWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqdGFlID0gVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fVFlQRToKKyAgICAgIHRhZS0+dHlwZSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgdGFlLT5fX2lzc2V0X3R5cGUgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fTUVTU0FHRToKKyAgICAgIGlmICh0YWUtPm1lc3NhZ2UgIT0gTlVMTCkKKyAgICAgICAgZ19mcmVlICh0YWUtPm1lc3NhZ2UpOworCisgICAgICB0YWUtPm1lc3NhZ2UgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIHRhZS0+X19pc3NldF9tZXNzYWdlID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQKK3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25faW5pdCAoVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKm9iamVjdCkKK3sKKyAgb2JqZWN0LT50eXBlID0gMDsKKyAgb2JqZWN0LT5fX2lzc2V0X3R5cGUgPSBGQUxTRTsKKyAgb2JqZWN0LT5tZXNzYWdlID0gTlVMTDsKKyAgb2JqZWN0LT5fX2lzc2V0X21lc3NhZ2UgPSBGQUxTRTsKK30KKwordm9pZAordGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQoreworICBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqdGFlID0gVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiAob2JqZWN0KTsKKworICBpZiAodGFlLT5fX2lzc2V0X21lc3NhZ2UpIHsKKwkJZ19mcmVlKHRhZS0+bWVzc2FnZSk7CisgIH0KK30KKwordm9pZAordGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9jbGFzc19pbml0IChUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbkNsYXNzICpjbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MoY2xhc3MpOworICBUaHJpZnRTdHJ1Y3RDbGFzcyAqY2xzID0gVEhSSUZUX1NUUlVDVF9DTEFTUyhjbGFzcyk7CisgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWM7CisKKyAgY2xzLT5yZWFkID0gdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9yZWFkOworICBjbHMtPndyaXRlID0gdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl93cml0ZTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fZmluYWxpemU7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX3NldF9wcm9wZXJ0eTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX2ludCAoInR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiB0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgdHlwZSBvZiB0aGUgZXhjZXB0aW9uLCBvbmUgb2YgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZXMgZGVmaW5lZCBieSB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uRXJyb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVudW1lcmF0aW9uLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9OIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3N0cmluZyAoIm1lc3NhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiBtZXNzYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBIHN0cmluZyBkZXNjcmliaW5nIHRoZSBleGNlcHRpb24gdGhhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2NjdXJyZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9NRVNTQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzZjc5MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9ICisjZGVmaW5lIF9USFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisjaW5jbHVkZSAidGhyaWZ0X3N0cnVjdC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmgKKyAqICBcYnJpZWYgQyBJbXBsZW1lbnRhdGlvbiBvZiBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04gKHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT04ob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uKSkKKyNkZWZpbmUgVEhSSUZUX0lTX0FQUExJQ0FUSU9OX0VYQ0VQVElPTihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTikpCisjZGVmaW5lIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb25DbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19BUFBMSUNBVElPTl9FWENFUFRJT05fQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTikpCisjZGVmaW5lIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uQ2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb247CisKK3N0cnVjdCBfVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24KK3sKKyAgVGhyaWZ0U3RydWN0IHBhcmVudDsKKworICAvKiBwcml2YXRlICovCisgIGdpbnQzMiB0eXBlOworICBnYm9vbGVhbiBfX2lzc2V0X3R5cGU7CisgIGdjaGFyICptZXNzYWdlOworICBnYm9vbGVhbiBfX2lzc2V0X21lc3NhZ2U7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb25DbGFzcyBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbkNsYXNzOworCitzdHJ1Y3QgX1RocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uQ2xhc3MKK3sKKyAgVGhyaWZ0U3RydWN0Q2xhc3MgcGFyZW50OworfTsKKworR1R5cGUgdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9nZXRfdHlwZSAodm9pZCk7CisKKy8qIGdlcnJvciBjb2RlcyAqLwordHlwZWRlZiBlbnVtCit7CisgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTiwKKyAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9VTktOT1dOX01FVEhPRCwKKyAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9JTlZBTElEX01FU1NBR0VfVFlQRSwKKyAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9XUk9OR19NRVRIT0RfTkFNRSwKKyAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9CQURfU0VRVUVOQ0VfSUQsCisgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfTUlTU0lOR19SRVNVTFQsCisgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfSU5URVJOQUxfRVJST1IsCisgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfUFJPVE9DT0xfRVJST1IsCisgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfSU5WQUxJRF9UUkFOU0ZPUk0sCisgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfSU5WQUxJRF9QUk9UT0NPTCwKKyAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9VTlNVUFBPUlRFRF9DTElFTlRfVFlQRSwKKworICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX04KK30gVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb25FcnJvcjsKKworLyogZGVmaW5lIGVycm9yIGRvbWFpbiBmb3IgR0Vycm9yICovCitHUXVhcmsgdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9lcnJvcl9xdWFyayAodm9pZCk7CisjZGVmaW5lIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1IgKHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fZXJyb3JfcXVhcmsgKCkpCisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9zdHJ1Y3QuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNGYyYTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9zdHJ1Y3QuYwpAQCAtMCwwICsxLDUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgInRocmlmdF9zdHJ1Y3QuaCIKKworR19ERUZJTkVfQUJTVFJBQ1RfVFlQRShUaHJpZnRTdHJ1Y3QsIHRocmlmdF9zdHJ1Y3QsIEdfVFlQRV9PQkpFQ1QpCisKK2dpbnQzMgordGhyaWZ0X3N0cnVjdF9yZWFkIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19TVFJVQ1QgKG9iamVjdCksIC0xKTsKKyAgcmV0dXJuIFRIUklGVF9TVFJVQ1RfR0VUX0NMQVNTIChvYmplY3QpLT5yZWFkIChvYmplY3QsIHByb3RvY29sLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3N0cnVjdF93cml0ZSAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX1NUUlVDVCAob2JqZWN0KSwgLTEpOworICByZXR1cm4gVEhSSUZUX1NUUlVDVF9HRVRfQ0xBU1MgKG9iamVjdCktPndyaXRlIChvYmplY3QsIHByb3RvY29sLCBlcnJvcik7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc3RydWN0X2NsYXNzX2luaXQgKFRocmlmdFN0cnVjdENsYXNzICpjbHMpCit7CisgIGNscy0+cmVhZCA9IHRocmlmdF9zdHJ1Y3RfcmVhZDsKKyAgY2xzLT53cml0ZSA9IHRocmlmdF9zdHJ1Y3Rfd3JpdGU7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc3RydWN0X2luaXQgKFRocmlmdFN0cnVjdCAqc3RydWN0dXJlKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoc3RydWN0dXJlKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjZmNiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfU1RSVUNUX0gKKyNkZWZpbmUgVEhSSUZUX1NUUlVDVF9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIFRIUklGVF9UWVBFX1NUUlVDVCAodGhyaWZ0X3N0cnVjdF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1NUUlVDVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1NUUlVDVCwgVGhyaWZ0U3RydWN0KSkKKyNkZWZpbmUgVEhSSUZUX1NUUlVDVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfU1RSVUNULCBUaHJpZnRTdHJ1Y3RDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19TVFJVQ1Qob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9TVFJVQ1QpKQorI2RlZmluZSBUSFJJRlRfSVNfU1RSVUNUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TVFJVQ1QpKQorI2RlZmluZSBUSFJJRlRfU1RSVUNUX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfU1RSVUNULCBUaHJpZnRTdHJ1Y3RDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTdHJ1Y3QgVGhyaWZ0U3RydWN0OworCisvKiBzdHJ1Y3QgKi8KK3N0cnVjdCBfVGhyaWZ0U3RydWN0Cit7CisgIEdPYmplY3QgcGFyZW50OworCisgIC8qIHByaXZhdGUgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTdHJ1Y3RDbGFzcyBUaHJpZnRTdHJ1Y3RDbGFzczsKKworc3RydWN0IF9UaHJpZnRTdHJ1Y3RDbGFzcworeworICBHT2JqZWN0Q2xhc3MgcGFyZW50OworCisgIC8qIHB1YmxpYyAqLworICBnaW50MzIgKCpyZWFkKSAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGUpIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKK307CisKK0dUeXBlIHRocmlmdF9zdHJ1Y3RfZ2V0X3R5cGUgKHZvaWQpOworCitnaW50MzIgdGhyaWZ0X3N0cnVjdF9yZWFkIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3N0cnVjdF93cml0ZSAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CitHX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWIzZTkzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jCkBAIC0wLDAgKzEsMzkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Lmg+CisKKy8qIG9iamVjdCBwcm9wZXJ0aWVzICovCitlbnVtIF9UaHJpZnRCdWZmZXJlZFRyYW5zcG9ydFByb3BlcnRpZXMKK3sKKyAgUFJPUF8wLAorICBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfVFJBTlNQT1JULAorICBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfUkVBRF9CVUZGRVJfU0laRSwKKyAgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1dSSVRFX0JVRkZFUl9TSVpFCit9OworCitHX0RFRklORV9UWVBFKFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0LCB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQpCisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9pc19vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPmlzX29wZW4gKHQtPnRyYW5zcG9ydCk7Cit9CisKKy8qIG92ZXJyaWRlcyB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKi8KK2dib29sZWFuCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3BlZWsgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICByZXR1cm4gKHQtPnJfYnVmLT5sZW4gPiAwKSB8fCB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKHQtPnRyYW5zcG9ydCwgZXJyb3IpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+b3BlbiAodC0+dHJhbnNwb3J0LCBlcnJvcik7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPmNsb3NlICh0LT50cmFuc3BvcnQsIGVycm9yKTsKK30KKworLyogdGhlIGFjdHVhbCByZWFkIGlzICJzbG93IiBiZWNhdXNlIGl0IGNhbGxzIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCAqLworZ2ludDMyCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWRfc2xvdyAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgZ2ludCByZXQgPSAwOworICBndWludDMyIHdhbnQgPSBsZW47CisgIGd1aW50MzIgZ290ID0gMDsKKyAgZ3VjaGFyICp0bXBkYXRhID0gZ19hbGxvY2EgKGxlbik7CisgIGd1aW50MzIgaGF2ZSA9IHQtPnJfYnVmLT5sZW47CisKKyAgLyogd2Ugc2hvdWxkbid0IGhpdCB0aGlzIHVubGVzcyB0aGUgYnVmZmVyIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggdG8gcmVhZCAqLworICBnX2Fzc2VydCAodC0+cl9idWYtPmxlbiA8IHdhbnQpOworCisgIC8qIGZpcnN0IGNvcHkgd2hhdCB3ZSBoYXZlIGluIG91ciBidWZmZXIuICovCisgIGlmIChoYXZlID4gMCkKKyAgeworICAgIG1lbWNweSAoYnVmLCB0LT5yX2J1ZiwgdC0+cl9idWYtPmxlbik7CisgICAgd2FudCAtPSB0LT5yX2J1Zi0+bGVuOworICAgIHQtPnJfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+cl9idWYsIDAsIHQtPnJfYnVmLT5sZW4pOworICB9CisKKyAgLyogaWYgdGhlIGJ1ZmZlciBpcyBzdGlsbCBzbWFsbGVyIHRoYW4gd2hhdCB3ZSB3YW50IHRvIHJlYWQsIHRoZW4ganVzdAorICAgKiByZWFkIGl0IGRpcmVjdGx5LiAgb3RoZXJ3aXNlLCBmaWxsIHRoZSBidWZmZXIgYW5kIHRoZW4gZ2l2ZSBvdXQKKyAgICogZW5vdWdoIHRvIHNhdGlzZnkgdGhlIHJlYWQuICovCisgIGlmICh0LT5yX2J1Zl9zaXplIDwgd2FudCkKKyAgeworICAgIGlmICgocmV0ID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPnJlYWQgKHQtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGdvdCArPSByZXQ7CisKKyAgICAvKiBjb3B5IHRoZSBkYXRhIHN0YXJ0aW5nIGZyb20gd2hlcmUgd2UgbGVmdCBvZmYgKi8KKyAgICBtZW1jcHkgKChndWludDggKilidWYgKyBoYXZlLCB0bXBkYXRhLCBnb3QpOworICAgIHJldHVybiBnb3QgKyBoYXZlOyAKKyAgfSBlbHNlIHsKKyAgICBndWludDMyIGdpdmU7CisKKyAgICBpZiAoKHJldCA9IFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5yZWFkICh0LT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBnb3QgKz0gcmV0OworICAgIHQtPnJfYnVmID0gZ19ieXRlX2FycmF5X2FwcGVuZCAodC0+cl9idWYsIHRtcGRhdGEsIGdvdCk7CisgICAgCisgICAgLyogaGFuZCBvdmVyIHdoYXQgd2UgaGF2ZSB1cCB0byB3aGF0IHRoZSBjYWxsZXIgd2FudHMgKi8KKyAgICBnaXZlID0gd2FudCA8IHQtPnJfYnVmLT5sZW4gPyB3YW50IDogdC0+cl9idWYtPmxlbjsKKworCisgICAgbWVtY3B5ICgoZ3VpbnQ4ICopYnVmICsgbGVuIC0gd2FudCwgdC0+cl9idWYtPmRhdGEsIGdpdmUpOworICAgIHQtPnJfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+cl9idWYsIDAsIGdpdmUpOworICAgIHdhbnQgLT0gZ2l2ZTsKKworICAgIHJldHVybiAobGVuIC0gd2FudCk7CisgIH0KK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKi8KK2dpbnQzMgordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9yZWFkIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKworICAvKiBpZiB3ZSBoYXZlIGVub3VnaCBidWZmZXIgZGF0YSB0byBmdWxmaWxsIHRoZSByZWFkLCBqdXN0IHVzZQorICAgKiBhIG1lbWNweSAqLworICBpZiAobGVuIDw9IHQtPnJfYnVmLT5sZW4pCisgIHsKKyAgICBtZW1jcHkgKGJ1ZiwgdC0+cl9idWYtPmRhdGEsIGxlbik7CisgICAgZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+cl9idWYsIDAsIGxlbik7CisgICAgcmV0dXJuIGxlbjsKKyAgfQorCisgIHJldHVybiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWRfc2xvdyAodHJhbnNwb3J0LCBidWYsIGxlbiwgZXJyb3IpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQKKyAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlX3Nsb3cgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICBndWludDMyIGhhdmVfYnl0ZXMgPSB0LT53X2J1Zi0+bGVuOworICBndWludDMyIHNwYWNlID0gdC0+d19idWZfc2l6ZSAtIHQtPndfYnVmLT5sZW47CisKKyAgLyogd2UgbmVlZCB0d28gc3lzY2FsbHMgYmVjYXVzZSB0aGUgYnVmZmVyZWQgZGF0YSBwbHVzIHRoZSBidWZmZXIgaXRzZWxmCisgICAqIGlzIHRvbyBiaWcuICovCisgIGlmICgoaGF2ZV9ieXRlcyArIGxlbiA+PSAyKnQtPndfYnVmX3NpemUpIHx8IChoYXZlX2J5dGVzID09IDApKQorICB7CisgICAgaWYgKGhhdmVfYnl0ZXMgPiAwKQorICAgIHsKKyAgICAgIGlmICghVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPndyaXRlICh0LT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+d19idWYtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZV9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT53X2J1ZiwgMCwgaGF2ZV9ieXRlcyk7CisgICAgfQorICAgIGlmICghVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPndyaXRlICh0LT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgbGVuLCBlcnJvcikpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICB0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9hcHBlbmQgKHQtPndfYnVmLCBidWYsIHNwYWNlKTsKKyAgaWYgKCFUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+d3JpdGUgKHQtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPndfYnVmLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+d19idWYtPmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHQtPndfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+d19idWYsIDAsIHQtPndfYnVmLT5sZW4pOworICB0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9hcHBlbmQgKHQtPndfYnVmLCAoZ3VpbnQ4ICopYnVmICsgc3BhY2UsIGxlbi1zcGFjZSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisKKyAgLyogdGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCBidWZmZXIgcGx1cyB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGJlaW5nIHJlYWQgKi8KKyAgaWYgKHQtPndfYnVmLT5sZW4gKyBsZW4gPD0gdC0+d19idWZfc2l6ZSkKKyAgeworICAgIHQtPndfYnVmID0gZ19ieXRlX2FycmF5X2FwcGVuZCAodC0+d19idWYsIGJ1ZiwgbGVuKTsKKyAgICByZXR1cm4gbGVuOworICB9CisKKyAgcmV0dXJuIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGVfc2xvdyAodHJhbnNwb3J0LCBidWYsIGxlbiwgZXJyb3IpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kCisgKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KK2dib29sZWFuCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICovCitnYm9vbGVhbgordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisKKyAgaWYgKHQtPndfYnVmICE9IE5VTEwgJiYgdC0+d19idWYtPmxlbiA+IDApCisgIHsKKyAgICAvKiB3cml0ZSB0aGUgYnVmZmVyIGFuZCB0aGVuIGVtcHR5IGl0ICovCisgICAgaWYgKCFUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+d3JpdGUgKHQtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+d19idWYtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPndfYnVmLT5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICB0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPndfYnVmLCAwLCB0LT53X2J1Zi0+bGVuKTsKKyAgfQorICBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+Zmx1c2ggKHQtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGluaXRpYWxpemVzIHRoZSBpbnN0YW5jZSAqLworc3RhdGljIHZvaWQKK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaW5pdCAoVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgdHJhbnNwb3J0LT50cmFuc3BvcnQgPSBOVUxMOworICB0cmFuc3BvcnQtPnJfYnVmID0gZ19ieXRlX2FycmF5X25ldyAoKTsKKyAgdHJhbnNwb3J0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9uZXcgKCk7Cit9CisKKy8qIGRlc3RydWN0b3IgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCit7CisgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUIChvYmplY3QpOworCisgIGlmICh0cmFuc3BvcnQtPnJfYnVmICE9IE5VTEwpCisgIHsKKyAgICBnX2J5dGVfYXJyYXlfZnJlZSAodHJhbnNwb3J0LT5yX2J1ZiwgVFJVRSk7CisgIH0KKyAgdHJhbnNwb3J0LT5yX2J1ZiA9IE5VTEw7CisKKyAgaWYgKHRyYW5zcG9ydC0+d19idWYgIT0gTlVMTCkKKyAgeworICAgIGdfYnl0ZV9hcnJheV9mcmVlICh0cmFuc3BvcnQtPndfYnVmLCBUUlVFKTsKKyAgfQorICB0cmFuc3BvcnQtPndfYnVmID0gTlVMTDsKK30KKworLyogcHJvcGVydHkgYWNjZXNzb3IgKi8KK3ZvaWQKK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAob2JqZWN0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9UUkFOU1BPUlQ6CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCB0cmFuc3BvcnQtPnRyYW5zcG9ydCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9SRUFEX0JVRkZFUl9TSVpFOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHRyYW5zcG9ydC0+cl9idWZfc2l6ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCB0cmFuc3BvcnQtPndfYnVmX3NpemUpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogcHJvcGVydHkgbXV0YXRvciAqLwordm9pZAordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUIChvYmplY3QpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1RSQU5TUE9SVDoKKyAgICAgIHRyYW5zcG9ydC0+dHJhbnNwb3J0ID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9SRUFEX0JVRkZFUl9TSVpFOgorICAgICAgdHJhbnNwb3J0LT5yX2J1Zl9zaXplID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkU6CisgICAgICB0cmFuc3BvcnQtPndfYnVmX3NpemUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBpbml0aWFsaXplcyB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2NsYXNzX2luaXQgKFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0Q2xhc3MgKmNscykKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKnR0YyA9IFRIUklGVF9UUkFOU1BPUlRfQ0xBU1MgKGNscyk7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjID0gTlVMTDsKKworICAvKiBzZXR1cCBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzICovCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3NldF9wcm9wZXJ0eTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX29iamVjdCAoInRyYW5zcG9ydCIsICJ0cmFuc3BvcnQgKGNvbnN0cnVjdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdCB0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY191aW50ICgicl9idWZfc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWQgYnVmZmVyIHNpemUgKGNvbnN0cnVjdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHJlYWQgYnVmZmVyIHNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNDg1NzYsIC8qIG1heCwgMTAyNCoxMDI0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEyLCAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfUkVBRF9CVUZGRVJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY191aW50ICgid19idWZfc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlIGJ1ZmZlciBzaXplIChjb25zdHJ1Y3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSB3cml0ZSBidWZmZXIgc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA0ODU3NiwgLyogbWF4LCAxMDI0KjEwMjQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIsIC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmluYWxpemU7CisgIHR0Yy0+aXNfb3BlbiA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaXNfb3BlbjsKKyAgdHRjLT5wZWVrID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9wZWVrOworICB0dGMtPm9wZW4gPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW47CisgIHR0Yy0+Y2xvc2UgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2Nsb3NlOworICB0dGMtPnJlYWQgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWQ7CisgIHR0Yy0+cmVhZF9lbmQgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWRfZW5kOworICB0dGMtPndyaXRlID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZTsKKyAgdHRjLT53cml0ZV9lbmQgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlX2VuZDsKKyAgdHRjLT5mbHVzaCA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2g7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM3ZjQ2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfSAorI2RlZmluZSBfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9ICisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oCisgKiAgXGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IGJ1ZmZlcmVkIHRyYW5zcG9ydC4gIFN1YmNsYXNzZXMKKyAqICAgICAgICAgdGhlIFRocmlmdFRyYW5zcG9ydCBjbGFzcy4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0KSkKKyNkZWZpbmUgVEhSSUZUX0lTX0JVRkZFUkVEX1RSQU5TUE9SVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCkpCisjZGVmaW5lIFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19CVUZGRVJFRF9UUkFOU1BPUlRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCkKKyNkZWZpbmUgVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydDsKKworLyohCisgKiBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0IHBhcmVudDsKKworICAvKiBwcm90ZWN0ZWQgKi8KKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisKKyAgLyogcHJpdmF0ZSAqLworICBHQnl0ZUFycmF5ICpyX2J1ZjsKKyAgR0J5dGVBcnJheSAqd19idWY7CisgIGd1aW50MzIgcl9idWZfc2l6ZTsKKyAgZ3VpbnQzMiB3X2J1Zl9zaXplOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0Q2xhc3MgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRDbGFzczsKKworLyohCisgKiBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRCdWZmZXJlZFRyYW5zcG9ydENsYXNzCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUICovCitHVHlwZSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnkuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MDUwYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnkuYwpAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnkuaD4KKworR19ERUZJTkVfVFlQRSAoVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlkpCisKKy8qIFdyYXBzIGEgdHJhbnNwb3J0IHdpdGggYSBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydC4gKi8KK1RocmlmdFRyYW5zcG9ydCAqCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3RyYW5zcG9ydCAoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGZhY3RvcnkpOworCisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUIChnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5X2luaXQgKFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSAqc2VsZikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHNlbGYpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5X2NsYXNzX2luaXQgKFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeUNsYXNzICprbGFzcykKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeUNsYXNzICpiYXNlX2NsYXNzID0KKyAgICBUSFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUllfQ0xBU1MgKGtsYXNzKTsKKworICBiYXNlX2NsYXNzLT5nZXRfdHJhbnNwb3J0ID0KKyAgICBrbGFzcy0+Z2V0X3RyYW5zcG9ydCA9CisgICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5X2dldF90cmFuc3BvcnQ7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnkuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0M2Y0ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnkuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWV9ICisjZGVmaW5lIF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUllfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5LmgKKyAqICBcYnJpZWYgV3JhcHMgYSB0cmFuc3BvcnQgd2l0aCBhIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0LgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZICAgICAgICAgIFwKKyAgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkpKQorI2RlZmluZSBUSFJJRlRfSVNfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUlkob2JqKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZX0NMQVNTKGMpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWSwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnlDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWV9DTEFTUyhjKSAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUlkpKQorI2RlZmluZSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUllfR0VUX0NMQVNTKG9iaikgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUlksICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5IFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTsKKworLyogVGhyaWZ0IEJ1ZmZlcmVkLVRyYW5zcG9ydCBGYWN0b3J5IGluc3RhbmNlICovCitzdHJ1Y3QgX1RocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeQoreworICBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5IHBhcmVudDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnlDbGFzcyBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnlDbGFzczsKKworLyogVGhyaWZ0IEJ1ZmZlcmVkLVRyYW5zcG9ydCBGYWN0b3J5IGNsYXNzICovCitzdHJ1Y3QgX1RocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeUNsYXNzCit7CisgIFRocmlmdFRyYW5zcG9ydEZhY3RvcnlDbGFzcyBwYXJlbnQ7CisKKyAgLyogdnRhYmxlICovCisgIFRocmlmdFRyYW5zcG9ydCAqKCpnZXRfdHJhbnNwb3J0KSAoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZICovCitHVHlwZSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3R5cGUgKHZvaWQpOworCisvKiB2aXJ0dWFsIHB1YmxpYyBtZXRob2RzICovCitUaHJpZnRUcmFuc3BvcnQgKgordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5X2dldF90cmFuc3BvcnQgKFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWV9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRhYmZmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuYwpAQCAtMCwwICsxLDI2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWIvZ3N0ZGlvLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0Lmg+CisKKy8qIG9iamVjdCBwcm9wZXJ0aWVzICovCitlbnVtIF9UaHJpZnRGRFRyYW5zcG9ydFByb3BlcnRpZXMKK3sKKyAgUFJPUF8wLAorICBQUk9QX1RIUklGVF9GRF9UUkFOU1BPUlRfRkQKK307CisKK0dfREVGSU5FX1RZUEUgKFRocmlmdEZEVHJhbnNwb3J0LCB0aHJpZnRfZmRfdHJhbnNwb3J0LCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQpCisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X2ZkX3RyYW5zcG9ydF9pc19vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgVGhyaWZ0RkRUcmFuc3BvcnQgKnQ7CisgIHQgPSBUSFJJRlRfRkRfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICByZXR1cm4gdC0+ZmQgPj0gMCAmJiAhIChmY250bCAodC0+ZmQsIEZfR0VURkwpID09IC0xICYmIGVycm5vID09IEVCQURGKTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKi8KK2dib29sZWFuCit0aHJpZnRfZmRfdHJhbnNwb3J0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIHRocmlmdF9mZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICovCitnYm9vbGVhbgordGhyaWZ0X2ZkX3RyYW5zcG9ydF9jbG9zZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGRFRyYW5zcG9ydCAqdDsKKyAgdCA9IFRIUklGVF9GRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisKKyNpZiBHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKQorICByZXR1cm4gZ19jbG9zZSAodC0+ZmQsIGVycm9yKTsKKyNlbHNlCisgIGlmIChjbG9zZSAodC0+ZmQpID09IDApIHsKKyAgICBnX2NsZWFyX2Vycm9yIChlcnJvcik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0gZWxzZSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX0NMT1NFLAorICAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyNlbmRpZgorfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZCAqLworZ2ludDMyCit0aHJpZnRfZmRfdHJhbnNwb3J0X3JlYWQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0RkRUcmFuc3BvcnQgKnQ7CisgIHNzaXplX3QgbjsKKworICB0ID0gVEhSSUZUX0ZEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgbiA9IHJlYWQgKHQtPmZkLCAoZ3VpbnQ4ICopIGJ1ZiwgbGVuKTsKKyAgaWYgKG4gPT0gLTEpIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfUkVDRUlWRSwKKyAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZWFkIGZyb20gZmQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiBuOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQKKyAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9mZF90cmFuc3BvcnRfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9mZF90cmFuc3BvcnRfd3JpdGUgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGRFRyYW5zcG9ydCAqdDsKKyAgZ3VpbnQ4ICpfYnVmOworICBndWludDMyIF9sZW47CisgIHNzaXplX3QgbjsKKworICB0ID0gVEhSSUZUX0ZEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgX2J1ZiA9IChndWludDggKikgYnVmOworICBfbGVuID0gbGVuOworICB3aGlsZSAoX2xlbiA+IDApIHsKKyAgICBuID0gd3JpdGUgKHQtPmZkLCBfYnVmLCBfbGVuKTsKKyAgICBpZiAobiA9PSAtMSkgeworICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TRU5ELAorICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gd3JpdGUgZnJvbSBmZDogJXMiLAorICAgICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICBfYnVmICs9IG47CisgICAgICBfbGVuIC09IG47CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kCisgKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KK2dib29sZWFuCit0aHJpZnRfZmRfdHJhbnNwb3J0X3dyaXRlX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAqLworZ2Jvb2xlYW4KK3RocmlmdF9mZF90cmFuc3BvcnRfZmx1c2ggKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0RkRUcmFuc3BvcnQgKnQ7CisgIHQgPSBUSFJJRlRfRkRfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICBpZiAoZnN5bmMgKHQtPmZkKSA9PSAtMSkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9VTktOT1dOLAorICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZsdXNoIGZkOiAlcyIsCisgICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorfQorCisvKiBpbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfZmRfdHJhbnNwb3J0X2luaXQgKFRocmlmdEZEVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIHRyYW5zcG9ydC0+ZmQgPSAtMTsKK30KKworLyogZGVzdHJ1Y3RvciAqLworc3RhdGljIHZvaWQKK3RocmlmdF9mZF90cmFuc3BvcnRfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKG9iamVjdCk7Cit9CisKKy8qIHByb3BlcnR5IGFjY2Vzc29yICovCit2b2lkCit0aHJpZnRfZmRfdHJhbnNwb3J0X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0RkRUcmFuc3BvcnQgKnQ7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICB0ID0gVEhSSUZUX0ZEX1RSQU5TUE9SVCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKSB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9GRF9UUkFOU1BPUlRfRkQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB0LT5mZCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBwcm9wZXJ0eSBtdXRhdG9yICovCit2b2lkCit0aHJpZnRfZmRfdHJhbnNwb3J0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0RkRUcmFuc3BvcnQgKnQ7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICB0ID0gVEhSSUZUX0ZEX1RSQU5TUE9SVCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKSB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9GRF9UUkFOU1BPUlRfRkQ6CisgICAgICB0LT5mZCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogaW5pdGlhbGl6ZXMgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X2ZkX3RyYW5zcG9ydF9jbGFzc19pbml0IChUaHJpZnRGRFRyYW5zcG9ydENsYXNzICpjbHMpCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzICp0dGM7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYzsKKworICB0dGMgPSBUSFJJRlRfVFJBTlNQT1JUX0NMQVNTIChjbHMpOworICBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CisgIHBhcmFtX3NwZWMgPSBOVUxMOworCisgIC8qIHNldHVwIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgKi8KKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9mZF90cmFuc3BvcnRfc2V0X3Byb3BlcnR5OworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfaW50ICgiZmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUgZGVzY3JpcHRvciAoY29uc3RydWN0KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBmaWxlIGRlc2NyaXB0b3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX01JTiwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfTUFYLCAvKiBtYXgsIDEwMjQqMTAyNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9GRF9UUkFOU1BPUlRfRkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9maW5hbGl6ZTsKKyAgdHRjLT5pc19vcGVuID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9pc19vcGVuOworICB0dGMtPm9wZW4gPSB0aHJpZnRfZmRfdHJhbnNwb3J0X29wZW47CisgIHR0Yy0+Y2xvc2UgPSB0aHJpZnRfZmRfdHJhbnNwb3J0X2Nsb3NlOworICB0dGMtPnJlYWQgPSB0aHJpZnRfZmRfdHJhbnNwb3J0X3JlYWQ7CisgIHR0Yy0+cmVhZF9lbmQgPSB0aHJpZnRfZmRfdHJhbnNwb3J0X3JlYWRfZW5kOworICB0dGMtPndyaXRlID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF93cml0ZTsKKyAgdHRjLT53cml0ZV9lbmQgPSB0aHJpZnRfZmRfdHJhbnNwb3J0X3dyaXRlX2VuZDsKKyAgdHRjLT5mbHVzaCA9IHRocmlmdF9mZF90cmFuc3BvcnRfZmx1c2g7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2ZDVjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9GRF9UUkFOU1BPUlRfSAorI2RlZmluZSBfVEhSSUZUX0ZEX1RSQU5TUE9SVF9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSAidGhyaWZ0X3RyYW5zcG9ydC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfZmRfdHJhbnNwb3J0LmgKKyAqICBcYnJpZWYgQ2xhc3MgZm9yIFRocmlmdCBmaWxlIGRlc2NyaXB0b3IgdHJhbnNwb3J0cy4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQgKHRocmlmdF9mZF90cmFuc3BvcnRfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9GRF9UUkFOU1BPUlQob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdEZEVHJhbnNwb3J0KSkKKyNkZWZpbmUgVEhSSUZUX0lTX0ZEX1RSQU5TUE9SVChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JUKSkKKyNkZWZpbmUgVEhSSUZUX0ZEX1RSQU5TUE9SVF9DTEFTUyhjKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRGRFRyYW5zcG9ydENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX0ZEX1RSQU5TUE9SVF9DTEFTUyhjKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQpKQorI2RlZmluZSBUSFJJRlRfRkRfVFJBTlNQT1JUX0dFVF9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdEZEVHJhbnNwb3J0Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0RkRUcmFuc3BvcnQgVGhyaWZ0RkRUcmFuc3BvcnQ7CisKK3N0cnVjdCBfVGhyaWZ0RkRUcmFuc3BvcnQKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0IHBhcmVudDsKKworICAvKiBwcm90ZWN0ZWQgKi8KKyAgZ2ludCBmZDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRGRFRyYW5zcG9ydENsYXNzIFRocmlmdEZEVHJhbnNwb3J0Q2xhc3M7CisKKy8qIQorICogVGhyaWZ0IFRyYW5zcG9ydCBjbGFzcworICovCitzdHJ1Y3QgX1RocmlmdEZEVHJhbnNwb3J0Q2xhc3MKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgcGFyZW50OworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQgKi8KK0dUeXBlIHRocmlmdF9mZF90cmFuc3BvcnRfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9GRF9UUkFOU1BPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU0ODI0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMKQEAgLTAsMCArMSwzODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaD4KKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdEZyYW1lZFRyYW5zcG9ydFByb3BlcnRpZXMKK3sKKyAgUFJPUF8wLAorICBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1RSQU5TUE9SVCwKKyAgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9SRUFEX0JVRkZFUl9TSVpFLAorICBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1dSSVRFX0JVRkZFUl9TSVpFCit9OworCitHX0RFRklORV9UWVBFKFRocmlmdEZyYW1lZFRyYW5zcG9ydCwgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQsIFRIUklGVF9UWVBFX1RSQU5TUE9SVCkKKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKi8KK2dib29sZWFuCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9pc19vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+aXNfb3BlbiAodC0+dHJhbnNwb3J0KTsKK30KKworLyogb3ZlcnJpZGVzIHRocmlmdF90cmFuc3BvcnRfcGVlayAqLworZ2Jvb2xlYW4KK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3BlZWsgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIHJldHVybiAodC0+cl9idWYtPmxlbiA+IDApIHx8IHRocmlmdF90cmFuc3BvcnRfcGVlayAodC0+dHJhbnNwb3J0LCBlcnJvcik7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5vcGVuICh0LT50cmFuc3BvcnQsIGVycm9yKTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICovCitnYm9vbGVhbgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+Y2xvc2UgKHQtPnRyYW5zcG9ydCwgZXJyb3IpOworfQorCisvKiByZWFkcyBhIGZyYW1lIGFuZCBwdXRzIGl0IGludG8gdGhlIGJ1ZmZlciAqLworZ2Jvb2xlYW4KK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWRfZnJhbWUgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICBndWludDMyIHN6OworICBnaW50MzIgYnl0ZXM7CisgIGdib29sZWFuIHJlc3VsdCA9IEZBTFNFOworCisgIC8qIHJlYWQgdGhlIHNpemUgKi8KKyAgaWYgKHRocmlmdF90cmFuc3BvcnRfcmVhZCAodC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3opLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikgPT0gc2l6ZW9mIChzeikpCisgIHsKKyAgICBndWNoYXIgKnRtcGRhdGE7CisKKyAgICBzeiA9IG50b2hsIChzeik7CisKKyAgICAvKiBjcmVhdGUgYSBidWZmZXIgdG8gaG9sZCB0aGUgZGF0YSBhbmQgcmVhZCB0aGF0IG11Y2ggZGF0YSAqLworICAgIHRtcGRhdGEgPSBnX2FsbG9jYSAoc3opOworICAgIGJ5dGVzID0gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICh0LT50cmFuc3BvcnQsIHRtcGRhdGEsIHN6LCBlcnJvcik7CisKKyAgICBpZiAoYnl0ZXMgPiAwICYmIChlcnJvciA9PSBOVUxMIHx8ICplcnJvciA9PSBOVUxMKSkKKyAgICB7CisgICAgICAvKiBhZGQgdGhlIGRhdGEgdG8gdGhlIGJ1ZmZlciAqLworICAgICAgZ19ieXRlX2FycmF5X2FwcGVuZCAodC0+cl9idWYsIHRtcGRhdGEsIGJ5dGVzKTsKKworICAgICAgcmVzdWx0ID0gVFJVRTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKiB0aGUgYWN0dWFsIHJlYWQgaXMgInNsb3ciIGJlY2F1c2UgaXQgY2FsbHMgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0ICovCitnaW50MzIKK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWRfc2xvdyAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgZ3VpbnQzMiB3YW50ID0gbGVuOworICBndWludDMyIGhhdmUgPSB0LT5yX2J1Zi0+bGVuOworICBnaW50MzIgcmVzdWx0ID0gLTE7CisKKyAgLyogd2Ugc2hvdWxkbid0IGhpdCB0aGlzIHVubGVzcyB0aGUgYnVmZmVyIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggdG8gcmVhZCAqLworICBnX2Fzc2VydCAodC0+cl9idWYtPmxlbiA8IHdhbnQpOworCisgIC8qIGZpcnN0IGNvcHkgd2hhdCB3ZSBoYXZlIGluIG91ciBidWZmZXIsIGlmIHRoZXJlIGlzIGFueXRoaW5nIGxlZnQgKi8KKyAgaWYgKGhhdmUgPiAwKQorICB7CisgICAgbWVtY3B5IChidWYsIHQtPnJfYnVmLCB0LT5yX2J1Zi0+bGVuKTsKKyAgICB3YW50IC09IHQtPnJfYnVmLT5sZW47CisgICAgdC0+cl9idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5yX2J1ZiwgMCwgdC0+cl9idWYtPmxlbik7CisgIH0KKworICAvKiByZWFkIGEgZnJhbWUgb2YgaW5wdXQgYW5kIGJ1ZmZlciBpdCAqLworICBpZiAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZF9mcmFtZSAodHJhbnNwb3J0LCBlcnJvcikgPT0gVFJVRSkKKyAgeworICAgIC8qIGhhbmQgb3ZlciB3aGF0IHdlIGhhdmUgdXAgdG8gd2hhdCB0aGUgY2FsbGVyIHdhbnRzICovCisgICAgZ3VpbnQzMiBnaXZlID0gd2FudCA8IHQtPnJfYnVmLT5sZW4gPyB3YW50IDogdC0+cl9idWYtPmxlbjsKKworICAgIC8qIGNvcHkgdGhlIGRhdGEgaW50byB0aGUgYnVmZmVyICovCisgICAgbWVtY3B5ICgoZ3VpbnQ4ICopYnVmICsgbGVuIC0gd2FudCwgdC0+cl9idWYtPmRhdGEsIGdpdmUpOworICAgIHQtPnJfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+cl9idWYsIDAsIGdpdmUpOworICAgIHdhbnQgLT0gZ2l2ZTsKKworICAgIHJlc3VsdCA9IGxlbiAtIHdhbnQ7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZCAqLworZ2ludDMyCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKworICAvKiBpZiB3ZSBoYXZlIGVub3VnaCBidWZmZXIgZGF0YSB0byBmdWxmaWxsIHRoZSByZWFkLCBqdXN0IHVzZQorICAgKiBhIG1lbWNweSBmcm9tIHRoZSBidWZmZXIgKi8KKyAgaWYgKGxlbiA8PSB0LT5yX2J1Zi0+bGVuKQorICB7CisgICAgbWVtY3B5IChidWYsIHQtPnJfYnVmLT5kYXRhLCBsZW4pOworICAgIGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPnJfYnVmLCAwLCBsZW4pOworICAgIHJldHVybiBsZW47CisgIH0KKworICByZXR1cm4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZF9zbG93ICh0cmFuc3BvcnQsIGJ1ZiwgbGVuLCBlcnJvcik7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZAorICogY2FsbGVkIHdoZW4gcmVhZCBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KK2dib29sZWFuCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlX3Nsb3cgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgLyogYXBwZW5kIHRoZSBkYXRhIHRvIHRoZSBidWZmZXIgYW5kIHdlJ3JlIGRvbmUgKi8KKyAgZ19ieXRlX2FycmF5X2FwcGVuZCAodC0+d19idWYsIGJ1ZiwgbGVuKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlICovCitnYm9vbGVhbgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGUgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdwb2ludGVyIGJ1ZiwgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisKKyAgLyogdGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCBidWZmZXIgcGx1cyB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGJlaW5nIHJlYWQgKi8KKyAgaWYgKHQtPndfYnVmLT5sZW4gKyBsZW4gPD0gdC0+d19idWZfc2l6ZSkKKyAgeworICAgIHQtPndfYnVmID0gZ19ieXRlX2FycmF5X2FwcGVuZCAodC0+d19idWYsIGJ1ZiwgbGVuKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHJldHVybiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZV9zbG93ICh0cmFuc3BvcnQsIGJ1ZiwgbGVuLCBlcnJvcik7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQKKyAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICovCitnYm9vbGVhbgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIGdpbnQzMiBzel9oYm8sIHN6X25ibzsKKyAgZ3VjaGFyICp0bXBkYXRhOworCisgIC8qIGdldCB0aGUgc2l6ZSBvZiB0aGUgZnJhbWUgaW4gaG9zdCBhbmQgbmV0d29yayBieXRlIG9yZGVyICovCisgIHN6X2hibyA9IHQtPndfYnVmLT5sZW4gKyBzaXplb2Yoc3pfbmJvKTsKKyAgc3pfbmJvID0gKGdpbnQzMikgaHRvbmwgKChndWludDMyKSB0LT53X2J1Zi0+bGVuKTsKKworICAvKiBjb3B5IHRoZSBzaXplIG9mIHRoZSBmcmFtZSBhbmQgdGhlbiB0aGUgZnJhbWUgaXRzZWxmICovCisgIHRtcGRhdGEgPSBnX2FsbG9jYSAoc3pfaGJvKTsKKyAgbWVtY3B5ICh0bXBkYXRhLCAoZ3VpbnQ4ICopICZzel9uYm8sIHNpemVvZiAoc3pfbmJvKSk7CisKKyAgaWYgKHQtPndfYnVmLT5sZW4gPiAwKQorICB7CisgICAgbWVtY3B5ICh0bXBkYXRhICsgc2l6ZW9mIChzel9uYm8pLCB0LT53X2J1Zi0+ZGF0YSwgdC0+d19idWYtPmxlbik7CisgICAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT53X2J1ZiwgMCwgdC0+d19idWYtPmxlbik7CisgIH0KKyAgICAKKyAgLyogd3JpdGUgdGhlIGJ1ZmZlciBhbmQgdGhlbiBlbXB0eSBpdCAqLworICBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+d3JpdGUgKHQtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBkYXRhLCBzel9oYm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworCisgIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5mbHVzaCAodC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogaW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlICovCitzdGF0aWMgdm9pZAordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfaW5pdCAoVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIHRyYW5zcG9ydC0+dHJhbnNwb3J0ID0gTlVMTDsKKyAgdHJhbnNwb3J0LT5yX2J1ZiA9IGdfYnl0ZV9hcnJheV9uZXcgKCk7CisgIHRyYW5zcG9ydC0+d19idWYgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOworfQorCisvKiBkZXN0cnVjdG9yICovCitzdGF0aWMgdm9pZAordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKK3sKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAob2JqZWN0KTsKKworICBpZiAodHJhbnNwb3J0LT5yX2J1ZiAhPSBOVUxMKQorICB7CisgICAgZ19ieXRlX2FycmF5X2ZyZWUgKHRyYW5zcG9ydC0+cl9idWYsIFRSVUUpOworICB9CisgIHRyYW5zcG9ydC0+cl9idWYgPSBOVUxMOworCisgIGlmICh0cmFuc3BvcnQtPndfYnVmICE9IE5VTEwpCisgIHsKKyAgICBnX2J5dGVfYXJyYXlfZnJlZSAodHJhbnNwb3J0LT53X2J1ZiwgVFJVRSk7CisgIH0KKyAgdHJhbnNwb3J0LT53X2J1ZiA9IE5VTEw7Cit9CisKKy8qIHByb3BlcnR5IGFjY2Vzc29yICovCit2b2lkCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUIChvYmplY3QpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9UUkFOU1BPUlQ6CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCB0cmFuc3BvcnQtPnRyYW5zcG9ydCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfUkVBRF9CVUZGRVJfU0laRToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCB0cmFuc3BvcnQtPnJfYnVmX3NpemUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1dSSVRFX0JVRkZFUl9TSVpFOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHRyYW5zcG9ydC0+d19idWZfc2l6ZSk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBwcm9wZXJ0eSBtdXRhdG9yICovCit2b2lkCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUIChvYmplY3QpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9UUkFOU1BPUlQ6CisgICAgICB0cmFuc3BvcnQtPnRyYW5zcG9ydCA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkU6CisgICAgICB0cmFuc3BvcnQtPnJfYnVmX3NpemUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkU6CisgICAgICB0cmFuc3BvcnQtPndfYnVmX3NpemUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBpbml0aWFsaXplcyB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9jbGFzc19pbml0IChUaHJpZnRGcmFtZWRUcmFuc3BvcnRDbGFzcyAqY2xzKQoreworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CisgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWMgPSBOVUxMOworCisgIC8qIHNldHVwIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgKi8KKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9zZXRfcHJvcGVydHk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19vYmplY3QgKCJ0cmFuc3BvcnQiLCAidHJhbnNwb3J0IChjb25zdHJ1Y3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQgdHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJyX2J1Zl9zaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZCBidWZmZXIgc2l6ZSAoY29uc3RydWN0KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgcmVhZCBidWZmZXIgc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA0ODU3NiwgLyogbWF4LCAxMDI0KjEwMjQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIsIC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfUkVBRF9CVUZGRVJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY191aW50ICgid19idWZfc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlIGJ1ZmZlciBzaXplIChjb25zdHJ1Y3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSB3cml0ZSBidWZmZXIgc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA0ODU3NiwgLyogbWF4LCAxMDI0KjEwMjQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIsIC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmluYWxpemU7CisgIHR0Yy0+aXNfb3BlbiA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2lzX29wZW47CisgIHR0Yy0+cGVlayA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3BlZWs7CisgIHR0Yy0+b3BlbiA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X29wZW47CisgIHR0Yy0+Y2xvc2UgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9jbG9zZTsKKyAgdHRjLT5yZWFkID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZDsKKyAgdHRjLT5yZWFkX2VuZCA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWRfZW5kOworICB0dGMtPndyaXRlID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGU7CisgIHR0Yy0+d3JpdGVfZW5kID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGVfZW5kOworICB0dGMtPmZsdXNoID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2g7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWMwMTIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX0gKKyNkZWZpbmUgX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX0gKKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oCisgKiAgXGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IGZyYW1lZCB0cmFuc3BvcnQuICBTdWJjbGFzc2VzCisgKiAgICAgICAgIHRoZSBUaHJpZnRUcmFuc3BvcnQgY2xhc3MuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9GUkFNRURfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0KSkKKyNkZWZpbmUgVEhSSUZUX0lTX0ZSQU1FRF9UUkFOU1BPUlQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUKSkKKyNkZWZpbmUgVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsIFRocmlmdEZyYW1lZFRyYW5zcG9ydENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX0ZSQU1FRF9UUkFOU1BPUlRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQpCisjZGVmaW5lIFRIUklGVF9GUkFNRURfVFJBTlNQT1JUX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0RnJhbWVkVHJhbnNwb3J0IFRocmlmdEZyYW1lZFRyYW5zcG9ydDsKKworLyohCisgKiBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0RnJhbWVkVHJhbnNwb3J0Cit7CisgIFRocmlmdFRyYW5zcG9ydCBwYXJlbnQ7CisKKyAgLyogcHJvdGVjdGVkICovCisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0OworCisgIC8qIHByaXZhdGUgKi8KKyAgR0J5dGVBcnJheSAqcl9idWY7CisgIEdCeXRlQXJyYXkgKndfYnVmOworICBndWludDMyIHJfYnVmX3NpemU7CisgIGd1aW50MzIgd19idWZfc2l6ZTsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRGcmFtZWRUcmFuc3BvcnRDbGFzcyBUaHJpZnRGcmFtZWRUcmFuc3BvcnRDbGFzczsKKworLyohCisgKiBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0RnJhbWVkVHJhbnNwb3J0Q2xhc3MKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgcGFyZW50OworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUICovCitHVHlwZSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeS5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OGZlMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnkuaD4KKworR19ERUZJTkVfVFlQRSAoVGhyaWZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSkKKworLyogV3JhcHMgYSB0cmFuc3BvcnQgd2l0aCBhIFRocmlmdEZyYW1lZFRyYW5zcG9ydC4gKi8KK1RocmlmdFRyYW5zcG9ydCAqCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5X2dldF90cmFuc3BvcnQgKFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZmFjdG9yeSk7CisKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlQgKGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeV9pbml0IChUaHJpZnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5ICpzZWxmKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoc2VsZik7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5X2NsYXNzX2luaXQgKFRocmlmdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnlDbGFzcyAqa2xhc3MpCit7CisgIFRocmlmdFRyYW5zcG9ydEZhY3RvcnlDbGFzcyAqYmFzZV9jbGFzcyA9CisgICAgVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZX0NMQVNTIChrbGFzcyk7CisKKyAgYmFzZV9jbGFzcy0+Z2V0X3RyYW5zcG9ydCA9CisgICAga2xhc3MtPmdldF90cmFuc3BvcnQgPQorICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3RyYW5zcG9ydDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnkuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2U5NDk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeS5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWV9ICisjZGVmaW5lIF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnkuaAorICogIFxicmllZiBXcmFwcyBhIHRyYW5zcG9ydCB3aXRoIGEgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0LgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWSAgICBcCisgICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWSwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkpKQorI2RlZmluZSBUSFJJRlRfSVNfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWSkpCisjZGVmaW5lIFRIUklGVF9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUllfQ0xBU1MoYykgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeUNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWV9DTEFTUyhjKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUlkpKQorI2RlZmluZSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZX0dFVF9DTEFTUyhvYmopICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeUNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeTsKKworLyogVGhyaWZ0IEZyYW1lZC1UcmFuc3BvcnQgRmFjdG9yeSBpbnN0YW5jZSAqLworc3RydWN0IF9UaHJpZnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Cit7CisgIFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgcGFyZW50OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnlDbGFzcyBUaHJpZnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Q2xhc3M7CisKKy8qIFRocmlmdCBGcmFtZWQtVHJhbnNwb3J0IEZhY3RvcnkgY2xhc3MgKi8KK3N0cnVjdCBfVGhyaWZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeUNsYXNzCit7CisgIFRocmlmdFRyYW5zcG9ydEZhY3RvcnlDbGFzcyBwYXJlbnQ7CisKKyAgLyogdnRhYmxlICovCisgIFRocmlmdFRyYW5zcG9ydCAqKCpnZXRfdHJhbnNwb3J0KSAoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWSAqLworR1R5cGUgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHlwZSAodm9pZCk7CisKKy8qIHZpcnR1YWwgcHVibGljIG1ldGhvZHMgKi8KK1RocmlmdFRyYW5zcG9ydCAqCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5X2dldF90cmFuc3BvcnQgKFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxODE4ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jCkBAIC0wLDAgKzEsMjg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oPgorCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0TWVtb3J5QnVmZmVyUHJvcGVydGllcworeworICBQUk9QXzAsCisgIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfQlVGRkVSX1NJWkUsCisgIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfQlVGRkVSLAorICBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX09XTkVSCit9OworCitHX0RFRklORV9UWVBFKFRocmlmdE1lbW9yeUJ1ZmZlciwgdGhyaWZ0X21lbW9yeV9idWZmZXIsIFRIUklGVF9UWVBFX1RSQU5TUE9SVCkKKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKi8KK2dib29sZWFuCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl9pc19vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9tZW1vcnlfYnVmZmVyX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKi8KK2dib29sZWFuCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jbG9zZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICovCitnaW50MzIKK3RocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdCA9IFRIUklGVF9NRU1PUllfQlVGRkVSICh0cmFuc3BvcnQpOworICBndWludDMyIGdpdmUgPSBsZW47IAorCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgLyogaWYgdGhlIHJlcXVlc3RlZCBieXRlcyBhcmUgbW9yZSB0aGFuIHdoYXQgd2UgaGF2ZSBhdmFpbGFibGUsCisgICAqIGp1c3QgZ2l2ZSBhbGwgdGhhdCB3ZSBoYXZlIHRoZSBidWZmZXIgKi8KKyAgaWYgKHQtPmJ1Zi0+bGVuIDwgbGVuKQorICB7CisgICAgZ2l2ZSA9IHQtPmJ1Zi0+bGVuOworICB9CisKKyAgbWVtY3B5IChidWYsIHQtPmJ1Zi0+ZGF0YSwgZ2l2ZSk7CisgIGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPmJ1ZiwgMCwgZ2l2ZSk7CisKKyAgcmV0dXJuIGdpdmU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZAorICogY2FsbGVkIHdoZW4gcmVhZCBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KK2dib29sZWFuCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl9yZWFkX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlICovCitnYm9vbGVhbgordGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdwb2ludGVyIGJ1ZiwgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0ID0gVEhSSUZUX01FTU9SWV9CVUZGRVIgKHRyYW5zcG9ydCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICAvKiByZXR1cm4gYW4gZXhjZXB0aW9uIGlmIHRoZSBidWZmZXIgZG9lc24ndCBoYXZlIGVub3VnaCBzcGFjZS4gKi8KKyAgaWYgKGxlbiA+IHQtPmJ1Zl9zaXplIC0gdC0+YnVmLT5sZW4pCisgIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfU0VORCwKKyAgICAgICAgICAgICAgICAgInVuYWJsZSB0byB3cml0ZSAlZCBieXRlcyB0byBidWZmZXIgb2YgbGVuZ3RoICVkIiwKKyAgICAgICAgICAgICAgICAgbGVuLCB0LT5idWZfc2l6ZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9IGVsc2UgeworICAgIHQtPmJ1ZiA9IGdfYnl0ZV9hcnJheV9hcHBlbmQgKHQtPmJ1ZiwgYnVmLCBsZW4pOworICAgIHJldHVybiBUUlVFOworICB9Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQKKyAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICovCitnYm9vbGVhbgordGhyaWZ0X21lbW9yeV9idWZmZXJfZmx1c2ggKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGluaXRpYWxpemVzIGNsYXNzIGJlZm9yZSBjb25zdHJ1Y3RvciBwcm9wZXJ0aWVzIGFyZSBzZXQgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl9pbml0IChUaHJpZnRNZW1vcnlCdWZmZXIgKnQpCit7CisgIFRIUklGVF9VTlVTRURfVkFSICh0KTsKK30KKworLyogZGVzdHJ1Y3RvciAqLworc3RhdGljIHZvaWQKK3RocmlmdF9tZW1vcnlfYnVmZmVyX2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCit7CisgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdCA9IFRIUklGVF9NRU1PUllfQlVGRkVSIChvYmplY3QpOworCisgIGlmICh0LT5vd25lciAmJiB0LT5idWYgIT0gTlVMTCkKKyAgeworICAgIGdfYnl0ZV9hcnJheV91bnJlZiAodC0+YnVmKTsKKyAgfQorICB0LT5idWYgPSBOVUxMOworfQorCisvKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwordm9pZAordGhyaWZ0X21lbW9yeV9idWZmZXJfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0ID0gVEhSSUZUX01FTU9SWV9CVUZGRVIgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUl9TSVpFOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHQtPmJ1Zl9zaXplKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVI6CisgICAgICBnX3ZhbHVlX3NldF9wb2ludGVyICh2YWx1ZSwgKGdwb2ludGVyKSAodC0+YnVmKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfT1dORVI6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgdC0+b3duZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogcHJvcGVydHkgbXV0YXRvciAqLwordm9pZAordGhyaWZ0X21lbW9yeV9idWZmZXJfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0ID0gVEhSSUZUX01FTU9SWV9CVUZGRVIgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUl9TSVpFOgorICAgICAgdC0+YnVmX3NpemUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfQlVGRkVSOgorICAgICAgdC0+YnVmID0gKEdCeXRlQXJyYXkqKSBnX3ZhbHVlX2dldF9wb2ludGVyICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfT1dORVI6CisgICAgICB0LT5vd25lciA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIGluaXRpYWxpemVzIGNsYXNzIGFmdGVyIGNvbnN0cnVjdG9yIHByb3BlcnRpZXMgYXJlIHNldCAqLworc3RhdGljIHZvaWQKK3RocmlmdF9tZW1vcnlfYnVmZmVyX2NvbnN0cnVjdGVkIChHT2JqZWN0ICpvYmplY3QpCit7CisgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdCA9IFRIUklGVF9NRU1PUllfQlVGRkVSIChvYmplY3QpOworCisgIGlmICh0LT5idWYgPT0gTlVMTCkgeworICAgIHQtPmJ1ZiA9IGdfYnl0ZV9hcnJheV9uZXcgKCk7CisgIH0KKworICBHX09CSkVDVF9DTEFTUyAodGhyaWZ0X21lbW9yeV9idWZmZXJfcGFyZW50X2NsYXNzKS0+Y29uc3RydWN0ZWQgKG9iamVjdCk7Cit9CisKKy8qIGluaXRpYWxpemVzIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9tZW1vcnlfYnVmZmVyX2NsYXNzX2luaXQgKFRocmlmdE1lbW9yeUJ1ZmZlckNsYXNzICpjbHMpCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzICp0dGMgPSBUSFJJRlRfVFJBTlNQT1JUX0NMQVNTIChjbHMpOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKKyAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYyA9IE5VTEw7CisKKyAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX3NldF9wcm9wZXJ0eTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJidWZfc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciBzaXplIChjb25zdHJ1Y3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSByZWFkL3dyaXRlIGJ1ZmZlciBzaXplIGxpbWl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX01BWFVJTlQzMiwgLyogbWF4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19NQVhVSU5UMzIsIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfQlVGRkVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfcG9pbnRlciAoImJ1ZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVybmFsIGJ1ZmZlciAoR0J5dGVBcnJheSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIGludGVybmFsIGJ1ZmZlciAoR0J5dGVBcnJheSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoIm93bmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJuYWwgYnVmZmVyIG1lbW9yeSBtYW5hZ2VtZW50IHBvbGljeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB3aGV0aGVyIGludGVybmFsIGJ1ZmZlciBzaG91bGQgYmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHVucmVmZXJlbmNlZCB3aGVuIHRocmlmdF9tZW1vcnlfYnVmZmVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpcyBmaW5hbGl6ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX09XTkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBnb2JqZWN0X2NsYXNzLT5jb25zdHJ1Y3RlZCA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX2NvbnN0cnVjdGVkOworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX2ZpbmFsaXplOworICB0dGMtPmlzX29wZW4gPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9pc19vcGVuOworICB0dGMtPm9wZW4gPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9vcGVuOworICB0dGMtPmNsb3NlID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfY2xvc2U7CisgIHR0Yy0+cmVhZCA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWQ7CisgIHR0Yy0+cmVhZF9lbmQgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9yZWFkX2VuZDsKKyAgdHRjLT53cml0ZSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlOworICB0dGMtPndyaXRlX2VuZCA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlX2VuZDsKKyAgdHRjLT5mbHVzaCA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX2ZsdXNoOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVkNDdiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfTUVNT1JZX0JVRkZFUl9ICisjZGVmaW5lIF9USFJJRlRfTUVNT1JZX0JVRkZFUl9ICisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X21lbW9yeV9idWZmZXIuaAorICogIFxicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBtZW1vcnkgYnVmZmVyIHRyYW5zcG9ydC4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX01FTU9SWV9CVUZGRVIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCBUaHJpZnRNZW1vcnlCdWZmZXIpKQorI2RlZmluZSBUSFJJRlRfSVNfTUVNT1JZX0JVRkZFUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIpKQorI2RlZmluZSBUSFJJRlRfTUVNT1JZX0JVRkZFUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgVGhyaWZ0TWVtb3J5QnVmZmVyQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfTUVNT1JZX0JVRkZFUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUikKKyNkZWZpbmUgVEhSSUZUX01FTU9SWV9CVUZGRVJfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCBUaHJpZnRNZW1vcnlCdWZmZXJDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRNZW1vcnlCdWZmZXIgVGhyaWZ0TWVtb3J5QnVmZmVyOworCisvKiEKKyAqIFRocmlmdE1lbW9yeUJ1ZmZlciBpbnN0YW5jZS4KKyAqLworc3RydWN0IF9UaHJpZnRNZW1vcnlCdWZmZXIKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0IHBhcmVudDsKKworICAvKiBwcml2YXRlICovCisgIEdCeXRlQXJyYXkgKmJ1ZjsKKyAgZ3VpbnQzMiBidWZfc2l6ZTsKKyAgZ2Jvb2xlYW4gb3duZXI7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0TWVtb3J5QnVmZmVyQ2xhc3MgVGhyaWZ0TWVtb3J5QnVmZmVyQ2xhc3M7CisKKy8qIQorICogVGhyaWZ0TWVtb3J5QnVmZmVyIGNsYXNzLgorICovCitzdHJ1Y3QgX1RocmlmdE1lbW9yeUJ1ZmZlckNsYXNzCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiAqLworR1R5cGUgdGhyaWZ0X21lbW9yeV9idWZmZXJfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9wbGF0Zm9ybV9zb2NrZXQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9wbGF0Zm9ybV9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGU2MGYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3BsYXRmb3JtX3NvY2tldC5oCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qIGNsYW5nLWZvcm1hdCBvZmYgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9QTEFURk9STV9TT0NLRVRfSF8KKyMgIGRlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9QTEFURk9STV9TT0NLRVRfSF8KKworI2lmZGVmIF9XSU4zMgorIyAgZGVmaW5lIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SIDo6V1NBR2V0TGFzdEVycm9yKCkKKyMgIGRlZmluZSBUSFJJRlRfRVJSTk8gKCpfZXJybm8oKSkKKyMgIGRlZmluZSBUSFJJRlRfRUlOUFJPR1JFU1MgV1NBRUlOUFJPR1JFU1MKKyMgIGRlZmluZSBUSFJJRlRfRUFHQUlOIFdTQUVXT1VMREJMT0NLCisjICBkZWZpbmUgVEhSSUZUX0VJTlRSIFdTQUVJTlRSCisjICBkZWZpbmUgVEhSSUZUX0VDT05OUkVTRVQgV1NBRUNPTk5SRVNFVAorIyAgZGVmaW5lIFRIUklGVF9FTk9UQ09OTiBXU0FFTk9UQ09OTgorIyAgZGVmaW5lIFRIUklGVF9FVElNRURPVVQgV1NBRVRJTUVET1VUCisjICBkZWZpbmUgVEhSSUZUX0VXT1VMREJMT0NLIFdTQUVXT1VMREJMT0NLCisjICBkZWZpbmUgVEhSSUZUX0VQSVBFIFdTQUVDT05OUkVTRVQKKyMgIGRlZmluZSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgU09fRVhDTFVTSVZFQUREUlVTRQorIyAgZGVmaW5lIFRIUklGVF9JTlZBTElEX1NPQ0tFVCBJTlZBTElEX1NPQ0tFVAorIyAgZGVmaW5lIFRIUklGVF9TT0NLRVRQQUlSIHRocmlmdF9zb2NrZXRwYWlyCisjICBkZWZpbmUgVEhSSUZUX0ZDTlRMIHRocmlmdF9mY250bAorIyAgZGVmaW5lIFRIUklGVF9PX05PTkJMT0NLIDEKKyMgIGRlZmluZSBUSFJJRlRfRl9HRVRGTCAwCisjICBkZWZpbmUgVEhSSUZUX0ZfU0VURkwgMQorIyAgZGVmaW5lIFRIUklGVF9HRVRUSU1FT0ZEQVkgdGhyaWZ0X2dldHRpbWVvZmRheQorIyAgZGVmaW5lIFRIUklGVF9DTE9TRVNPQ0tFVCBjbG9zZXNvY2tldAorIyAgZGVmaW5lIFRIUklGVF9DTE9TRSBfY2xvc2UKKyMgIGRlZmluZSBUSFJJRlRfT1BFTiBfb3BlbgorIyAgZGVmaW5lIFRIUklGVF9GVFJVTkNBVEUgX2Noc2l6ZV9zCisjICBkZWZpbmUgVEhSSUZUX0ZTWU5DIF9jb21taXQKKyMgIGRlZmluZSBUSFJJRlRfTFNFRUsgX2xzZWVrCisjICBkZWZpbmUgVEhSSUZUX1dSSVRFIF93cml0ZQorIyAgZGVmaW5lIFRIUklGVF9SRUFEIF9yZWFkCisjICBkZWZpbmUgVEhSSUZUX0ZTVEFUIF9mc3RhdAorIyAgZGVmaW5lIFRIUklGVF9TVEFUIF9zdGF0CisjICBpZmRlZiBfV0lOMzJfV0NFCisjICAgIGRlZmluZSBUSFJJRlRfR0FJX1NUUkVSUk9SKC4uLikgdGhyaWZ0X3dzdHIyc3RyKGdhaV9zdHJlcnJvclcoX19WQV9BUkdTX18pKQorIyAgZWxzZQorIyAgICBkZWZpbmUgVEhSSUZUX0dBSV9TVFJFUlJPUiBnYWlfc3RyZXJyb3JBCisjICBlbmRpZgorIyAgZGVmaW5lIFRIUklGVF9TU0laRVQgcHRyZGlmZl90CisjICBkZWZpbmUgVEhSSUZUX1NOUFJJTlRGIF9zbnByaW50ZgorIyAgZGVmaW5lIFRIUklGVF9TTEVFUF9TRUMgdGhyaWZ0X3NsZWVwCisjICBkZWZpbmUgVEhSSUZUX1NMRUVQX1VTRUMgdGhyaWZ0X3VzbGVlcAorIyAgZGVmaW5lIFRIUklGVF9USU1FU1BFQyB0aHJpZnRfdGltZXNwZWMKKyMgIGRlZmluZSBUSFJJRlRfQ1RJTUVfUiB0aHJpZnRfY3RpbWVfcgorIyAgZGVmaW5lIFRIUklGVF9QT0xMIHRocmlmdF9wb2xsCisjICBpZiBXSU5WRVIgPD0gMHgwNTAyIC8qIFhQLCBTZXJ2ZXIyMDAzICovCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTEZEICB0aHJpZnRfcG9sbGZkCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTElOICAweDAzMDAKKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMT1VUIDB4MDAxMAorIyAgZWxzZSAvKiBWaXN0YSwgV2luNy4uLiAqLworIyAgICBkZWZpbmUgVEhSSUZUX1BPTExGRCAgcG9sbGZkCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTElOICBQT0xMSU4KKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMT1VUIFBPTExPVVQKKyMgIGVuZGlmIC8qIFdJTlZFUiAqLworIyAgZGVmaW5lIFRIUklGVF9TSFVUX1JEV1IgU0RfQk9USAorI2Vsc2UgLyogbm90IF9XSU4zMiAqLworIyAgaW5jbHVkZSA8ZXJybm8uaD4KKyMgIGRlZmluZSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiBlcnJubworIyAgZGVmaW5lIFRIUklGVF9FUlJOTyBlcnJubworIyAgZGVmaW5lIFRIUklGVF9FSU5UUiAgICAgICBFSU5UUgorIyAgZGVmaW5lIFRIUklGVF9FSU5QUk9HUkVTUyBFSU5QUk9HUkVTUworIyAgZGVmaW5lIFRIUklGVF9FQ09OTlJFU0VUICBFQ09OTlJFU0VUCisjICBkZWZpbmUgVEhSSUZUX0VOT1RDT05OICAgIEVOT1RDT05OCisjICBkZWZpbmUgVEhSSUZUX0VUSU1FRE9VVCAgIEVUSU1FRE9VVAorIyAgZGVmaW5lIFRIUklGVF9FV09VTERCTE9DSyBFV09VTERCTE9DSworIyAgZGVmaW5lIFRIUklGVF9FQUdBSU4gICAgICBFQUdBSU4KKyMgIGRlZmluZSBUSFJJRlRfRVBJUEUgICAgICAgRVBJUEUKKyMgIGRlZmluZSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgU09fUkVVU0VBRERSCisjICBkZWZpbmUgVEhSSUZUX0lOVkFMSURfU09DS0VUICgtMSkKKyMgIGRlZmluZSBUSFJJRlRfU09DS0VUUEFJUiBzb2NrZXRwYWlyCisjICBkZWZpbmUgVEhSSUZUX0ZDTlRMIGZjbnRsCisjICBkZWZpbmUgVEhSSUZUX09fTk9OQkxPQ0sgT19OT05CTE9DSworIyAgZGVmaW5lIFRIUklGVF9GX0dFVEZMIEZfR0VURkwKKyMgIGRlZmluZSBUSFJJRlRfRl9TRVRGTCBGX1NFVEZMCisjICBkZWZpbmUgVEhSSUZUX0dFVFRJTUVPRkRBWSBnZXR0aW1lb2ZkYXkKKyMgIGRlZmluZSBUSFJJRlRfQ0xPU0VTT0NLRVQgY2xvc2UKKyMgIGRlZmluZSBUSFJJRlRfQ0xPU0UgY2xvc2UKKyMgIGRlZmluZSBUSFJJRlRfT1BFTiBvcGVuCisjICBkZWZpbmUgVEhSSUZUX0ZUUlVOQ0FURSBmdHJ1bmNhdGUKKyMgIGRlZmluZSBUSFJJRlRfRlNZTkMgZnN5bmMKKyMgIGRlZmluZSBUSFJJRlRfTFNFRUsgbHNlZWsKKyMgIGRlZmluZSBUSFJJRlRfV1JJVEUgd3JpdGUKKyMgIGRlZmluZSBUSFJJRlRfUkVBRCByZWFkCisjICBkZWZpbmUgVEhSSUZUX1NUQVQgc3RhdAorIyAgZGVmaW5lIFRIUklGVF9GU1RBVCBmc3RhdAorIyAgZGVmaW5lIFRIUklGVF9HQUlfU1RSRVJST1IgZ2FpX3N0cmVycm9yCisjICBkZWZpbmUgVEhSSUZUX1NTSVpFVCBzc2l6ZV90CisjICBkZWZpbmUgVEhSSUZUX1NOUFJJTlRGIHNucHJpbnRmCisjICBkZWZpbmUgVEhSSUZUX1NMRUVQX1NFQyBzbGVlcAorIyAgZGVmaW5lIFRIUklGVF9TTEVFUF9VU0VDIHVzbGVlcAorIyAgZGVmaW5lIFRIUklGVF9USU1FU1BFQyB0aW1lc3BlYworIyAgZGVmaW5lIFRIUklGVF9DVElNRV9SIGN0aW1lX3IKKyMgIGRlZmluZSBUSFJJRlRfUE9MTCBwb2xsCisjICBkZWZpbmUgVEhSSUZUX1BPTExGRCAgcG9sbGZkCisjICBkZWZpbmUgVEhSSUZUX1BPTExJTiAgUE9MTElOCisjICBkZWZpbmUgVEhSSUZUX1BPTExPVVQgUE9MTE9VVAorIyAgZGVmaW5lIFRIUklGVF9TSFVUX1JEV1IgU0hVVF9SRFdSCisjZW5kaWYKKworI2VuZGlmIC8qIF9USFJJRlRfVFJBTlNQT1JUX1BMQVRGT1JNX1NPQ0tFVF9IXyAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVhODk3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmMKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdFNlcnZlclNvY2tldFByb3BlcnRpZXMKK3sKKyAgUFJPUF8wLAorICBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX1BPUlQsCisgIFBST1BfVEhSSUZUX1NFUlZFUl9TT0NLRVRfQkFDS0xPRworfTsKKworLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIHN0cmluZyAqLworI2RlZmluZSBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9ET01BSU4gInRocmlmdC1zZXJ2ZXItc29ja2V0LWVycm9yLXF1YXJrIgorCitHX0RFRklORV9UWVBFKFRocmlmdFNlcnZlclNvY2tldCwgdGhyaWZ0X3NlcnZlcl9zb2NrZXQsIFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQpCisKK2dib29sZWFuCit0aHJpZnRfc2VydmVyX3NvY2tldF9saXN0ZW4gKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgaW50IGVuYWJsZWQgPSAxOyAvKiBmb3Igc2V0c29ja29wdCgpICovCisgIHN0cnVjdCBzb2NrYWRkcl9pbiBwaW47CisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IFRIUklGVF9TRVJWRVJfU09DS0VUICh0cmFuc3BvcnQpOworCisgIC8qIGNyZWF0ZSBhIGFkZHJlc3Mgc3RydWN0dXJlICovCisgIG1lbXNldCAoJnBpbiwgMCwgc2l6ZW9mKHBpbikpOworICBwaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIHBpbi5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworICBwaW4uc2luX3BvcnQgPSBodG9ucyh0c29ja2V0LT5wb3J0KTsKKworICAvKiBjcmVhdGUgYSBzb2NrZXQgKi8KKyAgaWYgKCh0c29ja2V0LT5zZCA9IHNvY2tldCAoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApKSA9PSAtMSkKKyAgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBjcmVhdGUgc29ja2V0IC0gJXMiLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoc2V0c29ja29wdCh0c29ja2V0LT5zZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmZW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKGVuYWJsZWQpKSA9PSAtMSkKKyAgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX1NFVFNPQ0tPUFQsCisgICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gc2V0IFNPX1JFVVNFQUREUiAtICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBiaW5kIHRvIHRoZSBzb2NrZXQgKi8KKyAgaWYgKGJpbmQodHNvY2tldC0+c2QsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnBpbiwgc2l6ZW9mKHBpbikpID09IC0xKQorICB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfQklORCwKKyAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBiaW5kIHRvIHBvcnQgJWQgLSAlcyIsCisgICAgICAgICAgICAgICAgIHRzb2NrZXQtPnBvcnQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKGxpc3Rlbih0c29ja2V0LT5zZCwgdHNvY2tldC0+YmFja2xvZykgPT0gLTEpCisgIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9MSVNURU4sCisgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gbGlzdGVuIHRvIHBvcnQgJWQgLSAlcyIsCisgICAgICAgICAgICAgICAgIHRzb2NrZXQtPnBvcnQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK1RocmlmdFRyYW5zcG9ydCAqCit0aHJpZnRfc2VydmVyX3NvY2tldF9hY2NlcHQgKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgaW50IHNkID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICBndWludCBhZGRybGVuID0gMDsKKyAgc3RydWN0IHNvY2thZGRyX2luIGFkZHJlc3M7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gTlVMTDsKKworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBUSFJJRlRfU0VSVkVSX1NPQ0tFVCAodHJhbnNwb3J0KTsKKworICBpZiAoKHNkID0gYWNjZXB0KHRzb2NrZXQtPnNkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyZXNzLCAmYWRkcmxlbikpID09IC0xKQorICB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfQUNDRVBULAorICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGFjY2VwdCBjb25uZWN0aW9uIC0gJXMiLAorICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCBOVUxMKTsKKyAgc29ja2V0LT5zZCA9IHNkOworCisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUKHNvY2tldCk7Cit9CisKK2dib29sZWFuCit0aHJpZnRfc2VydmVyX3NvY2tldF9jbG9zZSAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBUSFJJRlRfU0VSVkVSX1NPQ0tFVCAodHJhbnNwb3J0KTsKKworICBpZiAoY2xvc2UgKHRzb2NrZXQtPnNkKSA9PSAtMSkKKyAgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0NMT1NFLAorICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIGNsb3NlIHNvY2tldCAtICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgdHNvY2tldC0+c2QgPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbiAqLworR1F1YXJrCit0aHJpZnRfc2VydmVyX3NvY2tldF9lcnJvcl9xdWFyayAodm9pZCkKK3sKKyAgcmV0dXJuIGdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nKFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0RPTUFJTik7Cit9CisKKy8qIGluaXRpYWxpemVzIHRoZSBpbnN0YW5jZSAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zZXJ2ZXJfc29ja2V0X2luaXQgKFRocmlmdFNlcnZlclNvY2tldCAqc29ja2V0KQoreworICBzb2NrZXQtPnNkID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworfQorCisvKiBkZXN0cnVjdG9yICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9zb2NrZXRfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKK3sKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU0VSVkVSX1NPQ0tFVCAob2JqZWN0KTsKKworICBpZiAoc29ja2V0LT5zZCAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpCisgIHsKKyAgICBjbG9zZSAoc29ja2V0LT5zZCk7CisgIH0KKyAgc29ja2V0LT5zZCA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKK30KKworLyogcHJvcGVydHkgYWNjZXNzb3IgKi8KK3ZvaWQKK3RocmlmdF9zZXJ2ZXJfc29ja2V0X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdFNlcnZlclNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NFUlZFUl9TT0NLRVQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9QT1JUOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNvY2tldC0+cG9ydCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9TT0NLRVRfQkFDS0xPRzoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzb2NrZXQtPmJhY2tsb2cpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogcHJvcGVydHkgbXV0YXRvciAqLwordm9pZAordGhyaWZ0X3NlcnZlcl9zb2NrZXRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU0VSVkVSX1NPQ0tFVCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX1BPUlQ6CisgICAgICBzb2NrZXQtPnBvcnQgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9TT0NLRVRfQkFDS0xPRzoKKyAgICAgIHNvY2tldC0+YmFja2xvZyA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIGluaXRpYWxpemVzIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zZXJ2ZXJfc29ja2V0X2NsYXNzX2luaXQgKFRocmlmdFNlcnZlclNvY2tldENsYXNzICpjbHMpCit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzICp0c3RjID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfQ0xBU1MgKGNscyk7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjID0gTlVMTDsKKworICAvKiBzZXR1cCBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzICovCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9zZXJ2ZXJfc29ja2V0X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NlcnZlcl9zb2NrZXRfc2V0X3Byb3BlcnR5OworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoInBvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IChjb25zdHJ1Y3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBwb3J0IHRvIGxpc3RlbiB0byIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU1MzUsIC8qIG1heCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwOTAsIC8qIGRlZmF1bHQgYnkgY29udmVudGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9QT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJiYWNrbG9nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja2xvZyAoY29uc3RydWN0KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgYWNjZXB0IGJhY2tsb2ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1heCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1NTM0LCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0LCAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX0JBQ0tMT0csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X3NlcnZlcl9zb2NrZXRfZmluYWxpemU7CisKKyAgdHN0Yy0+bGlzdGVuID0gdGhyaWZ0X3NlcnZlcl9zb2NrZXRfbGlzdGVuOworICB0c3RjLT5hY2NlcHQgPSB0aHJpZnRfc2VydmVyX3NvY2tldF9hY2NlcHQ7CisgIHRzdGMtPmNsb3NlID0gdGhyaWZ0X3NlcnZlcl9zb2NrZXRfY2xvc2U7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMDQ5NTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9TT0NLRVRfSAorI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9TT0NLRVRfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgInRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmgiCisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9zZXJ2ZXJfc29ja2V0LmgKKyAqICBcYnJpZWYgU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IHNlcnZlciB0cmFuc3BvcnQuICBJbXBsZW1lbnRzIHRoZQorICogICAgICAgICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgY2xhc3MuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCAodGhyaWZ0X3NlcnZlcl9zb2NrZXRfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9TRVJWRVJfU09DS0VUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwgVGhyaWZ0U2VydmVyU29ja2V0KSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NFUlZFUl9TT0NLRVQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VUKSkKKyNkZWZpbmUgVEhSSUZUX1NFUlZFUl9TT0NLRVRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsIFRocmlmdFNlcnZlclNvY2tldENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NFUlZFUl9TT0NLRVRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQpKQorI2RlZmluZSBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsIFRocmlmdFNlcnZlclNvY2tldENsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNlcnZlclNvY2tldCBUaHJpZnRTZXJ2ZXJTb2NrZXQ7CisKKy8qIQorICogVGhyaWZ0IFNlcnZlclNvY2tldCBpbnN0YW5jZS4KKyAqLworc3RydWN0IF9UaHJpZnRTZXJ2ZXJTb2NrZXQKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0IHBhcmVudDsKKworICAvKiBwcml2YXRlICovCisgIGd1aW50IHBvcnQ7CisgIGdzaG9ydCBiYWNrbG9nOworICBpbnQgc2Q7CisgIGd1aW50OCAqYnVmOworICBndWludDMyIGJ1Zl9zaXplOworICBndWludDMyIGJ1Zl9sZW47Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U2VydmVyU29ja2V0Q2xhc3MgVGhyaWZ0U2VydmVyU29ja2V0Q2xhc3M7CisKKy8qIQorICogVGhyaWZ0IFNlcnZlclNvY2tldCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRTZXJ2ZXJTb2NrZXRDbGFzcworeworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQgKi8KK0dUeXBlIHRocmlmdF9zZXJ2ZXJfc29ja2V0X2dldF90eXBlICh2b2lkKTsKKworLyogZGVmaW5lIGVycm9yL2V4Y2VwdGlvbiB0eXBlcyAqLwordHlwZWRlZiBlbnVtCit7CisgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX1NPQ0tFVCwKKyAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfU0VUU09DS09QVCwKKyAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfQklORCwKKyAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfTElTVEVOLAorICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9BQ0NFUFQsCisgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0NMT1NFCit9IFRocmlmdFNlcnZlclNvY2tldEVycm9yOworCisvKiBkZWZpbmUgYSBlcnJvciBkb21haW4gZm9yIEdFcnJvciB0byB1c2UgKi8KK0dRdWFyayB0aHJpZnRfc2VydmVyX3NvY2tldF9lcnJvcl9xdWFyayAodm9pZCk7CisjZGVmaW5lIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SICh0aHJpZnRfc2VydmVyX3NvY2tldF9lcnJvcl9xdWFyayAoKSkKKworR19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjVkMTM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuYwpAQCAtMCwwICsxLDYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgorCitHX0RFRklORV9BQlNUUkFDVF9UWVBFKFRocmlmdFNlcnZlclRyYW5zcG9ydCwgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQsIEdfVFlQRV9PQkpFQ1QpCisKKy8qIGJhc2UgaW5pdGlhbGl6ZXIgZm9yIHRoZSBzZXJ2ZXIgdHJhbnNwb3J0IGludGVyZmFjZSAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2NsYXNzX2luaXQgKFRocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzICpjKQoreworICBjLT5saXN0ZW4gPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW47CisgIGMtPmFjY2VwdCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdDsKKyAgYy0+Y2xvc2UgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9jbG9zZTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2luaXQgKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5saXN0ZW4gKHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK1RocmlmdFRyYW5zcG9ydCAqCit0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+YWNjZXB0ICh0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnYm9vbGVhbgordGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfY2xvc2UgKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+Y2xvc2UgKHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YTkxOTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfSAorI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgInRocmlmdF90cmFuc3BvcnQuaCIKKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaAorICogIFxicmllZiBBYnN0cmFjdCBjbGFzcyBmb3IgVGhyaWZ0IHNlcnZlciB0cmFuc3BvcnRzLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQgKHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQsIFRocmlmdFNlcnZlclRyYW5zcG9ydCkpCisjZGVmaW5lIFRIUklGVF9JU19TRVJWRVJfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCkpCisjZGVmaW5lIFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JULCBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19TRVJWRVJfVFJBTlNQT1JUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JUKSkKKyNkZWZpbmUgVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JULCBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgVGhyaWZ0U2VydmVyVHJhbnNwb3J0OworCitzdHJ1Y3QgX1RocmlmdFNlcnZlclRyYW5zcG9ydAoreworICBHT2JqZWN0IHBhcmVudDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcyBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzczsKKworLyohCisgKiBUaHJpZnQgVHJhbnNwb3J0IGNsYXNzCisgKi8KK3N0cnVjdCBfVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MKK3sKKyAgR09iamVjdENsYXNzIHBhcmVudDsKKworICAvKiB2dGFibGUgKi8KKyAgZ2Jvb2xlYW4gKCpsaXN0ZW4pIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworICBUaHJpZnRUcmFuc3BvcnQgKigqYWNjZXB0KSAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCpjbG9zZSkgKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQgKi8KK0dUeXBlIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2dldF90eXBlICh2b2lkKTsKKworLyohCisgKiBMaXN0ZW4gZm9yIG5ldyBjb25uZWN0aW9ucy4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzCisgKi8KK2dib29sZWFuIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworLyohCisgKiBBY2NlcHQgYSBjb25uZWN0aW9uLgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MKKyAqLworVGhyaWZ0VHJhbnNwb3J0ICp0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQKKyAgICAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKworLyohCisgKiBDbG9zZSB0aGUgdHJhbnNwb3J0LgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfY2xvc2UgKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRkMGYwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuYwpAQCAtMCwwICsxLDM3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisKKy8qIG9iamVjdCBwcm9wZXJ0aWVzICovCitlbnVtIF9UaHJpZnRTb2NrZXRQcm9wZXJ0aWVzCit7CisgIFBST1BfMCwKKyAgUFJPUF9USFJJRlRfU09DS0VUX0hPU1ROQU1FLAorICBQUk9QX1RIUklGVF9TT0NLRVRfUE9SVAorfTsKKworR19ERUZJTkVfVFlQRShUaHJpZnRTb2NrZXQsIHRocmlmdF9zb2NrZXQsIFRIUklGVF9UWVBFX1RSQU5TUE9SVCkKKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKi8KK2dib29sZWFuCit0aHJpZnRfc29ja2V0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIHJldHVybiBzb2NrZXQtPnNkICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKK30KKworLyogb3ZlcnJpZGVzIHRocmlmdF90cmFuc3BvcnRfcGVlayAqLworZ2Jvb2xlYW4KK3RocmlmdF9zb2NrZXRfcGVlayAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBnYm9vbGVhbiByZXN1bHQgPSBGQUxTRTsKKyAgZ3VpbnQ4IGJ1ZjsKKyAgaW50IHI7CisgIGludCBlcnJub19jb3B5OworCisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKworICBpZiAodGhyaWZ0X3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpKQorICB7CisgICAgciA9IHJlY3YgKHNvY2tldC0+c2QsICZidWYsIDEsIE1TR19QRUVLKTsKKyAgICBpZiAociA9PSAtMSkKKyAgICB7CisgICAgICBlcnJub19jb3B5ID0gZXJybm87CisKKyAgICAgICNpZiBkZWZpbmVkIF9fRnJlZUJTRF9fIHx8IGRlZmluZWQgX19NQUNIX18KKyAgICAgIC8qIEZyZWVCU0QgcmV0dXJucyAtMSBhbmQgRUNPTk5SRVNFVCBpZiB0aGUgc29ja2V0IHdhcyBjbG9zZWQgYnkgdGhlIG90aGVyCisgICAgICAgICBzaWRlICovCisgICAgICBpZiAoZXJybm9fY29weSA9PSBFQ09OTlJFU0VUKQorICAgICAgeworICAgICAgICB0aHJpZnRfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIGVycm9yKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICNlbmRpZgorCisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHBlZWsgYXQgc29ja2V0IC0gJXMiLAorICAgICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJub19jb3B5KSk7CisKKyAgICAgICNpZiBkZWZpbmVkIF9fRnJlZUJTRF9fIHx8IGRlZmluZWQgX19NQUNIX18KKyAgICAgIH0KKyAgICAgICNlbmRpZgorICAgIH0KKyAgICBlbHNlIGlmIChyID4gMCkKKyAgICB7CisgICAgICByZXN1bHQgPSBUUlVFOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICovCitnYm9vbGVhbgordGhyaWZ0X3NvY2tldF9jbG9zZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisKKyAgaWYgKGNsb3NlIChzb2NrZXQtPnNkKSA9PSAtMSkKKyAgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9DTE9TRSwKKyAgICAgICAgICAgICAgICAgInVuYWJsZSB0byBjbG9zZSBzb2NrZXQgLSAlcyIsCisgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgc29ja2V0LT5zZCA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X3NvY2tldF9vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHN0cnVjdCBob3N0ZW50ICpocCA9IE5VTEw7CisgIHN0cnVjdCBzb2NrYWRkcl9pbiBwaW47CisgIGludCBlcnI7CisjaWYgZGVmaW5lZChIQVZFX0dFVEhPU1RCWU5BTUVfUikKKyAgc3RydWN0IGhvc3RlbnQgaGU7CisgIGNoYXIgYnVmWzEwMjRdOworI2VuZGlmCisKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHRzb2NrZXQtPnNkID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCwgRkFMU0UpOworCisgIC8qIGxvb2t1cCB0aGUgZGVzdGluYXRpb24gaG9zdCAqLworI2lmIGRlZmluZWQoSEFWRV9HRVRIT1NUQllOQU1FX1IpCisgIGlmIChnZXRob3N0YnluYW1lX3IgKHRzb2NrZXQtPmhvc3RuYW1lLCAmaGUsIGJ1ZiwgMTAyNCwgJmhwLCAmZXJyKSAhPSAwIHx8IGhwID09IE5VTEwpCisjZWxzZQorICBpZiAoKGhwID0gZ2V0aG9zdGJ5bmFtZSAodHNvY2tldC0+aG9zdG5hbWUpKSA9PSBOVUxMICYmIChlcnIgPSBoX2Vycm5vKSkKKyNlbmRpZgorICB7CisgICAgLyogaG9zdCBsb29rdXAgZmFpbGVkLCBiYWlsIG91dCB3aXRoIGFuIGVycm9yICovCisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX0hPU1QsCisgICAgICAgICAgICAgICAgICJob3N0IGxvb2t1cCBmYWlsZWQgZm9yICVzOiVkIC0gJXMiLAorICAgICAgICAgICAgICAgICB0c29ja2V0LT5ob3N0bmFtZSwgdHNvY2tldC0+cG9ydCwKKyAgICAgICAgICAgICAgICAgaHN0cmVycm9yIChlcnIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBjcmVhdGUgYSBzb2NrZXQgc3RydWN0dXJlICovCisgIG1lbXNldCAoJnBpbiwgMCwgc2l6ZW9mKHBpbikpOworICBwaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIHBpbi5zaW5fYWRkci5zX2FkZHIgPSAoKHN0cnVjdCBpbl9hZGRyICopIChocC0+aF9hZGRyX2xpc3RbMF0pKS0+c19hZGRyOworICBwaW4uc2luX3BvcnQgPSBodG9ucyAodHNvY2tldC0+cG9ydCk7CisKKyAgLyogY3JlYXRlIHRoZSBzb2NrZXQgKi8KKyAgaWYgKCh0c29ja2V0LT5zZCA9IHNvY2tldCAoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApKSA9PSAtMSkKKyAgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TT0NLRVQsCisgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gY3JlYXRlIHNvY2tldCBmb3IgaG9zdCAlczolZCAtICVzIiwKKyAgICAgICAgICAgICAgICAgdHNvY2tldC0+aG9zdG5hbWUsIHRzb2NrZXQtPnBvcnQsCisgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogb3BlbiBhIGNvbm5lY3Rpb24gKi8KKyAgaWYgKGNvbm5lY3QgKHRzb2NrZXQtPnNkLCAoc3RydWN0IHNvY2thZGRyICopICZwaW4sIHNpemVvZihwaW4pKSA9PSAtMSkKKyAgeworICAgICAgdGhyaWZ0X3NvY2tldF9jbG9zZSh0c29ja2V0LCBOVUxMKTsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9DT05ORUNULAorICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGNvbm5lY3QgdG8gaG9zdCAlczolZCAtICVzIiwKKyAgICAgICAgICAgICAgICAgdHNvY2tldC0+aG9zdG5hbWUsIHRzb2NrZXQtPnBvcnQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKi8KK2dpbnQzMgordGhyaWZ0X3NvY2tldF9yZWFkIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQgcmV0ID0gMDsKKyAgZ3VpbnQgZ290ID0gMDsKKworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisKKyAgd2hpbGUgKGdvdCA8IGxlbikKKyAgeworICAgIHJldCA9IHJlY3YgKHNvY2tldC0+c2QsIChndWludDggKilidWYgKyBnb3QsIGxlbi1nb3QsIDApOworICAgIGlmIChyZXQgPD0gMCkKKyAgICB7CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9SRUNFSVZFLAorICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gcmVhZCAlZCBieXRlcyAtICVzIiwgbGVuLCBzdHJlcnJvcihlcnJubykpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBnb3QgKz0gcmV0OworICB9CisKKyAgcmV0dXJuIGdvdDsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kCisgKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KK2dib29sZWFuCit0aHJpZnRfc29ja2V0X3JlYWRfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKi8KK2dib29sZWFuCit0aHJpZnRfc29ja2V0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgY29uc3QgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBnaW50IHJldCA9IDA7CisgIGd1aW50IHNlbnQgPSAwOworCisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNvY2tldC0+c2QgIT0gVEhSSUZUX0lOVkFMSURfU09DS0VULCBGQUxTRSk7CisKKyAgd2hpbGUgKHNlbnQgPCBsZW4pCisgIHsKKyAgICByZXQgPSBzZW5kIChzb2NrZXQtPnNkLCAoZ3VpbnQ4ICopYnVmICsgc2VudCwgbGVuIC0gc2VudCwgMCk7CisgICAgaWYgKHJldCA8IDApCisgICAgeworICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfU0VORCwKKyAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHNlbmQgJWQgYnl0ZXMgLSAlcyIsIGxlbiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgc2VudCArPSByZXQ7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZAorICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X3NvY2tldF93cml0ZV9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaAorICogZmx1c2ggcGVuZGluZyBkYXRhLiAgc2luY2Ugd2UgYXJlIG5vdCBidWZmZXJlZCwgdGhpcyBpcyBhIG5vLW9wICovCitnYm9vbGVhbgordGhyaWZ0X3NvY2tldF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NvY2tldF9pbml0IChUaHJpZnRTb2NrZXQgKnNvY2tldCkKK3sKKyAgc29ja2V0LT5zZCA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKK30KKworLyogZGVzdHJ1Y3RvciAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zb2NrZXRfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKK3sKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUIChvYmplY3QpOworCisgIGlmIChzb2NrZXQtPmhvc3RuYW1lICE9IE5VTEwpCisgIHsKKyAgICBnX2ZyZWUgKHNvY2tldC0+aG9zdG5hbWUpOworICB9CisgIHNvY2tldC0+aG9zdG5hbWUgPSBOVUxMOworCisgIGlmIChzb2NrZXQtPnNkICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkKKyAgeworICAgIGNsb3NlIChzb2NrZXQtPnNkKTsKKyAgfQorICBzb2NrZXQtPnNkID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworfQorCisvKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwordm9pZAordGhyaWZ0X3NvY2tldF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAob2JqZWN0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NPQ0tFVF9IT1NUTkFNRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNvY2tldC0+aG9zdG5hbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TT0NLRVRfUE9SVDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzb2NrZXQtPnBvcnQpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogcHJvcGVydHkgbXV0YXRvciAqLwordm9pZAordGhyaWZ0X3NvY2tldF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAob2JqZWN0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NPQ0tFVF9IT1NUTkFNRToKKyAgICAgIGlmIChzb2NrZXQtPmhvc3RuYW1lKSB7CisgICAgICAgIGdfZnJlZShzb2NrZXQtPmhvc3RuYW1lKTsKKyAgICAgIH0KKyAgICAgIHNvY2tldC0+aG9zdG5hbWUgPSBnX3N0cmR1cCAoZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TT0NLRVRfUE9SVDoKKyAgICAgIHNvY2tldC0+cG9ydCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIGluaXRpYWxpemVzIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zb2NrZXRfY2xhc3NfaW5pdCAoVGhyaWZ0U29ja2V0Q2xhc3MgKmNscykKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKnR0YyA9IFRIUklGVF9UUkFOU1BPUlRfQ0xBU1MgKGNscyk7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjID0gTlVMTDsKKworICAvKiBzZXR1cCBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzICovCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9zb2NrZXRfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfc29ja2V0X3NldF9wcm9wZXJ0eTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3N0cmluZyAoImhvc3RuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3N0bmFtZSAoY29uc3RydWN0KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBob3N0bmFtZSBvZiB0aGUgcmVtb3RlIGhvc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvY2FsaG9zdCIsIC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RIUklGVF9TT0NLRVRfSE9TVE5BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoInBvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IChjb25zdHJ1Y3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBwb3J0IG9mIHRoZSByZW1vdGUgaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1NTM1dSwgLyogbWF4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTA5MCwgLyogZGVmYXVsdCBieSBjb252ZW50aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RIUklGVF9TT0NLRVRfUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfc29ja2V0X2ZpbmFsaXplOworICB0dGMtPmlzX29wZW4gPSB0aHJpZnRfc29ja2V0X2lzX29wZW47CisgIHR0Yy0+cGVlayA9IHRocmlmdF9zb2NrZXRfcGVlazsKKyAgdHRjLT5vcGVuID0gdGhyaWZ0X3NvY2tldF9vcGVuOworICB0dGMtPmNsb3NlID0gdGhyaWZ0X3NvY2tldF9jbG9zZTsKKyAgdHRjLT5yZWFkID0gdGhyaWZ0X3NvY2tldF9yZWFkOworICB0dGMtPnJlYWRfZW5kID0gdGhyaWZ0X3NvY2tldF9yZWFkX2VuZDsKKyAgdHRjLT53cml0ZSA9IHRocmlmdF9zb2NrZXRfd3JpdGU7CisgIHR0Yy0+d3JpdGVfZW5kID0gdGhyaWZ0X3NvY2tldF93cml0ZV9lbmQ7CisgIHR0Yy0+Zmx1c2ggPSB0aHJpZnRfc29ja2V0X2ZsdXNoOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNmY2N2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU09DS0VUX0gKKyNkZWZpbmUgX1RIUklGVF9TT0NLRVRfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3NvY2tldC5oCisgKiAgXGJyaWVmIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCB0cmFuc3BvcnQuICBTdWJjbGFzc2VzIHRoZQorICogICAgICAgICBUaHJpZnRUcmFuc3BvcnQgY2xhc3MuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfU09DS0VUICh0aHJpZnRfc29ja2V0X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfU09DS0VUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfU09DS0VULCBUaHJpZnRTb2NrZXQpKQorI2RlZmluZSBUSFJJRlRfSVNfU09DS0VUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfU09DS0VUKSkKKyNkZWZpbmUgVEhSSUZUX1NPQ0tFVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfU09DS0VULCBUaHJpZnRTb2NrZXRDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19TT0NLRVRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1NPQ0tFVCkpCisjZGVmaW5lIFRIUklGVF9TT0NLRVRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9TT0NLRVQsIFRocmlmdFNvY2tldENsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNvY2tldCBUaHJpZnRTb2NrZXQ7CisKKy8qIQorICogVGhyaWZ0IFNvY2tldCBpbnN0YW5jZS4KKyAqLworc3RydWN0IF9UaHJpZnRTb2NrZXQKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0IHBhcmVudDsKKworICAvKiBwcml2YXRlICovCisgIGdjaGFyICpob3N0bmFtZTsKKyAgZ3VpbnQgcG9ydDsKKyAgaW50IHNkOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNvY2tldENsYXNzIFRocmlmdFNvY2tldENsYXNzOworCisvKiEKKyAqIFRocmlmdCBTb2NrZXQgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0U29ja2V0Q2xhc3MKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgcGFyZW50OworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9TT0NLRVQgKi8KK0dUeXBlIHRocmlmdF9zb2NrZXRfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNTU0MDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5jCkBAIC0wLDAgKzEsODA2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0Lmg+CisKKworI2lmIGRlZmluZWQoV0lOMzIpCisjZGVmaW5lIE1VVEVYX1RZUEUgICAgICAgICAgICBIQU5ETEUKKyNkZWZpbmUgTVVURVhfU0VUVVAoeCkgICAgICAgICh4KSA9IENyZWF0ZU11dGV4KE5VTEwsIEZBTFNFLCBOVUxMKQorI2RlZmluZSBNVVRFWF9DTEVBTlVQKHgpICAgICAgQ2xvc2VIYW5kbGUoeCkKKyNkZWZpbmUgTVVURVhfTE9DSyh4KSAgICAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3QoKHgpLCBJTkZJTklURSkKKyNkZWZpbmUgTVVURVhfVU5MT0NLKHgpICAgICAgIFJlbGVhc2VNdXRleCh4KQorI2Vsc2UKKyNkZWZpbmUgTVVURVhfVFlQRSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdAorI2RlZmluZSBNVVRFWF9TRVRVUCh4KSAgICAgICAgcHRocmVhZF9tdXRleF9pbml0KCYoeCksIE5VTEwpCisjZGVmaW5lIE1VVEVYX0NMRUFOVVAoeCkgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJih4KSkKKyNkZWZpbmUgTVVURVhfTE9DSyh4KSAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmKHgpKQorI2RlZmluZSBNVVRFWF9VTkxPQ0soeCkgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJih4KSkKKyNlbmRpZgorCisjZGVmaW5lIE9QRU5TU0xfVkVSU0lPTl9OT19USFJFQURfSUQgMHgxMDAwMDAwMEwKKworCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0U1NMU29ja2V0UHJvcGVydGllcworeworICBQUk9QX1RIUklGVF9TU0xfU09DS0VUX0NPTlRFWFQgPSAzLAorICBQUk9QX1RIUklGVF9TU0xfU0VMRl9TSUdORUQKK307CisKKy8qIFRvIGhvbGQgYSBnbG9iYWwgc3RhdGUgbWFuYWdlbWVudCBvZiBvcGVuc3NsIGZvciBhbGwgaW5zdGFuY2VzICovCitzdGF0aWMgZ2Jvb2xlYW4gdGhyaWZ0X3NzbF9zb2NrZXRfb3BlbnNzbF9pbml0aWFsaXplZD1GQUxTRTsKKy8qIFRoaXMgYXJyYXkgd2lsbCBzdG9yZSBhbGwgb2YgdGhlIG11dGV4ZXMgYXZhaWxhYmxlIHRvIE9wZW5TU0wuICovCitzdGF0aWMgTVVURVhfVFlQRSAqdGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1Zj1OVUxMOworCisKKy8qKgorICogT3BlblNTTCB1bmlxIGlkIGZ1bmN0aW9uLgorICoKKyAqIEByZXR1cm4gICAgdGhyZWFkIGlkCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY19pZF9mdW5jdGlvbih2b2lkKQoreworI2lmIGRlZmluZWQoV0lOMzIpCisgIHJldHVybiBHZXRDdXJyZW50VGhyZWFkSWQoKTsKKyNlbHNlCisgIHJldHVybiAoKHVuc2lnbmVkIGxvbmcpIHB0aHJlYWRfc2VsZigpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCB0aHJpZnRfc3NsX3NvY2tldF9zdGF0aWNfbG9ja2luZ19jYWxsYmFjayhpbnQgbW9kZSwgaW50IG4sIGNvbnN0IGNoYXIqIHVuaywgaW50IGlkKSB7CisgIGlmIChtb2RlICYgQ1JZUFRPX0xPQ0spCisgICAgTVVURVhfTE9DSyh0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmW25dKTsKKyAgZWxzZQorICAgIE1VVEVYX1VOTE9DSyh0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmW25dKTsKK30KKworc3RhdGljIGludCB0aHJpZnRfc3NsX3NvY2tldF9zdGF0aWNfdGhyZWFkX3NldHVwKHZvaWQpCit7CisgIGludCBpOworCisgIHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWYgPSBtYWxsb2MoQ1JZUFRPX251bV9sb2NrcygpICogc2l6ZW9mKE1VVEVYX1RZUEUpKTsKKyAgaWYgKCF0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmKQorICAgIHJldHVybiAwOworICBmb3IgKGkgPSAwOyAgaSA8IENSWVBUT19udW1fbG9ja3MoICApOyAgaSsrKQorICAgIE1VVEVYX1NFVFVQKHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWZbaV0pOworICBDUllQVE9fc2V0X2lkX2NhbGxiYWNrKHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY19pZF9mdW5jdGlvbik7CisgIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayh0aHJpZnRfc3NsX3NvY2tldF9zdGF0aWNfbG9ja2luZ19jYWxsYmFjayk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY190aHJlYWRfY2xlYW51cCh2b2lkKQoreworICBpbnQgaTsKKyAgaWYgKCF0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmKQorICAgIHJldHVybiAwOworICBDUllQVE9fc2V0X2lkX2NhbGxiYWNrKE5VTEwpOworICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soTlVMTCk7CisgIGZvciAoaSA9IDA7ICBpIDwgQ1JZUFRPX251bV9sb2NrcyggICk7ICBpKyspCisgICAgTVVURVhfQ0xFQU5VUCh0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmW2ldKTsKKyAgZnJlZSh0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmKTsKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1ZiA9IE5VTEw7CisgIHJldHVybiAxOworfQorCisvKgorc3RhdGljIHZvaWQqIHRocmlmdF9zc2xfc29ja2V0X2R5bl9sb2NrX2NyZWF0ZV9jYWxsYmFjayhjb25zdCBjaGFyKiB1bmssIGludCBpZCkgeworICBnX3ByaW50KCJXZSBzaG91bGQgY3JlYXRlIGEgbG9ja1xuIik7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCB0aHJpZnRfc3NsX3NvY2tldF9keW5fbG9ja19jYWxsYmFjayhpbnQgbW9kZSwgdm9pZCogbG9jaywgY29uc3QgY2hhciogdW5rLCBpbnQgaWQpIHsKKyAgaWYgKGxvY2sgIT0gTlVMTCkgeworICAgIGlmIChtb2RlICYgQ1JZUFRPX0xPQ0spIHsKKyAgICAgIGdfcHJpbnRmKCJXZSBzaG91bGQgbG9jayB0aHJlYWQgJWRcbiIpOworICAgIH0gZWxzZSB7CisgICAgICBnX3ByaW50ZigiV2Ugc2hvdWxkIHVubG9jayB0aHJlYWQgJWRcbiIpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCB0aHJpZnRfc3NsX3NvY2tldF9keW5fbG9ja19kZXN0cm95X2NhbGxiYWNrKHZvaWQqIGxvY2ssIGNvbnN0IGNoYXIqIHVuaywgaW50IGlkKSB7CisgIGdfcHJpbnRmKCJXZSBtdXN0IGRlc3Ryb3kgdGhlIGxvY2tcbiIpOworfQorICovCisKKworR19ERUZJTkVfVFlQRShUaHJpZnRTU0xTb2NrZXQsIHRocmlmdF9zc2xfc29ja2V0LCBUSFJJRlRfVFlQRV9TT0NLRVQpCisKKworCisvKioKKyAqIFdoZW4gdGhlcmUncyBhIHRocmVhZCBjb250ZXh0IGF0dGFjaGVkLCB3ZSBwYXNzIHRoZSBTU0wgc29ja2V0IGNvbnRleHQgc28gaXQKKyAqIGNhbiBjaGVjayBpZiB0aGUgZXJyb3IgaXMgb3V0c2lkZSBTU0wsIG9uIEkvTyBmb3IgZXhhbXBsZQorICogQHBhcmFtIHNvY2tldAorICogQHBhcmFtIGVycm9yX21zZworICogQHBhcmFtIHRocmlmdF9lcnJvcl9ubworICogQHBhcmFtIHNzbF9lcnJvcgorICogQHBhcmFtIGVycm9yCisgKi8KK3N0YXRpYwordm9pZCB0aHJpZnRfc3NsX3NvY2tldF9nZXRfc3NsX2Vycm9yKFRocmlmdFNTTFNvY2tldCAqc29ja2V0LCBjb25zdCBndWNoYXIgKmVycm9yX21zZywgZ3VpbnQgdGhyaWZ0X2Vycm9yX25vLCBpbnQgc3NsX2Vycm9yLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlOworICBjaGFyIGJ1ZmZlclsxMDI0XTsKKyAgaW50IGJ1ZmZlcl9zaXplPTEwMjQ7CisgIGdib29sZWFuIGZpcnN0X2Vycm9yID0gVFJVRTsKKyAgaW50IHNzbF9lcnJvcl90eXBlID0gU1NMX2dldF9lcnJvcihzb2NrZXQtPnNzbCwgc3NsX2Vycm9yKTsKKyAgaWYoc3NsX2Vycm9yX3R5cGU+MCl7CisgICAgICBzd2l0Y2goc3NsX2Vycm9yX3R5cGUpeworCWNhc2UgU1NMX0VSUk9SX1NTTDoKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIsIGJ1ZmZlcl9zaXplLCAiU1NMICVzOiAiLCBlcnJvcl9tc2cpOworCSAgd2hpbGUgKChlcnJvcl9jb2RlID0gRVJSX2dldF9lcnJvcigpKSAhPSAwICYmIGJ1ZmZlcl9zaXplPjEpIHsKKwkgICAgICBjb25zdCBjaGFyKiByZWFzb24gPSBFUlJfcmVhc29uX2Vycm9yX3N0cmluZyhlcnJvcl9jb2RlKTsKKwkgICAgICBpZihyZWFzb24hPU5VTEwpeworCQkgIGlmKCFmaXJzdF9lcnJvcikgeworCQkgICAgICBidWZmZXJfc2l6ZS09c25wcmludGYoYnVmZmVyKygxMDI0LWJ1ZmZlcl9zaXplKSwgYnVmZmVyX3NpemUsICJcblx0Iik7CisJCSAgICAgIGZpcnN0X2Vycm9yPUZBTFNFOworCQkgIH0KKwkJICBidWZmZXJfc2l6ZS09c25wcmludGYoYnVmZmVyKygxMDI0LWJ1ZmZlcl9zaXplKSwgYnVmZmVyX3NpemUsICIlbFgoJXMpIC0+ICVzIiwgZXJyb3JfY29kZSwgcmVhc29uLCBTU0xfc3RhdGVfc3RyaW5nKHNvY2tldC0+c3NsKSk7CisJICAgICAgfQorCSAgfQorCSAgYnJlYWs7CisJY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIsIGJ1ZmZlcl9zaXplLCAiJXM6ICIsIGVycm9yX21zZyk7CisJICBidWZmZXJfc2l6ZS09c25wcmludGYoYnVmZmVyKygxMDI0LWJ1ZmZlcl9zaXplKSwgYnVmZmVyX3NpemUsICIlbFggLT4gJXMiLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwkgIGJyZWFrOworCWNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIsIGJ1ZmZlcl9zaXplLCAiJXM6ICIsIGVycm9yX21zZyk7CisJICBidWZmZXJfc2l6ZS09c25wcmludGYoYnVmZmVyKygxMDI0LWJ1ZmZlcl9zaXplKSwgYnVmZmVyX3NpemUsICIlbFggLT4gJXMiLCBzc2xfZXJyb3JfdHlwZSwgIkVycm9yIHdoaWxlIHJlYWRpbmcgZnJvbSB1bmRlcmxheWluZyBsYXllciIpOworCSAgYnJlYWs7CisJY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIsIGJ1ZmZlcl9zaXplLCAiJXM6ICIsIGVycm9yX21zZyk7CisJICBidWZmZXJfc2l6ZS09c25wcmludGYoYnVmZmVyKygxMDI0LWJ1ZmZlcl9zaXplKSwgYnVmZmVyX3NpemUsICIlbFggLT4gJXMiLCBzc2xfZXJyb3JfdHlwZSwgIkVycm9yIHdoaWxlIHdyaXR0aW5nIHRvIHVuZGVybGF5aW5nIGxheWVyIik7CisJICBicmVhazsKKworICAgICAgfQorICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkgICB0aHJpZnRfZXJyb3Jfbm8sICIlcyIsIGJ1ZmZlcik7CisgIH0KK30KKworLyoqCisgKiBGb3IgZ2xvYmFsIFNTTCBlcnJvcnMKKyAqIEBwYXJhbSBlcnJvcl9tc2cKKyAqIEBwYXJhbSB0aHJpZnRfZXJyb3Jfbm8KKyAqIEBwYXJhbSBlcnJvcgorICovCitzdGF0aWMKK3ZvaWQgdGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X2Vycm9yKGNvbnN0IGd1Y2hhciAqZXJyb3JfbXNnLCBndWludCB0aHJpZnRfZXJyb3Jfbm8sIEdFcnJvciAqKmVycm9yKQoreworICB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGU7CisgIHdoaWxlICgoZXJyb3JfY29kZSA9IEVSUl9nZXRfZXJyb3IoKSkgIT0gMCkgeworICAgICAgY29uc3QgY2hhciogcmVhc29uID0gRVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcoZXJyb3JfY29kZSk7CisgICAgICBpZiAocmVhc29uID09IE5VTEwpIHsKKwkgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJICAgICAgIHRocmlmdF9lcnJvcl9ubywKKwkJICAgICAgICJTU0wgZXJyb3IgJWxYOiAlcyIsIGVycm9yX2NvZGUsIGVycm9yX21zZyk7CisgICAgICB9ZWxzZXsKKwkgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJICAgICAgIHRocmlmdF9lcnJvcl9ubywKKwkJICAgICAgICJTU0wgZXJyb3IgJWxYICVzOiAlcyIsIGVycm9yX2NvZGUscmVhc29uLCBlcnJvcl9tc2cpOworICAgICAgfQorICB9Cit9CisKKworCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICByZXR1cm4gdGhyaWZ0X3NvY2tldF9pc19vcGVuKHRyYW5zcG9ydCk7Cit9CisKKy8qIG92ZXJyaWRlcyB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9wZWVrIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdib29sZWFuIHJldHZhbCA9IEZBTFNFOworICBUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgaWYgKHRocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkpCisgICAgeworICAgICAgaW50IHJjOworICAgICAgZ2NoYXIgYnl0ZTsKKyAgICAgIHJjID0gU1NMX3BlZWsoc3NsX3NvY2tldC0+c3NsLCAmYnl0ZSwgMSk7CisgICAgICBpZiAocmMgPCAwKSB7CisJICB0aHJpZnRfc3NsX3NvY2tldF9nZXRfc3NsX2Vycm9yKHNzbF9zb2NrZXQsICJDaGVjayBzb2NrZXQgZGF0YSIsCisJCQkJCSAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfU1NMLCByYywgZXJyb3IpOworICAgICAgfQorICAgICAgaWYgKHJjID09IDApIHsKKwkgIEVSUl9jbGVhcl9lcnJvcigpOworICAgICAgfQorICAgICAgcmV0dmFsID0gKHJjID4gMCk7CisgICAgfQorICByZXR1cm4gcmV0dmFsOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgRVJSX2NsZWFyX2Vycm9yKCk7CisKKyAgaWYgKCF0aHJpZnRfc29ja2V0X29wZW4odHJhbnNwb3J0LCBlcnJvcikpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmICghVEhSSUZUX1NTTF9TT0NLRVRfR0VUX0NMQVNTKHRyYW5zcG9ydCktPmhhbmRsZV9oYW5kc2hha2UodHJhbnNwb3J0LCBlcnJvcikpIHsKKyAgICAgIHRocmlmdF9zc2xfc29ja2V0X2Nsb3NlKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2Jvb2xlYW4gcmV0dmFsID0gRkFMU0U7CisgIFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUKHRyYW5zcG9ydCk7CisgIGlmKHNzbF9zb2NrZXQhPU5VTEwgJiYgc3NsX3NvY2tldC0+c3NsKSB7CisgICAgICBpbnQgcmMgPSBTU0xfc2h1dGRvd24oc3NsX3NvY2tldC0+c3NsKTsKKy8qICAgICAgaWYgKHJjIDwgMCkgeworCSAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0w7CisgICAgICB9Ki8KKyAgICAgIFNTTF9mcmVlKHNzbF9zb2NrZXQtPnNzbCk7CisgICAgICBzc2xfc29ja2V0LT5zc2wgPSBOVUxMOworICAgICAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKKyAgfQorICByZXR1cm4gdGhyaWZ0X3NvY2tldF9jbG9zZSh0cmFuc3BvcnQsIGVycm9yKTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKi8KK2dpbnQzMgordGhyaWZ0X3NzbF9zb2NrZXRfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKwkJCWd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ3VpbnQgbWF4UmVjdlJldHJpZXNfID0gMTA7CisgIFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUICh0cmFuc3BvcnQpOworICBndWludCBieXRlcyA9IDA7CisgIGd1aW50IHJldHJpZXMgPSAwOworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzb2NrZXQtPnNkICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCAmJiBzc2xfc29ja2V0LT5zc2whPU5VTEwsIEZBTFNFKTsKKworICBmb3IgKHJldHJpZXM9MDsgcmV0cmllcyA8IG1heFJlY3ZSZXRyaWVzXzsgcmV0cmllcysrKSB7CisgICAgICBieXRlcyA9IFNTTF9yZWFkKHNzbF9zb2NrZXQtPnNzbCwgYnVmLCBsZW4pOworICAgICAgaWYgKGJ5dGVzID49IDApCisJYnJlYWs7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgaWYgKFNTTF9nZXRfZXJyb3Ioc3NsX3NvY2tldC0+c3NsLCBieXRlcykgPT0gU1NMX0VSUk9SX1NZU0NBTEwpIHsKKwkgIGlmIChFUlJfZ2V0X2Vycm9yKCkgPT0gMCAmJiBlcnJub19jb3B5ID09IFRIUklGVF9FSU5UUikgeworCSAgICAgIGNvbnRpbnVlOworCSAgfQorICAgICAgfWVsc2V7CisJICB0aHJpZnRfc3NsX3NvY2tldF9nZXRfc3NsX2Vycm9yKHNzbF9zb2NrZXQsICJSZWNlaXZlIGVycm9yIiwKKwkJCQkJICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0wsIGJ5dGVzLCBlcnJvcik7CisKKyAgICAgIH0KKyAgICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gYnl0ZXM7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZAorICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgY29uc3QgZ3BvaW50ZXIgYnVmLAorCQkJIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGdpbnQgcmV0ID0gMDsKKyAgZ3VpbnQgc2VudCA9IDA7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNvY2tldC0+c2QgIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUICYmIHNzbF9zb2NrZXQtPnNzbCE9TlVMTCwgRkFMU0UpOworCisgIHdoaWxlIChzZW50IDwgbGVuKQorICAgIHsKKyAgICAgIHJldCA9IFNTTF93cml0ZSAoc3NsX3NvY2tldC0+c3NsLCAoZ3VpbnQ4ICopYnVmICsgc2VudCwgbGVuIC0gc2VudCk7CisgICAgICBpZiAocmV0IDwgMCkKKwl7CisJICB0aHJpZnRfc3NsX3NvY2tldF9nZXRfc3NsX2Vycm9yKHNzbF9zb2NrZXQsICJTZW5kIGVycm9yIiwKKwkJCQkJICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0wsIHJldCwgZXJyb3IpOworCSAgcmV0dXJuIEZBTFNFOworCX0KKyAgICAgIHNlbnQgKz0gcmV0OworICAgIH0KKworICByZXR1cm4gc2VudD09bGVuOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kCisgKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF93cml0ZV9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaAorICogZmx1c2ggcGVuZGluZyBkYXRhLiAgc2luY2Ugd2UgYXJlIG5vdCBidWZmZXJlZCwgdGhpcyBpcyBhIG5vLW9wICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfZmx1c2ggKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGdpbnQgcmV0ID0gMDsKKyAgZ3VpbnQgc2VudCA9IDA7CisKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc29ja2V0LT5zZCAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgJiYgc3NsX3NvY2tldC0+c3NsIT1OVUxMLCBGQUxTRSk7CisKKyAgQklPKiBiaW8gPSBTU0xfZ2V0X3diaW8oc3NsX3NvY2tldC0+c3NsKTsKKyAgaWYgKGJpbyA9PSBOVUxMKSB7CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCSAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfU0VORCwKKwkJICAgImZhaWxlZCB0byBmbHVzaCwgd2JpbyByZXR1cm5lZCBudWxsIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKEJJT19mbHVzaChiaW8pICE9IDEpIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TRU5ELAorCQkgICAiZmFpbGVkIHRvIGZsdXNoIGl0IHJldHVybmVkIGVycm9yIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X2hhbmRsZV9oYW5kc2hha2UoVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSwgRkFMU0UpOworCisgIGlmKFRIUklGVF9TU0xfU09DS0VUX0dFVF9DTEFTUyhzc2xfc29ja2V0KS0+Y3JlYXRlX3NzbF9jb250ZXh0KHRyYW5zcG9ydCwgZXJyb3IpKXsKKyAgICAgIC8qQ29udGV4dCBjcmVhdGVkKi8KKyAgICAgIFNTTF9zZXRfZmQoc3NsX3NvY2tldC0+c3NsLCBzb2NrZXQtPnNkKTsKKyAgICAgIGludCByYzsKKyAgICAgIGlmKHNzbF9zb2NrZXQtPnNlcnZlcil7CisJICByYyA9IFNTTF9hY2NlcHQoc3NsX3NvY2tldC0+c3NsKTsKKyAgICAgIH1lbHNleworCSAgcmMgPSBTU0xfY29ubmVjdChzc2xfc29ja2V0LT5zc2wpOworICAgICAgfQorICAgICAgaWYgKHJjIDw9IDApIHsKKwkgIHRocmlmdF9zc2xfc29ja2V0X2dldF9zc2xfZXJyb3Ioc3NsX3NvY2tldCwgIkVycm9yIHdoaWxlIGNvbm5lY3QvYmluZCIsIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX0NPTk5FQ1RfQklORCwgcmMsIGVycm9yKTsKKwkgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfWVsc2UKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIHRocmlmdF9zc2xfc29ja2V0X2F1dGhvcml6ZSh0cmFuc3BvcnQsIGVycm9yKTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X2NyZWF0ZV9zc2xfY29udGV4dChUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUICh0cmFuc3BvcnQpOworCisgIGlmKHNvY2tldC0+Y3R4IT1OVUxMKXsKKyAgICAgIGlmKHNvY2tldC0+c3NsIT1OVUxMKSB7CisJICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKworICAgICAgc29ja2V0LT5zc2wgPSBTU0xfbmV3KHNvY2tldC0+Y3R4KTsKKyAgICAgIGlmIChzb2NrZXQtPnNzbCA9PSBOVUxMKSB7CisJICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCSAgICAgICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9UUkFOU1BPUlQsCisJCSAgICAgICAiVW5hYmxlIHRvIGNyZWF0ZSBkZWZhdWx0IFNTTCBjb250ZXh0Iik7CisJICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCitnYm9vbGVhbiB0aHJpZnRfc3NsX2xvYWRfY2VydF9mcm9tX2ZpbGUoVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0LCBjb25zdCBjaGFyICpmaWxlX25hbWUpCit7CisgIGNoYXIgZXJyb3JfYnVmZmVyWzI1NV07CisgIGlmICghdGhyaWZ0X3NzbF9zb2NrZXRfb3BlbnNzbF9pbml0aWFsaXplZCkgeworICAgICAgZ19lcnJvcigiT3BlblNTTCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50IHJjID0gU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc3NsX3NvY2tldC0+Y3R4LCBmaWxlX25hbWUsIE5VTEwpOworICBpZiAocmMgIT0gMSkgeyAvKnZlcmlmeSBhdXRoZW50aWNhdGlvbiByZXN1bHQqLworICAgICAgRVJSX2Vycm9yX3N0cmluZ19uKEVSUl9nZXRfZXJyb3IoKSwgZXJyb3JfYnVmZmVyLCAyNTQpOworICAgICAgZ193YXJuaW5nKCJMb2FkIG9mIGNlcnRpZmljYXRlcyBmYWlsZWQ6ICVzISIsIGVycm9yX2J1ZmZlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKworZ2Jvb2xlYW4gdGhyaWZ0X3NzbF9sb2FkX2NlcnRfZnJvbV9idWZmZXIoVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0LCBjb25zdCBjaGFyIGNoYWluX2NlcnRzW10pCit7CisgIGdib29sZWFuIHJldHZhbCA9IEZBTFNFOworICAvKiBMb2FkIGNoYWluIG9mIGNlcnRzKi8KKyAgWDUwOSAqY2FjZXJ0PU5VTEw7CisgIEJJTyAqbWVtID0gQklPX25ld19tZW1fYnVmKGNoYWluX2NlcnRzLHN0cmxlbihjaGFpbl9jZXJ0cykpOworICBYNTA5X1NUT1JFICpjZXJ0X3N0b3JlID0gU1NMX0NUWF9nZXRfY2VydF9zdG9yZShzc2xfc29ja2V0LT5jdHgpOworCisgIGlmKGNlcnRfc3RvcmUhPU5VTEwpeworICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgIHdoaWxlICgoY2FjZXJ0ID0gUEVNX3JlYWRfYmlvX1g1MDkobWVtLCBOVUxMLCAwLCBOVUxMKSkhPU5VTEwpIHsKKwkgIGlmKGNhY2VydCkgeworCSAgICAgIFg1MDlfU1RPUkVfYWRkX2NlcnQoY2VydF9zdG9yZSwgY2FjZXJ0KTsKKwkgICAgICBYNTA5X2ZyZWUoY2FjZXJ0KTsKKwkgICAgICBjYWNlcnQ9TlVMTDsKKwkgIH0gLyogRnJlZSBpbW1lZGlhdGVseSAqLworCSAgaW5kZXgrKzsKKyAgICAgIH0KKyAgICAgIHJldHZhbD1UUlVFOworICB9CisgIEJJT19mcmVlKG1lbSk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9hdXRob3JpemUoVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworICBUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgVGhyaWZ0U1NMU29ja2V0Q2xhc3MgKmNscyA9IFRIUklGVF9TU0xfU09DS0VUX0dFVF9DTEFTUyhzc2xfc29ja2V0KTsKKyAgZ2Jvb2xlYW4gYXV0aG9yaXphdGlvbl9yZXN1bHQgPSBGQUxTRTsKKworICBpZihjbHMhPU5VTEwgJiYgc3NsX3NvY2tldC0+c3NsIT1OVUxMKXsKKyAgICAgIGludCByYyA9IFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChzc2xfc29ja2V0LT5zc2wpOworICAgICAgaWYgKHJjICE9IFg1MDlfVl9PSykgeyAvKiB2ZXJpZnkgYXV0aGVudGljYXRpb24gcmVzdWx0ICovCisJICBpZiAocmMgPT0gWDUwOV9WX0VSUl9ERVBUSF9aRVJPX1NFTEZfU0lHTkVEX0NFUlQgJiYgc3NsX3NvY2tldC0+YWxsb3dfc2VsZnNpZ25lZCkgeworCSAgICAgIGdfZGVidWcoIlRoZSBjZXJ0aWZpY2F0ZSBpcyBhIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIGFuZCBjb25maWd1cmF0aW9uIGFsbG93cyBpdCIpOworCSAgfSBlbHNlIHsKKwkgICAgICBnX3NldF9lcnJvciAoZXJyb3IsCisJCQkgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkJICAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfU1NMX0NFUlRfVkFMSURBVElPTl9GQUlMRUQsCisJCQkgICAiVGhlIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBmYWlsZWQ6ICVzICglZCkiLCBYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhyYyksIHJjKTsKKwkgICAgICByZXR1cm4gRkFMU0U7CisJICB9CisgICAgICB9CisKKyAgICAgIFg1MDkqIGNlcnQgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc3NsX3NvY2tldC0+c3NsKTsKKyAgICAgIGlmIChjZXJ0ID09IE5VTEwpIHsKKwkgIGlmIChTU0xfZ2V0X3ZlcmlmeV9tb2RlKHNzbF9zb2NrZXQtPnNzbCkgJiBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUKSB7CisJICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorCQkJICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJCSAgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTF9DRVJUX1ZBTElEQVRJT05fRkFJTEVELAorCQkJICAgIk5vIGNlcnRpZmljYXRlIHByZXNlbnQuIEFyZSB5b3UgY29ubmVjdGluZyBTU0wgc2VydmVyPyIpOworCSAgICAgIHJldHVybiBGQUxTRTsKKwkgIH0KKwkgIGdfZGVidWcoIk5vIGNlcnRpZmljYXRlIHJlcXVpcmVkIik7CisJICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKworICAgICAgLyogY2VydGlmaWNhdGUgaXMgcHJlc2VudCwgc2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBhY2Nlc3MgbWFuYWdlciB3ZSBhcmUgZG9uZSAqLworICAgICAgaWYgKGNscy0+YXV0aG9yaXplX3BlZXIgPT0gTlVMTCkgeworCSAgWDUwOV9mcmVlKGNlcnQpOworCSAgZ19kZWJ1ZygiQ2VydGlmaWNhdGUgcHJlc2VudGVkIGJ1dCB3ZSdyZSBub3QgY2hlY2tpbmcgaXQiKTsKKwkgIHJldHVybiBUUlVFOworICAgICAgfSBlbHNlIHsKKwkgIC8qIGJvdGggY2VydGlmaWNhdGUgYW5kIGFjY2VzcyBtYW5hZ2VyIGFyZSBwcmVzZW50ICovCisJICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzYTsKKwkgIHNvY2tsZW5fdCBzYUxlbmd0aCA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSk7CisJICBpZiAoZ2V0cGVlcm5hbWUoc29ja2V0LT5zZCwgKHN0cnVjdCBzb2NrYWRkciopJnNhLCAmc2FMZW5ndGgpICE9IDApIHsKKwkgICAgICBzYS5zc19mYW1pbHkgPSBBRl9VTlNQRUM7CisJICB9CisJICBhdXRob3JpemF0aW9uX3Jlc3VsdCA9IGNscy0+YXV0aG9yaXplX3BlZXIodHJhbnNwb3J0LCBjZXJ0LCAmc2EsIGVycm9yKTsKKyAgICAgIH0KKyAgICAgIGlmKGNlcnQgIT0gTlVMTCkgeworCSAgWDUwOV9mcmVlKGNlcnQpOworICAgICAgfQorICB9CisKKyAgcmV0dXJuIGF1dGhvcml6YXRpb25fcmVzdWx0OworfQorCisKKy8qIGluaXRpYWxpemVzIHRoZSBpbnN0YW5jZSAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2luaXQgKFRocmlmdFNTTFNvY2tldCAqc29ja2V0KQoreworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKyAgc29ja2V0LT5zc2wgPSBOVUxMOworICBzb2NrZXQtPmN0eCA9IHRocmlmdF9zc2xfc29ja2V0X2NvbnRleHRfaW5pdGlhbGl6ZShTU0xUTFMsICZlcnJvcik7CisgIGlmKHNvY2tldC0+Y3R4ID09IE5VTEwpIHsKKyAgICAgIGdfaW5mbygiVGhlIFNTTCBjb250ZXh0IHdhcyBub3QgYXV0b21hdGljYWxseSBpbml0aWFsaXplZCB3aXRoIHByb3RvY29sICVkIiwgU1NMVExTKTsKKyAgICAgIGlmKGVycm9yIT1OVUxMKXsKKwkgIGdfaW5mbygiUmVwb3J0ZWQgcmVhc29uICVzIiwgZXJyb3ItPm1lc3NhZ2UpOworCSAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICB9CisgIH0KKyAgc29ja2V0LT5zZXJ2ZXIgPSBGQUxTRTsKKyAgc29ja2V0LT5hbGxvd19zZWxmc2lnbmVkID0gRkFMU0U7CisKK30KKworLyogZGVzdHJ1Y3RvciAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCit7CisgIFRocmlmdFNTTFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKG9iamVjdCk7CisgIEdFcnJvciAqZXJyb3I9TlVMTDsKKyAgaWYoc29ja2V0IT1OVUxMKXsKKyAgICAgIGdfZGVidWcoIkluc3RhbmNlICVwIGRlc3Ryb3llZCIsICh2b2lkICopc29ja2V0KTsKKyAgICAgIGlmKHNvY2tldC0+c3NsICE9IE5VTEwpCisJeworCSAgdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UoVEhSSUZUX1RSQU5TUE9SVChvYmplY3QpLCAmZXJyb3IpOworCSAgc29ja2V0LT5zc2w9TlVMTDsKKwl9CisKKyAgICAgIGlmKHNvY2tldC0+Y3R4IT1OVUxMKXsKKwkgIGdfZGVidWcoIkZyZWVpbmcgdGhlIGNvbnRleHQgZm9yIHRoZSBpbnN0YW5jZSIpOworCSAgU1NMX0NUWF9mcmVlKHNvY2tldC0+Y3R4KTsKKwkgIHNvY2tldC0+Y3R4PU5VTEw7CisgICAgICB9CisgIH0KKworICBpZiAoR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9zc2xfc29ja2V0X3BhcmVudF9jbGFzcyktPmZpbmFsaXplKQorICAgICgqR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9zc2xfc29ja2V0X3BhcmVudF9jbGFzcyktPmZpbmFsaXplKSAob2JqZWN0KTsKK30KKworLyogcHJvcGVydHkgYWNjZXNzb3IgKi8KK3ZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKwkJCQlHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAob2JqZWN0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TU0xfU09DS0VUX0NPTlRFWFQ6CisgICAgICBnX3ZhbHVlX3NldF9wb2ludGVyICh2YWx1ZSwgc29ja2V0LT5jdHgpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogcHJvcGVydHkgbXV0YXRvciAqLwordm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorCQkJCWNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUIChvYmplY3QpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NTTF9TT0NLRVRfQ09OVEVYVDoKKyAgICAgIGlmKHNvY2tldC0+Y3R4IT1OVUxMKXsKKwkgIGdfZGVidWcoIkZyZWVpbmcgdGhlIGNvbnRleHQgc2luY2Ugd2UgYXJlIHNldHRpbmcgYSBuZXcgb25lIik7CisJICBTU0xfQ1RYX2ZyZWUoc29ja2V0LT5jdHgpOworICAgICAgfQorICAgICAgc29ja2V0LT5jdHggPSBnX3ZhbHVlX2dldF9wb2ludGVyKHZhbHVlKTsgLyogV2UgY29weSB0aGUgY29udGV4dCAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NTTF9TRUxGX1NJR05FRDoKKyAgICAgIHNvY2tldC0+YWxsb3dfc2VsZnNpZ25lZCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4odmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfd2FybmluZygiVHJ5aW5nIHRvIHNldCBwcm9wZXJ0eSAlaSB0aGF0IGRvZXNuJ3QgZXhpc3RzISIsIHByb3BlcnR5X2lkKTsKKyAgICAgIC8qICAgIHRocmlmdF9zb2NrZXRfc2V0X3Byb3BlcnR5KG9iamVjdCwgcHJvcGVydHlfaWQsIHZhbHVlLCBwc3BlYyk7ICovCisgICAgICBicmVhazsKKyAgfQorfQorCit2b2lkCit0aHJpZnRfc3NsX3NvY2tldF9pbml0aWFsaXplX29wZW5zc2wodm9pZCkKK3sKKyAgaWYodGhyaWZ0X3NzbF9zb2NrZXRfb3BlbnNzbF9pbml0aWFsaXplZCl7CisgICAgICByZXR1cm47CisgIH0KKyAgdGhyaWZ0X3NzbF9zb2NrZXRfb3BlbnNzbF9pbml0aWFsaXplZD1UUlVFOworICBTU0xfbGlicmFyeV9pbml0KCk7CisgIEVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7CisgIFNTTF9sb2FkX2Vycm9yX3N0cmluZ3MoKTsKKyAgRVJSX2xvYWRfQklPX3N0cmluZ3MoKTsKKworICAvKiBTZXR1cCBsb2NraW5nICovCisgIGdfZGVidWcoIldlIHNldHVwICVkIHRocmVhZHMgbG9ja3MiLCB0aHJpZnRfc3NsX3NvY2tldF9zdGF0aWNfdGhyZWFkX3NldHVwKCkpOworCisgIC8qIGR5bmFtaWMgbG9ja2luZworICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKHRocmlmdF9zc2xfc29ja2V0X2R5bl9sb2NrX2NyZWF0ZV9jYWxsYmFjayk7CisgIENSWVBUT19zZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrKHRocmlmdF9zc2xfc29ja2V0X2R5bl9sb2NrX2NhbGxiYWNrKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2sodGhyaWZ0X3NzbF9zb2NrZXRfZHluX2xvY2tfZGVzdHJveV9jYWxsYmFjayk7CisgICAqLworfQorCisKK3ZvaWQgdGhyaWZ0X3NzbF9zb2NrZXRfZmluYWxpemVfb3BlbnNzbCh2b2lkKQoreworICBpZiAoIXRocmlmdF9zc2xfc29ja2V0X29wZW5zc2xfaW5pdGlhbGl6ZWQpIHsKKyAgICAgIHJldHVybjsKKyAgfQorICB0aHJpZnRfc3NsX3NvY2tldF9vcGVuc3NsX2luaXRpYWxpemVkID0gRkFMU0U7CisKKyAgZ19kZWJ1ZygiV2UgY2xlYXJlZCAlZCB0aHJlYWRzIGxvY2tzIiwgdGhyaWZ0X3NzbF9zb2NrZXRfc3RhdGljX3RocmVhZF9jbGVhbnVwKCkpOworICAvKiBOb3Qgc3VwcG9ydGVkCisgIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayhOVUxMKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayhOVUxMKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2soTlVMTCk7CisgIENSWVBUT19zZXRfZHlubG9ja19kZXN0cm95X2NhbGxiYWNrKE5VTEwpOworICAgKi8KKyAgRVJSX2ZyZWVfc3RyaW5ncygpOworICBFVlBfY2xlYW51cCgpOworICBDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSgpOworICBFUlJfcmVtb3ZlX3N0YXRlKDApOworfQorCisKKy8qIGluaXRpYWxpemVzIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2NsYXNzX2luaXQgKFRocmlmdFNTTFNvY2tldENsYXNzICpjbHMpCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzICp0dGMgPSBUSFJJRlRfVFJBTlNQT1JUX0NMQVNTIChjbHMpOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKKyAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYyA9IE5VTEw7CisKKyAgZ19kZWJ1ZygiSW5pdGlhbGl6YXRpb24gb2YgVGhyaWZ0U1NMU29ja2V0Q2xhc3MiKTsKKyAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfc3NsX3NvY2tldF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9zc2xfc29ja2V0X3NldF9wcm9wZXJ0eTsKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19wb2ludGVyICgic3NsX2NvbnRleHQiLAorCQkJCSAgICAgIlNTTENvbnRleHQiLAorCQkJCSAgICAgIlNldCB0aGUgU1NMIGNvbnRleHQgZm9yIGhhbmRzaGFrZSB3aXRoIHRoZSByZW1vdGUgaG9zdCIsCisJCQkJICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVEhSSUZUX1NTTF9TT0NLRVRfQ09OVEVYVCwKKwkJCQkgICBwYXJhbV9zcGVjKTsKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19ib29sZWFuICgic3NsX2FjY2VwdF9zZWxmc2lnbmVkIiwKKwkJCQkgICAgICJBY2NlcHQgU2VsZiBTaWduZWQiLAorCQkJCSAgICAgIldoZXRoZXIgb3Igbm90IGFjY2VwdCBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZSIsCisJCQkJICAgICBGQUxTRSwKKwkJCQkgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9USFJJRlRfU1NMX1NFTEZfU0lHTkVELAorCQkJCSAgIHBhcmFtX3NwZWMpOworICAvKiBDbGFzcyBtZXRob2RzICovCisgIGNscy0+aGFuZGxlX2hhbmRzaGFrZSA9IHRocmlmdF9zc2xfc29ja2V0X2hhbmRsZV9oYW5kc2hha2U7CisgIGNscy0+Y3JlYXRlX3NzbF9jb250ZXh0ID0gdGhyaWZ0X3NzbF9zb2NrZXRfY3JlYXRlX3NzbF9jb250ZXh0OworCisgIC8qIE92ZXJyaWRlICovCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X3NzbF9zb2NrZXRfZmluYWxpemU7CisgIHR0Yy0+aXNfb3BlbiA9IHRocmlmdF9zc2xfc29ja2V0X2lzX29wZW47CisgIHR0Yy0+cGVlayA9IHRocmlmdF9zc2xfc29ja2V0X3BlZWs7CisgIHR0Yy0+b3BlbiA9IHRocmlmdF9zc2xfc29ja2V0X29wZW47CisgIHR0Yy0+Y2xvc2UgPSB0aHJpZnRfc3NsX3NvY2tldF9jbG9zZTsKKyAgdHRjLT5yZWFkID0gdGhyaWZ0X3NzbF9zb2NrZXRfcmVhZDsKKyAgdHRjLT5yZWFkX2VuZCA9IHRocmlmdF9zc2xfc29ja2V0X3JlYWRfZW5kOworICB0dGMtPndyaXRlID0gdGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGU7CisgIHR0Yy0+d3JpdGVfZW5kID0gdGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGVfZW5kOworICB0dGMtPmZsdXNoID0gdGhyaWZ0X3NzbF9zb2NrZXRfZmx1c2g7Cit9CisKKworLyoKKyAqIFB1YmxpYyBBUEkKKyAqLworVGhyaWZ0U1NMU29ja2V0KgordGhyaWZ0X3NzbF9zb2NrZXRfbmV3KFRocmlmdFNTTFNvY2tldFByb3RvY29sIHNzbF9wcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNTTFNvY2tldCAqdGhyaWZ0U1NMU29ja2V0ID0gTlVMTDsKKyAgU1NMX0NUWCAqc3NsX2NvbnRleHQgPSBOVUxMOworICAvKiBDcmVhdGUgdGhlIGNvbnRleHQgKi8KKyAgaWYoKHNzbF9jb250ZXh0PXRocmlmdF9zc2xfc29ja2V0X2NvbnRleHRfaW5pdGlhbGl6ZShzc2xfcHJvdG9jb2wsIGVycm9yKSk9PU5VTEwpeworICAgICAgZ193YXJuaW5nKCJXZSBjYW5ub3QgaW5pdGlhbGl6ZSBjb250ZXh0IGZvciBwcm90b2NvbCAlZCIsIHNzbF9wcm90b2NvbCk7CisgICAgICByZXR1cm4gdGhyaWZ0U1NMU29ja2V0OworICB9CisKKyAgLyogRklYTUUgaWYgdGhlIHByb3RvY29sIGlzIGRpZmZlcmVudD8gKi8KKyAgdGhyaWZ0U1NMU29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TU0xfU09DS0VULCAic3NsX2NvbnRleHQiLCBzc2xfY29udGV4dCwgTlVMTCk7CisgIHJldHVybiB0aHJpZnRTU0xTb2NrZXQ7Cit9CisKK1RocmlmdFNTTFNvY2tldCoKK3RocmlmdF9zc2xfc29ja2V0X25ld193aXRoX2hvc3QoVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgc3NsX3Byb3RvY29sLCBnY2hhciAqaG9zdG5hbWUsIGd1aW50IHBvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnRocmlmdFNTTFNvY2tldCA9IE5VTEw7CisgIFNTTF9DVFggKnNzbF9jb250ZXh0ID0gTlVMTDsKKyAgLyogQ3JlYXRlIHRoZSBjb250ZXh0ICovCisgIGlmKChzc2xfY29udGV4dD10aHJpZnRfc3NsX3NvY2tldF9jb250ZXh0X2luaXRpYWxpemUoc3NsX3Byb3RvY29sLCBlcnJvcikpPT1OVUxMKXsKKyAgICAgIC8qIEZJWE1FIERvIGVycm9yIGNvbnRyb2wgKi8KKyAgICAgIHJldHVybiB0aHJpZnRTU0xTb2NrZXQ7CisgIH0KKyAgLyogRklYTUUgaWYgdGhlIHByb3RvY29sIGlzIGRpZmZlcmVudD8gKi8KKyAgdGhyaWZ0U1NMU29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TU0xfU09DS0VULCAic3NsX2NvbnRleHQiLCBzc2xfY29udGV4dCwgImhvc3RuYW1lIiwgaG9zdG5hbWUsICJwb3J0IiwgcG9ydCwgTlVMTCk7CisgIHJldHVybiB0aHJpZnRTU0xTb2NrZXQ7Cit9CisKK3ZvaWQgdGhyaWZ0X3NzbF9zb2NrZXRfc2V0X21hbmFnZXIoVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0LCBBVVRIT1JJWkFUSU9OX01BTkFHRVJfQ0FMTEJBQ0sgY2FsbGJhY2spCit7CisgIFRocmlmdFNTTFNvY2tldENsYXNzICpzc2xTb2NrZXRDbGFzcyA9IFRIUklGVF9TU0xfU09DS0VUX0dFVF9DTEFTUyAoc3NsX3NvY2tldCk7CisgIGlmKHNzbFNvY2tldENsYXNzKXsKKyAgICAgIHNzbFNvY2tldENsYXNzLT5hdXRob3JpemVfcGVlciA9IGNhbGxiYWNrOworICB9Cit9CisKKworU1NMX0NUWCoKK3RocmlmdF9zc2xfc29ja2V0X2NvbnRleHRfaW5pdGlhbGl6ZShUaHJpZnRTU0xTb2NrZXRQcm90b2NvbCBzc2xfcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBTU0xfQ1RYKiBjb250ZXh0ID0gTlVMTDsKKyAgc3dpdGNoKHNzbF9wcm90b2NvbCl7CisgICAgY2FzZSBTU0xUTFM6CisgICAgICBjb250ZXh0ID0gU1NMX0NUWF9uZXcoU1NMdjIzX21ldGhvZCgpKTsKKyAgICAgIGJyZWFrOworI2lmbmRlZiBPUEVOU1NMX05PX1NTTDMKKyAgICBjYXNlIFNTTHYzOgorICAgICAgY29udGV4dCA9IFNTTF9DVFhfbmV3KFNTTHYzX21ldGhvZCgpKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBUTFN2MV8wOgorICAgICAgY29udGV4dCA9IFNTTF9DVFhfbmV3KFRMU3YxX21ldGhvZCgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVExTdjFfMToKKyAgICAgIGNvbnRleHQgPSBTU0xfQ1RYX25ldyhUTFN2MV8xX21ldGhvZCgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVExTdjFfMjoKKyAgICAgIGNvbnRleHQgPSBTU0xfQ1RYX25ldyhUTFN2MV8yX21ldGhvZCgpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCSAgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX0NJUEhFUl9OT1RfQVZBSUxBQkxFLAorCQkgICAiVGhlIFNTTCBwcm90b2NvbCBpcyB1bmtub3duIGZvciAlZCIsIHNzbF9wcm90b2NvbCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKGNvbnRleHQgPT0gTlVMTCkgeworICAgICAgdGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X2Vycm9yKCJObyBjaXBoZXIgb3ZlcmxheSIsIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX0NJUEhFUl9OT1RfQVZBSUxBQkxFLCBlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBTU0xfQ1RYX3NldF9tb2RlKGNvbnRleHQsIFNTTF9NT0RFX0FVVE9fUkVUUlkpOworCisgIC8qIERpc2FibGUgaG9ycmlibHkgaW5zZWN1cmUgU1NMdjIgYW5kIFNTTHYzIHByb3RvY29scyBidXQgYWxsb3cgYSBoYW5kc2hha2UKKyAgICAgd2l0aCBvbGRlciBjbGllbnRzIHNvIHRoZXkgZ2V0IGEgZ3JhY2VmdWwgZGVuaWFsLiAqLworICBpZiAoc3NsX3Byb3RvY29sID09IFNTTFRMUykgeworICAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjb250ZXh0LCBTU0xfT1BfTk9fU1NMdjIpOworICAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjb250ZXh0LCBTU0xfT1BfTk9fU1NMdjMpOyAgIC8qIFRIUklGVC0zMTY0ICovCisgIH0KKworICByZXR1cm4gY29udGV4dDsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhNDY1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmgKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1NTTF9TT0NLRVRfSAorI2RlZmluZSBfVEhSSUZUX1NTTF9TT0NLRVRfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfcGxhdGZvcm1fc29ja2V0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9zc2xfc29ja2V0LmgKKyAqICBcYnJpZWYgU1NMIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCB0cmFuc3BvcnQuICBTdWJjbGFzc2VzIHRoZQorICogICAgICAgICBUaHJpZnRTb2NrZXQgY2xhc3MuIEJhc2VkIG9uIHBsYWluIG9wZW5zc2wuCisgKiAgICAgICAgIEluIHRoZSBmdXR1cmUgd2Ugc2hvdWxkIHRha2UgYSBsb29rIHRvIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEwMTYKKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9TU0xfU09DS0VUICh0aHJpZnRfc3NsX3NvY2tldF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1NTTF9TT0NLRVQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9TU0xfU09DS0VULCBUaHJpZnRTU0xTb2NrZXQpKQorI2RlZmluZSBUSFJJRlRfSVNfU1NMX1NPQ0tFVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1NTTF9TT0NLRVQpKQorI2RlZmluZSBUSFJJRlRfU1NMX1NPQ0tFVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCwgVGhyaWZ0U1NMU29ja2V0Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfU1NMX1NPQ0tFVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCkpCisjZGVmaW5lIFRIUklGVF9TU0xfU09DS0VUX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCwgVGhyaWZ0U1NMU29ja2V0Q2xhc3MpKQorCisKKy8qIGRlZmluZSBlcnJvci9leGNlcHRpb24gdHlwZXMgKi8KK3R5cGVkZWYgZW51bQoreworICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9UUkFOU1BPUlQ9NywKKyAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfQ09OTkVDVF9CSU5ELAorICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9DSVBIRVJfTk9UX0FWQUlMQUJMRSwKKyAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfU1NMLAorICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0xfQ0VSVF9WQUxJREFUSU9OX0ZBSUxFRAorfSBUaHJpZnRTU0xTb2NrZXRFcnJvcjsKKworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U1NMU29ja2V0IFRocmlmdFNTTFNvY2tldDsKKworLyohCisgKiBUaHJpZnQgU1NMIFNvY2tldCBpbnN0YW5jZS4KKyAqLworc3RydWN0IF9UaHJpZnRTU0xTb2NrZXQKK3sKKyAgVGhyaWZ0U29ja2V0IHBhcmVudDsKKworICAvKiBwcml2YXRlICovCisgIFNTTCAqc3NsOworICBTU0xfQ1RYKiBjdHg7CisgIGdib29sZWFuIHNlcnZlcjsKKyAgZ2Jvb2xlYW4gYWxsb3dfc2VsZnNpZ25lZDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTU0xTb2NrZXRDbGFzcyBUaHJpZnRTU0xTb2NrZXRDbGFzczsKK3R5cGVkZWYgZ2Jvb2xlYW4gKCogQVVUSE9SSVpBVElPTl9NQU5BR0VSX0NBTExCQUNLKSAoVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0LCBYNTA5ICpjZXJ0LCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkciwgR0Vycm9yICoqZXJyb3IpOworCisvKiEKKyAqIFRocmlmdCBTb2NrZXQgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0U1NMU29ja2V0Q2xhc3MKK3sKKyAgVGhyaWZ0U29ja2V0Q2xhc3MgcGFyZW50OworCisgIGdib29sZWFuICgqIGhhbmRsZV9oYW5kc2hha2UpIChUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCogY3JlYXRlX3NzbF9jb250ZXh0KSAoVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisgIGdib29sZWFuICgqIGF1dGhvcml6ZV9wZWVyKSAoVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0LCBYNTA5ICpjZXJ0LCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkciwgR0Vycm9yICoqZXJyb3IpOworCisgIC8qIFBhZGRpbmcgdG8gYWxsb3cgYWRkaW5nIHVwIHRvIDEyIG5ldyB2aXJ0dWFsIGZ1bmN0aW9ucyB3aXRob3V0CisgICAqIGJyZWFraW5nIEFCSS4gKi8KKyAgZ3BvaW50ZXIgcGFkZGluZ1sxMl07Cit9OworCitlbnVtIF9UaHJpZnRTU0xTb2NrZXRQcm90b2NvbCB7CisgIFNTTFRMUyAgPSAwLCAgLyogU3VwcG9ydHMgU1NMdjIgYW5kIFNTTHYzIGhhbmRzaGFrZSBidXQgb25seSBuZWdvdGlhdGVzIGF0IFRMU3YxXzAgb3IgbGF0ZXIuICovCisvKlNTTHYyICAgPSAxLCAgIEhPUlJJQkxZIElOU0VDVVJFISAqLworICBTU0x2MyAgID0gMiwgIC8qIFN1cHBvcnRzIFNTTHYzIG9ubHkgLSBhbHNvIGhvcnJpYmx5IGluc2VjdXJlISAqLworICBUTFN2MV8wID0gMywgIC8qIFN1cHBvcnRzIFRMU3YxXzAgb3IgbGF0ZXIuICovCisgIFRMU3YxXzEgPSA0LCAgLyogU3VwcG9ydHMgVExTdjFfMSBvciBsYXRlci4gKi8KKyAgVExTdjFfMiA9IDUsICAvKiBTdXBwb3J0cyBUTFN2MV8yIG9yIGxhdGVyLiAqLworICBMQVRFU1QgID0gVExTdjFfMgorfTsKK3R5cGVkZWYgZW51bSBfVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2w7CisKKworLyogSW50ZXJuYWwgZnVuY3Rpb25zICovCitTU0xfQ1RYKgordGhyaWZ0X3NzbF9zb2NrZXRfY29udGV4dF9pbml0aWFsaXplKFRocmlmdFNTTFNvY2tldFByb3RvY29sIHNzbF9wcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworCisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCAqLworR1R5cGUgdGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X3R5cGUgKHZvaWQpOworCisvKiBQdWJsaWMgQVBJICovCisKKy8qKgorICogQGJyaWVmIFNldCBhIHBpbm5pbmcgbWFuYWdlciBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG9uZS4KKyAqCisgKiBUaGUgcGlubmluZyBtYW5hZ2VyIHdpbGwgYmUgdXNlZCBkdXJpbmcgdGhlIFNTTCBoYW5kc2hha2UgdG8gY2hlY2sgY2VydGlmaWNhdGUKKyAqIGFuZCBwaW5uaW5nIHBhcmFtZXRlcnMuCisgKgorICogQHBhcmFtIHNzbF9zb2NrZXQgU1NMIFNvY2tldCB0byBvcGVyYXRlIG9uLgorICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCB0YWtlIHRoZSBjb250cm9sIHdoaWxlIHZhbGlkYXRpbmcgcGlubmluZworICoKKyAqLwordm9pZCB0aHJpZnRfc3NsX3NvY2tldF9zZXRfbWFuYWdlcihUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQsIEFVVEhPUklaQVRJT05fTUFOQUdFUl9DQUxMQkFDSyBjYWxsYmFjayk7CisKKy8qIFRoaXMgaXMgdGhlIFNTTCBBUEkgKi8KKy8qKgorICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IFNTTCBjb250ZXh0IHdpdGggdGhlIHByb3RvY29sIHNwZWNpZmllZAorICogYW5kIGFzc2lnbiB0aGlzIG5ldyBjb250ZXh0IHRvIHRoZSBjcmVhdGVkIFRocmlmdFNTTFNvY2tldCB3aXRoIHNwZWNpZmllZCBob3N0OnBvcnQuCisgKiBAcGFyYW0gc3NsX3Byb3RvY29sCisgKiBAcGFyYW0gaG9zdG5hbWUKKyAqIEBwYXJhbSBwb3J0CisgKiBAcGFyYW0gZXJyb3IKKyAqIEByZXR1cm4KKyAqLworVGhyaWZ0U1NMU29ja2V0KgordGhyaWZ0X3NzbF9zb2NrZXRfbmV3X3dpdGhfaG9zdChUaHJpZnRTU0xTb2NrZXRQcm90b2NvbCBzc2xfcHJvdG9jb2wsIGdjaGFyICpob3N0bmFtZSwgZ3VpbnQgcG9ydCwgR0Vycm9yICoqZXJyb3IpOworCisvKioKKyAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBTU0wgY29udGV4dCB3aXRoIHRoZSBwcm90b2NvbCBzcGVjaWZpZWQKKyAqIGFuZCBhc3NpZ24gdGhpcyBuZXcgY29udGV4dCB0byB0aGUgY3JlYXRlZCBUaHJpZnRTU0xTb2NrZXQuCisgKiBAcGFyYW0gc3NsX3Byb3RvY29sCisgKiBAcGFyYW0gZXJyb3IKKyAqIEByZXR1cm4KKyAqLworVGhyaWZ0U1NMU29ja2V0KgordGhyaWZ0X3NzbF9zb2NrZXRfbmV3KFRocmlmdFNTTFNvY2tldFByb3RvY29sIHNzbF9wcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworCisvKioKKyAqIExvYWQgYSBjZXJ0aWZpY2F0ZSBjaGFpbiBmcm9tIGEgUEVNIGZpbGUuCisgKiBAcGFyYW0gc3NsX3NvY2tldCBUaGUgc3NsIHNvY2tldAorICogQHBhcmFtIGZpbGVfbmFtZSBUaGUgZmlsZSBuYW1lIG9mIHRoZSBQRU0gY2VydGlmaWNhdGUgY2hhaW4KKyAqIEByZXR1cm4KKyAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfbG9hZF9jZXJ0X2Zyb21fZmlsZShUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQsIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSk7CisKKy8qKgorICogTG9hZCBhIGNlcnRpZmljYXRlIGNoYWluIGZyb20gbWVtb3J5CisgKiBAcGFyYW0gc3NsX3NvY2tldCB0aGUgc3NsIHNvY2tldAorICogQHBhcmFtIGNoYWluX2NlcnRzIHRoZSBidWZmZXIgdG8gbG9hZCBQRU0gZnJvbQorICogQHJldHVybgorICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9sb2FkX2NlcnRfZnJvbV9idWZmZXIoVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0LCBjb25zdCBjaGFyIGNoYWluX2NlcnRzW10pOworCisvKioKKyAqIENoZWNrIGlmIHRoZSBzc2wgc29ja2V0IGlzIG9wZW4gYW5kIHJlYWR5IHRvIHNlbmQgYW5kIHJlY2VpdmUKKyAqIEBwYXJhbSB0cmFuc3BvcnQKKyAqIEByZXR1cm4gdHJ1ZSBpZiBvcGVuCisgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7CisKKworLyoqCisgKiBPcGVuIGNvbm5lY3Rpb24gaWYgcmVxdWlyZWQgYW5kIHNldCB0aGUgc29ja2V0IHRvIGJlIHJlYWR5IHRvIHNlbmQgYW5kIHJlY2VpdmUKKyAqIEBwYXJhbSB0cmFuc3BvcnQKKyAqIEBwYXJhbSBlcnJvcgorICogQHJldHVybiB0cnVlIGlmIG9wZXJhdGlvbiB3YXMgY29ycmVjdAorICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKworCisvKioKKyAqIEBicmllZiBJbml0aWFsaXphdGlvbiBmdW5jdGlvbgorICoKKyAqIEl0IHdpbGwgaW5pdGlhbGl6ZSBPcGVuU1NMIGZ1bmN0aW9uLiBUaGlzIGluaXRpYWxpemF0aW9uIHdpbGwgYmUgZG9uZSBhcHAKKyAqIHdpZGUuIFNvIGlmIHlvdSB3YW50IHRvIGluaXRpYWxpemUgaXQgYnkgeW91cnNlbGYgeW91IHNob3VsZCBub3QgY2FsbCBpdC4KKyAqIEJ1dCBpdCBtZWFucyB5b3UgbXVzdCBoYW5kbGUgT3BlblNTTCBpbml0aWFsaXphdGlvbiBhbmQgaGFuZGxlIGxvY2tpbmcuCisgKgorICogSXQgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgYW55dGhpbmcgZWxzZS4KKyAqCisgKgorICovCit2b2lkCit0aHJpZnRfc3NsX3NvY2tldF9pbml0aWFsaXplX29wZW5zc2wodm9pZCk7CisvKioKKyAqIEBicmllZiBGaW5hbGl6YXRpb24gZnVuY3Rpb24KKyAqCisgKiBJdCBjbGVhcnMgYWxsIHJlc291cmNlcyBpbml0aWFsaXplZCBpbiBpbml0aWFsaXplIGZ1bmN0aW9uLgorICoKKyAqIEl0IHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYW55dGhpbmcgZWxzZS4KKyAqCisgKgorICovCit2b2lkCit0aHJpZnRfc3NsX3NvY2tldF9maW5hbGl6ZV9vcGVuc3NsKHZvaWQpOworCitHX0VORF9ERUNMUworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkMjY3MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYwpAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKKy8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBzdHJpbmcgKi8KKyNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9ET01BSU4gInRocmlmdC10cmFuc3BvcnQtZXJyb3ItcXVhcmsiCisKK0dfREVGSU5FX0FCU1RSQUNUX1RZUEUoVGhyaWZ0VHJhbnNwb3J0LCB0aHJpZnRfdHJhbnNwb3J0LCBHX1RZUEVfT0JKRUNUKQorCitnYm9vbGVhbiAKK3RocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+aXNfb3BlbiAodHJhbnNwb3J0KTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90cmFuc3BvcnRfcGVlayAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPnBlZWsgKHRyYW5zcG9ydCwgZXJyb3IpOworfQorCitnYm9vbGVhbgordGhyaWZ0X3RyYW5zcG9ydF9vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+b3BlbiAodHJhbnNwb3J0LCBlcnJvcik7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+Y2xvc2UgKHRyYW5zcG9ydCwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF90cmFuc3BvcnRfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPnJlYWQgKHRyYW5zcG9ydCwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOworfQorCitnYm9vbGVhbgordGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPnJlYWRfZW5kICh0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90cmFuc3BvcnRfd3JpdGUgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+d3JpdGUgKHRyYW5zcG9ydCwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGVycm9yKTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+d3JpdGVfZW5kICh0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+Zmx1c2ggKHRyYW5zcG9ydCwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+cmVhZF9hbGwgKHRyYW5zcG9ydCwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGVycm9yKTsKK30KKworLyogYnkgZGVmYXVsdCwgcGVlayByZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuICovCitzdGF0aWMgZ2Jvb2xlYW4KK3RocmlmdF90cmFuc3BvcnRfcmVhbF9wZWVrIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5pc19vcGVuICh0cmFuc3BvcnQpOworfQorCitzdGF0aWMgZ2ludDMyCit0aHJpZnRfdHJhbnNwb3J0X3JlYWxfcmVhZF9hbGwgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKnR0YzsKKyAgZ3VpbnQzMiBoYXZlOworICBnaW50MzIgcmV0OworICBnaW50OCAqYnl0ZXM7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICB0dGMgPSBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KTsKKyAgaGF2ZSA9IDA7CisgIHJldCA9IDA7CisgIGJ5dGVzID0gKGdpbnQ4KikgYnVmOworCisgIHdoaWxlIChoYXZlIDwgbGVuKSB7CisgICAgaWYgKChyZXQgPSB0dGMtPnJlYWQgKHRyYW5zcG9ydCwgKGdwb2ludGVyKSAoYnl0ZXMgKyBoYXZlKSwgbGVuIC0gaGF2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGhhdmUgKz0gcmV0OworICB9CisKKyAgcmV0dXJuIGhhdmU7Cit9CisKKy8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBmb3IgVGhyaWZ0IHRyYW5zcG9ydHMgKi8KK0dRdWFyawordGhyaWZ0X3RyYW5zcG9ydF9lcnJvcl9xdWFyayAodm9pZCkKK3sKKyAgcmV0dXJuIGdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nIChUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX0RPTUFJTik7Cit9CisKKy8qIGNsYXNzIGluaXRpYWxpemVyIGZvciBUaHJpZnRUcmFuc3BvcnQgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfdHJhbnNwb3J0X2NsYXNzX2luaXQgKFRocmlmdFRyYW5zcG9ydENsYXNzICpjbHMpCit7CisgIC8qIHNldCB0aGVzZSBhcyB2aXJ0dWFsIG1ldGhvZHMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcyAqLworICBjbHMtPmlzX29wZW4gPSB0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW47CisgIGNscy0+b3BlbiA9IHRocmlmdF90cmFuc3BvcnRfb3BlbjsKKyAgY2xzLT5jbG9zZSA9IHRocmlmdF90cmFuc3BvcnRfY2xvc2U7CisgIGNscy0+cmVhZCA9IHRocmlmdF90cmFuc3BvcnRfcmVhZDsKKyAgY2xzLT5yZWFkX2VuZCA9IHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQ7CisgIGNscy0+d3JpdGUgPSB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlOworICBjbHMtPndyaXRlX2VuZCA9IHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kOworICBjbHMtPmZsdXNoID0gdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaDsKKworICAvKiBwcm92aWRlIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHBlZWsgYW5kIHJlYWRfYWxsIG1ldGhvZHMgKi8KKyAgY2xzLT5wZWVrID0gdGhyaWZ0X3RyYW5zcG9ydF9yZWFsX3BlZWs7CisgIGNscy0+cmVhZF9hbGwgPSB0aHJpZnRfdHJhbnNwb3J0X3JlYWxfcmVhZF9hbGw7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfdHJhbnNwb3J0X2luaXQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGJiNmY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfSAorI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfdHJhbnNwb3J0LmgKKyAqICBcYnJpZWYgQWJzdHJhY3QgY2xhc3MgZm9yIFRocmlmdCB0cmFuc3BvcnRzLgorICoKKyAqIEFuIGFic3RyYWN0IGNsYXNzIGlzIHVzZWQgaW5zdGVhZCBvZiBhbiBpbnRlcmZhY2UgYmVjYXVzZToKKyAqICAtIGludGVyZmFjZXMgY2FuJ3Qgc2VlbSB0byBiZSB1c2VkIGFzIHByb3BlcnRpZXMuICBUaHJpZnRQcm90b2NvbCBoYXMKKyAqICAgIGEgVGhyaWZ0VHJhbnNwb3J0IGFzIGFuIG9iamVjdCBwcm9wZXJ0eS4KKyAqICAtIGlmIGEgbWV0aG9kIG5lZWRzIHRvIGJlIGFkZGVkIHRoYXQgYWxsIHN1YmNsYXNzZXMgY2FuIHVzZSwgYSBjbGFzcworICogICAgaXMgbmVjZXNzYXJ5LgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1RSQU5TUE9SVCAodGhyaWZ0X3RyYW5zcG9ydF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1RSQU5TUE9SVCwgVGhyaWZ0VHJhbnNwb3J0KSkKKyNkZWZpbmUgVEhSSUZUX0lTX1RSQU5TUE9SVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1RSQU5TUE9SVCkpCisjZGVmaW5lIFRIUklGVF9UUkFOU1BPUlRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1RSQU5TUE9SVCwgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfVFJBTlNQT1JUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQpKQorI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JULCBUaHJpZnRUcmFuc3BvcnRDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRUcmFuc3BvcnQgVGhyaWZ0VHJhbnNwb3J0OworCisvKiEKKyAqIFRocmlmdCBQcm90b2NvbCBvYmplY3QKKyAqLworc3RydWN0IF9UaHJpZnRUcmFuc3BvcnQKK3sKKyAgR09iamVjdCBwYXJlbnQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgVGhyaWZ0VHJhbnNwb3J0Q2xhc3M7CisKKy8qIQorICogVGhyaWZ0IFRyYW5zcG9ydCBjbGFzcworICovCitzdHJ1Y3QgX1RocmlmdFRyYW5zcG9ydENsYXNzCit7CisgIEdPYmplY3RDbGFzcyBwYXJlbnQ7CisKKyAgLyogdnRhYmxlICovCisgIGdib29sZWFuICgqaXNfb3BlbikgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKyAgZ2Jvb2xlYW4gKCpwZWVrKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCpvcGVuKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCpjbG9zZSkgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWQpIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCpyZWFkX2VuZCkgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisgIGdib29sZWFuICgqd3JpdGUpIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgY29uc3QgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcik7CisgIGdib29sZWFuICgqd3JpdGVfZW5kKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCpmbHVzaCkgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfYWxsKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9UUkFOU1BPUlQgKi8KK0dUeXBlIHRocmlmdF90cmFuc3BvcnRfZ2V0X3R5cGUgKHZvaWQpOworCisvKiB2aXJ0dWFsIHB1YmxpYyBtZXRob2RzICovCisKKy8qIQorICogQ2hlY2tzIGlmIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW5lZC4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFRyYW5zcG9ydEludGVyZmFjZQorICovCitnYm9vbGVhbiB0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKworLyohCisgKiBPcGVuIHRoZSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF9vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworCisvKiEKKyAqIFRlc3RzIHdoZXRoZXIgdGhlcmUgaXMgbW9yZSBkYXRhIHRvIHJlYWQgb3IgaWYgdGhlIHJlbW90ZSBzaWRlIGlzIHN0aWxsCisgKiBvcGVuLiBCeSBkZWZhdWx0IHRoaXMgaXMgdHJ1ZSB3aGVuZXZlciB0aGUgdHJhbnNwb3J0IGlzIG9wZW4sIGJ1dAorICogaW1wbGVtZW50YXRpb25zIHNob3VsZCBhZGQgbG9naWMgdG8gdGVzdCBmb3IgdGhpcyBjb25kaXRpb24gd2hlcmUgcG9zc2libGUKKyAqIChpLmUuIG9uIGEgc29ja2V0KS4KKyAqCisgKiBUaGlzIGlzIHVzZWQgYnkgYSBzZXJ2ZXIgdG8gY2hlY2sgaWYgaXQgc2hvdWxkIGxpc3RlbiBmb3IgYW5vdGhlciByZXF1ZXN0LgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCisgKi8KK2dib29sZWFuIHRocmlmdF90cmFuc3BvcnRfcGVlayAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKworLyohCisgKiBDbG9zZSB0aGUgdHJhbnNwb3J0LgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCisgKi8KK2dib29sZWFuIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisKKy8qIQorICogUmVhZCBzb21lIGRhdGEgaW50byB0aGUgYnVmZmVyIGJ1Zi4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFRyYW5zcG9ydEludGVyZmFjZQorICovCitnaW50MzIgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKTsKKworLyohCisgKiBDYWxsZWQgd2hlbiByZWFkIGlzIGNvbXBsZXRlZC4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFRyYW5zcG9ydEludGVyZmFjZQorICovCitnYm9vbGVhbiB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworCisvKiEKKyAqIFdyaXRlcyBkYXRhIGZyb20gYSBidWZmZXIgdG8gdGhlIHRyYW5zcG9ydC4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFRyYW5zcG9ydEludGVyZmFjZQorICovCitnYm9vbGVhbiB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgY29uc3QgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKTsKKworLyohCisgKiBDYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZWQuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworLyohCisgKiBGbHVzaGVzIGFueSBwZW5kaW5nIGRhdGEgdG8gYmUgd3JpdHRlbi4gIFR5cGljYWxseSB1c2VkIHdpdGggYnVmZmVyZWQKKyAqIHRyYW5zcG9ydCBtZWNoYW5pc21zLgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCisgKi8KK2dib29sZWFuIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisKKy8qIQorICogUmVhZCBsZW4gYnl0ZXMgb2YgZGF0YSBpbnRvIHRoZSBidWZmZXIgYnVmLgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCisgKi8KK2dpbnQzMiB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcik7CisKKy8qIGRlZmluZSBlcnJvci9leGNlcHRpb24gdHlwZXMgKi8KK3R5cGVkZWYgZW51bQoreworICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1VOS05PV04sCisgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfSE9TVCwKKyAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TT0NLRVQsCisgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfQ09OTkVDVCwKKyAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TRU5ELAorICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1JFQ0VJVkUsCisgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfQ0xPU0UKK30gVGhyaWZ0VHJhbnNwb3J0RXJyb3I7CisKKy8qIGRlZmluZSBhbiBlcnJvciBkb21haW4gZm9yIEdFcnJvciB0byB1c2UgKi8KK0dRdWFyayB0aHJpZnRfdHJhbnNwb3J0X2Vycm9yX3F1YXJrICh2b2lkKTsKKyNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiAodGhyaWZ0X3RyYW5zcG9ydF9lcnJvcl9xdWFyayAoKSkKKworLyogZGVmaW5lIG1hY3JvIGZvciBpbnZhbGlkIHNvY2tldCAqLworI2RlZmluZSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgKC0xKQorCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9UUkFOU1BPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjAyNWNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmMKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaD4KKworR19ERUZJTkVfVFlQRShUaHJpZnRUcmFuc3BvcnRGYWN0b3J5LCB0aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnksIEdfVFlQRV9PQkpFQ1QpCisKKy8qIGJ1aWxkcyBhIHRyYW5zcG9ydCBmcm9tIHRoZSBiYXNlIHRyYW5zcG9ydC4gKi8KK1RocmlmdFRyYW5zcG9ydCAqCit0aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3RyYW5zcG9ydCAoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGZhY3RvcnkpOworICByZXR1cm4gdHJhbnNwb3J0OworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5X2NsYXNzX2luaXQgKFRocmlmdFRyYW5zcG9ydEZhY3RvcnlDbGFzcyAqY2xzKQoreworICBjbHMtPmdldF90cmFuc3BvcnQgPSB0aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3RyYW5zcG9ydDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeV9pbml0IChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5KQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZmFjdG9yeSk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlM2RhMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfRkFDVE9SWV9ICisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUllfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgInRocmlmdF90cmFuc3BvcnQuaCIKKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmgKKyAqICBcYnJpZWYgQmFzZSBjbGFzcyBmb3IgVGhyaWZ0IFRyYW5zcG9ydCBGYWN0b3JpZXMuICBVc2VkIGJ5IFRocmlmdCBTZXJ2ZXJzCisgKiAgICAgICAgIHRvIG9idGFpbiBhIGNsaWVudCB0cmFuc3BvcnQgZnJvbSBhbiBleGlzdGluZyB0cmFuc3BvcnQuICBUaGUgZGVmYXVsdAorICogICAgICAgICBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgY2xvbmVzIHRoZSBwcm92aWRlZCB0cmFuc3BvcnQuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlkgKHRocmlmdF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlksIFRocmlmdFRyYW5zcG9ydEZhY3RvcnkpKQorI2RlZmluZSBUSFJJRlRfSVNfVFJBTlNQT1JUX0ZBQ1RPUlkob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSkpCisjZGVmaW5lIFRIUklGVF9UUkFOU1BPUlRfRkFDVE9SWV9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlksIFRocmlmdFRyYW5zcG9ydEZhY3RvcnlDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19UUkFOU1BPUlRfRkFDVE9SWV9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlkpKQorI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUllfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSwgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeUNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFRyYW5zcG9ydEZhY3RvcnkgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeTsKKworLyogVGhyaWZ0IFRyYW5zcG9ydCBGYWN0b3J5IGluc3RhbmNlICovCitzdHJ1Y3QgX1RocmlmdFRyYW5zcG9ydEZhY3RvcnkKK3sKKyAgR09iamVjdCBwYXJlbnQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeUNsYXNzIFRocmlmdFRyYW5zcG9ydEZhY3RvcnlDbGFzczsKKworLyogVGhyaWZ0IFRyYW5zcG9ydCBGYWN0b3J5IGNsYXNzICovCitzdHJ1Y3QgX1RocmlmdFRyYW5zcG9ydEZhY3RvcnlDbGFzcworeworICBHT2JqZWN0Q2xhc3MgcGFyZW50OworCisgIC8qIHZ0YWJsZSAqLworICBUaHJpZnRUcmFuc3BvcnQgKigqZ2V0X3RyYW5zcG9ydCkgKFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpOworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSAqLworR1R5cGUgdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5X2dldF90eXBlICh2b2lkKTsKKworLyogdmlydHVhbCBwdWJsaWMgbWV0aG9kcyAqLworVGhyaWZ0VHJhbnNwb3J0ICp0aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3RyYW5zcG9ydCAoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqZmFjdG9yeSwgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9UUkFOU1BPUlRfRkFDVE9SWV9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYmVlM2MuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaCIKLSNpbmNsdWRlICJwcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaCIKLQotR19ERUZJTkVfVFlQRShUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbiwgVEhSSUZUX1RZUEVfU1RSVUNUKQotCi1naW50MzIKLXRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fcmVhZCAoVGhyaWZ0U3RydWN0ICpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdpbnQzMiByZXQ7Ci0gIGdpbnQzMiB4ZmVyID0gMDsKLSAgZ2NoYXIgKm5hbWU7Ci0gIFRocmlmdFR5cGUgZnR5cGU7Ci0gIGdpbnQxNiBmaWQ7Ci0gIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp0aGlzID0gVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiAob2JqZWN0KTsKLQotICAvKiByZWFkIHRoZSBzdHJ1Y3QgYmVnaW4gbWFya2VyICovCi0gIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgJm5hbWUsIGVycm9yKSkgPCAwKQotICB7Ci0gICAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHhmZXIgKz0gcmV0OwotICBpZiAobmFtZSkgZ19mcmVlIChuYW1lKTsKLQotICB3aGlsZSAoMSkKLSAgewotICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmbmFtZSwgJmZ0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWQsIGVycm9yKSkgPCAwKQotICAgIHsKLSAgICAgIGlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICB4ZmVyICs9IHJldDsKLSAgICBpZiAobmFtZSkgZ19mcmVlIChuYW1lKTsKLQotICAgIC8qIGJyZWFrIGlmIHdlIGdldCBhIFNUT1AgZmllbGQgKi8KLSAgICBpZiAoZnR5cGUgPT0gVF9TVE9QKQotICAgIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHN3aXRjaCAoZmlkKQotICAgIHsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgaWYgKGZ0eXBlID09IFRfU1RSSU5HKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmdGhpcy0+bWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgeGZlciArPSByZXQ7Ci0gICAgICAgICAgdGhpcy0+X19pc3NldF9tZXNzYWdlID0gVFJVRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZnR5cGUsIGVycm9yKSkgPCAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgIHhmZXIgKz0gcmV0OwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyOgotICAgICAgICBpZiAoZnR5cGUgPT0gVF9JMzIpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ0aGlzLT50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICB4ZmVyICs9IHJldDsKLSAgICAgICAgICB0aGlzLT5fX2lzc2V0X3R5cGUgPSBUUlVFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBmdHlwZSwgZXJyb3IpKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgeGZlciArPSByZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZnR5cGUsIGVycm9yKSkgPCAwKQotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgeGZlciArPSByZXQ7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKQotICAgICAgcmV0dXJuIC0xOwotICAgIHhmZXIgKz0gcmV0OwotICB9Ci0KLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApCi0gICAgcmV0dXJuIC0xOwotICB4ZmVyICs9IHJldDsKLQotICByZXR1cm4geGZlcjsKLX0KLQotZ2ludDMyCi10aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX3dyaXRlIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdpbnQzMiByZXQ7Ci0gIGdpbnQzMiB4ZmVyID0gMDsKLQotICBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqdGhpcyA9IFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT04gKG9iamVjdCk7Ci0KLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkKLSAgICByZXR1cm4gLTE7Ci0gIHhmZXIgKz0gcmV0OwotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJtZXNzYWdlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfU1RSSU5HLCAxLCBlcnJvcikpIDwgMCkKLSAgICByZXR1cm4gLTE7Ci0gIHhmZXIgKz0gcmV0OwotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLCB0aGlzLT5tZXNzYWdlLCBlcnJvcikpIDwgMCkKLSAgICByZXR1cm4gLTE7Ci0gIHhmZXIgKz0gcmV0OwotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkKLSAgICByZXR1cm4gLTE7Ci0gIHhmZXIgKz0gcmV0OwotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfSTMyLCAyLCBlcnJvcikpIDwgMCkKLSAgICByZXR1cm4gLTE7Ci0gIHhmZXIgKz0gcmV0OwotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCB0aGlzLT50eXBlLCBlcnJvcikpIDwgMCkKLSAgICByZXR1cm4gLTE7Ci0gIHhmZXIgKz0gcmV0OwotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkKLSAgICByZXR1cm4gLTE7Ci0gIHhmZXIgKz0gcmV0OwotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChwcm90b2NvbCwgZXJyb3IpKSA8IDApCi0gICAgcmV0dXJuIC0xOwotICB4ZmVyICs9IHJldDsKLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKQotICAgIHJldHVybiAtMTsKLSAgeGZlciArPSByZXQ7Ci0KLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLQotLyogR0Vycm9yIGRvbWFpbiAqLwotI2RlZmluZSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0RPTUFJTiAidGhyaWZ0LWFwcGxpY2F0aW9uLWV4Y2VwdGlvbi1lcnJvci1xdWFyayIKLQotR1F1YXJrCi10aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2Vycm9yX3F1YXJrICh2b2lkKQotewotICByZXR1cm4gZ19xdWFya19mcm9tX3N0YXRpY19zdHJpbmcgKFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfRE9NQUlOKTsKLX0KLQotdm9pZAotdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9pbml0IChUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqb2JqZWN0KQotewotICBvYmplY3QtPnR5cGUgPSAwOwotICBvYmplY3QtPl9faXNzZXRfdHlwZSA9IEZBTFNFOwotICBvYmplY3QtPm1lc3NhZ2UgPSBOVUxMOwotICBvYmplY3QtPl9faXNzZXRfbWVzc2FnZSA9IEZBTFNFOwotfQotCi12b2lkCi10aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2NsYXNzX2luaXQgKFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uQ2xhc3MgKmNsYXNzKQotewotICBUaHJpZnRTdHJ1Y3RDbGFzcyAqY2xzID0gVEhSSUZUX1NUUlVDVF9DTEFTUyhjbGFzcyk7Ci0gIGNscy0+cmVhZCA9IHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fcmVhZDsKLSAgY2xzLT53cml0ZSA9IHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fd3JpdGU7Ci19CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmggYi9saWIvY19nbGliL3NyYy90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNWE4YzAuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0gKLSNkZWZpbmUgX1RIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fSAotCi0jaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KLSNpbmNsdWRlICJ0aHJpZnRfc3RydWN0LmgiCi0KLUdfQkVHSU5fREVDTFMKLQotLyohIFxmaWxlIHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaAotICogIFxicmllZiBDIEltcGxlbWVudGF0aW9uIG9mIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLgotICovCi0KLS8qIHR5cGUgbWFjcm9zICovCi0jZGVmaW5lIFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiAodGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9nZXRfdHlwZSAoKSkKLSNkZWZpbmUgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24pKQotI2RlZmluZSBUSFJJRlRfSVNfQVBQTElDQVRJT05fRVhDRVBUSU9OKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OKSkKLSNkZWZpbmUgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLCBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbkNsYXNzKSkKLSNkZWZpbmUgVEhSSUZUX0lTX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OKSkKLSNkZWZpbmUgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb25DbGFzcykpCi0KLXN0cnVjdCBfVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24KLXsKLSAgVGhyaWZ0U3RydWN0IHBhcmVudDsKLQotICAvKiBwdWJsaWMgKi8KLSAgZ2ludDMyIHR5cGU7Ci0gIGdib29sZWFuIF9faXNzZXRfdHlwZTsKLSAgZ2NoYXIgKm1lc3NhZ2U7Ci0gIGdib29sZWFuIF9faXNzZXRfbWVzc2FnZTsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb247Ci0KLXN0cnVjdCBfVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb25DbGFzcwotewotICBUaHJpZnRTdHJ1Y3RDbGFzcyBwYXJlbnQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uQ2xhc3MgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb25DbGFzczsKLQotR1R5cGUgdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9nZXRfdHlwZSAodm9pZCk7Ci0KLS8qIGdlcnJvciBjb2RlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTiwKLSAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9VTktOT1dOX01FVEhPRCwKLSAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9JTlZBTElEX01FU1NBR0VfVFlQRSwKLSAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9XUk9OR19NRVRIT0RfTkFNRSwKLSAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9CQURfU0VRVUVOQ0VfSUQsCi0gIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfTUlTU0lOR19SRVNVTFQsCi0gIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfSU5URVJOQUxfRVJST1IsCi0gIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfUFJPVE9DT0xfRVJST1IKLX0gVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb25FcnJvcjsKLQotLyogZGVmaW5lIGVycm9yIGRvbWFpbiBmb3IgR0Vycm9yICovCi1HUXVhcmsgdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9lcnJvcl9xdWFyayAodm9pZCk7Ci0jZGVmaW5lIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1IgKHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fZXJyb3JfcXVhcmsgKCkpCi0KLUdfRU5EX0RFQ0xTCi0KLSNlbmRpZiAvKiBfVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnRfc3RydWN0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnRfc3RydWN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMDkyOGEuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0X3N0cnVjdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAidGhyaWZ0LmgiCi0jaW5jbHVkZSAidGhyaWZ0X3N0cnVjdC5oIgotCi1HX0RFRklORV9BQlNUUkFDVF9UWVBFKFRocmlmdFN0cnVjdCwgdGhyaWZ0X3N0cnVjdCwgR19UWVBFX09CSkVDVCkKLQotZ2ludDMyCi10aHJpZnRfc3RydWN0X3JlYWQgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX1NUUlVDVCAob2JqZWN0KSwgLTEpOwotICByZXR1cm4gVEhSSUZUX1NUUlVDVF9HRVRfQ0xBU1MgKG9iamVjdCktPnJlYWQgKG9iamVjdCwgcHJvdG9jb2wsIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfc3RydWN0X3dyaXRlIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfU1RSVUNUIChvYmplY3QpLCAtMSk7Ci0gIHJldHVybiBUSFJJRlRfU1RSVUNUX0dFVF9DTEFTUyAob2JqZWN0KS0+d3JpdGUgKG9iamVjdCwgcHJvdG9jb2wsIGVycm9yKTsKLX0KLQotc3RhdGljIHZvaWQKLXRocmlmdF9zdHJ1Y3RfY2xhc3NfaW5pdCAoVGhyaWZ0U3RydWN0Q2xhc3MgKmNscykKLXsKLSAgY2xzLT5yZWFkID0gdGhyaWZ0X3N0cnVjdF9yZWFkOwotICBjbHMtPndyaXRlID0gdGhyaWZ0X3N0cnVjdF93cml0ZTsKLX0KLQotc3RhdGljIHZvaWQKLXRocmlmdF9zdHJ1Y3RfaW5pdCAoVGhyaWZ0U3RydWN0ICpzdHJ1Y3R1cmUpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChzdHJ1Y3R1cmUpOwotfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0X3N0cnVjdC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0X3N0cnVjdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGY5OTg0Li4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdF9zdHJ1Y3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUSFJJRlRfU1RSVUNUX0gKLSNkZWZpbmUgVEhSSUZUX1NUUlVDVF9ICi0KLSNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgotCi0jaW5jbHVkZSAicHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmgiCi0KLUdfQkVHSU5fREVDTFMKLQotI2RlZmluZSBUSFJJRlRfVFlQRV9TVFJVQ1QgKHRocmlmdF9zdHJ1Y3RfZ2V0X3R5cGUgKCkpCi0jZGVmaW5lIFRIUklGVF9TVFJVQ1Qob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9TVFJVQ1QsIFRocmlmdFN0cnVjdCkpCi0jZGVmaW5lIFRIUklGVF9TVFJVQ1RfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1NUUlVDVCwgVGhyaWZ0U3RydWN0Q2xhc3MpKQotI2RlZmluZSBUSFJJRlRfSVNfU1RSVUNUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfU1RSVUNUKSkKLSNkZWZpbmUgVEhSSUZUX0lTX1NUUlVDVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfU1RSVUNUKSkKLSNkZWZpbmUgVEhSSUZUX1NUUlVDVF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1NUUlVDVCwgVGhyaWZ0U3RydWN0Q2xhc3MpKQotCi0vKiBzdHJ1Y3QgKi8KLXN0cnVjdCBfVGhyaWZ0U3RydWN0Ci17Ci0gIEdPYmplY3QgcGFyZW50OwotCi0gIC8qIHByaXZhdGUgKi8KLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U3RydWN0IFRocmlmdFN0cnVjdDsKLQotc3RydWN0IF9UaHJpZnRTdHJ1Y3RDbGFzcwotewotICBHT2JqZWN0Q2xhc3MgcGFyZW50OwotCi0gIC8qIHB1YmxpYyAqLwotICBnaW50MzIgKCpyZWFkKSAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqd3JpdGUpIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U3RydWN0Q2xhc3MgVGhyaWZ0U3RydWN0Q2xhc3M7Ci0KLUdUeXBlIHRocmlmdF9zdHJ1Y3RfZ2V0X3R5cGUgKHZvaWQpOwotCi1naW50MzIgdGhyaWZ0X3N0cnVjdF9yZWFkIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3N0cnVjdF93cml0ZSAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci1HX0VORF9ERUNMUwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMgYi9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2MxNGIxLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAidGhyaWZ0LmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oIgotCi0vKiBvYmplY3QgcHJvcGVydGllcyAqLwotZW51bSBfVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRQcm9wZXJ0aWVzCi17Ci0gIFBST1BfMCwKLSAgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1RSQU5TUE9SVCwKLSAgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkUsCi0gIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRQotfTsKLQotR19ERUZJTkVfVFlQRShUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCwgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydCwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAqLwotZ2Jvb2xlYW4KLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCi17Ci0gIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLSAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5pc19vcGVuICh0LT50cmFuc3BvcnQpOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfb3BlbiAqLwotZ2Jvb2xlYW4KLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7Ci0gIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+b3BlbiAodC0+dHJhbnNwb3J0LCBlcnJvcik7Ci19Ci0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAqLwotZ2Jvb2xlYW4KLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOwotICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPmNsb3NlICh0LT50cmFuc3BvcnQsIGVycm9yKTsKLX0KLQotLyogdGhlIGFjdHVhbCByZWFkIGlzICJzbG93IiBiZWNhdXNlIGl0IGNhbGxzIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCAqLwotZ2ludDMyCi10aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWRfc2xvdyAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLSAgZ3VpbnQzMiB3YW50ID0gbGVuOwotICBndWludDMyIGdvdCA9IDA7Ci0gIGd1Y2hhciB0bXBkYXRhW3QtPnJfYnVmX3NpemVdOwotICBndWludDMyIGhhdmUgPSB0LT5yX2J1Zi0+bGVuOwotCi0gIC8vIHdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGJ1ZmZlciBkb2Vzbid0IGhhdmUgZW5vdWdoIHRvIHJlYWQKLSAgYXNzZXJ0ICh0LT5yX2J1Zi0+bGVuIDwgd2FudCk7Ci0KLSAgLy8gZmlyc3QgY29weSB3aGF0IHdlIGhhdmUgaW4gb3VyIGJ1ZmZlci4KLSAgaWYgKGhhdmUgPiAwKQotICB7Ci0gICAgbWVtY3B5IChidWYsIHQtPnJfYnVmLCB0LT5yX2J1Zi0+bGVuKTsKLSAgICB3YW50IC09IHQtPnJfYnVmLT5sZW47Ci0gICAgdC0+cl9idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5yX2J1ZiwgMCwgdC0+cl9idWYtPmxlbik7Ci0gIH0KLQotICAvLyBpZiB0aGUgYnVmZmVyIGlzIHN0aWxsIHNtYWxsZXIgdGhhbiB3aGF0IHdlIHdhbnQgdG8gcmVhZCwgdGhlbiBqdXN0Ci0gIC8vIHJlYWQgaXQgZGlyZWN0bHkuICBvdGhlcndpc2UsIGZpbGwgdGhlIGJ1ZmZlciBhbmQgdGhlbiBnaXZlIG91dAotICAvLyBlbm91Z2ggdG8gc2F0aXNmeSB0aGUgcmVhZC4KLSAgaWYgKHQtPnJfYnVmX3NpemUgPCB3YW50KQotICB7Ci0gICAgZ290ICs9IFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5yZWFkICh0LT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLQotICAgIC8vIGNvcHkgdGhlIGRhdGEgc3RhcnRpbmcgZnJvbSB3aGVyZSB3ZSBsZWZ0IG9mZgotICAgIG1lbWNweSAoYnVmICsgaGF2ZSwgdG1wZGF0YSwgZ290KTsKLSAgICByZXR1cm4gZ290ICsgaGF2ZTsgCi0gIH0gZWxzZSB7Ci0gICAgZ290ICs9IFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5yZWFkICh0LT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+cl9idWZfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLSAgICB0LT5yX2J1ZiA9IGdfYnl0ZV9hcnJheV9hcHBlbmQgKHQtPnJfYnVmLCB0bXBkYXRhLCBnb3QpOwotICAgIAotICAgIC8vIGhhbmQgb3ZlciB3aGF0IHdlIGhhdmUgdXAgdG8gd2hhdCB0aGUgY2FsbGVyIHdhbnRzCi0gICAgZ3VpbnQzMiBnaXZlID0gd2FudCA8IHQtPnJfYnVmLT5sZW4gPyB3YW50IDogdC0+cl9idWYtPmxlbjsKLQotCi0gICAgbWVtY3B5IChidWYgKyBsZW4gLSB3YW50LCB0LT5yX2J1Zi0+ZGF0YSwgZ2l2ZSk7Ci0gICAgdC0+cl9idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5yX2J1ZiwgMCwgZ2l2ZSk7Ci0gICAgd2FudCAtPSBnaXZlOwotCi0gICAgcmV0dXJuIChsZW4gLSB3YW50KTsKLSAgfQotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZCAqLwotZ2ludDMyCi10aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOwotCi0gIC8qIGlmIHdlIGhhdmUgZW5vdWdoIGJ1ZmZlciBkYXRhIHRvIGZ1bGZpbGwgdGhlIHJlYWQsIGp1c3QgdXNlCi0gICAqIGEgbWVtY3B5ICovCi0gIGlmIChsZW4gPD0gdC0+cl9idWYtPmxlbikKLSAgewotICAgIG1lbWNweSAoYnVmLCB0LT5yX2J1Zi0+ZGF0YSwgbGVuKTsKLSAgICBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5yX2J1ZiwgMCwgbGVuKTsKLSAgICByZXR1cm4gbGVuOwotICB9Ci0KLSAgcmV0dXJuIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZF9zbG93ICh0cmFuc3BvcnQsIGJ1ZiwgbGVuLCBlcnJvcik7Ci19Ci0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZAotICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCi1nYm9vbGVhbgotdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9yZWFkX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICAvKiBzYXRpc2Z5IC1XYWxsICovCi0gIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICByZXR1cm4gVFJVRTsKLX0KLQotZ2Jvb2xlYW4KLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGVfc2xvdyAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQotewotICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7Ci0gIGd1aW50MzIgaGF2ZV9ieXRlcyA9IHQtPndfYnVmLT5sZW47Ci0gIGd1aW50MzIgc3BhY2UgPSB0LT53X2J1Zl9zaXplIC0gdC0+d19idWYtPmxlbjsKLQotICAvLyB3ZSBuZWVkIHR3byBzeXNjYWxscyBiZWNhdXNlIHRoZSBidWZmZXJlZCBkYXRhIHBsdXMgdGhlIGJ1ZmZlciBpdHNlbGYKLSAgLy8gaXMgdG9vIGJpZy4KLSAgaWYgKChoYXZlX2J5dGVzICsgbGVuID49IDIqdC0+d19idWYtPmxlbikgfHwgKGhhdmVfYnl0ZXMgPT0gMCkpCi0gIHsKLSAgICBpZiAoaGF2ZV9ieXRlcyA+IDApCi0gICAgewotICAgICAgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPndyaXRlICh0LT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPndfYnVmLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlX2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci0gICAgfQotICAgIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT53cml0ZSAodC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBsZW4sIGVycm9yKTsKLSAgICBpZiAodC0+d19idWYtPmxlbiA+IDApCi0gICAgewotICAgICAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT53X2J1ZiwgMCwgdC0+d19idWYtPmxlbik7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci0gIH0KLQotICB0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9hcHBlbmQgKHQtPndfYnVmLCBidWYsIHNwYWNlKTsKLSAgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPndyaXRlICh0LT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+d19idWYtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+d19idWYtPmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci0KLSAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT53X2J1ZiwgMCwgdC0+d19idWYtPmxlbik7Ci0gIHQtPndfYnVmID0gZ19ieXRlX2FycmF5X2FwcGVuZCAodC0+d19idWYsIGJ1ZitzcGFjZSwgbGVuLXNwYWNlKTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlICovCi1nYm9vbGVhbgotdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncG9pbnRlciBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLQotICAvKiB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IGJ1ZmZlciBwbHVzIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgYmVpbmcgcmVhZCAqLwotICBpZiAodC0+d19idWYtPmxlbiArIGxlbiA8PSB0LT53X2J1Zl9zaXplKQotICB7Ci0gICAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT53X2J1ZiwgYnVmLCBsZW4pOwotICAgIHJldHVybiBsZW47Ci0gIH0KLQotICByZXR1cm4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZV9zbG93ICh0cmFuc3BvcnQsIGJ1ZiwgbGVuLCBlcnJvcik7Ci19Ci0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQKLSAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLwotZ2Jvb2xlYW4KLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGVfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIC8qIHNhdGlzZnkgLVdhbGwgKi8KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiBUUlVFOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKi8KLWdib29sZWFuCi10aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLQotICBpZiAodC0+d19idWYgIT0gTlVMTCAmJiB0LT53X2J1Zi0+bGVuID4gMCkKLSAgewotICAgIC8vIHdyaXRlIHRoZSBidWZmZXIgYW5kIHRoZW4gZW1wdHkgaXQKLSAgICBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+d3JpdGUgKHQtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPndfYnVmLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+d19idWYtPmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLSAgICB0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPndfYnVmLCAwLCB0LT53X2J1Zi0+bGVuKTsKLSAgfQotICBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+Zmx1c2ggKHQtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qIGluaXRpYWxpemVzIHRoZSBpbnN0YW5jZSAqLwotc3RhdGljIHZvaWQKLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaW5pdCAoVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKLXsKLSAgdHJhbnNwb3J0LT50cmFuc3BvcnQgPSBOVUxMOwotICB0cmFuc3BvcnQtPnJfYnVmID0gZ19ieXRlX2FycmF5X25ldyAoKTsKLSAgdHJhbnNwb3J0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9uZXcgKCk7Ci19Ci0KLS8qIGRlc3RydWN0b3IgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCi17Ci0gIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUIChvYmplY3QpOwotCi0gIGlmICh0cmFuc3BvcnQtPnJfYnVmICE9IE5VTEwpCi0gIHsKLSAgICBnX2J5dGVfYXJyYXlfZnJlZSAodHJhbnNwb3J0LT5yX2J1ZiwgVFJVRSk7Ci0gIH0KLSAgdHJhbnNwb3J0LT5yX2J1ZiA9IE5VTEw7Ci0KLSAgaWYgKHRyYW5zcG9ydC0+d19idWYgIT0gTlVMTCkKLSAgewotICAgIGdfYnl0ZV9hcnJheV9mcmVlICh0cmFuc3BvcnQtPndfYnVmLCBUUlVFKTsKLSAgfQotICB0cmFuc3BvcnQtPndfYnVmID0gTlVMTDsKLX0KLQotLyogcHJvcGVydHkgYWNjZXNzb3IgKi8KLXZvaWQKLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOwotICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAob2JqZWN0KTsKLQotICBzd2l0Y2ggKHByb3BlcnR5X2lkKQotICB7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfVFJBTlNQT1JUOgotICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgdHJhbnNwb3J0LT50cmFuc3BvcnQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfUkVBRF9CVUZGRVJfU0laRToKLSAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCB0cmFuc3BvcnQtPnJfYnVmX3NpemUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkU6Ci0gICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdHJhbnNwb3J0LT53X2J1Zl9zaXplKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qIHByb3BlcnR5IG11dGF0b3IgKi8KLXZvaWQKLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOwotICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAob2JqZWN0KTsKLQotICBzd2l0Y2ggKHByb3BlcnR5X2lkKQotICB7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfVFJBTlNQT1JUOgotICAgICAgdHJhbnNwb3J0LT50cmFuc3BvcnQgPSBnX3ZhbHVlX2dldF9vYmplY3QgKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkU6Ci0gICAgICB0cmFuc3BvcnQtPnJfYnVmX3NpemUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRToKLSAgICAgIHRyYW5zcG9ydC0+d19idWZfc2l6ZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qIGluaXRpYWxpemVzIHRoZSBjbGFzcyAqLwotc3RhdGljIHZvaWQKLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xhc3NfaW5pdCAoVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRDbGFzcyAqY2xzKQotewotICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKLSAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYyA9IE5VTEw7Ci0KLSAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLwotICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2dldF9wcm9wZXJ0eTsKLSAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9zZXRfcHJvcGVydHk7Ci0KLSAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19vYmplY3QgKCJ0cmFuc3BvcnQiLCAidHJhbnNwb3J0IChjb25zdHJ1Y3QpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQgdHJhbnNwb3J0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSk7Ci0gIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9UUkFOU1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOwotCi0gIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoInJfYnVmX3NpemUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkIGJ1ZmZlciBzaXplIChjb25zdHJ1Y3QpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSByZWFkIGJ1ZmZlciBzaXplIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ4NTc2LCAvKiBtYXgsIDEwMjQqMTAyNCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMiwgLyogZGVmYXVsdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKLSAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOwotCi0gIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoIndfYnVmX3NpemUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSBidWZmZXIgc2l6ZSAoY29uc3RydWN0KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgd3JpdGUgYnVmZmVyIHNpemUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNDg1NzYsIC8qIG1heCwgMTAyNCoxMDI0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEyLCAvKiBkZWZhdWx0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOwotICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOwotCi0KLSAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKnR0YyA9IFRIUklGVF9UUkFOU1BPUlRfQ0xBU1MgKGNscyk7Ci0KLSAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZpbmFsaXplOwotICB0dGMtPmlzX29wZW4gPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2lzX29wZW47Ci0gIHR0Yy0+b3BlbiA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbjsKLSAgdHRjLT5jbG9zZSA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2U7Ci0gIHR0Yy0+cmVhZCA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZDsKLSAgdHRjLT5yZWFkX2VuZCA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZF9lbmQ7Ci0gIHR0Yy0+d3JpdGUgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlOwotICB0dGMtPndyaXRlX2VuZCA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGVfZW5kOwotICB0dGMtPmZsdXNoID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaDsKLX0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmggYi9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWE1MTgzLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfSAotI2RlZmluZSBfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9ICi0KLSNpbmNsdWRlIDxnbGliLmg+Ci0jaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KLQotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgiCi0KLUdfQkVHSU5fREVDTFMKLQotLyohIFxmaWxlIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaAotICogIFxicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBidWZmZXJlZCB0cmFuc3BvcnQuICBTdWJjbGFzc2VzCi0gKiAgICAgICAgIHRoZSBUaHJpZnRUcmFuc3BvcnQgY2xhc3MuCi0gKi8KLQotLyogdHlwZSBtYWNyb3MgKi8KLSNkZWZpbmUgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2dldF90eXBlICgpKQotI2RlZmluZSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULCBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCkpCi0jZGVmaW5lIFRIUklGVF9JU19CVUZGRVJFRF9UUkFOU1BPUlQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQpKQotI2RlZmluZSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0Q2xhc3MpKQotI2RlZmluZSBUSFJJRlRfSVNfQlVGRkVSRURfVFJBTlNQT1JUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQpCi0jZGVmaW5lIFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0Q2xhc3MpKQotCi0vKiEKLSAqIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICBpbnN0YW5jZS4KLSAqLwotc3RydWN0IF9UaHJpZnRCdWZmZXJlZFRyYW5zcG9ydAotewotICBUaHJpZnRUcmFuc3BvcnQgcGFyZW50OwotCi0gIC8qIHByb3RlY3RlZCAqLwotICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydDsKLQotICAvKiBwcml2YXRlICovCi0gIEdCeXRlQXJyYXkgKnJfYnVmOwotICBHQnl0ZUFycmF5ICp3X2J1ZjsKLSAgZ3VpbnQzMiByX2J1Zl9zaXplOwotICBndWludDMyIHdfYnVmX3NpemU7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0IFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0OwotCi0vKiEKLSAqIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0IGNsYXNzLgotICovCi1zdHJ1Y3QgX1RocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0Q2xhc3MKLXsKLSAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgcGFyZW50OwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRCdWZmZXJlZFRyYW5zcG9ydENsYXNzIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0Q2xhc3M7Ci0KLS8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUICovCi1HVHlwZSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2dldF90eXBlICh2b2lkKTsKLQotR19FTkRfREVDTFMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmVkMGExLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgInRocmlmdC5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmgiCi0KLS8qIG9iamVjdCBwcm9wZXJ0aWVzICovCi1lbnVtIF9UaHJpZnRGcmFtZWRUcmFuc3BvcnRQcm9wZXJ0aWVzCi17Ci0gIFBST1BfMCwKLSAgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9UUkFOU1BPUlQsCi0gIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfUkVBRF9CVUZGRVJfU0laRSwKLSAgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRQotfTsKLQotR19ERUZJTkVfVFlQRShUaHJpZnRGcmFtZWRUcmFuc3BvcnQsIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0LCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQpCi0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICovCi1nYm9vbGVhbgotdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCi17Ci0gIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOwotICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPmlzX29wZW4gKHQtPnRyYW5zcG9ydCk7Ci19Ci0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICovCi1nYm9vbGVhbgotdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLSAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5vcGVuICh0LT50cmFuc3BvcnQsIGVycm9yKTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICovCi1nYm9vbGVhbgotdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7Ci0gIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+Y2xvc2UgKHQtPnRyYW5zcG9ydCwgZXJyb3IpOwotfQotCi0vKiByZWFkcyBhIGZyYW1lIGFuZCBwdXRzIGl0IGludG8gdGhlIGJ1ZmZlciAqLwotZ2Jvb2xlYW4KLXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWRfZnJhbWUgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOwotICBnaW50MzIgc3osIGJ5dGVzOwotCi0gIC8qIHJlYWQgdGhlIHNpemUgKi8KLSAgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPnJlYWQgKHQtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChndWludDMyICopICZzeiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3opLCBlcnJvcik7Ci0gIHN6ID0gbnRvaGwgKHN6KTsKLQotICAvKiBjcmVhdGUgYSBidWZmZXIgdG8gaG9sZCB0aGUgZGF0YSBhbmQgcmVhZCB0aGF0IG11Y2ggZGF0YSAqLwotICBndWNoYXIgdG1wZGF0YVtzel07Ci0gIGJ5dGVzID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPnJlYWQgKHQtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3osCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLQotICAvKiBhZGQgdGhlIGRhdGEgdG8gdGhlIGJ1ZmZlciAqLwotICBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT5yX2J1ZiwgdG1wZGF0YSwgYnl0ZXMpOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0vKiB0aGUgYWN0dWFsIHJlYWQgaXMgInNsb3ciIGJlY2F1c2UgaXQgY2FsbHMgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0ICovCi1naW50MzIKLXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWRfc2xvdyAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQotewotICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLSAgZ3VpbnQzMiB3YW50ID0gbGVuOwotICBndWludDMyIGhhdmUgPSB0LT5yX2J1Zi0+bGVuOwotCi0gIC8vIHdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGJ1ZmZlciBkb2Vzbid0IGhhdmUgZW5vdWdoIHRvIHJlYWQKLSAgYXNzZXJ0ICh0LT5yX2J1Zi0+bGVuIDwgd2FudCk7Ci0KLSAgLy8gZmlyc3QgY29weSB3aGF0IHdlIGhhdmUgaW4gb3VyIGJ1ZmZlciwgaWYgdGhlcmUgaXMgYW55dGhpbmcgbGVmdAotICBpZiAoaGF2ZSA+IDApCi0gIHsKLSAgICBtZW1jcHkgKGJ1ZiwgdC0+cl9idWYsIHQtPnJfYnVmLT5sZW4pOwotICAgIHdhbnQgLT0gdC0+cl9idWYtPmxlbjsKLSAgICB0LT5yX2J1ZiA9IGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPnJfYnVmLCAwLCB0LT5yX2J1Zi0+bGVuKTsKLSAgfQotCi0gIC8vIHJlYWQgYSBmcmFtZSBvZiBpbnB1dCBhbmQgYnVmZmVyIGl0Ci0gIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWRfZnJhbWUgKHRyYW5zcG9ydCwgZXJyb3IpOwotCi0gIC8vIGhhbmQgb3ZlciB3aGF0IHdlIGhhdmUgdXAgdG8gd2hhdCB0aGUgY2FsbGVyIHdhbnRzCi0gIGd1aW50MzIgZ2l2ZSA9IHdhbnQgPCB0LT5yX2J1Zi0+bGVuID8gd2FudCA6IHQtPnJfYnVmLT5sZW47Ci0KLSAgLy8gY29weSB0aGUgZGF0YSBpbnRvIHRoZSBidWZmZXIKLSAgbWVtY3B5IChidWYgKyBsZW4gLSB3YW50LCB0LT5yX2J1Zi0+ZGF0YSwgZ2l2ZSk7Ci0gIHQtPnJfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+cl9idWYsIDAsIGdpdmUpOwotICB3YW50IC09IGdpdmU7Ci0KLSAgcmV0dXJuIChsZW4gLSB3YW50KTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKi8KLWdpbnQzMgotdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7Ci0KLSAgLyogaWYgd2UgaGF2ZSBlbm91Z2ggYnVmZmVyIGRhdGEgdG8gZnVsZmlsbCB0aGUgcmVhZCwganVzdCB1c2UKLSAgICogYSBtZW1jcHkgZnJvbSB0aGUgYnVmZmVyICovCi0gIGlmIChsZW4gPD0gdC0+cl9idWYtPmxlbikKLSAgewotICAgIG1lbWNweSAoYnVmLCB0LT5yX2J1Zi0+ZGF0YSwgbGVuKTsKLSAgICBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5yX2J1ZiwgMCwgbGVuKTsKLSAgICByZXR1cm4gbGVuOwotICB9Ci0KLSAgcmV0dXJuIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWRfc2xvdyAodHJhbnNwb3J0LCBidWYsIGxlbiwgZXJyb3IpOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQKLSAqIGNhbGxlZCB3aGVuIHJlYWQgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCi1nYm9vbGVhbgotdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgLyogc2F0aXNmeSAtV2FsbCAqLwotICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLWdib29sZWFuCi10aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZV9zbG93IChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLQotICAvLyBhcHBlbmQgdGhlIGRhdGEgdG8gdGhlIGJ1ZmZlciBhbmQgd2UncmUgZG9uZQotICBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT53X2J1ZiwgYnVmLCBsZW4pOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKi8KLWdib29sZWFuCi10aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3BvaW50ZXIgYnVmLCAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQotewotICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLQotICAvKiB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IGJ1ZmZlciBwbHVzIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgYmVpbmcgcmVhZCAqLwotICBpZiAodC0+d19idWYtPmxlbiArIGxlbiA8PSB0LT53X2J1Zl9zaXplKQotICB7Ci0gICAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT53X2J1ZiwgYnVmLCBsZW4pOwotICAgIHJldHVybiBUUlVFOwotICB9Ci0KLSAgcmV0dXJuIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlX3Nsb3cgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZAotICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCi1nYm9vbGVhbgotdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGVfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIC8qIHNhdGlzZnkgLVdhbGwgKi8KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiBUUlVFOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKi8KLWdib29sZWFuCi10aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLSAgZ2ludDMyIHN6X2hibywgc3pfbmJvOwotCi0gIC8vIGdldCB0aGUgc2l6ZSBvZiB0aGUgZnJhbWUgaW4gaG9zdCBhbmQgbmV0d29yayBieXRlIG9yZGVyCi0gIHN6X2hibyA9IHQtPndfYnVmLT5sZW4gKyBzaXplb2Yoc3pfbmJvKTsKLSAgc3pfbmJvID0gKGdpbnQzMikgaHRvbmwgKChndWludDMyKSB0LT53X2J1Zi0+bGVuKTsKLQotICAvLyBjb3B5IHRoZSBzaXplIG9mIHRoZSBmcmFtZSBhbmQgdGhlbiB0aGUgZnJhbWUgaXRzZWxmCi0gIGd1Y2hhciB0bXBkYXRhW3N6X2hib107Ci0gIG1lbWNweSAodG1wZGF0YSwgKGd1aW50OCAqKSAmc3pfbmJvLCBzaXplb2YgKHN6X25ibykpOwotCi0gIGlmICh0LT53X2J1Zi0+bGVuID4gMCkKLSAgewotICAgIG1lbWNweSAodG1wZGF0YSArIHNpemVvZiAoc3pfbmJvKSwgdC0+d19idWYtPmRhdGEsIHQtPndfYnVmLT5sZW4pOwotICAgIHQtPndfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+d19idWYsIDAsIHQtPndfYnVmLT5sZW4pOwotICB9Ci0gICAgCi0gIC8vIHdyaXRlIHRoZSBidWZmZXIgYW5kIHRoZW4gZW1wdHkgaXQKLSAgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPndyaXRlICh0LT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wZGF0YSwgc3pfaGJvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLQotICBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+Zmx1c2ggKHQtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qIGluaXRpYWxpemVzIHRoZSBpbnN0YW5jZSAqLwotc3RhdGljIHZvaWQKLXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2luaXQgKFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdHJhbnNwb3J0KQotewotICB0cmFuc3BvcnQtPnRyYW5zcG9ydCA9IE5VTEw7Ci0gIHRyYW5zcG9ydC0+cl9idWYgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOwotICB0cmFuc3BvcnQtPndfYnVmID0gZ19ieXRlX2FycmF5X25ldyAoKTsKLX0KLQotLyogZGVzdHJ1Y3RvciAqLwotc3RhdGljIHZvaWQKLXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCi17Ci0gIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKG9iamVjdCk7Ci0KLSAgaWYgKHRyYW5zcG9ydC0+cl9idWYgIT0gTlVMTCkKLSAgewotICAgIGdfYnl0ZV9hcnJheV9mcmVlICh0cmFuc3BvcnQtPnJfYnVmLCBUUlVFKTsKLSAgfQotICB0cmFuc3BvcnQtPnJfYnVmID0gTlVMTDsKLQotICBpZiAodHJhbnNwb3J0LT53X2J1ZiAhPSBOVUxMKQotICB7Ci0gICAgZ19ieXRlX2FycmF5X2ZyZWUgKHRyYW5zcG9ydC0+d19idWYsIFRSVUUpOwotICB9Ci0gIHRyYW5zcG9ydC0+d19idWYgPSBOVUxMOwotfQotCi0vKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwotdm9pZAotdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKLSAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAob2JqZWN0KTsKLQotICBzd2l0Y2ggKHByb3BlcnR5X2lkKQotICB7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1RSQU5TUE9SVDoKLSAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHRyYW5zcG9ydC0+dHJhbnNwb3J0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9SRUFEX0JVRkZFUl9TSVpFOgotICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHRyYW5zcG9ydC0+cl9idWZfc2l6ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkU6Ci0gICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdHJhbnNwb3J0LT53X2J1Zl9zaXplKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qIHByb3BlcnR5IG11dGF0b3IgKi8KLXZvaWQKLXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7Ci0gIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKG9iamVjdCk7Ci0KLSAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKLSAgewotICAgIGNhc2UgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9UUkFOU1BPUlQ6Ci0gICAgICB0cmFuc3BvcnQtPnRyYW5zcG9ydCA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkU6Ci0gICAgICB0cmFuc3BvcnQtPnJfYnVmX3NpemUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkU6Ci0gICAgICB0cmFuc3BvcnQtPndfYnVmX3NpemUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vKiBpbml0aWFsaXplcyB0aGUgY2xhc3MgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9jbGFzc19pbml0IChUaHJpZnRGcmFtZWRUcmFuc3BvcnRDbGFzcyAqY2xzKQotewotICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKLSAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYyA9IE5VTEw7Ci0KLSAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLwotICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9nZXRfcHJvcGVydHk7Ci0gIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3NldF9wcm9wZXJ0eTsKLQotICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX29iamVjdCAoInRyYW5zcG9ydCIsICJ0cmFuc3BvcnQgKGNvbnN0cnVjdCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdCB0cmFuc3BvcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfVFJBTlNQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKTsKLSAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9UUkFOU1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOwotCi0gIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoInJfYnVmX3NpemUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkIGJ1ZmZlciBzaXplIChjb25zdHJ1Y3QpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSByZWFkIGJ1ZmZlciBzaXplIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ4NTc2LCAvKiBtYXgsIDEwMjQqMTAyNCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMiwgLyogZGVmYXVsdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKLSAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9SRUFEX0JVRkZFUl9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKLQotICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJ3X2J1Zl9zaXplIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGUgYnVmZmVyIHNpemUgKGNvbnN0cnVjdCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHdyaXRlIGJ1ZmZlciBzaXplIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ4NTc2LCAvKiBtYXgsIDEwMjQqMTAyNCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMiwgLyogZGVmYXVsdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKLSAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7Ci0KLQotICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKLQotICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZpbmFsaXplOwotICB0dGMtPmlzX29wZW4gPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9pc19vcGVuOwotICB0dGMtPm9wZW4gPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9vcGVuOwotICB0dGMtPmNsb3NlID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfY2xvc2U7Ci0gIHR0Yy0+cmVhZCA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWQ7Ci0gIHR0Yy0+cmVhZF9lbmQgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkX2VuZDsKLSAgdHRjLT53cml0ZSA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlOwotICB0dGMtPndyaXRlX2VuZCA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlX2VuZDsKLSAgdHRjLT5mbHVzaCA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoOwotfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmggYi9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUxNGUzNS4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfSAotI2RlZmluZSBfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfSAotCi0jaW5jbHVkZSA8Z2xpYi5oPgotI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+Ci0KLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oIgotCi1HX0JFR0lOX0RFQ0xTCi0KLS8qISBcZmlsZSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oCi0gKiAgXGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IGZyYW1lZCB0cmFuc3BvcnQuICBTdWJjbGFzc2VzCi0gKiAgICAgICAgIHRoZSBUaHJpZnRUcmFuc3BvcnQgY2xhc3MuCi0gKi8KLQotLyogdHlwZSBtYWNyb3MgKi8KLSNkZWZpbmUgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZ2V0X3R5cGUgKCkpCi0jZGVmaW5lIFRIUklGVF9GUkFNRURfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0KSkKLSNkZWZpbmUgVEhSSUZUX0lTX0ZSQU1FRF9UUkFOU1BPUlQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUKSkKLSNkZWZpbmUgVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsIFRocmlmdEZyYW1lZFRyYW5zcG9ydENsYXNzKSkKLSNkZWZpbmUgVEhSSUZUX0lTX0ZSQU1FRF9UUkFOU1BPUlRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQpCi0jZGVmaW5lIFRIUklGVF9GUkFNRURfVFJBTlNQT1JUX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0Q2xhc3MpKQotCi0vKiEKLSAqIFRocmlmdEZyYW1lZFRyYW5zcG9ydCBpbnN0YW5jZS4KLSAqLwotc3RydWN0IF9UaHJpZnRGcmFtZWRUcmFuc3BvcnQKLXsKLSAgVGhyaWZ0VHJhbnNwb3J0IHBhcmVudDsKLQotICAvKiBwcm90ZWN0ZWQgKi8KLSAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7Ci0KLSAgLyogcHJpdmF0ZSAqLwotICBHQnl0ZUFycmF5ICpyX2J1ZjsKLSAgR0J5dGVBcnJheSAqd19idWY7Ci0gIGd1aW50MzIgcl9idWZfc2l6ZTsKLSAgZ3VpbnQzMiB3X2J1Zl9zaXplOwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRGcmFtZWRUcmFuc3BvcnQgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0OwotCi0vKiEKLSAqIFRocmlmdEZyYW1lZFRyYW5zcG9ydCBjbGFzcy4KLSAqLwotc3RydWN0IF9UaHJpZnRGcmFtZWRUcmFuc3BvcnRDbGFzcwotewotICBUaHJpZnRUcmFuc3BvcnRDbGFzcyBwYXJlbnQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEZyYW1lZFRyYW5zcG9ydENsYXNzIFRocmlmdEZyYW1lZFRyYW5zcG9ydENsYXNzOwotCi0vKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQgKi8KLUdUeXBlIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2dldF90eXBlICh2b2lkKTsKLQotR19FTkRfREVDTFMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuYyBiL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzY3MTdkLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgInRocmlmdC5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmgiCi0KLS8qIG9iamVjdCBwcm9wZXJ0aWVzICovCi1lbnVtIF9UaHJpZnRNZW1vcnlCdWZmZXJQcm9wZXJ0aWVzCi17Ci0gIFBST1BfMCwKLSAgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVJfU0laRSwKLX07Ci0KLUdfREVGSU5FX1RZUEUoVGhyaWZ0TWVtb3J5QnVmZmVyLCB0aHJpZnRfbWVtb3J5X2J1ZmZlciwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAqLwotZ2Jvb2xlYW4KLXRocmlmdF9tZW1vcnlfYnVmZmVyX2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICovCi1nYm9vbGVhbgotdGhyaWZ0X21lbW9yeV9idWZmZXJfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAqLwotZ2Jvb2xlYW4KLXRocmlmdF9tZW1vcnlfYnVmZmVyX2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICByZXR1cm4gVFJVRTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKi8KLWdpbnQzMgotdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0ID0gVEhSSUZUX01FTU9SWV9CVUZGRVIgKHRyYW5zcG9ydCk7Ci0gIGd1aW50MzIgZ2l2ZSA9IGxlbjsgCi0KLSAgLyogaWYgdGhlIHJlcXVlc3RlZCBieXRlcyBhcmUgbW9yZSB0aGFuIHdoYXQgd2UgaGF2ZSBhdmFpbGFibGUsCi0gICAqIGp1c3QgZ2l2ZSBhbGwgdGhhdCB3ZSBoYXZlIHRoZSBidWZmZXIgKi8KLSAgaWYgKHQtPmJ1Zi0+bGVuIDwgbGVuKQotICB7Ci0gICAgZ2l2ZSA9IHQtPmJ1Zi0+bGVuOwotICB9Ci0KLSAgbWVtY3B5IChidWYsIHQtPmJ1Zi0+ZGF0YSwgZ2l2ZSk7Ci0gIGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPmJ1ZiwgMCwgZ2l2ZSk7Ci0KLSAgcmV0dXJuIGdpdmU7Ci19Ci0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZAotICogY2FsbGVkIHdoZW4gcmVhZCBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KLWdib29sZWFuCi10aHJpZnRfbWVtb3J5X2J1ZmZlcl9yZWFkX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICAvKiBzYXRpc2Z5IC1XYWxsICovCi0gIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICByZXR1cm4gVFJVRTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlICovCi1nYm9vbGVhbgotdGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdwb2ludGVyIGJ1ZiwgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLQotICBUaHJpZnRNZW1vcnlCdWZmZXIgKnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAodHJhbnNwb3J0KTsKLQotICAvKiByZXR1cm4gYW4gZXhjZXB0aW9uIGlmIHRoZSBidWZmZXIgZG9lc24ndCBoYXZlIGVub3VnaCBzcGFjZS4gKi8KLSAgaWYgKGxlbiA+IHQtPmJ1Zl9zaXplIC0gdC0+YnVmLT5sZW4pCi0gIHsKLSAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfU0VORCwKLSAgICAgICAgICAgICAgICAgInVuYWJsZSB0byB3cml0ZSAlZCBieXRlcyB0byBidWZmZXIgb2YgbGVuZ3RoICVkIiwKLSAgICAgICAgICAgICAgICAgbGVuLCB0LT5idWZfc2l6ZSk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9IGVsc2UgewotICAgIHQtPmJ1ZiA9IGdfYnl0ZV9hcnJheV9hcHBlbmQgKHQtPmJ1ZiwgYnVmLCBsZW4pOwotICAgIHJldHVybiBUUlVFOwotICB9Ci19Ci0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQKLSAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLwotZ2Jvb2xlYW4KLXRocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICAvKiBzYXRpc2Z5IC1XYWxsICovCi0gIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICByZXR1cm4gVFJVRTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICovCi1nYm9vbGVhbgotdGhyaWZ0X21lbW9yeV9idWZmZXJfZmx1c2ggKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qIGluaXRpYWxpemVzIHRoZSBpbnN0YW5jZSAqLwotc3RhdGljIHZvaWQKLXRocmlmdF9tZW1vcnlfYnVmZmVyX2luaXQgKFRocmlmdE1lbW9yeUJ1ZmZlciAqdHJhbnNwb3J0KQotewotICB0cmFuc3BvcnQtPmJ1ZiA9IGdfYnl0ZV9hcnJheV9uZXcgKCk7Ci19Ci0KLS8qIGRlc3RydWN0b3IgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfbWVtb3J5X2J1ZmZlcl9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQotewotICBUaHJpZnRNZW1vcnlCdWZmZXIgKnRyYW5zcG9ydCA9IFRIUklGVF9NRU1PUllfQlVGRkVSIChvYmplY3QpOwotCi0gIGlmICh0cmFuc3BvcnQtPmJ1ZiAhPSBOVUxMKQotICB7Ci0gICAgZ19ieXRlX2FycmF5X2ZyZWUgKHRyYW5zcG9ydC0+YnVmLCBUUlVFKTsKLSAgfQotICB0cmFuc3BvcnQtPmJ1ZiA9IE5VTEw7Ci19Ci0KLS8qIHByb3BlcnR5IGFjY2Vzc29yICovCi12b2lkCi10aHJpZnRfbWVtb3J5X2J1ZmZlcl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOwotICBUaHJpZnRNZW1vcnlCdWZmZXIgKnRyYW5zcG9ydCA9IFRIUklGVF9NRU1PUllfQlVGRkVSIChvYmplY3QpOwotCi0gIHN3aXRjaCAocHJvcGVydHlfaWQpCi0gIHsKLSAgICBjYXNlIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfQlVGRkVSX1NJWkU6Ci0gICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdHJhbnNwb3J0LT5idWZfc2l6ZSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vKiBwcm9wZXJ0eSBtdXRhdG9yICovCi12b2lkCi10aHJpZnRfbWVtb3J5X2J1ZmZlcl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOwotICBUaHJpZnRNZW1vcnlCdWZmZXIgKnRyYW5zcG9ydCA9IFRIUklGVF9NRU1PUllfQlVGRkVSIChvYmplY3QpOwotCi0gIHN3aXRjaCAocHJvcGVydHlfaWQpCi0gIHsKLSAgICBjYXNlIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfQlVGRkVSX1NJWkU6Ci0gICAgICB0cmFuc3BvcnQtPmJ1Zl9zaXplID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyogaW5pdGlhbGl6ZXMgdGhlIGNsYXNzICovCi1zdGF0aWMgdm9pZAotdGhyaWZ0X21lbW9yeV9idWZmZXJfY2xhc3NfaW5pdCAoVGhyaWZ0TWVtb3J5QnVmZmVyQ2xhc3MgKmNscykKLXsKLSAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7Ci0gIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWMgPSBOVUxMOwotCi0gIC8qIHNldHVwIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgKi8KLSAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfZ2V0X3Byb3BlcnR5OwotICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9zZXRfcHJvcGVydHk7Ci0KLSAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY191aW50ICgiYnVmX3NpemUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidWZmZXIgc2l6ZSAoY29uc3RydWN0KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgcmVhZCBidWZmZXIgc2l6ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA0ODU3NiwgLyogbWF4LCAxMDI0KjEwMjQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIsIC8qIGRlZmF1bHQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7Ci0gIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfQlVGRkVSX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOwotCi0gIFRocmlmdFRyYW5zcG9ydENsYXNzICp0dGMgPSBUSFJJRlRfVFJBTlNQT1JUX0NMQVNTIChjbHMpOwotCi0gIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfZmluYWxpemU7Ci0gIHR0Yy0+aXNfb3BlbiA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX2lzX29wZW47Ci0gIHR0Yy0+b3BlbiA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX29wZW47Ci0gIHR0Yy0+Y2xvc2UgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jbG9zZTsKLSAgdHRjLT5yZWFkID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZDsKLSAgdHRjLT5yZWFkX2VuZCA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWRfZW5kOwotICB0dGMtPndyaXRlID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGU7Ci0gIHR0Yy0+d3JpdGVfZW5kID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGVfZW5kOwotICB0dGMtPmZsdXNoID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfZmx1c2g7Ci19CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaCBiL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjA3OTI5Li4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfTUVNT1JZX0JVRkZFUl9ICi0jZGVmaW5lIF9USFJJRlRfTUVNT1JZX0JVRkZFUl9ICi0KLSNpbmNsdWRlIDxnbGliLmg+Ci0jaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KLQotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgiCi0KLUdfQkVHSU5fREVDTFMKLQotLyohIFxmaWxlIHRocmlmdF9tZW1vcnlfYnVmZmVyLmgKLSAqICBcYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgbWVtb3J5IGJ1ZmZlciB0cmFuc3BvcnQuCi0gKi8KLQotLyogdHlwZSBtYWNyb3MgKi8KLSNkZWZpbmUgVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiAodGhyaWZ0X21lbW9yeV9idWZmZXJfZ2V0X3R5cGUgKCkpCi0jZGVmaW5lIFRIUklGVF9NRU1PUllfQlVGRkVSKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgVGhyaWZ0TWVtb3J5QnVmZmVyKSkKLSNkZWZpbmUgVEhSSUZUX0lTX01FTU9SWV9CVUZGRVIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSKSkKLSNkZWZpbmUgVEhSSUZUX01FTU9SWV9CVUZGRVJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsIFRocmlmdE1lbW9yeUJ1ZmZlckNsYXNzKSkKLSNkZWZpbmUgVEhSSUZUX0lTX01FTU9SWV9CVUZGRVJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIpCi0jZGVmaW5lIFRIUklGVF9NRU1PUllfQlVGRkVSX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgVGhyaWZ0TWVtb3J5QnVmZmVyQ2xhc3MpKQotCi0vKiEKLSAqIFRocmlmdE1lbW9yeUJ1ZmZlciBpbnN0YW5jZS4KLSAqLwotc3RydWN0IF9UaHJpZnRNZW1vcnlCdWZmZXIKLXsKLSAgVGhyaWZ0VHJhbnNwb3J0IHBhcmVudDsKLQotICAvKiBwcml2YXRlICovCi0gIEdCeXRlQXJyYXkgKmJ1ZjsKLSAgZ3VpbnQzMiBidWZfc2l6ZTsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0TWVtb3J5QnVmZmVyIFRocmlmdE1lbW9yeUJ1ZmZlcjsKLQotLyohCi0gKiBUaHJpZnRNZW1vcnlCdWZmZXIgY2xhc3MuCi0gKi8KLXN0cnVjdCBfVGhyaWZ0TWVtb3J5QnVmZmVyQ2xhc3MKLXsKLSAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgcGFyZW50OwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRNZW1vcnlCdWZmZXJDbGFzcyBUaHJpZnRNZW1vcnlCdWZmZXJDbGFzczsKLQotLyogdXNlZCBieSBUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSICovCi1HVHlwZSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9nZXRfdHlwZSAodm9pZCk7Ci0KLUdfRU5EX0RFQ0xTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmMgYi9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViYzAxYy4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJ0aHJpZnQuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmgiCi0KLS8qIG9iamVjdCBwcm9wZXJ0aWVzICovCi1lbnVtIF9UaHJpZnRTZXJ2ZXJTb2NrZXRQcm9wZXJ0aWVzCi17Ci0gIFBST1BfMCwKLSAgUFJPUF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9QT1JULAotICBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX0JBQ0tMT0cKLX07Ci0KLS8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBzdHJpbmcgKi8KLSNkZWZpbmUgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfRE9NQUlOICJ0aHJpZnQtc2VydmVyLXNvY2tldC1lcnJvci1xdWFyayIKLQotLyogZm9yIGVycm9ycyBjb21pbmcgZnJvbSBzb2NrZXQoKSBhbmQgY29ubmVjdCgpICovCi1leHRlcm4gaW50IGVycm5vOwotCi1HX0RFRklORV9UWVBFKFRocmlmdFNlcnZlclNvY2tldCwgdGhyaWZ0X3NlcnZlcl9zb2NrZXQsIFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQpCi0KLWdib29sZWFuCi10aHJpZnRfc2VydmVyX3NvY2tldF9saXN0ZW4gKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgaW50IGVuYWJsZWQgPSAxOyAvKiBmb3Igc2V0c29ja29wdCgpICovCi0gIHN0cnVjdCBzb2NrYWRkcl9pbiBwaW47Ci0gIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IFRIUklGVF9TRVJWRVJfU09DS0VUICh0cmFuc3BvcnQpOwotCi0gIC8qIGNyZWF0ZSBhIGFkZHJlc3Mgc3RydWN0dXJlICovCi0gIG1lbXNldCAoJnBpbiwgMCwgc2l6ZW9mKHBpbikpOwotICBwaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gIHBpbi5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOwotICBwaW4uc2luX3BvcnQgPSBodG9ucyh0c29ja2V0LT5wb3J0KTsKLQotICAvKiBjcmVhdGUgYSBzb2NrZXQgKi8KLSAgaWYgKCh0c29ja2V0LT5zZCA9IHNvY2tldCAoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApKSA9PSAtMSkKLSAgewotICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IsCi0gICAgICAgICAgICAgICAgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX1NPQ0tFVCwKLSAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBjcmVhdGUgc29ja2V0IC0gJXMiLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICBpZiAoc2V0c29ja29wdCh0c29ja2V0LT5zZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmZW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgc2l6ZW9mKGVuYWJsZWQpKSA9PSAtMSkKLSAgewotICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IsCi0gICAgICAgICAgICAgICAgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX1NFVFNPQ0tPUFQsCi0gICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gc2V0IFNPX1JFVVNFQUREUiAtICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICAvKiBiaW5kIHRvIHRoZSBzb2NrZXQgKi8KLSAgaWYgKGJpbmQodHNvY2tldC0+c2QsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnBpbiwgc2l6ZW9mKHBpbikpID09IC0xKQotICB7Ci0gICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfQklORCwKLSAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBiaW5kIHRvIHBvcnQgJWQgLSAlcyIsCi0gICAgICAgICAgICAgICAgIHRzb2NrZXQtPnBvcnQsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgaWYgKGxpc3Rlbih0c29ja2V0LT5zZCwgdHNvY2tldC0+YmFja2xvZykgPT0gLTEpCi0gIHsKLSAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SLAotICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9MSVNURU4sCi0gICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gbGlzdGVuIHRvIHBvcnQgJWQgLSAlcyIsCi0gICAgICAgICAgICAgICAgIHRzb2NrZXQtPnBvcnQsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLVRocmlmdFRyYW5zcG9ydCAqCi10aHJpZnRfc2VydmVyX3NvY2tldF9hY2NlcHQgKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgaW50IHNkID0gMDsKLSAgZ3VpbnQgYWRkcmxlbiA9IDA7Ci0gIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyZXNzOwotICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IE5VTEw7Ci0KLSAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gVEhSSUZUX1NFUlZFUl9TT0NLRVQgKHRyYW5zcG9ydCk7Ci0KLSAgaWYgKChzZCA9IGFjY2VwdCh0c29ja2V0LT5zZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkcmVzcywgJmFkZHJsZW4pKSA9PSAtMSkKLSAgewotICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IsCi0gICAgICAgICAgICAgICAgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0FDQ0VQVCwKLSAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBhY2NlcHQgY29ubmVjdGlvbiAtICVzIiwKLSAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICBzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgTlVMTCk7Ci0gIHNvY2tldC0+c2QgPSBzZDsKLQotICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVChzb2NrZXQpOwotfQotCi1nYm9vbGVhbgotdGhyaWZ0X3NlcnZlcl9zb2NrZXRfY2xvc2UgKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gVEhSSUZUX1NFUlZFUl9TT0NLRVQgKHRyYW5zcG9ydCk7Ci0KLSAgaWYgKGNsb3NlICh0c29ja2V0LT5zZCkgPT0gLTEpCi0gIHsKLSAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SLAotICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9DTE9TRSwKLSAgICAgICAgICAgICAgICAgInVuYWJsZSB0byBjbG9zZSBzb2NrZXQgLSAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0gIHRzb2NrZXQtPnNkID0gMDsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIGZvciB0aGlzIGltcGxlbWVudGF0aW9uICovCi1HUXVhcmsKLXRocmlmdF9zZXJ2ZXJfc29ja2V0X2Vycm9yX3F1YXJrICh2b2lkKQotewotICByZXR1cm4gZ19xdWFya19mcm9tX3N0YXRpY19zdHJpbmcoVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfRE9NQUlOKTsKLX0KLQotLyogaW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlICovCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3NlcnZlcl9zb2NrZXRfaW5pdCAoVGhyaWZ0U2VydmVyU29ja2V0ICpzb2NrZXQpCi17Ci0gIHNvY2tldC0+c2QgPSAwOwotfQotCi0vKiBkZXN0cnVjdG9yICovCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3NlcnZlcl9zb2NrZXRfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKLXsKLSAgVGhyaWZ0U2VydmVyU29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU0VSVkVSX1NPQ0tFVCAob2JqZWN0KTsKLQotICBpZiAoc29ja2V0LT5zZCAhPSAwKQotICB7Ci0gICAgY2xvc2UgKHNvY2tldC0+c2QpOwotICB9Ci0gIHNvY2tldC0+c2QgPSAwOwotfQotCi0vKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwotdm9pZAotdGhyaWZ0X3NlcnZlcl9zb2NrZXRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKLXsKLSAgVGhyaWZ0U2VydmVyU29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU0VSVkVSX1NPQ0tFVCAob2JqZWN0KTsKLQotICBzd2l0Y2ggKHByb3BlcnR5X2lkKQotICB7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX1BPUlQ6Ci0gICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc29ja2V0LT5wb3J0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9CQUNLTE9HOgotICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNvY2tldC0+YmFja2xvZyk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vKiBwcm9wZXJ0eSBtdXRhdG9yICovCi12b2lkCi10aHJpZnRfc2VydmVyX3NvY2tldF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQotewotICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TRVJWRVJfU09DS0VUIChvYmplY3QpOwotCi0gIHN3aXRjaCAocHJvcGVydHlfaWQpCi0gIHsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9TT0NLRVRfUE9SVDoKLSAgICAgIHNvY2tldC0+cG9ydCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9CQUNLTE9HOgotICAgICAgc29ja2V0LT5iYWNrbG9nID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyogaW5pdGlhbGl6ZXMgdGhlIGNsYXNzICovCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3NlcnZlcl9zb2NrZXRfY2xhc3NfaW5pdCAoVGhyaWZ0U2VydmVyU29ja2V0Q2xhc3MgKmNscykKLXsKLSAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7Ci0gIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWMgPSBOVUxMOwotCi0gIC8qIHNldHVwIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgKi8KLSAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NlcnZlcl9zb2NrZXRfZ2V0X3Byb3BlcnR5OwotICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfc2VydmVyX3NvY2tldF9zZXRfcHJvcGVydHk7Ci0KLSAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY191aW50ICgicG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQgKGNvbnN0cnVjdCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHBvcnQgdG8gbGlzdGVuIHRvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTUzNCwgLyogbWF4ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTA5MCwgLyogZGVmYXVsdCBieSBjb252ZW50aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOwotICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX1BPUlQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKLQotICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJiYWNrbG9nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja2xvZyAoY29uc3RydWN0KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgYWNjZXB0IGJhY2tsb2ciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1heCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1NTM0LCAvKiBtYXggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0LCAvKiBkZWZhdWx0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOwotICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX0JBQ0tMT0csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOwotCi0gIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X3NlcnZlcl9zb2NrZXRfZmluYWxpemU7Ci0KLSAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MgKnRzdGMgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKLSAgdHN0Yy0+bGlzdGVuID0gdGhyaWZ0X3NlcnZlcl9zb2NrZXRfbGlzdGVuOwotICB0c3RjLT5hY2NlcHQgPSB0aHJpZnRfc2VydmVyX3NvY2tldF9hY2NlcHQ7Ci0gIHRzdGMtPmNsb3NlID0gdGhyaWZ0X3NlcnZlcl9zb2NrZXRfY2xvc2U7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oIGIvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YTYwMTcuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9TRVJWRVJfU09DS0VUX0gKLSNkZWZpbmUgX1RIUklGVF9TRVJWRVJfU09DS0VUX0gKLQotI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+Ci0KLSNpbmNsdWRlICJ0aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oIgotCi1HX0JFR0lOX0RFQ0xTCi0KLS8qISBcZmlsZSB0aHJpZnRfc2VydmVyX3NvY2tldC5oCi0gKiAgXGJyaWVmIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBzZXJ2ZXIgdHJhbnNwb3J0LiAgSW1wbGVtZW50cyB0aGUKLSAqICAgICAgICAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0IGNsYXNzLgotICovCi0KLS8qIHR5cGUgbWFjcm9zICovCi0jZGVmaW5lIFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQgKHRocmlmdF9zZXJ2ZXJfc29ja2V0X2dldF90eXBlICgpKQotI2RlZmluZSBUSFJJRlRfU0VSVkVSX1NPQ0tFVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsIFRocmlmdFNlcnZlclNvY2tldCkpCi0jZGVmaW5lIFRIUklGVF9JU19TRVJWRVJfU09DS0VUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCkpCi0jZGVmaW5lIFRIUklGVF9TRVJWRVJfU09DS0VUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULCBUaHJpZnRTZXJ2ZXJTb2NrZXRDbGFzcykpCi0jZGVmaW5lIFRIUklGVF9JU19TRVJWRVJfU09DS0VUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VUKSkKLSNkZWZpbmUgVEhSSUZUX1NFUlZFUl9TT0NLRVRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULCBUaHJpZnRTZXJ2ZXJTb2NrZXRDbGFzcykpCi0KLS8qIQotICogVGhyaWZ0IFNlcnZlclNvY2tldCBpbnN0YW5jZS4KLSAqLwotc3RydWN0IF9UaHJpZnRTZXJ2ZXJTb2NrZXQKLXsKLSAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0IHBhcmVudDsKLQotICAvKiBwcml2YXRlICovCi0gIGdzaG9ydCBwb3J0OwotICBnc2hvcnQgYmFja2xvZzsKLSAgaW50IHNkOwotICBndWludDggKmJ1ZjsKLSAgZ3VpbnQzMiBidWZfc2l6ZTsKLSAgZ3VpbnQzMiBidWZfbGVuOwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRTZXJ2ZXJTb2NrZXQgVGhyaWZ0U2VydmVyU29ja2V0OwotCi0vKiEKLSAqIFRocmlmdCBTZXJ2ZXJTb2NrZXQgY2xhc3MuCi0gKi8KLXN0cnVjdCBfVGhyaWZ0U2VydmVyU29ja2V0Q2xhc3MKLXsKLSAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MgcGFyZW50OwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRTZXJ2ZXJTb2NrZXRDbGFzcyBUaHJpZnRTZXJ2ZXJTb2NrZXRDbGFzczsKLQotLyogdXNlZCBieSBUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VUICovCi1HVHlwZSB0aHJpZnRfc2VydmVyX3NvY2tldF9nZXRfdHlwZSAodm9pZCk7Ci0KLS8qIGRlZmluZSBlcnJvci9leGNlcHRpb24gdHlwZXMgKi8KLXR5cGVkZWYgZW51bQotewotICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9TT0NLRVQsCi0gIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX1NFVFNPQ0tPUFQsCi0gIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0JJTkQsCi0gIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0xJU1RFTiwKLSAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfQUNDRVBULAotICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9DTE9TRQotfSBUaHJpZnRTZXJ2ZXJTb2NrZXRFcnJvcjsKLQotLyogZGVmaW5lIGEgZXJyb3IgZG9tYWluIGZvciBHRXJyb3IgdG8gdXNlICovCi1HUXVhcmsgdGhyaWZ0X3NlcnZlcl9zb2NrZXRfZXJyb3JfcXVhcmsgKHZvaWQpOwotI2RlZmluZSBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUiAodGhyaWZ0X3NlcnZlcl9zb2NrZXRfZXJyb3JfcXVhcmsgKCkpCi0KLUdfRU5EX0RFQ0xTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmMgYi9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdjZThlMC4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuYworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInRocmlmdC5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmgiCi0KLUdfREVGSU5FX0FCU1RSQUNUX1RZUEUoVGhyaWZ0U2VydmVyVHJhbnNwb3J0LCB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydCwgR19UWVBFX09CSkVDVCkKLQotLyogYmFzZSBpbml0aWFsaXplciBmb3IgdGhlIHNlcnZlciB0cmFuc3BvcnQgaW50ZXJmYWNlICovCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfY2xhc3NfaW5pdCAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MgKmMpCi17Ci0gIGMtPmxpc3RlbiA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbjsKLSAgYy0+YWNjZXB0ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0OwotICBjLT5jbG9zZSA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2Nsb3NlOwotfQotCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfaW5pdCAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOwotfQotCi1nYm9vbGVhbgotdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmxpc3RlbiAodHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotVGhyaWZ0VHJhbnNwb3J0ICoKLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5hY2NlcHQgKHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdib29sZWFuCi10aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9jbG9zZSAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5jbG9zZSAodHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmggYi9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ5NDMyNS4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfSAotI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfSAotCi0jaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KLQotI2luY2x1ZGUgInRocmlmdF90cmFuc3BvcnQuaCIKLQotR19CRUdJTl9ERUNMUwotCi0vKiEgXGZpbGUgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaAotICogIFxicmllZiBBYnN0cmFjdCBjbGFzcyBmb3IgVGhyaWZ0IHNlcnZlciB0cmFuc3BvcnRzLgotICovCi0KLS8qIHR5cGUgbWFjcm9zICovCi0jZGVmaW5lIFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQgKHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2dldF90eXBlICgpKQotI2RlZmluZSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQsIFRocmlmdFNlcnZlclRyYW5zcG9ydCkpCi0jZGVmaW5lIFRIUklGVF9JU19TRVJWRVJfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCkpCi0jZGVmaW5lIFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JULCBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcykpCi0jZGVmaW5lIFRIUklGVF9JU19TRVJWRVJfVFJBTlNQT1JUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JUKSkKLSNkZWZpbmUgVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JULCBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcykpCi0KLXN0cnVjdCBfVGhyaWZ0U2VydmVyVHJhbnNwb3J0Ci17Ci0gIEdPYmplY3QgcGFyZW50OwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgVGhyaWZ0U2VydmVyVHJhbnNwb3J0OwotCi0vKiEKLSAqIFRocmlmdCBUcmFuc3BvcnQgY2xhc3MKLSAqLwotc3RydWN0IF9UaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcwotewotICBHT2JqZWN0Q2xhc3MgcGFyZW50OwotCi0gIC8qIHZ0YWJsZSAqLwotICBnYm9vbGVhbiAoKmxpc3RlbikgKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7Ci0gIFRocmlmdFRyYW5zcG9ydCAqKCphY2NlcHQpIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOwotICBnYm9vbGVhbiAoKmNsb3NlKSAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MgVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3M7Ci0KLS8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCAqLwotR1R5cGUgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfZ2V0X3R5cGUgKHZvaWQpOwotCi0vKiEKLSAqIExpc3RlbiBmb3IgbmV3IGNvbm5lY3Rpb25zLgotICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MKLSAqLwotZ2Jvb2xlYW4gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi0vKiEKLSAqIEFjY2VwdCBhIGNvbm5lY3Rpb24uCi0gKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcwotICovCi1UaHJpZnRUcmFuc3BvcnQgKnRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdAotICAgIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOwotCi0vKiEKLSAqIENsb3NlIHRoZSB0cmFuc3BvcnQuCi0gKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcwotICovCi1nYm9vbGVhbiB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9jbG9zZSAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1HX0VORF9ERUNMUwotCi0jZW5kaWYgLyogX1RIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMgYi9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjMxYmM2Li4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAidGhyaWZ0LmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oIgotCi0vKiBvYmplY3QgcHJvcGVydGllcyAqLwotZW51bSBfVGhyaWZ0U29ja2V0UHJvcGVydGllcwotewotICBQUk9QXzAsCi0gIFBST1BfVEhSSUZUX1NPQ0tFVF9IT1NUTkFNRSwKLSAgUFJPUF9USFJJRlRfU09DS0VUX1BPUlQKLX07Ci0KLS8qIGZvciBlcnJvcnMgY29taW5nIGZyb20gc29ja2V0KCkgYW5kIGNvbm5lY3QoKSAqLwotZXh0ZXJuIGludCBlcnJubzsKLQotR19ERUZJTkVfVFlQRShUaHJpZnRTb2NrZXQsIHRocmlmdF9zb2NrZXQsIFRIUklGVF9UWVBFX1RSQU5TUE9SVCkKLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKi8KLWdib29sZWFuCi10aHJpZnRfc29ja2V0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQotewotICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7Ci0gIHJldHVybiBzb2NrZXQtPnNkICE9IDA7Ci19Ci0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICovCi1nYm9vbGVhbgotdGhyaWZ0X3NvY2tldF9vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHN0cnVjdCBob3N0ZW50ICpocCA9IE5VTEw7Ci0gIHN0cnVjdCBzb2NrYWRkcl9pbiBwaW47Ci0KLSAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHRzb2NrZXQtPnNkID09IDAsIEZBTFNFKTsKLQotICAvKiBsb29rdXAgdGhlIGRlc3RpbmF0aW9uIGhvc3QgKi8KLSAgaWYgKChocCA9IGdldGhvc3RieW5hbWUgKHRzb2NrZXQtPmhvc3RuYW1lKSkgPT0gTlVMTCkKLSAgewotICAgIC8qIGhvc3QgbG9va3VwIGZhaWxlZCwgYmFpbCBvdXQgd2l0aCBhbiBlcnJvciAqLwotICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9IT1NULAotICAgICAgICAgICAgICAgICAiaG9zdCBsb29rdXAgZmFpbGVkIGZvciAlczolZCAtICVzIiwKLSAgICAgICAgICAgICAgICAgdHNvY2tldC0+aG9zdG5hbWUsIHRzb2NrZXQtPnBvcnQsCi0gICAgICAgICAgICAgICAgIGhzdHJlcnJvciAoaF9lcnJubykpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIC8qIGNyZWF0ZSBhIHNvY2tldCBzdHJ1Y3R1cmUgKi8KLSAgbWVtc2V0ICgmcGluLCAwLCBzaXplb2YocGluKSk7Ci0gIHBpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLSAgcGluLnNpbl9hZGRyLnNfYWRkciA9ICgoc3RydWN0IGluX2FkZHIgKikgKGhwLT5oX2FkZHIpKS0+c19hZGRyOwotICBwaW4uc2luX3BvcnQgPSBodG9ucyAodHNvY2tldC0+cG9ydCk7IAotCi0gIC8qIGNyZWF0ZSB0aGUgc29ja2V0ICovCi0gIGlmICgodHNvY2tldC0+c2QgPSBzb2NrZXQgKEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKSkgPT0gLTEpCi0gIHsKLSAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfU09DS0VULAotICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGNyZWF0ZSBzb2NrZXQgZm9yIGhvc3QgJXM6JWQgLSAlcyIsCi0gICAgICAgICAgICAgICAgIHRzb2NrZXQtPmhvc3RuYW1lLCB0c29ja2V0LT5wb3J0LAotICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIC8qIG9wZW4gYSBjb25uZWN0aW9uICovCi0gIGlmIChjb25uZWN0ICh0c29ja2V0LT5zZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmcGluLCBzaXplb2YocGluKSkgPT0gLTEpCi0gIHsKLSAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfQ09OTkVDVCwKLSAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBjb25uZWN0IHRvIGhvc3QgJXM6JWQgLSAlcyIsCi0gICAgICAgICAgICAgICAgIHRzb2NrZXQtPmhvc3RuYW1lLCB0c29ja2V0LT5wb3J0LCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIHJldHVybiBUUlVFOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKi8KLWdib29sZWFuCi10aHJpZnRfc29ja2V0X2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKLQotICBpZiAoY2xvc2UgKHNvY2tldC0+c2QpID09IC0xKQotICB7Ci0gICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX0NMT1NFLAotICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIGNsb3NlIHNvY2tldCAtICVzIiwKLSAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICBzb2NrZXQtPnNkID0gMDsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICovCi1naW50MzIKLXRocmlmdF9zb2NrZXRfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQotewotICBnaW50IHJldCA9IDA7Ci0gIGd1aW50IGdvdCA9IDA7Ci0KLSAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOwotCi0gIHdoaWxlIChnb3QgPCBsZW4pCi0gIHsKLSAgICByZXQgPSByZWN2IChzb2NrZXQtPnNkLCBidWYsIGxlbiwgMCk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgewotICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAotICAgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfUkVDRUlWRSwKLSAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHJlYWQgJWQgYnl0ZXMgLSAlcyIsIGxlbiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgZ290ICs9IHJldDsKLSAgfQotCi0gIHJldHVybiBnb3Q7Ci19Ci0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZAotICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCi1nYm9vbGVhbgotdGhyaWZ0X3NvY2tldF9yZWFkX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICAvKiBzYXRpc2Z5IC1XYWxsICovCi0gIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICByZXR1cm4gVFJVRTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlICovCi1nYm9vbGVhbgotdGhyaWZ0X3NvY2tldF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGNvbnN0IGdwb2ludGVyIGJ1ZiwgICAgIAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQotewotICBnaW50IHJldCA9IDA7Ci0gIGd1aW50IHNlbnQgPSAwOwotCi0gIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNvY2tldC0+c2QgIT0gMCwgRkFMU0UpOwotCi0gIHdoaWxlIChzZW50IDwgbGVuKQotICB7Ci0gICAgcmV0ID0gc2VuZCAoc29ja2V0LT5zZCwgYnVmICsgc2VudCwgbGVuIC0gc2VudCwgMCk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgewotICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAotICAgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfU0VORCwKLSAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHNlbmQgJWQgYnl0ZXMgLSAlcyIsIGxlbiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgc2VudCArPSByZXQ7Ci0gIH0KLQotICByZXR1cm4gVFJVRTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZAotICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCi1nYm9vbGVhbgotdGhyaWZ0X3NvY2tldF93cml0ZV9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgLyogc2F0aXNmeSAtV2FsbCAqLwotICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaAotICogZmx1c2ggcGVuZGluZyBkYXRhLiAgc2luY2Ugd2UgYXJlIG5vdCBidWZmZXJlZCwgdGhpcyBpcyBhIG5vLW9wICovCi1nYm9vbGVhbgotdGhyaWZ0X3NvY2tldF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICAvKiBzYXRpc2Z5IC1XYWxsICovCi0gIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICByZXR1cm4gVFJVRTsKLX0KLQotLyogaW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlICovCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3NvY2tldF9pbml0IChUaHJpZnRTb2NrZXQgKnNvY2tldCkKLXsKLSAgc29ja2V0LT5zZCA9IDA7Ci19Ci0KLS8qIGRlc3RydWN0b3IgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfc29ja2V0X2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCi17Ci0gIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAob2JqZWN0KTsKLQotICBpZiAoc29ja2V0LT5ob3N0bmFtZSAhPSBOVUxMKQotICB7Ci0gICAgZ19mcmVlIChzb2NrZXQtPmhvc3RuYW1lKTsKLSAgfQotICBzb2NrZXQtPmhvc3RuYW1lID0gTlVMTDsKLQotICBpZiAoc29ja2V0LT5zZCAhPSAwKQotICB7Ci0gICAgY2xvc2UgKHNvY2tldC0+c2QpOwotICB9Ci0gIHNvY2tldC0+c2QgPSAwOwotfQotCi0vKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwotdm9pZAotdGhyaWZ0X3NvY2tldF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7Ci0gIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAob2JqZWN0KTsKLQotICBzd2l0Y2ggKHByb3BlcnR5X2lkKQotICB7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TT0NLRVRfSE9TVE5BTUU6Ci0gICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzb2NrZXQtPmhvc3RuYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJPUF9USFJJRlRfU09DS0VUX1BPUlQ6Ci0gICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc29ja2V0LT5wb3J0KTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qIHByb3BlcnR5IG11dGF0b3IgKi8KLXZvaWQKLXRocmlmdF9zb2NrZXRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOwotICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKG9iamVjdCk7Ci0KLSAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKLSAgewotICAgIGNhc2UgUFJPUF9USFJJRlRfU09DS0VUX0hPU1ROQU1FOgotICAgICAgc29ja2V0LT5ob3N0bmFtZSA9IGdfc3RyZHVwIChnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1NPQ0tFVF9QT1JUOgotICAgICAgc29ja2V0LT5wb3J0ID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyogaW5pdGlhbGl6ZXMgdGhlIGNsYXNzICovCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3NvY2tldF9jbGFzc19pbml0IChUaHJpZnRTb2NrZXRDbGFzcyAqY2xzKQotewotICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKLSAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYyA9IE5VTEw7Ci0KLSAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLwotICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfc29ja2V0X2dldF9wcm9wZXJ0eTsKLSAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NvY2tldF9zZXRfcHJvcGVydHk7Ci0KLSAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19zdHJpbmcgKCJob3N0bmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUgKGNvbnN0cnVjdCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgaG9zdG5hbWUgb2YgdGhlIHJlbW90ZSBob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2NhbGhvc3QiLCAvKiBkZWZhdWx0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKLSAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9USFJJRlRfU09DS0VUX0hPU1ROQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKLQotICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJwb3J0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCAoY29uc3RydWN0KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgcG9ydCBvZiB0aGUgcmVtb3RlIGhvc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1NTM0LCAvKiBtYXggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MDkwLCAvKiBkZWZhdWx0IGJ5IGNvbnZlbnRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7Ci0gIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVEhSSUZUX1NPQ0tFVF9QT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKLQotICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKLQotICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9zb2NrZXRfZmluYWxpemU7Ci0gIHR0Yy0+aXNfb3BlbiA9IHRocmlmdF9zb2NrZXRfaXNfb3BlbjsKLSAgdHRjLT5vcGVuID0gdGhyaWZ0X3NvY2tldF9vcGVuOwotICB0dGMtPmNsb3NlID0gdGhyaWZ0X3NvY2tldF9jbG9zZTsKLSAgdHRjLT5yZWFkID0gdGhyaWZ0X3NvY2tldF9yZWFkOwotICB0dGMtPnJlYWRfZW5kID0gdGhyaWZ0X3NvY2tldF9yZWFkX2VuZDsKLSAgdHRjLT53cml0ZSA9IHRocmlmdF9zb2NrZXRfd3JpdGU7Ci0gIHR0Yy0+d3JpdGVfZW5kID0gdGhyaWZ0X3NvY2tldF93cml0ZV9lbmQ7Ci0gIHR0Yy0+Zmx1c2ggPSB0aHJpZnRfc29ja2V0X2ZsdXNoOwotfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaCBiL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZGQzNTcuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1NPQ0tFVF9ICi0jZGVmaW5lIF9USFJJRlRfU09DS0VUX0gKLQotI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+Ci0KLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oIgotCi1HX0JFR0lOX0RFQ0xTCi0KLS8qISBcZmlsZSB0aHJpZnRfc29ja2V0LmgKLSAqICBcYnJpZWYgU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IHRyYW5zcG9ydC4gIFN1YmNsYXNzZXMgdGhlCi0gKiAgICAgICAgIFRocmlmdFRyYW5zcG9ydCBjbGFzcy4KLSAqLwotCi0vKiB0eXBlIG1hY3JvcyAqLwotI2RlZmluZSBUSFJJRlRfVFlQRV9TT0NLRVQgKHRocmlmdF9zb2NrZXRfZ2V0X3R5cGUgKCkpCi0jZGVmaW5lIFRIUklGVF9TT0NLRVQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9TT0NLRVQsIFRocmlmdFNvY2tldCkpCi0jZGVmaW5lIFRIUklGVF9JU19TT0NLRVQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9TT0NLRVQpKQotI2RlZmluZSBUSFJJRlRfU09DS0VUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TT0NLRVQsIFRocmlmdFNvY2tldENsYXNzKSkKLSNkZWZpbmUgVEhSSUZUX0lTX1NPQ0tFVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfU09DS0VUKSkKLSNkZWZpbmUgVEhSSUZUX1NPQ0tFVF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1NPQ0tFVCwgVGhyaWZ0U29ja2V0Q2xhc3MpKQotCi0vKiEKLSAqIFRocmlmdCBTb2NrZXQgaW5zdGFuY2UuCi0gKi8KLXN0cnVjdCBfVGhyaWZ0U29ja2V0Ci17Ci0gIFRocmlmdFRyYW5zcG9ydCBwYXJlbnQ7Ci0KLSAgLyogcHJpdmF0ZSAqLwotICBnY2hhciAqaG9zdG5hbWU7Ci0gIGdzaG9ydCBwb3J0OwotICBpbnQgc2Q7Ci0gIGd1aW50OCAqYnVmOwotICBndWludDMyIGJ1Zl9zaXplOwotICBndWludDMyIGJ1Zl9sZW47Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNvY2tldCBUaHJpZnRTb2NrZXQ7Ci0KLS8qIQotICogVGhyaWZ0IFNvY2tldCBjbGFzcy4KLSAqLwotc3RydWN0IF9UaHJpZnRTb2NrZXRDbGFzcwotewotICBUaHJpZnRUcmFuc3BvcnRDbGFzcyBwYXJlbnQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNvY2tldENsYXNzIFRocmlmdFNvY2tldENsYXNzOwotCi0vKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1NPQ0tFVCAqLwotR1R5cGUgdGhyaWZ0X3NvY2tldF9nZXRfdHlwZSAodm9pZCk7Ci0KLUdfRU5EX0RFQ0xTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNzc4N2QuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ0aHJpZnQuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oIgotCi0vKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gc3RyaW5nICovCi0jZGVmaW5lIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfRE9NQUlOICJ0aHJpZnQtdHJhbnNwb3J0LWVycm9yLXF1YXJrIgotCi1HX0RFRklORV9BQlNUUkFDVF9UWVBFKFRocmlmdFRyYW5zcG9ydCwgdGhyaWZ0X3RyYW5zcG9ydCwgR19UWVBFX09CSkVDVCkKLQotZ2Jvb2xlYW4gCi10aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQotewotICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmlzX29wZW4gKHRyYW5zcG9ydCk7Ci19Ci0KLWdib29sZWFuCi10aHJpZnRfdHJhbnNwb3J0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5vcGVuICh0cmFuc3BvcnQsIGVycm9yKTsKLX0KLQotZ2Jvb2xlYW4KLXRocmlmdF90cmFuc3BvcnRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5jbG9zZSAodHJhbnNwb3J0LCBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+cmVhZCAodHJhbnNwb3J0LCBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7Ci19Ci0KLWdib29sZWFuCi10aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+cmVhZF9lbmQgKHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1nYm9vbGVhbgotdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT53cml0ZSAodHJhbnNwb3J0LCBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOwotfQotCi1nYm9vbGVhbgotdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT53cml0ZV9lbmQgKHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2Jvb2xlYW4KLXRocmlmdF90cmFuc3BvcnRfZmx1c2ggKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5mbHVzaCAodHJhbnNwb3J0LCBlcnJvcik7Ci19Ci0KLS8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBmb3IgVGhyaWZ0IHRyYW5zcG9ydHMgKi8KLUdRdWFyawotdGhyaWZ0X3RyYW5zcG9ydF9lcnJvcl9xdWFyayAodm9pZCkKLXsKLSAgcmV0dXJuIGdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nIChUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX0RPTUFJTik7Ci19Ci0KLS8qIGNsYXNzIGluaXRpYWxpemVyIGZvciBUaHJpZnRUcmFuc3BvcnQgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfdHJhbnNwb3J0X2NsYXNzX2luaXQgKFRocmlmdFRyYW5zcG9ydENsYXNzICpjbHMpCi17Ci0gIC8qIHNldCB0aGVzZSBhcyB2aXJ0dWFsIG1ldGhvZHMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcyAqLwotICBjbHMtPmlzX29wZW4gPSB0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW47Ci0gIGNscy0+b3BlbiA9IHRocmlmdF90cmFuc3BvcnRfb3BlbjsKLSAgY2xzLT5jbG9zZSA9IHRocmlmdF90cmFuc3BvcnRfY2xvc2U7Ci0gIGNscy0+cmVhZCA9IHRocmlmdF90cmFuc3BvcnRfcmVhZDsKLSAgY2xzLT5yZWFkX2VuZCA9IHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQ7Ci0gIGNscy0+d3JpdGUgPSB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlOwotICBjbHMtPndyaXRlX2VuZCA9IHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kOwotICBjbHMtPmZsdXNoID0gdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaDsKLX0KLQotc3RhdGljIHZvaWQKLXRocmlmdF90cmFuc3BvcnRfaW5pdCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOwotfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaCBiL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OTc0NzMuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfSAotI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9ICi0KLSNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgotCi1HX0JFR0lOX0RFQ0xTCi0KLS8qISBcZmlsZSB0aHJpZnRfdHJhbnNwb3J0LmgKLSAqICBcYnJpZWYgQWJzdHJhY3QgY2xhc3MgZm9yIFRocmlmdCB0cmFuc3BvcnRzLgotICoKLSAqIEFuIGFic3RyYWN0IGNsYXNzIGlzIHVzZWQgaW5zdGVhZCBvZiBhbiBpbnRlcmZhY2UgYmVjYXVzZToKLSAqICAtIGludGVyZmFjZXMgY2FuJ3Qgc2VlbSB0byBiZSB1c2VkIGFzIHByb3BlcnRpZXMuICBUaHJpZnRQcm90b2NvbCBoYXMKLSAqICAgIGEgVGhyaWZ0VHJhbnNwb3J0IGFzIGFuIG9iamVjdCBwcm9wZXJ0eS4KLSAqICAtIGlmIGEgbWV0aG9kIG5lZWRzIHRvIGJlIGFkZGVkIHRoYXQgYWxsIHN1YmNsYXNzZXMgY2FuIHVzZSwgYSBjbGFzcwotICogICAgaXMgbmVjZXNzYXJ5LgotICovCi0KLS8qIHR5cGUgbWFjcm9zICovCi0jZGVmaW5lIFRIUklGVF9UWVBFX1RSQU5TUE9SVCAodGhyaWZ0X3RyYW5zcG9ydF9nZXRfdHlwZSAoKSkKLSNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1RSQU5TUE9SVCwgVGhyaWZ0VHJhbnNwb3J0KSkKLSNkZWZpbmUgVEhSSUZUX0lTX1RSQU5TUE9SVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1RSQU5TUE9SVCkpCi0jZGVmaW5lIFRIUklGVF9UUkFOU1BPUlRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1RSQU5TUE9SVCwgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MpKQotI2RlZmluZSBUSFJJRlRfSVNfVFJBTlNQT1JUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQpKQotI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JULCBUaHJpZnRUcmFuc3BvcnRDbGFzcykpCi0KLS8qIQotICogVGhyaWZ0IFByb3RvY29sIG9iamVjdAotICovCi1zdHJ1Y3QgX1RocmlmdFRyYW5zcG9ydAotewotICBHT2JqZWN0IHBhcmVudDsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0VHJhbnNwb3J0IFRocmlmdFRyYW5zcG9ydDsKLQotLyohCi0gKiBUaHJpZnQgVHJhbnNwb3J0IGNsYXNzCi0gKi8KLXN0cnVjdCBfVGhyaWZ0VHJhbnNwb3J0Q2xhc3MKLXsKLSAgR09iamVjdENsYXNzIHBhcmVudDsKLQotICAvKiB2dGFibGUgKi8KLSAgZ2Jvb2xlYW4gKCppc19vcGVuKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpOwotICBnYm9vbGVhbiAoKm9wZW4pIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOwotICBnYm9vbGVhbiAoKmNsb3NlKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqcmVhZCkgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCi0gICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOwotICBnYm9vbGVhbiAoKnJlYWRfZW5kKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2Jvb2xlYW4gKCp3cml0ZSkgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBjb25zdCBncG9pbnRlciBidWYsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKTsKLSAgZ2Jvb2xlYW4gKCp3cml0ZV9lbmQpIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOwotICBnYm9vbGVhbiAoKmZsdXNoKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgVGhyaWZ0VHJhbnNwb3J0Q2xhc3M7Ci0KLS8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfVFJBTlNQT1JUICovCi1HVHlwZSB0aHJpZnRfdHJhbnNwb3J0X2dldF90eXBlICh2b2lkKTsKLQotLyogdmlydHVhbCBwdWJsaWMgbWV0aG9kcyAqLwotCi0vKiEKLSAqIENoZWNrcyBpZiB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuZWQuCi0gKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKLSAqLwotZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7Ci0KLS8qIQotICogT3BlbiB0aGUgdHJhbnNwb3J0IGZvciByZWFkaW5nIGFuZCB3cml0aW5nLgotICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCi0gKi8KLWdib29sZWFuIHRocmlmdF90cmFuc3BvcnRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKLQotLyohCi0gKiBDbG9zZSB0aGUgdHJhbnNwb3J0LgotICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCi0gKi8KLWdib29sZWFuIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7Ci0KLS8qIQotICogUmVhZCBzb21lIGRhdGEgaW50byB0aGUgYnVmZmVyIGJ1Zi4KLSAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFRyYW5zcG9ydEludGVyZmFjZQotICovCi1naW50MzIgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKTsKLQotLyohCi0gKiBDYWxsZWQgd2hlbiByZWFkIGlzIGNvbXBsZXRlZC4KLSAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFRyYW5zcG9ydEludGVyZmFjZQotICovCi1nYm9vbGVhbiB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOwotCi0vKiEKLSAqIFdyaXRlcyBkYXRhIGZyb20gYSBidWZmZXIgdG8gdGhlIHRyYW5zcG9ydC4KLSAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFRyYW5zcG9ydEludGVyZmFjZQotICovCi1nYm9vbGVhbiB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgY29uc3QgZ3BvaW50ZXIgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKTsKLQotLyohCi0gKiBDYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZWQuCi0gKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKLSAqLwotZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotLyohCi0gKiBGbHVzaGVzIGFueSBwZW5kaW5nIGRhdGEgdG8gYmUgd3JpdHRlbi4gIFR5cGljYWxseSB1c2VkIHdpdGggYnVmZmVyZWQKLSAqIHRyYW5zcG9ydCBtZWNoYW5pc21zLgotICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCi0gKi8KLWdib29sZWFuIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7Ci0KLS8qIGRlZmluZSBlcnJvci9leGNlcHRpb24gdHlwZXMgKi8KLXR5cGVkZWYgZW51bQotewotICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1VOS05PV04sCi0gIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfSE9TVCwKLSAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TT0NLRVQsCi0gIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfQ09OTkVDVCwKLSAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TRU5ELAotICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1JFQ0VJVkUsCi0gIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfQ0xPU0UKLX0gVGhyaWZ0VHJhbnNwb3J0RXJyb3I7Ci0KLS8qIGRlZmluZSBhbiBlcnJvciBkb21haW4gZm9yIEdFcnJvciB0byB1c2UgKi8KLUdRdWFyayB0aHJpZnRfdHJhbnNwb3J0X2Vycm9yX3F1YXJrICh2b2lkKTsKLSNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiAodGhyaWZ0X3RyYW5zcG9ydF9lcnJvcl9xdWFyayAoKSkKLQotR19FTkRfREVDTFMKLQotI2VuZGlmIC8qIF9USFJJRlRfVFJBTlNQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuYyBiL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5YTFmMi4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ0aHJpZnQuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmgiCi0KLUdfREVGSU5FX1RZUEUoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSwgdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LCBHX1RZUEVfT0JKRUNUKQotCi0vKiBidWlsZHMgYSB0cmFuc3BvcnQgZnJvbSB0aGUgYmFzZSB0cmFuc3BvcnQuICovCi1UaHJpZnRUcmFuc3BvcnQgKgotdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5X2dldF90cmFuc3BvcnQgKFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKmZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChmYWN0b3J5KTsKLSAgcmV0dXJuIHRyYW5zcG9ydDsKLX0KLQotc3RhdGljIHZvaWQKLXRocmlmdF90cmFuc3BvcnRfZmFjdG9yeV9jbGFzc19pbml0IChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MgKmNscykKLXsKLSAgY2xzLT5nZXRfdHJhbnNwb3J0ID0gdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5X2dldF90cmFuc3BvcnQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnlfaW5pdCAoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqZmFjdG9yeSkKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGZhY3RvcnkpOwotfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oIGIvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDQxOThiLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZX0gKLSNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfRkFDVE9SWV9ICi0KLSNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgotCi0jaW5jbHVkZSAidGhyaWZ0X3RyYW5zcG9ydC5oIgotCi1HX0JFR0lOX0RFQ0xTCi0KLS8qISBcZmlsZSB0aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaAotICogIFxicmllZiBCYXNlIGNsYXNzIGZvciBUaHJpZnQgVHJhbnNwb3J0IEZhY3Rvcmllcy4gIFVzZWQgYnkgVGhyaWZ0IFNlcnZlcnMKLSAqICAgICAgICAgdG8gb2J0YWluIGEgY2xpZW50IHRyYW5zcG9ydCBmcm9tIGFuIGV4aXN0aW5nIHRyYW5zcG9ydC4gIFRoZSBkZWZhdWx0Ci0gKiAgICAgICAgIGltcGxlbWVudGF0aW9uIHNpbXBseSBjbG9uZXMgdGhlIHByb3ZpZGVkIHRyYW5zcG9ydC4KLSAqLwotCi0vKiB0eXBlIG1hY3JvcyAqLwotI2RlZmluZSBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSAodGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5X2dldF90eXBlICgpKQotI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUlkob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSwgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSkpCi0jZGVmaW5lIFRIUklGVF9JU19UUkFOU1BPUlRfRkFDVE9SWShvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZKSkKLSNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSwgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeUNsYXNzKSkKLSNkZWZpbmUgVEhSSUZUX0lTX1RSQU5TUE9SVF9GQUNUT1JZX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSkpCi0jZGVmaW5lIFRIUklGVF9UUkFOU1BPUlRfRkFDVE9SWV9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZLCBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MpKQotCi0vKiBUaHJpZnQgVHJhbnNwb3J0IEZhY3RvcnkgaW5zdGFuY2UgKi8KLXN0cnVjdCBfVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeQotewotICBHT2JqZWN0IHBhcmVudDsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5OwotCi0vKiBUaHJpZnQgVHJhbnNwb3J0IEZhY3RvcnkgY2xhc3MgKi8KLXN0cnVjdCBfVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeUNsYXNzCi17Ci0gIEdPYmplY3RDbGFzcyBwYXJlbnQ7Ci0KLSAgLyogdnRhYmxlICovCi0gIFRocmlmdFRyYW5zcG9ydCAqKCpnZXRfdHJhbnNwb3J0KSAoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFRyYW5zcG9ydEZhY3RvcnlDbGFzcyBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3M7Ci0KLS8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlkgKi8KLUdUeXBlIHRocmlmdF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHlwZSAodm9pZCk7Ci0KLS8qIHZpcnR1YWwgcHVibGljIG1ldGhvZHMgKi8KLVRocmlmdFRyYW5zcG9ydCAqdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5X2dldF90cmFuc3BvcnQgKFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKmZhY3RvcnksIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKLQotR19FTkRfREVDTFMKLQotI2VuZGlmIC8qIF9USFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUllfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L0NNYWtlTGlzdHMudHh0IGIvbGliL2NfZ2xpYi90ZXN0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiM2U0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyMDIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKK3NldChURVNUX1BSRUZJWCAiY19nbGliIikKKworaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gJHtCb29zdF9JTkNMVURFX0RJUlN9KQorCisjTWFrZSBzdXJlIGdlbi1jcHAgYW5kIGdlbi1jX2dsaWIgZmlsZXMgY2FuIGJlIGluY2x1ZGVkCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iKQorCisjIENyZWF0ZSB0aGUgdGhyaWZ0IEMgdGVzdCBsaWJyYXJ5CitzZXQodGVzdGdlbmNfU09VUkNFUworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF9zZXJ2aWNlLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9pbmhlcml0ZWQuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3JldmVyc2Vfb3JkZXJfc2VydmljZS5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlcnZpY2VfZm9yX2V4Y2VwdGlvbl93aXRoX2FfbWFwLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zcnYuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oCispCisKK2FkZF9saWJyYXJ5KHRlc3RnZW5jIFNUQVRJQyAke3Rlc3RnZW5jX1NPVVJDRVN9KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RnZW5jIHRocmlmdF9jX2dsaWIpCisKKworYWRkX2V4ZWN1dGFibGUodGVzdHNlcmlhbGl6YXRpb24gdGVzdHNlcmlhbGl6YXRpb24uYykKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0c2VyaWFsaXphdGlvbiB0ZXN0Z2VuYykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0c2VyaWFsaXphdGlvbiB0aHJpZnRfY19nbGliKQorYWRkX3Rlc3QoTkFNRSB0ZXN0c2VyaWFsaXphdGlvbiBDT01NQU5EIHRlc3RzZXJpYWxpemF0aW9uKQorCithZGRfZXhlY3V0YWJsZSh0ZXN0YXBwbGljYXRpb25leGNlcHRpb24gdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uLmMpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uIHRocmlmdF9jX2dsaWIpCithZGRfdGVzdChOQU1FIHRlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbiBDT01NQU5EIHRlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbikKKworYWRkX2V4ZWN1dGFibGUodGVzdHRyYW5zcG9ydHNvY2tldCB0ZXN0dHJhbnNwb3J0c29ja2V0LmMpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdHRyYW5zcG9ydHNvY2tldCB0aHJpZnRfY19nbGliKQorYWRkX3Rlc3QoTkFNRSB0ZXN0dHJhbnNwb3J0c29ja2V0IENPTU1BTkQgdGVzdHRyYW5zcG9ydHNvY2tldCkKKworYWRkX2V4ZWN1dGFibGUodGVzdGJpbmFyeXByb3RvY29sIHRlc3RiaW5hcnlwcm90b2NvbC5jKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RiaW5hcnlwcm90b2NvbCB0aHJpZnRfY19nbGliKQorYWRkX3Rlc3QoTkFNRSB0ZXN0YmluYXJ5cHJvdG9jb2wgQ09NTUFORCB0ZXN0YmluYXJ5cHJvdG9jb2wpCisKK2FkZF9leGVjdXRhYmxlKHRlc3Rjb21wYWN0cHJvdG9jb2wgdGVzdGNvbXBhY3Rwcm90b2NvbC5jKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3Rjb21wYWN0cHJvdG9jb2wgdGhyaWZ0X2NfZ2xpYikKK2FkZF90ZXN0KE5BTUUgdGVzdGNvbXBhY3Rwcm90b2NvbCBDT01NQU5EIHRlc3Rjb21wYWN0cHJvdG9jb2wpCisKK2FkZF9leGVjdXRhYmxlKHRlc3RidWZmZXJlZHRyYW5zcG9ydCB0ZXN0YnVmZmVyZWR0cmFuc3BvcnQuYykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0YnVmZmVyZWR0cmFuc3BvcnQgdGhyaWZ0X2NfZ2xpYikKK2FkZF90ZXN0KE5BTUUgdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0IENPTU1BTkQgdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0KQorCithZGRfZXhlY3V0YWJsZSh0ZXN0ZnJhbWVkdHJhbnNwb3J0IHRlc3RmcmFtZWR0cmFuc3BvcnQuYykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0ZnJhbWVkdHJhbnNwb3J0IHRocmlmdF9jX2dsaWIpCithZGRfdGVzdChOQU1FIHRlc3RmcmFtZWR0cmFuc3BvcnQgQ09NTUFORCB0ZXN0ZnJhbWVkdHJhbnNwb3J0KQorCithZGRfZXhlY3V0YWJsZSh0ZXN0ZmR0cmFuc3BvcnQgdGVzdGZkdHJhbnNwb3J0LmMpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdGZkdHJhbnNwb3J0IHRocmlmdF9jX2dsaWIpCithZGRfdGVzdChOQU1FIHRlc3RmZHRyYW5zcG9ydCBDT01NQU5EIHRlc3RmZHRyYW5zcG9ydCkKKworYWRkX2V4ZWN1dGFibGUodGVzdG1lbW9yeWJ1ZmZlciB0ZXN0bWVtb3J5YnVmZmVyLmMpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdG1lbW9yeWJ1ZmZlciB0aHJpZnRfY19nbGliKQorYWRkX3Rlc3QoTkFNRSB0ZXN0bWVtb3J5YnVmZmVyIENPTU1BTkQgdGVzdG1lbW9yeWJ1ZmZlcikKKworYWRkX2V4ZWN1dGFibGUodGVzdHNpbXBsZXNlcnZlciB0ZXN0c2ltcGxlc2VydmVyLmMpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdHNpbXBsZXNlcnZlciB0aHJpZnRfY19nbGliKQorYWRkX3Rlc3QoTkFNRSB0ZXN0c2ltcGxlc2VydmVyIENPTU1BTkQgdGVzdHNpbXBsZXNlcnZlcikKKworYWRkX2V4ZWN1dGFibGUodGVzdGRlYnVncHJvdG8gdGVzdGRlYnVncHJvdG8uYykKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0ZGVidWdwcm90byB0ZXN0Z2VuYykKK2FkZF90ZXN0KE5BTUUgdGVzdGRlYnVncHJvdG8gQ09NTUFORCB0ZXN0ZGVidWdwcm90bykKKworYWRkX2V4ZWN1dGFibGUodGVzdG9wdGlvbmFscmVxdWlyZWQgdGVzdG9wdGlvbmFscmVxdWlyZWQuYykKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0b3B0aW9uYWxyZXF1aXJlZCB0ZXN0Z2VuYykKK2FkZF90ZXN0KE5BTUUgdGVzdG9wdGlvbmFscmVxdWlyZWQgQ09NTUFORCB0ZXN0b3B0aW9uYWxyZXF1aXJlZCkKKworaW5jbHVkZV9kaXJlY3RvcmllcygiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvY19nbGliL3NyYyIgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4tY19nbGliIikKKworYWRkX2V4ZWN1dGFibGUodGVzdHRocmlmdHRlc3QgdGVzdHRocmlmdHRlc3QuYworICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5jCisgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmgKKyAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9jX2dsaWIvc3JjL3RocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmMKKyAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9jX2dsaWIvc3JjL3RocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3R0aHJpZnR0ZXN0IHRlc3RnZW5jKQorYWRkX3Rlc3QoTkFNRSB0ZXN0dGhyaWZ0dGVzdCBDT01NQU5EIHRlc3R0aHJpZnR0ZXN0KQorCisKK2lmKEJVSUxEX0NQUCkKKworICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS9saWIvY3BwL3NyYyIpCisKKyAgICAjIENyZWF0ZSB0aGUgdGhyaWZ0IEMrKyB0ZXN0IGxpYnJhcnkKKyAgICBzZXQodGVzdGdlbmNfY3BwX1NPVVJDRVMKKyAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcAorICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcAorICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwCisgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdC5oCisgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuaAorICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaAorICAgICkKKworICAgIGFkZF9saWJyYXJ5KHRlc3RnZW5jX2NwcCBTVEFUSUMgJHt0ZXN0Z2VuY19jcHBfU09VUkNFU30pCisgICAgTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RnZW5jX2NwcCB0aHJpZnQpCisKKyAgICAjSEFDSzogdGVzdHRocmlmdHRlc3RjbGllbnQuY3BwIGluY2x1ZGVzIFRocmlmdFRlc3QuaCB3aXRob3V0IGdlbi0qLyBwcmVmaXhlcworICAgICMgc28gd2UgaW5jbHVkZSBpdCBoZXJlCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1jcHAiICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWNfZ2xpYiIpCisKKyAgICBhZGRfZXhlY3V0YWJsZSh0ZXN0dGhyaWZ0dGVzdGNsaWVudCB0ZXN0dGhyaWZ0dGVzdGNsaWVudC5jcHApCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3R0aHJpZnR0ZXN0Y2xpZW50IHRlc3RnZW5jIHRlc3RnZW5jX2NwcCAke1pMSUJfTElCUkFSSUVTfSkKKyAgICBhZGRfdGVzdChOQU1FIHRlc3R0aHJpZnR0ZXN0Y2xpZW50IENPTU1BTkQgdGVzdHRocmlmdHRlc3RjbGllbnQpCisKK2VuZGlmKEJVSUxEX0NQUCkKKworIworIyBDb21tb24gdGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBydWxlcworIworCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW1wdHlfc2VydmljZS5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW1wdHlfc2VydmljZS5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9pbmhlcml0ZWQuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3JldmVyc2Vfb3JkZXJfc2VydmljZS5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2LmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjX2dsaWIgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF9zZXJ2aWNlLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjX2dsaWIgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvRW51bVRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQKKyAgICBnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjX2dsaWIgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjX2dsaWIgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVAorICAgIGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAKKyAgICBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcAorICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAKKyAgICBnZW4tY3BwL1RocmlmdFRlc3QuaAorICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuaAorICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CispCisKKyMgVE9ETzogQWRkIG1lbW9yeSBjaGVja3MgdXNpbmcgY3Rlc3RfbWVtY2hlY2sgb3Igc2ltaWxhcgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L0NvbnRhaW5lclRlc3QudGhyaWZ0IGIvbGliL2NfZ2xpYi90ZXN0L0NvbnRhaW5lclRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MmE5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvQ29udGFpbmVyVGVzdC50aHJpZnQKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgY19nbGliIFRUZXN0CisKK3R5cGVkZWYgbGlzdDxzdHJpbmc+IFN0cmluZ0xpc3QKK3R5cGVkZWYgbGlzdDxTdHJpbmdMaXN0PiBMaXN0U3RyaW5nTGlzdAorCitzdHJ1Y3QgQ29udGFpbmVyc1dpdGhEZWZhdWx0VmFsdWVzIHsKKyAgMTogbGlzdDxzdHJpbmc+IFN0cmluZ0xpc3QgPSBbICJBcGFjaGUiLCAiVGhyaWZ0IiBdOworfQorCitzZXJ2aWNlIENvbnRhaW5lclNlcnZpY2UgeworICB2b2lkIHJlY2VpdmVTdHJpbmdMaXN0KDE6IGxpc3Q8c3RyaW5nPiBzdHJpbmdMaXN0KTsKKyAgbGlzdDxzdHJpbmc+IHJldHVyblN0cmluZ0xpc3QoKTsKKworICBsaXN0PGxpc3Q8c3RyaW5nPj4gcmV0dXJuTGlzdFN0cmluZ0xpc3QoKTsKKyAgTGlzdFN0cmluZ0xpc3QgcmV0dXJuVHlwZWRlZmRMaXN0U3RyaW5nTGlzdCgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L01ha2VmaWxlLmFtIGIvbGliL2NfZ2xpYi90ZXN0L01ha2VmaWxlLmFtCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggN2YyZjNlMy4uNWU5ZDJlYQotLS0gYS9saWIvY19nbGliL3Rlc3QvTWFrZWZpbGUuYW0KKysrIGIvbGliL2NfZ2xpYi90ZXN0L01ha2VmaWxlLmFtCkBAIC0xNiwyMCArMTYsNDMgQEAKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKK0FVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cyBzZXJpYWwtdGVzdHMKIAogU1VCRElSUyA9CiAKLUFNX0NQUEZMQUdTID0gLWcgLVdhbGwgLUkuLi9zcmMgJChHTElCX0NGTEFHUykKLUFNX0xERkxBR1MgPSAkKEdMSUJfTElCUykgJChHT0JKRUNUX0xJQlMpIEBHQ09WX0xERkxBR1NACitCVUlMVF9TT1VSQ0VTID0gXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfdGVzdF90eXBlcy5jIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3Rlc3RfdHlwZXMuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlLmMgXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfc2VydmljZS5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2LmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaAogCi1DRkxBR1MgPSBAR0NPVl9DRkxBR1NACi1DWFhGTEFHUyA9IC1nCitBTV9DUFBGTEFHUyA9IC1JLi4vc3JjIC1JLi9nZW4tY19nbGliCitBTV9DRkxBR1MgPSAtZyAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYyAkKEdMSUJfQ0ZMQUdTKSAkKEdPQkpFQ1RfQ0ZMQUdTKSAkKE9QRU5TU0xfSU5DTFVERVMpIFwKKwlAR0NPVl9DRkxBR1NACitBTV9DWFhGTEFHUyA9ICQoQU1fQ0ZMQUdTKQorQU1fTERGTEFHUyA9ICQoR0xJQl9MSUJTKSAkKEdPQkpFQ1RfTElCUykgJChPUEVOU1NMX0xJQlMpIEBHQ09WX0xERkxBR1NACiAKIGNoZWNrX1BST0dSQU1TID0gXAorICB0ZXN0c2VyaWFsaXphdGlvbiBcCisgIHRlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbiBcCisgIHRlc3Rjb250YWluZXJ0ZXN0IFwKICAgdGVzdHRyYW5zcG9ydHNvY2tldCBcCisgIHRlc3R0cmFuc3BvcnRzc2xzb2NrZXQgXAogICB0ZXN0YmluYXJ5cHJvdG9jb2wgXAorICB0ZXN0Y29tcGFjdHByb3RvY29sIFwKICAgdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0IFwKICAgdGVzdGZyYW1lZHRyYW5zcG9ydCBcCisgIHRlc3RmZHRyYW5zcG9ydCBcCiAgIHRlc3RtZW1vcnlidWZmZXIgXAogICB0ZXN0c3RydWN0IFwKICAgdGVzdHNpbXBsZXNlcnZlciBcCkBAIC0zOCw3MSArNjEsMTI5IEBACiAgIHRlc3R0aHJpZnR0ZXN0CiAKIGlmIFdJVEhfQ1BQCisgIEJVSUxUX1NPVVJDRVMgKz0gZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcAogICBjaGVja19QUk9HUkFNUyArPSB0ZXN0dGhyaWZ0dGVzdGNsaWVudAogZW5kaWYKIAordGVzdHNlcmlhbGl6YXRpb25fU09VUkNFUyA9IHRlc3RzZXJpYWxpemF0aW9uLmMKK3Rlc3RzZXJpYWxpemF0aW9uX0xEQUREID0gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCisgICAgbGlidGVzdGdlbmMubGEKKwordGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uX1NPVVJDRVMgPSB0ZXN0YXBwbGljYXRpb25leGNlcHRpb24uYwordGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uX0xEQUREID0gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zdHJ1Y3QubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vCisKK3Rlc3Rjb250YWluZXJ0ZXN0X1NPVVJDRVMgPSB0ZXN0Y29udGFpbmVydGVzdC5jCit0ZXN0Y29udGFpbmVydGVzdF9MREFERCA9IFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zdHJ1Y3QubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb2Nlc3Nvci5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbF9mYWN0b3J5Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXIubyBcCisJICBsaWJ0ZXN0Z2VuYy5sYQorCiB0ZXN0dHJhbnNwb3J0c29ja2V0X1NPVVJDRVMgPSB0ZXN0dHJhbnNwb3J0c29ja2V0LmMKIHRlc3R0cmFuc3BvcnRzb2NrZXRfTERBREQgPSBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8KKworCit0ZXN0dHJhbnNwb3J0c3Nsc29ja2V0X1NPVVJDRVMgPSB0ZXN0dHJhbnNwb3J0c3Nsc29ja2V0LmMKK3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXRfTERBREQgPSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubworCiAKIHRlc3RiaW5hcnlwcm90b2NvbF9TT1VSQ0VTID0gdGVzdGJpbmFyeXByb3RvY29sLmMKIHRlc3RiaW5hcnlwcm90b2NvbF9MREFERCA9IFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8KKwordGVzdGNvbXBhY3Rwcm90b2NvbF9TT1VSQ0VTID0gdGVzdGNvbXBhY3Rwcm90b2NvbC5jCit0ZXN0Y29tcGFjdHByb3RvY29sX0xEQUREID0gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NvY2tldC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vCiAKIHRlc3RidWZmZXJlZHRyYW5zcG9ydF9TT1VSQ0VTID0gdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0LmMKIHRlc3RidWZmZXJlZHRyYW5zcG9ydF9MREFERCA9IFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8KIAogdGVzdGZyYW1lZHRyYW5zcG9ydF9TT1VSQ0VTID0gdGVzdGZyYW1lZHRyYW5zcG9ydC5jCiB0ZXN0ZnJhbWVkdHJhbnNwb3J0X0xEQUREID0gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zb2NrZXQubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8KKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zb2NrZXQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubworCit0ZXN0ZmR0cmFuc3BvcnRfU09VUkNFUyA9IHRlc3RmZHRyYW5zcG9ydC5jCit0ZXN0ZmR0cmFuc3BvcnRfTERBREQgPSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfZmRfdHJhbnNwb3J0Lm8KIAogdGVzdG1lbW9yeWJ1ZmZlcl9TT1VSQ0VTID0gdGVzdG1lbW9yeWJ1ZmZlci5jCiB0ZXN0bWVtb3J5YnVmZmVyX0xEQUREID0gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vCiAKIHRlc3RzdHJ1Y3RfU09VUkNFUyA9IHRlc3RzdHJ1Y3QuYwogdGVzdHN0cnVjdF9MREFERCA9IFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubworICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubwogCiB0ZXN0c2ltcGxlc2VydmVyX1NPVVJDRVMgPSB0ZXN0c2ltcGxlc2VydmVyLmMKIHRlc3RzaW1wbGVzZXJ2ZXJfTERBREQgPSBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb2Nlc3Nvci5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbF9mYWN0b3J5Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zb2NrZXQubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlci5vCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb2Nlc3Nvci5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbF9mYWN0b3J5Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXIubwogCiB0ZXN0ZGVidWdwcm90b19TT1VSQ0VTID0gdGVzdGRlYnVncHJvdG8uYwogdGVzdGRlYnVncHJvdG9fTERBREQgPSBsaWJ0ZXN0Z2VuYy5sYQogCiB0ZXN0b3B0aW9uYWxyZXF1aXJlZF9TT1VSQ0VTID0gdGVzdG9wdGlvbmFscmVxdWlyZWQuYwogdGVzdG9wdGlvbmFscmVxdWlyZWRfTERBREQgPSBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCiAgICAgbGlidGVzdGdlbmMubGEKIAogdGVzdHRocmlmdHRlc3RfU09VUkNFUyA9IHRlc3R0aHJpZnR0ZXN0LmMKLXRlc3R0aHJpZnR0ZXN0X0xEQUREID0gbGlidGVzdGdlbmMubGEKK3Rlc3R0aHJpZnR0ZXN0X0xEQUREID0gbGlidGVzdGdlbmMubGEgXAorICAgICQodG9wX2J1aWxkZGlyKS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5vCit0ZXN0dGhyaWZ0dGVzdF9DRkxBR1MgPSAtSSQodG9wX3NyY2RpcikvdGVzdC9jX2dsaWIvc3JjIC1JLi9nZW4tY19nbGliICQoR0xJQl9DRkxBR1MpCiAKIHRlc3R0aHJpZnR0ZXN0Y2xpZW50X1NPVVJDRVMgPSB0ZXN0dGhyaWZ0dGVzdGNsaWVudC5jcHAKIHRlc3R0aHJpZnR0ZXN0Y2xpZW50X0NQUEZMQUdTID0gLUkuLi8uLi9jcHAvc3JjICQoQk9PU1RfQ1BQRkxBR1MpIC1JLi9nZW4tY3BwIC1JLi4vc3JjIC1JLi9nZW4tY19nbGliICQoR0xJQl9DRkxBR1MpCkBAIC0xMTYsNyArMTk3LDEwIEBACiBlbmRpZgogCiBub2Rpc3RfbGlidGVzdGdlbmNfbGFfU09VUkNFUyA9IFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3Rlc3RfdHlwZXMuYyBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuYyBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5jIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuYyBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuYyBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5jIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5jIFwKQEAgLTEyNCw5ICsyMDgsMTMgQEAKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuYyBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlcnZpY2VfZm9yX2V4Y2VwdGlvbl93aXRoX2FfbWFwLmMgXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9zcnYuYyBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlLmMgXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5jIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuYyBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl90ZXN0X3R5cGVzLmggXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF9zZXJ2aWNlLmggXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmggXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9pbmhlcml0ZWQuaCBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuaCBcCkBAIC0xMzQsOSArMjIyLDExIEBACiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmggXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5oIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2LmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfc2VydmljZS5oIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuaCBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmgKIGxpYnRlc3RnZW5jX2xhX0xJQkFERCA9ICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL2xpYnRocmlmdF9jX2dsaWIubGEKK2xpYnRlc3RnZW5jX2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgLVduby11bnVzZWQtZnVuY3Rpb24KIAogbm9kaXN0X2xpYnRlc3RnZW5jcHBfbGFfU09VUkNFUyA9IFwKICAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBcCkBAIC0xNDcsMTggKzIzNywyMiBAQAogICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaAogbGlidGVzdGdlbmNwcF9sYV9DUFBGTEFHUyA9IC1JLi4vLi4vY3BwL3NyYyAkKEJPT1NUX0NQUEZMQUdTKSAtSS4vZ2VuLWNwcAogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCi1nZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5oIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuYyBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmggZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmggZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmggZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuYyBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5oIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5jIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5oOiAuLi8uLi8uLi90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAorZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3Rlc3RfdHlwZXMuYyBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfdGVzdF90eXBlcy5oIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3NlcnZpY2UuaDogQ29udGFpbmVyVGVzdC50aHJpZnQgJChUSFJJRlQpCiAJJChUSFJJRlQpIC0tZ2VuIGNfZ2xpYiAkPAogCi1nZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmMgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5oOiAuLi8uLi8uLi90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdAorZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5jIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuaCBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfZW1wdHlfc2VydmljZS5oIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5jIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5oIGdlbi1jX2dsaWIvdF90ZXN0X3JldmVyc2Vfb3JkZXJfc2VydmljZS5jIGdlbi1jX2dsaWIvdF90ZXN0X3JldmVyc2Vfb3JkZXJfc2VydmljZS5oIGdlbi1jX2dsaWIvdF90ZXN0X3NlcnZpY2VfZm9yX2V4Y2VwdGlvbl93aXRoX2FfbWFwLmMgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuaCBnZW4tY19nbGliL3RfdGVzdF9zcnYuYyBnZW4tY19nbGliL3RfdGVzdF9zcnYuaDogLi4vLi4vLi4vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgJChUSFJJRlQpCiAJJChUSFJJRlQpIC0tZ2VuIGNfZ2xpYiAkPAogCi1nZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5jIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmMgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuYyBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LS5oIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmg6IC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKK2dlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5jIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5oIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuaCA6IC4uLy4uLy4uL3Rlc3QvRW51bVRlc3QudGhyaWZ0ICQoVEhSSUZUKQogCSQoVEhSSUZUKSAtLWdlbiBjX2dsaWIgJDwKIAotZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBnZW4tY3BwL1RocmlmdFRlc3QuaDogLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5jIGdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuaDogLi4vLi4vLi4vdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQgJChUSFJJRlQpCisJJChUSFJJRlQpIC0tZ2VuIGNfZ2xpYiAkPAorCitnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5jIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmMgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuYyBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmggZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaDogLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gY19nbGliICQ8CisKK2dlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcDogLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCAkKFRIUklGVCkKIAkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CiAKIFRFU1RTID0gXApAQCAtMjE0LDcgKzMwOCw3IEBACiAJICAgICR7JDxfVkFMR1JJTkRfTEVBS19PUFRTfSAgLi8kPAogCiBjbGVhbi1sb2NhbDoKLQkkKFJNKSAtciBnZW4tY19nbGliIGdlbi1jcHAKKwkkKFJNKSBnZW4tY19nbGliLyogZ2VuLWNwcC8qCiAKIENMRUFORklMRVMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgKi5iYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMjIzLDMgKzMxNyw4IEBACiAgICAgKi5nY25vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICouZ2NkYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAqLmdjb3YKKworRVhUUkFfRElTVCA9IFwKKyAgICAgICAgICAgICBDTWFrZUxpc3RzLnR4dCBcCisgICAgICAgICAgICAgQ29udGFpbmVyVGVzdC50aHJpZnQKKwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbi5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZTM5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uLmMKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oPgorCitzdGF0aWMgdm9pZAordGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisKKyAgLyogQSBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBjYW4gYmUgY3JlYXRlZC4uLiAqLworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRIUklGVF9JU19BUFBMSUNBVElPTl9FWENFUFRJT04gKG9iamVjdCkpOworCisgIC8qIC4uLmFuZCBkZXN0cm95ZWQgKi8KKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2luaXRpYWxpemUgKHZvaWQpCit7CisgIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp4Y2VwdGlvbiA9IE5VTEw7CisgIGdpbnQzMiB0eXBlID0gVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9JTlRFUk5BTF9FUlJPUjsKKyAgZ2NoYXIgKm1lc3NhZ2UgPSAiRXhjZXB0aW9uIG1lc3NhZ2UiOworICBnaW50MzIgcmV0cmlldmVkX3R5cGUgPSAwOworICBnY2hhciAqcmV0cmlldmVkX21lc3NhZ2UgPSBOVUxMOworCisgIC8qIEEgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gaGFzICJ0eXBlIiBhbmQgIm1lc3NhZ2UiIHByb3BlcnRpZXMgdGhhdCBjYW4KKyAgICAgYmUgaW5pdGlhbGl6ZWQgYXQgb2JqZWN0IGNyZWF0aW9uICovCisgIHhjZXB0aW9uID0KKyAgICBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwKKyAgICAgICAgICAgICAgICAgICJ0eXBlIiwgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfYXNzZXJ0ICh4Y2VwdGlvbiAhPSBOVUxMKTsKKworICAvKiBBIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uJ3MgcHJvcGVydGllcyBjYW4gYmUgcmV0cmlldmVkICovCisgIGdfb2JqZWN0X2dldCAoeGNlcHRpb24sCisgICAgICAgICAgICAgICAgInR5cGUiLCAgICAmcmV0cmlldmVkX3R5cGUsCisgICAgICAgICAgICAgICAgIm1lc3NhZ2UiLCAmcmV0cmlldmVkX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19hc3NlcnQgKHJldHJpZXZlZF90eXBlID09IHR5cGUpOworICBnX2Fzc2VydCAocmV0cmlldmVkX21lc3NhZ2UgIT0gTlVMTCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAocmV0cmlldmVkX21lc3NhZ2UsID09LCBtZXNzYWdlKTsKKworICBnX2ZyZWUgKHJldHJpZXZlZF9tZXNzYWdlKTsKKyAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcHJvcGVydGllc190ZXN0ICh2b2lkKQoreworICBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqeGNlcHRpb24gPSBOVUxMOworICBnaW50MzIgcmV0cmlldmVkX3R5cGU7CisKKyAgeGNlcHRpb24gPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgTlVMTCk7CisKKyNkZWZpbmUgVEVTVF9UWVBFX1ZBTFVFKF90eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJldHJpZXZlZF90eXBlID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnX29iamVjdF9zZXQgKHhjZXB0aW9uLCAidHlwZSIsIF90eXBlLCBOVUxMKTsgICAgICAgICAgICAgICAgIFwKKyAgZ19vYmplY3RfZ2V0ICh4Y2VwdGlvbiwgInR5cGUiLCAmcmV0cmlldmVkX3R5cGUsIE5VTEwpOyAgICAgICBcCisgIGdfYXNzZXJ0X2NtcGludCAocmV0cmlldmVkX3R5cGUsID09LCBfdHlwZSk7CisKKyAgLyogVGhlICJ0eXBlIiBwcm9wZXJ0eSBjYW4gYmUgc2V0IHRvIGFueSB2YWxpZCBUaHJpZnQgZXhjZXB0aW9uIHR5cGUgKi8KKyAgVEVTVF9UWVBFX1ZBTFVFIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOS05PV04pOworICBURVNUX1RZUEVfVkFMVUUgKFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTl9NRVRIT0QpOworICBURVNUX1RZUEVfVkFMVUUgKFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfSU5WQUxJRF9NRVNTQUdFX1RZUEUpOworICBURVNUX1RZUEVfVkFMVUUgKFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfV1JPTkdfTUVUSE9EX05BTUUpOworICBURVNUX1RZUEVfVkFMVUUgKFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfQkFEX1NFUVVFTkNFX0lEKTsKKyAgVEVTVF9UWVBFX1ZBTFVFIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX01JU1NJTkdfUkVTVUxUKTsKKyAgVEVTVF9UWVBFX1ZBTFVFIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgVEVTVF9UWVBFX1ZBTFVFIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1BST1RPQ09MX0VSUk9SKTsKKyAgVEVTVF9UWVBFX1ZBTFVFIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0lOVkFMSURfVFJBTlNGT1JNKTsKKyAgVEVTVF9UWVBFX1ZBTFVFIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0lOVkFMSURfUFJPVE9DT0wpOworICBURVNUX1RZUEVfVkFMVUUgKFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUpOworCisvKiAiZ190ZXN0X2V4cGVjdF9tZXNzYWdlIiBpcyByZXF1aXJlZCBmb3IgdGhlIHByb3BlcnR5IHJhbmdlIHRlc3RzIGJlbG93IGJ1dCBpcworICAgbm90IHByZXNlbnQgaW4gR0xpYiBiZWZvcmUgdmVyc2lvbiAyLjM0ICovCisjaWYgKEdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzQsIDApKQorICBnX29iamVjdF9zZXQgKHhjZXB0aW9uLAorICAgICAgICAgICAgICAgICJ0eXBlIiwgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9VTktOT1dOLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIC8qIFRoZSAidHlwZSIgcHJvcGVydHkgY2Fubm90IGJlIHNldCB0byBhIHZhbHVlIHRvbyBsb3cgKGxlc3MgdGhhbiB6ZXJvKSAqLworICBnX3Rlc3RfZXhwZWN0X21lc3NhZ2UgKCJHTGliLUdPYmplY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdfTE9HX0xFVkVMX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlKm91dCBvZiByYW5nZSp0eXBlKiIpOworICBnX29iamVjdF9zZXQgKHhjZXB0aW9uLCAidHlwZSIsIC0xLCBOVUxMKTsKKyAgZ190ZXN0X2Fzc2VydF9leHBlY3RlZF9tZXNzYWdlcyAoKTsKKworICBnX29iamVjdF9nZXQgKHhjZXB0aW9uLCAidHlwZSIsICZyZXRyaWV2ZWRfdHlwZSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAocmV0cmlldmVkX3R5cGUsICE9LCAtMSk7CisgIGdfYXNzZXJ0X2NtcGludCAocmV0cmlldmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgPT0sCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9VTktOT1dOKTsKKworICAvKiBUaGUgInR5cGUiIHByb3BlcnR5IGNhbm5vdCBiZSBzZXQgdG8gYSB2YWx1ZSB0b28gaGlnaCAoZ3JlYXRlciB0aGFuIHRoZQorICAgICBoaWdoZXN0IGRlZmluZWQgZXhjZXB0aW9uLXR5cGUgdmFsdWUpICovCisgIGdfdGVzdF9leHBlY3RfbWVzc2FnZSAoIkdMaWItR09iamVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR19MT0dfTEVWRUxfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUqb3V0IG9mIHJhbmdlKnR5cGUqIik7CisgIGdfb2JqZWN0X3NldCAoeGNlcHRpb24sICJ0eXBlIiwgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9OLCBOVUxMKTsKKyAgZ190ZXN0X2Fzc2VydF9leHBlY3RlZF9tZXNzYWdlcyAoKTsKKworICBnX29iamVjdF9nZXQgKHhjZXB0aW9uLCAidHlwZSIsICZyZXRyaWV2ZWRfdHlwZSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAocmV0cmlldmVkX3R5cGUsICE9LCBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX04pOworICBnX2Fzc2VydF9jbXBpbnQgKHJldHJpZXZlZF90eXBlLAorICAgICAgICAgICAgICAgICAgID09LAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTik7CisjZW5kaWYKKworICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOworfQorCitzdGF0aWMgdm9pZAordGVzdF9wcm9wZXJ0aWVzX21lc3NhZ2UgKHZvaWQpCit7CisgIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp4Y2VwdGlvbiA9IE5VTEw7CisgIGdjaGFyICptZXNzYWdlID0gIkV4Y2VwdGlvbiBtZXNzYWdlIjsKKyAgZ2NoYXIgKnJldHJpZXZlZF9tZXNzYWdlOworCisgIHhjZXB0aW9uID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sIE5VTEwpOworCisgIC8qIFRoZSAibWVzc2FnZSIgcHJvcGVydHkgY2FuIGJlIHNldCB0byBOVUxMICovCisgIGdfb2JqZWN0X3NldCAoeGNlcHRpb24sICJtZXNzYWdlIiwgTlVMTCwgTlVMTCk7CisgIGdfb2JqZWN0X2dldCAoeGNlcHRpb24sICJtZXNzYWdlIiwgJnJldHJpZXZlZF9tZXNzYWdlLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHJldHJpZXZlZF9tZXNzYWdlID09IE5VTEwpOworCisgIC8qIFRoZSAibWVzc2FnZSIgcHJvcGVydHkgY2FuIGJlIHNldCB0byBhIHZhbGlkIHN0cmluZyAqLworICBnX29iamVjdF9zZXQgKHhjZXB0aW9uLCAibWVzc2FnZSIsIG1lc3NhZ2UsIE5VTEwpOworICBnX29iamVjdF9nZXQgKHhjZXB0aW9uLCAibWVzc2FnZSIsICZyZXRyaWV2ZWRfbWVzc2FnZSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAoc3RyY21wIChyZXRyaWV2ZWRfbWVzc2FnZSwgbWVzc2FnZSksID09LCAwKTsKKworICBnX2ZyZWUgKHJldHJpZXZlZF9tZXNzYWdlKTsKKyAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQgKCk7CisjZW5kaWYKKworICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uL0NyZWF0ZUFuZERlc3Ryb3kiLAorICAgIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbi9Jbml0aWFsaXplIiwKKyAgICB0ZXN0X2luaXRpYWxpemUpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uL1Byb3BlcnRpZXMvdGVzdCIsCisgICAgdGVzdF9wcm9wZXJ0aWVzX3Rlc3QpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uL1Byb3BlcnRpZXMvbWVzc2FnZSIsCisgICAgdGVzdF9wcm9wZXJ0aWVzX21lc3NhZ2UpOworCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RiaW5hcnlwcm90b2NvbC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RiaW5hcnlwcm90b2NvbC5jCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMzQ4NDZjNi4uMTRmNGZiMAotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdGJpbmFyeXByb3RvY29sLmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RiaW5hcnlwcm90b2NvbC5jCkBAIC0xNywyMiArMTcsMzEgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8qIERpc2FibGUgc3RyaW5nLWZ1bmN0aW9uIG9wdGltaXphdGlvbnMgd2hlbiBnbGliYyBpcyB1c2VkLCBhcyB0aGVzZSBwcm9kdWNlCisgICBjb21waWxlciB3YXJuaW5ncyBhYm91dCBzdHJpbmcgbGVuZ3RoIHdoZW4gYSBzdHJpbmcgZnVuY3Rpb24gaXMgdXNlZCBpbnNpZGUKKyAgIGEgY2FsbCB0byBnX2Fzc2VydCAoKSAqLworI2lmZGVmIF9fR0xJQkNfXworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjZGVmaW5lIF9fTk9fU1RSSU5HX0lOTElORVMgMQorI2VuZGlmCisKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KIAotI2luY2x1ZGUgInByb3RvY29sL3RocmlmdF9wcm90b2NvbC5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfc29ja2V0LmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmgiCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oPgogCiAjZGVmaW5lIFRFU1RfQk9PTCBUUlVFCiAjZGVmaW5lIFRFU1RfQllURSAxMjMKICNkZWZpbmUgVEVTVF9JMTYgMTIzNDUKICNkZWZpbmUgVEVTVF9JMzIgMTIzNDU2Nzg5MAotI2RlZmluZSBURVNUX0k2NCAxMjM0NTY3ODkwMTIzNDVMTAorI2RlZmluZSBURVNUX0k2NCBHX0dJTlQ2NF9DT05TVEFOVCAoMTIzNDU2Nzg5MDEyMzQ1KQogI2RlZmluZSBURVNUX0RPVUJMRSAxMjM0NTY3ODkwLjEyMwogI2RlZmluZSBURVNUX1NUUklORyAidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIDEyMzQ1Njc4OTAhQCMkJV4mKigpIgogI2RlZmluZSBURVNUX1BPUlQgNTExOTkKQEAgLTQxLDE0ICs1MCwxNCBAQAogc3RhdGljIGludCB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CiBzdGF0aWMgaW50IHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CiBnaW50MzIKLW15X3RocmlmdF90cmFuc3BvcnRfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQorbXlfdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKIHsKICAgaWYgKHRyYW5zcG9ydF9yZWFkX2NvdW50ICE9IHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0CiAgICAgICAmJiB0cmFuc3BvcnRfcmVhZF9lcnJvciA9PSAwKQogICB7CiAgICAgdHJhbnNwb3J0X3JlYWRfY291bnQrKzsKLSAgICByZXR1cm4gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICh0cmFuc3BvcnQsIGJ1ZiwgbGVuLCBlcnJvcik7CisgICAgcmV0dXJuIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKICAgfQogICByZXR1cm4gLTE7CiB9CkBAIC02OSwxNCArNzgsMTUgQEAKICAgcmV0dXJuIEZBTFNFOwogfQogCi0jZGVmaW5lIHRocmlmdF90cmFuc3BvcnRfcmVhZCBteV90aHJpZnRfdHJhbnNwb3J0X3JlYWQKKyNkZWZpbmUgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCBteV90aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsCiAjZGVmaW5lIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgbXlfdGhyaWZ0X3RyYW5zcG9ydF93cml0ZQotI2luY2x1ZGUgIi4uL3NyYy9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmMiCi0jdW5kZWYgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkCisjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5jIgorI3VuZGVmIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwKICN1bmRlZiB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlCiAKIHN0YXRpYyB2b2lkIHRocmlmdF9zZXJ2ZXJfcHJpbWl0aXZlcyAoY29uc3QgaW50IHBvcnQpOwogc3RhdGljIHZvaWQgdGhyaWZ0X3NlcnZlcl9jb21wbGV4X3R5cGVzIChjb25zdCBpbnQgcG9ydCk7CitzdGF0aWMgdm9pZCB0aHJpZnRfc2VydmVyX21hbnlfZnJhbWVzIChjb25zdCBpbnQgcG9ydCk7CiAKIHN0YXRpYyB2b2lkCiB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSh2b2lkKQpAQCAtODUsNyArOTUsNyBAQAogCiAgIC8qIGNyZWF0ZSBhbiBvYmplY3QgYW5kIHRoZW4gZGVzdHJveSBpdCAqLwogICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgTlVMTCk7Ci0gIGFzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOwogICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKIH0KIApAQCAtOTksMTEgKzEwOSwxMSBAQAogICAvKiBjcmVhdGUgYSBUaHJpZnRUcmFuc3BvcnQgKi8KICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCA1MTE4OCwgTlVMTCk7Ci0gIGFzc2VydCAodHNvY2tldCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKHRzb2NrZXQgIT0gTlVMTCk7CiAgIC8qIGNyZWF0ZSBhIFRocmlmdEJpbmFyeVByb3RvY29sIHVzaW5nIHRoZSBUcmFuc3BvcnQgKi8KICAgcHJvdG9jb2wgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c29ja2V0LCBOVUxMKTsKLSAgYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOwogICAvKiBmZXRjaCB0aGUgcHJvcGVydGllcyAqLwogICBnX29iamVjdF9nZXQgKEdfT0JKRUNUKHByb3RvY29sKSwgInRyYW5zcG9ydCIsICZ0ZW1wLCBOVUxMKTsKICAgZ19vYmplY3RfdW5yZWYgKHRlbXApOwpAQCAtMTI4LDcgKzEzOCw3IEBACiAKICAgLyogZm9yayBhIHNlcnZlciBmcm9tIHRoZSBjbGllbnQgKi8KICAgcGlkID0gZm9yayAoKTsKLSAgYXNzZXJ0IChwaWQgPj0gMCk7CisgIGdfYXNzZXJ0IChwaWQgPj0gMCk7CiAKICAgaWYgKHBpZCA9PSAwKQogICB7CkBAIC0xNDQsNDcgKzE1NCw0OCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CiAgICAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7CiAgICAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIGFzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKIAogICAgIC8qIGNyZWF0ZSBhIFRocmlmdEJpbmFyeVRyYW5zcG9ydCAqLwogICAgIHRiID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAogICAgICAgICAgICAgICAgICAgICAgICB0c29ja2V0LCBOVUxMKTsKICAgICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGIpOwotICAgIGFzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CisgICAgZ19hc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOwogCiAgICAgLyogd3JpdGUgYSBidW5jaCBvZiBwcmltaXRpdmVzICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBURVNUX0JZVEUsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX0kzMiwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9JNjQsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsIAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX0kxNiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX0kzMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9kb3VibGUgKHByb3RvY29sLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX0RPVUJMRSwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfU1RSSU5HLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksIAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsICIiLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBOVUxMLCAwLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgTlVMTCwgMCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA+IDApOwogCiAgICAgLyogdGVzdCB3cml0ZSBlcnJvcnMgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVEVTVF9CWVRFLCAKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVEVTVF9CWVRFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX0kxNiwgTlVMTCkgPT0gLTEpOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX0kzMiwgTlVMTCkgPT0gLTEpOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPT0gLTEpOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9kb3VibGUgKHByb3RvY29sLCBURVNUX0RPVUJMRSwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX0kxNiwgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfSTMyLCBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9JNjQsIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9kb3VibGUgKHByb3RvY29sLCBURVNUX0RPVUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwgbGVuLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOwogCiAgICAgLyogdGVzdCBiaW5hcnkgcGFydGlhbCBmYWlsdXJlICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOwogCkBAIC0xOTIsOCArMjAzLDggQEAKICAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOwogICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKICAgICBnX29iamVjdF91bnJlZiAocHJvdG9jb2wpOwotICAgIGFzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKLSAgICBhc3NlcnQgKHN0YXR1cyA9PSAwKTsKKyAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKyAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOwogICB9CiB9CiAKQEAgLTIxMCw3ICsyMjEsNyBAQAogCiAgIC8qIGZvcmsgYSBzZXJ2ZXIgZnJvbSB0aGUgY2xpZW50ICovCiAgIHBpZCA9IGZvcmsgKCk7Ci0gIGFzc2VydCAocGlkID49IDApOworICBnX2Fzc2VydCAocGlkID49IDApOwogCiAgIGlmIChwaWQgPT0gMCkKICAgewpAQCAtMjI2LDMzICsyMzcsMzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOwogICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOwogICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICBhc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CiAKICAgICAvKiBjcmVhdGUgYSBUaHJpZnRCaW5hcnlUcmFuc3BvcnQgKi8KICAgICB0YiA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgICAgdHNvY2tldCwgTlVMTCk7CiAgICAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRiKTsKLSAgICBhc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworICAgIGdfYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKIAogICAgIC8qIHRlc3Qgc3RydWN0dXJlcyAqLwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLCAKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKSA9PSAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKIAotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX1ZPSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKIAogICAgIC8qIHRlc3Qgd3JpdGUgZXJyb3IgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9WT0lELCAKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9WT0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOwogCiAgICAgLyogdGVzdCAybmQgd3JpdGUgZXJyb3IgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX1ZPSUQsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKIApAQCAtMjYwLDEyICsyNzEsMTIgQEAKICAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBUX1ZPSUQsIE5VTEwpOwogCiAgICAgLyogdGVzdCB3cml0ZV9maWVsZF9zdG9wICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3AgKHByb3RvY29sLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3AgKHByb3RvY29sLCBOVUxMKSA+IDApOwogCiAgICAgLyogd3JpdGUgYSBtYXAgKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9WT0lELCBUX1ZPSUQsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9WT0lELCBUX1ZPSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKIAogICAgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIG1hcCAqLwogICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRfVk9JRCwgTlVMTCk7CkBAIC0yNzYsMjEgKzI4NywyMSBAQAogCiAgICAgLyogdGVzdCAxc3Qgd3JpdGUgZmFpbHVyZSBvbiBhIG1hcCAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOwogCiAgICAgLyogdGVzdCAybmQgd3JpdGUgZmFpbHVyZSBvbiBhIG1hcCAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9WT0lELCBUX1ZPSUQsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9WT0lELCBUX1ZPSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOwogCiAgICAgLyogdGVzdCAzcmQgd3JpdGUgZmFpbHVyZSBvbiBhIG1hcCAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMjsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9WT0lELCBUX1ZPSUQsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9WT0lELCBUX1ZPSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOwogCkBAIC0zMDAsOSArMzExLDkgQEAKICAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIC0xMCwgTlVMTCk7CiAKICAgICAvKiB0ZXN0IGxpc3Qgb3BlcmF0aW9ucyAqLwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKIAogICAgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIGxpc3QgKi8KICAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBUX1ZPSUQsIE5VTEwpOwpAQCAtMzEzLDI3ICszMjQsMjcgQEAKIAogICAgIC8qIHRlc3QgZmlyc3Qgd3JpdGUgZXJyb3Igb24gYSBsaXN0ICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKIAogICAgIC8qIHRlc3QgMm5kIHdyaXRlIGVycm9yIG9uIGEgbGlzdCAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CiAKICAgICAvKiB0ZXN0IHNldCBvcGVyYXRpb24gcyovCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3NldF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKIAogICAgIC8qIGludmFsaWQgdmVyc2lvbiAqLwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAtMSwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAtMSwgTlVMTCkgPiAwKTsKIAogICAgIC8qIHN6ID4gMCBmb3IgYSBtZXNzYWdlICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIDEsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgMSwgTlVMTCkgPiAwKTsKIAogICAgIC8qIHNlbmQgYSB2YWxpZCBtZXNzYWdlICovCiAgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAweDgwMDEwMDAwLCBOVUxMKTsKQEAgLTM0OCwyNiArMzU5LDI2IEBACiAgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLCAidGVzdCIsIE5VTEwpOwogCiAgICAgLyogc2VuZCBhIHZhbGlkIG1lc3NhZ2UgKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID4gMCk7CiAKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOwogCiAgICAgLyogc2VuZCBicm9rZW4gd3JpdGVzICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOwogCiAgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAyOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOwogCiAgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAzOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOwogCkBAIC0zNzUsOCArMzg2LDk1IEBACiAgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKICAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiAgICAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sKTsKLSAgICBhc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7Ci0gICAgYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkX2FuZF93cml0ZV9tYW55X2ZyYW1lcyAodm9pZCkKK3sKKyAgaW50IHN0YXR1czsKKyAgcGlkX3QgcGlkOworICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqZnQgPSBOVUxMOworICBUaHJpZnRCaW5hcnlQcm90b2NvbCAqdGIgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBncG9pbnRlciBiaW5hcnkgPSAoZ3BvaW50ZXIgKikgVEVTVF9TVFJJTkc7CisgIGNvbnN0IGd1aW50MzIgbGVuID0gc3RybGVuIChURVNUX1NUUklORyk7CisgIGludCBwb3J0ID0gVEVTVF9QT1JUOworCisgIC8qIGZvcmsgYSBzZXJ2ZXIgZnJvbSB0aGUgY2xpZW50ICovCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0IChwaWQgPj0gMCk7CisKKyAgaWYgKHBpZCA9PSAwKQorICB7CisgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgIHRocmlmdF9zZXJ2ZXJfbWFueV9mcmFtZXMgKHBvcnQpOworICAgIGV4aXQgKDApOworICB9IGVsc2UgeworICAgIC8qIHBhcmVudC4gIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZC4gKi8KKyAgICBzbGVlcCAoMSk7CisKKyAgICAvKiBjcmVhdGUgYSBUaHJpZnRTb2NrZXQgKi8KKyAgICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRzb2NrZXQgIT0gTlVMTCk7CisgICAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7CisKKyAgICAvKiB3cmFwIGluIGEgZnJhbWVkIHRyYW5zcG9ydCAqLworICAgIGZ0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAid19idWZfc2l6ZSIsIDEsIE5VTEwpOworICAgIGdfYXNzZXJ0IChmdCAhPSBOVUxMKTsKKyAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUIChmdCk7CisKKyAgICB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisKKyAgICAvKiBjcmVhdGUgYSBiaW5hcnkgcHJvdG9jb2wgKi8KKyAgICB0YiA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LCBOVUxMKTsKKyAgICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGIpOworICAgIGdfYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKworICAgIC8qIHdyaXRlIGEgYnVuY2ggb2YgcHJpbWl0aXZlcyAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVEVTVF9CWVRFLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9JMTYsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX0kzMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX0RPVUJMRSwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9TVFJJTkcsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLCAiIiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBOVUxMLCAwLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCisgICAgLyogY2xlYW4gdXAgKi8KKyAgICB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfb2JqZWN0X3VucmVmIChmdCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworICAgIGdfb2JqZWN0X3VucmVmICh0Yik7CisgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKICAgfQogfQogCkBAIC0zOTUsNiArNDkzLDcgQEAKICAgZ2ludDY0IHZhbHVlXzY0ID0gMDsKICAgZ2RvdWJsZSB2YWx1ZV9kb3VibGUgPSAwOwogICBnY2hhciAqc3RyaW5nID0gTlVMTDsKKyAgZ2NoYXIgKmVtcHR5X3N0cmluZyA9IE5VTEw7CiAgIGdwb2ludGVyIGJpbmFyeSA9IE5VTEw7CiAgIGd1aW50MzIgbGVuID0gMDsKICAgdm9pZCAqY29tcGFyYXRvciA9ICh2b2lkICopIFRFU1RfU1RSSU5HOwpAQCAtNDA0LDYxICs1MDMsNjggQEAKICAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOwogICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CiAgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CiAKICAgdGJwID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAogICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwgTlVMTCk7CiAgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0YnApOwogCi0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZV9ieXRlLCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCAmdmFsdWVfMTYsIE5VTEwpID4gMCk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlXzY0LCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9kb3VibGUgKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWVfYnl0ZSwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCAmdmFsdWVfMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9kb3VibGUgKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9kb3VibGUsIE5VTEwpID4gMCk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZzdHJpbmcsIE5VTEwpID4gMCk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJnN0cmluZywgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmZW1wdHlfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA+IDApOwogCi0gIGFzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOwotICBhc3NlcnQgKHZhbHVlX2J5dGUgPSBURVNUX0JZVEUpOwotICBhc3NlcnQgKHZhbHVlXzE2ID0gVEVTVF9JMTYpOwotICBhc3NlcnQgKHZhbHVlXzMyID0gVEVTVF9JMzIpOwotICBhc3NlcnQgKHZhbHVlXzY0ID0gVEVTVF9JNjQpOwotICBhc3NlcnQgKHZhbHVlX2RvdWJsZSA9IFRFU1RfRE9VQkxFKTsKLSAgYXNzZXJ0IChzdHJjbXAgKFRFU1RfU1RSSU5HLCBzdHJpbmcpID09IDApOwotICBhc3NlcnQgKG1lbWNtcCAoY29tcGFyYXRvciwgYmluYXJ5LCBsZW4pID09IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICBnX2Fzc2VydCAodmFsdWVfYnl0ZSA9PSBURVNUX0JZVEUpOworICBnX2Fzc2VydCAodmFsdWVfMTYgPT0gVEVTVF9JMTYpOworICBnX2Fzc2VydCAodmFsdWVfMzIgPT0gVEVTVF9JMzIpOworICBnX2Fzc2VydCAodmFsdWVfNjQgPT0gVEVTVF9JNjQpOworICBnX2Fzc2VydCAodmFsdWVfZG91YmxlID09IFRFU1RfRE9VQkxFKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoVEVTVF9TVFJJTkcsIHN0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKCIiLCBlbXB0eV9zdHJpbmcpID09IDApOworICBnX2Fzc2VydCAobWVtY21wIChjb21wYXJhdG9yLCBiaW5hcnksIGxlbikgPT0gMCk7CiAKICAgZ19mcmVlIChzdHJpbmcpOworICBnX2ZyZWUgKGVtcHR5X3N0cmluZyk7CiAgIGdfZnJlZSAoYmluYXJ5KTsKIAotICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwgJmxlbiwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAoYmluYXJ5ID09IE5VTEwpOworICBnX2Fzc2VydCAobGVuID09IDApOwogICBnX2ZyZWUgKGJpbmFyeSk7CiAKICAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDA7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CiAKICAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDE7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CiAKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID09IC0xKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ieXRlLCBOVUxMKSA9PSAtMSk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfMTYsIE5VTEwpID09IC0xKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKSA9PSAtMSk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPT0gLTEpOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9kb3VibGUgKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2RvdWJsZSwgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CiAKQEAgLTQ5Niw3ICs2MDIsNyBAQAogICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CiAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKICAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOwotICBhc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKIAogICB0YnAgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBOVUxMKTsKQEAgLTUxMSw3ICs2MTcsNyBAQAogCiAgIC8qIHRlc3QgZmlyc3QgcmVhZCBlcnJvciBvbiBhIGZpZWxkICovCiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9uYW1lLCAmZmllbGRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CkBAIC01MjIsNyArNjI4LDcgQEAKICAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgZmllbGQgKi8KICAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDE7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfbmFtZSwgJmZpZWxkX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKQEAgLTUzOCw3ICs2NDQsNyBAQAogICAvKiB0ZXN0IHJlYWQgZmFpbHVyZSBvbiBhIG1hcCAqLwogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMDsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKQEAgLTU0Niw3ICs2NTIsNyBAQAogICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBtYXAgKi8KICAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDE7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CkBAIC01NTQsNyArNjYwLDcgQEAKICAgLyogdGVzdCAzcmQgcmVhZCBmYWlsdXJlIG9uIGEgbWFwICovCiAgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAyOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOwpAQCAtNTY3LDcgKzY3Myw3IEBACiAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlLCBOVUxMKTsKIAogICAvKiB0ZXN0IG5lZ2F0aXZlIG1hcCBzaXplICovCi0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CiAKQEAgLTU3Nyw3ICs2ODMsNyBAQAogCiAgIC8qIHRlc3QgcmVhZCBmYWlsdXJlICovCiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtZW50X3R5cGUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtZW50X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKIApAQCAtNTk5LDIzICs3MDUsMjMgQEAKIAogICAvKiBicm9rZW4gcmVhZCAqLwogICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDE7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOwogCiAgIC8qIGludmFsaWQgcHJvdG9jb2wgdmVyc2lvbiAqLwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CiAKICAgLyogc3ogPiAwICovCi0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CiAKICAgLyogcmVhZCBhIHZhbGlkIG1lc3NhZ2UgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKICAgZ19mcmVlIChtZXNzYWdlX25hbWUpOwpAQCAtNjIzLDcgKzcyOSw3IEBACiAgIC8qIGJyb2tlbiAybmQgcmVhZCBvbiBhIG1lc3NhZ2UgKi8KICAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDE7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKQEAgLTYzMSwxOSArNzM3LDE5IEBACiAgIC8qIGJyb2tlbiAzcmQgcmVhZCBvbiBhIG1lc3NhZ2UgKi8KICAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDM7IC8qIHJlYWRfc3RyaW5nIGRvZXMgdHdvIHJlYWRzICovCi0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKICAgZ19mcmVlIChtZXNzYWdlX25hbWUpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOwogCiAgIC8qIHJlYWQgYSB2YWxpZCBtZXNzYWdlICovCi0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOwogICBnX2ZyZWUgKG1lc3NhZ2VfbmFtZSk7CiAKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOwogCiAgIC8qIGhhbmRsZSAybmQgd3JpdGUgZmFpbHVyZSBvbiBhIG1lc3NhZ2UgKi8KICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2ZXJzaW9uLCBOVUxMKTsKQEAgLTY1MywyMCArNzU5LDEwMSBAQAogICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwgTlVMTCk7CiAKICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7Ci0gIC8vIFRPRE86IGludmVzdGlnYXRlIGdfb2JqZWN0X3VucmVmICh0YnApOworICAvKiBUT0RPOiBpbnZlc3RpZ2F0ZSBnX29iamVjdF91bnJlZiAodGJwKTsgKi8KKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9tYW55X2ZyYW1lcyAoY29uc3QgaW50IHBvcnQpCit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBUaHJpZnRCaW5hcnlQcm90b2NvbCAqdGJwID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sID0gTlVMTDsKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgZ2Jvb2xlYW4gdmFsdWVfYm9vbGVhbiA9IEZBTFNFOworICBnaW50OCB2YWx1ZV9ieXRlID0gMDsKKyAgZ2ludDE2IHZhbHVlXzE2ID0gMDsKKyAgZ2ludDMyIHZhbHVlXzMyID0gMDsKKyAgZ2ludDY0IHZhbHVlXzY0ID0gMDsKKyAgZ2RvdWJsZSB2YWx1ZV9kb3VibGUgPSAwOworICBnY2hhciAqc3RyaW5nID0gTlVMTDsKKyAgZ2NoYXIgKmVtcHR5X3N0cmluZyA9IE5VTEw7CisgIGdwb2ludGVyIGJpbmFyeSA9IE5VTEw7CisgIGd1aW50MzIgbGVuID0gMDsKKyAgdm9pZCAqY29tcGFyYXRvciA9ICh2b2lkICopIFRFU1RfU1RSSU5HOworCisgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsICJwb3J0IiwgcG9ydCwgTlVMTCk7CisgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworCisgIC8qIHdyYXAgdGhlIGNsaWVudCBpbiBhIGZyYW1lZCB0cmFuc3BvcnQgKi8KKyAgY2xpZW50ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgInJfYnVmX3NpemUiLCAxLCBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKworICB0YnAgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBOVUxMKTsKKyAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRicCk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZV9ieXRlLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZ2YWx1ZV8xNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlXzY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2RvdWJsZSwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmc3RyaW5nLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZlbXB0eV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID4gMCk7CisKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2J5dGUgPT0gVEVTVF9CWVRFKTsKKyAgZ19hc3NlcnQgKHZhbHVlXzE2ID09IFRFU1RfSTE2KTsKKyAgZ19hc3NlcnQgKHZhbHVlXzMyID09IFRFU1RfSTMyKTsKKyAgZ19hc3NlcnQgKHZhbHVlXzY0ID09IFRFU1RfSTY0KTsKKyAgZ19hc3NlcnQgKHZhbHVlX2RvdWJsZSA9PSBURVNUX0RPVUJMRSk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKFRFU1RfU1RSSU5HLCBzdHJpbmcpID09IDApOworICBnX2Fzc2VydCAoc3RyY21wICgiIiwgZW1wdHlfc3RyaW5nKSA9PSAwKTsKKyAgZ19hc3NlcnQgKG1lbWNtcCAoY29tcGFyYXRvciwgYmluYXJ5LCBsZW4pID09IDApOworCisgIGdfZnJlZSAoc3RyaW5nKTsKKyAgZ19mcmVlIChlbXB0eV9zdHJpbmcpOworICBnX2ZyZWUgKGJpbmFyeSk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0IChiaW5hcnkgPT0gTlVMTCk7CisgIGdfYXNzZXJ0IChsZW4gPT0gMCk7CisgIGdfZnJlZSAoYmluYXJ5KTsKKworICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChjbGllbnQsIE5VTEwpOworICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmICh0YnApOworICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogfQogCiBpbnQKIG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQogICBnX3R5cGVfaW5pdCgpOworI2VuZGlmCisKICAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CiAKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RiaW5hcnlwcm90b2NvbC9DcmVhdGVBbmREZXN0cm95IiwgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kpOwogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGJpbmFyeXByb3RvY29sL0luaXRpYWxpemUiLCB0ZXN0X2luaXRpYWxpemUpOwogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGJpbmFyeXByb3RvY29sL1JlYWRBbmRXcml0ZVByaW1pdGl2ZXMiLCB0ZXN0X3JlYWRfYW5kX3dyaXRlX3ByaW1pdGl2ZXMpOwogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGJpbmFyeXByb3RvY29sL1JlYWRBbmRXcml0ZUNvbXBsZXhUeXBlcyIsIHRlc3RfcmVhZF9hbmRfd3JpdGVfY29tcGxleF90eXBlcyk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YmluYXJ5cHJvdG9jb2wvUmVhZEFuZFdyaXRlTWFueUZyYW1lcyIsCisgICAgICAgICAgICAgICAgICAgdGVzdF9yZWFkX2FuZF93cml0ZV9tYW55X2ZyYW1lcyk7CiAKICAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7CiB9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0LmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0LmMKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBmYjQ5YzhmLi5kMDE4MDZkCi0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0YnVmZmVyZWR0cmFuc3BvcnQuYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0LmMKQEAgLTE3LDIyICsxNywyMSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KIAotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaCIKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KIAogI2RlZmluZSBURVNUX0RBVEEgeyAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicgfQogCi0jaW5jbHVkZSAiLi4vc3JjL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMiCi0KLXN0YXRpYyBjb25zdCBjaGFyIFRFU1RfQUREUkVTU1tdID0gImxvY2FsaG9zdCI7Ci1zdGF0aWMgY29uc3Qgc2hvcnQgVEVTVF9QT1JUID0gNjQ0NDQ7CisjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuYyIKIAogc3RhdGljIHZvaWQgdGhyaWZ0X3NlcnZlciAoY29uc3QgaW50IHBvcnQpOworc3RhdGljIHZvaWQgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAoY29uc3QgaW50IHBvcnQsIGludCB0aW1lcyk7CiAKIC8qIHRlc3Qgb2JqZWN0IGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiAqLwogc3RhdGljIHZvaWQKQEAgLTQ0LDEwICs0MywxMCBAQAogCiAgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CiAgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULCBOVUxMKTsKLSAgYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CiAgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QgKG9iamVjdCksICJ0cmFuc3BvcnQiLCAmdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICJyX2J1Zl9zaXplIiwgJnJfYnVmX3NpemUsCi0gICAgICAgICAgICAgICAgIndfYnVmX3NpemUiLCAmd19idWZfc2l6ZSwgTlVMTCk7CisJCSJyX2J1Zl9zaXplIiwgJnJfYnVmX3NpemUsCisJCSJ3X2J1Zl9zaXplIiwgJndfYnVmX3NpemUsIE5VTEwpOwogICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKIH0KIApAQCAtNTcsMzUgKzU2LDUyIEBACiAgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CiAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKICAgR0Vycm9yICplcnIgPSBOVUxMOworICBwaWRfdCBwaWQ7CisgIGludCBwb3J0ID0gNTExOTk7CisgIGludCBzdGF0dXM7CiAKLSAgLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCi0gIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgNTExODgsIE5VTEwpOyAKKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOwogCi0gIC8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLwotICB0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksIE5VTEwpOworICBpZiAoIHBpZCA9PSAwICkKKyAgICB7CisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICB0aHJpZnRfc29ja2V0X3NlcnZlcl9vcGVuIChwb3J0LDEpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKKwkvKiBjcmVhdGUgYSBUaHJpZnRTb2NrZXQgKi8KKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSJwb3J0IiwgcG9ydCwgTlVMTCk7CiAKLSAgLyogdGhpcyBzaG91bGRuJ3Qgd29yayAqLwotICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBGQUxTRSk7Ci0gIGFzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpID09IFRSVUUpOwotICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7Ci0gIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOwotICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCisJCQkJICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksIE5VTEwpOwogCi0gIC8qIHRyeSBhbmQgdW5kZXJseWluZyBzb2NrZXQgZmFpbHVyZSAqLwotICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QuYnJva2VuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisJLyogdGhpcyBzaG91bGRuJ3Qgd29yayAqLworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiAKLSAgLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCi0gIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwgTlVMTCk7CisJLyogdHJ5IGFuZCB1bmRlcmx5aW5nIHNvY2tldCBmYWlsdXJlICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0LmJyb2tlbiIsCisJCQkJTlVMTCk7CiAKLSAgYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgJmVycikgPT0gRkFMU0UpOwotICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKLSAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwotICBnX2Vycm9yX2ZyZWUgKGVycik7Ci0gIGVyciA9IE5VTEw7CisJLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCisJCQkJICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksIE5VTEwpOworCisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCAmZXJyKSA9PSBGQUxTRSk7CisJZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCWdfZXJyb3JfZnJlZSAoZXJyKTsKKwllcnIgPSBOVUxMOworCWdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7CisJZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQKQEAgLTk5LDYwICsxMTUsODEgQEAKICAgZ3VjaGFyIGJ1ZlsxMF0gPSBURVNUX0RBVEE7IC8qIGEgYnVmZmVyICovCiAKICAgcGlkID0gZm9yayAoKTsKLSAgYXNzZXJ0ICggcGlkID49IDAgKTsKKyAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOwogCiAgIGlmICggcGlkID09IDAgKQotICB7Ci0gICAgLyogY2hpbGQgbGlzdGVucyAqLwotICAgIHRocmlmdF9zZXJ2ZXIgKHBvcnQpOwotICAgIGV4aXQgKDApOwotICB9IGVsc2UgewotICAgIC8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCi0gICAgc2xlZXAgKDEpOworICAgIHsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIHRocmlmdF9zZXJ2ZXIgKHBvcnQpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKIAotICAgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKLSAgICB0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3X2J1Zl9zaXplIiwgNCwgTlVMTCk7CisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLAorCQkJCSAgIndfYnVmX3NpemUiLCA0LCBOVUxMKTsKIAotICAgIGFzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOwotICAgIGFzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOwogCi0gICAgLyogd3JpdGUgMTAgYnl0ZXMgKi8KLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOworCS8qIHdyaXRlIDEwIGJ5dGVzICovCisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKIAotICAgIC8qIHdyaXRlIDEgYnl0ZSBhdCBhIHRpbWUgKi8KLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7Ci0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwkvKiB3cml0ZSAxIGJ5dGUgYXQgYSB0aW1lICovCisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CiAKLSAgICAvKiBvdmVyZmxvdyB0aGUgYnVmZmVyICovCi0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDIsIE5VTEwpOwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCS8qIG92ZXJmbG93IHRoZSBidWZmZXIgKi8KKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMiwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICAvKiB3cml0ZSAxIGJ5dGUgYW5kIGZsdXNoICovCi0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisJLyogd3JpdGUgMSBieXRlIGFuZCBmbHVzaCAqLworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwogCi0gICAgLyogd3JpdGUgYW5kIG92ZXJmbG93IGJ1ZmZlciB3aXRoIDIgc3lzdGVtIGNhbGxzICovCi0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAzLCBOVUxMKTsKKwkvKiB3cml0ZSBhbmQgb3ZlcmZsb3cgYnVmZmVyIHdpdGggMiBzeXN0ZW0gY2FsbHMgKi8KKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDMsIE5VTEwpOwogCi0gICAgLyogd3JpdGUgMTAgYnl0ZXMgKi8KLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOworCS8qIHdyaXRlIDEwIGJ5dGVzICovCisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKIAotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKLSAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogCi0gICAgYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7Ci0gICAgYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKwlnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOworCWdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKGNvbnN0IGludCBwb3J0LCBpbnQgdGltZXMpCit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBpbnQgaTsKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorCQkJCQkgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworCisgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworICBmb3IoaT0wO2k8dGltZXM7aSsrKXsKKyAgICAgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisgICAgICB0aHJpZnRfc29ja2V0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworICAgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CiAgIH0KKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTY1LDIxICsyMDIsMjEgQEAKICAgZ3VjaGFyIG1hdGNoWzEwXSA9IFRFU1RfREFUQTsKIAogICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKwkJCQkJICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKIAogICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CiAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKIAogICAvKiB3cmFwIHRoZSBjbGllbnQgaW4gYSBCdWZmZXJlZFRyYW5zcG9ydCAqLwogICBjbGllbnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwgInRyYW5zcG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJyX2J1Zl9zaXplIiwgNSwgTlVMTCk7Ci0gIGFzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCQkJIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKSwKKwkJCSAicl9idWZfc2l6ZSIsIDUsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOwogCiAgIC8qIHJlYWQgMTAgYnl0ZXMgKi8KICAgYnl0ZXMgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudCwgYnVmLCAxMCwgTlVMTCk7Ci0gIGFzc2VydCAoYnl0ZXMgPT0gMTApOyAvKiBtYWtlIHN1cmUgd2UndmUgcmVhZCAxMCBieXRlcyAqLwotICBhc3NlcnQgKCBtZW1jbXAgKGJ1ZiwgbWF0Y2gsIDEwKSA9PSAwICk7IC8qIG1ha2Ugc3VyZSB3aGF0IHdlIGdvdCBtYXRjaGVzICovCisgIGdfYXNzZXJ0IChieXRlcyA9PSAxMCk7IC8qIG1ha2Ugc3VyZSB3ZSd2ZSByZWFkIDEwIGJ5dGVzICovCisgIGdfYXNzZXJ0ICggbWVtY21wIChidWYsIG1hdGNoLCAxMCkgPT0gMCApOyAvKiBtYWtlIHN1cmUgd2hhdCB3ZSBnb3QgbWF0Y2hlcyAqLwogCiAgIC8qIHJlYWQgMSBieXRlICovCiAgIGJ5dGVzID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9yZWFkIChjbGllbnQsIGJ1ZiwgMSwgTlVMTCk7CkBAIC0xOTQsMTUgKzIzMSw5NCBAQAogICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiB9CiAKK3N0YXRpYyB2b2lkCit0ZXN0X3dyaXRlX2ZhaWwodm9pZCkKK3sKKyAgaW50IHN0YXR1czsKKyAgcGlkX3QgcGlkOworICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIGludCBwb3J0ID0gNTExOTg7CisgIGd1Y2hhciBidWZbMTBdID0gVEVTVF9EQVRBOyAvKiBhIGJ1ZmZlciAqLworCisgIC8qIFNJR1BJUEUgd2hlbiBzZW5kIHRvIGRpc2Nvbm5lY3RlZCBzb2NrZXQgKi8KKyAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0ICggcGlkID49IDAgKTsKKworICBpZiAoIHBpZCA9PSAwICkKKyAgICB7CisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgICAgICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisKKyAgICAgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkJCSAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKworICAgICAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICAgICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworCisgICAgICAvKiB3cmFwIHRoZSBjbGllbnQgaW4gYSBCdWZmZXJlZFRyYW5zcG9ydCAqLworICAgICAgY2xpZW50ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLAorCQkJICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCksCisJCQkgICAgICJyX2J1Zl9zaXplIiwgNSwgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCisgICAgICAvKiBqdXN0IGNsb3NlIHNvY2tldCAqLworICAgICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICAgICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKKworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJInBvcnQiLCBwb3J0LCBOVUxMKTsKKwl0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKKwkJCQkgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKKwkJCQkgICJ3X2J1Zl9zaXplIiwgNCwgTlVMTCk7CisKKworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisKKwkvKiByZWNvZ25pemUgZGlzY29ubmVjdGlvbiAqLworCXNsZWVwKDEpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpID09IEZBTFNFKTsKKworCS8qIHdyaXRlIGFuZCBvdmVyZmxvdyBidWZmZXIgKi8KKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKSA9PSBGQUxTRSk7CisKKwkvKiB3cml0ZSAxIGFuZCBmbHVzaCAqLworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCkgPT0gRkFMU0UpOworCisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKworCWdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKworCWdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7CisJZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAgIH0KK30KKwogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKICAgZ190eXBlX2luaXQoKTsKKyNlbmRpZgorCiAgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOwogCiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YnVmZmVyZWR0cmFuc3BvcnQvQ3JlYXRlQW5kRGVzdHJveSIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95KTsKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RidWZmZXJlZHRyYW5zcG9ydC9PcGVuQW5kQ2xvc2UiLCB0ZXN0X29wZW5fYW5kX2Nsb3NlKTsKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RidWZmZXJlZHRyYW5zcG9ydC9SZWFkQW5kV3JpdGUiLCB0ZXN0X3JlYWRfYW5kX3dyaXRlKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RidWZmZXJlZHRyYW5zcG9ydC9Xcml0ZUZhaWwiLCB0ZXN0X3dyaXRlX2ZhaWwpOwogCiAgIHJldHVybiBnX3Rlc3RfcnVuICgpOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb21wYWN0cHJvdG9jb2wuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0Y29tcGFjdHByb3RvY29sLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTVhZDQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0Y29tcGFjdHByb3RvY29sLmMKQEAgLTAsMCArMSwxMjkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qIERpc2FibGUgc3RyaW5nLWZ1bmN0aW9uIG9wdGltaXphdGlvbnMgd2hlbiBnbGliYyBpcyB1c2VkLCBhcyB0aGVzZSBwcm9kdWNlCisgICBjb21waWxlciB3YXJuaW5ncyBhYm91dCBzdHJpbmcgbGVuZ3RoIHdoZW4gYSBzdHJpbmcgZnVuY3Rpb24gaXMgdXNlZCBpbnNpZGUKKyAgIGEgY2FsbCB0byBnX2Fzc2VydCAoKSAqLworI2lmICFkZWZpbmVkKF9fQVBQTEVfXykgJiYgIWRlZmluZWQoX19GcmVlQlNEX18pICYmIFwKKyAgICAhZGVmaW5lZChfX09wZW5CU0RfXykgJiYgIWRlZmluZWQoX19OZXRCU0RfXykKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2VuZGlmCisKKyNpZmRlZiBfX0dMSUJDX18KKyNkZWZpbmUgX19OT19TVFJJTkdfSU5MSU5FUyAxCisjZW5kaWYKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oPgorCisjZGVmaW5lIFRFU1RfQk9PTCBUUlVFCisjZGVmaW5lIFRFU1RfQllURSAxMjMKKyNkZWZpbmUgVEVTVF9JMTYgMTIzNDUKKyNkZWZpbmUgVEVTVF9JMzIgMTIzNDU2Nzg5MAorI2RlZmluZSBURVNUX0k2NCAxMjM0NTY3ODkwMTIzNDUKKyNkZWZpbmUgVEVTVF9OSTE2ICgtMTIzNDUpCisjZGVmaW5lIFRFU1RfTkkzMiAoLTEyMzQ1Njc4OTApCisjZGVmaW5lIFRFU1RfTkk2NCAoLTEyMzQ1Njc4OTAxMjM0NSkKKyNkZWZpbmUgVEVTVF9ET1VCTEUgMTIzNDU2Nzg5MC4xMjMKKyNkZWZpbmUgVEVTVF9TVFJJTkcgInRoaXMgaXMgYSB0ZXN0IHN0cmluZyAxMjM0NTY3ODkwIUAjJCVeJiooKSIKKyNkZWZpbmUgVEVTVF9QT1JUIDUxMTk5CisKK3N0YXRpYyBpbnQgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworc3RhdGljIGludCB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CitzdGF0aWMgaW50IHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CitnaW50MzIKK215X3RocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIGlmICh0cmFuc3BvcnRfcmVhZF9jb3VudCAhPSB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdAorICAgICAgJiYgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPT0gMCkKKyAgeworICAgIHRyYW5zcG9ydF9yZWFkX2NvdW50Kys7CisgICAgcmV0dXJuIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKKyAgfQorICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKK3N0YXRpYyBpbnQgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKK3N0YXRpYyBpbnQgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CitnYm9vbGVhbgorbXlfdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgaWYgKHRyYW5zcG9ydF93cml0ZV9jb3VudCAhPSB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQKKyAgICAgICYmIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9PSAwKQorICB7CisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50Kys7CisgICAgcmV0dXJuIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKKyNkZWZpbmUgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCBteV90aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsCisjZGVmaW5lIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgbXlfdGhyaWZ0X3RyYW5zcG9ydF93cml0ZQorI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmMiCisjdW5kZWYgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbAorI3VuZGVmIHRocmlmdF90cmFuc3BvcnRfd3JpdGUKKworc3RhdGljIHZvaWQgdGhyaWZ0X3NlcnZlcl9wcmltaXRpdmVzIChjb25zdCBpbnQgcG9ydCk7CitzdGF0aWMgdm9pZCB0aHJpZnRfc2VydmVyX2NvbXBsZXhfdHlwZXMgKGNvbnN0IGludCBwb3J0KTsKK3N0YXRpYyB2b2lkIHRocmlmdF9zZXJ2ZXJfbWFueV9mcmFtZXMgKGNvbnN0IGludCBwb3J0KTsKKworc3RhdGljIHZvaWQKK3Rlc3RfY3JlYXRlX2FuZF9kZXN0cm95ICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworCisgIC8qIGNyZWF0ZSBhbiBvYmplY3QgYW5kIHRoZW4gZGVzdHJveSBpdCAqLworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsIE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfaW5pdGlhbGl6ZSAodm9pZCkKK3sKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIFRocmlmdFNvY2tldCAqdGVtcCA9IE5VTEw7CisKKyAgLyogY3JlYXRlIGEgVGhyaWZ0VHJhbnNwb3J0ICovCisgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgNTExODgsIE5VTEwpOworICBnX2Fzc2VydCAodHNvY2tldCAhPSBOVUxMKTsKKyAgLyogY3JlYXRlIGEgVGhyaWZ0Q29tcGFjdFByb3RvY29sIHVzaW5nIHRoZSBUcmFuc3BvcnQgKi8KKyAgcHJvdG9jb2wgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNvY2tldCwgTlVMTCk7CisgIGdfYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKyAgLyogZmV0Y2ggdGhlIHByb3BlcnRpZXMgKi8KKyAgZ19vYmplY3RfZ2V0IChHX09CSkVDVCAocHJvdG9jb2wpLCAidHJhbnNwb3J0IiwgJnRlbXAsIE5VTEwpOworICBnX29iamVjdF91bnJlZiAodGVtcCk7CisKKyAgLyogY2xlYW4gdXAgbWVtb3J5ICovCisgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbCk7CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmVhZF9hbmRfd3JpdGVfcHJpbWl0aXZlcyAodm9pZCkKK3sKKyAgaW50IHN0YXR1czsKKyAgcGlkX3QgcGlkOworICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqdGMgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBncG9pbnRlciBiaW5hcnkgPSAoZ3BvaW50ZXIgKikgVEVTVF9TVFJJTkc7CisgIGd1aW50MzIgbGVuID0gc3RybGVuIChURVNUX1NUUklORyk7CisgIGludCBwb3J0ID0gVEVTVF9QT1JUOworCisgIC8qIGZvcmsgYSBzZXJ2ZXIgZnJvbSB0aGUgY2xpZW50ICovCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0IChwaWQgPj0gMCk7CisKKyAgaWYgKHBpZCA9PSAwKQorICB7CisgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgIHRocmlmdF9zZXJ2ZXJfcHJpbWl0aXZlcyAocG9ydCk7CisgICAgZXhpdCAoMCk7CisgIH0gZWxzZSB7CisgICAgLyogcGFyZW50LiAgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkLiAqLworICAgIHNsZWVwICgxKTsKKworICAgIC8qIGNyZWF0ZSBhIFRocmlmdFNvY2tldCAqLworICAgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisKKyAgICAvKiBjcmVhdGUgYSBUaHJpZnRDb21wYWN0VHJhbnNwb3J0ICovCisgICAgdGMgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICB0c29ja2V0LCBOVUxMKTsKKyAgICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGMpOworICAgIGdfYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKworICAgIC8qIHdyaXRlIGEgYnVuY2ggb2YgcHJpbWl0aXZlcyAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVEVTVF9CWVRFLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX0kxNiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX05JMTYsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfTkkzMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9OSTY0LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCAyLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAyLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCAyLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCAtMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgLTIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIC0yLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfRE9VQkxFLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfU1RSSU5HLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLCAiIiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgTlVMTCwgMCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKKworICAgIC8qIHRlc3Qgd3JpdGUgZXJyb3JzICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX0kxNiwgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX0kzMiwgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX05JMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9OSTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfTkk2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9kb3VibGUgKHByb3RvY29sLCBURVNUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworCisgICAgLyogdGVzdCBiaW5hcnkgcGFydGlhbCBmYWlsdXJlICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CisKKyAgICAvKiBjbGVhbiB1cCAqLworICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworICAgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbCk7CisgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkX2FuZF93cml0ZV9jb21wbGV4X3R5cGVzICh2b2lkKQoreworICBpbnQgc3RhdHVzOworICBwaWRfdCBwaWQ7CisgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YyA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIGludCBwb3J0ID0gVEVTVF9QT1JUOworCisgIC8qIGZvcmsgYSBzZXJ2ZXIgZnJvbSB0aGUgY2xpZW50ICovCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0IChwaWQgPj0gMCk7CisKKyAgaWYgKHBpZCA9PSAwKQorICB7CisgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgIHRocmlmdF9zZXJ2ZXJfY29tcGxleF90eXBlcyAocG9ydCk7CisgICAgZXhpdCAoMCk7CisgIH0gZWxzZSB7CisgICAgLyogcGFyZW50LiAgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkLiAqLworICAgIHNsZWVwICgxKTsKKworICAgIC8qIGNyZWF0ZSBhIFRocmlmdFNvY2tldCAqLworICAgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisKKyAgICAvKiBjcmVhdGUgYSBUaHJpZnRDb21wYWN0VHJhbnNwb3J0ICovCisgICAgdGMgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICB0c29ja2V0LCBOVUxMKTsKKyAgICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGMpOworICAgIGdfYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKworICAgIC8qIHRlc3Qgc3RydWN0dXJlcyAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICAvKiB0ZXN0IGZpZWxkIHN0YXRlIHcuci50LiBkZWx0YXMgKi8KKworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwgMSwgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NiwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDcsIE5VTEwpID09IDEpOworCisgICAgLyogdGVzdCBmaWVsZHMgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICAvKiB0ZXN0IGZpZWxkIHN0YXRlIHcuci50LiBzdHJ1Y3RzICovCisKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcsIE5VTEwpID4gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4LCBOVUxMKSA+IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTksIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4LCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1LCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNywgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgLyogdGVzdCBmaWVsZCBzdGF0ZSB3LnIudC4gYm9vbHMgKi8KKworICAgIC8qIGRlbHRhcyAqLworICAgIC8qIG5vbi1ib29sIGZpZWxkIC0+IGJvb2wgZmllbGQgLT4gbm9uLWJvb2wgZmllbGQgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfQk9PTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOSwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwLCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgLyogYm9vbCAtPiBib29sIGZpZWxkIC0+IGJvb2wgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfQk9PTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMSwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMCk7CisKKyAgICAvKiBubyBkZWx0YXMgKi8KKyAgICAvKiBub24tYm9vbCBmaWVsZCAtPiBib29sIGZpZWxkIC0+IG5vbi1ib29sIGZpZWxkICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9CT09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICAvKiBib29sIC0+IGJvb2wgZmllbGQgLT4gYm9vbCAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9CT09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOworCisgICAgLyogdGVzdCB3cml0ZSBlcnJvciAqLworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworCisgICAgLyogdGVzdCAybmQgd3JpdGUgZXJyb3IgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKKworICAgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIGZpZWxkICovCisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRfRE9VQkxFLCBOVUxMKTsKKworICAgIC8qIHRlc3Qgd3JpdGVfZmllbGRfc3RvcCAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChwcm90b2NvbCwgTlVMTCkgPiAwKTsKKworICAgIC8qIHdyaXRlIGEgbWFwICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgLyogdGVzdCAxc3QgcmVhZCBmYWlsdXJlIG9uIG1hcC0tLW5vdGhpbmcgdG8gZG8gb24gb3VyIHNpZGUgKi8KKworICAgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIG1hcCAqLworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBUX0RPVUJMRSwgTlVMTCk7CisKKyAgICAvKiB0ZXN0IDFzdCB3cml0ZSBmYWlsdXJlIG9uIGEgbWFwICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKKworICAgIC8qIHRlc3QgMm5kIHdyaXRlIGZhaWx1cmUgb24gYSBtYXAgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOworCisgICAgLyogdGVzdCBuZWdhdGl2ZSBtYXAgc2l6ZSAqLworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyICh0YywgLTEwLCBOVUxMKTsKKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVF9ET1VCTEUsIE5VTEwpOworCisgICAgLyogdGVzdCBsaXN0IG9wZXJhdGlvbnMgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIC8qIHRlc3QgMXN0IHJlYWQgZmFpbHVyZSBvbiBhIHNtYWxsIGxpc3QtLS1ub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQgKi8KKworICAgIC8qIHRlc3QgMXN0IHJlYWQgZmFpbHVyZSBvbiBhIGJpZyBsaXN0LS0tbm90aGluZyB0byBkbyBvbiBvdXIgZW5kICovCisKKyAgICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBiaWcgbGlzdCAqLworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIDB4ZjAsIE5VTEwpOworCisgICAgLyogdGVzdCBuZWdhdGl2ZSBsaXN0IHNpemUgKi8KKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSAweGYwLCBOVUxMKTsKKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAodGMsIC0xMCwgTlVMTCk7CisKKyAgICAvKiB0ZXN0IGZpcnN0IHdyaXRlIGVycm9yIG9uIGEgc21hbGwgbGlzdCAqLworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworCisgICAgLyogdGVzdCBmaXJzdCB3cml0ZSBlcnJvciBvbiBhIGJpZyBsaXN0ICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CisKKyAgICAvKiB0ZXN0IDJuZCB3cml0ZSBlcnJvciBvbiBhIGJpZyBsaXN0ICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CisKKyAgICAvKiB0ZXN0IHNldCBvcGVyYXRpb24gcyovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3NldF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIC8qIGludmFsaWQgcHJvdG9jb2wgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIDAsIE5VTEwpID4gMCk7CisKKyAgICAvKiBpbnZhbGlkIHZlcnNpb24gKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgMHg4MnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgMCwgTlVMTCkgPiAwKTsKKworICAgIC8qIHNlbmQgYSB2YWxpZCBtZXNzYWdlICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIDB4ODJ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIDB4MDF1LCBOVUxMKSA+IDApOworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyICh0YywgMSwgTlVMTCk7CisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgInRlc3QiLCBOVUxMKTsKKworICAgIC8qIGJyb2tlbiAybmQgcmVhZCAqLworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIDB4ODJ1LCBOVUxMKTsKKworICAgIC8qIHNlbmQgYSBicm9rZW4gM3JkIHJlYWQgKi8KKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSAweDgydSwgTlVMTCk7CisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIDB4MDF1LCBOVUxMKTsKKworICAgIC8qIHNlbmQgYSBicm9rZW4gNHRoIHJlYWQgKi8KKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSAweDgydSwgTlVMTCk7CisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIDB4MDF1LCBOVUxMKTsKKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAodGMsIDEsIE5VTEwpOworCisgICAgLyogc2VuZCBhIHZhbGlkIG1lc3NhZ2UgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA+IDApOworCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICAvKiBzZW5kIGJyb2tlbiB3cml0ZXMgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworCisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKKworICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMjsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CisKKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDM7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOworCisgICAgLyogY2xlYW4gdXAgKi8KKyAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKyAgICBnX29iamVjdF91bnJlZiAocHJvdG9jb2wpOworICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgIGdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmVhZF9hbmRfd3JpdGVfbWFueV9mcmFtZXMgKHZvaWQpCit7CisgIGludCBzdGF0dXM7CisgIHBpZF90IHBpZDsKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKmZ0ID0gTlVMTDsKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YyA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIGdwb2ludGVyIGJpbmFyeSA9IChncG9pbnRlciAqKSBURVNUX1NUUklORzsKKyAgY29uc3QgZ3VpbnQzMiBsZW4gPSBzdHJsZW4gKFRFU1RfU1RSSU5HKTsKKyAgaW50IHBvcnQgPSBURVNUX1BPUlQ7CisKKyAgLyogZm9yayBhIHNlcnZlciBmcm9tIHRoZSBjbGllbnQgKi8KKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKKworICBpZiAocGlkID09IDApCisgIHsKKyAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgdGhyaWZ0X3NlcnZlcl9tYW55X2ZyYW1lcyAocG9ydCk7CisgICAgZXhpdCAoMCk7CisgIH0gZWxzZSB7CisgICAgLyogcGFyZW50LiAgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkLiAqLworICAgIHNsZWVwICgxKTsKKworICAgIC8qIGNyZWF0ZSBhIFRocmlmdFNvY2tldCAqLworICAgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodHNvY2tldCAhPSBOVUxMKTsKKyAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKKworICAgIC8qIHdyYXAgaW4gYSBmcmFtZWQgdHJhbnNwb3J0ICovCisgICAgZnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICJ3X2J1Zl9zaXplIiwgMSwgTlVMTCk7CisgICAgZ19hc3NlcnQgKGZ0ICE9IE5VTEwpOworICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKGZ0KTsKKworICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKworICAgIC8qIGNyZWF0ZSBhIGNvbXBhY3QgcHJvdG9jb2wgKi8KKyAgICB0YyA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCwgTlVMTCk7CisgICAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRjKTsKKyAgICBnX2Fzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CisKKyAgICAvKiB3cml0ZSBhIGJ1bmNoIG9mIHByaW1pdGl2ZXMgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9JMTYsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9JNjQsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9OSTE2LCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfTkkzMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX05JNjQsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAyLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIDIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgLTIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgLTIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgLTIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX0RPVUJMRSwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfU1RSSU5HLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsICIiLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisKKyAgICAvKiBjbGVhbiB1cCAqLworICAgIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOworICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKGZ0KTsKKyAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHRjKTsKKyAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKyAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOworICB9Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9zZXJ2ZXJfcHJpbWl0aXZlcyAoY29uc3QgaW50IHBvcnQpCit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnRjID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sID0gTlVMTDsKKyAgZ2Jvb2xlYW4gdmFsdWVfYm9vbGVhbiA9IEZBTFNFOworICBnaW50OCB2YWx1ZV9ieXRlID0gMCwKKyAgICB6aWd6YWdfcDE2ID0gMCwgemlnemFnX3AzMiA9IDAsIHppZ3phZ19wNjQgPSAwLAorICAgIHppZ3phZ19uMTYgPSAwLCB6aWd6YWdfbjMyID0gMCwgemlnemFnX242NCA9IDA7CisgIGdpbnQxNiB2YWx1ZV8xNiA9IDA7CisgIGdpbnQzMiB2YWx1ZV8zMiA9IDA7CisgIGdpbnQ2NCB2YWx1ZV82NCA9IDA7CisgIGdpbnQxNiB2YWx1ZV9uMTYgPSAwOworICBnaW50MzIgdmFsdWVfbjMyID0gMDsKKyAgZ2ludDY0IHZhbHVlX242NCA9IDA7CisgIGdkb3VibGUgdmFsdWVfZG91YmxlID0gMDsKKyAgZ2NoYXIgKnN0cmluZyA9IE5VTEw7CisgIGdjaGFyICplbXB0eV9zdHJpbmcgPSBOVUxMOworICBncG9pbnRlciBiaW5hcnkgPSBOVUxMOworICBndWludDMyIGxlbiA9IDA7CisgIHZvaWQgKmNvbXBhcmF0b3IgPSAodm9pZCAqKSBURVNUX1NUUklORzsKKworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKworICB0YyA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBOVUxMKTsKKyAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRjKTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWVfYnl0ZSwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgJnZhbHVlXzE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgJnZhbHVlX24xNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlX24zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlX242NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfcDE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19wMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX3A2NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfbjE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19uMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX242NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfZG91YmxlLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmc3RyaW5nLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmZW1wdHlfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID4gMCk7CisKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2J5dGUgPT0gVEVTVF9CWVRFKTsKKyAgZ19hc3NlcnQgKHZhbHVlXzE2ID09IFRFU1RfSTE2KTsKKyAgZ19hc3NlcnQgKHZhbHVlXzMyID09IFRFU1RfSTMyKTsKKyAgZ19hc3NlcnQgKHZhbHVlXzY0ID09IFRFU1RfSTY0KTsKKyAgZ19hc3NlcnQgKHZhbHVlX24xNiA9PSBURVNUX05JMTYpOworICBnX2Fzc2VydCAodmFsdWVfbjMyID09IFRFU1RfTkkzMik7CisgIGdfYXNzZXJ0ICh2YWx1ZV9uNjQgPT0gVEVTVF9OSTY0KTsKKyAgZ19hc3NlcnQgKHppZ3phZ19wMTYgPT0gNCk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfcDMyID09IDQpOworICBnX2Fzc2VydCAoemlnemFnX3A2NCA9PSA0KTsKKyAgZ19hc3NlcnQgKHppZ3phZ19uMTYgPT0gMyk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfbjMyID09IDMpOworICBnX2Fzc2VydCAoemlnemFnX242NCA9PSAzKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2RvdWJsZSA9PSBURVNUX0RPVUJMRSk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKFRFU1RfU1RSSU5HLCBzdHJpbmcpID09IDApOworICBnX2Fzc2VydCAoc3RyY21wICgiIiwgZW1wdHlfc3RyaW5nKSA9PSAwKTsKKyAgZ19hc3NlcnQgKG1lbWNtcCAoY29tcGFyYXRvciwgYmluYXJ5LCBsZW4pID09IDApOworCisgIGdfZnJlZSAoc3RyaW5nKTsKKyAgZ19mcmVlIChlbXB0eV9zdHJpbmcpOworICBnX2ZyZWUgKGJpbmFyeSk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKGJpbmFyeSA9PSBOVUxMKTsKKyAgZ19hc3NlcnQgKGxlbiA9PSAwKTsKKyAgZ19mcmVlIChiaW5hcnkpOworCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAwOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ieXRlLCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlXzE2LCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfNjQsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfbjE2LCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV9uMzIsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlX242NCwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9kb3VibGUsIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOworCisgIC8qIHRlc3QgcGFydGlhbCB3cml0ZSBmYWlsdXJlICovCisgIHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCk7CisKKyAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoY2xpZW50LCBOVUxMKTsKKyAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAodGMpOworICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9jb21wbGV4X3R5cGVzIChjb25zdCBpbnQgcG9ydCkKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqdGMgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBnY2hhciAqc3RydWN0X25hbWUgPSBOVUxMOworICBnY2hhciAqZmllbGRfbmFtZSA9IE5VTEw7CisgIGdjaGFyICptZXNzYWdlX25hbWUgPSBOVUxMOworICBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwga2V5X3R5cGUsIHZhbHVlX3R5cGUsIGZpZWxkX3R5cGU7CisgIFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZTsKKyAgZ2Jvb2xlYW4gdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOworICBnaW50OCB2YWx1ZSA9IDA7CisgIGdpbnQxNiBmaWVsZF9pZCA9IDA7CisgIGd1aW50MzIgc2l6ZSA9IDA7CisgIGdpbnQzMiBzZXFpZCA9IDA7CisgIGdpbnQ4IHZlcnNpb25fYW5kX3R5cGUgPSAwOworICBnaW50OCBwcm90b2NvbF9pZCA9IDA7CisKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisKKyAgdGMgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwgTlVMTCk7CisgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yyk7CisKKyAgLyogdGVzdCBzdHJ1Y3Qgb3BlcmF0aW9ucyAqLworCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgJnN0cnVjdF9uYW1lLCBOVUxMKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCk7CisKKyAgLyogdGVzdCBmaWVsZCBzdGF0ZSB3LnIudC4gZGVsdGFzICovCisKKyAgZmllbGRfaWQgPSAwOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxKTsKKyAgZmllbGRfaWQgPSAwOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxNik7CisgIGZpZWxkX2lkID0gMDsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTcpOworICBmaWVsZF9pZCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTUpOworICBmaWVsZF9pZCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDMwKTsKKyAgZmllbGRfaWQgPSAwOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPiAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDQ2KTsKKyAgZmllbGRfaWQgPSAwOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSA0Nyk7CisgIGZpZWxkX2lkID0gMDsKKworICAvKiB0ZXN0IGZpZWxkIG9wZXJhdGlvbnMgKi8KKworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisKKyAgLyogdGVzdCBmaWVsZCBzdGF0ZSB3LnIudC4gc3RydWN0cyAqLworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMSk7CisgIGZpZWxkX2lkID0gMDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTYpOworICBmaWVsZF9pZCA9IDA7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cnVjdF9uYW1lLCBOVUxMKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID4gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxNyk7CisgIGZpZWxkX2lkID0gMDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RydWN0X25hbWUsIE5VTEwpID09IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPiAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE4KTsKKyAgZmllbGRfaWQgPSAwOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxOSk7CisgIGZpZWxkX2lkID0gMDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE4KTsKKyAgZmllbGRfaWQgPSAwOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAyNSk7CisgIGZpZWxkX2lkID0gMDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE3KTsKKyAgZmllbGRfaWQgPSAwOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworCisgIC8qIHRlc3QgZmllbGQgc3RhdGUgdy5yLnQuIGJvb2xzICovCisKKyAgLyogZGVsdGFzICovCisgIC8qIG5vbi1ib29sIGZpZWxkIC0+IGJvb2wgZmllbGQgLT4gbm9uLWJvb2wgZmllbGQgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF90eXBlID09IFRfQk9PTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPT0gMCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIHZhbHVlX2Jvb2xlYW4gPSAhIFRFU1RfQk9PTDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICAvKiBib29sIC0+IGJvb2wgZmllbGQgLT4gYm9vbCAqLworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIHZhbHVlX2Jvb2xlYW4gPSAhIFRFU1RfQk9PTDsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfdHlwZSA9PSBUX0JPT0wpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID09IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOworCisgIC8qIG5vIGRlbHRhcyAqLworICAvKiBub24tYm9vbCBmaWVsZCAtPiBib29sIGZpZWxkIC0+IG5vbi1ib29sIGZpZWxkICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPiAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX3R5cGUgPT0gVF9CT09MKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPiAxKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgLyogYm9vbCAtPiBib29sIGZpZWxkIC0+IGJvb2wgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICBnX2Fzc2VydCAoZmllbGRfdHlwZSA9PSBUX0JPT0wpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID09IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOworCisgIC8qIHRlc3QgZmlyc3QgcmVhZCBlcnJvciBvbiBhIGZpZWxkICovCisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX25hbWUsICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKKworICAvKiB0ZXN0IDJuZCB3cml0ZSBmYWlsdXJlICovCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZSwgTlVMTCk7CisKKyAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgZmllbGQgKi8KKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9uYW1lLCAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIC8qIHRlc3QgZmllbGQgc3RvcCAqLworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCk7CisKKyAgLyogdGVzdCBtYXAgb3BlcmF0aW9ucyAqLworCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICAvKiB0ZXN0IDFzdCByZWFkIGZhaWx1cmUgb24gYSBtYXAgKi8KKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIG1hcCAqLworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgLyogdGVzdCAxc3Qgd3JpdGUgZmFpbHVyZSBvbiBtYXAtLS1ub3RoaW5nIHRvIGRvIG9uIG91ciBzaWRlICovCisKKyAgLyogdGVzdCAybmQgd3JpdGUgZmFpbHVyZSAqLworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWUsIE5VTEwpOworCisgIC8qIHRlc3QgbmVnYXRpdmUgbWFwIHNpemUgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CisKKyAgLyogdGVzdCBsaXN0IG9wZXJhdGlvbnMgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICAvKiB0ZXN0IHNtYWxsIGxpc3QgMXN0IHJlYWQgZmFpbHVyZSAqLworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CisKKyAgLyogdGVzdCBiaWcgbGlzdCAxc3QgcmVhZCBmYWlsdXJlICovCisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKKworICAvKiB0ZXN0IGJpZyBsaXN0IDJuZCByZWFkIGZhaWx1cmUgKi8KKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDE7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtZW50X3R5cGUsICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIC8qIHRlc3QgbmVnYXRpdmUgbGlzdCBzaXplIGZhaWx1cmUgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgLyogdGVzdCBzbWFsbCBsaXN0IDFzdCB3cml0ZSBmYWlsdXJlLS0tbm90aGluZyB0byBkbyBvbiBvdXIgZW5kICovCisKKyAgLyogdGVzdCBiaWcgbGlzdCAxc3Qgd3JpdGUgZmFpbHVyZS0tLW5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZCAqLworCisgIC8qIHRlc3QgYmlnIGxpc3QgMm5kIHdyaXRlIGZhaWx1cmUgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlLCBOVUxMKTsKKworICAvKiB0ZXN0IHNldCBvcGVyYXRpb25zICovCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwgJnNpemUsIE5VTEwpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3NldF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICAvKiBicm9rZW4gcmVhZCAqLworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOworCisgIC8qIGludmFsaWQgcHJvdG9jb2wgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworCisgIC8qIGludmFsaWQgdmVyc2lvbiAqLworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisKKyAgLyogcmVhZCBhIHZhbGlkIG1lc3NhZ2UgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgZ19mcmVlIChtZXNzYWdlX25hbWUpOworCisgIC8qIGJyb2tlbiAybmQgcmVhZCBvbiBhIG1lc3NhZ2UgKi8KKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICAvKiBicm9rZW4gM3JkIHJlYWQgb24gYSBtZXNzYWdlICovCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAyOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgLyogYnJva2VuIDR0aCByZWFkIG9uIGEgbWVzc2FnZSAqLworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMzsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIC8qIHJlYWQgYSB2YWxpZCBtZXNzYWdlICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgIGdfZnJlZSAobWVzc2FnZV9uYW1lKTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgIC8qIGhhbmRsZSAybmQgd3JpdGUgZmFpbHVyZSBvbiBhIG1lc3NhZ2UgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnByb3RvY29sX2lkLCBOVUxMKTsKKworICAvKiBoYW5kbGUgM3JkIHdyaXRlIGZhaWx1cmUgb24gYSBtZXNzYWdlICovCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZwcm90b2NvbF9pZCwgTlVMTCk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2ZXJzaW9uX2FuZF90eXBlLCBOVUxMKTsKKworICAvKiBoYW5kbGUgNHRoIHdyaXRlIGZhaWx1cmUgb24gYSBtZXNzYWdlICovCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZwcm90b2NvbF9pZCwgTlVMTCk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2ZXJzaW9uX2FuZF90eXBlLCBOVUxMKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAodGMsICZzZXFpZCwgTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zZXJ2ZXJfbWFueV9mcmFtZXMgKGNvbnN0IGludCBwb3J0KQoreworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0Y3AgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBnYm9vbGVhbiB2YWx1ZV9ib29sZWFuID0gRkFMU0U7CisgIGdpbnQ4IHZhbHVlX2J5dGUgPSAwLAorICAgIHppZ3phZ19wMTYgPSAwLCB6aWd6YWdfcDMyID0gMCwgemlnemFnX3A2NCA9IDAsCisgICAgemlnemFnX24xNiA9IDAsIHppZ3phZ19uMzIgPSAwLCB6aWd6YWdfbjY0ID0gMDsKKyAgZ2ludDE2IHZhbHVlXzE2ID0gMDsKKyAgZ2ludDMyIHZhbHVlXzMyID0gMDsKKyAgZ2ludDY0IHZhbHVlXzY0ID0gMDsKKyAgZ2ludDE2IHZhbHVlX24xNiA9IDA7CisgIGdpbnQzMiB2YWx1ZV9uMzIgPSAwOworICBnaW50NjQgdmFsdWVfbjY0ID0gMDsKKyAgZ2RvdWJsZSB2YWx1ZV9kb3VibGUgPSAwOworICBnY2hhciAqc3RyaW5nID0gTlVMTDsKKyAgZ2NoYXIgKmVtcHR5X3N0cmluZyA9IE5VTEw7CisgIGdwb2ludGVyIGJpbmFyeSA9IE5VTEw7CisgIGd1aW50MzIgbGVuID0gMDsKKyAgdm9pZCAqY29tcGFyYXRvciA9ICh2b2lkICopIFRFU1RfU1RSSU5HOworCisgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsICJwb3J0IiwgcG9ydCwgTlVMTCk7CisgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworCisgIC8qIHdyYXAgdGhlIGNsaWVudCBpbiBhIGZyYW1lZCB0cmFuc3BvcnQgKi8KKyAgY2xpZW50ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgInJfYnVmX3NpemUiLCAxLCBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKworICB0Y3AgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwgTlVMTCk7CisgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Y3ApOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZV9ieXRlLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCAmdmFsdWVfMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlXzY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCAmdmFsdWVfbjE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfbjMyLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfbjY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19wMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX3AzMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfcDY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19uMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX24zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfbjY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9kb3VibGUsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZzdHJpbmcsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZlbXB0eV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKKworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICBnX2Fzc2VydCAodmFsdWVfYnl0ZSA9PSBURVNUX0JZVEUpOworICBnX2Fzc2VydCAodmFsdWVfMTYgPT0gVEVTVF9JMTYpOworICBnX2Fzc2VydCAodmFsdWVfMzIgPT0gVEVTVF9JMzIpOworICBnX2Fzc2VydCAodmFsdWVfNjQgPT0gVEVTVF9JNjQpOworICBnX2Fzc2VydCAodmFsdWVfbjE2ID09IFRFU1RfTkkxNik7CisgIGdfYXNzZXJ0ICh2YWx1ZV9uMzIgPT0gVEVTVF9OSTMyKTsKKyAgZ19hc3NlcnQgKHZhbHVlX242NCA9PSBURVNUX05JNjQpOworICBnX2Fzc2VydCAoemlnemFnX3AxNiA9PSA0KTsKKyAgZ19hc3NlcnQgKHppZ3phZ19wMzIgPT0gNCk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfcDY0ID09IDQpOworICBnX2Fzc2VydCAoemlnemFnX24xNiA9PSAzKTsKKyAgZ19hc3NlcnQgKHppZ3phZ19uMzIgPT0gMyk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfbjY0ID09IDMpOworICBnX2Fzc2VydCAodmFsdWVfZG91YmxlID09IFRFU1RfRE9VQkxFKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoVEVTVF9TVFJJTkcsIHN0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKCIiLCBlbXB0eV9zdHJpbmcpID09IDApOworICBnX2Fzc2VydCAobWVtY21wIChjb21wYXJhdG9yLCBiaW5hcnksIGxlbikgPT0gMCk7CisKKyAgZ19mcmVlIChzdHJpbmcpOworICBnX2ZyZWUgKGVtcHR5X3N0cmluZyk7CisgIGdfZnJlZSAoYmluYXJ5KTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAoYmluYXJ5ID09IE5VTEwpOworICBnX2Fzc2VydCAobGVuID09IDApOworICBnX2ZyZWUgKGJpbmFyeSk7CisKKyAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoY2xpZW50LCBOVUxMKTsKKyAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAodGNwKTsKKyAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0ICgpOworI2VuZGlmCisKKyAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CisKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3Rjb21wYWN0cHJvdG9jb2wvQ3JlYXRlQW5kRGVzdHJveSIsCisgICAgICAgICAgICAgICAgICAgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGNvbXBhY3Rwcm90b2NvbC9Jbml0aWFsaXplIiwgdGVzdF9pbml0aWFsaXplKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3Rjb21wYWN0cHJvdG9jb2wvUmVhZEFuZFdyaXRlUHJpbWl0aXZlcyIsCisgICAgICAgICAgICAgICAgICAgdGVzdF9yZWFkX2FuZF93cml0ZV9wcmltaXRpdmVzKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3Rjb21wYWN0cHJvdG9jb2wvUmVhZEFuZFdyaXRlQ29tcGxleFR5cGVzIiwKKyAgICAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfYW5kX3dyaXRlX2NvbXBsZXhfdHlwZXMpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGNvbXBhY3Rwcm90b2NvbC9SZWFkQW5kV3JpdGVNYW55RnJhbWVzIiwKKyAgICAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfYW5kX3dyaXRlX21hbnlfZnJhbWVzKTsKKworICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0Y29udGFpbmVydGVzdC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb250YWluZXJ0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjNTFkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0Y29udGFpbmVydGVzdC5jCkBAIC0wLDAgKzEsNTI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfdGVzdF90eXBlcy5oIgorI2luY2x1ZGUgImdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlLmgiCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjZGVmaW5lIFRFU1RfU0VSVkVSX0hPU1ROQU1FICJsb2NhbGhvc3QiCisjZGVmaW5lIFRFU1RfU0VSVkVSX1BPUlQgICAgIDkwOTAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFRoZSBDb250YWluZXJTZXJ2aWNlIGhhbmRsZXIgd2UnbGwgdXNlIGZvciB0ZXN0aW5nICovCisKK0dfQkVHSU5fREVDTFMKKworR1R5cGUgdGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX2dldF90eXBlICh2b2lkKTsKKworI2RlZmluZSBUWVBFX1RFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUiBcCisgICh0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfZ2V0X3R5cGUgKCkpCisKKyNkZWZpbmUgVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1RFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXIpKQorI2RlZmluZSBURVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVJfQ0xBU1MoYykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlckNsYXNzKSkKKyNkZWZpbmUgSVNfVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1RFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUikpCisjZGVmaW5lIElTX1RFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUl9DTEFTUyhjKSAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9URVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIpKQorI2RlZmluZSBURVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVJfR0VUX0NMQVNTKG9iaikgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9URVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyQ2xhc3MpKQorCitzdHJ1Y3QgX1Rlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlciB7CisgIFRUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXIgcGFyZW50X2luc3RhbmNlOworCisgIC8qIHByaXZhdGUgKi8KKyAgR1B0ckFycmF5ICpzdHJpbmdfbGlzdDsKK307Cit0eXBlZGVmIHN0cnVjdCBfVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyIFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlcjsKKworc3RydWN0IF9UZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXJDbGFzcyB7CisgIFRUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXJDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX1Rlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlckNsYXNzCisgIFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlckNsYXNzOworCitHX0VORF9ERUNMUworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitHX0RFRklORV9UWVBFIChUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXIsCisgICAgICAgICAgICAgICB0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXIsCisgICAgICAgICAgICAgICBUX1RFU1RfVFlQRV9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSKQorCisvKiBBIGhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIGFwcGVuZCBjb3BpZXMgb2Ygc3RyaW5ncyB0byBhIHN0cmluZyBsaXN0ICovCitzdGF0aWMgdm9pZCBhcHBlbmRfc3RyaW5nX3RvX3B0cl9hcnJheSAoZ3BvaW50ZXIgZWxlbWVudCwgZ3BvaW50ZXIgcHRyX2FycmF5KQoreworICBnX3B0cl9hcnJheV9hZGQgKChHUHRyQXJyYXkgKilwdHJfYXJyYXksIGdfc3RyZHVwICgoZ2NoYXIgKillbGVtZW50KSk7Cit9CisKKy8qIEFjY2VwdCBhIHN0cmluZyBsaXN0IGZyb20gdGhlIGNsaWVudCBhbmQgYXBwZW5kIGl0cyBjb250ZW50cyB0byBvdXIgaW50ZXJuYWwKKyAgIGxpc3QgKi8KK3N0YXRpYyBnYm9vbGVhbgordGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX3JlY2VpdmVfc3RyaW5nX2xpc3QgKFRUZXN0Q29udGFpbmVyU2VydmljZUlmICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHUHRyQXJyYXkgKnN0cmluZ0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlciAqc2VsZiA9IFRFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUiAoaWZhY2UpOworCisgIC8qIEFwcGVuZCB0aGUgY2xpZW50J3Mgc3RyaW5ncyB0byBvdXIgb3duIGludGVybmFsIHN0cmluZyBsaXN0ICovCisgIGdfcHRyX2FycmF5X2ZvcmVhY2ggKChHUHRyQXJyYXkgKilzdHJpbmdMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRfc3RyaW5nX3RvX3B0cl9hcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyaW5nX2xpc3QpOworCisgIGdfY2xlYXJfZXJyb3IgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIFJldHVybiB0aGUgY29udGVudHMgb2Ygb3VyIGludGVybmFsIHN0cmluZyBsaXN0IHRvIHRoZSBjbGllbnQgKi8KK3N0YXRpYyBnYm9vbGVhbgordGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX3JldHVybl9zdHJpbmdfbGlzdCAoVFRlc3RDb250YWluZXJTZXJ2aWNlSWYgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1B0ckFycmF5ICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXIgKnNlbGYgPSBURVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIgKGlmYWNlKTsKKworICAvKiBSZXR1cm4gKGNvcGllcyBvZikgdGhlIHN0cmluZ3MgY29udGFpbmVkIGluIG91ciBsaXN0ICovCisgIGdfcHRyX2FycmF5X2ZvcmVhY2ggKHNlbGYtPnN0cmluZ19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRfc3RyaW5nX3RvX3B0cl9hcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgKl9yZXR1cm4pOworCisgIGdfY2xlYXJfZXJyb3IgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgordGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX3JldHVybl9saXN0X3N0cmluZ19saXN0IChUVGVzdENvbnRhaW5lclNlcnZpY2VJZiAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQdHJBcnJheSAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXIgKnNlbGYgPSBURVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIgKGlmYWNlKTsKKyAgR1B0ckFycmF5ICpuZXN0ZWRfbGlzdDsKKworICAvKiBSZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgb3VyIGxpc3Qgb2Ygc3RyaW5ncyAqLworICBuZXN0ZWRfbGlzdAorICAgID0gZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jICgoR0Rlc3Ryb3lOb3RpZnkpZ19wdHJfYXJyYXlfdW5yZWYpOworICBnX3B0cl9hcnJheV9hZGQgKG5lc3RlZF9saXN0LCBzZWxmLT5zdHJpbmdfbGlzdCk7CisgIGdfcHRyX2FycmF5X3JlZiAoc2VsZi0+c3RyaW5nX2xpc3QpOworCisgIGdfcHRyX2FycmF5X2FkZCAoKl9yZXR1cm4sIG5lc3RlZF9saXN0KTsKKworICBnX2NsZWFyX2Vycm9yIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9yZXR1cm5fdHlwZWRlZmRfbGlzdF9zdHJpbmdfbGlzdCAoVFRlc3RDb250YWluZXJTZXJ2aWNlSWYgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdExpc3RTdHJpbmdMaXN0ICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlciAqc2VsZiA9IFRFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUiAoaWZhY2UpOworICBUVGVzdFN0cmluZ0xpc3QgKm5lc3RlZF9saXN0OworCisgIC8qIFJldHVybiBhIGxpc3QgY29udGFpbmluZyBvdXIgbGlzdCBvZiBzdHJpbmdzICovCisgIG5lc3RlZF9saXN0CisgICAgPSBnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKChHRGVzdHJveU5vdGlmeSlnX3B0cl9hcnJheV91bnJlZik7CisgIGdfcHRyX2FycmF5X2FkZCAobmVzdGVkX2xpc3QsIHNlbGYtPnN0cmluZ19saXN0KTsKKyAgZ19wdHJfYXJyYXlfcmVmIChzZWxmLT5zdHJpbmdfbGlzdCk7CisKKyAgZ19wdHJfYXJyYXlfYWRkICgqX3JldHVybiwgbmVzdGVkX2xpc3QpOworCisgIGdfY2xlYXJfZXJyb3IgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkgeworICBUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXIgKnNlbGYgPSBURVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIgKG9iamVjdCk7CisKKyAgLyogRGVzdHJveSBvdXIgaW50ZXJuYWwgY29udGFpbmVycyAqLworICBnX3B0cl9hcnJheV91bnJlZiAoc2VsZi0+c3RyaW5nX2xpc3QpOworICBzZWxmLT5zdHJpbmdfbGlzdCA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHRlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9wYXJlbnRfY2xhc3MpLT4KKyAgICBmaW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9pbml0IChUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXIgKnNlbGYpCit7CisgIC8qIENyZWF0ZSBvdXIgaW50ZXJuYWwgY29udGFpbmVycyAqLworICBzZWxmLT5zdHJpbmdfbGlzdCA9IGdfcHRyX2FycmF5X25ld193aXRoX2ZyZWVfZnVuYyAoZ19mcmVlKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9jbGFzc19pbml0IChUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXJDbGFzcyAqa2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIFRUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXJDbGFzcyAqcGFyZW50X2NsYXNzID0KKyAgICBUX1RFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUl9DTEFTUyAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX2ZpbmFsaXplOworCisgIHBhcmVudF9jbGFzcy0+cmVjZWl2ZV9zdHJpbmdfbGlzdCA9CisgICAgdGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX3JlY2VpdmVfc3RyaW5nX2xpc3Q7CisgIHBhcmVudF9jbGFzcy0+cmV0dXJuX3N0cmluZ19saXN0ID0KKyAgICB0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfcmV0dXJuX3N0cmluZ19saXN0OworICBwYXJlbnRfY2xhc3MtPnJldHVybl9saXN0X3N0cmluZ19saXN0ID0KKyAgICB0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfcmV0dXJuX2xpc3Rfc3RyaW5nX2xpc3Q7CisgIHBhcmVudF9jbGFzcy0+cmV0dXJuX3R5cGVkZWZkX2xpc3Rfc3RyaW5nX2xpc3QgPQorICAgIHRlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9yZXR1cm5fdHlwZWRlZmRfbGlzdF9zdHJpbmdfbGlzdDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogT3VyIHRlc3Qgc2VydmVyLCBkZWNsYXJlZCBnbG9iYWxseSBzbyB3ZSBjYW4gYWNjZXNzIGl0IHdpdGhpbiBhIHNpZ25hbAorICAgaGFuZGxlciAqLworVGhyaWZ0U2VydmVyICpzZXJ2ZXIgPSBOVUxMOworCisvKiBBIHNpZ25hbCBoYW5kbGVyIHVzZWQgdG8gZGV0ZWN0IHdoZW4gdGhlIGNoaWxkIHByb2Nlc3MgKHRoZSB0ZXN0IHN1aXRlKSBoYXMKKyAgIGV4aXRlZCBzbyB3ZSBrbm93IHRvIHNodXQgZG93biB0aGUgc2VydmVyIGFuZCB0ZXJtaW5hdGUgb3Vyc2VsdmVzICovCitzdGF0aWMgdm9pZAorc2lnY2hsZF9oYW5kbGVyIChpbnQgc2lnbmFsX251bWJlcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHNpZ25hbF9udW1iZXIpOworCisgIC8qIFRoZSBjaGlsZCBwcm9jZXNzICh0aGUgdGVzdHMpIGhhcyBleGl0ZWQgb3IgYmVlbiB0ZXJtaW5hdGVkOyBzaHV0IGRvd24gdGhlCisgICAgIHNlcnZlciBncmFjZWZ1bGx5ICovCisgIGlmIChzZXJ2ZXIgIT0gTlVMTCkKKyAgICB0aHJpZnRfc2VydmVyX3N0b3AgKHNlcnZlcik7Cit9CisKKy8qIEEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXMgYSB0ZXN0IGNhc2UgYWdhaW5zdCBhIG5ld2x5IGNvbnN0cnVjdGVkCisgICBzZXJ2aWNlIGNsaWVudCAqLworc3RhdGljIHZvaWQKK2V4ZWN1dGVfd2l0aF9zZXJ2aWNlX2NsaWVudCAodm9pZCAoKnRlc3RfY2FzZSkoVFRlc3RDb250YWluZXJTZXJ2aWNlSWYgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqKSkKK3sKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQ7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0OworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2w7CisKKyAgVFRlc3RDb250YWluZXJTZXJ2aWNlSWYgKmNsaWVudDsKKworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKworICAvKiBDcmVhdGUgYSBjbGllbnQgd2l0aCB3aGljaCB0byBhY2Nlc3MgdGhlIHNlcnZlciAqLworICBzb2NrZXQgICAgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUiLCBURVNUX1NFUlZFUl9IT1NUTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsICAgICBURVNUX1NFUlZFUl9QT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICB0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0Iiwgc29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBwcm90b2NvbCAgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpOworICBnX2Fzc2VydF9ub19lcnJvciAoZXJyb3IpOworCisgIGNsaWVudCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfQ09OVEFJTkVSX1NFUlZJQ0VfQ0xJRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dF9wcm90b2NvbCIsICBwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0X3Byb3RvY29sIiwgcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgLyogRXhlY3V0ZSB0aGUgdGVzdCBhZ2FpbnN0IHRoaXMgY2xpZW50ICovCisgICgqdGVzdF9jYXNlKShjbGllbnQsICZlcnJvcik7CisgIGdfYXNzZXJ0X25vX2Vycm9yIChlcnJvcik7CisKKyAgLyogQ2xlYW4gdXAgYW5kIGV4aXQgKi8KKyAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisgIGdfb2JqZWN0X3VucmVmIChzb2NrZXQpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb250YWluZXJzX3dpdGhfZGVmYXVsdF92YWx1ZXMgKHZvaWQpCit7CisgIFRUZXN0Q29udGFpbmVyc1dpdGhEZWZhdWx0VmFsdWVzICpkZWZhdWx0X3ZhbHVlczsKKyAgR1B0ckFycmF5ICpzdHJpbmdfbGlzdDsKKworICAvKiBGZXRjaCBhIG5ldyBDb250YWluZXJzV2l0aERlZmF1bHRWYWx1ZXMgc3RydWN0IGFuZCBpdHMgU3RyaW5nTGlzdCBtZW1iZXIgKi8KKyAgZGVmYXVsdF92YWx1ZXMgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0NPTlRBSU5FUlNfV0lUSF9ERUZBVUxUX1ZBTFVFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBnX29iamVjdF9nZXQgKGRlZmF1bHRfdmFsdWVzLAorICAgICAgICAgICAgICAgICJTdHJpbmdMaXN0IiwgJnN0cmluZ19saXN0LAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIC8qIE1ha2Ugc3VyZSB0aGUgbGlzdCBoYXMgYmVlbiBwb3B1bGF0ZWQgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZXMgKi8KKyAgZ19hc3NlcnRfY21waW50IChzdHJpbmdfbGlzdC0+bGVuLCA9PSwgMik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoKChnY2hhciAqKilzdHJpbmdfbGlzdC0+cGRhdGEpWzBdLCA9PSwgIkFwYWNoZSIpOworICBnX2Fzc2VydF9jbXBzdHIgKCgoZ2NoYXIgKiopc3RyaW5nX2xpc3QtPnBkYXRhKVsxXSwgPT0sICJUaHJpZnQiKTsKKworICBnX3B0cl9hcnJheV91bnJlZiAoc3RyaW5nX2xpc3QpOworICBnX29iamVjdF91bnJlZiAoZGVmYXVsdF92YWx1ZXMpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb250YWluZXJfc2VydmljZV9zdHJpbmdfbGlzdF9pbm5lciAoVFRlc3RDb250YWluZXJTZXJ2aWNlSWYgKmNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnY2hhciAqdGVzdF9kYXRhW10gPSB7ICJvbmUiLCAidHdvIiwgInRocmVlIiB9OworCisgIEdQdHJBcnJheSAqb3V0Z29pbmdfc3RyaW5nX2xpc3Q7CisgIEdQdHJBcnJheSAqaW5jb21pbmdfc3RyaW5nX2xpc3Q7CisgIGd1aW50IGluZGV4OworCisgIGdfY2xlYXJfZXJyb3IgKGVycm9yKTsKKworICAvKiBQcmVwYXJlIG91ciB0ZXN0IGRhdGEgKG91ciBzdHJpbmcgbGlzdCB0byBzZW5kKSAqLworICBvdXRnb2luZ19zdHJpbmdfbGlzdCA9IGdfcHRyX2FycmF5X25ldyAoKTsKKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgMzsgaW5kZXggKz0gMSkKKyAgICBnX3B0cl9hcnJheV9hZGQgKG91dGdvaW5nX3N0cmluZ19saXN0LCAmdGVzdF9kYXRhW2luZGV4XSk7CisKKyAgLyogU2VuZCBvdXIgZGF0YSB0byB0aGUgc2VydmVyIGFuZCBtYWtlIHN1cmUgd2UgZ2V0IHRoZSBzYW1lIGRhdGEgYmFjayBvbgorICAgICByZXRyaWV2ZSAqLworICBnX2Fzc2VydAorICAgICh0X3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfY2xpZW50X3JlY2VpdmVfc3RyaW5nX2xpc3QgKGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRnb2luZ19zdHJpbmdfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikgJiYKKyAgICAgKmVycm9yID09IE5VTEwpOworCisgIGluY29taW5nX3N0cmluZ19saXN0ID0gZ19wdHJfYXJyYXlfbmV3ICgpOworICBnX2Fzc2VydAorICAgICh0X3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfY2xpZW50X3JldHVybl9zdHJpbmdfbGlzdCAoY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluY29taW5nX3N0cmluZ19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpICYmCisgICAgICplcnJvciA9PSBOVUxMKTsKKworICAvKiBNYWtlIHN1cmUgdGhlIHR3byBsaXN0cyBhcmUgZXF1aXZhbGVudCAqLworICBnX2Fzc2VydF9jbXBpbnQgKGluY29taW5nX3N0cmluZ19saXN0LT5sZW4sID09LCBvdXRnb2luZ19zdHJpbmdfbGlzdC0+bGVuKTsKKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgaW5jb21pbmdfc3RyaW5nX2xpc3QtPmxlbjsgaW5kZXggKz0gMSkKKyAgICBnX2Fzc2VydF9jbXBzdHIgKCgoZ2NoYXIgKiopaW5jb21pbmdfc3RyaW5nX2xpc3QtPnBkYXRhKVtpbmRleF0sCisgICAgICAgICAgICAgICAgICAgICA9PSwKKyAgICAgICAgICAgICAgICAgICAgICgoZ2NoYXIgKiopb3V0Z29pbmdfc3RyaW5nX2xpc3QtPnBkYXRhKVtpbmRleF0pOworCisgIC8qIENsZWFuIHVwIGFuZCBleGl0ICovCisgIGdfcHRyX2FycmF5X3VucmVmIChpbmNvbWluZ19zdHJpbmdfbGlzdCk7CisgIGdfcHRyX2FycmF5X3VucmVmIChvdXRnb2luZ19zdHJpbmdfbGlzdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX3N0cmluZ19saXN0ICh2b2lkKQoreworICAgIGV4ZWN1dGVfd2l0aF9zZXJ2aWNlX2NsaWVudCAodGVzdF9jb250YWluZXJfc2VydmljZV9zdHJpbmdfbGlzdF9pbm5lcik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2xpc3Rfc3RyaW5nX2xpc3RfaW5uZXIgKFRUZXN0Q29udGFpbmVyU2VydmljZUlmICpjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBHUHRyQXJyYXkgKmluY29taW5nX2xpc3Q7CisgIEdQdHJBcnJheSAqbmVzdGVkX2xpc3Q7CisKKyAgZ19jbGVhcl9lcnJvciAoZXJyb3IpOworCisgIC8qIFJlY2VpdmUgYSBsaXN0IG9mIHN0cmluZyBsaXN0cyBmcm9tIHRoZSBzZXJ2ZXIgKi8KKyAgaW5jb21pbmdfbGlzdCA9CisgICAgZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jICgoR0Rlc3Ryb3lOb3RpZnkpZ19wdHJfYXJyYXlfdW5yZWYpOworICBnX2Fzc2VydAorICAgICh0X3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfY2xpZW50X3JldHVybl9saXN0X3N0cmluZ19saXN0IChjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmNvbWluZ19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikgJiYKKyAgICAgKmVycm9yID09IE5VTEwpOworCisgIC8qIE1ha2Ugc3VyZSB0aGUgbGlzdCBhbmQgaXRzIGNvbnRlbnRzIGFyZSB2YWxpZCAqLworICBnX2Fzc2VydF9jbXBpbnQgKGluY29taW5nX2xpc3QtPmxlbiwgPiwgMCk7CisKKyAgbmVzdGVkX2xpc3QgPSAoR1B0ckFycmF5ICopZ19wdHJfYXJyYXlfaW5kZXggKGluY29taW5nX2xpc3QsIDApOworICBnX2Fzc2VydCAobmVzdGVkX2xpc3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAobmVzdGVkX2xpc3QtPmxlbiwgPj0sIDApOworCisgIC8qIENsZWFuIHVwIGFuZCBleGl0ICovCisgIGdfcHRyX2FycmF5X3VucmVmIChpbmNvbWluZ19saXN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfbGlzdF9zdHJpbmdfbGlzdCAodm9pZCkKK3sKKyAgZXhlY3V0ZV93aXRoX3NlcnZpY2VfY2xpZW50ICh0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2xpc3Rfc3RyaW5nX2xpc3RfaW5uZXIpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb250YWluZXJfc2VydmljZV90eXBlZGVmZF9saXN0X3N0cmluZ19saXN0X2lubmVyIChUVGVzdENvbnRhaW5lclNlcnZpY2VJZiAqY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVFRlc3RMaXN0U3RyaW5nTGlzdCAqaW5jb21pbmdfbGlzdDsKKyAgVFRlc3RTdHJpbmdMaXN0ICpuZXN0ZWRfbGlzdDsKKworICBnX2NsZWFyX2Vycm9yIChlcnJvcik7CisKKyAgLyogUmVjZWl2ZSBhIGxpc3Qgb2Ygc3RyaW5nIGxpc3RzIGZyb20gdGhlIHNlcnZlciAqLworICBpbmNvbWluZ19saXN0ID0KKyAgICBnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKChHRGVzdHJveU5vdGlmeSlnX3B0cl9hcnJheV91bnJlZik7CisgIGdfYXNzZXJ0CisgICAgKHRfdGVzdF9jb250YWluZXJfc2VydmljZV9jbGllbnRfcmV0dXJuX2xpc3Rfc3RyaW5nX2xpc3QgKGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluY29taW5nX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSAmJgorICAgICAqZXJyb3IgPT0gTlVMTCk7CisKKyAgLyogTWFrZSBzdXJlIHRoZSBsaXN0IGFuZCBpdHMgY29udGVudHMgYXJlIHZhbGlkICovCisgIGdfYXNzZXJ0X2NtcGludCAoaW5jb21pbmdfbGlzdC0+bGVuLCA+LCAwKTsKKworICBuZXN0ZWRfbGlzdCA9IChUVGVzdFN0cmluZ0xpc3QgKilnX3B0cl9hcnJheV9pbmRleCAoaW5jb21pbmdfbGlzdCwgMCk7CisgIGdfYXNzZXJ0IChuZXN0ZWRfbGlzdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnRfY21waW50IChuZXN0ZWRfbGlzdC0+bGVuLCA+PSwgMCk7CisKKyAgLyogQ2xlYW4gdXAgYW5kIGV4aXQgKi8KKyAgZ19wdHJfYXJyYXlfdW5yZWYgKGluY29taW5nX2xpc3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb250YWluZXJfc2VydmljZV90eXBlZGVmZF9saXN0X3N0cmluZ19saXN0ICh2b2lkKQoreworICBleGVjdXRlX3dpdGhfc2VydmljZV9jbGllbnQKKyAgICAodGVzdF9jb250YWluZXJfc2VydmljZV90eXBlZGVmZF9saXN0X3N0cmluZ19saXN0X2lubmVyKTsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIHBpZF90IHBpZDsKKyAgaW50IHN0YXR1czsKKworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0ICgpOworI2VuZGlmCisKKyAgLyogRm9yayB0byBydW4gb3VyIHRlc3Qgc3VpdGUgaW4gYSBjaGlsZCBwcm9jZXNzICovCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0X2NtcGludCAocGlkLCA+PSwgMCk7CisKKyAgaWYgKHBpZCA9PSAwKSB7ICAgIC8qIFRoZSBjaGlsZCBwcm9jZXNzICovCisgICAgLyogV2FpdCBhIG1vbWVudCBmb3IgdGhlIHNlcnZlciB0byBmaW5pc2ggc3RhcnRpbmcgKi8KKyAgICBzbGVlcCAoMSk7CisKKyAgICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICAgIGdfdGVzdF9hZGRfZnVuYworICAgICAgKCIvdGVzdGNvbnRhaW5lcnRlc3QvQ29udGFpbmVyVGVzdC9TdHJ1Y3RzL0NvbnRhaW5lcnNXaXRoRGVmYXVsdFZhbHVlcyIsCisgICAgICAgdGVzdF9jb250YWluZXJzX3dpdGhfZGVmYXVsdF92YWx1ZXMpOworICAgIGdfdGVzdF9hZGRfZnVuYworICAgICAgKCIvdGVzdGNvbnRhaW5lcnRlc3QvQ29udGFpbmVyVGVzdC9TZXJ2aWNlcy9Db250YWluZXJTZXJ2aWNlL1N0cmluZ0xpc3QiLAorICAgICAgIHRlc3RfY29udGFpbmVyX3NlcnZpY2Vfc3RyaW5nX2xpc3QpOworICAgIGdfdGVzdF9hZGRfZnVuYworICAgICAgKCIvdGVzdGNvbnRhaW5lcnRlc3QvQ29udGFpbmVyVGVzdC9TZXJ2aWNlcy9Db250YWluZXJTZXJ2aWNlL0xpc3RTdHJpbmdMaXN0IiwKKyAgICAgICB0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2xpc3Rfc3RyaW5nX2xpc3QpOworICAgIGdfdGVzdF9hZGRfZnVuYworICAgICAgKCIvdGVzdGNvbnRhaW5lcnRlc3QvQ29udGFpbmVyVGVzdC9TZXJ2aWNlcy9Db250YWluZXJTZXJ2aWNlL1R5cGVkZWZkTGlzdFN0cmluZ0xpc3QiLAorICAgICAgIHRlc3RfY29udGFpbmVyX3NlcnZpY2VfdHlwZWRlZmRfbGlzdF9zdHJpbmdfbGlzdCk7CisKKyAgICAvKiBSdW4gdGhlIHRlc3RzIGFuZCBtYWtlIHRoZSByZXN1bHQgYXZhaWxhYmxlIHRvIG91ciBwYXJlbnQgcHJvY2VzcyAqLworICAgIF9leGl0IChnX3Rlc3RfcnVuICgpKTsKKyAgfQorICBlbHNlIHsKKyAgICBUVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyICpoYW5kbGVyOworICAgIFRUZXN0Q29udGFpbmVyU2VydmljZVByb2Nlc3NvciAqcHJvY2Vzc29yOworCisgICAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICpzZXJ2ZXJfdHJhbnNwb3J0OworICAgIFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKnRyYW5zcG9ydF9mYWN0b3J5OworICAgIFRocmlmdFByb3RvY29sRmFjdG9yeSAqcHJvdG9jb2xfZmFjdG9yeTsKKworICAgIHN0cnVjdCBzaWdhY3Rpb24gc2lnY2hsZF9hY3Rpb247CisKKyAgICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKyAgICBpbnQgZXhpdF9zdGF0dXMgPSAxOworCisgICAgLyogVHJhcCB0aGUgZXZlbnQgb2YgdGhlIGNoaWxkIHByb2Nlc3MgdGVybWluYXRpbmcgc28gd2Uga25vdyB0byBzdG9wIHRoZQorICAgICAgIHNlcnZlciBhbmQgZXhpdCAqLworICAgIG1lbXNldCAoJnNpZ2NobGRfYWN0aW9uLCAwLCBzaXplb2YgKHNpZ2NobGRfYWN0aW9uKSk7CisgICAgc2lnY2hsZF9hY3Rpb24uc2FfaGFuZGxlciA9IHNpZ2NobGRfaGFuZGxlcjsKKyAgICBzaWdjaGxkX2FjdGlvbi5zYV9mbGFncyA9IFNBX1JFU0VUSEFORDsKKyAgICBzaWdhY3Rpb24gKFNJR0NITEQsICZzaWdjaGxkX2FjdGlvbiwgTlVMTCk7CisKKyAgICAvKiBDcmVhdGUgb3VyIHRlc3Qgc2VydmVyICovCisgICAgaGFuZGxlciA9IGdfb2JqZWN0X25ldyAoVFlQRV9URVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgcHJvY2Vzc29yID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9DT05UQUlORVJfU0VSVklDRV9QUk9DRVNTT1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFuZGxlciIsIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBzZXJ2ZXJfdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgVEVTVF9TRVJWRVJfUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB0cmFuc3BvcnRfZmFjdG9yeSA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIHByb3RvY29sX2ZhY3RvcnkgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgc2VydmVyID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NvciIsICAgICAgICAgICAgICAgIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXJfdHJhbnNwb3J0IiwgICAgICAgICBzZXJ2ZXJfdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0X3RyYW5zcG9ydF9mYWN0b3J5IiwgIHRyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSIsIHRyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0X3Byb3RvY29sX2ZhY3RvcnkiLCAgIHByb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkiLCAgcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgLyogU3RhcnQgdGhlIHNlcnZlciAqLworICAgIHRocmlmdF9zZXJ2ZXJfc2VydmUgKHNlcnZlciwgJmVycm9yKTsKKworICAgIC8qIE1ha2Ugc3VyZSB0aGUgc2VydmVyIHN0b3BwZWQgb25seSBiZWNhdXNlIGl0IHdhcyBpbnRlcnJ1cHRlZCAoYnkgdGhlCisgICAgICAgY2hpbGQgcHJvY2VzcyB0ZXJtaW5hdGluZykgKi8KKyAgICBnX2Fzc2VydCghZXJyb3IgfHwgZ19lcnJvcl9tYXRjaGVzKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9BQ0NFUFQpKTsKKworICAgIC8qIEZyZWUgb3VyIHJlc291cmNlcyAqLworICAgIGdfY2xlYXJfb2JqZWN0ICgmc2VydmVyKTsKKyAgICBnX2NsZWFyX29iamVjdCAoJnByb3RvY29sX2ZhY3RvcnkpOworICAgIGdfY2xlYXJfb2JqZWN0ICgmdHJhbnNwb3J0X2ZhY3RvcnkpOworICAgIGdfY2xlYXJfb2JqZWN0ICgmc2VydmVyX3RyYW5zcG9ydCk7CisgICAgZ19jbGVhcl9vYmplY3QgKCZwcm9jZXNzb3IpOworICAgIGdfY2xlYXJfb2JqZWN0ICgmaGFuZGxlcik7CisKKyAgICAvKiBXYWl0IGZvciB0aGUgY2hpbGQgcHJvY2VzcyB0byBjb21wbGV0ZSBhbmQgcmV0dXJuIGl0cyBleGl0IHN0YXR1cyAqLworICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgIGlmIChXSUZFWElURUQgKHN0YXR1cykpCisgICAgICBleGl0X3N0YXR1cyA9IFdFWElUU1RBVFVTIChzdGF0dXMpOworCisgICAgcmV0dXJuIGV4aXRfc3RhdHVzOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdGRlYnVncHJvdG8uYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZGVidWdwcm90by5jCmluZGV4IGYwNjU0ZjEuLjEwOWE0OGIgMTAwNjQ0Ci0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZGVidWdwcm90by5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZGVidWdwcm90by5jCkBAIC0xOCw3NSArMTgsOTI0IEBACiAgKi8KIAogI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgogCiAjaWZuZGVmIE1fUEkKICNkZWZpbmUgTV9QSSAzLjE0MTU5MjY1MzU4OTc5MzIzODUKICNlbmRpZgogCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaD4KKwogI2luY2x1ZGUgImdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuaCIKKyNpbmNsdWRlICJnZW4tY19nbGliL3RfdGVzdF9zcnYuaCIKKyNpbmNsdWRlICJnZW4tY19nbGliL3RfdGVzdF9pbmhlcml0ZWQuaCIKIAogc3RhdGljIHZvaWQKLXRlc3RfZGVidWdfcHJvdG8odm9pZCkKK3Rlc3Rfc3RydWN0c19kb3VibGVzX2NyZWF0ZV9hbmRfZGVzdHJveSAodm9pZCkKIHsKLSAgVFRlc3RPbmVPZkVhY2ggKm9vZSA9IE5VTEw7Ci0gIFRUZXN0TmVzdGluZyAqbiA9IE5VTEw7Ci0gIFRUZXN0SG9seU1vbGV5ICpobSA9IE5VTEw7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CiAKLSAgb29lID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTkVfT0ZfRUFDSCwgTlVMTCk7Ci0gIG9vZS0+aW1fdHJ1ZSA9IFRSVUU7Ci0gIG9vZS0+aW1fZmFsc2UgPSBGQUxTRTsKLSAgb29lLT5hX2JpdGUgPSAweGQ2OwotICBvb2UtPmludGVnZXIxNiA9IDI3MDAwOwotICBvb2UtPmludGVnZXIzMiA9IDE8PDI0OwotICBvb2UtPmludGVnZXI2NCA9IChndWludDY0KSA2MDAwICogMTAwMCAqIDEwMDA7Ci0gIG9vZS0+ZG91YmxlX3ByZWNpc2lvbiA9IE1fUEk7Ci0gIG9vZS0+c29tZV9jaGFyYWN0ZXJzID0gIkRlYnVnIFRISVMhIjsKLSAgb29lLT56b21nX3VuaWNvZGUgPSAiXHhkN1xuXGFcdCI7CisgIC8qIEEgRG91YmxlcyBzdHJ1Y3R1cmUgY2FuIGJlIGNyZWF0ZWQuLi4gKi8KKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9ET1VCTEVTLCBOVUxMKTsKIAotICBuID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9ORVNUSU5HLCBOVUxMKTsKLSAgbi0+bXlfb29lID0gb29lOwotICBuLT5teV9vb2UtPmludGVnZXIxNiA9IDE2OwotICBuLT5teV9vb2UtPmludGVnZXIzMiA9IDMyOwotICBuLT5teV9vb2UtPmludGVnZXI2NCA9IDY0OwotICBuLT5teV9vb2UtPmRvdWJsZV9wcmVjaXNpb24gPSAoc3FydCg1LjApICsgMSkgLyAyOwotICBuLT5teV9vb2UtPnNvbWVfY2hhcmFjdGVycyA9ICI6UiAobWUgZ29pbmcgXCJycnJyXCIpIjsKLSAgbi0+bXlfb29lLT56b21nX3VuaWNvZGUgPSAiXHhkM1x4ODBceGUyXHg4NVx4YWVceGNlXHg5ZFx4MjAiOwotICBuLT5teV9ib25rLT50eXBlID0gMzEzMzc7Ci0gIG4tPm15X2JvbmstPm1lc3NhZ2UgPSAiSSBhbSBhIGJvbmsuLi4geG9yISI7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChUX1RFU1RfSVNfRE9VQkxFUyAob2JqZWN0KSk7CiAKLSAgaG0gPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0hPTFlfTU9MRVksIE5VTEwpOwotICBnX3B0cl9hcnJheV9hZGQgKGhtLT5iaWcsIG9vZSk7Ci0gIGdfcHRyX2FycmF5X2FkZCAoaG0tPmJpZywgbi0+bXlfb29lKTsKLSAgKChUVGVzdE9uZU9mRWFjaCAqKSBnX3B0cl9hcnJheV9pbmRleCAoaG0tPmJpZywgMCkpLT5hX2JpdGUgPSAweDIyOwotICAoKFRUZXN0T25lT2ZFYWNoICopIGdfcHRyX2FycmF5X2luZGV4IChobS0+YmlnLCAxKSktPmFfYml0ZSA9IDB4MzM7CisgIC8qIC4uLmFuZCBkZXN0cm95ZWQgKi8KKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CiAKLSAgZ19oYXNoX3RhYmxlX2luc2VydCAoaG0tPmNvbnRhaW4sICJyYW5kb20gc3RyaW5nIiwgInJhbmRvbSBzdHJpbmciKTsKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfZG91Ymxlc19pbml0aWFsaXplICh2b2lkKQoreworICBUVGVzdERvdWJsZXMgKmRvdWJsZXMgPSBOVUxMOworICBnZG91YmxlIG5hbjsKKyAgZ2RvdWJsZSBpbmY7CisgIGdkb3VibGUgbmVnaW5mOworICBnZG91YmxlIHJlcGVhdGluZzsKKyAgZ2RvdWJsZSBiaWc7CisgIGdkb3VibGUgdGlueTsKKyAgZ2RvdWJsZSB6ZXJvOworICBnZG91YmxlIG5lZ3plcm87CiAKKyAgLyogTm90ZSB0aGVyZSBzZWVtcyB0byBiZSBubyB3YXkgdG8gZ2V0IG5vdC1hLW51bWJlciAoIk5BTiIpIHZhbHVlcyBwYXN0CisgICAgIEdPYmplY3QncyByYW5nZS1jaGVja2luZywgc28gdGhhdCBwb3J0aW9uIG9mIHRoZSB0ZXN0IGhhcyBiZWVuIGNvbW1lbnRlZAorICAgICBvdXQgYmVsb3cuICovCisKKyAgLyogQSBEb3VibGVzIHN0cnVjdHVyZSdzIG1lbWJlcnMgYXJlIGF2YWlsYWJsZSBhcyBHT2JqZWN0IHByb3BlcnRpZXMKKyAgICAgdGhhdCBjYW4gYmUgaW5pdGlhbGl6ZWQgYXQgY29uc3RydWN0aW9uLi4uICovCisgIGRvdWJsZXMgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0RPVUJMRVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJuYW4iLCAgICAgIDAgKiBJTkZJTklUWSwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgImluZiIsICAgICAgICAgIElORklOSVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAibmVnaW5mIiwgICAgICAtSU5GSU5JVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRpbmciLCAgICAgMS4wIC8gMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImJpZyIsICAgICAgIEdfTUFYRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidGlueSIsICAgICAgICAgIDEwRS0xMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ6ZXJvIiwgICAgICAgICAgMS4wICogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZ3plcm8iLCAgICAgIC0xLjAgKiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICBnX2Fzc2VydCAoZG91YmxlcyAhPSBOVUxMKTsKKworICAvKiAuLi5hbmQgbGF0ZXIgcmV0cmlldmVkICovCisgIGdfb2JqZWN0X2dldCAoZG91YmxlcywKKyAgICAgICAgICAgICAgICAibmFuIiwgICAgICAgJm5hbiwKKyAgICAgICAgICAgICAgICAiaW5mIiwgICAgICAgJmluZiwKKyAgICAgICAgICAgICAgICAibmVnaW5mIiwgICAgJm5lZ2luZiwKKyAgICAgICAgICAgICAgICAicmVwZWF0aW5nIiwgJnJlcGVhdGluZywKKyAgICAgICAgICAgICAgICAiYmlnIiwgICAgICAgJmJpZywKKyAgICAgICAgICAgICAgICAidGlueSIsICAgICAgJnRpbnksCisgICAgICAgICAgICAgICAgInplcm8iLCAgICAgICZ6ZXJvLAorICAgICAgICAgICAgICAgICJuZWd6ZXJvIiwgICAmbmVnemVybywKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiBnX2Fzc2VydF9jbXBpbnQgKGlzbmFuIChuYW4pLCAgICAhPSwgIDApOyAqLworICBnX2Fzc2VydF9jbXBpbnQgKGlzaW5mIChpbmYpLCAgICA9PSwgIDEpOworICBnX2Fzc2VydF9jbXBpbnQgKGlzaW5mIChuZWdpbmYpLCA9PSwgLTEpOworCisgIGdfYXNzZXJ0X2NtcGZsb2F0IChyZXBlYXRpbmcsID09LCAgICAgMS4wIC8gMyk7CisgIGdfYXNzZXJ0X2NtcGZsb2F0IChiaWcsICAgICAgID09LCBHX01BWERPVUJMRSk7CisgIGdfYXNzZXJ0X2NtcGZsb2F0ICh0aW55LCAgICAgID09LCAgICAgMTBFLTEwMSk7CisgIGdfYXNzZXJ0X2NtcGZsb2F0ICh6ZXJvLCAgICAgID09LCAgICAgMS4wICogMCk7CisgIGdfYXNzZXJ0X2NtcGZsb2F0IChuZWd6ZXJvLCAgID09LCAgICAtMS4wICogMCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKGRvdWJsZXMpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX29uZV9vZl9lYWNoX2NyZWF0ZV9hbmRfZGVzdHJveSAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKworICAvKiBBIE9uZU9mRWFjaCBzdHJ1Y3R1cmUgY2FuIGJlIGNyZWF0ZWQuLi4gKi8KKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTkVfT0ZfRUFDSCwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRfVEVTVF9JU19PTkVfT0ZfRUFDSCAob2JqZWN0KSk7CisKKyAgLyogLi4uYW5kIGRlc3Ryb3llZCAqLworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c19vbmVfb2ZfZWFjaF9pbml0aWFsaXplX2RlZmF1bHRfdmFsdWVzICh2b2lkKQoreworICBUVGVzdE9uZU9mRWFjaCAqb25lX29mX2VhY2ggPSBOVUxMOworICBnaW50ICAgYV9iaXRlOworICBnaW50ICAgaW50ZWdlcjE2OworICBnaW50NjQgaW50ZWdlcjY0OworICBHQXJyYXkgKmJ5dGVfbGlzdDsKKyAgR0FycmF5ICppMTZfbGlzdDsKKyAgR0FycmF5ICppNjRfbGlzdDsKKworICAvKiBBIE9uZU9mRWFjaCBzdHJ1Y3R1cmUgY3JlYXRlZCB3aXRoIG5vIGV4cGxpY2l0IHByb3BlcnR5IHZhbHVlcworICAgICB3aWxsIGhvbGQgdGhlIGRlZmF1bHQgdmFsdWVzIHNwZWNpZmllZCBpbiB0aGUgLnRocmlmdCBmaWxlICovCisgIG9uZV9vZl9lYWNoID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTkVfT0ZfRUFDSCwgTlVMTCk7CisKKyAgZ19vYmplY3RfZ2V0IChvbmVfb2ZfZWFjaCwKKyAgICAgICAgICAgICAgICAiYV9iaXRlIiwgICAgJmFfYml0ZSwKKyAgICAgICAgICAgICAgICAiaW50ZWdlcjE2IiwgJmludGVnZXIxNiwKKyAgICAgICAgICAgICAgICAiaW50ZWdlcjY0IiwgJmludGVnZXI2NCwKKyAgICAgICAgICAgICAgICAiYnl0ZV9saXN0IiwgJmJ5dGVfbGlzdCwKKyAgICAgICAgICAgICAgICAiaTE2X2xpc3QiLCAgJmkxNl9saXN0LAorICAgICAgICAgICAgICAgICJpNjRfbGlzdCIsICAmaTY0X2xpc3QsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waW50IChhX2JpdGUsICAgID09LCAweDdmKTsKKyAgZ19hc3NlcnRfY21waW50IChpbnRlZ2VyMTYsID09LCAweDdmZmYpOworICBnX2Fzc2VydF9jbXBpbnQgKGludGVnZXI2NCwgPT0sIEdfR0lOVDY0X0NPTlNUQU5UICgxMDAwMDAwMDAwMCkpOworCisgIGdfYXNzZXJ0IChieXRlX2xpc3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAoYnl0ZV9saXN0LT5sZW4sID09LCAzKTsKKyAgZ19hc3NlcnRfY21waW50IChnX2FycmF5X2luZGV4IChieXRlX2xpc3QsIGdpbnQ4LCAwKSwgPT0sIDEpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfYXJyYXlfaW5kZXggKGJ5dGVfbGlzdCwgZ2ludDgsIDEpLCA9PSwgMik7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19hcnJheV9pbmRleCAoYnl0ZV9saXN0LCBnaW50OCwgMiksID09LCAzKTsKKworICBnX2Fzc2VydCAoaTE2X2xpc3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAoaTE2X2xpc3QtPmxlbiwgPT0sIDMpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfYXJyYXlfaW5kZXggKGkxNl9saXN0LCBnaW50MTYsIDApLCA9PSwgMSk7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19hcnJheV9pbmRleCAoaTE2X2xpc3QsIGdpbnQxNiwgMSksID09LCAyKTsKKyAgZ19hc3NlcnRfY21waW50IChnX2FycmF5X2luZGV4IChpMTZfbGlzdCwgZ2ludDE2LCAyKSwgPT0sIDMpOworCisgIGdfYXNzZXJ0IChpNjRfbGlzdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnRfY21waW50IChpNjRfbGlzdC0+bGVuLCA9PSwgMyk7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19hcnJheV9pbmRleCAoaTY0X2xpc3QsIGdpbnQ2NCwgMCksID09LCAxKTsKKyAgZ19hc3NlcnRfY21waW50IChnX2FycmF5X2luZGV4IChpNjRfbGlzdCwgZ2ludDY0LCAxKSwgPT0sIDIpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfYXJyYXlfaW5kZXggKGk2NF9saXN0LCBnaW50NjQsIDIpLCA9PSwgMyk7CisKKyAgZ19hcnJheV91bnJlZiAoaTY0X2xpc3QpOworICBnX2FycmF5X3VucmVmIChpMTZfbGlzdCk7CisgIGdfYXJyYXlfdW5yZWYgKGJ5dGVfbGlzdCk7CisgIGdfb2JqZWN0X3VucmVmIChvbmVfb2ZfZWFjaCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfaW5pdGlhbGl6ZV9zcGVjaWZpZWRfdmFsdWVzICh2b2lkKQoreworICBzdGF0aWMgY29uc3QgZ2ludDggaW5pdGlhbF9ieXRlX2xpc3RbNV0gPSB7IDEzLCAyMSwgMzQsIDU1LCA4OSB9OworICBzdGF0aWMgY29uc3QgZ2ludDE2IGluaXRpYWxfaTE2X2xpc3RbNV0gPSB7IDQxODEsIDY3NjUsIDEwOTQ2LCAxNzcxMSwgMjg2NTcgfTsKKyAgc3RhdGljIGNvbnN0IGdpbnQ2NCBpbml0aWFsX2k2NF9saXN0WzVdID0KKyAgICB7CisgICAgICBHX0dJTlQ2NF9DT05TVEFOVCAoMTEwMDA4Nzc3ODM2NjEwMTkzMSksCisgICAgICBHX0dJTlQ2NF9DT05TVEFOVCAoMTc3OTk3OTQxNjAwNDcxNDE4OSksCisgICAgICBHX0dJTlQ2NF9DT05TVEFOVCAoMjg4MDA2NzE5NDM3MDgxNjEyMCksCisgICAgICBHX0dJTlQ2NF9DT05TVEFOVCAoNDY2MDA0NjYxMDM3NTUzMDMwOSksCisgICAgICBHX0dJTlQ2NF9DT05TVEFOVCAoNzU0MDExMzgwNDc0NjM0NjQyOSkKKyAgICB9OworICBzdGF0aWMgY29uc3QgZ3VpbnQ4IGluaXRpYWxfYmFzZTY0WzhdID0KKyAgICB7CisgICAgICAweDU2LCAweDQ3LCAweDY4LCAweDc5LCAweDYxLCAweDU3LCAweDVhLCAweDMwCisgICAgfTsKKworICBUVGVzdE9uZU9mRWFjaCAqb25lX29mX2VhY2g7CisgIGdib29sZWFuIGltX3RydWU7CisgIGdib29sZWFuIGltX2ZhbHNlOworICBnaW50IGFfYml0ZTsKKyAgZ2ludCBpbnRlZ2VyMTY7CisgIGdpbnQgaW50ZWdlcjMyOworICBnaW50NjQgaW50ZWdlcjY0OworICBkb3VibGUgZG91YmxlX3ByZWNpc2lvbjsKKyAgZ2NoYXIgKnNvbWVfY2hhcmFjdGVyczsKKyAgZ2NoYXIgKnpvbWdfdW5pY29kZTsKKyAgZ2Jvb2xlYW4gd2hhdF93aG87CisgIEdCeXRlQXJyYXkgKmJhc2U2NDsKKyAgR0FycmF5ICpieXRlX2xpc3Q7CisgIEdBcnJheSAqaTE2X2xpc3Q7CisgIEdBcnJheSAqaTY0X2xpc3Q7CisKKyAgYmFzZTY0ID0gZ19ieXRlX2FycmF5X25ldyAoKTsKKyAgZ19ieXRlX2FycmF5X2FwcGVuZCAoYmFzZTY0LCBpbml0aWFsX2Jhc2U2NCwgOCk7CisKKyAgYnl0ZV9saXN0ID0gZ19hcnJheV9uZXcgKEZBTFNFLCBGQUxTRSwgc2l6ZW9mIChnaW50OCkpOworICBnX2FycmF5X2FwcGVuZF92YWxzIChieXRlX2xpc3QsIGluaXRpYWxfYnl0ZV9saXN0LCA1KTsKKworICBpMTZfbGlzdCA9IGdfYXJyYXlfbmV3IChGQUxTRSwgRkFMU0UsIHNpemVvZiAoZ2ludDE2KSk7CisgIGdfYXJyYXlfYXBwZW5kX3ZhbHMgKGkxNl9saXN0LCBpbml0aWFsX2kxNl9saXN0LCA1KTsKKworICBpNjRfbGlzdCA9IGdfYXJyYXlfbmV3IChGQUxTRSwgRkFMU0UsIHNpemVvZiAoZ2ludDY0KSk7CisgIGdfYXJyYXlfYXBwZW5kX3ZhbHMgKGk2NF9saXN0LCBpbml0aWFsX2k2NF9saXN0LCA1KTsKKworICAvKiBBbGwgb2YgT25lT2ZFYWNoJ3MgcHJvcGVydGllcyBjYW4gYmUgc2V0IGF0IGNvbnN0cnVjdGlvbi4uLiAqLworICBvbmVfb2ZfZWFjaCA9CisgICAgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTkVfT0ZfRUFDSCwKKyAgICAgICAgICAgICAgICAgICJpbV90cnVlIiwgICAgICAgICAgVFJVRSwKKyAgICAgICAgICAgICAgICAgICJpbV9mYWxzZSIsICAgICAgICAgRkFMU0UsCisgICAgICAgICAgICAgICAgICAiYV9iaXRlIiwgICAgICAgICAgIDB4NTAsCisgICAgICAgICAgICAgICAgICAiaW50ZWdlcjE2IiwgICAgICAgIDB4N2U1NywKKyAgICAgICAgICAgICAgICAgICJpbnRlZ2VyMzIiLCAgICAgICAgMHhkZWFkYmVlZiwKKyAgICAgICAgICAgICAgICAgICJpbnRlZ2VyNjQiLCAgICAgICAgR19HSU5UNjRfQ09OU1RBTlQgKDB4ZmExNWVmYWNhZGUxNWJhZCksCisgICAgICAgICAgICAgICAgICAiZG91YmxlX3ByZWNpc2lvbiIsIE1fUEksCisgICAgICAgICAgICAgICAgICAic29tZV9jaGFyYWN0ZXJzIiwgICJEZWJ1ZyBUSElTISIsCisgICAgICAgICAgICAgICAgICAiem9tZ191bmljb2RlIiwgICAgICJceGQ3XG5cYVx0IiwKKyAgICAgICAgICAgICAgICAgICJ3aGF0X3dobyIsICAgICAgICAgVFJVRSwKKyAgICAgICAgICAgICAgICAgICJiYXNlNjQiLCAgICAgICAgICAgYmFzZTY0LAorICAgICAgICAgICAgICAgICAgImJ5dGVfbGlzdCIsICAgICAgICBieXRlX2xpc3QsCisgICAgICAgICAgICAgICAgICAiaTE2X2xpc3QiLCAgICAgICAgIGkxNl9saXN0LAorICAgICAgICAgICAgICAgICAgImk2NF9saXN0IiwgICAgICAgICBpNjRfbGlzdCwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworICBnX2Fzc2VydCAob25lX29mX2VhY2ggIT0gTlVMTCk7CisKKyAgZ19hcnJheV91bnJlZiAoaTY0X2xpc3QpOworICBpNjRfbGlzdCA9IE5VTEw7CisgIGdfYXJyYXlfdW5yZWYgKGkxNl9saXN0KTsKKyAgaTE2X2xpc3QgPSBOVUxMOworICBnX2FycmF5X3VucmVmIChieXRlX2xpc3QpOworICBieXRlX2xpc3QgPSBOVUxMOworICBnX2J5dGVfYXJyYXlfdW5yZWYgKGJhc2U2NCk7CisgIGJhc2U2NCA9IE5VTEw7CisKKyAgLyogLi4uYW5kIGxhdGVyIHJldHJpZXZlZCAqLworICBnX29iamVjdF9nZXQgKG9uZV9vZl9lYWNoLAorICAgICAgICAgICAgICAgICJpbV90cnVlIiwgICAgICAgICAgJmltX3RydWUsCisgICAgICAgICAgICAgICAgImltX2ZhbHNlIiwgICAgICAgICAmaW1fZmFsc2UsCisgICAgICAgICAgICAgICAgImFfYml0ZSIsICAgICAgICAgICAmYV9iaXRlLAorICAgICAgICAgICAgICAgICJpbnRlZ2VyMTYiLCAgICAgICAgJmludGVnZXIxNiwKKyAgICAgICAgICAgICAgICAiaW50ZWdlcjMyIiwgICAgICAgICZpbnRlZ2VyMzIsCisgICAgICAgICAgICAgICAgImludGVnZXI2NCIsICAgICAgICAmaW50ZWdlcjY0LAorICAgICAgICAgICAgICAgICJkb3VibGVfcHJlY2lzaW9uIiwgJmRvdWJsZV9wcmVjaXNpb24sCisgICAgICAgICAgICAgICAgInNvbWVfY2hhcmFjdGVycyIsICAmc29tZV9jaGFyYWN0ZXJzLAorICAgICAgICAgICAgICAgICJ6b21nX3VuaWNvZGUiLCAgICAgJnpvbWdfdW5pY29kZSwKKyAgICAgICAgICAgICAgICAid2hhdF93aG8iLCAgICAgICAgICZ3aGF0X3dobywKKyAgICAgICAgICAgICAgICAiYmFzZTY0IiwgICAgICAgICAgICZiYXNlNjQsCisgICAgICAgICAgICAgICAgImJ5dGVfbGlzdCIsICAgICAgICAmYnl0ZV9saXN0LAorICAgICAgICAgICAgICAgICJpMTZfbGlzdCIsICAgICAgICAgJmkxNl9saXN0LAorICAgICAgICAgICAgICAgICJpNjRfbGlzdCIsICAgICAgICAgJmk2NF9saXN0LAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfYXNzZXJ0IChpbV90cnVlICA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKGltX2ZhbHNlID09IEZBTFNFKTsKKworICBnX2Fzc2VydF9jbXBoZXggKGFfYml0ZSwgICAgPT0sIDB4NTApOworICBnX2Fzc2VydF9jbXBoZXggKGludGVnZXIxNiwgPT0sIDB4N2U1Nyk7CisgIGdfYXNzZXJ0X2NtcGhleCAoaW50ZWdlcjMyLCA9PSwgKGdpbnQzMikweGRlYWRiZWVmKTsKKyAgZ19hc3NlcnRfY21waGV4IChpbnRlZ2VyNjQsID09LCBHX0dJTlQ2NF9DT05TVEFOVCAoMHhmYTE1ZWZhY2FkZTE1YmFkKSk7CisKKyAgZ19hc3NlcnRfY21wZmxvYXQgKGRvdWJsZV9wcmVjaXNpb24sID09LCBNX1BJKTsKKworICBnX2Fzc2VydF9jbXBzdHIgKHNvbWVfY2hhcmFjdGVycywgPT0sICJEZWJ1ZyBUSElTISIpOworICBnX2Fzc2VydF9jbXBzdHIgKHpvbWdfdW5pY29kZSwgICAgPT0sICJceGQ3XG5cYVx0Iik7CisKKyAgZ19hc3NlcnQgKHdoYXRfd2hvID09IFRSVUUpOworCisgIGdfYXNzZXJ0X2NtcGludCAoYmFzZTY0LT5sZW4sID09LCA4KTsKKyAgZ19hc3NlcnRfY21waW50IChtZW1jbXAgKGJhc2U2NC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfYmFzZTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAqIHNpemVvZiAoZ3VpbnQ4KSksID09LCAwKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKGJ5dGVfbGlzdC0+bGVuLCA9PSwgNSk7CisgIGdfYXNzZXJ0X2NtcGludCAobWVtY21wIChieXRlX2xpc3QtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX2J5dGVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgKiBzaXplb2YgKGdpbnQ4KSksICA9PSwgMCk7CisKKyAgZ19hc3NlcnRfY21waW50IChpMTZfbGlzdC0+bGVuLCA9PSwgNSk7CisgIGdfYXNzZXJ0X2NtcGludCAobWVtY21wIChpMTZfbGlzdC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfaTE2X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA1ICogc2l6ZW9mIChnaW50MTYpKSwgPT0sIDApOworCisgIGdfYXNzZXJ0X2NtcGludCAoaTY0X2xpc3QtPmxlbiwgPT0sIDUpOworICBnX2Fzc2VydF9jbXBpbnQgKG1lbWNtcCAoaTY0X2xpc3QtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX2k2NF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgNSAqIHNpemVvZiAoZ2ludDY0KSksID09LCAwKTsKKworICBnX2FycmF5X3VucmVmIChpNjRfbGlzdCk7CisgIGdfYXJyYXlfdW5yZWYgKGkxNl9saXN0KTsKKyAgZ19hcnJheV91bnJlZiAoYnl0ZV9saXN0KTsKKyAgZ19ieXRlX2FycmF5X3VucmVmIChiYXNlNjQpOworCisgIGdfb2JqZWN0X3VucmVmIChvbmVfb2ZfZWFjaCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfcHJvcGVydGllc19ieXRlX2xpc3QgKHZvaWQpCit7CisgIFRUZXN0T25lT2ZFYWNoICpvbmVfb2ZfZWFjaDsKKyAgR0FycmF5ICpieXRlX2xpc3QgPSBOVUxMOworCisgIG9uZV9vZl9lYWNoID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTkVfT0ZfRUFDSCwgTlVMTCk7CisKKyAgLyogT25lT2ZFYWNoJ3MgImJ5dGVfbGlzdCIgbWVtYmVyIGlzIGEgbGlzdCB0aGF0IGhvbGRzIGVpZ2h0LWJpdC13aWRlIGludGVnZXIKKyAgICAgdmFsdWVzICovCisgIGdfb2JqZWN0X2dldCAob25lX29mX2VhY2gsICJieXRlX2xpc3QiLCAmYnl0ZV9saXN0LCBOVUxMKTsKKworICBnX2Fzc2VydCAoYnl0ZV9saXN0ICE9IE5VTEwpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfYXJyYXlfZ2V0X2VsZW1lbnRfc2l6ZSAoYnl0ZV9saXN0KSwgPT0sIHNpemVvZiAoZ2ludDgpKTsKKworICBnX2FycmF5X3VucmVmIChieXRlX2xpc3QpOworICBnX29iamVjdF91bnJlZiAob25lX29mX2VhY2gpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX29uZV9vZl9lYWNoX3Byb3BlcnRpZXNfaTE2X2xpc3QgKHZvaWQpCit7CisgIFRUZXN0T25lT2ZFYWNoICpvbmVfb2ZfZWFjaDsKKyAgR0FycmF5ICppMTZfbGlzdCA9IE5VTEw7CisKKyAgb25lX29mX2VhY2ggPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX09ORV9PRl9FQUNILCBOVUxMKTsKKworICAvKiBPbmVPZkVhY2gncyAiaTE2X2xpc3QiIG1lbWJlciBpcyBhIGxpc3QgdGhhdCBob2xkcyBzaXh0ZWVuLWJpdC13aWRlIGludGVnZXIKKyAgICAgdmFsdWVzICovCisgIGdfb2JqZWN0X2dldCAob25lX29mX2VhY2gsICJpMTZfbGlzdCIsICZpMTZfbGlzdCwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGkxNl9saXN0ICE9IE5VTEwpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfYXJyYXlfZ2V0X2VsZW1lbnRfc2l6ZSAoaTE2X2xpc3QpLCA9PSwgc2l6ZW9mIChnaW50MTYpKTsKKworICBnX2FycmF5X3VucmVmIChpMTZfbGlzdCk7CisgIGdfb2JqZWN0X3VucmVmIChvbmVfb2ZfZWFjaCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfcHJvcGVydGllc19pNjRfbGlzdCAodm9pZCkKK3sKKyAgVFRlc3RPbmVPZkVhY2ggKm9uZV9vZl9lYWNoOworICBHQXJyYXkgKmk2NF9saXN0ID0gTlVMTDsKKworICBvbmVfb2ZfZWFjaCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfT05FX09GX0VBQ0gsIE5VTEwpOworCisgIC8qIE9uZU9mRWFjaCdzICJpNjRfbGlzdCIgbWVtYmVyIGlzIGEgbGlzdCB0aGF0IGhvbGRzIHNpeHR5LWZvdXItYml0LXdpZGUKKyAgICAgaW50ZWdlciB2YWx1ZXMgKi8KKyAgZ19vYmplY3RfZ2V0IChvbmVfb2ZfZWFjaCwgImk2NF9saXN0IiwgJmk2NF9saXN0LCBOVUxMKTsKKworICBnX2Fzc2VydCAoaTY0X2xpc3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19hcnJheV9nZXRfZWxlbWVudF9zaXplIChpNjRfbGlzdCksID09LCBzaXplb2YgKGdpbnQ2NCkpOworCisgIGdfYXJyYXlfdW5yZWYgKGk2NF9saXN0KTsKKyAgZ19vYmplY3RfdW5yZWYgKG9uZV9vZl9lYWNoKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c19uZXN0aW5nX2NyZWF0ZV9hbmRfZGVzdHJveSAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKworICAvKiBBIE5lc3Rpbmcgc3RydWN0dXJlIGNhbiBiZSBjcmVhdGVkLi4uICovCisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfTkVTVElORywgTlVMTCk7CisKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRfVEVTVF9JU19ORVNUSU5HIChvYmplY3QpKTsKKworICAvKiAuLi5hbmQgZGVzdHJveWVkICovCisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX25lc3RpbmdfcHJvcGVydGllc19teV9ib25rICh2b2lkKQoreworICBUVGVzdE5lc3RpbmcgKm5lc3Rpbmc7CiAgIFRUZXN0Qm9uayAqYm9uayA9IE5VTEw7Ci0gIGJvbmsgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0JPTkssIE5VTEwpOwotICBHUHRyQXJyYXkgKmJvbmtzID0gZ19wdHJfYXJyYXlfbmV3ICgpOwotICBnX3B0cl9hcnJheV9hZGQgKGJvbmtzLCBib25rKTsKLSAgZ19oYXNoX3RhYmxlX2luc2VydCAoaG0tPmJvbmtzLCAibm90aGluZyIsIGJvbmtzKTsKKyAgZ2ludCB0eXBlOworICBnY2hhciAqbWVzc2FnZTsKIAotICBnX3B0cl9hcnJheV9mcmVlIChib25rcywgVFJVRSk7CisgIG5lc3RpbmcgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX05FU1RJTkcsIE5VTEwpOworCisgIC8qIE5lc3RpbmcncyAibXlfYm9uayIgbWVtYmVyIGlzIGluaXRpYWxpemVkIHdpdGggYSBuZXcsIGRlZmF1bHQgQm9uayBvYmplY3QKKyAgICAgZHVyaW5nIGNvbnN0cnVjdGlvbiAqLworICBnX29iamVjdF9nZXQgKG5lc3RpbmcsICJteV9ib25rIiwgJmJvbmssIE5VTEwpOworCisgIGdfYXNzZXJ0IChib25rICE9IE5VTEwpOworICBnX2Fzc2VydCAoVF9URVNUX0lTX0JPTksgKGJvbmspKTsKKworICBnX29iamVjdF9nZXQgKGJvbmssCisgICAgICAgICAgICAgICAgInR5cGUiLCAgICAmdHlwZSwKKyAgICAgICAgICAgICAgICAibWVzc2FnZSIsICZtZXNzYWdlLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGludCAodHlwZSwgPT0sIDApOworICBnX2Fzc2VydCAobWVzc2FnZSA9PSBOVUxMKTsKKwogICBnX29iamVjdF91bnJlZiAoYm9uayk7Ci0gIGdfb2JqZWN0X3VucmVmIChvb2UpOwotICBnX29iamVjdF91bnJlZiAobik7Ci0gIGdfb2JqZWN0X3VucmVmIChobSk7CisgIGJvbmsgPSBOVUxMOwogCi0gIHJldHVybiAwOworICAvKiBJdCBjYW4gYmUgcmVwbGFjZWQuLi4gKi8KKyAgYm9uayA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfQk9OSywKKyAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiLCAgICAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiwgIlJlcGxhY2VtZW50IEJvbmsiLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChuZXN0aW5nLCAibXlfYm9uayIsIGJvbmssIE5VTEwpOworICBnX29iamVjdF91bnJlZiAoYm9uayk7CisgIGJvbmsgPSBOVUxMOworCisgIGdfb2JqZWN0X2dldCAobmVzdGluZywgIm15X2JvbmsiLCAmYm9uaywgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGJvbmsgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChUX1RFU1RfSVNfQk9OSyAoYm9uaykpOworCisgIGdfb2JqZWN0X2dldCAoYm9uaywKKyAgICAgICAgICAgICAgICAidHlwZSIsICAgICZ0eXBlLAorICAgICAgICAgICAgICAgICJtZXNzYWdlIiwgJm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waW50ICh0eXBlLCA9PSwgMTAwKTsKKyAgZ19hc3NlcnRfY21wc3RyIChtZXNzYWdlLCA9PSwgIlJlcGxhY2VtZW50IEJvbmsiKTsKKworICBnX2ZyZWUgKG1lc3NhZ2UpOworICBnX29iamVjdF91bnJlZiAoYm9uayk7CisgIGJvbmsgPSBOVUxMOworCisgIC8qIC4uLm9yIHNldCB0byBudWxsICovCisgIGdfb2JqZWN0X3NldCAobmVzdGluZywgIm15X2JvbmsiLCBOVUxMLCBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0IChuZXN0aW5nLCAibXlfYm9uayIsICZib25rLCBOVUxMKTsKKworICBnX2Fzc2VydCAoYm9uayA9PSBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAobmVzdGluZyk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfbmVzdGluZ19wcm9wZXJ0aWVzX215X29vZSAodm9pZCkKK3sKKyAgVFRlc3ROZXN0aW5nICpuZXN0aW5nOworICBUVGVzdE9uZU9mRWFjaCAqb25lX29mX2VhY2ggPSBOVUxMOworICBnaW50IGFfYml0ZTsKKyAgZ2ludCBpbnRlZ2VyMTY7CisKKyAgbmVzdGluZyA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfTkVTVElORywgTlVMTCk7CisKKyAgLyogTmVzdGluZydzICJteV9vb2UiIG1lbWJlciBpcyBpbml0aWFsaXplZCB3aXRoIGEgbmV3LCBkZWZhdWx0IE9uZU9mRWFjaAorICAgICBvYmplY3QgZHVyaW5nIGNvbnN0cnVjdGlvbiAqLworICBnX29iamVjdF9nZXQgKG5lc3RpbmcsICJteV9vb2UiLCAmb25lX29mX2VhY2gsIE5VTEwpOworCisgIGdfYXNzZXJ0IChvbmVfb2ZfZWFjaCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRfVEVTVF9JU19PTkVfT0ZfRUFDSCAob25lX29mX2VhY2gpKTsKKworICBnX29iamVjdF9nZXQgKG9uZV9vZl9lYWNoLAorICAgICAgICAgICAgICAgICJhX2JpdGUiLCAgICAmYV9iaXRlLAorICAgICAgICAgICAgICAgICJpbnRlZ2VyMTYiLCAmaW50ZWdlcjE2LAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGhleCAoYV9iaXRlLCAgICA9PSwgMHg3Zik7CisgIGdfYXNzZXJ0X2NtcGhleCAoaW50ZWdlcjE2LCA9PSwgMHg3ZmZmKTsKKworICBnX29iamVjdF91bnJlZiAob25lX29mX2VhY2gpOworICBvbmVfb2ZfZWFjaCA9IE5VTEw7CisKKyAgLyogSXQgY2FuIGJlIHJlcGxhY2VkLi4uICovCisgIG9uZV9vZl9lYWNoID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTkVfT0ZfRUFDSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhX2JpdGUiLCAgICAweDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXIxNiIsIDB4NTA1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBnX29iamVjdF9zZXQgKG5lc3RpbmcsICJteV9vb2UiLCBvbmVfb2ZfZWFjaCwgTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChvbmVfb2ZfZWFjaCk7CisgIG9uZV9vZl9lYWNoID0gTlVMTDsKKworICBnX29iamVjdF9nZXQgKG5lc3RpbmcsICJteV9vb2UiLCAmb25lX29mX2VhY2gsIE5VTEwpOworCisgIGdfYXNzZXJ0IChvbmVfb2ZfZWFjaCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRfVEVTVF9JU19PTkVfT0ZfRUFDSCAob25lX29mX2VhY2gpKTsKKworICBnX29iamVjdF9nZXQgKG9uZV9vZl9lYWNoLAorICAgICAgICAgICAgICAgICJhX2JpdGUiLCAgICAmYV9iaXRlLAorICAgICAgICAgICAgICAgICJpbnRlZ2VyMTYiLCAmaW50ZWdlcjE2LAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGhleCAoYV9iaXRlLCAgICA9PSwgMHg1MCk7CisgIGdfYXNzZXJ0X2NtcGhleCAoaW50ZWdlcjE2LCA9PSwgMHg1MDUwKTsKKworICBnX29iamVjdF91bnJlZiAob25lX29mX2VhY2gpOworICBvbmVfb2ZfZWFjaCA9IE5VTEw7CisKKyAgLyogLi4ub3Igc2V0IHRvIG51bGwgKi8KKyAgZ19vYmplY3Rfc2V0IChuZXN0aW5nLCAibXlfb29lIiwgTlVMTCwgTlVMTCk7CisgIGdfb2JqZWN0X2dldCAobmVzdGluZywgIm15X29vZSIsICZvbmVfb2ZfZWFjaCwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKG9uZV9vZl9lYWNoID09IE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmIChuZXN0aW5nKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c19ob2x5X21vbGV5X2NyZWF0ZV9hbmRfZGVzdHJveSAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKworICAvKiBBIEhvbHlNb2xleSBzdHJ1Y3R1cmUgY2FuIGJlIGNyZWF0ZWQuLi4gKi8KKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9IT0xZX01PTEVZLCBOVUxMKTsKKworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAoVF9URVNUX0lTX0hPTFlfTU9MRVkgKG9iamVjdCkpOworCisgIC8qIC4uLmFuZCBkZXN0cm95ZWQgKi8KKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfaG9seV9tb2xleV9wcm9wZXJ0aWVzX2JpZyAodm9pZCkKK3sKKyAgVFRlc3RIb2x5TW9sZXkgKmhvbHlfbW9sZXk7CisgIEdQdHJBcnJheSAqYmlnID0gTlVMTDsKKyAgZ2ludCBhX2JpdGUgPSAwOworICBnaW50IGludGVnZXIxNiA9IDA7CisKKyAgaG9seV9tb2xleSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfSE9MWV9NT0xFWSwgTlVMTCk7CisKKyAgLyogQSBIb2x5TW9sZXkncyAiYmlnIiBtZW1iZXIgaXMgaXMgaW5pdGlhbGl6ZWQgb24gY29uc3RydWN0aW9uICovCisgIGdfb2JqZWN0X2dldCAoaG9seV9tb2xleSwgImJpZyIsICZiaWcsIE5VTEwpOworCisgIGdfYXNzZXJ0IChiaWcgIT0gTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAoYmlnLT5sZW4sID09LCAwKTsKKworICAvKiBJdCBjYW4gYmUgbW9kaWZpZWQuLi4gKi8KKyAgZ19wdHJfYXJyYXlfYWRkIChiaWcsCisgICAgICAgICAgICAgICAgICAgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTkVfT0ZfRUFDSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhX2JpdGUiLCAgICAweDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXIxNiIsIDB4NTA1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKTsKKworICBnX3B0cl9hcnJheV91bnJlZiAoYmlnKTsKKyAgYmlnID0gTlVMTDsKKworICBnX29iamVjdF9nZXQgKGhvbHlfbW9sZXksICJiaWciLCAmYmlnLCBOVUxMKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKGJpZy0+bGVuLCA9PSwgMSk7CisgIGdfb2JqZWN0X2dldCAoZ19wdHJfYXJyYXlfaW5kZXggKGJpZywgMCksCisgICAgICAgICAgICAgICAgImFfYml0ZSIsICAgICZhX2JpdGUsCisgICAgICAgICAgICAgICAgImludGVnZXIxNiIsICZpbnRlZ2VyMTYsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waGV4IChhX2JpdGUsICAgID09LCAweDUwKTsKKyAgZ19hc3NlcnRfY21waGV4IChpbnRlZ2VyMTYsID09LCAweDUwNTApOworCisgIGdfcHRyX2FycmF5X3VucmVmIChiaWcpOworICBiaWcgPSBOVUxMOworCisgIC8qIC4uLnJlcGxhY2VkLi4uICovCisgIGJpZyA9IGdfcHRyX2FycmF5X25ld193aXRoX2ZyZWVfZnVuYyAoZ19vYmplY3RfdW5yZWYpOworICBnX3B0cl9hcnJheV9hZGQgKGJpZywKKyAgICAgICAgICAgICAgICAgICBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX09ORV9PRl9FQUNILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFfYml0ZSIsICAgIDB4NjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZWdlcjE2IiwgMHgxNTQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpOworCisgIGdfb2JqZWN0X3NldCAoaG9seV9tb2xleSwgImJpZyIsIGJpZywgTlVMTCk7CisKKyAgZ19wdHJfYXJyYXlfdW5yZWYgKGJpZyk7CisgIGJpZyA9IE5VTEw7CisKKyAgZ19vYmplY3RfZ2V0IChob2x5X21vbGV5LCAiYmlnIiwgJmJpZywgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waW50IChiaWctPmxlbiwgPT0sIDEpOworICBnX29iamVjdF9nZXQgKGdfcHRyX2FycmF5X2luZGV4IChiaWcsIDApLAorICAgICAgICAgICAgICAgICJhX2JpdGUiLCAgICAmYV9iaXRlLAorICAgICAgICAgICAgICAgICJpbnRlZ2VyMTYiLCAmaW50ZWdlcjE2LAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGhleCAoYV9iaXRlLCAgICA9PSwgMHg2NCk7CisgIGdfYXNzZXJ0X2NtcGhleCAoaW50ZWdlcjE2LCA9PSwgMHgxNTQxKTsKKworICBnX3B0cl9hcnJheV91bnJlZiAoYmlnKTsKKyAgYmlnID0gTlVMTDsKKworICAvKiAuLi5vciBzZXQgdG8gTlVMTCAqLworICBnX29iamVjdF9zZXQgKGhvbHlfbW9sZXksICJiaWciLCBOVUxMLCBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0IChob2x5X21vbGV5LCAiYmlnIiwgJmJpZywgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGJpZyA9PSBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAoaG9seV9tb2xleSk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfaG9seV9tb2xleV9wcm9wZXJ0aWVzX2NvbnRhaW4gKHZvaWQpCit7CisgIHN0YXRpYyBnY2hhciAqc3RyaW5nc1syXSA9IHsgIkFwYWNoZSIsICJUaHJpZnQiIH07CisKKyAgVFRlc3RIb2x5TW9sZXkgKmhvbHlfbW9sZXk7CisgIEdIYXNoVGFibGUgKmNvbnRhaW4gPSBOVUxMOworICBHUHRyQXJyYXkgKnN0cmluZ19saXN0OworICBHTGlzdCAqa2V5X2xpc3Q7CisKKyAgaG9seV9tb2xleSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfSE9MWV9NT0xFWSwgTlVMTCk7CisKKyAgLyogQSBIb2x5TW9sZXkncyAiY29udGFpbiIgbWVtYmVyIGlzIGluaXRpYWxpemVkIG9uIGNvbnN0cnVjdGlvbiAqLworICBnX29iamVjdF9nZXQgKGhvbHlfbW9sZXksICJjb250YWluIiwgJmNvbnRhaW4sIE5VTEwpOworCisgIGdfYXNzZXJ0IChjb250YWluICE9IE5VTEwpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfaGFzaF90YWJsZV9zaXplIChjb250YWluKSwgPT0sIDApOworCisgIC8qIEl0IGNhbiBiZSBtb2RpZmllZC4uLiAqLworICBzdHJpbmdfbGlzdCA9IGdfcHRyX2FycmF5X25ldyAoKTsKKyAgZ19wdHJfYXJyYXlfYWRkIChzdHJpbmdfbGlzdCwgc3RyaW5nc1swXSk7CisgIGdfcHRyX2FycmF5X2FkZCAoc3RyaW5nX2xpc3QsIHN0cmluZ3NbMV0pOworCisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGNvbnRhaW4sIHN0cmluZ19saXN0LCBOVUxMKTsKKyAgc3RyaW5nX2xpc3QgPSBOVUxMOworCisgIGdfaGFzaF90YWJsZV91bnJlZiAoY29udGFpbik7CisgIGNvbnRhaW4gPSBOVUxMOworCisgIGdfb2JqZWN0X2dldCAoaG9seV9tb2xleSwgImNvbnRhaW4iLCAmY29udGFpbiwgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waW50IChnX2hhc2hfdGFibGVfc2l6ZSAoY29udGFpbiksID09LCAxKTsKKworICBrZXlfbGlzdCA9IGdfaGFzaF90YWJsZV9nZXRfa2V5cyAoY29udGFpbik7CisgIHN0cmluZ19saXN0ID0gZ19saXN0X250aF9kYXRhIChrZXlfbGlzdCwgMCk7CisKKyAgZ19hc3NlcnRfY21waW50IChzdHJpbmdfbGlzdC0+bGVuLCA9PSwgMik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZ19wdHJfYXJyYXlfaW5kZXggKHN0cmluZ19saXN0LCAwKSwgPT0sICJBcGFjaGUiKTsKKyAgZ19hc3NlcnRfY21wc3RyIChnX3B0cl9hcnJheV9pbmRleCAoc3RyaW5nX2xpc3QsIDEpLCA9PSwgIlRocmlmdCIpOworCisgIGdfbGlzdF9mcmVlIChrZXlfbGlzdCk7CisgIGdfaGFzaF90YWJsZV91bnJlZiAoY29udGFpbik7CisgIGNvbnRhaW4gPSBOVUxMOworCisgIC8qIC4uLnJlcGxhY2VkLi4uICovCisgIGNvbnRhaW4gPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfZGlyZWN0X2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZGlyZWN0X2VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdfcHRyX2FycmF5X3VucmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChob2x5X21vbGV5LCAiY29udGFpbiIsIGNvbnRhaW4sIE5VTEwpOworICBnX2hhc2hfdGFibGVfdW5yZWYgKGNvbnRhaW4pOworICBjb250YWluID0gTlVMTDsKKworICBnX29iamVjdF9nZXQgKGhvbHlfbW9sZXksICJjb250YWluIiwgJmNvbnRhaW4sIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGludCAoZ19oYXNoX3RhYmxlX3NpemUgKGNvbnRhaW4pLCA9PSwgMCk7CisKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChjb250YWluKTsKKyAgY29udGFpbiA9IE5VTEw7CisKKyAgLyogLi4ub3Igc2V0IHRvIE5VTEwgKi8KKyAgZ19vYmplY3Rfc2V0IChob2x5X21vbGV5LCAiY29udGFpbiIsIE5VTEwsIE5VTEwpOworICBnX29iamVjdF9nZXQgKGhvbHlfbW9sZXksICJjb250YWluIiwgJmNvbnRhaW4sIE5VTEwpOworCisgIGdfYXNzZXJ0IChjb250YWluID09IE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmIChob2x5X21vbGV5KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c19ob2x5X21vbGV5X3Byb3BlcnRpZXNfYm9ua3MgKHZvaWQpCit7CisgIFRUZXN0SG9seU1vbGV5ICpob2x5X21vbGV5OworICBHSGFzaFRhYmxlICpib25rcyA9IE5VTEw7CisgIEdQdHJBcnJheSAqYm9ua19saXN0ID0gTlVMTDsKKyAgVFRlc3RCb25rICpib25rID0gTlVMTDsKKyAgZ2ludCB0eXBlOworICBnY2hhciAqbWVzc2FnZTsKKyAgR0xpc3QgKmtleV9saXN0OworCisgIGhvbHlfbW9sZXkgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0hPTFlfTU9MRVksIE5VTEwpOworCisgIC8qIEEgSG9seU1vbGV5J3MgImJvbmtzIiBtZW1iZXIgaXMgaW5pdGlhbGl6ZWQgb24gY29uc3RydWN0aW9uICovCisgIGdfb2JqZWN0X2dldCAoaG9seV9tb2xleSwgImJvbmtzIiwgJmJvbmtzLCBOVUxMKTsKKworICBnX2Fzc2VydCAoYm9ua3MgIT0gTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19oYXNoX3RhYmxlX3NpemUgKGJvbmtzKSwgPT0sIDApOworCisgIC8qIEl0IGNhbiBiZSBtb2RpZmllZC4uLiAqLworICBib25rID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9CT05LLAorICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIsICAgIDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiLCAiU2FtcGxlIEJvbmsiLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgYm9ua19saXN0ID0gZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jIChnX29iamVjdF91bnJlZik7CisgIGdfcHRyX2FycmF5X2FkZCAoYm9ua19saXN0LCBib25rKTsKKyAgYm9uayA9IE5VTEw7CisKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAoYm9ua3MsIGdfc3RyZHVwICgiU2FtcGxlIEJvbmtzIiksIGJvbmtfbGlzdCk7CisgIGJvbmtfbGlzdCA9IE5VTEw7CisKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChib25rcyk7CisgIGJvbmtzID0gTlVMTDsKKworICBnX29iamVjdF9nZXQgKGhvbHlfbW9sZXksICJib25rcyIsICZib25rcywgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waW50IChnX2hhc2hfdGFibGVfc2l6ZSAoYm9ua3MpLCA9PSwgMSk7CisKKyAga2V5X2xpc3QgPSBnX2hhc2hfdGFibGVfZ2V0X2tleXMgKGJvbmtzKTsKKyAgYm9ua19saXN0ID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAoYm9ua3MsIGdfbGlzdF9udGhfZGF0YSAoa2V5X2xpc3QsIDApKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKGJvbmtfbGlzdC0+bGVuLCA9PSwgMSk7CisKKyAgYm9uayA9IChnX3B0cl9hcnJheV9pbmRleCAoYm9ua19saXN0LCAwKSk7CisgIGdfb2JqZWN0X2dldCAoYm9uaywKKyAgICAgICAgICAgICAgICAidHlwZSIsICAgICZ0eXBlLAorICAgICAgICAgICAgICAgICJtZXNzYWdlIiwgJm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waW50ICh0eXBlLCA9PSwgMTAwKTsKKyAgZ19hc3NlcnRfY21wc3RyIChtZXNzYWdlLCA9PSwgIlNhbXBsZSBCb25rIik7CisKKyAgYm9uayA9IE5VTEw7CisgIGdfZnJlZSAobWVzc2FnZSk7CisgIGdfbGlzdF9mcmVlIChrZXlfbGlzdCk7CisgIGdfaGFzaF90YWJsZV91bnJlZiAoYm9ua3MpOworICBib25rcyA9IE5VTEw7CisKKyAgLyogLi4ucmVwbGFjZWQuLi4gKi8KKyAgYm9ua3MgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfc3RyX2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX3N0cl9lcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHRGVzdHJveU5vdGlmeSkgZ19wdHJfYXJyYXlfdW5yZWYpOworICBnX29iamVjdF9zZXQgKGhvbHlfbW9sZXksICJib25rcyIsIGJvbmtzLCBOVUxMKTsKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChib25rcyk7CisgIGJvbmtzID0gTlVMTDsKKworICBnX29iamVjdF9nZXQgKGhvbHlfbW9sZXksICJib25rcyIsICZib25rcywgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waW50IChnX2hhc2hfdGFibGVfc2l6ZSAoYm9ua3MpLCA9PSwgMCk7CisKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChib25rcyk7CisgIGJvbmtzID0gTlVMTDsKKworICAvKiAuLi5vciBzZXQgdG8gTlVMTCAqLworICBnX29iamVjdF9zZXQgKGhvbHlfbW9sZXksICJib25rcyIsIE5VTEwsIE5VTEwpOworICBnX29iamVjdF9nZXQgKGhvbHlfbW9sZXksICJib25rcyIsICZib25rcywgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGJvbmtzID09IE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmIChob2x5X21vbGV5KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c19lbXB0eSAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKyAgR1BhcmFtU3BlYyAqKnByb3BlcnRpZXM7CisgIGd1aW50IHByb3BlcnR5X2NvdW50OworCisgIC8qIEFuIEVtcHR5IHN0cnVjdHVyZSBjYW4gYmUgY3JlYXRlZCAqLworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0VNUFRZLCBOVUxMKTsKKworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAoVF9URVNUX0lTX0VNUFRZIChvYmplY3QpKTsKKworICAvKiBBbiBFbXB0eSBzdHJ1Y3R1cmUgaGFzIG5vIG1lbWJlcnMgYW5kIHRodXMgbm8gcHJvcGVydGllcyAqLworICBwcm9wZXJ0aWVzID0gZ19vYmplY3RfY2xhc3NfbGlzdF9wcm9wZXJ0aWVzIChHX09CSkVDVF9HRVRfQ0xBU1MgKG9iamVjdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eV9jb3VudCk7CisgIGdfYXNzZXJ0X2NtcGludCAocHJvcGVydHlfY291bnQsID09LCAwKTsKKyAgZ19mcmVlIChwcm9wZXJ0aWVzKTsKKworICAvKiBBbiBFbXB0eSBzdHJ1Y3R1cmUgY2FuIGJlIGRlc3Ryb3llZCAgKi8KKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfd3JhcHBlcl9jcmVhdGVfYW5kX2Rlc3Ryb3kgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisKKyAgLyogQSBXcmFwcGVyIHN0cnVjdHVyZSBjYW4gYmUgY3JlYXRlZC4uLiAqLworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0VNUFRZLCBOVUxMKTsKKworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAoVF9URVNUX0lTX0VNUFRZIChvYmplY3QpKTsKKworICAvKiAuLi5hbmQgZGVzdHJveWVkICAqLworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c193cmFwcGVyX3Byb3BlcnRpZXNfZm9vICh2b2lkKSB7CisgIFRUZXN0V3JhcHBlciAqd3JhcHBlcjsKKyAgVFRlc3RFbXB0eSAqZm9vOworCisgIHdyYXBwZXIgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1dSQVBQRVIsIE5VTEwpOworCisgIC8qIEEgV3JhcHBlciBzdHJ1Y3R1cmUgaGFzIG9uZSBtZW1iZXIsICJmb28iLCB3aGljaCBpcyBhbiBFbXB0eQorICAgICBzdHJ1Y3R1cmUgaW5pdGlhbGl6ZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiAqLworICBnX29iamVjdF9nZXQgKHdyYXBwZXIsICJmb28iLCAmZm9vLCBOVUxMKTsKKworICBnX2Fzc2VydCAoZm9vICE9IE5VTEwpOworICBnX2Fzc2VydCAoVF9URVNUX0lTX0VNUFRZIChmb28pKTsKKworICBnX29iamVjdF91bnJlZiAoZm9vKTsKKyAgZm9vID0gTlVMTDsKKworICAvKiBBIFdyYXBwZXIncyBmb28gcHJvcGVydHkgY2FuIGJlIHJlcGxhY2VkLi4uICovCisgIGZvbyA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfRU1QVFksIE5VTEwpOworICBnX29iamVjdF9zZXQgKHdyYXBwZXIsICJmb28iLCBmb28sIE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmIChmb28pOworICBmb28gPSBOVUxMOworCisgIGdfb2JqZWN0X2dldCAod3JhcHBlciwgImZvbyIsICZmb28sIE5VTEwpOworICBnX2Fzc2VydCAoZm9vICE9IE5VTEwpOworICBnX2Fzc2VydCAoVF9URVNUX0lTX0VNUFRZIChmb28pKTsKKworICBnX29iamVjdF91bnJlZiAoZm9vKTsKKyAgZm9vID0gTlVMTDsKKworICAvKiAuLi5vciBzZXQgdG8gTlVMTCAqLworICBnX29iamVjdF9zZXQgKHdyYXBwZXIsICJmb28iLCBOVUxMLCBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0ICh3cmFwcGVyLCAiZm9vIiwgJmZvbywgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGZvbyA9PSBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAod3JhcHBlcik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3NlcnZpY2VzX2luaGVyaXRlZCAodm9pZCkKK3sKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sOworICBUVGVzdEluaGVyaXRlZENsaWVudCAqaW5oZXJpdGVkX2NsaWVudDsKKyAgR09iamVjdCAqaW5wdXRfcHJvdG9jb2wsICpvdXRwdXRfcHJvdG9jb2w7CisKKyAgcHJvdG9jb2wgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgTlVMTCk7CisgIGluaGVyaXRlZF9jbGllbnQgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0lOSEVSSVRFRF9DTElFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIC8qIFRUZXN0SW5oZXJpdGVkQ2xpZW50IGluaGVyaXRzIGZyb20gVFRlc3RTcnZDbGllbnQgKi8KKyAgZ19hc3NlcnQgKGdfdHlwZV9pc19hIChUX1RFU1RfVFlQRV9JTkhFUklURURfQ0xJRU5ULAorICAgICAgICAgICAgICAgICAgICAgICBUX1RFU1RfVFlQRV9TUlZfQ0xJRU5UKSk7CisKKyAgLyogVFRlc3RJbmhlcml0ZWRDbGllbnQgaW1wbGVtZW50cyBUVGVzdFNydkNsaWVudCdzIGludGVyZmFjZSAqLworICBnX2Fzc2VydCAoZ190eXBlX2lzX2EgKFRfVEVTVF9UWVBFX0lOSEVSSVRFRF9DTElFTlQsCisgICAgICAgICAgICAgICAgICAgICAgIFRfVEVTVF9UWVBFX1NSVl9JRikpOworCisgIC8qIFRUZXN0SW5oZXJpdGVkQ2xpZW50J3MgaW5oZXJpdGVkIHByb3BlcnRpZXMgY2FuIGJlIHNldCBhbmQgcmV0cmlldmVkICovCisgIGdfb2JqZWN0X3NldCAoaW5oZXJpdGVkX2NsaWVudCwKKyAgICAgICAgICAgICAgICAiaW5wdXRfcHJvdG9jb2wiLCBwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAib3V0cHV0X3Byb3RvY29sIiwgcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19vYmplY3RfZ2V0IChpbmhlcml0ZWRfY2xpZW50LAorICAgICAgICAgICAgICAgICJpbnB1dF9wcm90b2NvbCIsICZpbnB1dF9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAib3V0cHV0X3Byb3RvY29sIiwgJm91dHB1dF9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBnX2Fzc2VydCAoaW5wdXRfcHJvdG9jb2wgPT0gR19PQkpFQ1QocHJvdG9jb2wpKTsKKyAgZ19hc3NlcnQgKG91dHB1dF9wcm90b2NvbCA9PSBHX09CSkVDVChwcm90b2NvbCkpOworCisgIGdfb2JqZWN0X3VucmVmIChvdXRwdXRfcHJvdG9jb2wpOworICBnX29iamVjdF91bnJlZiAoaW5wdXRfcHJvdG9jb2wpOworICBnX29iamVjdF91bnJlZiAoaW5oZXJpdGVkX2NsaWVudCk7CisgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbCk7CiB9CiAKIGludAogbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogewotICBnX3R5cGVfaW5pdCgpOworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0ICgpOworI2VuZGlmCisKICAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CiAKLSAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8iLCB0ZXN0X2RlYnVnX3Byb3RvKTsKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL0RvdWJsZXMvQ3JlYXRlQW5kRGVzdHJveSIsCisgICAgIHRlc3Rfc3RydWN0c19kb3VibGVzX2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9Eb3VibGVzL0luaXRpYWxpemUiLAorICAgICB0ZXN0X3N0cnVjdHNfZG91Ymxlc19pbml0aWFsaXplKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvT25lT2ZFYWNoL0NyZWF0ZUFuZERlc3Ryb3kiLAorICAgICB0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfY3JlYXRlX2FuZF9kZXN0cm95KTsKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL09uZU9mRWFjaC9Jbml0aWFsaXplL0RlZmF1bHRWYWx1ZXMiLAorICAgICB0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfaW5pdGlhbGl6ZV9kZWZhdWx0X3ZhbHVlcyk7CisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9PbmVPZkVhY2gvSW5pdGlhbGl6ZS9TcGVjaWZpZWRWYWx1ZXMiLAorICAgICB0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfaW5pdGlhbGl6ZV9zcGVjaWZpZWRfdmFsdWVzKTsKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL09uZU9mRWFjaC9Qcm9wZXJ0aWVzL2J5dGVfbGlzdCIsCisgICAgIHRlc3Rfc3RydWN0c19vbmVfb2ZfZWFjaF9wcm9wZXJ0aWVzX2J5dGVfbGlzdCk7CisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9PbmVPZkVhY2gvUHJvcGVydGllcy9pMTZfbGlzdCIsCisgICAgIHRlc3Rfc3RydWN0c19vbmVfb2ZfZWFjaF9wcm9wZXJ0aWVzX2kxNl9saXN0KTsKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL09uZU9mRWFjaC9Qcm9wZXJ0aWVzL2k2NF9saXN0IiwKKyAgICAgdGVzdF9zdHJ1Y3RzX29uZV9vZl9lYWNoX3Byb3BlcnRpZXNfaTY0X2xpc3QpOworCisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9OZXN0aW5nL0NyZWF0ZUFuZERlc3Ryb3kiLAorICAgICB0ZXN0X3N0cnVjdHNfbmVzdGluZ19jcmVhdGVfYW5kX2Rlc3Ryb3kpOworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvTmVzdGluZy9Qcm9wZXJ0aWVzL215X2JvbmsiLAorICAgICB0ZXN0X3N0cnVjdHNfbmVzdGluZ19wcm9wZXJ0aWVzX215X2JvbmspOworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvTmVzdGluZy9Qcm9wZXJ0aWVzL215X29vZSIsCisgICAgIHRlc3Rfc3RydWN0c19uZXN0aW5nX3Byb3BlcnRpZXNfbXlfb29lKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvSG9seU1vbGV5L0NyZWF0ZUFuZERlc3Ryb3kiLAorICAgICB0ZXN0X3N0cnVjdHNfaG9seV9tb2xleV9jcmVhdGVfYW5kX2Rlc3Ryb3kpOworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvSG9seU1vbGV5L1Byb3BlcnRpZXMvYmlnIiwKKyAgICAgdGVzdF9zdHJ1Y3RzX2hvbHlfbW9sZXlfcHJvcGVydGllc19iaWcpOworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvSG9seU1vbGV5L1Byb3BlcnRpZXMvY29udGFpbiIsCisgICAgIHRlc3Rfc3RydWN0c19ob2x5X21vbGV5X3Byb3BlcnRpZXNfY29udGFpbik7CisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9Ib2x5TW9sZXkvUHJvcGVydGllcy9ib25rcyIsCisgICAgIHRlc3Rfc3RydWN0c19ob2x5X21vbGV5X3Byb3BlcnRpZXNfYm9ua3MpOworCisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9FbXB0eSIsCisgICAgIHRlc3Rfc3RydWN0c19lbXB0eSk7CisKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL1dyYXBwZXIvQ3JlYXRlQW5kRGVzdHJveSIsCisgICAgIHRlc3Rfc3RydWN0c193cmFwcGVyX2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9XcmFwcGVyL1Byb3BlcnRpZXMvZm9vIiwKKyAgICAgdGVzdF9zdHJ1Y3RzX3dyYXBwZXJfcHJvcGVydGllc19mb28pOworCisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU2VydmljZXMvSW5oZXJpdGVkIiwKKyAgICAgdGVzdF9zZXJ2aWNlc19pbmhlcml0ZWQpOwogCiAgIHJldHVybiBnX3Rlc3RfcnVuICgpOwogfQotCi0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZmR0cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZmR0cmFuc3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZWE4OWJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmZHRyYW5zcG9ydC5jCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliL2dzdGRpby5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuaD4KKworc3RhdGljIGNvbnN0IGdjaGFyIFRFU1RfREFUQVsxMl0gPSAiYWJjZGUwMTIzNCEiOworCitzdGF0aWMgdm9pZAordGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdDsKKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQsICJmZCIsIC0xLCBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X29wZW5fYW5kX2Nsb3NlICh2b2lkKQoreworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydDsKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKmtsYXNzOworICBHRXJyb3IgKmVycm9yOworICBnaW50IGZkOworICBnY2hhciAqZmlsZW5hbWU7CisKKyAgZXJyb3IgPSBOVUxMOworICBmaWxlbmFtZSA9IE5VTEw7CisKKyAgZmQgPSBnX2ZpbGVfb3Blbl90bXAgKE5VTEwsICZmaWxlbmFtZSwgJmVycm9yKTsKKyAgZ19hc3NlcnQgKGZkID49IDApOworCisgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZCIsIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKTsKKyAga2xhc3MgPSBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KTsKKworICAvKiBvcGVuIGlzIG5vLW9wICovCisgIGdfYXNzZXJ0IChrbGFzcy0+aXNfb3BlbiAodHJhbnNwb3J0KSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+cGVlayAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKGtsYXNzLT5vcGVuICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX2Fzc2VydCAoa2xhc3MtPmlzX29wZW4gKHRyYW5zcG9ydCkpOworICBnX2Fzc2VydCAoa2xhc3MtPnBlZWsgKHRyYW5zcG9ydCwgJmVycm9yKSk7CisKKyAgZ19hc3NlcnQgKGtsYXNzLT5jbG9zZSAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKCEga2xhc3MtPm9wZW4gKHRyYW5zcG9ydCwgJmVycm9yKSk7CisgIGdfYXNzZXJ0ICghIGtsYXNzLT5pc19vcGVuICh0cmFuc3BvcnQpKTsKKyAgZ19hc3NlcnQgKCEga2xhc3MtPnBlZWsgKHRyYW5zcG9ydCwgJmVycm9yKSk7CisKKyAgLyogYWxyZWFkeSBjbG9zZWQgKi8KKyAgZ19hc3NlcnQgKGNsb3NlIChmZCkgIT0gMCk7CisgIGdfYXNzZXJ0IChlcnJubyA9PSBFQkFERik7CisKKyAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisKKyAgZ19yZW1vdmUgKGZpbGVuYW1lKTsKKyAgZ19mcmVlIChmaWxlbmFtZSk7CisKKyAgLyogdGVzdCBiYWQgZmQgKi8KKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAoZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZkIiwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpOworICBrbGFzcyA9IFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpOworCisgIGdfYXNzZXJ0ICghIGtsYXNzLT5pc19vcGVuICh0cmFuc3BvcnQpKTsKKyAgZXJyb3IgPSBOVUxMOworICBnX2Fzc2VydCAoISBrbGFzcy0+cGVlayAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZXJyb3IgPSBOVUxMOworICBnX2Fzc2VydCAoISBrbGFzcy0+b3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZXJyb3IgPSBOVUxMOworICBnX2Fzc2VydCAoISBrbGFzcy0+Y2xvc2UgKHRyYW5zcG9ydCwgJmVycm9yKSk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYW5kX3dyaXRlICh2b2lkKQoreworICBnY2hhciBvdXRfYnVmWzhdOworICBnY2hhciAqYjsKKyAgZ2ludCB3YW50LCBnb3Q7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0OworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqa2xhc3M7CisgIEdFcnJvciAqZXJyb3I7CisgIGdpbnQgZmQ7CisgIGdjaGFyICpmaWxlbmFtZTsKKworICBlcnJvciA9IE5VTEw7CisgIGZpbGVuYW1lID0gTlVMTDsKKworICBmZCA9IGdfZmlsZV9vcGVuX3RtcCAoTlVMTCwgJmZpbGVuYW1lLCAmZXJyb3IpOworICBnX2Fzc2VydCAoZmQgPj0gMCk7CisKKyAgLyogd3JpdGUgKi8KKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAoZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZkIiwgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpOworICBrbGFzcyA9IFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpOworICBnX2Fzc2VydCAoa2xhc3MtPmlzX29wZW4gKHRyYW5zcG9ydCkpOworICBnX2Fzc2VydCAoa2xhc3MtPndyaXRlICh0cmFuc3BvcnQsIChncG9pbnRlcikgVEVTVF9EQVRBLCAxMSwgJmVycm9yKSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+Zmx1c2ggKHRyYW5zcG9ydCwgJmVycm9yKSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+Y2xvc2UgKHRyYW5zcG9ydCwgJmVycm9yKSk7CisgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCisgIC8qIHJlYWQgKi8KKyAgZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSwgU19JUlVTUiB8IFNfSVdVU1IpOworICBnX2Fzc2VydCAoZmQgPj0gMCk7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAoZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZkIiwgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpOworICBrbGFzcyA9IFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpOworCisgIG1lbXNldChvdXRfYnVmLCAwLCA4KTsKKyAgYiA9IG91dF9idWY7CisgIHdhbnQgPSA3OworICB3aGlsZSAod2FudCA+IDApIHsKKyAgICBnb3QgPSBrbGFzcy0+cmVhZCAodHJhbnNwb3J0LCAoZ3BvaW50ZXIpIGIsIHdhbnQsICZlcnJvcik7CisgICAgZ19hc3NlcnQgKGdvdCA+IDAgJiYgZ290IDw9IHdhbnQpOworICAgIGIgKz0gZ290OworICAgIHdhbnQgLT0gZ290OworICB9CisgIGdfYXNzZXJ0IChtZW1jbXAgKG91dF9idWYsIFRFU1RfREFUQSwgNykgPT0gMCk7CisKKyAgbWVtc2V0KG91dF9idWYsIDAsIDgpOworICBiID0gb3V0X2J1ZjsKKyAgd2FudCA9IDQ7CisgIHdoaWxlICh3YW50ID4gMCkgeworICAgIGdvdCA9IGtsYXNzLT5yZWFkICh0cmFuc3BvcnQsIChncG9pbnRlcikgYiwgd2FudCwgJmVycm9yKTsKKyAgICBnX2Fzc2VydCAoZ290ID4gMCAmJiBnb3QgPD0gd2FudCk7CisgICAgYiArPSBnb3Q7CisgICAgd2FudCAtPSBnb3Q7CisgIH0KKyAgZ19hc3NlcnQgKG1lbWNtcCAob3V0X2J1ZiwgVEVTVF9EQVRBICsgNywgNCkgPT0gMCk7CisKKyAgZ19hc3NlcnQgKGtsYXNzLT5jbG9zZSAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisKKyAgLyogY2xlYW4gdXAgKi8KKworICBnX3JlbW92ZSAoZmlsZW5hbWUpOworICBnX2ZyZWUgKGZpbGVuYW1lKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0ICgpOworI2VuZGlmCisKKyAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CisKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RmZHRyYW5zcG9ydC9DcmVhdGVBbmREZXN0cm95IiwgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGZkdHJhbnNwb3J0L09wZW5BbmRDbG9zZSIsIHRlc3Rfb3Blbl9hbmRfY2xvc2UpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGZkdHJhbnNwb3J0L1JlYWRBbmRXcml0ZSIsIHRlc3RfcmVhZF9hbmRfd3JpdGUpOworCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmcmFtZWR0cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZnJhbWVkdHJhbnNwb3J0LmMKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAzMjY5YmY1Li4wMDhlNjFlCi0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZnJhbWVkdHJhbnNwb3J0LmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmcmFtZWR0cmFuc3BvcnQuYwpAQCAtMTcsMjIgKzE3LDIwIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgogCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oIgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgogCiAjZGVmaW5lIFRFU1RfREFUQSB7ICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJyB9CiAKLSNpbmNsdWRlICIuLi9zcmMvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMiCi0KLXN0YXRpYyBjb25zdCBjaGFyIFRFU1RfQUREUkVTU1tdID0gImxvY2FsaG9zdCI7Ci1zdGF0aWMgY29uc3Qgc2hvcnQgVEVTVF9QT1JUID0gNjQ0NDQ7CisjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMiCiAKIHN0YXRpYyB2b2lkIHRocmlmdF9zZXJ2ZXIgKGNvbnN0IGludCBwb3J0KTsKK3N0YXRpYyB2b2lkIHRocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKGNvbnN0IGludCBwb3J0LCBpbnQgdGltZXMpOwogCiAvKiB0ZXN0IG9iamVjdCBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KIHN0YXRpYyB2b2lkCkBAIC00NCwxMCArNDIsMTAgQEAKIAogICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOwogICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsIE5VTEwpOwotICBhc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKICAgZ19vYmplY3RfZ2V0IChHX09CSkVDVCAob2JqZWN0KSwgInRyYW5zcG9ydCIsICZ0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgInJfYnVmX3NpemUiLCAmcl9idWZfc2l6ZSwKLSAgICAgICAgICAgICAgICAid19idWZfc2l6ZSIsICZ3X2J1Zl9zaXplLCBOVUxMKTsKKwkJInJfYnVmX3NpemUiLCAmcl9idWZfc2l6ZSwKKwkJIndfYnVmX3NpemUiLCAmd19idWZfc2l6ZSwgTlVMTCk7CiAgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOwogfQogCkBAIC01NywzNSArNTUsNTMgQEAKICAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOwogICBHRXJyb3IgKmVyciA9IE5VTEw7CisgIHBpZF90IHBpZDsKKyAgaW50IHBvcnQgPSA1MTE5OTsKKyAgaW50IHN0YXR1czsKIAotICAvKiBjcmVhdGUgYSBUaHJpZnRTb2NrZXQgKi8KLSAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCA1MTE4OCwgTlVMTCk7IAorICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CiAKLSAgLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCi0gIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksIE5VTEwpOworICBpZiAoIHBpZCA9PSAwICkKKyAgICB7CisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICB0aHJpZnRfc29ja2V0X3NlcnZlcl9vcGVuIChwb3J0LDEpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKKwkvKiBjcmVhdGUgYSBUaHJpZnRTb2NrZXQgKi8KKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSJwb3J0IiwgcG9ydCwgTlVMTCk7CiAKLSAgLyogdGhpcyBzaG91bGRuJ3Qgd29yayAqLwotICBhc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gRkFMU0UpOwotICBhc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gVFJVRSk7Ci0gIGFzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7Ci0gIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOwotICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKIAotICAvKiB0cnkgYW5kIHVuZGVybHlpbmcgc29ja2V0IGZhaWx1cmUgKi8KLSAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0LmJyb2tlbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCS8qIHRoaXMgc2hvdWxkbid0IHdvcmsgKi8KKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogCi0gIC8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLwotICB0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKKwkvKiB0cnkgYW5kIHVuZGVybHlpbmcgc29ja2V0IGZhaWx1cmUgKi8KKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QuYnJva2VuIiwKKwkJCQlOVUxMKTsKIAotICBhc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgJmVycikgPT0gRkFMU0UpOwotICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKLSAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwotICBnX2Vycm9yX2ZyZWUgKGVycik7Ci0gIGVyciA9IE5VTEw7CisJLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKKworCWdfYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsICZlcnIpID09IEZBTFNFKTsKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJZ19lcnJvcl9mcmVlIChlcnIpOworCWVyciA9IE5VTEw7CisKKwlnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOworCWdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC05OSw0OSArMTE1LDE1NiBAQAogICBndWNoYXIgYnVmWzEwXSA9IFRFU1RfREFUQTsgLyogYSBidWZmZXIgKi8KIAogICBwaWQgPSBmb3JrICgpOwotICBhc3NlcnQgKCBwaWQgPj0gMCApOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CiAKICAgaWYgKCBwaWQgPT0gMCApCi0gIHsKLSAgICAvKiBjaGlsZCBsaXN0ZW5zICovCi0gICAgdGhyaWZ0X3NlcnZlciAocG9ydCk7Ci0gICAgZXhpdCAoMCk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KLSAgICBzbGVlcCAoMSk7CisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgdGhyaWZ0X3NlcnZlciAocG9ydCk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOwogCi0gICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOwotICAgIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3X2J1Zl9zaXplIiwgNCwgTlVMTCk7CisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKKwkJCQkgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKKwkJCQkgICJ3X2J1Zl9zaXplIiwgNCwgTlVMTCk7CiAKLSAgICBhc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CiAKLSAgICAvKiB3cml0ZSAxMCBieXRlcyAqLwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCS8qIHdyaXRlIDEwIGJ5dGVzICovCisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKLSAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKIAotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwogCi0gICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKIAotICAgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOwotICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiAKLSAgICBhc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKLSAgICBhc3NlcnQgKCBzdGF0dXMgPT0gMCApOworCWdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7CisJZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAgIH0KK30KKworLyogdGVzdCByZWFkaW5nIGZyb20gdGhlIHRyYW5zcG9ydCBhZnRlciB0aGUgcGVlciBoYXMgdW5leHBlY3RlZGx5CisgICBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gKi8KK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYWZ0ZXJfcGVlcl9jbG9zZSh2b2lkKQoreworICBpbnQgc3RhdHVzOworICBwaWRfdCBwaWQ7CisgIGludCBwb3J0ID0gNTExOTk7CisgIEdFcnJvciAqZXJyID0gTlVMTDsKKworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAocGlkID49IDApOworCisgIGlmIChwaWQgPT0gMCkKKyAgICB7CisgICAgICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnNlcnZlcl90cmFuc3BvcnQgPSBOVUxMOworICAgICAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnRfdHJhbnNwb3J0ID0gTlVMTDsKKworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgc2VydmVyX3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkgICAgICAgInBvcnQiLCBwb3J0LAorCQkJCSAgICAgICBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChzZXJ2ZXJfdHJhbnNwb3J0ICE9IE5VTEwpOworCisgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHNlcnZlcl90cmFuc3BvcnQsICZlcnIpOworICAgICAgZ19hc3NlcnQgKGVyciA9PSBOVUxMKTsKKworICAgICAgLyogd3JhcCB0aGUgY2xpZW50IHRyYW5zcG9ydCBpbiBhIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqLworICAgICAgY2xpZW50X3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldworCSAgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCisJICAgInRyYW5zcG9ydCIsICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHNlcnZlcl90cmFuc3BvcnQsICZlcnIpLAorCSAgICJyX2J1Zl9zaXplIiwgMCwKKwkgICBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChlcnIgPT0gTlVMTCk7CisgICAgICBnX2Fzc2VydCAoY2xpZW50X3RyYW5zcG9ydCAhPSBOVUxMKTsKKworICAgICAgLyogY2xvc2UgdGhlIGNvbm5lY3Rpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGNsaWVudCBjb25uZWN0cyAqLworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50X3RyYW5zcG9ydCwgTlVMTCk7CisKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChzZXJ2ZXJfdHJhbnNwb3J0KTsKKworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwlUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworCVRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKwlndWNoYXIgYnVmWzEwXTsgLyogYSBidWZmZXIgKi8KKworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOworCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULAorCQkJCSJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSJwb3J0IiwgICAgIHBvcnQsCisJCQkJTlVMTCk7CisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsICBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKKwkJCQkgICJ3X2J1Zl9zaXplIiwgMCwKKwkJCQkgIE5VTEwpOworCisJZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKworCS8qIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHRoZSB0cmFuc3BvcnQgYWZ0ZXIgdGhlIHBlZXIgaGFzIGNsb3NlZAorICAgICAgIHRoZSBjb25uZWN0aW9uIGZhaWxzIGdyYWNlZnVsbHkgd2l0aG91dCBnZW5lcmF0aW5nIGEgY3JpdGljYWwKKyAgICAgICB3YXJuaW5nIG9yIHNlZ21lbnRhdGlvbiBmYXVsdCAqLworCXRocmlmdF90cmFuc3BvcnRfcmVhZCAodHJhbnNwb3J0LCBidWYsIDEwLCAmZXJyKTsKKwlnX2Fzc2VydCAoZXJyICE9IE5VTEwpOworCisJZ19lcnJvcl9mcmVlIChlcnIpOworCWVyciA9IE5VTEw7CisKKwl0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kICh0cmFuc3BvcnQsICZlcnIpOworCWdfYXNzZXJ0IChlcnIgPT0gTlVMTCk7CisKKwl0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsICZlcnIpOworCWdfYXNzZXJ0IChlcnIgPT0gTlVMTCk7CisKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisKKwlnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKwlnX2Fzc2VydCAoc3RhdHVzID09IDApOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKGNvbnN0IGludCBwb3J0LCBpbnQgdGltZXMpCit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBpbnQgaTsKKworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJCSAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgIGZvcihpPTA7aTx0aW1lcztpKyspeworICAgICAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOworICAgICAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKyAgICAgIHRocmlmdF9zb2NrZXRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKICAgfQorICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xNTAsMjUgKzI3MywyNSBAQAogICBpbnQgYnl0ZXMgPSAwOwogICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CiAgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKLSAgZ3VjaGFyIGJ1ZlsxMF07IC8qIGEgYnVmZmVyICovCisgIGd1Y2hhciBidWZbMTJdOyAvKiBhIGJ1ZmZlciAqLwogICBndWNoYXIgbWF0Y2hbMTBdID0gVEVTVF9EQVRBOwogCiAgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworCQkJCQkgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOwogCiAgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOwogCiAgIC8qIHdyYXAgdGhlIGNsaWVudCBpbiBhIEJ1ZmZlcmVkVHJhbnNwb3J0ICovCiAgIGNsaWVudCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwgInRyYW5zcG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJyX2J1Zl9zaXplIiwgNSwgTlVMTCk7Ci0gIGFzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCQkJIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKSwKKwkJCSAicl9idWZfc2l6ZSIsIDUsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOwogCiAgIC8qIHJlYWQgMTAgYnl0ZXMgKi8KICAgYnl0ZXMgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkIChjbGllbnQsIGJ1ZiwgMTAsIE5VTEwpOwotICBhc3NlcnQgKGJ5dGVzID09IDEwKTsgLyogbWFrZSBzdXJlIHdlJ3ZlIHJlYWQgMTAgYnl0ZXMgKi8KLSAgYXNzZXJ0ICggbWVtY21wIChidWYsIG1hdGNoLCAxMCkgPT0gMCApOyAvKiBtYWtlIHN1cmUgd2hhdCB3ZSBnb3QgbWF0Y2hlcyAqLworICBnX2Fzc2VydCAoYnl0ZXMgPT0gMTApOyAvKiBtYWtlIHN1cmUgd2UndmUgcmVhZCAxMCBieXRlcyAqLworICBnX2Fzc2VydCAoIG1lbWNtcCAoYnVmLCBtYXRjaCwgMTApID09IDAgKTsgLyogbWFrZSBzdXJlIHdoYXQgd2UgZ290IG1hdGNoZXMgKi8KIAogICBieXRlcyA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudCwgYnVmLCA2LCBOVUxMKTsKICAgYnl0ZXMgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkIChjbGllbnQsIGJ1ZiwgNSwgTlVMTCk7CkBAIC0xODUsMTIgKzMwOCwxNiBAQAogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKICAgZ190eXBlX2luaXQoKTsKKyNlbmRpZgorCiAgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOwogCiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0ZnJhbWVkdHJhbnNwb3J0L0NyZWF0ZUFuZERlc3Ryb3kiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSk7CiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0ZnJhbWVkdHJhbnNwb3J0L09wZW5BbmRDbG9zZSIsIHRlc3Rfb3Blbl9hbmRfY2xvc2UpOwogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGZyYW1lZHRyYW5zcG9ydC9SZWFkQW5kV3JpdGUiLCB0ZXN0X3JlYWRfYW5kX3dyaXRlKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RmcmFtZWR0cmFuc3BvcnQvUmVhZEFmdGVyUGVlckNsb3NlIiwgdGVzdF9yZWFkX2FmdGVyX3BlZXJfY2xvc2UpOwogCiAgIHJldHVybiBnX3Rlc3RfcnVuICgpOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RtZW1vcnlidWZmZXIuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0bWVtb3J5YnVmZmVyLmMKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA2NTkwMWJmLi45ZmI2OGI5Ci0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0bWVtb3J5YnVmZmVyLmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RtZW1vcnlidWZmZXIuYwpAQCAtMTcsNzkgKzE3LDIwNyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CiAKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfc29ja2V0LmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmgiCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CiAKLSNkZWZpbmUgVEVTVF9EQVRBIHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onIH0KK3N0YXRpYyBjb25zdCBnY2hhciBURVNUX0RBVEFbMTFdID0gImFiY2RlZmdoaWoiOwogCi0jaW5jbHVkZSAiLi4vc3JjL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jIgorI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jIgogCiAvKiB0ZXN0IG9iamVjdCBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KIHN0YXRpYyB2b2lkCi10ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSh2b2lkKQordGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kgKHZvaWQpCiB7CiAgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7Ci0gIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgTlVMTCk7Ci0gIGFzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImJ1Zl9zaXplIiwgMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CiAgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOwogfQogCiBzdGF0aWMgdm9pZAotdGVzdF9vcGVuX2FuZF9jbG9zZSh2b2lkKQordGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfbGFyZ2UgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmX3NpemUiLCAxMCAqIDEwMjQgKiAxMDI0LAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY3JlYXRlX2FuZF9kZXN0cm95X2RlZmF1bHQgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfZXh0ZXJuYWwgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisgIEdCeXRlQXJyYXkgKmJ1ZiA9IGdfYnl0ZV9hcnJheV9uZXcgKCk7CisgIGdfYXNzZXJ0IChidWYgIT0gTlVMTCk7CisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmIiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY3JlYXRlX2FuZF9kZXN0cm95X3Vub3duZWQgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisgIEdWYWx1ZSB2YWwgPSBHX1ZBTFVFX0lOSVQ7CisgIEdCeXRlQXJyYXkgKmJ1ZjsKKworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIm93bmVyIiwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisKKyAgZ192YWx1ZV9pbml0ICgmdmFsLCBHX1RZUEVfUE9JTlRFUik7CisgIGdfb2JqZWN0X2dldF9wcm9wZXJ0eSAob2JqZWN0LCAiYnVmIiwgJnZhbCk7CisgIGJ1ZiA9IChHQnl0ZUFycmF5KikgZ192YWx1ZV9nZXRfcG9pbnRlciAoJnZhbCk7CisgIGdfYXNzZXJ0IChidWYgIT0gTlVMTCk7CisKKyAgZ19ieXRlX2FycmF5X3VucmVmIChidWYpOworICBnX3ZhbHVlX3Vuc2V0ICgmdmFsKTsKKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X29wZW5fYW5kX2Nsb3NlICh2b2lkKQogewogICBUaHJpZnRNZW1vcnlCdWZmZXIgKnRidWZmZXIgPSBOVUxMOwogCiAgIC8qIGNyZWF0ZSBhIFRocmlmdE1lbW9yeUJ1ZmZlciAqLwogICB0YnVmZmVyID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCBOVUxMKTsKIAotICAvKiB0aGlzIHNob3VsZG4ndCB3b3JrICovCi0gIGFzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfb3BlbiAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksIE5VTEwpID09IFRSVUUpOwotICBhc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX2lzX29wZW4gKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpKSA9PSBUUlVFKTsKLSAgYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jbG9zZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksIE5VTEwpID09IFRSVUUpOworICAvKiBuby1vcHMgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX29wZW4gKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLCBOVUxMKSA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX2lzX29wZW4gKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpKSA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX2Nsb3NlIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwgTlVMTCkgPT0gVFJVRSk7CisKICAgZ19vYmplY3RfdW5yZWYgKHRidWZmZXIpOwogfQogCiBzdGF0aWMgdm9pZAotdGVzdF9yZWFkX2FuZF93cml0ZSh2b2lkKQordGVzdF9yZWFkX2FuZF93cml0ZSAodm9pZCkKIHsKICAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0YnVmZmVyID0gTlVMTDsKLSAgZ3VjaGFyIGJ1ZlsxMF0gPSBURVNUX0RBVEE7Ci0gIGd1Y2hhciByZWFkWzEwXTsKKyAgZ2ludCBnb3QsIHdhbnQ7CisgIGdjaGFyIHJlYWRbMTBdOworICBnY2hhciAqYjsKICAgR0Vycm9yICplcnJvciA9IE5VTEw7CiAKICAgdGJ1ZmZlciA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgImJ1Zl9zaXplIiwgNSwgTlVMTCk7Ci0gIGFzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpIGJ1ZiwKKyAgZ19hc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSBURVNUX0RBVEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLCAmZXJyb3IpID09IEZBTFNFKTsKLSAgYXNzZXJ0IChlcnJvciAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKGVycm9yICE9IE5VTEwpOwogICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKICAgZXJyb3IgPSBOVUxMOwogICBnX29iamVjdF91bnJlZiAodGJ1ZmZlcik7CiAKICAgdGJ1ZmZlciA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgImJ1Zl9zaXplIiwgMTUsIE5VTEwpOwotICBhc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSBidWYsIDEwLCAmZXJyb3IpID09IFRSVUUpOwotICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpIFRFU1RfREFUQSwgMTAsICZlcnJvcikgPT0gVFJVRSk7CisgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKIAotICBhc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWQgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFkLCAxMCwgJmVycm9yKSA+IDApOwotICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworICBtZW1zZXQocmVhZCwgMCwgMTApOworICBiID0gcmVhZDsKKyAgd2FudCA9IDEwOworICB3aGlsZSAod2FudCA+IDApIHsKKyAgICBnb3QgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9yZWFkIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpIGIsIHdhbnQsICZlcnJvcik7CisgICAgZ19hc3NlcnQgKGdvdCA+IDAgJiYgZ290IDw9IHdhbnQpOworICAgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgICBiICs9IGdvdDsKKyAgICB3YW50IC09IGdvdDsKKyAgfQorICBnX2Fzc2VydCAobWVtY21wIChyZWFkLCBURVNUX0RBVEEsIDEwKSA9PSAwKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRidWZmZXIpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkX2FuZF93cml0ZV9kZWZhdWx0ICh2b2lkKQoreworICBUaHJpZnRNZW1vcnlCdWZmZXIgKnRidWZmZXIgPSBOVUxMOworICBnaW50IGdvdCwgd2FudCwgaTsKKyAgZ2NoYXIgcmVhZFsxMF07CisgIGdjaGFyICpiOworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKworICB0YnVmZmVyID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCBOVUxMKTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMDsgKytpKSB7CisgICAgZ19hc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpIFRFU1RfREFUQSwgMTAsICZlcnJvcikgPT0gVFJVRSk7CisgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IDEwMDsgKytpKSB7CisgICAgbWVtc2V0KHJlYWQsIDAsIDEwKTsKKyAgICBiID0gcmVhZDsKKyAgICB3YW50ID0gMTA7CisgICAgd2hpbGUgKHdhbnQgPiAwKSB7CisgICAgICBnb3QgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9yZWFkIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgYiwgd2FudCwgJmVycm9yKTsKKyAgICAgIGdfYXNzZXJ0IChnb3QgPiAwICYmIGdvdCA8PSB3YW50KTsKKyAgICAgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgICAgIGIgKz0gZ290OworICAgICAgd2FudCAtPSBnb3Q7CisgICAgfQorICAgIGdfYXNzZXJ0IChtZW1jbXAgKHJlYWQsIFRFU1RfREFUQSwgMTApID09IDApOworICB9CisgIGdfb2JqZWN0X3VucmVmICh0YnVmZmVyKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmVhZF9hbmRfd3JpdGVfZXh0ZXJuYWwgKHZvaWQpCit7CisgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdGJ1ZmZlciA9IE5VTEw7CisgIGdjaGFyICpiOworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKyAgR0J5dGVBcnJheSAqYnVmID0gZ19ieXRlX2FycmF5X25ldyAoKTsKKyAgZ19hc3NlcnQgKGJ1ZiAhPSBOVUxMKTsKKworICB0YnVmZmVyID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCAiYnVmIiwgYnVmLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSBURVNUX0RBVEEsIDEwLCAmZXJyb3IpID09IFRSVUUpOworICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisKKyAgZ19hc3NlcnQgKG1lbWNtcCAoYnVmLT5kYXRhLCBURVNUX0RBVEEsIDEwKSA9PSAwKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRidWZmZXIpOwogfQogCiBpbnQKIG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKLSAgZ190eXBlX2luaXQoKTsKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQorICBnX3R5cGVfaW5pdCAoKTsKKyNlbmRpZgorCiAgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOwogCiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0bWVtb3J5YnVmZmVyL0NyZWF0ZUFuZERlc3Ryb3kiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0bWVtb3J5YnVmZmVyL0NyZWF0ZUFuZERlc3Ryb3lMYXJnZSIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95X2xhcmdlKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvQ3JlYXRlQW5kRGVzdHJveVVubGltaXRlZCIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95X2RlZmF1bHQpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9DcmVhdGVBbmREZXN0cm95RXh0ZXJuYWwiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveV9leHRlcm5hbCk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0bWVtb3J5YnVmZmVyL0NyZWF0ZUFuZERlc3Ryb3lVbm93bmVkIiwgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfdW5vd25lZCk7CiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0bWVtb3J5YnVmZmVyL09wZW5BbmRDbG9zZSIsIHRlc3Rfb3Blbl9hbmRfY2xvc2UpOwogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9SZWFkQW5kV3JpdGUiLCB0ZXN0X3JlYWRfYW5kX3dyaXRlKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvUmVhZEFuZFdyaXRlVW5saW1pdGVkIiwgdGVzdF9yZWFkX2FuZF93cml0ZV9kZWZhdWx0KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvUmVhZEFuZFdyaXRlRXh0ZXJuYWwiLCB0ZXN0X3JlYWRfYW5kX3dyaXRlX2V4dGVybmFsKTsKIAogICByZXR1cm4gZ190ZXN0X3J1biAoKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0b3B0aW9uYWxyZXF1aXJlZC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RvcHRpb25hbHJlcXVpcmVkLmMKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA3MTY1ZDkzLi42MzZjMzZkCi0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0b3B0aW9uYWxyZXF1aXJlZC5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0b3B0aW9uYWxyZXF1aXJlZC5jCkBAIC0xNywxMyArMTcsMTIgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxnbGliLmg+CiAKLSNpbmNsdWRlICJ0aHJpZnRfc3RydWN0LmgiCi0jaW5jbHVkZSAicHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmgiCi0jaW5jbHVkZSAicHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oIgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaD4KICNpbmNsdWRlICJnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmgiCiAKICNpbmNsdWRlICJnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmMiCkBAIC01NSw4ICs1NCwxMCBAQAogICBvLT5pbV9pbnQgPSAxMDsKICAgby0+aW1fc3RyID0gZ19zdHJkdXAgKCJ0ZXN0Iik7CiAgIG8tPmltX2JpZyA9IGdfcHRyX2FycmF5X25ldyAoKTsKLSAgZ19wdHJfYXJyYXlfZnJlZSAoby0+aW1fYmlnLCBGQUxTRSk7CisgIGdfcHRyX2FycmF5X2ZyZWUgKG8tPmltX2JpZywgVFJVRSk7CisgIG8tPmltX2JpZyA9IE5VTEw7CiAgIGdfZnJlZSAoby0+aW1fc3RyKTsKKyAgby0+aW1fc3RyID0gTlVMTDsKICAgZ19vYmplY3RfdW5yZWYgKG8pOwogfQogCkBAIC03MiwyMCArNzMsMjAgQEAKICAgczIgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1NJTVBMRSwgTlVMTCk7CiAgIHMzID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9TSU1QTEUsIE5VTEwpOwogCi0gIC8vIHdyaXRlLXRvLXJlYWQgd2l0aCBvcHRpb25hbCBmaWVsZHMKKyAgLyogd3JpdGUtdG8tcmVhZCB3aXRoIG9wdGlvbmFsIGZpZWxkcyAqLwogICBzMS0+aW1fb3B0aW9uYWwgPSAxMDsKLSAgYXNzZXJ0IChzMS0+X19pc3NldF9pbV9kZWZhdWx0ID09IEZBTFNFKTsKLSAgYXNzZXJ0IChzMS0+X19pc3NldF9pbV9vcHRpb25hbCA9PSBGQUxTRSk7ICAKKyAgZ19hc3NlcnQgKHMxLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gRkFMU0UpOworICBnX2Fzc2VydCAoczEtPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gRkFMU0UpOyAgCiAgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHMxKSwgVEhSSUZUX1NUUlVDVCAoczIpLCBOVUxMLCBOVUxMKTsKLSAgYXNzZXJ0IChzMi0+X19pc3NldF9pbV9kZWZhdWx0ID0gVFJVRSk7Ci0gIGFzc2VydCAoczItPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gRkFMU0UpOwotICBhc3NlcnQgKHMyLT5pbV9vcHRpb25hbCA9PSAwKTsKKyAgZ19hc3NlcnQgKHMyLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gVFJVRSk7CisgIGdfYXNzZXJ0IChzMi0+X19pc3NldF9pbV9vcHRpb25hbCA9PSBGQUxTRSk7CisgIGdfYXNzZXJ0IChzMi0+aW1fb3B0aW9uYWwgPT0gMCk7CiAKICAgczEtPl9faXNzZXRfaW1fb3B0aW9uYWwgPSBUUlVFOwogICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUIChzMSksIFRIUklGVF9TVFJVQ1QgKHMzKSwgTlVMTCwgTlVMTCk7Ci0gIGFzc2VydCAoczMtPl9faXNzZXRfaW1fZGVmYXVsdCA9PSBUUlVFKTsKLSAgYXNzZXJ0IChzMy0+X19pc3NldF9pbV9vcHRpb25hbCA9PSBUUlVFKTsKLSAgYXNzZXJ0IChzMy0+aW1fb3B0aW9uYWwgPT0gMTApOworICBnX2Fzc2VydCAoczMtPl9faXNzZXRfaW1fZGVmYXVsdCA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKHMzLT5fX2lzc2V0X2ltX29wdGlvbmFsID09IFRSVUUpOworICBnX2Fzc2VydCAoczMtPmltX29wdGlvbmFsID09IDEwKTsKIAogICBnX29iamVjdF91bnJlZiAoczEpOwogICBnX29iamVjdF91bnJlZiAoczIpOwpAQCAtMTA3LDEwICsxMDgsMTAgQEAKICAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAodDIpLCBUSFJJRlRfU1RSVUNUICh0MSksIE5VTEwsIE5VTEwpOwogICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUICh0MSksIFRIUklGVF9TVFJVQ1QgKHQyKSwgTlVMTCwgTlVMTCk7CiAKLSAgYXNzZXJ0ICh0MS0+X19pc3NldF9pbV9kZWZhdWx0ID09IEZBTFNFKTsKLSAgYXNzZXJ0ICh0Mi0+X19pc3NldF9pbV9vcHRpb25hbCA9PSBUUlVFKTsKLSAgYXNzZXJ0ICh0MS0+aW1fZGVmYXVsdCA9PSB0Mi0+aW1fb3B0aW9uYWwpOwotICBhc3NlcnQgKHQxLT5pbV9kZWZhdWx0ID09IDApOworICBnX2Fzc2VydCAodDEtPl9faXNzZXRfaW1fZGVmYXVsdCA9PSBGQUxTRSk7CisgIGdfYXNzZXJ0ICh0Mi0+X19pc3NldF9pbV9vcHRpb25hbCA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKHQxLT5pbV9kZWZhdWx0ID09IHQyLT5pbV9vcHRpb25hbCk7CisgIGdfYXNzZXJ0ICh0MS0+aW1fZGVmYXVsdCA9PSAwKTsKIAogICBnX29iamVjdF91bnJlZiAodDEpOwogICBnX29iamVjdF91bnJlZiAodDIpOwpAQCAtMTMxLDcgKzEzMiw3IEBACiAgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQxKSwgVEhSSUZUX1NUUlVDVCAodDMpLCBOVUxMLCBOVUxMKTsKICAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAodDMpLCBUSFJJRlRfU1RSVUNUICh0MSksIE5VTEwsIE5VTEwpOwogCi0gIGFzc2VydCAodDEtPl9faXNzZXRfaW1fZGVmYXVsdCA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKHQxLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gVFJVRSk7CiAKICAgZ19vYmplY3RfdW5yZWYgKHQxKTsKICAgZ19vYmplY3RfdW5yZWYgKHQzKTsKQEAgLTE3MiwyMyArMTczLDQ2IEBACiAgIHQyID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9UUklDS1kyLCBOVUxMKTsKICAgdDMgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1RSSUNLWTMsIE5VTEwpOwogCi0gIC8vIHRocm93cyBwcm90b2NvbCBleGNlcHRpb24KKyAgLyogdGhyb3dzIHByb3RvY29sIGV4Y2VwdGlvbiAqLwogICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUICh0MiksIFRIUklGVF9TVFJVQ1QgKHQzKSwgTlVMTCwgJnJlYWRfZXJyb3IpOwotICBhc3NlcnQgKHJlYWRfZXJyb3IgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChyZWFkX2Vycm9yICE9IE5VTEwpOwogICBnX2Vycm9yX2ZyZWUgKHJlYWRfZXJyb3IpOwogCiAgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQzKSwgVEhSSUZUX1NUUlVDVCAodDIpLCBOVUxMLCBOVUxMKTsKIAotICBhc3NlcnQgKHQyLT5fX2lzc2V0X2ltX29wdGlvbmFsKTsKKyAgZ19hc3NlcnQgKHQyLT5fX2lzc2V0X2ltX29wdGlvbmFsKTsKIAogICBnX29iamVjdF91bnJlZiAodDIpOwogICBnX29iamVjdF91bnJlZiAodDMpOwogfQogCitzdGF0aWMgdm9pZAordGVzdF9ub25fc2V0X2JpbmFyeSAodm9pZCkKK3sKKyAgVFRlc3RCaW5hcmllcyAqYjEgPSBOVUxMOworICBUVGVzdEJpbmFyaWVzICpiMiA9IE5VTEw7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworCisgIGIxID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9CSU5BUklFUywgTlVMTCk7CisgIGIyID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9CSU5BUklFUywgTlVMTCk7CisKKyAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAoYjEpLCBUSFJJRlRfU1RSVUNUIChiMiksIE5VTEwsICZlcnJvcik7CisgIGdfYXNzZXJ0KCFlcnJvcik7CisgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKGIyKSwgVEhSSUZUX1NUUlVDVCAoYjEpLCBOVUxMLCAmZXJyb3IpOworICBnX2Fzc2VydCghZXJyb3IpOworICAvKiBPSy4gTm8gc2VnZmF1bHQgKi8KKworICBnX29iamVjdF91bnJlZiAoYjEpOworICBnX29iamVjdF91bnJlZiAoYjIpOworfQorCiBpbnQKIG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQogICBnX3R5cGVfaW5pdCgpOworI2VuZGlmCisKICAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CiAKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RvcHRpb25hbHJlcXVpcmVkL09sZFNjaG9vbCIsIHRlc3Rfb2xkX3NjaG9vbDEpOwpAQCAtMTk3LDYgKzIyMSw3IEBACiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0b3B0aW9uYWxyZXF1aXJlZC9Ucmlja3kyIiwgdGVzdF90cmlja3kyKTsKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RvcHRpb25hbHJlcXVpcmVkL1RyaWNreTMiLCB0ZXN0X3RyaWNreTMpOwogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG9wdGlvbmFscmVxdWlyZWQvVHJpY2t5NCIsIHRlc3RfdHJpY2t5NCk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0b3B0aW9uYWxyZXF1aXJlZC9CaW5hcnkiLCB0ZXN0X25vbl9zZXRfYmluYXJ5KTsKIAogICByZXR1cm4gZ190ZXN0X3J1biAoKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0c2VyaWFsaXphdGlvbi5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzZXJpYWxpemF0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkNDExZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0c2VyaWFsaXphdGlvbi5jCkBAIC0wLDAgKzEsOTUgQEAKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgImdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuaCIKKyNpbmNsdWRlICJnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuaCIKKworc3RhdGljIHZvaWQgZW51bV9jb25zdGFudHNfcmVhZF93cml0ZSgpIHsKKyAgR0Vycm9yKiBlcnJvciA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCogdHJhbnNwb3J0CisgICAgICA9IFRIUklGVF9UUkFOU1BPUlQoZ19vYmplY3RfbmV3KFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsICJidWZfc2l6ZSIsIDEwMjQsIE5VTEwpKTsKKyAgVGhyaWZ0UHJvdG9jb2wqIHByb3RvY29sCisgICAgICA9IFRIUklGVF9QUk9UT0NPTChnX29iamVjdF9uZXcoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LCBOVUxMKSk7CisgIFRUZXN0RW51bVRlc3RTdHJ1Y3QqIHNyYyA9IFRfVEVTVF9FTlVNX1RFU1Q7CisgIFRUZXN0RW51bVRlc3RTdHJ1Y3QqIGRzdCA9IGdfb2JqZWN0X25ldyhUX1RFU1RfVFlQRV9FTlVNX1RFU1RfU1RSVUNULCBOVUxMKTsKKyAgVFRlc3RFbnVtVGVzdFN0cnVjdENsYXNzKiBjbHMgPSBUX1RFU1RfRU5VTV9URVNUX1NUUlVDVF9HRVRfQ0xBU1Moc3JjKTsKKyAgaW50IHdyaXRlX2xlbjsKKyAgaW50IHJlYWRfbGVuOworCisgIHdyaXRlX2xlbiA9IFRIUklGVF9TVFJVQ1RfQ0xBU1MoY2xzKS0+d3JpdGUoVEhSSUZUX1NUUlVDVChzcmMpLCBwcm90b2NvbCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgZ19hc3NlcnQod3JpdGVfbGVuID4gMCk7CisKKyAgcmVhZF9sZW4gPSBUSFJJRlRfU1RSVUNUX0NMQVNTKGNscyktPnJlYWQoVEhSSUZUX1NUUlVDVChkc3QpLCBwcm90b2NvbCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgZ19hc3NlcnRfY21waW50KHdyaXRlX2xlbiwgPT0sIHJlYWRfbGVuKTsKKworICBnX29iamVjdF91bnJlZihkc3QpOworICBnX29iamVjdF91bnJlZihwcm90b2NvbCk7CisgIGdfb2JqZWN0X3VucmVmKHRyYW5zcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0cnVjdF9jb25zdGFudHNfcmVhZF93cml0ZSgpIHsKKyAgR0Vycm9yKiBlcnJvciA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCogdHJhbnNwb3J0CisgICAgICA9IFRIUklGVF9UUkFOU1BPUlQoZ19vYmplY3RfbmV3KFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsICJidWZfc2l6ZSIsIDQwOTYsIE5VTEwpKTsKKyAgVGhyaWZ0UHJvdG9jb2wqIHByb3RvY29sCisgICAgICA9IFRIUklGVF9QUk9UT0NPTChnX29iamVjdF9uZXcoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LCBOVUxMKSk7CisgIFRUZXN0Q29tcGFjdFByb3RvVGVzdFN0cnVjdCogc3JjID0gVF9URVNUX0NPTVBBQ1RfVEVTVDsKKyAgVFRlc3RDb21wYWN0UHJvdG9UZXN0U3RydWN0KiBkc3QgPSBnX29iamVjdF9uZXcoVF9URVNUX1RZUEVfQ09NUEFDVF9QUk9UT19URVNUX1NUUlVDVCwgTlVMTCk7CisgIFRUZXN0Q29tcGFjdFByb3RvVGVzdFN0cnVjdENsYXNzKiBjbHMgPSBUX1RFU1RfQ09NUEFDVF9QUk9UT19URVNUX1NUUlVDVF9HRVRfQ0xBU1Moc3JjKTsKKyAgaW50IHdyaXRlX2xlbjsKKyAgaW50IHJlYWRfbGVuOworCisgIHdyaXRlX2xlbiA9IFRIUklGVF9TVFJVQ1RfQ0xBU1MoY2xzKS0+d3JpdGUoVEhSSUZUX1NUUlVDVChzcmMpLCBwcm90b2NvbCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgZ19hc3NlcnQod3JpdGVfbGVuID4gMCk7CisKKyAgcmVhZF9sZW4gPSBUSFJJRlRfU1RSVUNUX0NMQVNTKGNscyktPnJlYWQoVEhSSUZUX1NUUlVDVChkc3QpLCBwcm90b2NvbCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgZ19hc3NlcnRfY21waW50KHdyaXRlX2xlbiwgPT0sIHJlYWRfbGVuKTsKKworICBnX29iamVjdF91bnJlZihkc3QpOworICBnX29iamVjdF91bnJlZihwcm90b2NvbCk7CisgIGdfb2JqZWN0X3VucmVmKHRyYW5zcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0cnVjdF9yZWFkX3dyaXRlX2xlbmd0aF9zaG91bGRfZXF1YWwoKSB7CisgIEdFcnJvciogZXJyb3IgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQqIHRyYW5zcG9ydAorICAgICAgPSBUSFJJRlRfVFJBTlNQT1JUKGdfb2JqZWN0X25ldyhUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCAiYnVmX3NpemUiLCAyMDQ4LCBOVUxMKSk7CisgIFRocmlmdFByb3RvY29sKiBwcm90b2NvbAorICAgICAgPSBUSFJJRlRfUFJPVE9DT0woZ19vYmplY3RfbmV3KFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwgTlVMTCkpOworICBUVGVzdEJvbmsqIHNyYyA9IGdfb2JqZWN0X25ldyhUX1RFU1RfVFlQRV9CT05LLCBOVUxMKTsKKyAgVFRlc3RCb25rKiBkc3QgPSBnX29iamVjdF9uZXcoVF9URVNUX1RZUEVfQk9OSywgTlVMTCk7CisgIFRUZXN0Qm9ua0NsYXNzKiBjbHMgPSBUX1RFU1RfQk9OS19HRVRfQ0xBU1Moc3JjKTsKKyAgaW50IHdyaXRlX2xlbjsKKyAgaW50IHJlYWRfbGVuOworCisgIHdyaXRlX2xlbiA9IFRIUklGVF9TVFJVQ1RfQ0xBU1MoY2xzKS0+d3JpdGUoVEhSSUZUX1NUUlVDVChzcmMpLCBwcm90b2NvbCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgZ19hc3NlcnQod3JpdGVfbGVuID4gMCk7CisKKyAgcmVhZF9sZW4gPSBUSFJJRlRfU1RSVUNUX0NMQVNTKGNscyktPnJlYWQoVEhSSUZUX1NUUlVDVChkc3QpLCBwcm90b2NvbCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgZ19hc3NlcnRfY21waW50KHdyaXRlX2xlbiwgPT0sIHJlYWRfbGVuKTsKKworICBnX29iamVjdF91bnJlZihkc3QpOworICBnX29iamVjdF91bnJlZihzcmMpOworICBnX29iamVjdF91bnJlZihwcm90b2NvbCk7CisgIGdfb2JqZWN0X3VucmVmKHRyYW5zcG9ydCk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTigyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0KCk7CisjZW5kaWYKKyAgZ190ZXN0X2luaXQoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMoIi90ZXN0c2VyaWFsaXphdGlvbi9TdHJ1Y3RSZWFkV3JpdGVMZW5ndGhTaG91bGRFcXVhbCIsCisgICAgICAgICAgICAgICAgICBzdHJ1Y3RfcmVhZF93cml0ZV9sZW5ndGhfc2hvdWxkX2VxdWFsKTsKKyAgZ190ZXN0X2FkZF9mdW5jKCIvdGVzdHNlcmlhbGl6YXRpb24vU3RydWN0Q29uc3RhbnRzIiwgc3RydWN0X2NvbnN0YW50c19yZWFkX3dyaXRlKTsKKyAgZ190ZXN0X2FkZF9mdW5jKCIvdGVzdHNlcmlhbGl6YXRpb24vRW51bUNvbnN0YW50cyIsIGVudW1fY29uc3RhbnRzX3JlYWRfd3JpdGUpOworICByZXR1cm4gZ190ZXN0X3J1bigpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzaW1wbGVzZXJ2ZXIuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0c2ltcGxlc2VydmVyLmMKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAyODJhNmU4Li4zYzZmMmU4Ci0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0c2ltcGxlc2VydmVyLmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzaW1wbGVzZXJ2ZXIuYwpAQCAtMTcsMjAgKzE3LDE5IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8Z2xpYi5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAKLSNpbmNsdWRlICJ0aHJpZnQuaCIKLSNpbmNsdWRlICJwcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oIgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CiAKICNkZWZpbmUgVEVTVF9QT1JUIDUxMTk5CiAKLSNpbmNsdWRlICJzZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYyIKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5jPgogCiAvKiBjcmVhdGUgYSBydWRpbWVudGFyeSBwcm9jZXNzb3IgKi8KICNkZWZpbmUgVEVTVF9QUk9DRVNTT1JfVFlQRSAodGVzdF9wcm9jZXNzb3JfZ2V0X3R5cGUgKCkpCkBAIC01MSw4ICs1MCwxMyBAQAogCiBnYm9vbGVhbgogdGVzdF9wcm9jZXNzb3JfcHJvY2VzcyAoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IsIFRocmlmdFByb3RvY29sICppbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICpvdXQpCisgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqb3V0LCBHRXJyb3IgKiplcnJvcikKIHsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb2Nlc3Nvcik7CisgIFRIUklGVF9VTlVTRURfVkFSIChpbik7CisgIFRIUklGVF9VTlVTRURfVkFSIChvdXQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCiAgIHJldHVybiBGQUxTRTsKIH0KIApAQCAtODQsMTEgKzg4LDEyIEBACiAKICAgLyogcnVuIHRoZSBzZXJ2ZXIgaW4gYSBjaGlsZCBwcm9jZXNzICovCiAgIHBpZCA9IGZvcmsgKCk7Ci0gIGFzc2VydCAocGlkID49IDApOworICBnX2Fzc2VydCAocGlkID49IDApOwogCiAgIGlmIChwaWQgPT0gMCkKICAgewotICAgIFRIUklGVF9TRVJWRVJfR0VUX0NMQVNTIChUSFJJRlRfU0VSVkVSIChzcykpLT5zZXJ2ZSAoVEhSSUZUX1NFUlZFUiAoc3MpKTsKKyAgICBUSFJJRlRfU0VSVkVSX0dFVF9DTEFTUyAoVEhSSUZUX1NFUlZFUiAoc3MpKS0+c2VydmUgKFRIUklGVF9TRVJWRVIgKHNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgIGV4aXQgKDApOwogICB9IGVsc2UgewogICAgIHNsZWVwICg1KTsKQEAgLTk3LDE1ICsxMDIsMTggQEAKICAgICBnX29iamVjdF91bnJlZiAoc3MpOwogICAgIGdfb2JqZWN0X3VucmVmICh0c3MpOwogICAgIGdfb2JqZWN0X3VucmVmIChwKTsKLSAgICBhc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7Ci0gICAgYXNzZXJ0IChzdGF0dXMgPT0gU0lHSU5UKTsKKyAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKyAgICBnX2Fzc2VydCAoc3RhdHVzID09IFNJR0lOVCk7CiAgIH0KIH0KIAogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKICAgZ190eXBlX2luaXQoKTsKKyNlbmRpZgorCiAgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOwogCiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0c2ltcGxlc2VydmVyL1NpbXBsZVNlcnZlciIsIHRlc3Rfc2VydmVyKTsKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0c3RydWN0LmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdHN0cnVjdC5jCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggZWM1NDNiZS4uZDEyMGNiYwotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdHN0cnVjdC5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0c3RydWN0LmMKQEAgLTE3LDEwICsxNyw5IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KIAotI2luY2x1ZGUgIi4uL3NyYy90aHJpZnRfc3RydWN0LmMiCisjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5jIgogCiAvKiB0ZXN0cyB0byBlbnN1cmUgd2UgY2FuIGV4dGVuZCBhIFRocmlmdFN0cnVjdCAqLwogCkBAIC01MSw2ICs1MCwxMCBAQAogdGhyaWZ0X3Rlc3Rfc3RydWN0X3JlYWQgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCiB7CisgIFRIUklGVF9VTlVTRURfVkFSIChvYmplY3QpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCiAgIHJldHVybiAwOwogfQogCkBAIC01OCw2ICs2MSwxMCBAQAogdGhyaWZ0X3Rlc3Rfc3RydWN0X3dyaXRlIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKIHsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKG9iamVjdCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKICAgcmV0dXJuIDA7CiB9CiAKQEAgLTgxLDcgKzg4LDcgQEAKICAgVGhyaWZ0VGVzdFN0cnVjdCAqdCA9IE5VTEw7CiAKICAgdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfVEVTVF9TVFJVQ1QsIE5VTEwpOwotICBhc3NlcnQgKCBUSFJJRlRfSVNfU1RSVUNUICh0KSk7CisgIGdfYXNzZXJ0ICggVEhSSUZUX0lTX1NUUlVDVCAodCkpOwogICB0aHJpZnRfc3RydWN0X3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQpLCBOVUxMLCBOVUxMKTsKICAgdGhyaWZ0X3N0cnVjdF93cml0ZSAoVEhSSUZUX1NUUlVDVCAodCksIE5VTEwsIE5VTEwpOwogICB0aHJpZnRfdGVzdF9zdHJ1Y3RfcmVhZCAoVEhSSUZUX1NUUlVDVCAodCksIE5VTEwsIE5VTEwpOwpAQCAtOTIsNyArOTksMTAgQEAKIGludAogbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogeworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCiAgIGdfdHlwZV9pbml0KCk7CisjZW5kaWYKKwogICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKIAogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHN0cnVjdC9Jbml0aWFsaXplT2JqZWN0IiwgdGVzdF9pbml0aWFsaXplX29iamVjdCk7CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3QuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdC5jCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggYjE0YjYwNi4uMjNhOTM0ZAotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3QuYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3QuYwpAQCAtMSwxNCArMSwxNyBAQAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CiAKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaCIKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KKworI2luY2x1ZGUgInRfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oIgorI2luY2x1ZGUgInRocmlmdF90ZXN0X2hhbmRsZXIuaCIKIAogc3RhdGljIGNvbnN0IGNoYXIgVEVTVF9BRERSRVNTW10gPSAibG9jYWxob3N0IjsKIHN0YXRpYyBjb25zdCBpbnQgVEVTVF9QT1JUID0gNjQ0NDQ7CiAKIHN0YXRpYyB2b2lkCi10ZXN0X3RocmlmdF9zZXJ2ZXIgKGNvbnN0IGludCBwb3J0KQordGVzdF90aHJpZnRfc2VydmVyICh2b2lkKQogewogICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBURVNUX1BPUlQsIE5VTEwpOwpAQCAtMTYsMTMgKzE5LDk0IEBACiAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIH0KIAorc3RhdGljIHZvaWQKK3NldF9pbmRpY2F0b3IgKGdwb2ludGVyIGRhdGEsIEdPYmplY3QgKndoZXJlX3RoZV9vYmplY3Rfd2FzKSB7CisgIFRIUklGVF9VTlVTRURfVkFSKHdoZXJlX3RoZV9vYmplY3Rfd2FzKTsKKworICAqKGdib29sZWFuICopIGRhdGEgPSBUUlVFOworfQorCitzdGF0aWMgdm9pZAordGVzdF90aHJpZnRfaGFuZGxlciAodm9pZCkKK3sKKyAgR0Vycm9yICplcnJvcjsKKyAgR0hhc2hUYWJsZSAqX3JldHVybjsKKyAgVFRlc3RJbnNhbml0eSAqYXJndW1lbnQ7CisgIGdib29sZWFuIGluZGljYXRvcjsKKworICBUVGVzdFh0cnVjdCAgKnh0cnVjdCwgICp4dHJ1Y3QyOworICBUVGVzdE51bWJlcnogbnVtYmVyejsKKyAgVFRlc3ROdW1iZXJ6IG51bWJlcnoyOworICBUVGVzdFVzZXJJZCB1c2VyX2lkLCAqdXNlcl9pZF9wdHIsICp1c2VyX2lkX3B0cjI7CisgIEdIYXNoVGFibGUgKnVzZXJfbWFwOworICBHUHRyQXJyYXkgKnh0cnVjdHM7CisKKyAgZXJyb3IgPSBOVUxMOworICBpbmRpY2F0b3IgPSBGQUxTRTsKKworICB1c2VyX21hcCA9IE5VTEw7CisgIHh0cnVjdHMgPSBOVUxMOworCisgIGFyZ3VtZW50ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9JTlNBTklUWSwgTlVMTCk7CisgIGdfb2JqZWN0X2dldCAoYXJndW1lbnQsCisgICAgICAgICAgICAgICAgInVzZXJNYXAiLCAmdXNlcl9tYXAsCisgICAgICAgICAgICAgICAgInh0cnVjdHMiLCAmeHRydWN0cywKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBudW1iZXJ6ID0gVF9URVNUX05VTUJFUlpfRklWRTsKKyAgbnVtYmVyejIgPSBUX1RFU1RfTlVNQkVSWl9FSUdIVDsKKyAgdXNlcl9pZF9wdHIgPSBnX21hbGxvYyAoc2l6ZW9mICp1c2VyX2lkX3B0cik7CisgICp1c2VyX2lkX3B0ciA9IDU7CisgIHVzZXJfaWRfcHRyMiA9IGdfbWFsbG9jIChzaXplb2YgKnVzZXJfaWRfcHRyKTsKKyAgKnVzZXJfaWRfcHRyMiA9IDg7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHVzZXJfbWFwLCAoZ3BvaW50ZXIpbnVtYmVyeiwgdXNlcl9pZF9wdHIpOworICBnX2hhc2hfdGFibGVfaW5zZXJ0ICh1c2VyX21hcCwgKGdwb2ludGVyKW51bWJlcnoyLCB1c2VyX2lkX3B0cjIpOworICBnX2hhc2hfdGFibGVfdW5yZWYgKHVzZXJfbWFwKTsKKworICB4dHJ1Y3QgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgIkhlbGxvMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgIDJMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgeHRydWN0MiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgIkdvb2RieWU0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgNExMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgZ19wdHJfYXJyYXlfYWRkICh4dHJ1Y3RzLCB4dHJ1Y3QyKTsKKyAgZ19wdHJfYXJyYXlfYWRkICh4dHJ1Y3RzLCB4dHJ1Y3QpOworICBnX3B0cl9hcnJheV91bnJlZiAoeHRydWN0cyk7CisKKyAgX3JldHVybiA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19pbnQ2NF9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ludDY0X2VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHRGVzdHJveU5vdGlmeSlnX2hhc2hfdGFibGVfdW5yZWYpOworCisgIGdfb2JqZWN0X3dlYWtfcmVmIChHX09CSkVDVCAoYXJndW1lbnQpLCBzZXRfaW5kaWNhdG9yLCAoZ3BvaW50ZXIpICZpbmRpY2F0b3IpOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfaW5zYW5pdHkgKE5VTEwsICZfcmV0dXJuLCBhcmd1bWVudCwgJmVycm9yKSk7CisgIGdfYXNzZXJ0ICghIGluZGljYXRvcik7CisKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChfcmV0dXJuKTsKKyAgZ19hc3NlcnQgKCEgaW5kaWNhdG9yKTsKKworICBnX29iamVjdF91bnJlZiAoYXJndW1lbnQpOworICBnX2Fzc2VydCAoaW5kaWNhdG9yKTsKK30KKwogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKICAgZ190eXBlX2luaXQoKTsKKyNlbmRpZgorCiAgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOwogCiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dGhyaWZ0L1NlcnZlciIsIHRlc3RfdGhyaWZ0X3NlcnZlcik7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dGhyaWZ0L0hhbmRsZXIiLCB0ZXN0X3RocmlmdF9oYW5kbGVyKTsKIAogICByZXR1cm4gZ190ZXN0X3J1biAoKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdGNsaWVudC5jcHAgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3RjbGllbnQuY3BwCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggNzk1ZTQ3Zi4uMTkxMGM4YQotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3RjbGllbnQuY3BwCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdGNsaWVudC5jcHAKQEAgLTE3LDMxICsxNyw0MiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyogdGVzdCBhIEMgY2xpZW50IHdpdGggYSBDKysgc2VydmVyICovCisvKiB0ZXN0IGEgQyBjbGllbnQgd2l0aCBhIEMrKyBzZXJ2ZXIgICh0aGF0IG1ha2VzIHNlbnNlLi4uKSAqLwogCiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9URGVidWdQcm90b2NvbC5oPgotI2luY2x1ZGUgPHNlcnZlci9UU2ltcGxlU2VydmVyLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgogI2luY2x1ZGUgIlRocmlmdFRlc3QuaCIKICNpbmNsdWRlICJUaHJpZnRUZXN0X3R5cGVzLmgiCiAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBib29zdDsKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogCiB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OwogCit1c2luZyBzdGQ6OmNvdXQ7Cit1c2luZyBzdGQ6OmVuZGw7Cit1c2luZyBzdGQ6OmZpeGVkOwordXNpbmcgc3RkOjptYWtlX3BhaXI7Cit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6c2V0OwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKKwogI2RlZmluZSBURVNUX1BPUlQgOTk4MAogCiAvLyBFeHRyYSBmdW5jdGlvbnMgcmVxdWlyZWQgZm9yIFRocmlmdFRlc3RfdHlwZXMgdG8gd29yawpAQCAtNTksMTE5ICs3MCwxMzAgQEAKICAgVGVzdEhhbmRsZXIoKSB7fQogCiAgIHZvaWQgdGVzdFZvaWQoKSB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RWb2lkKClcbiIpOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdFZvaWQoKSIgPDwgZW5kbDsKICAgfQogCiAgIHZvaWQgdGVzdFN0cmluZyhzdHJpbmcmIG91dCwgY29uc3Qgc3RyaW5nICZ0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0U3RyaW5nKFwiJXNcIilcbiIsIHRoaW5nLmNfc3RyKCkpOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdFN0cmluZyhcIiIgPDwgdGhpbmcgPDwgIlwiKSIgPDwgZW5kbDsKICAgICBvdXQgPSB0aGluZzsKICAgfQogCisgIGJvb2wgdGVzdEJvb2woY29uc3QgYm9vbCB0aGluZykgeworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdEJvb2woIiA8PCAodGhpbmcgPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCAiKSIgPDwgZW5kbDsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KICAgaW50OF90IHRlc3RCeXRlKGNvbnN0IGludDhfdCB0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0Qnl0ZSglZClcbiIsIChpbnQpdGhpbmcpOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdEJ5dGUoIiA8PCAoaW50KXRoaW5nIDw8ICIpIiA8PCBlbmRsOwogICAgIHJldHVybiB0aGluZzsKICAgfQogICBpbnQzMl90IHRlc3RJMzIoY29uc3QgaW50MzJfdCB0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0STMyKCVkKVxuIiwgdGhpbmcpOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdEkzMigiIDw8IHRoaW5nIDw8ICIpIiA8PCBlbmRsOwogICAgIHJldHVybiB0aGluZzsKICAgfQogCiAgIGludDY0X3QgdGVzdEk2NChjb25zdCBpbnQ2NF90IHRoaW5nKSB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RJNjQoJWxsZClcbiIsIHRoaW5nKTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RJNjQoIiA8PCB0aGluZyA8PCAiKSIgPDwgZW5kbDsKICAgICByZXR1cm4gdGhpbmc7CiAgIH0KIAogICBkb3VibGUgdGVzdERvdWJsZShjb25zdCBkb3VibGUgdGhpbmcpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdERvdWJsZSglbGYpXG4iLCB0aGluZyk7CisgICAgY291dC5wcmVjaXNpb24oNik7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0RG91YmxlKCIgPDwgZml4ZWQgPDwgdGhpbmcgPDwgIikiIDw8IGVuZGw7CiAgICAgcmV0dXJuIHRoaW5nOwogICB9CiAKKyAgdm9pZCB0ZXN0QmluYXJ5KHN0cmluZyYgb3V0LCBjb25zdCBzdHJpbmcgJnRoaW5nKSB7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0QmluYXJ5KFwiIiA8PCB0aGluZyA8PCAiXCIpIiA8PCBlbmRsOworICAgIG91dCA9IHRoaW5nOworICB9CisKICAgdm9pZCB0ZXN0U3RydWN0KFh0cnVjdCYgb3V0LCBjb25zdCBYdHJ1Y3QgJnRoaW5nKSB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RTdHJ1Y3Qoe1wiJXNcIiwgJWQsICVkLCAlbGxkfSlcbiIsIHRoaW5nLnN0cmluZ190aGluZy5jX3N0cigpLCAoaW50KXRoaW5nLmJ5dGVfdGhpbmcsIHRoaW5nLmkzMl90aGluZywgdGhpbmcuaTY0X3RoaW5nKTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RTdHJ1Y3Qoe1wiIiA8PCB0aGluZy5zdHJpbmdfdGhpbmcgPDwgIlwiLCAiIDw8IChpbnQpdGhpbmcuYnl0ZV90aGluZyA8PCAiLCAiIDw8IHRoaW5nLmkzMl90aGluZyA8PCAiLCAiIDw8IHRoaW5nLmk2NF90aGluZyA8PCAifSkiIDw8IGVuZGw7CiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAogICB2b2lkIHRlc3ROZXN0KFh0cnVjdDImIG91dCwgY29uc3QgWHRydWN0MiYgbmVzdCkgewogICAgIGNvbnN0IFh0cnVjdCAmdGhpbmcgPSBuZXN0LnN0cnVjdF90aGluZzsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdE5lc3QoeyVkLCB7XCIlc1wiLCAlZCwgJWQsICVsbGR9LCAlZH0pXG4iLCAoaW50KW5lc3QuYnl0ZV90aGluZywgdGhpbmcuc3RyaW5nX3RoaW5nLmNfc3RyKCksIChpbnQpdGhpbmcuYnl0ZV90aGluZywgdGhpbmcuaTMyX3RoaW5nLCB0aGluZy5pNjRfdGhpbmcsIG5lc3QuaTMyX3RoaW5nKTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3ROZXN0KHsiIDw8IChpbnQpbmVzdC5ieXRlX3RoaW5nIDw8ICIsIHtcIiIgPDwgdGhpbmcuc3RyaW5nX3RoaW5nIDw8ICJcIiwgIiA8PCAoaW50KXRoaW5nLmJ5dGVfdGhpbmcgPDwgIiwgIiA8PCB0aGluZy5pMzJfdGhpbmcgPDwgIiwgIiA8PCB0aGluZy5pNjRfdGhpbmcgPDwgIn0sICIgPDwgbmVzdC5pMzJfdGhpbmcgPDwgIn0pIiA8PCBlbmRsOwogICAgIG91dCA9IG5lc3Q7CiAgIH0KIAogICB2b2lkIHRlc3RNYXAobWFwPGludDMyX3QsIGludDMyX3Q+ICZvdXQsIGNvbnN0IG1hcDxpbnQzMl90LCBpbnQzMl90PiAmdGhpbmcpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdE1hcCh7Iik7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0TWFwKHsiOwogICAgIG1hcDxpbnQzMl90LCBpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwogICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgIGZvciAobV9pdGVyID0gdGhpbmcuYmVnaW4oKTsgbV9pdGVyICE9IHRoaW5nLmVuZCgpOyArK21faXRlcikgewogICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiwgIik7CisgICAgICAgIGNvdXQgPDwgIiwgIjsKICAgICAgIH0KLSAgICAgIHByaW50ZigiJWQgPT4gJWQiLCBtX2l0ZXItPmZpcnN0LCBtX2l0ZXItPnNlY29uZCk7CisgICAgICBjb3V0IDw8IG1faXRlci0+Zmlyc3QgPDwgIiA9PiAiIDw8IG1faXRlci0+c2Vjb25kOwogICAgIH0KLSAgICBwcmludGYoIn0pXG4iKTsKKyAgICBjb3V0IDw8ICJ9KSIgPDwgZW5kbDsKICAgICBvdXQgPSB0aGluZzsKICAgfQogCiAgIHZvaWQgdGVzdFN0cmluZ01hcChtYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiAmb3V0LCBjb25zdCBtYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiAmdGhpbmcpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdFN0cmluZ01hcCh7Iik7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0U3RyaW5nTWFwKHsiOwogICAgIG1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CiAgICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICAgZm9yIChtX2l0ZXIgPSB0aGluZy5iZWdpbigpOyBtX2l0ZXIgIT0gdGhpbmcuZW5kKCk7ICsrbV9pdGVyKSB7CiAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgICAgY291dCA8PCAiLCAiOwogICAgICAgfQotICAgICAgcHJpbnRmKCJcIiVzXCIgPT4gXCIlc1wiIiwgKG1faXRlci0+Zmlyc3QpLmNfc3RyKCksIChtX2l0ZXItPnNlY29uZCkuY19zdHIoKSk7CisgICAgICBjb3V0IDw8ICJcIiIgPDwgbV9pdGVyLT5maXJzdCA8PCAiXCIgPT4gXCIiIDw8IG1faXRlci0+c2Vjb25kIDw8ICJcIiI7CiAgICAgfQotICAgIHByaW50ZigifSlcbiIpOworICAgIGNvdXQgPDwgIn0pIiA8PCBlbmRsOwogICAgIG91dCA9IHRoaW5nOwogICB9CiAKIAogICB2b2lkIHRlc3RTZXQoc2V0PGludDMyX3Q+ICZvdXQsIGNvbnN0IHNldDxpbnQzMl90PiAmdGhpbmcpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdFNldCh7Iik7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0U2V0KHsiOwogICAgIHNldDxpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOwogICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgIGZvciAoc19pdGVyID0gdGhpbmcuYmVnaW4oKTsgc19pdGVyICE9IHRoaW5nLmVuZCgpOyArK3NfaXRlcikgewogICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiwgIik7CisgICAgICAgIGNvdXQgPDwgIiwgIjsKICAgICAgIH0KLSAgICAgIHByaW50ZigiJWQiLCAqc19pdGVyKTsKKyAgICAgIGNvdXQgPDwgKnNfaXRlcjsKICAgICB9Ci0gICAgcHJpbnRmKCJ9KVxuIik7CisgICAgY291dCA8PCAifSkiIDw8IGVuZGw7CiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAogICB2b2lkIHRlc3RMaXN0KHZlY3RvcjxpbnQzMl90PiAmb3V0LCBjb25zdCB2ZWN0b3I8aW50MzJfdD4gJnRoaW5nKSB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RMaXN0KHsiKTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RMaXN0KHsiOwogICAgIHZlY3RvcjxpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgbF9pdGVyOwogICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgIGZvciAobF9pdGVyID0gdGhpbmcuYmVnaW4oKTsgbF9pdGVyICE9IHRoaW5nLmVuZCgpOyArK2xfaXRlcikgewogICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgeyAgICAgICAgcHJpbnRmKCIsICIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY291dCA8PCAiLCAiOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCIsICpsX2l0ZXIpOworICAgICAgY291dCA8PCAqbF9pdGVyOwogICAgIH0KLSAgICBwcmludGYoIn0pXG4iKTsKKyAgICBjb3V0IDw8ICJ9KSIgPDwgZW5kbDsKICAgICBvdXQgPSB0aGluZzsKICAgfQogCiAgIE51bWJlcno6OnR5cGUgdGVzdEVudW0oY29uc3QgTnVtYmVyejo6dHlwZSB0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0RW51bSglZClcbiIsIHRoaW5nKTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RFbnVtKCIgPDwgdGhpbmcgPDwgIikiIDw8IGVuZGw7CiAgICAgcmV0dXJuIHRoaW5nOwogICB9CiAKICAgVXNlcklkIHRlc3RUeXBlZGVmKGNvbnN0IFVzZXJJZCB0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0VHlwZWRlZiglbGxkKVxuIiwgdGhpbmcpOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdFR5cGVkZWYoIiA8PCB0aGluZyA8PCAiKSIgPDwgZW5kbDsKICAgICByZXR1cm4gdGhpbmc7ICB9CiAKICAgdm9pZCB0ZXN0TWFwTWFwKG1hcDxpbnQzMl90LCBtYXA8aW50MzJfdCxpbnQzMl90PiA+ICZtYXBtYXAsIGNvbnN0IGludDMyX3QgaGVsbG8pIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdE1hcE1hcCglZClcbiIsIGhlbGxvKTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RNYXBNYXAoIiA8PCBoZWxsbyA8PCAiKSIgPDwgZW5kbDsKIAogICAgIG1hcDxpbnQzMl90LGludDMyX3Q+IHBvczsKICAgICBtYXA8aW50MzJfdCxpbnQzMl90PiBuZWc7CkBAIC0xODYsNyArMjA4LDkgQEAKICAgfQogCiAgIHZvaWQgdGVzdEluc2FuaXR5KG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6Ojp0eXBlLEluc2FuaXR5PiA+ICZpbnNhbmUsIGNvbnN0IEluc2FuaXR5ICZhcmd1bWVudCkgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0SW5zYW5pdHkoKVxuIik7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSAoYXJndW1lbnQpOworCisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0SW5zYW5pdHkoKSIgPDwgZW5kbDsKIAogICAgIFh0cnVjdCBoZWxsbzsKICAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKQEAgLTIxOSw0MyArMjQzLDQ2IEBACiAgICAgaW5zYW5lLmluc2VydChtYWtlX3BhaXIoMSwgZmlyc3RfbWFwKSk7CiAgICAgaW5zYW5lLmluc2VydChtYWtlX3BhaXIoMiwgc2Vjb25kX21hcCkpOwogCi0gICAgcHJpbnRmKCJyZXR1cm4iKTsKLSAgICBwcmludGYoIiA9IHsiKTsKKyAgICBjb3V0IDw8ICJyZXR1cm4gPSB7IjsKICAgICBtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSxJbnNhbml0eT4gPjo6Y29uc3RfaXRlcmF0b3IgaV9pdGVyOwogICAgIGZvciAoaV9pdGVyID0gaW5zYW5lLmJlZ2luKCk7IGlfaXRlciAhPSBpbnNhbmUuZW5kKCk7ICsraV9pdGVyKSB7Ci0gICAgICBwcmludGYoIiVsbGQgPT4geyIsIGlfaXRlci0+Zmlyc3QpOworICAgICAgY291dCA8PCBpX2l0ZXItPmZpcnN0IDw8ICIgPT4geyI7CiAgICAgICBtYXA8TnVtYmVyejo6dHlwZSxJbnNhbml0eT46OmNvbnN0X2l0ZXJhdG9yIGkyX2l0ZXI7CiAgICAgICBmb3IgKGkyX2l0ZXIgPSBpX2l0ZXItPnNlY29uZC5iZWdpbigpOwogICAgICAgICAgICBpMl9pdGVyICE9IGlfaXRlci0+c2Vjb25kLmVuZCgpOwogICAgICAgICAgICArK2kyX2l0ZXIpIHsKLSAgICAgICAgcHJpbnRmKCIlZCA9PiB7IiwgaTJfaXRlci0+Zmlyc3QpOworICAgICAgICBjb3V0IDw8IGkyX2l0ZXItPmZpcnN0IDw8ICIgPT4geyI7CiAgICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBVc2VySWQ+IHVzZXJNYXAgPSBpMl9pdGVyLT5zZWNvbmQudXNlck1hcDsKICAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIFVzZXJJZD46OmNvbnN0X2l0ZXJhdG9yIHVtOwotICAgICAgICBwcmludGYoInsiKTsKKyAgICAgICAgY291dCA8PCAieyI7CiAgICAgICAgIGZvciAodW0gPSB1c2VyTWFwLmJlZ2luKCk7IHVtICE9IHVzZXJNYXAuZW5kKCk7ICsrdW0pIHsKLSAgICAgICAgICBwcmludGYoIiVkID0+ICVsbGQsICIsIHVtLT5maXJzdCwgdW0tPnNlY29uZCk7CisgICAgICAgICAgY291dCA8PCB1bS0+Zmlyc3QgPDwgIiA9PiAiIDw8IHVtLT5zZWNvbmQgPDwgIiwgIjsKICAgICAgICAgfQotICAgICAgICBwcmludGYoIn0sICIpOworICAgICAgICBjb3V0IDw8ICJ9LCAiOwogCiAgICAgICAgIHZlY3RvcjxYdHJ1Y3Q+IHh0cnVjdHMgPSBpMl9pdGVyLT5zZWNvbmQueHRydWN0czsKICAgICAgICAgdmVjdG9yPFh0cnVjdD46OmNvbnN0X2l0ZXJhdG9yIHg7Ci0gICAgICAgIHByaW50ZigieyIpOworICAgICAgICBjb3V0IDw8ICJ7IjsKICAgICAgICAgZm9yICh4ID0geHRydWN0cy5iZWdpbigpOyB4ICE9IHh0cnVjdHMuZW5kKCk7ICsreCkgewotICAgICAgICAgIHByaW50Zigie1wiJXNcIiwgJWQsICVkLCAlbGxkfSwgIiwgeC0+c3RyaW5nX3RoaW5nLmNfc3RyKCksIChpbnQpeC0+Ynl0ZV90aGluZywgeC0+aTMyX3RoaW5nLCB4LT5pNjRfdGhpbmcpOworICAgICAgICAgIGNvdXQgPDwgIntcIiIgPDwgeC0+c3RyaW5nX3RoaW5nIDw8ICJcIiwgIiA8PCAoaW50KXgtPmJ5dGVfdGhpbmcgPDwgIiwgIiA8PCB4LT5pMzJfdGhpbmcgPDwgIiwgIiA8PCB4LT5pNjRfdGhpbmcgPDwgIn0sICI7CiAgICAgICAgIH0KLSAgICAgICAgcHJpbnRmKCJ9Iik7CisgICAgICAgIGNvdXQgPDwgIn0iOwogCi0gICAgICAgIHByaW50ZigifSwgIik7CisgICAgICAgIGNvdXQgPDwgIn0sICI7CiAgICAgICB9Ci0gICAgICBwcmludGYoIn0sICIpOworICAgICAgY291dCA8PCAifSwgIjsKICAgICB9Ci0gICAgcHJpbnRmKCJ9XG4iKTsKKyAgICBjb3V0IDw8ICJ9IiA8PCBlbmRsOwogCiAKICAgfQogCiAgIHZvaWQgdGVzdE11bHRpKFh0cnVjdCAmaGVsbG8sIGNvbnN0IGludDhfdCBhcmcwLCBjb25zdCBpbnQzMl90IGFyZzEsIGNvbnN0IGludDY0X3QgYXJnMiwgY29uc3Qgc3RkOjptYXA8aW50MTZfdCwgc3RkOjpzdHJpbmc+ICAmYXJnMywgY29uc3QgTnVtYmVyejo6dHlwZSBhcmc0LCBjb25zdCBVc2VySWQgYXJnNSkgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0TXVsdGkoKVxuIik7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSAoYXJnMyk7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSAoYXJnNCk7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSAoYXJnNSk7CisKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RNdWx0aSgpIiA8PCBlbmRsOwogCiAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CiAgICAgaGVsbG8uYnl0ZV90aGluZyA9IGFyZzA7CkBAIC0yNjYsNyArMjkzLDcgQEAKICAgdm9pZCB0ZXN0RXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZhcmcpCiAgICAgdGhyb3coWGNlcHRpb24sIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKQogICB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RFeGNlcHRpb24oJXMpXG4iLCBhcmcuY19zdHIoKSk7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0RXhjZXB0aW9uKCIgPDwgYXJnIDw8ICIpIiA8PCBlbmRsOwogICAgIGlmIChhcmcuY29tcGFyZSgiWGNlcHRpb24iKSA9PSAwKSB7CiAgICAgICBYY2VwdGlvbiBlOwogICAgICAgZS5lcnJvckNvZGUgPSAxMDAxOwpAQCAtMjg0LDcgKzMxMSw3IEBACiAKICAgdm9pZCB0ZXN0TXVsdGlFeGNlcHRpb24oWHRydWN0ICZyZXN1bHQsIGNvbnN0IHN0ZDo6c3RyaW5nICZhcmcwLCBjb25zdCBzdGQ6OnN0cmluZyAmYXJnMSkgdGhyb3coWGNlcHRpb24sIFhjZXB0aW9uMikgewogCi0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpXG4iLCBhcmcwLmNfc3RyKCksIGFyZzEuY19zdHIoKSk7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0TXVsdGlFeGNlcHRpb24oIiA8PCBhcmcwIDw8ICIsICIgPDwgYXJnMSA8PCAiKSIgPDwgZW5kbDsKIAogICAgIGlmIChhcmcwLmNvbXBhcmUoIlhjZXB0aW9uIikgPT0gMCkgewogICAgICAgWGNlcHRpb24gZTsKQEAgLTMwMywyMCArMzMwLDIyIEBACiAgIH0KIAogICB2b2lkIHRlc3RPbmV3YXkoaW50IHNsZWVwRm9yKSB7Ci0gICAgcHJpbnRmKCJ0ZXN0T25ld2F5KCVkKTogU2xlZXBpbmcuLi5cbiIsIHNsZWVwRm9yKTsKKyAgICBjb3V0IDw8ICJ0ZXN0T25ld2F5KCIgPDwgc2xlZXBGb3IgPDwgIik6IFNsZWVwaW5nLi4uIiA8PCBlbmRsOwogICAgIHNsZWVwKHNsZWVwRm9yKTsKLSAgICBwcmludGYoInRlc3RPbmV3YXkoJWQpOiBkb25lIHNsZWVwaW5nIVxuIiwgc2xlZXBGb3IpOworICAgIGNvdXQgPDwgInRlc3RPbmV3YXkoIiA8PCBzbGVlcEZvciA8PCAiKTogZG9uZSBzbGVlcGluZyEiIDw8IGVuZGw7CiAgIH0KIH07CiAKIC8vIEMgQ0xJRU5UCiBleHRlcm4gIkMiIHsKIAorI3VuZGVmIFRIUklGVF9TT0NLRVQgLyogZnJvbSBsaWIvY3BwICovCisKICNpbmNsdWRlICJ0X3Rlc3RfdGhyaWZ0X3Rlc3QuaCIKICNpbmNsdWRlICJ0X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oIgotI2luY2x1ZGUgInByb3RvY29sL3RocmlmdF9wcm90b2NvbC5oIgotI2luY2x1ZGUgInByb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaCIKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaD4KIAogc3RhdGljIHZvaWQKIHRlc3RfdGhyaWZ0X2NsaWVudCAodm9pZCkKQEAgLTMyOSw3ICszNTgsNyBAQAogICBnY2hhciAqc3RyaW5nID0gTlVMTDsKICAgZ2ludDggYnl0ZSA9IDA7CiAgIGdpbnQxNiBpMTYgPSAwOwotICBnaW50MzIgaTMyID0gMCwgYW5vdGhlcl9pMzIgPSA1Njc4OTsgCisgIGdpbnQzMiBpMzIgPSAwLCBhbm90aGVyX2kzMiA9IDU2Nzg5OwogICBnaW50NjQgaTY0ID0gMDsKICAgZG91YmxlIGRibCA9IDAuMDsKICAgVFRlc3RYdHJ1Y3QgKnh0cnVjdF9pbiwgKnh0cnVjdF9vdXQ7CkBAIC0zMzgsNyArMzY3LDcgQEAKICAgR0hhc2hUYWJsZSAqc2V0X2luID0gTlVMTCwgKnNldF9vdXQgPSBOVUxMOwogICBHQXJyYXkgKmxpc3RfaW4gPSBOVUxMLCAqbGlzdF9vdXQgPSBOVUxMOwogICBUVGVzdE51bWJlcnogZW51bV9pbiwgZW51bV9vdXQ7Ci0gIFRUZXN0VXNlcklkIHVzZXJfaWRfaW4sIHVzZXJfaWRfb3V0OyAKKyAgVFRlc3RVc2VySWQgdXNlcl9pZF9pbiwgdXNlcl9pZF9vdXQ7CiAgIEdIYXNoVGFibGUgKmluc2FuaXR5X2luID0gTlVMTDsKICAgVFRlc3RYdHJ1Y3QgKnh0cnVjdDEsICp4dHJ1Y3QyOwogICBUVGVzdEluc2FuaXR5ICppbnNhbml0eV9vdXQgPSBOVUxMOwpAQCAtMzQ3LDExICszNzYsMTMgQEAKICAgVFRlc3RYY2VwdGlvbiAqeGNlcHRpb24gPSBOVUxMOwogICBUVGVzdFhjZXB0aW9uMiAqeGNlcHRpb24yID0gTlVMTDsKIAorI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCiAgIC8vIGluaXRpYWxpemUgZ29iamVjdAogICBnX3R5cGVfaW5pdCAoKTsKKyNlbmRpZgogCiAgIC8vIGNyZWF0ZSBhIEMgY2xpZW50Ci0gIHRzb2NrZXQgPSAoVGhyaWZ0U29ja2V0ICopIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAKKyAgdHNvY2tldCA9IChUaHJpZnRTb2NrZXQgKikgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIFRFU1RfUE9SVCwgTlVMTCk7CiAgIHByb3RvY29sID0gKFRocmlmdEJpbmFyeVByb3RvY29sICopIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLApAQCAtMzk2LDIzICs0MjcsMjUgQEAKICAgeHRydWN0X291dC0+X19pc3NldF9pNjRfdGhpbmcgPSBUUlVFOwogICB4dHJ1Y3Rfb3V0LT5zdHJpbmdfdGhpbmcgPSBnX3N0cmR1cCAoImFiYzEyMyIpOwogICB4dHJ1Y3Rfb3V0LT5fX2lzc2V0X3N0cmluZ190aGluZyA9IFRSVUU7CisgIHh0cnVjdF9pbiA9IChUVGVzdFh0cnVjdCAqKSBnX29iamVjdF9uZXcoVF9URVNUX1RZUEVfWFRSVUNULCBOVUxMKTsKICAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3Rfc3RydWN0IChpZmFjZSwgJnh0cnVjdF9pbiwgeHRydWN0X291dCwgJmVycm9yKSA9PSBUUlVFKTsKICAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKIAogICB4dHJ1Y3QyX291dCA9IChUVGVzdFh0cnVjdDIgKikgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QyLCBOVUxMKTsKICAgeHRydWN0Ml9vdXQtPmJ5dGVfdGhpbmcgPSAxOwogICB4dHJ1Y3QyX291dC0+X19pc3NldF9ieXRlX3RoaW5nID0gVFJVRTsKKyAgaWYgKHh0cnVjdDJfb3V0LT5zdHJ1Y3RfdGhpbmcgIT0gTlVMTCkKKyAgICBnX29iamVjdF91bnJlZih4dHJ1Y3QyX291dC0+c3RydWN0X3RoaW5nKTsKICAgeHRydWN0Ml9vdXQtPnN0cnVjdF90aGluZyA9IHh0cnVjdF9vdXQ7CiAgIHh0cnVjdDJfb3V0LT5fX2lzc2V0X3N0cnVjdF90aGluZyA9IFRSVUU7CiAgIHh0cnVjdDJfb3V0LT5pMzJfdGhpbmcgPSAxMjM7CiAgIHh0cnVjdDJfb3V0LT5fX2lzc2V0X2kzMl90aGluZyA9IFRSVUU7CisgIHh0cnVjdDJfaW4gPSAoVFRlc3RYdHJ1Y3QyICopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNUMiwgTlVMTCk7CiAgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X25lc3QgKGlmYWNlLCAmeHRydWN0Ml9pbiwgeHRydWN0Ml9vdXQsICZlcnJvcikgPT0gVFJVRSk7CiAgIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CiAKICAgZ19vYmplY3RfdW5yZWYgKHh0cnVjdDJfb3V0KTsKICAgZ19vYmplY3RfdW5yZWYgKHh0cnVjdDJfaW4pOwotICBnX2ZyZWUgKHh0cnVjdF9vdXQtPnN0cmluZ190aGluZyk7Ci0gIGdfb2JqZWN0X3VucmVmICh4dHJ1Y3Rfb3V0KTsKICAgZ19vYmplY3RfdW5yZWYgKHh0cnVjdF9pbik7CiAKICAgbWFwX291dCA9IGdfaGFzaF90YWJsZV9uZXcgKE5VTEwsIE5VTEwpOwpAQCAtNDY5LDcgKzUwMiw3IEBACiAgIC8vIGluc2FuaXR5CiAgIGluc2FuaXR5X291dCA9IChUVGVzdEluc2FuaXR5ICopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfSU5TQU5JVFksIE5VTEwpOwogICBpbnNhbml0eV9vdXQtPnVzZXJNYXAgPSBnX2hhc2hfdGFibGVfbmV3IChOVUxMLCBOVUxMKTsKLSAgZ19oYXNoX3RhYmxlX2luc2VydCAoaW5zYW5pdHlfb3V0LT51c2VyTWFwLCAmZW51bV9vdXQsICZ1c2VyX2lkX291dCk7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGluc2FuaXR5X291dC0+dXNlck1hcCwgR0lOVF9UT19QT0lOVEVSIChlbnVtX291dCksICZ1c2VyX2lkX291dCk7CiAKICAgeHRydWN0MSA9IChUVGVzdFh0cnVjdCAqKSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwgTlVMTCk7CiAgIHh0cnVjdDEtPmJ5dGVfdGhpbmcgPSAxOwpAQCAtNDkwLDcgKzUyMyw2IEBACiAgIHh0cnVjdDItPnN0cmluZ190aGluZyA9IGdfc3RyZHVwICgiYWJjMTIzIik7CiAgIHh0cnVjdDItPl9faXNzZXRfc3RyaW5nX3RoaW5nID0gVFJVRTsKIAotICBpbnNhbml0eV9vdXQtPnh0cnVjdHMgPSBnX3B0cl9hcnJheV9uZXcgKCk7CiAgIGluc2FuaXR5X2luID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7CiAgIGdfcHRyX2FycmF5X2FkZCAoaW5zYW5pdHlfb3V0LT54dHJ1Y3RzLCB4dHJ1Y3QxKTsKICAgZ19wdHJfYXJyYXlfYWRkIChpbnNhbml0eV9vdXQtPnh0cnVjdHMsIHh0cnVjdDIpOwpAQCAtNDk4LDUyICs1MzAsNjAgQEAKIAogICBnX2hhc2hfdGFibGVfdW5yZWYgKGluc2FuaXR5X2luKTsKICAgZ19wdHJfYXJyYXlfZnJlZSAoaW5zYW5pdHlfb3V0LT54dHJ1Y3RzLCBUUlVFKTsKLSAgZ19mcmVlICh4dHJ1Y3QxLT5zdHJpbmdfdGhpbmcpOwotICBnX2ZyZWUgKHh0cnVjdDItPnN0cmluZ190aGluZyk7Ci0gIGdfb2JqZWN0X3VucmVmICh4dHJ1Y3QxKTsKLSAgZ19vYmplY3RfdW5yZWYgKHh0cnVjdDIpOwogCiAgIG11bHRpX21hcF9vdXQgPSBnX2hhc2hfdGFibGVfbmV3IChOVUxMLCBOVUxMKTsKICAgc3RyaW5nID0gZ19zdHJkdXAgKCJhYmMxMjMiKTsKICAgZ19oYXNoX3RhYmxlX2luc2VydCAobXVsdGlfbWFwX291dCwgJmkxNiwgc3RyaW5nKTsKKyAgbXVsdGlfaW4gPSAoVFRlc3RYdHJ1Y3QgKikgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsIE5VTEwpOwogICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9tdWx0aSAoaWZhY2UsICZtdWx0aV9pbiwgYnl0ZSwgaTMyLCBpNjQsIG11bHRpX21hcF9vdXQsIGVudW1fb3V0LCB1c2VyX2lkX291dCwgJmVycm9yKSA9PSBUUlVFKTsKICAgYXNzZXJ0IChtdWx0aV9pbi0+aTMyX3RoaW5nID09IGkzMik7CiAgIGFzc2VydCAobXVsdGlfaW4tPmk2NF90aGluZyA9PSBpNjQpOwogICBnX29iamVjdF91bnJlZiAobXVsdGlfaW4pOwogICBnX2hhc2hfdGFibGVfdW5yZWYgKG11bHRpX21hcF9vdXQpOwotICBnX2ZyZWUgKHN0cmluZyk7IAorICBnX2ZyZWUgKHN0cmluZyk7CiAKICAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfZXhjZXB0aW9uIChpZmFjZSwgIlhjZXB0aW9uIiwgJnhjZXB0aW9uLCAmZXJyb3IpID09IEZBTFNFKTsKICAgYXNzZXJ0ICh4Y2VwdGlvbi0+ZXJyb3JDb2RlID09IDEwMDEpOwogICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKICAgZXJyb3IgPSBOVUxMOworICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOworICB4Y2VwdGlvbiA9IE5VTEw7CiAKICAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfZXhjZXB0aW9uIChpZmFjZSwgIkFwcGxpY2F0aW9uRXhjZXB0aW9uIiwgJnhjZXB0aW9uLCAmZXJyb3IpID09IEZBTFNFKTsKICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CiAgIGVycm9yID0gTlVMTDsKLSAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKLSAgeGNlcHRpb24gPSBOVUxMOworICBhc3NlcnQgKHhjZXB0aW9uID09IE5VTEwpOwogCiAgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X2V4Y2VwdGlvbiAoaWZhY2UsICJUZXN0IiwgJnhjZXB0aW9uLCAmZXJyb3IpID09IFRSVUUpOwogICBhc3NlcnQgKGVycm9yID09IE5VTEwpOwogCisgIG11bHRpX2luID0gKFRUZXN0WHRydWN0KikgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsIE5VTEwpOwogICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9tdWx0aV9leGNlcHRpb24gKGlmYWNlLCAmbXVsdGlfaW4sICJYY2VwdGlvbiIsIE5VTEwsICZ4Y2VwdGlvbiwgJnhjZXB0aW9uMiwgJmVycm9yKSA9PSBGQUxTRSk7CiAgIGFzc2VydCAoeGNlcHRpb24tPmVycm9yQ29kZSA9PSAxMDAxKTsKKyAgYXNzZXJ0ICh4Y2VwdGlvbjIgPT0gTlVMTCk7CiAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOwogICBlcnJvciA9IE5VTEw7CiAgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7CisgIGdfb2JqZWN0X3VucmVmIChtdWx0aV9pbik7CiAgIHhjZXB0aW9uID0gTlVMTDsKLSAgeGNlcHRpb24yID0gTlVMTDsKKyAgbXVsdGlfaW4gPSBOVUxMOwogCisgIG11bHRpX2luID0gKFRUZXN0WHRydWN0KikgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsIE5VTEwpOwogICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9tdWx0aV9leGNlcHRpb24gKGlmYWNlLCAmbXVsdGlfaW4sICJYY2VwdGlvbjIiLCBOVUxMLCAmeGNlcHRpb24sICZ4Y2VwdGlvbjIsICZlcnJvcikgPT0gRkFMU0UpOwogICBhc3NlcnQgKHhjZXB0aW9uMi0+ZXJyb3JDb2RlID09IDIwMDIpOworICBhc3NlcnQgKHhjZXB0aW9uID09IE5VTEwpOwogICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKICAgZXJyb3IgPSBOVUxMOwogICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24yKTsKKyAgZ19vYmplY3RfdW5yZWYgKG11bHRpX2luKTsKICAgeGNlcHRpb24yID0gTlVMTDsKKyAgbXVsdGlfaW4gPSBOVUxMOwogCisgIG11bHRpX2luID0gKFRUZXN0WHRydWN0KikgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsIE5VTEwpOwogICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9tdWx0aV9leGNlcHRpb24gKGlmYWNlLCAmbXVsdGlfaW4sIE5VTEwgLCBOVUxMLCAmeGNlcHRpb24sICZ4Y2VwdGlvbjIsICZlcnJvcikgPT0gVFJVRSk7CiAgIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmKG11bHRpX2luKTsKKyAgbXVsdGlfaW4gPSBOVUxMOwogCiAgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X29uZXdheSAoaWZhY2UsIDEsICZlcnJvcikgPT0gVFJVRSk7CiAgIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CkBAIC01NjQsMTEgKzYwNCwxMyBAQAogc3RhdGljIHZvaWQKIGJhaWxvdXQgKGludCBzaWdudW0pCiB7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUgKHNpZ251bSk7CisKICAgZXhpdCAoMSk7CiB9CiAKIGludAotbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorbWFpbiAodm9pZCkKIHsKICAgaW50IHN0YXR1czsKICAgaW50IHBpZCA9IGZvcmsgKCk7CkBAIC01NzYsMTEgKzYxOCwxMSBAQAogCiAgIGlmIChwaWQgPT0gMCkgLyogY2hpbGQgKi8KICAgewotICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOwotICAgIHNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+IHRlc3RIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigpKTsKLSAgICBzaGFyZWRfcHRyPFRocmlmdFRlc3RQcm9jZXNzb3I+IHRlc3RQcm9jZXNzb3IobmV3IFRocmlmdFRlc3RQcm9jZXNzb3IodGVzdEhhbmRsZXIpKTsKLSAgICBzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNlcnZlclNvY2tldChuZXcgVFNlcnZlclNvY2tldChURVNUX1BPUlQpKTsKLSAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RIYW5kbGVyPiB0ZXN0SGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmlmdFRlc3RQcm9jZXNzb3I+IHRlc3RQcm9jZXNzb3IobmV3IFRocmlmdFRlc3RQcm9jZXNzb3IodGVzdEhhbmRsZXIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc2VydmVyU29ja2V0KG5ldyBUU2VydmVyU29ja2V0KFRFU1RfUE9SVCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsKICAgICBUU2ltcGxlU2VydmVyIHNpbXBsZVNlcnZlcih0ZXN0UHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CiAgICAgc2lnbmFsIChTSUdBTFJNLCBiYWlsb3V0KTsKICAgICBhbGFybSAoNjApOwpAQCAtNTg5LDcgKzYzMSw3IEBACiAgICAgc2xlZXAgKDEpOwogICAgIHRlc3RfdGhyaWZ0X2NsaWVudCAoKTsKICAgICBraWxsIChwaWQsIFNJR0lOVCk7Ci0gICAgd2FpdCAoJnN0YXR1cykgPT0gcGlkOworICAgIGFzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKICAgfQogCiAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0cmFuc3BvcnRzb2NrZXQuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c29ja2V0LmMKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAyNzlkYTg2Li44OWM2MWI5Ci0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c29ja2V0LmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0cmFuc3BvcnRzb2NrZXQuYwpAQCAtMTcsMTIgKzE3LDEzIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgogCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaCIKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KIAogI2RlZmluZSBURVNUX0RBVEEgeyAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicgfQogCkBAIC0zMiw5ICszMyw5IEBACiBteV9zb2NrZXQoaW50IGRvbWFpbiwgaW50IHR5cGUsIGludCBwcm90b2NvbCkKIHsKICAgaWYgKHNvY2tldF9lcnJvciA9PSAwKQotICB7Ci0gICAgcmV0dXJuIHNvY2tldCAoZG9tYWluLCB0eXBlLCBwcm90b2NvbCk7Ci0gIH0KKyAgICB7CisgICAgICByZXR1cm4gc29ja2V0IChkb21haW4sIHR5cGUsIHByb3RvY29sKTsKKyAgICB9CiAgIHJldHVybiAtMTsKIH0KIApAQCAtNDMsOSArNDQsOSBAQAogbXlfcmVjdihpbnQgc29ja2V0LCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgsIGludCBmbGFncykKIHsKICAgaWYgKHJlY3ZfZXJyb3IgPT0gMCkKLSAgewotICAgIHJldHVybiByZWN2IChzb2NrZXQsIGJ1ZmZlciwgbGVuZ3RoLCBmbGFncyk7Ci0gIH0KKyAgICB7CisgICAgICByZXR1cm4gcmVjdiAoc29ja2V0LCBidWZmZXIsIGxlbmd0aCwgZmxhZ3MpOworICAgIH0KICAgcmV0dXJuIC0xOwogfQogCkBAIC01NCwyNSArNTUsMjIgQEAKIG15X3NlbmQoaW50IHNvY2tldCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCBpbnQgZmxhZ3MpCiB7CiAgIGlmIChzZW5kX2Vycm9yID09IDApCi0gIHsKLSAgICByZXR1cm4gc2VuZCAoc29ja2V0LCBidWZmZXIsIGxlbmd0aCwgZmxhZ3MpOwotICB9CisgICAgeworICAgICAgcmV0dXJuIHNlbmQgKHNvY2tldCwgYnVmZmVyLCBsZW5ndGgsIGZsYWdzKTsKKyAgICB9CiAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBzb2NrZXQgbXlfc29ja2V0CiAjZGVmaW5lIHJlY3YgbXlfcmVjdgogI2RlZmluZSBzZW5kIG15X3NlbmQKLSNpbmNsdWRlICIuLi9zcmMvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuYyIKKyNpbmNsdWRlICIuLi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5jIgogI3VuZGVmIHNvY2tldAogI3VuZGVmIHJlY3YKICN1bmRlZiBzZW5kCiAKLXN0YXRpYyBjb25zdCBjaGFyIFRFU1RfQUREUkVTU1tdID0gImxvY2FsaG9zdCI7Ci1zdGF0aWMgY29uc3Qgc2hvcnQgVEVTVF9QT1JUID0gNjQ0NDQ7Ci0KIHN0YXRpYyB2b2lkIHRocmlmdF9zb2NrZXRfc2VydmVyIChjb25zdCBpbnQgcG9ydCk7Ci0KK3N0YXRpYyB2b2lkIHRocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKGNvbnN0IGludCBwb3J0LCBpbnQgdGltZXMpOwogLyogdGVzdCBvYmplY3QgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uICovCiBzdGF0aWMgdm9pZAogdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kodm9pZCkKQEAgLTgyLDcgKzgwLDcgQEAKIAogICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOwogICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgTlVMTCk7Ci0gIGFzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOwogICBnX29iamVjdF9nZXQgKEdfT0JKRUNUKG9iamVjdCksICJob3N0bmFtZSIsICZob3N0bmFtZSwgInBvcnQiLCAmcG9ydCwgTlVMTCk7CiAgIGdfZnJlZSAoaG9zdG5hbWUpOwogCkBAIC05NSw4NSArOTMsMjIzIEBACiAgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CiAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKICAgR0Vycm9yICplcnIgPSBOVUxMOworICBpbnQgcG9ydCA9IDUxMTk5OworICBwaWRfdCBwaWQ7CisgIGludCBzdGF0dXM7CiAKLSAgLyogb3BlbiBhIGNvbm5lY3Rpb24gYW5kIGNsb3NlIGl0ICovCi0gIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgNTExODgsIE5VTEwpOyAKLSAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7Ci0gIHRocmlmdF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKLSAgYXNzZXJ0ICh0aHJpZnRfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gVFJVRSk7Ci0gIHRocmlmdF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7Ci0gIGFzc2VydCAodGhyaWZ0X3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpID09IEZBTFNFKTsKKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOwogCi0gIC8qIHRlc3QgY2xvc2UgZmFpbHVyZSAqLwotICB0c29ja2V0LT5zZCA9IC0xOwotICB0aHJpZnRfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOwotICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisgIGlmICggcGlkID09IDAgKQorICAgIHsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIHRocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKHBvcnQsIDEpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKIAotICAvKiB0cnkgYSBob3N0bmFtZSBsb29rdXAgZmFpbHVyZSAqLwotICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QuYnJva2VuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOwotICBhc3NlcnQgKHRocmlmdF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCAmZXJyKSA9PSBGQUxTRSk7Ci0gIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKLSAgZ19lcnJvcl9mcmVlIChlcnIpOwotICBlcnIgPSBOVUxMOworCS8qIG9wZW4gYSBjb25uZWN0aW9uIGFuZCBjbG9zZSBpdCAqLworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJInBvcnQiLCBwb3J0LCBOVUxMKTsKKwl0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKKwl0aHJpZnRfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisJZ19hc3NlcnQgKHRocmlmdF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBUUlVFKTsKKwl0aHJpZnRfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCWdfYXNzZXJ0ICh0aHJpZnRfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gRkFMU0UpOwogCi0gIC8qIHRyeSBhbiBlcnJvciBjYWxsIHRvIHNvY2tldCgpICovCi0gIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsIE5VTEwpOwotICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKLSAgc29ja2V0X2Vycm9yID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgJmVycikgPT0gRkFMU0UpOwotICBzb2NrZXRfZXJyb3IgPSAwOwotICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Ci0gIGdfZXJyb3JfZnJlZSAoZXJyKTsKKwkvKiB0ZXN0IGNsb3NlIGZhaWx1cmUgKi8KKwl0c29ja2V0LT5zZCA9IC0xOworCXRocmlmdF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCisJLyogdHJ5IGEgaG9zdG5hbWUgbG9va3VwIGZhaWx1cmUgKi8KKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QuYnJva2VuIiwKKwkJCQlOVUxMKTsKKwl0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NvY2tldF9vcGVuICh0cmFuc3BvcnQsICZlcnIpID09IEZBTFNFKTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJZ19lcnJvcl9mcmVlIChlcnIpOworCWVyciA9IE5VTEw7CisKKwkvKiB0cnkgYW4gZXJyb3IgY2FsbCB0byBzb2NrZXQoKSAqLworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsIE5VTEwpOworCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworCXNvY2tldF9lcnJvciA9IDE7CisJZ19hc3NlcnQgKHRocmlmdF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCAmZXJyKSA9PSBGQUxTRSk7CisJc29ja2V0X2Vycm9yID0gMDsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJZ19lcnJvcl9mcmVlIChlcnIpOworCWdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7CisJZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIHRlc3RfcmVhZF9hbmRfd3JpdGUodm9pZCkKIHsKLSAgaW50IHN0YXR1czsKLSAgcGlkX3QgcGlkOwogICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOwogICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIHBpZF90IHBpZDsKICAgaW50IHBvcnQgPSA1MTE5OTsKKyAgaW50IHN0YXR1czsKICAgZ3VjaGFyIGJ1ZlsxMF0gPSBURVNUX0RBVEE7IC8qIGEgYnVmZmVyICovCiAKICAgcGlkID0gZm9yayAoKTsKLSAgYXNzZXJ0ICggcGlkID49IDAgKTsKKyAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOwogCiAgIGlmICggcGlkID09IDAgKQotICB7Ci0gICAgLyogY2hpbGQgbGlzdGVucyAqLwotICAgIHRocmlmdF9zb2NrZXRfc2VydmVyIChwb3J0KTsKLSAgICBleGl0ICgwKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLwotICAgIHNsZWVwICgxKTsKKyAgICB7CisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICB0aHJpZnRfc29ja2V0X3NlcnZlciAocG9ydCk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOwogCi0gICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOwotICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOwotICAgIGFzc2VydCAodGhyaWZ0X3NvY2tldF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOwotICAgIGFzc2VydCAodGhyaWZ0X3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpKTsKLSAgICB0aHJpZnRfc29ja2V0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJInBvcnQiLCBwb3J0LCBOVUxMKTsKKwl0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NvY2tldF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCXRocmlmdF9zb2NrZXRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CiAKLSAgICAvKiB3cml0ZSBmYWlsICovCi0gICAgc2VuZF9lcnJvciA9IDE7Ci0gICAgdGhyaWZ0X3NvY2tldF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOwotICAgIHNlbmRfZXJyb3IgPSAwOworCS8qIHdyaXRlIGZhaWwgKi8KKwlzZW5kX2Vycm9yID0gMTsKKwl0aHJpZnRfc29ja2V0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisJc2VuZF9lcnJvciA9IDA7CiAKLSAgICB0aHJpZnRfc29ja2V0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICB0aHJpZnRfc29ja2V0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIHRocmlmdF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCXRocmlmdF9zb2NrZXRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9zb2NrZXRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiAKLSAgICBhc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKLSAgICBhc3NlcnQgKCBzdGF0dXMgPT0gMCApOworCWdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7CisJZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAgIH0KK30KKworLyogdGVzdCBUaHJpZnRTb2NrZXQncyBwZWVrKCkgaW1wbGVtZW50YXRpb24gKi8KK3N0YXRpYyB2b2lkCit0ZXN0X3BlZWsodm9pZCkKK3sKKyAgZ2ludCBzdGF0dXM7CisgIHBpZF90IHBpZDsKKyAgZ3VpbnQgcG9ydCA9IDUxMTk5OworICBnY2hhciBkYXRhID0gJ0EnOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudF90cmFuc3BvcnQ7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworCisgIGNsaWVudF90cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwKKwkJCQkgICAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkgICAicG9ydCIsICAgICBwb3J0LAorCQkJCSAgIE5VTEwpOworCisgIC8qIHRocmlmdF90cmFuc3BvcnRfcGVlayByZXR1cm5zIEZBTFNFIHdoZW4gdGhlIHNvY2tldCBpcyBjbG9zZWQgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAoY2xpZW50X3RyYW5zcG9ydCkgPT0gRkFMU0UpOworICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9wZWVrIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpID09IEZBTFNFKTsKKyAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0IChwaWQgPj0gMCk7CisKKyAgaWYgKHBpZCA9PSAwKQorICAgIHsKKyAgICAgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqc2VydmVyX3RyYW5zcG9ydCA9IE5VTEw7CisKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKKworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgc2VydmVyX3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkgICAgICAgInBvcnQiLCBwb3J0LAorCQkJCSAgICAgICBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChzZXJ2ZXJfdHJhbnNwb3J0ICE9IE5VTEwpOworCisgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHNlcnZlcl90cmFuc3BvcnQsICZlcnJvcik7CisgICAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisKKyAgICAgIGNsaWVudF90cmFuc3BvcnQgPSBnX29iamVjdF9uZXcKKwkgIChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCisJICAgInRyYW5zcG9ydCIsICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHNlcnZlcl90cmFuc3BvcnQsICZlcnJvciksCisJICAgInJfYnVmX3NpemUiLCAwLAorCSAgICJ3X2J1Zl9zaXplIiwgc2l6ZW9mIGRhdGEsCisJICAgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgICAgICBnX2Fzc2VydCAoY2xpZW50X3RyYW5zcG9ydCAhPSBOVUxMKTsKKworICAgICAgLyogd3JpdGUgZXhhY3RseSBvbmUgY2hhcmFjdGVyIHRvIHRoZSBjbGllbnQgKi8KKyAgICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChjbGllbnRfdHJhbnNwb3J0LAorCQkJCQkmZGF0YSwKKwkJCQkJc2l6ZW9mIGRhdGEsCisJCQkJCSZlcnJvcikgPT0gVFJVRSk7CisKKyAgICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcik7CisgICAgICB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKKyAgICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcik7CisKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChzZXJ2ZXJfdHJhbnNwb3J0KTsKKworICAgICAgZXhpdCAoMCk7CisgICAgfQorICBlbHNlIHsKKyAgICAgIC8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisgICAgICBzbGVlcCAoMSk7CisKKyAgICAgIC8qIGNvbm5lY3QgdG8gdGhlIGNoaWxkICovCisgICAgICB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcik7CisgICAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgICAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuIChjbGllbnRfdHJhbnNwb3J0KSA9PSBUUlVFKTsKKworICAgICAgLyogdGhyaWZ0X3RyYW5zcG9ydF9wZWVrIHJldHVybnMgVFJVRSB3aGVuIHRoZSBzb2NrZXQgaXMgb3BlbiBhbmQgdGhlcmUgaXMKKyAgICAgICBkYXRhIGF2YWlsYWJsZSB0byBiZSByZWFkICovCisgICAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9wZWVrIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpID09IFRSVUUpOworICAgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworCisgICAgICAvKiByZWFkIGV4YWN0bHkgb25lIGNoYXJhY3RlciBmcm9tIHRoZSBzZXJ2ZXIgKi8KKyAgICAgIGdfYXNzZXJ0X2NtcGludCAodGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChjbGllbnRfdHJhbnNwb3J0LAorCQkJCQkgICAgICAmZGF0YSwKKwkJCQkJICAgICAgc2l6ZW9mIGRhdGEsCisJCQkJCSAgICAgICZlcnJvciksID09LCBzaXplb2YgZGF0YSk7CisKKyAgICAgIC8qIHRocmlmdF90cmFuc3BvcnRfcGVlayByZXR1cm5zIEZBTFNFIHdoZW4gdGhlIHNvY2tldCBpcyBvcGVuIGJ1dCB0aGVyZSBpcworICAgICAgIG5vIChtb3JlKSBkYXRhIGF2YWlsYWJsZSB0byBiZSByZWFkICovCisgICAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuIChjbGllbnRfdHJhbnNwb3J0KSA9PSBUUlVFKTsKKyAgICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcikgPT0gRkFMU0UpOworICAgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworCisgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpOworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKKworICAgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudF90cmFuc3BvcnQpOworCisgICAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKyAgICAgIGdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CiAgIH0KIH0KIAogc3RhdGljIHZvaWQKK3RocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKGNvbnN0IGludCBwb3J0LCBpbnQgdGltZXMpCit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBpbnQgaTsKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorCQkJCQkgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworCisgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworICBmb3IoaT0wO2k8dGltZXM7aSsrKXsKKyAgICAgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisgICAgICB0aHJpZnRfc29ja2V0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworICAgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CisgIH0KKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworfQorCisKK3N0YXRpYyB2b2lkCiB0aHJpZnRfc29ja2V0X3NlcnZlciAoY29uc3QgaW50IHBvcnQpCiB7CiAgIGludCBieXRlcyA9IDA7CkBAIC0xODMsMTcgKzMxOSwxNyBAQAogICBndWNoYXIgbWF0Y2hbMTBdID0gVEVTVF9EQVRBOwogCiAgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworCQkJCQkgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOwogCiAgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOwogICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7Ci0gIGFzc2VydCAoY2xpZW50ICE9IE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOwogCiAgIC8qIHJlYWQgMTAgYnl0ZXMgKi8KICAgYnl0ZXMgPSB0aHJpZnRfc29ja2V0X3JlYWQgKGNsaWVudCwgYnVmLCAxMCwgTlVMTCk7Ci0gIGFzc2VydCAoYnl0ZXMgPT0gMTApOyAvKiBtYWtlIHN1cmUgd2UndmUgcmVhZCAxMCBieXRlcyAqLwotICBhc3NlcnQgKCBtZW1jbXAoYnVmLCBtYXRjaCwgMTApID09IDAgKTsgLyogbWFrZSBzdXJlIHdoYXQgd2UgZ290IG1hdGNoZXMgKi8KKyAgZ19hc3NlcnQgKGJ5dGVzID09IDEwKTsgLyogbWFrZSBzdXJlIHdlJ3ZlIHJlYWQgMTAgYnl0ZXMgKi8KKyAgZ19hc3NlcnQgKCBtZW1jbXAoYnVmLCBtYXRjaCwgMTApID09IDAgKTsgLyogbWFrZSBzdXJlIHdoYXQgd2UgZ290IG1hdGNoZXMgKi8KIAogICAvKiBmYWlsZWQgcmVhZCAqLwogICByZWN2X2Vycm9yID0gMTsKQEAgLTIwOSwxMiArMzQ1LDE2IEBACiBpbnQKIG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQogICBnX3R5cGVfaW5pdCgpOworI2VuZGlmCisKICAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CiAKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0cmFuc3BvcnRzb2NrZXQvQ3JlYXRlQW5kRGVzdHJveSIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95KTsKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0cmFuc3BvcnRzb2NrZXQvT3BlbkFuZENsb3NlIiwgdGVzdF9vcGVuX2FuZF9jbG9zZSk7CiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dHJhbnNwb3J0c29ja2V0L1JlYWRBbmRXcml0ZSIsIHRlc3RfcmVhZF9hbmRfd3JpdGUpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRyYW5zcG9ydHNvY2tldC9QZWVrIiwgdGVzdF9wZWVrKTsKIAogICByZXR1cm4gZ190ZXN0X3J1biAoKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0LmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNzbHNvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMjY0NGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNzbHNvY2tldC5jCkBAIC0wLDAgKzEsNTQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIF9QT1NJWF9DX1NPVVJDRSAyMDAxMTJMIC8qIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM3NTQxOTg1L3N0b3JhZ2Utc2l6ZS1vZi1hZGRyaW5mby1pc250LWtub3duICovCisKKworI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5oPgorCisvKiAjZGVmaW5lIFRFU1RfREFUQSB7ICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJyB9ICovCisjZGVmaW5lIFRFU1RfREFUQSB7ICJHRVQgLyBIVFRQLzEuMVxuXG4iIH0KKworCisvKiBzdWJzdGl0dXRlZCBmdW5jdGlvbnMgdG8gdGVzdCBmYWlsdXJlcyBvZiBzeXN0ZW0gYW5kIGxpYnJhcnkgY2FsbHMgKi8KK3N0YXRpYyBpbnQgc29ja2V0X2Vycm9yID0gMDsKK2ludAorbXlfc29ja2V0KGludCBkb21haW4sIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpCit7CisgIGlmIChzb2NrZXRfZXJyb3IgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gc29ja2V0IChkb21haW4sIHR5cGUsIHByb3RvY29sKTsKKyAgICB9CisgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCByZWN2X2Vycm9yID0gMDsKK3NzaXplX3QKK215X3JlY3YoaW50IHNvY2tldCwgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCBpbnQgZmxhZ3MpCit7CisgIGlmIChyZWN2X2Vycm9yID09IDApCisgICAgeworICAgICAgcmV0dXJuIHJlY3YgKHNvY2tldCwgYnVmZmVyLCBsZW5ndGgsIGZsYWdzKTsKKyAgICB9CisgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBzZW5kX2Vycm9yID0gMDsKK3NzaXplX3QKK215X3NlbmQoaW50IHNvY2tldCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCBpbnQgZmxhZ3MpCit7CisgIGlmIChzZW5kX2Vycm9yID09IDApCisgICAgeworICAgICAgcmV0dXJuIHNlbmQgKHNvY2tldCwgYnVmZmVyLCBsZW5ndGgsIGZsYWdzKTsKKyAgICB9CisgIHJldHVybiAtMTsKK30KKworI2RlZmluZSBzb2NrZXQgbXlfc29ja2V0CisjZGVmaW5lIHJlY3YgbXlfcmVjdgorI2RlZmluZSBzZW5kIG15X3NlbmQKKyNpbmNsdWRlICIuLi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuYyIKKyN1bmRlZiBzb2NrZXQKKyN1bmRlZiByZWN2CisjdW5kZWYgc2VuZAorCitzdGF0aWMgdm9pZCB0aHJpZnRfc29ja2V0X3NlcnZlciAoY29uc3QgaW50IHBvcnQpOworCisvKiB0ZXN0IG9iamVjdCBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KK3N0YXRpYyB2b2lkCit0ZXN0X3NzbF9jcmVhdGVfYW5kX2Rlc3Ryb3kodm9pZCkKK3sKKyAgZ2NoYXIgKmhvc3RuYW1lID0gTlVMTDsKKyAgZ3VpbnQgcG9ydCA9IDA7CisKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TU0xfU09DS0VULCBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0IChHX09CSkVDVChvYmplY3QpLCAiaG9zdG5hbWUiLCAmaG9zdG5hbWUsICJwb3J0IiwgJnBvcnQsIE5VTEwpOworICBnX2ZyZWUgKGhvc3RuYW1lKTsKKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3NzbF9jcmVhdGVfYW5kX3NldF9wcm9wZXJ0aWVzKHZvaWQpCit7CisgIGdjaGFyICpob3N0bmFtZSA9IE5VTEw7CisgIGd1aW50IHBvcnQgPSAwOworICBTU0xfQ1RYKiBzc2xfY3R4PSBOVUxMOworICBHRXJyb3IgKmVycm9yPU5VTEw7CisKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKyAgb2JqZWN0ID0gdGhyaWZ0X3NzbF9zb2NrZXRfbmV3KFNTTFRMUywgJmVycm9yKTsKKyAgZ19vYmplY3RfZ2V0IChHX09CSkVDVChvYmplY3QpLCAiaG9zdG5hbWUiLCAmaG9zdG5hbWUsICJwb3J0IiwgJnBvcnQsICJzc2xfY29udGV4dCIsICZzc2xfY3R4LCBOVUxMKTsKKyAgZ19hc3NlcnQgKHNzbF9jdHghPU5VTEwpOworCisgIGdfZnJlZSAoaG9zdG5hbWUpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3NsX29wZW5fYW5kX2Nsb3NlX25vbl9zc2xfc2VydmVyKHZvaWQpCit7CisgIFRocmlmdFNTTFNvY2tldCAqdFNTTFNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgR0Vycm9yICplcnJvcj1OVUxMOworICBwaWRfdCBwaWQ7CisgIGludCBub25fc3NsX3BvcnQgPSA1MTE5ODsKKyAgY2hhciBlcnJvcm1zZ1syNTVdOworCisKKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOworCisgIGlmICggcGlkID09IDAgKQorICAgIHsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIC8qIFRoaXMgaXMgYSBub24gU1NMIHNlcnZlciAqLworICAgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXIgKG5vbl9zc2xfcG9ydCk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOworCisJLyogb3BlbiBhIGNvbm5lY3Rpb24gYW5kIGNsb3NlIGl0ICovCisJdFNTTFNvY2tldCA9IHRocmlmdF9zc2xfc29ja2V0X25ld193aXRoX2hvc3QoU1NMVExTLCAibG9jYWxob3N0Iiwgbm9uX3NzbF9wb3J0LCAmZXJyb3IpOworCisJdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodFNTTFNvY2tldCk7CisJZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgJmVycm9yKSA9PSBGQUxTRSk7CisJZ19hc3NlcnRfY21wc3RyKGVycm9yLT5tZXNzYWdlLCA9PSAsIkVycm9yIHdoaWxlIGNvbm5lY3QvYmluZDogNjggLT4gQ29ubmVjdGlvbiByZXNldCBieSBwZWVyIik7CisJZ19jbGVhcl9lcnJvciAoJmVycm9yKTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBGQUxTRSk7CisJdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisJZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gRkFMU0UpOworCisJLyogdGVzdCBjbG9zZSBmYWlsdXJlICovCisJVEhSSUZUX1NPQ0tFVCh0U1NMU29ja2V0KS0+c2QgPSAtMTsKKwl0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKwlnX29iamVjdF91bnJlZiAodFNTTFNvY2tldCk7CisKKwkvKiB0cnkgYSBob3N0bmFtZSBsb29rdXAgZmFpbHVyZSAqLworCXRTU0xTb2NrZXQgPSB0aHJpZnRfc3NsX3NvY2tldF9uZXdfd2l0aF9ob3N0KFNTTFRMUywgImxvY2FsaG9zdC5icm9rZW4iLCBub25fc3NsX3BvcnQsICZlcnJvcik7CisJdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodFNTTFNvY2tldCk7CisJZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgJmVycm9yKSA9PSBGQUxTRSk7CisJc25wcmludGYoZXJyb3Jtc2csIDI1NSwgImhvc3QgbG9va3VwIGZhaWxlZCBmb3IgbG9jYWxob3N0LmJyb2tlbjolZCAtIFVua25vd24gaG9zdCIsIG5vbl9zc2xfcG9ydCk7CisJZ19hc3NlcnRfY21wc3RyKGVycm9yLT5tZXNzYWdlLCA9PSwgZXJyb3Jtc2cpOworCWdfY2xlYXJfZXJyb3IgKCZlcnJvcik7CisJZ19vYmplY3RfdW5yZWYgKHRTU0xTb2NrZXQpOworCWVycm9yID0gTlVMTDsKKworCQkvKiB0cnkgYW4gZXJyb3IgY2FsbCB0byBzb2NrZXQoKSAqLworCS8qCisJCXRTU0xTb2NrZXQgPSB0aHJpZnRfc3NsX3NvY2tldF9uZXdfd2l0aF9ob3N0KFNTTFRMUywgImxvY2FsaG9zdCIsIHBvcnQsICZlcnJvcik7CisJCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRTU0xTb2NrZXQpOworCQlzb2NrZXRfZXJyb3IgPSAxOworCQlhc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgJmVycm9yKSA9PSBGQUxTRSk7CisJCXNvY2tldF9lcnJvciA9IDA7CisJCWdfb2JqZWN0X3VucmVmICh0U1NMU29ja2V0KTsKKwkJZ19lcnJvcl9mcmVlIChlcnJvcik7CisJICovCisgICAgfQorfQorCitzdGF0aWMgdm9pZAordGVzdF9zc2xfd3JpdGVfaW52YWxpZF9zb2NrZXQodm9pZCkKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICp0U1NMU29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBHRXJyb3IgKmVycm9yPU5VTEw7CisgIGNoYXIgYnVmZmVyW10gPSAidGhpcyBtdXN0IG5vdCBicmVhayI7CisKKyAgLyogb3BlbiBhIGNvbm5lY3Rpb24gYW5kIGNsb3NlIGl0ICovCisgIHRTU0xTb2NrZXQgPSB0aHJpZnRfc3NsX3NvY2tldF9uZXdfd2l0aF9ob3N0KFNTTFRMUywgImxvY2FsaG9zdCIsIDUxMTg4KzEsICZlcnJvcik7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodFNTTFNvY2tldCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IEZBTFNFKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gRkFMU0UpOworCisgIC8qIEZJWE1FIFRoaXMgbXVzdCBiZSB0ZXN0ZWQgYnV0IHNpbmNlIHRoZSBhc3NlcnRpb24gaW5zaWRlIHRocmlmdF9zc2xfc29ja2V0X3dyaXRlIGJyZWFrcyB0aGUgdGVzdCB1bml0CisgICBpdCdzIGRpc2FibGVkLiBUaGV5IGlkZWEgaXMgdG8gZGlzYWJsZSB0cmFwL2NvcmVkdW1wIGR1cmluZyB0aGlzIHRlc3QKKyAgZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X3dyaXRlKHRyYW5zcG9ydCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgJmVycm9yKSA9PSBGQUxTRSk7CisgIGdfbWVzc2FnZSAoIndyaXRlX2ZhaWxlZF93aXRoX2Vycm9yOiAlcyIsCisJICAgICBlcnJvciAhPSBOVUxMID8gZXJyb3ItPm1lc3NhZ2UgOiAiTm8iKTsKKyAgZ19jbGVhcl9lcnJvciAoJmVycm9yKTsKKyAgKi8KKyAgdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpID09IEZBTFNFKTsKKworICAvKiB0ZXN0IGNsb3NlIGZhaWx1cmUgKi8KKyAgVEhSSUZUX1NPQ0tFVCh0U1NMU29ja2V0KS0+c2QgPSAtMTsKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmICh0U1NMU29ja2V0KTsKK30KKworCisKKy8qKgorICogUHJpbnQgdGhlIGNvbW1vbiBuYW1lIG9mIGNlcnRpZmljYXRlCisgKi8KK3Vuc2lnbmVkIGNoYXIgKiBnZXRfY25fbmFtZShYNTA5X05BTUUqIGNvbnN0IG5hbWUpCit7CisgIGludCBpZHggPSAtMTsKKyAgdW5zaWduZWQgY2hhciAqdXRmOCA9IE5VTEw7CisKKyAgZG8KKyAgICB7CisgICAgICBpZighbmFtZSkgYnJlYWs7IC8qIGZhaWxlZCAqLworCisgICAgICBpZHggPSBYNTA5X05BTUVfZ2V0X2luZGV4X2J5X05JRChuYW1lLCBOSURfY29tbW9uTmFtZSwgLTEpOworICAgICAgaWYoIShpZHggPiAtMSkpICBicmVhazsgLyogZmFpbGVkICovCisKKyAgICAgIFg1MDlfTkFNRV9FTlRSWSogZW50cnkgPSBYNTA5X05BTUVfZ2V0X2VudHJ5KG5hbWUsIGlkeCk7CisgICAgICBpZighZW50cnkpIGJyZWFrOyAvKiBmYWlsZWQgKi8KKworICAgICAgQVNOMV9TVFJJTkcqIGRhdGEgPSBYNTA5X05BTUVfRU5UUllfZ2V0X2RhdGEoZW50cnkpOworICAgICAgaWYoIWRhdGEpIGJyZWFrOyAvKiBmYWlsZWQgKi8KKworICAgICAgaW50IGxlbmd0aCA9IEFTTjFfU1RSSU5HX3RvX1VURjgoJnV0ZjgsIGRhdGEpOworICAgICAgaWYoIXV0ZjggfHwgIShsZW5ndGggPiAwKSkgIGJyZWFrOyAvKiBmYWlsZWQgKi8KKworICAgIH0gd2hpbGUgKDApOworICByZXR1cm4gdXRmODsKK30KKworLyoKKyAqIEhhbmRsZSBJUFY0IGFuZCBJUFY2IGFkZHIKKyAqLwordm9pZCAqZ2V0X2luX2FkZHIoc3RydWN0IHNvY2thZGRyICpzYSkKK3sKKyAgaWYgKHNhLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkKKyAgICByZXR1cm4gJigoKHN0cnVjdCBzb2NrYWRkcl9pbiopc2EpLT5zaW5fYWRkcik7CisgIHJldHVybiAmKCgoc3RydWN0IHNvY2thZGRyX2luNiopc2EpLT5zaW42X2FkZHIpOworfQorCitpbnQgdmVyaWZ5X2lwKGNoYXIgKiBob3N0bmFtZSwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIpCit7CisgIHN0cnVjdCBhZGRyaW5mbyAqYWRkcl9pbmZvLCpwOworICBzdHJ1Y3QgYWRkcmluZm8gaGludHM7CisgIGludCByZXM7CisgIGludCByZXR2YWwgPSAwOworCisKKyAgbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mIChzdHJ1Y3QgYWRkcmluZm8pKTsKKyAgaGludHMuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOyAvKiB1c2UgQUZfSU5FVDYgdG8gZm9yY2UgSVB2NiAqLworICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworCisKKyAgaWYgKCAocmVzID0gZ2V0YWRkcmluZm8oaG9zdG5hbWUsIE5VTEwsICZoaW50cywgJmFkZHJfaW5mbykgKSAhPSAwKQorICAgIHsKKyAgICAgIC8qIGdldCB0aGUgaG9zdCBpbmZvICovCisgICAgICBnX2Vycm9yKCJDYW5ub3QgZ2V0IHRoZSBob3N0IGFkZHJlc3MiKTsKKyAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICAvKiBsb29wIHRocm91Z2ggYWxsIHRoZSByZXN1bHRzIGFuZCBjb25uZWN0IHRvIHRoZSBmaXJzdCB3ZSBjYW4gKi8KKyAgY2hhciBkbnNob3N0W0lORVQ2X0FERFJTVFJMRU5dOyAvKiBiaWdnZXIgYWRkciBzdXBwb3J0ZWQgSVBWNiAqLworICBjaGFyIHNvY2tldF9pcFtJTkVUNl9BRERSU1RSTEVOXTsKKyAgaWYoaW5ldF9udG9wKGFkZHItPnNzX2ZhbWlseSwgZ2V0X2luX2FkZHIoYWRkciksIHNvY2tldF9pcCwgSU5FVDZfQUREUlNUUkxFTik9PXNvY2tldF9pcCl7CisgICAgICBnX2RlYnVnKCJXZSBhcmUgY29ubmVjdGVkIHRvIGhvc3QgJXMgY2hlY2tpbmcgYWdhaW5zdCBjZXJ0aWZpY2F0ZS4uLiIsIHNvY2tldF9pcCk7CisgICAgICBpbnQgc2l6ZWlwID0gc29ja2V0X2lwIT1OVUxMID8gc3RybGVuKHNvY2tldF9pcCkgOiAwOworICAgICAgZm9yKHAgPSBhZGRyX2luZm87IHAgIT0gTlVMTDsgcCA9IHAtPmFpX25leHQpIHsKKwkgIGlmKGluZXRfbnRvcChwLT5haV9mYW1pbHksIGdldF9pbl9hZGRyKChzdHJ1Y3Qgc29ja2FkZHIgKilwLT5haV9hZGRyKSwgZG5zaG9zdCwgSU5FVDZfQUREUlNUUkxFTik9PWRuc2hvc3QpeworCSAgICAgIGlmKGRuc2hvc3QhPU5VTEwpeworCQkgIGdfaW5mbygiRE5TIGFkZHJlc3MgWyVpIC0+ICVzXSIsIHAtPmFpX2FkZHIsIGRuc2hvc3QpOworCQkgIGlmKCFzdHJuY21wKGRuc2hvc3QsIHNvY2tldF9pcCwgc2l6ZWlwKSl7CisJCSAgICAgIHJldHZhbD0xOworCQkgICAgICBicmVhazsgLyogaWYgd2UgZ2V0IGhlcmUsIHdlIG11c3QgaGF2ZSBjb25uZWN0ZWQgc3VjY2Vzc2Z1bGx5ICovCisJCSAgfQorCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKyAgfQorCisgIGlmKGFkZHJfaW5mbykKKyAgICBmcmVlYWRkcmluZm8oYWRkcl9pbmZvKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZAorcmVhZF9mcm9tX2ZpbGUoY2hhciAqYnVmZmVyLCBsb25nIHNpemUsIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSkKK3sKKyAgY2hhciBjaDsKKyAgbG9uZyBpbmRleD0wOworICBGSUxFICpmcDsKKworICBmcCA9IGZvcGVuKGZpbGVfbmFtZSwiciIpOyAvKiByZWFkIG1vZGUgKi8KKworICBpZiggZnAgPT0gTlVMTCApCisgICAgeworICAgICAgcGVycm9yKCJFcnJvciB3aGlsZSBvcGVuaW5nIHRoZSBmaWxlLlxuIik7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgfQorCisgIHByaW50ZigiVGhlIGNvbnRlbnRzIG9mICVzIGZpbGUgYXJlIDpcbiIsIGZpbGVfbmFtZSk7CisKKyAgd2hpbGUoaW5kZXg8c2l6ZSAmJiAoIGNoID0gZmdldGMoZnApICkgIT0gRU9GICl7CisgICAgICBidWZmZXJbaW5kZXgrK10gPSBjaDsKKyAgfQorCisgIGZjbG9zZShmcCk7Cit9CisKKyNkZWZpbmUgSVNTVUVSX0NOX1BJTk5JTkcgIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIKKyNkZWZpbmUgU1VCSkVDVF9DTl9QSU5OSU5HICJsb2NhbGhvc3QiCisjZGVmaW5lIENFUlRfU0VSSUFMX05VTUJFUiAiMSIKKworZ2Jvb2xlYW4gdmVyaWZ5X2NlcnRpZmljYXRlX3NuKFg1MDkgKmNlcnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlcmlhbF9udW1iZXIpCit7CisgIGdib29sZWFuIHJldHZhbCA9IEZBTFNFOworCisgIEFTTjFfSU5URUdFUiAqc2VyaWFsID0gWDUwOV9nZXRfc2VyaWFsTnVtYmVyKGNlcnQpOworCisgIEJJR05VTSAqYm4gPSBBU04xX0lOVEVHRVJfdG9fQk4oc2VyaWFsLCBOVUxMKTsKKyAgaWYgKCFibikgeworICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmFibGUgdG8gY29udmVydCBBU04xSU5URUdFUiB0byBCTlxuIik7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisgIGNoYXIgKnRtcCA9IEJOX2JuMmRlYyhibik7CisgIGlmICghdG1wKSB7CisgICAgICBnX3dhcm5pbmcoc3RkZXJyLCAidW5hYmxlIHRvIGNvbnZlcnQgQk4gdG8gZGVjaW1hbCBzdHJpbmcuXG4iKTsKKyAgICAgIEJOX2ZyZWUoYm4pOworICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorICAvKgorICAgIGlmIChzdHJsZW4odG1wKSA+PSBsZW4pIHsKKyAgICAgIGdfd2FybihzdGRlcnIsICJidWZmZXIgbGVuZ3RoIHNob3J0ZXIgdGhhbiBzZXJpYWwgbnVtYmVyXG4iKTsKKyAgICAgIEJOX2ZyZWUoYm4pOworICAgICAgT1BFTlNTTF9mcmVlKHRtcCk7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgKi8KKyAgaWYoIXN0cm5jbXAoc2VyaWFsX251bWJlciwgdG1wLCBzdHJsZW4oc2VyaWFsX251bWJlcikpKXsKKyAgICAgIHJldHZhbD1UUlVFOworICB9ZWxzZXsKKyAgICAgIGdfd2FybmluZygiU2VyaWFsIG51bWJlciBpcyBub3QgdmFsaWQiKTsKKyAgfQorCisgIEJOX2ZyZWUoYm4pOworICBPUEVOU1NMX2ZyZWUodG1wKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworZ2Jvb2xlYW4gbXlfYWNjZXNzX21hbmFnZXIoVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0LCBYNTA5ICpjZXJ0LCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkciwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNTTFNvY2tldCAqc3NsU29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisKKyAgZ19pbmZvKCJQcm9jZXNzaW5nIGFjY2VzcyB0byB0aGUgc2VydmVyIik7CisgIFg1MDlfTkFNRSogaW5hbWUgPSBjZXJ0ID8gWDUwOV9nZXRfaXNzdWVyX25hbWUoY2VydCkgOiBOVUxMOworICBYNTA5X05BTUUqIHNuYW1lID0gY2VydCA/IFg1MDlfZ2V0X3N1YmplY3RfbmFtZShjZXJ0KSA6IE5VTEw7CisKKyAgLyogSXNzdWVyIGlzIHRoZSBhdXRob3JpdHkgd2UgdHJ1c3QgdGhhdCB3YXJyYW50cyBub3RoaW5nIHVzZWZ1bCAqLworICBjb25zdCB1bnNpZ25lZCBjaGFyICogaXNzdWVyID0gZ2V0X2NuX25hbWUoaW5hbWUpOworICBpZihpc3N1ZXIpeworICAgICAgZ2Jvb2xlYW4gdmFsaWQgPSBUUlVFOworICAgICAgZ19pbmZvKCJJc3N1ZXIgKGNuKSAlcyIsIGlzc3Vlcik7CisKKyAgICAgIC8qIElzc3VlciBwaW5uaW5nICovCisgICAgICBpZihzdHJuY21wKElTU1VFUl9DTl9QSU5OSU5HLCBpc3N1ZXIsIHN0cmxlbihJU1NVRVJfQ05fUElOTklORykpKXsKKwkgIGdfd2FybmluZygiVGhlIElzc3VlciBvZiB0aGUgY2VydGlmaWNhdGUgaXMgbm90IHZhbGlkIik7CisJICB2YWxpZD1GQUxTRTsKKyAgICAgIH0KKyAgICAgIE9QRU5TU0xfZnJlZShpc3N1ZXIpOworICAgICAgaWYoIXZhbGlkKQorCXJldHVybiB2YWxpZDsKKyAgfQorCisKKyAgLyogU3ViamVjdCBpcyB3aG8gdGhlIGNlcnRpZmljYXRlIGlzIGlzc3VlZCB0byBieSB0aGUgYXV0aG9yaXR5ICAqLworICBjb25zdCB1bnNpZ25lZCBjaGFyICogc3ViamVjdCA9IGdldF9jbl9uYW1lKHNuYW1lKTsKKyAgaWYoc3ViamVjdCl7CisgICAgICBnX2luZm8oIlN1YmplY3QgKGNuKSAlcyIsIHN1YmplY3QpOworICAgICAgZ2Jvb2xlYW4gdmFsaWQgPSBUUlVFOworCisgICAgICAvKiBTdWJqZWN0IHBpbm5pbmcgKi8KKyAgICAgIGlmKHN0cm5jbXAoU1VCSkVDVF9DTl9QSU5OSU5HLCBzdWJqZWN0LCBzdHJsZW4oU1VCSkVDVF9DTl9QSU5OSU5HKSkpeworCSAgZ193YXJuaW5nKCJUaGUgc3ViamVjdCBvZiB0aGUgY2VydGlmaWNhdGUgaXMgbm90IHZhbGlkIik7CisJICB2YWxpZD1GQUxTRTsKKyAgICAgIH0KKworICAgICAgaWYoIXZhbGlkKQorCXJldHVybiB2YWxpZDsKKworICAgICAgLyogSG9zdCBwaW5uaW5nICAgICAgICovCisgICAgICBpZih2ZXJpZnlfaXAoc3ViamVjdCwgYWRkcikpeworCSAgZ19pbmZvKCJWZXJpZmllZCBzdWJqZWN0Iik7CisgICAgICB9ZWxzZXsKKwkgIGdfaW5mbygiQ2Fubm90IHZlcmlmeSBzdWJqZWN0Iik7CisJICB2YWxpZD1GQUxTRTsKKyAgICAgIH0KKyAgICAgIE9QRU5TU0xfZnJlZShzdWJqZWN0KTsKKworICAgICAgaWYoIXZhbGlkKQorCXJldHVybiB2YWxpZDsKKyAgfQorCisgIGlmKCF2ZXJpZnlfY2VydGlmaWNhdGVfc24oY2VydCwgQ0VSVF9TRVJJQUxfTlVNQkVSKSl7CisgICAgICByZXR1cm4gRkFMU0U7CisgIH1lbHNleworICAgICAgZ19pbmZvKCJWZXJpZmllZCBzZXJpYWwgbnVtYmVyIik7CisgIH0KKworICByZXR1cm4gVFJVRTsKKworfQorCisKKworCisjaWZkZWYgQlVJTERfU0VSVkVSCitzdGF0aWMgdm9pZAordGVzdF9zc2xfYXV0aG9yaXphdGlvbl9tYW5hZ2VyKHZvaWQpCit7CisgIGludCBzdGF0dXM9MDsKKyAgcGlkX3QgcGlkOworICBUaHJpZnRTU0xTb2NrZXQgKnRTU0xzb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIC8qICBpbnQgcG9ydCA9IDUxMTk5OyAqLworICBpbnQgcG9ydCA9IDQ0MzsKKyAgR0Vycm9yICplcnJvcj1OVUxMOworCisgIGd1Y2hhciBidWZbMTddID0gVEVTVF9EQVRBOyAvKiBhIGJ1ZmZlciAqLworCisvKgorICBwaWQgPSBmb3JrICgpOworICAgIGdfYXNzZXJ0ICggcGlkID49IDAgKTsKKworICAgIGlmICggcGlkID09IDAgKQorICAgIHsKKyAgICAgIHRocmlmdF9zc2xfc29ja2V0X3NlcnZlciAocG9ydCk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCSovCisgIC8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisgIHNsZWVwICgxKTsKKworICAvKiBUZXN0IGFnYWluc3QgbGV2ZWwyIG93bmNsb3VkIGNlcnRpZmljYXRlICovCisgIHRTU0xzb2NrZXQgPSB0aHJpZnRfc3NsX3NvY2tldF9uZXdfd2l0aF9ob3N0KFNTTFRMUywgImxvY2FsaG9zdCIsIHBvcnQsICZlcnJvcik7CisgIHRocmlmdF9zc2xfc29ja2V0X3NldF9tYW5hZ2VyKHRTU0xzb2NrZXQsIG15X2FjY2Vzc19tYW5hZ2VyKTsgICAgICAgICAgIC8qIEluc3RhbGwgcGlubmluZyBtYW5hZ2VyICovCisgIC8qIHRocmlmdF9zc2xfbG9hZF9jZXJ0X2Zyb21fZmlsZSh0U1NMc29ja2V0LCAiLi9vd25jbG91ZC5sZXZlbDJjcm0ucGVtIik7ICovCisgIHVuc2lnbmVkIGNoYXIgY2VydF9idWZmZXJbNjU1MzRdOworICByZWFkX2Zyb21fZmlsZShjZXJ0X2J1ZmZlciwgNjU1MzQsICIuLi8uLi9rZXlzL2NsaWVudC5wZW0iKTsKKyAgaWYoIXRocmlmdF9zc2xfbG9hZF9jZXJ0X2Zyb21fYnVmZmVyKHRTU0xzb2NrZXQsIGNlcnRfYnVmZmVyKSl7CisgICAgICBnX3dhcm5pbmcoIkNlcnRpZmljYXRlcyBjYW5ub3QgYmUgbG9hZGVkISIpOworICB9CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodFNTTHNvY2tldCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworICBnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxNywgTlVMTCk7CisKKyAgLyogd3JpdGUgZmFpbCAqLworICBzZW5kX2Vycm9yID0gMTsKKyAgLyoKKyAgICAgIHRocmlmdF9zc2xfc29ja2V0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisgICAgIHNlbmRfZXJyb3IgPSAwOworICAgICAgdGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOworICAgICAgdGhyaWZ0X3NzbF9zb2NrZXRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgICAqLworICB0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRTU0xzb2NrZXQpOworCisgIC8qICAgIGdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7ICovCisgIGdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgLyogIH0gKi8KK30KKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc29ja2V0X3NlcnZlciAoY29uc3QgaW50IHBvcnQpCit7CisgIGludCBieXRlcyA9IDA7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBndWNoYXIgYnVmWzEwXTsgLyogYSBidWZmZXIgKi8KKyAgZ3VjaGFyIG1hdGNoWzEwXSA9IFRFU1RfREFUQTsKKworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJCSAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKworICAvKiByZWFkIDEwIGJ5dGVzICovCisgIGJ5dGVzID0gdGhyaWZ0X3NzbF9zb2NrZXRfcmVhZCAoY2xpZW50LCBidWYsIDEwLCBOVUxMKTsKKyAgZ19hc3NlcnQgKGJ5dGVzID09IDEwKTsgLyogbWFrZSBzdXJlIHdlJ3ZlIHJlYWQgMTAgYnl0ZXMgKi8KKyAgZ19hc3NlcnQgKCBtZW1jbXAoYnVmLCBtYXRjaCwgMTApID09IDAgKTsgLyogbWFrZSBzdXJlIHdoYXQgd2UgZ290IG1hdGNoZXMgKi8KKworICAvKiBmYWlsZWQgcmVhZCAqLworICByZWN2X2Vycm9yID0gMTsKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfcmVhZCAoY2xpZW50LCBidWYsIDEsIE5VTEwpOworICByZWN2X2Vycm9yID0gMDsKKworICB0aHJpZnRfc3NsX3NvY2tldF9yZWFkX2VuZCAoY2xpZW50LCBOVUxMKTsKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKyAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgcmV0dmFsOworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0KCk7CisjZW5kaWYKKworICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICB0aHJpZnRfc3NsX3NvY2tldF9pbml0aWFsaXplX29wZW5zc2woKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRyYW5zcG9ydHNzbHNvY2tldC9DcmVhdGVBbmREZXN0cm95IiwgdGVzdF9zc2xfY3JlYXRlX2FuZF9kZXN0cm95KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXQvQ3JlYXRlQW5kU2V0UHJvcGVydGllcyIsIHRlc3Rfc3NsX2NyZWF0ZV9hbmRfc2V0X3Byb3BlcnRpZXMpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRyYW5zcG9ydHNzbHNvY2tldC9PcGVuQW5kQ2xvc2VOb25TU0xTZXJ2ZXIiLCB0ZXN0X3NzbF9vcGVuX2FuZF9jbG9zZV9ub25fc3NsX3NlcnZlcik7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0L09wZW5BbmRXcml0ZUludmFsaWRTb2NrZXQiLCB0ZXN0X3NzbF93cml0ZV9pbnZhbGlkX3NvY2tldCk7CisKKworCisKKyAgcmV0dmFsID0gZ190ZXN0X3J1biAoKTsKKworICB0aHJpZnRfc3NsX3NvY2tldF9maW5hbGl6ZV9vcGVuc3NsKCk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90aHJpZnRfY19nbGliLnBjLmluIGIvbGliL2NfZ2xpYi90aHJpZnRfY19nbGliLnBjLmluCmluZGV4IDEzNzcyMDMuLjU2OGM3YTIgMTAwNjQ0Ci0tLSBhL2xpYi9jX2dsaWIvdGhyaWZ0X2NfZ2xpYi5wYy5pbgorKysgYi9saWIvY19nbGliL3RocmlmdF9jX2dsaWIucGMuaW4KQEAgLTI3LDQgKzI3LDQgQEAKIFZlcnNpb246IEBWRVJTSU9OQAogUmVxdWlyZXM6IGdsaWItMi4wIGdvYmplY3QtMi4wCiBMaWJzOiAtTCR7bGliZGlyfSAtbHRocmlmdF9jX2dsaWIKLUNmbGFnczogLUkke2luY2x1ZGVkaXJ9L3RocmlmdAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL2xpYi9jbC9NYWtlZmlsZS5hbSBiL2xpYi9jbC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGIzODg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NsL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCithbGwtbG9jYWw6CisJYmFzaCBlbnN1cmUtZXh0ZXJuYWxzLnNoCisKK3J1bi10ZXN0czogdGVzdC9tYWtlLXRlc3QtYmluYXJ5Lmxpc3AKKwkkKFNCQ0wpIC0tc2NyaXB0IHRlc3QvbWFrZS10ZXN0LWJpbmFyeS5saXNwCisKK2NoZWNrLWxvY2FsOiBydW4tdGVzdHMKKwkuL3J1bi10ZXN0cworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSBydW4tdGVzdHMgcXVpY2tsaXNwLmxpc3AgYmFja3BvcnQtdXBkYXRlLnppcAorCSQoUk0pIC1yZiBsaWIgZXh0ZXJuYWxzIHF1aWNrbGlzcAorCitFWFRSQV9ESVNUID0gXAorCVJFQURNRS5tZCBcCisJUkVBRE1FUyBcCisJbG9hZC1sb2NhbGx5Lmxpc3AgXAorCXRlc3QgXAorCWVuc3VyZS1leHRlcm5hbHMuc2gKZGlmZiAtLWdpdCBhL2xpYi9jbC9SRUFETUUubWQgYi9saWIvY2wvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNmVhZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY2wvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjUzIEBACitUaHJpZnQgQ29tbW9uIExpc3AgTGlicmFyeQorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCisKKworVXNpbmcgVGhyaWZ0IHdpdGggQ29tbW9uIExpc3AKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIFRocmlmdCBpcyBhIHByb3RvY29sIGFuZCBsaWJyYXJ5IGZvciBsYW5ndWFnZS1pbmRlcGVuZGVudCBjb21tdW5pY2F0aW9uIGJldHdlZW4gY29vcGVyYXRpbmcKKyBwcm9jZXNzZXMuIFRoZSBjb21tdW5pY2F0aW9uIHRha2VzIHRoZSBmb3JtIG9mIHJlcXVlc3QgYW5kIHJlc3BvbnNlIG1lc3NhZ2VzLCBvZiB3aGljaCB0aGUgZm9ybXMKKyBhcmUgc3BlY2lmaWVkIGluIGFkdmFuY2UgdGhyb3VmaCBhIHNoYXJlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbi4gQSBUaHJpZnQgZGVmaW5pdGlvbiBmaWxlIGlzIHRyYW5zbGF0ZWQKKyBpbnRvIExpc3Agc291cmNlIGZpbGVzLCB3aGljaCBjb21wcmlzZSBzZXZlcmFsIGRlZmluaXRpb25zOgorCisgICogVGhyZWUgcGFja2FnZXMsIG9uZSBmb3IgdGhlIG5hbWVzcGFjZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gb3BlcmF0b3JzLCBhbmQgb25lIGVhY2ggZm9yIHJlcXVlc3QgYW5kCisgIHJlc3BvbnNlIG9wZXJhdG9ycy4KKyAgKiBWYXJpb3VzIHR5cGUgZGVmaW5pdGlvbnMgYXMgaW1wbGVtZW50YXRpb25zIGZvciBUaHJpZnQgdHlwZWRlZiBhbmQgZW51bSBkZWZpbml0aW9ucy4KKyAgKiBERUYtU1RSVUNUIGFuZCBERUYtRVhDRVBUSU9OIGZvcm1zIGZvciBUaHJpZnQgc3RydWN0IGFuZCBleGNlcHRpb24gZGVmaW5pdGlvbnMuCisgICogREVGLVNFUlZJQ0UgZm9ybXMgZm9yIHRocmlmdCBzZXJ2aWNlIGRlZmluaXRpb25zLgorCisgRWFjaCBzZXJ2aWNlIGRlZmluaXRpb24gZXhwYW5kcyBpbiBhIGNvbGxlY3Rpb24gb2YgZ2VuZXJpYyBmdW5jdGlvbiBkZWZpbml0aW9ucy4gRm9yIGVhY2ggYG9wYAorIGluIHRoZSBzZXJ2aWNlIGRlZmluaXRpb24sIHR3byBmdW5jdGlvbnMgYXJlIGRlZmluZWQKKworICAqIGBvcGAtcmVxdWVzdCBpcyBkZWZpbmVkIGZvciB1c2UgYnkgYSBjbGllbnQuIEl0IGFjY2VwdHMgYW4gYWRkaXRpb25hbCBpbml0aWFsIGBwcm90b2NvbGAgYXJndW1lbnQsCisgICAgdG8gYWN0IGFzIHRoZSBjbGllbnQgcHJveHkgZm9yIHRoZSBvcGVyYXRpb24gYW5kIG1lZGlhdGUgdGhlIGludGVyYWN0aW9uIHdpdGggYSByZW1vdGUgcHJvY2VzcworICAgIHRocm91Z2ggYSBUaHJpZnQtZW5jb2RlZCB0cmFuc3BvcnQgc3RyZWFtLgorICAqIGBvcGAtcmVzcG9uc2UgaXMgZGVmaW5lZCBmb3IgdXNlIGJ5IGEgc2VydmVyLiBJdCBhY2NlcHRzIGEgc2luZ2xlIGBwcm90b2NvbGAgYXJndW1lbnQuIEEgc2VydmVyCisgICAgdXNlcyBpdCB0byBkZWNvZGUgdGhlIHJlcXVlc3QgbWVzc2FnZSwgaW52b2tlIHRoZSBiYXNlIGBvcGAgZnVuY3Rpb24gd2l0aCB0aGUgbWVzc2FnZSBhcmd1bWVudHMsCisgICAgZW5jb2RlIGFuZCBzZW5kIHRoZSB0aGUgcmVzdWx0IGFzIGEgcmVzcG9uc2UsIGFuZCBoYW5kbGVzIGV4Y2VwdGlvbnMuCisKKyBUaGUgY2xpZW50IGludGVyZmFjZSBpcyBvbmUgb3BlcmF0b3IKKworICAqIGB3aXRoLWNsaWVudCAodmFyaWFibGUgbG9jYXRpb24pIC4gYm9keWAgOiBjcmVhdGVzIGEgY29ubmVjdGlvbiBpbiBhIGR5bmFtaWMgY29udGV4dCBhbmQgY2xvc2VzIGl0CisgICAgdXBvbiBleGl0LiBUaGUgdmFyaWFibGUgaXMgYm91bmQgdG8gYSBjbGllbnQgcHJveHkgc3RyZWFtL3Byb3RvY29sIGluc3RhbmNlLCB3aGljaCB3cmFwcyB0aGUKKyAgICBiYXNlIGkvbyBzdHJlYW0gLSBzb2NrZXQsIGZpbGUsIGV0Yywgd2l0aCBhbiBvcGVyYXRvcnMgd2hpY2ggaW1wbGVtZW50IHRoZSBUaHJpZnQgcHJvdG9jb2wKKyAgICBhbmQgdHJhbnNwb3J0IG1lY2hhbmlzbXMuCisKKyBUaGUgc2VydmVyIGludGVyZmFjZSBjb21iaW5lcyBzZXJ2ZXIgYW5kIHNlcnZpY2Ugb2JqZWN0cworCisgICogYHNlcnZlIChsb2NhdGlvbiBzZXJ2aWNlKWAgOiBhY2NlcHRzIGNvbm5lY3Rpb25zIG9uIHRoZSBkZXNpZ25hdGVkIHBvcnQgYW5kIHJlc3BvbmRzIHRvCisgICAgcmVxdWVzdHMgb2YgdGhlIHNlcnZpY2UncyBvcGVyYXRpb25zLgorCisKK0J1aWxkaW5nIAorLS0tLS0tLS0KKworVGhlIFRocmlmdCBDb21tb24gTGlzcCBsaWJyYXJ5IGlzIHBhY2thZ2VkIGFzIHRoZSBBU0RGW1sxXV0gc3lzdGVtIGB0aHJpZnRgLgorSXQgZGVwZW5kcyBvbiB0aGUgc3lzdGVtcworCisqIHB1cmlbWzJdXSA6IGZvciB0aGUgdGhyaWZ0IHVyaSBjbGFzcworKiBjbG9zZXItbW9wW1szXV0gOiBmb3IgY2xhc3MgbWV0YWRhdGEKKyogdHJpdmlhbC11dGYtOFtbNF1dIDogZm9yIHN0cmluZyBjb2RlY3MKKyogdXNvY2tldFtbNV1dIDogZm9yIHRoZSBzb2NrZXQgdHJhbnNwb3J0CisqIGllZWUtZmxvYXRzW1s2XV0gOiBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIGludHMgYW5kIGZsb2F0cworKiB0cml2aWFsLWdyYXktc3RyZWFtc1tbN11dIDogYW4gYWJzdHJhY3Rpb24gbGF5ZXIgZm9yIGdyYXkgc3RyZWFtcworKiBhbGV4YW5kcmlhW1s4XV0gOiBoYW5keSB1dGlsaXRpZXMKKworVGhlIGRlcGVuZGVuY2llcyBhcmUgYnVuZGxlZCBmb3IgbG9jYWwgYnVpbGRzIG9mIHRlc3RzIGFuZCB0dXRvcmlhbCBiaW5hcmllcyAtIAoraXQgaXMgcG9zc2libGUgdG8gdXNlIHRob3NlIGJ1bmRsZXMgdG8gbG9hZCB0aGUgbGlicmFyeSwgdG9vLgorCitJbiBvcmRlciB0byBidWlsZCBpdCwgcmVnaXN0ZXIgdGhvc2Ugc3lzdGVtcyB3aXRoIEFTREYgYW5kIGV2YWx1YXRlOgorCisgICAgKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdCkKKworVGhpcyB3aWxsIGNvbXBpbGUgYW5kIGxvYWQgdGhlIExpc3AgY29tcGlsZXIgZm9yIFRocmlmdCBkZWZpbml0aW9uIGZpbGVzLCB0aGUKK3RyYW5zcG9ydCBhbmQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb25zLCBhbmQgdGhlIGNsaWVudCBhbmQgc2VydmVyIGludGVyZmFjZQorZnVuY3Rpb25zLiBJbiBvcmRlciB0byB1c2UgVGhyaWZ0IGluIGFuIGFwcGxpY2F0aW9uLCBvbmUgbXVzdCBhbHNvIGF1dGhvciBhbmQvb3IKK2xvYWQgdGhlIGludGVyZmFjZSBkZWZpbml0aW9ucyBmb3IgdGhlIHJlbW90ZSBzZXJ2aWNlLltbOV1dIElmIG9uZSBpcyBpbXBsZW1lbnRpbmcgYSBzZXJ2aWNlLAorb25lIG11c3QgYWxzbyBkZWZpbmUgdGhlIGFjdHVhbCBmdW5jdGlvbnMgdG8gd2hpY2ggVGhyaWZ0IGlzIHRvIGFjdCBhcyB0aGUgcHJveHkKK2ludGVyZmFjZS4gVGhlIHJlbWFpbmRlciBvZiB0aGlzIGRvY3VtZW50IGZvbGxvd3MgdGhlIFRocmlmdCB0dXRvcmlhbCB0byBpbGx1c3RyYXRlIGhvdwordG8gcGVyZm9ybSB0aGUgc3RlcHMKKworICAqIGltcGxlbWVudCB0aGUgc2VydmljZQorICAqIHRyYW5zbGF0ZSB0aGUgVGhyaWZ0IElETAorICAqIGxvYWQgdGhlIExpc3Agc2VydmljZSBpbnRlcmZhY2VzCisgICogcnVuIGEgc2VydmVyIGZvciB0aGUgc2VydmljZQorICAqIHVzZSBhIGNsaWVudCB0byBhY2Nlc3MgdGhlIHNlcnZpY2UgcmVtb3RlbHkKKworTm90ZSB0aGF0LCBpZiBvbmUgaXMgdG8gaW1wbGVtZW50IGEgbmV3IHNlcnZpY2UsIG9uZSB3aWxsIGFsc28gbmVlZCB0byBhdXRob3IgdGhlCitJREwgZmlsZXMsIGFzIHRoZXJlIGlzIG5vIGZhY2lsaXR5IHRvIGdlbmVyYXRlIHRoZW0gZnJvbSBhIHNlcnZpY2UgaW1wbGVtZW50YXRpb24uCisKKworSW1wbGVtZW50IHRoZSBTZXJ2aWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHR1dG9yaWFsIGNvbXByaXNlcyBzZXJ2ZXJhbCBmdW5jdGlvbnM6IGBhZGRgLCBgcGluZ2AsIGB6aXBgLCBhbmQgYGNhbGN1bGF0ZWAuCitFYWNoIHRyYW5zbGF0ZWQgSURMIGZpbGUgZ2VuZXJhdGVzIHRocmVlIHBhY2thZ2VzIGZvciBldmVyeSBzZXJ2aWNlLiBJbiB0aGUgY2FzZSBvZgordGhlIHR1dG9yaWFsIGZpbGUsIHRoZSByZWxldmFudCBwYWNrYWdlcyBhcmU6CisKKyAgKiB0dXRvcmlhbC5jYWxjdWxhdG9yCisgICogdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbgorICAqIHR1dG9yaWFsLmNhbGN1bGF0b3ItcmVzcG9uc2UKKyAgCitUaGlzIGlzIHRvIHNlcGFyYXRlIHRoZSByZXF1ZXN0IChnZW5lcmF0ZWQpLCByZXNwb25zZSAoZ2VuZXJhdGVkKSBhbmQgaW1wbGVtZW50YXRpb24KKyhtZWFudCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgcHJvZ3JhbW1lcikgZnVuY3Rpb25zIGZvciBkZWZpbmVkIFRocmlmdCBtZXRob2RzLgorCitJdCBpcyBzdWdnZXN0ZWQgdG8gd29yayBpbiB0aGUgYHR1dG9yaWFsLWltcGxlbWVudGF0aW9uYCBwYWNrYWdlIHdoaWxlIGltcGxlbWVudGluZwordGhlIHNlcnZpY2VzIC0gaXQgaW1wb3J0cyB0aGUgYGNvbW1vbi1saXNwYCBwYWNrYWdlLCB3aGlsZSB0aGUgc2VydmljZS1zcGVjaWZpYyBvbmVzCitkb24ndCAodG8gYXZvaWQgY29uZmxpY3RzIGJldHdlZW4gVGhyaWZ0IG1ldGhvZCBuYW1lcyBhbmQgZnVuY3Rpb24gbmFtZXMgaW4gYGNvbW1vbi1saXNwYCkuCisKKyAgICA7OyBkZWZpbmUgdGhlIGJhc2Ugb3BlcmF0aW9ucworICAgIAorICAgIChpbi1wYWNrYWdlIDp0dXRvcmlhbC1pbXBsZW1lbnRhdGlvbikKKyAgICAKKyAgICAoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjphZGQgKG51bTEgbnVtMikKKyAgICAgIChmb3JtYXQgdCAifiZBc2tlZCB0byBhZGQgfkEgYW5kIH5BLiIgbnVtMSBudW0yKQorICAgICAgKCsgbnVtMSBudW0yKSkKKyAgICAKKyAgICAoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjpwaW5nICgpCisgICAgICAocHJpbnQgOnBpbmcpKQorICAgIAorICAgIChkZWZ1biB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uOnppcCAoKQorICAgICAgKHByaW50IDp6aXApKQorICAgIAorICAgIChkZWZ1biB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uOmNhbGN1bGF0ZSAobG9naWQgdGFzaykKKyAgICAgIChjYWxjdWxhdGUtb3AgKHdvcmstb3AgdGFzaykgKHdvcmstbnVtMSB0YXNrKSAod29yay1udW0yIHRhc2spKSkKKyAgICAKKyAgICAoZGVmZ2VuZXJpYyBjYWxjdWxhdGUtb3AgKG9wIGFyZzEgYXJnMikKKyAgICAgICg6bWV0aG9kIDphcm91bmQgKG9wIGFyZzEgYXJnMikKKyAgICAgICAgKGxldCAoKHJlc3VsdCAoY2FsbC1uZXh0LW1ldGhvZCkpKQorICAgICAgICAgIChmb3JtYXQgdCAifiZBc2tlZCB0byBjYWxjdWxhdGU6IH5kIG9uICB+QSBhbmQgfkEgPSB+ZC4iIG9wIGFyZzEgYXJnMiByZXN1bHQpCisgICAgICAgICAgcmVzdWx0KSkKKyAgICAKKyAgICAgICg6bWV0aG9kICgob3AgKGVxbCBvcGVyYXRpb24uYWRkKSkgYXJnMSBhcmcyKQorICAgICAgICAoKyBhcmcxIGFyZzIpKQorICAgICAgKDptZXRob2QgKChvcCAoZXFsIG9wZXJhdGlvbi5zdWJ0cmFjdCkpIGFyZzEgYXJnMikKKyAgICAgICAgKC0gYXJnMSBhcmcyKSkKKyAgICAgICg6bWV0aG9kICgob3AgKGVxbCBvcGVyYXRpb24ubXVsdGlwbHkpKSBhcmcxIGFyZzIpCisgICAgICAgICgqIGFyZzEgYXJnMikpCisgICAgICAoOm1ldGhvZCAoKG9wIChlcWwgb3BlcmF0aW9uLmRpdmlkZSkpIGFyZzEgYXJnMikKKyAgICAgICAgKC8gYXJnMSBhcmcyKSkpCisgICAgCisgICAgKGRlZnVuIHppcCAoKSAocHJpbnQgJ3ppcCkpCisKKworVHJhbnNsYXRlIHRoZSBUaHJpZnQgSURMCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSURMIGZpbGVzIGVtcGxveSB0aGUgZmlsZSBleHRlbnNpb24gYHRocmlmdGAuIEluIHRoaXMgY2FzZSwgdGhlcmUgYXJlIHR3byBmaWxlcyB0byB0cmFuc2xhdGUKKyAgKiBgdHV0b3JpYWwudGhyaWZ0YAorICAqIGBzaGFyZWQudGhyaWZ0YAorQXMgdGhlIGZvcm1lciBpbmNsdWRlcyB0aGUgbGF0dGVyLCBvbmUgdXNlcyBpdCB0byBnZW5lcmF0ZSB0aGUgaW50ZXJmYWNlczoKKworICAgICRUSFJJRlQvYmluL3RocmlmdCAtciAtLWdlbiBjbCAkVEhSSUZUL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorICAgIAorYC1yYCBzdGFuZHMgZm9yIHJlY3Vyc2lvbiwgd2hpbGUgYC0tZ2VuYCBsZXRzIG9uZSBjaG9vc2UgdGhlIGxhbmd1YWdlIHRvIHRyYW5zbGF0ZSB0by4KKworCitMb2FkIHRoZSBMaXNwIHRyYW5zbGF0ZWQgc2VydmljZSBpbnRlcmZhY2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSB0cmFuc2xhdG9yIGdlbmVyYXRlcyB0aHJlZSBmaWxlcyBmb3IgZWFjaCBJREwgZmlsZS4gRm9yIGV4YW1wbGUgYHR1dG9yaWFsLXR5cGVzLmxpc3BgLAorYHR1dG9yaWFsLXZhcnMubGlzcGAgYW5kIGFuIGAuYXNkYCBmaWxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gbG9hZCB0aGVtIGJvdGggYW5kIHB1bGwgaW4KK290aGVyIGluY2x1ZGVzIChsaWtlIGBzaGFyZWRgIHdpdGhpbiB0aGUgdHV0b3JpYWwpIGFzIGRlcGVuZGVuY2llcy4KKworCitSdW4gYSBTZXJ2ZXIgZm9yIHRoZSBTZXJ2aWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBhY3R1YWwgc2VydmljZSBuYW1lLCBhcyBzcGVjaWZpZWQgaW4gdGhlIGBkZWYtc2VydmljZWAgZm9ybSBpbiBgdHV0b3JpYWwubGlzcGAsIGlzIGBjYWxjdWxhdG9yYC4gCitFYWNoIHNlcnZpY2UgZGVmaW5pdGlvbiBkZWZpbmVzIGEgZ2xvYmFsIHZhcmlhYmxlIHdpdGggdGhlIHNlcnZpY2UgbmFtZSBhbmQgYmluZHMgaXQgdG8gYQorc2VydmljZSBpbnN0YW5jZSB3aGNoIGRlc2NyaWJlcyB0aGUgb3BlcmF0aW9ucy4KKworSW4gb3JkZXIgdG8gc3RhcnQgYSBzZXJ2aWNlLCBzcGVjaWZ5IGEgbG9jYXRpb24gYW5kIHRoZSBzZXJ2aWNlIGluc3RhbmNlLiAKKworICAgIChpbi1wYWNrYWdlIDp0dXRvcmlhbCkKKyAgICAoc2VydmUgI3UidGhyaWZ0Oi8vMTI3LjAuMC4xOjkwOTEiIGNhbGN1bGF0b3IpCisKKworVXNlIGEgQ2xpZW50IHRvIEFjY2VzcyB0aGUgU2VydmljZSBSZW1vdGVseQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK1tpbiBzb21lIG90aGVyIHByb2Nlc3NdIHJ1biB0aGUgY2xpZW50CisKKyAgICAoaW4tcGFja2FnZSA6Y2wtdXNlcikKKworICAgIChtYWNyb2xldCAoKHNob3cgKGZvcm0pCisgICAgICAgICAgICAgICAgIGAoZm9ybWF0ICp0cmFjZS1vdXRwdXQqICJ+JX5zID0+fnsgfnN+fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJyxmb3JtCisgICAgICAgICAgICAgICAgICAgICAgICAgIChtdWx0aXBsZS12YWx1ZS1saXN0IChpZ25vcmUtZXJyb3JzICxmb3JtKSkpKSkKKyAgICAgICh3aXRoLWNsaWVudCAocHJvdG9jb2wgI3UidGhyaWZ0Oi8vMTI3LjAuMC4xOjkwOTEiKQorICAgICAgICAoc2hvdyAodHV0b3JpYWwuY2FsY3VsYXRvcjpwaW5nIHByb3RvY29sKSkKKyAgICAgICAgKHNob3cgKHR1dG9yaWFsLmNhbGN1bGF0b3I6YWRkIHByb3RvY29sIDEgMikpCisgICAgICAgIChzaG93ICh0dXRvcmlhbC5jYWxjdWxhdG9yOmFkZCBwcm90b2NvbCAxIDQpKQorICAgIAorICAgICAgICAobGV0ICgodGFzayAobWFrZS1pbnN0YW5jZSAndHV0b3JpYWw6d29yaworICAgICAgICAgICAgICAgICAgICAgIDpvcCBvcGVyYXRpb24uc3VidHJhY3QgOm51bTEgMTUgOm51bTIgMTApKSkKKyAgICAgICAgICAoc2hvdyAodHV0b3JpYWwuY2FsY3VsYXRvcjpjYWxjdWxhdGUgcHJvdG9jb2wgMSB0YXNrKSkKKyAgICAgICAgCisgICAgICAgICAgKHNldGYgKHR1dG9yaWFsOndvcmstb3AgdGFzaykgb3BlcmF0aW9uLmRpdmlkZQorICAgICAgICAgICAgICAgICh0dXRvcmlhbDp3b3JrLW51bTEgdGFzaykgMQorICAgICAgICAgICAgICAgICh0dXRvcmlhbDp3b3JrLW51bTIgdGFzaykgMCkKKyAgICAgICAgICAoc2hvdyAodHV0b3JpYWwuY2FsY3VsYXRvcjpjYWxjdWxhdGUgcHJvdG9jb2wgMSB0YXNrKSkpCisgICAgICAgIAorICAgICAgICAoc2hvdyAoc2hhcmVkLnNoYXJlZC1zZXJ2aWNlOmdldC1zdHJ1Y3QgcHJvdG9jb2wgMSkpCisgICAgCisgICAgICAgIChzaG93ICh6aXAgcHJvdG9jb2wpKSkpCisKK0lzc3VlcworLS0tLS0tCisKKyMjIyBvcHRpb25hbCBmaWVsZHMgCisgV2hlcmUgdGhlIElETCBkZWNsYXJlcyBhIGZpZWxkIG9wdGlvbnMsIHRoZSBkZWYtc3RydWN0IGZvcm0gaW5jbHVkZXMgbm8KKyBpbml0Zm9ybSBmb3IgdGhlIHNsb3QgYW5kIHRoZSBlbmNvZGluZyBvcGVyYXRvciBza2lwcyBhbiB1bmJvdW5kIHNsb3QuIFRoaXMgbGVhdmUgc29tZSBhbWJpZ3VpdHkKKyB3aXRoIGJvb2wgZmllbGRzLgorCisjIyMgaW5zdGFudGlhdGlvbiBwcm90b2NvbCA6Cisgc3RydWN0IGNsYXNzZXMgYXJlIHN0YW5kYXJkIGNsYXNzZXMgYW5kIGV4Y2VwdGlvbiBjbGFzc2VzIGFyZQorIHdoYXRldmVyIHRoZSBpbXBsZW1lbnRhdGlvbiBwcmVzY3JpYmVzLiBkZWNvZGVycyBhcHBseSBtYWtlLXN0cnVjdCB0byBhbiBpbml0YXJncyBsaXN0LgorIHBhcnRpY3VsYXJseSBhdCB0aGUgc2VydmljZSBlbmQsIHRoZXJlIGFyZSBhZHZhbnRhZ2VzIHRvIHJlc291cmNpbmcgc3RydWN0cyBhbmQgZGVjb2RpbmcKKyB3aXRoIGRpcmVjdCBzaWRlLWVmZmVjdHMgb24gc2xvdC12YWx1ZXMKKworIyMjIG1hcHM6CisgTWFwcyBhcmUgbm93IHJlcHJlc2VudGVkIGFzIGhhc2ggdGFibGVzLiBBcyBkYXRhIHRocm91Z2ggdGhlIGNhbGwvcmVwbHkgaW50ZXJmYWNlIGlzIGFsbCBzdGF0aWNhbGx5CisgdHlwZWQsIGl0IGlzIG5vdCBuZWNlc3NhcnkgZm9yIHRoZSBvYmplY3RzIHRvIHRoZW1zZWx2ZXMgaW5kaWNhdGUgdGhlIGNvZGluZyBmb3JtLiBBc3NvY2lhdGlvbiBsaXN0cworIHdvdWxkIGJlIHN1ZmZpY2llbnQuIEFzIHRoZSBrZXkgdHlwZSBpcyBhcmJpdHJhcnksIHByb3BlcnR5IGxpc3RzIG9mZmVyIG5vIGFkZGl0aW9uYWwgY29udmVuaWVuY2U6CisgYXMgYGdldGZgIG9wZXJhdGVzIHdpdGggYGVxYCBhIG5ldyBhY2Nlc3MgaW50ZXJmYWNlIHdvdWxkIGJlIG5lY2Vzc2FyeSBhbmQgdGhleSB3b3VsZCBub3QgYmUKKyBhdmFpbGFibGUgZm9yIGZ1bmN0aW9uIGFwcGxpY2F0aW9uLgorCisKKyBbMV06IHd3dy5jb21tb24tbGlzcC5uZXQvYXNkZgorIFsyXTogaHR0cDovL2dpdGh1Yi5jb20vbGlzcC9jb20uYjkucHVyaS5wcGNyZQorIFszXTogd3d3LmNvbW1vbi1saXNwLm5ldC9jbG9zZXItbW9wCisgWzRdOiB0cml2aWFsLXV0Zi04CisgWzVdOiBodHRwczovL2dpdGh1Yi5jb20vdXNvY2tldC91c29ja2V0CisgWzZdOiBodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9pZWVlLWZsb2F0cworIFs3XTogaHR0cHM6Ly9naXRodWIuY29tL3RyaXZpYWwtZ3JheS1zdHJlYW1zL3RyaXZpYWwtZ3JheS1zdHJlYW1zCisgWzhdOiBodHRwczovL2dpdGxhYi5jb21tb24tbGlzcC5uZXQvYWxleGFuZHJpYS9hbGV4YW5kcmlhCisgWzldOiBodHRwOi8vd2lraS5hcGFjaGUub3JnL3RocmlmdC9UaHJpZnRHZW5lcmF0aW9uCisKKyogdXNvY2tldFtbNV1dIDogZm9yIHRoZSBzb2NrZXQgdHJhbnNwb3J0CisqIGllZWUtZmxvYXRzW1s2XV0gOiBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIGludHMgYW5kIGZsb2F0cworKiB0cml2aWFsLWdyYXktc3RyZWFtc1tbN11dIDogYW4gYWJzdHJhY3Rpb24gbGF5ZXIgZm9yIGdyYXkgc3RyZWFtcworKiBhbGV4YW5kcmlhW1s4XV0gOiBoYW5keSB1dGlsaXRpZXMKZGlmZiAtLWdpdCBhL2xpYi9jbC9SRUFETUVTL3JlYWRtZS1jYXNzYW5kcmEubGlzcCBiL2xpYi9jbC9SRUFETUVTL3JlYWRtZS1jYXNzYW5kcmEubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjc0NGVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NsL1JFQURNRVMvcmVhZG1lLWNhc3NhbmRyYS5saXNwCkBAIC0wLDAgKzEsNjQgQEAKKyhpbi1wYWNrYWdlIDpjbC11c2VyKQorCisjKyhvciBjY2wgc2JjbCkgL2RldmVsb3BtZW50L3NvdXJjZS9saWJyYXJ5LworKGxvYWQgImJ1aWxkLWluaXQubGlzcCIpCisKKzs7OyAhIGZpcnN0LCBzZWxlY3QgdGhlIGFwaSB2ZXJzaW9uIGluIHRoZSBjYXNzYW5kcmEgc3lzdGVtIGRlZmluaXRpb24KKzs7OyBhcyBvbmx5IG9uZSBzaG91bGQgYmUgbG9hZGVkIGF0IGEgdGltZS4KKyhhc2RmOmxvYWQtc3lzdGVtIDpkZS5zZXRmLmNhc3NhbmRyYSkKKworKGluLXBhY2thZ2UgOmRlLnNldGYuY2Fzc2FuZHJhKQorCisoZGVmcGFyYW1ldGVyICpjLWxvY2F0aW9uKgorICA7OyByZW1vdGUKKyAgOzsgI3UidGhyaWZ0Oi8vZWMyLTE3NC0xMjktNjYtMTQ4LmNvbXB1dGUtMS5hbWF6b25hd3MuY29tOjkxNjAiCisgIDs7IGxvY2FsCisgICN1InRocmlmdDovLzEyNy4wLjAuMTo5MTYwIgorICAiQSBjYXNzYW5kcmEgc2VydmljZSBsb2NhdGlvbiAtIGVpdGhlciB0aGUgbG9jYWwgb25lIG9yIGEgcmVtb3RlIHNlcnZpY2UgCisgLSBhbHdheXMgYSAndGhyaWZ0JyB1cmkuIikKKworKGRlZnBhcmFtZXRlciAqYyogKHRocmlmdDpjbGllbnQgKmMtbG9jYXRpb24qKSkKKworCisoY2Fzc2FuZHJhOmRlc2NyaWJlLWtleXNwYWNlcyAqYyopCis7OyA9PiAoIktleXNwYWNlMSIgInN5c3RlbSIpCisKKyhjYXNzYW5kcmE6ZGVzY3JpYmUtY2x1c3Rlci1uYW1lICpjKikKKzs7ID0+IlRlc3QgQ2x1c3RlciIKKworKGNhc3NhbmRyYTpkZXNjcmliZS12ZXJzaW9uICpjKikKKzs7ID0+ICIyLjEuMCIKKworKGxvb3AgZm9yIHNwYWNlIGluIChjYXNzYW5kcmE6ZGVzY3JpYmUta2V5c3BhY2VzICpjKikKKyAgICAgIGNvbGxlY3QgKGxvb3AgZm9yIGtleSBiZWluZyBlYWNoIGhhc2gta2V5IG9mIChjYXNzYW5kcmE6ZGVzY3JpYmUta2V5c3BhY2UgKmMqIHNwYWNlKQorICAgICAgICAgICAgICAgICAgICB1c2luZyAoaGFzaC12YWx1ZSB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgY29sbGVjdCAoY29ucyBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9vcCBmb3Iga2V5IGJlaW5nIGVhY2ggaGFzaC1rZXkgb2YgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoaGFzaC12YWx1ZSB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IChjb25zIGtleSB2YWx1ZSkpKSkpCisKKworKGNsb3NlICpjKikKKworKGRlZnVuIGRlc2NyaWJlLWNhc3NhbmRyYSAobG9jYXRpb24gJm9wdGlvbmFsIChzdHJlYW0gKnN0YW5kYXJkLW91dHB1dCopKQorICAiUHJpbnQgdGhlIGZpcnN0LW9yZGVyIHN0b3JlIG1ldGFkYXRhIGZvciBhIGNhc3NhbmRyYSBMT0NBVElPTi4iCisKKyAgKHRocmlmdDp3aXRoLWNsaWVudCAoY2Fzc2FuZHJhIGxvY2F0aW9uKQorICAgIChsZXQqICgoa2V5c3BhY2UtbmFtZXMgKGNhc3NhbmRyYTpkZXNjcmliZS1rZXlzcGFjZXMgY2Fzc2FuZHJhKSkKKyAgICAgICAgICAgKGNsdXN0ZXIgKGNhc3NhbmRyYTpkZXNjcmliZS1jbHVzdGVyLW5hbWUgY2Fzc2FuZHJhKSkKKyAgICAgICAgICAgKHZlcnNpb24gKGNhc3NhbmRyYTpkZXNjcmliZS12ZXJzaW9uIGNhc3NhbmRyYSkpCisgICAgICAgICAgIChrZXlzcGFjZS1kZXNjcmlwdGlvbnMgKGxvb3AgZm9yIHNwYWNlIGluIGtleXNwYWNlLW5hbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCAoY29ucyBzcGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvb3AgZm9yIGtleSBiZWluZyBlYWNoIGhhc2gta2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiAoY2Fzc2FuZHJhOmRlc2NyaWJlLWtleXNwYWNlIGNhc3NhbmRyYSBzcGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChoYXNoLXZhbHVlIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCAoY29ucyBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvb3AgZm9yIGtleSBiZWluZyBlYWNoIGhhc2gta2V5IG9mIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChoYXNoLXZhbHVlIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IChjb25zIGtleSB2YWx1ZSkpKSkpKSkpCisgICAgICAoZm9ybWF0IHN0cmVhbSAifiZjb25uZWN0aW9uIHRvIDogfmEiIGNhc3NhbmRyYSkKKyAgICAgIChmb3JtYXQgc3RyZWFtICJ+JnZlcnNpb24gOiB+YSIgdmVyc2lvbikKKyAgICAgIChmb3JtYXQgc3RyZWFtICJ+JmNsdXN0ZXIgOiB+YSIgY2x1c3RlcikKKyAgICAgIChmb3JtYXQgc3RyZWFtICJ+JmtleXNwYWNlc357fnt+JX4lc3BhY2U6IH5hfkB7fiUgIH57fmEgOn5Ae34yMHR+Ond+Xn4lfn1+fX59fn1+fSIga2V5c3BhY2UtZGVzY3JpcHRpb25zKSkpKQorCis7OzsgKGRlc2NyaWJlLWNhc3NhbmRyYSAqYy1sb2NhdGlvbiopCmRpZmYgLS1naXQgYS9saWIvY2wvZW5zdXJlLWV4dGVybmFscy5zaCBiL2xpYi9jbC9lbnN1cmUtZXh0ZXJuYWxzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA0OTVmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY2wvZW5zdXJlLWV4dGVybmFscy5zaApAQCAtMCwwICsxLDE2IEBACisjIS9iaW4vYmFzaAorCitzZXQgLWUKKworaWYgW1sgISAtZSBxdWlja2xpc3AubGlzcCBdXTsgdGhlbiBjdXJsIC1PIGh0dHBzOi8vYmV0YS5xdWlja2xpc3Aub3JnL3F1aWNrbGlzcC5saXNwOyBmaQorc2JjbCAtLWxvYWQgcXVpY2tsaXNwLmxpc3AgXAorICAgICAtLWV2YWwgIihpZ25vcmUtZXJyb3JzIChxdWlja2xpc3AtcXVpY2tzdGFydDppbnN0YWxsIDpwYXRoIFwicXVpY2tsaXNwL1wiKSkiIFwKKyAgICAgLS1ldmFsICIobG9hZCBcInF1aWNrbGlzcC9zZXR1cC5saXNwXCIpIiBcCisgICAgIC0tZXZhbCAiKHF1aWNrbGlzcDpidW5kbGUtc3lzdGVtcyAnKCM6cHVyaSAjOnVzb2NrZXQgIzpjbG9zZXItbW9wICM6dHJpdmlhbC11dGYtOCAjOmllZWUtZmxvYXRzICM6dHJpdmlhbC1ncmF5LXN0cmVhbXMgIzphbGV4YW5kcmlhICM6Ym9yZGVhdXgtdGhyZWFkcyAjOmNsLXBwY3JlICM6Zmlhc2NvICM6bmV0LmRpZGllcnZlcm5hLmNsb24pIDp0byBcImV4dGVybmFscy9cIikiIFwKKyAgICAgLS1ldmFsICIocXVpdCkiIFwKKyAgICAgLS1uby11c2VyaW5pdAoraWYgW1sgISAtZSBiYWNrcG9ydC11cGRhdGUuemlwIF1dOyB0aGVuCisgICAgY3VybCAtTyAtTCBodHRwczovL2dpdGh1Yi5jb20vVHVydGxlV2FyZVBML2RlLnNldGYudGhyaWZ0L2FyY2hpdmUvYmFja3BvcnQtdXBkYXRlLnppcDsKK2ZpCitta2RpciAtcCBsaWIKK3VuemlwIC11IGJhY2twb3J0LXVwZGF0ZS56aXAgLWQgbGliCmRpZmYgLS1naXQgYS9saWIvY2wvbG9hZC1sb2NhbGx5Lmxpc3AgYi9saWIvY2wvbG9hZC1sb2NhbGx5Lmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyYzcwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jbC9sb2FkLWxvY2FsbHkubGlzcApAQCAtMCwwICsxLDIzIEBACisoaW4tcGFja2FnZSAjOmNsLXVzZXIpCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOzs7OyBKdXN0IGEgc2NyaXB0IGZvciBsb2FkaW5nIHRoZSBsaWJyYXJ5IGl0c2VsZiwgdXNpbmcgYnVuZGxlZCBkZXBlbmRlbmNpZXMuCis7Ozs7IFRoaXMgaXMgaGVyZSBmb3Igd2hlbiB3ZSB3YW50IHRvIGJ1aWxkIHRoZSBzZWxmLXRlc3QgYW5kIGNyb3NzLXRlc3QKKzs7OzsgYmluYXJpZXMuCisKKyhyZXF1aXJlICJhc2RmIikKKworKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAiZXh0ZXJuYWxzL2J1bmRsZS5saXNwIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAibGliL2RlLnNldGYudGhyaWZ0LWJhY2twb3J0LXVwZGF0ZS90aHJpZnQuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdCkKZGlmZiAtLWdpdCBhL2xpYi9jbC90ZXN0L21ha2UtdGVzdC1iaW5hcnkubGlzcCBiL2xpYi9jbC90ZXN0L21ha2UtdGVzdC1iaW5hcnkubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTdhNThjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NsL3Rlc3QvbWFrZS10ZXN0LWJpbmFyeS5saXNwCkBAIC0wLDAgKzEsMzEgQEAKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOzs7OyBUaGlzIGZpbGUgaXMgdXNlZCB0byBidWlsZCB0aGUgYmluYXJ5IHRoYXQgcnVucyBhbGwgc2VsZi10ZXN0cy4gVGhlCis7Ozs7IGJpbmFyeSBpcyB0aGVuIG1lYW50IHRvIGJlIGhvb2tlZCB1cCB0byBUaHJpZnQncyBgbWFrZSBjaGVja2AgZmFjaWxpdHksCis7Ozs7IGJ1dCBjYW4gZWFzaWx5IGJlIHJ1biBvbiBpdHMgb3duIGFzIHdlbGwuCisKKyhpbi1wYWNrYWdlICM6Y2wtdXNlcikKKworKHJlcXVpcmUgImFzZGYiKQorKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAiLi4vbG9hZC1sb2NhbGx5Lmxpc3AiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICIuLi9saWIvZGUuc2V0Zi50aHJpZnQtYmFja3BvcnQtdXBkYXRlL3Rlc3QvdGhyaWZ0LXRlc3QuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdC10ZXN0KQorKGFzZGY6bG9hZC1zeXN0ZW0gOm5ldC5kaWRpZXJ2ZXJuYS5jbG9uKQorCisobmV0LmRpZGllcnZlcm5hLmNsb246bmlja25hbWUtcGFja2FnZSkKKworKGRlZnVuIG1haW4gKCkKKyAgKGxldCAoKHJlc3VsdCAoaWYgKGZpYXNjbzpydW4tdGVzdHMgJ3RocmlmdC10ZXN0KSAwIC0xKSkpCisgICAgKGNsb246ZXhpdCByZXN1bHQpKSkKKworKGNsb246ZHVtcCAicnVuLXRlc3RzIiBtYWluKQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL1JFQURNRSBiL2xpYi9jb2NvYS9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9jb2NvYS9SRUFETUUKcmVuYW1lIHRvIGxpYi9jb2NvYS9SRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2NvY29hL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FcnJvci5oIGIvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OTg4MWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkVycm9yLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUUHJvdG9jb2wuaCIKKworZXh0ZXJuIE5TU3RyaW5nICpUQXBwbGljYXRpb25FcnJvckRvbWFpbjsKKwordHlwZWRlZiBOU19FTlVNIChpbnQsIFRBcHBsaWNhdGlvbkVycm9yKSB7CisgIFRBcHBsaWNhdGlvbkVycm9yVW5rbm93biAgICAgICAgICAgICAgICA9IDAsCisgIFRBcHBsaWNhdGlvbkVycm9yVW5rbm93bk1ldGhvZCAgICAgICAgICA9IDEsCisgIFRBcHBsaWNhdGlvbkVycm9ySW52YWxpZE1lc3NhZ2VUeXBlICAgICA9IDIsCisgIFRBcHBsaWNhdGlvbkVycm9yV3JvbmdNZXRob2ROYW1lICAgICAgICA9IDMsCisgIFRBcHBsaWNhdGlvbkVycm9yQmFkU2VxdWVuY2VJZCAgICAgICAgICA9IDQsCisgIFRBcHBsaWNhdGlvbkVycm9yTWlzc2luZ1Jlc3VsdCAgICAgICAgICA9IDUsCisgIFRBcHBsaWNhdGlvbkVycm9ySW50ZXJuYWxFcnJvciAgICAgICAgICA9IDYsCisgIFRBcHBsaWNhdGlvbkVycm9yUHJvdG9jb2xFcnJvciAgICAgICAgICA9IDcsCisgIFRBcHBsaWNhdGlvbkVycm9ySW52YWxpZFRyYW5zZm9ybSAgICAgICA9IDgsCisgIFRBcHBsaWNhdGlvbkVycm9ySW52YWxpZFByb3RvY29sICAgICAgICA9IDksCisgIFRBcHBsaWNhdGlvbkVycm9yVW5zdXBwb3J0ZWRDbGllbnRUeXBlICA9IDEwLAorfTsKKworCitleHRlcm4gTlNTdHJpbmcgKlRBcHBsaWNhdGlvbkVycm9yTmFtZUtleTsKK2V4dGVybiBOU1N0cmluZyAqVEFwcGxpY2F0aW9uRXJyb3JSZWFzb25LZXk7CitleHRlcm4gTlNTdHJpbmcgKlRBcHBsaWNhdGlvbkVycm9yTWV0aG9kS2V5OworCisKK0BpbnRlcmZhY2UgTlNFcnJvciAoVEFwcGxpY2F0aW9uRXJyb3IpCisKK0Bwcm9wZXJ0eSAocmVhZG9ubHksIGNvcHkpIE5TU3RyaW5nICpuYW1lOworQHByb3BlcnR5IChyZWFkb25seSwgY29weSkgTlNTdHJpbmcgKnJlYXNvbjsKKworKyhpbnN0YW5jZXR5cGUpIGVycm9yV2l0aFR5cGU6KFRBcHBsaWNhdGlvbkVycm9yKXR5cGUgcmVhc29uOihOU1N0cmluZyAqKXJlYXNvbjsKKworKyhpbnN0YW5jZXR5cGUpIHJlYWQ6KGlkPFRQcm90b2NvbD4pcHJvdG9jb2w7CisKKy0oQk9PTCkgd3JpdGU6KGlkPFRQcm90b2NvbD4pb3V0UHJvdG9jb2wgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkVycm9yLm0gYi9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkVycm9yLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwYmMwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXJyb3IubQpAQCAtMCwwICsxLDIzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUQXBwbGljYXRpb25FcnJvci5oIgorI2ltcG9ydCAiVFByb3RvY29sVXRpbC5oIgorCisKK05TU3RyaW5nICpUQXBwbGljYXRpb25FcnJvckRvbWFpbiA9IEAiVEFwcGxpY2F0aW9uRXJyb3JEb21haW4iOworCisKK05TU3RyaW5nICpUQXBwbGljYXRpb25FcnJvck5hbWVLZXkgPSBAIm5hbWUiOworTlNTdHJpbmcgKlRBcHBsaWNhdGlvbkVycm9yUmVhc29uS2V5ID0gQCJyZWFzb24iOworTlNTdHJpbmcgKlRBcHBsaWNhdGlvbkVycm9yTWV0aG9kS2V5ID0gQCJtZXRob2QiOworCisKK0BpbXBsZW1lbnRhdGlvbiBOU0Vycm9yIChUQXBwbGljYXRpb25FcnJvcikKKworLShOU1N0cmluZyAqKSByZWFzb24KK3sKKyAgcmV0dXJuIHNlbGYudXNlckluZm9bVEFwcGxpY2F0aW9uRXJyb3JSZWFzb25LZXldOworfQorCistKE5TU3RyaW5nICopIG5hbWUKK3sKKyAgcmV0dXJuIHNlbGYudXNlckluZm9bVEFwcGxpY2F0aW9uRXJyb3JOYW1lS2V5XTsKK30KKworKyhpbnN0YW5jZXR5cGUpIGVycm9yV2l0aFR5cGU6KFRBcHBsaWNhdGlvbkVycm9yKXR5cGUgcmVhc29uOihOU1N0cmluZyAqKXJlYXNvbgoreworICBOU1N0cmluZyAqbmFtZTsKKyAgc3dpdGNoICh0eXBlKSB7CisgIGNhc2UgVEFwcGxpY2F0aW9uRXJyb3JVbmtub3duTWV0aG9kOgorICAgIG5hbWUgPSBAIlVua25vd24gTWV0aG9kIjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9ySW52YWxpZE1lc3NhZ2VUeXBlOgorICAgIG5hbWUgPSBAIkludmFsaWQgTWVzc2FnZSBUeXBlIjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9yV3JvbmdNZXRob2ROYW1lOgorICAgIG5hbWUgPSBAIldyb25nIE1ldGhvZCBOYW1lIjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9yQmFkU2VxdWVuY2VJZDoKKyAgICBuYW1lID0gQCJCYWQgU2VxdWVuY2UgSUQiOworICAgIGJyZWFrOworCisgIGNhc2UgVEFwcGxpY2F0aW9uRXJyb3JNaXNzaW5nUmVzdWx0OgorICAgIG5hbWUgPSBAIk1pc3NpbmcgUmVzdWx0IjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9ySW50ZXJuYWxFcnJvcjoKKyAgICBuYW1lID0gQCJJbnRlcm5hbCBFcnJvciI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUQXBwbGljYXRpb25FcnJvclByb3RvY29sRXJyb3I6CisgICAgbmFtZSA9IEAiUHJvdG9jb2wgRXJyb3IiOworICAgIGJyZWFrOworCisgIGNhc2UgVEFwcGxpY2F0aW9uRXJyb3JJbnZhbGlkVHJhbnNmb3JtOgorICAgIG5hbWUgPSBAIkludmFsaWQgVHJhbnNmb3JtIjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9ySW52YWxpZFByb3RvY29sOgorICAgIG5hbWUgPSBAIkludmFsaWQgUHJvdG9jb2wiOworICAgIGJyZWFrOworCisgIGNhc2UgVEFwcGxpY2F0aW9uRXJyb3JVbnN1cHBvcnRlZENsaWVudFR5cGU6CisgICAgbmFtZSA9IEAiVW5zdXBwb3J0ZWQgQ2xpZW50IFR5cGUiOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgbmFtZSA9IEAiVW5rbm93biI7CisgICAgYnJlYWs7CisgIH0KKworICBOU0RpY3Rpb25hcnkgKnVzZXJJbmZvOworICBpZiAocmVhc29uKSB7CisgICAgdXNlckluZm8gPSBAe1RBcHBsaWNhdGlvbkVycm9yTmFtZUtleTpuYW1lLAorICAgICAgICAgICAgICAgICBUQXBwbGljYXRpb25FcnJvclJlYXNvbktleTpyZWFzb259OworICB9CisgIGVsc2UgeworICAgIHVzZXJJbmZvID0gQHtUQXBwbGljYXRpb25FcnJvck5hbWVLZXk6bmFtZX07CisgIH0KKworICByZXR1cm4gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRBcHBsaWNhdGlvbkVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6dHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOnVzZXJJbmZvXTsKK30KKworCisrKGluc3RhbmNldHlwZSkgcmVhZDooaWQ8VFByb3RvY29sPilwcm90b2NvbAoreworICBOU1N0cmluZyAqcmVhc29uID0gbmlsOworICBTSW50MzIgdHlwZSA9IFRBcHBsaWNhdGlvbkVycm9yVW5rbm93bjsKKyAgU0ludDMyIGZpZWxkVHlwZTsKKyAgU0ludDMyIGZpZWxkSUQ7CisKKyAgTlNFcnJvciAqZXJyb3I7CisgIGlmICghW3Byb3RvY29sIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6TlVMTCBlcnJvcjomZXJyb3JdKSB7CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKyAgd2hpbGUgKHRydWUpIHsKKworICAgIGlmICghW3Byb3RvY29sIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTpOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiZmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6JmZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6JmVycm9yXSkKKyAgICB7CisgICAgICByZXR1cm4gZXJyb3I7CisgICAgfQorCisgICAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZVNUT1ApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAoZmllbGRJRCkgeworICAgIGNhc2UgMToKKyAgICAgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVTVFJJTkcpIHsKKyAgICAgICAgaWYgKCFbcHJvdG9jb2wgcmVhZFN0cmluZzomcmVhc29uIGVycm9yOiZlcnJvcl0pIHsKKyAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOmZpZWxkVHlwZSBvblByb3RvY29sOnByb3RvY29sIGVycm9yOiZlcnJvcl0pIHsKKyAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAyOgorICAgICAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZUkzMikgeworICAgICAgICBpZiAoIVtwcm90b2NvbCByZWFkSTMyOiZ0eXBlIGVycm9yOiZlcnJvcl0pIHsKKyAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOmZpZWxkVHlwZSBvblByb3RvY29sOnByb3RvY29sIGVycm9yOiZlcnJvcl0pIHsKKyAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGlmICghW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6ZmllbGRUeXBlIG9uUHJvdG9jb2w6cHJvdG9jb2wgZXJyb3I6JmVycm9yXSkgeworICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZEZpZWxkRW5kOiZlcnJvcl0pIHsKKyAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9CisKKyAgfQorCisgIGlmICghW3Byb3RvY29sIHJlYWRTdHJ1Y3RFbmQ6JmVycm9yXSkgeworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisgIHJldHVybiBbTlNFcnJvciBlcnJvcldpdGhUeXBlOnR5cGUgcmVhc29uOnJlYXNvbl07Cit9CisKKworLShCT09MKSB3cml0ZTooaWQ8VFByb3RvY29sPilwcm90b2NvbCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKCFbcHJvdG9jb2wgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOkAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAoc2VsZi5sb2NhbGl6ZWREZXNjcmlwdGlvbiAhPSBuaWwpIHsKKyAgICBpZiAoIVtwcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTpAIm1lc3NhZ2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6VFR5cGVTVFJJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDoxIGVycm9yOmVycm9yXSkKKyAgICB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgaWYgKCFbcHJvdG9jb2wgd3JpdGVTdHJpbmc6c2VsZi5sb2NhbGl6ZWREZXNjcmlwdGlvbiBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICBpZiAoIVtwcm90b2NvbCB3cml0ZUZpZWxkRW5kOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorCisgIGlmICghW3Byb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOkAidHlwZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6VFR5cGVJMzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcl0pCisgIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAoIVtwcm90b2NvbCB3cml0ZUkzMjooU0ludDMyKXNlbGYuY29kZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAoIVtwcm90b2NvbCB3cml0ZUZpZWxkRW5kOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmICghW3Byb3RvY29sIHdyaXRlRmllbGRTdG9wOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmICghW3Byb3RvY29sIHdyaXRlU3RydWN0RW5kOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmggYi9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWQwYjlhLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRFeGNlcHRpb24uaCIKLSNpbXBvcnQgIlRQcm90b2NvbC5oIgotCi1lbnVtIHsKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1VOS05PV04gPSAwLAotICBUQXBwbGljYXRpb25FeGNlcHRpb25fVU5LTk9XTl9NRVRIT0QgPSAxLAotICBUQXBwbGljYXRpb25FeGNlcHRpb25fSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyLAotICBUQXBwbGljYXRpb25FeGNlcHRpb25fV1JPTkdfTUVUSE9EX05BTUUgPSAzLAotICBUQXBwbGljYXRpb25FeGNlcHRpb25fQkFEX1NFUVVFTkNFX0lEID0gNCwKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX01JU1NJTkdfUkVTVUxUID0gNSwKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lOVEVSTkFMX0VSUk9SID0gNiwKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1BST1RPQ09MX0VSUk9SID0gNwotfTsKLQotLy8gRklYTUUKLUBpbnRlcmZhY2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIDogVEV4Y2VwdGlvbiB7Ci0gIGludCBtVHlwZTsKLX0KLQotKyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uICopIHJlYWQ6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2w7Ci0KLS0gKHZvaWQpIHdyaXRlOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sOwotCi0rIChUQXBwbGljYXRpb25FeGNlcHRpb24gKikgZXhjZXB0aW9uV2l0aFR5cGU6IChpbnQpIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogKE5TU3RyaW5nICopIG1lc3NhZ2U7Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLm0gYi9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDY4NzUzLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLm0KKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJUQXBwbGljYXRpb25FeGNlcHRpb24uaCIKLSNpbXBvcnQgIlRQcm90b2NvbFV0aWwuaCIKLQotQGltcGxlbWVudGF0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgotCi0tIChpZCkgaW5pdFdpdGhUeXBlOiAoaW50KSB0eXBlCi0gICAgICAgICAgICAgcmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uCi17Ci0gIG1UeXBlID0gdHlwZTsKLQotICBOU1N0cmluZyAqIG5hbWU7Ci0gIHN3aXRjaCAodHlwZSkgewotICBjYXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9VTktOT1dOX01FVEhPRDoKLSAgICBuYW1lID0gQCJVbmtub3duIG1ldGhvZCI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lOVkFMSURfTUVTU0FHRV9UWVBFOgotICAgIG5hbWUgPSBAIkludmFsaWQgbWVzc2FnZSB0eXBlIjsKLSAgICBicmVhazsKLSAgY2FzZSBUQXBwbGljYXRpb25FeGNlcHRpb25fV1JPTkdfTUVUSE9EX05BTUU6Ci0gICAgbmFtZSA9IEAiV3JvbmcgbWV0aG9kIG5hbWUiOwotICAgIGJyZWFrOwotICBjYXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9CQURfU0VRVUVOQ0VfSUQ6Ci0gICAgbmFtZSA9IEAiQmFkIHNlcXVlbmNlIElEIjsKLSAgICBicmVhazsKLSAgY2FzZSBUQXBwbGljYXRpb25FeGNlcHRpb25fTUlTU0lOR19SRVNVTFQ6Ci0gICAgbmFtZSA9IEAiTWlzc2luZyByZXN1bHQiOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIG5hbWUgPSBAIlVua25vd24iOwotICAgIGJyZWFrOwotICB9Ci0KLSAgc2VsZiA9IFtzdXBlciBpbml0V2l0aE5hbWU6IG5hbWUgcmVhc29uOiByZWFzb24gdXNlckluZm86IG5pbF07Ci0gIHJldHVybiBzZWxmOwotfQotCi0KLSsgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqKSByZWFkOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sCi17Ci0gIE5TU3RyaW5nICogcmVhc29uID0gbmlsOwotICBpbnQgdHlwZSA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9VTktOT1dOOwotICBpbnQgZmllbGRUeXBlOwotICBpbnQgZmllbGRJRDsKLQotICBbcHJvdG9jb2wgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTogTlVMTF07Ci0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICBbcHJvdG9jb2wgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOiBOVUxMCi0gICAgICAgICAgICAgIHR5cGU6ICZmaWVsZFR5cGUKLSAgICAgICAgICAgICAgZmllbGRJRDogJmZpZWxkSURdOwotICAgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVfU1RPUCkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHN3aXRjaCAoZmllbGRJRCkgewotICAgIGNhc2UgMToKLSAgICAgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVfU1RSSU5HKSB7Ci0gICAgICAgIHJlYXNvbiA9IFtwcm90b2NvbCByZWFkU3RyaW5nXTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBmaWVsZFR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZV9JMzIpIHsKLSAgICAgICAgdHlwZSA9IFtwcm90b2NvbCByZWFkSTMyXTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBmaWVsZFR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBmaWVsZFR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIFtwcm90b2NvbCByZWFkRmllbGRFbmRdOwotICB9Ci0gIFtwcm90b2NvbCByZWFkU3RydWN0RW5kXTsKLQotICByZXR1cm4gW1RBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb25XaXRoVHlwZTogdHlwZSByZWFzb246IHJlYXNvbl07Ci19Ci0KLQotLSAodm9pZCkgd3JpdGU6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2wKLXsKLSAgW3Byb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogQCJUQXBwbGljYXRpb25FeGNlcHRpb24iXTsKLQotICBpZiAoW3NlbGYgcmVhc29uXSAhPSBuaWwpIHsKLSAgICBbcHJvdG9jb2wgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6IEAibWVzc2FnZSIKLSAgICAgICAgICAgICAgICAgdHlwZTogVFR5cGVfU1RSSU5HCi0gICAgICAgICAgICAgICAgIGZpZWxkSUQ6IDFdOwotICAgIFtwcm90b2NvbCB3cml0ZVN0cmluZzogW3NlbGYgcmVhc29uXV07Ci0gICAgW3Byb3RvY29sIHdyaXRlRmllbGRFbmRdOwotICB9Ci0KLSAgW3Byb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAInR5cGUiCi0gICAgICAgICAgICAgICB0eXBlOiBUVHlwZV9JMzIKLSAgICAgICAgICAgICAgIGZpZWxkSUQ6IDJdOwotICBbcHJvdG9jb2wgd3JpdGVJMzI6IG1UeXBlXTsKLSAgW3Byb3RvY29sIHdyaXRlRmllbGRFbmRdOwotCi0gIFtwcm90b2NvbCB3cml0ZUZpZWxkU3RvcF07Ci0gIFtwcm90b2NvbCB3cml0ZVN0cnVjdEVuZF07Ci19Ci0KLQotKyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uICopIGV4Y2VwdGlvbldpdGhUeXBlOiAoaW50KSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotewotICByZXR1cm4gW1tbVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFsbG9jXSBpbml0V2l0aFR5cGU6IHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiByZWFzb25dIGF1dG9yZWxlYXNlXTsKLX0KLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UQmFzZUNsaWVudC5oIGIvbGliL2NvY29hL3NyYy9UQmFzZUNsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNzNhYTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RCYXNlQ2xpZW50LmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUUHJvdG9jb2wuaCIKKyNpbXBvcnQgIlRBcHBsaWNhdGlvbkVycm9yLmgiCisKK0BpbnRlcmZhY2UgVEJhc2VDbGllbnQgOiBOU09iamVjdAorCistKE5TRXJyb3IgKikgY2hlY2tJbmNvbWluZ01lc3NhZ2VFeGNlcHRpb246KGlkPFRQcm90b2NvbD4pcHJvdG9jb2w7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEJhc2VDbGllbnQubSBiL2xpYi9jb2NvYS9zcmMvVEJhc2VDbGllbnQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDljYWUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UQmFzZUNsaWVudC5tCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVEJhc2VDbGllbnQuaCIKKyNpbXBvcnQgIlRBcHBsaWNhdGlvbkVycm9yLmgiCisKKworQGludGVyZmFjZSBUQmFzZUNsaWVudCAoKQorQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBUQmFzZUNsaWVudAorCistKE5TRXJyb3IgKikgY2hlY2tJbmNvbWluZ01lc3NhZ2VFeGNlcHRpb246KGlkPFRQcm90b2NvbD4paW5Qcm90b2NvbAoreworICBOU0Vycm9yICp0aHJpZnRFcnJvcjsKKworICBTSW50MzIgbXNnVHlwZSA9IDA7CisgIGlmICghW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6bmlsIHR5cGU6Jm1zZ1R5cGUgc2VxdWVuY2VJRDpOVUxMIGVycm9yOiZ0aHJpZnRFcnJvcl0pIHsKKyAgICByZXR1cm4gdGhyaWZ0RXJyb3I7CisgIH0KKworICBpZiAobXNnVHlwZSA9PSBUTWVzc2FnZVR5cGVFWENFUFRJT04pIHsKKworICAgIHRocmlmdEVycm9yID0gW05TRXJyb3IgcmVhZDppblByb3RvY29sXTsKKworICAgIFtpblByb3RvY29sIHJlYWRNZXNzYWdlRW5kOk5VTExdOworCisgICAgcmV0dXJuIHRocmlmdEVycm9yOworICB9CisKKyAgcmV0dXJuIG5pbDsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UQmluYXJ5LnN3aWZ0IGIvbGliL2NvY29hL3NyYy9UQmluYXJ5LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YTM2NjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RCaW5hcnkuc3dpZnQKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworCitwdWJsaWMgc3RydWN0IFRCaW5hcnkgOiBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGUgOiBUVHlwZSB7IHJldHVybiAuU1RSSU5HIH0KKyAgCisgIHByaXZhdGUgdmFyIHN0b3JhZ2UgOiBOU0RhdGEKKyAgCisgIHB1YmxpYyBpbml0KCkgeworICAgIHNlbGYuc3RvcmFnZSA9IE5TRGF0YSgpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KGNvbnRlbnRzT2ZGaWxlIGZpbGU6IFN0cmluZywgb3B0aW9uczogTlNEYXRhUmVhZGluZ09wdGlvbnMgPSBbXSkgdGhyb3dzIHsKKyAgICBzZWxmLnN0b3JhZ2UgPSB0cnkgTlNEYXRhKGNvbnRlbnRzT2ZGaWxlOiBmaWxlLCBvcHRpb25zOiBvcHRpb25zKQorICB9CisgIAorICBwdWJsaWMgaW5pdChjb250ZW50c09mVVJMIFVSTDogTlNVUkwsIG9wdGlvbnM6IE5TRGF0YVJlYWRpbmdPcHRpb25zID0gW10pIHRocm93cyB7CisgICAgc2VsZi5zdG9yYWdlID0gdHJ5IE5TRGF0YShjb250ZW50c09mVVJMOiBVUkwsIG9wdGlvbnM6IG9wdGlvbnMpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0PyhiYXNlNjRFbmNvZGVkRGF0YSBiYXNlNjREYXRhOiBOU0RhdGEsIG9wdGlvbnM6IE5TRGF0YUJhc2U2NERlY29kaW5nT3B0aW9ucyA9IFtdKSB7CisgICAgZ3VhcmQgbGV0IHN0b3JhZ2UgPSBOU0RhdGEoYmFzZTY0RW5jb2RlZERhdGE6IGJhc2U2NERhdGEsIG9wdGlvbnM6IG9wdGlvbnMpIGVsc2UgeworICAgICAgcmV0dXJuIG5pbAorICAgIH0KKyAgICBzZWxmLnN0b3JhZ2UgPSBzdG9yYWdlCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KGRhdGE6IE5TRGF0YSkgeworICAgIHNlbGYuc3RvcmFnZSA9IGRhdGEKKyAgfQorICAKKyAgcHVibGljIHZhciBsZW5ndGggOiBJbnQgeworICAgIHJldHVybiBzdG9yYWdlLmxlbmd0aAorICB9CisgIAorICBwdWJsaWMgdmFyIGhhc2hWYWx1ZSA6IEludCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaGFzaFZhbHVlCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgYnl0ZXMgOiBVbnNhZmVQb2ludGVyPFZvaWQ+IHsKKyAgICByZXR1cm4gc3RvcmFnZS5ieXRlcworICB9CisgIAorICBwdWJsaWMgZnVuYyBnZXRCeXRlcyhidWZmZXI6IFVuc2FmZU11dGFibGVQb2ludGVyPFZvaWQ+LCBsZW5ndGg6IEludCkgeworICAgIHN0b3JhZ2UuZ2V0Qnl0ZXMoYnVmZmVyLCBsZW5ndGg6IGxlbmd0aCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZ2V0Qnl0ZXMoYnVmZmVyOiBVbnNhZmVNdXRhYmxlUG9pbnRlcjxWb2lkPiwgcmFuZ2U6IFJhbmdlPEludD4pIHsKKyAgICBzdG9yYWdlLmdldEJ5dGVzKGJ1ZmZlciwgcmFuZ2U6IE5TUmFuZ2UocmFuZ2UpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBzdWJCaW5hcnlXaXRoUmFuZ2UocmFuZ2U6IFJhbmdlPEludD4pIC0+IFRCaW5hcnkgeworICAgIHJldHVybiBUQmluYXJ5KGRhdGE6IHN0b3JhZ2Uuc3ViZGF0YVdpdGhSYW5nZShOU1JhbmdlKHJhbmdlKSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlVG9GaWxlKHBhdGg6IFN0cmluZywgb3B0aW9uczogTlNEYXRhV3JpdGluZ09wdGlvbnMgPSBbXSkgdGhyb3dzIHsKKyAgICB0cnkgc3RvcmFnZS53cml0ZVRvRmlsZShwYXRoLCBvcHRpb25zOiBvcHRpb25zKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVRvVVJMKHVybDogTlNVUkwsIG9wdGlvbnM6IE5TRGF0YVdyaXRpbmdPcHRpb25zID0gW10pIHRocm93cyB7CisgICAgdHJ5IHN0b3JhZ2Uud3JpdGVUb1VSTCh1cmwsIG9wdGlvbnM6IG9wdGlvbnMpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJhbmdlT2ZEYXRhKGRhdGFUb0ZpbmQgZGF0YTogTlNEYXRhLCBvcHRpb25zOiBOU0RhdGFTZWFyY2hPcHRpb25zLCByYW5nZTogUmFuZ2U8SW50PikgLT4gUmFuZ2U8SW50Pj8geworICAgIHJldHVybiBzdG9yYWdlLnJhbmdlT2ZEYXRhKGRhdGEsIG9wdGlvbnM6IG9wdGlvbnMsIHJhbmdlOiBOU1JhbmdlKHJhbmdlKSkudG9SYW5nZSgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGVudW1lcmF0ZUJ5dGVSYW5nZXNVc2luZ0Jsb2NrKGJsb2NrOiAoVW5zYWZlUG9pbnRlcjxWb2lkPiwgUmFuZ2U8SW50PiwgaW5vdXQgQm9vbCkgLT4gVm9pZCkgeworICAgIHN0b3JhZ2UuZW51bWVyYXRlQnl0ZVJhbmdlc1VzaW5nQmxvY2sgeyBieXRlcywgcmFuZ2UsIHN0b3AgaW4KKyAgICAgIHZhciBzdG9wVG1wID0gQm9vbChzdG9wLm1lbW9yeSkKKyAgICAgIGJsb2NrKGJ5dGVzLCByYW5nZS50b1JhbmdlKCkhLCAmc3RvcFRtcCkKKyAgICAgIHN0b3AubWVtb3J5ID0gT2JqQ0Jvb2woc3RvcFRtcCkKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFRCaW5hcnkgeworICAgIHZhciBkYXRhIDogTlNEYXRhPworICAgIHRyeSBwcm90by5yZWFkQmluYXJ5KCZkYXRhKQorICAgIHJldHVybiBUQmluYXJ5KGRhdGE6IGRhdGEhKQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogVEJpbmFyeSwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUJpbmFyeSh2YWx1ZS5zdG9yYWdlKQorICB9CisgIAorfQorCitleHRlbnNpb24gVEJpbmFyeSA6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIHsKKyAgCisgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlc2NyaXB0aW9uCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZGVidWdEZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVidWdEZXNjcmlwdGlvbgorICB9CisgIAorfQorCitwdWJsaWMgZnVuYyA9PShsaHM6IFRCaW5hcnksIHJoczogVEJpbmFyeSkgLT4gQm9vbCB7CisgIHJldHVybiBsaHMuc3RvcmFnZSA9PSByaHMuc3RvcmFnZQorfQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9URW51bS5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVEVudW0uc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyYTUzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVEVudW0uc3dpZnQKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCisKK3B1YmxpYyBwcm90b2NvbCBURW51bSA6IFRTZXJpYWxpemFibGUgeworICAKK30KKworcHVibGljIGV4dGVuc2lvbiBURW51bSB7CisgIAorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gVFR5cGUuSTMyIH0KKyAgCit9CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RFcnJvci5oIGIvbGliL2NvY29hL3NyYy9URXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmI3MmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9URXJyb3IuaApAQCAtMCwwICsxLDIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorCisKK2V4dGVybiBOU1N0cmluZyAqVEVycm9yRG9tYWluOwpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9URXJyb3IubSBiL2xpYi9jb2NvYS9zcmMvVEVycm9yLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY3ZjkyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVEVycm9yLm0KQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJURXJyb3IuaCIKKworCitOU1N0cmluZyAqVEVycm9yRG9tYWluID0gQCJURXJyb3JEb21haW4iOwpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9URXhjZXB0aW9uLmggYi9saWIvY29jb2Evc3JjL1RFeGNlcHRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU2ZjRmYS4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL1RFeGNlcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+Ci0KLUBpbnRlcmZhY2UgVEV4Y2VwdGlvbiA6IE5TRXhjZXB0aW9uIHsKLX0KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZTsKLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgcmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uOwotCi0rIChpZCkgZXhjZXB0aW9uV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi0gICAgICAgICAgICAgICAgICByZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLSAgICAgICAgICAgICAgICAgICBlcnJvcjogKE5TRXJyb3IgKikgZXJyb3I7Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEV4Y2VwdGlvbi5tIGIvbGliL2NvY29hL3NyYy9URXhjZXB0aW9uLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjODQxOTkuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9URXhjZXB0aW9uLm0KKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRFeGNlcHRpb24uaCIKLQotQGltcGxlbWVudGF0aW9uIFRFeGNlcHRpb24KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotewotICByZXR1cm4gW3NlbGYgZXhjZXB0aW9uV2l0aE5hbWU6IG5hbWUgcmVhc29uOiBAInVua25vd24iIGVycm9yOiBuaWxdOwotfQotCi0KLSsgKGlkKSBleGNlcHRpb25XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgIHJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotewotICByZXR1cm4gW3NlbGYgZXhjZXB0aW9uV2l0aE5hbWU6IG5hbWUgcmVhc29uOiByZWFzb24gZXJyb3I6IG5pbF07Ci19Ci0KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgcmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uCi0gICAgICAgICAgICAgICAgICAgZXJyb3I6IChOU0Vycm9yICopIGVycm9yCi17Ci0gIE5TRGljdGlvbmFyeSAqIHVzZXJJbmZvID0gbmlsOwotICBpZiAoZXJyb3IgIT0gbmlsKSB7Ci0gICAgdXNlckluZm8gPSBbTlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0OiBlcnJvciBmb3JLZXk6IEAiZXJyb3IiXTsKLSAgfQotCi0gIHJldHVybiBbc3VwZXIgZXhjZXB0aW9uV2l0aE5hbWU6IG5hbWUKLSAgICAgICAgICAgICAgICByZWFzb246IHJlYXNvbgotICAgICAgICAgICAgICAgIHVzZXJJbmZvOiB1c2VySW5mb107Ci19Ci0KLQotLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb24KLXsKLSAgTlNNdXRhYmxlU3RyaW5nICogcmVzdWx0ID0gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoU3RyaW5nOiBbc2VsZiBuYW1lXV07Ci0gIFtyZXN1bHQgYXBwZW5kRm9ybWF0OiBAIjogJUAiLCBbc2VsZiByZWFzb25dXTsKLSAgaWYgKFtzZWxmIHVzZXJJbmZvXSAhPSBuaWwpIHsKLSAgICBbcmVzdWx0IGFwcGVuZEZvcm1hdDogQCJcbiAgdXNlckluZm8gPSAlQCIsIFtzZWxmIHVzZXJJbmZvXV07Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVExpc3Quc3dpZnQgYi9saWIvY29jb2Evc3JjL1RMaXN0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNWJkODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RMaXN0LnN3aWZ0CkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworCitwdWJsaWMgc3RydWN0IFRMaXN0PEVsZW1lbnQgOiBUU2VyaWFsaXphYmxlPiA6IE11dGFibGVDb2xsZWN0aW9uVHlwZSwgSGFzaGFibGUsIEFycmF5TGl0ZXJhbENvbnZlcnRpYmxlLCBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGUgOiBUVHlwZSB7IHJldHVybiAuTElTVCB9CisgIAorICB0eXBlYWxpYXMgU3RvcmFnZSA9IEFycmF5PEVsZW1lbnQ+CisKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRleCA9IFN0b3JhZ2UuSW5kZXgKKyAgCisgIHByaXZhdGUgdmFyIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgCisgIHB1YmxpYyB2YXIgc3RhcnRJbmRleCA6IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5zdGFydEluZGV4CisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZW5kSW5kZXggOiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZW5kSW5kZXgKKyAgfQorCisgIHB1YmxpYyBzdWJzY3JpcHQgKHBvc2l0aW9uOiBJbmRleCkgLT4gRWxlbWVudCB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBzdG9yYWdlW3Bvc2l0aW9uXQorICAgIH0KKyAgICBzZXQgeworICAgICAgc3RvcmFnZVtwb3NpdGlvbl0gPSBuZXdWYWx1ZQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIHZhciBoYXNoVmFsdWUgOiBJbnQgeworICAgIGxldCBwcmltZSA9IDMxCisgICAgdmFyIHJlc3VsdCA9IDEKKyAgICBmb3IgZWxlbWVudCBpbiBzdG9yYWdlIHsKKyAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgZWxlbWVudC5oYXNoVmFsdWUKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICBwdWJsaWMgaW5pdChhcnJheUxpdGVyYWwgZWxlbWVudHM6IEVsZW1lbnQuLi4pIHsKKyAgICBzZWxmLnN0b3JhZ2UgPSBTdG9yYWdlKHN0b3JhZ2UpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KCkgeworICAgIHNlbGYuc3RvcmFnZSA9IFN0b3JhZ2UoKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBhcHBlbmQobmV3RWxlbWVudDogRWxlbWVudCkgeworICAgIHNlbGYuc3RvcmFnZS5hcHBlbmQobmV3RWxlbWVudCkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgYXBwZW5kQ29udGVudHNPZjxDIDogQ29sbGVjdGlvblR5cGUgd2hlcmUgQy5HZW5lcmF0b3IuRWxlbWVudCA9PSBFbGVtZW50PihuZXdzdG9yYWdlOiBDKSB7CisgICAgc2VsZi5zdG9yYWdlLmFwcGVuZENvbnRlbnRzT2YobmV3c3RvcmFnZSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgaW5zZXJ0KG5ld0VsZW1lbnQ6IEVsZW1lbnQsIGF0SW5kZXggaW5kZXg6IEludCkgeworICAgIHNlbGYuc3RvcmFnZS5pbnNlcnQobmV3RWxlbWVudCwgYXRJbmRleDogaW5kZXgpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGluc2VydENvbnRlbnRzT2Y8QyA6IENvbGxlY3Rpb25UeXBlIHdoZXJlIEMuR2VuZXJhdG9yLkVsZW1lbnQgPT0gRWxlbWVudD4obmV3RWxlbWVudHM6IEMsIGF0IGluZGV4OiBJbnQpIHsKKyAgICBzZWxmLnN0b3JhZ2UuaW5zZXJ0Q29udGVudHNPZihuZXdFbGVtZW50cywgYXQ6IGluZGV4KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVBbGwoa2VlcENhcGFjaXR5IGtlZXBDYXBhY2l0eTogQm9vbCA9IHRydWUpIHsKKyAgICBzZWxmLnN0b3JhZ2UucmVtb3ZlQWxsKGtlZXBDYXBhY2l0eToga2VlcENhcGFjaXR5KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVBdEluZGV4KGluZGV4OiBJbmRleCkgeworICAgIHNlbGYuc3RvcmFnZS5yZW1vdmVBdEluZGV4KGluZGV4KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVGaXJzdChuOiBJbnQgPSAwKSB7CisgICAgc2VsZi5zdG9yYWdlLnJlbW92ZUZpcnN0KG4pCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZUxhc3QoKSAtPiBFbGVtZW50IHsKKyAgICByZXR1cm4gc2VsZi5zdG9yYWdlLnJlbW92ZUxhc3QoKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVSYW5nZShzdWJSYW5nZTogUmFuZ2U8SW5kZXg+KSB7CisgICAgc2VsZi5zdG9yYWdlLnJlbW92ZVJhbmdlKHN1YlJhbmdlKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZXNlcnZlQ2FwYWNpdHkobWluaW11bUNhcGFjaXR5OiBJbnQpIHsKKyAgICBzZWxmLnN0b3JhZ2UucmVzZXJ2ZUNhcGFjaXR5KG1pbmltdW1DYXBhY2l0eSkKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gVExpc3QgeworICAgIGxldCAoZWxlbWVudFR5cGUsIHNpemUpID0gdHJ5IHByb3RvLnJlYWRMaXN0QmVnaW4oKQorICAgIGlmIGVsZW1lbnRUeXBlICE9IEVsZW1lbnQudGhyaWZ0VHlwZSB7CisgICAgICB0aHJvdyBOU0Vycm9yKAorICAgICAgICBkb21haW46IFRQcm90b2NvbEVycm9yRG9tYWluLAorICAgICAgICBjb2RlOiBJbnQoVFByb3RvY29sRXJyb3IuSW52YWxpZERhdGEucmF3VmFsdWUpLAorICAgICAgICB1c2VySW5mbzogW1RQcm90b2NvbEVycm9yRXh0ZW5kZWRFcnJvcktleTogTlNOdW1iZXIoaW50OiBUUHJvdG9jb2xFeHRlbmRlZEVycm9yLlVuZXhwZWN0ZWRUeXBlLnJhd1ZhbHVlKV0pCisgICAgfQorICAgIHZhciBsaXN0ID0gVExpc3QoKQorICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgIGxldCBlbGVtZW50ID0gdHJ5IEVsZW1lbnQucmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvKQorICAgICAgbGlzdC5zdG9yYWdlLmFwcGVuZChlbGVtZW50KQorICAgIH0KKyAgICB0cnkgcHJvdG8ucmVhZExpc3RFbmQoKQorICAgIHJldHVybiBsaXN0CisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBUTGlzdCwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZShFbGVtZW50LnRocmlmdFR5cGUsIHNpemU6IHZhbHVlLmNvdW50KQorICAgIGZvciBlbGVtZW50IGluIHZhbHVlLnN0b3JhZ2UgeworICAgICAgdHJ5IEVsZW1lbnQud3JpdGVWYWx1ZShlbGVtZW50LCB0b1Byb3RvY29sOiBwcm90bykKKyAgICB9CisgICAgdHJ5IHByb3RvLndyaXRlTGlzdEVuZCgpCisgIH0KK30KKworZXh0ZW5zaW9uIFRMaXN0IDogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUsIEN1c3RvbURlYnVnU3RyaW5nQ29udmVydGlibGUgeworICAKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVzY3JpcHRpb24KKyAgfQorICAKKyAgcHVibGljIHZhciBkZWJ1Z0Rlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZWJ1Z0Rlc2NyaXB0aW9uCisgIH0KKyAgCit9CisKK3B1YmxpYyBmdW5jID09PEVsZW1lbnQ+KGxoczogVExpc3Q8RWxlbWVudD4sIHJoczogVExpc3Q8RWxlbWVudD4pIC0+IEJvb2wgeworICByZXR1cm4gbGhzLnN0b3JhZ2UgPT0gcmhzLnN0b3JhZ2UKK30KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVE1hcC5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVE1hcC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTZlNzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UTWFwLnN3aWZ0CkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworcHVibGljIHN0cnVjdCBUTWFwPEtleSA6IFRTZXJpYWxpemFibGUsIFZhbHVlIDogVFNlcmlhbGl6YWJsZT4gOiBDb2xsZWN0aW9uVHlwZSwgRGljdGlvbmFyeUxpdGVyYWxDb252ZXJ0aWJsZSwgVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gLk1BUCB9CisKKyAgdHlwZWFsaWFzIFN0b3JhZ2UgPSBEaWN0aW9uYXJ5PEtleSwgVmFsdWU+CisKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRleCA9IFN0b3JhZ2UuSW5kZXgKKworICBwdWJsaWMgdHlwZWFsaWFzIEVsZW1lbnQgPSBTdG9yYWdlLkVsZW1lbnQKKyAgCisgIHByaXZhdGUgdmFyIHN0b3JhZ2UgOiBTdG9yYWdlCisKKyAgcHVibGljIHZhciBzdGFydEluZGV4IDogSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLnN0YXJ0SW5kZXgKKyAgfQorICAKKyAgcHVibGljIHZhciBlbmRJbmRleDogSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLmVuZEluZGV4CisgIH0KKworICBwdWJsaWMgdmFyIGtleXM6IExhenlNYXBDb2xsZWN0aW9uPFtLZXkgOiBWYWx1ZV0sIEtleT4geworICAgIHJldHVybiBzdG9yYWdlLmtleXMKKyAgfQorICAKKyAgcHVibGljIHZhciB2YWx1ZXM6IExhenlNYXBDb2xsZWN0aW9uPFtLZXkgOiBWYWx1ZV0sIFZhbHVlPiB7CisgICAgcmV0dXJuIHN0b3JhZ2UudmFsdWVzCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KCkgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgfQorICAKKyAgcHVibGljIGluaXQoZGljdGlvbmFyeUxpdGVyYWwgZWxlbWVudHM6IChLZXksIFZhbHVlKS4uLikgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgICBmb3IgKGtleSwgdmFsdWUpIGluIGVsZW1lbnRzIHsKKyAgICAgIHN0b3JhZ2Vba2V5XSA9IHZhbHVlCisgICAgfQorICB9CisgIAorICBwdWJsaWMgaW5pdChtaW5pbXVtQ2FwYWNpdHk6IEludCkgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKG1pbmltdW1DYXBhY2l0eTogbWluaW11bUNhcGFjaXR5KQorICB9CisgIAorICBwdWJsaWMgc3Vic2NyaXB0IChwb3NpdGlvbjogSW5kZXgpIC0+IEVsZW1lbnQgeworICAgIGdldCB7CisgICAgICByZXR1cm4gc3RvcmFnZVtwb3NpdGlvbl0KKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGluZGV4Rm9yS2V5KGtleTogS2V5KSAtPiBJbmRleD8geworICAgIHJldHVybiBzdG9yYWdlLmluZGV4Rm9yS2V5KGtleSkKKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdCAoa2V5OiBLZXkpIC0+IFZhbHVlPyB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBzdG9yYWdlW2tleV0KKyAgICB9CisgICAgc2V0IHsKKyAgICAgIHN0b3JhZ2Vba2V5XSA9IG5ld1ZhbHVlCisgICAgfQorICB9CisKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgdXBkYXRlVmFsdWUodmFsdWU6IFZhbHVlLCBmb3JLZXkga2V5OiBLZXkpIC0+IFZhbHVlPyB7CisgICAgcmV0dXJuIHVwZGF0ZVZhbHVlKHZhbHVlLCBmb3JLZXk6IGtleSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlQXRJbmRleChpbmRleDogRGljdGlvbmFyeUluZGV4PEtleSwgVmFsdWU+KSAtPiAoS2V5LCBWYWx1ZSkgeworICAgIHJldHVybiByZW1vdmVBdEluZGV4KGluZGV4KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVWYWx1ZUZvcktleShrZXk6IEtleSkgLT4gVmFsdWU/IHsKKyAgICByZXR1cm4gc3RvcmFnZS5yZW1vdmVWYWx1ZUZvcktleShrZXkpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZUFsbChrZWVwQ2FwYWNpdHkga2VlcENhcGFjaXR5OiBCb29sID0gZmFsc2UpIHsKKyAgICBzdG9yYWdlLnJlbW92ZUFsbChrZWVwQ2FwYWNpdHk6IGtlZXBDYXBhY2l0eSkKKyAgfQorCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlIDogSW50IHsKKyAgICBsZXQgcHJpbWUgPSAzMQorICAgIHZhciByZXN1bHQgPSAxCisgICAgZm9yIChrZXksIHZhbHVlKSBpbiBzdG9yYWdlIHsKKyAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsga2V5Lmhhc2hWYWx1ZQorICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyB2YWx1ZS5oYXNoVmFsdWUKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBUTWFwIHsKKyAgICBsZXQgKGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSkgPSB0cnkgcHJvdG8ucmVhZE1hcEJlZ2luKCkKKyAgICBpZiBrZXlUeXBlICE9IEtleS50aHJpZnRUeXBlIHx8IHZhbHVlVHlwZSAhPSBWYWx1ZS50aHJpZnRUeXBlIHsKKyAgICAgIHRocm93IE5TRXJyb3IoCisgICAgICAgIGRvbWFpbjogVFByb3RvY29sRXJyb3JEb21haW4sCisgICAgICAgIGNvZGU6IEludChUUHJvdG9jb2xFcnJvci5JbnZhbGlkRGF0YS5yYXdWYWx1ZSksCisgICAgICAgIHVzZXJJbmZvOiBbVFByb3RvY29sRXJyb3JFeHRlbmRlZEVycm9yS2V5OiBOU051bWJlcihpbnQ6IFRQcm90b2NvbEV4dGVuZGVkRXJyb3IuVW5leHBlY3RlZFR5cGUucmF3VmFsdWUpXSkKKyAgICB9CisgICAgdmFyIG1hcCA9IFRNYXAoKQorICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgIGxldCBrZXkgPSB0cnkgS2V5LnJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bykKKyAgICAgIGxldCB2YWx1ZSA9IHRyeSBWYWx1ZS5yZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG8pCisgICAgICBtYXAuc3RvcmFnZVtrZXldID0gdmFsdWUKKyAgICB9CisgICAgdHJ5IHByb3RvLnJlYWRNYXBFbmQoKQorICAgIHJldHVybiBtYXAKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IFRNYXAsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlKEtleS50aHJpZnRUeXBlLCB2YWx1ZVR5cGU6IFZhbHVlLnRocmlmdFR5cGUsIHNpemU6IHZhbHVlLmNvdW50KQorICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4gdmFsdWUuc3RvcmFnZSB7CisgICAgICB0cnkgS2V5LndyaXRlVmFsdWUoa2V5LCB0b1Byb3RvY29sOiBwcm90bykKKyAgICAgIHRyeSBWYWx1ZS53cml0ZVZhbHVlKHZhbHVlLCB0b1Byb3RvY29sOiBwcm90bykKKyAgICB9CisgICAgdHJ5IHByb3RvLndyaXRlTWFwRW5kKCkKKyAgfQorICAKK30KKworCitleHRlbnNpb24gVE1hcCA6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIHsKKyAgCisgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlc2NyaXB0aW9uCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZGVidWdEZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVidWdEZXNjcmlwdGlvbgorICB9CisgIAorfQorCitwdWJsaWMgZnVuYyA9PTxLZXksIFZhbHVlPihsaHM6IFRNYXA8S2V5LFZhbHVlPiwgcmhzOiBUTWFwPEtleSwgVmFsdWU+KSAtPiBCb29sIHsKKyAgaWYgbGhzLmNvdW50ICE9IHJocy5jb3VudCB7CisgICAgcmV0dXJuIGZhbHNlCisgIH0KKyAgcmV0dXJuIGxocy5zdG9yYWdlID09IHJocy5zdG9yYWdlCit9CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RQcm9jZXNzb3IuaCBiL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3Nvci5oCmluZGV4IDk4MGJlOTQuLjIwYzcyZTIgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3Nvci5oCisrKyBiL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3Nvci5oCkBAIC0yMCwxMCArMjAsMTYgQEAKICNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgogI2ltcG9ydCAiVFByb3RvY29sLmgiCiAKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKIAogQHByb3RvY29sIFRQcm9jZXNzb3IgPE5TT2JqZWN0PgogCi0tIChCT09MKSBwcm9jZXNzT25JbnB1dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIGluUHJvdG9jb2wKLSAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgb3V0UHJvdG9jb2w7CistKEJPT0wpIHByb2Nlc3NPbklucHV0UHJvdG9jb2w6KGlkIDxUUHJvdG9jb2w+KWluUHJvdG9jb2wKKyAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbDooaWQgPFRQcm90b2NvbD4pb3V0UHJvdG9jb2wKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqKillcnJvcjsKIAogQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UUHJvY2Vzc29yRmFjdG9yeS5oIGIvbGliL2NvY29hL3NyYy9UUHJvY2Vzc29yRmFjdG9yeS5oCmluZGV4IDI5ZDEyYjMuLjg1MDIwYTUgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3NvckZhY3RvcnkuaAorKysgYi9saWIvY29jb2Evc3JjL1RQcm9jZXNzb3JGYWN0b3J5LmgKQEAgLTIwLDggKzIwLDE0IEBACiAjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KICNpbXBvcnQgIlRQcm9jZXNzb3IuaCIKIAorTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCiBAcHJvdG9jb2wgVFByb2Nlc3NvckZhY3RvcnkgPE5TT2JqZWN0PgogCi0tIChpZDxUUHJvY2Vzc29yPikgcHJvY2Vzc29yRm9yVHJhbnNwb3J0OiAoaWQ8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydDsKKy0oaWQ8VFByb2Nlc3Nvcj4pIHByb2Nlc3NvckZvclRyYW5zcG9ydDooaWQ8VFRyYW5zcG9ydD4pdHJhbnNwb3J0OwogCiBAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RQcm90b2NvbC5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVFByb3RvY29sLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NzU4NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RQcm90b2NvbC5zd2lmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCisKK3B1YmxpYyBleHRlbnNpb24gVFByb3RvY29sIHsKKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZywgVE1lc3NhZ2VUeXBlLCBJbnQpIHsKKyAgICAKKyAgICB2YXIgbmFtZSA6IE5TU3RyaW5nPworICAgIHZhciB0eXBlIDogSW50MzIgPSAtMQorICAgIHZhciBzZXF1ZW5jZUlEIDogSW50MzIgPSAtMQorICAgIAorICAgIHRyeSByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZSgmbmFtZSwgdHlwZTogJnR5cGUsIHNlcXVlbmNlSUQ6ICZzZXF1ZW5jZUlEKQorICAgIAorICAgIHJldHVybiAobmFtZSBhcyBTdHJpbmchLCBUTWVzc2FnZVR5cGUocmF3VmFsdWU6IHR5cGUpISwgSW50KHNlcXVlbmNlSUQpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lKG5hbWU6IFN0cmluZywgdHlwZTogVE1lc3NhZ2VUeXBlLCBzZXF1ZW5jZUlEOiBJbnQpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWUobmFtZSwgdHlwZTogdHlwZS5yYXdWYWx1ZSwgc2VxdWVuY2VJRDogSW50MzIoc2VxdWVuY2VJRCkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTdHJ1Y3RCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nPykgeworICAgIAorICAgIHZhciBuYW1lIDogTlNTdHJpbmc/ID0gbmlsCisgICAgCisgICAgdHJ5IHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWUoJm5hbWUpCisgICAgCisgICAgcmV0dXJuIChuYW1lIGFzIFN0cmluZz8pCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmc/LCBUVHlwZSwgSW50KSB7CisgICAgCisgICAgdmFyIG5hbWUgOiBOU1N0cmluZz8gPSBuaWwKKyAgICB2YXIgdHlwZSA6IEludDMyID0gLTEKKyAgICB2YXIgZmllbGRJRCA6IEludDMyID0gLTEKKyAgICAKKyAgICB0cnkgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lKCZuYW1lLCB0eXBlOiAmdHlwZSwgZmllbGRJRDogJmZpZWxkSUQpCisgICAgCisgICAgcmV0dXJuIChuYW1lIGFzIFN0cmluZz8sIFRUeXBlKHJhd1ZhbHVlOiB0eXBlKSEsIEludChmaWVsZElEKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWUobmFtZTogU3RyaW5nLCB0eXBlOiBUVHlwZSwgZmllbGRJRDogSW50KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZShuYW1lLCB0eXBlOiB0eXBlLnJhd1ZhbHVlLCBmaWVsZElEOiBJbnQzMihmaWVsZElEKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgVFR5cGUsIEludDMyKSB7CisgICAgCisgICAgdmFyIGtleVR5cGUgOiBJbnQzMiA9IC0xCisgICAgdmFyIHZhbHVlVHlwZSA6IEludDMyID0gLTEKKyAgICB2YXIgc2l6ZSA6IEludDMyID0gMAorICAgIAorICAgIHRyeSByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlKCZrZXlUeXBlLCB2YWx1ZVR5cGU6ICZ2YWx1ZVR5cGUsIHNpemU6ICZzaXplKQorICAgIAorICAgIHJldHVybiAoVFR5cGUocmF3VmFsdWU6IGtleVR5cGUpISwgVFR5cGUocmF3VmFsdWU6IHZhbHVlVHlwZSkhLCBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGUoa2V5VHlwZTogVFR5cGUsIHZhbHVlVHlwZTogVFR5cGUsIHNpemU6IEludCkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlKGtleVR5cGUucmF3VmFsdWUsIHZhbHVlVHlwZTogdmFsdWVUeXBlLnJhd1ZhbHVlLCBzaXplOiBJbnQzMihzaXplKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFNldEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpIHsKKyAgICAKKyAgICB2YXIgZWxlbWVudFR5cGUgOiBJbnQzMiA9IC0xCisgICAgdmFyIHNpemUgOiBJbnQzMiA9IDAKKyAgICAKKyAgICB0cnkgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGUoJmVsZW1lbnRUeXBlLCBzaXplOiAmc2l6ZSkKKyAgICAKKyAgICByZXR1cm4gKFRUeXBlKHJhd1ZhbHVlOiBlbGVtZW50VHlwZSkhLCBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlLnJhd1ZhbHVlLCBzaXplOiBJbnQzMihzaXplKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZExpc3RCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgCisgICAgdmFyIGVsZW1lbnRUeXBlIDogSW50MzIgPSAtMQorICAgIHZhciBzaXplIDogSW50MzIgPSAwCisgICAgCisgICAgdHJ5IHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZSgmZWxlbWVudFR5cGUsIHNpemU6ICZzaXplKQorICAgIAorICAgIHJldHVybiAoVFR5cGUocmF3VmFsdWU6IGVsZW1lbnRUeXBlKSEsIHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZShlbGVtZW50VHlwZS5yYXdWYWx1ZSwgc2l6ZTogSW50MzIoc2l6ZSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRWYWx1ZTxUOiBUU2VyaWFsaXphYmxlPih2YWx1ZTogVCwgbmFtZTogU3RyaW5nLCB0eXBlOiBUVHlwZSwgaWQ6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZShuYW1lLCB0eXBlOiB0eXBlLnJhd1ZhbHVlLCBmaWVsZElEOiBpZCkKKyAgICB0cnkgd3JpdGVWYWx1ZSh2YWx1ZSkKKyAgICB0cnkgd3JpdGVGaWVsZEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRWYWx1ZTxUOiBUU2VyaWFsaXphYmxlPigpIHRocm93cyAtPiBUIHsKKyAgICByZXR1cm4gdHJ5IFQucmVhZFZhbHVlRnJvbVByb3RvY29sKHNlbGYpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlVmFsdWU8VDogVFNlcmlhbGl6YWJsZT4odmFsdWU6IFQpIHRocm93cyB7CisgICAgdHJ5IFQud3JpdGVWYWx1ZSh2YWx1ZSwgdG9Qcm90b2NvbDogc2VsZikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFJlc3VsdE1lc3NhZ2VCZWdpbigpIHRocm93cyB7CisgICAgCisgICAgbGV0IChfLCB0eXBlLCBfKSA9IHRyeSByZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgCisgICAgaWYgdHlwZSA9PSAuRVhDRVBUSU9OIHsKKyAgICAgIGxldCB4ID0gdHJ5IHJlYWRFeGNlcHRpb24oKQorICAgICAgdGhyb3cgeAorICAgIH0KKyAgICAKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgdmFsaWRhdGVWYWx1ZSh2YWx1ZTogQW55PywgbmFtZWQgbmFtZTogU3RyaW5nKSB0aHJvd3MgeworICAgIAorICAgIGlmIHZhbHVlID09IG5pbCB7CisgICAgICB0aHJvdyBOU0Vycm9yKAorICAgICAgICBkb21haW46IFRQcm90b2NvbEVycm9yRG9tYWluLAorICAgICAgICBjb2RlOiBJbnQoVFByb3RvY29sRXJyb3IuVW5rbm93bi5yYXdWYWx1ZSksCisgICAgICAgIHVzZXJJbmZvOiBbVFByb3RvY29sRXJyb3JGaWVsZE5hbWVLZXk6IG5hbWVdKQorICAgIH0KKyAgICAKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEV4Y2VwdGlvbigpIHRocm93cyAtPiBFcnJvclR5cGUgeworICAgIAorICAgIHZhciByZWFzb24gOiBTdHJpbmc/CisgICAgdmFyIHR5cGUgPSBUQXBwbGljYXRpb25FcnJvci5Vbmtub3duCisgICAgCisgICAgdHJ5IHJlYWRTdHJ1Y3RCZWdpbigpCisgICAgCisgICAgZmllbGRzOiB3aGlsZSAodHJ1ZSkgeworICAgICAgCisgICAgICBsZXQgKF8sIGZpZWxkVHlwZSwgZmllbGRJRCkgPSB0cnkgcmVhZEZpZWxkQmVnaW4oKQorICAgICAgCisgICAgICBzd2l0Y2ggKGZpZWxkSUQsIGZpZWxkVHlwZSkgeworICAgICAgY2FzZSAoXywgLlNUT1ApOgorICAgICAgICBicmVhayBmaWVsZHMKKyAgICAgICAgCisgICAgICBjYXNlICgxLCAuU1RSSU5HKToKKyAgICAgICAgcmVhc29uID0gdHJ5IHJlYWRWYWx1ZSgpIGFzIFN0cmluZworICAgICAgICAKKyAgICAgIGNhc2UgKDIsIC5JMzIpOgorICAgICAgICBsZXQgdHlwZVZhbCA9IHRyeSByZWFkVmFsdWUoKSBhcyBJbnQzMgorICAgICAgICBpZiBsZXQgdG1wID0gVEFwcGxpY2F0aW9uRXJyb3IocmF3VmFsdWU6IHR5cGVWYWwpIHsKKyAgICAgICAgICB0eXBlID0gdG1wCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICBjYXNlIGxldCAoXywgdW5rbm93blR5cGUpOgorICAgICAgICB0cnkgc2tpcFR5cGUodW5rbm93blR5cGUpCisgICAgICB9CisgICAgICAKKyAgICAgIHRyeSByZWFkRmllbGRFbmQoKQorICAgIH0KKyAgICAKKyAgICB0cnkgcmVhZFN0cnVjdEVuZCgpCisgICAgCisgICAgcmV0dXJuIE5TRXJyb3IodHlwZTp0eXBlLCByZWFzb246cmVhc29uID8/ICIiKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUV4Y2VwdGlvbkZvck1lc3NhZ2VOYW1lKG5hbWU6IFN0cmluZywgc2VxdWVuY2VJRDogSW50LCBleDogTlNFcnJvcikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZShuYW1lLCB0eXBlOiAuRVhDRVBUSU9OLCBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlEKQorICAgIHRyeSBleC53cml0ZShzZWxmKQorICAgIHRyeSB3cml0ZU1lc3NhZ2VFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBza2lwVHlwZSh0eXBlOiBUVHlwZSkgdGhyb3dzIHsKKyAgICB0cnkgVFByb3RvY29sVXRpbC5za2lwVHlwZSh0eXBlLnJhd1ZhbHVlLCBvblByb3RvY29sOiBzZWxmKQorICB9CisgIAorfQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UU2VyaWFsaXphYmxlLnN3aWZ0IGIvbGliL2NvY29hL3NyYy9UU2VyaWFsaXphYmxlLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZGZkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RTZXJpYWxpemFibGUuc3dpZnQKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworCitwdWJsaWMgcHJvdG9jb2wgVFNlcmlhbGl6YWJsZSA6IEhhc2hhYmxlIHsKKyAgCisgIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZSA6IFRUeXBlIHsgZ2V0IH0KKyAgCisgIGluaXQoKQorICAKKyAgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBTZWxmCisgIAorICBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBTZWxmLCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cworICAKK30KKworCisKK2luZml4IG9wZXJhdG9yID89PSB7fQorCitwdWJsaWMgZnVuYyA/PT08VDogVFNlcmlhbGl6YWJsZT4obGhzOiBUPywgcmhzOiBUPykgLT4gQm9vbCB7CisgIGlmIGxldCBsID0gbGhzLCByID0gcmhzIHsKKyAgICByZXR1cm4gbCA9PSByCisgIH0KKyAgcmV0dXJuIGxocyA9PSByaHMKK30KKworcHVibGljIGZ1bmMgPz09PFQ6IFRTZXJpYWxpemFibGU+KGxoczogVCwgcmhzOiBUKSAtPiBCb29sIHsKKyAgcmV0dXJuIGxocyA9PSByaHMKK30KKworCisKK2V4dGVuc2lvbiBCb29sIDogVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIGxldCB0aHJpZnRUeXBlID0gVFR5cGUuQk9PTAorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gQm9vbCB7CisgICAgdmFyIHZhbHVlIDogT2JqQ0Jvb2wgPSBmYWxzZQorICAgIHRyeSBwcm90by5yZWFkQm9vbCgmdmFsdWUpCisgICAgcmV0dXJuIHZhbHVlLmJvb2xWYWx1ZQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogQm9vbCwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUJvb2wodmFsdWUpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBJbnQ4IDogVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIGxldCB0aHJpZnRUeXBlID0gVFR5cGUuQllURQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50OCB7CisgICAgdmFyIHZhbHVlID0gVUludDgoKQorICAgIHRyeSBwcm90by5yZWFkQnl0ZSgmdmFsdWUpCisgICAgcmV0dXJuIEludDgodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBJbnQ4LCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlQnl0ZShVSW50OCh2YWx1ZSkpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBJbnQxNiA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLkkxNgorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50MTYgeworICAgIHZhciB2YWx1ZSA9IEludDE2KCkKKyAgICB0cnkgcHJvdG8ucmVhZEkxNigmdmFsdWUpCisgICAgcmV0dXJuIHZhbHVlCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBJbnQxNiwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUkxNih2YWx1ZSkKKyAgfQorICAKK30KKworZXh0ZW5zaW9uIEludCA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLkkzMgorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50IHsKKyAgICB2YXIgdmFsdWUgPSBJbnQzMigpCisgICAgdHJ5IHByb3RvLnJlYWRJMzIoJnZhbHVlKQorICAgIHJldHVybiBJbnQodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBJbnQsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVJMzIoSW50MzIodmFsdWUpKQorICB9CisgIAorfQorCitleHRlbnNpb24gSW50MzIgOiBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgbGV0IHRocmlmdFR5cGUgPSBUVHlwZS5JMzIKKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludDMyIHsKKyAgICB2YXIgdmFsdWUgPSBJbnQzMigpCisgICAgdHJ5IHByb3RvLnJlYWRJMzIoJnZhbHVlKQorICAgIHJldHVybiB2YWx1ZQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogSW50MzIsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVJMzIodmFsdWUpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBJbnQ2NCA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLkk2NAorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50NjQgeworICAgIHZhciB2YWx1ZSA9IEludDY0KCkKKyAgICB0cnkgcHJvdG8ucmVhZEk2NCgmdmFsdWUpCisgICAgcmV0dXJuIHZhbHVlCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBJbnQ2NCwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUk2NCh2YWx1ZSkKKyAgfQorICAKK30KKworZXh0ZW5zaW9uIERvdWJsZSA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLkRPVUJMRQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gRG91YmxlIHsKKyAgICB2YXIgdmFsdWUgPSBEb3VibGUoKQorICAgIHRyeSBwcm90by5yZWFkRG91YmxlKCZ2YWx1ZSkKKyAgICByZXR1cm4gdmFsdWUKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IERvdWJsZSwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZURvdWJsZSh2YWx1ZSkKKyAgfQorICAKK30KKworZXh0ZW5zaW9uIFN0cmluZyA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLlNUUklORworICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICB2YXIgdmFsdWUgOiBOU1N0cmluZz8KKyAgICB0cnkgcHJvdG8ucmVhZFN0cmluZygmdmFsdWUpCisgICAgcmV0dXJuIHZhbHVlIGFzISBTdHJpbmcKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IFN0cmluZywgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZVN0cmluZyh2YWx1ZSkKKyAgfQorICAKK30KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVFNldC5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVFNldC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTgzM2U1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UU2V0LnN3aWZ0CkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworcHVibGljIHN0cnVjdCBUU2V0PEVsZW1lbnQgOiBUU2VyaWFsaXphYmxlPiA6IENvbGxlY3Rpb25UeXBlLCBBcnJheUxpdGVyYWxDb252ZXJ0aWJsZSwgVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gLlNFVCB9CisgIAorICBwdWJsaWMgdHlwZWFsaWFzIEluZGV4ID0gU3RvcmFnZS5JbmRleAorICAKKyAgdHlwZWFsaWFzIFN0b3JhZ2UgPSBTZXQ8RWxlbWVudD4KKyAgCisgIHByaXZhdGUgdmFyIHN0b3JhZ2UgOiBTdG9yYWdlCisgIAorICBwdWJsaWMgaW5pdCgpIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZSgpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KGFycmF5TGl0ZXJhbCBlbGVtZW50czogRWxlbWVudC4uLikgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKGVsZW1lbnRzKQorICB9CisgIAorICBwdWJsaWMgaW5pdDxTIDogU2VxdWVuY2VUeXBlIHdoZXJlIFMuR2VuZXJhdG9yLkVsZW1lbnQgPT0gRWxlbWVudD4oXyBzZXF1ZW5jZTogUykgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKHNlcXVlbmNlKSAgICAKKyAgfQorICAKKyAgcHVibGljIHZhciBzdGFydEluZGV4IDogSW5kZXggeyByZXR1cm4gc3RvcmFnZS5zdGFydEluZGV4IH0KKyAgCisgIHB1YmxpYyB2YXIgZW5kSW5kZXggOiBJbmRleCB7IHJldHVybiBzdG9yYWdlLmVuZEluZGV4IH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGluc2VydChtZW1iZXI6IEVsZW1lbnQpIHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbnNlcnQobWVtYmVyKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmUoZWxlbWVudDogRWxlbWVudCkgLT4gRWxlbWVudD8geworICAgIHJldHVybiBzdG9yYWdlLnJlbW92ZShlbGVtZW50KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVBbGwoa2VlcENhcGFjaXR5IGtlZXBDYXBhY2l0eTogQm9vbCA9IGZhbHNlKSB7CisgICAgcmV0dXJuIHN0b3JhZ2UucmVtb3ZlQWxsKGtlZXBDYXBhY2l0eToga2VlcENhcGFjaXR5KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVBdEluZGV4KGluZGV4OiBTZXRJbmRleDxFbGVtZW50PikgLT4gRWxlbWVudCB7CisgICAgcmV0dXJuIHN0b3JhZ2UucmVtb3ZlQXRJbmRleChpbmRleCkKKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdCAocG9zaXRpb246IFNldEluZGV4PEVsZW1lbnQ+KSAtPiBFbGVtZW50IHsKKyAgICByZXR1cm4gc3RvcmFnZVtwb3NpdGlvbl0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgdW5pb24ob3RoZXI6IFRTZXQpIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2UudW5pb24ob3RoZXIpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpbnRlcnNlY3Qob3RoZXI6IFRTZXQpIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2UuaW50ZXJzZWN0KG90aGVyKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZXhjbHVzaXZlT3Iob3RoZXI6IFRTZXQpIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2UuZXhjbHVzaXZlT3Iob3RoZXIpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBzdWJ0cmFjdChvdGhlcjogVFNldCkgLT4gVFNldCB7CisgICAgcmV0dXJuIFRTZXQoc3RvcmFnZS5zdWJ0cmFjdChvdGhlcikpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGludGVyc2VjdEluUGxhY2Uob3RoZXI6IFRTZXQpIHsKKyAgICBzdG9yYWdlLmludGVyc2VjdEluUGxhY2Uob3RoZXIpCisgIH0KKworICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBleGNsdXNpdmVPckluUGxhY2Uob3RoZXI6IFRTZXQpIHsKKyAgICBzdG9yYWdlLmV4Y2x1c2l2ZU9ySW5QbGFjZShvdGhlcikKKyAgfQorCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHN1YnRyYWN0SW5QbGFjZShvdGhlcjogVFNldCkgeworICAgIHN0b3JhZ2Uuc3VidHJhY3RJblBsYWNlKG90aGVyKQorICB9ICAKKworICBwdWJsaWMgZnVuYyBpc1N1YnNldE9mKG90aGVyOiBUU2V0KSAtPiBCb29sIHsKKyAgICByZXR1cm4gc3RvcmFnZS5pc1N1YnNldE9mKG90aGVyKQorICB9CisKKyAgcHVibGljIGZ1bmMgaXNEaXNqb2ludFdpdGgob3RoZXI6IFRTZXQpIC0+IEJvb2wgeworICAgIHJldHVybiBzdG9yYWdlLmlzRGlzam9pbnRXaXRoKG90aGVyKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpc1N1cGVyc2V0T2Yob3RoZXI6IFRTZXQpIC0+IEJvb2wgeworICAgIHJldHVybiBzdG9yYWdlLmlzU3VwZXJzZXRPZihvdGhlcikKKyAgfQorCisgIHB1YmxpYyB2YXIgaXNFbXB0eTogQm9vbCB7IHJldHVybiBzdG9yYWdlLmlzRW1wdHkgfQorCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlIDogSW50IHsKKyAgICBsZXQgcHJpbWUgPSAzMQorICAgIHZhciByZXN1bHQgPSAxCisgICAgZm9yIGVsZW1lbnQgaW4gc3RvcmFnZSB7CisgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIGVsZW1lbnQuaGFzaFZhbHVlCisgICAgfQorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gVFNldCB7CisgICAgbGV0IChlbGVtZW50VHlwZSwgc2l6ZSkgPSB0cnkgcHJvdG8ucmVhZFNldEJlZ2luKCkKKyAgICBpZiBlbGVtZW50VHlwZSAhPSBFbGVtZW50LnRocmlmdFR5cGUgeworICAgICAgdGhyb3cgTlNFcnJvcigKKyAgICAgICAgZG9tYWluOiBUUHJvdG9jb2xFcnJvckRvbWFpbiwKKyAgICAgICAgY29kZTogSW50KFRQcm90b2NvbEVycm9yLkludmFsaWREYXRhLnJhd1ZhbHVlKSwKKyAgICAgICAgdXNlckluZm86IFtUUHJvdG9jb2xFcnJvckV4dGVuZGVkRXJyb3JLZXk6IE5TTnVtYmVyKGludDogZWxlbWVudFR5cGUucmF3VmFsdWUpXSkKKyAgICB9CisgICAgdmFyIHNldCA9IFRTZXQoKQorICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgIGxldCBlbGVtZW50ID0gdHJ5IEVsZW1lbnQucmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvKQorICAgICAgc2V0LnN0b3JhZ2UuaW5zZXJ0KGVsZW1lbnQpCisgICAgfQorICAgIHRyeSBwcm90by5yZWFkU2V0RW5kKCkKKyAgICByZXR1cm4gc2V0CisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBUU2V0LCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGUoRWxlbWVudC50aHJpZnRUeXBlLCBzaXplOiB2YWx1ZS5jb3VudCkKKyAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZS5zdG9yYWdlIHsKKyAgICAgIHRyeSBFbGVtZW50LndyaXRlVmFsdWUoZWxlbWVudCwgdG9Qcm90b2NvbDogcHJvdG8pCisgICAgfQorICAgIHRyeSBwcm90by53cml0ZVNldEVuZCgpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBUU2V0IDogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUsIEN1c3RvbURlYnVnU3RyaW5nQ29udmVydGlibGUgeworICAKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVzY3JpcHRpb24KKyAgfQorICAKKyAgcHVibGljIHZhciBkZWJ1Z0Rlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZWJ1Z0Rlc2NyaXB0aW9uCisgIH0KKyAgCit9CisKK3B1YmxpYyBmdW5jID09PEVsZW1lbnQ+KGxoczogVFNldDxFbGVtZW50PiwgcmhzOiBUU2V0PEVsZW1lbnQ+KSAtPiBCb29sIHsKKyAgcmV0dXJuIGxocy5zdG9yYWdlID09IHJocy5zdG9yYWdlCit9CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RTaGFyZWRQcm9jZXNzb3JGYWN0b3J5LmggYi9saWIvY29jb2Evc3JjL1RTaGFyZWRQcm9jZXNzb3JGYWN0b3J5LmgKaW5kZXggY2Y0YTQ2Mi4uYzc1ZmFkMSAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9UU2hhcmVkUHJvY2Vzc29yRmFjdG9yeS5oCisrKyBiL2xpYi9jb2NvYS9zcmMvVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkuaApAQCAtMjAsOCArMjAsOSBAQAogI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CiAjaW1wb3J0ICJUUHJvY2Vzc29yRmFjdG9yeS5oIgogCi1AaW50ZXJmYWNlIFRTaGFyZWRQcm9jZXNzb3JGYWN0b3J5IDogTlNPYmplY3QgPFRQcm9jZXNzb3JGYWN0b3J5PiB7Ci0gIGlkPFRQcm9jZXNzb3I+IG1TaGFyZWRQcm9jZXNzb3I7Ci19Ci0tIChpZCkgaW5pdFdpdGhTaGFyZWRQcm9jZXNzb3I6IChpZDxUUHJvY2Vzc29yPikgc2hhcmVkUHJvY2Vzc29yOworCitAaW50ZXJmYWNlIFRTaGFyZWRQcm9jZXNzb3JGYWN0b3J5IDogTlNPYmplY3QgPFRQcm9jZXNzb3JGYWN0b3J5PgorCistKGlkKSBpbml0V2l0aFNoYXJlZFByb2Nlc3NvcjooaWQ8VFByb2Nlc3Nvcj4pc2hhcmVkUHJvY2Vzc29yOworCiBAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RTaGFyZWRQcm9jZXNzb3JGYWN0b3J5Lm0gYi9saWIvY29jb2Evc3JjL1RTaGFyZWRQcm9jZXNzb3JGYWN0b3J5Lm0KaW5kZXggYjM4ZTczYS4uM2Q1NWY0NyAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9UU2hhcmVkUHJvY2Vzc29yRmFjdG9yeS5tCisrKyBiL2xpYi9jb2NvYS9zcmMvVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkubQpAQCAtMjEsMzEgKzIxLDI5IEBACiAjaW1wb3J0ICJUU2hhcmVkUHJvY2Vzc29yRmFjdG9yeS5oIgogCiAKK0BpbnRlcmZhY2UgVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBpZDxUUHJvY2Vzc29yPiBzaGFyZWRQcm9jZXNzb3I7CisKK0BlbmQKKworCiBAaW1wbGVtZW50YXRpb24gVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkKIAogCi0tIChpZCkgaW5pdFdpdGhTaGFyZWRQcm9jZXNzb3I6IChpZDxUUHJvY2Vzc29yPikgc2hhcmVkUHJvY2Vzc29yCistKGlkKSBpbml0V2l0aFNoYXJlZFByb2Nlc3NvcjooaWQ8VFByb2Nlc3Nvcj4pc2hhcmVkUHJvY2Vzc29yCiB7CiAgIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmICghc2VsZikgewotICAgIHJldHVybiBuaWw7CisgIGlmIChzZWxmKSB7CisgICAgX3NoYXJlZFByb2Nlc3NvciA9IHNoYXJlZFByb2Nlc3NvcjsKICAgfQotICAKLSAgbVNoYXJlZFByb2Nlc3NvciA9IFtzaGFyZWRQcm9jZXNzb3IgcmV0YWluXTsKKwogICByZXR1cm4gc2VsZjsKIH0KIAotCi0tICh2b2lkKSBkZWFsbG9jCistKGlkPFRQcm9jZXNzb3I+KSBwcm9jZXNzb3JGb3JUcmFuc3BvcnQ6KGlkPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydAogewotICBbbVNoYXJlZFByb2Nlc3NvciByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0KLS0gKGlkPFRQcm9jZXNzb3I+KSBwcm9jZXNzb3JGb3JUcmFuc3BvcnQ6IChpZDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0Ci17Ci0gIHJldHVybiBbW21TaGFyZWRQcm9jZXNzb3IgcmV0YWluXSBhdXRvcmVsZWFzZV07CisgIHJldHVybiBfc2hhcmVkUHJvY2Vzc29yOwogfQogCiBAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RTdHJ1Y3Quc3dpZnQgYi9saWIvY29jb2Evc3JjL1RTdHJ1Y3Quc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VhNzJlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVFN0cnVjdC5zd2lmdApAQCAtMCwwICsxLDMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworcHVibGljIHByb3RvY29sIFRTdHJ1Y3QgOiBUU2VyaWFsaXphYmxlIHsKK30KKworCitwdWJsaWMgZXh0ZW5zaW9uIFRTdHJ1Y3QgeworICAKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZSA6IFRUeXBlIHsgcmV0dXJuIFRUeXBlLlNUUlVDVCB9CisgIAorfQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UaHJpZnQuaCBiL2xpYi9jb2NvYS9zcmMvVGhyaWZ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxODI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVGhyaWZ0LmgKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIFRocmlmdFZlcnNpb24gQCIxLjAuMCIKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJhc2UuaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTM1ZDUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmFzZS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisKKyNpbXBvcnQgIlRQcm90b2NvbC5oIgorCitAcHJvdG9jb2wgVEJhc2UgPE5TT2JqZWN0PgorCisvKioKKyAqIERlLXNlcmlhbGl6ZSBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgcHJvdG9jb2wKKyAqCisgKiBAcGFyYW0gaW5Qcm90b2NvbCBwcm90b2NvbCB1c2VkIGZvciByZWFkaW5nCisgKi8KKy0oQk9PTCkgcmVhZDooaWQgPFRQcm90b2NvbD4paW5Qcm90b2NvbCBlcnJvcjooTlNFcnJvciAqKillcnJvcjsKKworLyoqCisgKiBTZXJpYWxpemUgb2JqZWN0IHRvIHRoZSBnaXZlbiBwcm90b2NvbAorICoKKyAqIEBwYXJhbSBvdXRQcm90b2NvbCBvdXRwdXQgcHJvdG9jb2wgdXNlZCBmb3Igd3JpdGluZworICovCistKEJPT0wpIHdyaXRlOihpZCA8VFByb3RvY29sPilvdXRQcm90b2NvbCBlcnJvcjooTlNFcnJvciAqKillcnJvcjsKKworCisvKioKKyAqIFZhbGlkYXRlIHJlcXVpcmVkIGZpZWxkcworICovCistKEJPT0wpIHZhbGlkYXRlOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKilfX3RocmlmdEVycm9yOworCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaAppbmRleCA1MmNmMjY2Li5iYjkwZmFkIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgKQEAgLTIxLDMxICsyMSwyOSBAQAogI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgogI2ltcG9ydCAiVFByb3RvY29sRmFjdG9yeS5oIgogCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgogCi1AaW50ZXJmYWNlIFRCaW5hcnlQcm90b2NvbCA6IE5TT2JqZWN0IDxUUHJvdG9jb2w+IHsKLSAgaWQgPFRUcmFuc3BvcnQ+IG1UcmFuc3BvcnQ7Ci0gIEJPT0wgbVN0cmljdFJlYWQ7Ci0gIEJPT0wgbVN0cmljdFdyaXRlOwotICBpbnQzMl90IG1NZXNzYWdlU2l6ZUxpbWl0OwotfQogCi0tIChpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6IChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydDsKK0BpbnRlcmZhY2UgVEJpbmFyeVByb3RvY29sIDogTlNPYmplY3QgPFRQcm90b2NvbD4KIAotLSAoaWQpIGluaXRXaXRoVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgc3RyaWN0UmVhZDogKEJPT0wpIHN0cmljdFJlYWQKLSAgICAgICAgICAgICBzdHJpY3RXcml0ZTogKEJPT0wpIHN0cmljdFdyaXRlOworQHByb3BlcnR5IChhc3NpZ24sIG5vbmF0b21pYykgVUludDMyIG1lc3NhZ2VTaXplTGltaXQ7CiAKLS0gKGludDMyX3QpIG1lc3NhZ2VTaXplTGltaXQ7Ci0tICh2b2lkKSBzZXRNZXNzYWdlU2l6ZUxpbWl0OiAoaW50MzJfdCkgc2l6ZUxpbWl0OworLShpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQ7CisKKy0oaWQpIGluaXRXaXRoVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pdHJhbnNwb3J0CisgICAgICAgICAgICAgc3RyaWN0UmVhZDooQk9PTClzdHJpY3RSZWFkCisgICAgICAgICAgICBzdHJpY3RXcml0ZTooQk9PTClzdHJpY3RXcml0ZTsKIAogQGVuZDsKIAogCi1AaW50ZXJmYWNlIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgOiBOU09iamVjdCA8VFByb3RvY29sRmFjdG9yeT4gewotfQorQGludGVyZmFjZSBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IDogTlNPYmplY3QgPFRQcm90b2NvbEZhY3Rvcnk+CiAKLSsgKFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgKikgc2hhcmVkRmFjdG9yeTsKKysoVEJpbmFyeVByb3RvY29sRmFjdG9yeSAqKSBzaGFyZWRGYWN0b3J5OwogCi0tIChUQmluYXJ5UHJvdG9jb2wgKikgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDogKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0OworLShUQmluYXJ5UHJvdG9jb2wgKikgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydDsKIAogQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLm0gYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5tCmluZGV4IGIyNzI3MTYuLjFmOWU1N2EgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLm0KKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wubQpAQCAtMTgsMTcgKzE4LDIwIEBACiAgKi8KIAogI2ltcG9ydCAiVEJpbmFyeVByb3RvY29sLmgiCi0jaW1wb3J0ICJUUHJvdG9jb2xFeGNlcHRpb24uaCIKLQotaW50MzJfdCBWRVJTSU9OXzEgPSAweDgwMDEwMDAwOwotaW50MzJfdCBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwOworI2ltcG9ydCAiVFByb3RvY29sRXJyb3IuaCIKIAogCi1zdGF0aWMgVEJpbmFyeVByb3RvY29sRmFjdG9yeSAqIGdTaGFyZWRGYWN0b3J5ID0gbmlsOworc3RhdGljIFNJbnQzMiBWRVJTSU9OXzEgPSAweDgwMDEwMDAwOworc3RhdGljIFNJbnQzMiBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwOworCisKK3N0YXRpYyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ICpnU2hhcmVkRmFjdG9yeSA9IG5pbDsKKwogCiBAaW1wbGVtZW50YXRpb24gVEJpbmFyeVByb3RvY29sRmFjdG9yeQogCi0rIChUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ICopIHNoYXJlZEZhY3RvcnkgeworKyhUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ICopIHNoYXJlZEZhY3RvcnkKK3sKICAgaWYgKGdTaGFyZWRGYWN0b3J5ID09IG5pbCkgewogICAgIGdTaGFyZWRGYWN0b3J5ID0gW1tUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IGFsbG9jXSBpbml0XTsKICAgfQpAQCAtMzYsMzU4ICszOSw1NTMgQEAKICAgcmV0dXJuIGdTaGFyZWRGYWN0b3J5OwogfQogCi0tIChUQmluYXJ5UHJvdG9jb2wgKikgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDogKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0IHsKLSAgcmV0dXJuIFtbVEJpbmFyeVByb3RvY29sIGFsbG9jXSBpbml0V2l0aFRyYW5zcG9ydDogdHJhbnNwb3J0XTsKKy0oTlNTdHJpbmcgKikgcHJvdG9jb2xOYW1lCit7CisgIHJldHVybiBAImJpbmFyeSI7Cit9CisKKy0oVEJpbmFyeVByb3RvY29sICopIG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQKK3sKKyAgcmV0dXJuIFtbVEJpbmFyeVByb3RvY29sIGFsbG9jXSBpbml0V2l0aFRyYW5zcG9ydDp0cmFuc3BvcnRdOwogfQogCiBAZW5kCiAKIAorQGludGVyZmFjZSBUQmluYXJ5UHJvdG9jb2wgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBpZCA8VFRyYW5zcG9ydD4gdHJhbnNwb3J0OworCitAcHJvcGVydHkoYXNzaWduLCBub25hdG9taWMpIEJPT0wgc3RyaWN0UmVhZDsKK0Bwcm9wZXJ0eShhc3NpZ24sIG5vbmF0b21pYykgQk9PTCBzdHJpY3RXcml0ZTsKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU1N0cmluZyAqY3VycmVudE1lc3NhZ2VOYW1lOworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU1N0cmluZyAqY3VycmVudEZpZWxkTmFtZTsKKworQGVuZAorCiAKIEBpbXBsZW1lbnRhdGlvbiBUQmluYXJ5UHJvdG9jb2wKIAotLSAoaWQpIGluaXRXaXRoVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKKy0oaWQpIGluaXRXaXRoVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pYVRyYW5zcG9ydAogewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhUcmFuc3BvcnQ6IHRyYW5zcG9ydCBzdHJpY3RSZWFkOiBOTyBzdHJpY3RXcml0ZTogTk9dOworICByZXR1cm4gW3NlbGYgaW5pdFdpdGhUcmFuc3BvcnQ6YVRyYW5zcG9ydCBzdHJpY3RSZWFkOk5PIHN0cmljdFdyaXRlOllFU107CiB9CiAKLS0gKGlkKSBpbml0V2l0aFRyYW5zcG9ydDogKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgIHN0cmljdFJlYWQ6IChCT09MKSBzdHJpY3RSZWFkCi0gICAgICAgICAgICAgc3RyaWN0V3JpdGU6IChCT09MKSBzdHJpY3RXcml0ZQorLShpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQKKyAgICAgICAgICAgICBzdHJpY3RSZWFkOihCT09MKXN0cmljdFJlYWQKKyAgICAgICAgICAgIHN0cmljdFdyaXRlOihCT09MKXN0cmljdFdyaXRlCiB7CiAgIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIG1UcmFuc3BvcnQgPSBbdHJhbnNwb3J0IHJldGFpbl07Ci0gIG1TdHJpY3RSZWFkID0gc3RyaWN0UmVhZDsKLSAgbVN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGU7CisgIGlmIChzZWxmKSB7CisgICAgX3RyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICBfc3RyaWN0UmVhZCA9IHN0cmljdFJlYWQ7CisgICAgX3N0cmljdFdyaXRlID0gc3RyaWN0V3JpdGU7CisgIH0KICAgcmV0dXJuIHNlbGY7CiB9CiAKLQotLSAoaW50MzJfdCkgbWVzc2FnZVNpemVMaW1pdAorLShpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAogewotICByZXR1cm4gbU1lc3NhZ2VTaXplTGltaXQ7CisgIHJldHVybiBfdHJhbnNwb3J0OwogfQogCi0KLS0gKHZvaWQpIHNldE1lc3NhZ2VTaXplTGltaXQ6IChpbnQzMl90KSBzaXplTGltaXQKKy0oTlNTdHJpbmcgKikgcmVhZFN0cmluZ0JvZHk6KGludClzaXplIGVycm9yOihOU0Vycm9yICoqKWVycm9yCiB7Ci0gIG1NZXNzYWdlU2l6ZUxpbWl0ID0gc2l6ZUxpbWl0OwotfQotCi0KLS0gKHZvaWQpIGRlYWxsb2MKLXsKLSAgW21UcmFuc3BvcnQgcmVsZWFzZV07Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotCi0tIChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAotewotICByZXR1cm4gbVRyYW5zcG9ydDsKLX0KLQotCi0tIChOU1N0cmluZyAqKSByZWFkU3RyaW5nQm9keTogKGludCkgc2l6ZQotewotICBjaGFyICogYnVmZmVyID0gbWFsbG9jKHNpemUrMSk7Ci0gIGlmICghYnVmZmVyKSB7Ci0gICAgQHRocm93IFtUUHJvdG9jb2xFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFByb3RvY29sRXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGluICVzLCBzaXplOiAlaSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1BSRVRUWV9GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV1dOzsKKyAgTlNNdXRhYmxlRGF0YSAqZGF0YSA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOnNpemVdOworICBpZiAoIWRhdGEpIHsKKyAgICBQUk9UT0NPTF9FUlJPUihuaWwsIFVua25vd24sIEAiVW5hYmxlIHRvIGFsbG9jYXRlICVkIGJ5dGVzIiwgc2l6ZSk7CiAgIH0KLSAgW21UcmFuc3BvcnQgcmVhZEFsbDogKHVpbnQ4X3QgKikgYnVmZmVyIG9mZnNldDogMCBsZW5ndGg6IHNpemVdOwotICBidWZmZXJbc2l6ZV0gPSAwOwotICBOU1N0cmluZyAqIHJlc3VsdCA9IFtOU1N0cmluZyBzdHJpbmdXaXRoVVRGOFN0cmluZzogYnVmZmVyXTsKLSAgZnJlZShidWZmZXIpOwotICByZXR1cm4gcmVzdWx0OworCisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDpkYXRhLm11dGFibGVCeXRlcyBvZmZzZXQ6MCBsZW5ndGg6c2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IobmlsLCBlcnJvciwgQCJUcmFuc3BvcnQgcmVhZCBmYWlsZWQiKTsKKyAgfQorCisgIHJldHVybiBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aERhdGE6ZGF0YSBlbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ107CiB9CiAKIAotLSAodm9pZCkgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQgKikgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IChpbnQgKikgc2VxdWVuY2VJRAorLShCT09MKSByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKiopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyICopdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDooU0ludDMyICopc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50MzJfdCBzaXplID0gW3NlbGYgcmVhZEkzMl07CisgIFNJbnQzMiBzaXplOworICBpZiAoIVtzZWxmIHJlYWRJMzI6JnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIDsKKwogICBpZiAoc2l6ZSA8IDApIHsKICAgICBpbnQgdmVyc2lvbiA9IHNpemUgJiBWRVJTSU9OX01BU0s7CiAgICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTl8xKSB7Ci0gICAgICBAdGhyb3cgW1RQcm90b2NvbEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTogQCJUUHJvdG9jb2xFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IEAiQmFkIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbiJdOworICAgICAgUFJPVE9DT0xfRVJST1IoTk8sIEJhZFZlcnNpb24sIEAiQmFkIG1lc3NhZ2UgdmVyc2lvbiIpOwogICAgIH0KICAgICBpZiAodHlwZSAhPSBOVUxMKSB7Ci0gICAgICAqdHlwZSA9IHZlcnNpb24gJiAweDAwRkY7CisgICAgICAqdHlwZSA9IHNpemUgJiAweDAwRkY7CiAgICAgfQotICAgIE5TU3RyaW5nICogbWVzc2FnZU5hbWUgPSBbc2VsZiByZWFkU3RyaW5nXTsKKyAgICBOU1N0cmluZyAqbWVzc2FnZU5hbWU7CisgICAgaWYgKCFbc2VsZiByZWFkU3RyaW5nOiZtZXNzYWdlTmFtZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgICAgaWYgKG5hbWUgIT0gbmlsKSB7CisgICAgICAqbmFtZSA9IG1lc3NhZ2VOYW1lOworICAgIH0KKyAgfQorICBlbHNlIHsKKworICAgIGlmIChfc3RyaWN0UmVhZCkgeworICAgICAgUFJPVE9DT0xfRVJST1IoTk8sIEludmFsaWREYXRhLCBAIk1pc3NpbmcgbWVzc2FnZSB2ZXJzaW9uLCBvbGQgY2xpZW50PyIpOworICAgIH0KKworICAgIGlmIChfbWVzc2FnZVNpemVMaW1pdCA+IDAgJiYgc2l6ZSA+IF9tZXNzYWdlU2l6ZUxpbWl0KSB7CisgICAgICBQUk9UT0NPTF9FUlJPUihOTywgU2l6ZUxpbWl0LCBAIk1lc3NhZ2UgZXhjZWVlZHMgc2l6ZSBsaW1pdCBvZiAlZCIsIChpbnQpc2l6ZSk7CisgICAgfQorCisgICAgTlNTdHJpbmcgKm1lc3NhZ2VOYW1lID0gW3NlbGYgcmVhZFN0cmluZ0JvZHk6c2l6ZSBlcnJvcjplcnJvcl07CisgICAgaWYgKCFtZXNzYWdlTmFtZSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKwogICAgIGlmIChuYW1lICE9IE5VTEwpIHsKICAgICAgICpuYW1lID0gbWVzc2FnZU5hbWU7CiAgICAgfQotICAgIGludCBzZXFJRCA9IFtzZWxmIHJlYWRJMzJdOwotICAgIGlmIChzZXF1ZW5jZUlEICE9IE5VTEwpIHsKLSAgICAgICpzZXF1ZW5jZUlEID0gc2VxSUQ7CisKKyAgICBVSW50OCBtZXNzYWdlVHlwZTsKKyAgICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZtZXNzYWdlVHlwZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKICAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKG1TdHJpY3RSZWFkKSB7Ci0gICAgICBAdGhyb3cgW1RQcm90b2NvbEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTogQCJUUHJvdG9jb2xFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IEAiTWlzc2luZyB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW4sIG9sZCBjbGllbnQ/Il07Ci0gICAgfQotICAgIGlmIChbc2VsZiBtZXNzYWdlU2l6ZUxpbWl0XSA+IDAgJiYgc2l6ZSA+IFtzZWxmIG1lc3NhZ2VTaXplTGltaXRdKSB7Ci0gICAgICBAdGhyb3cgW1RQcm90b2NvbEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTogQCJUUHJvdG9jb2xFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6IEAiTWVzc2FnZSB0b28gYmlnLiAgU2l6ZSBsaW1pdCBpczogJWQgTWVzc2FnZSBzaXplIGlzOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NZXNzYWdlU2l6ZUxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplXV07Ci0gICAgfQotICAgIE5TU3RyaW5nICogbWVzc2FnZU5hbWUgPSBbc2VsZiByZWFkU3RyaW5nQm9keTogc2l6ZV07Ci0gICAgaWYgKG5hbWUgIT0gTlVMTCkgewotICAgICAgKm5hbWUgPSBtZXNzYWdlTmFtZTsKLSAgICB9Ci0gICAgaW50IG1lc3NhZ2VUeXBlID0gW3NlbGYgcmVhZEJ5dGVdOworCiAgICAgaWYgKHR5cGUgIT0gTlVMTCkgewogICAgICAgKnR5cGUgPSBtZXNzYWdlVHlwZTsKICAgICB9Ci0gICAgaW50IHNlcUlEID0gW3NlbGYgcmVhZEkzMl07Ci0gICAgaWYgKHNlcXVlbmNlSUQgIT0gTlVMTCkgewotICAgICAgKnNlcXVlbmNlSUQgPSBzZXFJRDsKLSAgICB9CiAgIH0KKworICBTSW50MzIgc2VxSUQ7CisgIGlmICghW3NlbGYgcmVhZEkzMjomc2VxSUQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmIChzZXF1ZW5jZUlEICE9IE5VTEwpIHsKKyAgICAqc2VxdWVuY2VJRCA9IHNlcUlEOworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSByZWFkTWVzc2FnZUVuZCB7fQotCi0KLS0gKHZvaWQpIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgbmFtZQorLShCT09MKSByZWFkTWVzc2FnZUVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaWYgKG5hbWUgIT0gTlVMTCkgewotICAgICpuYW1lID0gbmlsOwotICB9CisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgcmVhZFN0cnVjdEVuZCB7fQotCi0KLS0gKHZvaWQpIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTogKE5TU3RyaW5nICoqKSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQgKikgZmllbGRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IChpbnQgKikgZmllbGRJRAorLShCT09MKSByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqX19hdXRvcmVsZWFzaW5nICopbmFtZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaWYgKG5hbWUgIT0gTlVMTCkgeworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgcmVhZFN0cnVjdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKl9fYXV0b3JlbGVhc2luZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIgKilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOihTSW50MzIgKilmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKG5hbWUgIT0gbmlsKSB7CiAgICAgKm5hbWUgPSBuaWw7CiAgIH0KLSAgaW50IGZ0ID0gW3NlbGYgcmVhZEJ5dGVdOworCisgIFVJbnQ4IGZ0OworICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZmdCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KICAgaWYgKGZpZWxkVHlwZSAhPSBOVUxMKSB7CiAgICAgKmZpZWxkVHlwZSA9IGZ0OwogICB9Ci0gIGlmIChmdCAhPSBUVHlwZV9TVE9QKSB7Ci0gICAgaW50IGZpZCA9IFtzZWxmIHJlYWRJMTZdOworICBpZiAoZnQgIT0gVFR5cGVTVE9QKSB7CisgICAgU0ludDE2IGZpZDsKKyAgICBpZiAoIVtzZWxmIHJlYWRJMTY6JmZpZCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CiAgICAgaWYgKGZpZWxkSUQgIT0gTlVMTCkgewogICAgICAgKmZpZWxkSUQgPSBmaWQ7CiAgICAgfQogICB9CisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgcmVhZEZpZWxkRW5kIHt9Ci0KLQotLSAoaW50MzJfdCkgcmVhZEkzMgorLShCT09MKSByZWFkRmllbGRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIHVpbnQ4X3QgaTMycmRbNF07Ci0gIFttVHJhbnNwb3J0IHJlYWRBbGw6IGkzMnJkIG9mZnNldDogMCBsZW5ndGg6IDRdOwotICByZXR1cm4KKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHJlYWRTdHJpbmc6KE5TU3RyaW5nICpfX2F1dG9yZWxlYXNpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgU0ludDMyIHNpemU7CisgIGlmICghW3NlbGYgcmVhZEkzMjomc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBOU1N0cmluZyAqc3RyaW5nID0gW3NlbGYgcmVhZFN0cmluZ0JvZHk6c2l6ZSBlcnJvcjplcnJvcl07CisgIGlmICghc3RyaW5nKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgKnZhbHVlID0gc3RyaW5nOworCisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSByZWFkQm9vbDooQk9PTCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBieXRlOworICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZieXRlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgICp2YWx1ZSA9IGJ5dGUgPT0gMTsKKworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgcmVhZEJ5dGU6KFVJbnQ4ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IGJ1ZmZbMV07CisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDpidWZmIG9mZnNldDowIGxlbmd0aDoxIGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIik7CisgIH0KKworICAqdmFsdWUgPSBidWZmWzBdOworCisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSByZWFkSTE2OihTSW50MTYgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggYnVmZlsyXTsKKyAgaWYgKCFbX3RyYW5zcG9ydCByZWFkQWxsOmJ1ZmYgb2Zmc2V0OjAgbGVuZ3RoOjIgZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgcmVhZCBmYWlsZWQiKTsKKyAgfQorCisgICp2YWx1ZSA9CisgICAgKChTSW50MTYpKGJ1ZmZbMF0gJiAweGZmKSA8PCA4KSB8CisgICAgKChTSW50MTYpKGJ1ZmZbMV0gJiAweGZmKSk7CisKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHJlYWRJMzI6KFNJbnQzMiAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBpMzJyZFs0XTsKKyAgaWYgKCFbX3RyYW5zcG9ydCByZWFkQWxsOmkzMnJkIG9mZnNldDowIGxlbmd0aDo0IGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIik7CisgIH0KKworICAqdmFsdWUgPQogICAgICgoaTMycmRbMF0gJiAweGZmKSA8PCAyNCkgfAogICAgICgoaTMycmRbMV0gJiAweGZmKSA8PCAxNikgfAogICAgICgoaTMycmRbMl0gJiAweGZmKSA8PCAgOCkgfAogICAgICgoaTMycmRbM10gJiAweGZmKSk7CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tIChOU1N0cmluZyAqKSByZWFkU3RyaW5nCistKEJPT0wpIHJlYWRJNjQ6KFNJbnQ2NCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBpbnQgc2l6ZSA9IFtzZWxmIHJlYWRJMzJdOwotICByZXR1cm4gW3NlbGYgcmVhZFN0cmluZ0JvZHk6IHNpemVdOworICBVSW50OCBidWZmWzhdOworICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6YnVmZiBvZmZzZXQ6MCBsZW5ndGg6OCBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpOworICB9CisKKyAgKnZhbHVlID0KKyAgICAoKFNJbnQ2NCkoYnVmZlswXSAmIDB4ZmYpIDw8IDU2KSB8CisgICAgKChTSW50NjQpKGJ1ZmZbMV0gJiAweGZmKSA8PCA0OCkgfAorICAgICgoU0ludDY0KShidWZmWzJdICYgMHhmZikgPDwgNDApIHwKKyAgICAoKFNJbnQ2NCkoYnVmZlszXSAmIDB4ZmYpIDw8IDMyKSB8CisgICAgKChTSW50NjQpKGJ1ZmZbNF0gJiAweGZmKSA8PCAyNCkgfAorICAgICgoU0ludDY0KShidWZmWzVdICYgMHhmZikgPDwgMTYpIHwKKyAgICAoKFNJbnQ2NCkoYnVmZls2XSAmIDB4ZmYpIDw8ICA4KSB8CisgICAgKChTSW50NjQpKGJ1ZmZbN10gJiAweGZmKSk7CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tIChCT09MKSByZWFkQm9vbAotewotICByZXR1cm4gW3NlbGYgcmVhZEJ5dGVdID09IDE7Ci19Ci0KLS0gKHVpbnQ4X3QpIHJlYWRCeXRlCi17Ci0gIHVpbnQ4X3QgbXlCeXRlOwotICBbbVRyYW5zcG9ydCByZWFkQWxsOiAmbXlCeXRlIG9mZnNldDogMCBsZW5ndGg6IDFdOwotICByZXR1cm4gbXlCeXRlOwotfQotCi0tIChzaG9ydCkgcmVhZEkxNgotewotICB1aW50OF90IGJ1ZmZbMl07Ci0gIFttVHJhbnNwb3J0IHJlYWRBbGw6IGJ1ZmYgb2Zmc2V0OiAwIGxlbmd0aDogMl07Ci0gIHJldHVybiAoc2hvcnQpCi0gICAgKCgoYnVmZlswXSAmIDB4ZmYpIDw8IDgpIHwKLSAgICAgKChidWZmWzFdICYgMHhmZikpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS0gKGludDY0X3QpIHJlYWRJNjQ7Ci17Ci0gIHVpbnQ4X3QgaTY0cmRbOF07Ci0gIFttVHJhbnNwb3J0IHJlYWRBbGw6IGk2NHJkIG9mZnNldDogMCBsZW5ndGg6IDhdOwotICByZXR1cm4KLSAgICAoKGludDY0X3QpKGk2NHJkWzBdICYgMHhmZikgPDwgNTYpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzFdICYgMHhmZikgPDwgNDgpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzJdICYgMHhmZikgPDwgNDApIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzNdICYgMHhmZikgPDwgMzIpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzRdICYgMHhmZikgPDwgMjQpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzVdICYgMHhmZikgPDwgMTYpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzZdICYgMHhmZikgPDwgIDgpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzddICYgMHhmZikpOwotfQotCi0tIChkb3VibGUpIHJlYWREb3VibGU7CistKEJPT0wpIHJlYWREb3VibGU6KGRvdWJsZSAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewogICAvLyBGSVhNRSAtIHdpbGwgdGhpcyBnZXQgdXMgaW50byB0cm91YmxlIG9uIFBvd2VyUEM/Ci0gIGludDY0X3QgaWVlZTc1NCA9IFtzZWxmIHJlYWRJNjRdOwotICByZXR1cm4gKigoZG91YmxlICopICZpZWVlNzU0KTsKKyAgcmV0dXJuIFtzZWxmIHJlYWRJNjQ6KFNJbnQ2NCAqKXZhbHVlIGVycm9yOmVycm9yXTsKIH0KIAogCi0tIChOU0RhdGEgKikgcmVhZEJpbmFyeQorLShCT09MKSByZWFkQmluYXJ5OihOU0RhdGEgKl9fYXV0b3JlbGVhc2luZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBpbnQzMl90IHNpemUgPSBbc2VsZiByZWFkSTMyXTsKLSAgdWludDhfdCAqIGJ1ZmYgPSBtYWxsb2Moc2l6ZSk7Ci0gIGlmIChidWZmID09IE5VTEwpIHsKLSAgICBAdGhyb3cgW1RQcm90b2NvbEV4Y2VwdGlvbgotICAgICAgICAgICAgIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRQcm90b2NvbEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICByZWFzb246IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OiBAIk91dCBvZiBtZW1vcnkuICBVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgdHJ5aW5nIHRvIHJlYWQgYmluYXJ5IGRhdGEuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplXV07CisgIFNJbnQzMiBzaXplOworICBpZiAoIVtzZWxmIHJlYWRJMzI6JnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POwogICB9Ci0gIFttVHJhbnNwb3J0IHJlYWRBbGw6IGJ1ZmYgb2Zmc2V0OiAwIGxlbmd0aDogc2l6ZV07Ci0gIHJldHVybiBbTlNEYXRhIGRhdGFXaXRoQnl0ZXNOb0NvcHk6IGJ1ZmYgbGVuZ3RoOiBzaXplXTsKKworICBOU011dGFibGVEYXRhICpkYXRhID0gW05TTXV0YWJsZURhdGEgZGF0YVdpdGhMZW5ndGg6c2l6ZV07CisgIGlmICghZGF0YSkgeworICAgIFBST1RPQ09MX0VSUk9SKE5PLCBVbmtub3duLCBAIlVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyIsIChpbnQpc2l6ZSk7CisgIH0KKworICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6ZGF0YS5tdXRhYmxlQnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgcmVhZCBmYWlsZWQiKTsKKyAgfQorCisgICp2YWx1ZSA9IGRhdGE7CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOiAoaW50ICopIGtleVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6IChpbnQgKikgdmFsdWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50ICopIHNpemUKKy0oQk9PTCkgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZTooU0ludDMyICopa2V5VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOihTSW50MzIgKil2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBpbnQga3QgPSBbc2VsZiByZWFkQnl0ZV07Ci0gIGludCB2dCA9IFtzZWxmIHJlYWRCeXRlXTsKLSAgaW50IHMgPSBbc2VsZiByZWFkSTMyXTsKKyAgVUludDgga3Q7CisgIGlmICghW3NlbGYgcmVhZEJ5dGU6Jmt0IGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFVJbnQ4IHZ0OworICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZ2dCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBTSW50MzIgczsKKyAgaWYgKCFbc2VsZiByZWFkSTMyOiZzIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCiAgIGlmIChrZXlUeXBlICE9IE5VTEwpIHsKICAgICAqa2V5VHlwZSA9IGt0OwogICB9CisKICAgaWYgKHZhbHVlVHlwZSAhPSBOVUxMKSB7CiAgICAgKnZhbHVlVHlwZSA9IHZ0OwogICB9CisKICAgaWYgKHNpemUgIT0gTlVMTCkgewogICAgICpzaXplID0gczsKICAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKLS0gKHZvaWQpIHJlYWRNYXBFbmQge30KIAotCi0tICh2b2lkKSByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogKGludCAqKSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQgKikgc2l6ZQorLShCT09MKSByZWFkTWFwRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBpbnQgZXQgPSBbc2VsZiByZWFkQnl0ZV07Ci0gIGludCBzID0gW3NlbGYgcmVhZEkzMl07CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTooU0ludDMyICopZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IGV0OworICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZldCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBTSW50MzIgczsKKyAgaWYgKCFbc2VsZiByZWFkSTMyOiZzIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCiAgIGlmIChlbGVtZW50VHlwZSAhPSBOVUxMKSB7CiAgICAgKmVsZW1lbnRUeXBlID0gZXQ7CiAgIH0KKwogICBpZiAoc2l6ZSAhPSBOVUxMKSB7CiAgICAgKnNpemUgPSBzOwogICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSByZWFkU2V0RW5kIHt9Ci0KLQotLSAodm9pZCkgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiAoaW50ICopIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQgKikgc2l6ZQorLShCT09MKSByZWFkU2V0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBpbnQgZXQgPSBbc2VsZiByZWFkQnl0ZV07Ci0gIGludCBzID0gW3NlbGYgcmVhZEkzMl07CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6KFNJbnQzMiAqKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IGV0OworICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZldCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBTSW50MzIgczsKKyAgaWYgKCFbc2VsZiByZWFkSTMyOiZzIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCiAgIGlmIChlbGVtZW50VHlwZSAhPSBOVUxMKSB7CiAgICAgKmVsZW1lbnRUeXBlID0gZXQ7CiAgIH0KKwogICBpZiAoc2l6ZSAhPSBOVUxMKSB7CiAgICAgKnNpemUgPSBzOwogICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSByZWFkTGlzdEVuZCB7fQotCi0KLS0gKHZvaWQpIHdyaXRlQnl0ZTogKHVpbnQ4X3QpIHZhbHVlCistKEJPT0wpIHJlYWRMaXN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBbbVRyYW5zcG9ydCB3cml0ZTogJnZhbHVlIG9mZnNldDogMCBsZW5ndGg6IDFdOworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50KSBtZXNzYWdlVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogKGludCkgc2VxdWVuY2VJRAorCistKEJPT0wpIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIpbWVzc2FnZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDooU0ludDMyKXNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaWYgKG1TdHJpY3RXcml0ZSkgeworICBpZiAoX3N0cmljdFdyaXRlKSB7CisKICAgICBpbnQgdmVyc2lvbiA9IFZFUlNJT05fMSB8IG1lc3NhZ2VUeXBlOwotICAgIFtzZWxmIHdyaXRlSTMyOiB2ZXJzaW9uXTsKLSAgICBbc2VsZiB3cml0ZVN0cmluZzogbmFtZV07Ci0gICAgW3NlbGYgd3JpdGVJMzI6IHNlcXVlbmNlSURdOwotICB9IGVsc2UgewotICAgIFtzZWxmIHdyaXRlU3RyaW5nOiBuYW1lXTsKLSAgICBbc2VsZiB3cml0ZUJ5dGU6IG1lc3NhZ2VUeXBlXTsKLSAgICBbc2VsZiB3cml0ZUkzMjogc2VxdWVuY2VJRF07CisKKyAgICBpZiAoIVtzZWxmIHdyaXRlSTMyOnZlcnNpb24gZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgaWYgKCFbc2VsZiB3cml0ZVN0cmluZzpuYW1lIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIGlmICghW3NlbGYgd3JpdGVJMzI6c2VxdWVuY2VJRCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CiAgIH0KKyAgZWxzZSB7CisKKyAgICBpZiAoIVtzZWxmIHdyaXRlU3RyaW5nOm5hbWUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgaWYgKCFbc2VsZiB3cml0ZUJ5dGU6bWVzc2FnZVR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgaWYgKCFbc2VsZiB3cml0ZUkzMjpzZXF1ZW5jZUlEIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorCisgIF9jdXJyZW50TWVzc2FnZU5hbWUgPSBuYW1lOworCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgd3JpdGVNZXNzYWdlRW5kIHt9Ci0KLQotLSAodm9pZCkgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZSB7fQotCi0KLS0gKHZvaWQpIHdyaXRlU3RydWN0RW5kIHt9Ci0KLQotLSAodm9pZCkgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCkgZmllbGRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDogKGludCkgZmllbGRJRAorLShCT09MKSB3cml0ZU1lc3NhZ2VFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIFtzZWxmIHdyaXRlQnl0ZTogZmllbGRUeXBlXTsKLSAgW3NlbGYgd3JpdGVJMTY6IGZpZWxkSURdOworICBfY3VycmVudE1lc3NhZ2VOYW1lID0gbmlsOworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHdyaXRlSTMyOiAoaW50MzJfdCkgdmFsdWUKKy0oQk9PTCkgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICB1aW50OF90IGJ1ZmZbNF07CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZVN0cnVjdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6KFNJbnQzMilmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIVtzZWxmIHdyaXRlQnl0ZTpmaWVsZFR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKCFbc2VsZiB3cml0ZUkxNjpmaWVsZElEIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZUJvb2w6KEJPT0wpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbc2VsZiB3cml0ZUJ5dGU6KHZhbHVlID8gMSA6IDApIGVycm9yOmVycm9yXTsKK30KKworCistKEJPT0wpIHdyaXRlQnl0ZTooVUludDgpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6JnZhbHVlIG9mZnNldDowIGxlbmd0aDoxIGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICB9CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZUkxNjooc2hvcnQpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IGJ1ZmZbMl07CisgIGJ1ZmZbMF0gPSAweGZmICYgKHZhbHVlID4+IDgpOworICBidWZmWzFdID0gMHhmZiAmIHZhbHVlOworCisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6YnVmZiBvZmZzZXQ6MCBsZW5ndGg6MiBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKTsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZUkzMjooU0ludDMyKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBidWZmWzRdOwogICBidWZmWzBdID0gMHhGRiAmICh2YWx1ZSA+PiAyNCk7CiAgIGJ1ZmZbMV0gPSAweEZGICYgKHZhbHVlID4+IDE2KTsKICAgYnVmZlsyXSA9IDB4RkYgJiAodmFsdWUgPj4gOCk7CiAgIGJ1ZmZbM10gPSAweEZGICYgdmFsdWU7Ci0gIFttVHJhbnNwb3J0IHdyaXRlOiBidWZmIG9mZnNldDogMCBsZW5ndGg6IDRdOwotfQogCi0tICh2b2lkKSB3cml0ZUkxNjogKHNob3J0KSB2YWx1ZQotewotICB1aW50OF90IGJ1ZmZbMl07Ci0gIGJ1ZmZbMF0gPSAweGZmICYgKHZhbHVlID4+IDgpOwotICBidWZmWzFdID0gMHhmZiAmIHZhbHVlOwotICBbbVRyYW5zcG9ydCB3cml0ZTogYnVmZiBvZmZzZXQ6IDAgbGVuZ3RoOiAyXTsKKyAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTpidWZmIG9mZnNldDowIGxlbmd0aDo0IGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSB3cml0ZUk2NDogKGludDY0X3QpIHZhbHVlCistKEJPT0wpIHdyaXRlSTY0OihTSW50NjQpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIHVpbnQ4X3QgYnVmZls4XTsKKyAgVUludDggYnVmZls4XTsKICAgYnVmZlswXSA9IDB4RkYgJiAodmFsdWUgPj4gNTYpOwogICBidWZmWzFdID0gMHhGRiAmICh2YWx1ZSA+PiA0OCk7CiAgIGJ1ZmZbMl0gPSAweEZGICYgKHZhbHVlID4+IDQwKTsKQEAgLTM5Niw4MiArNTk0LDE0NyBAQAogICBidWZmWzVdID0gMHhGRiAmICh2YWx1ZSA+PiAxNik7CiAgIGJ1ZmZbNl0gPSAweEZGICYgKHZhbHVlID4+IDgpOwogICBidWZmWzddID0gMHhGRiAmIHZhbHVlOwotICBbbVRyYW5zcG9ydCB3cml0ZTogYnVmZiBvZmZzZXQ6IDAgbGVuZ3RoOiA4XTsKKworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOmJ1ZmYgb2Zmc2V0OjAgbGVuZ3RoOjggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSB3cml0ZURvdWJsZTogKGRvdWJsZSkgdmFsdWUKKworLShCT09MKSB3cml0ZURvdWJsZTooZG91YmxlKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAvLyBzcGl0IG91dCBJRUVFIDc1NCBiaXRzIC0gRklYTUUgLSB3aWxsIHRoaXMgZ2V0IHVzIGluIHRyb3VibGUgb24KLSAgLy8gUG93ZXJQQz8KLSAgW3NlbGYgd3JpdGVJNjQ6ICooKGludDY0X3QgKikgJnZhbHVlKV07CisgIC8vIEZJWE1FIC0gd2lsbCB0aGlzIGdldCB1cyBpbiB0cm91YmxlIG9uIFBvd2VyUEM/CisgIGlmICghW3NlbGYgd3JpdGVJNjQ6KihTSW50NjQgKikmdmFsdWUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSB3cml0ZVN0cmluZzogKE5TU3RyaW5nICopIHZhbHVlCistKEJPT0wpIHdyaXRlU3RyaW5nOihOU1N0cmluZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewogICBpZiAodmFsdWUgIT0gbmlsKSB7Ci0gICAgY29uc3QgY2hhciAqIHV0ZjhCeXRlcyA9IFt2YWx1ZSBVVEY4U3RyaW5nXTsKLSAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKHV0ZjhCeXRlcyk7Ci0gICAgW3NlbGYgd3JpdGVJMzI6IGxlbmd0aF07Ci0gICAgW21UcmFuc3BvcnQgd3JpdGU6ICh1aW50OF90ICopIHV0ZjhCeXRlcyBvZmZzZXQ6IDAgbGVuZ3RoOiBsZW5ndGhdOwotICB9IGVsc2UgeworCisgICAgY29uc3QgY2hhciAqdXRmOEJ5dGVzID0gW3ZhbHVlIFVURjhTdHJpbmddOworCisgICAgU0ludDMyIGxlbmd0aCA9IChTSW50MzIpc3RybGVuKHV0ZjhCeXRlcyk7CisgICAgaWYgKCFbc2VsZiB3cml0ZUkzMjpsZW5ndGggZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTooVUludDggKil1dGY4Qnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOihpbnQpbGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgICAgfQorCisgIH0KKyAgZWxzZSB7CisKICAgICAvLyBpbnN0ZWFkIG9mIGNyYXNoaW5nIHdoZW4gd2UgZ2V0IG51bGwsIGxldCdzIHdyaXRlIG91dCBhIHplcm8KICAgICAvLyBsZW5ndGggc3RyaW5nCi0gICAgW3NlbGYgd3JpdGVJMzI6IDBdOworICAgIGlmICghW3NlbGYgd3JpdGVJMzI6MCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKICAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgd3JpdGVCaW5hcnk6IChOU0RhdGEgKikgZGF0YQorLShCT09MKSB3cml0ZUJpbmFyeTooTlNEYXRhICopZGF0YSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgW3NlbGYgd3JpdGVJMzI6IFtkYXRhIGxlbmd0aF1dOwotICBbbVRyYW5zcG9ydCB3cml0ZTogW2RhdGEgYnl0ZXNdIG9mZnNldDogMCBsZW5ndGg6IFtkYXRhIGxlbmd0aF1dOwotfQorICBpZiAoIVtzZWxmIHdyaXRlSTMyOihTSW50MzIpZGF0YS5sZW5ndGggZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CiAKLS0gKHZvaWQpIHdyaXRlRmllbGRTdG9wCi17Ci0gIFtzZWxmIHdyaXRlQnl0ZTogVFR5cGVfU1RPUF07CisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6ZGF0YS5ieXRlcyBvZmZzZXQ6MCBsZW5ndGg6KFVJbnQzMilkYXRhLmxlbmd0aCBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKTsKKyAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgd3JpdGVGaWVsZEVuZCB7fQotCi0KLS0gKHZvaWQpIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZTogKGludCkga2V5VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOiAoaW50KSB2YWx1ZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZQorLShCT09MKSB3cml0ZUZpZWxkU3RvcDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgW3NlbGYgd3JpdGVCeXRlOiBrZXlUeXBlXTsKLSAgW3NlbGYgd3JpdGVCeXRlOiB2YWx1ZVR5cGVdOwotICBbc2VsZiB3cml0ZUkzMjogc2l6ZV07CisgIGlmICghW3NlbGYgd3JpdGVCeXRlOlRUeXBlU1RPUCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSB3cml0ZU1hcEVuZCB7fQogCi0KLS0gKHZvaWQpIHdyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGU6IChpbnQpIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50KSBzaXplCistKEJPT0wpIHdyaXRlRmllbGRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIFtzZWxmIHdyaXRlQnl0ZTogZWxlbWVudFR5cGVdOwotICBbc2VsZiB3cml0ZUkzMjogc2l6ZV07CisgIHJldHVybiBZRVM7CiB9CiAKLS0gKHZvaWQpIHdyaXRlU2V0RW5kIHt9CiAKLQotLSAodm9pZCkgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6IChpbnQpIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZQorLShCT09MKSB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6KFNJbnQzMilrZXlUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTooU0ludDMyKXZhbHVlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgW3NlbGYgd3JpdGVCeXRlOiBlbGVtZW50VHlwZV07Ci0gIFtzZWxmIHdyaXRlSTMyOiBzaXplXTsKKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGU6a2V5VHlwZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGU6dmFsdWVUeXBlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICBpZiAoIVtzZWxmIHdyaXRlSTMyOihpbnQpc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodm9pZCkgd3JpdGVMaXN0RW5kIHt9CiAKLQotLSAodm9pZCkgd3JpdGVCb29sOiAoQk9PTCkgdmFsdWUKKy0oQk9PTCkgd3JpdGVNYXBFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIFtzZWxmIHdyaXRlQnl0ZTogKHZhbHVlID8gMSA6IDApXTsKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHdyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGU6KFNJbnQzMillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIVtzZWxmIHdyaXRlQnl0ZTplbGVtZW50VHlwZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgaWYgKCFbc2VsZiB3cml0ZUkzMjpzaXplIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgd3JpdGVTZXRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGU6ZWxlbWVudFR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmICghW3NlbGYgd3JpdGVJMzI6c2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHdyaXRlTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKIH0KIAogQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjZhY2NjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUUHJvdG9jb2wuaCIKKyNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKKyNpbXBvcnQgIlRQcm90b2NvbEZhY3RvcnkuaCIKKworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCitAaW50ZXJmYWNlIFRDb21wYWN0UHJvdG9jb2wgOiBOU09iamVjdCA8VFByb3RvY29sPgorCistKGlkKSBpbml0V2l0aFRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydDsKKworQGVuZAorCitAaW50ZXJmYWNlIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5IDogTlNPYmplY3QgPFRQcm90b2NvbEZhY3Rvcnk+CisKKysoVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgKikgc2hhcmVkRmFjdG9yeTsKKworLShUQ29tcGFjdFByb3RvY29sICopIG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQ7CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wubSBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMGViYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wubQpAQCAtMCwwICsxLDk4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUQ29tcGFjdFByb3RvY29sLmgiCisjaW1wb3J0ICJUUHJvdG9jb2xFcnJvci5oIgorCitzdGF0aWMgY29uc3QgVUludDggQ09NUEFDVF9QUk9UT0NPTF9JRCA9IDB4ODI7CitzdGF0aWMgY29uc3QgVUludDggQ09NUEFDVF9WRVJTSU9OID0gMTsKK3N0YXRpYyBjb25zdCBVSW50OCBDT01QQUNUX1ZFUlNJT05fTUFTSyA9IDB4MUY7IC8vIDAwMDEgMTExMQorc3RhdGljIGNvbnN0IFVJbnQ4IENPTVBBQ1RfVFlQRV9NQVNLID0gMHhFMDsgLy8gMTExMCAwMDAwCitzdGF0aWMgY29uc3QgVUludDggQ09NUEFDVF9UWVBFX0JJVFMgPSAweDA3OyAvLyAwMDAwIDAxMTEKK3N0YXRpYyBjb25zdCBpbnQgQ09NUEFDVF9UWVBFX1NISUZUX0FNT1VOVCA9IDU7CisKK2VudW0geworICBUQ1R5cGVfU1RPUCA9IDB4MDAsCisgIFRDVHlwZV9CT09MRUFOX1RSVUUgPSAweDAxLAorICBUQ1R5cGVfQk9PTEVBTl9GQUxTRSA9IDB4MDIsCisgIFRDVHlwZV9CWVRFID0gMHgwMywKKyAgVENUeXBlX0kxNiA9IDB4MDQsCisgIFRDVHlwZV9JMzIgPSAweDA1LAorICBUQ1R5cGVfSTY0ID0gMHgwNiwKKyAgVENUeXBlX0RPVUJMRSA9IDB4MDcsCisgIFRDVHlwZV9CSU5BUlkgPSAweDA4LAorICBUQ1R5cGVfTElTVCA9IDB4MDksCisgIFRDVHlwZV9TRVQgPSAweDBBLAorICBUQ1R5cGVfTUFQID0gMHgwQiwKKyAgVENUeXBlX1NUUlVDVCA9IDB4MEMsCit9OworCitAaW1wbGVtZW50YXRpb24gVENvbXBhY3RQcm90b2NvbEZhY3RvcnkKKworKyhUQ29tcGFjdFByb3RvY29sRmFjdG9yeSAqKSBzaGFyZWRGYWN0b3J5Cit7CisgIHN0YXRpYyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSAqZ1NoYXJlZEZhY3RvcnkgPSBuaWw7CisgIGlmIChnU2hhcmVkRmFjdG9yeSA9PSBuaWwpIHsKKyAgICBnU2hhcmVkRmFjdG9yeSA9IFtbVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgYWxsb2NdIGluaXRdOworICB9CisKKyAgcmV0dXJuIGdTaGFyZWRGYWN0b3J5OworfQorCistKE5TU3RyaW5nICopIHByb3RvY29sTmFtZQoreworICByZXR1cm4gQCJjb21wYWN0IjsKK30KKworLShUQ29tcGFjdFByb3RvY29sICopIG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQKK3sKKyAgcmV0dXJuIFtbVENvbXBhY3RQcm90b2NvbCBhbGxvY10gaW5pdFdpdGhUcmFuc3BvcnQ6dHJhbnNwb3J0XTsKK30KKworQGVuZAorCisKK0BpbnRlcmZhY2UgVENvbXBhY3RQcm90b2NvbCAoKQorCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIGlkIDxUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNNdXRhYmxlQXJyYXkgKmxhc3RGaWVsZDsKK0Bwcm9wZXJ0eShhc3NpZ24sIG5vbmF0b21pYykgc2hvcnQgbGFzdEZpZWxkSWQ7CisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNTdHJpbmcgKmJvb2xGaWVsZE5hbWU7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TTnVtYmVyICpib29sRmllbGRUeXBlOworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU051bWJlciAqYm9vbEZpZWxkSWQ7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TTnVtYmVyICpib29sZWFuVmFsdWU7CisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNTdHJpbmcgKmN1cnJlbnRNZXNzYWdlTmFtZTsKKworQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBUQ29tcGFjdFByb3RvY29sCisKKy0oaWQpIGluaXQKK3sKKyAgc2VsZiA9IFtzdXBlciBpbml0XTsKKworICBpZiAoc2VsZiAhPSBuaWwpIHsKKyAgICBfbGFzdEZpZWxkID0gW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdF07CisgIH0KKworICByZXR1cm4gc2VsZjsKK30KKworLShpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0PilhVHJhbnNwb3J0Cit7CisgIHNlbGYgPSBbc2VsZiBpbml0XTsKKworICBpZiAoc2VsZiAhPSBuaWwpIHsKKyAgICBfdHJhbnNwb3J0ID0gYVRyYW5zcG9ydDsKKyAgfQorCisgIHJldHVybiBzZWxmOworfQorCistKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0Cit7CisgIHJldHVybiBfdHJhbnNwb3J0OworfQorCistKEJPT0wpIHdyaXRlQnl0ZURpcmVjdDooVUludDgpbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTooVUludDggKikmbiBvZmZzZXQ6MCBsZW5ndGg6MSBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKTsKKyAgfQorICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlVmFyaW50MzI6KFVJbnQzMiluIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBpMzJidWZbNV0gPSB7MH07CisgIFVJbnQzMiBpZHggPSAwOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKChuICYgfjB4N0YpID09IDApIHsKKyAgICAgIGkzMmJ1ZltpZHgrK10gPSAoVUludDgpbjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGkzMmJ1ZltpZHgrK10gPSAoVUludDgpKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG4gPj49IDc7CisgICAgfQorICB9CisKKyAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTppMzJidWYgb2Zmc2V0OjAgbGVuZ3RoOmlkeCBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKTsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiltZXNzYWdlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOihTSW50MzIpc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIVtzZWxmIHdyaXRlQnl0ZURpcmVjdDpDT01QQUNUX1BST1RPQ09MX0lEIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICBpZiAoIVtzZWxmIHdyaXRlQnl0ZURpcmVjdDooVUludDgpKChDT01QQUNUX1ZFUlNJT04gJiBDT01QQUNUX1ZFUlNJT05fTUFTSykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKChVSW50MzIpbWVzc2FnZVR5cGUpIDw8IENPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQpICYgQ09NUEFDVF9UWVBFX01BU0spKSBlcnJvcjplcnJvcl0pCisgIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgaWYgKCFbc2VsZiB3cml0ZVZhcmludDMyOihVSW50MzIpc2VxdWVuY2VJRCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgaWYgKCFbc2VsZiB3cml0ZVN0cmluZzpuYW1lIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIF9jdXJyZW50TWVzc2FnZU5hbWUgPSBuYW1lOworCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFtfbGFzdEZpZWxkIGFkZE9iamVjdDpAKF9sYXN0RmllbGRJZCldOworICBfbGFzdEZpZWxkSWQgPSAwOworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlU3RydWN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBfbGFzdEZpZWxkSWQgPSBbX2xhc3RGaWVsZC5sYXN0T2JqZWN0IHNob3J0VmFsdWVdOworICBbX2xhc3RGaWVsZCByZW1vdmVMYXN0T2JqZWN0XTsKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIpZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOihTSW50MzIpZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZUJPT0wpIHsKKyAgICBfYm9vbEZpZWxkTmFtZSA9IFtuYW1lIGNvcHldOworICAgIF9ib29sRmllbGRUeXBlID0gQChmaWVsZFR5cGUpOworICAgIF9ib29sRmllbGRJZCA9IEAoZmllbGRJRCk7CisgICAgcmV0dXJuIFlFUzsKKyAgfQorICBlbHNlIHsKKyAgICByZXR1cm4gW3NlbGYgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWxXaXRoTmFtZTpuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6ZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU92ZXJyaWRlOjB4RkYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcl07CisgIH0KK30KKworLShCT09MKSB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbFdpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyKWZpZWxkVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOihTSW50MzIpZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU92ZXJyaWRlOihVSW50OCl0eXBlT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggdHlwZVRvV3JpdGUgPSB0eXBlT3ZlcnJpZGUgPT0gMHhGRiA/IFtzZWxmIGNvbXBhY3RUeXBlRm9yVFR5cGU6ZmllbGRUeXBlXSA6IHR5cGVPdmVycmlkZTsKKworICAvLyBjaGVjayBpZiB3ZSBjYW4gdXNlIGRlbHRhIGVuY29kaW5nIGZvciB0aGUgZmllbGQgaWQKKyAgaWYgKGZpZWxkSUQgPiBfbGFzdEZpZWxkSWQgJiYgZmllbGRJRCAtIF9sYXN0RmllbGRJZCA8PSAxNSkgeworICAgIC8vIFdyaXRlIHRoZW0gdG9nZXRoZXIKKyAgICBpZiAoIVtzZWxmIHdyaXRlQnl0ZURpcmVjdDooZmllbGRJRCAtIF9sYXN0RmllbGRJZCkgPDwgNCB8IHR5cGVUb1dyaXRlIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICAvLyBXcml0ZSB0aGVtIHNlcGFyYXRlCisgICAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6dHlwZVRvV3JpdGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICAgIGlmICghW3NlbGYgd3JpdGVJMTY6ZmllbGRJRCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKworICBfbGFzdEZpZWxkSWQgPSBmaWVsZElEOworCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVGaWVsZFN0b3A6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6VENUeXBlX1NUT1AgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZTooU0ludDMyKWtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOihTSW50MzIpdmFsdWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6MCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKCFbc2VsZiB3cml0ZVZhcmludDMyOihVSW50MzIpc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgICAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6W3NlbGYgY29tcGFjdFR5cGVGb3JUVHlwZTprZXlUeXBlXSA8PCA0IHwgW3NlbGYgY29tcGFjdFR5cGVGb3JUVHlwZTp2YWx1ZVR5cGVdIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOihTSW50MzIpZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW3NlbGYgd3JpdGVDb2xsZWN0aW9uQmVnaW5XaXRoRWxlbWVudFR5cGU6ZWxlbWVudFR5cGUgc2l6ZTpzaXplIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOihTSW50MzIpZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtzZWxmIHdyaXRlQ29sbGVjdGlvbkJlZ2luV2l0aEVsZW1lbnRUeXBlOmVsZW1lbnRUeXBlIHNpemU6c2l6ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVCb29sOihCT09MKWIgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIEJPT0wgcmVzdWx0OworICBpZiAoX2Jvb2xGaWVsZElkICE9IG5pbCAmJiBfYm9vbEZpZWxkTmFtZSAhPSBuaWwgJiYgX2Jvb2xGaWVsZFR5cGUgIT0gbmlsKSB7CisgICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0CisgICAgcmVzdWx0ID0gW3NlbGYgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWxXaXRoTmFtZTpfYm9vbEZpZWxkTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6X2Jvb2xGaWVsZFR5cGUuaW50VmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOl9ib29sRmllbGRJZC5pbnRWYWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlcnJpZGU6YiA/IFRDVHlwZV9CT09MRUFOX1RSVUUgOiBUQ1R5cGVfQk9PTEVBTl9GQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdOworICAgIF9ib29sRmllbGRJZCA9IG5pbDsKKyAgICBfYm9vbEZpZWxkTmFtZSA9IG5pbDsKKyAgICBfYm9vbEZpZWxkVHlwZSA9IG5pbDsKKyAgfQorICBlbHNlIHsKKyAgICAvLyB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IFdyaXRlIHRoZSB2YWx1ZS4KKyAgICByZXN1bHQgPSBbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6YiA/IFRDVHlwZV9CT09MRUFOX1RSVUUgOiBUQ1R5cGVfQk9PTEVBTl9GQUxTRSBlcnJvcjplcnJvcl07CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLShCT09MKSB3cml0ZUJ5dGU6KFVJbnQ4KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW3NlbGYgd3JpdGVCeXRlRGlyZWN0OnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUkxNjooU0ludDE2KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW3NlbGYgd3JpdGVWYXJpbnQzMjpbc2VsZiBpMzJUb1ppZ1phZzp2YWx1ZV0gZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlSTMyOihTSW50MzIpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbc2VsZiB3cml0ZVZhcmludDMyOltzZWxmIGkzMlRvWmlnWmFnOnZhbHVlXSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVJNjQ6KFNJbnQ2NCl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtzZWxmIHdyaXRlVmFyaW50NjQ6W3NlbGYgaTY0VG9aaWdaYWc6dmFsdWVdIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZURvdWJsZTooZG91YmxlKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICAvLyBTYWZlIGJpdC1jYXN0aW5nIGRvdWJsZS0+dWludDY0CisKKyAgVUludDY0IGJpdHMgPSAwOworICBtZW1jcHkoJmJpdHMsICZ2YWx1ZSwgOCk7CisKKyAgYml0cyA9IE9TU3dhcEhvc3RUb0xpdHRsZUludDY0KGJpdHMpOworCisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6KFVJbnQ4ICopJmJpdHMgb2Zmc2V0OjAgbGVuZ3RoOjggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlU3RyaW5nOihOU1N0cmluZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW3NlbGYgd3JpdGVCaW5hcnk6W3ZhbHVlIGRhdGFVc2luZ0VuY29kaW5nOk5TVVRGOFN0cmluZ0VuY29kaW5nXSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVCaW5hcnk6KE5TRGF0YSAqKWRhdGEgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmICghW3NlbGYgd3JpdGVWYXJpbnQzMjooVUludDMyKWRhdGEubGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOmRhdGEuYnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOihVSW50MzIpZGF0YS5sZW5ndGggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZU1lc3NhZ2VFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIF9jdXJyZW50TWVzc2FnZU5hbWUgPSBuaWw7CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVNYXBFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVMaXN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlU2V0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlRmllbGRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVDb2xsZWN0aW9uQmVnaW5XaXRoRWxlbWVudFR5cGU6KFNJbnQzMillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IGN0eXBlRWxlbWVudCA9IFtzZWxmIGNvbXBhY3RUeXBlRm9yVFR5cGU6ZWxlbWVudFR5cGVdOworCisgIGlmIChzaXplIDw9IDE0KSB7CisgICAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6c2l6ZSA8PCA0IHwgY3R5cGVFbGVtZW50IGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBpZiAoIVtzZWxmIHdyaXRlQnl0ZURpcmVjdDoweGYwIHwgY3R5cGVFbGVtZW50IGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgICBpZiAoIVtzZWxmIHdyaXRlVmFyaW50MzI6KFVJbnQzMilzaXplIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlVmFyaW50NjQ6KFVJbnQ2NCluIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCB2YXJpbnQ2NG91dFsxMF0gPSB7MH07CisgIGludCBpZHggPSAwOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKChuICYgfjB4N0ZMKSA9PSAwKSB7CisgICAgICB2YXJpbnQ2NG91dFtpZHgrK10gPSAoVUludDgpbjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHZhcmludDY0b3V0W2lkeCsrXSA9IChVSW50OCkoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgbiA+Pj0gNzsKKyAgICB9CisgIH0KKworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOnZhcmludDY0b3V0IG9mZnNldDowIGxlbmd0aDppZHggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKFVJbnQzMikgaTMyVG9aaWdaYWc6KFNJbnQzMiluCit7CisgIC8qCisgICAgIFppZ1phZyBlbmNvZGluZyBtYXBzIHNpZ25lZCBpbnRlZ2VycyB0byB1bnNpZ25lZCBpbnRlZ2VycyBzbyB0aGF0CisgICAgIG51bWJlcnMgd2l0aCBhIHNtYWxsIGFic29sdXRlIHZhbHVlIChmb3IgaW5zdGFuY2UsIC0xKSBoYXZlCisgICAgIGEgc21hbGwgdmFyaW50IGVuY29kZWQgdmFsdWUgdG9vLiBJdCBkb2VzIHRoaXMgaW4gYSB3YXkgdGhhdAorICAgICAiemlnLXphZ3MiIGJhY2sgYW5kIGZvcnRoIHRocm91Z2ggdGhlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBpbnRlZ2VycywKKyAgICAgc28gdGhhdCAtMSBpcyBlbmNvZGVkIGFzIDEsIDEgaXMgZW5jb2RlZCBhcyAyLCAtMiBpcyBlbmNvZGVkIGFzIDMsIGFuZCBzbworICAgICAgICAgb24KKyAgICovCisgIHJldHVybiAoVUludDMyKShuIDw8IDEpIF4gKFVJbnQzMikobiA+PiAzMSk7Cit9CisKKy0oVUludDY0KSBpNjRUb1ppZ1phZzooU0ludDY0KW4KK3sKKyAgcmV0dXJuIChVSW50NjQpKG4gPDwgMSkgXiAoVUludDY0KShuID4+IDYzKTsKK30KKworLShCT09MKSByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKiopcG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiAqKXB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOihTSW50MzIgKilwc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggcHJvdG9jb2xJZDsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomcHJvdG9jb2xJZCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAocHJvdG9jb2xJZCAhPSBDT01QQUNUX1BST1RPQ09MX0lEKSB7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFByb3RvY29sRXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUUHJvdG9jb2xFcnJvclVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe1RQcm90b2NvbEVycm9yRXh0ZW5kZWRFcnJvcktleTogQChUUHJvdG9jb2xFeHRlbmRlZEVycm9yTWlzbWF0Y2hlZFByb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yRXhwZWN0ZWRJZEtleTogQChDT01QQUNUX1BST1RPQ09MX0lEKX1dOworICAgIH0KKyAgICByZXR1cm4gTk87CisgIH0KKworICBVSW50OCB2ZXJzaW9uQW5kVHlwZTsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomdmVyc2lvbkFuZFR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgVUludDggdmVyc2lvbiA9IHZlcnNpb25BbmRUeXBlICYgQ09NUEFDVF9WRVJTSU9OX01BU0s7CisgIGlmICh2ZXJzaW9uICE9IENPTVBBQ1RfVkVSU0lPTikgeworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRQcm90b2NvbEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFByb3RvY29sRXJyb3JCYWRWZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHtUUHJvdG9jb2xFcnJvckV4cGVjdGVkVmVyc2lvbktleTogQChDT01QQUNUX1ZFUlNJT04pfV07CisgICAgfQorICAgIHJldHVybiBOTzsKKyAgfQorCisgIGludCB0eXBlID0gKHZlcnNpb25BbmRUeXBlID4+IENPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQpICYgQ09NUEFDVF9UWVBFX0JJVFM7CisgIFVJbnQzMiBzZXF1ZW5jZUlEOworICBpZiAoIVtzZWxmIHJlYWRWYXJpbnQzMjomc2VxdWVuY2VJRCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgTlNTdHJpbmcgKm5hbWU7CisgIGlmICghW3NlbGYgcmVhZFN0cmluZzombmFtZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAocHR5cGUgIT0gTlVMTCkgeworICAgICpwdHlwZSA9IHR5cGU7CisgIH0KKyAgaWYgKHBzZXF1ZW5jZUlEICE9IE5VTEwpIHsKKyAgICAqcHNlcXVlbmNlSUQgPSBzZXF1ZW5jZUlEOworICB9CisgIGlmIChwbmFtZSAhPSBOVUxMKSB7CisgICAgKnBuYW1lID0gbmFtZTsKKyAgfQorICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICoqKXBuYW1lIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBbX2xhc3RGaWVsZCBhZGRPYmplY3Q6QChfbGFzdEZpZWxkSWQpXTsKKyAgX2xhc3RGaWVsZElkID0gMDsKKworICBpZiAocG5hbWUgIT0gTlVMTCkgeworICAgICpwbmFtZSA9IEAiIjsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZFN0cnVjdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgX2xhc3RGaWVsZElkID0gW19sYXN0RmllbGQubGFzdE9iamVjdCBzaG9ydFZhbHVlXTsKKyAgW19sYXN0RmllbGQgcmVtb3ZlTGFzdE9iamVjdF07CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqKilwbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiAqKXBmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOihTSW50MzIgKilwZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IGJ5dGU7CisgIGlmICghW3NlbGYgcmVhZEJ5dGU6JmJ5dGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgVUludDggdHlwZSA9IGJ5dGUgJiAweDBmOworCisgIC8vIGlmIGl0J3MgYSBzdG9wLCB0aGVuIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHksIGFzIHRoZSBzdHJ1Y3QgaXMgb3Zlci4KKyAgaWYgKHR5cGUgPT0gVENUeXBlX1NUT1ApIHsKKyAgICBpZiAocG5hbWUgIT0gTlVMTCkgeworICAgICAgKnBuYW1lID0gQCIiOworICAgIH0KKyAgICBpZiAocGZpZWxkVHlwZSAhPSBOVUxMKSB7CisgICAgICAqcGZpZWxkVHlwZSA9IFRUeXBlU1RPUDsKKyAgICB9CisgICAgaWYgKHBmaWVsZElEICE9IE5VTEwpIHsKKyAgICAgICpwZmllbGRJRCA9IDA7CisgICAgfQorICAgIHJldHVybiBZRVM7CisgIH0KKworICBzaG9ydCBmaWVsZElkID0gMDsKKworICAvLyBtYXNrIG9mZiB0aGUgNCBNU0Igb2YgdGhlIHR5cGUgaGVhZGVyLiBpdCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQgZGVsdGEuCisgIHNob3J0IG1vZGlmaWVyID0gKGJ5dGUgJiAweGYwKSA+PiA0OworICBpZiAobW9kaWZpZXIgPT0gMCkgeworICAgIC8vIG5vdCBhIGRlbHRhLiBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZC4KKyAgICBpZiAoIVtzZWxmIHJlYWRJMTY6JmZpZWxkSWQgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGVsc2UgeworICAgIC8vIGhhcyBhIGRlbHRhLiBhZGQgdGhlIGRlbHRhIHRvIHRoZSBsYXN0IFJlYWQgZmllbGQgaWQuCisgICAgZmllbGRJZCA9IF9sYXN0RmllbGRJZCArIG1vZGlmaWVyOworICB9CisKKyAgVUludDggZmllbGRUeXBlOworICBpZiAoIVtzZWxmIHR0eXBlOiZmaWVsZFR5cGUgZm9yQ29tcGFjdFR5cGU6dHlwZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAocG5hbWUgIT0gTlVMTCkgeworICAgICpwbmFtZSA9IEAiIjsKKyAgfQorICBpZiAocGZpZWxkVHlwZSAhPSBOVUxMKSB7CisgICAgKnBmaWVsZFR5cGUgPSBmaWVsZFR5cGU7CisgIH0KKyAgaWYgKHBmaWVsZElEICE9IE5VTEwpIHsKKyAgICAqcGZpZWxkSUQgPSBmaWVsZElkOworICB9CisKKyAgLy8gaWYgdGhpcyBoYXBwZW5zIHRvIGJlIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIGlzIGVuY29kZWQgaW4gdGhlIHR5cGUKKyAgaWYgKHR5cGUgPT0gVENUeXBlX0JPT0xFQU5fVFJVRSB8fAorICAgICAgdHlwZSA9PSBUQ1R5cGVfQk9PTEVBTl9GQUxTRSkKKyAgeworICAgIC8vIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlLgorICAgIF9ib29sZWFuVmFsdWUgPSBbTlNOdW1iZXIgbnVtYmVyV2l0aEJvb2w6dHlwZSA9PSBUQ1R5cGVfQk9PTEVBTl9UUlVFXTsKKyAgfQorCisgIC8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLgorICBfbGFzdEZpZWxkSWQgPSBmaWVsZElkOworCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZTooU0ludDMyICopcGtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTooU0ludDMyICopcHZhbHVlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIgKilwc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBrZXlBbmRWYWx1ZVR5cGUgPSAwOworICBVSW50MzIgc2l6ZTsKKyAgaWYgKCFbc2VsZiByZWFkVmFyaW50MzI6JnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmIChzaXplICE9IDApIHsKKyAgICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZrZXlBbmRWYWx1ZVR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisKKyAgVUludDgga2V5VHlwZTsKKyAgaWYgKCFbc2VsZiB0dHlwZToma2V5VHlwZSBmb3JDb21wYWN0VHlwZTprZXlBbmRWYWx1ZVR5cGUgPj4gNCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBVSW50OCB2YWx1ZVR5cGU7CisgIGlmICghW3NlbGYgdHR5cGU6JnZhbHVlVHlwZSBmb3JDb21wYWN0VHlwZTprZXlBbmRWYWx1ZVR5cGUgJiAweGYgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKHBrZXlUeXBlICE9IE5VTEwpIHsKKyAgICAqcGtleVR5cGUgPSBrZXlUeXBlOworICB9CisgIGlmIChwdmFsdWVUeXBlICE9IE5VTEwpIHsKKyAgICAqcHZhbHVlVHlwZSA9IHZhbHVlVHlwZTsKKyAgfQorICBpZiAocHNpemUgIT0gTlVMTCkgeworICAgICpwc2l6ZSA9IHNpemU7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTooU0ludDMyICopcGVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopcHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBzaXplQW5kVHlwZTsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomc2l6ZUFuZFR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgVUludDMyIHNpemUgPSAoc2l6ZUFuZFR5cGUgPj4gNCkgJiAweDBmOworICBpZiAoc2l6ZSA9PSAxNSkgeworICAgIGlmICghW3NlbGYgcmVhZFZhcmludDMyOiZzaXplIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorCisgIFVJbnQ4IGVsZW1lbnRUeXBlOworICBpZiAoIVtzZWxmIHR0eXBlOiZlbGVtZW50VHlwZSBmb3JDb21wYWN0VHlwZTpzaXplQW5kVHlwZSAmIDB4MGYgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKHBlbGVtZW50VHlwZSAhPSBOVUxMKSB7CisgICAgKnBlbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOworICB9CisgIGlmIChwc2l6ZSAhPSBOVUxMKSB7CisgICAgKnBzaXplID0gc2l6ZTsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6KFNJbnQzMiAqKXBlbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopcHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbc2VsZiByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6cGVsZW1lbnRUeXBlIHNpemU6cHNpemUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRCb29sOihCT09MICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmIChfYm9vbGVhblZhbHVlICE9IG5pbCkgeworCisgICAgQk9PTCByZXN1bHQgPSBfYm9vbGVhblZhbHVlLmJvb2xWYWx1ZTsKKyAgICBfYm9vbGVhblZhbHVlID0gbmlsOworCisgICAgKnZhbHVlID0gcmVzdWx0OworICB9CisgIGVsc2UgeworCisgICAgVUludDggcmVzdWx0OworICAgIGlmICghW3NlbGYgcmVhZEJ5dGU6JnJlc3VsdCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICAqdmFsdWUgPSByZXN1bHQgPT0gVENUeXBlX0JPT0xFQU5fVFJVRTsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZEJ5dGU6KFVJbnQ4ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDp2YWx1ZSBvZmZzZXQ6MCBsZW5ndGg6MSBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpOworICB9CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZEkxNjooU0ludDE2ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiB2OworICBpZiAoIVtzZWxmIHJlYWRWYXJpbnQzMjomdiBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAodmFsdWUpIHsKKyAgICAqdmFsdWUgPSAoU0ludDE2KVtzZWxmIHppZ1phZ1RvaTMyOnZdOworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkSTMyOihTSW50MzIgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIHY7CisgIGlmICghW3NlbGYgcmVhZFZhcmludDMyOiZ2IGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmICh2YWx1ZSkgeworICAgICp2YWx1ZSA9IFtzZWxmIHppZ1phZ1RvaTMyOnZdOworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkSTY0OihTSW50NjQgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDY0IHY7CisgIGlmICghW3NlbGYgcmVhZFZhcmludDY0OiZ2IGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmICh2YWx1ZSkgeworICAgICp2YWx1ZSA9IFtzZWxmIHppZ1phZ1RvaTY0OnZdOworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkRG91YmxlOihkb3VibGUgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDY0IGJpdHM7CisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDooVUludDggKikmYml0cyBvZmZzZXQ6MCBsZW5ndGg6OCBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpOworICB9CisKKyAgYml0cyA9IE9TU3dhcExpdHRsZVRvSG9zdEludDY0KGJpdHMpOworCisgIGlmICh2YWx1ZSkgeworICAgIG1lbWNweSh2YWx1ZSwgJmJpdHMsIHNpemVvZihiaXRzKSk7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRTdHJpbmc6KE5TU3RyaW5nICpfX2F1dG9yZWxlYXNpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIGxlbmd0aDsKKyAgaWYgKCFbc2VsZiByZWFkVmFyaW50MzI6Jmxlbmd0aCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBOU1N0cmluZyAqcmVzdWx0OworCisgIGlmIChsZW5ndGggIT0gMCkgeworCisgICAgTlNEYXRhICpkYXRhOworICAgIGlmICghW3NlbGYgcmVhZEJpbmFyeU9mTGVuZ3RoOmxlbmd0aCBkYXRhOiZkYXRhIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIHJlc3VsdCA9IFtbTlNTdHJpbmcgYWxsb2NdIGluaXRXaXRoRGF0YTpkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nOk5TVVRGOFN0cmluZ0VuY29kaW5nXTsKKyAgfQorICBlbHNlIHsKKyAgICByZXN1bHQgPSBAIiI7CisgIH0KKworICBpZiAodmFsdWUpIHsKKyAgICAqdmFsdWUgPSByZXN1bHQ7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRCaW5hcnk6KE5TRGF0YSAqX19hdXRvcmVsZWFzaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBsZW5ndGg7CisgIGlmICghW3NlbGYgcmVhZFZhcmludDMyOiZsZW5ndGggZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgcmV0dXJuIFtzZWxmIHJlYWRCaW5hcnlPZkxlbmd0aDpsZW5ndGggZGF0YTp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZEJpbmFyeU9mTGVuZ3RoOihVSW50MzIpbGVuZ3RoIGRhdGE6KE5TRGF0YSAqX19hdXRvcmVsZWFzaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIE5TRGF0YSAqcmVzdWx0OworCisgIGlmIChsZW5ndGggIT0gMCkgeworCisgICAgTlNNdXRhYmxlRGF0YSAqYnVmID0gW05TTXV0YWJsZURhdGEgZGF0YVdpdGhMZW5ndGg6bGVuZ3RoXTsKKyAgICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6YnVmLm11dGFibGVCeXRlcyBvZmZzZXQ6MCBsZW5ndGg6bGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgcmVhZCBmYWlsZWQiKTsKKyAgICB9CisKKyAgICByZXN1bHQgPSBidWY7CisgIH0KKyAgZWxzZSB7CisKKyAgICByZXN1bHQgPSBbTlNEYXRhIGRhdGFdOworCisgIH0KKworICBpZiAodmFsdWUpIHsKKyAgICAqdmFsdWUgPSByZXN1bHQ7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRNZXNzYWdlRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorLShCT09MKSByZWFkRmllbGRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CistKEJPT0wpIHJlYWRNYXBFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CistKEJPT0wpIHJlYWRMaXN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorLShCT09MKSByZWFkU2V0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRWYXJpbnQzMjooVUludDMyICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiByZXN1bHQgPSAwOworICBpbnQgc2hpZnQgPSAwOworCisgIHdoaWxlICh0cnVlKSB7CisKKyAgICBVSW50OCBieXRlOworICAgIGlmICghW3NlbGYgcmVhZEJ5dGU6JmJ5dGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgcmVzdWx0IHw9IChVSW50MzIpKGJ5dGUgJiAweDdmKSA8PCBzaGlmdDsKKyAgICBpZiAoIShieXRlICYgMHg4MCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIHNoaWZ0ICs9IDc7CisgIH0KKworICBpZiAodmFsdWUpIHsKKyAgICAqdmFsdWUgPSByZXN1bHQ7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRWYXJpbnQ2NDooVUludDY0ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGludCBzaGlmdCA9IDA7CisgIFVJbnQ2NCByZXN1bHQgPSAwOworCisgIHdoaWxlICh0cnVlKSB7CisKKyAgICBVSW50OCBieXRlOworICAgIGlmICghW3NlbGYgcmVhZEJ5dGU6JmJ5dGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgcmVzdWx0IHw9IChVSW50NjQpKGJ5dGUgJiAweDdmKSA8PCBzaGlmdDsKKyAgICBpZiAoIShieXRlICYgMHg4MCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIHNoaWZ0ICs9IDc7CisgIH0KKworICBpZiAodmFsdWUpIHsKKyAgICAqdmFsdWUgPSByZXN1bHQ7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKFNJbnQzMikgemlnWmFnVG9pMzI6KFVJbnQzMiluCit7CisgIHJldHVybiAoU0ludDMyKShuID4+IDEpIF4gKC0oU0ludDMyKShuICYgMSkpOworfQorCistKFNJbnQ2NCkgemlnWmFnVG9pNjQ6KFVJbnQ2NCluCit7CisgIHJldHVybiAoU0ludDY0KShuID4+IDEpIF4gKC0oU0ludDY0KShuICYgMSkpOworfQorCistKEJPT0wpIHR0eXBlOihVSW50OCAqKXR0eXBlIGZvckNvbXBhY3RUeXBlOihVSW50OCljdHlwZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgc3dpdGNoIChjdHlwZSAmIDB4MGYpIHsKKyAgY2FzZSBUQ1R5cGVfU1RPUDoKKyAgICAqdHR5cGUgPSBUVHlwZVNUT1A7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9CT09MRUFOX0ZBTFNFOgorICBjYXNlIFRDVHlwZV9CT09MRUFOX1RSVUU6CisgICAgKnR0eXBlID0gVFR5cGVCT09MOworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfQllURToKKyAgICAqdHR5cGUgPSBUVHlwZUJZVEU7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9JMTY6CisgICAgKnR0eXBlID0gVFR5cGVJMTY7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9JMzI6CisgICAgKnR0eXBlID0gVFR5cGVJMzI7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9JNjQ6CisgICAgKnR0eXBlID0gVFR5cGVJNjQ7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9ET1VCTEU6CisgICAgKnR0eXBlID0gVFR5cGVET1VCTEU7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9CSU5BUlk6CisgICAgKnR0eXBlID0gVFR5cGVTVFJJTkc7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9MSVNUOgorICAgICp0dHlwZSA9IFRUeXBlTElTVDsKKyAgICByZXR1cm4gWUVTOworCisgIGNhc2UgVENUeXBlX1NFVDoKKyAgICAqdHR5cGUgPSBUVHlwZVNFVDsKKyAgICByZXR1cm4gWUVTOworCisgIGNhc2UgVENUeXBlX01BUDoKKyAgICAqdHR5cGUgPSBUVHlwZU1BUDsKKyAgICByZXR1cm4gWUVTOworCisgIGNhc2UgVENUeXBlX1NUUlVDVDoKKyAgICAqdHR5cGUgPSBUVHlwZVNUUlVDVDsKKyAgICByZXR1cm4gWUVTOworCisgIGRlZmF1bHQ6CisgICAgaWYgKGVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFByb3RvY29sRXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUUHJvdG9jb2xFcnJvclVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe1RQcm90b2NvbEVycm9yVHlwZUtleTogQCgoVUludDgpKGN0eXBlICYgMHgwRikpfV07CisgICAgfQorICAgIHJldHVybiBOTzsKKyAgfQorfQorCistKFVJbnQ4KSBjb21wYWN0VHlwZUZvclRUeXBlOihVSW50OCl0dHlwZQoreworICBzdGF0aWMgVUludDggdHR5cGVUb0NvbXBhY3RUeXBlW10gPSB7CisgICAgW1RUeXBlU1RPUF0gPSBUQ1R5cGVfU1RPUCwKKyAgICBbVFR5cGVCT09MXSA9IFRDVHlwZV9CT09MRUFOX0ZBTFNFLAorICAgIFtUVHlwZUJZVEVdID0gVENUeXBlX0JZVEUsCisgICAgW1RUeXBlRE9VQkxFXSA9IFRDVHlwZV9ET1VCTEUsCisgICAgW1RUeXBlSTE2XSA9IFRDVHlwZV9JMTYsCisgICAgW1RUeXBlSTMyXSA9IFRDVHlwZV9JMzIsCisgICAgW1RUeXBlSTY0XSA9IFRDVHlwZV9JNjQsCisgICAgW1RUeXBlU1RSSU5HXSA9IFRDVHlwZV9CSU5BUlksCisgICAgW1RUeXBlU1RSVUNUXSA9IFRDVHlwZV9TVFJVQ1QsCisgICAgW1RUeXBlTUFQXSA9IFRDVHlwZV9NQVAsCisgICAgW1RUeXBlU0VUXSA9IFRDVHlwZV9TRVQsCisgICAgW1RUeXBlTElTVF0gPSBUQ1R5cGVfTElTVAorICB9OworCisgIHJldHVybiB0dHlwZVRvQ29tcGFjdFR5cGVbdHR5cGVdOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjZTM2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorCisjaW1wb3J0ICJUUHJvdG9jb2xEZWNvcmF0b3IuaCIKKworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCitleHRlcm4gTlNTdHJpbmcgKlRNdWx0aXBsZXhlZFByb3RvY29sU2VwZXJhdG9yOworCisKK0BpbnRlcmZhY2UgVE11bHRpcGxleGVkUHJvdG9jb2wgOiBUUHJvdG9jb2xEZWNvcmF0b3IKKworLShpZCkgaW5pdFdpdGhQcm90b2NvbDooaWQgPFRQcm90b2NvbD4pcHJvdG9jb2wKKyAgICAgICAgICAgc2VydmljZU5hbWU6KE5TU3RyaW5nICopbmFtZTsKKworQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wubSBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODM4YzU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5tCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVE11bHRpcGxleGVkUHJvdG9jb2wuaCIKKworI2ltcG9ydCAiVFByb3RvY29sLmgiCisKK05TU3RyaW5nICpUTXVsdGlwbGV4ZWRQcm90b2NvbFNlcGVyYXRvciA9IEAiOiI7CisKKworQGludGVyZmFjZSBUTXVsdGlwbGV4ZWRQcm90b2NvbCAoKQorCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TU3RyaW5nICpzZXJ2aWNlTmFtZTsKKworQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBUTXVsdGlwbGV4ZWRQcm90b2NvbAorCistKGlkKSBpbml0V2l0aFByb3RvY29sOihpZCA8VFByb3RvY29sPilwcm90b2NvbAorICAgICAgICAgICBzZXJ2aWNlTmFtZTooTlNTdHJpbmcgKiluYW1lCit7CisgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhQcm90b2NvbDpwcm90b2NvbF07CisgIGlmIChzZWxmKSB7CisgICAgX3NlcnZpY2VOYW1lID0gbmFtZTsKKyAgfQorICByZXR1cm4gc2VsZjsKK30KKworLShCT09MKSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyKW1lc3NhZ2VUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6KFNJbnQzMilzZXF1ZW5jZUlECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHN3aXRjaCAobWVzc2FnZVR5cGUpIHsKKyAgY2FzZSBUTWVzc2FnZVR5cGVDQUxMOgorICBjYXNlIFRNZXNzYWdlVHlwZU9ORVdBWTogeworICAgIE5TTXV0YWJsZVN0cmluZyAqc2VydmljZUZ1bmN0aW9uID0gW1tOU011dGFibGVTdHJpbmcgYWxsb2NdIGluaXRXaXRoU3RyaW5nOl9zZXJ2aWNlTmFtZV07CisgICAgW3NlcnZpY2VGdW5jdGlvbiBhcHBlbmRTdHJpbmc6VE11bHRpcGxleGVkUHJvdG9jb2xTZXBlcmF0b3JdOworICAgIFtzZXJ2aWNlRnVuY3Rpb24gYXBwZW5kU3RyaW5nOm5hbWVdOworICAgIHJldHVybiBbc3VwZXIgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTpzZXJ2aWNlRnVuY3Rpb24gdHlwZTptZXNzYWdlVHlwZSBzZXF1ZW5jZUlEOnNlcXVlbmNlSUQgZXJyb3I6ZXJyb3JdOworICB9CisgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIFtzdXBlciB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOm5hbWUgdHlwZTptZXNzYWdlVHlwZSBzZXF1ZW5jZUlEOnNlcXVlbmNlSUQgZXJyb3I6ZXJyb3JdOworICB9Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbC5oCmluZGV4IDI4MTIzOWQuLjg0MTA1OWYgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLmgKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2wuaApAQCAtMjIsMTI3ICsyMiwxNDMgQEAKICNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKIAogCi1lbnVtIHsKLSAgVE1lc3NhZ2VUeXBlX0NBTEwgPSAxLAotICBUTWVzc2FnZVR5cGVfUkVQTFkgPSAyLAotICBUTWVzc2FnZVR5cGVfRVhDRVBUSU9OID0gMywKLSAgVE1lc3NhZ2VUeXBlX09ORVdBWSA9IDQKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKwordHlwZWRlZiBOU19FTlVNIChpbnQsIFRNZXNzYWdlVHlwZSkgeworICBUTWVzc2FnZVR5cGVDQUxMID0gMSwKKyAgVE1lc3NhZ2VUeXBlUkVQTFkgPSAyLAorICBUTWVzc2FnZVR5cGVFWENFUFRJT04gPSAzLAorICBUTWVzc2FnZVR5cGVPTkVXQVkgPSA0CiB9OwogCi1lbnVtIHsKLSAgVFR5cGVfU1RPUCAgID0gMCwKLSAgVFR5cGVfVk9JRCAgID0gMSwKLSAgVFR5cGVfQk9PTCAgID0gMiwKLSAgVFR5cGVfQllURSAgID0gMywKLSAgVFR5cGVfRE9VQkxFID0gNCwKLSAgVFR5cGVfSTE2ICAgID0gNiwKLSAgVFR5cGVfSTMyICAgID0gOCwKLSAgVFR5cGVfSTY0ICAgID0gMTAsCi0gIFRUeXBlX1NUUklORyA9IDExLAotICBUVHlwZV9TVFJVQ1QgPSAxMiwKLSAgVFR5cGVfTUFQICAgID0gMTMsCi0gIFRUeXBlX1NFVCAgICA9IDE0LAotICBUVHlwZV9MSVNUICAgPSAxNQordHlwZWRlZiBOU19FTlVNIChpbnQsIFRUeXBlKSB7CisgIFRUeXBlU1RPUCAgID0gMCwKKyAgVFR5cGVWT0lEICAgPSAxLAorICBUVHlwZUJPT0wgICA9IDIsCisgIFRUeXBlQllURSAgID0gMywKKyAgVFR5cGVET1VCTEUgPSA0LAorICBUVHlwZUkxNiAgICA9IDYsCisgIFRUeXBlSTMyICAgID0gOCwKKyAgVFR5cGVJNjQgICAgPSAxMCwKKyAgVFR5cGVTVFJJTkcgPSAxMSwKKyAgVFR5cGVTVFJVQ1QgPSAxMiwKKyAgVFR5cGVNQVAgICAgPSAxMywKKyAgVFR5cGVTRVQgICAgPSAxNCwKKyAgVFR5cGVMSVNUICAgPSAxNQogfTsKIAogCiBAcHJvdG9jb2wgVFByb3RvY29sIDxOU09iamVjdD4KIAotLSAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQ7CistKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0OwogCi0tICh2b2lkKSByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTogKE5TU3RyaW5nICoqKSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCAqKSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogKGludCAqKSBzZXF1ZW5jZUlEOwotLSAodm9pZCkgcmVhZE1lc3NhZ2VFbmQ7CistKEJPT0wpIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqX19udWxsYWJsZSBfX2F1dG9yZWxlYXNpbmcgKl9fbnVsbGFibGUpbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZToobnVsbGFibGUgU0ludDMyICopdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDoobnVsbGFibGUgU0ludDMyICopc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CistKEJPT0wpIHJlYWRNZXNzYWdlRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTogKE5TU3RyaW5nICoqKSBuYW1lOwotLSAodm9pZCkgcmVhZFN0cnVjdEVuZDsKKy0oQk9PTCkgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKl9fbnVsbGFibGUgX19hdXRvcmVsZWFzaW5nICpfX251bGxhYmxlKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CistKEJPT0wpIHJlYWRTdHJ1Y3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50ICopIGZpZWxkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiAoaW50ICopIGZpZWxkSUQ7Ci0tICh2b2lkKSByZWFkRmllbGRFbmQ7CistKEJPT0wpIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKl9fbnVsbGFibGUgX19hdXRvcmVsZWFzaW5nICpfX251bGxhYmxlKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIgKilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOihudWxsYWJsZSBTSW50MzIgKilmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CistKEJPT0wpIHJlYWRGaWVsZEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKE5TU3RyaW5nICopIHJlYWRTdHJpbmc7CistKEJPT0wpIHJlYWRTdHJpbmc6KE5TU3RyaW5nICpfX25vbm51bGwgX19hdXRvcmVsZWFzaW5nICpfX25vbm51bGwpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3I7CiAKLS0gKEJPT0wpIHJlYWRCb29sOworLShCT09MKSByZWFkQm9vbDooQk9PTCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodW5zaWduZWQgY2hhcikgcmVhZEJ5dGU7CistKEJPT0wpIHJlYWRCeXRlOihVSW50OCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAoc2hvcnQpIHJlYWRJMTY7CistKEJPT0wpIHJlYWRJMTY6KFNJbnQxNiAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAoaW50MzJfdCkgcmVhZEkzMjsKKy0oQk9PTCkgcmVhZEkzMjooU0ludDMyICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tIChpbnQ2NF90KSByZWFkSTY0OworLShCT09MKSByZWFkSTY0OihTSW50NjQgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKGRvdWJsZSkgcmVhZERvdWJsZTsKKy0oQk9PTCkgcmVhZERvdWJsZTooZG91YmxlICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tIChOU0RhdGEgKikgcmVhZEJpbmFyeTsKKy0oQk9PTCkgcmVhZEJpbmFyeTooTlNEYXRhICpfX25vbm51bGwgX19hdXRvcmVsZWFzaW5nICpfX25vbm51bGwpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3I7CiAKLS0gKHZvaWQpIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6IChpbnQgKikga2V5VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogKGludCAqKSB2YWx1ZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQgKikgc2l6ZTsKLS0gKHZvaWQpIHJlYWRNYXBFbmQ7CistKEJPT0wpIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6KG51bGxhYmxlIFNJbnQzMiAqKWtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZToobnVsbGFibGUgU0ludDMyICopdmFsdWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CistKEJPT0wpIHJlYWRNYXBFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCiAKLS0gKHZvaWQpIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiAoaW50ICopIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCAqKSBzaXplOwotLSAodm9pZCkgcmVhZFNldEVuZDsKKy0oQk9PTCkgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6KG51bGxhYmxlIFNJbnQzMiAqKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIgKilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKKy0oQk9PTCkgcmVhZFNldEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKIAotLSAodm9pZCkgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiAoaW50ICopIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQgKikgc2l6ZTsKLS0gKHZvaWQpIHJlYWRMaXN0RW5kOworLShCT09MKSByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6KG51bGxhYmxlIFNJbnQzMiAqKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSByZWFkTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKIAotLSAodm9pZCkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQpIG1lc3NhZ2VUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiAoaW50KSBzZXF1ZW5jZUlEOwotLSAodm9pZCkgd3JpdGVNZXNzYWdlRW5kOworLShCT09MKSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyKW1lc3NhZ2VUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6KFNJbnQzMilzZXF1ZW5jZUlECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSB3cml0ZU1lc3NhZ2VFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lOwotLSAodm9pZCkgd3JpdGVTdHJ1Y3RFbmQ7CistKEJPT0wpIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lIGVycm9yOihOU0Vycm9yICoqKWVycm9yOworLShCT09MKSB3cml0ZVN0cnVjdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQpIGZpZWxkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IChpbnQpIGZpZWxkSUQ7CistKEJPT0wpIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6KFNJbnQzMilmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVJMzI6IChpbnQzMl90KSB2YWx1ZTsKKy0oQk9PTCkgd3JpdGVJMzI6KFNJbnQzMil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlSTY0OiAoaW50NjRfdCkgdmFsdWU7CistKEJPT0wpIHdyaXRlSTY0OihTSW50NjQpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUkxNjogKHNob3J0KSB2YWx1ZTsKKy0oQk9PTCkgd3JpdGVJMTY6KHNob3J0KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVCeXRlOiAodWludDhfdCkgdmFsdWU7CistKEJPT0wpIHdyaXRlQnl0ZTooVUludDgpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZVN0cmluZzogKE5TU3RyaW5nICopIHZhbHVlOworLShCT09MKSB3cml0ZVN0cmluZzooTlNTdHJpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlRG91YmxlOiAoZG91YmxlKSB2YWx1ZTsKKy0oQk9PTCkgd3JpdGVEb3VibGU6KGRvdWJsZSl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlQm9vbDogKEJPT0wpIHZhbHVlOworLShCT09MKSB3cml0ZUJvb2w6KEJPT0wpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUJpbmFyeTogKE5TRGF0YSAqKSBkYXRhOworLShCT09MKSB3cml0ZUJpbmFyeTooTlNEYXRhICopZGF0YSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlRmllbGRTdG9wOworLShCT09MKSB3cml0ZUZpZWxkU3RvcDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlRmllbGRFbmQ7CistKEJPT0wpIHdyaXRlRmllbGRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6IChpbnQpIGtleVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogKGludCkgdmFsdWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemU7Ci0tICh2b2lkKSB3cml0ZU1hcEVuZDsKKy0oQk9PTCkgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOihTSW50MzIpa2V5VHlwZQorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6KFNJbnQzMil2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSB3cml0ZU1hcEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKIAotLSAodm9pZCkgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTogKGludCkgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemU7Ci0tICh2b2lkKSB3cml0ZVNldEVuZDsKKy0oQk9PTCkgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSB3cml0ZVNldEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKIAotLSAodm9pZCkgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6IChpbnQpIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZTsKKy0oQk9PTCkgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6KFNJbnQzMillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUxpc3RFbmQ7CistKEJPT0wpIHdyaXRlTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKIAogQGVuZAogCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY5YjZhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKworI2ltcG9ydCAiVFByb3RvY29sLmgiCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKworQGludGVyZmFjZSBUUHJvdG9jb2xEZWNvcmF0b3IgOiBOU09iamVjdCA8VFByb3RvY29sPgorCistKGlkKSBpbml0V2l0aFByb3RvY29sOihpZCA8VFByb3RvY29sPilwcm90b2NvbDsKKworQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLm0gYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOGY5MDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5tCkBAIC0wLDAgKzEsMjk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRQcm90b2NvbERlY29yYXRvci5oIgorCisKK0BpbnRlcmZhY2UgVFByb3RvY29sRGVjb3JhdG9yICgpCisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgaWQ8VFByb3RvY29sPiBjb25jcmV0ZVByb3RvY29sOworCitAZW5kCisKKworQGltcGxlbWVudGF0aW9uIFRQcm90b2NvbERlY29yYXRvcgorCistKGlkKSBpbml0V2l0aFByb3RvY29sOihpZCA8VFByb3RvY29sPilwcm90b2NvbAoreworICBzZWxmID0gW3N1cGVyIGluaXRdOworICBpZiAoc2VsZikgeworICAgIF9jb25jcmV0ZVByb3RvY29sID0gcHJvdG9jb2w7CisgIH0KKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0oaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB0cmFuc3BvcnRdOworfQorCistKEJPT0wpIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIgKil0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOihTSW50MzIgKilzZXF1ZW5jZUlECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTp0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6c2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSByZWFkTWVzc2FnZUVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkTWVzc2FnZUVuZDplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKiopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6bmFtZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZFN0cnVjdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkU3RydWN0RW5kOmVycm9yXTsKK30KKworLShCT09MKSByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICoqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIgKilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOihTSW50MzIgKilmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6bmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTpmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6ZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcl07Cit9CistKEJPT0wpIHJlYWRGaWVsZEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkRmllbGRFbmQ6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRTdHJpbmc6KE5TU3RyaW5nICpfX2F1dG9yZWxlYXNpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkU3RyaW5nOnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSByZWFkQm9vbDooQk9PTCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRCb29sOnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSByZWFkQnl0ZTooVUludDggKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkQnl0ZTp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZEkxNjooU0ludDE2ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZEkxNjp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZEkzMjooU0ludDMyICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZEkzMjp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZEk2NDooU0ludDY0ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZEk2NDp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZERvdWJsZTooZG91YmxlICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZERvdWJsZTp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZEJpbmFyeTooTlNEYXRhICpfX2F1dG9yZWxlYXNpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkQmluYXJ5OnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOihTSW50MzIgKilrZXlUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6KFNJbnQzMiAqKXZhbHVlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIgKilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZTprZXlUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTp2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOnNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKK30KKy0oQk9PTCkgcmVhZE1hcEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkTWFwRW5kOmVycm9yXTsKK30KKworCistKEJPT0wpIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOihTSW50MzIgKillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTplbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOnNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcl07Cit9CistKEJPT0wpIHJlYWRTZXRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZFNldEVuZDplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOihTSW50MzIgKillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTplbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTpzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKK30KKy0oQk9PTCkgcmVhZExpc3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZExpc3RFbmQ6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIpbWVzc2FnZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDooU0ludDMyKXNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOm1lc3NhZ2VUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDpzZXF1ZW5jZUlECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcl07Cit9CistKEJPT0wpIHdyaXRlTWVzc2FnZUVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZU1lc3NhZ2VFbmQ6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTpuYW1lIGVycm9yOmVycm9yXTsKK30KKy0oQk9PTCkgd3JpdGVTdHJ1Y3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVTdHJ1Y3RFbmQ6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6KFNJbnQzMilmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTpmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDpmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlSTMyOihTSW50MzIpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVJMzI6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlSTY0OihTSW50NjQpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVJNjQ6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlSTE2OihTSW50MTYpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVJMTY6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlQnl0ZTooVUludDgpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVCeXRlOnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZVN0cmluZzooTlNTdHJpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZVN0cmluZzp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVEb3VibGU6KGRvdWJsZSl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZURvdWJsZTp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVCb29sOihCT09MKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlQm9vbDp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVCaW5hcnk6KE5TRGF0YSAqKWRhdGEgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVCaW5hcnk6ZGF0YSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVGaWVsZFN0b3A6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVGaWVsZFN0b3A6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlRmllbGRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVGaWVsZEVuZDplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOihTSW50MzIpa2V5VHlwZQorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6KFNJbnQzMil2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOmtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6dmFsdWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOnNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlTWFwRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlTWFwRW5kOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOihTSW50MzIpZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOmVsZW1lbnRUeXBlIHNpemU6c2l6ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVTZXRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVTZXRFbmQ6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOihTSW50MzIpZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOmVsZW1lbnRUeXBlIHNpemU6c2l6ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVMaXN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlTGlzdEVuZDplcnJvcl07Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXJyb3IuaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjBiYzQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFcnJvci5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVEVycm9yLmgiCisKKworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvckRvbWFpbjsKKwordHlwZWRlZiBOU19FTlVNIChpbnQsIFRQcm90b2NvbEVycm9yKSB7CisgIFRQcm90b2NvbEVycm9yVW5rbm93biAgICAgICAgICAgICAgICAgICA9IDAsCisgIFRQcm90b2NvbEVycm9ySW52YWxpZERhdGEgICAgICAgICAgICAgICA9IDEsCisgIFRQcm90b2NvbEVycm9yTmVnYXRpdmVTaXplICAgICAgICAgICAgICA9IDIsCisgIFRQcm90b2NvbEVycm9yU2l6ZUxpbWl0ICAgICAgICAgICAgICAgICA9IDMsCisgIFRQcm90b2NvbEVycm9yQmFkVmVyc2lvbiAgICAgICAgICAgICAgICA9IDQsCisgIFRQcm90b2NvbEVycm9yTm90SW1wbGVtZW50ZWQgICAgICAgICAgICA9IDUsCisgIFRQcm90b2NvbEVycm9yRGVwdGhMaW1pdCAgICAgICAgICAgICAgICA9IDYsCit9OworCisKK3R5cGVkZWYgTlNfRU5VTShpbnQsIFRQcm90b2NvbEV4dGVuZGVkRXJyb3IpIHsKKyAgVFByb3RvY29sRXh0ZW5kZWRFcnJvck1pc3NpbmdSZXF1aXJlZEZpZWxkICA9IDEwMDEsCisgIFRQcm90b2NvbEV4dGVuZGVkRXJyb3JVbmV4cGVjdGVkVHlwZSAgICAgICAgPSAxMDAyLAorICBUUHJvdG9jb2xFeHRlbmRlZEVycm9yTWlzbWF0Y2hlZFByb3RvY29sICAgID0gMTAwMywKK307CisKK2V4dGVybiBOU1N0cmluZyAqVFByb3RvY29sRXJyb3JFeHRlbmRlZEVycm9yS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvckZpZWxkTmFtZUtleTsKK2V4dGVybiBOU1N0cmluZyAqVFByb3RvY29sRXJyb3JFeHBlY3RlZElkS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvckV4cGVjdGVkVmVyc2lvbktleTsKK2V4dGVybiBOU1N0cmluZyAqVFByb3RvY29sRXJyb3JUeXBlS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvclNvdXJjZUxpbmVLZXk7CitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yU291cmNlRmlsZUtleTsKK2V4dGVybiBOU1N0cmluZyAqVFByb3RvY29sRXJyb3JTb3VyY2VNZXRob2RLZXk7CitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yTWVzc2FnZU5hbWVLZXk7CisKKworI2RlZmluZSBQUk9UT0NPTF9FUlJPUihyZXQsIGVyciwgLi4uKSBcCisgIGlmIChlcnJvcikgeyAgXAorICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUUHJvdG9jb2xFcnJvckRvbWFpbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRQcm90b2NvbEVycm9yICMjIGVyciBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7TlNMb2NhbGl6ZWREZXNjcmlwdGlvbktleTogW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6X19WQV9BUkdTX19dLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJTb3VyY2VGaWxlIjogW05TU3RyaW5nIHN0cmluZ1dpdGhVVEY4U3RyaW5nOl9fRklMRV9fXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAiU291cmNlTGluZSI6IEAoX19MSU5FX18pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJTb3VyY2VGdW5jdGlvbiI6IFtOU1N0cmluZyBzdHJpbmdXaXRoVVRGOFN0cmluZzpfX1BSRVRUWV9GVU5DVElPTl9fXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAiTWVzc2FnZSI6IHNlbGYuY3VycmVudE1lc3NhZ2VOYW1lID8gc2VsZi5jdXJyZW50TWVzc2FnZU5hbWUgOiBAIiJ9XTsgXAorICB9IFwKKyAgcmV0dXJuIHJldAorCisjZGVmaW5lIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihyZXQsIGVycm9yUHRyLCAuLi4pIFwKKyAgaWYgKGVycm9yUHRyKSB7IFwKKyAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFByb3RvY29sRXJyb3JEb21haW4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUUHJvdG9jb2xFcnJvclVua25vd24gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe05TTG9jYWxpemVkRGVzY3JpcHRpb25LZXk6IFtbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpfX1ZBX0FSR1NfX10gc3RyaW5nQnlBcHBlbmRpbmdGb3JtYXQ6QCI6ICVAIiwgWygqZXJyb3JQdHIpIGxvY2FsaXplZERlc2NyaXB0aW9uXV0sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFcnJvclNvdXJjZUZpbGVLZXk6IFtOU1N0cmluZyBzdHJpbmdXaXRoVVRGOFN0cmluZzpfX0ZJTEVfX10sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFcnJvclNvdXJjZUxpbmVLZXk6IEAoX19MSU5FX18pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXJyb3JTb3VyY2VNZXRob2RLZXk6IFtOU1N0cmluZyBzdHJpbmdXaXRoVVRGOFN0cmluZzpfX1BSRVRUWV9GVU5DVElPTl9fXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yTWVzc2FnZU5hbWVLZXk6IHNlbGYuY3VycmVudE1lc3NhZ2VOYW1lID8gc2VsZi5jdXJyZW50TWVzc2FnZU5hbWUgOiBAIiIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU1VuZGVybHlpbmdFcnJvcktleTogKmVycm9yUHRyfV07IFwKKyAgfSBcCisgIHJldHVybiByZXQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXJyb3IubSBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXJyb3IubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTM2NzNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFcnJvci5tCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVFByb3RvY29sRXJyb3IuaCIKKworCitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JEb21haW4gPSBAIlRQcm90b2NvbEVycm9yRG9tYWluIjsKKworTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRXh0ZW5kZWRFcnJvcktleSA9IEAiZXh0ZW5kZWRFcnJvciI7CitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JGaWVsZE5hbWVLZXkgPSBAImZpZWxkIjsKK05TU3RyaW5nICpUUHJvdG9jb2xFcnJvckV4cGVjdGVkSWRLZXkgPSBAImV4cGVjdGVkSWQiOworTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRXhwZWN0ZWRWZXJzaW9uS2V5ID0gQCJleHBlY3RlZFZlcnNpb24iOworTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yVHlwZUtleSA9IEAidHlwZSI7CitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JTb3VyY2VMaW5lS2V5ID0gQCJzb3VyY2VMaW5lIjsKK05TU3RyaW5nICpUUHJvdG9jb2xFcnJvclNvdXJjZUZpbGVLZXkgPSBAInNvdXJjZUZpbGUiOworTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yU291cmNlTWV0aG9kS2V5ID0gQCJzb3VyY2VNZXRob2QiOworTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yTWVzc2FnZU5hbWVLZXkgPSBAIm1lc3NhZ2VOYW1lIjsKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDM1NGZjLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRFeGNlcHRpb24uaCIKLQotQGludGVyZmFjZSBUUHJvdG9jb2xFeGNlcHRpb24gOiBURXhjZXB0aW9uIHsKLX0KLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24ubSBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MTQ4N2EuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24ubQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVFByb3RvY29sRXhjZXB0aW9uLmgiCi0KLUBpbXBsZW1lbnRhdGlvbiBUUHJvdG9jb2xFeGNlcHRpb24KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmgKaW5kZXggZjIwMGE2ZC4uYTAyMmE3ZiAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmgKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmgKQEAgLTIxLDkgKzIxLDE2IEBACiAjaW1wb3J0ICJUUHJvdG9jb2wuaCIKICNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKIAorTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKwogCiBAcHJvdG9jb2wgVFByb3RvY29sRmFjdG9yeSA8TlNPYmplY3Q+CiAKLS0gKGlkIDxUUHJvdG9jb2w+KSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQ7CitAcHJvcGVydHkgKHJlYWRvbmx5LCBub25hdG9taWMpIE5TU3RyaW5nICpwcm90b2NvbE5hbWU7CisKKy0oaWQ8VFByb3RvY29sPikgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDooaWQ8VFRyYW5zcG9ydD4pdHJhbnNwb3J0OwogCiBAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbFV0aWwuaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5oCmluZGV4IGMyZDI1MjEuLjgyNTEwY2YgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5oCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5oCkBAIC0yMCwxMCArMjAsMTQgQEAKICNpbXBvcnQgIlRQcm90b2NvbC5oIgogI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgogCi1AaW50ZXJmYWNlIFRQcm90b2NvbFV0aWwgOiBOU09iamVjdCB7CitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgogCi19CiAKLSsgKHZvaWQpIHNraXBUeXBlOiAoaW50KSB0eXBlIG9uUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2w7CitAaW50ZXJmYWNlIFRQcm90b2NvbFV0aWwgOiBOU09iamVjdAorCisrKEJPT0wpIHNraXBUeXBlOihpbnQpdHlwZSBvblByb3RvY29sOihpZCA8VFByb3RvY29sPilwcm90b2NvbCBlcnJvcjooTlNFcnJvciAqKillcnJvcjsKIAogQGVuZDsKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbFV0aWwubSBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5tCmluZGV4IDEzZDcwOTUuLmMwZDY1YWMgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5tCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5tCkBAIC0yMSw4NCArMjEsMTUxIEBACiAKIEBpbXBsZW1lbnRhdGlvbiBUUHJvdG9jb2xVdGlsCiAKLSsgKHZvaWQpIHNraXBUeXBlOiAoaW50KSB0eXBlIG9uUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2wKKysoQk9PTCkgc2tpcFR5cGU6KGludCl0eXBlIG9uUHJvdG9jb2w6KGlkIDxUUHJvdG9jb2w+KXByb3RvY29sIGVycm9yOihOU0Vycm9yICoqKWVycm9yCiB7CiAgIHN3aXRjaCAodHlwZSkgewotICBjYXNlIFRUeXBlX0JPT0w6Ci0gICAgW3Byb3RvY29sIHJlYWRCb29sXTsKLSAgICBicmVhazsKLSAgY2FzZSBUVHlwZV9CWVRFOgotICAgIFtwcm90b2NvbCByZWFkQnl0ZV07Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFR5cGVfSTE2OgotICAgIFtwcm90b2NvbCByZWFkSTE2XTsKLSAgICBicmVhazsKLSAgY2FzZSBUVHlwZV9JMzI6Ci0gICAgW3Byb3RvY29sIHJlYWRJMzJdOwotICAgIGJyZWFrOwotICBjYXNlIFRUeXBlX0k2NDoKLSAgICBbcHJvdG9jb2wgcmVhZEk2NF07Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFR5cGVfRE9VQkxFOgotICAgIFtwcm90b2NvbCByZWFkRG91YmxlXTsKLSAgICBicmVhazsKLSAgY2FzZSBUVHlwZV9TVFJJTkc6Ci0gICAgW3Byb3RvY29sIHJlYWRTdHJpbmddOwotICAgIGJyZWFrOwotICBjYXNlIFRUeXBlX1NUUlVDVDoKLSAgICBbcHJvdG9jb2wgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTogTlVMTF07CisgIGNhc2UgVFR5cGVCT09MOiB7CisgICAgQk9PTCB2YWw7CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZEJvb2w6JnZhbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBUVHlwZUJZVEU6IHsKKyAgICBVSW50OCB2YWw7CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZEJ5dGU6JnZhbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBUVHlwZUkxNjogeworICAgIFNJbnQxNiB2YWw7CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZEkxNjomdmFsIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlSTMyOiB7CisgICAgU0ludDMyIHZhbDsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkSTMyOiZ2YWwgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGJyZWFrOworCisgIGNhc2UgVFR5cGVJNjQ6IHsKKyAgICBTSW50NjQgdmFsOworICAgIGlmICghW3Byb3RvY29sIHJlYWRJNjQ6JnZhbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBUVHlwZURPVUJMRTogeworICAgIGRvdWJsZSB2YWw7CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZERvdWJsZTomdmFsIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlU1RSSU5HOiB7CisgICAgTlNTdHJpbmcgKnZhbDsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkU3RyaW5nOiZ2YWwgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGJyZWFrOworCisgIGNhc2UgVFR5cGVTVFJVQ1Q6IHsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOk5VTEwgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQogICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBpbnQgZmllbGRUeXBlOwotICAgICAgW3Byb3RvY29sIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTogbmlsIHR5cGU6ICZmaWVsZFR5cGUgZmllbGRJRDogbmlsXTsKLSAgICAgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVfU1RPUCkgeworICAgICAgU0ludDMyIGZpZWxkVHlwZTsKKyAgICAgIGlmICghW3Byb3RvY29sIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTpuaWwgdHlwZTomZmllbGRUeXBlIGZpZWxkSUQ6bmlsIGVycm9yOmVycm9yXSkgeworICAgICAgICByZXR1cm4gTk87CisgICAgICB9CisgICAgICBpZiAoZmllbGRUeXBlID09IFRUeXBlU1RPUCkgewogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBmaWVsZFR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOwotICAgICAgW3Byb3RvY29sIHJlYWRGaWVsZEVuZF07CisgICAgICBpZiAoIVtzZWxmIHNraXBUeXBlOmZpZWxkVHlwZSBvblByb3RvY29sOnByb3RvY29sIGVycm9yOmVycm9yXSkgeworICAgICAgICByZXR1cm4gTk87CisgICAgICB9CisgICAgICBpZiAoIVtwcm90b2NvbCByZWFkRmllbGRFbmQ6ZXJyb3JdKSB7CisgICAgICAgIHJldHVybiBOTzsKKyAgICAgIH0KICAgICB9Ci0gICAgW3Byb3RvY29sIHJlYWRTdHJ1Y3RFbmRdOwotICAgIGJyZWFrOwotICBjYXNlIFRUeXBlX01BUDoKLSAgewotICAgIGludCBrZXlUeXBlOwotICAgIGludCB2YWx1ZVR5cGU7Ci0gICAgaW50IHNpemU7Ci0gICAgW3Byb3RvY29sIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6ICZrZXlUeXBlIHZhbHVlVHlwZTogJnZhbHVlVHlwZSBzaXplOiAmc2l6ZV07CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZFN0cnVjdEVuZDplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBUVHlwZU1BUDogeworICAgIFNJbnQzMiBrZXlUeXBlOworICAgIFNJbnQzMiB2YWx1ZVR5cGU7CisgICAgU0ludDMyIHNpemU7CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZToma2V5VHlwZSB2YWx1ZVR5cGU6JnZhbHVlVHlwZSBzaXplOiZzaXplIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KICAgICBpbnQgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZToga2V5VHlwZSBvblByb3RvY29sOiBwcm90b2NvbF07Ci0gICAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogdmFsdWVUeXBlIG9uUHJvdG9jb2w6IHByb3RvY29sXTsKLSAgICB9Ci0gICAgW3Byb3RvY29sIHJlYWRNYXBFbmRdOwotICB9Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBUVHlwZV9TRVQ6Ci0gICAgewotICAgICAgaW50IGVsZW1UeXBlOwotICAgICAgaW50IHNpemU7Ci0gICAgICBbcHJvdG9jb2wgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6ICZlbGVtVHlwZSBzaXplOiAmc2l6ZV07Ci0gICAgICBpbnQgaTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGVsZW1UeXBlIG9uUHJvdG9jb2w6IHByb3RvY29sXTsKKyAgICAgIGlmICghW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6a2V5VHlwZSBvblByb3RvY29sOnByb3RvY29sIGVycm9yOmVycm9yXSkgeworICAgICAgICByZXR1cm4gTk87CiAgICAgICB9Ci0gICAgICBbcHJvdG9jb2wgcmVhZFNldEVuZF07Ci0gICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUVHlwZV9MSVNUOgotICAgIHsKLSAgICAgIGludCBlbGVtVHlwZTsKLSAgICAgIGludCBzaXplOwotICAgICAgW3Byb3RvY29sIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogJmVsZW1UeXBlIHNpemU6ICZzaXplXTsKLSAgICAgIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZWxlbVR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOworICAgICAgaWYgKCFbVFByb3RvY29sVXRpbCBza2lwVHlwZTp2YWx1ZVR5cGUgb25Qcm90b2NvbDpwcm90b2NvbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgICAgcmV0dXJuIE5POwogICAgICAgfQotICAgICAgW3Byb3RvY29sIHJlYWRMaXN0RW5kXTsKICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuOworICAgIGlmICghW3Byb3RvY29sIHJlYWRNYXBFbmQ6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQogICB9CisgIGJyZWFrOworCisgIGNhc2UgVFR5cGVTRVQ6IHsKKyAgICBTSW50MzIgZWxlbVR5cGU7CisgICAgU0ludDMyIHNpemU7CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6JmVsZW1UeXBlIHNpemU6JnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgIGlmICghW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6ZWxlbVR5cGUgb25Qcm90b2NvbDpwcm90b2NvbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgICAgcmV0dXJuIE5POworICAgICAgfQorICAgIH0KKyAgICBpZiAoIVtwcm90b2NvbCByZWFkU2V0RW5kOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlTElTVDogeworICAgIFNJbnQzMiBlbGVtVHlwZTsKKyAgICBTSW50MzIgc2l6ZTsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6JmVsZW1UeXBlIHNpemU6JnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgIGlmICghW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6ZWxlbVR5cGUgb25Qcm90b2NvbDpwcm90b2NvbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgICAgcmV0dXJuIE5POworICAgICAgfQorICAgIH0KKyAgICBpZiAoIVtwcm90b2NvbCByZWFkTGlzdEVuZDplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisKKyAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKIEBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIuaCBiL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIuaAppbmRleCBjOGZmOWYwLi45NWIwZDNjIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3NlcnZlci9UU29ja2V0U2VydmVyLmgKKysrIGIvbGliL2NvY29hL3NyYy9zZXJ2ZXIvVFNvY2tldFNlcnZlci5oCkBAIC0yNywyMyArMjcsMjUgQEAKICNpbXBvcnQgPENGTmV0d29yay9DRk5ldHdvcmsuaD4KICNlbmRpZgogCi1leHRlcm4gTlNTdHJpbmcgKiBjb25zdCBrVFNvY2tldFNlcnZlcl9DbGllbnRDb25uZWN0aW9uRmluaXNoZWRGb3JQcm9jZXNzb3JOb3RpZmljYXRpb247Ci1leHRlcm4gTlNTdHJpbmcgKiBjb25zdCBrVFNvY2tldFNlcnZlcl9Qcm9jZXNzb3JLZXk7Ci1leHRlcm4gTlNTdHJpbmcgKiBjb25zdCBrVFNvY2tlclNlcnZlcl9UcmFuc3BvcnRLZXk7CitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgogCiAKLUBpbnRlcmZhY2UgVFNvY2tldFNlcnZlciA6IE5TT2JqZWN0IHsKLSAgTlNGaWxlSGFuZGxlICogbVNvY2tldEZpbGVIYW5kbGU7Ci0gIGlkIDxUUHJvdG9jb2xGYWN0b3J5PiBtSW5wdXRQcm90b2NvbEZhY3Rvcnk7Ci0gIGlkIDxUUHJvdG9jb2xGYWN0b3J5PiBtT3V0cHV0UHJvdG9jb2xGYWN0b3J5OwotICBpZCA8VFByb2Nlc3NvckZhY3Rvcnk+IG1Qcm9jZXNzb3JGYWN0b3J5OwotfQorZXh0ZXJuIE5TU3RyaW5nICpjb25zdCBUU29ja2V0U2VydmVyQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkOworZXh0ZXJuIE5TU3RyaW5nICpjb25zdCBUU29ja2V0U2VydmVyUHJvY2Vzc29yS2V5OworZXh0ZXJuIE5TU3RyaW5nICpjb25zdCBUU29ja2VyU2VydmVyVHJhbnNwb3J0S2V5OwogCi0tIChpZCkgaW5pdFdpdGhQb3J0OiAoaW50KSBwb3J0Ci0gICAgcHJvdG9jb2xGYWN0b3J5OiAoaWQgPFRQcm90b2NvbEZhY3Rvcnk+KSBwcm90b2NvbEZhY3RvcnkKLSAgIHByb2Nlc3NvckZhY3Rvcnk6IChpZCA8VFByb2Nlc3NvckZhY3Rvcnk+KSBwcm9jZXNzb3JGYWN0b3J5OworCitAaW50ZXJmYWNlIFRTb2NrZXRTZXJ2ZXIgOiBOU09iamVjdAorCistKGluc3RhbmNldHlwZSkgaW5pdFdpdGhQb3J0OihpbnQpcG9ydAorICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeTooaWQgPFRQcm90b2NvbEZhY3Rvcnk+KXByb3RvY29sRmFjdG9yeQorICAgICAgICAgICAgcHJvY2Vzc29yRmFjdG9yeTooaWQgPFRQcm9jZXNzb3JGYWN0b3J5Pilwcm9jZXNzb3JGYWN0b3J5OworCistIChpbnN0YW5jZXR5cGUpIGluaXRXaXRoUGF0aDogKE5TU3RyaW5nICopIHBhdGgKKyAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5OiAoaWQgPFRQcm90b2NvbEZhY3Rvcnk+KSBwcm90b2NvbEZhY3RvcnkKKyAgICAgICAgICAgICBwcm9jZXNzb3JGYWN0b3J5OiAoaWQgPFRQcm9jZXNzb3JGYWN0b3J5PikgcHJvY2Vzc29yRmFjdG9yeTsKIAogQGVuZAogCiAKLQorTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3NlcnZlci9UU29ja2V0U2VydmVyLm0gYi9saWIvY29jb2Evc3JjL3NlcnZlci9UU29ja2V0U2VydmVyLm0KaW5kZXggNWY3ZmEzYy4uMDliNjAzYyAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9zZXJ2ZXIvVFNvY2tldFNlcnZlci5tCisrKyBiL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIubQpAQCAtMjEsMzUgKzIxLDkyIEBACiAjaW1wb3J0ICJUU29ja2V0U2VydmVyLmgiCiAjaW1wb3J0ICJUTlNGaWxlSGFuZGxlVHJhbnNwb3J0LmgiCiAjaW1wb3J0ICJUUHJvdG9jb2wuaCIKLSNpbXBvcnQgIlRUcmFuc3BvcnRFeGNlcHRpb24uaCIKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgorCiAjaW1wb3J0IDxzeXMvc29ja2V0Lmg+CiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgogCiAKK05TU3RyaW5nICpjb25zdCBUU29ja2V0U2VydmVyQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkID0gQCJUU29ja2V0U2VydmVyQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkIjsKK05TU3RyaW5nICpjb25zdCBUU29ja2V0U2VydmVyUHJvY2Vzc29yS2V5ID0gQCJUU29ja2V0U2VydmVyUHJvY2Vzc29yIjsKK05TU3RyaW5nICpjb25zdCBUU29ja2VyU2VydmVyVHJhbnNwb3J0S2V5ID0gQCJUU29ja2VyU2VydmVyVHJhbnNwb3J0IjsKIAotTlNTdHJpbmcgKiBjb25zdCBrVFNvY2tldFNlcnZlcl9DbGllbnRDb25uZWN0aW9uRmluaXNoZWRGb3JQcm9jZXNzb3JOb3RpZmljYXRpb24gPSBAIlRTb2NrZXRTZXJ2ZXJfQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkRm9yUHJvY2Vzc29yTm90aWZpY2F0aW9uIjsKLU5TU3RyaW5nICogY29uc3Qga1RTb2NrZXRTZXJ2ZXJfUHJvY2Vzc29yS2V5ID0gQCJUU29ja2V0U2VydmVyX1Byb2Nlc3NvciI7Ci1OU1N0cmluZyAqIGNvbnN0IGtUU29ja2VyU2VydmVyX1RyYW5zcG9ydEtleSA9IEAiVFNvY2tlclNlcnZlcl9UcmFuc3BvcnQiOworCitAaW50ZXJmYWNlIFRTb2NrZXRTZXJ2ZXIgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBpZDxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgaWQ8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBpZDxUUHJvY2Vzc29yRmFjdG9yeT4gcHJvY2Vzc29yRmFjdG9yeTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNGaWxlSGFuZGxlICpzb2NrZXRGaWxlSGFuZGxlOworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBkaXNwYXRjaF9xdWV1ZV90IHByb2Nlc3NpbmdRdWV1ZTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNTdHJpbmcgKmRvbWFpblNvY2tldFBhdGg7CisKK0BlbmQKIAogCiBAaW1wbGVtZW50YXRpb24gVFNvY2tldFNlcnZlcgogCi0tIChpZCkgaW5pdFdpdGhQb3J0OiAoaW50KSBwb3J0Ci0gICAgcHJvdG9jb2xGYWN0b3J5OiAoaWQgPFRQcm90b2NvbEZhY3Rvcnk+KSBwcm90b2NvbEZhY3RvcnkKLSAgIHByb2Nlc3NvckZhY3Rvcnk6IChpZCA8VFByb2Nlc3NvckZhY3Rvcnk+KSBwcm9jZXNzb3JGYWN0b3J5OworLShpbnN0YW5jZXR5cGUpIGluaXRXaXRoU29ja2V0OihDRlNvY2tldFJlZilzb2NrZXQKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3Rvcnk6KGlkIDxUUHJvdG9jb2xGYWN0b3J5Pilwcm90b2NvbEZhY3RvcnkKKyAgICAgICAgICAgIHByb2Nlc3NvckZhY3Rvcnk6KGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4pcHJvY2Vzc29yRmFjdG9yeTsKIHsKICAgc2VsZiA9IFtzdXBlciBpbml0XTsKIAotICBtSW5wdXRQcm90b2NvbEZhY3RvcnkgPSBbcHJvdG9jb2xGYWN0b3J5IHJldGFpbl07Ci0gIG1PdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBbcHJvdG9jb2xGYWN0b3J5IHJldGFpbl07Ci0gIG1Qcm9jZXNzb3JGYWN0b3J5ID0gW3Byb2Nlc3NvckZhY3RvcnkgcmV0YWluXTsKKyAgX2lucHV0UHJvdG9jb2xGYWN0b3J5ID0gcHJvdG9jb2xGYWN0b3J5OworICBfb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gcHJvdG9jb2xGYWN0b3J5OworICBfcHJvY2Vzc29yRmFjdG9yeSA9IHByb2Nlc3NvckZhY3Rvcnk7CisKKyAgZGlzcGF0Y2hfcXVldWVfYXR0cl90IHByb2Nlc3NpbmdRdWV1ZUF0dHIgPQorICAgIGRpc3BhdGNoX3F1ZXVlX2F0dHJfbWFrZV93aXRoX3Fvc19jbGFzcyhESVNQQVRDSF9RVUVVRV9DT05DVVJSRU5ULCBRT1NfQ0xBU1NfQkFDS0dST1VORCwgMCk7CisKKyAgX3Byb2Nlc3NpbmdRdWV1ZSA9IGRpc3BhdGNoX3F1ZXVlX2NyZWF0ZSgiVFNvY2tldFNlcnZlci5wcm9jZXNzaW5nIiwgcHJvY2Vzc2luZ1F1ZXVlQXR0cik7CiAKICAgLy8gY3JlYXRlIGEgc29ja2V0LgotICBpbnQgZmQgPSAtMTsKKyAgaW50IGZkID0gQ0ZTb2NrZXRHZXROYXRpdmUoc29ja2V0KTsKKworICAvLyB3cmFwIGl0IGluIGEgZmlsZSBoYW5kbGUgc28gd2UgY2FuIGdldCBtZXNzYWdlcyBmcm9tIGl0CisgIF9zb2NrZXRGaWxlSGFuZGxlID0gW1tOU0ZpbGVIYW5kbGUgYWxsb2NdIGluaXRXaXRoRmlsZURlc2NyaXB0b3I6ZmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZU9uRGVhbGxvYzpZRVNdOworCisgIC8vIHRocm93IGF3YXkgb3VyIHNvY2tldAorICBDRlNvY2tldEludmFsaWRhdGUoc29ja2V0KTsKKyAgQ0ZSZWxlYXNlKHNvY2tldCk7CisKKyAgLy8gcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnMgb2YgYWNjZXB0ZWQgaW5jb21pbmcgY29ubmVjdGlvbnMKKyAgW1tOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSBhZGRPYnNlcnZlcjpzZWxmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6QHNlbGVjdG9yKGNvbm5lY3Rpb25BY2NlcHRlZDopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6TlNGaWxlSGFuZGxlQ29ubmVjdGlvbkFjY2VwdGVkTm90aWZpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6X3NvY2tldEZpbGVIYW5kbGVdOworCisgIC8vIHRlbGwgc29ja2V0IHRvIGxpc3RlbgorICBbX3NvY2tldEZpbGVIYW5kbGUgYWNjZXB0Q29ubmVjdGlvbkluQmFja2dyb3VuZEFuZE5vdGlmeV07CisKKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKSBpbml0V2l0aFBvcnQ6IChpbnQpIHBvcnQKKyAgICBwcm90b2NvbEZhY3Rvcnk6IChpZCA8VFByb3RvY29sRmFjdG9yeT4pIHByb3RvY29sRmFjdG9yeQorICAgcHJvY2Vzc29yRmFjdG9yeTogKGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4pIHByb2Nlc3NvckZhY3RvcnkKK3sKKyAgQ0ZTb2NrZXRSZWYgc29ja2V0ID0gW1tzZWxmIGNsYXNzXSBjcmVhdGVTb2NrZXRXaXRoUG9ydDpwb3J0XTsKKyAgaWYgKHNvY2tldCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIG5pbDsKKyAgfQorCisgIGlmIChzZWxmID0gW3NlbGYgaW5pdFdpdGhTb2NrZXQ6c29ja2V0IHByb3RvY29sRmFjdG9yeTpwcm90b2NvbEZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeTpwcm9jZXNzb3JGYWN0b3J5XSkgeworICAgIE5TTG9nKEAiVFNvY2tldFNlcnZlcjogTGlzdGVuaW5nIG9uIFRDUCBwb3J0ICVkIiwgcG9ydCk7CisgIH0KKyAgcmV0dXJuIHNlbGY7Cit9CisKKworKyhDRlNvY2tldFJlZikgY3JlYXRlU29ja2V0V2l0aFBvcnQ6KGludClwb3J0Cit7CiAgIENGU29ja2V0UmVmIHNvY2tldCA9IENGU29ja2V0Q3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIFBGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCwgMCwgTlVMTCwgTlVMTCk7CiAgIGlmIChzb2NrZXQpIHsKICAgICBDRlNvY2tldFNldFNvY2tldEZsYWdzKHNvY2tldCwgQ0ZTb2NrZXRHZXRTb2NrZXRGbGFncyhzb2NrZXQpICYgfmtDRlNvY2tldENsb3NlT25JbnZhbGlkYXRlKTsKLSAgICBmZCA9IENGU29ja2V0R2V0TmF0aXZlKHNvY2tldCk7CisgICAgaW50IGZkID0gQ0ZTb2NrZXRHZXROYXRpdmUoc29ja2V0KTsKICAgICBpbnQgeWVzID0gMTsKICAgICBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICh2b2lkICopJnllcywgc2l6ZW9mKHllcykpOwogCkBAIC02MCwxMDEgKzExNywxMjMgQEAKICAgICBhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CiAgICAgYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKICAgICBOU0RhdGEgKmFkZHJlc3MgPSBbTlNEYXRhIGRhdGFXaXRoQnl0ZXM6JmFkZHIgbGVuZ3RoOnNpemVvZihhZGRyKV07Ci0gICAgaWYgKENGU29ja2V0U2V0QWRkcmVzcyhzb2NrZXQsIChDRkRhdGFSZWYpYWRkcmVzcykgIT0ga0NGU29ja2V0U3VjY2VzcykgeworICAgIGlmIChDRlNvY2tldFNldEFkZHJlc3Moc29ja2V0LCAoX19icmlkZ2UgQ0ZEYXRhUmVmKWFkZHJlc3MpICE9IGtDRlNvY2tldFN1Y2Nlc3MpIHsKICAgICAgIENGU29ja2V0SW52YWxpZGF0ZShzb2NrZXQpOwogICAgICAgQ0ZSZWxlYXNlKHNvY2tldCk7Ci0gICAgICBOU0xvZyhAIioqKiBDb3VsZCBub3QgYmluZCB0byBhZGRyZXNzIik7Ci0gICAgICByZXR1cm4gbmlsOworICAgICAgTlNMb2coQCJUU29ja2V0U2VydmVyOiBDb3VsZCBub3QgYmluZCB0byBhZGRyZXNzIik7CisgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgTlNMb2coQCIqKiogTm8gc2VydmVyIHNvY2tldCIpOworCisgICAgcmV0dXJuIHNvY2tldDsKKyAgfQorICBlbHNlIHsKKyAgICBOU0xvZyhAIlRTb2NrZXRTZXJ2ZXI6IE5vIHNlcnZlciBzb2NrZXQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCistIChpZCkgaW5pdFdpdGhQYXRoOiAoTlNTdHJpbmcgKikgcGF0aAorICAgIHByb3RvY29sRmFjdG9yeTogKGlkIDxUUHJvdG9jb2xGYWN0b3J5PikgcHJvdG9jb2xGYWN0b3J5CisgICBwcm9jZXNzb3JGYWN0b3J5OiAoaWQgPFRQcm9jZXNzb3JGYWN0b3J5PikgcHJvY2Vzc29yRmFjdG9yeQoreworICBfZG9tYWluU29ja2V0UGF0aCA9IHBhdGg7CisgIENGU29ja2V0UmVmIHNvY2tldCA9IFtbc2VsZiBjbGFzc10gY3JlYXRlU29ja2V0V2l0aFBhdGg6cGF0aF07CisgIGlmIChzb2NrZXQgPT0gTlVMTCkgewogICAgIHJldHVybiBuaWw7CiAgIH0KLSAgCi0gIC8vIHdyYXAgaXQgaW4gYSBmaWxlIGhhbmRsZSBzbyB3ZSBjYW4gZ2V0IG1lc3NhZ2VzIGZyb20gaXQKLSAgbVNvY2tldEZpbGVIYW5kbGUgPSBbW05TRmlsZUhhbmRsZSBhbGxvY10gaW5pdFdpdGhGaWxlRGVzY3JpcHRvcjogZmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZU9uRGVhbGxvYzogWUVTXTsKLSAgCi0gIC8vIHRocm93IGF3YXkgb3VyIHNvY2tldAotICBDRlNvY2tldEludmFsaWRhdGUoc29ja2V0KTsKLSAgQ0ZSZWxlYXNlKHNvY2tldCk7Ci0gIAotICAgIC8vIHJlZ2lzdGVyIGZvciBub3RpZmljYXRpb25zIG9mIGFjY2VwdGVkIGluY29taW5nIGNvbm5lY3Rpb25zCi0gIFtbTlNOb3RpZmljYXRpb25DZW50ZXIgZGVmYXVsdENlbnRlcl0gYWRkT2JzZXJ2ZXI6IHNlbGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogQHNlbGVjdG9yKGNvbm5lY3Rpb25BY2NlcHRlZDopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IE5TRmlsZUhhbmRsZUNvbm5lY3Rpb25BY2NlcHRlZE5vdGlmaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0OiBtU29ja2V0RmlsZUhhbmRsZV07Ci0gIAotICAvLyB0ZWxsIHNvY2tldCB0byBsaXN0ZW4KLSAgW21Tb2NrZXRGaWxlSGFuZGxlIGFjY2VwdENvbm5lY3Rpb25JbkJhY2tncm91bmRBbmROb3RpZnldOwotICAKLSAgTlNMb2coQCJMaXN0ZW5pbmcgb24gVENQIHBvcnQgJWQiLCBwb3J0KTsKLSAgCisKKyAgaWYgKHNlbGYgPSBbc2VsZiBpbml0V2l0aFNvY2tldDpzb2NrZXQgcHJvdG9jb2xGYWN0b3J5OnByb3RvY29sRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5OnByb2Nlc3NvckZhY3RvcnldKSB7CisgICAgTlNMb2coQCJUU29ja2V0U2VydmVyOiBMaXN0ZW5pbmcgb24gcGF0aCAlQCIsIHBhdGgpOworICB9CiAgIHJldHVybiBzZWxmOwogfQogCi0KLS0gKHZvaWQpIGRlYWxsb2MgewotICBbW05TTm90aWZpY2F0aW9uQ2VudGVyIGRlZmF1bHRDZW50ZXJdIHJlbW92ZU9iamVjdDogc2VsZl07Ci0gIFttSW5wdXRQcm90b2NvbEZhY3RvcnkgcmVsZWFzZV07Ci0gIFttT3V0cHV0UHJvdG9jb2xGYWN0b3J5IHJlbGVhc2VdOwotICBbbVByb2Nlc3NvckZhY3RvcnkgcmVsZWFzZV07Ci0gIFttU29ja2V0RmlsZUhhbmRsZSByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0KLS0gKHZvaWQpIGNvbm5lY3Rpb25BY2NlcHRlZDogKE5TTm90aWZpY2F0aW9uICopIGFOb3RpZmljYXRpb24KKysgKENGU29ja2V0UmVmKSBjcmVhdGVTb2NrZXRXaXRoUGF0aDogKE5TU3RyaW5nICopIHBhdGgKIHsKLSAgTlNGaWxlSGFuZGxlICogc29ja2V0ID0gW1thTm90aWZpY2F0aW9uIHVzZXJJbmZvXSBvYmplY3RGb3JLZXk6IE5TRmlsZUhhbmRsZU5vdGlmaWNhdGlvbkZpbGVIYW5kbGVJdGVtXTsKKyAgQ0ZTb2NrZXRSZWYgc29ja2V0ID0gQ0ZTb2NrZXRDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgUEZfTE9DQUwsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX0lQLCAwLCBOVUxMLCBOVUxMKTsKKyAgaWYgKHNvY2tldCkgeworICAgIENGU29ja2V0U2V0U29ja2V0RmxhZ3Moc29ja2V0LCAgQ0ZTb2NrZXRHZXRTb2NrZXRGbGFncyhzb2NrZXQpICYgfmtDRlNvY2tldENsb3NlT25JbnZhbGlkYXRlKTsKKyAgICBpbnQgZmQgPSBDRlNvY2tldEdldE5hdGl2ZShzb2NrZXQpOworICAgIGludCB5ZXMgPSAxOworICAgIHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgKHZvaWQgKikmeWVzLCBzaXplb2YoeWVzKSk7CiAKLSAgLy8gbm93IHRoYXQgd2UgaGF2ZSBhIGNsaWVudCBjb25uZWN0ZWQsIHNwaW4gb2ZmIGEgdGhyZWFkIHRvIGhhbmRsZSBhY3Rpdml0eQotICBbTlNUaHJlYWQgZGV0YWNoTmV3VGhyZWFkU2VsZWN0b3I6IEBzZWxlY3RvcihoYW5kbGVDbGllbnRDb25uZWN0aW9uOikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvVGFyZ2V0OiBzZWxmCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2l0aE9iamVjdDogc29ja2V0XTsKKyAgICBzaXplX3QgbnVsbFRlcm1pbmF0ZWRQYXRoTGVuZ3RoID0gcGF0aC5sZW5ndGggKyAxOworICAgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyOworICAgIGlmIChudWxsVGVybWluYXRlZFBhdGhMZW5ndGg+IHNpemVvZihhZGRyLnN1bl9wYXRoKSkgeworICAgICAgTlNMb2coQCJUU29ja2V0U2VydmVyOiBVbmFibGUgdG8gY3JlYXRlIHNvY2tldCBhdCBwYXRoICVALiBQYXRoIGlzIHRvbyBsb25nLiIsIHBhdGgpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0gIFtbYU5vdGlmaWNhdGlvbiBvYmplY3RdIGFjY2VwdENvbm5lY3Rpb25JbkJhY2tncm91bmRBbmROb3RpZnldOworICAgIGFkZHIuc3VuX2ZhbWlseSA9IEFGX0xPQ0FMOworICAgIG1lbWNweShhZGRyLnN1bl9wYXRoLCBwYXRoLlVURjhTdHJpbmcsIG51bGxUZXJtaW5hdGVkUGF0aExlbmd0aCk7CisgICAgYWRkci5zdW5fbGVuID0gU1VOX0xFTigmYWRkcik7CisKKyAgICBOU0RhdGEgKmFkZHJlc3MgPSBbTlNEYXRhIGRhdGFXaXRoQnl0ZXM6JmFkZHIgbGVuZ3RoOnNpemVvZihhZGRyKV07CisgICAgaWYgKENGU29ja2V0U2V0QWRkcmVzcyhzb2NrZXQsIChfX2JyaWRnZSBDRkRhdGFSZWYpYWRkcmVzcykgIT0ga0NGU29ja2V0U3VjY2VzcykgeworICAgICAgQ0ZTb2NrZXRJbnZhbGlkYXRlKHNvY2tldCk7CisgICAgICBDRlJlbGVhc2Uoc29ja2V0KTsKKyAgICAgIE5TTG9nKEAiVFNvY2tldFNlcnZlcjogQ291bGQgbm90IGJpbmQgdG8gYWRkcmVzcyIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHNvY2tldDsKKyAgfSBlbHNlIHsKKyAgICBOU0xvZyhAIlRTb2NrZXRTZXJ2ZXI6IE5vIHNlcnZlciBzb2NrZXQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQogfQogCi0KLS0gKHZvaWQpIGhhbmRsZUNsaWVudENvbm5lY3Rpb246IChOU0ZpbGVIYW5kbGUgKikgY2xpZW50U29ja2V0CistKHZvaWQpIGRlYWxsb2MKIHsKLSAgTlNBdXRvcmVsZWFzZVBvb2wgKiBwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07Ci0gIAotICBUTlNGaWxlSGFuZGxlVHJhbnNwb3J0ICogdHJhbnNwb3J0ID0gW1tUTlNGaWxlSGFuZGxlVHJhbnNwb3J0IGFsbG9jXSBpbml0V2l0aEZpbGVIYW5kbGU6IGNsaWVudFNvY2tldF07Ci0gIGlkPFRQcm9jZXNzb3I+IHByb2Nlc3NvciA9IFttUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGb3JUcmFuc3BvcnQ6IHRyYW5zcG9ydF07Ci0gIAotICBpZCA8VFByb3RvY29sPiBpblByb3RvY29sID0gW1ttSW5wdXRQcm90b2NvbEZhY3RvcnkgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDogdHJhbnNwb3J0XSBhdXRvcmVsZWFzZV07Ci0gIGlkIDxUUHJvdG9jb2w+IG91dFByb3RvY29sID0gW1ttT3V0cHV0UHJvdG9jb2xGYWN0b3J5IG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6IHRyYW5zcG9ydF0gYXV0b3JlbGVhc2VdOworICBbW05TTm90aWZpY2F0aW9uQ2VudGVyIGRlZmF1bHRDZW50ZXJdIHJlbW92ZU9ic2VydmVyOnNlbGZdOwogCi0gIEB0cnkgewotICAgIEJPT0wgcmVzdWx0ID0gTk87Ci0gICAgZG8gewotICAgICAgTlNBdXRvcmVsZWFzZVBvb2wgKiBteVBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKLSAgICAgIHJlc3VsdCA9IFtwcm9jZXNzb3IgcHJvY2Vzc09uSW5wdXRQcm90b2NvbDogaW5Qcm90b2NvbCBvdXRwdXRQcm90b2NvbDogb3V0UHJvdG9jb2xdOwotICAgICAgW215UG9vbCByZWxlYXNlXTsKLSAgICB9IHdoaWxlIChyZXN1bHQpOworICBpZiAoX2RvbWFpblNvY2tldFBhdGggIT0gbmlsKSB7CisgICAgdW5saW5rKF9kb21haW5Tb2NrZXRQYXRoLlVURjhTdHJpbmcpOwogICB9Ci0gIEBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAqIHRlKSB7Ci0gICAgLy9OU0xvZyhAIkNhdWdodCB0cmFuc3BvcnQgZXhjZXB0aW9uLCBhYmFuZG9uaW5nIGNsaWVudCBjb25uZWN0aW9uOiAlQCIsIHRlKTsKLSAgfQotCi0gIE5TTm90aWZpY2F0aW9uICogbiA9IFtOU05vdGlmaWNhdGlvbiBub3RpZmljYXRpb25XaXRoTmFtZToga1RTb2NrZXRTZXJ2ZXJfQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkRm9yUHJvY2Vzc29yTm90aWZpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogc2VsZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86IFtOU0RpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhPYmplY3RzQW5kS2V5czogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1RTb2NrZXRTZXJ2ZXJfUHJvY2Vzc29yS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUU29ja2VyU2VydmVyX1RyYW5zcG9ydEtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsXV07Ci0gIFtbTlNOb3RpZmljYXRpb25DZW50ZXIgZGVmYXVsdENlbnRlcl0gcGVyZm9ybVNlbGVjdG9yT25NYWluVGhyZWFkOiBAc2VsZWN0b3IocG9zdE5vdGlmaWNhdGlvbjopIHdpdGhPYmplY3Q6IG4gd2FpdFVudGlsRG9uZTogWUVTXTsKLSAgCi0gIFtwb29sIHJlbGVhc2VdOwogfQogCiAKKy0odm9pZCkgY29ubmVjdGlvbkFjY2VwdGVkOihOU05vdGlmaWNhdGlvbiAqKW5vdGlmaWNhdGlvbgoreworICBOU0ZpbGVIYW5kbGUgKnNvY2tldCA9IFtub3RpZmljYXRpb24udXNlckluZm8gb2JqZWN0Rm9yS2V5Ok5TRmlsZUhhbmRsZU5vdGlmaWNhdGlvbkZpbGVIYW5kbGVJdGVtXTsKKworICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGEgY2xpZW50IGNvbm5lY3RlZCwgaGFuZGxlIHJlcXVlc3Qgb24gcXVldWUKKyAgZGlzcGF0Y2hfYXN5bmMoX3Byb2Nlc3NpbmdRdWV1ZSwgXnsKKworICAgIFtzZWxmIGhhbmRsZUNsaWVudENvbm5lY3Rpb246c29ja2V0XTsKKworICB9KTsKKworICAvLyBDb250aW51ZSBhY2NlcHRpbmcgY29ubmVjdGlvbnMKKyAgW19zb2NrZXRGaWxlSGFuZGxlIGFjY2VwdENvbm5lY3Rpb25JbkJhY2tncm91bmRBbmROb3RpZnldOworfQorCisKKy0odm9pZCkgaGFuZGxlQ2xpZW50Q29ubmVjdGlvbjooTlNGaWxlSGFuZGxlICopY2xpZW50U29ja2V0Cit7CisgIEBhdXRvcmVsZWFzZXBvb2wgeworCisgICAgVE5TRmlsZUhhbmRsZVRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gW1tUTlNGaWxlSGFuZGxlVHJhbnNwb3J0IGFsbG9jXSBpbml0V2l0aEZpbGVIYW5kbGU6Y2xpZW50U29ja2V0XTsKKyAgICBpZDxUUHJvY2Vzc29yPiBwcm9jZXNzb3IgPSBbX3Byb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRm9yVHJhbnNwb3J0OnRyYW5zcG9ydF07CisKKyAgICBpZCA8VFByb3RvY29sPiBpblByb3RvY29sID0gW19pbnB1dFByb3RvY29sRmFjdG9yeSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OnRyYW5zcG9ydF07CisgICAgaWQgPFRQcm90b2NvbD4gb3V0UHJvdG9jb2wgPSBbX291dHB1dFByb3RvY29sRmFjdG9yeSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OnRyYW5zcG9ydF07CisKKyAgICBOU0Vycm9yICplcnJvcjsKKyAgICBpZiAoIVtwcm9jZXNzb3IgcHJvY2Vzc09uSW5wdXRQcm90b2NvbDppblByb3RvY29sIG91dHB1dFByb3RvY29sOm91dFByb3RvY29sIGVycm9yOiZlcnJvcl0pIHsKKyAgICAgIC8vIEhhbmRsZSBlcnJvcgorICAgICAgTlNMb2coQCJFcnJvciBwcm9jZXNzaW5nIHJlcXVlc3Q6ICVAIiwgZXJyb3IpOworICAgIH0KKworICAgIGRpc3BhdGNoX2FzeW5jKGRpc3BhdGNoX2dldF9tYWluX3F1ZXVlKCksIF57CisKKyAgICAgIFtOU05vdGlmaWNhdGlvbkNlbnRlci5kZWZhdWx0Q2VudGVyIHBvc3ROb3RpZmljYXRpb25OYW1lOlRTb2NrZXRTZXJ2ZXJDbGllbnRDb25uZWN0aW9uRmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0OnNlbGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7VFNvY2tldFNlcnZlclByb2Nlc3NvcktleTogcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUU29ja2VyU2VydmVyVHJhbnNwb3J0S2V5OiB0cmFuc3BvcnR9XTsKKyAgICB9KTsKKworICB9Cit9CiAKIEBlbmQKLQotCi0KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RBc3luY1RyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEFzeW5jVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFiNGZiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RBc3luY1RyYW5zcG9ydC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgorCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKK0Bwcm90b2NvbCBUQXN5bmNUcmFuc3BvcnQ7CisKKworQHByb3RvY29sIFRBc3luY1RyYW5zcG9ydEZhY3RvcnkgPE5TT2JqZWN0PgorCistKGlkPFRBc3luY1RyYW5zcG9ydD4pIG5ld1RyYW5zcG9ydDsKKworQGVuZAorCisKK3R5cGVkZWYgdm9pZCAoXlRBc3luY0NvbXBsZXRpb25CbG9jaykoKTsKK3R5cGVkZWYgdm9pZCAoXlRBc3luY0ZhaWx1cmVCbG9jaykoTlNFcnJvciAqIF9fbm9ubnVsbCk7CisKKworQHByb3RvY29sIFRBc3luY1RyYW5zcG9ydCA8VFRyYW5zcG9ydD4KKworLSh2b2lkKSBmbHVzaFdpdGhDb21wbGV0aW9uOihUQXN5bmNDb21wbGV0aW9uQmxvY2spY29tcGxldGVkIGZhaWx1cmU6KFRBc3luY0ZhaWx1cmVCbG9jaylmYWlsdXJlOworCitAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNjhhYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKyNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKKworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCitAaW50ZXJmYWNlIFRGcmFtZWRUcmFuc3BvcnQgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4KKworLShpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQ7CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGI2NWM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5tCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRGcmFtZWRUcmFuc3BvcnQuaCIKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgorCisjZGVmaW5lIEhFQURFUl9TSVpFIDQKKyNkZWZpbmUgSU5JVF9GUkFNRV9TSVpFIDEwMjQKKworCitAaW50ZXJmYWNlIFRGcmFtZWRUcmFuc3BvcnQgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBpZDxUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TTXV0YWJsZURhdGEgKndyaXRlQnVmZmVyOworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU011dGFibGVEYXRhICpyZWFkQnVmZmVyOworQHByb3BlcnR5KGFzc2lnbiwgbm9uYXRvbWljKSBOU1VJbnRlZ2VyIHJlYWRPZmZzZXQ7CisKK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gVEZyYW1lZFRyYW5zcG9ydAorCistKGlkKSBpbml0V2l0aFRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KWFUcmFuc3BvcnQKK3sKKyAgaWYgKChzZWxmID0gW3NlbGYgaW5pdF0pKSB7CisgICAgX3RyYW5zcG9ydCA9IGFUcmFuc3BvcnQ7CisgICAgX3JlYWRCdWZmZXIgPSBuaWw7CisgICAgX3JlYWRPZmZzZXQgPSAwOworICAgIF93cml0ZUJ1ZmZlciA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOkhFQURFUl9TSVpFXTsKKyAgfQorICByZXR1cm4gc2VsZjsKK30KKworLShCT09MKSBmbHVzaDooTlNFcnJvciAqKillcnJvcgoreworICBpbnQgbGVuID0gKGludClbX3dyaXRlQnVmZmVyIGxlbmd0aF07CisgIGludCBkYXRhX2xlbiA9IGxlbiAtIEhFQURFUl9TSVpFOworICBpZiAoZGF0YV9sZW4gPCAwKSB7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yVW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7fV07CisgICAgfQorICAgIHJldHVybiBOTzsKKyAgfQorCisgIFVJbnQ4IGkzMnJkW0hFQURFUl9TSVpFXTsKKyAgaTMycmRbMF0gPSAoVUludDgpKDB4ZmYgJiAoZGF0YV9sZW4gPj4gMjQpKTsKKyAgaTMycmRbMV0gPSAoVUludDgpKDB4ZmYgJiAoZGF0YV9sZW4gPj4gMTYpKTsKKyAgaTMycmRbMl0gPSAoVUludDgpKDB4ZmYgJiAoZGF0YV9sZW4gPj4gOCkpOworICBpMzJyZFszXSA9IChVSW50OCkoMHhmZiAmIChkYXRhX2xlbikpOworCisgIC8vIHNob3VsZCB3ZSBtYWtlIGEgY29weSBvZiB0aGUgd3JpdGVCdWZmZXIgaW5zdGVhZD8gQmV0dGVyIGZvciB0aHJlYWRlZAorICAvLyAgb3BlcmF0aW9ucyEKKyAgW193cml0ZUJ1ZmZlciByZXBsYWNlQnl0ZXNJblJhbmdlOk5TTWFrZVJhbmdlKDAsIEhFQURFUl9TSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoQnl0ZXM6aTMycmQgbGVuZ3RoOkhFQURFUl9TSVpFXTsKKworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOl93cml0ZUJ1ZmZlci5tdXRhYmxlQnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOmxlbiBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAoIVtfdHJhbnNwb3J0IGZsdXNoOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIF93cml0ZUJ1ZmZlci5sZW5ndGggPSBIRUFERVJfU0laRTsKKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlOihjb25zdCBVSW50OCAqKWRhdGEgb2Zmc2V0OihVSW50MzIpb2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgW193cml0ZUJ1ZmZlciBhcHBlbmRCeXRlczpkYXRhK29mZnNldCBsZW5ndGg6bGVuZ3RoXTsKKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRBbGw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBnb3QgPSBbc2VsZiByZWFkQXZhaWw6b3V0QnVmZmVyIG9mZnNldDpvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOmxlbmd0aCBlcnJvcjplcnJvcl07CisgIGlmIChnb3QgIT0gbGVuZ3RoKSB7CisKKyAgICAvLyBSZXBvcnQgdW5kZXJmbG93IG9ubHkgaWYgcmVhZEF2YWlsIGRpZG4ndCByZXBvcnQgZXJyb3IgYWxyZWFkeQorICAgIGlmIChlcnJvciAmJiAhKmVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yRW5kT2ZGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86bmlsXTsKKyAgICB9CisKKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKFVJbnQzMikgcmVhZEF2YWlsOihVSW50OCAqKW91dEJ1ZmZlciBvZmZzZXQ6KFVJbnQzMilvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgZ290ID0gMDsKKyAgd2hpbGUgKGdvdCA8IGxlbmd0aCkgeworCisgICAgTlNVSW50ZWdlciBhdmFpbCA9IF9yZWFkQnVmZmVyLmxlbmd0aCAtIF9yZWFkT2Zmc2V0OworICAgIGlmIChhdmFpbCA9PSAwKSB7CisgICAgICBpZiAoIVtzZWxmIHJlYWRGcmFtZTplcnJvcl0pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBhdmFpbCA9IF9yZWFkQnVmZmVyLmxlbmd0aDsKKyAgICB9CisKKyAgICBOU1JhbmdlIHJhbmdlOworICAgIHJhbmdlLmxvY2F0aW9uID0gX3JlYWRPZmZzZXQ7CisgICAgcmFuZ2UubGVuZ3RoID0gTUlOKGxlbmd0aCAtIGdvdCwgYXZhaWwpOworCisgICAgW19yZWFkQnVmZmVyIGdldEJ5dGVzOm91dEJ1ZmZlcitvdXRCdWZmZXJPZmZzZXQrZ290IHJhbmdlOnJhbmdlXTsKKyAgICBfcmVhZE9mZnNldCArPSByYW5nZS5sZW5ndGg7CisgICAgZ290ICs9IHJhbmdlLmxlbmd0aDsKKyAgfQorCisgIHJldHVybiBnb3Q7Cit9CisKKy0oQk9PTCkgcmVhZEZyYW1lOihOU0Vycm9yICoqKWVycm9yCit7CisgIFVJbnQ4IGkzMnJkW0hFQURFUl9TSVpFXTsKKyAgaWYgKCFbX3RyYW5zcG9ydCByZWFkQWxsOmkzMnJkIG9mZnNldDowIGxlbmd0aDpIRUFERVJfU0laRSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBTSW50MzIgc2l6ZSA9CisgICAgKChpMzJyZFswXSAmIDB4ZmYpIDw8IDI0KSB8CisgICAgKChpMzJyZFsxXSAmIDB4ZmYpIDw8IDE2KSB8CisgICAgKChpMzJyZFsyXSAmIDB4ZmYpIDw8ICA4KSB8CisgICAgKChpMzJyZFszXSAmIDB4ZmYpKTsKKworICBpZiAoX3JlYWRCdWZmZXIgPT0gbmlsKSB7CisKKyAgICBfcmVhZEJ1ZmZlciA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOnNpemVdOworCisgIH0KKyAgZWxzZSB7CisKKyAgICBTSW50MzIgbGVuID0gKFNJbnQzMilfcmVhZEJ1ZmZlci5sZW5ndGg7CisgICAgaWYgKGxlbiA+PSBzaXplKSB7CisKKyAgICAgIF9yZWFkQnVmZmVyLmxlbmd0aCA9IHNpemU7CisKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgIC8vIGluY3JlYXNlIGxlbmd0aCBvZiBkYXRhIGJ1ZmZlcgorICAgICAgW19yZWFkQnVmZmVyIGluY3JlYXNlTGVuZ3RoQnk6c2l6ZS1sZW5dOworCisgICAgfQorCisgIH0KKworICAvLyBjb3B5IGludG8gaW50ZXJuYWwgbWVtb3J5IGJ1ZmZlcgorICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6X3JlYWRCdWZmZXIubXV0YWJsZUJ5dGVzIG9mZnNldDowIGxlbmd0aDpzaXplIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQQ2xpZW50LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUENsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDU3ODQwLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQQ2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgotCi1AaW50ZXJmYWNlIFRIVFRQQ2xpZW50IDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+IHsKLSAgTlNVUkwgKiBtVVJMOwotICBOU011dGFibGVVUkxSZXF1ZXN0ICogbVJlcXVlc3Q7Ci0gIE5TTXV0YWJsZURhdGEgKiBtUmVxdWVzdERhdGE7Ci0gIE5TRGF0YSAqIG1SZXNwb25zZURhdGE7Ci0gIGludCBtUmVzcG9uc2VEYXRhT2Zmc2V0OwotICBOU1N0cmluZyAqIG1Vc2VyQWdlbnQ7Ci0gIGludCBtVGltZW91dDsKLX0KLQotLSAoaWQpIGluaXRXaXRoVVJMOiAoTlNVUkwgKikgYVVSTDsKLQotLSAoaWQpIGluaXRXaXRoVVJMOiAoTlNVUkwgKikgYVVSTAotICAgICAgICAgdXNlckFnZW50OiAoTlNTdHJpbmcgKikgdXNlckFnZW50Ci0gICAgICAgICAgIHRpbWVvdXQ6IChpbnQpIHRpbWVvdXQ7Ci0KLS0gKHZvaWQpIHNldFVSTDogKE5TVVJMICopIGFVUkw7Ci0KLUBlbmQKLQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBDbGllbnQubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQQ2xpZW50Lm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYWE4NTkuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBDbGllbnQubQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRIVFRQQ2xpZW50LmgiCi0jaW1wb3J0ICJUVHJhbnNwb3J0RXhjZXB0aW9uLmgiCi0KLUBpbXBsZW1lbnRhdGlvbiBUSFRUUENsaWVudAotCi0KLS0gKHZvaWQpIHNldHVwUmVxdWVzdAotewotICBpZiAobVJlcXVlc3QgIT0gbmlsKSB7Ci0gICAgW21SZXF1ZXN0IHJlbGVhc2VdOwotICB9Ci0KLSAgLy8gc2V0IHVwIG91ciByZXF1ZXN0IG9iamVjdCB0aGF0IHdlJ2xsIHVzZSBmb3IgZWFjaCByZXF1ZXN0Ci0gIG1SZXF1ZXN0ID0gW1tOU011dGFibGVVUkxSZXF1ZXN0IGFsbG9jXSBpbml0V2l0aFVSTDogbVVSTF07Ci0gIFttUmVxdWVzdCBzZXRIVFRQTWV0aG9kOiBAIlBPU1QiXTsKLSAgW21SZXF1ZXN0IHNldFZhbHVlOiBAImFwcGxpY2F0aW9uL3gtdGhyaWZ0IiBmb3JIVFRQSGVhZGVyRmllbGQ6IEAiQ29udGVudC1UeXBlIl07Ci0gIFttUmVxdWVzdCBzZXRWYWx1ZTogQCJhcHBsaWNhdGlvbi94LXRocmlmdCIgZm9ySFRUUEhlYWRlckZpZWxkOiBAIkFjY2VwdCJdOwotCi0gIE5TU3RyaW5nICogdXNlckFnZW50ID0gbVVzZXJBZ2VudDsKLSAgaWYgKCF1c2VyQWdlbnQpIHsKLSAgICB1c2VyQWdlbnQgPSBAIkNvY29hL1RIVFRQQ2xpZW50IjsKLSAgfQotICBbbVJlcXVlc3Qgc2V0VmFsdWU6IHVzZXJBZ2VudCBmb3JIVFRQSGVhZGVyRmllbGQ6IEAiVXNlci1BZ2VudCJdOwotCi0gIFttUmVxdWVzdCBzZXRDYWNoZVBvbGljeTogTlNVUkxSZXF1ZXN0UmVsb2FkSWdub3JpbmdDYWNoZURhdGFdOwotICBpZiAobVRpbWVvdXQpIHsKLSAgICBbbVJlcXVlc3Qgc2V0VGltZW91dEludGVydmFsOiBtVGltZW91dF07Ci0gIH0KLX0KLQotCi0tIChpZCkgaW5pdFdpdGhVUkw6IChOU1VSTCAqKSBhVVJMCi17Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFVSTDogYVVSTAotICAgICAgICAgICAgICAgICB1c2VyQWdlbnQ6IG5pbAotICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDBdOwotfQotCi0KLS0gKGlkKSBpbml0V2l0aFVSTDogKE5TVVJMICopIGFVUkwKLSAgICAgICAgIHVzZXJBZ2VudDogKE5TU3RyaW5nICopIHVzZXJBZ2VudAotICAgICAgICAgICB0aW1lb3V0OiAoaW50KSB0aW1lb3V0Ci17Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmICghc2VsZikgewotICAgIHJldHVybiBuaWw7Ci0gIH0KLQotICBtVGltZW91dCA9IHRpbWVvdXQ7Ci0gIGlmICh1c2VyQWdlbnQpIHsKLSAgICBtVXNlckFnZW50ID0gW3VzZXJBZ2VudCByZXRhaW5dOwotICB9Ci0gIG1VUkwgPSBbYVVSTCByZXRhaW5dOwotCi0gIFtzZWxmIHNldHVwUmVxdWVzdF07Ci0KLSAgLy8gY3JlYXRlIG91ciByZXF1ZXN0IGRhdGEgYnVmZmVyCi0gIG1SZXF1ZXN0RGF0YSA9IFtbTlNNdXRhYmxlRGF0YSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTogMTAyNF07Ci0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLQotLSAodm9pZCkgc2V0VVJMOiAoTlNVUkwgKikgYVVSTAotewotICBbYVVSTCByZXRhaW5dOwotICBbbVVSTCByZWxlYXNlXTsKLSAgbVVSTCA9IGFVUkw7Ci0KLSAgW3NlbGYgc2V0dXBSZXF1ZXN0XTsKLX0KLQotCi0tICh2b2lkKSBkZWFsbG9jCi17Ci0gIFttVVJMIHJlbGVhc2VdOwotICBbbVVzZXJBZ2VudCByZWxlYXNlXTsKLSAgW21SZXF1ZXN0IHJlbGVhc2VdOwotICBbbVJlcXVlc3REYXRhIHJlbGVhc2VdOwotICBbbVJlc3BvbnNlRGF0YSByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0KLS0gKGludCkgcmVhZEFsbDogKHVpbnQ4X3QgKikgYnVmIG9mZnNldDogKGludCkgb2ZmIGxlbmd0aDogKGludCkgbGVuCi17Ci0gIE5TUmFuZ2UgcjsKLSAgci5sb2NhdGlvbiA9IG1SZXNwb25zZURhdGFPZmZzZXQ7Ci0gIHIubGVuZ3RoID0gbGVuOwotCi0gIFttUmVzcG9uc2VEYXRhIGdldEJ5dGVzOiBidWYrb2ZmIHJhbmdlOiByXTsKLSAgbVJlc3BvbnNlRGF0YU9mZnNldCArPSBsZW47Ci0KLSAgcmV0dXJuIGxlbjsKLX0KLQotCi0tICh2b2lkKSB3cml0ZTogKGNvbnN0IHVpbnQ4X3QgKikgZGF0YSBvZmZzZXQ6ICh1bnNpZ25lZCBpbnQpIG9mZnNldCBsZW5ndGg6ICh1bnNpZ25lZCBpbnQpIGxlbmd0aAotewotICBbbVJlcXVlc3REYXRhIGFwcGVuZEJ5dGVzOiBkYXRhK29mZnNldCBsZW5ndGg6IGxlbmd0aF07Ci19Ci0KLQotLSAodm9pZCkgZmx1c2gKLXsKLSAgW21SZXF1ZXN0IHNldEhUVFBCb2R5OiBtUmVxdWVzdERhdGFdOyAvLyBub3Qgc3VyZSBpZiBpdCBjb3BpZXMgdGhlIGRhdGEKLQotICAvLyBtYWtlIHRoZSBIVFRQIHJlcXVlc3QKLSAgTlNVUkxSZXNwb25zZSAqIHJlc3BvbnNlOwotICBOU0Vycm9yICogZXJyb3I7Ci0gIE5TRGF0YSAqIHJlc3BvbnNlRGF0YSA9Ci0gICAgW05TVVJMQ29ubmVjdGlvbiBzZW5kU3luY2hyb25vdXNSZXF1ZXN0OiBtUmVxdWVzdCByZXR1cm5pbmdSZXNwb25zZTogJnJlc3BvbnNlIGVycm9yOiAmZXJyb3JdOwotCi0gIFttUmVxdWVzdERhdGEgc2V0TGVuZ3RoOiAwXTsKLQotICBpZiAocmVzcG9uc2VEYXRhID09IG5pbCkgewotICAgIEB0aHJvdyBbVFRyYW5zcG9ydEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTogQCJUVHJhbnNwb3J0RXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IEAiQ291bGQgbm90IG1ha2UgSFRUUCByZXF1ZXN0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3JdOwotICB9Ci0gIGlmICghW3Jlc3BvbnNlIGlzS2luZE9mQ2xhc3M6IFtOU0hUVFBVUkxSZXNwb25zZSBjbGFzc11dKSB7Ci0gICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRUcmFuc3BvcnRFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCJVbmV4cGVjdGVkIE5TVVJMUmVzcG9uc2UgdHlwZTogJUAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TU3RyaW5nRnJvbUNsYXNzKFtyZXNwb25zZSBjbGFzc10pXV07Ci0gIH0KLQotICBOU0hUVFBVUkxSZXNwb25zZSAqIGh0dHBSZXNwb25zZSA9IChOU0hUVFBVUkxSZXNwb25zZSAqKSByZXNwb25zZTsKLSAgaWYgKFtodHRwUmVzcG9uc2Ugc3RhdHVzQ29kZV0gIT0gMjAwKSB7Ci0gICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRUcmFuc3BvcnRFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCJCYWQgcmVzcG9uc2UgZnJvbSBIVFRQIHNlcnZlcjogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtodHRwUmVzcG9uc2Ugc3RhdHVzQ29kZV1dXTsKLSAgfQotCi0gIC8vIHBoZXchCi0gIFttUmVzcG9uc2VEYXRhIHJlbGVhc2VdOwotICBtUmVzcG9uc2VEYXRhID0gW3Jlc3BvbnNlRGF0YSByZXRhaW5dOwotICBtUmVzcG9uc2VEYXRhT2Zmc2V0ID0gMDsKLX0KLQotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFNlc3Npb25UcmFuc3BvcnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMzQ5OWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFNlc3Npb25UcmFuc3BvcnQuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorI2ltcG9ydCAiVEFzeW5jVHJhbnNwb3J0LmgiCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKwordHlwZWRlZiBOU0Vycm9yICpfX251bGxhYmxlICheVEhUVFBTZXNzaW9uVHJhbnNwb3J0UmVzcG9uc2VWYWxpZGF0ZUJsb2NrKSAoTlNIVFRQVVJMUmVzcG9uc2UgKnJlc3BvbnNlLCBOU0RhdGEgKnJlc3BvbnNlRGF0YSk7CisKKworQGludGVyZmFjZSBUSFRUUFNlc3Npb25UcmFuc3BvcnRGYWN0b3J5IDogTlNPYmplY3Q8VEFzeW5jVHJhbnNwb3J0RmFjdG9yeT4KKworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgVEhUVFBTZXNzaW9uVHJhbnNwb3J0UmVzcG9uc2VWYWxpZGF0ZUJsb2NrIHJlc3BvbnNlVmFsaWRhdGU7CisKKysodm9pZCkgc2V0dXBEZWZhdWx0c0ZvclNlc3Npb25Db25maWd1cmF0aW9uOihOU1VSTFNlc3Npb25Db25maWd1cmF0aW9uICopY29uZmlnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aFByb3RvY29sTmFtZTooTlNTdHJpbmcgKilwcm90b2NvbE5hbWU7CisKKy0oaWQpIGluaXRXaXRoU2Vzc2lvbjooTlNVUkxTZXNzaW9uICopc2Vzc2lvbgorICAgICAgICAgICAgICAgICAgVVJMOihOU1VSTCAqKWFVUkw7CisKK0BlbmQKKworCitAaW50ZXJmYWNlIFRIVFRQU2Vzc2lvblRyYW5zcG9ydCA6IE5TT2JqZWN0IDxUQXN5bmNUcmFuc3BvcnQ+CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBTZXNzaW9uVHJhbnNwb3J0Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEwYjdmYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5tCkBAIC0wLDAgKzEsMjY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRIVFRQU2Vzc2lvblRyYW5zcG9ydC5oIgorI2ltcG9ydCAiVFRyYW5zcG9ydEVycm9yLmgiCisKKworQGludGVyZmFjZSBUSFRUUFNlc3Npb25UcmFuc3BvcnRGYWN0b3J5ICgpCisKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TVVJMU2Vzc2lvbiAqc2Vzc2lvbjsKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TVVJMICp1cmw7CisKK0BlbmQKKworCitAaW50ZXJmYWNlIFRIVFRQU2Vzc2lvblRyYW5zcG9ydCAoKQorCitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBUSFRUUFNlc3Npb25UcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5OworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNNdXRhYmxlRGF0YSAqcmVxdWVzdERhdGE7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU0RhdGEgKnJlc3BvbnNlRGF0YTsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBub25hdG9taWMpIE5TVUludGVnZXIgcmVzcG9uc2VEYXRhT2Zmc2V0OworCistKGluc3RhbmNldHlwZSkgaW5pdFdpdGhGYWN0b3J5OihUSFRUUFNlc3Npb25UcmFuc3BvcnRGYWN0b3J5ICopZmFjdG9yeTsKKworQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBUSFRUUFNlc3Npb25UcmFuc3BvcnRGYWN0b3J5CisKKysodm9pZCkgc2V0dXBEZWZhdWx0c0ZvclNlc3Npb25Db25maWd1cmF0aW9uOihOU1VSTFNlc3Npb25Db25maWd1cmF0aW9uICopY29uZmlnIHdpdGhQcm90b2NvbE5hbWU6KE5TU3RyaW5nICopcHJvdG9jb2xOYW1lCit7CisgIE5TU3RyaW5nICp0aHJpZnRDb250ZW50VHlwZSA9IEAiYXBwbGljYXRpb24veC10aHJpZnQiOworICBpZiAocHJvdG9jb2xOYW1lLmxlbmd0aCkgeworICAgIHRocmlmdENvbnRlbnRUeXBlID0gW3RocmlmdENvbnRlbnRUeXBlIHN0cmluZ0J5QXBwZW5kaW5nRm9ybWF0OkAiOyBwPSVAIiwgcHJvdG9jb2xOYW1lXTsKKyAgfQorCisgIGNvbmZpZy5yZXF1ZXN0Q2FjaGVQb2xpY3kgPSBOU1VSTFJlcXVlc3RSZWxvYWRJZ25vcmluZ0NhY2hlRGF0YTsKKyAgY29uZmlnLkhUVFBTaG91bGRVc2VQaXBlbGluaW5nID0gWUVTOworICBjb25maWcuSFRUUFNob3VsZFNldENvb2tpZXMgPSBOTzsKKyAgY29uZmlnLlVSTENhY2hlID0gbmlsOworICBjb25maWcuSFRUUEFkZGl0aW9uYWxIZWFkZXJzID0gQHtAIkNvbnRlbnQtVHlwZSI6dGhyaWZ0Q29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAiQWNjZXB0Ijp0aHJpZnRDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJVc2VyLUFnZW50IjpAIlRocmlmdC9Db2NvYSAoU2Vzc2lvbikifTsKK30KKworCistKGlkKSBpbml0V2l0aFNlc3Npb246KE5TVVJMU2Vzc2lvbiAqKXNlc3Npb24gVVJMOihOU1VSTCAqKXVybAoreworICBzZWxmID0gW3N1cGVyIGluaXRdOworICBpZiAoc2VsZikgeworICAgIF9zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBfdXJsID0gdXJsOworICB9CisKKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0oaWQ8VEFzeW5jVHJhbnNwb3J0PikgbmV3VHJhbnNwb3J0Cit7CisgIHJldHVybiBbW1RIVFRQU2Vzc2lvblRyYW5zcG9ydCBhbGxvY10gaW5pdFdpdGhGYWN0b3J5OnNlbGZdOworfQorCistKE5TVVJMU2Vzc2lvbkRhdGFUYXNrICopIHRhc2tXaXRoUmVxdWVzdDooTlNVUkxSZXF1ZXN0ICopcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkhhbmRsZXI6KHZvaWQgKF4pKE5TRGF0YSAqZGF0YSwgTlNVUkxSZXNwb25zZSAqcmVzcG9uc2UsIE5TRXJyb3IgKmVycm9yKSljb21wbGV0aW9uSGFuZGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIE5TVVJMU2Vzc2lvbkRhdGFUYXNrICpuZXdUYXNrID0gW19zZXNzaW9uIGRhdGFUYXNrV2l0aFJlcXVlc3Q6cmVxdWVzdCBjb21wbGV0aW9uSGFuZGxlcjpjb21wbGV0aW9uSGFuZGxlcl07CisgIGlmICghbmV3VGFzaykgeworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvclVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe05TTG9jYWxpemVkRGVzY3JpcHRpb25LZXk6QCJGYWlsZWQgdG8gY3JlYXRlIHNlc3Npb24gZGF0YSB0YXNrIn1dOworICAgIH0KKyAgICByZXR1cm4gbmlsOworICB9CisKKyAgcmV0dXJuIG5ld1Rhc2s7Cit9CisKKy0oTlNFcnJvciAqKSB2YWxpZGF0ZVJlc3BvbnNlOihOU0hUVFBVUkxSZXNwb25zZSAqKXJlc3BvbnNlIGRhdGE6KE5TRGF0YSAqKWRhdGEKK3sKKyAgaWYgKF9yZXNwb25zZVZhbGlkYXRlKSB7CisgICAgcmV0dXJuIF9yZXNwb25zZVZhbGlkYXRlKHJlc3BvbnNlLCBkYXRhKTsKKyAgfQorICByZXR1cm4gbmlsOworfQorCitAZW5kCisKKworCitAaW1wbGVtZW50YXRpb24gVEhUVFBTZXNzaW9uVHJhbnNwb3J0CisKKy0oaW5zdGFuY2V0eXBlKSBpbml0V2l0aEZhY3Rvcnk6KFRIVFRQU2Vzc2lvblRyYW5zcG9ydEZhY3RvcnkgKilmYWN0b3J5Cit7CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgIGlmIChzZWxmKSB7CisgICAgX2ZhY3RvcnkgPSBmYWN0b3J5OworICB9CisgIHJldHVybiBzZWxmOworfQorCistKEJPT0wpIHJlYWRBbGw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBnb3QgPSBbc2VsZiByZWFkQXZhaWw6b3V0QnVmZmVyIG9mZnNldDpvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOmxlbmd0aCBlcnJvcjplcnJvcl07CisgIGlmIChnb3QgIT0gbGVuZ3RoKSB7CisKKyAgICAvLyBSZXBvcnQgdW5kZXJmbG93IG9ubHkgaWYgcmVhZEF2YWlsIGRpZG4ndCByZXBvcnQgZXJyb3IgYWxyZWFkeQorICAgIGlmIChlcnJvciAmJiAhKmVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yRW5kT2ZGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86bmlsXTsKKyAgICB9CisKKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKFVJbnQzMikgcmVhZEF2YWlsOihVSW50OCAqKW91dEJ1ZmZlciBvZmZzZXQ6KFVJbnQzMilvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOihVSW50MzIpbWF4TGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBOU1VJbnRlZ2VyIGF2YWlsID0gX3Jlc3BvbnNlRGF0YS5sZW5ndGggLSBfcmVzcG9uc2VEYXRhT2Zmc2V0OworCisgIE5TUmFuZ2UgcmFuZ2U7CisgIHJhbmdlLmxvY2F0aW9uID0gX3Jlc3BvbnNlRGF0YU9mZnNldDsKKyAgcmFuZ2UubGVuZ3RoID0gTUlOKG1heExlbmd0aCwgYXZhaWwpOworCisgIFtfcmVzcG9uc2VEYXRhIGdldEJ5dGVzOm91dEJ1ZmZlcitvdXRCdWZmZXJPZmZzZXQgcmFuZ2U6cmFuZ2VdOworICBfcmVzcG9uc2VEYXRhT2Zmc2V0ICs9IHJhbmdlLmxlbmd0aDsKKworICByZXR1cm4gKFVJbnQzMilyYW5nZS5sZW5ndGg7Cit9CisKKy0oQk9PTCkgd3JpdGU6KGNvbnN0IFVJbnQ4ICopZGF0YSBvZmZzZXQ6KFVJbnQzMilvZmZzZXQgbGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIV9yZXF1ZXN0RGF0YSkgeworICAgIF9yZXF1ZXN0RGF0YSA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoQ2FwYWNpdHk6MjU2XTsKKyAgfQorCisgIFtfcmVxdWVzdERhdGEgYXBwZW5kQnl0ZXM6ZGF0YStvZmZzZXQgbGVuZ3RoOmxlbmd0aF07CisKKyAgcmV0dXJuIFlFUzsKK30KKworLSh2b2lkKSBmbHVzaFdpdGhDb21wbGV0aW9uOihUQXN5bmNDb21wbGV0aW9uQmxvY2spY29tcGxldGVkIGZhaWx1cmU6KFRBc3luY0ZhaWx1cmVCbG9jaylmYWlsdXJlCit7CisgIE5TRXJyb3IgKmVycm9yOworCisgIE5TTXV0YWJsZVVSTFJlcXVlc3QgKnJlcXVlc3QgPSBbW05TTXV0YWJsZVVSTFJlcXVlc3QgYWxsb2NdIGluaXRXaXRoVVJMOl9mYWN0b3J5LnVybF07CisgIHJlcXVlc3QuSFRUUE1ldGhvZCA9IEAiUE9TVCI7CisgIHJlcXVlc3QuSFRUUEJvZHkgPSBfcmVxdWVzdERhdGE7CisKKyAgX3JlcXVlc3REYXRhID0gbmlsOworCisgIE5TVVJMU2Vzc2lvbkRhdGFUYXNrICp0YXNrID0gW19mYWN0b3J5IHRhc2tXaXRoUmVxdWVzdDpyZXF1ZXN0IGNvbXBsZXRpb25IYW5kbGVyOl4oTlNEYXRhICpkYXRhLCBOU1VSTFJlc3BvbnNlICpyZXNwb25zZSwgTlNFcnJvciAqZXJyb3IpIHsKKworICAgIC8vIENoZWNrIHJlc3BvbnNlIHR5cGUKKyAgICBpZiAoIWVycm9yICYmICFbcmVzcG9uc2UgaXNLaW5kT2ZDbGFzczpOU0hUVFBVUkxSZXNwb25zZS5jbGFzc10pIHsKKworICAgICAgZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yVW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7VFRyYW5zcG9ydEVycm9ySHR0cEVycm9yS2V5OiBAKFRIdHRwVHJhbnNwb3J0RXJyb3JJbnZhbGlkUmVzcG9uc2UpfV07CisKKyAgICB9CisKKyAgICAvLyBDaGVjayBzdGF0dXMgY29kZQorICAgIE5TSFRUUFVSTFJlc3BvbnNlICpodHRwUmVzcG9uc2UgPSAoaWQpcmVzcG9uc2U7CisgICAgaWYgKCFlcnJvciAmJiBodHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSAhPSAyMDApIHsKKworICAgICAgVEh0dHBUcmFuc3BvcnRFcnJvciBjb2RlOworICAgICAgaWYgKGh0dHBSZXNwb25zZS5zdGF0dXNDb2RlID09IDQwMSkgeworICAgICAgICBjb2RlID0gVEh0dHBUcmFuc3BvcnRFcnJvckF1dGhlbnRpY2F0aW9uOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGNvZGUgPSBUSHR0cFRyYW5zcG9ydEVycm9ySW52YWxpZFN0YXR1czsKKyAgICAgIH0KKworICAgICAgZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JVbmtub3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe1RUcmFuc3BvcnRFcnJvckh0dHBFcnJvcktleTogQChjb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJzdGF0dXNDb2RlIjpAKGh0dHBSZXNwb25zZS5zdGF0dXNDb2RlKX1dOworICAgIH0KKworICAgIC8vIEFsbG93IGZhY3RvcnkgdG8gY2hlY2sKKyAgICBpZiAoIWVycm9yKSB7CisgICAgICBlcnJvciA9IFtfZmFjdG9yeSB2YWxpZGF0ZVJlc3BvbnNlOmh0dHBSZXNwb25zZSBkYXRhOmRhdGFdOworICAgIH0KKworICAgIF9yZXNwb25zZURhdGFPZmZzZXQgPSAwOworCisgICAgaWYgKGVycm9yKSB7CisKKyAgICAgIF9yZXNwb25zZURhdGEgPSBuaWw7CisKKyAgICAgIGZhaWx1cmUoZXJyb3IpOworCisgICAgfQorICAgIGVsc2UgeworCisgICAgICBpZiAoZGF0YSA9PSBuaWwpIHsKKyAgICAgICAgZGF0YSA9IFtOU0RhdGEgZGF0YV07CisgICAgICB9CisKKyAgICAgIF9yZXNwb25zZURhdGEgPSBkYXRhOworCisgICAgICBjb21wbGV0ZWQoc2VsZik7CisgICAgfQorCisgIH0gZXJyb3I6JmVycm9yXTsKKworICBpZiAoIXRhc2spIHsKKyAgICBmYWlsdXJlKGVycm9yKTsKKyAgICByZXR1cm47CisgIH0KKworICBbdGFzayByZXN1bWVdOworfQorCistKEJPT0wpIGZsdXNoOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBkaXNwYXRjaF9zZW1hcGhvcmVfdCBjb21wbGV0ZWQgPSBkaXNwYXRjaF9zZW1hcGhvcmVfY3JlYXRlKDApOworCisgIF9fYmxvY2sgQk9PTCByZXN1bHQ7CisgIF9fYmxvY2sgTlNFcnJvciAqaW50ZXJuYWxFcnJvcjsKKworICBbc2VsZiBmbHVzaFdpdGhDb21wbGV0aW9uOl4oaWQgPCBUQXN5bmNUcmFuc3BvcnQgPiB0cmFuc3BvcnQpIHsKKworICAgIHJlc3VsdCA9IFlFUzsKKworICAgIGRpc3BhdGNoX3NlbWFwaG9yZV9zaWduYWwoY29tcGxldGVkKTsKKworICB9IGZhaWx1cmU6XihOU0Vycm9yICplcnJvcikgeworCisgICAgaW50ZXJuYWxFcnJvciA9IGVycm9yOworCisgICAgcmVzdWx0ID0gTk87CisKKyAgICBkaXNwYXRjaF9zZW1hcGhvcmVfc2lnbmFsKGNvbXBsZXRlZCk7CisKKyAgfV07CisKKyAgZGlzcGF0Y2hfc2VtYXBob3JlX3dhaXQoY29tcGxldGVkLCBESVNQQVRDSF9USU1FX0ZPUkVWRVIpOworCisgIGlmIChlcnJvcikgeworICAgICplcnJvciA9IGludGVybmFsRXJyb3I7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzM1ZGFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBUcmFuc3BvcnQuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgorCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKK0BpbnRlcmZhY2UgVEhUVFBUcmFuc3BvcnQgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4KKworLShpZCkgaW5pdFdpdGhVUkw6KE5TVVJMICopYVVSTDsKKworLShpZCkgaW5pdFdpdGhVUkw6KE5TVVJMICopYVVSTAorICAgICAgICB1c2VyQWdlbnQ6KG51bGxhYmxlIE5TU3RyaW5nICopdXNlckFnZW50CisgICAgICAgICAgdGltZW91dDooaW50KXRpbWVvdXQ7CisKKy0odm9pZCkgc2V0VVJMOihOU1VSTCAqKWFVUkw7CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQVHJhbnNwb3J0Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFRyYW5zcG9ydC5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDQ2YzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFRyYW5zcG9ydC5tCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRIVFRQVHJhbnNwb3J0LmgiCisjaW1wb3J0ICJUVHJhbnNwb3J0RXJyb3IuaCIKKworCitAaW50ZXJmYWNlIFRIVFRQVHJhbnNwb3J0ICgpCisKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TVVJMICp1cmw7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU011dGFibGVVUkxSZXF1ZXN0ICpyZXF1ZXN0OworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNNdXRhYmxlRGF0YSAqcmVxdWVzdERhdGE7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU0RhdGEgKnJlc3BvbnNlRGF0YTsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBub25hdG9taWMpIE5TVUludGVnZXIgcmVzcG9uc2VEYXRhT2Zmc2V0OworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNTdHJpbmcgKnVzZXJBZ2VudDsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBub25hdG9taWMpIE5TVGltZUludGVydmFsIHRpbWVvdXQ7CisKK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gVEhUVFBUcmFuc3BvcnQKKworLSh2b2lkKSBzZXR1cFJlcXVlc3QKK3sKKyAgLy8gc2V0IHVwIG91ciByZXF1ZXN0IG9iamVjdCB0aGF0IHdlJ2xsIHVzZSBmb3IgZWFjaCByZXF1ZXN0CisgIF9yZXF1ZXN0ID0gW1tOU011dGFibGVVUkxSZXF1ZXN0IGFsbG9jXSBpbml0V2l0aFVSTDpfdXJsXTsKKyAgW19yZXF1ZXN0IHNldEhUVFBNZXRob2Q6QCJQT1NUIl07CisgIFtfcmVxdWVzdCBzZXRWYWx1ZTpAImFwcGxpY2F0aW9uL3gtdGhyaWZ0IiBmb3JIVFRQSGVhZGVyRmllbGQ6QCJDb250ZW50LVR5cGUiXTsKKyAgW19yZXF1ZXN0IHNldFZhbHVlOkAiYXBwbGljYXRpb24veC10aHJpZnQiIGZvckhUVFBIZWFkZXJGaWVsZDpAIkFjY2VwdCJdOworCisgIE5TU3RyaW5nICp1c2VyQWdlbnQgPSBfdXNlckFnZW50OworICBpZiAoIXVzZXJBZ2VudCkgeworICAgIHVzZXJBZ2VudCA9IEAiVGhyaWZ0L0NvY29hIjsKKyAgfQorICBbX3JlcXVlc3Qgc2V0VmFsdWU6dXNlckFnZW50IGZvckhUVFBIZWFkZXJGaWVsZDpAIlVzZXItQWdlbnQiXTsKKworICBbX3JlcXVlc3Qgc2V0Q2FjaGVQb2xpY3k6TlNVUkxSZXF1ZXN0UmVsb2FkSWdub3JpbmdDYWNoZURhdGFdOworICBpZiAoX3RpbWVvdXQpIHsKKyAgICBbX3JlcXVlc3Qgc2V0VGltZW91dEludGVydmFsOl90aW1lb3V0XTsKKyAgfQorfQorCisKKy0oaWQpIGluaXRXaXRoVVJMOihOU1VSTCAqKWFVUkwKK3sKKyAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVVJMOmFVUkwKKyAgICAgICAgICAgICAgICAgdXNlckFnZW50Om5pbAorICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6MF07Cit9CisKKworLShpZCkgaW5pdFdpdGhVUkw6KE5TVVJMICopYVVSTAorICAgICAgICB1c2VyQWdlbnQ6KE5TU3RyaW5nICopYVVzZXJBZ2VudAorICAgICAgICAgIHRpbWVvdXQ6KGludClhVGltZW91dAoreworICBzZWxmID0gW3N1cGVyIGluaXRdOworICBpZiAoIXNlbGYpIHsKKyAgICByZXR1cm4gbmlsOworICB9CisKKyAgX3RpbWVvdXQgPSBhVGltZW91dDsKKyAgX3VzZXJBZ2VudCA9IGFVc2VyQWdlbnQ7CisgIF91cmwgPSBhVVJMOworCisgIFtzZWxmIHNldHVwUmVxdWVzdF07CisKKyAgLy8gY3JlYXRlIG91ciByZXF1ZXN0IGRhdGEgYnVmZmVyCisgIF9yZXF1ZXN0RGF0YSA9IFtbTlNNdXRhYmxlRGF0YSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eToxMDI0XTsKKworICByZXR1cm4gc2VsZjsKK30KKworLSh2b2lkKSBzZXRVUkw6KE5TVVJMICopYVVSTAoreworICBfdXJsID0gYVVSTDsKKworICBbc2VsZiBzZXR1cFJlcXVlc3RdOworfQorCistKEJPT0wpIHJlYWRBbGw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBnb3QgPSBbc2VsZiByZWFkQXZhaWw6b3V0QnVmZmVyIG9mZnNldDpvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOmxlbmd0aCBlcnJvcjplcnJvcl07CisgIGlmIChnb3QgIT0gbGVuZ3RoKSB7CisKKyAgICAvLyBSZXBvcnQgdW5kZXJmbG93IG9ubHkgaWYgcmVhZEF2YWlsIGRpZG4ndCByZXBvcnQgZXJyb3IgYWxyZWFkeQorICAgIGlmIChlcnJvciAmJiAhKmVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yRW5kT2ZGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86bmlsXTsKKyAgICB9CisKKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKFVJbnQzMikgcmVhZEF2YWlsOihVSW50OCAqKW91dEJ1ZmZlciBvZmZzZXQ6KFVJbnQzMilvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOihVSW50MzIpbWF4TGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBOU1VJbnRlZ2VyIGF2YWlsID0gX3Jlc3BvbnNlRGF0YS5sZW5ndGggLSBfcmVzcG9uc2VEYXRhT2Zmc2V0OworCisgIE5TUmFuZ2UgcmFuZ2U7CisgIHJhbmdlLmxvY2F0aW9uID0gX3Jlc3BvbnNlRGF0YU9mZnNldDsKKyAgcmFuZ2UubGVuZ3RoID0gTUlOKG1heExlbmd0aCwgYXZhaWwpOworCisgIFtfcmVzcG9uc2VEYXRhIGdldEJ5dGVzOm91dEJ1ZmZlcitvdXRCdWZmZXJPZmZzZXQgcmFuZ2U6cmFuZ2VdOworICBfcmVzcG9uc2VEYXRhT2Zmc2V0ICs9IHJhbmdlLmxlbmd0aDsKKworICByZXR1cm4gKFVJbnQzMilyYW5nZS5sZW5ndGg7Cit9CisKKy0oQk9PTCkgd3JpdGU6KGNvbnN0IFVJbnQ4ICopZGF0YSBvZmZzZXQ6KFVJbnQzMilvZmZzZXQgbGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBbX3JlcXVlc3REYXRhIGFwcGVuZEJ5dGVzOmRhdGErb2Zmc2V0IGxlbmd0aDpsZW5ndGhdOworCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgZmx1c2g6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFtfcmVxdWVzdCBzZXRIVFRQQm9keTpfcmVxdWVzdERhdGFdOworCisgIF9yZXNwb25zZURhdGFPZmZzZXQgPSAwOworCisgIC8vIG1ha2UgdGhlIEhUVFAgcmVxdWVzdAorICBOU1VSTFJlc3BvbnNlICpyZXNwb25zZTsKKyAgX3Jlc3BvbnNlRGF0YSA9IFtOU1VSTENvbm5lY3Rpb24gc2VuZFN5bmNocm9ub3VzUmVxdWVzdDpfcmVxdWVzdCByZXR1cm5pbmdSZXNwb25zZTomcmVzcG9uc2UgZXJyb3I6ZXJyb3JdOworICBpZiAoIV9yZXNwb25zZURhdGEpIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBbX3JlcXVlc3REYXRhIHNldExlbmd0aDowXTsKKworICBpZiAoIVtyZXNwb25zZSBpc0tpbmRPZkNsYXNzOk5TSFRUUFVSTFJlc3BvbnNlLmNsYXNzXSkgeworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvclVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe1RUcmFuc3BvcnRFcnJvckh0dHBFcnJvcktleTogQChUSHR0cFRyYW5zcG9ydEVycm9ySW52YWxpZFJlc3BvbnNlKX1dOworICAgIH0KKyAgICByZXR1cm4gTk87CisgIH0KKworICBOU0hUVFBVUkxSZXNwb25zZSAqaHR0cFJlc3BvbnNlID0gKE5TSFRUUFVSTFJlc3BvbnNlICopcmVzcG9uc2U7CisgIGlmIChbaHR0cFJlc3BvbnNlIHN0YXR1c0NvZGVdICE9IDIwMCkgeworICAgIGlmIChlcnJvcikgeworCisgICAgICBUSHR0cFRyYW5zcG9ydEVycm9yIGNvZGU7CisgICAgICBpZiAoaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUgPT0gNDAxKSB7CisgICAgICAgIGNvZGUgPSBUSHR0cFRyYW5zcG9ydEVycm9yQXV0aGVudGljYXRpb247CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgY29kZSA9IFRIdHRwVHJhbnNwb3J0RXJyb3JJbnZhbGlkU3RhdHVzOworICAgICAgfQorCisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yVW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7VFRyYW5zcG9ydEVycm9ySHR0cEVycm9yS2V5OiBAKGNvZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJzdGF0dXNDb2RlIjpAKGh0dHBSZXNwb25zZS5zdGF0dXNDb2RlKX1dOworICAgIH0KKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmgKaW5kZXggZmE0ZDM3MS4uNjI0OWQzMiAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5oCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuaApAQCAtMjAsMTAgKzIwLDE4IEBACiAjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KICNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKIAotQGludGVyZmFjZSBUTWVtb3J5QnVmZmVyIDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+IHsKLQlOU011dGFibGVEYXRhICptQnVmZmVyOwotCU5TVUludGVnZXIgbU9mZnNldDsKLX0KLS0gKGlkKWluaXRXaXRoRGF0YTooTlNEYXRhICopZGF0YTsKLS0gKE5TRGF0YSAqKWdldEJ1ZmZlcjsKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKworQGludGVyZmFjZSBUTWVtb3J5QnVmZmVyIDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+CisKKy0oTlNEYXRhICopIGJ1ZmZlcjsKKworLShpZCkgaW5pdFdpdGhEYXRhOihOU0RhdGEgKilkYXRhOworCistKGlkKSBpbml0V2l0aERhdGFOb0NvcHk6KE5TTXV0YWJsZURhdGEgKilkYXRhOworCiBAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLm0KaW5kZXggODY5MDEwYS4uZWMxOWNjOCAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5tCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIubQpAQCAtMTgsNTQgKzE4LDEwNCBAQAogICovCiAKICNpbXBvcnQgIlRNZW1vcnlCdWZmZXIuaCIKLSNpbXBvcnQgIlRUcmFuc3BvcnRFeGNlcHRpb24uaCIKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgorCiAKICNkZWZpbmUgR0FSQkFHRV9CVUZGRVJfU0laRSA0MDk2IC8vIDRLaUIKIAorCitAaW50ZXJmYWNlIFRNZW1vcnlCdWZmZXIgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU011dGFibGVEYXRhICpidWZmZXI7CitAcHJvcGVydHkoYXNzaWduLCBub25hdG9taWMpIFVJbnQzMiBidWZmZXJPZmZzZXQ7CisKK0BlbmQKKworCiBAaW1wbGVtZW50YXRpb24gVE1lbW9yeUJ1ZmZlcgotLSAoaWQpaW5pdCB7Ci0JaWYgKHNlbGYgPSBbc3VwZXIgaW5pdF0pIHsKLQkJbUJ1ZmZlciA9IFtbTlNNdXRhYmxlRGF0YSBhbGxvY10gaW5pdF07Ci0JCW1PZmZzZXQgPSAwOwotCX0KLQlyZXR1cm4gc2VsZjsKKworLShpZCkgaW5pdAoreworICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pKSB7CisgICAgX2J1ZmZlciA9IFtOU011dGFibGVEYXRhIG5ld107CisgICAgX2J1ZmZlck9mZnNldCA9IDA7CisgIH0KKyAgcmV0dXJuIHNlbGY7CiB9CiAKLS0gKGlkKWluaXRXaXRoRGF0YTooTlNEYXRhICopZGF0YSB7Ci0JaWYgKHNlbGYgPSBbc3VwZXIgaW5pdF0pIHsKLQkJbUJ1ZmZlciA9IFtkYXRhIG11dGFibGVDb3B5XTsKLQkJbU9mZnNldCA9IDA7Ci0JfQotCXJldHVybiBzZWxmOworLShpZCkgaW5pdFdpdGhEYXRhOihOU0RhdGEgKilkYXRhCit7CisgIGlmIChzZWxmID0gW3N1cGVyIGluaXRdKSB7CisgICAgX2J1ZmZlciA9IFtkYXRhIG11dGFibGVDb3B5XTsKKyAgICBfYnVmZmVyT2Zmc2V0ID0gMDsKKyAgfQorICByZXR1cm4gc2VsZjsKIH0KIAotLSAoaW50KXJlYWRBbGw6KHVpbnQ4X3QgKilidWYgb2Zmc2V0OihpbnQpb2ZmIGxlbmd0aDooaW50KWxlbiB7Ci0JaWYgKFttQnVmZmVyIGxlbmd0aF0gLSBtT2Zmc2V0IDwgbGVuKSB7Ci0JCUB0aHJvdyBbVFRyYW5zcG9ydEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoUmVhc29uOkAiTm90IGVub3VnaCBieXRlcyByZW1haW4gaW4gYnVmZmVyIl07Ci0JfQotCVttQnVmZmVyIGdldEJ5dGVzOmJ1ZiByYW5nZTpOU01ha2VSYW5nZShtT2Zmc2V0LCBsZW4pXTsKLQltT2Zmc2V0ICs9IGxlbjsKLQlpZiAobU9mZnNldCA+PSBHQVJCQUdFX0JVRkZFUl9TSVpFKSB7Ci0JCVttQnVmZmVyIHJlcGxhY2VCeXRlc0luUmFuZ2U6TlNNYWtlUmFuZ2UoMCwgbU9mZnNldCkgd2l0aEJ5dGVzOk5VTEwgbGVuZ3RoOjBdOwotCQltT2Zmc2V0ID0gMDsKLQl9Ci0JcmV0dXJuIGxlbjsKKy0oaWQpIGluaXRXaXRoRGF0YU5vQ29weTooTlNNdXRhYmxlRGF0YSAqKWRhdGEKK3sKKyAgaWYgKHNlbGYgPSBbc3VwZXIgaW5pdF0pIHsKKyAgICBfYnVmZmVyID0gZGF0YTsKKyAgICBfYnVmZmVyT2Zmc2V0ID0gMDsKKyAgfQorICByZXR1cm4gc2VsZjsKIH0KIAotLSAodm9pZCl3cml0ZTooY29uc3QgdWludDhfdCAqKWRhdGEgb2Zmc2V0Oih1bnNpZ25lZCBpbnQpb2Zmc2V0IGxlbmd0aDoodW5zaWduZWQgaW50KWxlbmd0aCB7Ci0JW21CdWZmZXIgYXBwZW5kQnl0ZXM6ZGF0YStvZmZzZXQgbGVuZ3RoOmxlbmd0aF07CistKEJPT0wpIHJlYWRBbGw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBnb3QgPSBbc2VsZiByZWFkQXZhaWw6b3V0QnVmZmVyIG9mZnNldDpvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOmxlbmd0aCBlcnJvcjplcnJvcl07CisgIGlmIChnb3QgIT0gbGVuZ3RoKSB7CisKKyAgICAvLyBSZXBvcnQgdW5kZXJmbG93IG9ubHkgaWYgcmVhZEF2YWlsIGRpZG4ndCByZXBvcnQgZXJyb3IgYWxyZWFkeQorICAgIGlmIChlcnJvciAmJiAhKmVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yRW5kT2ZGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86bmlsXTsKKyAgICB9CisKKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKWZsdXNoIHsKLQkvLyBub29wCistKFVJbnQzMikgcmVhZEF2YWlsOihVSW50OCAqKW91dEJ1ZmZlciBvZmZzZXQ6KFVJbnQzMilvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOihVSW50MzIpbWF4TGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgYXZhaWwgPSAoVUludDMyKV9idWZmZXIubGVuZ3RoIC0gX2J1ZmZlck9mZnNldDsKKyAgaWYgKGF2YWlsID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIE5TUmFuZ2UgcmFuZ2U7CisgIHJhbmdlLmxvY2F0aW9uID0gX2J1ZmZlck9mZnNldDsKKyAgcmFuZ2UubGVuZ3RoID0gTUlOKG1heExlbmd0aCwgYXZhaWwpOworCisgIFtfYnVmZmVyIGdldEJ5dGVzOm91dEJ1ZmZlciArIG91dEJ1ZmZlck9mZnNldCByYW5nZTpyYW5nZV07CisgIF9idWZmZXJPZmZzZXQgKz0gcmFuZ2UubGVuZ3RoOworCisgIGlmIChfYnVmZmVyT2Zmc2V0ID49IEdBUkJBR0VfQlVGRkVSX1NJWkUpIHsKKyAgICBbX2J1ZmZlciByZXBsYWNlQnl0ZXNJblJhbmdlOk5TTWFrZVJhbmdlKDAsIF9idWZmZXJPZmZzZXQpIHdpdGhCeXRlczpOVUxMIGxlbmd0aDowXTsKKyAgICBfYnVmZmVyT2Zmc2V0ID0gMDsKKyAgfQorCisgIHJldHVybiAoVUludDMyKXJhbmdlLmxlbmd0aDsKIH0KIAotLSAoTlNEYXRhICopZ2V0QnVmZmVyIHsKLQlyZXR1cm4gW1ttQnVmZmVyIGNvcHldIGF1dG9yZWxlYXNlXTsKKy0oQk9PTCkgd3JpdGU6KGNvbnN0IFVJbnQ4ICopaW5CdWZmZXIgb2Zmc2V0OihVSW50MzIpaW5CdWZmZXJPZmZzZXQgbGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBbX2J1ZmZlciBhcHBlbmRCeXRlczppbkJ1ZmZlciArIGluQnVmZmVyT2Zmc2V0IGxlbmd0aDpsZW5ndGhdOworCisgIHJldHVybiBZRVM7CiB9CiAKLS0gKHZvaWQpZGVhbGxvYyB7Ci0JW21CdWZmZXIgcmVsZWFzZV07Ci0JW3N1cGVyIGRlYWxsb2NdOworLShOU0RhdGEgKikgYnVmZmVyCit7CisgIHJldHVybiBfYnVmZmVyOwogfQorCistKEJPT0wpIGZsdXNoOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorCiBAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNGaWxlSGFuZGxlVHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNGaWxlSGFuZGxlVHJhbnNwb3J0LmgKaW5kZXggYmEyYTIwOS4uZGI2ZWRmMyAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5oCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQuaApAQCAtMjEsMTUgKzIxLDE4IEBACiAjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KICNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKIAotQGludGVyZmFjZSBUTlNGaWxlSGFuZGxlVHJhbnNwb3J0IDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+IHsKLSAgTlNGaWxlSGFuZGxlICogbUlucHV0RmlsZUhhbmRsZTsKLSAgTlNGaWxlSGFuZGxlICogbU91dHB1dEZpbGVIYW5kbGU7Ci19CitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgogCi0tIChpZCkgaW5pdFdpdGhGaWxlSGFuZGxlOiAoTlNGaWxlSGFuZGxlICopIGZpbGVIYW5kbGU7CiAKLS0gKGlkKSBpbml0V2l0aElucHV0RmlsZUhhbmRsZTogKE5TRmlsZUhhbmRsZSAqKSBpbnB1dEZpbGVIYW5kbGUKLSAgICAgICAgICAgICAgb3V0cHV0RmlsZUhhbmRsZTogKE5TRmlsZUhhbmRsZSAqKSBvdXRwdXRGaWxlSGFuZGxlOworQGludGVyZmFjZSBUTlNGaWxlSGFuZGxlVHJhbnNwb3J0IDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+CisKKy0oaWQpIGluaXRXaXRoRmlsZUhhbmRsZTooTlNGaWxlSGFuZGxlICopZmlsZUhhbmRsZTsKKworLShpZCkgaW5pdFdpdGhJbnB1dEZpbGVIYW5kbGU6KE5TRmlsZUhhbmRsZSAqKWlucHV0RmlsZUhhbmRsZQorICAgICAgICAgICAgIG91dHB1dEZpbGVIYW5kbGU6KE5TRmlsZUhhbmRsZSAqKW91dHB1dEZpbGVIYW5kbGU7CiAKIAogQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5tCmluZGV4IGIyMTgyMTguLmM5MDdmODcgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQubQorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNGaWxlSGFuZGxlVHJhbnNwb3J0Lm0KQEAgLTE5LDczICsxOSwxMDAgQEAKIAogCiAjaW1wb3J0ICJUTlNGaWxlSGFuZGxlVHJhbnNwb3J0LmgiCi0jaW1wb3J0ICJUVHJhbnNwb3J0RXhjZXB0aW9uLmgiCisjaW1wb3J0ICJUVHJhbnNwb3J0RXJyb3IuaCIKKworCitAaW50ZXJmYWNlIFROU0ZpbGVIYW5kbGVUcmFuc3BvcnQgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU0ZpbGVIYW5kbGUgKmlucHV0RmlsZUhhbmRsZTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNGaWxlSGFuZGxlICpvdXRwdXRGaWxlSGFuZGxlOworCitAZW5kCiAKIAogQGltcGxlbWVudGF0aW9uIFROU0ZpbGVIYW5kbGVUcmFuc3BvcnQKIAotLSAoaWQpIGluaXRXaXRoRmlsZUhhbmRsZTogKE5TRmlsZUhhbmRsZSAqKSBmaWxlSGFuZGxlCistKGlkKSBpbml0V2l0aEZpbGVIYW5kbGU6KE5TRmlsZUhhbmRsZSAqKWZpbGVIYW5kbGUKIHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoSW5wdXRGaWxlSGFuZGxlOiBmaWxlSGFuZGxlCi0gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZUhhbmRsZTogZmlsZUhhbmRsZV07CisgIHJldHVybiBbc2VsZiBpbml0V2l0aElucHV0RmlsZUhhbmRsZTpmaWxlSGFuZGxlCisgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZUhhbmRsZTpmaWxlSGFuZGxlXTsKIH0KIAogCi0tIChpZCkgaW5pdFdpdGhJbnB1dEZpbGVIYW5kbGU6IChOU0ZpbGVIYW5kbGUgKikgaW5wdXRGaWxlSGFuZGxlCi0gICAgICAgICAgICAgIG91dHB1dEZpbGVIYW5kbGU6IChOU0ZpbGVIYW5kbGUgKikgb3V0cHV0RmlsZUhhbmRsZQorLShpZCkgaW5pdFdpdGhJbnB1dEZpbGVIYW5kbGU6KE5TRmlsZUhhbmRsZSAqKWFJbnB1dEZpbGVIYW5kbGUKKyAgICAgICAgICAgICBvdXRwdXRGaWxlSGFuZGxlOihOU0ZpbGVIYW5kbGUgKilhT3V0cHV0RmlsZUhhbmRsZQogewogICBzZWxmID0gW3N1cGVyIGluaXRdOwotCi0gIG1JbnB1dEZpbGVIYW5kbGUgPSBbaW5wdXRGaWxlSGFuZGxlIHJldGFpbl07Ci0gIG1PdXRwdXRGaWxlSGFuZGxlID0gW291dHB1dEZpbGVIYW5kbGUgcmV0YWluXTsKLQorICBpZiAoc2VsZikgeworICAgIF9pbnB1dEZpbGVIYW5kbGUgPSBhSW5wdXRGaWxlSGFuZGxlOworICAgIF9vdXRwdXRGaWxlSGFuZGxlID0gYU91dHB1dEZpbGVIYW5kbGU7CisgIH0KICAgcmV0dXJuIHNlbGY7CiB9CiAKIAotLSAodm9pZCkgZGVhbGxvYyB7Ci0gIFttSW5wdXRGaWxlSGFuZGxlIHJlbGVhc2VdOwotICBbbU91dHB1dEZpbGVIYW5kbGUgcmVsZWFzZV07Ci0gIFtzdXBlciBkZWFsbG9jXTsKKy0oQk9PTCkgcmVhZEFsbDooVUludDggKilidWYgb2Zmc2V0OihVSW50MzIpb2ZmIGxlbmd0aDooVUludDMyKWxlbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIGdvdCA9IDA7CisgIHdoaWxlIChnb3QgPCBsZW4pIHsKKworICAgIE5TRGF0YSAqZCA9IFtfaW5wdXRGaWxlSGFuZGxlIHJlYWREYXRhT2ZMZW5ndGg6bGVuLWdvdF07CisgICAgaWYgKGQubGVuZ3RoID09IDApIHsKKyAgICAgIGlmIChlcnJvcikgeworICAgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JFbmRPZkZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOm5pbF07CisgICAgICB9CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgW2QgZ2V0Qnl0ZXM6YnVmK2dvdCBsZW5ndGg6ZC5sZW5ndGhdOworICAgIGdvdCArPSBkLmxlbmd0aDsKKyAgfQorICByZXR1cm4gWUVTOwogfQogCiAKLS0gKGludCkgcmVhZEFsbDogKHVpbnQ4X3QgKikgYnVmIG9mZnNldDogKGludCkgb2ZmIGxlbmd0aDogKGludCkgbGVuCistKFVJbnQzMikgcmVhZEF2YWlsOihVSW50OCAqKWJ1ZiBvZmZzZXQ6KFVJbnQzMilvZmYgbWF4TGVuZ3RoOihVSW50MzIpbGVuIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBpbnQgZ290ID0gMDsKKyAgVUludDMyIGdvdCA9IDA7CiAgIHdoaWxlIChnb3QgPCBsZW4pIHsKLSAgICBOU0RhdGEgKiBkID0gW21JbnB1dEZpbGVIYW5kbGUgcmVhZERhdGFPZkxlbmd0aDogbGVuLWdvdF07Ci0gICAgaWYgKFtkIGxlbmd0aF0gPT0gMCkgewotICAgICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRUcmFuc3BvcnRFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBAIkNhbm5vdCByZWFkLiBObyBtb3JlIGRhdGEuIl07CisKKyAgICBOU0RhdGEgKmQgPSBbX2lucHV0RmlsZUhhbmRsZSByZWFkRGF0YU9mTGVuZ3RoOmxlbi1nb3RdOworICAgIGlmIChkLmxlbmd0aCA9PSAwKSB7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgW2QgZ2V0Qnl0ZXM6IGJ1Zitnb3RdOwotICAgIGdvdCArPSBbZCBsZW5ndGhdOworCisgICAgW2QgZ2V0Qnl0ZXM6YnVmK2dvdCBsZW5ndGg6ZC5sZW5ndGhdOworICAgIGdvdCArPSBkLmxlbmd0aDsKICAgfQogICByZXR1cm4gZ290OwogfQogCiAKLS0gKHZvaWQpIHdyaXRlOiAodWludDhfdCAqKSBkYXRhIG9mZnNldDogKHVuc2lnbmVkIGludCkgb2Zmc2V0IGxlbmd0aDogKHVuc2lnbmVkIGludCkgbGVuZ3RoCistKEJPT0wpIHdyaXRlOihjb25zdCBVSW50OCAqKWRhdGEgb2Zmc2V0OihVSW50MzIpb2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgTlNEYXRhICogZGF0YU9iamVjdCA9IFtbTlNEYXRhIGFsbG9jXSBpbml0V2l0aEJ5dGVzTm9Db3B5OiBkYXRhK29mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IGxlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlV2hlbkRvbmU6IE5PXTsKKyAgdm9pZCAqcG9zID0gKHZvaWQgKilkYXRhICsgb2Zmc2V0OwogCiAgIEB0cnkgewotICAgIFttT3V0cHV0RmlsZUhhbmRsZSB3cml0ZURhdGE6IGRhdGFPYmplY3RdOwotICB9IEBjYXRjaCAoTlNFeGNlcHRpb24gKiBlKSB7Ci0gICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRUcmFuc3BvcnRFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCIlczogVW5hYmxlIHRvIHdyaXRlIGRhdGE6ICVAIiwgX19QUkVUVFlfRlVOQ1RJT05fXywgZV1dOworICAgIFtfb3V0cHV0RmlsZUhhbmRsZSB3cml0ZURhdGE6W05TRGF0YSBkYXRhV2l0aEJ5dGVzTm9Db3B5OnBvcyBsZW5ndGg6bGVuZ3RoIGZyZWVXaGVuRG9uZTpOT11dOworICB9CisgIEBjYXRjaCAoTlNFeGNlcHRpb24gKmUpIHsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JOb3RPcGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHt9XTsKKyAgICB9CisgICAgcmV0dXJuIE5POwogICB9CiAKLSAgW2RhdGFPYmplY3QgcmVsZWFzZV07CisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgZmx1c2gKKy0oQk9PTCkgZmx1c2g6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0KKyAgcmV0dXJuIFlFUzsKIH0KIAogQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNTdHJlYW1UcmFuc3BvcnQuaAppbmRleCBkN2JlNDBiLi41NGM0ODg0IDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNTdHJlYW1UcmFuc3BvcnQuaAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNTdHJlYW1UcmFuc3BvcnQuaApAQCAtMjAsMTkgKzIwLDI0IEBACiAjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KICNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKIAotQGludGVyZmFjZSBUTlNTdHJlYW1UcmFuc3BvcnQgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4gewotICBOU0lucHV0U3RyZWFtICogbUlucHV0OwotICBOU091dHB1dFN0cmVhbSAqIG1PdXRwdXQ7Ci19CitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgogCi0tIChpZCkgaW5pdFdpdGhJbnB1dFN0cmVhbTogKE5TSW5wdXRTdHJlYW0gKikgaW5wdXQKLSAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtOiAoTlNPdXRwdXRTdHJlYW0gKikgb3V0cHV0OwogCi0tIChpZCkgaW5pdFdpdGhJbnB1dFN0cmVhbTogKE5TSW5wdXRTdHJlYW0gKikgaW5wdXQ7CitAaW50ZXJmYWNlIFROU1N0cmVhbVRyYW5zcG9ydCA6IE5TT2JqZWN0IDxUVHJhbnNwb3J0PgogCi0tIChpZCkgaW5pdFdpdGhPdXRwdXRTdHJlYW06IChOU091dHB1dFN0cmVhbSAqKSBvdXRwdXQ7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU0lucHV0U3RyZWFtICppbnB1dDsKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TT3V0cHV0U3RyZWFtICpvdXRwdXQ7CisKKy0oaWQpIGluaXRXaXRoSW5wdXRTdHJlYW06KG51bGxhYmxlIE5TSW5wdXRTdHJlYW0gKilpbnB1dAorICAgICAgICAgICAgIG91dHB1dFN0cmVhbToobnVsbGFibGUgTlNPdXRwdXRTdHJlYW0gKilvdXRwdXQ7CisKKy0oaWQpIGluaXRXaXRoSW5wdXRTdHJlYW06KE5TSW5wdXRTdHJlYW0gKilpbnB1dDsKKworLShpZCkgaW5pdFdpdGhPdXRwdXRTdHJlYW06KE5TT3V0cHV0U3RyZWFtICopb3V0cHV0OworCistKHZvaWQpIGNsb3NlOwogCiBAZW5kCiAKIAotCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU1N0cmVhbVRyYW5zcG9ydC5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0Lm0KaW5kZXggMWQ0Y2ZlZS4uMThjNDFkMyAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0Lm0KKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0Lm0KQEAgLTE4LDcyICsxOCwxMzYgQEAKICAqLwogCiAjaW1wb3J0ICJUTlNTdHJlYW1UcmFuc3BvcnQuaCIKLSNpbXBvcnQgIlRUcmFuc3BvcnRFeGNlcHRpb24uaCIKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgorCisKK0BpbnRlcmZhY2UgVE5TU3RyZWFtVHJhbnNwb3J0ICgpCitAZW5kCiAKIAogQGltcGxlbWVudGF0aW9uIFROU1N0cmVhbVRyYW5zcG9ydAogCi0tIChpZCkgaW5pdFdpdGhJbnB1dFN0cmVhbTogKE5TSW5wdXRTdHJlYW0gKikgaW5wdXQKLSAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtOiAoTlNPdXRwdXRTdHJlYW0gKikgb3V0cHV0CistKGlkKSBpbml0V2l0aElucHV0U3RyZWFtOihOU0lucHV0U3RyZWFtICopaW5wdXQKKyAgICAgICAgICAgICBvdXRwdXRTdHJlYW06KE5TT3V0cHV0U3RyZWFtICopb3V0cHV0CiB7Ci0gIFtzdXBlciBpbml0XTsKLSAgbUlucHV0ID0gW2lucHV0IHJldGFpbl07Ci0gIG1PdXRwdXQgPSBbb3V0cHV0IHJldGFpbl07CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgIGlmIChzZWxmKSB7CisgICAgX2lucHV0ID0gaW5wdXQ7CisgICAgX291dHB1dCA9IG91dHB1dDsKKyAgfQogICByZXR1cm4gc2VsZjsKIH0KIAotLSAoaWQpIGluaXRXaXRoSW5wdXRTdHJlYW06IChOU0lucHV0U3RyZWFtICopIGlucHV0CistKGlkKSBpbml0V2l0aElucHV0U3RyZWFtOihOU0lucHV0U3RyZWFtICopaW5wdXQKIHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoSW5wdXRTdHJlYW06IGlucHV0IG91dHB1dFN0cmVhbTogbmlsXTsKKyAgcmV0dXJuIFtzZWxmIGluaXRXaXRoSW5wdXRTdHJlYW06aW5wdXQgb3V0cHV0U3RyZWFtOm5pbF07CiB9CiAKLS0gKGlkKSBpbml0V2l0aE91dHB1dFN0cmVhbTogKE5TT3V0cHV0U3RyZWFtICopIG91dHB1dAorLShpZCkgaW5pdFdpdGhPdXRwdXRTdHJlYW06KE5TT3V0cHV0U3RyZWFtICopb3V0cHV0CiB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aElucHV0U3RyZWFtOiBuaWwgb3V0cHV0U3RyZWFtOiBvdXRwdXRdOworICByZXR1cm4gW3NlbGYgaW5pdFdpdGhJbnB1dFN0cmVhbTpuaWwgb3V0cHV0U3RyZWFtOm91dHB1dF07CiB9CiAKLS0gKHZvaWQpIGRlYWxsb2MKKy0odm9pZCkgZGVhbGxvYwogewotICBbbUlucHV0IHJlbGVhc2VdOwotICBbbU91dHB1dCByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOworICBbc2VsZiBjbG9zZV07CiB9CiAKLQotLSAoaW50KSByZWFkQWxsOiAodWludDhfdCAqKSBidWYgb2Zmc2V0OiAoaW50KSBvZmYgbGVuZ3RoOiAoaW50KSBsZW4KKy0oQk9PTCkgcmVhZEFsbDooVUludDggKilidWYgb2Zmc2V0OihVSW50MzIpb2ZmIGxlbmd0aDooVUludDMyKWxlbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50IGdvdCA9IDA7Ci0gIGludCByZXQgPSAwOworICBVSW50MzIgZ290ID0gMDsKICAgd2hpbGUgKGdvdCA8IGxlbikgewotICAgIHJldCA9IFttSW5wdXQgcmVhZDogYnVmK29mZitnb3QgbWF4TGVuZ3RoOiBsZW4tZ290XTsKLSAgICBpZiAocmV0IDw9IDApIHsKLSAgICAgIEB0aHJvdyBbVFRyYW5zcG9ydEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoUmVhc29uOiBAIkNhbm5vdCByZWFkLiBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkLiJdOworCisgICAgVUludDMyIHJlYWQgPSAoVUludDMyKVtfaW5wdXQgcmVhZDpidWYrb2ZmK2dvdCBtYXhMZW5ndGg6bGVuLWdvdF07CisgICAgaWYgKHJlYWQgPD0gMCkgeworICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvck5vdE9wZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7fV07CisgICAgICB9CisgICAgICByZXR1cm4gTk87CiAgICAgfQotICAgIGdvdCArPSByZXQ7CisKKyAgICBnb3QgKz0gcmVhZDsKICAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKworLShVSW50MzIpIHJlYWRBdmFpbDooVUludDggKilidWYgb2Zmc2V0OihVSW50MzIpb2ZmIG1heExlbmd0aDooVUludDMyKWxlbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIGdvdCA9IDA7CisgIHdoaWxlIChnb3QgPCBsZW4pIHsKKworICAgIFVJbnQzMiByZWFkID0gKFVJbnQzMilbX2lucHV0IHJlYWQ6YnVmK29mZitnb3QgbWF4TGVuZ3RoOmxlbi1nb3RdOworICAgIGlmIChyZWFkIDw9IDApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGdvdCArPSByZWFkOworICB9CisKICAgcmV0dXJuIGdvdDsKIH0KIAogCi0tICh2b2lkKSB3cml0ZTogKHVpbnQ4X3QgKikgZGF0YSBvZmZzZXQ6ICh1bnNpZ25lZCBpbnQpIG9mZnNldCBsZW5ndGg6ICh1bnNpZ25lZCBpbnQpIGxlbmd0aAorLShCT09MKSB3cml0ZTooY29uc3QgVUludDggKilkYXRhIG9mZnNldDooVUludDMyKW9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGludCBnb3QgPSAwOwotICBpbnQgcmVzdWx0ID0gMDsKKyAgVUludDMyIGdvdCA9IDA7CisgIE5TSW50ZWdlciB0b3RhbCA9IDA7CiAgIHdoaWxlIChnb3QgPCBsZW5ndGgpIHsKLSAgICByZXN1bHQgPSBbbU91dHB1dCB3cml0ZTogZGF0YStvZmZzZXQrZ290IG1heExlbmd0aDogbGVuZ3RoLWdvdF07Ci0gICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhSZWFzb246IEAiRXJyb3Igd3JpdGluZyB0byB0cmFuc3BvcnQgb3V0cHV0IHN0cmVhbS4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogW21PdXRwdXQgc3RyZWFtRXJyb3JdXTsKLSAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PSAwKSB7Ci0gICAgICBAdGhyb3cgW1RUcmFuc3BvcnRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFJlYXNvbjogQCJFbmQgb2Ygb3V0cHV0IHN0cmVhbS4iXTsKKworICAgIHRvdGFsID0gW19vdXRwdXQgd3JpdGU6ZGF0YStvZmZzZXQrZ290IG1heExlbmd0aDpsZW5ndGgtZ290XTsKKyAgICBpZiAodG90YWwgPT0gLTEpIHsKKyAgICAgIGlmIChlcnJvcikgeworICAgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JOb3RPcGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe31dOworICAgICAgfQorICAgICAgcmV0dXJuIE5POwogICAgIH0KLSAgICBnb3QgKz0gcmVzdWx0OworICAgIGVsc2UgaWYgKHRvdGFsID09IDApIHsKKyAgICAgIGlmIChlcnJvcikgeworICAgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JFbmRPZkZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7fV07CisgICAgICB9CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgZ290ICs9IHRvdGFsOwogICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodm9pZCkgZmx1c2gKKy0oQk9PTCkgZmx1c2g6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIC8vIG5vIGZsdXNoIGZvciB5b3UhCisgIHJldHVybiBZRVM7Cit9CisKKy0odm9pZCkgY2xvc2UKK3sKKyAgTlNJbnB1dFN0cmVhbSAqaW5wdXQgPSBzZWxmLmlucHV0OworICBpZiAoaW5wdXQpIHsKKyAgICAvLyBDbG9zZSBhbmQgcmVzZXQgaW5wdXRzdHJlYW0KKyAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eSgoX19icmlkZ2UgQ0ZSZWFkU3RyZWFtUmVmKShpbnB1dCksIGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKTsKKyAgICBbaW5wdXQgc2V0RGVsZWdhdGU6bmlsXTsKKyAgICBbaW5wdXQgY2xvc2VdOworICAgIFtpbnB1dCByZW1vdmVGcm9tUnVuTG9vcDpbTlNSdW5Mb29wIGN1cnJlbnRSdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKKyAgICBpbnB1dCA9IG5pbDsKKyAgfQorCisgIE5TT3V0cHV0U3RyZWFtICpvdXRwdXQgPSBzZWxmLm91dHB1dDsKKyAgaWYgKG91dHB1dCkgeworICAgIC8vIENsb3NlIGFuZCByZXNldCBvdXRwdXRzdHJlYW0KKyAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkoKF9fYnJpZGdlIENGV3JpdGVTdHJlYW1SZWYpKG91dHB1dCksIGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKTsKKyAgICBbb3V0cHV0IHNldERlbGVnYXRlOm5pbF07CisgICAgW291dHB1dCBjbG9zZV07CisgICAgW291dHB1dCByZW1vdmVGcm9tUnVuTG9vcDpbTlNSdW5Mb29wIGN1cnJlbnRSdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKKyAgICBvdXRwdXQgPSBuaWw7CisgIH0KIH0KIAogQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldFRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldFRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MDZjNGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0LmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKyNpbXBvcnQgIlROU1N0cmVhbVRyYW5zcG9ydC5oIgorCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKK0BpbnRlcmZhY2UgVFNTTFNvY2tldFRyYW5zcG9ydCA6IFROU1N0cmVhbVRyYW5zcG9ydCA8TlNTdHJlYW1EZWxlZ2F0ZT4KKworLShpZCkgaW5pdFdpdGhIb3N0bmFtZTooTlNTdHJpbmcgKilob3N0bmFtZQorICAgICAgICAgICAgICAgICAgcG9ydDooaW50KXBvcnQKKyAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3I7CisKKy0oQk9PTCkgaXNPcGVuOworCitAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIxMjE0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnQubQpAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisjaW1wb3J0IDxDb3JlRm91bmRhdGlvbi9Db3JlRm91bmRhdGlvbi5oPgorI2ltcG9ydCAiVFNTTFNvY2tldFRyYW5zcG9ydC5oIgorI2ltcG9ydCAiVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yLmgiCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorCisjaWYgIVRBUkdFVF9PU19JUEhPTkUKKyNpbXBvcnQgPENvcmVTZXJ2aWNlcy9Db3JlU2VydmljZXMuaD4KKyNlbHNlCisjaW1wb3J0IDxDRk5ldHdvcmsvQ0ZOZXR3b3JrLmg+CisjZW5kaWYKKworQGludGVyZmFjZSBUU1NMU29ja2V0VHJhbnNwb3J0ICgpCisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNTdHJpbmcgKnNzbEhvc3RuYW1lOworQHByb3BlcnR5KGFzc2lnbiwgbm9uYXRvbWljKSBpbnQgc2Q7CisKK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gVFNTTFNvY2tldFRyYW5zcG9ydAorCistKGlkKSBpbml0V2l0aEhvc3RuYW1lOihOU1N0cmluZyAqKWhvc3RuYW1lCisgICAgICAgICAgICAgICAgICBwb3J0OihpbnQpcG9ydAorICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqKillcnJvcgoreworICBfc3NsSG9zdG5hbWUgPSBob3N0bmFtZTsKKyAgQ0ZSZWFkU3RyZWFtUmVmIHJlYWRTdHJlYW0gPSBOVUxMOworICBDRldyaXRlU3RyZWFtUmVmIHdyaXRlU3RyZWFtID0gTlVMTDsKKworCisgIC8qIGNyZWF0ZSBhIHNvY2tldCBzdHJ1Y3R1cmUgKi8KKyAgc3RydWN0IHNvY2thZGRyX2luIHBpbjsKKyAgc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisKKworCisgICAgaWYgKChocCA9IGdldGhvc3RieW5hbWUoW2hvc3RuYW1lIFVURjhTdHJpbmddKSkgPT0gTlVMTCkgeworICAgICAgTlNMb2coQCJmYWlsZWQgdG8gcmVzb2x2ZSBob3N0bmFtZSAlQCIsIGhvc3RuYW1lKTsKKyAgICAgIGhlcnJvcigicmVzb2x2Iik7CisgICAgICBpZiAoaSA9PSA5KSB7CisgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFNTTFNvY2tldFRyYW5zcG9ydEVycm9ySG9zdGFuYW1lUmVzb2x1dGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpuaWxdOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuaWw7CisgICAgICB9CisgICAgICBbTlNUaHJlYWQgc2xlZXBGb3JUaW1lSW50ZXJ2YWw6MC4yXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBtZW1zZXQoJnBpbiwgMCwgc2l6ZW9mKHBpbikpOworICBwaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIG1lbWNweSgmcGluLnNpbl9hZGRyLCBocC0+aF9hZGRyLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKyAgcGluLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisKKyAgLyogY3JlYXRlIHRoZSBzb2NrZXQgKi8KKyAgaWYgKChfc2QgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKSkgPT0gLTEpIHsKKyAgICBOU0xvZyhAImZhaWxlZCB0byBjcmVhdGUgc29ja2V0IGZvciBob3N0ICVAOiVkIiwgaG9zdG5hbWUsIHBvcnQpOworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvclNvY2tldENyZWF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOm5pbF07CisgICAgfQorICAgIHJldHVybiBuaWw7CisgIH0KKworICAvKiBvcGVuIGEgY29ubmVjdGlvbiAqLworICBpZiAoY29ubmVjdChfc2QsIChzdHJ1Y3Qgc29ja2FkZHIgKikmcGluLCBzaXplb2YocGluKSkgPT0gLTEpIHsKKyAgICBOU0xvZyhAImZhaWxlZCB0byBjcmVhdGUgY29uZW5jdCB0byBob3N0ICVAOiVkIiwgaG9zdG5hbWUsIHBvcnQpOworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckNvbm5lY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpuaWxdOworICAgIH0KKyAgICByZXR1cm4gbmlsOworICB9CisgIENGU3RyZWFtQ3JlYXRlUGFpcldpdGhTb2NrZXQoa0NGQWxsb2NhdG9yRGVmYXVsdCwgX3NkLCAmcmVhZFN0cmVhbSwgJndyaXRlU3RyZWFtKTsKKworICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtLCBrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSk7CisgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSh3cml0ZVN0cmVhbSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOworCisgIE5TSW5wdXRTdHJlYW0gKmlucHV0U3RyZWFtOworICBOU091dHB1dFN0cmVhbSAqb3V0cHV0U3RyZWFtOworCisgIGlmIChyZWFkU3RyZWFtICYmIHdyaXRlU3RyZWFtKSB7CisKKyAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRlN0cmVhbVByb3BlcnR5U29ja2V0U2VjdXJpdHlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJlYW1Tb2NrZXRTZWN1cml0eUxldmVsVExTdjEpOworCisgICAgTlNEaWN0aW9uYXJ5ICpzZXR0aW5ncyA9IEB7KF9fYnJpZGdlIE5TU3RyaW5nICopa0NGU3RyZWFtU1NMVmFsaWRhdGVzQ2VydGlmaWNhdGVDaGFpbjogQFlFU307CisKKyAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eSgoQ0ZSZWFkU3RyZWFtUmVmKXJlYWRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyZWFtUHJvcGVydHlTU0xTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZUeXBlUmVmKXNldHRpbmdzKTsKKworICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSgoQ0ZXcml0ZVN0cmVhbVJlZil3cml0ZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyZWFtUHJvcGVydHlTU0xTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGVHlwZVJlZilzZXR0aW5ncyk7CisKKyAgICBpbnB1dFN0cmVhbSA9IChfX2JyaWRnZSBOU0lucHV0U3RyZWFtICopcmVhZFN0cmVhbTsKKyAgICBbaW5wdXRTdHJlYW0gc2V0RGVsZWdhdGU6c2VsZl07CisgICAgW2lucHV0U3RyZWFtIHNjaGVkdWxlSW5SdW5Mb29wOltOU1J1bkxvb3AgY3VycmVudFJ1bkxvb3BdIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOworICAgIFtpbnB1dFN0cmVhbSBvcGVuXTsKKworICAgIG91dHB1dFN0cmVhbSA9IChfX2JyaWRnZSBOU091dHB1dFN0cmVhbSAqKXdyaXRlU3RyZWFtOworICAgIFtvdXRwdXRTdHJlYW0gc2V0RGVsZWdhdGU6c2VsZl07CisgICAgW291dHB1dFN0cmVhbSBzY2hlZHVsZUluUnVuTG9vcDpbTlNSdW5Mb29wIGN1cnJlbnRSdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKKyAgICBbb3V0cHV0U3RyZWFtIG9wZW5dOworCisgICAgQ0ZSZWxlYXNlKHJlYWRTdHJlYW0pOworICAgIENGUmVsZWFzZSh3cml0ZVN0cmVhbSk7CisgIH0KKworICBzZWxmID0gW3N1cGVyIGluaXRXaXRoSW5wdXRTdHJlYW06aW5wdXRTdHJlYW0gb3V0cHV0U3RyZWFtOm91dHB1dFN0cmVhbV07CisKKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0odm9pZCkgZGVhbGxvYworeworICBbc2VsZiBjbG9zZV07Cit9CisKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgTlNTdHJlYW1EZWxlZ2F0ZQorCistKHZvaWQpIHN0cmVhbTooTlNTdHJlYW0gKilhU3RyZWFtCisgICBoYW5kbGVFdmVudDooTlNTdHJlYW1FdmVudClldmVudENvZGUKK3sKKyAgc3dpdGNoIChldmVudENvZGUpIHsKKyAgY2FzZSBOU1N0cmVhbUV2ZW50Tm9uZToKKyAgICBicmVhazsKKworICBjYXNlIE5TU3RyZWFtRXZlbnRIYXNCeXRlc0F2YWlsYWJsZToKKyAgICBicmVhazsKKworICBjYXNlIE5TU3RyZWFtRXZlbnRPcGVuQ29tcGxldGVkOgorICAgIGJyZWFrOworCisgIGNhc2UgTlNTdHJlYW1FdmVudEhhc1NwYWNlQXZhaWxhYmxlOiB7CisKKyAgICBCT09MIHByb2NlZWQgPSBOTzsKKyAgICBTZWNUcnVzdFJlc3VsdFR5cGUgdHJ1c3RSZXN1bHQgPSBrU2VjVHJ1c3RSZXN1bHRJbnZhbGlkOworICAgIENGTXV0YWJsZUFycmF5UmVmIG5ld1BvbGljaWVzID0gTlVMTDsKKworICAgIGRvIHsKKworICAgICAgU2VjVHJ1c3RSZWYgdHJ1c3QgPSAoX19icmlkZ2UgU2VjVHJ1c3RSZWYpW2FTdHJlYW0gcHJvcGVydHlGb3JLZXk6KE5TU3RyaW5nICopa0NGU3RyZWFtUHJvcGVydHlTU0xQZWVyVHJ1c3RdOworCisgICAgICAvLyBBZGQgbmV3IHBvbGljeSB0byBjdXJyZW50IGxpc3Qgb2YgcG9saWNpZXMKKyAgICAgIFNlY1BvbGljeVJlZiBwb2xpY3kgPSBTZWNQb2xpY3lDcmVhdGVTU0woTk8sIChfX2JyaWRnZSBDRlN0cmluZ1JlZikoX3NzbEhvc3RuYW1lKSk7CisgICAgICBpZiAoIXBvbGljeSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgQ0ZBcnJheVJlZiBwb2xpY2llczsKKyAgICAgIGlmIChTZWNUcnVzdENvcHlQb2xpY2llcyh0cnVzdCwgJnBvbGljaWVzKSAhPSBlcnJTZWNTdWNjZXNzKSB7CisgICAgICAgIENGUmVsZWFzZShwb2xpY3kpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgbmV3UG9saWNpZXMgPSBDRkFycmF5Q3JlYXRlTXV0YWJsZUNvcHkoTlVMTCwgMCwgcG9saWNpZXMpOworICAgICAgQ0ZBcnJheUFwcGVuZFZhbHVlKG5ld1BvbGljaWVzLCBwb2xpY3kpOworCisgICAgICBDRlJlbGVhc2UocG9saWNpZXMpOworICAgICAgQ0ZSZWxlYXNlKHBvbGljeSk7CisKKyAgICAgIC8vIFVwZGF0ZSB0cnVzdCBwb2xpY2llcworICAgICAgaWYgKFNlY1RydXN0U2V0UG9saWNpZXModHJ1c3QsIG5ld1BvbGljaWVzKSAhPSBlcnJTZWNTdWNjZXNzKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBFdmFsdWF0ZSB0aGUgdHJ1c3QgY2hhaW4KKyAgICAgIGlmIChTZWNUcnVzdEV2YWx1YXRlKHRydXN0LCAmdHJ1c3RSZXN1bHQpICE9IGVyclNlY1N1Y2Nlc3MpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAodHJ1c3RSZXN1bHQpIHsKKyAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0UHJvY2VlZDoKKyAgICAgICAgLy8gTlNMb2coQCJUcnVzdGVkIGJ5IFVTRVIiKTsKKyAgICAgICAgcHJvY2VlZCA9IFlFUzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0VW5zcGVjaWZpZWQ6CisgICAgICAgIC8vIE5TTG9nKEAiVHJ1c3RlZCBieSBPUyIpOworICAgICAgICBwcm9jZWVkID0gWUVTOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRSZWNvdmVyYWJsZVRydXN0RmFpbHVyZToKKyAgICAgICAgcHJvY2VlZCA9IHJlY292ZXJGcm9tVHJ1c3RGYWlsdXJlKHRydXN0LCB0cnVzdFJlc3VsdCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGtTZWNUcnVzdFJlc3VsdERlbnk6CisgICAgICAgIC8vIE5TTG9nKEAiRGVueSIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRGYXRhbFRydXN0RmFpbHVyZToKKyAgICAgICAgLy8gTlNMb2coQCJGYXRhbFRydXN0RmFpbHVyZSIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRPdGhlckVycm9yOgorICAgICAgICAvLyBOU0xvZyhAIk90aGVyRXJyb3IiKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0SW52YWxpZDoKKyAgICAgICAgLy8gTlNMb2coQCJJbnZhbGlkIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAvLyBOU0xvZyhAIkRlZmF1bHQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICB9CisgICAgd2hpbGUgKE5PKTsKKworICAgIGlmICghcHJvY2VlZCkgeworICAgICAgTlNMb2coQCJUU1NMU29ja2V0VHJhbnNwb3J0OiBDYW5ub3QgdHJ1c3QgY2VydGlmaWNhdGUuIFJlc3VsdDogJXUiLCB0cnVzdFJlc3VsdCk7CisgICAgICBbYVN0cmVhbSBjbG9zZV07CisgICAgfQorCisgICAgaWYgKG5ld1BvbGljaWVzKSB7CisgICAgICBDRlJlbGVhc2UobmV3UG9saWNpZXMpOworICAgIH0KKworICB9CisgIGJyZWFrOworCisgIGNhc2UgTlNTdHJlYW1FdmVudEVycm9yT2NjdXJyZWQ6IHsKKyAgICBOU0xvZyhAIlRTU0xTb2NrZXRUcmFuc3BvcnQ6IEVycm9yIG9jY3VycmVkIG9wZW5pbmcgc3RyZWFtOiAlQCIsIFthU3RyZWFtIHN0cmVhbUVycm9yXSk7CisgICAgYnJlYWs7CisgIH0KKworICBjYXNlIE5TU3RyZWFtRXZlbnRFbmRFbmNvdW50ZXJlZDoKKyAgICBicmVhazsKKyAgfQorfQorCitCT09MIHJlY292ZXJGcm9tVHJ1c3RGYWlsdXJlKFNlY1RydXN0UmVmIG15VHJ1c3QsIFNlY1RydXN0UmVzdWx0VHlwZSBsYXN0VHJ1c3RSZXN1bHQpCit7CisgIENGQWJzb2x1dGVUaW1lIHRydXN0VGltZSA9IFNlY1RydXN0R2V0VmVyaWZ5VGltZShteVRydXN0KTsKKyAgQ0ZBYnNvbHV0ZVRpbWUgY3VycmVudFRpbWUgPSBDRkFic29sdXRlVGltZUdldEN1cnJlbnQoKTsKKworICBDRkFic29sdXRlVGltZSB0aW1lSW5jcmVtZW50ID0gMzE1MzYwMDA7CisgIENGQWJzb2x1dGVUaW1lIG5ld1RpbWUgPSBjdXJyZW50VGltZSAtIHRpbWVJbmNyZW1lbnQ7CisKKyAgaWYgKHRydXN0VGltZSAtIG5ld1RpbWUpIHsKKworICAgIENGRGF0ZVJlZiBuZXdEYXRlID0gQ0ZEYXRlQ3JlYXRlKE5VTEwsIG5ld1RpbWUpOworICAgIFNlY1RydXN0U2V0VmVyaWZ5RGF0ZShteVRydXN0LCBuZXdEYXRlKTsKKyAgICBDRlJlbGVhc2UobmV3RGF0ZSk7CisKKyAgICBpZiAoU2VjVHJ1c3RFdmFsdWF0ZShteVRydXN0LCAmbGFzdFRydXN0UmVzdWx0KSAhPSBlcnJTZWNTdWNjZXNzKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgIH0KKworICBpZiAobGFzdFRydXN0UmVzdWx0ID09IGtTZWNUcnVzdFJlc3VsdFByb2NlZWQgfHwgbGFzdFRydXN0UmVzdWx0ID09IGtTZWNUcnVzdFJlc3VsdFVuc3BlY2lmaWVkKSB7CisgICAgcmV0dXJuIFlFUzsKKyAgfQorCisgIE5TTG9nKEAiVFNTTFNvY2tldFRyYW5zcG9ydDogVW5hYmxlIHRvIHJlY292ZXIgY2VydGlmaWNhdGUgdHJ1c3QgZmFpbHVyZSIpOworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIGlzT3BlbgoreworICBpZiAoX3NkID4gMCkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGVsc2UgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxN2YzOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgorCisKK2V4dGVybiBOU1N0cmluZyAqVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yRG9tYWluOworCisKK3R5cGVkZWYgTlNfRU5VTSAoaW50LCBUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IpIHsKKyAgVFNTTFNvY2tldFRyYW5zcG9ydEVycm9ySG9zdGFuYW1lUmVzb2x1dGlvbiAgPSAtMTAwMDAsCisgIFRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvclNvY2tldENyZWF0ZSAgICAgICAgID0gLTEwMDAxLAorICBUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3JDb25uZWN0ICAgICAgICAgICAgICA9IC0xMDAwMiwKK307CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZjk0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IubQpAQCAtMCwwICsxLDIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5oIgorCisKK05TU3RyaW5nICpUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3JEb21haW4gPSBAIlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckRvbWFpbiI7CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0Q2xpZW50LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0Q2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYTk1N2QuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldENsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KLSNpbXBvcnQgIlROU1N0cmVhbVRyYW5zcG9ydC5oIgotCi1AaW50ZXJmYWNlIFRTb2NrZXRDbGllbnQgOiBUTlNTdHJlYW1UcmFuc3BvcnQgewotfQotCi0tIChpZCkgaW5pdFdpdGhIb3N0bmFtZTogKE5TU3RyaW5nICopIGhvc3RuYW1lCi0gICAgICAgICAgICAgICAgICAgcG9ydDogKGludCkgcG9ydDsKLQotQGVuZAotCi0KLQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldENsaWVudC5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldENsaWVudC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGQ0YWY5Li4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRDbGllbnQubQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpbXBvcnQgIlRTb2NrZXRDbGllbnQuaCIKLQotI2lmICFUQVJHRVRfT1NfSVBIT05FCi0jaW1wb3J0IDxDb3JlU2VydmljZXMvQ29yZVNlcnZpY2VzLmg+Ci0jZWxzZQotI2ltcG9ydCA8Q0ZOZXR3b3JrL0NGTmV0d29yay5oPgotI2VuZGlmCi0KLUBpbXBsZW1lbnRhdGlvbiBUU29ja2V0Q2xpZW50Ci0KLS0gKGlkKSBpbml0V2l0aEhvc3RuYW1lOiAoTlNTdHJpbmcgKikgaG9zdG5hbWUKLSAgICAgICAgICAgICAgICAgICBwb3J0OiAoaW50KSBwb3J0Ci17Ci0JTlNJbnB1dFN0cmVhbSAqIGlucHV0U3RyZWFtID0gTlVMTDsKLQlOU091dHB1dFN0cmVhbSAqIG91dHB1dFN0cmVhbSA9IE5VTEw7Ci0JQ0ZSZWFkU3RyZWFtUmVmIHJlYWRTdHJlYW0gPSBOVUxMOwotCUNGV3JpdGVTdHJlYW1SZWYgd3JpdGVTdHJlYW0gPSBOVUxMOwotCUNGU3RyZWFtQ3JlYXRlUGFpcldpdGhTb2NrZXRUb0hvc3Qoa0NGQWxsb2NhdG9yRGVmYXVsdCwgKENGU3RyaW5nUmVmKWhvc3RuYW1lLCBwb3J0LCAmcmVhZFN0cmVhbSwgJndyaXRlU3RyZWFtKTsKLQlpZiAocmVhZFN0cmVhbSAmJiB3cml0ZVN0cmVhbSkgewotCQlDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtLCBrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSk7Ci0JCUNGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSh3cml0ZVN0cmVhbSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOwotCQkKLQkJaW5wdXRTdHJlYW0gPSAoTlNJbnB1dFN0cmVhbSAqKXJlYWRTdHJlYW07Ci0JCVtpbnB1dFN0cmVhbSByZXRhaW5dOwotCQlbaW5wdXRTdHJlYW0gc2V0RGVsZWdhdGU6c2VsZl07Ci0JCVtpbnB1dFN0cmVhbSBzY2hlZHVsZUluUnVuTG9vcDpbTlNSdW5Mb29wIGN1cnJlbnRSdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKLQkJW2lucHV0U3RyZWFtIG9wZW5dOwotCQkKLQkJb3V0cHV0U3RyZWFtID0gKE5TT3V0cHV0U3RyZWFtICopd3JpdGVTdHJlYW07Ci0JCVtvdXRwdXRTdHJlYW0gcmV0YWluXTsKLQkJW291dHB1dFN0cmVhbSBzZXREZWxlZ2F0ZTpzZWxmXTsKLQkJW291dHB1dFN0cmVhbSBzY2hlZHVsZUluUnVuTG9vcDpbTlNSdW5Mb29wIGN1cnJlbnRSdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKLQkJW291dHB1dFN0cmVhbSBvcGVuXTsKLQl9Ci0JCi0Jc2VsZiA9IFtzdXBlciBpbml0V2l0aElucHV0U3RyZWFtOiBpbnB1dFN0cmVhbSBvdXRwdXRTdHJlYW06IG91dHB1dFN0cmVhbV07Ci0JCi0JcmV0dXJuIHNlbGY7Ci19Ci0KLQotQGVuZAotCi0KLQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldFRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldFRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YjkxYTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0VHJhbnNwb3J0LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKyNpbXBvcnQgIlROU1N0cmVhbVRyYW5zcG9ydC5oIgorCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKK0BpbnRlcmZhY2UgVFNvY2tldFRyYW5zcG9ydCA6IFROU1N0cmVhbVRyYW5zcG9ydAorCistKGlkKSBpbml0V2l0aEhvc3RuYW1lOihOU1N0cmluZyAqKWhvc3RuYW1lCisgICAgICAgICAgICAgICAgICBwb3J0OihpbnQpcG9ydDsKKworLShpZCkgaW5pdFdpdGhQYXRoOihOU1N0cmluZyAqKXBhdGg7CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRUcmFuc3BvcnQubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRUcmFuc3BvcnQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzU4YWJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldFRyYW5zcG9ydC5tCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW1wb3J0ICJUU29ja2V0VHJhbnNwb3J0LmgiCisKKyNpZiAhVEFSR0VUX09TX0lQSE9ORQorI2ltcG9ydCA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgorI2Vsc2UKKyNpbXBvcnQgPENGTmV0d29yay9DRk5ldHdvcmsuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KKworQGludGVyZmFjZSBUU29ja2V0VHJhbnNwb3J0ICgpIDxOU1N0cmVhbURlbGVnYXRlPgorQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBUU29ja2V0VHJhbnNwb3J0CisKKy0gKGlkKSBpbml0V2l0aFJlYWRTdHJlYW06IChDRlJlYWRTdHJlYW1SZWYpIHJlYWRTdHJlYW0gd3JpdGVTdHJlYW06IChDRldyaXRlU3RyZWFtUmVmKSB3cml0ZVN0cmVhbQoreworICBOU0lucHV0U3RyZWFtICppbnB1dFN0cmVhbSA9IG5pbDsKKyAgTlNPdXRwdXRTdHJlYW0gKm91dHB1dFN0cmVhbSA9IG5pbDsKKworICBpZiAocmVhZFN0cmVhbSAmJiB3cml0ZVN0cmVhbSkgeworCisgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkocmVhZFN0cmVhbSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOworICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSh3cml0ZVN0cmVhbSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOworCisgICAgaW5wdXRTdHJlYW0gPSAoX19icmlkZ2UgTlNJbnB1dFN0cmVhbSAqKXJlYWRTdHJlYW07CisgICAgW2lucHV0U3RyZWFtIHNldERlbGVnYXRlOnNlbGZdOworICAgIFtpbnB1dFN0cmVhbSBzY2hlZHVsZUluUnVuTG9vcDpOU1J1bkxvb3AuY3VycmVudFJ1bkxvb3AgZm9yTW9kZTpOU0RlZmF1bHRSdW5Mb29wTW9kZV07CisgICAgW2lucHV0U3RyZWFtIG9wZW5dOworCisgICAgb3V0cHV0U3RyZWFtID0gKF9fYnJpZGdlIE5TT3V0cHV0U3RyZWFtICopd3JpdGVTdHJlYW07CisgICAgW291dHB1dFN0cmVhbSBzZXREZWxlZ2F0ZTpzZWxmXTsKKyAgICBbb3V0cHV0U3RyZWFtIHNjaGVkdWxlSW5SdW5Mb29wOk5TUnVuTG9vcC5jdXJyZW50UnVuTG9vcCBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKKyAgICBbb3V0cHV0U3RyZWFtIG9wZW5dOworICB9CisgIGVsc2UgeworCisgICAgaWYgKHJlYWRTdHJlYW0pIHsKKyAgICAgIENGUmVsZWFzZShyZWFkU3RyZWFtKTsKKyAgICB9CisKKyAgICBpZiAod3JpdGVTdHJlYW0pIHsKKyAgICAgIENGUmVsZWFzZSh3cml0ZVN0cmVhbSk7CisgICAgfQorCisgICAgcmV0dXJuIG5pbDsKKyAgfQorCisgIHJldHVybiBbc3VwZXIgaW5pdFdpdGhJbnB1dFN0cmVhbTppbnB1dFN0cmVhbSBvdXRwdXRTdHJlYW06b3V0cHV0U3RyZWFtXTsKK30KKworLSAoaWQpIGluaXRXaXRoSG9zdG5hbWU6IChOU1N0cmluZyAqKSBob3N0bmFtZQorICAgICAgICAgICAgICAgICAgIHBvcnQ6IChpbnQpIHBvcnQKK3sKKyAgQ0ZSZWFkU3RyZWFtUmVmIHJlYWRTdHJlYW0gPSBOVUxMOworICBDRldyaXRlU3RyZWFtUmVmIHdyaXRlU3RyZWFtID0gTlVMTDsKKyAgQ0ZTdHJlYW1DcmVhdGVQYWlyV2l0aFNvY2tldFRvSG9zdChrQ0ZBbGxvY2F0b3JEZWZhdWx0LCAoX19icmlkZ2UgQ0ZTdHJpbmdSZWYpaG9zdG5hbWUsIHBvcnQsICZyZWFkU3RyZWFtLCAmd3JpdGVTdHJlYW0pOworICByZXR1cm4gW3NlbGYgaW5pdFdpdGhSZWFkU3RyZWFtOnJlYWRTdHJlYW0gd3JpdGVTdHJlYW06d3JpdGVTdHJlYW1dOworfQorCistIChpZCkgaW5pdFdpdGhQYXRoOiAoTlNTdHJpbmcgKikgcGF0aAoreworICBDRlNvY2tldE5hdGl2ZUhhbmRsZSBzb2NrZmQgPSBzb2NrZXQoQUZfTE9DQUwsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX0lQKTsKKyAgaW50IHllcyA9IDE7CisgIGlmIChzZXRzb2Nrb3B0KHNvY2tmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmeWVzLCBzaXplb2YoeWVzKSkgPCAwKQorICB7CisgICAgTlNMb2coQCJUU29ja2V0VHJhbnNwb3J0OiBVbmFibGUgdG8gc2V0IFJFVVNFQUREUiBwcm9wZXJ0eSBvZiBzb2NrZXQuIik7CisgICAgcmV0dXJuIG5pbDsKKyAgfQorCisgIE5TRGF0YSAqc2VydmVyQWRkcmVzcyA9IFtbc2VsZiBjbGFzc10gY3JlYXRlQWRkcmVzc1dpdGhQYXRoOnBhdGhdOworCisgIENGUmVhZFN0cmVhbVJlZiByZWFkU3RyZWFtID0gTlVMTDsKKyAgQ0ZXcml0ZVN0cmVhbVJlZiB3cml0ZVN0cmVhbSA9IE5VTEw7CisgIENGU3RyZWFtQ3JlYXRlUGFpcldpdGhTb2NrZXQoa0NGQWxsb2NhdG9yRGVmYXVsdCwgc29ja2ZkLCAmcmVhZFN0cmVhbSwgJndyaXRlU3RyZWFtKTsKKyAgaWYgKCFyZWFkU3RyZWFtIHx8ICF3cml0ZVN0cmVhbSkKKyAgeworICAgIE5TTG9nKEAiVFNvY2tldFRyYW5zcG9ydDogVW5hYmxlIHRvIGNyZWF0ZSByZWFkL3dyaXRlIHN0cmVhbSBwYWlyIGZvciBzb2NrZXQuIik7CisgICAgcmV0dXJuIG5pbDsKKyAgfQorCisgIGlmIChjb25uZWN0KHNvY2tmZCwgKHN0cnVjdCBzb2NrYWRkciAqKXNlcnZlckFkZHJlc3MuYnl0ZXMsIChzb2NrbGVuX3QpIHNlcnZlckFkZHJlc3MubGVuZ3RoKSA8IDApCisgIHsKKyAgICBOU0xvZyhAIlRTb2NrZXRUcmFuc3BvcnQ6IENvbm5lY3QgZXJyb3I6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBuaWw7CisgIH0KKworICByZXR1cm4gW3NlbGYgaW5pdFdpdGhSZWFkU3RyZWFtOnJlYWRTdHJlYW0gd3JpdGVTdHJlYW06d3JpdGVTdHJlYW1dOworfQorCisrIChOU0RhdGEgKikgY3JlYXRlQWRkcmVzc1dpdGhQYXRoOiAoTlNTdHJpbmcgKilwYXRoCit7CisgIHN0cnVjdCBzb2NrYWRkcl91biBzZXJ2YWRkcjsKKworICBzaXplX3QgbnVsbFRlcm1pbmF0ZWRQYXRoTGVuZ3RoID0gcGF0aC5sZW5ndGggKyAxOworICBpZiAobnVsbFRlcm1pbmF0ZWRQYXRoTGVuZ3RoPiBzaXplb2Yoc2VydmFkZHIuc3VuX3BhdGgpKSB7CisgICAgTlNMb2coQCJUU29ja2V0VHJhbnNwb3J0OiBVbmFibGUgdG8gY3JlYXRlIHNvY2tldCBhdCBwYXRoICVALiBQYXRoIGlzIHRvbyBsb25nLiIsIHBhdGgpOworICAgIHJldHVybiBuaWw7CisgIH0KKworICBiemVybygmc2VydmFkZHIsc2l6ZW9mKHNlcnZhZGRyKSk7CisgIHNlcnZhZGRyLnN1bl9mYW1pbHkgPSBBRl9MT0NBTDsKKyAgbWVtY3B5KHNlcnZhZGRyLnN1bl9wYXRoLCBwYXRoLlVURjhTdHJpbmcsIG51bGxUZXJtaW5hdGVkUGF0aExlbmd0aCk7CisgIHNlcnZhZGRyLnN1bl9sZW4gPSBTVU5fTEVOKCZzZXJ2YWRkcik7CisKKyAgcmV0dXJuIFtOU0RhdGEgZGF0YVdpdGhCeXRlczomc2VydmFkZHIgbGVuZ3RoOnNpemVvZihzZXJ2YWRkcildOworfQorCisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaAppbmRleCA2MWViYmQyLi41NThjZjYwIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LmgKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5oCkBAIC0xNywyMCArMTcsMzIgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKwogQHByb3RvY29sIFRUcmFuc3BvcnQgPE5TT2JqZWN0PgogCi0gIC8qKgotICAgKiBHdWFyYW50ZWVzIHRoYXQgYWxsIG9mIGxlbiBieXRlcyBhcmUgcmVhZAotICAgKgotICAgKiBAcGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGludG8KLSAgICogQHBhcmFtIG9mZiBJbmRleCBpbiBidWZmZXIgdG8gc3RhcnQgc3RvcmluZyBieXRlcyBhdAotICAgKiBAcGFyYW0gbGVuIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQsIHdoaWNoIG11c3QgYmUgZXF1YWwgdG8gbGVuCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBkYXRhCi0gICAqLwotLSAoaW50KSByZWFkQWxsOiAodWludDhfdCAqKSBidWYgb2Zmc2V0OiAoaW50KSBvZmYgbGVuZ3RoOiAoaW50KSBsZW47CisvKioKKyAqIEd1YXJhbnRlZXMgdGhhdCBhbGwgb2YgbGVuIGJ5dGVzIGFyZSByZWFkCisgKgorICogQHBhcmFtIGJ1ZiBCdWZmZXIgdG8gcmVhZCBpbnRvCisgKiBAcGFyYW0gb2ZmIEluZGV4IGluIGJ1ZmZlciB0byBzdGFydCBzdG9yaW5nIGJ5dGVzIGF0CisgKiBAcGFyYW0gbGVuIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqIEByZXR1cm4gWUVTIGlmIHN1Y2NlZWRlZCwgTk8gaWYgZmFpbGVkCisgKiBAdGhyb3dzIFRUcmFuc3BvcnRFcnJvciBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBkYXRhCisgKi8KKy0oQk9PTCkgcmVhZEFsbDooVUludDggKilidWYgb2Zmc2V0OihVSW50MzIpb2ZmIGxlbmd0aDooVUludDMyKWxlbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlOiAoY29uc3QgdWludDhfdCAqKSBkYXRhIG9mZnNldDogKHVuc2lnbmVkIGludCkgb2Zmc2V0IGxlbmd0aDogKHVuc2lnbmVkIGludCkgbGVuZ3RoOworLShVSW50MzIpIHJlYWRBdmFpbDooVUludDggKilidWYgb2Zmc2V0OihVSW50MzIpb2ZmIG1heExlbmd0aDooVUludDMyKW1heExlbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIGZsdXNoOworLShCT09MKSB3cml0ZTooY29uc3QgVUludDggKilkYXRhIG9mZnNldDooVUludDMyKW9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworCistKEJPT0wpIGZsdXNoOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKKwogQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEVycm9yLmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGM5ZjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEVycm9yLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJURXJyb3IuaCIKKworCitleHRlcm4gTlNTdHJpbmcgKlRUcmFuc3BvcnRFcnJvckRvbWFpbjsKKworCit0eXBlZGVmIE5TX0VOVU0gKGludCwgVFRyYW5zcG9ydEVycm9yKSB7CisgIFRUcmFuc3BvcnRFcnJvclVua25vd24gICAgICAgID0gMCwKKyAgVFRyYW5zcG9ydEVycm9yTm90T3BlbiAgICAgICAgPSAxLAorICBUVHJhbnNwb3J0RXJyb3JBbHJlYWR5T3BlbiAgICA9IDIsCisgIFRUcmFuc3BvcnRFcnJvclRpbWVkT3V0ICAgICAgID0gMywKKyAgVFRyYW5zcG9ydEVycm9yRW5kT2ZGaWxlICAgICAgPSA0LAorfTsKKworCitleHRlcm4gTlNTdHJpbmcgKlRUcmFuc3BvcnRFcnJvckV4dGVuZGVkRXJyb3JLZXk7CitleHRlcm4gTlNTdHJpbmcgKlRUcmFuc3BvcnRFcnJvckh0dHBFcnJvcktleTsKKworCit0eXBlZGVmIE5TX0VOVU0oaW50LCBUSHR0cFRyYW5zcG9ydEVycm9yKSB7CisgIFRIdHRwVHJhbnNwb3J0RXJyb3JJbnZhbGlkUmVzcG9uc2UgID0gMTAwMSwKKyAgVEh0dHBUcmFuc3BvcnRFcnJvckludmFsaWRTdGF0dXMgICAgPSAxMDAyLAorICBUSHR0cFRyYW5zcG9ydEVycm9yQXV0aGVudGljYXRpb24gICA9IDEwMDMsCit9OwpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEVycm9yLm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXJyb3IubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWFmMDc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEVycm9yLm0KQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUVHJhbnNwb3J0RXJyb3IuaCIKKworCitOU1N0cmluZyAqVFRyYW5zcG9ydEVycm9yRG9tYWluID0gQCJUVHJhbnNwb3J0RXJyb3JEb21haW4iOworCisKK05TU3RyaW5nICpUVHJhbnNwb3J0RXJyb3JFeHRlbmRlZEVycm9yS2V5ID0gQCJleHRlbmRlZEVycm9yIjsKK05TU3RyaW5nICpUVHJhbnNwb3J0RXJyb3JIdHRwRXJyb3JLZXkgPSBAImh0dHBFcnJvciI7CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NDlmZTIuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJURXhjZXB0aW9uLmgiCi0KLUBpbnRlcmZhY2UgVFRyYW5zcG9ydEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24gewotfQotCi0rIChpZCkgZXhjZXB0aW9uV2l0aFJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChOU0Vycm9yICopIGVycm9yOwotCi0rIChpZCkgZXhjZXB0aW9uV2l0aFJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbjsKLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTY3MTQ5Li4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24ubQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgotCi1AaW1wbGVtZW50YXRpb24gVFRyYW5zcG9ydEV4Y2VwdGlvbgotCi0rIChpZCkgZXhjZXB0aW9uV2l0aFJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChOU0Vycm9yICopIGVycm9yCi17Ci0gIE5TRGljdGlvbmFyeSAqIHVzZXJJbmZvID0gbmlsOwotICBpZiAoZXJyb3IgIT0gbmlsKSB7Ci0gICAgdXNlckluZm8gPSBbTlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0OiBlcnJvciBmb3JLZXk6IEAiZXJyb3IiXTsKLSAgfQotCi0gIHJldHVybiBbc3VwZXIgZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFRyYW5zcG9ydEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogcmVhc29uCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86IHVzZXJJbmZvXTsKLX0KLQotCi0rIChpZCkgZXhjZXB0aW9uV2l0aFJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotewotICByZXR1cm4gW3NlbGYgZXhjZXB0aW9uV2l0aFJlYXNvbjogcmVhc29uIGVycm9yOiBuaWxdOwotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY3BwLzNyZHBhcnR5LnByb3BzIGIvbGliL2NwcC8zcmRwYXJ0eS5wcm9wcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjhkNDBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC8zcmRwYXJ0eS5wcm9wcwpAQCAtMCwwICsxLDI1IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiAvPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyI+CisgICAgPEJPT1NUX1JPT1Q+JChUSElSRF9QQVJUWSlcYm9vc3RcYm9vc3RfMV80N18wPC9CT09TVF9ST09UPgorICAgIDxPUEVOU1NMX1JPT1RfRElSPiQoVEhJUkRfUEFSVFkpXG9wZW5zc2xcT3BlblNTTC1XaW4zMjwvT1BFTlNTTF9ST09UX0RJUj4KKyAgICA8TElCRVZFTlRfUk9PVD4kKFRISVJEX1BBUlRZKVxsaWJldmVudC0yLjAuMjEtc3RhYmxlPC9MSUJFVkVOVF9ST09UPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIC8+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIC8+CisgIDxJdGVtR3JvdXA+CisgICAgPEJ1aWxkTWFjcm8gSW5jbHVkZT0iQk9PU1RfUk9PVCI+CisgICAgICA8VmFsdWU+JChCT09TVF9ST09UKTwvVmFsdWU+CisgICAgICA8RW52aXJvbm1lbnRWYXJpYWJsZT50cnVlPC9FbnZpcm9ubWVudFZhcmlhYmxlPgorICAgIDwvQnVpbGRNYWNybz4KKyAgICA8QnVpbGRNYWNybyBJbmNsdWRlPSJPUEVOU1NMX1JPT1RfRElSIj4KKyAgICAgIDxWYWx1ZT4kKE9QRU5TU0xfUk9PVF9ESVIpPC9WYWx1ZT4KKyAgICAgIDxFbnZpcm9ubWVudFZhcmlhYmxlPnRydWU8L0Vudmlyb25tZW50VmFyaWFibGU+CisgICAgPC9CdWlsZE1hY3JvPgorICAgIDxCdWlsZE1hY3JvIEluY2x1ZGU9IkxJQkVWRU5UX1JPT1QiPgorICAgICAgPFZhbHVlPiQoTElCRVZFTlRfUk9PVCk8L1ZhbHVlPgorICAgICAgPEVudmlyb25tZW50VmFyaWFibGU+dHJ1ZTwvRW52aXJvbm1lbnRWYXJpYWJsZT4KKyAgICA8L0J1aWxkTWFjcm8+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jcHAvQ01ha2VMaXN0cy50eHQgYi9saWIvY3BwL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjllYTgyYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjEyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7Qm9vc3RfSU5DTFVERV9ESVJTfSIpCitpbmNsdWRlX2RpcmVjdG9yaWVzKHNyYykKKworIyBTWVNMSUJTIGNvbnRhaW5zIGxpYnJhcmllcyB0aGF0IG5lZWQgdG8gYmUgbGlua2VkIHRvIGFsbCBsaWIgdGFyZ2V0cworc2V0KFNZU0xJQlMgIiIpCisKKyMgQ3JlYXRlIHRoZSB0aHJpZnQgQysrIGxpYnJhcnkKK3NldCggdGhyaWZ0Y3BwX1NPVVJDRVMKKyAgIHNyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcAorICAgc3JjL3RocmlmdC9UT3V0cHV0LmNwcAorICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmNwcAorICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAKKyAgIHNyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oCisgICBzcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uY3BwCisgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuY3BwCisgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5jcHAKKyAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5jcHAKKyAgIHNyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwCisgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5jcHAKKyAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwCisgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwCisgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNwcAorICAgc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5jcHAKKyAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwCisgICBzcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmNwcAorICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5jcHAKKyAgIHNyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3BwCisgICBzcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAKKyAgIHNyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAKKykKKworIyBUaGVzZSBmaWxlcyBkb24ndCB3b3JrIG9uIFdpbmRvd3MgQ0UgYXMgdGhlcmUgaXMgbm8gcGlwZSBzdXBwb3J0CisjIFRPRE86IFRoZXNlIGZpbGVzIHdvbid0IHdvcmsgd2l0aCBVTklDT0RFIHN1cHBvcnQgb24gd2luZG93cy4gSWYgZml4ZWQgdGhpcyBjYW4gYmUgcmUtYWRkZWQuCitpZiAoTk9UIFdJTkNFKQorICAgIGxpc3QoQVBQRU5EIHRocmlmdGNwcF9TT1VSQ0VTCisgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuY3BwCisgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuY3BwCisgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuY3BwCisgICAgKQorZW5kaWYoKQorCisKK2lmIChXSU4zMikKKyAgICBsaXN0KEFQUEVORCB0aHJpZnRjcHBfU09VUkNFUworICAgICAgICBzcmMvdGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uY3BwCisgICAgICAgIHNyYy90aHJpZnQvd2luZG93cy9Tb2NrZXRQYWlyLmNwcAorICAgICAgICBzcmMvdGhyaWZ0L3dpbmRvd3MvR2V0VGltZU9mRGF5LmNwcAorICAgICAgICBzcmMvdGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuY3BwCisgICAgKQorICAgIGlmKE5PVCBXSU5DRSkKKyAgICAgICAgIyBUaGlzIGZpbGUgdXNlcyBwaXBlcyBzbyBpdCBjdXJyZW50bHkgd29uJ3Qgd29yayBvbiBXaW5kb3dzIENFCisgICAgICAgIGxpc3QoQVBQRU5EIHRocmlmdGNwcF9TT1VSQ0VTCisgICAgICAgICAgICBzcmMvdGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuY3BwCisgICAgICAgICkKKyAgICBlbmRpZigpCitlbHNlKCkKKyAgICAjIFRoZXNlIGZpbGVzIGV2YWx1YXRlIHRvIG5vdGhpbmcgb24gV2luZG93cywgc28gb21pdCB0aGVtIGZyb20gdGhlCisgICAgIyBXaW5kb3dzIGJ1aWxkCisgICAgbGlzdChBUFBFTkQgdGhyaWZ0Y3BwX1NPVVJDRVMKKyAgICAgICAgc3JjL3RocmlmdC9WaXJ0dWFsUHJvZmlsaW5nLmNwcAorICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmNwcAorICAgICkKK2VuZGlmKCkKKworIyBJZiBPcGVuU1NMIGlzIG5vdCBmb3VuZCBqdXN0IGlnbm9yZSB0aGUgT3BlblNTTCBzdHVmZgorZmluZF9wYWNrYWdlKE9wZW5TU0wpCitpZihPUEVOU1NMX0ZPVU5EIEFORCBXSVRIX09QRU5TU0wpCisgICAgbGlzdCggQVBQRU5EIHRocmlmdGNwcF9TT1VSQ0VTCisgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5jcHAKKyAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmNwcAorICAgICkKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtPUEVOU1NMX0lOQ0xVREVfRElSfSIpCisgICAgbGlzdChBUFBFTkQgU1lTTElCUyAiJHtPUEVOU1NMX0xJQlJBUklFU30iKQorZW5kaWYoKQorCisjIFdJVEhfKlRIUkVBRFMgc2VsZWN0cyB3aGljaCB0aHJlYWRpbmcgbGlicmFyeSB0byB1c2UKK2lmKFVOSVggQU5EIE5PVCBXSVRIX1NURFRIUkVBRFMpCisgICAgaWYoQU5EUk9JRCkKKyAgICAgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1wdGhyZWFkIikKKyAgICBlbHNlKCkKKyAgICAgICAgbGlzdChBUFBFTkQgU1lTTElCUyBwdGhyZWFkKQorICAgIGVuZGlmKCkKKyAgICBzZXQoIHRocmlmdGNwcF90aHJlYWRzX1NPVVJDRVMKKyAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCisgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguY3BwCisgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5jcHAKKyAgICApCitlbHNlKCkKKyAgICBpZihVTklYKQorICAgICAgICBpZihBTkRST0lEKQorICAgICAgICAgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1wdGhyZWFkIikKKyAgICAgICAgZWxzZSgpCisgICAgICAgICAgICBsaXN0KEFQUEVORCBTWVNMSUJTIHB0aHJlYWQpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisgICAgc2V0KCB0aHJpZnRjcHBfdGhyZWFkc19TT1VSQ0VTCisgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5jcHAKKyAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNdXRleC5jcHAKKyAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNb25pdG9yLmNwcAorICAgICkKK2VuZGlmKCkKKworIyBUaHJpZnQgbm9uIGJsb2NraW5nIHNlcnZlcgorc2V0KCB0aHJpZnRjcHBuYl9TT1VSQ0VTCisgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmNwcAorICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAKKyAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwCisgICAgc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmNwcAorICAgIHNyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuY3BwCispCisKKyMgVGhyaWZ0IHpsaWIgc2VydmVyCitzZXQoIHRocmlmdGNwcHpfU09VUkNFUworICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmNwcAorICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmNwcAorICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuY3BwCisgICAgc3JjL3RocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuY3BwCisgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5jcHAKKykKKworIyBUaHJpZnQgUXQ0IHNlcnZlcgorc2V0KCB0aHJpZnRjcHBxdF9TT1VSQ0VTCisgICAgc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmNwcAorICAgIHNyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuY3BwCispCisKKyMgQ29udGFpbnMgdGhlIHRocmlmdCBzcGVjaWZpYyBBRERfTElCUkFSWV9USFJJRlQgYW5kIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQKK2luY2x1ZGUoVGhyaWZ0TWFjcm9zKQorCitBRERfTElCUkFSWV9USFJJRlQodGhyaWZ0ICR7dGhyaWZ0Y3BwX1NPVVJDRVN9ICR7dGhyaWZ0Y3BwX3RocmVhZHNfU09VUkNFU30pCitpZihXSU4zMikKKyAgICBUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUKHRocmlmdCAke1NZU0xJQlN9IHdzMl8zMikKK2Vsc2UoKQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQodGhyaWZ0ICR7U1lTTElCU30pCitlbmRpZigpCisKK2lmKFdJVEhfTElCRVZFTlQpCisgICAgZmluZF9wYWNrYWdlKExpYmV2ZW50IFJFUVVJUkVEKSAgIyBMaWJldmVudCBjb21lcyB3aXRoIENNYWtlIHN1cHBvcnQgZm9ybSB1cHN0cmVhbQorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICR7TElCRVZFTlRfSU5DTFVERV9ESVJTfSkKKworICAgIEFERF9MSUJSQVJZX1RIUklGVCh0aHJpZnRuYiAke3RocmlmdGNwcG5iX1NPVVJDRVN9KQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQodGhyaWZ0bmIgJHtTWVNMSUJTfSAke0xJQkVWRU5UX0xJQlJBUklFU30pCisgICAgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVF9BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRocmlmdG5iIHRocmlmdCkKK2VuZGlmKCkKKworaWYoV0lUSF9aTElCKQorICAgIGZpbmRfcGFja2FnZShaTElCIFJFUVVJUkVEKQorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICR7WkxJQl9JTkNMVURFX0RJUlN9KQorCisgICAgQUREX0xJQlJBUllfVEhSSUZUKHRocmlmdHogJHt0aHJpZnRjcHB6X1NPVVJDRVN9KQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQodGhyaWZ0eiAke1NZU0xJQlN9ICR7WkxJQl9MSUJSQVJJRVN9KQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlRfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0aHJpZnR6IHRocmlmdCkKK2VuZGlmKCkKKworaWYoV0lUSF9RVDQpCisgICAgc2V0KENNQUtFX0FVVE9NT0MgT04pCisgICAgZmluZF9wYWNrYWdlKFF0NCBSRVFVSVJFRCBDT01QT05FTlRTIFF0Q29yZSBRdE5ldHdvcmspCisgICAgQUREX0xJQlJBUllfVEhSSUZUKHRocmlmdHF0ICR7dGhyaWZ0Y3BwcXRfU09VUkNFU30pCisgICAgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVCh0aHJpZnRxdCAke1NZU0xJQlN9IFF0NDo6UXRDb3JlIFF0NDo6UXROZXR3b3JrKQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlRfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0aHJpZnRxdCB0aHJpZnQpCitlbmRpZigpCisKK2lmKFdJVEhfUVQ1KQorICAgICMgUXQ1IGhhcyBpdHMgb3duIGRpcmVjdG9yeSB0byBhdm9pZCBjb25mbGljdCB3aXRoIFF0NCBjYXVzZWQgYnkgQ01BS0VfQVVUT01PQworICAgIGFkZF9zdWJkaXJlY3Rvcnkoc3JjL3RocmlmdC9xdCkKK2VuZGlmKCkKKworaWYoTVNWQykKKyAgICBhZGRfZGVmaW5pdGlvbnMoIi1EVU5JQ09ERSAtRF9VTklDT0RFIikKK2VuZGlmKCkKKworYWRkX2RlZmluaXRpb25zKCItRF9fU1REQ19MSU1JVF9NQUNST1MiKQorCisjIEluc3RhbGwgdGhlIGhlYWRlcnMKK2luc3RhbGwoRElSRUNUT1JZICJzcmMvdGhyaWZ0IiBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfSIKKyAgICBGSUxFU19NQVRDSElORyBQQVRURVJOICIqLmgiIFBBVFRFUk4gIioudGNjIikKKyMgQ29weSBjb25maWcuaCBmaWxlCitpbnN0YWxsKERJUkVDVE9SWSAiJHtDTUFLRV9CSU5BUllfRElSfS90aHJpZnQiIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9IgorICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouaCIpCisKK2lmKEJVSUxEX1RFU1RJTkcpCisgICAgYWRkX3N1YmRpcmVjdG9yeSh0ZXN0KQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9NYWtlZmlsZS5hbSBiL2xpYi9jcHAvTWFrZWZpbGUuYW0Kb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAzNWJjOGE4Li44NWJiOWFiCi0tLSBhL2xpYi9jcHAvTWFrZWZpbGUuYW0KKysrIGIvbGliL2NwcC9NYWtlZmlsZS5hbQpAQCAtMTcsMTIgKzE3LDMwIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1TVUJESVJTID0gLiB0ZXN0CitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMKKworbW9jXyUuY3BwOiAlLmgKKwkkKFFUX01PQykgJChRVF9DRkxBR1MpICQ8IC1vICRACisKK21vY19fJS5jcHA6ICUuaAorCSQoUVQ1X01PQykgJChRVDVfQ0ZMQUdTKSAkPCAtbyAkQAorCitTVUJESVJTID0gLgorCitpZiBXSVRIX1RFU1RTCisjIFRoaXMgZmlsZSBpcyBuZWVkZWQgYnkgY29tcGlsZXIgd2l0aCBwbHVnaW4sIHdoaWxlIHRlc3QvTWFrZWZpbGUuYW0gbmVlZHMgY29tcGlsZXIKKyMgU28gdGVzdCBkaXJlY3RvcnkgaXMgZGlyZWN0bHkgcGlja2VkIGJ5IHRvcCBsZXZlbCBNYWtlZmlsZS5hbSBmb3IgcGx1Z2luIGJ1aWxkCitpZiAhV0lUSF9QTFVHSU4KK1NVQkRJUlMgKz0gdGVzdAorZW5kaWYKK2VuZGlmCiAKIHBrZ2NvbmZpZ2RpciA9ICQobGliZGlyKS9wa2djb25maWcKIAogbGliX0xUTElCUkFSSUVTID0gbGlidGhyaWZ0LmxhCiBwa2djb25maWdfREFUQSA9IHRocmlmdC5wYworbGlidGhyaWZ0X2xhX0xERkxBR1MgPSAtcmVsZWFzZSAkKFZFUlNJT04pCitsaWJ0aHJpZnRfbGFfTElCQUREID0gJChCT09TVF9MREZMQUdTKSAkKE9QRU5TU0xfTERGTEFHUykgJChPUEVOU1NMX0xJQlMpCiAKICMjIFdlIG9ubHkgYnVpbGQgdGhlIGV4dHJhIGxpYnJhcmllcyBpZiB3ZSBoYXZlIHRoZSBkZXBlbmRlbmNpZXMsCiAjIyBidXQgd2UgaW5zdGFsbCBhbGwgb2YgdGhlIGhlYWRlcnMgdW5jb25kaXRpb25hbGx5LgpAQCAtMzQsMTUxICs1MiwyMzEgQEAKIGxpYl9MVExJQlJBUklFUyArPSBsaWJ0aHJpZnR6LmxhCiBwa2djb25maWdfREFUQSArPSB0aHJpZnQtei5wYwogZW5kaWYKK2lmIEFNWF9IQVZFX1FUCitsaWJfTFRMSUJSQVJJRVMgKz0gbGlidGhyaWZ0cXQubGEKK3BrZ2NvbmZpZ19EQVRBICs9IHRocmlmdC1xdC5wYworZW5kaWYKK2lmIEFNWF9IQVZFX1FUNQorbGliX0xUTElCUkFSSUVTICs9IGxpYnRocmlmdHF0NS5sYQorcGtnY29uZmlnX0RBVEEgKz0gdGhyaWZ0LXF0NS5wYworZW5kaWYKIAotQU1fQ1hYRkxBR1MgPSAtV2FsbAotQU1fQ1BQRkxBR1MgPSAkKEJPT1NUX0NQUEZMQUdTKSAtSSQoc3JjZGlyKS9zcmMKK0FNX0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMKK0FNX0NQUEZMQUdTID0gJChCT09TVF9DUFBGTEFHUykgJChPUEVOU1NMX0lOQ0xVREVTKSAtSSQoc3JjZGlyKS9zcmMgLURfX1NURENfRk9STUFUX01BQ1JPUyAtRF9fU1REQ19MSU1JVF9NQUNST1MKIAogIyBEZWZpbmUgdGhlIHNvdXJjZSBmaWxlcyBmb3IgdGhlIG1vZHVsZQogCi1saWJ0aHJpZnRfbGFfU09VUkNFUyA9IHNyYy9UaHJpZnQuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvTXV0ZXguY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL2NvbmN1cnJlbmN5L01vbml0b3IuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS9VdGlsLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC9URGVidWdQcm90b2NvbC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVERlbnNlUHJvdG9jb2wuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL1RCYXNlNjRVdGlscy5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9USHR0cENsaWVudC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVFNvY2tldC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXQuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3NlcnZlci9UU2VydmVyLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9hc3luYy9UQXN5bmNDaGFubmVsLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAKK2xpYnRocmlmdF9sYV9TT1VSQ0VTID0gc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UT3V0cHV0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVmlydHVhbFByb2ZpbGluZy5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAKIAotbGlidGhyaWZ0bmJfbGFfU09VUkNFUyA9IHNyYy9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL2FzeW5jL1RFdmh0dHBTZXJ2ZXIuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuY3BwIAorbGlidGhyaWZ0X2xhX1NPVVJDRVMgKz0gc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5jcHAKIAotbGlidGhyaWZ0el9sYV9TT1VSQ0VTID0gc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAKK2xpYnRocmlmdG5iX2xhX1NPVVJDRVMgPSBzcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmNwcAogCitsaWJ0aHJpZnR6X2xhX1NPVVJDRVMgPSBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuY3BwCisKKworbGlidGhyaWZ0cXRfbGFfTU9DID0gc3JjL3RocmlmdC9xdC9tb2NfVFFUY3BTZXJ2ZXIuY3BwCitub2Rpc3RfbGlidGhyaWZ0cXRfbGFfU09VUkNFUyA9ICQobGlidGhyaWZ0cXRfbGFfTU9DKQorbGlidGhyaWZ0cXRfbGFfU09VUkNFUyA9IHNyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuY3BwCitDTEVBTkZJTEVTID0gJChsaWJ0aHJpZnRxdF9sYV9NT0MpCisKK2xpYnRocmlmdHF0NV9sYV9NT0MgPSBzcmMvdGhyaWZ0L3F0L21vY19fVFFUY3BTZXJ2ZXIuY3BwCitub2Rpc3RfbGlidGhyaWZ0cXQ1X2xhX1NPVVJDRVMgPSAkKGxpYnRocmlmdHF0NV9sYV9NT0MpCitsaWJ0aHJpZnRxdDVfbGFfU09VUkNFUyA9IHNyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmNwcAorQ0xFQU5GSUxFUyArPSAkKGxpYnRocmlmdHF0NV9sYV9NT0MpCiAKICMgRmxhZ3MgZm9yIHRoZSB2YXJpb3VzIGxpYnJhcmllcwogbGlidGhyaWZ0bmJfbGFfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAkKExJQkVWRU5UX0NQUEZMQUdTKQogbGlidGhyaWZ0el9sYV9DUFBGTEFHUyAgPSAkKEFNX0NQUEZMQUdTKSAkKFpMSUJfQ1BQRkxBR1MpCitsaWJ0aHJpZnRxdF9sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoUVRfQ0ZMQUdTKQorbGlidGhyaWZ0cXQ1X2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChRVDVfQ0ZMQUdTKQoraWYgUVQ1X1JFRFVDRV9SRUxPQ0FUSU9OUworbGlidGhyaWZ0cXQ1X2xhX0NQUEZMQUdTICs9IC1mUElDCitlbmRpZgogbGlidGhyaWZ0bmJfbGFfQ1hYRkxBR1MgPSAkKEFNX0NYWEZMQUdTKQogbGlidGhyaWZ0el9sYV9DWFhGTEFHUyAgPSAkKEFNX0NYWEZMQUdTKQorbGlidGhyaWZ0cXRfbGFfQ1hYRkxBR1MgID0gJChBTV9DWFhGTEFHUykKK2xpYnRocmlmdHF0NV9sYV9DWFhGTEFHUyAgPSAkKEFNX0NYWEZMQUdTKQorbGlidGhyaWZ0bmJfbGFfTERGTEFHUyAgPSAtcmVsZWFzZSAkKFZFUlNJT04pICQoQk9PU1RfTERGTEFHUykKK2xpYnRocmlmdHpfbGFfTERGTEFHUyAgID0gLXJlbGVhc2UgJChWRVJTSU9OKSAkKEJPT1NUX0xERkxBR1MpICQoWkxJQl9MSUJTKQorbGlidGhyaWZ0cXRfbGFfTERGTEFHUyAgID0gLXJlbGVhc2UgJChWRVJTSU9OKSAkKEJPT1NUX0xERkxBR1MpICQoUVRfTElCUykKK2xpYnRocmlmdHF0NV9sYV9MREZMQUdTICAgPSAtcmVsZWFzZSAkKFZFUlNJT04pICQoQk9PU1RfTERGTEFHUykgJChRVDVfTElCUykKIAogaW5jbHVkZV90aHJpZnRkaXIgPSAkKGluY2x1ZGVkaXIpL3RocmlmdAogaW5jbHVkZV90aHJpZnRfSEVBREVSUyA9IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRvcF9idWlsZGRpcikvY29uZmlnLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9UaHJpZnQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL1RSZWZsZWN0aW9uTG9jYWwuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL1RQcm9jZXNzb3IuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvVExvZ2dpbmcuaAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdGhyaWZ0LWNvbmZpZy5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1REaXNwYXRjaFByb2Nlc3Nvci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1RocmlmdC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1RPdXRwdXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UUHJvY2Vzc29yLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVExvZ2dpbmcuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UVG9TdHJpbmcuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UQmFzZS5oCiAKIGluY2x1ZGVfY29uY3VycmVuY3lkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9jb25jdXJyZW5jeQogaW5jbHVkZV9jb25jdXJyZW5jeV9IRUFERVJTID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS9FeGNlcHRpb24uaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL2NvbmN1cnJlbmN5L011dGV4LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS9Nb25pdG9yLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL2NvbmN1cnJlbmN5L1RocmVhZC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS9GdW5jdGlvblJ1bm5lci5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvVXRpbC5oCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNb25pdG9yLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNdXRleC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9GdW5jdGlvblJ1bm5lci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaAogCiBpbmNsdWRlX3Byb3RvY29sZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvcHJvdG9jb2wKIGluY2x1ZGVfcHJvdG9jb2xfSEVBREVSUyA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wudGNjIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC50Y2MgXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC9URGVuc2VQcm90b2NvbC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL1RCYXNlNjRVdGlscy5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVFByb3RvY29sVGFwLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL1RQcm90b2NvbC5oCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wudGNjIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnRjYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFRhcC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFR5cGVzLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oCiAKIGluY2x1ZGVfdHJhbnNwb3J0ZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvdHJhbnNwb3J0CiBpbmNsdWRlX3RyYW5zcG9ydF9IRUFERVJTID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9USHR0cFNlcnZlci5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RTb2NrZXQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVFNvY2tldFBvb2wuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UU2hvcnRSZWFkVHJhbnNwb3J0LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaAogCiBpbmNsdWRlX3NlcnZlcmRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3NlcnZlcgogaW5jbHVkZV9zZXJ2ZXJfSEVBREVSUyA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvc2VydmVyL1RTZXJ2ZXIuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3NlcnZlci9UU2ltcGxlU2VydmVyLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oCiAKIGluY2x1ZGVfcHJvY2Vzc29yZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvcHJvY2Vzc29yCiBpbmNsdWRlX3Byb2Nlc3Nvcl9IRUFERVJTID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvY2Vzc29yL1N0YXRzUHJvY2Vzc29yLmgKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvY2Vzc29yL1N0YXRzUHJvY2Vzc29yLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvY2Vzc29yL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5oCiAKIGluY2x1ZGVfYXN5bmNkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9hc3luYwogaW5jbHVkZV9hc3luY19IRUFERVJTID0gXAotICAgICAgICAgICAgICAgICAgICAgc3JjL2FzeW5jL1RBc3luY0NoYW5uZWwuaCBcCi0gICAgICAgICAgICAgICAgICAgICBzcmMvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmggXAotICAgICAgICAgICAgICAgICAgICAgc3JjL2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oIFwKLSAgICAgICAgICAgICAgICAgICAgIHNyYy9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oIFwKLSAgICAgICAgICAgICAgICAgICAgIHNyYy9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5oIFwKLSAgICAgICAgICAgICAgICAgICAgIHNyYy9hc3luYy9URXZodHRwU2VydmVyLmgKKyAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IuaCBcCisgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb2Nlc3Nvci5oIFwKKyAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmggXAorICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oIFwKKyAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oIFwKKyAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuaCBcCisgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaAogCitpbmNsdWRlX3F0ZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvcXQKK2luY2x1ZGVfcXRfSEVBREVSUyA9IFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuaAogCi1ub2luc3RfUFJPR1JBTVMgPSBjb25jdXJyZW5jeV90ZXN0Ci0KLWNvbmN1cnJlbmN5X3Rlc3RfU09VUkNFUyA9IHNyYy9jb25jdXJyZW5jeS90ZXN0L1Rlc3RzLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvdGVzdC9UaHJlYWRGYWN0b3J5VGVzdHMuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvdGVzdC9UaHJlYWRNYW5hZ2VyVGVzdHMuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvdGVzdC9UaW1lck1hbmFnZXJUZXN0cy5oCi0KLWNvbmN1cnJlbmN5X3Rlc3RfTERBREQgPSBsaWJ0aHJpZnQubGEKK1dJTkRPV1NfRElTVCA9IFwKKyAgICAgICAgICAgICBzcmMvdGhyaWZ0L3dpbmRvd3MgXAorICAgICAgICAgICAgIHRocmlmdC5zbG4gXAorICAgICAgICAgICAgIGxpYnRocmlmdC52Y3hwcm9qIFwKKyAgICAgICAgICAgICBsaWJ0aHJpZnQudmN4cHJvai5maWx0ZXJzIFwKKyAgICAgICAgICAgICBsaWJ0aHJpZnRuYi52Y3hwcm9qIFwKKyAgICAgICAgICAgICBsaWJ0aHJpZnRuYi52Y3hwcm9qLmZpbHRlcnMgXAorICAgICAgICAgICAgIDNyZHBhcnR5LnByb3BzCiAKIEVYVFJBX0RJU1QgPSBcCi0gICAgICAgICAgICAgUkVBRE1FIFwKKyAgICAgICAgICAgICBDTWFrZUxpc3RzLnR4dCBcCisgICAgICAgICAgICAgY29kaW5nX3N0YW5kYXJkcy5tZCBcCisgICAgICAgICAgICAgUkVBRE1FLm1kIFwKICAgICAgICAgICAgICB0aHJpZnQtbmIucGMuaW4gXAogICAgICAgICAgICAgIHRocmlmdC5wYy5pbiBcCi0gICAgICAgICAgICAgdGhyaWZ0LXoucGMuaW4KKyAgICAgICAgICAgICB0aHJpZnQtei5wYy5pbiBcCisgICAgICAgICAgICAgdGhyaWZ0LXF0LnBjLmluIFwKKyAgICAgICAgICAgICB0aHJpZnQtcXQ1LnBjLmluIFwKKyAgICAgICAgICAgICBzcmMvdGhyaWZ0L3F0L0NNYWtlTGlzdHMudHh0IFwKKyAgICAgICAgICAgICAkKFdJTkRPV1NfRElTVCkKKworc3R5bGUtbG9jYWw6CisJJChDUFBTVFlMRV9DTUQpCmRpZmYgLS1naXQgYS9saWIvY3BwL1JFQURNRSBiL2xpYi9jcHAvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzZkMDE3Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotVGhyaWZ0IEMrKyBTb2Z0d2FyZSBMaWJyYXJ5Ci0KLUxpY2Vuc2UKLT09PT09PT0KLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLVVzaW5nIFRocmlmdCB3aXRoIEMrKwotPT09PT09PT09PT09PT09PT09PT09Ci0KLVRoZSBUaHJpZnQgQysrIGxpYnJhcmllcyBhcmUgYnVpbHQgdXNpbmcgdGhlIEdOVSB0b29scy4gRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMKLWluIHRoZSB0b3AtbGV2ZWwgUkVBRE1FLCBvciBydW4gYm9vdHN0cmFwLnNoIGluIHRoaXMgZm9sZGVyIHRvIGdlbmVyYXRlIHRoZQotTWFrZWZpbGVzLgotCi1JbiBjYXNlIHlvdSBkbyBub3Qgd2FudCB0byBvcGVuIGFub3RoZXIgUkVBRE1FIGZpbGUsIGRvIHRoaXM6Ci0gIC4vYm9vdHN0cmFwLnNoCi0gIC4vY29uZmlndXJlICgtLXdpdGgtYm9vc3Q9L3Vzci9sb2NhbCkKLSAgbWFrZQotICBzdWRvIG1ha2UgaW5zdGFsbAotCi1UaHJpZnQgaXMgZGl2aWRlZCBpbnRvIHR3byBsaWJyYXJpZXMuCi0KLWxpYnRocmlmdAotICBUaGUgY29yZSBUaHJpZnQgbGlicmFyeSBjb250YWlucyBhbGwgdGhlIGNvcmUgVGhyaWZ0IGNvZGUuIEl0IHJlcXVpcmVzCi0gIGJvb3N0IHNoYXJlZCBwb2ludGVycywgcHRocmVhZHMsIGFuZCBsaWJydC4KLQotbGlidGhyaWZ0bmIKLSAgVGhpcyBsaWJyYXJ5IGNvbnRhaW5zIHRoZSBUaHJpZnQgbm9uYmxvY2tpbmcgc2VydmVyLCB3aGljaCB1c2VzIGxpYmV2ZW50LgotICBUbyBsaW5rIHRoaXMgbGlicmFyeSB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gbGluayBsaWJldmVudC4KLQotTGlua2luZyBBZ2FpbnN0IFRocmlmdAotPT09PT09PT09PT09PT09PT09PT09PQotCi1BZnRlciB5b3UgYnVpbGQgYW5kIGluc3RhbGwgVGhyaWZ0IHRoZSBsaWJyYXJpZXMgYXJlIGluc3RhbGxlZCB0bwotL3Vzci9sb2NhbC9saWIgYnkgZGVmYXVsdC4gTWFrZSBzdXJlIHRoaXMgaXMgaW4geW91ciBMRFBBVEguCi0KLU9uIExpbnV4LCB0aGUgYmVzdCB3YXkgdG8gZG8gdGhpcyBpcyB0byBlbnN1cmUgdGhhdCAvdXNyL2xvY2FsL2xpYiBpcyBpbgoteW91ciAvZXRjL2xkLnNvLmNvbmYgYW5kIHRoZW4gcnVuIC9zYmluL2xkY29uZmlnLgotCi1EZXBlbmRpbmcgdXBvbiB3aGV0aGVyIHlvdSBhcmUgbGlua2luZyBkeW5hbWljYWxseSBvciBzdGF0aWNhbGx5IGFuZCBob3cKLXlvdXIgYnVpbGQgZW52aXJvbm1lbnQgaXQgc2V0IHVwLCB5b3UgbWF5IG5lZWQgdG8gaW5jbHVkZSBhZGRpdGlvbmFsCi1saWJyYXJpZXMgd2hlbiBsaW5raW5nIGFnYWluc3QgdGhyaWZ0LCBzdWNoIGFzIGxpYnJ0IGFuZC9vciBsaWJwdGhyZWFkLiBJZgoteW91IGFyZSB1c2luZyBsaWJ0aHJpZnRuYiB5b3Ugd2lsbCBhbHNvIG5lZWQgbGliZXZlbnQuCi0KLURlcGVuZGVuY2llcwotPT09PT09PT09PT09Ci0KLWJvb3N0IHNoYXJlZCBwb2ludGVycwotaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy9zbWFydF9wdHIvc21hcnRfcHRyLmh0bQotCi1saWJldmVudCAoZm9yIGxpYnRocmlmdG5iIG9ubHkpCi1odHRwOi8vbW9ua2V5Lm9yZy9+cHJvdm9zL2xpYmV2ZW50LwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9SRUFETUUuU1NMIGIvbGliL2NwcC9SRUFETUUuU1NMCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTI4MDU3Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvUkVBRE1FLlNTTAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi1Ob3RlcyBvbiBUaHJpZnQvU1NMCi0KLUF1dGhvcjogUGluZyBMaSA8cGluZ2xpQGZhY2Vib29rLmNvbT4KLQotMS4gU2NvcGUKLQotICAgVGhpcyBTU0wgb25seSBzdXBwb3J0cyBibG9ja2luZyBtb2RlIHNvY2tldCBJL08uIEl0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aAotICAgVFNpbXBsZVNlcnZlciwgVFRocmVhZGVkU2VydmVyLCBhbmQgVFRocmVhZFBvb2xTZXJ2ZXIuCi0KLTIuIEltcGxlbWVudGF0aW9uCi0KLSAgIFRoZXJlJ3JlIHR3byBtYWluIGNsYXNzZXMgVFNTTFNvY2tldEZhY3RvcnkgYW5kIFRTU0xTb2NrZXQuIEluc3RhbmNlcyBvZgotICAgVFNTTFNvY2tldCBhcmUgYWx3YXlzIGNyZWF0ZWQgZnJvbSBUU1NMU29ja2V0RmFjdG9yeS4KLQotICAgUG9zaXhTU0xUaHJlYWRGYWN0b3J5IGNyZWF0ZXMgUG9zaXhTU0xUaHJlYWQuIFRoZSBvbmx5IGRpZmZlcmVuY2UgZnJvbSB0aGUKLSAgIFB0aHJlYWRUaHJlYWQgdHlwZSBpcyB0aGF0IGl0IGNsZWFudXBzIE9wZW5TU0wgZXJyb3IgcXVldWUgdXBvbiBleGl0aW5nCi0gICB0aGUgdGhyZWFkLiBJZGVhbGx5LCBPcGVuU1NMIEFQSXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gUG9zaXhTU0xUaHJlYWQuCi0KLTMuIEhvdyB0byB1c2UgU1NMIEFQSXMKLQotICAgLy8gVGhpcyBpcyBmb3IgZGVtby4gSW4gcmVhbCBjb2RlLCB0eXBpY2FsbHkgb25seSBvbmUgVFNTTFNvY2tldEZhY3RvcnkKLSAgIC8vIGluc3RhbmNlIGlzIG5lZWRlZC4KLSAgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGdldFNTTFNvY2tldEZhY3RvcnkoKSB7Ci0gICAgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkobmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOwotICAgICAvLyBjbGllbnQ6IGxvYWQgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMKLSAgICAgZmFjdG9yeS0+bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoIm15LXRydXN0ZWQtY2EtY2VydGlmaWNhdGVzLnBlbSIpOwotICAgICAvLyBjbGllbnQ6IG9wdGlvbmFsbHkgc2V0IHlvdXIgb3duIGFjY2VzcyBtYW5hZ2VyLCBvdGhlcndpc2UsCi0gICAgIC8vICAgICAgICAgdGhlIGRlZmF1bHQgY2xpZW50IGFjY2VzcyBtYW5hZ2VyIHdpbGwgYmUgbG9hZGVkLgotCi0gICAgIGZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZSgibXktY2VydGlmaWNhdGUtc2lnbmVkLWJ5LWNhLnBlbSIpOwotICAgICBmYWN0b3J5LT5sb2FkUHJpdmF0ZUtleSgibXktcHJpdmF0ZS1rZXkucGVtIik7Ci0gICAgIC8vIHNlcnZlcjogb3B0aW9uYWxseSBzZXR1cCBhY2Nlc3MgbWFuYWdlcgotICAgICAvLyBzaGFyZWRfcHRyPEFjY2Vzc01hbmFnZXI+IGFjY2Vzc01hbmFnZXIobmV3IE15QWNjZXNzTWFuYWdlcik7Ci0gICAgIC8vIGZhY3RvcnktPmFjY2VzcyhhY2Nlc3NNYW5hZ2VyKTsKLSAgICAgLi4uCi0gICB9Ci0KLSAgIC8vIGNsaWVudCBjb2RlIHNhbXBsZQotICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSA9IGdldFNTTFNvY2tldEZhY3RvcnkoKTsKLSAgIHNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0ID0gZmFjdG9yeS5jcmVhdGVTb2NrZXQoaG9zdCwgcG9ydCk7Ci0gICBzaGFyZWRfcHRyPFRCdWZmZXJlZFRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KSk7Ci0gICAuLi4KLQotICAgLy8gc2VydmVyIGNvZGUgc2FtcGxlCi0gICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5ID0gZ2V0U1NMU29ja2V0RmFjdG9yeSgpOwotICAgc2hhcmVkX3B0cjxUU1NMU2VydmVyU29ja2V0PiBzb2NrZXQobmV3IFRTU0xTZXJ2ZXJTb2NrZXQocG9ydCwgZmFjdG9yeSkpOwotICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSkpOwotICAgLi4uCi0KLTQuIEFjY2Vzc01hbmFnZXIKLQotICAgQWNjZXNzTWFuYWdlciBkZWZpbmVzIGEgY2FsbGJhY2sgaW50ZXJmYWNlLiBJdCBoYXMgdGhyZWUgY2FsbGJhY2sgbWV0aG9kczoKLQotICAgKGEpIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSk7Ci0gICAoYikgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHN0cmluZyYgaG9zdCwgY29uc3QgY2hhciogbmFtZSwgaW50IHNpemUpOwotICAgKGMpIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSwgY29uc3QgY2hhciogZGF0YSwgaW50IHNpemUpOwotCi0gICBBZnRlciBTU0wgaGFuZHNoYWtlIGNvbXBsZXRlcywgYWRkaXRpb25hbCBjaGVja3MgYXJlIGNvbmR1Y3RlZC4gQXBwbGljYXRpb24KLSAgIGlzIGdpdmVuIHRoZSBjaGFuY2UgdG8gZGVjaWRlIHdoZXRoZXIgb3Igbm90IHRvIGNvbnRpbnVlIHRoZSBjb252ZXJzYXRpb24KLSAgIHdpdGggdGhlIHJlbW90ZS4gQXBwbGljYXRpb24gaXMgcXVlcmllZCB0aHJvdWdoIHRoZSBhYm92ZSB0aHJlZSAidmVyaWZ5IgotICAgbWV0aG9kLiBUaGV5IGFyZSBjYWxsZWQgYXQgZGlmZmVyZW50IHBvaW50cyBvZiB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MuCi0KLSAgIERlY2lzaW9ucyBjYW4gYmUgb25lIG9mIEFMTE9XLCBERU5ZLCBhbmQgU0tJUC4gQUxMT1cgYW5kIERFTlkgbWVhbnMgdGhlCi0gICBjb252ZXJzYXRpb24gc2hvdWxkIGJlIGNvbnRpbnVlZCBvciBkaXNjb25uZWN0ZWQsIHJlc3BlY3RpdmVseS4gQUxMT1cgYW5kCi0gICBERU5ZIGRlY2lzaW9uIHN0b3BzIHRoZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy4gU0tJUCBtZWFucyB0aGVyZSdzIG5vIGRlY2lzaW9uCi0gICBiYXNlZCBvbiB0aGUgZ2l2ZW4gaW5wdXQsIGNvbnRpbnVlIHRoZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy4KLQotICAgRmlyc3QsIChhKSBpcyBjYWxsZWQgd2l0aCB0aGUgcmVtb3RlIElQLiBJdCBpcyBjYWxsZWQgb25jZSBhdCB0aGUgYmVnaW5uaW5nLgotICAgInNhIiBpcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIHBlZXIuCi0KLSAgIFRoZW4sIHRoZSBjZXJ0aWZpY2F0ZSBvZiByZW1vdGUgcGVlciBpcyBsb2FkZWQuIFN1YmplY3RBbHROYW1lIGV4dGVuc2lvbnMKLSAgIGFyZSBleHRyYWN0ZWQgYW5kIHNlbnQgdG8gYXBwbGljYXRpb24gZm9yIHZlcmlmaWNhdGlvbi4gV2hlbiBhIEROUwotICAgc3ViamVjdEFsdE5hbWUgZmllbGQgaXMgZXh0cmFjdGVkLCAoYikgaXMgY2FsbGVkLiBXaGVuIGFuIElQIHN1YmplY3RBbHROYW1lCi0gICBmaWVsZCBpcyBleHRyYWN0ZWQsIChjKSBpcyBjYWxsZWQuCi0KLSAgIFRoZSAiaG9zdCIgaW4gKGIpIGlzIHRoZSB2YWx1ZSBmcm9tIFRTb2NrZXQ6OmdldEhvc3QoKSBpZiB0aGlzIGlzIGEgY2xpZW50Ci0gICBzaWRlIHNvY2tldCwgb3IgVFNvY2tldDo6Z2V0UGVlckhvc3QoKSBpZiB0aGlzIGlzIGEgc2VydmVyIHNpZGUgc29ja2V0LiBUaGUKLSAgIHJlYXNvbiBpcyBjbGllbnQgc2lkZSBzb2NrZXQgaW5pdGlhdGVzIHRoZSBjb25uZWN0aW9uLiBUU29ja2V0OjpnZXRIb3N0KCkKLSAgIGlzIHRoZSByZW1vdGUgaG9zdCBuYW1lLiBPbiBzZXJ2ZXIgc2lkZSwgdGhlIHJlbW90ZSBob3N0IG5hbWUgaXMgdW5rbm93bgotICAgdW5sZXNzIGl0J3MgcmV0cmlldmVkIHRocm91Z2ggVFNvY2tldDo6Z2V0UGVlckhvc3QoKS4gRWl0aGVyIHdheSwgImhvc3QiCi0gICBzaG91bGQgYmUgdGhlIHJlbW90ZSBob3N0IG5hbWUuIEtlZXAgaW4gbWluZCwgaWYgVFNvY2tldDo6Z2V0UGVlckhvc3QoKQotICAgZmFpbGVkLCBpdCB3b3VsZCByZXR1cm4gdGhlIHJlbW90ZSBob3N0IG5hbWUgaW4gbnVtZXJpYyBmb3JtYXQuCi0KLSAgIElmIGFsbCBzdWJqZWN0QWx0TmFtZSBleHRlbnNpb25zIHdlcmUgInNraXBwZWQiLCB0aGUgY29tbW9uIG5hbWUgZmllbGQgd291bGQKLSAgIGJlIGNoZWNrZWQuIEl0IGlzIHNlbnQgdG8gYXBwbGljYXRpb24gdGhyb3VnaCAoYyksIHdoZXJlICJzYSIgaXMgdGhlIHJlbW90ZQotICAgSVAgYWRkcmVzcy4gImRhdGEiIGlzIHRoZSBJUCBhZGRyZXNzIGV4dHJhY3RlZCBmcm9tIHN1YmplY3RBbHROYW1lIElQCi0gICBleHRlbnNpb24sIGFuZCAic2l6ZSIgaXMgdGhlIGxlbmd0aCBvZiB0aGUgZXh0ZW5zaW9uIGRhdGEuCi0KLSAgIElmIGFueSBvZiB0aGUgYWJvdmUgInZlcmlmeSIgbWV0aG9kcyByZXR1cm5lZCBhIGRlY2lzaW9uIEFMTE9XIG9yIERFTlksIHRoZQotICAgdmVyaWZpY2F0aW9uIHByb2Nlc3Mgd291bGQgYmUgc3RvcHBlZC4KLQotICAgSWYgYW55IG9mIHRoZSBhYm92ZSAidmVyaWZ5IiBtZXRob2RzIHJldHVybmVkIFNLSVAsIHRoYXQgZGVjaXNpb24gd291bGQgYmUKLSAgIGlnbm9yZWQgYW5kIHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyB3b3VsZCBtb3ZlIG9uIHRpbGwgdGhlIGxhc3QgaXRlbSBpcwotICAgZXhhbWluZWQuIEF0IHRoYXQgcG9pbnQsIGlmIHRoZXJlJ3Mgc3RpbGwgbm8gZGVjaXNpb24sIHRoZSBjb25uZWN0aW9uIGlzCi0gICB0ZXJtaW5hdGVkLgotCi0gICBUaHJlYWQgc2FmZXR5LCBhbiBhY2Nlc3MgbWFuYWdlciBzaG91bGQgbm90IHN0b3JlIHN0YXRlIGluZm9ybWF0aW9uIGlmIGl0J3MKLSAgIHRvIGJlIHVzZWQgYnkgbWFueSBTU0wgc29ja2V0cy4KLQotNS4gU0lHUElQRSBzaWduYWwKLQotICAgQXBwbGljYXRpb25zIHJ1bm5pbmcgT3BlblNTTCBvdmVyIG5ldHdvcmsgY29ubmVjdGlvbnMgbWF5IGNyYXNoIGlmIFNJR1BJUEUKLSAgIGlzIG5vdCBpZ25vcmVkLiBUaGlzIGhhcHBlbnMgd2hlbiB0aGV5IHJlY2VpdmUgYSBjb25uZWN0aW9uIHJlc2V0IGJ5IHJlbW90ZQotICAgcGVlciBleGNlcHRpb24sIHdoaWNoIHNvbWVob3cgdHJpZ2dlcnMgYSBTSUdQSVBFIHNpZ25hbC4gSWYgbm90IGhhbmRsZWQsCi0gICB0aGlzIHNpZ25hbCB3b3VsZCBraWxsIHRoZSBhcHBsaWNhdGlvbi4KLQotNi4gSG93IHRvIHJ1biB0ZXN0IGNsaWVudC9zZXJ2ZXIgaW4gU1NMIG1vZGUKLQotICAgVGhlIHNlcnZlciBleHBlY3RzIHRoZSBmb2xsb3dpbmdzIGZyb20gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksCi0gICAtICJzZXJ2ZXItY2VydGlmaWNhdGUucGVtIgotICAgLSAic2VydmVyLXByaXZhdGUta2V5LnBlbSIKLQotICAgVGhlIGNsaWVudCBsb2FkcyAidHJ1c3RlZC1jYS1jZXJ0aWZpY2F0ZS5wZW0iIGZyb20gY3VycmVudCBkaXJlY3RvcnkuCi0KLSAgIFRoZSBmaWxlIG5hbWVzIGFyZSBoYXJkIGNvZGVkIGluIHRoZSBzb3VyY2UgY29kZS4gWW91IG5lZWQgdG8gY3JlYXRlIHRoZXNlCi0gICBjZXJ0aWZpY2F0ZXMgYmVmb3JlIHlvdSBjYW4gcnVuIHRoZSB0ZXN0IGNvZGUgaW4gU1NMIG1vZGUuIE1ha2Ugc3VyZSBhdCBsZWFzdAotICAgb25lIG9mIHRoZSBmb2xsb3dpbmdzIGlzIGluY2x1ZGVkIGluICJzZXJ2ZXItY2VydGlmaWNhdGUucGVtIiwKLSAgIC0gc3ViamVjdEFsdE5hbWUsIEROUyBsb2NhbGhvc3QKLSAgIC0gc3ViamVjdEFsdE5hbWUsIElQICAxMjcuMC4wLjEKLSAgIC0gY29tbW9uIG5hbWUsICAgIGxvY2FsaG9zdAotCi0gICBSdW4sCi0gICAtICIuL3Rlc3Rfc2VydmVyIC0tc3NsIiB0byBzdGFydCBzZXJ2ZXIKLSAgIC0gIi4vdGVzdF9jbGllbnQgLS1zc2wiIHRvIHJ1biBjbGllbnQKLQotICAgSWYgIi1oIDxob3N0PiIgaXMgdXNlZCB0byBydW4gY2xpZW50LCB0aGUgYWJvdmUgImxvY2FsaG9zdCIgaW4gdGhlIGFib3ZlCi0gICBzZXJ2ZXItY2VydGlmaWNhdGUucGVtIGhhcyB0byBiZSByZXBsYWNlZCB3aXRoIHRoYXQgaG9zdCBuYW1lLgotCi03LiBUU1NMU29ja2V0RmFjdG9yeTo6cmFuZG9taXplKCkKLQotICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgT3BlblNTTFNvY2tldEZhY3Rvcnk6OnJhbmRvbWl6ZSgpIHNpbXBseSBjYWxscwotICAgT3BlblNTTCdzIFJBTkRfcG9sbCgpIHdoZW4gT3BlblNTTCBsaWJyYXJ5IGlzIGZpcnN0IGluaXRpYWxpemVkLgotCi0gICBUaGUgUFJORyBzZWVkIGlzIGtleSB0byB0aGUgYXBwbGljYXRpb24gc2VjdXJpdHkuIFRoaXMgbWV0aG9kIHNob3VsZCBiZQotICAgb3ZlcnJpZGRlbiBpZiBpdCdzIG5vdCBzdHJvbmcgZW5vdWdoIGZvciB5b3UuCmRpZmYgLS1naXQgYS9saWIvY3BwL1JFQURNRS5tZCBiL2xpYi9jcHAvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU3NDRhNmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL1JFQURNRS5tZApAQCAtMCwwICsxLDI5NiBAQAorVGhyaWZ0IEMrKyBTb2Z0d2FyZSBMaWJyYXJ5CisKKyMgTGljZW5zZQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworIyBVc2luZyBUaHJpZnQgd2l0aCBDKysKKworVGhlIFRocmlmdCBDKysgbGlicmFyaWVzIGFyZSBidWlsdCB1c2luZyB0aGUgR05VIHRvb2xzLiBGb2xsb3cgdGhlIGluc3RydWN0aW9ucworaW4gdGhlIHRvcC1sZXZlbCBSRUFETUUubWQKKworSW4gY2FzZSB5b3UgZG8gbm90IHdhbnQgdG8gb3BlbiBhbm90aGVyIFJFQURNRS5tZCBmaWxlLCBkbyB0aGlzIHRocmlmdCBzcmM6CisKKyAgICAuL2Jvb3RzdHJhcC5zaAorICAgIC4vY29uZmlndXJlICgtLXdpdGgtYm9vc3Q9L3Vzci9sb2NhbCkKKyAgICBtYWtlCisgICAgc3VkbyBtYWtlIGluc3RhbGwKKworVGhyaWZ0IGlzIGRpdmlkZWQgaW50byB0d28gbGlicmFyaWVzLgorCisqIGxpYnRocmlmdCAtIFRoZSBjb3JlIFRocmlmdCBsaWJyYXJ5IGNvbnRhaW5zIGFsbCB0aGUgY29yZSBUaHJpZnQgY29kZS4gSXQgcmVxdWlyZXMKKyAgYm9vc3Qgc2hhcmVkIHBvaW50ZXJzLCBwdGhyZWFkcywgYW5kIGxpYnJ0LgorCisqIGxpYnRocmlmdG5iIC0gVGhpcyBsaWJyYXJ5IGNvbnRhaW5zIHRoZSBUaHJpZnQgbm9uYmxvY2tpbmcgc2VydmVyLCB3aGljaCB1c2VzIGxpYmV2ZW50LgorICBUbyBsaW5rIHRoaXMgbGlicmFyeSB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gbGluayBsaWJldmVudC4KKworIyMgTGlua2luZyBBZ2FpbnN0IFRocmlmdAorCitBZnRlciB5b3UgYnVpbGQgYW5kIGluc3RhbGwgVGhyaWZ0IHRoZSBsaWJyYXJpZXMgYXJlIGluc3RhbGxlZCB0bworL3Vzci9sb2NhbC9saWIgYnkgZGVmYXVsdC4gTWFrZSBzdXJlIHRoaXMgaXMgaW4geW91ciBMRFBBVEguCisKK09uIExpbnV4LCB0aGUgYmVzdCB3YXkgdG8gZG8gdGhpcyBpcyB0byBlbnN1cmUgdGhhdCAvdXNyL2xvY2FsL2xpYiBpcyBpbgoreW91ciAvZXRjL2xkLnNvLmNvbmYgYW5kIHRoZW4gcnVuIC9zYmluL2xkY29uZmlnLgorCitEZXBlbmRpbmcgdXBvbiB3aGV0aGVyIHlvdSBhcmUgbGlua2luZyBkeW5hbWljYWxseSBvciBzdGF0aWNhbGx5IGFuZCBob3cKK3lvdXIgYnVpbGQgZW52aXJvbm1lbnQgaXQgc2V0IHVwLCB5b3UgbWF5IG5lZWQgdG8gaW5jbHVkZSBhZGRpdGlvbmFsCitsaWJyYXJpZXMgd2hlbiBsaW5raW5nIGFnYWluc3QgdGhyaWZ0LCBzdWNoIGFzIGxpYnJ0IGFuZC9vciBsaWJwdGhyZWFkLiBJZgoreW91IGFyZSB1c2luZyBsaWJ0aHJpZnRuYiB5b3Ugd2lsbCBhbHNvIG5lZWQgbGliZXZlbnQuCisKKyMjIERlcGVuZGVuY2llcworCitJZiB5b3VyIEMrKyBlbnZpcm9ubWVudCBpbXBsZW1lbnRzIEMrKzExIG9yIGxhdGVyLCB0aHJpZnQgd2lsbCBhdXRvbWF0aWNhbGx5IHVzZQorc3RkOjpzaGFyZWRfcHRyLiAgT3RoZXJ3aXNlIHlvdSB3aWxsIG5lZWQgdGhlIGJvb3N0IGxpYnJhcnkgdG8gcHJvdmlkZSBhIHNoYXJlZF9wdHIKK2ltcGxlbWVudGF0aW9uIGZvciBDKysgZW52aXJvbm1lbnRzIHByZS1DKysxMS4gIElmIHlvdSBhcmUgbGlua2luZyBhZ2FpbnN0IGNvZGUKK3RoYXQgZXhwZWN0cyB0byBiZSB1c2luZyBib29zdDo6c2hhcmVkX3B0ciwgeW91IGNhbiBkZWZpbmUgdGhlIHByZXByb2Nlc3NvcgordmFyaWFibGUgRk9SQ0VfQk9PU1RfU01BUlRfUFRSIGZvciB5b3VyIGJ1aWxkIG9mIHRocmlmdCB0byBtYWtlIGl0IHVzZSBib29zdCBpbnN0ZWFkCitvZiBzdGQgZm9yIGEgbnVtYmVyIG9mIG1lbW9yeSByZWxhdGVkIGNsYXNzZXMuICBTZWUgdGhyaWZ0L3N0ZGN4eC5oIGZvciBtb3JlLgorCitsaWJldmVudCAoZm9yIGxpYnRocmlmdG5iIG9ubHkpCitodHRwOi8vbW9ua2V5Lm9yZy9+cHJvdm9zL2xpYmV2ZW50LworCisjIFVzaW5nIFRocmlmdCB3aXRoIEMrKyBvbiBXaW5kb3dzCisKK0JvdGggdGhlIGF1dG9jb25mIGFuZCBjbWFrZSBidWlsZCBzeXN0ZW1zIGFyZSBhYmxlIHRvIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IG1hbnkKK3N5c3RlbSBjb25maWd1cmF0aW9ucyB3aXRob3V0IHRoZSBuZWVkIHRvIHNwZWNpZnkgbGlicmFyeSBsb2NhdGlvbnMsIGhvd2V2ZXIgaWYKK3lvdSBydW4gaW50byBwcm9ibGVtcyBvciB3YW50IHRvIHJlZGlyZWN0IHRocmlmdCB0byBidWlsZCBhbmQgbGluayBhZ2FpbnN0IHlvdXIKK293biBwcm92aWRlZCB0aGlyZCBwYXJ0eSBsaWJyYXJpZXM6CisKK0JPT1NUX1JPT1QgOiBGb3IgYm9vc3QsIGUuZy4gRDpcYm9vc3RfMV81NV8wCitPUEVOU1NMX1JPT1RfRElSIDogRm9yIE9wZW5TU0wsIGUuZy4gRDpcT3BlblNTTC1XaW4zMgorCitvbmx5IHJlcXVpcmVkIGJ5IGxpYnRocmlmdG5iOgorCitMSUJFVkVOVF9ST09UX0RJUiA6IEZvciBMaWJldmVudCBlLmcuIEQ6XGxpYmV2ZW50LTIuMC4yMS1zdGFibGUKKworU2VlIC8zcmRwYXJ0eS51c2VyIGZvciBtb3JlIGRldGFpbHMuCisKK1RoZSBzYW1lIGxpbmtpbmcgZ3VpZGVsaW5lcyBkZXNjcmliZWQgYWJvdmUgZm9yIGxpYnRocmlmdG5iIGFwcGx5IHRvIHdpbmRvd3MgYXMgd2VsbC4KKworIyMgTGlua2luZyBBZ2FpbnN0IFRocmlmdAorCitZb3UgbmVlZCB0byBsaW5rIHlvdXIgcHJvamVjdCB0aGF0IHVzZXMgdGhyaWZ0IGFnYWluc3QgYWxsIHRoZSB0aHJpZnQKK2RlcGVuZGVuY2llczsgaW4gdGhlIGNhc2Ugb2YgbGlidGhyaWZ0LCBib29zdCBhbmQgZm9yCitsaWJ0aHJpZnRuYiwgbGliZXZlbnQuCisKK0luIHRoZSBwcm9qZWN0IHByb3BlcnRpZXMgeW91IG11c3QgYWxzbyBzZXQgSEFWRV9DT05GSUdfSCBhcyBmb3JjZSBpbmNsdWRlCit0aGUgY29uZmlnIGhlYWRlcjogIndpbmRvd3MvY29uZmcuaCIKKworIyMgRGVwZW5kZW5jaWVzCisKK1RoZSBzYW1lIGRlcGVuZGVuY2llcyBmb3Igc2hhcmVkX3B0ciBhcyBkZXNjcmliZWQgYWJvdmUgYXBwbHkgdG8gd2luZG93cyBhcyB3ZWxsLgorCitib29zdCB0aHJlYWQKK2h0dHA6Ly93d3cuYm9vc3Qub3JnL2RvYy9saWJzL3JlbGVhc2UvZG9jL2h0bWwvdGhyZWFkLmh0bWwKKworbGliZXZlbnQgKGZvciBsaWJ0aHJpZnRuYiBvbmx5KQoraHR0cDovL21vbmtleS5vcmcvfnByb3Zvcy9saWJldmVudC8KKworIyMgTm90ZXMgb24gYm9vc3QgdGhyZWFkIChzdGF0aWMgdnMgc2hhcmVkKToKKworQnkgZGVmYXVsdCBsaWIvY3BwL3dpbmRvd3MvZm9yY2VfaW5jLmggZGVmaW5lczoKKworICAgICNkZWZpbmUgQk9PU1RfQUxMX05PX0xJQiAxCisgICAgI2RlZmluZSBCT09TVF9USFJFQURfTk9fTElCIDEKKworVGhpcyBoYXMgZm9yIGVmZmVjdCB0byBoYXZlIHRoZSBob3N0IGFwcGxpY2F0aW9uIGxpbmtpbmcgYWdhaW5zdCBUaHJpZnQKK3RvIGhhdmUgdG8gbGluayB3aXRoIGJvb3N0IHRocmVhZCBhcyBhIHN0YXRpYyBsaWJyYXJ5LgorCitJZiB5b3Ugd2FudGVkIGluc3RlYWQgdG8gbGluayB3aXRoIGJvb3N0IHRocmVhZCBhcyBhIHNoYXJlZCBsaWJyYXJ5LAoreW91J2xsIG5lZWQgdG8gdW5jb21tZW50IHRob3NlIHR3byBsaW5lcywgYW5kIHJlY29tcGlsZS4KKworIyMgV2luZG93cyB2ZXJzaW9uIGNvbXBhdGliaWxpdHkKKworVGhlIFRocmlmdCBsaWJyYXJ5IHRhcmdldHMgV2luZG93cyBYUCBmb3IgYnJvYWRlc3QgY29tcGF0YmlsaXR5LiBBIG5vdGFibGUKK2RpZmZlcmVuY2UgaXMgaW4gdGhlIFdpbmRvd3Mtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNvY2tldCBwb2xsCitmdW5jdGlvbi4gVG8gdGFyZ2V0IFZpc3RhLCBXaW43IG9yIG90aGVyIHZlcnNpb25zLCBjb21tZW50IG91dCB0aGUgbGluZQorCisgICAgI2RlZmluZSBUQVJHRVRfV0lOX1hQLgorCisjIyBOYW1lZCBQaXBlcworCitOYW1lZCBQaXBlIHRyYW5zcG9ydCBoYXMgYmVlbiBhZGRlZCBpbiB0aGUgVFBpcGUgYW5kIFRQaXBlU2VydmVyIGNsYXNzZXMuIFRoaXMKK2lzIGN1cnJlbnRseSBXaW5kb3dzLW9ubHkuIE5hbWVkIHBpcGUgdHJhbnNwb3J0IGZvciAqTklYIGhhcyBub3QgYmVlbgoraW1wbGVtZW50ZWQuIERvbWFpbiBzb2NrZXRzIGFyZSBhIGJldHRlciBjaG9pY2UgZm9yIGxvY2FsIElQQyB1bmRlciBub24tV2luZG93cworT1Mncy4gKk5JWCBuYW1lZCBwaXBlcyBvbmx5IHN1cHBvcnQgMToxIGNsaWVudC1zZXJ2ZXIgY29ubmVjdGlvbi4KKworIyBUaHJpZnQvU1NMCisKKyMjIFNjb3BlCisKK1RoaXMgU1NMIG9ubHkgc3VwcG9ydHMgYmxvY2tpbmcgbW9kZSBzb2NrZXQgSS9PLiBJdCBjYW4gb25seSBiZSB1c2VkIHdpdGgKK1RTaW1wbGVTZXJ2ZXIsIFRUaHJlYWRlZFNlcnZlciwgYW5kIFRUaHJlYWRQb29sU2VydmVyLgorCisjIyBJbXBsZW1lbnRhdGlvbgorCitUaGVyZSdyZSB0d28gbWFpbiBjbGFzc2VzIFRTU0xTb2NrZXRGYWN0b3J5IGFuZCBUU1NMU29ja2V0LiBJbnN0YW5jZXMgb2YKK1RTU0xTb2NrZXQgYXJlIGFsd2F5cyBjcmVhdGVkIGZyb20gVFNTTFNvY2tldEZhY3RvcnkuCisKK1Bvc2l4U1NMVGhyZWFkRmFjdG9yeSBjcmVhdGVzIFBvc2l4U1NMVGhyZWFkLiBUaGUgb25seSBkaWZmZXJlbmNlIGZyb20gdGhlCitQdGhyZWFkVGhyZWFkIHR5cGUgaXMgdGhhdCBpdCBjbGVhbnVwcyBPcGVuU1NMIGVycm9yIHF1ZXVlIHVwb24gZXhpdGluZwordGhlIHRocmVhZC4gSWRlYWxseSwgT3BlblNTTCBBUElzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIFBvc2l4U1NMVGhyZWFkLgorCisjIyBIb3cgdG8gdXNlIFNTTCBBUElzCisKK1RoaXMgaXMgZm9yIGRlbW8uIEluIHJlYWwgY29kZSwgdHlwaWNhbGx5IG9ubHkgb25lIFRTU0xTb2NrZXRGYWN0b3J5CitpbnN0YW5jZSBpcyBuZWVkZWQuCisKKyAgICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBnZXRTU0xTb2NrZXRGYWN0b3J5KCkgeworICAgICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeShuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7CisgICAgICAvLyBjbGllbnQ6IGxvYWQgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMKKyAgICAgIGZhY3RvcnktPmxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKCJteS10cnVzdGVkLWNhLWNlcnRpZmljYXRlcy5wZW0iKTsKKyAgICAgIC8vIGNsaWVudDogb3B0aW9uYWxseSBzZXQgeW91ciBvd24gYWNjZXNzIG1hbmFnZXIsIG90aGVyd2lzZSwKKyAgICAgIC8vICAgICAgICAgdGhlIGRlZmF1bHQgY2xpZW50IGFjY2VzcyBtYW5hZ2VyIHdpbGwgYmUgbG9hZGVkLgorCisgICAgICBmYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoIm15LWNlcnRpZmljYXRlLXNpZ25lZC1ieS1jYS5wZW0iKTsKKyAgICAgIGZhY3RvcnktPmxvYWRQcml2YXRlS2V5KCJteS1wcml2YXRlLWtleS5wZW0iKTsKKyAgICAgIC8vIHNlcnZlcjogb3B0aW9uYWxseSBzZXR1cCBhY2Nlc3MgbWFuYWdlcgorICAgICAgLy8gc2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBhY2Nlc3NNYW5hZ2VyKG5ldyBNeUFjY2Vzc01hbmFnZXIpOworICAgICAgLy8gZmFjdG9yeS0+YWNjZXNzKGFjY2Vzc01hbmFnZXIpOworICAgICAgLi4uCisgICAgfQorCisKK2NsaWVudCBjb2RlIHNhbXBsZQorCisgICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSA9IGdldFNTTFNvY2tldEZhY3RvcnkoKTsKKyAgICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldCA9IGZhY3RvcnkuY3JlYXRlU29ja2V0KGhvc3QsIHBvcnQpOworICAgIHNoYXJlZF9wdHI8VEJ1ZmZlcmVkVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpKTsKKyAgICAuLi4KKworCitzZXJ2ZXIgY29kZSBzYW1wbGUKKworICAgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkgPSBnZXRTU0xTb2NrZXRGYWN0b3J5KCk7CisgICAgc2hhcmVkX3B0cjxUU1NMU2VydmVyU29ja2V0PiBzb2NrZXQobmV3IFRTU0xTZXJ2ZXJTb2NrZXQocG9ydCwgZmFjdG9yeSkpOworICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkobmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkpKTsKKyAgICAuLi4KKworIyMgQWNjZXNzTWFuYWdlcgorCitBY2Nlc3NNYW5hZ2VyIGRlZmluZXMgYSBjYWxsYmFjayBpbnRlcmZhY2UuIEl0IGhhcyB0aHJlZSBjYWxsYmFjayBtZXRob2RzOgorCisoYSkgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhKTsKKworKGIpIERlY2lzaW9uIHZlcmlmeShjb25zdCBzdHJpbmcmIGhvc3QsIGNvbnN0IGNoYXIqIG5hbWUsIGludCBzaXplKTsKKworKGMpIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSwgY29uc3QgY2hhciogZGF0YSwgaW50IHNpemUpOworCitBZnRlciBTU0wgaGFuZHNoYWtlIGNvbXBsZXRlcywgYWRkaXRpb25hbCBjaGVja3MgYXJlIGNvbmR1Y3RlZC4gQXBwbGljYXRpb24KK2lzIGdpdmVuIHRoZSBjaGFuY2UgdG8gZGVjaWRlIHdoZXRoZXIgb3Igbm90IHRvIGNvbnRpbnVlIHRoZSBjb252ZXJzYXRpb24KK3dpdGggdGhlIHJlbW90ZS4gQXBwbGljYXRpb24gaXMgcXVlcmllZCB0aHJvdWdoIHRoZSBhYm92ZSB0aHJlZSAidmVyaWZ5IgorbWV0aG9kLiBUaGV5IGFyZSBjYWxsZWQgYXQgZGlmZmVyZW50IHBvaW50cyBvZiB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MuCisKK0RlY2lzaW9ucyBjYW4gYmUgb25lIG9mIEFMTE9XLCBERU5ZLCBhbmQgU0tJUC4gQUxMT1cgYW5kIERFTlkgbWVhbnMgdGhlCitjb252ZXJzYXRpb24gc2hvdWxkIGJlIGNvbnRpbnVlZCBvciBkaXNjb25uZWN0ZWQsIHJlc3BlY3RpdmVseS4gQUxMT1cgYW5kCitERU5ZIGRlY2lzaW9uIHN0b3BzIHRoZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy4gU0tJUCBtZWFucyB0aGVyZSdzIG5vIGRlY2lzaW9uCitiYXNlZCBvbiB0aGUgZ2l2ZW4gaW5wdXQsIGNvbnRpbnVlIHRoZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy4KKworRmlyc3QsIChhKSBpcyBjYWxsZWQgd2l0aCB0aGUgcmVtb3RlIElQLiBJdCBpcyBjYWxsZWQgb25jZSBhdCB0aGUgYmVnaW5uaW5nLgorInNhIiBpcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIHBlZXIuCisKK1RoZW4sIHRoZSBjZXJ0aWZpY2F0ZSBvZiByZW1vdGUgcGVlciBpcyBsb2FkZWQuIFN1YmplY3RBbHROYW1lIGV4dGVuc2lvbnMKK2FyZSBleHRyYWN0ZWQgYW5kIHNlbnQgdG8gYXBwbGljYXRpb24gZm9yIHZlcmlmaWNhdGlvbi4gV2hlbiBhIEROUworc3ViamVjdEFsdE5hbWUgZmllbGQgaXMgZXh0cmFjdGVkLCAoYikgaXMgY2FsbGVkLiBXaGVuIGFuIElQIHN1YmplY3RBbHROYW1lCitmaWVsZCBpcyBleHRyYWN0ZWQsIChjKSBpcyBjYWxsZWQuCisKK1RoZSAiaG9zdCIgaW4gKGIpIGlzIHRoZSB2YWx1ZSBmcm9tIFRTb2NrZXQ6OmdldEhvc3QoKSBpZiB0aGlzIGlzIGEgY2xpZW50CitzaWRlIHNvY2tldCwgb3IgVFNvY2tldDo6Z2V0UGVlckhvc3QoKSBpZiB0aGlzIGlzIGEgc2VydmVyIHNpZGUgc29ja2V0LiBUaGUKK3JlYXNvbiBpcyBjbGllbnQgc2lkZSBzb2NrZXQgaW5pdGlhdGVzIHRoZSBjb25uZWN0aW9uLiBUU29ja2V0OjpnZXRIb3N0KCkKK2lzIHRoZSByZW1vdGUgaG9zdCBuYW1lLiBPbiBzZXJ2ZXIgc2lkZSwgdGhlIHJlbW90ZSBob3N0IG5hbWUgaXMgdW5rbm93bgordW5sZXNzIGl0J3MgcmV0cmlldmVkIHRocm91Z2ggVFNvY2tldDo6Z2V0UGVlckhvc3QoKS4gRWl0aGVyIHdheSwgImhvc3QiCitzaG91bGQgYmUgdGhlIHJlbW90ZSBob3N0IG5hbWUuIEtlZXAgaW4gbWluZCwgaWYgVFNvY2tldDo6Z2V0UGVlckhvc3QoKQorZmFpbGVkLCBpdCB3b3VsZCByZXR1cm4gdGhlIHJlbW90ZSBob3N0IG5hbWUgaW4gbnVtZXJpYyBmb3JtYXQuCisKK0lmIGFsbCBzdWJqZWN0QWx0TmFtZSBleHRlbnNpb25zIHdlcmUgInNraXBwZWQiLCB0aGUgY29tbW9uIG5hbWUgZmllbGQgd291bGQKK2JlIGNoZWNrZWQuIEl0IGlzIHNlbnQgdG8gYXBwbGljYXRpb24gdGhyb3VnaCAoYyksIHdoZXJlICJzYSIgaXMgdGhlIHJlbW90ZQorSVAgYWRkcmVzcy4gImRhdGEiIGlzIHRoZSBJUCBhZGRyZXNzIGV4dHJhY3RlZCBmcm9tIHN1YmplY3RBbHROYW1lIElQCitleHRlbnNpb24sIGFuZCAic2l6ZSIgaXMgdGhlIGxlbmd0aCBvZiB0aGUgZXh0ZW5zaW9uIGRhdGEuCisKK0lmIGFueSBvZiB0aGUgYWJvdmUgInZlcmlmeSIgbWV0aG9kcyByZXR1cm5lZCBhIGRlY2lzaW9uIEFMTE9XIG9yIERFTlksIHRoZQordmVyaWZpY2F0aW9uIHByb2Nlc3Mgd291bGQgYmUgc3RvcHBlZC4KKworSWYgYW55IG9mIHRoZSBhYm92ZSAidmVyaWZ5IiBtZXRob2RzIHJldHVybmVkIFNLSVAsIHRoYXQgZGVjaXNpb24gd291bGQgYmUKK2lnbm9yZWQgYW5kIHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyB3b3VsZCBtb3ZlIG9uIHRpbGwgdGhlIGxhc3QgaXRlbSBpcworZXhhbWluZWQuIEF0IHRoYXQgcG9pbnQsIGlmIHRoZXJlJ3Mgc3RpbGwgbm8gZGVjaXNpb24sIHRoZSBjb25uZWN0aW9uIGlzCit0ZXJtaW5hdGVkLgorCitUaHJlYWQgc2FmZXR5LCBhbiBhY2Nlc3MgbWFuYWdlciBzaG91bGQgbm90IHN0b3JlIHN0YXRlIGluZm9ybWF0aW9uIGlmIGl0J3MKK3RvIGJlIHVzZWQgYnkgbWFueSBTU0wgc29ja2V0cy4KKworIyMgU0lHUElQRSBzaWduYWwKKworQXBwbGljYXRpb25zIHJ1bm5pbmcgT3BlblNTTCBvdmVyIG5ldHdvcmsgY29ubmVjdGlvbnMgbWF5IGNyYXNoIGlmIFNJR1BJUEUKK2lzIG5vdCBpZ25vcmVkLiBUaGlzIGhhcHBlbnMgd2hlbiB0aGV5IHJlY2VpdmUgYSBjb25uZWN0aW9uIHJlc2V0IGJ5IHJlbW90ZQorcGVlciBleGNlcHRpb24sIHdoaWNoIHNvbWVob3cgdHJpZ2dlcnMgYSBTSUdQSVBFIHNpZ25hbC4gSWYgbm90IGhhbmRsZWQsCit0aGlzIHNpZ25hbCB3b3VsZCBraWxsIHRoZSBhcHBsaWNhdGlvbi4KKworIyMgSG93IHRvIHJ1biB0ZXN0IGNsaWVudC9zZXJ2ZXIgaW4gU1NMIG1vZGUKKworVGhlIHNlcnZlciBhbmQgY2xpZW50IGV4cGVjdHMgdGhlIGZvbGxvd2luZ3MgZnJvbSB0aGUgZGlyZWN0b3J5IC90ZXN0LworCistIGtleXMvc2VydmVyLmNydAorLSBrZXlzL3NlcnZlci5rZXkKKy0ga2V5cy9DQS5wZW0KKworVGhlIGZpbGUgbmFtZXMgYXJlIGhhcmQgY29kZWQgaW4gdGhlIHNvdXJjZSBjb2RlLiBZb3UgbmVlZCB0byBjcmVhdGUgdGhlc2UKK2NlcnRpZmljYXRlcyBiZWZvcmUgeW91IGNhbiBydW4gdGhlIHRlc3QgY29kZSBpbiBTU0wgbW9kZS4gTWFrZSBzdXJlIGF0IGxlYXN0CitvbmUgb2YgdGhlIGZvbGxvd2luZ3MgaXMgaW5jbHVkZWQgaW4gImtleXMvc2VydmVyLmNydCIsCisKKy0gc3ViamVjdEFsdE5hbWUsIEROUyBsb2NhbGhvc3QKKy0gc3ViamVjdEFsdE5hbWUsIElQICAxMjcuMC4wLjEKKy0gY29tbW9uIG5hbWUsICAgIGxvY2FsaG9zdAorCitSdW4gd2l0aGluIC90ZXN0LyBmb2xkZXIsCisKKyAgICAgICAgIC4vY3BwL1Rlc3RTZXJ2ZXIgLS1zc2wgJgorICAgICAgICAgLi9jcHAvVGVzdENsaWVudCAtLXNzbAorCitJZiAiLWggPGhvc3Q+IiBpcyB1c2VkIHRvIHJ1biBjbGllbnQsIHRoZSBhYm92ZSAibG9jYWxob3N0IiBpbiB0aGUgYWJvdmUKK2tleXMvc2VydmVyLmNydCBoYXMgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGF0IGhvc3QgbmFtZS4KKworIyMgVFNTTFNvY2tldEZhY3Rvcnk6OnJhbmRvbWl6ZSgpCisKK1RoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIE9wZW5TU0xTb2NrZXRGYWN0b3J5OjpyYW5kb21pemUoKSBzaW1wbHkgY2FsbHMKK09wZW5TU0wncyBSQU5EX3BvbGwoKSB3aGVuIE9wZW5TU0wgbGlicmFyeSBpcyBmaXJzdCBpbml0aWFsaXplZC4KKworVGhlIFBSTkcgc2VlZCBpcyBrZXkgdG8gdGhlIGFwcGxpY2F0aW9uIHNlY3VyaXR5LiBUaGlzIG1ldGhvZCBzaG91bGQgYmUKK292ZXJyaWRkZW4gaWYgaXQncyBub3Qgc3Ryb25nIGVub3VnaCBmb3IgeW91LgorCisjIEJyZWFraW5nIENoYW5nZXMKKworIyMgMC4xMS4wCisKK09sZGVyIHZlcnNpb25zIG9mIHRocmlmdCBkZXBlbmRlZCBvbiB0aGUgPGJvb3N0L3NtYXJ0X3B0ci5ocHA+IGNsYXNzZXMgd2hpY2gKK3dlcmUgdXNlZCBpbiB0aHJpZnQgaGVhZGVycyB0byBkZWZpbmUgaW50ZXJmYWNlcy4gIFRocmlmdCBub3cgZGV0ZWN0cyBDKysxMQorYXQgYnVpbGQgdGltZSBhbmQgd2lsbCBwcmVmZXIgdG8gdXNlIDxtZW1vcnk+IGNsYXNzZXMgZnJvbSBDKysxMSBpbnN0ZWFkLgorWW91IGNhbiBmb3JjZSB0aGUgbGlicmFyeSB0byBidWlsZCB3aXRoIGJvb3N0IG1lbW9yeSBjbGFzc2VzIGJ5IGRlZmluaW5nIHRoZQorcHJlcHJvY2Vzc29yIG1hY3JvIGBGT1JDRV9CT09TVF9TTUFSVF9QVFJgLiAgKFRIUklGVC0yMjIxKQorCitJbiB0aGUgcHRocmVhZCBtdXRleCBpbXBsZW1lbnRhdGlvbiwgdGhlIGNvbnRlbnRpb24gcHJvZmlsaW5nIGNvZGUgd2FzIGVuYWJsZWQKK2J5IGRlZmF1bHQgaW4gYWxsIGJ1aWxkcy4gIFRoaXMgY2hhbmdlZCB0byBiZSBkaXNhYmxlZCBieSBkZWZhdWx0LiAgKFRIUklGVC00MTUxKQorCitJbiBvbGRlciByZWxlYXNlcywgaWYgYSBUU1NMU29ja2V0RmFjdG9yeSdzIGxpZmV0aW1lIHdhcyBub3QgYXQgbGVhc3QgYXMgbG9uZworYXMgdGhlIFRTU0xTb2NrZXRzIGl0IGNyZWF0ZWQsIHdlIHNpbGVudGx5IHJldmVydGVkIG9wZW5zc2wgdG8gdW5zYWZlIG11bHRpdGhyZWFkIGJlaGF2aW9yCithbmQgc28gdGhlIHJlc3VsdHMgd2VyZSB1bmRlZmluZWQuICBDaGFuZ2VzIHdlcmUgbWFkZSBpbiAwLjExLjAgdGhhdCBjYXVzZSBlaXRoZXIgYW4KK2Fzc2VydGlvbiBvciBhIGNvcmUgaW5zdGVhZCBvZiB1bmRlZmluZWQgYmVoYXZpb3IuICBUaGUgbGlmZXRpbWUgb2YgYSBUU1NMU29ja2V0RmFjdG9yeQorKm11c3QqIGJlIGxvbmdlciB0aGFuIGFueSBUU1NMU29ja2V0IHRoYXQgaXQgY3JlYXRlcywgb3RoZXJ3aXNlIG9wZW5zc2wgd2lsbCBiZSBjbGVhbmVkCit1cCB0b28gZWFybHkuICBJZiB0aGUgc3RhdGljIGJvb2xlYW4gaXMgc2V0IHRvIGRpc2FibGUgb3BlbnNzbCBpbml0aWFsaXphdGlvbiBhbmQKK2NsZWFudXAgYW5kIGxlYXZlIGl0IHVwIHRvIHRoZSBjb25zdW1pbmcgYXBwbGljYXRpb24sIHRoaXMgcmVxdWlyZW1lbnQgaXMgbm90IG5lZWRlZC4KKyhUSFJJRlQtNDE2NCkKKwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2NwcC9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMThjNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSw0IEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKKworICogc2VlIC5jbGFuZy1mb3JtYXQgaW4gcm9vdCBkaXIgZm9yIHNldHRpbmdzIG9mIGFjY2VwdGVkIGZvcm1hdAorICogY2xhbmctZm9ybWF0ICgzLjUgb3IgbmV3ZXIpIGNhbiBiZSB1c2VkIHRvIGF1dG9tYXRpY2FseSByZWZvcm1hdCBjb2RlICgnbWFrZSBzdHlsZScgY29tbWFuZCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvbGlidGhyaWZ0LnZjeHByb2ogYi9saWIvY3BwL2xpYnRocmlmdC52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMDk3ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL2xpYnRocmlmdC52Y3hwcm9qCkBAIC0wLDAgKzEsMzY2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnLW10fFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnLW10PC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Zy1tdHx4NjQiPgorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWctbXQ8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8eDY0Ij4KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZS1tdHxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlLW10PC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlLW10fHg2NCI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlLW10PC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfHg2NCI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY0NoYW5uZWwuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8uY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XEJvb3N0TW9uaXRvci5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XEJvb3N0TXV0ZXguY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxCb29zdFRocmVhZEZhY3RvcnkuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxTdGRUaHJlYWRGYWN0b3J5LmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcVGhyZWFkTWFuYWdlci5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcVGltZXJNYW5hZ2VyLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxVdGlsLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm9jZXNzb3JcUGVla1Byb2Nlc3Nvci5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEJhc2U2NFV0aWxzLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVERlYnVnUHJvdG9jb2wuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRKU09OUHJvdG9jb2wuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRQcm90b2NvbC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVE11bHRpcGxleGVkUHJvdG9jb2wuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUU2ltcGxlU2VydmVyLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFRocmVhZFBvb2xTZXJ2ZXIuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUVGhyZWFkZWRTZXJ2ZXIuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUQ29ubmVjdGVkQ2xpZW50LmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVE5vbmJsb2NraW5nU2VydmVyLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFNlcnZlckZyYW1ld29yay5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUT3V0cHV0LmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEJ1ZmZlclRyYW5zcG9ydHMuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxURkRUcmFuc3BvcnQuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEh0dHBDbGllbnQuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEh0dHBTZXJ2ZXIuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEh0dHBUcmFuc3BvcnQuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUUGlwZS5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUUGlwZVNlcnZlci5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU2VydmVyU29ja2V0LmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNpbXBsZUZpbGVUcmFuc3BvcnQuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEZpbGVUcmFuc3BvcnQuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNvY2tldC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTU0xTb2NrZXQuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUVHJhbnNwb3J0RXhjZXB0aW9uLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFRyYW5zcG9ydFV0aWxzLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXEdldFRpbWVPZkRheS5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFNvY2tldFBhaXIuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFRXaW5zb2NrU2luZ2xldG9uLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xXaW5GY250bC5jcHAiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQXN5bmNDaGFubmVsLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcQm9vc3RUaHJlYWRGYWN0b3J5LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XFN0ZFRocmVhZEZhY3RvcnkuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcRXhjZXB0aW9uLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XFBsYXRmb3JtVGhyZWFkRmFjdG9yeS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm9jZXNzb3JcUGVla1Byb2Nlc3Nvci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm9jZXNzb3JcVE11bHRpcGxleGVkUHJvY2Vzc29yLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRCaW5hcnlQcm90b2NvbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxURGVidWdQcm90b2NvbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUSlNPTlByb3RvY29sLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRNdWx0aXBsZXhlZFByb3RvY29sLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRQcm90b2NvbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUVmlydHVhbFByb3RvY29sLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUU2VydmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUU2ltcGxlU2VydmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUVGhyZWFkUG9vbFNlcnZlci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFRocmVhZGVkU2VydmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUaHJpZnQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcVE91dHB1dC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUUHJvY2Vzc29yLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUQnVmZmVyVHJhbnNwb3J0cy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEZEVHJhbnNwb3J0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxURmlsZVRyYW5zcG9ydC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEh0dHBDbGllbnQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRIdHRwU2VydmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUUGlwZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFBpcGVTZXJ2ZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTZXJ2ZXJTb2NrZXQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTZXJ2ZXJUcmFuc3BvcnQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTaW1wbGVGaWxlVHJhbnNwb3J0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU29ja2V0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU1NMU29ja2V0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUVHJhbnNwb3J0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUVHJhbnNwb3J0RXhjZXB0aW9uLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUVHJhbnNwb3J0VXRpbHMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRWaXJ0dWFsVHJhbnNwb3J0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcY29uZmlnLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcR2V0VGltZU9mRGF5LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcT3BlcmF0b3JzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xTb2NrZXRQYWlyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcVFdpbnNvY2tTaW5nbGV0b24uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xXaW5GY250bC5oIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Tm9uZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRCaW5hcnlQcm90b2NvbC50Y2MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+CisgICAgPFByb2plY3RHdWlkPntERDI2RjU3RS02MEYyLTRGMzctQTYxNi1EMjE5QTlCRjMzOEZ9PC9Qcm9qZWN0R3VpZD4KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+CisgICAgPFJvb3ROYW1lc3BhY2U+dGhyaWZ0PC9Sb290TmFtZXNwYWNlPgorICAgIDxQcm9qZWN0TmFtZT5saWJ0aHJpZnQ8L1Byb2plY3ROYW1lPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz50cnVlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz50cnVlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+dHJ1ZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPnRydWU8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+ZmFsc2U8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+ZmFsc2U8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPmZhbHNlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz5mYWxzZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9IjNyZHBhcnR5LnByb3BzIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9IjNyZHBhcnR5LnByb3BzIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9IjNyZHBhcnR5LnByb3BzIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9IjNyZHBhcnR5LnByb3BzIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoQk9PU1RfUk9PVClcaW5jbHVkZTskKEJPT1NUX1JPT1QpXDskKE9QRU5TU0xfUk9PVF9ESVIpXGluY2x1ZGVcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyI+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoT1BFTlNTTF9ST09UX0RJUilcaW5jbHVkZVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoT1BFTlNTTF9ST09UX0RJUilcaW5jbHVkZVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8eDY0JyI+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoT1BFTlNTTF9ST09UX0RJUilcaW5jbHVkZVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoQk9PU1RfUk9PVClcaW5jbHVkZTskKEJPT1NUX1JPT1QpXDskKE9QRU5TU0xfUk9PVF9ESVIpXGluY2x1ZGVcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIj4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChPUEVOU1NMX1JPT1RfRElSKVxpbmNsdWRlXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoQk9PU1RfUk9PVClcaW5jbHVkZTskKEJPT1NUX1JPT1QpXDskKE9QRU5TU0xfUk9PVF9ESVIpXGluY2x1ZGVcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyI+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoT1BFTlNTTF9ST09UX0RJUilcaW5jbHVkZVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO19ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKEludERpcilsaWJ0aHJpZnQucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWdETEw8L1J1bnRpbWVMaWJyYXJ5PgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHxXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+Tm90VXNpbmc8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7X0RFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoSW50RGlyKWxpYnRocmlmdC5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+Tm90VXNpbmc8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7X0RFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHx4NjQnIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO19ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5PgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+Tm90VXNpbmc8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO05ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKEludERpcilsaWJ0aHJpZnQucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHxXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfQ09ORklHX0g9MTtXSU4zMjtOREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChJbnREaXIpbGlidGhyaWZ0LnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+Tm90VXNpbmc8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO05ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHx4NjQnIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7TkRFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5PgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+CisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4KKyAgPC9JbXBvcnRHcm91cD4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9jcHAvbGlidGhyaWZ0LnZjeHByb2ouZmlsdGVycyBiL2xpYi9jcHAvbGlidGhyaWZ0LnZjeHByb2ouZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjY0Zjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9saWJ0aHJpZnQudmN4cHJvai5maWx0ZXJzCkBAIC0wLDAgKzEsMjgzIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SXRlbUdyb3VwPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEJ1ZmZlclRyYW5zcG9ydHMuY3BwIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRPdXRwdXQuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUQXBwbGljYXRpb25FeGNlcHRpb24uY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFN0ZEFmeC5jcHAiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUVHJhbnNwb3J0RXhjZXB0aW9uLmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXEdldFRpbWVPZkRheS5jcHAiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XFRocmVhZE1hbmFnZXIuY3BwIj4KKyAgICAgIDxGaWx0ZXI+Y29uY3VycmVuY3k8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcVGltZXJNYW5hZ2VyLmNwcCI+CisgICAgICA8RmlsdGVyPmNvbmN1cnJlbmN5PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XFV0aWwuY3BwIj4KKyAgICAgIDxGaWx0ZXI+Y29uY3VycmVuY3k8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVERlYnVnUHJvdG9jb2wuY3BwIj4KKyAgICAgIDxGaWx0ZXI+cHJvdG9jb2w8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEJhc2U2NFV0aWxzLmNwcCI+CisgICAgICA8RmlsdGVyPnByb3RvY29sPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRKU09OUHJvdG9jb2wuY3BwIj4KKyAgICAgIDxGaWx0ZXI+cHJvdG9jb2w8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVE11bHRpcGxleGVkUHJvdG9jb2wuY3BwIj4KKyAgICAgIDxGaWx0ZXI+cHJvdG9jb2w8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRGRFRyYW5zcG9ydC5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRGaWxlVHJhbnNwb3J0LmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNpbXBsZUZpbGVUcmFuc3BvcnQuY3BwIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUSHR0cFRyYW5zcG9ydC5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRIdHRwQ2xpZW50LmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEh0dHBTZXJ2ZXIuY3BwIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU1NMU29ja2V0LmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFRyYW5zcG9ydFV0aWxzLmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFNpbXBsZVNlcnZlci5jcHAiPgorICAgICAgPEZpbHRlcj5zZXJ2ZXI8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRUaHJlYWRQb29sU2VydmVyLmNwcCI+CisgICAgICA8RmlsdGVyPnNlcnZlcjwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFRocmVhZGVkU2VydmVyLmNwcCI+CisgICAgICA8RmlsdGVyPnNlcnZlcjwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQXN5bmNDaGFubmVsLmNwcCI+CisgICAgICA8RmlsdGVyPmFzeW5jPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8uY3BwIj4KKyAgICAgIDxGaWx0ZXI+YXN5bmM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvY2Vzc29yXFBlZWtQcm9jZXNzb3IuY3BwIj4KKyAgICAgIDxGaWx0ZXI+cHJvY2Vzc29yPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU2VydmVyU29ja2V0LmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNvY2tldC5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xUV2luc29ja1NpbmdsZXRvbi5jcHAiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcU29ja2V0UGFpci5jcHAiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XEJvb3N0TW9uaXRvci5jcHAiPgorICAgICAgPEZpbHRlcj5jb25jdXJyZW5jeTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxCb29zdE11dGV4LmNwcCI+CisgICAgICA8RmlsdGVyPmNvbmN1cnJlbmN5PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XEJvb3N0VGhyZWFkRmFjdG9yeS5jcHAiPgorICAgICAgPEZpbHRlcj5jb25jdXJyZW5jeTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxTdGRUaHJlYWRGYWN0b3J5LmNwcCI+CisgICAgICA8RmlsdGVyPmNvbmN1cnJlbmN5PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcV2luRmNudGwuY3BwIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFBpcGUuY3BwIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUUGlwZVNlcnZlci5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUQnVmZmVyVHJhbnNwb3J0cy5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU29ja2V0LmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEJpbmFyeVByb3RvY29sLmgiPgorICAgICAgPEZpbHRlcj5wcm90b2NvbDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUaHJpZnQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcVFByb2Nlc3Nvci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUQXBwbGljYXRpb25FeGNlcHRpb24uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xTdGRBZnguaCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xUYXJnZXRWZXJzaW9uLmgiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XEV4Y2VwdGlvbi5oIj4KKyAgICAgIDxGaWx0ZXI+Y29uY3VycmVuY3k8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRWaXJ0dWFsVHJhbnNwb3J0LmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRUcmFuc3BvcnQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcR2V0VGltZU9mRGF5LmgiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU2VydmVyVHJhbnNwb3J0LmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xjb25maWcuaCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVFByb3RvY29sLmgiPgorICAgICAgPEZpbHRlcj5wcm90b2NvbDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUVmlydHVhbFByb3RvY29sLmgiPgorICAgICAgPEZpbHRlcj5wcm90b2NvbDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFNlcnZlci5oIj4KKyAgICAgIDxGaWx0ZXI+c2VydmVyPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUU2ltcGxlU2VydmVyLmgiPgorICAgICAgPEZpbHRlcj5zZXJ2ZXI8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRUaHJlYWRQb29sU2VydmVyLmgiPgorICAgICAgPEZpbHRlcj5zZXJ2ZXI8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRUaHJlYWRlZFNlcnZlci5oIj4KKyAgICAgIDxGaWx0ZXI+c2VydmVyPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY0NoYW5uZWwuaCI+CisgICAgICA8RmlsdGVyPmFzeW5jPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaCI+CisgICAgICA8RmlsdGVyPmFzeW5jPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb2Nlc3NvclxQZWVrUHJvY2Vzc29yLmgiPgorICAgICAgPEZpbHRlcj5wcm9jZXNzb3I8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvY2Vzc29yXFRNdWx0aXBsZXhlZFByb2Nlc3Nvci5oIj4KKyAgICAgIDxGaWx0ZXI+cHJvY2Vzc29yPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxURkRUcmFuc3BvcnQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEZpbGVUcmFuc3BvcnQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEh0dHBDbGllbnQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEh0dHBTZXJ2ZXIuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNTTFNvY2tldC5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUVHJhbnNwb3J0VXRpbHMuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNpbXBsZUZpbGVUcmFuc3BvcnQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUSlNPTlByb3RvY29sLmgiPgorICAgICAgPEZpbHRlcj5wcm90b2NvbDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbC5oIj4KKyAgICAgIDxGaWx0ZXI+cHJvdG9jb2w8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVERlYnVnUHJvdG9jb2wuaCI+CisgICAgICA8RmlsdGVyPnByb3RvY29sPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU2VydmVyU29ja2V0LmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xPcGVyYXRvcnMuaCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xUV2luc29ja1NpbmdsZXRvbi5oIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFNvY2tldFBhaXIuaCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xmb3JjZV9pbmMuaCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcQm9vc3RUaHJlYWRGYWN0b3J5LmgiPgorICAgICAgPEZpbHRlcj5jb25jdXJyZW5jeTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxTdGRUaHJlYWRGYWN0b3J5LmgiPgorICAgICAgPEZpbHRlcj5jb25jdXJyZW5jeTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxQbGF0Zm9ybVRocmVhZEZhY3RvcnkuaCI+CisgICAgICA8RmlsdGVyPmNvbmN1cnJlbmN5PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcV2luRmNudGwuaCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRQaXBlLmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRQaXBlU2VydmVyLmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEZpbHRlciBJbmNsdWRlPSJwcm90b2NvbCI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57MDdjZWQxOWItYjcyYS00MTA1LTlmZmItNmQyYmNmNjQ0OTdlfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InRyYW5zcG9ydCI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57ZTlmNjE0MDQtMTE0OC00MTAzLWJkNmYtZTU4NjlkMzdmYTc5fTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9IndpbmRvd3MiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezI4MTQwMDJhLTNjNjgtNDI3ZS1iMGViLTMzYWNkMmY0MDZhZX08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJjb25jdXJyZW5jeSI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57YWRkZDQ3MDctZGJhYS00ZDBjLWJlZjYtZmZmOGJlN2I0OTVhfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNlcnZlciI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57ZjU1YThlOWItNjk1OS00ODdmLWEzOTYtYzMxYjRkNmM2MWQ2fTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9ImFzeW5jIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPntkNTI2ODg1Yi0xYjNlLTRlZTMtODAyNy1lNjk0ZmU5OGFkNjN9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0icHJvY2Vzc29yIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns4ZjQyOGRhOC01YTgzLTQ0ZmItOTU3OC1kZTkzNWZiNDE1ZTF9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0id2luZG93c1x0cjEiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2VlYTEwNDA2LTMzODAtNGYyZC05MzY1LWMyNmZhMjg3NWRhZX08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEJpbmFyeVByb3RvY29sLnRjYyI+CisgICAgICA8RmlsdGVyPnByb3RvY29sPC9GaWx0ZXI+CisgICAgPC9Ob25lPgorICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1x0cjFcZnVuY3Rpb25hbCI+CisgICAgICA8RmlsdGVyPndpbmRvd3NcdHIxPC9GaWx0ZXI+CisgICAgPC9Ob25lPgorICA8L0l0ZW1Hcm91cD4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9jcHAvbGlidGhyaWZ0bmIudmN4cHJvaiBiL2xpYi9jcHAvbGlidGhyaWZ0bmIudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YTZmZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9saWJ0aHJpZnRuYi52Y3hwcm9qCkBAIC0wLDAgKzEsMjk4IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnLW10fFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnLW10PC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Zy1tdHx4NjQiPgorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWctbXQ8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8eDY0Ij4KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZS1tdHxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlLW10PC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlLW10fHg2NCI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlLW10PC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfHg2NCI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cENsaWVudENoYW5uZWwuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xURXZodHRwU2VydmVyLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFROb25ibG9ja2luZ1NlcnZlci5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmNwcCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRFdmh0dHBDbGllbnRDaGFubmVsLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRFdmh0dHBTZXJ2ZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFROb25ibG9ja2luZ1NlcnZlci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXGNvbmZpZy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXGZvcmNlX2luYy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFRhcmdldFZlcnNpb24uaCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4KKyAgICA8UHJvamVjdEd1aWQ+e0Q4Njk2Q0NFLTdENDYtNDY1OS1CNDMyLTkxNzU0QTQxREVCMH08L1Byb2plY3RHdWlkPgorICAgIDxLZXl3b3JkPldpbjMyUHJvajwvS2V5d29yZD4KKyAgICA8Um9vdE5hbWVzcGFjZT5saWJ0aHJpZnRuYjwvUm9vdE5hbWVzcGFjZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+dHJ1ZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+dHJ1ZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPnRydWU8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz50cnVlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPmZhbHNlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPmZhbHNlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz5mYWxzZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+ZmFsc2U8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAucHJvcHMiIC8+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9IjNyZHBhcnR5LnByb3BzIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChMSUJFVkVOVF9ST09UKVxXSU4zMi1Db2RlXDskKExJQkVWRU5UX1JPT1QpXGluY2x1ZGU7JChMSUJFVkVOVF9ST09UKVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8V2luMzInIj4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChMSUJFVkVOVF9ST09UKVxXSU4zMi1Db2RlXDskKExJQkVWRU5UX1JPT1QpXGluY2x1ZGU7JChMSUJFVkVOVF9ST09UKVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoTElCRVZFTlRfUk9PVClcV0lOMzItQ29kZVw7JChMSUJFVkVOVF9ST09UKVxpbmNsdWRlOyQoTElCRVZFTlRfUk9PVClcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fHg2NCciPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoQk9PU1RfUk9PVClcaW5jbHVkZTskKEJPT1NUX1JPT1QpXDskKExJQkVWRU5UX1JPT1QpXFdJTjMyLUNvZGVcOyQoTElCRVZFTlRfUk9PVClcaW5jbHVkZTskKExJQkVWRU5UX1JPT1QpXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoTElCRVZFTlRfUk9PVClcV0lOMzItQ29kZVw7JChMSUJFVkVOVF9ST09UKVxpbmNsdWRlOyQoTElCRVZFTlRfUk9PVClcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIj4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChMSUJFVkVOVF9ST09UKVxXSU4zMi1Db2RlXDskKExJQkVWRU5UX1JPT1QpXGluY2x1ZGU7JChMSUJFVkVOVF9ST09UKVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChMSUJFVkVOVF9ST09UKVxXSU4zMi1Db2RlXDskKExJQkVWRU5UX1JPT1QpXGluY2x1ZGU7JChMSUJFVkVOVF9ST09UKVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHx4NjQnIj4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChMSUJFVkVOVF9ST09UKVxXSU4zMi1Db2RlXDskKExJQkVWRU5UX1JPT1QpXGluY2x1ZGU7JChMSUJFVkVOVF9ST09UKVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO19ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKEludERpcilsaWJ0aHJpZnRuYi5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHxXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7X0RFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoSW50RGlyKWxpYnRocmlmdG5iLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfQ09ORklHX0g9MTtXSU4zMjtfREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fHg2NCciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7X0RFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7TkRFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoSW50RGlyKWxpYnRocmlmdG5iLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7TkRFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoSW50RGlyKWxpYnRocmlmdG5iLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO05ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHx4NjQnIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7TkRFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5PgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+CisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4KKyAgPC9JbXBvcnRHcm91cD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ouZmlsdGVycyBiL2xpYi9jcHAvbGlidGhyaWZ0bmIudmN4cHJvai5maWx0ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NzAzZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ouZmlsdGVycwpAQCAtMCwwICsxLDc1IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SXRlbUdyb3VwPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0ic2VydmVyIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPntiZjQ0OWQ5Mi00YmU4LTRmNmYtYTAxMC1jNTM2ZjU3YzZmMTN9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0iYXN5bmMiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezAyOTRkMGE2LWNlNDYtNGJlOC1hNjU5LTgyNmQ2ZTk4YWU0MX08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJ3aW5kb3dzIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns2MGZjOWU1ZS0wODY2LTRhYmEtODY2Mi00MzliYjRhNDYxZDN9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0idHJhbnNwb3J0Ij4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnsyM2ZlMmZkZS1hN2M5LTQzZWMtYTQwOS03ZjUzZGY1ZWVlNjR9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFROb25ibG9ja2luZ1NlcnZlci5jcHAiPgorICAgICAgPEZpbHRlcj5zZXJ2ZXI8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cENsaWVudENoYW5uZWwuY3BwIj4KKyAgICAgIDxGaWx0ZXI+YXN5bmM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cFNlcnZlci5jcHAiPgorICAgICAgPEZpbHRlcj5hc3luYzwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAiPgorICAgICAgPEZpbHRlcj5hc3luYzwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFN0ZEFmeC5jcHAiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuY3BwIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVE5vbmJsb2NraW5nU2VydmVyLmgiPgorICAgICAgPEZpbHRlcj5zZXJ2ZXI8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cENsaWVudENoYW5uZWwuaCI+CisgICAgICA8RmlsdGVyPmFzeW5jPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRFdmh0dHBTZXJ2ZXIuaCI+CisgICAgICA8RmlsdGVyPmFzeW5jPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgiPgorICAgICAgPEZpbHRlcj5hc3luYzwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXGNvbmZpZy5oIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFN0ZEFmeC5oIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFRhcmdldFZlcnNpb24uaCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xmb3JjZV9pbmMuaCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uY3BwIGIvbGliL2NwcC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIyMzhmYi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8VEFwcGxpY2F0aW9uRXhjZXB0aW9uLmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVFByb3RvY29sLmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsKLQotdWludDMyX3QgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpyZWFkKGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCkgewotICB1aW50MzJfdCB4ZmVyID0gMDsKLSAgc3RkOjpzdHJpbmcgZm5hbWU7Ci0gIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZnR5cGU7Ci0gIGludDE2X3QgZmlkOwotCi0gIHhmZXIgKz0gaXByb3QtPnJlYWRTdHJ1Y3RCZWdpbihmbmFtZSk7Ci0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICB4ZmVyICs9IGlwcm90LT5yZWFkRmllbGRCZWdpbihmbmFtZSwgZnR5cGUsIGZpZCk7Ci0gICAgaWYgKGZ0eXBlID09IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVE9QKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgc3dpdGNoIChmaWQpIHsKLSAgICBjYXNlIDE6Ci0gICAgICBpZiAoZnR5cGUgPT0gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUklORykgewotICAgICAgICB4ZmVyICs9IGlwcm90LT5yZWFkU3RyaW5nKG1lc3NhZ2VfKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHhmZXIgKz0gaXByb3QtPnNraXAoZnR5cGUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaWYgKGZ0eXBlID09IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMzIpIHsKLSAgICAgICAgaW50MzJfdCB0eXBlOwotICAgICAgICB4ZmVyICs9IGlwcm90LT5yZWFkSTMyKHR5cGUpOwotICAgICAgICB0eXBlXyA9IChUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlKXR5cGU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB4ZmVyICs9IGlwcm90LT5za2lwKGZ0eXBlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB4ZmVyICs9IGlwcm90LT5za2lwKGZ0eXBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICB4ZmVyICs9IGlwcm90LT5yZWFkRmllbGRFbmQoKTsKLSAgfQotCi0gIHhmZXIgKz0gaXByb3QtPnJlYWRTdHJ1Y3RFbmQoKTsKLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLXVpbnQzMl90IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6d3JpdGUoYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdCB7Ci0gIHVpbnQzMl90IHhmZXIgPSAwOwotICB4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEJlZ2luKCJUQXBwbGljYXRpb25FeGNlcHRpb24iKTsKLSAgeGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEJlZ2luKCJtZXNzYWdlIiwgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUklORywgMSk7Ci0gIHhmZXIgKz0gb3Byb3QtPndyaXRlU3RyaW5nKG1lc3NhZ2VfKTsKLSAgeGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEVuZCgpOwotICB4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkQmVnaW4oInR5cGUiLCBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTMyLCAyKTsKLSAgeGZlciArPSBvcHJvdC0+d3JpdGVJMzIodHlwZV8pOwotICB4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkRW5kKCk7Ci0gIHhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRTdG9wKCk7Ci0gIHhmZXIgKz0gb3Byb3QtPndyaXRlU3RydWN0RW5kKCk7Ci0gIHJldHVybiB4ZmVyOwotfQotCi19fSAvLyBhcGFjaGU6OnRocmlmdApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmggYi9saWIvY3BwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlNjg2NC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UQVBQTElDQVRJT05FWENFUFRJT05fSF8KLSNkZWZpbmUgX1RIUklGVF9UQVBQTElDQVRJT05FWENFUFRJT05fSF8gMQotCi0jaW5jbHVkZSA8VGhyaWZ0Lmg+Ci0KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgewotCi1uYW1lc3BhY2UgcHJvdG9jb2wgewotICBjbGFzcyBUUHJvdG9jb2w7Ci19Ci0KLWNsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA6IHB1YmxpYyBURXhjZXB0aW9uIHsKLSBwdWJsaWM6Ci0KLSAgLyoqCi0gICAqIEVycm9yIGNvZGVzIGZvciB0aGUgdmFyaW91cyB0eXBlcyBvZiBleGNlcHRpb25zLgotICAgKi8KLSAgZW51bSBUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIHsKLSAgICBVTktOT1dOID0gMCwKLSAgICBVTktOT1dOX01FVEhPRCA9IDEsCi0gICAgSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyLAotICAgIFdST05HX01FVEhPRF9OQU1FID0gMywKLSAgICBCQURfU0VRVUVOQ0VfSUQgPSA0LAotICAgIE1JU1NJTkdfUkVTVUxUID0gNSwKLSAgICBJTlRFUk5BTF9FUlJPUiA9IDYsCi0gICAgUFJPVE9DT0xfRVJST1IgPSA3Ci0gIH07Ci0KLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkgOgotICAgIFRFeGNlcHRpb24oKSwKLSAgICB0eXBlXyhVTktOT1dOKSB7fQotCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIHR5cGUpIDoKLSAgICBURXhjZXB0aW9uKCksCi0gICAgdHlwZV8odHlwZSkge30KLQotICBUQXBwbGljYXRpb25FeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDoKLSAgICBURXhjZXB0aW9uKG1lc3NhZ2UpLAotICAgIHR5cGVfKFVOS05PV04pIHt9Ci0KLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6Ci0gICAgVEV4Y2VwdGlvbihtZXNzYWdlKSwKLSAgICB0eXBlXyh0eXBlKSB7fQotCi0gIHZpcnR1YWwgflRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIHRocm93KCkge30KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBlcnJvciBjb2RlIHRoYXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgZXJyb3IKLSAgICogdGhhdCBoYXMgb2NjdXJyZWQuCi0gICAqCi0gICAqIEByZXR1cm4gRXJyb3IgY29kZQotICAgKi8KLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSBnZXRUeXBlKCkgewotICAgIHJldHVybiB0eXBlXzsKLSAgfQotCi0gIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCkgewotICAgIGlmIChtZXNzYWdlXy5lbXB0eSgpKSB7Ci0gICAgICBzd2l0Y2ggKHR5cGVfKSB7Ci0gICAgICAgIGNhc2UgVU5LTk9XTiAgICAgICAgICAgICAgOiByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogVW5rbm93biBhcHBsaWNhdGlvbiBleGNlcHRpb24iOwotICAgICAgICBjYXNlIFVOS05PV05fTUVUSE9EICAgICAgIDogcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IFVua25vd24gbWV0aG9kIjsKLSAgICAgICAgY2FzZSBJTlZBTElEX01FU1NBR0VfVFlQRSA6IHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBJbnZhbGlkIG1lc3NhZ2UgdHlwZSI7Ci0gICAgICAgIGNhc2UgV1JPTkdfTUVUSE9EX05BTUUgICAgOiByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogV3JvbmcgbWV0aG9kIG5hbWUiOwotICAgICAgICBjYXNlIEJBRF9TRVFVRU5DRV9JRCAgICAgIDogcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IEJhZCBzZXF1ZW5jZSBpZGVudGlmaWVyIjsKLSAgICAgICAgY2FzZSBNSVNTSU5HX1JFU1VMVCAgICAgICA6IHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBNaXNzaW5nIHJlc3VsdCI7Ci0gICAgICAgIGRlZmF1bHQgICAgICAgICAgICAgICAgICAgOiByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogKEludmFsaWQgZXhjZXB0aW9uIHR5cGUpIjsKLSAgICAgIH07Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBtZXNzYWdlXy5jX3N0cigpOwotICAgIH0KLSAgfQotCi0gIHVpbnQzMl90IHJlYWQocHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QpOwotICB1aW50MzJfdCB3cml0ZShwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCkgY29uc3Q7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8qKgotICAgKiBFcnJvciBjb2RlCi0gICAqLwotICBUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIHR5cGVfOwotCi19OwotCi19fSAvLyBhcGFjaGU6OnRocmlmdAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RBUFBMSUNBVElPTkVYQ0VQVElPTl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvVExvZ2dpbmcuaCBiL2xpYi9jcHAvc3JjL1RMb2dnaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNGU4ZmMuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvVExvZ2dpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UTE9HR0lOR19IXwotI2RlZmluZSBfVEhSSUZUX1RMT0dHSU5HX0hfIDEKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0vKioKLSAqIENvbnRhaW5zIHV0aWxpdHkgbWFjcm9zIGZvciBkZWJ1Z2dpbmcgYW5kIGxvZ2dpbmcuCi0gKgotICovCi0KLSNpZm5kZWYgSEFWRV9DTE9DS19HRVRUSU1FCi0jaW5jbHVkZSA8dGltZS5oPgotI2Vsc2UKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NURElOVF9ICi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jZW5kaWYKLQotLyoqCi0gKiBUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgPSAwOiBhbGwgZGVidWdnaW5nIHR1cm5lZCBvZmYsIGRlYnVnIG1hY3JvcyB1bmRlZmluZWQKLSAqIFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA9IDE6IGFsbCBkZWJ1Z2dpbmcgdHVybmVkIG9uCi0gKi8KLSNkZWZpbmUgVF9HTE9CQUxfREVCVUdHSU5HX0xFVkVMIDAKLQotCi0vKioKLSAqIFRfR0xPQkFMX0xPR0dJTkdfTEVWRUwgPSAwOiBhbGwgbG9nZ2luZyB0dXJuZWQgb2ZmLCBsb2dnaW5nIG1hY3JvcyB1bmRlZmluZWQKLSAqIFRfR0xPQkFMX0xPR0dJTkdfTEVWRUwgPSAxOiBhbGwgbG9nZ2luZyB0dXJuZWQgb24KLSAqLwotI2RlZmluZSBUX0dMT0JBTF9MT0dHSU5HX0xFVkVMICAgMQotCi0KLS8qKgotICogU3RhbmRhcmQgd3JhcHBlciBhcm91bmQgZnByaW50ZiB3aGF0IHdpbGwgcHJlZml4IHRoZSBmaWxlIG5hbWUgYW5kIGxpbmUKLSAqIG51bWJlciB0byB0aGUgbGluZS4gVXNlcyBUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgdG8gY29udHJvbCB3aGV0aGVyIGl0IGlzCi0gKiB0dXJuZWQgb24gb3Igb2ZmLgotICoKLSAqIEBwYXJhbSBmb3JtYXRfc3RyaW5nCi0gKi8KLSNpZiBUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgPiAwCi0gICNkZWZpbmUgVF9ERUJVRyhmb3JtYXRfc3RyaW5nLC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGZwcmludGYoc3RkZXJyLCJbJXMsJWRdICIgZm9ybWF0X3N0cmluZyAiIFxuIiwgX19GSUxFX18sIF9fTElORV9fLCMjX19WQV9BUkdTX18pOyBcCi0gIH0KLSNlbHNlCi0gICNkZWZpbmUgVF9ERUJVRyhmb3JtYXRfc3RyaW5nLC4uLikKLSNlbmRpZgotCi0KLS8qKgotICogYW5hbGFnb3VzIHRvIFRfREVCVUcgYnV0IGFsc28gcHJpbnRzIHRoZSB0aW1lCi0gKgotICogQHBhcmFtIHN0cmluZyAgZm9ybWF0X3N0cmluZyBpbnB1dDogcHJpbnRmIHN0eWxlIGZvcm1hdCBzdHJpbmcKLSAqLwotI2lmIFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA+IDAKLSAgI2RlZmluZSBUX0RFQlVHX1QoZm9ybWF0X3N0cmluZywuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoVF9HTE9CQUxfREVCVUdHSU5HX0xFVkVMID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdGltZV90IG5vdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjaGFyIGRiZ3RpbWVbMjZdIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHRpbWUoJm5vdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgY3RpbWVfcigmbm93LCBkYmd0aW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBkYmd0aW1lWzI0XSA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCJbJXMsJWRdIFslc10gIiBmb3JtYXRfc3RyaW5nICIgXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sZGJndGltZSwjI19fVkFfQVJHU19fKTsgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotI2Vsc2UKLSAgI2RlZmluZSBUX0RFQlVHX1QoZm9ybWF0X3N0cmluZywuLi4pCi0jZW5kaWYKLQotCi0vKioKLSAqIGFuYWxhZ291cyB0byBUX0RFQlVHIGJ1dCB1c2VzIGlucHV0IGxldmVsIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nCi0gKiBzaG91bGQgYmUgbG9nZ2VkLgotICoKLSAqIEBwYXJhbSBpbnQgICAgIGxldmVsOiBzcGVjaWZpZWQgZGVidWcgbGV2ZWwKLSAqIEBwYXJhbSBzdHJpbmcgIGZvcm1hdF9zdHJpbmcgaW5wdXQ6IGZvcm1hdCBzdHJpbmcKLSAqLwotI2RlZmluZSBUX0RFQlVHX0wobGV2ZWwsIGZvcm1hdF9zdHJpbmcsLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmICgobGV2ZWwpID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmcHJpbnRmKHN0ZGVyciwiWyVzLCVkXSAiIGZvcm1hdF9zdHJpbmcgIiBcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywjI19fVkFfQVJHU19fKTsgXAotICB9Ci0KLQotLyoqCi0gKiBFeHBsaWNpdCBlcnJvciBsb2dnaW5nLiBQcmludHMgdGltZSwgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlcgotICoKLSAqIEBwYXJhbSBzdHJpbmcgIGZvcm1hdF9zdHJpbmcgaW5wdXQ6IHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nCi0gKi8KLSNkZWZpbmUgVF9FUlJPUihmb3JtYXRfc3RyaW5nLC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0aW1lX3Qgbm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjaGFyIGRiZ3RpbWVbMjZdIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0aW1lKCZub3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjdGltZV9yKCZub3csIGRiZ3RpbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkYmd0aW1lWzI0XSA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmcHJpbnRmKHN0ZGVyciwiWyVzLCVkXSBbJXNdIEVSUk9SOiAiIGZvcm1hdF9zdHJpbmcgIiBcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyxkYmd0aW1lLCMjX19WQV9BUkdTX18pOyBcCi0gIH0KLQotCi0vKioKLSAqIEFuYWxhZ291cyB0byBUX0VSUk9SLCBhZGRpdGlvbmFsbHkgYWJvcnRpbmcgdGhlIHByb2Nlc3MuCi0gKiBXQVJOSU5HOiBtYWNybyBjYWxscyBhYm9ydCgpLCBlbmRpbmcgcHJvZ3JhbSBleGVjdXRpb24KLSAqCi0gKiBAcGFyYW0gc3RyaW5nICBmb3JtYXRfc3RyaW5nIGlucHV0OiBwcmludGYgc3R5bGUgZm9ybWF0IHN0cmluZwotICovCi0jZGVmaW5lIFRfRVJST1JfQUJPUlQoZm9ybWF0X3N0cmluZywuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdGltZV90IG5vdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2hhciBkYmd0aW1lWzI2XSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdGltZSgmbm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY3RpbWVfcigmbm93LCBkYmd0aW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZGJndGltZVsyNF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZnByaW50ZihzdGRlcnIsIlslcywlZF0gWyVzXSBFUlJPUjogR29pbmcgdG8gYWJvcnQgIiBmb3JtYXRfc3RyaW5nICIgXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sZGJndGltZSwjI19fVkFfQVJHU19fKTsgXAotICAgIGV4aXQoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLQotLyoqCi0gKiBMb2cgaW5wdXQgbWVzc2FnZQotICoKLSAqIEBwYXJhbSBzdHJpbmcgIGZvcm1hdF9zdHJpbmcgaW5wdXQ6IHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nCi0gKi8KLSNpZiBUX0dMT0JBTF9MT0dHSU5HX0xFVkVMID4gMAotICAjZGVmaW5lIFRfTE9HX09QRVIoZm9ybWF0X3N0cmluZywuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKFRfR0xPQkFMX0xPR0dJTkdfTEVWRUwgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0aW1lX3Qgbm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjaGFyIGRiZ3RpbWVbMjZdIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0aW1lKCZub3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjdGltZV9yKCZub3csIGRiZ3RpbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBkYmd0aW1lWzI0XSA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiWyVzXSAiIGZvcm1hdF9zdHJpbmcgIiBcbiIsIGRiZ3RpbWUsIyNfX1ZBX0FSR1NfXyk7ICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotI2Vsc2UKLSAgI2RlZmluZSBUX0xPR19PUEVSKGZvcm1hdF9zdHJpbmcsLi4uKQotI2VuZGlmCi0KLQotLyoqCi0gKiBUX0dMT0JBTF9ERUJVR19WSVJUVUFMID0gMCBvciB1bnNldDogbm9ybWFsIG9wZXJhdGlvbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGNhbGwgZGVidWcgbWVzc2FnZXMgZGlzYWJsZWQKLSAqIFRfR0xPQkFMX0RFQlVHX1ZJUlRVQUwgPSAxOiAgICAgICAgICBsb2cgYSBkZWJ1ZyBtZXNzYWdlcyB3aGVuZXZlciBhbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2b2lkYWJsZSB2aXJ0dWFsIGNhbGwgaXMgbWFkZQotICogVF9HTE9CQUxfREVCVUdfVklSVFVBTCA9IDI6ICAgICAgICAgIHJlY29yZCBkZXRhaWxlZCBpbmZvIHRoYXQgY2FuIGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRlZCBieSBjYWxsaW5nCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb2ZpbGVfcHJpbnRfaW5mbygpCi0gKi8KLSNpZiBUX0dMT0JBTF9ERUJVR19WSVJUVUFMID4gMQotICAjZGVmaW5lIFRfVklSVFVBTF9DQUxMKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgOjphcGFjaGU6OnRocmlmdDo6cHJvZmlsZV92aXJ0dWFsX2NhbGwodHlwZWlkKCp0aGlzKSkKLSAgI2RlZmluZSBUX0dFTkVSSUNfUFJPVE9DT0wodGVtcGxhdGVfY2xhc3MsIGdlbmVyaWNfcHJvdCwgc3BlY2lmaWNfcHJvdCkgXAotICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoIShzcGVjaWZpY19wcm90KSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgOjphcGFjaGU6OnRocmlmdDo6cHJvZmlsZV9nZW5lcmljX3Byb3RvY29sKCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHR5cGVpZCgqdGVtcGxhdGVfY2xhc3MpLCB0eXBlaWQoKmdlbmVyaWNfcHJvdCkpOyAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSB3aGlsZSAoMCkKLSNlbGlmIFRfR0xPQkFMX0RFQlVHX1ZJUlRVQUwgPT0gMQotICAjZGVmaW5lIFRfVklSVFVBTF9DQUxMKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZnByaW50ZihzdGRlcnIsIlslcywlZF0gdmlydHVhbCBjYWxsXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pCi0gICNkZWZpbmUgVF9HRU5FUklDX1BST1RPQ09MKHRlbXBsYXRlX2NsYXNzLCBnZW5lcmljX3Byb3QsIHNwZWNpZmljX3Byb3QpIFwKLSAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKCEoc3BlY2lmaWNfcHJvdCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAiWyVzLCVkXSBmYWlsZWQgdG8gY2FzdCB0byBzcGVjaWZpYyBwcm90b2NvbCB0eXBlXG4iLCAgICAgXAotICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9IHdoaWxlICgwKQotI2Vsc2UKLSAgI2RlZmluZSBUX1ZJUlRVQUxfQ0FMTCgpCi0gICNkZWZpbmUgVF9HRU5FUklDX1BST1RPQ09MKHRlbXBsYXRlX2NsYXNzLCBnZW5lcmljX3Byb3QsIHNwZWNpZmljX3Byb3QpCi0jZW5kaWYKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UTE9HR0lOR19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvVFByb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvVFByb2Nlc3Nvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjRmM2I4Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL1RQcm9jZXNzb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUFJPQ0VTU09SX0hfCi0jZGVmaW5lIF9USFJJRlRfVFBST0NFU1NPUl9IXyAxCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVFByb3RvY29sLmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsKLQotLyoqCi0gKiBWaXJ0dWFsIGludGVyZmFjZSBjbGFzcyB0aGF0IGNhbiBoYW5kbGUgZXZlbnRzIGZyb20gdGhlIHByb2Nlc3Nvci4gVG8KLSAqIHVzZSB0aGlzIHlvdSBzaG91bGQgc3ViY2xhc3MgaXQgYW5kIGltcGxlbWVudCB0aGUgbWV0aG9kcyB0aGF0IHlvdSBjYXJlCi0gKiBhYm91dC4gWW91ciBzdWJjbGFzcyBjYW4gYWxzbyBzdG9yZSBsb2NhbCBkYXRhIHRoYXQgeW91IG1heSBjYXJlIGFib3V0LAotICogc3VjaCBhcyBhZGRpdGlvbmFsICJhcmd1bWVudHMiIHRvIHRoZXNlIG1ldGhvZHMgKHN0b3JlZCBpbiB0aGUgb2JqZWN0Ci0gKiBpbnN0YW5jZSdzIHN0YXRlKS4KLSAqLwotY2xhc3MgVFByb2Nlc3NvckV2ZW50SGFuZGxlciB7Ci0gcHVibGljOgotCi0gIHZpcnR1YWwgflRQcm9jZXNzb3JFdmVudEhhbmRsZXIoKSB7fQotCi0gIC8qKgotICAgKiBDYWxsZWQgYmVmb3JlIGNhbGxpbmcgb3RoZXIgY2FsbGJhY2sgbWV0aG9kcy4KLSAgICogRXhwZWN0ZWQgdG8gcmV0dXJuIHNvbWUgc29ydCBvZiBjb250ZXh0IG9iamVjdC4KLSAgICogVGhlIHJldHVybiB2YWx1ZSBpcyBwYXNzZWQgdG8gYWxsIG90aGVyIGNhbGxiYWNrcwotICAgKiBmb3IgdGhhdCBmdW5jdGlvbiBpbnZvY2F0aW9uLgotICAgKi8KLSAgdmlydHVhbCB2b2lkKiBnZXRDb250ZXh0KGNvbnN0IGNoYXIqIGZuX25hbWUsIHZvaWQqIHNlcnZlckNvbnRleHQpIHsKLSAgICAodm9pZCkgZm5fbmFtZTsKLSAgICAodm9pZCkgc2VydmVyQ29udGV4dDsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIC8qKgotICAgKiBFeHBlY3RlZCB0byBmcmVlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBjb250ZXh0LgotICAgKi8KLSAgdmlydHVhbCB2b2lkIGZyZWVDb250ZXh0KHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgewotICAgICh2b2lkKSBjdHg7Ci0gICAgKHZvaWQpIGZuX25hbWU7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsbGVkIGJlZm9yZSByZWFkaW5nIGFyZ3VtZW50cy4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBwcmVSZWFkKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgewotICAgICh2b2lkKSBjdHg7Ci0gICAgKHZvaWQpIGZuX25hbWU7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsbGVkIGJldHdlZW4gcmVhZGluZyBhcmd1bWVudHMgYW5kIGNhbGxpbmcgdGhlIGhhbmRsZXIuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgcG9zdFJlYWQodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lLCB1aW50MzJfdCBieXRlcykgewotICAgICh2b2lkKSBjdHg7Ci0gICAgKHZvaWQpIGZuX25hbWU7Ci0gICAgKHZvaWQpIGJ5dGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIENhbGxlZCBiZXR3ZWVuIGNhbGxpbmcgdGhlIGhhbmRsZXIgYW5kIHdyaXRpbmcgdGhlIHJlc3BvbnNlLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIHByZVdyaXRlKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgewotICAgICh2b2lkKSBjdHg7Ci0gICAgKHZvaWQpIGZuX25hbWU7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsbGVkIGFmdGVyIHdyaXRpbmcgdGhlIHJlc3BvbnNlLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIHBvc3RXcml0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUsIHVpbnQzMl90IGJ5dGVzKSB7Ci0gICAgKHZvaWQpIGN0eDsKLSAgICAodm9pZCkgZm5fbmFtZTsKLSAgICAodm9pZCkgYnl0ZXM7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsbGVkIHdoZW4gYW4gYXN5bmMgZnVuY3Rpb24gY2FsbCBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LgotICAgKi8KLSAgdmlydHVhbCB2b2lkIGFzeW5jQ29tcGxldGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7Ci0gICAgKHZvaWQpIGN0eDsKLSAgICAodm9pZCkgZm5fbmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBDYWxsZWQgaWYgdGhlIGhhbmRsZXIgdGhyb3dzIGFuIHVuZGVjbGFyZWQgZXhjZXB0aW9uLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIGhhbmRsZXJFcnJvcih2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKLSAgICAodm9pZCkgY3R4OwotICAgICh2b2lkKSBmbl9uYW1lOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIFRQcm9jZXNzb3JFdmVudEhhbmRsZXIoKSB7fQotfTsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyB1c2VkIGJ5IHRoZSBnZW5lcmF0ZWQgY29kZSB0byBmcmVlIGVhY2ggY29udGV4dC4KLSAqLwotY2xhc3MgVFByb2Nlc3NvckNvbnRleHRGcmVlciB7Ci0gcHVibGljOgotICBUUHJvY2Vzc29yQ29udGV4dEZyZWVyKFRQcm9jZXNzb3JFdmVudEhhbmRsZXIqIGhhbmRsZXIsIHZvaWQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIG1ldGhvZCkgOgotICAgIGhhbmRsZXJfKGhhbmRsZXIpLCBjb250ZXh0Xyhjb250ZXh0KSwgbWV0aG9kXyhtZXRob2QpIHt9Ci0gIH5UUHJvY2Vzc29yQ29udGV4dEZyZWVyKCkgeyBpZiAoaGFuZGxlcl8gIT0gTlVMTCkgaGFuZGxlcl8tPmZyZWVDb250ZXh0KGNvbnRleHRfLCBtZXRob2RfKTsgfQotICB2b2lkIHVucmVnaXN0ZXIoKSB7IGhhbmRsZXJfID0gTlVMTDsgfQotIHByaXZhdGU6Ci0gIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRXZlbnRIYW5kbGVyKiBoYW5kbGVyXzsKLSAgdm9pZCogY29udGV4dF87Ci0gIGNvbnN0IGNoYXIqIG1ldGhvZF87Ci19OwotCi0vKioKLSAqIEEgcHJvY2Vzc29yIGlzIGEgZ2VuZXJpYyBvYmplY3QgdGhhdCBhY3RzIHVwb24gdHdvIHN0cmVhbXMgb2YgZGF0YSwgb25lCi0gKiBhbiBpbnB1dCBhbmQgdGhlIG90aGVyIGFuIG91dHB1dC4gVGhlIGRlZmluaXRpb24gb2YgdGhpcyBvYmplY3QgaXMgbG9vc2UsCi0gKiB0aG91Z2ggdGhlIHR5cGljYWwgY2FzZSBpcyBmb3Igc29tZSBzb3J0IG9mIHNlcnZlciB0aGF0IGVpdGhlciBnZW5lcmF0ZXMKLSAqIHJlc3BvbnNlcyB0byBhbiBpbnB1dCBzdHJlYW0gb3IgZm9yd2FyZHMgZGF0YSBmcm9tIG9uZSBwaXBlIG9udG8gYW5vdGhlci4KLSAqCi0gKi8KLWNsYXNzIFRQcm9jZXNzb3IgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+VFByb2Nlc3NvcigpIHt9Ci0KLSAgdmlydHVhbCBib29sIHByb2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpID0gMDsKLQotICBib29sIHByb2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGlvLAotICAgICAgICAgICAgICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpIHsKLSAgICByZXR1cm4gcHJvY2VzcyhpbywgaW8sIGNvbm5lY3Rpb25Db250ZXh0KTsKLSAgfQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGdldEV2ZW50SGFuZGxlcigpIHsKLSAgICByZXR1cm4gZXZlbnRIYW5kbGVyXzsKLSAgfQotCi0gIHZvaWQgc2V0RXZlbnRIYW5kbGVyKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcikgewotICAgIGV2ZW50SGFuZGxlcl8gPSBldmVudEhhbmRsZXI7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgVFByb2Nlc3NvcigpIHt9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyXzsKLX07Ci0KLX19IC8vIGFwYWNoZTo6dGhyaWZ0Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFBST0NFU1NPUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvVFJlZmxlY3Rpb25Mb2NhbC5oIGIvbGliL2NwcC9zcmMvVFJlZmxlY3Rpb25Mb2NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODNlNDc1Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL1RSZWZsZWN0aW9uTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RSRUZMRUNUSU9OTE9DQUxfSF8KLSNkZWZpbmUgX1RIUklGVF9UUkVGTEVDVElPTkxPQ0FMX0hfIDEKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVFByb3RvY29sLmg+Ci0KLS8qKgotICogTG9jYWwgUmVmbGVjdGlvbiBpcyBhIGJsYW5rZXQgdGVybSByZWZlcnJpbmcgdG8gdGhlIHRoZSBzdHJ1Y3R1cmUKLSAqIGFuZCBnZW5lcmF0aW9uIG9mIHRoaXMgcGFydGljdWxhciByZXByZXNlbnRhdGlvbiBvZiBUaHJpZnQgdHlwZXMuCi0gKiAoSXQgaXMgY2FsbGVkIGxvY2FsIGJlY2F1c2UgaXQgY2Fubm90IGJlIHNlcmlhbGl6ZWQgYnkgVGhyaWZ0KS4KLSAqCi0gKi8KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcmVmbGVjdGlvbiB7IG5hbWVzcGFjZSBsb2NhbCB7Ci0KLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGU7Ci0KLS8vIFdlIGluY2x1ZGUgdGhpcyBtYW55IGJ5dGVzIG9mIHRoZSBzdHJ1Y3R1cmUncyBmaW5nZXJwcmludCB3aGVuIHNlcmlhbGl6aW5nCi0vLyBhIHRvcC1sZXZlbCBzdHJ1Y3R1cmUuICBMb25nIGVub3VnaCB0byBtYWtlIGNvbGxpc2lvbnMgdW5saWtlbHksIHNob3J0Ci0vLyBlbm91Z2ggdG8gbm90IHNpZ25pZmljYW50bHkgYWZmZWN0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHVzZWQuCi1jb25zdCBpbnQgRlBfUFJFRklYX0xFTiA9IDQ7Ci0KLXN0cnVjdCBGaWVsZE1ldGEgewotICBpbnQxNl90IHRhZzsKLSAgYm9vbCBpc19vcHRpb25hbDsKLX07Ci0KLXN0cnVjdCBUeXBlU3BlYyB7Ci0gIFRUeXBlIHR0eXBlOwotICB1aW50OF90ICAgIGZwX3ByZWZpeFtGUF9QUkVGSVhfTEVOXTsKLQotICAvLyBVc2UgYW4gYW5vbnltb3VzIHVuaW9uIGhlcmUgc28gd2UgY2FuIGZpdCB0d28gVHlwZVNwZWNzIGluIG9uZSBjYWNoZSBsaW5lLgotICB1bmlvbiB7Ci0gICAgc3RydWN0IHsKLSAgICAgIC8vIFVzZSBwYXJhbGxlbCBhcnJheXMgaGVyZSBmb3IgZGVuc2VyIHBhY2tpbmcgKG9mIHRoZSBhcnJheXMpLgotICAgICAgRmllbGRNZXRhKiBtZXRhczsKLSAgICAgIFR5cGVTcGVjKiogc3BlY3M7Ci0gICAgfSB0c3RydWN0OwotICAgIHN0cnVjdCB7Ci0gICAgICBUeXBlU3BlYyAqc3VidHlwZTE7Ci0gICAgICBUeXBlU3BlYyAqc3VidHlwZTI7Ci0gICAgfSB0Y29udGFpbmVyOwotICB9OwotCi0gIC8vIFN0YXRpYyBpbml0aWFsaXphdGlvbiBvZiB1bmlvbnMgaXNuJ3QgcmVhbGx5IHBvc3NpYmxlLAotICAvLyBzbyB0YWtlIHRoZSBwbHVuZ2UgYW5kIHVzZSBjb25zdHJ1Y3RvcnMuCi0gIC8vIEhvcGVmdWxseSB0aGV5J2xsIGJlIGV2YWx1YXRlZCBhdCBjb21waWxlIHRpbWUuCi0KLSAgVHlwZVNwZWMoVFR5cGUgdHR5cGUpIDogdHR5cGUodHR5cGUpIHsKLSAgICBzdGQ6Om1lbXNldChmcF9wcmVmaXgsIDAsIEZQX1BSRUZJWF9MRU4pOwotICB9Ci0KLSAgVHlwZVNwZWMoVFR5cGUgdHR5cGUsCi0gICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGZpbmdlcnByaW50LAotICAgICAgICAgICBGaWVsZE1ldGEqIG1ldGFzLAotICAgICAgICAgICBUeXBlU3BlYyoqIHNwZWNzKSA6Ci0gICAgdHR5cGUodHR5cGUpCi0gIHsKLSAgICBzdGQ6Om1lbWNweShmcF9wcmVmaXgsIGZpbmdlcnByaW50LCBGUF9QUkVGSVhfTEVOKTsKLSAgICB0c3RydWN0Lm1ldGFzID0gbWV0YXM7Ci0gICAgdHN0cnVjdC5zcGVjcyA9IHNwZWNzOwotICB9Ci0KLSAgVHlwZVNwZWMoVFR5cGUgdHR5cGUsIFR5cGVTcGVjKiBzdWJ0eXBlMSwgVHlwZVNwZWMqIHN1YnR5cGUyKSA6Ci0gICAgdHR5cGUodHR5cGUpCi0gIHsKLSAgICBzdGQ6Om1lbXNldChmcF9wcmVmaXgsIDAsIEZQX1BSRUZJWF9MRU4pOwotICAgIHRjb250YWluZXIuc3VidHlwZTEgPSBzdWJ0eXBlMTsKLSAgICB0Y29udGFpbmVyLnN1YnR5cGUyID0gc3VidHlwZTI7Ci0gIH0KLQotfTsKLQotfX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cmVmbGVjdGlvbjo6bG9jYWwKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkVGTEVDVElPTkxPQ0FMX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9UaHJpZnQuY3BwIGIvbGliL2NwcC9zcmMvVGhyaWZ0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0OTQ3Zi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9UaHJpZnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8VGhyaWZ0Lmg+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgewotCi1UT3V0cHV0IEdsb2JhbE91dHB1dDsKLQotdm9pZCBUT3V0cHV0OjpwcmludGYoY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKSB7Ci0gIC8vIFRyeSB0byByZWR1Y2UgaGVhcCB1c2FnZSwgZXZlbiBpZiBwcmludGYgaXMgY2FsbGVkIHJhcmVseS4KLSAgc3RhdGljIGNvbnN0IGludCBTVEFDS19CVUZfU0laRSA9IDI1NjsKLSAgY2hhciBzdGFja19idWZbU1RBQ0tfQlVGX1NJWkVdOwotICB2YV9saXN0IGFwOwotCi0gIHZhX3N0YXJ0KGFwLCBtZXNzYWdlKTsKLSAgaW50IG5lZWQgPSB2c25wcmludGYoc3RhY2tfYnVmLCBTVEFDS19CVUZfU0laRSwgbWVzc2FnZSwgYXApOwotICB2YV9lbmQoYXApOwotCi0gIGlmIChuZWVkIDwgU1RBQ0tfQlVGX1NJWkUpIHsKLSAgICBmXyhzdGFja19idWYpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGNoYXIgKmhlYXBfYnVmID0gKGNoYXIqKW1hbGxvYygobmVlZCsxKSAqIHNpemVvZihjaGFyKSk7Ci0gIGlmIChoZWFwX2J1ZiA9PSBOVUxMKSB7Ci0gICAgLy8gTWFsbG9jIGZhaWxlZC4gIFdlIG1pZ2h0IGFzIHdlbGwgcHJpbnQgdGhlIHN0YWNrIGJ1ZmZlci4KLSAgICBmXyhzdGFja19idWYpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHZhX3N0YXJ0KGFwLCBtZXNzYWdlKTsKLSAgaW50IHJ2YWwgPSB2c25wcmludGYoaGVhcF9idWYsIG5lZWQrMSwgbWVzc2FnZSwgYXApOwotICB2YV9lbmQoYXApOwotICAvLyBUT0RPKHNoaWdpbik6IGluZm9ybSB1c2VyCi0gIGlmIChydmFsICE9IC0xKSB7Ci0gICAgZl8oaGVhcF9idWYpOwotICB9Ci0gIGZyZWUoaGVhcF9idWYpOwotfQotCi12b2lkIFRPdXRwdXQ6OnBlcnJvcihjb25zdCBjaGFyICptZXNzYWdlLCBpbnQgZXJybm9fY29weSkgewotICBzdGQ6OnN0cmluZyBvdXQgPSBtZXNzYWdlICsgc3RyZXJyb3JfcyhlcnJub19jb3B5KTsKLSAgZl8ob3V0LmNfc3RyKCkpOwotfQotCi1zdGQ6OnN0cmluZyBUT3V0cHV0OjpzdHJlcnJvcl9zKGludCBlcnJub19jb3B5KSB7Ci0jaWZuZGVmIEhBVkVfU1RSRVJST1JfUgotICByZXR1cm4gImVycm5vID0gIiArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KGVycm5vX2NvcHkpOwotI2Vsc2UgIC8vIEhBVkVfU1RSRVJST1JfUgotCi0gIGNoYXIgYl9lcnJidWZbMTAyNF0gPSB7ICdcMCcgfTsKLSNpZmRlZiBTVFJFUlJPUl9SX0NIQVJfUAotICBjaGFyICpiX2Vycm9yID0gc3RyZXJyb3JfcihlcnJub19jb3B5LCBiX2VycmJ1Ziwgc2l6ZW9mKGJfZXJyYnVmKSk7Ci0jZWxzZQotICBjaGFyICpiX2Vycm9yID0gYl9lcnJidWY7Ci0gIGludCBydiA9IHN0cmVycm9yX3IoZXJybm9fY29weSwgYl9lcnJidWYsIHNpemVvZihiX2VycmJ1ZikpOwotICBpZiAocnYgPT0gLTEpIHsKLSAgICAvLyBzdHJlcnJvcl9yIGZhaWxlZC4gIG9tZ3d0ZmJicS4KLSAgICByZXR1cm4gIlhTSS1jb21wbGlhbnQgc3RyZXJyb3JfcigpIGZhaWxlZCB3aXRoIGVycm5vID0gIiArCi0gICAgICBib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPihlcnJub19jb3B5KTsKLSAgfQotI2VuZGlmCi0gIC8vIENhbiBhbnlvbmUgcHJvdmUgdGhhdCBleHBsaWNpdCBjYXN0IGlzIHByb2JhYmx5IG5vdCBuZWNlc3NhcnkKLSAgLy8gdG8gZW5zdXJlIHRoYXQgdGhlIHN0cmluZyBvYmplY3QgaXMgY29uc3RydWN0ZWQgYmVmb3JlCi0gIC8vIGJfZXJyb3IgYmVjb21lcyBpbnZhbGlkPwotICByZXR1cm4gc3RkOjpzdHJpbmcoYl9lcnJvcik7Ci0KLSNlbmRpZiAgLy8gSEFWRV9TVFJFUlJPUl9SCi19Ci0KLX19IC8vIGFwYWNoZTo6dGhyaWZ0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9UaHJpZnQuaCBiL2xpYi9jcHAvc3JjL1RocmlmdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmIzMWE4Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL1RocmlmdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RIUklGVF9IXwotI2RlZmluZSBfVEhSSUZUX1RIUklGVF9IXyAxCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxleGNlcHRpb24+Ci0jaW5jbHVkZSA8dHlwZWluZm8+Ci0KLSNpbmNsdWRlICJUTG9nZ2luZy5oIgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7Ci0KLWNsYXNzIFRFbnVtSXRlcmF0b3IgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBzdGQ6OnBhaXI8aW50LCBjb25zdCBjaGFyKj4gPiB7Ci0gcHVibGljOgotICBURW51bUl0ZXJhdG9yKGludCBuLAotICAgICAgICAgICAgICAgIGludCogZW51bXMsCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhcioqIG5hbWVzKSA6Ci0gICAgICBpaV8oMCksIG5fKG4pLCBlbnVtc18oZW51bXMpLCBuYW1lc18obmFtZXMpIHsKLSAgfQotCi0gIGludCBvcGVyYXRvciArKygpIHsKLSAgICByZXR1cm4gKytpaV87Ci0gIH0KLQotICBib29sIG9wZXJhdG9yICE9KGNvbnN0IFRFbnVtSXRlcmF0b3ImIGVuZCkgewotICAgIGFzc2VydChlbmQubl8gPT0gLTEpOwotICAgIHJldHVybiAoaWlfICE9IG5fKTsKLSAgfQotCi0gIHN0ZDo6cGFpcjxpbnQsIGNvbnN0IGNoYXIqPiBvcGVyYXRvciooKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGVudW1zX1tpaV9dLCBuYW1lc19baWlfXSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGludCBpaV87Ci0gIGNvbnN0IGludCBuXzsKLSAgaW50KiBlbnVtc187Ci0gIGNvbnN0IGNoYXIqKiBuYW1lc187Ci19OwotCi1jbGFzcyBUT3V0cHV0IHsKLSBwdWJsaWM6Ci0gIFRPdXRwdXQoKSA6IGZfKCZlcnJvclRpbWVXcmFwcGVyKSB7fQotCi0gIGlubGluZSB2b2lkIHNldE91dHB1dEZ1bmN0aW9uKHZvaWQgKCpmdW5jdGlvbikoY29uc3QgY2hhciAqKSl7Ci0gICAgZl8gPSBmdW5jdGlvbjsKLSAgfQotCi0gIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoY29uc3QgY2hhciAqbWVzc2FnZSl7Ci0gICAgZl8obWVzc2FnZSk7Ci0gIH0KLQotICAvLyBJdCBpcyBpbXBvcnRhbnQgdG8gaGF2ZSBhIGNvbnN0IGNoYXIqIG92ZXJsb2FkIGhlcmUgaW5zdGVhZCBvZgotICAvLyBqdXN0IHRoZSBzdHJpbmcgdmVyc2lvbiwgb3RoZXJ3aXNlIGVycm5vIGNvdWxkIGJlIGNvcnJ1cHRlZAotICAvLyBpZiB0aGVyZSBpcyBzb21lIHByb2JsZW0gYWxsb2NhdGluZyBtZW1vcnkgd2hlbiBjb25zdHJ1Y3RpbmcKLSAgLy8gdGhlIHN0cmluZy4KLSAgdm9pZCBwZXJyb3IoY29uc3QgY2hhciAqbWVzc2FnZSwgaW50IGVycm5vX2NvcHkpOwotICBpbmxpbmUgdm9pZCBwZXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcgJm1lc3NhZ2UsIGludCBlcnJub19jb3B5KSB7Ci0gICAgcGVycm9yKG1lc3NhZ2UuY19zdHIoKSwgZXJybm9fY29weSk7Ci0gIH0KLQotICB2b2lkIHByaW50Zihjb25zdCBjaGFyICptZXNzYWdlLCAuLi4pOwotCi0gIGlubGluZSBzdGF0aWMgdm9pZCBlcnJvclRpbWVXcmFwcGVyKGNvbnN0IGNoYXIqIG1zZykgewotICAgIHRpbWVfdCBub3c7Ci0gICAgY2hhciBkYmd0aW1lWzI2XTsKLSAgICB0aW1lKCZub3cpOwotICAgIGN0aW1lX3IoJm5vdywgZGJndGltZSk7Ci0gICAgZGJndGltZVsyNF0gPSAwOwotICAgIGZwcmludGYoc3RkZXJyLCAiVGhyaWZ0OiAlcyAlc1xuIiwgZGJndGltZSwgbXNnKTsKLSAgfQotCi0gIC8qKiBKdXN0IGxpa2Ugc3RyZXJyb3JfciBidXQgcmV0dXJucyBhIEMrKyBzdHJpbmcgb2JqZWN0LiAqLwotICBzdGF0aWMgc3RkOjpzdHJpbmcgc3RyZXJyb3JfcyhpbnQgZXJybm9fY29weSk7Ci0KLSBwcml2YXRlOgotICB2b2lkICgqZl8pKGNvbnN0IGNoYXIgKik7Ci19OwotCi1leHRlcm4gVE91dHB1dCBHbG9iYWxPdXRwdXQ7Ci0KLWNsYXNzIFRFeGNlcHRpb24gOiBwdWJsaWMgc3RkOjpleGNlcHRpb24gewotIHB1YmxpYzoKLSAgVEV4Y2VwdGlvbigpOgotICAgIG1lc3NhZ2VfKCkge30KLQotICBURXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6Ci0gICAgbWVzc2FnZV8obWVzc2FnZSkge30KLQotICB2aXJ0dWFsIH5URXhjZXB0aW9uKCkgdGhyb3coKSB7fQotCi0gIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCkgewotICAgIGlmIChtZXNzYWdlXy5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gIkRlZmF1bHQgVEV4Y2VwdGlvbi4iOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gbWVzc2FnZV8uY19zdHIoKTsKLSAgICB9Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgc3RkOjpzdHJpbmcgbWVzc2FnZV87Ci0KLX07Ci0KLQotLy8gRm9yd2FyZCBkZWNsYXJlIHRoaXMgc3RydWN0dXJlIHVzZWQgYnkgVERlbnNlUHJvdG9jb2wKLW5hbWVzcGFjZSByZWZsZWN0aW9uIHsgbmFtZXNwYWNlIGxvY2FsIHsKLXN0cnVjdCBUeXBlU3BlYzsKLX19Ci0KLWNsYXNzIFREZWxheWVkRXhjZXB0aW9uIHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDxjbGFzcyBFPiBzdGF0aWMgVERlbGF5ZWRFeGNlcHRpb24qIGRlbGF5RXhjZXB0aW9uKGNvbnN0IEUmIGUpOwotICB2aXJ0dWFsIHZvaWQgdGhyb3dfaXQoKSA9IDA7Ci0gIHZpcnR1YWwgflREZWxheWVkRXhjZXB0aW9uKCkge307Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgRT4gY2xhc3MgVEV4Y2VwdGlvbldyYXBwZXIgOiBwdWJsaWMgVERlbGF5ZWRFeGNlcHRpb24gewotIHB1YmxpYzoKLSAgVEV4Y2VwdGlvbldyYXBwZXIoY29uc3QgRSYgZSkgOiBlXyhlKSB7fQotICB2aXJ0dWFsIHZvaWQgdGhyb3dfaXQoKSB7Ci0gICAgRSB0ZW1wKGVfKTsKLSAgICBkZWxldGUgdGhpczsKLSAgICB0aHJvdyB0ZW1wOwotICB9Ci0gcHJpdmF0ZToKLSAgRSBlXzsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBFPgotVERlbGF5ZWRFeGNlcHRpb24qIFREZWxheWVkRXhjZXB0aW9uOjpkZWxheUV4Y2VwdGlvbihjb25zdCBFJiBlKSB7Ci0gIHJldHVybiBuZXcgVEV4Y2VwdGlvbldyYXBwZXI8RT4oZSk7Ci19Ci0KLSNpZiBUX0dMT0JBTF9ERUJVR19WSVJUVUFMID4gMQotdm9pZCBwcm9maWxlX3ZpcnR1YWxfY2FsbChjb25zdCBzdGQ6OnR5cGVfaW5mbyYgaW5mbyk7Ci12b2lkIHByb2ZpbGVfZ2VuZXJpY19wcm90b2NvbChjb25zdCBzdGQ6OnR5cGVfaW5mbyYgdGVtcGxhdGVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiBwcm90X3R5cGUpOwotdm9pZCBwcm9maWxlX3ByaW50X2luZm8oRklMRSAqZik7Ci12b2lkIHByb2ZpbGVfcHJpbnRfaW5mbygpOwotdm9pZCBwcm9maWxlX3dyaXRlX3Bwcm9mKEZJTEUqIGdlbl9jYWxsc19mLCBGSUxFKiB2aXJ0dWFsX2NhbGxzX2YpOwotI2VuZGlmCi0KLX19IC8vIGFwYWNoZTo6dGhyaWZ0Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVEhSSUZUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9WaXJ0dWFsUHJvZmlsaW5nLmNwcCBiL2xpYi9jcHAvc3JjL1ZpcnR1YWxQcm9maWxpbmcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjAyM2FmLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL1ZpcnR1YWxQcm9maWxpbmcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPFRocmlmdC5oPgotCi0vLyBEbyBub3RoaW5nIGlmIHZpcnR1YWwgY2FsbCBwcm9maWxpbmcgaXMgbm90IGVuYWJsZWQKLSNpZiBUX0dMT0JBTF9ERUJVR19WSVJUVUFMID4gMQotCi0vLyBUT0RPOiBUaGlzIGNvZGUgb25seSB3b3JrcyB3aXRoIGcrKyAoc2luY2Ugd2UgcmVseSBvbiB0aGUgZmFjdAotLy8gdGhhdCBhbGwgc3RkOjp0eXBlX2luZm8gaW5zdGFuY2VzIHJlZmVycmluZyB0byBhIHBhcnRpY3VsYXIgdHlwZQotLy8gYWx3YXlzIHJldHVybiB0aGUgZXhhY3Qgc2FtZSBwb2ludGVyIHZhbHVlIGZyb20gbmFtZSgpLikKLSNpZm5kZWYgX19HTlVHX18KLSNlcnJvciAiVGhyaWZ0IHZpcnR1YWwgZnVuY3Rpb24gcHJvZmlsaW5nIGN1cnJlbnRseSBvbmx5IHdvcmtzIHdpdGggZ2NjIgotI2VuZGlmIC8vICFfX0dOVUdfXwotCi0vLyBUT0RPOiBXZSBhbHNvIHJlcXVpcmUgZ2xpYmMgZm9yIHRoZSBiYWNrdHJhY2UoKSBhbmQgYmFja3RyYWNlX3N5bWJvbHMoKQotLy8gZnVuY3Rpb25zLgotI2lmbmRlZiBfX0dMSUJDX18KLSNlcnJvciAiVGhyaWZ0IHZpcnR1YWwgZnVuY3Rpb24gcHJvZmlsaW5nIGN1cnJlbnRseSByZXF1aXJlcyBnbGliYyIKLSNlbmRpZiAvLyAhX19HTElCQ19fCi0KLQotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L011dGV4Lmg+Ci0KLSNpbmNsdWRlIDxleHQvaGFzaF9tYXA+Ci0jaW5jbHVkZSA8ZXhlY2luZm8uaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7Ci0KLXVzaW5nIDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleDsKLXVzaW5nIDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZDsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBNQVhfU1RBQ0tfREVQVEggPSAxNTsKLQotLyoqCi0gKiBBIHN0YWNrIHRyYWNlCi0gKi8KLWNsYXNzIEJhY2t0cmFjZSB7Ci0gcHVibGljOgotICBCYWNrdHJhY2UoaW50IHNraXAgPSAwKTsKLSAgQmFja3RyYWNlKEJhY2t0cmFjZSBjb25zdCAmYnQpOwotCi0gIHZvaWQgb3BlcmF0b3I9KEJhY2t0cmFjZSBjb25zdCAmYnQpIHsKLSAgICBudW1DYWxsZXJzXyA9IGJ0Lm51bUNhbGxlcnNfOwotICAgIGlmIChudW1DYWxsZXJzXyA+PSAwKSB7Ci0gICAgICBtZW1jcHkoY2FsbGVyc18sIGJ0LmNhbGxlcnNfLCBudW1DYWxsZXJzXyAqIHNpemVvZih2b2lkKikpOwotICAgIH0KLSAgfQotCi0gIGJvb2wgb3BlcmF0b3I9PShCYWNrdHJhY2UgY29uc3QgJmJ0KSBjb25zdCB7Ci0gICAgcmV0dXJuIChjbXAoYnQpID09IDApOwotICB9Ci0KLSAgc2l6ZV90IGhhc2goKSBjb25zdCB7Ci0gICAgaW50cHRyX3QgcmV0ID0gMDsKLSAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bUNhbGxlcnNfOyArK24pIHsKLSAgICAgIHJldCBePSByZWludGVycHJldF9jYXN0PGludHB0cl90PihjYWxsZXJzX1tuXSk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KHJldCk7Ci0gIH0KLQotICBpbnQgY21wKEJhY2t0cmFjZSBjb25zdCYgYnQpIGNvbnN0IHsKLSAgICBpbnQgZGVwdGhfZGlmZiA9IChudW1DYWxsZXJzXyAtIGJ0Lm51bUNhbGxlcnNfKTsKLSAgICBpZiAoZGVwdGhfZGlmZiAhPSAwKSB7Ci0gICAgICByZXR1cm4gZGVwdGhfZGlmZjsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bUNhbGxlcnNfOyArK24pIHsKLSAgICAgIGludCBkaWZmID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oY2FsbGVyc19bbl0pIC0KLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oYnQuY2FsbGVyc19bbl0pOwotICAgICAgaWYgKGRpZmYgIT0gMCkgewotICAgICAgICByZXR1cm4gZGlmZjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHZvaWQgcHJpbnQoRklMRSAqZiwgaW50IGluZGVudD0wLCBpbnQgc3RhcnQ9MCkgY29uc3QgewotICAgIGNoYXIgKipzdHJpbmdzID0gYmFja3RyYWNlX3N5bWJvbHMoY2FsbGVyc18sIG51bUNhbGxlcnNfKTsKLSAgICBpZiAoc3RyaW5ncykgewotICAgICAgc3RhcnQgKz0gc2tpcF87Ci0gICAgICBpZiAoc3RhcnQgPCAwKSB7Ci0gICAgICAgIHN0YXJ0ID0gMDsKLSAgICAgIH0KLSAgICAgIGZvciAoaW50IG4gPSBzdGFydDsgbiA8IG51bUNhbGxlcnNfOyArK24pIHsKLSAgICAgICAgZnByaW50ZihmLCAiJSpzIyUtMmQgJXNcbiIsIGluZGVudCwgIiIsIG4sIHN0cmluZ3Nbbl0pOwotICAgICAgfQotICAgICAgZnJlZShzdHJpbmdzKTsKLSAgICB9IGVsc2UgewotICAgICAgZnByaW50ZihmLCAiJSpzPGZhaWxlZCB0byBkZXRlcm1pbmUgc3ltYm9scz5cbiIsIGluZGVudCwgIiIpOwotICAgIH0KLSAgfQotCi0gIGludCBnZXREZXB0aCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbnVtQ2FsbGVyc18gLSBza2lwXzsKLSAgfQotCi0gIHZvaWQgKmdldEZyYW1lKGludCBpbmRleCkgY29uc3QgewotICAgIGludCBhZGp1c3RlZF9pbmRleCA9IGluZGV4ICsgc2tpcF87Ci0gICAgaWYgKGFkanVzdGVkX2luZGV4IDwgMCB8fCBhZGp1c3RlZF9pbmRleCA+PSBudW1DYWxsZXJzXykgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBjYWxsZXJzX1thZGp1c3RlZF9pbmRleF07Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHZvaWQgKmNhbGxlcnNfW01BWF9TVEFDS19ERVBUSF07Ci0gIGludCBudW1DYWxsZXJzXzsKLSAgaW50IHNraXBfOwotfTsKLQotLy8gRGVmaW5lIHRoZSBjb25zdHJ1Y3RvcnMgbm9uLWlubGluZSwgc28gdGhleSBjb25zaXN0ZW50bHkgYWRkIGEgc2luZ2xlCi0vLyBmcmFtZSB0byB0aGUgc3RhY2sgdHJhY2UsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvcHRpbWl6YXRpb24gaXMgZW5hYmxlZAotQmFja3RyYWNlOjpCYWNrdHJhY2UoaW50IHNraXApCi0gIDogc2tpcF8oc2tpcCArIDEpIC8vIGlnbm9yZSB0aGUgY29uc3RydWN0b3IgaXRzZWxmCi17Ci0gIG51bUNhbGxlcnNfID0gYmFja3RyYWNlKGNhbGxlcnNfLCBNQVhfU1RBQ0tfREVQVEgpOwotICBpZiAoc2tpcF8gPiBudW1DYWxsZXJzXykgewotICAgIHNraXBfID0gbnVtQ2FsbGVyc187Ci0gIH0KLX0KLQotQmFja3RyYWNlOjpCYWNrdHJhY2UoQmFja3RyYWNlIGNvbnN0ICZidCkKLSAgOiBudW1DYWxsZXJzXyhidC5udW1DYWxsZXJzXykKLSAgLCBza2lwXyhidC5za2lwXykgewotICBpZiAobnVtQ2FsbGVyc18gPj0gMCkgewotICAgIG1lbWNweShjYWxsZXJzXywgYnQuY2FsbGVyc18sIG51bUNhbGxlcnNfICogc2l6ZW9mKHZvaWQqKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBBIGJhY2t0cmFjZSwgcGx1cyBvbmUgb3IgdHdvIHR5cGUgbmFtZXMKLSAqLwotY2xhc3MgS2V5IHsKLSBwdWJsaWM6Ci0gIGNsYXNzIEhhc2ggewotICAgcHVibGljOgotICAgIHNpemVfdCBvcGVyYXRvcigpKEtleSBjb25zdCYgaykgY29uc3QgewotICAgICAgcmV0dXJuIGsuaGFzaCgpOwotICAgIH0KLSAgfTsKLQotICBLZXkoY29uc3QgQmFja3RyYWNlKiBidCwgY29uc3Qgc3RkOjp0eXBlX2luZm8mIHR5cGVfaW5mbykKLSAgICA6IGJhY2t0cmFjZV8oYnQpCi0gICAgLCB0eXBlTmFtZTFfKHR5cGVfaW5mby5uYW1lKCkpCi0gICAgLCB0eXBlTmFtZTJfKE5VTEwpIHsKLSAgfQotCi0gIEtleShjb25zdCBCYWNrdHJhY2UqIGJ0LCBjb25zdCBzdGQ6OnR5cGVfaW5mbyYgdHlwZV9pbmZvMSwKLSAgICAgIGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiB0eXBlX2luZm8yKQotICAgIDogYmFja3RyYWNlXyhidCkKLSAgICAsIHR5cGVOYW1lMV8odHlwZV9pbmZvMS5uYW1lKCkpCi0gICAgLCB0eXBlTmFtZTJfKHR5cGVfaW5mbzIubmFtZSgpKSB7Ci0gIH0KLQotICBLZXkoY29uc3QgS2V5JiBrKQotICAgIDogYmFja3RyYWNlXyhrLmJhY2t0cmFjZV8pCi0gICAgLCB0eXBlTmFtZTFfKGsudHlwZU5hbWUxXykKLSAgICAsIHR5cGVOYW1lMl8oay50eXBlTmFtZTJfKSB7Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yPShjb25zdCBLZXkmIGspIHsKLSAgICBiYWNrdHJhY2VfID0gay5iYWNrdHJhY2VfOwotICAgIHR5cGVOYW1lMV8gPSBrLnR5cGVOYW1lMV87Ci0gICAgdHlwZU5hbWUyXyA9IGsudHlwZU5hbWUyXzsKLSAgfQotCi0gIGNvbnN0IEJhY2t0cmFjZSogZ2V0QmFja3RyYWNlKCkgY29uc3QgewotICAgIHJldHVybiBiYWNrdHJhY2VfOwotICB9Ci0KLSAgY29uc3QgY2hhciogZ2V0VHlwZU5hbWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHR5cGVOYW1lMV87Ci0gIH0KLQotICBjb25zdCBjaGFyKiBnZXRUeXBlTmFtZTIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHR5cGVOYW1lMl87Ci0gIH0KLQotICB2b2lkIG1ha2VQZXJzaXN0ZW50KCkgewotICAgIC8vIENvcHkgdGhlIEJhY2t0cmFjZSBvYmplY3QKLSAgICBiYWNrdHJhY2VfID0gbmV3IEJhY2t0cmFjZSgqYmFja3RyYWNlXyk7Ci0KLSAgICAvLyBOT1RFOiBXZSBkb24ndCBjb3B5IHRoZSB0eXBlIG5hbWUuCi0gICAgLy8gVGhlIEdOVSBsaWJzdGRjKysgaW1wbGVtZW50YXRpb24gb2YgdHlwZV9pbmZvOjpuYW1lKCkgcmV0dXJucyBhIHZhbHVlCi0gICAgLy8gdGhhdCB3aWxsIGJlIHZhbGlkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHByb2dyYW0uICAoQWx0aG91Z2ggdGhlIEMrKwotICAgIC8vIHN0YW5kYXJkIGRvZXNuJ3QgZ3VhcmFudGVlIHRoaXMgd2lsbCBiZSB0cnVlIG9uIGFsbCBpbXBsZW1lbnRhdGlvbnMuKQotICB9Ci0KLSAgLyoqCi0gICAqIENsZWFuIHVwIG1lbW9yeSBhbGxvY2F0ZWQgYnkgbWFrZVBlcnNpc3RlbnQoKQotICAgKgotICAgKiBTaG91bGQgb25seSBiZSBpbnZva2VkIGlmIG1ha2VQZXJzaXN0ZW50KCkgaGFzIHByZXZpb3VzbHkgYmVlbiBjYWxsZWQuCi0gICAqIFRoZSBLZXkgc2hvdWxkIG5vIGxvbmdlciBiZSB1c2VkIGFmdGVyIGNsZWFudXAoKSBpcyBjYWxsZWQuCi0gICAqLwotICB2b2lkIGNsZWFudXAoKSB7Ci0gICAgZGVsZXRlIGJhY2t0cmFjZV87Ci0gICAgYmFja3RyYWNlXyA9IE5VTEw7Ci0gIH0KLQotICBpbnQgY21wKGNvbnN0IEtleSYgaykgY29uc3QgewotICAgIGludCByZXQgPSBiYWNrdHJhY2VfLT5jbXAoKmsuYmFja3RyYWNlXyk7Ci0gICAgaWYgKHJldCAhPSAwKSB7Ci0gICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIC8vIE5PVEU6IFdlIGNvbXBhcmUganVzdCB0aGUgbmFtZSBwb2ludGVycy4KLSAgICAvLyBXaXRoIEdOVSBsaWJzdGRjKyssIGV2ZXJ5IHR5cGVfaW5mbyBvYmplY3QgZm9yIHRoZSBzYW1lIHR5cGUgcG9pbnRzIHRvCi0gICAgLy8gZXhhY3RseSB0aGUgc2FtZSBuYW1lIHN0cmluZy4gIChBbHRob3VnaCB0aGlzIGlzbid0IGd1YXJhbnRlZWQgYnkgdGhlCi0gICAgLy8gQysrIHN0YW5kYXJkLikKLSAgICByZXQgPSBrLnR5cGVOYW1lMV8gLSB0eXBlTmFtZTFfOwotICAgIGlmIChyZXQgIT0gMCkgewotICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgcmV0dXJuIGsudHlwZU5hbWUyXyAtIHR5cGVOYW1lMl87Ci0gIH0KLQotICBib29sIG9wZXJhdG9yPT0oY29uc3QgS2V5JiBrKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNtcChrKSA9PSAwOwotICB9Ci0KLSAgc2l6ZV90IGhhc2goKSBjb25zdCB7Ci0gICAgLy8gTk9URTogQXMgYWJvdmUsIHdlIGp1c3QgdXNlIHRoZSBuYW1lIHBvaW50ZXIgdmFsdWUuCi0gICAgLy8gV29ya3Mgd2l0aCBHTlUgbGlic3RkYysrLCBidXQgbm90IGd1YXJhbnRlZWQgdG8gYmUgY29ycmVjdCBvbiBhbGwKLSAgICAvLyBpbXBsZW1lbnRhdGlvbnMuCi0gICAgcmV0dXJuIGJhY2t0cmFjZV8tPmhhc2goKSBeCi0gICAgICByZWludGVycHJldF9jYXN0PHNpemVfdD4odHlwZU5hbWUxXykgXgotICAgICAgcmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KHR5cGVOYW1lMl8pOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBCYWNrdHJhY2UqIGJhY2t0cmFjZV87Ci0gIGNvbnN0IGNoYXIqIHR5cGVOYW1lMV87Ci0gIGNvbnN0IGNoYXIqIHR5cGVOYW1lMl87Ci19OwotCi0vKioKLSAqIEEgZnVuY3RvciB0aGF0IGRldGVybWluZXMgd2hpY2ggb2YgdHdvIEJhY2t0cmFjZU1hcCBlbnRyaWVzCi0gKiBoYXMgYSBoaWdoZXIgY291bnQuCi0gKi8KLWNsYXNzIENvdW50R3JlYXRlciB7Ci0gcHVibGljOgotICBib29sIG9wZXJhdG9yKCkoc3RkOjpwYWlyPEtleSwgc2l6ZV90PiBidDEsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8S2V5LCBzaXplX3Q+IGJ0MikgY29uc3QgewotICAgIHJldHVybiBidDEuc2Vjb25kID4gYnQyLnNlY29uZDsKLSAgfQotfTsKLQotdHlwZWRlZiBfX2dudV9jeHg6Omhhc2hfbWFwPEtleSwgc2l6ZV90LCBLZXk6Okhhc2g+IEJhY2t0cmFjZU1hcDsKLQotLyoqCi0gKiBBIG1hcCBkZXNjcmliaW5nIGhvdyBtYW55IHRpbWVzIFRfVklSVFVBTF9DQUxMKCkgaGFzIGJlZW4gaW52b2tlZC4KLSAqLwotQmFja3RyYWNlTWFwIHZpcnR1YWxfY2FsbHM7Ci1NdXRleCB2aXJ0dWFsX2NhbGxzX211dGV4OwotCi0vKioKLSAqIEEgbWFwIGRlc2NyaWJpbmcgaG93IG1hbnkgdGltZXMgVF9HRU5FUklDX1BST1RPQ09MKCkgaGFzIGJlZW4gaW52b2tlZC4KLSAqLwotQmFja3RyYWNlTWFwIGdlbmVyaWNfY2FsbHM7Ci1NdXRleCBnZW5lcmljX2NhbGxzX211dGV4OwotCi0KLXZvaWQgX3JlY29yZF9iYWNrdHJhY2UoQmFja3RyYWNlTWFwKiBtYXAsIGNvbnN0IE11dGV4JiBtdXRleCwgS2V5ICprKSB7Ci0gIEd1YXJkIGd1YXJkKG11dGV4KTsKLQotICBCYWNrdHJhY2VNYXA6Oml0ZXJhdG9yIGl0ID0gbWFwLT5maW5kKCprKTsKLSAgaWYgKGl0ID09IG1hcC0+ZW5kKCkpIHsKLSAgICBrLT5tYWtlUGVyc2lzdGVudCgpOwotICAgIG1hcC0+aW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCprLCAxKSk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gaW5jcmVtZW50IHRoZSBjb3VudAotICAgIC8vIE5PVEU6IHdlIGNvdWxkIGFzc2VydCBpZiBpdC0+c2Vjb25kIGlzIDAgYWZ0ZXJ3YXJkcywgc2luY2UgdGhhdCB3b3VsZAotICAgIC8vIG1lYW4gd2UndmUgd3JhcHBlZC4KLSAgICArKyhpdC0+c2Vjb25kKTsKLSAgfQotfQotCi0vKioKLSAqIFJlY29yZCBhbiB1bm5lY2Vzc2FyeSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwuCi0gKgotICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBieSB0aGUgVF9WSVJUVUFMX0NBTEwoKSBtYWNyby4KLSAqLwotdm9pZCBwcm9maWxlX3ZpcnR1YWxfY2FsbChjb25zdCBzdGQ6OnR5cGVfaW5mbyYgdHlwZSkgewotICBpbnQgY29uc3Qgc2tpcCA9IDE7IC8vIGlnbm9yZSB0aGlzIGZyYW1lCi0gIEJhY2t0cmFjZSBidChza2lwKTsKLSAgS2V5IGsoJmJ0LCB0eXBlKTsKLSAgX3JlY29yZF9iYWNrdHJhY2UoJnZpcnR1YWxfY2FsbHMsIHZpcnR1YWxfY2FsbHNfbXV0ZXgsICZrKTsKLX0KLQotLyoqCi0gKiBSZWNvcmQgYSBjYWxsIHRvIGEgdGVtcGxhdGUgcHJvY2Vzc29yIHdpdGggYSBwcm90b2NvbCB0aGF0IGlzIG5vdCB0aGUgb25lCi0gKiBzcGVjaWZpZWQgaW4gdGhlIHRlbXBsYXRlIHBhcmFtZXRlci4KLSAqCi0gKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZSBUX0dFTkVSSUNfUFJPVE9DT0woKSBtYWNyby4KLSAqLwotdm9pZCBwcm9maWxlX2dlbmVyaWNfcHJvdG9jb2woY29uc3Qgc3RkOjp0eXBlX2luZm8mIHRlbXBsYXRlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnR5cGVfaW5mbyYgcHJvdF90eXBlKSB7Ci0gIGludCBjb25zdCBza2lwID0gMTsgLy8gaWdub3JlIHRoaXMgZnJhbWUKLSAgQmFja3RyYWNlIGJ0KHNraXApOwotICBLZXkgaygmYnQsIHRlbXBsYXRlX3R5cGUsIHByb3RfdHlwZSk7Ci0gIF9yZWNvcmRfYmFja3RyYWNlKCZnZW5lcmljX2NhbGxzLCBnZW5lcmljX2NhbGxzX211dGV4LCAmayk7Ci19Ci0KLS8qKgotICogUHJpbnQgdGhlIHJlY29yZGVkIHByb2ZpbGluZyBpbmZvcm1hdGlvbiB0byB0aGUgc3BlY2lmaWVkIGZpbGUuCi0gKi8KLXZvaWQgcHJvZmlsZV9wcmludF9pbmZvKEZJTEUqIGYpIHsKLSAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjwgc3RkOjpwYWlyPEtleSwgc2l6ZV90PiA+IEJhY2t0cmFjZVZlY3RvcjsKLQotICBDb3VudEdyZWF0ZXIgaXNfZ3JlYXRlcjsKLQotICAvLyBHcmFiIGJvdGggbG9ja3MgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgcHJpbnQgb3BlcmF0aW9uLAotICAvLyB0byBlbnN1cmUgdGhlIG91dHB1dCBpcyBhIGNvbnNpc3RlbnQgc25hcHNob3Qgb2YgYSBzaW5nbGUgcG9pbnQgaW4gdGltZQotICBHdWFyZCBnZW5lcmljX2NhbGxzX2d1YXJkKGdlbmVyaWNfY2FsbHNfbXV0ZXgpOwotICBHdWFyZCB2aXJ0dWFsX2NhbGxzX2d1YXJkKHZpcnR1YWxfY2FsbHNfbXV0ZXgpOwotCi0gIC8vIHByaW50IHRoZSBpbmZvIGZyb20gZ2VuZXJpY19jYWxscywgc29ydGVkIGJ5IGZyZXF1ZW5jeQotICAvLwotICAvLyBXZSBwcmludCB0aGUgZ2VuZXJpY19jYWxscyBpbmZvIGFoZWFkIG9mIHZpcnR1YWxfY2FsbHMsIHNpbmNlIGl0IGlzIG1vcmUKLSAgLy8gdXNlZnVsIGluIHNvbWUgY2FzZXMuICBBbGwgVF9HRU5FUklDX1BST1RPQ09MIGNhbGxzIGNhbiBiZSBlbGltaW5hdGVkCi0gIC8vIGZyb20gbW9zdCBwcm9ncmFtcy4gIE5vdCBhbGwgVF9WSVJUVUFMX0NBTExzIHdpbGwgYmUgZWxpbWluYXRlZCBieQotICAvLyBjb252ZXJ0aW5nIHRvIHRlbXBsYXRlcy4KLSAgQmFja3RyYWNlVmVjdG9yIGdwX3NvcnRlZChnZW5lcmljX2NhbGxzLmJlZ2luKCksIGdlbmVyaWNfY2FsbHMuZW5kKCkpOwotICBzdGQ6OnNvcnQoZ3Bfc29ydGVkLmJlZ2luKCksIGdwX3NvcnRlZC5lbmQoKSwgaXNfZ3JlYXRlcik7Ci0KLSAgZm9yIChCYWNrdHJhY2VWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZ3Bfc29ydGVkLmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gZ3Bfc29ydGVkLmVuZCgpOwotICAgICAgICsraXQpIHsKLSAgICBLZXkgY29uc3QgJmtleSA9IGl0LT5maXJzdDsKLSAgICBzaXplX3QgY29uc3QgY291bnQgPSBpdC0+c2Vjb25kOwotICAgIGZwcmludGYoZiwgIlRfR0VORVJJQ19QUk9UT0NPTDogJXp1IGNhbGxzIHRvICVzIHdpdGggYSAlczpcbiIsCi0gICAgICAgICAgICBjb3VudCwga2V5LmdldFR5cGVOYW1lKCksIGtleS5nZXRUeXBlTmFtZTIoKSk7Ci0gICAga2V5LmdldEJhY2t0cmFjZSgpLT5wcmludChmLCAyKTsKLSAgICBmcHJpbnRmKGYsICJcbiIpOwotICB9Ci0KLSAgLy8gcHJpbnQgdGhlIGluZm8gZnJvbSB2aXJ0dWFsX2NhbGxzLCBzb3J0ZWQgYnkgZnJlcXVlbmN5Ci0gIEJhY2t0cmFjZVZlY3RvciB2Y19zb3J0ZWQodmlydHVhbF9jYWxscy5iZWdpbigpLCB2aXJ0dWFsX2NhbGxzLmVuZCgpKTsKLSAgc3RkOjpzb3J0KHZjX3NvcnRlZC5iZWdpbigpLCB2Y19zb3J0ZWQuZW5kKCksIGlzX2dyZWF0ZXIpOwotCi0gIGZvciAoQmFja3RyYWNlVmVjdG9yOjpjb25zdF9pdGVyYXRvciBpdCA9IHZjX3NvcnRlZC5iZWdpbigpOwotICAgICAgIGl0ICE9IHZjX3NvcnRlZC5lbmQoKTsKLSAgICAgICArK2l0KSB7Ci0gICAgS2V5IGNvbnN0ICZrZXkgPSBpdC0+Zmlyc3Q7Ci0gICAgc2l6ZV90IGNvbnN0IGNvdW50ID0gaXQtPnNlY29uZDsKLSAgICBmcHJpbnRmKGYsICJUX1ZJUlRVQUxfQ0FMTDogJXp1IGNhbGxzIG9uICVzOlxuIiwgY291bnQsIGtleS5nZXRUeXBlTmFtZSgpKTsKLSAgICBrZXkuZ2V0QmFja3RyYWNlKCktPnByaW50KGYsIDIpOwotICAgIGZwcmludGYoZiwgIlxuIik7Ci0gIH0KLX0KLQotLyoqCi0gKiBQcmludCB0aGUgcmVjb3JkZWQgcHJvZmlsaW5nIGluZm9ybWF0aW9uIHRvIHN0ZG91dC4KLSAqLwotdm9pZCBwcm9maWxlX3ByaW50X2luZm8oKSB7Ci0gIHByb2ZpbGVfcHJpbnRfaW5mbyhzdGRvdXQpOwotfQotCi0vKioKLSAqIFdyaXRlIGEgQmFja3RyYWNlTWFwIGFzIEdvb2dsZSBDUFUgcHJvZmlsZXIgYmluYXJ5IGRhdGEuCi0gKi8KLXN0YXRpYyB2b2lkIHByb2ZpbGVfd3JpdGVfcHByb2ZfZmlsZShGSUxFKiBmLCBCYWNrdHJhY2VNYXAgY29uc3QmIG1hcCkgewotICAvLyBXcml0ZSB0aGUgaGVhZGVyCi0gIHVpbnRwdHJfdCBoZWFkZXJbNV0gPSB7IDAsIDMsIDAsIDAsIDAgfTsKLSAgZndyaXRlKCZoZWFkZXIsIHNpemVvZihoZWFkZXIpLCAxLCBmKTsKLQotICAvLyBXcml0ZSB0aGUgcHJvZmlsZSByZWNvcmRzCi0gIGZvciAoQmFja3RyYWNlTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1hcC5iZWdpbigpOyBpdCAhPSBtYXAuZW5kKCk7ICsraXQpIHsKLSAgICB1aW50cHRyX3QgY291bnQgPSBpdC0+c2Vjb25kOwotICAgIGZ3cml0ZSgmY291bnQsIHNpemVvZihjb3VudCksIDEsIGYpOwotCi0gICAgQmFja3RyYWNlIGNvbnN0KiBidCA9IGl0LT5maXJzdC5nZXRCYWNrdHJhY2UoKTsKLSAgICB1aW50cHRyX3QgbnVtX3BjcyA9IGJ0LT5nZXREZXB0aCgpOwotICAgIGZ3cml0ZSgmbnVtX3Bjcywgc2l6ZW9mKG51bV9wY3MpLCAxLCBmKTsKLQotICAgIGZvciAodWludHB0cl90IG4gPSAwOyBuIDwgbnVtX3BjczsgKytuKSB7Ci0gICAgICB2b2lkKiBwYyA9IGJ0LT5nZXRGcmFtZShuKTsKLSAgICAgIGZ3cml0ZSgmcGMsIHNpemVvZihwYyksIDEsIGYpOwotICAgIH0KLSAgfQotCi0gIC8vIFdyaXRlIHRoZSB0cmFpbGVyCi0gIHVpbnRwdHJfdCB0cmFpbGVyWzNdID0geyAwLCAxLCAwIH07Ci0gIGZ3cml0ZSgmdHJhaWxlciwgc2l6ZW9mKHRyYWlsZXIpLCAxLCBmKTsKLQotICAvLyBXcml0ZSAvcHJvYy9zZWxmL21hcHMKLSAgLy8gVE9ETyhzaW1wa2lucyk6IFRoaXMgb25seSB3b3JrcyBvbiBsaW51eAotICBGSUxFICpwcm9jX21hcHMgPSBmb3BlbigiL3Byb2Mvc2VsZi9tYXBzIiwgInIiKTsKLSAgaWYgKHByb2NfbWFwcykgewotICAgIHVpbnQ4X3QgYnVmWzQwOTZdOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBzaXplX3QgYnl0ZXNfcmVhZCA9IGZyZWFkKGJ1ZiwgMSwgc2l6ZW9mKGJ1ZiksIHByb2NfbWFwcyk7Ci0gICAgICBpZiAoYnl0ZXNfcmVhZCA9PSAwKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZndyaXRlKGJ1ZiwgMSwgYnl0ZXNfcmVhZCwgZik7Ci0gICAgfQotICAgIGZjbG9zZShwcm9jX21hcHMpOwotICB9Ci19Ci0KLS8qKgotICogV3JpdGUgdGhlIHJlY29yZGVkIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBhcyBwcHJvZiBmaWxlcy4KLSAqCi0gKiBUaGlzIHdyaXRlcyB0aGUgaW5mb3JtYXRpb24gdXNpbmcgdGhlIEdvb2dsZSBDUFUgcHJvZmlsZXIgYmluYXJ5IGRhdGEKLSAqIGZvcm1hdCwgc28gaXQgY2FuIGJlIGFuYWx5emVkIHdpdGggcHByb2YuICBOb3RlIHRoYXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0gKiBwcm90b2NvbC90cmFuc3BvcnQgZGF0YSB0eXBlcyBjYW5ub3QgYmUgc3RvcmVkIGluIHRoaXMgZmlsZSBmb3JtYXQuCi0gKgotICogU2VlIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtcGVyZnRvb2xzLyBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIEBwYXJhbSBnZW5fY2FsbHNfZiAgICAgVGhlIGluZm9ybWF0aW9uIGFib3V0IGNhbGxzIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfZ2VuZXJpY19wcm90b2NvbCgpIHdpbGwgYmUgd3JpdHRlbiB0byB0aGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuCi0gKiBAcGFyYW0gdmlydHVhbF9jYWxsc19mIFRoZSBpbmZvcm1hdGlvbiBhYm91dCBjYWxscyB0bwotICogICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX3ZpcnR1YWxfY2FsbCgpIHdpbGwgYmUgd3JpdHRlbiB0byB0aGlzIGZpbGUuCi0gKi8KLXZvaWQgcHJvZmlsZV93cml0ZV9wcHJvZihGSUxFKiBnZW5fY2FsbHNfZiwgRklMRSogdmlydHVhbF9jYWxsc19mKSB7Ci0gIHR5cGVkZWYgc3RkOjp2ZWN0b3I8IHN0ZDo6cGFpcjxLZXksIHNpemVfdD4gPiBCYWNrdHJhY2VWZWN0b3I7Ci0KLSAgQ291bnRHcmVhdGVyIGlzX2dyZWF0ZXI7Ci0KLSAgLy8gR3JhYiBib3RoIGxvY2tzIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHByaW50IG9wZXJhdGlvbiwKLSAgLy8gdG8gZW5zdXJlIHRoZSBvdXRwdXQgaXMgYSBjb25zaXN0ZW50IHNuYXBzaG90IG9mIGEgc2luZ2xlIHBvaW50IGluIHRpbWUKLSAgR3VhcmQgZ2VuZXJpY19jYWxsc19ndWFyZChnZW5lcmljX2NhbGxzX211dGV4KTsKLSAgR3VhcmQgdmlydHVhbF9jYWxsc19ndWFyZCh2aXJ0dWFsX2NhbGxzX211dGV4KTsKLQotICAvLyB3cml0ZSB0aGUgaW5mbyBmcm9tIGdlbmVyaWNfY2FsbHMKLSAgcHJvZmlsZV93cml0ZV9wcHJvZl9maWxlKGdlbl9jYWxsc19mLCBnZW5lcmljX2NhbGxzKTsKLQotICAvLyB3cml0ZSB0aGUgaW5mbyBmcm9tIHZpcnR1YWxfY2FsbHMKLSAgcHJvZmlsZV93cml0ZV9wcHJvZl9maWxlKHZpcnR1YWxfY2FsbHNfZiwgdmlydHVhbF9jYWxscyk7Ci19Ci0KLX19IC8vIGFwYWNoZTo6dGhyaWZ0Ci0KLSNlbmRpZiAvLyBUX0dMT0JBTF9QUk9GSUxFX1ZJUlRVQUwgPiAwCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9hc3luYy9UQXN5bmNCdWZmZXJQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmFmMzIzLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVEFTWU5DX0JVRkZFUl9QUk9DRVNTT1JfSF8KLSNkZWZpbmUgX1RIUklGVF9UQVNZTkNfQlVGRkVSX1BST0NFU1NPUl9IXyAxCi0KLSNpbmNsdWRlIDx0cjEvZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotI2luY2x1ZGUgInRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oIgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBhc3luYyB7Ci0KLWNsYXNzIFRBc3luY0J1ZmZlclByb2Nlc3NvciB7Ci0gcHVibGljOgotICAvLyBQcm9jZXNzIGRhdGEgaW4gImluIiwgcHV0dGluZyB0aGUgcmVzdWx0IGluICJvdXQiLgotICAvLyBDYWxsIF9yZXR1cm4odHJ1ZSkgd2hlbiBkb25lLCBvciBfcmV0dXJuKGZhbHNlKSB0bwotICAvLyBmb3JjZWZ1bGx5IGNsb3NlIHRoZSBjb25uZWN0aW9uIChpZiBhcHBsaWNhYmxlKS4KLSAgLy8gImluIiBhbmQgIm91dCIgc2hvdWxkIGJlIFRNZW1vcnlCdWZmZXIgb3Igc2ltaWxhciwKLSAgLy8gbm90IGEgd3JhcHBlciBhcm91bmQgYSBzb2NrZXQuCi0gIHZpcnR1YWwgdm9pZCBwcm9jZXNzKAotICAgICAgc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlPiBpYnVmLAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U+IG9idWYpID0gMDsKLSAgdmlydHVhbCB+VEFzeW5jQnVmZmVyUHJvY2Vzc29yKCkge30KLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UQVNZTkNfQlVGRkVSX1BST0NFU1NPUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvYXN5bmMvVEFzeW5jQ2hhbm5lbC5jcHAgYi9saWIvY3BwL3NyYy9hc3luYy9UQXN5bmNDaGFubmVsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM5NzAxNy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9hc3luYy9UQXN5bmNDaGFubmVsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGFzeW5jL1RBc3luY0NoYW5uZWwuaD4KLSNpbmNsdWRlIDx0cjEvZnVuY3Rpb25hbD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgewotCi12b2lkIFRBc3luY0NoYW5uZWw6OnNlbmRBbmRSZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZW1vcnlCdWZmZXIqIHNlbmRCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVtb3J5QnVmZmVyKiByZWN2QnVmKSB7Ci0gIHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKCk+IHNlbmRfZG9uZSA9Ci0gICAgc3RkOjp0cjE6OmJpbmQoJlRBc3luY0NoYW5uZWw6OnJlY3ZNZXNzYWdlLCB0aGlzLCBjb2IsIHJlY3ZCdWYpOwotCi0gIHNlbmRNZXNzYWdlKHNlbmRfZG9uZSwgc2VuZEJ1Zik7Ci19Ci0KLX19fSAgLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9hc3luYy9UQXN5bmNDaGFubmVsLmggYi9saWIvY3BwL3NyYy9hc3luYy9UQXN5bmNDaGFubmVsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNDkyNzMuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfQVNZTkNfVEFTWU5DQ0hBTk5FTF9IXwotI2RlZmluZSBfVEhSSUZUX0FTWU5DX1RBU1lOQ0NIQU5ORUxfSF8gMQotCi0jaW5jbHVkZSA8dHIxL2Z1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8VGhyaWZ0Lmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci1jbGFzcyBUTWVtb3J5QnVmZmVyOwotfX19Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGFzeW5jIHsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Ci0KLWNsYXNzIFRBc3luY0NoYW5uZWwgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZCgpPiBWb2lkQ2FsbGJhY2s7Ci0KLSAgdmlydHVhbCB+VEFzeW5jQ2hhbm5lbCgpIHt9Ci0KLSAgLy8gaXMgdGhlIGNoYW5uZWwgaW4gYSBnb29kIHN0YXRlPwotICB2aXJ0dWFsIGJvb2wgZ29vZCgpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBib29sIGVycm9yKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIGJvb2wgdGltZWRPdXQoKSBjb25zdCA9IDA7Ci0KLSAgLyoqCi0gICAqIFNlbmQgYSBtZXNzYWdlIG92ZXIgdGhlIGNoYW5uZWwuCi0gICAqCi0gICAqIEByZXR1cm4gIHRydWUgaWZmIHRoZSBjb2IgaGFzIGJlZW4gb3Igd2lsbCBiZSBjYWxsZWQsIGVsc2UgZmFsc2UKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBzZW5kTWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogbWVzc2FnZSkgPSAwOwotCi0gIC8qKgotICAgKiBSZWNlaXZlIGEgbWVzc2FnZSBmcm9tIHRoZSBjaGFubmVsLgotICAgKgotICAgKiBAcmV0dXJuICB0cnVlIGlmZiB0aGUgY29iIGhhcyBiZWVuIG9yIHdpbGwgYmUgY2FsbGVkLCBlbHNlIGZhbHNlCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgcmVjdk1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpID0gMDsKLQotICAvKioKLSAgICogU2VuZCBhIG1lc3NhZ2Ugb3ZlciB0aGUgY2hhbm5lbCBhbmQgcmVjZWl2ZSBhIHJlc3BvbnNlLgotICAgKgotICAgKiBAcmV0dXJuICB0cnVlIGlmZiB0aGUgY29iIGhhcyBiZWVuIG9yIHdpbGwgYmUgY2FsbGVkLCBlbHNlIGZhbHNlCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgc2VuZEFuZFJlY3ZNZXNzYWdlKGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHNlbmRCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogcmVjdkJ1Zik7Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCi0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQVNZTkNfVEFTWU5DQ0hBTk5FTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBiNTQyOC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RBU1lOQ1BST0NFU1NPUl9IXwotI2RlZmluZSBfVEhSSUZUX1RBU1lOQ1BST0NFU1NPUl9IXyAxCi0KLSNpbmNsdWRlIDx0cjEvZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UUHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxUUHJvY2Vzc29yLmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGFzeW5jIHsKLQotLyoqCi0gKiBBc3luYyB2ZXJzaW9uIG9mIGEgVFByb2Nlc3Nvci4gIEl0IGlzIG5vdCBleHBlY3RlZCB0byBjb21wbGV0ZSBieSB0aGUgdGltZQotICogdGhlIGNhbGwgdG8gcHJvY2VzcyByZXR1cm5zLiAgSW5zdGVhZCwgaXQgY2FsbHMgYSBjb2IgdG8gc2lnbmFsIGNvbXBsZXRpb24uCi0gKi8KLQotY2xhc3MgVEV2ZW50U2VydmVyOyAvLyBmb3J3YXJkIGRlY2xhcmF0aW9uCi0KLWNsYXNzIFRBc3luY1Byb2Nlc3NvciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5UQXN5bmNQcm9jZXNzb3IoKSB7fQotCi0gIHZpcnR1YWwgdm9pZCBwcm9jZXNzKHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQpID0gMDsKLQotICB2b2lkIHByb2Nlc3Moc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vbCBzdWNjZXNzKT4gX3JldHVybiwKLSAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbykgewotICAgIHJldHVybiBwcm9jZXNzKF9yZXR1cm4sIGlvLCBpbyk7Ci0gIH0KLQotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBnZXRFdmVudEhhbmRsZXIoKSB7Ci0gICAgcmV0dXJuIGV2ZW50SGFuZGxlcl87Ci0gIH0KLQotICB2b2lkIHNldEV2ZW50SGFuZGxlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXIpIHsKLSAgICBldmVudEhhbmRsZXJfID0gZXZlbnRIYW5kbGVyOwotICB9Ci0KLSAgY29uc3QgVEV2ZW50U2VydmVyKiBnZXRBc3luY1NlcnZlcigpIHsKLSAgICByZXR1cm4gYXN5bmNTZXJ2ZXJfOwotICB9Ci0gcHJvdGVjdGVkOgotICBUQXN5bmNQcm9jZXNzb3IoKSB7fQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcl87Ci0gIGNvbnN0IFRFdmVudFNlcnZlciogYXN5bmNTZXJ2ZXJfOwotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBURXZlbnRTZXJ2ZXI7Ci0gIHZvaWQgc2V0QXN5bmNTZXJ2ZXIoY29uc3QgVEV2ZW50U2VydmVyKiBzZXJ2ZXIpIHsKLSAgICBhc3luY1NlcnZlcl8gPSBzZXJ2ZXI7Ci0gIH0KLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKLQotLy8gWFhYIEknbSBsYXp5IGZvciBub3cKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jUHJvY2Vzc29yOwotfX0KLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UQVNZTkNQUk9DRVNTT1JfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcCBiL2xpYi9jcHAvc3JjL2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFhODZlMC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJUQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oIgotCi11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyQmFzZTsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBhc3luYyB7Ci0KLXZvaWQgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3I6OnByb2Nlc3MoCi0gICAgc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUQnVmZmVyQmFzZT4gaWJ1ZiwKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUQnVmZmVyQmFzZT4gb2J1ZikgewotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlwcm90KHBmYWN0Xy0+Z2V0UHJvdG9jb2woaWJ1ZikpOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG9wcm90KHBmYWN0Xy0+Z2V0UHJvdG9jb2wob2J1ZikpOwotICByZXR1cm4gdW5kZXJseWluZ18tPnByb2Nlc3MoCi0gICAgICBzdGQ6OnRyMTo6YmluZCgKLSAgICAgICAgJlRBc3luY1Byb3RvY29sUHJvY2Vzc29yOjpmaW5pc2gsCi0gICAgICAgIF9yZXR1cm4sCi0gICAgICAgIG9wcm90LAotICAgICAgICBzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfMSksCi0gICAgICBpcHJvdCwgb3Byb3QpOwotfQotCi0vKiBzdGF0aWMgKi8gdm9pZCBUQXN5bmNQcm90b2NvbFByb2Nlc3Nvcjo6ZmluaXNoKAotICAgIHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKGJvb2wgaGVhbHRoeSk+IF9yZXR1cm4sCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvcHJvdCwKLSAgICBib29sIGhlYWx0aHkpIHsKLSAgKHZvaWQpIG9wcm90OwotICAvLyBUaGlzIGlzIGEgc3R1YiBmdW5jdGlvbiB0byBob2xkIGEgcmVmZXJlbmNlIHRvIG9wcm90LgotICByZXR1cm4gX3JldHVybihoZWFsdGh5KTsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0N2JiYjYuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1ROQU1FX01FX0hfCi0jZGVmaW5lIF9USFJJRlRfVE5BTUVfTUVfSF8gMQotCi0jaW5jbHVkZSAiVEFzeW5jUHJvY2Vzc29yLmgiCi0jaW5jbHVkZSAiVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmgiCi0jaW5jbHVkZSAicHJvdG9jb2wvVFByb3RvY29sLmgiCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGFzeW5jIHsKLQotY2xhc3MgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IgOiBwdWJsaWMgVEFzeW5jQnVmZmVyUHJvY2Vzc29yIHsKLSBwdWJsaWM6Ci0gIFRBc3luY1Byb3RvY29sUHJvY2Vzc29yKAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiB1bmRlcmx5aW5nLAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwZmFjdCkKLSAgICA6IHVuZGVybHlpbmdfKHVuZGVybHlpbmcpCi0gICAgLCBwZmFjdF8ocGZhY3QpCi0gIHt9Ci0KLSAgdmlydHVhbCB2b2lkIHByb2Nlc3MoCi0gICAgICBzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U+IGlidWYsCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyQmFzZT4gb2J1Zik7Ci0KLSAgdmlydHVhbCB+VEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IoKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIHZvaWQgZmluaXNoKAotICAgICAgc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBvcHJvdCwKLSAgICAgIGJvb2wgaGVhbHRoeSk7Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiB1bmRlcmx5aW5nXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwZmFjdF87Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCi0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVE5BTUVfTUVfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmNwcCBiL2xpYi9jcHAvc3JjL2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTVmYzFiMC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiVEV2aHR0cENsaWVudENoYW5uZWwuaCIKLSNpbmNsdWRlIDxldmh0dHAuaD4KLSNpbmNsdWRlICJ0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaCIKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgewotCi0KLVRFdmh0dHBDbGllbnRDaGFubmVsOjpURXZodHRwQ2xpZW50Q2hhbm5lbCgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKLSAgICBjb25zdCBjaGFyKiBhZGRyZXNzLAotICAgIGludCBwb3J0LAotICAgIHN0cnVjdCBldmVudF9iYXNlKiBlYikKLSAgOiBob3N0Xyhob3N0KQotICAsIHBhdGhfKHBhdGgpCi0gICwgcmVjdkJ1Zl8oTlVMTCkKLSAgLCBjb25uXyhOVUxMKQotewotICBjb25uXyA9IGV2aHR0cF9jb25uZWN0aW9uX25ldyhhZGRyZXNzLCBwb3J0KTsKLSAgaWYgKGNvbm5fID09IE5VTEwpIHsKLSAgICBhYm9ydCgpOyAvLyBYWFgKLSAgfQotICBldmh0dHBfY29ubmVjdGlvbl9zZXRfYmFzZShjb25uXywgZWIpOwotfQotCi0KLVRFdmh0dHBDbGllbnRDaGFubmVsOjp+VEV2aHR0cENsaWVudENoYW5uZWwoKSB7Ci0gIGlmIChjb25uXyAhPSBOVUxMKSB7Ci0gICAgZXZodHRwX2Nvbm5lY3Rpb25fZnJlZShjb25uXyk7Ci0gIH0KLX0KLQotCi12b2lkIFRFdmh0dHBDbGllbnRDaGFubmVsOjpzZW5kQW5kUmVjdk1lc3NhZ2UoCi0gICAgY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCi0gICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogc2VuZEJ1ZiwKLSAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiByZWN2QnVmKSB7Ci0gIGNvYl8gPSBjb2I7Ci0gIHJlY3ZCdWZfID0gcmVjdkJ1ZjsKLQotICBzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSA9IGV2aHR0cF9yZXF1ZXN0X25ldyhyZXNwb25zZSwgdGhpcyk7Ci0gIGlmIChyZXEgPT0gTlVMTCkgewotICAgIGFib3J0KCk7IC8vIFhYWAotICB9Ci0KLSAgaW50IHJ2OwotCi0gIHJ2ID0gZXZodHRwX2FkZF9oZWFkZXIocmVxLT5vdXRwdXRfaGVhZGVycywgIkhvc3QiLCBob3N0Xy5jX3N0cigpKTsKLSAgaWYgKHJ2ICE9IDApIHsKLSAgICBhYm9ydCgpOyAvLyBYWFgKLSAgfQotCi0gIHJ2ID0gZXZodHRwX2FkZF9oZWFkZXIocmVxLT5vdXRwdXRfaGVhZGVycywgIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpOwotICBpZiAocnYgIT0gMCkgewotICAgIGFib3J0KCk7IC8vIFhYWAotICB9Ci0KLSAgdWludDhfdCogb2J1ZjsKLSAgdWludDMyX3Qgc3o7Ci0gIHNlbmRCdWYtPmdldEJ1ZmZlcigmb2J1ZiwgJnN6KTsKLSAgcnYgPSBldmJ1ZmZlcl9hZGQocmVxLT5vdXRwdXRfYnVmZmVyLCBvYnVmLCBzeik7Ci0gIGlmIChydiAhPSAwKSB7Ci0gICAgYWJvcnQoKTsgLy8gWFhYCi0gIH0KLQotICBydiA9IGV2aHR0cF9tYWtlX3JlcXVlc3QoY29ubl8sIHJlcSwgRVZIVFRQX1JFUV9QT1NULCBwYXRoXy5jX3N0cigpKTsKLSAgaWYgKHJ2ICE9IDApIHsKLSAgICBhYm9ydCgpOyAvLyBYWFgKLSAgfQotfQotCi0KLXZvaWQgVEV2aHR0cENsaWVudENoYW5uZWw6OnNlbmRNZXNzYWdlKAotICAgIGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLCBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBtZXNzYWdlKSB7Ci0gICh2b2lkKSBjb2I7Ci0gICh2b2lkKSBtZXNzYWdlOwotICBhYm9ydCgpOyAvLyBYWFgKLX0KLQotCi12b2lkIFRFdmh0dHBDbGllbnRDaGFubmVsOjpyZWN2TWVzc2FnZSgKLSAgICBjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogbWVzc2FnZSkgewotICAodm9pZCkgY29iOwotICAodm9pZCkgbWVzc2FnZTsKLSAgYWJvcnQoKTsgLy8gWFhYCi19Ci0KLQotdm9pZCBURXZodHRwQ2xpZW50Q2hhbm5lbDo6ZmluaXNoKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxKSB7Ci0gIGlmIChyZXEgPT0gTlVMTCkgewotICAgIGNvYl8oKTsKLQlyZXR1cm47Ci0gIH0gZWxzZSBpZiAocmVxLT5yZXNwb25zZV9jb2RlICE9IDIwMCkgewotICAgIGNvYl8oKTsKLQlyZXR1cm47Ci0gIH0KLSAgcmVjdkJ1Zl8tPnJlc2V0QnVmZmVyKAotICAgICAgRVZCVUZGRVJfREFUQShyZXEtPmlucHV0X2J1ZmZlciksCi0gICAgICBFVkJVRkZFUl9MRU5HVEgocmVxLT5pbnB1dF9idWZmZXIpKTsKLSAgY29iXygpOwotICByZXR1cm47Ci19Ci0KLQotLyogc3RhdGljICovIHZvaWQgVEV2aHR0cENsaWVudENoYW5uZWw6OnJlc3BvbnNlKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxLCB2b2lkKiBhcmcpIHsKLSAgVEV2aHR0cENsaWVudENoYW5uZWwqIHNlbGYgPSAoVEV2aHR0cENsaWVudENoYW5uZWwqKWFyZzsKLSAgc2VsZi0+ZmluaXNoKHJlcSk7Ci19Ci0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuaCBiL2xpYi9jcHAvc3JjL2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTdlZGIuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RFVkhUVFBfQ0xJRU5UX0NIQU5ORUxfSF8KLSNkZWZpbmUgX1RIUklGVF9URVZIVFRQX0NMSUVOVF9DSEFOTkVMX0hfIDEKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlICJUQXN5bmNDaGFubmVsLmgiCi0KLXN0cnVjdCBldmVudF9iYXNlOwotc3RydWN0IGV2aHR0cF9jb25uZWN0aW9uOwotc3RydWN0IGV2aHR0cF9yZXF1ZXN0OwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotY2xhc3MgVE1lbW9yeUJ1ZmZlcjsKLX19fQotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBhc3luYyB7Ci0KLWNsYXNzIFRFdmh0dHBDbGllbnRDaGFubmVsIDogcHVibGljIFRBc3luY0NoYW5uZWwgewotIHB1YmxpYzoKLSAgdXNpbmcgVEFzeW5jQ2hhbm5lbDo6Vm9pZENhbGxiYWNrOwotCi0gIFRFdmh0dHBDbGllbnRDaGFubmVsKAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKLSAgICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MsCi0gICAgICBpbnQgcG9ydCwKLSAgICAgIHN0cnVjdCBldmVudF9iYXNlKiBlYik7Ci0gIH5URXZodHRwQ2xpZW50Q2hhbm5lbCgpOwotCi0gIHZpcnR1YWwgdm9pZCBzZW5kQW5kUmVjdk1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogc2VuZEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiByZWN2QnVmKTsKLQotICB2aXJ0dWFsIHZvaWQgc2VuZE1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpOwotICB2aXJ0dWFsIHZvaWQgcmVjdk1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpOwotCi0gIHZvaWQgZmluaXNoKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxKTsKLQotICAvL1hYWAotICB2aXJ0dWFsIGJvb2wgZ29vZCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgdmlydHVhbCBib29sIGVycm9yKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIHRpbWVkT3V0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyB2b2lkIHJlc3BvbnNlKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxLCB2b2lkKiBhcmcpOwotCi0gIHN0ZDo6c3RyaW5nIGhvc3RfOwotICBzdGQ6OnN0cmluZyBwYXRoXzsKLSAgVm9pZENhbGxiYWNrIGNvYl87Ci0gIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHJlY3ZCdWZfOwotICBzdHJ1Y3QgZXZodHRwX2Nvbm5lY3Rpb24qIGNvbm5fOwotCi19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCi0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVEVWSFRUUF9DTElFTlRfQ0hBTk5FTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvYXN5bmMvVEV2aHR0cFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy9hc3luYy9URXZodHRwU2VydmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzAxZjhiZC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9hc3luYy9URXZodHRwU2VydmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJURXZodHRwU2VydmVyLmgiCi0jaW5jbHVkZSAiVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmgiCi0jaW5jbHVkZSA8ZXZodHRwLmg+Ci0KLSNpZm5kZWYgSFRUUF9JTlRFUk5BTCAvLyBsaWJldmVudCA8IDIKLSNkZWZpbmUgSFRUUF9JTlRFUk5BTCA1MDAKLSNlbmRpZgotCi11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBhc3luYyB7Ci0KLQotc3RydWN0IFRFdmh0dHBTZXJ2ZXI6OlJlcXVlc3RDb250ZXh0IHsKLSAgc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXE7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IGlidWY7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IG9idWY7Ci0KLSAgUmVxdWVzdENvbnRleHQoc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEpOwotfTsKLQotCi1URXZodHRwU2VydmVyOjpURXZodHRwU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yKQotICA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKQotICAsIGViXyhOVUxMKQotICAsIGVoXyhOVUxMKQote30KLQotCi1URXZodHRwU2VydmVyOjpURXZodHRwU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yLCBpbnQgcG9ydCkKLSAgOiBwcm9jZXNzb3JfKHByb2Nlc3NvcikKLSAgLCBlYl8oTlVMTCkKLSAgLCBlaF8oTlVMTCkKLXsKLSAgLy8gQ3JlYXRlIGV2ZW50X2Jhc2UgYW5kIGV2aHR0cC4KLSAgZWJfID0gZXZlbnRfYmFzZV9uZXcoKTsKLSAgaWYgKGViXyA9PSBOVUxMKSB7Ci0gICAgYWJvcnQoKTsgIC8vIFhYWAotICB9Ci0gIGVoXyA9IGV2aHR0cF9uZXcoZWJfKTsKLSAgaWYgKGVoXyA9PSBOVUxMKSB7Ci0gICAgZXZlbnRfYmFzZV9mcmVlKGViXyk7Ci0gICAgYWJvcnQoKTsgIC8vIFhYWAotICB9Ci0KLSAgLy8gQmluZCB0byBwb3J0LgotICBpbnQgcmV0ID0gZXZodHRwX2JpbmRfc29ja2V0KGVoXywgTlVMTCwgcG9ydCk7Ci0gIGlmIChyZXQgPCAwKSB7Ci0gICAgZXZodHRwX2ZyZWUoZWhfKTsKLSAgICBldmVudF9iYXNlX2ZyZWUoZWJfKTsKLSAgfQotCi0gIC8vIFJlZ2lzdGVyIGEgaGFuZGxlci4gIElmIHlvdSB1c2UgdGhlIG90aGVyIGNvbnN0cnVjdG9yLAotICAvLyB5b3Ugd2lsbCB3YW50IHRvIGRvIHRoaXMgeW91cnNlbGYuCi0gIC8vIERvbid0IGZvcmdldCB0byB1bnJlZ2lzdGVyIGJlZm9yZSBkZXN0b3J5aW5nIHRoaXMgVEV2aHR0cFNlcnZlci4KLSAgZXZodHRwX3NldF9jYihlaF8sICIvIiwgcmVxdWVzdCwgKHZvaWQqKXRoaXMpOwotfQotCi0KLVRFdmh0dHBTZXJ2ZXI6On5URXZodHRwU2VydmVyKCkgewotICBpZiAoZWhfICE9IE5VTEwpIHsKLSAgICBldmh0dHBfZnJlZShlaF8pOwotICB9Ci0gIGlmIChlYl8gIT0gTlVMTCkgewotICAgIGV2ZW50X2Jhc2VfZnJlZShlYl8pOwotICB9Ci19Ci0KLQotaW50IFRFdmh0dHBTZXJ2ZXI6OnNlcnZlKCkgewotICBpZiAoZWJfID09IE5VTEwpIHsKLSAgICBhYm9ydCgpOyAgLy8gWFhYCi0gIH0KLSAgcmV0dXJuIGV2ZW50X2Jhc2VfZGlzcGF0Y2goZWJfKTsKLX0KLQotCi1URXZodHRwU2VydmVyOjpSZXF1ZXN0Q29udGV4dDo6UmVxdWVzdENvbnRleHQoc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEpIDogcmVxKHJlcSkKLSAgLCBpYnVmKG5ldyBUTWVtb3J5QnVmZmVyKEVWQlVGRkVSX0RBVEEocmVxLT5pbnB1dF9idWZmZXIpLCBFVkJVRkZFUl9MRU5HVEgocmVxLT5pbnB1dF9idWZmZXIpKSkKLSAgLCBvYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpCi17fQotCi0KLXZvaWQgVEV2aHR0cFNlcnZlcjo6cmVxdWVzdChzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSwgdm9pZCogc2VsZikgewotICB0cnkgewotICAgIHN0YXRpY19jYXN0PFRFdmh0dHBTZXJ2ZXIqPihzZWxmKS0+cHJvY2VzcyhyZXEpOwotICB9IGNhdGNoKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7Ci0gICAgZXZodHRwX3NlbmRfcmVwbHkocmVxLCBIVFRQX0lOVEVSTkFMLCBlLndoYXQoKSwgMCk7Ci0gIH0KLX0KLQotCi12b2lkIFRFdmh0dHBTZXJ2ZXI6OnByb2Nlc3Moc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEpIHsKLSAgUmVxdWVzdENvbnRleHQqIGN0eCA9IG5ldyBSZXF1ZXN0Q29udGV4dChyZXEpOwotICByZXR1cm4gcHJvY2Vzc29yXy0+cHJvY2VzcygKLSAgICAgIHN0ZDo6dHIxOjpiaW5kKAotICAgICAgICAmVEV2aHR0cFNlcnZlcjo6Y29tcGxldGUsCi0gICAgICAgIHRoaXMsCi0gICAgICAgIGN0eCwKLSAgICAgICAgc3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzEpLAotICAgICAgY3R4LT5pYnVmLAotICAgICAgY3R4LT5vYnVmKTsKLX0KLQotCi12b2lkIFRFdmh0dHBTZXJ2ZXI6OmNvbXBsZXRlKFJlcXVlc3RDb250ZXh0KiBjdHgsIGJvb2wgc3VjY2VzcykgewotICAodm9pZCkgc3VjY2VzczsKLSAgc3RkOjphdXRvX3B0cjxSZXF1ZXN0Q29udGV4dD4gcHRyKGN0eCk7Ci0KLSAgaW50IGNvZGUgPSAyMDA7Ci0gIGNvbnN0IGNoYXIqIHJlYXNvbiA9ICJPSyI7Ci0KLSAgaW50IHJ2ID0gZXZodHRwX2FkZF9oZWFkZXIoY3R4LT5yZXEtPm91dHB1dF9oZWFkZXJzLCAiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtdGhyaWZ0Iik7Ci0gIGlmIChydiAhPSAwKSB7Ci0gICAgLy8gVE9ETzogTG9nIGFuIGVycm9yLgotICB9Ci0KLSAgc3RydWN0IGV2YnVmZmVyKiBidWYgPSBldmJ1ZmZlcl9uZXcoKTsKLSAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgLy8gVE9ETzogTG9nIGFuIGVycm9yLgotICB9IGVsc2UgewotICAgIHVpbnQ4X3QqIG9idWY7Ci0gICAgdWludDMyX3Qgc3o7Ci0gICAgY3R4LT5vYnVmLT5nZXRCdWZmZXIoJm9idWYsICZzeik7Ci0gICAgaW50IHJldCA9IGV2YnVmZmVyX2FkZChidWYsIG9idWYsIHN6KTsKLSAgICBpZiAocmV0ICE9IDApIHsKLSAgICAgIC8vIFRPRE86IExvZyBhbiBlcnJvci4KLSAgICB9Ci0gIH0KLQotICBldmh0dHBfc2VuZF9yZXBseShjdHgtPnJlcSwgY29kZSwgcmVhc29uLCBidWYpOwotICBpZiAoYnVmICE9IE5VTEwpIHsKLSAgICBldmJ1ZmZlcl9mcmVlKGJ1Zik7Ci0gIH0KLX0KLQotCi1zdHJ1Y3QgZXZlbnRfYmFzZSogVEV2aHR0cFNlcnZlcjo6Z2V0RXZlbnRCYXNlKCkgewotICByZXR1cm4gZWJfOwotfQotCi0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRjNmZmYi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9hc3luYy9URXZodHRwU2VydmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9URVZIVFRQX1NFUlZFUl9IXwotI2RlZmluZSBfVEhSSUZUX1RFVkhUVFBfU0VSVkVSX0hfIDEKLQotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotCi1zdHJ1Y3QgZXZlbnRfYmFzZTsKLXN0cnVjdCBldmh0dHA7Ci1zdHJ1Y3QgZXZodHRwX3JlcXVlc3Q7Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGFzeW5jIHsKLQotY2xhc3MgVEFzeW5jQnVmZmVyUHJvY2Vzc29yOwotCi1jbGFzcyBURXZodHRwU2VydmVyIHsKLSBwdWJsaWM6Ci0gIC8qKgotICAgKiBDcmVhdGUgYSBURXZodHRwU2VydmVyIGZvciB1c2Ugd2l0aCBhbiBleHRlcm5hbCBldmh0dHAgaW5zdGFuY2UuCi0gICAqIE11c3QgYmUgbWFudWFsbHkgaW5zdGFsbGVkIHdpdGggZXZodHRwX3NldF9jYiwgdXNpbmcKLSAgICogVEV2aHR0cFNlcnZlcjo6cmVxdWVzdCBhcyB0aGUgY2FsbGJhY2sgYW5kIHRoZQotICAgKiBhZGRyZXNzIG9mIHRoZSBzZXJ2ZXIgYXMgdGhlIGV4dHJhIGFyZy4KLSAgICogRG8gbm90IGNhbGwgInNlcnZlIiBvbiB0aGlzIHNlcnZlci4KLSAgICovCi0gIFRFdmh0dHBTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiBwcm9jZXNzb3IpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBURXZodHRwU2VydmVyIHdpdGggYW4gZW1iZWRkZWQgZXZlbnRfYmFzZSBhbmQgZXZodHRwLAotICAgKiBsaXN0ZW5pbmcgb24gcG9ydCBhbmQgcmVzcG9uZGluZyBvbiB0aGUgZW5kcG9pbnQgIi8iLgotICAgKiBDYWxsICJzZXJ2ZSIgb24gdGhpcyBzZXJ2ZXIgdG8gc2VydmUgZm9yZXZlci4KLSAgICovCi0gIFRFdmh0dHBTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiBwcm9jZXNzb3IsIGludCBwb3J0KTsKLQotICB+VEV2aHR0cFNlcnZlcigpOwotCi0gIHN0YXRpYyB2b2lkIHJlcXVlc3Qoc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEsIHZvaWQqIHNlbGYpOwotICBpbnQgc2VydmUoKTsKLQotICBzdHJ1Y3QgZXZlbnRfYmFzZSogZ2V0RXZlbnRCYXNlKCk7Ci0KLSBwcml2YXRlOgotICBzdHJ1Y3QgUmVxdWVzdENvbnRleHQ7Ci0KLSAgdm9pZCBwcm9jZXNzKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxKTsKLSAgdm9pZCBjb21wbGV0ZShSZXF1ZXN0Q29udGV4dCogY3R4LCBib29sIHN1Y2Nlc3MpOwotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKLSAgc3RydWN0IGV2ZW50X2Jhc2UqIGViXzsKLSAgc3RydWN0IGV2aHR0cCogZWhfOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RFVkhUVFBfU0VSVkVSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9FeGNlcHRpb24uaCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzQ2NjI5Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfRVhDRVBUSU9OX0hfCi0jZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfRVhDRVBUSU9OX0hfIDEKLQotI2luY2x1ZGUgPGV4Y2VwdGlvbj4KLSNpbmNsdWRlIDxUaHJpZnQuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi1jbGFzcyBOb1N1Y2hUYXNrRXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHt9OwotCi1jbGFzcyBVbmNhbmNlbGxhYmxlVGFza0V4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7fTsKLQotY2xhc3MgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHt9OwotCi1jbGFzcyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24ge307Ci0KLWNsYXNzIFRpbWVkT3V0RXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKLXB1YmxpYzoKLSAgVGltZWRPdXRFeGNlcHRpb24oKTpURXhjZXB0aW9uKCJUaW1lZE91dEV4Y2VwdGlvbiIpe307Ci0gIFRpbWVkT3V0RXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlICkgOgotICAgIFRFeGNlcHRpb24obWVzc2FnZSkge30KLX07Ci0KLWNsYXNzIFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24gOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24gewotcHVibGljOgotICBUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uKCk6VEV4Y2VwdGlvbigiVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiIpe307Ci0gIFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UgKSA6Ci0gICAgVEV4Y2VwdGlvbihtZXNzYWdlKSB7fQotfTsKLQotY2xhc3MgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24gOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24gewotcHVibGljOgotICAgIFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCkge30KLQotICAgIFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6Ci0gICAgICAgIFRFeGNlcHRpb24obWVzc2FnZSkge30KLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9FWENFUFRJT05fSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmggYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9GdW5jdGlvblJ1bm5lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YThjZDNkLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfRlVOQ1RJT05fUlVOTkVSX0gKLSNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9GVU5DVElPTl9SVU5ORVJfSCAxCi0KLSNpbmNsdWRlIDx0cjEvZnVuY3Rpb25hbD4KLSNpbmNsdWRlICJ0aHJpZnQvbGliL2NwcC9jb25jdXJyZW5jeS9UaHJlYWQuaCIKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi0vKioKLSAqIENvbnZlbmllbnQgaW1wbGVtZW50YXRpb24gb2YgUnVubmFibGUgdGhhdCB3aWxsIGV4ZWN1dGUgYXJiaXRyYXJ5IGNhbGxiYWNrcy4KLSAqIEludGVyZmFjZXMgYXJlIHByb3ZpZGVkIHRvIGFjY2VwdCBib3RoIGEgZ2VuZXJpYyAndm9pZCh2b2lkKScgY2FsbGJhY2ssIGFuZAotICogYSAndm9pZCogKHZvaWQqKScgcHRocmVhZF9jcmVhdGUtc3R5bGUgY2FsbGJhY2suCi0gKgotICogRXhhbXBsZSB1c2U6Ci0gKiAgdm9pZCogbXlfdGhyZWFkX21haW4odm9pZCogYXJnKTsKLSAqICBzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IGZhY3RvcnkgPSAuLi47Ci0gKiAgLy8gVG8gY3JlYXRlIGEgdGhyZWFkIHRoYXQgZXhlY3V0ZXMgbXlfdGhyZWFkX21haW4gb25jZToKLSAqICBzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkID0KLSAqICAgIGZhY3RvcnktPm5ld1RocmVhZChzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPigKLSAqICAgICAgbmV3IEZ1bmN0aW9uUnVubmVyKG15X3RocmVhZF9tYWluLCBzb21lX2FyZ3VtZW50KSkpOwotICogIHRocmVhZC0+c3RhcnQoKTsKLSAqCi0gKiAgYm9vbCBBOjpmb28oKTsKLSAqICBBKiBhID0gbmV3IEEoKTsKLSAqICAvLyBUbyBjcmVhdGUgYSB0aHJlYWQgdGhhdCBleGVjdXRlcyBhLmZvbygpIGV2ZXJ5IDEwMCBtaWxsaXNlY29uZHM6Ci0gKiAgZmFjdG9yeS0+bmV3VGhyZWFkKHNoYXJlZF9wdHI8RnVuY3Rpb25SdW5uZXI+KAotICogICAgbmV3IEZ1bmN0aW9uUnVubmVyKHN0ZDo6dHIxOjpiaW5kKCZBOjpmb28sIGEpLCAxMDApKSktPnN0YXJ0KCk7Ci0gKgotICovCi0KLWNsYXNzIEZ1bmN0aW9uUnVubmVyIDogcHVibGljIFJ1bm5hYmxlIHsKLSBwdWJsaWM6Ci0gIC8vIFRoaXMgaXMgdGhlIHR5cGUgb2YgY2FsbGJhY2sgJ3B0aHJlYWRfY3JlYXRlKCknIGV4cGVjdHMuCi0gIHR5cGVkZWYgdm9pZCogKCpQdGhyZWFkRnVuY1B0cikodm9pZCAqYXJnKTsKLSAgLy8gVGhpcyBhIGZ1bGx5LWdlbmVyaWMgdm9pZCh2b2lkKSBjYWxsYmFjayBmb3IgY3VzdG9tIGJpbmRpbmdzLgotICB0eXBlZGVmIHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKCk+IFZvaWRGdW5jOwotCi0gIHR5cGVkZWYgc3RkOjp0cjE6OmZ1bmN0aW9uPGJvb2woKT4gQm9vbEZ1bmM7Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGEgJ3B0aHJlYWRfY3JlYXRlJyBzdHlsZSBjYWxsYmFjaywgdGhpcyBGdW5jdGlvblJ1bm5lciB3aWxsCi0gICAqIGV4ZWN1dGUgdGhlIGdpdmVuIGNhbGxiYWNrLiAgTm90ZSB0aGF0IHRoZSAndm9pZConIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkLgotICAgKi8KLSAgRnVuY3Rpb25SdW5uZXIoUHRocmVhZEZ1bmNQdHIgZnVuYywgdm9pZCogYXJnKQotICAgOiBmdW5jXyhzdGQ6OnRyMTo6YmluZChmdW5jLCBhcmcpKSwgcmVwRnVuY18oMCkKLSAgeyB9Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGEgZ2VuZXJpYyBjYWxsYmFjaywgdGhpcyBGdW5jdGlvblJ1bm5lciB3aWxsIGV4ZWN1dGUgaXQuCi0gICAqLwotICBGdW5jdGlvblJ1bm5lcihjb25zdCBWb2lkRnVuYyYgY29iKQotICAgOiBmdW5jXyhjb2IpLCByZXBGdW5jXygwKQotICB7IH0KLQotICAvKioKLSAgICogR2l2ZW4gYSBib29sIGZvbyguLi4pIHR5cGUgY2FsbGJhY2ssIEZ1bmN0aW9uUnVubmVyIHdpbGwgZXhlY3V0ZQotICAgKiB0aGUgY2FsbGJhY2sgcmVwZWF0ZWRseSB3aXRoICdpbnRlcnZhbE1zJyBtaWxsaXNlY29uZHMgYmV0d2VlbiB0aGUgY2FsbHMsCi0gICAqIHVudGlsIGl0IHJldHVybnMgZmFsc2UuIE5vdGUgdGhhdCB0aGUgYWN0dWFsIGludGVydmFsIGJldHdlZW4gY2FsbHMgd2lsbAotICAgKiBiZSBpbnRlcnZhbE1zIHBsdXMgZXhlY3V0aW9uIHRpbWUgb2YgdGhlIGNhbGxiYWNrLgotICAgKi8KLSAgRnVuY3Rpb25SdW5uZXIoY29uc3QgQm9vbEZ1bmMmIGNvYiwgaW50IGludGVydmFsTXMpCi0gICA6IGZ1bmNfKDApLCByZXBGdW5jXyhjb2IpLCBpbnRlcnZhbE1zXyhpbnRlcnZhbE1zKQotICB7IH0KLQotICB2b2lkIHJ1bigpIHsKLSAgICBpZiAocmVwRnVuY18pIHsKLSAgICAgIHdoaWxlKHJlcEZ1bmNfKCkpIHsKLSAgICAgICAgdXNsZWVwKGludGVydmFsTXNfKjEwMDApOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBmdW5jXygpOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgVm9pZEZ1bmMgZnVuY187Ci0gIEJvb2xGdW5jIHJlcEZ1bmNfOwotICBpbnQgaW50ZXJ2YWxNc187Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfRlVOQ1RJT05fUlVOTkVSX0gKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L01vbml0b3IuY3BwIGIvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvTW9uaXRvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NDNlZjcuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvTW9uaXRvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiTW9uaXRvci5oIgotI2luY2x1ZGUgIkV4Y2VwdGlvbi5oIgotI2luY2x1ZGUgIlV0aWwuaCIKLQotI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9wdHIuaHBwPgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLXVzaW5nIGJvb3N0OjpzY29wZWRfcHRyOwotCi0vKioKLSAqIE1vbml0b3IgaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlIFBPU0lYIHB0aHJlYWQgbGlicmFyeQotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIE1vbml0b3I6OkltcGwgewotCi0gcHVibGljOgotCi0gIEltcGwoKQotICAgICA6IG93bmVkTXV0ZXhfKG5ldyBNdXRleCgpKSwKLSAgICAgICBtdXRleF8oTlVMTCksCi0gICAgICAgY29uZEluaXRpYWxpemVkXyhmYWxzZSkgewotICAgIGluaXQob3duZWRNdXRleF8uZ2V0KCkpOwotICB9Ci0KLSAgSW1wbChNdXRleCogbXV0ZXgpCi0gICAgIDogbXV0ZXhfKE5VTEwpLAotICAgICAgIGNvbmRJbml0aWFsaXplZF8oZmFsc2UpIHsKLSAgICBpbml0KG11dGV4KTsKLSAgfQotCi0gIEltcGwoTW9uaXRvciogbW9uaXRvcikKLSAgICAgOiBtdXRleF8oTlVMTCksCi0gICAgICAgY29uZEluaXRpYWxpemVkXyhmYWxzZSkgewotICAgIGluaXQoJihtb25pdG9yLT5tdXRleCgpKSk7Ci0gIH0KLQotICB+SW1wbCgpIHsgY2xlYW51cCgpOyB9Ci0KLSAgTXV0ZXgmIG11dGV4KCkgeyByZXR1cm4gKm11dGV4XzsgfQotICB2b2lkIGxvY2soKSB7IG11dGV4KCkubG9jaygpOyB9Ci0gIHZvaWQgdW5sb2NrKCkgeyBtdXRleCgpLnVubG9jaygpOyB9Ci0KLSAgdm9pZCB3YWl0KGludDY0X3QgdGltZW91dCkgY29uc3QgewotICAgIGFzc2VydChtdXRleF8pOwotICAgIHB0aHJlYWRfbXV0ZXhfdCogbXV0ZXhJbXBsID0KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8cHRocmVhZF9tdXRleF90Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKLSAgICBhc3NlcnQobXV0ZXhJbXBsKTsKLQotICAgIC8vIFhYWCBOZWVkIHRvIGFzc2VydCB0aGF0IGNhbGxlciBvd25zIG11dGV4Ci0gICAgYXNzZXJ0KHRpbWVvdXQgPj0gMExMKTsKLSAgICBpZiAodGltZW91dCA9PSAwTEwpIHsKLSAgICAgIGludCBpcmV0ID0gcHRocmVhZF9jb25kX3dhaXQoJnB0aHJlYWRfY29uZF8sIG11dGV4SW1wbCk7Ci0gICAgICBhc3NlcnQoaXJldCA9PSAwKTsKLSAgICB9IGVsc2UgewotICAgICAgc3RydWN0IHRpbWVzcGVjIGFic3RpbWU7Ci0gICAgICBpbnQ2NF90IG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0gICAgICBVdGlsOjp0b1RpbWVzcGVjKGFic3RpbWUsIG5vdyArIHRpbWVvdXQpOwotICAgICAgaW50IHJlc3VsdCA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQoJnB0aHJlYWRfY29uZF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRleEltcGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWJzdGltZSk7Ci0gICAgICBpZiAocmVzdWx0ID09IEVUSU1FRE9VVCkgewotICAgICAgICAvLyBwdGhyZWFkX2NvbmRfdGltZWR3YWl0IGhhcyBiZWVuIG9ic2VydmVkIHRvIHJldHVybiBlYXJseSBvbgotICAgICAgICAvLyB2YXJpb3VzIHBsYXRmb3Jtcywgc28gY29tbWVudCBvdXQgdGhpcyBhc3NlcnQuCi0gICAgICAgIC8vYXNzZXJ0KFV0aWw6OmN1cnJlbnRUaW1lKCkgPj0gKG5vdyArIHRpbWVvdXQpKTsKLSAgICAgICAgdGhyb3cgVGltZWRPdXRFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIG5vdGlmeSgpIHsKLSAgICAvLyBYWFggTmVlZCB0byBhc3NlcnQgdGhhdCBjYWxsZXIgb3ducyBtdXRleAotICAgIGludCBpcmV0ID0gcHRocmVhZF9jb25kX3NpZ25hbCgmcHRocmVhZF9jb25kXyk7Ci0gICAgYXNzZXJ0KGlyZXQgPT0gMCk7Ci0gIH0KLQotICB2b2lkIG5vdGlmeUFsbCgpIHsKLSAgICAvLyBYWFggTmVlZCB0byBhc3NlcnQgdGhhdCBjYWxsZXIgb3ducyBtdXRleAotICAgIGludCBpcmV0ID0gcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmcHRocmVhZF9jb25kXyk7Ci0gICAgYXNzZXJ0KGlyZXQgPT0gMCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0KLSAgdm9pZCBpbml0KE11dGV4KiBtdXRleCkgewotICAgIG11dGV4XyA9IG11dGV4OwotCi0gICAgaWYgKHB0aHJlYWRfY29uZF9pbml0KCZwdGhyZWFkX2NvbmRfLCBOVUxMKSA9PSAwKSB7Ci0gICAgICBjb25kSW5pdGlhbGl6ZWRfID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoIWNvbmRJbml0aWFsaXplZF8pIHsKLSAgICAgIGNsZWFudXAoKTsKLSAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBjbGVhbnVwKCkgewotICAgIGlmIChjb25kSW5pdGlhbGl6ZWRfKSB7Ci0gICAgICBjb25kSW5pdGlhbGl6ZWRfID0gZmFsc2U7Ci0gICAgICBpbnQgaXJldCA9IHB0aHJlYWRfY29uZF9kZXN0cm95KCZwdGhyZWFkX2NvbmRfKTsKLSAgICAgIGFzc2VydChpcmV0ID09IDApOwotICAgIH0KLSAgfQotCi0gIHNjb3BlZF9wdHI8TXV0ZXg+IG93bmVkTXV0ZXhfOwotICBNdXRleCogbXV0ZXhfOwotCi0gIG11dGFibGUgcHRocmVhZF9jb25kX3QgcHRocmVhZF9jb25kXzsKLSAgbXV0YWJsZSBib29sIGNvbmRJbml0aWFsaXplZF87Ci19OwotCi1Nb25pdG9yOjpNb25pdG9yKCkgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbCgpKSB7fQotTW9uaXRvcjo6TW9uaXRvcihNdXRleCogbXV0ZXgpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwobXV0ZXgpKSB7fQotTW9uaXRvcjo6TW9uaXRvcihNb25pdG9yKiBtb25pdG9yKSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKG1vbml0b3IpKSB7fQotCi1Nb25pdG9yOjp+TW9uaXRvcigpIHsgZGVsZXRlIGltcGxfOyB9Ci0KLU11dGV4JiBNb25pdG9yOjptdXRleCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5tdXRleCgpOyB9Ci0KLXZvaWQgTW9uaXRvcjo6bG9jaygpIGNvbnN0IHsgaW1wbF8tPmxvY2soKTsgfQotCi12b2lkIE1vbml0b3I6OnVubG9jaygpIGNvbnN0IHsgaW1wbF8tPnVubG9jaygpOyB9Ci0KLXZvaWQgTW9uaXRvcjo6d2FpdChpbnQ2NF90IHRpbWVvdXQpIGNvbnN0IHsgaW1wbF8tPndhaXQodGltZW91dCk7IH0KLQotdm9pZCBNb25pdG9yOjpub3RpZnkoKSBjb25zdCB7IGltcGxfLT5ub3RpZnkoKTsgfQotCi12b2lkIE1vbml0b3I6Om5vdGlmeUFsbCgpIGNvbnN0IHsgaW1wbF8tPm5vdGlmeUFsbCgpOyB9Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L01vbml0b3IuaCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L01vbml0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI5MTE5ZC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9Nb25pdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9NT05JVE9SX0hfCi0jZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfTU9OSVRPUl9IXyAxCi0KLSNpbmNsdWRlICJFeGNlcHRpb24uaCIKLSNpbmNsdWRlICJNdXRleC5oIgotCi0jaW5jbHVkZSA8Ym9vc3QvdXRpbGl0eS5ocHA+Ci0KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi0vKioKLSAqIEEgbW9uaXRvciBpcyBhIGNvbWJpbmF0aW9uIG11dGV4IGFuZCBjb25kaXRpb24tZXZlbnQuICBXYWl0aW5nIGFuZAotICogbm90aWZ5aW5nIGNvbmRpdGlvbiBldmVudHMgcmVxdWlyZXMgdGhhdCB0aGUgY2FsbGVyIG93biB0aGUgbXV0ZXguICBNdXRleAotICogbG9jayBhbmQgdW5sb2NrIG9wZXJhdGlvbnMgY2FuIGJlIHBlcmZvcm1lZCBpbmRlcGVuZGVudGx5IG9mIGNvbmRpdGlvbgotICogZXZlbnRzLiAgVGhpcyBpcyBtb3JlIG9yIGxlc3MgYW5hbG9nb3VzIHRvIGphdmEubGFuZy5PYmplY3QgbXVsdGktdGhyZWFkCi0gKiBvcGVyYXRpb25zLgotICoKLSAqIE5vdGUgdGhlIE1vbml0b3IgY2FuIGNyZWF0ZSBhIG5ldywgaW50ZXJuYWwgbXV0ZXg7IGFsdGVybmF0aXZlbHksIGEKLSAqIHNlcGFyYXRlIE11dGV4IGNhbiBiZSBwYXNzZWQgaW4gYW5kIHRoZSBNb25pdG9yIHdpbGwgcmUtdXNlIGl0IHdpdGhvdXQKLSAqIHRha2luZyBvd25lcnNoaXAuICBJdCdzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoYXQgdGhlCi0gKiBNdXRleCBpcyBub3QgZGVhbGxvY2F0ZWQgYmVmb3JlIHRoZSBNb25pdG9yLgotICoKLSAqIE5vdGUgdGhhdCBhbGwgbWV0aG9kcyBhcmUgY29uc3QuICBNb25pdG9ycyBpbXBsZW1lbnQgbG9naWNhbCBjb25zdG5lc3MsIG5vdAotICogYml0IGNvbnN0bmVzcy4gIFRoaXMgYWxsb3dzIGNvbnN0IG1ldGhvZHMgdG8gY2FsbCBtb25pdG9yIG1ldGhvZHMgd2l0aG91dAotICogbmVlZGluZyB0byBjYXN0IGF3YXkgY29uc3RuZXNzIG9yIGNoYW5nZSB0byBub24tY29uc3Qgc2lnbmF0dXJlcy4KLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBNb25pdG9yIDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKLSBwdWJsaWM6Ci0gIC8qKiBDcmVhdGVzIGEgbmV3IG11dGV4LCBhbmQgdGFrZXMgb3duZXJzaGlwIG9mIGl0LiAqLwotICBNb25pdG9yKCk7Ci0KLSAgLyoqIFVzZXMgdGhlIHByb3ZpZGVkIG11dGV4IHdpdGhvdXQgdGFraW5nIG93bmVyc2hpcC4gKi8KLSAgZXhwbGljaXQgTW9uaXRvcihNdXRleCogbXV0ZXgpOwotCi0gIC8qKiBVc2VzIHRoZSBtdXRleCBpbnNpZGUgdGhlIHByb3ZpZGVkIE1vbml0b3Igd2l0aG91dCB0YWtpbmcgb3duZXJzaGlwLiAqLwotICBleHBsaWNpdCBNb25pdG9yKE1vbml0b3IqIG1vbml0b3IpOwotCi0gIC8qKiBEZWFsbG9jYXRlcyB0aGUgbXV0ZXggb25seSBpZiB3ZSBvd24gaXQuICovCi0gIHZpcnR1YWwgfk1vbml0b3IoKTsKLQotICBNdXRleCYgbXV0ZXgoKSBjb25zdDsKLQotICB2aXJ0dWFsIHZvaWQgbG9jaygpIGNvbnN0OwotCi0gIHZpcnR1YWwgdm9pZCB1bmxvY2soKSBjb25zdDsKLQotICB2aXJ0dWFsIHZvaWQgd2FpdChpbnQ2NF90IHRpbWVvdXQ9MExMKSBjb25zdDsKLQotICB2aXJ0dWFsIHZvaWQgbm90aWZ5KCkgY29uc3Q7Ci0KLSAgdmlydHVhbCB2b2lkIG5vdGlmeUFsbCgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLQotICBjbGFzcyBJbXBsOwotCi0gIEltcGwqIGltcGxfOwotfTsKLQotY2xhc3MgU3luY2hyb25pemVkIHsKLSBwdWJsaWM6Ci0gU3luY2hyb25pemVkKGNvbnN0IE1vbml0b3IqIG1vbml0b3IpIDogZyhtb25pdG9yLT5tdXRleCgpKSB7IH0KLSBTeW5jaHJvbml6ZWQoY29uc3QgTW9uaXRvciYgbW9uaXRvcikgOiBnKG1vbml0b3IubXV0ZXgoKSkgeyB9Ci0KLSBwcml2YXRlOgotICBHdWFyZCBnOwotfTsKLQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfTU9OSVRPUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvTXV0ZXguY3BwIGIvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvTXV0ZXguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDUyNDUyLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L011dGV4LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJNdXRleC5oIgotI2luY2x1ZGUgIlV0aWwuaCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotI2lmbmRlZiBUSFJJRlRfTk9fQ09OVEVOVElPTl9QUk9GSUxJTkcKLQotc3RhdGljIHNpZ19hdG9taWNfdCBtdXRleFByb2ZpbGluZ1NhbXBsZVJhdGUgPSAwOwotc3RhdGljIE11dGV4V2FpdENhbGxiYWNrIG11dGV4UHJvZmlsaW5nQ2FsbGJhY2sgPSAwOwotCi12b2xhdGlsZSBzdGF0aWMgc2lnX2F0b21pY190IG11dGV4UHJvZmlsaW5nQ291bnRlciA9IDA7Ci0KLXZvaWQgZW5hYmxlTXV0ZXhQcm9maWxpbmcoaW50MzJfdCBwcm9maWxpbmdTYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBNdXRleFdhaXRDYWxsYmFjayBjYWxsYmFjaykgewotICBtdXRleFByb2ZpbGluZ1NhbXBsZVJhdGUgPSBwcm9maWxpbmdTYW1wbGVSYXRlOwotICBtdXRleFByb2ZpbGluZ0NhbGxiYWNrID0gY2FsbGJhY2s7Ci19Ci0KLSNkZWZpbmUgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCkgXAotICAgIGludDY0X3QgX2xvY2tfc3RhcnRUaW1lID0gbWF5YmVHZXRQcm9maWxpbmdTdGFydFRpbWUoKTsKLQotI2RlZmluZSBQUk9GSUxFX01VVEVYX05PVF9MT0NLRUQoKSBcCi0gIGRvIHsgXAotICAgIGlmIChfbG9ja19zdGFydFRpbWUgPiAwKSB7IFwKLSAgICAgIGludDY0X3QgZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lVXNlYygpOyBcCi0gICAgICAoKm11dGV4UHJvZmlsaW5nQ2FsbGJhY2spKHRoaXMsIGVuZFRpbWUgLSBfbG9ja19zdGFydFRpbWUpOyBcCi0gICAgfSBcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgUFJPRklMRV9NVVRFWF9MT0NLRUQoKSBcCi0gIGRvIHsgXAotICAgIHByb2ZpbGVUaW1lXyA9IF9sb2NrX3N0YXJ0VGltZTsgXAotICAgIGlmIChwcm9maWxlVGltZV8gPiAwKSB7IFwKLSAgICAgIHByb2ZpbGVUaW1lXyA9IFV0aWw6OmN1cnJlbnRUaW1lVXNlYygpIC0gcHJvZmlsZVRpbWVfOyBcCi0gICAgfSBcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgUFJPRklMRV9NVVRFWF9TVEFSVF9VTkxPQ0soKSBcCi0gIGludDY0X3QgX3RlbXBfcHJvZmlsZVRpbWUgPSBwcm9maWxlVGltZV87IFwKLSAgcHJvZmlsZVRpbWVfID0gMDsKLQotI2RlZmluZSBQUk9GSUxFX01VVEVYX1VOTE9DS0VEKCkgXAotICBkbyB7IFwKLSAgICBpZiAoX3RlbXBfcHJvZmlsZVRpbWUgPiAwKSB7IFwKLSAgICAgICgqbXV0ZXhQcm9maWxpbmdDYWxsYmFjaykodGhpcywgX3RlbXBfcHJvZmlsZVRpbWUpOyBcCi0gICAgfSBcCi0gIH0gd2hpbGUgKDApCi0KLXN0YXRpYyBpbmxpbmUgaW50NjRfdCBtYXliZUdldFByb2ZpbGluZ1N0YXJ0VGltZSgpIHsKLSAgaWYgKG11dGV4UHJvZmlsaW5nU2FtcGxlUmF0ZSAmJiBtdXRleFByb2ZpbGluZ0NhbGxiYWNrKSB7Ci0gICAgLy8gVGhpcyBibG9jayBpcyB1bnN5bmNocm9uaXplZCwgYnV0IHNob3VsZCBwcm9kdWNlIGEgcmVhc29uYWJsZSBzYW1wbGluZwotICAgIC8vIHJhdGUgb24gbW9zdCBhcmNoaXRlY3R1cmVzLiAgVGhlIG1haW4gcmFjZSBjb25kaXRpb25zIGFyZSB0aGUgZ2FwCi0gICAgLy8gYmV0d2VlbiB0aGUgZGVjcmVtZW50IGFuZCB0aGUgdGVzdCwgdGhlIG5vbi1hdG9taWNpdHkgb2YgZGVjcmVtZW50LCBhbmQKLSAgICAvLyBwb3RlbnRpYWwgY2FjaGluZyBvZiBkaWZmZXJlbnQgdmFsdWVzIGF0IGRpZmZlcmVudCBDUFVzLgotICAgIC8vCi0gICAgLy8gLSBpZiB0d28gZGVjcmVtZW50cyByYWNlLCB0aGUgbGlrZWxpZXN0IHJlc3VsdCBpcyB0aGF0IHRoZSBjb3VudGVyCi0gICAgLy8gICAgICBkZWNyZW1lbnRzIHNsb3dseSAocGVyaGFwcyBtdWNoIG1vcmUgc2xvd2x5KSB0aGFuIGludGVuZGVkLgotICAgIC8vCi0gICAgLy8gLSBtYW55IHRocmVhZHMgY291bGQgcG90ZW50aWFsbHkgZGVjcmVtZW50IGJlZm9yZSByZXNldHRpbmcgdGhlIGNvdW50ZXIKLSAgICAvLyAgICAgIHRvIGl0cyBsYXJnZSB2YWx1ZSwgY2F1c2luZyBlYWNoIGFkZGl0aW9uYWwgaW5jb21pbmcgdGhyZWFkIHRvCi0gICAgLy8gICAgICBwcm9maWxlIGV2ZXJ5IGNhbGwuICBUaGlzIHNpdHVhdGlvbiBpcyB1bmxpa2VseSB0byBwZXJzaXN0IGZvciBsb25nCi0gICAgLy8gICAgICBhcyB0aGUgY3JpdGljYWwgZ2FwIGlzIHF1aXRlIHNob3J0LCBidXQgcHJvZmlsaW5nIGNvdWxkIGJlIGJ1cnN0eS4KLSAgICBzaWdfYXRvbWljX3QgbG9jYWxWYWx1ZSA9IC0tbXV0ZXhQcm9maWxpbmdDb3VudGVyOwotICAgIGlmIChsb2NhbFZhbHVlIDw9IDApIHsKLSAgICAgIG11dGV4UHJvZmlsaW5nQ291bnRlciA9IG11dGV4UHJvZmlsaW5nU2FtcGxlUmF0ZTsKLSAgICAgIHJldHVybiBVdGlsOjpjdXJyZW50VGltZVVzZWMoKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotI2Vsc2UKLSMgIGRlZmluZSBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKQotIyAgZGVmaW5lIFBST0ZJTEVfTVVURVhfTk9UX0xPQ0tFRCgpCi0jICBkZWZpbmUgUFJPRklMRV9NVVRFWF9MT0NLRUQoKQotIyAgZGVmaW5lIFBST0ZJTEVfTVVURVhfU1RBUlRfVU5MT0NLKCkKLSMgIGRlZmluZSBQUk9GSUxFX01VVEVYX1VOTE9DS0VEKCkKLSNlbmRpZiAvLyBUSFJJRlRfTk9fQ09OVEVOVElPTl9QUk9GSUxJTkcKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBNdXRleCBjbGFzcyB1c2luZyBQT1NJWCBtdXRleAotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIE11dGV4OjppbXBsIHsKLSBwdWJsaWM6Ci0gIGltcGwoSW5pdGlhbGl6ZXIgaW5pdCkgOiBpbml0aWFsaXplZF8oZmFsc2UpIHsKLSNpZm5kZWYgVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCi0gICAgcHJvZmlsZVRpbWVfID0gMDsKLSNlbmRpZgotICAgIGluaXQoJnB0aHJlYWRfbXV0ZXhfKTsKLSAgICBpbml0aWFsaXplZF8gPSB0cnVlOwotICB9Ci0KLSAgfmltcGwoKSB7Ci0gICAgaWYgKGluaXRpYWxpemVkXykgewotICAgICAgaW5pdGlhbGl6ZWRfID0gZmFsc2U7Ci0gICAgICBpbnQgcmV0ID0gcHRocmVhZF9tdXRleF9kZXN0cm95KCZwdGhyZWFkX211dGV4Xyk7Ci0gICAgICBhc3NlcnQocmV0ID09IDApOwotICAgIH0KLSAgfQotCi0gIHZvaWQgbG9jaygpIGNvbnN0IHsKLSAgICBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKTsKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJnB0aHJlYWRfbXV0ZXhfKTsKLSAgICBQUk9GSUxFX01VVEVYX0xPQ0tFRCgpOwotICB9Ci0KLSAgYm9vbCB0cnlsb2NrKCkgY29uc3QgeyByZXR1cm4gKDAgPT0gcHRocmVhZF9tdXRleF90cnlsb2NrKCZwdGhyZWFkX211dGV4XykpOyB9Ci0KLSAgYm9vbCB0aW1lZGxvY2soaW50NjRfdCBtaWxsaXNlY29uZHMpIGNvbnN0IHsKLSNpZiBkZWZpbmVkKF9QT1NJWF9USU1FT1VUUykgJiYgX1BPU0lYX1RJTUVPVVRTID49IDIwMDExMkwKLSAgICBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKTsKLQotICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKLSAgICBVdGlsOjp0b1RpbWVzcGVjKHRzLCBtaWxsaXNlY29uZHMpOwotICAgIGludCByZXQgPSBwdGhyZWFkX211dGV4X3RpbWVkbG9jaygmcHRocmVhZF9tdXRleF8sICZ0cyk7Ci0gICAgaWYgKHJldCA9PSAwKSB7Ci0gICAgICBQUk9GSUxFX01VVEVYX0xPQ0tFRCgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgUFJPRklMRV9NVVRFWF9OT1RfTE9DS0VEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotI2Vsc2UKLSAgICAvLyBJZiBwdGhyZWFkX211dGV4X3RpbWVkbG9jayBpc24ndCBzdXBwb3J0ZWQsIHRoZSBzYWZlc3QgdGhpbmcgdG8gZG8KLSAgICAvLyBpcyBqdXN0IGRvIGEgbm9uYmxvY2tpbmcgdHJ5bG9jay4KLSAgICByZXR1cm4gdHJ5bG9jaygpOwotI2VuZGlmCi0gIH0KLQotICB2b2lkIHVubG9jaygpIGNvbnN0IHsKLSAgICBQUk9GSUxFX01VVEVYX1NUQVJUX1VOTE9DSygpOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwdGhyZWFkX211dGV4Xyk7Ci0gICAgUFJPRklMRV9NVVRFWF9VTkxPQ0tFRCgpOwotICB9Ci0KLSAgdm9pZCogZ2V0VW5kZXJseWluZ0ltcGwoKSBjb25zdCB7IHJldHVybiAodm9pZCopICZwdGhyZWFkX211dGV4XzsgfQotCi0gcHJpdmF0ZToKLSAgbXV0YWJsZSBwdGhyZWFkX211dGV4X3QgcHRocmVhZF9tdXRleF87Ci0gIG11dGFibGUgYm9vbCBpbml0aWFsaXplZF87Ci0jaWZuZGVmIFRIUklGVF9OT19DT05URU5USU9OX1BST0ZJTElORwotICBtdXRhYmxlIGludDY0X3QgcHJvZmlsZVRpbWVfOwotI2VuZGlmCi19OwotCi1NdXRleDo6TXV0ZXgoSW5pdGlhbGl6ZXIgaW5pdCkgOiBpbXBsXyhuZXcgTXV0ZXg6OmltcGwoaW5pdCkpIHt9Ci0KLXZvaWQqIE11dGV4OjpnZXRVbmRlcmx5aW5nSW1wbCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5nZXRVbmRlcmx5aW5nSW1wbCgpOyB9Ci0KLXZvaWQgTXV0ZXg6OmxvY2soKSBjb25zdCB7IGltcGxfLT5sb2NrKCk7IH0KLQotYm9vbCBNdXRleDo6dHJ5bG9jaygpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT50cnlsb2NrKCk7IH0KLQotYm9vbCBNdXRleDo6dGltZWRsb2NrKGludDY0X3QgbXMpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT50aW1lZGxvY2sobXMpOyB9Ci0KLXZvaWQgTXV0ZXg6OnVubG9jaygpIGNvbnN0IHsgaW1wbF8tPnVubG9jaygpOyB9Ci0KLXZvaWQgTXV0ZXg6OkRFRkFVTFRfSU5JVElBTElaRVIodm9pZCogYXJnKSB7Ci0gIHB0aHJlYWRfbXV0ZXhfdCogcHRocmVhZF9tdXRleCA9IChwdGhyZWFkX211dGV4X3QqKWFyZzsKLSAgaW50IHJldCA9IHB0aHJlYWRfbXV0ZXhfaW5pdChwdGhyZWFkX211dGV4LCBOVUxMKTsKLSAgYXNzZXJ0KHJldCA9PSAwKTsKLX0KLQotI2lmIGRlZmluZWQoUFRIUkVBRF9BREFQVElWRV9NVVRFWF9JTklUSUFMSVpFUl9OUCkgfHwgZGVmaW5lZChQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUCkKLXN0YXRpYyB2b2lkIGluaXRfd2l0aF9raW5kKHB0aHJlYWRfbXV0ZXhfdCogbXV0ZXgsIGludCBraW5kKSB7Ci0gIHB0aHJlYWRfbXV0ZXhhdHRyX3QgbXV0ZXhhdHRyOwotICBpbnQgcmV0ID0gcHRocmVhZF9tdXRleGF0dHJfaW5pdCgmbXV0ZXhhdHRyKTsKLSAgYXNzZXJ0KHJldCA9PSAwKTsKLQotICAvLyBBcHBhcmVudGx5LCB0aGlzIGNhbiBmYWlsLiAgU2hvdWxkIHdlIHJlYWxseSBiZSBhYm9ydGluZz8KLSAgcmV0ID0gcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSgmbXV0ZXhhdHRyLCBraW5kKTsKLSAgYXNzZXJ0KHJldCA9PSAwKTsKLQotICByZXQgPSBwdGhyZWFkX211dGV4X2luaXQobXV0ZXgsICZtdXRleGF0dHIpOwotICBhc3NlcnQocmV0ID09IDApOwotCi0gIHJldCA9IHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3koJm11dGV4YXR0cik7Ci0gIGFzc2VydChyZXQgPT0gMCk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBUSFJFQURfQURBUFRJVkVfTVVURVhfSU5JVElBTElaRVJfTlAKLXZvaWQgTXV0ZXg6OkFEQVBUSVZFX0lOSVRJQUxJWkVSKHZvaWQqIGFyZykgewotICAvLyBGcm9tIG15c3FsIHNvdXJjZTogbXlzeXMvbXlfdGhyX2luaXQuYwotICAvLyBTZXQgbXV0ZXggdHlwZSB0byAiZmFzdCIgYS5rLmEgImFkYXB0aXZlIgotICAvLwotICAvLyBJbiB0aGlzIGNhc2UgdGhlIHRocmVhZCBtYXkgc3RlYWwgdGhlIG11dGV4IGZyb20gc29tZSBvdGhlciB0aHJlYWQKLSAgLy8gdGhhdCBpcyB3YWl0aW5nIGZvciB0aGUgc2FtZSBtdXRleC4gVGhpcyB3aWxsIHNhdmUgdXMgc29tZQotICAvLyBjb250ZXh0IHN3aXRjaGVzIGJ1dCBtYXkgY2F1c2UgYSB0aHJlYWQgdG8gJ3N0YXJ2ZSBmb3JldmVyJyB3aGlsZQotICAvLyB3YWl0aW5nIGZvciB0aGUgbXV0ZXggKG5vdCBsaWtlbHkgaWYgdGhlIGNvZGUgd2l0aGluIHRoZSBtdXRleCBpcwotICAvLyBzaG9ydCkuCi0gIGluaXRfd2l0aF9raW5kKChwdGhyZWFkX211dGV4X3QqKWFyZywgUFRIUkVBRF9NVVRFWF9BREFQVElWRV9OUCk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QCi12b2lkIE11dGV4OjpSRUNVUlNJVkVfSU5JVElBTElaRVIodm9pZCogYXJnKSB7Ci0gIGluaXRfd2l0aF9raW5kKChwdGhyZWFkX211dGV4X3QqKWFyZywgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlApOwotfQotI2VuZGlmCi0KLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBSZWFkV3JpdGVNdXRleCBjbGFzcyB1c2luZyBQT1NJWCBydyBsb2NrCi0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgUmVhZFdyaXRlTXV0ZXg6OmltcGwgewotcHVibGljOgotICBpbXBsKCkgOiBpbml0aWFsaXplZF8oZmFsc2UpIHsKLSNpZm5kZWYgVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCi0gICAgcHJvZmlsZVRpbWVfID0gMDsKLSNlbmRpZgotICAgIGludCByZXQgPSBwdGhyZWFkX3J3bG9ja19pbml0KCZyd19sb2NrXywgTlVMTCk7Ci0gICAgYXNzZXJ0KHJldCA9PSAwKTsKLSAgICBpbml0aWFsaXplZF8gPSB0cnVlOwotICB9Ci0KLSAgfmltcGwoKSB7Ci0gICAgaWYoaW5pdGlhbGl6ZWRfKSB7Ci0gICAgICBpbml0aWFsaXplZF8gPSBmYWxzZTsKLSAgICAgIGludCByZXQgPSBwdGhyZWFkX3J3bG9ja19kZXN0cm95KCZyd19sb2NrXyk7Ci0gICAgICBhc3NlcnQocmV0ID09IDApOwotICAgIH0KLSAgfQotCi0gIHZvaWQgYWNxdWlyZVJlYWQoKSBjb25zdCB7Ci0gICAgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCk7Ci0gICAgcHRocmVhZF9yd2xvY2tfcmRsb2NrKCZyd19sb2NrXyk7Ci0gICAgUFJPRklMRV9NVVRFWF9OT1RfTE9DS0VEKCk7ICAvLyBub3QgZXhjbHVzaXZlLCBzbyB1c2Ugbm90LWxvY2tlZCBwYXRoCi0gIH0KLQotICB2b2lkIGFjcXVpcmVXcml0ZSgpIGNvbnN0IHsKLSAgICBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKTsKLSAgICBwdGhyZWFkX3J3bG9ja193cmxvY2soJnJ3X2xvY2tfKTsKLSAgICBQUk9GSUxFX01VVEVYX0xPQ0tFRCgpOwotICB9Ci0KLSAgYm9vbCBhdHRlbXB0UmVhZCgpIGNvbnN0IHsgcmV0dXJuIHB0aHJlYWRfcndsb2NrX3RyeXJkbG9jaygmcndfbG9ja18pOyB9Ci0KLSAgYm9vbCBhdHRlbXB0V3JpdGUoKSBjb25zdCB7IHJldHVybiBwdGhyZWFkX3J3bG9ja190cnl3cmxvY2soJnJ3X2xvY2tfKTsgfQotCi0gIHZvaWQgcmVsZWFzZSgpIGNvbnN0IHsKLSAgICBQUk9GSUxFX01VVEVYX1NUQVJUX1VOTE9DSygpOwotICAgIHB0aHJlYWRfcndsb2NrX3VubG9jaygmcndfbG9ja18pOwotICAgIFBST0ZJTEVfTVVURVhfVU5MT0NLRUQoKTsKLSAgfQotCi1wcml2YXRlOgotICBtdXRhYmxlIHB0aHJlYWRfcndsb2NrX3QgcndfbG9ja187Ci0gIG11dGFibGUgYm9vbCBpbml0aWFsaXplZF87Ci0jaWZuZGVmIFRIUklGVF9OT19DT05URU5USU9OX1BST0ZJTElORwotICBtdXRhYmxlIGludDY0X3QgcHJvZmlsZVRpbWVfOwotI2VuZGlmCi19OwotCi1SZWFkV3JpdGVNdXRleDo6UmVhZFdyaXRlTXV0ZXgoKSA6IGltcGxfKG5ldyBSZWFkV3JpdGVNdXRleDo6aW1wbCgpKSB7fQotCi12b2lkIFJlYWRXcml0ZU11dGV4OjphY3F1aXJlUmVhZCgpIGNvbnN0IHsgaW1wbF8tPmFjcXVpcmVSZWFkKCk7IH0KLQotdm9pZCBSZWFkV3JpdGVNdXRleDo6YWNxdWlyZVdyaXRlKCkgY29uc3QgeyBpbXBsXy0+YWNxdWlyZVdyaXRlKCk7IH0KLQotYm9vbCBSZWFkV3JpdGVNdXRleDo6YXR0ZW1wdFJlYWQoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+YXR0ZW1wdFJlYWQoKTsgfQotCi1ib29sIFJlYWRXcml0ZU11dGV4OjphdHRlbXB0V3JpdGUoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+YXR0ZW1wdFdyaXRlKCk7IH0KLQotdm9pZCBSZWFkV3JpdGVNdXRleDo6cmVsZWFzZSgpIGNvbnN0IHsgaW1wbF8tPnJlbGVhc2UoKTsgfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ci0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L011dGV4LmggYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9NdXRleC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWU1YzZiLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L011dGV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfTVVURVhfSF8KLSNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9NVVRFWF9IXyAxCi0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi0jaWZuZGVmIFRIUklGVF9OT19DT05URU5USU9OX1BST0ZJTElORwotCi0vKioKLSAqIERldGVybWluZXMgaWYgdGhlIFRocmlmdCBNdXRleCBhbmQgUmVhZFdyaXRlTXV0ZXggY2xhc3NlcyB3aWxsIGF0dGVtcHQgdG8KLSAqIHByb2ZpbGUgdGhlaXIgYmxvY2tpbmcgYWNxdWlyZSBtZXRob2RzLiBJZiB0aGlzIHZhbHVlIGlzIHNldCB0byBub24temVybywKLSAqIFRocmlmdCB3aWxsIGF0dGVtcHQgdG8gaW52b2tlIHRoZSBjYWxsYmFjayBvbmNlIGV2ZXJ5IHByb2ZpbGluZ1NhbXBsZVJhdGUKLSAqIHRpbWVzLiAgSG93ZXZlciwgYXMgdGhlIHNhbXBsaW5nIGlzIG5vdCBzeW5jaHJvbml6ZWQgdGhlIHJhdGUgaXMgbm90Ci0gKiBndXJhbmF0ZWVkLCBhbmQgY291bGQgYmUgc3ViamVjdCB0byBiaWcgYnVyc3RzIGFuZCBzd2luZ3MuICBQbGVhc2UgZW5zdXJlCi0gKiB5b3VyIHNhbXBsaW5nIGNhbGxiYWNrIGlzIGFzIHBlcmZvcm1hbnQgYXMgeW91ciBhcHBsaWNhdGlvbiByZXF1aXJlcy4KLSAqCi0gKiBUaGUgY2FsbGJhY2sgd2lsbCBnZXQgY2FsbGVkIHdpdGggdGhlIHdhaXQgdGltZSB0YWtlbiB0byBsb2NrIHRoZSBtdXRleCBpbgotICogdXNlYyBhbmQgYSAodm9pZCopIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgTXV0ZXggKG9yIFJlYWRXcml0ZU11dGV4KQotICogYmVpbmcgbG9ja2VkLgotICoKLSAqIFRoZSBlbmFibGVNdXRleFByb2ZpbGluZygpIGZ1bmN0aW9uIGlzIHVuc3luY2hyb25pemVkOyBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KLSAqIHdoaWxlIHByb2ZpbGluZyBpcyBhbHJlYWR5IGVuYWJsZWQgbWF5IHJlc3VsdCBpbiByYWNlIGNvbmRpdGlvbnMuICBPbgotICogYXJjaGl0ZWN0dXJlcyB3aGVyZSBhIHBvaW50ZXIgYXNzaWdubWVudCBpcyBhdG9taWMsIHRoaXMgaXMgc2FmZSBidXQgdGhlcmUKLSAqIGlzIG5vIGd1YXJhbnRlZSB0aHJlYWRzIHdpbGwgYWdyZWUgb24gYSBzaW5nbGUgY2FsbGJhY2sgd2l0aGluIGFueQotICogcGFydGljdWxhciB0aW1lIHBlcmlvZC4KLSAqLwotdHlwZWRlZiB2b2lkICgqTXV0ZXhXYWl0Q2FsbGJhY2spKGNvbnN0IHZvaWQqIGlkLCBpbnQ2NF90IHdhaXRUaW1lTWljcm9zKTsKLXZvaWQgZW5hYmxlTXV0ZXhQcm9maWxpbmcoaW50MzJfdCBwcm9maWxpbmdTYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBNdXRleFdhaXRDYWxsYmFjayBjYWxsYmFjayk7Ci0KLSNlbmRpZgotCi0vKioKLSAqIEEgc2ltcGxlIG11dGV4IGNsYXNzCi0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgTXV0ZXggewotIHB1YmxpYzoKLSAgdHlwZWRlZiB2b2lkICgqSW5pdGlhbGl6ZXIpKHZvaWQqKTsKLQotICBNdXRleChJbml0aWFsaXplciBpbml0ID0gREVGQVVMVF9JTklUSUFMSVpFUik7Ci0gIHZpcnR1YWwgfk11dGV4KCkge30KLSAgdmlydHVhbCB2b2lkIGxvY2soKSBjb25zdDsKLSAgdmlydHVhbCBib29sIHRyeWxvY2soKSBjb25zdDsKLSAgdmlydHVhbCBib29sIHRpbWVkbG9jayhpbnQ2NF90IG1pbGxpc2Vjb25kcykgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCB1bmxvY2soKSBjb25zdDsKLQotICB2b2lkKiBnZXRVbmRlcmx5aW5nSW1wbCgpIGNvbnN0OwotCi0gIHN0YXRpYyB2b2lkIERFRkFVTFRfSU5JVElBTElaRVIodm9pZCopOwotICBzdGF0aWMgdm9pZCBBREFQVElWRV9JTklUSUFMSVpFUih2b2lkKik7Ci0gIHN0YXRpYyB2b2lkIFJFQ1VSU0lWRV9JTklUSUFMSVpFUih2b2lkKik7Ci0KLSBwcml2YXRlOgotCi0gIGNsYXNzIGltcGw7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGltcGw+IGltcGxfOwotfTsKLQotY2xhc3MgUmVhZFdyaXRlTXV0ZXggewotcHVibGljOgotICBSZWFkV3JpdGVNdXRleCgpOwotICB2aXJ0dWFsIH5SZWFkV3JpdGVNdXRleCgpIHt9Ci0KLSAgLy8gdGhlc2UgZ2V0IHRoZSBsb2NrIGFuZCBibG9jayB1bnRpbCBpdCBpcyBkb25lIHN1Y2Nlc3NmdWxseQotICB2aXJ0dWFsIHZvaWQgYWNxdWlyZVJlYWQoKSBjb25zdDsKLSAgdmlydHVhbCB2b2lkIGFjcXVpcmVXcml0ZSgpIGNvbnN0OwotCi0gIC8vIHRoZXNlIGF0dGVtcHQgdG8gZ2V0IHRoZSBsb2NrLCByZXR1cm5pbmcgZmFsc2UgaW1tZWRpYXRlbHkgaWYgdGhleSBmYWlsCi0gIHZpcnR1YWwgYm9vbCBhdHRlbXB0UmVhZCgpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgYXR0ZW1wdFdyaXRlKCkgY29uc3Q7Ci0KLSAgLy8gdGhpcyByZWxlYXNlcyBib3RoIHJlYWQgYW5kIHdyaXRlIGxvY2tzCi0gIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0KLSAgY2xhc3MgaW1wbDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8aW1wbD4gaW1wbF87Ci19OwotCi1jbGFzcyBHdWFyZCB7Ci0gcHVibGljOgotICBHdWFyZChjb25zdCBNdXRleCYgdmFsdWUsIGludDY0X3QgdGltZW91dCA9IDApIDogbXV0ZXhfKCZ2YWx1ZSkgewotICAgIGlmICh0aW1lb3V0ID09IDApIHsKLSAgICAgIHZhbHVlLmxvY2soKTsKLSAgICB9IGVsc2UgaWYgKHRpbWVvdXQgPCAwKSB7Ci0gICAgICBpZiAoIXZhbHVlLnRyeWxvY2soKSkgewotICAgICAgICBtdXRleF8gPSBOVUxMOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoIXZhbHVlLnRpbWVkbG9jayh0aW1lb3V0KSkgewotICAgICAgICBtdXRleF8gPSBOVUxMOwotICAgICAgfQotICAgIH0KLSAgfQotICB+R3VhcmQoKSB7Ci0gICAgaWYgKG11dGV4XykgewotICAgICAgbXV0ZXhfLT51bmxvY2soKTsKLSAgICB9Ci0gIH0KLQotICBvcGVyYXRvciBib29sKCkgY29uc3QgewotICAgIHJldHVybiAobXV0ZXhfICE9IE5VTEwpOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBNdXRleCogbXV0ZXhfOwotfTsKLQotLy8gQ2FuIGJlIHVzZWQgYXMgc2Vjb25kIGFyZ3VtZW50IHRvIFJXR3VhcmQgdG8gbWFrZSBjb2RlIG1vcmUgcmVhZGFibGUKLS8vIGFzIHRvIHdoZXRoZXIgd2UncmUgZG9pbmcgYWNxdWlyZVJlYWQoKSBvciBhY3F1aXJlV3JpdGUoKS4KLWVudW0gUldHdWFyZFR5cGUgewotICBSV19SRUFEID0gMCwKLSAgUldfV1JJVEUgPSAxCi19OwotCi0KLWNsYXNzIFJXR3VhcmQgewotICBwdWJsaWM6Ci0gICAgUldHdWFyZChjb25zdCBSZWFkV3JpdGVNdXRleCYgdmFsdWUsIGJvb2wgd3JpdGUgPSBmYWxzZSkKLSAgICAgICAgIDogcndfbXV0ZXhfKHZhbHVlKSB7Ci0gICAgICBpZiAod3JpdGUpIHsKLSAgICAgICAgcndfbXV0ZXhfLmFjcXVpcmVXcml0ZSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcndfbXV0ZXhfLmFjcXVpcmVSZWFkKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgUldHdWFyZChjb25zdCBSZWFkV3JpdGVNdXRleCYgdmFsdWUsIFJXR3VhcmRUeXBlIHR5cGUpCi0gICAgICAgICA6IHJ3X211dGV4Xyh2YWx1ZSkgewotICAgICAgaWYgKHR5cGUgPT0gUldfV1JJVEUpIHsKLSAgICAgICAgcndfbXV0ZXhfLmFjcXVpcmVXcml0ZSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcndfbXV0ZXhfLmFjcXVpcmVSZWFkKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIH5SV0d1YXJkKCkgewotICAgICAgcndfbXV0ZXhfLnJlbGVhc2UoKTsKLSAgICB9Ci0gIHByaXZhdGU6Ci0gICAgY29uc3QgUmVhZFdyaXRlTXV0ZXgmIHJ3X211dGV4XzsKLX07Ci0KLQotLy8gQSBsaXR0bGUgaGFjayB0byBwcmV2ZW50IHNvbWVvbmUgZnJvbSB0cnlpbmcgdG8gZG8gIkd1YXJkKG0pOyIKLS8vIFN1Y2ggYSB1c2UgaXMgaW52YWxpZCBiZWNhdXNlIHRoZSB0ZW1wb3JhcnkgR3VhcmQgb2JqZWN0IGlzCi0vLyBkZXN0b3J5ZWQgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSwgcmVsZWFzaW5nIHRoZSBsb2NrLgotLy8gU29ycnkgZm9yIHBvbGx1dGluZyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgYnV0IEkgdGhpbmsgaXQncyB3b3J0aCBpdC4KLSNkZWZpbmUgR3VhcmQobSkgaW5jb3JyZWN0X3VzZV9vZl9HdWFyZChtKQotI2RlZmluZSBSV0d1YXJkKG0pIGluY29ycmVjdF91c2Vfb2ZfUldHdWFyZChtKQotCi0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9NVVRFWF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmNwcCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MjI4OGMuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJQb3NpeFRocmVhZEZhY3RvcnkuaCIKLSNpbmNsdWRlICJFeGNlcHRpb24uaCIKLQotI2lmIEdPT0dMRV9QRVJGVE9PTFNfUkVHSVNURVJfVEhSRUFECi0jICBpbmNsdWRlIDxnb29nbGUvcHJvZmlsZXIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlIDxib29zdC93ZWFrX3B0ci5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBib29zdDo6d2Vha19wdHI7Ci0KLS8qKgotICogVGhlIFBPU0lYIHRocmVhZCBjbGFzcy4KLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBQdGhyZWFkVGhyZWFkOiBwdWJsaWMgVGhyZWFkIHsKLSBwdWJsaWM6Ci0KLSAgZW51bSBTVEFURSB7Ci0gICAgdW5pbml0aWFsaXplZCwKLSAgICBzdGFydGluZywKLSAgICBzdGFydGVkLAotICAgIHN0b3BwaW5nLAotICAgIHN0b3BwZWQKLSAgfTsKLQotICBzdGF0aWMgY29uc3QgaW50IE1CID0gMTAyNCAqIDEwMjQ7Ci0KLSAgc3RhdGljIHZvaWQqIHRocmVhZE1haW4odm9pZCogYXJnKTsKLQotIHByaXZhdGU6Ci0gIHB0aHJlYWRfdCBwdGhyZWFkXzsKLSAgU1RBVEUgc3RhdGVfOwotICBpbnQgcG9saWN5XzsKLSAgaW50IHByaW9yaXR5XzsKLSAgaW50IHN0YWNrU2l6ZV87Ci0gIHdlYWtfcHRyPFB0aHJlYWRUaHJlYWQ+IHNlbGZfOwotICBib29sIGRldGFjaGVkXzsKLQotIHB1YmxpYzoKLQotICBQdGhyZWFkVGhyZWFkKGludCBwb2xpY3ksIGludCBwcmlvcml0eSwgaW50IHN0YWNrU2l6ZSwgYm9vbCBkZXRhY2hlZCwgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIDoKLSAgICBwdGhyZWFkXygwKSwKLSAgICBzdGF0ZV8odW5pbml0aWFsaXplZCksCi0gICAgcG9saWN5Xyhwb2xpY3kpLAotICAgIHByaW9yaXR5Xyhwcmlvcml0eSksCi0gICAgc3RhY2tTaXplXyhzdGFja1NpemUpLAotICAgIGRldGFjaGVkXyhkZXRhY2hlZCkgewotCi0gICAgdGhpcy0+VGhyZWFkOjpydW5uYWJsZShydW5uYWJsZSk7Ci0gIH0KLQotICB+UHRocmVhZFRocmVhZCgpIHsKLSAgICAvKiBOb3RoaW5nIHJlZmVyZW5jZXMgdGhpcyB0aHJlYWQsIGlmIGlzIGlzIG5vdCBkZXRhY2hlZCwgZG8gYSBqb2luCi0gICAgICAgbm93LCBvdGhlcndpc2UgdGhlIHRocmVhZC1pZCBhbmQsIHBvc3NpYmx5LCBvdGhlciByZXNvdXJjZXMgd2lsbAotICAgICAgIGJlIGxlYWtlZC4gKi8KLSAgICBpZighZGV0YWNoZWRfKSB7Ci0gICAgICB0cnkgewotICAgICAgICBqb2luKCk7Ci0gICAgICB9IGNhdGNoKC4uLikgewotICAgICAgICAvLyBXZSdyZSByZWFsbHkgaG9zZWQuCi0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBzdGFydCgpIHsKLSAgICBpZiAoc3RhdGVfICE9IHVuaW5pdGlhbGl6ZWQpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwdGhyZWFkX2F0dHJfdCB0aHJlYWRfYXR0cjsKLSAgICBpZiAocHRocmVhZF9hdHRyX2luaXQoJnRocmVhZF9hdHRyKSAhPSAwKSB7Ci0gICAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2F0dHJfaW5pdCBmYWlsZWQiKTsKLSAgICB9Ci0KLSAgICBpZihwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJnRocmVhZF9hdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhY2hlZF8gPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFKSAhPSAwKSB7Ci0gICAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUgZmFpbGVkIik7Ci0gICAgfQotCi0gICAgLy8gU2V0IHRocmVhZCBzdGFjayBzaXplCi0gICAgaWYgKHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoJnRocmVhZF9hdHRyLCBNQiAqIHN0YWNrU2l6ZV8pICE9IDApIHsKLSAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplIGZhaWxlZCIpOwotICAgIH0KLQotICAgIC8vIFNldCB0aHJlYWQgcG9saWN5Ci0gICAgaWYgKHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSgmdGhyZWFkX2F0dHIsIHBvbGljeV8pICE9IDApIHsKLSAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3kgZmFpbGVkIik7Ci0gICAgfQotCi0gICAgc3RydWN0IHNjaGVkX3BhcmFtIHNjaGVkX3BhcmFtOwotICAgIHNjaGVkX3BhcmFtLnNjaGVkX3ByaW9yaXR5ID0gcHJpb3JpdHlfOwotCi0gICAgLy8gU2V0IHRocmVhZCBwcmlvcml0eQotICAgIGlmIChwdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbSgmdGhyZWFkX2F0dHIsICZzY2hlZF9wYXJhbSkgIT0gMCkgewotICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtIGZhaWxlZCIpOwotICAgIH0KLQotICAgIC8vIENyZWF0ZSByZWZlcmVuY2UKLSAgICBzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+KiBzZWxmUmVmID0gbmV3IHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4oKTsKLSAgICAqc2VsZlJlZiA9IHNlbGZfLmxvY2soKTsKLQotICAgIHN0YXRlXyA9IHN0YXJ0aW5nOwotCi0gICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZwdGhyZWFkXywgJnRocmVhZF9hdHRyLCB0aHJlYWRNYWluLCAodm9pZCopc2VsZlJlZikgIT0gMCkgewotICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfY3JlYXRlIGZhaWxlZCIpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgam9pbigpIHsKLSAgICBpZiAoIWRldGFjaGVkXyAmJiBzdGF0ZV8gIT0gdW5pbml0aWFsaXplZCkgewotICAgICAgdm9pZCogaWdub3JlOwotICAgICAgLyogWFhYCi0gICAgICAgICBJZiBqb2luIGZhaWxzIGl0IGlzIG1vc3QgbGlrZWx5IGR1ZSB0byB0aGUgZmFjdAotICAgICAgICAgdGhhdCB0aGUgbGFzdCByZWZlcmVuY2Ugd2FzIHRoZSB0aHJlYWQgaXRzZWxmIGFuZCBjYW5ub3QKLSAgICAgICAgIGpvaW4uICBUaGlzIHJlc3VsdHMgaW4gbGVha2VkIHRocmVhZHMgYW5kIHdpbGwgZXZlbnR1YWxseQotICAgICAgICAgY2F1c2UgdGhlIHByb2Nlc3MgdG8gcnVuIG91dCBvZiB0aHJlYWQgcmVzb3VyY2VzLgotICAgICAgICAgV2UncmUgYmV5b25kIHRoZSBwb2ludCBvZiB0aHJvd2luZyBhbiBleGNlcHRpb24uICBOb3QgY2xlYXIgaG93Ci0gICAgICAgICBiZXN0IHRvIGhhbmRsZSB0aGlzLiAqLwotICAgICAgZGV0YWNoZWRfID0gcHRocmVhZF9qb2luKHB0aHJlYWRfLCAmaWdub3JlKSA9PSAwOwotICAgIH0KLSAgfQotCi0gIFRocmVhZDo6aWRfdCBnZXRJZCgpIHsKLSAgICByZXR1cm4gKFRocmVhZDo6aWRfdClwdGhyZWFkXzsKLSAgfQotCi0gIHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKCkgY29uc3QgeyByZXR1cm4gVGhyZWFkOjpydW5uYWJsZSgpOyB9Ci0KLSAgdm9pZCBydW5uYWJsZShzaGFyZWRfcHRyPFJ1bm5hYmxlPiB2YWx1ZSkgeyBUaHJlYWQ6OnJ1bm5hYmxlKHZhbHVlKTsgfQotCi0gIHZvaWQgd2Vha1JlZihzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+IHNlbGYpIHsKLSAgICBhc3NlcnQoc2VsZi5nZXQoKSA9PSB0aGlzKTsKLSAgICBzZWxmXyA9IHdlYWtfcHRyPFB0aHJlYWRUaHJlYWQ+KHNlbGYpOwotICB9Ci19OwotCi12b2lkKiBQdGhyZWFkVGhyZWFkOjp0aHJlYWRNYWluKHZvaWQqIGFyZykgewotICBzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+IHRocmVhZCA9ICooc2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiopYXJnOwotICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+Kj4oYXJnKTsKLQotICBpZiAodGhyZWFkID09IE5VTEwpIHsKLSAgICByZXR1cm4gKHZvaWQqKTA7Ci0gIH0KLQotICBpZiAodGhyZWFkLT5zdGF0ZV8gIT0gc3RhcnRpbmcpIHsKLSAgICByZXR1cm4gKHZvaWQqKTA7Ci0gIH0KLQotI2lmIEdPT0dMRV9QRVJGVE9PTFNfUkVHSVNURVJfVEhSRUFECi0gIFByb2ZpbGVyUmVnaXN0ZXJUaHJlYWQoKTsKLSNlbmRpZgotCi0gIHRocmVhZC0+c3RhdGVfID0gc3RhcnRpbmc7Ci0gIHRocmVhZC0+cnVubmFibGUoKS0+cnVuKCk7Ci0gIGlmICh0aHJlYWQtPnN0YXRlXyAhPSBzdG9wcGluZyAmJiB0aHJlYWQtPnN0YXRlXyAhPSBzdG9wcGVkKSB7Ci0gICAgdGhyZWFkLT5zdGF0ZV8gPSBzdG9wcGluZzsKLSAgfQotCi0gIHJldHVybiAodm9pZCopMDsKLX0KLQotLyoqCi0gKiBQT1NJWCBUaHJlYWQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgotICovCi1jbGFzcyBQb3NpeFRocmVhZEZhY3Rvcnk6OkltcGwgewotCi0gcHJpdmF0ZToKLSAgUE9MSUNZIHBvbGljeV87Ci0gIFBSSU9SSVRZIHByaW9yaXR5XzsKLSAgaW50IHN0YWNrU2l6ZV87Ci0gIGJvb2wgZGV0YWNoZWRfOwotCi0gIC8qKgotICAgKiBDb252ZXJ0cyBnZW5lcmljIHBvc2l4IHRocmVhZCBzY2hlZHVsZSBwb2xpY3kgZW51bXMgaW50byBwdGhyZWFkCi0gICAqIEFQSSB2YWx1ZXMuCi0gICAqLwotICBzdGF0aWMgaW50IHRvUHRocmVhZFBvbGljeShQT0xJQ1kgcG9saWN5KSB7Ci0gICAgc3dpdGNoIChwb2xpY3kpIHsKLSAgICBjYXNlIE9USEVSOgotICAgICAgcmV0dXJuIFNDSEVEX09USEVSOwotICAgIGNhc2UgRklGTzoKLSAgICAgIHJldHVybiBTQ0hFRF9GSUZPOwotICAgIGNhc2UgUk9VTkRfUk9CSU46Ci0gICAgICByZXR1cm4gU0NIRURfUlI7Ci0gICAgfQotICAgIHJldHVybiBTQ0hFRF9PVEhFUjsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZXJ0cyByZWxhdGl2ZSB0aHJlYWQgcHJpb3JpdGllcyB0byBhYnNvbHV0ZSB2YWx1ZSBiYXNlZCBvbiBwb3NpeAotICAgKiB0aHJlYWQgc2NoZWR1bGVyIHBvbGljeQotICAgKgotICAgKiAgVGhlIGlkZWEgaXMgc2ltcGx5IHRvIGRpdmlkZSB1cCB0aGUgcHJpb3JpdHkgcmFuZ2UgZm9yIHRoZSBnaXZlbiBwb2xpY3kKLSAgICogaW50byB0aGUgY29ycmVwc29uZGluZyByZWxhdGl2ZSBwcmlvcml0eSBsZXZlbCAobG93ZXN0Li5oaWdoZXN0KSBhbmQKLSAgICogdGhlbiBwcm8tcmF0ZSBhY2NvcmRpbmdseS4KLSAgICovCi0gIHN0YXRpYyBpbnQgdG9QdGhyZWFkUHJpb3JpdHkoUE9MSUNZIHBvbGljeSwgUFJJT1JJVFkgcHJpb3JpdHkpIHsKLSAgICBpbnQgcHRocmVhZF9wb2xpY3kgPSB0b1B0aHJlYWRQb2xpY3kocG9saWN5KTsKLSAgICBpbnQgbWluX3ByaW9yaXR5ID0gMDsKLSAgICBpbnQgbWF4X3ByaW9yaXR5ID0gMDsKLSNpZmRlZiBIQVZFX1NDSEVEX0dFVF9QUklPUklUWV9NSU4KLSAgICBtaW5fcHJpb3JpdHkgPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWluKHB0aHJlYWRfcG9saWN5KTsKLSNlbmRpZgotI2lmZGVmIEhBVkVfU0NIRURfR0VUX1BSSU9SSVRZX01BWAotICAgIG1heF9wcmlvcml0eSA9IHNjaGVkX2dldF9wcmlvcml0eV9tYXgocHRocmVhZF9wb2xpY3kpOwotI2VuZGlmCi0gICAgaW50IHF1YW50YSA9IChISUdIRVNUIC0gTE9XRVNUKSArIDE7Ci0gICAgZmxvYXQgc3RlcHNwZXJxdWFudGEgPSAobWF4X3ByaW9yaXR5IC0gbWluX3ByaW9yaXR5KSAvIHF1YW50YTsKLQotICAgIGlmIChwcmlvcml0eSA8PSBISUdIRVNUKSB7Ci0gICAgICByZXR1cm4gKGludCkobWluX3ByaW9yaXR5ICsgc3RlcHNwZXJxdWFudGEgKiBwcmlvcml0eSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIHNob3VsZCBuZXZlciBnZXQgaGVyZSBmb3IgcHJpb3JpdHkgaW5jcmVtZW50cy4KLSAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICByZXR1cm4gKGludCkobWluX3ByaW9yaXR5ICsgc3RlcHNwZXJxdWFudGEgKiBOT1JNQUwpOwotICAgIH0KLSAgfQotCi0gcHVibGljOgotCi0gIEltcGwoUE9MSUNZIHBvbGljeSwgUFJJT1JJVFkgcHJpb3JpdHksIGludCBzdGFja1NpemUsIGJvb2wgZGV0YWNoZWQpIDoKLSAgICBwb2xpY3lfKHBvbGljeSksCi0gICAgcHJpb3JpdHlfKHByaW9yaXR5KSwKLSAgICBzdGFja1NpemVfKHN0YWNrU2l6ZSksCi0gICAgZGV0YWNoZWRfKGRldGFjaGVkKSB7fQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IFBPU0lYIHRocmVhZCB0byBydW4gdGhlIHJ1bm5hYmxlIG9iamVjdAotICAgKgotICAgKiBAcGFyYW0gcnVubmFibGUgQSBydW5uYWJsZSBvYmplY3QKLSAgICovCi0gIHNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0IHsKLSAgICBzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+IHJlc3VsdCA9IHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4obmV3IFB0aHJlYWRUaHJlYWQodG9QdGhyZWFkUG9saWN5KHBvbGljeV8pLCB0b1B0aHJlYWRQcmlvcml0eShwb2xpY3lfLCBwcmlvcml0eV8pLCBzdGFja1NpemVfLCBkZXRhY2hlZF8sIHJ1bm5hYmxlKSk7Ci0gICAgcmVzdWx0LT53ZWFrUmVmKHJlc3VsdCk7Ci0gICAgcnVubmFibGUtPnRocmVhZChyZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBpbnQgZ2V0U3RhY2tTaXplKCkgY29uc3QgeyByZXR1cm4gc3RhY2tTaXplXzsgfQotCi0gIHZvaWQgc2V0U3RhY2tTaXplKGludCB2YWx1ZSkgeyBzdGFja1NpemVfID0gdmFsdWU7IH0KLQotICBQUklPUklUWSBnZXRQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIHByaW9yaXR5XzsgfQotCi0gIC8qKgotICAgKiBTZXRzIHByaW9yaXR5LgotICAgKgotICAgKiAgWFhYCi0gICAqICBOZWVkIHRvIGhhbmRsZSBpbmNyZW1lbnRhbCBwcmlvcml0aWVzIHByb3Blcmx5LgotICAgKi8KLSAgdm9pZCBzZXRQcmlvcml0eShQUklPUklUWSB2YWx1ZSkgeyBwcmlvcml0eV8gPSB2YWx1ZTsgfQotCi0gIGJvb2wgaXNEZXRhY2hlZCgpIGNvbnN0IHsgcmV0dXJuIGRldGFjaGVkXzsgfQotCi0gIHZvaWQgc2V0RGV0YWNoZWQoYm9vbCB2YWx1ZSkgeyBkZXRhY2hlZF8gPSB2YWx1ZTsgfQotCi0gIFRocmVhZDo6aWRfdCBnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChUaHJlYWQ6OmlkX3QpcHRocmVhZF9zZWxmKCk7Ci0gIH0KLQotfTsKLQotUG9zaXhUaHJlYWRGYWN0b3J5OjpQb3NpeFRocmVhZEZhY3RvcnkoUE9MSUNZIHBvbGljeSwgUFJJT1JJVFkgcHJpb3JpdHksIGludCBzdGFja1NpemUsIGJvb2wgZGV0YWNoZWQpIDoKLSAgaW1wbF8obmV3IFBvc2l4VGhyZWFkRmFjdG9yeTo6SW1wbChwb2xpY3ksIHByaW9yaXR5LCBzdGFja1NpemUsIGRldGFjaGVkKSkge30KLQotc2hhcmVkX3B0cjxUaHJlYWQ+IFBvc2l4VGhyZWFkRmFjdG9yeTo6bmV3VGhyZWFkKHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdCB7IHJldHVybiBpbXBsXy0+bmV3VGhyZWFkKHJ1bm5hYmxlKTsgfQotCi1pbnQgUG9zaXhUaHJlYWRGYWN0b3J5OjpnZXRTdGFja1NpemUoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+Z2V0U3RhY2tTaXplKCk7IH0KLQotdm9pZCBQb3NpeFRocmVhZEZhY3Rvcnk6OnNldFN0YWNrU2l6ZShpbnQgdmFsdWUpIHsgaW1wbF8tPnNldFN0YWNrU2l6ZSh2YWx1ZSk7IH0KLQotUG9zaXhUaHJlYWRGYWN0b3J5OjpQUklPUklUWSBQb3NpeFRocmVhZEZhY3Rvcnk6OmdldFByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPmdldFByaW9yaXR5KCk7IH0KLQotdm9pZCBQb3NpeFRocmVhZEZhY3Rvcnk6OnNldFByaW9yaXR5KFBvc2l4VGhyZWFkRmFjdG9yeTo6UFJJT1JJVFkgdmFsdWUpIHsgaW1wbF8tPnNldFByaW9yaXR5KHZhbHVlKTsgfQotCi1ib29sIFBvc2l4VGhyZWFkRmFjdG9yeTo6aXNEZXRhY2hlZCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5pc0RldGFjaGVkKCk7IH0KLQotdm9pZCBQb3NpeFRocmVhZEZhY3Rvcnk6OnNldERldGFjaGVkKGJvb2wgdmFsdWUpIHsgaW1wbF8tPnNldERldGFjaGVkKHZhbHVlKTsgfQotCi1UaHJlYWQ6OmlkX3QgUG9zaXhUaHJlYWRGYWN0b3J5OjpnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+Z2V0Q3VycmVudFRocmVhZElkKCk7IH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmggYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkODNhMy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9QT1NJWFRIUkVBREZBQ1RPUllfSF8KLSNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9QT1NJWFRIUkVBREZBQ1RPUllfSF8gMQotCi0jaW5jbHVkZSAiVGhyZWFkLmgiCi0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi0vKioKLSAqIEEgdGhyZWFkIGZhY3RvcnkgdG8gY3JlYXRlIHBvc2l4IHRocmVhZHMKLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBQb3NpeFRocmVhZEZhY3RvcnkgOiBwdWJsaWMgVGhyZWFkRmFjdG9yeSB7Ci0KLSBwdWJsaWM6Ci0KLSAgLyoqCi0gICAqIFBPU0lYIFRocmVhZCBzY2hlZHVsZXIgcG9saWNpZXMKLSAgICovCi0gIGVudW0gUE9MSUNZIHsKLSAgICBPVEhFUiwKLSAgICBGSUZPLAotICAgIFJPVU5EX1JPQklOCi0gIH07Ci0KLSAgLyoqCi0gICAqIFBPU0lYIFRocmVhZCBzY2hlZHVsZXIgcmVsYXRpdmUgcHJpb3JpdGllcywKLSAgICoKLSAgICogQWJzb2x1dGUgcHJpb3JpdHkgaXMgZGV0ZXJtaW5lZCBieSBzY2hlZHVsZXIgcG9saWN5IGFuZCBPUy4gVGhpcwotICAgKiBlbnVtZXJhdGlvbiBzcGVjaWZpZXMgcmVsYXRpdmUgcHJpb3JpdGllcyBzdWNoIHRoYXQgb25lIGNhbiBzcGVjaWZ5IGEKLSAgICogcHJpb3JpdHkgd2l0aGluZyBhIGdpdmluZyBzY2hlZHVsZXIgcG9saWN5IHdpdGhvdXQga25vd2luZyB0aGUgYWJzb2x1dGUKLSAgICogdmFsdWUgb2YgdGhlIHByaW9yaXR5LgotICAgKi8KLSAgZW51bSBQUklPUklUWSB7Ci0gICAgTE9XRVNUID0gMCwKLSAgICBMT1dFUiA9IDEsCi0gICAgTE9XID0gMiwKLSAgICBOT1JNQUwgPSAzLAotICAgIEhJR0ggPSA0LAotICAgIEhJR0hFUiA9IDUsCi0gICAgSElHSEVTVCA9IDYsCi0gICAgSU5DUkVNRU5UID0gNywKLSAgICBERUNSRU1FTlQgPSA4Ci0gIH07Ci0KLSAgLyoqCi0gICAqIFBvc2l4IHRocmVhZCAocHRocmVhZCkgZmFjdG9yeS4gIEFsbCB0aHJlYWRzIGNyZWF0ZWQgYnkgYSBmYWN0b3J5IGFyZSByZWZlcmVuY2UtY291bnRlZAotICAgKiB2aWEgYm9vc3Q6OnNoYXJlZF9wdHIgYW5kIGJvb3N0Ojp3ZWFrX3B0ci4gIFRoZSBmYWN0b3J5IGd1YXJhbnRlZXMgdGhhdCB0aHJlYWRzIGFuZAotICAgKiB0aGUgUnVubmFibGUgdGFza3MgdGhleSBob3N0IHdpbGwgYmUgcHJvcGVybHkgY2xlYW5lZCB1cCBvbmNlIHRoZSBsYXN0IHN0cm9uZyByZWZlcmVuY2UKLSAgICogdG8gYm90aCBpcyBnaXZlbiB1cC4KLSAgICoKLSAgICogVGhyZWFkcyBhcmUgY3JlYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcG9saWN5LCBwcmlvcml0eSwgc3RhY2stc2l6ZSBhbmQgZGV0YWNoYWJsZS1tb2RlCi0gICAqIGRldGFjaGVkIG1lYW5zIHRoZSB0aHJlYWQgaXMgZnJlZS1ydW5uaW5nIGFuZCB3aWxsIHJlbGVhc2UgYWxsIHN5c3RlbSByZXNvdXJjZXMgdGhlCi0gICAqIHdoZW4gaXQgY29tcGxldGVzLiAgQSBkZXRhY2hhYmxlIHRocmVhZCBpcyBub3Qgam9pbmFibGUuICBUaGUgam9pbiBtZXRob2QKLSAgICogb2YgYSBkZXRhY2hhYmxlIHRocmVhZCB3aWxsIHJldHVybiBpbW1lZGlhdGVseSB3aXRoIG5vIGVycm9yLgotICAgKgotICAgKiBCeSBkZWZhdWx0IHRocmVhZHMgYXJlIG5vdCBqb2luYWJsZS4KLSAgICovCi0KLSAgUG9zaXhUaHJlYWRGYWN0b3J5KFBPTElDWSBwb2xpY3k9Uk9VTkRfUk9CSU4sIFBSSU9SSVRZIHByaW9yaXR5PU5PUk1BTCwgaW50IHN0YWNrU2l6ZT0xLCBib29sIGRldGFjaGVkPXRydWUpOwotCi0gIC8vIEZyb20gVGhyZWFkRmFjdG9yeTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdDsKLQotICAvLyBGcm9tIFRocmVhZEZhY3Rvcnk7Ci0gIFRocmVhZDo6aWRfdCBnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdDsKLQotICAvKioKLSAgICogR2V0cyBzdGFjayBzaXplIGZvciBjcmVhdGVkIHRocmVhZHMKLSAgICoKLSAgICogQHJldHVybiBpbnQgc2l6ZSBpbiBtZWdhYnl0ZXMKLSAgICovCi0gIHZpcnR1YWwgaW50IGdldFN0YWNrU2l6ZSgpIGNvbnN0OwotCi0gIC8qKgotICAgKiBTZXRzIHN0YWNrIHNpemUgZm9yIGNyZWF0ZWQgdGhyZWFkcwotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgc2l6ZSBpbiBtZWdhYnl0ZXMKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBzZXRTdGFja1NpemUoaW50IHZhbHVlKTsKLQotICAvKioKLSAgICogR2V0cyBwcmlvcml0eSByZWxhdGl2ZSB0byBjdXJyZW50IHBvbGljeQotICAgKi8KLSAgdmlydHVhbCBQUklPUklUWSBnZXRQcmlvcml0eSgpIGNvbnN0OwotCi0gIC8qKgotICAgKiBTZXRzIHByaW9yaXR5IHJlbGF0aXZlIHRvIGN1cnJlbnQgcG9saWN5Ci0gICAqLwotICB2aXJ0dWFsIHZvaWQgc2V0UHJpb3JpdHkoUFJJT1JJVFkgcHJpb3JpdHkpOwotCi0gIC8qKgotICAgKiBTZXRzIGRldGFjaGVkIG1vZGUgb2YgdGhyZWFkcwotICAgKi8KLSAgdmlydHVhbCB2b2lkIHNldERldGFjaGVkKGJvb2wgZGV0YWNoZWQpOwotCi0gIC8qKgotICAgKiBHZXRzIGN1cnJlbnQgZGV0YWNoZWQgbW9kZQotICAgKi8KLSAgdmlydHVhbCBib29sIGlzRGV0YWNoZWQoKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGNsYXNzIEltcGw7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPEltcGw+IGltcGxfOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1BPU0lYVEhSRUFERkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVGhyZWFkLmggYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9UaHJlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQyODJhZC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9UaHJlYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURfSF8KLSNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURfSF8gMQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3Qvd2Vha19wdHIuaHBwPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLWNsYXNzIFRocmVhZDsKLQotLyoqCi0gKiBNaW5pbWFsIHJ1bm5hYmxlIGNsYXNzLiAgTW9yZSBvciBsZXNzIGFuYWxvZ291cyB0byBqYXZhLmxhbmcuUnVubmFibGUuCi0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgUnVubmFibGUgewotCi0gcHVibGljOgotICB2aXJ0dWFsIH5SdW5uYWJsZSgpIHt9OwotICB2aXJ0dWFsIHZvaWQgcnVuKCkgPSAwOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSB0aHJlYWQgb2JqZWN0IHRoYXQgaXMgaG9zdGluZyB0aGlzIHJ1bm5hYmxlIG9iamVjdCAgLSBjYW4gcmV0dXJuCi0gICAqIGFuIGVtcHR5IGJvb3N0OjpzaGFyZWQgcG9pbnRlciBpZiBubyByZWZlcmVuY2VzIHJlbWFpbiBvbiB0aGV0IHRocmVhZCAgb2JqZWN0Ci0gICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkKCkgeyByZXR1cm4gdGhyZWFkXy5sb2NrKCk7IH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgdGhyZWFkIHRoYXQgaXMgZXhlY3V0aW5nIHRoaXMgb2JqZWN0LiAgVGhpcyBpcyBvbmx5IG1lYW50IGZvcgotICAgKiB1c2UgYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb25zIG9mIFRocmVhZC4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCB0aHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiB2YWx1ZSkgeyB0aHJlYWRfID0gdmFsdWU7IH0KLQotIHByaXZhdGU6Ci0gIGJvb3N0Ojp3ZWFrX3B0cjxUaHJlYWQ+IHRocmVhZF87Ci19OwotCi0vKioKLSAqIE1pbmltYWwgdGhyZWFkIGNsYXNzLiBSZXR1cm5lZCBieSB0aHJlYWQgZmFjdG9yeSBib3VuZCB0byBhIFJ1bm5hYmxlIG9iamVjdAotICogYW5kIHJlYWR5IHRvIHN0YXJ0IGV4ZWN1dGlvbi4gIE1vcmUgb3IgbGVzcyBhbmFsb2dvdXMgdG8gamF2YS5sYW5nLlRocmVhZAotICogKG1pbnVzIGFsbCB0aGUgdGhyZWFkIGdyb3VwLCBwcmlvcml0eSwgbW9kZSBhbmQgb3RoZXIgYmFnZ2FnZSwgc2luY2UgdGhhdAotICogaXMgZGlmZmljdWx0IHRvIGFic3RyYWN0IGFjcm9zcyBwbGF0Zm9ybXMgYW5kIGlzIGxlZnQgZm9yIHBsYXRmb3JtLXNwZWNpZmljCi0gKiBUaHJlYWRGYWN0b3J5IGltcGxlbXRhdGlvbnMgdG8gZGVhbCB3aXRoCi0gKgotICogQHNlZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3RvcnkpCi0gKi8KLWNsYXNzIFRocmVhZCB7Ci0KLSBwdWJsaWM6Ci0KLSAgdHlwZWRlZiB1aW50NjRfdCBpZF90OwotCi0gIHZpcnR1YWwgflRocmVhZCgpIHt9OwotCi0gIC8qKgotICAgKiBTdGFydHMgdGhlIHRocmVhZC4gRG9lcyBwbGF0Zm9ybSBzcGVjaWZpYyB0aHJlYWQgY3JlYXRpb24gYW5kCi0gICAqIGNvbmZpZ3VyYXRpb24gdGhlbiBpbnZva2VzIHRoZSBydW4gbWV0aG9kIG9mIHRoZSBSdW5uYWJsZSBvYmplY3QgYm91bmQKLSAgICogdG8gdGhpcyB0aHJlYWQuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgc3RhcnQoKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEpvaW4gdGhpcyB0aHJlYWQuIEN1cnJlbnQgdGhyZWFkIGJsb2NrcyB1bnRpbCB0aGlzIHRhcmdldCB0aHJlYWQKLSAgICogY29tcGxldGVzLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIGpvaW4oKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHRocmVhZCdzIHBsYXRmb3JtLXNwZWNpZmljIElECi0gICAqLwotICB2aXJ0dWFsIGlkX3QgZ2V0SWQoKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHJ1bm5hYmxlIG9iamVjdCB0aGlzIHRocmVhZCBpcyBob3N0aW5nCi0gICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIF9ydW5uYWJsZTsgfQotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgcnVubmFibGUoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlKSB7IF9ydW5uYWJsZSA9IHZhbHVlOyB9Ci0KLSBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gX3J1bm5hYmxlOwotCi19OwotCi0vKioKLSAqIEZhY3RvcnkgdG8gY3JlYXRlIHBsYXRmb3JtLXNwZWNpZmljIHRocmVhZCBvYmplY3QgYW5kIGJpbmQgdGhlbSB0byBSdW5uYWJsZQotICogb2JqZWN0IGZvciBleGVjdXRpb24KLSAqLwotY2xhc3MgVGhyZWFkRmFjdG9yeSB7Ci0KLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflRocmVhZEZhY3RvcnkoKSB7fQotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gbmV3VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3QgPSAwOwotCi0gIC8qKiBHZXRzIHRoZSBjdXJyZW50IHRocmVhZCBpZCBvciB1bmtub3duX3RocmVhZF9pZCBpZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdGhyaWZ0IHRocmVhZCAqLwotCi0gIHN0YXRpYyBjb25zdCBUaHJlYWQ6OmlkX3QgdW5rbm93bl90aHJlYWRfaWQ7Ci0KLSAgdmlydHVhbCBUaHJlYWQ6OmlkX3QgZ2V0Q3VycmVudFRocmVhZElkKCkgY29uc3QgPSAwOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1RIUkVBRF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5jcHAgYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdiMjY5MC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJUaHJlYWRNYW5hZ2VyLmgiCi0jaW5jbHVkZSAiRXhjZXB0aW9uLmgiCi0jaW5jbHVkZSAiTW9uaXRvci5oIgotI2luY2x1ZGUgIlV0aWwuaCIKLQotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8cXVldWU+Ci0jaW5jbHVkZSA8c2V0PgotCi0jaWYgZGVmaW5lZChERUJVRykKLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNlbmRpZiAvL2RlZmluZWQoREVCVUcpCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q7Ci0KLS8qKgotICogVGhyZWFkTWFuYWdlciBjbGFzcwotICoKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyBhIHBvb2wgb2YgdGhyZWFkcy4gSXQgdXNlcyBhIFRocmVhZEZhY3RvcnkgdG8gY3JlYXRlCi0gKiB0aHJlYWRzLiAgSXQgbmV2ZXIgYWN0dWFsbHkgY3JlYXRlcyBvciBkZXN0cm95cyB3b3JrZXIgdGhyZWFkcywgcmF0aGVyCi0gKiBpdCBtYWludGFpbnMgc3RhdGlzdGljcyBvbiBudW1iZXIgb2YgaWRsZSB0aHJlYWRzLCBudW1iZXIgb2YgYWN0aXZlIHRocmVhZHMsCi0gKiB0YXNrIGJhY2tsb2csIGFuZCBhdmVyYWdlIHdhaXQgYW5kIHNlcnZpY2UgdGltZXMuCi0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgVGhyZWFkTWFuYWdlcjo6SW1wbCA6IHB1YmxpYyBUaHJlYWRNYW5hZ2VyICB7Ci0KLSBwdWJsaWM6Ci0gIEltcGwoKSA6Ci0gICAgd29ya2VyQ291bnRfKDApLAotICAgIHdvcmtlck1heENvdW50XygwKSwKLSAgICBpZGxlQ291bnRfKDApLAotICAgIHBlbmRpbmdUYXNrQ291bnRNYXhfKDApLAotICAgIGV4cGlyZWRDb3VudF8oMCksCi0gICAgc3RhdGVfKFRocmVhZE1hbmFnZXI6OlVOSU5JVElBTElaRUQpLAotICAgIG1vbml0b3JfKCZtdXRleF8pLAotICAgIG1heE1vbml0b3JfKCZtdXRleF8pIHt9Ci0KLSAgfkltcGwoKSB7IHN0b3AoKTsgfQotCi0gIHZvaWQgc3RhcnQoKTsKLQotICB2b2lkIHN0b3AoKSB7IHN0b3BJbXBsKGZhbHNlKTsgfQotCi0gIHZvaWQgam9pbigpIHsgc3RvcEltcGwodHJ1ZSk7IH0KLQotICBUaHJlYWRNYW5hZ2VyOjpTVEFURSBzdGF0ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RhdGVfOwotICB9Ci0KLSAgc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KCkgY29uc3QgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICByZXR1cm4gdGhyZWFkRmFjdG9yeV87Ci0gIH0KLQotICB2b2lkIHRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB2YWx1ZSkgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICB0aHJlYWRGYWN0b3J5XyA9IHZhbHVlOwotICB9Ci0KLSAgdm9pZCBhZGRXb3JrZXIoc2l6ZV90IHZhbHVlKTsKLQotICB2b2lkIHJlbW92ZVdvcmtlcihzaXplX3QgdmFsdWUpOwotCi0gIHNpemVfdCBpZGxlV29ya2VyQ291bnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGlkbGVDb3VudF87Ci0gIH0KLQotICBzaXplX3Qgd29ya2VyQ291bnQoKSBjb25zdCB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIHJldHVybiB3b3JrZXJDb3VudF87Ci0gIH0KLQotICBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudCgpIGNvbnN0IHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgcmV0dXJuIHRhc2tzXy5zaXplKCk7Ci0gIH0KLQotICBzaXplX3QgdG90YWxUYXNrQ291bnQoKSBjb25zdCB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIHJldHVybiB0YXNrc18uc2l6ZSgpICsgd29ya2VyQ291bnRfIC0gaWRsZUNvdW50XzsKLSAgfQotCi0gIHNpemVfdCBwZW5kaW5nVGFza0NvdW50TWF4KCkgY29uc3QgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICByZXR1cm4gcGVuZGluZ1Rhc2tDb3VudE1heF87Ci0gIH0KLQotICBzaXplX3QgZXhwaXJlZFRhc2tDb3VudCgpIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgc2l6ZV90IHJlc3VsdCA9IGV4cGlyZWRDb3VudF87Ci0gICAgZXhwaXJlZENvdW50XyA9IDA7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHZvaWQgcGVuZGluZ1Rhc2tDb3VudE1heChjb25zdCBzaXplX3QgdmFsdWUpIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgcGVuZGluZ1Rhc2tDb3VudE1heF8gPSB2YWx1ZTsKLSAgfQotCi0gIGJvb2wgY2FuU2xlZXAoKTsKLQotICB2b2lkIGFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB2YWx1ZSwgaW50NjRfdCB0aW1lb3V0LCBpbnQ2NF90IGV4cGlyYXRpb24pOwotCi0gIHZvaWQgcmVtb3ZlKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spOwotCi0gIHNoYXJlZF9wdHI8UnVubmFibGU+IHJlbW92ZU5leHRQZW5kaW5nKCk7Ci0KLSAgdm9pZCByZW1vdmVFeHBpcmVkVGFza3MoKTsKLQotICB2b2lkIHNldEV4cGlyZUNhbGxiYWNrKEV4cGlyZUNhbGxiYWNrIGV4cGlyZUNhbGxiYWNrKTsKLQotcHJpdmF0ZToKLSAgdm9pZCBzdG9wSW1wbChib29sIGpvaW4pOwotCi0gIHNpemVfdCB3b3JrZXJDb3VudF87Ci0gIHNpemVfdCB3b3JrZXJNYXhDb3VudF87Ci0gIHNpemVfdCBpZGxlQ291bnRfOwotICBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heF87Ci0gIHNpemVfdCBleHBpcmVkQ291bnRfOwotICBFeHBpcmVDYWxsYmFjayBleHBpcmVDYWxsYmFja187Ci0KLSAgVGhyZWFkTWFuYWdlcjo6U1RBVEUgc3RhdGVfOwotICBzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnlfOwotCi0KLSAgZnJpZW5kIGNsYXNzIFRocmVhZE1hbmFnZXI6OlRhc2s7Ci0gIHN0ZDo6cXVldWU8c2hhcmVkX3B0cjxUYXNrPiA+IHRhc2tzXzsKLSAgTXV0ZXggbXV0ZXhfOwotICBNb25pdG9yIG1vbml0b3JfOwotICBNb25pdG9yIG1heE1vbml0b3JfOwotICBNb25pdG9yIHdvcmtlck1vbml0b3JfOwotCi0gIGZyaWVuZCBjbGFzcyBUaHJlYWRNYW5hZ2VyOjpXb3JrZXI7Ci0gIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+IHdvcmtlcnNfOwotICBzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPiBkZWFkV29ya2Vyc187Ci0gIHN0ZDo6bWFwPGNvbnN0IFRocmVhZDo6aWRfdCwgc2hhcmVkX3B0cjxUaHJlYWQ+ID4gaWRNYXBfOwotfTsKLQotY2xhc3MgVGhyZWFkTWFuYWdlcjo6VGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7Ci0KLSBwdWJsaWM6Ci0gIGVudW0gU1RBVEUgewotICAgIFdBSVRJTkcsCi0gICAgRVhFQ1VUSU5HLAotICAgIENBTkNFTExFRCwKLSAgICBDT01QTEVURQotICB9OwotCi0gIFRhc2soc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUsIGludDY0X3QgZXhwaXJhdGlvbj0wTEwpICA6Ci0gICAgcnVubmFibGVfKHJ1bm5hYmxlKSwKLSAgICBzdGF0ZV8oV0FJVElORyksCi0gICAgZXhwaXJlVGltZV8oZXhwaXJhdGlvbiAhPSAwTEwgPyBVdGlsOjpjdXJyZW50VGltZSgpICsgZXhwaXJhdGlvbiA6IDBMTCkge30KLQotICB+VGFzaygpIHt9Ci0KLSAgdm9pZCBydW4oKSB7Ci0gICAgaWYgKHN0YXRlXyA9PSBFWEVDVVRJTkcpIHsKLSAgICAgIHJ1bm5hYmxlXy0+cnVuKCk7Ci0gICAgICBzdGF0ZV8gPSBDT01QTEVURTsKLSAgICB9Ci0gIH0KLQotICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBnZXRSdW5uYWJsZSgpIHsKLSAgICByZXR1cm4gcnVubmFibGVfOwotICB9Ci0KLSAgaW50NjRfdCBnZXRFeHBpcmVUaW1lKCkgY29uc3QgewotICAgIHJldHVybiBleHBpcmVUaW1lXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGVfOwotICBmcmllbmQgY2xhc3MgVGhyZWFkTWFuYWdlcjo6V29ya2VyOwotICBTVEFURSBzdGF0ZV87Ci0gIGludDY0X3QgZXhwaXJlVGltZV87Ci19OwotCi1jbGFzcyBUaHJlYWRNYW5hZ2VyOjpXb3JrZXI6IHB1YmxpYyBSdW5uYWJsZSB7Ci0gIGVudW0gU1RBVEUgewotICAgIFVOSU5JVElBTElaRUQsCi0gICAgU1RBUlRJTkcsCi0gICAgU1RBUlRFRCwKLSAgICBTVE9QUElORywKLSAgICBTVE9QUEVECi0gIH07Ci0KLSBwdWJsaWM6Ci0gIFdvcmtlcihUaHJlYWRNYW5hZ2VyOjpJbXBsKiBtYW5hZ2VyKSA6Ci0gICAgbWFuYWdlcl8obWFuYWdlciksCi0gICAgc3RhdGVfKFVOSU5JVElBTElaRUQpLAotICAgIGlkbGVfKGZhbHNlKSB7fQotCi0gIH5Xb3JrZXIoKSB7fQotCi0gcHJpdmF0ZToKLSAgYm9vbCBpc0FjdGl2ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4KLSAgICAgIChtYW5hZ2VyXy0+d29ya2VyQ291bnRfIDw9IG1hbmFnZXJfLT53b3JrZXJNYXhDb3VudF8pIHx8Ci0gICAgICAobWFuYWdlcl8tPnN0YXRlXyA9PSBKT0lOSU5HICYmICFtYW5hZ2VyXy0+dGFza3NfLmVtcHR5KCkpOwotICB9Ci0KLSBwdWJsaWM6Ci0gIC8qKgotICAgKiBXb3JrZXIgZW50cnkgcG9pbnQKLSAgICoKLSAgICogQXMgbG9uZyBhcyB3b3JrZXIgdGhyZWFkIGlzIHJ1bm5pbmcsIHB1bGwgdGFza3Mgb2ZmIHRoZSB0YXNrIHF1ZXVlIGFuZAotICAgKiBleGVjdXRlLgotICAgKi8KLSAgdm9pZCBydW4oKSB7Ci0gICAgYm9vbCBhY3RpdmUgPSBmYWxzZTsKLSAgICBib29sIG5vdGlmeU1hbmFnZXIgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEluY3JlbWVudCB3b3JrZXIgc2VtYXBob3JlIGFuZCBub3RpZnkgbWFuYWdlciBpZiB3b3JrZXIgY291bnQgcmVhY2hlZAotICAgICAqIGRlc2lyZWQgbWF4Ci0gICAgICoKLSAgICAgKiBOb3RlOiBXZSBoYXZlIHRvIHJlbGVhc2UgdGhlIG1vbml0b3IgYW5kIGFjcXVpcmUgdGhlIHdvcmtlck1vbml0b3IKLSAgICAgKiBzaW5jZSB0aGF0IGlzIHdoYXQgdGhlIG1hbmFnZXIgYmxvY2tzIG9uIGZvciB3b3JrZXIgYWRkL3JlbW92ZQotICAgICAqLwotICAgIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKG1hbmFnZXJfLT5tb25pdG9yXyk7Ci0gICAgICBhY3RpdmUgPSBtYW5hZ2VyXy0+d29ya2VyQ291bnRfIDwgbWFuYWdlcl8tPndvcmtlck1heENvdW50XzsKLSAgICAgIGlmIChhY3RpdmUpIHsKLSAgICAgICAgbWFuYWdlcl8tPndvcmtlckNvdW50XysrOwotICAgICAgICBub3RpZnlNYW5hZ2VyID0gbWFuYWdlcl8tPndvcmtlckNvdW50XyA9PSBtYW5hZ2VyXy0+d29ya2VyTWF4Q291bnRfOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChub3RpZnlNYW5hZ2VyKSB7Ci0gICAgICBTeW5jaHJvbml6ZWQgcyhtYW5hZ2VyXy0+d29ya2VyTW9uaXRvcl8pOwotICAgICAgbWFuYWdlcl8tPndvcmtlck1vbml0b3JfLm5vdGlmeSgpOwotICAgICAgbm90aWZ5TWFuYWdlciA9IGZhbHNlOwotICAgIH0KLQotICAgIHdoaWxlIChhY3RpdmUpIHsKLSAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6VGFzaz4gdGFzazsKLQotICAgICAgLyoqCi0gICAgICAgKiBXaGlsZSBob2xkaW5nIG1hbmFnZXIgbW9uaXRvciBibG9jayBmb3Igbm9uLWVtcHR5IHRhc2sgcXVldWUgKEFsc28KLSAgICAgICAqIGNoZWNrIHRoYXQgdGhlIHRocmVhZCBoYXNuJ3QgYmVlbiByZXF1ZXN0ZWQgdG8gc3RvcCkuIE9uY2UgdGhlIHF1ZXVlCi0gICAgICAgKiBpcyBub24tZW1wdHksIGRlcXVldWUgYSB0YXNrLCByZWxlYXNlIG1vbml0b3IsIGFuZCBleGVjdXRlLiBJZiB0aGUKLSAgICAgICAqIHdvcmtlciBtYXggY291bnQgaGFzIGJlZW4gZGVjcmVtZW50ZWQgc3VjaCB0aGF0IHdlIGV4Y2VlZCBpdCwgbWFyawotICAgICAgICogb3Vyc2VsZiBpbmFjdGl2ZSwgZGVjcmVtZW50IHRoZSB3b3JrZXIgY291bnQgYW5kIG5vdGlmeSB0aGUgbWFuYWdlcgotICAgICAgICogKHRlY2huaWNhbGx5IHdlJ3JlIG5vdGlmeWluZyB0aGUgbmV4dCBibG9ja2VkIHRocmVhZCBidXQgZXZlbnR1YWxseQotICAgICAgICogdGhlIG1hbmFnZXIgd2lsbCBzZWUgaXQuCi0gICAgICAgKi8KLSAgICAgIHsKLSAgICAgICAgR3VhcmQgZyhtYW5hZ2VyXy0+bXV0ZXhfKTsKLSAgICAgICAgYWN0aXZlID0gaXNBY3RpdmUoKTsKLQotICAgICAgICB3aGlsZSAoYWN0aXZlICYmIG1hbmFnZXJfLT50YXNrc18uZW1wdHkoKSkgewotICAgICAgICAgIG1hbmFnZXJfLT5pZGxlQ291bnRfKys7Ci0gICAgICAgICAgaWRsZV8gPSB0cnVlOwotICAgICAgICAgIG1hbmFnZXJfLT5tb25pdG9yXy53YWl0KCk7Ci0gICAgICAgICAgYWN0aXZlID0gaXNBY3RpdmUoKTsKLSAgICAgICAgICBpZGxlXyA9IGZhbHNlOwotICAgICAgICAgIG1hbmFnZXJfLT5pZGxlQ291bnRfLS07Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWN0aXZlKSB7Ci0gICAgICAgICAgbWFuYWdlcl8tPnJlbW92ZUV4cGlyZWRUYXNrcygpOwotCi0gICAgICAgICAgaWYgKCFtYW5hZ2VyXy0+dGFza3NfLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIHRhc2sgPSBtYW5hZ2VyXy0+dGFza3NfLmZyb250KCk7Ci0gICAgICAgICAgICBtYW5hZ2VyXy0+dGFza3NfLnBvcCgpOwotICAgICAgICAgICAgaWYgKHRhc2stPnN0YXRlXyA9PSBUaHJlYWRNYW5hZ2VyOjpUYXNrOjpXQUlUSU5HKSB7Ci0gICAgICAgICAgICAgIHRhc2stPnN0YXRlXyA9IFRocmVhZE1hbmFnZXI6OlRhc2s6OkVYRUNVVElORzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSBhIHBlbmRpbmcgdGFzayBtYXggYW5kIHdlIGp1c3QgZHJvcHBlZCBiZWxvdyBpdCwgd2FrZXVwIGFueQotICAgICAgICAgICAgICAgdGhyZWFkIHRoYXQgbWlnaHQgYmUgYmxvY2tlZCBvbiBhZGQuICovCi0gICAgICAgICAgICBpZiAobWFuYWdlcl8tPnBlbmRpbmdUYXNrQ291bnRNYXhfICE9IDAgJiYKLSAgICAgICAgICAgICAgICBtYW5hZ2VyXy0+dGFza3NfLnNpemUoKSA8PSBtYW5hZ2VyXy0+cGVuZGluZ1Rhc2tDb3VudE1heF8gLSAxKSB7Ci0gICAgICAgICAgICAgIG1hbmFnZXJfLT5tYXhNb25pdG9yXy5ub3RpZnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWRsZV8gPSB0cnVlOwotICAgICAgICAgIG1hbmFnZXJfLT53b3JrZXJDb3VudF8tLTsKLSAgICAgICAgICBub3RpZnlNYW5hZ2VyID0gKG1hbmFnZXJfLT53b3JrZXJDb3VudF8gPT0gbWFuYWdlcl8tPndvcmtlck1heENvdW50Xyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHRhc2sgIT0gTlVMTCkgewotICAgICAgICBpZiAodGFzay0+c3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlRhc2s6OkVYRUNVVElORykgewotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0YXNrLT5ydW4oKTsKLSAgICAgICAgICB9IGNhdGNoKC4uLikgewotICAgICAgICAgICAgLy8gWFhYIG5lZWQgdG8gbG9nIHRoaXMKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICB7Ci0gICAgICBTeW5jaHJvbml6ZWQgcyhtYW5hZ2VyXy0+d29ya2VyTW9uaXRvcl8pOwotICAgICAgbWFuYWdlcl8tPmRlYWRXb3JrZXJzXy5pbnNlcnQodGhpcy0+dGhyZWFkKCkpOwotICAgICAgaWYgKG5vdGlmeU1hbmFnZXIpIHsKLSAgICAgICAgbWFuYWdlcl8tPndvcmtlck1vbml0b3JfLm5vdGlmeSgpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybjsKLSAgfQotCi0gIHByaXZhdGU6Ci0gICAgVGhyZWFkTWFuYWdlcjo6SW1wbCogbWFuYWdlcl87Ci0gICAgZnJpZW5kIGNsYXNzIFRocmVhZE1hbmFnZXI6OkltcGw7Ci0gICAgU1RBVEUgc3RhdGVfOwotICAgIGJvb2wgaWRsZV87Ci19OwotCi0KLSAgdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjphZGRXb3JrZXIoc2l6ZV90IHZhbHVlKSB7Ci0gIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+IG5ld1RocmVhZHM7Ci0gIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCB2YWx1ZTsgaXgrKykgewotICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6V29ya2VyPiB3b3JrZXIgPSBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6Oldvcmtlcj4obmV3IFRocmVhZE1hbmFnZXI6Oldvcmtlcih0aGlzKSk7Ci0gICAgbmV3VGhyZWFkcy5pbnNlcnQodGhyZWFkRmFjdG9yeV8tPm5ld1RocmVhZCh3b3JrZXIpKTsKLSAgfQotCi0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgd29ya2VyTWF4Q291bnRfICs9IHZhbHVlOwotICAgIHdvcmtlcnNfLmluc2VydChuZXdUaHJlYWRzLmJlZ2luKCksIG5ld1RocmVhZHMuZW5kKCkpOwotICB9Ci0KLSAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPjo6aXRlcmF0b3IgaXggPSBuZXdUaHJlYWRzLmJlZ2luKCk7IGl4ICE9IG5ld1RocmVhZHMuZW5kKCk7IGl4KyspIHsKLSAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6Oldvcmtlcj4gd29ya2VyID0gZHluYW1pY19wb2ludGVyX2Nhc3Q8VGhyZWFkTWFuYWdlcjo6V29ya2VyLCBSdW5uYWJsZT4oKCppeCktPnJ1bm5hYmxlKCkpOwotICAgIHdvcmtlci0+c3RhdGVfID0gVGhyZWFkTWFuYWdlcjo6V29ya2VyOjpTVEFSVElORzsKLSAgICAoKml4KS0+c3RhcnQoKTsKLSAgICBpZE1hcF8uaW5zZXJ0KHN0ZDo6cGFpcjxjb25zdCBUaHJlYWQ6OmlkX3QsIHNoYXJlZF9wdHI8VGhyZWFkPiA+KCgqaXgpLT5nZXRJZCgpLCAqaXgpKTsKLSAgfQotCi0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyh3b3JrZXJNb25pdG9yXyk7Ci0gICAgd2hpbGUgKHdvcmtlckNvdW50XyAhPSB3b3JrZXJNYXhDb3VudF8pIHsKLSAgICAgIHdvcmtlck1vbml0b3JfLndhaXQoKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpzdGFydCgpIHsKLQotICBpZiAoc3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIGlmIChzdGF0ZV8gPT0gVGhyZWFkTWFuYWdlcjo6VU5JTklUSUFMSVpFRCkgewotICAgICAgaWYgKHRocmVhZEZhY3RvcnlfID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBzdGF0ZV8gPSBUaHJlYWRNYW5hZ2VyOjpTVEFSVEVEOwotICAgICAgbW9uaXRvcl8ubm90aWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgd2hpbGUgKHN0YXRlXyA9PSBTVEFSVElORykgewotICAgICAgbW9uaXRvcl8ud2FpdCgpOwotICAgIH0KLSAgfQotfQotCi12b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnN0b3BJbXBsKGJvb2wgam9pbikgewotICBib29sIGRvU3RvcCA9IGZhbHNlOwotICBpZiAoc3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIGlmIChzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6U1RPUFBJTkcgJiYKLSAgICAgICAgc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OkpPSU5JTkcgJiYKLSAgICAgICAgc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQpIHsKLSAgICAgIGRvU3RvcCA9IHRydWU7Ci0gICAgICBzdGF0ZV8gPSBqb2luID8gVGhyZWFkTWFuYWdlcjo6Sk9JTklORyA6IFRocmVhZE1hbmFnZXI6OlNUT1BQSU5HOwotICAgIH0KLSAgfQotCi0gIGlmIChkb1N0b3ApIHsKLSAgICByZW1vdmVXb3JrZXIod29ya2VyQ291bnRfKTsKLSAgfQotCi0gIC8vIFhYWAotICAvLyBzaG91bGQgYmUgYWJsZSB0byBibG9jayBoZXJlIGZvciB0cmFuc2l0aW9uIHRvIFNUT1BQRUQgc2luY2Ugd2UncmUgbm8KLSAgLy8gdXNpbmcgc2hhcmVkX3B0cnMKLQotICB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIHN0YXRlXyA9IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQ7Ci0gIH0KLQotfQotCi12b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZVdvcmtlcihzaXplX3QgdmFsdWUpIHsKLSAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID4gcmVtb3ZlZFRocmVhZHM7Ci0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgaWYgKHZhbHVlID4gd29ya2VyTWF4Q291bnRfKSB7Ci0gICAgICB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICB3b3JrZXJNYXhDb3VudF8gLT0gdmFsdWU7Ci0KLSAgICBpZiAoaWRsZUNvdW50XyA8IHZhbHVlKSB7Ci0gICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgaWRsZUNvdW50XzsgaXgrKykgewotICAgICAgICBtb25pdG9yXy5ub3RpZnkoKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgbW9uaXRvcl8ubm90aWZ5QWxsKCk7Ci0gICAgfQotICB9Ci0KLSAgewotICAgIFN5bmNocm9uaXplZCBzKHdvcmtlck1vbml0b3JfKTsKLQotICAgIHdoaWxlICh3b3JrZXJDb3VudF8gIT0gd29ya2VyTWF4Q291bnRfKSB7Ci0gICAgICB3b3JrZXJNb25pdG9yXy53YWl0KCk7Ci0gICAgfQotCi0gICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPjo6aXRlcmF0b3IgaXggPSBkZWFkV29ya2Vyc18uYmVnaW4oKTsgaXggIT0gZGVhZFdvcmtlcnNfLmVuZCgpOyBpeCsrKSB7Ci0gICAgICB3b3JrZXJzXy5lcmFzZSgqaXgpOwotICAgICAgaWRNYXBfLmVyYXNlKCgqaXgpLT5nZXRJZCgpKTsKLSAgICB9Ci0KLSAgICBkZWFkV29ya2Vyc18uY2xlYXIoKTsKLSAgfQotfQotCi0gIGJvb2wgVGhyZWFkTWFuYWdlcjo6SW1wbDo6Y2FuU2xlZXAoKSB7Ci0gICAgY29uc3QgVGhyZWFkOjppZF90IGlkID0gdGhyZWFkRmFjdG9yeV8tPmdldEN1cnJlbnRUaHJlYWRJZCgpOwotICAgIHJldHVybiBpZE1hcF8uZmluZChpZCkgPT0gaWRNYXBfLmVuZCgpOwotICB9Ci0KLSAgdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjphZGQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBleHBpcmF0aW9uKSB7Ci0gICAgR3VhcmQgZyhtdXRleF8sIHRpbWVvdXQpOwotCi0gICAgaWYgKCFnKSB7Ci0gICAgICB0aHJvdyBUaW1lZE91dEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIGlmIChzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6U1RBUlRFRCkgewotICAgICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcmVtb3ZlRXhwaXJlZFRhc2tzKCk7Ci0gICAgaWYgKHBlbmRpbmdUYXNrQ291bnRNYXhfID4gMCAmJiAodGFza3NfLnNpemUoKSA+PSBwZW5kaW5nVGFza0NvdW50TWF4XykpIHsKLSAgICAgIGlmIChjYW5TbGVlcCgpICYmIHRpbWVvdXQgPj0gMCkgewotICAgICAgICB3aGlsZSAocGVuZGluZ1Rhc2tDb3VudE1heF8gPiAwICYmIHRhc2tzXy5zaXplKCkgPj0gcGVuZGluZ1Rhc2tDb3VudE1heF8pIHsKLSAgICAgICAgICAvLyBUaGlzIGlzIHRocmVhZCBzYWZlIGJlY2F1c2UgdGhlIG11dGV4IGlzIHNoYXJlZCBiZXR3ZWVuIG1vbml0b3JzLgotICAgICAgICAgIG1heE1vbml0b3JfLndhaXQodGltZW91dCk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93IFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB0YXNrc18ucHVzaChzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6OlRhc2s+KG5ldyBUaHJlYWRNYW5hZ2VyOjpUYXNrKHZhbHVlLCBleHBpcmF0aW9uKSkpOwotCi0gICAgLy8gSWYgaWRsZSB0aHJlYWQgaXMgYXZhaWxhYmxlIG5vdGlmeSBpdCwgb3RoZXJ3aXNlIGFsbCB3b3JrZXIgdGhyZWFkcyBhcmUKLSAgICAvLyBydW5uaW5nIGFuZCB3aWxsIGdldCBhcm91bmQgdG8gdGhpcyB0YXNrIGluIHRpbWUuCi0gICAgaWYgKGlkbGVDb3VudF8gPiAwKSB7Ci0gICAgICBtb25pdG9yXy5ub3RpZnkoKTsKLSAgICB9Ci0gIH0KLQotdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmUoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgewotICAodm9pZCkgdGFzazsKLSAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICBpZiAoc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUQVJURUQpIHsKLSAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgfQotfQotCi1ib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlTmV4dFBlbmRpbmcoKSB7Ci0gIEd1YXJkIGcobXV0ZXhfKTsKLSAgaWYgKHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpTVEFSVEVEKSB7Ci0gICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gIH0KLQotICBpZiAodGFza3NfLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+KCk7Ci0gIH0KLQotICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6OlRhc2s+IHRhc2sgPSB0YXNrc18uZnJvbnQoKTsKLSAgdGFza3NfLnBvcCgpOwotICAKLSAgcmV0dXJuIHRhc2stPmdldFJ1bm5hYmxlKCk7Ci19Ci0KLXZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlRXhwaXJlZFRhc2tzKCkgewotICBpbnQ2NF90IG5vdyA9IDBMTDsgLy8gd2Ugd29uJ3QgYXNrIGZvciB0aGUgdGltZSB1bnRpbGUgd2UgbmVlZCBpdAotCi0gIC8vIG5vdGUgdGhhdCB0aGlzIGxvb3AgYnJlYWtzIGF0IHRoZSBmaXJzdCBub24tZXhwaXJpbmcgdGFzawotICB3aGlsZSAoIXRhc2tzXy5lbXB0eSgpKSB7Ci0gICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpUYXNrPiB0YXNrID0gdGFza3NfLmZyb250KCk7Ci0gICAgaWYgKHRhc2stPmdldEV4cGlyZVRpbWUoKSA9PSAwTEwpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAobm93ID09IDBMTCkgewotICAgICAgbm93ID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLSAgICB9Ci0gICAgaWYgKHRhc2stPmdldEV4cGlyZVRpbWUoKSA+IG5vdykgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChleHBpcmVDYWxsYmFja18pIHsKLSAgICAgIGV4cGlyZUNhbGxiYWNrXyh0YXNrLT5nZXRSdW5uYWJsZSgpKTsKLSAgICB9Ci0gICAgdGFza3NfLnBvcCgpOwotICAgIGV4cGlyZWRDb3VudF8rKzsKLSAgfQotfQotCi0KLXZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6c2V0RXhwaXJlQ2FsbGJhY2soRXhwaXJlQ2FsbGJhY2sgZXhwaXJlQ2FsbGJhY2spIHsKLSAgZXhwaXJlQ2FsbGJhY2tfID0gZXhwaXJlQ2FsbGJhY2s7Ci19Ci0KLWNsYXNzIFNpbXBsZVRocmVhZE1hbmFnZXIgOiBwdWJsaWMgVGhyZWFkTWFuYWdlcjo6SW1wbCB7Ci0KLSBwdWJsaWM6Ci0gIFNpbXBsZVRocmVhZE1hbmFnZXIoc2l6ZV90IHdvcmtlckNvdW50PTQsIHNpemVfdCBwZW5kaW5nVGFza0NvdW50TWF4PTApIDoKLSAgICB3b3JrZXJDb3VudF8od29ya2VyQ291bnQpLAotICAgIHBlbmRpbmdUYXNrQ291bnRNYXhfKHBlbmRpbmdUYXNrQ291bnRNYXgpLAotICAgIGZpcnN0VGltZV8odHJ1ZSkgewotICB9Ci0KLSAgdm9pZCBzdGFydCgpIHsKLSAgICBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpwZW5kaW5nVGFza0NvdW50TWF4KHBlbmRpbmdUYXNrQ291bnRNYXhfKTsKLSAgICBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpzdGFydCgpOwotICAgIGFkZFdvcmtlcih3b3JrZXJDb3VudF8pOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBzaXplX3Qgd29ya2VyQ291bnRfOwotICBjb25zdCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heF87Ci0gIGJvb2wgZmlyc3RUaW1lXzsKLSAgTW9uaXRvciBtb25pdG9yXzsKLX07Ci0KLQotc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBUaHJlYWRNYW5hZ2VyOjpuZXdUaHJlYWRNYW5hZ2VyKCkgewotICByZXR1cm4gc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPihuZXcgVGhyZWFkTWFuYWdlcjo6SW1wbCgpKTsKLX0KLQotc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHNpemVfdCBjb3VudCwgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXgpIHsKLSAgcmV0dXJuIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4obmV3IFNpbXBsZVRocmVhZE1hbmFnZXIoY291bnQsIHBlbmRpbmdUYXNrQ291bnRNYXgpKTsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmggYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkN2IwZWYuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1RIUkVBRE1BTkFHRVJfSF8KLSNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURNQU5BR0VSX0hfIDEKLQotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgIlRocmVhZC5oIgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLS8qKgotICogVGhyZWFkIFBvb2wgTWFuYWdlciBhbmQgcmVsYXRlZCBjbGFzc2VzCi0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgVGhyZWFkTWFuYWdlcjsKLQotLyoqCi0gKiBUaHJlYWRNYW5hZ2VyIGNsYXNzCi0gKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIGEgcG9vbCBvZiB0aHJlYWRzLiBJdCB1c2VzIGEgVGhyZWFkRmFjdG9yeSB0byBjcmVhdGUKLSAqIHRocmVhZHMuIEl0IG5ldmVyIGFjdHVhbGx5IGNyZWF0ZXMgb3IgZGVzdHJveXMgd29ya2VyIHRocmVhZHMsIHJhdGhlcgotICogSXQgbWFpbnRhaW5zIHN0YXRpc3RpY3Mgb24gbnVtYmVyIG9mIGlkbGUgdGhyZWFkcywgbnVtYmVyIG9mIGFjdGl2ZSB0aHJlYWRzLAotICogdGFzayBiYWNrbG9nLCBhbmQgYXZlcmFnZSB3YWl0IGFuZCBzZXJ2aWNlIHRpbWVzIGFuZCBpbmZvcm1zIHRoZSBQb29sUG9saWN5Ci0gKiBvYmplY3QgYm91bmQgdG8gaW5zdGFuY2VzIG9mIHRoaXMgbWFuYWdlciBvZiBpbnRlcmVzdGluZyB0cmFuc2l0aW9ucy4gSXQgaXMKLSAqIHRoZW4gdXAgdGhlIFBvb2xQb2xpY3kgb2JqZWN0IHRvIGRlY2lkZSBpZiB0aGUgdGhyZWFkIHBvb2wgc2l6ZSBuZWVkcyB0byBiZQotICogYWRqdXN0ZWQgYW5kIGNhbGwgdGhpcyBvYmplY3QgYWRkV29ya2VyIGFuZCByZW1vdmVXb3JrZXIgbWV0aG9kcyB0byBtYWtlCi0gKiBjaGFuZ2VzLgotICoKLSAqIFRoaXMgZGVzaWduIGFsbG93cyBkaWZmZXJlbnQgcG9saWN5IGltcGxlbWVudGF0aW9ucyB0byB1c2VkIHRoaXMgY29kZSB0bwotICogaGFuZGxlIGJhc2ljIHdvcmtlciB0aHJlYWQgbWFuYWdlbWVudCBhbmQgd29ya2VyIHRhc2sgZXhlY3V0aW9uIGFuZCBmb2N1cyBvbgotICogcG9saWN5IGlzc3Vlcy4gVGhlIHNpbXBsZXN0IHBvbGljeSwgU3RhdGljUG9saWN5LCBkb2VzIG5vdGhpbmcgb3RoZXIgdGhhbgotICogY3JlYXRlIGEgZml4ZWQgbnVtYmVyIG9mIHRocmVhZHMuCi0gKi8KLWNsYXNzIFRocmVhZE1hbmFnZXIgewotCi0gcHJvdGVjdGVkOgotICBUaHJlYWRNYW5hZ2VyKCkge30KLQotIHB1YmxpYzoKLSAgY2xhc3MgVGFzazsKLSAgdHlwZWRlZiBzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4pPiBFeHBpcmVDYWxsYmFjazsKLQotICB2aXJ0dWFsIH5UaHJlYWRNYW5hZ2VyKCkge30KLQotICAvKioKLSAgICogU3RhcnRzIHRoZSB0aHJlYWQgbWFuYWdlci4gVmVyaWZpZXMgYWxsIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHByb3Blcmx5Ci0gICAqIGluaXRpYWxpemVkLCB0aGVuIGFsbG9jYXRlcyBuZWNlc3NhcnkgcmVzb3VyY2VzIHRvIGJlZ2luIG9wZXJhdGlvbgotICAgKi8KLSAgdmlydHVhbCB2b2lkIHN0YXJ0KCkgPSAwOwotCi0gIC8qKgotICAgKiBTdG9wcyB0aGUgdGhyZWFkIG1hbmFnZXIuIEFib3J0cyBhbGwgcmVtYWluaW5nIHVucHJvY2Vzc2VkIHRhc2ssIHNodXRzCi0gICAqIGRvd24gYWxsIGNyZWF0ZWQgd29ya2VyIHRocmVhZHMsIGFuZCByZWFsZWFzZXMgYWxsIGFsbG9jYXRlZCByZXNvdXJjZXMuCi0gICAqIFRoaXMgbWV0aG9kIGJsb2NrcyBmb3IgYWxsIHdvcmtlciB0aHJlYWRzIHRvIGNvbXBsZXRlLCB0aHVzIGl0IGNhbgotICAgKiBwb3RlbnRpYWxseSBibG9jayBmb3JldmVyIGlmIGEgd29ya2VyIHRocmVhZCBpcyBydW5uaW5nIGEgdGFzayB0aGF0Ci0gICAqIHdvbid0IHRlcm1pbmF0ZS4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBzdG9wKCkgPSAwOwotCi0gIC8qKgotICAgKiBKb2lucyB0aGUgdGhyZWFkIG1hbmFnZXIuIFRoaXMgaXMgdGhlIHNhbWUgYXMgc3RvcCwgZXhjZXB0IHRoYXQgaXQgd2lsbAotICAgKiBibG9jayB1bnRpbCBhbGwgdGhlIHdvcmtlcnMgaGF2ZSBmaW5pc2hlZCB0aGVpciB3b3JrLiBBdCB0aGF0IHBvaW50Ci0gICAqIHRoZSBUaHJlYWRNYW5hZ2VyIHdpbGwgdHJhbnNpdGlvbiBpbnRvIHRoZSBTVE9QUEVEIHN0YXRlLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIGpvaW4oKSA9IDA7Ci0KLSAgZW51bSBTVEFURSB7Ci0gICAgVU5JTklUSUFMSVpFRCwKLSAgICBTVEFSVElORywKLSAgICBTVEFSVEVELAotICAgIEpPSU5JTkcsCi0gICAgU1RPUFBJTkcsCi0gICAgU1RPUFBFRAotICB9OwotCi0gIHZpcnR1YWwgU1RBVEUgc3RhdGUoKSBjb25zdCA9IDA7Ci0KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KCkgY29uc3QgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCB0aHJlYWRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHZhbHVlKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIGFkZFdvcmtlcihzaXplX3QgdmFsdWU9MSkgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCByZW1vdmVXb3JrZXIoc2l6ZV90IHZhbHVlPTEpID0gMDsKLQotICAvKioKLSAgICogR2V0cyB0aGUgY3VycmVudCBudW1iZXIgb2YgaWRsZSB3b3JrZXIgdGhyZWFkcwotICAgKi8KLSAgdmlydHVhbCBzaXplX3QgaWRsZVdvcmtlckNvdW50KCkgY29uc3QgPSAwOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBjdXJyZW50IG51bWJlciBvZiB0b3RhbCB3b3JrZXIgdGhyZWFkcwotICAgKi8KLSAgdmlydHVhbCBzaXplX3Qgd29ya2VyQ291bnQoKSBjb25zdCA9IDA7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHBlbmRpbmcgdGFza3MKLSAgICovCi0gIHZpcnR1YWwgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnQoKSBjb25zdCAgPSAwOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBjdXJyZW50IG51bWJlciBvZiBwZW5kaW5nIGFuZCBleGVjdXRpbmcgdGFza3MKLSAgICovCi0gIHZpcnR1YWwgc2l6ZV90IHRvdGFsVGFza0NvdW50KCkgY29uc3QgPSAwOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBtYXhpbXVtIHBlbmRpbmcgdGFzayBjb3VudC4gIDAgaW5kaWNhdGVzIG5vIG1heGltdW0KLSAgICovCi0gIHZpcnR1YWwgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXgoKSBjb25zdCA9IDA7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG51bWJlciBvZiB0YXNrcyB3aGljaCBoYXZlIGJlZW4gZXhwaXJlZCB3aXRob3V0IGJlaW5nIHJ1bi4KLSAgICovCi0gIHZpcnR1YWwgc2l6ZV90IGV4cGlyZWRUYXNrQ291bnQoKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSB0YXNrIHRvIGJlIGV4ZWN1dGVkIGF0IHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlIGJ5IGEgd29ya2VyIHRocmVhZC4KLSAgICoKLSAgICogVGhpcyBtZXRob2Qgd2lsbCBibG9jayBpZiBwZW5kaW5nVGFza0NvdW50TWF4KCkgaW4gbm90IHplcm8gYW5kIHBlbmRpbmdUYXNrQ291bnQoKQotICAgKiBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWx0IHRvIHBlbmRpbmdUYXNrQ291bnRNYXgoKS4gIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbiB0aGUKLSAgICogY29udGV4dCBvZiBhIFRocmVhZE1hbmFnZXIgd29ya2VyIHRocmVhZCBpdCB3aWxsIHRocm93IGEKLSAgICogVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbgotICAgKgotICAgKiBAcGFyYW0gdGFzayAgVGhlIHRhc2sgdG8gcXVldWUgZm9yIGV4ZWN1dGlvbgotICAgKgotICAgKiBAcGFyYW0gdGltZW91dCBUaW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzIHRvIGFkZCBhIHRhc2sgd2hlbiBhIHBlbmRpbmctdGFzay1jb3VudAotICAgKiBpcyBzcGVjaWZpZWQuIFNwZWNpZmljIGNhc2VzOgotICAgKiB0aW1lb3V0ID0gMCAgOiBXYWl0IGZvcmV2ZXIgdG8gcXVldWUgdGFzay4KLSAgICogdGltZW91dCA9IC0xIDogUmV0dXJuIGltbWVkaWF0ZWx5IGlmIHBlbmRpbmcgdGFzayBjb3VudCBleGNlZWRzIHNwZWNpZmllZCBtYXgKLSAgICogQHBhcmFtIGV4cGlyYXRpb24gd2hlbiBub256ZXJvLCB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGUgdGFzayBpcyB2YWxpZAotICAgKiB0byBiZSBydW47IGlmIGV4Y2VlZGVkLCB0aGUgdGFzayB3aWxsIGJlIGRyb3BwZWQgb2ZmIHRoZSBxdWV1ZSBhbmQgbm90IHJ1bi4KLSAgICoKLSAgICogQHRocm93cyBUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uIFBlbmRpbmcgdGFzayBjb3VudCBleGNlZWRzIG1heCBwZW5kaW5nIHRhc2sgY291bnQKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBhZGQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+dGFzaywKLSAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXQ9MExMLAotICAgICAgICAgICAgICAgICAgIGludDY0X3QgZXhwaXJhdGlvbj0wTEwpID0gMDsKLQotICAvKioKLSAgICogUmVtb3ZlcyBhIHBlbmRpbmcgdGFzawotICAgKi8KLSAgdmlydHVhbCB2b2lkIHJlbW92ZShib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgPSAwOwotCi0gIC8qKgotICAgKiBSZW1vdmUgdGhlIG5leHQgcGVuZGluZyB0YXNrIHdoaWNoIHdvdWxkIGJlIHJ1bi4KLSAgICoKLSAgICogQHJldHVybiB0aGUgdGFzayByZW1vdmVkLgotICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcmVtb3ZlTmV4dFBlbmRpbmcoKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFJlbW92ZSB0YXNrcyBmcm9tIGZyb250IG9mIHRhc2sgcXVldWUgdGhhdCBoYXZlIGV4cGlyZWQuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgcmVtb3ZlRXhwaXJlZFRhc2tzKCkgPSAwOwotCi0gIC8qKgotICAgKiBTZXQgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBhIHRhc2sgaXMgZXhwaXJlZCBhbmQgbm90IHJ1bi4KLSAgICoKLSAgICogQHBhcmFtIGV4cGlyZUNhbGxiYWNrIGEgZnVuY3Rpb24gY2FsbGVkIHdpdGggdGhlIHNoYXJlZF9wdHI8UnVubmFibGU+IGZvcgotICAgKiB0aGUgZXhwaXJlZCB0YXNrLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIHNldEV4cGlyZUNhbGxiYWNrKEV4cGlyZUNhbGxiYWNrIGV4cGlyZUNhbGxiYWNrKSA9IDA7Ci0KLSAgc3RhdGljIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IG5ld1RocmVhZE1hbmFnZXIoKTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIHNpbXBsZSB0aHJlYWQgbWFuYWdlciB0aGUgdXNlcyBjb3VudCBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgYW5kIGhhcwotICAgKiBhIHBlbmRpbmdUYXNrQ291bnRNYXggbWF4aW11bSBwZW5kaW5nIHRhc2tzLiBUaGUgZGVmYXVsdCwgMCwgc3BlY2lmaWVkIG5vIGxpbWl0Ci0gICAqIG9uIHBlbmRpbmcgdGFza3MKLSAgICovCi0gIHN0YXRpYyBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHNpemVfdCBjb3VudD00LCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heD0wKTsKLQotICBjbGFzcyBUYXNrOwotCi0gIGNsYXNzIFdvcmtlcjsKLQotICBjbGFzcyBJbXBsOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1RIUkVBRE1BTkFHRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5jcHAgYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2FjZDBhLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiVGltZXJNYW5hZ2VyLmgiCi0jaW5jbHVkZSAiRXhjZXB0aW9uLmgiCi0jaW5jbHVkZSAiVXRpbC5oIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c2V0PgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotCi0vKioKLSAqIFRpbWVyTWFuYWdlciBjbGFzcwotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIFRpbWVyTWFuYWdlcjo6VGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7Ci0KLSBwdWJsaWM6Ci0gIGVudW0gU1RBVEUgewotICAgIFdBSVRJTkcsCi0gICAgRVhFQ1VUSU5HLAotICAgIENBTkNFTExFRCwKLSAgICBDT01QTEVURQotICB9OwotCi0gIFRhc2soc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIDoKLSAgICBydW5uYWJsZV8ocnVubmFibGUpLAotICAgIHN0YXRlXyhXQUlUSU5HKSB7fQotCi0gIH5UYXNrKCkgewotICB9Ci0KLSAgdm9pZCBydW4oKSB7Ci0gICAgaWYgKHN0YXRlXyA9PSBFWEVDVVRJTkcpIHsKLSAgICAgIHJ1bm5hYmxlXy0+cnVuKCk7Ci0gICAgICBzdGF0ZV8gPSBDT01QTEVURTsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlXzsKLSAgZnJpZW5kIGNsYXNzIFRpbWVyTWFuYWdlcjo6RGlzcGF0Y2hlcjsKLSAgU1RBVEUgc3RhdGVfOwotfTsKLQotY2xhc3MgVGltZXJNYW5hZ2VyOjpEaXNwYXRjaGVyOiBwdWJsaWMgUnVubmFibGUgewotCi0gcHVibGljOgotICBEaXNwYXRjaGVyKFRpbWVyTWFuYWdlciogbWFuYWdlcikgOgotICAgIG1hbmFnZXJfKG1hbmFnZXIpIHt9Ci0KLSAgfkRpc3BhdGNoZXIoKSB7fQotCi0gIC8qKgotICAgKiBEaXNwYXRjaGVyIGVudHJ5IHBvaW50Ci0gICAqCi0gICAqIEFzIGxvbmcgYXMgZGlzcGF0Y2hlciB0aHJlYWQgaXMgcnVubmluZywgcHVsbCB0YXNrcyBvZmYgdGhlIHRhc2sgdGFza01hcF8KLSAgICogYW5kIGV4ZWN1dGUuCi0gICAqLwotICB2b2lkIHJ1bigpIHsKLSAgICB7Ci0gICAgICBTeW5jaHJvbml6ZWQgcyhtYW5hZ2VyXy0+bW9uaXRvcl8pOwotICAgICAgaWYgKG1hbmFnZXJfLT5zdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpTVEFSVElORykgewotICAgICAgICBtYW5hZ2VyXy0+c3RhdGVfID0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEOwotICAgICAgICBtYW5hZ2VyXy0+bW9uaXRvcl8ubm90aWZ5QWxsKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZG8gewotICAgICAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaW1lck1hbmFnZXI6OlRhc2s+ID4gZXhwaXJlZFRhc2tzOwotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhtYW5hZ2VyXy0+bW9uaXRvcl8pOwotICAgICAgICB0YXNrX2l0ZXJhdG9yIGV4cGlyZWRUYXNrRW5kOwotICAgICAgICBpbnQ2NF90IG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0gICAgICAgIHdoaWxlIChtYW5hZ2VyXy0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCAmJgotICAgICAgICAgICAgICAgKGV4cGlyZWRUYXNrRW5kID0gbWFuYWdlcl8tPnRhc2tNYXBfLnVwcGVyX2JvdW5kKG5vdykpID09IG1hbmFnZXJfLT50YXNrTWFwXy5iZWdpbigpKSB7Ci0gICAgICAgICAgaW50NjRfdCB0aW1lb3V0ID0gMExMOwotICAgICAgICAgIGlmICghbWFuYWdlcl8tPnRhc2tNYXBfLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIHRpbWVvdXQgPSBtYW5hZ2VyXy0+dGFza01hcF8uYmVnaW4oKS0+Zmlyc3QgLSBub3c7Ci0gICAgICAgICAgfQotICAgICAgICAgIGFzc2VydCgodGltZW91dCAhPSAwICYmIG1hbmFnZXJfLT50YXNrQ291bnRfID4gMCkgfHwgKHRpbWVvdXQgPT0gMCAmJiBtYW5hZ2VyXy0+dGFza0NvdW50XyA9PSAwKSk7Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1hbmFnZXJfLT5tb25pdG9yXy53YWl0KHRpbWVvdXQpOwotICAgICAgICAgIH0gY2F0Y2ggKFRpbWVkT3V0RXhjZXB0aW9uICZlKSB7fQotICAgICAgICAgIG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWFuYWdlcl8tPnN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQpIHsKLSAgICAgICAgICBmb3IgKHRhc2tfaXRlcmF0b3IgaXggPSBtYW5hZ2VyXy0+dGFza01hcF8uYmVnaW4oKTsgaXggIT0gZXhwaXJlZFRhc2tFbmQ7IGl4KyspIHsKLSAgICAgICAgICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyOjpUYXNrPiB0YXNrID0gaXgtPnNlY29uZDsKLSAgICAgICAgICAgIGV4cGlyZWRUYXNrcy5pbnNlcnQodGFzayk7Ci0gICAgICAgICAgICBpZiAodGFzay0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6VGFzazo6V0FJVElORykgewotICAgICAgICAgICAgICB0YXNrLT5zdGF0ZV8gPSBUaW1lck1hbmFnZXI6OlRhc2s6OkVYRUNVVElORzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hbmFnZXJfLT50YXNrQ291bnRfLS07Ci0gICAgICAgICAgfQotICAgICAgICAgIG1hbmFnZXJfLT50YXNrTWFwXy5lcmFzZShtYW5hZ2VyXy0+dGFza01hcF8uYmVnaW4oKSwgZXhwaXJlZFRhc2tFbmQpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUYXNrPiA+OjppdGVyYXRvciBpeCA9ICBleHBpcmVkVGFza3MuYmVnaW4oKTsgaXggIT0gZXhwaXJlZFRhc2tzLmVuZCgpOyBpeCsrKSB7Ci0gICAgICAgICgqaXgpLT5ydW4oKTsKLSAgICAgIH0KLQotICAgIH0gd2hpbGUgKG1hbmFnZXJfLT5zdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKTsKLQotICAgIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKG1hbmFnZXJfLT5tb25pdG9yXyk7Ci0gICAgICBpZiAobWFuYWdlcl8tPnN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlNUT1BQSU5HKSB7Ci0gICAgICAgIG1hbmFnZXJfLT5zdGF0ZV8gPSBUaW1lck1hbmFnZXI6OlNUT1BQRUQ7Ci0gICAgICAgIG1hbmFnZXJfLT5tb25pdG9yXy5ub3RpZnkoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0KLSBwcml2YXRlOgotICBUaW1lck1hbmFnZXIqIG1hbmFnZXJfOwotICBmcmllbmQgY2xhc3MgVGltZXJNYW5hZ2VyOwotfTsKLQotVGltZXJNYW5hZ2VyOjpUaW1lck1hbmFnZXIoKSA6Ci0gIHRhc2tDb3VudF8oMCksCi0gIHN0YXRlXyhUaW1lck1hbmFnZXI6OlVOSU5JVElBTElaRUQpLAotICBkaXNwYXRjaGVyXyhzaGFyZWRfcHRyPERpc3BhdGNoZXI+KG5ldyBEaXNwYXRjaGVyKHRoaXMpKSkgewotfQotCi0KLVRpbWVyTWFuYWdlcjo6flRpbWVyTWFuYWdlcigpIHsKLQotICAvLyBJZiB3ZSBoYXZlbid0IGJlZW4gZXhwbGljaXRseSBzdG9wcGVkLCBkbyBzbyBub3cuICBXZSBkb24ndCBuZWVkIHRvIGdyYWIKLSAgLy8gdGhlIG1vbml0b3IgaGVyZSwgc2luY2Ugc3RvcCBhbHJlYWR5IHRha2VzIGNhcmUgb2YgcmVlbnRyYW5jeS4KLQotICBpZiAoc3RhdGVfICE9IFNUT1BQRUQpIHsKLSAgICB0cnkgewotICAgICAgc3RvcCgpOwotICAgIH0gY2F0Y2goLi4uKSB7Ci0gICAgICB0aHJvdzsKLSAgICAgIC8vIHVob2gKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBUaW1lck1hbmFnZXI6OnN0YXJ0KCkgewotICBib29sIGRvU3RhcnQgPSBmYWxzZTsKLSAgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICBpZiAodGhyZWFkRmFjdG9yeV8gPT0gTlVMTCkgewotICAgICAgdGhyb3cgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIGlmIChzdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpVTklOSVRJQUxJWkVEKSB7Ci0gICAgICBzdGF0ZV8gPSBUaW1lck1hbmFnZXI6OlNUQVJUSU5HOwotICAgICAgZG9TdGFydCA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGRvU3RhcnQpIHsKLSAgICBkaXNwYXRjaGVyVGhyZWFkXyA9IHRocmVhZEZhY3RvcnlfLT5uZXdUaHJlYWQoZGlzcGF0Y2hlcl8pOwotICAgIGRpc3BhdGNoZXJUaHJlYWRfLT5zdGFydCgpOwotICB9Ci0KLSAgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICB3aGlsZSAoc3RhdGVfID09IFRpbWVyTWFuYWdlcjo6U1RBUlRJTkcpIHsKLSAgICAgIG1vbml0b3JfLndhaXQoKTsKLSAgICB9Ci0gICAgYXNzZXJ0KHN0YXRlXyAhPSBUaW1lck1hbmFnZXI6OlNUQVJUSU5HKTsKLSAgfQotfQotCi12b2lkIFRpbWVyTWFuYWdlcjo6c3RvcCgpIHsKLSAgYm9vbCBkb1N0b3AgPSBmYWxzZTsKLSAgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICBpZiAoc3RhdGVfID09IFRpbWVyTWFuYWdlcjo6VU5JTklUSUFMSVpFRCkgewotICAgICAgc3RhdGVfID0gVGltZXJNYW5hZ2VyOjpTVE9QUEVEOwotICAgIH0gZWxzZSBpZiAoc3RhdGVfICE9IFNUT1BQSU5HICYmICBzdGF0ZV8gIT0gU1RPUFBFRCkgewotICAgICAgZG9TdG9wID0gdHJ1ZTsKLSAgICAgIHN0YXRlXyA9IFNUT1BQSU5HOwotICAgICAgbW9uaXRvcl8ubm90aWZ5QWxsKCk7Ci0gICAgfQotICAgIHdoaWxlIChzdGF0ZV8gIT0gU1RPUFBFRCkgewotICAgICAgbW9uaXRvcl8ud2FpdCgpOwotICAgIH0KLSAgfQotCi0gIGlmIChkb1N0b3ApIHsKLSAgICAvLyBDbGVhbiB1cCBhbnkgb3V0c3RhbmRpbmcgdGFza3MKLSAgICB0YXNrTWFwXy5jbGVhcigpOwotCi0gICAgLy8gUmVtb3ZlIGRpc3BhdGNoZXIncyByZWZlcmVuY2UgdG8gdXMuCi0gICAgZGlzcGF0Y2hlcl8tPm1hbmFnZXJfID0gTlVMTDsKLSAgfQotfQotCi1zaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IFRpbWVyTWFuYWdlcjo6dGhyZWFkRmFjdG9yeSgpIGNvbnN0IHsKLSAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICByZXR1cm4gdGhyZWFkRmFjdG9yeV87Ci19Ci0KLXZvaWQgVGltZXJNYW5hZ2VyOjp0aHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8Y29uc3QgVGhyZWFkRmFjdG9yeT4gIHZhbHVlKSB7Ci0gIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgdGhyZWFkRmFjdG9yeV8gPSB2YWx1ZTsKLX0KLQotc2l6ZV90IFRpbWVyTWFuYWdlcjo6dGFza0NvdW50KCkgY29uc3QgewotICByZXR1cm4gdGFza0NvdW50XzsKLX0KLQotdm9pZCBUaW1lck1hbmFnZXI6OmFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBpbnQ2NF90IHRpbWVvdXQpIHsKLSAgaW50NjRfdCBub3cgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotICB0aW1lb3V0ICs9IG5vdzsKLQotICB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIGlmIChzdGF0ZV8gIT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKSB7Ci0gICAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGUgdGFzayBtYXAgaXMgZW1wdHksIHdlIHdpbGwga2ljayB0aGUgZGlzcGF0Y2hlciBmb3Igc3VyZS4gT3RoZXJ3aXNlLCB3ZSBraWNrIGhpbQotICAgIC8vIGlmIHRoZSBleHBpcmF0aW9uIHRpbWUgaXMgc2hvcnRlciB0aGFuIHRoZSBjdXJyZW50IHZhbHVlLiBOZWVkIHRvIHRlc3QgYmVmb3JlIHdlIGluc2VydCwKLSAgICAvLyBiZWNhdXNlIHRoZSBuZXcgdGFzayBtaWdodCBpbnNlcnQgYXQgdGhlIGZyb250LgotICAgIGJvb2wgbm90aWZ5UmVxdWlyZWQgPSAodGFza0NvdW50XyA9PSAwKSA/IHRydWUgOiB0aW1lb3V0IDwgdGFza01hcF8uYmVnaW4oKS0+Zmlyc3Q7Ci0KLSAgICB0YXNrQ291bnRfKys7Ci0gICAgdGFza01hcF8uaW5zZXJ0KHN0ZDo6cGFpcjxpbnQ2NF90LCBzaGFyZWRfcHRyPFRhc2s+ID4odGltZW91dCwgc2hhcmVkX3B0cjxUYXNrPihuZXcgVGFzayh0YXNrKSkpKTsKLQotICAgIC8vIElmIHRoZSB0YXNrIG1hcCB3YXMgZW1wdHksIG9yIGlmIHdlIGhhdmUgYW4gZXhwaXJhdGlvbiB0aGF0IGlzIGVhcmxpZXIKLSAgICAvLyB0aGFuIGFueSBwcmV2aW91c2x5IHNlZW4sIGtpY2sgdGhlIGRpc3BhdGNoZXIgc28gaXQgY2FuIHVwZGF0ZSBpdHMKLSAgICAvLyB0aW1lb3V0Ci0gICAgaWYgKG5vdGlmeVJlcXVpcmVkKSB7Ci0gICAgICBtb25pdG9yXy5ub3RpZnkoKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBUaW1lck1hbmFnZXI6OmFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMmIHZhbHVlKSB7Ci0KLSAgaW50NjRfdCBleHBpcmF0aW9uOwotICBVdGlsOjp0b01pbGxpc2Vjb25kcyhleHBpcmF0aW9uLCB2YWx1ZSk7Ci0KLSAgaW50NjRfdCBub3cgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gIGlmIChleHBpcmF0aW9uIDwgbm93KSB7Ci0gICAgdGhyb3cgIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOwotICB9Ci0KLSAgYWRkKHRhc2ssIGV4cGlyYXRpb24gLSBub3cpOwotfQotCi0KLXZvaWQgVGltZXJNYW5hZ2VyOjpyZW1vdmUoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgewotICAodm9pZCkgdGFzazsKLSAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICBpZiAoc3RhdGVfICE9IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCkgewotICAgIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICB9Ci19Ci0KLVRpbWVyTWFuYWdlcjo6U1RBVEUgVGltZXJNYW5hZ2VyOjpzdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlXzsgfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ci0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oIGIvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MDVkZGIuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVElNRVJNQU5BR0VSX0hfCi0jZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVElNRVJNQU5BR0VSX0hfIDEKLQotI2luY2x1ZGUgIkV4Y2VwdGlvbi5oIgotI2luY2x1ZGUgIk1vbml0b3IuaCIKLSNpbmNsdWRlICJUaHJlYWQuaCIKLQotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotLyoqCi0gKiBUaW1lciBNYW5hZ2VyCi0gKgotICogVGhpcyBjbGFzcyBkaXNwYXRjaGVzIHRpbWVyIHRhc2tzIHdoZW4gdGhleSBmYWxsIGR1ZS4KLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBUaW1lck1hbmFnZXIgewotCi0gcHVibGljOgotCi0gIFRpbWVyTWFuYWdlcigpOwotCi0gIHZpcnR1YWwgflRpbWVyTWFuYWdlcigpOwotCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8Y29uc3QgVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSgpIGNvbnN0OwotCi0gIHZpcnR1YWwgdm9pZCB0aHJlYWRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHZhbHVlKTsKLQotICAvKioKLSAgICogU3RhcnRzIHRoZSB0aW1lciBtYW5hZ2VyIHNlcnZpY2UKLSAgICoKLSAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gTWlzc2luZyB0aHJlYWQgZmFjdG9yeSBhdHRyaWJ1dGUKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBzdGFydCgpOwotCi0gIC8qKgotICAgKiBTdG9wcyB0aGUgdGltZXIgbWFuYWdlciBzZXJ2aWNlCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgc3RvcCgpOwotCi0gIHZpcnR1YWwgc2l6ZV90IHRhc2tDb3VudCgpIGNvbnN0IDsKLQotICAvKioKLSAgICogQWRkcyBhIHRhc2sgdG8gYmUgZXhlY3V0ZWQgYXQgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUgYnkgYSB3b3JrZXIgdGhyZWFkLgotICAgKgotICAgKiBAcGFyYW0gdGFzayBUaGUgdGFzayB0byBleGVjdXRlCi0gICAqIEBwYXJhbSB0aW1lb3V0IFRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGJlZm9yZSBleGVjdXRpbmcgdGFzawotICAgKi8KLSAgdmlydHVhbCB2b2lkIGFkZChib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywgaW50NjRfdCB0aW1lb3V0KTsKLQotICAvKioKLSAgICogQWRkcyBhIHRhc2sgdG8gYmUgZXhlY3V0ZWQgYXQgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUgYnkgYSB3b3JrZXIgdGhyZWFkLgotICAgKgotICAgKiBAcGFyYW0gdGFzayBUaGUgdGFzayB0byBleGVjdXRlCi0gICAqIEBwYXJhbSB0aW1lb3V0IEFic29sdXRlIHRpbWUgaW4gdGhlIGZ1dHVyZSB0byBleGVjdXRlIHRhc2suCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgYWRkKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMmIHRpbWVvdXQpOwotCi0gIC8qKgotICAgKiBSZW1vdmVzIGEgcGVuZGluZyB0YXNrCi0gICAqCi0gICAqIEB0aHJvd3MgTm9TdWNoVGFza0V4Y2VwdGlvbiBTcGVjaWZpZWQgdGFzayBkb2Vzbid0IGV4aXN0LiBJdCB3YXMgZWl0aGVyCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQgYWxyZWFkeSBvciB0aGlzIGNhbGwgd2FzIG1hZGUgZm9yIGEKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sgdGhhdCB3YXMgbmV2ZXIgYWRkZWQgdG8gdGhpcyB0aW1lcgotICAgKgotICAgKiBAdGhyb3dzIFVuY2FuY2VsbGFibGVUYXNrRXhjZXB0aW9uIFNwZWNpZmllZCB0YXNrIGlzIGFscmVhZHkgYmVpbmcKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZCBvciBoYXMgY29tcGxldGVkIGV4ZWN1dGlvbi4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCByZW1vdmUoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spOwotCi0gIGVudW0gU1RBVEUgewotICAgIFVOSU5JVElBTElaRUQsCi0gICAgU1RBUlRJTkcsCi0gICAgU1RBUlRFRCwKLSAgICBTVE9QUElORywKLSAgICBTVE9QUEVECi0gIH07Ci0KLSAgdmlydHVhbCBTVEFURSBzdGF0ZSgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8Y29uc3QgVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeV87Ci0gIGNsYXNzIFRhc2s7Ci0gIGZyaWVuZCBjbGFzcyBUYXNrOwotICBzdGQ6Om11bHRpbWFwPGludDY0X3QsIGJvb3N0OjpzaGFyZWRfcHRyPFRhc2s+ID4gdGFza01hcF87Ci0gIHNpemVfdCB0YXNrQ291bnRfOwotICBNb25pdG9yIG1vbml0b3JfOwotICBTVEFURSBzdGF0ZV87Ci0gIGNsYXNzIERpc3BhdGNoZXI7Ci0gIGZyaWVuZCBjbGFzcyBEaXNwYXRjaGVyOwotICBib29zdDo6c2hhcmVkX3B0cjxEaXNwYXRjaGVyPiBkaXNwYXRjaGVyXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBkaXNwYXRjaGVyVGhyZWFkXzsKLSAgdHlwZWRlZiBzdGQ6Om11bHRpbWFwPGludDY0X3QsIGJvb3N0OjpzaGFyZWRfcHRyPFRpbWVyTWFuYWdlcjo6VGFzaz4gPjo6aXRlcmF0b3IgdGFza19pdGVyYXRvcjsKLSAgdHlwZWRlZiBzdGQ6OnBhaXI8dGFza19pdGVyYXRvciwgdGFza19pdGVyYXRvcj4gdGFza19yYW5nZTsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9USU1FUk1BTkFHRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1V0aWwuY3BwIGIvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVXRpbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMjM0NDkuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVXRpbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJVdGlsLmgiCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoSEFWRV9DTE9DS19HRVRUSU1FKQotI2luY2x1ZGUgPHRpbWUuaD4KLSNlbGlmIGRlZmluZWQoSEFWRV9HRVRUSU1FT0ZEQVkpCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbmRpZiAvLyBkZWZpbmVkKEhBVkVfQ0xPQ0tfR0VUVElNRSkKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi1pbnQ2NF90IFV0aWw6OmN1cnJlbnRUaW1lVGlja3MoaW50NjRfdCB0aWNrc1BlclNlYykgewotICBpbnQ2NF90IHJlc3VsdDsKLQotI2lmIGRlZmluZWQoSEFWRV9DTE9DS19HRVRUSU1FKQotICBzdHJ1Y3QgdGltZXNwZWMgbm93OwotICBpbnQgcmV0ID0gY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJm5vdyk7Ci0gIGFzc2VydChyZXQgPT0gMCk7Ci0gIHRvVGlja3MocmVzdWx0LCBub3csIHRpY2tzUGVyU2VjKTsKLSNlbGlmIGRlZmluZWQoSEFWRV9HRVRUSU1FT0ZEQVkpCi0gIHN0cnVjdCB0aW1ldmFsIG5vdzsKLSAgaW50IHJldCA9IGdldHRpbWVvZmRheSgmbm93LCBOVUxMKTsKLSAgYXNzZXJ0KHJldCA9PSAwKTsKLSAgdG9UaWNrcyhyZXN1bHQsIG5vdywgdGlja3NQZXJTZWMpOwotI2Vsc2UKLSNlcnJvciAiTm8gaGlnaC1wcmVjaXNpb24gY2xvY2sgaXMgYXZhaWxhYmxlLiIKLSNlbmRpZiAvLyBkZWZpbmVkKEhBVkVfQ0xPQ0tfR0VUVElNRSkKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9VdGlsLmggYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9VdGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YmQyNWUuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1VUSUxfSF8KLSNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9VVElMX0hfIDEKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLS8qKgotICogVXRpbGl0eSBtZXRob2RzCi0gKgotICogVGhpcyBjbGFzcyBjb250YWlucyBiYXNpYyB1dGlsaXR5IG1ldGhvZHMgZm9yIGNvbnZlcnRpbmcgdGltZSBmb3JtYXRzLAotICogYW5kIG90aGVyIGNvbW1vbiBwbGF0Zm9ybS1kZXBlbmRlbnQgY29uY3VycmVuY3kgb3BlcmF0aW9ucy4KLSAqIEl0IHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gQVBJIGhlYWRlcnMgZm9yIG90aGVyIGNvbmN1cnJlbmN5IGxpYnJhcnkKLSAqIGhlYWRlcnMsIHNpbmNlIGl0IHdpbGwsIGJ5IGRlZmluaXRpb24sIHB1bGwgaW4gYWxsIHNvcnRzIG9mIGhvcnJpZAotICogcGxhdGZvcm0gZGVwZW5kZW50IHN0dWZmLiAgUmF0aGVyIGl0IHNob3VsZCBiZSBpbmx1ZGVkIGRpcmVjdGx5IGluCi0gKiBjb25jdXJyZW5jeSBsaWJyYXJ5IGltcGxlbWVudGF0aW9uIHNvdXJjZS4KLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBVdGlsIHsKLQotICBzdGF0aWMgY29uc3QgaW50NjRfdCBOU19QRVJfUyA9IDEwMDAwMDAwMDBMTDsKLSAgc3RhdGljIGNvbnN0IGludDY0X3QgVVNfUEVSX1MgPSAxMDAwMDAwTEw7Ci0gIHN0YXRpYyBjb25zdCBpbnQ2NF90IE1TX1BFUl9TID0gMTAwMExMOwotCi0gIHN0YXRpYyBjb25zdCBpbnQ2NF90IE5TX1BFUl9NUyA9IE5TX1BFUl9TIC8gTVNfUEVSX1M7Ci0gIHN0YXRpYyBjb25zdCBpbnQ2NF90IE5TX1BFUl9VUyA9IE5TX1BFUl9TIC8gVVNfUEVSX1M7Ci0gIHN0YXRpYyBjb25zdCBpbnQ2NF90IFVTX1BFUl9NUyA9IFVTX1BFUl9TIC8gTVNfUEVSX1M7Ci0KLSBwdWJsaWM6Ci0KLSAgLyoqCi0gICAqIENvbnZlcnRzIG1pbGxpc2Vjb25kIHRpbWVzdGFtcCBpbnRvIGEgdGltZXNwZWMgc3RydWN0Ci0gICAqCi0gICAqIEBwYXJhbSBzdHJ1Y3QgdGltZXNwZWMmIHJlc3VsdAotICAgKiBAcGFyYW0gdGltZSBvciBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMKLSAgICovCi0gIHN0YXRpYyB2b2lkIHRvVGltZXNwZWMoc3RydWN0IHRpbWVzcGVjJiByZXN1bHQsIGludDY0X3QgdmFsdWUpIHsKLSAgICByZXN1bHQudHZfc2VjID0gdmFsdWUgLyBNU19QRVJfUzsgLy8gbXMgdG8gcwotICAgIHJlc3VsdC50dl9uc2VjID0gKHZhbHVlICUgTVNfUEVSX1MpICogTlNfUEVSX01TOyAvLyBtcyB0byBucwotICB9Ci0KLSAgc3RhdGljIHZvaWQgdG9UaW1ldmFsKHN0cnVjdCB0aW1ldmFsJiByZXN1bHQsIGludDY0X3QgdmFsdWUpIHsKLSAgICByZXN1bHQudHZfc2VjID0gdmFsdWUgLyBNU19QRVJfUzsgLy8gbXMgdG8gcwotICAgIHJlc3VsdC50dl91c2VjID0gKHZhbHVlICUgTVNfUEVSX1MpICogVVNfUEVSX01TOyAvLyBtcyB0byB1cwotICB9Ci0KLSAgc3RhdGljIHZvaWQgdG9UaWNrcyhpbnQ2NF90JiByZXN1bHQsIGludDY0X3Qgc2VjcywgaW50NjRfdCBvbGRUaWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9sZFRpY2tzUGVyU2VjLCBpbnQ2NF90IG5ld1RpY2tzUGVyU2VjKSB7Ci0gICAgcmVzdWx0ID0gc2VjcyAqIG5ld1RpY2tzUGVyU2VjOwotICAgIHJlc3VsdCArPSBvbGRUaWNrcyAqIG5ld1RpY2tzUGVyU2VjIC8gb2xkVGlja3NQZXJTZWM7Ci0KLSAgICBpbnQ2NF90IG9sZFBlck5ldyA9IG9sZFRpY2tzUGVyU2VjIC8gbmV3VGlja3NQZXJTZWM7Ci0gICAgaWYgKG9sZFBlck5ldyAmJiAoKG9sZFRpY2tzICUgb2xkUGVyTmV3KSA+PSAob2xkUGVyTmV3IC8gMikpKSB7Ci0gICAgICArK3Jlc3VsdDsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIENvbnZlcnRzIHN0cnVjdCB0aW1lc3BlYyB0byBhcmJpdHJhcnktc2l6ZWQgdGlja3Mgc2luY2UgZXBvY2gKLSAgICovCi0gIHN0YXRpYyB2b2lkIHRvVGlja3MoaW50NjRfdCYgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aWNrc1BlclNlYykgewotICAgIHJldHVybiB0b1RpY2tzKHJlc3VsdCwgdmFsdWUudHZfc2VjLCB2YWx1ZS50dl9uc2VjLCBOU19QRVJfUywgdGlja3NQZXJTZWMpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnRzIHN0cnVjdCB0aW1ldmFsIHRvIGFyYml0cmFyeS1zaXplZCB0aWNrcyBzaW5jZSBlcG9jaAotICAgKi8KLSAgc3RhdGljIHZvaWQgdG9UaWNrcyhpbnQ2NF90JiByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWV2YWwmIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGlja3NQZXJTZWMpIHsKLSAgICByZXR1cm4gdG9UaWNrcyhyZXN1bHQsIHZhbHVlLnR2X3NlYywgdmFsdWUudHZfdXNlYywgVVNfUEVSX1MsIHRpY2tzUGVyU2VjKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZXJ0cyBzdHJ1Y3QgdGltZXNwZWMgdG8gbWlsbGlzZWNvbmRzCi0gICAqLwotICBzdGF0aWMgdm9pZCB0b01pbGxpc2Vjb25kcyhpbnQ2NF90JiByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyYgdmFsdWUpIHsKLSAgICByZXR1cm4gdG9UaWNrcyhyZXN1bHQsIHZhbHVlLCBNU19QRVJfUyk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVydHMgc3RydWN0IHRpbWV2YWwgdG8gbWlsbGlzZWNvbmRzCi0gICAqLwotICBzdGF0aWMgdm9pZCB0b01pbGxpc2Vjb25kcyhpbnQ2NF90JiByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB2YWx1ZSkgewotICAgIHJldHVybiB0b1RpY2tzKHJlc3VsdCwgdmFsdWUsIE1TX1BFUl9TKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZXJ0cyBzdHJ1Y3QgdGltZXNwZWMgdG8gbWljcm9zZWNvbmRzCi0gICAqLwotICBzdGF0aWMgdm9pZCB0b1VzZWMoaW50NjRfdCYgcmVzdWx0LCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMmIHZhbHVlKSB7Ci0gICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCB2YWx1ZSwgVVNfUEVSX1MpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnRzIHN0cnVjdCB0aW1ldmFsIHRvIG1pY3Jvc2Vjb25kcwotICAgKi8KLSAgc3RhdGljIHZvaWQgdG9Vc2VjKGludDY0X3QmIHJlc3VsdCwgY29uc3Qgc3RydWN0IHRpbWV2YWwmIHZhbHVlKSB7Ci0gICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCB2YWx1ZSwgVVNfUEVSX1MpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBjdXJyZW50IHRpbWUgYXMgYSBudW1iZXIgb2YgYXJiaXRyYXJ5LXNpemUgdGlja3MgZnJvbSBlcG9jaAotICAgKi8KLSAgc3RhdGljIGludDY0X3QgY3VycmVudFRpbWVUaWNrcyhpbnQ2NF90IHRpY2tzUGVyU2VjKTsKLQotICAvKioKLSAgICogR2V0IGN1cnJlbnQgdGltZSBhcyBtaWxsaXNlY29uZHMgZnJvbSBlcG9jaAotICAgKi8KLSAgc3RhdGljIGludDY0X3QgY3VycmVudFRpbWUoKSB7IHJldHVybiBjdXJyZW50VGltZVRpY2tzKE1TX1BFUl9TKTsgfQotCi0gIC8qKgotICAgKiBHZXQgY3VycmVudCB0aW1lIGFzIG1pY3JvcyBmcm9tIGVwb2NoCi0gICAqLwotICBzdGF0aWMgaW50NjRfdCBjdXJyZW50VGltZVVzZWMoKSB7IHJldHVybiBjdXJyZW50VGltZVRpY2tzKFVTX1BFUl9TKTsgfQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1VUSUxfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGVzdHMuY3BwIGIvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvdGVzdC9UZXN0cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MGJiODguLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvdGVzdC9UZXN0cy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgIlRocmVhZEZhY3RvcnlUZXN0cy5oIgotI2luY2x1ZGUgIlRpbWVyTWFuYWdlclRlc3RzLmgiCi0jaW5jbHVkZSAiVGhyZWFkTWFuYWdlclRlc3RzLmgiCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotCi0gIHN0ZDo6c3RyaW5nIGFyZzsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gIGFyZ3MoYXJnYyAtIDEgPiAxID8gYXJnYyAtIDEgOiAxKTsKLQotICBhcmdzWzBdID0gImFsbCI7Ci0KLSAgZm9yIChpbnQgaXggPSAxOyBpeCA8IGFyZ2M7IGl4KyspIHsKLSAgICBhcmdzW2l4IC0gMV0gPSBzdGQ6OnN0cmluZyhhcmd2W2l4XSk7Ci0gIH0KLQotICBib29sIHJ1bkFsbCA9IGFyZ3NbMF0uY29tcGFyZSgiYWxsIikgPT0gMDsKLQotICBpZiAocnVuQWxsIHx8IGFyZ3NbMF0uY29tcGFyZSgidGhyZWFkLWZhY3RvcnkiKSA9PSAwKSB7Ci0KLSAgICBUaHJlYWRGYWN0b3J5VGVzdHMgdGhyZWFkRmFjdG9yeVRlc3RzOwotCi0gICAgc3RkOjpjb3V0IDw8ICJUaHJlYWRGYWN0b3J5IHRlc3RzLi4uIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICBzaXplX3QgY291bnQgPSAgMTAwMDsKLSAgICBzaXplX3QgZmxvb2RMb29wcyA9ICAxOwotICAgIHNpemVfdCBmbG9vZENvdW50ID0gIDEwMDAwMDsKLQotICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZEZhY3RvcnkgcmVhcCBOIHRocmVhZHMgdGVzdDogTiA9ICIgPDwgY291bnQgPDwgc3RkOjplbmRsOwotCi0gICAgYXNzZXJ0KHRocmVhZEZhY3RvcnlUZXN0cy5yZWFwTlRocmVhZHMoY291bnQpKTsKLQotICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZEZhY3RvcnkgZmxvb2ROIHRocmVhZHMgdGVzdDogTiA9ICIgPDwgZmxvb2RDb3VudCA8PCBzdGQ6OmVuZGw7Ci0KLSAgICBhc3NlcnQodGhyZWFkRmFjdG9yeVRlc3RzLmZsb29kTlRlc3QoZmxvb2RMb29wcywgZmxvb2RDb3VudCkpOwotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkRmFjdG9yeSBzeW5jaHJvbm91cyBzdGFydCB0ZXN0IiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICBhc3NlcnQodGhyZWFkRmFjdG9yeVRlc3RzLnN5bmNoU3RhcnRUZXN0KCkpOwotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkRmFjdG9yeSBtb25pdG9yIHRpbWVvdXQgdGVzdCIgPDwgc3RkOjplbmRsOwotCi0gICAgYXNzZXJ0KHRocmVhZEZhY3RvcnlUZXN0cy5tb25pdG9yVGltZW91dFRlc3QoKSk7Ci0gIH0KLQotICBpZiAocnVuQWxsIHx8IGFyZ3NbMF0uY29tcGFyZSgidXRpbCIpID09IDApIHsKLQotICAgIHN0ZDo6Y291dCA8PCAiVXRpbCB0ZXN0cy4uLiIgPDwgc3RkOjplbmRsOwotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0VXRpbCBtaW5pbXVtIHRpbWUiIDw8IHN0ZDo6ZW5kbDsKLQotICAgIGludDY0X3QgdGltZTAwID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLSAgICBpbnQ2NF90IHRpbWUwMSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdE1pbmltdW0gdGltZTogIiA8PCB0aW1lMDEgLSB0aW1lMDAgPDwgIm1zIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICB0aW1lMDAgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotICAgIHRpbWUwMSA9IHRpbWUwMDsKLSAgICBzaXplX3QgY291bnQgPSAwOwotCi0gICAgd2hpbGUgKHRpbWUwMSA8IHRpbWUwMCArIDEwKSB7Ci0gICAgICBjb3VudCsrOwotICAgICAgdGltZTAxID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLSAgICB9Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdHNjYWxsIHBlciBtczogIiA8PCBjb3VudCAvICh0aW1lMDEgLSB0aW1lMDApIDw8IHN0ZDo6ZW5kbDsKLSAgfQotCi0KLSAgaWYgKHJ1bkFsbCB8fCBhcmdzWzBdLmNvbXBhcmUoInRpbWVyLW1hbmFnZXIiKSA9PSAwKSB7Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlRpbWVyTWFuYWdlciB0ZXN0cy4uLiIgPDwgc3RkOjplbmRsOwotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0VGltZXJNYW5hZ2VyIHRlc3QwMCIgPDwgc3RkOjplbmRsOwotCi0gICAgVGltZXJNYW5hZ2VyVGVzdHMgdGltZXJNYW5hZ2VyVGVzdHM7Ci0KLSAgICBhc3NlcnQodGltZXJNYW5hZ2VyVGVzdHMudGVzdDAwKCkpOwotICB9Ci0KLSAgaWYgKHJ1bkFsbCB8fCBhcmdzWzBdLmNvbXBhcmUoInRocmVhZC1tYW5hZ2VyIikgPT0gMCkgewotCi0gICAgc3RkOjpjb3V0IDw8ICJUaHJlYWRNYW5hZ2VyIHRlc3RzLi4uIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICB7Ci0KLSAgICAgIHNpemVfdCB3b3JrZXJDb3VudCA9IDEwMDsKLQotICAgICAgc2l6ZV90IHRhc2tDb3VudCA9IDEwMDAwMDsKLQotICAgICAgaW50NjRfdCBkZWxheSA9IDEwTEw7Ci0KLSAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZE1hbmFnZXIgbG9hZCB0ZXN0OiB3b3JrZXIgY291bnQ6ICIgPDwgd29ya2VyQ291bnQgPDwgIiB0YXNrIGNvdW50OiAiIDw8IHRhc2tDb3VudCA8PCAiIGRlbGF5OiAiIDw8IGRlbGF5IDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgVGhyZWFkTWFuYWdlclRlc3RzIHRocmVhZE1hbmFnZXJUZXN0czsKLQotICAgICAgYXNzZXJ0KHRocmVhZE1hbmFnZXJUZXN0cy5sb2FkVGVzdCh0YXNrQ291bnQsIGRlbGF5LCB3b3JrZXJDb3VudCkpOwotCi0gICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGJsb2NrIHRlc3Q6IHdvcmtlciBjb3VudDogIiA8PCB3b3JrZXJDb3VudCA8PCAiIGRlbGF5OiAiIDw8IGRlbGF5IDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgYXNzZXJ0KHRocmVhZE1hbmFnZXJUZXN0cy5ibG9ja1Rlc3QoZGVsYXksIHdvcmtlckNvdW50KSk7Ci0KLSAgICB9Ci0gIH0KLQotICBpZiAocnVuQWxsIHx8IGFyZ3NbMF0uY29tcGFyZSgidGhyZWFkLW1hbmFnZXItYmVuY2htYXJrIikgPT0gMCkgewotCi0gICAgc3RkOjpjb3V0IDw8ICJUaHJlYWRNYW5hZ2VyIGJlbmNobWFyayB0ZXN0cy4uLiIgPDwgc3RkOjplbmRsOwotCi0gICAgewotCi0gICAgICBzaXplX3QgbWluV29ya2VyQ291bnQgPSAyOwotCi0gICAgICBzaXplX3QgbWF4V29ya2VyQ291bnQgPSA1MTI7Ci0KLSAgICAgIHNpemVfdCB0YXNrc1BlcldvcmtlciA9IDEwMDA7Ci0KLSAgICAgIGludDY0X3QgZGVsYXkgPSAxMExMOwotCi0gICAgICBmb3IgKHNpemVfdCB3b3JrZXJDb3VudCA9IG1pbldvcmtlckNvdW50OyB3b3JrZXJDb3VudCA8IG1heFdvcmtlckNvdW50OyB3b3JrZXJDb3VudCo9IDIpIHsKLQotICAgICAgICBzaXplX3QgdGFza0NvdW50ID0gd29ya2VyQ291bnQgKiB0YXNrc1BlcldvcmtlcjsKLQotICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGxvYWQgdGVzdDogd29ya2VyIGNvdW50OiAiIDw8IHdvcmtlckNvdW50IDw8ICIgdGFzayBjb3VudDogIiA8PCB0YXNrQ291bnQgPDwgIiBkZWxheTogIiA8PCBkZWxheSA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAgICAgVGhyZWFkTWFuYWdlclRlc3RzIHRocmVhZE1hbmFnZXJUZXN0czsKLQotICAgICAgICB0aHJlYWRNYW5hZ2VyVGVzdHMubG9hZFRlc3QodGFza0NvdW50LCBkZWxheSwgd29ya2VyQ291bnQpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvdGVzdC9UaHJlYWRGYWN0b3J5VGVzdHMuaCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGhyZWFkRmFjdG9yeVRlc3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNzk3NmUuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvdGVzdC9UaHJlYWRGYWN0b3J5VGVzdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjb25maWcuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9UaHJlYWQuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9Nb25pdG9yLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvVXRpbC5oPgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c2V0PgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7IG5hbWVzcGFjZSB0ZXN0IHsKLQotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwotCi0vKioKLSAqIFRocmVhZE1hbmFnZXJUZXN0cyBjbGFzcwotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIFRocmVhZEZhY3RvcnlUZXN0cyB7Ci0KLXB1YmxpYzoKLQotICBzdGF0aWMgY29uc3QgZG91YmxlIEVSUk9SOwotCi0gIGNsYXNzIFRhc2s6IHB1YmxpYyBSdW5uYWJsZSB7Ci0KLSAgcHVibGljOgotCi0gICAgVGFzaygpIHt9Ci0KLSAgICB2b2lkIHJ1bigpIHsKLSAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0SGVsbG8gV29ybGQiIDw8IHN0ZDo6ZW5kbDsKLSAgICB9Ci0gIH07Ci0KLSAgLyoqCi0gICAqIEhlbGxvIHdvcmxkIHRlc3QKLSAgICovCi0gIGJvb2wgaGVsbG9Xb3JsZFRlc3QoKSB7Ci0KLSAgICBQb3NpeFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSA9IFBvc2l4VGhyZWFkRmFjdG9yeSgpOwotCi0gICAgc2hhcmVkX3B0cjxUYXNrPiB0YXNrID0gc2hhcmVkX3B0cjxUYXNrPihuZXcgVGhyZWFkRmFjdG9yeVRlc3RzOjpUYXNrKCkpOwotCi0gICAgc2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZCA9IHRocmVhZEZhY3RvcnkubmV3VGhyZWFkKHRhc2spOwotCi0gICAgdGhyZWFkLT5zdGFydCgpOwotCi0gICAgdGhyZWFkLT5qb2luKCk7Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFN1Y2Nlc3MhIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFwIE4gdGhyZWFkcwotICAgKi8KLSAgY2xhc3MgUmVhcE5UYXNrOiBwdWJsaWMgUnVubmFibGUgewotCi0gICBwdWJsaWM6Ci0KLSAgICBSZWFwTlRhc2soTW9uaXRvciYgbW9uaXRvciwgaW50JiBhY3RpdmVDb3VudCkgOgotICAgICAgX21vbml0b3IobW9uaXRvciksCi0gICAgICBfY291bnQoYWN0aXZlQ291bnQpIHt9Ci0KLSAgICB2b2lkIHJ1bigpIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKLQotICAgICAgX2NvdW50LS07Ci0KLSAgICAgIC8vc3RkOjpjb3V0IDw8ICJcdFx0XHR0aHJlYWQgY291bnQ6ICIgPDwgX2NvdW50IDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgaWYgKF9jb3VudCA9PSAwKSB7Ci0gICAgICAgIF9tb25pdG9yLm5vdGlmeSgpOwotICAgICAgfQotICAgIH0KLQotICAgIE1vbml0b3ImIF9tb25pdG9yOwotCi0gICAgaW50JiBfY291bnQ7Ci0gIH07Ci0KLSAgYm9vbCByZWFwTlRocmVhZHMoaW50IGxvb3A9MSwgaW50IGNvdW50PTEwKSB7Ci0KLSAgICBQb3NpeFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSA9ICBQb3NpeFRocmVhZEZhY3RvcnkoKTsKLQotICAgIE1vbml0b3IqIG1vbml0b3IgPSBuZXcgTW9uaXRvcigpOwotCi0gICAgZm9yKGludCBsaXggPSAwOyBsaXggPCBsb29wOyBsaXgrKykgewotCi0gICAgICBpbnQqIGFjdGl2ZUNvdW50ICA9IG5ldyBpbnQoY291bnQpOwotCi0gICAgICBzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPiB0aHJlYWRzOwotCi0gICAgICBpbnQgdGl4OwotCi0gICAgICBmb3IgKHRpeCA9IDA7IHRpeCA8IGNvdW50OyB0aXgrKykgewotICAgICAgICB0cnkgewotICAgICAgICAgIHRocmVhZHMuaW5zZXJ0KHRocmVhZEZhY3RvcnkubmV3VGhyZWFkKHNoYXJlZF9wdHI8UnVubmFibGU+KG5ldyBSZWFwTlRhc2soKm1vbml0b3IsICphY3RpdmVDb3VudCkpKSk7Ci0gICAgICAgIH0gY2F0Y2goU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24mIGUpIHsKLSAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZhaWxlZCB0byBjcmVhdGUgIiA8PCBsaXggKiBjb3VudCArIHRpeCA8PCAiIHRocmVhZCAiIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHRpeCA9IDA7Ci0gICAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSB0aHJlYWRzLmJlZ2luKCk7IHRocmVhZCAhPSB0aHJlYWRzLmVuZCgpOyB0aXgrKywgKyt0aHJlYWQpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICgqdGhyZWFkKS0+c3RhcnQoKTsKLSAgICAgICAgfSBjYXRjaChTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbiYgZSkgewotICAgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0ZmFpbGVkIHRvIHN0YXJ0ICAiIDw8IGxpeCAqIGNvdW50ICsgdGl4IDw8ICIgdGhyZWFkICIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOwotICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcygqbW9uaXRvcik7Ci0gICAgICAgIHdoaWxlICgqYWN0aXZlQ291bnQgPiAwKSB7Ci0gICAgICAgICAgbW9uaXRvci0+d2FpdCgxMDAwKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZGVsZXRlIGFjdGl2ZUNvdW50OwotICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRyZWFwZWQgIiA8PCBsaXggKiBjb3VudCA8PCAiIHRocmVhZHMiIDw8IHN0ZDo6ZW5kbDsKLSAgICB9Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFN1Y2Nlc3MhIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGNsYXNzIFN5bmNoU3RhcnRUYXNrOiBwdWJsaWMgUnVubmFibGUgewotCi0gICBwdWJsaWM6Ci0KLSAgICBlbnVtIFNUQVRFIHsKLSAgICAgIFVOSU5JVElBTElaRUQsCi0gICAgICBTVEFSVElORywKLSAgICAgIFNUQVJURUQsCi0gICAgICBTVE9QUElORywKLSAgICAgIFNUT1BQRUQKLSAgICB9OwotCi0gICAgU3luY2hTdGFydFRhc2soTW9uaXRvciYgbW9uaXRvciwgdm9sYXRpbGUgIFNUQVRFJiBzdGF0ZSkgOgotICAgICAgX21vbml0b3IobW9uaXRvciksCi0gICAgICBfc3RhdGUoc3RhdGUpIHt9Ci0KLSAgICB2b2lkIHJ1bigpIHsKLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOwotICAgICAgICBpZiAoX3N0YXRlID09IFN5bmNoU3RhcnRUYXNrOjpTVEFSVElORykgewotICAgICAgICAgIF9zdGF0ZSA9IFN5bmNoU3RhcnRUYXNrOjpTVEFSVEVEOwotICAgICAgICAgIF9tb25pdG9yLm5vdGlmeSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOwotICAgICAgICB3aGlsZSAoX3N0YXRlID09IFN5bmNoU3RhcnRUYXNrOjpTVEFSVEVEKSB7Ci0gICAgICAgICAgX21vbml0b3Iud2FpdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF9zdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6U1RPUFBJTkcpIHsKLSAgICAgICAgICBfc3RhdGUgPSBTeW5jaFN0YXJ0VGFzazo6U1RPUFBFRDsKLSAgICAgICAgICBfbW9uaXRvci5ub3RpZnlBbGwoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBNb25pdG9yJiBfbW9uaXRvcjsKLSAgICB2b2xhdGlsZSAgU1RBVEUmIF9zdGF0ZTsKLSAgfTsKLQotICBib29sIHN5bmNoU3RhcnRUZXN0KCkgewotCi0gICAgTW9uaXRvciBtb25pdG9yOwotCi0gICAgU3luY2hTdGFydFRhc2s6OlNUQVRFIHN0YXRlID0gU3luY2hTdGFydFRhc2s6OlVOSU5JVElBTElaRUQ7Ci0KLSAgICBzaGFyZWRfcHRyPFN5bmNoU3RhcnRUYXNrPiB0YXNrID0gc2hhcmVkX3B0cjxTeW5jaFN0YXJ0VGFzaz4obmV3IFN5bmNoU3RhcnRUYXNrKG1vbml0b3IsIHN0YXRlKSk7Ci0KLSAgICBQb3NpeFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSA9ICBQb3NpeFRocmVhZEZhY3RvcnkoKTsKLQotICAgIHNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQgPSB0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZCh0YXNrKTsKLQotICAgIGlmIChzdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6VU5JTklUSUFMSVpFRCkgewotCi0gICAgICBzdGF0ZSA9IFN5bmNoU3RhcnRUYXNrOjpTVEFSVElORzsKLQotICAgICAgdGhyZWFkLT5zdGFydCgpOwotICAgIH0KLQotICAgIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwotICAgICAgd2hpbGUgKHN0YXRlID09IFN5bmNoU3RhcnRUYXNrOjpTVEFSVElORykgewotICAgICAgICBtb25pdG9yLndhaXQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBhc3NlcnQoc3RhdGUgIT0gU3luY2hTdGFydFRhc2s6OlNUQVJUSU5HKTsKLQotICAgIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwotCi0gICAgICB0cnkgewotICAgICAgICAgIG1vbml0b3Iud2FpdCgxMDApOwotICAgICAgfSBjYXRjaChUaW1lZE91dEV4Y2VwdGlvbiYgZSkgewotICAgICAgfQotCi0gICAgICBpZiAoc3RhdGUgPT0gU3luY2hTdGFydFRhc2s6OlNUQVJURUQpIHsKLQotICAgICAgICBzdGF0ZSA9IFN5bmNoU3RhcnRUYXNrOjpTVE9QUElORzsKLQotICAgICAgICBtb25pdG9yLm5vdGlmeSgpOwotICAgICAgfQotCi0gICAgICB3aGlsZSAoc3RhdGUgPT0gU3luY2hTdGFydFRhc2s6OlNUT1BQSU5HKSB7Ci0gICAgICAgIG1vbml0b3Iud2FpdCgpOwotICAgICAgfQotICAgIH0KLQotICAgIGFzc2VydChzdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6U1RPUFBFRCk7Ci0KLSAgICBib29sIHN1Y2Nlc3MgPSB0cnVlOwotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8IChzdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKSA8PCAiISIgPDwgc3RkOjplbmRsOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiogU2VlIGhvdyBhY2N1cmF0ZSBtb25pdG9yIHRpbWVvdXQgaXMuICovCi0KLSAgYm9vbCBtb25pdG9yVGltZW91dFRlc3Qoc2l6ZV90IGNvdW50PTEwMDAsIGludDY0X3QgdGltZW91dD0xMCkgewotCi0gICAgTW9uaXRvciBtb25pdG9yOwotCi0gICAgaW50NjRfdCBzdGFydFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IGNvdW50OyBpeCsrKSB7Ci0gICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbW9uaXRvci53YWl0KHRpbWVvdXQpOwotICAgICAgICB9IGNhdGNoKFRpbWVkT3V0RXhjZXB0aW9uJiBlKSB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQ2NF90IGVuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgZG91YmxlIGVycm9yID0gKChlbmRUaW1lIC0gc3RhcnRUaW1lKSAtIChjb3VudCAqIHRpbWVvdXQpKSAvIChkb3VibGUpKGNvdW50ICogdGltZW91dCk7Ci0KLSAgICBpZiAoZXJyb3IgPCAwLjApICB7Ci0KLSAgICAgIGVycm9yICo9IDEuMDsKLSAgICB9Ci0KLSAgICBib29sIHN1Y2Nlc3MgPSBlcnJvciA8IFRocmVhZEZhY3RvcnlUZXN0czo6RVJST1I7Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgKHN1Y2Nlc3MgPyAiU3VjY2VzcyIgOiAiRmFpbHVyZSIpIDw8ICIhIGV4cGVjdGVkIHRpbWU6ICIgPDwgY291bnQgKiB0aW1lb3V0IDw8ICJtcyBlbGFwc2VkIHRpbWU6ICI8PCBlbmRUaW1lIC0gc3RhcnRUaW1lIDw8ICJtcyBlcnJvciU6ICIgPDwgZXJyb3IgKiAxMDAuMCA8PCBzdGQ6OmVuZGw7Ci0KLSAgICByZXR1cm4gc3VjY2VzczsKLSAgfQotCi0KLSAgY2xhc3MgRmxvb2RUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKLSAgcHVibGljOgotCi0gICAgRmxvb2RUYXNrKGNvbnN0IHNpemVfdCBpZCkgOl9pZChpZCkge30KLSAgICB+Rmxvb2RUYXNrKCl7Ci0gICAgICBpZihfaWQgJSAxMDAwID09IDApIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0dGhyZWFkICIgPDwgX2lkIDw8ICIgZG9uZSIgPDwgc3RkOjplbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcnVuKCl7Ci0gICAgICBpZihfaWQgJSAxMDAwID09IDApIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0dGhyZWFkICIgPDwgX2lkIDw8ICIgc3RhcnRlZCIgPDwgc3RkOjplbmRsOwotICAgICAgfQotCi0gICAgICB1c2xlZXAoMSk7Ci0gICAgfQotICAgIGNvbnN0IHNpemVfdCBfaWQ7Ci0gIH07Ci0KLSAgdm9pZCBmb28oUG9zaXhUaHJlYWRGYWN0b3J5ICp0ZikgewotICAgICh2b2lkKSB0ZjsKLSAgfQotCi0gIGJvb2wgZmxvb2ROVGVzdChzaXplX3QgbG9vcD0xLCBzaXplX3QgY291bnQ9MTAwMDAwKSB7Ci0KLSAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKLQotICAgIGZvcihzaXplX3QgbGl4ID0gMDsgbGl4IDwgbG9vcDsgbGl4KyspIHsKLQotICAgICAgUG9zaXhUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnkgPSBQb3NpeFRocmVhZEZhY3RvcnkoKTsKLSAgICAgIHRocmVhZEZhY3Rvcnkuc2V0RGV0YWNoZWQodHJ1ZSk7Ci0KLSAgICAgICAgZm9yKHNpemVfdCB0aXggPSAwOyB0aXggPCBjb3VudDsgdGl4KyspIHsKLQotICAgICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIHNoYXJlZF9wdHI8Rmxvb2RUYXNrPiB0YXNrKG5ldyBGbG9vZFRhc2sobGl4ICogY291bnQgKyB0aXggKSk7Ci0KLSAgICAgICAgICAgIHNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQgPSB0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZCh0YXNrKTsKLQotICAgICAgICAgICAgdGhyZWFkLT5zdGFydCgpOwotCi0gICAgICAgICAgICB1c2xlZXAoMSk7Ci0KLSAgICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uJiBlKSB7Ci0KLSAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0ZmFpbGVkIHRvIHN0YXJ0ICAiIDw8IGxpeCAqIGNvdW50ICsgdGl4IDw8ICIgdGhyZWFkICIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOwotCi0gICAgICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZsb29kZWQgIiA8PCAobGl4ICsgMSkgKiBjb3VudCA8PCAiIHRocmVhZHMiIDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3VjY2VzczsKLSAgfQotfTsKLQotY29uc3QgZG91YmxlIFRocmVhZEZhY3RvcnlUZXN0czo6RVJST1IgPSAuMjA7Ci0KLX19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ojp0ZXN0Ci0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGhyZWFkTWFuYWdlclRlc3RzLmggYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS90ZXN0L1RocmVhZE1hbmFnZXJUZXN0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmI1YzNlLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGhyZWFkTWFuYWdlclRlc3RzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L01vbml0b3IuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9VdGlsLmg+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7IG5hbWVzcGFjZSB0ZXN0IHsKLQotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKLQotLyoqCi0gKiBUaHJlYWRNYW5hZ2VyVGVzdHMgY2xhc3MKLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBUaHJlYWRNYW5hZ2VyVGVzdHMgewotCi1wdWJsaWM6Ci0KLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBFUlJPUjsKLQotICBjbGFzcyBUYXNrOiBwdWJsaWMgUnVubmFibGUgewotCi0gIHB1YmxpYzoKLQotICAgIFRhc2soTW9uaXRvciYgbW9uaXRvciwgc2l6ZV90JiBjb3VudCwgaW50NjRfdCB0aW1lb3V0KSA6Ci0gICAgICBfbW9uaXRvcihtb25pdG9yKSwKLSAgICAgIF9jb3VudChjb3VudCksCi0gICAgICBfdGltZW91dCh0aW1lb3V0KSwKLSAgICAgIF9kb25lKGZhbHNlKSB7fQotCi0gICAgdm9pZCBydW4oKSB7Ci0KLSAgICAgIF9zdGFydFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKF9zbGVlcCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBfc2xlZXAud2FpdChfdGltZW91dCk7Ci0gICAgICAgIH0gY2F0Y2goVGltZWRPdXRFeGNlcHRpb24mIGUpIHsKLSAgICAgICAgICA7Ci0gICAgICAgIH1jYXRjaCguLi4pIHsKLSAgICAgICAgICBhc3NlcnQoMCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgX2VuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgICBfZG9uZSA9IHRydWU7Ci0KLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOwotCi0gICAgICAgIC8vIHN0ZDo6Y291dCA8PCAiVGhyZWFkICIgPDwgX2NvdW50IDw8ICIgY29tcGxldGVkICIgPDwgc3RkOjplbmRsOwotCi0gICAgICAgIF9jb3VudC0tOwotCi0gICAgICAgIGlmIChfY291bnQgPT0gMCkgewotCi0gICAgICAgICAgX21vbml0b3Iubm90aWZ5KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBNb25pdG9yJiBfbW9uaXRvcjsKLSAgICBzaXplX3QmIF9jb3VudDsKLSAgICBpbnQ2NF90IF90aW1lb3V0OwotICAgIGludDY0X3QgX3N0YXJ0VGltZTsKLSAgICBpbnQ2NF90IF9lbmRUaW1lOwotICAgIGJvb2wgX2RvbmU7Ci0gICAgTW9uaXRvciBfc2xlZXA7Ci0gIH07Ci0KLSAgLyoqCi0gICAqIERpc3BhdGNoIGNvdW50IHRhc2tzLCBlYWNoIG9mIHdoaWNoIGJsb2NrcyBmb3IgdGltZW91dCBtaWxsaXNlY29uZHMgdGhlbgotICAgKiBjb21wbGV0ZXMuIFZlcmlmeSB0aGF0IGFsbCB0YXNrcyBjb21wbGV0ZWQgYW5kIHRoYXQgdGhyZWFkIG1hbmFnZXIgY2xlYW5zCi0gICAqIHVwIHByb3Blcmx5IG9uIGRlbGV0ZS4KLSAgICovCi0gIGJvb2wgbG9hZFRlc3Qoc2l6ZV90IGNvdW50PTEwMCwgaW50NjRfdCB0aW1lb3V0PTEwMExMLCBzaXplX3Qgd29ya2VyQ291bnQ9NCkgewotCi0gICAgTW9uaXRvciBtb25pdG9yOwotCi0gICAgc2l6ZV90IGFjdGl2ZUNvdW50ID0gY291bnQ7Ci0KLSAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlckNvdW50KTsKLQotICAgIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5ID0gc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+KG5ldyBQb3NpeFRocmVhZEZhY3RvcnkoKSk7Ci0KLSAgICB0aHJlYWRGYWN0b3J5LT5zZXRQcmlvcml0eShQb3NpeFRocmVhZEZhY3Rvcnk6OkhJR0hFU1QpOwotCi0gICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKLQotICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7Ci0KLSAgICBzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4gPiB0YXNrczsKLQotICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBjb3VudDsgaXgrKykgewotCi0gICAgICB0YXNrcy5pbnNlcnQoc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2sobW9uaXRvciwgYWN0aXZlQ291bnQsIHRpbWVvdXQpKSk7Ci0gICAgfQotCi0gICAgaW50NjRfdCB0aW1lMDAgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4gPjo6aXRlcmF0b3IgaXggPSB0YXNrcy5iZWdpbigpOyBpeCAhPSB0YXNrcy5lbmQoKTsgaXgrKykgewotCi0gICAgICAgIHRocmVhZE1hbmFnZXItPmFkZCgqaXgpOwotICAgIH0KLQotICAgIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwotCi0gICAgICB3aGlsZShhY3RpdmVDb3VudCA+IDApIHsKLQotICAgICAgICBtb25pdG9yLndhaXQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQ2NF90IHRpbWUwMSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0KLSAgICBpbnQ2NF90IGZpcnN0VGltZSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdMTDsKLSAgICBpbnQ2NF90IGxhc3RUaW1lID0gMDsKLQotICAgIGRvdWJsZSBhdmVyYWdlVGltZSA9IDA7Ci0gICAgaW50NjRfdCBtaW5UaW1lID0gOTIyMzM3MjAzNjg1NDc3NTgwN0xMOwotICAgIGludDY0X3QgbWF4VGltZSA9IDA7Ci0KLSAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPiA+OjppdGVyYXRvciBpeCA9IHRhc2tzLmJlZ2luKCk7IGl4ICE9IHRhc2tzLmVuZCgpOyBpeCsrKSB7Ci0KLSAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrID0gKml4OwotCi0gICAgICBpbnQ2NF90IGRlbHRhID0gdGFzay0+X2VuZFRpbWUgLSB0YXNrLT5fc3RhcnRUaW1lOwotCi0gICAgICBhc3NlcnQoZGVsdGEgPiAwKTsKLQotICAgICAgaWYgKHRhc2stPl9zdGFydFRpbWUgPCBmaXJzdFRpbWUpIHsKLSAgICAgICAgZmlyc3RUaW1lID0gdGFzay0+X3N0YXJ0VGltZTsKLSAgICAgIH0KLQotICAgICAgaWYgKHRhc2stPl9lbmRUaW1lID4gbGFzdFRpbWUpIHsKLSAgICAgICAgbGFzdFRpbWUgPSB0YXNrLT5fZW5kVGltZTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRlbHRhIDwgbWluVGltZSkgewotICAgICAgICBtaW5UaW1lID0gZGVsdGE7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkZWx0YSA+IG1heFRpbWUpIHsKLSAgICAgICAgbWF4VGltZSA9IGRlbHRhOwotICAgICAgfQotCi0gICAgICBhdmVyYWdlVGltZSs9IGRlbHRhOwotICAgIH0KLQotICAgIGF2ZXJhZ2VUaW1lIC89IGNvdW50OwotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRmaXJzdCBzdGFydDogIiA8PCBmaXJzdFRpbWUgPDwgIm1zIExhc3QgZW5kOiAiIDw8IGxhc3RUaW1lIDw8ICJtcyBtaW46ICIgPDwgbWluVGltZSA8PCAibXMgbWF4OiAiIDw8IG1heFRpbWUgPDwgIm1zIGF2ZXJhZ2U6ICIgPDwgYXZlcmFnZVRpbWUgPDwgIm1zIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICBkb3VibGUgZXhwZWN0ZWRUaW1lID0gKChjb3VudCArICh3b3JrZXJDb3VudCAtIDEpKSAvIHdvcmtlckNvdW50KSAqIHRpbWVvdXQ7Ci0KLSAgICBkb3VibGUgZXJyb3IgPSAoKHRpbWUwMSAtIHRpbWUwMCkgLSBleHBlY3RlZFRpbWUpIC8gZXhwZWN0ZWRUaW1lOwotCi0gICAgaWYgKGVycm9yIDwgMCkgewotICAgICAgZXJyb3IqPSAtMS4wOwotICAgIH0KLQotICAgIGJvb2wgc3VjY2VzcyA9IGVycm9yIDwgRVJST1I7Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgKHN1Y2Nlc3MgPyAiU3VjY2VzcyIgOiAiRmFpbHVyZSIpIDw8ICIhIGV4cGVjdGVkIHRpbWU6ICIgPDwgZXhwZWN0ZWRUaW1lIDw8ICJtcyBlbGFwc2VkIHRpbWU6ICI8PCB0aW1lMDEgLSB0aW1lMDAgPDwgIm1zIGVycm9yJTogIiA8PCBlcnJvciAqIDEwMC4wIDw8IHN0ZDo6ZW5kbDsKLQotICAgIHJldHVybiBzdWNjZXNzOwotICB9Ci0KLSAgY2xhc3MgQmxvY2tUYXNrOiBwdWJsaWMgUnVubmFibGUgewotCi0gIHB1YmxpYzoKLQotICAgIEJsb2NrVGFzayhNb25pdG9yJiBtb25pdG9yLCBNb25pdG9yJiBibW9uaXRvciwgc2l6ZV90JiBjb3VudCkgOgotICAgICAgX21vbml0b3IobW9uaXRvciksCi0gICAgICBfYm1vbml0b3IoYm1vbml0b3IpLAotICAgICAgX2NvdW50KGNvdW50KSB7fQotCi0gICAgdm9pZCBydW4oKSB7Ci0gICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKF9ibW9uaXRvcik7Ci0KLSAgICAgICAgX2Jtb25pdG9yLndhaXQoKTsKLQotICAgICAgfQotCi0gICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKLQotICAgICAgICBfY291bnQtLTsKLQotICAgICAgICBpZiAoX2NvdW50ID09IDApIHsKLQotICAgICAgICAgIF9tb25pdG9yLm5vdGlmeSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgTW9uaXRvciYgX21vbml0b3I7Ci0gICAgTW9uaXRvciYgX2Jtb25pdG9yOwotICAgIHNpemVfdCYgX2NvdW50OwotICB9OwotCi0gIC8qKgotICAgKiBCbG9jayB0ZXN0LiAgQ3JlYXRlIHBlbmRpbmdUYXNrQ291bnRNYXggdGFza3MuICBWZXJpZnkgdGhhdCB3ZSBibG9jayBhZGRpbmcgdGhlCi0gICAqIHBlbmRpbmdUYXNrQ291bnRNYXggKyAxdGggdGFzay4gIFZlcmlmeSB0aGF0IHdlIHVuYmxvY2sgd2hlbiBhIHRhc2sgY29tcGxldGVzICovCi0KLSAgYm9vbCBibG9ja1Rlc3QoaW50NjRfdCB0aW1lb3V0PTEwMExMLCBzaXplX3Qgd29ya2VyQ291bnQ9MikgewotICAgICh2b2lkKSB0aW1lb3V0OwotICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwotCi0gICAgdHJ5IHsKLQotICAgICAgTW9uaXRvciBibW9uaXRvcjsKLSAgICAgIE1vbml0b3IgbW9uaXRvcjsKLQotICAgICAgc2l6ZV90IHBlbmRpbmdUYXNrTWF4Q291bnQgPSB3b3JrZXJDb3VudDsKLQotICAgICAgc2l6ZV90IGFjdGl2ZUNvdW50c1tdID0ge3dvcmtlckNvdW50LCBwZW5kaW5nVGFza01heENvdW50LCAxfTsKLQotICAgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCwgcGVuZGluZ1Rhc2tNYXhDb3VudCk7Ci0KLSAgICAgIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5ID0gc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+KG5ldyBQb3NpeFRocmVhZEZhY3RvcnkoKSk7Ci0KLSAgICAgIHRocmVhZEZhY3RvcnktPnNldFByaW9yaXR5KFBvc2l4VGhyZWFkRmFjdG9yeTo6SElHSEVTVCk7Ci0KLSAgICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7Ci0KLSAgICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7Ci0KLSAgICAgIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+ID4gdGFza3M7Ci0KLSAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCB3b3JrZXJDb3VudDsgaXgrKykgewotCi0gICAgICAgIHRhc2tzLmluc2VydChzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPihuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2sobW9uaXRvciwgYm1vbml0b3IsYWN0aXZlQ291bnRzWzBdKSkpOwotICAgICAgfQotCi0gICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgcGVuZGluZ1Rhc2tNYXhDb3VudDsgaXgrKykgewotCi0gICAgICAgIHRhc2tzLmluc2VydChzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPihuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2sobW9uaXRvciwgYm1vbml0b3IsYWN0aXZlQ291bnRzWzFdKSkpOwotICAgICAgfQotCi0gICAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+ID46Oml0ZXJhdG9yIGl4ID0gdGFza3MuYmVnaW4oKTsgaXggIT0gdGFza3MuZW5kKCk7IGl4KyspIHsKLSAgICAgICAgdGhyZWFkTWFuYWdlci0+YWRkKCppeCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmKCEoc3VjY2VzcyA9ICh0aHJlYWRNYW5hZ2VyLT50b3RhbFRhc2tDb3VudCgpID09IHBlbmRpbmdUYXNrTWF4Q291bnQgKyB3b3JrZXJDb3VudCkpKSB7Ci0gICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgcGVuZGluZyB0YXNrIGNvdW50Iik7Ci0gICAgICB9Ci0KLSAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+IGV4dHJhVGFzayhuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2sobW9uaXRvciwgYm1vbml0b3IsIGFjdGl2ZUNvdW50c1syXSkpOwotCi0gICAgICB0cnkgewotICAgICAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoZXh0cmFUYXNrLCAxKTsKLSAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWNjZXNzIGFkZGluZyB0YXNrIGluIGV4Y2VzcyBvZiBwZW5kaW5nIHRhc2sgY291bnQiKTsKLSAgICAgIH0gY2F0Y2goVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiYgZSkgewotICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJTaG91bGQgaGF2ZSB0aW1lZCBvdXQgYWRkaW5nIHRhc2sgaW4gZXhjZXNzIG9mIHBlbmRpbmcgdGFzayBjb3VudCIpOwotICAgICAgfSBjYXRjaChUaW1lZE91dEV4Y2VwdGlvbiYgZSkgewotICAgICAgICAvLyBFeHBlY3RlZCByZXN1bHQKLSAgICAgIH0KLQotICAgICAgdHJ5IHsKLSAgICAgICAgdGhyZWFkTWFuYWdlci0+YWRkKGV4dHJhVGFzaywgLTEpOwotICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1Y2Nlc3MgYWRkaW5nIHRhc2sgaW4gZXhjZXNzIG9mIHBlbmRpbmcgdGFzayBjb3VudCIpOwotICAgICAgfSBjYXRjaChUaW1lZE91dEV4Y2VwdGlvbiYgZSkgewotICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJVbmV4cGVjdGVkIHRpbWVvdXQgYWRkaW5nIHRhc2sgaW4gZXhjZXNzIG9mIHBlbmRpbmcgdGFzayBjb3VudCIpOwotICAgICAgfSBjYXRjaChUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uJiBlKSB7Ci0gICAgICAgIC8vIEV4cGVjdGVkIHJlc3VsdAotICAgICAgfQotCi0gICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgIlBlbmRpbmcgdGFza3MgIiA8PCB0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCkgIDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhibW9uaXRvcik7Ci0KLSAgICAgICAgYm1vbml0b3Iubm90aWZ5QWxsKCk7Ci0gICAgICB9Ci0KLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7Ci0KLSAgICAgICAgd2hpbGUoYWN0aXZlQ291bnRzWzBdICE9IDApIHsKLSAgICAgICAgICBtb25pdG9yLndhaXQoKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgIlBlbmRpbmcgdGFza3MgIiA8PCB0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCkgPDwgc3RkOjplbmRsOwotCi0gICAgICB0cnkgewotICAgICAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoZXh0cmFUYXNrLCAxKTsKLSAgICAgIH0gY2F0Y2goVGltZWRPdXRFeGNlcHRpb24mIGUpIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8ICJhZGQgdGltZWQgb3V0IHVuZXhwZWN0ZWRseSIgIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCB0aW1lb3V0IGFkZGluZyB0YXNrIik7Ci0KLSAgICAgIH0gY2F0Y2goVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiYgZSkgewotICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgImFkZCBlbmNvdW50ZXJlZCB0b28gbWFueSBwZW5kaW5nIGV4ZXBjdGlvbnMiIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCB0aW1lb3V0IGFkZGluZyB0YXNrIik7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFdha2UgdXAgdGFza3MgdGhhdCB3ZXJlIHBlbmRpbmcgYmVmb3JlIGFuZCB3YWl0IGZvciB0aGVtIHRvIGNvbXBsZXRlCi0KLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoYm1vbml0b3IpOwotCi0gICAgICAgIGJtb25pdG9yLm5vdGlmeUFsbCgpOwotICAgICAgfQotCi0gICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwotCi0gICAgICAgIHdoaWxlKGFjdGl2ZUNvdW50c1sxXSAhPSAwKSB7Ci0gICAgICAgICAgbW9uaXRvci53YWl0KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gV2FrZSB1cCB0aGUgZXh0cmEgdGFzayBhbmQgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUKLQotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhibW9uaXRvcik7Ci0KLSAgICAgICAgYm1vbml0b3Iubm90aWZ5QWxsKCk7Ci0gICAgICB9Ci0KLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7Ci0KLSAgICAgICAgd2hpbGUoYWN0aXZlQ291bnRzWzJdICE9IDApIHsKLSAgICAgICAgICBtb25pdG9yLndhaXQoKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZighKHN1Y2Nlc3MgPSAodGhyZWFkTWFuYWdlci0+dG90YWxUYXNrQ291bnQoKSA9PSAwKSkpIHsKLSAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCBwZW5kaW5nIHRhc2sgY291bnQiKTsKLSAgICAgIH0KLQotICAgIH0gY2F0Y2goVEV4Y2VwdGlvbiYgZSkgewotICAgICAgc3RkOjpjb3V0IDw8ICJFUlJPUjogIiA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7Ci0gICAgfQotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8IChzdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKSA8PCBzdGQ6OmVuZGw7Ci0gICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gfQotfTsKLQotY29uc3QgZG91YmxlIFRocmVhZE1hbmFnZXJUZXN0czo6RVJST1IgPSAuMjA7Ci0KLX19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ci0KLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OnRlc3Q7Ci0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGltZXJNYW5hZ2VyVGVzdHMuaCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGltZXJNYW5hZ2VyVGVzdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg5MDc0Yy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS90ZXN0L1RpbWVyTWFuYWdlclRlc3RzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvTW9uaXRvci5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1V0aWwuaD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7IG5hbWVzcGFjZSB0ZXN0IHsKLQotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKLQotLyoqCi0gKiBUaHJlYWRNYW5hZ2VyVGVzdHMgY2xhc3MKLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBUaW1lck1hbmFnZXJUZXN0cyB7Ci0KLSBwdWJsaWM6Ci0KLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBFUlJPUjsKLQotICBjbGFzcyBUYXNrOiBwdWJsaWMgUnVubmFibGUgewotICAgcHVibGljOgotCi0gICAgVGFzayhNb25pdG9yJiBtb25pdG9yLCBpbnQ2NF90IHRpbWVvdXQpIDoKLSAgICAgIF90aW1lb3V0KHRpbWVvdXQpLAotICAgICAgX3N0YXJ0VGltZShVdGlsOjpjdXJyZW50VGltZSgpKSwKLSAgICAgIF9tb25pdG9yKG1vbml0b3IpLAotICAgICAgX3N1Y2Nlc3MoZmFsc2UpLAotICAgICAgX2RvbmUoZmFsc2UpIHt9Ci0KLSAgICB+VGFzaygpIHsgc3RkOjpjZXJyIDw8IHRoaXMgPDwgc3RkOjplbmRsOyB9Ci0KLSAgICB2b2lkIHJ1bigpIHsKLQotICAgICAgX2VuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgICAvLyBGaWd1cmUgb3V0IGVycm9yIHBlcmNlbnRhZ2UKLQotICAgICAgaW50NjRfdCBkZWx0YSA9IF9lbmRUaW1lIC0gX3N0YXJ0VGltZTsKLQotCi0gICAgICBkZWx0YSA9IGRlbHRhID4gX3RpbWVvdXQgPyAgZGVsdGEgLSBfdGltZW91dCA6IF90aW1lb3V0IC0gZGVsdGE7Ci0KLSAgICAgIGZsb2F0IGVycm9yID0gZGVsdGEgLyBfdGltZW91dDsKLQotICAgICAgaWYoZXJyb3IgPCBFUlJPUikgewotICAgICAgICBfc3VjY2VzcyA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIF9kb25lID0gdHJ1ZTsKLQotICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRUaW1lck1hbmFnZXJUZXN0czo6VGFza1siIDw8IHRoaXMgPDwgIl0gZG9uZSIgPDwgc3RkOjplbmRsOyAvL2RlYnVnCi0KLSAgICAgIHtTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7Ci0gICAgICAgIF9tb25pdG9yLm5vdGlmeUFsbCgpOwotICAgICAgfQotICAgIH0KLQotICAgIGludDY0X3QgX3RpbWVvdXQ7Ci0gICAgaW50NjRfdCBfc3RhcnRUaW1lOwotICAgIGludDY0X3QgX2VuZFRpbWU7Ci0gICAgTW9uaXRvciYgX21vbml0b3I7Ci0gICAgYm9vbCBfc3VjY2VzczsKLSAgICBib29sIF9kb25lOwotICB9OwotCi0gIC8qKgotICAgKiBUaGlzIHRlc3QgY3JlYXRlcyB0d28gdGFza3MgYW5kIHdhaXRzIGZvciB0aGUgZmlyc3QgdG8gZXhwaXJlIHdpdGhpbiAxMCUKLSAgICogb2YgdGhlIGV4cGVjdGVkIGV4cGlyYXRpb24gdGltZS4gSXQgdGhlbiB2ZXJpZmllcyB0aGF0IHRoZSB0aW1lciBtYW5hZ2VyCi0gICAqIHByb3Blcmx5IGNsZWFuIHVwIGl0c2VsZiBhbmQgdGhlIHJlbWFpbmluZyBvcnBoYW5lZCB0aW1lb3V0IHRhc2sgd2hlbiB0aGUKLSAgICogbWFuYWdlciBnb2VzIG91dCBvZiBzY29wZSBhbmQgaXRzIGRlc3RydWN0b3IgaXMgY2FsbGVkLgotICAgKi8KLSAgYm9vbCB0ZXN0MDAoaW50NjRfdCB0aW1lb3V0PTEwMDBMTCkgewotCi0gICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gb3JwaGFuVGFzayA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgMTAgKiB0aW1lb3V0KSk7Ci0KLSAgICB7Ci0KLSAgICAgIFRpbWVyTWFuYWdlciB0aW1lck1hbmFnZXI7Ci0KLSAgICAgIHRpbWVyTWFuYWdlci50aHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KCkpKTsKLQotICAgICAgdGltZXJNYW5hZ2VyLnN0YXJ0KCk7Ci0KLSAgICAgIGFzc2VydCh0aW1lck1hbmFnZXIuc3RhdGUoKSA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQpOwotCi0gICAgICAvLyBEb24ndCBjcmVhdGUgdGFzayB5ZXQsIGJlY2F1c2UgaXRzIGNvbnN0cnVjdG9yIHNldHMgdGhlIGV4cGVjdGVkIGNvbXBsZXRpb24gdGltZSwgYW5kIHdlCi0gICAgICAvLyBuZWVkIHRvIGRlbGF5IGJldHdlZW4gaW5zZXJ0aW5nIHRoZSB0d28gdGFza3MgaW50byB0aGUgcnVuIHF1ZXVlLgotICAgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFzazsKLQotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7Ci0KLSAgICAgICAgdGltZXJNYW5hZ2VyLmFkZChvcnBoYW5UYXNrLCAxMCAqIHRpbWVvdXQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgLy8gV2FpdCBmb3IgMSBzZWNvbmQgaW4gb3JkZXIgdG8gZ2l2ZSB0aW1lck1hbmFnZXIgYSBjaGFuY2UgdG8gc3RhcnQgc2xlZXBpbmcgaW4gcmVzcG9uc2UKLSAgICAgICAgICAvLyB0byBhZGRpbmcgb3JwaGFuVGFzay4gV2UgbmVlZCB0byBkbyB0aGlzIHNvIHdlIGNhbiB2ZXJpZnkgdGhhdCBhZGRpbmcgdGhlIHNlY29uZCB0YXNrCi0gICAgICAgICAgLy8ga2lja3MgdGhlIGRpc3BhdGNoZXIgb3V0IG9mIHRoZSBjdXJyZW50IHdhaXQgYW5kIHN0YXJ0cyB0aGUgbmV3IDEgc2Vjb25kIHdhaXQuCi0gICAgICAgICAgX21vbml0b3Iud2FpdCAoMTAwMCk7Ci0gICAgICAgICAgYXNzZXJ0ICgwID09ICJFUlJPUjogVGhpcyB3YWl0IHNob3VsZCB0aW1lIG91dC4gVGltZXJNYW5hZ2VyIGRpc3BhdGNoZXIgbWF5IGhhdmUgYSBwcm9ibGVtLiIpOwotICAgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiAmZXgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHRhc2sucmVzZXQgKG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCkpOwotCi0gICAgICAgIHRpbWVyTWFuYWdlci5hZGQodGFzaywgdGltZW91dCk7Ci0KLSAgICAgICAgX21vbml0b3Iud2FpdCgpOwotICAgICAgfQotCi0gICAgICBhc3NlcnQodGFzay0+X2RvbmUpOwotCi0KLSAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAodGFzay0+X3N1Y2Nlc3MgPyAiU3VjY2VzcyIgOiAiRmFpbHVyZSIpIDw8ICIhIiA8PCBzdGQ6OmVuZGw7Ci0gICAgfQotCi0gICAgLy8gdGltZXJNYW5hZ2VyLnN0b3AoKTsgVGhpcyBpcyB3aGVyZSBpdCBoYXBwZW5zIHZpYSBkZXN0cnVjdG9yCi0KLSAgICBhc3NlcnQoIW9ycGhhblRhc2stPl9kb25lKTsKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgZnJpZW5kIGNsYXNzIFRlc3RUYXNrOwotCi0gIE1vbml0b3IgX21vbml0b3I7Ci19OwotCi1jb25zdCBkb3VibGUgVGltZXJNYW5hZ2VyVGVzdHM6OkVSUk9SID0gLjIwOwotCi19fX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAgYi9saWIvY3BwL3NyYy9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhOWI2NzIuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlBlZWtQcm9jZXNzb3IuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm9jZXNzb3IgewotCi1QZWVrUHJvY2Vzc29yOjpQZWVrUHJvY2Vzc29yKCkgewotICBtZW1vcnlCdWZmZXJfLnJlc2V0KG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICB0YXJnZXRUcmFuc3BvcnRfID0gbWVtb3J5QnVmZmVyXzsKLX0KLVBlZWtQcm9jZXNzb3I6On5QZWVrUHJvY2Vzc29yKCkge30KLQotdm9pZCBQZWVrUHJvY2Vzc29yOjppbml0aWFsaXplKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGFjdHVhbFByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFBpcGVkVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeSkgewotICBhY3R1YWxQcm9jZXNzb3JfID0gYWN0dWFsUHJvY2Vzc29yOwotICBwaXBlZFByb3RvY29sXyA9IHByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2wodGFyZ2V0VHJhbnNwb3J0Xyk7Ci0gIHRyYW5zcG9ydEZhY3RvcnlfID0gdHJhbnNwb3J0RmFjdG9yeTsKLSAgdHJhbnNwb3J0RmFjdG9yeV8tPmluaXRpYWxpemVUYXJnZXRUcmFuc3BvcnQodGFyZ2V0VHJhbnNwb3J0Xyk7Ci19Ci0KLWJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IFBlZWtQcm9jZXNzb3I6OmdldFBpcGVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGluKSB7Ci0gIHJldHVybiB0cmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGluKTsKLX0KLQotdm9pZCBQZWVrUHJvY2Vzc29yOjpzZXRUYXJnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdGFyZ2V0VHJhbnNwb3J0KSB7Ci0gIHRhcmdldFRyYW5zcG9ydF8gPSB0YXJnZXRUcmFuc3BvcnQ7Ci0gIGlmIChib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VE1lbW9yeUJ1ZmZlcj4odGFyZ2V0VHJhbnNwb3J0XykpIHsKLSAgICBtZW1vcnlCdWZmZXJfID0gYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRNZW1vcnlCdWZmZXI+KHRhcmdldFRyYW5zcG9ydCk7Ci0gIH0gZWxzZSBpZiAoYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRQaXBlZFRyYW5zcG9ydD4odGFyZ2V0VHJhbnNwb3J0XykpIHsKLSAgICBtZW1vcnlCdWZmZXJfID0gYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRNZW1vcnlCdWZmZXI+KGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUUGlwZWRUcmFuc3BvcnQ+KHRhcmdldFRyYW5zcG9ydF8pLT5nZXRUYXJnZXRUcmFuc3BvcnQoKSk7Ci0gIH0KLQotICBpZiAoIW1lbW9yeUJ1ZmZlcl8pIHsKLSAgICB0aHJvdyBURXhjZXB0aW9uKCJUYXJnZXQgdHJhbnNwb3J0IG11c3QgYmUgYSBUTWVtb3J5QnVmZmVyIG9yIGEgVFBpcGVkVHJhbnNwb3J0IHdpdGggVE1lbW9yeUJ1ZmZlciIpOwotICB9Ci19Ci0KLWJvb2wgUGVla1Byb2Nlc3Nvcjo6cHJvY2Vzcyhib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSB7Ci0KLSAgc3RkOjpzdHJpbmcgZm5hbWU7Ci0gIFRNZXNzYWdlVHlwZSBtdHlwZTsKLSAgaW50MzJfdCBzZXFpZDsKLSAgaW4tPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCBzZXFpZCk7Ci0KLSAgaWYgKG10eXBlICE9IFRfQ0FMTCkgewotICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlIik7Ci0gIH0KLQotICAvLyBQZWVrIGF0IHRoZSBuYW1lCi0gIHBlZWtOYW1lKGZuYW1lKTsKLQotICBUVHlwZSBmdHlwZTsKLSAgaW50MTZfdCBmaWQ7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgaW4tPnJlYWRGaWVsZEJlZ2luKGZuYW1lLCBmdHlwZSwgZmlkKTsKLSAgICBpZiAoZnR5cGUgPT0gVF9TVE9QKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBQZWVrIGF0IHRoZSB2YXJpYWJsZQotICAgIHBlZWsoaW4sIGZ0eXBlLCBmaWQpOwotICAgIGluLT5yZWFkRmllbGRFbmQoKTsKLSAgfQotICBpbi0+cmVhZE1lc3NhZ2VFbmQoKTsKLSAgaW4tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7Ci0KLSAgLy8KLSAgLy8gQWxsIHRoZSBkYXRhIGlzIG5vdyBpbiBtZW1vcnlCdWZmZXJfIGFuZCByZWFkeSB0byBiZSBwcm9jZXNzZWQKLSAgLy8KLQotICAvLyBMZXQncyBmaXJzdCB0YWtlIGEgcGVlayBhdCB0aGUgZnVsbCBkYXRhIGluIG1lbW9yeQotICB1aW50OF90KiBidWZmZXI7Ci0gIHVpbnQzMl90IHNpemU7Ci0gIG1lbW9yeUJ1ZmZlcl8tPmdldEJ1ZmZlcigmYnVmZmVyLCAmc2l6ZSk7Ci0gIHBlZWtCdWZmZXIoYnVmZmVyLCBzaXplKTsKLQotICAvLyBEb25lIHBlZWtpbmcgYXQgdmFyaWFibGVzCi0gIHBlZWtFbmQoKTsKLQotICBib29sIHJldCA9IGFjdHVhbFByb2Nlc3Nvcl8tPnByb2Nlc3MocGlwZWRQcm90b2NvbF8sIG91dCwgY29ubmVjdGlvbkNvbnRleHQpOwotICBtZW1vcnlCdWZmZXJfLT5yZXNldEJ1ZmZlcigpOwotICByZXR1cm4gcmV0OwotfQotCi12b2lkIFBlZWtQcm9jZXNzb3I6OnBlZWtOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSkgewotICAodm9pZCkgZm5hbWU7Ci19Ci0KLXZvaWQgUGVla1Byb2Nlc3Nvcjo6cGVla0J1ZmZlcih1aW50OF90KiBidWZmZXIsIHVpbnQzMl90IHNpemUpIHsKLSAgKHZvaWQpIGJ1ZmZlcjsKLSAgKHZvaWQpIHNpemU7Ci19Ci0KLXZvaWQgUGVla1Byb2Nlc3Nvcjo6cGVlayhib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlIGZ0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgZmlkKSB7Ci0gICh2b2lkKSBmaWQ7Ci0gIGluLT5za2lwKGZ0eXBlKTsKLX0KLQotdm9pZCBQZWVrUHJvY2Vzc29yOjpwZWVrRW5kKCkge30KLQotfX19CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I3MDNmNi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFBFRUtQUk9DRVNTT1JfSAotI2RlZmluZSBQRUVLUFJPQ0VTU09SX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxUUHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb2Nlc3NvciB7Ci0KLS8qCi0gKiBDbGFzcyBmb3IgcGVla2luZyBhdCB0aGUgcmF3IGRhdGEgdGhhdCBpcyBiZWluZyBwcm9jZXNzZWQgYnkgYW5vdGhlciBwcm9jZXNzb3IKLSAqIGFuZCBnaXZlcyB0aGUgZGVyaXZlZCBjbGFzcyBhIGNoYW5jZSB0byBjaGFuZ2UgYmVoYXZpb3IgYWNjb3JkaW5nbHkKLSAqCi0gKi8KLWNsYXNzIFBlZWtQcm9jZXNzb3IgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3IgewotCi0gcHVibGljOgotICBQZWVrUHJvY2Vzc29yKCk7Ci0gIHZpcnR1YWwgflBlZWtQcm9jZXNzb3IoKTsKLQotICAvLyBJbnB1dCBoZXJlOiBhY3R1YWxQcm9jZXNzb3IgIC0gdGhlIHVuZGVybHlpbmcgcHJvY2Vzc29yCi0gIC8vICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSAgLSB0aGUgcHJvdG9jb2wgZmFjdG9yeSB1c2VkIHRvIHdyYXAgdGhlIG1lbW9yeSBidWZmZXIKLSAgLy8gICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSAtIHRoaXMgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSBpcyB1c2VkIHRvIHdyYXAgdGhlIHNvdXJjZSB0cmFuc3BvcnQKLSAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYSBhIGNhbGwgdG8gZ2V0UGlwZWRUcmFuc3BvcnQKLSAgdm9pZCBpbml0aWFsaXplKGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiBhY3R1YWxQcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRQaXBlZFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkpOwotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGdldFBpcGVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGluKTsKLQotICB2b2lkIHNldFRhcmdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0YXJnZXRUcmFuc3BvcnQpOwotCi0gIHZpcnR1YWwgYm9vbCBwcm9jZXNzKGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpOwotCi0gIC8vIFRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGNhbiBiZSBvdmVybG9hZGVkIGJ5IGNoaWxkIGNsYXNzZXMgdG8KLSAgLy8gYWNoaWV2ZSBkZXNpcmVkIHBlZWtpbmcgYmVoYXZpb3IKLSAgdmlydHVhbCB2b2lkIHBlZWtOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSk7Ci0gIHZpcnR1YWwgdm9pZCBwZWVrQnVmZmVyKHVpbnQ4X3QqIGJ1ZmZlciwgdWludDMyX3Qgc2l6ZSk7Ci0gIHZpcnR1YWwgdm9pZCBwZWVrKGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKLSAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBmdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBmaWQpOwotICB2aXJ0dWFsIHZvaWQgcGVla0VuZCgpOwotCi0gcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+IGFjdHVhbFByb2Nlc3Nvcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXBlZFByb3RvY29sXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFBpcGVkVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IG1lbW9yeUJ1ZmZlcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IHRhcmdldFRyYW5zcG9ydF87Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb2Nlc3NvcgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3Byb2Nlc3Nvci9TdGF0c1Byb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvcHJvY2Vzc29yL1N0YXRzUHJvY2Vzc29yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MDBjNmIuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvY2Vzc29yL1N0YXRzUHJvY2Vzc29yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFNUQVRTUFJPQ0VTU09SX0gKLSNkZWZpbmUgU1RBVFNQUk9DRVNTT1JfSAotCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UUHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxUUHJvY2Vzc29yLmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb2Nlc3NvciB7Ci0KLS8qCi0gKiBDbGFzcyBmb3Iga2VlcGluZyB0cmFjayBvZiBmdW5jdGlvbiBjYWxsIHN0YXRpc3RpY3MgYW5kIHByaW50aW5nIHRoZW0gaWYgZGVzaXJlZAotICoKLSAqLwotY2xhc3MgU3RhdHNQcm9jZXNzb3IgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3IgewotcHVibGljOgotICBTdGF0c1Byb2Nlc3Nvcihib29sIHByaW50LCBib29sIGZyZXF1ZW5jeSkKLSAgICA6IHByaW50XyhwcmludCksCi0gICAgICBmcmVxdWVuY3lfKGZyZXF1ZW5jeSkKLSAge30KLSAgdmlydHVhbCB+U3RhdHNQcm9jZXNzb3IoKSB7fTsKLQotICB2aXJ0dWFsIGJvb2wgcHJvY2Vzcyhib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcGlwcm90LAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcG9wcm90LAotICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBzZXJ2ZXJDb250ZXh0KSB7Ci0KLSAgICBwaXByb3RfID0gcGlwcm90OwotCi0gICAgc3RkOjpzdHJpbmcgZm5hbWU7Ci0gICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGU7Ci0gICAgaW50MzJfdCBzZXFpZDsKLQotICAgIHBpcHJvdF8tPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCBzZXFpZCk7Ci0gICAgaWYgKG10eXBlICE9IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9DQUxMKSB7Ci0gICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgIHByaW50ZigiVW5rbm93biBtZXNzYWdlIHR5cGVcbiIpOwotICAgICAgfQotICAgICAgdGhyb3cgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlIik7Ci0gICAgfQotICAgIGlmIChwcmludF8pIHsKLSAgICAgIHByaW50ZigiJXMgKCIsIGZuYW1lLmNfc3RyKCkpOwotICAgIH0KLSAgICBpZiAoZnJlcXVlbmN5XykgewotICAgICAgaWYgKGZyZXF1ZW5jeV9tYXBfLmZpbmQoZm5hbWUpICE9IGZyZXF1ZW5jeV9tYXBfLmVuZCgpKSB7Ci0gICAgICAgIGZyZXF1ZW5jeV9tYXBfW2ZuYW1lXSsrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZnJlcXVlbmN5X21hcF9bZm5hbWVdID0gMTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlOwotICAgIGludDE2X3QgZmlkOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHBpcHJvdF8tPnJlYWRGaWVsZEJlZ2luKGZuYW1lLCBmdHlwZSwgZmlkKTsKLSAgICAgIGlmIChmdHlwZSA9PSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RPUCkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIoZnR5cGUpOwotICAgICAgaWYgKHByaW50XykgewotICAgICAgICBwcmludGYoIiwgIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHByaW50XykgewotICAgICAgcHJpbnRmKCJcYlxiKVxuIik7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludDY0X3Q+JiBnZXRfZnJlcXVlbmN5X21hcCgpIHsKLSAgICByZXR1cm4gZnJlcXVlbmN5X21hcF87Ci0gIH0KLQotcHJvdGVjdGVkOgotICB2b2lkIHByaW50QW5kUGFzc1RvQnVmZmVyKGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZnR5cGUpIHsKLSAgICBzd2l0Y2ggKGZ0eXBlKSB7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9CT09MOgotICAgICAgICB7Ci0gICAgICAgICAgYm9vbCBib29sdjsKLSAgICAgICAgICBwaXByb3RfLT5yZWFkQm9vbChib29sdik7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCIlZCIsIGJvb2x2KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9CWVRFOgotICAgICAgICB7Ci0gICAgICAgICAgaW50OF90IGJ5dGV2OwotICAgICAgICAgIHBpcHJvdF8tPnJlYWRCeXRlKGJ5dGV2KTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIiVkIiwgYnl0ZXYpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kxNjoKLSAgICAgICAgewotICAgICAgICAgIGludDE2X3QgaTE2OwotICAgICAgICAgIHBpcHJvdF8tPnJlYWRJMTYoaTE2KTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIiVkIiwgaTE2KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMzI6Ci0gICAgICAgIHsKLSAgICAgICAgICBpbnQzMl90IGkzMjsKLSAgICAgICAgICBwaXByb3RfLT5yZWFkSTMyKGkzMik7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCIlZCIsIGkzMik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTY0OgotICAgICAgICB7Ci0gICAgICAgICAgaW50NjRfdCBpNjQ7Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZEk2NChpNjQpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiJWxkIiwgaTY0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9ET1VCTEU6Ci0gICAgICAgIHsKLSAgICAgICAgICBkb3VibGUgZHViOwotICAgICAgICAgIHBpcHJvdF8tPnJlYWREb3VibGUoZHViKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIiVmIiwgZHViKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJJTkc6Ci0gICAgICAgIHsKLSAgICAgICAgICBzdGQ6OnN0cmluZyBzdHI7Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZFN0cmluZyhzdHIpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiJXMiLCBzdHIuY19zdHIoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUOgotICAgICAgICB7Ci0gICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgICAgICAgICBpbnQxNl90IGZpZDsKLSAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlOwotICAgICAgICAgIHBpcHJvdF8tPnJlYWRTdHJ1Y3RCZWdpbihuYW1lKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIjwiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHBpcHJvdF8tPnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZ0eXBlLCBmaWQpOwotICAgICAgICAgICAgaWYgKGZ0eXBlID09IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVE9QKSB7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIoZnR5cGUpOwotICAgICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgICBwcmludGYoIiwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBpcHJvdF8tPnJlYWRGaWVsZEVuZCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBwaXByb3RfLT5yZWFkU3RydWN0RW5kKCk7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCJcYj4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9NQVA6Ci0gICAgICAgIHsKLSAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGtleVR5cGU7Ci0gICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSB2YWxUeXBlOwotICAgICAgICAgIHVpbnQzMl90IGksIHNpemU7Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZE1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigieyIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBwcmludEFuZFBhc3NUb0J1ZmZlcihrZXlUeXBlKTsKLSAgICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgICAgcHJpbnRmKCI9PiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIodmFsVHlwZSk7Ci0gICAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICAgIHByaW50ZigiLCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBwaXByb3RfLT5yZWFkTWFwRW5kKCk7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCJcYn0iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TRVQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGVsZW1UeXBlOwotICAgICAgICAgIHVpbnQzMl90IGksIHNpemU7Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZFNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoInsiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIoZWxlbVR5cGUpOwotICAgICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgICBwcmludGYoIiwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZFNldEVuZCgpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiXGJ9Iik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfTElTVDoKLSAgICAgICAgewotICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZWxlbVR5cGU7Ci0gICAgICAgICAgdWludDMyX3QgaSwgc2l6ZTsKLSAgICAgICAgICBwaXByb3RfLT5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIlsiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIoZWxlbVR5cGUpOwotICAgICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgICBwcmludGYoIiwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZExpc3RFbmQoKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIlxiXSIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXByb3RfOwotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50NjRfdD4gZnJlcXVlbmN5X21hcF87Ci0KLSAgYm9vbCBwcmludF87Ci0gIGJvb2wgZnJlcXVlbmN5XzsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvY2Vzc29yCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmNwcCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RCYXNlNjRVdGlscy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NDgxYzQuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlRCYXNlNjRVdGlscy5oIgotCi0jaW5jbHVkZSA8Ym9vc3Qvc3RhdGljX2Fzc2VydC5ocHA+Ci0KLXVzaW5nIHN0ZDo6c3RyaW5nOwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm90b2NvbCB7Ci0KLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmtCYXNlNjRFbmNvZGVUYWJsZSA9IChjb25zdCB1aW50OF90ICopCi0gICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKLQotdm9pZCAgYmFzZTY0X2VuY29kZShjb25zdCB1aW50OF90ICppbiwgdWludDMyX3QgbGVuLCB1aW50OF90ICpidWYpIHsKLSAgYnVmWzBdID0ga0Jhc2U2NEVuY29kZVRhYmxlWyhpblswXSA+PiAyKSAmIDB4M0ZdOwotICBpZiAobGVuID09IDMpIHsKLSAgICBidWZbMV0gPSBrQmFzZTY0RW5jb2RlVGFibGVbKChpblswXSA8PCA0KSArIChpblsxXSA+PiA0KSkgJiAweDNmXTsKLSAgICBidWZbMl0gPSBrQmFzZTY0RW5jb2RlVGFibGVbKChpblsxXSA8PCAyKSArIChpblsyXSA+PiA2KSkgJiAweDNmXTsKLSAgICBidWZbM10gPSBrQmFzZTY0RW5jb2RlVGFibGVbaW5bMl0gJiAweDNmXTsKLSAgfSBlbHNlIGlmIChsZW4gPT0gMikgewotICAgIGJ1ZlsxXSA9IGtCYXNlNjRFbmNvZGVUYWJsZVsoKGluWzBdIDw8IDQpICsgKGluWzFdID4+IDQpKSAmIDB4M2ZdOwotICAgIGJ1ZlsyXSA9IGtCYXNlNjRFbmNvZGVUYWJsZVsoaW5bMV0gPDwgMikgJiAweDNmXTsKLSAgfSBlbHNlICB7IC8vIGxlbiA9PSAxCi0gICAgYnVmWzFdID0ga0Jhc2U2NEVuY29kZVRhYmxlWyhpblswXSA8PCA0KSAmIDB4M2ZdOwotICB9Ci19Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGtCYXNlNjREZWNvZGVUYWJsZVsyNTZdID17Ci0gIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLSAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsNjIsLTEsLTEsLTEsNjMsCi0gIDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLC0xLC0xLC0xLC0xLC0xLC0xLAotICAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwxMCwxMSwxMiwxMywxNCwKLSAgMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsLTEsLTEsLTEsLTEsLTEsCi0gIC0xLDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLAotICA0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSwtMSwtMSwtMSwtMSwtMSwKLSAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0gIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLSAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0gIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLSAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0gIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotfTsKLQotdm9pZCBiYXNlNjRfZGVjb2RlKHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIGJ1ZlswXSA9IChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzBdXSA8PCAyKSB8Ci0gICAgICAgICAgIChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzFdXSA+PiA0KTsKLSAgaWYgKGxlbiA+IDIpIHsKLSAgICBidWZbMV0gPSAoKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbMV1dIDw8IDQpICYgMHhmMCkgfAotICAgICAgICAgICAgICAoa0Jhc2U2NERlY29kZVRhYmxlW2J1ZlsyXV0gPj4gMik7Ci0gICAgaWYgKGxlbiA+IDMpIHsKLSAgICAgIGJ1ZlsyXSA9ICgoa0Jhc2U2NERlY29kZVRhYmxlW2J1ZlsyXV0gPDwgNikgJiAweGMwKSB8Ci0gICAgICAgICAgICAgICAgKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbM11dKTsKLSAgICB9Ci0gIH0KLX0KLQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UQmFzZTY0VXRpbHMuaCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RCYXNlNjRVdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGVmNzMzLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RCYXNlNjRVdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVEJBU0U2NFVUSUxTX0hfCi0jZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVEJBU0U2NFVUSUxTX0hfCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotLy8gaW4gbXVzdCBiZSBhdCBsZWFzdCBsZW4gYnl0ZXMKLS8vIGxlbiBtdXN0IGJlIDEsIDIsIG9yIDMKLS8vIGJ1ZiBtdXN0IGJlIGEgYnVmZmVyIG9mIGF0IGxlYXN0IDQgYnl0ZXMgYW5kIG1heSBub3Qgb3ZlcmxhcCBpbgotLy8gdGhlIGRhdGEgaXMgbm90IHBhZGRlZCB3aXRoICc9JzsgdGhlIGNhbGxlciBjYW4gZG8gdGhpcyBpZiBkZXNpcmVkCi12b2lkIGJhc2U2NF9lbmNvZGUoY29uc3QgdWludDhfdCAqaW4sIHVpbnQzMl90IGxlbiwgdWludDhfdCAqYnVmKTsKLQotLy8gYnVmIG11c3QgYmUgYSBidWZmZXIgb2YgYXQgbGVhc3QgNCBieXRlcyBhbmQgY29udGFpbiBiYXNlNjQgZW5jb2RlZCB2YWx1ZXMKLS8vIGJ1ZiB3aWxsIGJlIGNoYW5nZWQgdG8gY29udGFpbiBvdXRwdXQgYnl0ZXMKLS8vIGxlbiBpcyBudW1iZXIgb2YgYnl0ZXMgdG8gY29uc3VtZSBmcm9tIGlucHV0IChtdXN0IGJlIDIsIDMsIG9yIDQpCi0vLyBubyAnPScgcGFkZGluZyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGlucHV0Ci12b2lkIGJhc2U2NF9kZWNvZGUodWludDhfdCAqYnVmLCB1aW50MzJfdCBsZW4pOwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCi0KLSNlbmRpZiAvLyAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVEJBU0U2NFVUSUxTX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGI4ODM0Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RCSU5BUllQUk9UT0NPTF9IXwotI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RCSU5BUllQUk9UT0NPTF9IXyAxCi0KLSNpbmNsdWRlICJUUHJvdG9jb2wuaCIKLSNpbmNsdWRlICJUVmlydHVhbFByb3RvY29sLmgiCi0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi0vKioKLSAqIFRoZSBkZWZhdWx0IGJpbmFyeSBwcm90b2NvbCBmb3IgdGhyaWZ0LiBXcml0ZXMgYWxsIGRhdGEgaW4gYSB2ZXJ5IGJhc2ljCi0gKiBiaW5hcnkgZm9ybWF0LCBlc3NlbnRpYWxseSBqdXN0IHNwaXR0aW5nIG91dCB0aGUgcmF3IGJ5dGVzLgotICoKLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci1jbGFzcyBUQmluYXJ5UHJvdG9jb2xUCi0gIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPiB7Ci0gcHJvdGVjdGVkOgotICBzdGF0aWMgY29uc3QgaW50MzJfdCBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwOwotICBzdGF0aWMgY29uc3QgaW50MzJfdCBWRVJTSU9OXzEgPSAweDgwMDEwMDAwOwotICAvLyBWRVJTSU9OXzIgKDB4ODAwMjAwMDApICBpcyB0YWtlbiBieSBURGVuc2VQcm90b2NvbC4KLQotIHB1YmxpYzoKLSAgVEJpbmFyeVByb3RvY29sVChib29zdDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFucykgOgotICAgIFRWaXJ0dWFsUHJvdG9jb2w8IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPih0cmFucyksCi0gICAgdHJhbnNfKHRyYW5zLmdldCgpKSwKLSAgICBzdHJpbmdfbGltaXRfKDApLAotICAgIGNvbnRhaW5lcl9saW1pdF8oMCksCi0gICAgc3RyaWN0X3JlYWRfKGZhbHNlKSwKLSAgICBzdHJpY3Rfd3JpdGVfKHRydWUpLAotICAgIHN0cmluZ19idWZfKE5VTEwpLAotICAgIHN0cmluZ19idWZfc2l6ZV8oMCkge30KLQotICBUQmluYXJ5UHJvdG9jb2xUKGJvb3N0OjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zLAotICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaW5nX2xpbWl0LAotICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29udGFpbmVyX2xpbWl0LAotICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyaWN0X3JlYWQsCi0gICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpY3Rfd3JpdGUpIDoKLSAgICBUVmlydHVhbFByb3RvY29sPCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+ID4odHJhbnMpLAotICAgIHRyYW5zXyh0cmFucy5nZXQoKSksCi0gICAgc3RyaW5nX2xpbWl0XyhzdHJpbmdfbGltaXQpLAotICAgIGNvbnRhaW5lcl9saW1pdF8oY29udGFpbmVyX2xpbWl0KSwKLSAgICBzdHJpY3RfcmVhZF8oc3RyaWN0X3JlYWQpLAotICAgIHN0cmljdF93cml0ZV8oc3RyaWN0X3dyaXRlKSwKLSAgICBzdHJpbmdfYnVmXyhOVUxMKSwKLSAgICBzdHJpbmdfYnVmX3NpemVfKDApIHt9Ci0KLSAgflRCaW5hcnlQcm90b2NvbFQoKSB7Ci0gICAgaWYgKHN0cmluZ19idWZfICE9IE5VTEwpIHsKLSAgICAgIHN0ZDo6ZnJlZShzdHJpbmdfYnVmXyk7Ci0gICAgICBzdHJpbmdfYnVmX3NpemVfID0gMDsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHNldFN0cmluZ1NpemVMaW1pdChpbnQzMl90IHN0cmluZ19saW1pdCkgewotICAgIHN0cmluZ19saW1pdF8gPSBzdHJpbmdfbGltaXQ7Ci0gIH0KLQotICB2b2lkIHNldENvbnRhaW5lclNpemVMaW1pdChpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkgewotICAgIGNvbnRhaW5lcl9saW1pdF8gPSBjb250YWluZXJfbGltaXQ7Ci0gIH0KLQotICB2b2lkIHNldFN0cmljdChib29sIHN0cmljdF9yZWFkLCBib29sIHN0cmljdF93cml0ZSkgewotICAgIHN0cmljdF9yZWFkXyA9IHN0cmljdF9yZWFkOwotICAgIHN0cmljdF93cml0ZV8gPSBzdHJpY3Rfd3JpdGU7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGluZyBmdW5jdGlvbnMuCi0gICAqLwotCi0gIC8qb2wqLyB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpOwotCi0gIC8qb2wqLyB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmQoKTsKLQotCi0gIGlubGluZSB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpOwotCi0gIGlubGluZSB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZCgpOwotCi0gIGlubGluZSB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKTsKLQotICBpbmxpbmUgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpOwotCi0gIGlubGluZSB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcCgpOwotCi0gIGlubGluZSB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpOwotCi0gIGlubGluZSB1aW50MzJfdCB3cml0ZU1hcEVuZCgpOwotCi0gIGlubGluZSB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHdyaXRlTGlzdEVuZCgpOwotCi0gIGlubGluZSB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICBpbmxpbmUgdWludDMyX3Qgd3JpdGVTZXRFbmQoKTsKLQotICBpbmxpbmUgdWludDMyX3Qgd3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpOwotCi0gIGlubGluZSB1aW50MzJfdCB3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpOwotCi0gIGlubGluZSB1aW50MzJfdCB3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNik7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHdyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKTsKLQotICBpbmxpbmUgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpOwotCi0gIGlubGluZSB1aW50MzJfdCB3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKTsKLQotICBpbmxpbmUgdWludDMyX3Qgd3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIC8qKgotICAgKiBSZWFkaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotCi0gIC8qb2wqLyB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCk7Ci0KLSAgLypvbCovIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kKCk7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSk7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKTsKLQotICBpbmxpbmUgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCk7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpOwotCi0gIGlubGluZSB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpOwotCi0gIGlubGluZSB1aW50MzJfdCByZWFkTWFwRW5kKCk7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSk7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHJlYWRMaXN0RW5kKCk7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKTsKLQotICBpbmxpbmUgdWludDMyX3QgcmVhZFNldEVuZCgpOwotCi0gIGlubGluZSB1aW50MzJfdCByZWFkQm9vbChib29sJiB2YWx1ZSk7Ci0gIC8vIFByb3ZpZGUgdGhlIGRlZmF1bHQgcmVhZEJvb2woKSBpbXBsZW1lbnRhdGlvbiBmb3Igc3RkOjp2ZWN0b3I8Ym9vbD4KLSAgdXNpbmcgVFZpcnR1YWxQcm90b2NvbDwgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPiA+OjpyZWFkQm9vbDsKLQotICBpbmxpbmUgdWludDMyX3QgcmVhZEJ5dGUoaW50OF90JiBieXRlKTsKLQotICBpbmxpbmUgdWludDMyX3QgcmVhZEkxNihpbnQxNl90JiBpMTYpOwotCi0gIGlubGluZSB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMik7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHJlYWRJNjQoaW50NjRfdCYgaTY0KTsKLQotICBpbmxpbmUgdWludDMyX3QgcmVhZERvdWJsZShkb3VibGUmIGR1Yik7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHVpbnQzMl90IHJlYWRTdHJpbmdCb2R5KHN0ZDo6c3RyaW5nJiBzdHIsIGludDMyX3Qgc3opOwotCi0gIFRyYW5zcG9ydF8qIHRyYW5zXzsKLQotICBpbnQzMl90IHN0cmluZ19saW1pdF87Ci0gIGludDMyX3QgY29udGFpbmVyX2xpbWl0XzsKLQotICAvLyBFbmZvcmNlIHByZXNlbmNlIG9mIHZlcnNpb24gaWRlbnRpZmllcgotICBib29sIHN0cmljdF9yZWFkXzsKLSAgYm9vbCBzdHJpY3Rfd3JpdGVfOwotCi0gIC8vIEJ1ZmZlciBmb3IgcmVhZGluZyBzdHJpbmdzLCBzYXZlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHByb3RvY29sIHRvCi0gIC8vIGF2b2lkIG1lbW9yeSBjaHVybiBhbGxvY2F0aW5nIG1lbW9yeSBvbiBldmVyeSBzdHJpbmcgcmVhZAotICB1aW50OF90KiBzdHJpbmdfYnVmXzsKLSAgaW50MzJfdCBzdHJpbmdfYnVmX3NpemVfOwotCi19OwotCi10eXBlZGVmIFRCaW5hcnlQcm90b2NvbFQ8VFRyYW5zcG9ydD4gVEJpbmFyeVByb3RvY29sOwotCi0vKioKLSAqIENvbnN0cnVjdHMgYmluYXJ5IHByb3RvY29sIGhhbmRsZXJzCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotY2xhc3MgVEJpbmFyeVByb3RvY29sRmFjdG9yeVQgOiBwdWJsaWMgVFByb3RvY29sRmFjdG9yeSB7Ci0gcHVibGljOgotICBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5VCgpIDoKLSAgICBzdHJpbmdfbGltaXRfKDApLAotICAgIGNvbnRhaW5lcl9saW1pdF8oMCksCi0gICAgc3RyaWN0X3JlYWRfKGZhbHNlKSwKLSAgICBzdHJpY3Rfd3JpdGVfKHRydWUpIHt9Ci0KLSAgVEJpbmFyeVByb3RvY29sRmFjdG9yeVQoaW50MzJfdCBzdHJpbmdfbGltaXQsIGludDMyX3QgY29udGFpbmVyX2xpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmljdF9yZWFkLCBib29sIHN0cmljdF93cml0ZSkgOgotICAgIHN0cmluZ19saW1pdF8oc3RyaW5nX2xpbWl0KSwKLSAgICBjb250YWluZXJfbGltaXRfKGNvbnRhaW5lcl9saW1pdCksCi0gICAgc3RyaWN0X3JlYWRfKHN0cmljdF9yZWFkKSwKLSAgICBzdHJpY3Rfd3JpdGVfKHN0cmljdF93cml0ZSkge30KLQotICB2aXJ0dWFsIH5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5VCgpIHt9Ci0KLSAgdm9pZCBzZXRTdHJpbmdTaXplTGltaXQoaW50MzJfdCBzdHJpbmdfbGltaXQpIHsKLSAgICBzdHJpbmdfbGltaXRfID0gc3RyaW5nX2xpbWl0OwotICB9Ci0KLSAgdm9pZCBzZXRDb250YWluZXJTaXplTGltaXQoaW50MzJfdCBjb250YWluZXJfbGltaXQpIHsKLSAgICBjb250YWluZXJfbGltaXRfID0gY29udGFpbmVyX2xpbWl0OwotICB9Ci0KLSAgdm9pZCBzZXRTdHJpY3QoYm9vbCBzdHJpY3RfcmVhZCwgYm9vbCBzdHJpY3Rfd3JpdGUpIHsKLSAgICBzdHJpY3RfcmVhZF8gPSBzdHJpY3RfcmVhZDsKLSAgICBzdHJpY3Rfd3JpdGVfID0gc3RyaWN0X3dyaXRlOwotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHNwZWNpZmljX3RyYW5zID0KLSAgICAgIGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUcmFuc3BvcnRfPih0cmFucyk7Ci0gICAgVFByb3RvY29sKiBwcm90OwotICAgIGlmIChzcGVjaWZpY190cmFucykgewotICAgICAgcHJvdCA9IG5ldyBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+KHNwZWNpZmljX3RyYW5zLCBzdHJpbmdfbGltaXRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9saW1pdF8sIHN0cmljdF9yZWFkXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3Rfd3JpdGVfKTsKLSAgICB9IGVsc2UgewotICAgICAgcHJvdCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnMsIHN0cmluZ19saW1pdF8sIGNvbnRhaW5lcl9saW1pdF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3RfcmVhZF8sIHN0cmljdF93cml0ZV8pOwotICAgIH0KLQotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KHByb3QpOwotICB9Ci0KLSBwcml2YXRlOgotICBpbnQzMl90IHN0cmluZ19saW1pdF87Ci0gIGludDMyX3QgY29udGFpbmVyX2xpbWl0XzsKLSAgYm9vbCBzdHJpY3RfcmVhZF87Ci0gIGJvb2wgc3RyaWN0X3dyaXRlXzsKLQotfTsKLQotdHlwZWRlZiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5VDxUVHJhbnNwb3J0PiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCi0KLSNpbmNsdWRlICJUQmluYXJ5UHJvdG9jb2wudGNjIgotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RCSU5BUllQUk9UT0NPTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnRjYyBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC50Y2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMWU4OTcuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnRjYworKysgL2Rldi9udWxsCkBAIC0xLDQ2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UQklOQVJZUFJPVE9DT0xfVENDXwotI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RCSU5BUllQUk9UT0NPTF9UQ0NfIDEKLQotI2luY2x1ZGUgIlRCaW5hcnlQcm90b2NvbC5oIgotCi0jaW5jbHVkZSA8bGltaXRzPgotCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKLSAgaWYgKHRoaXMtPnN0cmljdF93cml0ZV8pIHsKLSAgICBpbnQzMl90IHZlcnNpb24gPSAoVkVSU0lPTl8xKSB8ICgoaW50MzJfdCltZXNzYWdlVHlwZSk7Ci0gICAgdWludDMyX3Qgd3NpemUgPSAwOwotICAgIHdzaXplICs9IHdyaXRlSTMyKHZlcnNpb24pOwotICAgIHdzaXplICs9IHdyaXRlU3RyaW5nKG5hbWUpOwotICAgIHdzaXplICs9IHdyaXRlSTMyKHNlcWlkKTsKLSAgICByZXR1cm4gd3NpemU7Ci0gIH0gZWxzZSB7Ci0gICAgdWludDMyX3Qgd3NpemUgPSAwOwotICAgIHdzaXplICs9IHdyaXRlU3RyaW5nKG5hbWUpOwotICAgIHdzaXplICs9IHdyaXRlQnl0ZSgoaW50OF90KW1lc3NhZ2VUeXBlKTsKLSAgICB3c2l6ZSArPSB3cml0ZUkzMihzZXFpZCk7Ci0gICAgcmV0dXJuIHdzaXplOwotICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVNZXNzYWdlRW5kKCkgewotICByZXR1cm4gMDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgKHZvaWQpIG5hbWU7Ci0gIHJldHVybiAwOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU3RydWN0RW5kKCkgewotICByZXR1cm4gMDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7Ci0gICh2b2lkKSBuYW1lOwotICB1aW50MzJfdCB3c2l6ZSA9IDA7Ci0gIHdzaXplICs9IHdyaXRlQnl0ZSgoaW50OF90KWZpZWxkVHlwZSk7Ci0gIHdzaXplICs9IHdyaXRlSTE2KGZpZWxkSWQpOwotICByZXR1cm4gd3NpemU7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVGaWVsZEVuZCgpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVGaWVsZFN0b3AoKSB7Ci0gIHJldHVybgotICAgIHdyaXRlQnl0ZSgoaW50OF90KVRfU1RPUCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIHVpbnQzMl90IHdzaXplID0gMDsKLSAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3Qpa2V5VHlwZSk7Ci0gIHdzaXplICs9IHdyaXRlQnl0ZSgoaW50OF90KXZhbFR5cGUpOwotICB3c2l6ZSArPSB3cml0ZUkzMigoaW50MzJfdClzaXplKTsKLSAgcmV0dXJuIHdzaXplOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlTWFwRW5kKCkgewotICByZXR1cm4gMDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgdWludDMyX3Qgd3NpemUgPSAwOwotICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGludDhfdCkgZWxlbVR5cGUpOwotICB3c2l6ZSArPSB3cml0ZUkzMigoaW50MzJfdClzaXplKTsKLSAgcmV0dXJuIHdzaXplOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlTGlzdEVuZCgpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICB1aW50MzJfdCB3c2l6ZSA9IDA7Ci0gIHdzaXplICs9IHdyaXRlQnl0ZSgoaW50OF90KWVsZW1UeXBlKTsKLSAgd3NpemUgKz0gd3JpdGVJMzIoKGludDMyX3Qpc2l6ZSk7Ci0gIHJldHVybiB3c2l6ZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZVNldEVuZCgpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpIHsKLSAgdWludDhfdCB0bXAgPSAgdmFsdWUgPyAxIDogMDsKLSAgdGhpcy0+dHJhbnNfLT53cml0ZSgmdG1wLCAxKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSB7Ci0gIHRoaXMtPnRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKSZieXRlLCAxKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKLSAgaW50MTZfdCBuZXQgPSAoaW50MTZfdClodG9ucyhpMTYpOwotICB0aGlzLT50cmFuc18tPndyaXRlKCh1aW50OF90KikmbmV0LCAyKTsKLSAgcmV0dXJuIDI7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKLSAgaW50MzJfdCBuZXQgPSAoaW50MzJfdClodG9ubChpMzIpOwotICB0aGlzLT50cmFuc18tPndyaXRlKCh1aW50OF90KikmbmV0LCA0KTsKLSAgcmV0dXJuIDQ7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKLSAgaW50NjRfdCBuZXQgPSAoaW50NjRfdClodG9ubGwoaTY0KTsKLSAgdGhpcy0+dHJhbnNfLT53cml0ZSgodWludDhfdCopJm5ldCwgOCk7Ci0gIHJldHVybiA4OwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpIHsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpKTsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSk7Ci0KLSAgdWludDY0X3QgYml0cyA9IGJpdHdpc2VfY2FzdDx1aW50NjRfdD4oZHViKTsKLSAgYml0cyA9IGh0b25sbChiaXRzKTsKLSAgdGhpcy0+dHJhbnNfLT53cml0ZSgodWludDhfdCopJmJpdHMsIDgpOwotICByZXR1cm4gODsKLX0KLQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgdWludDMyX3Qgc2l6ZSA9IHN0ci5zaXplKCk7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IHdyaXRlSTMyKChpbnQzMl90KXNpemUpOwotICBpZiAoc2l6ZSA+IDApIHsKLSAgICB0aGlzLT50cmFuc18tPndyaXRlKCh1aW50OF90KilzdHIuZGF0YSgpLCBzaXplKTsKLSAgfQotICByZXR1cm4gcmVzdWx0ICsgc2l6ZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZVN0cmluZyhzdHIpOwotfQotCi0vKioKLSAqIFJlYWRpbmcgZnVuY3Rpb25zCi0gKi8KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCkgewotICB1aW50MzJfdCByZXN1bHQgPSAwOwotICBpbnQzMl90IHN6OwotICByZXN1bHQgKz0gcmVhZEkzMihzeik7Ci0KLSAgaWYgKHN6IDwgMCkgewotICAgIC8vIENoZWNrIGZvciBjb3JyZWN0IHZlcnNpb24gbnVtYmVyCi0gICAgaW50MzJfdCB2ZXJzaW9uID0gc3ogJiBWRVJTSU9OX01BU0s7Ci0gICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTl8xKSB7Ci0gICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTiwgIkJhZCB2ZXJzaW9uIGlkZW50aWZpZXIiKTsKLSAgICB9Ci0gICAgbWVzc2FnZVR5cGUgPSAoVE1lc3NhZ2VUeXBlKShzeiAmIDB4MDAwMDAwZmYpOwotICAgIHJlc3VsdCArPSByZWFkU3RyaW5nKG5hbWUpOwotICAgIHJlc3VsdCArPSByZWFkSTMyKHNlcWlkKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAodGhpcy0+c3RyaWN0X3JlYWRfKSB7Ci0gICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTiwgIk5vIHZlcnNpb24gaWRlbnRpZmllci4uLiBvbGQgcHJvdG9jb2wgY2xpZW50IGluIHN0cmljdCBtb2RlPyIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBIYW5kbGUgcHJlLXZlcnNpb25lZCBpbnB1dAotICAgICAgaW50OF90IHR5cGU7Ci0gICAgICByZXN1bHQgKz0gcmVhZFN0cmluZ0JvZHkobmFtZSwgc3opOwotICAgICAgcmVzdWx0ICs9IHJlYWRCeXRlKHR5cGUpOwotICAgICAgbWVzc2FnZVR5cGUgPSAoVE1lc3NhZ2VUeXBlKXR5cGU7Ci0gICAgICByZXN1bHQgKz0gcmVhZEkzMihzZXFpZCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZE1lc3NhZ2VFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSkgewotICBuYW1lID0gIiI7Ci0gIHJldHVybiAwOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTdHJ1Y3RFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKLSAgKHZvaWQpIG5hbWU7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gIGludDhfdCB0eXBlOwotICByZXN1bHQgKz0gcmVhZEJ5dGUodHlwZSk7Ci0gIGZpZWxkVHlwZSA9IChUVHlwZSl0eXBlOwotICBpZiAoZmllbGRUeXBlID09IFRfU1RPUCkgewotICAgIGZpZWxkSWQgPSAwOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgcmVzdWx0ICs9IHJlYWRJMTYoZmllbGRJZCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEZpZWxkRW5kKCkgewotICByZXR1cm4gMDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgaW50OF90IGssIHY7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gIGludDMyX3Qgc2l6ZWk7Ci0gIHJlc3VsdCArPSByZWFkQnl0ZShrKTsKLSAga2V5VHlwZSA9IChUVHlwZSlrOwotICByZXN1bHQgKz0gcmVhZEJ5dGUodik7Ci0gIHZhbFR5cGUgPSAoVFR5cGUpdjsKLSAgcmVzdWx0ICs9IHJlYWRJMzIoc2l6ZWkpOwotICBpZiAoc2l6ZWkgPCAwKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7Ci0gIH0gZWxzZSBpZiAodGhpcy0+Y29udGFpbmVyX2xpbWl0XyAmJiBzaXplaSA+IHRoaXMtPmNvbnRhaW5lcl9saW1pdF8pIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgfQotICBzaXplID0gKHVpbnQzMl90KXNpemVpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRNYXBFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICBpbnQ4X3QgZTsKLSAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgaW50MzJfdCBzaXplaTsKLSAgcmVzdWx0ICs9IHJlYWRCeXRlKGUpOwotICBlbGVtVHlwZSA9IChUVHlwZSllOwotICByZXN1bHQgKz0gcmVhZEkzMihzaXplaSk7Ci0gIGlmIChzaXplaSA8IDApIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKLSAgfSBlbHNlIGlmICh0aGlzLT5jb250YWluZXJfbGltaXRfICYmIHNpemVpID4gdGhpcy0+Y29udGFpbmVyX2xpbWl0XykgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwotICB9Ci0gIHNpemUgPSAodWludDMyX3Qpc2l6ZWk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZExpc3RFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgaW50OF90IGU7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gIGludDMyX3Qgc2l6ZWk7Ci0gIHJlc3VsdCArPSByZWFkQnl0ZShlKTsKLSAgZWxlbVR5cGUgPSAoVFR5cGUpZTsKLSAgcmVzdWx0ICs9IHJlYWRJMzIoc2l6ZWkpOwotICBpZiAoc2l6ZWkgPCAwKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7Ci0gIH0gZWxzZSBpZiAodGhpcy0+Y29udGFpbmVyX2xpbWl0XyAmJiBzaXplaSA+IHRoaXMtPmNvbnRhaW5lcl9saW1pdF8pIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgfQotICBzaXplID0gKHVpbnQzMl90KXNpemVpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTZXRFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRCb29sKGJvb2wmIHZhbHVlKSB7Ci0gIHVpbnQ4X3QgYlsxXTsKLSAgdGhpcy0+dHJhbnNfLT5yZWFkQWxsKGIsIDEpOwotICB2YWx1ZSA9ICooaW50OF90KiliICE9IDA7Ci0gIHJldHVybiAxOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRCeXRlKGludDhfdCYgYnl0ZSkgewotICB1aW50OF90IGJbMV07Ci0gIHRoaXMtPnRyYW5zXy0+cmVhZEFsbChiLCAxKTsKLSAgYnl0ZSA9ICooaW50OF90KiliOwotICByZXR1cm4gMTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkSTE2KGludDE2X3QmIGkxNikgewotICB1bmlvbiBieXRlcyB7Ci0gICAgdWludDhfdCBiWzJdOwotICAgIGludDE2X3QgYWxsOwotICB9IHRoZUJ5dGVzOwotICB0aGlzLT50cmFuc18tPnJlYWRBbGwodGhlQnl0ZXMuYiwgMik7Ci0gIGkxNiA9IChpbnQxNl90KW50b2hzKHRoZUJ5dGVzLmFsbCk7Ci0gIHJldHVybiAyOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRJMzIoaW50MzJfdCYgaTMyKSB7Ci0gIHVuaW9uIGJ5dGVzIHsKLSAgICB1aW50OF90IGJbNF07Ci0gICAgaW50MzJfdCBhbGw7Ci0gIH0gdGhlQnl0ZXM7Ci0gIHRoaXMtPnRyYW5zXy0+cmVhZEFsbCh0aGVCeXRlcy5iLCA0KTsKLSAgaTMyID0gKGludDMyX3QpbnRvaGwodGhlQnl0ZXMuYWxsKTsKLSAgcmV0dXJuIDQ7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEk2NChpbnQ2NF90JiBpNjQpIHsKLSAgdW5pb24gYnl0ZXMgewotICAgIHVpbnQ4X3QgYls4XTsKLSAgICBpbnQ2NF90IGFsbDsKLSAgfSB0aGVCeXRlczsKLSAgdGhpcy0+dHJhbnNfLT5yZWFkQWxsKHRoZUJ5dGVzLmIsIDgpOwotICBpNjQgPSAoaW50NjRfdCludG9obGwodGhlQnl0ZXMuYWxsKTsKLSAgcmV0dXJuIDg7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZERvdWJsZShkb3VibGUmIGR1YikgewotICBCT09TVF9TVEFUSUNfQVNTRVJUKHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkpOwotICBCT09TVF9TVEFUSUNfQVNTRVJUKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5KTsKLQotICB1bmlvbiBieXRlcyB7Ci0gICAgdWludDhfdCBiWzhdOwotICAgIHVpbnQ2NF90IGFsbDsKLSAgfSB0aGVCeXRlczsKLSAgdGhpcy0+dHJhbnNfLT5yZWFkQWxsKHRoZUJ5dGVzLmIsIDgpOwotICB0aGVCeXRlcy5hbGwgPSBudG9obGwodGhlQnl0ZXMuYWxsKTsKLSAgZHViID0gYml0d2lzZV9jYXN0PGRvdWJsZT4odGhlQnl0ZXMuYWxsKTsKLSAgcmV0dXJuIDg7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHVpbnQzMl90IHJlc3VsdDsKLSAgaW50MzJfdCBzaXplOwotICByZXN1bHQgPSByZWFkSTMyKHNpemUpOwotICByZXR1cm4gcmVzdWx0ICsgcmVhZFN0cmluZ0JvZHkoc3RyLCBzaXplKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTdHJpbmcoc3RyKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkU3RyaW5nQm9keShzdGQ6OnN0cmluZyYgc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzaXplKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0KLSAgLy8gQ2F0Y2ggZXJyb3IgY2FzZXMKLSAgaWYgKHNpemUgPCAwKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7Ci0gIH0KLSAgaWYgKHRoaXMtPnN0cmluZ19saW1pdF8gPiAwICYmIHNpemUgPiB0aGlzLT5zdHJpbmdfbGltaXRfKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7Ci0gIH0KLQotICAvLyBDYXRjaCBlbXB0eSBzdHJpbmcgY2FzZQotICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgc3RyID0gIiI7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8vIFRyeSB0byBib3Jyb3cgZmlyc3QKLSAgY29uc3QgdWludDhfdCogYm9ycm93X2J1ZjsKLSAgdWludDMyX3QgZ290ID0gc2l6ZTsKLSAgaWYgKChib3Jyb3dfYnVmID0gdGhpcy0+dHJhbnNfLT5ib3Jyb3coTlVMTCwgJmdvdCkpKSB7Ci0gICAgc3RyLmFzc2lnbigoY29uc3QgY2hhciopYm9ycm93X2J1Ziwgc2l6ZSk7Ci0gICAgdGhpcy0+dHJhbnNfLT5jb25zdW1lKHNpemUpOwotICAgIHJldHVybiBzaXplOwotICB9Ci0KLSAgLy8gVXNlIHRoZSBoZWFwIGhlcmUgdG8gcHJldmVudCBzdGFjayBvdmVyZmxvdyBmb3Igdi4gbGFyZ2Ugc3RyaW5ncwotICBpZiAoc2l6ZSA+IHRoaXMtPnN0cmluZ19idWZfc2l6ZV8gfHwgdGhpcy0+c3RyaW5nX2J1Zl8gPT0gTlVMTCkgewotICAgIHZvaWQqIG5ld19zdHJpbmdfYnVmID0gc3RkOjpyZWFsbG9jKHRoaXMtPnN0cmluZ19idWZfLCAodWludDMyX3Qpc2l6ZSk7Ci0gICAgaWYgKG5ld19zdHJpbmdfYnVmID09IE5VTEwpIHsKLSAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7Ci0gICAgfQotICAgIHRoaXMtPnN0cmluZ19idWZfID0gKHVpbnQ4X3QqKW5ld19zdHJpbmdfYnVmOwotICAgIHRoaXMtPnN0cmluZ19idWZfc2l6ZV8gPSBzaXplOwotICB9Ci0gIHRoaXMtPnRyYW5zXy0+cmVhZEFsbCh0aGlzLT5zdHJpbmdfYnVmXywgc2l6ZSk7Ci0gIHN0ciA9IHN0ZDo6c3RyaW5nKChjaGFyKil0aGlzLT5zdHJpbmdfYnVmXywgc2l6ZSk7Ci0gIHJldHVybiAodWludDMyX3Qpc2l6ZTsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RCSU5BUllQUk9UT0NPTF9UQ0NfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmggYi9saWIvY3BwL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZDFmMDguLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RDT01QQUNUUFJPVE9DT0xfSF8KLSNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UQ09NUEFDVFBST1RPQ09MX0hfIDEKLQotI2luY2x1ZGUgIlRWaXJ0dWFsUHJvdG9jb2wuaCIKLQotI2luY2x1ZGUgPHN0YWNrPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm90b2NvbCB7Ci0KLS8qKgotICogQysrIEltcGxlbWVudGF0aW9uIG9mIHRoZSBDb21wYWN0IFByb3RvY29sIGFzIGRlc2NyaWJlZCBpbiBUSFJJRlQtMTEwCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotY2xhc3MgVENvbXBhY3RQcm90b2NvbFQKLSAgOiBwdWJsaWMgVFZpcnR1YWxQcm90b2NvbDwgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPiB7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHN0YXRpYyBjb25zdCBpbnQ4X3QgIFBST1RPQ09MX0lEID0gKGludDhfdCkweDgyOwotICBzdGF0aWMgY29uc3QgaW50OF90ICBWRVJTSU9OX04gPSAxOwotICBzdGF0aWMgY29uc3QgaW50OF90ICBWRVJTSU9OX01BU0sgPSAweDFmOyAvLyAwMDAxIDExMTEKLSAgc3RhdGljIGNvbnN0IGludDhfdCAgVFlQRV9NQVNLID0gKGludDhfdCkweEUwOyAvLyAxMTEwIDAwMDAKLSAgc3RhdGljIGNvbnN0IGludDMyX3QgVFlQRV9TSElGVF9BTU9VTlQgPSA1OwotCi0gIFRyYW5zcG9ydF8qIHRyYW5zXzsKLQotICAvKioKLSAgICogKFdyaXRpbmcpIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlCi0gICAqIHNvIGl0IGNhbiBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCi0gICAqLwotICBzdHJ1Y3QgewotICAgIGNvbnN0IGNoYXIqIG5hbWU7Ci0gICAgVFR5cGUgZmllbGRUeXBlOwotICAgIGludDE2X3QgZmllbGRJZDsKLSAgfSBib29sZWFuRmllbGRfOwotCi0gIC8qKgotICAgKiAoUmVhZGluZykgSWYgd2UgcmVhZCBhIGZpZWxkIGhlYWRlciwgYW5kIGl0J3MgYSBib29sZWFuIGZpZWxkLCBzYXZlCi0gICAqIHRoZSBib29sZWFuIHZhbHVlIGhlcmUgc28gdGhhdCByZWFkQm9vbCBjYW4gdXNlIGl0LgotICAgKi8KLSAgc3RydWN0IHsKLSAgICBib29sIGhhc0Jvb2xWYWx1ZTsKLSAgICBib29sIGJvb2xWYWx1ZTsKLSAgfSBib29sVmFsdWVfOwotCi0gIC8qKgotICAgKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAotICAgKiBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgotICAgKi8KLQotICBzdGQ6OnN0YWNrPGludDE2X3Q+IGxhc3RGaWVsZF87Ci0gIGludDE2X3QgbGFzdEZpZWxkSWRfOwotCi0gcHVibGljOgotICBUQ29tcGFjdFByb3RvY29sVChib29zdDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFucykgOgotICAgIFRWaXJ0dWFsUHJvdG9jb2w8IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+ID4odHJhbnMpLAotICAgIHRyYW5zXyh0cmFucy5nZXQoKSksCi0gICAgbGFzdEZpZWxkSWRfKDApLAotICAgIHN0cmluZ19saW1pdF8oMCksCi0gICAgc3RyaW5nX2J1Zl8oTlVMTCksCi0gICAgc3RyaW5nX2J1Zl9zaXplXygwKSwKLSAgICBjb250YWluZXJfbGltaXRfKDApIHsKLSAgICBib29sZWFuRmllbGRfLm5hbWUgPSBOVUxMOwotICAgIGJvb2xWYWx1ZV8uaGFzQm9vbFZhbHVlID0gZmFsc2U7Ci0gIH0KLQotICBUQ29tcGFjdFByb3RvY29sVChib29zdDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFucywKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdHJpbmdfbGltaXQsCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29udGFpbmVyX2xpbWl0KSA6Ci0gICAgVFZpcnR1YWxQcm90b2NvbDwgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPih0cmFucyksCi0gICAgdHJhbnNfKHRyYW5zLmdldCgpKSwKLSAgICBsYXN0RmllbGRJZF8oMCksCi0gICAgc3RyaW5nX2xpbWl0XyhzdHJpbmdfbGltaXQpLAotICAgIHN0cmluZ19idWZfKE5VTEwpLAotICAgIHN0cmluZ19idWZfc2l6ZV8oMCksCi0gICAgY29udGFpbmVyX2xpbWl0Xyhjb250YWluZXJfbGltaXQpIHsKLSAgICBib29sZWFuRmllbGRfLm5hbWUgPSBOVUxMOwotICAgIGJvb2xWYWx1ZV8uaGFzQm9vbFZhbHVlID0gZmFsc2U7Ci0gIH0KLQotICB+VENvbXBhY3RQcm90b2NvbFQoKSB7Ci0gICAgZnJlZShzdHJpbmdfYnVmXyk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBXcml0aW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKTsKLQotICB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpOwotCi0gIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpOwotCi0gIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpOwotCi0gIHVpbnQzMl90IHdyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpOwotCi0gIHVpbnQzMl90IHdyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpOwotCi0gIHVpbnQzMl90IHdyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKTsKLQotICB1aW50MzJfdCB3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1Yik7Ci0KLSAgdWludDMyX3Qgd3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgdWludDMyX3Qgd3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgLyoqCi0gICogVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIGJ5IHN0cnVjdHMsIGJ1dCBkb24ndCBhY3R1YWxseSBoYXZlIGFueSB3aXJlZAotICAqIG91dHB1dCBvciBwdXJwb3NlCi0gICovCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kKCkgeyByZXR1cm4gMDsgfQotICB1aW50MzJfdCB3cml0ZU1hcEVuZCgpIHsgcmV0dXJuIDA7IH0KLSAgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCkgeyByZXR1cm4gMDsgfQotICB1aW50MzJfdCB3cml0ZVNldEVuZCgpIHsgcmV0dXJuIDA7IH0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpIHsgcmV0dXJuIDA7IH0KLQotIHByb3RlY3RlZDoKLSAgaW50MzJfdCB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90IHR5cGVPdmVycmlkZSk7Ci0gIHVpbnQzMl90IHdyaXRlQ29sbGVjdGlvbkJlZ2luKGludDhfdCBlbGVtVHlwZSwgaW50MzJfdCBzaXplKTsKLSAgdWludDMyX3Qgd3JpdGVWYXJpbnQzMih1aW50MzJfdCBuKTsKLSAgdWludDMyX3Qgd3JpdGVWYXJpbnQ2NCh1aW50NjRfdCBuKTsKLSAgdWludDY0X3QgaTY0VG9aaWd6YWcoY29uc3QgaW50NjRfdCBsKTsKLSAgdWludDMyX3QgaTMyVG9aaWd6YWcoY29uc3QgaW50MzJfdCBuKTsKLSAgaW5saW5lIGludDhfdCBnZXRDb21wYWN0VHlwZShpbnQ4X3QgdHR5cGUpOwotCi0gcHVibGljOgotICB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpOwotCi0gIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSk7Ci0KLSAgdWludDMyX3QgcmVhZFN0cnVjdEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKTsKLQotICB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKTsKLQotICB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7Ci0KLSAgdWludDMyX3QgcmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKTsKLQotICB1aW50MzJfdCByZWFkQm9vbChib29sJiB2YWx1ZSk7Ci0gIC8vIFByb3ZpZGUgdGhlIGRlZmF1bHQgcmVhZEJvb2woKSBpbXBsZW1lbnRhdGlvbiBmb3Igc3RkOjp2ZWN0b3I8Ym9vbD4KLSAgdXNpbmcgVFZpcnR1YWxQcm90b2NvbDwgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPjo6cmVhZEJvb2w7Ci0KLSAgdWludDMyX3QgcmVhZEJ5dGUoaW50OF90JiBieXRlKTsKLQotICB1aW50MzJfdCByZWFkSTE2KGludDE2X3QmIGkxNik7Ci0KLSAgdWludDMyX3QgcmVhZEkzMihpbnQzMl90JiBpMzIpOwotCi0gIHVpbnQzMl90IHJlYWRJNjQoaW50NjRfdCYgaTY0KTsKLQotICB1aW50MzJfdCByZWFkRG91YmxlKGRvdWJsZSYgZHViKTsKLQotICB1aW50MzJfdCByZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIHVpbnQzMl90IHJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgLyoKLSAgICpUaGVzZSBtZXRob2RzIGFyZSBoZXJlIGZvciB0aGUgc3RydWN0IHRvIGNhbGwsIGJ1dCBkb24ndCBoYXZlIGFueSB3aXJlCi0gICAqIGVuY29kaW5nLgotICAgKi8KLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmQoKSB7IHJldHVybiAwOyB9Ci0gIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpIHsgcmV0dXJuIDA7IH0KLSAgdWludDMyX3QgcmVhZE1hcEVuZCgpIHsgcmV0dXJuIDA7IH0KLSAgdWludDMyX3QgcmVhZExpc3RFbmQoKSB7IHJldHVybiAwOyB9Ci0gIHVpbnQzMl90IHJlYWRTZXRFbmQoKSB7IHJldHVybiAwOyB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHVpbnQzMl90IHJlYWRWYXJpbnQzMihpbnQzMl90JiBpMzIpOwotICB1aW50MzJfdCByZWFkVmFyaW50NjQoaW50NjRfdCYgaTY0KTsKLSAgaW50MzJfdCB6aWd6YWdUb0kzMih1aW50MzJfdCBuKTsKLSAgaW50NjRfdCB6aWd6YWdUb0k2NCh1aW50NjRfdCBuKTsKLSAgVFR5cGUgZ2V0VFR5cGUoaW50OF90IHR5cGUpOwotCi0gIC8vIEJ1ZmZlciBmb3IgcmVhZGluZyBzdHJpbmdzLCBzYXZlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHByb3RvY29sIHRvCi0gIC8vIGF2b2lkIG1lbW9yeSBjaHVybiBhbGxvY2F0aW5nIG1lbW9yeSBvbiBldmVyeSBzdHJpbmcgcmVhZAotICBpbnQzMl90IHN0cmluZ19saW1pdF87Ci0gIHVpbnQ4X3QqIHN0cmluZ19idWZfOwotICBpbnQzMl90IHN0cmluZ19idWZfc2l6ZV87Ci0gIGludDMyX3QgY29udGFpbmVyX2xpbWl0XzsKLX07Ci0KLXR5cGVkZWYgVENvbXBhY3RQcm90b2NvbFQ8VFRyYW5zcG9ydD4gVENvbXBhY3RQcm90b2NvbDsKLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGNvbXBhY3QgcHJvdG9jb2wgaGFuZGxlcnMKLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci1jbGFzcyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeVQgOiBwdWJsaWMgVFByb3RvY29sRmFjdG9yeSB7Ci0gcHVibGljOgotICBUQ29tcGFjdFByb3RvY29sRmFjdG9yeVQoKSA6Ci0gICAgc3RyaW5nX2xpbWl0XygwKSwKLSAgICBjb250YWluZXJfbGltaXRfKDApIHt9Ci0KLSAgVENvbXBhY3RQcm90b2NvbEZhY3RvcnlUKGludDMyX3Qgc3RyaW5nX2xpbWl0LCBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkgOgotICAgIHN0cmluZ19saW1pdF8oc3RyaW5nX2xpbWl0KSwKLSAgICBjb250YWluZXJfbGltaXRfKGNvbnRhaW5lcl9saW1pdCkge30KLQotICB2aXJ0dWFsIH5UQ29tcGFjdFByb3RvY29sRmFjdG9yeVQoKSB7fQotCi0gIHZvaWQgc2V0U3RyaW5nU2l6ZUxpbWl0KGludDMyX3Qgc3RyaW5nX2xpbWl0KSB7Ci0gICAgc3RyaW5nX2xpbWl0XyA9IHN0cmluZ19saW1pdDsKLSAgfQotCi0gIHZvaWQgc2V0Q29udGFpbmVyU2l6ZUxpbWl0KGludDMyX3QgY29udGFpbmVyX2xpbWl0KSB7Ci0gICAgY29udGFpbmVyX2xpbWl0XyA9IGNvbnRhaW5lcl9saW1pdDsKLSAgfQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiBzcGVjaWZpY190cmFucyA9Ci0gICAgICBib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VHJhbnNwb3J0Xz4odHJhbnMpOwotICAgIFRQcm90b2NvbCogcHJvdDsKLSAgICBpZiAoc3BlY2lmaWNfdHJhbnMpIHsKLSAgICAgIHByb3QgPSBuZXcgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4oc3BlY2lmaWNfdHJhbnMsIHN0cmluZ19saW1pdF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9saW1pdF8pOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcm90ID0gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnMsIHN0cmluZ19saW1pdF8sIGNvbnRhaW5lcl9saW1pdF8pOwotICAgIH0KLQotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KHByb3QpOwotICB9Ci0KLSBwcml2YXRlOgotICBpbnQzMl90IHN0cmluZ19saW1pdF87Ci0gIGludDMyX3QgY29udGFpbmVyX2xpbWl0XzsKLQotfTsKLQotdHlwZWRlZiBUQ29tcGFjdFByb3RvY29sRmFjdG9yeVQ8VFRyYW5zcG9ydD4gVENvbXBhY3RQcm90b2NvbEZhY3Rvcnk7Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKLQotI2luY2x1ZGUgIlRDb21wYWN0UHJvdG9jb2wudGNjIgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wudGNjIGIvbGliL2NwcC9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC50Y2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Yjc4NGYuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC50Y2MKKysrIC9kZXYvbnVsbApAQCAtMSw4MTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RDT01QQUNUUFJPVE9DT0xfVENDXwotI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RDT01QQUNUUFJPVE9DT0xfVENDXyAxCi0KLSNpbmNsdWRlIDxsaW1pdHM+Ci0KLS8qCi0gKiBUQ29tcGFjdFByb3RvY29sOjppKlRvWmlnemFnIGRlcGVuZCBvbiB0aGUgZmFjdCB0aGF0IHRoZSByaWdodCBzaGlmdAotICogb3BlcmF0b3Igb24gYSBzaWduZWQgaW50ZWdlciBpcyBhbiBhcml0aG1ldGljIChzaWduLWV4dGVuZGluZykgc2hpZnQuCi0gKiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gd2lsbCBub3Qgd29yay4KLSAqIElmIGFueW9uZSBlbmNvdW50ZXJzIHRoaXMgZXJyb3IsIHdlIGNhbiB0cnkgdG8gZmlndXJlIG91dCB0aGUgYmVzdAotICogd2F5IHRvIGltcGxlbWVudCBhbiBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0IG9uIHRoZWlyIHBsYXRmb3JtLgotICovCi0jaWYgIWRlZmluZWQoU0lHTkVEX1JJR0hUX1NISUZUX0lTKSB8fCAhZGVmaW5lZChBUklUSE1FVElDX1JJR0hUX1NISUZUKQotIyBlcnJvciAiVW5hYmxlIHRvIGRldGVybWluZSB0aGUgYmVoYXZpb3Igb2YgYSBzaWduZWQgcmlnaHQgc2hpZnQiCi0jZW5kaWYKLSNpZiBTSUdORURfUklHSFRfU0hJRlRfSVMgIT0gQVJJVEhNRVRJQ19SSUdIVF9TSElGVAotIyBlcnJvciAiVENvbXBhY3RQcm90b2NvbCBjdXJyZW50bHkgb25seSB3b3JrcyBpZiBhIHNpZ25lZCByaWdodCBzaGlmdCBpcyBhcml0aG1ldGljIgotI2VuZGlmCi0KLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBVTkxJS0VMWSh2YWwpIChfX2J1aWx0aW5fZXhwZWN0KCh2YWwpLCAwKSkKLSNlbHNlCi0jZGVmaW5lIFVOTElLRUxZKHZhbCkgKHZhbCkKLSNlbmRpZgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm90b2NvbCB7Ci0KLW5hbWVzcGFjZSBkZXRhaWwgeyBuYW1lc3BhY2UgY29tcGFjdCB7Ci0KLWVudW0gVHlwZXMgewotICBDVF9TVE9QICAgICAgICAgICA9IDB4MDAsCi0gIENUX0JPT0xFQU5fVFJVRSAgID0gMHgwMSwKLSAgQ1RfQk9PTEVBTl9GQUxTRSAgPSAweDAyLAotICBDVF9CWVRFICAgICAgICAgICA9IDB4MDMsCi0gIENUX0kxNiAgICAgICAgICAgID0gMHgwNCwKLSAgQ1RfSTMyICAgICAgICAgICAgPSAweDA1LAotICBDVF9JNjQgICAgICAgICAgICA9IDB4MDYsCi0gIENUX0RPVUJMRSAgICAgICAgID0gMHgwNywKLSAgQ1RfQklOQVJZICAgICAgICAgPSAweDA4LAotICBDVF9MSVNUICAgICAgICAgICA9IDB4MDksCi0gIENUX1NFVCAgICAgICAgICAgID0gMHgwQSwKLSAgQ1RfTUFQICAgICAgICAgICAgPSAweDBCLAotICBDVF9TVFJVQ1QgICAgICAgICA9IDB4MEMKLX07Ci0KLWNvbnN0IGludDhfdCBUVHlwZVRvQ1R5cGVbMTZdID0gewotICBDVF9TVE9QLCAvLyBUX1NUT1AKLSAgMCwgLy8gdW51c2VkCi0gIENUX0JPT0xFQU5fVFJVRSwgLy8gVF9CT09MCi0gIENUX0JZVEUsIC8vIFRfQllURQotICBDVF9ET1VCTEUsIC8vIFRfRE9VQkxFCi0gIDAsIC8vIHVudXNlZAotICBDVF9JMTYsIC8vIFRfSTE2Ci0gIDAsIC8vIHVudXNlZAotICBDVF9JMzIsIC8vIFRfSTMyCi0gIDAsIC8vIHVudXNlZAotICBDVF9JNjQsIC8vIFRfSTY0Ci0gIENUX0JJTkFSWSwgLy8gVF9TVFJJTkcKLSAgQ1RfU1RSVUNULCAvLyBUX1NUUlVDVAotICBDVF9NQVAsIC8vIFRfTUFQCi0gIENUX1NFVCwgLy8gVF9TRVQKLSAgQ1RfTElTVCwgLy8gVF9MSVNUCi19OwotCi19fSAvLyBlbmQgZGV0YWlsOjpjb21wYWN0IG5hbWVzcGFjZQotCi0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlTWVzc2FnZUJlZ2luKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKLSAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7Ci0gIHVpbnQzMl90IHdzaXplID0gMDsKLSAgd3NpemUgKz0gd3JpdGVCeXRlKFBST1RPQ09MX0lEKTsKLSAgd3NpemUgKz0gd3JpdGVCeXRlKChWRVJTSU9OX04gJiBWRVJTSU9OX01BU0spIHwgKCgoaW50MzJfdCltZXNzYWdlVHlwZSA8PCBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX01BU0spKTsKLSAgd3NpemUgKz0gd3JpdGVWYXJpbnQzMihzZXFpZCk7Ci0gIHdzaXplICs9IHdyaXRlU3RyaW5nKG5hbWUpOwotICByZXR1cm4gd3NpemU7Ci19Ci0KLS8qKgotICogV3JpdGUgYSBmaWVsZCBoZWFkZXIgY29udGFpbmluZyB0aGUgZmllbGQgaWQgYW5kIGZpZWxkIHR5cGUuIElmIHRoZQotICogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IGZpZWxkIGlkIGFuZCB0aGUgbGFzdCBvbmUgaXMgc21hbGwgKDwgMTUpLAotICogdGhlbiB0aGUgZmllbGQgaWQgd2lsbCBiZSBlbmNvZGVkIGluIHRoZSA0IE1TQiBhcyBhIGRlbHRhLiBPdGhlcndpc2UsIHRoZQotICogZmllbGQgaWQgd2lsbCBmb2xsb3cgdGhlIHR5cGUgaGVhZGVyIGFzIGEgemlnemFnIHZhcmludC4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7Ci0gIGlmIChmaWVsZFR5cGUgPT0gVF9CT09MKSB7Ci0gICAgYm9vbGVhbkZpZWxkXy5uYW1lID0gbmFtZTsKLSAgICBib29sZWFuRmllbGRfLmZpZWxkVHlwZSA9IGZpZWxkVHlwZTsKLSAgICBib29sZWFuRmllbGRfLmZpZWxkSWQgPSBmaWVsZElkOwotICB9IGVsc2UgewotICAgIHJldHVybiB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQsIC0xKTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBXcml0ZSB0aGUgU1RPUCBzeW1ib2wgc28gd2Uga25vdyB0aGVyZSBhcmUgbm8gbW9yZSBmaWVsZHMgaW4gdGhpcyBzdHJ1Y3QuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlRmllbGRTdG9wKCkgewotICByZXR1cm4gd3JpdGVCeXRlKFRfU1RPUCk7Ci19Ci0KLS8qKgotICogV3JpdGUgYSBzdHJ1Y3QgYmVnaW4uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlCi0gKiB1c2UgaXQgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQKLSAqIHN0YWNrIHNvIHdlIGNhbiBnZXQgdGhlIGZpZWxkIGlkIGRlbHRhcyBjb3JyZWN0LgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgKHZvaWQpIG5hbWU7Ci0gIGxhc3RGaWVsZF8ucHVzaChsYXN0RmllbGRJZF8pOwotICBsYXN0RmllbGRJZF8gPSAwOwotICByZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBXcml0ZSBhIHN0cnVjdCBlbmQuIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZQotICogdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBwb3AgdGhlIGxhc3QgZmllbGQgZnJvbSB0aGUgY3VycmVudCBzdHJ1Y3Qgb2ZmCi0gKiBvZiB0aGUgZmllbGQgc3RhY2suCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU3RydWN0RW5kKCkgewotICBsYXN0RmllbGRJZF8gPSBsYXN0RmllbGRfLnRvcCgpOwotICBsYXN0RmllbGRfLnBvcCgpOwotICByZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBXcml0ZSBhIExpc3QgaGVhZGVyLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIHJldHVybiB3cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtVHlwZSwgc2l6ZSk7Ci19Ci0KLS8qKgotICogV3JpdGUgYSBzZXQgaGVhZGVyLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICByZXR1cm4gd3JpdGVDb2xsZWN0aW9uQmVnaW4oZWxlbVR5cGUsIHNpemUpOwotfQotCi0vKioKLSAqIFdyaXRlIGEgbWFwIGhlYWRlci4gSWYgdGhlIG1hcCBpcyBlbXB0eSwgb21pdCB0aGUga2V5IGFuZCB2YWx1ZSB0eXBlCi0gKiBoZWFkZXJzLCBhcyB3ZSBkb24ndCBuZWVkIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHNraXAgaXQuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIHVpbnQzMl90IHdzaXplID0gMDsKLQotICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgd3NpemUgKz0gd3JpdGVCeXRlKDApOwotICB9IGVsc2UgewotICAgIHdzaXplICs9IHdyaXRlVmFyaW50MzIoc2l6ZSk7Ci0gICAgd3NpemUgKz0gd3JpdGVCeXRlKGdldENvbXBhY3RUeXBlKGtleVR5cGUpIDw8IDQgfCBnZXRDb21wYWN0VHlwZSh2YWxUeXBlKSk7Ci0gIH0KLSAgcmV0dXJuIHdzaXplOwotfQotCi0vKioKLSAqIFdyaXRlIGEgYm9vbGVhbiB2YWx1ZS4gUG90ZW50aWFsbHksIHRoaXMgY291bGQgYmUgYSBib29sZWFuIGZpZWxkLCBpbgotICogd2hpY2ggY2FzZSB0aGUgZmllbGQgaGVhZGVyIGluZm8gaXNuJ3Qgd3JpdHRlbiB5ZXQuIElmIHNvLCBkZWNpZGUgd2hhdCB0aGUKLSAqIHJpZ2h0IHR5cGUgaGVhZGVyIGlzIGZvciB0aGUgdmFsdWUgYW5kIHRoZW4gd3JpdGUgdGhlIGZpZWxkIGhlYWRlci4KLSAqIE90aGVyd2lzZSwgd3JpdGUgYSBzaW5nbGUgYnl0ZS4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpIHsKLSAgdWludDMyX3Qgd3NpemUgPSAwOwotCi0gIGlmIChib29sZWFuRmllbGRfLm5hbWUgIT0gTlVMTCkgewotICAgIC8vIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZmllbGQgaGVhZGVyIHlldAotICAgIHdzaXplICs9IHdyaXRlRmllbGRCZWdpbkludGVybmFsKGJvb2xlYW5GaWVsZF8ubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuRmllbGRfLmZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuRmllbGRfLmZpZWxkSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPyBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fVFJVRSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOjpjb21wYWN0OjpDVF9CT09MRUFOX0ZBTFNFKTsKLSAgICBib29sZWFuRmllbGRfLm5hbWUgPSBOVUxMOwotICB9IGVsc2UgewotICAgIC8vIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3Qgd3JpdGUgdGhlIHZhbHVlCi0gICAgd3NpemUgKz0gd3JpdGVCeXRlKHZhbHVlID8gZGV0YWlsOjpjb21wYWN0OjpDVF9CT09MRUFOX1RSVUUgOgotICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fRkFMU0UpOwotICB9Ci0gIHJldHVybiB3c2l6ZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSB7Ci0gIHRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKSZieXRlLCAxKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qKgotICogV3JpdGUgYW4gaTE2IGFzIGEgemlnemFnIHZhcmludC4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKLSAgcmV0dXJuIHdyaXRlVmFyaW50MzIoaTMyVG9aaWd6YWcoaTE2KSk7Ci19Ci0KLS8qKgotICogV3JpdGUgYW4gaTMyIGFzIGEgemlnemFnIHZhcmludC4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKLSAgcmV0dXJuIHdyaXRlVmFyaW50MzIoaTMyVG9aaWd6YWcoaTMyKSk7Ci19Ci0KLS8qKgotICogV3JpdGUgYW4gaTY0IGFzIGEgemlnemFnIHZhcmludC4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKLSAgcmV0dXJuIHdyaXRlVmFyaW50NjQoaTY0VG9aaWd6YWcoaTY0KSk7Ci19Ci0KLS8qKgotICogV3JpdGUgYSBkb3VibGUgdG8gdGhlIHdpcmUgYXMgOCBieXRlcy4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgewotICBCT09TVF9TVEFUSUNfQVNTRVJUKHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkpOwotICBCT09TVF9TVEFUSUNfQVNTRVJUKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5KTsKLQotICB1aW50NjRfdCBiaXRzID0gYml0d2lzZV9jYXN0PHVpbnQ2NF90PihkdWIpOwotICBiaXRzID0gaHRvbGVsbChiaXRzKTsKLSAgdHJhbnNfLT53cml0ZSgodWludDhfdCopJmJpdHMsIDgpOwotICByZXR1cm4gODsKLX0KLQotLyoqCi0gKiBXcml0ZSBhIHN0cmluZyB0byB0aGUgd2lyZSB3aXRoIGEgdmFyaW50IHNpemUgcHJlY2VlZGluZy4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICByZXR1cm4gd3JpdGVCaW5hcnkoc3RyKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICB1aW50MzJfdCBzc2l6ZSA9IHN0ci5zaXplKCk7Ci0gIHVpbnQzMl90IHdzaXplID0gd3JpdGVWYXJpbnQzMihzc2l6ZSkgKyBzc2l6ZTsKLSAgdHJhbnNfLT53cml0ZSgodWludDhfdCopc3RyLmRhdGEoKSwgc3NpemUpOwotICByZXR1cm4gd3NpemU7Ci19Ci0KLS8vCi0vLyBJbnRlcm5hbCBXcml0aW5nIG1ldGhvZHMKLS8vCi0KLS8qKgotICogVGhlIHdvcmtob3JzZSBvZiB3cml0ZUZpZWxkQmVnaW4uIEl0IGhhcyB0aGUgb3B0aW9uIG9mIGRvaW5nIGEKLSAqICd0eXBlIG92ZXJyaWRlJyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlCi0gKiBib29sZWFuIGZpZWxkIGNhc2UuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotaW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoCi0gICAgY29uc3QgY2hhciogbmFtZSwKLSAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgY29uc3QgaW50MTZfdCBmaWVsZElkLAotICAgIGludDhfdCB0eXBlT3ZlcnJpZGUpIHsKLSAgKHZvaWQpIG5hbWU7Ci0gIHVpbnQzMl90IHdzaXplID0gMDsKLQotICAvLyBpZiB0aGVyZSdzIGEgdHlwZSBvdmVycmlkZSwgdXNlIHRoYXQuCi0gIGludDhfdCB0eXBlVG9Xcml0ZSA9ICh0eXBlT3ZlcnJpZGUgPT0gLTEgPyBnZXRDb21wYWN0VHlwZShmaWVsZFR5cGUpIDogdHlwZU92ZXJyaWRlKTsKLQotICAvLyBjaGVjayBpZiB3ZSBjYW4gdXNlIGRlbHRhIGVuY29kaW5nIGZvciB0aGUgZmllbGQgaWQKLSAgaWYgKGZpZWxkSWQgPiBsYXN0RmllbGRJZF8gJiYgZmllbGRJZCAtIGxhc3RGaWVsZElkXyA8PSAxNSkgewotICAgIC8vIHdyaXRlIHRoZW0gdG9nZXRoZXIKLSAgICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGZpZWxkSWQgLSBsYXN0RmllbGRJZF8pIDw8IDQgfCB0eXBlVG9Xcml0ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gd3JpdGUgdGhlbSBzZXBhcmF0ZQotICAgIHdzaXplICs9IHdyaXRlQnl0ZSh0eXBlVG9Xcml0ZSk7Ci0gICAgd3NpemUgKz0gd3JpdGVJMTYoZmllbGRJZCk7Ci0gIH0KLQotICBsYXN0RmllbGRJZF8gPSBmaWVsZElkOwotICByZXR1cm4gd3NpemU7Ci19Ci0KLS8qKgotICogQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgotICogdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIHR5cGUgaW5kaWNhdG9yLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUNvbGxlY3Rpb25CZWdpbihpbnQ4X3QgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzaXplKSB7Ci0gIHVpbnQzMl90IHdzaXplID0gMDsKLSAgaWYgKHNpemUgPD0gMTQpIHsKLSAgICB3c2l6ZSArPSB3cml0ZUJ5dGUoc2l6ZSA8PCA0IHwgZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKLSAgfSBlbHNlIHsKLSAgICB3c2l6ZSArPSB3cml0ZUJ5dGUoMHhmMCB8IGdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSk7Ci0gICAgd3NpemUgKz0gd3JpdGVWYXJpbnQzMihzaXplKTsKLSAgfQotICByZXR1cm4gd3NpemU7Ci19Ci0KLS8qKgotICogV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgd2lyZS4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVWYXJpbnQzMih1aW50MzJfdCBuKSB7Ci0gIHVpbnQ4X3QgYnVmWzVdOwotICB1aW50MzJfdCB3c2l6ZSA9IDA7Ci0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICBpZiAoKG4gJiB+MHg3RikgPT0gMCkgewotICAgICAgYnVmW3dzaXplKytdID0gKGludDhfdCluOwotICAgICAgYnJlYWs7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJ1Zlt3c2l6ZSsrXSA9IChpbnQ4X3QpKChuICYgMHg3RikgfCAweDgwKTsKLSAgICAgIG4gPj49IDc7Ci0gICAgfQotICB9Ci0gIHRyYW5zXy0+d3JpdGUoYnVmLCB3c2l6ZSk7Ci0gIHJldHVybiB3c2l6ZTsKLX0KLQotLyoqCi0gKiBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVWYXJpbnQ2NCh1aW50NjRfdCBuKSB7Ci0gIHVpbnQ4X3QgYnVmWzEwXTsKLSAgdWludDMyX3Qgd3NpemUgPSAwOwotCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgaWYgKChuICYgfjB4N0ZMKSA9PSAwKSB7Ci0gICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KW47Ci0gICAgICBicmVhazsKLSAgICB9IGVsc2UgewotICAgICAgYnVmW3dzaXplKytdID0gKGludDhfdCkoKG4gJiAweDdGKSB8IDB4ODApOwotICAgICAgbiA+Pj0gNzsKLSAgICB9Ci0gIH0KLSAgdHJhbnNfLT53cml0ZShidWYsIHdzaXplKTsKLSAgcmV0dXJuIHdzaXplOwotfQotCi0vKioKLSAqIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKLSAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50NjRfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6aTY0VG9aaWd6YWcoY29uc3QgaW50NjRfdCBsKSB7Ci0gIHJldHVybiAobCA8PCAxKSBeIChsID4+IDYzKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBpbnQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKLSAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6aTMyVG9aaWd6YWcoY29uc3QgaW50MzJfdCBuKSB7Ci0gIHJldHVybiAobiA8PCAxKSBeIChuID4+IDMxKTsKLX0KLQotLyoqCi0gKiBHaXZlbiBhIFRUeXBlIHZhbHVlLCBmaW5kIHRoZSBhcHByb3ByaWF0ZSBkZXRhaWw6OmNvbXBhY3Q6OlR5cGVzIHZhbHVlCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotaW50OF90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpnZXRDb21wYWN0VHlwZShpbnQ4X3QgdHR5cGUpIHsKLSAgcmV0dXJuIGRldGFpbDo6Y29tcGFjdDo6VFR5cGVUb0NUeXBlW3R0eXBlXTsKLX0KLQotLy8KLS8vIFJlYWRpbmcgTWV0aG9kcwotLy8KLQotLyoqCi0gKiBSZWFkIGEgbWVzc2FnZSBoZWFkZXIuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRNZXNzYWdlQmVnaW4oCi0gICAgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKLSAgICBpbnQzMl90JiBzZXFpZCkgewotICB1aW50MzJfdCByc2l6ZSA9IDA7Ci0gIGludDhfdCBwcm90b2NvbElkOwotICBpbnQ4X3QgdmVyc2lvbkFuZFR5cGU7Ci0gIGludDhfdCB2ZXJzaW9uOwotCi0gIHJzaXplICs9IHJlYWRCeXRlKHByb3RvY29sSWQpOwotICBpZiAocHJvdG9jb2xJZCAhPSBQUk9UT0NPTF9JRCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OLCAiQmFkIHByb3RvY29sIGlkZW50aWZpZXIiKTsKLSAgfQotCi0gIHJzaXplICs9IHJlYWRCeXRlKHZlcnNpb25BbmRUeXBlKTsKLSAgdmVyc2lvbiA9IChpbnQ4X3QpKHZlcnNpb25BbmRUeXBlICYgVkVSU0lPTl9NQVNLKTsKLSAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTl9OKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sICJCYWQgcHJvdG9jb2wgdmVyc2lvbiIpOwotICB9Ci0KLSAgbWVzc2FnZVR5cGUgPSAoVE1lc3NhZ2VUeXBlKSgodmVyc2lvbkFuZFR5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgMHgwMyk7Ci0gIHJzaXplICs9IHJlYWRWYXJpbnQzMihzZXFpZCk7Ci0gIHJzaXplICs9IHJlYWRTdHJpbmcobmFtZSk7Ci0KLSAgcmV0dXJuIHJzaXplOwotfQotCi0vKioKLSAqIFJlYWQgYSBzdHJ1Y3QgYmVnaW4uIFRoZXJlJ3Mgbm90aGluZyBvbiB0aGUgd2lyZSBmb3IgdGhpcywgYnV0IGl0IGlzIG91cgotICogb3Bwb3J0dW5pdHkgdG8gcHVzaCBhIG5ldyBzdHJ1Y3QgYmVnaW4gbWFya2VyIG9uIHRoZSBmaWVsZCBzdGFjay4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gIG5hbWUgPSAiIjsKLSAgbGFzdEZpZWxkXy5wdXNoKGxhc3RGaWVsZElkXyk7Ci0gIGxhc3RGaWVsZElkXyA9IDA7Ci0gIHJldHVybiAwOwotfQotCi0vKioKLSAqIERvZXNuJ3QgYWN0dWFsbHkgY29uc3VtZSBhbnkgd2lyZSBkYXRhLCBqdXN0IHJlbW92ZXMgdGhlIGxhc3QgZmllbGQgZm9yCi0gKiB0aGlzIHN0cnVjdCBmcm9tIHRoZSBmaWVsZCBzdGFjay4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZFN0cnVjdEVuZCgpIHsKLSAgbGFzdEZpZWxkSWRfID0gbGFzdEZpZWxkXy50b3AoKTsKLSAgbGFzdEZpZWxkXy5wb3AoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogUmVhZCBhIGZpZWxkIGhlYWRlciBvZmYgdGhlIHdpcmUuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCkgewotICAodm9pZCkgbmFtZTsKLSAgdWludDMyX3QgcnNpemUgPSAwOwotICBpbnQ4X3QgYnl0ZTsKLSAgaW50OF90IHR5cGU7Ci0KLSAgcnNpemUgKz0gcmVhZEJ5dGUoYnl0ZSk7Ci0gIHR5cGUgPSAoYnl0ZSAmIDB4MGYpOwotCi0gIC8vIGlmIGl0J3MgYSBzdG9wLCB0aGVuIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHksIGFzIHRoZSBzdHJ1Y3QgaXMgb3Zlci4KLSAgaWYgKHR5cGUgPT0gVF9TVE9QKSB7Ci0gICAgZmllbGRUeXBlID0gVF9TVE9QOwotICAgIGZpZWxkSWQgPSAwOwotICAgIHJldHVybiByc2l6ZTsKLSAgfQotCi0gIC8vIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KLSAgaW50MTZfdCBtb2RpZmllciA9IChpbnQxNl90KSgoKHVpbnQ4X3QpYnl0ZSAmIDB4ZjApID4+IDQpOwotICBpZiAobW9kaWZpZXIgPT0gMCkgewotICAgIC8vIG5vdCBhIGRlbHRhLCBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZC4KLSAgICByc2l6ZSArPSByZWFkSTE2KGZpZWxkSWQpOwotICB9IGVsc2UgewotICAgIGZpZWxkSWQgPSAoaW50MTZfdCkobGFzdEZpZWxkSWRfICsgbW9kaWZpZXIpOwotICB9Ci0gIGZpZWxkVHlwZSA9IGdldFRUeXBlKHR5cGUpOwotCi0gIC8vIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSB0eXBlCi0gIGlmICh0eXBlID09IGRldGFpbDo6Y29tcGFjdDo6Q1RfQk9PTEVBTl9UUlVFIHx8Ci0gICAgICB0eXBlID09IGRldGFpbDo6Y29tcGFjdDo6Q1RfQk9PTEVBTl9GQUxTRSkgewotICAgIC8vIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlLgotICAgIGJvb2xWYWx1ZV8uaGFzQm9vbFZhbHVlID0gdHJ1ZTsKLSAgICBib29sVmFsdWVfLmJvb2xWYWx1ZSA9Ci0gICAgICAodHlwZSA9PSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fVFJVRSA/IHRydWUgOiBmYWxzZSk7Ci0gIH0KLQotICAvLyBwdXNoIHRoZSBuZXcgZmllbGQgb250byB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGtlZXAgdGhlIGRlbHRhcyBnb2luZy4KLSAgbGFzdEZpZWxkSWRfID0gZmllbGRJZDsKLSAgcmV0dXJuIHJzaXplOwotfQotCi0vKioKLSAqIFJlYWQgYSBtYXAgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNpemUgaXMgemVybywgc2tpcCByZWFkaW5nIHRoZSBrZXkKLSAqIGFuZCB2YWx1ZSB0eXBlLiBUaGlzIG1lYW5zIHRoYXQgMC1sZW5ndGggbWFwcyB3aWxsIHlpZWxkIFRNYXBzIHdpdGhvdXQgdGhlCi0gKiAiY29ycmVjdCIgdHlwZXMuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7Ci0gIHVpbnQzMl90IHJzaXplID0gMDsKLSAgaW50OF90IGt2VHlwZSA9IDA7Ci0gIGludDMyX3QgbXNpemUgPSAwOwotCi0gIHJzaXplICs9IHJlYWRWYXJpbnQzMihtc2l6ZSk7Ci0gIGlmIChtc2l6ZSAhPSAwKQotICAgIHJzaXplICs9IHJlYWRCeXRlKGt2VHlwZSk7Ci0KLSAgaWYgKG1zaXplIDwgMCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5FR0FUSVZFX1NJWkUpOwotICB9IGVsc2UgaWYgKGNvbnRhaW5lcl9saW1pdF8gJiYgbXNpemUgPiBjb250YWluZXJfbGltaXRfKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7Ci0gIH0KLQotICBrZXlUeXBlID0gZ2V0VFR5cGUoKGludDhfdCkoKHVpbnQ4X3Qpa3ZUeXBlID4+IDQpKTsKLSAgdmFsVHlwZSA9IGdldFRUeXBlKChpbnQ4X3QpKCh1aW50OF90KWt2VHlwZSAmIDB4ZikpOwotICBzaXplID0gKHVpbnQzMl90KW1zaXplOwotCi0gIHJldHVybiByc2l6ZTsKLX0KLQotLyoqCi0gKiBSZWFkIGEgbGlzdCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgbGlzdCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKLSAqIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIGxpc3QsIHRoZSA0IE1TQgotICogb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQotICogdHJ1ZSBzaXplLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7Ci0gIGludDhfdCBzaXplX2FuZF90eXBlOwotICB1aW50MzJfdCByc2l6ZSA9IDA7Ci0gIGludDMyX3QgbHNpemU7Ci0KLSAgcnNpemUgKz0gcmVhZEJ5dGUoc2l6ZV9hbmRfdHlwZSk7Ci0KLSAgbHNpemUgPSAoKHVpbnQ4X3Qpc2l6ZV9hbmRfdHlwZSA+PiA0KSAmIDB4MGY7Ci0gIGlmIChsc2l6ZSA9PSAxNSkgewotICAgIHJzaXplICs9IHJlYWRWYXJpbnQzMihsc2l6ZSk7Ci0gIH0KLQotICBpZiAobHNpemUgPCAwKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7Ci0gIH0gZWxzZSBpZiAoY29udGFpbmVyX2xpbWl0XyAmJiBsc2l6ZSA+IGNvbnRhaW5lcl9saW1pdF8pIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgfQotCi0gIGVsZW1UeXBlID0gZ2V0VFR5cGUoKGludDhfdCkoc2l6ZV9hbmRfdHlwZSAmIDB4MGYpKTsKLSAgc2l6ZSA9ICh1aW50MzJfdClsc2l6ZTsKLQotICByZXR1cm4gcnNpemU7Ci19Ci0KLS8qKgotICogUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAotICogYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgc2V0LCB0aGUgNCBNU0IKLSAqIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKLSAqIHRydWUgc2l6ZS4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgcmV0dXJuIHJlYWRMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOwotfQotCi0vKioKLSAqIFJlYWQgYSBib29sZWFuIG9mZiB0aGUgd2lyZS4gSWYgdGhpcyBpcyBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBzaG91bGQKLSAqIGFscmVhZHkgaGF2ZSBiZWVuIHJlYWQgZHVyaW5nIHJlYWRGaWVsZEJlZ2luLCBzbyB3ZSdsbCBqdXN0IGNvbnN1bWUgdGhlCi0gKiBwcmUtc3RvcmVkIHZhbHVlLiBPdGhlcndpc2UsIHJlYWQgYSBieXRlLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkQm9vbChib29sJiB2YWx1ZSkgewotICBpZiAoYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPT0gdHJ1ZSkgewotICAgIHZhbHVlID0gYm9vbFZhbHVlXy5ib29sVmFsdWU7Ci0gICAgYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSBmYWxzZTsKLSAgICByZXR1cm4gMDsKLSAgfSBlbHNlIHsKLSAgICBpbnQ4X3QgdmFsOwotICAgIHJlYWRCeXRlKHZhbCk7Ci0gICAgdmFsdWUgPSAodmFsID09IGRldGFpbDo6Y29tcGFjdDo6Q1RfQk9PTEVBTl9UUlVFKTsKLSAgICByZXR1cm4gMTsKLSAgfQotfQotCi0vKioKLSAqIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEJ5dGUoaW50OF90JiBieXRlKSB7Ci0gIHVpbnQ4X3QgYlsxXTsKLSAgdHJhbnNfLT5yZWFkQWxsKGIsIDEpOwotICBieXRlID0gKihpbnQ4X3QqKWI7Ci0gIHJldHVybiAxOwotfQotCi0vKioKLSAqIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkSTE2KGludDE2X3QmIGkxNikgewotICBpbnQzMl90IHZhbHVlOwotICB1aW50MzJfdCByc2l6ZSA9IHJlYWRWYXJpbnQzMih2YWx1ZSk7Ci0gIGkxNiA9IChpbnQxNl90KXppZ3phZ1RvSTMyKHZhbHVlKTsKLSAgcmV0dXJuIHJzaXplOwotfQotCi0vKioKLSAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkSTMyKGludDMyX3QmIGkzMikgewotICBpbnQzMl90IHZhbHVlOwotICB1aW50MzJfdCByc2l6ZSA9IHJlYWRWYXJpbnQzMih2YWx1ZSk7Ci0gIGkzMiA9IHppZ3phZ1RvSTMyKHZhbHVlKTsKLSAgcmV0dXJuIHJzaXplOwotfQotCi0vKioKLSAqIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkSTY0KGludDY0X3QmIGk2NCkgewotICBpbnQ2NF90IHZhbHVlOwotICB1aW50MzJfdCByc2l6ZSA9IHJlYWRWYXJpbnQ2NCh2YWx1ZSk7Ci0gIGk2NCA9IHppZ3phZ1RvSTY0KHZhbHVlKTsKLSAgcmV0dXJuIHJzaXplOwotfQotCi0vKioKLSAqIE5vIG1hZ2ljIGhlcmUgLSBqdXN0IHJlYWQgYSBkb3VibGUgb2ZmIHRoZSB3aXJlLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTkpOwotCi0gIHVpbnQ2NF90IGJpdHM7Ci0gIHVpbnQ4X3QgYls4XTsKLSAgdHJhbnNfLT5yZWFkQWxsKGIsIDgpOwotICBiaXRzID0gKih1aW50NjRfdCopYjsKLSAgYml0cyA9IGxldG9obGwoYml0cyk7Ci0gIGR1YiA9IGJpdHdpc2VfY2FzdDxkb3VibGU+KGJpdHMpOwotICByZXR1cm4gODsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiByZWFkQmluYXJ5KHN0cik7Ci19Ci0KLS8qKgotICogUmVhZCBhIGJ5dGVbXSBmcm9tIHRoZSB3aXJlLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgaW50MzJfdCByc2l6ZSA9IDA7Ci0gIGludDMyX3Qgc2l6ZTsKLQotICByc2l6ZSArPSByZWFkVmFyaW50MzIoc2l6ZSk7Ci0gIC8vIENhdGNoIGVtcHR5IHN0cmluZyBjYXNlCi0gIGlmIChzaXplID09IDApIHsKLSAgICBzdHIgPSAiIjsKLSAgICByZXR1cm4gcnNpemU7Ci0gIH0KLQotICAvLyBDYXRjaCBlcnJvciBjYXNlcwotICBpZiAoc2l6ZSA8IDApIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKLSAgfQotICBpZiAoc3RyaW5nX2xpbWl0XyA+IDAgJiYgc2l6ZSA+IHN0cmluZ19saW1pdF8pIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgfQotCi0gIC8vIFVzZSB0aGUgaGVhcCBoZXJlIHRvIHByZXZlbnQgc3RhY2sgb3ZlcmZsb3cgZm9yIHYuIGxhcmdlIHN0cmluZ3MKLSAgaWYgKHNpemUgPiBzdHJpbmdfYnVmX3NpemVfIHx8IHN0cmluZ19idWZfID09IE5VTEwpIHsKLSAgICB2b2lkKiBuZXdfc3RyaW5nX2J1ZiA9IHN0ZDo6cmVhbGxvYyhzdHJpbmdfYnVmXywgKHVpbnQzMl90KXNpemUpOwotICAgIGlmIChuZXdfc3RyaW5nX2J1ZiA9PSBOVUxMKSB7Ci0gICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwotICAgIH0KLSAgICBzdHJpbmdfYnVmXyA9ICh1aW50OF90KiluZXdfc3RyaW5nX2J1ZjsKLSAgICBzdHJpbmdfYnVmX3NpemVfID0gc2l6ZTsKLSAgfQotICB0cmFuc18tPnJlYWRBbGwoc3RyaW5nX2J1Zl8sIHNpemUpOwotICBzdHIuYXNzaWduKChjaGFyKilzdHJpbmdfYnVmXywgc2l6ZSk7Ci0KLSAgcmV0dXJuIHJzaXplICsgKHVpbnQzMl90KXNpemU7Ci19Ci0KLS8qKgotICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0Ci0gKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDUgYnl0ZXMuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRWYXJpbnQzMihpbnQzMl90JiBpMzIpIHsKLSAgaW50NjRfdCB2YWw7Ci0gIHVpbnQzMl90IHJzaXplID0gcmVhZFZhcmludDY0KHZhbCk7Ci0gIGkzMiA9IChpbnQzMl90KXZhbDsKLSAgcmV0dXJuIHJzaXplOwotfQotCi0vKioKLSAqIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSBwcm9wZXIgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKLSAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gMTAgYnl0ZXMuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRWYXJpbnQ2NChpbnQ2NF90JiBpNjQpIHsKLSAgdWludDMyX3QgcnNpemUgPSAwOwotICB1aW50NjRfdCB2YWwgPSAwOwotICBpbnQgc2hpZnQgPSAwOwotICB1aW50OF90IGJ1ZlsxMF07ICAvLyA2NCBiaXRzIC8gKDcgYml0cy9ieXRlKSA9IDEwIGJ5dGVzLgotICB1aW50MzJfdCBidWZfc2l6ZSA9IHNpemVvZihidWYpOwotICBjb25zdCB1aW50OF90KiBib3Jyb3dlZCA9IHRyYW5zXy0+Ym9ycm93KGJ1ZiwgJmJ1Zl9zaXplKTsKLQotICAvLyBGYXN0IHBhdGguCi0gIGlmIChib3Jyb3dlZCAhPSBOVUxMKSB7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHVpbnQ4X3QgYnl0ZSA9IGJvcnJvd2VkW3JzaXplXTsKLSAgICAgIHJzaXplKys7Ci0gICAgICB2YWwgfD0gKHVpbnQ2NF90KShieXRlICYgMHg3ZikgPDwgc2hpZnQ7Ci0gICAgICBzaGlmdCArPSA3OwotICAgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7Ci0gICAgICAgIGk2NCA9IHZhbDsKLSAgICAgICAgdHJhbnNfLT5jb25zdW1lKHJzaXplKTsKLSAgICAgICAgcmV0dXJuIHJzaXplOwotICAgICAgfQotICAgICAgLy8gSGF2ZSB0byBjaGVjayBmb3IgaW52YWxpZCBkYXRhIHNvIHdlIGRvbid0IGNyYXNoLgotICAgICAgaWYgKFVOTElLRUxZKHJzaXplID09IHNpemVvZihidWYpKSkgewotICAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsICJWYXJpYWJsZS1sZW5ndGggaW50IG92ZXIgMTAgYnl0ZXMuIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gU2xvdyBwYXRoLgotICBlbHNlIHsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgdWludDhfdCBieXRlOwotICAgICAgcnNpemUgKz0gdHJhbnNfLT5yZWFkQWxsKCZieXRlLCAxKTsKLSAgICAgIHZhbCB8PSAodWludDY0X3QpKGJ5dGUgJiAweDdmKSA8PCBzaGlmdDsKLSAgICAgIHNoaWZ0ICs9IDc7Ci0gICAgICBpZiAoIShieXRlICYgMHg4MCkpIHsKLSAgICAgICAgaTY0ID0gdmFsOwotICAgICAgICByZXR1cm4gcnNpemU7Ci0gICAgICB9Ci0gICAgICAvLyBNaWdodCBhcyB3ZWxsIGNoZWNrIGZvciBpbnZhbGlkIGRhdGEgb24gdGhlIHNsb3cgcGF0aCB0b28uCi0gICAgICBpZiAoVU5MSUtFTFkocnNpemUgPj0gc2l6ZW9mKGJ1ZikpKSB7Ci0gICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwgIlZhcmlhYmxlLWxlbmd0aCBpbnQgb3ZlciAxMCBieXRlcy4iKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotaW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6emlnemFnVG9JMzIodWludDMyX3QgbikgewotICByZXR1cm4gKG4gPj4gMSkgXiAtKG4gJiAxKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0IGZyb20gemlnemFnIGxvbmcgdG8gbG9uZy4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci1pbnQ2NF90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp6aWd6YWdUb0k2NCh1aW50NjRfdCBuKSB7Ci0gIHJldHVybiAobiA+PiAxKSBeIC0obiAmIDEpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLVRUeXBlIFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpnZXRUVHlwZShpbnQ4X3QgdHlwZSkgewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIFRfU1RPUDoKLSAgICAgIHJldHVybiBUX1NUT1A7Ci0gICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fRkFMU0U6Ci0gICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fVFJVRToKLSAgICAgIHJldHVybiBUX0JPT0w7Ci0gICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JZVEU6Ci0gICAgICByZXR1cm4gVF9CWVRFOwotICAgIGNhc2UgZGV0YWlsOjpjb21wYWN0OjpDVF9JMTY6Ci0gICAgICByZXR1cm4gVF9JMTY7Ci0gICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0kzMjoKLSAgICAgIHJldHVybiBUX0kzMjsKLSAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfSTY0OgotICAgICAgcmV0dXJuIFRfSTY0OwotICAgIGNhc2UgZGV0YWlsOjpjb21wYWN0OjpDVF9ET1VCTEU6Ci0gICAgICByZXR1cm4gVF9ET1VCTEU7Ci0gICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JJTkFSWToKLSAgICAgIHJldHVybiBUX1NUUklORzsKLSAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfTElTVDoKLSAgICAgIHJldHVybiBUX0xJU1Q7Ci0gICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX1NFVDoKLSAgICAgIHJldHVybiBUX1NFVDsKLSAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfTUFQOgotICAgICAgcmV0dXJuIFRfTUFQOwotICAgIGNhc2UgZGV0YWlsOjpjb21wYWN0OjpDVF9TVFJVQ1Q6Ci0gICAgICByZXR1cm4gVF9TVFJVQ1Q7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93IFRFeGNlcHRpb24oImRvbid0IGtub3cgd2hhdCB0eXBlOiAiICsgdHlwZSk7Ci0gIH0KLSAgcmV0dXJuIFRfU1RPUDsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAotCi0jZW5kaWYgLy8gX1RIUklGVF9QUk9UT0NPTF9UQ09NUEFDVFBST1RPQ09MX1RDQ18KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmNwcCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhlMTc1Yi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm90b2NvbC9URGVidWdQcm90b2NvbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiVERlYnVnUHJvdG9jb2wuaCIKLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8Y2N0eXBlPgotI2luY2x1ZGUgPGNzdGRpbz4KLSNpbmNsdWRlIDxzdGRleGNlcHQ+Ci0jaW5jbHVkZSA8Ym9vc3Qvc3RhdGljX2Fzc2VydC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KLQotdXNpbmcgc3RkOjpzdHJpbmc7Ci0KLQotc3RhdGljIHN0cmluZyBieXRlX3RvX2hleChjb25zdCB1aW50OF90IGJ5dGUpIHsKLSAgY2hhciBidWZbM107Ci0gIGludCByZXQgPSBzdGQ6OnNwcmludGYoYnVmLCAiJTAyeCIsIChpbnQpYnl0ZSk7Ci0gIGFzc2VydChyZXQgPT0gMik7Ci0gIGFzc2VydChidWZbMl0gPT0gJ1wwJyk7Ci0gIHJldHVybiBidWY7Ci19Ci0KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi1zdHJpbmcgVERlYnVnUHJvdG9jb2w6OmZpZWxkVHlwZU5hbWUoVFR5cGUgdHlwZSkgewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIFRfU1RPUCAgIDogcmV0dXJuICJzdG9wIiAgIDsKLSAgICBjYXNlIFRfVk9JRCAgIDogcmV0dXJuICJ2b2lkIiAgIDsKLSAgICBjYXNlIFRfQk9PTCAgIDogcmV0dXJuICJib29sIiAgIDsKLSAgICBjYXNlIFRfQllURSAgIDogcmV0dXJuICJieXRlIiAgIDsKLSAgICBjYXNlIFRfSTE2ICAgIDogcmV0dXJuICJpMTYiICAgIDsKLSAgICBjYXNlIFRfSTMyICAgIDogcmV0dXJuICJpMzIiICAgIDsKLSAgICBjYXNlIFRfVTY0ICAgIDogcmV0dXJuICJ1NjQiICAgIDsKLSAgICBjYXNlIFRfSTY0ICAgIDogcmV0dXJuICJpNjQiICAgIDsKLSAgICBjYXNlIFRfRE9VQkxFIDogcmV0dXJuICJkb3VibGUiIDsKLSAgICBjYXNlIFRfU1RSSU5HIDogcmV0dXJuICJzdHJpbmciIDsKLSAgICBjYXNlIFRfU1RSVUNUIDogcmV0dXJuICJzdHJ1Y3QiIDsKLSAgICBjYXNlIFRfTUFQICAgIDogcmV0dXJuICJtYXAiICAgIDsKLSAgICBjYXNlIFRfU0VUICAgIDogcmV0dXJuICJzZXQiICAgIDsKLSAgICBjYXNlIFRfTElTVCAgIDogcmV0dXJuICJsaXN0IiAgIDsKLSAgICBjYXNlIFRfVVRGOCAgIDogcmV0dXJuICJ1dGY4IiAgIDsKLSAgICBjYXNlIFRfVVRGMTYgIDogcmV0dXJuICJ1dGYxNiIgIDsKLSAgICBkZWZhdWx0OiByZXR1cm4gInVua25vd24iOwotICB9Ci19Ci0KLXZvaWQgVERlYnVnUHJvdG9jb2w6OmluZGVudFVwKCkgewotICBpbmRlbnRfc3RyXyArPSBzdHJpbmcoaW5kZW50X2luYywgJyAnKTsKLX0KLQotdm9pZCBURGVidWdQcm90b2NvbDo6aW5kZW50RG93bigpIHsKLSAgaWYgKGluZGVudF9zdHJfLmxlbmd0aCgpIDwgKHN0cmluZzo6c2l6ZV90eXBlKWluZGVudF9pbmMpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOwotICB9Ci0gIGluZGVudF9zdHJfLmVyYXNlKGluZGVudF9zdHJfLmxlbmd0aCgpIC0gaW5kZW50X2luYyk7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZVBsYWluKGNvbnN0IHN0cmluZyYgc3RyKSB7Ci0gIHRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKXN0ci5kYXRhKCksIHN0ci5sZW5ndGgoKSk7Ci0gIHJldHVybiBzdHIubGVuZ3RoKCk7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUluZGVudGVkKGNvbnN0IHN0cmluZyYgc3RyKSB7Ci0gIHRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKWluZGVudF9zdHJfLmRhdGEoKSwgaW5kZW50X3N0cl8ubGVuZ3RoKCkpOwotICB0cmFuc18tPndyaXRlKCh1aW50OF90KilzdHIuZGF0YSgpLCBzdHIubGVuZ3RoKCkpOwotICByZXR1cm4gaW5kZW50X3N0cl8ubGVuZ3RoKCkgKyBzdHIubGVuZ3RoKCk7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjpzdGFydEl0ZW0oKSB7Ci0gIHVpbnQzMl90IHNpemU7Ci0KLSAgc3dpdGNoICh3cml0ZV9zdGF0ZV8uYmFjaygpKSB7Ci0gICAgY2FzZSBVTklOSVQ6Ci0gICAgICAvLyBYWFggZmlndXJlIG91dCB3aGF0IHRvIGRvIGhlcmUuCi0gICAgICAvL3Rocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7Ci0gICAgICAvL3JldHVybiB3cml0ZUluZGVudGVkKHN0cik7Ci0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIFNUUlVDVDoKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2UgU0VUOgotICAgICAgcmV0dXJuIHdyaXRlSW5kZW50ZWQoIiIpOwotICAgIGNhc2UgTUFQX0tFWToKLSAgICAgIHJldHVybiB3cml0ZUluZGVudGVkKCIiKTsKLSAgICBjYXNlIE1BUF9WQUxVRToKLSAgICAgIHJldHVybiB3cml0ZVBsYWluKCIgLT4gIik7Ci0gICAgY2FzZSBMSVNUOgotICAgICAgc2l6ZSA9IHdyaXRlSW5kZW50ZWQoCi0gICAgICAgICAgIlsiICsgYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KGxpc3RfaWR4Xy5iYWNrKCkpICsgIl0gPSAiKTsKLSAgICAgIGxpc3RfaWR4Xy5iYWNrKCkrKzsKLSAgICAgIHJldHVybiBzaXplOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJJbnZhbGlkIGVudW0gdmFsdWUuIik7Ci0gIH0KLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OmVuZEl0ZW0oKSB7Ci0gIC8vdWludDMyX3Qgc2l6ZTsKLQotICBzd2l0Y2ggKHdyaXRlX3N0YXRlXy5iYWNrKCkpIHsKLSAgICBjYXNlIFVOSU5JVDoKLSAgICAgIC8vIFhYWCBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gaGVyZS4KLSAgICAgIC8vdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKLSAgICAgIC8vcmV0dXJuIHdyaXRlSW5kZW50ZWQoc3RyKTsKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2UgU1RSVUNUOgotICAgICAgcmV0dXJuIHdyaXRlUGxhaW4oIixcbiIpOwotICAgIGNhc2UgU0VUOgotICAgICAgcmV0dXJuIHdyaXRlUGxhaW4oIixcbiIpOwotICAgIGNhc2UgTUFQX0tFWToKLSAgICAgIHdyaXRlX3N0YXRlXy5iYWNrKCkgPSBNQVBfVkFMVUU7Ci0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIE1BUF9WQUxVRToKLSAgICAgIHdyaXRlX3N0YXRlXy5iYWNrKCkgPSBNQVBfS0VZOwotICAgICAgcmV0dXJuIHdyaXRlUGxhaW4oIixcbiIpOwotICAgIGNhc2UgTElTVDoKLSAgICAgIHJldHVybiB3cml0ZVBsYWluKCIsXG4iKTsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiSW52YWxpZCBlbnVtIHZhbHVlLiIpOwotICB9Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUl0ZW0oY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICB1aW50MzJfdCBzaXplID0gMDsKLSAgc2l6ZSArPSBzdGFydEl0ZW0oKTsKLSAgc2l6ZSArPSB3cml0ZVBsYWluKHN0cik7Ci0gIHNpemUgKz0gZW5kSXRlbSgpOwotICByZXR1cm4gc2l6ZTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7Ci0gICh2b2lkKSBzZXFpZDsKLSAgc3RyaW5nIG10eXBlOwotICBzd2l0Y2ggKG1lc3NhZ2VUeXBlKSB7Ci0gICAgY2FzZSBUX0NBTEwgICAgICA6IG10eXBlID0gImNhbGwiICAgOyBicmVhazsKLSAgICBjYXNlIFRfUkVQTFkgICAgIDogbXR5cGUgPSAicmVwbHkiICA7IGJyZWFrOwotICAgIGNhc2UgVF9FWENFUFRJT04gOiBtdHlwZSA9ICJleG4iICAgIDsgYnJlYWs7Ci0gICAgY2FzZSBUX09ORVdBWSAgICA6IG10eXBlID0gIm9uZXdheSIgOyBicmVhazsKLSAgfQotCi0gIHVpbnQzMl90IHNpemUgPSB3cml0ZUluZGVudGVkKCIoIiArIG10eXBlICsgIikgIiArIG5hbWUgKyAiKCIpOwotICBpbmRlbnRVcCgpOwotICByZXR1cm4gc2l6ZTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlTWVzc2FnZUVuZCgpIHsKLSAgaW5kZW50RG93bigpOwotICByZXR1cm4gd3JpdGVJbmRlbnRlZCgiKVxuIik7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgdWludDMyX3Qgc2l6ZSA9IDA7Ci0gIHNpemUgKz0gc3RhcnRJdGVtKCk7Ci0gIHNpemUgKz0gd3JpdGVQbGFpbihzdHJpbmcobmFtZSkgKyAiIHtcbiIpOwotICBpbmRlbnRVcCgpOwotICB3cml0ZV9zdGF0ZV8ucHVzaF9iYWNrKFNUUlVDVCk7Ci0gIHJldHVybiBzaXplOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVTdHJ1Y3RFbmQoKSB7Ci0gIGluZGVudERvd24oKTsKLSAgd3JpdGVfc3RhdGVfLnBvcF9iYWNrKCk7Ci0gIHVpbnQzMl90IHNpemUgPSAwOwotICBzaXplICs9IHdyaXRlSW5kZW50ZWQoIn0iKTsKLSAgc2l6ZSArPSBlbmRJdGVtKCk7Ci0gIHJldHVybiBzaXplOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7Ci0gIC8vIHNwcmludGYoaWRfc3RyLCAiJTAyZCIsIGZpZWxkSWQpOwotICBzdHJpbmcgaWRfc3RyID0gYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KGZpZWxkSWQpOwotICBpZiAoaWRfc3RyLmxlbmd0aCgpID09IDEpIGlkX3N0ciA9ICcwJyArIGlkX3N0cjsKLQotICByZXR1cm4gd3JpdGVJbmRlbnRlZCgKLSAgICAgIGlkX3N0ciArICI6ICIgKwotICAgICAgbmFtZSArICIgKCIgKwotICAgICAgZmllbGRUeXBlTmFtZShmaWVsZFR5cGUpICsgIikgPSAiKTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlRmllbGRFbmQoKSB7Ci0gIGFzc2VydCh3cml0ZV9zdGF0ZV8uYmFjaygpID09IFNUUlVDVCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVGaWVsZFN0b3AoKSB7Ci0gIHJldHVybiAwOwotICAgIC8vd3JpdGVJbmRlbnRlZCgiKioqU1RPUCoqKlxuIik7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICAvLyBUT0RPKGRyZWlzcyk6IE9wdGltaXplIHNob3J0IG1hcHM/Ci0gIHVpbnQzMl90IGJzaXplID0gMDsKLSAgYnNpemUgKz0gc3RhcnRJdGVtKCk7Ci0gIGJzaXplICs9IHdyaXRlUGxhaW4oCi0gICAgICAibWFwPCIgKyBmaWVsZFR5cGVOYW1lKGtleVR5cGUpICsgIiwiICsgZmllbGRUeXBlTmFtZSh2YWxUeXBlKSArICI+IgotICAgICAgIlsiICsgYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KHNpemUpICsgIl0ge1xuIik7Ci0gIGluZGVudFVwKCk7Ci0gIHdyaXRlX3N0YXRlXy5wdXNoX2JhY2soTUFQX0tFWSk7Ci0gIHJldHVybiBic2l6ZTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlTWFwRW5kKCkgewotICBpbmRlbnREb3duKCk7Ci0gIHdyaXRlX3N0YXRlXy5wb3BfYmFjaygpOwotICB1aW50MzJfdCBzaXplID0gMDsKLSAgc2l6ZSArPSB3cml0ZUluZGVudGVkKCJ9Iik7Ci0gIHNpemUgKz0gZW5kSXRlbSgpOwotICByZXR1cm4gc2l6ZTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgLy8gVE9ETyhkcmVpc3MpOiBPcHRpbWl6ZSBzaG9ydCBhcnJheXMuCi0gIHVpbnQzMl90IGJzaXplID0gMDsKLSAgYnNpemUgKz0gc3RhcnRJdGVtKCk7Ci0gIGJzaXplICs9IHdyaXRlUGxhaW4oCi0gICAgICAibGlzdDwiICsgZmllbGRUeXBlTmFtZShlbGVtVHlwZSkgKyAiPiIKLSAgICAgICJbIiArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihzaXplKSArICJdIHtcbiIpOwotICBpbmRlbnRVcCgpOwotICB3cml0ZV9zdGF0ZV8ucHVzaF9iYWNrKExJU1QpOwotICBsaXN0X2lkeF8ucHVzaF9iYWNrKDApOwotICByZXR1cm4gYnNpemU7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUxpc3RFbmQoKSB7Ci0gIGluZGVudERvd24oKTsKLSAgd3JpdGVfc3RhdGVfLnBvcF9iYWNrKCk7Ci0gIGxpc3RfaWR4Xy5wb3BfYmFjaygpOwotICB1aW50MzJfdCBzaXplID0gMDsKLSAgc2l6ZSArPSB3cml0ZUluZGVudGVkKCJ9Iik7Ci0gIHNpemUgKz0gZW5kSXRlbSgpOwotICByZXR1cm4gc2l6ZTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIC8vIFRPRE8oZHJlaXNzKTogT3B0aW1pemUgc2hvcnQgc2V0cy4KLSAgdWludDMyX3QgYnNpemUgPSAwOwotICBic2l6ZSArPSBzdGFydEl0ZW0oKTsKLSAgYnNpemUgKz0gd3JpdGVQbGFpbigKLSAgICAgICJzZXQ8IiArIGZpZWxkVHlwZU5hbWUoZWxlbVR5cGUpICsgIj4iCi0gICAgICAiWyIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oc2l6ZSkgKyAiXSB7XG4iKTsKLSAgaW5kZW50VXAoKTsKLSAgd3JpdGVfc3RhdGVfLnB1c2hfYmFjayhTRVQpOwotICByZXR1cm4gYnNpemU7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZVNldEVuZCgpIHsKLSAgaW5kZW50RG93bigpOwotICB3cml0ZV9zdGF0ZV8ucG9wX2JhY2soKTsKLSAgdWludDMyX3Qgc2l6ZSA9IDA7Ci0gIHNpemUgKz0gd3JpdGVJbmRlbnRlZCgifSIpOwotICBzaXplICs9IGVuZEl0ZW0oKTsKLSAgcmV0dXJuIHNpemU7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgewotICByZXR1cm4gd3JpdGVJdGVtKHZhbHVlID8gInRydWUiIDogImZhbHNlIik7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpIHsKLSAgcmV0dXJuIHdyaXRlSXRlbSgiMHgiICsgYnl0ZV90b19oZXgoYnl0ZSkpOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKLSAgcmV0dXJuIHdyaXRlSXRlbShib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oaTE2KSk7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgewotICByZXR1cm4gd3JpdGVJdGVtKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihpMzIpKTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KSB7Ci0gIHJldHVybiB3cml0ZUl0ZW0oYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KGk2NCkpOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgewotICByZXR1cm4gd3JpdGVJdGVtKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihkdWIpKTsKLX0KLQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVTdHJpbmcoY29uc3Qgc3RyaW5nJiBzdHIpIHsKLSAgLy8gWFhYIFJhdy9VVEYtOD8KLQotICBzdHJpbmcgdG9fc2hvdyA9IHN0cjsKLSAgaWYgKHRvX3Nob3cubGVuZ3RoKCkgPiAoc3RyaW5nOjpzaXplX3R5cGUpc3RyaW5nX2xpbWl0XykgewotICAgIHRvX3Nob3cgPSBzdHIuc3Vic3RyKDAsIHN0cmluZ19wcmVmaXhfc2l6ZV8pOwotICAgIHRvX3Nob3cgKz0gIlsuLi5dKCIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oc3RyLmxlbmd0aCgpKSArICIpIjsKLSAgfQotCi0gIHN0cmluZyBvdXRwdXQgPSAiXCIiOwotCi0gIGZvciAoc3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdCA9IHRvX3Nob3cuYmVnaW4oKTsgaXQgIT0gdG9fc2hvdy5lbmQoKTsgKytpdCkgewotICAgIGlmICgqaXQgPT0gJ1xcJykgewotICAgICAgb3V0cHV0ICs9ICJcXFxcIjsKLSAgICB9IGVsc2UgaWYgKCppdCA9PSAnIicpIHsKLSAgICAgIG91dHB1dCArPSAiXFxcIiI7Ci0gICAgfSBlbHNlIGlmIChzdGQ6OmlzcHJpbnQoKml0KSkgewotICAgICAgb3V0cHV0ICs9ICppdDsKLSAgICB9IGVsc2UgewotICAgICAgc3dpdGNoICgqaXQpIHsKLSAgICAgICAgY2FzZSAnXGEnOiBvdXRwdXQgKz0gIlxcYSI7IGJyZWFrOwotICAgICAgICBjYXNlICdcYic6IG91dHB1dCArPSAiXFxiIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xmJzogb3V0cHV0ICs9ICJcXGYiOyBicmVhazsKLSAgICAgICAgY2FzZSAnXG4nOiBvdXRwdXQgKz0gIlxcbiI7IGJyZWFrOwotICAgICAgICBjYXNlICdccic6IG91dHB1dCArPSAiXFxyIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1x0Jzogb3V0cHV0ICs9ICJcXHQiOyBicmVhazsKLSAgICAgICAgY2FzZSAnXHYnOiBvdXRwdXQgKz0gIlxcdiI7IGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIG91dHB1dCArPSAiXFx4IjsKLSAgICAgICAgICBvdXRwdXQgKz0gYnl0ZV90b19oZXgoKml0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBvdXRwdXQgKz0gJ1wiJzsKLSAgcmV0dXJuIHdyaXRlSXRlbShvdXRwdXQpOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVCaW5hcnkoY29uc3Qgc3RyaW5nJiBzdHIpIHsKLSAgLy8gWFhYIEhleD8KLSAgcmV0dXJuIFREZWJ1Z1Byb3RvY29sOjp3cml0ZVN0cmluZyhzdHIpOwotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y3ODc3Yy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RERUJVR1BST1RPQ09MX0hfCi0jZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVERFQlVHUFJPVE9DT0xfSF8gMQotCi0jaW5jbHVkZSAiVFZpcnR1YWxQcm90b2NvbC5oIgotCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotLyoKLQotISEhIEVYUEVSSU1FTlRBTCBDT0RFICEhIQotCi1UaGlzIHByb3RvY29sIGlzIHZlcnkgbXVjaCBhIHdvcmsgaW4gcHJvZ3Jlc3MuCi1JdCBkb2Vzbid0IGhhbmRsZSBtYW55IGNhc2VzIHByb3Blcmx5LgotSXQgdGhyb3dzIGV4Y2VwdGlvbnMgaW4gbWFueSBjYXNlcy4KLUl0IHByb2JhYmx5IHNlZ2ZhdWx0cyBpbiBtYW55IGNhc2VzLgotQnVnIHJlcG9ydHMgYW5kIGZlYXR1cmUgcmVxdWVzdHMgYXJlIHdlbGNvbWUuCi1Db21wbGFpbnRzIGFyZSBub3QuIDpSCi0KLSovCi0KLQotLyoqCi0gKiBQcm90b2NvbCB0aGF0IHByaW50cyB0aGUgcGF5bG9hZCBpbiBhIG5pY2UgaHVtYW4tcmVhZGFibGUgZm9ybWF0LgotICogUmVhZGluZyBmcm9tIHRoaXMgcHJvdG9jb2wgaXMgbm90IHN1cHBvcnRlZC4KLSAqCi0gKi8KLWNsYXNzIFREZWJ1Z1Byb3RvY29sIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8VERlYnVnUHJvdG9jb2w+IHsKLSBwcml2YXRlOgotICBlbnVtIHdyaXRlX3N0YXRlX3QKLSAgeyBVTklOSVQKLSAgLCBTVFJVQ1QKLSAgLCBMSVNUCi0gICwgU0VUCi0gICwgTUFQX0tFWQotICAsIE1BUF9WQUxVRQotICB9OwotCi0gcHVibGljOgotICBURGVidWdQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykKLSAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VERlYnVnUHJvdG9jb2w+KHRyYW5zKQotICAgICwgdHJhbnNfKHRyYW5zLmdldCgpKQotICAgICwgc3RyaW5nX2xpbWl0XyhERUZBVUxUX1NUUklOR19MSU1JVCkKLSAgICAsIHN0cmluZ19wcmVmaXhfc2l6ZV8oREVGQVVMVF9TVFJJTkdfUFJFRklYX1NJWkUpCi0gIHsKLSAgICB3cml0ZV9zdGF0ZV8ucHVzaF9iYWNrKFVOSU5JVCk7Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgaW50MzJfdCBERUZBVUxUX1NUUklOR19MSU1JVCA9IDI1NjsKLSAgc3RhdGljIGNvbnN0IGludDMyX3QgREVGQVVMVF9TVFJJTkdfUFJFRklYX1NJWkUgPSAxNjsKLQotICB2b2lkIHNldFN0cmluZ1NpemVMaW1pdChpbnQzMl90IHN0cmluZ19saW1pdCkgewotICAgIHN0cmluZ19saW1pdF8gPSBzdHJpbmdfbGltaXQ7Ci0gIH0KLQotICB2b2lkIHNldFN0cmluZ1ByZWZpeFNpemUoaW50MzJfdCBzdHJpbmdfcHJlZml4X3NpemUpIHsKLSAgICBzdHJpbmdfcHJlZml4X3NpemVfID0gc3RyaW5nX3ByZWZpeF9zaXplOwotICB9Ci0KLQotICB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKTsKLQotICB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmQoKTsKLQotCi0gIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVNYXBFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB1aW50MzJfdCB3cml0ZVNldEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKTsKLQotICB1aW50MzJfdCB3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpOwotCi0gIHVpbnQzMl90IHdyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KTsKLQotICB1aW50MzJfdCB3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMik7Ci0KLSAgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpOwotCi0gIHVpbnQzMl90IHdyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpOwotCi0gIHVpbnQzMl90IHdyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0KLSBwcml2YXRlOgotICB2b2lkIGluZGVudFVwKCk7Ci0gIHZvaWQgaW5kZW50RG93bigpOwotICB1aW50MzJfdCB3cml0ZVBsYWluKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotICB1aW50MzJfdCB3cml0ZUluZGVudGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotICB1aW50MzJfdCBzdGFydEl0ZW0oKTsKLSAgdWludDMyX3QgZW5kSXRlbSgpOwotICB1aW50MzJfdCB3cml0ZUl0ZW0oY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIGZpZWxkVHlwZU5hbWUoVFR5cGUgdHlwZSk7Ci0KLSAgVFRyYW5zcG9ydCogdHJhbnNfOwotCi0gIGludDMyX3Qgc3RyaW5nX2xpbWl0XzsKLSAgaW50MzJfdCBzdHJpbmdfcHJlZml4X3NpemVfOwotCi0gIHN0ZDo6c3RyaW5nIGluZGVudF9zdHJfOwotICBzdGF0aWMgY29uc3QgaW50IGluZGVudF9pbmMgPSAyOwotCi0gIHN0ZDo6dmVjdG9yPHdyaXRlX3N0YXRlX3Q+IHdyaXRlX3N0YXRlXzsKLSAgc3RkOjp2ZWN0b3I8aW50PiBsaXN0X2lkeF87Ci19OwotCi0vKioKLSAqIENvbnN0cnVjdHMgZGVidWcgcHJvdG9jb2wgaGFuZGxlcnMKLSAqLwotY2xhc3MgVERlYnVnUHJvdG9jb2xGYWN0b3J5IDogcHVibGljIFRQcm90b2NvbEZhY3RvcnkgewotIHB1YmxpYzoKLSAgVERlYnVnUHJvdG9jb2xGYWN0b3J5KCkge30KLSAgdmlydHVhbCB+VERlYnVnUHJvdG9jb2xGYWN0b3J5KCkge30KLQotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4obmV3IFREZWJ1Z1Byb3RvY29sKHRyYW5zKSk7Ci0gIH0KLQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAotCi0KLS8vIFRPRE8oZHJlaXNzKTogTW92ZSAocGFydCBvZikgVGhyaWZ0RGVidWdTdHJpbmcgaW50byBhIC5jcHAgZmlsZSBhbmQgcmVtb3ZlIHRoaXMuCi0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsKLQotdGVtcGxhdGU8dHlwZW5hbWUgVGhyaWZ0U3RydWN0Pgotc3RkOjpzdHJpbmcgVGhyaWZ0RGVidWdTdHJpbmcoY29uc3QgVGhyaWZ0U3RydWN0JiB0cykgewotICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLSAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLSAgVE1lbW9yeUJ1ZmZlciogYnVmZmVyID0gbmV3IFRNZW1vcnlCdWZmZXI7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKGJ1ZmZlcik7Ci0gIFREZWJ1Z1Byb3RvY29sIHByb3RvY29sKHRyYW5zKTsKLQotICB0cy53cml0ZSgmcHJvdG9jb2wpOwotCi0gIHVpbnQ4X3QqIGJ1ZjsKLSAgdWludDMyX3Qgc2l6ZTsKLSAgYnVmZmVyLT5nZXRCdWZmZXIoJmJ1ZiwgJnNpemUpOwotICByZXR1cm4gc3RkOjpzdHJpbmcoKGNoYXIqKWJ1ZiwgKHVuc2lnbmVkIGludClzaXplKTsKLX0KLQotLy8gVE9ETyhkcmVpc3MpOiBUaGlzIGlzIGJhZGx5IGJyb2tlbi4gIERvbid0IHVzZSBpdCB1bmxlc3MgeW91IGFyZSBtZS4KLSNpZiAwCi10ZW1wbGF0ZTx0eXBlbmFtZSBPYmplY3Q+Ci1zdGQ6OnN0cmluZyBEZWJ1Z1N0cmluZyhjb25zdCBzdGQ6OnZlY3RvcjxPYmplY3Q+JiB2ZWMpIHsKLSAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Ci0gIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci0gIFRNZW1vcnlCdWZmZXIqIGJ1ZmZlciA9IG5ldyBUTWVtb3J5QnVmZmVyOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucyhidWZmZXIpOwotICBURGVidWdQcm90b2NvbCBwcm90b2NvbCh0cmFucyk7Ci0KLSAgLy8gSSBhbSBncm9zcyEKLSAgcHJvdG9jb2wud3JpdGVTdHJ1Y3RCZWdpbigiU29tZVJhbmRvbVZlY3RvciIpOwotCi0gIC8vIFRPRE86IEZpeCB0aGlzIHdpdGggYSB0cmFpdC4KLSAgcHJvdG9jb2wud3JpdGVMaXN0QmVnaW4oKFRUeXBlKTk5LCB2ZWMuc2l6ZSgpKTsKLSAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8T2JqZWN0Pjo6Y29uc3RfaXRlcmF0b3IgaXQ7Ci0gIGZvciAoaXQgPSB2ZWMuYmVnaW4oKTsgaXQgIT0gdmVjLmVuZCgpOyArK2l0KSB7Ci0gICAgaXQtPndyaXRlKCZwcm90b2NvbCk7Ci0gIH0KLSAgcHJvdG9jb2wud3JpdGVMaXN0RW5kKCk7Ci0KLSAgdWludDhfdCogYnVmOwotICB1aW50MzJfdCBzaXplOwotICBidWZmZXItPmdldEJ1ZmZlcigmYnVmLCAmc2l6ZSk7Ci0gIHJldHVybiBzdGQ6OnN0cmluZygoY2hhciopYnVmLCAodW5zaWduZWQgaW50KXNpemUpOwotfQotI2VuZGlmIC8vIDAKLQotfX0gLy8gYXBhY2hlOjp0aHJpZnQKLQotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RERUJVR1BST1RPQ09MX0hfCi0KLQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVERlbnNlUHJvdG9jb2wuY3BwIGIvbGliL2NwcC9zcmMvcHJvdG9jb2wvVERlbnNlUHJvdG9jb2wuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmU1ZTI4Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1REZW5zZVByb3RvY29sLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0KLUlNUExFTUVOVEFUSU9OIERFVEFJTFMKLQotVERlbnNlUHJvdG9jb2wgd2FzIGRlc2lnbmVkIHRvIGhhdmUgYSBzbWFsbGVyIHNlcmlhbGl6ZWQgZm9ybSB0aGFuCi1UQmluYXJ5UHJvdG9jb2wuICBUaGlzIGlzIGFjY29tcGxpc2hlZCB1c2luZyB0d28gdGVjaG5pcXVlcy4gIFRoZSBmaXJzdCBpcwotdmFyaWFibGUtbGVuZ3RoIGludGVnZXIgZW5jb2RpbmcuICBXZSB1c2UgdGhlIHNhbWUgdGVjaG5pcXVlIHRoYXQgdGhlIFN0YW5kYXJkCi1NSURJIEZpbGUgZm9ybWF0IHVzZXMgZm9yICJ2YXJpYWJsZS1sZW5ndGggcXVhbnRpdGllcyIKLShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZhcmlhYmxlLWxlbmd0aF9xdWFudGl0eSkuCi1BbGwgaW50ZWdlcnMgKGluY2x1ZGluZyBpMTYsIGJ1dCBub3QgYnl0ZSkgYXJlIGZpcnN0IGNhc3QgdG8gdWludDY0X3QsCi10aGVuIHdyaXR0ZW4gb3V0IGFzIHZhcmlhYmxlLWxlbmd0aCBxdWFudGl0aWVzLiAgVGhpcyBoYXMgdGhlIHVuZm9ydHVuYXRlIHNpZGUKLWVmZmVjdCB0aGF0IGFsbCBuZWdhdGl2ZSBudW1iZXJzIHJlcXVpcmUgMTAgYnl0ZXMsIGJ1dCBuZWdhdGl2ZSBudW1iZXJzIHRlbmQKLXRvIGJlIGZhciBsZXNzIGNvbW1vbiB0aGFuIHBvc2l0aXZlIG9uZXMuCi0KLVRoZSBzZWNvbmQgdGVjaG5pcXVlIGVsaW1pbmF0aW5nIHRoZSBmaWVsZCBpZHMgdXNlZCBieSBUQmluYXJ5UHJvdG9jb2wuICBUaGlzCi1kZWNpc2lvbiByZXF1aXJlZCBzdXBwb3J0IGZyb20gdGhlIFRocmlmdCBjb21waWxlciBhbmQgYWxzbyBzYWNyaWZpY2VzIHNvbWUgb2YKLXRoZSBiYWNrd2FyZCBhbmQgZm9yd2FyZCBjb21wYXRpYmlsaXR5IG9mIFRCaW5hcnlQcm90b2NvbC4KLQotV2UgY29uc2lkZXJlZCBpbXBsZW1lbnRpbmcgdGhpcyB0ZWNobmlxdWUgYnkgZ2VuZXJhdGluZyBzZXBhcmF0ZSByZWFkZXJzIGFuZAotd3JpdGVycyBmb3IgdGhlIGRlbnNlIHByb3RvY29sICh0aGlzIGlzIGhvdyBQaWxsYXIsIFRocmlmdCdzIHByZWRlY2Vzc29yLAotd29ya2VkKSwgYnV0IHRoaXMgaWRlYSBoYWQgYSBmZXcgcHJvYmxlbXM6Ci0tIE91ciBhYnN0cmFjdGlvbnMgZ28gb3V0IHRoZSB3aW5kb3cuCi0tIFdlIHdvdWxkIGhhdmUgdG8gbWFpbnRhaW4gYSBzZWNvbmQgY29kZSBnZW5lcmF0b3IuCi0tIFByZXNlcnZpbmcgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCB2ZXJzaW9ucyBvZiB0aGUgc3RydWN0dXJlcyB3b3VsZCBiZSBhCi0gIG5pZ2h0bWFyZS4KLQotVGhlcmVmb3JlLCB3ZSBjaG9zZSBhbiBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gdGhhdCBzdG9yZWQgdGhlIGRlc2NyaXB0aW9uIG9mCi10aGUgZGF0YSBuZWl0aGVyIGluIHRoZSBkYXRhIGl0c2VsZiAobGlrZSBUQmluYXJ5UHJvdG9jb2wpIG5vciBpbiB0aGUKLXNlcmlhbGl6YXRpb24gY29kZSAobGlrZSBQaWxsYXIpLCBidXQgaW5zdGVhZCBpbiBhIHNlcGFyYXRlIGRhdGEgc3RydWN0dXJlLAotY2FsbGVkIGEgVHlwZVNwZWMuICBUeXBlU3BlY3MgYXJlIGdlbmVyYXRlZCBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyCi0oc3BlY2lmaWNhbGx5IGluIHRoZSB0X2NwcF9nZW5lcmF0b3IpLCBhbmQgdGhlaXIgc3RydWN0dXJlIHNob3VsZCBiZQotZG9jdW1lbnRlZCB0aGVyZSAoVE9ETyhkcmVpc3MpOiBzL3Nob3VsZCBiZS9pcy8pLgotCi1XZSBtYWludGFpbiBhIHN0YWNrIG9mIFR5cGVTcGVjcyB3aXRoaW4gdGhlIHByb3RvY29sIHNvIGl0IGtub3dzIHdoZXJlIHRoZQotZ2VuZXJhdGVkIGNvZGUgaXMgaW4gdGhlIHJlYWRpbmcvd3JpdGluZyBwcm9jZXNzLiAgRm9yIGV4YW1wbGUsIGlmIHdlIGFyZQotd3JpdGluZyBhbiBpMzIgY29udGFpbmVkIGluIGEgc3RydWN0IGJhciwgY29udGFpbmVkIGluIGEgc3RydWN0IGZvbywgdGhlbiB0aGUKLXN0YWNrIHdvdWxkIGxvb2sgbGlrZTogVE9QICwgaTMyICwgc3RydWN0IGJhciAsIHN0cnVjdCBmb28gLCBCT1RUT00uCi1UaGUgZm9sbG93aW5nIGludmFyaWFudDogd2hlbmV2ZXIgd2UgYXJlIGFib3V0IHRvIHJlYWQvd3JpdGUgYW4gb2JqZWN0Ci0oc3RydWN0QmVnaW4sIGNvbnRhaW5lckJlZ2luLCBvciBhIHNjYWxhciksIHRoZSBUeXBlU3BlYyBvbiB0aGUgdG9wIG9mIHRoZQotc3RhY2sgbXVzdCBtYXRjaCB0aGUgdHlwZSBiZWluZyByZWFkL3dyaXR0ZW4uICBUaGUgbWFpbiByZWFzb25zIHRoYXQgdGhpcwotaW52YXJpYW50IG11c3QgYmUgbWFpbnRhaW5lZCBpcyB0aGF0IGlmIHdlIGV2ZXIgc3RhcnQgcmVhZGluZyBhIHN0cnVjdHVyZSwgd2UKLW11c3QgaGF2ZSBpdHMgZXhhY3QgVHlwZVNwZWMgaW4gb3JkZXIgdG8gcGFzcyB0aGUgcmlnaHQgdGFncyB0byB0aGUKLWRlc2VyaWFsaXplci4KLQotV2UgdXNlIHRoZSBmb2xsb3dpbmcgc3RyYXRlZ2llcyBmb3IgbWFpbnRhaW5pbmcgdGhpcyBpbnZhcmlhbnQ6Ci0KLS0gRm9yIHN0cnVjdHVyZXMsIHdlIGhhdmUgYSBzZXBhcmF0ZSBzdGFjayBvZiBpbmRleGVzLCBvbmUgZm9yIGVhY2ggc3RydWN0dXJlCi0gIG9uIHRoZSBUeXBlU3BlYyBzdGFjay4gIFRoZXNlIGFyZSBpbmRleGVzIGludG8gdGhlIGxpc3Qgb2YgZmllbGRzIGluIHRoZQotICBzdHJ1Y3R1cmUncyBUeXBlU3BlYy4gIFdoZW4gd2Uge3JlYWQsd3JpdGV9RmllbGRCZWdpbiwgd2UgcHVzaCBvbiB0aGUKLSAgVHlwZVNwZWMgZm9yIHRoZSBmaWVsZC4KLS0gV2hlbiB3ZSBiZWdpbiB3cml0aW5nIGEgbGlzdCBvciBzZXQsIHdlIHB1c2ggb24gdGhlIFR5cGVTcGVjIGZvciB0aGUKLSAgZWxlbWVudCB0eXBlLgotLSBGb3IgbWFwcywgd2UgaGF2ZSBhIHNlcGFyYXRlIHN0YWNrIG9mIGJvb2xlYW5zLCBvbmUgZm9yIGVhY2ggbWFwIG9uIHRoZQotICBUeXBlU3BlYyBzdGFjay4gIFRoZSBib29sZWFuIGlzIHRydWUgaWYgd2UgYXJlIHdyaXRpbmcgdGhlIGtleSBmb3IgdGhhdAotICBtYXAsIGFuZCBmYWxzZSBpZiB3ZSBhcmUgd3JpdGluZyB0aGUgdmFsdWUuICBNYXBzIGFyZSB0aGUgdHJpY2tpZXN0IGNhc2UKLSAgYmVjYXVzZSB0aGUgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgY2FsbCBhbnkgcHJvdG9jb2wgbWV0aG9kIGJldHdlZW4KLSAgdGhlIGtleSBhbmQgdGhlIHZhbHVlLiAgQXMgYSByZXN1bHQsIHdlIHBvdGVudGlhbGx5IGhhdmUgdG8gc3dpdGNoCi0gIGJldHdlZW4gbWFwIGtleSBzdGF0ZSBhbmQgbWFwIHZhbHVlIHN0YXRlIGFmdGVyIHJlYWRpbmcvd3JpdGluZyBhbnkgb2JqZWN0LgotLSBUaGlzIGpvYiBpcyBoYW5kbGVkIGJ5IHRoZSBzdGF0ZVRyYW5zaXRpb24gbWV0aG9kLiAgSXQgaXMgY2FsbGVkIGFmdGVyCi0gIHJlYWRpbmcvd3JpdGluZyBldmVyeSBvYmplY3QuICBJdCBwb3BzIHRoZSBjdXJyZW50IFR5cGVTcGVjIG9mZiB0aGUgc3RhY2ssCi0gIHRoZW4gb3B0aW9uYWxseSBwdXNoZXMgYSBuZXcgb25lIG9uLCBkZXBlbmRpbmcgb24gd2hhdCB0aGUgbmV4dCBUeXBlU3BlYyBpcy4KLSAgSWYgaXQgaXMgYSBzdHJ1Y3QsIHRoZSBqb2IgaXMgbGVmdCB0byB0aGUgbmV4dCB3cml0ZUZpZWxkQmVnaW4uICBJZiBpdCBpcyBhCi0gIHNldCBvciBsaXN0LCB0aGUganVzdC1wb3BwZWQgdHlwZXNwZWMgaXMgcHVzaGVkIGJhY2sgb24uICBJZiBpdCBpcyBhIG1hcCwKLSAgdGhlIHRvcCBvZiB0aGUga2V5L3ZhbHVlIHN0YWNrIGlzIHRvZ2dsZWQsIGFuZCB0aGUgYXBwcm9wcmlhdGUgVHlwZVNwZWMKLSAgaXMgcHVzaGVkLgotCi1PcHRpb25hbCBmaWVsZHMgYXJlIGEgbGl0dGxlIHRyaWNreSBhbHNvLiAgV2Ugd3JpdGUgYSB6ZXJvIGJ5dGUgaWYgdGhleSBhcmUKLWFic2VudCBhbmQgcHJlZml4IHRoZW0gd2l0aCBhbiAweDAxIGJ5dGUgaWYgdGhleSBhcmUgcHJlc2VudAotKi8KLQotI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSAiVERlbnNlUHJvdG9jb2wuaCIKLSNpbmNsdWRlICJUUmVmbGVjdGlvbkxvY2FsLmgiCi0KLS8vIExlYXZpbmcgdGhpcyBvbiBmb3Igbm93LiAgRGlzYWJsaW5nIGl0IHdpbGwgdHVybiBvZmYgYXNzZXJ0cywgd2hpY2ggc2hvdWxkCi0vLyBnaXZlIGEgcGVyZm9ybWFuY2UgYm9vc3QuICBXaGVuIHdlIGhhdmUgKnJlYWxseSogdGhvcm91Z2ggdGVzdCBjYXNlcywKLS8vIHdlIHNob3VsZCBkcm9wIHRoaXMuCi0jZGVmaW5lIERFQlVHX1RERU5TRVBST1RPQ09MCi0KLS8vIE5PVEU6IEFzc2VydGlvbnMgc2hvdWxkICpvbmx5KiBiZSB1c2VkIHRvIGRldGVjdCBidWdzIGluIGNvZGUsCi0vLyAgICAgICBlaXRoZXIgaW4gVERlbnNlUHJvdG9jb2wgaXRzZWxmLCBvciBpbiBjb2RlIHVzaW5nIGl0LgotLy8gICAgICAgKEZvciBleGFtcGxlLCB1c2luZyB0aGUgd3JvbmcgVHlwZVNwZWMuKQotLy8gICAgICAgSW52YWxpZCBkYXRhIHNob3VsZCBORVZFUiBjYXVzZSBhbiBhc3NlcnRpb24gZmFpbHVyZSwKLS8vICAgICAgIG5vIG1hdHRlciBob3cgZ3Jvc3NseSBjb3JydXB0ZWQsIG5vciBob3cgaW5nZW5pb3VzbHkgY3JhZnRlZC4KLSNpZmRlZiBERUJVR19UREVOU0VQUk9UT0NPTAotI3VuZGVmIE5ERUJVRwotI2Vsc2UKLSNkZWZpbmUgTkRFQlVHCi0jZW5kaWYKLSNpbmNsdWRlIDxjYXNzZXJ0PgotCi11c2luZyBzdGQ6OnN0cmluZzsKLQotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIFVOTElLRUxZKHZhbCkgKF9fYnVpbHRpbl9leHBlY3QoKHZhbCksIDApKQotI2Vsc2UKLSNkZWZpbmUgVU5MSUtFTFkodmFsKSAodmFsKQotI2VuZGlmCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotY29uc3QgaW50IFREZW5zZVByb3RvY29sOjpGUF9QUkVGSVhfTEVOID0KLSAgYXBhY2hlOjp0aHJpZnQ6OnJlZmxlY3Rpb246OmxvY2FsOjpGUF9QUkVGSVhfTEVOOwotCi0vLyBUb3AgVHlwZVNwZWMuICBUeXBlU3BlYyBvZiB0aGUgc3RydWN0dXJlIGJlaW5nIGVuY29kZWQuCi0jZGVmaW5lIFRUUyAgKHRzX3N0YWNrXy5iYWNrKCkpICAvLyB0eXBlID0gVHlwZVNwZWMqCi0vLyBJbkRlWC4gIEluZGV4IGludG8gVFRTIG9mIHRoZSBjdXJyZW50L25leHQgZmllbGQgdG8gZW5jb2RlLgotI2RlZmluZSBJRFggKGlkeF9zdGFja18uYmFjaygpKSAgLy8gdHlwZSA9IGludAotLy8gRmllbGQgVHlwZVNwZWMuICBUeXBlU3BlYyBvZiB0aGUgY3VycmVudC9uZXh0IGZpZWxkIHRvIGVuY29kZS4KLSNkZWZpbmUgRlRTIChUVFMtPnRzdHJ1Y3Quc3BlY3NbSURYXSkgIC8vIHR5cGUgPSBUeXBlU3BlYyoKLS8vIEZpZWxkIE1lVGEuICBNZXRhZGF0YSBvZiB0aGUgY3VycmVudC9uZXh0IGZpZWxkIHRvIGVuY29kZS4KLSNkZWZpbmUgRk1UIChUVFMtPnRzdHJ1Y3QubWV0YXNbSURYXSkgIC8vIHR5cGUgPSBGaWVsZE1ldGEKLS8vIFN1YlR5cGUgMS8yLiAgVHlwZVNwZWMgb2YgdGhlIGZpcnN0L3NlY29uZCBzdWJ0eXBlIG9mIHRoaXMgY29udGFpbmVyLgotI2RlZmluZSBTVDEgKFRUUy0+dGNvbnRhaW5lci5zdWJ0eXBlMSkKLSNkZWZpbmUgU1QyIChUVFMtPnRjb250YWluZXIuc3VidHlwZTIpCi0KLQotLyoqCi0gKiBDaGVja3MgdGhhdCBAYyB0dHlwZSBpcyBpbmRlZWQgdGhlIHR0eXBlIHRoYXQgd2Ugc2hvdWxkIGJlIHdyaXRpbmcsCi0gKiBhY2NvcmRpbmcgdG8gb3VyIHR5cGVzcGVjLiAgQWJvcnRzIGlmIHRoZSB0ZXN0IGZhaWxzIGFuZCBkZWJ1Z2dpbmcgaW4gb24uCi0gKi8KLWlubGluZSB2b2lkIFREZW5zZVByb3RvY29sOjpjaGVja1RUeXBlKGNvbnN0IFRUeXBlIHR0eXBlKSB7Ci0gIGFzc2VydCghdHNfc3RhY2tfLmVtcHR5KCkpOwotICBhc3NlcnQoVFRTLT50dHlwZSA9PSB0dHlwZSk7Ci19Ci0KLS8qKgotICogTWFrZXMgc3VyZSB0aGF0IHRoZSBUeXBlU3BlYyBzdGFjayBpcyBjb3JyZWN0IGZvciB0aGUgbmV4dCBvYmplY3QuCi0gKiBTZWUgdG9wLW9mLWZpbGUgY29tbWVudHMuCi0gKi8KLWlubGluZSB2b2lkIFREZW5zZVByb3RvY29sOjpzdGF0ZVRyYW5zaXRpb24oKSB7Ci0gIFR5cGVTcGVjKiBvbGRfdHRzID0gdHNfc3RhY2tfLmJhY2soKTsKLSAgdHNfc3RhY2tfLnBvcF9iYWNrKCk7Ci0KLSAgLy8gSWYgdGhpcyBpcyB0aGUgZW5kIG9mIHRoZSB0b3AtbGV2ZWwgd3JpdGUsIHdlIHNob3VsZCBoYXZlIGp1c3QgcG9wcGVkCi0gIC8vIHRoZSBUeXBlU3BlYyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgotICBpZiAodHNfc3RhY2tfLmVtcHR5KCkpIHsKLSAgICBhc3NlcnQob2xkX3R0cyA9IHR5cGVfc3BlY18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN3aXRjaCAoVFRTLT50dHlwZSkgewotCi0gICAgY2FzZSBUX1NUUlVDVDoKLSAgICAgIGFzc2VydChvbGRfdHRzID09IEZUUyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9MSVNUOgotICAgIGNhc2UgVF9TRVQ6Ci0gICAgICBhc3NlcnQob2xkX3R0cyA9PSBTVDEpOwotICAgICAgdHNfc3RhY2tfLnB1c2hfYmFjayhvbGRfdHRzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX01BUDoKLSAgICAgIGFzc2VydChvbGRfdHRzID09IChta3Zfc3RhY2tfLmJhY2soKSA/IFNUMSA6IFNUMikpOwotICAgICAgbWt2X3N0YWNrXy5iYWNrKCkgPSAhbWt2X3N0YWNrXy5iYWNrKCk7Ci0gICAgICB0c19zdGFja18ucHVzaF9iYWNrKG1rdl9zdGFja18uYmFjaygpID8gU1QxIDogU1QyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzc2VydCghIkludmFsaWQgVFR5cGUgaW4gc3RhdGVUcmFuc2l0aW9uLiIpOwotICAgICAgYnJlYWs7Ci0KLSAgfQotfQotCi0KLS8qCi0gKiBWYXJpYWJsZS1sZW5ndGggcXVhbnRpdHkgZnVuY3Rpb25zLgotICovCi0KLWlubGluZSB1aW50MzJfdCBURGVuc2VQcm90b2NvbDo6dmxxUmVhZCh1aW50NjRfdCYgdmxxKSB7Ci0gIHVpbnQzMl90IHVzZWQgPSAwOwotICB1aW50NjRfdCB2YWwgPSAwOwotICB1aW50OF90IGJ1ZlsxMF07ICAvLyA2NCBiaXRzIC8gKDcgYml0cy9ieXRlKSA9IDEwIGJ5dGVzLgotICB1aW50MzJfdCBidWZfc2l6ZSA9IHNpemVvZihidWYpOwotICBjb25zdCB1aW50OF90KiBib3Jyb3dlZCA9IHRyYW5zXy0+Ym9ycm93KGJ1ZiwgJmJ1Zl9zaXplKTsKLQotICAvLyBGYXN0IHBhdGguICBUT0RPKGRyZWlzcyk6IE1ha2UgaXQgZmFzdGVyLgotICBpZiAoYm9ycm93ZWQgIT0gTlVMTCkgewotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB1aW50OF90IGJ5dGUgPSBib3Jyb3dlZFt1c2VkXTsKLSAgICAgIHVzZWQrKzsKLSAgICAgIHZhbCA9ICh2YWwgPDwgNykgfCAoYnl0ZSAmIDB4N2YpOwotICAgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7Ci0gICAgICAgIHZscSA9IHZhbDsKLSAgICAgICAgdHJhbnNfLT5jb25zdW1lKHVzZWQpOwotICAgICAgICByZXR1cm4gdXNlZDsKLSAgICAgIH0KLSAgICAgIC8vIEhhdmUgdG8gY2hlY2sgZm9yIGludmFsaWQgZGF0YSBzbyB3ZSBkb24ndCBjcmFzaC4KLSAgICAgIGlmIChVTkxJS0VMWSh1c2VkID09IHNpemVvZihidWYpKSkgewotICAgICAgICByZXNldFN0YXRlKCk7Ci0gICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwgIlZhcmlhYmxlLWxlbmd0aCBpbnQgb3ZlciAxMCBieXRlcy4iKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBTbG93IHBhdGguCi0gIGVsc2UgewotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB1aW50OF90IGJ5dGU7Ci0gICAgICB1c2VkICs9IHRyYW5zXy0+cmVhZEFsbCgmYnl0ZSwgMSk7Ci0gICAgICB2YWwgPSAodmFsIDw8IDcpIHwgKGJ5dGUgJiAweDdmKTsKLSAgICAgIGlmICghKGJ5dGUgJiAweDgwKSkgewotICAgICAgICB2bHEgPSB2YWw7Ci0gICAgICAgIHJldHVybiB1c2VkOwotICAgICAgfQotICAgICAgLy8gTWlnaHQgYXMgd2VsbCBjaGVjayBmb3IgaW52YWxpZCBkYXRhIG9uIHRoZSBzbG93IHBhdGggdG9vLgotICAgICAgaWYgKFVOTElLRUxZKHVzZWQgPj0gc2l6ZW9mKGJ1ZikpKSB7Ci0gICAgICAgIHJlc2V0U3RhdGUoKTsKLSAgICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLCAiVmFyaWFibGUtbGVuZ3RoIGludCBvdmVyIDEwIGJ5dGVzLiIpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1pbmxpbmUgdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnZscVdyaXRlKHVpbnQ2NF90IHZscSkgewotICB1aW50OF90IGJ1ZlsxMF07ICAvLyA2NCBiaXRzIC8gKDcgYml0cy9ieXRlKSA9IDEwIGJ5dGVzLgotICBpbnQzMl90IHBvcyA9IHNpemVvZihidWYpIC0gMTsKLQotICAvLyBXcml0ZSB0aGUgdGhpbmcgZnJvbSBiYWNrIHRvIGZyb250LgotICBidWZbcG9zXSA9IHZscSAmIDB4N2Y7Ci0gIHZscSA+Pj0gNzsKLSAgcG9zLS07Ci0KLSAgd2hpbGUgKHZscSA+IDApIHsKLSAgICBhc3NlcnQocG9zID49IDApOwotICAgIGJ1Zltwb3NdID0gKHZscSB8IDB4ODApOwotICAgIHZscSA+Pj0gNzsKLSAgICBwb3MtLTsKLSAgfQotCi0gIC8vIEJhY2sgdXAgb25lIHN0ZXAgYmVmb3JlIHdyaXRpbmcuCi0gIHBvcysrOwotCi0gIHRyYW5zXy0+d3JpdGUoYnVmK3Bvcywgc2l6ZW9mKGJ1ZikgLSBwb3MpOwotICByZXR1cm4gc2l6ZW9mKGJ1ZikgLSBwb3M7Ci19Ci0KLQotCi0vKgotICogV3JpdGluZyBmdW5jdGlvbnMuCi0gKi8KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7Ci0gIHRocm93IFRFeGNlcHRpb24oIlREZW5zZVByb3RvY29sIGRvZXNuJ3Qgd29yayB3aXRoIG1lc3NhZ2VzICh5ZXQpLiIpOwotCi0gIGludDMyX3QgdmVyc2lvbiA9IChWRVJTSU9OXzIpIHwgKChpbnQzMl90KW1lc3NhZ2VUeXBlKTsKLSAgdWludDMyX3Qgd3NpemUgPSAwOwotICB3c2l6ZSArPSBzdWJXcml0ZUkzMih2ZXJzaW9uKTsKLSAgd3NpemUgKz0gc3ViV3JpdGVTdHJpbmcobmFtZSk7Ci0gIHdzaXplICs9IHN1YldyaXRlSTMyKHNlcWlkKTsKLSAgcmV0dXJuIHdzaXplOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVNZXNzYWdlRW5kKCkgewotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSkgewotICAodm9pZCkgbmFtZTsKLSAgdWludDMyX3QgeGZlciA9IDA7Ci0KLSAgLy8gVGhlIFR5cGVTcGVjIHN0YWNrIHNob3VsZCBiZSBlbXB0eSBpZiB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgcmVhZC93cml0ZS4KLSAgLy8gSWYgaXQgaXMsIHdlIHB1c2ggdGhlIFR5cGVTcGVjIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCi0gIGlmICh0c19zdGFja18uZW1wdHkoKSkgewotICAgIGFzc2VydChzdGFuZGFsb25lXyk7Ci0KLSAgICBpZiAodHlwZV9zcGVjXyA9PSBOVUxMKSB7Ci0gICAgICByZXNldFN0YXRlKCk7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKCJURGVuc2VQcm90b2NvbDogTm8gdHlwZSBzcGVjaWZpZWQuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGFzc2VydCh0eXBlX3NwZWNfLT50dHlwZSA9PSBUX1NUUlVDVCk7Ci0gICAgICB0c19zdGFja18ucHVzaF9iYWNrKHR5cGVfc3BlY18pOwotICAgICAgLy8gV3JpdGUgb3V0IGEgcHJlZml4IG9mIHRoZSBzdHJ1Y3R1cmUgZmluZ2VycHJpbnQuCi0gICAgICB0cmFuc18tPndyaXRlKHR5cGVfc3BlY18tPmZwX3ByZWZpeCwgRlBfUFJFRklYX0xFTik7Ci0gICAgICB4ZmVyICs9IEZQX1BSRUZJWF9MRU47Ci0gICAgfQotICB9Ci0KLSAgLy8gV2UgbmVlZCBhIG5ldyBmaWVsZCBpbmRleCBmb3IgdGhpcyBzdHJ1Y3R1cmUuCi0gIGlkeF9zdGFja18ucHVzaF9iYWNrKDApOwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlU3RydWN0RW5kKCkgewotICBpZHhfc3RhY2tfLnBvcF9iYWNrKCk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCkgewotICAodm9pZCkgbmFtZTsKLSAgdWludDMyX3QgeGZlciA9IDA7Ci0KLSAgLy8gU2tpcCBvdmVyIG9wdGlvbmFsIGZpZWxkcy4KLSAgd2hpbGUgKEZNVC50YWcgIT0gZmllbGRJZCkgewotICAgIC8vIFRPRE8oZHJlaXNzKTogT2xkIG1ldGEgaGVyZS4KLSAgICBhc3NlcnQoRlRTLT50dHlwZSAhPSBUX1NUT1ApOwotICAgIGFzc2VydChGTVQuaXNfb3B0aW9uYWwpOwotICAgIC8vIFdyaXRlIGEgemVybyBieXRlIHNvIHRoZSByZWFkZXIgY2FuIHNraXAgaXQuCi0gICAgeGZlciArPSBzdWJXcml0ZUJvb2woZmFsc2UpOwotICAgIC8vIEFuZCBhZHZhbmNlIHRvIHRoZSBuZXh0IGZpZWxkLgotICAgIElEWCsrOwotICB9Ci0KLSAgLy8gVE9ETyhkcmVpc3MpOiBnaXZlIGEgYmV0dGVyIGV4Y2VwdGlvbi4KLSAgYXNzZXJ0KEZUUy0+dHR5cGUgPT0gZmllbGRUeXBlKTsKLQotICBpZiAoRk1ULmlzX29wdGlvbmFsKSB7Ci0gICAgc3ViV3JpdGVCb29sKHRydWUpOwotICAgIHhmZXIgKz0gMTsKLSAgfQotCi0gIC8vIHdyaXRlRmllbGRTdG9wIHNoYXJlcyBhbGwgbG90IG9mIGxvZ2ljIHVwIHRvIHRoaXMgcG9pbnQuCi0gIC8vIEluc3RlYWQgb2YgcmVwbGljYXRpbmcgaXQgYWxsLCB3ZSBqdXN0IGNhbGwgdGhpcyBtZXRob2QgZnJvbSB0aGF0IG9uZQotICAvLyBhbmQgdXNlIGEgZ3Jvc3Mgc3BlY2lhbCBjYXNlIGhlcmUuCi0gIGlmIChVTkxJS0VMWShGVFMtPnR0eXBlICE9IFRfU1RPUCkpIHsKLSAgICAvLyBGb3Igbm9ybWFsIGZpZWxkcywgcHVzaCB0aGUgVHlwZVNwZWMgdGhhdCB3ZSdyZSBhYm91dCB0byB1c2UuCi0gICAgdHNfc3RhY2tfLnB1c2hfYmFjayhGVFMpOwotICB9Ci0gIHJldHVybiB4ZmVyOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVGaWVsZEVuZCgpIHsKLSAgLy8gSnVzdCBtb3ZlIG9uIHRvIHRoZSBuZXh0IGZpZWxkLgotICBJRFgrKzsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZUZpZWxkU3RvcCgpIHsKLSAgcmV0dXJuIFREZW5zZVByb3RvY29sOjp3cml0ZUZpZWxkQmVnaW4oIiIsIFRfU1RPUCwgMCk7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICBjaGVja1RUeXBlKFRfTUFQKTsKLQotICBhc3NlcnQoa2V5VHlwZSA9PSBTVDEtPnR0eXBlKTsKLSAgYXNzZXJ0KHZhbFR5cGUgPT0gU1QyLT50dHlwZSk7Ci0KLSAgdHNfc3RhY2tfLnB1c2hfYmFjayhTVDEpOwotICBta3Zfc3RhY2tfLnB1c2hfYmFjayh0cnVlKTsKLQotICByZXR1cm4gc3ViV3JpdGVJMzIoKGludDMyX3Qpc2l6ZSk7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZU1hcEVuZCgpIHsKLSAgLy8gUG9wIG9mZiB0aGUgdmFsdWUgdHlwZSwgYXMgd2VsbCBhcyBvdXIgZW50cnkgaW4gdGhlIG1hcCBrZXkvdmFsdWUgc3RhY2suCi0gIC8vIHN0YXRlVHJhbnNpdGlvbiB0YWtlcyBjYXJlIG9mIHBvcHBpbmcgb2ZmIG91ciBUeXBlU3BlYy4KLSAgdHNfc3RhY2tfLnBvcF9iYWNrKCk7Ci0gIG1rdl9zdGFja18ucG9wX2JhY2soKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICBjaGVja1RUeXBlKFRfTElTVCk7Ci0KLSAgYXNzZXJ0KGVsZW1UeXBlID09IFNUMS0+dHR5cGUpOwotICB0c19zdGFja18ucHVzaF9iYWNrKFNUMSk7Ci0gIHJldHVybiBzdWJXcml0ZUkzMigoaW50MzJfdClzaXplKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlTGlzdEVuZCgpIHsKLSAgLy8gUG9wIG9mZiB0aGUgZWxlbWVudCB0eXBlLiAgc3RhdGVUcmFuc2l0aW9uIHRha2VzIGNhcmUgb2YgcG9wcGluZyBvZmYgb3Vycy4KLSAgdHNfc3RhY2tfLnBvcF9iYWNrKCk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIGNoZWNrVFR5cGUoVF9TRVQpOwotCi0gIGFzc2VydChlbGVtVHlwZSA9PSBTVDEtPnR0eXBlKTsKLSAgdHNfc3RhY2tfLnB1c2hfYmFjayhTVDEpOwotICByZXR1cm4gc3ViV3JpdGVJMzIoKGludDMyX3Qpc2l6ZSk7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZVNldEVuZCgpIHsKLSAgLy8gUG9wIG9mZiB0aGUgZWxlbWVudCB0eXBlLiAgc3RhdGVUcmFuc2l0aW9uIHRha2VzIGNhcmUgb2YgcG9wcGluZyBvZmYgb3Vycy4KLSAgdHNfc3RhY2tfLnBvcF9iYWNrKCk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKSB7Ci0gIGNoZWNrVFR5cGUoVF9CT09MKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiBUQmluYXJ5UHJvdG9jb2w6OndyaXRlQm9vbCh2YWx1ZSk7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpIHsKLSAgY2hlY2tUVHlwZShUX0JZVEUpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbDo6d3JpdGVCeXRlKGJ5dGUpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKLSAgY2hlY2tUVHlwZShUX0kxNik7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gdmxxV3JpdGUoaTE2KTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKSB7Ci0gIGNoZWNrVFR5cGUoVF9JMzIpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIHZscVdyaXRlKGkzMik7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgewotICBjaGVja1RUeXBlKFRfSTY0KTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiB2bHFXcml0ZShpNjQpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgewotICBjaGVja1RUeXBlKFRfRE9VQkxFKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiBUQmluYXJ5UHJvdG9jb2w6OndyaXRlRG91YmxlKGR1Yik7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIGNoZWNrVFR5cGUoVF9TVFJJTkcpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIHN1YldyaXRlU3RyaW5nKHN0cik7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiBURGVuc2VQcm90b2NvbDo6d3JpdGVTdHJpbmcoc3RyKTsKLX0KLQotaW5saW5lIHVpbnQzMl90IFREZW5zZVByb3RvY29sOjpzdWJXcml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgewotICByZXR1cm4gdmxxV3JpdGUoaTMyKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnN1YldyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgdWludDMyX3Qgc2l6ZSA9IHN0ci5zaXplKCk7Ci0gIHVpbnQzMl90IHhmZXIgPSBzdWJXcml0ZUkzMigoaW50MzJfdClzaXplKTsKLSAgaWYgKHNpemUgPiAwKSB7Ci0gICAgdHJhbnNfLT53cml0ZSgodWludDhfdCopc3RyLmRhdGEoKSwgc2l6ZSk7Ci0gIH0KLSAgcmV0dXJuIHhmZXIgKyBzaXplOwotfQotCi0KLQotLyoKLSAqIFJlYWRpbmcgZnVuY3Rpb25zCi0gKgotICogVGhlc2UgaGF2ZSBhIGxvdCBvZiB0aGUgc2FtZSBsb2dpYyBhcyB0aGUgd3JpdGluZyBmdW5jdGlvbnMsIHNvIGlmCi0gKiBzb21ldGhpbmcgaXMgY29uZnVzaW5nLCBsb29rIGZvciBjb21tZW50cyBpbiB0aGUgY29ycmVzcG9uZGluZyB3cml0ZXIuCi0gKi8KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIHsKLSAgdGhyb3cgVEV4Y2VwdGlvbigiVERlbnNlUHJvdG9jb2wgZG9lc24ndCB3b3JrIHdpdGggbWVzc2FnZXMgKHlldCkuIik7Ci0KLSAgdWludDMyX3QgeGZlciA9IDA7Ci0gIGludDMyX3Qgc3o7Ci0gIHhmZXIgKz0gc3ViUmVhZEkzMihzeik7Ci0KLSAgaWYgKHN6IDwgMCkgewotICAgIC8vIENoZWNrIGZvciBjb3JyZWN0IHZlcnNpb24gbnVtYmVyCi0gICAgaW50MzJfdCB2ZXJzaW9uID0gc3ogJiBWRVJTSU9OX01BU0s7Ci0gICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTl8yKSB7Ci0gICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTiwgIkJhZCB2ZXJzaW9uIGlkZW50aWZpZXIiKTsKLSAgICB9Ci0gICAgbWVzc2FnZVR5cGUgPSAoVE1lc3NhZ2VUeXBlKShzeiAmIDB4MDAwMDAwZmYpOwotICAgIHhmZXIgKz0gc3ViUmVhZFN0cmluZyhuYW1lKTsKLSAgICB4ZmVyICs9IHN1YlJlYWRJMzIoc2VxaWQpOwotICB9IGVsc2UgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OLCAiTm8gdmVyc2lvbiBpZGVudGlmaWVyLi4uIG9sZCBwcm90b2NvbCBjbGllbnQgaW4gc3RyaWN0IG1vZGU/Iik7Ci0gIH0KLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkTWVzc2FnZUVuZCgpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkU3RydWN0QmVnaW4oc3RyaW5nJiBuYW1lKSB7Ci0gICh2b2lkKSBuYW1lOwotICB1aW50MzJfdCB4ZmVyID0gMDsKLQotICBpZiAodHNfc3RhY2tfLmVtcHR5KCkpIHsKLSAgICBhc3NlcnQoc3RhbmRhbG9uZV8pOwotCi0gICAgaWYgKHR5cGVfc3BlY18gPT0gTlVMTCkgewotICAgICAgcmVzZXRTdGF0ZSgpOwotICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVERlbnNlUHJvdG9jb2w6IE5vIHR5cGUgc3BlY2lmaWVkLiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBhc3NlcnQodHlwZV9zcGVjXy0+dHR5cGUgPT0gVF9TVFJVQ1QpOwotICAgICAgdHNfc3RhY2tfLnB1c2hfYmFjayh0eXBlX3NwZWNfKTsKLQotICAgICAgLy8gQ2hlY2sgdGhlIGZpbmdlcnByaW50IHByZWZpeC4KLSAgICAgIHVpbnQ4X3QgYnVmW0ZQX1BSRUZJWF9MRU5dOwotICAgICAgeGZlciArPSB0cmFuc18tPnJlYWQoYnVmLCBGUF9QUkVGSVhfTEVOKTsKLSAgICAgIGlmIChzdGQ6Om1lbWNtcChidWYsIHR5cGVfc3BlY18tPmZwX3ByZWZpeCwgRlBfUFJFRklYX0xFTikgIT0gMCkgewotICAgICAgICByZXNldFN0YXRlKCk7Ci0gICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICJGaW5nZXJwcmludCBpbiBkYXRhIGRvZXMgbm90IG1hdGNoIHR5cGVfc3BlYy4iKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBXZSBuZWVkIGEgbmV3IGZpZWxkIGluZGV4IGZvciB0aGlzIHN0cnVjdHVyZS4KLSAgaWR4X3N0YWNrXy5wdXNoX2JhY2soMCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZFN0cnVjdEVuZCgpIHsKLSAgaWR4X3N0YWNrXy5wb3BfYmFjaygpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkRmllbGRCZWdpbihzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKSB7Ci0gICh2b2lkKSBuYW1lOwotICB1aW50MzJfdCB4ZmVyID0gMDsKLQotICAvLyBGb3Igb3B0aW9uYWwgZmllbGRzLCBjaGVjayB0byBzZWUgaWYgdGhleSBhcmUgdGhlcmUuCi0gIHdoaWxlIChGTVQuaXNfb3B0aW9uYWwpIHsKLSAgICBib29sIGlzX3ByZXNlbnQ7Ci0gICAgeGZlciArPSBzdWJSZWFkQm9vbChpc19wcmVzZW50KTsKLSAgICBpZiAoaXNfcHJlc2VudCkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIElEWCsrOwotICB9Ci0KLSAgLy8gT25jZSB3ZSBoaXQgYSBtYW5kYXRvcnkgZmllbGQsIG9yIGFuIG9wdGlvbmFsIGZpZWxkIHRoYXQgaXMgcHJlc2VudCwKLSAgLy8gd2Uga25vdyB0aGF0IEZNVCBhbmQgRlRTIHBvaW50IHRvIHRoZSBhcHByb3ByaWF0ZSBmaWVsZC4KLQotICBmaWVsZElkICAgPSBGTVQudGFnOwotICBmaWVsZFR5cGUgPSBGVFMtPnR0eXBlOwotCi0gIC8vIE5vcm1hbGx5LCB3ZSBwdXNoIHRoZSBUeXBlU3BlYyB0aGF0IHdlIGFyZSBhYm91dCB0byByZWFkLAotICAvLyBidXQgbm8gcmVhZGluZyBpcyBkb25lIGZvciBUX1NUT1AuCi0gIGlmIChGVFMtPnR0eXBlICE9IFRfU1RPUCkgewotICAgIHRzX3N0YWNrXy5wdXNoX2JhY2soRlRTKTsKLSAgfQotICByZXR1cm4geGZlcjsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRGaWVsZEVuZCgpIHsKLSAgSURYKys7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgY2hlY2tUVHlwZShUX01BUCk7Ci0KLSAgdWludDMyX3QgeGZlciA9IDA7Ci0gIGludDMyX3Qgc2l6ZWk7Ci0gIHhmZXIgKz0gc3ViUmVhZEkzMihzaXplaSk7Ci0gIGlmIChzaXplaSA8IDApIHsKLSAgICByZXNldFN0YXRlKCk7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7Ci0gIH0gZWxzZSBpZiAoY29udGFpbmVyX2xpbWl0XyAmJiBzaXplaSA+IGNvbnRhaW5lcl9saW1pdF8pIHsKLSAgICByZXNldFN0YXRlKCk7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7Ci0gIH0KLSAgc2l6ZSA9ICh1aW50MzJfdClzaXplaTsKLQotICBrZXlUeXBlID0gU1QxLT50dHlwZTsKLSAgdmFsVHlwZSA9IFNUMi0+dHR5cGU7Ci0KLSAgdHNfc3RhY2tfLnB1c2hfYmFjayhTVDEpOwotICBta3Zfc3RhY2tfLnB1c2hfYmFjayh0cnVlKTsKLQotICByZXR1cm4geGZlcjsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRNYXBFbmQoKSB7Ci0gIHRzX3N0YWNrXy5wb3BfYmFjaygpOwotICBta3Zfc3RhY2tfLnBvcF9iYWNrKCk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgY2hlY2tUVHlwZShUX0xJU1QpOwotCi0gIHVpbnQzMl90IHhmZXIgPSAwOwotICBpbnQzMl90IHNpemVpOwotICB4ZmVyICs9IHN1YlJlYWRJMzIoc2l6ZWkpOwotICBpZiAoc2l6ZWkgPCAwKSB7Ci0gICAgcmVzZXRTdGF0ZSgpOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5FR0FUSVZFX1NJWkUpOwotICB9IGVsc2UgaWYgKGNvbnRhaW5lcl9saW1pdF8gJiYgc2l6ZWkgPiBjb250YWluZXJfbGltaXRfKSB7Ci0gICAgcmVzZXRTdGF0ZSgpOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwotICB9Ci0gIHNpemUgPSAodWludDMyX3Qpc2l6ZWk7Ci0KLSAgZWxlbVR5cGUgPSBTVDEtPnR0eXBlOwotCi0gIHRzX3N0YWNrXy5wdXNoX2JhY2soU1QxKTsKLQotICByZXR1cm4geGZlcjsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRMaXN0RW5kKCkgewotICB0c19zdGFja18ucG9wX2JhY2soKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgY2hlY2tUVHlwZShUX1NFVCk7Ci0KLSAgdWludDMyX3QgeGZlciA9IDA7Ci0gIGludDMyX3Qgc2l6ZWk7Ci0gIHhmZXIgKz0gc3ViUmVhZEkzMihzaXplaSk7Ci0gIGlmIChzaXplaSA8IDApIHsKLSAgICByZXNldFN0YXRlKCk7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7Ci0gIH0gZWxzZSBpZiAoY29udGFpbmVyX2xpbWl0XyAmJiBzaXplaSA+IGNvbnRhaW5lcl9saW1pdF8pIHsKLSAgICByZXNldFN0YXRlKCk7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7Ci0gIH0KLSAgc2l6ZSA9ICh1aW50MzJfdClzaXplaTsKLQotICBlbGVtVHlwZSA9IFNUMS0+dHR5cGU7Ci0KLSAgdHNfc3RhY2tfLnB1c2hfYmFjayhTVDEpOwotCi0gIHJldHVybiB4ZmVyOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZFNldEVuZCgpIHsKLSAgdHNfc3RhY2tfLnBvcF9iYWNrKCk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRCb29sKGJvb2wmIHZhbHVlKSB7Ci0gIGNoZWNrVFR5cGUoVF9CT09MKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiBUQmluYXJ5UHJvdG9jb2w6OnJlYWRCb29sKHZhbHVlKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRCeXRlKGludDhfdCYgYnl0ZSkgewotICBjaGVja1RUeXBlKFRfQllURSk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gVEJpbmFyeVByb3RvY29sOjpyZWFkQnl0ZShieXRlKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRJMTYoaW50MTZfdCYgaTE2KSB7Ci0gIGNoZWNrVFR5cGUoVF9JMTYpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgdWludDY0X3QgdTY0OwotICB1aW50MzJfdCBydiA9IHZscVJlYWQodTY0KTsKLSAgaW50NjRfdCB2YWwgPSAoaW50NjRfdCl1NjQ7Ci0gIGlmIChVTkxJS0VMWSh2YWwgPiBJTlQxNl9NQVggfHwgdmFsIDwgSU5UMTZfTUlOKSkgewotICAgIHJlc2V0U3RhdGUoKTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpMTYgb3V0IG9mIHJhbmdlLiIpOwotICB9Ci0gIGkxNiA9IChpbnQxNl90KXZhbDsKLSAgcmV0dXJuIHJ2OwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZEkzMihpbnQzMl90JiBpMzIpIHsKLSAgY2hlY2tUVHlwZShUX0kzMik7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICB1aW50NjRfdCB1NjQ7Ci0gIHVpbnQzMl90IHJ2ID0gdmxxUmVhZCh1NjQpOwotICBpbnQ2NF90IHZhbCA9IChpbnQ2NF90KXU2NDsKLSAgaWYgKFVOTElLRUxZKHZhbCA+IElOVDMyX01BWCB8fCB2YWwgPCBJTlQzMl9NSU4pKSB7Ci0gICAgcmVzZXRTdGF0ZSgpOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkzMiBvdXQgb2YgcmFuZ2UuIik7Ci0gIH0KLSAgaTMyID0gKGludDMyX3QpdmFsOwotICByZXR1cm4gcnY7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkSTY0KGludDY0X3QmIGk2NCkgewotICBjaGVja1RUeXBlKFRfSTY0KTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHVpbnQ2NF90IHU2NDsKLSAgdWludDMyX3QgcnYgPSB2bHFSZWFkKHU2NCk7Ci0gIGludDY0X3QgdmFsID0gKGludDY0X3QpdTY0OwotICBpZiAoVU5MSUtFTFkodmFsID4gSU5UNjRfTUFYIHx8IHZhbCA8IElOVDY0X01JTikpIHsKLSAgICByZXNldFN0YXRlKCk7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0IG91dCBvZiByYW5nZS4iKTsKLSAgfQotICBpNjQgPSAoaW50NjRfdCl2YWw7Ci0gIHJldHVybiBydjsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWREb3VibGUoZG91YmxlJiBkdWIpIHsKLSAgY2hlY2tUVHlwZShUX0RPVUJMRSk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gVEJpbmFyeVByb3RvY29sOjpyZWFkRG91YmxlKGR1Yik7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgY2hlY2tUVHlwZShUX1NUUklORyk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gc3ViUmVhZFN0cmluZyhzdHIpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiBURGVuc2VQcm90b2NvbDo6cmVhZFN0cmluZyhzdHIpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6c3ViUmVhZEkzMihpbnQzMl90JiBpMzIpIHsKLSAgdWludDY0X3QgdTY0OwotICB1aW50MzJfdCBydiA9IHZscVJlYWQodTY0KTsKLSAgaW50NjRfdCB2YWwgPSAoaW50NjRfdCl1NjQ7Ci0gIGlmIChVTkxJS0VMWSh2YWwgPiBJTlQzMl9NQVggfHwgdmFsIDwgSU5UMzJfTUlOKSkgewotICAgIHJlc2V0U3RhdGUoKTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpMzIgb3V0IG9mIHJhbmdlLiIpOwotICB9Ci0gIGkzMiA9IChpbnQzMl90KXZhbDsKLSAgcmV0dXJuIHJ2OwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6c3ViUmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHVpbnQzMl90IHhmZXI7Ci0gIGludDMyX3Qgc2l6ZTsKLSAgeGZlciA9IHN1YlJlYWRJMzIoc2l6ZSk7Ci0gIHJldHVybiB4ZmVyICsgcmVhZFN0cmluZ0JvZHkoc3RyLCBzaXplKTsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVERlbnNlUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1REZW5zZVByb3RvY29sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzOGVkODkuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVERlbnNlUHJvdG9jb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UREVOU0VQUk9UT0NPTF9IXwotI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RERU5TRVBST1RPQ09MX0hfIDEKLQotI2luY2x1ZGUgIlRCaW5hcnlQcm90b2NvbC5oIgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm90b2NvbCB7Ci0KLS8qKgotICogISEhV0FSTklORyEhIQotICogVGhpcyBjbGFzcyBpcyBzdGlsbCBoaWdobHkgZXhwZXJpbWVudGFsLiAgSW5jb21wYXRpYmxlIGNoYW5nZXMKLSAqIFdJTEwgYmUgbWFkZSB0byBpdCB3aXRob3V0IG5vdGljZS4gIERPIE5PVCBVU0UgSVQgWUVUIHVubGVzcwotICogeW91IGFyZSBjb29yZGluYXRpbmcgeW91ciB0ZXN0aW5nIHdpdGggdGhlIGF1dGhvci4KLSAqCi0gKiBUaGUgZGVuc2UgcHJvdG9jb2wgaXMgZGVzaWduZWQgdG8gdXNlIGFzIGxpdHRsZSBzcGFjZSBhcyBwb3NzaWJsZS4KLSAqCi0gKiBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGRlbnNlIHByb3RvY29sIGluc3RhbmNlcy4gIFN0YW5kYWxvbmUgaW5zdGFuY2VzCi0gKiBhcmUgbm90IHVzZWQgZm9yIFJQQyBhbmQganVzdCBlbmNvZGVkIGFuZCBkZWNvZGUgc3RydWN0dXJlcyBvZgotICogYSBwcmVkZXRlcm1pbmVkIHR5cGUuICBOb24tc3RhbmRhbG9uZSBpbnN0YW5jZXMgYXJlIHVzZWQgZm9yIFJQQy4KLSAqIEN1cnJlbnRseSwgb25seSBzdGFuZGFsb25lIGluc3RhbmNlcyBleGlzdC4KLSAqCi0gKiBUbyB1c2UgYSBzdGFuZGFsb25lIGRlbnNlIHByb3RvY29sIG9iamVjdCwgeW91IG11c3Qgc2V0IHRoZSB0eXBlX3NwZWMKLSAqIHByb3BlcnR5IChlaXRoZXIgaW4gdGhlIGNvbnN0cnVjdG9yLCBvciB3aXRoIHNldFR5cGVTcGVjKSB0byB0aGUgbG9jYWwKLSAqIHJlZmxlY3Rpb24gVHlwZVNwZWMgb2YgdGhlIHN0cnVjdHVyZXMgeW91IHdpbGwgd3JpdGUgdG8gKG9yIHJlYWQgZnJvbSkgdGhlCi0gKiBwcm90b2NvbCBpbnN0YW5jZS4KLSAqCi0gKiBCRVNUIFBSQUNUSUNFUzoKLSAqIC0gTmV2ZXIgdXNlIG9wdGlvbmFsIGZvciBwcmltaXRpdmVzIG9yIGNvbnRhaW5lcnMuCi0gKiAtIE9ubHkgdXNlIG9wdGlvbmFsIGZvciBzdHJ1Y3R1cmVzIGlmIHRoZXkgYXJlIHZlcnkgYmlnIGFuZCB2ZXJ5IHJhcmVseSBzZXQuCi0gKiAtIEFsbCBpbnRlZ2VycyBhcmUgdmFyaWFibGUtbGVuZ3RoLCBzbyB5b3UgY2FuIHVzZSBpNjQgd2l0aG91dCBibG9hdGluZy4KLSAqIC0gTkVWRVIgRVZFUiBjaGFuZ2UgdGhlIHN0cnVjdCBkZWZpbml0aW9ucyBJTiBBTlkgV0FZIHdpdGhvdXQgZWl0aGVyCi0gKiAgIGNoYW5naW5nIHlvdXIgY2FjaGUga2V5cyBvciB0YWxraW5nIHRvIGRyZWlzcy4KLSAqCi0gKiBUT0RPKGRyZWlzcyk6IE5ldyBjbGFzcyB3cml0ZSB3aXRoIG9sZCBtZXRhLgotICoKLSAqIFdlIG92ZXJyaWRlIGFsbCBvZiBUQmluYXJ5UHJvdG9jb2wncyBtZXRob2RzLgotICogV2UgaW5oZXJpdCBzbyB0aGF0IHdlIGNhbiBjYW4gZXhwbGljaXRseSBjYWxsIFRCUHMncyBwcmltaXRpdmUtd3JpdGluZwotICogbWV0aG9kcyB3aXRoaW4gb3VyIHZlcnNpb25zLgotICoKLSAqLwotY2xhc3MgVERlbnNlUHJvdG9jb2wKLSAgOiBwdWJsaWMgVFZpcnR1YWxQcm90b2NvbDxURGVuc2VQcm90b2NvbCwgVEJpbmFyeVByb3RvY29sPiB7Ci0gcHJvdGVjdGVkOgotICBzdGF0aWMgY29uc3QgaW50MzJfdCBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwOwotICAvLyBWRVJTSU9OXzEgKDB4ODAwMTAwMDApICBpcyB0YWtlbiBieSBUQmluYXJ5UHJvdG9jb2wuCi0gIHN0YXRpYyBjb25zdCBpbnQzMl90IFZFUlNJT05fMiA9IDB4ODAwMjAwMDA7Ci0KLSBwdWJsaWM6Ci0gIHR5cGVkZWYgYXBhY2hlOjp0aHJpZnQ6OnJlZmxlY3Rpb246OmxvY2FsOjpUeXBlU3BlYyBUeXBlU3BlYzsKLSAgc3RhdGljIGNvbnN0IGludCBGUF9QUkVGSVhfTEVOOwotCi0gIC8qKgotICAgKiBAcGFyYW0gdHJhbiAgICAgICBUaGUgdHJhbnNwb3J0IHRvIHVzZS4KLSAgICogQHBhcmFtIHR5cGVfc3BlYyAgVGhlIFR5cGVTcGVjIG9mIHRoZSBzdHJ1Y3R1cmVzIHVzaW5nIHRoaXMgcHJvdG9jb2wuCi0gICAqLwotICBURGVuc2VQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucywKLSAgICAgICAgICAgICAgICAgVHlwZVNwZWMqIHR5cGVfc3BlYyA9IE5VTEwpIDoKLSAgICBUVmlydHVhbFByb3RvY29sPFREZW5zZVByb3RvY29sLCBUQmluYXJ5UHJvdG9jb2w+KHRyYW5zKSwKLSAgICB0eXBlX3NwZWNfKHR5cGVfc3BlYyksCi0gICAgc3RhbmRhbG9uZV8odHJ1ZSkKLSAge30KLQotICB2b2lkIHNldFR5cGVTcGVjKFR5cGVTcGVjKiB0eXBlX3NwZWMpIHsKLSAgICB0eXBlX3NwZWNfID0gdHlwZV9zcGVjOwotICB9Ci0gIFR5cGVTcGVjKiBnZXRUeXBlU3BlYygpIHsKLSAgICByZXR1cm4gdHlwZV9zcGVjXzsKLSAgfQotCi0KLSAgLyoKLSAgICogV3JpdGluZyBmdW5jdGlvbnMuCi0gICAqLwotCi0gIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpOwotCi0gIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpOwotCi0KLSAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKTsKLQotICB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKTsKLQotICB1aW50MzJfdCB3cml0ZUZpZWxkRW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3AoKTsKLQotICB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB1aW50MzJfdCB3cml0ZU1hcEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB1aW50MzJfdCB3cml0ZUxpc3RFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB1aW50MzJfdCB3cml0ZVNldEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKTsKLQotICB1aW50MzJfdCB3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpOwotCi0gIHVpbnQzMl90IHdyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KTsKLQotICB1aW50MzJfdCB3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMik7Ci0KLSAgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpOwotCi0gIHVpbnQzMl90IHdyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpOwotCi0gIHVpbnQzMl90IHdyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0KLSAgLyoKLSAgICogSGVscGVyIHdyaXRpbmcgZnVuY3Rpb25zIChkb24ndCBkbyBzdGF0ZSB0cmFuc2l0aW9ucykuCi0gICAqLwotICBpbmxpbmUgdWludDMyX3Qgc3ViV3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpOwotCi0gIGlubGluZSB1aW50MzJfdCBzdWJXcml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKLQotICB1aW50MzJfdCBzdWJXcml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgewotICAgIHJldHVybiBUQmluYXJ5UHJvdG9jb2w6OndyaXRlQm9vbCh2YWx1ZSk7Ci0gIH0KLQotCi0gIC8qCi0gICAqIFJlYWRpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCk7Ci0KLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmQoKTsKLQotICB1aW50MzJfdCByZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpOwotCi0gIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKTsKLQotICB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCk7Ci0KLSAgdWludDMyX3QgcmVhZEZpZWxkRW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7Ci0KLSAgdWludDMyX3QgcmVhZE1hcEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKTsKLQotICB1aW50MzJfdCByZWFkTGlzdEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7Ci0KLSAgdWludDMyX3QgcmVhZFNldEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKTsKLSAgLy8gUHJvdmlkZSB0aGUgZGVmYXVsdCByZWFkQm9vbCgpIGltcGxlbWVudGF0aW9uIGZvciBzdGQ6OnZlY3Rvcjxib29sPgotICB1c2luZyBUVmlydHVhbFByb3RvY29sPFREZW5zZVByb3RvY29sLCBUQmluYXJ5UHJvdG9jb2w+OjpyZWFkQm9vbDsKLQotICB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpOwotCi0gIHVpbnQzMl90IHJlYWRJMTYoaW50MTZfdCYgaTE2KTsKLQotICB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMik7Ci0KLSAgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpOwotCi0gIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpOwotCi0gIHVpbnQzMl90IHJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKTsKLQotICAvKgotICAgKiBIZWxwZXIgcmVhZGluZyBmdW5jdGlvbnMgKGRvbid0IGRvIHN0YXRlIHRyYW5zaXRpb25zKS4KLSAgICovCi0gIGlubGluZSB1aW50MzJfdCBzdWJSZWFkSTMyKGludDMyX3QmIGkzMik7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHN1YlJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgdWludDMyX3Qgc3ViUmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKLSAgICByZXR1cm4gVEJpbmFyeVByb3RvY29sOjpyZWFkQm9vbCh2YWx1ZSk7Ci0gIH0KLQotCi0gcHJpdmF0ZToKLQotICAvLyBJbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMsIGRvY3VtZW50ZWQgaW4gdGhlIC5jcHAuCi0gIGlubGluZSB2b2lkIGNoZWNrVFR5cGUoY29uc3QgVFR5cGUgdHR5cGUpOwotICBpbmxpbmUgdm9pZCBzdGF0ZVRyYW5zaXRpb24oKTsKLQotICAvLyBSZWFkIGFuZCB3cml0ZSB2YXJpYWJsZS1sZW5ndGggaW50ZWdlcnMuCi0gIC8vIFVzZXMgdGhlIHNhbWUgdGVjaG5pcXVlIGFzIHRoZSBNSURJIGZpbGUgZm9ybWF0LgotICBpbmxpbmUgdWludDMyX3QgdmxxUmVhZCh1aW50NjRfdCYgdmxxKTsKLSAgaW5saW5lIHVpbnQzMl90IHZscVdyaXRlKHVpbnQ2NF90IHZscSk7Ci0KLSAgLy8gQ2FsbGVkIGJlZm9yZSB0aHJvd2luZyBhbiBleGNlcHRpb24gdG8gbWFrZSB0aGUgb2JqZWN0IHJldXNhYmxlLgotICB2b2lkIHJlc2V0U3RhdGUoKSB7Ci0gICAgdHNfc3RhY2tfLmNsZWFyKCk7Ci0gICAgaWR4X3N0YWNrXy5jbGVhcigpOwotICAgIG1rdl9zdGFja18uY2xlYXIoKTsKLSAgfQotCi0gIC8vIFR5cGVTcGVjIG9mIHRoZSB0b3AtbGV2ZWwgc3RydWN0dXJlIHRvIHdyaXRlLAotICAvLyBmb3Igc3RhbmRhbG9uZSBwcm90b2NvbCBvYmplY3RzLgotICBUeXBlU3BlYyogdHlwZV9zcGVjXzsKLQotICBzdGQ6OnZlY3RvcjxUeXBlU3BlYyo+IHRzX3N0YWNrXzsgICAvLyBUeXBlU3BlYyBzdGFjay4KLSAgc3RkOjp2ZWN0b3I8aW50PiAgICAgICBpZHhfc3RhY2tfOyAgLy8gSW5EZVggc3RhY2suCi0gIHN0ZDo6dmVjdG9yPGJvb2w+ICAgICAgbWt2X3N0YWNrXzsgIC8vIE1hcCBLZXkvVmx1ZSBzdGFjay4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJ1ZSA9IGtleSwgRmFsc2UgPSB2YWx1ZS4KLQotICAvLyBUcnVlIGlmZiB0aGlzIGlzIGEgc3RhbmRhbG9uZSBpbnN0YW5jZSAobm8gUlBDKS4KLSAgYm9vbCBzdGFuZGFsb25lXzsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UREVOU0VQUk9UT0NPTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy9wcm90b2NvbC9USlNPTlByb3RvY29sLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAzOGRmNC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm90b2NvbC9USlNPTlByb3RvY29sLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiVEpTT05Qcm90b2NvbC5oIgotCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+Ci0jaW5jbHVkZSAiVEJhc2U2NFV0aWxzLmgiCi0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KLQotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotCi0vLyBTdGF0aWMgZGF0YQotCi1zdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTk9iamVjdFN0YXJ0ID0gJ3snOwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05PYmplY3RFbmQgPSAnfSc7Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkFycmF5U3RhcnQgPSAnWyc7Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkFycmF5RW5kID0gJ10nOwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05OZXdsaW5lID0gJ1xuJzsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OUGFpclNlcGFyYXRvciA9ICc6JzsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtKU09ORWxlbVNlcGFyYXRvciA9ICcsJzsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OQmFja3NsYXNoID0gJ1xcJzsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OU3RyaW5nRGVsaW1pdGVyID0gJyInOwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05aZXJvQ2hhciA9ICcwJzsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtKU09ORXNjYXBlQ2hhciA9ICd1JzsKLQotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtKU09ORXNjYXBlUHJlZml4KCJcXHUwMCIpOwotCi1zdGF0aWMgY29uc3QgdWludDMyX3Qga1RocmlmdFZlcnNpb24xID0gMTsKLQotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUaHJpZnROYW4oIk5hTiIpOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUaHJpZnRJbmZpbml0eSgiSW5maW5pdHkiKTsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVGhyaWZ0TmVnYXRpdmVJbmZpbml0eSgiLUluZmluaXR5Iik7Ci0KLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVCb29sKCJ0ZiIpOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZUJ5dGUoImk4Iik7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lSTE2KCJpMTYiKTsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVJMzIoImkzMiIpOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZUk2NCgiaTY0Iik7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lRG91YmxlKCJkYmwiKTsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVTdHJ1Y3QoInJlYyIpOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZVN0cmluZygic3RyIik7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lTWFwKCJtYXAiKTsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVMaXN0KCJsc3QiKTsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVTZXQoInNldCIpOwotCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdldFR5cGVOYW1lRm9yVHlwZUlEKFRUeXBlIHR5cGVJRCkgewotICBzd2l0Y2ggKHR5cGVJRCkgewotICBjYXNlIFRfQk9PTDoKLSAgICByZXR1cm4ga1R5cGVOYW1lQm9vbDsKLSAgY2FzZSBUX0JZVEU6Ci0gICAgcmV0dXJuIGtUeXBlTmFtZUJ5dGU7Ci0gIGNhc2UgVF9JMTY6Ci0gICAgcmV0dXJuIGtUeXBlTmFtZUkxNjsKLSAgY2FzZSBUX0kzMjoKLSAgICByZXR1cm4ga1R5cGVOYW1lSTMyOwotICBjYXNlIFRfSTY0OgotICAgIHJldHVybiBrVHlwZU5hbWVJNjQ7Ci0gIGNhc2UgVF9ET1VCTEU6Ci0gICAgcmV0dXJuIGtUeXBlTmFtZURvdWJsZTsKLSAgY2FzZSBUX1NUUklORzoKLSAgICByZXR1cm4ga1R5cGVOYW1lU3RyaW5nOwotICBjYXNlIFRfU1RSVUNUOgotICAgIHJldHVybiBrVHlwZU5hbWVTdHJ1Y3Q7Ci0gIGNhc2UgVF9NQVA6Ci0gICAgcmV0dXJuIGtUeXBlTmFtZU1hcDsKLSAgY2FzZSBUX1NFVDoKLSAgICByZXR1cm4ga1R5cGVOYW1lU2V0OwotICBjYXNlIFRfTElTVDoKLSAgICByZXR1cm4ga1R5cGVOYW1lTGlzdDsKLSAgZGVmYXVsdDoKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnJlY29nbml6ZWQgdHlwZSIpOwotICB9Ci19Ci0KLXN0YXRpYyBUVHlwZSBnZXRUeXBlSURGb3JUeXBlTmFtZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgewotICBUVHlwZSByZXN1bHQgPSBUX1NUT1A7IC8vIFNlbnRpbmVsIHZhbHVlCi0gIGlmIChuYW1lLmxlbmd0aCgpID4gMSkgewotICAgIHN3aXRjaCAobmFtZVswXSkgewotICAgIGNhc2UgJ2QnOgotICAgICAgcmVzdWx0ID0gVF9ET1VCTEU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdpJzoKLSAgICAgIHN3aXRjaCAobmFtZVsxXSkgewotICAgICAgY2FzZSAnOCc6Ci0gICAgICAgIHJlc3VsdCA9IFRfQllURTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICcxJzoKLSAgICAgICAgcmVzdWx0ID0gVF9JMTY7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnMyc6Ci0gICAgICAgIHJlc3VsdCA9IFRfSTMyOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJzYnOgotICAgICAgICByZXN1bHQgPSBUX0k2NDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdsJzoKLSAgICAgIHJlc3VsdCA9IFRfTElTVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ20nOgotICAgICAgcmVzdWx0ID0gVF9NQVA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdyJzoKLSAgICAgIHJlc3VsdCA9IFRfU1RSVUNUOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncyc6Ci0gICAgICBpZiAobmFtZVsxXSA9PSAndCcpIHsKLSAgICAgICAgcmVzdWx0ID0gVF9TVFJJTkc7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChuYW1lWzFdID09ICdlJykgewotICAgICAgICByZXN1bHQgPSBUX1NFVDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3QnOgotICAgICAgcmVzdWx0ID0gVF9CT09MOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGlmIChyZXN1bHQgPT0gVF9TVE9QKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIHR5cGUiKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8vIFRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBoYW5kbGluZyBmb3IgdGhlIGZpcnN0IDB4MzAgY2hhcmFjdGVycwotLy8gIDAgOiBlc2NhcGUgdXNpbmcgIlx1MDB4eCIgbm90YXRpb24KLS8vICAxIDoganVzdCBvdXRwdXQgaW5kZXgKLS8vIDxvdGhlcj4gOiBlc2NhcGUgdXNpbmcgIlw8b3RoZXI+IiBub3RhdGlvbgotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05DaGFyVGFibGVbMHgzMF0gPSB7Ci0vLyAgMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAgIEEgICBCICAgQyAgIEQgICBFICAgRgotICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCdiJywndCcsJ24nLCAgMCwnZicsJ3InLCAgMCwgIDAsIC8vIDAKLSAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvLyAxCi0gICAgMSwgIDEsJyInLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgLy8gMgotfTsKLQotCi0vLyBUaGlzIHN0cmluZydzIGNoYXJhY3RlcnMgbXVzdCBtYXRjaCB1cCB3aXRoIHRoZSBlbGVtZW50cyBpbiBrRXNjYXBlQ2hhclZhbHMuCi0vLyBJIGRvbid0IGhhdmUgJy8nIG9uIHRoaXMgbGlzdCBldmVuIHRob3VnaCBpdCBhcHBlYXJzIG9uIHd3dy5qc29uLm9yZyAtLQotLy8gaXQgaXMgbm90IGluIHRoZSBSRkMKLWNvbnN0IHN0YXRpYyBzdGQ6OnN0cmluZyBrRXNjYXBlQ2hhcnMoIlwiXFxiZm5ydCIpOwotCi0vLyBUaGUgZWxlbWVudHMgb2YgdGhpcyBhcnJheSBtdXN0IG1hdGNoIHVwIHdpdGggdGhlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgaW4KLS8vIGtFc2NhcGVDaGFycwotY29uc3Qgc3RhdGljIHVpbnQ4X3Qga0VzY2FwZUNoYXJWYWxzWzddID0gewotICAnIicsICdcXCcsICdcYicsICdcZicsICdcbicsICdccicsICdcdCcsCi19OwotCi0KLS8vIFN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCi0KLS8vIFJlYWQgMSBjaGFyYWN0ZXIgZnJvbSB0aGUgdHJhbnNwb3J0IHRyYW5zIGFuZCB2ZXJpZnkgdGhhdCBpdCBpcyB0aGUKLS8vIGV4cGVjdGVkIGNoYXJhY3RlciBjaC4KLS8vIFRocm93IGEgcHJvdG9jb2wgZXhjZXB0aW9uIGlmIGl0IGlzIG5vdC4KLXN0YXRpYyB1aW50MzJfdCByZWFkU3ludGF4Q2hhcihUSlNPTlByb3RvY29sOjpMb29rYWhlYWRSZWFkZXIgJnJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNoKSB7Ci0gIHVpbnQ4X3QgY2gyID0gcmVhZGVyLnJlYWQoKTsKLSAgaWYgKGNoMiAhPSBjaCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIFwnIiArIHN0ZDo6c3RyaW5nKChjaGFyICopJmNoLCAxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcJzsgZ290IFwnIiArIHN0ZDo6c3RyaW5nKChjaGFyICopJmNoMiwgMSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCcuIik7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8vIFJldHVybiB0aGUgaW50ZWdlciB2YWx1ZSBvZiBhIGhleCBjaGFyYWN0ZXIgY2guCi0vLyBUaHJvdyBhIHByb3RvY29sIGV4Y2VwdGlvbiBpZiB0aGUgY2hhcmFjdGVyIGlzIG5vdCBbMC05YS1mXS4KLXN0YXRpYyB1aW50OF90IGhleFZhbCh1aW50OF90IGNoKSB7Ci0gIGlmICgoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKSkgewotICAgIHJldHVybiBjaCAtICcwJzsKLSAgfQotICBlbHNlIGlmICgoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ2YnKSkgewotICAgIHJldHVybiBjaCAtICdhJyArIDEwOwotICB9Ci0gIGVsc2UgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGhleCB2YWwgKFswLTlhLWZdKTsgZ290IFwnIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RkOjpzdHJpbmcoKGNoYXIgKikmY2gsIDEpICsgIlwnLiIpOwotICB9Ci19Ci0KLS8vIFJldHVybiB0aGUgaGV4IGNoYXJhY3RlciByZXByZXNlbnRpbmcgdGhlIGludGVnZXIgdmFsLiBUaGUgdmFsdWUgaXMgbWFza2VkCi0vLyB0byBtYWtlIHN1cmUgaXQgaXMgaW4gdGhlIGNvcnJlY3QgcmFuZ2UuCi1zdGF0aWMgdWludDhfdCBoZXhDaGFyKHVpbnQ4X3QgdmFsKSB7Ci0gIHZhbCAmPSAweDBGOwotICBpZiAodmFsIDwgMTApIHsKLSAgICByZXR1cm4gdmFsICsgJzAnOwotICB9Ci0gIGVsc2UgewotICAgIHJldHVybiB2YWwgLSAxMCArICdhJzsKLSAgfQotfQotCi0vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIGNoIGlzIGluIFstKzAtOS5FZV07IGZhbHNlIG90aGVyd2lzZQotc3RhdGljIGJvb2wgaXNKU09OTnVtZXJpYyh1aW50OF90IGNoKSB7Ci0gIHN3aXRjaCAoY2gpIHsKLSAgY2FzZSAnKyc6Ci0gIGNhc2UgJy0nOgotICBjYXNlICcuJzoKLSAgY2FzZSAnMCc6Ci0gIGNhc2UgJzEnOgotICBjYXNlICcyJzoKLSAgY2FzZSAnMyc6Ci0gIGNhc2UgJzQnOgotICBjYXNlICc1JzoKLSAgY2FzZSAnNic6Ci0gIGNhc2UgJzcnOgotICBjYXNlICc4JzoKLSAgY2FzZSAnOSc6Ci0gIGNhc2UgJ0UnOgotICBjYXNlICdlJzoKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyoqCi0gKiBDbGFzcyB0byBzZXJ2ZSBhcyBiYXNlIEpTT04gY29udGV4dCBhbmQgYXMgYmFzZSBjbGFzcyBmb3Igb3RoZXIgY29udGV4dAotICogaW1wbGVtZW50YXRpb25zCi0gKi8KLWNsYXNzIFRKU09OQ29udGV4dCB7Ci0KLSBwdWJsaWM6Ci0KLSAgVEpTT05Db250ZXh0KCkge307Ci0KLSAgdmlydHVhbCB+VEpTT05Db250ZXh0KCkge307Ci0KLSAgLyoqCi0gICAqIFdyaXRlIGNvbnRleHQgZGF0YSB0byB0aGUgdHJhbnNwb3J0LiBEZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuCi0gICAqLwotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlKFRUcmFuc3BvcnQgJnRyYW5zKSB7Ci0gICAgKHZvaWQpIHRyYW5zOwotICAgIHJldHVybiAwOwotICB9OwotCi0gIC8qKgotICAgKiBSZWFkIGNvbnRleHQgZGF0YSBmcm9tIHRoZSB0cmFuc3BvcnQuIERlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4KLSAgICovCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZChUSlNPTlByb3RvY29sOjpMb29rYWhlYWRSZWFkZXIgJnJlYWRlcikgewotICAgICh2b2lkKSByZWFkZXI7Ci0gICAgcmV0dXJuIDA7Ci0gIH07Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIG51bWJlcnMgbmVlZCB0byBiZSBlc2NhcGVkIGFzIHN0cmluZ3MgaW4gdGhpcyBjb250ZXh0LgotICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJldHVybiBmYWxzZS4KLSAgICovCi0gIHZpcnR1YWwgYm9vbCBlc2NhcGVOdW0oKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19OwotCi0vLyBDb250ZXh0IGNsYXNzIGZvciBvYmplY3QgbWVtYmVyIGtleS12YWx1ZSBwYWlycwotY2xhc3MgSlNPTlBhaXJDb250ZXh0IDogcHVibGljIFRKU09OQ29udGV4dCB7Ci0KLXB1YmxpYzoKLQotICBKU09OUGFpckNvbnRleHQoKSA6Ci0gICAgZmlyc3RfKHRydWUpLAotICAgIGNvbG9uXyh0cnVlKSB7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZShUVHJhbnNwb3J0ICZ0cmFucykgewotICAgIGlmIChmaXJzdF8pIHsKLSAgICAgIGZpcnN0XyA9IGZhbHNlOwotICAgICAgY29sb25fID0gdHJ1ZTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHRyYW5zLndyaXRlKGNvbG9uXyA/ICZrSlNPTlBhaXJTZXBhcmF0b3IgOiAma0pTT05FbGVtU2VwYXJhdG9yLCAxKTsKLSAgICAgIGNvbG9uXyA9ICFjb2xvbl87Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIH0KLQotICB1aW50MzJfdCByZWFkKFRKU09OUHJvdG9jb2w6Okxvb2thaGVhZFJlYWRlciAmcmVhZGVyKSB7Ci0gICAgaWYgKGZpcnN0XykgewotICAgICAgZmlyc3RfID0gZmFsc2U7Ci0gICAgICBjb2xvbl8gPSB0cnVlOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgdWludDhfdCBjaCA9IChjb2xvbl8gPyBrSlNPTlBhaXJTZXBhcmF0b3IgOiBrSlNPTkVsZW1TZXBhcmF0b3IpOwotICAgICAgY29sb25fID0gIWNvbG9uXzsKLSAgICAgIHJldHVybiByZWFkU3ludGF4Q2hhcihyZWFkZXIsIGNoKTsKLSAgICB9Ci0gIH0KLQotICAvLyBOdW1iZXJzIG11c3QgYmUgdHVybmVkIGludG8gc3RyaW5ncyBpZiB0aGV5IGFyZSB0aGUga2V5IHBhcnQgb2YgYSBwYWlyCi0gIHZpcnR1YWwgYm9vbCBlc2NhcGVOdW0oKSB7Ci0gICAgcmV0dXJuIGNvbG9uXzsKLSAgfQotCi0gIHByaXZhdGU6Ci0KLSAgICBib29sIGZpcnN0XzsKLSAgICBib29sIGNvbG9uXzsKLX07Ci0KLS8vIENvbnRleHQgY2xhc3MgZm9yIGxpc3RzCi1jbGFzcyBKU09OTGlzdENvbnRleHQgOiBwdWJsaWMgVEpTT05Db250ZXh0IHsKLQotcHVibGljOgotCi0gIEpTT05MaXN0Q29udGV4dCgpIDoKLSAgICBmaXJzdF8odHJ1ZSkgewotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGUoVFRyYW5zcG9ydCAmdHJhbnMpIHsKLSAgICBpZiAoZmlyc3RfKSB7Ci0gICAgICBmaXJzdF8gPSBmYWxzZTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHRyYW5zLndyaXRlKCZrSlNPTkVsZW1TZXBhcmF0b3IsIDEpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICB9Ci0KLSAgdWludDMyX3QgcmVhZChUSlNPTlByb3RvY29sOjpMb29rYWhlYWRSZWFkZXIgJnJlYWRlcikgewotICAgIGlmIChmaXJzdF8pIHsKLSAgICAgIGZpcnN0XyA9IGZhbHNlOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgcmV0dXJuIHJlYWRTeW50YXhDaGFyKHJlYWRlciwga0pTT05FbGVtU2VwYXJhdG9yKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlOgotICAgIGJvb2wgZmlyc3RfOwotfTsKLQotCi1USlNPTlByb3RvY29sOjpUSlNPTlByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykgOgotICBUVmlydHVhbFByb3RvY29sPFRKU09OUHJvdG9jb2w+KHB0cmFucyksCi0gIHRyYW5zXyhwdHJhbnMuZ2V0KCkpLAotICBjb250ZXh0XyhuZXcgVEpTT05Db250ZXh0KCkpLAotICByZWFkZXJfKCpwdHJhbnMpIHsKLX0KLQotVEpTT05Qcm90b2NvbDo6flRKU09OUHJvdG9jb2woKSB7fQotCi12b2lkIFRKU09OUHJvdG9jb2w6OnB1c2hDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gYykgewotICBjb250ZXh0c18ucHVzaChjb250ZXh0Xyk7Ci0gIGNvbnRleHRfID0gYzsKLX0KLQotdm9pZCBUSlNPTlByb3RvY29sOjpwb3BDb250ZXh0KCkgewotICBjb250ZXh0XyA9IGNvbnRleHRzXy50b3AoKTsKLSAgY29udGV4dHNfLnBvcCgpOwotfQotCi0vLyBXcml0ZSB0aGUgY2hhcmFjdGVyIGNoIGFzIGEgSlNPTiBlc2NhcGUgc2VxdWVuY2UgKCJcdTAweHgiKQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09ORXNjYXBlQ2hhcih1aW50OF90IGNoKSB7Ci0gIHRyYW5zXy0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QgKilrSlNPTkVzY2FwZVByZWZpeC5jX3N0cigpLAotICAgICAgICAgICAgICAgIGtKU09ORXNjYXBlUHJlZml4Lmxlbmd0aCgpKTsKLSAgdWludDhfdCBvdXRDaCA9IGhleENoYXIoY2ggPj4gNCk7Ci0gIHRyYW5zXy0+d3JpdGUoJm91dENoLCAxKTsKLSAgb3V0Q2ggPSBoZXhDaGFyKGNoKTsKLSAgdHJhbnNfLT53cml0ZSgmb3V0Q2gsIDEpOwotICByZXR1cm4gNjsKLX0KLQotLy8gV3JpdGUgdGhlIGNoYXJhY3RlciBjaCBhcyBwYXJ0IG9mIGEgSlNPTiBzdHJpbmcsIGVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlLgotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OQ2hhcih1aW50OF90IGNoKSB7Ci0gIGlmIChjaCA+PSAweDMwKSB7Ci0gICAgaWYgKGNoID09IGtKU09OQmFja3NsYXNoKSB7IC8vIE9ubHkgc3BlY2lhbCBjaGFyYWN0ZXIgPj0gMHgzMCBpcyAnXCcKLSAgICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OQmFja3NsYXNoLCAxKTsKLSAgICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OQmFja3NsYXNoLCAxKTsKLSAgICAgIHJldHVybiAyOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHRyYW5zXy0+d3JpdGUoJmNoLCAxKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICB1aW50OF90IG91dENoID0ga0pTT05DaGFyVGFibGVbY2hdOwotICAgIC8vIENoZWNrIGlmIHJlZ3VsYXIgY2hhcmFjdGVyLCBiYWNrc2xhc2ggZXNjYXBlZCwgb3IgSlNPTiBlc2NhcGVkCi0gICAgaWYgKG91dENoID09IDEpIHsKLSAgICAgIHRyYW5zXy0+d3JpdGUoJmNoLCAxKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBlbHNlIGlmIChvdXRDaCA+IDEpIHsKLSAgICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OQmFja3NsYXNoLCAxKTsKLSAgICAgIHRyYW5zXy0+d3JpdGUoJm91dENoLCAxKTsKLSAgICAgIHJldHVybiAyOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHJldHVybiB3cml0ZUpTT05Fc2NhcGVDaGFyKGNoKTsKLSAgICB9Ci0gIH0KLX0KLQotLy8gV3JpdGUgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5nIHN0ciBhcyBhIEpTT04gc3RyaW5nLCBlc2NhcGluZwotLy8gY2hhcmFjdGVycyBhcyBhcHByb3ByaWF0ZS4KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTlN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmc3RyKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT53cml0ZSgqdHJhbnNfKTsKLSAgcmVzdWx0ICs9IDI7IC8vIEZvciBxdW90ZXMKLSAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOwotICBzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXRlcihzdHIuYmVnaW4oKSk7Ci0gIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBlbmQoc3RyLmVuZCgpKTsKLSAgd2hpbGUgKGl0ZXIgIT0gZW5kKSB7Ci0gICAgcmVzdWx0ICs9IHdyaXRlSlNPTkNoYXIoKml0ZXIrKyk7Ci0gIH0KLSAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBXcml0ZSBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcgYXMgSlNPTiBzdHJpbmcsIGJhc2U2NC1lbmNvZGluZwotLy8gdGhlIHN0cmluZydzIGNvbnRlbnRzLCBhbmQgZXNjYXBpbmcgYXMgYXBwcm9wcmlhdGUKLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkJhc2U2NChjb25zdCBzdGQ6OnN0cmluZyAmc3RyKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT53cml0ZSgqdHJhbnNfKTsKLSAgcmVzdWx0ICs9IDI7IC8vIEZvciBxdW90ZXMKLSAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOwotICB1aW50OF90IGJbNF07Ci0gIGNvbnN0IHVpbnQ4X3QgKmJ5dGVzID0gKGNvbnN0IHVpbnQ4X3QgKilzdHIuY19zdHIoKTsKLSAgdWludDMyX3QgbGVuID0gc3RyLmxlbmd0aCgpOwotICB3aGlsZSAobGVuID49IDMpIHsKLSAgICAvLyBFbmNvZGUgMyBieXRlcyBhdCBhIHRpbWUKLSAgICBiYXNlNjRfZW5jb2RlKGJ5dGVzLCAzLCBiKTsKLSAgICB0cmFuc18tPndyaXRlKGIsIDQpOwotICAgIHJlc3VsdCArPSA0OwotICAgIGJ5dGVzICs9IDM7Ci0gICAgbGVuIC09MzsKLSAgfQotICBpZiAobGVuKSB7IC8vIEhhbmRsZSByZW1haW5kZXIKLSAgICBiYXNlNjRfZW5jb2RlKGJ5dGVzLCBsZW4sIGIpOwotICAgIHRyYW5zXy0+d3JpdGUoYiwgbGVuICsgMSk7Ci0gICAgcmVzdWx0ICs9IGxlbiArIDE7Ci0gIH0KLSAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBDb252ZXJ0IHRoZSBnaXZlbiBpbnRlZ2VyIHR5cGUgdG8gYSBKU09OIG51bWJlciwgb3IgYSBzdHJpbmcKLS8vIGlmIHRoZSBjb250ZXh0IHJlcXVpcmVzIGl0IChlZzoga2V5IGluIGEgbWFwIHBhaXIpLgotdGVtcGxhdGUgPHR5cGVuYW1lIE51bWJlclR5cGU+Ci11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05JbnRlZ2VyKE51bWJlclR5cGUgbnVtKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT53cml0ZSgqdHJhbnNfKTsKLSAgc3RkOjpzdHJpbmcgdmFsKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KG51bSkpOwotICBib29sIGVzY2FwZU51bSA9IGNvbnRleHRfLT5lc2NhcGVOdW0oKTsKLSAgaWYgKGVzY2FwZU51bSkgewotICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKLSAgICByZXN1bHQgKz0gMTsKLSAgfQotICB0cmFuc18tPndyaXRlKChjb25zdCB1aW50OF90ICopdmFsLmNfc3RyKCksIHZhbC5sZW5ndGgoKSk7Ci0gIHJlc3VsdCArPSB2YWwubGVuZ3RoKCk7Ci0gIGlmIChlc2NhcGVOdW0pIHsKLSAgICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7Ci0gICAgcmVzdWx0ICs9IDE7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gQ29udmVydCB0aGUgZ2l2ZW4gZG91YmxlIHRvIGEgSlNPTiBzdHJpbmcsIHdoaWNoIGlzIGVpdGhlciB0aGUgbnVtYmVyLAotLy8gIk5hTiIgb3IgIkluZmluaXR5IiBvciAiLUluZmluaXR5Ii4KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkRvdWJsZShkb3VibGUgbnVtKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT53cml0ZSgqdHJhbnNfKTsKLSAgc3RkOjpzdHJpbmcgdmFsKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KG51bSkpOwotCi0gIC8vIE5vcm1hbGl6ZSBvdXRwdXQgb2YgYm9vc3Q6OmxleGljYWxfY2FzdCBmb3IgTmFOcyBhbmQgSW5maW5pdGllcwotICBib29sIHNwZWNpYWwgPSBmYWxzZTsKLSAgc3dpdGNoICh2YWxbMF0pIHsKLSAgY2FzZSAnTic6Ci0gIGNhc2UgJ24nOgotICAgIHZhbCA9IGtUaHJpZnROYW47Ci0gICAgc3BlY2lhbCA9IHRydWU7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgJ0knOgotICBjYXNlICdpJzoKLSAgICB2YWwgPSBrVGhyaWZ0SW5maW5pdHk7Ci0gICAgc3BlY2lhbCA9IHRydWU7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgJy0nOgotICAgIGlmICgodmFsWzFdID09ICdJJykgfHwgKHZhbFsxXSA9PSAnaScpKSB7Ci0gICAgICB2YWwgPSBrVGhyaWZ0TmVnYXRpdmVJbmZpbml0eTsKLSAgICAgIHNwZWNpYWwgPSB0cnVlOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIGJvb2wgZXNjYXBlTnVtID0gc3BlY2lhbCB8fCBjb250ZXh0Xy0+ZXNjYXBlTnVtKCk7Ci0gIGlmIChlc2NhcGVOdW0pIHsKLSAgICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7Ci0gICAgcmVzdWx0ICs9IDE7Ci0gIH0KLSAgdHJhbnNfLT53cml0ZSgoY29uc3QgdWludDhfdCAqKXZhbC5jX3N0cigpLCB2YWwubGVuZ3RoKCkpOwotICByZXN1bHQgKz0gdmFsLmxlbmd0aCgpOwotICBpZiAoZXNjYXBlTnVtKSB7Ci0gICAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOwotICAgIHJlc3VsdCArPSAxOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTk9iamVjdFN0YXJ0KCkgewotICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+d3JpdGUoKnRyYW5zXyk7Ci0gIHRyYW5zXy0+d3JpdGUoJmtKU09OT2JqZWN0U3RhcnQsIDEpOwotICBwdXNoQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+KG5ldyBKU09OUGFpckNvbnRleHQoKSkpOwotICByZXR1cm4gcmVzdWx0ICsgMTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OT2JqZWN0RW5kKCkgewotICBwb3BDb250ZXh0KCk7Ci0gIHRyYW5zXy0+d3JpdGUoJmtKU09OT2JqZWN0RW5kLCAxKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkFycmF5U3RhcnQoKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT53cml0ZSgqdHJhbnNfKTsKLSAgdHJhbnNfLT53cml0ZSgma0pTT05BcnJheVN0YXJ0LCAxKTsKLSAgcHVzaENvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTkxpc3RDb250ZXh0KCkpKTsKLSAgcmV0dXJuIHJlc3VsdCArIDE7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkFycmF5RW5kKCkgewotICBwb3BDb250ZXh0KCk7Ci0gIHRyYW5zXy0+d3JpdGUoJmtKU09OQXJyYXlFbmQsIDEpOwotICByZXR1cm4gMTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKLSAgcmVzdWx0ICs9IHdyaXRlSlNPTkludGVnZXIoa1RocmlmdFZlcnNpb24xKTsKLSAgcmVzdWx0ICs9IHdyaXRlSlNPTlN0cmluZyhuYW1lKTsKLSAgcmVzdWx0ICs9IHdyaXRlSlNPTkludGVnZXIobWVzc2FnZVR5cGUpOwotICByZXN1bHQgKz0gd3JpdGVKU09OSW50ZWdlcihzZXFpZCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlTWVzc2FnZUVuZCgpIHsKLSAgcmV0dXJuIHdyaXRlSlNPTkFycmF5RW5kKCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSkgewotICAodm9pZCkgbmFtZTsKLSAgcmV0dXJuIHdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlU3RydWN0RW5kKCkgewotICByZXR1cm4gd3JpdGVKU09OT2JqZWN0RW5kKCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKLSAgKHZvaWQpIG5hbWU7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IHdyaXRlSlNPTkludGVnZXIoZmllbGRJZCk7Ci0gIHJlc3VsdCArPSB3cml0ZUpTT05PYmplY3RTdGFydCgpOwotICByZXN1bHQgKz0gd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKGZpZWxkVHlwZSkpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUZpZWxkRW5kKCkgewotICByZXR1cm4gd3JpdGVKU09OT2JqZWN0RW5kKCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlRmllbGRTdG9wKCkgewotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKLSAgcmVzdWx0ICs9IHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRChrZXlUeXBlKSk7Ci0gIHJlc3VsdCArPSB3cml0ZUpTT05TdHJpbmcoZ2V0VHlwZU5hbWVGb3JUeXBlSUQodmFsVHlwZSkpOwotICByZXN1bHQgKz0gd3JpdGVKU09OSW50ZWdlcigoaW50NjRfdClzaXplKTsKLSAgcmVzdWx0ICs9IHdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlTWFwRW5kKCkgewotICByZXR1cm4gd3JpdGVKU09OT2JqZWN0RW5kKCkgKyB3cml0ZUpTT05BcnJheUVuZCgpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVKU09OQXJyYXlTdGFydCgpOwotICByZXN1bHQgKz0gd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKGVsZW1UeXBlKSk7Ci0gIHJlc3VsdCArPSB3cml0ZUpTT05JbnRlZ2VyKChpbnQ2NF90KXNpemUpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUxpc3RFbmQoKSB7Ci0gIHJldHVybiB3cml0ZUpTT05BcnJheUVuZCgpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKLSAgcmVzdWx0ICs9IHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRChlbGVtVHlwZSkpOwotICByZXN1bHQgKz0gd3JpdGVKU09OSW50ZWdlcigoaW50NjRfdClzaXplKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVTZXRFbmQoKSB7Ci0gIHJldHVybiB3cml0ZUpTT05BcnJheUVuZCgpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgewotICByZXR1cm4gd3JpdGVKU09OSW50ZWdlcih2YWx1ZSk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgewotICAvLyB3cml0ZUJ5dGUoKSBtdXN0IGJlIGhhbmRsZWQgc3BlY2lhbGx5IGJlY3Vhc2UgYm9vc3Q6OmxleGljYWwgY2FzdCBzZWVzCi0gIC8vIGludDhfdCBhcyBhIHRleHQgdHlwZSBpbnN0ZWFkIG9mIGFuIGludGVnZXIgdHlwZQotICByZXR1cm4gd3JpdGVKU09OSW50ZWdlcigoaW50MTZfdClieXRlKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKLSAgcmV0dXJuIHdyaXRlSlNPTkludGVnZXIoaTE2KTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKLSAgcmV0dXJuIHdyaXRlSlNPTkludGVnZXIoaTMyKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKLSAgcmV0dXJuIHdyaXRlSlNPTkludGVnZXIoaTY0KTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgewotICByZXR1cm4gd3JpdGVKU09ORG91YmxlKGR1Yik7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIHdyaXRlSlNPTlN0cmluZyhzdHIpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiB3cml0ZUpTT05CYXNlNjQoc3RyKTsKLX0KLQotICAvKioKLSAgICogUmVhZGluZyBmdW5jdGlvbnMKLSAgICovCi0KLS8vIFJlYWRzIDEgYnl0ZSBhbmQgdmVyaWZpZXMgdGhhdCBpdCBtYXRjaGVzIGNoLgotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05TeW50YXhDaGFyKHVpbnQ4X3QgY2gpIHsKLSAgcmV0dXJuIHJlYWRTeW50YXhDaGFyKHJlYWRlcl8sIGNoKTsKLX0KLQotLy8gRGVjb2RlcyB0aGUgZm91ciBoZXggcGFydHMgb2YgYSBKU09OIGVzY2FwZWQgc3RyaW5nIGNoYXJhY3RlciBhbmQgcmV0dXJucwotLy8gdGhlIGNoYXJhY3RlciB2aWEgb3V0LiBUaGUgZmlyc3QgdHdvIGNoYXJhY3RlcnMgbXVzdCBiZSAiMDAiLgotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05Fc2NhcGVDaGFyKHVpbnQ4X3QgKm91dCkgewotICB1aW50OF90IGJbMl07Ci0gIHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTlplcm9DaGFyKTsKLSAgcmVhZEpTT05TeW50YXhDaGFyKGtKU09OWmVyb0NoYXIpOwotICBiWzBdID0gcmVhZGVyXy5yZWFkKCk7Ci0gIGJbMV0gPSByZWFkZXJfLnJlYWQoKTsKLSAgKm91dCA9IChoZXhWYWwoYlswXSkgPDwgNCkgKyBoZXhWYWwoYlsxXSk7Ci0gIHJldHVybiA0OwotfQotCi0vLyBEZWNvZGVzIGEgSlNPTiBzdHJpbmcsIGluY2x1ZGluZyB1bmVzY2FwaW5nLCBhbmQgcmV0dXJucyB0aGUgc3RyaW5nIHZpYSBzdHIKLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OU3RyaW5nKHN0ZDo6c3RyaW5nICZzdHIsIGJvb2wgc2tpcENvbnRleHQpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gKHNraXBDb250ZXh0ID8gMCA6IGNvbnRleHRfLT5yZWFkKHJlYWRlcl8pKTsKLSAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTlN0cmluZ0RlbGltaXRlcik7Ci0gIHVpbnQ4X3QgY2g7Ci0gIHN0ci5jbGVhcigpOwotICB3aGlsZSAodHJ1ZSkgewotICAgIGNoID0gcmVhZGVyXy5yZWFkKCk7Ci0gICAgKytyZXN1bHQ7Ci0gICAgaWYgKGNoID09IGtKU09OU3RyaW5nRGVsaW1pdGVyKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGNoID09IGtKU09OQmFja3NsYXNoKSB7Ci0gICAgICBjaCA9IHJlYWRlcl8ucmVhZCgpOwotICAgICAgKytyZXN1bHQ7Ci0gICAgICBpZiAoY2ggPT0ga0pTT05Fc2NhcGVDaGFyKSB7Ci0gICAgICAgIHJlc3VsdCArPSByZWFkSlNPTkVzY2FwZUNoYXIoJmNoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBzaXplX3QgcG9zID0ga0VzY2FwZUNoYXJzLmZpbmQoY2gpOwotICAgICAgICBpZiAocG9zID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgY29udHJvbCBjaGFyLCBnb3QgJyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZygoY29uc3QgY2hhciAqKSZjaCwgMSkgICsgIicuIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2ggPSBrRXNjYXBlQ2hhclZhbHNbcG9zXTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3RyICs9IGNoOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIFJlYWRzIGEgYmxvY2sgb2YgYmFzZTY0IGNoYXJhY3RlcnMsIGRlY29kaW5nIGl0LCBhbmQgcmV0dXJucyB2aWEgc3RyCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkJhc2U2NChzdGQ6OnN0cmluZyAmc3RyKSB7Ci0gIHN0ZDo6c3RyaW5nIHRtcDsKLSAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05TdHJpbmcodG1wKTsKLSAgdWludDhfdCAqYiA9ICh1aW50OF90ICopdG1wLmNfc3RyKCk7Ci0gIHVpbnQzMl90IGxlbiA9IHRtcC5sZW5ndGgoKTsKLSAgc3RyLmNsZWFyKCk7Ci0gIHdoaWxlIChsZW4gPj0gNCkgewotICAgIGJhc2U2NF9kZWNvZGUoYiwgNCk7Ci0gICAgc3RyLmFwcGVuZCgoY29uc3QgY2hhciAqKWIsIDMpOwotICAgIGIgKz0gNDsKLSAgICBsZW4gLT0gNDsKLSAgfQotICAvLyBEb24ndCBkZWNvZGUgaWYgd2UgaGl0IHRoZSBlbmQgb3IgZ290IGEgc2luZ2xlIGxlZnRvdmVyIGJ5dGUgKGludmFsaWQKLSAgLy8gYmFzZTY0IGJ1dCBsZWdhbCBmb3Igc2tpcCBvZiByZWd1bGFyIHN0cmluZyB0eXBlKQotICBpZiAobGVuID4gMSkgewotICAgIGJhc2U2NF9kZWNvZGUoYiwgbGVuKTsKLSAgICBzdHIuYXBwZW5kKChjb25zdCBjaGFyICopYiwgbGVuIC0gMSk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gUmVhZHMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzLCBzdG9wcGluZyBhdCB0aGUgZmlyc3Qgb25lIHRoYXQgaXMgbm90Ci0vLyBhIHZhbGlkIEpTT04gbnVtZXJpYyBjaGFyYWN0ZXIuCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTk51bWVyaWNDaGFycyhzdGQ6OnN0cmluZyAmc3RyKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gIHN0ci5jbGVhcigpOwotICB3aGlsZSAodHJ1ZSkgewotICAgIHVpbnQ4X3QgY2ggPSByZWFkZXJfLnBlZWsoKTsKLSAgICBpZiAoIWlzSlNPTk51bWVyaWMoY2gpKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgcmVhZGVyXy5yZWFkKCk7Ci0gICAgc3RyICs9IGNoOwotICAgICsrcmVzdWx0OwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIFJlYWRzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBhbmQgYXNzZW1ibGVzIHRoZW0gaW50byBhIG51bWJlciwKLS8vIHJldHVybmluZyB0aGVtIHZpYSBudW0KLXRlbXBsYXRlIDx0eXBlbmFtZSBOdW1iZXJUeXBlPgotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05JbnRlZ2VyKE51bWJlclR5cGUgJm51bSkgewotICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+cmVhZChyZWFkZXJfKTsKLSAgaWYgKGNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgIHJlc3VsdCArPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05TdHJpbmdEZWxpbWl0ZXIpOwotICB9Ci0gIHN0ZDo6c3RyaW5nIHN0cjsKLSAgcmVzdWx0ICs9IHJlYWRKU09OTnVtZXJpY0NoYXJzKHN0cik7Ci0gIHRyeSB7Ci0gICAgbnVtID0gYm9vc3Q6OmxleGljYWxfY2FzdDxOdW1iZXJUeXBlPihzdHIpOwotICB9Ci0gIGNhdGNoIChib29zdDo6YmFkX2xleGljYWxfY2FzdCBlKSB7Ci0gICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBudW1lcmljIHZhbHVlOyBnb3QgXCIiICsgc3RyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiKTsKLSAgfQotICBpZiAoY29udGV4dF8tPmVzY2FwZU51bSgpKSB7Ci0gICAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTlN0cmluZ0RlbGltaXRlcik7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gUmVhZHMgYSBKU09OIG51bWJlciBvciBzdHJpbmcgYW5kIGludGVycHJldHMgaXQgYXMgYSBkb3VibGUuCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkRvdWJsZShkb3VibGUgJm51bSkgewotICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+cmVhZChyZWFkZXJfKTsKLSAgc3RkOjpzdHJpbmcgc3RyOwotICBpZiAocmVhZGVyXy5wZWVrKCkgPT0ga0pTT05TdHJpbmdEZWxpbWl0ZXIpIHsKLSAgICByZXN1bHQgKz0gcmVhZEpTT05TdHJpbmcoc3RyLCB0cnVlKTsKLSAgICAvLyBDaGVjayBmb3IgTmFOLCBJbmZpbml0eSBhbmQgLUluZmluaXR5Ci0gICAgaWYgKHN0ciA9PSBrVGhyaWZ0TmFuKSB7Ci0gICAgICBudW0gPSBIVUdFX1ZBTC9IVUdFX1ZBTDsgLy8gZ2VuZXJhdGVzIE5hTgotICAgIH0KLSAgICBlbHNlIGlmIChzdHIgPT0ga1RocmlmdEluZmluaXR5KSB7Ci0gICAgICBudW0gPSBIVUdFX1ZBTDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyID09IGtUaHJpZnROZWdhdGl2ZUluZmluaXR5KSB7Ci0gICAgICBudW0gPSAtSFVHRV9WQUw7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgaWYgKCFjb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uIC0tIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCi0gICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7Ci0gICAgICB9Ci0gICAgICB0cnkgewotICAgICAgICBudW0gPSBib29zdDo6bGV4aWNhbF9jYXN0PGRvdWJsZT4oc3RyKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChib29zdDo6YmFkX2xleGljYWxfY2FzdCBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG51bWVyaWMgdmFsdWU7IGdvdCBcIiIgKyBzdHIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIpOwotICAgICAgfQotICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICBpZiAoY29udGV4dF8tPmVzY2FwZU51bSgpKSB7Ci0gICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgLSB3ZSBzaG91bGQgaGF2ZSBoYWQgYSBxdW90ZSBpZiBlc2NhcGVOdW0gPT0gdHJ1ZQotICAgICAgcmVhZEpTT05TeW50YXhDaGFyKGtKU09OU3RyaW5nRGVsaW1pdGVyKTsKLSAgICB9Ci0gICAgcmVzdWx0ICs9IHJlYWRKU09OTnVtZXJpY0NoYXJzKHN0cik7Ci0gICAgdHJ5IHsKLSAgICAgIG51bSA9IGJvb3N0OjpsZXhpY2FsX2Nhc3Q8ZG91YmxlPihzdHIpOwotICAgIH0KLSAgICBjYXRjaCAoYm9vc3Q6OmJhZF9sZXhpY2FsX2Nhc3QgZSkgewotICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG51bWVyaWMgdmFsdWU7IGdvdCBcIiIgKyBzdHIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05PYmplY3RTdGFydCgpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPnJlYWQocmVhZGVyXyk7Ci0gIHJlc3VsdCArPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05PYmplY3RTdGFydCk7Ci0gIHB1c2hDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4obmV3IEpTT05QYWlyQ29udGV4dCgpKSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OT2JqZWN0RW5kKCkgewotICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05PYmplY3RFbmQpOwotICBwb3BDb250ZXh0KCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OQXJyYXlTdGFydCgpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPnJlYWQocmVhZGVyXyk7Ci0gIHJlc3VsdCArPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05BcnJheVN0YXJ0KTsKLSAgcHVzaENvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTkxpc3RDb250ZXh0KCkpKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05BcnJheUVuZCgpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05TeW50YXhDaGFyKGtKU09OQXJyYXlFbmQpOwotICBwb3BDb250ZXh0KCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OQXJyYXlTdGFydCgpOwotICB1aW50NjRfdCB0bXBWYWwgPSAwOwotICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7Ci0gIGlmICh0bXBWYWwgIT0ga1RocmlmdFZlcnNpb24xKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKTsKLSAgfQotICByZXN1bHQgKz0gcmVhZEpTT05TdHJpbmcobmFtZSk7Ci0gIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKLSAgbWVzc2FnZVR5cGUgPSAoVE1lc3NhZ2VUeXBlKXRtcFZhbDsKLSAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOwotICBzZXFpZCA9IHRtcFZhbDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZE1lc3NhZ2VFbmQoKSB7Ci0gIHJldHVybiByZWFkSlNPTkFycmF5RW5kKCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSkgewotICAodm9pZCkgbmFtZTsKLSAgcmV0dXJuIHJlYWRKU09OT2JqZWN0U3RhcnQoKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZFN0cnVjdEVuZCgpIHsKLSAgcmV0dXJuIHJlYWRKU09OT2JqZWN0RW5kKCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKLSAgKHZvaWQpIG5hbWU7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gIC8vIENoZWNrIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZSBsaXN0Ci0gIHVpbnQ4X3QgY2ggPSByZWFkZXJfLnBlZWsoKTsKLSAgaWYgKGNoID09IGtKU09OT2JqZWN0RW5kKSB7Ci0gICAgZmllbGRUeXBlID0gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUT1A7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgdWludDY0X3QgdG1wVmFsID0gMDsKLSAgICBzdGQ6OnN0cmluZyB0bXBTdHI7Ci0gICAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOwotICAgIGZpZWxkSWQgPSB0bXBWYWw7Ci0gICAgcmVzdWx0ICs9IHJlYWRKU09OT2JqZWN0U3RhcnQoKTsKLSAgICByZXN1bHQgKz0gcmVhZEpTT05TdHJpbmcodG1wU3RyKTsKLSAgICBmaWVsZFR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZSh0bXBTdHIpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRGaWVsZEVuZCgpIHsKLSAgcmV0dXJuIHJlYWRKU09OT2JqZWN0RW5kKCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICB1aW50NjRfdCB0bXBWYWwgPSAwOwotICBzdGQ6OnN0cmluZyB0bXBTdHI7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OQXJyYXlTdGFydCgpOwotICByZXN1bHQgKz0gcmVhZEpTT05TdHJpbmcodG1wU3RyKTsKLSAga2V5VHlwZSA9IGdldFR5cGVJREZvclR5cGVOYW1lKHRtcFN0cik7Ci0gIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyh0bXBTdHIpOwotICB2YWxUeXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUodG1wU3RyKTsKLSAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOwotICBzaXplID0gdG1wVmFsOwotICByZXN1bHQgKz0gcmVhZEpTT05PYmplY3RTdGFydCgpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkTWFwRW5kKCkgewotICByZXR1cm4gcmVhZEpTT05PYmplY3RFbmQoKSArIHJlYWRKU09OQXJyYXlFbmQoKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7Ci0gIHVpbnQ2NF90IHRtcFZhbCA9IDA7Ci0gIHN0ZDo6c3RyaW5nIHRtcFN0cjsKLSAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05BcnJheVN0YXJ0KCk7Ci0gIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyh0bXBTdHIpOwotICBlbGVtVHlwZSA9IGdldFR5cGVJREZvclR5cGVOYW1lKHRtcFN0cik7Ci0gIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKLSAgc2l6ZSA9IHRtcFZhbDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZExpc3RFbmQoKSB7Ci0gIHJldHVybiByZWFkSlNPTkFycmF5RW5kKCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgdWludDY0X3QgdG1wVmFsID0gMDsKLSAgc3RkOjpzdHJpbmcgdG1wU3RyOwotICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTkFycmF5U3RhcnQoKTsKLSAgcmVzdWx0ICs9IHJlYWRKU09OU3RyaW5nKHRtcFN0cik7Ci0gIGVsZW1UeXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUodG1wU3RyKTsKLSAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOwotICBzaXplID0gdG1wVmFsOwotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkU2V0RW5kKCkgewotICByZXR1cm4gcmVhZEpTT05BcnJheUVuZCgpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkQm9vbChib29sJiB2YWx1ZSkgewotICByZXR1cm4gcmVhZEpTT05JbnRlZ2VyKHZhbHVlKTsKLX0KLQotLy8gcmVhZEJ5dGUoKSBtdXN0IGJlIGhhbmRsZWQgcHJvcGVybHkgYmVjdWFzZSBib29zdDo6bGV4aWNhbCBjYXN0IHNlZXMgaW50OF90Ci0vLyBhcyBhIHRleHQgdHlwZSBpbnN0ZWFkIG9mIGFuIGludGVnZXIgdHlwZQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEJ5dGUoaW50OF90JiBieXRlKSB7Ci0gIGludDE2X3QgdG1wID0gKGludDE2X3QpIGJ5dGU7Ci0gIHVpbnQzMl90IHJlc3VsdCA9ICByZWFkSlNPTkludGVnZXIodG1wKTsKLSAgYXNzZXJ0KHRtcCA8IDI1Nik7Ci0gIGJ5dGUgPSAoaW50OF90KXRtcDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEkxNihpbnQxNl90JiBpMTYpIHsKLSAgcmV0dXJuIHJlYWRKU09OSW50ZWdlcihpMTYpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSTMyKGludDMyX3QmIGkzMikgewotICByZXR1cm4gcmVhZEpTT05JbnRlZ2VyKGkzMik7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRJNjQoaW50NjRfdCYgaTY0KSB7Ci0gIHJldHVybiByZWFkSlNPTkludGVnZXIoaTY0KTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZERvdWJsZShkb3VibGUmIGR1YikgewotICByZXR1cm4gcmVhZEpTT05Eb3VibGUoZHViKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZFN0cmluZyhzdGQ6OnN0cmluZyAmc3RyKSB7Ci0gIHJldHVybiByZWFkSlNPTlN0cmluZyhzdHIpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkQmluYXJ5KHN0ZDo6c3RyaW5nICZzdHIpIHsKLSAgcmV0dXJuIHJlYWRKU09OQmFzZTY0KHN0cik7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk5YzM2MS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm90b2NvbC9USlNPTlByb3RvY29sLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVEpTT05QUk9UT0NPTF9IXwotI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RKU09OUFJPVE9DT0xfSF8gMQotCi0jaW5jbHVkZSAiVFZpcnR1YWxQcm90b2NvbC5oIgotCi0jaW5jbHVkZSA8c3RhY2s+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotLy8gRm9yd2FyZCBkZWNsYXJhdGlvbgotY2xhc3MgVEpTT05Db250ZXh0OwotCi0vKioKLSAqIEpTT04gcHJvdG9jb2wgZm9yIFRocmlmdC4KLSAqCi0gKiBJbXBsZW1lbnRzIGEgcHJvdG9jb2wgd2hpY2ggdXNlcyBKU09OIGFzIHRoZSB3aXJlLWZvcm1hdC4KLSAqCi0gKiBUaHJpZnQgdHlwZXMgYXJlIHJlcHJlc2VudGVkIGFzIGRlc2NyaWJlZCBiZWxvdzoKLSAqCi0gKiAxLiBFdmVyeSBUaHJpZnQgaW50ZWdlciB0eXBlIGlzIHJlcHJlc2VudGVkIGFzIGEgSlNPTiBudW1iZXIuCi0gKgotICogMi4gVGhyaWZ0IGRvdWJsZXMgYXJlIHJlcHJlc2VudGVkIGFzIEpTT04gbnVtYmVycy4gU29tZSBzcGVjaWFsIHZhbHVlcyBhcmUKLSAqICAgIHJlcHJlc2VudGVkIGFzIHN0cmluZ3M6Ci0gKiAgICBhLiAiTmFOIiBmb3Igbm90LWEtbnVtYmVyIHZhbHVlcwotICogICAgYi4gIkluZmluaXR5IiBmb3IgcG9zdGl2ZSBpbmZpbml0eQotICogICAgYy4gIi1JbmZpbml0eSIgZm9yIG5lZ2F0aXZlIGluZmluaXR5Ci0gKgotICogMy4gVGhyaWZ0IHN0cmluZyB2YWx1ZXMgYXJlIGVtaXR0ZWQgYXMgSlNPTiBzdHJpbmdzLCB3aXRoIGFwcHJvcHJpYXRlCi0gKiAgICBlc2NhcGluZy4KLSAqCi0gKiA0LiBUaHJpZnQgYmluYXJ5IHZhbHVlcyBhcmUgZW5jb2RlZCBpbnRvIEJhc2U2NCBhbmQgZW1pdHRlZCBhcyBKU09OIHN0cmluZ3MuCi0gKiAgICBUaGUgcmVhZEJpbmFyeSgpIG1ldGhvZCBpcyB3cml0dGVuIHN1Y2ggdGhhdCBpdCB3aWxsIHByb3Blcmx5IHNraXAgaWYKLSAqICAgIGNhbGxlZCBvbiBhIFRocmlmdCBzdHJpbmcgKGFsdGhvdWdoIGl0IHdpbGwgZGVjb2RlIGdhcmJhZ2UgZGF0YSkuCi0gKgotICogNS4gVGhyaWZ0IHN0cnVjdHMgYXJlIHJlcHJlc2VudGVkIGFzIEpTT04gb2JqZWN0cywgd2l0aCB0aGUgZmllbGQgSUQgYXMgdGhlCi0gKiAgICBrZXksIGFuZCB0aGUgZmllbGQgdmFsdWUgcmVwcmVzZW50ZWQgYXMgYSBKU09OIG9iamVjdCB3aXRoIGEgc2luZ2xlCi0gKiAgICBrZXktdmFsdWUgcGFpci4gVGhlIGtleSBpcyBhIHNob3J0IHN0cmluZyBpZGVudGlmaWVyIGZvciB0aGF0IHR5cGUsCi0gKiAgICBmb2xsb3dlZCBieSB0aGUgdmFsdWUuIFRoZSB2YWxpZCB0eXBlIGlkZW50aWZpZXJzIGFyZTogInRmIiBmb3IgYm9vbCwKLSAqICAgICJpOCIgZm9yIGJ5dGUsICJpMTYiIGZvciAxNi1iaXQgaW50ZWdlciwgImkzMiIgZm9yIDMyLWJpdCBpbnRlZ2VyLCAiaTY0IgotICogICAgZm9yIDY0LWJpdCBpbnRlZ2VyLCAiZGJsIiBmb3IgZG91YmxlLXByZWNpc2lvbiBsb2F0aW5nIHBvaW50LCAic3RyIiBmb3IKLSAqICAgIHN0cmluZyAoaW5jbHVkaW5nIGJpbmFyeSksICJyZWMiIGZvciBzdHJ1Y3QgKCJyZWNvcmRzIiksICJtYXAiIGZvciBtYXAsCi0gKiAgICAibHN0IiBmb3IgbGlzdCwgInNldCIgZm9yIHNldC4KLSAqCi0gKiA2LiBUaHJpZnQgbGlzdHMgYW5kIHNldHMgYXJlIHJlcHJlc2VudGVkIGFzIEpTT04gYXJyYXlzLCB3aXRoIHRoZSBmaXJzdAotICogICAgZWxlbWVudCBvZiB0aGUgSlNPTiBhcnJheSBiZWluZyB0aGUgc3RyaW5nIGlkZW50aWZpZXIgZm9yIHRoZSBUaHJpZnQKLSAqICAgIGVsZW1lbnQgdHlwZSBhbmQgdGhlIHNlY29uZCBlbGVtZW50IG9mIHRoZSBKU09OIGFycmF5IGJlaW5nIHRoZSBjb3VudCBvZgotICogICAgdGhlIFRocmlmdCBlbGVtZW50cy4gVGhlIFRocmlmdCBlbGVtZW50cyB0aGVuIGZvbGxvdy4KLSAqCi0gKiA3LiBUaHJpZnQgbWFwcyBhcmUgcmVwcmVzZW50ZWQgYXMgSlNPTiBhcnJheXMsIHdpdGggdGhlIGZpcnN0IHR3byBlbGVtZW50cwotICogICAgb2YgdGhlIEpTT04gYXJyYXkgYmVpbmcgdGhlIHN0cmluZyBpZGVudGlmaWVycyBmb3IgdGhlIFRocmlmdCBrZXkgdHlwZQotICogICAgYW5kIHZhbHVlIHR5cGUsIGZvbGxvd2VkIGJ5IHRoZSBjb3VudCBvZiB0aGUgVGhyaWZ0IHBhaXJzLCBmb2xsb3dlZCBieSBhCi0gKiAgICBKU09OIG9iamVjdCBjb250YWluaW5nIHRoZSBrZXktdmFsdWUgcGFpcnMuIE5vdGUgdGhhdCBKU09OIGtleXMgY2FuIG9ubHkKLSAqICAgIGJlIHN0cmluZ3MsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGtleSB0eXBlIG9mIHRoZSBUaHJpZnQgbWFwIHNob3VsZCBiZQotICogICAgcmVzdHJpY3RlZCB0byBudW1lcmljIG9yIHN0cmluZyB0eXBlcyAtLSBpbiB0aGUgY2FzZSBvZiBudW1lcmljcywgdGhleQotICogICAgYXJlIHNlcmlhbGl6ZWQgYXMgc3RyaW5ncy4KLSAqCi0gKiA4LiBUaHJpZnQgbWVzc2FnZXMgYXJlIHJlcHJlc2VudGVkIGFzIEpTT04gYXJyYXlzLCB3aXRoIHRoZSBwcm90b2NvbAotICogICAgdmVyc2lvbiAjLCB0aGUgbWVzc2FnZSBuYW1lLCB0aGUgbWVzc2FnZSB0eXBlLCBhbmQgdGhlIHNlcXVlbmNlIElEIGFzCi0gKiAgICB0aGUgZmlyc3QgNCBlbGVtZW50cy4KLSAqCi0gKiBNb3JlIGRpc2N1c3Npb24gb2YgdGhlIGRvdWJsZSBoYW5kbGluZyBpcyBwcm9iYWJseSB3YXJyYW50ZWQuIFRoZSBhaW0gb2YKLSAqIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIHRvIG1hdGNoIGFzIGNsb3NlbHkgYXMgcG9zc2libGUgdGhlIGJlaGF2aW9yCi0gKiBvZiBKYXZhJ3MgRG91YmxlLnRvU3RyaW5nKCksIHdoaWNoIGhhcyBubyBwcmVjaXNpb24gbG9zcy4gIEltcGxlbWVudG9ycyBpbgotICogb3RoZXIgbGFuZ3VhZ2VzIHNob3VsZCBzdHJpdmUgdG8gYWNoaWV2ZSB0aGF0IHdoZXJlIHBvc3NpYmxlLiBJIGhhdmUgbm90Ci0gKiB5ZXQgdmVyaWZpZWQgd2hldGhlciBib29zdDpsZXhpY2FsX2Nhc3QsIHdoaWNoIGlzIGRvaW5nIHRoYXQgd29yayBmb3IgbWUgaW4KLSAqIEMrKywgbG9zZXMgYW55IHByZWNpc2lvbiwgYnV0IEkgYW0gbGVhdmluZyB0aGlzIGFzIGEgZnV0dXJlIGltcHJvdmVtZW50LiBJCi0gKiBtYXkgdHJ5IHRvIHByb3ZpZGUgYSBDIGNvbXBvbmVudCBmb3IgdGhpcywgc28gdGhhdCBvdGhlciBsYW5ndWFnZXMgY291bGQKLSAqIGJpbmQgdG8gdGhlIHNhbWUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBmb3IgbWF4aW11bSBjb25zaXN0ZW5jeS4KLSAqCi0gKi8KLWNsYXNzIFRKU09OUHJvdG9jb2wgOiBwdWJsaWMgVFZpcnR1YWxQcm90b2NvbDxUSlNPTlByb3RvY29sPiB7Ci0gcHVibGljOgotCi0gIFRKU09OUHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKTsKLQotICB+VEpTT05Qcm90b2NvbCgpOwotCi0gcHJpdmF0ZToKLQotICB2b2lkIHB1c2hDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gYyk7Ci0KLSAgdm9pZCBwb3BDb250ZXh0KCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVKU09ORXNjYXBlQ2hhcih1aW50OF90IGNoKTsKLQotICB1aW50MzJfdCB3cml0ZUpTT05DaGFyKHVpbnQ4X3QgY2gpOwotCi0gIHVpbnQzMl90IHdyaXRlSlNPTlN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmc3RyKTsKLQotICB1aW50MzJfdCB3cml0ZUpTT05CYXNlNjQoY29uc3Qgc3RkOjpzdHJpbmcgJnN0cik7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE51bWJlclR5cGU+Ci0gIHVpbnQzMl90IHdyaXRlSlNPTkludGVnZXIoTnVtYmVyVHlwZSBudW0pOwotCi0gIHVpbnQzMl90IHdyaXRlSlNPTkRvdWJsZShkb3VibGUgbnVtKTsKLQotICB1aW50MzJfdCB3cml0ZUpTT05PYmplY3RTdGFydCgpIDsKLQotICB1aW50MzJfdCB3cml0ZUpTT05PYmplY3RFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZUpTT05BcnJheVN0YXJ0KCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVKU09OQXJyYXlFbmQoKTsKLQotICB1aW50MzJfdCByZWFkSlNPTlN5bnRheENoYXIodWludDhfdCBjaCk7Ci0KLSAgdWludDMyX3QgcmVhZEpTT05Fc2NhcGVDaGFyKHVpbnQ4X3QgKm91dCk7Ci0KLSAgdWludDMyX3QgcmVhZEpTT05TdHJpbmcoc3RkOjpzdHJpbmcgJnN0ciwgYm9vbCBza2lwQ29udGV4dCA9IGZhbHNlKTsKLQotICB1aW50MzJfdCByZWFkSlNPTkJhc2U2NChzdGQ6OnN0cmluZyAmc3RyKTsKLQotICB1aW50MzJfdCByZWFkSlNPTk51bWVyaWNDaGFycyhzdGQ6OnN0cmluZyAmc3RyKTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTnVtYmVyVHlwZT4KLSAgdWludDMyX3QgcmVhZEpTT05JbnRlZ2VyKE51bWJlclR5cGUgJm51bSk7Ci0KLSAgdWludDMyX3QgcmVhZEpTT05Eb3VibGUoZG91YmxlICZudW0pOwotCi0gIHVpbnQzMl90IHJlYWRKU09OT2JqZWN0U3RhcnQoKTsKLQotICB1aW50MzJfdCByZWFkSlNPTk9iamVjdEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRKU09OQXJyYXlTdGFydCgpOwotCi0gIHVpbnQzMl90IHJlYWRKU09OQXJyYXlFbmQoKTsKLQotIHB1YmxpYzoKLQotICAvKioKLSAgICogV3JpdGluZyBmdW5jdGlvbnMuCi0gICAqLwotCi0gIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpOwotCi0gIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVNYXBFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB1aW50MzJfdCB3cml0ZVNldEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKTsKLQotICB1aW50MzJfdCB3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpOwotCi0gIHVpbnQzMl90IHdyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KTsKLQotICB1aW50MzJfdCB3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMik7Ci0KLSAgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpOwotCi0gIHVpbnQzMl90IHdyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpOwotCi0gIHVpbnQzMl90IHdyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIC8qKgotICAgKiBSZWFkaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpOwotCi0gIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKTsKLQotICB1aW50MzJfdCByZWFkU3RydWN0RW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpOwotCi0gIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpOwotCi0gIHVpbnQzMl90IHJlYWRNYXBFbmQoKTsKLQotICB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7Ci0KLSAgdWludDMyX3QgcmVhZExpc3RFbmQoKTsKLQotICB1aW50MzJfdCByZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpOwotCi0gIHVpbnQzMl90IHJlYWRTZXRFbmQoKTsKLQotICB1aW50MzJfdCByZWFkQm9vbChib29sJiB2YWx1ZSk7Ci0KLSAgLy8gUHJvdmlkZSB0aGUgZGVmYXVsdCByZWFkQm9vbCgpIGltcGxlbWVudGF0aW9uIGZvciBzdGQ6OnZlY3Rvcjxib29sPgotICB1c2luZyBUVmlydHVhbFByb3RvY29sPFRKU09OUHJvdG9jb2w+OjpyZWFkQm9vbDsKLQotICB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpOwotCi0gIHVpbnQzMl90IHJlYWRJMTYoaW50MTZfdCYgaTE2KTsKLQotICB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMik7Ci0KLSAgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpOwotCi0gIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpOwotCi0gIHVpbnQzMl90IHJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKTsKLQotICBjbGFzcyBMb29rYWhlYWRSZWFkZXIgewotCi0gICBwdWJsaWM6Ci0KLSAgICBMb29rYWhlYWRSZWFkZXIoVFRyYW5zcG9ydCAmdHJhbnMpIDoKLSAgICAgIHRyYW5zXygmdHJhbnMpLAotICAgICAgaGFzRGF0YV8oZmFsc2UpIHsKLSAgICB9Ci0KLSAgICB1aW50OF90IHJlYWQoKSB7Ci0gICAgICBpZiAoaGFzRGF0YV8pIHsKLSAgICAgICAgaGFzRGF0YV8gPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICB0cmFuc18tPnJlYWRBbGwoJmRhdGFfLCAxKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBkYXRhXzsKLSAgICB9Ci0KLSAgICB1aW50OF90IHBlZWsoKSB7Ci0gICAgICBpZiAoIWhhc0RhdGFfKSB7Ci0gICAgICAgIHRyYW5zXy0+cmVhZEFsbCgmZGF0YV8sIDEpOwotICAgICAgfQotICAgICAgaGFzRGF0YV8gPSB0cnVlOwotICAgICAgcmV0dXJuIGRhdGFfOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBUVHJhbnNwb3J0ICp0cmFuc187Ci0gICAgYm9vbCBoYXNEYXRhXzsKLSAgICB1aW50OF90IGRhdGFfOwotICB9OwotCi0gcHJpdmF0ZToKLSAgVFRyYW5zcG9ydCogdHJhbnNfOwotCi0gIHN0ZDo6c3RhY2s8Ym9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PiA+IGNvbnRleHRzXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PiBjb250ZXh0XzsKLSAgTG9va2FoZWFkUmVhZGVyIHJlYWRlcl87Ci19OwotCi0vKioKLSAqIENvbnN0cnVjdHMgaW5wdXQgYW5kIG91dHB1dCBwcm90b2NvbCBvYmplY3RzIGdpdmVuIHRyYW5zcG9ydHMuCi0gKi8KLWNsYXNzIFRKU09OUHJvdG9jb2xGYWN0b3J5IDogcHVibGljIFRQcm90b2NvbEZhY3RvcnkgewotIHB1YmxpYzoKLSAgVEpTT05Qcm90b2NvbEZhY3RvcnkoKSB7fQotCi0gIHZpcnR1YWwgflRKU09OUHJvdG9jb2xGYWN0b3J5KCkge30KLQotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4obmV3IFRKU09OUHJvdG9jb2wodHJhbnMpKTsKLSAgfQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAotCi0KLS8vIFRPRE8oZHJlaXNzKTogTW92ZSBwYXJ0IG9mIFRocmlmdEpTT05TdHJpbmcgaW50byBhIC5jcHAgZmlsZSBhbmQgcmVtb3ZlIHRoaXMuCi0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsKLQotdGVtcGxhdGU8dHlwZW5hbWUgVGhyaWZ0U3RydWN0PgotICBzdGQ6OnN0cmluZyBUaHJpZnRKU09OU3RyaW5nKGNvbnN0IFRocmlmdFN0cnVjdCYgdHMpIHsKLSAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Ci0gIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci0gIFRNZW1vcnlCdWZmZXIqIGJ1ZmZlciA9IG5ldyBUTWVtb3J5QnVmZmVyOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucyhidWZmZXIpOwotICBUSlNPTlByb3RvY29sIHByb3RvY29sKHRyYW5zKTsKLQotICB0cy53cml0ZSgmcHJvdG9jb2wpOwotCi0gIHVpbnQ4X3QqIGJ1ZjsKLSAgdWludDMyX3Qgc2l6ZTsKLSAgYnVmZmVyLT5nZXRCdWZmZXIoJmJ1ZiwgJnNpemUpOwotICByZXR1cm4gc3RkOjpzdHJpbmcoKGNoYXIqKWJ1ZiwgKHVuc2lnbmVkIGludClzaXplKTsKLX0KLQotfX0gLy8gYXBhY2hlOjp0aHJpZnQKLQotI2VuZGlmIC8vICNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9USlNPTlBST1RPQ09MX0hfIDEKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvcHJvdG9jb2wvVFByb3RvY29sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NTZlNWUuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVFByb3RvY29sLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ODYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MX0hfCi0jZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MX0hfIDEKLQotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmg+Ci0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDxib29zdC9zdGF0aWNfYXNzZXJ0LmhwcD4KLQotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotCi0vLyBVc2UgdGhpcyB0byBnZXQgYXJvdW5kIHN0cmljdCBhbGlhc2luZyBydWxlcy4KLS8vIEZvciBleGFtcGxlLCB1aW50NjRfdCBpID0gYml0d2lzZV9jYXN0PHVpbnQ2NF90PihyZXR1cm5zX2RvdWJsZSgpKTsKLS8vIFRoZSBtb3N0IG9idmlvdXMgaW1wbGVtZW50YXRpb24gaXMgdG8ganVzdCBjYXN0IGEgcG9pbnRlciwKLS8vIGJ1dCB0aGF0IGRvZXNuJ3Qgd29yay4KLS8vIEZvciBhIHByZXR0eSBpbi1kZXB0aCBleHBsYW5hdGlvbiBvZiB0aGUgcHJvYmxlbSwgc2VlCi0vLyBodHRwOi8vd3d3LmNlbGxwZXJmb3JtYW5jZS5jb20vbWlrZV9hY3Rvbi8yMDA2LzA2LyAoLi4uKQotLy8gdW5kZXJzdGFuZGluZ19zdHJpY3RfYWxpYXNpbmcuaHRtbAotdGVtcGxhdGUgPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPgotc3RhdGljIGlubGluZSBUbyBiaXR3aXNlX2Nhc3QoRnJvbSBmcm9tKSB7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKEZyb20pID09IHNpemVvZihUbykpOwotCi0gIC8vIEJBRCEhISAgVGhlc2UgYXJlIGFsbCBicm9rZW4gd2l0aCAtTzIuCi0gIC8vcmV0dXJuICpyZWludGVycHJldF9jYXN0PFRvKj4oJmZyb20pOyAgLy8gQkFEISEhCi0gIC8vcmV0dXJuICpzdGF0aWNfY2FzdDxUbyo+KHN0YXRpY19jYXN0PHZvaWQqPigmZnJvbSkpOyAgLy8gQkFEISEhCi0gIC8vcmV0dXJuICooVG8qKSh2b2lkKikmZnJvbTsgIC8vIEJBRCEhIQotCi0gIC8vIFN1cGVyIGNsZWFuIGFuZCBwYXJpdGFsbHkgYmxlc3NlZCBieSBzZWN0aW9uIDMuOSBvZiB0aGUgc3RhbmRhcmQuCi0gIC8vdW5zaWduZWQgY2hhciBjW3NpemVvZihmcm9tKV07Ci0gIC8vbWVtY3B5KGMsICZmcm9tLCBzaXplb2YoZnJvbSkpOwotICAvL1RvIHRvOwotICAvL21lbWNweSgmdG8sIGMsIHNpemVvZihjKSk7Ci0gIC8vcmV0dXJuIHRvOwotCi0gIC8vIFNsaWdodGx5IG1vcmUgcXVlc3Rpb25hYmxlLgotICAvLyBTYW1lIGNvZGUgZW1pdHRlZCBieSBHQ0MuCi0gIC8vVG8gdG87Ci0gIC8vbWVtY3B5KCZ0bywgJmZyb20sIHNpemVvZihmcm9tKSk7Ci0gIC8vcmV0dXJuIHRvOwotCi0gIC8vIFRlY2huaWNhbGx5IHVuZGVmaW5lZCwgYnV0IGFsbW9zdCB1bml2ZXJzYWxseSBzdXBwb3J0ZWQsCi0gIC8vIGFuZCB0aGUgbW9zdCBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24uCi0gIHVuaW9uIHsKLSAgICBGcm9tIGY7Ci0gICAgVG8gdDsKLSAgfSB1OwotICB1LmYgPSBmcm9tOwotICByZXR1cm4gdS50OwotfQotCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKLQotI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9fQllURV9PUkRFUgotIyBpZiBkZWZpbmVkKEJZVEVfT1JERVIpICYmIGRlZmluZWQoTElUVExFX0VORElBTikgJiYgZGVmaW5lZChCSUdfRU5ESUFOKQotIyAgZGVmaW5lIF9fQllURV9PUkRFUiBCWVRFX09SREVSCi0jICBkZWZpbmUgX19MSVRUTEVfRU5ESUFOIExJVFRMRV9FTkRJQU4KLSMgIGRlZmluZSBfX0JJR19FTkRJQU4gQklHX0VORElBTgotIyBlbHNlCi0jICBpbmNsdWRlIDxib29zdC9jb25maWcuaHBwPgotIyAgZGVmaW5lIF9fQllURV9PUkRFUiBCT09TVF9CWVRFX09SREVSCi0jICBkZWZpbmUgX19MSVRUTEVfRU5ESUFOIEJPT1NUX0xJVFRMRV9FTkRJQU4KLSMgIGRlZmluZSBfX0JJR19FTkRJQU4gQk9PU1RfQklHX0VORElBTgotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCi0jICBkZWZpbmUgbnRvaGxsKG4pIChuKQotIyAgZGVmaW5lIGh0b25sbChuKSAobikKLSMgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dMSUJDX18pCi0jICBpbmNsdWRlIDxieXRlc3dhcC5oPgotIyAgZGVmaW5lIGh0b2xlbGwobikgYnN3YXBfNjQobikKLSMgIGRlZmluZSBsZXRvaGxsKG4pIGJzd2FwXzY0KG4pCi0jIGVsc2UgLyogR05VQyAmIEdMSUJDICovCi0jICBkZWZpbmUgYnN3YXBfNjQobikgXAotICAgICAgKCAoKChuKSAmIDB4ZmYwMDAwMDAwMDAwMDAwMHVsbCkgPj4gNTYpIFwKLSAgICAgIHwgKCgobikgJiAweDAwZmYwMDAwMDAwMDAwMDB1bGwpID4+IDQwKSBcCi0gICAgICB8ICgoKG4pICYgMHgwMDAwZmYwMDAwMDAwMDAwdWxsKSA+PiAyNCkgXAotICAgICAgfCAoKChuKSAmIDB4MDAwMDAwZmYwMDAwMDAwMHVsbCkgPj4gOCkgIFwKLSAgICAgIHwgKCgobikgJiAweDAwMDAwMDAwZmYwMDAwMDB1bGwpIDw8IDgpICBcCi0gICAgICB8ICgoKG4pICYgMHgwMDAwMDAwMDAwZmYwMDAwdWxsKSA8PCAyNCkgXAotICAgICAgfCAoKChuKSAmIDB4MDAwMDAwMDAwMDAwZmYwMHVsbCkgPDwgNDApIFwKLSAgICAgIHwgKCgobikgJiAweDAwMDAwMDAwMDAwMDAwZmZ1bGwpIDw8IDU2KSApCi0jICBkZWZpbmUgaHRvbGVsbChuKSBic3dhcF82NChuKQotIyAgZGVmaW5lIGxldG9obGwobikgYnN3YXBfNjQobikKLSMgZW5kaWYgLyogR05VQyAmIEdMSUJDICovCi0jZWxpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCi0jICBkZWZpbmUgaHRvbGVsbChuKSAobikKLSMgIGRlZmluZSBsZXRvaGxsKG4pIChuKQotIyBpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fR0xJQkNfXykKLSMgIGluY2x1ZGUgPGJ5dGVzd2FwLmg+Ci0jICBkZWZpbmUgbnRvaGxsKG4pIGJzd2FwXzY0KG4pCi0jICBkZWZpbmUgaHRvbmxsKG4pIGJzd2FwXzY0KG4pCi0jIGVsc2UgLyogR05VQyAmIEdMSUJDICovCi0jICBkZWZpbmUgbnRvaGxsKG4pICggKCgodWludDY0X3QpbnRvaGwobikpIDw8IDMyKSArIG50b2hsKG4gPj4gMzIpICkKLSMgIGRlZmluZSBodG9ubGwobikgKCAoKCh1aW50NjRfdClodG9ubChuKSkgPDwgMzIpICsgaHRvbmwobiA+PiAzMikgKQotIyBlbmRpZiAvKiBHTlVDICYgR0xJQkMgKi8KLSNlbHNlIC8qIF9fQllURV9PUkRFUiAqLwotIyBlcnJvciAiQ2FuJ3QgZGVmaW5lIGh0b25sbCBvciBudG9obGwhIgotI2VuZGlmCi0KLS8qKgotICogRW51bWVyYXRlZCBkZWZpbml0aW9uIG9mIHRoZSB0eXBlcyB0aGF0IHRoZSBUaHJpZnQgcHJvdG9jb2wgc3VwcG9ydHMuCi0gKiBUYWtlIHNwZWNpYWwgbm90ZSBvZiB0aGUgVF9FTkQgdHlwZSB3aGljaCBpcyB1c2VkIHNwZWNpZmljYWxseSB0byBtYXJrCi0gKiB0aGUgZW5kIG9mIGEgc2VxdWVuY2Ugb2YgZmllbGRzLgotICovCi1lbnVtIFRUeXBlIHsKLSAgVF9TVE9QICAgICAgID0gMCwKLSAgVF9WT0lEICAgICAgID0gMSwKLSAgVF9CT09MICAgICAgID0gMiwKLSAgVF9CWVRFICAgICAgID0gMywKLSAgVF9JMDggICAgICAgID0gMywKLSAgVF9JMTYgICAgICAgID0gNiwKLSAgVF9JMzIgICAgICAgID0gOCwKLSAgVF9VNjQgICAgICAgID0gOSwKLSAgVF9JNjQgICAgICAgID0gMTAsCi0gIFRfRE9VQkxFICAgICA9IDQsCi0gIFRfU1RSSU5HICAgICA9IDExLAotICBUX1VURjcgICAgICAgPSAxMSwKLSAgVF9TVFJVQ1QgICAgID0gMTIsCi0gIFRfTUFQICAgICAgICA9IDEzLAotICBUX1NFVCAgICAgICAgPSAxNCwKLSAgVF9MSVNUICAgICAgID0gMTUsCi0gIFRfVVRGOCAgICAgICA9IDE2LAotICBUX1VURjE2ICAgICAgPSAxNwotfTsKLQotLyoqCi0gKiBFbnVtZXJhdGVkIGRlZmluaXRpb24gb2YgdGhlIG1lc3NhZ2UgdHlwZXMgdGhhdCB0aGUgVGhyaWZ0IHByb3RvY29sCi0gKiBzdXBwb3J0cy4KLSAqLwotZW51bSBUTWVzc2FnZVR5cGUgewotICBUX0NBTEwgICAgICAgPSAxLAotICBUX1JFUExZICAgICAgPSAyLAotICBUX0VYQ0VQVElPTiAgPSAzLAotICBUX09ORVdBWSAgICAgPSA0Ci19OwotCi0KLS8qKgotICogSGVscGVyIHRlbXBsYXRlIGZvciBpbXBsZW1lbnRpbmcgVFByb3RvY29sOjpza2lwKCkuCi0gKgotICogVGVtcGxhdGl6ZWQgdG8gYXZvaWQgaGF2aW5nIHRvIG1ha2UgdmlydHVhbCBmdW5jdGlvbiBjYWxscy4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4KLXVpbnQzMl90IHNraXAoUHJvdG9jb2xfJiBwcm90LCBUVHlwZSB0eXBlKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICBjYXNlIFRfQk9PTDoKLSAgICB7Ci0gICAgICBib29sIGJvb2x2OwotICAgICAgcmV0dXJuIHByb3QucmVhZEJvb2woYm9vbHYpOwotICAgIH0KLSAgY2FzZSBUX0JZVEU6Ci0gICAgewotICAgICAgaW50OF90IGJ5dGV2OwotICAgICAgcmV0dXJuIHByb3QucmVhZEJ5dGUoYnl0ZXYpOwotICAgIH0KLSAgY2FzZSBUX0kxNjoKLSAgICB7Ci0gICAgICBpbnQxNl90IGkxNjsKLSAgICAgIHJldHVybiBwcm90LnJlYWRJMTYoaTE2KTsKLSAgICB9Ci0gIGNhc2UgVF9JMzI6Ci0gICAgewotICAgICAgaW50MzJfdCBpMzI7Ci0gICAgICByZXR1cm4gcHJvdC5yZWFkSTMyKGkzMik7Ci0gICAgfQotICBjYXNlIFRfSTY0OgotICAgIHsKLSAgICAgIGludDY0X3QgaTY0OwotICAgICAgcmV0dXJuIHByb3QucmVhZEk2NChpNjQpOwotICAgIH0KLSAgY2FzZSBUX0RPVUJMRToKLSAgICB7Ci0gICAgICBkb3VibGUgZHViOwotICAgICAgcmV0dXJuIHByb3QucmVhZERvdWJsZShkdWIpOwotICAgIH0KLSAgY2FzZSBUX1NUUklORzoKLSAgICB7Ci0gICAgICBzdGQ6OnN0cmluZyBzdHI7Ci0gICAgICByZXR1cm4gcHJvdC5yZWFkQmluYXJ5KHN0cik7Ci0gICAgfQotICBjYXNlIFRfU1RSVUNUOgotICAgIHsKLSAgICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gICAgICBzdGQ6OnN0cmluZyBuYW1lOwotICAgICAgaW50MTZfdCBmaWQ7Ci0gICAgICBUVHlwZSBmdHlwZTsKLSAgICAgIHJlc3VsdCArPSBwcm90LnJlYWRTdHJ1Y3RCZWdpbihuYW1lKTsKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHJlc3VsdCArPSBwcm90LnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZ0eXBlLCBmaWQpOwotICAgICAgICBpZiAoZnR5cGUgPT0gVF9TVE9QKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0ICs9IHNraXAocHJvdCwgZnR5cGUpOwotICAgICAgICByZXN1bHQgKz0gcHJvdC5yZWFkRmllbGRFbmQoKTsKLSAgICAgIH0KLSAgICAgIHJlc3VsdCArPSBwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICBjYXNlIFRfTUFQOgotICAgIHsKLSAgICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gICAgICBUVHlwZSBrZXlUeXBlOwotICAgICAgVFR5cGUgdmFsVHlwZTsKLSAgICAgIHVpbnQzMl90IGksIHNpemU7Ci0gICAgICByZXN1bHQgKz0gcHJvdC5yZWFkTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIHJlc3VsdCArPSBza2lwKHByb3QsIGtleVR5cGUpOwotICAgICAgICByZXN1bHQgKz0gc2tpcChwcm90LCB2YWxUeXBlKTsKLSAgICAgIH0KLSAgICAgIHJlc3VsdCArPSBwcm90LnJlYWRNYXBFbmQoKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICBjYXNlIFRfU0VUOgotICAgIHsKLSAgICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gICAgICBUVHlwZSBlbGVtVHlwZTsKLSAgICAgIHVpbnQzMl90IGksIHNpemU7Ci0gICAgICByZXN1bHQgKz0gcHJvdC5yZWFkU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOwotICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICByZXN1bHQgKz0gc2tpcChwcm90LCBlbGVtVHlwZSk7Ci0gICAgICB9Ci0gICAgICByZXN1bHQgKz0gcHJvdC5yZWFkU2V0RW5kKCk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgY2FzZSBUX0xJU1Q6Ci0gICAgewotICAgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgICAgIFRUeXBlIGVsZW1UeXBlOwotICAgICAgdWludDMyX3QgaSwgc2l6ZTsKLSAgICAgIHJlc3VsdCArPSBwcm90LnJlYWRMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOwotICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICByZXN1bHQgKz0gc2tpcChwcm90LCBlbGVtVHlwZSk7Ci0gICAgICB9Ci0gICAgICByZXN1bHQgKz0gcHJvdC5yZWFkTGlzdEVuZCgpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIGNhc2UgVF9TVE9QOiBjYXNlIFRfVk9JRDogY2FzZSBUX1U2NDogY2FzZSBUX1VURjg6IGNhc2UgVF9VVEYxNjoKLSAgICBicmVhazsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBBYnN0cmFjdCBjbGFzcyBmb3IgYSB0aHJpZnQgcHJvdG9jb2wgZHJpdmVyLiBUaGVzZSBhcmUgYWxsIHRoZSBtZXRob2RzIHRoYXQKLSAqIGEgcHJvdG9jb2wgbXVzdCBpbXBsZW1lbnQuIEVzc2VudGlhbGx5LCB0aGVyZSBtdXN0IGJlIHNvbWUgd2F5IG9mIHJlYWRpbmcKLSAqIGFuZCB3cml0aW5nIGFsbCB0aGUgYmFzZSB0eXBlcywgcGx1cyBhIG1lY2hhbmlzbSBmb3Igd3JpdGluZyBvdXQgc3RydWN0cwotICogd2l0aCBpbmRleGVkIGZpZWxkcy4KLSAqCi0gKiBUUHJvdG9jb2wgb2JqZWN0cyBzaG91bGQgbm90IGJlIHNoYXJlZCBhY3Jvc3MgbXVsdGlwbGUgZW5jb2RpbmcgY29udGV4dHMsCi0gKiBhcyB0aGV5IG1heSBuZWVkIHRvIG1haW50YWluIGludGVybmFsIHN0YXRlIGluIHNvbWUgcHJvdG9jb2xzIChpLmUuIFhNTCkuCi0gKiBOb3RlIHRoYXQgaXMgaXMgYWNjZXB0YWJsZSBmb3IgdGhlIFRQcm90b2NvbCBtb2R1bGUgdG8gZG8gaXRzIG93biBpbnRlcm5hbAotICogYnVmZmVyZWQgcmVhZHMvd3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIFRUcmFuc3BvcnQgd2hlcmUgYXBwcm9wcmlhdGUgKGkuZS4KLSAqIHdoZW4gcGFyc2luZyBhbiBpbnB1dCBYTUwgc3RyZWFtLCByZWFkaW5nIHNob3VsZCBiZSBiYXRjaGVkIHJhdGhlciB0aGFuCi0gKiBsb29raW5nIGFoZWFkIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIgZm9yIGEgY2xvc2UgdGFnKS4KLSAqCi0gKi8KLWNsYXNzIFRQcm90b2NvbCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5UUHJvdG9jb2woKSB7fQotCi0gIC8qKgotICAgKiBXcml0aW5nIGZ1bmN0aW9ucy4KLSAgICovCi0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kX3ZpcnQoKSA9IDA7Ci0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW5fdmlydChjb25zdCBjaGFyKiBuYW1lKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZF92aXJ0KCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luX3ZpcnQoY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkRW5kX3ZpcnQoKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcF92aXJ0KCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNYXBCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwRW5kX3ZpcnQoKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVMaXN0RW5kX3ZpcnQoKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVNldEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU2V0RW5kX3ZpcnQoKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUJvb2xfdmlydChjb25zdCBib29sIHZhbHVlKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUJ5dGVfdmlydChjb25zdCBpbnQ4X3QgYnl0ZSkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJMTZfdmlydChjb25zdCBpbnQxNl90IGkxNikgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJMzJfdmlydChjb25zdCBpbnQzMl90IGkzMikgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJNjRfdmlydChjb25zdCBpbnQ2NF90IGk2NCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVEb3VibGVfdmlydChjb25zdCBkb3VibGUgZHViKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cmluZ192aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQmluYXJ5X3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgPSAwOwotCi0gIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiB3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCk7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmQoKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gd3JpdGVNZXNzYWdlRW5kX3ZpcnQoKTsKLSAgfQotCi0KLSAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gd3JpdGVTdHJ1Y3RCZWdpbl92aXJ0KG5hbWUpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmQoKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gd3JpdGVTdHJ1Y3RFbmRfdmlydCgpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiB3cml0ZUZpZWxkQmVnaW5fdmlydChuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiB3cml0ZUZpZWxkRW5kX3ZpcnQoKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCkgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHdyaXRlRmllbGRTdG9wX3ZpcnQoKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiB3cml0ZU1hcEJlZ2luX3ZpcnQoa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZU1hcEVuZCgpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiB3cml0ZU1hcEVuZF92aXJ0KCk7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHdyaXRlTGlzdEJlZ2luX3ZpcnQoZWxlbVR5cGUsIHNpemUpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCkgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHdyaXRlTGlzdEVuZF92aXJ0KCk7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gd3JpdGVTZXRCZWdpbl92aXJ0KGVsZW1UeXBlLCBzaXplKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlU2V0RW5kKCkgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHdyaXRlU2V0RW5kX3ZpcnQoKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gd3JpdGVCb29sX3ZpcnQodmFsdWUpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gd3JpdGVCeXRlX3ZpcnQoYnl0ZSk7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHdyaXRlSTE2X3ZpcnQoaTE2KTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gd3JpdGVJMzJfdmlydChpMzIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiB3cml0ZUk2NF92aXJ0KGk2NCk7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gd3JpdGVEb3VibGVfdmlydChkdWIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHdyaXRlU3RyaW5nX3ZpcnQoc3RyKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiB3cml0ZUJpbmFyeV92aXJ0KHN0cik7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZGluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTWVzc2FnZUVuZF92aXJ0KCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmRfdmlydCgpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEZpZWxkRW5kX3ZpcnQoKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwQmVnaW5fdmlydChUVHlwZSYga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEVuZF92aXJ0KCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZExpc3RCZWdpbl92aXJ0KFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0RW5kX3ZpcnQoKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkU2V0QmVnaW5fdmlydChUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTZXRFbmRfdmlydCgpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCb29sX3ZpcnQoYm9vbCYgdmFsdWUpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCb29sX3ZpcnQoc3RkOjp2ZWN0b3I8Ym9vbD46OnJlZmVyZW5jZSB2YWx1ZSkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEJ5dGVfdmlydChpbnQ4X3QmIGJ5dGUpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJMTZfdmlydChpbnQxNl90JiBpMTYpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJMzJfdmlydChpbnQzMl90JiBpMzIpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJNjRfdmlydChpbnQ2NF90JiBpNjQpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWREb3VibGVfdmlydChkb3VibGUmIGR1YikgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cmluZ192aXJ0KHN0ZDo6c3RyaW5nJiBzdHIpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCaW5hcnlfdmlydChzdGQ6OnN0cmluZyYgc3RyKSA9IDA7Ci0KLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gcmVhZE1lc3NhZ2VCZWdpbl92aXJ0KG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCk7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkTWVzc2FnZUVuZCgpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiByZWFkTWVzc2FnZUVuZF92aXJ0KCk7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiByZWFkU3RydWN0QmVnaW5fdmlydChuYW1lKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gcmVhZFN0cnVjdEVuZF92aXJ0KCk7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCkgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHJlYWRGaWVsZEJlZ2luX3ZpcnQobmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiByZWFkRmllbGRFbmRfdmlydCgpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiByZWFkTWFwQmVnaW5fdmlydChrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRNYXBFbmQoKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gcmVhZE1hcEVuZF92aXJ0KCk7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiByZWFkTGlzdEJlZ2luX3ZpcnQoZWxlbVR5cGUsIHNpemUpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZExpc3RFbmQoKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gcmVhZExpc3RFbmRfdmlydCgpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiByZWFkU2V0QmVnaW5fdmlydChlbGVtVHlwZSwgc2l6ZSk7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkU2V0RW5kKCkgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHJlYWRTZXRFbmRfdmlydCgpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiByZWFkQm9vbF92aXJ0KHZhbHVlKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRCeXRlKGludDhfdCYgYnl0ZSkgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHJlYWRCeXRlX3ZpcnQoYnl0ZSk7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkSTE2KGludDE2X3QmIGkxNikgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHJlYWRJMTZfdmlydChpMTYpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZEkzMihpbnQzMl90JiBpMzIpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiByZWFkSTMyX3ZpcnQoaTMyKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRJNjQoaW50NjRfdCYgaTY0KSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gcmVhZEk2NF92aXJ0KGk2NCk7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gcmVhZERvdWJsZV92aXJ0KGR1Yik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiByZWFkU3RyaW5nX3ZpcnQoc3RyKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cikgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHJlYWRCaW5hcnlfdmlydChzdHIpOwotICB9Ci0KLSAgLyoKLSAgICogc3RkOjp2ZWN0b3IgaXMgc3BlY2lhbGl6ZWQgZm9yIGJvb2wsIGFuZCBpdHMgZWxlbWVudHMgYXJlIGluZGl2aWR1YWwgYml0cwotICAgKiByYXRoZXIgdGhhbiBib29scy4gICBXZSBuZWVkIHRvIGRlZmluZSBhIGRpZmZlcmVudCB2ZXJzaW9uIG9mIHJlYWRCb29sKCkKLSAgICogdG8gd29yayB3aXRoIHN0ZDo6dmVjdG9yPGJvb2w+LgotICAgKi8KLSAgdWludDMyX3QgcmVhZEJvb2woc3RkOjp2ZWN0b3I8Ym9vbD46OnJlZmVyZW5jZSB2YWx1ZSkgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHJlYWRCb29sX3ZpcnQodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCB0byBhcmJpdHJhcmlseSBza2lwIG92ZXIgZGF0YS4KLSAgICovCi0gIHVpbnQzMl90IHNraXAoVFR5cGUgdHlwZSkgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHNraXBfdmlydCh0eXBlKTsKLSAgfQotICB2aXJ0dWFsIHVpbnQzMl90IHNraXBfdmlydChUVHlwZSB0eXBlKSB7Ci0gICAgcmV0dXJuIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpza2lwKCp0aGlzLCB0eXBlKTsKLSAgfQotCi0gIGlubGluZSBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoKSB7Ci0gICAgcmV0dXJuIHB0cmFuc187Ci0gIH0KLQotICAvLyBUT0RPOiByZW1vdmUgdGhlc2UgdHdvIGNhbGxzLCB0aGV5IGFyZSBmb3IgYmFja3dhcmRzCi0gIC8vIGNvbXBhdGliaWxpdHkKLSAgaW5saW5lIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldElucHV0VHJhbnNwb3J0KCkgewotICAgIHJldHVybiBwdHJhbnNfOwotICB9Ci0gIGlubGluZSBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRPdXRwdXRUcmFuc3BvcnQoKSB7Ci0gICAgcmV0dXJuIHB0cmFuc187Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgVFByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucyk6Ci0gICAgcHRyYW5zXyhwdHJhbnMpIHsKLSAgfQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFuc187Ci0KLSBwcml2YXRlOgotICBUUHJvdG9jb2woKSB7fQotfTsKLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2wgb2JqZWN0cyBnaXZlbiB0cmFuc3BvcnRzLgotICovCi1jbGFzcyBUUHJvdG9jb2xGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIFRQcm90b2NvbEZhY3RvcnkoKSB7fQotCi0gIHZpcnR1YWwgflRQcm90b2NvbEZhY3RvcnkoKSB7fQotCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgPSAwOwotfTsKLQotLyoqCi0gKiBEdW1teSBwcm90b2NvbCBjbGFzcy4KLSAqCi0gKiBUaGlzIGNsYXNzIGRvZXMgbm90aGluZywgYW5kIHNob3VsZCBuZXZlciBiZSBpbnN0YW50aWF0ZWQuCi0gKiBJdCBpcyB1c2VkIG9ubHkgYnkgdGhlIGdlbmVyYXRvciBjb2RlLgotICovCi1jbGFzcyBURHVtbXlQcm90b2NvbCA6IHB1YmxpYyBUUHJvdG9jb2wgewotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAotCi0jZW5kaWYgLy8gI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTF9IXyAxCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDNkM2M4Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTEVYQ0VQVElPTl9IXwotI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTEVYQ0VQVElPTl9IXyAxCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotLyoqCi0gKiBDbGFzcyB0byBlbmNhcHN1bGF0ZSBhbGwgdGhlIHBvc3NpYmxlIHR5cGVzIG9mIHByb3RvY29sIGVycm9ycyB0aGF0IG1heQotICogb2NjdXIgaW4gdmFyaW91cyBwcm90b2NvbCBzeXN0ZW1zLiBUaGlzIHByb3ZpZGVzIGEgc29ydCBvZiBnZW5lcmljCi0gKiB3cmFwcGVyIGFyb3VuZCB0aGUgdmFndWUgVU5JWCBFXyBlcnJvciBjb2RlcyB0aGF0IGxldHMgYSBjb21tb24gY29kZQotICogYmFzZSBvZiBlcnJvciBoYW5kbGluZyB0byBiZSB1c2VkIGZvciB2YXJpb3VzIHR5cGVzIG9mIHByb3RvY29scywgaS5lLgotICogcGlwZXMgZXRjLgotICoKLSAqLwotY2xhc3MgVFByb3RvY29sRXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKLSBwdWJsaWM6Ci0KLSAgLyoqCi0gICAqIEVycm9yIGNvZGVzIGZvciB0aGUgdmFyaW91cyB0eXBlcyBvZiBleGNlcHRpb25zLgotICAgKi8KLSAgZW51bSBUUHJvdG9jb2xFeGNlcHRpb25UeXBlCi0gIHsgVU5LTk9XTiA9IDAKLSAgLCBJTlZBTElEX0RBVEEgPSAxCi0gICwgTkVHQVRJVkVfU0laRSA9IDIKLSAgLCBTSVpFX0xJTUlUID0gMwotICAsIEJBRF9WRVJTSU9OID0gNAotICAsIE5PVF9JTVBMRU1FTlRFRCA9IDUKLSAgfTsKLQotICBUUHJvdG9jb2xFeGNlcHRpb24oKSA6Ci0gICAgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oKSwKLSAgICB0eXBlXyhVTktOT1dOKSB7fQotCi0gIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb25UeXBlIHR5cGUpIDoKLSAgICBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigpLAotICAgIHR5cGVfKHR5cGUpIHt9Ci0KLSAgVFByb3RvY29sRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6Ci0gICAgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24obWVzc2FnZSksCi0gICAgdHlwZV8oVU5LTk9XTikge30KLQotICBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOgotICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLAotICAgIHR5cGVfKHR5cGUpIHt9Ci0KLSAgdmlydHVhbCB+VFByb3RvY29sRXhjZXB0aW9uKCkgdGhyb3coKSB7fQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBlcnJvcgotICAgKiB0aGF0IGhhcyBvY2N1cnJlZC4KLSAgICoKLSAgICogQHJldHVybiBFcnJvciBjb2RlCi0gICAqLwotICBUUHJvdG9jb2xFeGNlcHRpb25UeXBlIGdldFR5cGUoKSB7Ci0gICAgcmV0dXJuIHR5cGVfOwotICB9Ci0KLSAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKSB7Ci0gICAgaWYgKG1lc3NhZ2VfLmVtcHR5KCkpIHsKLSAgICAgIHN3aXRjaCAodHlwZV8pIHsKLSAgICAgICAgY2FzZSBVTktOT1dOICAgICAgICAgOiByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogVW5rbm93biBwcm90b2NvbCBleGNlcHRpb24iOwotICAgICAgICBjYXNlIElOVkFMSURfREFUQSAgICA6IHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiBJbnZhbGlkIGRhdGEiOwotICAgICAgICBjYXNlIE5FR0FUSVZFX1NJWkUgICA6IHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiBOZWdhdGl2ZSBzaXplIjsKLSAgICAgICAgY2FzZSBTSVpFX0xJTUlUICAgICAgOiByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogRXhjZWVkZWQgc2l6ZSBsaW1pdCI7Ci0gICAgICAgIGNhc2UgQkFEX1ZFUlNJT04gICAgIDogcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IEludmFsaWQgdmVyc2lvbiI7Ci0gICAgICAgIGNhc2UgTk9UX0lNUExFTUVOVEVEIDogcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IE5vdCBpbXBsZW1lbnRlZCI7Ci0gICAgICAgIGRlZmF1bHQgICAgICAgICAgICAgIDogcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IChJbnZhbGlkIGV4Y2VwdGlvbiB0eXBlKSI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBtZXNzYWdlXy5jX3N0cigpOwotICAgIH0KLSAgfQotCi0gcHJvdGVjdGVkOgotICAvKioKLSAgICogRXJyb3IgY29kZQotICAgKi8KLSAgVFByb3RvY29sRXhjZXB0aW9uVHlwZSB0eXBlXzsKLQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTEVYQ0VQVElPTl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVFByb3RvY29sVGFwLmggYi9saWIvY3BwL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xUYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc3MmJmZi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xUYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xUQVBfSF8KLSNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xUQVBfSF8gMQotCi0jaW5jbHVkZSA8cHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm90b2NvbCB7Ci0KLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Ci0KLS8qKgotICogUHV0cyBhIHdpcmV0YXAgb24gYSBwcm90b2NvbCBvYmplY3QuICBBbnkgcmVhZHMgdG8gdGhpcyBjbGFzcyBhcmUgcGFzc2VkCi0gKiB0aHJvdWdoIHRvIGFuIGVuY2xvc2VkIHByb3RvY29sIG9iamVjdCwgYnV0IGFsc28gbWlycm9yZWQgYXMgd3JpdGUgdG8gYQotICogc2Vjb25kIHByb3RvY29sIG9iamVjdC4KLSAqCi0gKi8KLWNsYXNzIFRQcm90b2NvbFRhcCA6IHB1YmxpYyBUVmlydHVhbFByb3RvY29sPFRQcm90b2NvbFRhcD4gewotIHB1YmxpYzoKLSAgIFRQcm90b2NvbFRhcChib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNvdXJjZSwKLSAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNpbmspCi0gICAgIDogVFZpcnR1YWxQcm90b2NvbDxUUHJvdG9jb2xUYXA+KHNvdXJjZS0+Z2V0VHJhbnNwb3J0KCkpCi0gICAgICwgc291cmNlXyhzb3VyY2UpCi0gICAgICwgc2lua18oc2luaykKLSAge30KLQotICB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKLSAgICBzaW5rXy0+d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkTWVzc2FnZUVuZCgpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRNZXNzYWdlRW5kKCk7Ci0gICAgc2lua18tPndyaXRlTWVzc2FnZUVuZCgpOwotICAgIHJldHVybiBydjsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSkgewotICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZFN0cnVjdEJlZ2luKG5hbWUpOwotICAgIHNpbmtfLT53cml0ZVN0cnVjdEJlZ2luKG5hbWUuY19zdHIoKSk7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdWludDMyX3QgcmVhZFN0cnVjdEVuZCgpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRTdHJ1Y3RFbmQoKTsKLSAgICBzaW5rXy0+d3JpdGVTdHJ1Y3RFbmQoKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCkgewotICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZEZpZWxkQmVnaW4obmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKTsKLSAgICBpZiAoZmllbGRUeXBlID09IFRfU1RPUCkgewotICAgICAgc2lua18tPndyaXRlRmllbGRTdG9wKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNpbmtfLT53cml0ZUZpZWxkQmVnaW4obmFtZS5jX3N0cigpLCBmaWVsZFR5cGUsIGZpZWxkSWQpOwotICAgIH0KLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotCi0gIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRGaWVsZEVuZCgpOwotICAgIHNpbmtfLT53cml0ZUZpZWxkRW5kKCk7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZE1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOwotICAgIHNpbmtfLT53cml0ZU1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOwotICAgIHJldHVybiBydjsKLSAgfQotCi0KLSAgdWludDMyX3QgcmVhZE1hcEVuZCgpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRNYXBFbmQoKTsKLSAgICBzaW5rXy0+d3JpdGVNYXBFbmQoKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOwotICAgIHNpbmtfLT53cml0ZUxpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLQotICB1aW50MzJfdCByZWFkTGlzdEVuZCgpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRMaXN0RW5kKCk7Ci0gICAgc2lua18tPndyaXRlTGlzdEVuZCgpOwotICAgIHJldHVybiBydjsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOwotICAgIHNpbmtfLT53cml0ZVNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotCi0gIHVpbnQzMl90IHJlYWRTZXRFbmQoKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkU2V0RW5kKCk7Ci0gICAgc2lua18tPndyaXRlU2V0RW5kKCk7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdWludDMyX3QgcmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRCb29sKHZhbHVlKTsKLSAgICBzaW5rXy0+d3JpdGVCb29sKHZhbHVlKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICAvLyBQcm92aWRlIHRoZSBkZWZhdWx0IHJlYWRCb29sKCkgaW1wbGVtZW50YXRpb24gZm9yIHN0ZDo6dmVjdG9yPGJvb2w+Ci0gIHVzaW5nIFRWaXJ0dWFsUHJvdG9jb2w8VFByb3RvY29sVGFwPjo6cmVhZEJvb2w7Ci0KLSAgdWludDMyX3QgcmVhZEJ5dGUoaW50OF90JiBieXRlKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkQnl0ZShieXRlKTsKLSAgICBzaW5rXy0+d3JpdGVCeXRlKGJ5dGUpOwotICAgIHJldHVybiBydjsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRJMTYoaW50MTZfdCYgaTE2KSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkSTE2KGkxNik7Ci0gICAgc2lua18tPndyaXRlSTE2KGkxNik7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdWludDMyX3QgcmVhZEkzMihpbnQzMl90JiBpMzIpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRJMzIoaTMyKTsKLSAgICBzaW5rXy0+d3JpdGVJMzIoaTMyKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkSTY0KGludDY0X3QmIGk2NCkgewotICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZEk2NChpNjQpOwotICAgIHNpbmtfLT53cml0ZUk2NChpNjQpOwotICAgIHJldHVybiBydjsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWREb3VibGUoZHViKTsKLSAgICBzaW5rXy0+d3JpdGVEb3VibGUoZHViKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRTdHJpbmcoc3RyKTsKLSAgICBzaW5rXy0+d3JpdGVTdHJpbmcoc3RyKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRCaW5hcnkoc3RyKTsKLSAgICBzaW5rXy0+d3JpdGVCaW5hcnkoc3RyKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gc291cmNlXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzaW5rXzsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKLQotI2VuZGlmIC8vICNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xUQVBfSF8gMQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzdmNTE5Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UVklSVFVBTFBST1RPQ09MX0hfCi0jZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFZJUlRVQUxQUk9UT0NPTF9IXyAxCi0KLSNpbmNsdWRlIDxwcm90b2NvbC9UUHJvdG9jb2wuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0aGF0IHByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIFRQcm90b2NvbCBtZXRob2RzLgotICoKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIG5vbi12aXJ0dWFsIFRQcm90b2NvbAotICogbWV0aG9kcy4gIEl0IGV4aXN0cyBwcmltYXJpbHkgc28gVFZpcnR1YWxQcm90b2NvbCBjYW4gZGVyaXZlIGZyb20gaXQuICBJdAotICogcHJldmVudHMgVFZpcnR1YWxQcm90b2NvbCBtZXRob2RzIGZyb20gY2F1c2luZyBpbmZpbml0ZSByZWN1cnNpb24gaWYgdGhlCi0gKiBub24tdmlydHVhbCBtZXRob2RzIGFyZSBub3Qgb3ZlcnJpZGRlbiBieSB0aGUgVFZpcnR1YWxQcm90b2NvbCBzdWJjbGFzcy4KLSAqCi0gKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byB1c2UgdGhpcyBjbGFzcyBkaXJlY3RseS4gIFVzZSBUVmlydHVhbFByb3RvY29sCi0gKiBpbnN0ZWFkLgotICovCi1jbGFzcyBUUHJvdG9jb2xEZWZhdWx0cyA6IHB1YmxpYyBUUHJvdG9jb2wgewotIHB1YmxpYzoKLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7Ci0gICAgKHZvaWQpIG5hbWU7Ci0gICAgKHZvaWQpIG1lc3NhZ2VUeXBlOwotICAgICh2b2lkKSBzZXFpZDsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kKCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gICAgKHZvaWQpIG5hbWU7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkU3RydWN0RW5kKCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKLSAgICAodm9pZCkgbmFtZTsKLSAgICAodm9pZCkgZmllbGRUeXBlOwotICAgICh2b2lkKSBmaWVsZElkOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZEZpZWxkRW5kKCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpIHsKLSAgICAodm9pZCkga2V5VHlwZTsKLSAgICAodm9pZCkgdmFsVHlwZTsKLSAgICAodm9pZCkgc2l6ZTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRNYXBFbmQoKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKLSAgICAodm9pZCkgZWxlbVR5cGU7Ci0gICAgKHZvaWQpIHNpemU7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkTGlzdEVuZCgpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7Ci0gICAgKHZvaWQpIGVsZW1UeXBlOwotICAgICh2b2lkKSBzaXplOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZFNldEVuZCgpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKSB7Ci0gICAgKHZvaWQpIHZhbHVlOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZEJvb2woc3RkOjp2ZWN0b3I8Ym9vbD46OnJlZmVyZW5jZSB2YWx1ZSkgewotICAgICh2b2lkKSB2YWx1ZTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRCeXRlKGludDhfdCYgYnl0ZSkgewotICAgICh2b2lkKSBieXRlOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZEkxNihpbnQxNl90JiBpMTYpIHsKLSAgICAodm9pZCkgaTE2OwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZEkzMihpbnQzMl90JiBpMzIpIHsKLSAgICAodm9pZCkgaTMyOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpIHsKLSAgICAodm9pZCkgaTY0OwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZERvdWJsZShkb3VibGUmIGR1YikgewotICAgICh2b2lkKSBkdWI7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICAodm9pZCkgc3RyOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgKHZvaWQpIHN0cjsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKLSAgICAodm9pZCkgbmFtZTsKLSAgICAodm9pZCkgbWVzc2FnZVR5cGU7Ci0gICAgKHZvaWQpIHNlcWlkOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kKCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLQotICB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgICAodm9pZCkgbmFtZTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKLSAgICAodm9pZCkgbmFtZTsKLSAgICAodm9pZCkgZmllbGRUeXBlOwotICAgICh2b2lkKSBmaWVsZElkOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICAgICh2b2lkKSBrZXlUeXBlOwotICAgICh2b2lkKSB2YWxUeXBlOwotICAgICh2b2lkKSBzaXplOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVNYXBFbmQoKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICAgICh2b2lkKSBlbGVtVHlwZTsKLSAgICAodm9pZCkgc2l6ZTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlTGlzdEVuZCgpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgICAodm9pZCkgZWxlbVR5cGU7Ci0gICAgKHZvaWQpIHNpemU7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZVNldEVuZCgpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKSB7Ci0gICAgKHZvaWQpIHZhbHVlOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSB7Ci0gICAgKHZvaWQpIGJ5dGU7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgewotICAgICh2b2lkKSBpMTY7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgewotICAgICh2b2lkKSBpMzI7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgewotICAgICh2b2lkKSBpNjQ7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7Ci0gICAgKHZvaWQpIGR1YjsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICAodm9pZCkgc3RyOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICAgICh2b2lkKSBzdHI7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCBza2lwKFRUeXBlIHR5cGUpIHsKLSAgICByZXR1cm4gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OnNraXAoKnRoaXMsIHR5cGUpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIFRQcm90b2NvbERlZmF1bHRzKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykKLSAgICA6IFRQcm90b2NvbChwdHJhbnMpCi0gIHt9Ci19OwotCi0vKioKLSAqIENvbmNyZXRlIFRQcm90b2NvbCBjbGFzc2VzIHNob3VsZCBpbmhlcml0IGZyb20gVFZpcnR1YWxQcm90b2NvbAotICogc28gdGhleSBkb24ndCBoYXZlIHRvIG1hbnVhbGx5IG92ZXJyaWRlIHZpcnR1YWwgbWV0aG9kcy4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXywgY2xhc3MgU3VwZXJfPVRQcm90b2NvbERlZmF1bHRzPgotY2xhc3MgVFZpcnR1YWxQcm90b2NvbCA6IHB1YmxpYyBTdXBlcl8gewotIHB1YmxpYzoKLSAgLyoqCi0gICAqIFdyaXRpbmcgZnVuY3Rpb25zLgotICAgKi8KLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luX3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kX3ZpcnQoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZU1lc3NhZ2VFbmQoKTsKLSAgfQotCi0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luX3ZpcnQoY29uc3QgY2hhciogbmFtZSkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVTdHJ1Y3RCZWdpbihuYW1lKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmRfdmlydCgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlU3RydWN0RW5kKCk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbl92aXJ0KGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElkKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZEVuZF92aXJ0KCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVGaWVsZEVuZCgpOwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcF92aXJ0KCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVGaWVsZFN0b3AoKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNYXBCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwRW5kX3ZpcnQoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZU1hcEVuZCgpOwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUxpc3RFbmRfdmlydCgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlTGlzdEVuZCgpOwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVNldEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVNldEVuZF92aXJ0KCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVTZXRFbmQoKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCb29sX3ZpcnQoY29uc3QgYm9vbCB2YWx1ZSkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVCb29sKHZhbHVlKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCeXRlX3ZpcnQoY29uc3QgaW50OF90IGJ5dGUpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlQnl0ZShieXRlKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJMTZfdmlydChjb25zdCBpbnQxNl90IGkxNikgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVJMTYoaTE2KTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJMzJfdmlydChjb25zdCBpbnQzMl90IGkzMikgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVJMzIoaTMyKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJNjRfdmlydChjb25zdCBpbnQ2NF90IGk2NCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVJNjQoaTY0KTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVEb3VibGVfdmlydChjb25zdCBkb3VibGUgZHViKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZURvdWJsZShkdWIpOwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cmluZ192aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlU3RyaW5nKHN0cik7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQmluYXJ5X3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVCaW5hcnkoc3RyKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW5fdmlydChzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmRfdmlydCgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRNZXNzYWdlRW5kKCk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkU3RydWN0QmVnaW4obmFtZSk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmRfdmlydCgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRTdHJ1Y3RFbmQoKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEZpZWxkQmVnaW5fdmlydChzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElkKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEZpZWxkRW5kX3ZpcnQoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkRmllbGRFbmQoKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEJlZ2luX3ZpcnQoVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEVuZF92aXJ0KCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZE1hcEVuZCgpOwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTGlzdEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZExpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0RW5kX3ZpcnQoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkTGlzdEVuZCgpOwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkU2V0QmVnaW5fdmlydChUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTZXRFbmRfdmlydCgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRTZXRFbmQoKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEJvb2xfdmlydChib29sJiB2YWx1ZSkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEJvb2wodmFsdWUpOwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkQm9vbF92aXJ0KHN0ZDo6dmVjdG9yPGJvb2w+OjpyZWZlcmVuY2UgdmFsdWUpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRCb29sKHZhbHVlKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEJ5dGVfdmlydChpbnQ4X3QmIGJ5dGUpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRCeXRlKGJ5dGUpOwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkSTE2X3ZpcnQoaW50MTZfdCYgaTE2KSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkSTE2KGkxNik7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJMzJfdmlydChpbnQzMl90JiBpMzIpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRJMzIoaTMyKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEk2NF92aXJ0KGludDY0X3QmIGk2NCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEk2NChpNjQpOwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkRG91YmxlX3ZpcnQoZG91YmxlJiBkdWIpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWREb3VibGUoZHViKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cmluZ192aXJ0KHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRTdHJpbmcoc3RyKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEJpbmFyeV92aXJ0KHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRCaW5hcnkoc3RyKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3Qgc2tpcF92aXJ0KFRUeXBlIHR5cGUpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnNraXAodHlwZSk7Ci0gIH0KLQotICAvKgotICAgKiBQcm92aWRlIGEgZGVmYXVsdCBza2lwKCkgaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIG5vbi12aXJ0dWFsIHJlYWQKLSAgICogbWV0aG9kcy4KLSAgICoKLSAgICogTm90ZTogc3ViY2xhc3NlcyB0aGF0IHVzZSBUVmlydHVhbFByb3RvY29sIHRvIGRlcml2ZSBmcm9tIGFub3RoZXIgcHJvdG9jb2wKLSAgICogaW1wbGVtZW50YXRpb24gKGkuZS4sIG5vdCBUUHJvdG9jb2xEZWZhdWx0cykgc2hvdWxkIGJld2FyZSB0aGF0IHRoaXMgbWF5Ci0gICAqIG92ZXJyaWRlIGFueSBub24tZGVmYXVsdCBza2lwKCkgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhlIHBhcmVudAotICAgKiB0cmFuc3BvcnQgY2xhc3MuICBUaGV5IG1heSBuZWVkIHRvIGV4cGxpY2l0bHkgcmVkZWZpbmUgc2tpcCgpIHRvIGNhbGwgdGhlCi0gICAqIGNvcnJlY3QgcGFyZW50IGltcGxlbWVudGF0aW9uLCBpZiBkZXNpcmVkLgotICAgKi8KLSAgdWludDMyX3Qgc2tpcChUVHlwZSB0eXBlKSB7Ci0gICAgUHJvdG9jb2xfKiBjb25zdCBwcm90ID0gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyk7Ci0gICAgcmV0dXJuIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpza2lwKCpwcm90LCB0eXBlKTsKLSAgfQotCi0gIC8qCi0gICAqIFByb3ZpZGUgYSBkZWZhdWx0IHJlYWRCb29sKCkgaW1wbGVtZW50YXRpb24gZm9yIHVzZSB3aXRoCi0gICAqIHN0ZDo6dmVjdG9yPGJvb2w+LCB0aGF0IGJlaGF2ZXMgdGhlIHNhbWUgYXMgcmVhZGluZyBpbnRvIGEgbm9ybWFsIGJvb2wuCi0gICAqCi0gICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgaWYgZGVzaXJlZCwgYnV0IHRoZXJlIG5vcm1hbGx5IHNob3VsZG4ndAotICAgKiBiZSBhIG5lZWQgdG8uCi0gICAqLwotICB1aW50MzJfdCByZWFkQm9vbChzdGQ6OnZlY3Rvcjxib29sPjo6cmVmZXJlbmNlIHZhbHVlKSB7Ci0gICAgYm9vbCBiID0gZmFsc2U7Ci0gICAgdWludDMyX3QgcmV0ID0gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRCb29sKGIpOwotICAgIHZhbHVlID0gYjsKLSAgICByZXR1cm4gcmV0OwotICB9Ci0gIHVzaW5nIFN1cGVyXzo6cmVhZEJvb2w7IC8vIHNvIHdlIGRvbid0IGhpZGUgcmVhZEJvb2woYm9vbCYpCi0KLSBwcm90ZWN0ZWQ6Ci0gIFRWaXJ0dWFsUHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKQotICAgIDogU3VwZXJfKHB0cmFucykKLSAge30KLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKLQotI2VuZGlmIC8vICNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UVklSVFVBTFBST1RPQ09MX0hfIDEKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZTlhZmQuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiVE5vbmJsb2NraW5nU2VydmVyLmgiCi0jaW5jbHVkZSA8Y29uY3VycmVuY3kvRXhjZXB0aW9uLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTb2NrZXQuaD4KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfTkVUSU5FVF9JTl9ICi0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfTkVUREJfSAotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2lmbmRlZiBBRl9MT0NBTAotI2RlZmluZSBBRl9MT0NBTCBBRl9VTklYCi0jZW5kaWYKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKLQotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU29ja2V0OwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKLQotY2xhc3MgVENvbm5lY3Rpb246OlRhc2s6IHB1YmxpYyBSdW5uYWJsZSB7Ci0gcHVibGljOgotICBUYXNrKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAotICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0LAotICAgICAgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uKSA6Ci0gICAgcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAotICAgIGlucHV0XyhpbnB1dCksCi0gICAgb3V0cHV0XyhvdXRwdXQpLAotICAgIGNvbm5lY3Rpb25fKGNvbm5lY3Rpb24pLAotICAgIHNlcnZlckV2ZW50SGFuZGxlcl8oY29ubmVjdGlvbl8tPmdldFNlcnZlckV2ZW50SGFuZGxlcigpKSwKLSAgICBjb25uZWN0aW9uQ29udGV4dF8oY29ubmVjdGlvbl8tPmdldENvbm5lY3Rpb25Db250ZXh0KCkpIHt9Ci0KLSAgdm9pZCBydW4oKSB7Ci0gICAgdHJ5IHsKLSAgICAgIGZvciAoOzspIHsKLSAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlcl8gIT0gTlVMTCkgewotICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlcl8tPnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0XywgY29ubmVjdGlvbl8tPmdldFRTb2NrZXQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0Xywgb3V0cHV0XywgY29ubmVjdGlvbkNvbnRleHRfKSB8fAotICAgICAgICAgICAgIWlucHV0Xy0+Z2V0VHJhbnNwb3J0KCktPnBlZWsoKSkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBjZXJyIDw8ICJUTm9uYmxvY2tpbmdTZXJ2ZXIgY2xpZW50IGRpZWQ6ICIgPDwgdHR4LndoYXQoKSA8PCBlbmRsOwotICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIHgpIHsKLSAgICAgIGNlcnIgPDwgIlROb25ibG9ja2luZ1NlcnZlciBleGNlcHRpb246ICIgPDwgeC53aGF0KCkgPDwgZW5kbDsKLSAgICB9IGNhdGNoIChiYWRfYWxsb2MmKSB7Ci0gICAgICBjZXJyIDw8ICJUTm9uYmxvY2tpbmdTZXJ2ZXIgY2F1Z2h0IGJhZF9hbGxvYyBleGNlcHRpb24uIjsKLSAgICAgIGV4aXQoLTEpOwotICAgIH0gY2F0Y2ggKC4uLikgewotICAgICAgY2VyciA8PCAiVE5vbmJsb2NraW5nU2VydmVyIHVuY2F1Z2h0IGV4Y2VwdGlvbi4iIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gU2lnbmFsIGNvbXBsZXRpb24gYmFjayB0byB0aGUgbGliZXZlbnQgdGhyZWFkIHZpYSBhIHBpcGUKLSAgICBpZiAoIWNvbm5lY3Rpb25fLT5ub3RpZnlTZXJ2ZXIoKSkgewotICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpUYXNrOjpydW46IGZhaWxlZCB3cml0ZSBvbiBub3RpZnkgcGlwZSIpOwotICAgIH0KLSAgfQotCi0gIFRDb25uZWN0aW9uKiBnZXRUQ29ubmVjdGlvbigpIHsKLSAgICByZXR1cm4gY29ubmVjdGlvbl87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dF87Ci0gIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gc2VydmVyRXZlbnRIYW5kbGVyXzsKLSAgdm9pZCogY29ubmVjdGlvbkNvbnRleHRfOwotfTsKLQotdm9pZCBUQ29ubmVjdGlvbjo6aW5pdChpbnQgc29ja2V0LCBzaG9ydCBldmVudEZsYWdzLCBUTm9uYmxvY2tpbmdTZXJ2ZXIqIHMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvY2thZGRyKiBhZGRyLCBzb2NrbGVuX3QgYWRkckxlbikgewotICB0U29ja2V0Xy0+c2V0U29ja2V0RkQoc29ja2V0KTsKLSAgdFNvY2tldF8tPnNldENhY2hlZEFkZHJlc3MoYWRkciwgYWRkckxlbik7Ci0KLSAgc2VydmVyXyA9IHM7Ci0gIGFwcFN0YXRlXyA9IEFQUF9JTklUOwotICBldmVudEZsYWdzXyA9IDA7Ci0KLSAgcmVhZEJ1ZmZlclBvc18gPSAwOwotICByZWFkV2FudF8gPSAwOwotCi0gIHdyaXRlQnVmZmVyXyA9IE5VTEw7Ci0gIHdyaXRlQnVmZmVyU2l6ZV8gPSAwOwotICB3cml0ZUJ1ZmZlclBvc18gPSAwOwotICBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXyA9IDA7Ci0KLSAgc29ja2V0U3RhdGVfID0gU09DS0VUX1JFQ1ZfRlJBTUlORzsKLSAgYXBwU3RhdGVfID0gQVBQX0lOSVQ7Ci0gIGNhbGxzRm9yUmVzaXplXyA9IDA7Ci0KLSAgLy8gU2V0IGZsYWdzLCB3aGljaCBhbHNvIHJlZ2lzdGVycyB0aGUgZXZlbnQKLSAgc2V0RmxhZ3MoZXZlbnRGbGFncyk7Ci0KLSAgLy8gZ2V0IGlucHV0L3RyYW5zcG9ydHMKLSAgZmFjdG9yeUlucHV0VHJhbnNwb3J0XyA9IHMtPmdldElucHV0VHJhbnNwb3J0RmFjdG9yeSgpLT5nZXRUcmFuc3BvcnQoaW5wdXRUcmFuc3BvcnRfKTsKLSAgZmFjdG9yeU91dHB1dFRyYW5zcG9ydF8gPSBzLT5nZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KCktPmdldFRyYW5zcG9ydChvdXRwdXRUcmFuc3BvcnRfKTsKLQotICAvLyBDcmVhdGUgcHJvdG9jb2wKLSAgaW5wdXRQcm90b2NvbF8gPSBzLT5nZXRJbnB1dFByb3RvY29sRmFjdG9yeSgpLT5nZXRQcm90b2NvbChmYWN0b3J5SW5wdXRUcmFuc3BvcnRfKTsKLSAgb3V0cHV0UHJvdG9jb2xfID0gcy0+Z2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KCktPmdldFByb3RvY29sKGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfKTsKLQotICAvLyBTZXQgdXAgZm9yIGFueSBzZXJ2ZXIgZXZlbnQgaGFuZGxlcgotICBzZXJ2ZXJFdmVudEhhbmRsZXJfID0gc2VydmVyXy0+Z2V0RXZlbnRIYW5kbGVyKCk7Ci0gIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXJfICE9IE5VTEwpIHsKLSAgICBjb25uZWN0aW9uQ29udGV4dF8gPSBzZXJ2ZXJFdmVudEhhbmRsZXJfLT5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8pOwotICB9IGVsc2UgewotICAgIGNvbm5lY3Rpb25Db250ZXh0XyA9IE5VTEw7Ci0gIH0KLX0KLQotdm9pZCBUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpIHsKLSAgaW50IGdvdD0wLCBsZWZ0PTAsIHNlbnQ9MDsKLSAgdWludDMyX3QgZmV0Y2ggPSAwOwotCi0gIHN3aXRjaCAoc29ja2V0U3RhdGVfKSB7Ci0gIGNhc2UgU09DS0VUX1JFQ1ZfRlJBTUlORzoKLSAgICB1bmlvbiB7Ci0gICAgICB1aW50OF90IGJ1ZltzaXplb2YodWludDMyX3QpXTsKLSAgICAgIGludDMyX3Qgc2l6ZTsKLSAgICB9IGZyYW1pbmc7Ci0KLSAgICAvLyBpZiB3ZSd2ZSBhbHJlYWR5IHJlY2VpdmVkIHNvbWUgYnl0ZXMgd2Uga2VwdCB0aGVtIGhlcmUKLSAgICBmcmFtaW5nLnNpemUgPSByZWFkV2FudF87Ci0gICAgLy8gZGV0ZXJtaW5lIHNpemUgb2YgdGhpcyBmcmFtZQotICAgIHRyeSB7Ci0gICAgICAvLyBSZWFkIGZyb20gdGhlIHNvY2tldAotICAgICAgZmV0Y2ggPSB0U29ja2V0Xy0+cmVhZCgmZnJhbWluZy5idWZbcmVhZEJ1ZmZlclBvc19dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdChzaXplb2YoZnJhbWluZy5zaXplKSAtIHJlYWRCdWZmZXJQb3NfKSk7Ci0gICAgICBpZiAoZmV0Y2ggPT0gMCkgewotICAgICAgICAvLyBXaGVuZXZlciB3ZSBnZXQgaGVyZSBpdCBtZWFucyBhIHJlbW90ZSBkaXNjb25uZWN0Ci0gICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHJlYWRCdWZmZXJQb3NfICs9IGZldGNoOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHRlKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpOiAlcyIsIHRlLndoYXQoKSk7Ci0gICAgICBjbG9zZSgpOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHJlYWRCdWZmZXJQb3NfIDwgc2l6ZW9mKGZyYW1pbmcuc2l6ZSkpIHsKLSAgICAgIC8vIG1vcmUgbmVlZGVkIGJlZm9yZSBmcmFtZSBzaXplIGlzIGtub3duIC0tIHNhdmUgd2hhdCB3ZSBoYXZlIHNvIGZhcgotICAgICAgcmVhZFdhbnRfID0gZnJhbWluZy5zaXplOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHJlYWRXYW50XyA9IG50b2hsKGZyYW1pbmcuc2l6ZSk7Ci0gICAgaWYgKHN0YXRpY19jYXN0PGludD4ocmVhZFdhbnRfKSA8PSAwKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUQ29ubmVjdGlvbjp3b3JrU29ja2V0KCkgTmVnYXRpdmUgZnJhbWUgc2l6ZSAlZCwgcmVtb3RlIHNpZGUgbm90IHVzaW5nIFRGcmFtZWRUcmFuc3BvcnQ/Iiwgc3RhdGljX2Nhc3Q8aW50PihyZWFkV2FudF8pKTsKLSAgICAgIGNsb3NlKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIHNpemUga25vd247IG5vdyBnZXQgdGhlIHJlc3Qgb2YgdGhlIGZyYW1lCi0gICAgdHJhbnNpdGlvbigpOwotICAgIHJldHVybjsKLQotICBjYXNlIFNPQ0tFVF9SRUNWOgotICAgIC8vIEl0IGlzIGFuIGVycm9yIHRvIGJlIGluIHRoaXMgc3RhdGUgaWYgd2UgYWxyZWFkeSBoYXZlIGFsbCB0aGUgZGF0YQotICAgIGFzc2VydChyZWFkQnVmZmVyUG9zXyA8IHJlYWRXYW50Xyk7Ci0KLSAgICB0cnkgewotICAgICAgLy8gUmVhZCBmcm9tIHRoZSBzb2NrZXQKLSAgICAgIGZldGNoID0gcmVhZFdhbnRfIC0gcmVhZEJ1ZmZlclBvc187Ci0gICAgICBnb3QgPSB0U29ja2V0Xy0+cmVhZChyZWFkQnVmZmVyXyArIHJlYWRCdWZmZXJQb3NfLCBmZXRjaCk7Ci0gICAgfQotICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0ZSkgewotICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVENvbm5lY3Rpb246OndvcmtTb2NrZXQoKTogJXMiLCB0ZS53aGF0KCkpOwotICAgICAgY2xvc2UoKTsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAgICAgCi0gICAgaWYgKGdvdCA+IDApIHsKLSAgICAgIC8vIE1vdmUgYWxvbmcgaW4gdGhlIGJ1ZmZlcgotICAgICAgcmVhZEJ1ZmZlclBvc18gKz0gZ290OwotCi0gICAgICAvLyBDaGVjayB0aGF0IHdlIGRpZCBub3Qgb3ZlcmRvIGl0Ci0gICAgICBhc3NlcnQocmVhZEJ1ZmZlclBvc18gPD0gcmVhZFdhbnRfKTsKLQotICAgICAgLy8gV2UgYXJlIGRvbmUgcmVhZGluZywgbW92ZSBvbnRvIHRoZSBuZXh0IHN0YXRlCi0gICAgICBpZiAocmVhZEJ1ZmZlclBvc18gPT0gcmVhZFdhbnRfKSB7Ci0gICAgICAgIHRyYW5zaXRpb24oKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBXaGVuZXZlciB3ZSBnZXQgZG93biBoZXJlIGl0IG1lYW5zIGEgcmVtb3RlIGRpc2Nvbm5lY3QKLSAgICBjbG9zZSgpOwotCi0gICAgcmV0dXJuOwotCi0gIGNhc2UgU09DS0VUX1NFTkQ6Ci0gICAgLy8gU2hvdWxkIG5ldmVyIGhhdmUgcG9zaXRpb24gcGFzdCBzaXplCi0gICAgYXNzZXJ0KHdyaXRlQnVmZmVyUG9zXyA8PSB3cml0ZUJ1ZmZlclNpemVfKTsKLQotICAgIC8vIElmIHRoZXJlIGlzIG5vIGRhdGEgdG8gc2VuZCwgdGhlbiBsZXQgdXMgbW92ZSBvbgotICAgIGlmICh3cml0ZUJ1ZmZlclBvc18gPT0gd3JpdGVCdWZmZXJTaXplXykgewotICAgICAgR2xvYmFsT3V0cHV0KCJXQVJOSU5HOiBTZW5kIHN0YXRlIHdpdGggbm8gZGF0YSB0byBzZW5kXG4iKTsKLSAgICAgIHRyYW5zaXRpb24oKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgbGVmdCA9IHdyaXRlQnVmZmVyU2l6ZV8gLSB3cml0ZUJ1ZmZlclBvc187Ci0gICAgICBzZW50ID0gdFNvY2tldF8tPndyaXRlX3BhcnRpYWwod3JpdGVCdWZmZXJfICsgd3JpdGVCdWZmZXJQb3NfLCBsZWZ0KTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHRlKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpOiAlcyAiLCB0ZS53aGF0KCkpOwotICAgICAgY2xvc2UoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB3cml0ZUJ1ZmZlclBvc18gKz0gc2VudDsKLQotICAgIC8vIERpZCB3ZSBvdmVyZG8gaXQ/Ci0gICAgYXNzZXJ0KHdyaXRlQnVmZmVyUG9zXyA8PSB3cml0ZUJ1ZmZlclNpemVfKTsKLQotICAgIC8vIFdlIGFyZSBkb25lIQotICAgIGlmICh3cml0ZUJ1ZmZlclBvc18gPT0gd3JpdGVCdWZmZXJTaXplXykgewotICAgICAgdHJhbnNpdGlvbigpOwotICAgIH0KLQotICAgIHJldHVybjsKLQotICBkZWZhdWx0OgotICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlVuZXhwZWN0ZWQgU29ja2V0IFN0YXRlICVkIiwgc29ja2V0U3RhdGVfKTsKLSAgICBhc3NlcnQoMCk7Ci0gIH0KLX0KLQotLyoqCi0gKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiB0cmFuc2l0aW9ucyBmcm9tIG9uZSBzdGF0ZSBpbnRvCi0gKiBhbm90aGVyLiBUaGlzIG1lYW5zIHRoYXQgaXQgaGFzIGZpbmlzaGVkIHdyaXRpbmcgdGhlIGRhdGEgdGhhdCBpdCBuZWVkZWQKLSAqIHRvLCBvciBmaW5pc2hlZCByZWNlaXZpbmcgdGhlIGRhdGEgdGhhdCBpdCBuZWVkZWQgdG8uCi0gKi8KLXZvaWQgVENvbm5lY3Rpb246OnRyYW5zaXRpb24oKSB7Ci0gIC8vIFN3aXRjaCB1cG9uIHRoZSBzdGF0ZSB0aGF0IHdlIGFyZSBjdXJyZW50bHkgaW4gYW5kIG1vdmUgdG8gYSBuZXcgc3RhdGUKLSAgc3dpdGNoIChhcHBTdGF0ZV8pIHsKLQotICBjYXNlIEFQUF9SRUFEX1JFUVVFU1Q6Ci0gICAgLy8gV2UgYXJlIGRvbmUgcmVhZGluZyB0aGUgcmVxdWVzdCwgcGFja2FnZSB0aGUgcmVhZCBidWZmZXIgaW50byB0cmFuc3BvcnQKLSAgICAvLyBhbmQgZ2V0IGJhY2sgc29tZSBkYXRhIGZyb20gdGhlIGRpc3BhdGNoIGZ1bmN0aW9uCi0gICAgaW5wdXRUcmFuc3BvcnRfLT5yZXNldEJ1ZmZlcihyZWFkQnVmZmVyXywgcmVhZEJ1ZmZlclBvc18pOwotICAgIG91dHB1dFRyYW5zcG9ydF8tPnJlc2V0QnVmZmVyKCk7Ci0gICAgLy8gUHJlcGVuZCBmb3VyIGJ5dGVzIG9mIGJsYW5rIHNwYWNlIHRvIHRoZSBidWZmZXIgc28gd2UgY2FuCi0gICAgLy8gd3JpdGUgdGhlIGZyYW1lIHNpemUgdGhlcmUgbGF0ZXIuCi0gICAgb3V0cHV0VHJhbnNwb3J0Xy0+Z2V0V3JpdGVQdHIoNCk7Ci0gICAgb3V0cHV0VHJhbnNwb3J0Xy0+d3JvdGVCeXRlcyg0KTsKLQotICAgIHNlcnZlcl8tPmluY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKLQotICAgIGlmIChzZXJ2ZXJfLT5pc1RocmVhZFBvb2xQcm9jZXNzaW5nKCkpIHsKLSAgICAgIC8vIFdlIGFyZSBzZXR0aW5nIHVwIGEgVGFzayB0byBkbyB0aGlzIHdvcmsgYW5kIHdlIHdpbGwgd2FpdCBvbiBpdAotCi0gICAgICAvLyBDcmVhdGUgdGFzayBhbmQgZGlzcGF0Y2ggdG8gdGhlIHRocmVhZCBtYW5hZ2VyCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayA9Ci0gICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPihuZXcgVGFzayhzZXJ2ZXJfLT5nZXRQcm9jZXNzb3IoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcykpOwotICAgICAgLy8gVGhlIGFwcGxpY2F0aW9uIGlzIG5vdyB3YWl0aW5nIG9uIHRoZSB0YXNrIHRvIGZpbmlzaAotICAgICAgYXBwU3RhdGVfID0gQVBQX1dBSVRfVEFTSzsKLQotICAgICAgICB0cnkgewotICAgICAgICAgIHNlcnZlcl8tPmFkZFRhc2sodGFzayk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiAmIGlzZSkgewotICAgICAgICAgIC8vIFRoZSBUaHJlYWRNYW5hZ2VyIGlzIG5vdCByZWFkeSB0byBoYW5kbGUgYW55IG1vcmUgdGFza3MgKGl0J3MgcHJvYmFibHkgc2h1dHRpbmcgZG93bikuCi0gICAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiSWxsZWdhbFN0YXRlRXhjZXB0aW9uOiBTZXJ2ZXI6OnByb2Nlc3MoKSAlcyIsIGlzZS53aGF0KCkpOwotICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgLy8gU2V0IHRoaXMgY29ubmVjdGlvbiBpZGxlIHNvIHRoYXQgbGliZXZlbnQgZG9lc24ndCBwcm9jZXNzIG1vcmUKLSAgICAgIC8vIGRhdGEgb24gaXQgd2hpbGUgd2UncmUgc3RpbGwgd2FpdGluZyBmb3IgdGhlIHRocmVhZG1hbmFnZXIgdG8KLSAgICAgIC8vIGZpbmlzaCB0aGlzIHRhc2sKLSAgICAgIHNldElkbGUoKTsKLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgewotICAgICAgdHJ5IHsKLSAgICAgICAgLy8gSW52b2tlIHRoZSBwcm9jZXNzb3IKLSAgICAgICAgc2VydmVyXy0+Z2V0UHJvY2Vzc29yKCktPnByb2Nlc3MoaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXywgTlVMTCk7Ci0gICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICZ0dHgpIHsKLSAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVFRyYW5zcG9ydEV4Y2VwdGlvbjogU2VydmVyOjpwcm9jZXNzKCkgJXMiLCB0dHgud2hhdCgpKTsKLSAgICAgICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOwotICAgICAgICBjbG9zZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9IGNhdGNoIChURXhjZXB0aW9uICZ4KSB7Ci0gICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlRFeGNlcHRpb246IFNlcnZlcjo6cHJvY2VzcygpICVzIiwgeC53aGF0KCkpOwotICAgICAgICBzZXJ2ZXJfLT5kZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7Ci0gICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0gY2F0Y2ggKC4uLikgewotICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJTZXJ2ZXI6OnByb2Nlc3MoKSB1bmtub3duIGV4Y2VwdGlvbiIpOwotICAgICAgICBzZXJ2ZXJfLT5kZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7Ci0gICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJbnRlbnRpb25hbGx5IGZhbGwgdGhyb3VnaCBoZXJlLCB0aGUgY2FsbCB0byBwcm9jZXNzIGhhcyB3cml0dGVuIGludG8KLSAgICAvLyB0aGUgd3JpdGVCdWZmZXJfCi0KLSAgY2FzZSBBUFBfV0FJVF9UQVNLOgotICAgIC8vIFdlIGhhdmUgbm93IGZpbmlzaGVkIHByb2Nlc3NpbmcgYSB0YXNrIGFuZCB0aGUgcmVzdWx0IGhhcyBiZWVuIHdyaXR0ZW4KLSAgICAvLyBpbnRvIHRoZSBvdXRwdXRUcmFuc3BvcnRfLCBzbyB3ZSBncmFiIGl0cyBjb250ZW50cyBhbmQgcGxhY2UgdGhlbSBpbnRvCi0gICAgLy8gdGhlIHdyaXRlQnVmZmVyXyBmb3IgYWN0dWFsIHdyaXRpbmcgYnkgdGhlIGxpYmV2ZW50IHRocmVhZAotCi0gICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOwotICAgIC8vIEdldCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24KLSAgICBvdXRwdXRUcmFuc3BvcnRfLT5nZXRCdWZmZXIoJndyaXRlQnVmZmVyXywgJndyaXRlQnVmZmVyU2l6ZV8pOwotCi0gICAgLy8gSWYgdGhlIGZ1bmN0aW9uIGNhbGwgZ2VuZXJhdGVkIHJldHVybiBkYXRhLCB0aGVuIG1vdmUgaW50byB0aGUgc2VuZAotICAgIC8vIHN0YXRlIGFuZCBnZXQgZ29pbmcKLSAgICAvLyA0IGJ5dGVzIHdlcmUgcmVzZXJ2ZWQgZm9yIGZyYW1lIHNpemUKLSAgICBpZiAod3JpdGVCdWZmZXJTaXplXyA+IDQpIHsKLQotICAgICAgLy8gTW92ZSBpbnRvIHdyaXRlIHN0YXRlCi0gICAgICB3cml0ZUJ1ZmZlclBvc18gPSAwOwotICAgICAgc29ja2V0U3RhdGVfID0gU09DS0VUX1NFTkQ7Ci0KLSAgICAgIC8vIFB1dCB0aGUgZnJhbWUgc2l6ZSBpbnRvIHRoZSB3cml0ZSBidWZmZXIKLSAgICAgIGludDMyX3QgZnJhbWVTaXplID0gKGludDMyX3QpaHRvbmwod3JpdGVCdWZmZXJTaXplXyAtIDQpOwotICAgICAgbWVtY3B5KHdyaXRlQnVmZmVyXywgJmZyYW1lU2l6ZSwgNCk7Ci0KLSAgICAgIC8vIFNvY2tldCBpbnRvIHdyaXRlIG1vZGUKLSAgICAgIGFwcFN0YXRlXyA9IEFQUF9TRU5EX1JFU1VMVDsKLSAgICAgIHNldFdyaXRlKCk7Ci0KLSAgICAgIC8vIFRyeSB0byB3b3JrIHRoZSBzb2NrZXQgaW1tZWRpYXRlbHkKLSAgICAgIC8vIHdvcmtTb2NrZXQoKTsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIHJlcXVlc3Qgd2FzIG9uZXdheSBhbmQgd2Ugc2hvdWxkIGZhbGwgdGhyb3VnaAotICAgIC8vIHJpZ2h0IGJhY2sgaW50byB0aGUgcmVhZCBmcmFtZSBoZWFkZXIgc3RhdGUKLSAgICBnb3RvIExBQkVMX0FQUF9JTklUOwotCi0gIGNhc2UgQVBQX1NFTkRfUkVTVUxUOgotICAgIC8vIGl0J3Mgbm93IHNhZmUgdG8gcGVyZm9ybSBidWZmZXIgc2l6ZSBob3VzZWtlZXBpbmcuCi0gICAgaWYgKHdyaXRlQnVmZmVyU2l6ZV8gPiBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXykgewotICAgICAgbGFyZ2VzdFdyaXRlQnVmZmVyU2l6ZV8gPSB3cml0ZUJ1ZmZlclNpemVfOwotICAgIH0KLSAgICBpZiAoc2VydmVyXy0+Z2V0UmVzaXplQnVmZmVyRXZlcnlOKCkgPiAwCi0gICAgICAgICYmICsrY2FsbHNGb3JSZXNpemVfID49IHNlcnZlcl8tPmdldFJlc2l6ZUJ1ZmZlckV2ZXJ5TigpKSB7Ci0gICAgICBjaGVja0lkbGVCdWZmZXJNZW1MaW1pdChzZXJ2ZXJfLT5nZXRJZGxlUmVhZEJ1ZmZlckxpbWl0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfLT5nZXRJZGxlV3JpdGVCdWZmZXJMaW1pdCgpKTsKLSAgICAgIGNhbGxzRm9yUmVzaXplXyA9IDA7Ci0gICAgfQotCi0gICAgLy8gTi5CLjogV2UgYWxzbyBpbnRlbnRpb25hbGx5IGZhbGwgdGhyb3VnaCBoZXJlIGludG8gdGhlIElOSVQgc3RhdGUhCi0KLSAgTEFCRUxfQVBQX0lOSVQ6Ci0gIGNhc2UgQVBQX0lOSVQ6Ci0KLSAgICAvLyBDbGVhciB3cml0ZSBidWZmZXIgdmFyaWFibGVzCi0gICAgd3JpdGVCdWZmZXJfID0gTlVMTDsKLSAgICB3cml0ZUJ1ZmZlclBvc18gPSAwOwotICAgIHdyaXRlQnVmZmVyU2l6ZV8gPSAwOwotCi0gICAgLy8gSW50byByZWFkNCBzdGF0ZSB3ZSBnbwotICAgIHNvY2tldFN0YXRlXyA9IFNPQ0tFVF9SRUNWX0ZSQU1JTkc7Ci0gICAgYXBwU3RhdGVfID0gQVBQX1JFQURfRlJBTUVfU0laRTsKLQotICAgIHJlYWRCdWZmZXJQb3NfID0gMDsKLQotICAgIC8vIFJlZ2lzdGVyIHJlYWQgZXZlbnQKLSAgICBzZXRSZWFkKCk7Ci0KLSAgICAvLyBUcnkgdG8gd29yayB0aGUgc29ja2V0IHJpZ2h0IGF3YXkKLSAgICAvLyB3b3JrU29ja2V0KCk7Ci0KLSAgICByZXR1cm47Ci0KLSAgY2FzZSBBUFBfUkVBRF9GUkFNRV9TSVpFOgotICAgIC8vIFdlIGp1c3QgcmVhZCB0aGUgcmVxdWVzdCBsZW5ndGgKLSAgICAvLyBEb3VibGUgdGhlIGJ1ZmZlciBzaXplIHVudGlsIGl0IGlzIGJpZyBlbm91Z2gKLSAgICBpZiAocmVhZFdhbnRfID4gcmVhZEJ1ZmZlclNpemVfKSB7Ci0gICAgICBpZiAocmVhZEJ1ZmZlclNpemVfID09IDApIHsKLSAgICAgICAgcmVhZEJ1ZmZlclNpemVfID0gMTsKLSAgICAgIH0KLSAgICAgIHVpbnQzMl90IG5ld1NpemUgPSByZWFkQnVmZmVyU2l6ZV87Ci0gICAgICB3aGlsZSAocmVhZFdhbnRfID4gbmV3U2l6ZSkgewotICAgICAgICBuZXdTaXplICo9IDI7Ci0gICAgICB9Ci0KLSAgICAgIHVpbnQ4X3QqIG5ld0J1ZmZlciA9ICh1aW50OF90KilzdGQ6OnJlYWxsb2MocmVhZEJ1ZmZlcl8sIG5ld1NpemUpOwotICAgICAgaWYgKG5ld0J1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIG5vdGhpbmcgZWxzZSB0byBiZSBkb25lLi4uCi0gICAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7Ci0gICAgICB9Ci0gICAgICByZWFkQnVmZmVyXyA9IG5ld0J1ZmZlcjsKLSAgICAgIHJlYWRCdWZmZXJTaXplXyA9IG5ld1NpemU7Ci0gICAgfQotCi0gICAgcmVhZEJ1ZmZlclBvc189IDA7Ci0KLSAgICAvLyBNb3ZlIGludG8gcmVhZCByZXF1ZXN0IHN0YXRlCi0gICAgc29ja2V0U3RhdGVfID0gU09DS0VUX1JFQ1Y7Ci0gICAgYXBwU3RhdGVfID0gQVBQX1JFQURfUkVRVUVTVDsKLQotICAgIC8vIFdvcmsgdGhlIHNvY2tldCByaWdodCBhd2F5Ci0gICAgLy8gd29ya1NvY2tldCgpOwotCi0gICAgcmV0dXJuOwotCi0gIGNhc2UgQVBQX0NMT1NFX0NPTk5FQ1RJT046Ci0gICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOwotICAgIGNsb3NlKCk7Ci0gICAgcmV0dXJuOwotCi0gIGRlZmF1bHQ6Ci0gICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVW5leHBlY3RlZCBBcHBsaWNhdGlvbiBTdGF0ZSAlZCIsIGFwcFN0YXRlXyk7Ci0gICAgYXNzZXJ0KDApOwotICB9Ci19Ci0KLXZvaWQgVENvbm5lY3Rpb246OnNldEZsYWdzKHNob3J0IGV2ZW50RmxhZ3MpIHsKLSAgLy8gQ2F0Y2ggdGhlIGRvIG5vdGhpbmcgY2FzZQotICBpZiAoZXZlbnRGbGFnc18gPT0gZXZlbnRGbGFncykgewotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIERlbGV0ZSBhIHByZXZpb3VzbHkgZXhpc3RpbmcgZXZlbnQKLSAgaWYgKGV2ZW50RmxhZ3NfICE9IDApIHsKLSAgICBpZiAoZXZlbnRfZGVsKCZldmVudF8pID09IC0xKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQoIlRDb25uZWN0aW9uOjpzZXRGbGFncyBldmVudF9kZWwiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICAvLyBVcGRhdGUgaW4gbWVtb3J5IHN0cnVjdHVyZQotICBldmVudEZsYWdzXyA9IGV2ZW50RmxhZ3M7Ci0KLSAgLy8gRG8gbm90IGNhbGwgZXZlbnRfc2V0IGlmIHRoZXJlIGFyZSBubyBmbGFncwotICBpZiAoIWV2ZW50RmxhZ3NfKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyoKLSAgICogZXZlbnRfc2V0OgotICAgKgotICAgKiBQcmVwYXJlcyB0aGUgZXZlbnQgc3RydWN0dXJlICZldmVudCB0byBiZSB1c2VkIGluIGZ1dHVyZSBjYWxscyB0bwotICAgKiBldmVudF9hZGQoKSBhbmQgZXZlbnRfZGVsKCkuICBUaGUgZXZlbnQgd2lsbCBiZSBwcmVwYXJlZCB0byBjYWxsIHRoZQotICAgKiBldmVudEhhbmRsZXIgdXNpbmcgdGhlICdzb2NrJyBmaWxlIGRlc2NyaXB0b3IgdG8gbW9uaXRvciBldmVudHMuCi0gICAqCi0gICAqIFRoZSBldmVudHMgY2FuIGJlIGVpdGhlciBFVl9SRUFELCBFVl9XUklURSwgb3IgYm90aCwgaW5kaWNhdGluZwotICAgKiB0aGF0IGFuIGFwcGxpY2F0aW9uIGNhbiByZWFkIG9yIHdyaXRlIGZyb20gdGhlIGZpbGUgcmVzcGVjdGl2ZWx5IHdpdGhvdXQKLSAgICogYmxvY2tpbmcuCi0gICAqCi0gICAqIFRoZSBldmVudEhhbmRsZXIgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIHRoYXQgdHJpZ2dlcmVkCi0gICAqIHRoZSBldmVudCBhbmQgdGhlIHR5cGUgb2YgZXZlbnQgd2hpY2ggd2lsbCBiZSBvbmUgb2Y6IEVWX1RJTUVPVVQsCi0gICAqIEVWX1NJR05BTCwgRVZfUkVBRCwgRVZfV1JJVEUuCi0gICAqCi0gICAqIFRoZSBhZGRpdGlvbmFsIGZsYWcgRVZfUEVSU0lTVCBtYWtlcyBhbiBldmVudF9hZGQoKSBwZXJzaXN0ZW50IHVudGlsCi0gICAqIGV2ZW50X2RlbCgpIGhhcyBiZWVuIGNhbGxlZC4KLSAgICoKLSAgICogT25jZSBpbml0aWFsaXplZCwgdGhlICZldmVudCBzdHJ1Y3QgY2FuIGJlIHVzZWQgcmVwZWF0ZWRseSB3aXRoCi0gICAqIGV2ZW50X2FkZCgpIGFuZCBldmVudF9kZWwoKSBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSByZWluaXRpYWxpemVkIHVubGVzcwotICAgKiB0aGUgZXZlbnRIYW5kbGVyIGFuZC9vciB0aGUgYXJndW1lbnQgdG8gaXQgYXJlIHRvIGJlIGNoYW5nZWQuICBIb3dldmVyLAotICAgKiB3aGVuIGFuIGV2IHN0cnVjdHVyZSBoYXMgYmVlbiBhZGRlZCB0byBsaWJldmVudCB1c2luZyBldmVudF9hZGQoKSB0aGUKLSAgICogc3RydWN0dXJlIG11c3QgcGVyc2lzdCB1bnRpbCB0aGUgZXZlbnQgb2NjdXJzIChhc3N1bWluZyBFVl9QRVJTSVNUCi0gICAqIGlzIG5vdCBzZXQpIG9yIGlzIHJlbW92ZWQgdXNpbmcgZXZlbnRfZGVsKCkuICBZb3UgbWF5IG5vdCByZXVzZSB0aGUgc2FtZQotICAgKiBldiBzdHJ1Y3R1cmUgZm9yIG11bHRpcGxlIG1vbml0b3JlZCBkZXNjcmlwdG9yczsgZWFjaCBkZXNjcmlwdG9yIG5lZWRzCi0gICAqIGl0cyBvd24gZXYuCi0gICAqLwotICBldmVudF9zZXQoJmV2ZW50XywgdFNvY2tldF8tPmdldFNvY2tldEZEKCksIGV2ZW50RmxhZ3NfLAotICAgICAgICAgICAgVENvbm5lY3Rpb246OmV2ZW50SGFuZGxlciwgdGhpcyk7Ci0gIGV2ZW50X2Jhc2Vfc2V0KHNlcnZlcl8tPmdldEV2ZW50QmFzZSgpLCAmZXZlbnRfKTsKLQotICAvLyBBZGQgdGhlIGV2ZW50Ci0gIGlmIChldmVudF9hZGQoJmV2ZW50XywgMCkgPT0gLTEpIHsKLSAgICBHbG9iYWxPdXRwdXQoIlRDb25uZWN0aW9uOjpzZXRGbGFncygpOiBjb3VsZCBub3QgZXZlbnRfYWRkIik7Ci0gIH0KLX0KLQotLyoqCi0gKiBDbG9zZXMgYSBjb25uZWN0aW9uCi0gKi8KLXZvaWQgVENvbm5lY3Rpb246OmNsb3NlKCkgewotICAvLyBEZWxldGUgdGhlIHJlZ2lzdGVyZWQgbGliZXZlbnQKLSAgaWYgKGV2ZW50X2RlbCgmZXZlbnRfKSA9PSAtMSkgewotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRDb25uZWN0aW9uOjpjbG9zZSgpIGV2ZW50X2RlbCIsIGVycm5vKTsKLSAgfQotCi0gIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXJfICE9IE5VTEwpIHsKLSAgICBzZXJ2ZXJFdmVudEhhbmRsZXJfLT5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0XywgaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXyk7Ci0gIH0KLQotICAvLyBDbG9zZSB0aGUgc29ja2V0Ci0gIHRTb2NrZXRfLT5jbG9zZSgpOwotCi0gIC8vIGNsb3NlIGFueSBmYWN0b3J5IHByb2R1Y2VkIHRyYW5zcG9ydHMKLSAgZmFjdG9yeUlucHV0VHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgZmFjdG9yeU91dHB1dFRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0KLSAgLy8gR2l2ZSB0aGlzIG9iamVjdCBiYWNrIHRvIHRoZSBzZXJ2ZXIgdGhhdCBvd25zIGl0Ci0gIHNlcnZlcl8tPnJldHVybkNvbm5lY3Rpb24odGhpcyk7Ci19Ci0KLXZvaWQgVENvbm5lY3Rpb246OmNoZWNrSWRsZUJ1ZmZlck1lbUxpbWl0KHNpemVfdCByZWFkTGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgd3JpdGVMaW1pdCkgewotICBpZiAocmVhZExpbWl0ID4gMCAmJiByZWFkQnVmZmVyU2l6ZV8gPiByZWFkTGltaXQpIHsKLSAgICBmcmVlKHJlYWRCdWZmZXJfKTsKLSAgICByZWFkQnVmZmVyXyA9IE5VTEw7Ci0gICAgcmVhZEJ1ZmZlclNpemVfID0gMDsKLSAgfQotCi0gIGlmICh3cml0ZUxpbWl0ID4gMCAmJiBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXyA+IHdyaXRlTGltaXQpIHsKLSAgICAvLyBqdXN0IHN0YXJ0IG92ZXIKLSAgICBvdXRwdXRUcmFuc3BvcnRfLT5yZXNldEJ1ZmZlcihzZXJ2ZXJfLT5nZXRXcml0ZUJ1ZmZlckRlZmF1bHRTaXplKCkpOwotICAgIGxhcmdlc3RXcml0ZUJ1ZmZlclNpemVfID0gMDsKLSAgfQotfQotCi1UTm9uYmxvY2tpbmdTZXJ2ZXI6On5UTm9uYmxvY2tpbmdTZXJ2ZXIoKSB7Ci0gIC8vIFRPRE86IFdlIGN1cnJlbnRseSBsZWFrIGFueSBhY3RpdmUgVENvbm5lY3Rpb24gb2JqZWN0cy4KLSAgLy8gU2luY2Ugd2UncmUgc2h1dHRpbmcgZG93biBhbmQgZGVzdHJveWluZyB0aGUgZXZlbnRfYmFzZSwgdGhlIFRDb25uZWN0aW9uCi0gIC8vIG9iamVjdHMgd2lsbCBuZXZlciByZWNlaXZlIGFueSBhZGRpdGlvbmFsIGNhbGxiYWNrcy4gIChBbmQgZXZlbiBpZiB0aGV5Ci0gIC8vIGRpZCwgaXQgd291bGQgYmUgYmFkLCBzaW5jZSB0aGV5IGtlZXAgYSBwb2ludGVyIGFyb3VuZCB0byB0aGUgc2VydmVyLAotICAvLyB3aGljaCBpcyBiZWluZyBkZXN0cm95ZWQuKQotCi0gIC8vIENsZWFuIHVwIHVudXNlZCBUQ29ubmVjdGlvbiBvYmplY3RzIGluIGNvbm5lY3Rpb25TdGFja18KLSAgd2hpbGUgKCFjb25uZWN0aW9uU3RhY2tfLmVtcHR5KCkpIHsKLSAgICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbiA9IGNvbm5lY3Rpb25TdGFja18udG9wKCk7Ci0gICAgY29ubmVjdGlvblN0YWNrXy5wb3AoKTsKLSAgICBkZWxldGUgY29ubmVjdGlvbjsKLSAgfQotCi0gIGlmIChldmVudEJhc2VfICYmIG93bkV2ZW50QmFzZV8pIHsKLSAgICBldmVudF9iYXNlX2ZyZWUoZXZlbnRCYXNlXyk7Ci0gIH0KLQotICBpZiAoc2VydmVyU29ja2V0XyA+PSAwKSB7Ci0gICAgY2xvc2Uoc2VydmVyU29ja2V0Xyk7Ci0gIH0KLX0KLQotLyoqCi0gKiBDcmVhdGVzIGEgbmV3IGNvbm5lY3Rpb24gZWl0aGVyIGJ5IHJldXNpbmcgYW4gb2JqZWN0IG9mZiB0aGUgc3RhY2sgb3IKLSAqIGJ5IGFsbG9jYXRpbmcgYSBuZXcgb25lIGVudGlyZWx5Ci0gKi8KLVRDb25uZWN0aW9uKiBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmNyZWF0ZUNvbm5lY3Rpb24oaW50IHNvY2tldCwgc2hvcnQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvY2thZGRyKiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrbGVuX3QgYWRkckxlbikgewotICAvLyBDaGVjayB0aGUgc3RhY2sKLSAgaWYgKGNvbm5lY3Rpb25TdGFja18uZW1wdHkoKSkgewotICAgIHJldHVybiBuZXcgVENvbm5lY3Rpb24oc29ja2V0LCBmbGFncywgdGhpcywgYWRkciwgYWRkckxlbik7Ci0gIH0gZWxzZSB7Ci0gICAgVENvbm5lY3Rpb24qIHJlc3VsdCA9IGNvbm5lY3Rpb25TdGFja18udG9wKCk7Ci0gICAgY29ubmVjdGlvblN0YWNrXy5wb3AoKTsKLSAgICByZXN1bHQtPmluaXQoc29ja2V0LCBmbGFncywgdGhpcywgYWRkciwgYWRkckxlbik7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQotCi0vKioKLSAqIFJldHVybnMgYSBjb25uZWN0aW9uIHRvIHRoZSBzdGFjawotICovCi12b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6cmV0dXJuQ29ubmVjdGlvbihUQ29ubmVjdGlvbiogY29ubmVjdGlvbikgewotICBpZiAoY29ubmVjdGlvblN0YWNrTGltaXRfICYmCi0gICAgICAoY29ubmVjdGlvblN0YWNrXy5zaXplKCkgPj0gY29ubmVjdGlvblN0YWNrTGltaXRfKSkgewotICAgIGRlbGV0ZSBjb25uZWN0aW9uOwotICB9IGVsc2UgewotICAgIGNvbm5lY3Rpb24tPmNoZWNrSWRsZUJ1ZmZlck1lbUxpbWl0KGlkbGVSZWFkQnVmZmVyTGltaXRfLCBpZGxlV3JpdGVCdWZmZXJMaW1pdF8pOwotICAgIGNvbm5lY3Rpb25TdGFja18ucHVzaChjb25uZWN0aW9uKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcnZlciBzb2NrZXQgaGFkIHNvbWV0aGluZyBoYXBwZW4uICBXZSBhY2NlcHQgYWxsIHdhaXRpbmcgY2xpZW50Ci0gKiBjb25uZWN0aW9ucyBvbiBmZCBhbmQgYXNzaWduIFRDb25uZWN0aW9uIG9iamVjdHMgdG8gaGFuZGxlIHRob3NlIHJlcXVlc3RzLgotICovCi12b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6aGFuZGxlRXZlbnQoaW50IGZkLCBzaG9ydCB3aGljaCkgewotICAodm9pZCkgd2hpY2g7Ci0gIC8vIE1ha2Ugc3VyZSB0aGF0IGxpYmV2ZW50IGRpZG4ndCBtZXNzIHVwIHRoZSBzb2NrZXQgaGFuZGxlcwotICBhc3NlcnQoZmQgPT0gc2VydmVyU29ja2V0Xyk7Ci0KLSAgLy8gU2VydmVyIHNvY2tldCBhY2NlcHRlZCBhIG5ldyBjb25uZWN0aW9uCi0gIHNvY2tsZW5fdCBhZGRyTGVuOwotICBzb2NrYWRkcl9zdG9yYWdlIGFkZHJTdG9yYWdlOwotICBzb2NrYWRkciogYWRkcnAgPSAoc29ja2FkZHIqKSZhZGRyU3RvcmFnZTsKLSAgYWRkckxlbiA9IHNpemVvZihhZGRyU3RvcmFnZSk7Ci0KLSAgLy8gR29pbmcgdG8gYWNjZXB0IGEgbmV3IGNsaWVudCBzb2NrZXQKLSAgaW50IGNsaWVudFNvY2tldDsKLQotICAvLyBBY2NlcHQgYXMgbWFueSBuZXcgY2xpZW50cyBhcyBwb3NzaWJsZSwgZXZlbiB0aG91Z2ggbGliZXZlbnQgc2lnbmFsZWQgb25seQotICAvLyBvbmUsIHRoaXMgaGVscHMgdXMgdG8gYXZvaWQgaGF2aW5nIHRvIGdvIGJhY2sgaW50byB0aGUgbGliZXZlbnQgZW5naW5lIHNvCi0gIC8vIG1hbnkgdGltZXMKLSAgd2hpbGUgKChjbGllbnRTb2NrZXQgPSA6OmFjY2VwdChmZCwgYWRkcnAsICZhZGRyTGVuKSkgIT0gLTEpIHsKLSAgICAvLyBJZiB3ZSdyZSBvdmVybG9hZGVkLCB0YWtlIGFjdGlvbiBoZXJlCi0gICAgaWYgKG92ZXJsb2FkQWN0aW9uXyAhPSBUX09WRVJMT0FEX05PX0FDVElPTiAmJiBzZXJ2ZXJPdmVybG9hZGVkKCkpIHsKLSAgICAgIG5Db25uZWN0aW9uc0Ryb3BwZWRfKys7Ci0gICAgICBuVG90YWxDb25uZWN0aW9uc0Ryb3BwZWRfKys7Ci0gICAgICBpZiAob3ZlcmxvYWRBY3Rpb25fID09IFRfT1ZFUkxPQURfQ0xPU0VfT05fQUNDRVBUKSB7Ci0gICAgICAgIGNsb3NlKGNsaWVudFNvY2tldCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0gZWxzZSBpZiAob3ZlcmxvYWRBY3Rpb25fID09IFRfT1ZFUkxPQURfRFJBSU5fVEFTS19RVUVVRSkgewotICAgICAgICBpZiAoIWRyYWluUGVuZGluZ1Rhc2soKSkgewotICAgICAgICAgIC8vIE5vdGhpbmcgbGVmdCB0byBkaXNjYXJkLCBzbyB3ZSBkcm9wIGNvbm5lY3Rpb24gaW5zdGVhZC4KLSAgICAgICAgICBjbG9zZShjbGllbnRTb2NrZXQpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBFeHBsaWNpdGx5IHNldCB0aGlzIHNvY2tldCB0byBOT05CTE9DSyBtb2RlCi0gICAgaW50IGZsYWdzOwotICAgIGlmICgoZmxhZ3MgPSBmY250bChjbGllbnRTb2NrZXQsIEZfR0VURkwsIDApKSA8IDAgfHwKLSAgICAgICAgZmNudGwoY2xpZW50U29ja2V0LCBGX1NFVEZMLCBmbGFncyB8IE9fTk9OQkxPQ0spIDwgMCkgewotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigidGhyaWZ0U2VydmVyRXZlbnRIYW5kbGVyOiBzZXQgT19OT05CTE9DSyAoZmNudGwpICIsIGVycm5vKTsKLSAgICAgIGNsb3NlKGNsaWVudFNvY2tldCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIGEgbmV3IFRDb25uZWN0aW9uIGZvciB0aGlzIGNsaWVudCBzb2NrZXQuCi0gICAgVENvbm5lY3Rpb24qIGNsaWVudENvbm5lY3Rpb24gPQotICAgICAgY3JlYXRlQ29ubmVjdGlvbihjbGllbnRTb2NrZXQsIEVWX1JFQUQgfCBFVl9QRVJTSVNULCBhZGRycCwgYWRkckxlbik7Ci0KLSAgICAvLyBGYWlsIGZhc3QgaWYgd2UgY291bGQgbm90IGNyZWF0ZSBhIFRDb25uZWN0aW9uIG9iamVjdAotICAgIGlmIChjbGllbnRDb25uZWN0aW9uID09IE5VTEwpIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInRocmlmdFNlcnZlckV2ZW50SGFuZGxlcjogZmFpbGVkIFRDb25uZWN0aW9uIGZhY3RvcnkiKTsKLSAgICAgIGNsb3NlKGNsaWVudFNvY2tldCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gUHV0IHRoaXMgY2xpZW50IGNvbm5lY3Rpb24gaW50byB0aGUgcHJvcGVyIHN0YXRlCi0gICAgY2xpZW50Q29ubmVjdGlvbi0+dHJhbnNpdGlvbigpOwotCi0gICAgLy8gYWRkckxlbiBpcyB3cml0dGVuIGJ5IHRoZSBhY2NlcHQoKSBjYWxsLCBzbyBuZWVkcyB0byBiZSBzZXQgYmVmb3JlIHRoZSBuZXh0IGNhbGwuCi0gICAgYWRkckxlbiA9IHNpemVvZihhZGRyU3RvcmFnZSk7Ci0gIH0KLQotICAvLyBEb25lIGxvb3BpbmcgYWNjZXB0LCBub3cgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlIGVycm9yIGlzIGR1ZSB0bwotICAvLyBibG9ja2luZy4gQW55IG90aGVyIGVycm9yIGlzIGEgcHJvYmxlbQotICBpZiAoZXJybm8gIT0gRUFHQUlOICYmIGVycm5vICE9IEVXT1VMREJMT0NLKSB7Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigidGhyaWZ0U2VydmVyRXZlbnRIYW5kbGVyOiBhY2NlcHQoKSAiLCBlcnJubyk7Ci0gIH0KLX0KLQotLyoqCi0gKiBDcmVhdGVzIGEgc29ja2V0IHRvIGxpc3RlbiBvbiBhbmQgYmluZHMgaXQgdG8gdGhlIGxvY2FsIHBvcnQuCi0gKi8KLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpsaXN0ZW5Tb2NrZXQoKSB7Ci0gIGludCBzOwotICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXMsICpyZXMwOwotICBpbnQgZXJyb3I7Ci0KLSAgY2hhciBwb3J0W3NpemVvZigiNjU1MzYiKSArIDFdOwotICBtZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKLSAgaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOwotICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOwotICBoaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkUgfCBBSV9BRERSQ09ORklHOwotICBzcHJpbnRmKHBvcnQsICIlZCIsIHBvcnRfKTsKLQotICAvLyBXaWxkY2FyZCBhZGRyZXNzCi0gIGVycm9yID0gZ2V0YWRkcmluZm8oTlVMTCwgcG9ydCwgJmhpbnRzLCAmcmVzMCk7Ci0gIGlmIChlcnJvcikgewotICAgIHN0cmluZyBlcnJTdHIgPSAiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpIGdldGFkZHJpbmZvICIgKyBzdHJpbmcoZ2FpX3N0cmVycm9yKGVycm9yKSk7Ci0gICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBQaWNrIHRoZSBpcHY2IGFkZHJlc3MgZmlyc3Qgc2luY2UgaXB2NCBhZGRyZXNzZXMgY2FuIGJlIG1hcHBlZAotICAvLyBpbnRvIGlwdjYgc3BhY2UuCi0gIGZvciAocmVzID0gcmVzMDsgcmVzOyByZXMgPSByZXMtPmFpX25leHQpIHsKLSAgICBpZiAocmVzLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYgfHwgcmVzLT5haV9uZXh0ID09IE5VTEwpCi0gICAgICBicmVhazsKLSAgfQotCi0gIC8vIENyZWF0ZSB0aGUgc2VydmVyIHNvY2tldAotICBzID0gc29ja2V0KHJlcy0+YWlfZmFtaWx5LCByZXMtPmFpX3NvY2t0eXBlLCByZXMtPmFpX3Byb3RvY29sKTsKLSAgaWYgKHMgPT0gLTEpIHsKLSAgICBmcmVlYWRkcmluZm8ocmVzMCk7Ci0gICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpIHNvY2tldCgpIC0xIik7Ci0gIH0KLQotICAjaWZkZWYgSVBWNl9WNk9OTFkKLSAgaWYgKHJlcy0+YWlfZmFtaWx5ID09IEFGX0lORVQ2KSB7Ci0gICAgaW50IHplcm8gPSAwOwotICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fSVBWNiwgSVBWNl9WNk9OTFksIGNvbnN0X2Nhc3Rfc29ja29wdCgmemVybyksIHNpemVvZih6ZXJvKSkpIHsKLSAgICAgIEdsb2JhbE91dHB1dCgiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgSVBWNl9WNk9OTFkiKTsKLSAgICB9Ci0gIH0KLSAgI2VuZGlmIC8vICNpZmRlZiBJUFY2X1Y2T05MWQotCi0KLSAgaW50IG9uZSA9IDE7Ci0KLSAgLy8gU2V0IHJldXNlYWRkciB0byBhdm9pZCAyTVNMIGRlbGF5IG9uIHNlcnZlciByZXN0YXJ0Ci0gIHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCBjb25zdF9jYXN0X3NvY2tvcHQoJm9uZSksIHNpemVvZihvbmUpKTsKLQotICBpZiAoOjpiaW5kKHMsIHJlcy0+YWlfYWRkciwgcmVzLT5haV9hZGRybGVuKSA9PSAtMSkgewotICAgIGNsb3NlKHMpOwotICAgIGZyZWVhZGRyaW5mbyhyZXMwKTsKLSAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCkgYmluZCIpOwotICB9Ci0KLSAgLy8gRG9uZSB3aXRoIHRoZSBhZGRyIGluZm8KLSAgZnJlZWFkZHJpbmZvKHJlczApOwotCi0gIC8vIFNldCB1cCB0aGlzIGZpbGUgZGVzY3JpcHRvciBmb3IgbGlzdGVuaW5nCi0gIGxpc3RlblNvY2tldChzKTsKLX0KLQotLyoqCi0gKiBUYWtlcyBhIHNvY2tldCBjcmVhdGVkIGJ5IGxpc3RlblNvY2tldCgpIGFuZCBzZXRzIHZhcmlvdXMgb3B0aW9ucyBvbiBpdAotICogdG8gcHJlcGFyZSBmb3IgdXNlIGluIHRoZSBzZXJ2ZXIuCi0gKi8KLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpsaXN0ZW5Tb2NrZXQoaW50IHMpIHsKLSAgLy8gU2V0IHNvY2tldCB0byBub25ibG9ja2luZyBtb2RlCi0gIGludCBmbGFnczsKLSAgaWYgKChmbGFncyA9IGZjbnRsKHMsIEZfR0VURkwsIDApKSA8IDAgfHwKLSAgICAgIGZjbnRsKHMsIEZfU0VURkwsIGZsYWdzIHwgT19OT05CTE9DSykgPCAwKSB7Ci0gICAgY2xvc2Uocyk7Ci0gICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpIE9fTk9OQkxPQ0siKTsKLSAgfQotCi0gIGludCBvbmUgPSAxOwotICBzdHJ1Y3QgbGluZ2VyIGxpbmcgPSB7MCwgMH07Ci0KLSAgLy8gS2VlcGFsaXZlIHRvIGVuc3VyZSBmdWxsIHJlc3VsdCBmbHVzaGluZwotICBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgY29uc3RfY2FzdF9zb2Nrb3B0KCZvbmUpLCBzaXplb2Yob25lKSk7Ci0KLSAgLy8gVHVybiBsaW5nZXIgb2ZmIHRvIGF2b2lkIGh1bmcgc29ja2V0cwotICBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgY29uc3RfY2FzdF9zb2Nrb3B0KCZsaW5nKSwgc2l6ZW9mKGxpbmcpKTsKLQotICAvLyBTZXQgVENQIG5vZGVsYXkgaWYgYXZhaWxhYmxlLCBNQUMgT1MgWCBIYWNrCi0gIC8vIFNlZSBodHRwOi8vbGlzdHMuZGFuZ2EuY29tL3BpcGVybWFpbC9tZW1jYWNoZWQvMjAwNS1NYXJjaC8wMDEyNDAuaHRtbAotICAjaWZuZGVmIFRDUF9OT1BVU0gKLSAgc2V0c29ja29wdChzLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIGNvbnN0X2Nhc3Rfc29ja29wdCgmb25lKSwgc2l6ZW9mKG9uZSkpOwotICAjZW5kaWYKLQotICAjaWZkZWYgVENQX0xPV19NSU5fUlRPCi0gIGlmIChUU29ja2V0OjpnZXRVc2VMb3dNaW5SdG8oKSkgewotICAgIHNldHNvY2tvcHQocywgSVBQUk9UT19UQ1AsIFRDUF9MT1dfTUlOX1JUTywgY29uc3RfY2FzdF9zb2Nrb3B0KCZvbmUpLCBzaXplb2Yob25lKSk7Ci0gIH0KLSAgI2VuZGlmCi0KLSAgaWYgKGxpc3RlbihzLCBMSVNURU5fQkFDS0xPRykgPT0gLTEpIHsKLSAgICBjbG9zZShzKTsKLSAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCkgbGlzdGVuIik7Ci0gIH0KLQotICAvLyBDb29sLCB0aGlzIHNvY2tldCBpcyBnb29kIHRvIGdvLCBzZXQgaXQgYXMgdGhlIHNlcnZlclNvY2tldF8KLSAgc2VydmVyU29ja2V0XyA9IHM7Ci19Ci0KLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpjcmVhdGVOb3RpZmljYXRpb25QaXBlKCkgewotICBpZihldnV0aWxfc29ja2V0cGFpcihBRl9MT0NBTCwgU09DS19TVFJFQU0sIDAsIG5vdGlmaWNhdGlvblBpcGVGRHNfKSA9PSAtMSkgewotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlcjo6Y3JlYXRlTm90aWZpY2F0aW9uUGlwZSAiLCBFVlVUSUxfU09DS0VUX0VSUk9SKCkpOwotICAgIHRocm93IFRFeGNlcHRpb24oImNhbid0IGNyZWF0ZSBub3RpZmljYXRpb24gcGlwZSIpOwotICB9Ci0gIGlmKGV2dXRpbF9tYWtlX3NvY2tldF9ub25ibG9ja2luZyhub3RpZmljYXRpb25QaXBlRkRzX1swXSk8MCB8fAotICAgICBldnV0aWxfbWFrZV9zb2NrZXRfbm9uYmxvY2tpbmcobm90aWZpY2F0aW9uUGlwZUZEc19bMV0pPDApIHsKLSAgICBjbG9zZShub3RpZmljYXRpb25QaXBlRkRzX1swXSk7Ci0gICAgY2xvc2Uobm90aWZpY2F0aW9uUGlwZUZEc19bMV0pOwotICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6Y3JlYXRlTm90aWZpY2F0aW9uUGlwZSgpIE9fTk9OQkxPQ0siKTsKLSAgfQotfQotCi0vKioKLSAqIFJlZ2lzdGVyIHRoZSBjb3JlIGxpYmV2ZW50IGV2ZW50cyBvbnRvIHRoZSBwcm9wZXIgYmFzZS4KLSAqLwotdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OnJlZ2lzdGVyRXZlbnRzKGV2ZW50X2Jhc2UqIGJhc2UsIGJvb2wgb3duRXZlbnRCYXNlKSB7Ci0gIGFzc2VydChzZXJ2ZXJTb2NrZXRfICE9IC0xKTsKLSAgYXNzZXJ0KCFldmVudEJhc2VfKTsKLSAgZXZlbnRCYXNlXyA9IGJhc2U7Ci0gIG93bkV2ZW50QmFzZV8gPSBvd25FdmVudEJhc2U7Ci0KLSAgLy8gUHJpbnQgc29tZSBsaWJldmVudCBzdGF0cwotICBHbG9iYWxPdXRwdXQucHJpbnRmKCJsaWJldmVudCAlcyBtZXRob2QgJXMiLAotICAgICAgICAgIGV2ZW50X2dldF92ZXJzaW9uKCksCi0gICAgICAgICAgZXZlbnRfZ2V0X21ldGhvZCgpKTsKLQotICAvLyBSZWdpc3RlciB0aGUgc2VydmVyIGV2ZW50Ci0gIGV2ZW50X3NldCgmc2VydmVyRXZlbnRfLAotICAgICAgICAgICAgc2VydmVyU29ja2V0XywKLSAgICAgICAgICAgIEVWX1JFQUQgfCBFVl9QRVJTSVNULAotICAgICAgICAgICAgVE5vbmJsb2NraW5nU2VydmVyOjpldmVudEhhbmRsZXIsCi0gICAgICAgICAgICB0aGlzKTsKLSAgZXZlbnRfYmFzZV9zZXQoZXZlbnRCYXNlXywgJnNlcnZlckV2ZW50Xyk7Ci0KLSAgLy8gQWRkIHRoZSBldmVudCBhbmQgc3RhcnQgdXAgdGhlIHNlcnZlcgotICBpZiAoLTEgPT0gZXZlbnRfYWRkKCZzZXJ2ZXJFdmVudF8sIDApKSB7Ci0gICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpOiBjb3VsdCBub3QgZXZlbnRfYWRkIik7Ci0gIH0KLSAgaWYgKHRocmVhZFBvb2xQcm9jZXNzaW5nXykgewotICAgIC8vIENyZWF0ZSBhbiBldmVudCB0byBiZSBub3RpZmllZCB3aGVuIGEgdGFzayBmaW5pc2hlcwotICAgIGV2ZW50X3NldCgmbm90aWZpY2F0aW9uRXZlbnRfLAotICAgICAgICAgICAgICBnZXROb3RpZmljYXRpb25SZWN2RkQoKSwKLSAgICAgICAgICAgICAgRVZfUkVBRCB8IEVWX1BFUlNJU1QsCi0gICAgICAgICAgICAgIFRDb25uZWN0aW9uOjp0YXNrSGFuZGxlciwKLSAgICAgICAgICAgICAgdGhpcyk7Ci0KLSAgICAvLyBBdHRhY2ggdG8gdGhlIGJhc2UKLSAgICBldmVudF9iYXNlX3NldChldmVudEJhc2VfLCAmbm90aWZpY2F0aW9uRXZlbnRfKTsKLQotICAgIC8vIEFkZCB0aGUgZXZlbnQgYW5kIHN0YXJ0IHVwIHRoZSBzZXJ2ZXIKLSAgICBpZiAoLTEgPT0gZXZlbnRfYWRkKCZub3RpZmljYXRpb25FdmVudF8sIDApKSB7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCk6IG5vdGlmaWNhdGlvbiBldmVudF9hZGQgZmFpbCIpOwotICAgIH0KLSAgfQotfQotCi12b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6c2V0VGhyZWFkTWFuYWdlcihib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyKSB7Ci0gIHRocmVhZE1hbmFnZXJfID0gdGhyZWFkTWFuYWdlcjsKLSAgaWYgKHRocmVhZE1hbmFnZXIgIT0gTlVMTCkgewotICAgIHRocmVhZE1hbmFnZXItPnNldEV4cGlyZUNhbGxiYWNrKHN0ZDo6dHIxOjpiaW5kKCZUTm9uYmxvY2tpbmdTZXJ2ZXI6OmV4cGlyZUNsb3NlLCB0aGlzLCBzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfMSkpOwotICAgIHRocmVhZFBvb2xQcm9jZXNzaW5nXyA9IHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyZWFkUG9vbFByb2Nlc3NpbmdfID0gZmFsc2U7Ci0gIH0KLX0KLQotYm9vbCAgVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZXJPdmVybG9hZGVkKCkgewotICBzaXplX3QgYWN0aXZlQ29ubmVjdGlvbnMgPSBudW1UQ29ubmVjdGlvbnNfIC0gY29ubmVjdGlvblN0YWNrXy5zaXplKCk7Ci0gIGlmIChudW1BY3RpdmVQcm9jZXNzb3JzXyA+IG1heEFjdGl2ZVByb2Nlc3NvcnNfIHx8Ci0gICAgICBhY3RpdmVDb25uZWN0aW9ucyA+IG1heENvbm5lY3Rpb25zXykgewotICAgIGlmICghb3ZlcmxvYWRlZF8pIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInRocmlmdCBub24tYmxvY2tpbmcgc2VydmVyIG92ZXJsb2FkIGNvbmRpdGlvbiIpOwotICAgICAgb3ZlcmxvYWRlZF8gPSB0cnVlOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAob3ZlcmxvYWRlZF8gJiYKLSAgICAgICAgKG51bUFjdGl2ZVByb2Nlc3NvcnNfIDw9IG92ZXJsb2FkSHlzdGVyZXNpc18gKiBtYXhBY3RpdmVQcm9jZXNzb3JzXykgJiYKLSAgICAgICAgKGFjdGl2ZUNvbm5lY3Rpb25zIDw9IG92ZXJsb2FkSHlzdGVyZXNpc18gKiBtYXhDb25uZWN0aW9uc18pKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJ0aHJpZnQgbm9uLWJsb2NraW5nIHNlcnZlciBvdmVybG9hZCBlbmRlZDsgJXUgZHJvcHBlZCAoJWxsdSB0b3RhbCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBuQ29ubmVjdGlvbnNEcm9wcGVkXywgblRvdGFsQ29ubmVjdGlvbnNEcm9wcGVkXyk7Ci0gICAgICBuQ29ubmVjdGlvbnNEcm9wcGVkXyA9IDA7Ci0gICAgICBvdmVybG9hZGVkXyA9IGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBvdmVybG9hZGVkXzsKLX0KLQotYm9vbCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmRyYWluUGVuZGluZ1Rhc2soKSB7Ci0gIGlmICh0aHJlYWRNYW5hZ2VyXykgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrID0gdGhyZWFkTWFuYWdlcl8tPnJlbW92ZU5leHRQZW5kaW5nKCk7Ci0gICAgaWYgKHRhc2spIHsKLSAgICAgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VENvbm5lY3Rpb246OlRhc2sqPih0YXNrLmdldCgpKS0+Z2V0VENvbm5lY3Rpb24oKTsKLSAgICAgIGFzc2VydChjb25uZWN0aW9uICYmIGNvbm5lY3Rpb24tPmdldFNlcnZlcigpCi0gICAgICAgICAgICAgJiYgY29ubmVjdGlvbi0+Z2V0U3RhdGUoKSA9PSBBUFBfV0FJVF9UQVNLKTsKLSAgICAgIGNvbm5lY3Rpb24tPmZvcmNlQ2xvc2UoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpleHBpcmVDbG9zZShib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgewotICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbiA9Ci0gICAgc3RhdGljX2Nhc3Q8VENvbm5lY3Rpb246OlRhc2sqPih0YXNrLmdldCgpKS0+Z2V0VENvbm5lY3Rpb24oKTsKLSAgYXNzZXJ0KGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbi0+Z2V0U2VydmVyKCkKLQkgJiYgY29ubmVjdGlvbi0+Z2V0U3RhdGUoKSA9PSBBUFBfV0FJVF9UQVNLKTsKLSAgY29ubmVjdGlvbi0+Zm9yY2VDbG9zZSgpOwotfQotCi0vKioKLSAqIE1haW4gd29ya2hvcnNlIGZ1bmN0aW9uLCBzdGFydHMgdXAgdGhlIHNlcnZlciBsaXN0ZW5pbmcgb24gYSBwb3J0IGFuZAotICogbG9vcHMgb3ZlciB0aGUgbGliZXZlbnQgaGFuZGxlci4KLSAqLwotdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCkgewotICAvLyBJbml0IHNvY2tldAotICBsaXN0ZW5Tb2NrZXQoKTsKLQotICBpZiAodGhyZWFkUG9vbFByb2Nlc3NpbmdfKSB7Ci0gICAgLy8gSW5pdCB0YXNrIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uIHBpcGUKLSAgICBjcmVhdGVOb3RpZmljYXRpb25QaXBlKCk7Ci0gIH0KLQotICAvLyBJbml0aWFsaXplIGxpYmV2ZW50IGNvcmUKLSAgcmVnaXN0ZXJFdmVudHMoc3RhdGljX2Nhc3Q8ZXZlbnRfYmFzZSo+KGV2ZW50X2luaXQoKSksIHRydWUpOwotCi0gIC8vIFJ1biB0aGUgcHJlU2VydmUgZXZlbnQKLSAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gTlVMTCkgewotICAgIGV2ZW50SGFuZGxlcl8tPnByZVNlcnZlKCk7Ci0gIH0KLQotICAvLyBSdW4gbGliZXZlbnQgZW5naW5lLCBuZXZlciByZXR1cm5zLCBpbnZva2VzIGNhbGxzIHRvIGV2ZW50SGFuZGxlcgotICBldmVudF9iYXNlX2xvb3AoZXZlbnRCYXNlXywgMCk7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmggYi9saWIvY3BwL3NyYy9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNzQxZTQuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UTk9OQkxPQ0tJTkdTRVJWRVJfSF8KLSNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVE5PTkJMT0NLSU5HU0VSVkVSX0hfIDEKLQotI2luY2x1ZGUgPFRocmlmdC5oPgotI2luY2x1ZGUgPHNlcnZlci9UU2VydmVyLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTb2NrZXQuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Y2xpbWl0cz4KLSNpbmNsdWRlIDxzdGFjaz4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGV2ZW50Lmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7Ci0KLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU29ja2V0OwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlOwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyOwotCi0vLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGNsYXNzCi1jbGFzcyBUQ29ubmVjdGlvbjsKLQotI2lmZGVmIExJQkVWRU5UX1ZFUlNJT05fTlVNQkVSCi0jZGVmaW5lIExJQkVWRU5UX1ZFUlNJT05fTUFKT1IgKExJQkVWRU5UX1ZFUlNJT05fTlVNQkVSID4+IDI0KQotI2RlZmluZSBMSUJFVkVOVF9WRVJTSU9OX01JTk9SICgoTElCRVZFTlRfVkVSU0lPTl9OVU1CRVIgPj4gMTYpICYgMHhGRikKLSNkZWZpbmUgTElCRVZFTlRfVkVSU0lPTl9SRUwgKChMSUJFVkVOVF9WRVJTSU9OX05VTUJFUiA+PiA4KSAmIDB4RkYpCi0jZWxzZQotLy8gYXNzdW1lIGxhdGVzdCB2ZXJzaW9uIDEgc2VyaWVzCi0jZGVmaW5lIExJQkVWRU5UX1ZFUlNJT05fTUFKT1IgMQotI2RlZmluZSBMSUJFVkVOVF9WRVJTSU9OX01JTk9SIDE0Ci0jZGVmaW5lIExJQkVWRU5UX1ZFUlNJT05fUkVMIDEzCi0jZGVmaW5lIExJQkVWRU5UX1ZFUlNJT05fTlVNQkVSICgoTElCRVZFTlRfVkVSU0lPTl9NQUpPUiA8PCAyNCkgfCAoTElCRVZFTlRfVkVSU0lPTl9NSU5PUiA8PCAxNikgfCAoTElCRVZFTlRfVkVSU0lPTl9SRUwgPDwgOCkpCi0jZW5kaWYKLQotI2lmIExJQkVWRU5UX1ZFUlNJT05fTlVNQkVSIDwgMHgwMjAwMDAwMAotIHR5cGVkZWYgaW50IGV2dXRpbF9zb2NrZXRfdDsKLSNlbmRpZgotCi0jaWZuZGVmIFNPQ0tPUFRfQ0FTVF9UCi0jZGVmaW5lIFNPQ0tPUFRfQ0FTVF9UIHZvaWQKLSNlbmRpZgotCi10ZW1wbGF0ZTxjbGFzcyBUPgotaW5saW5lIGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKiBjb25zdF9jYXN0X3NvY2tvcHQoY29uc3QgVCogdikgewotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTT0NLT1BUX0NBU1RfVCo+KHYpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPgotaW5saW5lIFNPQ0tPUFRfQ0FTVF9UKiBjYXN0X3NvY2tvcHQoVCogdikgewotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTT0NLT1BUX0NBU1RfVCo+KHYpOwotfQotCi0vKioKLSAqIFRoaXMgaXMgYSBub24tYmxvY2tpbmcgc2VydmVyIGluIEMrKyBmb3IgaGlnaCBwZXJmb3JtYW5jZSB0aGF0IG9wZXJhdGVzIGEKLSAqIHNpbmdsZSBJTyB0aHJlYWQuIEl0IGFzc3VtZXMgdGhhdCBhbGwgaW5jb21pbmcgcmVxdWVzdHMgYXJlIGZyYW1lZCB3aXRoIGEKLSAqIDQgYnl0ZSBsZW5ndGggaW5kaWNhdG9yIGFuZCB3cml0ZXMgb3V0IHJlc3BvbnNlcyB1c2luZyB0aGUgc2FtZSBmcmFtaW5nLgotICoKLSAqIEl0IGRvZXMgbm90IHVzZSB0aGUgVFNlcnZlclRyYW5zcG9ydCBmcmFtZXdvcmssIGJ1dCByYXRoZXIgaGFzIHNvY2tldAotICogb3BlcmF0aW9ucyBoYXJkY29kZWQgZm9yIHVzZSB3aXRoIHNlbGVjdC4KLSAqCi0gKi8KLQotCi0vLy8gT3ZlcmxvYWQgY29uZGl0aW9uIGFjdGlvbnMuCi1lbnVtIFRPdmVybG9hZEFjdGlvbiB7Ci0gIFRfT1ZFUkxPQURfTk9fQUNUSU9OLCAgICAgICAgLy8vPCBEb24ndCBoYW5kbGUgb3ZlcmxvYWQgKi8KLSAgVF9PVkVSTE9BRF9DTE9TRV9PTl9BQ0NFUFQsICAvLy88IERyb3AgbmV3IGNvbm5lY3Rpb25zIGltbWVkaWF0ZWx5ICovCi0gIFRfT1ZFUkxPQURfRFJBSU5fVEFTS19RVUVVRSAgLy8vPCBEcm9wIHNvbWUgdGFza3MgZnJvbSBoZWFkIG9mIHRhc2sgcXVldWUgKi8KLX07Ci0KLWNsYXNzIFROb25ibG9ja2luZ1NlcnZlciA6IHB1YmxpYyBUU2VydmVyIHsKLSBwcml2YXRlOgotICAvLy8gTGlzdGVuIGJhY2tsb2cKLSAgc3RhdGljIGNvbnN0IGludCBMSVNURU5fQkFDS0xPRyA9IDEwMjQ7Ci0KLSAgLy8vIERlZmF1bHQgbGltaXQgb24gc2l6ZSBvZiBpZGxlIGNvbm5lY3Rpb24gcG9vbAotICBzdGF0aWMgY29uc3Qgc2l6ZV90IENPTk5FQ1RJT05fU1RBQ0tfTElNSVQgPSAxMDI0OwotCi0gIC8vLyBEZWZhdWx0IGxpbWl0IG9uIHRvdGFsIG51bWJlciBvZiBjb25uZWN0ZWQgc29ja2V0cwotICBzdGF0aWMgY29uc3QgaW50IE1BWF9DT05ORUNUSU9OUyA9IElOVF9NQVg7Ci0KLSAgLy8vIERlZmF1bHQgbGltaXQgb24gY29ubmVjdGlvbnMgaW4gaGFuZGxlci90YXNrIHByb2Nlc3NpbmcKLSAgc3RhdGljIGNvbnN0IGludCBNQVhfQUNUSVZFX1BST0NFU1NPUlMgPSBJTlRfTUFYOwotCi0gIC8vLyBEZWZhdWx0IHNpemUgb2Ygd3JpdGUgYnVmZmVyCi0gIHN0YXRpYyBjb25zdCBpbnQgV1JJVEVfQlVGRkVSX0RFRkFVTFRfU0laRSA9IDEwMjQ7Ci0KLSAgLy8vIE1heGltdW0gc2l6ZSBvZiByZWFkIGJ1ZmZlciBhbGxvY2F0ZWQgdG8gaWRsZSBjb25uZWN0aW9uICgwID0gdW5saW1pdGVkKQotICBzdGF0aWMgY29uc3QgaW50IElETEVfUkVBRF9CVUZGRVJfTElNSVQgPSAxMDI0OwotCi0gIC8vLyBNYXhpbXVtIHNpemUgb2Ygd3JpdGUgYnVmZmVyIGFsbG9jYXRlZCB0byBpZGxlIGNvbm5lY3Rpb24gKDAgPSB1bmxpbWl0ZWQpCi0gIHN0YXRpYyBjb25zdCBpbnQgSURMRV9XUklURV9CVUZGRVJfTElNSVQgPSAxMDI0OwotCi0gIC8vLyAjIG9mIGNhbGxzIGJlZm9yZSByZXNpemluZyBvdmVyc2l6ZWQgYnVmZmVycyAoMCA9IGNoZWNrIG9ubHkgb24gY2xvc2UpCi0gIHN0YXRpYyBjb25zdCBpbnQgUkVTSVpFX0JVRkZFUl9FVkVSWV9OID0gNTEyOwotCi0gIC8vLyBTZXJ2ZXIgc29ja2V0IGZpbGUgZGVzY3JpcHRvcgotICBpbnQgc2VydmVyU29ja2V0XzsKLQotICAvLy8gUG9ydCBzZXJ2ZXIgcnVucyBvbgotICBpbnQgcG9ydF87Ci0KLSAgLy8vIEZvciBwcm9jZXNzaW5nIHZpYSB0aHJlYWQgcG9vbCwgbWF5IGJlIE5VTEwKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcl87Ci0KLSAgLy8vIElzIHRocmVhZCBwb29sIHByb2Nlc3Npbmc/Ci0gIGJvb2wgdGhyZWFkUG9vbFByb2Nlc3NpbmdfOwotCi0gIC8vLyBUaGUgZXZlbnQgYmFzZSBmb3IgbGliZXZlbnQKLSAgZXZlbnRfYmFzZSogZXZlbnRCYXNlXzsKLSAgYm9vbCBvd25FdmVudEJhc2VfOwotCi0gIC8vLyBFdmVudCBzdHJ1Y3QsIHVzZWQgd2l0aCBldmVudEJhc2VfIGZvciBjb25uZWN0aW9uIGV2ZW50cwotICBzdHJ1Y3QgZXZlbnQgc2VydmVyRXZlbnRfOwotCi0gIC8vLyBFdmVudCBzdHJ1Y3QsIHVzZWQgd2l0aCBldmVudEJhc2VfIGZvciB0YXNrIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uCi0gIHN0cnVjdCBldmVudCBub3RpZmljYXRpb25FdmVudF87Ci0KLSAgLy8vIE51bWJlciBvZiBUQ29ubmVjdGlvbiBvYmplY3Qgd2UndmUgY3JlYXRlZAotICBzaXplX3QgbnVtVENvbm5lY3Rpb25zXzsKLQotICAvLy8gTnVtYmVyIG9mIENvbm5lY3Rpb25zIHByb2Nlc3Npbmcgb3Igd2FpdGluZyB0byBwcm9jZXNzCi0gIHNpemVfdCBudW1BY3RpdmVQcm9jZXNzb3JzXzsKLQotICAvLy8gTGltaXQgZm9yIGhvdyBtYW55IFRDb25uZWN0aW9uIG9iamVjdHMgdG8gY2FjaGUKLSAgc2l6ZV90IGNvbm5lY3Rpb25TdGFja0xpbWl0XzsKLQotICAvLy8gTGltaXQgZm9yIG51bWJlciBvZiBjb25uZWN0aW9ucyBwcm9jZXNzaW5nIG9yIHdhaXRpbmcgdG8gcHJvY2VzcwotICBzaXplX3QgbWF4QWN0aXZlUHJvY2Vzc29yc187Ci0KLSAgLy8vIExpbWl0IGZvciBudW1iZXIgb2Ygb3BlbiBjb25uZWN0aW9ucwotICBzaXplX3QgbWF4Q29ubmVjdGlvbnNfOwotCi0gIC8vLyBUaW1lIGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgYW4gdW5wZXJmb3JtZWQgdGFzayBleHBpcmVzICgwID09IGluZmluaXRlKS4KLSAgaW50NjRfdCB0YXNrRXhwaXJlVGltZV87Ci0KLSAgLyoqCi0gICAqIEh5c3RlcmVzaXMgZm9yIG92ZXJsb2FkIHN0YXRlLiAgVGhpcyBpcyB0aGUgZnJhY3Rpb24gb2YgdGhlIG92ZXJsb2FkCi0gICAqIHZhbHVlIHRoYXQgbmVlZHMgdG8gYmUgcmVhY2hlZCBiZWZvcmUgdGhlIG92ZXJsb2FkIHN0YXRlIGlzIGNsZWFyZWQ7Ci0gICAqIG11c3QgYmUgPD0gMS4wLgotICAgKi8KLSAgZG91YmxlIG92ZXJsb2FkSHlzdGVyZXNpc187Ci0KLSAgLy8vIEFjdGlvbiB0byB0YWtlIHdoZW4gd2UncmUgb3ZlcmxvYWRlZC4KLSAgVE92ZXJsb2FkQWN0aW9uIG92ZXJsb2FkQWN0aW9uXzsKLQotICAvKioKLSAgICogVGhlIHdyaXRlIGJ1ZmZlciBpcyBpbml0aWFsaXplZCAoYW5kIHdoZW4gaWRsZVdyaXRlQnVmZmVyTGltaXRfIGlzIGNoZWNrZWQKLSAgICogYW5kIGZvdW5kIHRvIGJlIGV4Y2VlZGVkLCByZWluaXRpYWxpemVkKSB0byB0aGlzIHNpemUuCi0gICAqLwotICBzaXplX3Qgd3JpdGVCdWZmZXJEZWZhdWx0U2l6ZV87Ci0KLSAgLyoqCi0gICAqIE1heCByZWFkIGJ1ZmZlciBzaXplIGZvciBhbiBpZGxlIFRDb25uZWN0aW9uLiAgV2hlbiB3ZSBwbGFjZSBhbiBpZGxlCi0gICAqIFRDb25uZWN0aW9uIGludG8gY29ubmVjdGlvblN0YWNrXyBvciBvbiBldmVyeSByZXNpemVCdWZmZXJFdmVyeU5fIGNhbGxzLAotICAgKiB3ZSB3aWxsIGZyZWUgdGhlIGJ1ZmZlciAoc3VjaCB0aGF0IGl0IHdpbGwgYmUgcmVpbml0aWFsaXplZCBieSB0aGUgbmV4dAotICAgKiByZWNlaXZlZCBmcmFtZSkgaWYgaXQgaGFzIGV4Y2VlZGVkIHRoaXMgbGltaXQuICAwIGRpc2FibGVzIHRoaXMgY2hlY2suCi0gICAqLwotICBzaXplX3QgaWRsZVJlYWRCdWZmZXJMaW1pdF87Ci0KLSAgLyoqCi0gICAqIE1heCB3cml0ZSBidWZmZXIgc2l6ZSBmb3IgYW4gaWRsZSBjb25uZWN0aW9uLiAgV2hlbiB3ZSBwbGFjZSBhbiBpZGxlCi0gICAqIFRDb25uZWN0aW9uIGludG8gY29ubmVjdGlvblN0YWNrXyBvciBvbiBldmVyeSByZXNpemVCdWZmZXJFdmVyeU5fIGNhbGxzLAotICAgKiB3ZSBpbnN1cmUgdGhhdCBpdHMgd3JpdGUgYnVmZmVyIGlzIDw9IHRvIHRoaXMgc2l6ZTsgb3RoZXJ3aXNlIHdlCi0gICAqIHJlcGxhY2UgaXQgd2l0aCBhIG5ldyBvbmUgb2Ygd3JpdGVCdWZmZXJEZWZhdWx0U2l6ZV8gYnl0ZXMgdG8gaW5zdXJlIHRoYXQKLSAgICogaWRsZSBjb25uZWN0aW9ucyBkb24ndCBob2cgbWVtb3J5LiAwIGRpc2FibGVzIHRoaXMgY2hlY2suCi0gICAqLwotICBzaXplX3QgaWRsZVdyaXRlQnVmZmVyTGltaXRfOwotCi0gIC8qKgotICAgKiBFdmVyeSBOIGNhbGxzIHdlIGNoZWNrIHRoZSBidWZmZXIgc2l6ZSBsaW1pdHMgb24gYSBjb25uZWN0ZWQgVENvbm5lY3Rpb24uCi0gICAqIDAgZGlzYWJsZXMgKGkuZS4gdGhlIGNoZWNrcyBhcmUgb25seSBkb25lIHdoZW4gYSBjb25uZWN0aW9uIGNsb3NlcykuCi0gICAqLwotICBpbnQzMl90IHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl87Ci0KLSAgLy8vIFNldCBpZiB3ZSBhcmUgY3VycmVudGx5IGluIGFuIG92ZXJsb2FkZWQgc3RhdGUuCi0gIGJvb2wgb3ZlcmxvYWRlZF87Ci0KLSAgLy8vIENvdW50IG9mIGNvbm5lY3Rpb25zIGRyb3BwZWQgc2luY2Ugb3ZlcmxvYWQgc3RhcnRlZAotICB1aW50MzJfdCBuQ29ubmVjdGlvbnNEcm9wcGVkXzsKLQotICAvLy8gQ291bnQgb2YgY29ubmVjdGlvbnMgZHJvcHBlZCBvbiBvdmVybG9hZCBzaW5jZSBzZXJ2ZXIgc3RhcnRlZAotICB1aW50NjRfdCBuVG90YWxDb25uZWN0aW9uc0Ryb3BwZWRfOwotCi0gIC8vLyBGaWxlIGRlc2NyaXB0b3JzIGZvciBwaXBlIHVzZWQgZm9yIHRhc2sgY29tcGxldGlvbiBub3RpZmljYXRpb24uCi0gIGV2dXRpbF9zb2NrZXRfdCBub3RpZmljYXRpb25QaXBlRkRzX1syXTsKLQotICAvKioKLSAgICogVGhpcyBpcyBhIHN0YWNrIG9mIGFsbCB0aGUgb2JqZWN0cyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkIGJ1dCB0aGF0Ci0gICAqIGFyZSBOT1QgY3VycmVudGx5IGluIHVzZS4gV2hlbiB3ZSBjbG9zZSBhIGNvbm5lY3Rpb24sIHdlIHBsYWNlIGl0IG9uIHRoaXMKLSAgICogc3RhY2sgc28gdGhhdCB0aGUgb2JqZWN0IGNhbiBiZSByZXVzZWQgbGF0ZXIsIHJhdGhlciB0aGFuIGZyZWVpbmcgdGhlCi0gICAqIG1lbW9yeSBhbmQgcmVhbGxvY2F0aW5nIGEgbmV3IG9iamVjdCBsYXRlci4KLSAgICovCi0gIHN0ZDo6c3RhY2s8VENvbm5lY3Rpb24qPiBjb25uZWN0aW9uU3RhY2tfOwotCi0gIC8qKgotICAgKiBDYWxsZWQgd2hlbiBzZXJ2ZXIgc29ja2V0IGhhZCBzb21ldGhpbmcgaGFwcGVuLiAgV2UgYWNjZXB0IGFsbCB3YWl0aW5nCi0gICAqIGNsaWVudCBjb25uZWN0aW9ucyBvbiBsaXN0ZW4gc29ja2V0IGZkIGFuZCBhc3NpZ24gVENvbm5lY3Rpb24gb2JqZWN0cwotICAgKiB0byBoYW5kbGUgdGhvc2UgcmVxdWVzdHMuCi0gICAqCi0gICAqIEBwYXJhbSBmZCB0aGUgbGlzdGVuIHNvY2tldC4KLSAgICogQHBhcmFtIHdoaWNoIHRoZSBldmVudCBmbGFnIHRoYXQgdHJpZ2dlcmVkIHRoZSBoYW5kbGVyLgotICAgKi8KLSAgdm9pZCBoYW5kbGVFdmVudChpbnQgZmQsIHNob3J0IHdoaWNoKTsKLQotIHB1YmxpYzoKLSAgVE5vbmJsb2NraW5nU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0KSA6Ci0gICAgVFNlcnZlcihwcm9jZXNzb3IpLAotICAgIHNlcnZlclNvY2tldF8oLTEpLAotICAgIHBvcnRfKHBvcnQpLAotICAgIHRocmVhZFBvb2xQcm9jZXNzaW5nXyhmYWxzZSksCi0gICAgZXZlbnRCYXNlXyhOVUxMKSwKLSAgICBvd25FdmVudEJhc2VfKGZhbHNlKSwKLSAgICBudW1UQ29ubmVjdGlvbnNfKDApLAotICAgIG51bUFjdGl2ZVByb2Nlc3NvcnNfKDApLAotICAgIGNvbm5lY3Rpb25TdGFja0xpbWl0XyhDT05ORUNUSU9OX1NUQUNLX0xJTUlUKSwKLSAgICBtYXhBY3RpdmVQcm9jZXNzb3JzXyhNQVhfQUNUSVZFX1BST0NFU1NPUlMpLAotICAgIG1heENvbm5lY3Rpb25zXyhNQVhfQ09OTkVDVElPTlMpLAotICAgIHRhc2tFeHBpcmVUaW1lXygwKSwKLSAgICBvdmVybG9hZEh5c3RlcmVzaXNfKDAuOCksCi0gICAgb3ZlcmxvYWRBY3Rpb25fKFRfT1ZFUkxPQURfTk9fQUNUSU9OKSwKLSAgICB3cml0ZUJ1ZmZlckRlZmF1bHRTaXplXyhXUklURV9CVUZGRVJfREVGQVVMVF9TSVpFKSwKLSAgICBpZGxlUmVhZEJ1ZmZlckxpbWl0XyhJRExFX1JFQURfQlVGRkVSX0xJTUlUKSwKLSAgICBpZGxlV3JpdGVCdWZmZXJMaW1pdF8oSURMRV9XUklURV9CVUZGRVJfTElNSVQpLAotICAgIHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl8oUkVTSVpFX0JVRkZFUl9FVkVSWV9OKSwKLSAgICBvdmVybG9hZGVkXyhmYWxzZSksCi0gICAgbkNvbm5lY3Rpb25zRHJvcHBlZF8oMCksCi0gICAgblRvdGFsQ29ubmVjdGlvbnNEcm9wcGVkXygwKSB7fQotCi0gIFROb25ibG9ja2luZ1NlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPigpKSA6Ci0gICAgVFNlcnZlcihwcm9jZXNzb3IpLAotICAgIHNlcnZlclNvY2tldF8oLTEpLAotICAgIHBvcnRfKHBvcnQpLAotICAgIHRocmVhZE1hbmFnZXJfKHRocmVhZE1hbmFnZXIpLAotICAgIGV2ZW50QmFzZV8oTlVMTCksCi0gICAgb3duRXZlbnRCYXNlXyhmYWxzZSksCi0gICAgbnVtVENvbm5lY3Rpb25zXygwKSwKLSAgICBudW1BY3RpdmVQcm9jZXNzb3JzXygwKSwKLSAgICBjb25uZWN0aW9uU3RhY2tMaW1pdF8oQ09OTkVDVElPTl9TVEFDS19MSU1JVCksCi0gICAgbWF4QWN0aXZlUHJvY2Vzc29yc18oTUFYX0FDVElWRV9QUk9DRVNTT1JTKSwKLSAgICBtYXhDb25uZWN0aW9uc18oTUFYX0NPTk5FQ1RJT05TKSwKLSAgICB0YXNrRXhwaXJlVGltZV8oMCksCi0gICAgb3ZlcmxvYWRIeXN0ZXJlc2lzXygwLjgpLAotICAgIG92ZXJsb2FkQWN0aW9uXyhUX09WRVJMT0FEX05PX0FDVElPTiksCi0gICAgd3JpdGVCdWZmZXJEZWZhdWx0U2l6ZV8oV1JJVEVfQlVGRkVSX0RFRkFVTFRfU0laRSksCi0gICAgaWRsZVJlYWRCdWZmZXJMaW1pdF8oSURMRV9SRUFEX0JVRkZFUl9MSU1JVCksCi0gICAgaWRsZVdyaXRlQnVmZmVyTGltaXRfKElETEVfV1JJVEVfQlVGRkVSX0xJTUlUKSwKLSAgICByZXNpemVCdWZmZXJFdmVyeU5fKFJFU0laRV9CVUZGRVJfRVZFUllfTiksCi0gICAgb3ZlcmxvYWRlZF8oZmFsc2UpLAotICAgIG5Db25uZWN0aW9uc0Ryb3BwZWRfKDApLAotICAgIG5Ub3RhbENvbm5lY3Rpb25zRHJvcHBlZF8oMCkgewotICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKLSAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOwotICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHByb3RvY29sRmFjdG9yeSk7Ci0gICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHByb3RvY29sRmFjdG9yeSk7Ci0gICAgc2V0VGhyZWFkTWFuYWdlcih0aHJlYWRNYW5hZ2VyKTsKLSAgfQotCi0gIFROb25ibG9ja2luZ1NlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpIDoKLSAgICBUU2VydmVyKHByb2Nlc3NvciksCi0gICAgc2VydmVyU29ja2V0XygtMSksCi0gICAgcG9ydF8ocG9ydCksCi0gICAgdGhyZWFkTWFuYWdlcl8odGhyZWFkTWFuYWdlciksCi0gICAgZXZlbnRCYXNlXyhOVUxMKSwKLSAgICBvd25FdmVudEJhc2VfKGZhbHNlKSwKLSAgICBudW1UQ29ubmVjdGlvbnNfKDApLAotICAgIG51bUFjdGl2ZVByb2Nlc3NvcnNfKDApLAotICAgIGNvbm5lY3Rpb25TdGFja0xpbWl0XyhDT05ORUNUSU9OX1NUQUNLX0xJTUlUKSwKLSAgICBtYXhBY3RpdmVQcm9jZXNzb3JzXyhNQVhfQUNUSVZFX1BST0NFU1NPUlMpLAotICAgIG1heENvbm5lY3Rpb25zXyhNQVhfQ09OTkVDVElPTlMpLAotICAgIHRhc2tFeHBpcmVUaW1lXygwKSwKLSAgICBvdmVybG9hZEh5c3RlcmVzaXNfKDAuOCksCi0gICAgb3ZlcmxvYWRBY3Rpb25fKFRfT1ZFUkxPQURfTk9fQUNUSU9OKSwKLSAgICB3cml0ZUJ1ZmZlckRlZmF1bHRTaXplXyhXUklURV9CVUZGRVJfREVGQVVMVF9TSVpFKSwKLSAgICBpZGxlUmVhZEJ1ZmZlckxpbWl0XyhJRExFX1JFQURfQlVGRkVSX0xJTUlUKSwKLSAgICBpZGxlV3JpdGVCdWZmZXJMaW1pdF8oSURMRV9XUklURV9CVUZGRVJfTElNSVQpLAotICAgIHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl8oUkVTSVpFX0JVRkZFUl9FVkVSWV9OKSwKLSAgICBvdmVybG9hZGVkXyhmYWxzZSksCi0gICAgbkNvbm5lY3Rpb25zRHJvcHBlZF8oMCksCi0gICAgblRvdGFsQ29ubmVjdGlvbnNEcm9wcGVkXygwKSB7Ci0gICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KGlucHV0VHJhbnNwb3J0RmFjdG9yeSk7Ci0gICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KTsKLSAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShpbnB1dFByb3RvY29sRmFjdG9yeSk7Ci0gICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KG91dHB1dFByb3RvY29sRmFjdG9yeSk7Ci0gICAgc2V0VGhyZWFkTWFuYWdlcih0aHJlYWRNYW5hZ2VyKTsKLSAgfQotCi0gIH5UTm9uYmxvY2tpbmdTZXJ2ZXIoKTsKLQotICB2b2lkIHNldFRocmVhZE1hbmFnZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcik7Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gZ2V0VGhyZWFkTWFuYWdlcigpIHsKLSAgICByZXR1cm4gdGhyZWFkTWFuYWdlcl87Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB1bnVzZWQgVENvbm5lY3Rpb24gd2Ugd2lsbCBob2xkIGluIHJlc2VydmUuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgbGltaXQgb24gVENvbm5lY3Rpb24gcG9vbCBzaXplLgotICAgKi8KLSAgc2l6ZV90IGdldENvbm5lY3Rpb25TdGFja0xpbWl0KCkgY29uc3QgewotICAgIHJldHVybiBjb25uZWN0aW9uU3RhY2tMaW1pdF87Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB1bnVzZWQgVENvbm5lY3Rpb24gd2Ugd2lsbCBob2xkIGluIHJlc2VydmUuCi0gICAqCi0gICAqIEBwYXJhbSBzeiB0aGUgbmV3IGxpbWl0IGZvciBUQ29ubmVjdGlvbiBwb29sIHNpemUuCi0gICAqLwotICB2b2lkIHNldENvbm5lY3Rpb25TdGFja0xpbWl0KHNpemVfdCBzeikgewotICAgIGNvbm5lY3Rpb25TdGFja0xpbWl0XyA9IHN6OwotICB9Ci0KLSAgYm9vbCBpc1RocmVhZFBvb2xQcm9jZXNzaW5nKCkgY29uc3QgewotICAgIHJldHVybiB0aHJlYWRQb29sUHJvY2Vzc2luZ187Ci0gIH0KLQotICB2b2lkIGFkZFRhc2soYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spIHsKLSAgICB0aHJlYWRNYW5hZ2VyXy0+YWRkKHRhc2ssIDBMTCwgdGFza0V4cGlyZVRpbWVfKTsKLSAgfQotCi0gIGV2ZW50X2Jhc2UqIGdldEV2ZW50QmFzZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gZXZlbnRCYXNlXzsKLSAgfQotCi0gIC8vLyBJbmNyZW1lbnQgb3VyIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgY29ubmVjdGVkIHNvY2tldHMuCi0gIHZvaWQgaW5jcmVtZW50TnVtQ29ubmVjdGlvbnMoKSB7Ci0gICAgKytudW1UQ29ubmVjdGlvbnNfOwotICB9Ci0KLSAgLy8vIERlY3JlbWVudCBvdXIgY291bnQgb2YgdGhlIG51bWJlciBvZiBjb25uZWN0ZWQgc29ja2V0cy4KLSAgdm9pZCBkZWNyZW1lbnROdW1Db25uZWN0aW9ucygpIHsKLSAgICAtLW51bVRDb25uZWN0aW9uc187Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBjb3VudCBvZiBzb2NrZXRzIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8uCi0gICAqCi0gICAqIEByZXR1cm4gY291bnQgb2YgY29ubmVjdGVkIHNvY2tldHMuCi0gICAqLwotICBzaXplX3QgZ2V0TnVtQ29ubmVjdGlvbnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG51bVRDb25uZWN0aW9uc187Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBjb3VudCBvZiBjb25uZWN0aW9uIG9iamVjdHMgYWxsb2NhdGVkIGJ1dCBub3QgaW4gdXNlLgotICAgKgotICAgKiBAcmV0dXJuIGNvdW50IG9mIGlkbGUgY29ubmVjdGlvbiBvYmplY3RzLgotICAgKi8KLSAgc2l6ZV90IGdldE51bUlkbGVDb25uZWN0aW9ucygpIGNvbnN0IHsKLSAgICByZXR1cm4gY29ubmVjdGlvblN0YWNrXy5zaXplKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIGNvdW50IG9mIG51bWJlciBvZiBjb25uZWN0aW9ucyB3aGljaCBhcmUgY3VycmVudGx5IHByb2Nlc3NpbmcuCi0gICAqIFRoaXMgaXMgZGVmaW5lZCBhcyBhIGNvbm5lY3Rpb24gd2hlcmUgYWxsIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kCi0gICAqIGVpdGhlciBhc3NpZ25lZCBhIHRhc2sgKHdoZW4gdGhyZWFkaW5nKSBvciBwYXNzZWQgdG8gYSBoYW5kbGVyICh3aGVuCi0gICAqIG5vdCB0aHJlYWRpbmcpLCBhbmQgd2hlcmUgdGhlIGhhbmRsZXIgaGFzIG5vdCB5ZXQgcmV0dXJuZWQuCi0gICAqCi0gICAqIEByZXR1cm4gIyBvZiBjb25uZWN0aW9ucyBjdXJyZW50bHkgcHJvY2Vzc2luZy4KLSAgICovCi0gIHNpemVfdCBnZXROdW1BY3RpdmVQcm9jZXNzb3JzKCkgY29uc3QgewotICAgIHJldHVybiBudW1BY3RpdmVQcm9jZXNzb3JzXzsKLSAgfQotCi0gIC8vLyBJbmNyZW1lbnQgdGhlIGNvdW50IG9mIGNvbm5lY3Rpb25zIGN1cnJlbnRseSBwcm9jZXNzaW5nLgotICB2b2lkIGluY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKSB7Ci0gICAgKytudW1BY3RpdmVQcm9jZXNzb3JzXzsKLSAgfQotCi0gIC8vLyBEZWNyZW1lbnQgdGhlIGNvdW50IG9mIGNvbm5lY3Rpb25zIGN1cnJlbnRseSBwcm9jZXNzaW5nLgotICB2b2lkIGRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKSB7Ci0gICAgaWYgKG51bUFjdGl2ZVByb2Nlc3NvcnNfID4gMCkgewotICAgICAgLS1udW1BY3RpdmVQcm9jZXNzb3JzXzsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBtYXhpbXVtICMgb2YgY29ubmVjdGlvbnMgYWxsb3dlZCBiZWZvcmUgb3ZlcmxvYWQuCi0gICAqCi0gICAqIEByZXR1cm4gY3VycmVudCBzZXR0aW5nLgotICAgKi8KLSAgc2l6ZV90IGdldE1heENvbm5lY3Rpb25zKCkgY29uc3QgewotICAgIHJldHVybiBtYXhDb25uZWN0aW9uc187Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBtYXhpbXVtICMgb2YgY29ubmVjdGlvbnMgYWxsb3dlZCBiZWZvcmUgb3ZlcmxvYWQuCi0gICAqCi0gICAqIEBwYXJhbSBtYXhDb25uZWN0aW9ucyBuZXcgc2V0dGluZyBmb3IgbWF4aW11bSAjIG9mIGNvbm5lY3Rpb25zLgotICAgKi8KLSAgdm9pZCBzZXRNYXhDb25uZWN0aW9ucyhzaXplX3QgbWF4Q29ubmVjdGlvbnMpIHsKLSAgICBtYXhDb25uZWN0aW9uc18gPSBtYXhDb25uZWN0aW9uczsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG1heGltdW0gIyBvZiBjb25uZWN0aW9ucyB3YWl0aW5nIGluIGhhbmRsZXIvdGFzayBiZWZvcmUgb3ZlcmxvYWQuCi0gICAqCi0gICAqIEByZXR1cm4gY3VycmVudCBzZXR0aW5nLgotICAgKi8KLSAgc2l6ZV90IGdldE1heEFjdGl2ZVByb2Nlc3NvcnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1heEFjdGl2ZVByb2Nlc3NvcnNfOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbWF4aW11bSAjIG9mIGNvbm5lY3Rpb25zIHdhaXRpbmcgaW4gaGFuZGxlci90YXNrIGJlZm9yZSBvdmVybG9hZC4KLSAgICoKLSAgICogQHBhcmFtIG1heEFjdGl2ZVByb2Nlc3NvcnMgbmV3IHNldHRpbmcgZm9yIG1heGltdW0gIyBvZiBhY3RpdmUgcHJvY2Vzc2VzLgotICAgKi8KLSAgdm9pZCBzZXRNYXhBY3RpdmVQcm9jZXNzb3JzKHNpemVfdCBtYXhBY3RpdmVQcm9jZXNzb3JzKSB7Ci0gICAgbWF4QWN0aXZlUHJvY2Vzc29yc18gPSBtYXhBY3RpdmVQcm9jZXNzb3JzOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBmcmFjdGlvbiBvZiBtYXhpbXVtIGxpbWl0cyBiZWZvcmUgYW4gb3ZlcmxvYWQgY29uZGl0aW9uIGlzIGNsZWFyZWQuCi0gICAqCi0gICAqIEByZXR1cm4gaHlzdGVyZXNpcyBmcmFjdGlvbgotICAgKi8KLSAgZG91YmxlIGdldE92ZXJsb2FkSHlzdGVyZXNpcygpIGNvbnN0IHsKLSAgICByZXR1cm4gb3ZlcmxvYWRIeXN0ZXJlc2lzXzsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgZnJhY3Rpb24gb2YgbWF4aW11bSBsaW1pdHMgYmVmb3JlIGFuIG92ZXJsb2FkIGNvbmRpdGlvbiBpcyBjbGVhcmVkLgotICAgKiBBIGdvb2QgdmFsdWUgd291bGQgcHJvYmFibHkgYmUgYmV0d2VlbiAwLjUgYW5kIDAuOS4KLSAgICoKLSAgICogQHBhcmFtIGh5c3RlcmVzaXNGcmFjdGlvbiBmcmFjdGlvbiA8PSAxLjAuCi0gICAqLwotICB2b2lkIHNldE92ZXJsb2FkSHlzdGVyZXNpcyhkb3VibGUgaHlzdGVyZXNpc0ZyYWN0aW9uKSB7Ci0gICAgaWYgKGh5c3RlcmVzaXNGcmFjdGlvbiA8PSAxLjAgJiYgaHlzdGVyZXNpc0ZyYWN0aW9uID4gMC4wKSB7Ci0gICAgICBvdmVybG9hZEh5c3RlcmVzaXNfID0gaHlzdGVyZXNpc0ZyYWN0aW9uOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGFjdGlvbiB0aGUgc2VydmVyIHdpbGwgdGFrZSBvbiBvdmVybG9hZC4KLSAgICoKLSAgICogQHJldHVybiBhIFRPdmVybG9hZEFjdGlvbiBlbnVtIHZhbHVlIGZvciB0aGUgY3VycmVudGx5IHNldCBhY3Rpb24uCi0gICAqLwotICBUT3ZlcmxvYWRBY3Rpb24gZ2V0T3ZlcmxvYWRBY3Rpb24oKSBjb25zdCB7Ci0gICAgcmV0dXJuIG92ZXJsb2FkQWN0aW9uXzsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIGFjdGlvbiB0aGUgc2VydmVyIGlzIHRvIHRha2Ugb24gb3ZlcmxvYWQuCi0gICAqCi0gICAqIEBwYXJhbSBvdmVybG9hZEFjdGlvbiBhIFRPdmVybG9hZEFjdGlvbiBlbnVtIHZhbHVlIGZvciB0aGUgYWN0aW9uLgotICAgKi8KLSAgdm9pZCBzZXRPdmVybG9hZEFjdGlvbihUT3ZlcmxvYWRBY3Rpb24gb3ZlcmxvYWRBY3Rpb24pIHsKLSAgICBvdmVybG9hZEFjdGlvbl8gPSBvdmVybG9hZEFjdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHdoaWNoIGEgdGFzayBleHBpcmVzICgwID09IGluZmluaXRlKS4KLSAgICoKLSAgICogQHJldHVybiBhIDY0LWJpdCB0aW1lIGluIG1pbGxpc2Vjb25kcy4KLSAgICovCi0gIGludDY0X3QgZ2V0VGFza0V4cGlyZVRpbWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRhc2tFeHBpcmVUaW1lXzsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHdoaWNoIGEgdGFzayBleHBpcmVzICgwID09IGluZmluaXRlKS4KLSAgICoKLSAgICogQHBhcmFtIHRhc2tFeHBpcmVUaW1lIGEgNjQtYml0IHRpbWUgaW4gbWlsbGlzZWNvbmRzLgotICAgKi8KLSAgdm9pZCBzZXRUYXNrRXhwaXJlVGltZShpbnQ2NF90IHRhc2tFeHBpcmVUaW1lKSB7Ci0gICAgdGFza0V4cGlyZVRpbWVfID0gdGFza0V4cGlyZVRpbWU7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIHRoZSBzZXJ2ZXIgaXMgY3VycmVudGx5IG92ZXJsb2FkZWQuCi0gICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoZSBtYXhpbXVtcyBmb3Igb3BlbiBjb25uZWN0aW9ucyBhbmQgY29ubmVjdGlvbnMKLSAgICogY3VycmVudGx5IGluIHByb2Nlc3NpbmcsIGFuZCBzZXRzIGFuIG92ZXJsb2FkIGNvbmRpdGlvbiBpZiB0aGV5IGFyZQotICAgKiBleGNlZWRlZC4gIFRoZSBvdmVybG9hZCB3aWxsIHBlcnNpc3QgdW50aWwgYm90aCB2YWx1ZXMgYXJlIGJlbG93IHRoZQotICAgKiBjdXJyZW50IGh5c3RlcmVzaXMgZnJhY3Rpb24gb2YgdGhlaXIgbWF4aW11bXMuCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBhbiBvdmVybG9hZCBjb25kaXRpb24gZXhpc3RzLCBmYWxzZSBpZiBub3QuCi0gICAqLwotICBib29sIHNlcnZlck92ZXJsb2FkZWQoKTsKLQotICAvKiogUG9wIGFuZCBkaXNjYXJkIG5leHQgdGFzayBvbiB0aHJlYWRwb29sIHdhaXQgcXVldWUuCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBhIHRhc2sgd2FzIGRpc2NhcmRlZCwgZmFsc2UgaWYgdGhlIHdhaXQgcXVldWUgd2FzIGVtcHR5LgotICAgKi8KLSAgYm9vbCBkcmFpblBlbmRpbmdUYXNrKCk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgc3RhcnRpbmcgc2l6ZSBvZiBhIFRDb25uZWN0aW9uIG9iamVjdCdzIHdyaXRlIGJ1ZmZlci4KLSAgICoKLSAgICogQHJldHVybiAjIGJ5dGVzIHdlIGluaXRpYWxpemUgYSBUQ29ubmVjdGlvbiBvYmplY3QncyB3cml0ZSBidWZmZXIgdG8uCi0gICAqLwotICBzaXplX3QgZ2V0V3JpdGVCdWZmZXJEZWZhdWx0U2l6ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gd3JpdGVCdWZmZXJEZWZhdWx0U2l6ZV87Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBzdGFydGluZyBzaXplIG9mIGEgVENvbm5lY3Rpb24gb2JqZWN0J3Mgd3JpdGUgYnVmZmVyLgotICAgKgotICAgKiBAcGFyYW0gc2l6ZSAjIGJ5dGVzIHdlIGluaXRpYWxpemUgYSBUQ29ubmVjdGlvbiBvYmplY3QncyB3cml0ZSBidWZmZXIgdG8uCi0gICAqLwotICB2b2lkIHNldFdyaXRlQnVmZmVyRGVmYXVsdFNpemUoc2l6ZV90IHNpemUpIHsKLSAgICB3cml0ZUJ1ZmZlckRlZmF1bHRTaXplXyA9IHNpemU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBtYXhpbXVtIHNpemUgb2YgcmVhZCBidWZmZXIgYWxsb2NhdGVkIHRvIGlkbGUgVENvbm5lY3Rpb24gb2JqZWN0cy4KLSAgICoKLSAgICogQHJldHVybiAjIGJ5dGVzIGJleW9uZCB3aGljaCB3ZSB3aWxsIGRlYWxsb2MgaWRsZSBidWZmZXIuCi0gICAqLwotICBzaXplX3QgZ2V0SWRsZVJlYWRCdWZmZXJMaW1pdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gaWRsZVJlYWRCdWZmZXJMaW1pdF87Ci0gIH0KLQotICAvKioKLSAgICogW05PVEU6IFRoaXMgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB1c2UgZ2V0SWRsZVJlYWRCdWZmZXJMaW1pdCgpLl0KLSAgICogR2V0IHRoZSBtYXhpbXVtIHNpemUgb2YgcmVhZCBidWZmZXIgYWxsb2NhdGVkIHRvIGlkbGUgVENvbm5lY3Rpb24gb2JqZWN0cy4KLSAgICoKLSAgICogQHJldHVybiAjIGJ5dGVzIGJleW9uZCB3aGljaCB3ZSB3aWxsIGRlYWxsb2MgaWRsZSBidWZmZXIuCi0gICAqLwotICBzaXplX3QgZ2V0SWRsZUJ1ZmZlck1lbUxpbWl0KCkgY29uc3QgewotICAgIHJldHVybiBpZGxlUmVhZEJ1ZmZlckxpbWl0XzsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIG1heGltdW0gc2l6ZSByZWFkIGJ1ZmZlciBhbGxvY2F0ZWQgdG8gaWRsZSBUQ29ubmVjdGlvbiBvYmplY3RzLgotICAgKiBJZiBhIFRDb25uZWN0aW9uIG9iamVjdCBpcyBmb3VuZCAoZWl0aGVyIG9uIGNvbm5lY3Rpb24gY2xvc2Ugb3IgYmV0d2VlbgotICAgKiBjYWxscyB3aGVuIHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl8gaXMgc2V0KSB3aXRoIG1vcmUgdGhhbiB0aGlzIG11Y2ggbWVtb3J5Ci0gICAqIGFsbG9jYXRlZCB0byBpdHMgcmVhZCBidWZmZXIsIHdlIGZyZWUgaXQgYW5kIGFsbG93IGl0IHRvIGJlIHJlaW5pdGlhbGl6ZWQKLSAgICogb24gdGhlIG5leHQgcmVjZWl2ZWQgZnJhbWUuCi0gICAqCi0gICAqIEBwYXJhbSBsaW1pdCBvZiBieXRlcyBiZXlvbmQgd2hpY2ggd2Ugd2lsbCBzaHJpbmsgYnVmZmVycyB3aGVuIGNoZWNrZWQuCi0gICAqLwotICB2b2lkIHNldElkbGVSZWFkQnVmZmVyTGltaXQoc2l6ZV90IGxpbWl0KSB7Ci0gICAgaWRsZVJlYWRCdWZmZXJMaW1pdF8gPSBsaW1pdDsKLSAgfQotCi0gIC8qKgotICAgKiBbTk9URTogVGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHVzZSBzZXRJZGxlUmVhZEJ1ZmZlckxpbWl0KCkuXQotICAgKiBTZXQgdGhlIG1heGltdW0gc2l6ZSByZWFkIGJ1ZmZlciBhbGxvY2F0ZWQgdG8gaWRsZSBUQ29ubmVjdGlvbiBvYmplY3RzLgotICAgKiBJZiBhIFRDb25uZWN0aW9uIG9iamVjdCBpcyBmb3VuZCAoZWl0aGVyIG9uIGNvbm5lY3Rpb24gY2xvc2Ugb3IgYmV0d2VlbgotICAgKiBjYWxscyB3aGVuIHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl8gaXMgc2V0KSB3aXRoIG1vcmUgdGhhbiB0aGlzIG11Y2ggbWVtb3J5Ci0gICAqIGFsbG9jYXRlZCB0byBpdHMgcmVhZCBidWZmZXIsIHdlIGZyZWUgaXQgYW5kIGFsbG93IGl0IHRvIGJlIHJlaW5pdGlhbGl6ZWQKLSAgICogb24gdGhlIG5leHQgcmVjZWl2ZWQgZnJhbWUuCi0gICAqCi0gICAqIEBwYXJhbSBsaW1pdCBvZiBieXRlcyBiZXlvbmQgd2hpY2ggd2Ugd2lsbCBzaHJpbmsgYnVmZmVycyB3aGVuIGNoZWNrZWQuCi0gICAqLwotICB2b2lkIHNldElkbGVCdWZmZXJNZW1MaW1pdChzaXplX3QgbGltaXQpIHsKLSAgICBpZGxlUmVhZEJ1ZmZlckxpbWl0XyA9IGxpbWl0OwotICB9Ci0KLSAgCi0KLSAgLyoqCi0gICAqIEdldCB0aGUgbWF4aW11bSBzaXplIG9mIHdyaXRlIGJ1ZmZlciBhbGxvY2F0ZWQgdG8gaWRsZSBUQ29ubmVjdGlvbiBvYmplY3RzLgotICAgKgotICAgKiBAcmV0dXJuICMgYnl0ZXMgYmV5b25kIHdoaWNoIHdlIHdpbGwgcmVhbGxvY2F0ZSBidWZmZXJzIHdoZW4gY2hlY2tlZC4KLSAgICovCi0gIHNpemVfdCBnZXRJZGxlV3JpdGVCdWZmZXJMaW1pdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gaWRsZVdyaXRlQnVmZmVyTGltaXRfOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbWF4aW11bSBzaXplIHdyaXRlIGJ1ZmZlciBhbGxvY2F0ZWQgdG8gaWRsZSBUQ29ubmVjdGlvbiBvYmplY3RzLgotICAgKiBJZiBhIFRDb25uZWN0aW9uIG9iamVjdCBpcyBmb3VuZCAoZWl0aGVyIG9uIGNvbm5lY3Rpb24gY2xvc2Ugb3IgYmV0d2VlbgotICAgKiBjYWxscyB3aGVuIHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl8gaXMgc2V0KSB3aXRoIG1vcmUgdGhhbiB0aGlzIG11Y2ggbWVtb3J5Ci0gICAqIGFsbG9jYXRlZCB0byBpdHMgd3JpdGUgYnVmZmVyLCB3ZSBkZXN0cm95IGFuZCBjb25zdHJ1Y3QgdGhhdCBidWZmZXIgd2l0aAotICAgKiB3cml0ZUJ1ZmZlckRlZmF1bHRTaXplXyBieXRlcy4KLSAgICoKLSAgICogQHBhcmFtIGxpbWl0IG9mIGJ5dGVzIGJleW9uZCB3aGljaCB3ZSB3aWxsIHNocmluayBidWZmZXJzIHdoZW4gaWRsZS4KLSAgICovCi0gIHZvaWQgc2V0SWRsZVdyaXRlQnVmZmVyTGltaXQoc2l6ZV90IGxpbWl0KSB7Ci0gICAgaWRsZVdyaXRlQnVmZmVyTGltaXRfID0gbGltaXQ7Ci0gIH0KLQotICAvKioKLSAgICogR2V0ICMgb2YgY2FsbHMgbWFkZSBiZXR3ZWVuIGJ1ZmZlciBzaXplIGNoZWNrcy4gIDAgbWVhbnMgZGlzYWJsZWQuCi0gICAqCi0gICAqIEByZXR1cm4gIyBvZiBjYWxscyBiZXR3ZWVuIGJ1ZmZlciBzaXplIGNoZWNrcy4KLSAgICovCi0gIGludDMyX3QgZ2V0UmVzaXplQnVmZmVyRXZlcnlOKCkgY29uc3QgewotICAgIHJldHVybiByZXNpemVCdWZmZXJFdmVyeU5fOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIGJ1ZmZlciBzaXplcyBldmVyeSAiY291bnQiIGNhbGxzLiAgVGhpcyBhbGxvd3MgYnVmZmVyIGxpbWl0cwotICAgKiB0byBiZSBlbmZvcmNlZCBmb3IgcGVyc2lzdGFudCBjb25uZWN0aW9ucyB3aXRoIGEgY29udHJvbGxhYmxlIGRlZ3JlZQotICAgKiBvZiBvdmVyaGVhZC4gMCBkaXNhYmxlcyBjaGVja3MgZXhjZXB0IGF0IGNvbm5lY3Rpb24gY2xvc2UuCi0gICAqCi0gICAqIEBwYXJhbSBjb3VudCB0aGUgbnVtYmVyIG9mIGNhbGxzIGJldHdlZW4gY2hlY2tzLCBvciAwIHRvIGRpc2FibGUKLSAgICovCi0gIHZvaWQgc2V0UmVzaXplQnVmZmVyRXZlcnlOKGludDMyX3QgY291bnQpIHsKLSAgICByZXNpemVCdWZmZXJFdmVyeU5fID0gY291bnQ7Ci0gIH0KLQotCi0KLSAgLyoqCi0gICAqIFJldHVybiBhbiBpbml0aWFsaXplZCBjb25uZWN0aW9uIG9iamVjdC4gIENyZWF0ZXMgb3IgcmVjb3ZlcnMgZnJvbQotICAgKiBwb29sIGEgVENvbm5lY3Rpb24gYW5kIGluaXRpYWxpemVzIGl0IHdpdGggdGhlIHByb3ZpZGVkIHNvY2tldCBGRAotICAgKiBhbmQgZmxhZ3MuCi0gICAqCi0gICAqIEBwYXJhbSBzb2NrZXQgRkQgb2Ygc29ja2V0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbm5lY3Rpb24uCi0gICAqIEBwYXJhbSBmbGFncyBpbml0aWFsIGxpYl9ldmVudCBmbGFncyBmb3IgdGhpcyBjb25uZWN0aW9uLgotICAgKiBAcGFyYW0gYWRkciB0aGUgc29ja2FkZHIgb2YgdGhlIGNsaWVudAotICAgKiBAcGFyYW0gYWRkckxlbiB0aGUgbGVuZ3RoIG9mIGFkZHIKLSAgICogQHJldHVybiBwb2ludGVyIHRvIGluaXRpYWxpemVkIFRDb25uZWN0aW9uIG9iamVjdC4KLSAgICovCi0gIFRDb25uZWN0aW9uKiBjcmVhdGVDb25uZWN0aW9uKGludCBzb2NrZXQsIHNob3J0IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb2NrYWRkciogYWRkciwgc29ja2xlbl90IGFkZHJMZW4pOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgY29ubmVjdGlvbiB0byBwb29sIG9yIGRlbGV0aW9uLiAgSWYgdGhlIGNvbm5lY3Rpb24gcG9vbAotICAgKiAoYSBzdGFjaykgaXNuJ3QgZnVsbCwgcGxhY2UgdGhlIGNvbm5lY3Rpb24gb2JqZWN0IG9uIGl0LCBvdGhlcndpc2UKLSAgICoganVzdCBkZWxldGUgaXQuCi0gICAqCi0gICAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBUQ29uZWN0aW9uIGJlaW5nIHJldHVybmVkLgotICAgKi8KLSAgdm9pZCByZXR1cm5Db25uZWN0aW9uKFRDb25uZWN0aW9uKiBjb25uZWN0aW9uKTsKLQotICAvKioKLSAgICogQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB0aGUgdGhyZWFkbWFuYWdlciBjYWxscyB3aGVuIGEgdGFzayByZWFjaGVzCi0gICAqIGl0cyBleHBpcmF0aW9uIHRpbWUuICBJdCBpcyBuZWVkZWQgdG8gY2xlYW4gdXAgdGhlIGV4cGlyZWQgY29ubmVjdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHRhc2sgdGhlIHJ1bm5hYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhwaXJlZCB0YXNrLgotICAgKi8KLSAgdm9pZCBleHBpcmVDbG9zZShib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayk7Ci0KLSAgLyoqCi0gICAqIEMtY2FsbGFibGUgZXZlbnQgaGFuZGxlciBmb3IgbGlzdGVuZXIgZXZlbnRzLiAgUHJvdmlkZXMgYSBjYWxsYmFjawotICAgKiB0aGF0IGxpYmV2ZW50IGNhbiB1bmRlcnN0YW5kIHdoaWNoIGludm9rZXMgc2VydmVyLT5oYW5kbGVFdmVudCgpLgotICAgKgotICAgKiBAcGFyYW0gZmQgdGhlIGRlc2NyaXB0b3IgdGhlIGV2ZW50IG9jY3VyZWQgb24uCi0gICAqIEBwYXJhbSB3aGljaCB0aGUgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudC4KLSAgICogQHBhcmFtIHYgdm9pZCogY2FsbGJhY2sgYXJnIHdoZXJlIHdlIHBsYWNlZCBUTm9uYmxvY2tpbmdTZXJ2ZXIncyAidGhpcyIuCi0gICAqLwotICBzdGF0aWMgdm9pZCBldmVudEhhbmRsZXIoZXZ1dGlsX3NvY2tldF90IGZkLCBzaG9ydCB3aGljaCwgdm9pZCogdikgewotICAgICgoVE5vbmJsb2NraW5nU2VydmVyKil2KS0+aGFuZGxlRXZlbnQoZmQsIHdoaWNoKTsKLSAgfQotCi0gIC8vLyBDcmVhdGVzIGEgc29ja2V0IHRvIGxpc3RlbiBvbiBhbmQgYmluZHMgaXQgdG8gdGhlIGxvY2FsIHBvcnQuCi0gIHZvaWQgbGlzdGVuU29ja2V0KCk7Ci0KLSAgLyoqCi0gICAqIFRha2VzIGEgc29ja2V0IGNyZWF0ZWQgYnkgbGlzdGVuU29ja2V0KCkgYW5kIHNldHMgdmFyaW91cyBvcHRpb25zIG9uIGl0Ci0gICAqIHRvIHByZXBhcmUgZm9yIHVzZSBpbiB0aGUgc2VydmVyLgotICAgKgotICAgKiBAcGFyYW0gZmQgZGVzY3JpcHRvciBvZiBzb2NrZXQgdG8gYmUgaW5pdGlhbGl6ZWQvCi0gICAqLwotICB2b2lkIGxpc3RlblNvY2tldChpbnQgZmQpOwotCi0gIC8vLyBDcmVhdGUgdGhlIHBpcGUgdXNlZCB0byBub3RpZnkgSS9PIHByb2Nlc3Mgb2YgdGFzayBjb21wbGV0aW9uLgotICB2b2lkIGNyZWF0ZU5vdGlmaWNhdGlvblBpcGUoKTsKLQotICAvKioKLSAgICogR2V0IG5vdGlmaWNhdGlvbiBwaXBlIHNlbmQgZGVzY3JpcHRvci4KLSAgICoKLSAgICogQHJldHVybiB3cml0ZSBmZCBmb3IgcGlwZS4KLSAgICovCi0gIGludCBnZXROb3RpZmljYXRpb25TZW5kRkQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5vdGlmaWNhdGlvblBpcGVGRHNfWzFdOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBub3RpZmljYXRpb24gcGlwZSByZWNlaXZlIGRlc2NyaXB0b3IuCi0gICAqCi0gICAqIEByZXR1cm4gcmVhZCBmZCBvZiBwaXBlLgotICAgKi8KLSAgaW50IGdldE5vdGlmaWNhdGlvblJlY3ZGRCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbm90aWZpY2F0aW9uUGlwZUZEc19bMF07Ci0gIH0KLQotICAvKioKLSAgICogUmVnaXN0ZXIgdGhlIGNvcmUgbGliZXZlbnQgZXZlbnRzIG9udG8gdGhlIHByb3BlciBiYXNlLgotICAgKgotICAgKiBAcGFyYW0gYmFzZSBwb2ludGVyIHRvIHRoZSBldmVudCBiYXNlIHRvIGJlIGluaXRpYWxpemVkLgotICAgKiBAcGFyYW0gb3duRXZlbnRCYXNlIGlmIHRydWUsIHRoaXMgc2VydmVyIGlzIHJlc3BvbnNpYmxlIGZvcgotICAgKiBmcmVlaW5nIHRoZSBldmVudCBiYXNlIG1lbW9yeS4KLSAgICovCi0gIHZvaWQgcmVnaXN0ZXJFdmVudHMoZXZlbnRfYmFzZSogYmFzZSwgYm9vbCBvd25FdmVudEJhc2UgPSB0cnVlKTsKLQotICAvKioKLSAgICogTWFpbiB3b3JraG9yc2UgZnVuY3Rpb24sIHN0YXJ0cyB1cCB0aGUgc2VydmVyIGxpc3RlbmluZyBvbiBhIHBvcnQgYW5kCi0gICAqIGxvb3BzIG92ZXIgdGhlIGxpYmV2ZW50IGhhbmRsZXIuCi0gICAqLwotICB2b2lkIHNlcnZlKCk7Ci19OwotCi0vLy8gVGhyZWUgc3RhdGVzIGZvciBzb2NrZXRzOiByZWN2IGZyYW1lIHNpemUsIHJlY3YgZGF0YSwgYW5kIHNlbmQgbW9kZQotZW51bSBUU29ja2V0U3RhdGUgewotICBTT0NLRVRfUkVDVl9GUkFNSU5HLAotICBTT0NLRVRfUkVDViwKLSAgU09DS0VUX1NFTkQKLX07Ci0KLS8qKgotICogRml2ZSBzdGF0ZXMgZm9yIHRoZSBub25ibG9ja2luZyBzZXJ2cjoKLSAqICAxKSBpbml0aWFsaXplCi0gKiAgMikgcmVhZCA0IGJ5dGUgZnJhbWUgc2l6ZQotICogIDMpIHJlYWQgZnJhbWUgb2YgZGF0YQotICogIDQpIHNlbmQgYmFjayBkYXRhIChpZiBhbnkpCi0gKiAgNSkgZm9yY2UgaW1tZWRpYXRlIGNvbm5lY3Rpb24gY2xvc2UKLSAqLwotZW51bSBUQXBwU3RhdGUgewotICBBUFBfSU5JVCwKLSAgQVBQX1JFQURfRlJBTUVfU0laRSwKLSAgQVBQX1JFQURfUkVRVUVTVCwKLSAgQVBQX1dBSVRfVEFTSywKLSAgQVBQX1NFTkRfUkVTVUxULAotICBBUFBfQ0xPU0VfQ09OTkVDVElPTgotfTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgY29ubmVjdGlvbiB0aGF0IGlzIGhhbmRsZWQgdmlhIGxpYmV2ZW50LiBUaGlzIGNvbm5lY3Rpb24KLSAqIGVzc2VudGlhbGx5IGVuY2Fwc3VsYXRlcyBhIHNvY2tldCB0aGF0IGhhcyBzb21lIGFzc29jaWF0ZWQgbGliZXZlbnQgc3RhdGUuCi0gKi8KLWNsYXNzIFRDb25uZWN0aW9uIHsKLSBwcml2YXRlOgotCi0gIC8vLyBTZXJ2ZXIgaGFuZGxlCi0gIFROb25ibG9ja2luZ1NlcnZlciogc2VydmVyXzsKLQotICAvLy8gT2JqZWN0IHdyYXBwaW5nIG5ldHdvcmsgc29ja2V0Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHRTb2NrZXRfOwotCi0gIC8vLyBMaWJldmVudCBvYmplY3QKLSAgc3RydWN0IGV2ZW50IGV2ZW50XzsKLQotICAvLy8gTGliZXZlbnQgZmxhZ3MKLSAgc2hvcnQgZXZlbnRGbGFnc187Ci0KLSAgLy8vIFNvY2tldCBtb2RlCi0gIFRTb2NrZXRTdGF0ZSBzb2NrZXRTdGF0ZV87Ci0KLSAgLy8vIEFwcGxpY2F0aW9uIHN0YXRlCi0gIFRBcHBTdGF0ZSBhcHBTdGF0ZV87Ci0KLSAgLy8vIEhvdyBtdWNoIGRhdGEgbmVlZGVkIHRvIHJlYWQKLSAgdWludDMyX3QgcmVhZFdhbnRfOwotCi0gIC8vLyBXaGVyZSBpbiB0aGUgcmVhZCBidWZmZXIgYXJlIHdlCi0gIHVpbnQzMl90IHJlYWRCdWZmZXJQb3NfOwotCi0gIC8vLyBSZWFkIGJ1ZmZlcgotICB1aW50OF90KiByZWFkQnVmZmVyXzsKLQotICAvLy8gUmVhZCBidWZmZXIgc2l6ZQotICB1aW50MzJfdCByZWFkQnVmZmVyU2l6ZV87Ci0KLSAgLy8vIFdyaXRlIGJ1ZmZlcgotICB1aW50OF90KiB3cml0ZUJ1ZmZlcl87Ci0KLSAgLy8vIFdyaXRlIGJ1ZmZlciBzaXplCi0gIHVpbnQzMl90IHdyaXRlQnVmZmVyU2l6ZV87Ci0KLSAgLy8vIEhvdyBmYXIgdGhyb3VnaCB3cml0aW5nIGFyZSB3ZT8KLSAgdWludDMyX3Qgd3JpdGVCdWZmZXJQb3NfOwotCi0gIC8vLyBMYXJnZXN0IHNpemUgb2Ygd3JpdGUgYnVmZmVyIHNlZW4gc2luY2UgYnVmZmVyIHdhcyBjb25zdHJ1Y3RlZAotICBzaXplX3QgbGFyZ2VzdFdyaXRlQnVmZmVyU2l6ZV87Ci0KLSAgLy8vIENvdW50IG9mIHRoZSBudW1iZXIgb2YgY2FsbHMgZm9yIHVzZSB3aXRoIGdldFJlc2l6ZUJ1ZmZlckV2ZXJ5TigpLgotICBpbnQzMl90IGNhbGxzRm9yUmVzaXplXzsKLQotICAvLy8gVGFzayBoYW5kbGUKLSAgaW50IHRhc2tIYW5kbGVfOwotCi0gIC8vLyBUYXNrIGV2ZW50Ci0gIHN0cnVjdCBldmVudCB0YXNrRXZlbnRfOwotCi0gIC8vLyBUcmFuc3BvcnQgdG8gcmVhZCBmcm9tCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGlucHV0VHJhbnNwb3J0XzsKLQotICAvLy8gVHJhbnNwb3J0IHRoYXQgcHJvY2Vzc29yIHdyaXRlcyB0bwotICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBvdXRwdXRUcmFuc3BvcnRfOwotCi0gIC8vLyBleHRyYSB0cmFuc3BvcnQgZ2VuZXJhdGVkIGJ5IHRyYW5zcG9ydCBmYWN0b3J5IChlLmcuIEJ1ZmZlcmVkUm91dGVyVHJhbnNwb3J0KQotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBmYWN0b3J5SW5wdXRUcmFuc3BvcnRfOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBmYWN0b3J5T3V0cHV0VHJhbnNwb3J0XzsKLQotICAvLy8gUHJvdG9jb2wgZGVjb2RlcgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2xfOwotCi0gIC8vLyBQcm90b2NvbCBlbmNvZGVyCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2xfOwotCi0gIC8vLyBTZXJ2ZXIgZXZlbnQgaGFuZGxlciwgaWYgYW55Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IHNlcnZlckV2ZW50SGFuZGxlcl87Ci0KLSAgLy8vIFRocmlmdCBjYWxsIGNvbnRleHQsIGlmIGFueQotICB2b2lkICpjb25uZWN0aW9uQ29udGV4dF87Ci0KLSAgLy8vIEdvIGludG8gcmVhZCBtb2RlCi0gIHZvaWQgc2V0UmVhZCgpIHsKLSAgICBzZXRGbGFncyhFVl9SRUFEIHwgRVZfUEVSU0lTVCk7Ci0gIH0KLQotICAvLy8gR28gaW50byB3cml0ZSBtb2RlCi0gIHZvaWQgc2V0V3JpdGUoKSB7Ci0gICAgc2V0RmxhZ3MoRVZfV1JJVEUgfCBFVl9QRVJTSVNUKTsKLSAgfQotCi0gIC8vLyBTZXQgc29ja2V0IGlkbGUKLSAgdm9pZCBzZXRJZGxlKCkgewotICAgIHNldEZsYWdzKDApOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBldmVudCBmbGFncyBmb3IgdGhpcyBjb25uZWN0aW9uLgotICAgKgotICAgKiBAcGFyYW0gZXZlbnRGbGFncyBmbGFncyB3ZSBwYXNzIHRvIGxpYmV2ZW50IGZvciB0aGUgY29ubmVjdGlvbi4KLSAgICovCi0gIHZvaWQgc2V0RmxhZ3Moc2hvcnQgZXZlbnRGbGFncyk7Ci0KLSAgLyoqCi0gICAqIExpYmV2ZW50IGhhbmRsZXIgY2FsbGVkICh2aWEgb3VyIHN0YXRpYyB3cmFwcGVyKSB3aGVuIHRoZSBjb25uZWN0aW9uCi0gICAqIHNvY2tldCBoYWQgc29tZXRoaW5nIGhhcHBlbi4gIFJhdGhlciB0aGFuIHVzZSB0aGUgZmxhZ3MgbGliZXZlbnQgcGFzc2VkLAotICAgKiB3ZSB1c2UgdGhlIGNvbm5lY3Rpb24gc3RhdGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgbmVlZCB0byByZWFkIG9yCi0gICAqIHdyaXRlIHRoZSBzb2NrZXQuCi0gICAqLwotICB2b2lkIHdvcmtTb2NrZXQoKTsKLQotICAvLy8gQ2xvc2UgdGhpcyBjb25uZWN0aW9uIGFuZCBmcmVlIG9yIHJlc2V0IGl0cyByZXNvdXJjZXMuCi0gIHZvaWQgY2xvc2UoKTsKLQotIHB1YmxpYzoKLQotICBjbGFzcyBUYXNrOwotCi0gIC8vLyBDb25zdHJ1Y3RvcgotICBUQ29ubmVjdGlvbihpbnQgc29ja2V0LCBzaG9ydCBldmVudEZsYWdzLCBUTm9uYmxvY2tpbmdTZXJ2ZXIgKnMsCi0gICAgICAgICAgICAgIGNvbnN0IHNvY2thZGRyKiBhZGRyLCBzb2NrbGVuX3QgYWRkckxlbikgewotICAgIHJlYWRCdWZmZXJfID0gTlVMTDsKLSAgICByZWFkQnVmZmVyU2l6ZV8gPSAwOwotCi0gICAgLy8gQWxsb2NhdGUgaW5wdXQgYW5kIG91dHB1dCB0cmFucHNvcnRzCi0gICAgLy8gdGhlc2Ugb25seSBuZWVkIHRvIGJlIGFsbG9jYXRlZCBvbmNlIHBlciBUQ29ubmVjdGlvbiAodGhleSBkb24ndCBuZWVkIHRvIGJlCi0gICAgLy8gcmVhbGxvY2F0ZWQgb24gaW5pdCgpIGNhbGwpCi0gICAgaW5wdXRUcmFuc3BvcnRfID0gYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4obmV3IFRNZW1vcnlCdWZmZXIocmVhZEJ1ZmZlcl8sIHJlYWRCdWZmZXJTaXplXykpOwotICAgIG91dHB1dFRyYW5zcG9ydF8gPSBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPihuZXcgVE1lbW9yeUJ1ZmZlcihzLT5nZXRXcml0ZUJ1ZmZlckRlZmF1bHRTaXplKCkpKTsKLSAgICB0U29ja2V0Xy5yZXNldChuZXcgVFNvY2tldCgpKTsKLQotICAgIGluaXQoc29ja2V0LCBldmVudEZsYWdzLCBzLCBhZGRyLCBhZGRyTGVuKTsKLSAgICBzZXJ2ZXJfLT5pbmNyZW1lbnROdW1Db25uZWN0aW9ucygpOwotICB9Ci0KLSAgflRDb25uZWN0aW9uKCkgewotICAgIHN0ZDo6ZnJlZShyZWFkQnVmZmVyXyk7Ci0gICAgc2VydmVyXy0+ZGVjcmVtZW50TnVtQ29ubmVjdGlvbnMoKTsKLSAgfQotCi0gLyoqCi0gICAqIENoZWNrIGJ1ZmZlcnMgYWdhaW5zdCBhbnkgc2l6ZSBsaW1pdHMgYW5kIHNocmluayBpdCBpZiBleGNlZWRlZC4KLSAgICoKLSAgICogQHBhcmFtIHJlYWRMaW1pdCB3ZSByZWR1Y2UgcmVhZCBidWZmZXIgc2l6ZSB0byB0aGlzIChpZiBub256ZXJvKS4KLSAgICogQHBhcmFtIHdyaXRlTGltaXQgaWYgbm9uemVybyBhbmQgd3JpdGUgYnVmZmVyIGlzIGxhcmdlciwgcmVwbGFjZSBpdC4KLSAgICovCi0gIHZvaWQgY2hlY2tJZGxlQnVmZmVyTWVtTGltaXQoc2l6ZV90IHJlYWRMaW1pdCwgc2l6ZV90IHdyaXRlTGltaXQpOwotCi0gIC8vLyBJbml0aWFsaXplCi0gIHZvaWQgaW5pdChpbnQgc29ja2V0LCBzaG9ydCBldmVudEZsYWdzLCBUTm9uYmxvY2tpbmdTZXJ2ZXIgKnMsCi0gICAgICAgICAgICBjb25zdCBzb2NrYWRkciogYWRkciwgc29ja2xlbl90IGFkZHJMZW4pOwotCi0gIC8qKgotICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiB0cmFuc2l0aW9ucyBmcm9tIG9uZSBzdGF0ZSBpbnRvCi0gICAqIGFub3RoZXIuIFRoaXMgbWVhbnMgdGhhdCBpdCBoYXMgZmluaXNoZWQgd3JpdGluZyB0aGUgZGF0YSB0aGF0IGl0IG5lZWRlZAotICAgKiB0bywgb3IgZmluaXNoZWQgcmVjZWl2aW5nIHRoZSBkYXRhIHRoYXQgaXQgbmVlZGVkIHRvLgotICAgKi8KLSAgdm9pZCB0cmFuc2l0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIEMtY2FsbGFibGUgZXZlbnQgaGFuZGxlciBmb3IgY29ubmVjdGlvbiBldmVudHMuICBQcm92aWRlcyBhIGNhbGxiYWNrCi0gICAqIHRoYXQgbGliZXZlbnQgY2FuIHVuZGVyc3RhbmQgd2hpY2ggaW52b2tlcyBjb25uZWN0aW9uXy0+d29ya1NvY2tldCgpLgotICAgKgotICAgKiBAcGFyYW0gZmQgdGhlIGRlc2NyaXB0b3IgdGhlIGV2ZW50IG9jY3VyZWQgb24uCi0gICAqIEBwYXJhbSB3aGljaCB0aGUgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudC4KLSAgICogQHBhcmFtIHYgdm9pZCogY2FsbGJhY2sgYXJnIHdoZXJlIHdlIHBsYWNlZCBUQ29ubmVjdGlvbidzICJ0aGlzIi4KLSAgICovCi0gIHN0YXRpYyB2b2lkIGV2ZW50SGFuZGxlcihldnV0aWxfc29ja2V0X3QgZmQsIHNob3J0IC8qIHdoaWNoICovLCB2b2lkKiB2KSB7Ci0gICAgYXNzZXJ0KGZkID09ICgoVENvbm5lY3Rpb24qKXYpLT5nZXRUU29ja2V0KCktPmdldFNvY2tldEZEKCkpOwotICAgICgoVENvbm5lY3Rpb24qKXYpLT53b3JrU29ja2V0KCk7Ci0gIH0KLQotICAvKioKLSAgICogQy1jYWxsYWJsZSBldmVudCBoYW5kbGVyIGZvciBzaWduYWxpbmcgdGFzayBjb21wbGV0aW9uLiAgUHJvdmlkZXMgYQotICAgKiBjYWxsYmFjayB0aGF0IGxpYmV2ZW50IGNhbiB1bmRlcnN0YW5kIHRoYXQgd2lsbCByZWFkIGEgY29ubmVjdGlvbgotICAgKiBvYmplY3QncyBhZGRyZXNzIGZyb20gYSBwaXBlIGFuZCBjYWxsIGNvbm5lY3Rpb24tPnRyYW5zaXRpb24oKSBmb3IKLSAgICogdGhhdCBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBmZCB0aGUgZGVzY3JpcHRvciB0aGUgZXZlbnQgb2NjdXJlZCBvbi4KLSAgICovCi0gIHN0YXRpYyB2b2lkIHRhc2tIYW5kbGVyKGV2dXRpbF9zb2NrZXRfdCBmZCwgc2hvcnQgLyogd2hpY2ggKi8sIHZvaWQqIC8qIHYgKi8pIHsKLSAgICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbjsKLSAgICBzc2l6ZV90IG5CeXRlczsKLSAgICB3aGlsZSAoKG5CeXRlcyA9IHJlY3YoZmQsIGNhc3Rfc29ja29wdCgmY29ubmVjdGlvbiksIHNpemVvZihUQ29ubmVjdGlvbiopLCAwKSkKLSAgICAgICAgPT0gc2l6ZW9mKFRDb25uZWN0aW9uKikpIHsKLSAgICAgIGNvbm5lY3Rpb24tPnRyYW5zaXRpb24oKTsKLSAgICB9Ci0gICAgaWYgKG5CeXRlcyA+IDApIHsKLSAgICAgIHRocm93IFRFeGNlcHRpb24oIlRDb25uZWN0aW9uOjp0YXNrSGFuZGxlciB1bmV4cGVjdGVkIHBhcnRpYWwgcmVhZCIpOwotICAgIH0KLSAgICBpZiAoZXJybm8gJiYgZXJybm8gIT0gRVdPVUxEQkxPQ0sgJiYgZXJybm8gIT0gRUFHQUlOKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUQ29ubmVjdGlvbjo6dGFza0hhbmRsZXIgcmVhZCBmYWlsZWQsIHJlc291cmNlIGxlYWsiLCBlcnJubyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIE5vdGlmaWNhdGlvbiB0byBzZXJ2ZXIgdGhhdCBwcm9jZXNzaW5nIGhhcyBlbmRlZCBvbiB0aGlzIHJlcXVlc3QuCi0gICAqIENhbiBiZSBjYWxsZWQgZWl0aGVyIHdoZW4gcHJvY2Vzc2luZyBpcyBjb21wbGV0ZWQgb3Igd2hlbiBhIHdhaXRpbmcKLSAgICogdGFzayBoYXMgYmVlbiBwcmVlbXB0aXZlbHkgdGVybWluYXRlZCAob24gb3ZlcmxvYWQpLgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgdW5hYmxlIHRvIG5vdGlmeSAoY2hlY2sgZXJybm8pLgotICAgKi8KLSAgYm9vbCBub3RpZnlTZXJ2ZXIoKSB7Ci0gICAgVENvbm5lY3Rpb24qIGNvbm5lY3Rpb24gPSB0aGlzOwotICAgIGlmIChzZW5kKHNlcnZlcl8tPmdldE5vdGlmaWNhdGlvblNlbmRGRCgpLCBjb25zdF9jYXN0X3NvY2tvcHQoJmNvbm5lY3Rpb24pLAotICAgICAgICAgICAgIHNpemVvZihUQ29ubmVjdGlvbiopLCAwKSAhPSBzaXplb2YoVENvbm5lY3Rpb24qKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLy8vIEZvcmNlIGNvbm5lY3Rpb24gc2h1dGRvd24gZm9yIHRoaXMgY29ubmVjdGlvbi4KLSAgdm9pZCBmb3JjZUNsb3NlKCkgewotICAgIGFwcFN0YXRlXyA9IEFQUF9DTE9TRV9DT05ORUNUSU9OOwotICAgIGlmICghbm90aWZ5U2VydmVyKCkpIHsKLSAgICAgIHRocm93IFRFeGNlcHRpb24oIlRDb25uZWN0aW9uOjpmb3JjZUNsb3NlOiBmYWlsZWQgd3JpdGUgb24gbm90aWZ5IHBpcGUiKTsKLSAgICB9Ci0gIH0KLQotICAvLy8gcmV0dXJuIHRoZSBzZXJ2ZXIgdGhpcyBjb25uZWN0aW9uIHdhcyBpbml0aWFsaXplZCBmb3IuCi0gIFROb25ibG9ja2luZ1NlcnZlciogZ2V0U2VydmVyKCkgewotICAgIHJldHVybiBzZXJ2ZXJfOwotICB9Ci0KLSAgLy8vIGdldCBzdGF0ZSBvZiBjb25uZWN0aW9uLgotICBUQXBwU3RhdGUgZ2V0U3RhdGUoKSB7Ci0gICAgcmV0dXJuIGFwcFN0YXRlXzsKLSAgfQotCi0gIC8vLyByZXR1cm4gdGhlIFRTb2NrZXQgdHJhbnNwb3J0IHdyYXBwaW5nIHRoaXMgbmV0d29yayBjb25uZWN0aW9uCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGdldFRTb2NrZXQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRTb2NrZXRfOwotICB9Ci0KLSAgLy8vIHJldHVybiB0aGUgc2VydmVyIGV2ZW50IGhhbmRsZXIgaWYgYW55Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGdldFNlcnZlckV2ZW50SGFuZGxlcigpIHsKLSAgICByZXR1cm4gc2VydmVyRXZlbnRIYW5kbGVyXzsKLSAgfQotCi0gIC8vLyByZXR1cm4gdGhlIFRocmlmdCBjb25uZWN0aW9uIGNvbnRleHQgaWYgYW55Ci0gIHZvaWQqIGdldENvbm5lY3Rpb25Db250ZXh0KCkgewotICAgIHJldHVybiBjb25uZWN0aW9uQ29udGV4dF87Ci0gIH0KLQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFNJTVBMRVNFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvc2VydmVyL1RTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvc2VydmVyL1RTZXJ2ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjY5MmFiLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3NlcnZlci9UU2VydmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7Ci0KLWludCBpbmNyZWFzZV9tYXhfZmRzKGludCBtYXhfZmRzPSgxPDwyNCkpICB7Ci0gIHN0cnVjdCBybGltaXQgZmRtYXhybDsKLQotICBmb3IoZmRtYXhybC5ybGltX2N1ciA9IG1heF9mZHMsIGZkbWF4cmwucmxpbV9tYXggPSBtYXhfZmRzOwotICAgICAgbWF4X2ZkcyAmJiAoc2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUsICZmZG1heHJsKSA8IDApOwotICAgICAgZmRtYXhybC5ybGltX2N1ciA9IG1heF9mZHMsIGZkbWF4cmwucmxpbV9tYXggPSBtYXhfZmRzKSB7Ci0gICAgbWF4X2ZkcyAvPSAyOwotICB9Ci0KLSAgcmV0dXJuICBmZG1heHJsLnJsaW1fY3VyOwotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvc2VydmVyL1RTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3NlcnZlci9UU2VydmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZGRmZWEuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvc2VydmVyL1RTZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFNFUlZFUl9IXwotI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UU0VSVkVSX0hfIDEKLQotI2luY2x1ZGUgPFRQcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1RocmVhZC5oPgotCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7Ci0KLXVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yOwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2xGYWN0b3J5OwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0OwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OwotCi0vKioKLSAqIFZpcnR1YWwgaW50ZXJmYWNlIGNsYXNzIHRoYXQgY2FuIGhhbmRsZSBldmVudHMgZnJvbSB0aGUgc2VydmVyIGNvcmUuIFRvCi0gKiB1c2UgdGhpcyB5b3Ugc2hvdWxkIHN1YmNsYXNzIGl0IGFuZCBpbXBsZW1lbnQgdGhlIG1ldGhvZHMgdGhhdCB5b3UgY2FyZQotICogYWJvdXQuIFlvdXIgc3ViY2xhc3MgY2FuIGFsc28gc3RvcmUgbG9jYWwgZGF0YSB0aGF0IHlvdSBtYXkgY2FyZSBhYm91dCwKLSAqIHN1Y2ggYXMgYWRkaXRpb25hbCAiYXJndW1lbnRzIiB0byB0aGVzZSBtZXRob2RzIChzdG9yZWQgaW4gdGhlIG9iamVjdAotICogaW5zdGFuY2UncyBzdGF0ZSkuCi0gKi8KLWNsYXNzIFRTZXJ2ZXJFdmVudEhhbmRsZXIgewotIHB1YmxpYzoKLQotICB2aXJ0dWFsIH5UU2VydmVyRXZlbnRIYW5kbGVyKCkge30KLQotICAvKioKLSAgICogQ2FsbGVkIGJlZm9yZSB0aGUgc2VydmVyIGJlZ2lucy4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBwcmVTZXJ2ZSgpIHt9Ci0KLSAgLyoqCi0gICAqIENhbGxlZCB3aGVuIGEgbmV3IGNsaWVudCBoYXMgY29ubmVjdGVkIGFuZCBpcyBhYm91dCB0byBiZWluZyBwcm9jZXNzaW5nLgotICAgKi8KLSAgdmlydHVhbCB2b2lkKiBjcmVhdGVDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCkgewotICAgICh2b2lkKWlucHV0OwotICAgICh2b2lkKW91dHB1dDsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIC8qKgotICAgKiBDYWxsZWQgd2hlbiBhIGNsaWVudCBoYXMgZmluaXNoZWQgcmVxdWVzdC1oYW5kbGluZyB0byBkZWxldGUgc2VydmVyCi0gICAqIGNvbnRleHQuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgZGVsZXRlQ29udGV4dCh2b2lkKiBzZXJ2ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+aW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD5vdXRwdXQpIHsKLSAgICAodm9pZClzZXJ2ZXJDb250ZXh0OwotICAgICh2b2lkKWlucHV0OwotICAgICh2b2lkKW91dHB1dDsKLSAgfQotCi0gIC8qKgotICAgKiBDYWxsZWQgd2hlbiBhIGNsaWVudCBpcyBhYm91dCB0byBjYWxsIHRoZSBwcm9jZXNzb3IuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0NvbnRleHQodm9pZCogc2VydmVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgewotICAgICh2b2lkKXNlcnZlckNvbnRleHQ7Ci0gICAgKHZvaWQpdHJhbnNwb3J0OwotfQotCi0gcHJvdGVjdGVkOgotCi0gIC8qKgotICAgKiBQcmV2ZW50IGRpcmVjdCBpbnN0YW50aWF0aW9uLgotICAgKi8KLSAgVFNlcnZlckV2ZW50SGFuZGxlcigpIHt9Ci0KLX07Ci0KLS8qKgotICogVGhyaWZ0IHNlcnZlci4KLSAqCi0gKi8KLWNsYXNzIFRTZXJ2ZXIgOiBwdWJsaWMgY29uY3VycmVuY3k6OlJ1bm5hYmxlIHsKLSBwdWJsaWM6Ci0KLSAgdmlydHVhbCB+VFNlcnZlcigpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIHNlcnZlKCkgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBzdG9wKCkge30KLQotICAvLyBBbGxvd3MgcnVubmluZyB0aGUgc2VydmVyIGFzIGEgUnVubmFibGUgdGhyZWFkCi0gIHZpcnR1YWwgdm9pZCBydW4oKSB7Ci0gICAgc2VydmUoKTsKLSAgfQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGdldFByb2Nlc3NvcigpIHsKLSAgICByZXR1cm4gcHJvY2Vzc29yXzsKLSAgfQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IGdldFNlcnZlclRyYW5zcG9ydCgpIHsKLSAgICByZXR1cm4gc2VydmVyVHJhbnNwb3J0XzsKLSAgfQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBnZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoKSB7Ci0gICAgcmV0dXJuIGlucHV0VHJhbnNwb3J0RmFjdG9yeV87Ci0gIH0KLQotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gZ2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeSgpIHsKLSAgICByZXR1cm4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV87Ci0gIH0KLQotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBnZXRJbnB1dFByb3RvY29sRmFjdG9yeSgpIHsKLSAgICByZXR1cm4gaW5wdXRQcm90b2NvbEZhY3RvcnlfOwotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gZ2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KCkgewotICAgIHJldHVybiBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOwotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZ2V0RXZlbnRIYW5kbGVyKCkgewotICAgIHJldHVybiBldmVudEhhbmRsZXJfOwotICB9Ci0KLXByb3RlY3RlZDoKLSAgVFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IpOgotICAgIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSB7Ci0gICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOwotICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7Ci0gICAgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOwotICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7Ci0gIH0KLQotICBUU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQpOgotICAgIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKLSAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgewotICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKLSAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOwotICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKLSAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOwotICB9Ci0KLSAgVFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSk6Ci0gICAgcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAotICAgIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSwKLSAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfKHRyYW5zcG9ydEZhY3RvcnkpLAotICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfKHRyYW5zcG9ydEZhY3RvcnkpLAotICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAotICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSB7fQotCi0gIFRTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSk6Ci0gICAgcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAotICAgIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSwKLSAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfKGlucHV0VHJhbnNwb3J0RmFjdG9yeSksCi0gICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8ob3V0cHV0VHJhbnNwb3J0RmFjdG9yeSksCi0gICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKGlucHV0UHJvdG9jb2xGYWN0b3J5KSwKLSAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKG91dHB1dFByb3RvY29sRmFjdG9yeSkge30KLQotCi0gIC8vIENsYXNzIHZhcmlhYmxlcwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOwotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnRfOwotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV87Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnlfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOwotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcl87Ci0KLXB1YmxpYzoKLSAgdm9pZCBzZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGlucHV0VHJhbnNwb3J0RmFjdG9yeSkgewotICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeV8gPSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7Ci0gIH0KLQotICB2b2lkIHNldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkpIHsKLSAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyA9IG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7Ci0gIH0KLQotICB2b2lkIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7Ci0gIH0KLQotICB2b2lkIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHsKLSAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OwotICB9Ci0KLSAgdm9pZCBzZXRTZXJ2ZXJFdmVudEhhbmRsZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyKSB7Ci0gICAgZXZlbnRIYW5kbGVyXyA9IGV2ZW50SGFuZGxlcjsKLSAgfQotCi19OwotCi0vKioKLSAqIEhlbHBlciBmdW5jdGlvbiB0byBpbmNyZWFzZSB0aGUgbWF4IGZpbGUgZGVzY3JpcHRvcnMgbGltaXQKLSAqIGZvciB0aGUgY3VycmVudCBwcm9jZXNzIGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuLgotICogQnkgZGVmYXVsdCwgdHJpZXMgdG8gaW5jcmVhc2UgaXQgdG8gYXMgbXVjaCBhcyAyXjI0LgotICovCi0gaW50IGluY3JlYXNlX21heF9mZHMoaW50IG1heF9mZHM9KDE8PDI0KSk7Ci0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFNFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGZkNjdjLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3NlcnZlci9UU2ltcGxlU2VydmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJzZXJ2ZXIvVFNpbXBsZVNlcnZlci5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmgiCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgewotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci0KLS8qKgotICogQSBzaW1wbGUgc2luZ2xlLXRocmVhZGVkIGFwcGxpY2F0aW9uIHNlcnZlci4gUGVyZmVjdCBmb3IgdW5pdCB0ZXN0cyEKLSAqCi0gKi8KLXZvaWQgVFNpbXBsZVNlcnZlcjo6c2VydmUoKSB7Ci0KLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBjbGllbnQ7Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQ7Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0OwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbDsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sOwotCi0gIHRyeSB7Ci0gICAgLy8gU3RhcnQgdGhlIHNlcnZlciBsaXN0ZW5pbmcKLSAgICBzZXJ2ZXJUcmFuc3BvcnRfLT5saXN0ZW4oKTsKLSAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFNpbXBsZVNlcnZlcjo6cnVuKCkgbGlzdGVuKCk6ICIpICsgdHR4LndoYXQoKTsKLSAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFJ1biB0aGUgcHJlU2VydmUgZXZlbnQKLSAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gTlVMTCkgewotICAgIGV2ZW50SGFuZGxlcl8tPnByZVNlcnZlKCk7Ci0gIH0KLQotICAvLyBGZXRjaCBjbGllbnQgZnJvbSBzZXJ2ZXIKLSAgd2hpbGUgKCFzdG9wXykgewotICAgIHRyeSB7Ci0gICAgICBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnRfLT5hY2NlcHQoKTsKLSAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGNsaWVudCk7Ci0gICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGNsaWVudCk7Ci0gICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7Ci0gICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBpbnB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IG91dHB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKGNsaWVudCAhPSBOVUxMKSB7IGNsaWVudC0+Y2xvc2UoKTsgfQotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFNlcnZlclRyYW5zcG9ydCBkaWVkIG9uIGFjY2VwdDogIikgKyB0dHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIHR4KSB7Ci0gICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBpbnB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IG91dHB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKGNsaWVudCAhPSBOVUxMKSB7IGNsaWVudC0+Y2xvc2UoKTsgfQotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiU29tZSBraW5kIG9mIGFjY2VwdCBleGNlcHRpb246ICIpICsgdHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0gY2F0Y2ggKHN0cmluZyBzKSB7Ci0gICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBpbnB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IG91dHB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKGNsaWVudCAhPSBOVUxMKSB7IGNsaWVudC0+Y2xvc2UoKTsgfQotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiU29tZSBraW5kIG9mIGFjY2VwdCBleGNlcHRpb246ICIpICsgczsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCA9IE5VTEw7Ci0gICAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gTlVMTCkgewotICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBldmVudEhhbmRsZXJfLT5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGZvciAoOzspIHsKLSAgICAgICAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gTlVMTCkgewotICAgICAgICAgIGV2ZW50SGFuZGxlcl8tPnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBjbGllbnQpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgY29ubmVjdGlvbkNvbnRleHQpIHx8Ci0gICAgICAgICAgICAvLyBQZWVrIGFoZWFkLCBpcyB0aGUgcmVtb3RlIHNpZGUgY2xvc2VkPwotICAgICAgICAgICAgIWlucHV0UHJvdG9jb2wtPmdldFRyYW5zcG9ydCgpLT5wZWVrKCkpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFNpbXBsZVNlcnZlciBjbGllbnQgZGllZDogIikgKyB0dHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9IGNhdGNoIChURXhjZXB0aW9uJiB0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFNpbXBsZVNlcnZlciBleGNlcHRpb246ICIpICsgdHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9IGNhdGNoICguLi4pIHsKLSAgICAgIEdsb2JhbE91dHB1dCgiVFNpbXBsZVNlcnZlciB1bmNhdWdodCBleGNlcHRpb24uIik7Ci0gICAgfQotICAgIGlmIChldmVudEhhbmRsZXJfICE9IE5VTEwpIHsKLSAgICAgIGV2ZW50SGFuZGxlcl8tPmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgaW5wdXRUcmFuc3BvcnQtPmNsb3NlKCk7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUU2ltcGxlU2ltcGxlIGlucHV0IGNsb3NlIGZhaWxlZDogIikgKyB0dHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIG91dHB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRTaW1wbGVTaW1wbGUgb3V0cHV0IGNsb3NlIGZhaWxlZDogIikgKyB0dHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGNsaWVudC0+Y2xvc2UoKTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRTaW1wbGVTaW1wbGUgY2xpZW50IGNsb3NlIGZhaWxlZDogIikgKyB0dHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoc3RvcF8pIHsKLSAgICB0cnkgewotICAgICAgc2VydmVyVHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICZ0dHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRTZXJ2ZXJUcmFuc3BvcnQgZmFpbGVkIG9uIGNsb3NlOiAiKSArIHR0eC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIH0KLSAgICBzdG9wXyA9IGZhbHNlOwotICB9Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oIGIvbGliL2NwcC9zcmMvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjllMTIwZS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RTSU1QTEVTRVJWRVJfSF8KLSNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFNJTVBMRVNFUlZFUl9IXyAxCi0KLSNpbmNsdWRlICJzZXJ2ZXIvVFNlcnZlci5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmgiCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgbW9zdCBiYXNpYyBzaW1wbGUgc2VydmVyLiBJdCBpcyBzaW5nbGUtdGhyZWFkZWQgYW5kIHJ1bnMgYQotICogY29udGludW91cyBsb29wIG9mIGFjY2VwdGluZyBhIHNpbmdsZSBjb25uZWN0aW9uLCBwcm9jZXNzaW5nIHJlcXVlc3RzIG9uCi0gKiB0aGF0IGNvbm5lY3Rpb24gdW50aWwgaXQgY2xvc2VzLCBhbmQgdGhlbiByZXBlYXRpbmcuIEl0IGlzIGEgZ29vZCBleGFtcGxlCi0gKiBvZiBob3cgdG8gZXh0ZW5kIHRoZSBUU2VydmVyIGludGVyZmFjZS4KLSAqCi0gKi8KLWNsYXNzIFRTaW1wbGVTZXJ2ZXIgOiBwdWJsaWMgVFNlcnZlciB7Ci0gcHVibGljOgotICBUU2ltcGxlU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KSA6Ci0gICAgVFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSwKLSAgICBzdG9wXyhmYWxzZSkge30KLQotICBUU2ltcGxlU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOgotICAgIFRTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSwKLSAgICBzdG9wXyhmYWxzZSkge30KLQotICB+VFNpbXBsZVNlcnZlcigpIHt9Ci0KLSAgdm9pZCBzZXJ2ZSgpOwotCi0gIHZvaWQgc3RvcCgpIHsKLSAgICBzdG9wXyA9IHRydWU7Ci0gICAgc2VydmVyVHJhbnNwb3J0Xy0+aW50ZXJydXB0KCk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgYm9vbCBzdG9wXzsKLQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFNJTVBMRVNFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MGI4MzUuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJzZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgotI2luY2x1ZGUgImNvbmN1cnJlbmN5L1RocmVhZC5oIgotI2luY2x1ZGUgImNvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaCIKLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7Ci0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Ci0KLWNsYXNzIFRUaHJlYWRQb29sU2VydmVyOjpUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKLQotcHVibGljOgotCi0gIFRhc2soVFRocmVhZFBvb2xTZXJ2ZXIgJnNlcnZlciwKLSAgICAgICBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCi0gICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCwKLSAgICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgOgotICAgIHNlcnZlcl8oc2VydmVyKSwKLSAgICBwcm9jZXNzb3JfKHByb2Nlc3NvciksCi0gICAgaW5wdXRfKGlucHV0KSwKLSAgICBvdXRwdXRfKG91dHB1dCksCi0gICAgdHJhbnNwb3J0Xyh0cmFuc3BvcnQpIHsKLSAgfQotCi0gIH5UYXNrKCkge30KLQotICB2b2lkIHJ1bigpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXIgPQotICAgICAgc2VydmVyXy5nZXRFdmVudEhhbmRsZXIoKTsKLSAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCA9IE5VTEw7Ci0gICAgaWYgKGV2ZW50SGFuZGxlciAhPSBOVUxMKSB7Ci0gICAgICBjb25uZWN0aW9uQ29udGV4dCA9IGV2ZW50SGFuZGxlci0+Y3JlYXRlQ29udGV4dChpbnB1dF8sIG91dHB1dF8pOwotICAgIH0KLSAgICB0cnkgewotICAgICAgZm9yICg7OykgewotICAgICAgICBpZiAoZXZlbnRIYW5kbGVyICE9IE5VTEwpIHsKLSAgICAgICAgICBldmVudEhhbmRsZXItPnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCB0cmFuc3BvcnRfKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXByb2Nlc3Nvcl8tPnByb2Nlc3MoaW5wdXRfLCBvdXRwdXRfLCBjb25uZWN0aW9uQ29udGV4dCkgfHwKLSAgICAgICAgICAgICFpbnB1dF8tPmdldFRyYW5zcG9ydCgpLT5wZWVrKCkpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgLy8gVGhpcyBpcyByZWFzb25hYmx5IGV4cGVjdGVkLCBjbGllbnQgZGlkbid0IHNlbmQgYSBmdWxsIHJlcXVlc3Qgc28ganVzdAotICAgICAgLy8gaWdub3JlIGhpbQotICAgICAgLy8gc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZFBvb2xTZXJ2ZXIgY2xpZW50IGRpZWQ6ICIpICsgdHR4LndoYXQoKTsKLSAgICAgIC8vIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgeCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZFBvb2xTZXJ2ZXIgZXhjZXB0aW9uOiAiKSArIHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiAmeCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZFBvb2xTZXJ2ZXIsIHN0ZDo6ZXhjZXB0aW9uOiAiKSArIHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9IGNhdGNoICguLi4pIHsKLSAgICAgIEdsb2JhbE91dHB1dCgiVFRocmVhZFBvb2xTZXJ2ZXIsIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIGluICIKLSAgICAgICAgICAgICAgICAgICAiVFRocmVhZFBvb2xTZXJ2ZXI6OlRhc2s6OnJ1bigpIik7Ci0gICAgfQotCi0gICAgaWYgKGV2ZW50SGFuZGxlciAhPSBOVUxMKSB7Ci0gICAgICBldmVudEhhbmRsZXItPmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0Xywgb3V0cHV0Xyk7Ci0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIGlucHV0Xy0+Z2V0VHJhbnNwb3J0KCktPmNsb3NlKCk7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkUG9vbFNlcnZlciBpbnB1dCBjbG9zZSBmYWlsZWQ6ICIpICsgdHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfQotICAgIHRyeSB7Ci0gICAgICBvdXRwdXRfLT5nZXRUcmFuc3BvcnQoKS0+Y2xvc2UoKTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRQb29sU2VydmVyIG91dHB1dCBjbG9zZSBmYWlsZWQ6ICIpICsgdHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfQotCi0gIH0KLQotIHByaXZhdGU6Ci0gIFRTZXJ2ZXImIHNlcnZlcl87Ci0gIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0XzsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dF87Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKLX07Ci0KLVRUaHJlYWRQb29sU2VydmVyOjpUVGhyZWFkUG9vbFNlcnZlcihzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcikgOgotICBUU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpLAotICB0aHJlYWRNYW5hZ2VyXyh0aHJlYWRNYW5hZ2VyKSwKLSAgc3RvcF8oZmFsc2UpLCB0aW1lb3V0XygwKSB7fQotCi1UVGhyZWFkUG9vbFNlcnZlcjo6VFRocmVhZFBvb2xTZXJ2ZXIoc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIpIDoKLSAgVFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpLAotICB0aHJlYWRNYW5hZ2VyXyh0aHJlYWRNYW5hZ2VyKSwKLSAgc3RvcF8oZmFsc2UpLCB0aW1lb3V0XygwKSB7fQotCi0KLVRUaHJlYWRQb29sU2VydmVyOjp+VFRocmVhZFBvb2xTZXJ2ZXIoKSB7fQotCi12b2lkIFRUaHJlYWRQb29sU2VydmVyOjpzZXJ2ZSgpIHsKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBjbGllbnQ7Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQ7Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0OwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbDsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sOwotCi0gIHRyeSB7Ci0gICAgLy8gU3RhcnQgdGhlIHNlcnZlciBsaXN0ZW5pbmcKLSAgICBzZXJ2ZXJUcmFuc3BvcnRfLT5saXN0ZW4oKTsKLSAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZFBvb2xTZXJ2ZXI6OnJ1bigpIGxpc3RlbigpOiAiKSArIHR0eC53aGF0KCk7Ci0gICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBSdW4gdGhlIHByZVNlcnZlIGV2ZW50Ci0gIGlmIChldmVudEhhbmRsZXJfICE9IE5VTEwpIHsKLSAgICBldmVudEhhbmRsZXJfLT5wcmVTZXJ2ZSgpOwotICB9Ci0KLSAgd2hpbGUgKCFzdG9wXykgewotICAgIHRyeSB7Ci0gICAgICBjbGllbnQucmVzZXQoKTsKLSAgICAgIGlucHV0VHJhbnNwb3J0LnJlc2V0KCk7Ci0gICAgICBvdXRwdXRUcmFuc3BvcnQucmVzZXQoKTsKLSAgICAgIGlucHV0UHJvdG9jb2wucmVzZXQoKTsKLSAgICAgIG91dHB1dFByb3RvY29sLnJlc2V0KCk7Ci0KLSAgICAgIC8vIEZldGNoIGNsaWVudCBmcm9tIHNlcnZlcgotICAgICAgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0Xy0+YWNjZXB0KCk7Ci0KLSAgICAgIC8vIE1ha2UgSU8gdHJhbnNwb3J0cwotICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoY2xpZW50KTsKLSAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoY2xpZW50KTsKLSAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKLSAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKLQotICAgICAgLy8gQWRkIHRvIHRocmVhZG1hbmFnZXIgcG9vbAotICAgICAgdGhyZWFkTWFuYWdlcl8tPmFkZChzaGFyZWRfcHRyPFRUaHJlYWRQb29sU2VydmVyOjpUYXNrPihuZXcgVFRocmVhZFBvb2xTZXJ2ZXI6OlRhc2soKnRoaXMsIHByb2Nlc3Nvcl8sIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLCBjbGllbnQpKSwgdGltZW91dF8pOwotCi0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBpbnB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IG91dHB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKGNsaWVudCAhPSBOVUxMKSB7IGNsaWVudC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKCFzdG9wXyB8fCB0dHguZ2V0VHlwZSgpICE9IFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVEKSB7Ci0gICAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRQb29sU2VydmVyOiBUU2VydmVyVHJhbnNwb3J0IGRpZWQgb24gYWNjZXB0OiAiKSArIHR0eC53aGF0KCk7Ci0gICAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgICB9Ci0gICAgICBjb250aW51ZTsKLSAgICB9IGNhdGNoIChURXhjZXB0aW9uJiB0eCkgewotICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgaW5wdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBvdXRwdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChjbGllbnQgIT0gTlVMTCkgeyBjbGllbnQtPmNsb3NlKCk7IH0KLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRQb29sU2VydmVyOiBDYXVnaHQgVEV4Y2VwdGlvbjogIikgKyB0eC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgICAgY29udGludWU7Ci0gICAgfSBjYXRjaCAoc3RyaW5nIHMpIHsKLSAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IGlucHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgb3V0cHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAoY2xpZW50ICE9IE5VTEwpIHsgY2xpZW50LT5jbG9zZSgpOyB9Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gIlRUaHJlYWRQb29sU2VydmVyOiBVbmtub3duIGV4Y2VwdGlvbjogIiArIHM7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gSWYgc3RvcHBlZCBtYW51YWxseSwgam9pbiB0aGUgZXhpc3RpbmcgdGhyZWFkcwotICBpZiAoc3RvcF8pIHsKLSAgICB0cnkgewotICAgICAgc2VydmVyVHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgICAgIHRocmVhZE1hbmFnZXJfLT5qb2luKCk7Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiAmdHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRQb29sU2VydmVyOiBFeGNlcHRpb24gc2h1dHRpbmcgZG93bjogIikgKyB0eC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIH0KLSAgICBzdG9wXyA9IGZhbHNlOwotICB9Ci0KLX0KLQotaW50NjRfdCBUVGhyZWFkUG9vbFNlcnZlcjo6Z2V0VGltZW91dCgpIGNvbnN0IHsKLSAgcmV0dXJuIHRpbWVvdXRfOwotfQotCi12b2lkIFRUaHJlYWRQb29sU2VydmVyOjpzZXRUaW1lb3V0KGludDY0X3QgdmFsdWUpIHsKLSAgdGltZW91dF8gPSB2YWx1ZTsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oIGIvbGliL2NwcC9zcmMvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiN2U5MDYuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFRIUkVBRFBPT0xTRVJWRVJfSF8KLSNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFRIUkVBRFBPT0xTRVJWRVJfSF8gMQotCi0jaW5jbHVkZSA8Y29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgotI2luY2x1ZGUgPHNlcnZlci9UU2VydmVyLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KLQotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgewotCi11c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0OwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7Ci0KLWNsYXNzIFRUaHJlYWRQb29sU2VydmVyIDogcHVibGljIFRTZXJ2ZXIgewotIHB1YmxpYzoKLSAgY2xhc3MgVGFzazsKLQotICBUVGhyZWFkUG9vbFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcik7Ci0KLSAgVFRocmVhZFBvb2xTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyKTsKLQotICB2aXJ0dWFsIH5UVGhyZWFkUG9vbFNlcnZlcigpOwotCi0gIHZpcnR1YWwgdm9pZCBzZXJ2ZSgpOwotCi0gIHZpcnR1YWwgaW50NjRfdCBnZXRUaW1lb3V0KCkgY29uc3Q7Ci0KLSAgdmlydHVhbCB2b2lkIHNldFRpbWVvdXQoaW50NjRfdCB2YWx1ZSk7Ci0KLSAgdmlydHVhbCB2b2lkIHN0b3AoKSB7Ci0gICAgc3RvcF8gPSB0cnVlOwotICAgIHNlcnZlclRyYW5zcG9ydF8tPmludGVycnVwdCgpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcl87Ci0KLSAgdm9sYXRpbGUgYm9vbCBzdG9wXzsKLQotICB2b2xhdGlsZSBpbnQ2NF90IHRpbWVvdXRfOwotCi19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UVEhSRUFEUE9PTFNFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE3MThjYS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJzZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaCIKLSNpbmNsdWRlICJjb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaCIKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7Ci0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7Ci0KLWNsYXNzIFRUaHJlYWRlZFNlcnZlcjo6VGFzazogcHVibGljIFJ1bm5hYmxlIHsKLQotcHVibGljOgotCi0gIFRhc2soVFRocmVhZGVkU2VydmVyJiBzZXJ2ZXIsCi0gICAgICAgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAotICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQsCi0gICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIDoKLSAgICBzZXJ2ZXJfKHNlcnZlciksCi0gICAgcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAotICAgIGlucHV0XyhpbnB1dCksCi0gICAgb3V0cHV0XyhvdXRwdXQpLAotICAgIHRyYW5zcG9ydF8odHJhbnNwb3J0KSB7Ci0gIH0KLQotICB+VGFzaygpIHt9Ci0KLSAgdm9pZCBydW4oKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyID0KLSAgICAgIHNlcnZlcl8uZ2V0RXZlbnRIYW5kbGVyKCk7Ci0gICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQgPSBOVUxMOwotICAgIGlmIChldmVudEhhbmRsZXIgIT0gTlVMTCkgewotICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBldmVudEhhbmRsZXItPmNyZWF0ZUNvbnRleHQoaW5wdXRfLCBvdXRwdXRfKTsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGZvciAoOzspIHsKLSAgICAgICAgaWYgKGV2ZW50SGFuZGxlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgZXZlbnRIYW5kbGVyLT5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgdHJhbnNwb3J0Xyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0Xywgb3V0cHV0XywgY29ubmVjdGlvbkNvbnRleHQpIHx8Ci0gICAgICAgICAgICAhaW5wdXRfLT5nZXRUcmFuc3BvcnQoKS0+cGVlaygpKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRlZFNlcnZlciBjbGllbnQgZGllZDogIikgKyB0dHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9IGNhdGNoIChURXhjZXB0aW9uJiB4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkZWRTZXJ2ZXIgZXhjZXB0aW9uOiAiKSArIHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9IGNhdGNoICguLi4pIHsKLSAgICAgIEdsb2JhbE91dHB1dCgiVFRocmVhZGVkU2VydmVyIHVuY2F1Z2h0IGV4Y2VwdGlvbi4iKTsKLSAgICB9Ci0gICAgaWYgKGV2ZW50SGFuZGxlciAhPSBOVUxMKSB7Ci0gICAgICBldmVudEhhbmRsZXItPmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0Xywgb3V0cHV0Xyk7Ci0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIGlucHV0Xy0+Z2V0VHJhbnNwb3J0KCktPmNsb3NlKCk7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkZWRTZXJ2ZXIgaW5wdXQgY2xvc2UgZmFpbGVkOiAiKSArIHR0eC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIH0KLSAgICB0cnkgewotICAgICAgb3V0cHV0Xy0+Z2V0VHJhbnNwb3J0KCktPmNsb3NlKCk7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkZWRTZXJ2ZXIgb3V0cHV0IGNsb3NlIGZhaWxlZDogIikgKyB0dHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0KLSAgICAvLyBSZW1vdmUgdGhpcyB0YXNrIGZyb20gcGFyZW50IGJvb2trZWVwaW5nCi0gICAgewotICAgICAgU3luY2hyb25pemVkIHMoc2VydmVyXy50YXNrc01vbml0b3JfKTsKLSAgICAgIHNlcnZlcl8udGFza3NfLmVyYXNlKHRoaXMpOwotICAgICAgaWYgKHNlcnZlcl8udGFza3NfLmVtcHR5KCkpIHsKLSAgICAgICAgc2VydmVyXy50YXNrc01vbml0b3JfLm5vdGlmeSgpOwotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSBwcml2YXRlOgotICBUVGhyZWFkZWRTZXJ2ZXImIHNlcnZlcl87Ci0gIGZyaWVuZCBjbGFzcyBUVGhyZWFkZWRTZXJ2ZXI7Ci0KLSAgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRfOwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0XzsKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOwotfTsKLQotCi1UVGhyZWFkZWRTZXJ2ZXI6OlRUaHJlYWRlZFNlcnZlcihzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KToKLSAgVFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSwKLSAgc3RvcF8oZmFsc2UpIHsKLSAgdGhyZWFkRmFjdG9yeV8gPSBzaGFyZWRfcHRyPFBvc2l4VGhyZWFkRmFjdG9yeT4obmV3IFBvc2l4VGhyZWFkRmFjdG9yeSgpKTsKLX0KLQotVFRocmVhZGVkU2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KToKLSAgVFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSwKLSAgdGhyZWFkRmFjdG9yeV8odGhyZWFkRmFjdG9yeSksCi0gIHN0b3BfKGZhbHNlKSB7Ci19Ci0KLVRUaHJlYWRlZFNlcnZlcjo6flRUaHJlYWRlZFNlcnZlcigpIHt9Ci0KLXZvaWQgVFRocmVhZGVkU2VydmVyOjpzZXJ2ZSgpIHsKLQotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGNsaWVudDsKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydDsKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnQ7Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sOwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2w7Ci0KLSAgdHJ5IHsKLSAgICAvLyBTdGFydCB0aGUgc2VydmVyIGxpc3RlbmluZwotICAgIHNlcnZlclRyYW5zcG9ydF8tPmxpc3RlbigpOwotICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkZWRTZXJ2ZXI6OnJ1bigpIGxpc3RlbigpOiAiKSArdHR4LndoYXQoKTsKLSAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFJ1biB0aGUgcHJlU2VydmUgZXZlbnQKLSAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gTlVMTCkgewotICAgIGV2ZW50SGFuZGxlcl8tPnByZVNlcnZlKCk7Ci0gIH0KLQotICB3aGlsZSAoIXN0b3BfKSB7Ci0gICAgdHJ5IHsKLSAgICAgIGNsaWVudC5yZXNldCgpOwotICAgICAgaW5wdXRUcmFuc3BvcnQucmVzZXQoKTsKLSAgICAgIG91dHB1dFRyYW5zcG9ydC5yZXNldCgpOwotICAgICAgaW5wdXRQcm90b2NvbC5yZXNldCgpOwotICAgICAgb3V0cHV0UHJvdG9jb2wucmVzZXQoKTsKLQotICAgICAgLy8gRmV0Y2ggY2xpZW50IGZyb20gc2VydmVyCi0gICAgICBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnRfLT5hY2NlcHQoKTsKLQotICAgICAgLy8gTWFrZSBJTyB0cmFuc3BvcnRzCi0gICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydChjbGllbnQpOwotICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydChjbGllbnQpOwotICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOwotICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOwotCi0gICAgICBUVGhyZWFkZWRTZXJ2ZXI6OlRhc2sqIHRhc2sgPSBuZXcgVFRocmVhZGVkU2VydmVyOjpUYXNrKCp0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3JfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50KTsKLQotICAgICAgLy8gQ3JlYXRlIGEgdGFzawotICAgICAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUgPQotICAgICAgICBzaGFyZWRfcHRyPFJ1bm5hYmxlPih0YXNrKTsKLQotICAgICAgLy8gQ3JlYXRlIGEgdGhyZWFkIGZvciB0aGlzIHRhc2sKLSAgICAgIHNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQgPQotICAgICAgICBzaGFyZWRfcHRyPFRocmVhZD4odGhyZWFkRmFjdG9yeV8tPm5ld1RocmVhZChydW5uYWJsZSkpOwotCi0gICAgICAvLyBJbnNlcnQgdGhyZWFkIGludG8gdGhlIHNldCBvZiB0aHJlYWRzCi0gICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKHRhc2tzTW9uaXRvcl8pOwotICAgICAgICB0YXNrc18uaW5zZXJ0KHRhc2spOwotICAgICAgfQotCi0gICAgICAvLyBTdGFydCB0aGUgdGhyZWFkIQotICAgICAgdGhyZWFkLT5zdGFydCgpOwotCi0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBpbnB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IG91dHB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKGNsaWVudCAhPSBOVUxMKSB7IGNsaWVudC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKCFzdG9wXyB8fCB0dHguZ2V0VHlwZSgpICE9IFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVEKSB7Ci0gICAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRlZFNlcnZlcjogVFNlcnZlclRyYW5zcG9ydCBkaWVkIG9uIGFjY2VwdDogIikgKyB0dHgud2hhdCgpOwotICAgICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgICAgfQotICAgICAgY29udGludWU7Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgdHgpIHsKLSAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IGlucHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgb3V0cHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAoY2xpZW50ICE9IE5VTEwpIHsgY2xpZW50LT5jbG9zZSgpOyB9Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkZWRTZXJ2ZXI6IENhdWdodCBURXhjZXB0aW9uOiAiKSArIHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9IGNhdGNoIChzdHJpbmcgcykgewotICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgaW5wdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBvdXRwdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChjbGllbnQgIT0gTlVMTCkgeyBjbGllbnQtPmNsb3NlKCk7IH0KLSAgICAgIHN0cmluZyBlcnJTdHIgPSAiVFRocmVhZGVkU2VydmVyOiBVbmtub3duIGV4Y2VwdGlvbjogIiArIHM7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gSWYgc3RvcHBlZCBtYW51YWxseSwgbWFrZSBzdXJlIHRvIGNsb3NlIHNlcnZlciB0cmFuc3BvcnQKLSAgaWYgKHN0b3BfKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHNlcnZlclRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiAmdHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRlZFNlcnZlcjogRXhjZXB0aW9uIHNodXR0aW5nIGRvd246ICIpICsgdHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIFN5bmNocm9uaXplZCBzKHRhc2tzTW9uaXRvcl8pOwotICAgICAgd2hpbGUgKCF0YXNrc18uZW1wdHkoKSkgewotICAgICAgICB0YXNrc01vbml0b3JfLndhaXQoKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChURXhjZXB0aW9uICZ0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZGVkU2VydmVyOiBFeGNlcHRpb24gam9pbmluZyB3b3JrZXJzOiAiKSArIHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfQotICAgIHN0b3BfID0gZmFsc2U7Ci0gIH0KLQotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oIGIvbGliL2NwcC9zcmMvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDA4MTFhLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UVEhSRUFERURTRVJWRVJfSF8KLSNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFRIUkVBREVEU0VSVkVSX0hfIDEKLQotI2luY2x1ZGUgPHNlcnZlci9UU2VydmVyLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9Nb25pdG9yLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvVGhyZWFkLmg+Ci0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKLQotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0OwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3I7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk7Ci0KLWNsYXNzIFRUaHJlYWRlZFNlcnZlciA6IHB1YmxpYyBUU2VydmVyIHsKLQotIHB1YmxpYzoKLSAgY2xhc3MgVGFzazsKLQotICBUVGhyZWFkZWRTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkpOwotCi0gIFRUaHJlYWRlZFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkpOwotCi0gIHZpcnR1YWwgflRUaHJlYWRlZFNlcnZlcigpOwotCi0gIHZpcnR1YWwgdm9pZCBzZXJ2ZSgpOwotCi0gIHZvaWQgc3RvcCgpIHsKLSAgICBzdG9wXyA9IHRydWU7Ci0gICAgc2VydmVyVHJhbnNwb3J0Xy0+aW50ZXJydXB0KCk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeV87Ci0gIHZvbGF0aWxlIGJvb2wgc3RvcF87Ci0KLSAgTW9uaXRvciB0YXNrc01vbml0b3JfOwotICBzdGQ6OnNldDxUYXNrKj4gdGFza3NfOwotCi19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UVEhSRUFERURTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxNDY1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uY3BwCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisKK3VpbnQzMl90IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6cmVhZChhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QpIHsKKyAgdWludDMyX3QgeGZlciA9IDA7CisgIHN0ZDo6c3RyaW5nIGZuYW1lOworICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlOworICBpbnQxNl90IGZpZDsKKworICB4ZmVyICs9IGlwcm90LT5yZWFkU3RydWN0QmVnaW4oZm5hbWUpOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgeGZlciArPSBpcHJvdC0+cmVhZEZpZWxkQmVnaW4oZm5hbWUsIGZ0eXBlLCBmaWQpOworICAgIGlmIChmdHlwZSA9PSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RPUCkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHN3aXRjaCAoZmlkKSB7CisgICAgY2FzZSAxOgorICAgICAgaWYgKGZ0eXBlID09IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJJTkcpIHsKKyAgICAgICAgeGZlciArPSBpcHJvdC0+cmVhZFN0cmluZyhtZXNzYWdlXyk7CisgICAgICB9IGVsc2UgeworICAgICAgICB4ZmVyICs9IGlwcm90LT5za2lwKGZ0eXBlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGlmIChmdHlwZSA9PSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTMyKSB7CisgICAgICAgIGludDMyX3QgdHlwZTsKKyAgICAgICAgeGZlciArPSBpcHJvdC0+cmVhZEkzMih0eXBlKTsKKyAgICAgICAgdHlwZV8gPSAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSl0eXBlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgeGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgeGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgeGZlciArPSBpcHJvdC0+cmVhZEZpZWxkRW5kKCk7CisgIH0KKworICB4ZmVyICs9IGlwcm90LT5yZWFkU3RydWN0RW5kKCk7CisgIHJldHVybiB4ZmVyOworfQorCit1aW50MzJfdCBUQXBwbGljYXRpb25FeGNlcHRpb246OndyaXRlKGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCkgY29uc3QgeworICB1aW50MzJfdCB4ZmVyID0gMDsKKyAgeGZlciArPSBvcHJvdC0+d3JpdGVTdHJ1Y3RCZWdpbigiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIik7CisgIHhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRCZWdpbigibWVzc2FnZSIsIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJJTkcsIDEpOworICB4ZmVyICs9IG9wcm90LT53cml0ZVN0cmluZyhtZXNzYWdlXyk7CisgIHhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRFbmQoKTsKKyAgeGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEJlZ2luKCJ0eXBlIiwgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kzMiwgMik7CisgIHhmZXIgKz0gb3Byb3QtPndyaXRlSTMyKHR5cGVfKTsKKyAgeGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEVuZCgpOworICB4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkU3RvcCgpOworICB4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEVuZCgpOworICByZXR1cm4geGZlcjsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDYxOGZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UQVBQTElDQVRJT05FWENFUFRJT05fSF8KKyNkZWZpbmUgX1RIUklGVF9UQVBQTElDQVRJT05FWENFUFRJT05fSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCituYW1lc3BhY2UgcHJvdG9jb2wgeworY2xhc3MgVFByb3RvY29sOworfQorCitjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gOiBwdWJsaWMgVEV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIC8qKgorICAgKiBFcnJvciBjb2RlcyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgZXhjZXB0aW9ucy4KKyAgICovCisgIGVudW0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSB7CisgICAgVU5LTk9XTiA9IDAsCisgICAgVU5LTk9XTl9NRVRIT0QgPSAxLAorICAgIElOVkFMSURfTUVTU0FHRV9UWVBFID0gMiwKKyAgICBXUk9OR19NRVRIT0RfTkFNRSA9IDMsCisgICAgQkFEX1NFUVVFTkNFX0lEID0gNCwKKyAgICBNSVNTSU5HX1JFU1VMVCA9IDUsCisgICAgSU5URVJOQUxfRVJST1IgPSA2LAorICAgIFBST1RPQ09MX0VSUk9SID0gNywKKyAgICBJTlZBTElEX1RSQU5TRk9STSA9IDgsCisgICAgSU5WQUxJRF9QUk9UT0NPTCA9IDksCisgICAgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMAorICB9OworCisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIDogVEV4Y2VwdGlvbigpLCB0eXBlXyhVTktOT1dOKSB7fQorCisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIHR5cGUpIDogVEV4Y2VwdGlvbigpLCB0eXBlXyh0eXBlKSB7fQorCisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOiBURXhjZXB0aW9uKG1lc3NhZ2UpLCB0eXBlXyhVTktOT1dOKSB7fQorCisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKQorICAgIDogVEV4Y2VwdGlvbihtZXNzYWdlKSwgdHlwZV8odHlwZSkge30KKworICB2aXJ0dWFsIH5UQXBwbGljYXRpb25FeGNlcHRpb24oKSBub2V4Y2VwdCB7fQorCisgIC8qKgorICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBlcnJvcgorICAgKiB0aGF0IGhhcyBvY2N1cnJlZC4KKyAgICoKKyAgICogQHJldHVybiBFcnJvciBjb2RlCisgICAqLworICBUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQorCisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0IHsKKyAgICBpZiAobWVzc2FnZV8uZW1wdHkoKSkgeworICAgICAgc3dpdGNoICh0eXBlXykgeworICAgICAgY2FzZSBVTktOT1dOOgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogVW5rbm93biBhcHBsaWNhdGlvbiBleGNlcHRpb24iOworICAgICAgY2FzZSBVTktOT1dOX01FVEhPRDoKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IFVua25vd24gbWV0aG9kIjsKKyAgICAgIGNhc2UgSU5WQUxJRF9NRVNTQUdFX1RZUEU6CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBJbnZhbGlkIG1lc3NhZ2UgdHlwZSI7CisgICAgICBjYXNlIFdST05HX01FVEhPRF9OQU1FOgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogV3JvbmcgbWV0aG9kIG5hbWUiOworICAgICAgY2FzZSBCQURfU0VRVUVOQ0VfSUQ6CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBCYWQgc2VxdWVuY2UgaWRlbnRpZmllciI7CisgICAgICBjYXNlIE1JU1NJTkdfUkVTVUxUOgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogTWlzc2luZyByZXN1bHQiOworICAgICAgY2FzZSBJTlRFUk5BTF9FUlJPUjoKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IEludGVybmFsIGVycm9yIjsKKyAgICAgIGNhc2UgUFJPVE9DT0xfRVJST1I6CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBQcm90b2NvbCBlcnJvciI7CisgICAgICBjYXNlIElOVkFMSURfVFJBTlNGT1JNOgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogSW52YWxpZCB0cmFuc2Zvcm0iOworICAgICAgY2FzZSBJTlZBTElEX1BST1RPQ09MOgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogSW52YWxpZCBwcm90b2NvbCI7CisgICAgICBjYXNlIFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFOgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogVW5zdXBwb3J0ZWQgY2xpZW50IHR5cGUiOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IChJbnZhbGlkIGV4Y2VwdGlvbiB0eXBlKSI7CisgICAgICB9OworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbWVzc2FnZV8uY19zdHIoKTsKKyAgICB9CisgIH0KKworICB1aW50MzJfdCByZWFkKHByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90KTsKKyAgdWludDMyX3Qgd3JpdGUocHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBFcnJvciBjb2RlCisgICAqLworICBUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIHR5cGVfOworfTsKK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UQVBQTElDQVRJT05FWENFUFRJT05fSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UQmFzZS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3NGJjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UQmFzZS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RCQVNFX0hfCisjZGVmaW5lIF9USFJJRlRfVEJBU0VfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKworY2xhc3MgVEJhc2UgeworcHVibGljOgorICB2aXJ0dWFsIH5UQmFzZSgpe307CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZChwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCkgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlKHByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdCA9IDA7Cit9OworfQorfSAvLyBhcGFjaGU6OnRocmlmdAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RCQVNFX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhkMzQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9URGlzcGF0Y2hQcm9jZXNzb3IuaApAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBfVEhSSUZUX1RESVNQQVRDSFBST0NFU1NPUl9IXworI2RlZmluZSBfVEhSSUZUX1RESVNQQVRDSFBST0NFU1NPUl9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvVFByb2Nlc3Nvci5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCisvKioKKyAqIFREaXNwYXRjaFByb2Nlc3NvciBpcyBhIGhlbHBlciBjbGFzcyB0byBwYXJzZSB0aGUgbWVzc2FnZSBoZWFkZXIgdGhlbiBjYWxsCisgKiBhbm90aGVyIGZ1bmN0aW9uIHRvIGRpc3BhdGNoIGJhc2VkIG9uIHRoZSBmdW5jdGlvbiBuYW1lLgorICoKKyAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgZGlzcGF0Y2hDYWxsKCkgdG8gZGlzcGF0Y2ggb24gdGhlIGZ1bmN0aW9uIG5hbWUuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+CitjbGFzcyBURGlzcGF0Y2hQcm9jZXNzb3JUIDogcHVibGljIFRQcm9jZXNzb3IgeworcHVibGljOgorICB2aXJ0dWFsIGJvb2wgcHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSB7CisgICAgcHJvdG9jb2w6OlRQcm90b2NvbCogaW5SYXcgPSBpbi5nZXQoKTsKKyAgICBwcm90b2NvbDo6VFByb3RvY29sKiBvdXRSYXcgPSBvdXQuZ2V0KCk7CisKKyAgICAvLyBUcnkgdG8gZHluYW1pYyBjYXN0IHRvIHRoZSB0ZW1wbGF0ZSBwcm90b2NvbCB0eXBlCisgICAgUHJvdG9jb2xfKiBzcGVjaWZpY0luID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KGluUmF3KTsKKyAgICBQcm90b2NvbF8qIHNwZWNpZmljT3V0ID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KG91dFJhdyk7CisgICAgaWYgKHNwZWNpZmljSW4gJiYgc3BlY2lmaWNPdXQpIHsKKyAgICAgIHJldHVybiBwcm9jZXNzRmFzdChzcGVjaWZpY0luLCBzcGVjaWZpY091dCwgY29ubmVjdGlvbkNvbnRleHQpOworICAgIH0KKworICAgIC8vIExvZyB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgdG8gdXNlIHRoZSBzbG93IHBhdGgKKyAgICBUX0dFTkVSSUNfUFJPVE9DT0wodGhpcywgaW5SYXcsIHNwZWNpZmljSW4pOworICAgIFRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBvdXRSYXcsIHNwZWNpZmljT3V0KTsKKworICAgIHN0ZDo6c3RyaW5nIGZuYW1lOworICAgIHByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGU7CisgICAgaW50MzJfdCBzZXFpZDsKKyAgICBpblJhdy0+cmVhZE1lc3NhZ2VCZWdpbihmbmFtZSwgbXR5cGUsIHNlcWlkKTsKKworICAgIC8vIElmIHRoaXMgZG9lc24ndCBsb29rIGxpa2UgYSB2YWxpZCBjYWxsLCBsb2cgYW4gZXJyb3IgYW5kIHJldHVybiBmYWxzZSBzbworICAgIC8vIHRoYXQgdGhlIHNlcnZlciB3aWxsIGNsb3NlIHRoZSBjb25uZWN0aW9uLgorICAgIC8vCisgICAgLy8gKFRoZSBvbGQgZ2VuZXJhdGVkIHByb2Nlc3NvciBjb2RlIHVzZWQgdG8gdHJ5IHRvIHNraXAgYSBUX1NUUlVDVCBhbmQKKyAgICAvLyBjb250aW51ZS4gIEhvd2V2ZXIsIHRoYXQgc2VlbXMgdW5zYWZlLikKKyAgICBpZiAobXR5cGUgIT0gcHJvdG9jb2w6OlRfQ0FMTCAmJiBtdHlwZSAhPSBwcm90b2NvbDo6VF9PTkVXQVkpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInJlY2VpdmVkIGludmFsaWQgbWVzc2FnZSB0eXBlICVkIGZyb20gY2xpZW50IiwgbXR5cGUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0aGlzLT5kaXNwYXRjaENhbGwoaW5SYXcsIG91dFJhdywgZm5hbWUsIHNlcWlkLCBjb25uZWN0aW9uQ29udGV4dCk7CisgIH0KKworcHJvdGVjdGVkOgorICBib29sIHByb2Nlc3NGYXN0KFByb3RvY29sXyogaW4sIFByb3RvY29sXyogb3V0LCB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgeworICAgIHN0ZDo6c3RyaW5nIGZuYW1lOworICAgIHByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGU7CisgICAgaW50MzJfdCBzZXFpZDsKKyAgICBpbi0+cmVhZE1lc3NhZ2VCZWdpbihmbmFtZSwgbXR5cGUsIHNlcWlkKTsKKworICAgIGlmIChtdHlwZSAhPSBwcm90b2NvbDo6VF9DQUxMICYmIG10eXBlICE9IHByb3RvY29sOjpUX09ORVdBWSkgeworICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigicmVjZWl2ZWQgaW52YWxpZCBtZXNzYWdlIHR5cGUgJWQgZnJvbSBjbGllbnQiLCBtdHlwZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMtPmRpc3BhdGNoQ2FsbFRlbXBsYXRlZChpbiwgb3V0LCBmbmFtZSwgc2VxaWQsIGNvbm5lY3Rpb25Db250ZXh0KTsKKyAgfQorCisgIC8qKgorICAgKiBkaXNwYXRjaENhbGwoKSBtZXRob2RzIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcworICAgKi8KKyAgdmlydHVhbCBib29sIGRpc3BhdGNoQ2FsbChhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjYWxsQ29udGV4dCkgPSAwOworCisgIHZpcnR1YWwgYm9vbCBkaXNwYXRjaENhbGxUZW1wbGF0ZWQoUHJvdG9jb2xfKiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbF8qIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjYWxsQ29udGV4dCkgPSAwOworfTsKKworLyoqCisgKiBOb24tdGVtcGxhdGl6ZWQgdmVyc2lvbiBvZiBURGlzcGF0Y2hQcm9jZXNzb3IsIHRoYXQgZG9lc24ndCBib3RoZXIgdHJ5aW5nIHRvCisgKiBwZXJmb3JtIGEgZHluYW1pY19jYXN0LgorICovCitjbGFzcyBURGlzcGF0Y2hQcm9jZXNzb3IgOiBwdWJsaWMgVFByb2Nlc3NvciB7CitwdWJsaWM6CisgIHZpcnR1YWwgYm9vbCBwcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpIHsKKyAgICBzdGQ6OnN0cmluZyBmbmFtZTsKKyAgICBwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlOworICAgIGludDMyX3Qgc2VxaWQ7CisgICAgaW4tPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCBzZXFpZCk7CisKKyAgICBpZiAobXR5cGUgIT0gcHJvdG9jb2w6OlRfQ0FMTCAmJiBtdHlwZSAhPSBwcm90b2NvbDo6VF9PTkVXQVkpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInJlY2VpdmVkIGludmFsaWQgbWVzc2FnZSB0eXBlICVkIGZyb20gY2xpZW50IiwgbXR5cGUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBkaXNwYXRjaENhbGwoaW4uZ2V0KCksIG91dC5nZXQoKSwgZm5hbWUsIHNlcWlkLCBjb25uZWN0aW9uQ29udGV4dCk7CisgIH0KKworcHJvdGVjdGVkOgorICB2aXJ0dWFsIGJvb2wgZGlzcGF0Y2hDYWxsKGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNhbGxDb250ZXh0KSA9IDA7Cit9OworCisvLyBTcGVjaWFsaXplIFREaXNwYXRjaFByb2Nlc3NvclQgZm9yIFRQcm90b2NvbCBhbmQgVER1bW15UHJvdG9jb2wganVzdCB0byB1c2UKKy8vIHRoZSBnZW5lcmljIFREaXNwYXRjaFByb2Nlc3Nvci4KK3RlbXBsYXRlIDw+CitjbGFzcyBURGlzcGF0Y2hQcm9jZXNzb3JUPHByb3RvY29sOjpURHVtbXlQcm90b2NvbD4gOiBwdWJsaWMgVERpc3BhdGNoUHJvY2Vzc29yIHt9OwordGVtcGxhdGUgPD4KK2NsYXNzIFREaXNwYXRjaFByb2Nlc3NvclQ8cHJvdG9jb2w6OlRQcm90b2NvbD4gOiBwdWJsaWMgVERpc3BhdGNoUHJvY2Vzc29yIHt9OworfQorfSAvLyBhcGFjaGU6OnRocmlmdAorCisjZW5kaWYgLy8gX1RIUklGVF9URElTUEFUQ0hQUk9DRVNTT1JfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UTG9nZ2luZy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RMb2dnaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdmZjAzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UTG9nZ2luZy5oCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UTE9HR0lOR19IXworI2RlZmluZSBfVEhSSUZUX1RMT0dHSU5HX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKy8qKgorICogQ29udGFpbnMgdXRpbGl0eSBtYWNyb3MgZm9yIGRlYnVnZ2luZyBhbmQgbG9nZ2luZy4KKyAqCisgKi8KKworI2luY2x1ZGUgPHRpbWUuaD4KKworI2lmZGVmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisvKioKKyAqIFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA9IDA6IGFsbCBkZWJ1Z2dpbmcgdHVybmVkIG9mZiwgZGVidWcgbWFjcm9zIHVuZGVmaW5lZAorICogVF9HTE9CQUxfREVCVUdHSU5HX0xFVkVMID0gMTogYWxsIGRlYnVnZ2luZyB0dXJuZWQgb24KKyAqLworI2RlZmluZSBUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgMAorCisvKioKKyAqIFRfR0xPQkFMX0xPR0dJTkdfTEVWRUwgPSAwOiBhbGwgbG9nZ2luZyB0dXJuZWQgb2ZmLCBsb2dnaW5nIG1hY3JvcyB1bmRlZmluZWQKKyAqIFRfR0xPQkFMX0xPR0dJTkdfTEVWRUwgPSAxOiBhbGwgbG9nZ2luZyB0dXJuZWQgb24KKyAqLworI2RlZmluZSBUX0dMT0JBTF9MT0dHSU5HX0xFVkVMIDEKKworLyoqCisgKiBTdGFuZGFyZCB3cmFwcGVyIGFyb3VuZCBmcHJpbnRmIHdoYXQgd2lsbCBwcmVmaXggdGhlIGZpbGUgbmFtZSBhbmQgbGluZQorICogbnVtYmVyIHRvIHRoZSBsaW5lLiBVc2VzIFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCB0byBjb250cm9sIHdoZXRoZXIgaXQgaXMKKyAqIHR1cm5lZCBvbiBvciBvZmYuCisgKgorICogQHBhcmFtIGZvcm1hdF9zdHJpbmcKKyAqLworI2lmIFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA+IDAKKyNkZWZpbmUgVF9ERUJVRyhmb3JtYXRfc3RyaW5nLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlslcywlZF0gIiBmb3JtYXRfc3RyaW5nICIgXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgIFwKKyAgfQorI2Vsc2UKKyNkZWZpbmUgVF9ERUJVRyhmb3JtYXRfc3RyaW5nLCAuLi4pCisjZW5kaWYKKworLyoqCisgKiBhbmFsb2dvdXMgdG8gVF9ERUJVRyBidXQgYWxzbyBwcmludHMgdGhlIHRpbWUKKyAqCisgKiBAcGFyYW0gc3RyaW5nICBmb3JtYXRfc3RyaW5nIGlucHV0OiBwcmludGYgc3R5bGUgZm9ybWF0IHN0cmluZworICovCisjaWYgVF9HTE9CQUxfREVCVUdHSU5HX0xFVkVMID4gMAorI2RlZmluZSBUX0RFQlVHX1QoZm9ybWF0X3N0cmluZywgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGltZV90IG5vdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2hhciBkYmd0aW1lWzI2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGltZSgmbm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVEhSSUZUX0NUSU1FX1IoJm5vdywgZGJndGltZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZGJndGltZVsyNF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZnByaW50ZihzdGRlcnIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAiWyVzLCVkXSBbJXNdICIgZm9ybWF0X3N0cmluZyAiIFxuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBfX0ZJTEVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBfX0xJTkVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBkYmd0aW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZWxzZQorI2RlZmluZSBUX0RFQlVHX1QoZm9ybWF0X3N0cmluZywgLi4uKQorI2VuZGlmCisKKy8qKgorICogYW5hbG9nb3VzIHRvIFRfREVCVUcgYnV0IHVzZXMgaW5wdXQgbGV2ZWwgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBzdHJpbmcKKyAqIHNob3VsZCBiZSBsb2dnZWQuCisgKgorICogQHBhcmFtIGludCAgICAgbGV2ZWw6IHNwZWNpZmllZCBkZWJ1ZyBsZXZlbAorICogQHBhcmFtIHN0cmluZyAgZm9ybWF0X3N0cmluZyBpbnB1dDogZm9ybWF0IHN0cmluZworICovCisjZGVmaW5lIFRfREVCVUdfTChsZXZlbCwgZm9ybWF0X3N0cmluZywgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICgobGV2ZWwpID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZnByaW50ZihzdGRlcnIsICJbJXMsJWRdICIgZm9ybWF0X3N0cmluZyAiIFxuIiwgX19GSUxFX18sIF9fTElORV9fLCAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICBcCisgIH0KKworLyoqCisgKiBFeHBsaWNpdCBlcnJvciBsb2dnaW5nLiBQcmludHMgdGltZSwgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlcgorICoKKyAqIEBwYXJhbSBzdHJpbmcgIGZvcm1hdF9zdHJpbmcgaW5wdXQ6IHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nCisgKi8KKyNkZWZpbmUgVF9FUlJPUihmb3JtYXRfc3RyaW5nLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0aW1lX3Qgbm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjaGFyIGRiZ3RpbWVbMjZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0aW1lKCZub3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUSFJJRlRfQ1RJTUVfUigmbm93LCBkYmd0aW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkYmd0aW1lWzI0XSA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICJbJXMsJWRdIFslc10gRVJST1I6ICIgZm9ybWF0X3N0cmluZyAiIFxuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fRklMRV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fTElORV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRiZ3RpbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvKioKKyAqIEFuYWxvZ291cyB0byBUX0VSUk9SLCBhZGRpdGlvbmFsbHkgYWJvcnRpbmcgdGhlIHByb2Nlc3MuCisgKiBXQVJOSU5HOiBtYWNybyBjYWxscyBhYm9ydCgpLCBlbmRpbmcgcHJvZ3JhbSBleGVjdXRpb24KKyAqCisgKiBAcGFyYW0gc3RyaW5nICBmb3JtYXRfc3RyaW5nIGlucHV0OiBwcmludGYgc3R5bGUgZm9ybWF0IHN0cmluZworICovCisjZGVmaW5lIFRfRVJST1JfQUJPUlQoZm9ybWF0X3N0cmluZywgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGltZV90IG5vdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2hhciBkYmd0aW1lWzI2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGltZSgmbm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVEhSSUZUX0NUSU1FX1IoJm5vdywgZGJndGltZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGJndGltZVsyNF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZnByaW50ZihzdGRlcnIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAiWyVzLCVkXSBbJXNdIEVSUk9SOiBHb2luZyB0byBhYm9ydCAiIGZvcm1hdF9zdHJpbmcgIiBcbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX0ZJTEVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX0xJTkVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkYmd0aW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXhpdCgxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLyoqCisgKiBMb2cgaW5wdXQgbWVzc2FnZQorICoKKyAqIEBwYXJhbSBzdHJpbmcgIGZvcm1hdF9zdHJpbmcgaW5wdXQ6IHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nCisgKi8KKyNpZiBUX0dMT0JBTF9MT0dHSU5HX0xFVkVMID4gMAorI2RlZmluZSBUX0xPR19PUEVSKGZvcm1hdF9zdHJpbmcsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChUX0dMT0JBTF9MT0dHSU5HX0xFVkVMID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGltZV90IG5vdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2hhciBkYmd0aW1lWzI2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGltZSgmbm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVEhSSUZUX0NUSU1FX1IoJm5vdywgZGJndGltZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZGJndGltZVsyNF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZnByaW50ZihzdGRlcnIsICJbJXNdICIgZm9ybWF0X3N0cmluZyAiIFxuIiwgZGJndGltZSwgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZWxzZQorI2RlZmluZSBUX0xPR19PUEVSKGZvcm1hdF9zdHJpbmcsIC4uLikKKyNlbmRpZgorCisvKioKKyAqIFRfR0xPQkFMX0RFQlVHX1ZJUlRVQUwgPSAwIG9yIHVuc2V0OiBub3JtYWwgb3BlcmF0aW9uLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgY2FsbCBkZWJ1ZyBtZXNzYWdlcyBkaXNhYmxlZAorICogVF9HTE9CQUxfREVCVUdfVklSVFVBTCA9IDE6ICAgICAgICAgIGxvZyBhIGRlYnVnIG1lc3NhZ2VzIHdoZW5ldmVyIGFuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZvaWRhYmxlIHZpcnR1YWwgY2FsbCBpcyBtYWRlCisgKiBUX0dMT0JBTF9ERUJVR19WSVJUVUFMID0gMjogICAgICAgICAgcmVjb3JkIGRldGFpbGVkIGluZm8gdGhhdCBjYW4gYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGVkIGJ5IGNhbGxpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvZmlsZV9wcmludF9pbmZvKCkKKyAqLworI2lmIFRfR0xPQkFMX0RFQlVHX1ZJUlRVQUwgPiAxCisjZGVmaW5lIFRfVklSVFVBTF9DQUxMKCkgOjphcGFjaGU6OnRocmlmdDo6cHJvZmlsZV92aXJ0dWFsX2NhbGwodHlwZWlkKCp0aGlzKSkKKyNkZWZpbmUgVF9HRU5FUklDX1BST1RPQ09MKHRlbXBsYXRlX2NsYXNzLCBnZW5lcmljX3Byb3QsIHNwZWNpZmljX3Byb3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIShzcGVjaWZpY19wcm90KSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDo6YXBhY2hlOjp0aHJpZnQ6OnByb2ZpbGVfZ2VuZXJpY19wcm90b2NvbCh0eXBlaWQoKnRlbXBsYXRlX2NsYXNzKSwgdHlwZWlkKCpnZW5lcmljX3Byb3QpKTsgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbGlmIFRfR0xPQkFMX0RFQlVHX1ZJUlRVQUwgPT0gMQorI2RlZmluZSBUX1ZJUlRVQUxfQ0FMTCgpIGZwcmludGYoc3RkZXJyLCAiWyVzLCVkXSB2aXJ0dWFsIGNhbGxcbiIsIF9fRklMRV9fLCBfX0xJTkVfXykKKyNkZWZpbmUgVF9HRU5FUklDX1BST1RPQ09MKHRlbXBsYXRlX2NsYXNzLCBnZW5lcmljX3Byb3QsIHNwZWNpZmljX3Byb3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIShzcGVjaWZpY19wcm90KSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiWyVzLCVkXSBmYWlsZWQgdG8gY2FzdCB0byBzcGVjaWZpYyBwcm90b2NvbCB0eXBlXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOyAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIFRfVklSVFVBTF9DQUxMKCkKKyNkZWZpbmUgVF9HRU5FUklDX1BST1RPQ09MKHRlbXBsYXRlX2NsYXNzLCBnZW5lcmljX3Byb3QsIHNwZWNpZmljX3Byb3QpCisjZW5kaWYKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UTE9HR0lOR19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RPdXRwdXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RPdXRwdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlM2E5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVE91dHB1dC5jcHAKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVFRvU3RyaW5nLmg+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisKK1RPdXRwdXQgR2xvYmFsT3V0cHV0OworCit2b2lkIFRPdXRwdXQ6OnByaW50Zihjb25zdCBjaGFyKiBtZXNzYWdlLCAuLi4pIHsKKyNpZm5kZWYgVEhSSUZUX1NRVUVMQ0hfQ09OU09MRV9PVVRQVVQKKyAgLy8gVHJ5IHRvIHJlZHVjZSBoZWFwIHVzYWdlLCBldmVuIGlmIHByaW50ZiBpcyBjYWxsZWQgcmFyZWx5LgorICBzdGF0aWMgY29uc3QgaW50IFNUQUNLX0JVRl9TSVpFID0gMjU2OworICBjaGFyIHN0YWNrX2J1ZltTVEFDS19CVUZfU0laRV07CisgIHZhX2xpc3QgYXA7CisKKyNpZmRlZiBfTVNDX1ZFUgorICB2YV9zdGFydChhcCwgbWVzc2FnZSk7CisgIGludCBuZWVkID0gX3ZzY3ByaW50ZihtZXNzYWdlLCBhcCk7CisgIHZhX2VuZChhcCk7CisKKyAgaWYgKG5lZWQgPCBTVEFDS19CVUZfU0laRSkgeworICAgIHZhX3N0YXJ0KGFwLCBtZXNzYWdlKTsKKyAgICB2c25wcmludGZfcyhzdGFja19idWYsIFNUQUNLX0JVRl9TSVpFLCBfVFJVTkNBVEUsIG1lc3NhZ2UsIGFwKTsKKyAgICB2YV9lbmQoYXApOworICAgIGZfKHN0YWNrX2J1Zik7CisgICAgcmV0dXJuOworICB9CisjZWxzZQorICB2YV9zdGFydChhcCwgbWVzc2FnZSk7CisgIGludCBuZWVkID0gdnNucHJpbnRmKHN0YWNrX2J1ZiwgU1RBQ0tfQlVGX1NJWkUsIG1lc3NhZ2UsIGFwKTsKKyAgdmFfZW5kKGFwKTsKKworICBpZiAobmVlZCA8IFNUQUNLX0JVRl9TSVpFKSB7CisgICAgZl8oc3RhY2tfYnVmKTsKKyAgICByZXR1cm47CisgIH0KKyNlbmRpZgorCisgIGNoYXIqIGhlYXBfYnVmID0gKGNoYXIqKW1hbGxvYygobmVlZCArIDEpICogc2l6ZW9mKGNoYXIpKTsKKyAgaWYgKGhlYXBfYnVmID09IE5VTEwpIHsKKyNpZmRlZiBfTVNDX1ZFUgorICAgIHZhX3N0YXJ0KGFwLCBtZXNzYWdlKTsKKyAgICB2c25wcmludGZfcyhzdGFja19idWYsIFNUQUNLX0JVRl9TSVpFLCBfVFJVTkNBVEUsIG1lc3NhZ2UsIGFwKTsKKyAgICB2YV9lbmQoYXApOworI2VuZGlmCisgICAgLy8gTWFsbG9jIGZhaWxlZC4gIFdlIG1pZ2h0IGFzIHdlbGwgcHJpbnQgdGhlIHN0YWNrIGJ1ZmZlci4KKyAgICBmXyhzdGFja19idWYpOworICAgIHJldHVybjsKKyAgfQorCisgIHZhX3N0YXJ0KGFwLCBtZXNzYWdlKTsKKyAgaW50IHJ2YWwgPSB2c25wcmludGYoaGVhcF9idWYsIG5lZWQgKyAxLCBtZXNzYWdlLCBhcCk7CisgIHZhX2VuZChhcCk7CisgIC8vIFRPRE8oc2hpZ2luKTogaW5mb3JtIHVzZXIKKyAgaWYgKHJ2YWwgIT0gLTEpIHsKKyAgICBmXyhoZWFwX2J1Zik7CisgIH0KKyAgZnJlZShoZWFwX2J1Zik7CisjZW5kaWYKK30KKwordm9pZCBUT3V0cHV0OjplcnJvclRpbWVXcmFwcGVyKGNvbnN0IGNoYXIqIG1zZykgeworI2lmbmRlZiBUSFJJRlRfU1FVRUxDSF9DT05TT0xFX09VVFBVVAorICB0aW1lX3Qgbm93OworICBjaGFyIGRiZ3RpbWVbMjZdOworICB0aW1lKCZub3cpOworICBUSFJJRlRfQ1RJTUVfUigmbm93LCBkYmd0aW1lKTsKKyAgZGJndGltZVsyNF0gPSAwOworICBmcHJpbnRmKHN0ZGVyciwgIlRocmlmdDogJXMgJXNcbiIsIGRiZ3RpbWUsIG1zZyk7CisjZW5kaWYKK30KKwordm9pZCBUT3V0cHV0OjpwZXJyb3IoY29uc3QgY2hhciogbWVzc2FnZSwgaW50IGVycm5vX2NvcHkpIHsKKyAgc3RkOjpzdHJpbmcgb3V0ID0gbWVzc2FnZSArIHN0ZDo6c3RyaW5nKCI6ICIpICsgc3RyZXJyb3JfcyhlcnJub19jb3B5KTsKKyAgZl8ob3V0LmNfc3RyKCkpOworfQorCitzdGQ6OnN0cmluZyBUT3V0cHV0OjpzdHJlcnJvcl9zKGludCBlcnJub19jb3B5KSB7CisjaWZuZGVmIEhBVkVfU1RSRVJST1JfUgorICByZXR1cm4gImVycm5vID0gIiArIHRvX3N0cmluZyhlcnJub19jb3B5KTsKKyNlbHNlIC8vIEhBVkVfU1RSRVJST1JfUgorCisgIGNoYXIgYl9lcnJidWZbMTAyNF0gPSB7J1wwJ307CisjaWZkZWYgU1RSRVJST1JfUl9DSEFSX1AKKyAgY2hhciogYl9lcnJvciA9IHN0cmVycm9yX3IoZXJybm9fY29weSwgYl9lcnJidWYsIHNpemVvZihiX2VycmJ1ZikpOworI2Vsc2UKKyAgY2hhciogYl9lcnJvciA9IGJfZXJyYnVmOworICBpbnQgcnYgPSBzdHJlcnJvcl9yKGVycm5vX2NvcHksIGJfZXJyYnVmLCBzaXplb2YoYl9lcnJidWYpKTsKKyAgaWYgKHJ2ID09IC0xKSB7CisgICAgLy8gc3RyZXJyb3JfciBmYWlsZWQuICBvbWd3dGZiYnEuCisgICAgcmV0dXJuICJYU0ktY29tcGxpYW50IHN0cmVycm9yX3IoKSBmYWlsZWQgd2l0aCBlcnJubyA9ICIKKyAgICAgICAgICAgKyB0b19zdHJpbmcoZXJybm9fY29weSk7CisgIH0KKyNlbmRpZgorICAvLyBDYW4gYW55b25lIHByb3ZlIHRoYXQgZXhwbGljaXQgY2FzdCBpcyBwcm9iYWJseSBub3QgbmVjZXNzYXJ5CisgIC8vIHRvIGVuc3VyZSB0aGF0IHRoZSBzdHJpbmcgb2JqZWN0IGlzIGNvbnN0cnVjdGVkIGJlZm9yZQorICAvLyBiX2Vycm9yIGJlY29tZXMgaW52YWxpZD8KKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKGJfZXJyb3IpOworCisjZW5kaWYgLy8gSEFWRV9TVFJFUlJPUl9SCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVE91dHB1dC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RPdXRwdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzc1ZjczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RPdXRwdXQuaApAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9PVVRQVVRfSF8KKyNkZWZpbmUgX1RIUklGVF9PVVRQVVRfSF8gMQorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCitjbGFzcyBUT3V0cHV0IHsKK3B1YmxpYzoKKyAgVE91dHB1dCgpIDogZl8oJmVycm9yVGltZVdyYXBwZXIpIHt9CisKKyAgaW5saW5lIHZvaWQgc2V0T3V0cHV0RnVuY3Rpb24odm9pZCAoKmZ1bmN0aW9uKShjb25zdCBjaGFyKikpIHsgZl8gPSBmdW5jdGlvbjsgfQorCisgIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoY29uc3QgY2hhciogbWVzc2FnZSkgeyBmXyhtZXNzYWdlKTsgfQorCisgIC8vIEl0IGlzIGltcG9ydGFudCB0byBoYXZlIGEgY29uc3QgY2hhciogb3ZlcmxvYWQgaGVyZSBpbnN0ZWFkIG9mCisgIC8vIGp1c3QgdGhlIHN0cmluZyB2ZXJzaW9uLCBvdGhlcndpc2UgZXJybm8gY291bGQgYmUgY29ycnVwdGVkCisgIC8vIGlmIHRoZXJlIGlzIHNvbWUgcHJvYmxlbSBhbGxvY2F0aW5nIG1lbW9yeSB3aGVuIGNvbnN0cnVjdGluZworICAvLyB0aGUgc3RyaW5nLgorICB2b2lkIHBlcnJvcihjb25zdCBjaGFyKiBtZXNzYWdlLCBpbnQgZXJybm9fY29weSk7CisgIGlubGluZSB2b2lkIHBlcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwgaW50IGVycm5vX2NvcHkpIHsKKyAgICBwZXJyb3IobWVzc2FnZS5jX3N0cigpLCBlcnJub19jb3B5KTsKKyAgfQorCisgIHZvaWQgcHJpbnRmKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIC4uLik7CisKKyAgc3RhdGljIHZvaWQgZXJyb3JUaW1lV3JhcHBlcihjb25zdCBjaGFyKiBtc2cpOworCisgIC8qKiBKdXN0IGxpa2Ugc3RyZXJyb3JfciBidXQgcmV0dXJucyBhIEMrKyBzdHJpbmcgb2JqZWN0LiAqLworICBzdGF0aWMgc3RkOjpzdHJpbmcgc3RyZXJyb3JfcyhpbnQgZXJybm9fY29weSk7CisKK3ByaXZhdGU6CisgIHZvaWQgKCpmXykoY29uc3QgY2hhciopOworfTsKKworZXh0ZXJuIFRPdXRwdXQgR2xvYmFsT3V0cHV0OworfQorfSAvLyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQKKworI2VuZGlmIC8vX1RIUklGVF9PVVRQVVRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvVFByb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNDY0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVFByb2Nlc3Nvci5oCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUFJPQ0VTU09SX0hfCisjZGVmaW5lIF9USFJJRlRfVFBST0NFU1NPUl9IXyAxCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCisvKioKKyAqIFZpcnR1YWwgaW50ZXJmYWNlIGNsYXNzIHRoYXQgY2FuIGhhbmRsZSBldmVudHMgZnJvbSB0aGUgcHJvY2Vzc29yLiBUbworICogdXNlIHRoaXMgeW91IHNob3VsZCBzdWJjbGFzcyBpdCBhbmQgaW1wbGVtZW50IHRoZSBtZXRob2RzIHRoYXQgeW91IGNhcmUKKyAqIGFib3V0LiBZb3VyIHN1YmNsYXNzIGNhbiBhbHNvIHN0b3JlIGxvY2FsIGRhdGEgdGhhdCB5b3UgbWF5IGNhcmUgYWJvdXQsCisgKiBzdWNoIGFzIGFkZGl0aW9uYWwgImFyZ3VtZW50cyIgdG8gdGhlc2UgbWV0aG9kcyAoc3RvcmVkIGluIHRoZSBvYmplY3QKKyAqIGluc3RhbmNlJ3Mgc3RhdGUpLgorICovCitjbGFzcyBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VFByb2Nlc3NvckV2ZW50SGFuZGxlcigpIHt9CisKKyAgLyoqCisgICAqIENhbGxlZCBiZWZvcmUgY2FsbGluZyBvdGhlciBjYWxsYmFjayBtZXRob2RzLgorICAgKiBFeHBlY3RlZCB0byByZXR1cm4gc29tZSBzb3J0IG9mIGNvbnRleHQgb2JqZWN0LgorICAgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHBhc3NlZCB0byBhbGwgb3RoZXIgY2FsbGJhY2tzCisgICAqIGZvciB0aGF0IGZ1bmN0aW9uIGludm9jYXRpb24uCisgICAqLworICB2aXJ0dWFsIHZvaWQqIGdldENvbnRleHQoY29uc3QgY2hhciogZm5fbmFtZSwgdm9pZCogc2VydmVyQ29udGV4dCkgeworICAgICh2b2lkKWZuX25hbWU7CisgICAgKHZvaWQpc2VydmVyQ29udGV4dDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8qKgorICAgKiBFeHBlY3RlZCB0byBmcmVlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBjb250ZXh0LgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGZyZWVDb250ZXh0KHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgeworICAgICh2b2lkKWN0eDsKKyAgICAodm9pZClmbl9uYW1lOworICB9CisKKyAgLyoqCisgICAqIENhbGxlZCBiZWZvcmUgcmVhZGluZyBhcmd1bWVudHMuCisgICAqLworICB2aXJ0dWFsIHZvaWQgcHJlUmVhZCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKKyAgICAodm9pZCljdHg7CisgICAgKHZvaWQpZm5fbmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgYmV0d2VlbiByZWFkaW5nIGFyZ3VtZW50cyBhbmQgY2FsbGluZyB0aGUgaGFuZGxlci4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBwb3N0UmVhZCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUsIHVpbnQzMl90IGJ5dGVzKSB7CisgICAgKHZvaWQpY3R4OworICAgICh2b2lkKWZuX25hbWU7CisgICAgKHZvaWQpYnl0ZXM7CisgIH0KKworICAvKioKKyAgICogQ2FsbGVkIGJldHdlZW4gY2FsbGluZyB0aGUgaGFuZGxlciBhbmQgd3JpdGluZyB0aGUgcmVzcG9uc2UuCisgICAqLworICB2aXJ0dWFsIHZvaWQgcHJlV3JpdGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7CisgICAgKHZvaWQpY3R4OworICAgICh2b2lkKWZuX25hbWU7CisgIH0KKworICAvKioKKyAgICogQ2FsbGVkIGFmdGVyIHdyaXRpbmcgdGhlIHJlc3BvbnNlLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHBvc3RXcml0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUsIHVpbnQzMl90IGJ5dGVzKSB7CisgICAgKHZvaWQpY3R4OworICAgICh2b2lkKWZuX25hbWU7CisgICAgKHZvaWQpYnl0ZXM7CisgIH0KKworICAvKioKKyAgICogQ2FsbGVkIHdoZW4gYW4gYXN5bmMgZnVuY3Rpb24gY2FsbCBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGFzeW5jQ29tcGxldGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7CisgICAgKHZvaWQpY3R4OworICAgICh2b2lkKWZuX25hbWU7CisgIH0KKworICAvKioKKyAgICogQ2FsbGVkIGlmIHRoZSBoYW5kbGVyIHRocm93cyBhbiB1bmRlY2xhcmVkIGV4Y2VwdGlvbi4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBoYW5kbGVyRXJyb3Iodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7CisgICAgKHZvaWQpY3R4OworICAgICh2b2lkKWZuX25hbWU7CisgIH0KKworcHJvdGVjdGVkOgorICBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyKCkge30KK307CisKKy8qKgorICogQSBoZWxwZXIgY2xhc3MgdXNlZCBieSB0aGUgZ2VuZXJhdGVkIGNvZGUgdG8gZnJlZSBlYWNoIGNvbnRleHQuCisgKi8KK2NsYXNzIFRQcm9jZXNzb3JDb250ZXh0RnJlZXIgeworcHVibGljOgorICBUUHJvY2Vzc29yQ29udGV4dEZyZWVyKFRQcm9jZXNzb3JFdmVudEhhbmRsZXIqIGhhbmRsZXIsIHZvaWQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIG1ldGhvZCkKKyAgICA6IGhhbmRsZXJfKGhhbmRsZXIpLCBjb250ZXh0Xyhjb250ZXh0KSwgbWV0aG9kXyhtZXRob2QpIHt9CisgIH5UUHJvY2Vzc29yQ29udGV4dEZyZWVyKCkgeworICAgIGlmIChoYW5kbGVyXyAhPSBOVUxMKQorICAgICAgaGFuZGxlcl8tPmZyZWVDb250ZXh0KGNvbnRleHRfLCBtZXRob2RfKTsKKyAgfQorICB2b2lkIHVucmVnaXN0ZXIoKSB7IGhhbmRsZXJfID0gTlVMTDsgfQorCitwcml2YXRlOgorICBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckV2ZW50SGFuZGxlciogaGFuZGxlcl87CisgIHZvaWQqIGNvbnRleHRfOworICBjb25zdCBjaGFyKiBtZXRob2RfOworfTsKKworLyoqCisgKiBBIHByb2Nlc3NvciBpcyBhIGdlbmVyaWMgb2JqZWN0IHRoYXQgYWN0cyB1cG9uIHR3byBzdHJlYW1zIG9mIGRhdGEsIG9uZQorICogYW4gaW5wdXQgYW5kIHRoZSBvdGhlciBhbiBvdXRwdXQuIFRoZSBkZWZpbml0aW9uIG9mIHRoaXMgb2JqZWN0IGlzIGxvb3NlLAorICogdGhvdWdoIHRoZSB0eXBpY2FsIGNhc2UgaXMgZm9yIHNvbWUgc29ydCBvZiBzZXJ2ZXIgdGhhdCBlaXRoZXIgZ2VuZXJhdGVzCisgKiByZXNwb25zZXMgdG8gYW4gaW5wdXQgc3RyZWFtIG9yIGZvcndhcmRzIGRhdGEgZnJvbSBvbmUgcGlwZSBvbnRvIGFub3RoZXIuCisgKgorICovCitjbGFzcyBUUHJvY2Vzc29yIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VFByb2Nlc3NvcigpIHt9CisKKyAgdmlydHVhbCBib29sIHByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgPSAwOworCisgIGJvb2wgcHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGlvLCB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgeworICAgIHJldHVybiBwcm9jZXNzKGlvLCBpbywgY29ubmVjdGlvbkNvbnRleHQpOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGdldEV2ZW50SGFuZGxlcigpIGNvbnN0IHsgcmV0dXJuIGV2ZW50SGFuZGxlcl87IH0KKworICB2b2lkIHNldEV2ZW50SGFuZGxlcihzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyKSB7CisgICAgZXZlbnRIYW5kbGVyXyA9IGV2ZW50SGFuZGxlcjsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIFRQcm9jZXNzb3IoKSB7fQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXJfOworfTsKKworLyoqCisgKiBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIHRvIGFsbG93IHN0ZDo6c2hhcmVkX3B0ciB0byBiZSB1c2VkIHdpdGggaGFuZGxlcgorICogcG9pbnRlcnMgcmV0dXJuZWQgYnkgdGhlIGdlbmVyYXRlZCBoYW5kbGVyIGZhY3Rvcmllcy4KKyAqCisgKiBUaGUgaGFuZGxlciBmYWN0b3J5IGNsYXNzZXMgZ2VuZXJhdGVkIGJ5IHRoZSB0aHJpZnQgY29tcGlsZXIgcmV0dXJuIHJhdworICogcG9pbnRlcnMsIGFuZCBmYWN0b3J5LT5yZWxlYXNlSGFuZGxlcigpIG11c3QgYmUgY2FsbGVkIHdoZW4gdGhlIGhhbmRsZXIgaXMKKyAqIG5vIGxvbmdlciBuZWVkZWQuCisgKgorICogQSBSZWxlYXNlSGFuZGxlciBvYmplY3QgY2FuIGJlIGluc3RhbnRpYXRlZCBhbmQgcGFzc2VkIGFzIHRoZSBzZWNvbmQKKyAqIHBhcmFtZXRlciB0byBhIHNoYXJlZF9wdHIsIHNvIHRoYXQgZmFjdG9yeS0+cmVsZWFzZUhhbmRsZXIoKSB3aWxsIGJlIGNhbGxlZAorICogd2hlbiB0aGUgb2JqZWN0IGlzIG5vIGxvbmdlciBuZWVkZWQsIGluc3RlYWQgb2YgZGVsZXRpbmcgdGhlIHBvaW50ZXIuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyRmFjdG9yeV8+CitjbGFzcyBSZWxlYXNlSGFuZGxlciB7CitwdWJsaWM6CisgIFJlbGVhc2VIYW5kbGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyRmFjdG9yeV8+JiBoYW5kbGVyRmFjdG9yeSkKKyAgICA6IGhhbmRsZXJGYWN0b3J5XyhoYW5kbGVyRmFjdG9yeSkge30KKworICB2b2lkIG9wZXJhdG9yKCkodHlwZW5hbWUgSGFuZGxlckZhY3RvcnlfOjpIYW5kbGVyKiBoYW5kbGVyKSB7CisgICAgaWYgKGhhbmRsZXIpIHsKKyAgICAgIGhhbmRsZXJGYWN0b3J5Xy0+cmVsZWFzZUhhbmRsZXIoaGFuZGxlcik7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyRmFjdG9yeV8+IGhhbmRsZXJGYWN0b3J5XzsKK307CisKK3N0cnVjdCBUQ29ubmVjdGlvbkluZm8geworICAvLyBUaGUgaW5wdXQgYW5kIG91dHB1dCBwcm90b2NvbHMKKyAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGlucHV0OworICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0OworICAvLyBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdXNlZCBmb3IgdGhlIGNvbm5lY3Rpb24KKyAgLy8gVGhpcyBpcyB0aGUgdHJhbnNwb3J0IHRoYXQgd2FzIHJldHVybmVkIGJ5IFRTZXJ2ZXJUcmFuc3BvcnQ6OmFjY2VwdCgpLAorICAvLyBhbmQgaXQgbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSB0cmFuc3BvcnQgcG9pbnRlZCB0byBieSB0aGUgaW5wdXQgYW5kCisgIC8vIG91dHB1dCBwcm90b2NvbHMuCisgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKK307CisKK2NsYXNzIFRQcm9jZXNzb3JGYWN0b3J5IHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VFByb2Nlc3NvckZhY3RvcnkoKSB7fQorCisgIC8qKgorICAgKiBHZXQgdGhlIFRQcm9jZXNzb3IgdG8gdXNlIGZvciBhIHBhcnRpY3VsYXIgY29ubmVjdGlvbi4KKyAgICoKKyAgICogVGhpcyBtZXRob2QgaXMgYWx3YXlzIGludm9rZWQgaW4gdGhlIHNhbWUgdGhyZWFkIHRoYXQgdGhlIGNvbm5lY3Rpb24gd2FzCisgICAqIGFjY2VwdGVkIG9uLiAgVGhpcyBnZW5lcmFsbHkgbWVhbnMgdGhhdCB0aGlzIGNhbGwgZG9lcyBub3QgbmVlZCB0byBiZQorICAgKiB0aHJlYWQgc2FmZSwgYXMgaXQgd2lsbCBhbHdheXMgYmUgaW52b2tlZCBmcm9tIGEgc2luZ2xlIHRocmVhZC4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGdldFByb2Nlc3Nvcihjb25zdCBUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKSA9IDA7Cit9OworCitjbGFzcyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeSA6IHB1YmxpYyBUUHJvY2Vzc29yRmFjdG9yeSB7CitwdWJsaWM6CisgIFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IpIDogcHJvY2Vzc29yXyhwcm9jZXNzb3IpIHt9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGdldFByb2Nlc3Nvcihjb25zdCBUQ29ubmVjdGlvbkluZm8mKSB7IHJldHVybiBwcm9jZXNzb3JfOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworfTsKK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUFJPQ0VTU09SX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVFRvU3RyaW5nLmggYi9saWIvY3BwL3NyYy90aHJpZnQvVFRvU3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3ODBmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UVG9TdHJpbmcuaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVE9TVFJJTkdfSF8KKyNkZWZpbmUgX1RIUklGVF9UT1NUUklOR19IXyAxCisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IFQmIHQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG87CisgIG8gPDwgdDsKKyAgcmV0dXJuIG8uc3RyKCk7Cit9CisKKy8vIFRPRE86IHJlcGxhY2UgdGhlIGNvbXB1dGF0aW9ucyBiZWxvdyB3aXRoIHN0ZDo6bnVtZXJpY19saW1pdHM6Om1heF9kaWdpdHMxMCBvbmNlIEMrKzExCisvLyBpcyBlbmFibGVkLgoraW5saW5lIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBmbG9hdCYgdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgby5wcmVjaXNpb24oc3RhdGljX2Nhc3Q8c3RkOjpzdHJlYW1zaXplPihzdGQ6OmNlaWwoc3RhdGljX2Nhc3Q8ZG91YmxlPihzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6ZGlnaXRzICogc3RkOjpsb2cxMCgyLjBmKSArIDEpKSkpOworICBvIDw8IHQ7CisgIHJldHVybiBvLnN0cigpOworfQorCitpbmxpbmUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IGRvdWJsZSYgdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgby5wcmVjaXNpb24oc3RhdGljX2Nhc3Q8c3RkOjpzdHJlYW1zaXplPihzdGQ6OmNlaWwoc3RhdGljX2Nhc3Q8ZG91YmxlPihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmRpZ2l0cyAqIHN0ZDo6bG9nMTAoMi4wZikgKyAxKSkpKTsKKyAgbyA8PCB0OworICByZXR1cm4gby5zdHIoKTsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBsb25nIGRvdWJsZSYgdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgby5wcmVjaXNpb24oc3RhdGljX2Nhc3Q8c3RkOjpzdHJlYW1zaXplPihzdGQ6OmNlaWwoc3RhdGljX2Nhc3Q8ZG91YmxlPihzdGQ6Om51bWVyaWNfbGltaXRzPGxvbmcgZG91YmxlPjo6ZGlnaXRzICogc3RkOjpsb2cxMCgyLjBmKSArIDEpKSkpOworICBvIDw8IHQ7CisgIHJldHVybiBvLnN0cigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3N0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBzdGQ6Om1hcDxLLCBWPiYgbSk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IHN0ZDo6c2V0PFQ+JiBzKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyB0b19zdHJpbmcoY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIHQpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3N0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCB0eXBlbmFtZSBzdGQ6OnBhaXI8SywgVj4mIHYpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG87CisgIG8gPDwgdG9fc3RyaW5nKHYuZmlyc3QpIDw8ICI6ICIgPDwgdG9fc3RyaW5nKHYuc2Vjb25kKTsKKyAgcmV0dXJuIG8uc3RyKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IFQmIGJlZywgY29uc3QgVCYgZW5kKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvOworICBmb3IgKFQgaXQgPSBiZWc7IGl0ICE9IGVuZDsgKytpdCkgeworICAgIGlmIChpdCAhPSBiZWcpCisgICAgICBvIDw8ICIsICI7CisgICAgbyA8PCB0b19zdHJpbmcoKml0KTsKKyAgfQorICByZXR1cm4gby5zdHIoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyB0b19zdHJpbmcoY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIHQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG87CisgIG8gPDwgIlsiIDw8IHRvX3N0cmluZyh0LmJlZ2luKCksIHQuZW5kKCkpIDw8ICJdIjsKKyAgcmV0dXJuIG8uc3RyKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IHN0ZDo6bWFwPEssIFY+JiBtKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvOworICBvIDw8ICJ7IiA8PCB0b19zdHJpbmcobS5iZWdpbigpLCBtLmVuZCgpKSA8PCAifSI7CisgIHJldHVybiBvLnN0cigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBzdGQ6OnNldDxUPiYgcykgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgbyA8PCAieyIgPDwgdG9fc3RyaW5nKHMuYmVnaW4oKSwgcy5lbmQoKSkgPDwgIn0iOworICByZXR1cm4gby5zdHIoKTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKKworI2VuZGlmIC8vIF9USFJJRlRfVE9TVFJJTkdfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UaHJpZnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9UaHJpZnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzIyNzQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RocmlmdC5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9USFJJRlRfSF8KKyNkZWZpbmUgX1RIUklGVF9USFJJRlRfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBIQVZFX05FVElORVRfSU5fSAorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxleGNlcHRpb24+CisjaW5jbHVkZSA8dHlwZWluZm8+CisKKyNpbmNsdWRlIDx0aHJpZnQvVExvZ2dpbmcuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVE91dHB1dC5oPgorCisjZGVmaW5lIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoeCkgKCh2b2lkKSh4KSkKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKworY2xhc3MgVEVudW1JdGVyYXRvcgorICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgc3RkOjpwYWlyPGludCwgY29uc3QgY2hhcio+ID4geworcHVibGljOgorICBURW51bUl0ZXJhdG9yKGludCBuLCBpbnQqIGVudW1zLCBjb25zdCBjaGFyKiogbmFtZXMpCisgICAgOiBpaV8oMCksIG5fKG4pLCBlbnVtc18oZW51bXMpLCBuYW1lc18obmFtZXMpIHt9CisKKyAgaW50IG9wZXJhdG9yKysoKSB7IHJldHVybiArK2lpXzsgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBURW51bUl0ZXJhdG9yJiBlbmQpIHsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGVuZCk7CisgICAgYXNzZXJ0KGVuZC5uXyA9PSAtMSk7CisgICAgcmV0dXJuIChpaV8gIT0gbl8pOworICB9CisKKyAgc3RkOjpwYWlyPGludCwgY29uc3QgY2hhcio+IG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGVudW1zX1tpaV9dLCBuYW1lc19baWlfXSk7IH0KKworcHJpdmF0ZToKKyAgaW50IGlpXzsKKyAgY29uc3QgaW50IG5fOworICBpbnQqIGVudW1zXzsKKyAgY29uc3QgY2hhcioqIG5hbWVzXzsKK307CisKK2NsYXNzIFRFeGNlcHRpb24gOiBwdWJsaWMgc3RkOjpleGNlcHRpb24geworcHVibGljOgorICBURXhjZXB0aW9uKCkgOiBtZXNzYWdlXygpIHt9CisKKyAgVEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOiBtZXNzYWdlXyhtZXNzYWdlKSB7fQorCisgIHZpcnR1YWwgflRFeGNlcHRpb24oKSBub2V4Y2VwdCB7fQorCisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0IHsKKyAgICBpZiAobWVzc2FnZV8uZW1wdHkoKSkgeworICAgICAgcmV0dXJuICJEZWZhdWx0IFRFeGNlcHRpb24uIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG1lc3NhZ2VfLmNfc3RyKCk7CisgICAgfQorICB9CisKK3Byb3RlY3RlZDoKKyAgc3RkOjpzdHJpbmcgbWVzc2FnZV87Cit9OworCitjbGFzcyBURGVsYXllZEV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBFPgorICBzdGF0aWMgVERlbGF5ZWRFeGNlcHRpb24qIGRlbGF5RXhjZXB0aW9uKGNvbnN0IEUmIGUpOworICB2aXJ0dWFsIHZvaWQgdGhyb3dfaXQoKSA9IDA7CisgIHZpcnR1YWwgflREZWxheWVkRXhjZXB0aW9uKCl7fTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBFPgorY2xhc3MgVEV4Y2VwdGlvbldyYXBwZXIgOiBwdWJsaWMgVERlbGF5ZWRFeGNlcHRpb24geworcHVibGljOgorICBURXhjZXB0aW9uV3JhcHBlcihjb25zdCBFJiBlKSA6IGVfKGUpIHt9CisgIHZpcnR1YWwgdm9pZCB0aHJvd19pdCgpIHsKKyAgICBFIHRlbXAoZV8pOworICAgIGRlbGV0ZSB0aGlzOworICAgIHRocm93IHRlbXA7CisgIH0KKworcHJpdmF0ZToKKyAgRSBlXzsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBFPgorVERlbGF5ZWRFeGNlcHRpb24qIFREZWxheWVkRXhjZXB0aW9uOjpkZWxheUV4Y2VwdGlvbihjb25zdCBFJiBlKSB7CisgIHJldHVybiBuZXcgVEV4Y2VwdGlvbldyYXBwZXI8RT4oZSk7Cit9CisKKyNpZiBUX0dMT0JBTF9ERUJVR19WSVJUVUFMID4gMQordm9pZCBwcm9maWxlX3ZpcnR1YWxfY2FsbChjb25zdCBzdGQ6OnR5cGVfaW5mbyYgaW5mbyk7Cit2b2lkIHByb2ZpbGVfZ2VuZXJpY19wcm90b2NvbChjb25zdCBzdGQ6OnR5cGVfaW5mbyYgdGVtcGxhdGVfdHlwZSwgY29uc3Qgc3RkOjp0eXBlX2luZm8mIHByb3RfdHlwZSk7Cit2b2lkIHByb2ZpbGVfcHJpbnRfaW5mbyhGSUxFKiBmKTsKK3ZvaWQgcHJvZmlsZV9wcmludF9pbmZvKCk7Cit2b2lkIHByb2ZpbGVfd3JpdGVfcHByb2YoRklMRSogZ2VuX2NhbGxzX2YsIEZJTEUqIHZpcnR1YWxfY2FsbHNfZik7CisjZW5kaWYKK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9USFJJRlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9WaXJ0dWFsUHJvZmlsaW5nLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9WaXJ0dWFsUHJvZmlsaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2UzNDZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1ZpcnR1YWxQcm9maWxpbmcuY3BwCkBAIC0wLDAgKzEsNDI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisKKy8vIERvIG5vdGhpbmcgaWYgdmlydHVhbCBjYWxsIHByb2ZpbGluZyBpcyBub3QgZW5hYmxlZAorI2lmIFRfR0xPQkFMX0RFQlVHX1ZJUlRVQUwgPiAxCisKKy8vIFRPRE86IFRoaXMgY29kZSBvbmx5IHdvcmtzIHdpdGggZysrIChzaW5jZSB3ZSByZWx5IG9uIHRoZSBmYWN0CisvLyB0aGF0IGFsbCBzdGQ6OnR5cGVfaW5mbyBpbnN0YW5jZXMgcmVmZXJyaW5nIHRvIGEgcGFydGljdWxhciB0eXBlCisvLyBhbHdheXMgcmV0dXJuIHRoZSBleGFjdCBzYW1lIHBvaW50ZXIgdmFsdWUgZnJvbSBuYW1lKCkuKQorI2lmbmRlZiBfX0dOVUdfXworI2Vycm9yICJUaHJpZnQgdmlydHVhbCBmdW5jdGlvbiBwcm9maWxpbmcgY3VycmVudGx5IG9ubHkgd29ya3Mgd2l0aCBnY2MiCisjZW5kaWYgLy8gIV9fR05VR19fCisKKy8vIFRPRE86IFdlIGFsc28gcmVxdWlyZSBnbGliYyBmb3IgdGhlIGJhY2t0cmFjZSgpIGFuZCBiYWNrdHJhY2Vfc3ltYm9scygpCisvLyBmdW5jdGlvbnMuCisjaWZuZGVmIF9fR0xJQkNfXworI2Vycm9yICJUaHJpZnQgdmlydHVhbCBmdW5jdGlvbiBwcm9maWxpbmcgY3VycmVudGx5IHJlcXVpcmVzIGdsaWJjIgorI2VuZGlmIC8vICFfX0dMSUJDX18KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorCisjaW5jbHVkZSA8ZXh0L2hhc2hfbWFwPgorI2luY2x1ZGUgPGV4ZWNpbmZvLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKwordXNpbmcgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4OwordXNpbmcgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkOworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IE1BWF9TVEFDS19ERVBUSCA9IDE1OworCisvKioKKyAqIEEgc3RhY2sgdHJhY2UKKyAqLworY2xhc3MgQmFja3RyYWNlIHsKK3B1YmxpYzoKKyAgQmFja3RyYWNlKGludCBza2lwID0gMCk7CisgIEJhY2t0cmFjZShCYWNrdHJhY2UgY29uc3QmIGJ0KTsKKworICB2b2lkIG9wZXJhdG9yPShCYWNrdHJhY2UgY29uc3QmIGJ0KSB7CisgICAgbnVtQ2FsbGVyc18gPSBidC5udW1DYWxsZXJzXzsKKyAgICBpZiAobnVtQ2FsbGVyc18gPj0gMCkgeworICAgICAgbWVtY3B5KGNhbGxlcnNfLCBidC5jYWxsZXJzXywgbnVtQ2FsbGVyc18gKiBzaXplb2Yodm9pZCopKTsKKyAgICB9CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oQmFja3RyYWNlIGNvbnN0JiBidCkgY29uc3QgeyByZXR1cm4gKGNtcChidCkgPT0gMCk7IH0KKworICBzaXplX3QgaGFzaCgpIGNvbnN0IHsKKyAgICBpbnRwdHJfdCByZXQgPSAwOworICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtQ2FsbGVyc187ICsrbikgeworICAgICAgcmV0IF49IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGNhbGxlcnNfW25dKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4ocmV0KTsKKyAgfQorCisgIGludCBjbXAoQmFja3RyYWNlIGNvbnN0JiBidCkgY29uc3QgeworICAgIGludCBkZXB0aF9kaWZmID0gKG51bUNhbGxlcnNfIC0gYnQubnVtQ2FsbGVyc18pOworICAgIGlmIChkZXB0aF9kaWZmICE9IDApIHsKKyAgICAgIHJldHVybiBkZXB0aF9kaWZmOworICAgIH0KKworICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtQ2FsbGVyc187ICsrbikgeworICAgICAgaW50IGRpZmYgPSByZWludGVycHJldF9jYXN0PGludHB0cl90PihjYWxsZXJzX1tuXSkKKyAgICAgICAgICAgICAgICAgLSByZWludGVycHJldF9jYXN0PGludHB0cl90PihidC5jYWxsZXJzX1tuXSk7CisgICAgICBpZiAoZGlmZiAhPSAwKSB7CisgICAgICAgIHJldHVybiBkaWZmOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworICB9CisKKyAgdm9pZCBwcmludChGSUxFKiBmLCBpbnQgaW5kZW50ID0gMCwgaW50IHN0YXJ0ID0gMCkgY29uc3QgeworICAgIGNoYXIqKiBzdHJpbmdzID0gYmFja3RyYWNlX3N5bWJvbHMoY2FsbGVyc18sIG51bUNhbGxlcnNfKTsKKyAgICBpZiAoc3RyaW5ncykgeworICAgICAgc3RhcnQgKz0gc2tpcF87CisgICAgICBpZiAoc3RhcnQgPCAwKSB7CisgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IG4gPSBzdGFydDsgbiA8IG51bUNhbGxlcnNfOyArK24pIHsKKyAgICAgICAgZnByaW50ZihmLCAiJSpzIyUtMmQgJXNcbiIsIGluZGVudCwgIiIsIG4sIHN0cmluZ3Nbbl0pOworICAgICAgfQorICAgICAgZnJlZShzdHJpbmdzKTsKKyAgICB9IGVsc2UgeworICAgICAgZnByaW50ZihmLCAiJSpzPGZhaWxlZCB0byBkZXRlcm1pbmUgc3ltYm9scz5cbiIsIGluZGVudCwgIiIpOworICAgIH0KKyAgfQorCisgIGludCBnZXREZXB0aCgpIGNvbnN0IHsgcmV0dXJuIG51bUNhbGxlcnNfIC0gc2tpcF87IH0KKworICB2b2lkKiBnZXRGcmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgICBpbnQgYWRqdXN0ZWRfaW5kZXggPSBpbmRleCArIHNraXBfOworICAgIGlmIChhZGp1c3RlZF9pbmRleCA8IDAgfHwgYWRqdXN0ZWRfaW5kZXggPj0gbnVtQ2FsbGVyc18pIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gY2FsbGVyc19bYWRqdXN0ZWRfaW5kZXhdOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQqIGNhbGxlcnNfW01BWF9TVEFDS19ERVBUSF07CisgIGludCBudW1DYWxsZXJzXzsKKyAgaW50IHNraXBfOworfTsKKworLy8gRGVmaW5lIHRoZSBjb25zdHJ1Y3RvcnMgbm9uLWlubGluZSwgc28gdGhleSBjb25zaXN0ZW50bHkgYWRkIGEgc2luZ2xlCisvLyBmcmFtZSB0byB0aGUgc3RhY2sgdHJhY2UsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvcHRpbWl6YXRpb24gaXMgZW5hYmxlZAorQmFja3RyYWNlOjpCYWNrdHJhY2UoaW50IHNraXApCisgIDogc2tpcF8oc2tpcCArIDEpIC8vIGlnbm9yZSB0aGUgY29uc3RydWN0b3IgaXRzZWxmCit7CisgIG51bUNhbGxlcnNfID0gYmFja3RyYWNlKGNhbGxlcnNfLCBNQVhfU1RBQ0tfREVQVEgpOworICBpZiAoc2tpcF8gPiBudW1DYWxsZXJzXykgeworICAgIHNraXBfID0gbnVtQ2FsbGVyc187CisgIH0KK30KKworQmFja3RyYWNlOjpCYWNrdHJhY2UoQmFja3RyYWNlIGNvbnN0JiBidCkgOiBudW1DYWxsZXJzXyhidC5udW1DYWxsZXJzXyksIHNraXBfKGJ0LnNraXBfKSB7CisgIGlmIChudW1DYWxsZXJzXyA+PSAwKSB7CisgICAgbWVtY3B5KGNhbGxlcnNfLCBidC5jYWxsZXJzXywgbnVtQ2FsbGVyc18gKiBzaXplb2Yodm9pZCopKTsKKyAgfQorfQorCisvKioKKyAqIEEgYmFja3RyYWNlLCBwbHVzIG9uZSBvciB0d28gdHlwZSBuYW1lcworICovCitjbGFzcyBLZXkgeworcHVibGljOgorICBjbGFzcyBIYXNoIHsKKyAgcHVibGljOgorICAgIHNpemVfdCBvcGVyYXRvcigpKEtleSBjb25zdCYgaykgY29uc3QgeyByZXR1cm4gay5oYXNoKCk7IH0KKyAgfTsKKworICBLZXkoY29uc3QgQmFja3RyYWNlKiBidCwgY29uc3Qgc3RkOjp0eXBlX2luZm8mIHR5cGVfaW5mbykKKyAgICA6IGJhY2t0cmFjZV8oYnQpLCB0eXBlTmFtZTFfKHR5cGVfaW5mby5uYW1lKCkpLCB0eXBlTmFtZTJfKE5VTEwpIHt9CisKKyAgS2V5KGNvbnN0IEJhY2t0cmFjZSogYnQsIGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiB0eXBlX2luZm8xLCBjb25zdCBzdGQ6OnR5cGVfaW5mbyYgdHlwZV9pbmZvMikKKyAgICA6IGJhY2t0cmFjZV8oYnQpLCB0eXBlTmFtZTFfKHR5cGVfaW5mbzEubmFtZSgpKSwgdHlwZU5hbWUyXyh0eXBlX2luZm8yLm5hbWUoKSkge30KKworICBLZXkoY29uc3QgS2V5JiBrKQorICAgIDogYmFja3RyYWNlXyhrLmJhY2t0cmFjZV8pLCB0eXBlTmFtZTFfKGsudHlwZU5hbWUxXyksIHR5cGVOYW1lMl8oay50eXBlTmFtZTJfKSB7fQorCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEtleSYgaykgeworICAgIGJhY2t0cmFjZV8gPSBrLmJhY2t0cmFjZV87CisgICAgdHlwZU5hbWUxXyA9IGsudHlwZU5hbWUxXzsKKyAgICB0eXBlTmFtZTJfID0gay50eXBlTmFtZTJfOworICB9CisKKyAgY29uc3QgQmFja3RyYWNlKiBnZXRCYWNrdHJhY2UoKSBjb25zdCB7IHJldHVybiBiYWNrdHJhY2VfOyB9CisKKyAgY29uc3QgY2hhciogZ2V0VHlwZU5hbWUoKSBjb25zdCB7IHJldHVybiB0eXBlTmFtZTFfOyB9CisKKyAgY29uc3QgY2hhciogZ2V0VHlwZU5hbWUyKCkgY29uc3QgeyByZXR1cm4gdHlwZU5hbWUyXzsgfQorCisgIHZvaWQgbWFrZVBlcnNpc3RlbnQoKSB7CisgICAgLy8gQ29weSB0aGUgQmFja3RyYWNlIG9iamVjdAorICAgIGJhY2t0cmFjZV8gPSBuZXcgQmFja3RyYWNlKCpiYWNrdHJhY2VfKTsKKworICAgIC8vIE5PVEU6IFdlIGRvbid0IGNvcHkgdGhlIHR5cGUgbmFtZS4KKyAgICAvLyBUaGUgR05VIGxpYnN0ZGMrKyBpbXBsZW1lbnRhdGlvbiBvZiB0eXBlX2luZm86Om5hbWUoKSByZXR1cm5zIGEgdmFsdWUKKyAgICAvLyB0aGF0IHdpbGwgYmUgdmFsaWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgcHJvZ3JhbS4gIChBbHRob3VnaCB0aGUgQysrCisgICAgLy8gc3RhbmRhcmQgZG9lc24ndCBndWFyYW50ZWUgdGhpcyB3aWxsIGJlIHRydWUgb24gYWxsIGltcGxlbWVudGF0aW9ucy4pCisgIH0KKworICAvKioKKyAgICogQ2xlYW4gdXAgbWVtb3J5IGFsbG9jYXRlZCBieSBtYWtlUGVyc2lzdGVudCgpCisgICAqCisgICAqIFNob3VsZCBvbmx5IGJlIGludm9rZWQgaWYgbWFrZVBlcnNpc3RlbnQoKSBoYXMgcHJldmlvdXNseSBiZWVuIGNhbGxlZC4KKyAgICogVGhlIEtleSBzaG91bGQgbm8gbG9uZ2VyIGJlIHVzZWQgYWZ0ZXIgY2xlYW51cCgpIGlzIGNhbGxlZC4KKyAgICovCisgIHZvaWQgY2xlYW51cCgpIHsKKyAgICBkZWxldGUgYmFja3RyYWNlXzsKKyAgICBiYWNrdHJhY2VfID0gTlVMTDsKKyAgfQorCisgIGludCBjbXAoY29uc3QgS2V5JiBrKSBjb25zdCB7CisgICAgaW50IHJldCA9IGJhY2t0cmFjZV8tPmNtcCgqay5iYWNrdHJhY2VfKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gTk9URTogV2UgY29tcGFyZSBqdXN0IHRoZSBuYW1lIHBvaW50ZXJzLgorICAgIC8vIFdpdGggR05VIGxpYnN0ZGMrKywgZXZlcnkgdHlwZV9pbmZvIG9iamVjdCBmb3IgdGhlIHNhbWUgdHlwZSBwb2ludHMgdG8KKyAgICAvLyBleGFjdGx5IHRoZSBzYW1lIG5hbWUgc3RyaW5nLiAgKEFsdGhvdWdoIHRoaXMgaXNuJ3QgZ3VhcmFudGVlZCBieSB0aGUKKyAgICAvLyBDKysgc3RhbmRhcmQuKQorICAgIHJldCA9IGsudHlwZU5hbWUxXyAtIHR5cGVOYW1lMV87CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gay50eXBlTmFtZTJfIC0gdHlwZU5hbWUyXzsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBLZXkmIGspIGNvbnN0IHsgcmV0dXJuIGNtcChrKSA9PSAwOyB9CisKKyAgc2l6ZV90IGhhc2goKSBjb25zdCB7CisgICAgLy8gTk9URTogQXMgYWJvdmUsIHdlIGp1c3QgdXNlIHRoZSBuYW1lIHBvaW50ZXIgdmFsdWUuCisgICAgLy8gV29ya3Mgd2l0aCBHTlUgbGlic3RkYysrLCBidXQgbm90IGd1YXJhbnRlZWQgdG8gYmUgY29ycmVjdCBvbiBhbGwKKyAgICAvLyBpbXBsZW1lbnRhdGlvbnMuCisgICAgcmV0dXJuIGJhY2t0cmFjZV8tPmhhc2goKSBeIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Pih0eXBlTmFtZTFfKQorICAgICAgICAgICBeIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Pih0eXBlTmFtZTJfKTsKKyAgfQorCitwcml2YXRlOgorICBjb25zdCBCYWNrdHJhY2UqIGJhY2t0cmFjZV87CisgIGNvbnN0IGNoYXIqIHR5cGVOYW1lMV87CisgIGNvbnN0IGNoYXIqIHR5cGVOYW1lMl87Cit9OworCisvKioKKyAqIEEgZnVuY3RvciB0aGF0IGRldGVybWluZXMgd2hpY2ggb2YgdHdvIEJhY2t0cmFjZU1hcCBlbnRyaWVzCisgKiBoYXMgYSBoaWdoZXIgY291bnQuCisgKi8KK2NsYXNzIENvdW50R3JlYXRlciB7CitwdWJsaWM6CisgIGJvb2wgb3BlcmF0b3IoKShzdGQ6OnBhaXI8S2V5LCBzaXplX3Q+IGJ0MSwgc3RkOjpwYWlyPEtleSwgc2l6ZV90PiBidDIpIGNvbnN0IHsKKyAgICByZXR1cm4gYnQxLnNlY29uZCA+IGJ0Mi5zZWNvbmQ7CisgIH0KK307CisKK3R5cGVkZWYgX19nbnVfY3h4OjpoYXNoX21hcDxLZXksIHNpemVfdCwgS2V5OjpIYXNoPiBCYWNrdHJhY2VNYXA7CisKKy8qKgorICogQSBtYXAgZGVzY3JpYmluZyBob3cgbWFueSB0aW1lcyBUX1ZJUlRVQUxfQ0FMTCgpIGhhcyBiZWVuIGludm9rZWQuCisgKi8KK0JhY2t0cmFjZU1hcCB2aXJ0dWFsX2NhbGxzOworTXV0ZXggdmlydHVhbF9jYWxsc19tdXRleDsKKworLyoqCisgKiBBIG1hcCBkZXNjcmliaW5nIGhvdyBtYW55IHRpbWVzIFRfR0VORVJJQ19QUk9UT0NPTCgpIGhhcyBiZWVuIGludm9rZWQuCisgKi8KK0JhY2t0cmFjZU1hcCBnZW5lcmljX2NhbGxzOworTXV0ZXggZ2VuZXJpY19jYWxsc19tdXRleDsKKwordm9pZCBfcmVjb3JkX2JhY2t0cmFjZShCYWNrdHJhY2VNYXAqIG1hcCwgY29uc3QgTXV0ZXgmIG11dGV4LCBLZXkqIGspIHsKKyAgR3VhcmQgZ3VhcmQobXV0ZXgpOworCisgIEJhY2t0cmFjZU1hcDo6aXRlcmF0b3IgaXQgPSBtYXAtPmZpbmQoKmspOworICBpZiAoaXQgPT0gbWFwLT5lbmQoKSkgeworICAgIGstPm1ha2VQZXJzaXN0ZW50KCk7CisgICAgbWFwLT5pbnNlcnQoc3RkOjptYWtlX3BhaXIoKmssIDEpKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBpbmNyZW1lbnQgdGhlIGNvdW50CisgICAgLy8gTk9URTogd2UgY291bGQgYXNzZXJ0IGlmIGl0LT5zZWNvbmQgaXMgMCBhZnRlcndhcmRzLCBzaW5jZSB0aGF0IHdvdWxkCisgICAgLy8gbWVhbiB3ZSd2ZSB3cmFwcGVkLgorICAgICsrKGl0LT5zZWNvbmQpOworICB9Cit9CisKKy8qKgorICogUmVjb3JkIGFuIHVubmVjZXNzYXJ5IHZpcnR1YWwgZnVuY3Rpb24gY2FsbC4KKyAqCisgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZSBUX1ZJUlRVQUxfQ0FMTCgpIG1hY3JvLgorICovCit2b2lkIHByb2ZpbGVfdmlydHVhbF9jYWxsKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiB0eXBlKSB7CisgIGludCBjb25zdCBza2lwID0gMTsgLy8gaWdub3JlIHRoaXMgZnJhbWUKKyAgQmFja3RyYWNlIGJ0KHNraXApOworICBLZXkgaygmYnQsIHR5cGUpOworICBfcmVjb3JkX2JhY2t0cmFjZSgmdmlydHVhbF9jYWxscywgdmlydHVhbF9jYWxsc19tdXRleCwgJmspOworfQorCisvKioKKyAqIFJlY29yZCBhIGNhbGwgdG8gYSB0ZW1wbGF0ZSBwcm9jZXNzb3Igd2l0aCBhIHByb3RvY29sIHRoYXQgaXMgbm90IHRoZSBvbmUKKyAqIHNwZWNpZmllZCBpbiB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyLgorICoKKyAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYnkgdGhlIFRfR0VORVJJQ19QUk9UT0NPTCgpIG1hY3JvLgorICovCit2b2lkIHByb2ZpbGVfZ2VuZXJpY19wcm90b2NvbChjb25zdCBzdGQ6OnR5cGVfaW5mbyYgdGVtcGxhdGVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiBwcm90X3R5cGUpIHsKKyAgaW50IGNvbnN0IHNraXAgPSAxOyAvLyBpZ25vcmUgdGhpcyBmcmFtZQorICBCYWNrdHJhY2UgYnQoc2tpcCk7CisgIEtleSBrKCZidCwgdGVtcGxhdGVfdHlwZSwgcHJvdF90eXBlKTsKKyAgX3JlY29yZF9iYWNrdHJhY2UoJmdlbmVyaWNfY2FsbHMsIGdlbmVyaWNfY2FsbHNfbXV0ZXgsICZrKTsKK30KKworLyoqCisgKiBQcmludCB0aGUgcmVjb3JkZWQgcHJvZmlsaW5nIGluZm9ybWF0aW9uIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4KKyAqLwordm9pZCBwcm9maWxlX3ByaW50X2luZm8oRklMRSogZikgeworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxLZXksIHNpemVfdD4gPiBCYWNrdHJhY2VWZWN0b3I7CisKKyAgQ291bnRHcmVhdGVyIGlzX2dyZWF0ZXI7CisKKyAgLy8gR3JhYiBib3RoIGxvY2tzIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHByaW50IG9wZXJhdGlvbiwKKyAgLy8gdG8gZW5zdXJlIHRoZSBvdXRwdXQgaXMgYSBjb25zaXN0ZW50IHNuYXBzaG90IG9mIGEgc2luZ2xlIHBvaW50IGluIHRpbWUKKyAgR3VhcmQgZ2VuZXJpY19jYWxsc19ndWFyZChnZW5lcmljX2NhbGxzX211dGV4KTsKKyAgR3VhcmQgdmlydHVhbF9jYWxsc19ndWFyZCh2aXJ0dWFsX2NhbGxzX211dGV4KTsKKworICAvLyBwcmludCB0aGUgaW5mbyBmcm9tIGdlbmVyaWNfY2FsbHMsIHNvcnRlZCBieSBmcmVxdWVuY3kKKyAgLy8KKyAgLy8gV2UgcHJpbnQgdGhlIGdlbmVyaWNfY2FsbHMgaW5mbyBhaGVhZCBvZiB2aXJ0dWFsX2NhbGxzLCBzaW5jZSBpdCBpcyBtb3JlCisgIC8vIHVzZWZ1bCBpbiBzb21lIGNhc2VzLiAgQWxsIFRfR0VORVJJQ19QUk9UT0NPTCBjYWxscyBjYW4gYmUgZWxpbWluYXRlZAorICAvLyBmcm9tIG1vc3QgcHJvZ3JhbXMuICBOb3QgYWxsIFRfVklSVFVBTF9DQUxMcyB3aWxsIGJlIGVsaW1pbmF0ZWQgYnkKKyAgLy8gY29udmVydGluZyB0byB0ZW1wbGF0ZXMuCisgIEJhY2t0cmFjZVZlY3RvciBncF9zb3J0ZWQoZ2VuZXJpY19jYWxscy5iZWdpbigpLCBnZW5lcmljX2NhbGxzLmVuZCgpKTsKKyAgc3RkOjpzb3J0KGdwX3NvcnRlZC5iZWdpbigpLCBncF9zb3J0ZWQuZW5kKCksIGlzX2dyZWF0ZXIpOworCisgIGZvciAoQmFja3RyYWNlVmVjdG9yOjpjb25zdF9pdGVyYXRvciBpdCA9IGdwX3NvcnRlZC5iZWdpbigpOyBpdCAhPSBncF9zb3J0ZWQuZW5kKCk7ICsraXQpIHsKKyAgICBLZXkgY29uc3QmIGtleSA9IGl0LT5maXJzdDsKKyAgICBzaXplX3QgY29uc3QgY291bnQgPSBpdC0+c2Vjb25kOworICAgIGZwcmludGYoZiwKKyAgICAgICAgICAgICJUX0dFTkVSSUNfUFJPVE9DT0w6ICV6dSBjYWxscyB0byAlcyB3aXRoIGEgJXM6XG4iLAorICAgICAgICAgICAgY291bnQsCisgICAgICAgICAgICBrZXkuZ2V0VHlwZU5hbWUoKSwKKyAgICAgICAgICAgIGtleS5nZXRUeXBlTmFtZTIoKSk7CisgICAga2V5LmdldEJhY2t0cmFjZSgpLT5wcmludChmLCAyKTsKKyAgICBmcHJpbnRmKGYsICJcbiIpOworICB9CisKKyAgLy8gcHJpbnQgdGhlIGluZm8gZnJvbSB2aXJ0dWFsX2NhbGxzLCBzb3J0ZWQgYnkgZnJlcXVlbmN5CisgIEJhY2t0cmFjZVZlY3RvciB2Y19zb3J0ZWQodmlydHVhbF9jYWxscy5iZWdpbigpLCB2aXJ0dWFsX2NhbGxzLmVuZCgpKTsKKyAgc3RkOjpzb3J0KHZjX3NvcnRlZC5iZWdpbigpLCB2Y19zb3J0ZWQuZW5kKCksIGlzX2dyZWF0ZXIpOworCisgIGZvciAoQmFja3RyYWNlVmVjdG9yOjpjb25zdF9pdGVyYXRvciBpdCA9IHZjX3NvcnRlZC5iZWdpbigpOyBpdCAhPSB2Y19zb3J0ZWQuZW5kKCk7ICsraXQpIHsKKyAgICBLZXkgY29uc3QmIGtleSA9IGl0LT5maXJzdDsKKyAgICBzaXplX3QgY29uc3QgY291bnQgPSBpdC0+c2Vjb25kOworICAgIGZwcmludGYoZiwgIlRfVklSVFVBTF9DQUxMOiAlenUgY2FsbHMgb24gJXM6XG4iLCBjb3VudCwga2V5LmdldFR5cGVOYW1lKCkpOworICAgIGtleS5nZXRCYWNrdHJhY2UoKS0+cHJpbnQoZiwgMik7CisgICAgZnByaW50ZihmLCAiXG4iKTsKKyAgfQorfQorCisvKioKKyAqIFByaW50IHRoZSByZWNvcmRlZCBwcm9maWxpbmcgaW5mb3JtYXRpb24gdG8gc3Rkb3V0LgorICovCit2b2lkIHByb2ZpbGVfcHJpbnRfaW5mbygpIHsKKyAgcHJvZmlsZV9wcmludF9pbmZvKHN0ZG91dCk7Cit9CisKKy8qKgorICogV3JpdGUgYSBCYWNrdHJhY2VNYXAgYXMgR29vZ2xlIENQVSBwcm9maWxlciBiaW5hcnkgZGF0YS4KKyAqLworc3RhdGljIHZvaWQgcHJvZmlsZV93cml0ZV9wcHJvZl9maWxlKEZJTEUqIGYsIEJhY2t0cmFjZU1hcCBjb25zdCYgbWFwKSB7CisgIC8vIFdyaXRlIHRoZSBoZWFkZXIKKyAgdWludHB0cl90IGhlYWRlcls1XSA9IHswLCAzLCAwLCAwLCAwfTsKKyAgZndyaXRlKCZoZWFkZXIsIHNpemVvZihoZWFkZXIpLCAxLCBmKTsKKworICAvLyBXcml0ZSB0aGUgcHJvZmlsZSByZWNvcmRzCisgIGZvciAoQmFja3RyYWNlTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1hcC5iZWdpbigpOyBpdCAhPSBtYXAuZW5kKCk7ICsraXQpIHsKKyAgICB1aW50cHRyX3QgY291bnQgPSBpdC0+c2Vjb25kOworICAgIGZ3cml0ZSgmY291bnQsIHNpemVvZihjb3VudCksIDEsIGYpOworCisgICAgQmFja3RyYWNlIGNvbnN0KiBidCA9IGl0LT5maXJzdC5nZXRCYWNrdHJhY2UoKTsKKyAgICB1aW50cHRyX3QgbnVtX3BjcyA9IGJ0LT5nZXREZXB0aCgpOworICAgIGZ3cml0ZSgmbnVtX3Bjcywgc2l6ZW9mKG51bV9wY3MpLCAxLCBmKTsKKworICAgIGZvciAodWludHB0cl90IG4gPSAwOyBuIDwgbnVtX3BjczsgKytuKSB7CisgICAgICB2b2lkKiBwYyA9IGJ0LT5nZXRGcmFtZShuKTsKKyAgICAgIGZ3cml0ZSgmcGMsIHNpemVvZihwYyksIDEsIGYpOworICAgIH0KKyAgfQorCisgIC8vIFdyaXRlIHRoZSB0cmFpbGVyCisgIHVpbnRwdHJfdCB0cmFpbGVyWzNdID0gezAsIDEsIDB9OworICBmd3JpdGUoJnRyYWlsZXIsIHNpemVvZih0cmFpbGVyKSwgMSwgZik7CisKKyAgLy8gV3JpdGUgL3Byb2Mvc2VsZi9tYXBzCisgIC8vIFRPRE8oc2ltcGtpbnMpOiBUaGlzIG9ubHkgd29ya3Mgb24gbGludXgKKyAgRklMRSogcHJvY19tYXBzID0gZm9wZW4oIi9wcm9jL3NlbGYvbWFwcyIsICJyIik7CisgIGlmIChwcm9jX21hcHMpIHsKKyAgICB1aW50OF90IGJ1Zls0MDk2XTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc2l6ZV90IGJ5dGVzX3JlYWQgPSBmcmVhZChidWYsIDEsIHNpemVvZihidWYpLCBwcm9jX21hcHMpOworICAgICAgaWYgKGJ5dGVzX3JlYWQgPT0gMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGZ3cml0ZShidWYsIDEsIGJ5dGVzX3JlYWQsIGYpOworICAgIH0KKyAgICBmY2xvc2UocHJvY19tYXBzKTsKKyAgfQorfQorCisvKioKKyAqIFdyaXRlIHRoZSByZWNvcmRlZCBwcm9maWxpbmcgaW5mb3JtYXRpb24gYXMgcHByb2YgZmlsZXMuCisgKgorICogVGhpcyB3cml0ZXMgdGhlIGluZm9ybWF0aW9uIHVzaW5nIHRoZSBHb29nbGUgQ1BVIHByb2ZpbGVyIGJpbmFyeSBkYXRhCisgKiBmb3JtYXQsIHNvIGl0IGNhbiBiZSBhbmFseXplZCB3aXRoIHBwcm9mLiAgTm90ZSB0aGF0IGluZm9ybWF0aW9uIGFib3V0IHRoZQorICogcHJvdG9jb2wvdHJhbnNwb3J0IGRhdGEgdHlwZXMgY2Fubm90IGJlIHN0b3JlZCBpbiB0aGlzIGZpbGUgZm9ybWF0LgorICoKKyAqIFNlZSBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLXBlcmZ0b29scy8gZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBAcGFyYW0gZ2VuX2NhbGxzX2YgICAgIFRoZSBpbmZvcm1hdGlvbiBhYm91dCBjYWxscyB0bworICogICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX2dlbmVyaWNfcHJvdG9jb2woKSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhpcworICogICAgICAgICAgICAgICAgICAgICAgICBmaWxlLgorICogQHBhcmFtIHZpcnR1YWxfY2FsbHNfZiBUaGUgaW5mb3JtYXRpb24gYWJvdXQgY2FsbHMgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV92aXJ0dWFsX2NhbGwoKSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhpcyBmaWxlLgorICovCit2b2lkIHByb2ZpbGVfd3JpdGVfcHByb2YoRklMRSogZ2VuX2NhbGxzX2YsIEZJTEUqIHZpcnR1YWxfY2FsbHNfZikgeworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxLZXksIHNpemVfdD4gPiBCYWNrdHJhY2VWZWN0b3I7CisKKyAgQ291bnRHcmVhdGVyIGlzX2dyZWF0ZXI7CisKKyAgLy8gR3JhYiBib3RoIGxvY2tzIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHByaW50IG9wZXJhdGlvbiwKKyAgLy8gdG8gZW5zdXJlIHRoZSBvdXRwdXQgaXMgYSBjb25zaXN0ZW50IHNuYXBzaG90IG9mIGEgc2luZ2xlIHBvaW50IGluIHRpbWUKKyAgR3VhcmQgZ2VuZXJpY19jYWxsc19ndWFyZChnZW5lcmljX2NhbGxzX211dGV4KTsKKyAgR3VhcmQgdmlydHVhbF9jYWxsc19ndWFyZCh2aXJ0dWFsX2NhbGxzX211dGV4KTsKKworICAvLyB3cml0ZSB0aGUgaW5mbyBmcm9tIGdlbmVyaWNfY2FsbHMKKyAgcHJvZmlsZV93cml0ZV9wcHJvZl9maWxlKGdlbl9jYWxsc19mLCBnZW5lcmljX2NhbGxzKTsKKworICAvLyB3cml0ZSB0aGUgaW5mbyBmcm9tIHZpcnR1YWxfY2FsbHMKKyAgcHJvZmlsZV93cml0ZV9wcHJvZl9maWxlKHZpcnR1YWxfY2FsbHNfZiwgdmlydHVhbF9jYWxscyk7Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CisKKyNlbmRpZiAvLyBUX0dMT0JBTF9QUk9GSUxFX1ZJUlRVQUwgPiAwCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM5NmIxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNCdWZmZXJQcm9jZXNzb3IuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UQVNZTkNfQlVGRkVSX1BST0NFU1NPUl9IXworI2RlZmluZSBfVEhSSUZUX1RBU1lOQ19CVUZGRVJfUFJPQ0VTU09SX0hfIDEKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgeworCitjbGFzcyBUQXN5bmNCdWZmZXJQcm9jZXNzb3IgeworcHVibGljOgorICAvLyBQcm9jZXNzIGRhdGEgaW4gImluIiwgcHV0dGluZyB0aGUgcmVzdWx0IGluICJvdXQiLgorICAvLyBDYWxsIF9yZXR1cm4odHJ1ZSkgd2hlbiBkb25lLCBvciBfcmV0dXJuKGZhbHNlKSB0bworICAvLyBmb3JjZWZ1bGx5IGNsb3NlIHRoZSBjb25uZWN0aW9uIChpZiBhcHBsaWNhYmxlKS4KKyAgLy8gImluIiBhbmQgIm91dCIgc2hvdWxkIGJlIFRNZW1vcnlCdWZmZXIgb3Igc2ltaWxhciwKKyAgLy8gbm90IGEgd3JhcHBlciBhcm91bmQgYSBzb2NrZXQuCisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUQnVmZmVyQmFzZT4gaWJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U+IG9idWYpID0gMDsKKyAgdmlydHVhbCB+VEFzeW5jQnVmZmVyUHJvY2Vzc29yKCkge30KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RBU1lOQ19CVUZGRVJfUFJPQ0VTU09SX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiOTExMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmNwcApAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFzeW5jIHsKKwordm9pZCBUQXN5bmNDaGFubmVsOjpzZW5kQW5kUmVjdk1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVtb3J5QnVmZmVyKiBzZW5kQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lbW9yeUJ1ZmZlciogcmVjdkJ1ZikgeworICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gc2VuZF9kb25lCisgICAgICA9IHN0ZDo6YmluZCgmVEFzeW5jQ2hhbm5lbDo6cmVjdk1lc3NhZ2UsIHRoaXMsIGNvYiwgcmVjdkJ1Zik7CisKKyAgc2VuZE1lc3NhZ2Uoc2VuZF9kb25lLCBzZW5kQnVmKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2FjZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9BU1lOQ19UQVNZTkNDSEFOTkVMX0hfCisjZGVmaW5lIF9USFJJRlRfQVNZTkNfVEFTWU5DQ0hBTk5FTF9IXyAxCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKK2NsYXNzIFRNZW1vcnlCdWZmZXI7Cit9Cit9Cit9CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgewordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKKworY2xhc3MgVEFzeW5jQ2hhbm5lbCB7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IFZvaWRDYWxsYmFjazsKKworICB2aXJ0dWFsIH5UQXN5bmNDaGFubmVsKCkge30KKworICAvLyBpcyB0aGUgY2hhbm5lbCBpbiBhIGdvb2Qgc3RhdGU/CisgIHZpcnR1YWwgYm9vbCBnb29kKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgZXJyb3IoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCB0aW1lZE91dCgpIGNvbnN0ID0gMDsKKworICAvKioKKyAgICogU2VuZCBhIG1lc3NhZ2Ugb3ZlciB0aGUgY2hhbm5lbC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBzZW5kTWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpID0gMDsKKworICAvKioKKyAgICogUmVjZWl2ZSBhIG1lc3NhZ2UgZnJvbSB0aGUgY2hhbm5lbC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCByZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpID0gMDsKKworICAvKioKKyAgICogU2VuZCBhIG1lc3NhZ2Ugb3ZlciB0aGUgY2hhbm5lbCBhbmQgcmVjZWl2ZSBhIHJlc3BvbnNlLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHNlbmRBbmRSZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBzZW5kQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHJlY3ZCdWYpOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQVNZTkNfVEFTWU5DQ0hBTk5FTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0Rpc3BhdGNoUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWRiNTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0Rpc3BhdGNoUHJvY2Vzc29yLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX1RIUklGVF9BU1lOQ19UQVNZTkNESVNQQVRDSFBST0NFU1NPUl9IXworI2RlZmluZSBfVEhSSUZUX0FTWU5DX1RBU1lOQ0RJU1BBVENIUFJPQ0VTU09SX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CisKKy8qKgorICogVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IgaXMgYSBoZWxwZXIgY2xhc3MgdG8gcGFyc2UgdGhlIG1lc3NhZ2UgaGVhZGVyIHRoZW4KKyAqIGNhbGwgYW5vdGhlciBmdW5jdGlvbiB0byBkaXNwYXRjaCBiYXNlZCBvbiB0aGUgZnVuY3Rpb24gbmFtZS4KKyAqCisgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IGRpc3BhdGNoQ2FsbCgpIHRvIGRpc3BhdGNoIG9uIHRoZSBmdW5jdGlvbiBuYW1lLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPgorY2xhc3MgVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3JUIDogcHVibGljIFRBc3luY1Byb2Nlc3NvciB7CitwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQpIHsKKyAgICBwcm90b2NvbDo6VFByb3RvY29sKiBpblJhdyA9IGluLmdldCgpOworICAgIHByb3RvY29sOjpUUHJvdG9jb2wqIG91dFJhdyA9IG91dC5nZXQoKTsKKworICAgIC8vIFRyeSB0byBkeW5hbWljIGNhc3QgdG8gdGhlIHRlbXBsYXRlIHByb3RvY29sIHR5cGUKKyAgICBQcm90b2NvbF8qIHNwZWNpZmljSW4gPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4oaW5SYXcpOworICAgIFByb3RvY29sXyogc3BlY2lmaWNPdXQgPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4ob3V0UmF3KTsKKyAgICBpZiAoc3BlY2lmaWNJbiAmJiBzcGVjaWZpY091dCkgeworICAgICAgcmV0dXJuIHByb2Nlc3NGYXN0KF9yZXR1cm4sIHNwZWNpZmljSW4sIHNwZWNpZmljT3V0KTsKKyAgICB9CisKKyAgICAvLyBMb2cgdGhlIGZhY3QgdGhhdCB3ZSBoYXZlIHRvIHVzZSB0aGUgc2xvdyBwYXRoCisgICAgVF9HRU5FUklDX1BST1RPQ09MKHRoaXMsIGluUmF3LCBzcGVjaWZpY0luKTsKKyAgICBUX0dFTkVSSUNfUFJPVE9DT0wodGhpcywgb3V0UmF3LCBzcGVjaWZpY091dCk7CisKKyAgICBzdGQ6OnN0cmluZyBmbmFtZTsKKyAgICBwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlOworICAgIGludDMyX3Qgc2VxaWQ7CisgICAgaW5SYXctPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCBzZXFpZCk7CisKKyAgICAvLyBJZiB0aGlzIGRvZXNuJ3QgbG9vayBsaWtlIGEgdmFsaWQgY2FsbCwgbG9nIGFuIGVycm9yIGFuZCByZXR1cm4gZmFsc2Ugc28KKyAgICAvLyB0aGF0IHRoZSBzZXJ2ZXIgd2lsbCBjbG9zZSB0aGUgY29ubmVjdGlvbi4KKyAgICAvLworICAgIC8vIChUaGUgb2xkIGdlbmVyYXRlZCBwcm9jZXNzb3IgY29kZSB1c2VkIHRvIHRyeSB0byBza2lwIGEgVF9TVFJVQ1QgYW5kCisgICAgLy8gY29udGludWUuICBIb3dldmVyLCB0aGF0IHNlZW1zIHVuc2FmZS4pCisgICAgaWYgKG10eXBlICE9IHByb3RvY29sOjpUX0NBTEwgJiYgbXR5cGUgIT0gcHJvdG9jb2w6OlRfT05FV0FZKSB7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJyZWNlaXZlZCBpbnZhbGlkIG1lc3NhZ2UgdHlwZSAlZCBmcm9tIGNsaWVudCIsIG10eXBlKTsKKyAgICAgIF9yZXR1cm4oZmFsc2UpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJldHVybiB0aGlzLT5kaXNwYXRjaENhbGwoX3JldHVybiwgaW5SYXcsIG91dFJhdywgZm5hbWUsIHNlcWlkKTsKKyAgfQorCisgIHZvaWQgcHJvY2Vzc0Zhc3Qoc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xfKiBpbiwKKyAgICAgICAgICAgICAgICAgICBQcm90b2NvbF8qIG91dCkgeworICAgIHN0ZDo6c3RyaW5nIGZuYW1lOworICAgIHByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGU7CisgICAgaW50MzJfdCBzZXFpZDsKKyAgICBpbi0+cmVhZE1lc3NhZ2VCZWdpbihmbmFtZSwgbXR5cGUsIHNlcWlkKTsKKworICAgIGlmIChtdHlwZSAhPSBwcm90b2NvbDo6VF9DQUxMICYmIG10eXBlICE9IHByb3RvY29sOjpUX09ORVdBWSkgeworICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigicmVjZWl2ZWQgaW52YWxpZCBtZXNzYWdlIHR5cGUgJWQgZnJvbSBjbGllbnQiLCBtdHlwZSk7CisgICAgICBfcmV0dXJuKGZhbHNlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy0+ZGlzcGF0Y2hDYWxsVGVtcGxhdGVkKF9yZXR1cm4sIGluLCBvdXQsIGZuYW1lLCBzZXFpZCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hDYWxsKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXFpZCkgPSAwOworCisgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaENhbGxUZW1wbGF0ZWQoc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sXyogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xfKiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxaWQpID0gMDsKK307CisKKy8qKgorICogTm9uLXRlbXBsYXRpemVkIHZlcnNpb24gb2YgVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IsCisgKiB0aGF0IGRvZXNuJ3QgYm90aGVyIHRyeWluZyB0byBwZXJmb3JtIGEgZHluYW1pY19jYXN0LgorICovCitjbGFzcyBUQXN5bmNEaXNwYXRjaFByb2Nlc3NvciA6IHB1YmxpYyBUQXN5bmNQcm9jZXNzb3IgeworcHVibGljOgorICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBzdWNjZXNzKT4gX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0KSB7CisgICAgcHJvdG9jb2w6OlRQcm90b2NvbCogaW5SYXcgPSBpbi5nZXQoKTsKKyAgICBwcm90b2NvbDo6VFByb3RvY29sKiBvdXRSYXcgPSBvdXQuZ2V0KCk7CisKKyAgICBzdGQ6OnN0cmluZyBmbmFtZTsKKyAgICBwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlOworICAgIGludDMyX3Qgc2VxaWQ7CisgICAgaW5SYXctPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCBzZXFpZCk7CisKKyAgICAvLyBJZiB0aGlzIGRvZXNuJ3QgbG9vayBsaWtlIGEgdmFsaWQgY2FsbCwgbG9nIGFuIGVycm9yIGFuZCByZXR1cm4gZmFsc2Ugc28KKyAgICAvLyB0aGF0IHRoZSBzZXJ2ZXIgd2lsbCBjbG9zZSB0aGUgY29ubmVjdGlvbi4KKyAgICAvLworICAgIC8vIChUaGUgb2xkIGdlbmVyYXRlZCBwcm9jZXNzb3IgY29kZSB1c2VkIHRvIHRyeSB0byBza2lwIGEgVF9TVFJVQ1QgYW5kCisgICAgLy8gY29udGludWUuICBIb3dldmVyLCB0aGF0IHNlZW1zIHVuc2FmZS4pCisgICAgaWYgKG10eXBlICE9IHByb3RvY29sOjpUX0NBTEwgJiYgbXR5cGUgIT0gcHJvdG9jb2w6OlRfT05FV0FZKSB7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJyZWNlaXZlZCBpbnZhbGlkIG1lc3NhZ2UgdHlwZSAlZCBmcm9tIGNsaWVudCIsIG10eXBlKTsKKyAgICAgIF9yZXR1cm4oZmFsc2UpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJldHVybiBkaXNwYXRjaENhbGwoX3JldHVybiwgaW5SYXcsIG91dFJhdywgZm5hbWUsIHNlcWlkKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaENhbGwoc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlcWlkKSA9IDA7Cit9OworCisvLyBTcGVjaWFsaXplIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yVCBmb3IgVFByb3RvY29sIGFuZCBURHVtbXlQcm90b2NvbCBqdXN0IHRvCisvLyB1c2UgdGhlIGdlbmVyaWMgVERpc3BhdGNoUHJvY2Vzc29yLgordGVtcGxhdGUgPD4KK2NsYXNzIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yVDxwcm90b2NvbDo6VER1bW15UHJvdG9jb2w+IDogcHVibGljIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yIHt9OwordGVtcGxhdGUgPD4KK2NsYXNzIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yVDxwcm90b2NvbDo6VFByb3RvY29sPiA6IHB1YmxpYyBUQXN5bmNEaXNwYXRjaFByb2Nlc3NvciB7fTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCisKKyNlbmRpZiAvLyBfVEhSSUZUX0FTWU5DX1RBU1lOQ0RJU1BBVENIUFJPQ0VTU09SX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRiOTc2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaApAQCAtMCwwICsxLDg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UQVNZTkNQUk9DRVNTT1JfSF8KKyNkZWZpbmUgX1RIUklGVF9UQVNZTkNQUk9DRVNTT1JfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvVFByb2Nlc3Nvci5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFzeW5jIHsKKworLyoqCisgKiBBc3luYyB2ZXJzaW9uIG9mIGEgVFByb2Nlc3Nvci4gIEl0IGlzIG5vdCBleHBlY3RlZCB0byBjb21wbGV0ZSBieSB0aGUgdGltZQorICogdGhlIGNhbGwgdG8gcHJvY2VzcyByZXR1cm5zLiAgSW5zdGVhZCwgaXQgY2FsbHMgYSBjb2IgdG8gc2lnbmFsIGNvbXBsZXRpb24uCisgKi8KKworY2xhc3MgVEFzeW5jUHJvY2Vzc29yIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VEFzeW5jUHJvY2Vzc29yKCkge30KKworICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBzdWNjZXNzKT4gX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0KSA9IDA7CisKKyAgdm9pZCBwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGlvKSB7CisgICAgcmV0dXJuIHByb2Nlc3MoX3JldHVybiwgaW8sIGlvKTsKKyAgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBnZXRFdmVudEhhbmRsZXIoKSBjb25zdCB7IHJldHVybiBldmVudEhhbmRsZXJfOyB9CisKKyAgdm9pZCBzZXRFdmVudEhhbmRsZXIoc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcikgeworICAgIGV2ZW50SGFuZGxlcl8gPSBldmVudEhhbmRsZXI7CisgIH0KKworcHJvdGVjdGVkOgorICBUQXN5bmNQcm9jZXNzb3IoKSB7fQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXJfOworfTsKKworY2xhc3MgVEFzeW5jUHJvY2Vzc29yRmFjdG9yeSB7CitwdWJsaWM6CisgIHZpcnR1YWwgflRBc3luY1Byb2Nlc3NvckZhY3RvcnkoKSB7fQorCisgIC8qKgorICAgKiBHZXQgdGhlIFRBc3luY1Byb2Nlc3NvciB0byB1c2UgZm9yIGEgcGFydGljdWxhciBjb25uZWN0aW9uLgorICAgKgorICAgKiBUaGlzIG1ldGhvZCBpcyBhbHdheXMgaW52b2tlZCBpbiB0aGUgc2FtZSB0aHJlYWQgdGhhdCB0aGUgY29ubmVjdGlvbiB3YXMKKyAgICogYWNjZXB0ZWQgb24uICBUaGlzIGdlbmVyYWxseSBtZWFucyB0aGF0IHRoaXMgY2FsbCBkb2VzIG5vdCBuZWVkIHRvIGJlCisgICAqIHRocmVhZCBzYWZlLCBhcyBpdCB3aWxsIGFsd2F5cyBiZSBpbnZva2VkIGZyb20gYSBzaW5nbGUgdGhyZWFkLgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiBnZXRQcm9jZXNzb3IoY29uc3QgVENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbykgPSAwOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisgIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jUHJvY2Vzc29yOworfQorfQorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RBU1lOQ1BST0NFU1NPUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I1MjAxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmg+CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgeworCit2b2lkIFRBc3luY1Byb3RvY29sUHJvY2Vzc29yOjpwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEJ1ZmZlckJhc2U+IGlidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQnVmZmVyQmFzZT4gb2J1ZikgeworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpcHJvdChwZmFjdF8tPmdldFByb3RvY29sKGlidWYpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3Byb3QocGZhY3RfLT5nZXRQcm90b2NvbChvYnVmKSk7CisgIHJldHVybiB1bmRlcmx5aW5nXworICAgICAgLT5wcm9jZXNzKHN0ZDo6YmluZCgmVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3I6OmZpbmlzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSksCisgICAgICAgICAgICAgICAgaXByb3QsCisgICAgICAgICAgICAgICAgb3Byb3QpOworfQorCisvKiBzdGF0aWMgKi8gdm9pZCBUQXN5bmNQcm90b2NvbFByb2Nlc3Nvcjo6ZmluaXNoKAorICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG9wcm90LAorICAgIGJvb2wgaGVhbHRoeSkgeworICAodm9pZClvcHJvdDsKKyAgLy8gVGhpcyBpcyBhIHN0dWIgZnVuY3Rpb24gdG8gaG9sZCBhIHJlZmVyZW5jZSB0byBvcHJvdC4KKyAgcmV0dXJuIF9yZXR1cm4oaGVhbHRoeSk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDUyY2YzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVE5BTUVfTUVfSF8KKyNkZWZpbmUgX1RIUklGVF9UTkFNRV9NRV9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CisKK2NsYXNzIFRBc3luY1Byb3RvY29sUHJvY2Vzc29yIDogcHVibGljIFRBc3luY0J1ZmZlclByb2Nlc3NvciB7CitwdWJsaWM6CisgIFRBc3luY1Byb3RvY29sUHJvY2Vzc29yKHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHVuZGVybHlpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHBmYWN0KQorICAgIDogdW5kZXJseWluZ18odW5kZXJseWluZyksIHBmYWN0XyhwZmFjdCkge30KKworICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlPiBpYnVmLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U+IG9idWYpOworCisgIHZpcnR1YWwgflRBc3luY1Byb3RvY29sUHJvY2Vzc29yKCkge30KKworcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgZmluaXNoKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBvcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGVhbHRoeSk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gdW5kZXJseWluZ187CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHBmYWN0XzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1ROQU1FX01FX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdlMjdjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmNwcApAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaD4KKyNpbmNsdWRlIDx0aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8bGltaXRzPgorCituYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBhc3luYyB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKKworVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6VENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbygpIDoKKyAgc3RvcF8oZmFsc2UpLAorICBzZXFpZE11dGV4XygpLAorICAvLyB0ZXN0IHJvbGxvdmVyIGFsbCB0aGUgdGltZQorICBuZXh0c2VxaWRfKChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCktMTApLAorICBzZXFpZFRvTW9uaXRvck1hcF8oKSwKKyAgZnJlZU1vbml0b3JzXygpLAorICB3cml0ZU11dGV4XygpLAorICByZWFkTXV0ZXhfKCksCisgIHJlY3ZQZW5kaW5nXyhmYWxzZSksCisgIHdha2V1cFNvbWVvbmVfKGZhbHNlKSwKKyAgc2VxaWRQZW5kaW5nXygwKSwKKyAgZm5hbWVQZW5kaW5nXygpLAorICBtdHlwZVBlbmRpbmdfKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0NBTEwpCit7CisgIGZyZWVNb25pdG9yc18ucmVzZXJ2ZShNT05JVE9SX0NBQ0hFX1NJWkUpOworfQorCitib29sIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm86OmdldFBlbmRpbmcoCisgIHN0ZDo6c3RyaW5nICZmbmFtZSwKKyAgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSAmbXR5cGUsCisgIGludDMyX3QgJnJzZXFpZCkKK3sKKyAgaWYoc3RvcF8pCisgICAgdGhyb3dEZWFkQ29ubmVjdGlvbl8oKTsKKyAgd2FrZXVwU29tZW9uZV8gPSBmYWxzZTsKKyAgaWYocmVjdlBlbmRpbmdfKQorICB7CisgICAgcmVjdlBlbmRpbmdfID0gZmFsc2U7CisgICAgcnNlcWlkID0gc2VxaWRQZW5kaW5nXzsKKyAgICBmbmFtZSAgPSBmbmFtZVBlbmRpbmdfOworICAgIG10eXBlICA9IG10eXBlUGVuZGluZ187CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm86OnVwZGF0ZVBlbmRpbmcoCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZmbmFtZSwKKyAgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZSwKKyAgaW50MzJfdCByc2VxaWQpCit7CisgIHJlY3ZQZW5kaW5nXyA9IHRydWU7CisgIHNlcWlkUGVuZGluZ18gPSByc2VxaWQ7CisgIGZuYW1lUGVuZGluZ18gPSBmbmFtZTsKKyAgbXR5cGVQZW5kaW5nXyA9IG10eXBlOworICBNb25pdG9yUHRyIG1vbml0b3I7CisgIHsKKyAgICBHdWFyZCBzZXFpZEd1YXJkKHNlcWlkTXV0ZXhfKTsKKyAgICBNb25pdG9yTWFwOjppdGVyYXRvciBpID0gc2VxaWRUb01vbml0b3JNYXBfLmZpbmQocnNlcWlkKTsKKyAgICBpZihpID09IHNlcWlkVG9Nb25pdG9yTWFwXy5lbmQoKSkKKyAgICAgIHRocm93QmFkU2VxSWRfKCk7CisgICAgbW9uaXRvciA9IGktPnNlY29uZDsKKyAgfQorICBtb25pdG9yLT5ub3RpZnkoKTsKK30KKwordm9pZCBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjp3YWl0Rm9yV29yayhpbnQzMl90IHNlcWlkKQoreworICBNb25pdG9yUHRyIG07CisgIHsKKyAgICBHdWFyZCBzZXFpZEd1YXJkKHNlcWlkTXV0ZXhfKTsKKyAgICBtID0gc2VxaWRUb01vbml0b3JNYXBfW3NlcWlkXTsKKyAgfQorICB3aGlsZSh0cnVlKQorICB7CisgICAgLy8gYmUgdmVyeSBjYXJlZnVsIGFib3V0IHNldHRpbmcgc3RhdGUgaW4gdGhpcyBsb29wIHRoYXQgYWZmZWN0cyB3YWtpbmcgdXAuICBZb3UgbWF5IGV4aXQKKyAgICAvLyB0aGlzIGZ1bmN0aW9uLCBhdHRlbXB0IHRvIGdyYWIgc29tZSB3b3JrLCBhbmQgc29tZW9uZSBlbHNlIGNvdWxkIGhhdmUgYmVhdGVuIHlvdSAob3Igbm90CisgICAgLy8gbGVmdCkgdGhlIHJlYWQgbXV0ZXgsIGFuZCB0aGF0IHdpbGwgcHV0IHlvdSByaWdodCBiYWNrIGluIHRoaXMgbG9vcCwgd2l0aCB0aGUgbWFuZ2xlZAorICAgIC8vIHN0YXRlIHlvdSBsZWZ0IGJlaGluZC4KKyAgICBpZihzdG9wXykKKyAgICAgIHRocm93RGVhZENvbm5lY3Rpb25fKCk7CisgICAgaWYod2FrZXVwU29tZW9uZV8pCisgICAgICByZXR1cm47CisgICAgaWYocmVjdlBlbmRpbmdfICYmIHNlcWlkUGVuZGluZ18gPT0gc2VxaWQpCisgICAgICByZXR1cm47CisgICAgbS0+d2FpdEZvcmV2ZXIoKTsKKyAgfQorfQorCit2b2lkIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm86OnRocm93QmFkU2VxSWRfKCkKK3sKKyAgdGhyb3cgYXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICBUQXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRCwKKyAgICAic2VydmVyIHNlbnQgYSBiYWQgc2VxaWQiKTsKK30KKwordm9pZCBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjp0aHJvd0RlYWRDb25uZWN0aW9uXygpCit7CisgIHRocm93IGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgInRoaXMgY2xpZW50IGRpZWQgb24gYW5vdGhlciB0aHJlYWQsIGFuZCBpcyBub3cgaW4gYW4gdW51c2FibGUgc3RhdGUiKTsKK30KKwordm9pZCBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjp3YWtldXBBbnlvbmVfKGNvbnN0IEd1YXJkICYpCit7CisgIHdha2V1cFNvbWVvbmVfID0gdHJ1ZTsKKyAgaWYoIXNlcWlkVG9Nb25pdG9yTWFwXy5lbXB0eSgpKQorICB7CisgICAgLy8gVGhlIG1vbml0b3IgbWFwIG1hcHMgaW50ZWdlcnMgdG8gbW9uaXRvcnMuICBMYXJnZXIgaW50ZWdlcnMgYXJlIG1vcmUgcmVjZW50CisgICAgLy8gbWVzc2FnZXMuICBTaW5jZSB0aGlzIGlzIG9yZGVyZWQsIGl0IG1lYW5zIHRoYXQgdGhlIGxhc3QgZWxlbWVudCBpcyB0aGUgbW9zdCByZWNlbnQuCisgICAgLy8gV2UgYXJlIHRyeWluZyB0byBndWVzcyB3aGljaCB0aHJlYWQgd2lsbCBoYXZlIGl0cyBtZXNzYWdlIGNvbXBsZXRlIG5leHQsIHNvIHdlIGFyZSBwaWNraW5nCisgICAgLy8gdGhlIG1vc3QgcmVjZW50LiBUaGUgb2xkZXN0IG1lc3NhZ2UgaXMgbGlrZWx5IHRvIGJlIHNvbWUgcG9sbGluZywgbG9uZyBsaXZlZCBtZXNzYWdlLgorICAgIC8vIElmIHdlIGd1ZXNzIHJpZ2h0LCB0aGUgdGhyZWFkIHdlIHdha2UgdXAgd2lsbCBoYW5kbGUgdGhlIG1lc3NhZ2UgdGhhdCBjb21lcyBpbi4KKyAgICAvLyBJZiB3ZSBndWVzcyB3cm9uZywgdGhlIHRocmVhZCB3ZSB3YWtlIHVwIHdpbGwgaGFuZCBvZmYgdGhlIHdvcmsgdG8gdGhlIGNvcnJlY3QgdGhyZWFkLAorICAgIC8vIGNvc3RpbmcgdXMgYW4gZXh0cmEgY29udGV4dCBzd2l0Y2guCisgICAgc2VxaWRUb01vbml0b3JNYXBfLnJiZWdpbigpLT5zZWNvbmQtPm5vdGlmeSgpOworICB9Cit9CisKK3ZvaWQgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6bWFya0JhZF8oY29uc3QgR3VhcmQgJikKK3sKKyAgd2FrZXVwU29tZW9uZV8gPSB0cnVlOworICBzdG9wXyA9IHRydWU7CisgIGZvcihNb25pdG9yTWFwOjppdGVyYXRvciBpID0gc2VxaWRUb01vbml0b3JNYXBfLmJlZ2luKCk7IGkgIT0gc2VxaWRUb01vbml0b3JNYXBfLmVuZCgpOyArK2kpCisgICAgaS0+c2Vjb25kLT5ub3RpZnkoKTsKK30KKworVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6TW9uaXRvclB0cgorVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6bmV3TW9uaXRvcl8oY29uc3QgR3VhcmQgJikKK3sKKyAgaWYoZnJlZU1vbml0b3JzXy5lbXB0eSgpKQorICAgIHJldHVybiBNb25pdG9yUHRyKG5ldyBNb25pdG9yKCZyZWFkTXV0ZXhfKSk7CisgIE1vbml0b3JQdHIgcmV0dmFsOworICAvL3N3YXBwaW5nIHRvIGF2b2lkIGFuIGF0b21pYyBvcGVyYXRpb24KKyAgcmV0dmFsLnN3YXAoZnJlZU1vbml0b3JzXy5iYWNrKCkpOworICBmcmVlTW9uaXRvcnNfLnBvcF9iYWNrKCk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK3ZvaWQgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6ZGVsZXRlTW9uaXRvcl8oCisgIGNvbnN0IEd1YXJkICYsCisgIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm86Ok1vbml0b3JQdHIgJm0pIC8qbm9leGNlcHQqLworeworICBpZihmcmVlTW9uaXRvcnNfLnNpemUoKSA+IE1PTklUT1JfQ0FDSEVfU0laRSkKKyAgeworICAgIG0ucmVzZXQoKTsKKyAgICByZXR1cm47CisgIH0KKyAgLy9mcmVlTW9uaXRvcnNfIHdhcyByZXNlcnZlZCB1cCB0byBNT05JVE9SX0NBQ0hFX1NJWkUgaW4gdGhlIGN0b3IsCisgIC8vc28gdGhpcyBzaG91bGRuJ3QgdGhyb3cKKyAgZnJlZU1vbml0b3JzXy5wdXNoX2JhY2soVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6TW9uaXRvclB0cigpKTsKKyAgLy9zd2FwcGluZyB0byBhdm9pZCBhbiBhdG9taWMgb3BlcmF0aW9uCisgIG0uc3dhcChmcmVlTW9uaXRvcnNfLmJhY2soKSk7Cit9CisKK2ludDMyX3QgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6Z2VuZXJhdGVTZXFJZCgpCit7CisgIEd1YXJkIHNlcWlkR3VhcmQoc2VxaWRNdXRleF8pOworICBpZihzdG9wXykKKyAgICB0aHJvd0RlYWRDb25uZWN0aW9uXygpOworCisgIGlmKCFzZXFpZFRvTW9uaXRvck1hcF8uZW1wdHkoKSkKKyAgICBpZihuZXh0c2VxaWRfID09IHNlcWlkVG9Nb25pdG9yTWFwXy5iZWdpbigpLT5maXJzdCkKKyAgICAgIHRocm93IGFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lELAorICAgICAgICAiYWJvdXQgdG8gcmVwZWF0IGEgc2VxaWQiKTsKKyAgaW50MzJfdCBuZXdTZXFJZCA9IG5leHRzZXFpZF8rKzsKKyAgc2VxaWRUb01vbml0b3JNYXBfW25ld1NlcUlkXSA9IG5ld01vbml0b3JfKHNlcWlkR3VhcmQpOworICByZXR1cm4gbmV3U2VxSWQ7Cit9CisKK1RDb25jdXJyZW50UmVjdlNlbnRyeTo6VENvbmN1cnJlbnRSZWN2U2VudHJ5KFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8gKnN5bmMsIGludDMyX3Qgc2VxaWQpIDoKKyAgc3luY18oKnN5bmMpLAorICBzZXFpZF8oc2VxaWQpLAorICBjb21taXR0ZWRfKGZhbHNlKQoreworICBzeW5jXy5nZXRSZWFkTXV0ZXgoKS5sb2NrKCk7Cit9CisKK1RDb25jdXJyZW50UmVjdlNlbnRyeTo6flRDb25jdXJyZW50UmVjdlNlbnRyeSgpCit7CisgIHsKKyAgICBHdWFyZCBzZXFpZEd1YXJkKHN5bmNfLnNlcWlkTXV0ZXhfKTsKKyAgICBzeW5jXy5kZWxldGVNb25pdG9yXyhzZXFpZEd1YXJkLCBzeW5jXy5zZXFpZFRvTW9uaXRvck1hcF9bc2VxaWRfXSk7CisKKyAgICBzeW5jXy5zZXFpZFRvTW9uaXRvck1hcF8uZXJhc2Uoc2VxaWRfKTsKKyAgICBpZihjb21taXR0ZWRfKQorICAgICAgc3luY18ud2FrZXVwQW55b25lXyhzZXFpZEd1YXJkKTsKKyAgICBlbHNlCisgICAgICBzeW5jXy5tYXJrQmFkXyhzZXFpZEd1YXJkKTsKKyAgfQorICBzeW5jXy5nZXRSZWFkTXV0ZXgoKS51bmxvY2soKTsKK30KKwordm9pZCBUQ29uY3VycmVudFJlY3ZTZW50cnk6OmNvbW1pdCgpCit7CisgIGNvbW1pdHRlZF8gPSB0cnVlOworfQorCitUQ29uY3VycmVudFNlbmRTZW50cnk6OlRDb25jdXJyZW50U2VuZFNlbnRyeShUQ29uY3VycmVudENsaWVudFN5bmNJbmZvICpzeW5jKSA6CisgIHN5bmNfKCpzeW5jKSwKKyAgY29tbWl0dGVkXyhmYWxzZSkKK3sKKyAgc3luY18uZ2V0V3JpdGVNdXRleCgpLmxvY2soKTsKK30KKworVENvbmN1cnJlbnRTZW5kU2VudHJ5Ojp+VENvbmN1cnJlbnRTZW5kU2VudHJ5KCkKK3sKKyAgaWYoIWNvbW1pdHRlZF8pCisgIHsKKyAgICBHdWFyZCBzZXFpZEd1YXJkKHN5bmNfLnNlcWlkTXV0ZXhfKTsKKyAgICBzeW5jXy5tYXJrQmFkXyhzZXFpZEd1YXJkKTsKKyAgfQorICBzeW5jXy5nZXRXcml0ZU11dGV4KCkudW5sb2NrKCk7Cit9CisKK3ZvaWQgVENvbmN1cnJlbnRTZW5kU2VudHJ5Ojpjb21taXQoKQoreworICBjb21taXR0ZWRfID0gdHJ1ZTsKK30KKworCit9fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmM1ZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaApAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBfVEhSSUZUX1RDT05DVVJSRU5UQ0xJRU5UU1lOQ0lORk9fSF8KKyNkZWZpbmUgX1RIUklGVF9UQ09OQ1VSUkVOVENMSUVOVFNZTkNJTkZPX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CisKK2NsYXNzIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm87CisKK2NsYXNzIFRDb25jdXJyZW50U2VuZFNlbnRyeSB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFRDb25jdXJyZW50U2VuZFNlbnRyeShUQ29uY3VycmVudENsaWVudFN5bmNJbmZvKiBzeW5jKTsKKyAgflRDb25jdXJyZW50U2VuZFNlbnRyeSgpOworCisgIHZvaWQgY29tbWl0KCk7CisKK3ByaXZhdGU6CisgIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8mIHN5bmNfOworICBib29sIGNvbW1pdHRlZF87Cit9OworCitjbGFzcyBUQ29uY3VycmVudFJlY3ZTZW50cnkgeworcHVibGljOgorICBUQ29uY3VycmVudFJlY3ZTZW50cnkoVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyogc3luYywgaW50MzJfdCBzZXFpZCk7CisgIH5UQ29uY3VycmVudFJlY3ZTZW50cnkoKTsKKworICB2b2lkIGNvbW1pdCgpOworCitwcml2YXRlOgorICBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvJiBzeW5jXzsKKyAgaW50MzJfdCBzZXFpZF87CisgIGJvb2wgY29tbWl0dGVkXzsKK307CisKK2NsYXNzIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8geworcHJpdmF0ZTogLy8gdHlwZWRlZnMKKyAgdHlwZWRlZiBzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yPiBNb25pdG9yUHRyOworICB0eXBlZGVmIHN0ZDo6bWFwPGludDMyX3QsIE1vbml0b3JQdHI+IE1vbml0b3JNYXA7CisKK3B1YmxpYzoKKyAgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbygpOworCisgIGludDMyX3QgZ2VuZXJhdGVTZXFJZCgpOworCisgIGJvb2wgZ2V0UGVuZGluZyhzdGQ6OnN0cmluZyYgZm5hbWUsCisgICAgICAgICAgICAgICAgICA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlJiBtdHlwZSwKKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIHJzZXFpZCk7IC8qIHJlcXVpcmVzIHJlYWRNdXRleF8gKi8KKworICB2b2lkIHVwZGF0ZVBlbmRpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcnNlcWlkKTsgLyogcmVxdWlyZXMgcmVhZE11dGV4XyAqLworCisgIHZvaWQgd2FpdEZvcldvcmsoaW50MzJfdCBzZXFpZCk7IC8qIHJlcXVpcmVzIHJlYWRNdXRleF8gKi8KKworICA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXgmIGdldFJlYWRNdXRleCgpIHsgcmV0dXJuIHJlYWRNdXRleF87IH0KKyAgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4JiBnZXRXcml0ZU11dGV4KCkgeyByZXR1cm4gd3JpdGVNdXRleF87IH0KKworcHJpdmF0ZTogLy8gY29uc3RhbnRzCisgIGVudW0geyBNT05JVE9SX0NBQ0hFX1NJWkUgPSAxMCB9OworCitwcml2YXRlOiAvLyBmdW5jdGlvbnMKKyAgTW9uaXRvclB0ciBuZXdNb25pdG9yXygKKyAgICAgIGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZCYgc2VxaWRHdWFyZCk7IC8qIHJlcXVpcmVzIHNlcWlkTXV0ZXhfICovCisgIHZvaWQgZGVsZXRlTW9uaXRvcl8oY29uc3QgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkJiBzZXFpZEd1YXJkLCBNb25pdG9yUHRyJiBtKTsKKyAgICAgIC8qbm9leGNlcHQqLyAvKiByZXF1aXJlcyBzZXFpZE11dGV4XyAqLworICB2b2lkIHdha2V1cEFueW9uZV8oCisgICAgICBjb25zdCA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6R3VhcmQmIHNlcWlkR3VhcmQpOyAgICAgICAgICAgLyogcmVxdWlyZXMgc2VxaWRNdXRleF8gKi8KKyAgdm9pZCBtYXJrQmFkXyhjb25zdCA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6R3VhcmQmIHNlcWlkR3VhcmQpOyAvKiByZXF1aXJlcyBzZXFpZE11dGV4XyAqLworICB2b2lkIHRocm93QmFkU2VxSWRfKCk7CisgIHZvaWQgdGhyb3dEZWFkQ29ubmVjdGlvbl8oKTsKKworcHJpdmF0ZTogLy8gZGF0YSBtZW1iZXJzCisgIHZvbGF0aWxlIGJvb2wgc3RvcF87CisKKyAgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4IHNlcWlkTXV0ZXhfOworICAvLyBiZWdpbiBzZXFpZE11dGV4XyBwcm90ZWN0ZWQgbWVtYmVycworICBpbnQzMl90IG5leHRzZXFpZF87CisgIE1vbml0b3JNYXAgc2VxaWRUb01vbml0b3JNYXBfOworICBzdGQ6OnZlY3RvcjxNb25pdG9yUHRyPiBmcmVlTW9uaXRvcnNfOworICAvLyBlbmQgc2VxaWRNdXRleF8gcHJvdGVjdGVkIG1lbWJlcnMKKworICA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXggd3JpdGVNdXRleF87CisKKyAgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4IHJlYWRNdXRleF87CisgIC8vIGJlZ2luIHJlYWRNdXRleF8gcHJvdGVjdGVkIG1lbWJlcnMKKyAgYm9vbCByZWN2UGVuZGluZ187CisgIGJvb2wgd2FrZXVwU29tZW9uZV87CisgIGludDMyX3Qgc2VxaWRQZW5kaW5nXzsKKyAgc3RkOjpzdHJpbmcgZm5hbWVQZW5kaW5nXzsKKyAgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZVBlbmRpbmdfOworICAvLyBlbmQgcmVhZE11dGV4XyBwcm90ZWN0ZWQgbWVtYmVycworCisgIGZyaWVuZCBjbGFzcyBUQ29uY3VycmVudFNlbmRTZW50cnk7CisgIGZyaWVuZCBjbGFzcyBUQ29uY3VycmVudFJlY3ZTZW50cnk7Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKKworI2VuZGlmIC8vIF9USFJJRlRfVENPTkNVUlJFTlRDTElFTlRTWU5DSU5GT19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmODEwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5oPgorI2luY2x1ZGUgPGV2aHR0cC5oPgorI2luY2x1ZGUgPGV2ZW50Mi9idWZmZXIuaD4KKyNpbmNsdWRlIDxldmVudDIvYnVmZmVyX2NvbXBhdC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CisKK1RFdmh0dHBDbGllbnRDaGFubmVsOjpURXZodHRwQ2xpZW50Q2hhbm5lbChjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldmVudF9iYXNlKiBlYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXZkbnNfYmFzZSogZG5zYmFzZSkKKworICA6IGhvc3RfKGhvc3QpLCBwYXRoXyhwYXRoKSwgY29ubl8oTlVMTCkgeworICBjb25uXyA9IGV2aHR0cF9jb25uZWN0aW9uX2Jhc2VfbmV3KGViLCBkbnNiYXNlLCBhZGRyZXNzLCBwb3J0KTsKKyAgaWYgKGNvbm5fID09IE5VTEwpIHsKKyAgICB0aHJvdyBURXhjZXB0aW9uKCJldmh0dHBfY29ubmVjdGlvbl9uZXcgZmFpbGVkIik7CisgIH0KK30KKworVEV2aHR0cENsaWVudENoYW5uZWw6On5URXZodHRwQ2xpZW50Q2hhbm5lbCgpIHsKKyAgaWYgKGNvbm5fICE9IE5VTEwpIHsKKyAgICBldmh0dHBfY29ubmVjdGlvbl9mcmVlKGNvbm5fKTsKKyAgfQorfQorCit2b2lkIFRFdmh0dHBDbGllbnRDaGFubmVsOjpzZW5kQW5kUmVjdk1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogc2VuZEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiByZWN2QnVmKSB7CisgIHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxID0gZXZodHRwX3JlcXVlc3RfbmV3KHJlc3BvbnNlLCB0aGlzKTsKKyAgaWYgKHJlcSA9PSBOVUxMKSB7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigiZXZodHRwX3JlcXVlc3RfbmV3IGZhaWxlZCIpOworICB9CisKKyAgaW50IHJ2OworCisgIHJ2ID0gZXZodHRwX2FkZF9oZWFkZXIocmVxLT5vdXRwdXRfaGVhZGVycywgIkhvc3QiLCBob3N0Xy5jX3N0cigpKTsKKyAgaWYgKHJ2ICE9IDApIHsKKyAgICB0aHJvdyBURXhjZXB0aW9uKCJldmh0dHBfYWRkX2hlYWRlciBmYWlsZWQiKTsKKyAgfQorCisgIHJ2ID0gZXZodHRwX2FkZF9oZWFkZXIocmVxLT5vdXRwdXRfaGVhZGVycywgIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpOworICBpZiAocnYgIT0gMCkgeworICAgIHRocm93IFRFeGNlcHRpb24oImV2aHR0cF9hZGRfaGVhZGVyIGZhaWxlZCIpOworICB9CisKKyAgdWludDhfdCogb2J1ZjsKKyAgdWludDMyX3Qgc3o7CisgIHNlbmRCdWYtPmdldEJ1ZmZlcigmb2J1ZiwgJnN6KTsKKyAgcnYgPSBldmJ1ZmZlcl9hZGQocmVxLT5vdXRwdXRfYnVmZmVyLCBvYnVmLCBzeik7CisgIGlmIChydiAhPSAwKSB7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigiZXZidWZmZXJfYWRkIGZhaWxlZCIpOworICB9CisKKyAgcnYgPSBldmh0dHBfbWFrZV9yZXF1ZXN0KGNvbm5fLCByZXEsIEVWSFRUUF9SRVFfUE9TVCwgcGF0aF8uY19zdHIoKSk7CisgIGlmIChydiAhPSAwKSB7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigiZXZodHRwX21ha2VfcmVxdWVzdCBmYWlsZWQiKTsKKyAgfQorCisgIGNvbXBsZXRpb25RdWV1ZV8ucHVzaChDb21wbGV0aW9uKGNvYiwgcmVjdkJ1ZikpOworfQorCit2b2lkIFRFdmh0dHBDbGllbnRDaGFubmVsOjpzZW5kTWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpIHsKKyAgKHZvaWQpY29iOworICAodm9pZCltZXNzYWdlOworICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBjYWxsIHRvIFRFdmh0dHBDbGllbnRDaGFubmVsOjpzZW5kTWVzc2FnZSIpOworfQorCit2b2lkIFRFdmh0dHBDbGllbnRDaGFubmVsOjpyZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpIHsKKyAgKHZvaWQpY29iOworICAodm9pZCltZXNzYWdlOworICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBjYWxsIHRvIFRFdmh0dHBDbGllbnRDaGFubmVsOjpyZWN2TWVzc2FnZSIpOworfQorCit2b2lkIFRFdmh0dHBDbGllbnRDaGFubmVsOjpmaW5pc2goc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEpIHsKKyAgYXNzZXJ0KCFjb21wbGV0aW9uUXVldWVfLmVtcHR5KCkpOworICBDb21wbGV0aW9uIGNvbXBsZXRpb24gPSBjb21wbGV0aW9uUXVldWVfLmZyb250KCk7CisgIGNvbXBsZXRpb25RdWV1ZV8ucG9wKCk7CisgIGlmIChyZXEgPT0gTlVMTCkgeworICAgIHRyeSB7CisgICAgICBjb21wbGV0aW9uLmZpcnN0KCk7CisgICAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZSkgeworICAgICAgaWYgKGUuZ2V0VHlwZSgpID09IFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKQorICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJjb25uZWN0IGZhaWxlZCIpOworICAgICAgZWxzZQorICAgICAgICB0aHJvdzsKKyAgICB9CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHJlcS0+cmVzcG9uc2VfY29kZSAhPSAyMDApIHsKKyAgICB0cnkgeworICAgICAgY29tcGxldGlvbi5maXJzdCgpOworICAgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIGUpIHsKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgc3MgPDwgInNlcnZlciByZXR1cm5lZCBjb2RlICIgPDwgcmVxLT5yZXNwb25zZV9jb2RlOworICAgICAgaWYgKHJlcS0+cmVzcG9uc2VfY29kZV9saW5lKQorICAgICAgICBzcyA8PCAiOiAiIDw8IHJlcS0+cmVzcG9uc2VfY29kZV9saW5lOworICAgICAgaWYgKGUuZ2V0VHlwZSgpID09IFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKQorICAgICAgICB0aHJvdyBURXhjZXB0aW9uKHNzLnN0cigpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgdGhyb3c7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBjb21wbGV0aW9uLnNlY29uZC0+cmVzZXRCdWZmZXIoRVZCVUZGRVJfREFUQShyZXEtPmlucHV0X2J1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oRVZCVUZGRVJfTEVOR1RIKHJlcS0+aW5wdXRfYnVmZmVyKSkpOworICBjb21wbGV0aW9uLmZpcnN0KCk7CisgIHJldHVybjsKK30KKworLyogc3RhdGljICovIHZvaWQgVEV2aHR0cENsaWVudENoYW5uZWw6OnJlc3BvbnNlKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxLCB2b2lkKiBhcmcpIHsKKyAgVEV2aHR0cENsaWVudENoYW5uZWwqIHNlbGYgPSAoVEV2aHR0cENsaWVudENoYW5uZWwqKWFyZzsKKyAgdHJ5IHsKKyAgICBzZWxmLT5maW5pc2gocmVxKTsKKyAgfSBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGUpIHsKKyAgICAvLyBkb24ndCBwcm9wYWdhdGUgYSBDKysgZXhjZXB0aW9uIGluIEMgY29kZSAoZS5nLiBsaWJldmVudCkKKyAgICBzdGQ6OmNlcnIgPDwgIlRFdmh0dHBDbGllbnRDaGFubmVsOjpyZXNwb25zZSBleGNlcHRpb24gdGhyb3duIChpZ25vcmVkKTogIiA8PCBlLndoYXQoKQorICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgIH0KK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMjFmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9URVZIVFRQX0NMSUVOVF9DSEFOTkVMX0hfCisjZGVmaW5lIF9USFJJRlRfVEVWSFRUUF9DTElFTlRfQ0hBTk5FTF9IXyAxCisKKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaD4KKworc3RydWN0IGV2ZW50X2Jhc2U7CitzdHJ1Y3QgZXZkbnNfYmFzZTsKK3N0cnVjdCBldmh0dHBfY29ubmVjdGlvbjsKK3N0cnVjdCBldmh0dHBfcmVxdWVzdDsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworY2xhc3MgVE1lbW9yeUJ1ZmZlcjsKK30KK30KK30KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CisKK2NsYXNzIFRFdmh0dHBDbGllbnRDaGFubmVsIDogcHVibGljIFRBc3luY0NoYW5uZWwgeworcHVibGljOgorICB1c2luZyBUQXN5bmNDaGFubmVsOjpWb2lkQ2FsbGJhY2s7CisKKyAgVEV2aHR0cENsaWVudENoYW5uZWwoY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV2ZW50X2Jhc2UqIGViLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXZkbnNfYmFzZSAqZG5zYmFzZSA9IDApOworICB+VEV2aHR0cENsaWVudENoYW5uZWwoKTsKKworICB2aXJ0dWFsIHZvaWQgc2VuZEFuZFJlY3ZNZXNzYWdlKGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHNlbmRCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogcmVjdkJ1Zik7CisKKyAgdmlydHVhbCB2b2lkIHNlbmRNZXNzYWdlKGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogbWVzc2FnZSk7CisgIHZpcnR1YWwgdm9pZCByZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpOworCisgIHZvaWQgZmluaXNoKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxKTsKKworICAvLyBYWFgKKyAgdmlydHVhbCBib29sIGdvb2QoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgIHZpcnR1YWwgYm9vbCBlcnJvcigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCB0aW1lZE91dCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKK3ByaXZhdGU6CisgIHN0YXRpYyB2b2lkIHJlc3BvbnNlKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxLCB2b2lkKiBhcmcpOworCisgIHN0ZDo6c3RyaW5nIGhvc3RfOworICBzdGQ6OnN0cmluZyBwYXRoXzsKKyAgdHlwZWRlZiBzdGQ6OnBhaXI8Vm9pZENhbGxiYWNrLCBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKj4gQ29tcGxldGlvbjsKKyAgdHlwZWRlZiBzdGQ6OnF1ZXVlPENvbXBsZXRpb24+IENvbXBsZXRpb25RdWV1ZTsKKyAgQ29tcGxldGlvblF1ZXVlIGNvbXBsZXRpb25RdWV1ZV87CisgIHN0cnVjdCBldmh0dHBfY29ubmVjdGlvbiogY29ubl87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9URVZIVFRQX0NMSUVOVF9DSEFOTkVMX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjMzI2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmNwcApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxldmh0dHAuaD4KKyNpbmNsdWRlIDxldmVudDIvYnVmZmVyLmg+CisjaW5jbHVkZSA8ZXZlbnQyL2J1ZmZlcl9jb21wYXQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2lmbmRlZiBIVFRQX0lOVEVSTkFMIC8vIGxpYmV2ZW50IDwgMgorI2RlZmluZSBIVFRQX0lOVEVSTkFMIDUwMAorI2VuZGlmCisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgeworCitzdHJ1Y3QgVEV2aHR0cFNlcnZlcjo6UmVxdWVzdENvbnRleHQgeworICBzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcTsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IGlidWY7CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBvYnVmOworCisgIFJlcXVlc3RDb250ZXh0KHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxKTsKK307CisKK1RFdmh0dHBTZXJ2ZXI6OlRFdmh0dHBTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yKQorICA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwgZWJfKE5VTEwpLCBlaF8oTlVMTCkgeworfQorCitURXZodHRwU2VydmVyOjpURXZodHRwU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3NvciwgaW50IHBvcnQpCisgIDogcHJvY2Vzc29yXyhwcm9jZXNzb3IpLCBlYl8oTlVMTCksIGVoXyhOVUxMKSB7CisgIC8vIENyZWF0ZSBldmVudF9iYXNlIGFuZCBldmh0dHAuCisgIGViXyA9IGV2ZW50X2Jhc2VfbmV3KCk7CisgIGlmIChlYl8gPT0gTlVMTCkgeworICAgIHRocm93IFRFeGNlcHRpb24oImV2ZW50X2Jhc2VfbmV3IGZhaWxlZCIpOworICB9CisgIGVoXyA9IGV2aHR0cF9uZXcoZWJfKTsKKyAgaWYgKGVoXyA9PSBOVUxMKSB7CisgICAgZXZlbnRfYmFzZV9mcmVlKGViXyk7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigiZXZodHRwX25ldyBmYWlsZWQiKTsKKyAgfQorCisgIC8vIEJpbmQgdG8gcG9ydC4KKyAgaW50IHJldCA9IGV2aHR0cF9iaW5kX3NvY2tldChlaF8sIE5VTEwsIHBvcnQpOworICBpZiAocmV0IDwgMCkgeworICAgIGV2aHR0cF9mcmVlKGVoXyk7CisgICAgZXZlbnRfYmFzZV9mcmVlKGViXyk7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigiZXZodHRwX2JpbmRfc29ja2V0IGZhaWxlZCIpOworICB9CisKKyAgLy8gUmVnaXN0ZXIgYSBoYW5kbGVyLiAgSWYgeW91IHVzZSB0aGUgb3RoZXIgY29uc3RydWN0b3IsCisgIC8vIHlvdSB3aWxsIHdhbnQgdG8gZG8gdGhpcyB5b3Vyc2VsZi4KKyAgLy8gRG9uJ3QgZm9yZ2V0IHRvIHVucmVnaXN0ZXIgYmVmb3JlIGRlc3RvcnlpbmcgdGhpcyBURXZodHRwU2VydmVyLgorICBldmh0dHBfc2V0X2NiKGVoXywgIi8iLCByZXF1ZXN0LCAodm9pZCopdGhpcyk7Cit9CisKK1RFdmh0dHBTZXJ2ZXI6On5URXZodHRwU2VydmVyKCkgeworICBpZiAoZWhfICE9IE5VTEwpIHsKKyAgICBldmh0dHBfZnJlZShlaF8pOworICB9CisgIGlmIChlYl8gIT0gTlVMTCkgeworICAgIGV2ZW50X2Jhc2VfZnJlZShlYl8pOworICB9Cit9CisKK2ludCBURXZodHRwU2VydmVyOjpzZXJ2ZSgpIHsKKyAgaWYgKGViXyA9PSBOVUxMKSB7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCBjYWxsIHRvIFRFdmh0dHBTZXJ2ZXI6OnNlcnZlIik7CisgIH0KKyAgcmV0dXJuIGV2ZW50X2Jhc2VfZGlzcGF0Y2goZWJfKTsKK30KKworVEV2aHR0cFNlcnZlcjo6UmVxdWVzdENvbnRleHQ6OlJlcXVlc3RDb250ZXh0KHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxKQorICA6IHJlcShyZXEpLAorICAgIGlidWYobmV3IFRNZW1vcnlCdWZmZXIoRVZCVUZGRVJfREFUQShyZXEtPmlucHV0X2J1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oRVZCVUZGRVJfTEVOR1RIKHJlcS0+aW5wdXRfYnVmZmVyKSkpKSwKKyAgICBvYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpIHsKK30KKwordm9pZCBURXZodHRwU2VydmVyOjpyZXF1ZXN0KHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxLCB2b2lkKiBzZWxmKSB7CisgIHRyeSB7CisgICAgc3RhdGljX2Nhc3Q8VEV2aHR0cFNlcnZlcio+KHNlbGYpLT5wcm9jZXNzKHJlcSk7CisgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CisgICAgZXZodHRwX3NlbmRfcmVwbHkocmVxLCBIVFRQX0lOVEVSTkFMLCBlLndoYXQoKSwgMCk7CisgIH0KK30KKwordm9pZCBURXZodHRwU2VydmVyOjpwcm9jZXNzKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxKSB7CisgIFJlcXVlc3RDb250ZXh0KiBjdHggPSBuZXcgUmVxdWVzdENvbnRleHQocmVxKTsKKyAgcmV0dXJuIHByb2Nlc3Nvcl8tPnByb2Nlc3Moc3RkOjpiaW5kKCZURXZodHRwU2VydmVyOjpjb21wbGV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmlidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+b2J1Zik7Cit9CisKK3ZvaWQgVEV2aHR0cFNlcnZlcjo6Y29tcGxldGUoUmVxdWVzdENvbnRleHQqIGN0eCwgYm9vbCBzdWNjZXNzKSB7CisgICh2b2lkKXN1Y2Nlc3M7CisgIHN0ZDo6dW5pcXVlX3B0cjxSZXF1ZXN0Q29udGV4dD4gcHRyKGN0eCk7CisKKyAgaW50IGNvZGUgPSBzdWNjZXNzID8gMjAwIDogNDAwOworICBjb25zdCBjaGFyKiByZWFzb24gPSBzdWNjZXNzID8gIk9LIiA6ICJCYWQgUmVxdWVzdCI7CisKKyAgaW50IHJ2ID0gZXZodHRwX2FkZF9oZWFkZXIoY3R4LT5yZXEtPm91dHB1dF9oZWFkZXJzLCAiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtdGhyaWZ0Iik7CisgIGlmIChydiAhPSAwKSB7CisgICAgLy8gVE9ETzogTG9nIGFuIGVycm9yLgorICAgIHN0ZDo6Y2VyciA8PCAiZXZodHRwX2FkZF9oZWFkZXIgZmFpbGVkICIgPDwgX19GSUxFX18gPDwgIjoiIDw8IF9fTElORV9fIDw8IHN0ZDo6ZW5kbDsKKyAgfQorCisgIHN0cnVjdCBldmJ1ZmZlciogYnVmID0gZXZidWZmZXJfbmV3KCk7CisgIGlmIChidWYgPT0gTlVMTCkgeworICAgIC8vIFRPRE86IExvZyBhbiBlcnJvci4KKyAgICBzdGQ6OmNlcnIgPDwgImV2YnVmZmVyX25ldyBmYWlsZWQgIiA8PCBfX0ZJTEVfXyA8PCAiOiIgPDwgX19MSU5FX18gPDwgc3RkOjplbmRsOworICB9IGVsc2UgeworICAgIHVpbnQ4X3QqIG9idWY7CisgICAgdWludDMyX3Qgc3o7CisgICAgY3R4LT5vYnVmLT5nZXRCdWZmZXIoJm9idWYsICZzeik7CisgICAgaW50IHJldCA9IGV2YnVmZmVyX2FkZChidWYsIG9idWYsIHN6KTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgIC8vIFRPRE86IExvZyBhbiBlcnJvci4KKyAgICAgIHN0ZDo6Y2VyciA8PCAiZXZodHRwX2FkZCBmYWlsZWQgd2l0aCAiIDw8IHJldCA8PCAiICIgPDwgX19GSUxFX18gPDwgIjoiIDw8IF9fTElORV9fCisgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgIH0KKyAgfQorCisgIGV2aHR0cF9zZW5kX3JlcGx5KGN0eC0+cmVxLCBjb2RlLCByZWFzb24sIGJ1Zik7CisgIGlmIChidWYgIT0gTlVMTCkgeworICAgIGV2YnVmZmVyX2ZyZWUoYnVmKTsKKyAgfQorfQorCitzdHJ1Y3QgZXZlbnRfYmFzZSogVEV2aHR0cFNlcnZlcjo6Z2V0RXZlbnRCYXNlKCkgeworICByZXR1cm4gZWJfOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YmYzYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RFVkhUVFBfU0VSVkVSX0hfCisjZGVmaW5lIF9USFJJRlRfVEVWSFRUUF9TRVJWRVJfSF8gMQorCisjaW5jbHVkZSA8bWVtb3J5PgorCitzdHJ1Y3QgZXZlbnRfYmFzZTsKK3N0cnVjdCBldmh0dHA7CitzdHJ1Y3QgZXZodHRwX3JlcXVlc3Q7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgeworCitjbGFzcyBUQXN5bmNCdWZmZXJQcm9jZXNzb3I7CisKK2NsYXNzIFRFdmh0dHBTZXJ2ZXIgeworcHVibGljOgorICAvKioKKyAgICogQ3JlYXRlIGEgVEV2aHR0cFNlcnZlciBmb3IgdXNlIHdpdGggYW4gZXh0ZXJuYWwgZXZodHRwIGluc3RhbmNlLgorICAgKiBNdXN0IGJlIG1hbnVhbGx5IGluc3RhbGxlZCB3aXRoIGV2aHR0cF9zZXRfY2IsIHVzaW5nCisgICAqIFRFdmh0dHBTZXJ2ZXI6OnJlcXVlc3QgYXMgdGhlIGNhbGxiYWNrIGFuZCB0aGUKKyAgICogYWRkcmVzcyBvZiB0aGUgc2VydmVyIGFzIHRoZSBleHRyYSBhcmcuCisgICAqIERvIG5vdCBjYWxsICJzZXJ2ZSIgb24gdGhpcyBzZXJ2ZXIuCisgICAqLworICBURXZodHRwU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3Nvcik7CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIFRFdmh0dHBTZXJ2ZXIgd2l0aCBhbiBlbWJlZGRlZCBldmVudF9iYXNlIGFuZCBldmh0dHAsCisgICAqIGxpc3RlbmluZyBvbiBwb3J0IGFuZCByZXNwb25kaW5nIG9uIHRoZSBlbmRwb2ludCAiLyIuCisgICAqIENhbGwgInNlcnZlIiBvbiB0aGlzIHNlcnZlciB0byBzZXJ2ZSBmb3JldmVyLgorICAgKi8KKyAgVEV2aHR0cFNlcnZlcihzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiBwcm9jZXNzb3IsIGludCBwb3J0KTsKKworICB+VEV2aHR0cFNlcnZlcigpOworCisgIHN0YXRpYyB2b2lkIHJlcXVlc3Qoc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEsIHZvaWQqIHNlbGYpOworICBpbnQgc2VydmUoKTsKKworICBzdHJ1Y3QgZXZlbnRfYmFzZSogZ2V0RXZlbnRCYXNlKCk7CisKK3ByaXZhdGU6CisgIHN0cnVjdCBSZXF1ZXN0Q29udGV4dDsKKworICB2b2lkIHByb2Nlc3Moc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEpOworICB2b2lkIGNvbXBsZXRlKFJlcXVlc3RDb250ZXh0KiBjdHgsIGJvb2wgc3VjY2Vzcyk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RydWN0IGV2ZW50X2Jhc2UqIGViXzsKKyAgc3RydWN0IGV2aHR0cCogZWhfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVEVWSFRUUF9TRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDM4ZmRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0VYQ0VQVElPTl9IXworI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX0VYQ0VQVElPTl9IXyAxCisKKyNpbmNsdWRlIDxleGNlcHRpb24+CisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworY2xhc3MgTm9TdWNoVGFza0V4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7fTsKKworY2xhc3MgVW5jYW5jZWxsYWJsZVRhc2tFeGNlcHRpb24gOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24ge307CisKK2NsYXNzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7fTsKKworY2xhc3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKK3B1YmxpYzoKKyAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkge30KKyAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6IFRFeGNlcHRpb24obWVzc2FnZSkge30KK307CisKK2NsYXNzIFRpbWVkT3V0RXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKK3B1YmxpYzoKKyAgVGltZWRPdXRFeGNlcHRpb24oKSA6IFRFeGNlcHRpb24oIlRpbWVkT3V0RXhjZXB0aW9uIil7fTsKKyAgVGltZWRPdXRFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDogVEV4Y2VwdGlvbihtZXNzYWdlKSB7fQorfTsKKworY2xhc3MgVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24oKSA6IFRFeGNlcHRpb24oIlRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24iKXt9OworICBUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6IFRFeGNlcHRpb24obWVzc2FnZSkge30KK307CisKK2NsYXNzIFN5c3RlbVJlc291cmNlRXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKK3B1YmxpYzoKKyAgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oKSB7fQorCisgIFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6IFRFeGNlcHRpb24obWVzc2FnZSkge30KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0VYQ0VQVElPTl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWQxNzZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0ZVTkNUSU9OX1JVTk5FUl9ICisjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfRlVOQ1RJT05fUlVOTkVSX0ggMQorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKy8qKgorICogQ29udmVuaWVudCBpbXBsZW1lbnRhdGlvbiBvZiBSdW5uYWJsZSB0aGF0IHdpbGwgZXhlY3V0ZSBhcmJpdHJhcnkgY2FsbGJhY2tzLgorICogSW50ZXJmYWNlcyBhcmUgcHJvdmlkZWQgdG8gYWNjZXB0IGJvdGggYSBnZW5lcmljICd2b2lkKHZvaWQpJyBjYWxsYmFjaywgYW5kCisgKiBhICd2b2lkKiAodm9pZCopJyBwdGhyZWFkX2NyZWF0ZS1zdHlsZSBjYWxsYmFjay4KKyAqCisgKiBFeGFtcGxlIHVzZToKKyAqICB2b2lkKiBteV90aHJlYWRfbWFpbih2b2lkKiBhcmcpOworICogIHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gZmFjdG9yeSA9IC4uLjsKKyAqICAvLyBUbyBjcmVhdGUgYSB0aHJlYWQgdGhhdCBleGVjdXRlcyBteV90aHJlYWRfbWFpbiBvbmNlOgorICogIHNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQgPSBmYWN0b3J5LT5uZXdUaHJlYWQoCisgKiAgICBGdW5jdGlvblJ1bm5lcjo6Y3JlYXRlKG15X3RocmVhZF9tYWluLCBzb21lX2FyZ3VtZW50KSk7CisgKiAgdGhyZWFkLT5zdGFydCgpOworICoKKyAqICBib29sIEE6OmZvbygpOworICogIEEqIGEgPSBuZXcgQSgpOworICogIC8vIFRvIGNyZWF0ZSBhIHRocmVhZCB0aGF0IGV4ZWN1dGVzIGEuZm9vKCkgZXZlcnkgMTAwIG1pbGxpc2Vjb25kczoKKyAqICBmYWN0b3J5LT5uZXdUaHJlYWQoRnVuY3Rpb25SdW5uZXI6OmNyZWF0ZSgKKyAqICAgIHN0ZDo6YmluZCgmQTo6Zm9vLCBhKSwgMTAwKSktPnN0YXJ0KCk7CisgKgorICovCisKK2NsYXNzIEZ1bmN0aW9uUnVubmVyIDogcHVibGljIFJ1bm5hYmxlIHsKK3B1YmxpYzoKKyAgLy8gVGhpcyBpcyB0aGUgdHlwZSBvZiBjYWxsYmFjayAncHRocmVhZF9jcmVhdGUoKScgZXhwZWN0cy4KKyAgdHlwZWRlZiB2b2lkKiAoKlB0aHJlYWRGdW5jUHRyKSh2b2lkKiBhcmcpOworICAvLyBUaGlzIGEgZnVsbHktZ2VuZXJpYyB2b2lkKHZvaWQpIGNhbGxiYWNrIGZvciBjdXN0b20gYmluZGluZ3MuCisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IFZvaWRGdW5jOworCisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjxib29sKCk+IEJvb2xGdW5jOworCisgIC8qKgorICAgKiBTeW50YWN0aWMgc3VnYXIgdG8gbWFrZSBpdCBlYXNpZXIgdG8gY3JlYXRlIG5ldyBGdW5jdGlvblJ1bm5lcgorICAgKiBvYmplY3RzIHdyYXBwZWQgaW4gc2hhcmVkX3B0ci4KKyAgICovCisgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8RnVuY3Rpb25SdW5uZXI+IGNyZWF0ZShjb25zdCBWb2lkRnVuYyYgY29iKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxGdW5jdGlvblJ1bm5lcj4obmV3IEZ1bmN0aW9uUnVubmVyKGNvYikpOworICB9CisKKyAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxGdW5jdGlvblJ1bm5lcj4gY3JlYXRlKFB0aHJlYWRGdW5jUHRyIGZ1bmMsIHZvaWQqIGFyZykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8RnVuY3Rpb25SdW5uZXI+KG5ldyBGdW5jdGlvblJ1bm5lcihmdW5jLCBhcmcpKTsKKyAgfQorCitwcml2YXRlOgorICBzdGF0aWMgdm9pZCBwdGhyZWFkX2Z1bmNfd3JhcHBlcihQdGhyZWFkRnVuY1B0ciBmdW5jLCB2b2lkKiBhcmcpIHsKKyAgICAvLyBkaXNjYXJkIHJldHVybiB2YWx1ZQorICAgIGZ1bmMoYXJnKTsKKyAgfQorCitwdWJsaWM6CisgIC8qKgorICAgKiBHaXZlbiBhICdwdGhyZWFkX2NyZWF0ZScgc3R5bGUgY2FsbGJhY2ssIHRoaXMgRnVuY3Rpb25SdW5uZXIgd2lsbAorICAgKiBleGVjdXRlIHRoZSBnaXZlbiBjYWxsYmFjay4gIE5vdGUgdGhhdCB0aGUgJ3ZvaWQqJyByZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4KKyAgICovCisgIEZ1bmN0aW9uUnVubmVyKFB0aHJlYWRGdW5jUHRyIGZ1bmMsIHZvaWQqIGFyZykKKyAgICA6IGZ1bmNfKHN0ZDo6YmluZChwdGhyZWFkX2Z1bmNfd3JhcHBlciwgZnVuYywgYXJnKSksIGludGVydmFsTXNfKC0xKSB7fQorCisgIC8qKgorICAgKiBHaXZlbiBhIGdlbmVyaWMgY2FsbGJhY2ssIHRoaXMgRnVuY3Rpb25SdW5uZXIgd2lsbCBleGVjdXRlIGl0LgorICAgKi8KKyAgRnVuY3Rpb25SdW5uZXIoY29uc3QgVm9pZEZ1bmMmIGNvYikgOiBmdW5jXyhjb2IpLCBpbnRlcnZhbE1zXygtMSkge30KKworICAvKioKKyAgICogR2l2ZW4gYSBib29sIGZvbyguLi4pIHR5cGUgY2FsbGJhY2ssIEZ1bmN0aW9uUnVubmVyIHdpbGwgZXhlY3V0ZQorICAgKiB0aGUgY2FsbGJhY2sgcmVwZWF0ZWRseSB3aXRoICdpbnRlcnZhbE1zJyBtaWxsaXNlY29uZHMgYmV0d2VlbiB0aGUgY2FsbHMsCisgICAqIHVudGlsIGl0IHJldHVybnMgZmFsc2UuIE5vdGUgdGhhdCB0aGUgYWN0dWFsIGludGVydmFsIGJldHdlZW4gY2FsbHMgd2lsbAorICAgKiBiZSBpbnRlcnZhbE1zIHBsdXMgZXhlY3V0aW9uIHRpbWUgb2YgdGhlIGNhbGxiYWNrLgorICAgKi8KKyAgRnVuY3Rpb25SdW5uZXIoY29uc3QgQm9vbEZ1bmMmIGNvYiwgaW50IGludGVydmFsTXMpIDogcmVwRnVuY18oY29iKSwgaW50ZXJ2YWxNc18oaW50ZXJ2YWxNcykge30KKworICB2b2lkIHJ1bigpIHsKKyAgICBpZiAocmVwRnVuY18pIHsKKyAgICAgIHdoaWxlIChyZXBGdW5jXygpKSB7CisgICAgICAgIFRIUklGVF9TTEVFUF9VU0VDKGludGVydmFsTXNfICogMTAwMCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZ1bmNfKCk7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIFZvaWRGdW5jIGZ1bmNfOworICBCb29sRnVuYyByZXBGdW5jXzsKKyAgaW50IGludGVydmFsTXNfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfRlVOQ1RJT05fUlVOTkVSX0gKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTcwY2M2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuY3BwCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKwordXNpbmcgc3RkOjp1bmlxdWVfcHRyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCisvKioKKyAqIE1vbml0b3IgaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlIFBPU0lYIHB0aHJlYWQgbGlicmFyeQorICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIE1vbml0b3I6OkltcGwgeworCitwdWJsaWM6CisgIEltcGwoKSA6IG93bmVkTXV0ZXhfKG5ldyBNdXRleCgpKSwgbXV0ZXhfKE5VTEwpLCBjb25kSW5pdGlhbGl6ZWRfKGZhbHNlKSB7CisgICAgaW5pdChvd25lZE11dGV4Xy5nZXQoKSk7CisgIH0KKworICBJbXBsKE11dGV4KiBtdXRleCkgOiBtdXRleF8oTlVMTCksIGNvbmRJbml0aWFsaXplZF8oZmFsc2UpIHsgaW5pdChtdXRleCk7IH0KKworICBJbXBsKE1vbml0b3IqIG1vbml0b3IpIDogbXV0ZXhfKE5VTEwpLCBjb25kSW5pdGlhbGl6ZWRfKGZhbHNlKSB7IGluaXQoJihtb25pdG9yLT5tdXRleCgpKSk7IH0KKworICB+SW1wbCgpIHsgY2xlYW51cCgpOyB9CisKKyAgTXV0ZXgmIG11dGV4KCkgeyByZXR1cm4gKm11dGV4XzsgfQorICB2b2lkIGxvY2soKSB7IG11dGV4KCkubG9jaygpOyB9CisgIHZvaWQgdW5sb2NrKCkgeyBtdXRleCgpLnVubG9jaygpOyB9CisKKyAgLyoqCisgICAqIEV4Y2VwdGlvbi10aHJvd2luZyB2ZXJzaW9uIG9mIHdhaXRGb3JUaW1lUmVsYXRpdmUoKSwgY2FsbGVkIHNpbXBseQorICAgKiB3YWl0KGludDY0KSBmb3IgaGlzdG9yaWNhbCByZWFzb25zLiAgVGltZW91dCBpcyBpbiBtaWxsaXNlY29uZHMuCisgICAqCisgICAqIElmIHRoZSBjb25kaXRpb24gb2NjdXJzLCAgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGNsZWFubHk7IG9uIHRpbWVvdXQgb3IKKyAgICogZXJyb3IgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICovCisgIHZvaWQgd2FpdChpbnQ2NF90IHRpbWVvdXRfbXMpIGNvbnN0IHsKKyAgICBpbnQgcmVzdWx0ID0gd2FpdEZvclRpbWVSZWxhdGl2ZSh0aW1lb3V0X21zKTsKKyAgICBpZiAocmVzdWx0ID09IFRIUklGVF9FVElNRURPVVQpIHsKKyAgICAgIC8vIHB0aHJlYWRfY29uZF90aW1lZHdhaXQgaGFzIGJlZW4gb2JzZXJ2ZWQgdG8gcmV0dXJuIGVhcmx5IG9uCisgICAgICAvLyB2YXJpb3VzIHBsYXRmb3Jtcywgc28gY29tbWVudCBvdXQgdGhpcyBhc3NlcnQuCisgICAgICAvLyBhc3NlcnQoVXRpbDo6Y3VycmVudFRpbWUoKSA+PSAobm93ICsgdGltZW91dCkpOworICAgICAgdGhyb3cgVGltZWRPdXRFeGNlcHRpb24oKTsKKyAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPSAwKSB7CisgICAgICB0aHJvdyBURXhjZXB0aW9uKCJwdGhyZWFkX2NvbmRfd2FpdCgpIG9yIHB0aHJlYWRfY29uZF90aW1lZHdhaXQoKSBmYWlsZWQiKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogV2FpdHMgdW50aWwgdGhlIHNwZWNpZmllZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIGNvbmRpdGlvbiB0bworICAgKiBvY2N1ciwgb3Igd2FpdHMgZm9yZXZlciBpZiB0aW1lb3V0X21zID09IDAuCisgICAqCisgICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBUSFJJRlRfRVRJTUVET1VUIG9uIHRpbWVvdXQsIG9yIGFuIGVycm9yIGNvZGUuCisgICAqLworICBpbnQgd2FpdEZvclRpbWVSZWxhdGl2ZShpbnQ2NF90IHRpbWVvdXRfbXMpIGNvbnN0IHsKKyAgICBpZiAodGltZW91dF9tcyA9PSAwTEwpIHsKKyAgICAgIHJldHVybiB3YWl0Rm9yZXZlcigpOworICAgIH0KKworICAgIHN0cnVjdCBUSFJJRlRfVElNRVNQRUMgYWJzdGltZTsKKyAgICBVdGlsOjp0b1RpbWVzcGVjKGFic3RpbWUsIFV0aWw6OmN1cnJlbnRUaW1lKCkgKyB0aW1lb3V0X21zKTsKKyAgICByZXR1cm4gd2FpdEZvclRpbWUoJmFic3RpbWUpOworICB9CisKKyAgLyoqCisgICAqIFdhaXRzIHVudGlsIHRoZSBhYnNvbHV0ZSB0aW1lIHNwZWNpZmllZCB1c2luZyBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDLgorICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3VycywgVEhSSUZUX0VUSU1FRE9VVCBvbiB0aW1lb3V0LCBvciBhbiBlcnJvciBjb2RlLgorICAgKi8KKyAgaW50IHdhaXRGb3JUaW1lKGNvbnN0IFRIUklGVF9USU1FU1BFQyogYWJzdGltZSkgY29uc3QgeworICAgIGFzc2VydChtdXRleF8pOworICAgIHB0aHJlYWRfbXV0ZXhfdCogbXV0ZXhJbXBsID0gcmVpbnRlcnByZXRfY2FzdDxwdGhyZWFkX211dGV4X3QqPihtdXRleF8tPmdldFVuZGVybHlpbmdJbXBsKCkpOworICAgIGFzc2VydChtdXRleEltcGwpOworCisgICAgLy8gWFhYIE5lZWQgdG8gYXNzZXJ0IHRoYXQgY2FsbGVyIG93bnMgbXV0ZXgKKyAgICByZXR1cm4gcHRocmVhZF9jb25kX3RpbWVkd2FpdCgmcHRocmVhZF9jb25kXywgbXV0ZXhJbXBsLCBhYnN0aW1lKTsKKyAgfQorCisgIGludCB3YWl0Rm9yVGltZShjb25zdCBzdHJ1Y3QgdGltZXZhbCogYWJzdGltZSkgY29uc3QgeworICAgIHN0cnVjdCBUSFJJRlRfVElNRVNQRUMgdGVtcDsKKyAgICB0ZW1wLnR2X3NlYyA9IGFic3RpbWUtPnR2X3NlYzsKKyAgICB0ZW1wLnR2X25zZWMgPSBhYnN0aW1lLT50dl91c2VjICogMTAwMDsKKyAgICByZXR1cm4gd2FpdEZvclRpbWUoJnRlbXApOworICB9CisgIC8qKgorICAgKiBXYWl0cyBmb3JldmVyIHVudGlsIHRoZSBjb25kaXRpb24gb2NjdXJzLgorICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3Vycywgb3IgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAqLworICBpbnQgd2FpdEZvcmV2ZXIoKSBjb25zdCB7CisgICAgYXNzZXJ0KG11dGV4Xyk7CisgICAgcHRocmVhZF9tdXRleF90KiBtdXRleEltcGwgPSByZWludGVycHJldF9jYXN0PHB0aHJlYWRfbXV0ZXhfdCo+KG11dGV4Xy0+Z2V0VW5kZXJseWluZ0ltcGwoKSk7CisgICAgYXNzZXJ0KG11dGV4SW1wbCk7CisgICAgcmV0dXJuIHB0aHJlYWRfY29uZF93YWl0KCZwdGhyZWFkX2NvbmRfLCBtdXRleEltcGwpOworICB9CisKKyAgdm9pZCBub3RpZnkoKSB7CisgICAgLy8gWFhYIE5lZWQgdG8gYXNzZXJ0IHRoYXQgY2FsbGVyIG93bnMgbXV0ZXgKKyAgICBpbnQgaXJldCA9IHB0aHJlYWRfY29uZF9zaWduYWwoJnB0aHJlYWRfY29uZF8pOworICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoaXJldCk7CisgICAgYXNzZXJ0KGlyZXQgPT0gMCk7CisgIH0KKworICB2b2lkIG5vdGlmeUFsbCgpIHsKKyAgICAvLyBYWFggTmVlZCB0byBhc3NlcnQgdGhhdCBjYWxsZXIgb3ducyBtdXRleAorICAgIGludCBpcmV0ID0gcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmcHRocmVhZF9jb25kXyk7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShpcmV0KTsKKyAgICBhc3NlcnQoaXJldCA9PSAwKTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIGluaXQoTXV0ZXgqIG11dGV4KSB7CisgICAgbXV0ZXhfID0gbXV0ZXg7CisKKyAgICBpZiAocHRocmVhZF9jb25kX2luaXQoJnB0aHJlYWRfY29uZF8sIE5VTEwpID09IDApIHsKKyAgICAgIGNvbmRJbml0aWFsaXplZF8gPSB0cnVlOworICAgIH0KKworICAgIGlmICghY29uZEluaXRpYWxpemVkXykgeworICAgICAgY2xlYW51cCgpOworICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oKTsKKyAgICB9CisgIH0KKworICB2b2lkIGNsZWFudXAoKSB7CisgICAgaWYgKGNvbmRJbml0aWFsaXplZF8pIHsKKyAgICAgIGNvbmRJbml0aWFsaXplZF8gPSBmYWxzZTsKKyAgICAgIGludCBpcmV0ID0gcHRocmVhZF9jb25kX2Rlc3Ryb3koJnB0aHJlYWRfY29uZF8pOworICAgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShpcmV0KTsKKyAgICAgIGFzc2VydChpcmV0ID09IDApOworICAgIH0KKyAgfQorCisgIHVuaXF1ZV9wdHI8TXV0ZXg+IG93bmVkTXV0ZXhfOworICBNdXRleCogbXV0ZXhfOworCisgIG11dGFibGUgcHRocmVhZF9jb25kX3QgcHRocmVhZF9jb25kXzsKKyAgbXV0YWJsZSBib29sIGNvbmRJbml0aWFsaXplZF87Cit9OworCitNb25pdG9yOjpNb25pdG9yKCkgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbCgpKSB7Cit9CitNb25pdG9yOjpNb25pdG9yKE11dGV4KiBtdXRleCkgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbChtdXRleCkpIHsKK30KK01vbml0b3I6Ok1vbml0b3IoTW9uaXRvciogbW9uaXRvcikgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbChtb25pdG9yKSkgeworfQorCitNb25pdG9yOjp+TW9uaXRvcigpIHsKKyAgZGVsZXRlIGltcGxfOworfQorCitNdXRleCYgTW9uaXRvcjo6bXV0ZXgoKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+bXV0ZXgoKTsKK30KKwordm9pZCBNb25pdG9yOjpsb2NrKCkgY29uc3QgeworICBpbXBsXy0+bG9jaygpOworfQorCit2b2lkIE1vbml0b3I6OnVubG9jaygpIGNvbnN0IHsKKyAgaW1wbF8tPnVubG9jaygpOworfQorCit2b2lkIE1vbml0b3I6OndhaXQoaW50NjRfdCB0aW1lb3V0KSBjb25zdCB7CisgIGltcGxfLT53YWl0KHRpbWVvdXQpOworfQorCitpbnQgTW9uaXRvcjo6d2FpdEZvclRpbWUoY29uc3QgVEhSSUZUX1RJTUVTUEVDKiBhYnN0aW1lKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+d2FpdEZvclRpbWUoYWJzdGltZSk7Cit9CisKK2ludCBNb25pdG9yOjp3YWl0Rm9yVGltZShjb25zdCB0aW1ldmFsKiBhYnN0aW1lKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+d2FpdEZvclRpbWUoYWJzdGltZSk7Cit9CisKK2ludCBNb25pdG9yOjp3YWl0Rm9yVGltZVJlbGF0aXZlKGludDY0X3QgdGltZW91dF9tcykgY29uc3QgeworICByZXR1cm4gaW1wbF8tPndhaXRGb3JUaW1lUmVsYXRpdmUodGltZW91dF9tcyk7Cit9CisKK2ludCBNb25pdG9yOjp3YWl0Rm9yZXZlcigpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT53YWl0Rm9yZXZlcigpOworfQorCit2b2lkIE1vbml0b3I6Om5vdGlmeSgpIGNvbnN0IHsKKyAgaW1wbF8tPm5vdGlmeSgpOworfQorCit2b2lkIE1vbml0b3I6Om5vdGlmeUFsbCgpIGNvbnN0IHsKKyAgaW1wbF8tPm5vdGlmeUFsbCgpOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOTlhOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9NT05JVE9SX0hfCisjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfTU9OSVRPUl9IXyAxCisKKyNpZmRlZiBIQVZFX1NZU19USU1FX0gKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CisKKyNpbmNsdWRlIDxib29zdC91dGlsaXR5LmhwcD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKy8qKgorICogQSBtb25pdG9yIGlzIGEgY29tYmluYXRpb24gbXV0ZXggYW5kIGNvbmRpdGlvbi1ldmVudC4gIFdhaXRpbmcgYW5kCisgKiBub3RpZnlpbmcgY29uZGl0aW9uIGV2ZW50cyByZXF1aXJlcyB0aGF0IHRoZSBjYWxsZXIgb3duIHRoZSBtdXRleC4gIE11dGV4CisgKiBsb2NrIGFuZCB1bmxvY2sgb3BlcmF0aW9ucyBjYW4gYmUgcGVyZm9ybWVkIGluZGVwZW5kZW50bHkgb2YgY29uZGl0aW9uCisgKiBldmVudHMuICBUaGlzIGlzIG1vcmUgb3IgbGVzcyBhbmFsb2dvdXMgdG8gamF2YS5sYW5nLk9iamVjdCBtdWx0aS10aHJlYWQKKyAqIG9wZXJhdGlvbnMuCisgKgorICogTm90ZSB0aGUgTW9uaXRvciBjYW4gY3JlYXRlIGEgbmV3LCBpbnRlcm5hbCBtdXRleDsgYWx0ZXJuYXRpdmVseSwgYQorICogc2VwYXJhdGUgTXV0ZXggY2FuIGJlIHBhc3NlZCBpbiBhbmQgdGhlIE1vbml0b3Igd2lsbCByZS11c2UgaXQgd2l0aG91dAorICogdGFraW5nIG93bmVyc2hpcC4gIEl0J3MgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhhdCB0aGUKKyAqIE11dGV4IGlzIG5vdCBkZWFsbG9jYXRlZCBiZWZvcmUgdGhlIE1vbml0b3IuCisgKgorICogTm90ZSB0aGF0IGFsbCBtZXRob2RzIGFyZSBjb25zdC4gIE1vbml0b3JzIGltcGxlbWVudCBsb2dpY2FsIGNvbnN0bmVzcywgbm90CisgKiBiaXQgY29uc3RuZXNzLiAgVGhpcyBhbGxvd3MgY29uc3QgbWV0aG9kcyB0byBjYWxsIG1vbml0b3IgbWV0aG9kcyB3aXRob3V0CisgKiBuZWVkaW5nIHRvIGNhc3QgYXdheSBjb25zdG5lc3Mgb3IgY2hhbmdlIHRvIG5vbi1jb25zdCBzaWduYXR1cmVzLgorICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIE1vbml0b3IgOiBib29zdDo6bm9uY29weWFibGUgeworcHVibGljOgorICAvKiogQ3JlYXRlcyBhIG5ldyBtdXRleCwgYW5kIHRha2VzIG93bmVyc2hpcCBvZiBpdC4gKi8KKyAgTW9uaXRvcigpOworCisgIC8qKiBVc2VzIHRoZSBwcm92aWRlZCBtdXRleCB3aXRob3V0IHRha2luZyBvd25lcnNoaXAuICovCisgIGV4cGxpY2l0IE1vbml0b3IoTXV0ZXgqIG11dGV4KTsKKworICAvKiogVXNlcyB0aGUgbXV0ZXggaW5zaWRlIHRoZSBwcm92aWRlZCBNb25pdG9yIHdpdGhvdXQgdGFraW5nIG93bmVyc2hpcC4gKi8KKyAgZXhwbGljaXQgTW9uaXRvcihNb25pdG9yKiBtb25pdG9yKTsKKworICAvKiogRGVhbGxvY2F0ZXMgdGhlIG11dGV4IG9ubHkgaWYgd2Ugb3duIGl0LiAqLworICB2aXJ0dWFsIH5Nb25pdG9yKCk7CisKKyAgTXV0ZXgmIG11dGV4KCkgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIGxvY2soKSBjb25zdDsKKworICB2aXJ0dWFsIHZvaWQgdW5sb2NrKCkgY29uc3Q7CisKKyAgLyoqCisgICAqIFdhaXRzIGEgbWF4aW11bSBvZiB0aGUgc3BlY2lmaWVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgY29uZGl0aW9uCisgICAqIHRvIG9jY3VyLCBvciB3YWl0cyBmb3JldmVyIGlmIHRpbWVvdXRfbXMgPT0gMC4KKyAgICoKKyAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIFRIUklGVF9FVElNRURPVVQgb24gdGltZW91dCwgb3IgYW4gZXJyb3IgY29kZS4KKyAgICovCisgIGludCB3YWl0Rm9yVGltZVJlbGF0aXZlKGludDY0X3QgdGltZW91dF9tcykgY29uc3Q7CisKKyAgLyoqCisgICAqIFdhaXRzIHVudGlsIHRoZSBhYnNvbHV0ZSB0aW1lIHNwZWNpZmllZCB1c2luZyBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDLgorICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3VycywgVEhSSUZUX0VUSU1FRE9VVCBvbiB0aW1lb3V0LCBvciBhbiBlcnJvciBjb2RlLgorICAgKi8KKyAgaW50IHdhaXRGb3JUaW1lKGNvbnN0IFRIUklGVF9USU1FU1BFQyogYWJzdGltZSkgY29uc3Q7CisKKyAgLyoqCisgICAqIFdhaXRzIHVudGlsIHRoZSBhYnNvbHV0ZSB0aW1lIHNwZWNpZmllZCB1c2luZyBzdHJ1Y3QgdGltZXZhbC4KKyAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIFRIUklGVF9FVElNRURPVVQgb24gdGltZW91dCwgb3IgYW4gZXJyb3IgY29kZS4KKyAgICovCisgIGludCB3YWl0Rm9yVGltZShjb25zdCBzdHJ1Y3QgdGltZXZhbCogYWJzdGltZSkgY29uc3Q7CisKKyAgLyoqCisgICAqIFdhaXRzIGZvcmV2ZXIgdW50aWwgdGhlIGNvbmRpdGlvbiBvY2N1cnMuCisgICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBvciBhbiBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICovCisgIGludCB3YWl0Rm9yZXZlcigpIGNvbnN0OworCisgIC8qKgorICAgKiBFeGNlcHRpb24tdGhyb3dpbmcgdmVyc2lvbiBvZiB3YWl0Rm9yVGltZVJlbGF0aXZlKCksIGNhbGxlZCBzaW1wbHkKKyAgICogd2FpdChpbnQ2NCkgZm9yIGhpc3RvcmljYWwgcmVhc29ucy4gIFRpbWVvdXQgaXMgaW4gbWlsbGlzZWNvbmRzLgorICAgKgorICAgKiBJZiB0aGUgY29uZGl0aW9uIG9jY3VycywgIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBjbGVhbmx5OyBvbiB0aW1lb3V0IG9yCisgICAqIGVycm9yIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqLworICB2b2lkIHdhaXQoaW50NjRfdCB0aW1lb3V0X21zID0gMExMKSBjb25zdDsKKworICAvKiogV2FrZXMgdXAgb25lIHRocmVhZCB3YWl0aW5nIG9uIHRoaXMgbW9uaXRvci4gKi8KKyAgdmlydHVhbCB2b2lkIG5vdGlmeSgpIGNvbnN0OworCisgIC8qKiBXYWtlcyB1cCBhbGwgd2FpdGluZyB0aHJlYWRzIG9uIHRoaXMgbW9uaXRvci4gKi8KKyAgdmlydHVhbCB2b2lkIG5vdGlmeUFsbCgpIGNvbnN0OworCitwcml2YXRlOgorICBjbGFzcyBJbXBsOworCisgIEltcGwqIGltcGxfOworfTsKKworY2xhc3MgU3luY2hyb25pemVkIHsKK3B1YmxpYzoKKyAgU3luY2hyb25pemVkKGNvbnN0IE1vbml0b3IqIG1vbml0b3IpIDogZyhtb25pdG9yLT5tdXRleCgpKSB7fQorICBTeW5jaHJvbml6ZWQoY29uc3QgTW9uaXRvciYgbW9uaXRvcikgOiBnKG1vbml0b3IubXV0ZXgoKSkge30KKworcHJpdmF0ZToKKyAgR3VhcmQgZzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX01PTklUT1JfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MjY0NjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguY3BwCkBAIC0wLDAgKzEsMzgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIG5lZWRlZCB0byB0ZXN0IGZvciBwdGhyZWFkIGltcGxlbWVudGF0aW9uIGNhcGFiaWxpdGllczoKKyNkZWZpbmUgX19VU0VfR05VCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Ym9vc3QvZm9ybWF0LmhwcD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKy8vIEVuYWJsZSB0aGlzIHRvIHR1cm4gb24gbXV0ZXggY29udGVudGlvbiBwcm9maWxpbmcgc3VwcG9ydAorLy8gI2RlZmluZSBUSFJJRlRfUFRIUkVBRF9NVVRFWF9DT05URU5USU9OX1BST0ZJTElORworCisjaWZkZWYgVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKKworc3RhdGljIGludDMyX3QgbXV0ZXhQcm9maWxpbmdDb3VudGVyID0gMDsKK3N0YXRpYyBpbnQzMl90IG11dGV4UHJvZmlsaW5nU2FtcGxlUmF0ZSA9IDA7CitzdGF0aWMgTXV0ZXhXYWl0Q2FsbGJhY2sgbXV0ZXhQcm9maWxpbmdDYWxsYmFjayA9IDA7CisKK3ZvaWQgZW5hYmxlTXV0ZXhQcm9maWxpbmcoaW50MzJfdCBwcm9maWxpbmdTYW1wbGVSYXRlLCBNdXRleFdhaXRDYWxsYmFjayBjYWxsYmFjaykgeworICBtdXRleFByb2ZpbGluZ1NhbXBsZVJhdGUgPSBwcm9maWxpbmdTYW1wbGVSYXRlOworICBtdXRleFByb2ZpbGluZ0NhbGxiYWNrID0gY2FsbGJhY2s7Cit9CisKKyNkZWZpbmUgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCkgaW50NjRfdCBfbG9ja19zdGFydFRpbWUgPSBtYXliZUdldFByb2ZpbGluZ1N0YXJ0VGltZSgpOworCisjZGVmaW5lIFBST0ZJTEVfTVVURVhfTk9UX0xPQ0tFRCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9sb2NrX3N0YXJ0VGltZSA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQ2NF90IGVuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZVVzZWMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoKm11dGV4UHJvZmlsaW5nQ2FsbGJhY2spKHRoaXMsIGVuZFRpbWUgLSBfbG9ja19zdGFydFRpbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgUFJPRklMRV9NVVRFWF9MT0NLRUQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwcm9maWxlVGltZV8gPSBfbG9ja19zdGFydFRpbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAocHJvZmlsZVRpbWVfID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHByb2ZpbGVUaW1lXyA9IFV0aWw6OmN1cnJlbnRUaW1lVXNlYygpIC0gcHJvZmlsZVRpbWVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBQUk9GSUxFX01VVEVYX1NUQVJUX1VOTE9DSygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQ2NF90IF90ZW1wX3Byb2ZpbGVUaW1lID0gcHJvZmlsZVRpbWVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwcm9maWxlVGltZV8gPSAwOworCisjZGVmaW5lIFBST0ZJTEVfTVVURVhfVU5MT0NLRUQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF90ZW1wX3Byb2ZpbGVUaW1lID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoKm11dGV4UHJvZmlsaW5nQ2FsbGJhY2spKHRoaXMsIF90ZW1wX3Byb2ZpbGVUaW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50NjRfdCBtYXliZUdldFByb2ZpbGluZ1N0YXJ0VGltZSgpIHsKKyAgaWYgKG11dGV4UHJvZmlsaW5nU2FtcGxlUmF0ZSAmJiBtdXRleFByb2ZpbGluZ0NhbGxiYWNrKSB7CisgICAgLy8gVGhpcyBibG9jayBpcyB1bnN5bmNocm9uaXplZCwgYnV0IHNob3VsZCBwcm9kdWNlIGEgcmVhc29uYWJsZSBzYW1wbGluZworICAgIC8vIHJhdGUgb24gbW9zdCBhcmNoaXRlY3R1cmVzLiAgVGhlIG1haW4gcmFjZSBjb25kaXRpb25zIGFyZSB0aGUgZ2FwCisgICAgLy8gYmV0d2VlbiB0aGUgZGVjcmVtZW50IGFuZCB0aGUgdGVzdCwgdGhlIG5vbi1hdG9taWNpdHkgb2YgZGVjcmVtZW50LCBhbmQKKyAgICAvLyBwb3RlbnRpYWwgY2FjaGluZyBvZiBkaWZmZXJlbnQgdmFsdWVzIGF0IGRpZmZlcmVudCBDUFVzLgorICAgIC8vCisgICAgLy8gLSBpZiB0d28gZGVjcmVtZW50cyByYWNlLCB0aGUgbGlrZWxpZXN0IHJlc3VsdCBpcyB0aGF0IHRoZSBjb3VudGVyCisgICAgLy8gICAgICBkZWNyZW1lbnRzIHNsb3dseSAocGVyaGFwcyBtdWNoIG1vcmUgc2xvd2x5KSB0aGFuIGludGVuZGVkLgorICAgIC8vCisgICAgLy8gLSBtYW55IHRocmVhZHMgY291bGQgcG90ZW50aWFsbHkgZGVjcmVtZW50IGJlZm9yZSByZXNldHRpbmcgdGhlIGNvdW50ZXIKKyAgICAvLyAgICAgIHRvIGl0cyBsYXJnZSB2YWx1ZSwgY2F1c2luZyBlYWNoIGFkZGl0aW9uYWwgaW5jb21pbmcgdGhyZWFkIHRvCisgICAgLy8gICAgICBwcm9maWxlIGV2ZXJ5IGNhbGwuICBUaGlzIHNpdHVhdGlvbiBpcyB1bmxpa2VseSB0byBwZXJzaXN0IGZvciBsb25nCisgICAgLy8gICAgICBhcyB0aGUgY3JpdGljYWwgZ2FwIGlzIHF1aXRlIHNob3J0LCBidXQgcHJvZmlsaW5nIGNvdWxkIGJlIGJ1cnN0eS4KKyAgICBzaWdfYXRvbWljX3QgbG9jYWxWYWx1ZSA9IC0tbXV0ZXhQcm9maWxpbmdDb3VudGVyOworICAgIGlmIChsb2NhbFZhbHVlIDw9IDApIHsKKyAgICAgIG11dGV4UHJvZmlsaW5nQ291bnRlciA9IG11dGV4UHJvZmlsaW5nU2FtcGxlUmF0ZTsKKyAgICAgIHJldHVybiBVdGlsOjpjdXJyZW50VGltZVVzZWMoKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KKworI2Vsc2UKKyNkZWZpbmUgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCkKKyNkZWZpbmUgUFJPRklMRV9NVVRFWF9OT1RfTE9DS0VEKCkKKyNkZWZpbmUgUFJPRklMRV9NVVRFWF9MT0NLRUQoKQorI2RlZmluZSBQUk9GSUxFX01VVEVYX1NUQVJUX1VOTE9DSygpCisjZGVmaW5lIFBST0ZJTEVfTVVURVhfVU5MT0NLRUQoKQorI2VuZGlmIC8vIFRIUklGVF9QVEhSRUFEX01VVEVYX0NPTlRFTlRJT05fUFJPRklMSU5HCisKKyNkZWZpbmUgRUlOVFJfTE9PUChfQ0FMTCkgICAgICAgICAgaW50IHJldDsgZG8geyByZXQgPSBfQ0FMTDsgfSB3aGlsZSAocmV0ID09IEVJTlRSKQorI2RlZmluZSBBQk9SVF9PTkZBSUwoX0NBTEwpICAgICAgeyBFSU5UUl9MT09QKF9DQUxMKTsgaWYgKHJldCkgeyBhYm9ydCgpOyB9IH0KKyNkZWZpbmUgVEhST1dfU1JFKF9DQUxMU1RSLCBSRVQpIHsgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oYm9vc3Q6OnN0cihib29zdDo6Zm9ybWF0KCIlMSUgcmV0dXJuZWQgJTIlICglMyUpIikgJSBfQ0FMTFNUUiAlIFJFVCAlIDo6c3RyZXJyb3IoUkVUKSkpOyB9CisjZGVmaW5lIFRIUk9XX1NSRV9PTkZBSUwoX0NBTEwpICB7IEVJTlRSX0xPT1AoX0NBTEwpOyBpZiAocmV0KSB7IFRIUk9XX1NSRSgjX0NBTEwsIHJldCk7IH0gfQorI2RlZmluZSBUSFJPV19TUkVfVFJZRkFJTChfQ0FMTCkgeyBFSU5UUl9MT09QKF9DQUxMKTsgaWYgKHJldCA9PSAwKSB7IHJldHVybiB0cnVlOyB9IGVsc2UgaWYgKHJldCA9PSBFQlVTWSkgeyByZXR1cm4gZmFsc2U7IH0gVEhST1dfU1JFKCNfQ0FMTCwgcmV0KTsgfQorCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIE11dGV4IGNsYXNzIHVzaW5nIFBPU0lYIG11dGV4CisgKgorICogVGhyb3dzIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3lzdGVtUmVzb3VyY2VFeGNlcHRpb24gb24gZXJyb3IuCisgKgorICogQHZlcnNpb24gJElkOiQKKyAqLworY2xhc3MgTXV0ZXg6OmltcGwgeworcHVibGljOgorICBpbXBsKEluaXRpYWxpemVyIGluaXQpIDogaW5pdGlhbGl6ZWRfKGZhbHNlKSB7CisjaWZkZWYgVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKKyAgICBwcm9maWxlVGltZV8gPSAwOworI2VuZGlmCisgICAgaW5pdCgmcHRocmVhZF9tdXRleF8pOworICAgIGluaXRpYWxpemVkXyA9IHRydWU7CisgIH0KKworICB+aW1wbCgpIHsKKyAgICBpZiAoaW5pdGlhbGl6ZWRfKSB7CisgICAgICBpbml0aWFsaXplZF8gPSBmYWxzZTsKKyAgICAgIEFCT1JUX09ORkFJTChwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnB0aHJlYWRfbXV0ZXhfKSk7CisgICAgfQorICB9CisKKyAgdm9pZCBsb2NrKCkgY29uc3QgeworICAgIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpOworICAgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9tdXRleF9sb2NrKCZwdGhyZWFkX211dGV4XykpOworICAgIFBST0ZJTEVfTVVURVhfTE9DS0VEKCk7CisgIH0KKworICBib29sIHRyeWxvY2soKSBjb25zdCB7CisgICAgVEhST1dfU1JFX1RSWUZBSUwocHRocmVhZF9tdXRleF90cnlsb2NrKCZwdGhyZWFkX211dGV4XykpOworICB9CisKKyAgYm9vbCB0aW1lZGxvY2soaW50NjRfdCBtaWxsaXNlY29uZHMpIGNvbnN0IHsKKyNpZiBkZWZpbmVkKF9QT1NJWF9USU1FT1VUUykgJiYgX1BPU0lYX1RJTUVPVVRTID49IDIwMDExMkwKKyAgICBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKTsKKworICAgIHN0cnVjdCBUSFJJRlRfVElNRVNQRUMgdHM7CisgICAgVXRpbDo6dG9UaW1lc3BlYyh0cywgbWlsbGlzZWNvbmRzICsgVXRpbDo6Y3VycmVudFRpbWUoKSk7CisgICAgRUlOVFJfTE9PUChwdGhyZWFkX211dGV4X3RpbWVkbG9jaygmcHRocmVhZF9tdXRleF8sICZ0cykpOworICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgUFJPRklMRV9NVVRFWF9MT0NLRUQoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocmV0ID09IEVUSU1FRE9VVCkgeworICAgICAgUFJPRklMRV9NVVRFWF9OT1RfTE9DS0VEKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVEhST1dfU1JFKCJwdGhyZWFkX211dGV4X3RpbWVkbG9jaygmcHRocmVhZF9tdXRleF8sICZ0cykiLCByZXQpOworI2Vsc2UKKyAgICAvKiBPdGhlcndpc2UgZm9sbG93IHNvbHV0aW9uIHVzZWQgYnkgTW9ubyBmb3IgQW5kcm9pZCAqLworICAgIHN0cnVjdCBUSFJJRlRfVElNRVNQRUMgc2xlZXB5dGltZSwgbm93LCB0bzsKKworICAgIC8qIFRoaXMgaXMganVzdCB0byBhdm9pZCBhIGNvbXBsZXRlbHkgYnVzeSB3YWl0ICovCisgICAgc2xlZXB5dGltZS50dl9zZWMgPSAwOworICAgIHNsZWVweXRpbWUudHZfbnNlYyA9IDEwMDAwMDAwTDsgLyogMTBtcyAqLworCisgICAgVXRpbDo6dG9UaW1lc3BlYyh0bywgbWlsbGlzZWNvbmRzICsgVXRpbDo6Y3VycmVudFRpbWUoKSk7CisKKyAgICB3aGlsZSAoKHRyeWxvY2soKSkgPT0gZmFsc2UpIHsKKyAgICAgIFV0aWw6OnRvVGltZXNwZWMobm93LCBVdGlsOjpjdXJyZW50VGltZSgpKTsKKyAgICAgIGlmIChub3cudHZfc2VjID49IHRvLnR2X3NlYyAmJiBub3cudHZfbnNlYyA+PSB0by50dl9uc2VjKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIG5hbm9zbGVlcCgmc2xlZXB5dGltZSwgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisjZW5kaWYKKyAgfQorCisgIHZvaWQgdW5sb2NrKCkgY29uc3QgeworICAgIFBST0ZJTEVfTVVURVhfU1RBUlRfVU5MT0NLKCk7CisgICAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX211dGV4X3VubG9jaygmcHRocmVhZF9tdXRleF8pKTsKKyAgICBQUk9GSUxFX01VVEVYX1VOTE9DS0VEKCk7CisgIH0KKworICB2b2lkKiBnZXRVbmRlcmx5aW5nSW1wbCgpIGNvbnN0IHsgcmV0dXJuICh2b2lkKikmcHRocmVhZF9tdXRleF87IH0KKworcHJpdmF0ZToKKyAgbXV0YWJsZSBwdGhyZWFkX211dGV4X3QgcHRocmVhZF9tdXRleF87CisgIG11dGFibGUgYm9vbCBpbml0aWFsaXplZF87CisjaWZkZWYgVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKKyAgbXV0YWJsZSBpbnQ2NF90IHByb2ZpbGVUaW1lXzsKKyNlbmRpZgorfTsKKworTXV0ZXg6Ok11dGV4KEluaXRpYWxpemVyIGluaXQpIDogaW1wbF8obmV3IE11dGV4OjppbXBsKGluaXQpKSB7Cit9CisKK3ZvaWQqIE11dGV4OjpnZXRVbmRlcmx5aW5nSW1wbCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT5nZXRVbmRlcmx5aW5nSW1wbCgpOworfQorCit2b2lkIE11dGV4Ojpsb2NrKCkgY29uc3QgeworICBpbXBsXy0+bG9jaygpOworfQorCitib29sIE11dGV4Ojp0cnlsb2NrKCkgY29uc3QgeworICByZXR1cm4gaW1wbF8tPnRyeWxvY2soKTsKK30KKworYm9vbCBNdXRleDo6dGltZWRsb2NrKGludDY0X3QgbXMpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT50aW1lZGxvY2sobXMpOworfQorCit2b2lkIE11dGV4Ojp1bmxvY2soKSBjb25zdCB7CisgIGltcGxfLT51bmxvY2soKTsKK30KKwordm9pZCBNdXRleDo6REVGQVVMVF9JTklUSUFMSVpFUih2b2lkKiBhcmcpIHsKKyAgcHRocmVhZF9tdXRleF90KiBwdGhyZWFkX211dGV4ID0gKHB0aHJlYWRfbXV0ZXhfdCopYXJnOworICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfbXV0ZXhfaW5pdChwdGhyZWFkX211dGV4LCBOVUxMKSk7Cit9CisKKyNpZiBkZWZpbmVkKFBUSFJFQURfQURBUFRJVkVfTVVURVhfSU5JVElBTElaRVJfTlApIHx8IGRlZmluZWQoUFRIUkVBRF9FUlJPUkNIRUNLX01VVEVYX0lOSVRJQUxJWkVSX05QKSB8fCBkZWZpbmVkKFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QKQorc3RhdGljIHZvaWQgaW5pdF93aXRoX2tpbmQocHRocmVhZF9tdXRleF90KiBtdXRleCwgaW50IGtpbmQpIHsKKyAgcHRocmVhZF9tdXRleGF0dHJfdCBtdXRleGF0dHI7CisgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9tdXRleGF0dHJfaW5pdCgmbXV0ZXhhdHRyKSk7CisgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSgmbXV0ZXhhdHRyLCBraW5kKSk7CisgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9tdXRleF9pbml0KG11dGV4LCAmbXV0ZXhhdHRyKSk7CisgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSgmbXV0ZXhhdHRyKSk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBUSFJFQURfQURBUFRJVkVfTVVURVhfSU5JVElBTElaRVJfTlAKK3ZvaWQgTXV0ZXg6OkFEQVBUSVZFX0lOSVRJQUxJWkVSKHZvaWQqIGFyZykgeworICAvLyBGcm9tIG15c3FsIHNvdXJjZTogbXlzeXMvbXlfdGhyX2luaXQuYworICAvLyBTZXQgbXV0ZXggdHlwZSB0byAiZmFzdCIgYS5rLmEgImFkYXB0aXZlIgorICAvLworICAvLyBJbiB0aGlzIGNhc2UgdGhlIHRocmVhZCBtYXkgc3RlYWwgdGhlIG11dGV4IGZyb20gc29tZSBvdGhlciB0aHJlYWQKKyAgLy8gdGhhdCBpcyB3YWl0aW5nIGZvciB0aGUgc2FtZSBtdXRleC4gVGhpcyB3aWxsIHNhdmUgdXMgc29tZQorICAvLyBjb250ZXh0IHN3aXRjaGVzIGJ1dCBtYXkgY2F1c2UgYSB0aHJlYWQgdG8gJ3N0YXJ2ZSBmb3JldmVyJyB3aGlsZQorICAvLyB3YWl0aW5nIGZvciB0aGUgbXV0ZXggKG5vdCBsaWtlbHkgaWYgdGhlIGNvZGUgd2l0aGluIHRoZSBtdXRleCBpcworICAvLyBzaG9ydCkuCisgIGluaXRfd2l0aF9raW5kKChwdGhyZWFkX211dGV4X3QqKWFyZywgUFRIUkVBRF9NVVRFWF9BREFQVElWRV9OUCk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBUSFJFQURfRVJST1JDSEVDS19NVVRFWF9JTklUSUFMSVpFUl9OUAordm9pZCBNdXRleDo6RVJST1JDSEVDS19JTklUSUFMSVpFUih2b2lkKiBhcmcpIHsKKyAgaW5pdF93aXRoX2tpbmQoKHB0aHJlYWRfbXV0ZXhfdCopYXJnLCBQVEhSRUFEX01VVEVYX0VSUk9SQ0hFQ0spOworfQorI2VuZGlmCisKKyNpZmRlZiBQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUAordm9pZCBNdXRleDo6UkVDVVJTSVZFX0lOSVRJQUxJWkVSKHZvaWQqIGFyZykgeworICBpbml0X3dpdGhfa2luZCgocHRocmVhZF9tdXRleF90KilhcmcsIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QKTsKK30KKyNlbmRpZgorCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIFJlYWRXcml0ZU11dGV4IGNsYXNzIHVzaW5nIFBPU0lYIHJ3IGxvY2sKKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBSZWFkV3JpdGVNdXRleDo6aW1wbCB7CitwdWJsaWM6CisgIGltcGwoKSA6IGluaXRpYWxpemVkXyhmYWxzZSkgeworI2lmZGVmIFRIUklGVF9QVEhSRUFEX01VVEVYX0NPTlRFTlRJT05fUFJPRklMSU5HCisgICAgcHJvZmlsZVRpbWVfID0gMDsKKyNlbmRpZgorICAgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9yd2xvY2tfaW5pdCgmcndfbG9ja18sIE5VTEwpKTsKKyAgICBpbml0aWFsaXplZF8gPSB0cnVlOworICB9CisKKyAgfmltcGwoKSB7CisgICAgaWYgKGluaXRpYWxpemVkXykgeworICAgICAgaW5pdGlhbGl6ZWRfID0gZmFsc2U7CisgICAgICBBQk9SVF9PTkZBSUwocHRocmVhZF9yd2xvY2tfZGVzdHJveSgmcndfbG9ja18pKTsKKyAgICB9CisgIH0KKworICB2b2lkIGFjcXVpcmVSZWFkKCkgY29uc3QgeworICAgIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpOworICAgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9yd2xvY2tfcmRsb2NrKCZyd19sb2NrXykpOworICAgIFBST0ZJTEVfTVVURVhfTk9UX0xPQ0tFRCgpOyAvLyBub3QgZXhjbHVzaXZlLCBzbyB1c2Ugbm90LWxvY2tlZCBwYXRoCisgIH0KKworICB2b2lkIGFjcXVpcmVXcml0ZSgpIGNvbnN0IHsKKyAgICBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKTsKKyAgICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfcndsb2NrX3dybG9jaygmcndfbG9ja18pKTsKKyAgICBQUk9GSUxFX01VVEVYX0xPQ0tFRCgpOworICB9CisKKyAgYm9vbCBhdHRlbXB0UmVhZCgpIGNvbnN0IHsgVEhST1dfU1JFX1RSWUZBSUwocHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrKCZyd19sb2NrXykpOyB9CisKKyAgYm9vbCBhdHRlbXB0V3JpdGUoKSBjb25zdCB7IFRIUk9XX1NSRV9UUllGQUlMKHB0aHJlYWRfcndsb2NrX3RyeXdybG9jaygmcndfbG9ja18pKTsgfQorCisgIHZvaWQgcmVsZWFzZSgpIGNvbnN0IHsKKyAgICBQUk9GSUxFX01VVEVYX1NUQVJUX1VOTE9DSygpOworICAgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9yd2xvY2tfdW5sb2NrKCZyd19sb2NrXykpOworICAgIFBST0ZJTEVfTVVURVhfVU5MT0NLRUQoKTsKKyAgfQorCitwcml2YXRlOgorICBtdXRhYmxlIHB0aHJlYWRfcndsb2NrX3QgcndfbG9ja187CisgIG11dGFibGUgYm9vbCBpbml0aWFsaXplZF87CisjaWZkZWYgVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKKyAgbXV0YWJsZSBpbnQ2NF90IHByb2ZpbGVUaW1lXzsKKyNlbmRpZgorfTsKKworUmVhZFdyaXRlTXV0ZXg6OlJlYWRXcml0ZU11dGV4KCkgOiBpbXBsXyhuZXcgUmVhZFdyaXRlTXV0ZXg6OmltcGwoKSkgeworfQorCit2b2lkIFJlYWRXcml0ZU11dGV4OjphY3F1aXJlUmVhZCgpIGNvbnN0IHsKKyAgaW1wbF8tPmFjcXVpcmVSZWFkKCk7Cit9CisKK3ZvaWQgUmVhZFdyaXRlTXV0ZXg6OmFjcXVpcmVXcml0ZSgpIGNvbnN0IHsKKyAgaW1wbF8tPmFjcXVpcmVXcml0ZSgpOworfQorCitib29sIFJlYWRXcml0ZU11dGV4OjphdHRlbXB0UmVhZCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT5hdHRlbXB0UmVhZCgpOworfQorCitib29sIFJlYWRXcml0ZU11dGV4OjphdHRlbXB0V3JpdGUoKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+YXR0ZW1wdFdyaXRlKCk7Cit9CisKK3ZvaWQgUmVhZFdyaXRlTXV0ZXg6OnJlbGVhc2UoKSBjb25zdCB7CisgIGltcGxfLT5yZWxlYXNlKCk7Cit9CisKK05vU3RhcnZlUmVhZFdyaXRlTXV0ZXg6Ok5vU3RhcnZlUmVhZFdyaXRlTXV0ZXgoKSA6IHdyaXRlcldhaXRpbmdfKGZhbHNlKSB7Cit9CisKK3ZvaWQgTm9TdGFydmVSZWFkV3JpdGVNdXRleDo6YWNxdWlyZVJlYWQoKSBjb25zdCB7CisgIGlmICh3cml0ZXJXYWl0aW5nXykgeworICAgIC8vIHdyaXRlciBpcyB3YWl0aW5nLCBibG9jayBvbiB0aGUgd3JpdGVyJ3MgbXV0ZXggdW50aWwgaGUncyBkb25lIHdpdGggaXQKKyAgICBtdXRleF8ubG9jaygpOworICAgIG11dGV4Xy51bmxvY2soKTsKKyAgfQorCisgIFJlYWRXcml0ZU11dGV4OjphY3F1aXJlUmVhZCgpOworfQorCit2b2lkIE5vU3RhcnZlUmVhZFdyaXRlTXV0ZXg6OmFjcXVpcmVXcml0ZSgpIGNvbnN0IHsKKyAgLy8gaWYgd2UgY2FuIGFjcXVpcmUgdGhlIHJ3bG9jayB0aGUgZWFzeSB3YXksIHdlJ3JlIGRvbmUKKyAgaWYgKGF0dGVtcHRXcml0ZSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gZmFpbGVkIHRvIGdldCB0aGUgcndsb2NrLCBkbyBpdCB0aGUgaGFyZCB3YXk6CisgIC8vIGxvY2tpbmcgdGhlIG11dGV4IGFuZCBzZXR0aW5nIHdyaXRlcldhaXRpbmcgd2lsbCBjYXVzZSBhbGwgbmV3IHJlYWRlcnMgdG8KKyAgLy8gYmxvY2sgb24gdGhlIG11dGV4IHJhdGhlciB0aGFuIG9uIHRoZSByd2xvY2suCisgIG11dGV4Xy5sb2NrKCk7CisgIHdyaXRlcldhaXRpbmdfID0gdHJ1ZTsKKyAgUmVhZFdyaXRlTXV0ZXg6OmFjcXVpcmVXcml0ZSgpOworICB3cml0ZXJXYWl0aW5nXyA9IGZhbHNlOworICBtdXRleF8udW5sb2NrKCk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWY1Mzk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmgKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX01VVEVYX0hfCisjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfTVVURVhfSF8gMQorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGJvb3N0L25vbmNvcHlhYmxlLmhwcD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKyNpZm5kZWYgVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCisKKy8qKgorICogRGV0ZXJtaW5lcyBpZiB0aGUgVGhyaWZ0IE11dGV4IGFuZCBSZWFkV3JpdGVNdXRleCBjbGFzc2VzIHdpbGwgYXR0ZW1wdCB0bworICogcHJvZmlsZSB0aGVpciBibG9ja2luZyBhY3F1aXJlIG1ldGhvZHMuIElmIHRoaXMgdmFsdWUgaXMgc2V0IHRvIG5vbi16ZXJvLAorICogVGhyaWZ0IHdpbGwgYXR0ZW1wdCB0byBpbnZva2UgdGhlIGNhbGxiYWNrIG9uY2UgZXZlcnkgcHJvZmlsaW5nU2FtcGxlUmF0ZQorICogdGltZXMuICBIb3dldmVyLCBhcyB0aGUgc2FtcGxpbmcgaXMgbm90IHN5bmNocm9uaXplZCB0aGUgcmF0ZSBpcyBub3QKKyAqIGd1cmFuYXRlZWQsIGFuZCBjb3VsZCBiZSBzdWJqZWN0IHRvIGJpZyBidXJzdHMgYW5kIHN3aW5ncy4gIFBsZWFzZSBlbnN1cmUKKyAqIHlvdXIgc2FtcGxpbmcgY2FsbGJhY2sgaXMgYXMgcGVyZm9ybWFudCBhcyB5b3VyIGFwcGxpY2F0aW9uIHJlcXVpcmVzLgorICoKKyAqIFRoZSBjYWxsYmFjayB3aWxsIGdldCBjYWxsZWQgd2l0aCB0aGUgd2FpdCB0aW1lIHRha2VuIHRvIGxvY2sgdGhlIG11dGV4IGluCisgKiB1c2VjIGFuZCBhICh2b2lkKikgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBNdXRleCAob3IgUmVhZFdyaXRlTXV0ZXgpCisgKiBiZWluZyBsb2NrZWQuCisgKgorICogVGhlIGVuYWJsZU11dGV4UHJvZmlsaW5nKCkgZnVuY3Rpb24gaXMgdW5zeW5jaHJvbml6ZWQ7IGNhbGxpbmcgdGhpcyBmdW5jdGlvbgorICogd2hpbGUgcHJvZmlsaW5nIGlzIGFscmVhZHkgZW5hYmxlZCBtYXkgcmVzdWx0IGluIHJhY2UgY29uZGl0aW9ucy4gIE9uCisgKiBhcmNoaXRlY3R1cmVzIHdoZXJlIGEgcG9pbnRlciBhc3NpZ25tZW50IGlzIGF0b21pYywgdGhpcyBpcyBzYWZlIGJ1dCB0aGVyZQorICogaXMgbm8gZ3VhcmFudGVlIHRocmVhZHMgd2lsbCBhZ3JlZSBvbiBhIHNpbmdsZSBjYWxsYmFjayB3aXRoaW4gYW55CisgKiBwYXJ0aWN1bGFyIHRpbWUgcGVyaW9kLgorICovCit0eXBlZGVmIHZvaWQgKCpNdXRleFdhaXRDYWxsYmFjaykoY29uc3Qgdm9pZCogaWQsIGludDY0X3Qgd2FpdFRpbWVNaWNyb3MpOwordm9pZCBlbmFibGVNdXRleFByb2ZpbGluZyhpbnQzMl90IHByb2ZpbGluZ1NhbXBsZVJhdGUsIE11dGV4V2FpdENhbGxiYWNrIGNhbGxiYWNrKTsKKworI2VuZGlmCisKKy8qKgorICogTk9URTogQWxsIG11dGV4IGltcGxlbWVudGF0aW9ucyB0aHJvdyBhbiBleGNlcHRpb24gb24gZmFpbHVyZS4gIFNlZSBlYWNoCisgKiAgICAgICBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiB0byB1bmRlcnN0YW5kIHRoZSBleGNlcHRpb24gdHlwZShzKSB1c2VkLgorICovCisKKy8qKgorICogQSBzaW1wbGUgbXV0ZXggY2xhc3MKKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBNdXRleCB7CitwdWJsaWM6CisgIHR5cGVkZWYgdm9pZCAoKkluaXRpYWxpemVyKSh2b2lkKik7CisKKyAgTXV0ZXgoSW5pdGlhbGl6ZXIgaW5pdCA9IERFRkFVTFRfSU5JVElBTElaRVIpOworICB2aXJ0dWFsIH5NdXRleCgpIHt9CisKKyAgdmlydHVhbCB2b2lkIGxvY2soKSBjb25zdDsKKyAgdmlydHVhbCBib29sIHRyeWxvY2soKSBjb25zdDsKKyAgdmlydHVhbCBib29sIHRpbWVkbG9jayhpbnQ2NF90IG1pbGxpc2Vjb25kcykgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCB1bmxvY2soKSBjb25zdDsKKworICB2b2lkKiBnZXRVbmRlcmx5aW5nSW1wbCgpIGNvbnN0OworCisgIC8vIElmIHlvdSBhdHRlbXB0IHRvIHVzZSBvbmUgb2YgdGhlc2UgYW5kIGl0IGZhaWxzIHRvIGxpbmssIGl0IG1lYW5zCisgIC8vIHlvdXIgdmVyc2lvbiBvZiBwdGhyZWFkcyBkb2VzIG5vdCBzdXBwb3J0IGl0IC0gdHJ5IGFub3RoZXIgb25lLgorICBzdGF0aWMgdm9pZCBBREFQVElWRV9JTklUSUFMSVpFUih2b2lkKik7CisgIHN0YXRpYyB2b2lkIERFRkFVTFRfSU5JVElBTElaRVIodm9pZCopOworICBzdGF0aWMgdm9pZCBFUlJPUkNIRUNLX0lOSVRJQUxJWkVSKHZvaWQqKTsKKyAgc3RhdGljIHZvaWQgUkVDVVJTSVZFX0lOSVRJQUxJWkVSKHZvaWQqKTsKKworcHJpdmF0ZToKKyAgY2xhc3MgaW1wbDsKKyAgc3RkOjpzaGFyZWRfcHRyPGltcGw+IGltcGxfOworfTsKKworY2xhc3MgUmVhZFdyaXRlTXV0ZXggeworcHVibGljOgorICBSZWFkV3JpdGVNdXRleCgpOworICB2aXJ0dWFsIH5SZWFkV3JpdGVNdXRleCgpIHt9CisKKyAgLy8gdGhlc2UgZ2V0IHRoZSBsb2NrIGFuZCBibG9jayB1bnRpbCBpdCBpcyBkb25lIHN1Y2Nlc3NmdWxseQorICB2aXJ0dWFsIHZvaWQgYWNxdWlyZVJlYWQoKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIGFjcXVpcmVXcml0ZSgpIGNvbnN0OworCisgIC8vIHRoZXNlIGF0dGVtcHQgdG8gZ2V0IHRoZSBsb2NrLCByZXR1cm5pbmcgZmFsc2UgaW1tZWRpYXRlbHkgaWYgdGhleSBmYWlsCisgIHZpcnR1YWwgYm9vbCBhdHRlbXB0UmVhZCgpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgYXR0ZW1wdFdyaXRlKCkgY29uc3Q7CisKKyAgLy8gdGhpcyByZWxlYXNlcyBib3RoIHJlYWQgYW5kIHdyaXRlIGxvY2tzCisgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIGNsYXNzIGltcGw7CisgIHN0ZDo6c2hhcmVkX3B0cjxpbXBsPiBpbXBsXzsKK307CisKKy8qKgorICogQSBSZWFkV3JpdGVNdXRleCB0aGF0IGd1YXJhbnRlZXMgd3JpdGVycyB3aWxsIG5vdCBiZSBzdGFydmVkIGJ5IHJlYWRlcnM6CisgKiBXaGVuIGEgd3JpdGVyIGF0dGVtcHRzIHRvIGFjcXVpcmUgdGhlIG11dGV4LCBhbGwgbmV3IHJlYWRlcnMgd2lsbCBiZQorICogYmxvY2tlZCBmcm9tIGFjcXVpcmluZyB0aGUgbXV0ZXggdW50aWwgdGhlIHdyaXRlciBoYXMgYWNxdWlyZWQgYW5kCisgKiByZWxlYXNlZCBpdC4gSW4gc29tZSBvcGVyYXRpbmcgc3lzdGVtcywgdGhpcyBtYXkgYWxyZWFkeSBiZSBndWFyYW50ZWVkCisgKiBieSBhIHJlZ3VsYXIgUmVhZFdyaXRlTXV0ZXguCisgKi8KK2NsYXNzIE5vU3RhcnZlUmVhZFdyaXRlTXV0ZXggOiBwdWJsaWMgUmVhZFdyaXRlTXV0ZXggeworcHVibGljOgorICBOb1N0YXJ2ZVJlYWRXcml0ZU11dGV4KCk7CisKKyAgdmlydHVhbCB2b2lkIGFjcXVpcmVSZWFkKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBhY3F1aXJlV3JpdGUoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgTXV0ZXggbXV0ZXhfOworICBtdXRhYmxlIHZvbGF0aWxlIGJvb2wgd3JpdGVyV2FpdGluZ187Cit9OworCitjbGFzcyBHdWFyZCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CitwdWJsaWM6CisgIEd1YXJkKGNvbnN0IE11dGV4JiB2YWx1ZSwgaW50NjRfdCB0aW1lb3V0ID0gMCkgOiBtdXRleF8oJnZhbHVlKSB7CisgICAgaWYgKHRpbWVvdXQgPT0gMCkgeworICAgICAgdmFsdWUubG9jaygpOworICAgIH0gZWxzZSBpZiAodGltZW91dCA8IDApIHsKKyAgICAgIGlmICghdmFsdWUudHJ5bG9jaygpKSB7CisgICAgICAgIG11dGV4XyA9IE5VTEw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghdmFsdWUudGltZWRsb2NrKHRpbWVvdXQpKSB7CisgICAgICAgIG11dGV4XyA9IE5VTEw7CisgICAgICB9CisgICAgfQorICB9CisgIH5HdWFyZCgpIHsKKyAgICBpZiAobXV0ZXhfKSB7CisgICAgICBtdXRleF8tPnVubG9jaygpOworICAgIH0KKyAgfQorCisgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAobXV0ZXhfICE9IE5VTEwpOyB9CisKK3ByaXZhdGU6CisgIGNvbnN0IE11dGV4KiBtdXRleF87Cit9OworCisvLyBDYW4gYmUgdXNlZCBhcyBzZWNvbmQgYXJndW1lbnQgdG8gUldHdWFyZCB0byBtYWtlIGNvZGUgbW9yZSByZWFkYWJsZQorLy8gYXMgdG8gd2hldGhlciB3ZSdyZSBkb2luZyBhY3F1aXJlUmVhZCgpIG9yIGFjcXVpcmVXcml0ZSgpLgorZW51bSBSV0d1YXJkVHlwZSB7IFJXX1JFQUQgPSAwLCBSV19XUklURSA9IDEgfTsKKworY2xhc3MgUldHdWFyZCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CitwdWJsaWM6CisgIFJXR3VhcmQoY29uc3QgUmVhZFdyaXRlTXV0ZXgmIHZhbHVlLCBib29sIHdyaXRlID0gZmFsc2UpIDogcndfbXV0ZXhfKHZhbHVlKSB7CisgICAgaWYgKHdyaXRlKSB7CisgICAgICByd19tdXRleF8uYWNxdWlyZVdyaXRlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJ3X211dGV4Xy5hY3F1aXJlUmVhZCgpOworICAgIH0KKyAgfQorCisgIFJXR3VhcmQoY29uc3QgUmVhZFdyaXRlTXV0ZXgmIHZhbHVlLCBSV0d1YXJkVHlwZSB0eXBlKSA6IHJ3X211dGV4Xyh2YWx1ZSkgeworICAgIGlmICh0eXBlID09IFJXX1dSSVRFKSB7CisgICAgICByd19tdXRleF8uYWNxdWlyZVdyaXRlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJ3X211dGV4Xy5hY3F1aXJlUmVhZCgpOworICAgIH0KKyAgfQorICB+UldHdWFyZCgpIHsgcndfbXV0ZXhfLnJlbGVhc2UoKTsgfQorCitwcml2YXRlOgorICBjb25zdCBSZWFkV3JpdGVNdXRleCYgcndfbXV0ZXhfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfTVVURVhfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWI0NDAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1BMQVRGT1JNVEhSRUFERkFDVE9SWV9IXworI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX1BMQVRGT1JNVEhSRUFERkFDVE9SWV9IXyAxCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorI2lmIFVTRV9TVERfVEhSRUFECisjICBpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5oPgorI2Vsc2UKKyMgIGluY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaD4KKyNlbmRpZgorLy8gY2xhbmctZm9ybWF0IG9uCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisjaWYgVVNFX1NURF9USFJFQUQKKyAgdHlwZWRlZiBTdGRUaHJlYWRGYWN0b3J5IFBsYXRmb3JtVGhyZWFkRmFjdG9yeTsKKyNlbHNlCisgIHR5cGVkZWYgUG9zaXhUaHJlYWRGYWN0b3J5IFBsYXRmb3JtVGhyZWFkRmFjdG9yeTsKKyNlbmRpZgorLy8gY2xhbmctZm9ybWF0IG9uCisKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfUExBVEZPUk1USFJFQURGQUNUT1JZX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNTkyNjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmNwcApAQCAtMCwwICsxLDMzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaD4KKworI2lmIEdPT0dMRV9QRVJGVE9PTFNfUkVHSVNURVJfVEhSRUFECisjaW5jbHVkZSA8Z29vZ2xlL3Byb2ZpbGVyLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworLyoqCisgKiBUaGUgUE9TSVggdGhyZWFkIGNsYXNzLgorICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIFB0aHJlYWRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKK3B1YmxpYzoKKyAgZW51bSBTVEFURSB7IHVuaW5pdGlhbGl6ZWQsIHN0YXJ0aW5nLCBzdGFydGVkLCBzdG9wcGluZywgc3RvcHBlZCB9OworCisgIHN0YXRpYyBjb25zdCBpbnQgTUIgPSAxMDI0ICogMTAyNDsKKworICBzdGF0aWMgdm9pZCogdGhyZWFkTWFpbih2b2lkKiBhcmcpOworCitwcml2YXRlOgorICBwdGhyZWFkX3QgcHRocmVhZF87CisgIE1vbml0b3IgbW9uaXRvcl87CQkvLyBndWFyZCB0byBwcm90ZWN0IHN0YXRlXyBhbmQgYWxzbyBub3RpZmljYXRpb24KKyAgU1RBVEUgc3RhdGVfOyAgICAgICAgIC8vIHRvIHByb3RlY3QgcHJvcGVyIHRocmVhZCBzdGFydCBiZWhhdmlvcgorICBpbnQgcG9saWN5XzsKKyAgaW50IHByaW9yaXR5XzsKKyAgaW50IHN0YWNrU2l6ZV87CisgIHN0ZDo6d2Vha19wdHI8UHRocmVhZFRocmVhZD4gc2VsZl87CisgIGJvb2wgZGV0YWNoZWRfOworCitwdWJsaWM6CisgIFB0aHJlYWRUaHJlYWQoaW50IHBvbGljeSwKKyAgICAgICAgICAgICAgICBpbnQgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgaW50IHN0YWNrU2l6ZSwKKyAgICAgICAgICAgICAgICBib29sIGRldGFjaGVkLAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpCisgICAgOgorCisjaWZuZGVmIF9XSU4zMgorICAgICAgcHRocmVhZF8oMCksCisjZW5kaWYgLy8gX1dJTjMyCisgICAgICBzdGF0ZV8odW5pbml0aWFsaXplZCksCisgICAgICBwb2xpY3lfKHBvbGljeSksCisgICAgICBwcmlvcml0eV8ocHJpb3JpdHkpLAorICAgICAgc3RhY2tTaXplXyhzdGFja1NpemUpLAorICAgICAgZGV0YWNoZWRfKGRldGFjaGVkKSB7CisKKyAgICB0aGlzLT5UaHJlYWQ6OnJ1bm5hYmxlKHJ1bm5hYmxlKTsKKyAgfQorCisgIH5QdGhyZWFkVGhyZWFkKCkgeworICAgIC8qIE5vdGhpbmcgcmVmZXJlbmNlcyB0aGlzIHRocmVhZCwgaWYgaXMgaXMgbm90IGRldGFjaGVkLCBkbyBhIGpvaW4KKyAgICAgICBub3csIG90aGVyd2lzZSB0aGUgdGhyZWFkLWlkIGFuZCwgcG9zc2libHksIG90aGVyIHJlc291cmNlcyB3aWxsCisgICAgICAgYmUgbGVha2VkLiAqLworICAgIGlmICghZGV0YWNoZWRfKSB7CisgICAgICB0cnkgeworICAgICAgICBqb2luKCk7CisgICAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgICAgLy8gV2UncmUgcmVhbGx5IGhvc2VkLgorICAgICAgfQorICAgIH0KKyAgfQorCisgIFNUQVRFIGdldFN0YXRlKCkgY29uc3QKKyAgeworICAgIFN5bmNocm9uaXplZCBzeW5jKG1vbml0b3JfKTsKKyAgICByZXR1cm4gc3RhdGVfOworICB9CisKKyAgdm9pZCBzZXRTdGF0ZShTVEFURSBuZXdTdGF0ZSkKKyAgeworICAgIFN5bmNocm9uaXplZCBzeW5jKG1vbml0b3JfKTsKKyAgICBzdGF0ZV8gPSBuZXdTdGF0ZTsKKworICAgIC8vIHVuYmxvY2sgc3RhcnQoKSB3aXRoIHRoZSBrbm93bGVkZ2UgdGhhdCB0aGUgdGhyZWFkIGhhcyBhY3R1YWxseQorICAgIC8vIHN0YXJ0ZWQgcnVubmluZywgd2hpY2ggYXZvaWRzIGEgcmFjZSBpbiBkZXRhY2hlZCB0aHJlYWRzLgorICAgIGlmIChuZXdTdGF0ZSA9PSBzdGFydGVkKSB7CisJICBtb25pdG9yXy5ub3RpZnkoKTsKKyAgICB9CisgIH0KKworICB2b2lkIHN0YXJ0KCkgeworICAgIGlmIChnZXRTdGF0ZSgpICE9IHVuaW5pdGlhbGl6ZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwdGhyZWFkX2F0dHJfdCB0aHJlYWRfYXR0cjsKKyAgICBpZiAocHRocmVhZF9hdHRyX2luaXQoJnRocmVhZF9hdHRyKSAhPSAwKSB7CisgICAgICB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigicHRocmVhZF9hdHRyX2luaXQgZmFpbGVkIik7CisgICAgfQorCisgICAgaWYgKHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmdGhyZWFkX2F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhY2hlZF8gPyBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCA6IFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFKQorICAgICAgICAhPSAwKSB7CisgICAgICB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigicHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlIGZhaWxlZCIpOworICAgIH0KKworICAgIC8vIFNldCB0aHJlYWQgc3RhY2sgc2l6ZQorICAgIGlmIChwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCZ0aHJlYWRfYXR0ciwgTUIgKiBzdGFja1NpemVfKSAhPSAwKSB7CisgICAgICB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigicHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSBmYWlsZWQiKTsKKyAgICB9CisKKy8vIFNldCB0aHJlYWQgcG9saWN5CisjaWZkZWYgX1dJTjMyCisgICAgLy8gV0lOMzIgUHRocmVhZCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHNlZW0gdG8gc3VwcG9ydCBzaGVkdWxpbmcgcG9saWNpZXMgb3RoZXIgdGhlbgorICAgIC8vIFBvc2l4VGhyZWFkRmFjdG9yeTo6T1RIRVIgLSBydW50aW1lIGVycm9yCisgICAgcG9saWN5XyA9IFBvc2l4VGhyZWFkRmFjdG9yeTo6T1RIRVI7CisjZW5kaWYKKworI2lmIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORyA+IDAKKyAgICBpZiAocHRocmVhZF9hdHRyX3NldHNjaGVkcG9saWN5KCZ0aHJlYWRfYXR0ciwgcG9saWN5XykgIT0gMCkgeworICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSBmYWlsZWQiKTsKKyAgICB9CisjZW5kaWYKKworICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBzY2hlZF9wYXJhbTsKKyAgICBzY2hlZF9wYXJhbS5zY2hlZF9wcmlvcml0eSA9IHByaW9yaXR5XzsKKworICAgIC8vIFNldCB0aHJlYWQgcHJpb3JpdHkKKyAgICBpZiAocHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0oJnRocmVhZF9hdHRyLCAmc2NoZWRfcGFyYW0pICE9IDApIHsKKyAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbSBmYWlsZWQiKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgcmVmZXJlbmNlCisgICAgc3RkOjpzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+KiBzZWxmUmVmID0gbmV3IHN0ZDo6c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPigpOworICAgICpzZWxmUmVmID0gc2VsZl8ubG9jaygpOworCisgICAgc2V0U3RhdGUoc3RhcnRpbmcpOworCisJU3luY2hyb25pemVkIHN5bmMobW9uaXRvcl8pOworCQorICAgIGlmIChwdGhyZWFkX2NyZWF0ZSgmcHRocmVhZF8sICZ0aHJlYWRfYXR0ciwgdGhyZWFkTWFpbiwgKHZvaWQqKXNlbGZSZWYpICE9IDApIHsKKyAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2NyZWF0ZSBmYWlsZWQiKTsKKyAgICB9CisgICAgCisgICAgLy8gVGhlIGNhbGxlciBtYXkgbm90IGNob29zZSB0byBndWFyYW50ZWUgdGhlIHNjb3BlIG9mIHRoZSBSdW5uYWJsZQorICAgIC8vIGJlaW5nIHVzZWQgaW4gdGhlIHRocmVhZCwgc28gd2UgbXVzdCBhY3R1YWxseSB3YWl0IHVudGlsIHRoZSB0aHJlYWQKKyAgICAvLyBzdGFydHMgYmVmb3JlIHdlIHJldHVybi4gIElmIHdlIGRvIG5vdCB3YWl0LCBpdCB3b3VsZCBiZSBwb3NzaWJsZQorICAgIC8vIGZvciB0aGUgY2FsbGVyIHRvIHN0YXJ0IGRlc3RydWN0aW5nIHRoZSBSdW5uYWJsZSBhbmQgdGhlIFRocmVhZCwKKyAgICAvLyBhbmQgd2Ugd291bGQgZW5kIHVwIGluIGEgcmFjZS4gIFRoaXMgd2FzIGlkZW50aWZpZWQgd2l0aCB2YWxncmluZC4KKyAgICBtb25pdG9yXy53YWl0KCk7CisgIH0KKworICB2b2lkIGpvaW4oKSB7CisgICAgaWYgKCFkZXRhY2hlZF8gJiYgZ2V0U3RhdGUoKSAhPSB1bmluaXRpYWxpemVkKSB7CisgICAgICB2b2lkKiBpZ25vcmU7CisgICAgICAvKiBYWFgKKyAgICAgICAgIElmIGpvaW4gZmFpbHMgaXQgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIHRoZSBmYWN0CisgICAgICAgICB0aGF0IHRoZSBsYXN0IHJlZmVyZW5jZSB3YXMgdGhlIHRocmVhZCBpdHNlbGYgYW5kIGNhbm5vdAorICAgICAgICAgam9pbi4gIFRoaXMgcmVzdWx0cyBpbiBsZWFrZWQgdGhyZWFkcyBhbmQgd2lsbCBldmVudHVhbGx5CisgICAgICAgICBjYXVzZSB0aGUgcHJvY2VzcyB0byBydW4gb3V0IG9mIHRocmVhZCByZXNvdXJjZXMuCisgICAgICAgICBXZSdyZSBiZXlvbmQgdGhlIHBvaW50IG9mIHRocm93aW5nIGFuIGV4Y2VwdGlvbi4gIE5vdCBjbGVhciBob3cKKyAgICAgICAgIGJlc3QgdG8gaGFuZGxlIHRoaXMuICovCisgICAgICBpbnQgcmVzID0gcHRocmVhZF9qb2luKHB0aHJlYWRfLCAmaWdub3JlKTsKKyAgICAgIGRldGFjaGVkXyA9IChyZXMgPT0gMCk7CisgICAgICBpZiAocmVzICE9IDApIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiUHRocmVhZFRocmVhZDo6am9pbigpOiBmYWlsIHdpdGggY29kZSAlZCIsIHJlcyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgVGhyZWFkOjppZF90IGdldElkKCkgeworCisjaWZuZGVmIF9XSU4zMgorICAgIHJldHVybiAoVGhyZWFkOjppZF90KXB0aHJlYWRfOworI2Vsc2UKKyAgICByZXR1cm4gKFRocmVhZDo6aWRfdClwdGhyZWFkXy5wOworI2VuZGlmIC8vIF9XSU4zMgorICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIFRocmVhZDo6cnVubmFibGUoKTsgfQorCisgIHZvaWQgcnVubmFibGUoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB2YWx1ZSkgeyBUaHJlYWQ6OnJ1bm5hYmxlKHZhbHVlKTsgfQorCisgIHZvaWQgd2Vha1JlZihzdGQ6OnNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4gc2VsZikgeworICAgIGFzc2VydChzZWxmLmdldCgpID09IHRoaXMpOworICAgIHNlbGZfID0gc3RkOjp3ZWFrX3B0cjxQdGhyZWFkVGhyZWFkPihzZWxmKTsKKyAgfQorfTsKKwordm9pZCogUHRocmVhZFRocmVhZDo6dGhyZWFkTWFpbih2b2lkKiBhcmcpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+IHRocmVhZCA9ICooc3RkOjpzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+Kilhcmc7CisgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PHN0ZDo6c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPio+KGFyZyk7CisKKyNpZiBHT09HTEVfUEVSRlRPT0xTX1JFR0lTVEVSX1RIUkVBRAorICBQcm9maWxlclJlZ2lzdGVyVGhyZWFkKCk7CisjZW5kaWYKKworICB0aHJlYWQtPnNldFN0YXRlKHN0YXJ0ZWQpOworCisgIHRocmVhZC0+cnVubmFibGUoKS0+cnVuKCk7CisKKyAgU1RBVEUgX3MgPSB0aHJlYWQtPmdldFN0YXRlKCk7CisgIGlmIChfcyAhPSBzdG9wcGluZyAmJiBfcyAhPSBzdG9wcGVkKSB7CisgICAgdGhyZWFkLT5zZXRTdGF0ZShzdG9wcGluZyk7CisgIH0KKworICByZXR1cm4gKHZvaWQqKTA7Cit9CisKKy8qKgorICogQ29udmVydHMgZ2VuZXJpYyBwb3NpeCB0aHJlYWQgc2NoZWR1bGUgcG9saWN5IGVudW1zIGludG8gcHRocmVhZAorICogQVBJIHZhbHVlcy4KKyAqLworc3RhdGljIGludCB0b1B0aHJlYWRQb2xpY3koUG9zaXhUaHJlYWRGYWN0b3J5OjpQT0xJQ1kgcG9saWN5KSB7CisgIHN3aXRjaCAocG9saWN5KSB7CisgIGNhc2UgUG9zaXhUaHJlYWRGYWN0b3J5OjpPVEhFUjoKKyAgICByZXR1cm4gU0NIRURfT1RIRVI7CisgIGNhc2UgUG9zaXhUaHJlYWRGYWN0b3J5OjpGSUZPOgorICAgIHJldHVybiBTQ0hFRF9GSUZPOworICBjYXNlIFBvc2l4VGhyZWFkRmFjdG9yeTo6Uk9VTkRfUk9CSU46CisgICAgcmV0dXJuIFNDSEVEX1JSOworICB9CisgIHJldHVybiBTQ0hFRF9PVEhFUjsKK30KKworLyoqCisgKiBDb252ZXJ0cyByZWxhdGl2ZSB0aHJlYWQgcHJpb3JpdGllcyB0byBhYnNvbHV0ZSB2YWx1ZSBiYXNlZCBvbiBwb3NpeAorICogdGhyZWFkIHNjaGVkdWxlciBwb2xpY3kKKyAqCisgKiAgVGhlIGlkZWEgaXMgc2ltcGx5IHRvIGRpdmlkZSB1cCB0aGUgcHJpb3JpdHkgcmFuZ2UgZm9yIHRoZSBnaXZlbiBwb2xpY3kKKyAqIGludG8gdGhlIGNvcnJlcHNvbmRpbmcgcmVsYXRpdmUgcHJpb3JpdHkgbGV2ZWwgKGxvd2VzdC4uaGlnaGVzdCkgYW5kCisgKiB0aGVuIHByby1yYXRlIGFjY29yZGluZ2x5LgorICovCitzdGF0aWMgaW50IHRvUHRocmVhZFByaW9yaXR5KFBvc2l4VGhyZWFkRmFjdG9yeTo6UE9MSUNZIHBvbGljeSwgUG9zaXhUaHJlYWRGYWN0b3J5OjpQUklPUklUWSBwcmlvcml0eSkgeworICBpbnQgcHRocmVhZF9wb2xpY3kgPSB0b1B0aHJlYWRQb2xpY3kocG9saWN5KTsKKyAgaW50IG1pbl9wcmlvcml0eSA9IDA7CisgIGludCBtYXhfcHJpb3JpdHkgPSAwOworI2lmZGVmIEhBVkVfU0NIRURfR0VUX1BSSU9SSVRZX01JTgorICBtaW5fcHJpb3JpdHkgPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWluKHB0aHJlYWRfcG9saWN5KTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfU0NIRURfR0VUX1BSSU9SSVRZX01BWAorICBtYXhfcHJpb3JpdHkgPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KHB0aHJlYWRfcG9saWN5KTsKKyNlbmRpZgorICBpbnQgcXVhbnRhID0gKFBvc2l4VGhyZWFkRmFjdG9yeTo6SElHSEVTVCAtIFBvc2l4VGhyZWFkRmFjdG9yeTo6TE9XRVNUKSArIDE7CisgIGZsb2F0IHN0ZXBzcGVycXVhbnRhID0gKGZsb2F0KShtYXhfcHJpb3JpdHkgLSBtaW5fcHJpb3JpdHkpIC8gcXVhbnRhOworCisgIGlmIChwcmlvcml0eSA8PSBQb3NpeFRocmVhZEZhY3Rvcnk6OkhJR0hFU1QpIHsKKyAgICByZXR1cm4gKGludCkobWluX3ByaW9yaXR5ICsgc3RlcHNwZXJxdWFudGEgKiBwcmlvcml0eSk7CisgIH0gZWxzZSB7CisgICAgLy8gc2hvdWxkIG5ldmVyIGdldCBoZXJlIGZvciBwcmlvcml0eSBpbmNyZW1lbnRzLgorICAgIGFzc2VydChmYWxzZSk7CisgICAgcmV0dXJuIChpbnQpKG1pbl9wcmlvcml0eSArIHN0ZXBzcGVycXVhbnRhICogUG9zaXhUaHJlYWRGYWN0b3J5OjpOT1JNQUwpOworICB9Cit9CisKK1Bvc2l4VGhyZWFkRmFjdG9yeTo6UG9zaXhUaHJlYWRGYWN0b3J5KFBPTElDWSBwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklPUklUWSBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRldGFjaGVkKQorICA6IFRocmVhZEZhY3RvcnkoZGV0YWNoZWQpLAorICAgIHBvbGljeV8ocG9saWN5KSwKKyAgICBwcmlvcml0eV8ocHJpb3JpdHkpLAorICAgIHN0YWNrU2l6ZV8oc3RhY2tTaXplKSB7Cit9CisKK1Bvc2l4VGhyZWFkRmFjdG9yeTo6UG9zaXhUaHJlYWRGYWN0b3J5KGJvb2wgZGV0YWNoZWQpCisgIDogVGhyZWFkRmFjdG9yeShkZXRhY2hlZCksCisgICAgcG9saWN5XyhST1VORF9ST0JJTiksCisgICAgcHJpb3JpdHlfKE5PUk1BTCksCisgICAgc3RhY2tTaXplXygxKSB7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IFBvc2l4VGhyZWFkRmFjdG9yeTo6bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0IHsKKyAgc3RkOjpzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+IHJlc3VsdAorICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4obmV3IFB0aHJlYWRUaHJlYWQodG9QdGhyZWFkUG9saWN5KHBvbGljeV8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvUHRocmVhZFByaW9yaXR5KHBvbGljeV8sIHByaW9yaXR5XyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tTaXplXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RldGFjaGVkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVubmFibGUpKTsKKyAgcmVzdWx0LT53ZWFrUmVmKHJlc3VsdCk7CisgIHJ1bm5hYmxlLT50aHJlYWQocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IFBvc2l4VGhyZWFkRmFjdG9yeTo6Z2V0U3RhY2tTaXplKCkgY29uc3QgeworICByZXR1cm4gc3RhY2tTaXplXzsKK30KKwordm9pZCBQb3NpeFRocmVhZEZhY3Rvcnk6OnNldFN0YWNrU2l6ZShpbnQgdmFsdWUpIHsKKyAgc3RhY2tTaXplXyA9IHZhbHVlOworfQorCitQb3NpeFRocmVhZEZhY3Rvcnk6OlBSSU9SSVRZIFBvc2l4VGhyZWFkRmFjdG9yeTo6Z2V0UHJpb3JpdHkoKSBjb25zdCB7CisgIHJldHVybiBwcmlvcml0eV87Cit9CisKK3ZvaWQgUG9zaXhUaHJlYWRGYWN0b3J5OjpzZXRQcmlvcml0eShQUklPUklUWSB2YWx1ZSkgeworICBwcmlvcml0eV8gPSB2YWx1ZTsKK30KKworVGhyZWFkOjppZF90IFBvc2l4VGhyZWFkRmFjdG9yeTo6Z2V0Q3VycmVudFRocmVhZElkKCkgY29uc3QgeworI2lmbmRlZiBfV0lOMzIKKyAgcmV0dXJuIChUaHJlYWQ6OmlkX3QpcHRocmVhZF9zZWxmKCk7CisjZWxzZQorICByZXR1cm4gKFRocmVhZDo6aWRfdClwdGhyZWFkX3NlbGYoKS5wOworI2VuZGlmIC8vIF9XSU4zMgorfQorCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiM2IxN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1BPU0lYVEhSRUFERkFDVE9SWV9IXworI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX1BPU0lYVEhSRUFERkFDVE9SWV9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCisvKioKKyAqIEEgdGhyZWFkIGZhY3RvcnkgdG8gY3JlYXRlIHBvc2l4IHRocmVhZHMKKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBQb3NpeFRocmVhZEZhY3RvcnkgOiBwdWJsaWMgVGhyZWFkRmFjdG9yeSB7CisKK3B1YmxpYzoKKyAgLyoqCisgICAqIFBPU0lYIFRocmVhZCBzY2hlZHVsZXIgcG9saWNpZXMKKyAgICovCisgIGVudW0gUE9MSUNZIHsgT1RIRVIsIEZJRk8sIFJPVU5EX1JPQklOIH07CisKKyAgLyoqCisgICAqIFBPU0lYIFRocmVhZCBzY2hlZHVsZXIgcmVsYXRpdmUgcHJpb3JpdGllcywKKyAgICoKKyAgICogQWJzb2x1dGUgcHJpb3JpdHkgaXMgZGV0ZXJtaW5lZCBieSBzY2hlZHVsZXIgcG9saWN5IGFuZCBPUy4gVGhpcworICAgKiBlbnVtZXJhdGlvbiBzcGVjaWZpZXMgcmVsYXRpdmUgcHJpb3JpdGllcyBzdWNoIHRoYXQgb25lIGNhbiBzcGVjaWZ5IGEKKyAgICogcHJpb3JpdHkgd2l0aGluIGEgZ2l2aW5nIHNjaGVkdWxlciBwb2xpY3kgd2l0aG91dCBrbm93aW5nIHRoZSBhYnNvbHV0ZQorICAgKiB2YWx1ZSBvZiB0aGUgcHJpb3JpdHkuCisgICAqLworICBlbnVtIFBSSU9SSVRZIHsKKyAgICBMT1dFU1QgPSAwLAorICAgIExPV0VSID0gMSwKKyAgICBMT1cgPSAyLAorICAgIE5PUk1BTCA9IDMsCisgICAgSElHSCA9IDQsCisgICAgSElHSEVSID0gNSwKKyAgICBISUdIRVNUID0gNiwKKyAgICBJTkNSRU1FTlQgPSA3LAorICAgIERFQ1JFTUVOVCA9IDgKKyAgfTsKKworICAvKioKKyAgICogUG9zaXggdGhyZWFkIChwdGhyZWFkKSBmYWN0b3J5LiAgQWxsIHRocmVhZHMgY3JlYXRlZCBieSBhIGZhY3RvcnkgYXJlIHJlZmVyZW5jZS1jb3VudGVkCisgICAqIHZpYSBzdGQ6OnNoYXJlZF9wdHIuICBUaGUgZmFjdG9yeSBndWFyYW50ZWVzIHRoYXQgdGhyZWFkcyBhbmQgdGhlIFJ1bm5hYmxlIHRhc2tzIAorICAgKiB0aGV5IGhvc3Qgd2lsbCBiZSBwcm9wZXJseSBjbGVhbmVkIHVwIG9uY2UgdGhlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZSB0byBib3RoIGlzCisgICAqIGdpdmVuIHVwLgorICAgKgorICAgKiBUaHJlYWRzIGFyZSBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBwb2xpY3ksIHByaW9yaXR5LCBzdGFjay1zaXplIGFuZCBkZXRhY2hhYmxlLW1vZGUKKyAgICogZGV0YWNoZWQgbWVhbnMgdGhlIHRocmVhZCBpcyBmcmVlLXJ1bm5pbmcgYW5kIHdpbGwgcmVsZWFzZSBhbGwgc3lzdGVtIHJlc291cmNlcyB0aGUKKyAgICogd2hlbiBpdCBjb21wbGV0ZXMuICBBIGRldGFjaGFibGUgdGhyZWFkIGlzIG5vdCBqb2luYWJsZS4gIFRoZSBqb2luIG1ldGhvZAorICAgKiBvZiBhIGRldGFjaGFibGUgdGhyZWFkIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGggbm8gZXJyb3IuCisgICAqCisgICAqIEJ5IGRlZmF1bHQgdGhyZWFkcyBhcmUgbm90IGpvaW5hYmxlLgorICAgKi8KKyAgUG9zaXhUaHJlYWRGYWN0b3J5KFBPTElDWSBwb2xpY3kgPSBST1VORF9ST0JJTiwKKyAgICAgICAgICAgICAgICAgICAgIFBSSU9SSVRZIHByaW9yaXR5ID0gTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgaW50IHN0YWNrU2l6ZSA9IDEsCisgICAgICAgICAgICAgICAgICAgICBib29sIGRldGFjaGVkID0gdHJ1ZSk7CisKKyAgLyoqCisgICAqIFByb3ZpZGUgYSBjb25zdHJ1Y3RvciBjb21wYXRpYmxlIHdpdGggdGhlIG90aGVyIGZhY3RvcmllcworICAgKiBUaGUgZGVmYXVsdCBwb2xpY3kgaXMgUE9MSUNZOjpST1VORF9ST0JJTi4KKyAgICogVGhlIGRlZmF1bHQgcHJpb3JpdHkgaXMgUFJJT1JJVFk6Ok5PUk1BTC4KKyAgICogVGhlIGRlZmF1bHQgc3RhY2tTaXplIGlzIDEuCisgICAqLworICBQb3NpeFRocmVhZEZhY3RvcnkoYm9vbCBkZXRhY2hlZCk7CisKKyAgLy8gRnJvbSBUaHJlYWRGYWN0b3J5OworICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3Q7CisKKyAgLy8gRnJvbSBUaHJlYWRGYWN0b3J5OworICBUaHJlYWQ6OmlkX3QgZ2V0Q3VycmVudFRocmVhZElkKCkgY29uc3Q7CisKKyAgLyoqCisgICAqIEdldHMgc3RhY2sgc2l6ZSBmb3IgbmV3bHkgY3JlYXRlZCB0aHJlYWRzCisgICAqCisgICAqIEByZXR1cm4gaW50IHNpemUgaW4gbWVnYWJ5dGVzCisgICAqLworICB2aXJ0dWFsIGludCBnZXRTdGFja1NpemUoKSBjb25zdDsKKworICAvKioKKyAgICogU2V0cyBzdGFjayBzaXplIGZvciBuZXdseSBjcmVhdGVkIHRocmVhZHMKKyAgICoKKyAgICogQHBhcmFtIHZhbHVlIHNpemUgaW4gbWVnYWJ5dGVzCisgICAqLworICB2aXJ0dWFsIHZvaWQgc2V0U3RhY2tTaXplKGludCB2YWx1ZSk7CisKKyAgLyoqCisgICAqIEdldHMgcHJpb3JpdHkgcmVsYXRpdmUgdG8gY3VycmVudCBwb2xpY3kKKyAgICovCisgIHZpcnR1YWwgUFJJT1JJVFkgZ2V0UHJpb3JpdHkoKSBjb25zdDsKKworICAvKioKKyAgICogU2V0cyBwcmlvcml0eSByZWxhdGl2ZSB0byBjdXJyZW50IHBvbGljeQorICAgKi8KKyAgdmlydHVhbCB2b2lkIHNldFByaW9yaXR5KFBSSU9SSVRZIHByaW9yaXR5KTsKKworcHJpdmF0ZToKKyAgUE9MSUNZIHBvbGljeV87CisgIFBSSU9SSVRZIHByaW9yaXR5XzsKKyAgaW50IHN0YWNrU2l6ZV87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9QT1NJWFRIUkVBREZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNb25pdG9yLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNb25pdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjNiMjA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZE1vbml0b3IuY3BwCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDxtdXRleD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKy8qKgorICogTW9uaXRvciBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgc3RkIHRocmVhZCBsaWJyYXJ5CisgKgorICogQHZlcnNpb24gJElkOiQKKyAqLworY2xhc3MgTW9uaXRvcjo6SW1wbCB7CisKK3B1YmxpYzoKKyAgSW1wbCgpIDogb3duZWRNdXRleF8obmV3IE11dGV4KCkpLCBjb25kaXRpb25WYXJpYWJsZV8oKSwgbXV0ZXhfKE5VTEwpIHsgaW5pdChvd25lZE11dGV4Xy5nZXQoKSk7IH0KKworICBJbXBsKE11dGV4KiBtdXRleCkgOiBvd25lZE11dGV4XygpLCBjb25kaXRpb25WYXJpYWJsZV8oKSwgbXV0ZXhfKE5VTEwpIHsgaW5pdChtdXRleCk7IH0KKworICBJbXBsKE1vbml0b3IqIG1vbml0b3IpIDogb3duZWRNdXRleF8oKSwgY29uZGl0aW9uVmFyaWFibGVfKCksIG11dGV4XyhOVUxMKSB7CisgICAgaW5pdCgmKG1vbml0b3ItPm11dGV4KCkpKTsKKyAgfQorCisgIE11dGV4JiBtdXRleCgpIHsgcmV0dXJuICptdXRleF87IH0KKyAgdm9pZCBsb2NrKCkgeyBtdXRleF8tPmxvY2soKTsgfQorICB2b2lkIHVubG9jaygpIHsgbXV0ZXhfLT51bmxvY2soKTsgfQorCisgIC8qKgorICAgKiBFeGNlcHRpb24tdGhyb3dpbmcgdmVyc2lvbiBvZiB3YWl0Rm9yVGltZVJlbGF0aXZlKCksIGNhbGxlZCBzaW1wbHkKKyAgICogd2FpdChpbnQ2NCkgZm9yIGhpc3RvcmljYWwgcmVhc29ucy4gIFRpbWVvdXQgaXMgaW4gbWlsbGlzZWNvbmRzLgorICAgKgorICAgKiBJZiB0aGUgY29uZGl0aW9uIG9jY3VycywgIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBjbGVhbmx5OyBvbiB0aW1lb3V0IG9yCisgICAqIGVycm9yIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqLworICB2b2lkIHdhaXQoaW50NjRfdCB0aW1lb3V0X21zKSB7CisgICAgaW50IHJlc3VsdCA9IHdhaXRGb3JUaW1lUmVsYXRpdmUodGltZW91dF9tcyk7CisgICAgaWYgKHJlc3VsdCA9PSBUSFJJRlRfRVRJTUVET1VUKSB7CisgICAgICB0aHJvdyBUaW1lZE91dEV4Y2VwdGlvbigpOworICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9IDApIHsKKyAgICAgIHRocm93IFRFeGNlcHRpb24oIk1vbml0b3I6OndhaXQoKSBmYWlsZWQiKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogV2FpdHMgdW50aWwgdGhlIHNwZWNpZmllZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIGNvbmRpdGlvbiB0bworICAgKiBvY2N1ciwgb3Igd2FpdHMgZm9yZXZlciBpZiB0aW1lb3V0X21zID09IDAuCisgICAqCisgICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBUSFJJRlRfRVRJTUVET1VUIG9uIHRpbWVvdXQsIG9yIGFuIGVycm9yIGNvZGUuCisgICAqLworICBpbnQgd2FpdEZvclRpbWVSZWxhdGl2ZShpbnQ2NF90IHRpbWVvdXRfbXMpIHsKKyAgICBpZiAodGltZW91dF9tcyA9PSAwTEwpIHsKKyAgICAgIHJldHVybiB3YWl0Rm9yZXZlcigpOworICAgIH0KKworICAgIGFzc2VydChtdXRleF8pOworICAgIHN0ZDo6dGltZWRfbXV0ZXgqIG11dGV4SW1wbCA9IHN0YXRpY19jYXN0PHN0ZDo6dGltZWRfbXV0ZXgqPihtdXRleF8tPmdldFVuZGVybHlpbmdJbXBsKCkpOworICAgIGFzc2VydChtdXRleEltcGwpOworCisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnRpbWVkX211dGV4PiBsb2NrKCptdXRleEltcGwsIHN0ZDo6YWRvcHRfbG9jayk7CisgICAgYm9vbCB0aW1lZG91dCA9IChjb25kaXRpb25WYXJpYWJsZV8ud2FpdF9mb3IobG9jaywgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyh0aW1lb3V0X21zKSkKKyAgICAgICAgICAgICAgICAgICAgID09IHN0ZDo6Y3Zfc3RhdHVzOjp0aW1lb3V0KTsKKyAgICBsb2NrLnJlbGVhc2UoKTsKKyAgICByZXR1cm4gKHRpbWVkb3V0ID8gVEhSSUZUX0VUSU1FRE9VVCA6IDApOworICB9CisKKyAgLyoqCisgICAqIFdhaXRzIHVudGlsIHRoZSBhYnNvbHV0ZSB0aW1lIHNwZWNpZmllZCB1c2luZyBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDLgorICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3VycywgVEhSSUZUX0VUSU1FRE9VVCBvbiB0aW1lb3V0LCBvciBhbiBlcnJvciBjb2RlLgorICAgKi8KKyAgaW50IHdhaXRGb3JUaW1lKGNvbnN0IFRIUklGVF9USU1FU1BFQyogYWJzdGltZSkgeworICAgIHN0cnVjdCB0aW1ldmFsIHRlbXA7CisgICAgdGVtcC50dl9zZWMgPSBzdGF0aWNfY2FzdDxsb25nPihhYnN0aW1lLT50dl9zZWMpOworICAgIHRlbXAudHZfdXNlYyA9IHN0YXRpY19jYXN0PGxvbmc+KGFic3RpbWUtPnR2X25zZWMpIC8gMTAwMDsKKyAgICByZXR1cm4gd2FpdEZvclRpbWUoJnRlbXApOworICB9CisKKyAgLyoqCisgICAqIFdhaXRzIHVudGlsIHRoZSBhYnNvbHV0ZSB0aW1lIHNwZWNpZmllZCB1c2luZyBzdHJ1Y3QgdGltZXZhbC4KKyAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIFRIUklGVF9FVElNRURPVVQgb24gdGltZW91dCwgb3IgYW4gZXJyb3IgY29kZS4KKyAgICovCisgIGludCB3YWl0Rm9yVGltZShjb25zdCBzdHJ1Y3QgdGltZXZhbCogYWJzdGltZSkgeworICAgIGFzc2VydChtdXRleF8pOworICAgIHN0ZDo6dGltZWRfbXV0ZXgqIG11dGV4SW1wbCA9IHN0YXRpY19jYXN0PHN0ZDo6dGltZWRfbXV0ZXgqPihtdXRleF8tPmdldFVuZGVybHlpbmdJbXBsKCkpOworICAgIGFzc2VydChtdXRleEltcGwpOworCisgICAgc3RydWN0IHRpbWV2YWwgY3VycmVudHRpbWU7CisgICAgVXRpbDo6dG9UaW1ldmFsKGN1cnJlbnR0aW1lLCBVdGlsOjpjdXJyZW50VGltZSgpKTsKKworICAgIGxvbmcgdHZfc2VjID0gc3RhdGljX2Nhc3Q8bG9uZz4oYWJzdGltZS0+dHZfc2VjIC0gY3VycmVudHRpbWUudHZfc2VjKTsKKyAgICBsb25nIHR2X3VzZWMgPSBzdGF0aWNfY2FzdDxsb25nPihhYnN0aW1lLT50dl91c2VjIC0gY3VycmVudHRpbWUudHZfdXNlYyk7CisgICAgaWYgKHR2X3NlYyA8IDApCisgICAgICB0dl9zZWMgPSAwOworICAgIGlmICh0dl91c2VjIDwgMCkKKyAgICAgIHR2X3VzZWMgPSAwOworCisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnRpbWVkX211dGV4PiBsb2NrKCptdXRleEltcGwsIHN0ZDo6YWRvcHRfbG9jayk7CisgICAgYm9vbCB0aW1lZG91dCA9IChjb25kaXRpb25WYXJpYWJsZV8ud2FpdF9mb3IobG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6c2Vjb25kcyh0dl9zZWMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzKHR2X3VzZWMpKQorICAgICAgICAgICAgICAgICAgICAgPT0gc3RkOjpjdl9zdGF0dXM6OnRpbWVvdXQpOworICAgIGxvY2sucmVsZWFzZSgpOworICAgIHJldHVybiAodGltZWRvdXQgPyBUSFJJRlRfRVRJTUVET1VUIDogMCk7CisgIH0KKworICAvKioKKyAgICogV2FpdHMgZm9yZXZlciB1bnRpbCB0aGUgY29uZGl0aW9uIG9jY3Vycy4KKyAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIG9yIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICAgKi8KKyAgaW50IHdhaXRGb3JldmVyKCkgeworICAgIGFzc2VydChtdXRleF8pOworICAgIHN0ZDo6dGltZWRfbXV0ZXgqIG11dGV4SW1wbCA9IHN0YXRpY19jYXN0PHN0ZDo6dGltZWRfbXV0ZXgqPihtdXRleF8tPmdldFVuZGVybHlpbmdJbXBsKCkpOworICAgIGFzc2VydChtdXRleEltcGwpOworCisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnRpbWVkX211dGV4PiBsb2NrKCptdXRleEltcGwsIHN0ZDo6YWRvcHRfbG9jayk7CisgICAgY29uZGl0aW9uVmFyaWFibGVfLndhaXQobG9jayk7CisgICAgbG9jay5yZWxlYXNlKCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB2b2lkIG5vdGlmeSgpIHsgY29uZGl0aW9uVmFyaWFibGVfLm5vdGlmeV9vbmUoKTsgfQorCisgIHZvaWQgbm90aWZ5QWxsKCkgeyBjb25kaXRpb25WYXJpYWJsZV8ubm90aWZ5X2FsbCgpOyB9CisKK3ByaXZhdGU6CisgIHZvaWQgaW5pdChNdXRleCogbXV0ZXgpIHsgbXV0ZXhfID0gbXV0ZXg7IH0KKworICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8TXV0ZXg+IG93bmVkTXV0ZXhfOworICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZV9hbnkgY29uZGl0aW9uVmFyaWFibGVfOworICBNdXRleCogbXV0ZXhfOworfTsKKworTW9uaXRvcjo6TW9uaXRvcigpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwoKSkgeworfQorTW9uaXRvcjo6TW9uaXRvcihNdXRleCogbXV0ZXgpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwobXV0ZXgpKSB7Cit9CitNb25pdG9yOjpNb25pdG9yKE1vbml0b3IqIG1vbml0b3IpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwobW9uaXRvcikpIHsKK30KKworTW9uaXRvcjo6fk1vbml0b3IoKSB7CisgIGRlbGV0ZSBpbXBsXzsKK30KKworTXV0ZXgmIE1vbml0b3I6Om11dGV4KCkgY29uc3QgeworICByZXR1cm4gY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT5tdXRleCgpOworfQorCit2b2lkIE1vbml0b3I6OmxvY2soKSBjb25zdCB7CisgIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+bG9jaygpOworfQorCit2b2lkIE1vbml0b3I6OnVubG9jaygpIGNvbnN0IHsKKyAgY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT51bmxvY2soKTsKK30KKwordm9pZCBNb25pdG9yOjp3YWl0KGludDY0X3QgdGltZW91dCkgY29uc3QgeworICBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXQodGltZW91dCk7Cit9CisKK2ludCBNb25pdG9yOjp3YWl0Rm9yVGltZShjb25zdCBUSFJJRlRfVElNRVNQRUMqIGFic3RpbWUpIGNvbnN0IHsKKyAgcmV0dXJuIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+d2FpdEZvclRpbWUoYWJzdGltZSk7Cit9CisKK2ludCBNb25pdG9yOjp3YWl0Rm9yVGltZShjb25zdCB0aW1ldmFsKiBhYnN0aW1lKSBjb25zdCB7CisgIHJldHVybiBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXRGb3JUaW1lKGFic3RpbWUpOworfQorCitpbnQgTW9uaXRvcjo6d2FpdEZvclRpbWVSZWxhdGl2ZShpbnQ2NF90IHRpbWVvdXRfbXMpIGNvbnN0IHsKKyAgcmV0dXJuIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+d2FpdEZvclRpbWVSZWxhdGl2ZSh0aW1lb3V0X21zKTsKK30KKworaW50IE1vbml0b3I6OndhaXRGb3JldmVyKCkgY29uc3QgeworICByZXR1cm4gY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT53YWl0Rm9yZXZlcigpOworfQorCit2b2lkIE1vbml0b3I6Om5vdGlmeSgpIGNvbnN0IHsKKyAgY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT5ub3RpZnkoKTsKK30KKwordm9pZCBNb25pdG9yOjpub3RpZnlBbGwoKSBjb25zdCB7CisgIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+bm90aWZ5QWxsKCk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZE11dGV4LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNdXRleC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBmNzlmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNdXRleC5jcHAKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxtdXRleD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgTXV0ZXggY2xhc3MgdXNpbmcgQysrMTEgc3RkOjp0aW1lZF9tdXRleAorICoKKyAqIE1ldGhvZHMgdGhyb3cgc3RkOjpzeXN0ZW1fZXJyb3Igb24gZXJyb3IuCisgKgorICogQHZlcnNpb24gJElkOiQKKyAqLworY2xhc3MgTXV0ZXg6OmltcGwgOiBwdWJsaWMgc3RkOjp0aW1lZF9tdXRleCB7fTsKKworTXV0ZXg6Ok11dGV4KEluaXRpYWxpemVyIGluaXQpIDogaW1wbF8obmV3IE11dGV4OjppbXBsKCkpIHsKKyAgKCh2b2lkKWluaXQpOworfQorCit2b2lkKiBNdXRleDo6Z2V0VW5kZXJseWluZ0ltcGwoKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy5nZXQoKTsKK30KKwordm9pZCBNdXRleDo6bG9jaygpIGNvbnN0IHsKKyAgaW1wbF8tPmxvY2soKTsKK30KKworYm9vbCBNdXRleDo6dHJ5bG9jaygpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT50cnlfbG9jaygpOworfQorCitib29sIE11dGV4Ojp0aW1lZGxvY2soaW50NjRfdCBtcykgY29uc3QgeworICByZXR1cm4gaW1wbF8tPnRyeV9sb2NrX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKG1zKSk7Cit9CisKK3ZvaWQgTXV0ZXg6OnVubG9jaygpIGNvbnN0IHsKKyAgaW1wbF8tPnVubG9jaygpOworfQorCit2b2lkIE11dGV4OjpERUZBVUxUX0lOSVRJQUxJWkVSKHZvaWQqIGFyZykgeworICAoKHZvaWQpYXJnKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg4NWYzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5LmNwcApAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2lmIFVTRV9TVERfVEhSRUFECisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8dGhyZWFkPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworLyoqCisgKiBUaGUgQysrMTEgdGhyZWFkIGNsYXNzLgorICoKKyAqIE5vdGUgdGhhdCB3ZSB1c2UgYm9vc3Qgc2hhcmVkX3B0ciByYXRoZXIgdGhhbiBzdGQgc2hhcmVkX3B0cnMgaGVyZQorICogYmVjYXVzZSB0aGUgVGhyZWFkL1J1bm5hYmxlIGNsYXNzZXMgdXNlIHRob3NlIGFuZCB3ZSBkb24ndCB3YW50IHRvCisgKiBtaXggdGhlbS4KKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBTdGRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkLCBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxTdGRUaHJlYWQ+IHsKK3B1YmxpYzoKKyAgZW51bSBTVEFURSB7IHVuaW5pdGlhbGl6ZWQsIHN0YXJ0aW5nLCBzdGFydGVkLCBzdG9wcGluZywgc3RvcHBlZCB9OworCisgIHN0YXRpYyB2b2lkIHRocmVhZE1haW4oc3RkOjpzaGFyZWRfcHRyPFN0ZFRocmVhZD4gdGhyZWFkKTsKKworcHJpdmF0ZToKKyAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dGhyZWFkPiB0aHJlYWRfOworICBNb25pdG9yIG1vbml0b3JfOworICBTVEFURSBzdGF0ZV87CisgIGJvb2wgZGV0YWNoZWRfOworCitwdWJsaWM6CisgIFN0ZFRocmVhZChib29sIGRldGFjaGVkLCBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKQorICAgIDogc3RhdGVfKHVuaW5pdGlhbGl6ZWQpLCBkZXRhY2hlZF8oZGV0YWNoZWQpIHsKKyAgICB0aGlzLT5UaHJlYWQ6OnJ1bm5hYmxlKHJ1bm5hYmxlKTsKKyAgfQorCisgIH5TdGRUaHJlYWQoKSB7CisgICAgaWYgKCFkZXRhY2hlZF8gJiYgdGhyZWFkXy0+am9pbmFibGUoKSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgam9pbigpOworICAgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICAgIC8vIFdlJ3JlIHJlYWxseSBob3NlZC4KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBTVEFURSBnZXRTdGF0ZSgpIGNvbnN0CisgIHsKKyAgICBTeW5jaHJvbml6ZWQgc3luYyhtb25pdG9yXyk7CisgICAgcmV0dXJuIHN0YXRlXzsKKyAgfQorCisgIHZvaWQgc2V0U3RhdGUoU1RBVEUgbmV3U3RhdGUpCisgIHsKKyAgICBTeW5jaHJvbml6ZWQgc3luYyhtb25pdG9yXyk7CisgICAgc3RhdGVfID0gbmV3U3RhdGU7CisKKyAgICAvLyB1bmJsb2NrIHN0YXJ0KCkgd2l0aCB0aGUga25vd2xlZGdlIHRoYXQgdGhlIHRocmVhZCBoYXMgYWN0dWFsbHkKKyAgICAvLyBzdGFydGVkIHJ1bm5pbmcsIHdoaWNoIGF2b2lkcyBhIHJhY2UgaW4gZGV0YWNoZWQgdGhyZWFkcy4KKyAgICBpZiAobmV3U3RhdGUgPT0gc3RhcnRlZCkgeworCSAgbW9uaXRvcl8ubm90aWZ5KCk7CisgICAgfQorICB9CisKKyAgdm9pZCBzdGFydCgpIHsKKyAgICBpZiAoZ2V0U3RhdGUoKSAhPSB1bmluaXRpYWxpemVkKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPFN0ZFRocmVhZD4gc2VsZlJlZiA9IHNoYXJlZF9mcm9tX3RoaXMoKTsKKyAgICBzZXRTdGF0ZShzdGFydGluZyk7CisKKyAgICBTeW5jaHJvbml6ZWQgc3luYyhtb25pdG9yXyk7CisgICAgdGhyZWFkXyA9IHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnRocmVhZD4obmV3IHN0ZDo6dGhyZWFkKHRocmVhZE1haW4sIHNlbGZSZWYpKTsKKworICAgIGlmIChkZXRhY2hlZF8pCisgICAgICB0aHJlYWRfLT5kZXRhY2goKTsKKyAgICAKKyAgICAvLyBXYWl0IGZvciB0aGUgdGhyZWFkIHRvIHN0YXJ0IGFuZCBnZXQgZmFyIGVub3VnaCB0byBncmFiIGV2ZXJ5dGhpbmcKKyAgICAvLyB0aGF0IGl0IG5lZWRzIGZyb20gdGhlIGNhbGxpbmcgY29udGV4dCwgdGh1cyBhYnNvbHZpbmcgdGhlIGNhbGxlcgorICAgIC8vIGZyb20gYmVpbmcgcmVxdWlyZWQgdG8gaG9sZCBvbiB0byBydW5uYWJsZSBpbmRlZmluaXRlbHkuCisgICAgbW9uaXRvcl8ud2FpdCgpOworICB9CisKKyAgdm9pZCBqb2luKCkgeworICAgIGlmICghZGV0YWNoZWRfICYmIHN0YXRlXyAhPSB1bmluaXRpYWxpemVkKSB7CisgICAgICB0aHJlYWRfLT5qb2luKCk7CisgICAgfQorICB9CisKKyAgVGhyZWFkOjppZF90IGdldElkKCkgeyByZXR1cm4gdGhyZWFkXy5nZXQoKSA/IHRocmVhZF8tPmdldF9pZCgpIDogc3RkOjp0aHJlYWQ6OmlkKCk7IH0KKworICBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKCkgY29uc3QgeyByZXR1cm4gVGhyZWFkOjpydW5uYWJsZSgpOyB9CisKKyAgdm9pZCBydW5uYWJsZShzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlKSB7IFRocmVhZDo6cnVubmFibGUodmFsdWUpOyB9Cit9OworCit2b2lkIFN0ZFRocmVhZDo6dGhyZWFkTWFpbihzdGQ6OnNoYXJlZF9wdHI8U3RkVGhyZWFkPiB0aHJlYWQpIHsKKyNpZiBHT09HTEVfUEVSRlRPT0xTX1JFR0lTVEVSX1RIUkVBRAorICBQcm9maWxlclJlZ2lzdGVyVGhyZWFkKCk7CisjZW5kaWYKKworICB0aHJlYWQtPnNldFN0YXRlKHN0YXJ0ZWQpOworICB0aHJlYWQtPnJ1bm5hYmxlKCktPnJ1bigpOworCisgIGlmICh0aHJlYWQtPmdldFN0YXRlKCkgIT0gc3RvcHBpbmcgJiYgdGhyZWFkLT5nZXRTdGF0ZSgpICE9IHN0b3BwZWQpIHsKKyAgICB0aHJlYWQtPnNldFN0YXRlKHN0b3BwaW5nKTsKKyAgfQorfQorCitTdGRUaHJlYWRGYWN0b3J5OjpTdGRUaHJlYWRGYWN0b3J5KGJvb2wgZGV0YWNoZWQpIDogVGhyZWFkRmFjdG9yeShkZXRhY2hlZCkgeworfQorCitzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBTdGRUaHJlYWRGYWN0b3J5OjpuZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3QgeworICBzdGQ6OnNoYXJlZF9wdHI8U3RkVGhyZWFkPiByZXN1bHQgPSBzdGQ6OnNoYXJlZF9wdHI8U3RkVGhyZWFkPihuZXcgU3RkVGhyZWFkKGlzRGV0YWNoZWQoKSwgcnVubmFibGUpKTsKKyAgcnVubmFibGUtPnRocmVhZChyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorCitUaHJlYWQ6OmlkX3QgU3RkVGhyZWFkRmFjdG9yeTo6Z2V0Q3VycmVudFRocmVhZElkKCkgY29uc3QgeworICByZXR1cm4gc3RkOjp0aGlzX3RocmVhZDo6Z2V0X2lkKCk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorCisjZW5kaWYgLy8gVVNFX1NURF9USFJFQUQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5LmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NDA0NmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1NURFRIUkVBREZBQ1RPUllfSF8KKyNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9TVERUSFJFQURGQUNUT1JZX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKy8qKgorICogQSB0aHJlYWQgZmFjdG9yeSB0byBjcmVhdGUgc3RkOjp0aHJlYWRzLgorICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIFN0ZFRocmVhZEZhY3RvcnkgOiBwdWJsaWMgVGhyZWFkRmFjdG9yeSB7CisKK3B1YmxpYzoKKyAgLyoqCisgICAqIFN0ZCB0aHJlYWQgZmFjdG9yeS4gIEFsbCB0aHJlYWRzIGNyZWF0ZWQgYnkgYSBmYWN0b3J5IGFyZSByZWZlcmVuY2UtY291bnRlZAorICAgKiB2aWEgc3RkOjpzaGFyZWRfcHRyLiAgVGhlIGZhY3RvcnkgZ3VhcmFudGVlcyB0aGF0IHRocmVhZHMgYW5kIHRoZSBSdW5uYWJsZSB0YXNrcworICAgKiB0aGV5IGhvc3Qgd2lsbCBiZSBwcm9wZXJseSBjbGVhbmVkIHVwIG9uY2UgdGhlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZQorICAgKiB0byBib3RoIGlzIGdpdmVuIHVwLgorICAgKgorICAgKiBCeSBkZWZhdWx0IHRocmVhZHMgYXJlIG5vdCBqb2luYWJsZS4KKyAgICovCisKKyAgU3RkVGhyZWFkRmFjdG9yeShib29sIGRldGFjaGVkID0gdHJ1ZSk7CisKKyAgLy8gRnJvbSBUaHJlYWRGYWN0b3J5OworICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3Q7CisKKyAgLy8gRnJvbSBUaHJlYWRGYWN0b3J5OworICBUaHJlYWQ6OmlkX3QgZ2V0Q3VycmVudFRocmVhZElkKCkgY29uc3Q7Cit9OworCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1NURFRIUkVBREZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmVhNGUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURfSF8KKyNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURfSF8gMQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2lmIFVTRV9TVERfVEhSRUFECisjaW5jbHVkZSA8dGhyZWFkPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1BUSFJFQURfSAorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNlbmRpZgorI2VuZGlmCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCitjbGFzcyBUaHJlYWQ7CisKKy8qKgorICogTWluaW1hbCBydW5uYWJsZSBjbGFzcy4gIE1vcmUgb3IgbGVzcyBhbmFsb2dvdXMgdG8gamF2YS5sYW5nLlJ1bm5hYmxlLgorICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIFJ1bm5hYmxlIHsKKworcHVibGljOgorICB2aXJ0dWFsIH5SdW5uYWJsZSgpe307CisgIHZpcnR1YWwgdm9pZCBydW4oKSA9IDA7CisKKyAgLyoqCisgICAqIEdldHMgdGhlIHRocmVhZCBvYmplY3QgdGhhdCBpcyBob3N0aW5nIHRoaXMgcnVubmFibGUgb2JqZWN0ICAtIGNhbiByZXR1cm4KKyAgICogYW4gZW1wdHkgYm9vc3Q6OnNoYXJlZCBwb2ludGVyIGlmIG5vIHJlZmVyZW5jZXMgcmVtYWluIG9uIHRoYXQgdGhyZWFkIG9iamVjdAorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQoKSB7IHJldHVybiB0aHJlYWRfLmxvY2soKTsgfQorCisgIC8qKgorICAgKiBTZXRzIHRoZSB0aHJlYWQgdGhhdCBpcyBleGVjdXRpbmcgdGhpcyBvYmplY3QuICBUaGlzIGlzIG9ubHkgbWVhbnQgZm9yCisgICAqIHVzZSBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMgb2YgVGhyZWFkLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHRocmVhZChzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiB2YWx1ZSkgeyB0aHJlYWRfID0gdmFsdWU7IH0KKworcHJpdmF0ZToKKyAgc3RkOjp3ZWFrX3B0cjxUaHJlYWQ+IHRocmVhZF87Cit9OworCisvKioKKyAqIE1pbmltYWwgdGhyZWFkIGNsYXNzLiBSZXR1cm5lZCBieSB0aHJlYWQgZmFjdG9yeSBib3VuZCB0byBhIFJ1bm5hYmxlIG9iamVjdAorICogYW5kIHJlYWR5IHRvIHN0YXJ0IGV4ZWN1dGlvbi4gIE1vcmUgb3IgbGVzcyBhbmFsb2dvdXMgdG8gamF2YS5sYW5nLlRocmVhZAorICogKG1pbnVzIGFsbCB0aGUgdGhyZWFkIGdyb3VwLCBwcmlvcml0eSwgbW9kZSBhbmQgb3RoZXIgYmFnZ2FnZSwgc2luY2UgdGhhdAorICogaXMgZGlmZmljdWx0IHRvIGFic3RyYWN0IGFjcm9zcyBwbGF0Zm9ybXMgYW5kIGlzIGxlZnQgZm9yIHBsYXRmb3JtLXNwZWNpZmljCisgKiBUaHJlYWRGYWN0b3J5IGltcGxlbXRhdGlvbnMgdG8gZGVhbCB3aXRoCisgKgorICogQHNlZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3RvcnkpCisgKi8KK2NsYXNzIFRocmVhZCB7CisKK3B1YmxpYzoKKyNpZiBVU0VfU1REX1RIUkVBRAorICB0eXBlZGVmIHN0ZDo6dGhyZWFkOjppZCBpZF90OworCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19jdXJyZW50KGlkX3QgdCkgeyByZXR1cm4gdCA9PSBzdGQ6OnRoaXNfdGhyZWFkOjpnZXRfaWQoKTsgfQorICBzdGF0aWMgaW5saW5lIGlkX3QgZ2V0X2N1cnJlbnQoKSB7IHJldHVybiBzdGQ6OnRoaXNfdGhyZWFkOjpnZXRfaWQoKTsgfQorI2Vsc2UKKyAgdHlwZWRlZiBwdGhyZWFkX3QgaWRfdDsKKworICBzdGF0aWMgaW5saW5lIGJvb2wgaXNfY3VycmVudChpZF90IHQpIHsgcmV0dXJuIHB0aHJlYWRfZXF1YWwocHRocmVhZF9zZWxmKCksIHQpOyB9CisgIHN0YXRpYyBpbmxpbmUgaWRfdCBnZXRfY3VycmVudCgpIHsgcmV0dXJuIHB0aHJlYWRfc2VsZigpOyB9CisjZW5kaWYKKworICB2aXJ0dWFsIH5UaHJlYWQoKXt9OworCisgIC8qKgorICAgKiBTdGFydHMgdGhlIHRocmVhZC4gRG9lcyBwbGF0Zm9ybSBzcGVjaWZpYyB0aHJlYWQgY3JlYXRpb24gYW5kCisgICAqIGNvbmZpZ3VyYXRpb24gdGhlbiBpbnZva2VzIHRoZSBydW4gbWV0aG9kIG9mIHRoZSBSdW5uYWJsZSBvYmplY3QgYm91bmQKKyAgICogdG8gdGhpcyB0aHJlYWQuCisgICAqLworICB2aXJ0dWFsIHZvaWQgc3RhcnQoKSA9IDA7CisKKyAgLyoqCisgICAqIEpvaW4gdGhpcyB0aHJlYWQuIElmIHRoaXMgdGhyZWFkIGlzIGpvaW5hYmxlLCB0aGUgY2FsbGluZyB0aHJlYWQgYmxvY2tzCisgICAqIHVudGlsIHRoaXMgdGhyZWFkIGNvbXBsZXRlcy4gIElmIHRoZSB0YXJnZXQgdGhyZWFkIGlzIG5vdCBqb2luYWJsZSwgdGhlbgorICAgKiBub3RoaW5nIGhhcHBlbnMuCisgICAqLworICB2aXJ0dWFsIHZvaWQgam9pbigpID0gMDsKKworICAvKioKKyAgICogR2V0cyB0aGUgdGhyZWFkJ3MgcGxhdGZvcm0tc3BlY2lmaWMgSUQKKyAgICovCisgIHZpcnR1YWwgaWRfdCBnZXRJZCgpID0gMDsKKworICAvKioKKyAgICogR2V0cyB0aGUgcnVubmFibGUgb2JqZWN0IHRoaXMgdGhyZWFkIGlzIGhvc3RpbmcKKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIF9ydW5uYWJsZTsgfQorCitwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBydW5uYWJsZShzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlKSB7IF9ydW5uYWJsZSA9IHZhbHVlOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gX3J1bm5hYmxlOworfTsKKworLyoqCisgKiBGYWN0b3J5IHRvIGNyZWF0ZSBwbGF0Zm9ybS1zcGVjaWZpYyB0aHJlYWQgb2JqZWN0IGFuZCBiaW5kIHRoZW0gdG8gUnVubmFibGUKKyAqIG9iamVjdCBmb3IgZXhlY3V0aW9uCisgKi8KK2NsYXNzIFRocmVhZEZhY3RvcnkgeworcHJvdGVjdGVkOgorICBUaHJlYWRGYWN0b3J5KGJvb2wgZGV0YWNoZWQpIDogZGV0YWNoZWRfKGRldGFjaGVkKSB7IH0KKworcHVibGljOgorICB2aXJ0dWFsIH5UaHJlYWRGYWN0b3J5KCkgeyB9CisKKyAgLyoqCisgICAqIEdldHMgY3VycmVudCBkZXRhY2hlZCBtb2RlCisgICAqLworICBib29sIGlzRGV0YWNoZWQoKSBjb25zdCB7IHJldHVybiBkZXRhY2hlZF87IH0KKworICAvKioKKyAgICogU2V0cyB0aGUgZGV0YWNoZWQgZGlzcG9zaXRpb24gb2YgbmV3bHkgY3JlYXRlZCB0aHJlYWRzLgorICAgKi8KKyAgdm9pZCBzZXREZXRhY2hlZChib29sIGRldGFjaGVkKSB7IGRldGFjaGVkXyA9IGRldGFjaGVkOyB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyB0aHJlYWQuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IG5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdCA9IDA7CisKKyAgLyoqCisgICAqIEdldHMgdGhlIGN1cnJlbnQgdGhyZWFkIGlkIG9yIHVua25vd25fdGhyZWFkX2lkIGlmIHRoZSBjdXJyZW50IHRocmVhZCBpcyBub3QgYSB0aHJpZnQgdGhyZWFkCisgICAqLworICB2aXJ0dWFsIFRocmVhZDo6aWRfdCBnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdCA9IDA7CisKKyAgLyoqCisgICAqIEZvciBjb2RlIHJlYWRhYmlsaXR5IGRlZmluZSB0aGUgdW5rbm93bi91bmRlZmluZWQgdGhyZWFkIGlkCisgICAqLworICBzdGF0aWMgY29uc3QgVGhyZWFkOjppZF90IHVua25vd25fdGhyZWFkX2lkOworCitwcml2YXRlOgorICBib29sIGRldGFjaGVkXzsKK307CisKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVEhSRUFEX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgwMjVmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDU4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxzZXQ+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0OworCisvKioKKyAqIFRocmVhZE1hbmFnZXIgY2xhc3MKKyAqCisgKiBUaGlzIGNsYXNzIG1hbmFnZXMgYSBwb29sIG9mIHRocmVhZHMuIEl0IHVzZXMgYSBUaHJlYWRGYWN0b3J5IHRvIGNyZWF0ZQorICogdGhyZWFkcy4gIEl0IG5ldmVyIGFjdHVhbGx5IGNyZWF0ZXMgb3IgZGVzdHJveXMgd29ya2VyIHRocmVhZHMsIHJhdGhlcgorICogaXQgbWFpbnRhaW5zIHN0YXRpc3RpY3Mgb24gbnVtYmVyIG9mIGlkbGUgdGhyZWFkcywgbnVtYmVyIG9mIGFjdGl2ZSB0aHJlYWRzLAorICogdGFzayBiYWNrbG9nLCBhbmQgYXZlcmFnZSB3YWl0IGFuZCBzZXJ2aWNlIHRpbWVzLgorICoKKyAqIFRoZXJlIGFyZSB0aHJlZSBkaWZmZXJlbnQgbW9uaXRvcnMgdXNlZCBmb3Igc2lnbmFsaW5nIGRpZmZlcmVudCBjb25kaXRpb25zCisgKiBob3dldmVyIHRoZXkgYWxsIHNoYXJlIHRoZSBzYW1lIG11dGV4Xy4KKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBUaHJlYWRNYW5hZ2VyOjpJbXBsIDogcHVibGljIFRocmVhZE1hbmFnZXIgeworCitwdWJsaWM6CisgIEltcGwoKQorICAgIDogd29ya2VyQ291bnRfKDApLAorICAgICAgd29ya2VyTWF4Q291bnRfKDApLAorICAgICAgaWRsZUNvdW50XygwKSwKKyAgICAgIHBlbmRpbmdUYXNrQ291bnRNYXhfKDApLAorICAgICAgZXhwaXJlZENvdW50XygwKSwKKyAgICAgIHN0YXRlXyhUaHJlYWRNYW5hZ2VyOjpVTklOSVRJQUxJWkVEKSwKKyAgICAgIG1vbml0b3JfKCZtdXRleF8pLAorICAgICAgbWF4TW9uaXRvcl8oJm11dGV4XyksCisgICAgICB3b3JrZXJNb25pdG9yXygmbXV0ZXhfKSB7fQorCisgIH5JbXBsKCkgeyBzdG9wKCk7IH0KKworICB2b2lkIHN0YXJ0KCk7CisgIHZvaWQgc3RvcCgpOworCisgIFRocmVhZE1hbmFnZXI6OlNUQVRFIHN0YXRlKCkgY29uc3QgeyByZXR1cm4gc3RhdGVfOyB9CisKKyAgc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KCkgY29uc3QgeworICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICByZXR1cm4gdGhyZWFkRmFjdG9yeV87CisgIH0KKworICB2b2lkIHRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB2YWx1ZSkgeworICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICBpZiAodGhyZWFkRmFjdG9yeV8gJiYgdGhyZWFkRmFjdG9yeV8tPmlzRGV0YWNoZWQoKSAhPSB2YWx1ZS0+aXNEZXRhY2hlZCgpKSB7CisgICAgICB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICB9CisgICAgdGhyZWFkRmFjdG9yeV8gPSB2YWx1ZTsKKyAgfQorCisgIHZvaWQgYWRkV29ya2VyKHNpemVfdCB2YWx1ZSk7CisKKyAgdm9pZCByZW1vdmVXb3JrZXIoc2l6ZV90IHZhbHVlKTsKKworICBzaXplX3QgaWRsZVdvcmtlckNvdW50KCkgY29uc3QgeyByZXR1cm4gaWRsZUNvdW50XzsgfQorCisgIHNpemVfdCB3b3JrZXJDb3VudCgpIGNvbnN0IHsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgcmV0dXJuIHdvcmtlckNvdW50XzsKKyAgfQorCisgIHNpemVfdCBwZW5kaW5nVGFza0NvdW50KCkgY29uc3QgeworICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICByZXR1cm4gdGFza3NfLnNpemUoKTsKKyAgfQorCisgIHNpemVfdCB0b3RhbFRhc2tDb3VudCgpIGNvbnN0IHsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgcmV0dXJuIHRhc2tzXy5zaXplKCkgKyB3b3JrZXJDb3VudF8gLSBpZGxlQ291bnRfOworICB9CisKKyAgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXgoKSBjb25zdCB7CisgICAgR3VhcmQgZyhtdXRleF8pOworICAgIHJldHVybiBwZW5kaW5nVGFza0NvdW50TWF4XzsKKyAgfQorCisgIHNpemVfdCBleHBpcmVkVGFza0NvdW50KCkgeworICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICByZXR1cm4gZXhwaXJlZENvdW50XzsKKyAgfQorCisgIHZvaWQgcGVuZGluZ1Rhc2tDb3VudE1heChjb25zdCBzaXplX3QgdmFsdWUpIHsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgcGVuZGluZ1Rhc2tDb3VudE1heF8gPSB2YWx1ZTsKKyAgfQorCisgIHZvaWQgYWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlLCBpbnQ2NF90IHRpbWVvdXQsIGludDY0X3QgZXhwaXJhdGlvbik7CisKKyAgdm9pZCByZW1vdmUoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayk7CisKKyAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcmVtb3ZlTmV4dFBlbmRpbmcoKTsKKworICB2b2lkIHJlbW92ZUV4cGlyZWRUYXNrcygpIHsKKyAgICByZW1vdmVFeHBpcmVkKGZhbHNlKTsKKyAgfQorCisgIHZvaWQgc2V0RXhwaXJlQ2FsbGJhY2soRXhwaXJlQ2FsbGJhY2sgZXhwaXJlQ2FsbGJhY2spOworCitwcml2YXRlOgorICAvKioKKyAgICogUmVtb3ZlIG9uZSBvciBtb3JlIGV4cGlyZWQgdGFza3MuCisgICAqIFxwYXJhbVtpbl0gIGp1c3RPbmUgIGlmIHRydWUsIHRyeSB0byByZW1vdmUganVzdCBvbmUgdGFzayBhbmQgcmV0dXJuCisgICAqLworICB2b2lkIHJlbW92ZUV4cGlyZWQoYm9vbCBqdXN0T25lKTsKKworICAvKioKKyAgICogXHJldHVybnMgd2hldGhlciBpdCBpcyBhY2NlcHRhYmxlIHRvIGJsb2NrLCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgdGhyZWFkIGlkCisgICAqLworICBib29sIGNhblNsZWVwKCkgY29uc3Q7CisKKyAgLyoqCisgICAqIExvd2VycyB0aGUgbWF4aW11bSB3b3JrZXIgY291bnQgYW5kIGJsb2NrcyB1bnRpbCBlbm91Z2ggd29ya2VyIHRocmVhZHMgY29tcGxldGUKKyAgICogdG8gZ2V0IHRvIHRoZSBuZXcgbWF4aW11bSB3b3JrZXIgbGltaXQuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhY3F1aXJpbmcKKyAgICogYSBsb2NrIG9uIHRoZSBjbGFzcyBtdXRleF8uCisgICAqLworICB2b2lkIHJlbW92ZVdvcmtlcnNVbmRlckxvY2soc2l6ZV90IHZhbHVlKTsKKworICBzaXplX3Qgd29ya2VyQ291bnRfOworICBzaXplX3Qgd29ya2VyTWF4Q291bnRfOworICBzaXplX3QgaWRsZUNvdW50XzsKKyAgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXhfOworICBzaXplX3QgZXhwaXJlZENvdW50XzsKKyAgRXhwaXJlQ2FsbGJhY2sgZXhwaXJlQ2FsbGJhY2tfOworCisgIFRocmVhZE1hbmFnZXI6OlNUQVRFIHN0YXRlXzsKKyAgc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5XzsKKworICBmcmllbmQgY2xhc3MgVGhyZWFkTWFuYWdlcjo6VGFzazsKKyAgdHlwZWRlZiBzdGQ6OmRlcXVlPHNoYXJlZF9wdHI8VGFzaz4gPiBUYXNrUXVldWU7CisgIFRhc2tRdWV1ZSB0YXNrc187CisgIE11dGV4IG11dGV4XzsKKyAgTW9uaXRvciBtb25pdG9yXzsKKyAgTW9uaXRvciBtYXhNb25pdG9yXzsKKyAgTW9uaXRvciB3b3JrZXJNb25pdG9yXzsgICAgICAgLy8gdXNlZCB0byBzeW5jaHJvbml6ZSBjaGFuZ2VzIGluIHdvcmtlciBjb3VudAorCisgIGZyaWVuZCBjbGFzcyBUaHJlYWRNYW5hZ2VyOjpXb3JrZXI7CisgIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+IHdvcmtlcnNfOworICBzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPiBkZWFkV29ya2Vyc187CisgIHN0ZDo6bWFwPGNvbnN0IFRocmVhZDo6aWRfdCwgc2hhcmVkX3B0cjxUaHJlYWQ+ID4gaWRNYXBfOworfTsKKworY2xhc3MgVGhyZWFkTWFuYWdlcjo6VGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7CisKK3B1YmxpYzoKKyAgZW51bSBTVEFURSB7IFdBSVRJTkcsIEVYRUNVVElORywgVElNRURPVVQsIENPTVBMRVRFIH07CisKKyAgVGFzayhzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSwgaW50NjRfdCBleHBpcmF0aW9uID0gMExMKQorICAgIDogcnVubmFibGVfKHJ1bm5hYmxlKSwKKyAgICAgIHN0YXRlXyhXQUlUSU5HKSwKKyAgICAgIGV4cGlyZVRpbWVfKGV4cGlyYXRpb24gIT0gMExMID8gVXRpbDo6Y3VycmVudFRpbWUoKSArIGV4cGlyYXRpb24gOiAwTEwpIHt9CisKKyAgflRhc2soKSB7fQorCisgIHZvaWQgcnVuKCkgeworICAgIGlmIChzdGF0ZV8gPT0gRVhFQ1VUSU5HKSB7CisgICAgICBydW5uYWJsZV8tPnJ1bigpOworICAgICAgc3RhdGVfID0gQ09NUExFVEU7CisgICAgfQorICB9CisKKyAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gZ2V0UnVubmFibGUoKSB7IHJldHVybiBydW5uYWJsZV87IH0KKworICBpbnQ2NF90IGdldEV4cGlyZVRpbWUoKSBjb25zdCB7IHJldHVybiBleHBpcmVUaW1lXzsgfQorCitwcml2YXRlOgorICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZV87CisgIGZyaWVuZCBjbGFzcyBUaHJlYWRNYW5hZ2VyOjpXb3JrZXI7CisgIFNUQVRFIHN0YXRlXzsKKyAgaW50NjRfdCBleHBpcmVUaW1lXzsKK307CisKK2NsYXNzIFRocmVhZE1hbmFnZXI6OldvcmtlciA6IHB1YmxpYyBSdW5uYWJsZSB7CisgIGVudW0gU1RBVEUgeyBVTklOSVRJQUxJWkVELCBTVEFSVElORywgU1RBUlRFRCwgU1RPUFBJTkcsIFNUT1BQRUQgfTsKKworcHVibGljOgorICBXb3JrZXIoVGhyZWFkTWFuYWdlcjo6SW1wbCogbWFuYWdlcikgOiBtYW5hZ2VyXyhtYW5hZ2VyKSwgc3RhdGVfKFVOSU5JVElBTElaRUQpIHt9CisKKyAgfldvcmtlcigpIHt9CisKK3ByaXZhdGU6CisgIGJvb2wgaXNBY3RpdmUoKSBjb25zdCB7CisgICAgcmV0dXJuIChtYW5hZ2VyXy0+d29ya2VyQ291bnRfIDw9IG1hbmFnZXJfLT53b3JrZXJNYXhDb3VudF8pCisgICAgICAgICAgIHx8IChtYW5hZ2VyXy0+c3RhdGVfID09IEpPSU5JTkcgJiYgIW1hbmFnZXJfLT50YXNrc18uZW1wdHkoKSk7CisgIH0KKworcHVibGljOgorICAvKioKKyAgICogV29ya2VyIGVudHJ5IHBvaW50CisgICAqCisgICAqIEFzIGxvbmcgYXMgd29ya2VyIHRocmVhZCBpcyBydW5uaW5nLCBwdWxsIHRhc2tzIG9mZiB0aGUgdGFzayBxdWV1ZSBhbmQKKyAgICogZXhlY3V0ZS4KKyAgICovCisgIHZvaWQgcnVuKCkgeworICAgIEd1YXJkIGcobWFuYWdlcl8tPm11dGV4Xyk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBoYXMgdGhyZWUgcGFydHM7IG9uZSBpcyB0byBjaGVjayBmb3IgYW5kIGFjY291bnQgZm9yCisgICAgICogYWRtaXR0aW5nIGEgdGFzayB3aGljaCBoYXBwZW5zIHVuZGVyIGEgbG9jay4gIFRoZW4gdGhlIGxvY2sgaXMgcmVsZWFzZWQKKyAgICAgKiBhbmQgdGhlIHRhc2sgaXRzZWxmIGlzIGV4ZWN1dGVkLiAgRmluYWxseSB3ZSBkbyBzb21lIGFjY291bnRpbmcKKyAgICAgKiB1bmRlciBsb2NrIGFnYWluIHdoZW4gdGhlIHRhc2sgY29tcGxldGVzLgorICAgICAqLworCisgICAgLyoqCisgICAgICogQWRtaXR0aW5nCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBJbmNyZW1lbnQgd29ya2VyIHNlbWFwaG9yZSBhbmQgbm90aWZ5IG1hbmFnZXIgaWYgd29ya2VyIGNvdW50IHJlYWNoZWQKKyAgICAgKiBkZXNpcmVkIG1heAorICAgICAqLworICAgIGJvb2wgYWN0aXZlID0gbWFuYWdlcl8tPndvcmtlckNvdW50XyA8IG1hbmFnZXJfLT53b3JrZXJNYXhDb3VudF87CisgICAgaWYgKGFjdGl2ZSkgeworICAgICAgaWYgKCsrbWFuYWdlcl8tPndvcmtlckNvdW50XyA9PSBtYW5hZ2VyXy0+d29ya2VyTWF4Q291bnRfKSB7CisgICAgICAgIG1hbmFnZXJfLT53b3JrZXJNb25pdG9yXy5ub3RpZnkoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZSAoYWN0aXZlKSB7CisgICAgICAvKioKKyAgICAgICAgKiBXaGlsZSBob2xkaW5nIG1hbmFnZXIgbW9uaXRvciBibG9jayBmb3Igbm9uLWVtcHR5IHRhc2sgcXVldWUgKEFsc28KKyAgICAgICAgKiBjaGVjayB0aGF0IHRoZSB0aHJlYWQgaGFzbid0IGJlZW4gcmVxdWVzdGVkIHRvIHN0b3ApLiBPbmNlIHRoZSBxdWV1ZQorICAgICAgICAqIGlzIG5vbi1lbXB0eSwgZGVxdWV1ZSBhIHRhc2ssIHJlbGVhc2UgbW9uaXRvciwgYW5kIGV4ZWN1dGUuIElmIHRoZQorICAgICAgICAqIHdvcmtlciBtYXggY291bnQgaGFzIGJlZW4gZGVjcmVtZW50ZWQgc3VjaCB0aGF0IHdlIGV4Y2VlZCBpdCwgbWFyaworICAgICAgICAqIG91cnNlbGYgaW5hY3RpdmUsIGRlY3JlbWVudCB0aGUgd29ya2VyIGNvdW50IGFuZCBub3RpZnkgdGhlIG1hbmFnZXIKKyAgICAgICAgKiAodGVjaG5pY2FsbHkgd2UncmUgbm90aWZ5aW5nIHRoZSBuZXh0IGJsb2NrZWQgdGhyZWFkIGJ1dCBldmVudHVhbGx5CisgICAgICAgICogdGhlIG1hbmFnZXIgd2lsbCBzZWUgaXQuCisgICAgICAgICovCisgICAgICBhY3RpdmUgPSBpc0FjdGl2ZSgpOworCisgICAgICB3aGlsZSAoYWN0aXZlICYmIG1hbmFnZXJfLT50YXNrc18uZW1wdHkoKSkgeworICAgICAgICBtYW5hZ2VyXy0+aWRsZUNvdW50XysrOworICAgICAgICBtYW5hZ2VyXy0+bW9uaXRvcl8ud2FpdCgpOworICAgICAgICBhY3RpdmUgPSBpc0FjdGl2ZSgpOworICAgICAgICBtYW5hZ2VyXy0+aWRsZUNvdW50Xy0tOworICAgICAgfQorCisgICAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6OlRhc2s+IHRhc2s7CisKKyAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgaWYgKCFtYW5hZ2VyXy0+dGFza3NfLmVtcHR5KCkpIHsKKyAgICAgICAgICB0YXNrID0gbWFuYWdlcl8tPnRhc2tzXy5mcm9udCgpOworICAgICAgICAgIG1hbmFnZXJfLT50YXNrc18ucG9wX2Zyb250KCk7CisgICAgICAgICAgaWYgKHRhc2stPnN0YXRlXyA9PSBUaHJlYWRNYW5hZ2VyOjpUYXNrOjpXQUlUSU5HKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgc3RhdGUgaXMgY2hhbmdlZCB0byBhbnl0aGluZyBvdGhlciB0aGFuIEVYRUNVVElORyBvciBUSU1FRE9VVCBoZXJlCisgICAgICAgICAgICAvLyB0aGVuIHRoZSBleGVjdXRpb24gbG9vcCBuZWVkcyB0byBiZSBjaGFuZ2VkIGJlbG93LgorICAgICAgICAgICAgdGFzay0+c3RhdGVfID0KKyAgICAgICAgICAgICAgICAodGFzay0+Z2V0RXhwaXJlVGltZSgpICYmIHRhc2stPmdldEV4cGlyZVRpbWUoKSA8IFV0aWw6OmN1cnJlbnRUaW1lKCkpID8KKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkTWFuYWdlcjo6VGFzazo6VElNRURPVVQgOgorICAgICAgICAgICAgICAgICAgICBUaHJlYWRNYW5hZ2VyOjpUYXNrOjpFWEVDVVRJTkc7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogSWYgd2UgaGF2ZSBhIHBlbmRpbmcgdGFzayBtYXggYW5kIHdlIGp1c3QgZHJvcHBlZCBiZWxvdyBpdCwgd2FrZXVwIGFueQorICAgICAgICAgICAgdGhyZWFkIHRoYXQgbWlnaHQgYmUgYmxvY2tlZCBvbiBhZGQuICovCisgICAgICAgIGlmIChtYW5hZ2VyXy0+cGVuZGluZ1Rhc2tDb3VudE1heF8gIT0gMAorICAgICAgICAgICAgJiYgbWFuYWdlcl8tPnRhc2tzXy5zaXplKCkgPD0gbWFuYWdlcl8tPnBlbmRpbmdUYXNrQ291bnRNYXhfIC0gMSkgeworICAgICAgICAgIG1hbmFnZXJfLT5tYXhNb25pdG9yXy5ub3RpZnkoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEV4ZWN1dGlvbiAtIG5vdCBob2xkaW5nIGEgbG9jaworICAgICAgICovCisgICAgICBpZiAodGFzaykgeworICAgICAgICBpZiAodGFzay0+c3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlRhc2s6OkVYRUNVVElORykgeworCisgICAgICAgICAgLy8gUmVsZWFzZSB0aGUgbG9jayBzbyB3ZSBjYW4gcnVuIHRoZSB0YXNrIHdpdGhvdXQgYmxvY2tpbmcgdGhlIHRocmVhZCBtYW5hZ2VyCisgICAgICAgICAgbWFuYWdlcl8tPm11dGV4Xy51bmxvY2soKTsKKworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YXNrLT5ydW4oKTsKKyAgICAgICAgICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZSkgeworICAgICAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiW0VSUk9SXSB0YXNrLT5ydW4oKSByYWlzZWQgYW4gZXhjZXB0aW9uOiAlcyIsIGUud2hhdCgpKTsKKyAgICAgICAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIltFUlJPUl0gdGFzay0+cnVuKCkgcmFpc2VkIGFuIHVua25vd24gZXhjZXB0aW9uIik7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gUmUtYWNxdWlyZSB0aGUgbG9jayB0byBwcm9jZWVkIGluIHRoZSB0aHJlYWQgbWFuYWdlcgorICAgICAgICAgIG1hbmFnZXJfLT5tdXRleF8ubG9jaygpOworCisgICAgICAgIH0gZWxzZSBpZiAobWFuYWdlcl8tPmV4cGlyZUNhbGxiYWNrXykgeworICAgICAgICAgIC8vIFRoZSBvbmx5IG90aGVyIHN0YXRlIHRoZSB0YXNrIGNvdWxkIGhhdmUgYmVlbiBpbiBpcyBUSU1FRE9VVCAoc2VlIGFib3ZlKQorICAgICAgICAgIG1hbmFnZXJfLT5leHBpcmVDYWxsYmFja18odGFzay0+Z2V0UnVubmFibGUoKSk7CisgICAgICAgICAgbWFuYWdlcl8tPmV4cGlyZWRDb3VudF8rKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmFsIGFjY291bnRpbmcgZm9yIHRoZSB3b3JrZXIgdGhyZWFkIHRoYXQgaXMgZG9uZSB3b3JraW5nCisgICAgICovCisgICAgbWFuYWdlcl8tPmRlYWRXb3JrZXJzXy5pbnNlcnQodGhpcy0+dGhyZWFkKCkpOworICAgIGlmICgtLW1hbmFnZXJfLT53b3JrZXJDb3VudF8gPT0gbWFuYWdlcl8tPndvcmtlck1heENvdW50XykgeworICAgICAgbWFuYWdlcl8tPndvcmtlck1vbml0b3JfLm5vdGlmeSgpOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICBUaHJlYWRNYW5hZ2VyOjpJbXBsKiBtYW5hZ2VyXzsKKyAgZnJpZW5kIGNsYXNzIFRocmVhZE1hbmFnZXI6OkltcGw7CisgIFNUQVRFIHN0YXRlXzsKK307CisKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6YWRkV29ya2VyKHNpemVfdCB2YWx1ZSkgeworICBzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPiBuZXdUaHJlYWRzOworICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgdmFsdWU7IGl4KyspIHsKKyAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6Oldvcmtlcj4gd29ya2VyCisgICAgICAgID0gc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpXb3JrZXI+KG5ldyBUaHJlYWRNYW5hZ2VyOjpXb3JrZXIodGhpcykpOworICAgIG5ld1RocmVhZHMuaW5zZXJ0KHRocmVhZEZhY3RvcnlfLT5uZXdUaHJlYWQod29ya2VyKSk7CisgIH0KKworICBHdWFyZCBnKG11dGV4Xyk7CisgIHdvcmtlck1heENvdW50XyArPSB2YWx1ZTsKKyAgd29ya2Vyc18uaW5zZXJ0KG5ld1RocmVhZHMuYmVnaW4oKSwgbmV3VGhyZWFkcy5lbmQoKSk7CisKKyAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPjo6aXRlcmF0b3IgaXggPSBuZXdUaHJlYWRzLmJlZ2luKCk7IGl4ICE9IG5ld1RocmVhZHMuZW5kKCk7CisgICAgICAgKytpeCkgeworICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6V29ya2VyPiB3b3JrZXIKKyAgICAgICAgPSBkeW5hbWljX3BvaW50ZXJfY2FzdDxUaHJlYWRNYW5hZ2VyOjpXb3JrZXIsIFJ1bm5hYmxlPigoKml4KS0+cnVubmFibGUoKSk7CisgICAgd29ya2VyLT5zdGF0ZV8gPSBUaHJlYWRNYW5hZ2VyOjpXb3JrZXI6OlNUQVJUSU5HOworICAgICgqaXgpLT5zdGFydCgpOworICAgIGlkTWFwXy5pbnNlcnQoc3RkOjpwYWlyPGNvbnN0IFRocmVhZDo6aWRfdCwgc2hhcmVkX3B0cjxUaHJlYWQ+ID4oKCppeCktPmdldElkKCksICppeCkpOworICB9CisKKyAgd2hpbGUgKHdvcmtlckNvdW50XyAhPSB3b3JrZXJNYXhDb3VudF8pIHsKKyAgICB3b3JrZXJNb25pdG9yXy53YWl0KCk7CisgIH0KK30KKwordm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpzdGFydCgpIHsKKyAgR3VhcmQgZyhtdXRleF8pOworICBpZiAoc3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoc3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlVOSU5JVElBTElaRUQpIHsKKyAgICBpZiAoIXRocmVhZEZhY3RvcnlfKSB7CisgICAgICB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICB9CisgICAgc3RhdGVfID0gVGhyZWFkTWFuYWdlcjo6U1RBUlRFRDsKKyAgICBtb25pdG9yXy5ub3RpZnlBbGwoKTsKKyAgfQorCisgIHdoaWxlIChzdGF0ZV8gPT0gU1RBUlRJTkcpIHsKKyAgICBtb25pdG9yXy53YWl0KCk7CisgIH0KK30KKwordm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpzdG9wKCkgeworICBHdWFyZCBnKG11dGV4Xyk7CisgIGJvb2wgZG9TdG9wID0gZmFsc2U7CisKKyAgaWYgKHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpTVE9QUElORyAmJiBzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6Sk9JTklORworICAgICAgJiYgc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQpIHsKKyAgICBkb1N0b3AgPSB0cnVlOworICAgIHN0YXRlXyA9IFRocmVhZE1hbmFnZXI6OkpPSU5JTkc7CisgIH0KKworICBpZiAoZG9TdG9wKSB7CisgICAgcmVtb3ZlV29ya2Vyc1VuZGVyTG9jayh3b3JrZXJDb3VudF8pOworICB9CisKKyAgc3RhdGVfID0gVGhyZWFkTWFuYWdlcjo6U1RPUFBFRDsKK30KKwordm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmVXb3JrZXIoc2l6ZV90IHZhbHVlKSB7CisgIEd1YXJkIGcobXV0ZXhfKTsKKyAgcmVtb3ZlV29ya2Vyc1VuZGVyTG9jayh2YWx1ZSk7Cit9CisKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlV29ya2Vyc1VuZGVyTG9jayhzaXplX3QgdmFsdWUpIHsKKyAgaWYgKHZhbHVlID4gd29ya2VyTWF4Q291bnRfKSB7CisgICAgdGhyb3cgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgIH0KKworICB3b3JrZXJNYXhDb3VudF8gLT0gdmFsdWU7CisKKyAgaWYgKGlkbGVDb3VudF8gPiB2YWx1ZSkgeworICAgIC8vIFRoZXJlIGFyZSBtb3JlIGlkbGUgd29ya2VycyB0aGFuIHdlIG5lZWQgdG8gcmVtb3ZlLAorICAgIC8vIHNvIG5vdGlmeSBlbm91Z2ggb2YgdGhlbSBzbyB0aGV5IGNhbiB0ZXJtaW5hdGUuCisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IHZhbHVlOyBpeCsrKSB7CisgICAgICBtb25pdG9yXy5ub3RpZnkoKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gVGhlcmUgYXJlIGFzIG1hbnkgb3IgbGVzcyBpZGxlIHdvcmtlcnMgdGhhbiB3ZSBuZWVkIHRvIHJlbW92ZSwKKyAgICAvLyBzbyBqdXN0IG5vdGlmeSB0aGVtIGFsbCBzbyB0aGV5IGNhbiB0ZXJtaW5hdGUuCisgICAgbW9uaXRvcl8ubm90aWZ5QWxsKCk7CisgIH0KKworICB3aGlsZSAod29ya2VyQ291bnRfICE9IHdvcmtlck1heENvdW50XykgeworICAgIHdvcmtlck1vbml0b3JfLndhaXQoKTsKKyAgfQorCisgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID46Oml0ZXJhdG9yIGl4ID0gZGVhZFdvcmtlcnNfLmJlZ2luKCk7CisgICAgICAgaXggIT0gZGVhZFdvcmtlcnNfLmVuZCgpOworICAgICAgICsraXgpIHsKKworICAgIC8vIHdoZW4gdXNlZCB3aXRoIGEgam9pbmFibGUgdGhyZWFkIGZhY3RvcnksIHdlIGpvaW4gdGhlIHRocmVhZHMgYXMgd2UgcmVtb3ZlIHRoZW0KKyAgICBpZiAoIXRocmVhZEZhY3RvcnlfLT5pc0RldGFjaGVkKCkpIHsKKyAgICAgICgqaXgpLT5qb2luKCk7CisgICAgfQorCisgICAgaWRNYXBfLmVyYXNlKCgqaXgpLT5nZXRJZCgpKTsKKyAgICB3b3JrZXJzXy5lcmFzZSgqaXgpOworICB9CisKKyAgZGVhZFdvcmtlcnNfLmNsZWFyKCk7Cit9CisKK2Jvb2wgVGhyZWFkTWFuYWdlcjo6SW1wbDo6Y2FuU2xlZXAoKSBjb25zdCB7CisgIGNvbnN0IFRocmVhZDo6aWRfdCBpZCA9IHRocmVhZEZhY3RvcnlfLT5nZXRDdXJyZW50VGhyZWFkSWQoKTsKKyAgcmV0dXJuIGlkTWFwXy5maW5kKGlkKSA9PSBpZE1hcF8uZW5kKCk7Cit9CisKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6YWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlLCBpbnQ2NF90IHRpbWVvdXQsIGludDY0X3QgZXhwaXJhdGlvbikgeworICBHdWFyZCBnKG11dGV4XywgdGltZW91dCk7CisKKyAgaWYgKCFnKSB7CisgICAgdGhyb3cgVGltZWRPdXRFeGNlcHRpb24oKTsKKyAgfQorCisgIGlmIChzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6U1RBUlRFRCkgeworICAgIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgIlRocmVhZE1hbmFnZXI6OkltcGw6OmFkZCBUaHJlYWRNYW5hZ2VyICIKKyAgICAgICAgIm5vdCBzdGFydGVkIik7CisgIH0KKworICAvLyBpZiB3ZSdyZSBhdCBhIGxpbWl0LCByZW1vdmUgYW4gZXhwaXJlZCB0YXNrIHRvIHNlZSBpZiB0aGUgbGltaXQgY2xlYXJzCisgIGlmIChwZW5kaW5nVGFza0NvdW50TWF4XyA+IDAgJiYgKHRhc2tzXy5zaXplKCkgPj0gcGVuZGluZ1Rhc2tDb3VudE1heF8pKSB7CisgICAgcmVtb3ZlRXhwaXJlZCh0cnVlKTsKKyAgfQorCisgIGlmIChwZW5kaW5nVGFza0NvdW50TWF4XyA+IDAgJiYgKHRhc2tzXy5zaXplKCkgPj0gcGVuZGluZ1Rhc2tDb3VudE1heF8pKSB7CisgICAgaWYgKGNhblNsZWVwKCkgJiYgdGltZW91dCA+PSAwKSB7CisgICAgICB3aGlsZSAocGVuZGluZ1Rhc2tDb3VudE1heF8gPiAwICYmIHRhc2tzXy5zaXplKCkgPj0gcGVuZGluZ1Rhc2tDb3VudE1heF8pIHsKKyAgICAgICAgLy8gVGhpcyBpcyB0aHJlYWQgc2FmZSBiZWNhdXNlIHRoZSBtdXRleCBpcyBzaGFyZWQgYmV0d2VlbiBtb25pdG9ycy4KKyAgICAgICAgbWF4TW9uaXRvcl8ud2FpdCh0aW1lb3V0KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbigpOworICAgIH0KKyAgfQorCisgIHRhc2tzXy5wdXNoX2JhY2soc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpUYXNrPihuZXcgVGhyZWFkTWFuYWdlcjo6VGFzayh2YWx1ZSwgZXhwaXJhdGlvbikpKTsKKworICAvLyBJZiBpZGxlIHRocmVhZCBpcyBhdmFpbGFibGUgbm90aWZ5IGl0LCBvdGhlcndpc2UgYWxsIHdvcmtlciB0aHJlYWRzIGFyZQorICAvLyBydW5uaW5nIGFuZCB3aWxsIGdldCBhcm91bmQgdG8gdGhpcyB0YXNrIGluIHRpbWUuCisgIGlmIChpZGxlQ291bnRfID4gMCkgeworICAgIG1vbml0b3JfLm5vdGlmeSgpOworICB9Cit9CisKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spIHsKKyAgR3VhcmQgZyhtdXRleF8pOworICBpZiAoc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUQVJURUQpIHsKKyAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICJUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmUgVGhyZWFkTWFuYWdlciBub3QgIgorICAgICAgICAic3RhcnRlZCIpOworICB9CisKKyAgZm9yIChUYXNrUXVldWU6Oml0ZXJhdG9yIGl0ID0gdGFza3NfLmJlZ2luKCk7IGl0ICE9IHRhc2tzXy5lbmQoKTsgKytpdCkKKyAgeworICAgIGlmICgoKml0KS0+Z2V0UnVubmFibGUoKSA9PSB0YXNrKQorICAgIHsKKyAgICAgIHRhc2tzXy5lcmFzZShpdCk7CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlTmV4dFBlbmRpbmcoKSB7CisgIEd1YXJkIGcobXV0ZXhfKTsKKyAgaWYgKHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpTVEFSVEVEKSB7CisgICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAiVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlTmV4dFBlbmRpbmcgIgorICAgICAgICAiVGhyZWFkTWFuYWdlciBub3Qgc3RhcnRlZCIpOworICB9CisKKyAgaWYgKHRhc2tzXy5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4oKTsKKyAgfQorCisgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6VGFzaz4gdGFzayA9IHRhc2tzXy5mcm9udCgpOworICB0YXNrc18ucG9wX2Zyb250KCk7CisKKyAgcmV0dXJuIHRhc2stPmdldFJ1bm5hYmxlKCk7Cit9CisKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlRXhwaXJlZChib29sIGp1c3RPbmUpIHsKKyAgLy8gdGhpcyBpcyBhbHdheXMgY2FsbGVkIHVuZGVyIGEgbG9jaworICBpbnQ2NF90IG5vdyA9IDBMTDsKKworICBmb3IgKFRhc2tRdWV1ZTo6aXRlcmF0b3IgaXQgPSB0YXNrc18uYmVnaW4oKTsgaXQgIT0gdGFza3NfLmVuZCgpOyApCisgIHsKKyAgICBpZiAobm93ID09IDBMTCkgeworICAgICAgbm93ID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICB9CisKKyAgICBpZiAoKCppdCktPmdldEV4cGlyZVRpbWUoKSA+IDBMTCAmJiAoKml0KS0+Z2V0RXhwaXJlVGltZSgpIDwgbm93KSB7CisgICAgICBpZiAoZXhwaXJlQ2FsbGJhY2tfKSB7CisgICAgICAgIGV4cGlyZUNhbGxiYWNrXygoKml0KS0+Z2V0UnVubmFibGUoKSk7CisgICAgICB9CisgICAgICBpdCA9IHRhc2tzXy5lcmFzZShpdCk7CisgICAgICArK2V4cGlyZWRDb3VudF87CisgICAgICBpZiAoanVzdE9uZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICArK2l0OworICAgIH0KKyAgfQorfQorCit2b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnNldEV4cGlyZUNhbGxiYWNrKEV4cGlyZUNhbGxiYWNrIGV4cGlyZUNhbGxiYWNrKSB7CisgIEd1YXJkIGcobXV0ZXhfKTsKKyAgZXhwaXJlQ2FsbGJhY2tfID0gZXhwaXJlQ2FsbGJhY2s7Cit9CisKK2NsYXNzIFNpbXBsZVRocmVhZE1hbmFnZXIgOiBwdWJsaWMgVGhyZWFkTWFuYWdlcjo6SW1wbCB7CisKK3B1YmxpYzoKKyAgU2ltcGxlVGhyZWFkTWFuYWdlcihzaXplX3Qgd29ya2VyQ291bnQgPSA0LCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heCA9IDApCisgICAgOiB3b3JrZXJDb3VudF8od29ya2VyQ291bnQpLCBwZW5kaW5nVGFza0NvdW50TWF4XyhwZW5kaW5nVGFza0NvdW50TWF4KSB7fQorCisgIHZvaWQgc3RhcnQoKSB7CisgICAgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cGVuZGluZ1Rhc2tDb3VudE1heChwZW5kaW5nVGFza0NvdW50TWF4Xyk7CisgICAgVGhyZWFkTWFuYWdlcjo6SW1wbDo6c3RhcnQoKTsKKyAgICBhZGRXb3JrZXIod29ya2VyQ291bnRfKTsKKyAgfQorCitwcml2YXRlOgorICBjb25zdCBzaXplX3Qgd29ya2VyQ291bnRfOworICBjb25zdCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heF87Cit9OworCitzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IFRocmVhZE1hbmFnZXI6Om5ld1RocmVhZE1hbmFnZXIoKSB7CisgIHJldHVybiBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KG5ldyBUaHJlYWRNYW5hZ2VyOjpJbXBsKCkpOworfQorCitzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoc2l6ZV90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwZW5kaW5nVGFza0NvdW50TWF4KSB7CisgIHJldHVybiBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KG5ldyBTaW1wbGVUaHJlYWRNYW5hZ2VyKGNvdW50LCBwZW5kaW5nVGFza0NvdW50TWF4KSk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcwZmMwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmgKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1RIUkVBRE1BTkFHRVJfSF8KKyNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURNQU5BR0VSX0hfIDEKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKy8qKgorICogVGhyZWFkIFBvb2wgTWFuYWdlciBhbmQgcmVsYXRlZCBjbGFzc2VzCisgKgorICogQHZlcnNpb24gJElkOiQKKyAqLworY2xhc3MgVGhyZWFkTWFuYWdlcjsKKworLyoqCisgKiBUaHJlYWRNYW5hZ2VyIGNsYXNzCisgKgorICogVGhpcyBjbGFzcyBtYW5hZ2VzIGEgcG9vbCBvZiB0aHJlYWRzLiBJdCB1c2VzIGEgVGhyZWFkRmFjdG9yeSB0byBjcmVhdGUKKyAqIHRocmVhZHMuIEl0IG5ldmVyIGFjdHVhbGx5IGNyZWF0ZXMgb3IgZGVzdHJveXMgd29ya2VyIHRocmVhZHMsIHJhdGhlcgorICogaXQgbWFpbnRhaW5zIHN0YXRpc3RpY3Mgb24gbnVtYmVyIG9mIGlkbGUgdGhyZWFkcywgbnVtYmVyIG9mIGFjdGl2ZSB0aHJlYWRzLAorICogdGFzayBiYWNrbG9nLCBhbmQgYXZlcmFnZSB3YWl0IGFuZCBzZXJ2aWNlIHRpbWVzIGFuZCBpbmZvcm1zIHRoZSBQb29sUG9saWN5CisgKiBvYmplY3QgYm91bmQgdG8gaW5zdGFuY2VzIG9mIHRoaXMgbWFuYWdlciBvZiBpbnRlcmVzdGluZyB0cmFuc2l0aW9ucy4gSXQgaXMKKyAqIHRoZW4gdXAgdGhlIFBvb2xQb2xpY3kgb2JqZWN0IHRvIGRlY2lkZSBpZiB0aGUgdGhyZWFkIHBvb2wgc2l6ZSBuZWVkcyB0byBiZQorICogYWRqdXN0ZWQgYW5kIGNhbGwgdGhpcyBvYmplY3QgYWRkV29ya2VyIGFuZCByZW1vdmVXb3JrZXIgbWV0aG9kcyB0byBtYWtlCisgKiBjaGFuZ2VzLgorICoKKyAqIFRoaXMgZGVzaWduIGFsbG93cyBkaWZmZXJlbnQgcG9saWN5IGltcGxlbWVudGF0aW9ucyB0byB1c2UgdGhpcyBjb2RlIHRvCisgKiBoYW5kbGUgYmFzaWMgd29ya2VyIHRocmVhZCBtYW5hZ2VtZW50IGFuZCB3b3JrZXIgdGFzayBleGVjdXRpb24gYW5kIGZvY3VzIG9uCisgKiBwb2xpY3kgaXNzdWVzLiBUaGUgc2ltcGxlc3QgcG9saWN5LCBTdGF0aWNQb2xpY3ksIGRvZXMgbm90aGluZyBvdGhlciB0aGFuCisgKiBjcmVhdGUgYSBmaXhlZCBudW1iZXIgb2YgdGhyZWFkcy4KKyAqLworY2xhc3MgVGhyZWFkTWFuYWdlciB7CisKK3Byb3RlY3RlZDoKKyAgVGhyZWFkTWFuYWdlcigpIHt9CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPik+IEV4cGlyZUNhbGxiYWNrOworCisgIHZpcnR1YWwgflRocmVhZE1hbmFnZXIoKSB7fQorCisgIC8qKgorICAgKiBTdGFydHMgdGhlIHRocmVhZCBtYW5hZ2VyLiBWZXJpZmllcyBhbGwgYXR0cmlidXRlcyBoYXZlIGJlZW4gcHJvcGVybHkKKyAgICogaW5pdGlhbGl6ZWQsIHRoZW4gYWxsb2NhdGVzIG5lY2Vzc2FyeSByZXNvdXJjZXMgdG8gYmVnaW4gb3BlcmF0aW9uCisgICAqLworICB2aXJ0dWFsIHZvaWQgc3RhcnQoKSA9IDA7CisKKyAgLyoqCisgICAqIFN0b3BzIHRoZSB0aHJlYWQgbWFuYWdlci4gQWJvcnRzIGFsbCByZW1haW5pbmcgdW5wcm9jZXNzZWQgdGFzaywgc2h1dHMKKyAgICogZG93biBhbGwgY3JlYXRlZCB3b3JrZXIgdGhyZWFkcywgYW5kIHJlbGVhc2VzIGFsbCBhbGxvY2F0ZWQgcmVzb3VyY2VzLgorICAgKiBUaGlzIG1ldGhvZCBibG9ja3MgZm9yIGFsbCB3b3JrZXIgdGhyZWFkcyB0byBjb21wbGV0ZSwgdGh1cyBpdCBjYW4KKyAgICogcG90ZW50aWFsbHkgYmxvY2sgZm9yZXZlciBpZiBhIHdvcmtlciB0aHJlYWQgaXMgcnVubmluZyBhIHRhc2sgdGhhdAorICAgKiB3b24ndCB0ZXJtaW5hdGUuCisgICAqCisgICAqIFdvcmtlciB0aHJlYWRzIHdpbGwgYmUgam9pbmVkIGRlcGVuZGluZyBvbiB0aGUgdGhyZWFkRmFjdG9yeSdzIGRldGFjaGVkCisgICAqIGRpc3Bvc2l0aW9uLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHN0b3AoKSA9IDA7CisKKyAgZW51bSBTVEFURSB7IFVOSU5JVElBTElaRUQsIFNUQVJUSU5HLCBTVEFSVEVELCBKT0lOSU5HLCBTVE9QUElORywgU1RPUFBFRCB9OworCisgIHZpcnR1YWwgU1RBVEUgc3RhdGUoKSBjb25zdCA9IDA7CisKKyAgLyoqCisgICAqIFxyZXR1cm5zIHRoZSBjdXJyZW50IHRocmVhZCBmYWN0b3J5CisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KCkgY29uc3QgPSAwOworCisgIC8qKgorICAgKiBTZXQgdGhlIHRocmVhZCBmYWN0b3J5LgorICAgKiBcdGhyb3dzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbmV3IHRocmVhZCBmYWN0b3J5IGhhcyBhIGRpZmZlcmVudAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhY2hlZCBkaXNwb3NpdGlvbiB0aGFuIHRoZSBvbmUgcmVwbGFjaW5nIGl0CisgICAqLworICB2aXJ0dWFsIHZvaWQgdGhyZWFkRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdmFsdWUpID0gMDsKKworICAvKioKKyAgICogQWRkcyB3b3JrZXIgdGhyZWFkKHMpLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGFkZFdvcmtlcihzaXplX3QgdmFsdWUgPSAxKSA9IDA7CisKKyAgLyoqCisgICAqIFJlbW92ZXMgd29ya2VyIHRocmVhZChzKS4KKyAgICogVGhyZWFkcyBhcmUgam9pbmVkIGlmIHRoZSB0aHJlYWQgZmFjdG9yeSBkZXRhY2hlZCBkaXNwb3NpdGlvbiBhbGxvd3MgaXQuCisgICAqIEJsb2NrcyB1bnRpbCB0aGUgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIHJlYWNoZXMgdGhlIG5ldyBsaW1pdC4KKyAgICogXHBhcmFtW2luXSAgdmFsdWUgIHRoZSBudW1iZXIgdG8gcmVtb3ZlCisgICAqIFx0aHJvd3MgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlcgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB3b3JrZXJzCisgICAqLworICB2aXJ0dWFsIHZvaWQgcmVtb3ZlV29ya2VyKHNpemVfdCB2YWx1ZSA9IDEpID0gMDsKKworICAvKioKKyAgICogR2V0cyB0aGUgY3VycmVudCBudW1iZXIgb2YgaWRsZSB3b3JrZXIgdGhyZWFkcworICAgKi8KKyAgdmlydHVhbCBzaXplX3QgaWRsZVdvcmtlckNvdW50KCkgY29uc3QgPSAwOworCisgIC8qKgorICAgKiBHZXRzIHRoZSBjdXJyZW50IG51bWJlciBvZiB0b3RhbCB3b3JrZXIgdGhyZWFkcworICAgKi8KKyAgdmlydHVhbCBzaXplX3Qgd29ya2VyQ291bnQoKSBjb25zdCA9IDA7CisKKyAgLyoqCisgICAqIEdldHMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHBlbmRpbmcgdGFza3MKKyAgICovCisgIHZpcnR1YWwgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnQoKSBjb25zdCA9IDA7CisKKyAgLyoqCisgICAqIEdldHMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHBlbmRpbmcgYW5kIGV4ZWN1dGluZyB0YXNrcworICAgKi8KKyAgdmlydHVhbCBzaXplX3QgdG90YWxUYXNrQ291bnQoKSBjb25zdCA9IDA7CisKKyAgLyoqCisgICAqIEdldHMgdGhlIG1heGltdW0gcGVuZGluZyB0YXNrIGNvdW50LiAgMCBpbmRpY2F0ZXMgbm8gbWF4aW11bQorICAgKi8KKyAgdmlydHVhbCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heCgpIGNvbnN0ID0gMDsKKworICAvKioKKyAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHRhc2tzIHdoaWNoIGhhdmUgYmVlbiBleHBpcmVkIHdpdGhvdXQgYmVpbmcgcnVuCisgICAqIHNpbmNlIHN0YXJ0KCkgd2FzIGNhbGxlZC4KKyAgICovCisgIHZpcnR1YWwgc2l6ZV90IGV4cGlyZWRUYXNrQ291bnQoKSA9IDA7CisKKyAgLyoqCisgICAqIEFkZHMgYSB0YXNrIHRvIGJlIGV4ZWN1dGVkIGF0IHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlIGJ5IGEgd29ya2VyIHRocmVhZC4KKyAgICoKKyAgICogVGhpcyBtZXRob2Qgd2lsbCBibG9jayBpZiBwZW5kaW5nVGFza0NvdW50TWF4KCkgaW4gbm90IHplcm8gYW5kIHBlbmRpbmdUYXNrQ291bnQoKQorICAgKiBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWx0IHRvIHBlbmRpbmdUYXNrQ291bnRNYXgoKS4gIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbiB0aGUKKyAgICogY29udGV4dCBvZiBhIFRocmVhZE1hbmFnZXIgd29ya2VyIHRocmVhZCBpdCB3aWxsIHRocm93IGEKKyAgICogVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbgorICAgKgorICAgKiBAcGFyYW0gdGFzayAgVGhlIHRhc2sgdG8gcXVldWUgZm9yIGV4ZWN1dGlvbgorICAgKgorICAgKiBAcGFyYW0gdGltZW91dCBUaW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzIHRvIGFkZCBhIHRhc2sgd2hlbiBhIHBlbmRpbmctdGFzay1jb3VudAorICAgKiBpcyBzcGVjaWZpZWQuIFNwZWNpZmljIGNhc2VzOgorICAgKiB0aW1lb3V0ID0gMCAgOiBXYWl0IGZvcmV2ZXIgdG8gcXVldWUgdGFzay4KKyAgICogdGltZW91dCA9IC0xIDogUmV0dXJuIGltbWVkaWF0ZWx5IGlmIHBlbmRpbmcgdGFzayBjb3VudCBleGNlZWRzIHNwZWNpZmllZCBtYXgKKyAgICogQHBhcmFtIGV4cGlyYXRpb24gd2hlbiBub256ZXJvLCB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGUgdGFzayBpcyB2YWxpZAorICAgKiB0byBiZSBydW47IGlmIGV4Y2VlZGVkLCB0aGUgdGFzayB3aWxsIGJlIGRyb3BwZWQgb2ZmIHRoZSBxdWV1ZSBhbmQgbm90IHJ1bi4KKyAgICoKKyAgICogQHRocm93cyBUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uIFBlbmRpbmcgdGFzayBjb3VudCBleGNlZWRzIG1heCBwZW5kaW5nIHRhc2sgY291bnQKKyAgICovCisgIHZpcnR1YWwgdm9pZCBhZGQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLAorICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dCA9IDBMTCwKKyAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGV4cGlyYXRpb24gPSAwTEwpID0gMDsKKworICAvKioKKyAgICogUmVtb3ZlcyBhIHBlbmRpbmcgdGFzaworICAgKi8KKyAgdmlydHVhbCB2b2lkIHJlbW92ZShzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spID0gMDsKKworICAvKioKKyAgICogUmVtb3ZlIHRoZSBuZXh0IHBlbmRpbmcgdGFzayB3aGljaCB3b3VsZCBiZSBydW4uCisgICAqCisgICAqIEByZXR1cm4gdGhlIHRhc2sgcmVtb3ZlZC4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiByZW1vdmVOZXh0UGVuZGluZygpID0gMDsKKworICAvKioKKyAgICogUmVtb3ZlIHRhc2tzIGZyb20gZnJvbnQgb2YgdGFzayBxdWV1ZSB0aGF0IGhhdmUgZXhwaXJlZC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCByZW1vdmVFeHBpcmVkVGFza3MoKSA9IDA7CisKKyAgLyoqCisgICAqIFNldCBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEgdGFzayBpcyBleHBpcmVkIGFuZCBub3QgcnVuLgorICAgKgorICAgKiBAcGFyYW0gZXhwaXJlQ2FsbGJhY2sgYSBmdW5jdGlvbiBjYWxsZWQgd2l0aCB0aGUgc2hhcmVkX3B0cjxSdW5uYWJsZT4gZm9yCisgICAqIHRoZSBleHBpcmVkIHRhc2suCisgICAqLworICB2aXJ0dWFsIHZvaWQgc2V0RXhwaXJlQ2FsbGJhY2soRXhwaXJlQ2FsbGJhY2sgZXhwaXJlQ2FsbGJhY2spID0gMDsKKworICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IG5ld1RocmVhZE1hbmFnZXIoKTsKKworICAvKioKKyAgICogQ3JlYXRlcyBhIHNpbXBsZSB0aHJlYWQgbWFuYWdlciB0aGUgdXNlcyBjb3VudCBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgYW5kIGhhcworICAgKiBhIHBlbmRpbmdUYXNrQ291bnRNYXggbWF4aW11bSBwZW5kaW5nIHRhc2tzLiBUaGUgZGVmYXVsdCwgMCwgc3BlY2lmaWVkIG5vIGxpbWl0CisgICAqIG9uIHBlbmRpbmcgdGFza3MKKyAgICovCisgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gbmV3U2ltcGxlVGhyZWFkTWFuYWdlcihzaXplX3QgY291bnQgPSA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heCA9IDApOworCisgIGNsYXNzIFRhc2s7CisKKyAgY2xhc3MgV29ya2VyOworCisgIGNsYXNzIEltcGw7Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURNQU5BR0VSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYTM0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDM0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c2V0PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjp3ZWFrX3B0cjsKKworLyoqCisgKiBUaW1lck1hbmFnZXIgY2xhc3MKKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBUaW1lck1hbmFnZXI6OlRhc2sgOiBwdWJsaWMgUnVubmFibGUgeworCitwdWJsaWM6CisgIGVudW0gU1RBVEUgeyBXQUlUSU5HLCBFWEVDVVRJTkcsIENBTkNFTExFRCwgQ09NUExFVEUgfTsKKworICBUYXNrKHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSA6IHJ1bm5hYmxlXyhydW5uYWJsZSksIHN0YXRlXyhXQUlUSU5HKSB7fQorCisgIH5UYXNrKCkge30KKworICB2b2lkIHJ1bigpIHsKKyAgICBpZiAoc3RhdGVfID09IEVYRUNVVElORykgeworICAgICAgcnVubmFibGVfLT5ydW4oKTsKKyAgICAgIHN0YXRlXyA9IENPTVBMRVRFOworICAgIH0KKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBzaGFyZWRfcHRyPFJ1bm5hYmxlPiAmIHJ1bm5hYmxlKSBjb25zdCB7IHJldHVybiBydW5uYWJsZV8gPT0gcnVubmFibGU7IH0KKworICB0YXNrX2l0ZXJhdG9yIGl0XzsKKworcHJpdmF0ZToKKyAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGVfOworICBmcmllbmQgY2xhc3MgVGltZXJNYW5hZ2VyOjpEaXNwYXRjaGVyOworICBTVEFURSBzdGF0ZV87Cit9OworCitjbGFzcyBUaW1lck1hbmFnZXI6OkRpc3BhdGNoZXIgOiBwdWJsaWMgUnVubmFibGUgeworCitwdWJsaWM6CisgIERpc3BhdGNoZXIoVGltZXJNYW5hZ2VyKiBtYW5hZ2VyKSA6IG1hbmFnZXJfKG1hbmFnZXIpIHt9CisKKyAgfkRpc3BhdGNoZXIoKSB7fQorCisgIC8qKgorICAgKiBEaXNwYXRjaGVyIGVudHJ5IHBvaW50CisgICAqCisgICAqIEFzIGxvbmcgYXMgZGlzcGF0Y2hlciB0aHJlYWQgaXMgcnVubmluZywgcHVsbCB0YXNrcyBvZmYgdGhlIHRhc2sgdGFza01hcF8KKyAgICogYW5kIGV4ZWN1dGUuCisgICAqLworICB2b2lkIHJ1bigpIHsKKyAgICB7CisgICAgICBTeW5jaHJvbml6ZWQgcyhtYW5hZ2VyXy0+bW9uaXRvcl8pOworICAgICAgaWYgKG1hbmFnZXJfLT5zdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpTVEFSVElORykgeworICAgICAgICBtYW5hZ2VyXy0+c3RhdGVfID0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEOworICAgICAgICBtYW5hZ2VyXy0+bW9uaXRvcl8ubm90aWZ5QWxsKCk7CisgICAgICB9CisgICAgfQorCisgICAgZG8geworICAgICAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaW1lck1hbmFnZXI6OlRhc2s+ID4gZXhwaXJlZFRhc2tzOworICAgICAgeworICAgICAgICBTeW5jaHJvbml6ZWQgcyhtYW5hZ2VyXy0+bW9uaXRvcl8pOworICAgICAgICB0YXNrX2l0ZXJhdG9yIGV4cGlyZWRUYXNrRW5kOworICAgICAgICBpbnQ2NF90IG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgICAgIHdoaWxlIChtYW5hZ2VyXy0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRAorICAgICAgICAgICAgICAgJiYgKGV4cGlyZWRUYXNrRW5kID0gbWFuYWdlcl8tPnRhc2tNYXBfLnVwcGVyX2JvdW5kKG5vdykpCisgICAgICAgICAgICAgICAgICA9PSBtYW5hZ2VyXy0+dGFza01hcF8uYmVnaW4oKSkgeworICAgICAgICAgIGludDY0X3QgdGltZW91dCA9IDBMTDsKKyAgICAgICAgICBpZiAoIW1hbmFnZXJfLT50YXNrTWFwXy5lbXB0eSgpKSB7CisgICAgICAgICAgICB0aW1lb3V0ID0gbWFuYWdlcl8tPnRhc2tNYXBfLmJlZ2luKCktPmZpcnN0IC0gbm93OworICAgICAgICAgIH0KKyAgICAgICAgICBhc3NlcnQoKHRpbWVvdXQgIT0gMCAmJiBtYW5hZ2VyXy0+dGFza0NvdW50XyA+IDApCisgICAgICAgICAgICAgICAgIHx8ICh0aW1lb3V0ID09IDAgJiYgbWFuYWdlcl8tPnRhc2tDb3VudF8gPT0gMCkpOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtYW5hZ2VyXy0+bW9uaXRvcl8ud2FpdCh0aW1lb3V0KTsKKyAgICAgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiYpIHsKKyAgICAgICAgICB9CisgICAgICAgICAgbm93ID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtYW5hZ2VyXy0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCkgeworICAgICAgICAgIGZvciAodGFza19pdGVyYXRvciBpeCA9IG1hbmFnZXJfLT50YXNrTWFwXy5iZWdpbigpOyBpeCAhPSBleHBpcmVkVGFza0VuZDsgaXgrKykgeworICAgICAgICAgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXI6OlRhc2s+IHRhc2sgPSBpeC0+c2Vjb25kOworICAgICAgICAgICAgZXhwaXJlZFRhc2tzLmluc2VydCh0YXNrKTsKKyAgICAgICAgICAgIHRhc2stPml0XyA9IG1hbmFnZXJfLT50YXNrTWFwXy5lbmQoKTsKKyAgICAgICAgICAgIGlmICh0YXNrLT5zdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpUYXNrOjpXQUlUSU5HKSB7CisgICAgICAgICAgICAgIHRhc2stPnN0YXRlXyA9IFRpbWVyTWFuYWdlcjo6VGFzazo6RVhFQ1VUSU5HOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFuYWdlcl8tPnRhc2tDb3VudF8tLTsKKyAgICAgICAgICB9CisgICAgICAgICAgbWFuYWdlcl8tPnRhc2tNYXBfLmVyYXNlKG1hbmFnZXJfLT50YXNrTWFwXy5iZWdpbigpLCBleHBpcmVkVGFza0VuZCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRhc2s+ID46Oml0ZXJhdG9yIGl4ID0gZXhwaXJlZFRhc2tzLmJlZ2luKCk7CisgICAgICAgICAgIGl4ICE9IGV4cGlyZWRUYXNrcy5lbmQoKTsKKyAgICAgICAgICAgKytpeCkgeworICAgICAgICAoKml4KS0+cnVuKCk7CisgICAgICB9CisKKyAgICB9IHdoaWxlIChtYW5hZ2VyXy0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCk7CisKKyAgICB7CisgICAgICBTeW5jaHJvbml6ZWQgcyhtYW5hZ2VyXy0+bW9uaXRvcl8pOworICAgICAgaWYgKG1hbmFnZXJfLT5zdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpTVE9QUElORykgeworICAgICAgICBtYW5hZ2VyXy0+c3RhdGVfID0gVGltZXJNYW5hZ2VyOjpTVE9QUEVEOworICAgICAgICBtYW5hZ2VyXy0+bW9uaXRvcl8ubm90aWZ5KCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCitwcml2YXRlOgorICBUaW1lck1hbmFnZXIqIG1hbmFnZXJfOworICBmcmllbmQgY2xhc3MgVGltZXJNYW5hZ2VyOworfTsKKworI2lmIGRlZmluZWQoX01TQ19WRVIpCisjcHJhZ21hIHdhcm5pbmcocHVzaCkKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDM1NSkgLy8gJ3RoaXMnIHVzZWQgaW4gYmFzZSBtZW1iZXIgaW5pdGlhbGl6ZXIgbGlzdAorI2VuZGlmCisKK1RpbWVyTWFuYWdlcjo6VGltZXJNYW5hZ2VyKCkKKyAgOiB0YXNrQ291bnRfKDApLAorICAgIHN0YXRlXyhUaW1lck1hbmFnZXI6OlVOSU5JVElBTElaRUQpLAorICAgIGRpc3BhdGNoZXJfKHNoYXJlZF9wdHI8RGlzcGF0Y2hlcj4obmV3IERpc3BhdGNoZXIodGhpcykpKSB7Cit9CisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorI3ByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZgorCitUaW1lck1hbmFnZXI6On5UaW1lck1hbmFnZXIoKSB7CisKKyAgLy8gSWYgd2UgaGF2ZW4ndCBiZWVuIGV4cGxpY2l0bHkgc3RvcHBlZCwgZG8gc28gbm93LiAgV2UgZG9uJ3QgbmVlZCB0byBncmFiCisgIC8vIHRoZSBtb25pdG9yIGhlcmUsIHNpbmNlIHN0b3AgYWxyZWFkeSB0YWtlcyBjYXJlIG9mIHJlZW50cmFuY3kuCisKKyAgaWYgKHN0YXRlXyAhPSBTVE9QUEVEKSB7CisgICAgdHJ5IHsKKyAgICAgIHN0b3AoKTsKKyAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgIC8vIFdlJ3JlIHJlYWxseSBob3NlZC4KKyAgICB9CisgIH0KK30KKwordm9pZCBUaW1lck1hbmFnZXI6OnN0YXJ0KCkgeworICBib29sIGRvU3RhcnQgPSBmYWxzZTsKKyAgeworICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgICBpZiAoIXRocmVhZEZhY3RvcnlfKSB7CisgICAgICB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICB9CisgICAgaWYgKHN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlVOSU5JVElBTElaRUQpIHsKKyAgICAgIHN0YXRlXyA9IFRpbWVyTWFuYWdlcjo6U1RBUlRJTkc7CisgICAgICBkb1N0YXJ0ID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBpZiAoZG9TdGFydCkgeworICAgIGRpc3BhdGNoZXJUaHJlYWRfID0gdGhyZWFkRmFjdG9yeV8tPm5ld1RocmVhZChkaXNwYXRjaGVyXyk7CisgICAgZGlzcGF0Y2hlclRocmVhZF8tPnN0YXJ0KCk7CisgIH0KKworICB7CisgICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworICAgIHdoaWxlIChzdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpTVEFSVElORykgeworICAgICAgbW9uaXRvcl8ud2FpdCgpOworICAgIH0KKyAgICBhc3NlcnQoc3RhdGVfICE9IFRpbWVyTWFuYWdlcjo6U1RBUlRJTkcpOworICB9Cit9CisKK3ZvaWQgVGltZXJNYW5hZ2VyOjpzdG9wKCkgeworICBib29sIGRvU3RvcCA9IGZhbHNlOworICB7CisgICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworICAgIGlmIChzdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpVTklOSVRJQUxJWkVEKSB7CisgICAgICBzdGF0ZV8gPSBUaW1lck1hbmFnZXI6OlNUT1BQRUQ7CisgICAgfSBlbHNlIGlmIChzdGF0ZV8gIT0gU1RPUFBJTkcgJiYgc3RhdGVfICE9IFNUT1BQRUQpIHsKKyAgICAgIGRvU3RvcCA9IHRydWU7CisgICAgICBzdGF0ZV8gPSBTVE9QUElORzsKKyAgICAgIG1vbml0b3JfLm5vdGlmeUFsbCgpOworICAgIH0KKyAgICB3aGlsZSAoc3RhdGVfICE9IFNUT1BQRUQpIHsKKyAgICAgIG1vbml0b3JfLndhaXQoKTsKKyAgICB9CisgIH0KKworICBpZiAoZG9TdG9wKSB7CisgICAgLy8gQ2xlYW4gdXAgYW55IG91dHN0YW5kaW5nIHRhc2tzCisgICAgdGFza01hcF8uY2xlYXIoKTsKKworICAgIC8vIFJlbW92ZSBkaXNwYXRjaGVyJ3MgcmVmZXJlbmNlIHRvIHVzLgorICAgIGRpc3BhdGNoZXJfLT5tYW5hZ2VyXyA9IE5VTEw7CisgIH0KK30KKworc2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiBUaW1lck1hbmFnZXI6OnRocmVhZEZhY3RvcnkoKSBjb25zdCB7CisgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgcmV0dXJuIHRocmVhZEZhY3RvcnlfOworfQorCit2b2lkIFRpbWVyTWFuYWdlcjo6dGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHZhbHVlKSB7CisgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgdGhyZWFkRmFjdG9yeV8gPSB2YWx1ZTsKK30KKworc2l6ZV90IFRpbWVyTWFuYWdlcjo6dGFza0NvdW50KCkgY29uc3QgeworICByZXR1cm4gdGFza0NvdW50XzsKK30KKworVGltZXJNYW5hZ2VyOjpUaW1lciBUaW1lck1hbmFnZXI6OmFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBpbnQ2NF90IHRpbWVvdXQpIHsKKyAgaW50NjRfdCBub3cgPSBVdGlsOjpjdXJyZW50VGltZSgpOworICB0aW1lb3V0ICs9IG5vdzsKKworICB7CisgICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworICAgIGlmIChzdGF0ZV8gIT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKSB7CisgICAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgdGFzayBtYXAgaXMgZW1wdHksIHdlIHdpbGwga2ljayB0aGUgZGlzcGF0Y2hlciBmb3Igc3VyZS4gT3RoZXJ3aXNlLCB3ZSBraWNrIGhpbQorICAgIC8vIGlmIHRoZSBleHBpcmF0aW9uIHRpbWUgaXMgc2hvcnRlciB0aGFuIHRoZSBjdXJyZW50IHZhbHVlLiBOZWVkIHRvIHRlc3QgYmVmb3JlIHdlIGluc2VydCwKKyAgICAvLyBiZWNhdXNlIHRoZSBuZXcgdGFzayBtaWdodCBpbnNlcnQgYXQgdGhlIGZyb250LgorICAgIGJvb2wgbm90aWZ5UmVxdWlyZWQgPSAodGFza0NvdW50XyA9PSAwKSA/IHRydWUgOiB0aW1lb3V0IDwgdGFza01hcF8uYmVnaW4oKS0+Zmlyc3Q7CisKKyAgICBzaGFyZWRfcHRyPFRhc2s+IHRpbWVyKG5ldyBUYXNrKHRhc2spKTsKKyAgICB0YXNrQ291bnRfKys7CisgICAgdGltZXItPml0XyA9IHRhc2tNYXBfLmluc2VydChzdGQ6OnBhaXI8aW50NjRfdCwgc2hhcmVkX3B0cjxUYXNrPiA+KHRpbWVvdXQsIHRpbWVyKSk7CisKKyAgICAvLyBJZiB0aGUgdGFzayBtYXAgd2FzIGVtcHR5LCBvciBpZiB3ZSBoYXZlIGFuIGV4cGlyYXRpb24gdGhhdCBpcyBlYXJsaWVyCisgICAgLy8gdGhhbiBhbnkgcHJldmlvdXNseSBzZWVuLCBraWNrIHRoZSBkaXNwYXRjaGVyIHNvIGl0IGNhbiB1cGRhdGUgaXRzCisgICAgLy8gdGltZW91dAorICAgIGlmIChub3RpZnlSZXF1aXJlZCkgeworICAgICAgbW9uaXRvcl8ubm90aWZ5KCk7CisgICAgfQorCisgICAgcmV0dXJuIHRpbWVyOworICB9Cit9CisKK1RpbWVyTWFuYWdlcjo6VGltZXIgVGltZXJNYW5hZ2VyOjphZGQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywKKyAgICBjb25zdCBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiB2YWx1ZSkgeworCisgIGludDY0X3QgZXhwaXJhdGlvbjsKKyAgVXRpbDo6dG9NaWxsaXNlY29uZHMoZXhwaXJhdGlvbiwgdmFsdWUpOworCisgIGludDY0X3Qgbm93ID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKworICBpZiAoZXhwaXJhdGlvbiA8IG5vdykgeworICAgIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOworICB9CisKKyAgcmV0dXJuIGFkZCh0YXNrLCBleHBpcmF0aW9uIC0gbm93KTsKK30KKworVGltZXJNYW5hZ2VyOjpUaW1lciBUaW1lck1hbmFnZXI6OmFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLAorICAgIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB2YWx1ZSkgeworCisgIGludDY0X3QgZXhwaXJhdGlvbjsKKyAgVXRpbDo6dG9NaWxsaXNlY29uZHMoZXhwaXJhdGlvbiwgdmFsdWUpOworCisgIGludDY0X3Qgbm93ID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKworICBpZiAoZXhwaXJhdGlvbiA8IG5vdykgeworICAgIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOworICB9CisKKyAgcmV0dXJuIGFkZCh0YXNrLCBleHBpcmF0aW9uIC0gbm93KTsKK30KKwordm9pZCBUaW1lck1hbmFnZXI6OnJlbW92ZShzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7CisgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgaWYgKHN0YXRlXyAhPSBUaW1lck1hbmFnZXI6OlNUQVJURUQpIHsKKyAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgfQorICBib29sIGZvdW5kID0gZmFsc2U7CisgIGZvciAodGFza19pdGVyYXRvciBpeCA9IHRhc2tNYXBfLmJlZ2luKCk7IGl4ICE9IHRhc2tNYXBfLmVuZCgpOykgeworICAgIGlmICgqaXgtPnNlY29uZCA9PSB0YXNrKSB7CisgICAgICBmb3VuZCA9IHRydWU7CisgICAgICB0YXNrQ291bnRfLS07CisgICAgICB0YXNrTWFwXy5lcmFzZShpeCsrKTsKKyAgICB9IGVsc2UgeworICAgICAgKytpeDsKKyAgICB9CisgIH0KKyAgaWYgKCFmb3VuZCkgeworICAgIHRocm93IE5vU3VjaFRhc2tFeGNlcHRpb24oKTsKKyAgfQorfQorCit2b2lkIFRpbWVyTWFuYWdlcjo6cmVtb3ZlKFRpbWVyIGhhbmRsZSkgeworICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgIGlmIChzdGF0ZV8gIT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKSB7CisgICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgIH0KKworICBzaGFyZWRfcHRyPFRhc2s+IHRhc2sgPSBoYW5kbGUubG9jaygpOworICBpZiAoIXRhc2spIHsKKyAgICB0aHJvdyBOb1N1Y2hUYXNrRXhjZXB0aW9uKCk7CisgIH0KKworICBpZiAodGFzay0+aXRfID09IHRhc2tNYXBfLmVuZCgpKSB7CisgICAgLy8gVGFzayBpcyBiZWluZyBleGVjdXRlZAorICAgIHRocm93IFVuY2FuY2VsbGFibGVUYXNrRXhjZXB0aW9uKCk7CisgIH0KKworICB0YXNrTWFwXy5lcmFzZSh0YXNrLT5pdF8pOworICB0YXNrQ291bnRfLS07Cit9CisKK1RpbWVyTWFuYWdlcjo6U1RBVEUgVGltZXJNYW5hZ2VyOjpzdGF0ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRlXzsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE3OTIyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuaApAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVElNRVJNQU5BR0VSX0hfCisjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVElNRVJNQU5BR0VSX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dGltZS5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworLyoqCisgKiBUaW1lciBNYW5hZ2VyCisgKgorICogVGhpcyBjbGFzcyBkaXNwYXRjaGVzIHRpbWVyIHRhc2tzIHdoZW4gdGhleSBmYWxsIGR1ZS4KKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBUaW1lck1hbmFnZXIgeworCitwdWJsaWM6CisgIGNsYXNzIFRhc2s7CisgIHR5cGVkZWYgc3RkOjp3ZWFrX3B0cjxUYXNrPiBUaW1lcjsKKworICBUaW1lck1hbmFnZXIoKTsKKworICB2aXJ0dWFsIH5UaW1lck1hbmFnZXIoKTsKKworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KCkgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIHRocmVhZEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHZhbHVlKTsKKworICAvKioKKyAgICogU3RhcnRzIHRoZSB0aW1lciBtYW5hZ2VyIHNlcnZpY2UKKyAgICoKKyAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gTWlzc2luZyB0aHJlYWQgZmFjdG9yeSBhdHRyaWJ1dGUKKyAgICovCisgIHZpcnR1YWwgdm9pZCBzdGFydCgpOworCisgIC8qKgorICAgKiBTdG9wcyB0aGUgdGltZXIgbWFuYWdlciBzZXJ2aWNlCisgICAqLworICB2aXJ0dWFsIHZvaWQgc3RvcCgpOworCisgIHZpcnR1YWwgc2l6ZV90IHRhc2tDb3VudCgpIGNvbnN0OworCisgIC8qKgorICAgKiBBZGRzIGEgdGFzayB0byBiZSBleGVjdXRlZCBhdCBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZSBieSBhIHdvcmtlciB0aHJlYWQuCisgICAqCisgICAqIEBwYXJhbSB0YXNrIFRoZSB0YXNrIHRvIGV4ZWN1dGUKKyAgICogQHBhcmFtIHRpbWVvdXQgVGltZSBpbiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgYmVmb3JlIGV4ZWN1dGluZyB0YXNrCisgICAqIEByZXR1cm4gSGFuZGxlIG9mIHRoZSB0aW1lciwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIHRoZSB0aW1lci4KKyAgICovCisgIHZpcnR1YWwgVGltZXIgYWRkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywgaW50NjRfdCB0aW1lb3V0KTsKKworICAvKioKKyAgICogQWRkcyBhIHRhc2sgdG8gYmUgZXhlY3V0ZWQgYXQgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUgYnkgYSB3b3JrZXIgdGhyZWFkLgorICAgKgorICAgKiBAcGFyYW0gdGFzayBUaGUgdGFzayB0byBleGVjdXRlCisgICAqIEBwYXJhbSB0aW1lb3V0IEFic29sdXRlIHRpbWUgaW4gdGhlIGZ1dHVyZSB0byBleGVjdXRlIHRhc2suCisgICAqIEByZXR1cm4gSGFuZGxlIG9mIHRoZSB0aW1lciwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIHRoZSB0aW1lci4KKyAgICovCisgIHZpcnR1YWwgVGltZXIgYWRkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywgY29uc3Qgc3RydWN0IFRIUklGVF9USU1FU1BFQyYgdGltZW91dCk7CisKKyAgLyoqCisgICAqIEFkZHMgYSB0YXNrIHRvIGJlIGV4ZWN1dGVkIGF0IHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlIGJ5IGEgd29ya2VyIHRocmVhZC4KKyAgICoKKyAgICogQHBhcmFtIHRhc2sgVGhlIHRhc2sgdG8gZXhlY3V0ZQorICAgKiBAcGFyYW0gdGltZW91dCBBYnNvbHV0ZSB0aW1lIGluIHRoZSBmdXR1cmUgdG8gZXhlY3V0ZSB0YXNrLgorICAgKiBAcmV0dXJuIEhhbmRsZSBvZiB0aGUgdGltZXIsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0aGUgdGltZXIuCisgICAqLworICB2aXJ0dWFsIFRpbWVyIGFkZChzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB0aW1lb3V0KTsKKworICAvKioKKyAgICogUmVtb3ZlcyBhIHBlbmRpbmcgdGFzaworICAgKgorICAgKiBAcGFyYW0gdGFzayBUaGUgdGFzayB0byByZW1vdmUuIEFsbCB0aW1lcnMgd2hpY2ggZXhlY3V0ZSB0aGlzIHRhc2sgd2lsbAorICAgKiBiZSByZW1vdmVkLgorICAgKiBAdGhyb3dzIE5vU3VjaFRhc2tFeGNlcHRpb24gU3BlY2lmaWVkIHRhc2sgZG9lc24ndCBleGlzdC4gSXQgd2FzIGVpdGhlcgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkIGFscmVhZHkgb3IgdGhpcyBjYWxsIHdhcyBtYWRlIGZvciBhCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrIHRoYXQgd2FzIG5ldmVyIGFkZGVkIHRvIHRoaXMgdGltZXIKKyAgICoKKyAgICogQHRocm93cyBVbmNhbmNlbGxhYmxlVGFza0V4Y2VwdGlvbiBTcGVjaWZpZWQgdGFzayBpcyBhbHJlYWR5IGJlaW5nCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWQgb3IgaGFzIGNvbXBsZXRlZCBleGVjdXRpb24uCisgICAqLworICB2aXJ0dWFsIHZvaWQgcmVtb3ZlKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayk7CisKKyAgLyoqCisgICAqIFJlbW92ZXMgYSBzaW5nbGUgcGVuZGluZyB0YXNrCisgICAqCisgICAqIEBwYXJhbSB0aW1lciBUaGUgdGltZXIgdG8gcmVtb3ZlLiBUaGUgdGltZXIgaXMgcmV0dXJuZWQgd2hlbiBjYWxsaW5nIHRoZQorICAgKiBhZGQoKSBtZXRob2QuCisgICAqIEB0aHJvd3MgTm9TdWNoVGFza0V4Y2VwdGlvbiBTcGVjaWZpZWQgdGFzayBkb2Vzbid0IGV4aXN0LiBJdCB3YXMgZWl0aGVyCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQgYWxyZWFkeSBvciB0aGlzIGNhbGwgd2FzIG1hZGUgZm9yIGEKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sgdGhhdCB3YXMgbmV2ZXIgYWRkZWQgdG8gdGhpcyB0aW1lcgorICAgKgorICAgKiBAdGhyb3dzIFVuY2FuY2VsbGFibGVUYXNrRXhjZXB0aW9uIFNwZWNpZmllZCB0YXNrIGlzIGFscmVhZHkgYmVpbmcKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZCBvciBoYXMgY29tcGxldGVkIGV4ZWN1dGlvbi4KKyAgICovCisgIHZpcnR1YWwgdm9pZCByZW1vdmUoVGltZXIgdGltZXIpOworCisgIGVudW0gU1RBVEUgeyBVTklOSVRJQUxJWkVELCBTVEFSVElORywgU1RBUlRFRCwgU1RPUFBJTkcsIFNUT1BQRUQgfTsKKworICB2aXJ0dWFsIFNUQVRFIHN0YXRlKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5XzsKKyAgZnJpZW5kIGNsYXNzIFRhc2s7CisgIHN0ZDo6bXVsdGltYXA8aW50NjRfdCwgc3RkOjpzaGFyZWRfcHRyPFRhc2s+ID4gdGFza01hcF87CisgIHNpemVfdCB0YXNrQ291bnRfOworICBNb25pdG9yIG1vbml0b3JfOworICBTVEFURSBzdGF0ZV87CisgIGNsYXNzIERpc3BhdGNoZXI7CisgIGZyaWVuZCBjbGFzcyBEaXNwYXRjaGVyOworICBzdGQ6OnNoYXJlZF9wdHI8RGlzcGF0Y2hlcj4gZGlzcGF0Y2hlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IGRpc3BhdGNoZXJUaHJlYWRfOworICB0eXBlZGVmIHN0ZDo6bXVsdGltYXA8aW50NjRfdCwgc3RkOjpzaGFyZWRfcHRyPFRpbWVyTWFuYWdlcjo6VGFzaz4gPjo6aXRlcmF0b3IgdGFza19pdGVyYXRvcjsKKyAgdHlwZWRlZiBzdGQ6OnBhaXI8dGFza19pdGVyYXRvciwgdGFza19pdGVyYXRvcj4gdGFza19yYW5nZTsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1RJTUVSTUFOQUdFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNmQxOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5jcHAKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgorCisjaWYgZGVmaW5lZChIQVZFX1NZU19USU1FX0gpCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworaW50NjRfdCBVdGlsOjpjdXJyZW50VGltZVRpY2tzKGludDY0X3QgdGlja3NQZXJTZWMpIHsKKyAgaW50NjRfdCByZXN1bHQ7CisgIHN0cnVjdCB0aW1ldmFsIG5vdzsKKyAgaW50IHJldCA9IFRIUklGVF9HRVRUSU1FT0ZEQVkoJm5vdywgTlVMTCk7CisgIGFzc2VydChyZXQgPT0gMCk7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUocmV0KTsgLy8gc3F1ZWxjaGluZyAidW51c2VkIHZhcmlhYmxlIiB3YXJuaW5nCisgIHRvVGlja3MocmVzdWx0LCBub3csIHRpY2tzUGVyU2VjKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTkxNTk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVVRJTF9IXworI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX1VUSUxfSF8gMQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaWZkZWYgSEFWRV9TWVNfVElNRV9ICisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworLyoqCisgKiBVdGlsaXR5IG1ldGhvZHMKKyAqCisgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGJhc2ljIHV0aWxpdHkgbWV0aG9kcyBmb3IgY29udmVydGluZyB0aW1lIGZvcm1hdHMsCisgKiBhbmQgb3RoZXIgY29tbW9uIHBsYXRmb3JtLWRlcGVuZGVudCBjb25jdXJyZW5jeSBvcGVyYXRpb25zLgorICogSXQgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiBBUEkgaGVhZGVycyBmb3Igb3RoZXIgY29uY3VycmVuY3kgbGlicmFyeQorICogaGVhZGVycywgc2luY2UgaXQgd2lsbCwgYnkgZGVmaW5pdGlvbiwgcHVsbCBpbiBhbGwgc29ydHMgb2YgaG9ycmlkCisgKiBwbGF0Zm9ybSBkZXBlbmRlbnQgc3R1ZmYuICBSYXRoZXIgaXQgc2hvdWxkIGJlIGlubHVkZWQgZGlyZWN0bHkgaW4KKyAqIGNvbmN1cnJlbmN5IGxpYnJhcnkgaW1wbGVtZW50YXRpb24gc291cmNlLgorICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIFV0aWwgeworCisgIHN0YXRpYyBjb25zdCBpbnQ2NF90IE5TX1BFUl9TID0gMTAwMDAwMDAwMExMOworICBzdGF0aWMgY29uc3QgaW50NjRfdCBVU19QRVJfUyA9IDEwMDAwMDBMTDsKKyAgc3RhdGljIGNvbnN0IGludDY0X3QgTVNfUEVSX1MgPSAxMDAwTEw7CisKKyAgc3RhdGljIGNvbnN0IGludDY0X3QgTlNfUEVSX01TID0gTlNfUEVSX1MgLyBNU19QRVJfUzsKKyAgc3RhdGljIGNvbnN0IGludDY0X3QgTlNfUEVSX1VTID0gTlNfUEVSX1MgLyBVU19QRVJfUzsKKyAgc3RhdGljIGNvbnN0IGludDY0X3QgVVNfUEVSX01TID0gVVNfUEVSX1MgLyBNU19QRVJfUzsKKworcHVibGljOgorICAvKioKKyAgICogQ29udmVydHMgbWlsbGlzZWNvbmQgdGltZXN0YW1wIGludG8gYSBUSFJJRlRfVElNRVNQRUMgc3RydWN0CisgICAqCisgICAqIEBwYXJhbSBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiByZXN1bHQKKyAgICogQHBhcmFtIHRpbWUgb3IgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzCisgICAqLworICBzdGF0aWMgdm9pZCB0b1RpbWVzcGVjKHN0cnVjdCBUSFJJRlRfVElNRVNQRUMmIHJlc3VsdCwgaW50NjRfdCB2YWx1ZSkgeworICAgIHJlc3VsdC50dl9zZWMgPSB2YWx1ZSAvIE1TX1BFUl9TOyAgICAgICAgICAgICAgICAvLyBtcyB0byBzCisgICAgcmVzdWx0LnR2X25zZWMgPSAodmFsdWUgJSBNU19QRVJfUykgKiBOU19QRVJfTVM7IC8vIG1zIHRvIG5zCisgIH0KKworICBzdGF0aWMgdm9pZCB0b1RpbWV2YWwoc3RydWN0IHRpbWV2YWwmIHJlc3VsdCwgaW50NjRfdCB2YWx1ZSkgeworICAgIHJlc3VsdC50dl9zZWMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsdWUgLyBNU19QRVJfUyk7ICAgICAgICAgICAgICAgIC8vIG1zIHRvIHMKKyAgICByZXN1bHQudHZfdXNlYyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigodmFsdWUgJSBNU19QRVJfUykgKiBVU19QRVJfTVMpOyAvLyBtcyB0byB1cworICB9CisKKyAgc3RhdGljIHZvaWQgdG9UaWNrcyhpbnQ2NF90JiByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzZWNzLAorICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2xkVGlja3MsCisgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvbGRUaWNrc1BlclNlYywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG5ld1RpY2tzUGVyU2VjKSB7CisgICAgcmVzdWx0ID0gc2VjcyAqIG5ld1RpY2tzUGVyU2VjOworICAgIHJlc3VsdCArPSBvbGRUaWNrcyAqIG5ld1RpY2tzUGVyU2VjIC8gb2xkVGlja3NQZXJTZWM7CisKKyAgICBpbnQ2NF90IG9sZFBlck5ldyA9IG9sZFRpY2tzUGVyU2VjIC8gbmV3VGlja3NQZXJTZWM7CisgICAgaWYgKG9sZFBlck5ldyAmJiAoKG9sZFRpY2tzICUgb2xkUGVyTmV3KSA+PSAob2xkUGVyTmV3IC8gMikpKSB7CisgICAgICArK3Jlc3VsdDsKKyAgICB9CisgIH0KKyAgLyoqCisgICAqIENvbnZlcnRzIHN0cnVjdCBUSFJJRlRfVElNRVNQRUMgdG8gYXJiaXRyYXJ5LXNpemVkIHRpY2tzIHNpbmNlIGVwb2NoCisgICAqLworICBzdGF0aWMgdm9pZCB0b1RpY2tzKGludDY0X3QmIHJlc3VsdCwgY29uc3Qgc3RydWN0IFRIUklGVF9USU1FU1BFQyYgdmFsdWUsIGludDY0X3QgdGlja3NQZXJTZWMpIHsKKyAgICByZXR1cm4gdG9UaWNrcyhyZXN1bHQsIHZhbHVlLnR2X3NlYywgdmFsdWUudHZfbnNlYywgTlNfUEVSX1MsIHRpY2tzUGVyU2VjKTsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZXJ0cyBzdHJ1Y3QgdGltZXZhbCB0byBhcmJpdHJhcnktc2l6ZWQgdGlja3Mgc2luY2UgZXBvY2gKKyAgICovCisgIHN0YXRpYyB2b2lkIHRvVGlja3MoaW50NjRfdCYgcmVzdWx0LCBjb25zdCBzdHJ1Y3QgdGltZXZhbCYgdmFsdWUsIGludDY0X3QgdGlja3NQZXJTZWMpIHsKKyAgICByZXR1cm4gdG9UaWNrcyhyZXN1bHQsICh1bnNpZ25lZCBsb25nKXZhbHVlLnR2X3NlYywgKHVuc2lnbmVkIGxvbmcpdmFsdWUudHZfdXNlYywgVVNfUEVSX1MsIHRpY2tzUGVyU2VjKTsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZXJ0cyBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDIHRvIG1pbGxpc2Vjb25kcworICAgKi8KKyAgc3RhdGljIHZvaWQgdG9NaWxsaXNlY29uZHMoaW50NjRfdCYgcmVzdWx0LCBjb25zdCBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiB2YWx1ZSkgeworICAgIHJldHVybiB0b1RpY2tzKHJlc3VsdCwgdmFsdWUsIE1TX1BFUl9TKTsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZXJ0cyBzdHJ1Y3QgdGltZXZhbCB0byBtaWxsaXNlY29uZHMKKyAgICovCisgIHN0YXRpYyB2b2lkIHRvTWlsbGlzZWNvbmRzKGludDY0X3QmIHJlc3VsdCwgY29uc3Qgc3RydWN0IHRpbWV2YWwmIHZhbHVlKSB7CisgICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCB2YWx1ZSwgTVNfUEVSX1MpOworICB9CisKKyAgLyoqCisgICAqIENvbnZlcnRzIHN0cnVjdCBUSFJJRlRfVElNRVNQRUMgdG8gbWljcm9zZWNvbmRzCisgICAqLworICBzdGF0aWMgdm9pZCB0b1VzZWMoaW50NjRfdCYgcmVzdWx0LCBjb25zdCBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiB2YWx1ZSkgeworICAgIHJldHVybiB0b1RpY2tzKHJlc3VsdCwgdmFsdWUsIFVTX1BFUl9TKTsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZXJ0cyBzdHJ1Y3QgdGltZXZhbCB0byBtaWNyb3NlY29uZHMKKyAgICovCisgIHN0YXRpYyB2b2lkIHRvVXNlYyhpbnQ2NF90JiByZXN1bHQsIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB2YWx1ZSkgeworICAgIHJldHVybiB0b1RpY2tzKHJlc3VsdCwgdmFsdWUsIFVTX1BFUl9TKTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgY3VycmVudCB0aW1lIGFzIGEgbnVtYmVyIG9mIGFyYml0cmFyeS1zaXplIHRpY2tzIGZyb20gZXBvY2gKKyAgICovCisgIHN0YXRpYyBpbnQ2NF90IGN1cnJlbnRUaW1lVGlja3MoaW50NjRfdCB0aWNrc1BlclNlYyk7CisKKyAgLyoqCisgICAqIEdldCBjdXJyZW50IHRpbWUgYXMgbWlsbGlzZWNvbmRzIGZyb20gZXBvY2gKKyAgICovCisgIHN0YXRpYyBpbnQ2NF90IGN1cnJlbnRUaW1lKCkgeyByZXR1cm4gY3VycmVudFRpbWVUaWNrcyhNU19QRVJfUyk7IH0KKworICAvKioKKyAgICogR2V0IGN1cnJlbnQgdGltZSBhcyBtaWNyb3MgZnJvbSBlcG9jaAorICAgKi8KKyAgc3RhdGljIGludDY0X3QgY3VycmVudFRpbWVVc2VjKCkgeyByZXR1cm4gY3VycmVudFRpbWVUaWNrcyhVU19QRVJfUyk7IH0KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1VUSUxfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZjZiYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb2Nlc3NvciB7CisKK1BlZWtQcm9jZXNzb3I6OlBlZWtQcm9jZXNzb3IoKSB7CisgIG1lbW9yeUJ1ZmZlcl8ucmVzZXQobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHRhcmdldFRyYW5zcG9ydF8gPSBtZW1vcnlCdWZmZXJfOworfQorUGVla1Byb2Nlc3Nvcjo6flBlZWtQcm9jZXNzb3IoKSB7Cit9CisKK3ZvaWQgUGVla1Byb2Nlc3Nvcjo6aW5pdGlhbGl6ZShzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gYWN0dWFsUHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQaXBlZFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkpIHsKKyAgYWN0dWFsUHJvY2Vzc29yXyA9IGFjdHVhbFByb2Nlc3NvcjsKKyAgcGlwZWRQcm90b2NvbF8gPSBwcm90b2NvbEZhY3RvcnktPmdldFByb3RvY29sKHRhcmdldFRyYW5zcG9ydF8pOworICB0cmFuc3BvcnRGYWN0b3J5XyA9IHRyYW5zcG9ydEZhY3Rvcnk7CisgIHRyYW5zcG9ydEZhY3RvcnlfLT5pbml0aWFsaXplVGFyZ2V0VHJhbnNwb3J0KHRhcmdldFRyYW5zcG9ydF8pOworfQorCitzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gUGVla1Byb2Nlc3Nvcjo6Z2V0UGlwZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGluKSB7CisgIHJldHVybiB0cmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGluKTsKK30KKwordm9pZCBQZWVrUHJvY2Vzc29yOjpzZXRUYXJnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRhcmdldFRyYW5zcG9ydCkgeworICB0YXJnZXRUcmFuc3BvcnRfID0gdGFyZ2V0VHJhbnNwb3J0OworICBpZiAoc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUTWVtb3J5QnVmZmVyPih0YXJnZXRUcmFuc3BvcnRfKSkgeworICAgIG1lbW9yeUJ1ZmZlcl8gPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRNZW1vcnlCdWZmZXI+KHRhcmdldFRyYW5zcG9ydCk7CisgIH0gZWxzZSBpZiAoc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUUGlwZWRUcmFuc3BvcnQ+KHRhcmdldFRyYW5zcG9ydF8pKSB7CisgICAgbWVtb3J5QnVmZmVyXyA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VE1lbW9yeUJ1ZmZlcj4oCisgICAgICAgIHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VFBpcGVkVHJhbnNwb3J0Pih0YXJnZXRUcmFuc3BvcnRfKS0+Z2V0VGFyZ2V0VHJhbnNwb3J0KCkpOworICB9CisKKyAgaWYgKCFtZW1vcnlCdWZmZXJfKSB7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigKKyAgICAgICAgIlRhcmdldCB0cmFuc3BvcnQgbXVzdCBiZSBhIFRNZW1vcnlCdWZmZXIgb3IgYSBUUGlwZWRUcmFuc3BvcnQgd2l0aCBUTWVtb3J5QnVmZmVyIik7CisgIH0KK30KKworYm9vbCBQZWVrUHJvY2Vzc29yOjpwcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgeworCisgIHN0ZDo6c3RyaW5nIGZuYW1lOworICBUTWVzc2FnZVR5cGUgbXR5cGU7CisgIGludDMyX3Qgc2VxaWQ7CisgIGluLT5yZWFkTWVzc2FnZUJlZ2luKGZuYW1lLCBtdHlwZSwgc2VxaWQpOworCisgIGlmIChtdHlwZSAhPSBUX0NBTEwgJiYgbXR5cGUgIT0gVF9PTkVXQVkpIHsKKyAgICB0aHJvdyBURXhjZXB0aW9uKCJVbmV4cGVjdGVkIG1lc3NhZ2UgdHlwZSIpOworICB9CisKKyAgLy8gUGVlayBhdCB0aGUgbmFtZQorICBwZWVrTmFtZShmbmFtZSk7CisKKyAgVFR5cGUgZnR5cGU7CisgIGludDE2X3QgZmlkOworICB3aGlsZSAodHJ1ZSkgeworICAgIGluLT5yZWFkRmllbGRCZWdpbihmbmFtZSwgZnR5cGUsIGZpZCk7CisgICAgaWYgKGZ0eXBlID09IFRfU1RPUCkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gUGVlayBhdCB0aGUgdmFyaWFibGUKKyAgICBwZWVrKGluLCBmdHlwZSwgZmlkKTsKKyAgICBpbi0+cmVhZEZpZWxkRW5kKCk7CisgIH0KKyAgaW4tPnJlYWRNZXNzYWdlRW5kKCk7CisgIGluLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOworCisgIC8vCisgIC8vIEFsbCB0aGUgZGF0YSBpcyBub3cgaW4gbWVtb3J5QnVmZmVyXyBhbmQgcmVhZHkgdG8gYmUgcHJvY2Vzc2VkCisgIC8vCisKKyAgLy8gTGV0J3MgZmlyc3QgdGFrZSBhIHBlZWsgYXQgdGhlIGZ1bGwgZGF0YSBpbiBtZW1vcnkKKyAgdWludDhfdCogYnVmZmVyOworICB1aW50MzJfdCBzaXplOworICBtZW1vcnlCdWZmZXJfLT5nZXRCdWZmZXIoJmJ1ZmZlciwgJnNpemUpOworICBwZWVrQnVmZmVyKGJ1ZmZlciwgc2l6ZSk7CisKKyAgLy8gRG9uZSBwZWVraW5nIGF0IHZhcmlhYmxlcworICBwZWVrRW5kKCk7CisKKyAgYm9vbCByZXQgPSBhY3R1YWxQcm9jZXNzb3JfLT5wcm9jZXNzKHBpcGVkUHJvdG9jb2xfLCBvdXQsIGNvbm5lY3Rpb25Db250ZXh0KTsKKyAgbWVtb3J5QnVmZmVyXy0+cmVzZXRCdWZmZXIoKTsKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZCBQZWVrUHJvY2Vzc29yOjpwZWVrTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUpIHsKKyAgKHZvaWQpZm5hbWU7Cit9CisKK3ZvaWQgUGVla1Byb2Nlc3Nvcjo6cGVla0J1ZmZlcih1aW50OF90KiBidWZmZXIsIHVpbnQzMl90IHNpemUpIHsKKyAgKHZvaWQpYnVmZmVyOworICAodm9pZClzaXplOworfQorCit2b2lkIFBlZWtQcm9jZXNzb3I6OnBlZWsoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW4sIFRUeXBlIGZ0eXBlLCBpbnQxNl90IGZpZCkgeworICAodm9pZClmaWQ7CisgIGluLT5za2lwKGZ0eXBlKTsKK30KKwordm9pZCBQZWVrUHJvY2Vzc29yOjpwZWVrRW5kKCkgeworfQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmFjMmI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFBFRUtQUk9DRVNTT1JfSAorI2RlZmluZSBQRUVLUFJPQ0VTU09SX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0aHJpZnQvVFByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm9jZXNzb3IgeworCisvKgorICogQ2xhc3MgZm9yIHBlZWtpbmcgYXQgdGhlIHJhdyBkYXRhIHRoYXQgaXMgYmVpbmcgcHJvY2Vzc2VkIGJ5IGFub3RoZXIgcHJvY2Vzc29yCisgKiBhbmQgZ2l2ZXMgdGhlIGRlcml2ZWQgY2xhc3MgYSBjaGFuY2UgdG8gY2hhbmdlIGJlaGF2aW9yIGFjY29yZGluZ2x5CisgKgorICovCitjbGFzcyBQZWVrUHJvY2Vzc29yIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yIHsKKworcHVibGljOgorICBQZWVrUHJvY2Vzc29yKCk7CisgIHZpcnR1YWwgflBlZWtQcm9jZXNzb3IoKTsKKworICAvLyBJbnB1dCBoZXJlOiBhY3R1YWxQcm9jZXNzb3IgIC0gdGhlIHVuZGVybHlpbmcgcHJvY2Vzc29yCisgIC8vICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSAgLSB0aGUgcHJvdG9jb2wgZmFjdG9yeSB1c2VkIHRvIHdyYXAgdGhlIG1lbW9yeSBidWZmZXIKKyAgLy8gICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSAtIHRoaXMgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSBpcyB1c2VkIHRvIHdyYXAgdGhlIHNvdXJjZSB0cmFuc3BvcnQKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYSBhIGNhbGwgdG8gZ2V0UGlwZWRUcmFuc3BvcnQKKyAgdm9pZCBpbml0aWFsaXplKAorICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiBhY3R1YWxQcm9jZXNzb3IsCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFBpcGVkVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeSk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGdldFBpcGVkVHJhbnNwb3J0KAorICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGluKTsKKworICB2b2lkIHNldFRhcmdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdGFyZ2V0VHJhbnNwb3J0KTsKKworICB2aXJ0dWFsIGJvb2wgcHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpOworCisgIC8vIFRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGNhbiBiZSBvdmVybG9hZGVkIGJ5IGNoaWxkIGNsYXNzZXMgdG8KKyAgLy8gYWNoaWV2ZSBkZXNpcmVkIHBlZWtpbmcgYmVoYXZpb3IKKyAgdmlydHVhbCB2b2lkIHBlZWtOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSk7CisgIHZpcnR1YWwgdm9pZCBwZWVrQnVmZmVyKHVpbnQ4X3QqIGJ1ZmZlciwgdWludDMyX3Qgc2l6ZSk7CisgIHZpcnR1YWwgdm9pZCBwZWVrKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZnR5cGUsCisgICAgICAgICAgICAgICAgICAgIGludDE2X3QgZmlkKTsKKyAgdmlydHVhbCB2b2lkIHBlZWtFbmQoKTsKKworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiBhY3R1YWxQcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBpcGVkUHJvdG9jb2xfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFBpcGVkVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBtZW1vcnlCdWZmZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdGFyZ2V0VHJhbnNwb3J0XzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm9jZXNzb3IKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1N0YXRzUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1N0YXRzUHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4ZWZiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvU3RhdHNQcm9jZXNzb3IuaApAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQVRTUFJPQ0VTU09SX0gKKyNkZWZpbmUgU1RBVFNQUk9DRVNTT1JfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxUUHJvY2Vzc29yLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvY2Vzc29yIHsKKworLyoKKyAqIENsYXNzIGZvciBrZWVwaW5nIHRyYWNrIG9mIGZ1bmN0aW9uIGNhbGwgc3RhdGlzdGljcyBhbmQgcHJpbnRpbmcgdGhlbSBpZiBkZXNpcmVkCisgKgorICovCitjbGFzcyBTdGF0c1Byb2Nlc3NvciA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvciB7CitwdWJsaWM6CisgIFN0YXRzUHJvY2Vzc29yKGJvb2wgcHJpbnQsIGJvb2wgZnJlcXVlbmN5KSA6IHByaW50XyhwcmludCksIGZyZXF1ZW5jeV8oZnJlcXVlbmN5KSB7fQorICB2aXJ0dWFsIH5TdGF0c1Byb2Nlc3Nvcigpe307CisKKyAgdmlydHVhbCBib29sIHByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXByb3QsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcG9wcm90LAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBzZXJ2ZXJDb250ZXh0KSB7CisKKyAgICBwaXByb3RfID0gcGlwcm90OworCisgICAgc3RkOjpzdHJpbmcgZm5hbWU7CisgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGU7CisgICAgaW50MzJfdCBzZXFpZDsKKworICAgIHBpcHJvdF8tPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCBzZXFpZCk7CisgICAgaWYgKG10eXBlICE9IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9DQUxMICYmIG10eXBlICE9IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9PTkVXQVkpIHsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCJVbmtub3duIG1lc3NhZ2UgdHlwZVxuIik7CisgICAgICB9CisgICAgICB0aHJvdyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigiVW5leHBlY3RlZCBtZXNzYWdlIHR5cGUiKTsKKyAgICB9CisgICAgaWYgKHByaW50XykgeworICAgICAgcHJpbnRmKCIlcyAoIiwgZm5hbWUuY19zdHIoKSk7CisgICAgfQorICAgIGlmIChmcmVxdWVuY3lfKSB7CisgICAgICBpZiAoZnJlcXVlbmN5X21hcF8uZmluZChmbmFtZSkgIT0gZnJlcXVlbmN5X21hcF8uZW5kKCkpIHsKKyAgICAgICAgZnJlcXVlbmN5X21hcF9bZm5hbWVdKys7CisgICAgICB9IGVsc2UgeworICAgICAgICBmcmVxdWVuY3lfbWFwX1tmbmFtZV0gPSAxOworICAgICAgfQorICAgIH0KKworICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZnR5cGU7CisgICAgaW50MTZfdCBmaWQ7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgcGlwcm90Xy0+cmVhZEZpZWxkQmVnaW4oZm5hbWUsIGZ0eXBlLCBmaWQpOworICAgICAgaWYgKGZ0eXBlID09IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVE9QKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBwcmludEFuZFBhc3NUb0J1ZmZlcihmdHlwZSk7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHJpbnRfKSB7CisgICAgICBwcmludGYoIlxiXGIpXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50NjRfdD4mIGdldF9mcmVxdWVuY3lfbWFwKCkgeyByZXR1cm4gZnJlcXVlbmN5X21hcF87IH0KKworcHJvdGVjdGVkOgorICB2b2lkIHByaW50QW5kUGFzc1RvQnVmZmVyKGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZnR5cGUpIHsKKyAgICBzd2l0Y2ggKGZ0eXBlKSB7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQk9PTDogeworICAgICAgYm9vbCBib29sdjsKKyAgICAgIHBpcHJvdF8tPnJlYWRCb29sKGJvb2x2KTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCIlZCIsIGJvb2x2KTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0JZVEU6IHsKKyAgICAgIGludDhfdCBieXRldjsKKyAgICAgIHBpcHJvdF8tPnJlYWRCeXRlKGJ5dGV2KTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCIlZCIsIGJ5dGV2KTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kxNjogeworICAgICAgaW50MTZfdCBpMTY7CisgICAgICBwaXByb3RfLT5yZWFkSTE2KGkxNik7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiJWQiLCBpMTYpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTMyOiB7CisgICAgICBpbnQzMl90IGkzMjsKKyAgICAgIHBpcHJvdF8tPnJlYWRJMzIoaTMyKTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCIlZCIsIGkzMik7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JNjQ6IHsKKyAgICAgIGludDY0X3QgaTY0OworICAgICAgcGlwcm90Xy0+cmVhZEk2NChpNjQpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIiVsZCIsIGk2NCk7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9ET1VCTEU6IHsKKyAgICAgIGRvdWJsZSBkdWI7CisgICAgICBwaXByb3RfLT5yZWFkRG91YmxlKGR1Yik7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiJWYiLCBkdWIpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSSU5HOiB7CisgICAgICBzdGQ6OnN0cmluZyBzdHI7CisgICAgICBwaXByb3RfLT5yZWFkU3RyaW5nKHN0cik7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiJXMiLCBzdHIuY19zdHIoKSk7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1Q6IHsKKyAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICBpbnQxNl90IGZpZDsKKyAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZnR5cGU7CisgICAgICBwaXByb3RfLT5yZWFkU3RydWN0QmVnaW4obmFtZSk7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiPCIpOworICAgICAgfQorICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgcGlwcm90Xy0+cmVhZEZpZWxkQmVnaW4obmFtZSwgZnR5cGUsIGZpZCk7CisgICAgICAgIGlmIChmdHlwZSA9PSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RPUCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHByaW50QW5kUGFzc1RvQnVmZmVyKGZ0eXBlKTsKKyAgICAgICAgaWYgKHByaW50XykgeworICAgICAgICAgIHByaW50ZigiLCIpOworICAgICAgICB9CisgICAgICAgIHBpcHJvdF8tPnJlYWRGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgcGlwcm90Xy0+cmVhZFN0cnVjdEVuZCgpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIlxiPiIpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfTUFQOiB7CisgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGtleVR5cGU7CisgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIHZhbFR5cGU7CisgICAgICB1aW50MzJfdCBpLCBzaXplOworICAgICAgcGlwcm90Xy0+cmVhZE1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoInsiKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIoa2V5VHlwZSk7CisgICAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgICBwcmludGYoIj0+Iik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIodmFsVHlwZSk7CisgICAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgICBwcmludGYoIiwiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcGlwcm90Xy0+cmVhZE1hcEVuZCgpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIlxifSIpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU0VUOiB7CisgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGVsZW1UeXBlOworICAgICAgdWludDMyX3QgaSwgc2l6ZTsKKyAgICAgIHBpcHJvdF8tPnJlYWRTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigieyIpOworICAgICAgfQorICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBwcmludEFuZFBhc3NUb0J1ZmZlcihlbGVtVHlwZSk7CisgICAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgICBwcmludGYoIiwiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcGlwcm90Xy0+cmVhZFNldEVuZCgpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIlxifSIpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfTElTVDogeworICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBlbGVtVHlwZTsKKyAgICAgIHVpbnQzMl90IGksIHNpemU7CisgICAgICBwaXByb3RfLT5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCJbIik7CisgICAgICB9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIHByaW50QW5kUGFzc1RvQnVmZmVyKGVsZW1UeXBlKTsKKyAgICAgICAgaWYgKHByaW50XykgeworICAgICAgICAgIHByaW50ZigiLCIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBwaXByb3RfLT5yZWFkTGlzdEVuZCgpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIlxiXSIpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcGlwcm90XzsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludDY0X3Q+IGZyZXF1ZW5jeV9tYXBfOworCisgIGJvb2wgcHJpbnRfOworICBib29sIGZyZXF1ZW5jeV87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvY2Vzc29yCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvVE11bHRpcGxleGVkUHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFhN2Y3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvVE11bHRpcGxleGVkUHJvY2Vzc29yLmgKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfVE1VTFRJUExFWEVEUFJPQ0VTU09SX0hfCisjZGVmaW5lIFRIUklGVF9UTVVMVElQTEVYRURQUk9DRVNTT1JfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvVFByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGJvb3N0L3Rva2VuaXplci5ocHA+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCisvKioKKyAqICBUbyBiZSBhYmxlIHRvIHdvcmsgd2l0aCBhbnkgcHJvdG9jb2wsIHdlIG5lZWRlZAorICogIHRvIGFsbG93IHRoZW0gdG8gY2FsbCByZWFkTWVzc2FnZUJlZ2luKCkgYW5kIGdldCBhIFRNZXNzYWdlIGluIGV4YWN0bHkKKyAqICB0aGUgc3RhbmRhcmQgZm9ybWF0LCB3aXRob3V0IHRoZSBzZXJ2aWNlIG5hbWUgcHJlcGVuZGVkIHRvIFRNZXNzYWdlLm5hbWUuCisgKi8KK2NsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbCA6IHB1YmxpYyBUUHJvdG9jb2xEZWNvcmF0b3IgeworcHVibGljOgorICBTdG9yZWRNZXNzYWdlUHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IF9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgX3NlcWlkKQorICAgIDogVFByb3RvY29sRGVjb3JhdG9yKF9wcm90b2NvbCksIG5hbWUoX25hbWUpLCB0eXBlKF90eXBlKSwgc2VxaWQoX3NlcWlkKSB7fQorCisgIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW5fdmlydChzdGQ6OnN0cmluZyYgX25hbWUsIFRNZXNzYWdlVHlwZSYgX3R5cGUsIGludDMyX3QmIF9zZXFpZCkgeworCisgICAgX25hbWUgPSBuYW1lOworICAgIF90eXBlID0gdHlwZTsKKyAgICBfc2VxaWQgPSBzZXFpZDsKKworICAgIHJldHVybiAwOyAvLyAoTm9ybWFsIFRQcm90b2NvbCByZWFkIGZ1bmN0aW9ucyByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHJlYWQpCisgIH0KKworICBzdGQ6OnN0cmluZyBuYW1lOworICBUTWVzc2FnZVR5cGUgdHlwZTsKKyAgaW50MzJfdCBzZXFpZDsKK307Cit9IC8vIG5hbWVzcGFjZSBwcm90b2NvbAorCisvKioKKyAqIDxjb2RlPlRNdWx0aXBsZXhlZFByb2Nlc3NvcjwvY29kZT4gaXMgYSA8Y29kZT5UUHJvY2Vzc29yPC9jb2RlPiBhbGxvd2luZworICogYSBzaW5nbGUgPGNvZGU+VFNlcnZlcjwvY29kZT4gdG8gcHJvdmlkZSBtdWx0aXBsZSBzZXJ2aWNlcy4KKyAqCisgKiA8cD5UbyBkbyBzbywgeW91IGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gcmVnaXN0ZXIgYWRkaXRpb25hbAorICogcHJvY2Vzc29ycyB3aXRoIGl0LCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6PC9wPgorICoKKyAqIDxibG9ja3F1b3RlPjxjb2RlPgorICogICAgIHN0ZDo6c2hhcmVkX3B0cjxUTXVsdGlwbGV4ZWRQcm9jZXNzb3I+IHByb2Nlc3NvcihuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCkpOworICoKKyAqICAgICBwcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKAorICogICAgICAgICAiQ2FsY3VsYXRvciIsCisgKiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiggbmV3IENhbGN1bGF0b3JQcm9jZXNzb3IoCisgKiAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FsY3VsYXRvckhhbmRsZXI+KCBuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKSkpKSk7CisgKgorICogICAgIHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoCisgKiAgICAgICAgICJXZWF0aGVyUmVwb3J0IiwKKyAqICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+KCBuZXcgV2VhdGhlclJlcG9ydFByb2Nlc3NvcigKKyAqICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxXZWF0aGVyUmVwb3J0SGFuZGxlcj4oIG5ldyBXZWF0aGVyUmVwb3J0SGFuZGxlcigpKSkpKTsKKyAqCisgKiAgICAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVFNlcnZlclNvY2tldCg5MDkwKSk7CisgKiAgICAgVFNpbXBsZVNlcnZlciBzZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQpOworICoKKyAqICAgICBzZXJ2ZXIuc2VydmUoKTsKKyAqIDwvY29kZT48L2Jsb2NrcXVvdGU+CisgKi8KK2NsYXNzIFRNdWx0aXBsZXhlZFByb2Nlc3NvciA6IHB1YmxpYyBUUHJvY2Vzc29yIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+ID4gc2VydmljZXNfdDsKKworICAvKioKKyAgICAqICdSZWdpc3RlcicgYSBzZXJ2aWNlIHdpdGggdGhpcyA8Y29kZT5UTXVsdGlwbGV4ZWRQcm9jZXNzb3I8L2NvZGU+LiAgVGhpcworICAgICogYWxsb3dzIHVzIHRvIGJyb2tlciByZXF1ZXN0cyB0byBpbmRpdmlkdWFsIHNlcnZpY2VzIGJ5IHVzaW5nIHRoZSBzZXJ2aWNlCisgICAgKiBuYW1lIHRvIHNlbGVjdCB0aGVtIGF0IHJlcXVlc3QgdGltZS4KKyAgICAqCisgICAgKiBccGFyYW0gW2luXSBzZXJ2aWNlTmFtZSBOYW1lIG9mIGEgc2VydmljZSwgaGFzIHRvIGJlIGlkZW50aWNhbCB0byB0aGUgbmFtZQorICAgICogICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWQgaW4gdGhlIFRocmlmdCBJREwsIGUuZy4gIldlYXRoZXJSZXBvcnQiLgorICAgICogXHBhcmFtIFtpbl0gcHJvY2Vzc29yICAgSW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2aWNlLCB1c3VhbGx5IHJlZmVycmVkIHRvCisgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBhcyAiaGFuZGxlcnMiLCBlLmcuIFdlYXRoZXJSZXBvcnRIYW5kbGVyLAorICAgICogICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50aW5nIFdlYXRoZXJSZXBvcnRJZiBpbnRlcmZhY2UuCisgICAgKi8KKyAgdm9pZCByZWdpc3RlclByb2Nlc3Nvcihjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZU5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IpIHsKKyAgICBzZXJ2aWNlc1tzZXJ2aWNlTmFtZV0gPSBwcm9jZXNzb3I7CisgIH0KKworICAvKioKKyAgICogUmVnaXN0ZXIgYSBzZXJ2aWNlIHRvIGJlIGNhbGxlZCB0byBwcm9jZXNzIHF1ZXJpZXMgd2l0aG91dCBzZXJ2aWNlIG5hbWUKKyAgICogXHBhcmFtIFtpbl0gcHJvY2Vzc29yICAgSW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2aWNlLgorICAgKi8KKyAgdm9pZCByZWdpc3RlckRlZmF1bHQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IpIHsKKyAgICBkZWZhdWx0UHJvY2Vzc29yID0gcHJvY2Vzc29yOworICB9CisKKyAgLyoqCisgICAqIENoZXcgdXAgaW52YWxpZCBpbnB1dCBhbmQgcmV0dXJuIGFuIGV4Y2VwdGlvbiB0byB0aHJvdy4KKyAgICovCisgIFRFeGNlcHRpb24gcHJvdG9jb2xfZXJyb3Ioc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIGNvbnN0IHsKKyAgICBpbi0+c2tpcCg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QpOworICAgIGluLT5yZWFkTWVzc2FnZUVuZCgpOworICAgIGluLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOworICAgIDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbgorICAgICAgeCg6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb246OlBST1RPQ09MX0VSUk9SLAorICAgICAgICAiVE11bHRpcGxleGVkUHJvY2Vzc29yOiAiICsgbXNnKTsKKyAgICBvdXQtPndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTiwgc2VxaWQpOworICAgIHgud3JpdGUob3V0LmdldCgpKTsKKyAgICBvdXQtPndyaXRlTWVzc2FnZUVuZCgpOworICAgIG91dC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7CisgICAgb3V0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsKKyAgICByZXR1cm4gVEV4Y2VwdGlvbihtc2cpOworfQorICAgCisgIC8qKgorICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPnByb2Nlc3M8L2NvZGU+IHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6CisgICAqCisgICAqIDxvbD4KKyAgICogICAgIDxsaT5SZWFkIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UuPC9saT4KKyAgICogICAgIDxsaT5FeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgbWVzc2FnZS48L2xpPgorICAgKiAgICAgPGxpPlVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IuPC9saT4KKyAgICogICAgIDxsaT5EaXNwYXRjaCB0byB0aGUgcHJvY2Vzc29yLCB3aXRoIGEgZGVjb3JhdGVkIGluc3RhbmNlIG9mIFRQcm90b2NvbAorICAgKiAgICAgICAgIHRoYXQgYWxsb3dzIHJlYWRNZXNzYWdlQmVnaW4oKSB0byByZXR1cm4gdGhlIG9yaWdpbmFsIFRNZXNzYWdlLjwvbGk+CisgICAqIDwvb2w+CisgICAqCisgICAqIFx0aHJvd3MgVEV4Y2VwdGlvbiBJZiB0aGUgbWVzc2FnZSB0eXBlIGlzIG5vdCBUX0NBTEwgb3IgVF9PTkVXQVksIGlmCisgICAqIHRoZSBzZXJ2aWNlIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgbWVzc2FnZSwgb3IgaWYgdGhlIHNlcnZpY2UKKyAgICogbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBzZXJ2aWNlIG1hcC4KKyAgICovCisgIGJvb2wgcHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAorICAgICAgICAgICAgICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpIHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIHByb3RvY29sOjpUTWVzc2FnZVR5cGUgdHlwZTsKKyAgICBpbnQzMl90IHNlcWlkOworCisgICAgLy8gVXNlIHRoZSBhY3R1YWwgdW5kZXJseWluZyBwcm90b2NvbCAoZS5nLiBUQmluYXJ5UHJvdG9jb2wpIHRvIHJlYWQgdGhlCisgICAgLy8gbWVzc2FnZSBoZWFkZXIuICBUaGlzIHB1bGxzIHRoZSBtZXNzYWdlICJvZmYgdGhlIHdpcmUiLCB3aGljaCB3ZSdsbAorICAgIC8vIGRlYWwgd2l0aCBhdCB0aGUgZW5kIG9mIHRoaXMgbWV0aG9kLgorICAgIGluLT5yZWFkTWVzc2FnZUJlZ2luKG5hbWUsIHR5cGUsIHNlcWlkKTsKKworICAgIGlmICh0eXBlICE9IHByb3RvY29sOjpUX0NBTEwgJiYgdHlwZSAhPSBwcm90b2NvbDo6VF9PTkVXQVkpIHsKKyAgICAgIC8vIFVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlLgorICAgICAgdGhyb3cgcHJvdG9jb2xfZXJyb3IoaW4sIG91dCwgbmFtZSwgc2VxaWQsICJVbmV4cGVjdGVkIG1lc3NhZ2UgdHlwZSIpOworICAgIH0KKworICAgIC8vIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZQorICAgIGJvb3N0Ojp0b2tlbml6ZXI8Ym9vc3Q6OmNoYXJfc2VwYXJhdG9yPGNoYXI+ID4gdG9rKG5hbWUsIGJvb3N0OjpjaGFyX3NlcGFyYXRvcjxjaGFyPigiOiIpKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0b2tlbnM7CisgICAgc3RkOjpjb3B5KHRvay5iZWdpbigpLCB0b2suZW5kKCksIHN0ZDo6YmFja19pbnNlcnRlcih0b2tlbnMpKTsKKworICAgIC8vIEEgdmFsaWQgbWVzc2FnZSBzaG91bGQgY29uc2lzdCBvZiB0d28gdG9rZW5zOiB0aGUgc2VydmljZQorICAgIC8vIG5hbWUgYW5kIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gY2FsbC4KKyAgICBpZiAodG9rZW5zLnNpemUoKSA9PSAyKSB7CisgICAgICAvLyBTZWFyY2ggZm9yIGEgcHJvY2Vzc29yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZpY2UgbmFtZS4KKyAgICAgIHNlcnZpY2VzX3Q6Oml0ZXJhdG9yIGl0ID0gc2VydmljZXMuZmluZCh0b2tlbnNbMF0pOworCisgICAgICBpZiAoaXQgIT0gc2VydmljZXMuZW5kKCkpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciA9IGl0LT5zZWNvbmQ7CisgICAgICAgIC8vIExldCB0aGUgcHJvY2Vzc29yIHJlZ2lzdGVyZWQgZm9yIHRoaXMgc2VydmljZSBuYW1lCisgICAgICAgIC8vIHByb2Nlc3MgdGhlIG1lc3NhZ2UuCisgICAgICAgIHJldHVybiBwcm9jZXNzb3IKKyAgICAgICAgICAgIC0+cHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBwcm90b2NvbDo6U3RvcmVkTWVzc2FnZVByb3RvY29sKGluLCB0b2tlbnNbMV0sIHR5cGUsIHNlcWlkKSksCisgICAgICAgICAgICAgICAgICAgICAgb3V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFVua25vd24gc2VydmljZS4KKyAgICAgICAgdGhyb3cgcHJvdG9jb2xfZXJyb3IoaW4sIG91dCwgbmFtZSwgc2VxaWQsIAorICAgICAgICAgICAgIlVua25vd24gc2VydmljZTogIiArIHRva2Vuc1swXSArCisJCQkJIi4gRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyIpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodG9rZW5zLnNpemUoKSA9PSAxKSB7CisJICBpZiAoZGVmYXVsdFByb2Nlc3NvcikgeworICAgICAgICAvLyBub24tbXVsdGlwbGV4ZWQgY2xpZW50IGZvcndhcmRzIHRvIGRlZmF1bHQgcHJvY2Vzc29yCisgICAgICAgIHJldHVybiBkZWZhdWx0UHJvY2Vzc29yICAgICAgICAgICAgCisgICAgICAgICAgICAtPnByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+KAorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgcHJvdG9jb2w6OlN0b3JlZE1lc3NhZ2VQcm90b2NvbChpbiwgdG9rZW5zWzBdLCB0eXBlLCBzZXFpZCkpLAorICAgICAgICAgICAgICAgICAgICAgIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCk7CisJICB9IGVsc2UgeworCQl0aHJvdyBwcm90b2NvbF9lcnJvcihpbiwgb3V0LCBuYW1lLCBzZXFpZCwKKwkJCSJOb24tbXVsdGlwbGV4ZWQgY2xpZW50IHJlcXVlc3QgZHJvcHBlZC4gIgorCQkJIkRpZCB5b3UgZm9yZ2V0IHRvIGNhbGwgZGVmYXVsdFByb2Nlc3NvcigpPyIpOworCSAgfQorICAgIH0gZWxzZSB7CisJCXRocm93IHByb3RvY29sX2Vycm9yKGluLCBvdXQsIG5hbWUsIHNlcWlkLAorCQkgICAgIldyb25nIG51bWJlciBvZiB0b2tlbnMuIik7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIC8qKiBNYXAgb2Ygc2VydmljZSBwcm9jZXNzb3Igb2JqZWN0cywgaW5kZXhlZCBieSBzZXJ2aWNlIG5hbWVzLiAqLworICBzZXJ2aWNlc190IHNlcnZpY2VzOworICAKKyAgLy8hIElmIGEgbm9uLW11bHRpIGNsaWVudCByZXF1ZXN0cyBzb21ldGhpbmcsIGl0IGdvZXMgdG8gdGhlCisgIC8vISBkZWZhdWx0IHByb2Nlc3NvciAoaWYgb25lIGlzIGRlZmluZWQpIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGRlZmF1bHRQcm9jZXNzb3I7Cit9OworfQorfQorCisjZW5kaWYgLy8gVEhSSUZUX1RNVUxUSVBMRVhFRFBST0NFU1NPUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDc0ZjVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5jcHAKQEAgLTAsMCArMSwzMTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuaD4KKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCitzdGF0aWMgY29uc3QgdWludDhfdCoga0Jhc2U2NEVuY29kZVRhYmxlCisgICAgPSAoY29uc3QgdWludDhfdCopIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOworCit2b2lkIGJhc2U2NF9lbmNvZGUoY29uc3QgdWludDhfdCogaW4sIHVpbnQzMl90IGxlbiwgdWludDhfdCogYnVmKSB7CisgIGJ1ZlswXSA9IGtCYXNlNjRFbmNvZGVUYWJsZVsoaW5bMF0gPj4gMikgJiAweDNmXTsKKyAgaWYgKGxlbiA9PSAzKSB7CisgICAgYnVmWzFdID0ga0Jhc2U2NEVuY29kZVRhYmxlWygoaW5bMF0gPDwgNCkgJiAweDMwKSB8ICgoaW5bMV0gPj4gNCkgJiAweDBmKV07CisgICAgYnVmWzJdID0ga0Jhc2U2NEVuY29kZVRhYmxlWygoaW5bMV0gPDwgMikgJiAweDNjKSB8ICgoaW5bMl0gPj4gNikgJiAweDAzKV07CisgICAgYnVmWzNdID0ga0Jhc2U2NEVuY29kZVRhYmxlW2luWzJdICYgMHgzZl07CisgIH0gZWxzZSBpZiAobGVuID09IDIpIHsKKyAgICBidWZbMV0gPSBrQmFzZTY0RW5jb2RlVGFibGVbKChpblswXSA8PCA0KSAmIDB4MzApIHwgKChpblsxXSA+PiA0KSAmIDB4MGYpXTsKKyAgICBidWZbMl0gPSBrQmFzZTY0RW5jb2RlVGFibGVbKGluWzFdIDw8IDIpICYgMHgzY107CisgIH0gZWxzZSB7IC8vIGxlbiA9PSAxCisgICAgYnVmWzFdID0ga0Jhc2U2NEVuY29kZVRhYmxlWyhpblswXSA8PCA0KSAmIDB4MzBdOworICB9Cit9CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtCYXNlNjREZWNvZGVUYWJsZVsyNTZdID0geworICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHgzZSwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweDNmLAorICAgIDB4MzQsCisgICAgMHgzNSwKKyAgICAweDM2LAorICAgIDB4MzcsCisgICAgMHgzOCwKKyAgICAweDM5LAorICAgIDB4M2EsCisgICAgMHgzYiwKKyAgICAweDNjLAorICAgIDB4M2QsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweDAwLAorICAgIDB4MDEsCisgICAgMHgwMiwKKyAgICAweDAzLAorICAgIDB4MDQsCisgICAgMHgwNSwKKyAgICAweDA2LAorICAgIDB4MDcsCisgICAgMHgwOCwKKyAgICAweDA5LAorICAgIDB4MGEsCisgICAgMHgwYiwKKyAgICAweDBjLAorICAgIDB4MGQsCisgICAgMHgwZSwKKyAgICAweDBmLAorICAgIDB4MTAsCisgICAgMHgxMSwKKyAgICAweDEyLAorICAgIDB4MTMsCisgICAgMHgxNCwKKyAgICAweDE1LAorICAgIDB4MTYsCisgICAgMHgxNywKKyAgICAweDE4LAorICAgIDB4MTksCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHgxYSwKKyAgICAweDFiLAorICAgIDB4MWMsCisgICAgMHgxZCwKKyAgICAweDFlLAorICAgIDB4MWYsCisgICAgMHgyMCwKKyAgICAweDIxLAorICAgIDB4MjIsCisgICAgMHgyMywKKyAgICAweDI0LAorICAgIDB4MjUsCisgICAgMHgyNiwKKyAgICAweDI3LAorICAgIDB4MjgsCisgICAgMHgyOSwKKyAgICAweDJhLAorICAgIDB4MmIsCisgICAgMHgyYywKKyAgICAweDJkLAorICAgIDB4MmUsCisgICAgMHgyZiwKKyAgICAweDMwLAorICAgIDB4MzEsCisgICAgMHgzMiwKKyAgICAweDMzLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCit9OworCit2b2lkIGJhc2U2NF9kZWNvZGUodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgYnVmWzBdID0gKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbMF1dIDw8IDIpIHwgKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbMV1dID4+IDQpOworICBpZiAobGVuID4gMikgeworICAgIGJ1ZlsxXSA9ICgoa0Jhc2U2NERlY29kZVRhYmxlW2J1ZlsxXV0gPDwgNCkgJiAweGYwKSB8IChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzJdXSA+PiAyKTsKKyAgICBpZiAobGVuID4gMykgeworICAgICAgYnVmWzJdID0gKChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzJdXSA8PCA2KSAmIDB4YzApIHwgKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbM11dKTsKKyAgICB9CisgIH0KK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhNjc0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UQkFTRTY0VVRJTFNfSF8KKyNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UQkFTRTY0VVRJTFNfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKKy8vIGluIG11c3QgYmUgYXQgbGVhc3QgbGVuIGJ5dGVzCisvLyBsZW4gbXVzdCBiZSAxLCAyLCBvciAzCisvLyBidWYgbXVzdCBiZSBhIGJ1ZmZlciBvZiBhdCBsZWFzdCA0IGJ5dGVzIGFuZCBtYXkgbm90IG92ZXJsYXAgaW4KKy8vIHRoZSBkYXRhIGlzIG5vdCBwYWRkZWQgd2l0aCAnPSc7IHRoZSBjYWxsZXIgY2FuIGRvIHRoaXMgaWYgZGVzaXJlZAordm9pZCBiYXNlNjRfZW5jb2RlKGNvbnN0IHVpbnQ4X3QqIGluLCB1aW50MzJfdCBsZW4sIHVpbnQ4X3QqIGJ1Zik7CisKKy8vIGJ1ZiBtdXN0IGJlIGEgYnVmZmVyIG9mIGF0IGxlYXN0IDQgYnl0ZXMgYW5kIGNvbnRhaW4gYmFzZTY0IGVuY29kZWQgdmFsdWVzCisvLyBidWYgd2lsbCBiZSBjaGFuZ2VkIHRvIGNvbnRhaW4gb3V0cHV0IGJ5dGVzCisvLyBsZW4gaXMgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbnN1bWUgZnJvbSBpbnB1dCAobXVzdCBiZSAyLCAzLCBvciA0KQorLy8gbm8gJz0nIHBhZGRpbmcgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBpbnB1dAordm9pZCBiYXNlNjRfZGVjb2RlKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCisKKyNlbmRpZiAvLyAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVEJBU0U2NFVUSUxTX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2Nzc1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaApAQCAtMCwwICsxLDI1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVEJJTkFSWVBST1RPQ09MX0hfCisjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVEJJTkFSWVBST1RPQ09MX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKworLyoqCisgKiBUaGUgZGVmYXVsdCBiaW5hcnkgcHJvdG9jb2wgZm9yIHRocmlmdC4gV3JpdGVzIGFsbCBkYXRhIGluIGEgdmVyeSBiYXNpYworICogYmluYXJ5IGZvcm1hdCwgZXNzZW50aWFsbHkganVzdCBzcGl0dGluZyBvdXQgdGhlIHJhdyBieXRlcy4KKyAqCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfID0gVE5ldHdvcmtCaWdFbmRpYW4+CitjbGFzcyBUQmluYXJ5UHJvdG9jb2xUIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8VEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPiA+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGludDMyX3QgVkVSU0lPTl9NQVNLID0gKChpbnQzMl90KTB4ZmZmZjAwMDApOworICBzdGF0aWMgY29uc3QgaW50MzJfdCBWRVJTSU9OXzEgPSAoKGludDMyX3QpMHg4MDAxMDAwMCk7CisgIC8vIFZFUlNJT05fMiAoMHg4MDAyMDAwMCkgd2FzIHRha2VuIGJ5IFREZW5zZVByb3RvY29sICh3aGljaCBoYXMgc2luY2UgYmVlbiByZW1vdmVkKQorCisgIFRCaW5hcnlQcm90b2NvbFQoc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zKQorICAgIDogVFZpcnR1YWxQcm90b2NvbDxUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+ID4odHJhbnMpLAorICAgICAgdHJhbnNfKHRyYW5zLmdldCgpKSwKKyAgICAgIHN0cmluZ19saW1pdF8oMCksCisgICAgICBjb250YWluZXJfbGltaXRfKDApLAorICAgICAgc3RyaWN0X3JlYWRfKGZhbHNlKSwKKyAgICAgIHN0cmljdF93cml0ZV8odHJ1ZSkge30KKworICBUQmluYXJ5UHJvdG9jb2xUKHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFucywKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmluZ19saW1pdCwKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCwKKyAgICAgICAgICAgICAgICAgICBib29sIHN0cmljdF9yZWFkLAorICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyaWN0X3dyaXRlKQorICAgIDogVFZpcnR1YWxQcm90b2NvbDxUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+ID4odHJhbnMpLAorICAgICAgdHJhbnNfKHRyYW5zLmdldCgpKSwKKyAgICAgIHN0cmluZ19saW1pdF8oc3RyaW5nX2xpbWl0KSwKKyAgICAgIGNvbnRhaW5lcl9saW1pdF8oY29udGFpbmVyX2xpbWl0KSwKKyAgICAgIHN0cmljdF9yZWFkXyhzdHJpY3RfcmVhZCksCisgICAgICBzdHJpY3Rfd3JpdGVfKHN0cmljdF93cml0ZSkge30KKworICB2b2lkIHNldFN0cmluZ1NpemVMaW1pdChpbnQzMl90IHN0cmluZ19saW1pdCkgeyBzdHJpbmdfbGltaXRfID0gc3RyaW5nX2xpbWl0OyB9CisKKyAgdm9pZCBzZXRDb250YWluZXJTaXplTGltaXQoaW50MzJfdCBjb250YWluZXJfbGltaXQpIHsgY29udGFpbmVyX2xpbWl0XyA9IGNvbnRhaW5lcl9saW1pdDsgfQorCisgIHZvaWQgc2V0U3RyaWN0KGJvb2wgc3RyaWN0X3JlYWQsIGJvb2wgc3RyaWN0X3dyaXRlKSB7CisgICAgc3RyaWN0X3JlYWRfID0gc3RyaWN0X3JlYWQ7CisgICAgc3RyaWN0X3dyaXRlXyA9IHN0cmljdF93cml0ZTsKKyAgfQorCisgIC8qKgorICAgKiBXcml0aW5nIGZ1bmN0aW9ucy4KKyAgICovCisKKyAgLypvbCovIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCk7CisKKyAgLypvbCovIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZCgpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgVFR5cGUgZmllbGRUeXBlLCBjb25zdCBpbnQxNl90IGZpZWxkSWQpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZUZpZWxkRW5kKCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwgY29uc3QgVFR5cGUgdmFsVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlTWFwRW5kKCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKKworICBpbmxpbmUgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZVNldEVuZCgpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSk7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSk7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KTsKKworICBpbmxpbmUgdWludDMyX3Qgd3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTdHJUeXBlPgorICBpbmxpbmUgdWludDMyX3Qgd3JpdGVTdHJpbmcoY29uc3QgU3RyVHlwZSYgc3RyKTsKKworICBpbmxpbmUgdWludDMyX3Qgd3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgLyoqCisgICAqIFJlYWRpbmcgZnVuY3Rpb25zCisgICAqLworCisgIC8qb2wqLyB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLCBpbnQzMl90JiBzZXFpZCk7CisKKyAgLypvbCovIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kKCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSk7CisKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKTsKKworICBpbmxpbmUgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpOworCisgIGlubGluZSB1aW50MzJfdCByZWFkRmllbGRFbmQoKTsKKworICBpbmxpbmUgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpOworCisgIGlubGluZSB1aW50MzJfdCByZWFkTWFwRW5kKCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSk7CisKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRMaXN0RW5kKCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICBpbmxpbmUgdWludDMyX3QgcmVhZFNldEVuZCgpOworCisgIGlubGluZSB1aW50MzJfdCByZWFkQm9vbChib29sJiB2YWx1ZSk7CisgIC8vIFByb3ZpZGUgdGhlIGRlZmF1bHQgcmVhZEJvb2woKSBpbXBsZW1lbnRhdGlvbiBmb3Igc3RkOjp2ZWN0b3I8Ym9vbD4KKyAgdXNpbmcgVFZpcnR1YWxQcm90b2NvbDxUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+ID46OnJlYWRCb29sOworCisgIGlubGluZSB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpOworCisgIGlubGluZSB1aW50MzJfdCByZWFkSTE2KGludDE2X3QmIGkxNik7CisKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRJMzIoaW50MzJfdCYgaTMyKTsKKworICBpbmxpbmUgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpOworCisgIGlubGluZSB1aW50MzJfdCByZWFkRG91YmxlKGRvdWJsZSYgZHViKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyVHlwZT4KKyAgaW5saW5lIHVpbnQzMl90IHJlYWRTdHJpbmcoU3RyVHlwZSYgc3RyKTsKKworICBpbmxpbmUgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKTsKKworcHJvdGVjdGVkOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyVHlwZT4KKyAgdWludDMyX3QgcmVhZFN0cmluZ0JvZHkoU3RyVHlwZSYgc3RyLCBpbnQzMl90IHN6KTsKKworICBUcmFuc3BvcnRfKiB0cmFuc187CisKKyAgaW50MzJfdCBzdHJpbmdfbGltaXRfOworICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdF87CisKKyAgLy8gRW5mb3JjZSBwcmVzZW5jZSBvZiB2ZXJzaW9uIGlkZW50aWZpZXIKKyAgYm9vbCBzdHJpY3RfcmVhZF87CisgIGJvb2wgc3RyaWN0X3dyaXRlXzsKK307CisKK3R5cGVkZWYgVEJpbmFyeVByb3RvY29sVDxUVHJhbnNwb3J0PiBUQmluYXJ5UHJvdG9jb2w7Cit0eXBlZGVmIFRCaW5hcnlQcm90b2NvbFQ8VFRyYW5zcG9ydCwgVE5ldHdvcmtMaXR0bGVFbmRpYW4+IFRMRUJpbmFyeVByb3RvY29sOworCisvKioKKyAqIENvbnN0cnVjdHMgYmluYXJ5IHByb3RvY29sIGhhbmRsZXJzCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfID0gVE5ldHdvcmtCaWdFbmRpYW4+CitjbGFzcyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5VCA6IHB1YmxpYyBUUHJvdG9jb2xGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVEJpbmFyeVByb3RvY29sRmFjdG9yeVQoKQorICAgIDogc3RyaW5nX2xpbWl0XygwKSwgY29udGFpbmVyX2xpbWl0XygwKSwgc3RyaWN0X3JlYWRfKGZhbHNlKSwgc3RyaWN0X3dyaXRlXyh0cnVlKSB7fQorCisgIFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUKGludDMyX3Qgc3RyaW5nX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpY3RfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpY3Rfd3JpdGUpCisgICAgOiBzdHJpbmdfbGltaXRfKHN0cmluZ19saW1pdCksCisgICAgICBjb250YWluZXJfbGltaXRfKGNvbnRhaW5lcl9saW1pdCksCisgICAgICBzdHJpY3RfcmVhZF8oc3RyaWN0X3JlYWQpLAorICAgICAgc3RyaWN0X3dyaXRlXyhzdHJpY3Rfd3JpdGUpIHt9CisKKyAgdmlydHVhbCB+VEJpbmFyeVByb3RvY29sRmFjdG9yeVQoKSB7fQorCisgIHZvaWQgc2V0U3RyaW5nU2l6ZUxpbWl0KGludDMyX3Qgc3RyaW5nX2xpbWl0KSB7IHN0cmluZ19saW1pdF8gPSBzdHJpbmdfbGltaXQ7IH0KKworICB2b2lkIHNldENvbnRhaW5lclNpemVMaW1pdChpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkgeyBjb250YWluZXJfbGltaXRfID0gY29udGFpbmVyX2xpbWl0OyB9CisKKyAgdm9pZCBzZXRTdHJpY3QoYm9vbCBzdHJpY3RfcmVhZCwgYm9vbCBzdHJpY3Rfd3JpdGUpIHsKKyAgICBzdHJpY3RfcmVhZF8gPSBzdHJpY3RfcmVhZDsKKyAgICBzdHJpY3Rfd3JpdGVfID0gc3RyaWN0X3dyaXRlOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHNwZWNpZmljX3RyYW5zID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUcmFuc3BvcnRfPih0cmFucyk7CisgICAgVFByb3RvY29sKiBwcm90OworICAgIGlmIChzcGVjaWZpY190cmFucykgeworICAgICAgcHJvdCA9IG5ldyBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+KHNwZWNpZmljX3RyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19saW1pdF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX2xpbWl0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3RfcmVhZF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0X3dyaXRlXyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb3QgPSBuZXcgVEJpbmFyeVByb3RvY29sVDxUVHJhbnNwb3J0LCBCeXRlT3JkZXJfPih0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfbGltaXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9saW1pdF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0X3JlYWRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdF93cml0ZV8pOworICAgIH0KKworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPihwcm90KTsKKyAgfQorCitwcml2YXRlOgorICBpbnQzMl90IHN0cmluZ19saW1pdF87CisgIGludDMyX3QgY29udGFpbmVyX2xpbWl0XzsKKyAgYm9vbCBzdHJpY3RfcmVhZF87CisgIGJvb2wgc3RyaWN0X3dyaXRlXzsKK307CisKK3R5cGVkZWYgVEJpbmFyeVByb3RvY29sRmFjdG9yeVQ8VFRyYW5zcG9ydD4gVEJpbmFyeVByb3RvY29sRmFjdG9yeTsKK3R5cGVkZWYgVEJpbmFyeVByb3RvY29sRmFjdG9yeVQ8VFRyYW5zcG9ydCwgVE5ldHdvcmtMaXR0bGVFbmRpYW4+IFRMRUJpbmFyeVByb3RvY29sRmFjdG9yeTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnRjYz4KKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UQklOQVJZUFJPVE9DT0xfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wudGNjIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU3Mzk5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wudGNjCkBAIC0wLDAgKzEsNDU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UQklOQVJZUFJPVE9DT0xfVENDXworI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RCSU5BUllQUk9UT0NPTF9UQ0NfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKworI2luY2x1ZGUgPGxpbWl0cz4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7CisgIGlmICh0aGlzLT5zdHJpY3Rfd3JpdGVfKSB7CisgICAgaW50MzJfdCB2ZXJzaW9uID0gKFZFUlNJT05fMSkgfCAoKGludDMyX3QpbWVzc2FnZVR5cGUpOworICAgIHVpbnQzMl90IHdzaXplID0gMDsKKyAgICB3c2l6ZSArPSB3cml0ZUkzMih2ZXJzaW9uKTsKKyAgICB3c2l6ZSArPSB3cml0ZVN0cmluZyhuYW1lKTsKKyAgICB3c2l6ZSArPSB3cml0ZUkzMihzZXFpZCk7CisgICAgcmV0dXJuIHdzaXplOworICB9IGVsc2UgeworICAgIHVpbnQzMl90IHdzaXplID0gMDsKKyAgICB3c2l6ZSArPSB3cml0ZVN0cmluZyhuYW1lKTsKKyAgICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGludDhfdCltZXNzYWdlVHlwZSk7CisgICAgd3NpemUgKz0gd3JpdGVJMzIoc2VxaWQpOworICAgIHJldHVybiB3c2l6ZTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlTWVzc2FnZUVuZCgpIHsKKyAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7CisgICh2b2lkKW5hbWU7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlU3RydWN0RW5kKCkgeworICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CisgICh2b2lkKW5hbWU7CisgIHVpbnQzMl90IHdzaXplID0gMDsKKyAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3QpZmllbGRUeXBlKTsKKyAgd3NpemUgKz0gd3JpdGVJMTYoZmllbGRJZCk7CisgIHJldHVybiB3c2l6ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUZpZWxkRW5kKCkgeworICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUZpZWxkU3RvcCgpIHsKKyAgcmV0dXJuIHdyaXRlQnl0ZSgoaW50OF90KVRfU1RPUCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHVpbnQzMl90IHdzaXplID0gMDsKKyAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3Qpa2V5VHlwZSk7CisgIHdzaXplICs9IHdyaXRlQnl0ZSgoaW50OF90KXZhbFR5cGUpOworICB3c2l6ZSArPSB3cml0ZUkzMigoaW50MzJfdClzaXplKTsKKyAgcmV0dXJuIHdzaXplOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlTWFwRW5kKCkgeworICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGludDhfdCllbGVtVHlwZSk7CisgIHdzaXplICs9IHdyaXRlSTMyKChpbnQzMl90KXNpemUpOworICByZXR1cm4gd3NpemU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVMaXN0RW5kKCkgeworICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHVpbnQzMl90IHdzaXplID0gMDsKKyAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3QpZWxlbVR5cGUpOworICB3c2l6ZSArPSB3cml0ZUkzMigoaW50MzJfdClzaXplKTsKKyAgcmV0dXJuIHdzaXplOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlU2V0RW5kKCkgeworICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgeworICB1aW50OF90IHRtcCA9IHZhbHVlID8gMSA6IDA7CisgIHRoaXMtPnRyYW5zXy0+d3JpdGUoJnRtcCwgMSk7CisgIHJldHVybiAxOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgeworICB0aGlzLT50cmFuc18tPndyaXRlKCh1aW50OF90KikmYnl0ZSwgMSk7CisgIHJldHVybiAxOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KSB7CisgIGludDE2X3QgbmV0ID0gKGludDE2X3QpQnl0ZU9yZGVyXzo6dG9XaXJlMTYoaTE2KTsKKyAgdGhpcy0+dHJhbnNfLT53cml0ZSgodWludDhfdCopJm5ldCwgMik7CisgIHJldHVybiAyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKSB7CisgIGludDMyX3QgbmV0ID0gKGludDMyX3QpQnl0ZU9yZGVyXzo6dG9XaXJlMzIoaTMyKTsKKyAgdGhpcy0+dHJhbnNfLT53cml0ZSgodWludDhfdCopJm5ldCwgNCk7CisgIHJldHVybiA0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KSB7CisgIGludDY0X3QgbmV0ID0gKGludDY0X3QpQnl0ZU9yZGVyXzo6dG9XaXJlNjQoaTY0KTsKKyAgdGhpcy0+dHJhbnNfLT53cml0ZSgodWludDhfdCopJm5ldCwgOCk7CisgIHJldHVybiA4OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpIHsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpLCAic2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSIpOworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5LCAic3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTkiKTsKKworICB1aW50NjRfdCBiaXRzID0gYml0d2lzZV9jYXN0PHVpbnQ2NF90PihkdWIpOworICBiaXRzID0gQnl0ZU9yZGVyXzo6dG9XaXJlNjQoYml0cyk7CisgIHRoaXMtPnRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKSZiaXRzLCA4KTsKKyAgcmV0dXJuIDg7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordGVtcGxhdGUgPHR5cGVuYW1lIFN0clR5cGU+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZVN0cmluZyhjb25zdCBTdHJUeXBlJiBzdHIpIHsKKyAgaWYgKHN0ci5zaXplKCkgPiBzdGF0aWNfY2FzdDxzaXplX3Q+KChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkpKQorICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICB1aW50MzJfdCBzaXplID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ci5zaXplKCkpOworICB1aW50MzJfdCByZXN1bHQgPSB3cml0ZUkzMigoaW50MzJfdClzaXplKTsKKyAgaWYgKHNpemUgPiAwKSB7CisgICAgdGhpcy0+dHJhbnNfLT53cml0ZSgodWludDhfdCopc3RyLmRhdGEoKSwgc2l6ZSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdCArIHNpemU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICByZXR1cm4gVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVTdHJpbmcoc3RyKTsKK30KKworLyoqCisgKiBSZWFkaW5nIGZ1bmN0aW9ucworICovCisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgaW50MzJfdCBzejsKKyAgcmVzdWx0ICs9IHJlYWRJMzIoc3opOworCisgIGlmIChzeiA8IDApIHsKKyAgICAvLyBDaGVjayBmb3IgY29ycmVjdCB2ZXJzaW9uIG51bWJlcgorICAgIGludDMyX3QgdmVyc2lvbiA9IHN6ICYgVkVSU0lPTl9NQVNLOworICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkgeworICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sICJCYWQgdmVyc2lvbiBpZGVudGlmaWVyIik7CisgICAgfQorICAgIG1lc3NhZ2VUeXBlID0gKFRNZXNzYWdlVHlwZSkoc3ogJiAweDAwMDAwMGZmKTsKKyAgICByZXN1bHQgKz0gcmVhZFN0cmluZyhuYW1lKTsKKyAgICByZXN1bHQgKz0gcmVhZEkzMihzZXFpZCk7CisgIH0gZWxzZSB7CisgICAgaWYgKHRoaXMtPnN0cmljdF9yZWFkXykgeworICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIHZlcnNpb24gaWRlbnRpZmllci4uLiBvbGQgcHJvdG9jb2wgY2xpZW50IGluIHN0cmljdCBtb2RlPyIpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBIYW5kbGUgcHJlLXZlcnNpb25lZCBpbnB1dAorICAgICAgaW50OF90IHR5cGU7CisgICAgICByZXN1bHQgKz0gcmVhZFN0cmluZ0JvZHkobmFtZSwgc3opOworICAgICAgcmVzdWx0ICs9IHJlYWRCeXRlKHR5cGUpOworICAgICAgbWVzc2FnZVR5cGUgPSAoVE1lc3NhZ2VUeXBlKXR5cGU7CisgICAgICByZXN1bHQgKz0gcmVhZEkzMihzZXFpZCk7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZE1lc3NhZ2VFbmQoKSB7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSkgeworICBuYW1lID0gIiI7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRTdHJ1Y3RFbmQoKSB7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKKyAgKHZvaWQpbmFtZTsKKyAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgaW50OF90IHR5cGU7CisgIHJlc3VsdCArPSByZWFkQnl0ZSh0eXBlKTsKKyAgZmllbGRUeXBlID0gKFRUeXBlKXR5cGU7CisgIGlmIChmaWVsZFR5cGUgPT0gVF9TVE9QKSB7CisgICAgZmllbGRJZCA9IDA7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICByZXN1bHQgKz0gcmVhZEkxNihmaWVsZElkKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkRmllbGRFbmQoKSB7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgdmFsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgeworICBpbnQ4X3QgaywgdjsKKyAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgaW50MzJfdCBzaXplaTsKKyAgcmVzdWx0ICs9IHJlYWRCeXRlKGspOworICBrZXlUeXBlID0gKFRUeXBlKWs7CisgIHJlc3VsdCArPSByZWFkQnl0ZSh2KTsKKyAgdmFsVHlwZSA9IChUVHlwZSl2OworICByZXN1bHQgKz0gcmVhZEkzMihzaXplaSk7CisgIGlmIChzaXplaSA8IDApIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKKyAgfSBlbHNlIGlmICh0aGlzLT5jb250YWluZXJfbGltaXRfICYmIHNpemVpID4gdGhpcy0+Y29udGFpbmVyX2xpbWl0XykgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICB9CisgIHNpemUgPSAodWludDMyX3Qpc2l6ZWk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZE1hcEVuZCgpIHsKKyAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgIGludDhfdCBlOworICB1aW50MzJfdCByZXN1bHQgPSAwOworICBpbnQzMl90IHNpemVpOworICByZXN1bHQgKz0gcmVhZEJ5dGUoZSk7CisgIGVsZW1UeXBlID0gKFRUeXBlKWU7CisgIHJlc3VsdCArPSByZWFkSTMyKHNpemVpKTsKKyAgaWYgKHNpemVpIDwgMCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5FR0FUSVZFX1NJWkUpOworICB9IGVsc2UgaWYgKHRoaXMtPmNvbnRhaW5lcl9saW1pdF8gJiYgc2l6ZWkgPiB0aGlzLT5jb250YWluZXJfbGltaXRfKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIH0KKyAgc2l6ZSA9ICh1aW50MzJfdClzaXplaTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkTGlzdEVuZCgpIHsKKyAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgaW50OF90IGU7CisgIHVpbnQzMl90IHJlc3VsdCA9IDA7CisgIGludDMyX3Qgc2l6ZWk7CisgIHJlc3VsdCArPSByZWFkQnl0ZShlKTsKKyAgZWxlbVR5cGUgPSAoVFR5cGUpZTsKKyAgcmVzdWx0ICs9IHJlYWRJMzIoc2l6ZWkpOworICBpZiAoc2l6ZWkgPCAwKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7CisgIH0gZWxzZSBpZiAodGhpcy0+Y29udGFpbmVyX2xpbWl0XyAmJiBzaXplaSA+IHRoaXMtPmNvbnRhaW5lcl9saW1pdF8pIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgfQorICBzaXplID0gKHVpbnQzMl90KXNpemVpOworICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRTZXRFbmQoKSB7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRCb29sKGJvb2wmIHZhbHVlKSB7CisgIHVpbnQ4X3QgYlsxXTsKKyAgdGhpcy0+dHJhbnNfLT5yZWFkQWxsKGIsIDEpOworICB2YWx1ZSA9ICooaW50OF90KiliICE9IDA7CisgIHJldHVybiAxOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRCeXRlKGludDhfdCYgYnl0ZSkgeworICB1aW50OF90IGJbMV07CisgIHRoaXMtPnRyYW5zXy0+cmVhZEFsbChiLCAxKTsKKyAgYnl0ZSA9ICooaW50OF90KiliOworICByZXR1cm4gMTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkSTE2KGludDE2X3QmIGkxNikgeworICB1bmlvbiBieXRlcyB7CisgICAgdWludDhfdCBiWzJdOworICAgIGludDE2X3QgYWxsOworICB9IHRoZUJ5dGVzOworICB0aGlzLT50cmFuc18tPnJlYWRBbGwodGhlQnl0ZXMuYiwgMik7CisgIGkxNiA9IChpbnQxNl90KUJ5dGVPcmRlcl86OmZyb21XaXJlMTYodGhlQnl0ZXMuYWxsKTsKKyAgcmV0dXJuIDI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZEkzMihpbnQzMl90JiBpMzIpIHsKKyAgdW5pb24gYnl0ZXMgeworICAgIHVpbnQ4X3QgYls0XTsKKyAgICBpbnQzMl90IGFsbDsKKyAgfSB0aGVCeXRlczsKKyAgdGhpcy0+dHJhbnNfLT5yZWFkQWxsKHRoZUJ5dGVzLmIsIDQpOworICBpMzIgPSAoaW50MzJfdClCeXRlT3JkZXJfOjpmcm9tV2lyZTMyKHRoZUJ5dGVzLmFsbCk7CisgIHJldHVybiA0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRJNjQoaW50NjRfdCYgaTY0KSB7CisgIHVuaW9uIGJ5dGVzIHsKKyAgICB1aW50OF90IGJbOF07CisgICAgaW50NjRfdCBhbGw7CisgIH0gdGhlQnl0ZXM7CisgIHRoaXMtPnRyYW5zXy0+cmVhZEFsbCh0aGVCeXRlcy5iLCA4KTsKKyAgaTY0ID0gKGludDY0X3QpQnl0ZU9yZGVyXzo6ZnJvbVdpcmU2NCh0aGVCeXRlcy5hbGwpOworICByZXR1cm4gODsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSwgInNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkiKTsKKyAgc3RhdGljX2Fzc2VydChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSwgInN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5Iik7CisKKyAgdW5pb24gYnl0ZXMgeworICAgIHVpbnQ4X3QgYls4XTsKKyAgICB1aW50NjRfdCBhbGw7CisgIH0gdGhlQnl0ZXM7CisgIHRoaXMtPnRyYW5zXy0+cmVhZEFsbCh0aGVCeXRlcy5iLCA4KTsKKyAgdGhlQnl0ZXMuYWxsID0gQnl0ZU9yZGVyXzo6ZnJvbVdpcmU2NCh0aGVCeXRlcy5hbGwpOworICBkdWIgPSBiaXR3aXNlX2Nhc3Q8ZG91YmxlPih0aGVCeXRlcy5hbGwpOworICByZXR1cm4gODsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyVHlwZT4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRTdHJpbmcoU3RyVHlwZSYgc3RyKSB7CisgIHVpbnQzMl90IHJlc3VsdDsKKyAgaW50MzJfdCBzaXplOworICByZXN1bHQgPSByZWFkSTMyKHNpemUpOworICByZXR1cm4gcmVzdWx0ICsgcmVhZFN0cmluZ0JvZHkoc3RyLCBzaXplKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRTdHJpbmcoc3RyKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyVHlwZT4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRTdHJpbmdCb2R5KFN0clR5cGUmIHN0ciwgaW50MzJfdCBzaXplKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IDA7CisKKyAgLy8gQ2F0Y2ggZXJyb3IgY2FzZXMKKyAgaWYgKHNpemUgPCAwKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7CisgIH0KKyAgaWYgKHRoaXMtPnN0cmluZ19saW1pdF8gPiAwICYmIHNpemUgPiB0aGlzLT5zdHJpbmdfbGltaXRfKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIH0KKworICAvLyBDYXRjaCBlbXB0eSBzdHJpbmcgY2FzZQorICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgc3RyLmNsZWFyKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8vIFRyeSB0byBib3Jyb3cgZmlyc3QKKyAgY29uc3QgdWludDhfdCogYm9ycm93X2J1ZjsKKyAgdWludDMyX3QgZ290ID0gc2l6ZTsKKyAgaWYgKChib3Jyb3dfYnVmID0gdGhpcy0+dHJhbnNfLT5ib3Jyb3coTlVMTCwgJmdvdCkpKSB7CisgICAgc3RyLmFzc2lnbigoY29uc3QgY2hhciopYm9ycm93X2J1Ziwgc2l6ZSk7CisgICAgdGhpcy0+dHJhbnNfLT5jb25zdW1lKHNpemUpOworICAgIHJldHVybiBzaXplOworICB9CisKKyAgc3RyLnJlc2l6ZShzaXplKTsKKyAgdGhpcy0+dHJhbnNfLT5yZWFkQWxsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZzdHJbMF0pLCBzaXplKTsKKyAgcmV0dXJuICh1aW50MzJfdClzaXplOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UQklOQVJZUFJPVE9DT0xfVENDXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNmYjQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmgKQEAgLTAsMCArMSwyNjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RDT01QQUNUUFJPVE9DT0xfSF8KKyNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UQ09NUEFDVFBST1RPQ09MX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmg+CisKKyNpbmNsdWRlIDxzdGFjaz4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCisvKioKKyAqIEMrKyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ29tcGFjdCBQcm90b2NvbCBhcyBkZXNjcmliZWQgaW4gVEhSSUZULTExMAorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK2NsYXNzIFRDb21wYWN0UHJvdG9jb2xUIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8VENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBpbnQ4X3QgUFJPVE9DT0xfSUQgPSAoaW50OF90KTB4ODJ1OworICBzdGF0aWMgY29uc3QgaW50OF90IFZFUlNJT05fTiA9IDE7CisgIHN0YXRpYyBjb25zdCBpbnQ4X3QgVkVSU0lPTl9NQVNLID0gMHgxZjsgICAgICAgLy8gMDAwMSAxMTExCisKK3Byb3RlY3RlZDoKKyAgc3RhdGljIGNvbnN0IGludDhfdCBUWVBFX01BU0sgPSAoaW50OF90KTB4RTB1OyAvLyAxMTEwIDAwMDAKKyAgc3RhdGljIGNvbnN0IGludDhfdCBUWVBFX0JJVFMgPSAweDA3OyAgICAgICAgICAvLyAwMDAwIDAxMTEKKyAgc3RhdGljIGNvbnN0IGludDMyX3QgVFlQRV9TSElGVF9BTU9VTlQgPSA1OworCisgIFRyYW5zcG9ydF8qIHRyYW5zXzsKKworICAvKioKKyAgICogKFdyaXRpbmcpIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlCisgICAqIHNvIGl0IGNhbiBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCisgICAqLworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgVFR5cGUgZmllbGRUeXBlOworICAgIGludDE2X3QgZmllbGRJZDsKKyAgfSBib29sZWFuRmllbGRfOworCisgIC8qKgorICAgKiAoUmVhZGluZykgSWYgd2UgcmVhZCBhIGZpZWxkIGhlYWRlciwgYW5kIGl0J3MgYSBib29sZWFuIGZpZWxkLCBzYXZlCisgICAqIHRoZSBib29sZWFuIHZhbHVlIGhlcmUgc28gdGhhdCByZWFkQm9vbCBjYW4gdXNlIGl0LgorICAgKi8KKyAgc3RydWN0IHsKKyAgICBib29sIGhhc0Jvb2xWYWx1ZTsKKyAgICBib29sIGJvb2xWYWx1ZTsKKyAgfSBib29sVmFsdWVfOworCisgIC8qKgorICAgKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAorICAgKiBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgorICAgKi8KKworICBzdGQ6OnN0YWNrPGludDE2X3Q+IGxhc3RGaWVsZF87CisgIGludDE2X3QgbGFzdEZpZWxkSWRfOworCitwdWJsaWM6CisgIFRDb21wYWN0UHJvdG9jb2xUKHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFucykKKyAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPih0cmFucyksCisgICAgICB0cmFuc18odHJhbnMuZ2V0KCkpLAorICAgICAgbGFzdEZpZWxkSWRfKDApLAorICAgICAgc3RyaW5nX2xpbWl0XygwKSwKKyAgICAgIHN0cmluZ19idWZfKE5VTEwpLAorICAgICAgc3RyaW5nX2J1Zl9zaXplXygwKSwKKyAgICAgIGNvbnRhaW5lcl9saW1pdF8oMCkgeworICAgIGJvb2xlYW5GaWVsZF8ubmFtZSA9IE5VTEw7CisgICAgYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSBmYWxzZTsKKyAgfQorCisgIFRDb21wYWN0UHJvdG9jb2xUKHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdHJpbmdfbGltaXQsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29udGFpbmVyX2xpbWl0KQorICAgIDogVFZpcnR1YWxQcm90b2NvbDxUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPiA+KHRyYW5zKSwKKyAgICAgIHRyYW5zXyh0cmFucy5nZXQoKSksCisgICAgICBsYXN0RmllbGRJZF8oMCksCisgICAgICBzdHJpbmdfbGltaXRfKHN0cmluZ19saW1pdCksCisgICAgICBzdHJpbmdfYnVmXyhOVUxMKSwKKyAgICAgIHN0cmluZ19idWZfc2l6ZV8oMCksCisgICAgICBjb250YWluZXJfbGltaXRfKGNvbnRhaW5lcl9saW1pdCkgeworICAgIGJvb2xlYW5GaWVsZF8ubmFtZSA9IE5VTEw7CisgICAgYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSBmYWxzZTsKKyAgfQorCisgIH5UQ29tcGFjdFByb3RvY29sVCgpIHsgZnJlZShzdHJpbmdfYnVmXyk7IH0KKworICAvKioKKyAgICogV3JpdGluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCk7CisKKyAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKTsKKworICB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBUVHlwZSBmaWVsZFR5cGUsIGNvbnN0IGludDE2X3QgZmllbGRJZCk7CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3AoKTsKKworICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsIGNvbnN0IFRUeXBlIHZhbFR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOworCisgIHVpbnQzMl90IHdyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKTsKKworICB1aW50MzJfdCB3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpOworCisgIHVpbnQzMl90IHdyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KTsKKworICB1aW50MzJfdCB3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMik7CisKKyAgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpOworCisgIHVpbnQzMl90IHdyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpOworCisgIHVpbnQzMl90IHdyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIC8qKgorICAqIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCBieSBzdHJ1Y3RzLCBidXQgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhbnkgd2lyZWQKKyAgKiBvdXRwdXQgb3IgcHVycG9zZQorICAqLworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpIHsgcmV0dXJuIDA7IH0KKyAgdWludDMyX3Qgd3JpdGVNYXBFbmQoKSB7IHJldHVybiAwOyB9CisgIHVpbnQzMl90IHdyaXRlTGlzdEVuZCgpIHsgcmV0dXJuIDA7IH0KKyAgdWludDMyX3Qgd3JpdGVTZXRFbmQoKSB7IHJldHVybiAwOyB9CisgIHVpbnQzMl90IHdyaXRlRmllbGRFbmQoKSB7IHJldHVybiAwOyB9CisKK3Byb3RlY3RlZDoKKyAgaW50MzJfdCB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90IHR5cGVPdmVycmlkZSk7CisgIHVpbnQzMl90IHdyaXRlQ29sbGVjdGlvbkJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBpbnQzMl90IHNpemUpOworICB1aW50MzJfdCB3cml0ZVZhcmludDMyKHVpbnQzMl90IG4pOworICB1aW50MzJfdCB3cml0ZVZhcmludDY0KHVpbnQ2NF90IG4pOworICB1aW50NjRfdCBpNjRUb1ppZ3phZyhjb25zdCBpbnQ2NF90IGwpOworICB1aW50MzJfdCBpMzJUb1ppZ3phZyhjb25zdCBpbnQzMl90IG4pOworICBpbmxpbmUgaW50OF90IGdldENvbXBhY3RUeXBlKGNvbnN0IFRUeXBlIHR0eXBlKTsKKworcHVibGljOgorICB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLCBpbnQzMl90JiBzZXFpZCk7CisKKyAgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKTsKKworICB1aW50MzJfdCByZWFkU3RydWN0RW5kKCk7CisKKyAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpOworCisgIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpOworCisgIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICB1aW50MzJfdCByZWFkQm9vbChib29sJiB2YWx1ZSk7CisgIC8vIFByb3ZpZGUgdGhlIGRlZmF1bHQgcmVhZEJvb2woKSBpbXBsZW1lbnRhdGlvbiBmb3Igc3RkOjp2ZWN0b3I8Ym9vbD4KKyAgdXNpbmcgVFZpcnR1YWxQcm90b2NvbDxUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPiA+OjpyZWFkQm9vbDsKKworICB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpOworCisgIHVpbnQzMl90IHJlYWRJMTYoaW50MTZfdCYgaTE2KTsKKworICB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMik7CisKKyAgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpOworCisgIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpOworCisgIHVpbnQzMl90IHJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKTsKKworICAvKgorICAgKlRoZXNlIG1ldGhvZHMgYXJlIGhlcmUgZm9yIHRoZSBzdHJ1Y3QgdG8gY2FsbCwgYnV0IGRvbid0IGhhdmUgYW55IHdpcmUKKyAgICogZW5jb2RpbmcuCisgICAqLworICB1aW50MzJfdCByZWFkTWVzc2FnZUVuZCgpIHsgcmV0dXJuIDA7IH0KKyAgdWludDMyX3QgcmVhZEZpZWxkRW5kKCkgeyByZXR1cm4gMDsgfQorICB1aW50MzJfdCByZWFkTWFwRW5kKCkgeyByZXR1cm4gMDsgfQorICB1aW50MzJfdCByZWFkTGlzdEVuZCgpIHsgcmV0dXJuIDA7IH0KKyAgdWludDMyX3QgcmVhZFNldEVuZCgpIHsgcmV0dXJuIDA7IH0KKworcHJvdGVjdGVkOgorICB1aW50MzJfdCByZWFkVmFyaW50MzIoaW50MzJfdCYgaTMyKTsKKyAgdWludDMyX3QgcmVhZFZhcmludDY0KGludDY0X3QmIGk2NCk7CisgIGludDMyX3QgemlnemFnVG9JMzIodWludDMyX3Qgbik7CisgIGludDY0X3QgemlnemFnVG9JNjQodWludDY0X3Qgbik7CisgIFRUeXBlIGdldFRUeXBlKGludDhfdCB0eXBlKTsKKworICAvLyBCdWZmZXIgZm9yIHJlYWRpbmcgc3RyaW5ncywgc2F2ZSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBwcm90b2NvbCB0bworICAvLyBhdm9pZCBtZW1vcnkgY2h1cm4gYWxsb2NhdGluZyBtZW1vcnkgb24gZXZlcnkgc3RyaW5nIHJlYWQKKyAgaW50MzJfdCBzdHJpbmdfbGltaXRfOworICB1aW50OF90KiBzdHJpbmdfYnVmXzsKKyAgaW50MzJfdCBzdHJpbmdfYnVmX3NpemVfOworICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdF87Cit9OworCit0eXBlZGVmIFRDb21wYWN0UHJvdG9jb2xUPFRUcmFuc3BvcnQ+IFRDb21wYWN0UHJvdG9jb2w7CisKKy8qKgorICogQ29uc3RydWN0cyBjb21wYWN0IHByb3RvY29sIGhhbmRsZXJzCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgorY2xhc3MgVENvbXBhY3RQcm90b2NvbEZhY3RvcnlUIDogcHVibGljIFRQcm90b2NvbEZhY3RvcnkgeworcHVibGljOgorICBUQ29tcGFjdFByb3RvY29sRmFjdG9yeVQoKSA6IHN0cmluZ19saW1pdF8oMCksIGNvbnRhaW5lcl9saW1pdF8oMCkge30KKworICBUQ29tcGFjdFByb3RvY29sRmFjdG9yeVQoaW50MzJfdCBzdHJpbmdfbGltaXQsIGludDMyX3QgY29udGFpbmVyX2xpbWl0KQorICAgIDogc3RyaW5nX2xpbWl0XyhzdHJpbmdfbGltaXQpLCBjb250YWluZXJfbGltaXRfKGNvbnRhaW5lcl9saW1pdCkge30KKworICB2aXJ0dWFsIH5UQ29tcGFjdFByb3RvY29sRmFjdG9yeVQoKSB7fQorCisgIHZvaWQgc2V0U3RyaW5nU2l6ZUxpbWl0KGludDMyX3Qgc3RyaW5nX2xpbWl0KSB7IHN0cmluZ19saW1pdF8gPSBzdHJpbmdfbGltaXQ7IH0KKworICB2b2lkIHNldENvbnRhaW5lclNpemVMaW1pdChpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkgeyBjb250YWluZXJfbGltaXRfID0gY29udGFpbmVyX2xpbWl0OyB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHNwZWNpZmljX3RyYW5zID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUcmFuc3BvcnRfPih0cmFucyk7CisgICAgVFByb3RvY29sKiBwcm90OworICAgIGlmIChzcGVjaWZpY190cmFucykgeworICAgICAgcHJvdCA9IG5ldyBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPihzcGVjaWZpY190cmFucywgc3RyaW5nX2xpbWl0XywgY29udGFpbmVyX2xpbWl0Xyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb3QgPSBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFucywgc3RyaW5nX2xpbWl0XywgY29udGFpbmVyX2xpbWl0Xyk7CisgICAgfQorCisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KHByb3QpOworICB9CisKK3ByaXZhdGU6CisgIGludDMyX3Qgc3RyaW5nX2xpbWl0XzsKKyAgaW50MzJfdCBjb250YWluZXJfbGltaXRfOworfTsKKwordHlwZWRlZiBUQ29tcGFjdFByb3RvY29sRmFjdG9yeVQ8VFRyYW5zcG9ydD4gVENvbXBhY3RQcm90b2NvbEZhY3Rvcnk7Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wudGNjPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnRjYyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWZlYzZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wudGNjCkBAIC0wLDAgKzEsODI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVENPTVBBQ1RQUk9UT0NPTF9UQ0NfCisjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVENPTVBBQ1RQUk9UT0NPTF9UQ0NfIDEKKworI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgInRocmlmdC9jb25maWcuaCIKKworLyoKKyAqIFRDb21wYWN0UHJvdG9jb2w6OmkqVG9aaWd6YWcgZGVwZW5kIG9uIHRoZSBmYWN0IHRoYXQgdGhlIHJpZ2h0IHNoaWZ0CisgKiBvcGVyYXRvciBvbiBhIHNpZ25lZCBpbnRlZ2VyIGlzIGFuIGFyaXRobWV0aWMgKHNpZ24tZXh0ZW5kaW5nKSBzaGlmdC4KKyAqIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB3aWxsIG5vdCB3b3JrLgorICogSWYgYW55b25lIGVuY291bnRlcnMgdGhpcyBlcnJvciwgd2UgY2FuIHRyeSB0byBmaWd1cmUgb3V0IHRoZSBiZXN0CisgKiB3YXkgdG8gaW1wbGVtZW50IGFuIGFyaXRobWV0aWMgcmlnaHQgc2hpZnQgb24gdGhlaXIgcGxhdGZvcm0uCisgKi8KKyNpZiAhZGVmaW5lZChTSUdORURfUklHSFRfU0hJRlRfSVMpIHx8ICFkZWZpbmVkKEFSSVRITUVUSUNfUklHSFRfU0hJRlQpCisjIGVycm9yICJVbmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBiZWhhdmlvciBvZiBhIHNpZ25lZCByaWdodCBzaGlmdCIKKyNlbmRpZgorI2lmIFNJR05FRF9SSUdIVF9TSElGVF9JUyAhPSBBUklUSE1FVElDX1JJR0hUX1NISUZUCisjIGVycm9yICJUQ29tcGFjdFByb3RvY29sIGN1cnJlbnRseSBvbmx5IHdvcmtzIGlmIGEgc2lnbmVkIHJpZ2h0IHNoaWZ0IGlzIGFyaXRobWV0aWMiCisjZW5kaWYKKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIFVOTElLRUxZKHZhbCkgKF9fYnVpbHRpbl9leHBlY3QoKHZhbCksIDApKQorI2Vsc2UKKyNkZWZpbmUgVU5MSUtFTFkodmFsKSAodmFsKQorI2VuZGlmCisKK25hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKKworbmFtZXNwYWNlIGRldGFpbCB7IG5hbWVzcGFjZSBjb21wYWN0IHsKKworZW51bSBUeXBlcyB7CisgIENUX1NUT1AgICAgICAgICAgID0gMHgwMCwKKyAgQ1RfQk9PTEVBTl9UUlVFICAgPSAweDAxLAorICBDVF9CT09MRUFOX0ZBTFNFICA9IDB4MDIsCisgIENUX0JZVEUgICAgICAgICAgID0gMHgwMywKKyAgQ1RfSTE2ICAgICAgICAgICAgPSAweDA0LAorICBDVF9JMzIgICAgICAgICAgICA9IDB4MDUsCisgIENUX0k2NCAgICAgICAgICAgID0gMHgwNiwKKyAgQ1RfRE9VQkxFICAgICAgICAgPSAweDA3LAorICBDVF9CSU5BUlkgICAgICAgICA9IDB4MDgsCisgIENUX0xJU1QgICAgICAgICAgID0gMHgwOSwKKyAgQ1RfU0VUICAgICAgICAgICAgPSAweDBBLAorICBDVF9NQVAgICAgICAgICAgICA9IDB4MEIsCisgIENUX1NUUlVDVCAgICAgICAgID0gMHgwQworfTsKKworY29uc3QgaW50OF90IFRUeXBlVG9DVHlwZVsxNl0gPSB7CisgIENUX1NUT1AsIC8vIFRfU1RPUAorICAwLCAvLyB1bnVzZWQKKyAgQ1RfQk9PTEVBTl9UUlVFLCAvLyBUX0JPT0wKKyAgQ1RfQllURSwgLy8gVF9CWVRFCisgIENUX0RPVUJMRSwgLy8gVF9ET1VCTEUKKyAgMCwgLy8gdW51c2VkCisgIENUX0kxNiwgLy8gVF9JMTYKKyAgMCwgLy8gdW51c2VkCisgIENUX0kzMiwgLy8gVF9JMzIKKyAgMCwgLy8gdW51c2VkCisgIENUX0k2NCwgLy8gVF9JNjQKKyAgQ1RfQklOQVJZLCAvLyBUX1NUUklORworICBDVF9TVFJVQ1QsIC8vIFRfU1RSVUNUCisgIENUX01BUCwgLy8gVF9NQVAKKyAgQ1RfU0VULCAvLyBUX1NFVAorICBDVF9MSVNULCAvLyBUX0xJU1QKK307CisKK319IC8vIGVuZCBkZXRhaWw6OmNvbXBhY3QgbmFtZXNwYWNlCisKKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVNZXNzYWdlQmVnaW4oCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAorICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworICB3c2l6ZSArPSB3cml0ZUJ5dGUoUFJPVE9DT0xfSUQpOworICB3c2l6ZSArPSB3cml0ZUJ5dGUoKFZFUlNJT05fTiAmIFZFUlNJT05fTUFTSykgfCAoKChpbnQzMl90KW1lc3NhZ2VUeXBlIDw8IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfTUFTSykpOworICB3c2l6ZSArPSB3cml0ZVZhcmludDMyKHNlcWlkKTsKKyAgd3NpemUgKz0gd3JpdGVTdHJpbmcobmFtZSk7CisgIHJldHVybiB3c2l6ZTsKK30KKworLyoqCisgKiBXcml0ZSBhIGZpZWxkIGhlYWRlciBjb250YWluaW5nIHRoZSBmaWVsZCBpZCBhbmQgZmllbGQgdHlwZS4gSWYgdGhlCisgKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgZmllbGQgaWQgYW5kIHRoZSBsYXN0IG9uZSBpcyBzbWFsbCAoPCAxNSksCisgKiB0aGVuIHRoZSBmaWVsZCBpZCB3aWxsIGJlIGVuY29kZWQgaW4gdGhlIDQgTVNCIGFzIGEgZGVsdGEuIE90aGVyd2lzZSwgdGhlCisgKiBmaWVsZCBpZCB3aWxsIGZvbGxvdyB0aGUgdHlwZSBoZWFkZXIgYXMgYSB6aWd6YWcgdmFyaW50LgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKKyAgaWYgKGZpZWxkVHlwZSA9PSBUX0JPT0wpIHsKKyAgICBib29sZWFuRmllbGRfLm5hbWUgPSBuYW1lOworICAgIGJvb2xlYW5GaWVsZF8uZmllbGRUeXBlID0gZmllbGRUeXBlOworICAgIGJvb2xlYW5GaWVsZF8uZmllbGRJZCA9IGZpZWxkSWQ7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHdyaXRlRmllbGRCZWdpbkludGVybmFsKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCwgLTEpOworICB9CisgIHJldHVybiAwOworfQorCisvKioKKyAqIFdyaXRlIHRoZSBTVE9QIHN5bWJvbCBzbyB3ZSBrbm93IHRoZXJlIGFyZSBubyBtb3JlIGZpZWxkcyBpbiB0aGlzIHN0cnVjdC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVGaWVsZFN0b3AoKSB7CisgIHJldHVybiB3cml0ZUJ5dGUoVF9TVE9QKTsKK30KKworLyoqCisgKiBXcml0ZSBhIHN0cnVjdCBiZWdpbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UKKyAqIHVzZSBpdCBhcyBhbiBvcHBvcnR1bml0eSB0byBwdXQgc3BlY2lhbCBwbGFjZWhvbGRlciBtYXJrZXJzIG9uIHRoZSBmaWVsZAorICogc3RhY2sgc28gd2UgY2FuIGdldCB0aGUgZmllbGQgaWQgZGVsdGFzIGNvcnJlY3QuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSkgeworICAodm9pZCkgbmFtZTsKKyAgbGFzdEZpZWxkXy5wdXNoKGxhc3RGaWVsZElkXyk7CisgIGxhc3RGaWVsZElkXyA9IDA7CisgIHJldHVybiAwOworfQorCisvKioKKyAqIFdyaXRlIGEgc3RydWN0IGVuZC4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UgdXNlCisgKiB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIHBvcCB0aGUgbGFzdCBmaWVsZCBmcm9tIHRoZSBjdXJyZW50IHN0cnVjdCBvZmYKKyAqIG9mIHRoZSBmaWVsZCBzdGFjay4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVTdHJ1Y3RFbmQoKSB7CisgIGxhc3RGaWVsZElkXyA9IGxhc3RGaWVsZF8udG9wKCk7CisgIGxhc3RGaWVsZF8ucG9wKCk7CisgIHJldHVybiAwOworfQorCisvKioKKyAqIFdyaXRlIGEgTGlzdCBoZWFkZXIuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgcmV0dXJuIHdyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1UeXBlLCBzaXplKTsKK30KKworLyoqCisgKiBXcml0ZSBhIHNldCBoZWFkZXIuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHJldHVybiB3cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtVHlwZSwgc2l6ZSk7Cit9CisKKy8qKgorICogV3JpdGUgYSBtYXAgaGVhZGVyLiBJZiB0aGUgbWFwIGlzIGVtcHR5LCBvbWl0IHRoZSBrZXkgYW5kIHZhbHVlIHR5cGUKKyAqIGhlYWRlcnMsIGFzIHdlIGRvbid0IG5lZWQgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gc2tpcCBpdC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworCisgIGlmIChzaXplID09IDApIHsKKyAgICB3c2l6ZSArPSB3cml0ZUJ5dGUoMCk7CisgIH0gZWxzZSB7CisgICAgd3NpemUgKz0gd3JpdGVWYXJpbnQzMihzaXplKTsKKyAgICB3c2l6ZSArPSB3cml0ZUJ5dGUoZ2V0Q29tcGFjdFR5cGUoa2V5VHlwZSkgPDwgNCB8IGdldENvbXBhY3RUeXBlKHZhbFR5cGUpKTsKKyAgfQorICByZXR1cm4gd3NpemU7Cit9CisKKy8qKgorICogV3JpdGUgYSBib29sZWFuIHZhbHVlLiBQb3RlbnRpYWxseSwgdGhpcyBjb3VsZCBiZSBhIGJvb2xlYW4gZmllbGQsIGluCisgKiB3aGljaCBjYXNlIHRoZSBmaWVsZCBoZWFkZXIgaW5mbyBpc24ndCB3cml0dGVuIHlldC4gSWYgc28sIGRlY2lkZSB3aGF0IHRoZQorICogcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiB3cml0ZSB0aGUgZmllbGQgaGVhZGVyLgorICogT3RoZXJ3aXNlLCB3cml0ZSBhIHNpbmdsZSBieXRlLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgeworICB1aW50MzJfdCB3c2l6ZSA9IDA7CisKKyAgaWYgKGJvb2xlYW5GaWVsZF8ubmFtZSAhPSBOVUxMKSB7CisgICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0CisgICAgd3NpemUKKyAgICAgICs9IHdyaXRlRmllbGRCZWdpbkludGVybmFsKGJvb2xlYW5GaWVsZF8ubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5GaWVsZF8uZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbkZpZWxkXy5maWVsZElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50OF90Pih2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRldGFpbDo6Y29tcGFjdDo6Q1RfQk9PTEVBTl9UUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGV0YWlsOjpjb21wYWN0OjpDVF9CT09MRUFOX0ZBTFNFKSk7CisgICAgYm9vbGVhbkZpZWxkXy5uYW1lID0gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICAvLyB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IHdyaXRlIHRoZSB2YWx1ZQorICAgIHdzaXplCisgICAgICArPSB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8aW50OF90Pih2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fVFJVRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fRkFMU0UpKTsKKyAgfQorICByZXR1cm4gd3NpemU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgeworICB0cmFuc18tPndyaXRlKCh1aW50OF90KikmYnl0ZSwgMSk7CisgIHJldHVybiAxOworfQorCisvKioKKyAqIFdyaXRlIGFuIGkxNiBhcyBhIHppZ3phZyB2YXJpbnQuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KSB7CisgIHJldHVybiB3cml0ZVZhcmludDMyKGkzMlRvWmlnemFnKGkxNikpOworfQorCisvKioKKyAqIFdyaXRlIGFuIGkzMiBhcyBhIHppZ3phZyB2YXJpbnQuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKSB7CisgIHJldHVybiB3cml0ZVZhcmludDMyKGkzMlRvWmlnemFnKGkzMikpOworfQorCisvKioKKyAqIFdyaXRlIGFuIGk2NCBhcyBhIHppZ3phZyB2YXJpbnQuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KSB7CisgIHJldHVybiB3cml0ZVZhcmludDY0KGk2NFRvWmlnemFnKGk2NCkpOworfQorCisvKioKKyAqIFdyaXRlIGEgZG91YmxlIHRvIHRoZSB3aXJlIGFzIDggYnl0ZXMuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpIHsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpLCAic2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSIpOworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5LCAic3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTkiKTsKKworICB1aW50NjRfdCBiaXRzID0gYml0d2lzZV9jYXN0PHVpbnQ2NF90PihkdWIpOworICBiaXRzID0gVEhSSUZUX2h0b2xlbGwoYml0cyk7CisgIHRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKSZiaXRzLCA4KTsKKyAgcmV0dXJuIDg7Cit9CisKKy8qKgorICogV3JpdGUgYSBzdHJpbmcgdG8gdGhlIHdpcmUgd2l0aCBhIHZhcmludCBzaXplIHByZWNlZGluZy4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICByZXR1cm4gd3JpdGVCaW5hcnkoc3RyKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICBpZihzdHIuc2l6ZSgpID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIHVpbnQzMl90IHNzaXplID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ci5zaXplKCkpOworICB1aW50MzJfdCB3c2l6ZSA9IHdyaXRlVmFyaW50MzIoc3NpemUpIDsKKyAgLy8gY2hlY2tpbmcgc3NpemUgKyB3c2l6ZSA+IHVpbnRfbWF4LCBidXQgd2UgZG9uJ3Qgd2FudCB0byBvdmVyZmxvdyB3aGlsZSBjaGVja2luZyBmb3Igb3ZlcmZsb3dzLgorICAvLyB0cmFuc2Zvcm1pbmcgdGhlIGNoZWNrIHRvIHNzaXplID4gdWludF9tYXggLSB3c2l6ZQorICBpZihzc2l6ZSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpIC0gd3NpemUpCisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIHdzaXplICs9IHNzaXplOworICB0cmFuc18tPndyaXRlKCh1aW50OF90KilzdHIuZGF0YSgpLCBzc2l6ZSk7CisgIHJldHVybiB3c2l6ZTsKK30KKworLy8KKy8vIEludGVybmFsIFdyaXRpbmcgbWV0aG9kcworLy8KKworLyoqCisgKiBUaGUgd29ya2hvcnNlIG9mIHdyaXRlRmllbGRCZWdpbi4gSXQgaGFzIHRoZSBvcHRpb24gb2YgZG9pbmcgYQorICogJ3R5cGUgb3ZlcnJpZGUnIG9mIHRoZSB0eXBlIGhlYWRlci4gVGhpcyBpcyB1c2VkIHNwZWNpZmljYWxseSBpbiB0aGUKKyAqIGJvb2xlYW4gZmllbGQgY2FzZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+CitpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbCgKKyAgICBjb25zdCBjaGFyKiBuYW1lLAorICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKKyAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQsCisgICAgaW50OF90IHR5cGVPdmVycmlkZSkgeworICAodm9pZCkgbmFtZTsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworCisgIC8vIGlmIHRoZXJlJ3MgYSB0eXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4KKyAgaW50OF90IHR5cGVUb1dyaXRlID0gKHR5cGVPdmVycmlkZSA9PSAtMSA/IGdldENvbXBhY3RUeXBlKGZpZWxkVHlwZSkgOiB0eXBlT3ZlcnJpZGUpOworCisgIC8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAorICBpZiAoZmllbGRJZCA+IGxhc3RGaWVsZElkXyAmJiBmaWVsZElkIC0gbGFzdEZpZWxkSWRfIDw9IDE1KSB7CisgICAgLy8gd3JpdGUgdGhlbSB0b2dldGhlcgorICAgIHdzaXplICs9IHdyaXRlQnl0ZShzdGF0aWNfY2FzdDxpbnQ4X3Q+KChmaWVsZElkIC0gbGFzdEZpZWxkSWRfKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDQgfCB0eXBlVG9Xcml0ZSkpOworICB9IGVsc2UgeworICAgIC8vIHdyaXRlIHRoZW0gc2VwYXJhdGUKKyAgICB3c2l6ZSArPSB3cml0ZUJ5dGUodHlwZVRvV3JpdGUpOworICAgIHdzaXplICs9IHdyaXRlSTE2KGZpZWxkSWQpOworICB9CisKKyAgbGFzdEZpZWxkSWRfID0gZmllbGRJZDsKKyAgcmV0dXJuIHdzaXplOworfQorCisvKioKKyAqIEFic3RyYWN0IG1ldGhvZCBmb3Igd3JpdGluZyB0aGUgc3RhcnQgb2YgbGlzdHMgYW5kIHNldHMuIExpc3QgYW5kIHNldHMgb24KKyAqIHRoZSB3aXJlIGRpZmZlciBvbmx5IGJ5IHRoZSB0eXBlIGluZGljYXRvci4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVDb2xsZWN0aW9uQmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzaXplKSB7CisgIHVpbnQzMl90IHdzaXplID0gMDsKKyAgaWYgKHNpemUgPD0gMTQpIHsKKyAgICB3c2l6ZSArPSB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8aW50OF90PihzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgNCB8IGdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSkpOworICB9IGVsc2UgeworICAgIHdzaXplICs9IHdyaXRlQnl0ZSgweGYwIHwgZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgICB3c2l6ZSArPSB3cml0ZVZhcmludDMyKHNpemUpOworICB9CisgIHJldHVybiB3c2l6ZTsKK30KKworLyoqCisgKiBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZVZhcmludDMyKHVpbnQzMl90IG4pIHsKKyAgdWludDhfdCBidWZbNV07CisgIHVpbnQzMl90IHdzaXplID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICgobiAmIH4weDdGKSA9PSAwKSB7CisgICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KW47CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgYnVmW3dzaXplKytdID0gKGludDhfdCkoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgbiA+Pj0gNzsKKyAgICB9CisgIH0KKyAgdHJhbnNfLT53cml0ZShidWYsIHdzaXplKTsKKyAgcmV0dXJuIHdzaXplOworfQorCisvKioKKyAqIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZVZhcmludDY0KHVpbnQ2NF90IG4pIHsKKyAgdWludDhfdCBidWZbMTBdOworICB1aW50MzJfdCB3c2l6ZSA9IDA7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAoKG4gJiB+MHg3RkwpID09IDApIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9IChpbnQ4X3QpbjsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KSgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICBuID4+PSA3OworICAgIH0KKyAgfQorICB0cmFuc18tPndyaXRlKGJ1Ziwgd3NpemUpOworICByZXR1cm4gd3NpemU7Cit9CisKKy8qKgorICogQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQ2NF90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjppNjRUb1ppZ3phZyhjb25zdCBpbnQ2NF90IGwpIHsKKyAgcmV0dXJuIChzdGF0aWNfY2FzdDx1aW50NjRfdD4obCkgPDwgMSkgXiAobCA+PiA2Myk7Cit9CisKKy8qKgorICogQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OmkzMlRvWmlnemFnKGNvbnN0IGludDMyX3QgbikgeworICByZXR1cm4gKHN0YXRpY19jYXN0PHVpbnQzMl90PihuKSA8PCAxKSBeIChuID4+IDMxKTsKK30KKworLyoqCisgKiBHaXZlbiBhIFRUeXBlIHZhbHVlLCBmaW5kIHRoZSBhcHByb3ByaWF0ZSBkZXRhaWw6OmNvbXBhY3Q6OlR5cGVzIHZhbHVlCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgoraW50OF90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpnZXRDb21wYWN0VHlwZShjb25zdCBUVHlwZSB0dHlwZSkgeworICByZXR1cm4gZGV0YWlsOjpjb21wYWN0OjpUVHlwZVRvQ1R5cGVbdHR5cGVdOworfQorCisvLworLy8gUmVhZGluZyBNZXRob2RzCisvLworCisvKioKKyAqIFJlYWQgYSBtZXNzYWdlIGhlYWRlci4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZE1lc3NhZ2VCZWdpbigKKyAgICBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAorICAgIGludDMyX3QmIHNlcWlkKSB7CisgIHVpbnQzMl90IHJzaXplID0gMDsKKyAgaW50OF90IHByb3RvY29sSWQ7CisgIGludDhfdCB2ZXJzaW9uQW5kVHlwZTsKKyAgaW50OF90IHZlcnNpb247CisKKyAgcnNpemUgKz0gcmVhZEJ5dGUocHJvdG9jb2xJZCk7CisgIGlmIChwcm90b2NvbElkICE9IFBST1RPQ09MX0lEKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sICJCYWQgcHJvdG9jb2wgaWRlbnRpZmllciIpOworICB9CisKKyAgcnNpemUgKz0gcmVhZEJ5dGUodmVyc2lvbkFuZFR5cGUpOworICB2ZXJzaW9uID0gKGludDhfdCkodmVyc2lvbkFuZFR5cGUgJiBWRVJTSU9OX01BU0spOworICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OX04pIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTiwgIkJhZCBwcm90b2NvbCB2ZXJzaW9uIik7CisgIH0KKworICBtZXNzYWdlVHlwZSA9IChUTWVzc2FnZVR5cGUpKCh2ZXJzaW9uQW5kVHlwZSA+PiBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX0JJVFMpOworICByc2l6ZSArPSByZWFkVmFyaW50MzIoc2VxaWQpOworICByc2l6ZSArPSByZWFkU3RyaW5nKG5hbWUpOworCisgIHJldHVybiByc2l6ZTsKK30KKworLyoqCisgKiBSZWFkIGEgc3RydWN0IGJlZ2luLiBUaGVyZSdzIG5vdGhpbmcgb24gdGhlIHdpcmUgZm9yIHRoaXMsIGJ1dCBpdCBpcyBvdXIKKyAqIG9wcG9ydHVuaXR5IHRvIHB1c2ggYSBuZXcgc3RydWN0IGJlZ2luIG1hcmtlciBvbiB0aGUgZmllbGQgc3RhY2suCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSkgeworICBuYW1lID0gIiI7CisgIGxhc3RGaWVsZF8ucHVzaChsYXN0RmllbGRJZF8pOworICBsYXN0RmllbGRJZF8gPSAwOworICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvcgorICogdGhpcyBzdHJ1Y3QgZnJvbSB0aGUgZmllbGQgc3RhY2suCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTdHJ1Y3RFbmQoKSB7CisgIGxhc3RGaWVsZElkXyA9IGxhc3RGaWVsZF8udG9wKCk7CisgIGxhc3RGaWVsZF8ucG9wKCk7CisgIHJldHVybiAwOworfQorCisvKioKKyAqIFJlYWQgYSBmaWVsZCBoZWFkZXIgb2ZmIHRoZSB3aXJlLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKKyAgKHZvaWQpIG5hbWU7CisgIHVpbnQzMl90IHJzaXplID0gMDsKKyAgaW50OF90IGJ5dGU7CisgIGludDhfdCB0eXBlOworCisgIHJzaXplICs9IHJlYWRCeXRlKGJ5dGUpOworICB0eXBlID0gKGJ5dGUgJiAweDBmKTsKKworICAvLyBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIuCisgIGlmICh0eXBlID09IFRfU1RPUCkgeworICAgIGZpZWxkVHlwZSA9IFRfU1RPUDsKKyAgICBmaWVsZElkID0gMDsKKyAgICByZXR1cm4gcnNpemU7CisgIH0KKworICAvLyBtYXNrIG9mZiB0aGUgNCBNU0Igb2YgdGhlIHR5cGUgaGVhZGVyLiBpdCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQgZGVsdGEuCisgIGludDE2X3QgbW9kaWZpZXIgPSAoaW50MTZfdCkoKCh1aW50OF90KWJ5dGUgJiAweGYwKSA+PiA0KTsKKyAgaWYgKG1vZGlmaWVyID09IDApIHsKKyAgICAvLyBub3QgYSBkZWx0YSwgbG9vayBhaGVhZCBmb3IgdGhlIHppZ3phZyB2YXJpbnQgZmllbGQgaWQuCisgICAgcnNpemUgKz0gcmVhZEkxNihmaWVsZElkKTsKKyAgfSBlbHNlIHsKKyAgICBmaWVsZElkID0gKGludDE2X3QpKGxhc3RGaWVsZElkXyArIG1vZGlmaWVyKTsKKyAgfQorICBmaWVsZFR5cGUgPSBnZXRUVHlwZSh0eXBlKTsKKworICAvLyBpZiB0aGlzIGhhcHBlbnMgdG8gYmUgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgdHlwZQorICBpZiAodHlwZSA9PSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fVFJVRSB8fAorICAgICAgdHlwZSA9PSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fRkFMU0UpIHsKKyAgICAvLyBzYXZlIHRoZSBib29sZWFuIHZhbHVlIGluIGEgc3BlY2lhbCBpbnN0YW5jZSB2YXJpYWJsZS4KKyAgICBib29sVmFsdWVfLmhhc0Jvb2xWYWx1ZSA9IHRydWU7CisgICAgYm9vbFZhbHVlXy5ib29sVmFsdWUgPQorICAgICAgKHR5cGUgPT0gZGV0YWlsOjpjb21wYWN0OjpDVF9CT09MRUFOX1RSVUUgPyB0cnVlIDogZmFsc2UpOworICB9CisKKyAgLy8gcHVzaCB0aGUgbmV3IGZpZWxkIG9udG8gdGhlIGZpZWxkIHN0YWNrIHNvIHdlIGNhbiBrZWVwIHRoZSBkZWx0YXMgZ29pbmcuCisgIGxhc3RGaWVsZElkXyA9IGZpZWxkSWQ7CisgIHJldHVybiByc2l6ZTsKK30KKworLyoqCisgKiBSZWFkIGEgbWFwIGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzaXplIGlzIHplcm8sIHNraXAgcmVhZGluZyB0aGUga2V5CisgKiBhbmQgdmFsdWUgdHlwZS4gVGhpcyBtZWFucyB0aGF0IDAtbGVuZ3RoIG1hcHMgd2lsbCB5aWVsZCBUTWFwcyB3aXRob3V0IHRoZQorICogImNvcnJlY3QiIHR5cGVzLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgeworICB1aW50MzJfdCByc2l6ZSA9IDA7CisgIGludDhfdCBrdlR5cGUgPSAwOworICBpbnQzMl90IG1zaXplID0gMDsKKworICByc2l6ZSArPSByZWFkVmFyaW50MzIobXNpemUpOworICBpZiAobXNpemUgIT0gMCkKKyAgICByc2l6ZSArPSByZWFkQnl0ZShrdlR5cGUpOworCisgIGlmIChtc2l6ZSA8IDApIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKKyAgfSBlbHNlIGlmIChjb250YWluZXJfbGltaXRfICYmIG1zaXplID4gY29udGFpbmVyX2xpbWl0XykgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICB9CisKKyAga2V5VHlwZSA9IGdldFRUeXBlKChpbnQ4X3QpKCh1aW50OF90KWt2VHlwZSA+PiA0KSk7CisgIHZhbFR5cGUgPSBnZXRUVHlwZSgoaW50OF90KSgodWludDhfdClrdlR5cGUgJiAweGYpKTsKKyAgc2l6ZSA9ICh1aW50MzJfdCltc2l6ZTsKKworICByZXR1cm4gcnNpemU7Cit9CisKKy8qKgorICogUmVhZCBhIGxpc3QgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIGxpc3Qgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisgKiBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBsaXN0LCB0aGUgNCBNU0IKKyAqIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKKyAqIHRydWUgc2l6ZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgeworICBpbnQ4X3Qgc2l6ZV9hbmRfdHlwZTsKKyAgdWludDMyX3QgcnNpemUgPSAwOworICBpbnQzMl90IGxzaXplOworCisgIHJzaXplICs9IHJlYWRCeXRlKHNpemVfYW5kX3R5cGUpOworCisgIGxzaXplID0gKCh1aW50OF90KXNpemVfYW5kX3R5cGUgPj4gNCkgJiAweDBmOworICBpZiAobHNpemUgPT0gMTUpIHsKKyAgICByc2l6ZSArPSByZWFkVmFyaW50MzIobHNpemUpOworICB9CisKKyAgaWYgKGxzaXplIDwgMCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5FR0FUSVZFX1NJWkUpOworICB9IGVsc2UgaWYgKGNvbnRhaW5lcl9saW1pdF8gJiYgbHNpemUgPiBjb250YWluZXJfbGltaXRfKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIH0KKworICBlbGVtVHlwZSA9IGdldFRUeXBlKChpbnQ4X3QpKHNpemVfYW5kX3R5cGUgJiAweDBmKSk7CisgIHNpemUgPSAodWludDMyX3QpbHNpemU7CisKKyAgcmV0dXJuIHJzaXplOworfQorCisvKioKKyAqIFJlYWQgYSBzZXQgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNldCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKKyAqIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIHNldCwgdGhlIDQgTVNCCisgKiBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisgKiB0cnVlIHNpemUuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7CisgIHJldHVybiByZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKK30KKworLyoqCisgKiBSZWFkIGEgYm9vbGVhbiBvZmYgdGhlIHdpcmUuIElmIHRoaXMgaXMgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgc2hvdWxkCisgKiBhbHJlYWR5IGhhdmUgYmVlbiByZWFkIGR1cmluZyByZWFkRmllbGRCZWdpbiwgc28gd2UnbGwganVzdCBjb25zdW1lIHRoZQorICogcHJlLXN0b3JlZCB2YWx1ZS4gT3RoZXJ3aXNlLCByZWFkIGEgYnl0ZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKKyAgaWYgKGJvb2xWYWx1ZV8uaGFzQm9vbFZhbHVlID09IHRydWUpIHsKKyAgICB2YWx1ZSA9IGJvb2xWYWx1ZV8uYm9vbFZhbHVlOworICAgIGJvb2xWYWx1ZV8uaGFzQm9vbFZhbHVlID0gZmFsc2U7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgaW50OF90IHZhbDsKKyAgICByZWFkQnl0ZSh2YWwpOworICAgIHZhbHVlID0gKHZhbCA9PSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fVFJVRSk7CisgICAgcmV0dXJuIDE7CisgIH0KK30KKworLyoqCisgKiBSZWFkIGEgc2luZ2xlIGJ5dGUgb2ZmIHRoZSB3aXJlLiBOb3RoaW5nIGludGVyZXN0aW5nIGhlcmUuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRCeXRlKGludDhfdCYgYnl0ZSkgeworICB1aW50OF90IGJbMV07CisgIHRyYW5zXy0+cmVhZEFsbChiLCAxKTsKKyAgYnl0ZSA9ICooaW50OF90KiliOworICByZXR1cm4gMTsKK30KKworLyoqCisgKiBSZWFkIGFuIGkxNiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEkxNihpbnQxNl90JiBpMTYpIHsKKyAgaW50MzJfdCB2YWx1ZTsKKyAgdWludDMyX3QgcnNpemUgPSByZWFkVmFyaW50MzIodmFsdWUpOworICBpMTYgPSAoaW50MTZfdCl6aWd6YWdUb0kzMih2YWx1ZSk7CisgIHJldHVybiByc2l6ZTsKK30KKworLyoqCisgKiBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEkzMihpbnQzMl90JiBpMzIpIHsKKyAgaW50MzJfdCB2YWx1ZTsKKyAgdWludDMyX3QgcnNpemUgPSByZWFkVmFyaW50MzIodmFsdWUpOworICBpMzIgPSB6aWd6YWdUb0kzMih2YWx1ZSk7CisgIHJldHVybiByc2l6ZTsKK30KKworLyoqCisgKiBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEk2NChpbnQ2NF90JiBpNjQpIHsKKyAgaW50NjRfdCB2YWx1ZTsKKyAgdWludDMyX3QgcnNpemUgPSByZWFkVmFyaW50NjQodmFsdWUpOworICBpNjQgPSB6aWd6YWdUb0k2NCh2YWx1ZSk7CisgIHJldHVybiByc2l6ZTsKK30KKworLyoqCisgKiBObyBtYWdpYyBoZXJlIC0ganVzdCByZWFkIGEgZG91YmxlIG9mZiB0aGUgd2lyZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZERvdWJsZShkb3VibGUmIGR1YikgeworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCksICJzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpIik7CisgIHN0YXRpY19hc3NlcnQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTksICJzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSIpOworCisgIHVuaW9uIHsKKyAgICB1aW50NjRfdCBiaXRzOworICAgIHVpbnQ4X3QgYls4XTsKKyAgfSB1OworICB0cmFuc18tPnJlYWRBbGwodS5iLCA4KTsKKyAgdS5iaXRzID0gVEhSSUZUX2xldG9obGwodS5iaXRzKTsKKyAgZHViID0gYml0d2lzZV9jYXN0PGRvdWJsZT4odS5iaXRzKTsKKyAgcmV0dXJuIDg7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cikgeworICByZXR1cm4gcmVhZEJpbmFyeShzdHIpOworfQorCisvKioKKyAqIFJlYWQgYSBieXRlW10gZnJvbSB0aGUgd2lyZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKSB7CisgIGludDMyX3QgcnNpemUgPSAwOworICBpbnQzMl90IHNpemU7CisKKyAgcnNpemUgKz0gcmVhZFZhcmludDMyKHNpemUpOworICAvLyBDYXRjaCBlbXB0eSBzdHJpbmcgY2FzZQorICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgc3RyID0gIiI7CisgICAgcmV0dXJuIHJzaXplOworICB9CisKKyAgLy8gQ2F0Y2ggZXJyb3IgY2FzZXMKKyAgaWYgKHNpemUgPCAwKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7CisgIH0KKyAgaWYgKHN0cmluZ19saW1pdF8gPiAwICYmIHNpemUgPiBzdHJpbmdfbGltaXRfKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIH0KKworICAvLyBVc2UgdGhlIGhlYXAgaGVyZSB0byBwcmV2ZW50IHN0YWNrIG92ZXJmbG93IGZvciB2LiBsYXJnZSBzdHJpbmdzCisgIGlmIChzaXplID4gc3RyaW5nX2J1Zl9zaXplXyB8fCBzdHJpbmdfYnVmXyA9PSBOVUxMKSB7CisgICAgdm9pZCogbmV3X3N0cmluZ19idWYgPSBzdGQ6OnJlYWxsb2Moc3RyaW5nX2J1Zl8sICh1aW50MzJfdClzaXplKTsKKyAgICBpZiAobmV3X3N0cmluZ19idWYgPT0gTlVMTCkgeworICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKyAgICB9CisgICAgc3RyaW5nX2J1Zl8gPSAodWludDhfdCopbmV3X3N0cmluZ19idWY7CisgICAgc3RyaW5nX2J1Zl9zaXplXyA9IHNpemU7CisgIH0KKyAgdHJhbnNfLT5yZWFkQWxsKHN0cmluZ19idWZfLCBzaXplKTsKKyAgc3RyLmFzc2lnbigoY2hhciopc3RyaW5nX2J1Zl8sIHNpemUpOworCisgIHJldHVybiByc2l6ZSArICh1aW50MzJfdClzaXplOworfQorCisvKioKKyAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byA1IGJ5dGVzLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkVmFyaW50MzIoaW50MzJfdCYgaTMyKSB7CisgIGludDY0X3QgdmFsOworICB1aW50MzJfdCByc2l6ZSA9IHJlYWRWYXJpbnQ2NCh2YWwpOworICBpMzIgPSAoaW50MzJfdCl2YWw7CisgIHJldHVybiByc2l6ZTsKK30KKworLyoqCisgKiBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgcHJvcGVyIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDEwIGJ5dGVzLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkVmFyaW50NjQoaW50NjRfdCYgaTY0KSB7CisgIHVpbnQzMl90IHJzaXplID0gMDsKKyAgdWludDY0X3QgdmFsID0gMDsKKyAgaW50IHNoaWZ0ID0gMDsKKyAgdWludDhfdCBidWZbMTBdOyAgLy8gNjQgYml0cyAvICg3IGJpdHMvYnl0ZSkgPSAxMCBieXRlcy4KKyAgdWludDMyX3QgYnVmX3NpemUgPSBzaXplb2YoYnVmKTsKKyAgY29uc3QgdWludDhfdCogYm9ycm93ZWQgPSB0cmFuc18tPmJvcnJvdyhidWYsICZidWZfc2l6ZSk7CisKKyAgLy8gRmFzdCBwYXRoLgorICBpZiAoYm9ycm93ZWQgIT0gTlVMTCkgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB1aW50OF90IGJ5dGUgPSBib3Jyb3dlZFtyc2l6ZV07CisgICAgICByc2l6ZSsrOworICAgICAgdmFsIHw9ICh1aW50NjRfdCkoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgc2hpZnQgKz0gNzsKKyAgICAgIGlmICghKGJ5dGUgJiAweDgwKSkgeworICAgICAgICBpNjQgPSB2YWw7CisgICAgICAgIHRyYW5zXy0+Y29uc3VtZShyc2l6ZSk7CisgICAgICAgIHJldHVybiByc2l6ZTsKKyAgICAgIH0KKyAgICAgIC8vIEhhdmUgdG8gY2hlY2sgZm9yIGludmFsaWQgZGF0YSBzbyB3ZSBkb24ndCBjcmFzaC4KKyAgICAgIGlmIChVTkxJS0VMWShyc2l6ZSA9PSBzaXplb2YoYnVmKSkpIHsKKyAgICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLCAiVmFyaWFibGUtbGVuZ3RoIGludCBvdmVyIDEwIGJ5dGVzLiIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFNsb3cgcGF0aC4KKyAgZWxzZSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHVpbnQ4X3QgYnl0ZTsKKyAgICAgIHJzaXplICs9IHRyYW5zXy0+cmVhZEFsbCgmYnl0ZSwgMSk7CisgICAgICB2YWwgfD0gKHVpbnQ2NF90KShieXRlICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgICBzaGlmdCArPSA3OworICAgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7CisgICAgICAgIGk2NCA9IHZhbDsKKyAgICAgICAgcmV0dXJuIHJzaXplOworICAgICAgfQorICAgICAgLy8gTWlnaHQgYXMgd2VsbCBjaGVjayBmb3IgaW52YWxpZCBkYXRhIG9uIHRoZSBzbG93IHBhdGggdG9vLgorICAgICAgaWYgKFVOTElLRUxZKHJzaXplID49IHNpemVvZihidWYpKSkgeworICAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsICJWYXJpYWJsZS1sZW5ndGggaW50IG92ZXIgMTAgYnl0ZXMuIik7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8qKgorICogQ29udmVydCBmcm9tIHppZ3phZyBpbnQgdG8gaW50LgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK2ludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnppZ3phZ1RvSTMyKHVpbnQzMl90IG4pIHsKKyAgcmV0dXJuIChuID4+IDEpIF4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KC1zdGF0aWNfY2FzdDxpbnQzMl90PihuICYgMSkpOworfQorCisvKioKKyAqIENvbnZlcnQgZnJvbSB6aWd6YWcgbG9uZyB0byBsb25nLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK2ludDY0X3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnppZ3phZ1RvSTY0KHVpbnQ2NF90IG4pIHsKKyAgcmV0dXJuIChuID4+IDEpIF4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KC1zdGF0aWNfY2FzdDxpbnQ2NF90PihuICYgMSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK1RUeXBlIFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpnZXRUVHlwZShpbnQ4X3QgdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFRfU1RPUDoKKyAgICAgIHJldHVybiBUX1NUT1A7CisgICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fRkFMU0U6CisgICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fVFJVRToKKyAgICAgIHJldHVybiBUX0JPT0w7CisgICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JZVEU6CisgICAgICByZXR1cm4gVF9CWVRFOworICAgIGNhc2UgZGV0YWlsOjpjb21wYWN0OjpDVF9JMTY6CisgICAgICByZXR1cm4gVF9JMTY7CisgICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0kzMjoKKyAgICAgIHJldHVybiBUX0kzMjsKKyAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfSTY0OgorICAgICAgcmV0dXJuIFRfSTY0OworICAgIGNhc2UgZGV0YWlsOjpjb21wYWN0OjpDVF9ET1VCTEU6CisgICAgICByZXR1cm4gVF9ET1VCTEU7CisgICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JJTkFSWToKKyAgICAgIHJldHVybiBUX1NUUklORzsKKyAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfTElTVDoKKyAgICAgIHJldHVybiBUX0xJU1Q7CisgICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX1NFVDoKKyAgICAgIHJldHVybiBUX1NFVDsKKyAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfTUFQOgorICAgICAgcmV0dXJuIFRfTUFQOworICAgIGNhc2UgZGV0YWlsOjpjb21wYWN0OjpDVF9TVFJVQ1Q6CisgICAgICByZXR1cm4gVF9TVFJVQ1Q7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IFRFeGNlcHRpb24oc3RkOjpzdHJpbmcoImRvbid0IGtub3cgd2hhdCB0eXBlOiAiKSArIChjaGFyKXR5cGUpOworICB9Cit9CisKK319fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworI2VuZGlmIC8vIF9USFJJRlRfUFJPVE9DT0xfVENPTVBBQ1RQUk9UT0NPTF9UQ0NfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTZkNGEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmNwcApAQCAtMCwwICsxLDM5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvVFRvU3RyaW5nLmg+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjY3R5cGU+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK3N0YXRpYyBzdHJpbmcgYnl0ZV90b19oZXgoY29uc3QgdWludDhfdCBieXRlKSB7CisgIGNoYXIgYnVmWzNdOworICBpbnQgcmV0ID0gc3RkOjpzcHJpbnRmKGJ1ZiwgIiUwMngiLCAoaW50KWJ5dGUpOworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHJldCk7CisgIGFzc2VydChyZXQgPT0gMik7CisgIGFzc2VydChidWZbMl0gPT0gJ1wwJyk7CisgIHJldHVybiBidWY7Cit9CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCitzdHJpbmcgVERlYnVnUHJvdG9jb2w6OmZpZWxkVHlwZU5hbWUoVFR5cGUgdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgY2FzZSBUX1NUT1A6CisgICAgcmV0dXJuICJzdG9wIjsKKyAgY2FzZSBUX1ZPSUQ6CisgICAgcmV0dXJuICJ2b2lkIjsKKyAgY2FzZSBUX0JPT0w6CisgICAgcmV0dXJuICJib29sIjsKKyAgY2FzZSBUX0JZVEU6CisgICAgcmV0dXJuICJieXRlIjsKKyAgY2FzZSBUX0kxNjoKKyAgICByZXR1cm4gImkxNiI7CisgIGNhc2UgVF9JMzI6CisgICAgcmV0dXJuICJpMzIiOworICBjYXNlIFRfVTY0OgorICAgIHJldHVybiAidTY0IjsKKyAgY2FzZSBUX0k2NDoKKyAgICByZXR1cm4gImk2NCI7CisgIGNhc2UgVF9ET1VCTEU6CisgICAgcmV0dXJuICJkb3VibGUiOworICBjYXNlIFRfU1RSSU5HOgorICAgIHJldHVybiAic3RyaW5nIjsKKyAgY2FzZSBUX1NUUlVDVDoKKyAgICByZXR1cm4gInN0cnVjdCI7CisgIGNhc2UgVF9NQVA6CisgICAgcmV0dXJuICJtYXAiOworICBjYXNlIFRfU0VUOgorICAgIHJldHVybiAic2V0IjsKKyAgY2FzZSBUX0xJU1Q6CisgICAgcmV0dXJuICJsaXN0IjsKKyAgY2FzZSBUX1VURjg6CisgICAgcmV0dXJuICJ1dGY4IjsKKyAgY2FzZSBUX1VURjE2OgorICAgIHJldHVybiAidXRmMTYiOworICBkZWZhdWx0OgorICAgIHJldHVybiAidW5rbm93biI7CisgIH0KK30KKwordm9pZCBURGVidWdQcm90b2NvbDo6aW5kZW50VXAoKSB7CisgIGluZGVudF9zdHJfICs9IHN0cmluZyhpbmRlbnRfaW5jLCAnICcpOworfQorCit2b2lkIFREZWJ1Z1Byb3RvY29sOjppbmRlbnREb3duKCkgeworICBpZiAoaW5kZW50X3N0cl8ubGVuZ3RoKCkgPCAoc3RyaW5nOjpzaXplX3R5cGUpaW5kZW50X2luYykgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CisgIH0KKyAgaW5kZW50X3N0cl8uZXJhc2UoaW5kZW50X3N0cl8ubGVuZ3RoKCkgLSBpbmRlbnRfaW5jKTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlUGxhaW4oY29uc3Qgc3RyaW5nJiBzdHIpIHsKKyAgaWYgKHN0ci5sZW5ndGgoKSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICB0cmFuc18tPndyaXRlKCh1aW50OF90KilzdHIuZGF0YSgpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyLmxlbmd0aCgpKSk7CisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyLmxlbmd0aCgpKTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlSW5kZW50ZWQoY29uc3Qgc3RyaW5nJiBzdHIpIHsKKyAgaWYgKHN0ci5sZW5ndGgoKSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICBpZiAoaW5kZW50X3N0cl8ubGVuZ3RoKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgdWludDY0X3QgdG90YWxfbGVuID0gaW5kZW50X3N0cl8ubGVuZ3RoKCkgKyBzdHIubGVuZ3RoKCk7CisgIGlmICh0b3RhbF9sZW4gPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgdHJhbnNfLT53cml0ZSgodWludDhfdCopaW5kZW50X3N0cl8uZGF0YSgpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5kZW50X3N0cl8ubGVuZ3RoKCkpKTsKKyAgdHJhbnNfLT53cml0ZSgodWludDhfdCopc3RyLmRhdGEoKSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ci5sZW5ndGgoKSkpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGluZGVudF9zdHJfLmxlbmd0aCgpICsgc3RyLmxlbmd0aCgpKTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OnN0YXJ0SXRlbSgpIHsKKyAgdWludDMyX3Qgc2l6ZTsKKworICBzd2l0Y2ggKHdyaXRlX3N0YXRlXy5iYWNrKCkpIHsKKyAgY2FzZSBVTklOSVQ6CisgICAgLy8gWFhYIGZpZ3VyZSBvdXQgd2hhdCB0byBkbyBoZXJlLgorICAgIC8vIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CisgICAgLy8gcmV0dXJuIHdyaXRlSW5kZW50ZWQoc3RyKTsKKyAgICByZXR1cm4gMDsKKyAgY2FzZSBTVFJVQ1Q6CisgICAgcmV0dXJuIDA7CisgIGNhc2UgU0VUOgorICAgIHJldHVybiB3cml0ZUluZGVudGVkKCIiKTsKKyAgY2FzZSBNQVBfS0VZOgorICAgIHJldHVybiB3cml0ZUluZGVudGVkKCIiKTsKKyAgY2FzZSBNQVBfVkFMVUU6CisgICAgcmV0dXJuIHdyaXRlUGxhaW4oIiAtPiAiKTsKKyAgY2FzZSBMSVNUOgorICAgIHNpemUgPSB3cml0ZUluZGVudGVkKCJbIiArIHRvX3N0cmluZyhsaXN0X2lkeF8uYmFjaygpKSArICJdID0gIik7CisgICAgbGlzdF9pZHhfLmJhY2soKSsrOworICAgIHJldHVybiBzaXplOworICBkZWZhdWx0OgorICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIkludmFsaWQgZW51bSB2YWx1ZS4iKTsKKyAgfQorfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6ZW5kSXRlbSgpIHsKKyAgLy8gdWludDMyX3Qgc2l6ZTsKKworICBzd2l0Y2ggKHdyaXRlX3N0YXRlXy5iYWNrKCkpIHsKKyAgY2FzZSBVTklOSVQ6CisgICAgLy8gWFhYIGZpZ3VyZSBvdXQgd2hhdCB0byBkbyBoZXJlLgorICAgIC8vIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CisgICAgLy8gcmV0dXJuIHdyaXRlSW5kZW50ZWQoc3RyKTsKKyAgICByZXR1cm4gMDsKKyAgY2FzZSBTVFJVQ1Q6CisgICAgcmV0dXJuIHdyaXRlUGxhaW4oIixcbiIpOworICBjYXNlIFNFVDoKKyAgICByZXR1cm4gd3JpdGVQbGFpbigiLFxuIik7CisgIGNhc2UgTUFQX0tFWToKKyAgICB3cml0ZV9zdGF0ZV8uYmFjaygpID0gTUFQX1ZBTFVFOworICAgIHJldHVybiAwOworICBjYXNlIE1BUF9WQUxVRToKKyAgICB3cml0ZV9zdGF0ZV8uYmFjaygpID0gTUFQX0tFWTsKKyAgICByZXR1cm4gd3JpdGVQbGFpbigiLFxuIik7CisgIGNhc2UgTElTVDoKKyAgICByZXR1cm4gd3JpdGVQbGFpbigiLFxuIik7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiSW52YWxpZCBlbnVtIHZhbHVlLiIpOworICB9Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUl0ZW0oY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICB1aW50MzJfdCBzaXplID0gMDsKKyAgc2l6ZSArPSBzdGFydEl0ZW0oKTsKKyAgc2l6ZSArPSB3cml0ZVBsYWluKHN0cik7CisgIHNpemUgKz0gZW5kSXRlbSgpOworICByZXR1cm4gc2l6ZTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7CisgICh2b2lkKXNlcWlkOworICBzdHJpbmcgbXR5cGU7CisgIHN3aXRjaCAobWVzc2FnZVR5cGUpIHsKKyAgY2FzZSBUX0NBTEw6CisgICAgbXR5cGUgPSAiY2FsbCI7CisgICAgYnJlYWs7CisgIGNhc2UgVF9SRVBMWToKKyAgICBtdHlwZSA9ICJyZXBseSI7CisgICAgYnJlYWs7CisgIGNhc2UgVF9FWENFUFRJT046CisgICAgbXR5cGUgPSAiZXhuIjsKKyAgICBicmVhazsKKyAgY2FzZSBUX09ORVdBWToKKyAgICBtdHlwZSA9ICJvbmV3YXkiOworICAgIGJyZWFrOworICB9CisKKyAgdWludDMyX3Qgc2l6ZSA9IHdyaXRlSW5kZW50ZWQoIigiICsgbXR5cGUgKyAiKSAiICsgbmFtZSArICIoIik7CisgIGluZGVudFVwKCk7CisgIHJldHVybiBzaXplOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVNZXNzYWdlRW5kKCkgeworICBpbmRlbnREb3duKCk7CisgIHJldHVybiB3cml0ZUluZGVudGVkKCIpXG4iKTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSkgeworICB1aW50MzJfdCBzaXplID0gMDsKKyAgc2l6ZSArPSBzdGFydEl0ZW0oKTsKKyAgc2l6ZSArPSB3cml0ZVBsYWluKHN0cmluZyhuYW1lKSArICIge1xuIik7CisgIGluZGVudFVwKCk7CisgIHdyaXRlX3N0YXRlXy5wdXNoX2JhY2soU1RSVUNUKTsKKyAgcmV0dXJuIHNpemU7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZVN0cnVjdEVuZCgpIHsKKyAgaW5kZW50RG93bigpOworICB3cml0ZV9zdGF0ZV8ucG9wX2JhY2soKTsKKyAgdWludDMyX3Qgc2l6ZSA9IDA7CisgIHNpemUgKz0gd3JpdGVJbmRlbnRlZCgifSIpOworICBzaXplICs9IGVuZEl0ZW0oKTsKKyAgcmV0dXJuIHNpemU7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKKyAgLy8gc3ByaW50ZihpZF9zdHIsICIlMDJkIiwgZmllbGRJZCk7CisgIHN0cmluZyBpZF9zdHIgPSB0b19zdHJpbmcoZmllbGRJZCk7CisgIGlmIChpZF9zdHIubGVuZ3RoKCkgPT0gMSkKKyAgICBpZF9zdHIgPSAnMCcgKyBpZF9zdHI7CisKKyAgcmV0dXJuIHdyaXRlSW5kZW50ZWQoaWRfc3RyICsgIjogIiArIG5hbWUgKyAiICgiICsgZmllbGRUeXBlTmFtZShmaWVsZFR5cGUpICsgIikgPSAiKTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlRmllbGRFbmQoKSB7CisgIGFzc2VydCh3cml0ZV9zdGF0ZV8uYmFjaygpID09IFNUUlVDVCk7CisgIHJldHVybiAwOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVGaWVsZFN0b3AoKSB7CisgIHJldHVybiAwOworICAvLyB3cml0ZUluZGVudGVkKCIqKipTVE9QKioqXG4iKTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIC8vIFRPRE8oZHJlaXNzKTogT3B0aW1pemUgc2hvcnQgbWFwcz8KKyAgdWludDMyX3QgYnNpemUgPSAwOworICBic2l6ZSArPSBzdGFydEl0ZW0oKTsKKyAgYnNpemUgKz0gd3JpdGVQbGFpbigKKyAgICAgICJtYXA8IiArIGZpZWxkVHlwZU5hbWUoa2V5VHlwZSkgKyAiLCIgKyBmaWVsZFR5cGVOYW1lKHZhbFR5cGUpICsgIj4iCisgICAgICAiWyIgKyB0b19zdHJpbmcoc2l6ZSkgKyAiXSB7XG4iKTsKKyAgaW5kZW50VXAoKTsKKyAgd3JpdGVfc3RhdGVfLnB1c2hfYmFjayhNQVBfS0VZKTsKKyAgcmV0dXJuIGJzaXplOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVNYXBFbmQoKSB7CisgIGluZGVudERvd24oKTsKKyAgd3JpdGVfc3RhdGVfLnBvcF9iYWNrKCk7CisgIHVpbnQzMl90IHNpemUgPSAwOworICBzaXplICs9IHdyaXRlSW5kZW50ZWQoIn0iKTsKKyAgc2l6ZSArPSBlbmRJdGVtKCk7CisgIHJldHVybiBzaXplOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgLy8gVE9ETyhkcmVpc3MpOiBPcHRpbWl6ZSBzaG9ydCBhcnJheXMuCisgIHVpbnQzMl90IGJzaXplID0gMDsKKyAgYnNpemUgKz0gc3RhcnRJdGVtKCk7CisgIGJzaXplICs9IHdyaXRlUGxhaW4oCisgICAgICAibGlzdDwiICsgZmllbGRUeXBlTmFtZShlbGVtVHlwZSkgKyAiPiIKKyAgICAgICJbIiArIHRvX3N0cmluZyhzaXplKSArICJdIHtcbiIpOworICBpbmRlbnRVcCgpOworICB3cml0ZV9zdGF0ZV8ucHVzaF9iYWNrKExJU1QpOworICBsaXN0X2lkeF8ucHVzaF9iYWNrKDApOworICByZXR1cm4gYnNpemU7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUxpc3RFbmQoKSB7CisgIGluZGVudERvd24oKTsKKyAgd3JpdGVfc3RhdGVfLnBvcF9iYWNrKCk7CisgIGxpc3RfaWR4Xy5wb3BfYmFjaygpOworICB1aW50MzJfdCBzaXplID0gMDsKKyAgc2l6ZSArPSB3cml0ZUluZGVudGVkKCJ9Iik7CisgIHNpemUgKz0gZW5kSXRlbSgpOworICByZXR1cm4gc2l6ZTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgLy8gVE9ETyhkcmVpc3MpOiBPcHRpbWl6ZSBzaG9ydCBzZXRzLgorICB1aW50MzJfdCBic2l6ZSA9IDA7CisgIGJzaXplICs9IHN0YXJ0SXRlbSgpOworICBic2l6ZSArPSB3cml0ZVBsYWluKAorICAgICAgInNldDwiICsgZmllbGRUeXBlTmFtZShlbGVtVHlwZSkgKyAiPiIKKyAgICAgICJbIiArIHRvX3N0cmluZyhzaXplKSArICJdIHtcbiIpOworICBpbmRlbnRVcCgpOworICB3cml0ZV9zdGF0ZV8ucHVzaF9iYWNrKFNFVCk7CisgIHJldHVybiBic2l6ZTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlU2V0RW5kKCkgeworICBpbmRlbnREb3duKCk7CisgIHdyaXRlX3N0YXRlXy5wb3BfYmFjaygpOworICB1aW50MzJfdCBzaXplID0gMDsKKyAgc2l6ZSArPSB3cml0ZUluZGVudGVkKCJ9Iik7CisgIHNpemUgKz0gZW5kSXRlbSgpOworICByZXR1cm4gc2l6ZTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKSB7CisgIHJldHVybiB3cml0ZUl0ZW0odmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgeworICByZXR1cm4gd3JpdGVJdGVtKCIweCIgKyBieXRlX3RvX2hleChieXRlKSk7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgeworICByZXR1cm4gd3JpdGVJdGVtKHRvX3N0cmluZyhpMTYpKTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKSB7CisgIHJldHVybiB3cml0ZUl0ZW0odG9fc3RyaW5nKGkzMikpOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKKyAgcmV0dXJuIHdyaXRlSXRlbSh0b19zdHJpbmcoaTY0KSk7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7CisgIHJldHVybiB3cml0ZUl0ZW0odG9fc3RyaW5nKGR1YikpOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVTdHJpbmcoY29uc3Qgc3RyaW5nJiBzdHIpIHsKKyAgLy8gWFhYIFJhdy9VVEYtOD8KKworICBzdHJpbmcgdG9fc2hvdyA9IHN0cjsKKyAgaWYgKHRvX3Nob3cubGVuZ3RoKCkgPiAoc3RyaW5nOjpzaXplX3R5cGUpc3RyaW5nX2xpbWl0XykgeworICAgIHRvX3Nob3cgPSBzdHIuc3Vic3RyKDAsIHN0cmluZ19wcmVmaXhfc2l6ZV8pOworICAgIHRvX3Nob3cgKz0gIlsuLi5dKCIgKyB0b19zdHJpbmcoc3RyLmxlbmd0aCgpKSArICIpIjsKKyAgfQorCisgIHN0cmluZyBvdXRwdXQgPSAiXCIiOworCisgIGZvciAoc3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdCA9IHRvX3Nob3cuYmVnaW4oKTsgaXQgIT0gdG9fc2hvdy5lbmQoKTsgKytpdCkgeworICAgIGlmICgqaXQgPT0gJ1xcJykgeworICAgICAgb3V0cHV0ICs9ICJcXFxcIjsKKyAgICB9IGVsc2UgaWYgKCppdCA9PSAnIicpIHsKKyAgICAgIG91dHB1dCArPSAiXFxcIiI7CisgICAgICAvLyBwYXNzaW5nIGNoYXJhY3RlcnMgPDAgdG8gc3RkOjppc3ByaW50IGNhdXNlcyBhc3NlcnRzLiBpc3ByaW50IHRha2VzIGFuCisgICAgICAvLyBpbnQsIHNvIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBvZiBzaWduIGV4dGVuc2lvbgorICAgIH0gZWxzZSBpZiAoc3RkOjppc3ByaW50KCh1bnNpZ25lZCBjaGFyKSppdCkpIHsKKyAgICAgIG91dHB1dCArPSAqaXQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAoKml0KSB7CisgICAgICBjYXNlICdcYSc6CisgICAgICAgIG91dHB1dCArPSAiXFxhIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcYic6CisgICAgICAgIG91dHB1dCArPSAiXFxiIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcZic6CisgICAgICAgIG91dHB1dCArPSAiXFxmIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcbic6CisgICAgICAgIG91dHB1dCArPSAiXFxuIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdccic6CisgICAgICAgIG91dHB1dCArPSAiXFxyIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcdCc6CisgICAgICAgIG91dHB1dCArPSAiXFx0IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcdic6CisgICAgICAgIG91dHB1dCArPSAiXFx2IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBvdXRwdXQgKz0gIlxceCI7CisgICAgICAgIG91dHB1dCArPSBieXRlX3RvX2hleCgqaXQpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIG91dHB1dCArPSAnXCInOworICByZXR1cm4gd3JpdGVJdGVtKG91dHB1dCk7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUJpbmFyeShjb25zdCBzdHJpbmcmIHN0cikgeworICAvLyBYWFggSGV4PworICByZXR1cm4gVERlYnVnUHJvdG9jb2w6OndyaXRlU3RyaW5nKHN0cik7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDc5NjI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmgKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RERUJVR1BST1RPQ09MX0hfCisjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVERFQlVHUFJPVE9DT0xfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKKy8qCisKKyEhISBFWFBFUklNRU5UQUwgQ09ERSAhISEKKworVGhpcyBwcm90b2NvbCBpcyB2ZXJ5IG11Y2ggYSB3b3JrIGluIHByb2dyZXNzLgorSXQgZG9lc24ndCBoYW5kbGUgbWFueSBjYXNlcyBwcm9wZXJseS4KK0l0IHRocm93cyBleGNlcHRpb25zIGluIG1hbnkgY2FzZXMuCitJdCBwcm9iYWJseSBzZWdmYXVsdHMgaW4gbWFueSBjYXNlcy4KK0J1ZyByZXBvcnRzIGFuZCBmZWF0dXJlIHJlcXVlc3RzIGFyZSB3ZWxjb21lLgorQ29tcGxhaW50cyBhcmUgbm90LiA6UgorCisqLworCisvKioKKyAqIFByb3RvY29sIHRoYXQgcHJpbnRzIHRoZSBwYXlsb2FkIGluIGEgbmljZSBodW1hbi1yZWFkYWJsZSBmb3JtYXQuCisgKiBSZWFkaW5nIGZyb20gdGhpcyBwcm90b2NvbCBpcyBub3Qgc3VwcG9ydGVkLgorICoKKyAqLworY2xhc3MgVERlYnVnUHJvdG9jb2wgOiBwdWJsaWMgVFZpcnR1YWxQcm90b2NvbDxURGVidWdQcm90b2NvbD4geworcHJpdmF0ZToKKyAgZW51bSB3cml0ZV9zdGF0ZV90IHsgVU5JTklULCBTVFJVQ1QsIExJU1QsIFNFVCwgTUFQX0tFWSwgTUFQX1ZBTFVFIH07CisKK3B1YmxpYzoKKyAgVERlYnVnUHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKQorICAgIDogVFZpcnR1YWxQcm90b2NvbDxURGVidWdQcm90b2NvbD4odHJhbnMpLAorICAgICAgdHJhbnNfKHRyYW5zLmdldCgpKSwKKyAgICAgIHN0cmluZ19saW1pdF8oREVGQVVMVF9TVFJJTkdfTElNSVQpLAorICAgICAgc3RyaW5nX3ByZWZpeF9zaXplXyhERUZBVUxUX1NUUklOR19QUkVGSVhfU0laRSkgeworICAgIHdyaXRlX3N0YXRlXy5wdXNoX2JhY2soVU5JTklUKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBpbnQzMl90IERFRkFVTFRfU1RSSU5HX0xJTUlUID0gMjU2OworICBzdGF0aWMgY29uc3QgaW50MzJfdCBERUZBVUxUX1NUUklOR19QUkVGSVhfU0laRSA9IDE2OworCisgIHZvaWQgc2V0U3RyaW5nU2l6ZUxpbWl0KGludDMyX3Qgc3RyaW5nX2xpbWl0KSB7IHN0cmluZ19saW1pdF8gPSBzdHJpbmdfbGltaXQ7IH0KKworICB2b2lkIHNldFN0cmluZ1ByZWZpeFNpemUoaW50MzJfdCBzdHJpbmdfcHJlZml4X3NpemUpIHsgc3RyaW5nX3ByZWZpeF9zaXplXyA9IHN0cmluZ19wcmVmaXhfc2l6ZTsgfQorCisgIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpOworCisgIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSk7CisKKyAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgVFR5cGUgZmllbGRUeXBlLCBjb25zdCBpbnQxNl90IGZpZWxkSWQpOworCisgIHVpbnQzMl90IHdyaXRlRmllbGRFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcCgpOworCisgIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwgY29uc3QgVFR5cGUgdmFsVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVNYXBFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVTZXRFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKTsKKworICB1aW50MzJfdCB3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNik7CisKKyAgdWludDMyX3Qgd3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpOworCisgIHVpbnQzMl90IHdyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KTsKKworICB1aW50MzJfdCB3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKTsKKworICB1aW50MzJfdCB3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworICB1aW50MzJfdCB3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworcHJpdmF0ZToKKyAgdm9pZCBpbmRlbnRVcCgpOworICB2b2lkIGluZGVudERvd24oKTsKKyAgdWludDMyX3Qgd3JpdGVQbGFpbihjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKyAgdWludDMyX3Qgd3JpdGVJbmRlbnRlZChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKyAgdWludDMyX3Qgc3RhcnRJdGVtKCk7CisgIHVpbnQzMl90IGVuZEl0ZW0oKTsKKyAgdWludDMyX3Qgd3JpdGVJdGVtKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBmaWVsZFR5cGVOYW1lKFRUeXBlIHR5cGUpOworCisgIFRUcmFuc3BvcnQqIHRyYW5zXzsKKworICBpbnQzMl90IHN0cmluZ19saW1pdF87CisgIGludDMyX3Qgc3RyaW5nX3ByZWZpeF9zaXplXzsKKworICBzdGQ6OnN0cmluZyBpbmRlbnRfc3RyXzsKKyAgc3RhdGljIGNvbnN0IGludCBpbmRlbnRfaW5jID0gMjsKKworICBzdGQ6OnZlY3Rvcjx3cml0ZV9zdGF0ZV90PiB3cml0ZV9zdGF0ZV87CisgIHN0ZDo6dmVjdG9yPGludD4gbGlzdF9pZHhfOworfTsKKworLyoqCisgKiBDb25zdHJ1Y3RzIGRlYnVnIHByb3RvY29sIGhhbmRsZXJzCisgKi8KK2NsYXNzIFREZWJ1Z1Byb3RvY29sRmFjdG9yeSA6IHB1YmxpYyBUUHJvdG9jb2xGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVERlYnVnUHJvdG9jb2xGYWN0b3J5KCkge30KKyAgdmlydHVhbCB+VERlYnVnUHJvdG9jb2xGYWN0b3J5KCkge30KKworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4obmV3IFREZWJ1Z1Byb3RvY29sKHRyYW5zKSk7CisgIH0KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorCisvLyBUT0RPKGRyZWlzcyk6IE1vdmUgKHBhcnQgb2YpIFRocmlmdERlYnVnU3RyaW5nIGludG8gYSAuY3BwIGZpbGUgYW5kIHJlbW92ZSB0aGlzLgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFRocmlmdFN0cnVjdD4KK3N0ZDo6c3RyaW5nIFRocmlmdERlYnVnU3RyaW5nKGNvbnN0IFRocmlmdFN0cnVjdCYgdHMpIHsKKyAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CisgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CisgIFRNZW1vcnlCdWZmZXIqIGJ1ZmZlciA9IG5ldyBUTWVtb3J5QnVmZmVyOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMoYnVmZmVyKTsKKyAgVERlYnVnUHJvdG9jb2wgcHJvdG9jb2wodHJhbnMpOworCisgIHRzLndyaXRlKCZwcm90b2NvbCk7CisKKyAgdWludDhfdCogYnVmOworICB1aW50MzJfdCBzaXplOworICBidWZmZXItPmdldEJ1ZmZlcigmYnVmLCAmc2l6ZSk7CisgIHJldHVybiBzdGQ6OnN0cmluZygoY2hhciopYnVmLCAodW5zaWduZWQgaW50KXNpemUpOworfQorCisvLyBUT0RPKGRyZWlzcyk6IFRoaXMgaXMgYmFkbHkgYnJva2VuLiAgRG9uJ3QgdXNlIGl0IHVubGVzcyB5b3UgYXJlIG1lLgorI2lmIDAKK3RlbXBsYXRlPHR5cGVuYW1lIE9iamVjdD4KK3N0ZDo6c3RyaW5nIERlYnVnU3RyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPE9iamVjdD4mIHZlYykgeworICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKKyAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKKyAgVE1lbW9yeUJ1ZmZlciogYnVmZmVyID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucyhidWZmZXIpOworICBURGVidWdQcm90b2NvbCBwcm90b2NvbCh0cmFucyk7CisKKyAgLy8gSSBhbSBncm9zcyEKKyAgcHJvdG9jb2wud3JpdGVTdHJ1Y3RCZWdpbigiU29tZVJhbmRvbVZlY3RvciIpOworCisgIC8vIFRPRE86IEZpeCB0aGlzIHdpdGggYSB0cmFpdC4KKyAgcHJvdG9jb2wud3JpdGVMaXN0QmVnaW4oKFRUeXBlKTk5LCB2ZWMuc2l6ZSgpKTsKKyAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8T2JqZWN0Pjo6Y29uc3RfaXRlcmF0b3IgaXQ7CisgIGZvciAoaXQgPSB2ZWMuYmVnaW4oKTsgaXQgIT0gdmVjLmVuZCgpOyArK2l0KSB7CisgICAgaXQtPndyaXRlKCZwcm90b2NvbCk7CisgIH0KKyAgcHJvdG9jb2wud3JpdGVMaXN0RW5kKCk7CisKKyAgdWludDhfdCogYnVmOworICB1aW50MzJfdCBzaXplOworICBidWZmZXItPmdldEJ1ZmZlcigmYnVmLCAmc2l6ZSk7CisgIHJldHVybiBzdGQ6OnN0cmluZygoY2hhciopYnVmLCAodW5zaWduZWQgaW50KXNpemUpOworfQorI2VuZGlmIC8vIDAKK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UREVCVUdQUk9UT0NPTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjQyZTMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgVEhSSUZUX1BST1RPQ09MX1RIRUFERVJQUk9UT0NPTF9DUFBfCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9USEVBREVSUFJPVE9DT0xfQ1BQXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPgorCisjaW5jbHVkZSA8bGltaXRzPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKwordm9pZCBUSGVhZGVyUHJvdG9jb2w6OnJlc2V0UHJvdG9jb2woKSB7CisgIGlmIChwcm90b18gJiYgcHJvdG9JZF8gPT0gdHJhbnNfLT5nZXRQcm90b2NvbElkKCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBwcm90b0lkXyA9IHRyYW5zXy0+Z2V0UHJvdG9jb2xJZCgpOworCisgIHN3aXRjaCAocHJvdG9JZF8pIHsKKyAgY2FzZSBUX0JJTkFSWV9QUk9UT0NPTDoKKyAgICBwcm90b18gPSBzdGQ6Om1ha2Vfc2hhcmVkPFRCaW5hcnlQcm90b2NvbFQ8VEhlYWRlclRyYW5zcG9ydD4gPih0cmFuc18pOworICAgIGJyZWFrOworCisgIGNhc2UgVF9DT01QQUNUX1BST1RPQ09MOgorICAgIHByb3RvXyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VENvbXBhY3RQcm90b2NvbFQ8VEhlYWRlclRyYW5zcG9ydD4gPih0cmFuc18pOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgdGhyb3cgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gcHJvdG9jb2wgcmVxdWVzdGVkIik7CisgIH0KK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcUlkKSB7CisgIHJlc2V0UHJvdG9jb2woKTsgLy8gUmVzZXQgaW4gY2FzZSB3ZSBjaGFuZ2VkIHByb3RvY29scworICB0cmFuc18tPnNldFNlcXVlbmNlTnVtYmVyKHNlcUlkKTsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcUlkKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZU1lc3NhZ2VFbmQoKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlTWVzc2FnZUVuZCgpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZVN0cnVjdEJlZ2luKG5hbWUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlU3RydWN0RW5kKCkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZVN0cnVjdEVuZCgpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlRmllbGRFbmQoKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlRmllbGRFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZUZpZWxkU3RvcCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVGaWVsZFN0b3AoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVNYXBFbmQoKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlTWFwRW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlTGlzdEVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVMaXN0RW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZVNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZVNldEVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVTZXRFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZUJvb2wodmFsdWUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZUJ5dGUoYnl0ZSk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVJMTYoaTE2KTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgeworICByZXR1cm4gcHJvdG9fLT53cml0ZUkzMihpMzIpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KSB7CisgIHJldHVybiBwcm90b18tPndyaXRlSTY0KGk2NCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgeworICByZXR1cm4gcHJvdG9fLT53cml0ZURvdWJsZShkdWIpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVTdHJpbmcoc3RyKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlQmluYXJ5KHN0cik7Cit9CisKKy8qKgorICogUmVhZGluZyBmdW5jdGlvbnMKKyAqLworCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFJZCkgeworICAvLyBSZWFkIHRoZSBuZXh0IGZyYW1lLCBhbmQgY2hhbmdlIHByb3RvY29scyBpZiBuZWVkZWQKKyAgdHJ5IHsKKyAgICB0cmFuc18tPnJlc2V0UHJvdG9jb2woKTsKKyAgICByZXNldFByb3RvY29sKCk7CisgIH0gY2F0Y2ggKGNvbnN0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiYgZXgpIHsKKyAgICB3cml0ZU1lc3NhZ2VCZWdpbigiIiwgVF9FWENFUFRJT04sIDApOworICAgIGV4LndyaXRlKChUUHJvdG9jb2wqKXRoaXMpOworICAgIHdyaXRlTWVzc2FnZUVuZCgpOworICAgIHRyYW5zXy0+Zmx1c2goKTsKKworICAgIC8vIFRoZSBmcmFtaW5nIGlzIHN0aWxsIGdvb2QsIGJ1dCB3ZSBkb24ndCBrbm93IGFib3V0IHRoaXMgcHJvdG9jb2wuCisgICAgLy8gSW4gdGhlIGZ1dHVyZSwgdGhpcyBjb3VsZCBiZSBtYWRlIGEgY2xpZW50LXNpZGUgb25seSBlcnJvciBpZgorICAgIC8vIGNvbm5lY3Rpb24gcG9vbGluZyBpcyB1c2VkLgorICAgIHRocm93IGV4OworICB9CisgIHJldHVybiBwcm90b18tPnJlYWRNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcUlkKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkTWVzc2FnZUVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZE1lc3NhZ2VFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZFN0cnVjdEJlZ2luKG5hbWUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRTdHJ1Y3RFbmQoKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRTdHJ1Y3RFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVFR5cGUmIGZpZWxkVHlwZSwgaW50MTZfdCYgZmllbGRJZCkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRGaWVsZEVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZEZpZWxkRW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZE1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRNYXBFbmQoKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRNYXBFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZExpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZExpc3RFbmQoKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRMaXN0RW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZFNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkU2V0RW5kKCkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkU2V0RW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZEJvb2wodmFsdWUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRCeXRlKGludDhfdCYgYnl0ZSkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkQnl0ZShieXRlKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkSTE2KGludDE2X3QmIGkxNikgeworICByZXR1cm4gcHJvdG9fLT5yZWFkSTE2KGkxNik7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZEkzMihpbnQzMl90JiBpMzIpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZEkzMihpMzIpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRJNjQoaW50NjRfdCYgaTY0KSB7CisgIHJldHVybiBwcm90b18tPnJlYWRJNjQoaTY0KTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7CisgIHJldHVybiBwcm90b18tPnJlYWREb3VibGUoZHViKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZFN0cmluZyhzdHIpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIGJpbmFyeSkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkQmluYXJ5KGJpbmFyeSk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorCisjZW5kaWYgLy8gI2lmbmRlZiBUSFJJRlRfUFJPVE9DT0xfVEhFQURFUlBST1RPQ09MX0NQUF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWUyYjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5oCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1BST1RPQ09MX1RIRUFERVJQUk9UT0NPTF9IXworI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfVEhFQURFUlBST1RPQ09MX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVHlwZXMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUSGVhZGVyVHJhbnNwb3J0OworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKworLyoqCisgKiBUaGUgaGVhZGVyIHByb3RvY29sIGZvciB0aHJpZnQuIFJlYWRzIHVuZnJhbWVkLCBmcmFtZWQsIGhlYWRlciBmb3JtYXQsCisgKiBhbmQgaHR0cAorICoKKyAqLworY2xhc3MgVEhlYWRlclByb3RvY29sIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8VEhlYWRlclByb3RvY29sPiB7Citwcm90ZWN0ZWQ6CitwdWJsaWM6CisgIHZvaWQgcmVzZXRQcm90b2NvbCgpOworCisgIGV4cGxpY2l0IFRIZWFkZXJQcm90b2NvbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcHJvdG9JZCA9IFRfQ09NUEFDVF9QUk9UT0NPTCkKKyAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VEhlYWRlclByb3RvY29sPihzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRIZWFkZXJUcmFuc3BvcnQodHJhbnMpKSksCisgICAgICB0cmFuc18oc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUSGVhZGVyVHJhbnNwb3J0PihnZXRUcmFuc3BvcnQoKSkpLAorICAgICAgcHJvdG9JZF8ocHJvdG9JZCkgeworICAgIHRyYW5zXy0+c2V0UHJvdG9jb2xJZChwcm90b0lkKTsKKyAgICByZXNldFByb3RvY29sKCk7CisgIH0KKworICBUSGVhZGVyUHJvdG9jb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiBpblRyYW5zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiBvdXRUcmFucywKKyAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHByb3RvSWQgPSBUX0NPTVBBQ1RfUFJPVE9DT0wpCisgICAgOiBUVmlydHVhbFByb3RvY29sPFRIZWFkZXJQcm90b2NvbD4oCisgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUSGVhZGVyVHJhbnNwb3J0KGluVHJhbnMsIG91dFRyYW5zKSkpLAorICAgICAgdHJhbnNfKHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VEhlYWRlclRyYW5zcG9ydD4oZ2V0VHJhbnNwb3J0KCkpKSwKKyAgICAgIHByb3RvSWRfKHByb3RvSWQpIHsKKyAgICB0cmFuc18tPnNldFByb3RvY29sSWQocHJvdG9JZCk7CisgICAgcmVzZXRQcm90b2NvbCgpOworICB9CisKKyAgflRIZWFkZXJQcm90b2NvbCgpIHt9CisKKyAgLyoqCisgICAqIEZ1bmN0aW9ucyB0byB3b3JrIHdpdGggaGVhZGVycyBieSBjYWxsaW5nIGludG8gVEhlYWRlclRyYW5zcG9ydAorICAgKi8KKyAgdm9pZCBzZXRQcm90b2NvbElkKHVpbnQxNl90IHByb3RvSWQpIHsKKyAgICB0cmFuc18tPnNldFByb3RvY29sSWQocHJvdG9JZCk7CisgICAgcmVzZXRQcm90b2NvbCgpOworICB9CisKKyAgdHlwZWRlZiBUSGVhZGVyVHJhbnNwb3J0OjpTdHJpbmdUb1N0cmluZ01hcCBTdHJpbmdUb1N0cmluZ01hcDsKKworICAvLyB0aGVzZSB3b3JrIHdpdGggd3JpdGUgaGVhZGVycworICB2b2lkIHNldEhlYWRlcihjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICB0cmFuc18tPnNldEhlYWRlcihrZXksIHZhbHVlKTsKKyAgfQorCisgIHZvaWQgY2xlYXJIZWFkZXJzKCkgeyB0cmFuc18tPmNsZWFySGVhZGVycygpOyB9CisKKyAgU3RyaW5nVG9TdHJpbmdNYXAmIGdldFdyaXRlSGVhZGVycygpIHsgcmV0dXJuIHRyYW5zXy0+Z2V0V3JpdGVIZWFkZXJzKCk7IH0KKworICAvLyB0aGVzZSB3b3JrIHdpdGggcmVhZCBoZWFkZXJzCisgIGNvbnN0IFN0cmluZ1RvU3RyaW5nTWFwJiBnZXRIZWFkZXJzKCkgY29uc3QgeyByZXR1cm4gdHJhbnNfLT5nZXRIZWFkZXJzKCk7IH0KKworICAvKioKKyAgICogV3JpdGluZyBmdW5jdGlvbnMuCisgICAqLworCisgIC8qb2wqLyB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxSWQpOworCisgIC8qb2wqLyB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpOworCisgIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwgY29uc3QgaW50MTZfdCBmaWVsZElkKTsKKworICB1aW50MzJfdCB3cml0ZUZpZWxkRW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3AoKTsKKworICB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsIGNvbnN0IFRUeXBlIHZhbFR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOworCisgIHVpbnQzMl90IHdyaXRlTWFwRW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOworCisgIHVpbnQzMl90IHdyaXRlTGlzdEVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOworCisgIHVpbnQzMl90IHdyaXRlU2V0RW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpOworCisgIHVpbnQzMl90IHdyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpOworCisgIHVpbnQzMl90IHdyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKTsKKworICB1aW50MzJfdCB3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCk7CisKKyAgdWludDMyX3Qgd3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1Yik7CisKKyAgdWludDMyX3Qgd3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgdWludDMyX3Qgd3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgLyoqCisgICAqIFJlYWRpbmcgZnVuY3Rpb25zCisgICAqLworCisgIC8qb2wqLyB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLCBpbnQzMl90JiBzZXFJZCk7CisKKyAgLypvbCovIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kKCk7CisKKyAgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKTsKKworICB1aW50MzJfdCByZWFkU3RydWN0RW5kKCk7CisKKyAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpOworCisgIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpOworCisgIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICB1aW50MzJfdCByZWFkTWFwRW5kKCk7CisKKyAgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICB1aW50MzJfdCByZWFkTGlzdEVuZCgpOworCisgIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICB1aW50MzJfdCByZWFkU2V0RW5kKCk7CisKKyAgdWludDMyX3QgcmVhZEJvb2woYm9vbCYgdmFsdWUpOworICAvLyBQcm92aWRlIHRoZSBkZWZhdWx0IHJlYWRCb29sKCkgaW1wbGVtZW50YXRpb24gZm9yIHN0ZDo6dmVjdG9yPGJvb2w+CisgIHVzaW5nIFRWaXJ0dWFsUHJvdG9jb2w8VEhlYWRlclByb3RvY29sPjo6cmVhZEJvb2w7CisKKyAgdWludDMyX3QgcmVhZEJ5dGUoaW50OF90JiBieXRlKTsKKworICB1aW50MzJfdCByZWFkSTE2KGludDE2X3QmIGkxNik7CisKKyAgdWludDMyX3QgcmVhZEkzMihpbnQzMl90JiBpMzIpOworCisgIHVpbnQzMl90IHJlYWRJNjQoaW50NjRfdCYgaTY0KTsKKworICB1aW50MzJfdCByZWFkRG91YmxlKGRvdWJsZSYgZHViKTsKKworICB1aW50MzJfdCByZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIHVpbnQzMl90IHJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIGJpbmFyeSk7CisKK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPFRIZWFkZXJUcmFuc3BvcnQ+IHRyYW5zXzsKKworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b187CisgIHVpbnQzMl90IHByb3RvSWRfOworfTsKKworY2xhc3MgVEhlYWRlclByb3RvY29sRmFjdG9yeSA6IHB1YmxpYyBUUHJvdG9jb2xGYWN0b3J5IHsKK3B1YmxpYzoKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0cmFucykgeworICAgIFRIZWFkZXJQcm90b2NvbCogaGVhZGVyUHJvdG9jb2wKKyAgICAgICAgPSBuZXcgVEhlYWRlclByb3RvY29sKHRyYW5zLCB0cmFucywgVF9CSU5BUllfUFJPVE9DT0wpOworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPihoZWFkZXJQcm90b2NvbCk7CisgIH0KKworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKAorICAgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gaW5UcmFucywKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IG91dFRyYW5zKSB7CisgICAgVEhlYWRlclByb3RvY29sKiBoZWFkZXJQcm90b2NvbCA9IG5ldyBUSGVhZGVyUHJvdG9jb2woaW5UcmFucywgb3V0VHJhbnMsIFRfQklOQVJZX1BST1RPQ09MKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4oaGVhZGVyUHJvdG9jb2wpOworICB9Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworI2VuZGlmIC8vICNpZm5kZWYgVEhSSUZUX1BST1RPQ09MX1RIRUFERVJQUk9UT0NPTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NzZmYTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcHAKQEAgLTAsMCArMSwxMTAwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oPgorCisjaW5jbHVkZSA8Ym9vc3QvbG9jYWxlLmhwcD4KKyNpbmNsdWRlIDxib29zdC9tYXRoL3NwZWNpYWxfZnVuY3Rpb25zL2ZwY2xhc3NpZnkuaHBwPgorI2luY2x1ZGUgPGJvb3N0L21hdGgvc3BlY2lhbF9mdW5jdGlvbnMvc2lnbi5ocHA+CisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bG9jYWxlPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCisvLyBTdGF0aWMgZGF0YQorCitzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTk9iamVjdFN0YXJ0ID0gJ3snOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05PYmplY3RFbmQgPSAnfSc7CitzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkFycmF5U3RhcnQgPSAnWyc7CitzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkFycmF5RW5kID0gJ10nOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05QYWlyU2VwYXJhdG9yID0gJzonOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05FbGVtU2VwYXJhdG9yID0gJywnOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05CYWNrc2xhc2ggPSAnXFwnOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05TdHJpbmdEZWxpbWl0ZXIgPSAnIic7CitzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkVzY2FwZUNoYXIgPSAndSc7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrSlNPTkVzY2FwZVByZWZpeCgiXFx1MDAiKTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtUaHJpZnRWZXJzaW9uMSA9IDE7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVGhyaWZ0TmFuKCJOYU4iKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVGhyaWZ0SW5maW5pdHkoIkluZmluaXR5Iik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1RocmlmdE5lZ2F0aXZlSW5maW5pdHkoIi1JbmZpbml0eSIpOworCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lQm9vbCgidGYiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVCeXRlKCJpOCIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZUkxNigiaTE2Iik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lSTMyKCJpMzIiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVJNjQoImk2NCIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZURvdWJsZSgiZGJsIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lU3RydWN0KCJyZWMiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVTdHJpbmcoInN0ciIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZU1hcCgibWFwIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lTGlzdCgibHN0Iik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lU2V0KCJzZXQiKTsKKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRUeXBlTmFtZUZvclR5cGVJRChUVHlwZSB0eXBlSUQpIHsKKyAgc3dpdGNoICh0eXBlSUQpIHsKKyAgY2FzZSBUX0JPT0w6CisgICAgcmV0dXJuIGtUeXBlTmFtZUJvb2w7CisgIGNhc2UgVF9CWVRFOgorICAgIHJldHVybiBrVHlwZU5hbWVCeXRlOworICBjYXNlIFRfSTE2OgorICAgIHJldHVybiBrVHlwZU5hbWVJMTY7CisgIGNhc2UgVF9JMzI6CisgICAgcmV0dXJuIGtUeXBlTmFtZUkzMjsKKyAgY2FzZSBUX0k2NDoKKyAgICByZXR1cm4ga1R5cGVOYW1lSTY0OworICBjYXNlIFRfRE9VQkxFOgorICAgIHJldHVybiBrVHlwZU5hbWVEb3VibGU7CisgIGNhc2UgVF9TVFJJTkc6CisgICAgcmV0dXJuIGtUeXBlTmFtZVN0cmluZzsKKyAgY2FzZSBUX1NUUlVDVDoKKyAgICByZXR1cm4ga1R5cGVOYW1lU3RydWN0OworICBjYXNlIFRfTUFQOgorICAgIHJldHVybiBrVHlwZU5hbWVNYXA7CisgIGNhc2UgVF9TRVQ6CisgICAgcmV0dXJuIGtUeXBlTmFtZVNldDsKKyAgY2FzZSBUX0xJU1Q6CisgICAgcmV0dXJuIGtUeXBlTmFtZUxpc3Q7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELCAiVW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgfQorfQorCitzdGF0aWMgVFR5cGUgZ2V0VHlwZUlERm9yVHlwZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgVFR5cGUgcmVzdWx0ID0gVF9TVE9QOyAvLyBTZW50aW5lbCB2YWx1ZQorICBpZiAobmFtZS5sZW5ndGgoKSA+IDEpIHsKKyAgICBzd2l0Y2ggKG5hbWVbMF0pIHsKKyAgICBjYXNlICdkJzoKKyAgICAgIHJlc3VsdCA9IFRfRE9VQkxFOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnaSc6CisgICAgICBzd2l0Y2ggKG5hbWVbMV0pIHsKKyAgICAgIGNhc2UgJzgnOgorICAgICAgICByZXN1bHQgPSBUX0JZVEU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnMSc6CisgICAgICAgIHJlc3VsdCA9IFRfSTE2OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJzMnOgorICAgICAgICByZXN1bHQgPSBUX0kzMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICc2JzoKKyAgICAgICAgcmVzdWx0ID0gVF9JNjQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnbCc6CisgICAgICByZXN1bHQgPSBUX0xJU1Q7CisgICAgICBicmVhazsKKyAgICBjYXNlICdtJzoKKyAgICAgIHJlc3VsdCA9IFRfTUFQOworICAgICAgYnJlYWs7CisgICAgY2FzZSAncic6CisgICAgICByZXN1bHQgPSBUX1NUUlVDVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3MnOgorICAgICAgaWYgKG5hbWVbMV0gPT0gJ3QnKSB7CisgICAgICAgIHJlc3VsdCA9IFRfU1RSSU5HOworICAgICAgfSBlbHNlIGlmIChuYW1lWzFdID09ICdlJykgeworICAgICAgICByZXN1bHQgPSBUX1NFVDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3QnOgorICAgICAgcmVzdWx0ID0gVF9CT09MOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChyZXN1bHQgPT0gVF9TVE9QKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELCAiVW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvLyBUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgaGFuZGxpbmcgZm9yIHRoZSBmaXJzdCAweDMwIGNoYXJhY3RlcnMKKy8vICAwIDogZXNjYXBlIHVzaW5nICJcdTAweHgiIG5vdGF0aW9uCisvLyAgMSA6IGp1c3Qgb3V0cHV0IGluZGV4CisvLyA8b3RoZXI+IDogZXNjYXBlIHVzaW5nICJcPG90aGVyPiIgbm90YXRpb24KK3N0YXRpYyBjb25zdCB1aW50OF90IGtKU09OQ2hhclRhYmxlWzB4MzBdID0geworICAgIC8vICAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICAgQSAgIEIgICBDICAgRCAgIEUgICBGCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgICdiJywKKyAgICAndCcsCisgICAgJ24nLAorICAgIDAsCisgICAgJ2YnLAorICAgICdyJywKKyAgICAwLAorICAgIDAsIC8vIDAKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLCAvLyAxCisgICAgMSwKKyAgICAxLAorICAgICciJywKKyAgICAxLAorICAgIDEsCisgICAgMSwKKyAgICAxLAorICAgIDEsCisgICAgMSwKKyAgICAxLAorICAgIDEsCisgICAgMSwKKyAgICAxLAorICAgIDEsCisgICAgMSwKKyAgICAxLCAvLyAyCit9OworCisvLyBUaGlzIHN0cmluZydzIGNoYXJhY3RlcnMgbXVzdCBtYXRjaCB1cCB3aXRoIHRoZSBlbGVtZW50cyBpbiBrRXNjYXBlQ2hhclZhbHMuCisvLyBJIGRvbid0IGhhdmUgJy8nIG9uIHRoaXMgbGlzdCBldmVuIHRob3VnaCBpdCBhcHBlYXJzIG9uIHd3dy5qc29uLm9yZyAtLQorLy8gaXQgaXMgbm90IGluIHRoZSBSRkMKK2NvbnN0IHN0YXRpYyBzdGQ6OnN0cmluZyBrRXNjYXBlQ2hhcnMoIlwiXFxiZm5ydCIpOworCisvLyBUaGUgZWxlbWVudHMgb2YgdGhpcyBhcnJheSBtdXN0IG1hdGNoIHVwIHdpdGggdGhlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgaW4KKy8vIGtFc2NhcGVDaGFycworY29uc3Qgc3RhdGljIHVpbnQ4X3Qga0VzY2FwZUNoYXJWYWxzWzddID0geworICAgICciJywKKyAgICAnXFwnLAorICAgICdcYicsCisgICAgJ1xmJywKKyAgICAnXG4nLAorICAgICdccicsCisgICAgJ1x0JywKK307CisKKy8vIFN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCisKKy8vIFJlYWQgMSBjaGFyYWN0ZXIgZnJvbSB0aGUgdHJhbnNwb3J0IHRyYW5zIGFuZCB2ZXJpZnkgdGhhdCBpdCBpcyB0aGUKKy8vIGV4cGVjdGVkIGNoYXJhY3RlciBjaC4KKy8vIFRocm93IGEgcHJvdG9jb2wgZXhjZXB0aW9uIGlmIGl0IGlzIG5vdC4KK3N0YXRpYyB1aW50MzJfdCByZWFkU3ludGF4Q2hhcihUSlNPTlByb3RvY29sOjpMb29rYWhlYWRSZWFkZXImIHJlYWRlciwgdWludDhfdCBjaCkgeworICB1aW50OF90IGNoMiA9IHJlYWRlci5yZWFkKCk7CisgIGlmIChjaDIgIT0gY2gpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBcJyIgKyBzdGQ6OnN0cmluZygoY2hhciopJmNoLCAxKSArICJcJzsgZ290IFwnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0ZDo6c3RyaW5nKChjaGFyKikmY2gyLCAxKSArICJcJy4iKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gUmV0dXJuIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIGEgaGV4IGNoYXJhY3RlciBjaC4KKy8vIFRocm93IGEgcHJvdG9jb2wgZXhjZXB0aW9uIGlmIHRoZSBjaGFyYWN0ZXIgaXMgbm90IFswLTlhLWZdLgorc3RhdGljIHVpbnQ4X3QgaGV4VmFsKHVpbnQ4X3QgY2gpIHsKKyAgaWYgKChjaCA+PSAnMCcpICYmIChjaCA8PSAnOScpKSB7CisgICAgcmV0dXJuIGNoIC0gJzAnOworICB9IGVsc2UgaWYgKChjaCA+PSAnYScpICYmIChjaCA8PSAnZicpKSB7CisgICAgcmV0dXJuIGNoIC0gJ2EnICsgMTA7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgaGV4IHZhbCAoWzAtOWEtZl0pOyBnb3QgXCciICsgc3RkOjpzdHJpbmcoKGNoYXIqKSZjaCwgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCcuIik7CisgIH0KK30KKworLy8gUmV0dXJuIHRoZSBoZXggY2hhcmFjdGVyIHJlcHJlc2VudGluZyB0aGUgaW50ZWdlciB2YWwuIFRoZSB2YWx1ZSBpcyBtYXNrZWQKKy8vIHRvIG1ha2Ugc3VyZSBpdCBpcyBpbiB0aGUgY29ycmVjdCByYW5nZS4KK3N0YXRpYyB1aW50OF90IGhleENoYXIodWludDhfdCB2YWwpIHsKKyAgdmFsICY9IDB4MEY7CisgIGlmICh2YWwgPCAxMCkgeworICAgIHJldHVybiB2YWwgKyAnMCc7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHZhbCAtIDEwICsgJ2EnOworICB9Cit9CisKKy8vIFJldHVybiB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgY2ggaXMgaW4gWy0rMC05LkVlXTsgZmFsc2Ugb3RoZXJ3aXNlCitzdGF0aWMgYm9vbCBpc0pTT05OdW1lcmljKHVpbnQ4X3QgY2gpIHsKKyAgc3dpdGNoIChjaCkgeworICBjYXNlICcrJzoKKyAgY2FzZSAnLSc6CisgIGNhc2UgJy4nOgorICBjYXNlICcwJzoKKyAgY2FzZSAnMSc6CisgIGNhc2UgJzInOgorICBjYXNlICczJzoKKyAgY2FzZSAnNCc6CisgIGNhc2UgJzUnOgorICBjYXNlICc2JzoKKyAgY2FzZSAnNyc6CisgIGNhc2UgJzgnOgorICBjYXNlICc5JzoKKyAgY2FzZSAnRSc6CisgIGNhc2UgJ2UnOgorICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gUmV0dXJuIHRydWUgaWYgdGhlIGNvZGUgdW5pdCBpcyBoaWdoIHN1cnJvZ2F0ZQorc3RhdGljIGJvb2wgaXNIaWdoU3Vycm9nYXRlKHVpbnQxNl90IHZhbCkgeworICByZXR1cm4gdmFsID49IDB4RDgwMCAmJiB2YWwgPD0gMHhEQkZGOworfQorCisvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29kZSB1bml0IGlzIGxvdyBzdXJyb2dhdGUKK3N0YXRpYyBib29sIGlzTG93U3Vycm9nYXRlKHVpbnQxNl90IHZhbCkgeworICByZXR1cm4gdmFsID49IDB4REMwMCAmJiB2YWwgPD0gMHhERkZGOworfQorCisvKioKKyAqIENsYXNzIHRvIHNlcnZlIGFzIGJhc2UgSlNPTiBjb250ZXh0IGFuZCBhcyBiYXNlIGNsYXNzIGZvciBvdGhlciBjb250ZXh0CisgKiBpbXBsZW1lbnRhdGlvbnMKKyAqLworY2xhc3MgVEpTT05Db250ZXh0IHsKKworcHVibGljOgorICBUSlNPTkNvbnRleHQoKXt9OworCisgIHZpcnR1YWwgflRKU09OQ29udGV4dCgpe307CisKKyAgLyoqCisgICAqIFdyaXRlIGNvbnRleHQgZGF0YSB0byB0aGUgdHJhbnNwb3J0LiBEZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuCisgICAqLworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlKFRUcmFuc3BvcnQmIHRyYW5zKSB7CisgICAgKHZvaWQpdHJhbnM7CisgICAgcmV0dXJuIDA7CisgIH07CisKKyAgLyoqCisgICAqIFJlYWQgY29udGV4dCBkYXRhIGZyb20gdGhlIHRyYW5zcG9ydC4gRGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLgorICAgKi8KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkKFRKU09OUHJvdG9jb2w6Okxvb2thaGVhZFJlYWRlciYgcmVhZGVyKSB7CisgICAgKHZvaWQpcmVhZGVyOworICAgIHJldHVybiAwOworICB9OworCisgIC8qKgorICAgKiBSZXR1cm4gdHJ1ZSBpZiBudW1iZXJzIG5lZWQgdG8gYmUgZXNjYXBlZCBhcyBzdHJpbmdzIGluIHRoaXMgY29udGV4dC4KKyAgICogRGVmYXVsdCBiZWhhdmlvciBpcyB0byByZXR1cm4gZmFsc2UuCisgICAqLworICB2aXJ0dWFsIGJvb2wgZXNjYXBlTnVtKCkgeyByZXR1cm4gZmFsc2U7IH0KK307CisKKy8vIENvbnRleHQgY2xhc3MgZm9yIG9iamVjdCBtZW1iZXIga2V5LXZhbHVlIHBhaXJzCitjbGFzcyBKU09OUGFpckNvbnRleHQgOiBwdWJsaWMgVEpTT05Db250ZXh0IHsKKworcHVibGljOgorICBKU09OUGFpckNvbnRleHQoKSA6IGZpcnN0Xyh0cnVlKSwgY29sb25fKHRydWUpIHt9CisKKyAgdWludDMyX3Qgd3JpdGUoVFRyYW5zcG9ydCYgdHJhbnMpIHsKKyAgICBpZiAoZmlyc3RfKSB7CisgICAgICBmaXJzdF8gPSBmYWxzZTsKKyAgICAgIGNvbG9uXyA9IHRydWU7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgdHJhbnMud3JpdGUoY29sb25fID8gJmtKU09OUGFpclNlcGFyYXRvciA6ICZrSlNPTkVsZW1TZXBhcmF0b3IsIDEpOworICAgICAgY29sb25fID0gIWNvbG9uXzsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIHVpbnQzMl90IHJlYWQoVEpTT05Qcm90b2NvbDo6TG9va2FoZWFkUmVhZGVyJiByZWFkZXIpIHsKKyAgICBpZiAoZmlyc3RfKSB7CisgICAgICBmaXJzdF8gPSBmYWxzZTsKKyAgICAgIGNvbG9uXyA9IHRydWU7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgdWludDhfdCBjaCA9IChjb2xvbl8gPyBrSlNPTlBhaXJTZXBhcmF0b3IgOiBrSlNPTkVsZW1TZXBhcmF0b3IpOworICAgICAgY29sb25fID0gIWNvbG9uXzsKKyAgICAgIHJldHVybiByZWFkU3ludGF4Q2hhcihyZWFkZXIsIGNoKTsKKyAgICB9CisgIH0KKworICAvLyBOdW1iZXJzIG11c3QgYmUgdHVybmVkIGludG8gc3RyaW5ncyBpZiB0aGV5IGFyZSB0aGUga2V5IHBhcnQgb2YgYSBwYWlyCisgIHZpcnR1YWwgYm9vbCBlc2NhcGVOdW0oKSB7IHJldHVybiBjb2xvbl87IH0KKworcHJpdmF0ZToKKyAgYm9vbCBmaXJzdF87CisgIGJvb2wgY29sb25fOworfTsKKworLy8gQ29udGV4dCBjbGFzcyBmb3IgbGlzdHMKK2NsYXNzIEpTT05MaXN0Q29udGV4dCA6IHB1YmxpYyBUSlNPTkNvbnRleHQgeworCitwdWJsaWM6CisgIEpTT05MaXN0Q29udGV4dCgpIDogZmlyc3RfKHRydWUpIHt9CisKKyAgdWludDMyX3Qgd3JpdGUoVFRyYW5zcG9ydCYgdHJhbnMpIHsKKyAgICBpZiAoZmlyc3RfKSB7CisgICAgICBmaXJzdF8gPSBmYWxzZTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICB0cmFucy53cml0ZSgma0pTT05FbGVtU2VwYXJhdG9yLCAxKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIHVpbnQzMl90IHJlYWQoVEpTT05Qcm90b2NvbDo6TG9va2FoZWFkUmVhZGVyJiByZWFkZXIpIHsKKyAgICBpZiAoZmlyc3RfKSB7CisgICAgICBmaXJzdF8gPSBmYWxzZTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gcmVhZFN5bnRheENoYXIocmVhZGVyLCBrSlNPTkVsZW1TZXBhcmF0b3IpOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICBib29sIGZpcnN0XzsKK307CisKK1RKU09OUHJvdG9jb2w6OlRKU09OUHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykKKyAgOiBUVmlydHVhbFByb3RvY29sPFRKU09OUHJvdG9jb2w+KHB0cmFucyksCisgICAgdHJhbnNfKHB0cmFucy5nZXQoKSksCisgICAgY29udGV4dF8obmV3IFRKU09OQ29udGV4dCgpKSwKKyAgICByZWFkZXJfKCpwdHJhbnMpIHsKK30KKworVEpTT05Qcm90b2NvbDo6flRKU09OUHJvdG9jb2woKSB7Cit9CisKK3ZvaWQgVEpTT05Qcm90b2NvbDo6cHVzaENvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gYykgeworICBjb250ZXh0c18ucHVzaChjb250ZXh0Xyk7CisgIGNvbnRleHRfID0gYzsKK30KKwordm9pZCBUSlNPTlByb3RvY29sOjpwb3BDb250ZXh0KCkgeworICBjb250ZXh0XyA9IGNvbnRleHRzXy50b3AoKTsKKyAgY29udGV4dHNfLnBvcCgpOworfQorCisvLyBXcml0ZSB0aGUgY2hhcmFjdGVyIGNoIGFzIGEgSlNPTiBlc2NhcGUgc2VxdWVuY2UgKCJcdTAweHgiKQordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09ORXNjYXBlQ2hhcih1aW50OF90IGNoKSB7CisgIHRyYW5zXy0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QqKWtKU09ORXNjYXBlUHJlZml4LmNfc3RyKCksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGtKU09ORXNjYXBlUHJlZml4Lmxlbmd0aCgpKSk7CisgIHVpbnQ4X3Qgb3V0Q2ggPSBoZXhDaGFyKGNoID4+IDQpOworICB0cmFuc18tPndyaXRlKCZvdXRDaCwgMSk7CisgIG91dENoID0gaGV4Q2hhcihjaCk7CisgIHRyYW5zXy0+d3JpdGUoJm91dENoLCAxKTsKKyAgcmV0dXJuIDY7Cit9CisKKy8vIFdyaXRlIHRoZSBjaGFyYWN0ZXIgY2ggYXMgcGFydCBvZiBhIEpTT04gc3RyaW5nLCBlc2NhcGluZyBhcyBhcHByb3ByaWF0ZS4KK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkNoYXIodWludDhfdCBjaCkgeworICBpZiAoY2ggPj0gMHgzMCkgeworICAgIGlmIChjaCA9PSBrSlNPTkJhY2tzbGFzaCkgeyAvLyBPbmx5IHNwZWNpYWwgY2hhcmFjdGVyID49IDB4MzAgaXMgJ1wnCisgICAgICB0cmFuc18tPndyaXRlKCZrSlNPTkJhY2tzbGFzaCwgMSk7CisgICAgICB0cmFuc18tPndyaXRlKCZrSlNPTkJhY2tzbGFzaCwgMSk7CisgICAgICByZXR1cm4gMjsKKyAgICB9IGVsc2UgeworICAgICAgdHJhbnNfLT53cml0ZSgmY2gsIDEpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9IGVsc2UgeworICAgIHVpbnQ4X3Qgb3V0Q2ggPSBrSlNPTkNoYXJUYWJsZVtjaF07CisgICAgLy8gQ2hlY2sgaWYgcmVndWxhciBjaGFyYWN0ZXIsIGJhY2tzbGFzaCBlc2NhcGVkLCBvciBKU09OIGVzY2FwZWQKKyAgICBpZiAob3V0Q2ggPT0gMSkgeworICAgICAgdHJhbnNfLT53cml0ZSgmY2gsIDEpOworICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIGlmIChvdXRDaCA+IDEpIHsKKyAgICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OQmFja3NsYXNoLCAxKTsKKyAgICAgIHRyYW5zXy0+d3JpdGUoJm91dENoLCAxKTsKKyAgICAgIHJldHVybiAyOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gd3JpdGVKU09ORXNjYXBlQ2hhcihjaCk7CisgICAgfQorICB9Cit9CisKKy8vIFdyaXRlIG91dCB0aGUgY29udGVudHMgb2YgdGhlIHN0cmluZyBzdHIgYXMgYSBKU09OIHN0cmluZywgZXNjYXBpbmcKKy8vIGNoYXJhY3RlcnMgYXMgYXBwcm9wcmlhdGUuCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+d3JpdGUoKnRyYW5zXyk7CisgIHJlc3VsdCArPSAyOyAvLyBGb3IgcXVvdGVzCisgIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKKyAgc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIoc3RyLmJlZ2luKCkpOworICBzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgZW5kKHN0ci5lbmQoKSk7CisgIHdoaWxlIChpdGVyICE9IGVuZCkgeworICAgIHJlc3VsdCArPSB3cml0ZUpTT05DaGFyKCppdGVyKyspOworICB9CisgIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gV3JpdGUgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5nIGFzIEpTT04gc3RyaW5nLCBiYXNlNjQtZW5jb2RpbmcKKy8vIHRoZSBzdHJpbmcncyBjb250ZW50cywgYW5kIGVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05CYXNlNjQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+d3JpdGUoKnRyYW5zXyk7CisgIHJlc3VsdCArPSAyOyAvLyBGb3IgcXVvdGVzCisgIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKKyAgdWludDhfdCBiWzRdOworICBjb25zdCB1aW50OF90KiBieXRlcyA9IChjb25zdCB1aW50OF90KilzdHIuY19zdHIoKTsKKyAgaWYgKHN0ci5sZW5ndGgoKSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICB1aW50MzJfdCBsZW4gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyLmxlbmd0aCgpKTsKKyAgd2hpbGUgKGxlbiA+PSAzKSB7CisgICAgLy8gRW5jb2RlIDMgYnl0ZXMgYXQgYSB0aW1lCisgICAgYmFzZTY0X2VuY29kZShieXRlcywgMywgYik7CisgICAgdHJhbnNfLT53cml0ZShiLCA0KTsKKyAgICByZXN1bHQgKz0gNDsKKyAgICBieXRlcyArPSAzOworICAgIGxlbiAtPSAzOworICB9CisgIGlmIChsZW4pIHsgLy8gSGFuZGxlIHJlbWFpbmRlcgorICAgIGJhc2U2NF9lbmNvZGUoYnl0ZXMsIGxlbiwgYik7CisgICAgdHJhbnNfLT53cml0ZShiLCBsZW4gKyAxKTsKKyAgICByZXN1bHQgKz0gbGVuICsgMTsKKyAgfQorICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIENvbnZlcnQgdGhlIGdpdmVuIGludGVnZXIgdHlwZSB0byBhIEpTT04gbnVtYmVyLCBvciBhIHN0cmluZworLy8gaWYgdGhlIGNvbnRleHQgcmVxdWlyZXMgaXQgKGVnOiBrZXkgaW4gYSBtYXAgcGFpcikuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTnVtYmVyVHlwZT4KK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkludGVnZXIoTnVtYmVyVHlwZSBudW0pIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOworICBzdGQ6OnN0cmluZyB2YWwodG9fc3RyaW5nKG51bSkpOworICBib29sIGVzY2FwZU51bSA9IGNvbnRleHRfLT5lc2NhcGVOdW0oKTsKKyAgaWYgKGVzY2FwZU51bSkgeworICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKKyAgICByZXN1bHQgKz0gMTsKKyAgfQorICBpZiAodmFsLmxlbmd0aCgpID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIHRyYW5zXy0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QqKXZhbC5jX3N0cigpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsLmxlbmd0aCgpKSk7CisgIHJlc3VsdCArPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsLmxlbmd0aCgpKTsKKyAgaWYgKGVzY2FwZU51bSkgeworICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKKyAgICByZXN1bHQgKz0gMTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCituYW1lc3BhY2Ugeworc3RkOjpzdHJpbmcgZG91YmxlVG9TdHJpbmcoZG91YmxlIGQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHN0cjsKKyAgc3RyLmltYnVlKHN0ZDo6bG9jYWxlOjpjbGFzc2ljKCkpOworICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgbWF4X2RpZ2l0czEwID0gMiArIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZGlnaXRzMTA7CisgIHN0ci5wcmVjaXNpb24obWF4X2RpZ2l0czEwKTsKKyAgc3RyIDw8IGQ7CisgIHJldHVybiBzdHIuc3RyKCk7Cit9Cit9CisKKy8vIENvbnZlcnQgdGhlIGdpdmVuIGRvdWJsZSB0byBhIEpTT04gc3RyaW5nLCB3aGljaCBpcyBlaXRoZXIgdGhlIG51bWJlciwKKy8vICJOYU4iIG9yICJJbmZpbml0eSIgb3IgIi1JbmZpbml0eSIuCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05Eb3VibGUoZG91YmxlIG51bSkgeworICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+d3JpdGUoKnRyYW5zXyk7CisgIHN0ZDo6c3RyaW5nIHZhbDsKKworICBib29sIHNwZWNpYWwgPSBmYWxzZTsKKyAgc3dpdGNoIChib29zdDo6bWF0aDo6ZnBjbGFzc2lmeShudW0pKSB7CisgIGNhc2UgRlBfSU5GSU5JVEU6CisgICAgaWYgKGJvb3N0OjptYXRoOjpzaWduYml0KG51bSkpIHsKKyAgICAgIHZhbCA9IGtUaHJpZnROZWdhdGl2ZUluZmluaXR5OworICAgIH0gZWxzZSB7CisgICAgICB2YWwgPSBrVGhyaWZ0SW5maW5pdHk7CisgICAgfQorICAgIHNwZWNpYWwgPSB0cnVlOworICAgIGJyZWFrOworICBjYXNlIEZQX05BTjoKKyAgICB2YWwgPSBrVGhyaWZ0TmFuOworICAgIHNwZWNpYWwgPSB0cnVlOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHZhbCA9IGRvdWJsZVRvU3RyaW5nKG51bSk7CisgICAgYnJlYWs7CisgIH0KKworICBib29sIGVzY2FwZU51bSA9IHNwZWNpYWwgfHwgY29udGV4dF8tPmVzY2FwZU51bSgpOworICBpZiAoZXNjYXBlTnVtKSB7CisgICAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOworICAgIHJlc3VsdCArPSAxOworICB9CisgIGlmICh2YWwubGVuZ3RoKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgdHJhbnNfLT53cml0ZSgoY29uc3QgdWludDhfdCopdmFsLmNfc3RyKCksIHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWwubGVuZ3RoKCkpKTsKKyAgcmVzdWx0ICs9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWwubGVuZ3RoKCkpOworICBpZiAoZXNjYXBlTnVtKSB7CisgICAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOworICAgIHJlc3VsdCArPSAxOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTk9iamVjdFN0YXJ0KCkgeworICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+d3JpdGUoKnRyYW5zXyk7CisgIHRyYW5zXy0+d3JpdGUoJmtKU09OT2JqZWN0U3RhcnQsIDEpOworICBwdXNoQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTlBhaXJDb250ZXh0KCkpKTsKKyAgcmV0dXJuIHJlc3VsdCArIDE7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTk9iamVjdEVuZCgpIHsKKyAgcG9wQ29udGV4dCgpOworICB0cmFuc18tPndyaXRlKCZrSlNPTk9iamVjdEVuZCwgMSk7CisgIHJldHVybiAxOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05BcnJheVN0YXJ0KCkgeworICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+d3JpdGUoKnRyYW5zXyk7CisgIHRyYW5zXy0+d3JpdGUoJmtKU09OQXJyYXlTdGFydCwgMSk7CisgIHB1c2hDb250ZXh0KHN0ZDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+KG5ldyBKU09OTGlzdENvbnRleHQoKSkpOworICByZXR1cm4gcmVzdWx0ICsgMTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OQXJyYXlFbmQoKSB7CisgIHBvcENvbnRleHQoKTsKKyAgdHJhbnNfLT53cml0ZSgma0pTT05BcnJheUVuZCwgMSk7CisgIHJldHVybiAxOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVKU09OQXJyYXlTdGFydCgpOworICByZXN1bHQgKz0gd3JpdGVKU09OSW50ZWdlcihrVGhyaWZ0VmVyc2lvbjEpOworICByZXN1bHQgKz0gd3JpdGVKU09OU3RyaW5nKG5hbWUpOworICByZXN1bHQgKz0gd3JpdGVKU09OSW50ZWdlcihtZXNzYWdlVHlwZSk7CisgIHJlc3VsdCArPSB3cml0ZUpTT05JbnRlZ2VyKHNlcWlkKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVNZXNzYWdlRW5kKCkgeworICByZXR1cm4gd3JpdGVKU09OQXJyYXlFbmQoKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7CisgICh2b2lkKW5hbWU7CisgIHJldHVybiB3cml0ZUpTT05PYmplY3RTdGFydCgpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZVN0cnVjdEVuZCgpIHsKKyAgcmV0dXJuIHdyaXRlSlNPTk9iamVjdEVuZCgpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CisgICh2b2lkKW5hbWU7CisgIHVpbnQzMl90IHJlc3VsdCA9IHdyaXRlSlNPTkludGVnZXIoZmllbGRJZCk7CisgIHJlc3VsdCArPSB3cml0ZUpTT05PYmplY3RTdGFydCgpOworICByZXN1bHQgKz0gd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKGZpZWxkVHlwZSkpOworICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUZpZWxkRW5kKCkgeworICByZXR1cm4gd3JpdGVKU09OT2JqZWN0RW5kKCk7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlRmllbGRTdG9wKCkgeworICByZXR1cm4gMDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgcmVzdWx0ICs9IHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRChrZXlUeXBlKSk7CisgIHJlc3VsdCArPSB3cml0ZUpTT05TdHJpbmcoZ2V0VHlwZU5hbWVGb3JUeXBlSUQodmFsVHlwZSkpOworICByZXN1bHQgKz0gd3JpdGVKU09OSW50ZWdlcigoaW50NjRfdClzaXplKTsKKyAgcmVzdWx0ICs9IHdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlTWFwRW5kKCkgeworICB1aW50MzJfdCByZXN1bHQgPSB3cml0ZUpTT05PYmplY3RFbmQoKTsKKyAgcmVzdWx0ICs9IHdyaXRlSlNPTkFycmF5RW5kKCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgcmVzdWx0ICs9IHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRChlbGVtVHlwZSkpOworICByZXN1bHQgKz0gd3JpdGVKU09OSW50ZWdlcigoaW50NjRfdClzaXplKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVMaXN0RW5kKCkgeworICByZXR1cm4gd3JpdGVKU09OQXJyYXlFbmQoKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICB1aW50MzJfdCByZXN1bHQgPSB3cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgIHJlc3VsdCArPSB3cml0ZUpTT05TdHJpbmcoZ2V0VHlwZU5hbWVGb3JUeXBlSUQoZWxlbVR5cGUpKTsKKyAgcmVzdWx0ICs9IHdyaXRlSlNPTkludGVnZXIoKGludDY0X3Qpc2l6ZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlU2V0RW5kKCkgeworICByZXR1cm4gd3JpdGVKU09OQXJyYXlFbmQoKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpIHsKKyAgcmV0dXJuIHdyaXRlSlNPTkludGVnZXIodmFsdWUpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpIHsKKyAgLy8gd3JpdGVCeXRlKCkgbXVzdCBiZSBoYW5kbGVkIHNwZWNpYWxseSBiZWNhdXNlIHRvX3N0cmluZyBzZWVzCisgIC8vIGludDhfdCBhcyBhIHRleHQgdHlwZSBpbnN0ZWFkIG9mIGFuIGludGVnZXIgdHlwZQorICByZXR1cm4gd3JpdGVKU09OSW50ZWdlcigoaW50MTZfdClieXRlKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKKyAgcmV0dXJuIHdyaXRlSlNPTkludGVnZXIoaTE2KTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKKyAgcmV0dXJuIHdyaXRlSlNPTkludGVnZXIoaTMyKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKKyAgcmV0dXJuIHdyaXRlSlNPTkludGVnZXIoaTY0KTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgeworICByZXR1cm4gd3JpdGVKU09ORG91YmxlKGR1Yik7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIHdyaXRlSlNPTlN0cmluZyhzdHIpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiB3cml0ZUpTT05CYXNlNjQoc3RyKTsKK30KKworLyoqCisgKiBSZWFkaW5nIGZ1bmN0aW9ucworICovCisKKy8vIFJlYWRzIDEgYnl0ZSBhbmQgdmVyaWZpZXMgdGhhdCBpdCBtYXRjaGVzIGNoLgordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05TeW50YXhDaGFyKHVpbnQ4X3QgY2gpIHsKKyAgcmV0dXJuIHJlYWRTeW50YXhDaGFyKHJlYWRlcl8sIGNoKTsKK30KKworLy8gRGVjb2RlcyB0aGUgZm91ciBoZXggcGFydHMgb2YgYSBKU09OIGVzY2FwZWQgc3RyaW5nIGNoYXJhY3RlciBhbmQgcmV0dXJucworLy8gdGhlIFVURi0xNiBjb2RlIHVuaXQgdmlhIG91dC4KK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09ORXNjYXBlQ2hhcih1aW50MTZfdCogb3V0KSB7CisgIHVpbnQ4X3QgYls0XTsKKyAgYlswXSA9IHJlYWRlcl8ucmVhZCgpOworICBiWzFdID0gcmVhZGVyXy5yZWFkKCk7CisgIGJbMl0gPSByZWFkZXJfLnJlYWQoKTsKKyAgYlszXSA9IHJlYWRlcl8ucmVhZCgpOworCisgICpvdXQgPSAoaGV4VmFsKGJbMF0pIDw8IDEyKQorICAgICsgKGhleFZhbChiWzFdKSA8PCA4KSArIChoZXhWYWwoYlsyXSkgPDwgNCkgKyBoZXhWYWwoYlszXSk7CisKKyAgcmV0dXJuIDQ7Cit9CisKKy8vIERlY29kZXMgYSBKU09OIHN0cmluZywgaW5jbHVkaW5nIHVuZXNjYXBpbmcsIGFuZCByZXR1cm5zIHRoZSBzdHJpbmcgdmlhIHN0cgordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05TdHJpbmcoc3RkOjpzdHJpbmcmIHN0ciwgYm9vbCBza2lwQ29udGV4dCkgeworICB1aW50MzJfdCByZXN1bHQgPSAoc2tpcENvbnRleHQgPyAwIDogY29udGV4dF8tPnJlYWQocmVhZGVyXykpOworICByZXN1bHQgKz0gcmVhZEpTT05TeW50YXhDaGFyKGtKU09OU3RyaW5nRGVsaW1pdGVyKTsKKyAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGNvZGV1bml0czsKKyAgdWludDhfdCBjaDsKKyAgc3RyLmNsZWFyKCk7CisgIHdoaWxlICh0cnVlKSB7CisgICAgY2ggPSByZWFkZXJfLnJlYWQoKTsKKyAgICArK3Jlc3VsdDsKKyAgICBpZiAoY2ggPT0ga0pTT05TdHJpbmdEZWxpbWl0ZXIpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoY2ggPT0ga0pTT05CYWNrc2xhc2gpIHsKKyAgICAgIGNoID0gcmVhZGVyXy5yZWFkKCk7CisgICAgICArK3Jlc3VsdDsKKyAgICAgIGlmIChjaCA9PSBrSlNPTkVzY2FwZUNoYXIpIHsKKyAgICAgICAgdWludDE2X3QgY3A7CisgICAgICAgIHJlc3VsdCArPSByZWFkSlNPTkVzY2FwZUNoYXIoJmNwKTsKKyAgICAgICAgaWYgKGlzSGlnaFN1cnJvZ2F0ZShjcCkpIHsKKyAgICAgICAgICBjb2RldW5pdHMucHVzaF9iYWNrKGNwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoaXNMb3dTdXJyb2dhdGUoY3ApCisgICAgICAgICAgICAgICAmJiBjb2RldW5pdHMuZW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIFVURi0xNiBoaWdoIHN1cnJvZ2F0ZSBwYWlyLiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBjb2RldW5pdHMucHVzaF9iYWNrKGNwKTsKKyAgICAgICAgICBjb2RldW5pdHMucHVzaF9iYWNrKDApOworICAgICAgICAgIHN0ciArPSBib29zdDo6bG9jYWxlOjpjb252Ojp1dGZfdG9fdXRmPGNoYXI+KGNvZGV1bml0cy5kYXRhKCkpOworICAgICAgICAgIGNvZGV1bml0cy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2l6ZV90IHBvcyA9IGtFc2NhcGVDaGFycy5maW5kKGNoKTsKKyAgICAgICAgaWYgKHBvcyA9PSBrRXNjYXBlQ2hhcnMubnBvcykgeworICAgICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciwgZ290ICciICsgc3RkOjpzdHJpbmcoKGNvbnN0IGNoYXIqKSZjaCwgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJy4iKTsKKyAgICAgICAgfQorICAgICAgICBjaCA9IGtFc2NhcGVDaGFyVmFsc1twb3NdOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWNvZGV1bml0cy5lbXB0eSgpKSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pc3NpbmcgVVRGLTE2IGxvdyBzdXJyb2dhdGUgcGFpci4iKTsKKyAgICB9CisgICAgc3RyICs9IGNoOworICB9CisKKyAgaWYgKCFjb2RldW5pdHMuZW1wdHkoKSkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pc3NpbmcgVVRGLTE2IGxvdyBzdXJyb2dhdGUgcGFpci4iKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvLyBSZWFkcyBhIGJsb2NrIG9mIGJhc2U2NCBjaGFyYWN0ZXJzLCBkZWNvZGluZyBpdCwgYW5kIHJldHVybnMgdmlhIHN0cgordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05CYXNlNjQoc3RkOjpzdHJpbmcmIHN0cikgeworICBzdGQ6OnN0cmluZyB0bXA7CisgIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OU3RyaW5nKHRtcCk7CisgIHVpbnQ4X3QqIGIgPSAodWludDhfdCopdG1wLmNfc3RyKCk7CisgIGlmICh0bXAubGVuZ3RoKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgdWludDMyX3QgbGVuID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHRtcC5sZW5ndGgoKSk7CisgIHN0ci5jbGVhcigpOworICAvLyBJZ25vcmUgcGFkZGluZworICBpZiAobGVuID49IDIpICB7CisgICAgdWludDMyX3QgYm91bmQgPSBsZW4gLSAyOworICAgIGZvciAodWludDMyX3QgaSA9IGxlbiAtIDE7IGkgPj0gYm91bmQgJiYgYltpXSA9PSAnPSc7IC0taSkgeworICAgICAgLS1sZW47CisgICAgfQorICB9CisgIHdoaWxlIChsZW4gPj0gNCkgeworICAgIGJhc2U2NF9kZWNvZGUoYiwgNCk7CisgICAgc3RyLmFwcGVuZCgoY29uc3QgY2hhciopYiwgMyk7CisgICAgYiArPSA0OworICAgIGxlbiAtPSA0OworICB9CisgIC8vIERvbid0IGRlY29kZSBpZiB3ZSBoaXQgdGhlIGVuZCBvciBnb3QgYSBzaW5nbGUgbGVmdG92ZXIgYnl0ZSAoaW52YWxpZAorICAvLyBiYXNlNjQgYnV0IGxlZ2FsIGZvciBza2lwIG9mIHJlZ3VsYXIgc3RyaW5nIHR5cGUpCisgIGlmIChsZW4gPiAxKSB7CisgICAgYmFzZTY0X2RlY29kZShiLCBsZW4pOworICAgIHN0ci5hcHBlbmQoKGNvbnN0IGNoYXIqKWIsIGxlbiAtIDEpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFJlYWRzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycywgc3RvcHBpbmcgYXQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzIG5vdAorLy8gYSB2YWxpZCBKU09OIG51bWVyaWMgY2hhcmFjdGVyLgordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05OdW1lcmljQ2hhcnMoc3RkOjpzdHJpbmcmIHN0cikgeworICB1aW50MzJfdCByZXN1bHQgPSAwOworICBzdHIuY2xlYXIoKTsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICB1aW50OF90IGNoID0gcmVhZGVyXy5wZWVrKCk7CisgICAgaWYgKCFpc0pTT05OdW1lcmljKGNoKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHJlYWRlcl8ucmVhZCgpOworICAgIHN0ciArPSBjaDsKKyAgICArK3Jlc3VsdDsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCituYW1lc3BhY2UgewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUIGZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHMpIHsKKyAgVCB0OworICBzdGQ6OmlzdHJpbmdzdHJlYW0gc3RyKHMpOworICBzdHIuaW1idWUoc3RkOjpsb2NhbGU6OmNsYXNzaWMoKSk7CisgIHN0ciA+PiB0OworICBpZiAoc3RyLmJhZCgpIHx8ICFzdHIuZW9mKCkpCisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKHMpOworICByZXR1cm4gdDsKK30KK30KKworLy8gUmVhZHMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGFuZCBhc3NlbWJsZXMgdGhlbSBpbnRvIGEgbnVtYmVyLAorLy8gcmV0dXJuaW5nIHRoZW0gdmlhIG51bQordGVtcGxhdGUgPHR5cGVuYW1lIE51bWJlclR5cGU+Cit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkludGVnZXIoTnVtYmVyVHlwZSYgbnVtKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT5yZWFkKHJlYWRlcl8pOworICBpZiAoY29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTlN0cmluZ0RlbGltaXRlcik7CisgIH0KKyAgc3RkOjpzdHJpbmcgc3RyOworICByZXN1bHQgKz0gcmVhZEpTT05OdW1lcmljQ2hhcnMoc3RyKTsKKyAgdHJ5IHsKKyAgICBudW0gPSBmcm9tU3RyaW5nPE51bWJlclR5cGU+KHN0cik7CisgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6cnVudGltZV9lcnJvciYpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBudW1lcmljIHZhbHVlOyBnb3QgXCIiICsgc3RyICsgIlwiIik7CisgIH0KKyAgaWYgKGNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgIHJlc3VsdCArPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05TdHJpbmdEZWxpbWl0ZXIpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFJlYWRzIGEgSlNPTiBudW1iZXIgb3Igc3RyaW5nIGFuZCBpbnRlcnByZXRzIGl0IGFzIGEgZG91YmxlLgordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05Eb3VibGUoZG91YmxlJiBudW0pIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPnJlYWQocmVhZGVyXyk7CisgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgaWYgKHJlYWRlcl8ucGVlaygpID09IGtKU09OU3RyaW5nRGVsaW1pdGVyKSB7CisgICAgcmVzdWx0ICs9IHJlYWRKU09OU3RyaW5nKHN0ciwgdHJ1ZSk7CisgICAgLy8gQ2hlY2sgZm9yIE5hTiwgSW5maW5pdHkgYW5kIC1JbmZpbml0eQorICAgIGlmIChzdHIgPT0ga1RocmlmdE5hbikgeworICAgICAgbnVtID0gSFVHRV9WQUwgLyBIVUdFX1ZBTDsgLy8gZ2VuZXJhdGVzIE5hTgorICAgIH0gZWxzZSBpZiAoc3RyID09IGtUaHJpZnRJbmZpbml0eSkgeworICAgICAgbnVtID0gSFVHRV9WQUw7CisgICAgfSBlbHNlIGlmIChzdHIgPT0ga1RocmlmdE5lZ2F0aXZlSW5maW5pdHkpIHsKKyAgICAgIG51bSA9IC1IVUdFX1ZBTDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFjb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uIC0tIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCisgICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQiKTsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIG51bSA9IGZyb21TdHJpbmc8ZG91YmxlPihzdHIpOworICAgICAgfSBjYXRjaCAoc3RkOjpydW50aW1lX2Vycm9yJiBlKSB7CisgICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiIiArIHN0ciArICJcIiIpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoY29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgLSB3ZSBzaG91bGQgaGF2ZSBoYWQgYSBxdW90ZSBpZiBlc2NhcGVOdW0gPT0gdHJ1ZQorICAgICAgcmVhZEpTT05TeW50YXhDaGFyKGtKU09OU3RyaW5nRGVsaW1pdGVyKTsKKyAgICB9CisgICAgcmVzdWx0ICs9IHJlYWRKU09OTnVtZXJpY0NoYXJzKHN0cik7CisgICAgdHJ5IHsKKyAgICAgIG51bSA9IGZyb21TdHJpbmc8ZG91YmxlPihzdHIpOworICAgIH0gY2F0Y2ggKHN0ZDo6cnVudGltZV9lcnJvciYgZSkgeworICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiIiArIHN0ciArICJcIiIpOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTk9iamVjdFN0YXJ0KCkgeworICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+cmVhZChyZWFkZXJfKTsKKyAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTk9iamVjdFN0YXJ0KTsKKyAgcHVzaENvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4obmV3IEpTT05QYWlyQ29udGV4dCgpKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OT2JqZWN0RW5kKCkgeworICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05PYmplY3RFbmQpOworICBwb3BDb250ZXh0KCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OQXJyYXlTdGFydCgpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPnJlYWQocmVhZGVyXyk7CisgIHJlc3VsdCArPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05BcnJheVN0YXJ0KTsKKyAgcHVzaENvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4obmV3IEpTT05MaXN0Q29udGV4dCgpKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OQXJyYXlFbmQoKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTkFycmF5RW5kKTsKKyAgcG9wQ29udGV4dCgpOworICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCkgeworICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgdWludDY0X3QgdG1wVmFsID0gMDsKKyAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOworICBpZiAodG1wVmFsICE9IGtUaHJpZnRWZXJzaW9uMSkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OLCAiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uIik7CisgIH0KKyAgcmVzdWx0ICs9IHJlYWRKU09OU3RyaW5nKG5hbWUpOworICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7CisgIG1lc3NhZ2VUeXBlID0gKFRNZXNzYWdlVHlwZSl0bXBWYWw7CisgIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKKyAgaWYgKHRtcFZhbCA+IHN0YXRpY19jYXN0PHVpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKSkKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgc2VxaWQgPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0bXBWYWwpOworICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkTWVzc2FnZUVuZCgpIHsKKyAgcmV0dXJuIHJlYWRKU09OQXJyYXlFbmQoKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICh2b2lkKW5hbWU7CisgIHJldHVybiByZWFkSlNPTk9iamVjdFN0YXJ0KCk7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRTdHJ1Y3RFbmQoKSB7CisgIHJldHVybiByZWFkSlNPTk9iamVjdEVuZCgpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVFR5cGUmIGZpZWxkVHlwZSwgaW50MTZfdCYgZmllbGRJZCkgeworICAodm9pZCluYW1lOworICB1aW50MzJfdCByZXN1bHQgPSAwOworICAvLyBDaGVjayBpZiB3ZSBoaXQgdGhlIGVuZCBvZiB0aGUgbGlzdAorICB1aW50OF90IGNoID0gcmVhZGVyXy5wZWVrKCk7CisgIGlmIChjaCA9PSBrSlNPTk9iamVjdEVuZCkgeworICAgIGZpZWxkVHlwZSA9IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVE9QOworICB9IGVsc2UgeworICAgIHVpbnQ2NF90IHRtcFZhbCA9IDA7CisgICAgc3RkOjpzdHJpbmcgdG1wU3RyOworICAgIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKKyAgICBpZiAodG1wVmFsID4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KChzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptYXgpKCkpKQorICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgICAgZmllbGRJZCA9IHN0YXRpY19jYXN0PGludDE2X3Q+KHRtcFZhbCk7CisgICAgcmVzdWx0ICs9IHJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKyAgICByZXN1bHQgKz0gcmVhZEpTT05TdHJpbmcodG1wU3RyKTsKKyAgICBmaWVsZFR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZSh0bXBTdHIpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRGaWVsZEVuZCgpIHsKKyAgcmV0dXJuIHJlYWRKU09OT2JqZWN0RW5kKCk7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgIHVpbnQ2NF90IHRtcFZhbCA9IDA7CisgIHN0ZDo6c3RyaW5nIHRtcFN0cjsKKyAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05BcnJheVN0YXJ0KCk7CisgIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyh0bXBTdHIpOworICBrZXlUeXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUodG1wU3RyKTsKKyAgcmVzdWx0ICs9IHJlYWRKU09OU3RyaW5nKHRtcFN0cik7CisgIHZhbFR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZSh0bXBTdHIpOworICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7CisgIGlmICh0bXBWYWwgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgc2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0bXBWYWwpOworICByZXN1bHQgKz0gcmVhZEpTT05PYmplY3RTdGFydCgpOworICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkTWFwRW5kKCkgeworICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTk9iamVjdEVuZCgpOworICByZXN1bHQgKz0gcmVhZEpTT05BcnJheUVuZCgpOworICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgdWludDY0X3QgdG1wVmFsID0gMDsKKyAgc3RkOjpzdHJpbmcgdG1wU3RyOworICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgcmVzdWx0ICs9IHJlYWRKU09OU3RyaW5nKHRtcFN0cik7CisgIGVsZW1UeXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUodG1wU3RyKTsKKyAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOworICBpZiAodG1wVmFsID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIHNpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odG1wVmFsKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZExpc3RFbmQoKSB7CisgIHJldHVybiByZWFkSlNPTkFycmF5RW5kKCk7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgIHVpbnQ2NF90IHRtcFZhbCA9IDA7CisgIHN0ZDo6c3RyaW5nIHRtcFN0cjsKKyAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05BcnJheVN0YXJ0KCk7CisgIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyh0bXBTdHIpOworICBlbGVtVHlwZSA9IGdldFR5cGVJREZvclR5cGVOYW1lKHRtcFN0cik7CisgIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKKyAgaWYgKHRtcFZhbCA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICBzaXplID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHRtcFZhbCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRTZXRFbmQoKSB7CisgIHJldHVybiByZWFkSlNPTkFycmF5RW5kKCk7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRCb29sKGJvb2wmIHZhbHVlKSB7CisgIHJldHVybiByZWFkSlNPTkludGVnZXIodmFsdWUpOworfQorCisvLyByZWFkQnl0ZSgpIG11c3QgYmUgaGFuZGxlZCBwcm9wZXJseSBiZWNhdXNlIGJvb3N0OjpsZXhpY2FsIGNhc3Qgc2VlcyBpbnQ4X3QKKy8vIGFzIGEgdGV4dCB0eXBlIGluc3RlYWQgb2YgYW4gaW50ZWdlciB0eXBlCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpIHsKKyAgaW50MTZfdCB0bXAgPSAoaW50MTZfdClieXRlOworICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTkludGVnZXIodG1wKTsKKyAgYXNzZXJ0KHRtcCA8IDI1Nik7CisgIGJ5dGUgPSAoaW50OF90KXRtcDsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEkxNihpbnQxNl90JiBpMTYpIHsKKyAgcmV0dXJuIHJlYWRKU09OSW50ZWdlcihpMTYpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSTMyKGludDMyX3QmIGkzMikgeworICByZXR1cm4gcmVhZEpTT05JbnRlZ2VyKGkzMik7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRJNjQoaW50NjRfdCYgaTY0KSB7CisgIHJldHVybiByZWFkSlNPTkludGVnZXIoaTY0KTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZERvdWJsZShkb3VibGUmIGR1YikgeworICByZXR1cm4gcmVhZEpTT05Eb3VibGUoZHViKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiByZWFkSlNPTlN0cmluZyhzdHIpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIHJlYWRKU09OQmFzZTY0KHN0cik7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMyZjg3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmgKQEAgLTAsMCArMSwzMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RKU09OUFJPVE9DT0xfSF8KKyNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9USlNPTlBST1RPQ09MX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmg+CisKKyNpbmNsdWRlIDxzdGFjaz4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb24KK2NsYXNzIFRKU09OQ29udGV4dDsKKworLyoqCisgKiBKU09OIHByb3RvY29sIGZvciBUaHJpZnQuCisgKgorICogSW1wbGVtZW50cyBhIHByb3RvY29sIHdoaWNoIHVzZXMgSlNPTiBhcyB0aGUgd2lyZS1mb3JtYXQuCisgKgorICogVGhyaWZ0IHR5cGVzIGFyZSByZXByZXNlbnRlZCBhcyBkZXNjcmliZWQgYmVsb3c6CisgKgorICogMS4gRXZlcnkgVGhyaWZ0IGludGVnZXIgdHlwZSBpcyByZXByZXNlbnRlZCBhcyBhIEpTT04gbnVtYmVyLgorICoKKyAqIDIuIFRocmlmdCBkb3VibGVzIGFyZSByZXByZXNlbnRlZCBhcyBKU09OIG51bWJlcnMuIFNvbWUgc3BlY2lhbCB2YWx1ZXMgYXJlCisgKiAgICByZXByZXNlbnRlZCBhcyBzdHJpbmdzOgorICogICAgYS4gIk5hTiIgZm9yIG5vdC1hLW51bWJlciB2YWx1ZXMKKyAqICAgIGIuICJJbmZpbml0eSIgZm9yIHBvc2l0aXZlIGluZmluaXR5CisgKiAgICBjLiAiLUluZmluaXR5IiBmb3IgbmVnYXRpdmUgaW5maW5pdHkKKyAqCisgKiAzLiBUaHJpZnQgc3RyaW5nIHZhbHVlcyBhcmUgZW1pdHRlZCBhcyBKU09OIHN0cmluZ3MsIHdpdGggYXBwcm9wcmlhdGUKKyAqICAgIGVzY2FwaW5nLgorICoKKyAqIDQuIFRocmlmdCBiaW5hcnkgdmFsdWVzIGFyZSBlbmNvZGVkIGludG8gQmFzZTY0IGFuZCBlbWl0dGVkIGFzIEpTT04gc3RyaW5ncy4KKyAqICAgIFRoZSByZWFkQmluYXJ5KCkgbWV0aG9kIGlzIHdyaXR0ZW4gc3VjaCB0aGF0IGl0IHdpbGwgcHJvcGVybHkgc2tpcCBpZgorICogICAgY2FsbGVkIG9uIGEgVGhyaWZ0IHN0cmluZyAoYWx0aG91Z2ggaXQgd2lsbCBkZWNvZGUgZ2FyYmFnZSBkYXRhKS4KKyAqCisgKiAgICBOT1RFOiBCYXNlNjQgcGFkZGluZyBpcyBvcHRpb25hbCBmb3IgVGhyaWZ0IGJpbmFyeSB2YWx1ZSBlbmNvZGluZy4gU28KKyAqICAgIHRoZSByZWFkQmluYXJ5KCkgbWV0aG9kIG5lZWRzIHRvIGRlY29kZSBib3RoIGlucHV0IHN0cmluZ3Mgd2l0aCBwYWRkaW5nCisgKiAgICBhbmQgdGhvc2Ugd2l0aG91dCBvbmUuCisgKgorICogNS4gVGhyaWZ0IHN0cnVjdHMgYXJlIHJlcHJlc2VudGVkIGFzIEpTT04gb2JqZWN0cywgd2l0aCB0aGUgZmllbGQgSUQgYXMgdGhlCisgKiAgICBrZXksIGFuZCB0aGUgZmllbGQgdmFsdWUgcmVwcmVzZW50ZWQgYXMgYSBKU09OIG9iamVjdCB3aXRoIGEgc2luZ2xlCisgKiAgICBrZXktdmFsdWUgcGFpci4gVGhlIGtleSBpcyBhIHNob3J0IHN0cmluZyBpZGVudGlmaWVyIGZvciB0aGF0IHR5cGUsCisgKiAgICBmb2xsb3dlZCBieSB0aGUgdmFsdWUuIFRoZSB2YWxpZCB0eXBlIGlkZW50aWZpZXJzIGFyZTogInRmIiBmb3IgYm9vbCwKKyAqICAgICJpOCIgZm9yIGJ5dGUsICJpMTYiIGZvciAxNi1iaXQgaW50ZWdlciwgImkzMiIgZm9yIDMyLWJpdCBpbnRlZ2VyLCAiaTY0IgorICogICAgZm9yIDY0LWJpdCBpbnRlZ2VyLCAiZGJsIiBmb3IgZG91YmxlLXByZWNpc2lvbiBsb2F0aW5nIHBvaW50LCAic3RyIiBmb3IKKyAqICAgIHN0cmluZyAoaW5jbHVkaW5nIGJpbmFyeSksICJyZWMiIGZvciBzdHJ1Y3QgKCJyZWNvcmRzIiksICJtYXAiIGZvciBtYXAsCisgKiAgICAibHN0IiBmb3IgbGlzdCwgInNldCIgZm9yIHNldC4KKyAqCisgKiA2LiBUaHJpZnQgbGlzdHMgYW5kIHNldHMgYXJlIHJlcHJlc2VudGVkIGFzIEpTT04gYXJyYXlzLCB3aXRoIHRoZSBmaXJzdAorICogICAgZWxlbWVudCBvZiB0aGUgSlNPTiBhcnJheSBiZWluZyB0aGUgc3RyaW5nIGlkZW50aWZpZXIgZm9yIHRoZSBUaHJpZnQKKyAqICAgIGVsZW1lbnQgdHlwZSBhbmQgdGhlIHNlY29uZCBlbGVtZW50IG9mIHRoZSBKU09OIGFycmF5IGJlaW5nIHRoZSBjb3VudCBvZgorICogICAgdGhlIFRocmlmdCBlbGVtZW50cy4gVGhlIFRocmlmdCBlbGVtZW50cyB0aGVuIGZvbGxvdy4KKyAqCisgKiA3LiBUaHJpZnQgbWFwcyBhcmUgcmVwcmVzZW50ZWQgYXMgSlNPTiBhcnJheXMsIHdpdGggdGhlIGZpcnN0IHR3byBlbGVtZW50cworICogICAgb2YgdGhlIEpTT04gYXJyYXkgYmVpbmcgdGhlIHN0cmluZyBpZGVudGlmaWVycyBmb3IgdGhlIFRocmlmdCBrZXkgdHlwZQorICogICAgYW5kIHZhbHVlIHR5cGUsIGZvbGxvd2VkIGJ5IHRoZSBjb3VudCBvZiB0aGUgVGhyaWZ0IHBhaXJzLCBmb2xsb3dlZCBieSBhCisgKiAgICBKU09OIG9iamVjdCBjb250YWluaW5nIHRoZSBrZXktdmFsdWUgcGFpcnMuIE5vdGUgdGhhdCBKU09OIGtleXMgY2FuIG9ubHkKKyAqICAgIGJlIHN0cmluZ3MsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGtleSB0eXBlIG9mIHRoZSBUaHJpZnQgbWFwIHNob3VsZCBiZQorICogICAgcmVzdHJpY3RlZCB0byBudW1lcmljIG9yIHN0cmluZyB0eXBlcyAtLSBpbiB0aGUgY2FzZSBvZiBudW1lcmljcywgdGhleQorICogICAgYXJlIHNlcmlhbGl6ZWQgYXMgc3RyaW5ncy4KKyAqCisgKiA4LiBUaHJpZnQgbWVzc2FnZXMgYXJlIHJlcHJlc2VudGVkIGFzIEpTT04gYXJyYXlzLCB3aXRoIHRoZSBwcm90b2NvbAorICogICAgdmVyc2lvbiAjLCB0aGUgbWVzc2FnZSBuYW1lLCB0aGUgbWVzc2FnZSB0eXBlLCBhbmQgdGhlIHNlcXVlbmNlIElEIGFzCisgKiAgICB0aGUgZmlyc3QgNCBlbGVtZW50cy4KKyAqCisgKiBNb3JlIGRpc2N1c3Npb24gb2YgdGhlIGRvdWJsZSBoYW5kbGluZyBpcyBwcm9iYWJseSB3YXJyYW50ZWQuIFRoZSBhaW0gb2YKKyAqIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIHRvIG1hdGNoIGFzIGNsb3NlbHkgYXMgcG9zc2libGUgdGhlIGJlaGF2aW9yCisgKiBvZiBKYXZhJ3MgRG91YmxlLnRvU3RyaW5nKCksIHdoaWNoIGhhcyBubyBwcmVjaXNpb24gbG9zcy4gIEltcGxlbWVudG9ycyBpbgorICogb3RoZXIgbGFuZ3VhZ2VzIHNob3VsZCBzdHJpdmUgdG8gYWNoaWV2ZSB0aGF0IHdoZXJlIHBvc3NpYmxlLiBJIGhhdmUgbm90CisgKiB5ZXQgdmVyaWZpZWQgd2hldGhlciBzdGQ6OmlzdHJpbmdzdHJlYW06Om9wZXJhdG9yPj4sIHdoaWNoIGlzIGRvaW5nIHRoYXQKKyAqIHdvcmsgZm9yIG1lIGluIEMrKywgbG9zZXMgYW55IHByZWNpc2lvbiwgYnV0IEkgYW0gbGVhdmluZyB0aGlzIGFzIGEgZnV0dXJlCisgKiBpbXByb3ZlbWVudC4gSSBtYXkgdHJ5IHRvIHByb3ZpZGUgYSBDIGNvbXBvbmVudCBmb3IgdGhpcywgc28gdGhhdCBvdGhlcgorICogbGFuZ3VhZ2VzIGNvdWxkIGJpbmQgdG8gdGhlIHNhbWUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBmb3IgbWF4aW11bQorICogY29uc2lzdGVuY3kuCisgKgorICovCitjbGFzcyBUSlNPTlByb3RvY29sIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8VEpTT05Qcm90b2NvbD4geworcHVibGljOgorICBUSlNPTlByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpOworCisgIH5USlNPTlByb3RvY29sKCk7CisKK3ByaXZhdGU6CisgIHZvaWQgcHVzaENvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gYyk7CisKKyAgdm9pZCBwb3BDb250ZXh0KCk7CisKKyAgdWludDMyX3Qgd3JpdGVKU09ORXNjYXBlQ2hhcih1aW50OF90IGNoKTsKKworICB1aW50MzJfdCB3cml0ZUpTT05DaGFyKHVpbnQ4X3QgY2gpOworCisgIHVpbnQzMl90IHdyaXRlSlNPTlN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworICB1aW50MzJfdCB3cml0ZUpTT05CYXNlNjQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE51bWJlclR5cGU+CisgIHVpbnQzMl90IHdyaXRlSlNPTkludGVnZXIoTnVtYmVyVHlwZSBudW0pOworCisgIHVpbnQzMl90IHdyaXRlSlNPTkRvdWJsZShkb3VibGUgbnVtKTsKKworICB1aW50MzJfdCB3cml0ZUpTT05PYmplY3RTdGFydCgpOworCisgIHVpbnQzMl90IHdyaXRlSlNPTk9iamVjdEVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKworICB1aW50MzJfdCB3cml0ZUpTT05BcnJheUVuZCgpOworCisgIHVpbnQzMl90IHJlYWRKU09OU3ludGF4Q2hhcih1aW50OF90IGNoKTsKKworICB1aW50MzJfdCByZWFkSlNPTkVzY2FwZUNoYXIodWludDE2X3QqIG91dCk7CisKKyAgdWludDMyX3QgcmVhZEpTT05TdHJpbmcoc3RkOjpzdHJpbmcmIHN0ciwgYm9vbCBza2lwQ29udGV4dCA9IGZhbHNlKTsKKworICB1aW50MzJfdCByZWFkSlNPTkJhc2U2NChzdGQ6OnN0cmluZyYgc3RyKTsKKworICB1aW50MzJfdCByZWFkSlNPTk51bWVyaWNDaGFycyhzdGQ6OnN0cmluZyYgc3RyKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTnVtYmVyVHlwZT4KKyAgdWludDMyX3QgcmVhZEpTT05JbnRlZ2VyKE51bWJlclR5cGUmIG51bSk7CisKKyAgdWludDMyX3QgcmVhZEpTT05Eb3VibGUoZG91YmxlJiBudW0pOworCisgIHVpbnQzMl90IHJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKworICB1aW50MzJfdCByZWFkSlNPTk9iamVjdEVuZCgpOworCisgIHVpbnQzMl90IHJlYWRKU09OQXJyYXlTdGFydCgpOworCisgIHVpbnQzMl90IHJlYWRKU09OQXJyYXlFbmQoKTsKKworcHVibGljOgorICAvKioKKyAgICogV3JpdGluZyBmdW5jdGlvbnMuCisgICAqLworCisgIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpOworCisgIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSk7CisKKyAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgVFR5cGUgZmllbGRUeXBlLCBjb25zdCBpbnQxNl90IGZpZWxkSWQpOworCisgIHVpbnQzMl90IHdyaXRlRmllbGRFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcCgpOworCisgIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwgY29uc3QgVFR5cGUgdmFsVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVNYXBFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVTZXRFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKTsKKworICB1aW50MzJfdCB3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNik7CisKKyAgdWludDMyX3Qgd3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpOworCisgIHVpbnQzMl90IHdyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KTsKKworICB1aW50MzJfdCB3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKTsKKworICB1aW50MzJfdCB3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworICB1aW50MzJfdCB3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworICAvKioKKyAgICogUmVhZGluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwgaW50MzJfdCYgc2VxaWQpOworCisgIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kKCk7CisKKyAgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKTsKKworICB1aW50MzJfdCByZWFkU3RydWN0RW5kKCk7CisKKyAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpOworCisgIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpOworCisgIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICB1aW50MzJfdCByZWFkTWFwRW5kKCk7CisKKyAgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICB1aW50MzJfdCByZWFkTGlzdEVuZCgpOworCisgIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICB1aW50MzJfdCByZWFkU2V0RW5kKCk7CisKKyAgdWludDMyX3QgcmVhZEJvb2woYm9vbCYgdmFsdWUpOworCisgIC8vIFByb3ZpZGUgdGhlIGRlZmF1bHQgcmVhZEJvb2woKSBpbXBsZW1lbnRhdGlvbiBmb3Igc3RkOjp2ZWN0b3I8Ym9vbD4KKyAgdXNpbmcgVFZpcnR1YWxQcm90b2NvbDxUSlNPTlByb3RvY29sPjo6cmVhZEJvb2w7CisKKyAgdWludDMyX3QgcmVhZEJ5dGUoaW50OF90JiBieXRlKTsKKworICB1aW50MzJfdCByZWFkSTE2KGludDE2X3QmIGkxNik7CisKKyAgdWludDMyX3QgcmVhZEkzMihpbnQzMl90JiBpMzIpOworCisgIHVpbnQzMl90IHJlYWRJNjQoaW50NjRfdCYgaTY0KTsKKworICB1aW50MzJfdCByZWFkRG91YmxlKGRvdWJsZSYgZHViKTsKKworICB1aW50MzJfdCByZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIHVpbnQzMl90IHJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgY2xhc3MgTG9va2FoZWFkUmVhZGVyIHsKKworICBwdWJsaWM6CisgICAgTG9va2FoZWFkUmVhZGVyKFRUcmFuc3BvcnQmIHRyYW5zKSA6IHRyYW5zXygmdHJhbnMpLCBoYXNEYXRhXyhmYWxzZSkge30KKworICAgIHVpbnQ4X3QgcmVhZCgpIHsKKyAgICAgIGlmIChoYXNEYXRhXykgeworICAgICAgICBoYXNEYXRhXyA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdHJhbnNfLT5yZWFkQWxsKCZkYXRhXywgMSk7CisgICAgICB9CisgICAgICByZXR1cm4gZGF0YV87CisgICAgfQorCisgICAgdWludDhfdCBwZWVrKCkgeworICAgICAgaWYgKCFoYXNEYXRhXykgeworICAgICAgICB0cmFuc18tPnJlYWRBbGwoJmRhdGFfLCAxKTsKKyAgICAgIH0KKyAgICAgIGhhc0RhdGFfID0gdHJ1ZTsKKyAgICAgIHJldHVybiBkYXRhXzsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBUVHJhbnNwb3J0KiB0cmFuc187CisgICAgYm9vbCBoYXNEYXRhXzsKKyAgICB1aW50OF90IGRhdGFfOworICB9OworCitwcml2YXRlOgorICBUVHJhbnNwb3J0KiB0cmFuc187CisKKyAgc3RkOjpzdGFjazxzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PiA+IGNvbnRleHRzXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gY29udGV4dF87CisgIExvb2thaGVhZFJlYWRlciByZWFkZXJfOworfTsKKworLyoqCisgKiBDb25zdHJ1Y3RzIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2wgb2JqZWN0cyBnaXZlbiB0cmFuc3BvcnRzLgorICovCitjbGFzcyBUSlNPTlByb3RvY29sRmFjdG9yeSA6IHB1YmxpYyBUUHJvdG9jb2xGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVEpTT05Qcm90b2NvbEZhY3RvcnkoKSB7fQorCisgIHZpcnR1YWwgflRKU09OUHJvdG9jb2xGYWN0b3J5KCkge30KKworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4obmV3IFRKU09OUHJvdG9jb2wodHJhbnMpKTsKKyAgfQorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCisKKy8vIFRPRE8oZHJlaXNzKTogTW92ZSBwYXJ0IG9mIFRocmlmdEpTT05TdHJpbmcgaW50byBhIC5jcHAgZmlsZSBhbmQgcmVtb3ZlIHRoaXMuCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGhyaWZ0U3RydWN0Pgorc3RkOjpzdHJpbmcgVGhyaWZ0SlNPTlN0cmluZyhjb25zdCBUaHJpZnRTdHJ1Y3QmIHRzKSB7CisgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OworICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOworICBUTWVtb3J5QnVmZmVyKiBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKGJ1ZmZlcik7CisgIFRKU09OUHJvdG9jb2wgcHJvdG9jb2wodHJhbnMpOworCisgIHRzLndyaXRlKCZwcm90b2NvbCk7CisKKyAgdWludDhfdCogYnVmOworICB1aW50MzJfdCBzaXplOworICBidWZmZXItPmdldEJ1ZmZlcigmYnVmLCAmc2l6ZSk7CisgIHJldHVybiBzdGQ6OnN0cmluZygoY2hhciopYnVmLCAodW5zaWduZWQgaW50KXNpemUpOworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdAorCisjZW5kaWYgLy8gI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RKU09OUFJPVE9DT0xfSF8gMQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBkYzY5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcHAKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb2Nlc3Nvci9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgewordWludDMyX3QgVE11bHRpcGxleGVkUHJvdG9jb2w6OndyaXRlTWVzc2FnZUJlZ2luX3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBfc2VxaWQpIHsKKyAgaWYgKF90eXBlID09IFRfQ0FMTCB8fCBfdHlwZSA9PSBUX09ORVdBWSkgeworICAgIHJldHVybiBUUHJvdG9jb2xEZWNvcmF0b3I6OndyaXRlTWVzc2FnZUJlZ2luX3ZpcnQoc2VydmljZU5hbWUgKyBzZXBhcmF0b3IgKyBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlcWlkKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gVFByb3RvY29sRGVjb3JhdG9yOjp3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KF9uYW1lLCBfdHlwZSwgX3NlcWlkKTsKKyAgfQorfQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGJkODJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9UTVVMVElQTEVYRURQUk9UT0NPTF9IXworI2RlZmluZSBUSFJJRlRfVE1VTFRJUExFWEVEUFJPVE9DT0xfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworLyoqCisgKiA8Y29kZT5UTXVsdGlwbGV4ZWRQcm90b2NvbDwvY29kZT4gaXMgYSBwcm90b2NvbC1pbmRlcGVuZGVudCBjb25jcmV0ZSBkZWNvcmF0b3IKKyAqIHRoYXQgYWxsb3dzIGEgVGhyaWZ0IGNsaWVudCB0byBjb21tdW5pY2F0ZSB3aXRoIGEgbXVsdGlwbGV4aW5nIFRocmlmdCBzZXJ2ZXIsCisgKiBieSBwcmVwZW5kaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUgZHVyaW5nIGZ1bmN0aW9uIGNhbGxzLgorICoKKyAqIFxub3RlIFRISVMgSVMgTk9UIFVTRUQgQlkgU0VSVkVSUy4gIE9uIHRoZSBzZXJ2ZXIsIHVzZQorICoge0BsaW5rIGFwYWNoZTo6dGhyaWZ0OjpUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgVE11bHRpcGxleGVkUHJvY2Vzc29yfSB0byBoYW5kbGUgcmVxdWVzdHMKKyAqIGZyb20gYSBtdWx0aXBsZXhpbmcgY2xpZW50LgorICoKKyAqIFRoaXMgZXhhbXBsZSB1c2VzIGEgc2luZ2xlIHNvY2tldCB0cmFuc3BvcnQgdG8gaW52b2tlIHR3byBzZXJ2aWNlczoKKyAqCisgKiA8YmxvY2txdW90ZT48Y29kZT4KKyAqICAgICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHRyYW5zcG9ydChuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCkpOworICogICAgIHRyYW5zcG9ydC0+b3BlbigpOworICoKKyAqICAgICBzaGFyZWRfcHRyPFRCaW5hcnlQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAqCisgKiAgICAgc2hhcmVkX3B0cjxUTXVsdGlwbGV4ZWRQcm90b2NvbD4gbXAxKG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIkNhbGN1bGF0b3IiKSk7CisgKiAgICAgc2hhcmVkX3B0cjxDYWxjdWxhdG9yQ2xpZW50PiBzZXJ2aWNlMShuZXcgQ2FsY3VsYXRvckNsaWVudChtcDEpKTsKKyAqCisgKiAgICAgc2hhcmVkX3B0cjxUTXVsdGlwbGV4ZWRQcm90b2NvbD4gbXAyKG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIldlYXRoZXJSZXBvcnQiKSk7CisgKiAgICAgc2hhcmVkX3B0cjxXZWF0aGVyUmVwb3J0Q2xpZW50PiBzZXJ2aWNlMihuZXcgV2VhdGhlclJlcG9ydENsaWVudChtcDIpKTsKKyAqCisgKiAgICAgc2VydmljZTEtPmFkZCgyLDIpOworICogICAgIGludCB0ZW1wID0gc2VydmljZTItPmdldFRlbXBlcmF0dXJlKCk7CisgKiA8L2NvZGU+PC9ibG9ja3F1b3RlPgorICoKKyAqIEBzZWUgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xEZWNvcmF0b3IKKyAqLworY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2wgOiBwdWJsaWMgVFByb3RvY29sRGVjb3JhdG9yIHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIFdyYXAgdGhlIHNwZWNpZmllZCBwcm90b2NvbCwgYWxsb3dpbmcgaXQgdG8gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGEKKyAgICogbXVsdGlwbGV4aW5nIHNlcnZlci4gIFRoZSA8Y29kZT5zZXJ2aWNlTmFtZTwvY29kZT4gaXMgcmVxdWlyZWQgYXMgaXQgaXMKKyAgICogcHJlcGVuZGVkIHRvIHRoZSBtZXNzYWdlIGhlYWRlciBzbyB0aGF0IHRoZSBtdWx0aXBsZXhpbmcgc2VydmVyIGNhbiBicm9rZXIKKyAgICogdGhlIGZ1bmN0aW9uIGNhbGwgdG8gdGhlIHByb3BlciBzZXJ2aWNlLgorICAgKgorICAgKiBccGFyYW0gX3Byb3RvY29sICAgIFlvdXIgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBvZiBjaG9pY2UsIGUuZy4gPGNvZGU+VEJpbmFyeVByb3RvY29sPC9jb2RlPi4KKyAgICogXHBhcmFtIF9zZXJ2aWNlTmFtZSBUaGUgc2VydmljZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGNvbW11bmljYXRpbmcgdmlhIHRoaXMgcHJvdG9jb2wuCisgICAqLworICBUTXVsdGlwbGV4ZWRQcm90b2NvbChzaGFyZWRfcHRyPFRQcm90b2NvbD4gX3Byb3RvY29sLCBjb25zdCBzdGQ6OnN0cmluZyYgX3NlcnZpY2VOYW1lKQorICAgIDogVFByb3RvY29sRGVjb3JhdG9yKF9wcm90b2NvbCksIHNlcnZpY2VOYW1lKF9zZXJ2aWNlTmFtZSksIHNlcGFyYXRvcigiOiIpIHt9CisgIHZpcnR1YWwgflRNdWx0aXBsZXhlZFByb3RvY29sKCkge30KKworICAvKioKKyAgICogUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IFRNdWx0aXBsZXhlZFByb3RvY29sOjpTRVBBUkFUT1IuCisgICAqCisgICAqIFxwYXJhbSBbaW5dIF9uYW1lICAgVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBiZSBjYWxsZWQgaW4gdGhlIHNlcnZpY2UuCisgICAqIFxwYXJhbSBbaW5dIF90eXBlICAgVGhlIHR5cGUgb2YgbWVzc2FnZQorICAgKiBccGFyYW0gW2luXSBfbmFtZSAgIFRoZSBzZXF1ZW50aWFsIGlkIG9mIHRoZSBtZXNzYWdlCisgICAqCisgICAqIFx0aHJvd3MgVEV4Y2VwdGlvbiAgUGFzc2VkIHRocm91Z2ggZnJvbSB3cmFwcGVkIDxjb2RlPlRQcm90b2NvbDwvY29kZT4gaW5zdGFuY2UuCisgICAqLworICB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBfc2VxaWQpOworCitwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyBzZXJ2aWNlTmFtZTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgc2VwYXJhdG9yOworfTsKK30KK30KK30KKworI2VuZGlmIC8vIFRIUklGVF9UTVVMVElQTEVYRURQUk9UT0NPTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzc4YWNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5jcHAKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKworVFByb3RvY29sOjp+VFByb3RvY29sKCkge30KK3VpbnQzMl90IFRQcm90b2NvbDo6c2tpcF92aXJ0KFRUeXBlIHR5cGUpIHsKKyAgcmV0dXJuIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpza2lwKCp0aGlzLCB0eXBlKTsKK30KKworVFByb3RvY29sRmFjdG9yeTo6flRQcm90b2NvbEZhY3RvcnkoKSB7fQorCit9fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJjNjgxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaApAQCAtMCwwICsxLDc2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MX0hfCisjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MX0hfIDEKKworI2lmZGVmIF9XSU4zMgorLy8gTmVlZCB0byBjb21lIGJlZm9yZSBhbnkgV2luZG93cy5oIGluY2x1ZGVzCisjaW5jbHVkZSA8V2luc29jazIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjbGltaXRzPgorCisvLyBVc2UgdGhpcyB0byBnZXQgYXJvdW5kIHN0cmljdCBhbGlhc2luZyBydWxlcy4KKy8vIEZvciBleGFtcGxlLCB1aW50NjRfdCBpID0gYml0d2lzZV9jYXN0PHVpbnQ2NF90PihyZXR1cm5zX2RvdWJsZSgpKTsKKy8vIFRoZSBtb3N0IG9idmlvdXMgaW1wbGVtZW50YXRpb24gaXMgdG8ganVzdCBjYXN0IGEgcG9pbnRlciwKKy8vIGJ1dCB0aGF0IGRvZXNuJ3Qgd29yay4KKy8vIEZvciBhIHByZXR0eSBpbi1kZXB0aCBleHBsYW5hdGlvbiBvZiB0aGUgcHJvYmxlbSwgc2VlCisvLyBodHRwOi8vY2VsbHBlcmZvcm1hbmNlLmJleW9uZDNkLmNvbS9hcnRpY2xlcy8yMDA2LzA2L3VuZGVyc3RhbmRpbmctc3RyaWN0LWFsaWFzaW5nLmh0bWwKK3RlbXBsYXRlIDx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4KK3N0YXRpYyBpbmxpbmUgVG8gYml0d2lzZV9jYXN0KEZyb20gZnJvbSkgeworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihGcm9tKSA9PSBzaXplb2YoVG8pLCAic2l6ZW9mKEZyb20pID09IHNpemVvZihUbykiKTsKKworICAvLyBCQUQhISEgIFRoZXNlIGFyZSBhbGwgYnJva2VuIHdpdGggLU8yLgorICAvL3JldHVybiAqcmVpbnRlcnByZXRfY2FzdDxUbyo+KCZmcm9tKTsgIC8vIEJBRCEhIQorICAvL3JldHVybiAqc3RhdGljX2Nhc3Q8VG8qPihzdGF0aWNfY2FzdDx2b2lkKj4oJmZyb20pKTsgIC8vIEJBRCEhIQorICAvL3JldHVybiAqKFRvKikodm9pZCopJmZyb207ICAvLyBCQUQhISEKKworICAvLyBTdXBlciBjbGVhbiBhbmQgcGFyaXRhbGx5IGJsZXNzZWQgYnkgc2VjdGlvbiAzLjkgb2YgdGhlIHN0YW5kYXJkLgorICAvL3Vuc2lnbmVkIGNoYXIgY1tzaXplb2YoZnJvbSldOworICAvL21lbWNweShjLCAmZnJvbSwgc2l6ZW9mKGZyb20pKTsKKyAgLy9UbyB0bzsKKyAgLy9tZW1jcHkoJnRvLCBjLCBzaXplb2YoYykpOworICAvL3JldHVybiB0bzsKKworICAvLyBTbGlnaHRseSBtb3JlIHF1ZXN0aW9uYWJsZS4KKyAgLy8gU2FtZSBjb2RlIGVtaXR0ZWQgYnkgR0NDLgorICAvL1RvIHRvOworICAvL21lbWNweSgmdG8sICZmcm9tLCBzaXplb2YoZnJvbSkpOworICAvL3JldHVybiB0bzsKKworICAvLyBUZWNobmljYWxseSB1bmRlZmluZWQsIGJ1dCBhbG1vc3QgdW5pdmVyc2FsbHkgc3VwcG9ydGVkLAorICAvLyBhbmQgdGhlIG1vc3QgZWZmaWNpZW50IGltcGxlbWVudGF0aW9uLgorICB1bmlvbiB7CisgICAgRnJvbSBmOworICAgIFRvIHQ7CisgIH0gdTsKKyAgdS5mID0gZnJvbTsKKyAgcmV0dXJuIHUudDsKK30KKworCisjaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX19USFJJRlRfQllURV9PUkRFUgorIyBpZiBkZWZpbmVkKEJZVEVfT1JERVIpICYmIGRlZmluZWQoTElUVExFX0VORElBTikgJiYgZGVmaW5lZChCSUdfRU5ESUFOKQorIyAgZGVmaW5lIF9fVEhSSUZUX0JZVEVfT1JERVIgQllURV9PUkRFUgorIyAgZGVmaW5lIF9fVEhSSUZUX0xJVFRMRV9FTkRJQU4gTElUVExFX0VORElBTgorIyAgZGVmaW5lIF9fVEhSSUZUX0JJR19FTkRJQU4gQklHX0VORElBTgorIyBlbHNlCisjICBpbmNsdWRlIDxib29zdC9jb25maWcuaHBwPgorIyAgaW5jbHVkZSA8Ym9vc3QvZGV0YWlsL2VuZGlhbi5ocHA+CisjICBkZWZpbmUgX19USFJJRlRfQllURV9PUkRFUiBCT09TVF9CWVRFX09SREVSCisjICBpZmRlZiBCT09TVF9MSVRUTEVfRU5ESUFOCisjICAgZGVmaW5lIF9fVEhSSUZUX0xJVFRMRV9FTkRJQU4gX19USFJJRlRfQllURV9PUkRFUgorIyAgIGRlZmluZSBfX1RIUklGVF9CSUdfRU5ESUFOIDAKKyMgIGVsc2UKKyMgICBkZWZpbmUgX19USFJJRlRfTElUVExFX0VORElBTiAwCisjICAgZGVmaW5lIF9fVEhSSUZUX0JJR19FTkRJQU4gX19USFJJRlRfQllURV9PUkRFUgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgX19USFJJRlRfQllURV9PUkRFUiA9PSBfX1RIUklGVF9CSUdfRU5ESUFOCisjIGlmICFkZWZpbmVkKFRIUklGVF9udG9obGwpCisjICBkZWZpbmUgVEhSSUZUX250b2hsbChuKSAobikKKyMgIGRlZmluZSBUSFJJRlRfaHRvbmxsKG4pIChuKQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fR0xJQkNfXykKKyMgIGluY2x1ZGUgPGJ5dGVzd2FwLmg+CisjICBkZWZpbmUgVEhSSUZUX2h0b2xlbGwobikgYnN3YXBfNjQobikKKyMgIGRlZmluZSBUSFJJRlRfbGV0b2hsbChuKSBic3dhcF82NChuKQorIyAgZGVmaW5lIFRIUklGVF9odG9sZWwobikgYnN3YXBfMzIobikKKyMgIGRlZmluZSBUSFJJRlRfbGV0b2hsKG4pIGJzd2FwXzMyKG4pCisjICBkZWZpbmUgVEhSSUZUX2h0b2xlcyhuKSBic3dhcF8xNihuKQorIyAgZGVmaW5lIFRIUklGVF9sZXRvaHMobikgYnN3YXBfMTYobikKKyMgZWxzZSAvKiBHTlVDICYgR0xJQkMgKi8KKyMgIGRlZmluZSBic3dhcF82NChuKSBcCisgICAgICAoICgoKG4pICYgMHhmZjAwMDAwMDAwMDAwMDAwdWxsKSA+PiA1NikgXAorICAgICAgfCAoKChuKSAmIDB4MDBmZjAwMDAwMDAwMDAwMHVsbCkgPj4gNDApIFwKKyAgICAgIHwgKCgobikgJiAweDAwMDBmZjAwMDAwMDAwMDB1bGwpID4+IDI0KSBcCisgICAgICB8ICgoKG4pICYgMHgwMDAwMDBmZjAwMDAwMDAwdWxsKSA+PiA4KSAgXAorICAgICAgfCAoKChuKSAmIDB4MDAwMDAwMDBmZjAwMDAwMHVsbCkgPDwgOCkgIFwKKyAgICAgIHwgKCgobikgJiAweDAwMDAwMDAwMDBmZjAwMDB1bGwpIDw8IDI0KSBcCisgICAgICB8ICgoKG4pICYgMHgwMDAwMDAwMDAwMDBmZjAwdWxsKSA8PCA0MCkgXAorICAgICAgfCAoKChuKSAmIDB4MDAwMDAwMDAwMDAwMDBmZnVsbCkgPDwgNTYpICkKKyMgIGRlZmluZSBic3dhcF8zMihuKSBcCisgICAgICAoICgoKG4pICYgMHhmZjAwMDAwMHVsKSA+PiAyNCkgXAorICAgICAgfCAoKChuKSAmIDB4MDBmZjAwMDB1bCkgPj4gOCkgIFwKKyAgICAgIHwgKCgobikgJiAweDAwMDBmZjAwdWwpIDw8IDgpICBcCisgICAgICB8ICgoKG4pICYgMHgwMDAwMDBmZnVsKSA8PCAyNCkgKQorIyAgZGVmaW5lIGJzd2FwXzE2KG4pIFwKKyAgICAgICggKCgobikgJiAoKHVuc2lnbmVkIHNob3J0KTB4ZmYwMHVsKSkgPj4gOCkgIFwKKyAgICAgIHwgKCgobikgJiAoKHVuc2lnbmVkIHNob3J0KTB4MDBmZnVsKSkgPDwgOCkgICkKKyMgIGRlZmluZSBUSFJJRlRfaHRvbGVsbChuKSBic3dhcF82NChuKQorIyAgZGVmaW5lIFRIUklGVF9sZXRvaGxsKG4pIGJzd2FwXzY0KG4pCisjICBkZWZpbmUgVEhSSUZUX2h0b2xlbChuKSBic3dhcF8zMihuKQorIyAgZGVmaW5lIFRIUklGVF9sZXRvaGwobikgYnN3YXBfMzIobikKKyMgIGRlZmluZSBUSFJJRlRfaHRvbGVzKG4pIGJzd2FwXzE2KG4pCisjICBkZWZpbmUgVEhSSUZUX2xldG9ocyhuKSBic3dhcF8xNihuKQorIyBlbmRpZiAvKiBHTlVDICYgR0xJQkMgKi8KKyNlbGlmIF9fVEhSSUZUX0JZVEVfT1JERVIgPT0gX19USFJJRlRfTElUVExFX0VORElBTgorIyAgZGVmaW5lIFRIUklGVF9odG9sZWxsKG4pIChuKQorIyAgZGVmaW5lIFRIUklGVF9sZXRvaGxsKG4pIChuKQorIyAgZGVmaW5lIFRIUklGVF9odG9sZWwobikgKG4pCisjICBkZWZpbmUgVEhSSUZUX2xldG9obChuKSAobikKKyMgIGRlZmluZSBUSFJJRlRfaHRvbGVzKG4pIChuKQorIyAgZGVmaW5lIFRIUklGVF9sZXRvaHMobikgKG4pCisjIGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTElCQ19fKQorIyAgaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyMgIGRlZmluZSBUSFJJRlRfbnRvaGxsKG4pIGJzd2FwXzY0KG4pCisjICBkZWZpbmUgVEhSSUZUX2h0b25sbChuKSBic3dhcF82NChuKQorIyBlbGlmIGRlZmluZWQoX01TQ19WRVIpIC8qIE1pY3Jvc29mdCBWaXN1YWwgQysrICovCisjICBkZWZpbmUgVEhSSUZUX250b2hsbChuKSAoIF9ieXRlc3dhcF91aW50NjQoKHVpbnQ2NF90KW4pICkKKyMgIGRlZmluZSBUSFJJRlRfaHRvbmxsKG4pICggX2J5dGVzd2FwX3VpbnQ2NCgodWludDY0X3QpbikgKQorIyBlbGlmICFkZWZpbmVkKFRIUklGVF9udG9obGwpIC8qIE5vdCBHTlVDL0dMSUJDIG9yIE1TVkMgKi8KKyMgIGRlZmluZSBUSFJJRlRfbnRvaGxsKG4pICggKCgodWludDY0X3QpbnRvaGwoKHVpbnQzMl90KW4pKSA8PCAzMikgKyBudG9obCgodWludDMyX3QpKG4gPj4gMzIpKSApCisjICBkZWZpbmUgVEhSSUZUX2h0b25sbChuKSAoICgoKHVpbnQ2NF90KWh0b25sKCh1aW50MzJfdCluKSkgPDwgMzIpICsgaHRvbmwoKHVpbnQzMl90KShuID4+IDMyKSkgKQorIyBlbmRpZiAvKiBHTlVDL0dMSUJDIG9yIE1TVkMgb3Igc29tZXRoaW5nIGVsc2UgKi8KKyNlbHNlIC8qIF9fVEhSSUZUX0JZVEVfT1JERVIgKi8KKyMgZXJyb3IgIkNhbid0IGRlZmluZSBUSFJJRlRfaHRvbmxsIG9yIFRIUklGVF9udG9obGwhIgorI2VuZGlmCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OworCisvKioKKyAqIEVudW1lcmF0ZWQgZGVmaW5pdGlvbiBvZiB0aGUgdHlwZXMgdGhhdCB0aGUgVGhyaWZ0IHByb3RvY29sIHN1cHBvcnRzLgorICogVGFrZSBzcGVjaWFsIG5vdGUgb2YgdGhlIFRfRU5EIHR5cGUgd2hpY2ggaXMgdXNlZCBzcGVjaWZpY2FsbHkgdG8gbWFyaworICogdGhlIGVuZCBvZiBhIHNlcXVlbmNlIG9mIGZpZWxkcy4KKyAqLworZW51bSBUVHlwZSB7CisgIFRfU1RPUCAgICAgICA9IDAsCisgIFRfVk9JRCAgICAgICA9IDEsCisgIFRfQk9PTCAgICAgICA9IDIsCisgIFRfQllURSAgICAgICA9IDMsCisgIFRfSTA4ICAgICAgICA9IDMsCisgIFRfSTE2ICAgICAgICA9IDYsCisgIFRfSTMyICAgICAgICA9IDgsCisgIFRfVTY0ICAgICAgICA9IDksCisgIFRfSTY0ICAgICAgICA9IDEwLAorICBUX0RPVUJMRSAgICAgPSA0LAorICBUX1NUUklORyAgICAgPSAxMSwKKyAgVF9VVEY3ICAgICAgID0gMTEsCisgIFRfU1RSVUNUICAgICA9IDEyLAorICBUX01BUCAgICAgICAgPSAxMywKKyAgVF9TRVQgICAgICAgID0gMTQsCisgIFRfTElTVCAgICAgICA9IDE1LAorICBUX1VURjggICAgICAgPSAxNiwKKyAgVF9VVEYxNiAgICAgID0gMTcKK307CisKKy8qKgorICogRW51bWVyYXRlZCBkZWZpbml0aW9uIG9mIHRoZSBtZXNzYWdlIHR5cGVzIHRoYXQgdGhlIFRocmlmdCBwcm90b2NvbAorICogc3VwcG9ydHMuCisgKi8KK2VudW0gVE1lc3NhZ2VUeXBlIHsKKyAgVF9DQUxMICAgICAgID0gMSwKKyAgVF9SRVBMWSAgICAgID0gMiwKKyAgVF9FWENFUFRJT04gID0gMywKKyAgVF9PTkVXQVkgICAgID0gNAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfUkVDVVJTSU9OX0xJTUlUID0gNjQ7CisKKy8qKgorICogQWJzdHJhY3QgY2xhc3MgZm9yIGEgdGhyaWZ0IHByb3RvY29sIGRyaXZlci4gVGhlc2UgYXJlIGFsbCB0aGUgbWV0aG9kcyB0aGF0CisgKiBhIHByb3RvY29sIG11c3QgaW1wbGVtZW50LiBFc3NlbnRpYWxseSwgdGhlcmUgbXVzdCBiZSBzb21lIHdheSBvZiByZWFkaW5nCisgKiBhbmQgd3JpdGluZyBhbGwgdGhlIGJhc2UgdHlwZXMsIHBsdXMgYSBtZWNoYW5pc20gZm9yIHdyaXRpbmcgb3V0IHN0cnVjdHMKKyAqIHdpdGggaW5kZXhlZCBmaWVsZHMuCisgKgorICogVFByb3RvY29sIG9iamVjdHMgc2hvdWxkIG5vdCBiZSBzaGFyZWQgYWNyb3NzIG11bHRpcGxlIGVuY29kaW5nIGNvbnRleHRzLAorICogYXMgdGhleSBtYXkgbmVlZCB0byBtYWludGFpbiBpbnRlcm5hbCBzdGF0ZSBpbiBzb21lIHByb3RvY29scyAoaS5lLiBYTUwpLgorICogTm90ZSB0aGF0IGlzIGlzIGFjY2VwdGFibGUgZm9yIHRoZSBUUHJvdG9jb2wgbW9kdWxlIHRvIGRvIGl0cyBvd24gaW50ZXJuYWwKKyAqIGJ1ZmZlcmVkIHJlYWRzL3dyaXRlcyB0byB0aGUgdW5kZXJseWluZyBUVHJhbnNwb3J0IHdoZXJlIGFwcHJvcHJpYXRlIChpLmUuCisgKiB3aGVuIHBhcnNpbmcgYW4gaW5wdXQgWE1MIHN0cmVhbSwgcmVhZGluZyBzaG91bGQgYmUgYmF0Y2hlZCByYXRoZXIgdGhhbgorICogbG9va2luZyBhaGVhZCBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyIGZvciBhIGNsb3NlIHRhZykuCisgKgorICovCitjbGFzcyBUUHJvdG9jb2wgeworcHVibGljOgorICB2aXJ0dWFsIH5UUHJvdG9jb2woKTsKKworICAvKioKKyAgICogV3JpdGluZyBmdW5jdGlvbnMuCisgICAqLworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW5fdmlydChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZF92aXJ0KCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbl92aXJ0KGNvbnN0IGNoYXIqIG5hbWUpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kX3ZpcnQoKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW5fdmlydChjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRFbmRfdmlydCgpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wX3ZpcnQoKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUga2V5VHlwZSwgY29uc3QgVFR5cGUgdmFsVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkKKyAgICAgID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwRW5kX3ZpcnQoKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUxpc3RFbmRfdmlydCgpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU2V0QmVnaW5fdmlydChjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTZXRFbmRfdmlydCgpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQm9vbF92aXJ0KGNvbnN0IGJvb2wgdmFsdWUpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQnl0ZV92aXJ0KGNvbnN0IGludDhfdCBieXRlKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUkxNl92aXJ0KGNvbnN0IGludDE2X3QgaTE2KSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUkzMl92aXJ0KGNvbnN0IGludDMyX3QgaTMyKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUk2NF92aXJ0KGNvbnN0IGludDY0X3QgaTY0KSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZURvdWJsZV92aXJ0KGNvbnN0IGRvdWJsZSBkdWIpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RyaW5nX3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCaW5hcnlfdmlydChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSA9IDA7CisKKyAgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlTWVzc2FnZUJlZ2luX3ZpcnQobmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZU1lc3NhZ2VFbmRfdmlydCgpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVTdHJ1Y3RCZWdpbl92aXJ0KG5hbWUpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmQoKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVTdHJ1Y3RFbmRfdmlydCgpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVGaWVsZEJlZ2luX3ZpcnQobmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlRmllbGRFbmQoKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVGaWVsZEVuZF92aXJ0KCk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcCgpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZUZpZWxkU3RvcF92aXJ0KCk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsIGNvbnN0IFRUeXBlIHZhbFR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZU1hcEJlZ2luX3ZpcnQoa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZU1hcEVuZCgpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZU1hcEVuZF92aXJ0KCk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlTGlzdEJlZ2luX3ZpcnQoZWxlbVR5cGUsIHNpemUpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlTGlzdEVuZF92aXJ0KCk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVTZXRCZWdpbl92aXJ0KGVsZW1UeXBlLCBzaXplKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlU2V0RW5kKCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlU2V0RW5kX3ZpcnQoKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVCb29sX3ZpcnQodmFsdWUpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVCeXRlX3ZpcnQoYnl0ZSk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlSTE2X3ZpcnQoaTE2KTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVJMzJfdmlydChpMzIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZUk2NF92aXJ0KGk2NCk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVEb3VibGVfdmlydChkdWIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlU3RyaW5nX3ZpcnQoc3RyKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZUJpbmFyeV92aXJ0KHN0cik7CisgIH0KKworICAvKioKKyAgICogUmVhZGluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTWVzc2FnZUVuZF92aXJ0KCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmRfdmlydCgpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEVuZF92aXJ0KCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEJlZ2luX3ZpcnQoVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEVuZF92aXJ0KCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZExpc3RCZWdpbl92aXJ0KFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0RW5kX3ZpcnQoKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU2V0QmVnaW5fdmlydChUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU2V0RW5kX3ZpcnQoKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQm9vbF92aXJ0KGJvb2wmIHZhbHVlKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQm9vbF92aXJ0KHN0ZDo6dmVjdG9yPGJvb2w+OjpyZWZlcmVuY2UgdmFsdWUpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCeXRlX3ZpcnQoaW50OF90JiBieXRlKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkSTE2X3ZpcnQoaW50MTZfdCYgaTE2KSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkSTMyX3ZpcnQoaW50MzJfdCYgaTMyKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkSTY0X3ZpcnQoaW50NjRfdCYgaTY0KSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkRG91YmxlX3ZpcnQoZG91YmxlJiBkdWIpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJpbmdfdmlydChzdGQ6OnN0cmluZyYgc3RyKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQmluYXJ5X3ZpcnQoc3RkOjpzdHJpbmcmIHN0cikgPSAwOworCisgIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsIGludDMyX3QmIHNlcWlkKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZE1lc3NhZ2VCZWdpbl92aXJ0KG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCk7CisgIH0KKworICB1aW50MzJfdCByZWFkTWVzc2FnZUVuZCgpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkTWVzc2FnZUVuZF92aXJ0KCk7CisgIH0KKworICB1aW50MzJfdCByZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkU3RydWN0QmVnaW5fdmlydChuYW1lKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZFN0cnVjdEVuZF92aXJ0KCk7CisgIH0KKworICB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVFR5cGUmIGZpZWxkVHlwZSwgaW50MTZfdCYgZmllbGRJZCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRGaWVsZEJlZ2luX3ZpcnQobmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkRmllbGRFbmRfdmlydCgpOworICB9CisKKyAgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkTWFwQmVnaW5fdmlydChrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRNYXBFbmQoKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZE1hcEVuZF92aXJ0KCk7CisgIH0KKworICB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkTGlzdEJlZ2luX3ZpcnQoZWxlbVR5cGUsIHNpemUpOworICB9CisKKyAgdWludDMyX3QgcmVhZExpc3RFbmQoKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZExpc3RFbmRfdmlydCgpOworICB9CisKKyAgdWludDMyX3QgcmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkU2V0QmVnaW5fdmlydChlbGVtVHlwZSwgc2l6ZSk7CisgIH0KKworICB1aW50MzJfdCByZWFkU2V0RW5kKCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRTZXRFbmRfdmlydCgpOworICB9CisKKyAgdWludDMyX3QgcmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkQm9vbF92aXJ0KHZhbHVlKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRCeXRlKGludDhfdCYgYnl0ZSkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRCeXRlX3ZpcnQoYnl0ZSk7CisgIH0KKworICB1aW50MzJfdCByZWFkSTE2KGludDE2X3QmIGkxNikgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRJMTZfdmlydChpMTYpOworICB9CisKKyAgdWludDMyX3QgcmVhZEkzMihpbnQzMl90JiBpMzIpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkSTMyX3ZpcnQoaTMyKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRJNjQoaW50NjRfdCYgaTY0KSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZEk2NF92aXJ0KGk2NCk7CisgIH0KKworICB1aW50MzJfdCByZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZERvdWJsZV92aXJ0KGR1Yik7CisgIH0KKworICB1aW50MzJfdCByZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkU3RyaW5nX3ZpcnQoc3RyKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cikgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRCaW5hcnlfdmlydChzdHIpOworICB9CisKKyAgLyoKKyAgICogc3RkOjp2ZWN0b3IgaXMgc3BlY2lhbGl6ZWQgZm9yIGJvb2wsIGFuZCBpdHMgZWxlbWVudHMgYXJlIGluZGl2aWR1YWwgYml0cworICAgKiByYXRoZXIgdGhhbiBib29scy4gICBXZSBuZWVkIHRvIGRlZmluZSBhIGRpZmZlcmVudCB2ZXJzaW9uIG9mIHJlYWRCb29sKCkKKyAgICogdG8gd29yayB3aXRoIHN0ZDo6dmVjdG9yPGJvb2w+LgorICAgKi8KKyAgdWludDMyX3QgcmVhZEJvb2woc3RkOjp2ZWN0b3I8Ym9vbD46OnJlZmVyZW5jZSB2YWx1ZSkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRCb29sX3ZpcnQodmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIE1ldGhvZCB0byBhcmJpdHJhcmlseSBza2lwIG92ZXIgZGF0YS4KKyAgICovCisgIHVpbnQzMl90IHNraXAoVFR5cGUgdHlwZSkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHNraXBfdmlydCh0eXBlKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHNraXBfdmlydChUVHlwZSB0eXBlKTsKKworICBpbmxpbmUgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydCgpIHsgcmV0dXJuIHB0cmFuc187IH0KKworICAvLyBUT0RPOiByZW1vdmUgdGhlc2UgdHdvIGNhbGxzLCB0aGV5IGFyZSBmb3IgYmFja3dhcmRzCisgIC8vIGNvbXBhdGliaWxpdHkKKyAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRJbnB1dFRyYW5zcG9ydCgpIHsgcmV0dXJuIHB0cmFuc187IH0KKyAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRPdXRwdXRUcmFuc3BvcnQoKSB7IHJldHVybiBwdHJhbnNfOyB9CisKKyAgLy8gaW5wdXQgYW5kIG91dHB1dCByZWN1cnNpb24gZGVwdGggYXJlIGtlcHQgc2VwYXJhdGUgc28gdGhhdCBvbmUgcHJvdG9jb2wKKyAgLy8gY2FuIGJlIHVzZWQgY29uY3VycmVudGx5IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQuCisgIHZvaWQgaW5jcmVtZW50SW5wdXRSZWN1cnNpb25EZXB0aCgpIHsKKyAgICBpZiAocmVjdXJzaW9uX2xpbWl0XyA8ICsraW5wdXRfcmVjdXJzaW9uX2RlcHRoXykgeworICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6REVQVEhfTElNSVQpOworICAgIH0KKyAgfQorICB2b2lkIGRlY3JlbWVudElucHV0UmVjdXJzaW9uRGVwdGgoKSB7IC0taW5wdXRfcmVjdXJzaW9uX2RlcHRoXzsgfQorCisgIHZvaWQgaW5jcmVtZW50T3V0cHV0UmVjdXJzaW9uRGVwdGgoKSB7CisgICAgaWYgKHJlY3Vyc2lvbl9saW1pdF8gPCArK291dHB1dF9yZWN1cnNpb25fZGVwdGhfKSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpERVBUSF9MSU1JVCk7CisgICAgfQorICB9CisgIHZvaWQgZGVjcmVtZW50T3V0cHV0UmVjdXJzaW9uRGVwdGgoKSB7IC0tb3V0cHV0X3JlY3Vyc2lvbl9kZXB0aF87IH0KKworICB1aW50MzJfdCBnZXRSZWN1cnNpb25MaW1pdCgpIGNvbnN0IHtyZXR1cm4gcmVjdXJzaW9uX2xpbWl0Xzt9CisgIHZvaWQgc2V0UmVjdXJpc2lvbkxpbWl0KHVpbnQzMl90IGRlcHRoKSB7cmVjdXJzaW9uX2xpbWl0XyA9IGRlcHRoO30KKworcHJvdGVjdGVkOgorICBUUHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykKKyAgICA6IHB0cmFuc18ocHRyYW5zKSwgaW5wdXRfcmVjdXJzaW9uX2RlcHRoXygwKSwgb3V0cHV0X3JlY3Vyc2lvbl9kZXB0aF8oMCksIHJlY3Vyc2lvbl9saW1pdF8oREVGQVVMVF9SRUNVUlNJT05fTElNSVQpCisgIHt9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFuc187CisKK3ByaXZhdGU6CisgIFRQcm90b2NvbCgpIHt9CisgIHVpbnQzMl90IGlucHV0X3JlY3Vyc2lvbl9kZXB0aF87CisgIHVpbnQzMl90IG91dHB1dF9yZWN1cnNpb25fZGVwdGhfOworICB1aW50MzJfdCByZWN1cnNpb25fbGltaXRfOworfTsKKworLyoqCisgKiBDb25zdHJ1Y3RzIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2wgb2JqZWN0cyBnaXZlbiB0cmFuc3BvcnRzLgorICovCitjbGFzcyBUUHJvdG9jb2xGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVFByb3RvY29sRmFjdG9yeSgpIHt9CisKKyAgdmlydHVhbCB+VFByb3RvY29sRmFjdG9yeSgpOworCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSA9IDA7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGluVHJhbnMsCisgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0VHJhbnMpIHsKKyAgICAodm9pZClvdXRUcmFuczsKKyAgICByZXR1cm4gZ2V0UHJvdG9jb2woaW5UcmFucyk7CisgIH0KK307CisKKy8qKgorICogRHVtbXkgcHJvdG9jb2wgY2xhc3MuCisgKgorICogVGhpcyBjbGFzcyBkb2VzIG5vdGhpbmcsIGFuZCBzaG91bGQgbmV2ZXIgYmUgaW5zdGFudGlhdGVkLgorICogSXQgaXMgdXNlZCBvbmx5IGJ5IHRoZSBnZW5lcmF0b3IgY29kZS4KKyAqLworY2xhc3MgVER1bW15UHJvdG9jb2wgOiBwdWJsaWMgVFByb3RvY29sIHt9OworCisvLyBUaGlzIGlzIHRoZSBkZWZhdWx0IC8gbGVnYWN5IGNob2ljZQorc3RydWN0IFROZXR3b3JrQmlnRW5kaWFuCit7CisgIHN0YXRpYyB1aW50MTZfdCB0b1dpcmUxNih1aW50MTZfdCB4KSAgIHtyZXR1cm4gaHRvbnMoeCk7fQorICBzdGF0aWMgdWludDMyX3QgdG9XaXJlMzIodWludDMyX3QgeCkgICB7cmV0dXJuIGh0b25sKHgpO30KKyAgc3RhdGljIHVpbnQ2NF90IHRvV2lyZTY0KHVpbnQ2NF90IHgpICAge3JldHVybiBUSFJJRlRfaHRvbmxsKHgpO30KKyAgc3RhdGljIHVpbnQxNl90IGZyb21XaXJlMTYodWludDE2X3QgeCkge3JldHVybiBudG9ocyh4KTt9CisgIHN0YXRpYyB1aW50MzJfdCBmcm9tV2lyZTMyKHVpbnQzMl90IHgpIHtyZXR1cm4gbnRvaGwoeCk7fQorICBzdGF0aWMgdWludDY0X3QgZnJvbVdpcmU2NCh1aW50NjRfdCB4KSB7cmV0dXJuIFRIUklGVF9udG9obGwoeCk7fQorfTsKKworLy8gT24gbW9zdCBzeXN0ZW1zLCB0aGlzIHdpbGwgYmUgYSBiaXQgZmFzdGVyIHRoYW4gVE5ldHdvcmtCaWdFbmRpYW4KK3N0cnVjdCBUTmV0d29ya0xpdHRsZUVuZGlhbgoreworICBzdGF0aWMgdWludDE2X3QgdG9XaXJlMTYodWludDE2X3QgeCkgICB7cmV0dXJuIFRIUklGVF9odG9sZXMoeCk7fQorICBzdGF0aWMgdWludDMyX3QgdG9XaXJlMzIodWludDMyX3QgeCkgICB7cmV0dXJuIFRIUklGVF9odG9sZWwoeCk7fQorICBzdGF0aWMgdWludDY0X3QgdG9XaXJlNjQodWludDY0X3QgeCkgICB7cmV0dXJuIFRIUklGVF9odG9sZWxsKHgpO30KKyAgc3RhdGljIHVpbnQxNl90IGZyb21XaXJlMTYodWludDE2X3QgeCkge3JldHVybiBUSFJJRlRfbGV0b2hzKHgpO30KKyAgc3RhdGljIHVpbnQzMl90IGZyb21XaXJlMzIodWludDMyX3QgeCkge3JldHVybiBUSFJJRlRfbGV0b2hsKHgpO30KKyAgc3RhdGljIHVpbnQ2NF90IGZyb21XaXJlNjQodWludDY0X3QgeCkge3JldHVybiBUSFJJRlRfbGV0b2hsbCh4KTt9Cit9OworCitzdHJ1Y3QgVE91dHB1dFJlY3Vyc2lvblRyYWNrZXIgeworICBUUHJvdG9jb2wgJnByb3RfOworICBUT3V0cHV0UmVjdXJzaW9uVHJhY2tlcihUUHJvdG9jb2wgJnByb3QpIDogcHJvdF8ocHJvdCkgeworICAgIHByb3RfLmluY3JlbWVudE91dHB1dFJlY3Vyc2lvbkRlcHRoKCk7CisgIH0KKyAgflRPdXRwdXRSZWN1cnNpb25UcmFja2VyKCkgeworICAgIHByb3RfLmRlY3JlbWVudE91dHB1dFJlY3Vyc2lvbkRlcHRoKCk7CisgIH0KK307CisKK3N0cnVjdCBUSW5wdXRSZWN1cnNpb25UcmFja2VyIHsKKyAgVFByb3RvY29sICZwcm90XzsKKyAgVElucHV0UmVjdXJzaW9uVHJhY2tlcihUUHJvdG9jb2wgJnByb3QpIDogcHJvdF8ocHJvdCkgeworICAgIHByb3RfLmluY3JlbWVudElucHV0UmVjdXJzaW9uRGVwdGgoKTsKKyAgfQorICB+VElucHV0UmVjdXJzaW9uVHJhY2tlcigpIHsKKyAgICBwcm90Xy5kZWNyZW1lbnRJbnB1dFJlY3Vyc2lvbkRlcHRoKCk7CisgIH0KK307CisKKy8qKgorICogSGVscGVyIHRlbXBsYXRlIGZvciBpbXBsZW1lbnRpbmcgVFByb3RvY29sOjpza2lwKCkuCisgKgorICogVGVtcGxhdGl6ZWQgdG8gYXZvaWQgaGF2aW5nIHRvIG1ha2UgdmlydHVhbCBmdW5jdGlvbiBjYWxscy4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4KK3VpbnQzMl90IHNraXAoUHJvdG9jb2xfJiBwcm90LCBUVHlwZSB0eXBlKSB7CisgIFRJbnB1dFJlY3Vyc2lvblRyYWNrZXIgdHJhY2tlcihwcm90KTsKKworICBzd2l0Y2ggKHR5cGUpIHsKKyAgY2FzZSBUX0JPT0w6IHsKKyAgICBib29sIGJvb2x2OworICAgIHJldHVybiBwcm90LnJlYWRCb29sKGJvb2x2KTsKKyAgfQorICBjYXNlIFRfQllURTogeworICAgIGludDhfdCBieXRldiA9IDA7CisgICAgcmV0dXJuIHByb3QucmVhZEJ5dGUoYnl0ZXYpOworICB9CisgIGNhc2UgVF9JMTY6IHsKKyAgICBpbnQxNl90IGkxNjsKKyAgICByZXR1cm4gcHJvdC5yZWFkSTE2KGkxNik7CisgIH0KKyAgY2FzZSBUX0kzMjogeworICAgIGludDMyX3QgaTMyOworICAgIHJldHVybiBwcm90LnJlYWRJMzIoaTMyKTsKKyAgfQorICBjYXNlIFRfSTY0OiB7CisgICAgaW50NjRfdCBpNjQ7CisgICAgcmV0dXJuIHByb3QucmVhZEk2NChpNjQpOworICB9CisgIGNhc2UgVF9ET1VCTEU6IHsKKyAgICBkb3VibGUgZHViOworICAgIHJldHVybiBwcm90LnJlYWREb3VibGUoZHViKTsKKyAgfQorICBjYXNlIFRfU1RSSU5HOiB7CisgICAgc3RkOjpzdHJpbmcgc3RyOworICAgIHJldHVybiBwcm90LnJlYWRCaW5hcnkoc3RyKTsKKyAgfQorICBjYXNlIFRfU1RSVUNUOiB7CisgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIGludDE2X3QgZmlkOworICAgIFRUeXBlIGZ0eXBlOworICAgIHJlc3VsdCArPSBwcm90LnJlYWRTdHJ1Y3RCZWdpbihuYW1lKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgcmVzdWx0ICs9IHByb3QucmVhZEZpZWxkQmVnaW4obmFtZSwgZnR5cGUsIGZpZCk7CisgICAgICBpZiAoZnR5cGUgPT0gVF9TVE9QKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcmVzdWx0ICs9IHNraXAocHJvdCwgZnR5cGUpOworICAgICAgcmVzdWx0ICs9IHByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgfQorICAgIHJlc3VsdCArPSBwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIGNhc2UgVF9NQVA6IHsKKyAgICB1aW50MzJfdCByZXN1bHQgPSAwOworICAgIFRUeXBlIGtleVR5cGU7CisgICAgVFR5cGUgdmFsVHlwZTsKKyAgICB1aW50MzJfdCBpLCBzaXplOworICAgIHJlc3VsdCArPSBwcm90LnJlYWRNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICByZXN1bHQgKz0gc2tpcChwcm90LCBrZXlUeXBlKTsKKyAgICAgIHJlc3VsdCArPSBza2lwKHByb3QsIHZhbFR5cGUpOworICAgIH0KKyAgICByZXN1bHQgKz0gcHJvdC5yZWFkTWFwRW5kKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBjYXNlIFRfU0VUOiB7CisgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgICBUVHlwZSBlbGVtVHlwZTsKKyAgICB1aW50MzJfdCBpLCBzaXplOworICAgIHJlc3VsdCArPSBwcm90LnJlYWRTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgcmVzdWx0ICs9IHNraXAocHJvdCwgZWxlbVR5cGUpOworICAgIH0KKyAgICByZXN1bHQgKz0gcHJvdC5yZWFkU2V0RW5kKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBjYXNlIFRfTElTVDogeworICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CisgICAgVFR5cGUgZWxlbVR5cGU7CisgICAgdWludDMyX3QgaSwgc2l6ZTsKKyAgICByZXN1bHQgKz0gcHJvdC5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICByZXN1bHQgKz0gc2tpcChwcm90LCBlbGVtVHlwZSk7CisgICAgfQorICAgIHJlc3VsdCArPSBwcm90LnJlYWRMaXN0RW5kKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBjYXNlIFRfU1RPUDoKKyAgY2FzZSBUX1ZPSUQ6CisgIGNhc2UgVF9VNjQ6CisgIGNhc2UgVF9VVEY4OgorICBjYXNlIFRfVVRGMTY6CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorCisjZW5kaWYgLy8gI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTF9IXyAxCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQzYTBmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9UUFJPVE9DT0xERUNPUkFUT1JfSF8KKyNkZWZpbmUgVEhSSUZUX1RQUk9UT0NPTERFQ09SQVRPUl9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworLyoqCisgKiA8Y29kZT5UUHJvdG9jb2xEZWNvcmF0b3I8L2NvZGU+IGZvcndhcmRzIGFsbCByZXF1ZXN0cyB0byBhbiBlbmNsb3NlZAorICogPGNvZGU+VFByb3RvY29sPC9jb2RlPiBpbnN0YW5jZSwgcHJvdmlkaW5nIGEgd2F5IHRvIGF1dGhvciBjb25jaXNlCisgKiBjb25jcmV0ZSBkZWNvcmF0b3Igc3ViY2xhc3Nlcy4KKyAqCisgKiA8cD5TZWUgcC4xNzUgb2YgRGVzaWduIFBhdHRlcm5zIChieSBHYW1tYSBldCBhbC4pPC9wPgorICoKKyAqIEBzZWUgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTXVsdGlwbGV4ZWRQcm90b2NvbAorICovCitjbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3IgOiBwdWJsaWMgVFByb3RvY29sIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VFByb3RvY29sRGVjb3JhdG9yKCkge30KKworICAvLyBEZXNjOiBJbml0aWFsaXplcyB0aGUgcHJvdG9jb2wgZGVjb3JhdG9yIG9iamVjdC4KKyAgVFByb3RvY29sRGVjb3JhdG9yKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bykKKyAgICA6IFRQcm90b2NvbChwcm90by0+Z2V0VHJhbnNwb3J0KCkpLCBwcm90b2NvbChwcm90bykge30KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luX3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7CisgICAgcmV0dXJuIHByb3RvY29sLT53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpOworICB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVNZXNzYWdlRW5kKCk7IH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luX3ZpcnQoY29uc3QgY2hhciogbmFtZSkgeworICAgIHJldHVybiBwcm90b2NvbC0+d3JpdGVTdHJ1Y3RCZWdpbihuYW1lKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVTdHJ1Y3RFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luX3ZpcnQoY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CisgICAgcmV0dXJuIHByb3RvY29sLT53cml0ZUZpZWxkQmVnaW4obmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlRmllbGRFbmQoKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVGaWVsZFN0b3AoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNYXBCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPndyaXRlTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwRW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVNYXBFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW5fdmlydChjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAgIHJldHVybiBwcm90b2NvbC0+d3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVMaXN0RW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVMaXN0RW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU2V0QmVnaW5fdmlydChjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAgIHJldHVybiBwcm90b2NvbC0+d3JpdGVTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVNldEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlU2V0RW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQm9vbF92aXJ0KGNvbnN0IGJvb2wgdmFsdWUpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUJvb2wodmFsdWUpOyB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCeXRlX3ZpcnQoY29uc3QgaW50OF90IGJ5dGUpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUJ5dGUoYnl0ZSk7IH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUkxNl92aXJ0KGNvbnN0IGludDE2X3QgaTE2KSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVJMTYoaTE2KTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlSTMyX3ZpcnQoY29uc3QgaW50MzJfdCBpMzIpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUkzMihpMzIpOyB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJNjRfdmlydChjb25zdCBpbnQ2NF90IGk2NCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlSTY0KGk2NCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRG91YmxlX3ZpcnQoY29uc3QgZG91YmxlIGR1YikgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlRG91YmxlKGR1Yik7IH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cmluZ192aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZVN0cmluZyhzdHIpOyB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCaW5hcnlfdmlydChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVCaW5hcnkoc3RyKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCkgeworICAgIHJldHVybiBwcm90b2NvbC0+cmVhZE1lc3NhZ2VCZWdpbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpOworICB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkTWVzc2FnZUVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RydWN0QmVnaW5fdmlydChzdGQ6OnN0cmluZyYgbmFtZSkgeworICAgIHJldHVybiBwcm90b2NvbC0+cmVhZFN0cnVjdEJlZ2luKG5hbWUpOworICB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cnVjdEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRTdHJ1Y3RFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEZpZWxkQmVnaW5fdmlydChzdGQ6OnN0cmluZyYgbmFtZSwgVFR5cGUmIGZpZWxkVHlwZSwgaW50MTZfdCYgZmllbGRJZCkgeworICAgIHJldHVybiBwcm90b2NvbC0+cmVhZEZpZWxkQmVnaW4obmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRGaWVsZEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwQmVnaW5fdmlydChUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgICAgcmV0dXJuIHByb3RvY29sLT5yZWFkTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwRW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZE1hcEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTGlzdEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICAgIHJldHVybiBwcm90b2NvbC0+cmVhZExpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTGlzdEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRMaXN0RW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTZXRCZWdpbl92aXJ0KFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPnJlYWRTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU2V0RW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZFNldEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQm9vbF92aXJ0KGJvb2wmIHZhbHVlKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZEJvb2wodmFsdWUpOyB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEJvb2xfdmlydChzdGQ6OnZlY3Rvcjxib29sPjo6cmVmZXJlbmNlIHZhbHVlKSB7CisgICAgcmV0dXJuIHByb3RvY29sLT5yZWFkQm9vbCh2YWx1ZSk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCeXRlX3ZpcnQoaW50OF90JiBieXRlKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZEJ5dGUoYnl0ZSk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJMTZfdmlydChpbnQxNl90JiBpMTYpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkSTE2KGkxNik7IH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkSTMyX3ZpcnQoaW50MzJfdCYgaTMyKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZEkzMihpMzIpOyB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEk2NF92aXJ0KGludDY0X3QmIGk2NCkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRJNjQoaTY0KTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZERvdWJsZV92aXJ0KGRvdWJsZSYgZHViKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZERvdWJsZShkdWIpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RyaW5nX3ZpcnQoc3RkOjpzdHJpbmcmIHN0cikgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRTdHJpbmcoc3RyKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCaW5hcnlfdmlydChzdGQ6OnN0cmluZyYgc3RyKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZEJpbmFyeShzdHIpOyB9CisKK3ByaXZhdGU6CisgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbDsKK307Cit9Cit9Cit9CisKKyNlbmRpZiAvLyBUSFJJRlRfVFBST1RPQ09MREVDT1JBVE9SX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAxNzhlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MRVhDRVBUSU9OX0hfCisjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MRVhDRVBUSU9OX0hfIDEKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKKy8qKgorICogQ2xhc3MgdG8gZW5jYXBzdWxhdGUgYWxsIHRoZSBwb3NzaWJsZSB0eXBlcyBvZiBwcm90b2NvbCBlcnJvcnMgdGhhdCBtYXkKKyAqIG9jY3VyIGluIHZhcmlvdXMgcHJvdG9jb2wgc3lzdGVtcy4gVGhpcyBwcm92aWRlcyBhIHNvcnQgb2YgZ2VuZXJpYworICogd3JhcHBlciBhcm91bmQgdGhlIHZhZ3VlIFVOSVggRV8gZXJyb3IgY29kZXMgdGhhdCBsZXRzIGEgY29tbW9uIGNvZGUKKyAqIGJhc2Ugb2YgZXJyb3IgaGFuZGxpbmcgdG8gYmUgdXNlZCBmb3IgdmFyaW91cyB0eXBlcyBvZiBwcm90b2NvbHMsIGkuZS4KKyAqIHBpcGVzIGV0Yy4KKyAqCisgKi8KK2NsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIC8qKgorICAgKiBFcnJvciBjb2RlcyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgZXhjZXB0aW9ucy4KKyAgICovCisgIGVudW0gVFByb3RvY29sRXhjZXB0aW9uVHlwZSB7CisgICAgVU5LTk9XTiA9IDAsCisgICAgSU5WQUxJRF9EQVRBID0gMSwKKyAgICBORUdBVElWRV9TSVpFID0gMiwKKyAgICBTSVpFX0xJTUlUID0gMywKKyAgICBCQURfVkVSU0lPTiA9IDQsCisgICAgTk9UX0lNUExFTUVOVEVEID0gNSwKKyAgICBERVBUSF9MSU1JVCA9IDYKKyAgfTsKKworICBUUHJvdG9jb2xFeGNlcHRpb24oKSA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCksIHR5cGVfKFVOS05PV04pIHt9CisKKyAgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvblR5cGUgdHlwZSkgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigpLCB0eXBlXyh0eXBlKSB7fQorCisgIFRQcm90b2NvbEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKKyAgICA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLCB0eXBlXyhVTktOT1dOKSB7fQorCisgIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb25UeXBlIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKQorICAgIDogYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24obWVzc2FnZSksIHR5cGVfKHR5cGUpIHt9CisKKyAgdmlydHVhbCB+VFByb3RvY29sRXhjZXB0aW9uKCkgbm9leGNlcHQge30KKworICAvKioKKyAgICogUmV0dXJucyBhbiBlcnJvciBjb2RlIHRoYXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgZXJyb3IKKyAgICogdGhhdCBoYXMgb2NjdXJyZWQuCisgICAqCisgICAqIEByZXR1cm4gRXJyb3IgY29kZQorICAgKi8KKyAgVFByb3RvY29sRXhjZXB0aW9uVHlwZSBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gdHlwZV87IH0KKworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBub2V4Y2VwdCB7CisgICAgaWYgKG1lc3NhZ2VfLmVtcHR5KCkpIHsKKyAgICAgIHN3aXRjaCAodHlwZV8pIHsKKyAgICAgIGNhc2UgVU5LTk9XTjoKKyAgICAgICAgcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IFVua25vd24gcHJvdG9jb2wgZXhjZXB0aW9uIjsKKyAgICAgIGNhc2UgSU5WQUxJRF9EQVRBOgorICAgICAgICByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogSW52YWxpZCBkYXRhIjsKKyAgICAgIGNhc2UgTkVHQVRJVkVfU0laRToKKyAgICAgICAgcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IE5lZ2F0aXZlIHNpemUiOworICAgICAgY2FzZSBTSVpFX0xJTUlUOgorICAgICAgICByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogRXhjZWVkZWQgc2l6ZSBsaW1pdCI7CisgICAgICBjYXNlIEJBRF9WRVJTSU9OOgorICAgICAgICByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogSW52YWxpZCB2ZXJzaW9uIjsKKyAgICAgIGNhc2UgTk9UX0lNUExFTUVOVEVEOgorICAgICAgICByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogTm90IGltcGxlbWVudGVkIjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiAoSW52YWxpZCBleGNlcHRpb24gdHlwZSkiOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbWVzc2FnZV8uY19zdHIoKTsKKyAgICB9CisgIH0KKworcHJvdGVjdGVkOgorICAvKioKKyAgICogRXJyb3IgY29kZQorICAgKi8KKyAgVFByb3RvY29sRXhjZXB0aW9uVHlwZSB0eXBlXzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTEVYQ0VQVElPTl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFRhcC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFRhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMDBiYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVGFwLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTFRBUF9IXworI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTFRBUF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKKworLyoqCisgKiBQdXRzIGEgd2lyZXRhcCBvbiBhIHByb3RvY29sIG9iamVjdC4gIEFueSByZWFkcyB0byB0aGlzIGNsYXNzIGFyZSBwYXNzZWQKKyAqIHRocm91Z2ggdG8gYW4gZW5jbG9zZWQgcHJvdG9jb2wgb2JqZWN0LCBidXQgYWxzbyBtaXJyb3JlZCBhcyB3cml0ZSB0byBhCisgKiBzZWNvbmQgcHJvdG9jb2wgb2JqZWN0LgorICoKKyAqLworY2xhc3MgVFByb3RvY29sVGFwIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8VFByb3RvY29sVGFwPiB7CitwdWJsaWM6CisgIFRQcm90b2NvbFRhcChzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzb3VyY2UsIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNpbmspCisgICAgOiBUVmlydHVhbFByb3RvY29sPFRQcm90b2NvbFRhcD4oc291cmNlLT5nZXRUcmFuc3BvcnQoKSksIHNvdXJjZV8oc291cmNlKSwgc2lua18oc2luaykge30KKworICB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLCBpbnQzMl90JiBzZXFpZCkgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZE1lc3NhZ2VCZWdpbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpOworICAgIHNpbmtfLT53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kKCkgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZE1lc3NhZ2VFbmQoKTsKKyAgICBzaW5rXy0+d3JpdGVNZXNzYWdlRW5kKCk7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkU3RydWN0QmVnaW4obmFtZSk7CisgICAgc2lua18tPndyaXRlU3RydWN0QmVnaW4obmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkU3RydWN0RW5kKCkgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZFN0cnVjdEVuZCgpOworICAgIHNpbmtfLT53cml0ZVN0cnVjdEVuZCgpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOworICAgIGlmIChmaWVsZFR5cGUgPT0gVF9TVE9QKSB7CisgICAgICBzaW5rXy0+d3JpdGVGaWVsZFN0b3AoKTsKKyAgICB9IGVsc2UgeworICAgICAgc2lua18tPndyaXRlRmllbGRCZWdpbihuYW1lLmNfc3RyKCksIGZpZWxkVHlwZSwgZmllbGRJZCk7CisgICAgfQorICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRGaWVsZEVuZCgpOworICAgIHNpbmtfLT53cml0ZUZpZWxkRW5kKCk7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKKyAgICBzaW5rXy0+d3JpdGVNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkTWFwRW5kKCkgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZE1hcEVuZCgpOworICAgIHNpbmtfLT53cml0ZU1hcEVuZCgpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZExpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgICAgc2lua18tPndyaXRlTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkTGlzdEVuZCgpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRMaXN0RW5kKCk7CisgICAgc2lua18tPndyaXRlTGlzdEVuZCgpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICAgIHNpbmtfLT53cml0ZVNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkU2V0RW5kKCkgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZFNldEVuZCgpOworICAgIHNpbmtfLT53cml0ZVNldEVuZCgpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkQm9vbCh2YWx1ZSk7CisgICAgc2lua18tPndyaXRlQm9vbCh2YWx1ZSk7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgLy8gUHJvdmlkZSB0aGUgZGVmYXVsdCByZWFkQm9vbCgpIGltcGxlbWVudGF0aW9uIGZvciBzdGQ6OnZlY3Rvcjxib29sPgorICB1c2luZyBUVmlydHVhbFByb3RvY29sPFRQcm90b2NvbFRhcD46OnJlYWRCb29sOworCisgIHVpbnQzMl90IHJlYWRCeXRlKGludDhfdCYgYnl0ZSkgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZEJ5dGUoYnl0ZSk7CisgICAgc2lua18tPndyaXRlQnl0ZShieXRlKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkSTE2KGludDE2X3QmIGkxNikgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZEkxNihpMTYpOworICAgIHNpbmtfLT53cml0ZUkxNihpMTYpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRJMzIoaW50MzJfdCYgaTMyKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkSTMyKGkzMik7CisgICAgc2lua18tPndyaXRlSTMyKGkzMik7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRJNjQoaTY0KTsKKyAgICBzaW5rXy0+d3JpdGVJNjQoaTY0KTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkRG91YmxlKGR1Yik7CisgICAgc2lua18tPndyaXRlRG91YmxlKGR1Yik7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgdWludDMyX3QgcmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkU3RyaW5nKHN0cik7CisgICAgc2lua18tPndyaXRlU3RyaW5nKHN0cik7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkQmluYXJ5KHN0cik7CisgICAgc2lua18tPndyaXRlQmluYXJ5KHN0cik7CisgICAgcmV0dXJuIHJ2OworICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNvdXJjZV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNpbmtfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCisKKyNlbmRpZiAvLyAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MVEFQX0hfIDEKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUeXBlcy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg5OGIyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUeXBlcy5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MVFlQRVNfSF8KKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTFRZUEVTX0hfIDEKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKK2VudW0gUFJPVE9DT0xfVFlQRVMgeworICBUX0JJTkFSWV9QUk9UT0NPTCA9IDAsCisgIFRfSlNPTl9QUk9UT0NPTCA9IDEsCisgIFRfQ09NUEFDVF9QUk9UT0NPTCA9IDIsCit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworI2VuZGlmIC8vICNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xUWVBFU19IXyAxCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWVhNTc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaApAQCAtMCwwICsxLDUxMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVFZJUlRVQUxQUk9UT0NPTF9IXworI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RWSVJUVUFMUFJPVE9DT0xfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdGhhdCBwcm92aWRlcyBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiBUUHJvdG9jb2wgbWV0aG9kcy4KKyAqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBub24tdmlydHVhbCBUUHJvdG9jb2wKKyAqIG1ldGhvZHMuICBJdCBleGlzdHMgcHJpbWFyaWx5IHNvIFRWaXJ0dWFsUHJvdG9jb2wgY2FuIGRlcml2ZSBmcm9tIGl0LiAgSXQKKyAqIHByZXZlbnRzIFRWaXJ0dWFsUHJvdG9jb2wgbWV0aG9kcyBmcm9tIGNhdXNpbmcgaW5maW5pdGUgcmVjdXJzaW9uIGlmIHRoZQorICogbm9uLXZpcnR1YWwgbWV0aG9kcyBhcmUgbm90IG92ZXJyaWRkZW4gYnkgdGhlIFRWaXJ0dWFsUHJvdG9jb2wgc3ViY2xhc3MuCisgKgorICogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gdXNlIHRoaXMgY2xhc3MgZGlyZWN0bHkuICBVc2UgVFZpcnR1YWxQcm90b2NvbAorICogaW5zdGVhZC4KKyAqLworY2xhc3MgVFByb3RvY29sRGVmYXVsdHMgOiBwdWJsaWMgVFByb3RvY29sIHsKK3B1YmxpYzoKKyAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwgaW50MzJfdCYgc2VxaWQpIHsKKyAgICAodm9pZCluYW1lOworICAgICh2b2lkKW1lc3NhZ2VUeXBlOworICAgICh2b2lkKXNlcWlkOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmQoKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICAodm9pZCluYW1lOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZFN0cnVjdEVuZCgpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKSB7CisgICAgKHZvaWQpbmFtZTsKKyAgICAodm9pZClmaWVsZFR5cGU7CisgICAgKHZvaWQpZmllbGRJZDsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgICAgKHZvaWQpa2V5VHlwZTsKKyAgICAodm9pZCl2YWxUeXBlOworICAgICh2b2lkKXNpemU7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkTWFwRW5kKCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgICAgKHZvaWQpZWxlbVR5cGU7CisgICAgKHZvaWQpc2l6ZTsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRMaXN0RW5kKCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgICAodm9pZCllbGVtVHlwZTsKKyAgICAodm9pZClzaXplOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZFNldEVuZCgpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKSB7CisgICAgKHZvaWQpdmFsdWU7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkQm9vbChzdGQ6OnZlY3Rvcjxib29sPjo6cmVmZXJlbmNlIHZhbHVlKSB7CisgICAgKHZvaWQpdmFsdWU7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpIHsKKyAgICAodm9pZClieXRlOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZEkxNihpbnQxNl90JiBpMTYpIHsKKyAgICAodm9pZClpMTY7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMikgeworICAgICh2b2lkKWkzMjsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRJNjQoaW50NjRfdCYgaTY0KSB7CisgICAgKHZvaWQpaTY0OworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZERvdWJsZShkb3VibGUmIGR1YikgeworICAgICh2b2lkKWR1YjsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cikgeworICAgICh2b2lkKXN0cjsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cikgeworICAgICh2b2lkKXN0cjsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKKyAgICAodm9pZCluYW1lOworICAgICh2b2lkKW1lc3NhZ2VUeXBlOworICAgICh2b2lkKXNlcWlkOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kKCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgKHZvaWQpbmFtZTsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CisgICAgKHZvaWQpbmFtZTsKKyAgICAodm9pZClmaWVsZFR5cGU7CisgICAgKHZvaWQpZmllbGRJZDsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlRmllbGRFbmQoKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcCgpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwgY29uc3QgVFR5cGUgdmFsVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAgICh2b2lkKWtleVR5cGU7CisgICAgKHZvaWQpdmFsVHlwZTsKKyAgICAodm9pZClzaXplOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVNYXBFbmQoKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAgICh2b2lkKWVsZW1UeXBlOworICAgICh2b2lkKXNpemU7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUxpc3RFbmQoKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgICAgKHZvaWQpZWxlbVR5cGU7CisgICAgKHZvaWQpc2l6ZTsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlU2V0RW5kKCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpIHsKKyAgICAodm9pZCl2YWx1ZTsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgeworICAgICh2b2lkKWJ5dGU7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgeworICAgICh2b2lkKWkxNjsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKSB7CisgICAgKHZvaWQpaTMyOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKKyAgICAodm9pZClpNjQ7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7CisgICAgKHZvaWQpZHViOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICAgICh2b2lkKXN0cjsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICAodm9pZClzdHI7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCBza2lwKFRUeXBlIHR5cGUpIHsgcmV0dXJuIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpza2lwKCp0aGlzLCB0eXBlKTsgfQorCitwcm90ZWN0ZWQ6CisgIFRQcm90b2NvbERlZmF1bHRzKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpIDogVFByb3RvY29sKHB0cmFucykge30KK307CisKKy8qKgorICogQ29uY3JldGUgVFByb3RvY29sIGNsYXNzZXMgc2hvdWxkIGluaGVyaXQgZnJvbSBUVmlydHVhbFByb3RvY29sCisgKiBzbyB0aGV5IGRvbid0IGhhdmUgdG8gbWFudWFsbHkgb3ZlcnJpZGUgdmlydHVhbCBtZXRob2RzLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfLCBjbGFzcyBTdXBlcl8gPSBUUHJvdG9jb2xEZWZhdWx0cz4KK2NsYXNzIFRWaXJ0dWFsUHJvdG9jb2wgOiBwdWJsaWMgU3VwZXJfIHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIFdyaXRpbmcgZnVuY3Rpb25zLgorICAgKi8KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luX3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmRfdmlydCgpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlTWVzc2FnZUVuZCgpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luX3ZpcnQoY29uc3QgY2hhciogbmFtZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVTdHJ1Y3RCZWdpbihuYW1lKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmRfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZVN0cnVjdEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW5fdmlydChjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkRW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVGaWVsZEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlRmllbGRTdG9wKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwQmVnaW5fdmlydChjb25zdCBUVHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZU1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlTWFwRW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVMaXN0RW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVMaXN0RW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU2V0QmVnaW5fdmlydChjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU2V0RW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVTZXRFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCb29sX3ZpcnQoY29uc3QgYm9vbCB2YWx1ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVCb29sKHZhbHVlKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCeXRlX3ZpcnQoY29uc3QgaW50OF90IGJ5dGUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlQnl0ZShieXRlKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJMTZfdmlydChjb25zdCBpbnQxNl90IGkxNikgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVJMTYoaTE2KTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJMzJfdmlydChjb25zdCBpbnQzMl90IGkzMikgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVJMzIoaTMyKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJNjRfdmlydChjb25zdCBpbnQ2NF90IGk2NCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVJNjQoaTY0KTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVEb3VibGVfdmlydChjb25zdCBkb3VibGUgZHViKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZURvdWJsZShkdWIpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cmluZ192aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlU3RyaW5nKHN0cik7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQmluYXJ5X3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVCaW5hcnkoc3RyKTsKKyAgfQorCisgIC8qKgorICAgKiBSZWFkaW5nIGZ1bmN0aW9ucworICAgKi8KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW5fdmlydChzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmRfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkTWVzc2FnZUVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RydWN0QmVnaW5fdmlydChzdGQ6OnN0cmluZyYgbmFtZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZFN0cnVjdEJlZ2luKG5hbWUpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RydWN0RW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZFN0cnVjdEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkRmllbGRCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkRmllbGRFbmRfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkRmllbGRFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEJlZ2luX3ZpcnQoVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZE1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwRW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZE1hcEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTGlzdEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZExpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0RW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZExpc3RFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZFNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRTZXRFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEJvb2xfdmlydChib29sJiB2YWx1ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEJvb2wodmFsdWUpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQm9vbF92aXJ0KHN0ZDo6dmVjdG9yPGJvb2w+OjpyZWZlcmVuY2UgdmFsdWUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRCb29sKHZhbHVlKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEJ5dGVfdmlydChpbnQ4X3QmIGJ5dGUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRCeXRlKGJ5dGUpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkSTE2X3ZpcnQoaW50MTZfdCYgaTE2KSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkSTE2KGkxNik7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJMzJfdmlydChpbnQzMl90JiBpMzIpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRJMzIoaTMyKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEk2NF92aXJ0KGludDY0X3QmIGk2NCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEk2NChpNjQpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkRG91YmxlX3ZpcnQoZG91YmxlJiBkdWIpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWREb3VibGUoZHViKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cmluZ192aXJ0KHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRTdHJpbmcoc3RyKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEJpbmFyeV92aXJ0KHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRCaW5hcnkoc3RyKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgc2tpcF92aXJ0KFRUeXBlIHR5cGUpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5za2lwKHR5cGUpOyB9CisKKyAgLyoKKyAgICogUHJvdmlkZSBhIGRlZmF1bHQgc2tpcCgpIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyBub24tdmlydHVhbCByZWFkCisgICAqIG1ldGhvZHMuCisgICAqCisgICAqIE5vdGU6IHN1YmNsYXNzZXMgdGhhdCB1c2UgVFZpcnR1YWxQcm90b2NvbCB0byBkZXJpdmUgZnJvbSBhbm90aGVyIHByb3RvY29sCisgICAqIGltcGxlbWVudGF0aW9uIChpLmUuLCBub3QgVFByb3RvY29sRGVmYXVsdHMpIHNob3VsZCBiZXdhcmUgdGhhdCB0aGlzIG1heQorICAgKiBvdmVycmlkZSBhbnkgbm9uLWRlZmF1bHQgc2tpcCgpIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBwYXJlbnQKKyAgICogdHJhbnNwb3J0IGNsYXNzLiAgVGhleSBtYXkgbmVlZCB0byBleHBsaWNpdGx5IHJlZGVmaW5lIHNraXAoKSB0byBjYWxsIHRoZQorICAgKiBjb3JyZWN0IHBhcmVudCBpbXBsZW1lbnRhdGlvbiwgaWYgZGVzaXJlZC4KKyAgICovCisgIHVpbnQzMl90IHNraXAoVFR5cGUgdHlwZSkgeworICAgIFByb3RvY29sXyogY29uc3QgcHJvdCA9IHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpOworICAgIHJldHVybiA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6c2tpcCgqcHJvdCwgdHlwZSk7CisgIH0KKworICAvKgorICAgKiBQcm92aWRlIGEgZGVmYXVsdCByZWFkQm9vbCgpIGltcGxlbWVudGF0aW9uIGZvciB1c2Ugd2l0aAorICAgKiBzdGQ6OnZlY3Rvcjxib29sPiwgdGhhdCBiZWhhdmVzIHRoZSBzYW1lIGFzIHJlYWRpbmcgaW50byBhIG5vcm1hbCBib29sLgorICAgKgorICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIGlmIGRlc2lyZWQsIGJ1dCB0aGVyZSBub3JtYWxseSBzaG91bGRuJ3QKKyAgICogYmUgYSBuZWVkIHRvLgorICAgKi8KKyAgdWludDMyX3QgcmVhZEJvb2woc3RkOjp2ZWN0b3I8Ym9vbD46OnJlZmVyZW5jZSB2YWx1ZSkgeworICAgIGJvb2wgYiA9IGZhbHNlOworICAgIHVpbnQzMl90IHJldCA9IHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkQm9vbChiKTsKKyAgICB2YWx1ZSA9IGI7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICB1c2luZyBTdXBlcl86OnJlYWRCb29sOyAvLyBzbyB3ZSBkb24ndCBoaWRlIHJlYWRCb29sKGJvb2wmKQorCitwcm90ZWN0ZWQ6CisgIFRWaXJ0dWFsUHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykgOiBTdXBlcl8ocHRyYW5zKSB7fQorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCisKKyNlbmRpZiAvLyAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFZJUlRVQUxQUk9UT0NPTF9IXyAxCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcXQvQ01ha2VMaXN0cy50eHQgYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRhOWEzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDI4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc2V0KCB0aHJpZnRjcHBxdDVfU09VUkNFUworICAgIFRRSU9EZXZpY2VUcmFuc3BvcnQuY3BwCisgICAgVFFUY3BTZXJ2ZXIuY3BwCispCitzZXQoQ01BS0VfQVVUT01PQyBPTikKK2ZpbmRfcGFja2FnZShRdDUgUkVRVUlSRUQgQ09NUE9ORU5UUyBDb3JlIE5ldHdvcmspCitBRERfTElCUkFSWV9USFJJRlQodGhyaWZ0cXQ1ICR7dGhyaWZ0Y3BwcXQ1X1NPVVJDRVN9KQorVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVCh0aHJpZnRxdDUgUXQ1OjpDb3JlIFF0NTo6TmV0d29yaykKK1RBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlRfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0aHJpZnRxdDUgdGhyaWZ0KQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3N2M5OTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5jcHAKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0Lmg+CisKKyNpbmNsdWRlIDxRQWJzdHJhY3RTb2NrZXQ+CisjaW5jbHVkZSA8UUlPRGV2aWNlPgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworVFFJT0RldmljZVRyYW5zcG9ydDo6VFFJT0RldmljZVRyYW5zcG9ydChzaGFyZWRfcHRyPFFJT0RldmljZT4gZGV2KSA6IGRldl8oZGV2KSB7Cit9CisKK1RRSU9EZXZpY2VUcmFuc3BvcnQ6On5UUUlPRGV2aWNlVHJhbnNwb3J0KCkgeworICBkZXZfLT5jbG9zZSgpOworfQorCit2b2lkIFRRSU9EZXZpY2VUcmFuc3BvcnQ6Om9wZW4oKSB7CisgIGlmICghaXNPcGVuKCkpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wZW4oKTogdW5kZXJseWluZyBRSU9EZXZpY2UgaXNuJ3Qgb3BlbiIpOworICB9Cit9CisKK2Jvb2wgVFFJT0RldmljZVRyYW5zcG9ydDo6aXNPcGVuKCkgeworICByZXR1cm4gZGV2Xy0+aXNPcGVuKCk7Cit9CisKK2Jvb2wgVFFJT0RldmljZVRyYW5zcG9ydDo6cGVlaygpIHsKKyAgcmV0dXJuIGRldl8tPmJ5dGVzQXZhaWxhYmxlKCkgPiAwOworfQorCit2b2lkIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OmNsb3NlKCkgeworICBkZXZfLT5jbG9zZSgpOworfQorCit1aW50MzJfdCBUUUlPRGV2aWNlVHJhbnNwb3J0OjpyZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIHVpbnQzMl90IHJlcXVlc3RMZW4gPSBsZW47CisgIHdoaWxlIChsZW4pIHsKKyAgICB1aW50MzJfdCByZWFkU2l6ZTsKKyAgICB0cnkgeworICAgICAgcmVhZFNpemUgPSByZWFkKGJ1ZiwgbGVuKTsKKyAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgIGlmIChsZW4gIT0gcmVxdWVzdExlbikgeworICAgICAgICAvLyBzb21ldGhpbmcgcmVhZCBhbHJlYWR5CisgICAgICAgIHJldHVybiByZXF1ZXN0TGVuIC0gbGVuOworICAgICAgfQorICAgICAgLy8gZXJyb3IgYnV0IG5vdGhpbmcgcmVhZCB5ZXQKKyAgICAgIHRocm93OworICAgIH0KKyAgICBpZiAocmVhZFNpemUgPT0gMCkgeworICAgICAgZGV2Xy0+d2FpdEZvclJlYWR5UmVhZCg1MCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1ZiArPSByZWFkU2l6ZTsKKyAgICAgIGxlbiAtPSByZWFkU2l6ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlcXVlc3RMZW47Cit9CisKK3VpbnQzMl90IFRRSU9EZXZpY2VUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgdWludDMyX3QgYWN0dWFsU2l6ZTsKKyAgcWludDY0IHJlYWRTaXplOworCisgIGlmICghZGV2Xy0+aXNPcGVuKCkpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWQoKTogdW5kZXJseWluZyBRSU9EZXZpY2UgaXMgbm90IG9wZW4iKTsKKyAgfQorCisgIGFjdHVhbFNpemUgPSAodWludDMyX3QpKHN0ZDo6bWluKSgocWludDY0KWxlbiwgZGV2Xy0+Ynl0ZXNBdmFpbGFibGUoKSk7CisgIHJlYWRTaXplID0gZGV2Xy0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPihidWYpLCBhY3R1YWxTaXplKTsKKworICBpZiAocmVhZFNpemUgPCAwKSB7CisgICAgUUFic3RyYWN0U29ja2V0KiBzb2NrZXQ7CisgICAgaWYgKChzb2NrZXQgPSBxb2JqZWN0X2Nhc3Q8UUFic3RyYWN0U29ja2V0Kj4oZGV2Xy5nZXQoKSkpKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCgpIGZyb20gUUFic3RyYWN0U29ja2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LT5lcnJvcigpKTsKKyAgICB9CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiRmFpbGVkIHRvIHJlYWQgZnJvbSBmcm9tIFFJT0RldmljZSIpOworICB9CisKKyAgcmV0dXJuICh1aW50MzJfdClyZWFkU2l6ZTsKK30KKwordm9pZCBUUUlPRGV2aWNlVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICB3aGlsZSAobGVuKSB7CisgICAgdWludDMyX3Qgd3JpdHRlbiA9IHdyaXRlX3BhcnRpYWwoYnVmLCBsZW4pOworICAgIGxlbiAtPSB3cml0dGVuOworICAgIGRldl8tPndhaXRGb3JCeXRlc1dyaXR0ZW4oNTApOworICB9Cit9CisKK3VpbnQzMl90IFRRSU9EZXZpY2VUcmFuc3BvcnQ6OndyaXRlX3BhcnRpYWwoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgcWludDY0IHdyaXR0ZW47CisKKyAgaWYgKCFkZXZfLT5pc09wZW4oKSkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGVfcGFydGlhbCgpOiB1bmRlcmx5aW5nIFFJT0RldmljZSBpcyBub3Qgb3BlbiIpOworICB9CisKKyAgd3JpdHRlbiA9IGRldl8tPndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZiksIGxlbik7CisgIGlmICh3cml0dGVuIDwgMCkgeworICAgIFFBYnN0cmFjdFNvY2tldCogc29ja2V0OworICAgIGlmICgoc29ja2V0ID0gcW9iamVjdF9jYXN0PFFBYnN0cmFjdFNvY2tldCo+KGRldl8uZ2V0KCkpKSkgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGVfcGFydGlhbCgpOiBmYWlsZWQgdG8gd3JpdGUgdG8gUUFic3RyYWN0U29ja2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LT5lcnJvcigpKTsKKyAgICB9CisKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGVfcGFydGlhbCgpOiBmYWlsZWQgdG8gd3JpdGUgdG8gdW5kZXJseWluZyBRSU9EZXZpY2UiKTsKKyAgfQorCisgIHJldHVybiAodWludDMyX3Qpd3JpdHRlbjsKK30KKwordm9pZCBUUUlPRGV2aWNlVHJhbnNwb3J0OjpmbHVzaCgpIHsKKyAgaWYgKCFkZXZfLT5pc09wZW4oKSkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmx1c2goKTogdW5kZXJseWluZyBRSU9EZXZpY2UgaXMgbm90IG9wZW4iKTsKKyAgfQorCisgIFFBYnN0cmFjdFNvY2tldCogc29ja2V0OworCisgIGlmICgoc29ja2V0ID0gcW9iamVjdF9jYXN0PFFBYnN0cmFjdFNvY2tldCo+KGRldl8uZ2V0KCkpKSkgeworICAgIHNvY2tldC0+Zmx1c2goKTsKKyAgfSBlbHNlIHsKKyAgICBkZXZfLT53YWl0Rm9yQnl0ZXNXcml0dGVuKDEpOworICB9Cit9CisKK3VpbnQ4X3QqIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OmJvcnJvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsKKyAgKHZvaWQpYnVmOworICAodm9pZClsZW47CisgIHJldHVybiBOVUxMOworfQorCit2b2lkIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OmNvbnN1bWUodWludDMyX3QgbGVuKSB7CisgICh2b2lkKWxlbjsKKyAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFjZThkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQVNZTkNfVFFJT0RFVklDRV9UUkFOU1BPUlRfSF8KKyNkZWZpbmUgX1RIUklGVF9BU1lOQ19UUUlPREVWSUNFX1RSQU5TUE9SVF9IXyAxCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CisKK2NsYXNzIFFJT0RldmljZTsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqICBUcmFuc3BvcnQgdGhhdCBvcGVyYXRlcyBvbiBhIFFJT0RldmljZSAoc29ja2V0LCBmaWxlLCBldGMpLgorICovCitjbGFzcyBUUUlPRGV2aWNlVHJhbnNwb3J0CisgICAgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFZpcnR1YWxUcmFuc3BvcnQ8VFFJT0RldmljZVRyYW5zcG9ydD4geworcHVibGljOgorICBleHBsaWNpdCBUUUlPRGV2aWNlVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxRSU9EZXZpY2U+IGRldik7CisgIHZpcnR1YWwgflRRSU9EZXZpY2VUcmFuc3BvcnQoKTsKKworICB2b2lkIG9wZW4oKTsKKyAgYm9vbCBpc09wZW4oKTsKKyAgYm9vbCBwZWVrKCk7CisgIHZvaWQgY2xvc2UoKTsKKworICB1aW50MzJfdCByZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHVpbnQzMl90IHdyaXRlX3BhcnRpYWwoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHZvaWQgZmx1c2goKTsKKworICB1aW50OF90KiBib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKTsKKyAgdm9pZCBjb25zdW1lKHVpbnQzMl90IGxlbik7CisKK3ByaXZhdGU6CisgIFRRSU9EZXZpY2VUcmFuc3BvcnQoY29uc3QgVFFJT0RldmljZVRyYW5zcG9ydCYpOworICBUUUlPRGV2aWNlVHJhbnNwb3J0JiBvcGVyYXRvcj0oY29uc3QgVFFJT0RldmljZVRyYW5zcG9ydCYpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxRSU9EZXZpY2U+IGRldl87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQVNZTkNfVFFJT0RFVklDRV9UUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YWFkMDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPHRocmlmdC9xdC9UUVRjcFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0Lmg+CisKKyNpbmNsdWRlIDxRTWV0YVR5cGU+CisjaW5jbHVkZSA8UVRjcFNvY2tldD4KKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmg+CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUUlPRGV2aWNlVHJhbnNwb3J0OwordXNpbmcgc3RkOjpiaW5kOwordXNpbmcgc3RkOjpmdW5jdGlvbjsKK3VzaW5nIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMTsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworUVRfVVNFX05BTUVTUEFDRQorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFzeW5jIHsKKworc3RydWN0IFRRVGNwU2VydmVyOjpDb25uZWN0aW9uQ29udGV4dCB7CisgIHNoYXJlZF9wdHI8UVRjcFNvY2tldD4gY29ubmVjdGlvbl87CisgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKKyAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlwcm90XzsKKyAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG9wcm90XzsKKworICBleHBsaWNpdCBDb25uZWN0aW9uQ29udGV4dChzaGFyZWRfcHRyPFFUY3BTb2NrZXQ+IGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaXByb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvcHJvdCkKKyAgICA6IGNvbm5lY3Rpb25fKGNvbm5lY3Rpb24pLCB0cmFuc3BvcnRfKHRyYW5zcG9ydCksIGlwcm90XyhpcHJvdCksIG9wcm90XyhvcHJvdCkge30KK307CisKK1RRVGNwU2VydmVyOjpUUVRjcFNlcnZlcihzaGFyZWRfcHRyPFFUY3BTZXJ2ZXI+IHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcGZhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgUU9iamVjdCogcGFyZW50KQorICA6IFFPYmplY3QocGFyZW50KSwgc2VydmVyXyhzZXJ2ZXIpLCBwcm9jZXNzb3JfKHByb2Nlc3NvciksIHBmYWN0XyhwZmFjdCkgeworICBxUmVnaXN0ZXJNZXRhVHlwZTxRVGNwU29ja2V0Kj4oIlFUY3BTb2NrZXQqIik7CisgIGNvbm5lY3Qoc2VydmVyLmdldCgpLCBTSUdOQUwobmV3Q29ubmVjdGlvbigpKSwgU0xPVChwcm9jZXNzSW5jb21pbmcoKSkpOworfQorCitUUVRjcFNlcnZlcjo6flRRVGNwU2VydmVyKCkgeworfQorCit2b2lkIFRRVGNwU2VydmVyOjpwcm9jZXNzSW5jb21pbmcoKSB7CisgIHdoaWxlIChzZXJ2ZXJfLT5oYXNQZW5kaW5nQ29ubmVjdGlvbnMoKSkgeworICAgIC8vIHRha2Ugb3duZXJzaGlwIG9mIHRoZSBRVGNwU29ja2V0OyB0ZWNobmljYWxseSBpdCBjb3VsZCBiZSBkZWxldGVkCisgICAgLy8gd2hlbiB0aGUgUVRjcFNlcnZlciBpcyBkZXN0cm95ZWQsIGJ1dCBhbnkgcmVhbCBhcHAgc2hvdWxkIGRlbGV0ZSB0aGlzCisgICAgLy8gY2xhc3MgYmVmb3JlIGRlbGV0aW5nIHRoZSBRVGNwU2VydmVyIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgc2hhcmVkX3B0cjxRVGNwU29ja2V0PiBjb25uZWN0aW9uKHNlcnZlcl8tPm5leHRQZW5kaW5nQ29ubmVjdGlvbigpKTsKKworICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0OworICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpcHJvdDsKKyAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3Byb3Q7CisKKyAgICB0cnkgeworICAgICAgdHJhbnNwb3J0ID0gc2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVFFJT0RldmljZVRyYW5zcG9ydChjb25uZWN0aW9uKSk7CisgICAgICBpcHJvdCA9IHNoYXJlZF9wdHI8VFByb3RvY29sPihwZmFjdF8tPmdldFByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgb3Byb3QgPSBzaGFyZWRfcHRyPFRQcm90b2NvbD4ocGZhY3RfLT5nZXRQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgIHFXYXJuaW5nKCJbVFFUY3BTZXJ2ZXJdIEZhaWxlZCB0byBpbml0aWFsaXplIHRyYW5zcG9ydHMvcHJvdG9jb2xzIik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBjdHhNYXBfW2Nvbm5lY3Rpb24uZ2V0KCldCisgICAgICAgID0gc2hhcmVkX3B0cjxDb25uZWN0aW9uQ29udGV4dD4obmV3IENvbm5lY3Rpb25Db250ZXh0KGNvbm5lY3Rpb24sIHRyYW5zcG9ydCwgaXByb3QsIG9wcm90KSk7CisKKyAgICBjb25uZWN0KGNvbm5lY3Rpb24uZ2V0KCksIFNJR05BTChyZWFkeVJlYWQoKSksIFNMT1QoYmVnaW5EZWNvZGUoKSkpOworCisgICAgY29ubmVjdChjb25uZWN0aW9uLmdldCgpLCBTSUdOQUwoZGlzY29ubmVjdGVkKCkpLCBTTE9UKHNvY2tldENsb3NlZCgpKSk7CisgIH0KK30KKwordm9pZCBUUVRjcFNlcnZlcjo6YmVnaW5EZWNvZGUoKSB7CisgIFFUY3BTb2NrZXQqIGNvbm5lY3Rpb24ocW9iamVjdF9jYXN0PFFUY3BTb2NrZXQqPihzZW5kZXIoKSkpOworICBRX0FTU0VSVChjb25uZWN0aW9uKTsKKworICBpZiAoY3R4TWFwXy5maW5kKGNvbm5lY3Rpb24pID09IGN0eE1hcF8uZW5kKCkpIHsKKyAgICBxV2FybmluZygiW1RRVGNwU2VydmVyXSBHb3QgZGF0YSBvbiBhbiB1bmtub3duIFFUY3BTb2NrZXQiKTsKKyAgICByZXR1cm47CisgIH0KKworICBzaGFyZWRfcHRyPENvbm5lY3Rpb25Db250ZXh0PiBjdHggPSBjdHhNYXBfW2Nvbm5lY3Rpb25dOworCisgIHRyeSB7CisgICAgcHJvY2Vzc29yXworICAgICAgICAtPnByb2Nlc3MoYmluZCgmVFFUY3BTZXJ2ZXI6OmZpbmlzaCwgdGhpcywgY3R4LCBfMSksCisgICAgICAgICAgICAgICAgICBjdHgtPmlwcm90XywKKyAgICAgICAgICAgICAgICAgIGN0eC0+b3Byb3RfKTsKKyAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZXgpIHsKKyAgICBxV2FybmluZygiW1RRVGNwU2VydmVyXSBUVHJhbnNwb3J0RXhjZXB0aW9uIGR1cmluZyBwcm9jZXNzaW5nOiAnJXMnIiwgZXgud2hhdCgpKTsKKyAgICBzY2hlZHVsZURlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KGNvbm5lY3Rpb24pOworICB9IGNhdGNoICguLi4pIHsKKyAgICBxV2FybmluZygiW1RRVGNwU2VydmVyXSBVbmtub3duIHByb2Nlc3NvciBleGNlcHRpb24iKTsKKyAgICBzY2hlZHVsZURlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KGNvbm5lY3Rpb24pOworICB9Cit9CisKK3ZvaWQgVFFUY3BTZXJ2ZXI6OnNvY2tldENsb3NlZCgpIHsKKyAgUVRjcFNvY2tldCogY29ubmVjdGlvbihxb2JqZWN0X2Nhc3Q8UVRjcFNvY2tldCo+KHNlbmRlcigpKSk7CisgIFFfQVNTRVJUKGNvbm5lY3Rpb24pOworICBzY2hlZHVsZURlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KGNvbm5lY3Rpb24pOworfQorCit2b2lkIFRRVGNwU2VydmVyOjpkZWxldGVDb25uZWN0aW9uQ29udGV4dChRVGNwU29ja2V0KiBjb25uZWN0aW9uKSB7CisgIGNvbnN0IENvbm5lY3Rpb25Db250ZXh0TWFwOjpzaXplX3R5cGUgZGVsZXRlZCA9IGN0eE1hcF8uZXJhc2UoY29ubmVjdGlvbik7CisgIGlmICgwID09IGRlbGV0ZWQpIHsKKyAgICAgIHFXYXJuaW5nKCJbVFFUY3BTZXJ2ZXJdIFVua25vd24gUVRjcFNvY2tldCIpOworICB9Cit9CisKK3ZvaWQgVFFUY3BTZXJ2ZXI6OnNjaGVkdWxlRGVsZXRlQ29ubmVjdGlvbkNvbnRleHQoUVRjcFNvY2tldCogY29ubmVjdGlvbikgeworICBRTWV0YU9iamVjdDo6aW52b2tlTWV0aG9kKHRoaXMsICJkZWxldGVDb25uZWN0aW9uQ29udGV4dCIsIFF0OjpRdWV1ZWRDb25uZWN0aW9uLCBRX0FSRyhRVGNwU29ja2V0KiwgY29ubmVjdGlvbikpOworfQorCit2b2lkIFRRVGNwU2VydmVyOjpmaW5pc2goc2hhcmVkX3B0cjxDb25uZWN0aW9uQ29udGV4dD4gY3R4LCBib29sIGhlYWx0aHkpIHsKKyAgaWYgKCFoZWFsdGh5KSB7CisgICAgcVdhcm5pbmcoIltUUVRjcFNlcnZlcl0gUHJvY2Vzc29yIGZhaWxlZCB0byBwcm9jZXNzIGRhdGEgc3VjY2Vzc2Z1bGx5Iik7CisgICAgZGVsZXRlQ29ubmVjdGlvbkNvbnRleHQoY3R4LT5jb25uZWN0aW9uXy5nZXQoKSk7CisgIH0KK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlM2ZlM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuaApAQCAtMCwwICsxLDgxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UQVNZTkNfUVRDUF9TRVJWRVJfSF8KKyNkZWZpbmUgX1RIUklGVF9UQVNZTkNfUVRDUF9TRVJWRVJfSF8KKworI2luY2x1ZGUgPFFPYmplY3Q+CisjaW5jbHVkZSA8UVRjcFNlcnZlcj4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CitjbGFzcyBUUHJvdG9jb2xGYWN0b3J5OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CisKK2NsYXNzIFRBc3luY1Byb2Nlc3NvcjsKKworLyoqCisgKiAgU2VydmVyIHRoYXQgdXNlcyBRdCB0byBsaXN0ZW4gZm9yIGNvbm5lY3Rpb25zLgorICogIFNpbXBseSBnaXZlIGl0IGEgUVRjcFNlcnZlciB0aGF0IGlzIGxpc3RlbmluZywgYWxvbmcgd2l0aCBhbiBhc3luYworICogIHByb2Nlc3NvciBhbmQgYSBwcm90b2NvbCBmYWN0b3J5LCBhbmQgdGhlbiBydW4gdGhlIFF0IGV2ZW50IGxvb3AuCisgKi8KK2NsYXNzIFRRVGNwU2VydmVyIDogcHVibGljIFFPYmplY3QgeworICBRX09CSkVDVAorcHVibGljOgorICBUUVRjcFNlcnZlcihzdGQ6OnNoYXJlZF9wdHI8UVRjcFNlcnZlcj4gc2VydmVyLAorICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgUU9iamVjdCogcGFyZW50ID0gTlVMTCk7CisgIHZpcnR1YWwgflRRVGNwU2VydmVyKCk7CisKK3ByaXZhdGUgUV9TTE9UUzoKKyAgdm9pZCBwcm9jZXNzSW5jb21pbmcoKTsKKyAgdm9pZCBiZWdpbkRlY29kZSgpOworICB2b2lkIHNvY2tldENsb3NlZCgpOworICB2b2lkIGRlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KFFUY3BTb2NrZXQqIGNvbm5lY3Rpb24pOworCitwcml2YXRlOgorICBRX0RJU0FCTEVfQ09QWShUUVRjcFNlcnZlcikKKworICBzdHJ1Y3QgQ29ubmVjdGlvbkNvbnRleHQ7CisKKyAgdm9pZCBzY2hlZHVsZURlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KFFUY3BTb2NrZXQqIGNvbm5lY3Rpb24pOworICB2b2lkIGZpbmlzaChzdGQ6OnNoYXJlZF9wdHI8Q29ubmVjdGlvbkNvbnRleHQ+IGN0eCwgYm9vbCBoZWFsdGh5KTsKKworICBzdGQ6OnNoYXJlZF9wdHI8UVRjcFNlcnZlcj4gc2VydmVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4gcGZhY3RfOworCisgIHR5cGVkZWYgc3RkOjptYXA8UVRjcFNvY2tldCosIHN0ZDo6c2hhcmVkX3B0cjxDb25uZWN0aW9uQ29udGV4dD4gPiBDb25uZWN0aW9uQ29udGV4dE1hcDsKKyAgQ29ubmVjdGlvbkNvbnRleHRNYXAgY3R4TWFwXzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RBU1lOQ19RVENQX1NFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNkYWE3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5jcHAKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnN0cmluZzsKKworVENvbm5lY3RlZENsaWVudDo6VENvbm5lY3RlZENsaWVudChjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sPiYgaW5wdXRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2w+JiBvdXRwdXRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiYgZXZlbnRIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiBjbGllbnQpCisKKyAgOiBwcm9jZXNzb3JfKHByb2Nlc3NvciksCisgICAgaW5wdXRQcm90b2NvbF8oaW5wdXRQcm90b2NvbCksCisgICAgb3V0cHV0UHJvdG9jb2xfKG91dHB1dFByb3RvY29sKSwKKyAgICBldmVudEhhbmRsZXJfKGV2ZW50SGFuZGxlciksCisgICAgY2xpZW50XyhjbGllbnQpLAorICAgIG9wYXF1ZUNvbnRleHRfKDApIHsKK30KKworVENvbm5lY3RlZENsaWVudDo6flRDb25uZWN0ZWRDbGllbnQoKSB7Cit9CisKK3ZvaWQgVENvbm5lY3RlZENsaWVudDo6cnVuKCkgeworICBpZiAoZXZlbnRIYW5kbGVyXykgeworICAgIG9wYXF1ZUNvbnRleHRfID0gZXZlbnRIYW5kbGVyXy0+Y3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfKTsKKyAgfQorCisgIGZvciAoYm9vbCBkb25lID0gZmFsc2U7ICFkb25lOykgeworICAgIGlmIChldmVudEhhbmRsZXJfKSB7CisgICAgICBldmVudEhhbmRsZXJfLT5wcm9jZXNzQ29udGV4dChvcGFxdWVDb250ZXh0XywgY2xpZW50Xyk7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGlmICghcHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfLCBvcGFxdWVDb250ZXh0XykpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7CisgICAgICBzd2l0Y2ggKHR0eC5nZXRUeXBlKCkpIHsKKyAgICAgICAgY2FzZSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRToKKyAgICAgICAgY2FzZSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRDoKKyAgICAgICAgY2FzZSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQ6CisgICAgICAgICAgLy8gQ2xpZW50IGRpc2Nvbm5lY3RlZCBvciB3YXMgaW50ZXJydXB0ZWQgb3IgZGlkIG5vdCByZXNwb25kIHdpdGhpbiB0aGUgcmVjZWl2ZSB0aW1lb3V0LgorICAgICAgICAgIC8vIE5vIGxvZ2dpbmcgbmVlZGVkLiAgRG9uZS4KKyAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgLy8gQWxsIG90aGVyIHRyYW5zcG9ydCBleGNlcHRpb25zIGFyZSBsb2dnZWQuCisgICAgICAgICAgLy8gU3RhdGUgb2YgY29ubmVjdGlvbiBpcyB1bmtub3duLiAgRG9uZS4KKyAgICAgICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUQ29ubmVjdGVkQ2xpZW50IGRpZWQ6ICIpICsgdHR4LndoYXQoKTsKKyAgICAgICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOworICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoY29uc3QgVEV4Y2VwdGlvbiYgdGV4KSB7CisgICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUQ29ubmVjdGVkQ2xpZW50IHByb2Nlc3NpbmcgZXhjZXB0aW9uOiAiKSArIHRleC53aGF0KCk7CisgICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOworICAgICAgLy8gRGlzY29ubmVjdCBmcm9tIGNsaWVudCwgYmVjYXVzZSB3ZSBjb3VsZCBub3QgcHJvY2VzcyB0aGUgbWVzc2FnZS4KKyAgICAgIGRvbmUgPSB0cnVlOworICAgIH0KKyAgfQorCisgIGNsZWFudXAoKTsKK30KKwordm9pZCBUQ29ubmVjdGVkQ2xpZW50OjpjbGVhbnVwKCkgeworICBpZiAoZXZlbnRIYW5kbGVyXykgeworICAgIGV2ZW50SGFuZGxlcl8tPmRlbGV0ZUNvbnRleHQob3BhcXVlQ29udGV4dF8sIGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8pOworICB9CisKKyAgdHJ5IHsKKyAgICBpbnB1dFByb3RvY29sXy0+Z2V0VHJhbnNwb3J0KCktPmNsb3NlKCk7CisgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgeworICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRDb25uZWN0ZWRDbGllbnQgaW5wdXQgY2xvc2UgZmFpbGVkOiAiKSArIHR0eC53aGF0KCk7CisgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKKyAgfQorCisgIHRyeSB7CisgICAgb3V0cHV0UHJvdG9jb2xfLT5nZXRUcmFuc3BvcnQoKS0+Y2xvc2UoKTsKKyAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7CisgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVENvbm5lY3RlZENsaWVudCBvdXRwdXQgY2xvc2UgZmFpbGVkOiAiKSArIHR0eC53aGF0KCk7CisgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKKyAgfQorCisgIHRyeSB7CisgICAgY2xpZW50Xy0+Y2xvc2UoKTsKKyAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7CisgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVENvbm5lY3RlZENsaWVudCBjbGllbnQgY2xvc2UgZmFpbGVkOiAiKSArIHR0eC53aGF0KCk7CisgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKKyAgfQorfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZTcwYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RDT05ORUNURURDTElFTlRfSF8KKyNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVENPTk5FQ1RFRENMSUVOVF9IXyAxCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L1RQcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKKworLyoqCisgKiBUaGlzIHJlcHJlc2VudHMgYSBjbGllbnQgY29ubmVjdGVkIHRvIGEgVFNlcnZlci4gIFRoZQorICogcHJvY2Vzc2luZyBsb29wIGZvciBhIGNsaWVudCBtdXN0IHByb3ZpZGUgc29tZSByZXF1aXJlZAorICogZnVuY3Rpb25hbGl0eSBjb21tb24gdG8gYWxsIGltcGxlbWVudGF0aW9ucyBzbyBpdCBpcworICogZW5jYXBzdWxhdGVkIGhlcmUuCisgKi8KKworY2xhc3MgVENvbm5lY3RlZENsaWVudCA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlIHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLgorICAgKgorICAgKiBAcGFyYW1baW5dIHByb2Nlc3NvciAgICAgIHRoZSBUUHJvY2Vzc29yCisgICAqIEBwYXJhbVtpbl0gaW5wdXRQcm90b2NvbCAgdGhlIGlucHV0IFRQcm90b2NvbAorICAgKiBAcGFyYW1baW5dIG91dHB1dFByb3RvY29sIHRoZSBvdXRwdXQgVFByb3RvY29sCisgICAqIEBwYXJhbVtpbl0gZXZlbnRIYW5kbGVyICAgdGhlIHNlcnZlciBldmVudCBoYW5kbGVyCisgICAqIEBwYXJhbVtpbl0gY2xpZW50ICAgICAgICAgdGhlIFRUcmFuc3BvcnQgcmVwcmVzZW50aW5nIHRoZSBjbGllbnQKKyAgICovCisgIFRDb25uZWN0ZWRDbGllbnQoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+JiBpbnB1dFByb3RvY29sLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiYgb3V0cHV0UHJvdG9jb2wsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcj4mIGV2ZW50SGFuZGxlciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiYgY2xpZW50KTsKKworICAvKioKKyAgICogRGVzdHJ1Y3Rvci4KKyAgICovCisgIHZpcnR1YWwgflRDb25uZWN0ZWRDbGllbnQoKTsKKworICAvKioKKyAgICogRHJpdmUgdGhlIGNsaWVudCB1bnRpbCBpdCBpcyBkb25lLgorICAgKiBUaGUgY2xpZW50IHByb2Nlc3NpbmcgbG9vcCBpczoKKyAgICoKKyAgICogW29wdGlvbmFsXSBjYWxsIGV2ZW50SGFuZGxlci0+Y3JlYXRlQ29udGV4dCBvbmNlCisgICAqIFtvcHRpb25hbF0gY2FsbCBldmVudEhhbmRsZXItPnByb2Nlc3NDb250ZXh0IHBlciByZXF1ZXN0CisgICAqICAgICAgICAgICAgY2FsbCBwcm9jZXNzb3ItPnByb2Nlc3MgcGVyIHJlcXVlc3QKKyAgICogICAgICAgICAgICAgIGhhbmRsZSBleHBlY3RlZCB0cmFuc3BvcnQgZXhjZXB0aW9uczoKKyAgICogICAgICAgICAgICAgICAgRU5EX09GX0ZJTEUgbWVhbnMgdGhlIGNsaWVudCBpcyBnb25lCisgICAqICAgICAgICAgICAgICAgIElOVEVSUlVQVEVEIG1lYW5zIHRoZSBjbGllbnQgd2FzIGludGVycnVwdGVkCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IFRTZXJ2ZXJUcmFuc3BvcnQ6OmludGVycnVwdENoaWxkcmVuKCkKKyAgICogICAgICAgICAgICAgIGhhbmRsZSB1bmV4cGVjdGVkIHRyYW5zcG9ydCBleGNlcHRpb25zIGJ5IGxvZ2dpbmcKKyAgICogICAgICAgICAgICAgIGhhbmRsZSBzdGFuZGFyZCBleGNlcHRpb25zIGJ5IGxvZ2dpbmcKKyAgICogICAgICAgICAgICAgIGhhbmRsZSB1bmV4cGVjdGVkIGV4Y2VwdGlvbnMgYnkgbG9nZ2luZworICAgKiAgICAgICAgICAgIGNsZWFudXAoKQorICAgKi8KKyAgdmlydHVhbCB2b2lkIHJ1bigpIC8qIG92ZXJyaWRlICovOworCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBDbGVhbnVwIGFmdGVyIGEgY2xpZW50LiAgVGhpcyBoYXBwZW5zIGlmIHRoZSBjbGllbnQgZGlzY29ubmVjdHMsCisgICAqIG9yIGlmIHRoZSBzZXJ2ZXIgaXMgc3RvcHBlZCwgb3IgaWYgYW4gZXhjZXB0aW9uIG9jY3Vycy4KKyAgICoKKyAgICogVGhlIGNsZWFudXAgcHJvY2Vzc2luZyBpczoKKyAgICogW29wdGlvbmFsXSBjYWxsIGV2ZW50SGFuZGxlci0+ZGVsZXRlQ29udGV4dCBvbmNlCisgICAqICAgICAgICAgICAgY2xvc2UgdGhlIGlucHV0UHJvdG9jb2wncyBUVHJhbnNwb3J0CisgICAqICAgICAgICAgICAgY2xvc2UgdGhlIG91dHB1dFByb3RvY29sJ3MgVFRyYW5zcG9ydAorICAgKiAgICAgICAgICAgIGNsb3NlIHRoZSBjbGllbnQKKyAgICovCisgIHZpcnR1YWwgdm9pZCBjbGVhbnVwKCk7CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbnB1dFByb3RvY29sXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbF87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gY2xpZW50XzsKKworICAvKioKKyAgICogQ29udGV4dCBhY3F1aXJlZCBmcm9tIHRoZSBldmVudEhhbmRsZXJfIGlmIG9uZSBleGlzdHMuCisgICAqLworICB2b2lkKiBvcGFxdWVDb250ZXh0XzsKK307Cit9Cit9Cit9CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RDT05ORUNURURDTElFTlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTZmY2U3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsMTUyMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpZmRlZiBIQVZFX1BPTExfSAorI2luY2x1ZGUgPHBvbGwuaD4KKyNlbGlmIEhBVkVfU1lTX1BPTExfSAorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjZWxpZiBIQVZFX1NZU19TRUxFQ1RfSAorI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfTkVUSU5FVF9JTl9ICisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQVJQQV9JTkVUX0gKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9ORVREQl9ICisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9GQ05UTF9ICisjaW5jbHVkZSA8ZmNudGwuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpZmRlZiBIQVZFX1NDSEVEX0gKKyNpbmNsdWRlIDxzY2hlZC5oPgorI2VuZGlmCisKKyNpZm5kZWYgQUZfTE9DQUwKKyNkZWZpbmUgQUZfTE9DQUwgQUZfVU5JWAorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgeworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKKy8vLyBUaHJlZSBzdGF0ZXMgZm9yIHNvY2tldHM6IHJlY3YgZnJhbWUgc2l6ZSwgcmVjdiBkYXRhLCBhbmQgc2VuZCBtb2RlCitlbnVtIFRTb2NrZXRTdGF0ZSB7IFNPQ0tFVF9SRUNWX0ZSQU1JTkcsIFNPQ0tFVF9SRUNWLCBTT0NLRVRfU0VORCB9OworCisvKioKKyAqIEZpdmUgc3RhdGVzIGZvciB0aGUgbm9uYmxvY2tpbmcgc2VydmVyOgorICogIDEpIGluaXRpYWxpemUKKyAqICAyKSByZWFkIDQgYnl0ZSBmcmFtZSBzaXplCisgKiAgMykgcmVhZCBmcmFtZSBvZiBkYXRhCisgKiAgNCkgc2VuZCBiYWNrIGRhdGEgKGlmIGFueSkKKyAqICA1KSBmb3JjZSBpbW1lZGlhdGUgY29ubmVjdGlvbiBjbG9zZQorICovCitlbnVtIFRBcHBTdGF0ZSB7CisgIEFQUF9JTklULAorICBBUFBfUkVBRF9GUkFNRV9TSVpFLAorICBBUFBfUkVBRF9SRVFVRVNULAorICBBUFBfV0FJVF9UQVNLLAorICBBUFBfU0VORF9SRVNVTFQsCisgIEFQUF9DTE9TRV9DT05ORUNUSU9OCit9OworCisvKioKKyAqIFJlcHJlc2VudHMgYSBjb25uZWN0aW9uIHRoYXQgaXMgaGFuZGxlZCB2aWEgbGliZXZlbnQuIFRoaXMgY29ubmVjdGlvbgorICogZXNzZW50aWFsbHkgZW5jYXBzdWxhdGVzIGEgc29ja2V0IHRoYXQgaGFzIHNvbWUgYXNzb2NpYXRlZCBsaWJldmVudCBzdGF0ZS4KKyAqLworY2xhc3MgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbiB7Citwcml2YXRlOgorICAvLy8gU2VydmVyIElPIFRocmVhZCBoYW5kbGluZyB0aGlzIGNvbm5lY3Rpb24KKyAgVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkXzsKKworICAvLy8gU2VydmVyIGhhbmRsZQorICBUTm9uYmxvY2tpbmdTZXJ2ZXIqIHNlcnZlcl87CisKKyAgLy8vIFRQcm9jZXNzb3IKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CisKKyAgLy8vIE9iamVjdCB3cmFwcGluZyBuZXR3b3JrIHNvY2tldAorICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gdFNvY2tldF87CisKKyAgLy8vIExpYmV2ZW50IG9iamVjdAorICBzdHJ1Y3QgZXZlbnQgZXZlbnRfOworCisgIC8vLyBMaWJldmVudCBmbGFncworICBzaG9ydCBldmVudEZsYWdzXzsKKworICAvLy8gU29ja2V0IG1vZGUKKyAgVFNvY2tldFN0YXRlIHNvY2tldFN0YXRlXzsKKworICAvLy8gQXBwbGljYXRpb24gc3RhdGUKKyAgVEFwcFN0YXRlIGFwcFN0YXRlXzsKKworICAvLy8gSG93IG11Y2ggZGF0YSBuZWVkZWQgdG8gcmVhZAorICB1aW50MzJfdCByZWFkV2FudF87CisKKyAgLy8vIFdoZXJlIGluIHRoZSByZWFkIGJ1ZmZlciBhcmUgd2UKKyAgdWludDMyX3QgcmVhZEJ1ZmZlclBvc187CisKKyAgLy8vIFJlYWQgYnVmZmVyCisgIHVpbnQ4X3QqIHJlYWRCdWZmZXJfOworCisgIC8vLyBSZWFkIGJ1ZmZlciBzaXplCisgIHVpbnQzMl90IHJlYWRCdWZmZXJTaXplXzsKKworICAvLy8gV3JpdGUgYnVmZmVyCisgIHVpbnQ4X3QqIHdyaXRlQnVmZmVyXzsKKworICAvLy8gV3JpdGUgYnVmZmVyIHNpemUKKyAgdWludDMyX3Qgd3JpdGVCdWZmZXJTaXplXzsKKworICAvLy8gSG93IGZhciB0aHJvdWdoIHdyaXRpbmcgYXJlIHdlPworICB1aW50MzJfdCB3cml0ZUJ1ZmZlclBvc187CisKKyAgLy8vIExhcmdlc3Qgc2l6ZSBvZiB3cml0ZSBidWZmZXIgc2VlbiBzaW5jZSBidWZmZXIgd2FzIGNvbnN0cnVjdGVkCisgIHNpemVfdCBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXzsKKworICAvLy8gQ291bnQgb2YgdGhlIG51bWJlciBvZiBjYWxscyBmb3IgdXNlIHdpdGggZ2V0UmVzaXplQnVmZmVyRXZlcnlOKCkuCisgIGludDMyX3QgY2FsbHNGb3JSZXNpemVfOworCisgIC8vLyBUcmFuc3BvcnQgdG8gcmVhZCBmcm9tCisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBpbnB1dFRyYW5zcG9ydF87CisKKyAgLy8vIFRyYW5zcG9ydCB0aGF0IHByb2Nlc3NvciB3cml0ZXMgdG8KKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG91dHB1dFRyYW5zcG9ydF87CisKKyAgLy8vIGV4dHJhIHRyYW5zcG9ydCBnZW5lcmF0ZWQgYnkgdHJhbnNwb3J0IGZhY3RvcnkgKGUuZy4gQnVmZmVyZWRSb3V0ZXJUcmFuc3BvcnQpCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBmYWN0b3J5SW5wdXRUcmFuc3BvcnRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZmFjdG9yeU91dHB1dFRyYW5zcG9ydF87CisKKyAgLy8vIFByb3RvY29sIGRlY29kZXIKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbF87CisKKyAgLy8vIFByb3RvY29sIGVuY29kZXIKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2xfOworCisgIC8vLyBTZXJ2ZXIgZXZlbnQgaGFuZGxlciwgaWYgYW55CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXJfOworCisgIC8vLyBUaHJpZnQgY2FsbCBjb250ZXh0LCBpZiBhbnkKKyAgdm9pZCogY29ubmVjdGlvbkNvbnRleHRfOworCisgIC8vLyBHbyBpbnRvIHJlYWQgbW9kZQorICB2b2lkIHNldFJlYWQoKSB7IHNldEZsYWdzKEVWX1JFQUQgfCBFVl9QRVJTSVNUKTsgfQorCisgIC8vLyBHbyBpbnRvIHdyaXRlIG1vZGUKKyAgdm9pZCBzZXRXcml0ZSgpIHsgc2V0RmxhZ3MoRVZfV1JJVEUgfCBFVl9QRVJTSVNUKTsgfQorCisgIC8vLyBTZXQgc29ja2V0IGlkbGUKKyAgdm9pZCBzZXRJZGxlKCkgeyBzZXRGbGFncygwKTsgfQorCisgIC8qKgorICAgKiBTZXQgZXZlbnQgZmxhZ3MgZm9yIHRoaXMgY29ubmVjdGlvbi4KKyAgICoKKyAgICogQHBhcmFtIGV2ZW50RmxhZ3MgZmxhZ3Mgd2UgcGFzcyB0byBsaWJldmVudCBmb3IgdGhlIGNvbm5lY3Rpb24uCisgICAqLworICB2b2lkIHNldEZsYWdzKHNob3J0IGV2ZW50RmxhZ3MpOworCisgIC8qKgorICAgKiBMaWJldmVudCBoYW5kbGVyIGNhbGxlZCAodmlhIG91ciBzdGF0aWMgd3JhcHBlcikgd2hlbiB0aGUgY29ubmVjdGlvbgorICAgKiBzb2NrZXQgaGFkIHNvbWV0aGluZyBoYXBwZW4uICBSYXRoZXIgdGhhbiB1c2UgdGhlIGZsYWdzIGxpYmV2ZW50IHBhc3NlZCwKKyAgICogd2UgdXNlIHRoZSBjb25uZWN0aW9uIHN0YXRlIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIG5lZWQgdG8gcmVhZCBvcgorICAgKiB3cml0ZSB0aGUgc29ja2V0LgorICAgKi8KKyAgdm9pZCB3b3JrU29ja2V0KCk7CisKK3B1YmxpYzoKKyAgY2xhc3MgVGFzazsKKworICAvLy8gQ29uc3RydWN0b3IKKyAgVENvbm5lY3Rpb24oc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldCwKKyAgICAgICAgICAgICAgVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkKSB7CisgICAgcmVhZEJ1ZmZlcl8gPSBOVUxMOworICAgIHJlYWRCdWZmZXJTaXplXyA9IDA7CisKKyAgICBpb1RocmVhZF8gPSBpb1RocmVhZDsKKyAgICBzZXJ2ZXJfID0gaW9UaHJlYWQtPmdldFNlcnZlcigpOworCisgICAgLy8gQWxsb2NhdGUgaW5wdXQgYW5kIG91dHB1dCB0cmFuc3BvcnRzIHRoZXNlIG9ubHkgbmVlZCB0byBiZSBhbGxvY2F0ZWQKKyAgICAvLyBvbmNlIHBlciBUQ29ubmVjdGlvbiAodGhleSBkb24ndCBuZWVkIHRvIGJlIHJlYWxsb2NhdGVkIG9uIGluaXQoKSBjYWxsKQorICAgIGlucHV0VHJhbnNwb3J0Xy5yZXNldChuZXcgVE1lbW9yeUJ1ZmZlcihyZWFkQnVmZmVyXywgcmVhZEJ1ZmZlclNpemVfKSk7CisgICAgb3V0cHV0VHJhbnNwb3J0Xy5yZXNldCgKKyAgICAgICAgbmV3IFRNZW1vcnlCdWZmZXIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNlcnZlcl8tPmdldFdyaXRlQnVmZmVyRGVmYXVsdFNpemUoKSkpKTsKKworICAgIHRTb2NrZXRfID0gIHNvY2tldDsKKworICAgIGluaXQoaW9UaHJlYWQpOworICB9CisKKyAgflRDb25uZWN0aW9uKCkgeyBzdGQ6OmZyZWUocmVhZEJ1ZmZlcl8pOyB9CisKKyAgLy8vIENsb3NlIHRoaXMgY29ubmVjdGlvbiBhbmQgZnJlZSBvciByZXNldCBpdHMgcmVzb3VyY2VzLgorICB2b2lkIGNsb3NlKCk7CisKKyAgLyoqCisgICAgKiBDaGVjayBidWZmZXJzIGFnYWluc3QgYW55IHNpemUgbGltaXRzIGFuZCBzaHJpbmsgaXQgaWYgZXhjZWVkZWQuCisgICAgKgorICAgICogQHBhcmFtIHJlYWRMaW1pdCB3ZSByZWR1Y2UgcmVhZCBidWZmZXIgc2l6ZSB0byB0aGlzIChpZiBub256ZXJvKS4KKyAgICAqIEBwYXJhbSB3cml0ZUxpbWl0IGlmIG5vbnplcm8gYW5kIHdyaXRlIGJ1ZmZlciBpcyBsYXJnZXIsIHJlcGxhY2UgaXQuCisgICAgKi8KKyAgdm9pZCBjaGVja0lkbGVCdWZmZXJNZW1MaW1pdChzaXplX3QgcmVhZExpbWl0LCBzaXplX3Qgd3JpdGVMaW1pdCk7CisKKyAgLy8vIEluaXRpYWxpemUKKyAgdm9pZCBpbml0KFROb25ibG9ja2luZ0lPVGhyZWFkKiBpb1RocmVhZCk7CisKKyAgLy8vIHNldCBzb2NrZXQgZm9yIGNvbm5lY3Rpb24KKyAgdm9pZCBzZXRTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldCk7CisKKyAgLyoqCisgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHRyYW5zaXRpb25zIGZyb20gb25lIHN0YXRlIGludG8KKyAgICogYW5vdGhlci4gVGhpcyBtZWFucyB0aGF0IGl0IGhhcyBmaW5pc2hlZCB3cml0aW5nIHRoZSBkYXRhIHRoYXQgaXQgbmVlZGVkCisgICAqIHRvLCBvciBmaW5pc2hlZCByZWNlaXZpbmcgdGhlIGRhdGEgdGhhdCBpdCBuZWVkZWQgdG8uCisgICAqLworICB2b2lkIHRyYW5zaXRpb24oKTsKKworICAvKioKKyAgICogQy1jYWxsYWJsZSBldmVudCBoYW5kbGVyIGZvciBjb25uZWN0aW9uIGV2ZW50cy4gIFByb3ZpZGVzIGEgY2FsbGJhY2sKKyAgICogdGhhdCBsaWJldmVudCBjYW4gdW5kZXJzdGFuZCB3aGljaCBpbnZva2VzIGNvbm5lY3Rpb25fLT53b3JrU29ja2V0KCkuCisgICAqCisgICAqIEBwYXJhbSBmZCB0aGUgZGVzY3JpcHRvciB0aGUgZXZlbnQgb2NjdXJyZWQgb24uCisgICAqIEBwYXJhbSB3aGljaCB0aGUgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudC4KKyAgICogQHBhcmFtIHYgdm9pZCogY2FsbGJhY2sgYXJnIHdoZXJlIHdlIHBsYWNlZCBUQ29ubmVjdGlvbidzICJ0aGlzIi4KKyAgICovCisgIHN0YXRpYyB2b2lkIGV2ZW50SGFuZGxlcihldnV0aWxfc29ja2V0X3QgZmQsIHNob3J0IC8qIHdoaWNoICovLCB2b2lkKiB2KSB7CisgICAgYXNzZXJ0KGZkID09IHN0YXRpY19jYXN0PGV2dXRpbF9zb2NrZXRfdD4oKChUQ29ubmVjdGlvbiopdiktPmdldFRTb2NrZXQoKS0+Z2V0U29ja2V0RkQoKSkpOworICAgICgoVENvbm5lY3Rpb24qKXYpLT53b3JrU29ja2V0KCk7CisgIH0KKworICAvKioKKyAgICogTm90aWZpY2F0aW9uIHRvIHNlcnZlciB0aGF0IHByb2Nlc3NpbmcgaGFzIGVuZGVkIG9uIHRoaXMgcmVxdWVzdC4KKyAgICogQ2FuIGJlIGNhbGxlZCBlaXRoZXIgd2hlbiBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlZCBvciB3aGVuIGEgd2FpdGluZworICAgKiB0YXNrIGhhcyBiZWVuIHByZWVtcHRpdmVseSB0ZXJtaW5hdGVkIChvbiBvdmVybG9hZCkuCisgICAqCisgICAqIERvbid0IGNhbGwgdGhpcyBmcm9tIHRoZSBJTyB0aHJlYWQgaXRzZWxmLgorICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgdW5hYmxlIHRvIG5vdGlmeSAoY2hlY2sgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpLgorICAgKi8KKyAgYm9vbCBub3RpZnlJT1RocmVhZCgpIHsgcmV0dXJuIGlvVGhyZWFkXy0+bm90aWZ5KHRoaXMpOyB9CisKKyAgLyoKKyAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoaXMgY29ubmVjdGlvbidzIGN1cnJlbnRseSBhc3NpZ25lZCBJTworICAgKiB0aHJlYWQuCisgICAqLworICBpbnQgZ2V0SU9UaHJlYWROdW1iZXIoKSBjb25zdCB7IHJldHVybiBpb1RocmVhZF8tPmdldFRocmVhZE51bWJlcigpOyB9CisKKyAgLy8vIEZvcmNlIGNvbm5lY3Rpb24gc2h1dGRvd24gZm9yIHRoaXMgY29ubmVjdGlvbi4KKyAgdm9pZCBmb3JjZUNsb3NlKCkgeworICAgIGFwcFN0YXRlXyA9IEFQUF9DTE9TRV9DT05ORUNUSU9OOworICAgIGlmICghbm90aWZ5SU9UaHJlYWQoKSkgeworICAgICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IFRFeGNlcHRpb24oIlRDb25uZWN0aW9uOjpmb3JjZUNsb3NlOiBmYWlsZWQgd3JpdGUgb24gbm90aWZ5IHBpcGUiKTsKKyAgICB9CisgIH0KKworICAvLy8gcmV0dXJuIHRoZSBzZXJ2ZXIgdGhpcyBjb25uZWN0aW9uIHdhcyBpbml0aWFsaXplZCBmb3IuCisgIFROb25ibG9ja2luZ1NlcnZlciogZ2V0U2VydmVyKCkgY29uc3QgeyByZXR1cm4gc2VydmVyXzsgfQorCisgIC8vLyBnZXQgc3RhdGUgb2YgY29ubmVjdGlvbi4KKyAgVEFwcFN0YXRlIGdldFN0YXRlKCkgY29uc3QgeyByZXR1cm4gYXBwU3RhdGVfOyB9CisKKyAgLy8vIHJldHVybiB0aGUgVFNvY2tldCB0cmFuc3BvcnQgd3JhcHBpbmcgdGhpcyBuZXR3b3JrIGNvbm5lY3Rpb24KKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGdldFRTb2NrZXQoKSBjb25zdCB7IHJldHVybiB0U29ja2V0XzsgfQorCisgIC8vLyByZXR1cm4gdGhlIHNlcnZlciBldmVudCBoYW5kbGVyIGlmIGFueQorICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZ2V0U2VydmVyRXZlbnRIYW5kbGVyKCkgeyByZXR1cm4gc2VydmVyRXZlbnRIYW5kbGVyXzsgfQorCisgIC8vLyByZXR1cm4gdGhlIFRocmlmdCBjb25uZWN0aW9uIGNvbnRleHQgaWYgYW55CisgIHZvaWQqIGdldENvbm5lY3Rpb25Db250ZXh0KCkgeyByZXR1cm4gY29ubmVjdGlvbkNvbnRleHRfOyB9Cit9OworCitjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uOjpUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKK3B1YmxpYzoKKyAgVGFzayhzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAorICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCwKKyAgICAgICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbikKKyAgICA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKKyAgICAgIGlucHV0XyhpbnB1dCksCisgICAgICBvdXRwdXRfKG91dHB1dCksCisgICAgICBjb25uZWN0aW9uXyhjb25uZWN0aW9uKSwKKyAgICAgIHNlcnZlckV2ZW50SGFuZGxlcl8oY29ubmVjdGlvbl8tPmdldFNlcnZlckV2ZW50SGFuZGxlcigpKSwKKyAgICAgIGNvbm5lY3Rpb25Db250ZXh0Xyhjb25uZWN0aW9uXy0+Z2V0Q29ubmVjdGlvbkNvbnRleHQoKSkge30KKworICB2b2lkIHJ1bigpIHsKKyAgICB0cnkgeworICAgICAgZm9yICg7OykgeworICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyXykgeworICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlcl8tPnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0XywgY29ubmVjdGlvbl8tPmdldFRTb2NrZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0Xywgb3V0cHV0XywgY29ubmVjdGlvbkNvbnRleHRfKQorICAgICAgICAgICAgfHwgIWlucHV0Xy0+Z2V0VHJhbnNwb3J0KCktPnBlZWsoKSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IGNsaWVudCBkaWVkOiAlcyIsIHR0eC53aGF0KCkpOworICAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6YmFkX2FsbG9jJikgeworICAgICAgR2xvYmFsT3V0cHV0KCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IGNhdWdodCBiYWRfYWxsb2MgZXhjZXB0aW9uLiIpOworICAgICAgZXhpdCgxKTsKKyAgICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgeCkgeworICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBwcm9jZXNzKCkgZXhjZXB0aW9uOiAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlaWQoeCkubmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB4LndoYXQoKSk7CisgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IHVua25vd24gZXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcuIik7CisgICAgfQorCisgICAgLy8gU2lnbmFsIGNvbXBsZXRpb24gYmFjayB0byB0aGUgbGliZXZlbnQgdGhyZWFkIHZpYSBhIHBpcGUKKyAgICBpZiAoIWNvbm5lY3Rpb25fLT5ub3RpZnlJT1RocmVhZCgpKSB7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IGZhaWxlZCB0byBub3RpZnlJT1RocmVhZCwgY2xvc2luZy4iKTsKKyAgICAgIGNvbm5lY3Rpb25fLT5zZXJ2ZXJfLT5kZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7CisgICAgICBjb25uZWN0aW9uXy0+Y2xvc2UoKTsKKyAgICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6VGFzazo6cnVuOiBmYWlsZWQgd3JpdGUgb24gbm90aWZ5IHBpcGUiKTsKKyAgICB9CisgIH0KKworICBUQ29ubmVjdGlvbiogZ2V0VENvbm5lY3Rpb24oKSB7IHJldHVybiBjb25uZWN0aW9uXzsgfQorCitwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRfOworICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXJfOworICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dF87Cit9OworCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OmluaXQoVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkKSB7CisgIGlvVGhyZWFkXyA9IGlvVGhyZWFkOworICBzZXJ2ZXJfID0gaW9UaHJlYWQtPmdldFNlcnZlcigpOworICBhcHBTdGF0ZV8gPSBBUFBfSU5JVDsKKyAgZXZlbnRGbGFnc18gPSAwOworCisgIHJlYWRCdWZmZXJQb3NfID0gMDsKKyAgcmVhZFdhbnRfID0gMDsKKworICB3cml0ZUJ1ZmZlcl8gPSBOVUxMOworICB3cml0ZUJ1ZmZlclNpemVfID0gMDsKKyAgd3JpdGVCdWZmZXJQb3NfID0gMDsKKyAgbGFyZ2VzdFdyaXRlQnVmZmVyU2l6ZV8gPSAwOworCisgIHNvY2tldFN0YXRlXyA9IFNPQ0tFVF9SRUNWX0ZSQU1JTkc7CisgIGNhbGxzRm9yUmVzaXplXyA9IDA7CisKKyAgLy8gZ2V0IGlucHV0L3RyYW5zcG9ydHMKKyAgZmFjdG9yeUlucHV0VHJhbnNwb3J0XyA9IHNlcnZlcl8tPmdldElucHV0VHJhbnNwb3J0RmFjdG9yeSgpLT5nZXRUcmFuc3BvcnQoaW5wdXRUcmFuc3BvcnRfKTsKKyAgZmFjdG9yeU91dHB1dFRyYW5zcG9ydF8gPSBzZXJ2ZXJfLT5nZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KCktPmdldFRyYW5zcG9ydChvdXRwdXRUcmFuc3BvcnRfKTsKKworICAvLyBDcmVhdGUgcHJvdG9jb2wKKyAgaWYgKHNlcnZlcl8tPmdldEhlYWRlclRyYW5zcG9ydCgpKSB7CisgICAgaW5wdXRQcm90b2NvbF8gPSBzZXJ2ZXJfLT5nZXRJbnB1dFByb3RvY29sRmFjdG9yeSgpLT5nZXRQcm90b2NvbChmYWN0b3J5SW5wdXRUcmFuc3BvcnRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeU91dHB1dFRyYW5zcG9ydF8pOworICAgIG91dHB1dFByb3RvY29sXyA9IGlucHV0UHJvdG9jb2xfOworICB9IGVsc2UgeworICAgIGlucHV0UHJvdG9jb2xfID0gc2VydmVyXy0+Z2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoKS0+Z2V0UHJvdG9jb2woZmFjdG9yeUlucHV0VHJhbnNwb3J0Xyk7CisgICAgb3V0cHV0UHJvdG9jb2xfID0gc2VydmVyXy0+Z2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KCktPmdldFByb3RvY29sKGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfKTsKKyAgfQorCisgIC8vIFNldCB1cCBmb3IgYW55IHNlcnZlciBldmVudCBoYW5kbGVyCisgIHNlcnZlckV2ZW50SGFuZGxlcl8gPSBzZXJ2ZXJfLT5nZXRFdmVudEhhbmRsZXIoKTsKKyAgaWYgKHNlcnZlckV2ZW50SGFuZGxlcl8pIHsKKyAgICBjb25uZWN0aW9uQ29udGV4dF8gPSBzZXJ2ZXJFdmVudEhhbmRsZXJfLT5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8pOworICB9IGVsc2UgeworICAgIGNvbm5lY3Rpb25Db250ZXh0XyA9IE5VTEw7CisgIH0KKworICAvLyBHZXQgdGhlIHByb2Nlc3NvcgorICBwcm9jZXNzb3JfID0gc2VydmVyXy0+Z2V0UHJvY2Vzc29yKGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8sIHRTb2NrZXRfKTsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uOjpzZXRTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldCkgeworICB0U29ja2V0XyA9IHNvY2tldDsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uOjp3b3JrU29ja2V0KCkgeworICBpbnQgZ290ID0gMCwgbGVmdCA9IDAsIHNlbnQgPSAwOworICB1aW50MzJfdCBmZXRjaCA9IDA7CisKKyAgc3dpdGNoIChzb2NrZXRTdGF0ZV8pIHsKKyAgY2FzZSBTT0NLRVRfUkVDVl9GUkFNSU5HOgorICAgIHVuaW9uIHsKKyAgICAgIHVpbnQ4X3QgYnVmW3NpemVvZih1aW50MzJfdCldOworICAgICAgdWludDMyX3Qgc2l6ZTsKKyAgICB9IGZyYW1pbmc7CisKKyAgICAvLyBpZiB3ZSd2ZSBhbHJlYWR5IHJlY2VpdmVkIHNvbWUgYnl0ZXMgd2Uga2VwdCB0aGVtIGhlcmUKKyAgICBmcmFtaW5nLnNpemUgPSByZWFkV2FudF87CisgICAgLy8gZGV0ZXJtaW5lIHNpemUgb2YgdGhpcyBmcmFtZQorICAgIHRyeSB7CisgICAgICAvLyBSZWFkIGZyb20gdGhlIHNvY2tldAorICAgICAgZmV0Y2ggPSB0U29ja2V0Xy0+cmVhZCgmZnJhbWluZy5idWZbcmVhZEJ1ZmZlclBvc19dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdChzaXplb2YoZnJhbWluZy5zaXplKSAtIHJlYWRCdWZmZXJQb3NfKSk7CisgICAgICBpZiAoZmV0Y2ggPT0gMCkgeworICAgICAgICAvLyBXaGVuZXZlciB3ZSBnZXQgaGVyZSBpdCBtZWFucyBhIHJlbW90ZSBkaXNjb25uZWN0CisgICAgICAgIGNsb3NlKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHJlYWRCdWZmZXJQb3NfICs9IGZldGNoOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHRlKSB7CisgICAgICAvL0luIE5vbmJsb2NraW5nIFNTTFNvY2tldCBzb21lIG9wZXJhdGlvbnMgbmVlZCB0byBiZSByZXRyaWVkIGFnYWluLgorICAgICAgLy9DdXJyZW50IGFwcHJvYWNoIGlzIHBhcnNpbmcgZXhjZXB0aW9uIG1lc3NhZ2UsIGJ1dCBhIGJldHRlciBzb2x1dGlvbiBuZWVkcyB0byBiZSBpbnZlc3RpZ2F0ZWQuCisgICAgICBpZighc3Ryc3RyKHRlLndoYXQoKSwgInJldHJ5IikpIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVENvbm5lY3Rpb246OndvcmtTb2NrZXQoKTogJXMiLCB0ZS53aGF0KCkpOworICAgICAgICBjbG9zZSgpOworCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmVhZEJ1ZmZlclBvc18gPCBzaXplb2YoZnJhbWluZy5zaXplKSkgeworICAgICAgLy8gbW9yZSBuZWVkZWQgYmVmb3JlIGZyYW1lIHNpemUgaXMga25vd24gLS0gc2F2ZSB3aGF0IHdlIGhhdmUgc28gZmFyCisgICAgICByZWFkV2FudF8gPSBmcmFtaW5nLnNpemU7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmVhZFdhbnRfID0gbnRvaGwoZnJhbWluZy5zaXplKTsKKyAgICBpZiAocmVhZFdhbnRfID4gc2VydmVyXy0+Z2V0TWF4RnJhbWVTaXplKCkpIHsKKyAgICAgIC8vIERvbid0IGFsbG93IGdpYW50IGZyYW1lIHNpemVzLiAgVGhpcyBwcmV2ZW50cyBiYWQgY2xpZW50cyBmcm9tCisgICAgICAvLyBjYXVzaW5nIHVzIHRvIHRyeSBhbmQgYWxsb2NhdGUgYSBnaWFudCBidWZmZXIuCisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKAorICAgICAgICAgICJUTm9uYmxvY2tpbmdTZXJ2ZXI6IGZyYW1lIHNpemUgdG9vIGxhcmdlICIKKyAgICAgICAgICAiKCUiIFBSSXUzMiAiID4gJSIgUFJJdTY0CisgICAgICAgICAgIikgZnJvbSBjbGllbnQgJXMuICIKKyAgICAgICAgICAiUmVtb3RlIHNpZGUgbm90IHVzaW5nIFRGcmFtZWRUcmFuc3BvcnQ/IiwKKyAgICAgICAgICByZWFkV2FudF8sCisgICAgICAgICAgKHVpbnQ2NF90KXNlcnZlcl8tPmdldE1heEZyYW1lU2l6ZSgpLAorICAgICAgICAgIHRTb2NrZXRfLT5nZXRTb2NrZXRJbmZvKCkuY19zdHIoKSk7CisgICAgICBjbG9zZSgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBzaXplIGtub3duOyBub3cgZ2V0IHRoZSByZXN0IG9mIHRoZSBmcmFtZQorICAgIHRyYW5zaXRpb24oKTsKKworICAgIC8vIElmIHRoZSBzb2NrZXQgaGFzIG1vcmUgZGF0YSB0aGFuIHRoZSBmcmFtZSBoZWFkZXIsIGNvbnRpbnVlIHRvIHdvcmsgb24gaXQuIFRoaXMgaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSBmb3IKKyAgICAvLyByZWd1bGFyIHNvY2tldHMsIGJlY2F1c2UgaWYgdGhlcmUgaXMgbW9yZSBkYXRhLCBsaWJldmVudCB3aWxsIGZpcmUgdGhlIGV2ZW50IGhhbmRsZXIgcmVnaXN0ZXJlZCBmb3IgcmVhZAorICAgIC8vIHJlYWRpbmVzcywgd2hpY2ggd2lsbCBpbiB0dXJuIGNhbGwgd29ya1NvY2tldCgpLiBIb3dldmVyLCBzb21lIHNvY2tldCB0eXBlcyAoc3VjaCBhcyBUU1NMU29ja2V0KSBtYXkgaGF2ZSB0aGUKKyAgICAvLyBkYXRhIHNpdHRpbmcgaW4gdGhlaXIgaW50ZXJuYWwgYnVmZmVycyBhbmQgZnJvbSBsaWJldmVudCdzIHBlcnNwZWN0aXZlLCB0aGVyZSBpcyBubyBmdXJ0aGVyIGRhdGEgYXZhaWxhYmxlLiBJbgorICAgIC8vIHRoYXQgY2FzZSwgbm90IGhhdmluZyB0aGlzIHdvcmtTb2NrZXQoKSBjYWxsIGhlcmUgd291bGQgcmVzdWx0IGluIGEgaGFuZyBhcyB3ZSB3aWxsIG5ldmVyIGdldCB0byB3b3JrIHRoZSBzb2NrZXQsCisgICAgLy8gZGVzcGl0ZSBoYXZpbmcgbW9yZSBkYXRhLgorICAgIGlmICh0U29ja2V0Xy0+aGFzUGVuZGluZ0RhdGFUb1JlYWQoKSkKKyAgICB7CisgICAgICAgIHdvcmtTb2NrZXQoKTsKKyAgICB9CisKKyAgICByZXR1cm47CisKKyAgY2FzZSBTT0NLRVRfUkVDVjoKKyAgICAvLyBJdCBpcyBhbiBlcnJvciB0byBiZSBpbiB0aGlzIHN0YXRlIGlmIHdlIGFscmVhZHkgaGF2ZSBhbGwgdGhlIGRhdGEKKyAgICBhc3NlcnQocmVhZEJ1ZmZlclBvc18gPCByZWFkV2FudF8pOworCisgICAgdHJ5IHsKKyAgICAgIC8vIFJlYWQgZnJvbSB0aGUgc29ja2V0CisgICAgICBmZXRjaCA9IHJlYWRXYW50XyAtIHJlYWRCdWZmZXJQb3NfOworICAgICAgZ290ID0gdFNvY2tldF8tPnJlYWQocmVhZEJ1ZmZlcl8gKyByZWFkQnVmZmVyUG9zXywgZmV0Y2gpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHRlKSB7CisgICAgICAvL0luIE5vbmJsb2NraW5nIFNTTFNvY2tldCBzb21lIG9wZXJhdGlvbnMgbmVlZCB0byBiZSByZXRyaWVkIGFnYWluLgorICAgICAgLy9DdXJyZW50IGFwcHJvYWNoIGlzIHBhcnNpbmcgZXhjZXB0aW9uIG1lc3NhZ2UsIGJ1dCBhIGJldHRlciBzb2x1dGlvbiBuZWVkcyB0byBiZSBpbnZlc3RpZ2F0ZWQuCisgICAgICBpZighc3Ryc3RyKHRlLndoYXQoKSwgInJldHJ5IikpIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVENvbm5lY3Rpb246OndvcmtTb2NrZXQoKTogJXMiLCB0ZS53aGF0KCkpOworICAgICAgICBjbG9zZSgpOworICAgICAgfQorCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGdvdCA+IDApIHsKKyAgICAgIC8vIE1vdmUgYWxvbmcgaW4gdGhlIGJ1ZmZlcgorICAgICAgcmVhZEJ1ZmZlclBvc18gKz0gZ290OworCisgICAgICAvLyBDaGVjayB0aGF0IHdlIGRpZCBub3Qgb3ZlcmRvIGl0CisgICAgICBhc3NlcnQocmVhZEJ1ZmZlclBvc18gPD0gcmVhZFdhbnRfKTsKKworICAgICAgLy8gV2UgYXJlIGRvbmUgcmVhZGluZywgbW92ZSBvbnRvIHRoZSBuZXh0IHN0YXRlCisgICAgICBpZiAocmVhZEJ1ZmZlclBvc18gPT0gcmVhZFdhbnRfKSB7CisgICAgICAgIHRyYW5zaXRpb24oKTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBXaGVuZXZlciB3ZSBnZXQgZG93biBoZXJlIGl0IG1lYW5zIGEgcmVtb3RlIGRpc2Nvbm5lY3QKKyAgICBjbG9zZSgpOworCisgICAgcmV0dXJuOworCisgIGNhc2UgU09DS0VUX1NFTkQ6CisgICAgLy8gU2hvdWxkIG5ldmVyIGhhdmUgcG9zaXRpb24gcGFzdCBzaXplCisgICAgYXNzZXJ0KHdyaXRlQnVmZmVyUG9zXyA8PSB3cml0ZUJ1ZmZlclNpemVfKTsKKworICAgIC8vIElmIHRoZXJlIGlzIG5vIGRhdGEgdG8gc2VuZCwgdGhlbiBsZXQgdXMgbW92ZSBvbgorICAgIGlmICh3cml0ZUJ1ZmZlclBvc18gPT0gd3JpdGVCdWZmZXJTaXplXykgeworICAgICAgR2xvYmFsT3V0cHV0KCJXQVJOSU5HOiBTZW5kIHN0YXRlIHdpdGggbm8gZGF0YSB0byBzZW5kIik7CisgICAgICB0cmFuc2l0aW9uKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGxlZnQgPSB3cml0ZUJ1ZmZlclNpemVfIC0gd3JpdGVCdWZmZXJQb3NfOworICAgICAgc2VudCA9IHRTb2NrZXRfLT53cml0ZV9wYXJ0aWFsKHdyaXRlQnVmZmVyXyArIHdyaXRlQnVmZmVyUG9zXywgbGVmdCk7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdGUpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlRDb25uZWN0aW9uOjp3b3JrU29ja2V0KCk6ICVzICIsIHRlLndoYXQoKSk7CisgICAgICBjbG9zZSgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdyaXRlQnVmZmVyUG9zXyArPSBzZW50OworCisgICAgLy8gRGlkIHdlIG92ZXJkbyBpdD8KKyAgICBhc3NlcnQod3JpdGVCdWZmZXJQb3NfIDw9IHdyaXRlQnVmZmVyU2l6ZV8pOworCisgICAgLy8gV2UgYXJlIGRvbmUhCisgICAgaWYgKHdyaXRlQnVmZmVyUG9zXyA9PSB3cml0ZUJ1ZmZlclNpemVfKSB7CisgICAgICB0cmFuc2l0aW9uKCk7CisgICAgfQorCisgICAgcmV0dXJuOworCisgIGRlZmF1bHQ6CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVW5leHBlY3RlZCBTb2NrZXQgU3RhdGUgJWQiLCBzb2NrZXRTdGF0ZV8pOworICAgIGFzc2VydCgwKTsKKyAgfQorfQorCitib29sIFROb25ibG9ja2luZ1NlcnZlcjo6Z2V0SGVhZGVyVHJhbnNwb3J0KCkgeworICAvLyBDdXJyZW50bHkgaWYgdGhlcmUgaXMgbm8gb3V0cHV0IHByb3RvY29sIGZhY3RvcnksCisgIC8vIHdlIGFzc3VtZSBoZWFkZXIgdHJhbnNwb3J0ICh3aXRob3V0IGhhdmluZyB0byBjcmVhdGUKKyAgLy8gYSBuZXcgdHJhbnNwb3J0IGFuZCBjaGVjaykKKyAgcmV0dXJuIGdldE91dHB1dFByb3RvY29sRmFjdG9yeSgpID09IE5VTEw7Cit9CisKKy8qKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gdHJhbnNpdGlvbnMgZnJvbSBvbmUgc3RhdGUgaW50bworICogYW5vdGhlci4gVGhpcyBtZWFucyB0aGF0IGl0IGhhcyBmaW5pc2hlZCB3cml0aW5nIHRoZSBkYXRhIHRoYXQgaXQgbmVlZGVkCisgKiB0bywgb3IgZmluaXNoZWQgcmVjZWl2aW5nIHRoZSBkYXRhIHRoYXQgaXQgbmVlZGVkIHRvLgorICovCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OnRyYW5zaXRpb24oKSB7CisgIC8vIGVuc3VyZSB0aGlzIGNvbm5lY3Rpb24gaXMgYWN0aXZlIHJpZ2h0IG5vdworICBhc3NlcnQoaW9UaHJlYWRfKTsKKyAgYXNzZXJ0KHNlcnZlcl8pOworCisgIC8vIFN3aXRjaCB1cG9uIHRoZSBzdGF0ZSB0aGF0IHdlIGFyZSBjdXJyZW50bHkgaW4gYW5kIG1vdmUgdG8gYSBuZXcgc3RhdGUKKyAgc3dpdGNoIChhcHBTdGF0ZV8pIHsKKworICBjYXNlIEFQUF9SRUFEX1JFUVVFU1Q6CisgICAgLy8gV2UgYXJlIGRvbmUgcmVhZGluZyB0aGUgcmVxdWVzdCwgcGFja2FnZSB0aGUgcmVhZCBidWZmZXIgaW50byB0cmFuc3BvcnQKKyAgICAvLyBhbmQgZ2V0IGJhY2sgc29tZSBkYXRhIGZyb20gdGhlIGRpc3BhdGNoIGZ1bmN0aW9uCisgICAgaWYgKHNlcnZlcl8tPmdldEhlYWRlclRyYW5zcG9ydCgpKSB7CisgICAgICBpbnB1dFRyYW5zcG9ydF8tPnJlc2V0QnVmZmVyKHJlYWRCdWZmZXJfLCByZWFkQnVmZmVyUG9zXyk7CisgICAgICBvdXRwdXRUcmFuc3BvcnRfLT5yZXNldEJ1ZmZlcigpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBXZSBzYXZlZCByb29tIGZvciB0aGUgZnJhbWluZyBzaXplIGluIGNhc2UgaGVhZGVyIHRyYW5zcG9ydCBuZWVkZWQgaXQsCisgICAgICAvLyBidXQganVzdCBza2lwIGl0IGZvciB0aGUgbm9uLWhlYWRlciBjYXNlCisgICAgICBpbnB1dFRyYW5zcG9ydF8tPnJlc2V0QnVmZmVyKHJlYWRCdWZmZXJfICsgNCwgcmVhZEJ1ZmZlclBvc18gLSA0KTsKKyAgICAgIG91dHB1dFRyYW5zcG9ydF8tPnJlc2V0QnVmZmVyKCk7CisKKyAgICAgIC8vIFByZXBlbmQgZm91ciBieXRlcyBvZiBibGFuayBzcGFjZSB0byB0aGUgYnVmZmVyIHNvIHdlIGNhbgorICAgICAgLy8gd3JpdGUgdGhlIGZyYW1lIHNpemUgdGhlcmUgbGF0ZXIuCisgICAgICBvdXRwdXRUcmFuc3BvcnRfLT5nZXRXcml0ZVB0cig0KTsKKyAgICAgIG91dHB1dFRyYW5zcG9ydF8tPndyb3RlQnl0ZXMoNCk7CisgICAgfQorCisgICAgc2VydmVyXy0+aW5jcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOworCisgICAgaWYgKHNlcnZlcl8tPmlzVGhyZWFkUG9vbFByb2Nlc3NpbmcoKSkgeworICAgICAgLy8gV2UgYXJlIHNldHRpbmcgdXAgYSBUYXNrIHRvIGRvIHRoaXMgd29yayBhbmQgd2Ugd2lsbCB3YWl0IG9uIGl0CisKKyAgICAgIC8vIENyZWF0ZSB0YXNrIGFuZCBkaXNwYXRjaCB0byB0aGUgdGhyZWFkIG1hbmFnZXIKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayA9IHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4oCisgICAgICAgICAgbmV3IFRhc2socHJvY2Vzc29yXywgaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXywgdGhpcykpOworICAgICAgLy8gVGhlIGFwcGxpY2F0aW9uIGlzIG5vdyB3YWl0aW5nIG9uIHRoZSB0YXNrIHRvIGZpbmlzaAorICAgICAgYXBwU3RhdGVfID0gQVBQX1dBSVRfVEFTSzsKKworICAgICAgLy8gU2V0IHRoaXMgY29ubmVjdGlvbiBpZGxlIHNvIHRoYXQgbGliZXZlbnQgZG9lc24ndCBwcm9jZXNzIG1vcmUKKyAgICAgIC8vIGRhdGEgb24gaXQgd2hpbGUgd2UncmUgc3RpbGwgd2FpdGluZyBmb3IgdGhlIHRocmVhZG1hbmFnZXIgdG8KKyAgICAgIC8vIGZpbmlzaCB0aGlzIHRhc2sKKyAgICAgIHNldElkbGUoKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgc2VydmVyXy0+YWRkVGFzayh0YXNrKTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiYgaXNlKSB7CisgICAgICAgIC8vIFRoZSBUaHJlYWRNYW5hZ2VyIGlzIG5vdCByZWFkeSB0byBoYW5kbGUgYW55IG1vcmUgdGFza3MgKGl0J3MgcHJvYmFibHkgc2h1dHRpbmcgZG93bikuCisgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjogU2VydmVyOjpwcm9jZXNzKCkgJXMiLCBpc2Uud2hhdCgpKTsKKyAgICAgICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOworICAgICAgICBjbG9zZSgpOworICAgICAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24mIHRvKSB7CisgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIltFUlJPUl0gVGltZWRPdXRFeGNlcHRpb246IFNlcnZlcjo6cHJvY2VzcygpICVzIiwgdG8ud2hhdCgpKTsKKyAgICAgICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOworICAgICAgICBjbG9zZSgpOworICAgICAgfQorCisgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXJfKSB7CisgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyXy0+cHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHRfLCBnZXRUU29ja2V0KCkpOworICAgICAgICB9CisgICAgICAgIC8vIEludm9rZSB0aGUgcHJvY2Vzc29yCisgICAgICAgIHByb2Nlc3Nvcl8tPnByb2Nlc3MoaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXywgY29ubmVjdGlvbkNvbnRleHRfKTsKKyAgICAgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgeworICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKAorICAgICAgICAgICAgIlROb25ibG9ja2luZ1NlcnZlciB0cmFuc3BvcnQgZXJyb3IgaW4gIgorICAgICAgICAgICAgInByb2Nlc3MoKTogJXMiLAorICAgICAgICAgICAgdHR4LndoYXQoKSk7CisgICAgICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIHgpIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiU2VydmVyOjpwcm9jZXNzKCkgdW5jYXVnaHQgZXhjZXB0aW9uOiAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVpZCh4KS5uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC53aGF0KCkpOworICAgICAgICBzZXJ2ZXJfLT5kZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7CisgICAgICAgIGNsb3NlKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0gY2F0Y2ggKC4uLikgeworICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJTZXJ2ZXI6OnByb2Nlc3MoKSB1bmtub3duIGV4Y2VwdGlvbiIpOworICAgICAgICBzZXJ2ZXJfLT5kZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7CisgICAgICAgIGNsb3NlKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gZmFsbHRocm91Z2gKKworICAvLyBJbnRlbnRpb25hbGx5IGZhbGwgdGhyb3VnaCBoZXJlLCB0aGUgY2FsbCB0byBwcm9jZXNzIGhhcyB3cml0dGVuIGludG8KKyAgLy8gdGhlIHdyaXRlQnVmZmVyXworCisgIGNhc2UgQVBQX1dBSVRfVEFTSzoKKyAgICAvLyBXZSBoYXZlIG5vdyBmaW5pc2hlZCBwcm9jZXNzaW5nIGEgdGFzayBhbmQgdGhlIHJlc3VsdCBoYXMgYmVlbiB3cml0dGVuCisgICAgLy8gaW50byB0aGUgb3V0cHV0VHJhbnNwb3J0Xywgc28gd2UgZ3JhYiBpdHMgY29udGVudHMgYW5kIHBsYWNlIHRoZW0gaW50bworICAgIC8vIHRoZSB3cml0ZUJ1ZmZlcl8gZm9yIGFjdHVhbCB3cml0aW5nIGJ5IHRoZSBsaWJldmVudCB0aHJlYWQKKworICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKKyAgICAvLyBHZXQgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uCisgICAgb3V0cHV0VHJhbnNwb3J0Xy0+Z2V0QnVmZmVyKCZ3cml0ZUJ1ZmZlcl8sICZ3cml0ZUJ1ZmZlclNpemVfKTsKKworICAgIC8vIElmIHRoZSBmdW5jdGlvbiBjYWxsIGdlbmVyYXRlZCByZXR1cm4gZGF0YSwgdGhlbiBtb3ZlIGludG8gdGhlIHNlbmQKKyAgICAvLyBzdGF0ZSBhbmQgZ2V0IGdvaW5nCisgICAgLy8gNCBieXRlcyB3ZXJlIHJlc2VydmVkIGZvciBmcmFtZSBzaXplCisgICAgaWYgKHdyaXRlQnVmZmVyU2l6ZV8gPiA0KSB7CisKKyAgICAgIC8vIE1vdmUgaW50byB3cml0ZSBzdGF0ZQorICAgICAgd3JpdGVCdWZmZXJQb3NfID0gMDsKKyAgICAgIHNvY2tldFN0YXRlXyA9IFNPQ0tFVF9TRU5EOworCisgICAgICAvLyBQdXQgdGhlIGZyYW1lIHNpemUgaW50byB0aGUgd3JpdGUgYnVmZmVyCisgICAgICBpbnQzMl90IGZyYW1lU2l6ZSA9IChpbnQzMl90KWh0b25sKHdyaXRlQnVmZmVyU2l6ZV8gLSA0KTsKKyAgICAgIG1lbWNweSh3cml0ZUJ1ZmZlcl8sICZmcmFtZVNpemUsIDQpOworCisgICAgICAvLyBTb2NrZXQgaW50byB3cml0ZSBtb2RlCisgICAgICBhcHBTdGF0ZV8gPSBBUFBfU0VORF9SRVNVTFQ7CisgICAgICBzZXRXcml0ZSgpOworCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgcmVxdWVzdCB3YXMgb25ld2F5IGFuZCB3ZSBzaG91bGQgZmFsbCB0aHJvdWdoCisgICAgLy8gcmlnaHQgYmFjayBpbnRvIHRoZSByZWFkIGZyYW1lIGhlYWRlciBzdGF0ZQorICAgIGdvdG8gTEFCRUxfQVBQX0lOSVQ7CisKKyAgY2FzZSBBUFBfU0VORF9SRVNVTFQ6CisgICAgLy8gaXQncyBub3cgc2FmZSB0byBwZXJmb3JtIGJ1ZmZlciBzaXplIGhvdXNla2VlcGluZy4KKyAgICBpZiAod3JpdGVCdWZmZXJTaXplXyA+IGxhcmdlc3RXcml0ZUJ1ZmZlclNpemVfKSB7CisgICAgICBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXyA9IHdyaXRlQnVmZmVyU2l6ZV87CisgICAgfQorICAgIGlmIChzZXJ2ZXJfLT5nZXRSZXNpemVCdWZmZXJFdmVyeU4oKSA+IDAKKyAgICAgICAgJiYgKytjYWxsc0ZvclJlc2l6ZV8gPj0gc2VydmVyXy0+Z2V0UmVzaXplQnVmZmVyRXZlcnlOKCkpIHsKKyAgICAgIGNoZWNrSWRsZUJ1ZmZlck1lbUxpbWl0KHNlcnZlcl8tPmdldElkbGVSZWFkQnVmZmVyTGltaXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl8tPmdldElkbGVXcml0ZUJ1ZmZlckxpbWl0KCkpOworICAgICAgY2FsbHNGb3JSZXNpemVfID0gMDsKKyAgICB9CisgICAgLy8gZmFsbHRocm91Z2gKKworICAvLyBOLkIuOiBXZSBhbHNvIGludGVudGlvbmFsbHkgZmFsbCB0aHJvdWdoIGhlcmUgaW50byB0aGUgSU5JVCBzdGF0ZSEKKworICBMQUJFTF9BUFBfSU5JVDoKKyAgY2FzZSBBUFBfSU5JVDoKKworICAgIC8vIENsZWFyIHdyaXRlIGJ1ZmZlciB2YXJpYWJsZXMKKyAgICB3cml0ZUJ1ZmZlcl8gPSBOVUxMOworICAgIHdyaXRlQnVmZmVyUG9zXyA9IDA7CisgICAgd3JpdGVCdWZmZXJTaXplXyA9IDA7CisKKyAgICAvLyBJbnRvIHJlYWQ0IHN0YXRlIHdlIGdvCisgICAgc29ja2V0U3RhdGVfID0gU09DS0VUX1JFQ1ZfRlJBTUlORzsKKyAgICBhcHBTdGF0ZV8gPSBBUFBfUkVBRF9GUkFNRV9TSVpFOworCisgICAgcmVhZEJ1ZmZlclBvc18gPSAwOworCisgICAgLy8gUmVnaXN0ZXIgcmVhZCBldmVudAorICAgIHNldFJlYWQoKTsKKworICAgIHJldHVybjsKKworICBjYXNlIEFQUF9SRUFEX0ZSQU1FX1NJWkU6CisgICAgcmVhZFdhbnRfICs9IDQ7CisKKyAgICAvLyBXZSBqdXN0IHJlYWQgdGhlIHJlcXVlc3QgbGVuZ3RoCisgICAgLy8gRG91YmxlIHRoZSBidWZmZXIgc2l6ZSB1bnRpbCBpdCBpcyBiaWcgZW5vdWdoCisgICAgaWYgKHJlYWRXYW50XyA+IHJlYWRCdWZmZXJTaXplXykgeworICAgICAgaWYgKHJlYWRCdWZmZXJTaXplXyA9PSAwKSB7CisgICAgICAgIHJlYWRCdWZmZXJTaXplXyA9IDE7CisgICAgICB9CisgICAgICB1aW50MzJfdCBuZXdTaXplID0gcmVhZEJ1ZmZlclNpemVfOworICAgICAgd2hpbGUgKHJlYWRXYW50XyA+IG5ld1NpemUpIHsKKyAgICAgICAgbmV3U2l6ZSAqPSAyOworICAgICAgfQorCisgICAgICB1aW50OF90KiBuZXdCdWZmZXIgPSAodWludDhfdCopc3RkOjpyZWFsbG9jKHJlYWRCdWZmZXJfLCBuZXdTaXplKTsKKyAgICAgIGlmIChuZXdCdWZmZXIgPT0gTlVMTCkgeworICAgICAgICAvLyBub3RoaW5nIGVsc2UgdG8gYmUgZG9uZS4uLgorICAgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworICAgICAgfQorICAgICAgcmVhZEJ1ZmZlcl8gPSBuZXdCdWZmZXI7CisgICAgICByZWFkQnVmZmVyU2l6ZV8gPSBuZXdTaXplOworICAgIH0KKworICAgIHJlYWRCdWZmZXJQb3NfID0gNDsKKyAgICAqKCh1aW50MzJfdCopcmVhZEJ1ZmZlcl8pID0gaHRvbmwocmVhZFdhbnRfIC0gNCk7CisKKyAgICAvLyBNb3ZlIGludG8gcmVhZCByZXF1ZXN0IHN0YXRlCisgICAgc29ja2V0U3RhdGVfID0gU09DS0VUX1JFQ1Y7CisgICAgYXBwU3RhdGVfID0gQVBQX1JFQURfUkVRVUVTVDsKKworICAgIHJldHVybjsKKworICBjYXNlIEFQUF9DTE9TRV9DT05ORUNUSU9OOgorICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKKyAgICBjbG9zZSgpOworICAgIHJldHVybjsKKworICBkZWZhdWx0OgorICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlVuZXhwZWN0ZWQgQXBwbGljYXRpb24gU3RhdGUgJWQiLCBhcHBTdGF0ZV8pOworICAgIGFzc2VydCgwKTsKKyAgfQorfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OnNldEZsYWdzKHNob3J0IGV2ZW50RmxhZ3MpIHsKKyAgLy8gQ2F0Y2ggdGhlIGRvIG5vdGhpbmcgY2FzZQorICBpZiAoZXZlbnRGbGFnc18gPT0gZXZlbnRGbGFncykgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIERlbGV0ZSBhIHByZXZpb3VzbHkgZXhpc3RpbmcgZXZlbnQKKyAgaWYgKGV2ZW50RmxhZ3NfICYmIGV2ZW50X2RlbCgmZXZlbnRfKSA9PSAtMSkgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRDb25uZWN0aW9uOjpzZXRGbGFncygpIGV2ZW50X2RlbCIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBVcGRhdGUgaW4gbWVtb3J5IHN0cnVjdHVyZQorICBldmVudEZsYWdzXyA9IGV2ZW50RmxhZ3M7CisKKyAgLy8gRG8gbm90IGNhbGwgZXZlbnRfc2V0IGlmIHRoZXJlIGFyZSBubyBmbGFncworICBpZiAoIWV2ZW50RmxhZ3NfKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLyoKKyAgICogZXZlbnRfc2V0OgorICAgKgorICAgKiBQcmVwYXJlcyB0aGUgZXZlbnQgc3RydWN0dXJlICZldmVudCB0byBiZSB1c2VkIGluIGZ1dHVyZSBjYWxscyB0bworICAgKiBldmVudF9hZGQoKSBhbmQgZXZlbnRfZGVsKCkuICBUaGUgZXZlbnQgd2lsbCBiZSBwcmVwYXJlZCB0byBjYWxsIHRoZQorICAgKiBldmVudEhhbmRsZXIgdXNpbmcgdGhlICdzb2NrJyBmaWxlIGRlc2NyaXB0b3IgdG8gbW9uaXRvciBldmVudHMuCisgICAqCisgICAqIFRoZSBldmVudHMgY2FuIGJlIGVpdGhlciBFVl9SRUFELCBFVl9XUklURSwgb3IgYm90aCwgaW5kaWNhdGluZworICAgKiB0aGF0IGFuIGFwcGxpY2F0aW9uIGNhbiByZWFkIG9yIHdyaXRlIGZyb20gdGhlIGZpbGUgcmVzcGVjdGl2ZWx5IHdpdGhvdXQKKyAgICogYmxvY2tpbmcuCisgICAqCisgICAqIFRoZSBldmVudEhhbmRsZXIgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIHRoYXQgdHJpZ2dlcmVkCisgICAqIHRoZSBldmVudCBhbmQgdGhlIHR5cGUgb2YgZXZlbnQgd2hpY2ggd2lsbCBiZSBvbmUgb2Y6IEVWX1RJTUVPVVQsCisgICAqIEVWX1NJR05BTCwgRVZfUkVBRCwgRVZfV1JJVEUuCisgICAqCisgICAqIFRoZSBhZGRpdGlvbmFsIGZsYWcgRVZfUEVSU0lTVCBtYWtlcyBhbiBldmVudF9hZGQoKSBwZXJzaXN0ZW50IHVudGlsCisgICAqIGV2ZW50X2RlbCgpIGhhcyBiZWVuIGNhbGxlZC4KKyAgICoKKyAgICogT25jZSBpbml0aWFsaXplZCwgdGhlICZldmVudCBzdHJ1Y3QgY2FuIGJlIHVzZWQgcmVwZWF0ZWRseSB3aXRoCisgICAqIGV2ZW50X2FkZCgpIGFuZCBldmVudF9kZWwoKSBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSByZWluaXRpYWxpemVkIHVubGVzcworICAgKiB0aGUgZXZlbnRIYW5kbGVyIGFuZC9vciB0aGUgYXJndW1lbnQgdG8gaXQgYXJlIHRvIGJlIGNoYW5nZWQuICBIb3dldmVyLAorICAgKiB3aGVuIGFuIGV2IHN0cnVjdHVyZSBoYXMgYmVlbiBhZGRlZCB0byBsaWJldmVudCB1c2luZyBldmVudF9hZGQoKSB0aGUKKyAgICogc3RydWN0dXJlIG11c3QgcGVyc2lzdCB1bnRpbCB0aGUgZXZlbnQgb2NjdXJzIChhc3N1bWluZyBFVl9QRVJTSVNUCisgICAqIGlzIG5vdCBzZXQpIG9yIGlzIHJlbW92ZWQgdXNpbmcgZXZlbnRfZGVsKCkuICBZb3UgbWF5IG5vdCByZXVzZSB0aGUgc2FtZQorICAgKiBldiBzdHJ1Y3R1cmUgZm9yIG11bHRpcGxlIG1vbml0b3JlZCBkZXNjcmlwdG9yczsgZWFjaCBkZXNjcmlwdG9yIG5lZWRzCisgICAqIGl0cyBvd24gZXYuCisgICAqLworICBldmVudF9zZXQoJmV2ZW50XywgdFNvY2tldF8tPmdldFNvY2tldEZEKCksIGV2ZW50RmxhZ3NfLCBUQ29ubmVjdGlvbjo6ZXZlbnRIYW5kbGVyLCB0aGlzKTsKKyAgZXZlbnRfYmFzZV9zZXQoaW9UaHJlYWRfLT5nZXRFdmVudEJhc2UoKSwgJmV2ZW50Xyk7CisKKyAgLy8gQWRkIHRoZSBldmVudAorICBpZiAoZXZlbnRfYWRkKCZldmVudF8sIDApID09IC0xKSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVENvbm5lY3Rpb246OnNldEZsYWdzKCk6IGNvdWxkIG5vdCBldmVudF9hZGQiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgIH0KK30KKworLyoqCisgKiBDbG9zZXMgYSBjb25uZWN0aW9uCisgKi8KK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbjo6Y2xvc2UoKSB7CisgIHNldElkbGUoKTsKKworICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyXykgeworICAgIHNlcnZlckV2ZW50SGFuZGxlcl8tPmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHRfLCBpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfKTsKKyAgfQorICBpb1RocmVhZF8gPSBOVUxMOworCisgIC8vIENsb3NlIHRoZSBzb2NrZXQKKyAgdFNvY2tldF8tPmNsb3NlKCk7CisKKyAgLy8gY2xvc2UgYW55IGZhY3RvcnkgcHJvZHVjZWQgdHJhbnNwb3J0cworICBmYWN0b3J5SW5wdXRUcmFuc3BvcnRfLT5jbG9zZSgpOworICBmYWN0b3J5T3V0cHV0VHJhbnNwb3J0Xy0+Y2xvc2UoKTsKKworICAvLyByZWxlYXNlIHByb2Nlc3NvciBhbmQgaGFuZGxlcgorICBwcm9jZXNzb3JfLnJlc2V0KCk7CisKKyAgLy8gR2l2ZSB0aGlzIG9iamVjdCBiYWNrIHRvIHRoZSBzZXJ2ZXIgdGhhdCBvd25zIGl0CisgIHNlcnZlcl8tPnJldHVybkNvbm5lY3Rpb24odGhpcyk7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbjo6Y2hlY2tJZGxlQnVmZmVyTWVtTGltaXQoc2l6ZV90IHJlYWRMaW1pdCwgc2l6ZV90IHdyaXRlTGltaXQpIHsKKyAgaWYgKHJlYWRMaW1pdCA+IDAgJiYgcmVhZEJ1ZmZlclNpemVfID4gcmVhZExpbWl0KSB7CisgICAgZnJlZShyZWFkQnVmZmVyXyk7CisgICAgcmVhZEJ1ZmZlcl8gPSBOVUxMOworICAgIHJlYWRCdWZmZXJTaXplXyA9IDA7CisgIH0KKworICBpZiAod3JpdGVMaW1pdCA+IDAgJiYgbGFyZ2VzdFdyaXRlQnVmZmVyU2l6ZV8gPiB3cml0ZUxpbWl0KSB7CisgICAgLy8ganVzdCBzdGFydCBvdmVyCisgICAgb3V0cHV0VHJhbnNwb3J0Xy0+cmVzZXRCdWZmZXIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNlcnZlcl8tPmdldFdyaXRlQnVmZmVyRGVmYXVsdFNpemUoKSkpOworICAgIGxhcmdlc3RXcml0ZUJ1ZmZlclNpemVfID0gMDsKKyAgfQorfQorCitUTm9uYmxvY2tpbmdTZXJ2ZXI6On5UTm9uYmxvY2tpbmdTZXJ2ZXIoKSB7CisgIC8vIENsb3NlIGFueSBhY3RpdmUgY29ubmVjdGlvbnMgKG1vdmVzIHRoZW0gdG8gdGhlIGlkbGUgY29ubmVjdGlvbiBzdGFjaykKKyAgd2hpbGUgKGFjdGl2ZUNvbm5lY3Rpb25zXy5zaXplKCkpIHsKKyAgICBhY3RpdmVDb25uZWN0aW9uc18uZnJvbnQoKS0+Y2xvc2UoKTsKKyAgfQorICAvLyBDbGVhbiB1cCB1bnVzZWQgVENvbm5lY3Rpb24gb2JqZWN0cyBpbiBjb25uZWN0aW9uU3RhY2tfCisgIHdoaWxlICghY29ubmVjdGlvblN0YWNrXy5lbXB0eSgpKSB7CisgICAgVENvbm5lY3Rpb24qIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uU3RhY2tfLnRvcCgpOworICAgIGNvbm5lY3Rpb25TdGFja18ucG9wKCk7CisgICAgZGVsZXRlIGNvbm5lY3Rpb247CisgIH0KKyAgLy8gVGhlIFROb25ibG9ja2luZ0lPVGhyZWFkIG9iamVjdHMgaGF2ZSBzaGFyZWRfcHRycyB0byB0aGUgVGhyZWFkCisgIC8vIG9iamVjdHMgYW5kIHRoZSBUaHJlYWQgb2JqZWN0cyBoYXZlIHNoYXJlZF9wdHJzIHRvIHRoZSBUTm9uYmxvY2tpbmdJT1RocmVhZAorICAvLyBvYmplY3RzIChhcyBydW5uYWJsZSkgc28gdGhlc2Ugb2JqZWN0cyB3aWxsIG5ldmVyIGRlYWxsb2NhdGUgd2l0aG91dCBoZWxwLgorICB3aGlsZSAoIWlvVGhyZWFkc18uZW1wdHkoKSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdJT1RocmVhZD4gaW90ID0gaW9UaHJlYWRzXy5iYWNrKCk7CisgICAgaW9UaHJlYWRzXy5wb3BfYmFjaygpOworICAgIGlvdC0+c2V0VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+KCkpOworICB9Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBjb25uZWN0aW9uIGVpdGhlciBieSByZXVzaW5nIGFuIG9iamVjdCBvZmYgdGhlIHN0YWNrIG9yCisgKiBieSBhbGxvY2F0aW5nIGEgbmV3IG9uZSBlbnRpcmVseQorICovCitUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uKiBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmNyZWF0ZUNvbm5lY3Rpb24oc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldCkgeworICAvLyBDaGVjayB0aGUgc3RhY2sKKyAgR3VhcmQgZyhjb25uTXV0ZXhfKTsKKworICAvLyBwaWNrIGFuIElPIHRocmVhZCB0byBoYW5kbGUgdGhpcyBjb25uZWN0aW9uIC0tIGN1cnJlbnRseSByb3VuZCByb2JpbgorICBhc3NlcnQobmV4dElPVGhyZWFkXyA8IGlvVGhyZWFkc18uc2l6ZSgpKTsKKyAgaW50IHNlbGVjdGVkVGhyZWFkSWR4ID0gbmV4dElPVGhyZWFkXzsKKyAgbmV4dElPVGhyZWFkXyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigobmV4dElPVGhyZWFkXyArIDEpICUgaW9UaHJlYWRzXy5zaXplKCkpOworCisgIFROb25ibG9ja2luZ0lPVGhyZWFkKiBpb1RocmVhZCA9IGlvVGhyZWFkc19bc2VsZWN0ZWRUaHJlYWRJZHhdLmdldCgpOworCisgIC8vIENoZWNrIHRoZSBjb25uZWN0aW9uIHN0YWNrIHRvIHNlZSBpZiB3ZSBjYW4gcmUtdXNlCisgIFRDb25uZWN0aW9uKiByZXN1bHQgPSBOVUxMOworICBpZiAoY29ubmVjdGlvblN0YWNrXy5lbXB0eSgpKSB7CisgICAgcmVzdWx0ID0gbmV3IFRDb25uZWN0aW9uKHNvY2tldCwgaW9UaHJlYWQpOworICAgICsrbnVtVENvbm5lY3Rpb25zXzsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSBjb25uZWN0aW9uU3RhY2tfLnRvcCgpOworICAgIGNvbm5lY3Rpb25TdGFja18ucG9wKCk7CisgICAgcmVzdWx0LT5zZXRTb2NrZXQoc29ja2V0KTsKKyAgICByZXN1bHQtPmluaXQoaW9UaHJlYWQpOworICB9CisgIGFjdGl2ZUNvbm5lY3Rpb25zXy5wdXNoX2JhY2socmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgY29ubmVjdGlvbiB0byB0aGUgc3RhY2sKKyAqLwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OnJldHVybkNvbm5lY3Rpb24oVENvbm5lY3Rpb24qIGNvbm5lY3Rpb24pIHsKKyAgR3VhcmQgZyhjb25uTXV0ZXhfKTsKKworICBhY3RpdmVDb25uZWN0aW9uc18uZXJhc2Uoc3RkOjpyZW1vdmUoYWN0aXZlQ29ubmVjdGlvbnNfLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVDb25uZWN0aW9uc18uZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUNvbm5lY3Rpb25zXy5lbmQoKSk7CisKKyAgaWYgKGNvbm5lY3Rpb25TdGFja0xpbWl0XyAmJiAoY29ubmVjdGlvblN0YWNrXy5zaXplKCkgPj0gY29ubmVjdGlvblN0YWNrTGltaXRfKSkgeworICAgIGRlbGV0ZSBjb25uZWN0aW9uOworICAgIC0tbnVtVENvbm5lY3Rpb25zXzsKKyAgfSBlbHNlIHsKKyAgICBjb25uZWN0aW9uLT5jaGVja0lkbGVCdWZmZXJNZW1MaW1pdChpZGxlUmVhZEJ1ZmZlckxpbWl0XywgaWRsZVdyaXRlQnVmZmVyTGltaXRfKTsKKyAgICBjb25uZWN0aW9uU3RhY2tfLnB1c2goY29ubmVjdGlvbik7CisgIH0KK30KKworLyoqCisgKiBTZXJ2ZXIgc29ja2V0IGhhZCBzb21ldGhpbmcgaGFwcGVuLiAgV2UgYWNjZXB0IGFsbCB3YWl0aW5nIGNsaWVudAorICogY29ubmVjdGlvbnMgb24gZmQgYW5kIGFzc2lnbiBUQ29ubmVjdGlvbiBvYmplY3RzIHRvIGhhbmRsZSB0aG9zZSByZXF1ZXN0cy4KKyAqLwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmhhbmRsZUV2ZW50KFRIUklGVF9TT0NLRVQgZmQsIHNob3J0IHdoaWNoKSB7CisgICh2b2lkKXdoaWNoOworICAvLyBNYWtlIHN1cmUgdGhhdCBsaWJldmVudCBkaWRuJ3QgbWVzcyB1cCB0aGUgc29ja2V0IGhhbmRsZXMKKyAgYXNzZXJ0KGZkID09IHNlcnZlclNvY2tldF8pOworCisgIC8vIEdvaW5nIHRvIGFjY2VwdCBhIG5ldyBjbGllbnQgc29ja2V0CisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBjbGllbnRTb2NrZXQ7CisKKyAgY2xpZW50U29ja2V0ID0gc2VydmVyVHJhbnNwb3J0Xy0+YWNjZXB0KCk7CisgIGlmIChjbGllbnRTb2NrZXQpIHsKKyAgICAvLyBJZiB3ZSdyZSBvdmVybG9hZGVkLCB0YWtlIGFjdGlvbiBoZXJlCisgICAgaWYgKG92ZXJsb2FkQWN0aW9uXyAhPSBUX09WRVJMT0FEX05PX0FDVElPTiAmJiBzZXJ2ZXJPdmVybG9hZGVkKCkpIHsKKyAgICAgIEd1YXJkIGcoY29ubk11dGV4Xyk7CisgICAgICBuQ29ubmVjdGlvbnNEcm9wcGVkXysrOworICAgICAgblRvdGFsQ29ubmVjdGlvbnNEcm9wcGVkXysrOworICAgICAgaWYgKG92ZXJsb2FkQWN0aW9uXyA9PSBUX09WRVJMT0FEX0NMT1NFX09OX0FDQ0VQVCkgeworICAgICAgICBjbGllbnRTb2NrZXQtPmNsb3NlKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0gZWxzZSBpZiAob3ZlcmxvYWRBY3Rpb25fID09IFRfT1ZFUkxPQURfRFJBSU5fVEFTS19RVUVVRSkgeworICAgICAgICBpZiAoIWRyYWluUGVuZGluZ1Rhc2soKSkgeworICAgICAgICAgIC8vIE5vdGhpbmcgbGVmdCB0byBkaXNjYXJkLCBzbyB3ZSBkcm9wIGNvbm5lY3Rpb24gaW5zdGVhZC4KKyAgICAgICAgICBjbGllbnRTb2NrZXQtPmNsb3NlKCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgbmV3IFRDb25uZWN0aW9uIGZvciB0aGlzIGNsaWVudCBzb2NrZXQuCisgICAgVENvbm5lY3Rpb24qIGNsaWVudENvbm5lY3Rpb24gPSBjcmVhdGVDb25uZWN0aW9uKGNsaWVudFNvY2tldCk7CisKKyAgICAvLyBGYWlsIGZhc3QgaWYgd2UgY291bGQgbm90IGNyZWF0ZSBhIFRDb25uZWN0aW9uIG9iamVjdAorICAgIGlmIChjbGllbnRDb25uZWN0aW9uID09IE5VTEwpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInRocmlmdFNlcnZlckV2ZW50SGFuZGxlcjogZmFpbGVkIFRDb25uZWN0aW9uIGZhY3RvcnkiKTsKKyAgICAgIGNsaWVudFNvY2tldC0+Y2xvc2UoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEVpdGhlciBub3RpZnkgdGhlIGlvVGhyZWFkIHRoYXQgaXMgYXNzaWduZWQgdGhpcyBjb25uZWN0aW9uIHRvCisgICAgICogc3RhcnQgcHJvY2Vzc2luZywgb3IgaWYgaXQgaXMgdXMsIHdlJ2xsIGp1c3QgYXNrIHRoaXMKKyAgICAgKiBjb25uZWN0aW9uIHRvIGRvIGl0cyBpbml0aWFsIHN0YXRlIGNoYW5nZSBoZXJlLgorICAgICAqCisgICAgICogKFdlIG5lZWQgdG8gYXZvaWQgd3JpdGluZyB0byBvdXIgb3duIG5vdGlmaWNhdGlvbiBwaXBlLCB0bworICAgICAqIGF2b2lkIHBvc3NpYmxlIGRlYWRsb2NrcyBpZiB0aGUgcGlwZSBpcyBmdWxsLikKKyAgICAgKgorICAgICAqIFRoZSBJTyB0aHJlYWQgIzAgaXMgdGhlIG9ubHkgb25lIHRoYXQgaGFuZGxlcyB0aGVzZSBsaXN0ZW4KKyAgICAgKiBldmVudHMsIHNvIHVubGVzcyB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiBhc3NpZ25lZCB0byB0aHJlYWQgIzAKKyAgICAgKiB3ZSBrbm93IGl0J3Mgbm90IG9uIG91ciB0aHJlYWQuCisgICAgICovCisgICAgaWYgKGNsaWVudENvbm5lY3Rpb24tPmdldElPVGhyZWFkTnVtYmVyKCkgPT0gMCkgeworICAgICAgY2xpZW50Q29ubmVjdGlvbi0+dHJhbnNpdGlvbigpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIWNsaWVudENvbm5lY3Rpb24tPm5vdGlmeUlPVGhyZWFkKCkpIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiW0VSUk9SXSBub3RpZnlJT1RocmVhZCBmYWlsZWQgb24gZnJlc2ggY29ubmVjdGlvbiwgY2xvc2luZyIsIGVycm5vKTsKKyAgICAgICAgY2xpZW50Q29ubmVjdGlvbi0+Y2xvc2UoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyoqCisgKiBDcmVhdGVzIGEgc29ja2V0IHRvIGxpc3RlbiBvbiBhbmQgYmluZHMgaXQgdG8gdGhlIGxvY2FsIHBvcnQuCisgKi8KK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpjcmVhdGVBbmRMaXN0ZW5PblNvY2tldCgpIHsKKyAgc2VydmVyVHJhbnNwb3J0Xy0+bGlzdGVuKCk7CisgIHNlcnZlclNvY2tldF8gPSBzZXJ2ZXJUcmFuc3BvcnRfLT5nZXRTb2NrZXRGRCgpOworfQorCisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpzZXRUaHJlYWRNYW5hZ2VyKHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyKSB7CisgIHRocmVhZE1hbmFnZXJfID0gdGhyZWFkTWFuYWdlcjsKKyAgaWYgKHRocmVhZE1hbmFnZXIpIHsKKyAgICB0aHJlYWRNYW5hZ2VyLT5zZXRFeHBpcmVDYWxsYmFjaygKKyAgICAgICAgc3RkOjpiaW5kKCZUTm9uYmxvY2tpbmdTZXJ2ZXI6OmV4cGlyZUNsb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisgICAgdGhyZWFkUG9vbFByb2Nlc3NpbmdfID0gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICB0aHJlYWRQb29sUHJvY2Vzc2luZ18gPSBmYWxzZTsKKyAgfQorfQorCitib29sIFROb25ibG9ja2luZ1NlcnZlcjo6c2VydmVyT3ZlcmxvYWRlZCgpIHsKKyAgc2l6ZV90IGFjdGl2ZUNvbm5lY3Rpb25zID0gbnVtVENvbm5lY3Rpb25zXyAtIGNvbm5lY3Rpb25TdGFja18uc2l6ZSgpOworICBpZiAobnVtQWN0aXZlUHJvY2Vzc29yc18gPiBtYXhBY3RpdmVQcm9jZXNzb3JzXyB8fCBhY3RpdmVDb25uZWN0aW9ucyA+IG1heENvbm5lY3Rpb25zXykgeworICAgIGlmICghb3ZlcmxvYWRlZF8pIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogb3ZlcmxvYWQgY29uZGl0aW9uIGJlZ3VuLiIpOworICAgICAgb3ZlcmxvYWRlZF8gPSB0cnVlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAob3ZlcmxvYWRlZF8gJiYgKG51bUFjdGl2ZVByb2Nlc3NvcnNfIDw9IG92ZXJsb2FkSHlzdGVyZXNpc18gKiBtYXhBY3RpdmVQcm9jZXNzb3JzXykKKyAgICAgICAgJiYgKGFjdGl2ZUNvbm5lY3Rpb25zIDw9IG92ZXJsb2FkSHlzdGVyZXNpc18gKiBtYXhDb25uZWN0aW9uc18pKSB7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKAorICAgICAgICAgICJUTm9uYmxvY2tpbmdTZXJ2ZXI6IG92ZXJsb2FkIGVuZGVkOyAiCisgICAgICAgICAgIiV1IGRyb3BwZWQgKCVsbHUgdG90YWwpIiwKKyAgICAgICAgICBuQ29ubmVjdGlvbnNEcm9wcGVkXywKKyAgICAgICAgICBuVG90YWxDb25uZWN0aW9uc0Ryb3BwZWRfKTsKKyAgICAgIG5Db25uZWN0aW9uc0Ryb3BwZWRfID0gMDsKKyAgICAgIG92ZXJsb2FkZWRfID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgcmV0dXJuIG92ZXJsb2FkZWRfOworfQorCitib29sIFROb25ibG9ja2luZ1NlcnZlcjo6ZHJhaW5QZW5kaW5nVGFzaygpIHsKKyAgaWYgKHRocmVhZE1hbmFnZXJfKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrID0gdGhyZWFkTWFuYWdlcl8tPnJlbW92ZU5leHRQZW5kaW5nKCk7CisgICAgaWYgKHRhc2spIHsKKyAgICAgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uID0gc3RhdGljX2Nhc3Q8VENvbm5lY3Rpb246OlRhc2sqPih0YXNrLmdldCgpKS0+Z2V0VENvbm5lY3Rpb24oKTsKKyAgICAgIGFzc2VydChjb25uZWN0aW9uICYmIGNvbm5lY3Rpb24tPmdldFNlcnZlcigpICYmIGNvbm5lY3Rpb24tPmdldFN0YXRlKCkgPT0gQVBQX1dBSVRfVEFTSyk7CisgICAgICBjb25uZWN0aW9uLT5mb3JjZUNsb3NlKCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6ZXhwaXJlQ2xvc2Uoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7CisgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uID0gc3RhdGljX2Nhc3Q8VENvbm5lY3Rpb246OlRhc2sqPih0YXNrLmdldCgpKS0+Z2V0VENvbm5lY3Rpb24oKTsKKyAgYXNzZXJ0KGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbi0+Z2V0U2VydmVyKCkgJiYgY29ubmVjdGlvbi0+Z2V0U3RhdGUoKSA9PSBBUFBfV0FJVF9UQVNLKTsKKyAgY29ubmVjdGlvbi0+Zm9yY2VDbG9zZSgpOworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6c3RvcCgpIHsKKyAgLy8gQnJlYWtzIHRoZSBldmVudCBsb29wIGluIGFsbCB0aHJlYWRzIHNvIHRoYXQgdGhleSBlbmQgQVNBUC4KKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGlvVGhyZWFkc18uc2l6ZSgpOyArK2kpIHsKKyAgICBpb1RocmVhZHNfW2ldLT5zdG9wKCk7CisgIH0KK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OnJlZ2lzdGVyRXZlbnRzKGV2ZW50X2Jhc2UqIHVzZXJfZXZlbnRfYmFzZSkgeworICB1c2VyRXZlbnRCYXNlXyA9IHVzZXJfZXZlbnRfYmFzZTsKKworICAvLyBpbml0IGxpc3RlbiBzb2NrZXQKKyAgaWYgKHNlcnZlclNvY2tldF8gPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKQorICAgIGNyZWF0ZUFuZExpc3Rlbk9uU29ja2V0KCk7CisKKyAgLy8gc2V0IHVwIHRoZSBJTyB0aHJlYWRzCisgIGFzc2VydChpb1RocmVhZHNfLmVtcHR5KCkpOworICBpZiAoIW51bUlPVGhyZWFkc18pIHsKKyAgICBudW1JT1RocmVhZHNfID0gREVGQVVMVF9JT19USFJFQURTOworICB9CisgIC8vIFVzZXItcHJvdmlkZWQgZXZlbnQtYmFzZSBkb2Vzbid0IHdvcmtzIGZvciBtdWx0aS10aHJlYWRlZCBzZXJ2ZXJzCisgIGFzc2VydChudW1JT1RocmVhZHNfID09IDEgfHwgIXVzZXJFdmVudEJhc2VfKTsKKworICBmb3IgKHVpbnQzMl90IGlkID0gMDsgaWQgPCBudW1JT1RocmVhZHNfOyArK2lkKSB7CisgICAgLy8gdGhlIGZpcnN0IElPIHRocmVhZCBhbHNvIGRvZXMgdGhlIGxpc3RlbmluZyBvbiBzZXJ2ZXIgc29ja2V0CisgICAgVEhSSUZUX1NPQ0tFVCBsaXN0ZW5GZCA9IChpZCA9PSAwID8gc2VydmVyU29ja2V0XyA6IFRIUklGVF9JTlZBTElEX1NPQ0tFVCk7CisKKyAgICBzaGFyZWRfcHRyPFROb25ibG9ja2luZ0lPVGhyZWFkPiB0aHJlYWQoCisgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdJT1RocmVhZCh0aGlzLCBpZCwgbGlzdGVuRmQsIHVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkc18pKTsKKyAgICBpb1RocmVhZHNfLnB1c2hfYmFjayh0aHJlYWQpOworICB9CisKKyAgLy8gTm90aWZ5IGhhbmRsZXIgb2YgdGhlIHByZVNlcnZlIGV2ZW50CisgIGlmIChldmVudEhhbmRsZXJfKSB7CisgICAgZXZlbnRIYW5kbGVyXy0+cHJlU2VydmUoKTsKKyAgfQorCisgIC8vIFN0YXJ0IGFsbCBvZiBvdXIgaGVscGVyIElPIHRocmVhZHMuIE5vdGUgdGhhdCB0aGUgdGhyZWFkcyBydW4gZm9yZXZlciwKKyAgLy8gb25seSB0ZXJtaW5hdGluZyBpZiBzdG9wKCkgaXMgY2FsbGVkLgorICBhc3NlcnQoaW9UaHJlYWRzXy5zaXplKCkgPT0gbnVtSU9UaHJlYWRzXyk7CisgIGFzc2VydChpb1RocmVhZHNfLnNpemUoKSA+IDApOworCisgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogU2VydmluZyB3aXRoICVkIGlvIHRocmVhZHMuIiwKKyAgICAgICAgICAgICAgICAgICAgICBpb1RocmVhZHNfLnNpemUoKSk7CisKKyAgLy8gTGF1bmNoIGFsbCB0aGUgc2Vjb25kYXJ5IElPIHRocmVhZHMgaW4gc2VwYXJhdGUgdGhyZWFkcworICBpZiAoaW9UaHJlYWRzXy5zaXplKCkgPiAxKSB7CisgICAgaW9UaHJlYWRGYWN0b3J5Xy5yZXNldChuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KAorI2lmICFVU0VfU1REX1RIUkVBRAorICAgICAgICBQbGF0Zm9ybVRocmVhZEZhY3Rvcnk6Ok9USEVSLCAgLy8gc2NoZWR1bGVyCisgICAgICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeTo6Tk9STUFMLCAvLyBwcmlvcml0eQorICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhY2sgc2l6ZSAoTUIpCisjZW5kaWYKKyAgICAgICAgZmFsc2UgLy8gZGV0YWNoZWQKKyAgICAgICAgKSk7CisKKyAgICBhc3NlcnQoaW9UaHJlYWRGYWN0b3J5Xy5nZXQoKSk7CisKKyAgICAvLyBpbnRlbnRpb25hbGx5IHN0YXJ0aW5nIGF0IHRocmVhZCAxLCBub3QgMAorICAgIGZvciAodWludDMyX3QgaSA9IDE7IGkgPCBpb1RocmVhZHNfLnNpemUoKTsgKytpKSB7CisgICAgICBzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkID0gaW9UaHJlYWRGYWN0b3J5Xy0+bmV3VGhyZWFkKGlvVGhyZWFkc19baV0pOworICAgICAgaW9UaHJlYWRzX1tpXS0+c2V0VGhyZWFkKHRocmVhZCk7CisgICAgICB0aHJlYWQtPnN0YXJ0KCk7CisgICAgfQorICB9CisKKyAgLy8gUmVnaXN0ZXIgdGhlIGV2ZW50cyBmb3IgdGhlIHByaW1hcnkgKGxpc3RlbmVyKSBJTyB0aHJlYWQKKyAgaW9UaHJlYWRzX1swXS0+cmVnaXN0ZXJFdmVudHMoKTsKK30KKworLyoqCisgKiBNYWluIHdvcmtob3JzZSBmdW5jdGlvbiwgc3RhcnRzIHVwIHRoZSBzZXJ2ZXIgbGlzdGVuaW5nIG9uIGEgcG9ydCBhbmQKKyAqIGxvb3BzIG92ZXIgdGhlIGxpYmV2ZW50IGhhbmRsZXIuCisgKi8KK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpIHsKKworICBpZiAoaW9UaHJlYWRzXy5lbXB0eSgpKQorICAgIHJlZ2lzdGVyRXZlbnRzKE5VTEwpOworCisgIC8vIFJ1biB0aGUgcHJpbWFyeSAobGlzdGVuZXIpIElPIHRocmVhZCBsb29wIGluIG91ciBtYWluIHRocmVhZDsgdGhpcyB3aWxsCisgIC8vIG9ubHkgcmV0dXJuIHdoZW4gdGhlIHNlcnZlciBpcyBzaHV0dGluZyBkb3duLgorICBpb1RocmVhZHNfWzBdLT5ydW4oKTsKKworICAvLyBFbnN1cmUgYWxsIHRocmVhZHMgYXJlIGZpbmlzaGVkIGJlZm9yZSBleGl0aW5nIHNlcnZlKCkKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGlvVGhyZWFkc18uc2l6ZSgpOyArK2kpIHsKKyAgICBpb1RocmVhZHNfW2ldLT5qb2luKCk7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nOiBqb2luIGRvbmUgZm9yIElPIHRocmVhZCAjJWQiLCBpKTsKKyAgfQorfQorCitUTm9uYmxvY2tpbmdJT1RocmVhZDo6VE5vbmJsb2NraW5nSU9UaHJlYWQoVE5vbmJsb2NraW5nU2VydmVyKiBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfU09DS0VUIGxpc3RlblNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZUhpZ2hQcmlvcml0eSkKKyAgOiBzZXJ2ZXJfKHNlcnZlciksCisgICAgbnVtYmVyXyhudW1iZXIpLAorICAgIGxpc3RlblNvY2tldF8obGlzdGVuU29ja2V0KSwKKyAgICB1c2VIaWdoUHJpb3JpdHlfKHVzZUhpZ2hQcmlvcml0eSksCisgICAgZXZlbnRCYXNlXyhOVUxMKSwKKyAgICBvd25FdmVudEJhc2VfKGZhbHNlKSB7CisgIG5vdGlmaWNhdGlvblBpcGVGRHNfWzBdID0gLTE7CisgIG5vdGlmaWNhdGlvblBpcGVGRHNfWzFdID0gLTE7Cit9CisKK1ROb25ibG9ja2luZ0lPVGhyZWFkOjp+VE5vbmJsb2NraW5nSU9UaHJlYWQoKSB7CisgIC8vIG1ha2Ugc3VyZSBvdXIgYXNzb2NpYXRlZCB0aHJlYWQgaXMgZnVsbHkgZmluaXNoZWQKKyAgam9pbigpOworCisgIGlmIChldmVudEJhc2VfICYmIG93bkV2ZW50QmFzZV8pIHsKKyAgICBldmVudF9iYXNlX2ZyZWUoZXZlbnRCYXNlXyk7CisgICAgb3duRXZlbnRCYXNlXyA9IGZhbHNlOworICB9CisKKyAgaWYgKGxpc3RlblNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgaWYgKDAgIT0gOjpUSFJJRlRfQ0xPU0VTT0NLRVQobGlzdGVuU29ja2V0XykpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ0lPVGhyZWFkIGxpc3RlblNvY2tldF8gY2xvc2UoKTogIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgIH0KKyAgICBsaXN0ZW5Tb2NrZXRfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBpZiAobm90aWZpY2F0aW9uUGlwZUZEc19baV0gPj0gMCkgeworICAgICAgaWYgKDAgIT0gOjpUSFJJRlRfQ0xPU0VTT0NLRVQobm90aWZpY2F0aW9uUGlwZUZEc19baV0pKSB7CisgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ0lPVGhyZWFkIG5vdGlmaWNhdGlvblBpcGUgY2xvc2UoKTogIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgICB9CisgICAgICBub3RpZmljYXRpb25QaXBlRkRzX1tpXSA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgIH0KK30KKwordm9pZCBUTm9uYmxvY2tpbmdJT1RocmVhZDo6Y3JlYXRlTm90aWZpY2F0aW9uUGlwZSgpIHsKKyAgaWYgKGV2dXRpbF9zb2NrZXRwYWlyKEFGX0xPQ0FMLCBTT0NLX1NUUkVBTSwgMCwgbm90aWZpY2F0aW9uUGlwZUZEc18pID09IC0xKSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyOjpjcmVhdGVOb3RpZmljYXRpb25QaXBlICIsIEVWVVRJTF9TT0NLRVRfRVJST1IoKSk7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigiY2FuJ3QgY3JlYXRlIG5vdGlmaWNhdGlvbiBwaXBlIik7CisgIH0KKyAgaWYgKGV2dXRpbF9tYWtlX3NvY2tldF9ub25ibG9ja2luZyhub3RpZmljYXRpb25QaXBlRkRzX1swXSkgPCAwCisgICAgICB8fCBldnV0aWxfbWFrZV9zb2NrZXRfbm9uYmxvY2tpbmcobm90aWZpY2F0aW9uUGlwZUZEc19bMV0pIDwgMCkgeworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKG5vdGlmaWNhdGlvblBpcGVGRHNfWzBdKTsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChub3RpZmljYXRpb25QaXBlRkRzX1sxXSk7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpjcmVhdGVOb3RpZmljYXRpb25QaXBlKCkgVEhSSUZUX09fTk9OQkxPQ0siKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworI2lmIExJQkVWRU5UX1ZFUlNJT05fTlVNQkVSIDwgMHgwMjAwMDAwMAorICAgIGludCBmbGFnczsKKyAgICBpZiAoKGZsYWdzID0gVEhSSUZUX0ZDTlRMKG5vdGlmaWNhdGlvblBpcGVGRHNfW2ldLCBGX0dFVEZELCAwKSkgPCAwCisgICAgICAgIHx8IFRIUklGVF9GQ05UTChub3RpZmljYXRpb25QaXBlRkRzX1tpXSwgRl9TRVRGRCwgZmxhZ3MgfCBGRF9DTE9FWEVDKSA8IDApIHsKKyNlbHNlCisgICAgaWYgKGV2dXRpbF9tYWtlX3NvY2tldF9jbG9zZW9uZXhlYyhub3RpZmljYXRpb25QaXBlRkRzX1tpXSkgPCAwKSB7CisjZW5kaWYKKyAgICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKG5vdGlmaWNhdGlvblBpcGVGRHNfWzBdKTsKKyAgICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKG5vdGlmaWNhdGlvblBpcGVGRHNfWzFdKTsKKyAgICAgIHRocm93IFRFeGNlcHRpb24oCisgICAgICAgICAgIlROb25ibG9ja2luZ1NlcnZlcjo6Y3JlYXRlTm90aWZpY2F0aW9uUGlwZSgpICIKKyAgICAgICAgICAiRkRfQ0xPRVhFQyIpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFJlZ2lzdGVyIHRoZSBjb3JlIGxpYmV2ZW50IGV2ZW50cyBvbnRvIHRoZSBwcm9wZXIgYmFzZS4KKyAqLwordm9pZCBUTm9uYmxvY2tpbmdJT1RocmVhZDo6cmVnaXN0ZXJFdmVudHMoKSB7CisgIHRocmVhZElkXyA9IFRocmVhZDo6Z2V0X2N1cnJlbnQoKTsKKworICBhc3NlcnQoZXZlbnRCYXNlXyA9PSAwKTsKKyAgZXZlbnRCYXNlXyA9IGdldFNlcnZlcigpLT5nZXRVc2VyRXZlbnRCYXNlKCk7CisgIGlmIChldmVudEJhc2VfID09IE5VTEwpIHsKKyAgICBldmVudEJhc2VfID0gZXZlbnRfYmFzZV9uZXcoKTsKKyAgICBvd25FdmVudEJhc2VfID0gdHJ1ZTsKKyAgfQorCisgIC8vIFByaW50IHNvbWUgbGliZXZlbnQgc3RhdHMKKyAgaWYgKG51bWJlcl8gPT0gMCkgeworICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogdXNpbmcgbGliZXZlbnQgJXMgbWV0aG9kICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X2dldF92ZXJzaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9iYXNlX2dldF9tZXRob2QoZXZlbnRCYXNlXykpOworICB9CisKKyAgaWYgKGxpc3RlblNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgLy8gUmVnaXN0ZXIgdGhlIHNlcnZlciBldmVudAorICAgIGV2ZW50X3NldCgmc2VydmVyRXZlbnRfLAorICAgICAgICAgICAgICBsaXN0ZW5Tb2NrZXRfLAorICAgICAgICAgICAgICBFVl9SRUFEIHwgRVZfUEVSU0lTVCwKKyAgICAgICAgICAgICAgVE5vbmJsb2NraW5nSU9UaHJlYWQ6Omxpc3RlbkhhbmRsZXIsCisgICAgICAgICAgICAgIHNlcnZlcl8pOworICAgIGV2ZW50X2Jhc2Vfc2V0KGV2ZW50QmFzZV8sICZzZXJ2ZXJFdmVudF8pOworCisgICAgLy8gQWRkIHRoZSBldmVudCBhbmQgc3RhcnQgdXAgdGhlIHNlcnZlcgorICAgIGlmICgtMSA9PSBldmVudF9hZGQoJnNlcnZlckV2ZW50XywgMCkpIHsKKyAgICAgIHRocm93IFRFeGNlcHRpb24oCisgICAgICAgICAgIlROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKTogIgorICAgICAgICAgICJldmVudF9hZGQoKSBmYWlsZWQgb24gc2VydmVyIGxpc3RlbiBldmVudCIpOworICAgIH0KKyAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmc6IElPIHRocmVhZCAjJWQgcmVnaXN0ZXJlZCBmb3IgbGlzdGVuLiIsIG51bWJlcl8pOworICB9CisKKyAgY3JlYXRlTm90aWZpY2F0aW9uUGlwZSgpOworCisgIC8vIENyZWF0ZSBhbiBldmVudCB0byBiZSBub3RpZmllZCB3aGVuIGEgdGFzayBmaW5pc2hlcworICBldmVudF9zZXQoJm5vdGlmaWNhdGlvbkV2ZW50XywKKyAgICAgICAgICAgIGdldE5vdGlmaWNhdGlvblJlY3ZGRCgpLAorICAgICAgICAgICAgRVZfUkVBRCB8IEVWX1BFUlNJU1QsCisgICAgICAgICAgICBUTm9uYmxvY2tpbmdJT1RocmVhZDo6bm90aWZ5SGFuZGxlciwKKyAgICAgICAgICAgIHRoaXMpOworCisgIC8vIEF0dGFjaCB0byB0aGUgYmFzZQorICBldmVudF9iYXNlX3NldChldmVudEJhc2VfLCAmbm90aWZpY2F0aW9uRXZlbnRfKTsKKworICAvLyBBZGQgdGhlIGV2ZW50IGFuZCBzdGFydCB1cCB0aGUgc2VydmVyCisgIGlmICgtMSA9PSBldmVudF9hZGQoJm5vdGlmaWNhdGlvbkV2ZW50XywgMCkpIHsKKyAgICB0aHJvdyBURXhjZXB0aW9uKAorICAgICAgICAiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpOiAiCisgICAgICAgICJldmVudF9hZGQoKSBmYWlsZWQgb24gdGFzay1kb25lIG5vdGlmaWNhdGlvbiBldmVudCIpOworICB9CisgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZzogSU8gdGhyZWFkICMlZCByZWdpc3RlcmVkIGZvciBub3RpZnkuIiwgbnVtYmVyXyk7Cit9CisKK2Jvb2wgVE5vbmJsb2NraW5nSU9UaHJlYWQ6Om5vdGlmeShUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uKiBjb25uKSB7CisgIFRIUklGVF9TT0NLRVQgZmQgPSBnZXROb3RpZmljYXRpb25TZW5kRkQoKTsKKyAgaWYgKGZkIDwgMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGludCByZXQgPSAtMTsKKyAgbG9uZyBrU2l6ZSA9IHNpemVvZihjb25uKTsKKyAgY29uc3QgY2hhciAqIHBvcyA9IChjb25zdCBjaGFyICopY29uc3RfY2FzdF9zb2Nrb3B0KCZjb25uKTsKKworI2lmIGRlZmluZWQoSEFWRV9QT0xMX0gpIHx8IGRlZmluZWQoSEFWRV9TWVNfUE9MTF9IKQorICBzdHJ1Y3QgcG9sbGZkIHBmZCA9IHtmZCwgUE9MTE9VVCwgMH07CisKKyAgd2hpbGUgKGtTaXplID4gMCkgeworICAgIHBmZC5yZXZlbnRzID0gMDsKKyAgICByZXQgPSBwb2xsKCZwZmQsIDEsIC0xKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAocmV0ID09IDApIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChwZmQucmV2ZW50cyAmIFBPTExIVVAgfHwgcGZkLnJldmVudHMgJiBQT0xMRVJSKSB7CisgICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChmZCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHBmZC5yZXZlbnRzICYgUE9MTE9VVCkgeworICAgICAgcmV0ID0gc2VuZChmZCwgcG9zLCBrU2l6ZSwgMCk7CisgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBpZiAoZXJybm8gPT0gRUFHQUlOKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChmZCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAga1NpemUgLT0gcmV0OworICAgICAgcG9zICs9IHJldDsKKyAgICB9CisgIH0KKyNlbHNlCisgIGZkX3NldCB3ZmRzLCBlZmRzOworCisgIHdoaWxlIChrU2l6ZSA+IDApIHsKKyAgICBGRF9aRVJPKCZ3ZmRzKTsKKyAgICBGRF9aRVJPKCZlZmRzKTsKKyAgICBGRF9TRVQoZmQsICZ3ZmRzKTsKKyAgICBGRF9TRVQoZmQsICZlZmRzKTsKKyAgICByZXQgPSBzZWxlY3Qoc3RhdGljX2Nhc3Q8aW50PihmZCArIDEpLCBOVUxMLCAmd2ZkcywgJmVmZHMsIE5VTEwpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmIChyZXQgPT0gMCkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKEZEX0lTU0VUKGZkLCAmZWZkcykpIHsKKyAgICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGZkKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoRkRfSVNTRVQoZmQsICZ3ZmRzKSkgeworICAgICAgcmV0ID0gc2VuZChmZCwgcG9zLCBrU2l6ZSwgMCk7CisgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBpZiAoZXJybm8gPT0gRUFHQUlOKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChmZCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAga1NpemUgLT0gcmV0OworICAgICAgcG9zICs9IHJldDsKKyAgICB9CisgIH0KKyNlbmRpZgorCisgIHJldHVybiB0cnVlOworfQorCisvKiBzdGF0aWMgKi8KK3ZvaWQgVE5vbmJsb2NraW5nSU9UaHJlYWQ6Om5vdGlmeUhhbmRsZXIoZXZ1dGlsX3NvY2tldF90IGZkLCBzaG9ydCB3aGljaCwgdm9pZCogdikgeworICBUTm9uYmxvY2tpbmdJT1RocmVhZCogaW9UaHJlYWQgPSAoVE5vbmJsb2NraW5nSU9UaHJlYWQqKXY7CisgIGFzc2VydChpb1RocmVhZCk7CisgICh2b2lkKXdoaWNoOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbiogY29ubmVjdGlvbiA9IDA7CisgICAgY29uc3QgaW50IGtTaXplID0gc2l6ZW9mKGNvbm5lY3Rpb24pOworICAgIGxvbmcgbkJ5dGVzID0gcmVjdihmZCwgY2FzdF9zb2Nrb3B0KCZjb25uZWN0aW9uKSwga1NpemUsIDApOworICAgIGlmIChuQnl0ZXMgPT0ga1NpemUpIHsKKyAgICAgIGlmIChjb25uZWN0aW9uID09IE5VTEwpIHsKKyAgICAgICAgLy8gdGhpcyBpcyB0aGUgY29tbWFuZCB0byBzdG9wIG91ciB0aHJlYWQsIGV4aXQgdGhlIGhhbmRsZXIhCisgICAgICAgIGlvVGhyZWFkLT5icmVha0xvb3AoZmFsc2UpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBjb25uZWN0aW9uLT50cmFuc2l0aW9uKCk7CisgICAgfSBlbHNlIGlmIChuQnl0ZXMgPiAwKSB7CisgICAgICAvLyB0aHJvdyBhd2F5IHRoZXNlIGJ5dGVzIGFuZCBob3BlIHRoYXQgbmV4dCB0aW1lIHdlIGdldCBhIHNvbGlkIHJlYWQKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIm5vdGlmeUhhbmRsZXI6IEJhZCByZWFkIG9mICVkIGJ5dGVzLCB3YW50ZWQgJWQiLCBuQnl0ZXMsIGtTaXplKTsKKyAgICAgIGlvVGhyZWFkLT5icmVha0xvb3AodHJ1ZSk7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChuQnl0ZXMgPT0gMCkgeworICAgICAgR2xvYmFsT3V0cHV0LnByaW50Zigibm90aWZ5SGFuZGxlcjogTm90aWZ5IHNvY2tldCBjbG9zZWQhIik7CisgICAgICBpb1RocmVhZC0+YnJlYWtMb29wKGZhbHNlKTsKKyAgICAgIC8vIGV4aXQgdGhlIGxvb3AKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7IC8vIG5CeXRlcyA8IDAKKyAgICAgIGlmIChUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiAhPSBUSFJJRlRfRVdPVUxEQkxPQ0sKKyAgICAgICAgICAmJiBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiAhPSBUSFJJRlRfRUFHQUlOKSB7CisgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZzogbm90aWZ5SGFuZGxlciByZWFkKCkgZmFpbGVkOiAiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgICAgIGlvVGhyZWFkLT5icmVha0xvb3AodHJ1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIC8vIGV4aXQgdGhlIGxvb3AKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCit2b2lkIFROb25ibG9ja2luZ0lPVGhyZWFkOjpicmVha0xvb3AoYm9vbCBlcnJvcikgeworICBpZiAoZXJyb3IpIHsKKyAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IElPIHRocmVhZCAjJWQgZXhpdGluZyB3aXRoIGVycm9yLiIsIG51bWJlcl8pOworICAgIC8vIFRPRE86IGZpZ3VyZSBvdXQgc29tZXRoaW5nIGJldHRlciB0byBkbyBoZXJlLCBidXQgZm9yIG5vdyBraWxsIHRoZQorICAgIC8vIHdob2xlIHByb2Nlc3MuCisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBhYm9ydGluZyBwcm9jZXNzLiIpOworICAgIDo6YWJvcnQoKTsKKyAgfQorCisgIC8vIElmIHdlJ3JlIHJ1bm5pbmcgaW4gdGhlIHNhbWUgdGhyZWFkLCB3ZSBjYW4ndCB1c2UgdGhlIG5vdGlmeSgwKQorICAvLyBtZWNoYW5pc20gdG8gc3RvcCB0aGUgdGhyZWFkLCBidXQgaGFwcGlseSBpZiB3ZSdyZSBydW5uaW5nIGluIHRoZQorICAvLyBzYW1lIHRocmVhZCwgdGhpcyBtZWFucyB0aGUgdGhyZWFkIGNhbid0IGJlIGJsb2NraW5nIGluIHRoZSBldmVudAorICAvLyBsb29wIGVpdGhlci4KKyAgaWYgKCFUaHJlYWQ6OmlzX2N1cnJlbnQodGhyZWFkSWRfKSkgeworICAgIG5vdGlmeShOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBjYXVzZSB0aGUgbG9vcCB0byBzdG9wIEFTQVAgLSBldmVuIGlmIGl0IGhhcyB0aGluZ3MgdG8gZG8gaW4gaXQKKyAgICBldmVudF9iYXNlX2xvb3BicmVhayhldmVudEJhc2VfKTsKKyAgfQorfQorCit2b2lkIFROb25ibG9ja2luZ0lPVGhyZWFkOjpzZXRDdXJyZW50VGhyZWFkSGlnaFByaW9yaXR5KGJvb2wgdmFsdWUpIHsKKyNpZmRlZiBIQVZFX1NDSEVEX0gKKyAgLy8gU3RhcnQgb3V0IHdpdGggYSBzdGFuZGFyZCwgbG93LXByaW9yaXR5IHNldHVwIGZvciB0aGUgc2NoZWQgcGFyYW1zLgorICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gc3A7CisgIGJ6ZXJvKCh2b2lkKikmc3AsIHNpemVvZihzcCkpOworICBpbnQgcG9saWN5ID0gU0NIRURfT1RIRVI7CisKKyAgLy8gSWYgZGVzaXJlZCwgc2V0IHVwIGhpZ2gtcHJpb3JpdHkgc2NoZWQgcGFyYW1zIHN0cnVjdHVyZS4KKyAgaWYgKHZhbHVlKSB7CisgICAgLy8gRklGTyBzY2hlZHVsZXIsIHJhbmtlZCBhYm92ZSBkZWZhdWx0IFNDSEVEX09USEVSIHF1ZXVlCisgICAgcG9saWN5ID0gU0NIRURfRklGTzsKKyAgICAvLyBUaGUgcHJpb3JpdHkgb25seSBjb21wYXJlcyB1cyB0byBvdGhlciBTQ0hFRF9GSUZPIHRocmVhZHMsIHNvIHdlCisgICAgLy8ganVzdCBwaWNrIGEgcmFuZG9tIHByaW9yaXR5IGhhbGZ3YXkgYmV0d2VlbiBtaW4gJiBtYXguCisgICAgY29uc3QgaW50IHByaW9yaXR5ID0gKHNjaGVkX2dldF9wcmlvcml0eV9tYXgocG9saWN5KSArIHNjaGVkX2dldF9wcmlvcml0eV9taW4ocG9saWN5KSkgLyAyOworCisgICAgc3Auc2NoZWRfcHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgfQorCisgIC8vIEFjdHVhbGx5IHNldCB0aGUgc2NoZWQgcGFyYW1zIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCisgIGlmICgwID09IHB0aHJlYWRfc2V0c2NoZWRwYXJhbShwdGhyZWFkX3NlbGYoKSwgcG9saWN5LCAmc3ApKSB7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nOiBJTyBUaHJlYWQgIyVkIHVzaW5nIGhpZ2gtcHJpb3JpdHkgc2NoZWR1bGVyISIsIG51bWJlcl8pOworICB9IGVsc2UgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZzogcHRocmVhZF9zZXRzY2hlZHBhcmFtKCk6ICIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgfQorI2Vsc2UKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSh2YWx1ZSk7CisjZW5kaWYKK30KKwordm9pZCBUTm9uYmxvY2tpbmdJT1RocmVhZDo6cnVuKCkgeworICBpZiAoZXZlbnRCYXNlXyA9PSBOVUxMKSB7CisgICAgcmVnaXN0ZXJFdmVudHMoKTsKKyAgfQorICBpZiAodXNlSGlnaFByaW9yaXR5XykgeworICAgIHNldEN1cnJlbnRUaHJlYWRIaWdoUHJpb3JpdHkodHJ1ZSk7CisgIH0KKworICBpZiAoZXZlbnRCYXNlXyAhPSBOVUxMKQorICB7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBJTyB0aHJlYWQgIyVkIGVudGVyaW5nIGxvb3AuLi4iLCBudW1iZXJfKTsKKyAgICAvLyBSdW4gbGliZXZlbnQgZW5naW5lLCBuZXZlciByZXR1cm5zLCBpbnZva2VzIGNhbGxzIHRvIGV2ZW50SGFuZGxlcgorICAgIGV2ZW50X2Jhc2VfbG9vcChldmVudEJhc2VfLCAwKTsKKworICAgIGlmICh1c2VIaWdoUHJpb3JpdHlfKSB7CisgICAgICBzZXRDdXJyZW50VGhyZWFkSGlnaFByaW9yaXR5KGZhbHNlKTsKKyAgICB9CisKKyAgICAvLyBjbGVhbnMgdXAgb3VyIHJlZ2lzdGVyZWQgZXZlbnRzCisgICAgY2xlYW51cEV2ZW50cygpOworICB9CisKKyAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBJTyB0aHJlYWQgIyVkIHJ1bigpIGRvbmUhIiwgbnVtYmVyXyk7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nSU9UaHJlYWQ6OmNsZWFudXBFdmVudHMoKSB7CisgIC8vIHN0b3AgdGhlIGxpc3RlbiBzb2NrZXQsIGlmIGFueQorICBpZiAobGlzdGVuU29ja2V0XyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBpZiAoZXZlbnRfZGVsKCZzZXJ2ZXJFdmVudF8pID09IC0xKSB7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdJT1RocmVhZDo6c3RvcCgpIGV2ZW50X2RlbDogIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgIH0KKyAgfQorCisgIGV2ZW50X2RlbCgmbm90aWZpY2F0aW9uRXZlbnRfKTsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdJT1RocmVhZDo6c3RvcCgpIHsKKyAgLy8gVGhpcyBzaG91bGQgY2F1c2UgdGhlIHRocmVhZCB0byBmYWxsIG91dCBvZiBpdHMgZXZlbnQgbG9vcCBBU0FQLgorICBicmVha0xvb3AoZmFsc2UpOworfQorCit2b2lkIFROb25ibG9ja2luZ0lPVGhyZWFkOjpqb2luKCkgeworICAvLyBJZiB0aGlzIHdhcyBhIHRocmVhZCBjcmVhdGVkIGJ5IGEgZmFjdG9yeSAobm90IHRoZSB0aHJlYWQgdGhhdCBjYWxsZWQKKyAgLy8gc2VydmUoKSksIHdlIGpvaW4oKSBpdCB0byBtYWtlIHN1cmUgd2Ugc2h1dCBkb3duIGZ1bGx5LgorICBpZiAodGhyZWFkXykgeworICAgIHRyeSB7CisgICAgICAvLyBOb3RlIHRoYXQgaXQgaXMgc2FmZSB0byBib3RoIGpvaW4oKSBvdXJzZWx2ZXMgdHdpY2UsIGFzIHdlbGwgYXMgam9pbgorICAgICAgLy8gdGhlIGN1cnJlbnQgdGhyZWFkIGFzIHRoZSBwdGhyZWFkIGltcGxlbWVudGF0aW9uIGNoZWNrcyBmb3IgZGVhZGxvY2suCisgICAgICB0aHJlYWRfLT5qb2luKCk7CisgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICAvLyBzd2FsbG93IGV2ZXJ5dGhpbmcKKyAgICB9CisgIH0KK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc5YzI0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmgKQEAgLTAsMCArMSw4NjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UTk9OQkxPQ0tJTkdTRVJWRVJfSF8KKyNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVE5PTkJMT0NLSU5HU0VSVkVSX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorI2luY2x1ZGUgPHN0YWNrPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxldmVudC5oPgorI2luY2x1ZGUgPGV2ZW50Mi9ldmVudF9jb21wYXQuaD4KKyNpbmNsdWRlIDxldmVudDIvZXZlbnRfc3RydWN0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UnVubmFibGU7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6R3VhcmQ7CisKKyNpZmRlZiBMSUJFVkVOVF9WRVJTSU9OX05VTUJFUgorI2RlZmluZSBMSUJFVkVOVF9WRVJTSU9OX01BSk9SIChMSUJFVkVOVF9WRVJTSU9OX05VTUJFUiA+PiAyNCkKKyNkZWZpbmUgTElCRVZFTlRfVkVSU0lPTl9NSU5PUiAoKExJQkVWRU5UX1ZFUlNJT05fTlVNQkVSID4+IDE2KSAmIDB4RkYpCisjZGVmaW5lIExJQkVWRU5UX1ZFUlNJT05fUkVMICgoTElCRVZFTlRfVkVSU0lPTl9OVU1CRVIgPj4gOCkgJiAweEZGKQorI2Vsc2UKKy8vIGFzc3VtZSBsYXRlc3QgdmVyc2lvbiAxIHNlcmllcworI2RlZmluZSBMSUJFVkVOVF9WRVJTSU9OX01BSk9SIDEKKyNkZWZpbmUgTElCRVZFTlRfVkVSU0lPTl9NSU5PUiAxNAorI2RlZmluZSBMSUJFVkVOVF9WRVJTSU9OX1JFTCAxMworI2RlZmluZSBMSUJFVkVOVF9WRVJTSU9OX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExJQkVWRU5UX1ZFUlNJT05fTUFKT1IgPDwgMjQpIHwgKExJQkVWRU5UX1ZFUlNJT05fTUlOT1IgPDwgMTYpIHwgKExJQkVWRU5UX1ZFUlNJT05fUkVMIDw8IDgpKQorI2VuZGlmCisKKyNpZiBMSUJFVkVOVF9WRVJTSU9OX05VTUJFUiA8IDB4MDIwMDAwMDAKK3R5cGVkZWYgVEhSSUZUX1NPQ0tFVCBldnV0aWxfc29ja2V0X3Q7CisjZW5kaWYKKworI2lmbmRlZiBTT0NLT1BUX0NBU1RfVAorI2lmbmRlZiBfV0lOMzIKKyNkZWZpbmUgU09DS09QVF9DQVNUX1Qgdm9pZAorI2Vsc2UKKyNkZWZpbmUgU09DS09QVF9DQVNUX1QgY2hhcgorI2VuZGlmIC8vIF9XSU4zMgorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKiBjb25zdF9jYXN0X3NvY2tvcHQoY29uc3QgVCogdikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTT0NLT1BUX0NBU1RfVCo+KHYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBTT0NLT1BUX0NBU1RfVCogY2FzdF9zb2Nrb3B0KFQqIHYpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U09DS09QVF9DQVNUX1QqPih2KTsKK30KKworLyoqCisgKiBUaGlzIGlzIGEgbm9uLWJsb2NraW5nIHNlcnZlciBpbiBDKysgZm9yIGhpZ2ggcGVyZm9ybWFuY2UgdGhhdAorICogb3BlcmF0ZXMgYSBzZXQgb2YgSU8gdGhyZWFkcyAoYnkgZGVmYXVsdCBvbmx5IG9uZSkuIEl0IGFzc3VtZXMgdGhhdAorICogYWxsIGluY29taW5nIHJlcXVlc3RzIGFyZSBmcmFtZWQgd2l0aCBhIDQgYnl0ZSBsZW5ndGggaW5kaWNhdG9yIGFuZAorICogd3JpdGVzIG91dCByZXNwb25zZXMgdXNpbmcgdGhlIHNhbWUgZnJhbWluZy4KKyAqLworCisvLy8gT3ZlcmxvYWQgY29uZGl0aW9uIGFjdGlvbnMuCitlbnVtIFRPdmVybG9hZEFjdGlvbiB7CisgIFRfT1ZFUkxPQURfTk9fQUNUSU9OLCAgICAgICAvLy88IERvbid0IGhhbmRsZSBvdmVybG9hZCAqLworICBUX09WRVJMT0FEX0NMT1NFX09OX0FDQ0VQVCwgLy8vPCBEcm9wIG5ldyBjb25uZWN0aW9ucyBpbW1lZGlhdGVseSAqLworICBUX09WRVJMT0FEX0RSQUlOX1RBU0tfUVVFVUUgLy8vPCBEcm9wIHNvbWUgdGFza3MgZnJvbSBoZWFkIG9mIHRhc2sgcXVldWUgKi8KK307CisKK2NsYXNzIFROb25ibG9ja2luZ0lPVGhyZWFkOworCitjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXIgOiBwdWJsaWMgVFNlcnZlciB7Citwcml2YXRlOgorICBjbGFzcyBUQ29ubmVjdGlvbjsKKworICBmcmllbmQgY2xhc3MgVE5vbmJsb2NraW5nSU9UaHJlYWQ7CisKK3ByaXZhdGU6CisgIC8vLyBMaXN0ZW4gYmFja2xvZworICBzdGF0aWMgY29uc3QgaW50IExJU1RFTl9CQUNLTE9HID0gMTAyNDsKKworICAvLy8gRGVmYXVsdCBsaW1pdCBvbiBzaXplIG9mIGlkbGUgY29ubmVjdGlvbiBwb29sCisgIHN0YXRpYyBjb25zdCBzaXplX3QgQ09OTkVDVElPTl9TVEFDS19MSU1JVCA9IDEwMjQ7CisKKyAgLy8vIERlZmF1bHQgbGltaXQgb24gZnJhbWUgc2l6ZQorICBzdGF0aWMgY29uc3QgaW50IE1BWF9GUkFNRV9TSVpFID0gMjU2ICogMTAyNCAqIDEwMjQ7CisKKyAgLy8vIERlZmF1bHQgbGltaXQgb24gdG90YWwgbnVtYmVyIG9mIGNvbm5lY3RlZCBzb2NrZXRzCisgIHN0YXRpYyBjb25zdCBpbnQgTUFYX0NPTk5FQ1RJT05TID0gSU5UX01BWDsKKworICAvLy8gRGVmYXVsdCBsaW1pdCBvbiBjb25uZWN0aW9ucyBpbiBoYW5kbGVyL3Rhc2sgcHJvY2Vzc2luZworICBzdGF0aWMgY29uc3QgaW50IE1BWF9BQ1RJVkVfUFJPQ0VTU09SUyA9IElOVF9NQVg7CisKKyAgLy8vIERlZmF1bHQgc2l6ZSBvZiB3cml0ZSBidWZmZXIKKyAgc3RhdGljIGNvbnN0IGludCBXUklURV9CVUZGRVJfREVGQVVMVF9TSVpFID0gMTAyNDsKKworICAvLy8gTWF4aW11bSBzaXplIG9mIHJlYWQgYnVmZmVyIGFsbG9jYXRlZCB0byBpZGxlIGNvbm5lY3Rpb24gKDAgPSB1bmxpbWl0ZWQpCisgIHN0YXRpYyBjb25zdCBpbnQgSURMRV9SRUFEX0JVRkZFUl9MSU1JVCA9IDEwMjQ7CisKKyAgLy8vIE1heGltdW0gc2l6ZSBvZiB3cml0ZSBidWZmZXIgYWxsb2NhdGVkIHRvIGlkbGUgY29ubmVjdGlvbiAoMCA9IHVubGltaXRlZCkKKyAgc3RhdGljIGNvbnN0IGludCBJRExFX1dSSVRFX0JVRkZFUl9MSU1JVCA9IDEwMjQ7CisKKyAgLy8vICMgb2YgY2FsbHMgYmVmb3JlIHJlc2l6aW5nIG92ZXJzaXplZCBidWZmZXJzICgwID0gY2hlY2sgb25seSBvbiBjbG9zZSkKKyAgc3RhdGljIGNvbnN0IGludCBSRVNJWkVfQlVGRkVSX0VWRVJZX04gPSA1MTI7CisKKyAgLy8vICMgb2YgSU8gdGhyZWFkcyB0byB1c2UgYnkgZGVmYXVsdAorICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfSU9fVEhSRUFEUyA9IDE7CisKKyAgLy8vICMgb2YgSU8gdGhyZWFkcyB0aGlzIHNlcnZlciB3aWxsIHVzZQorICBzaXplX3QgbnVtSU9UaHJlYWRzXzsKKworICAvLy8gV2hldGhlciB0byBzZXQgaGlnaCBzY2hlZHVsaW5nIHByaW9yaXR5IGZvciBJTyB0aHJlYWRzCisgIGJvb2wgdXNlSGlnaFByaW9yaXR5SU9UaHJlYWRzXzsKKworICAvLy8gU2VydmVyIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IKKyAgVEhSSUZUX1NPQ0tFVCBzZXJ2ZXJTb2NrZXRfOworCisgIC8vLyBUaGUgb3B0aW9uYWwgdXNlci1wcm92aWRlZCBldmVudC1iYXNlIChmb3Igc2luZ2xlLXRocmVhZCBzZXJ2ZXJzKQorICBldmVudF9iYXNlKiB1c2VyRXZlbnRCYXNlXzsKKworICAvLy8gRm9yIHByb2Nlc3NpbmcgdmlhIHRocmVhZCBwb29sLCBtYXkgYmUgTlVMTAorICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcl87CisKKyAgLy8vIElzIHRocmVhZCBwb29sIHByb2Nlc3Npbmc/CisgIGJvb2wgdGhyZWFkUG9vbFByb2Nlc3NpbmdfOworCisgIC8vIEZhY3RvcnkgdG8gY3JlYXRlIHRoZSBJTyB0aHJlYWRzCisgIHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IGlvVGhyZWFkRmFjdG9yeV87CisKKyAgLy8gVmVjdG9yIG9mIElPVGhyZWFkIG9iamVjdHMgdGhhdCB3aWxsIGhhbmRsZSBvdXIgSU8KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ0lPVGhyZWFkPiA+IGlvVGhyZWFkc187CisKKyAgLy8gSW5kZXggb2YgbmV4dCBJTyBUaHJlYWQgdG8gYmUgdXNlZCAoZm9yIHJvdW5kLXJvYmluKQorICB1aW50MzJfdCBuZXh0SU9UaHJlYWRfOworCisgIC8vIFN5bmNocm9uaXplcyBhY2Nlc3MgdG8gY29ubmVjdGlvbiBzdGFjayBhbmQgc2ltaWxhciBkYXRhCisgIE11dGV4IGNvbm5NdXRleF87CisKKyAgLy8vIE51bWJlciBvZiBUQ29ubmVjdGlvbiBvYmplY3Qgd2UndmUgY3JlYXRlZAorICBzaXplX3QgbnVtVENvbm5lY3Rpb25zXzsKKworICAvLy8gTnVtYmVyIG9mIENvbm5lY3Rpb25zIHByb2Nlc3Npbmcgb3Igd2FpdGluZyB0byBwcm9jZXNzCisgIHNpemVfdCBudW1BY3RpdmVQcm9jZXNzb3JzXzsKKworICAvLy8gTGltaXQgZm9yIGhvdyBtYW55IFRDb25uZWN0aW9uIG9iamVjdHMgdG8gY2FjaGUKKyAgc2l6ZV90IGNvbm5lY3Rpb25TdGFja0xpbWl0XzsKKworICAvLy8gTGltaXQgZm9yIG51bWJlciBvZiBjb25uZWN0aW9ucyBwcm9jZXNzaW5nIG9yIHdhaXRpbmcgdG8gcHJvY2VzcworICBzaXplX3QgbWF4QWN0aXZlUHJvY2Vzc29yc187CisKKyAgLy8vIExpbWl0IGZvciBudW1iZXIgb2Ygb3BlbiBjb25uZWN0aW9ucworICBzaXplX3QgbWF4Q29ubmVjdGlvbnNfOworCisgIC8vLyBMaW1pdCBmb3IgZnJhbWUgc2l6ZQorICBzaXplX3QgbWF4RnJhbWVTaXplXzsKKworICAvLy8gVGltZSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGFuIHVucGVyZm9ybWVkIHRhc2sgZXhwaXJlcyAoMCA9PSBpbmZpbml0ZSkuCisgIGludDY0X3QgdGFza0V4cGlyZVRpbWVfOworCisgIC8qKgorICAgKiBIeXN0ZXJlc2lzIGZvciBvdmVybG9hZCBzdGF0ZS4gIFRoaXMgaXMgdGhlIGZyYWN0aW9uIG9mIHRoZSBvdmVybG9hZAorICAgKiB2YWx1ZSB0aGF0IG5lZWRzIHRvIGJlIHJlYWNoZWQgYmVmb3JlIHRoZSBvdmVybG9hZCBzdGF0ZSBpcyBjbGVhcmVkOworICAgKiBtdXN0IGJlIDw9IDEuMC4KKyAgICovCisgIGRvdWJsZSBvdmVybG9hZEh5c3RlcmVzaXNfOworCisgIC8vLyBBY3Rpb24gdG8gdGFrZSB3aGVuIHdlJ3JlIG92ZXJsb2FkZWQuCisgIFRPdmVybG9hZEFjdGlvbiBvdmVybG9hZEFjdGlvbl87CisKKyAgLyoqCisgICAqIFRoZSB3cml0ZSBidWZmZXIgaXMgaW5pdGlhbGl6ZWQgKGFuZCB3aGVuIGlkbGVXcml0ZUJ1ZmZlckxpbWl0XyBpcyBjaGVja2VkCisgICAqIGFuZCBmb3VuZCB0byBiZSBleGNlZWRlZCwgcmVpbml0aWFsaXplZCkgdG8gdGhpcyBzaXplLgorICAgKi8KKyAgc2l6ZV90IHdyaXRlQnVmZmVyRGVmYXVsdFNpemVfOworCisgIC8qKgorICAgKiBNYXggcmVhZCBidWZmZXIgc2l6ZSBmb3IgYW4gaWRsZSBUQ29ubmVjdGlvbi4gIFdoZW4gd2UgcGxhY2UgYW4gaWRsZQorICAgKiBUQ29ubmVjdGlvbiBpbnRvIGNvbm5lY3Rpb25TdGFja18gb3Igb24gZXZlcnkgcmVzaXplQnVmZmVyRXZlcnlOXyBjYWxscywKKyAgICogd2Ugd2lsbCBmcmVlIHRoZSBidWZmZXIgKHN1Y2ggdGhhdCBpdCB3aWxsIGJlIHJlaW5pdGlhbGl6ZWQgYnkgdGhlIG5leHQKKyAgICogcmVjZWl2ZWQgZnJhbWUpIGlmIGl0IGhhcyBleGNlZWRlZCB0aGlzIGxpbWl0LiAgMCBkaXNhYmxlcyB0aGlzIGNoZWNrLgorICAgKi8KKyAgc2l6ZV90IGlkbGVSZWFkQnVmZmVyTGltaXRfOworCisgIC8qKgorICAgKiBNYXggd3JpdGUgYnVmZmVyIHNpemUgZm9yIGFuIGlkbGUgY29ubmVjdGlvbi4gIFdoZW4gd2UgcGxhY2UgYW4gaWRsZQorICAgKiBUQ29ubmVjdGlvbiBpbnRvIGNvbm5lY3Rpb25TdGFja18gb3Igb24gZXZlcnkgcmVzaXplQnVmZmVyRXZlcnlOXyBjYWxscywKKyAgICogd2UgaW5zdXJlIHRoYXQgaXRzIHdyaXRlIGJ1ZmZlciBpcyA8PSB0byB0aGlzIHNpemU7IG90aGVyd2lzZSB3ZQorICAgKiByZXBsYWNlIGl0IHdpdGggYSBuZXcgb25lIG9mIHdyaXRlQnVmZmVyRGVmYXVsdFNpemVfIGJ5dGVzIHRvIGluc3VyZSB0aGF0CisgICAqIGlkbGUgY29ubmVjdGlvbnMgZG9uJ3QgaG9nIG1lbW9yeS4gMCBkaXNhYmxlcyB0aGlzIGNoZWNrLgorICAgKi8KKyAgc2l6ZV90IGlkbGVXcml0ZUJ1ZmZlckxpbWl0XzsKKworICAvKioKKyAgICogRXZlcnkgTiBjYWxscyB3ZSBjaGVjayB0aGUgYnVmZmVyIHNpemUgbGltaXRzIG9uIGEgY29ubmVjdGVkIFRDb25uZWN0aW9uLgorICAgKiAwIGRpc2FibGVzIChpLmUuIHRoZSBjaGVja3MgYXJlIG9ubHkgZG9uZSB3aGVuIGEgY29ubmVjdGlvbiBjbG9zZXMpLgorICAgKi8KKyAgaW50MzJfdCByZXNpemVCdWZmZXJFdmVyeU5fOworCisgIC8vLyBTZXQgaWYgd2UgYXJlIGN1cnJlbnRseSBpbiBhbiBvdmVybG9hZGVkIHN0YXRlLgorICBib29sIG92ZXJsb2FkZWRfOworCisgIC8vLyBDb3VudCBvZiBjb25uZWN0aW9ucyBkcm9wcGVkIHNpbmNlIG92ZXJsb2FkIHN0YXJ0ZWQKKyAgdWludDMyX3QgbkNvbm5lY3Rpb25zRHJvcHBlZF87CisKKyAgLy8vIENvdW50IG9mIGNvbm5lY3Rpb25zIGRyb3BwZWQgb24gb3ZlcmxvYWQgc2luY2Ugc2VydmVyIHN0YXJ0ZWQKKyAgdWludDY0X3QgblRvdGFsQ29ubmVjdGlvbnNEcm9wcGVkXzsKKworICAvKioKKyAgICogVGhpcyBpcyBhIHN0YWNrIG9mIGFsbCB0aGUgb2JqZWN0cyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkIGJ1dCB0aGF0CisgICAqIGFyZSBOT1QgY3VycmVudGx5IGluIHVzZS4gV2hlbiB3ZSBjbG9zZSBhIGNvbm5lY3Rpb24sIHdlIHBsYWNlIGl0IG9uIHRoaXMKKyAgICogc3RhY2sgc28gdGhhdCB0aGUgb2JqZWN0IGNhbiBiZSByZXVzZWQgbGF0ZXIsIHJhdGhlciB0aGFuIGZyZWVpbmcgdGhlCisgICAqIG1lbW9yeSBhbmQgcmVhbGxvY2F0aW5nIGEgbmV3IG9iamVjdCBsYXRlci4KKyAgICovCisgIHN0ZDo6c3RhY2s8VENvbm5lY3Rpb24qPiBjb25uZWN0aW9uU3RhY2tfOworCisgIC8qKgorICAgKiBUaGlzIGNvbnRhaW5lciBob2xkcyBwb2ludGVycyB0byBhbGwgYWN0aXZlIGNvbm5lY3Rpb25zLiBUaGlzIGNvbnRhaW5lcgorICAgKiBhbGxvd3MgdGhlIHNlcnZlciB0byBjbGVhbiB1cCB1bmxjb3NlZCBjb25uZWN0aW9uIG9iamVjdHMgYXQgZGVzdHJ1Y3Rpb24sCisgICAqIHdoaWNoIGluIHR1cm4gYWxsb3dzIHRoZWlyIHRyYW5zcG9ydHMsIHByb3RvY29scywgcHJvY2Vzc29ycyBhbmQgaGFuZGxlcnMKKyAgICogdG8gZGVhbGxvY2F0ZSBhbmQgY2xlYW4gdXAgY29ycmVjdGx5LgorICAgKi8KKyAgc3RkOjp2ZWN0b3I8VENvbm5lY3Rpb24qPiBhY3RpdmVDb25uZWN0aW9uc187CisKKyAgLyoKKyAgKi8KKyAgc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0XzsKKworICAvKioKKyAgICogQ2FsbGVkIHdoZW4gc2VydmVyIHNvY2tldCBoYWQgc29tZXRoaW5nIGhhcHBlbi4gIFdlIGFjY2VwdCBhbGwgd2FpdGluZworICAgKiBjbGllbnQgY29ubmVjdGlvbnMgb24gbGlzdGVuIHNvY2tldCBmZCBhbmQgYXNzaWduIFRDb25uZWN0aW9uIG9iamVjdHMKKyAgICogdG8gaGFuZGxlIHRob3NlIHJlcXVlc3RzLgorICAgKgorICAgKiBAcGFyYW0gd2hpY2ggdGhlIGV2ZW50IGZsYWcgdGhhdCB0cmlnZ2VyZWQgdGhlIGhhbmRsZXIuCisgICAqLworICB2b2lkIGhhbmRsZUV2ZW50KFRIUklGVF9TT0NLRVQgZmQsIHNob3J0IHdoaWNoKTsKKworICB2b2lkIGluaXQoKSB7CisgICAgc2VydmVyU29ja2V0XyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgICBudW1JT1RocmVhZHNfID0gREVGQVVMVF9JT19USFJFQURTOworICAgIG5leHRJT1RocmVhZF8gPSAwOworICAgIHVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkc18gPSBmYWxzZTsKKyAgICB1c2VyRXZlbnRCYXNlXyA9IE5VTEw7CisgICAgdGhyZWFkUG9vbFByb2Nlc3NpbmdfID0gZmFsc2U7CisgICAgbnVtVENvbm5lY3Rpb25zXyA9IDA7CisgICAgbnVtQWN0aXZlUHJvY2Vzc29yc18gPSAwOworICAgIGNvbm5lY3Rpb25TdGFja0xpbWl0XyA9IENPTk5FQ1RJT05fU1RBQ0tfTElNSVQ7CisgICAgbWF4QWN0aXZlUHJvY2Vzc29yc18gPSBNQVhfQUNUSVZFX1BST0NFU1NPUlM7CisgICAgbWF4Q29ubmVjdGlvbnNfID0gTUFYX0NPTk5FQ1RJT05TOworICAgIG1heEZyYW1lU2l6ZV8gPSBNQVhfRlJBTUVfU0laRTsKKyAgICB0YXNrRXhwaXJlVGltZV8gPSAwOworICAgIG92ZXJsb2FkSHlzdGVyZXNpc18gPSAwLjg7CisgICAgb3ZlcmxvYWRBY3Rpb25fID0gVF9PVkVSTE9BRF9OT19BQ1RJT047CisgICAgd3JpdGVCdWZmZXJEZWZhdWx0U2l6ZV8gPSBXUklURV9CVUZGRVJfREVGQVVMVF9TSVpFOworICAgIGlkbGVSZWFkQnVmZmVyTGltaXRfID0gSURMRV9SRUFEX0JVRkZFUl9MSU1JVDsKKyAgICBpZGxlV3JpdGVCdWZmZXJMaW1pdF8gPSBJRExFX1dSSVRFX0JVRkZFUl9MSU1JVDsKKyAgICByZXNpemVCdWZmZXJFdmVyeU5fID0gUkVTSVpFX0JVRkZFUl9FVkVSWV9OOworICAgIG92ZXJsb2FkZWRfID0gZmFsc2U7CisgICAgbkNvbm5lY3Rpb25zRHJvcHBlZF8gPSAwOworICAgIG5Ub3RhbENvbm5lY3Rpb25zRHJvcHBlZF8gPSAwOworICB9CisKK3B1YmxpYzoKKyAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0KQorICAgIDogVFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5KSwgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKKyAgICBpbml0KCk7CisgIH0KKworICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0KQorICAgIDogVFNlcnZlcihwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgeworICAgIGluaXQoKTsKKyAgfQorCisKKyAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnkpLCBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgeworICAgIGluaXQoKTsKKworICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHByb3RvY29sRmFjdG9yeSk7CisgICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHByb3RvY29sRmFjdG9yeSk7CisgICAgc2V0VGhyZWFkTWFuYWdlcih0aHJlYWRNYW5hZ2VyKTsKKyAgfQorCisgIFROb25ibG9ja2luZ1NlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4oKSkKKyAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKKyAgICBpbml0KCk7CisKKyAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShwcm90b2NvbEZhY3RvcnkpOworICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShwcm90b2NvbEZhY3RvcnkpOworICAgIHNldFRocmVhZE1hbmFnZXIodGhyZWFkTWFuYWdlcik7CisgIH0KKworICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPigpKQorICAgIDogVFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5KSwgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKKyAgICBpbml0KCk7CisKKyAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoaW5wdXRUcmFuc3BvcnRGYWN0b3J5KTsKKyAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KG91dHB1dFRyYW5zcG9ydEZhY3RvcnkpOworICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KGlucHV0UHJvdG9jb2xGYWN0b3J5KTsKKyAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3Rvcnkob3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKyAgICBzZXRUaHJlYWRNYW5hZ2VyKHRocmVhZE1hbmFnZXIpOworICB9CisKKyAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7CisgICAgaW5pdCgpOworCisgICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KGlucHV0VHJhbnNwb3J0RmFjdG9yeSk7CisgICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KTsKKyAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShpbnB1dFByb3RvY29sRmFjdG9yeSk7CisgICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisgICAgc2V0VGhyZWFkTWFuYWdlcih0aHJlYWRNYW5hZ2VyKTsKKyAgfQorCisgIH5UTm9uYmxvY2tpbmdTZXJ2ZXIoKTsKKworICB2b2lkIHNldFRocmVhZE1hbmFnZXIoc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIpOworCisgIGludCBnZXRMaXN0ZW5Qb3J0KCkgeyByZXR1cm4gc2VydmVyVHJhbnNwb3J0Xy0+Z2V0TGlzdGVuUG9ydCgpOyB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IGdldFRocmVhZE1hbmFnZXIoKSB7IHJldHVybiB0aHJlYWRNYW5hZ2VyXzsgfQorCisgIC8qKgorICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgSU8gdGhyZWFkcyB1c2VkIGJ5IHRoaXMgc2VydmVyLiBDYW4gb25seSBiZSB1c2VkIGJlZm9yZQorICAgKiB0aGUgY2FsbCB0byBzZXJ2ZSgpIGFuZCBoYXMgbm8gZWZmZWN0IGFmdGVyd2FyZHMuICBXZSBhbHdheXMgdXNlIGEKKyAgICogUG9zaXhUaHJlYWRGYWN0b3J5IGZvciB0aGUgSU8gd29ya2VyIHRocmVhZHMsIGJlY2F1c2UgdGhleSBtdXN0IGpvaW5hYmxlCisgICAqIGZvciBjbGVhbiBzaHV0ZG93bi4KKyAgICovCisgIHZvaWQgc2V0TnVtSU9UaHJlYWRzKHNpemVfdCBudW1UaHJlYWRzKSB7CisgICAgbnVtSU9UaHJlYWRzXyA9IG51bVRocmVhZHM7CisgICAgLy8gVXNlci1wcm92aWRlZCBldmVudC1iYXNlIGRvZXNuJ3Qgd29ya3MgZm9yIG11bHRpLXRocmVhZGVkIHNlcnZlcnMKKyAgICBhc3NlcnQobnVtSU9UaHJlYWRzXyA8PSAxIHx8ICF1c2VyRXZlbnRCYXNlXyk7CisgIH0KKworICAvKiogUmV0dXJuIHdoZXRoZXIgdGhlIElPIHRocmVhZHMgd2lsbCBnZXQgaGlnaCBzY2hlZHVsaW5nIHByaW9yaXR5ICovCisgIGJvb2wgdXNlSGlnaFByaW9yaXR5SU9UaHJlYWRzKCkgY29uc3QgeyByZXR1cm4gdXNlSGlnaFByaW9yaXR5SU9UaHJlYWRzXzsgfQorCisgIC8qKiBTZXQgd2hldGhlciB0aGUgSU8gdGhyZWFkcyB3aWxsIGdldCBoaWdoIHNjaGVkdWxpbmcgcHJpb3JpdHkuICovCisgIHZvaWQgc2V0VXNlSGlnaFByaW9yaXR5SU9UaHJlYWRzKGJvb2wgdmFsKSB7IHVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkc18gPSB2YWw7IH0KKworICAvKiogUmV0dXJuIHRoZSBudW1iZXIgb2YgSU8gdGhyZWFkcyB1c2VkIGJ5IHRoaXMgc2VydmVyLiAqLworICBzaXplX3QgZ2V0TnVtSU9UaHJlYWRzKCkgY29uc3QgeyByZXR1cm4gbnVtSU9UaHJlYWRzXzsgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHVudXNlZCBUQ29ubmVjdGlvbiB3ZSB3aWxsIGhvbGQgaW4gcmVzZXJ2ZS4KKyAgICoKKyAgICogQHJldHVybiB0aGUgY3VycmVudCBsaW1pdCBvbiBUQ29ubmVjdGlvbiBwb29sIHNpemUuCisgICAqLworICBzaXplX3QgZ2V0Q29ubmVjdGlvblN0YWNrTGltaXQoKSBjb25zdCB7IHJldHVybiBjb25uZWN0aW9uU3RhY2tMaW1pdF87IH0KKworICAvKioKKyAgICogU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB1bnVzZWQgVENvbm5lY3Rpb24gd2Ugd2lsbCBob2xkIGluIHJlc2VydmUuCisgICAqCisgICAqIEBwYXJhbSBzeiB0aGUgbmV3IGxpbWl0IGZvciBUQ29ubmVjdGlvbiBwb29sIHNpemUuCisgICAqLworICB2b2lkIHNldENvbm5lY3Rpb25TdGFja0xpbWl0KHNpemVfdCBzeikgeyBjb25uZWN0aW9uU3RhY2tMaW1pdF8gPSBzejsgfQorCisgIGJvb2wgaXNUaHJlYWRQb29sUHJvY2Vzc2luZygpIGNvbnN0IHsgcmV0dXJuIHRocmVhZFBvb2xQcm9jZXNzaW5nXzsgfQorCisgIHZvaWQgYWRkVGFzayhzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spIHsKKyAgICB0aHJlYWRNYW5hZ2VyXy0+YWRkKHRhc2ssIDBMTCwgdGFza0V4cGlyZVRpbWVfKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIGNvdW50IG9mIHNvY2tldHMgY3VycmVudGx5IGNvbm5lY3RlZCB0by4KKyAgICoKKyAgICogQHJldHVybiBjb3VudCBvZiBjb25uZWN0ZWQgc29ja2V0cy4KKyAgICovCisgIHNpemVfdCBnZXROdW1Db25uZWN0aW9ucygpIGNvbnN0IHsgcmV0dXJuIG51bVRDb25uZWN0aW9uc187IH0KKworICAvKioKKyAgICogUmV0dXJuIHRoZSBjb3VudCBvZiBzb2NrZXRzIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8uCisgICAqCisgICAqIEByZXR1cm4gY291bnQgb2YgY29ubmVjdGVkIHNvY2tldHMuCisgICAqLworICBzaXplX3QgZ2V0TnVtQWN0aXZlQ29ubmVjdGlvbnMoKSBjb25zdCB7IHJldHVybiBnZXROdW1Db25uZWN0aW9ucygpIC0gZ2V0TnVtSWRsZUNvbm5lY3Rpb25zKCk7IH0KKworICAvKioKKyAgICogUmV0dXJuIHRoZSBjb3VudCBvZiBjb25uZWN0aW9uIG9iamVjdHMgYWxsb2NhdGVkIGJ1dCBub3QgaW4gdXNlLgorICAgKgorICAgKiBAcmV0dXJuIGNvdW50IG9mIGlkbGUgY29ubmVjdGlvbiBvYmplY3RzLgorICAgKi8KKyAgc2l6ZV90IGdldE51bUlkbGVDb25uZWN0aW9ucygpIGNvbnN0IHsgcmV0dXJuIGNvbm5lY3Rpb25TdGFja18uc2l6ZSgpOyB9CisKKyAgLyoqCisgICAqIFJldHVybiBjb3VudCBvZiBudW1iZXIgb2YgY29ubmVjdGlvbnMgd2hpY2ggYXJlIGN1cnJlbnRseSBwcm9jZXNzaW5nLgorICAgKiBUaGlzIGlzIGRlZmluZWQgYXMgYSBjb25uZWN0aW9uIHdoZXJlIGFsbCBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkIGFuZAorICAgKiBlaXRoZXIgYXNzaWduZWQgYSB0YXNrICh3aGVuIHRocmVhZGluZykgb3IgcGFzc2VkIHRvIGEgaGFuZGxlciAod2hlbgorICAgKiBub3QgdGhyZWFkaW5nKSwgYW5kIHdoZXJlIHRoZSBoYW5kbGVyIGhhcyBub3QgeWV0IHJldHVybmVkLgorICAgKgorICAgKiBAcmV0dXJuICMgb2YgY29ubmVjdGlvbnMgY3VycmVudGx5IHByb2Nlc3NpbmcuCisgICAqLworICBzaXplX3QgZ2V0TnVtQWN0aXZlUHJvY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIG51bUFjdGl2ZVByb2Nlc3NvcnNfOyB9CisKKyAgLy8vIEluY3JlbWVudCB0aGUgY291bnQgb2YgY29ubmVjdGlvbnMgY3VycmVudGx5IHByb2Nlc3NpbmcuCisgIHZvaWQgaW5jcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpIHsKKyAgICBHdWFyZCBnKGNvbm5NdXRleF8pOworICAgICsrbnVtQWN0aXZlUHJvY2Vzc29yc187CisgIH0KKworICAvLy8gRGVjcmVtZW50IHRoZSBjb3VudCBvZiBjb25uZWN0aW9ucyBjdXJyZW50bHkgcHJvY2Vzc2luZy4KKyAgdm9pZCBkZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCkgeworICAgIEd1YXJkIGcoY29ubk11dGV4Xyk7CisgICAgaWYgKG51bUFjdGl2ZVByb2Nlc3NvcnNfID4gMCkgeworICAgICAgLS1udW1BY3RpdmVQcm9jZXNzb3JzXzsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBtYXhpbXVtICMgb2YgY29ubmVjdGlvbnMgYWxsb3dlZCBiZWZvcmUgb3ZlcmxvYWQuCisgICAqCisgICAqIEByZXR1cm4gY3VycmVudCBzZXR0aW5nLgorICAgKi8KKyAgc2l6ZV90IGdldE1heENvbm5lY3Rpb25zKCkgY29uc3QgeyByZXR1cm4gbWF4Q29ubmVjdGlvbnNfOyB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgbWF4aW11bSAjIG9mIGNvbm5lY3Rpb25zIGFsbG93ZWQgYmVmb3JlIG92ZXJsb2FkLgorICAgKgorICAgKiBAcGFyYW0gbWF4Q29ubmVjdGlvbnMgbmV3IHNldHRpbmcgZm9yIG1heGltdW0gIyBvZiBjb25uZWN0aW9ucy4KKyAgICovCisgIHZvaWQgc2V0TWF4Q29ubmVjdGlvbnMoc2l6ZV90IG1heENvbm5lY3Rpb25zKSB7IG1heENvbm5lY3Rpb25zXyA9IG1heENvbm5lY3Rpb25zOyB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgbWF4aW11bSAjIG9mIGNvbm5lY3Rpb25zIHdhaXRpbmcgaW4gaGFuZGxlci90YXNrIGJlZm9yZSBvdmVybG9hZC4KKyAgICoKKyAgICogQHJldHVybiBjdXJyZW50IHNldHRpbmcuCisgICAqLworICBzaXplX3QgZ2V0TWF4QWN0aXZlUHJvY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIG1heEFjdGl2ZVByb2Nlc3NvcnNfOyB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgbWF4aW11bSAjIG9mIGNvbm5lY3Rpb25zIHdhaXRpbmcgaW4gaGFuZGxlci90YXNrIGJlZm9yZSBvdmVybG9hZC4KKyAgICoKKyAgICogQHBhcmFtIG1heEFjdGl2ZVByb2Nlc3NvcnMgbmV3IHNldHRpbmcgZm9yIG1heGltdW0gIyBvZiBhY3RpdmUgcHJvY2Vzc2VzLgorICAgKi8KKyAgdm9pZCBzZXRNYXhBY3RpdmVQcm9jZXNzb3JzKHNpemVfdCBtYXhBY3RpdmVQcm9jZXNzb3JzKSB7CisgICAgbWF4QWN0aXZlUHJvY2Vzc29yc18gPSBtYXhBY3RpdmVQcm9jZXNzb3JzOworICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgbWF4aW11bSBhbGxvd2VkIGZyYW1lIHNpemUuCisgICAqCisgICAqIElmIGEgY2xpZW50IHRyaWVzIHRvIHNlbmQgYSBtZXNzYWdlIGxhcmdlciB0aGFuIHRoaXMgbGltaXQsCisgICAqIGl0cyBjb25uZWN0aW9uIHdpbGwgYmUgY2xvc2VkLgorICAgKgorICAgKiBAcmV0dXJuIE1heGl1bSBmcmFtZSBzaXplLCBpbiBieXRlcy4KKyAgICovCisgIHNpemVfdCBnZXRNYXhGcmFtZVNpemUoKSBjb25zdCB7IHJldHVybiBtYXhGcmFtZVNpemVfOyB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgbWF4aW11bSBhbGxvd2VkIGZyYW1lIHNpemUuCisgICAqCisgICAqIEBwYXJhbSBtYXhGcmFtZVNpemUgVGhlIG5ldyBtYXhpbXVtIGZyYW1lIHNpemUuCisgICAqLworICB2b2lkIHNldE1heEZyYW1lU2l6ZShzaXplX3QgbWF4RnJhbWVTaXplKSB7IG1heEZyYW1lU2l6ZV8gPSBtYXhGcmFtZVNpemU7IH0KKworICAvKioKKyAgICogR2V0IGZyYWN0aW9uIG9mIG1heGltdW0gbGltaXRzIGJlZm9yZSBhbiBvdmVybG9hZCBjb25kaXRpb24gaXMgY2xlYXJlZC4KKyAgICoKKyAgICogQHJldHVybiBoeXN0ZXJlc2lzIGZyYWN0aW9uCisgICAqLworICBkb3VibGUgZ2V0T3ZlcmxvYWRIeXN0ZXJlc2lzKCkgY29uc3QgeyByZXR1cm4gb3ZlcmxvYWRIeXN0ZXJlc2lzXzsgfQorCisgIC8qKgorICAgKiBTZXQgZnJhY3Rpb24gb2YgbWF4aW11bSBsaW1pdHMgYmVmb3JlIGFuIG92ZXJsb2FkIGNvbmRpdGlvbiBpcyBjbGVhcmVkLgorICAgKiBBIGdvb2QgdmFsdWUgd291bGQgcHJvYmFibHkgYmUgYmV0d2VlbiAwLjUgYW5kIDAuOS4KKyAgICoKKyAgICogQHBhcmFtIGh5c3RlcmVzaXNGcmFjdGlvbiBmcmFjdGlvbiA8PSAxLjAuCisgICAqLworICB2b2lkIHNldE92ZXJsb2FkSHlzdGVyZXNpcyhkb3VibGUgaHlzdGVyZXNpc0ZyYWN0aW9uKSB7CisgICAgaWYgKGh5c3RlcmVzaXNGcmFjdGlvbiA8PSAxLjAgJiYgaHlzdGVyZXNpc0ZyYWN0aW9uID4gMC4wKSB7CisgICAgICBvdmVybG9hZEh5c3RlcmVzaXNfID0gaHlzdGVyZXNpc0ZyYWN0aW9uOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIGFjdGlvbiB0aGUgc2VydmVyIHdpbGwgdGFrZSBvbiBvdmVybG9hZC4KKyAgICoKKyAgICogQHJldHVybiBhIFRPdmVybG9hZEFjdGlvbiBlbnVtIHZhbHVlIGZvciB0aGUgY3VycmVudGx5IHNldCBhY3Rpb24uCisgICAqLworICBUT3ZlcmxvYWRBY3Rpb24gZ2V0T3ZlcmxvYWRBY3Rpb24oKSBjb25zdCB7IHJldHVybiBvdmVybG9hZEFjdGlvbl87IH0KKworICAvKioKKyAgICogU2V0IHRoZSBhY3Rpb24gdGhlIHNlcnZlciBpcyB0byB0YWtlIG9uIG92ZXJsb2FkLgorICAgKgorICAgKiBAcGFyYW0gb3ZlcmxvYWRBY3Rpb24gYSBUT3ZlcmxvYWRBY3Rpb24gZW51bSB2YWx1ZSBmb3IgdGhlIGFjdGlvbi4KKyAgICovCisgIHZvaWQgc2V0T3ZlcmxvYWRBY3Rpb24oVE92ZXJsb2FkQWN0aW9uIG92ZXJsb2FkQWN0aW9uKSB7IG92ZXJsb2FkQWN0aW9uXyA9IG92ZXJsb2FkQWN0aW9uOyB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgdGltZSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggYSB0YXNrIGV4cGlyZXMgKDAgPT0gaW5maW5pdGUpLgorICAgKgorICAgKiBAcmV0dXJuIGEgNjQtYml0IHRpbWUgaW4gbWlsbGlzZWNvbmRzLgorICAgKi8KKyAgaW50NjRfdCBnZXRUYXNrRXhwaXJlVGltZSgpIGNvbnN0IHsgcmV0dXJuIHRhc2tFeHBpcmVUaW1lXzsgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHdoaWNoIGEgdGFzayBleHBpcmVzICgwID09IGluZmluaXRlKS4KKyAgICoKKyAgICogQHBhcmFtIHRhc2tFeHBpcmVUaW1lIGEgNjQtYml0IHRpbWUgaW4gbWlsbGlzZWNvbmRzLgorICAgKi8KKyAgdm9pZCBzZXRUYXNrRXhwaXJlVGltZShpbnQ2NF90IHRhc2tFeHBpcmVUaW1lKSB7IHRhc2tFeHBpcmVUaW1lXyA9IHRhc2tFeHBpcmVUaW1lOyB9CisKKyAgLyoqCisgICAqIERldGVybWluZSBpZiB0aGUgc2VydmVyIGlzIGN1cnJlbnRseSBvdmVybG9hZGVkLgorICAgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGUgbWF4aW11bXMgZm9yIG9wZW4gY29ubmVjdGlvbnMgYW5kIGNvbm5lY3Rpb25zCisgICAqIGN1cnJlbnRseSBpbiBwcm9jZXNzaW5nLCBhbmQgc2V0cyBhbiBvdmVybG9hZCBjb25kaXRpb24gaWYgdGhleSBhcmUKKyAgICogZXhjZWVkZWQuICBUaGUgb3ZlcmxvYWQgd2lsbCBwZXJzaXN0IHVudGlsIGJvdGggdmFsdWVzIGFyZSBiZWxvdyB0aGUKKyAgICogY3VycmVudCBoeXN0ZXJlc2lzIGZyYWN0aW9uIG9mIHRoZWlyIG1heGltdW1zLgorICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWYgYW4gb3ZlcmxvYWQgY29uZGl0aW9uIGV4aXN0cywgZmFsc2UgaWYgbm90LgorICAgKi8KKyAgYm9vbCBzZXJ2ZXJPdmVybG9hZGVkKCk7CisKKyAgLyoqIFBvcCBhbmQgZGlzY2FyZCBuZXh0IHRhc2sgb24gdGhyZWFkcG9vbCB3YWl0IHF1ZXVlLgorICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWYgYSB0YXNrIHdhcyBkaXNjYXJkZWQsIGZhbHNlIGlmIHRoZSB3YWl0IHF1ZXVlIHdhcyBlbXB0eS4KKyAgICovCisgIGJvb2wgZHJhaW5QZW5kaW5nVGFzaygpOworCisgIC8qKgorICAgKiBHZXQgdGhlIHN0YXJ0aW5nIHNpemUgb2YgYSBUQ29ubmVjdGlvbiBvYmplY3QncyB3cml0ZSBidWZmZXIuCisgICAqCisgICAqIEByZXR1cm4gIyBieXRlcyB3ZSBpbml0aWFsaXplIGEgVENvbm5lY3Rpb24gb2JqZWN0J3Mgd3JpdGUgYnVmZmVyIHRvLgorICAgKi8KKyAgc2l6ZV90IGdldFdyaXRlQnVmZmVyRGVmYXVsdFNpemUoKSBjb25zdCB7IHJldHVybiB3cml0ZUJ1ZmZlckRlZmF1bHRTaXplXzsgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIHN0YXJ0aW5nIHNpemUgb2YgYSBUQ29ubmVjdGlvbiBvYmplY3QncyB3cml0ZSBidWZmZXIuCisgICAqCisgICAqIEBwYXJhbSBzaXplICMgYnl0ZXMgd2UgaW5pdGlhbGl6ZSBhIFRDb25uZWN0aW9uIG9iamVjdCdzIHdyaXRlIGJ1ZmZlciB0by4KKyAgICovCisgIHZvaWQgc2V0V3JpdGVCdWZmZXJEZWZhdWx0U2l6ZShzaXplX3Qgc2l6ZSkgeyB3cml0ZUJ1ZmZlckRlZmF1bHRTaXplXyA9IHNpemU7IH0KKworICAvKioKKyAgICogR2V0IHRoZSBtYXhpbXVtIHNpemUgb2YgcmVhZCBidWZmZXIgYWxsb2NhdGVkIHRvIGlkbGUgVENvbm5lY3Rpb24gb2JqZWN0cy4KKyAgICoKKyAgICogQHJldHVybiAjIGJ5dGVzIGJleW9uZCB3aGljaCB3ZSB3aWxsIGRlYWxsb2MgaWRsZSBidWZmZXIuCisgICAqLworICBzaXplX3QgZ2V0SWRsZVJlYWRCdWZmZXJMaW1pdCgpIGNvbnN0IHsgcmV0dXJuIGlkbGVSZWFkQnVmZmVyTGltaXRfOyB9CisKKyAgLyoqCisgICAqIFtOT1RFOiBUaGlzIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdXNlIGdldElkbGVSZWFkQnVmZmVyTGltaXQoKS5dCisgICAqIEdldCB0aGUgbWF4aW11bSBzaXplIG9mIHJlYWQgYnVmZmVyIGFsbG9jYXRlZCB0byBpZGxlIFRDb25uZWN0aW9uIG9iamVjdHMuCisgICAqCisgICAqIEByZXR1cm4gIyBieXRlcyBiZXlvbmQgd2hpY2ggd2Ugd2lsbCBkZWFsbG9jIGlkbGUgYnVmZmVyLgorICAgKi8KKyAgc2l6ZV90IGdldElkbGVCdWZmZXJNZW1MaW1pdCgpIGNvbnN0IHsgcmV0dXJuIGlkbGVSZWFkQnVmZmVyTGltaXRfOyB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgbWF4aW11bSBzaXplIHJlYWQgYnVmZmVyIGFsbG9jYXRlZCB0byBpZGxlIFRDb25uZWN0aW9uIG9iamVjdHMuCisgICAqIElmIGEgVENvbm5lY3Rpb24gb2JqZWN0IGlzIGZvdW5kIChlaXRoZXIgb24gY29ubmVjdGlvbiBjbG9zZSBvciBiZXR3ZWVuCisgICAqIGNhbGxzIHdoZW4gcmVzaXplQnVmZmVyRXZlcnlOXyBpcyBzZXQpIHdpdGggbW9yZSB0aGFuIHRoaXMgbXVjaCBtZW1vcnkKKyAgICogYWxsb2NhdGVkIHRvIGl0cyByZWFkIGJ1ZmZlciwgd2UgZnJlZSBpdCBhbmQgYWxsb3cgaXQgdG8gYmUgcmVpbml0aWFsaXplZAorICAgKiBvbiB0aGUgbmV4dCByZWNlaXZlZCBmcmFtZS4KKyAgICoKKyAgICogQHBhcmFtIGxpbWl0IG9mIGJ5dGVzIGJleW9uZCB3aGljaCB3ZSB3aWxsIHNocmluayBidWZmZXJzIHdoZW4gY2hlY2tlZC4KKyAgICovCisgIHZvaWQgc2V0SWRsZVJlYWRCdWZmZXJMaW1pdChzaXplX3QgbGltaXQpIHsgaWRsZVJlYWRCdWZmZXJMaW1pdF8gPSBsaW1pdDsgfQorCisgIC8qKgorICAgKiBbTk9URTogVGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHVzZSBzZXRJZGxlUmVhZEJ1ZmZlckxpbWl0KCkuXQorICAgKiBTZXQgdGhlIG1heGltdW0gc2l6ZSByZWFkIGJ1ZmZlciBhbGxvY2F0ZWQgdG8gaWRsZSBUQ29ubmVjdGlvbiBvYmplY3RzLgorICAgKiBJZiBhIFRDb25uZWN0aW9uIG9iamVjdCBpcyBmb3VuZCAoZWl0aGVyIG9uIGNvbm5lY3Rpb24gY2xvc2Ugb3IgYmV0d2VlbgorICAgKiBjYWxscyB3aGVuIHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl8gaXMgc2V0KSB3aXRoIG1vcmUgdGhhbiB0aGlzIG11Y2ggbWVtb3J5CisgICAqIGFsbG9jYXRlZCB0byBpdHMgcmVhZCBidWZmZXIsIHdlIGZyZWUgaXQgYW5kIGFsbG93IGl0IHRvIGJlIHJlaW5pdGlhbGl6ZWQKKyAgICogb24gdGhlIG5leHQgcmVjZWl2ZWQgZnJhbWUuCisgICAqCisgICAqIEBwYXJhbSBsaW1pdCBvZiBieXRlcyBiZXlvbmQgd2hpY2ggd2Ugd2lsbCBzaHJpbmsgYnVmZmVycyB3aGVuIGNoZWNrZWQuCisgICAqLworICB2b2lkIHNldElkbGVCdWZmZXJNZW1MaW1pdChzaXplX3QgbGltaXQpIHsgaWRsZVJlYWRCdWZmZXJMaW1pdF8gPSBsaW1pdDsgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIG1heGltdW0gc2l6ZSBvZiB3cml0ZSBidWZmZXIgYWxsb2NhdGVkIHRvIGlkbGUgVENvbm5lY3Rpb24gb2JqZWN0cy4KKyAgICoKKyAgICogQHJldHVybiAjIGJ5dGVzIGJleW9uZCB3aGljaCB3ZSB3aWxsIHJlYWxsb2NhdGUgYnVmZmVycyB3aGVuIGNoZWNrZWQuCisgICAqLworICBzaXplX3QgZ2V0SWRsZVdyaXRlQnVmZmVyTGltaXQoKSBjb25zdCB7IHJldHVybiBpZGxlV3JpdGVCdWZmZXJMaW1pdF87IH0KKworICAvKioKKyAgICogU2V0IHRoZSBtYXhpbXVtIHNpemUgd3JpdGUgYnVmZmVyIGFsbG9jYXRlZCB0byBpZGxlIFRDb25uZWN0aW9uIG9iamVjdHMuCisgICAqIElmIGEgVENvbm5lY3Rpb24gb2JqZWN0IGlzIGZvdW5kIChlaXRoZXIgb24gY29ubmVjdGlvbiBjbG9zZSBvciBiZXR3ZWVuCisgICAqIGNhbGxzIHdoZW4gcmVzaXplQnVmZmVyRXZlcnlOXyBpcyBzZXQpIHdpdGggbW9yZSB0aGFuIHRoaXMgbXVjaCBtZW1vcnkKKyAgICogYWxsb2NhdGVkIHRvIGl0cyB3cml0ZSBidWZmZXIsIHdlIGRlc3Ryb3kgYW5kIGNvbnN0cnVjdCB0aGF0IGJ1ZmZlciB3aXRoCisgICAqIHdyaXRlQnVmZmVyRGVmYXVsdFNpemVfIGJ5dGVzLgorICAgKgorICAgKiBAcGFyYW0gbGltaXQgb2YgYnl0ZXMgYmV5b25kIHdoaWNoIHdlIHdpbGwgc2hyaW5rIGJ1ZmZlcnMgd2hlbiBpZGxlLgorICAgKi8KKyAgdm9pZCBzZXRJZGxlV3JpdGVCdWZmZXJMaW1pdChzaXplX3QgbGltaXQpIHsgaWRsZVdyaXRlQnVmZmVyTGltaXRfID0gbGltaXQ7IH0KKworICAvKioKKyAgICogR2V0ICMgb2YgY2FsbHMgbWFkZSBiZXR3ZWVuIGJ1ZmZlciBzaXplIGNoZWNrcy4gIDAgbWVhbnMgZGlzYWJsZWQuCisgICAqCisgICAqIEByZXR1cm4gIyBvZiBjYWxscyBiZXR3ZWVuIGJ1ZmZlciBzaXplIGNoZWNrcy4KKyAgICovCisgIGludDMyX3QgZ2V0UmVzaXplQnVmZmVyRXZlcnlOKCkgY29uc3QgeyByZXR1cm4gcmVzaXplQnVmZmVyRXZlcnlOXzsgfQorCisgIC8qKgorICAgKiBDaGVjayBidWZmZXIgc2l6ZXMgZXZlcnkgImNvdW50IiBjYWxscy4gIFRoaXMgYWxsb3dzIGJ1ZmZlciBsaW1pdHMKKyAgICogdG8gYmUgZW5mb3JjZWQgZm9yIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgd2l0aCBhIGNvbnRyb2xsYWJsZSBkZWdyZWUKKyAgICogb2Ygb3ZlcmhlYWQuIDAgZGlzYWJsZXMgY2hlY2tzIGV4Y2VwdCBhdCBjb25uZWN0aW9uIGNsb3NlLgorICAgKgorICAgKiBAcGFyYW0gY291bnQgdGhlIG51bWJlciBvZiBjYWxscyBiZXR3ZWVuIGNoZWNrcywgb3IgMCB0byBkaXNhYmxlCisgICAqLworICB2b2lkIHNldFJlc2l6ZUJ1ZmZlckV2ZXJ5TihpbnQzMl90IGNvdW50KSB7IHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl8gPSBjb3VudDsgfQorCisgIC8qKgorICAgKiBNYWluIHdvcmtob3JzZSBmdW5jdGlvbiwgc3RhcnRzIHVwIHRoZSBzZXJ2ZXIgbGlzdGVuaW5nIG9uIGEgcG9ydCBhbmQKKyAgICogbG9vcHMgb3ZlciB0aGUgbGliZXZlbnQgaGFuZGxlci4KKyAgICovCisgIHZvaWQgc2VydmUoKTsKKworICAvKioKKyAgICogQ2F1c2VzIHRoZSBzZXJ2ZXIgdG8gdGVybWluYXRlIGdyYWNlZnVsbHkgKGNhbiBiZSBjYWxsZWQgZnJvbSBhbnkgdGhyZWFkKS4KKyAgICovCisgIHZvaWQgc3RvcCgpOworCisgIC8vLyBDcmVhdGVzIGEgc29ja2V0IHRvIGxpc3RlbiBvbiBhbmQgYmluZHMgaXQgdG8gdGhlIGxvY2FsIHBvcnQuCisgIHZvaWQgY3JlYXRlQW5kTGlzdGVuT25Tb2NrZXQoKTsKKworICAvKioKKyAgICogUmVnaXN0ZXIgdGhlIG9wdGlvbmFsIHVzZXItcHJvdmlkZWQgZXZlbnQtYmFzZSAoZm9yIHNpbmdsZS10aHJlYWQgc2VydmVycykKKyAgICoKKyAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgc2VydmVyIGlzIHJ1bm5pbmcgaW4gYSBzaW5nbGUtdGhyZWFkCisgICAqIG1vZGUsIGFuZCB0aGUgZXZlbnQgYmFzZSBpcyBwcm92aWRlZCBieSB0aGUgdXNlciAoaS5lLiwgdGhlIGNhbGxlcikuCisgICAqCisgICAqIEBwYXJhbSB1c2VyX2V2ZW50X2Jhc2UgdGhlIHVzZXItcHJvdmlkZWQgZXZlbnQtYmFzZS4gVGhlIHVzZXIgaXMKKyAgICogcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgdGhlIGV2ZW50IGJhc2UgbWVtb3J5LgorICAgKi8KKyAgdm9pZCByZWdpc3RlckV2ZW50cyhldmVudF9iYXNlKiB1c2VyX2V2ZW50X2Jhc2UpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBvcHRpb25hbCB1c2VyLXByb3ZpZGVkIGV2ZW50LWJhc2UgKGZvciBzaW5nbGUtdGhyZWFkIHNlcnZlcnMpLgorICAgKi8KKyAgZXZlbnRfYmFzZSogZ2V0VXNlckV2ZW50QmFzZSgpIGNvbnN0IHsgcmV0dXJuIHVzZXJFdmVudEJhc2VfOyB9CisKKyAgLyoqIFNvbWUgdHJhbnNwb3J0cywgbGlrZSBUSGVhZGVyVHJhbnNwb3J0LCByZXF1aXJlIHBhc3NpbmcgdGhyb3VnaAorICAgKiB0aGUgZnJhbWluZyBzaXplIGluc3RlYWQgb2Ygc3RyaXBwaW5nIGl0LgorICAgKi8KKyAgYm9vbCBnZXRIZWFkZXJUcmFuc3BvcnQoKTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgdGhlIHRocmVhZG1hbmFnZXIgY2FsbHMgd2hlbiBhIHRhc2sgcmVhY2hlcworICAgKiBpdHMgZXhwaXJhdGlvbiB0aW1lLiAgSXQgaXMgbmVlZGVkIHRvIGNsZWFuIHVwIHRoZSBleHBpcmVkIGNvbm5lY3Rpb24uCisgICAqCisgICAqIEBwYXJhbSB0YXNrIHRoZSBydW5uYWJsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4cGlyZWQgdGFzay4KKyAgICovCisgIHZvaWQgZXhwaXJlQ2xvc2Uoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKTsKKworICAvKioKKyAgICogUmV0dXJuIGFuIGluaXRpYWxpemVkIGNvbm5lY3Rpb24gb2JqZWN0LiAgQ3JlYXRlcyBvciByZWNvdmVycyBmcm9tCisgICAqIHBvb2wgYSBUQ29ubmVjdGlvbiBhbmQgaW5pdGlhbGl6ZXMgaXQgd2l0aCB0aGUgcHJvdmlkZWQgc29ja2V0IEZECisgICAqIGFuZCBmbGFncy4KKyAgICoKKyAgICogQHBhcmFtIHNvY2tldCBGRCBvZiBzb2NrZXQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29ubmVjdGlvbi4KKyAgICogQHBhcmFtIGFkZHIgdGhlIHNvY2thZGRyIG9mIHRoZSBjbGllbnQKKyAgICogQHBhcmFtIGFkZHJMZW4gdGhlIGxlbmd0aCBvZiBhZGRyCisgICAqIEByZXR1cm4gcG9pbnRlciB0byBpbml0aWFsaXplZCBUQ29ubmVjdGlvbiBvYmplY3QuCisgICAqLworICBUQ29ubmVjdGlvbiogY3JlYXRlQ29ubmVjdGlvbihzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KTsKKworICAvKioKKyAgICogUmV0dXJucyBhIGNvbm5lY3Rpb24gdG8gcG9vbCBvciBkZWxldGlvbi4gIElmIHRoZSBjb25uZWN0aW9uIHBvb2wKKyAgICogKGEgc3RhY2spIGlzbid0IGZ1bGwsIHBsYWNlIHRoZSBjb25uZWN0aW9uIG9iamVjdCBvbiBpdCwgb3RoZXJ3aXNlCisgICAqIGp1c3QgZGVsZXRlIGl0LgorICAgKgorICAgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgVENvbmVjdGlvbiBiZWluZyByZXR1cm5lZC4KKyAgICovCisgIHZvaWQgcmV0dXJuQ29ubmVjdGlvbihUQ29ubmVjdGlvbiogY29ubmVjdGlvbik7Cit9OworCitjbGFzcyBUTm9uYmxvY2tpbmdJT1RocmVhZCA6IHB1YmxpYyBSdW5uYWJsZSB7CitwdWJsaWM6CisgIC8vIENyZWF0ZXMgYW4gSU8gdGhyZWFkIGFuZCBzZXRzIHVwIHRoZSBldmVudCBiYXNlLiAgVGhlIGxpc3RlblNvY2tldCBzaG91bGQKKyAgLy8gYmUgYSB2YWxpZCBGRCBvbiB3aGljaCBsaXN0ZW4oKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZC4gIElmIHRoZQorICAvLyBsaXN0ZW5Tb2NrZXQgaXMgPCAwLCBhY2NlcHRpbmcgd2lsbCBub3QgYmUgZG9uZS4KKyAgVE5vbmJsb2NraW5nSU9UaHJlYWQoVE5vbmJsb2NraW5nU2VydmVyKiBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9TT0NLRVQgbGlzdGVuU29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZUhpZ2hQcmlvcml0eSk7CisKKyAgflROb25ibG9ja2luZ0lPVGhyZWFkKCk7CisKKyAgLy8gUmV0dXJucyB0aGUgZXZlbnQtYmFzZSBmb3IgdGhpcyB0aHJlYWQuCisgIGV2ZW50X2Jhc2UqIGdldEV2ZW50QmFzZSgpIGNvbnN0IHsgcmV0dXJuIGV2ZW50QmFzZV87IH0KKworICAvLyBSZXR1cm5zIHRoZSBzZXJ2ZXIgZm9yIHRoaXMgdGhyZWFkLgorICBUTm9uYmxvY2tpbmdTZXJ2ZXIqIGdldFNlcnZlcigpIGNvbnN0IHsgcmV0dXJuIHNlcnZlcl87IH0KKworICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhpcyBJTyB0aHJlYWQuCisgIGludCBnZXRUaHJlYWROdW1iZXIoKSBjb25zdCB7IHJldHVybiBudW1iZXJfOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgdGhyZWFkIGlkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC4gIFRoaXMgc2hvdWxkCisgIC8vIG9ubHkgYmUgY2FsbGVkIGFmdGVyIHRoZSB0aHJlYWQgaGFzIGJlZW4gc3RhcnRlZC4KKyAgVGhyZWFkOjppZF90IGdldFRocmVhZElkKCkgY29uc3QgeyByZXR1cm4gdGhyZWFkSWRfOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgc2VuZC1mZCBmb3IgdGFzayBjb21wbGV0ZSBub3RpZmljYXRpb25zLgorICBldnV0aWxfc29ja2V0X3QgZ2V0Tm90aWZpY2F0aW9uU2VuZEZEKCkgY29uc3QgeyByZXR1cm4gbm90aWZpY2F0aW9uUGlwZUZEc19bMV07IH0KKworICAvLyBSZXR1cm5zIHRoZSByZWFkLWZkIGZvciB0YXNrIGNvbXBsZXRlIG5vdGlmaWNhdGlvbnMuCisgIGV2dXRpbF9zb2NrZXRfdCBnZXROb3RpZmljYXRpb25SZWN2RkQoKSBjb25zdCB7IHJldHVybiBub3RpZmljYXRpb25QaXBlRkRzX1swXTsgfQorCisgIC8vIFJldHVybnMgdGhlIGFjdHVhbCB0aHJlYWQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIElPIHRocmVhZC4KKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gZ2V0VGhyZWFkKCkgY29uc3QgeyByZXR1cm4gdGhyZWFkXzsgfQorCisgIC8vIFNldHMgdGhlIGFjdHVhbCB0aHJlYWQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIElPIHRocmVhZC4KKyAgdm9pZCBzZXRUaHJlYWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4mIHQpIHsgdGhyZWFkXyA9IHQ7IH0KKworICAvLyBVc2VkIGJ5IFRDb25uZWN0aW9uIG9iamVjdHMgdG8gaW5kaWNhdGUgcHJvY2Vzc2luZyBoYXMgZmluaXNoZWQuCisgIGJvb2wgbm90aWZ5KFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb24qIGNvbm4pOworCisgIC8vIEVudGVycyB0aGUgZXZlbnQgbG9vcCBhbmQgZG9lcyBub3QgcmV0dXJuIHVudGlsIGEgY2FsbCB0byBzdG9wKCkuCisgIHZpcnR1YWwgdm9pZCBydW4oKTsKKworICAvLyBFeGl0cyB0aGUgZXZlbnQgbG9vcCBhcyBzb29uIGFzIHBvc3NpYmxlLgorICB2b2lkIHN0b3AoKTsKKworICAvLyBFbnN1cmVzIHRoYXQgdGhlIGV2ZW50LWxvb3AgdGhyZWFkIGlzIGZ1bGx5IGZpbmlzaGVkIGFuZCBzaHV0IGRvd24uCisgIHZvaWQgam9pbigpOworCisgIC8vLyBSZWdpc3RlcnMgdGhlIGV2ZW50cyBmb3IgdGhlIG5vdGlmaWNhdGlvbiAmIGxpc3RlbiBzb2NrZXRzCisgIHZvaWQgcmVnaXN0ZXJFdmVudHMoKTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEMtY2FsbGFibGUgZXZlbnQgaGFuZGxlciBmb3Igc2lnbmFsaW5nIHRhc2sgY29tcGxldGlvbi4gIFByb3ZpZGVzIGEKKyAgICogY2FsbGJhY2sgdGhhdCBsaWJldmVudCBjYW4gdW5kZXJzdGFuZCB0aGF0IHdpbGwgcmVhZCBhIGNvbm5lY3Rpb24KKyAgICogb2JqZWN0J3MgYWRkcmVzcyBmcm9tIGEgcGlwZSBhbmQgY2FsbCBjb25uZWN0aW9uLT50cmFuc2l0aW9uKCkgZm9yCisgICAqIHRoYXQgb2JqZWN0LgorICAgKgorICAgKiBAcGFyYW0gZmQgdGhlIGRlc2NyaXB0b3IgdGhlIGV2ZW50IG9jY3VycmVkIG9uLgorICAgKi8KKyAgc3RhdGljIHZvaWQgbm90aWZ5SGFuZGxlcihldnV0aWxfc29ja2V0X3QgZmQsIHNob3J0IHdoaWNoLCB2b2lkKiB2KTsKKworICAvKioKKyAgICogQy1jYWxsYWJsZSBldmVudCBoYW5kbGVyIGZvciBsaXN0ZW5lciBldmVudHMuICBQcm92aWRlcyBhIGNhbGxiYWNrCisgICAqIHRoYXQgbGliZXZlbnQgY2FuIHVuZGVyc3RhbmQgd2hpY2ggaW52b2tlcyBzZXJ2ZXItPmhhbmRsZUV2ZW50KCkuCisgICAqCisgICAqIEBwYXJhbSBmZCB0aGUgZGVzY3JpcHRvciB0aGUgZXZlbnQgb2NjdXJyZWQgb24uCisgICAqIEBwYXJhbSB3aGljaCB0aGUgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudC4KKyAgICogQHBhcmFtIHYgdm9pZCogY2FsbGJhY2sgYXJnIHdoZXJlIHdlIHBsYWNlZCBUTm9uYmxvY2tpbmdTZXJ2ZXIncyAidGhpcyIuCisgICAqLworICBzdGF0aWMgdm9pZCBsaXN0ZW5IYW5kbGVyKGV2dXRpbF9zb2NrZXRfdCBmZCwgc2hvcnQgd2hpY2gsIHZvaWQqIHYpIHsKKyAgICAoKFROb25ibG9ja2luZ1NlcnZlciopdiktPmhhbmRsZUV2ZW50KGZkLCB3aGljaCk7CisgIH0KKworICAvLy8gRXhpdHMgdGhlIGxvb3AgQVNBUCBpbiBjYXNlIG9mIHNodXRkb3duIG9yIGVycm9yLgorICB2b2lkIGJyZWFrTG9vcChib29sIGVycm9yKTsKKworICAvLy8gQ3JlYXRlIHRoZSBwaXBlIHVzZWQgdG8gbm90aWZ5IEkvTyBwcm9jZXNzIG9mIHRhc2sgY29tcGxldGlvbi4KKyAgdm9pZCBjcmVhdGVOb3RpZmljYXRpb25QaXBlKCk7CisKKyAgLy8vIFVucmVnaXN0ZXJzIG91ciBldmVudHMgZm9yIG5vdGlmaWNhdGlvbiBhbmQgbGlzdGVuIHNvY2tldHMuCisgIHZvaWQgY2xlYW51cEV2ZW50cygpOworCisgIC8vLyBTZXRzIChvciBjbGVhcnMpIGhpZ2ggcHJpb3JpdHkgc2NoZWR1bGluZyBzdGF0dXMgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgdm9pZCBzZXRDdXJyZW50VGhyZWFkSGlnaFByaW9yaXR5KGJvb2wgdmFsdWUpOworCitwcml2YXRlOgorICAvLy8gYXNzb2NpYXRlZCBzZXJ2ZXIKKyAgVE5vbmJsb2NraW5nU2VydmVyKiBzZXJ2ZXJfOworCisgIC8vLyB0aHJlYWQgbnVtYmVyIChmb3IgZGVidWdnaW5nKS4KKyAgY29uc3QgaW50IG51bWJlcl87CisKKyAgLy8vIFRoZSBhY3R1YWwgcGh5c2ljYWwgdGhyZWFkIGlkLgorICBUaHJlYWQ6OmlkX3QgdGhyZWFkSWRfOworCisgIC8vLyBJZiBsaXN0ZW5Tb2NrZXRfID49IDAsIGFkZHMgYW4gZXZlbnQgb24gdGhlIGV2ZW50X2Jhc2UgdG8gYWNjZXB0IGNvbm5zCisgIFRIUklGVF9TT0NLRVQgbGlzdGVuU29ja2V0XzsKKworICAvLy8gU2V0cyBhIGhpZ2ggc2NoZWR1bGluZyBwcmlvcml0eSB3aGVuIHJ1bm5pbmcKKyAgYm9vbCB1c2VIaWdoUHJpb3JpdHlfOworCisgIC8vLyBwb2ludGVyIHRvIGV2ZW50YmFzZSB0byBiZSB1c2VkIGZvciBsb29waW5nCisgIGV2ZW50X2Jhc2UqIGV2ZW50QmFzZV87CisKKyAgLy8vIFNldCB0byB0cnVlIGlmIHRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgdGhlIGV2ZW50IGJhc2UKKyAgLy8vIG1lbW9yeS4KKyAgYm9vbCBvd25FdmVudEJhc2VfOworCisgIC8vLyBVc2VkIHdpdGggZXZlbnRCYXNlXyBmb3IgY29ubmVjdGlvbiBldmVudHMgKG9ubHkgaW4gbGlzdGVuZXIgdGhyZWFkKQorICBzdHJ1Y3QgZXZlbnQgc2VydmVyRXZlbnRfOworCisgIC8vLyBVc2VkIHdpdGggZXZlbnRCYXNlXyBmb3IgdGFzayBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbgorICBzdHJ1Y3QgZXZlbnQgbm90aWZpY2F0aW9uRXZlbnRfOworCisgIC8vLyBGaWxlIGRlc2NyaXB0b3JzIGZvciBwaXBlIHVzZWQgZm9yIHRhc2sgY29tcGxldGlvbiBub3RpZmljYXRpb24uCisgIGV2dXRpbF9zb2NrZXRfdCBub3RpZmljYXRpb25QaXBlRkRzX1syXTsKKworICAvLy8gQWN0dWFsIElPIFRocmVhZAorICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWRfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UTk9OQkxPQ0tJTkdTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNzMxYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpZmRlZiBIQVZFX1NZU19USU1FX0gKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgeworCisjaWZkZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAoraW50IGluY3JlYXNlX21heF9mZHMoaW50IG1heF9mZHMgPSAoMSA8PCAyNCkpIHsKKyAgc3RydWN0IHJsaW1pdCBmZG1heHJsOworCisgIGZvciAoZmRtYXhybC5ybGltX2N1ciA9IG1heF9mZHMsIGZkbWF4cmwucmxpbV9tYXggPSBtYXhfZmRzOworICAgICAgIG1heF9mZHMgJiYgKHNldHJsaW1pdChSTElNSVRfTk9GSUxFLCAmZmRtYXhybCkgPCAwKTsKKyAgICAgICBmZG1heHJsLnJsaW1fY3VyID0gbWF4X2ZkcywgZmRtYXhybC5ybGltX21heCA9IG1heF9mZHMpIHsKKyAgICBtYXhfZmRzIC89IDI7CisgIH0KKworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihmZG1heHJsLnJsaW1fY3VyKTsKK30KKyNlbmRpZgorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNmQ4MTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaApAQCAtMCwwICsxLDI3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RTRVJWRVJfSF8KKyNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFNFUlZFUl9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvVFByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7CisKKy8qKgorICogVmlydHVhbCBpbnRlcmZhY2UgY2xhc3MgdGhhdCBjYW4gaGFuZGxlIGV2ZW50cyBmcm9tIHRoZSBzZXJ2ZXIgY29yZS4gVG8KKyAqIHVzZSB0aGlzIHlvdSBzaG91bGQgc3ViY2xhc3MgaXQgYW5kIGltcGxlbWVudCB0aGUgbWV0aG9kcyB0aGF0IHlvdSBjYXJlCisgKiBhYm91dC4gWW91ciBzdWJjbGFzcyBjYW4gYWxzbyBzdG9yZSBsb2NhbCBkYXRhIHRoYXQgeW91IG1heSBjYXJlIGFib3V0LAorICogc3VjaCBhcyBhZGRpdGlvbmFsICJhcmd1bWVudHMiIHRvIHRoZXNlIG1ldGhvZHMgKHN0b3JlZCBpbiB0aGUgb2JqZWN0CisgKiBpbnN0YW5jZSdzIHN0YXRlKS4KKyAqLworY2xhc3MgVFNlcnZlckV2ZW50SGFuZGxlciB7CitwdWJsaWM6CisgIHZpcnR1YWwgflRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7fQorCisgIC8qKgorICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBzZXJ2ZXIgYmVnaW5zLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHByZVNlcnZlKCkge30KKworICAvKioKKyAgICogQ2FsbGVkIHdoZW4gYSBuZXcgY2xpZW50IGhhcyBjb25uZWN0ZWQgYW5kIGlzIGFib3V0IHRvIGJlaW5nIHByb2Nlc3NpbmcuCisgICAqLworICB2aXJ0dWFsIHZvaWQqIGNyZWF0ZUNvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpIHsKKyAgICAodm9pZClpbnB1dDsKKyAgICAodm9pZClvdXRwdXQ7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvKioKKyAgICogQ2FsbGVkIHdoZW4gYSBjbGllbnQgaGFzIGZpbmlzaGVkIHJlcXVlc3QtaGFuZGxpbmcgdG8gZGVsZXRlIHNlcnZlcgorICAgKiBjb250ZXh0LgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGRlbGV0ZUNvbnRleHQodm9pZCogc2VydmVyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCkgeworICAgICh2b2lkKXNlcnZlckNvbnRleHQ7CisgICAgKHZvaWQpaW5wdXQ7CisgICAgKHZvaWQpb3V0cHV0OworICB9CisKKyAgLyoqCisgICAqIENhbGxlZCB3aGVuIGEgY2xpZW50IGlzIGFib3V0IHRvIGNhbGwgdGhlIHByb2Nlc3Nvci4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzQ29udGV4dCh2b2lkKiBzZXJ2ZXJDb250ZXh0LCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSB7CisgICAgKHZvaWQpc2VydmVyQ29udGV4dDsKKyAgICAodm9pZCl0cmFuc3BvcnQ7CisgIH0KKworcHJvdGVjdGVkOgorICAvKioKKyAgICogUHJldmVudCBkaXJlY3QgaW5zdGFudGlhdGlvbi4KKyAgICovCisgIFRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7fQorfTsKKworLyoqCisgKiBUaHJpZnQgc2VydmVyLgorICoKKyAqLworY2xhc3MgVFNlcnZlciA6IHB1YmxpYyBjb25jdXJyZW5jeTo6UnVubmFibGUgeworcHVibGljOgorICB2aXJ0dWFsIH5UU2VydmVyKCkge30KKworICB2aXJ0dWFsIHZvaWQgc2VydmUoKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIHN0b3AoKSB7fQorCisgIC8vIEFsbG93cyBydW5uaW5nIHRoZSBzZXJ2ZXIgYXMgYSBSdW5uYWJsZSB0aHJlYWQKKyAgdmlydHVhbCB2b2lkIHJ1bigpIHsgc2VydmUoKTsgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4gZ2V0UHJvY2Vzc29yRmFjdG9yeSgpIHsgcmV0dXJuIHByb2Nlc3NvckZhY3RvcnlfOyB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IGdldFNlcnZlclRyYW5zcG9ydCgpIHsgcmV0dXJuIHNlcnZlclRyYW5zcG9ydF87IH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGdldElucHV0VHJhbnNwb3J0RmFjdG9yeSgpIHsgcmV0dXJuIGlucHV0VHJhbnNwb3J0RmFjdG9yeV87IH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGdldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoKSB7CisgICAgcmV0dXJuIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGdldElucHV0UHJvdG9jb2xGYWN0b3J5KCkgeyByZXR1cm4gaW5wdXRQcm90b2NvbEZhY3RvcnlfOyB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGdldE91dHB1dFByb3RvY29sRmFjdG9yeSgpIHsgcmV0dXJuIG91dHB1dFByb3RvY29sRmFjdG9yeV87IH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZ2V0RXZlbnRIYW5kbGVyKCkgeyByZXR1cm4gZXZlbnRIYW5kbGVyXzsgfQorCitwcm90ZWN0ZWQ6CisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSkKKyAgICA6IHByb2Nlc3NvckZhY3RvcnlfKHByb2Nlc3NvckZhY3RvcnkpIHsKKyAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgIH0KKworICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yKQorICAgIDogcHJvY2Vzc29yRmFjdG9yeV8obmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvcikpIHsKKyAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgIH0KKworICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgOiBwcm9jZXNzb3JGYWN0b3J5Xyhwcm9jZXNzb3JGYWN0b3J5KSwgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKKyAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgIH0KKworICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0KQorICAgIDogcHJvY2Vzc29yRmFjdG9yeV8obmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvcikpLAorICAgICAgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKKyAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgIH0KKworICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkKKyAgICA6IHByb2Nlc3NvckZhY3RvcnlfKHByb2Nlc3NvckZhY3RvcnkpLAorICAgICAgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpLAorICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xyh0cmFuc3BvcnRGYWN0b3J5KSwKKyAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfKHRyYW5zcG9ydEZhY3RvcnkpLAorICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCisgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSkge30KKworICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpCisgICAgOiBwcm9jZXNzb3JGYWN0b3J5XyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSksCisgICAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCksCisgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfKHRyYW5zcG9ydEZhY3RvcnkpLAorICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8odHJhbnNwb3J0RmFjdG9yeSksCisgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKKyAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSB7fQorCisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorICAgIDogcHJvY2Vzc29yRmFjdG9yeV8ocHJvY2Vzc29yRmFjdG9yeSksCisgICAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCksCisgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfKGlucHV0VHJhbnNwb3J0RmFjdG9yeSksCisgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyhvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KSwKKyAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5XyhpbnB1dFByb3RvY29sRmFjdG9yeSksCisgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKG91dHB1dFByb3RvY29sRmFjdG9yeSkge30KKworICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisgICAgOiBwcm9jZXNzb3JGYWN0b3J5XyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSksCisgICAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCksCisgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfKGlucHV0VHJhbnNwb3J0RmFjdG9yeSksCisgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyhvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KSwKKyAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5XyhpbnB1dFByb3RvY29sRmFjdG9yeSksCisgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKG91dHB1dFByb3RvY29sRmFjdG9yeSkge30KKworICAvKioKKyAgICogR2V0IGEgVFByb2Nlc3NvciB0byBoYW5kbGUgY2FsbHMgb24gYSBwYXJ0aWN1bGFyIGNvbm5lY3Rpb24uCisgICAqCisgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBjb25uZWN0aW9uIChuZXZlciBvbmNlIHBlcgorICAgKiBjYWxsKS4gIFRoaXMgYWxsb3dzIHRoZSBUUHJvY2Vzc29yRmFjdG9yeSB0byByZXR1cm4gYSBkaWZmZXJlbnQgcHJvY2Vzc29yCisgICAqIGZvciBlYWNoIGNvbm5lY3Rpb24gaWYgaXQgZGVzaXJlcy4KKyAgICovCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBnZXRQcm9jZXNzb3Ioc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgeworICAgIFRDb25uZWN0aW9uSW5mbyBjb25uSW5mbzsKKyAgICBjb25uSW5mby5pbnB1dCA9IGlucHV0UHJvdG9jb2w7CisgICAgY29ubkluZm8ub3V0cHV0ID0gb3V0cHV0UHJvdG9jb2w7CisgICAgY29ubkluZm8udHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgIHJldHVybiBwcm9jZXNzb3JGYWN0b3J5Xy0+Z2V0UHJvY2Vzc29yKGNvbm5JbmZvKTsKKyAgfQorCisgIC8vIENsYXNzIHZhcmlhYmxlcworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+IHByb2Nlc3NvckZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0XzsKKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGlucHV0VHJhbnNwb3J0RmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV87CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeV87CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcl87CisKK3B1YmxpYzoKKyAgdm9pZCBzZXRJbnB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBpbnB1dFRyYW5zcG9ydEZhY3RvcnkpIHsKKyAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5OworICB9CisKKyAgdm9pZCBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSkgeworICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgfQorCisgIHZvaWQgc2V0SW5wdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5KSB7CisgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgIH0KKworICB2b2lkIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7CisgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XyA9IG91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgfQorCisgIHZvaWQgc2V0U2VydmVyRXZlbnRIYW5kbGVyKHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXIpIHsKKyAgICBldmVudEhhbmRsZXJfID0gZXZlbnRIYW5kbGVyOworICB9Cit9OworCisvKioKKyAqIEhlbHBlciBmdW5jdGlvbiB0byBpbmNyZWFzZSB0aGUgbWF4IGZpbGUgZGVzY3JpcHRvcnMgbGltaXQKKyAqIGZvciB0aGUgY3VycmVudCBwcm9jZXNzIGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuLgorICogQnkgZGVmYXVsdCwgdHJpZXMgdG8gaW5jcmVhc2UgaXQgdG8gYXMgbXVjaCBhcyAyXjI0LgorICovCisjaWZkZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAoraW50IGluY3JlYXNlX21heF9mZHMoaW50IG1heF9mZHMgPSAoMSA8PCAyNCkpOworI2VuZGlmCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFNFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JlYWEyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5jcHAKQEAgLTAsMCArMSwyNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKK3VzaW5nIHN0ZDo6YmluZDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OwordXNpbmcgc3RkOjpzdHJpbmc7CisKK1RTZXJ2ZXJGcmFtZXdvcms6OlRTZXJ2ZXJGcmFtZXdvcmsoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkKKyAgOiBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSwKKyAgICBjbGllbnRzXygwKSwKKyAgICBod21fKDApLAorICAgIGxpbWl0XyhJTlQ2NF9NQVgpIHsKK30KKworVFNlcnZlckZyYW1ld29yazo6VFNlcnZlckZyYW1ld29yayhjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkKKyAgOiBUU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpLAorICAgIGNsaWVudHNfKDApLAorICAgIGh3bV8oMCksCisgICAgbGltaXRfKElOVDY0X01BWCkgeworfQorCitUU2VydmVyRnJhbWV3b3JrOjpUU2VydmVyRnJhbWV3b3JrKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorICA6IFRTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSksCisgICAgY2xpZW50c18oMCksCisgICAgaHdtXygwKSwKKyAgICBsaW1pdF8oSU5UNjRfTUFYKSB7Cit9CisKK1RTZXJ2ZXJGcmFtZXdvcms6OlRTZXJ2ZXJGcmFtZXdvcmsoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorICA6IFRTZXJ2ZXIocHJvY2Vzc29yLAorICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSwKKyAgICBjbGllbnRzXygwKSwKKyAgICBod21fKDApLAorICAgIGxpbWl0XyhJTlQ2NF9NQVgpIHsKK30KKworVFNlcnZlckZyYW1ld29yazo6flRTZXJ2ZXJGcmFtZXdvcmsoKSB7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIHZvaWQgcmVsZWFzZU9uZURlc2NyaXB0b3IoY29uc3Qgc3RyaW5nJiBuYW1lLCBUJiBwVHJhbnNwb3J0KSB7CisgIGlmIChwVHJhbnNwb3J0KSB7CisgICAgdHJ5IHsKKyAgICAgIHBUcmFuc3BvcnQtPmNsb3NlKCk7CisgICAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7CisgICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUU2VydmVyRnJhbWV3b3JrICIgKyBuYW1lICsgIiBjbG9zZSBmYWlsZWQ6ICIpICsgdHR4LndoYXQoKTsKKyAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgVFNlcnZlckZyYW1ld29yazo6c2VydmUoKSB7CisgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gY2xpZW50OworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0OworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dHB1dFRyYW5zcG9ydDsKKyAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2w7CisgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbDsKKworICAvLyBTdGFydCB0aGUgc2VydmVyIGxpc3RlbmluZworICBzZXJ2ZXJUcmFuc3BvcnRfLT5saXN0ZW4oKTsKKworICAvLyBSdW4gdGhlIHByZVNlcnZlIGV2ZW50IHRvIGluZGljYXRlIHNlcnZlciBpcyBub3cgbGlzdGVuaW5nCisgIC8vIGFuZCB0aGF0IGl0IGlzIHNhZmUgdG8gY29ubmVjdC4KKyAgaWYgKGV2ZW50SGFuZGxlcl8pIHsKKyAgICBldmVudEhhbmRsZXJfLT5wcmVTZXJ2ZSgpOworICB9CisKKyAgLy8gRmV0Y2ggY2xpZW50IGZyb20gc2VydmVyCisgIGZvciAoOzspIHsKKyAgICB0cnkgeworICAgICAgLy8gRGVyZWZlcmVuY2UgYW55IHJlc291cmNlcyBmcm9tIGFueSBwcmV2aW91cyBjbGllbnQgY3JlYXRpb24KKyAgICAgIC8vIHN1Y2ggdGhhdCBhIGJsb2NraW5nIGFjY2VwdCBkb2VzIG5vdCBob2xkIHRoZW0gaW5kZWZpbml0ZWx5LgorICAgICAgb3V0cHV0UHJvdG9jb2wucmVzZXQoKTsKKyAgICAgIGlucHV0UHJvdG9jb2wucmVzZXQoKTsKKyAgICAgIG91dHB1dFRyYW5zcG9ydC5yZXNldCgpOworICAgICAgaW5wdXRUcmFuc3BvcnQucmVzZXQoKTsKKyAgICAgIGNsaWVudC5yZXNldCgpOworCisgICAgICAvLyBJZiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgY29uY3VycmVudAorICAgICAgLy8gY2xpZW50cyBhbGxvd2VkLCB3YWl0IGZvciBvbmUgb3IgbW9yZSBjbGllbnRzIHRvIGRyYWluIGJlZm9yZQorICAgICAgLy8gYWNjZXB0aW5nIGFub3RoZXIuCisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzeW5jKG1vbl8pOworICAgICAgICB3aGlsZSAoY2xpZW50c18gPj0gbGltaXRfKSB7CisgICAgICAgICAgbW9uXy53YWl0KCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0Xy0+YWNjZXB0KCk7CisKKyAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICBpZiAoIW91dHB1dFByb3RvY29sRmFjdG9yeV8pIHsKKyAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQsIG91dHB1dFRyYW5zcG9ydCk7CisgICAgICAgIG91dHB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOworICAgICAgfQorCisgICAgICBuZXdseUNvbm5lY3RlZENsaWVudChzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+KAorICAgICAgICAgIG5ldyBUQ29ubmVjdGVkQ2xpZW50KGdldFByb2Nlc3NvcihpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgY2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50SGFuZGxlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50KSwKKyAgICAgICAgICBiaW5kKCZUU2VydmVyRnJhbWV3b3JrOjpkaXNwb3NlQ29ubmVjdGVkQ2xpZW50LCB0aGlzLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKSk7CisKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKKyAgICAgIHJlbGVhc2VPbmVEZXNjcmlwdG9yKCJpbnB1dFRyYW5zcG9ydCIsIGlucHV0VHJhbnNwb3J0KTsKKyAgICAgIHJlbGVhc2VPbmVEZXNjcmlwdG9yKCJvdXRwdXRUcmFuc3BvcnQiLCBvdXRwdXRUcmFuc3BvcnQpOworICAgICAgcmVsZWFzZU9uZURlc2NyaXB0b3IoImNsaWVudCIsIGNsaWVudCk7CisgICAgICBpZiAodHR4LmdldFR5cGUoKSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQpIHsKKyAgICAgICAgLy8gQWNjZXB0IHRpbWVvdXQgLSBjb250aW51ZSBwcm9jZXNzaW5nLgorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSBpZiAodHR4LmdldFR5cGUoKSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRQorICAgICAgICAgICAgICAgICB8fCB0dHguZ2V0VHlwZSgpID09IFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVEKSB7CisgICAgICAgIC8vIFNlcnZlciB3YXMgaW50ZXJydXB0ZWQuICBUaGlzIG9ubHkgaGFwcGVucyB3aGVuIHN0b3BwaW5nLgorICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEFsbCBvdGhlciB0cmFuc3BvcnQgZXhjZXB0aW9ucyBhcmUgbG9nZ2VkLgorICAgICAgICAvLyBTdGF0ZSBvZiBjb25uZWN0aW9uIGlzIHVua25vd24uICBEb25lLgorICAgICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUU2VydmVyVHJhbnNwb3J0IGRpZWQ6ICIpICsgdHR4LndoYXQoKTsKKyAgICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmVsZWFzZU9uZURlc2NyaXB0b3IoInNlcnZlclRyYW5zcG9ydCIsIHNlcnZlclRyYW5zcG9ydF8pOworfQorCitpbnQ2NF90IFRTZXJ2ZXJGcmFtZXdvcms6OmdldENvbmN1cnJlbnRDbGllbnRMaW1pdCgpIGNvbnN0IHsKKyAgU3luY2hyb25pemVkIHN5bmMobW9uXyk7CisgIHJldHVybiBsaW1pdF87Cit9CisKK2ludDY0X3QgVFNlcnZlckZyYW1ld29yazo6Z2V0Q29uY3VycmVudENsaWVudENvdW50KCkgY29uc3QgeworICBTeW5jaHJvbml6ZWQgc3luYyhtb25fKTsKKyAgcmV0dXJuIGNsaWVudHNfOworfQorCitpbnQ2NF90IFRTZXJ2ZXJGcmFtZXdvcms6OmdldENvbmN1cnJlbnRDbGllbnRDb3VudEhXTSgpIGNvbnN0IHsKKyAgU3luY2hyb25pemVkIHN5bmMobW9uXyk7CisgIHJldHVybiBod21fOworfQorCit2b2lkIFRTZXJ2ZXJGcmFtZXdvcms6OnNldENvbmN1cnJlbnRDbGllbnRMaW1pdChpbnQ2NF90IG5ld0xpbWl0KSB7CisgIGlmIChuZXdMaW1pdCA8IDEpIHsKKyAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoIm5ld0xpbWl0IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8iKTsKKyAgfQorICBTeW5jaHJvbml6ZWQgc3luYyhtb25fKTsKKyAgbGltaXRfID0gbmV3TGltaXQ7CisgIGlmIChsaW1pdF8gLSBjbGllbnRzXyA+IDApIHsKKyAgICBtb25fLm5vdGlmeSgpOworICB9Cit9CisKK3ZvaWQgVFNlcnZlckZyYW1ld29yazo6c3RvcCgpIHsKKyAgLy8gT3JkZXIgaXMgaW1wb3J0YW50IGJlY2F1c2Ugc2VydmUoKSByZWxlYXNlcyBzZXJ2ZXJUcmFuc3BvcnRfIHdoZW4gaXQgaXMKKyAgLy8gaW50ZXJydXB0ZWQsIHdoaWNoIGNsb3NlcyB0aGUgc29ja2V0IHRoYXQgaW50ZXJydXB0Q2hpbGRyZW4gdXNlcy4KKyAgc2VydmVyVHJhbnNwb3J0Xy0+aW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgc2VydmVyVHJhbnNwb3J0Xy0+aW50ZXJydXB0KCk7Cit9CisKK3ZvaWQgVFNlcnZlckZyYW1ld29yazo6bmV3bHlDb25uZWN0ZWRDbGllbnQoY29uc3Qgc2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgeworICB7CisgICAgU3luY2hyb25pemVkIHN5bmMobW9uXyk7CisgICAgKytjbGllbnRzXzsKKyAgICBod21fID0gKHN0ZDo6bWF4KShod21fLCBjbGllbnRzXyk7CisgIH0KKworICBvbkNsaWVudENvbm5lY3RlZChwQ2xpZW50KTsKK30KKwordm9pZCBUU2VydmVyRnJhbWV3b3JrOjpkaXNwb3NlQ29ubmVjdGVkQ2xpZW50KFRDb25uZWN0ZWRDbGllbnQqIHBDbGllbnQpIHsKKyAgb25DbGllbnREaXNjb25uZWN0ZWQocENsaWVudCk7CisgIGRlbGV0ZSBwQ2xpZW50OworCisgIFN5bmNocm9uaXplZCBzeW5jKG1vbl8pOworICBpZiAobGltaXRfIC0gLS1jbGllbnRzXyA+IDApIHsKKyAgICBtb25fLm5vdGlmeSgpOworICB9Cit9CisKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmggYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWFjY2U1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmgKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UU0VSVkVSRlJBTUVXT1JLX0hfCisjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RTRVJWRVJGUkFNRVdPUktfSF8gMQorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHRocmlmdC9UUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgeworCisvKioKKyAqIFRTZXJ2ZXJGcmFtZXdvcmsgcHJvdmlkZXMgYSBzaW5nbGUgY29uc29saWRhdGVkIHByb2Nlc3NpbmcgbG9vcCBmb3IKKyAqIHNlcnZlcnMuICBCeSBoYXZpbmcgYSBzaW5nbGUgcHJvY2Vzc2luZyBsb29wLCBiZWhhdmlvciBiZXR3ZWVuIHNlcnZlcnMKKyAqIGlzIG1vcmUgcHJlZGljdGFibGUgYW5kIG1haW50ZW5hbmNlIGNvc3QgaXMgbG93ZXJlZC4gIEltcGxlbWVudGF0aW9ucworICogb2YgVFNlcnZlckZyYW1ld29yayBtdXN0IHByb3ZpZGUgYSBtZXRob2QgdG8gZGVhbCB3aXRoIGEgY2xpZW50IHRoYXQKKyAqIGNvbm5lY3RzIGFuZCBvbmUgdGhhdCBkaXNjb25uZWN0cy4KKyAqCisgKiBXaGlsZSB0aGlzIGZ1bmN0aW9uYWxpdHkgY291bGQgYmUgcm9sbGVkIGRpcmVjdGx5IGludG8gVFNlcnZlciwgYW5kCisgKiBwcm9iYWJseSBzaG91bGQgYmUsIGl0IHdvdWxkIGJyZWFrIHRoZSBUU2VydmVyIGludGVyZmFjZSBjb250cmFjdCBzbworICogdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIHRoaXJkIHBhcnR5IHNlcnZlcnMsIG5vIFRTZXJ2ZXJzCisgKiB3ZXJlIGhhcm1lZCBpbiB0aGUgbWFraW5nIG9mIHRoaXMgY2xhc3MuCisgKi8KK2NsYXNzIFRTZXJ2ZXJGcmFtZXdvcmsgOiBwdWJsaWMgVFNlcnZlciB7CitwdWJsaWM6CisgIFRTZXJ2ZXJGcmFtZXdvcmsoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpOworCisgIFRTZXJ2ZXJGcmFtZXdvcmsoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KTsKKworICBUU2VydmVyRnJhbWV3b3JrKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKworICBUU2VydmVyRnJhbWV3b3JrKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisKKyAgdmlydHVhbCB+VFNlcnZlckZyYW1ld29yaygpOworCisgIC8qKgorICAgKiBBY2NlcHQgY2xpZW50cyBmcm9tIHRoZSBUU2VydmVyVHJhbnNwb3J0IGFuZCBhZGQgdGhlbSBmb3IgcHJvY2Vzc2luZy4KKyAgICogQ2FsbCBzdG9wKCkgb24gYW5vdGhlciB0aHJlYWQgdG8gaW50ZXJydXB0IHByb2Nlc3NpbmcKKyAgICogYW5kIHJldHVybiBjb250cm9sIHRvIHRoZSBjYWxsZXIuCisgICAqIFBvc3QtY29uZGl0aW9ucyAocmV0dXJuIGd1YXJhbnRlZXMpOgorICAgKiAgIFRoZSBzZXJ2ZXJUcmFuc3BvcnQgd2lsbCBiZSBjbG9zZWQuCisgICAqLworICB2aXJ0dWFsIHZvaWQgc2VydmUoKTsKKworICAvKioKKyAgICogSW50ZXJydXB0IHNlcnZlKCkgc28gdGhhdCBpdCBtZWV0cyBwb3N0LWNvbmRpdGlvbnMgYW5kIHJldHVybnMuCisgICAqLworICB2aXJ0dWFsIHZvaWQgc3RvcCgpOworCisgIC8qKgorICAgKiBHZXQgdGhlIGNvbmN1cnJlbnQgY2xpZW50IGxpbWl0LgorICAgKiBccmV0dXJucyB0aGUgY29uY3VycmVudCBjbGllbnQgbGltaXQKKyAgICovCisgIHZpcnR1YWwgaW50NjRfdCBnZXRDb25jdXJyZW50Q2xpZW50TGltaXQoKSBjb25zdDsKKworICAvKioKKyAgICogR2V0IHRoZSBudW1iZXIgb2YgY3VycmVudGx5IGNvbm5lY3RlZCBjbGllbnRzLgorICAgKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGN1cnJlbnRseSBjb25uZWN0ZWQgY2xpZW50cworICAgKi8KKyAgdmlydHVhbCBpbnQ2NF90IGdldENvbmN1cnJlbnRDbGllbnRDb3VudCgpIGNvbnN0OworCisgIC8qKgorICAgKiBHZXQgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGNvbmN1cnJlbnQgY2xpZW50cy4KKyAgICogXHJldHVybnMgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGNvbmN1cnJlbnQgY2xpZW50cworICAgKi8KKyAgdmlydHVhbCBpbnQ2NF90IGdldENvbmN1cnJlbnRDbGllbnRDb3VudEhXTSgpIGNvbnN0OworCisgIC8qKgorICAgKiBTZXQgdGhlIGNvbmN1cnJlbnQgY2xpZW50IGxpbWl0LiAgVGhpcyBjYW4gYmUgY2hhbmdlZCB3aGlsZQorICAgKiB0aGUgc2VydmVyIGlzIHNlcnZpbmcgaG93ZXZlciBpdCB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZQorICAgKiBlbmZvcmNlZCB1bnRpbCB0aGUgbmV4dCBjbGllbnQgaXMgYWNjZXB0ZWQgYW5kIGFkZGVkLiAgSWYgdGhlCisgICAqIGxpbWl0IGlzIGxvd2VyZWQgYmVsb3cgdGhlIG51bWJlciBvZiBjb25uZWN0ZWQgY2xpZW50cywgbm8KKyAgICogYWN0aW9uIGlzIHRha2VuIHRvIGRpc2Nvbm5lY3QgdGhlIGNsaWVudHMuCisgICAqIFRoZSBkZWZhdWx0IHZhbHVlIHVzZWQgaWYgdGhpcyBpcyBub3QgY2FsbGVkIGlzIElOVDY0X01BWC4KKyAgICogXHBhcmFtW2luXSAgbmV3TGltaXQgIHRoZSBuZXcgbGltaXQgb2YgY29uY3VycmVudCBjbGllbnRzCisgICAqIFx0aHJvd3Mgc3RkOjppbnZhbGlkX2FyZ3VtZW50IGlmIG5ld0xpbWl0IGlzIGxlc3MgdGhhbiAxCisgICAqLworICB2aXJ0dWFsIHZvaWQgc2V0Q29uY3VycmVudENsaWVudExpbWl0KGludDY0X3QgbmV3TGltaXQpOworCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBBIGNsaWVudCBoYXMgY29ubmVjdGVkLiAgVGhlIGltcGxlbWVudGF0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUKKyAgICogbGlmZXRpbWUgb2YgdGhlIGNsaWVudCBvYmplY3QuICBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgdGhlIHNlcnZlKCkgdGhyZWFkLAorICAgKiB0aGVyZWZvcmUgYSBmYWlsdXJlIHRvIHJldHVybiBxdWlja2x5IHdpbGwgcmVzdWx0IGluIG5ldyBjbGllbnQgY29ubmVjdGlvbgorICAgKiBkZWxheXMuCisgICAqCisgICAqIFxwYXJhbVtpbl0gIHBDbGllbnQgIHRoZSBuZXdseSBjb25uZWN0ZWQgY2xpZW50CisgICAqLworICB2aXJ0dWFsIHZvaWQgb25DbGllbnRDb25uZWN0ZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSA9IDA7CisKKyAgLyoqCisgICAqIEEgY2xpZW50IGhhcyBkaXNjb25uZWN0ZWQuCisgICAqIFdoZW4gY2FsbGVkOgorICAgKiAgIFRoZSBzZXJ2ZXIgbm8gbG9uZ2VyIHRyYWNrcyB0aGUgY2xpZW50LgorICAgKiAgIFRoZSBjbGllbnQgVFRyYW5zcG9ydCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC4KKyAgICogICBUaGUgaW1wbGVtZW50YXRpb24gbXVzdCBub3QgZGVsZXRlIHRoZSBwb2ludGVyLgorICAgKgorICAgKiBccGFyYW1baW5dICBwQ2xpZW50ICB0aGUgZGlzY29ubmVjdGVkIGNsaWVudAorICAgKi8KKyAgdmlydHVhbCB2b2lkIG9uQ2xpZW50RGlzY29ubmVjdGVkKFRDb25uZWN0ZWRDbGllbnQqIHBDbGllbnQpID0gMDsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIENvbW1vbiBoYW5kbGluZyBmb3IgbmV3IGNvbm5lY3RlZCBjbGllbnRzLiAgSW1wbGVtZW50cyBjb25jdXJyZW50CisgICAqIGNsaWVudCByYXRlIGxpbWl0aW5nIGFmdGVyIG9uQ2xpZW50Q29ubmVjdGVkIHJldHVybnMgYnkgYmxvY2tpbmcgdGhlCisgICAqIHNlcnZlKCkgdGhyZWFkIGlmIHRoZSBsaW1pdCBoYXMgYmVlbiByZWFjaGVkLgorICAgKi8KKyAgdm9pZCBuZXdseUNvbm5lY3RlZENsaWVudChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpOworCisgIC8qKgorICAgKiBTbWFydCBwb2ludGVyIGNsaWVudCBkZWxldGlvbi4KKyAgICogQ2FsbHMgb25DbGllbnREaXNjb25uZWN0ZWQgYW5kIHRoZW4gZGVsZXRlcyBwQ2xpZW50LgorICAgKi8KKyAgdm9pZCBkaXNwb3NlQ29ubmVjdGVkQ2xpZW50KFRDb25uZWN0ZWRDbGllbnQqIHBDbGllbnQpOworCisgIC8qKgorICAgKiBNb25pdG9yIGZvciBsaW1pdGluZyB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgY2xpZW50cy4KKyAgICovCisgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvciBtb25fOworCisgIC8qKgorICAgKiBUaGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgY2xpZW50cy4KKyAgICovCisgIGludDY0X3QgY2xpZW50c187CisKKyAgLyoqCisgICAqIFRoZSBoaWdoIHdhdGVyIG1hcmsgb2YgY29uY3VycmVudCBjbGllbnRzLgorICAgKi8KKyAgaW50NjRfdCBod21fOworCisgIC8qKgorICAgKiBUaGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBjb25jdXJyZW50IGNsaWVudHMuCisgICAqLworICBpbnQ2NF90IGxpbWl0XzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFNFUlZFUkZSQU1FV09SS19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE2MjM0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcHAKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnN0cmluZzsKKworVFNpbXBsZVNlcnZlcjo6VFNpbXBsZVNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KQorICA6IFRTZXJ2ZXJGcmFtZXdvcmsocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpIHsKKyAgVFNlcnZlckZyYW1ld29yazo6c2V0Q29uY3VycmVudENsaWVudExpbWl0KDEpOworfQorCitUU2ltcGxlU2VydmVyOjpUU2ltcGxlU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KQorICA6IFRTZXJ2ZXJGcmFtZXdvcmsocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkgeworICBUU2VydmVyRnJhbWV3b3JrOjpzZXRDb25jdXJyZW50Q2xpZW50TGltaXQoMSk7Cit9CisKK1RTaW1wbGVTZXJ2ZXI6OlRTaW1wbGVTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7CisgIFRTZXJ2ZXJGcmFtZXdvcms6OnNldENvbmN1cnJlbnRDbGllbnRMaW1pdCgxKTsKK30KKworVFNpbXBsZVNlcnZlcjo6VFNpbXBsZVNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHsKKyAgVFNlcnZlckZyYW1ld29yazo6c2V0Q29uY3VycmVudENsaWVudExpbWl0KDEpOworfQorCitUU2ltcGxlU2VydmVyOjp+VFNpbXBsZVNlcnZlcigpIHsKK30KKworLyoqCisgKiBUaGUgbWFpbiBib2R5IG9mIGN1c3RvbWl6ZWQgaW1wbGVtZW50YXRpb24gZm9yIFRTaW1wbGVTZXJ2ZXIgaXMgcXVpdGUgc2ltcGxlOgorICogV2hlbiBhIGNsaWVudCBjb25uZWN0cywgdXNlIHRoZSBzZXJ2ZSgpIHRocmVhZCB0byBkcml2ZSBpdCB0byBjb21wbGV0aW9uIHRodXMKKyAqIGJsb2NraW5nIG5ldyBjb25uZWN0aW9ucy4KKyAqLwordm9pZCBUU2ltcGxlU2VydmVyOjpvbkNsaWVudENvbm5lY3RlZChjb25zdCBzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSB7CisgIHBDbGllbnQtPnJ1bigpOworfQorCisvKioKKyAqIFRTaW1wbGVTZXJ2ZXIgZG9lcyBub3QgdHJhY2sgY2xpZW50cyBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIGhlcmUuCisgKi8KK3ZvaWQgVFNpbXBsZVNlcnZlcjo6b25DbGllbnREaXNjb25uZWN0ZWQoVENvbm5lY3RlZENsaWVudCopIHsKK30KKworLyoqCisgKiBUaGlzIG1ha2VzIGxpdHRsZSBzZW5zZSB0byB0aGUgc2ltcGxlIHNlcnZlciBiZWNhdXNlIGl0IGlzIG5vdCBjYXBhYmxlCisgKiBvZiBoYXZpbmcgbW9yZSB0aGFuIG9uZSBjbGllbnQgYXQgYSB0aW1lLCBzbyB3ZSBoaWRlIGl0LgorICovCit2b2lkIFRTaW1wbGVTZXJ2ZXI6OnNldENvbmN1cnJlbnRDbGllbnRMaW1pdChpbnQ2NF90KSB7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU0OTIyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UU0lNUExFU0VSVkVSX0hfCisjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RTSU1QTEVTRVJWRVJfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBtb3N0IGJhc2ljIHNpbXBsZSBzZXJ2ZXIuIEl0IGlzIHNpbmdsZS10aHJlYWRlZCBhbmQgcnVucyBhCisgKiBjb250aW51b3VzIGxvb3Agb2YgYWNjZXB0aW5nIGEgc2luZ2xlIGNvbm5lY3Rpb24sIHByb2Nlc3NpbmcgcmVxdWVzdHMgb24KKyAqIHRoYXQgY29ubmVjdGlvbiB1bnRpbCBpdCBjbG9zZXMsIGFuZCB0aGVuIHJlcGVhdGluZy4KKyAqLworY2xhc3MgVFNpbXBsZVNlcnZlciA6IHB1YmxpYyBUU2VydmVyRnJhbWV3b3JrIHsKK3B1YmxpYzoKKyAgVFNpbXBsZVNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSk7CisKKyAgVFNpbXBsZVNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpOworCisgIFRTaW1wbGVTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOworCisgIFRTaW1wbGVTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKworICB2aXJ0dWFsIH5UU2ltcGxlU2VydmVyKCk7CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgLyogb3ZlcnJpZGUgKi87CisgIHZpcnR1YWwgdm9pZCBvbkNsaWVudERpc2Nvbm5lY3RlZChUQ29ubmVjdGVkQ2xpZW50KiBwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKKworcHJpdmF0ZToKKyAgdm9pZCBzZXRDb25jdXJyZW50Q2xpZW50TGltaXQoaW50NjRfdCBuZXdMaW1pdCk7IC8vIGhpZGUKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFNJTVBMRVNFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTM0NWE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgeworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzdHJpbmc7CisKK1RUaHJlYWRQb29sU2VydmVyOjpUVGhyZWFkUG9vbFNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCisgICAgdGhyZWFkTWFuYWdlcl8odGhyZWFkTWFuYWdlciksCisgICAgdGltZW91dF8oMCksCisgICAgdGFza0V4cGlyYXRpb25fKDApIHsKK30KKworVFRocmVhZFBvb2xTZXJ2ZXI6OlRUaHJlYWRQb29sU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSwKKyAgICB0aHJlYWRNYW5hZ2VyXyh0aHJlYWRNYW5hZ2VyKSwKKyAgICB0aW1lb3V0XygwKSwKKyAgICB0YXNrRXhwaXJhdGlvbl8oMCkgeworfQorCitUVGhyZWFkUG9vbFNlcnZlcjo6VFRocmVhZFBvb2xTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSwKKyAgICB0aHJlYWRNYW5hZ2VyXyh0aHJlYWRNYW5hZ2VyKSwKKyAgICB0aW1lb3V0XygwKSwKKyAgICB0YXNrRXhwaXJhdGlvbl8oMCkgeworfQorCitUVGhyZWFkUG9vbFNlcnZlcjo6VFRocmVhZFBvb2xTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyKQorICA6IFRTZXJ2ZXJGcmFtZXdvcmsocHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSwKKyAgICB0aHJlYWRNYW5hZ2VyXyh0aHJlYWRNYW5hZ2VyKSwKKyAgICB0aW1lb3V0XygwKSwKKyAgICB0YXNrRXhwaXJhdGlvbl8oMCkgeworfQorCitUVGhyZWFkUG9vbFNlcnZlcjo6flRUaHJlYWRQb29sU2VydmVyKCkgeworfQorCit2b2lkIFRUaHJlYWRQb29sU2VydmVyOjpzZXJ2ZSgpIHsKKyAgVFNlcnZlckZyYW1ld29yazo6c2VydmUoKTsKKyAgdGhyZWFkTWFuYWdlcl8tPnN0b3AoKTsKK30KKworaW50NjRfdCBUVGhyZWFkUG9vbFNlcnZlcjo6Z2V0VGltZW91dCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRpbWVvdXRfOworfQorCit2b2lkIFRUaHJlYWRQb29sU2VydmVyOjpzZXRUaW1lb3V0KGludDY0X3QgdmFsdWUpIHsKKyAgdGltZW91dF8gPSB2YWx1ZTsKK30KKworaW50NjRfdCBUVGhyZWFkUG9vbFNlcnZlcjo6Z2V0VGFza0V4cGlyYXRpb24oKSBjb25zdCB7CisgIHJldHVybiB0YXNrRXhwaXJhdGlvbl87Cit9CisKK3ZvaWQgVFRocmVhZFBvb2xTZXJ2ZXI6OnNldFRhc2tFeHBpcmF0aW9uKGludDY0X3QgdmFsdWUpIHsKKyAgdGFza0V4cGlyYXRpb25fID0gdmFsdWU7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+CitUVGhyZWFkUG9vbFNlcnZlcjo6Z2V0VGhyZWFkTWFuYWdlcigpIGNvbnN0IHsKKyAgcmV0dXJuIHRocmVhZE1hbmFnZXJfOworfQorCit2b2lkIFRUaHJlYWRQb29sU2VydmVyOjpvbkNsaWVudENvbm5lY3RlZChjb25zdCBzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSB7CisgIHRocmVhZE1hbmFnZXJfLT5hZGQocENsaWVudCwgZ2V0VGltZW91dCgpLCBnZXRUYXNrRXhwaXJhdGlvbigpKTsKK30KKwordm9pZCBUVGhyZWFkUG9vbFNlcnZlcjo6b25DbGllbnREaXNjb25uZWN0ZWQoVENvbm5lY3RlZENsaWVudCopIHsKK30KKworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIxOTk4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RUSFJFQURQT09MU0VSVkVSX0hfCisjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RUSFJFQURQT09MU0VSVkVSX0hfIDEKKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CisKKy8qKgorICogTWFuYWdlIGNsaWVudHMgdXNpbmcgYSB0aHJlYWQgcG9vbC4KKyAqLworY2xhc3MgVFRocmVhZFBvb2xTZXJ2ZXIgOiBwdWJsaWMgVFNlcnZlckZyYW1ld29yayB7CitwdWJsaWM6CisgIFRUaHJlYWRQb29sU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgID0gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKCkpOworCisgIFRUaHJlYWRQb29sU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCisgICAgICA9IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcigpKTsKKworICBUVGhyZWFkUG9vbFNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCisgICAgICA9IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcigpKTsKKworICBUVGhyZWFkUG9vbFNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgorICAgICAgPSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoKSk7CisKKyAgdmlydHVhbCB+VFRocmVhZFBvb2xTZXJ2ZXIoKTsKKworICAvKioKKyAgICogUG9zdC1jb25kaXRpb25zIChyZXR1cm4gZ3VhcmFudGVlcyk6CisgICAqICAgVGhlcmUgd2lsbCBiZSBubyBjbGllbnRzIGNvbm5lY3RlZC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBzZXJ2ZSgpOworCisgIHZpcnR1YWwgaW50NjRfdCBnZXRUaW1lb3V0KCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBzZXRUaW1lb3V0KGludDY0X3QgdmFsdWUpOworCisgIHZpcnR1YWwgaW50NjRfdCBnZXRUYXNrRXhwaXJhdGlvbigpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgc2V0VGFza0V4cGlyYXRpb24oaW50NjRfdCB2YWx1ZSk7CisKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiBnZXRUaHJlYWRNYW5hZ2VyKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgLyogb3ZlcnJpZGUgKi87CisgIHZpcnR1YWwgdm9pZCBvbkNsaWVudERpc2Nvbm5lY3RlZChUQ29ubmVjdGVkQ2xpZW50KiBwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKKworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyXzsKKyAgc3RkOjphdG9taWM8aW50NjRfdD4gdGltZW91dF87CisgIHN0ZDo6YXRvbWljPGludDY0X3Q+IHRhc2tFeHBpcmF0aW9uXzsKK307CisKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UVEhSRUFEUE9PTFNFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNjRkZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpSdW5uYWJsZTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3luY2hyb25pemVkOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKK3VzaW5nIHN0ZDo6bWFrZV9zaGFyZWQ7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeTsKKworVFRocmVhZGVkU2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCisgICAgdGhyZWFkRmFjdG9yeV8odGhyZWFkRmFjdG9yeSkgeworfQorCitUVGhyZWFkZWRTZXJ2ZXI6OlRUaHJlYWRlZFNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSwKKyAgICB0aHJlYWRGYWN0b3J5Xyh0aHJlYWRGYWN0b3J5KSB7Cit9CisKK1RUaHJlYWRlZFNlcnZlcjo6VFRocmVhZGVkU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5KQorICA6IFRTZXJ2ZXJGcmFtZXdvcmsocHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSksCisgICAgdGhyZWFkRmFjdG9yeV8odGhyZWFkRmFjdG9yeSkgeworfQorCitUVGhyZWFkZWRTZXJ2ZXI6OlRUaHJlYWRlZFNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkpLAorICAgIHRocmVhZEZhY3RvcnlfKHRocmVhZEZhY3RvcnkpIHsKK30KKworVFRocmVhZGVkU2VydmVyOjp+VFRocmVhZGVkU2VydmVyKCkgeworfQorCit2b2lkIFRUaHJlYWRlZFNlcnZlcjo6c2VydmUoKSB7CisgIFRTZXJ2ZXJGcmFtZXdvcms6OnNlcnZlKCk7CisKKyAgLy8gRW5zdXJlIHBvc3QtY29uZGl0aW9uIG9mIG5vIGFjdGl2ZSBjbGllbnRzCisgIFN5bmNocm9uaXplZCBzKGNsaWVudE1vbml0b3JfKTsKKyAgd2hpbGUgKCFhY3RpdmVDbGllbnRNYXBfLmVtcHR5KCkpIHsKKyAgICBjbGllbnRNb25pdG9yXy53YWl0KCk7CisgIH0KKworICBkcmFpbkRlYWRDbGllbnRzKCk7Cit9CisKK3ZvaWQgVFRocmVhZGVkU2VydmVyOjpkcmFpbkRlYWRDbGllbnRzKCkgeworICAvLyB3ZSdyZSBpbiBhIG1vbml0b3IgaGVyZQorICB3aGlsZSAoIWRlYWRDbGllbnRNYXBfLmVtcHR5KCkpIHsKKyAgICBDbGllbnRNYXA6Oml0ZXJhdG9yIGl0ID0gZGVhZENsaWVudE1hcF8uYmVnaW4oKTsKKyAgICBpdC0+c2Vjb25kLT5qb2luKCk7CisgICAgZGVhZENsaWVudE1hcF8uZXJhc2UoaXQpOworICB9Cit9CisKK3ZvaWQgVFRocmVhZGVkU2VydmVyOjpvbkNsaWVudENvbm5lY3RlZChjb25zdCBzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSB7CisgIFN5bmNocm9uaXplZCBzeW5jKGNsaWVudE1vbml0b3JfKTsKKyAgc2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50UnVubmVyPiBwUnVubmFibGUgPSBtYWtlX3NoYXJlZDxUQ29ubmVjdGVkQ2xpZW50UnVubmVyPihwQ2xpZW50KTsKKyAgc2hhcmVkX3B0cjxUaHJlYWQ+IHBUaHJlYWQgPSB0aHJlYWRGYWN0b3J5Xy0+bmV3VGhyZWFkKHBSdW5uYWJsZSk7CisgIHBSdW5uYWJsZS0+dGhyZWFkKHBUaHJlYWQpOworICBhY3RpdmVDbGllbnRNYXBfLmluc2VydChDbGllbnRNYXA6OnZhbHVlX3R5cGUocENsaWVudC5nZXQoKSwgcFRocmVhZCkpOworICBwVGhyZWFkLT5zdGFydCgpOworfQorCit2b2lkIFRUaHJlYWRlZFNlcnZlcjo6b25DbGllbnREaXNjb25uZWN0ZWQoVENvbm5lY3RlZENsaWVudCogcENsaWVudCkgeworICBTeW5jaHJvbml6ZWQgc3luYyhjbGllbnRNb25pdG9yXyk7CisgIGRyYWluRGVhZENsaWVudHMoKTsgLy8gdXNlIHRoZSBvdXRnb2luZyB0aHJlYWQgdG8gZG8gc29tZSBtYWludGVuYW5jZSBvbiBvdXIgZGVhZCBjbGllbnQgYmFja2xvZworICBDbGllbnRNYXA6Oml0ZXJhdG9yIGl0ID0gYWN0aXZlQ2xpZW50TWFwXy5maW5kKHBDbGllbnQpOworICBpZiAoaXQgIT0gYWN0aXZlQ2xpZW50TWFwXy5lbmQoKSkgeworICAgIENsaWVudE1hcDo6aXRlcmF0b3IgZW5kID0gaXQ7CisgICAgZGVhZENsaWVudE1hcF8uaW5zZXJ0KGl0LCArK2VuZCk7CisgICAgYWN0aXZlQ2xpZW50TWFwXy5lcmFzZShpdCk7CisgIH0KKyAgaWYgKGFjdGl2ZUNsaWVudE1hcF8uZW1wdHkoKSkgeworICAgIGNsaWVudE1vbml0b3JfLm5vdGlmeSgpOworICB9Cit9CisKK1RUaHJlYWRlZFNlcnZlcjo6VENvbm5lY3RlZENsaWVudFJ1bm5lcjo6VENvbm5lY3RlZENsaWVudFJ1bm5lcihjb25zdCBzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KQorICA6IHBDbGllbnRfKHBDbGllbnQpIHsKK30KKworVFRocmVhZGVkU2VydmVyOjpUQ29ubmVjdGVkQ2xpZW50UnVubmVyOjp+VENvbm5lY3RlZENsaWVudFJ1bm5lcigpIHsKK30KKwordm9pZCBUVGhyZWFkZWRTZXJ2ZXI6OlRDb25uZWN0ZWRDbGllbnRSdW5uZXI6OnJ1bigpIC8qIG92ZXJyaWRlICovIHsKKyAgcENsaWVudF8tPnJ1bigpOyAgLy8gUnVuIHRoZSBjbGllbnQKKyAgcENsaWVudF8ucmVzZXQoKTsgLy8gVGhlIGNsaWVudCBpcyBkb25lIC0gcmVsZWFzZSBpdCBoZXJlIHJhdGhlciB0aGFuIGluIHRoZSBkZXN0cnVjdG9yIGZvciBzYWZldHkKK30KKworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWNjZDAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaApAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RUSFJFQURFRFNFUlZFUl9IXworI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UVEhSRUFERURTRVJWRVJfSF8gMQorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgeworCisvKioKKyAqIE1hbmFnZSBjbGllbnRzIHVzaW5nIHRocmVhZHMgLSB0aHJlYWRzIGFyZSBjcmVhdGVkIG9uZSBmb3IgZWFjaCBjbGllbnQgYW5kIGFyZQorICogcmVsZWFzZWQgd2hlbiB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzLiAgVGhpcyBzZXJ2ZXIgaXMgdXNlZCB0byBtYWtlIGEgZHluYW1pY2FsbHkKKyAqIHNjYWxhYmxlIHNlcnZlciB1cCB0byB0aGUgY29uY3VycmVudCBjb25uZWN0aW9uIGxpbWl0LgorICovCitjbGFzcyBUVGhyZWFkZWRTZXJ2ZXIgOiBwdWJsaWMgVFNlcnZlckZyYW1ld29yayB7CitwdWJsaWM6CisgIFRUaHJlYWRlZFNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5CisgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeShmYWxzZSkpKTsKKworICBUVGhyZWFkZWRTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkKKyAgICAgID0gc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KGZhbHNlKSkpOworCisgIFRUaHJlYWRlZFNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5CisgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeShmYWxzZSkpKTsKKworICBUVGhyZWFkZWRTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkKKyAgICAgID0gc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KGZhbHNlKSkpOworCisgIHZpcnR1YWwgflRUaHJlYWRlZFNlcnZlcigpOworCisgIC8qKgorICAgKiBQb3N0LWNvbmRpdGlvbnMgKHJldHVybiBndWFyYW50ZWVzKToKKyAgICogICBUaGVyZSB3aWxsIGJlIG5vIGNsaWVudHMgY29ubmVjdGVkLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHNlcnZlKCk7CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqIERyYWluIHJlY2VudGx5IGNvbm5lY3RlZCBjbGllbnRzIGJ5IGpvaW5pbmcgdGhlaXIgdGhyZWFkcyAtIHRoaXMgaXMgZG9uZSBsYXppbHkgYmVjYXVzZQorICAgKiB3ZSBjYW5ub3QgZG8gaXQgaW5zaWRlIHRoZSB0aHJlYWQgY29udGV4dCB0aGF0IGlzIGRpc2Nvbm5lY3RpbmcuCisgICAqLworICB2aXJ0dWFsIHZvaWQgZHJhaW5EZWFkQ2xpZW50cygpOworCisgIC8qKgorICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBUU2VydmVyRnJhbWV3b3JrOjpvbkNsaWVudENvbm5lY3RlZAorICAgKi8KKyAgdmlydHVhbCB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgLyogb3ZlcnJpZGUgKi87CisKKyAgLyoqCisgICAqIEltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJGcmFtZXdvcms6Om9uQ2xpZW50RGlzY29ubmVjdGVkCisgICAqLworICB2aXJ0dWFsIHZvaWQgb25DbGllbnREaXNjb25uZWN0ZWQoVENvbm5lY3RlZENsaWVudCAqcENsaWVudCkgLyogb3ZlcnJpZGUgKi87CisKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeV87CisKKyAgLyoqCisgICAqIEEgaGVscGVyIHdyYXBwZXIgdXNlZCB0byB3cmFwIHRoZSBjbGllbnQgaW4gc29tZXRoaW5nIHdlIGNhbiB1c2UgdG8gbWFpbnRhaW4KKyAgICogdGhlIGxpZmV0aW1lIG9mIHRoZSBjb25uZWN0ZWQgY2xpZW50IHdpdGhpbiBhIGRldGFjaGVkIHRocmVhZC4gIFdlIGNhbm5vdCBzaW1wbHkKKyAgICogdHJhY2sgdGhlIHRocmVhZHMgYmVjYXVzZSBhIHNoYXJlZF9wdHI8VGhyZWFkPiBoYW5ncyBvbiB0byB0aGUgUnVubmFibGUgaXQgaXMKKyAgICogcGFzc2VkLCBhbmQgVFNlcnZlckZyYW1ld29yayByZXF1aXJlcyB0aGUgcnVubmFibGUgKFRDb25uZWN0ZWRDbGllbnQpIHRvIGJlCisgICAqIGRlc3Ryb3llZCBpbiBvcmRlciB0byB3b3JrIHByb3Blcmx5LgorICAgKi8KKyAgY2xhc3MgVENvbm5lY3RlZENsaWVudFJ1bm5lciA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlCisgIHsKKyAgcHVibGljOgorICAgIFRDb25uZWN0ZWRDbGllbnRSdW5uZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KTsKKyAgICB2aXJ0dWFsIH5UQ29ubmVjdGVkQ2xpZW50UnVubmVyKCk7CisgICAgdm9pZCBydW4oKSAvKiBvdmVycmlkZSAqLzsKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4gcENsaWVudF87CisgIH07CisKKyAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yIGNsaWVudE1vbml0b3JfOworCisgIHR5cGVkZWYgc3RkOjptYXA8VENvbm5lY3RlZENsaWVudCAqLCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+ID4gQ2xpZW50TWFwOworCisgIC8qKgorICAgKiBBIG1hcCBvZiBhY3RpdmUgY2xpZW50cworICAgKi8KKyAgQ2xpZW50TWFwIGFjdGl2ZUNsaWVudE1hcF87CisKKyAgLyoqCisgICAqIEEgbWFwIG9mIGNsaWVudHMgdGhhdCBoYXZlIGRpc2Nvbm5lY3RlZCBidXQgdGhlaXIgdGhyZWFkcyBoYXZlIG5vdCBiZWVuIGpvaW5lZAorICAgKi8KKyAgQ2xpZW50TWFwIGRlYWRDbGllbnRNYXBfOworfTsKKworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RUSFJFQURFRFNFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RocmlmdC1jb25maWcuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90aHJpZnQtY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0ODcwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90aHJpZnQtY29uZmlnLmgKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvY29uZmlnLmg+CisjZWxzZQorI2luY2x1ZGUgPHRocmlmdC9jb25maWcuaD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OTEwNTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0LmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1BMQVRGT1JNX1NPQ0tFVF9IXworIyAgZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1BMQVRGT1JNX1NPQ0tFVF9IXworCisjaWZkZWYgX1dJTjMyCisjICBpbmNsdWRlIDx3aW5zb2NrMi5oPgorIyAgZGVmaW5lIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SIDo6V1NBR2V0TGFzdEVycm9yKCkKKyMgIGRlZmluZSBUSFJJRlRfRVJSTk8gKCpfZXJybm8oKSkKKyMgIGRlZmluZSBUSFJJRlRfRUlOUFJPR1JFU1MgV1NBRUlOUFJPR1JFU1MKKyMgIGRlZmluZSBUSFJJRlRfRUFHQUlOIFdTQUVXT1VMREJMT0NLCisjICBkZWZpbmUgVEhSSUZUX0VJTlRSIFdTQUVJTlRSCisjICBkZWZpbmUgVEhSSUZUX0VDT05OUkVTRVQgV1NBRUNPTk5SRVNFVAorIyAgZGVmaW5lIFRIUklGVF9FTk9UQ09OTiBXU0FFTk9UQ09OTgorIyAgZGVmaW5lIFRIUklGVF9FVElNRURPVVQgV1NBRVRJTUVET1VUCisjICBkZWZpbmUgVEhSSUZUX0VXT1VMREJMT0NLIFdTQUVXT1VMREJMT0NLCisjICBkZWZpbmUgVEhSSUZUX0VQSVBFIFdTQUVDT05OUkVTRVQKKyMgIGRlZmluZSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgU09fRVhDTFVTSVZFQUREUlVTRQorIyAgZGVmaW5lIFRIUklGVF9TT0NLRVQgU09DS0VUCisjICBkZWZpbmUgVEhSSUZUX0lOVkFMSURfU09DS0VUIElOVkFMSURfU09DS0VUCisjICBkZWZpbmUgVEhSSUZUX1NPQ0tFVFBBSVIgdGhyaWZ0X3NvY2tldHBhaXIKKyMgIGRlZmluZSBUSFJJRlRfRkNOVEwgdGhyaWZ0X2ZjbnRsCisjICBkZWZpbmUgVEhSSUZUX09fTk9OQkxPQ0sgMQorIyAgZGVmaW5lIFRIUklGVF9GX0dFVEZMIDAKKyMgIGRlZmluZSBUSFJJRlRfRl9TRVRGTCAxCisjICBkZWZpbmUgVEhSSUZUX0dFVFRJTUVPRkRBWSB0aHJpZnRfZ2V0dGltZW9mZGF5CisjICBkZWZpbmUgVEhSSUZUX0NMT1NFU09DS0VUIGNsb3Nlc29ja2V0CisjICBkZWZpbmUgVEhSSUZUX0NMT1NFIF9jbG9zZQorIyAgZGVmaW5lIFRIUklGVF9PUEVOIF9vcGVuCisjICBkZWZpbmUgVEhSSUZUX0ZUUlVOQ0FURSBfY2hzaXplX3MKKyMgIGRlZmluZSBUSFJJRlRfRlNZTkMgX2NvbW1pdAorIyAgZGVmaW5lIFRIUklGVF9MU0VFSyBfbHNlZWsKKyMgIGRlZmluZSBUSFJJRlRfV1JJVEUgX3dyaXRlCisjICBkZWZpbmUgVEhSSUZUX1JFQUQgX3JlYWQKKyMgIGRlZmluZSBUSFJJRlRfSU9DVExfU09DS0VUIGlvY3Rsc29ja2V0CisjICBkZWZpbmUgVEhSSUZUX0lPQ1RMX1NPQ0tFVF9OVU1fQllURVNfVFlQRSB1X2xvbmcKKyMgIGRlZmluZSBUSFJJRlRfRlNUQVQgX2ZzdGF0CisjICBkZWZpbmUgVEhSSUZUX1NUQVQgX3N0YXQKKyMgIGlmZGVmIF9XSU4zMl9XQ0UKKyMgICAgZGVmaW5lIFRIUklGVF9HQUlfU1RSRVJST1IoLi4uKSB0aHJpZnRfd3N0cjJzdHIoZ2FpX3N0cmVycm9yVyhfX1ZBX0FSR1NfXykpCisjICBlbHNlCisjICAgIGRlZmluZSBUSFJJRlRfR0FJX1NUUkVSUk9SIGdhaV9zdHJlcnJvckEKKyMgIGVuZGlmCisjICBkZWZpbmUgVEhSSUZUX1NTSVpFVCBwdHJkaWZmX3QKKyMgIGlmIChfTVNDX1ZFUiA8IDE5MDApCisjICAgIGRlZmluZSBUSFJJRlRfU05QUklOVEYgX3NucHJpbnRmCisjICBlbHNlCisjICAgIGRlZmluZSBUSFJJRlRfU05QUklOVEYgc25wcmludGYKKyMgIGVuZGlmCisjICBkZWZpbmUgVEhSSUZUX1NMRUVQX1NFQyB0aHJpZnRfc2xlZXAKKyMgIGRlZmluZSBUSFJJRlRfU0xFRVBfVVNFQyB0aHJpZnRfdXNsZWVwCisjICBkZWZpbmUgVEhSSUZUX1RJTUVTUEVDIHRocmlmdF90aW1lc3BlYworIyAgZGVmaW5lIFRIUklGVF9DVElNRV9SIHRocmlmdF9jdGltZV9yCisjICBkZWZpbmUgVEhSSUZUX1BPTEwgdGhyaWZ0X3BvbGwKKyMgIGlmIFdJTlZFUiA8PSAweDA1MDIgLy9YUCwgU2VydmVyMjAwMworIyAgICBkZWZpbmUgVEhSSUZUX1BPTExGRCAgdGhyaWZ0X3BvbGxmZAorIyAgICBkZWZpbmUgVEhSSUZUX1BPTExJTiAgMHgwMzAwCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTE9VVCAweDAwMTAKKyMgIGVsc2UgLy9WaXN0YSwgV2luNy4uLgorIyAgICBkZWZpbmUgVEhSSUZUX1BPTExGRCAgcG9sbGZkCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTElOICBQT0xMSU4KKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMT1VUIFBPTExPVVQKKyMgIGVuZGlmIC8vV0lOVkVSCisjICBkZWZpbmUgVEhSSUZUX1NIVVRfUkRXUiBTRF9CT1RICisjICBpZiAhZGVmaW5lZChBSV9BRERSQ09ORklHKQorIyAgICBkZWZpbmUgQUlfQUREUkNPTkZJRyAweDAwMDAwNDAwCisjICBlbmRpZgorI2Vsc2UgLy9ub3QgX1dJTjMyCisjICBpbmNsdWRlIDxlcnJuby5oPgorIyAgZGVmaW5lIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SIGVycm5vCisjICBkZWZpbmUgVEhSSUZUX0VSUk5PIGVycm5vCisjICBkZWZpbmUgVEhSSUZUX0VJTlRSICAgICAgIEVJTlRSCisjICBkZWZpbmUgVEhSSUZUX0VJTlBST0dSRVNTIEVJTlBST0dSRVNTCisjICBkZWZpbmUgVEhSSUZUX0VDT05OUkVTRVQgIEVDT05OUkVTRVQKKyMgIGRlZmluZSBUSFJJRlRfRU5PVENPTk4gICAgRU5PVENPTk4KKyMgIGRlZmluZSBUSFJJRlRfRVRJTUVET1VUICAgRVRJTUVET1VUCisjICBkZWZpbmUgVEhSSUZUX0VXT1VMREJMT0NLIEVXT1VMREJMT0NLCisjICBkZWZpbmUgVEhSSUZUX0VBR0FJTiAgICAgIEVBR0FJTgorIyAgZGVmaW5lIFRIUklGVF9FUElQRSAgICAgICBFUElQRQorIyAgZGVmaW5lIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyBTT19SRVVTRUFERFIKKyMgIGRlZmluZSBUSFJJRlRfU09DS0VUIGludAorIyAgZGVmaW5lIFRIUklGVF9JTlZBTElEX1NPQ0tFVCAoLTEpCisjICBkZWZpbmUgVEhSSUZUX1NPQ0tFVFBBSVIgc29ja2V0cGFpcgorIyAgZGVmaW5lIFRIUklGVF9GQ05UTCBmY250bAorIyAgZGVmaW5lIFRIUklGVF9PX05PTkJMT0NLIE9fTk9OQkxPQ0sKKyMgIGRlZmluZSBUSFJJRlRfRl9HRVRGTCBGX0dFVEZMCisjICBkZWZpbmUgVEhSSUZUX0ZfU0VURkwgRl9TRVRGTAorIyAgZGVmaW5lIFRIUklGVF9HRVRUSU1FT0ZEQVkgZ2V0dGltZW9mZGF5CisjICBkZWZpbmUgVEhSSUZUX0NMT1NFU09DS0VUIGNsb3NlCisjICBkZWZpbmUgVEhSSUZUX0NMT1NFIGNsb3NlCisjICBkZWZpbmUgVEhSSUZUX09QRU4gb3BlbgorIyAgZGVmaW5lIFRIUklGVF9GVFJVTkNBVEUgZnRydW5jYXRlCisjICBkZWZpbmUgVEhSSUZUX0ZTWU5DIGZzeW5jCisjICBkZWZpbmUgVEhSSUZUX0xTRUVLIGxzZWVrCisjICBkZWZpbmUgVEhSSUZUX1dSSVRFIHdyaXRlCisjICBkZWZpbmUgVEhSSUZUX1JFQUQgcmVhZAorIyAgZGVmaW5lIFRIUklGVF9JT0NUTF9TT0NLRVQgaW9jdGwKKyMgIGRlZmluZSBUSFJJRlRfSU9DVExfU09DS0VUX05VTV9CWVRFU19UWVBFIGludAorIyAgZGVmaW5lIFRIUklGVF9TVEFUIHN0YXQKKyMgIGRlZmluZSBUSFJJRlRfRlNUQVQgZnN0YXQKKyMgIGRlZmluZSBUSFJJRlRfR0FJX1NUUkVSUk9SIGdhaV9zdHJlcnJvcgorIyAgZGVmaW5lIFRIUklGVF9TU0laRVQgc3NpemVfdAorIyAgZGVmaW5lIFRIUklGVF9TTlBSSU5URiBzbnByaW50ZgorIyAgZGVmaW5lIFRIUklGVF9TTEVFUF9TRUMgc2xlZXAKKyMgIGRlZmluZSBUSFJJRlRfU0xFRVBfVVNFQyB1c2xlZXAKKyMgIGRlZmluZSBUSFJJRlRfVElNRVNQRUMgdGltZXNwZWMKKyMgIGRlZmluZSBUSFJJRlRfQ1RJTUVfUiBjdGltZV9yCisjICBkZWZpbmUgVEhSSUZUX1BPTEwgcG9sbAorIyAgZGVmaW5lIFRIUklGVF9QT0xMRkQgIHBvbGxmZAorIyAgZGVmaW5lIFRIUklGVF9QT0xMSU4gIFBPTExJTgorIyAgZGVmaW5lIFRIUklGVF9QT0xMT1VUIFBPTExPVVQKKyMgIGRlZmluZSBUSFJJRlRfU0hVVF9SRFdSIFNIVVRfUkRXUgorI2VuZGlmCisKKyNlbmRpZiAvLyBfVEhSSUZUX1RSQU5TUE9SVF9QTEFURk9STV9TT0NLRVRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjMmY4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwCkBAIC0wLDAgKzEsNDE1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKwordWludDMyX3QgVEJ1ZmZlcmVkVHJhbnNwb3J0OjpyZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICB1aW50MzJfdCBoYXZlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJCb3VuZF8gLSByQmFzZV8pOworCisgIC8vIFdlIHNob3VsZCBvbmx5IHRha2UgdGhlIHNsb3cgcGF0aCBpZiB3ZSBjYW4ndCBzYXRpc2Z5IHRoZSByZWFkCisgIC8vIHdpdGggdGhlIGRhdGEgYWxyZWFkeSBpbiB0aGUgYnVmZmVyLgorICBhc3NlcnQoaGF2ZSA8IGxlbik7CisKKyAgLy8gSWYgd2UgaGF2ZSBzb21lIGRhdGEgaW4gdGhlIGJ1ZmZlciwgY29weSBpdCBvdXQgYW5kIHJldHVybiBpdC4KKyAgLy8gV2UgaGF2ZSB0byByZXR1cm4gaXQgd2l0aG91dCBhdHRlbXB0aW5nIHRvIHJlYWQgbW9yZSwgc2luY2Ugd2UgYXJlbid0CisgIC8vIGd1YXJhbnRlZWQgdGhhdCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgYWN0dWFsbHkgaGFzIG1vcmUgZGF0YSwgc28KKyAgLy8gYXR0ZW1wdGluZyB0byByZWFkIGZyb20gaXQgY291bGQgYmxvY2suCisgIGlmIChoYXZlID4gMCkgeworICAgIG1lbWNweShidWYsIHJCYXNlXywgaGF2ZSk7CisgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgMCk7CisgICAgcmV0dXJuIGhhdmU7CisgIH0KKworICAvLyBObyBkYXRhIGlzIGF2YWlsYWJsZSBpbiBvdXIgYnVmZmVyLgorICAvLyBHZXQgbW9yZSBmcm9tIHVuZGVybHlpbmcgdHJhbnNwb3J0IHVwIHRvIGJ1ZmZlciBzaXplLgorICAvLyBOb3RlIHRoYXQgdGhpcyBtYWtlcyBhIGxvdCBvZiBzZW5zZSBpZiBsZW4gPCByQnVmU2l6ZV8KKyAgLy8gYW5kIGFsbW9zdCBubyBzZW5zZSBvdGhlcndpc2UuICBUT0RPKGRyZWlzcyk6IEZpeCB0aGF0CisgIC8vIGNhc2UgKHBvc3NpYmx5IGluY2x1ZGluZyBzb21lIHJlYWR2IGhvdG5lc3MpLgorICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCB0cmFuc3BvcnRfLT5yZWFkKHJCdWZfLmdldCgpLCByQnVmU2l6ZV8pKTsKKworICAvLyBIYW5kIG92ZXIgd2hhdGV2ZXIgd2UgaGF2ZS4KKyAgdWludDMyX3QgZ2l2ZSA9IChzdGQ6Om1pbikobGVuLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4ockJvdW5kXyAtIHJCYXNlXykpOworICBtZW1jcHkoYnVmLCByQmFzZV8sIGdpdmUpOworICByQmFzZV8gKz0gZ2l2ZTsKKworICByZXR1cm4gZ2l2ZTsKK30KKwordm9pZCBUQnVmZmVyZWRUcmFuc3BvcnQ6OndyaXRlU2xvdyhjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICB1aW50MzJfdCBoYXZlX2J5dGVzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCYXNlXyAtIHdCdWZfLmdldCgpKTsKKyAgdWludDMyX3Qgc3BhY2UgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0JvdW5kXyAtIHdCYXNlXyk7CisgIC8vIFdlIHNob3VsZCBvbmx5IHRha2UgdGhlIHNsb3cgcGF0aCBpZiB3ZSBjYW4ndCBhY2NvbW1vZGF0ZSB0aGUgd3JpdGUKKyAgLy8gd2l0aCB0aGUgZnJlZSBzcGFjZSBhbHJlYWR5IGluIHRoZSBidWZmZXIuCisgIGFzc2VydCh3Qm91bmRfIC0gd0Jhc2VfIDwgc3RhdGljX2Nhc3Q8cHRyZGlmZl90PihsZW4pKTsKKworICAvLyBOb3cgaGVyZSdzIHRoZSB0cmlja3kgcXVlc3Rpb246IHNob3VsZCB3ZSBjb3B5IGRhdGEgZnJvbSBidWYgaW50byBvdXIKKyAgLy8gaW50ZXJuYWwgYnVmZmVyIGFuZCB3cml0ZSBpdCBmcm9tIHRoZXJlLCBvciBzaG91bGQgd2UganVzdCB3cml0ZSBvdXQKKyAgLy8gdGhlIGN1cnJlbnQgaW50ZXJuYWwgYnVmZmVyIGluIG9uZSBzeXNjYWxsIGFuZCB3cml0ZSBvdXQgYnVmIGluIGFub3RoZXIuCisgIC8vIElmIG91ciBjdXJyZW50bHkgYnVmZmVyZWQgZGF0YSBwbHVzIGJ1ZiBpcyBhdCBsZWFzdCBkb3VibGUgb3VyIGJ1ZmZlcgorICAvLyBzaXplLCB3ZSB3aWxsIGhhdmUgdG8gZG8gdHdvIHN5c2NhbGxzIG5vIG1hdHRlciB3aGF0IChleGNlcHQgaW4gdGhlCisgIC8vIGRlZ2VuZXJhdGUgY2FzZSB3aGVuIG91ciBidWZmZXIgaXMgZW1wdHkpLCBzbyB0aGVyZSBpcyBubyB1c2UgY29weWluZy4KKyAgLy8gT3RoZXJ3aXNlLCB0aGVyZSBpcyBzb3J0IG9mIGEgc2xpZGluZyBzY2FsZS4gIElmIHdlIGhhdmUgTi0xIGJ5dGVzCisgIC8vIGJ1ZmZlcmVkIGFuZCBuZWVkIHRvIHdyaXRlIDIsIGl0IHdvdWxkIGJlIGNyYXp5IHRvIGRvIHR3byBzeXNjYWxscy4KKyAgLy8gT24gdGhlIG90aGVyIGhhbmQsIGlmIHdlIGhhdmUgMiBieXRlcyBidWZmZXJlZCBhbmQgYXJlIHdyaXRpbmcgMk4tMywKKyAgLy8gd2UgY2FuIHNhdmUgYSBzeXNjYWxsIGluIHRoZSBzaG9ydCB0ZXJtIGJ5IGxvYWRpbmcgdXAgb3VyIGJ1ZmZlciwgd3JpdGluZworICAvLyBpdCBvdXQsIGFuZCBjb3B5aW5nIHRoZSByZXN0IG9mIHRoZSBieXRlcyBpbnRvIG91ciBidWZmZXIuICBPZiBjb3Vyc2UsCisgIC8vIGlmIHdlIGdldCBhbm90aGVyIDItYnl0ZSB3cml0ZSwgd2UgaGF2ZW4ndCBzYXZlZCBhbnkgc3lzY2FsbHMgYXQgYWxsLAorICAvLyBhbmQgaGF2ZSBqdXN0IGNvcGllZCBuZWFybHkgMk4gYnl0ZXMgZm9yIG5vdGhpbmcuICBGaW5kaW5nIGEgcGVyZmVjdAorICAvLyBwb2xpY3kgd291bGQgcmVxdWlyZSBwcmVkaWN0aW5nIHRoZSBzaXplIG9mIGZ1dHVyZSB3cml0ZXMsIHNvIHdlJ3JlIGp1c3QKKyAgLy8gZ29pbmcgdG8gYWx3YXlzIGVzY2hldyBzeXNjYWxscyBpZiB3ZSBoYXZlIGxlc3MgdGhhbiAyTiBieXRlcyB0byB3cml0ZS4KKworICAvLyBUaGUgY2FzZSB3aGVyZSB3ZSBoYXZlIHRvIGRvIHR3byBzeXNjYWxscy4KKyAgLy8gVGhpcyBjYXNlIGFsc28gY292ZXJzIHRoZSBjYXNlIHdoZXJlIHRoZSBidWZmZXIgaXMgZW1wdHksCisgIC8vIGJ1dCBpdCBpcyBjbGVhcmVyIChJIHRoaW5rKSB0byB0aGluayBvZiBpdCBhcyB0d28gc2VwYXJhdGUgY2FzZXMuCisgIGlmICgoaGF2ZV9ieXRlcyArIGxlbiA+PSAyICogd0J1ZlNpemVfKSB8fCAoaGF2ZV9ieXRlcyA9PSAwKSkgeworICAgIC8vIFRPRE8oZHJlaXNzKTogd3JpdGV2CisgICAgaWYgKGhhdmVfYnl0ZXMgPiAwKSB7CisgICAgICB0cmFuc3BvcnRfLT53cml0ZSh3QnVmXy5nZXQoKSwgaGF2ZV9ieXRlcyk7CisgICAgfQorICAgIHRyYW5zcG9ydF8tPndyaXRlKGJ1ZiwgbGVuKTsKKyAgICB3QmFzZV8gPSB3QnVmXy5nZXQoKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBGaWxsIHVwIG91ciBpbnRlcm5hbCBidWZmZXIgZm9yIGEgd3JpdGUuCisgIG1lbWNweSh3QmFzZV8sIGJ1Ziwgc3BhY2UpOworICBidWYgKz0gc3BhY2U7CisgIGxlbiAtPSBzcGFjZTsKKyAgdHJhbnNwb3J0Xy0+d3JpdGUod0J1Zl8uZ2V0KCksIHdCdWZTaXplXyk7CisKKyAgLy8gQ29weSB0aGUgcmVzdCBpbnRvIG91ciBidWZmZXIuCisgIGFzc2VydChsZW4gPCB3QnVmU2l6ZV8pOworICBtZW1jcHkod0J1Zl8uZ2V0KCksIGJ1ZiwgbGVuKTsKKyAgd0Jhc2VfID0gd0J1Zl8uZ2V0KCkgKyBsZW47CisgIHJldHVybjsKK30KKworY29uc3QgdWludDhfdCogVEJ1ZmZlcmVkVHJhbnNwb3J0Ojpib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgeworICAodm9pZClidWY7CisgICh2b2lkKWxlbjsKKyAgLy8gU2ltcGx5IHJldHVybiBOVUxMLiAgV2UgZG9uJ3Qga25vdyBpZiB0aGVyZSBpcyBhY3R1YWxseSBkYXRhIGF2YWlsYWJsZSBvbgorICAvLyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQsIHNvIGNhbGxpbmcgcmVhZCgpIG1pZ2h0IGJsb2NrLgorICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBUQnVmZmVyZWRUcmFuc3BvcnQ6OmZsdXNoKCkgeworICAvLyBXcml0ZSBvdXQgYW55IGRhdGEgd2FpdGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyLgorICB1aW50MzJfdCBoYXZlX2J5dGVzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCYXNlXyAtIHdCdWZfLmdldCgpKTsKKyAgaWYgKGhhdmVfYnl0ZXMgPiAwKSB7CisgICAgLy8gTm90ZSB0aGF0IHdlIHJlc2V0IHdCYXNlXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQorICAgIC8vIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUgKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpCisgICAgLy8gaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzIHVwIGFuIGV4Y2VwdGlvbgorICAgIHdCYXNlXyA9IHdCdWZfLmdldCgpOworICAgIHRyYW5zcG9ydF8tPndyaXRlKHdCdWZfLmdldCgpLCBoYXZlX2J5dGVzKTsKKyAgfQorCisgIC8vIEZsdXNoIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgdHJhbnNwb3J0Xy0+Zmx1c2goKTsKK30KKwordWludDMyX3QgVEZyYW1lZFRyYW5zcG9ydDo6cmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgdWludDMyX3Qgd2FudCA9IGxlbjsKKyAgdWludDMyX3QgaGF2ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihyQm91bmRfIC0gckJhc2VfKTsKKworICAvLyBXZSBzaG91bGQgb25seSB0YWtlIHRoZSBzbG93IHBhdGggaWYgd2UgY2FuJ3Qgc2F0aXNmeSB0aGUgcmVhZAorICAvLyB3aXRoIHRoZSBkYXRhIGFscmVhZHkgaW4gdGhlIGJ1ZmZlci4KKyAgYXNzZXJ0KGhhdmUgPCB3YW50KTsKKworICAvLyBJZiB3ZSBoYXZlIHNvbWUgZGF0YSBpbiB0aGUgYnVmZmVyLCBjb3B5IGl0IG91dCBhbmQgcmV0dXJuIGl0LgorICAvLyBXZSBoYXZlIHRvIHJldHVybiBpdCB3aXRob3V0IGF0dGVtcHRpbmcgdG8gcmVhZCBtb3JlLCBzaW5jZSB3ZSBhcmVuJ3QKKyAgLy8gZ3VhcmFudGVlZCB0aGF0IHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBhY3R1YWxseSBoYXMgbW9yZSBkYXRhLCBzbworICAvLyBhdHRlbXB0aW5nIHRvIHJlYWQgZnJvbSBpdCBjb3VsZCBibG9jay4KKyAgaWYgKGhhdmUgPiAwKSB7CisgICAgbWVtY3B5KGJ1ZiwgckJhc2VfLCBoYXZlKTsKKyAgICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCAwKTsKKyAgICByZXR1cm4gaGF2ZTsKKyAgfQorCisgIC8vIFJlYWQgYW5vdGhlciBmcmFtZS4KKyAgaWYgKCFyZWFkRnJhbWUoKSkgeworICAgIC8vIEVPRi4gIE5vIGZyYW1lIGF2YWlsYWJsZS4KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIFRPRE8oZHJlaXNzKTogU2hvdWxkIHdlIHdhcm4gd2hlbiByZWFkcyBjcm9zcyBmcmFtZXM/CisKKyAgLy8gSGFuZCBvdmVyIHdoYXRldmVyIHdlIGhhdmUuCisgIHVpbnQzMl90IGdpdmUgPSAoc3RkOjptaW4pKHdhbnQsIHN0YXRpY19jYXN0PHVpbnQzMl90PihyQm91bmRfIC0gckJhc2VfKSk7CisgIG1lbWNweShidWYsIHJCYXNlXywgZ2l2ZSk7CisgIHJCYXNlXyArPSBnaXZlOworICB3YW50IC09IGdpdmU7CisKKyAgcmV0dXJuIChsZW4gLSB3YW50KTsKK30KKworYm9vbCBURnJhbWVkVHJhbnNwb3J0OjpyZWFkRnJhbWUoKSB7CisgIC8vIFRPRE8oZHJlaXNzKTogVGhpbmsgYWJvdXQgdXNpbmcgcmVhZHYgaGVyZSwgZXZlbiB0aG91Z2ggaXQgd291bGQKKyAgLy8gcmVzdWx0IGluIChnYXNwKSByZWFkLWFoZWFkLgorCisgIC8vIFJlYWQgdGhlIHNpemUgb2YgdGhlIG5leHQgZnJhbWUuCisgIC8vIFdlIGNhbid0IHVzZSByZWFkQWxsKCZzeiwgc2l6ZW9mKHN6KSksIHNpbmNlIHRoYXQgYWx3YXlzIHRocm93cyBhbgorICAvLyBleGNlcHRpb24gb24gRU9GLiAgV2Ugd2FudCB0byB0aHJvdyBhbiBleGNlcHRpb24gb25seSBpZiBFT0Ygb2NjdXJzIGFmdGVyCisgIC8vIHBhcnRpYWwgc2l6ZSBkYXRhLgorICBpbnQzMl90IHN6ID0gLTE7CisgIHVpbnQzMl90IHNpemVfYnl0ZXNfcmVhZCA9IDA7CisgIHdoaWxlIChzaXplX2J5dGVzX3JlYWQgPCBzaXplb2Yoc3opKSB7CisgICAgdWludDhfdCogc3pwID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnN6KSArIHNpemVfYnl0ZXNfcmVhZDsKKyAgICB1aW50MzJfdCBieXRlc19yZWFkCisgICAgICAgID0gdHJhbnNwb3J0Xy0+cmVhZChzenAsIHN0YXRpY19jYXN0PHVpbnQzMl90PihzaXplb2Yoc3opKSAtIHNpemVfYnl0ZXNfcmVhZCk7CisgICAgaWYgKGJ5dGVzX3JlYWQgPT0gMCkgeworICAgICAgaWYgKHNpemVfYnl0ZXNfcmVhZCA9PSAwKSB7CisgICAgICAgIC8vIEVPRiBiZWZvcmUgYW55IGRhdGEgd2FzIHJlYWQuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEVPRiBhZnRlciBhIHBhcnRpYWwgZnJhbWUgaGVhZGVyLiAgUmFpc2UgYW4gZXhjZXB0aW9uLgorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBtb3JlIGRhdGEgdG8gcmVhZCBhZnRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnRpYWwgZnJhbWUgaGVhZGVyLiIpOworICAgICAgfQorICAgIH0KKyAgICBzaXplX2J5dGVzX3JlYWQgKz0gYnl0ZXNfcmVhZDsKKyAgfQorCisgIHN6ID0gbnRvaGwoc3opOworCisgIGlmIChzeiA8IDApIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJGcmFtZSBzaXplIGhhcyBuZWdhdGl2ZSB2YWx1ZSIpOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIG92ZXJzaXplZCBmcmFtZQorICBpZiAoc3ogPiBzdGF0aWNfY2FzdDxpbnQzMl90PihtYXhGcmFtZVNpemVfKSkKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLCAiUmVjZWl2ZWQgYW4gb3ZlcnNpemVkIGZyYW1lIik7CisKKyAgLy8gUmVhZCB0aGUgZnJhbWUgcGF5bG9hZCwgYW5kIHJlc2V0IG1hcmtlcnMuCisgIGlmIChzeiA+IHN0YXRpY19jYXN0PGludDMyX3Q+KHJCdWZTaXplXykpIHsKKyAgICByQnVmXy5yZXNldChuZXcgdWludDhfdFtzel0pOworICAgIHJCdWZTaXplXyA9IHN6OworICB9CisgIHRyYW5zcG9ydF8tPnJlYWRBbGwockJ1Zl8uZ2V0KCksIHN6KTsKKyAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgc3opOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBURnJhbWVkVHJhbnNwb3J0Ojp3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgLy8gRG91YmxlIGJ1ZmZlciBzaXplIHVudGlsIHN1ZmZpY2llbnQuCisgIHVpbnQzMl90IGhhdmUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0Jhc2VfIC0gd0J1Zl8uZ2V0KCkpOworICB1aW50MzJfdCBuZXdfc2l6ZSA9IHdCdWZTaXplXzsKKyAgaWYgKGxlbiArIGhhdmUgPCBoYXZlIC8qIG92ZXJmbG93ICovIHx8IGxlbiArIGhhdmUgPiAweDdmZmZmZmZmKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0ZWQgdG8gd3JpdGUgb3ZlciAyIEdCIHRvIFRGcmFtZWRUcmFuc3BvcnQuIik7CisgIH0KKyAgd2hpbGUgKG5ld19zaXplIDwgbGVuICsgaGF2ZSkgeworICAgIG5ld19zaXplID0gbmV3X3NpemUgPiAwID8gbmV3X3NpemUgKiAyIDogMTsKKyAgfQorCisgIC8vIFRPRE8oZHJlaXNzKTogQ29uc2lkZXIgbW9kaWZ5aW5nIHRoaXMgY2xhc3MgdG8gdXNlIG1hbGxvYy9mcmVlCisgIC8vIHNvIHdlIGNhbiB1c2UgcmVhbGxvYyBoZXJlLgorCisgIC8vIEFsbG9jYXRlIG5ldyBidWZmZXIuCisgIHVpbnQ4X3QqIG5ld19idWYgPSBuZXcgdWludDhfdFtuZXdfc2l6ZV07CisKKyAgLy8gQ29weSB0aGUgb2xkIGJ1ZmZlciB0byB0aGUgbmV3IG9uZS4KKyAgbWVtY3B5KG5ld19idWYsIHdCdWZfLmdldCgpLCBoYXZlKTsKKworICAvLyBOb3cgcG9pbnQgYnVmIHRvIHRoZSBuZXcgb25lLgorICB3QnVmXy5yZXNldChuZXdfYnVmKTsKKyAgd0J1ZlNpemVfID0gbmV3X3NpemU7CisgIHdCYXNlXyA9IHdCdWZfLmdldCgpICsgaGF2ZTsKKyAgd0JvdW5kXyA9IHdCdWZfLmdldCgpICsgd0J1ZlNpemVfOworCisgIC8vIENvcHkgdGhlIGRhdGEgaW50byB0aGUgbmV3IGJ1ZmZlci4KKyAgbWVtY3B5KHdCYXNlXywgYnVmLCBsZW4pOworICB3QmFzZV8gKz0gbGVuOworfQorCit2b2lkIFRGcmFtZWRUcmFuc3BvcnQ6OmZsdXNoKCkgeworICBpbnQzMl90IHN6X2hibywgc3pfbmJvOworICBhc3NlcnQod0J1ZlNpemVfID4gc2l6ZW9mKHN6X25ibykpOworCisgIC8vIFNsaXAgdGhlIGZyYW1lIHNpemUgaW50byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlci4KKyAgc3pfaGJvID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCYXNlXyAtICh3QnVmXy5nZXQoKSArIHNpemVvZihzel9uYm8pKSk7CisgIHN6X25ibyA9IChpbnQzMl90KWh0b25sKCh1aW50MzJfdCkoc3pfaGJvKSk7CisgIG1lbWNweSh3QnVmXy5nZXQoKSwgKHVpbnQ4X3QqKSZzel9uYm8sIHNpemVvZihzel9uYm8pKTsKKworICBpZiAoc3pfaGJvID4gMCkgeworICAgIC8vIE5vdGUgdGhhdCB3ZSByZXNldCB3QmFzZV8gKHdpdGggYSBwYWQgZm9yIHRoZSBmcmFtZSBzaXplKQorICAgIC8vIHByaW9yIHRvIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUKKyAgICAvLyAoaS5lLiBpbnRlcm5hbCBidWZmZXIgY2xlYW5lZCkgaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzCisgICAgLy8gdXAgYW4gZXhjZXB0aW9uCisgICAgd0Jhc2VfID0gd0J1Zl8uZ2V0KCkgKyBzaXplb2Yoc3pfbmJvKTsKKworICAgIC8vIFdyaXRlIHNpemUgYW5kIGZyYW1lIGJvZHkuCisgICAgdHJhbnNwb3J0Xy0+d3JpdGUod0J1Zl8uZ2V0KCksIHN0YXRpY19jYXN0PHVpbnQzMl90PihzaXplb2Yoc3pfbmJvKSkgKyBzel9oYm8pOworICB9CisKKyAgLy8gRmx1c2ggdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICB0cmFuc3BvcnRfLT5mbHVzaCgpOworCisgIC8vIHJlY2xhaW0gd3JpdGUgYnVmZmVyCisgIGlmICh3QnVmU2l6ZV8gPiBidWZSZWNsYWltVGhyZXNoXykgeworICAgIHdCdWZTaXplXyA9IERFRkFVTFRfQlVGRkVSX1NJWkU7CisgICAgd0J1Zl8ucmVzZXQobmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSk7CisgICAgc2V0V3JpdGVCdWZmZXIod0J1Zl8uZ2V0KCksIHdCdWZTaXplXyk7CisKKyAgICAvLyByZXNldCB3QmFzZV8gd2l0aCBhIHBhZCBmb3IgdGhlIGZyYW1lIHNpemUKKyAgICBpbnQzMl90IHBhZCA9IDA7CisgICAgd0Jhc2VfID0gd0J1Zl8uZ2V0KCkgKyBzaXplb2YocGFkKTsKKyAgfQorfQorCit1aW50MzJfdCBURnJhbWVkVHJhbnNwb3J0Ojp3cml0ZUVuZCgpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSB3QnVmXy5nZXQoKSk7Cit9CisKK2NvbnN0IHVpbnQ4X3QqIFRGcmFtZWRUcmFuc3BvcnQ6OmJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7CisgICh2b2lkKWJ1ZjsKKyAgKHZvaWQpbGVuOworICAvLyBEb24ndCB0cnkgdG8gYmUgY2xldmVyIHdpdGggc2hpZnRpbmcgYnVmZmVycy4KKyAgLy8gSWYgdGhlIGZhc3QgcGF0aCBmYWlsZWQgbGV0IHRoZSBwcm90b2NvbCB1c2UgaXRzIHNsb3cgcGF0aC4KKyAgLy8gQmVzaWRlcywgd2hvIGlzIGdvaW5nIHRvIHRyeSB0byBib3Jyb3cgYWNyb3NzIG1lc3NhZ2VzPworICByZXR1cm4gTlVMTDsKK30KKwordWludDMyX3QgVEZyYW1lZFRyYW5zcG9ydDo6cmVhZEVuZCgpIHsKKyAgLy8gaW5jbHVkZSBmcmFtaW5nIGJ5dGVzCisgIHVpbnQzMl90IGJ5dGVzX3JlYWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ockJvdW5kXyAtIHJCdWZfLmdldCgpICsgc2l6ZW9mKHVpbnQzMl90KSk7CisKKyAgaWYgKHJCdWZTaXplXyA+IGJ1ZlJlY2xhaW1UaHJlc2hfKSB7CisgICAgckJ1ZlNpemVfID0gMDsKKyAgICByQnVmXy5yZXNldCgpOworICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIHJCdWZTaXplXyk7CisgIH0KKworICByZXR1cm4gYnl0ZXNfcmVhZDsKK30KKwordm9pZCBUTWVtb3J5QnVmZmVyOjpjb21wdXRlUmVhZCh1aW50MzJfdCBsZW4sIHVpbnQ4X3QqKiBvdXRfc3RhcnQsIHVpbnQzMl90KiBvdXRfZ2l2ZSkgeworICAvLyBDb3JyZWN0IHJCb3VuZF8gc28gd2UgY2FuIHVzZSB0aGUgZmFzdCBwYXRoIGluIHRoZSBmdXR1cmUuCisgIHJCb3VuZF8gPSB3QmFzZV87CisKKyAgLy8gRGVjaWRlIGhvdyBtdWNoIHRvIGdpdmUuCisgIHVpbnQzMl90IGdpdmUgPSAoc3RkOjptaW4pKGxlbiwgYXZhaWxhYmxlX3JlYWQoKSk7CisKKyAgKm91dF9zdGFydCA9IHJCYXNlXzsKKyAgKm91dF9naXZlID0gZ2l2ZTsKKworICAvLyBQcmVpbmNyZW1lbnQgckJhc2VfIHNvIHRoZSBjYWxsZXIgZG9lc24ndCBoYXZlIHRvLgorICByQmFzZV8gKz0gZ2l2ZTsKK30KKwordWludDMyX3QgVE1lbW9yeUJ1ZmZlcjo6cmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgdWludDhfdCogc3RhcnQ7CisgIHVpbnQzMl90IGdpdmU7CisgIGNvbXB1dGVSZWFkKGxlbiwgJnN0YXJ0LCAmZ2l2ZSk7CisKKyAgLy8gQ29weSBpbnRvIHRoZSBwcm92aWRlZCBidWZmZXIuCisgIG1lbWNweShidWYsIHN0YXJ0LCBnaXZlKTsKKworICByZXR1cm4gZ2l2ZTsKK30KKwordWludDMyX3QgVE1lbW9yeUJ1ZmZlcjo6cmVhZEFwcGVuZFRvU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIsIHVpbnQzMl90IGxlbikgeworICAvLyBEb24ndCBnZXQgc29tZSBzdHVwaWQgYXNzZXJ0aW9uIGZhaWx1cmUuCisgIGlmIChidWZmZXJfID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHVpbnQ4X3QqIHN0YXJ0OworICB1aW50MzJfdCBnaXZlOworICBjb21wdXRlUmVhZChsZW4sICZzdGFydCwgJmdpdmUpOworCisgIC8vIEFwcGVuZCB0byB0aGUgcHJvdmlkZWQgc3RyaW5nLgorICBzdHIuYXBwZW5kKChjaGFyKilzdGFydCwgZ2l2ZSk7CisKKyAgcmV0dXJuIGdpdmU7Cit9CisKK3ZvaWQgVE1lbW9yeUJ1ZmZlcjo6ZW5zdXJlQ2FuV3JpdGUodWludDMyX3QgbGVuKSB7CisgIC8vIENoZWNrIGF2YWlsYWJsZSBzcGFjZQorICB1aW50MzJfdCBhdmFpbCA9IGF2YWlsYWJsZV93cml0ZSgpOworICBpZiAobGVuIDw9IGF2YWlsKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKCFvd25lcl8pIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJJbnN1ZmZpY2llbnQgc3BhY2UgaW4gZXh0ZXJuYWwgTWVtb3J5QnVmZmVyIik7CisgIH0KKworICAvLyBHcm93IHRoZSBidWZmZXIgYXMgbmVjZXNzYXJ5LgorICB1aW50NjRfdCBuZXdfc2l6ZSA9IGJ1ZmZlclNpemVfOworICB3aGlsZSAobGVuID4gYXZhaWwpIHsKKyAgICBuZXdfc2l6ZSA9IG5ld19zaXplID4gMCA/IG5ld19zaXplICogMiA6IDE7CisgICAgaWYgKG5ld19zaXplID4gbWF4QnVmZmVyU2l6ZV8pIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlcm5hbCBidWZmZXIgc2l6ZSBvdmVyZmxvdyIpOworICAgIH0KKyAgICBhdmFpbCA9IGF2YWlsYWJsZV93cml0ZSgpICsgKHN0YXRpY19jYXN0PHVpbnQzMl90PihuZXdfc2l6ZSkgLSBidWZmZXJTaXplXyk7CisgIH0KKworICAvLyBBbGxvY2F0ZSBpbnRvIGEgbmV3IHBvaW50ZXIgc28gd2UgZG9uJ3QgYm9yayBvdXJzIGlmIGl0IGZhaWxzLgorICB1aW50OF90KiBuZXdfYnVmZmVyID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KHN0ZDo6cmVhbGxvYyhidWZmZXJfLCBuZXdfc2l6ZSkpOworICBpZiAobmV3X2J1ZmZlciA9PSBOVUxMKSB7CisgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKyAgfQorCisgIHJCYXNlXyA9IG5ld19idWZmZXIgKyAockJhc2VfIC0gYnVmZmVyXyk7CisgIHJCb3VuZF8gPSBuZXdfYnVmZmVyICsgKHJCb3VuZF8gLSBidWZmZXJfKTsKKyAgd0Jhc2VfID0gbmV3X2J1ZmZlciArICh3QmFzZV8gLSBidWZmZXJfKTsKKyAgd0JvdW5kXyA9IG5ld19idWZmZXIgKyBuZXdfc2l6ZTsKKyAgYnVmZmVyXyA9IG5ld19idWZmZXI7CisgIGJ1ZmZlclNpemVfID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG5ld19zaXplKTsKK30KKwordm9pZCBUTWVtb3J5QnVmZmVyOjp3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgZW5zdXJlQ2FuV3JpdGUobGVuKTsKKworICAvLyBDb3B5IGludG8gdGhlIGJ1ZmZlciBhbmQgaW5jcmVtZW50IHdCYXNlXy4KKyAgbWVtY3B5KHdCYXNlXywgYnVmLCBsZW4pOworICB3QmFzZV8gKz0gbGVuOworfQorCit2b2lkIFRNZW1vcnlCdWZmZXI6Ondyb3RlQnl0ZXModWludDMyX3QgbGVuKSB7CisgIHVpbnQzMl90IGF2YWlsID0gYXZhaWxhYmxlX3dyaXRlKCk7CisgIGlmIChsZW4gPiBhdmFpbCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNsaWVudCB3cm90ZSBtb3JlIGJ5dGVzIHRoYW4gc2l6ZSBvZiBidWZmZXIuIik7CisgIH0KKyAgd0Jhc2VfICs9IGxlbjsKK30KKworY29uc3QgdWludDhfdCogVE1lbW9yeUJ1ZmZlcjo6Ym9ycm93U2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsKKyAgKHZvaWQpYnVmOworICByQm91bmRfID0gd0Jhc2VfOworICBpZiAoYXZhaWxhYmxlX3JlYWQoKSA+PSAqbGVuKSB7CisgICAgKmxlbiA9IGF2YWlsYWJsZV9yZWFkKCk7CisgICAgcmV0dXJuIHJCYXNlXzsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MjNmOWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmgKQEAgLTAsMCArMSw3NDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UQlVGRkVSVFJBTlNQT1JUU19IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UQlVGRkVSVFJBTlNQT1JUU19IXyAxCisKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9hcnJheS5ocHA+CisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CisKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBUREJfTElLRUxZKHZhbCkgKF9fYnVpbHRpbl9leHBlY3QoKHZhbCksIDEpKQorI2RlZmluZSBUREJfVU5MSUtFTFkodmFsKSAoX19idWlsdGluX2V4cGVjdCgodmFsKSwgMCkpCisjZWxzZQorI2RlZmluZSBUREJfTElLRUxZKHZhbCkgKHZhbCkKKyNkZWZpbmUgVERCX1VOTElLRUxZKHZhbCkgKHZhbCkKKyNlbmRpZgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgYWxsIHRyYW5zcG9ydHMgdGhhdCB1c2UgcmVhZC93cml0ZSBidWZmZXJzIGZvciBwZXJmb3JtYW5jZS4KKyAqCisgKiBUQnVmZmVyQmFzZSBpcyBkZXNpZ25lZCB0byBpbXBsZW1lbnQgdGhlIGZhc3QtcGF0aCAibWVtY3B5IiBzdHlsZQorICogb3BlcmF0aW9ucyB0aGF0IHdvcmsgaW4gdGhlIGNvbW1vbiBjYXNlLiAgSXQgZG9lcyBzbyB3aXRoIHNtYWxsIGFuZAorICogKGV2ZW50dWFsbHkpIG5vbnZpcnR1YWwsIGlubGluYWJsZSBtZXRob2RzLiAgVEJ1ZmZlckJhc2UgaXMgYW4gYWJzdHJhY3QKKyAqIGNsYXNzLiAgU3ViY2xhc3NlcyBhcmUgZXhwZWN0ZWQgdG8gZGVmaW5lIHRoZSAic2xvdyBwYXRoIiBvcGVyYXRpb25zCisgKiB0aGF0IGhhdmUgdG8gYmUgZG9uZSB3aGVuIHRoZSBidWZmZXJzIGFyZSBmdWxsIG9yIGVtcHR5LgorICoKKyAqLworY2xhc3MgVEJ1ZmZlckJhc2UgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VEJ1ZmZlckJhc2U+IHsKKworcHVibGljOgorICAvKioKKyAgICogRmFzdC1wYXRoIHJlYWQuCisgICAqCisgICAqIFdoZW4gd2UgaGF2ZSBlbm91Z2ggZGF0YSBidWZmZXJlZCB0byBmdWxmaWxsIHRoZSByZWFkLCB3ZSBjYW4gc2F0aXNmeSBpdAorICAgKiB3aXRoIGEgc2luZ2xlIG1lbWNweSwgdGhlbiBhZGp1c3Qgb3VyIGludGVybmFsIHBvaW50ZXJzLiAgSWYgdGhlIGJ1ZmZlcgorICAgKiBpcyBlbXB0eSwgd2UgY2FsbCBvdXQgdG8gb3VyIHNsb3cgcGF0aCwgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcy4KKyAgICogVGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gZXZlbnR1YWxseSBiZSBub252aXJ0dWFsIGFuZCBpbmxpbmFibGUuCisgICAqLworICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgdWludDhfdCogbmV3X3JCYXNlID0gckJhc2VfICsgbGVuOworICAgIGlmIChUREJfTElLRUxZKG5ld19yQmFzZSA8PSByQm91bmRfKSkgeworICAgICAgc3RkOjptZW1jcHkoYnVmLCByQmFzZV8sIGxlbik7CisgICAgICByQmFzZV8gPSBuZXdfckJhc2U7CisgICAgICByZXR1cm4gbGVuOworICAgIH0KKyAgICByZXR1cm4gcmVhZFNsb3coYnVmLCBsZW4pOworICB9CisKKyAgLyoqCisgICAqIFNob3J0Y3V0dGVkIHZlcnNpb24gb2YgcmVhZEFsbC4KKyAgICovCisgIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICB1aW50OF90KiBuZXdfckJhc2UgPSByQmFzZV8gKyBsZW47CisgICAgaWYgKFREQl9MSUtFTFkobmV3X3JCYXNlIDw9IHJCb3VuZF8pKSB7CisgICAgICBzdGQ6Om1lbWNweShidWYsIHJCYXNlXywgbGVuKTsKKyAgICAgIHJCYXNlXyA9IG5ld19yQmFzZTsKKyAgICAgIHJldHVybiBsZW47CisgICAgfQorICAgIHJldHVybiBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpyZWFkQWxsKCp0aGlzLCBidWYsIGxlbik7CisgIH0KKworICAvKioKKyAgICogRmFzdC1wYXRoIHdyaXRlLgorICAgKgorICAgKiBXaGVuIHdlIGhhdmUgZW5vdWdoIGVtcHR5IHNwYWNlIGluIG91ciBidWZmZXIgdG8gYWNjb21tb2RhdGUgdGhlIHdyaXRlLCB3ZQorICAgKiBjYW4gc2F0aXNmeSBpdCB3aXRoIGEgc2luZ2xlIG1lbWNweSwgdGhlbiBhZGp1c3Qgb3VyIGludGVybmFsIHBvaW50ZXJzLgorICAgKiBJZiB0aGUgYnVmZmVyIGlzIGZ1bGwsIHdlIGNhbGwgb3V0IHRvIG91ciBzbG93IHBhdGgsIGltcGxlbWVudGVkIGJ5IGEKKyAgICogc3ViY2xhc3MuICBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBldmVudHVhbGx5IGJlIG5vbnZpcnR1YWwgYW5kCisgICAqIGlubGluYWJsZS4KKyAgICovCisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICB1aW50OF90KiBuZXdfd0Jhc2UgPSB3QmFzZV8gKyBsZW47CisgICAgaWYgKFREQl9MSUtFTFkobmV3X3dCYXNlIDw9IHdCb3VuZF8pKSB7CisgICAgICBzdGQ6Om1lbWNweSh3QmFzZV8sIGJ1ZiwgbGVuKTsKKyAgICAgIHdCYXNlXyA9IG5ld193QmFzZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgd3JpdGVTbG93KGJ1ZiwgbGVuKTsKKyAgfQorCisgIC8qKgorICAgKiBGYXN0LXBhdGggYm9ycm93LiAgQSBsb3QgbGlrZSB0aGUgZmFzdC1wYXRoIHJlYWQuCisgICAqLworICBjb25zdCB1aW50OF90KiBib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7CisgICAgaWYgKFREQl9MSUtFTFkoc3RhdGljX2Nhc3Q8cHRyZGlmZl90PigqbGVuKSA8PSByQm91bmRfIC0gckJhc2VfKSkgeworICAgICAgLy8gV2l0aCBzdHJpY3QgYWxpYXNpbmcsIHdyaXRpbmcgdG8gbGVuIHNob3VsZG4ndCBmb3JjZSB1cyB0bworICAgICAgLy8gcmVmZXRjaCByQmFzZV8gZnJvbSBtZW1vcnkuICBUT0RPKGRyZWlzcyk6IFZlcmlmeSB0aGlzLgorICAgICAgKmxlbiA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihyQm91bmRfIC0gckJhc2VfKTsKKyAgICAgIHJldHVybiByQmFzZV87CisgICAgfQorICAgIHJldHVybiBib3Jyb3dTbG93KGJ1ZiwgbGVuKTsKKyAgfQorCisgIC8qKgorICAgKiBDb25zdW1lIGRvZXNuJ3QgcmVxdWlyZSBhIHNsb3cgcGF0aC4KKyAgICovCisgIHZvaWQgY29uc3VtZSh1aW50MzJfdCBsZW4pIHsKKyAgICBpZiAoVERCX0xJS0VMWShzdGF0aWNfY2FzdDxwdHJkaWZmX3Q+KGxlbikgPD0gckJvdW5kXyAtIHJCYXNlXykpIHsKKyAgICAgIHJCYXNlXyArPSBsZW47CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsICJjb25zdW1lIGRpZCBub3QgZm9sbG93IGEgYm9ycm93LiIpOworICAgIH0KKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8vLyBTbG93IHBhdGggcmVhZC4KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgPSAwOworCisgIC8vLyBTbG93IHBhdGggd3JpdGUuCisgIHZpcnR1YWwgdm9pZCB3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pID0gMDsKKworICAvKioKKyAgICogU2xvdyBwYXRoIGJvcnJvdy4KKyAgICoKKyAgICogUE9TVENPTkRJVElPTjogcmV0dXJuID09IE5VTEwgfHwgckJvdW5kXyAtIHJCYXNlXyA+PSAqbGVuCisgICAqLworICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSA9IDA7CisKKyAgLyoqCisgICAqIFRyaXZpYWwgY29uc3RydWN0b3IuCisgICAqCisgICAqIEluaXRpYWxpemUgcG9pbnRlcnMgc2FmZWx5LiAgQ29uc3RydWN0aW5nIGlzIG5vdCBhIHZlcnkKKyAgICogcGVyZm9ybWFuY2Utc2Vuc2l0aXZlIG9wZXJhdGlvbiwgc28gaXQgaXMgb2theSB0byBqdXN0IGxlYXZlIGl0IHRvCisgICAqIHRoZSBjb25jcmV0ZSBjbGFzcyB0byBzZXQgdXAgcG9pbnRlcnMgY29ycmVjdGx5LgorICAgKi8KKyAgVEJ1ZmZlckJhc2UoKSA6IHJCYXNlXyhOVUxMKSwgckJvdW5kXyhOVUxMKSwgd0Jhc2VfKE5VTEwpLCB3Qm91bmRfKE5VTEwpIHt9CisKKyAgLy8vIENvbnZlbmllbmNlIG11dGF0b3IgZm9yIHNldHRpbmcgdGhlIHJlYWQgYnVmZmVyLgorICB2b2lkIHNldFJlYWRCdWZmZXIodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICByQmFzZV8gPSBidWY7CisgICAgckJvdW5kXyA9IGJ1ZiArIGxlbjsKKyAgfQorCisgIC8vLyBDb252ZW5pZW5jZSBtdXRhdG9yIGZvciBzZXR0aW5nIHRoZSB3cml0ZSBidWZmZXIuCisgIHZvaWQgc2V0V3JpdGVCdWZmZXIodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICB3QmFzZV8gPSBidWY7CisgICAgd0JvdW5kXyA9IGJ1ZiArIGxlbjsKKyAgfQorCisgIHZpcnR1YWwgflRCdWZmZXJCYXNlKCkge30KKworICAvLy8gUmVhZHMgYmVnaW4gaGVyZS4KKyAgdWludDhfdCogckJhc2VfOworICAvLy8gUmVhZHMgbWF5IGV4dGVuZCB0byBqdXN0IGJlZm9yZSBoZXJlLgorICB1aW50OF90KiByQm91bmRfOworCisgIC8vLyBXcml0ZXMgYmVnaW4gaGVyZS4KKyAgdWludDhfdCogd0Jhc2VfOworICAvLy8gV3JpdGVzIG1heSBleHRlbmQgdG8ganVzdCBiZWZvcmUgaGVyZS4KKyAgdWludDhfdCogd0JvdW5kXzsKK307CisKKy8qKgorICogQnVmZmVyZWQgdHJhbnNwb3J0LiBGb3IgcmVhZHMgaXQgd2lsbCByZWFkIG1vcmUgZGF0YSB0aGFuIGlzIHJlcXVlc3RlZAorICogYW5kIHdpbGwgc2VydmUgZnV0dXJlIGRhdGEgb3V0IG9mIGEgbG9jYWwgYnVmZmVyLiBGb3Igd3JpdGVzLCBkYXRhIGlzCisgKiBzdG9yZWQgdG8gYW4gaW4gbWVtb3J5IGJ1ZmZlciBiZWZvcmUgYmVpbmcgd3JpdHRlbiBvdXQuCisgKgorICovCitjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VEJ1ZmZlcmVkVHJhbnNwb3J0LCBUQnVmZmVyQmFzZT4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSA1MTI7CisKKyAgLy8vIFVzZSBkZWZhdWx0IGJ1ZmZlciBzaXplcy4KKyAgVEJ1ZmZlcmVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpCisgICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCisgICAgICByQnVmU2l6ZV8oREVGQVVMVF9CVUZGRVJfU0laRSksCisgICAgICB3QnVmU2l6ZV8oREVGQVVMVF9CVUZGRVJfU0laRSksCisgICAgICByQnVmXyhuZXcgdWludDhfdFtyQnVmU2l6ZV9dKSwKKyAgICAgIHdCdWZfKG5ldyB1aW50OF90W3dCdWZTaXplX10pIHsKKyAgICBpbml0UG9pbnRlcnMoKTsKKyAgfQorCisgIC8vLyBVc2Ugc3BlY2lmaWVkIGJ1ZmZlciBzaXplcy4KKyAgVEJ1ZmZlcmVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHVpbnQzMl90IHN6KQorICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAorICAgICAgckJ1ZlNpemVfKHN6KSwKKyAgICAgIHdCdWZTaXplXyhzeiksCisgICAgICByQnVmXyhuZXcgdWludDhfdFtyQnVmU2l6ZV9dKSwKKyAgICAgIHdCdWZfKG5ldyB1aW50OF90W3dCdWZTaXplX10pIHsKKyAgICBpbml0UG9pbnRlcnMoKTsKKyAgfQorCisgIC8vLyBVc2Ugc3BlY2lmaWVkIHJlYWQgYW5kIHdyaXRlIGJ1ZmZlciBzaXplcy4KKyAgVEJ1ZmZlcmVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHVpbnQzMl90IHJzeiwgdWludDMyX3Qgd3N6KQorICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAorICAgICAgckJ1ZlNpemVfKHJzeiksCisgICAgICB3QnVmU2l6ZV8od3N6KSwKKyAgICAgIHJCdWZfKG5ldyB1aW50OF90W3JCdWZTaXplX10pLAorICAgICAgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSkgeworICAgIGluaXRQb2ludGVycygpOworICB9CisKKyAgdm9pZCBvcGVuKCkgeyB0cmFuc3BvcnRfLT5vcGVuKCk7IH0KKworICBib29sIGlzT3BlbigpIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmlzT3BlbigpOyB9CisKKyAgYm9vbCBwZWVrKCkgeworICAgIGlmIChyQmFzZV8gPT0gckJvdW5kXykgeworICAgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgdHJhbnNwb3J0Xy0+cmVhZChyQnVmXy5nZXQoKSwgckJ1ZlNpemVfKSk7CisgICAgfQorICAgIHJldHVybiAockJvdW5kXyA+IHJCYXNlXyk7CisgIH0KKworICB2b2lkIGNsb3NlKCkgeworICAgIGZsdXNoKCk7CisgICAgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHZpcnR1YWwgdm9pZCB3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHZvaWQgZmx1c2goKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgb3JpZ2luIG9mIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgKi8KKyAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyBnZXRPcmlnaW4oKSB7IHJldHVybiB0cmFuc3BvcnRfLT5nZXRPcmlnaW4oKTsgfQorCisgIC8qKgorICAgKiBUaGUgZm9sbG93aW5nIGJlaGF2aW9yIGlzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBieSBUQnVmZmVyZWRUcmFuc3BvcnQsCisgICAqIGJ1dCB0aGF0IG1heSBjaGFuZ2UgaW4gYSBmdXR1cmUgdmVyc2lvbjoKKyAgICogMS8gSWYgbGVuIGlzIGF0IG1vc3QgckJ1ZlNpemVfLCBib3Jyb3cgd2lsbCBuZXZlciByZXR1cm4gTlVMTC4KKyAgICogICAgRGVwZW5kaW5nIG9uIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCwgaXQgY291bGQgdGhyb3cgYW4gZXhjZXB0aW9uCisgICAqICAgIG9yIGhhbmcgZm9yZXZlci4KKyAgICogMi8gU29tZSBib3Jyb3cgcmVxdWVzdHMgbWF5IGNvcHkgYnl0ZXMgaW50ZXJuYWxseS4gIEhvd2V2ZXIsCisgICAqICAgIGlmIGxlbiBpcyBhdCBtb3N0IHJCdWZTaXplXy8yLCBub25lIG9mIHRoZSBjb3BpZWQgYnl0ZXMKKyAgICogICAgd2lsbCBldmVyIGhhdmUgdG8gYmUgY29waWVkIGFnYWluLiAgRm9yIG9wdGltaWFsIHBlcmZvcm1hbmNlLAorICAgKiAgICBzdGF5IHVuZGVyIHRoaXMgbGltaXQuCisgICAqLworICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VW5kZXJseWluZ1RyYW5zcG9ydCgpIHsgcmV0dXJuIHRyYW5zcG9ydF87IH0KKworICAvKgorICAgKiBUVmlydHVhbFRyYW5zcG9ydCBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgcmVhZEFsbCgpLgorICAgKiBXZSB3YW50IHRvIHVzZSB0aGUgVEJ1ZmZlckJhc2UgdmVyc2lvbiBpbnN0ZWFkLgorICAgKi8KKyAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gVEJ1ZmZlckJhc2U6OnJlYWRBbGwoYnVmLCBsZW4pOyB9CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBpbml0UG9pbnRlcnMoKSB7CisgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgMCk7CisgICAgc2V0V3JpdGVCdWZmZXIod0J1Zl8uZ2V0KCksIHdCdWZTaXplXyk7CisgICAgLy8gV3JpdGUgc2l6ZSBuZXZlciBjaGFuZ2VzLgorICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CisKKyAgdWludDMyX3QgckJ1ZlNpemVfOworICB1aW50MzJfdCB3QnVmU2l6ZV87CisgIGJvb3N0OjpzY29wZWRfYXJyYXk8dWludDhfdD4gckJ1Zl87CisgIGJvb3N0OjpzY29wZWRfYXJyYXk8dWludDhfdD4gd0J1Zl87Cit9OworCisvKioKKyAqIFdyYXBzIGEgdHJhbnNwb3J0IGludG8gYSBidWZmZXJlZCBvbmUuCisgKgorICovCitjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRUcmFuc3BvcnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisKKyAgdmlydHVhbCB+VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisKKyAgLyoqCisgICAqIFdyYXBzIHRoZSB0cmFuc3BvcnQgaW50byBhIGJ1ZmZlcmVkIG9uZS4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMpKTsKKyAgfQorfTsKKworLyoqCisgKiBGcmFtZWQgdHJhbnNwb3J0LiBBbGwgd3JpdGVzIGdvIGludG8gYW4gaW4tbWVtb3J5IGJ1ZmZlciB1bnRpbCBmbHVzaCBpcworICogY2FsbGVkLCBhdCB3aGljaCBwb2ludCB0aGUgdHJhbnNwb3J0IHdyaXRlcyB0aGUgbGVuZ3RoIG9mIHRoZSBlbnRpcmUKKyAqIGJpbmFyeSBjaHVuayBmb2xsb3dlZCBieSB0aGUgZGF0YSBwYXlsb2FkLiBUaGlzIGFsbG93cyB0aGUgcmVjZWl2ZXIgb24gdGhlCisgKiBvdGhlciBlbmQgdG8gYWx3YXlzIGRvIGZpeGVkLWxlbmd0aCByZWFkcy4KKyAqCisgKi8KK2NsYXNzIFRGcmFtZWRUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VEZyYW1lZFRyYW5zcG9ydCwgVEJ1ZmZlckJhc2U+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gNTEyOworICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfTUFYX0ZSQU1FX1NJWkUgPSAyNTYgKiAxMDI0ICogMTAyNDsKKworICAvLy8gVXNlIGRlZmF1bHQgYnVmZmVyIHNpemVzLgorICBURnJhbWVkVHJhbnNwb3J0KCkKKyAgICA6IHRyYW5zcG9ydF8oKSwKKyAgICAgIHJCdWZTaXplXygwKSwKKyAgICAgIHdCdWZTaXplXyhERUZBVUxUX0JVRkZFUl9TSVpFKSwKKyAgICAgIHJCdWZfKCksCisgICAgICB3QnVmXyhuZXcgdWludDhfdFt3QnVmU2l6ZV9dKSwKKyAgICAgIGJ1ZlJlY2xhaW1UaHJlc2hfKChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKSB7CisgICAgaW5pdFBvaW50ZXJzKCk7CisgIH0KKworICBURnJhbWVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpCisgICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCisgICAgICByQnVmU2l6ZV8oMCksCisgICAgICB3QnVmU2l6ZV8oREVGQVVMVF9CVUZGRVJfU0laRSksCisgICAgICByQnVmXygpLAorICAgICAgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSksCisgICAgICBidWZSZWNsYWltVGhyZXNoXygoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSksCisgICAgICBtYXhGcmFtZVNpemVfKERFRkFVTFRfTUFYX0ZSQU1FX1NJWkUpIHsKKyAgICBpbml0UG9pbnRlcnMoKTsKKyAgfQorCisgIFRGcmFtZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzeiwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZSZWNsYWltVGhyZXNoID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCisgICAgICByQnVmU2l6ZV8oMCksCisgICAgICB3QnVmU2l6ZV8oc3opLAorICAgICAgckJ1Zl8oKSwKKyAgICAgIHdCdWZfKG5ldyB1aW50OF90W3dCdWZTaXplX10pLAorICAgICAgYnVmUmVjbGFpbVRocmVzaF8oYnVmUmVjbGFpbVRocmVzaCksCisgICAgICBtYXhGcmFtZVNpemVfKERFRkFVTFRfTUFYX0ZSQU1FX1NJWkUpIHsKKyAgICBpbml0UG9pbnRlcnMoKTsKKyAgfQorCisgIHZvaWQgb3BlbigpIHsgdHJhbnNwb3J0Xy0+b3BlbigpOyB9CisKKyAgYm9vbCBpc09wZW4oKSB7IHJldHVybiB0cmFuc3BvcnRfLT5pc09wZW4oKTsgfQorCisgIGJvb2wgcGVlaygpIHsgcmV0dXJuIChyQmFzZV8gPCByQm91bmRfKSB8fCB0cmFuc3BvcnRfLT5wZWVrKCk7IH0KKworICB2b2lkIGNsb3NlKCkgeworICAgIGZsdXNoKCk7CisgICAgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHZpcnR1YWwgdm9pZCB3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHZpcnR1YWwgdm9pZCBmbHVzaCgpOworCisgIHVpbnQzMl90IHJlYWRFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUVuZCgpOworCisgIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VW5kZXJseWluZ1RyYW5zcG9ydCgpIHsgcmV0dXJuIHRyYW5zcG9ydF87IH0KKworICAvKgorICAgKiBUVmlydHVhbFRyYW5zcG9ydCBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgcmVhZEFsbCgpLgorICAgKiBXZSB3YW50IHRvIHVzZSB0aGUgVEJ1ZmZlckJhc2UgdmVyc2lvbiBpbnN0ZWFkLgorICAgKi8KKyAgdXNpbmcgVEJ1ZmZlckJhc2U6OnJlYWRBbGw7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG9yaWdpbiBvZiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICovCisgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcgZ2V0T3JpZ2luKCkgeyByZXR1cm4gdHJhbnNwb3J0Xy0+Z2V0T3JpZ2luKCk7IH0KKworICAvKioKKyAgICogU2V0IHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGZyYW1lIGF0IHJlYWQKKyAgICovCisgIHZvaWQgc2V0TWF4RnJhbWVTaXplKHVpbnQzMl90IG1heEZyYW1lU2l6ZSkgeyBtYXhGcmFtZVNpemVfID0gbWF4RnJhbWVTaXplOyB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBmcmFtZSBhdCByZWFkCisgICAqLworICB1aW50MzJfdCBnZXRNYXhGcmFtZVNpemUoKSB7IHJldHVybiBtYXhGcmFtZVNpemVfOyB9CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqIFJlYWRzIGEgZnJhbWUgb2YgaW5wdXQgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAqCisgICAqIFJldHVybnMgdHJ1ZSBpZiBhIGZyYW1lIHdhcyByZWFkIHN1Y2Nlc3NmdWxseSwgb3IgZmFsc2Ugb24gRU9GLgorICAgKiAoUmFpc2VzIGEgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBFT0Ygb2NjdXJzIGFmdGVyIGEgcGFydGlhbCBmcmFtZS4pCisgICAqLworICB2aXJ0dWFsIGJvb2wgcmVhZEZyYW1lKCk7CisKKyAgdm9pZCBpbml0UG9pbnRlcnMoKSB7CisgICAgc2V0UmVhZEJ1ZmZlcihOVUxMLCAwKTsKKyAgICBzZXRXcml0ZUJ1ZmZlcih3QnVmXy5nZXQoKSwgd0J1ZlNpemVfKTsKKworICAgIC8vIFBhZCB0aGUgYnVmZmVyIHNvIHdlIGNhbiBpbnNlcnQgdGhlIHNpemUgbGF0ZXIuCisgICAgaW50MzJfdCBwYWQgPSAwOworICAgIHRoaXMtPndyaXRlKCh1aW50OF90KikmcGFkLCBzaXplb2YocGFkKSk7CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKKworICB1aW50MzJfdCByQnVmU2l6ZV87CisgIHVpbnQzMl90IHdCdWZTaXplXzsKKyAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiByQnVmXzsKKyAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiB3QnVmXzsKKyAgdWludDMyX3QgYnVmUmVjbGFpbVRocmVzaF87CisgIHVpbnQzMl90IG1heEZyYW1lU2l6ZV87Cit9OworCisvKioKKyAqIFdyYXBzIGEgdHJhbnNwb3J0IGludG8gYSBmcmFtZWQgb25lLgorICoKKyAqLworY2xhc3MgVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkgOiBwdWJsaWMgVFRyYW5zcG9ydEZhY3RvcnkgeworcHVibGljOgorICBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisKKyAgdmlydHVhbCB+VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoKSB7fQorCisgIC8qKgorICAgKiBXcmFwcyB0aGUgdHJhbnNwb3J0IGludG8gYSBmcmFtZWQgb25lLgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpKTsKKyAgfQorfTsKKworLyoqCisgKiBBIG1lbW9yeSBidWZmZXIgaXMgYSB0cmFucHNvcnQgdGhhdCBzaW1wbHkgcmVhZHMgZnJvbSBhbmQgd3JpdGVzIHRvIGFuCisgKiBpbiBtZW1vcnkgYnVmZmVyLiBBbnl0aW1lIHlvdSBjYWxsIHdyaXRlIG9uIGl0LCB0aGUgZGF0YSBpcyBzaW1wbHkgcGxhY2VkCisgKiBpbnRvIGEgYnVmZmVyLCBhbmQgYW55dGltZSB5b3UgY2FsbCByZWFkLCBkYXRhIGlzIHJlYWQgZnJvbSB0aGF0IGJ1ZmZlci4KKyAqCisgKiBUaGUgYnVmZmVycyBhcmUgYWxsb2NhdGVkIHVzaW5nIEMgY29uc3RydWN0cyBtYWxsb2MscmVhbGxvYywgYW5kIHRoZSBzaXplCisgKiBkb3VibGVzIGFzIG5lY2Vzc2FyeS4gIFdlJ3ZlIGNvbnNpZGVyZWQgdXNpbmcgc2NvcGVkCisgKgorICovCitjbGFzcyBUTWVtb3J5QnVmZmVyIDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRNZW1vcnlCdWZmZXIsIFRCdWZmZXJCYXNlPiB7Citwcml2YXRlOgorICAvLyBDb21tb24gaW5pdGlhbGl6YXRpb24gZG9uZSBieSBhbGwgY29uc3RydWN0b3JzLgorICB2b2lkIGluaXRDb21tb24odWludDhfdCogYnVmLCB1aW50MzJfdCBzaXplLCBib29sIG93bmVyLCB1aW50MzJfdCB3UG9zKSB7CisKKyAgICBtYXhCdWZmZXJTaXplXyA9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpOworCisgICAgaWYgKGJ1ZiA9PSBOVUxMICYmIHNpemUgIT0gMCkgeworICAgICAgYXNzZXJ0KG93bmVyKTsKKyAgICAgIGJ1ZiA9ICh1aW50OF90KilzdGQ6Om1hbGxvYyhzaXplKTsKKyAgICAgIGlmIChidWYgPT0gTlVMTCkgeworCXRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisgICAgICB9CisgICAgfQorCisgICAgYnVmZmVyXyA9IGJ1ZjsKKyAgICBidWZmZXJTaXplXyA9IHNpemU7CisKKyAgICByQmFzZV8gPSBidWZmZXJfOworICAgIHJCb3VuZF8gPSBidWZmZXJfICsgd1BvczsKKyAgICAvLyBUT0RPKGRyZWlzcyk6IEludmVzdGlnYXRlIE5VTEwtaW5nIHRoaXMgaWYgIW93bmVyLgorICAgIHdCYXNlXyA9IGJ1ZmZlcl8gKyB3UG9zOworICAgIHdCb3VuZF8gPSBidWZmZXJfICsgYnVmZmVyU2l6ZV87CisKKyAgICBvd25lcl8gPSBvd25lcjsKKworICAgIC8vIHJCb3VuZF8gaXMgcmVhbGx5IGFuIGFydGlmYWN0LiAgSW4gcHJpbmNpcGxlLCBpdCBzaG91bGQgYWx3YXlzIGJlCisgICAgLy8gZXF1YWwgdG8gd0Jhc2VfLiAgV2UgdXBkYXRlIGl0IGluIGEgZmV3IHBsYWNlcyAoY29tcHV0ZVJlYWQsIGV0Yy4pLgorICB9CisKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGRlZmF1bHRTaXplID0gMTAyNDsKKworICAvKioKKyAgICogVGhpcyBlbnVtIHNwZWNpZmllcyBob3cgYSBUTWVtb3J5QnVmZmVyIHNob3VsZCB0cmVhdAorICAgKiBtZW1vcnkgcGFzc2VkIHRvIGl0IHZpYSBjb25zdHJ1Y3RvcnMgb3IgcmVzZXRCdWZmZXIuCisgICAqCisgICAqIE9CU0VSVkU6CisgICAqICAgVE1lbW9yeUJ1ZmZlciB3aWxsIHNpbXBseSBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlIG1lbW9yeS4KKyAgICogICBJdCBpcyB0aGUgY2FsbGVycyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGUgcG9pbnRlcgorICAgKiAgIHJlbWFpbnMgdmFsaWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgVE1lbW9yeUJ1ZmZlciwKKyAgICogICBhbmQgdGhhdCBpdCBpcyBwcm9wZXJseSBjbGVhbmVkIHVwLgorICAgKiAgIE5vdGUgdGhhdCBubyBkYXRhIGNhbiBiZSB3cml0dGVuIHRvIG9ic2VydmVkIGJ1ZmZlcnMuCisgICAqCisgICAqIENPUFk6CisgICAqICAgVE1lbW9yeUJ1ZmZlciB3aWxsIG1ha2UgYW4gaW50ZXJuYWwgY29weSBvZiB0aGUgYnVmZmVyLgorICAgKiAgIFRoZSBjYWxsZXIgaGFzIG5vIHJlc3BvbnNpYmlsaXRpZXMuCisgICAqCisgICAqIFRBS0VfT1dORVJTSElQOgorICAgKiAgIFRNZW1vcnlCdWZmZXIgd2lsbCBiZWNvbWUgdGhlICJvd25lciIgb2YgdGhlIGJ1ZmZlciwKKyAgICogICBhbmQgd2lsbCBiZSByZXNwb25zaWJsZSBmb3IgZnJlZWluZyBpdC4KKyAgICogICBUaGUgbWVtYm9yeSBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgd2l0aCBtYWxsb2MuCisgICAqLworICBlbnVtIE1lbW9yeVBvbGljeSB7IE9CU0VSVkUgPSAxLCBDT1BZID0gMiwgVEFLRV9PV05FUlNISVAgPSAzIH07CisKKyAgLyoqCisgICAqIENvbnN0cnVjdCBhIFRNZW1vcnlCdWZmZXIgd2l0aCBhIGRlZmF1bHQtc2l6ZWQgYnVmZmVyLAorICAgKiBvd25lZCBieSB0aGUgVE1lbW9yeUJ1ZmZlciBvYmplY3QuCisgICAqLworICBUTWVtb3J5QnVmZmVyKCkgeyBpbml0Q29tbW9uKE5VTEwsIGRlZmF1bHRTaXplLCB0cnVlLCAwKTsgfQorCisgIC8qKgorICAgKiBDb25zdHJ1Y3QgYSBUTWVtb3J5QnVmZmVyIHdpdGggYSBidWZmZXIgb2YgYSBzcGVjaWZpZWQgc2l6ZSwKKyAgICogb3duZWQgYnkgdGhlIFRNZW1vcnlCdWZmZXIgb2JqZWN0LgorICAgKgorICAgKiBAcGFyYW0gc3ogIFRoZSBpbml0aWFsIHNpemUgb2YgdGhlIGJ1ZmZlci4KKyAgICovCisgIFRNZW1vcnlCdWZmZXIodWludDMyX3Qgc3opIHsgaW5pdENvbW1vbihOVUxMLCBzeiwgdHJ1ZSwgMCk7IH0KKworICAvKioKKyAgICogQ29uc3RydWN0IGEgVE1lbW9yeUJ1ZmZlciB3aXRoIGJ1ZiBhcyBpdHMgaW5pdGlhbCBjb250ZW50cy4KKyAgICoKKyAgICogQHBhcmFtIGJ1ZiAgICBUaGUgaW5pdGlhbCBjb250ZW50cyBvZiB0aGUgYnVmZmVyLgorICAgKiAgICAgICAgICAgICAgIE5vdGUgdGhhdCwgd2hpbGUgYnVmIGlzIGEgbm9uLWNvbnN0IHBvaW50ZXIsCisgICAqICAgICAgICAgICAgICAgVE1lbW9yeUJ1ZmZlciB3aWxsIG5vdCB3cml0ZSB0byBpdCBpZiBwb2xpY3kgPT0gT0JTRVJWRSwKKyAgICogICAgICAgICAgICAgICBzbyBpdCBpcyBzYWZlIHRvIGNvbnN0X2Nhc3Q8dWludDhfdCo+KHdoYXRldmVyKS4KKyAgICogQHBhcmFtIHN6ICAgICBUaGUgc2l6ZSBvZiBAYyBidWYuCisgICAqIEBwYXJhbSBwb2xpY3kgU2VlIEBsaW5rIE1lbW9yeVBvbGljeSBAZW5kbGluayAuCisgICAqLworICBUTWVtb3J5QnVmZmVyKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3Qgc3osIE1lbW9yeVBvbGljeSBwb2xpY3kgPSBPQlNFUlZFKSB7CisgICAgaWYgKGJ1ZiA9PSBOVUxMICYmIHN6ICE9IDApIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUTWVtb3J5QnVmZmVyIGdpdmVuIG51bGwgYnVmZmVyIHdpdGggbm9uLXplcm8gc2l6ZS4iKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHBvbGljeSkgeworICAgIGNhc2UgT0JTRVJWRToKKyAgICBjYXNlIFRBS0VfT1dORVJTSElQOgorICAgICAgaW5pdENvbW1vbihidWYsIHN6LCBwb2xpY3kgPT0gVEFLRV9PV05FUlNISVAsIHN6KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ09QWToKKyAgICAgIGluaXRDb21tb24oTlVMTCwgc3osIHRydWUsIDApOworICAgICAgdGhpcy0+d3JpdGUoYnVmLCBzeik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgTWVtb3J5UG9saWN5IGZvciBUTWVtb3J5QnVmZmVyIik7CisgICAgfQorICB9CisKKyAgflRNZW1vcnlCdWZmZXIoKSB7CisgICAgaWYgKG93bmVyXykgeworICAgICAgc3RkOjpmcmVlKGJ1ZmZlcl8pOworICAgIH0KKyAgfQorCisgIGJvb2wgaXNPcGVuKCkgeyByZXR1cm4gdHJ1ZTsgfQorCisgIGJvb2wgcGVlaygpIHsgcmV0dXJuIChyQmFzZV8gPCB3QmFzZV8pOyB9CisKKyAgdm9pZCBvcGVuKCkge30KKworICB2b2lkIGNsb3NlKCkge30KKworICAvLyBUT0RPKGRyZWlzcyk6IE1ha2UgYnVmUHRyIGNvbnN0LgorICB2b2lkIGdldEJ1ZmZlcih1aW50OF90KiogYnVmUHRyLCB1aW50MzJfdCogc3opIHsKKyAgICAqYnVmUHRyID0gckJhc2VfOworICAgICpzeiA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSByQmFzZV8pOworICB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0QnVmZmVyQXNTdHJpbmcoKSB7CisgICAgaWYgKGJ1ZmZlcl8gPT0gTlVMTCkgeworICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICB1aW50OF90KiBidWY7CisgICAgdWludDMyX3Qgc3o7CisgICAgZ2V0QnVmZmVyKCZidWYsICZzeik7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKChjaGFyKilidWYsIChzdGQ6OnN0cmluZzo6c2l6ZV90eXBlKXN6KTsKKyAgfQorCisgIHZvaWQgYXBwZW5kQnVmZmVyVG9TdHJpbmcoc3RkOjpzdHJpbmcmIHN0cikgeworICAgIGlmIChidWZmZXJfID09IE5VTEwpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgdWludDhfdCogYnVmOworICAgIHVpbnQzMl90IHN6OworICAgIGdldEJ1ZmZlcigmYnVmLCAmc3opOworICAgIHN0ci5hcHBlbmQoKGNoYXIqKWJ1Ziwgc3opOworICB9CisKKyAgdm9pZCByZXNldEJ1ZmZlcigpIHsKKyAgICByQmFzZV8gPSBidWZmZXJfOworICAgIHJCb3VuZF8gPSBidWZmZXJfOworICAgIHdCYXNlXyA9IGJ1ZmZlcl87CisgICAgLy8gSXQgaXNuJ3Qgc2FmZSB0byB3cml0ZSBpbnRvIGEgYnVmZmVyIHdlIGRvbid0IG93bi4KKyAgICBpZiAoIW93bmVyXykgeworICAgICAgd0JvdW5kXyA9IHdCYXNlXzsKKyAgICAgIGJ1ZmZlclNpemVfID0gMDsKKyAgICB9CisgIH0KKworICAvLy8gU2VlIGNvbnN0cnVjdG9yIGRvY3VtZW50YXRpb24uCisgIHZvaWQgcmVzZXRCdWZmZXIodWludDhfdCogYnVmLCB1aW50MzJfdCBzeiwgTWVtb3J5UG9saWN5IHBvbGljeSA9IE9CU0VSVkUpIHsKKyAgICAvLyBVc2UgYSB2YXJpYW50IG9mIHRoZSBjb3B5LWFuZC1zd2FwIHRyaWNrIGZvciBhc3NpZ25tZW50IG9wZXJhdG9ycy4KKyAgICAvLyBUaGlzIGlzIHN1Yi1vcHRpbWFsIGluIHRlcm1zIG9mIHBlcmZvcm1hbmNlIGZvciB0d28gcmVhc29uczoKKyAgICAvLyAgIDEvIFRoZSBjb25zdHJ1Y3RpbmcgYW5kIHN3YXBwaW5nIG9mIHRoZSAoc21hbGwpIHZhbHVlcworICAgIC8vICAgICAgaW4gdGhlIHRlbXBvcmFyeSBvYmplY3QgdGFrZXMgc29tZSB0aW1lLCBhbmQgaXMgbm90IG5lY2Vzc2FyeS4KKyAgICAvLyAgIDIvIElmIHBvbGljeSA9PSBDT1BZLCB3ZSBhbGxvY2F0ZSB0aGUgbmV3IGJ1ZmZlciBiZWZvcmUKKyAgICAvLyAgICAgIGZyZWVpbmcgdGhlIG9sZCBvbmUsIHByZWNsdWRpbmcgdGhlIHBvc3NpYmlsaXR5IG9mCisgICAgLy8gICAgICByZXVzaW5nIHRoYXQgbWVtb3J5LgorICAgIC8vIEkgZG91YnQgdGhhdCBlaXRoZXIgb2YgdGhlc2UgcHJvYmxlbXMgY291bGQgYmUgb3B0aW1pemVkIGF3YXksCisgICAgLy8gYnV0IHRoZSBzZWNvbmQgaXMgcHJvYmFibHkgbm8gYSBjb21tb24gY2FzZSwgYW5kIHRoZSBmaXJzdCBpcyBtaW5vci4KKyAgICAvLyBJIGRvbid0IGV4cGVjdCByZXNldEJ1ZmZlciB0byBiZSBhIGNvbW1vbiBvcGVyYXRpb24sIHNvIEknbSB3aWxsaW5nIHRvCisgICAgLy8gYml0ZSB0aGUgcGVyZm9ybWFuY2UgYnVsbGV0IHRvIG1ha2UgdGhlIG1ldGhvZCB0aGlzIHNpbXBsZS4KKworICAgIC8vIENvbnN0cnVjdCB0aGUgbmV3IGJ1ZmZlci4KKyAgICBUTWVtb3J5QnVmZmVyIG5ld19idWZmZXIoYnVmLCBzeiwgcG9saWN5KTsKKyAgICAvLyBNb3ZlIGl0IGludG8gb3Vyc2VsZi4KKyAgICB0aGlzLT5zd2FwKG5ld19idWZmZXIpOworICAgIC8vIE91ciBvbGQgc2VsZiBnZXRzIGRlc3Ryb3llZC4KKyAgfQorCisgIC8vLyBTZWUgY29uc3RydWN0b3IgZG9jdW1lbnRhdGlvbi4KKyAgdm9pZCByZXNldEJ1ZmZlcih1aW50MzJfdCBzeikgeworICAgIC8vIENvbnN0cnVjdCB0aGUgbmV3IGJ1ZmZlci4KKyAgICBUTWVtb3J5QnVmZmVyIG5ld19idWZmZXIoc3opOworICAgIC8vIE1vdmUgaXQgaW50byBvdXJzZWxmLgorICAgIHRoaXMtPnN3YXAobmV3X2J1ZmZlcik7CisgICAgLy8gT3VyIG9sZCBzZWxmIGdldHMgZGVzdHJveWVkLgorICB9CisKKyAgc3RkOjpzdHJpbmcgcmVhZEFzU3RyaW5nKHVpbnQzMl90IGxlbikgeworICAgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgICAodm9pZClyZWFkQXBwZW5kVG9TdHJpbmcoc3RyLCBsZW4pOworICAgIHJldHVybiBzdHI7CisgIH0KKworICB1aW50MzJfdCByZWFkQXBwZW5kVG9TdHJpbmcoc3RkOjpzdHJpbmcmIHN0ciwgdWludDMyX3QgbGVuKTsKKworICAvLyByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHJlYWQKKyAgdWludDMyX3QgcmVhZEVuZCgpIHsKKyAgICAvLyBUaGlzIGNhc3Qgc2hvdWxkIGJlIHNhZmUsIGJlY2F1c2UgYnVmZmVyXydzIHNpemUgaXMgYSB1aW50MzJfdAorICAgIHVpbnQzMl90IGJ5dGVzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJCYXNlXyAtIGJ1ZmZlcl8pOworICAgIGlmIChyQmFzZV8gPT0gd0Jhc2VfKSB7CisgICAgICByZXNldEJ1ZmZlcigpOworICAgIH0KKyAgICByZXR1cm4gYnl0ZXM7CisgIH0KKworICAvLyBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4KKyAgdWludDMyX3Qgd3JpdGVFbmQoKSB7CisgICAgLy8gVGhpcyBjYXN0IHNob3VsZCBiZSBzYWZlLCBiZWNhdXNlIGJ1ZmZlcl8ncyBzaXplIGlzIGEgdWludDMyX3QKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCYXNlXyAtIGJ1ZmZlcl8pOworICB9CisKKyAgdWludDMyX3QgYXZhaWxhYmxlX3JlYWQoKSBjb25zdCB7CisgICAgLy8gUmVtZW1iZXIsIHdCYXNlXyBpcyB0aGUgcmVhbCByQm91bmRfLgorICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0Jhc2VfIC0gckJhc2VfKTsKKyAgfQorCisgIHVpbnQzMl90IGF2YWlsYWJsZV93cml0ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90Pih3Qm91bmRfIC0gd0Jhc2VfKTsgfQorCisgIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBjbGllbnQgY2FuIHdyaXRlIGRhdGEgdG8gYXBwZW5kIHRvCisgIC8vIHRoZSBUTWVtb3J5QnVmZmVyLCBhbmQgZW5zdXJlcyB0aGUgYnVmZmVyIGlzIGJpZyBlbm91Z2ggdG8gYWNjb21tb2RhdGUgYQorICAvLyB3cml0ZSBvZiB0aGUgcHJvdmlkZWQgbGVuZ3RoLiAgVGhlIHJldHVybmVkIHBvaW50ZXIgaXMgdmVyeSBjb252ZW5pZW50IGZvcgorICAvLyBwYXNzaW5nIHRvIHJlYWQoKSwgcmVjdigpLCBvciBzaW1pbGFyLiBZb3UgbXVzdCBjYWxsIHdyb3RlQnl0ZXMoKSBhcyBzb29uCisgIC8vIGFzIGRhdGEgaXMgd3JpdHRlbiBvciB0aGUgYnVmZmVyIHdpbGwgbm90IGJlIGF3YXJlIHRoYXQgZGF0YSBoYXMgY2hhbmdlZC4KKyAgdWludDhfdCogZ2V0V3JpdGVQdHIodWludDMyX3QgbGVuKSB7CisgICAgZW5zdXJlQ2FuV3JpdGUobGVuKTsKKyAgICByZXR1cm4gd0Jhc2VfOworICB9CisKKyAgLy8gSW5mb3JtcyB0aGUgYnVmZmVyIHRoYXQgdGhlIGNsaWVudCBoYXMgd3JpdHRlbiAnbGVuJyBieXRlcyBpbnRvIHN0b3JhZ2UKKyAgLy8gdGhhdCBoYWQgYmVlbiBwcm92aWRlZCBieSBnZXRXcml0ZVB0cigpLgorICB2b2lkIHdyb3RlQnl0ZXModWludDMyX3QgbGVuKTsKKworICAvKgorICAgKiBUVmlydHVhbFRyYW5zcG9ydCBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgcmVhZEFsbCgpLgorICAgKiBXZSB3YW50IHRvIHVzZSB0aGUgVEJ1ZmZlckJhc2UgdmVyc2lvbiBpbnN0ZWFkLgorICAgKi8KKyAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gVEJ1ZmZlckJhc2U6OnJlYWRBbGwoYnVmLCBsZW4pOyB9CisKKyAgLy8hIFxicmllZiBHZXQgdGhlIGN1cnJlbnQgYnVmZmVyIHNpemUKKyAgLy8hIFxyZXR1cm5zIHRoZSBjdXJyZW50IGJ1ZmZlciBzaXplCisgIHVpbnQzMl90IGdldEJ1ZmZlclNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIGJ1ZmZlclNpemVfOworICB9CisKKyAgLy8hIFxicmllZiBHZXQgdGhlIGN1cnJlbnQgbWF4aW11bSBidWZmZXIgc2l6ZQorICAvLyEgXHJldHVybnMgdGhlIGN1cnJlbnQgbWF4aW11bSBidWZmZXIgc2l6ZQorICB1aW50MzJfdCBnZXRNYXhCdWZmZXJTaXplKCkgY29uc3QgeworICAgIHJldHVybiBtYXhCdWZmZXJTaXplXzsKKyAgfQorCisgIC8vISBcYnJpZWYgQ2hhbmdlIHRoZSBtYXhpbXVtIGJ1ZmZlciBzaXplCisgIC8vISBccGFyYW1baW5dICBtYXhTaXplICB0aGUgbmV3IG1heGltdW0gYnVmZmVyIHNpemUgYWxsb3dlZCB0byBncm93IHRvCisgIC8vISBcdGhyb3dzICBUVHJhbnNwb3J0RXhjZXB0aW9uKEJBRF9BUkdTKSBpZiBtYXhTaXplIGlzIGxlc3MgdGhhbiB0aGUgY3VycmVudCBidWZmZXIgc2l6ZQorICB2b2lkIHNldE1heEJ1ZmZlclNpemUodWludDMyX3QgbWF4U2l6ZSkgeworICAgIGlmIChtYXhTaXplIDwgYnVmZmVyU2l6ZV8pIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXhpbXVtIGJ1ZmZlciBzaXplIHdvdWxkIGJlIGxlc3MgdGhhbiBjdXJyZW50IGJ1ZmZlciBzaXplIik7CisgICAgfQorICAgIG1heEJ1ZmZlclNpemVfID0gbWF4U2l6ZTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHZvaWQgc3dhcChUTWVtb3J5QnVmZmVyJiB0aGF0KSB7CisgICAgdXNpbmcgc3RkOjpzd2FwOworICAgIHN3YXAoYnVmZmVyXywgdGhhdC5idWZmZXJfKTsKKyAgICBzd2FwKGJ1ZmZlclNpemVfLCB0aGF0LmJ1ZmZlclNpemVfKTsKKworICAgIHN3YXAockJhc2VfLCB0aGF0LnJCYXNlXyk7CisgICAgc3dhcChyQm91bmRfLCB0aGF0LnJCb3VuZF8pOworICAgIHN3YXAod0Jhc2VfLCB0aGF0LndCYXNlXyk7CisgICAgc3dhcCh3Qm91bmRfLCB0aGF0LndCb3VuZF8pOworCisgICAgc3dhcChvd25lcl8sIHRoYXQub3duZXJfKTsKKyAgfQorCisgIC8vIE1ha2Ugc3VyZSB0aGVyZSdzIGF0IGxlYXN0ICdsZW4nIGJ5dGVzIGF2YWlsYWJsZSBmb3Igd3JpdGluZy4KKyAgdm9pZCBlbnN1cmVDYW5Xcml0ZSh1aW50MzJfdCBsZW4pOworCisgIC8vIENvbXB1dGUgdGhlIHBvc2l0aW9uIGFuZCBhdmFpbGFibGUgZGF0YSBmb3IgcmVhZGluZy4KKyAgdm9pZCBjb21wdXRlUmVhZCh1aW50MzJfdCBsZW4sIHVpbnQ4X3QqKiBvdXRfc3RhcnQsIHVpbnQzMl90KiBvdXRfZ2l2ZSk7CisKKyAgdWludDMyX3QgcmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHZvaWQgd3JpdGVTbG93KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICBjb25zdCB1aW50OF90KiBib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbik7CisKKyAgLy8gRGF0YSBidWZmZXIKKyAgdWludDhfdCogYnVmZmVyXzsKKworICAvLyBBbGxvY2F0ZWQgYnVmZmVyIHNpemUKKyAgdWludDMyX3QgYnVmZmVyU2l6ZV87CisKKyAgLy8gTWF4aW11bSBhbGxvd2VkIHNpemUKKyAgdWludDMyX3QgbWF4QnVmZmVyU2l6ZV87CisKKyAgLy8gSXMgdGhpcyBvYmplY3QgdGhlIG93bmVyIG9mIHRoZSBidWZmZXI/CisgIGJvb2wgb3duZXJfOworCisgIC8vIERvbid0IGZvcmdldCB0byB1cGRhdGUgY29uc3RyY3RvcnMsIGluaXRDb21tb24sIGFuZCBzd2FwIGlmCisgIC8vIHlvdSBhZGQgbmV3IG1lbWJlcnMuCit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RCVUZGRVJUUkFOU1BPUlRTX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkZDEwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmNwcApAQCAtMCwwICsxLDkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjZXJybm8+CisjaW5jbHVkZSA8ZXhjZXB0aW9uPgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPGlvLmg+CisjZW5kaWYKKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKwordm9pZCBURkRUcmFuc3BvcnQ6OmNsb3NlKCkgeworICBpZiAoIWlzT3BlbigpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaW50IHJ2ID0gOjpUSFJJRlRfQ0xPU0UoZmRfKTsKKyAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CisgIGZkXyA9IC0xOworICAvLyBIYXZlIHRvIGNoZWNrIHVuY2F1Z2h0X2V4Y2VwdGlvbiBiZWNhdXNlIHRoaXMgaXMgY2FsbGVkIGluIHRoZSBkZXN0cnVjdG9yLgorICBpZiAocnYgPCAwICYmICFzdGQ6OnVuY2F1Z2h0X2V4Y2VwdGlvbigpKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVEZEVHJhbnNwb3J0OjpjbG9zZSgpIiwgZXJybm9fY29weSk7CisgIH0KK30KKwordWludDMyX3QgVEZEVHJhbnNwb3J0OjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIHVuc2lnbmVkIGludCBtYXhSZXRyaWVzID0gNTsgLy8gc2FtZSBhcyB0aGUgVFNvY2tldCBkZWZhdWx0CisgIHVuc2lnbmVkIGludCByZXRyaWVzID0gMDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBUSFJJRlRfU1NJWkVUIHJ2ID0gOjpUSFJJRlRfUkVBRChmZF8sIGJ1ZiwgbGVuKTsKKyAgICBpZiAocnYgPCAwKSB7CisgICAgICBpZiAoVEhSSUZUX0VSUk5PID09IFRIUklGVF9FSU5UUiAmJiByZXRyaWVzIDwgbWF4UmV0cmllcykgeworICAgICAgICAvLyBJZiBpbnRlcnJ1cHRlZCwgdHJ5IGFnYWluCisgICAgICAgICsrcmV0cmllczsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9FUlJOTzsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlRGRFRyYW5zcG9ydDo6cmVhZCgpIiwgZXJybm9fY29weSk7CisgICAgfQorICAgIC8vIHRoaXMgc2hvdWxkIGJlIGZpbmUsIHNpbmNlIHdlIGFscmVhZHkgY2hlY2tlZCBmb3IgbmVnYXRpdmUgdmFsdWVzLAorICAgIC8vIGFuZCA6OnJlYWQgc2hvdWxkIG9ubHkgcmV0dXJuIGEgMzItYml0IHZhbHVlIHNpbmNlIGxlbiBpcyAzMi1iaXQuCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90Pihydik7CisgIH0KK30KKwordm9pZCBURkRUcmFuc3BvcnQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgVEhSSUZUX1NTSVpFVCBydiA9IDo6VEhSSUZUX1dSSVRFKGZkXywgYnVmLCBsZW4pOworCisgICAgaWYgKHJ2IDwgMCkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJURkRUcmFuc3BvcnQ6OndyaXRlKCkiLCBlcnJub19jb3B5KTsKKyAgICB9IGVsc2UgaWYgKHJ2ID09IDApIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUsICJURkRUcmFuc3BvcnQ6OndyaXRlKCkiKTsKKyAgICB9CisKKyAgICBidWYgKz0gcnY7CisgICAgLy8gdGhpcyBzaG91bGQgYmUgZmluZSwgYXMgd2UndmUgYWxyZWFkeSBjaGVja2VkIGZvciBuZWdhdGl2ZSB2YWx1ZXMsIGFuZAorICAgIC8vOjp3cml0ZSBzaG91bGRuJ3QgcmV0dXJuIG1vcmUgdGhhbiBhIHVpbnQzMl90IHNpbmNlIGxlbiBpcyBhIHVpbnQzMl90CisgICAgbGVuIC09IHN0YXRpY19jYXN0PHVpbnQzMl90Pihydik7CisgIH0KK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU5M2Q0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RGRFRSQU5TUE9SVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9URkRUUkFOU1BPUlRfSF8gMQorCisjaW5jbHVkZSA8c3RyaW5nPgorI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIERlYWQtc2ltcGxlIHdyYXBwZXIgYXJvdW5kIGEgZmlsZSBkZXNjcmlwdG9yLgorICoKKyAqLworY2xhc3MgVEZEVHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRGRFRyYW5zcG9ydD4geworcHVibGljOgorICBlbnVtIENsb3NlUG9saWN5IHsgTk9fQ0xPU0VfT05fREVTVFJPWSA9IDAsIENMT1NFX09OX0RFU1RST1kgPSAxIH07CisKKyAgVEZEVHJhbnNwb3J0KGludCBmZCwgQ2xvc2VQb2xpY3kgY2xvc2VfcG9saWN5ID0gTk9fQ0xPU0VfT05fREVTVFJPWSkKKyAgICA6IGZkXyhmZCksIGNsb3NlX3BvbGljeV8oY2xvc2VfcG9saWN5KSB7fQorCisgIH5URkRUcmFuc3BvcnQoKSB7CisgICAgaWYgKGNsb3NlX3BvbGljeV8gPT0gQ0xPU0VfT05fREVTVFJPWSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIGV4KSB7CisgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIn5URkRUcmFuc3BvcnQgVFRyYW5zcG9ydEV4Y2VwdGlvbjogJyVzJyIsIGV4LndoYXQoKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgYm9vbCBpc09wZW4oKSB7IHJldHVybiBmZF8gPj0gMDsgfQorCisgIHZvaWQgb3BlbigpIHt9CisKKyAgdm9pZCBjbG9zZSgpOworCisgIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHZvaWQgc2V0RkQoaW50IGZkKSB7IGZkXyA9IGZkOyB9CisgIGludCBnZXRGRCgpIHsgcmV0dXJuIGZkXzsgfQorCitwcm90ZWN0ZWQ6CisgIGludCBmZF87CisgIENsb3NlUG9saWN5IGNsb3NlX3BvbGljeV87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RGRFRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmI0NDExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAKQEAgLTAsMCArMSwxMDgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9GdW5jdGlvblJ1bm5lci5oPgorCisjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CisKKyNpZmRlZiBIQVZFX1NZU19USU1FX0gKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2Vsc2UKKyNpbmNsdWRlIDx0aW1lLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8aW8uaD4KKyNlbmRpZgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6Y2VycjsKK3VzaW5nIHN0ZDo6Y291dDsKK3VzaW5nIHN0ZDo6ZW5kbDsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CisKK1RGaWxlVHJhbnNwb3J0OjpURmlsZVRyYW5zcG9ydChzdHJpbmcgcGF0aCwgYm9vbCByZWFkT25seSkKKyAgOiByZWFkU3RhdGVfKCksCisgICAgcmVhZEJ1ZmZfKE5VTEwpLAorICAgIGN1cnJlbnRFdmVudF8oTlVMTCksCisgICAgcmVhZEJ1ZmZTaXplXyhERUZBVUxUX1JFQURfQlVGRl9TSVpFKSwKKyAgICByZWFkVGltZW91dF8oTk9fVEFJTF9SRUFEX1RJTUVPVVQpLAorICAgIGNodW5rU2l6ZV8oREVGQVVMVF9DSFVOS19TSVpFKSwKKyAgICBldmVudEJ1ZmZlclNpemVfKERFRkFVTFRfRVZFTlRfQlVGRkVSX1NJWkUpLAorICAgIGZsdXNoTWF4VXNfKERFRkFVTFRfRkxVU0hfTUFYX1VTKSwKKyAgICBmbHVzaE1heEJ5dGVzXyhERUZBVUxUX0ZMVVNIX01BWF9CWVRFUyksCisgICAgbWF4RXZlbnRTaXplXyhERUZBVUxUX01BWF9FVkVOVF9TSVpFKSwKKyAgICBtYXhDb3JydXB0ZWRFdmVudHNfKERFRkFVTFRfTUFYX0NPUlJVUFRFRF9FVkVOVFMpLAorICAgIGVvZlNsZWVwVGltZV8oREVGQVVMVF9FT0ZfU0xFRVBfVElNRV9VUyksCisgICAgY29ycnVwdGVkRXZlbnRTbGVlcFRpbWVfKERFRkFVTFRfQ09SUlVQVEVEX1NMRUVQX1RJTUVfVVMpLAorICAgIHdyaXRlclRocmVhZElPRXJyb3JTbGVlcFRpbWVfKERFRkFVTFRfV1JJVEVSX1RIUkVBRF9TTEVFUF9USU1FX1VTKSwKKyAgICBkZXF1ZXVlQnVmZmVyXyhOVUxMKSwKKyAgICBlbnF1ZXVlQnVmZmVyXyhOVUxMKSwKKyAgICBub3RGdWxsXygmbXV0ZXhfKSwKKyAgICBub3RFbXB0eV8oJm11dGV4XyksCisgICAgY2xvc2luZ18oZmFsc2UpLAorICAgIGZsdXNoZWRfKCZtdXRleF8pLAorICAgIGZvcmNlRmx1c2hfKGZhbHNlKSwKKyAgICBmaWxlbmFtZV8ocGF0aCksCisgICAgZmRfKDApLAorICAgIGJ1ZmZlckFuZFRocmVhZEluaXRpYWxpemVkXyhmYWxzZSksCisgICAgb2Zmc2V0XygwKSwKKyAgICBsYXN0QmFkQ2h1bmtfKDApLAorICAgIG51bUNvcnJ1cHRlZEV2ZW50c0luQ2h1bmtfKDApLAorICAgIHJlYWRPbmx5XyhyZWFkT25seSkgeworICB0aHJlYWRGYWN0b3J5Xy5zZXREZXRhY2hlZChmYWxzZSk7CisgIG9wZW5Mb2dGaWxlKCk7Cit9CisKK3ZvaWQgVEZpbGVUcmFuc3BvcnQ6OnJlc2V0T3V0cHV0RmlsZShpbnQgZmQsIHN0cmluZyBmaWxlbmFtZSwgb2ZmX3Qgb2Zmc2V0KSB7CisgIGZpbGVuYW1lXyA9IGZpbGVuYW1lOworICBvZmZzZXRfID0gb2Zmc2V0OworCisgIC8vIGNoZWNrIGlmIGN1cnJlbnQgZmlsZSBpcyBzdGlsbCBvcGVuCisgIGlmIChmZF8gPiAwKSB7CisgICAgLy8gZmx1c2ggYW55IGV2ZW50cyBpbiB0aGUgcXVldWUKKyAgICBmbHVzaCgpOworICAgIEdsb2JhbE91dHB1dC5wcmludGYoImVycm9yLCBjdXJyZW50IGZpbGUgKCVzKSBub3QgY2xvc2VkIiwgZmlsZW5hbWVfLmNfc3RyKCkpOworICAgIGlmICgtMSA9PSA6OlRIUklGVF9DTE9TRShmZF8pKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9FUlJOTzsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiByZXNldE91dHB1dEZpbGUoKSA6OmNsb3NlKCkgIiwgZXJybm9fY29weSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJURmlsZVRyYW5zcG9ydDogZXJyb3IgaW4gZmlsZSBjbG9zZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBzdWNjZXNzZnVsbHkgY2xvc2VkIGZkCisgICAgICBmZF8gPSAwOworICAgIH0KKyAgfQorCisgIGlmIChmZCkgeworICAgIGZkXyA9IGZkOworICB9IGVsc2UgeworICAgIC8vIG9wZW4gZmlsZSBpZiB0aGUgaW5wdXQgZmQgaXMgMAorICAgIG9wZW5Mb2dGaWxlKCk7CisgIH0KK30KKworVEZpbGVUcmFuc3BvcnQ6On5URmlsZVRyYW5zcG9ydCgpIHsKKyAgLy8gZmx1c2ggdGhlIGJ1ZmZlciBpZiBhIHdyaXRlciB0aHJlYWQgaXMgYWN0aXZlCisgIGlmICh3cml0ZXJUaHJlYWRfLmdldCgpKSB7CisgICAgLy8gc2V0IHN0YXRlIHRvIGNsb3NpbmcKKyAgICBjbG9zaW5nXyA9IHRydWU7CisKKyAgICAvLyB3YWtlIHVwIHRoZSB3cml0ZXIgdGhyZWFkCisgICAgLy8gU2luY2UgY2xvc2luZ18gaXMgdHJ1ZSwgaXQgd2lsbCBhdHRlbXB0IHRvIGZsdXNoIGFsbCBkYXRhLCB0aGVuIGV4aXQuCisgICAgbm90RW1wdHlfLm5vdGlmeSgpOworCisgICAgd3JpdGVyVGhyZWFkXy0+am9pbigpOworICAgIHdyaXRlclRocmVhZF8ucmVzZXQoKTsKKyAgfQorCisgIGlmIChkZXF1ZXVlQnVmZmVyXykgeworICAgIGRlbGV0ZSBkZXF1ZXVlQnVmZmVyXzsKKyAgICBkZXF1ZXVlQnVmZmVyXyA9IE5VTEw7CisgIH0KKworICBpZiAoZW5xdWV1ZUJ1ZmZlcl8pIHsKKyAgICBkZWxldGUgZW5xdWV1ZUJ1ZmZlcl87CisgICAgZW5xdWV1ZUJ1ZmZlcl8gPSBOVUxMOworICB9CisKKyAgaWYgKHJlYWRCdWZmXykgeworICAgIGRlbGV0ZVtdIHJlYWRCdWZmXzsKKyAgICByZWFkQnVmZl8gPSBOVUxMOworICB9CisKKyAgaWYgKGN1cnJlbnRFdmVudF8pIHsKKyAgICBkZWxldGUgY3VycmVudEV2ZW50XzsKKyAgICBjdXJyZW50RXZlbnRfID0gTlVMTDsKKyAgfQorCisgIC8vIGNsb3NlIGxvZ2ZpbGUKKyAgaWYgKGZkXyA+IDApIHsKKyAgICBpZiAoLTEgPT0gOjpUSFJJRlRfQ0xPU0UoZmRfKSkgeworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IH5URmlsZVRyYW5zcG9ydCgpIDo6Y2xvc2UoKSAiLCBUSFJJRlRfRVJSTk8pOworICAgIH0gZWxzZSB7CisgICAgICAvLyBzdWNjZXNzZnVsbHkgY2xvc2VkIGZkCisgICAgICBmZF8gPSAwOworICAgIH0KKyAgfQorfQorCitib29sIFRGaWxlVHJhbnNwb3J0Ojppbml0QnVmZmVyQW5kV3JpdGVUaHJlYWQoKSB7CisgIGlmIChidWZmZXJBbmRUaHJlYWRJbml0aWFsaXplZF8pIHsKKyAgICBUX0VSUk9SKCIlcyIsICJUcnlpbmcgdG8gZG91YmxlLWluaXQgVEZpbGVUcmFuc3BvcnQiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIXdyaXRlclRocmVhZF8uZ2V0KCkpIHsKKyAgICB3cml0ZXJUaHJlYWRfID0gdGhyZWFkRmFjdG9yeV8ubmV3VGhyZWFkKAorICAgICAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OkZ1bmN0aW9uUnVubmVyOjpjcmVhdGUoc3RhcnRXcml0ZXJUaHJlYWQsIHRoaXMpKTsKKyAgICB3cml0ZXJUaHJlYWRfLT5zdGFydCgpOworICB9CisKKyAgZGVxdWV1ZUJ1ZmZlcl8gPSBuZXcgVEZpbGVUcmFuc3BvcnRCdWZmZXIoZXZlbnRCdWZmZXJTaXplXyk7CisgIGVucXVldWVCdWZmZXJfID0gbmV3IFRGaWxlVHJhbnNwb3J0QnVmZmVyKGV2ZW50QnVmZmVyU2l6ZV8pOworICBidWZmZXJBbmRUaHJlYWRJbml0aWFsaXplZF8gPSB0cnVlOworCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFRGaWxlVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBpZiAocmVhZE9ubHlfKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiVEZpbGVUcmFuc3BvcnQ6IGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gZmlsZSBvcGVuZWQgcmVhZG9ubHkiKTsKKyAgfQorCisgIGVucXVldWVFdmVudChidWYsIGxlbik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVD4KK3N0cnVjdCB1bmlxdWVEZWxldGVyCit7CisgIHZvaWQgb3BlcmF0b3IoKShfVCAqcHRyKSBjb25zdCB7IGRlbGV0ZSBwdHI7IH0KK307CisKK3ZvaWQgVEZpbGVUcmFuc3BvcnQ6OmVucXVldWVFdmVudChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGV2ZW50TGVuKSB7CisgIC8vIGNhbid0IGVucXVldWUgbW9yZSBldmVudHMgaWYgZmlsZSBpcyBnb2luZyB0byBjbG9zZQorICBpZiAoY2xvc2luZ18pIHsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBtYWtlIHN1cmUgdGhhdCBldmVudCBzaXplIGlzIHZhbGlkCisgIGlmICgobWF4RXZlbnRTaXplXyA+IDApICYmIChldmVudExlbiA+IG1heEV2ZW50U2l6ZV8pKSB7CisgICAgVF9FUlJPUigibXNnIHNpemUgaXMgZ3JlYXRlciB0aGFuIG1heCBldmVudCBzaXplOiAldSA+ICV1XG4iLCBldmVudExlbiwgbWF4RXZlbnRTaXplXyk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGV2ZW50TGVuID09IDApIHsKKyAgICBUX0VSUk9SKCIlcyIsICJjYW5ub3QgZW5xdWV1ZSBhbiBlbXB0eSBldmVudCIpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxldmVudEluZm8sIHVuaXF1ZURlbGV0ZXI8ZXZlbnRJbmZvPiA+IHRvRW5xdWV1ZShuZXcgZXZlbnRJbmZvKCkpOworICB0b0VucXVldWUtPmV2ZW50QnVmZl8gPSBuZXcgdWludDhfdFsoc2l6ZW9mKHVpbnQ4X3QpICogZXZlbnRMZW4pICsgNF07CisKKyAgLy8gZmlyc3QgNCBieXRlcyBpcyB0aGUgZXZlbnQgbGVuZ3RoCisgIG1lbWNweSh0b0VucXVldWUtPmV2ZW50QnVmZl8sICh2b2lkKikoJmV2ZW50TGVuKSwgNCk7CisgIC8vIGFjdHVhbCBldmVudCBjb250ZW50cworICBtZW1jcHkodG9FbnF1ZXVlLT5ldmVudEJ1ZmZfICsgNCwgYnVmLCBldmVudExlbik7CisgIHRvRW5xdWV1ZS0+ZXZlbnRTaXplXyA9IGV2ZW50TGVuICsgNDsKKworICAvLyBsb2NrIG11dGV4CisgIEd1YXJkIGcobXV0ZXhfKTsKKworICAvLyBtYWtlIHN1cmUgdGhhdCBlbnF1ZXVlIGJ1ZmZlciBpcyBpbml0aWFsaXplZCBhbmQgd3JpdGVyIHRocmVhZCBpcyBydW5uaW5nCisgIGlmICghYnVmZmVyQW5kVGhyZWFkSW5pdGlhbGl6ZWRfKSB7CisgICAgaWYgKCFpbml0QnVmZmVyQW5kV3JpdGVUaHJlYWQoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8vIENhbid0IGVucXVldWUgd2hpbGUgYnVmZmVyIGlzIGZ1bGwKKyAgd2hpbGUgKGVucXVldWVCdWZmZXJfLT5pc0Z1bGwoKSkgeworICAgIG5vdEZ1bGxfLndhaXQoKTsKKyAgfQorCisgIC8vIFdlIHNob3VsZG4ndCBiZSB0cnlpbmcgdG8gZW5xdWV1ZSBuZXcgZGF0YSB3aGlsZSBhIGZvcmNlZCBmbHVzaCBpcworICAvLyByZXF1ZXN0ZWQuICAoT3RoZXJ3aXNlIHRoZSB3cml0ZXIgdGhyZWFkIG1pZ2h0IG5vdCBldmVyIGJlIGFibGUgdG8gZmluaXNoCisgIC8vIHRoZSBmbHVzaCBpZiBtb3JlIGRhdGEga2VlcHMgYmVpbmcgZW5xdWV1ZWQuKQorICBhc3NlcnQoIWZvcmNlRmx1c2hfKTsKKworICAvLyBhZGQgdG8gdGhlIGJ1ZmZlcgorICBldmVudEluZm8qIHBFdmVudCA9IHRvRW5xdWV1ZS5yZWxlYXNlKCk7CisgIGlmICghZW5xdWV1ZUJ1ZmZlcl8tPmFkZEV2ZW50KHBFdmVudCkpIHsKKyAgICBkZWxldGUgcEV2ZW50OworICAgIHJldHVybjsKKyAgfQorCisgIC8vIHNpZ25hbCBhbnlib2R5IHdobydzIHdhaXRpbmcgZm9yIHRoZSBidWZmZXIgdG8gYmUgbm9uLWVtcHR5CisgIG5vdEVtcHR5Xy5ub3RpZnkoKTsKKworICAvLyB0aGlzIHJlYWxseSBzaG91bGQgYmUgYSBsb29wIHdoZXJlIGl0IG1ha2VzIHN1cmUgaXQgZ290IGZsdXNoZWQKKyAgLy8gYmVjYXVzZSBjb25kaXRpb24gdmFyaWFibGVzIGNhbiBnZXQgdHJpZ2dlcmVkIGJ5IHRoZSBvcyBmb3Igbm8gcmVhc29uCisgIC8vIGl0IGlzIHByb2JhYmx5IGEgbm9uLWZhY3RvciBmb3IgdGhlIHRpbWUgYmVpbmcKK30KKworYm9vbCBURmlsZVRyYW5zcG9ydDo6c3dhcEV2ZW50QnVmZmVycyhzdHJ1Y3QgdGltZXZhbCogZGVhZGxpbmUpIHsKKyAgYm9vbCBzd2FwOworICBHdWFyZCBnKG11dGV4Xyk7CisKKyAgaWYgKCFlbnF1ZXVlQnVmZmVyXy0+aXNFbXB0eSgpKSB7CisgICAgc3dhcCA9IHRydWU7CisgIH0gZWxzZSBpZiAoY2xvc2luZ18pIHsKKyAgICAvLyBldmVuIHRob3VnaCB0aGVyZSBpcyBubyBkYXRhIHRvIHdyaXRlLAorICAgIC8vIHJldHVybiBpbW1lZGlhdGVseSBpZiB0aGUgdHJhbnNwb3J0IGlzIGNsb3NpbmcKKyAgICBzd2FwID0gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgaWYgKGRlYWRsaW5lICE9IE5VTEwpIHsKKyAgICAgIC8vIGlmIHdlIHdlcmUgaGFuZGVkIGEgZGVhZGxpbmUgdGltZSBzdHJ1Y3QsIGRvIGEgdGltZWQgd2FpdAorICAgICAgbm90RW1wdHlfLndhaXRGb3JUaW1lKGRlYWRsaW5lKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8ganVzdCB3YWl0IHVudGlsIHRoZSBidWZmZXIgZ2V0cyBhbiBpdGVtCisgICAgICBub3RFbXB0eV8ud2FpdCgpOworICAgIH0KKworICAgIC8vIGNvdWxkIGJlIGVtcHR5IGlmIHdlIHRpbWVkIG91dAorICAgIHN3YXAgPSBlbnF1ZXVlQnVmZmVyXy0+aXNFbXB0eSgpOworICB9CisKKyAgaWYgKHN3YXApIHsKKyAgICBURmlsZVRyYW5zcG9ydEJ1ZmZlciogdGVtcCA9IGVucXVldWVCdWZmZXJfOworICAgIGVucXVldWVCdWZmZXJfID0gZGVxdWV1ZUJ1ZmZlcl87CisgICAgZGVxdWV1ZUJ1ZmZlcl8gPSB0ZW1wOworICB9CisKKyAgaWYgKHN3YXApIHsKKyAgICBub3RGdWxsXy5ub3RpZnkoKTsKKyAgfQorCisgIHJldHVybiBzd2FwOworfQorCit2b2lkIFRGaWxlVHJhbnNwb3J0Ojp3cml0ZXJUaHJlYWQoKSB7CisgIGJvb2wgaGFzSU9FcnJvciA9IGZhbHNlOworCisgIC8vIG9wZW4gZmlsZSBpZiBpdCBpcyBub3Qgb3BlbgorICBpZiAoIWZkXykgeworICAgIHRyeSB7CisgICAgICBvcGVuTG9nRmlsZSgpOworICAgIH0gY2F0Y2ggKC4uLikgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogd3JpdGVyVGhyZWFkKCkgb3BlbkxvZ0ZpbGUoKSAiLCBlcnJub19jb3B5KTsKKyAgICAgIGZkXyA9IDA7CisgICAgICBoYXNJT0Vycm9yID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICAvLyBzZXQgdGhlIG9mZnNldCB0byB0aGUgY29ycmVjdCB2YWx1ZSAoRU9GKQorICBpZiAoIWhhc0lPRXJyb3IpIHsKKyAgICB0cnkgeworICAgICAgc2Vla1RvRW5kKCk7CisgICAgICAvLyB0aHJvdyBhd2F5IGFueSBwYXJ0aWFsIGV2ZW50cworICAgICAgb2Zmc2V0XyArPSByZWFkU3RhdGVfLmxhc3REaXNwYXRjaFB0cl87CisgICAgICBpZiAoMCA9PSBUSFJJRlRfRlRSVU5DQVRFKGZkXywgb2Zmc2V0XykpIHsKKyAgICAgICAgcmVhZFN0YXRlXy5yZXNldEFsbFZhbHVlcygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CisgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiB3cml0ZXJUaHJlYWQoKSB0cnVuY2F0ZSAiLCBlcnJub19jb3B5KTsKKyAgICAgICAgaGFzSU9FcnJvciA9IHRydWU7CisgICAgICB9CisgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9FUlJOTzsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiB3cml0ZXJUaHJlYWQoKSBpbml0aWFsaXphdGlvbiAiLCBlcnJub19jb3B5KTsKKyAgICAgIGhhc0lPRXJyb3IgPSB0cnVlOworICAgIH0KKyAgfQorCisgIC8vIEZpZ3VyZSBvdXQgdGhlIG5leHQgdGltZSBieSB3aGljaCBhIGZsdXNoIG11c3QgdGFrZSBwbGFjZQorICBzdHJ1Y3QgdGltZXZhbCB0c19uZXh0X2ZsdXNoOworICBnZXROZXh0Rmx1c2hUaW1lKCZ0c19uZXh0X2ZsdXNoKTsKKyAgdWludDMyX3QgdW5mbHVzaGVkID0gMDsKKworICB3aGlsZSAoMSkgeworICAgIC8vIHRoaXMgd2lsbCBvbmx5IGJlIHRydWUgd2hlbiB0aGUgZGVzdHJ1Y3RvciBpcyBiZWluZyBpbnZva2VkCisgICAgaWYgKGNsb3NpbmdfKSB7CisgICAgICBpZiAoaGFzSU9FcnJvcikgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIC8vIFRyeSB0byBlbXB0eSBidWZmZXJzIGJlZm9yZSBleGl0CisgICAgICBpZiAoZW5xdWV1ZUJ1ZmZlcl8tPmlzRW1wdHkoKSAmJiBkZXF1ZXVlQnVmZmVyXy0+aXNFbXB0eSgpKSB7CisgICAgICAgIDo6VEhSSUZUX0ZTWU5DKGZkXyk7CisgICAgICAgIGlmICgtMSA9PSA6OlRIUklGVF9DTE9TRShmZF8pKSB7CisgICAgICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CisgICAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlclRocmVhZCgpIDo6Y2xvc2UoKSAiLCBlcnJub19jb3B5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBmZCBzdWNjZXNzZnVsbHkgY2xvc2VkCisgICAgICAgICAgZmRfID0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHN3YXBFdmVudEJ1ZmZlcnMoJnRzX25leHRfZmx1c2gpKSB7CisgICAgICBldmVudEluZm8qIG91dEV2ZW50OworICAgICAgd2hpbGUgKE5VTEwgIT0gKG91dEV2ZW50ID0gZGVxdWV1ZUJ1ZmZlcl8tPmdldE5leHQoKSkpIHsKKyAgICAgICAgLy8gUmVtb3ZlIGFuIGV2ZW50IGZyb20gdGhlIGJ1ZmZlciBhbmQgd3JpdGUgaXQgb3V0IHRvIGRpc2suIElmIHRoZXJlIGlzIGFueSBJTyBlcnJvciwgZm9yCisgICAgICAgIC8vIGluc3RhbmNlLAorICAgICAgICAvLyB0aGUgb3V0cHV0IGZpbGUgaXMgdW5tb3VudGVkIG9yIGRlbGV0ZWQsIHRoZW4gdGhpcyBldmVudCBpcyBkcm9wcGVkLiBIb3dldmVyLCB0aGUgd3JpdGVyCisgICAgICAgIC8vIHRocmVhZAorICAgICAgICAvLyB3aWxsOiAoMSkgc2xlZXAgZm9yIGEgc2hvcnQgd2hpbGU7ICgyKSB0cnkgdG8gcmVvcGVuIHRoZSBmaWxlOyAoMykgaWYgc3VjY2Vzc2Z1bCB0aGVuCisgICAgICAgIC8vIHN0YXJ0IHdyaXRpbmcKKyAgICAgICAgLy8gZnJvbSB0aGUgZW5kLgorCisgICAgICAgIHdoaWxlIChoYXNJT0Vycm9yKSB7CisgICAgICAgICAgVF9FUlJPUigKKyAgICAgICAgICAgICAgIlRGaWxlVHJhbnNwb3J0OiB3cml0ZXIgdGhyZWFkIGdvaW5nIHRvIHNsZWVwIGZvciAldSBtaWNyb3NlY29uZHMgZHVlIHRvIElPIGVycm9ycyIsCisgICAgICAgICAgICAgIHdyaXRlclRocmVhZElPRXJyb3JTbGVlcFRpbWVfKTsKKyAgICAgICAgICBUSFJJRlRfU0xFRVBfVVNFQyh3cml0ZXJUaHJlYWRJT0Vycm9yU2xlZXBUaW1lXyk7CisgICAgICAgICAgaWYgKGNsb3NpbmdfKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICAgIGlmICghZmRfKSB7CisgICAgICAgICAgICA6OlRIUklGVF9DTE9TRShmZF8pOworICAgICAgICAgICAgZmRfID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9wZW5Mb2dGaWxlKCk7CisgICAgICAgICAgICBzZWVrVG9FbmQoKTsKKyAgICAgICAgICAgIHVuZmx1c2hlZCA9IDA7CisgICAgICAgICAgICBoYXNJT0Vycm9yID0gZmFsc2U7CisgICAgICAgICAgICBUX0xPR19PUEVSKAorICAgICAgICAgICAgICAgICJURmlsZVRyYW5zcG9ydDogbG9nIGZpbGUgJXMgcmVvcGVuZWQgYnkgd3JpdGVyIHRocmVhZCBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkiLAorICAgICAgICAgICAgICAgIGZpbGVuYW1lXy5jX3N0cigpKTsKKyAgICAgICAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgICAgICAgIFRfRVJST1IoIlRGaWxlVHJhbnNwb3J0OiB1bmFibGUgdG8gcmVvcGVuIGxvZyBmaWxlICVzIGR1cmluZyBlcnJvciByZWNvdmVyeSIsCisgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lXy5jX3N0cigpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBzYW5pdHkgY2hlY2sgb24gZXZlbnQKKyAgICAgICAgaWYgKChtYXhFdmVudFNpemVfID4gMCkgJiYgKG91dEV2ZW50LT5ldmVudFNpemVfID4gbWF4RXZlbnRTaXplXykpIHsKKyAgICAgICAgICBUX0VSUk9SKCJtc2cgc2l6ZSBpcyBncmVhdGVyIHRoYW4gbWF4IGV2ZW50IHNpemU6ICV1ID4gJXVcbiIsCisgICAgICAgICAgICAgICAgICBvdXRFdmVudC0+ZXZlbnRTaXplXywKKyAgICAgICAgICAgICAgICAgIG1heEV2ZW50U2l6ZV8pOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgY2h1bmtpbmcgaXMgcmVxdWlyZWQsIHRoZW4gbWFrZSBzdXJlIHRoYXQgbXNnIGRvZXMgbm90IGNyb3NzIGNodW5rIGJvdW5kYXJ5CisgICAgICAgIGlmICgob3V0RXZlbnQtPmV2ZW50U2l6ZV8gPiAwKSAmJiAoY2h1bmtTaXplXyAhPSAwKSkgeworICAgICAgICAgIC8vIGV2ZW50IHNpemUgbXVzdCBiZSBsZXNzIHRoYW4gY2h1bmsgc2l6ZQorICAgICAgICAgIGlmIChvdXRFdmVudC0+ZXZlbnRTaXplXyA+IGNodW5rU2l6ZV8pIHsKKyAgICAgICAgICAgIFRfRVJST1IoIlRGaWxlVHJhbnNwb3J0OiBldmVudCBzaXplKCV1KSA+IGNodW5rIHNpemUoJXUpOiBza2lwcGluZyBldmVudCIsCisgICAgICAgICAgICAgICAgICAgIG91dEV2ZW50LT5ldmVudFNpemVfLAorICAgICAgICAgICAgICAgICAgICBjaHVua1NpemVfKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGludDY0X3QgY2h1bmsxID0gb2Zmc2V0XyAvIGNodW5rU2l6ZV87CisgICAgICAgICAgaW50NjRfdCBjaHVuazIgPSAob2Zmc2V0XyArIG91dEV2ZW50LT5ldmVudFNpemVfIC0gMSkgLyBjaHVua1NpemVfOworCisgICAgICAgICAgLy8gaWYgYWRkaW5nIHRoaXMgZXZlbnQgd2lsbCBjcm9zcyBhIGNodW5rIGJvdW5kYXJ5LCBwYWQgdGhlIGNodW5rIHdpdGggemVyb3MKKyAgICAgICAgICBpZiAoY2h1bmsxICE9IGNodW5rMikgeworICAgICAgICAgICAgLy8gcmVmZXRjaCB0aGUgb2Zmc2V0IHRvIGtlZXAgaW4gc3luYworICAgICAgICAgICAgb2Zmc2V0XyA9IFRIUklGVF9MU0VFSyhmZF8sIDAsIFNFRUtfQ1VSKTsKKyAgICAgICAgICAgIGludDMyX3QgcGFkZGluZyA9IChpbnQzMl90KSgob2Zmc2V0XyAvIGNodW5rU2l6ZV8gKyAxKSAqIGNodW5rU2l6ZV8gLSBvZmZzZXRfKTsKKworICAgICAgICAgICAgdWludDhfdCogemVyb3MgPSBuZXcgdWludDhfdFtwYWRkaW5nXTsKKyAgICAgICAgICAgIG1lbXNldCh6ZXJvcywgJ1wwJywgcGFkZGluZyk7CisgICAgICAgICAgICBib29zdDo6c2NvcGVkX2FycmF5PHVpbnQ4X3Q+IGFycmF5KHplcm9zKTsKKyAgICAgICAgICAgIGlmICgtMSA9PSA6OndyaXRlKGZkXywgemVyb3MsIHBhZGRpbmcpKSB7CisgICAgICAgICAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0VSUk5POworICAgICAgICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogd3JpdGVyVGhyZWFkKCkgZXJyb3Igd2hpbGUgcGFkZGluZyB6ZXJvcyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgICAgICAgICAgICBoYXNJT0Vycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bmZsdXNoZWQgKz0gcGFkZGluZzsKKyAgICAgICAgICAgIG9mZnNldF8gKz0gcGFkZGluZzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB3cml0ZSB0aGUgZGVxdWV1ZWQgZXZlbnQgdG8gdGhlIGZpbGUKKyAgICAgICAgaWYgKG91dEV2ZW50LT5ldmVudFNpemVfID4gMCkgeworICAgICAgICAgIGlmICgtMSA9PSA6OlRIUklGVF9XUklURShmZF8sIG91dEV2ZW50LT5ldmVudEJ1ZmZfLCBvdXRFdmVudC0+ZXZlbnRTaXplXykpIHsKKyAgICAgICAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0VSUk5POworICAgICAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IGVycm9yIHdoaWxlIHdyaXRpbmcgZXZlbnQgIiwgZXJybm9fY29weSk7CisgICAgICAgICAgICBoYXNJT0Vycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICB1bmZsdXNoZWQgKz0gb3V0RXZlbnQtPmV2ZW50U2l6ZV87CisgICAgICAgICAgb2Zmc2V0XyArPSBvdXRFdmVudC0+ZXZlbnRTaXplXzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZGVxdWV1ZUJ1ZmZlcl8tPnJlc2V0KCk7CisgICAgfQorCisgICAgaWYgKGhhc0lPRXJyb3IpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIExvY2FsIHZhcmlhYmxlIHRvIGNhY2hlIHRoZSBzdGF0ZSBvZiBmb3JjZUZsdXNoXy4KKyAgICAvLworICAgIC8vIFdlIG9ubHkgd2FudCB0byBjaGVjayB0aGUgdmFsdWUgb2YgZm9yY2VGbHVzaF8gb25jZSBlYWNoIHRpbWUgYXJvdW5kIHRoZQorICAgIC8vIGxvb3AuICBJZiB3ZSBjaGVjayBpdCBtb3JlIHRoYW4gb25jZSB3aXRob3V0IGhvbGRpbmcgdGhlIGxvY2sgdGhlIGVudGlyZQorICAgIC8vIHRpbWUsIGl0IGNvdWxkIGhhdmUgY2hhbmdlZCBzdGF0ZSBpbiBiZXR3ZWVuLiAgVGhpcyB3aWxsIHJlc3VsdCBpbiB1cworICAgIC8vIG1ha2luZyBpbmNvbnNpc3RlbnQgZGVjaXNpb25zLgorICAgIGJvb2wgZm9yY2VkX2ZsdXNoID0gZmFsc2U7CisgICAgeworICAgICAgR3VhcmQgZyhtdXRleF8pOworICAgICAgaWYgKGZvcmNlRmx1c2hfKSB7CisgICAgICAgIGlmICghZW5xdWV1ZUJ1ZmZlcl8tPmlzRW1wdHkoKSkgeworICAgICAgICAgIC8vIElmIGZvcmNlRmx1c2hfIGlzIHRydWUsIHdlIG5lZWQgdG8gZmx1c2ggYWxsIGF2YWlsYWJsZSBkYXRhLgorICAgICAgICAgIC8vIElmIGVucXVldWVCdWZmZXJfIGlzIG5vdCBlbXB0eSwgZ28gYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIGxvb3AgdG8KKyAgICAgICAgICAvLyB3cml0ZSBpdCBvdXQuCisgICAgICAgICAgLy8KKyAgICAgICAgICAvLyBXZSBrbm93IHRoZSBtYWluIHRocmVhZCBpcyB3YWl0aW5nIG9uIGZvcmNlRmx1c2hfIHRvIGJlIGNsZWFyZWQsCisgICAgICAgICAgLy8gc28gbm8gbmV3IGV2ZW50cyB3aWxsIGJlIGFkZGVkIHRvIGVucXVldWVCdWZmZXJfIHVudGlsIHdlIGNsZWFyCisgICAgICAgICAgLy8gZm9yY2VGbHVzaF8uICBUaGVyZWZvcmUgdGhlIG5leHQgdGltZSBhcm91bmQgdGhlIGxvb3AgZW5xdWV1ZUJ1ZmZlcl8KKyAgICAgICAgICAvLyBpcyBndWFyYW50ZWVkIHRvIGJlIGVtcHR5LiAgKEkuZS4sIHdlJ3JlIGd1YXJhbnRlZWQgdG8gbWFrZSBwcm9ncmVzcworICAgICAgICAgIC8vIGFuZCBjbGVhciBmb3JjZUZsdXNoXyB0aGUgbmV4dCB0aW1lIGFyb3VuZCB0aGUgbG9vcC4pCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yY2VkX2ZsdXNoID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBkZXRlcm1pbmUgaWYgd2UgbmVlZCB0byBwZXJmb3JtIGFuIGZzeW5jCisgICAgYm9vbCBmbHVzaCA9IGZhbHNlOworICAgIGlmIChmb3JjZWRfZmx1c2ggfHwgdW5mbHVzaGVkID4gZmx1c2hNYXhCeXRlc18pIHsKKyAgICAgIGZsdXNoID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgc3RydWN0IHRpbWV2YWwgY3VycmVudF90aW1lOworICAgICAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmY3VycmVudF90aW1lLCBOVUxMKTsKKyAgICAgIGlmIChjdXJyZW50X3RpbWUudHZfc2VjID4gdHNfbmV4dF9mbHVzaC50dl9zZWMKKyAgICAgICAgICB8fCAoY3VycmVudF90aW1lLnR2X3NlYyA9PSB0c19uZXh0X2ZsdXNoLnR2X3NlYworICAgICAgICAgICAgICAmJiBjdXJyZW50X3RpbWUudHZfdXNlYyA+IHRzX25leHRfZmx1c2gudHZfdXNlYykpIHsKKyAgICAgICAgaWYgKHVuZmx1c2hlZCA+IDApIHsKKyAgICAgICAgICBmbHVzaCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gbmV3IGRhdGEgc2luY2UgdGhlIGxhc3QgZnN5bmMsCisgICAgICAgICAgLy8gZG9uJ3QgcGVyZm9ybSB0aGUgZnN5bmMsIGJ1dCBkbyByZXNldCB0aGUgdGltZXIuCisgICAgICAgICAgZ2V0TmV4dEZsdXNoVGltZSgmdHNfbmV4dF9mbHVzaCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmx1c2gpIHsKKyAgICAgIC8vIHN5bmMgKGZvcmNlIGZsdXNoKSBmaWxlIHRvIGRpc2sKKyAgICAgIFRIUklGVF9GU1lOQyhmZF8pOworICAgICAgdW5mbHVzaGVkID0gMDsKKyAgICAgIGdldE5leHRGbHVzaFRpbWUoJnRzX25leHRfZmx1c2gpOworCisgICAgICAvLyBub3RpZnkgYW55Ym9keSB3YWl0aW5nIGZvciBmbHVzaCBjb21wbGV0aW9uCisgICAgICBpZiAoZm9yY2VkX2ZsdXNoKSB7CisgICAgICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICAgICAgZm9yY2VGbHVzaF8gPSBmYWxzZTsKKyAgICAgICAgYXNzZXJ0KGVucXVldWVCdWZmZXJfLT5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnQoZGVxdWV1ZUJ1ZmZlcl8tPmlzRW1wdHkoKSk7CisgICAgICAgIGZsdXNoZWRfLm5vdGlmeUFsbCgpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIFRGaWxlVHJhbnNwb3J0OjpmbHVzaCgpIHsKKyAgLy8gZmlsZSBtdXN0IGJlIG9wZW4gZm9yIHdyaXRpbmcgZm9yIGFueSBmbHVzaGluZyB0byB0YWtlIHBsYWNlCisgIGlmICghd3JpdGVyVGhyZWFkXy5nZXQoKSkgeworICAgIHJldHVybjsKKyAgfQorICAvLyB3YWl0IGZvciBmbHVzaCB0byB0YWtlIHBsYWNlCisgIEd1YXJkIGcobXV0ZXhfKTsKKworICAvLyBJbmRpY2F0ZSB0aGF0IHdlIGFyZSByZXF1ZXN0aW5nIGEgZmx1c2gKKyAgZm9yY2VGbHVzaF8gPSB0cnVlOworICAvLyBXYWtlIHVwIHRoZSB3cml0ZXIgdGhyZWFkIHNvIGl0IHdpbGwgcGVyZm9ybSB0aGUgZmx1c2ggaW1tZWRpYXRlbHkKKyAgbm90RW1wdHlfLm5vdGlmeSgpOworCisgIHdoaWxlIChmb3JjZUZsdXNoXykgeworICAgIGZsdXNoZWRfLndhaXQoKTsKKyAgfQorfQorCit1aW50MzJfdCBURmlsZVRyYW5zcG9ydDo6cmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICB1aW50MzJfdCBoYXZlID0gMDsKKyAgdWludDMyX3QgZ2V0ID0gMDsKKworICB3aGlsZSAoaGF2ZSA8IGxlbikgeworICAgIGdldCA9IHJlYWQoYnVmICsgaGF2ZSwgbGVuIC0gaGF2ZSk7CisgICAgaWYgKGdldCA8PSAwKSB7CisgICAgICB0aHJvdyBURU9GRXhjZXB0aW9uKCk7CisgICAgfQorICAgIGhhdmUgKz0gZ2V0OworICB9CisKKyAgcmV0dXJuIGhhdmU7Cit9CisKK2Jvb2wgVEZpbGVUcmFuc3BvcnQ6OnBlZWsoKSB7CisgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGFuIGV2ZW50IHJlYWR5IHRvIGJlIHJlYWQKKyAgaWYgKCFjdXJyZW50RXZlbnRfKSB7CisgICAgY3VycmVudEV2ZW50XyA9IHJlYWRFdmVudCgpOworICB9CisKKyAgLy8gZGlkIG5vdCBtYW5hZ2UgdG8gcmVhZCBhbiBldmVudCBmcm9tIHRoZSBmaWxlLiBUaGlzIGNvdWxkIGhhdmUgaGFwcGVuZWQKKyAgLy8gaWYgdGhlIHRpbWVvdXQgZXhwaXJlZCBvciB0aGVyZSB3YXMgc29tZSBvdGhlciBlcnJvcgorICBpZiAoIWN1cnJlbnRFdmVudF8pIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byByZWFkCisgIHJldHVybiAoY3VycmVudEV2ZW50Xy0+ZXZlbnRTaXplXyAtIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZlBvc18pID4gMDsKK30KKwordWludDMyX3QgVEZpbGVUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgLy8gY2hlY2sgaWYgdGhlcmUgYW4gZXZlbnQgaXMgcmVhZHkgdG8gYmUgcmVhZAorICBpZiAoIWN1cnJlbnRFdmVudF8pIHsKKyAgICBjdXJyZW50RXZlbnRfID0gcmVhZEV2ZW50KCk7CisgIH0KKworICAvLyBkaWQgbm90IG1hbmFnZSB0byByZWFkIGFuIGV2ZW50IGZyb20gdGhlIGZpbGUuIFRoaXMgY291bGQgaGF2ZSBoYXBwZW5lZAorICAvLyBpZiB0aGUgdGltZW91dCBleHBpcmVkIG9yIHRoZXJlIHdhcyBzb21lIG90aGVyIGVycm9yCisgIGlmICghY3VycmVudEV2ZW50XykgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gcmVhZCBhcyBtdWNoIG9mIHRoZSBjdXJyZW50IGV2ZW50IGFzIHBvc3NpYmxlCisgIGludDMyX3QgcmVtYWluaW5nID0gY3VycmVudEV2ZW50Xy0+ZXZlbnRTaXplXyAtIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZlBvc187CisgIGlmIChyZW1haW5pbmcgPD0gKGludDMyX3QpbGVuKSB7CisgICAgLy8gY29weSBvdmVyIGFueXRoaW5nIHRoYXRzIHJlbWFpbmluZworICAgIGlmIChyZW1haW5pbmcgPiAwKSB7CisgICAgICBtZW1jcHkoYnVmLCBjdXJyZW50RXZlbnRfLT5ldmVudEJ1ZmZfICsgY3VycmVudEV2ZW50Xy0+ZXZlbnRCdWZmUG9zXywgcmVtYWluaW5nKTsKKyAgICB9CisgICAgZGVsZXRlIChjdXJyZW50RXZlbnRfKTsKKyAgICBjdXJyZW50RXZlbnRfID0gTlVMTDsKKyAgICByZXR1cm4gcmVtYWluaW5nOworICB9CisKKyAgLy8gcmVhZCBhcyBtdWNoIGFzIHBvc3NpYmxlCisgIG1lbWNweShidWYsIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZl8gKyBjdXJyZW50RXZlbnRfLT5ldmVudEJ1ZmZQb3NfLCBsZW4pOworICBjdXJyZW50RXZlbnRfLT5ldmVudEJ1ZmZQb3NfICs9IGxlbjsKKyAgcmV0dXJuIGxlbjsKK30KKworLy8gbm90ZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgcmV0dXJuZWQgZXZlbnRzCitldmVudEluZm8qIFRGaWxlVHJhbnNwb3J0OjpyZWFkRXZlbnQoKSB7CisgIGludCByZWFkVHJpZXMgPSAwOworCisgIGlmICghcmVhZEJ1ZmZfKSB7CisgICAgcmVhZEJ1ZmZfID0gbmV3IHVpbnQ4X3RbcmVhZEJ1ZmZTaXplX107CisgIH0KKworICB3aGlsZSAoMSkgeworICAgIC8vIHJlYWQgZnJvbSB0aGUgZmlsZSBpZiByZWFkIGJ1ZmZlciBpcyBleGhhdXN0ZWQKKyAgICBpZiAocmVhZFN0YXRlXy5idWZmZXJQdHJfID09IHJlYWRTdGF0ZV8uYnVmZmVyTGVuXykgeworICAgICAgLy8gYWR2YW5jZSB0aGUgb2Zmc2V0IHBvaW50ZXIKKyAgICAgIG9mZnNldF8gKz0gcmVhZFN0YXRlXy5idWZmZXJMZW5fOworICAgICAgcmVhZFN0YXRlXy5idWZmZXJMZW5fID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KDo6VEhSSUZUX1JFQUQoZmRfLCByZWFkQnVmZl8sIHJlYWRCdWZmU2l6ZV8pKTsKKyAgICAgIC8vICAgICAgIGlmIChyZWFkU3RhdGVfLmJ1ZmZlckxlbl8pIHsKKyAgICAgIC8vICAgICAgICAgVF9ERUJVR19MKDEsICJBbW91bnQgcmVhZDogJXUgKG9mZnNldDogJWx1KSIsIHJlYWRTdGF0ZV8uYnVmZmVyTGVuXywgb2Zmc2V0Xyk7CisgICAgICAvLyAgICAgICB9CisgICAgICByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gPSAwOworICAgICAgcmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQdHJfID0gMDsKKworICAgICAgLy8gcmVhZCBlcnJvcgorICAgICAgaWYgKHJlYWRTdGF0ZV8uYnVmZmVyTGVuXyA9PSAtMSkgeworICAgICAgICByZWFkU3RhdGVfLnJlc2V0QWxsVmFsdWVzKCk7CisgICAgICAgIEdsb2JhbE91dHB1dCgiVEZpbGVUcmFuc3BvcnQ6IGVycm9yIHdoaWxlIHJlYWRpbmcgZnJvbSBmaWxlIik7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIlRGaWxlVHJhbnNwb3J0OiBlcnJvciB3aGlsZSByZWFkaW5nIGZyb20gZmlsZSIpOworICAgICAgfSBlbHNlIGlmIChyZWFkU3RhdGVfLmJ1ZmZlckxlbl8gPT0gMCkgeyAvLyBFT0YKKyAgICAgICAgLy8gd2FpdCBpbmRlZmluaXRlbHkgaWYgdGhlcmUgaXMgbm8gdGltZW91dAorICAgICAgICBpZiAocmVhZFRpbWVvdXRfID09IFRBSUxfUkVBRF9USU1FT1VUKSB7CisgICAgICAgICAgVEhSSUZUX1NMRUVQX1VTRUMoZW9mU2xlZXBUaW1lXyk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZFRpbWVvdXRfID09IE5PX1RBSUxfUkVBRF9USU1FT1VUKSB7CisgICAgICAgICAgLy8gcmVzZXQgc3RhdGUKKyAgICAgICAgICByZWFkU3RhdGVfLnJlc2V0U3RhdGUoMCk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZFRpbWVvdXRfID4gMCkgeworICAgICAgICAgIC8vIHRpbWVvdXQgYWxyZWFkeSBleHBpcmVkIG9uY2UKKyAgICAgICAgICBpZiAocmVhZFRyaWVzID4gMCkgeworICAgICAgICAgICAgcmVhZFN0YXRlXy5yZXNldFN0YXRlKDApOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRIUklGVF9TTEVFUF9VU0VDKHJlYWRUaW1lb3V0XyAqIDEwMDApOworICAgICAgICAgICAgcmVhZFRyaWVzKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZWFkVHJpZXMgPSAwOworCisgICAgLy8gYXR0ZW1wdCB0byByZWFkIGFuIGV2ZW50IGZyb20gdGhlIGJ1ZmZlcgorICAgIHdoaWxlIChyZWFkU3RhdGVfLmJ1ZmZlclB0cl8gPCByZWFkU3RhdGVfLmJ1ZmZlckxlbl8pIHsKKyAgICAgIGlmIChyZWFkU3RhdGVfLnJlYWRpbmdTaXplXykgeworICAgICAgICBpZiAocmVhZFN0YXRlXy5ldmVudFNpemVCdWZmUG9zXyA9PSAwKSB7CisgICAgICAgICAgaWYgKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfKSAvIGNodW5rU2l6ZV8KKyAgICAgICAgICAgICAgIT0gKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfICsgMykgLyBjaHVua1NpemVfKSkgeworICAgICAgICAgICAgLy8gc2tpcCBvbmUgYnl0ZSB0b3dhcmRzIGNodW5rIGJvdW5kYXJ5CisgICAgICAgICAgICAvLyAgICAgICAgICAgIFRfREVCVUdfTCgxLCAiU2tpcHBpbmcgYSBieXRlIik7CisgICAgICAgICAgICByZWFkU3RhdGVfLmJ1ZmZlclB0cl8rKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRTaXplQnVmZl9bcmVhZFN0YXRlXy5ldmVudFNpemVCdWZmUG9zXysrXQorICAgICAgICAgICAgPSByZWFkQnVmZl9bcmVhZFN0YXRlXy5idWZmZXJQdHJfKytdOworCisgICAgICAgIGlmIChyZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZQb3NfID09IDQpIHsKKyAgICAgICAgICBpZiAocmVhZFN0YXRlXy5nZXRFdmVudFNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAvLyAwIGxlbmd0aCBldmVudCBpbmRpY2F0ZXMgcGFkZGluZworICAgICAgICAgICAgLy8gICAgICAgICAgICBUX0RFQlVHX0woMSwgIkdvdCBwYWRkaW5nIik7CisgICAgICAgICAgICByZWFkU3RhdGVfLnJlc2V0U3RhdGUocmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQdHJfKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBnb3QgYSB2YWxpZCBldmVudAorICAgICAgICAgIHJlYWRTdGF0ZV8ucmVhZGluZ1NpemVfID0gZmFsc2U7CisgICAgICAgICAgaWYgKHJlYWRTdGF0ZV8uZXZlbnRfKSB7CisgICAgICAgICAgICBkZWxldGUgKHJlYWRTdGF0ZV8uZXZlbnRfKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8gPSBuZXcgZXZlbnRJbmZvKCk7CisgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8gPSByZWFkU3RhdGVfLmdldEV2ZW50U2l6ZSgpOworCisgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGV2ZW50IGlzIGNvcnJ1cHRlZCBhbmQgcGVyZm9ybSByZWNvdmVyeSBpZiByZXF1aXJlZAorICAgICAgICAgIGlmIChpc0V2ZW50Q29ycnVwdGVkKCkpIHsKKyAgICAgICAgICAgIHBlcmZvcm1SZWNvdmVyeSgpOworICAgICAgICAgICAgLy8gc3RhcnQgZnJvbSB0aGUgdG9wCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZl8pIHsKKyAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmXyA9IG5ldyB1aW50OF90W3JlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfXTsKKyAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmUG9zXyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLy8gdGFrZSBlaXRoZXIgdGhlIGVudGlyZSBldmVudCBvciB0aGUgcmVtYWluaW5nIGJ5dGVzIGluIHRoZSBidWZmZXIKKyAgICAgICAgaW50IHJlY2xhaW1CdWZmZXIgPSAoc3RkOjptaW4pKCh1aW50MzJfdCkocmVhZFN0YXRlXy5idWZmZXJMZW5fIC0gcmVhZFN0YXRlXy5idWZmZXJQdHJfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfIC0gcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18pOworCisgICAgICAgIC8vIGNvcHkgZGF0YSBmcm9tIHJlYWQgYnVmZmVyIGludG8gZXZlbnQgYnVmZmVyCisgICAgICAgIG1lbWNweShyZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmXyArIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZQb3NfLAorICAgICAgICAgICAgICAgcmVhZEJ1ZmZfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfLAorICAgICAgICAgICAgICAgcmVjbGFpbUJ1ZmZlcik7CisKKyAgICAgICAgLy8gaW5jcmVtZW50IHBvc2l0aW9uIHB0cnMKKyAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18gKz0gcmVjbGFpbUJ1ZmZlcjsKKyAgICAgICAgcmVhZFN0YXRlXy5idWZmZXJQdHJfICs9IHJlY2xhaW1CdWZmZXI7CisKKyAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGV2ZW50IGhhcyBiZWVuIHJlYWQgaW4gZnVsbAorICAgICAgICBpZiAocmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18gPT0gcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8pIHsKKyAgICAgICAgICAvLyBzZXQgdGhlIGNvbXBsZXRlZCBldmVudCB0byB0aGUgY3VycmVudCBldmVudAorICAgICAgICAgIGV2ZW50SW5mbyogY29tcGxldGVFdmVudCA9IHJlYWRTdGF0ZV8uZXZlbnRfOworICAgICAgICAgIGNvbXBsZXRlRXZlbnQtPmV2ZW50QnVmZlBvc18gPSAwOworCisgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8gPSBOVUxMOworICAgICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRTdGF0ZShyZWFkU3RhdGVfLmJ1ZmZlclB0cl8pOworCisgICAgICAgICAgLy8gZXhpdCBjcml0ZXJpYQorICAgICAgICAgIHJldHVybiBjb21wbGV0ZUV2ZW50OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK2Jvb2wgVEZpbGVUcmFuc3BvcnQ6OmlzRXZlbnRDb3JydXB0ZWQoKSB7CisgIC8vIGFuIGVycm9yIGlzIHRyaWdnZXJlZCBpZjoKKyAgaWYgKChtYXhFdmVudFNpemVfID4gMCkgJiYgKHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfID4gbWF4RXZlbnRTaXplXykpIHsKKyAgICAvLyAxLiBFdmVudCBzaXplIGlzIGxhcmdlciB0aGFuIHVzZXItc3BlZmljaWVkIG1heC1ldmVudCBzaXplCisgICAgVF9FUlJPUigiUmVhZCBjb3JydXB0IGV2ZW50LiBFdmVudCBzaXplKCV1KSBncmVhdGVyIHRoYW4gbWF4IGV2ZW50IHNpemUgKCV1KSIsCisgICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXywKKyAgICAgICAgICAgIG1heEV2ZW50U2l6ZV8pOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfID4gY2h1bmtTaXplXykgeworICAgIC8vIDIuIEV2ZW50IHNpemUgaXMgbGFyZ2VyIHRoYW4gY2h1bmsgc2l6ZQorICAgIFRfRVJST1IoIlJlYWQgY29ycnVwdCBldmVudC4gRXZlbnQgc2l6ZSgldSkgZ3JlYXRlciB0aGFuIGNodW5rIHNpemUgKCV1KSIsCisgICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXywKKyAgICAgICAgICAgIGNodW5rU2l6ZV8pOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKCgob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyAtIDQpIC8gY2h1bmtTaXplXykKKyAgICAgICAgICAgICAhPSAoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gKyByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXyAtIDEpCisgICAgICAgICAgICAgICAgIC8gY2h1bmtTaXplXykpIHsKKyAgICAvLyAzLiBzaXplIGluZGljYXRlcyB0aGF0IGV2ZW50IGNyb3NzZXMgY2h1bmsgYm91bmRhcnkKKyAgICBUX0VSUk9SKCJSZWFkIGNvcnJ1cHQgZXZlbnQuIEV2ZW50IGNyb3NzZXMgY2h1bmsgYm91bmRhcnkuIEV2ZW50IHNpemU6JXUgIE9mZnNldDolbHUiLAorICAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8sCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfICsgNCkpOworCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgVEZpbGVUcmFuc3BvcnQ6OnBlcmZvcm1SZWNvdmVyeSgpIHsKKyAgLy8gcGVyZm9ybSBzb21lIGtpY2thc3MgcmVjb3ZlcnkKKyAgdWludDMyX3QgY3VyQ2h1bmsgPSBnZXRDdXJDaHVuaygpOworICBpZiAobGFzdEJhZENodW5rXyA9PSBjdXJDaHVuaykgeworICAgIG51bUNvcnJ1cHRlZEV2ZW50c0luQ2h1bmtfKys7CisgIH0gZWxzZSB7CisgICAgbGFzdEJhZENodW5rXyA9IGN1ckNodW5rOworICAgIG51bUNvcnJ1cHRlZEV2ZW50c0luQ2h1bmtfID0gMTsKKyAgfQorCisgIGlmIChudW1Db3JydXB0ZWRFdmVudHNJbkNodW5rXyA8IG1heENvcnJ1cHRlZEV2ZW50c18pIHsKKyAgICAvLyBtYXliZSB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gcmVhZGluZyB0aGUgZmlsZSBmcm9tIGRpc2sKKyAgICAvLyBzZWVrIHRvIHRoZSBiZWdpbm5pbmcgb2YgY2h1bmsgYW5kIHRyeSBhZ2FpbgorICAgIHNlZWtUb0NodW5rKGN1ckNodW5rKTsKKyAgfSBlbHNlIHsKKworICAgIC8vIGp1c3Qgc2tpcCBhaGVhZCB0byB0aGUgbmV4dCBjaHVuayBpZiB3ZSBub3QgYWxyZWFkeSBhdCB0aGUgbGFzdCBjaHVuaworICAgIGlmIChjdXJDaHVuayAhPSAoZ2V0TnVtQ2h1bmtzKCkgLSAxKSkgeworICAgICAgc2Vla1RvQ2h1bmsoY3VyQ2h1bmsgKyAxKTsKKyAgICB9IGVsc2UgaWYgKHJlYWRUaW1lb3V0XyA9PSBUQUlMX1JFQURfVElNRU9VVCkgeworICAgICAgLy8gaWYgdGFpbGluZyB0aGUgZmlsZSwgd2FpdCB1bnRpbCB0aGVyZSBpcyBlbm91Z2ggZGF0YSB0byBzdGFydAorICAgICAgLy8gdGhlIG5leHQgY2h1bmsKKyAgICAgIHdoaWxlIChjdXJDaHVuayA9PSAoZ2V0TnVtQ2h1bmtzKCkgLSAxKSkgeworICAgICAgICBUSFJJRlRfU0xFRVBfVVNFQyhjb3JydXB0ZWRFdmVudFNsZWVwVGltZV8pOworICAgICAgfQorICAgICAgc2Vla1RvQ2h1bmsoY3VyQ2h1bmsgKyAxKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gcHJldHR5IGhvc2VkIGF0IHRoaXMgc3RhZ2UsIHJld2luZCB0aGUgZmlsZSBiYWNrIHRvIHRoZSBsYXN0IHN1Y2Nlc3NmdWwKKyAgICAgIC8vIHBvaW50IGFuZCBwdW50IG9uIHRoZSBlcnJvcgorICAgICAgcmVhZFN0YXRlXy5yZXNldFN0YXRlKHJlYWRTdGF0ZV8ubGFzdERpc3BhdGNoUHRyXyk7CisgICAgICBjdXJyZW50RXZlbnRfID0gTlVMTDsKKyAgICAgIGNoYXIgZXJyb3JNc2dbMTAyNF07CisgICAgICBzcHJpbnRmKGVycm9yTXNnLAorICAgICAgICAgICAgICAiVEZpbGVUcmFuc3BvcnQ6IGxvZyBmaWxlIGNvcnJ1cHRlZCBhdCBvZmZzZXQ6ICVsdSIsCisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KG9mZnNldF8gKyByZWFkU3RhdGVfLmxhc3REaXNwYXRjaFB0cl8pKTsKKworICAgICAgR2xvYmFsT3V0cHV0KGVycm9yTXNnKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oZXJyb3JNc2cpOworICAgIH0KKyAgfQorfQorCit2b2lkIFRGaWxlVHJhbnNwb3J0OjpzZWVrVG9DaHVuayhpbnQzMl90IGNodW5rKSB7CisgIGlmIChmZF8gPD0gMCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIkZpbGUgbm90IG9wZW4iKTsKKyAgfQorCisgIGludDMyX3QgbnVtQ2h1bmtzID0gZ2V0TnVtQ2h1bmtzKCk7CisKKyAgLy8gZmlsZSBpcyBlbXB0eSwgc2Vla2luZyB0byBjaHVuayBpcyBwb2ludGxlc3MKKyAgaWYgKG51bUNodW5rcyA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gbmVnYXRpdmUgaW5kaWNhdGVzIHJldmVyc2Ugc2VlayAoZnJvbSB0aGUgZW5kKQorICBpZiAoY2h1bmsgPCAwKSB7CisgICAgY2h1bmsgKz0gbnVtQ2h1bmtzOworICB9CisKKyAgLy8gdG9vIGxhcmdlIGEgdmFsdWUgZm9yIHJldmVyc2Ugc2VlaywganVzdCBzZWVrIHRvIGJlZ2lubmluZworICBpZiAoY2h1bmsgPCAwKSB7CisgICAgVF9ERUJVRygiJXMiLCAiSW5jb3JyZWN0IHZhbHVlIGZvciByZXZlcnNlIHNlZWsuIFNlZWtpbmcgdG8gYmVnaW5uaW5nLi4uIik7CisgICAgY2h1bmsgPSAwOworICB9CisKKyAgLy8gY2Fubm90IHNlZWsgcGFzdCBFT0YKKyAgYm9vbCBzZWVrVG9FbmQgPSBmYWxzZTsKKyAgb2ZmX3QgbWluRW5kT2Zmc2V0ID0gMDsKKyAgaWYgKGNodW5rID49IG51bUNodW5rcykgeworICAgIFRfREVCVUcoIiVzIiwgIlRyeWluZyB0byBzZWVrIHBhc3QgRU9GLiBTZWVraW5nIHRvIEVPRiBpbnN0ZWFkLi4uIik7CisgICAgc2Vla1RvRW5kID0gdHJ1ZTsKKyAgICBjaHVuayA9IG51bUNodW5rcyAtIDE7CisgICAgLy8gdGhpcyBpcyB0aGUgbWluIG9mZnNldCB0byBwcm9jZXNzIGV2ZW50cyB0aWxsCisgICAgbWluRW5kT2Zmc2V0ID0gOjpUSFJJRlRfTFNFRUsoZmRfLCAwLCBTRUVLX0VORCk7CisgIH0KKworICBvZmZfdCBuZXdPZmZzZXQgPSBvZmZfdChjaHVuaykgKiBjaHVua1NpemVfOworICBvZmZzZXRfID0gOjpUSFJJRlRfTFNFRUsoZmRfLCBuZXdPZmZzZXQsIFNFRUtfU0VUKTsKKyAgcmVhZFN0YXRlXy5yZXNldEFsbFZhbHVlcygpOworICBjdXJyZW50RXZlbnRfID0gTlVMTDsKKyAgaWYgKG9mZnNldF8gPT0gLTEpIHsKKyAgICBHbG9iYWxPdXRwdXQoIlRGaWxlVHJhbnNwb3J0OiBsc2VlayBlcnJvciBpbiBzZWVrVG9DaHVuayIpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIlRGaWxlVHJhbnNwb3J0OiBsc2VlayBlcnJvciBpbiBzZWVrVG9DaHVuayIpOworICB9CisKKyAgLy8gc2VlayB0byBFT0YgaWYgdXNlciB3YW50ZWQgdG8gZ28gdG8gbGFzdCBjaHVuaworICBpZiAoc2Vla1RvRW5kKSB7CisgICAgdWludDMyX3Qgb2xkUmVhZFRpbWVvdXQgPSBnZXRSZWFkVGltZW91dCgpOworICAgIHNldFJlYWRUaW1lb3V0KE5PX1RBSUxfUkVBRF9USU1FT1VUKTsKKyAgICAvLyBrZWVwIG9uIHJlYWRpbmcgdW50aSB0aGUgbGFzdCBldmVudCBhdCBwb2ludCBvZiBzZWVrQ2h1bmsgY2FsbAorICAgIHNoYXJlZF9wdHI8ZXZlbnRJbmZvPiBldmVudDsKKyAgICB3aGlsZSAoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8pIDwgbWluRW5kT2Zmc2V0KSB7CisgICAgICBldmVudC5yZXNldChyZWFkRXZlbnQoKSk7CisgICAgICBpZiAoZXZlbnQuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgc2V0UmVhZFRpbWVvdXQob2xkUmVhZFRpbWVvdXQpOworICB9Cit9CisKK3ZvaWQgVEZpbGVUcmFuc3BvcnQ6OnNlZWtUb0VuZCgpIHsKKyAgc2Vla1RvQ2h1bmsoZ2V0TnVtQ2h1bmtzKCkpOworfQorCit1aW50MzJfdCBURmlsZVRyYW5zcG9ydDo6Z2V0TnVtQ2h1bmtzKCkgeworICBpZiAoZmRfIDw9IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHN0cnVjdCBUSFJJRlRfU1RBVCBmX2luZm87CisgIGludCBydiA9IDo6VEhSSUZUX0ZTVEFUKGZkXywgJmZfaW5mbyk7CisKKyAgaWYgKHJ2IDwgMCkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0VSUk5POworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJURmlsZVRyYW5zcG9ydDo6Z2V0TnVtQ2h1bmtzKCkgKGZzdGF0KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIGlmIChmX2luZm8uc3Rfc2l6ZSA+IDApIHsKKyAgICBzaXplX3QgbnVtQ2h1bmtzID0gKChmX2luZm8uc3Rfc2l6ZSkgLyBjaHVua1NpemVfKSArIDE7CisgICAgaWYgKG51bUNodW5rcyA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiVG9vIG1hbnkgY2h1bmtzIik7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihudW1DaHVua3MpOworICB9CisKKyAgLy8gZW1wdHkgZmlsZSBoYXMgbm8gY2h1bmtzCisgIHJldHVybiAwOworfQorCit1aW50MzJfdCBURmlsZVRyYW5zcG9ydDo6Z2V0Q3VyQ2h1bmsoKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4ob2Zmc2V0XyAvIGNodW5rU2l6ZV8pOworfQorCisvLyBVdGlsaXR5IEZ1bmN0aW9ucwordm9pZCBURmlsZVRyYW5zcG9ydDo6b3BlbkxvZ0ZpbGUoKSB7CisjaWZuZGVmIF9XSU4zMgorICBtb2RlX3QgbW9kZSA9IHJlYWRPbmx5XyA/IFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCA6IFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEg7CisgIGludCBmbGFncyA9IHJlYWRPbmx5XyA/IE9fUkRPTkxZIDogT19SRFdSIHwgT19DUkVBVCB8IE9fQVBQRU5EOworI2Vsc2UKKyAgaW50IG1vZGUgPSByZWFkT25seV8gPyBfU19JUkVBRCA6IF9TX0lSRUFEIHwgX1NfSVdSSVRFOworICBpbnQgZmxhZ3MgPSByZWFkT25seV8gPyBfT19SRE9OTFkgOiBfT19SRFdSIHwgX09fQ1JFQVQgfCBfT19BUFBFTkQ7CisjZW5kaWYKKyAgZmRfID0gOjpUSFJJRlRfT1BFTihmaWxlbmFtZV8uY19zdHIoKSwgZmxhZ3MsIG1vZGUpOworICBvZmZzZXRfID0gMDsKKworICAvLyBtYWtlIHN1cmUgb3BlbiBjYWxsIHdhcyBzdWNjZXNzZnVsCisgIGlmIChmZF8gPT0gLTEpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9FUlJOTzsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogb3BlbkxvZ0ZpbGUoKSA6Om9wZW4oKSBmaWxlOiAiICsgZmlsZW5hbWVfLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCBmaWxlbmFtZV8sIGVycm5vX2NvcHkpOworICB9Cit9CisKK3ZvaWQgVEZpbGVUcmFuc3BvcnQ6OmdldE5leHRGbHVzaFRpbWUoc3RydWN0IHRpbWV2YWwqIHRzX25leHRfZmx1c2gpIHsKKyAgVEhSSUZUX0dFVFRJTUVPRkRBWSh0c19uZXh0X2ZsdXNoLCBOVUxMKTsKKworICB0c19uZXh0X2ZsdXNoLT50dl91c2VjICs9IGZsdXNoTWF4VXNfOworICBpZiAodHNfbmV4dF9mbHVzaC0+dHZfdXNlYyA+IDEwMDAwMDApIHsKKyAgICBsb25nIGV4dHJhX3NlY3MgPSB0c19uZXh0X2ZsdXNoLT50dl91c2VjIC8gMTAwMDAwMDsKKyAgICB0c19uZXh0X2ZsdXNoLT50dl91c2VjICU9IDEwMDAwMDA7CisgICAgdHNfbmV4dF9mbHVzaC0+dHZfc2VjICs9IGV4dHJhX3NlY3M7CisgIH0KK30KKworVEZpbGVUcmFuc3BvcnRCdWZmZXI6OlRGaWxlVHJhbnNwb3J0QnVmZmVyKHVpbnQzMl90IHNpemUpCisgIDogYnVmZmVyTW9kZV8oV1JJVEUpLCB3cml0ZVBvaW50XygwKSwgcmVhZFBvaW50XygwKSwgc2l6ZV8oc2l6ZSkgeworICBidWZmZXJfID0gbmV3IGV2ZW50SW5mbyogW3NpemVdOworfQorCitURmlsZVRyYW5zcG9ydEJ1ZmZlcjo6flRGaWxlVHJhbnNwb3J0QnVmZmVyKCkgeworICBpZiAoYnVmZmVyXykgeworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB3cml0ZVBvaW50XzsgaSsrKSB7CisgICAgICBkZWxldGUgYnVmZmVyX1tpXTsKKyAgICB9CisgICAgZGVsZXRlW10gYnVmZmVyXzsKKyAgICBidWZmZXJfID0gTlVMTDsKKyAgfQorfQorCitib29sIFRGaWxlVHJhbnNwb3J0QnVmZmVyOjphZGRFdmVudChldmVudEluZm8qIGV2ZW50KSB7CisgIGlmIChidWZmZXJNb2RlXyA9PSBSRUFEKSB7CisgICAgR2xvYmFsT3V0cHV0KCJUcnlpbmcgdG8gd3JpdGUgdG8gYSBidWZmZXIgaW4gcmVhZCBtb2RlIik7CisgIH0KKyAgaWYgKHdyaXRlUG9pbnRfIDwgc2l6ZV8pIHsKKyAgICBidWZmZXJfW3dyaXRlUG9pbnRfKytdID0gZXZlbnQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgLy8gYnVmZmVyIGlzIGZ1bGwKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworZXZlbnRJbmZvKiBURmlsZVRyYW5zcG9ydEJ1ZmZlcjo6Z2V0TmV4dCgpIHsKKyAgaWYgKGJ1ZmZlck1vZGVfID09IFdSSVRFKSB7CisgICAgYnVmZmVyTW9kZV8gPSBSRUFEOworICB9CisgIGlmIChyZWFkUG9pbnRfIDwgd3JpdGVQb2ludF8pIHsKKyAgICByZXR1cm4gYnVmZmVyX1tyZWFkUG9pbnRfKytdOworICB9IGVsc2UgeworICAgIC8vIG5vIG1vcmUgZW50cmllcworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3ZvaWQgVEZpbGVUcmFuc3BvcnRCdWZmZXI6OnJlc2V0KCkgeworICBpZiAoYnVmZmVyTW9kZV8gPT0gV1JJVEUgfHwgd3JpdGVQb2ludF8gPiByZWFkUG9pbnRfKSB7CisgICAgVF9ERUJVRygiJXMiLCAiUmVzZXR0aW5nIGEgYnVmZmVyIHdpdGggdW5yZWFkIGVudHJpZXMiKTsKKyAgfQorICAvLyBDbGVhbiB1cCB0aGUgb2xkIGVudHJpZXMKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdyaXRlUG9pbnRfOyBpKyspIHsKKyAgICBkZWxldGUgYnVmZmVyX1tpXTsKKyAgfQorICBidWZmZXJNb2RlXyA9IFdSSVRFOworICB3cml0ZVBvaW50XyA9IDA7CisgIHJlYWRQb2ludF8gPSAwOworfQorCitib29sIFRGaWxlVHJhbnNwb3J0QnVmZmVyOjppc0Z1bGwoKSB7CisgIHJldHVybiB3cml0ZVBvaW50XyA9PSBzaXplXzsKK30KKworYm9vbCBURmlsZVRyYW5zcG9ydEJ1ZmZlcjo6aXNFbXB0eSgpIHsKKyAgcmV0dXJuIHdyaXRlUG9pbnRfID09IDA7Cit9CisKK1RGaWxlUHJvY2Vzc29yOjpURmlsZVByb2Nlc3NvcihzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCkKKyAgOiBwcm9jZXNzb3JfKHByb2Nlc3NvciksCisgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCisgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAorICAgIGlucHV0VHJhbnNwb3J0XyhpbnB1dFRyYW5zcG9ydCkgeworCisgIC8vIGRlZmF1bHQgdGhlIG91dHB1dCB0cmFuc3BvcnQgdG8gYSBudWxsIHRyYW5zcG9ydCAoY29tbW9uIGNhc2UpCisgIG91dHB1dFRyYW5zcG9ydF8gPSBzaGFyZWRfcHRyPFROdWxsVHJhbnNwb3J0PihuZXcgVE51bGxUcmFuc3BvcnQoKSk7Cit9CisKK1RGaWxlUHJvY2Vzc29yOjpURmlsZVByb2Nlc3NvcihzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0KQorICA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKKyAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8oaW5wdXRQcm90b2NvbEZhY3RvcnkpLAorICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ob3V0cHV0UHJvdG9jb2xGYWN0b3J5KSwKKyAgICBpbnB1dFRyYW5zcG9ydF8oaW5wdXRUcmFuc3BvcnQpIHsKKworICAvLyBkZWZhdWx0IHRoZSBvdXRwdXQgdHJhbnNwb3J0IHRvIGEgbnVsbCB0cmFuc3BvcnQgKGNvbW1vbiBjYXNlKQorICBvdXRwdXRUcmFuc3BvcnRfID0gc2hhcmVkX3B0cjxUTnVsbFRyYW5zcG9ydD4obmV3IFROdWxsVHJhbnNwb3J0KCkpOworfQorCitURmlsZVByb2Nlc3Nvcjo6VEZpbGVQcm9jZXNzb3Ioc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnQpCisgIDogcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAorICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAorICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKKyAgICBpbnB1dFRyYW5zcG9ydF8oaW5wdXRUcmFuc3BvcnQpLAorICAgIG91dHB1dFRyYW5zcG9ydF8ob3V0cHV0VHJhbnNwb3J0KSB7Cit9CisKK3ZvaWQgVEZpbGVQcm9jZXNzb3I6OnByb2Nlc3ModWludDMyX3QgbnVtRXZlbnRzLCBib29sIHRhaWwpIHsKKyAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0Xyk7CisgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydF8pOworCisgIC8vIHNldCB0aGUgcmVhZCB0aW1lb3V0IHRvIDAgaWYgdGFpbGluZyBpcyByZXF1aXJlZAorICBpbnQzMl90IG9sZFJlYWRUaW1lb3V0ID0gaW5wdXRUcmFuc3BvcnRfLT5nZXRSZWFkVGltZW91dCgpOworICBpZiAodGFpbCkgeworICAgIC8vIHNhdmUgb2xkIHJlYWQgdGltZW91dCBzbyBpdCBjYW4gYmUgcmVzdG9yZWQKKyAgICBpbnB1dFRyYW5zcG9ydF8tPnNldFJlYWRUaW1lb3V0KFRGaWxlVHJhbnNwb3J0OjpUQUlMX1JFQURfVElNRU9VVCk7CisgIH0KKworICB1aW50MzJfdCBudW1Qcm9jZXNzZWQgPSAwOworICB3aGlsZSAoMSkgeworICAgIC8vIGJhZCBmb3JtIHRvIHVzZSBleGNlcHRpb25zIGZvciBmbG93IGNvbnRyb2wgYnV0IHRoZXJlIGlzIHJlYWxseQorICAgIC8vIG5vIG90aGVyIHdheSBhcm91bmQgaXQKKyAgICB0cnkgeworICAgICAgcHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgTlVMTCk7CisgICAgICBudW1Qcm9jZXNzZWQrKzsKKyAgICAgIGlmICgobnVtRXZlbnRzID4gMCkgJiYgKG51bVByb2Nlc3NlZCA9PSBudW1FdmVudHMpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChURU9GRXhjZXB0aW9uJikgeworICAgICAgaWYgKCF0YWlsKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIHRlKSB7CisgICAgICBjZXJyIDw8IHRlLndoYXQoKSA8PCBlbmRsOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gcmVzdG9yZSBvbGQgcmVhZCB0aW1lb3V0CisgIGlmICh0YWlsKSB7CisgICAgaW5wdXRUcmFuc3BvcnRfLT5zZXRSZWFkVGltZW91dChvbGRSZWFkVGltZW91dCk7CisgIH0KK30KKwordm9pZCBURmlsZVByb2Nlc3Nvcjo6cHJvY2Vzc0NodW5rKCkgeworICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnRfKTsKKyAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0Xyk7CisKKyAgdWludDMyX3QgY3VyQ2h1bmsgPSBpbnB1dFRyYW5zcG9ydF8tPmdldEN1ckNodW5rKCk7CisKKyAgd2hpbGUgKDEpIHsKKyAgICAvLyBiYWQgZm9ybSB0byB1c2UgZXhjZXB0aW9ucyBmb3IgZmxvdyBjb250cm9sIGJ1dCB0aGVyZSBpcyByZWFsbHkKKyAgICAvLyBubyBvdGhlciB3YXkgYXJvdW5kIGl0CisgICAgdHJ5IHsKKyAgICAgIHByb2Nlc3Nvcl8tPnByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsIE5VTEwpOworICAgICAgaWYgKGN1ckNodW5rICE9IGlucHV0VHJhbnNwb3J0Xy0+Z2V0Q3VyQ2h1bmsoKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChURU9GRXhjZXB0aW9uJikgeworICAgICAgYnJlYWs7CisgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgdGUpIHsKKyAgICAgIGNlcnIgPDwgdGUud2hhdCgpIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYzdiZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmgKQEAgLTAsMCArMSw0MzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9URklMRVRSQU5TUE9SVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9URklMRVRSQU5TUE9SVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RQcm9jZXNzb3IuaD4KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXg7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3I7CisKKy8vIERhdGEgcGVydGFpbmluZyB0byBhIHNpbmdsZSBldmVudAordHlwZWRlZiBzdHJ1Y3QgZXZlbnRJbmZvIHsKKyAgdWludDhfdCogZXZlbnRCdWZmXzsKKyAgdWludDMyX3QgZXZlbnRTaXplXzsKKyAgdWludDMyX3QgZXZlbnRCdWZmUG9zXzsKKworICBldmVudEluZm8oKSA6IGV2ZW50QnVmZl8oTlVMTCksIGV2ZW50U2l6ZV8oMCksIGV2ZW50QnVmZlBvc18oMCl7fTsKKyAgfmV2ZW50SW5mbygpIHsKKyAgICBpZiAoZXZlbnRCdWZmXykgeworICAgICAgZGVsZXRlW10gZXZlbnRCdWZmXzsKKyAgICB9CisgIH0KK30gZXZlbnRJbmZvOworCisvLyBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50IHJlYWQgc3RhdGUKK3R5cGVkZWYgc3RydWN0IHJlYWRTdGF0ZSB7CisgIGV2ZW50SW5mbyogZXZlbnRfOworCisgIC8vIGtlZXAgdHJhY2sgb2YgZXZlbnQgc2l6ZQorICB1aW50OF90IGV2ZW50U2l6ZUJ1ZmZfWzRdOworICB1aW50OF90IGV2ZW50U2l6ZUJ1ZmZQb3NfOworICBib29sIHJlYWRpbmdTaXplXzsKKworICAvLyByZWFkIGJ1ZmZlciB2YXJpYWJsZXMKKyAgaW50MzJfdCBidWZmZXJQdHJfOworICBpbnQzMl90IGJ1ZmZlckxlbl87CisKKyAgLy8gbGFzdCBzdWNjZXNzZnVsIGRpc3BhdGNoIHBvaW50CisgIGludDMyX3QgbGFzdERpc3BhdGNoUHRyXzsKKworICB2b2lkIHJlc2V0U3RhdGUodWludDMyX3QgbGFzdERpc3BhdGNoUHRyKSB7CisgICAgcmVhZGluZ1NpemVfID0gdHJ1ZTsKKyAgICBldmVudFNpemVCdWZmUG9zXyA9IDA7CisgICAgbGFzdERpc3BhdGNoUHRyXyA9IGxhc3REaXNwYXRjaFB0cjsKKyAgfQorCisgIHZvaWQgcmVzZXRBbGxWYWx1ZXMoKSB7CisgICAgcmVzZXRTdGF0ZSgwKTsKKyAgICBidWZmZXJQdHJfID0gMDsKKyAgICBidWZmZXJMZW5fID0gMDsKKyAgICBpZiAoZXZlbnRfKSB7CisgICAgICBkZWxldGUgKGV2ZW50Xyk7CisgICAgfQorICAgIGV2ZW50XyA9IDA7CisgIH0KKworICBpbmxpbmUgdWludDMyX3QgZ2V0RXZlbnRTaXplKCkgeworICAgIGNvbnN0IHZvaWQqIGJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KGV2ZW50U2l6ZUJ1ZmZfKTsKKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPihidWZmZXIpOworICB9CisKKyAgcmVhZFN0YXRlKCkgeworICAgIGV2ZW50XyA9IDA7CisgICAgcmVzZXRBbGxWYWx1ZXMoKTsKKyAgfQorCisgIH5yZWFkU3RhdGUoKSB7CisgICAgaWYgKGV2ZW50XykgeworICAgICAgZGVsZXRlIChldmVudF8pOworICAgIH0KKyAgfQorCit9IHJlYWRTdGF0ZTsKKworLyoqCisgKiBURmlsZVRyYW5zcG9ydEJ1ZmZlciAtIGJ1ZmZlciBjbGFzcyB1c2VkIGJ5IFRGaWxlVHJhbnNwb3J0IGZvciBxdWV1ZWluZyB1cCBldmVudHMKKyAqIHRvIGJlIHdyaXR0ZW4gdG8gZGlzay4gIFNob3VsZCBiZSB1c2VkIGluIHRoZSBmb2xsb3dpbmcgd2F5OgorICogIDEpIEJ1ZmZlciBjcmVhdGVkCisgKiAgMikgQnVmZmVyIHdyaXR0ZW4gdG8gKGFkZEV2ZW50KQorICogIDMpIEJ1ZmZlciByZWFkIGZyb20gKGdldE5leHQpCisgKiAgNCkgQnVmZmVyIHJlc2V0IChyZXNldCkKKyAqICA1KSBHbyBiYWNrIHRvIDIsIG9yIGRlc3Ryb3kgYnVmZmVyCisgKgorICogVGhlIGJ1ZmZlciBzaG91bGQgbmV2ZXIgYmUgd3JpdHRlbiB0byBhZnRlciBpdCBpcyByZWFkIGZyb20sIHVubGVzcyBpdCBpcyByZXNldCBmaXJzdC4KKyAqIE5vdGU6IFRoZSBhYm92ZSBydWxlcyBhcmUgZW5mb3JjZWQgbWFpbmx5IGZvciBkZWJ1Z2dpbmcgaXRzIHNvbGUgY2xpZW50IFRGaWxlVHJhbnNwb3J0CisgKiAgICAgICB3aGljaCB1c2VzIHRoZSBidWZmZXIgaW4gdGhpcyB3YXkuCisgKgorICovCitjbGFzcyBURmlsZVRyYW5zcG9ydEJ1ZmZlciB7CitwdWJsaWM6CisgIFRGaWxlVHJhbnNwb3J0QnVmZmVyKHVpbnQzMl90IHNpemUpOworICB+VEZpbGVUcmFuc3BvcnRCdWZmZXIoKTsKKworICBib29sIGFkZEV2ZW50KGV2ZW50SW5mbyogZXZlbnQpOworICBldmVudEluZm8qIGdldE5leHQoKTsKKyAgdm9pZCByZXNldCgpOworICBib29sIGlzRnVsbCgpOworICBib29sIGlzRW1wdHkoKTsKKworcHJpdmF0ZToKKyAgVEZpbGVUcmFuc3BvcnRCdWZmZXIoKTsgLy8gc2hvdWxkIG5vdCBiZSB1c2VkCisKKyAgZW51bSBtb2RlIHsgV1JJVEUsIFJFQUQgfTsKKyAgbW9kZSBidWZmZXJNb2RlXzsKKworICB1aW50MzJfdCB3cml0ZVBvaW50XzsKKyAgdWludDMyX3QgcmVhZFBvaW50XzsKKyAgdWludDMyX3Qgc2l6ZV87CisgIGV2ZW50SW5mbyoqIGJ1ZmZlcl87Cit9OworCisvKioKKyAqIEFic3RyYWN0IGludGVyZmFjZSBmb3IgdHJhbnNwb3J0cyB1c2VkIHRvIHJlYWQgZmlsZXMKKyAqLworY2xhc3MgVEZpbGVSZWFkZXJUcmFuc3BvcnQgOiB2aXJ0dWFsIHB1YmxpYyBUVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgdmlydHVhbCBpbnQzMl90IGdldFJlYWRUaW1lb3V0KCkgPSAwOworICB2aXJ0dWFsIHZvaWQgc2V0UmVhZFRpbWVvdXQoaW50MzJfdCByZWFkVGltZW91dCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgZ2V0TnVtQ2h1bmtzKCkgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldEN1ckNodW5rKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgc2Vla1RvQ2h1bmsoaW50MzJfdCBjaHVuaykgPSAwOworICB2aXJ0dWFsIHZvaWQgc2Vla1RvRW5kKCkgPSAwOworfTsKKworLyoqCisgKiBBYnN0cmFjdCBpbnRlcmZhY2UgZm9yIHRyYW5zcG9ydHMgdXNlZCB0byB3cml0ZSBmaWxlcworICovCitjbGFzcyBURmlsZVdyaXRlclRyYW5zcG9ydCA6IHZpcnR1YWwgcHVibGljIFRUcmFuc3BvcnQgeworcHVibGljOgorICB2aXJ0dWFsIHVpbnQzMl90IGdldENodW5rU2l6ZSgpID0gMDsKKyAgdmlydHVhbCB2b2lkIHNldENodW5rU2l6ZSh1aW50MzJfdCBjaHVua1NpemUpID0gMDsKK307CisKKy8qKgorICogRmlsZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHRyYW5zcG9ydC4gUmVhZHMgYW5kIHdyaXRlcyBhcmUgZG9uZSB0byBhCisgKiBmaWxlIG9uIGRpc2suCisgKgorICovCitjbGFzcyBURmlsZVRyYW5zcG9ydCA6IHB1YmxpYyBURmlsZVJlYWRlclRyYW5zcG9ydCwgcHVibGljIFRGaWxlV3JpdGVyVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgVEZpbGVUcmFuc3BvcnQoc3RkOjpzdHJpbmcgcGF0aCwgYm9vbCByZWFkT25seSA9IGZhbHNlKTsKKyAgflRGaWxlVHJhbnNwb3J0KCk7CisKKyAgLy8gVE9ETzogd2hhdCBpcyB0aGUgY29ycmVjdCBiZWhhdmlvdXIgZm9yIHRoaXM/CisgIC8vIHRoZSBsb2cgZmlsZSBpcyBnZW5lcmFsbHkgYWx3YXlzIG9wZW4KKyAgYm9vbCBpc09wZW4oKSB7IHJldHVybiB0cnVlOyB9CisKKyAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHZvaWQgZmx1c2goKTsKKworICB1aW50MzJfdCByZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIGJvb2wgcGVlaygpOworCisgIC8vIGxvZy1maWxlIHNwZWNpZmljIGZ1bmN0aW9ucworICB2b2lkIHNlZWtUb0NodW5rKGludDMyX3QgY2h1bmspOworICB2b2lkIHNlZWtUb0VuZCgpOworICB1aW50MzJfdCBnZXROdW1DaHVua3MoKTsKKyAgdWludDMyX3QgZ2V0Q3VyQ2h1bmsoKTsKKworICAvLyBmb3IgY2hhbmdpbmcgdGhlIG91dHB1dCBmaWxlCisgIHZvaWQgcmVzZXRPdXRwdXRGaWxlKGludCBmZCwgc3RkOjpzdHJpbmcgZmlsZW5hbWUsIG9mZl90IG9mZnNldCk7CisKKyAgLy8gU2V0dGVyL0dldHRlciBmdW5jdGlvbnMgZm9yIHVzZXItY29udHJvbGxhYmxlIG9wdGlvbnMKKyAgdm9pZCBzZXRSZWFkQnVmZlNpemUodWludDMyX3QgcmVhZEJ1ZmZTaXplKSB7CisgICAgaWYgKHJlYWRCdWZmU2l6ZSkgeworICAgICAgcmVhZEJ1ZmZTaXplXyA9IHJlYWRCdWZmU2l6ZTsKKyAgICB9CisgIH0KKyAgdWludDMyX3QgZ2V0UmVhZEJ1ZmZTaXplKCkgeyByZXR1cm4gcmVhZEJ1ZmZTaXplXzsgfQorCisgIHN0YXRpYyBjb25zdCBpbnQzMl90IFRBSUxfUkVBRF9USU1FT1VUID0gLTE7CisgIHN0YXRpYyBjb25zdCBpbnQzMl90IE5PX1RBSUxfUkVBRF9USU1FT1VUID0gMDsKKyAgdm9pZCBzZXRSZWFkVGltZW91dChpbnQzMl90IHJlYWRUaW1lb3V0KSB7IHJlYWRUaW1lb3V0XyA9IHJlYWRUaW1lb3V0OyB9CisgIGludDMyX3QgZ2V0UmVhZFRpbWVvdXQoKSB7IHJldHVybiByZWFkVGltZW91dF87IH0KKworICB2b2lkIHNldENodW5rU2l6ZSh1aW50MzJfdCBjaHVua1NpemUpIHsKKyAgICBpZiAoY2h1bmtTaXplKSB7CisgICAgICBjaHVua1NpemVfID0gY2h1bmtTaXplOworICAgIH0KKyAgfQorICB1aW50MzJfdCBnZXRDaHVua1NpemUoKSB7IHJldHVybiBjaHVua1NpemVfOyB9CisKKyAgdm9pZCBzZXRFdmVudEJ1ZmZlclNpemUodWludDMyX3QgYnVmZmVyU2l6ZSkgeworICAgIGlmIChidWZmZXJBbmRUaHJlYWRJbml0aWFsaXplZF8pIHsKKyAgICAgIEdsb2JhbE91dHB1dCgiQ2Fubm90IGNoYW5nZSB0aGUgYnVmZmVyIHNpemUgYWZ0ZXIgd3JpdGVyIHRocmVhZCBzdGFydGVkIik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGV2ZW50QnVmZmVyU2l6ZV8gPSBidWZmZXJTaXplOworICB9CisKKyAgdWludDMyX3QgZ2V0RXZlbnRCdWZmZXJTaXplKCkgeyByZXR1cm4gZXZlbnRCdWZmZXJTaXplXzsgfQorCisgIHZvaWQgc2V0Rmx1c2hNYXhVcyh1aW50MzJfdCBmbHVzaE1heFVzKSB7CisgICAgaWYgKGZsdXNoTWF4VXMpIHsKKyAgICAgIGZsdXNoTWF4VXNfID0gZmx1c2hNYXhVczsKKyAgICB9CisgIH0KKyAgdWludDMyX3QgZ2V0Rmx1c2hNYXhVcygpIHsgcmV0dXJuIGZsdXNoTWF4VXNfOyB9CisKKyAgdm9pZCBzZXRGbHVzaE1heEJ5dGVzKHVpbnQzMl90IGZsdXNoTWF4Qnl0ZXMpIHsKKyAgICBpZiAoZmx1c2hNYXhCeXRlcykgeworICAgICAgZmx1c2hNYXhCeXRlc18gPSBmbHVzaE1heEJ5dGVzOworICAgIH0KKyAgfQorICB1aW50MzJfdCBnZXRGbHVzaE1heEJ5dGVzKCkgeyByZXR1cm4gZmx1c2hNYXhCeXRlc187IH0KKworICB2b2lkIHNldE1heEV2ZW50U2l6ZSh1aW50MzJfdCBtYXhFdmVudFNpemUpIHsgbWF4RXZlbnRTaXplXyA9IG1heEV2ZW50U2l6ZTsgfQorICB1aW50MzJfdCBnZXRNYXhFdmVudFNpemUoKSB7IHJldHVybiBtYXhFdmVudFNpemVfOyB9CisKKyAgdm9pZCBzZXRNYXhDb3JydXB0ZWRFdmVudHModWludDMyX3QgbWF4Q29ycnVwdGVkRXZlbnRzKSB7CisgICAgbWF4Q29ycnVwdGVkRXZlbnRzXyA9IG1heENvcnJ1cHRlZEV2ZW50czsKKyAgfQorICB1aW50MzJfdCBnZXRNYXhDb3JydXB0ZWRFdmVudHMoKSB7IHJldHVybiBtYXhDb3JydXB0ZWRFdmVudHNfOyB9CisKKyAgdm9pZCBzZXRFb2ZTbGVlcFRpbWVVcyh1aW50MzJfdCBlb2ZTbGVlcFRpbWUpIHsKKyAgICBpZiAoZW9mU2xlZXBUaW1lKSB7CisgICAgICBlb2ZTbGVlcFRpbWVfID0gZW9mU2xlZXBUaW1lOworICAgIH0KKyAgfQorICB1aW50MzJfdCBnZXRFb2ZTbGVlcFRpbWVVcygpIHsgcmV0dXJuIGVvZlNsZWVwVGltZV87IH0KKworICAvKgorICAgKiBPdmVycmlkZSBUVHJhbnNwb3J0ICpfdmlydCgpIGZ1bmN0aW9ucyB0byBpbnZva2Ugb3VyIGltcGxlbWVudGF0aW9ucy4KKyAgICogV2UgY2Fubm90IHVzZSBUVmlydHVhbFRyYW5zcG9ydCB0byBwcm92aWRlIHRoZXNlLCBzaW5jZSB3ZSBuZWVkIHRvIGluaGVyaXQKKyAgICogdmlydHVhbGx5IGZyb20gVFRyYW5zcG9ydC4KKyAgICovCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHJldHVybiB0aGlzLT5yZWFkKGJ1ZiwgbGVuKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRBbGxfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gdGhpcy0+cmVhZEFsbChidWYsIGxlbik7IH0KKyAgdmlydHVhbCB2b2lkIHdyaXRlX3ZpcnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgdGhpcy0+d3JpdGUoYnVmLCBsZW4pOyB9CisKK3ByaXZhdGU6CisgIC8vIGhlbHBlciBmdW5jdGlvbnMgZm9yIHdyaXRpbmcgdG8gYSBmaWxlCisgIHZvaWQgZW5xdWV1ZUV2ZW50KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgZXZlbnRMZW4pOworICBib29sIHN3YXBFdmVudEJ1ZmZlcnMoc3RydWN0IHRpbWV2YWwqIGRlYWRsaW5lKTsKKyAgYm9vbCBpbml0QnVmZmVyQW5kV3JpdGVUaHJlYWQoKTsKKworICAvLyBjb250cm9sIGZvciB3cml0ZXIgdGhyZWFkCisgIHN0YXRpYyB2b2lkKiBzdGFydFdyaXRlclRocmVhZCh2b2lkKiBwdHIpIHsKKyAgICBzdGF0aWNfY2FzdDxURmlsZVRyYW5zcG9ydCo+KHB0ciktPndyaXRlclRocmVhZCgpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHZvaWQgd3JpdGVyVGhyZWFkKCk7CisKKyAgLy8gaGVscGVyIGZ1bmN0aW9ucyBmb3IgcmVhZGluZyBmcm9tIGEgZmlsZQorICBldmVudEluZm8qIHJlYWRFdmVudCgpOworCisgIC8vIGV2ZW50IGNvcnJ1cHRpb24tcmVsYXRlZCBmdW5jdGlvbnMKKyAgYm9vbCBpc0V2ZW50Q29ycnVwdGVkKCk7CisgIHZvaWQgcGVyZm9ybVJlY292ZXJ5KCk7CisKKyAgLy8gVXRpbGl0eSBmdW5jdGlvbnMKKyAgdm9pZCBvcGVuTG9nRmlsZSgpOworICB2b2lkIGdldE5leHRGbHVzaFRpbWUoc3RydWN0IHRpbWV2YWwqIHRzX25leHRfZmx1c2gpOworCisgIC8vIENsYXNzIHZhcmlhYmxlcworICByZWFkU3RhdGUgcmVhZFN0YXRlXzsKKyAgdWludDhfdCogcmVhZEJ1ZmZfOworICBldmVudEluZm8qIGN1cnJlbnRFdmVudF87CisKKyAgdWludDMyX3QgcmVhZEJ1ZmZTaXplXzsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfUkVBRF9CVUZGX1NJWkUgPSAxICogMTAyNCAqIDEwMjQ7CisKKyAgaW50MzJfdCByZWFkVGltZW91dF87CisgIHN0YXRpYyBjb25zdCBpbnQzMl90IERFRkFVTFRfUkVBRF9USU1FT1VUX01TID0gMjAwOworCisgIC8vIHNpemUgb2YgY2h1bmtzIHRoYXQgZmlsZSB3aWxsIGJlIHNwbGl0IHVwIGludG8KKyAgdWludDMyX3QgY2h1bmtTaXplXzsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfQ0hVTktfU0laRSA9IDE2ICogMTAyNCAqIDEwMjQ7CisKKyAgLy8gc2l6ZSBvZiBldmVudCBidWZmZXJzCisgIHVpbnQzMl90IGV2ZW50QnVmZmVyU2l6ZV87CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX0VWRU5UX0JVRkZFUl9TSVpFID0gMTAwMDA7CisKKyAgLy8gbWF4IG51bWJlciBvZiBtaWNyb3NlY29uZHMgdGhhdCBjYW4gcGFzcyB3aXRob3V0IGZsdXNoaW5nCisgIHVpbnQzMl90IGZsdXNoTWF4VXNfOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9GTFVTSF9NQVhfVVMgPSAzMDAwMDAwOworCisgIC8vIG1heCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgd3JpdHRlbiB3aXRob3V0IGZsdXNoaW5nCisgIHVpbnQzMl90IGZsdXNoTWF4Qnl0ZXNfOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9GTFVTSF9NQVhfQllURVMgPSAxMDAwICogMTAyNDsKKworICAvLyBtYXggZXZlbnQgc2l6ZQorICB1aW50MzJfdCBtYXhFdmVudFNpemVfOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9NQVhfRVZFTlRfU0laRSA9IDA7CisKKyAgLy8gbWF4IG51bWJlciBvZiBjb3JydXB0ZWQgZXZlbnRzIHBlciBjaHVuaworICB1aW50MzJfdCBtYXhDb3JydXB0ZWRFdmVudHNfOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9NQVhfQ09SUlVQVEVEX0VWRU5UUyA9IDA7CisKKyAgLy8gc2xlZXAgZHVyYXRpb24gd2hlbiBFT0YgaXMgaGl0CisgIHVpbnQzMl90IGVvZlNsZWVwVGltZV87CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX0VPRl9TTEVFUF9USU1FX1VTID0gNTAwICogMTAwMDsKKworICAvLyBzbGVlcCBkdXJhdGlvbiB3aGVuIGEgY29ycnVwdGVkIGV2ZW50IGlzIGVuY291bnRlcmVkCisgIHVpbnQzMl90IGNvcnJ1cHRlZEV2ZW50U2xlZXBUaW1lXzsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfQ09SUlVQVEVEX1NMRUVQX1RJTUVfVVMgPSAxICogMTAwMCAqIDEwMDA7CisKKyAgLy8gc2xlZXAgZHVyYXRpb24gaW4gc2Vjb25kcyB3aGVuIGFuIElPIGVycm9yIGlzIGVuY291bnRlcmVkIGluIHRoZSB3cml0ZXIgdGhyZWFkCisgIHVpbnQzMl90IHdyaXRlclRocmVhZElPRXJyb3JTbGVlcFRpbWVfOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9XUklURVJfVEhSRUFEX1NMRUVQX1RJTUVfVVMgPSA2MCAqIDEwMDAgKiAxMDAwOworCisgIC8vIHdyaXRlciB0aHJlYWQKKyAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gd3JpdGVyVGhyZWFkXzsKKworICAvLyBidWZmZXJzIHRvIGhvbGQgZGF0YSBiZWZvcmUgaXQgaXMgZmx1c2hlZC4gRWFjaCBlbGVtZW50IG9mIHRoZSBidWZmZXIgc3RvcmVzIGEgbXNnIHRoYXQKKyAgLy8gbmVlZHMgdG8gYmUgd3JpdHRlbiB0byB0aGUgZmlsZS4gIFRoZSBidWZmZXJzIGFyZSBzd2FwcGVkIGJ5IHRoZSB3cml0ZXIgdGhyZWFkLgorICBURmlsZVRyYW5zcG9ydEJ1ZmZlciogZGVxdWV1ZUJ1ZmZlcl87CisgIFRGaWxlVHJhbnNwb3J0QnVmZmVyKiBlbnF1ZXVlQnVmZmVyXzsKKworICAvLyBjb25kaXRpb25zIHVzZWQgdG8gYmxvY2sgd2hlbiB0aGUgYnVmZmVyIGlzIGZ1bGwgb3IgZW1wdHkKKyAgTW9uaXRvciBub3RGdWxsXywgbm90RW1wdHlfOworICBzdGQ6OmF0b21pYzxib29sPiBjbG9zaW5nXzsKKworICAvLyBUbyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgdGhlIGJ1ZmZlciBoYXMgYmVlbiBmbHVzaGVkCisgIE1vbml0b3IgZmx1c2hlZF87CisgIHN0ZDo6YXRvbWljPGJvb2w+IGZvcmNlRmx1c2hfOworCisgIC8vIE11dGV4IHRoYXQgaXMgZ3JhYmJlZCB3aGVuIGVucXVldWVpbmcgYW5kIHN3YXBwaW5nIHRoZSByZWFkL3dyaXRlIGJ1ZmZlcnMKKyAgTXV0ZXggbXV0ZXhfOworCisgIC8vIEZpbGUgaW5mb3JtYXRpb24KKyAgc3RkOjpzdHJpbmcgZmlsZW5hbWVfOworICBpbnQgZmRfOworCisgIC8vIFdoZXRoZXIgdGhlIHdyaXRlciB0aHJlYWQgYW5kIGJ1ZmZlcnMgaGF2ZSBiZWVuIGluaXRpYWxpemVkCisgIGJvb2wgYnVmZmVyQW5kVGhyZWFkSW5pdGlhbGl6ZWRfOworCisgIC8vIE9mZnNldCB3aXRoaW4gdGhlIGZpbGUKKyAgb2ZmX3Qgb2Zmc2V0XzsKKworICAvLyBldmVudCBjb3JydXB0aW9uIGluZm9ybWF0aW9uCisgIHVpbnQzMl90IGxhc3RCYWRDaHVua187CisgIHVpbnQzMl90IG51bUNvcnJ1cHRlZEV2ZW50c0luQ2h1bmtfOworCisgIGJvb2wgcmVhZE9ubHlfOworfTsKKworLy8gRXhjZXB0aW9uIHRocm93biB3aGVuIEVPRiBpcyBoaXQKK2NsYXNzIFRFT0ZFeGNlcHRpb24gOiBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIFRFT0ZFeGNlcHRpb24oKSA6IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpe307Cit9OworCisvLyB3cmFwcGVyIGNsYXNzIHRvIHByb2Nlc3MgZXZlbnRzIGZyb20gYSBmaWxlIGNvbnRhaW5pbmcgdGhyaWZ0IGV2ZW50cworY2xhc3MgVEZpbGVQcm9jZXNzb3IgeworcHVibGljOgorICAvKioKKyAgICogQ29uc3RydWN0b3IgdGhhdCBkZWZhdWx0cyBvdXRwdXQgdHJhbnNwb3J0IHRvIG51bGwgdHJhbnNwb3J0CisgICAqCisgICAqIEBwYXJhbSBwcm9jZXNzb3IgcHJvY2Vzc2VzIGxvZy1maWxlIGV2ZW50cworICAgKiBAcGFyYW0gcHJvdG9jb2xGYWN0b3J5IHByb3RvY29sIGZhY3RvcnkKKyAgICogQHBhcmFtIGlucHV0VHJhbnNwb3J0IGZpbGUgdHJhbnNwb3J0CisgICAqLworICBURmlsZVByb2Nlc3NvcihzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0KTsKKworICBURmlsZVByb2Nlc3NvcihzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RvcgorICAgKgorICAgKiBAcGFyYW0gcHJvY2Vzc29yIHByb2Nlc3NlcyBsb2ctZmlsZSBldmVudHMKKyAgICogQHBhcmFtIHByb3RvY29sRmFjdG9yeSBwcm90b2NvbCBmYWN0b3J5CisgICAqIEBwYXJhbSBpbnB1dFRyYW5zcG9ydCBpbnB1dCBmaWxlIHRyYW5zcG9ydAorICAgKiBAcGFyYW0gb3V0cHV0IG91dHB1dCB0cmFuc3BvcnQKKyAgICovCisgIFRGaWxlUHJvY2Vzc29yKHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnQpOworCisgIC8qKgorICAgKiBwcm9jZXNzZXMgZXZlbnRzIGZyb20gdGhlIGZpbGUKKyAgICoKKyAgICogQHBhcmFtIG51bUV2ZW50cyBudW1iZXIgb2YgZXZlbnRzIHRvIHByb2Nlc3MgKDAgZm9yIHVubGltaXRlZCkKKyAgICogQHBhcmFtIHRhaWwgdGFpbHMgdGhlIGZpbGUgaWYgdHJ1ZQorICAgKi8KKyAgdm9pZCBwcm9jZXNzKHVpbnQzMl90IG51bUV2ZW50cywgYm9vbCB0YWlsKTsKKworICAvKioKKyAgICogcHJvY2VzcyBldmVudHMgdW50aWwgdGhlIGVuZCBvZiB0aGUgY2h1bmsKKyAgICoKKyAgICovCisgIHZvaWQgcHJvY2Vzc0NodW5rKCk7CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnRfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gX1RIUklGVF9UUkFOU1BPUlRfVEZJTEVUUkFOU1BPUlRfSF8KKwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUwODRlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5jcHAKQEAgLTAsMCArMSw2MTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVHlwZXMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaD4KKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx6bGliLmg+CisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOworCit1aW50MzJfdCBUSGVhZGVyVHJhbnNwb3J0OjpyZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBpZiAoY2xpZW50VHlwZSA9PSBUSFJJRlRfVU5GUkFNRURfQklOQVJZIHx8IGNsaWVudFR5cGUgPT0gVEhSSUZUX1VORlJBTUVEX0NPTVBBQ1QpIHsKKyAgICByZXR1cm4gdHJhbnNwb3J0Xy0+cmVhZChidWYsIGxlbik7CisgIH0KKworICByZXR1cm4gVEZyYW1lZFRyYW5zcG9ydDo6cmVhZFNsb3coYnVmLCBsZW4pOworfQorCit1aW50MTZfdCBUSGVhZGVyVHJhbnNwb3J0OjpnZXRQcm90b2NvbElkKCkgY29uc3QgeworICBpZiAoY2xpZW50VHlwZSA9PSBUSFJJRlRfSEVBREVSX0NMSUVOVF9UWVBFKSB7CisgICAgcmV0dXJuIHByb3RvSWQ7CisgIH0gZWxzZSBpZiAoY2xpZW50VHlwZSA9PSBUSFJJRlRfVU5GUkFNRURfQ09NUEFDVCB8fCBjbGllbnRUeXBlID09IFRIUklGVF9GUkFNRURfQ09NUEFDVCkgeworICAgIHJldHVybiBUX0NPTVBBQ1RfUFJPVE9DT0w7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFRfQklOQVJZX1BST1RPQ09MOyAvLyBBc3N1bWUgb3RoZXIgdHJhbnNwb3J0cyB1c2UgVEJpbmFyeQorICB9Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6ZW5zdXJlUmVhZEJ1ZmZlcih1aW50MzJfdCBzeikgeworICBpZiAoc3ogPiByQnVmU2l6ZV8pIHsKKyAgICByQnVmXy5yZXNldChuZXcgdWludDhfdFtzel0pOworICAgIHJCdWZTaXplXyA9IHN6OworICB9Cit9CisKK2Jvb2wgVEhlYWRlclRyYW5zcG9ydDo6cmVhZEZyYW1lKCkgeworICAvLyBzek4gaXMgbmV0d29yayBieXRlIG9yZGVyIG9mIHN6CisgIHVpbnQzMl90IHN6TjsKKyAgdWludDMyX3Qgc3o7CisKKyAgLy8gUmVhZCB0aGUgc2l6ZSBvZiB0aGUgbmV4dCBmcmFtZS4KKyAgLy8gV2UgY2FuJ3QgdXNlIHJlYWRBbGwoJnN6LCBzaXplb2Yoc3opKSwgc2luY2UgdGhhdCBhbHdheXMgdGhyb3dzIGFuCisgIC8vIGV4Y2VwdGlvbiBvbiBFT0YuICBXZSB3YW50IHRvIHRocm93IGFuIGV4Y2VwdGlvbiBvbmx5IGlmIEVPRiBvY2N1cnMgYWZ0ZXIKKyAgLy8gcGFydGlhbCBzaXplIGRhdGEuCisgIHVpbnQzMl90IHNpemVCeXRlc1JlYWQgPSAwOworICB3aGlsZSAoc2l6ZUJ5dGVzUmVhZCA8IHNpemVvZihzek4pKSB7CisgICAgdWludDhfdCogc3pwID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnN6TikgKyBzaXplQnl0ZXNSZWFkOworICAgIHVpbnQzMl90IGJ5dGVzUmVhZCA9IHRyYW5zcG9ydF8tPnJlYWQoc3pwLCBzaXplb2Yoc3pOKSAtIHNpemVCeXRlc1JlYWQpOworICAgIGlmIChieXRlc1JlYWQgPT0gMCkgeworICAgICAgaWYgKHNpemVCeXRlc1JlYWQgPT0gMCkgeworICAgICAgICAvLyBFT0YgYmVmb3JlIGFueSBkYXRhIHdhcyByZWFkLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBFT0YgYWZ0ZXIgYSBwYXJ0aWFsIGZyYW1lIGhlYWRlci4gIFJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gbW9yZSBkYXRhIHRvIHJlYWQgYWZ0ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJ0aWFsIGZyYW1lIGhlYWRlci4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgc2l6ZUJ5dGVzUmVhZCArPSBieXRlc1JlYWQ7CisgIH0KKworICBzeiA9IG50b2hsKHN6Tik7CisKKyAgZW5zdXJlUmVhZEJ1ZmZlcig0KTsKKworICBpZiAoKHN6ICYgVEJpbmFyeVByb3RvY29sOjpWRVJTSU9OX01BU0spID09ICh1aW50MzJfdClUQmluYXJ5UHJvdG9jb2w6OlZFUlNJT05fMSkgeworICAgIC8vIHVuZnJhbWVkCisgICAgY2xpZW50VHlwZSA9IFRIUklGVF9VTkZSQU1FRF9CSU5BUlk7CisgICAgbWVtY3B5KHJCdWZfLmdldCgpLCAmc3pOLCBzaXplb2Yoc3pOKSk7CisgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgNCk7CisgIH0gZWxzZSBpZiAoc3RhdGljX2Nhc3Q8aW50OF90PihzeiA+PiAyNCkgPT0gVENvbXBhY3RQcm90b2NvbDo6UFJPVE9DT0xfSUQKKyAgICAgICAgICAgICAmJiAoc3RhdGljX2Nhc3Q8aW50OF90PihzeiA+PiAxNikgJiBUQ29tcGFjdFByb3RvY29sOjpWRVJTSU9OX01BU0spCisgICAgICAgICAgICAgICAgICAgID09IFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT05fTikgeworICAgIGNsaWVudFR5cGUgPSBUSFJJRlRfVU5GUkFNRURfQ09NUEFDVDsKKyAgICBtZW1jcHkockJ1Zl8uZ2V0KCksICZzek4sIHNpemVvZihzek4pKTsKKyAgICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCA0KTsKKyAgfSBlbHNlIHsKKyAgICAvLyBDb3VsZCBiZSBoZWFkZXIgZm9ybWF0IG9yIGZyYW1lZC4gQ2hlY2sgbmV4dCB1aW50MzIKKyAgICB1aW50MzJfdCBtYWdpY19uOworICAgIHVpbnQzMl90IG1hZ2ljOworCisgICAgaWYgKHN6ID4gTUFYX0ZSQU1FX1NJWkUpIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWFkZXIgdHJhbnNwb3J0IGZyYW1lIGlzIHRvbyBsYXJnZSIpOworICAgIH0KKworICAgIGVuc3VyZVJlYWRCdWZmZXIoc3opOworCisgICAgLy8gV2UgY2FuIHVzZSByZWFkQWxsIGhlcmUsIGJlY2F1c2UgaXQgd291bGQgYmUgYW4gaW52YWxpZCBmcmFtZSBvdGhlcndpc2UKKyAgICB0cmFuc3BvcnRfLT5yZWFkQWxsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZtYWdpY19uKSwgc2l6ZW9mKG1hZ2ljX24pKTsKKyAgICBtZW1jcHkockJ1Zl8uZ2V0KCksICZtYWdpY19uLCBzaXplb2YobWFnaWNfbikpOworICAgIG1hZ2ljID0gbnRvaGwobWFnaWNfbik7CisKKyAgICBpZiAoKG1hZ2ljICYgVEJpbmFyeVByb3RvY29sOjpWRVJTSU9OX01BU0spID09ICh1aW50MzJfdClUQmluYXJ5UHJvdG9jb2w6OlZFUlNJT05fMSkgeworICAgICAgLy8gZnJhbWVkCisgICAgICBjbGllbnRUeXBlID0gVEhSSUZUX0ZSQU1FRF9CSU5BUlk7CisgICAgICB0cmFuc3BvcnRfLT5yZWFkQWxsKHJCdWZfLmdldCgpICsgNCwgc3ogLSA0KTsKKyAgICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIHN6KTsKKyAgICB9IGVsc2UgaWYgKHN0YXRpY19jYXN0PGludDhfdD4obWFnaWMgPj4gMjQpID09IFRDb21wYWN0UHJvdG9jb2w6OlBST1RPQ09MX0lECisgICAgICAgICAgICAgICAmJiAoc3RhdGljX2Nhc3Q8aW50OF90PihtYWdpYyA+PiAxNikgJiBUQ29tcGFjdFByb3RvY29sOjpWRVJTSU9OX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgPT0gVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTl9OKSB7CisgICAgICBjbGllbnRUeXBlID0gVEhSSUZUX0ZSQU1FRF9DT01QQUNUOworICAgICAgdHJhbnNwb3J0Xy0+cmVhZEFsbChyQnVmXy5nZXQoKSArIDQsIHN6IC0gNCk7CisgICAgICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCBzeik7CisgICAgfSBlbHNlIGlmIChIRUFERVJfTUFHSUMgPT0gKG1hZ2ljICYgSEVBREVSX01BU0spKSB7CisgICAgICBpZiAoc3ogPCAxMCkgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWFkZXIgdHJhbnNwb3J0IGZyYW1lIGlzIHRvbyBzbWFsbCIpOworICAgICAgfQorCisgICAgICB0cmFuc3BvcnRfLT5yZWFkQWxsKHJCdWZfLmdldCgpICsgNCwgc3ogLSA0KTsKKworICAgICAgLy8gaGVhZGVyIGZvcm1hdAorICAgICAgY2xpZW50VHlwZSA9IFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEU7CisgICAgICAvLyBmbGFncworICAgICAgZmxhZ3MgPSBtYWdpYyAmIEZMQUdTX01BU0s7CisgICAgICAvLyBzZXFJZAorICAgICAgdWludDMyX3Qgc2VxSWRfbjsKKyAgICAgIG1lbWNweSgmc2VxSWRfbiwgckJ1Zl8uZ2V0KCkgKyA0LCBzaXplb2Yoc2VxSWRfbikpOworICAgICAgc2VxSWQgPSBudG9obChzZXFJZF9uKTsKKyAgICAgIC8vIGhlYWRlciBzaXplCisgICAgICB1aW50MTZfdCBoZWFkZXJTaXplX247CisgICAgICBtZW1jcHkoJmhlYWRlclNpemVfbiwgckJ1Zl8uZ2V0KCkgKyA4LCBzaXplb2YoaGVhZGVyU2l6ZV9uKSk7CisgICAgICB1aW50MTZfdCBoZWFkZXJTaXplID0gbnRvaHMoaGVhZGVyU2l6ZV9uKTsKKyAgICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIHN6KTsKKyAgICAgIHJlYWRIZWFkZXJGb3JtYXQoaGVhZGVyU2l6ZSwgc3opOworICAgIH0gZWxzZSB7CisgICAgICBjbGllbnRUeXBlID0gVEhSSUZUX1VOS05PV05fQ0xJRU5UX1RZUEU7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGRldGVjdCBjbGllbnQgdHJhbnNwb3J0IHR5cGUiKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBSZWFkcyBhIHN0cmluZyBmcm9tIHB0ciwgdGFraW5nIGNhcmUgbm90IHRvIHJlYWNoIGhlYWRlckJvdW5kYXJ5CisgKiBBZHZhbmNlcyBwdHIgb24gc3VjY2VzcworICoKKyAqIEBwYXJhbSAgIHN0ciAgICAgICAgICAgICBvdXRwdXQgc3RyaW5nCisgKiBAdGhyb3dzICBDT1JSVVBURURfREFUQSAgaWYgc2l6ZSBvZiBzdHJpbmcgZXhjZWVkcyBib3VuZGFyeQorICovCit2b2lkIFRIZWFkZXJUcmFuc3BvcnQ6OnJlYWRTdHJpbmcodWludDhfdComIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXQgKi8gc3RyaW5nJiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb25zdCogaGVhZGVyQm91bmRhcnkpIHsKKyAgaW50MzJfdCBzdHJMZW47CisKKyAgdWludDMyX3QgYnl0ZXMgPSByZWFkVmFyaW50MzIocHRyLCAmc3RyTGVuLCBoZWFkZXJCb3VuZGFyeSk7CisgIGlmIChzdHJMZW4gPiBoZWFkZXJCb3VuZGFyeSAtIHB0cikgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5mbyBoZWFkZXIgbGVuZ3RoIGV4Y2VlZHMgaGVhZGVyIHNpemUiKTsKKyAgfQorICBwdHIgKz0gYnl0ZXM7CisgIHN0ci5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocHRyKSwgc3RyTGVuKTsKKyAgcHRyICs9IHN0ckxlbjsKK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjpyZWFkSGVhZGVyRm9ybWF0KHVpbnQxNl90IGhlYWRlclNpemUsIHVpbnQzMl90IHN6KSB7CisgIHJlYWRUcmFuc18uY2xlYXIoKTsgICAvLyBDbGVhciBvdXQgYW55IHByZXZpb3VzIHRyYW5zZm9ybXMuCisgIHJlYWRIZWFkZXJzXy5jbGVhcigpOyAvLyBDbGVhciBvdXQgYW55IHByZXZpb3VzIGhlYWRlcnMuCisKKyAgLy8gc2tpcCBvdmVyIGFscmVhZHkgcHJvY2Vzc2VkIG1hZ2ljKDQpLCBzZXFJZCg0KSwgaGVhZGVyU2l6ZSgyKQorICB1aW50OF90KiBwdHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihyQnVmXy5nZXQoKSArIDEwKTsKKworICAvLyBDYXRjaCBpbnRlZ2VyIG92ZXJmbG93LCBjaGVjayBmb3IgcmVhc29uYWJsZSBoZWFkZXIgc2l6ZQorICBpZiAoaGVhZGVyU2l6ZSA+PSAxNjM4NCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVhZGVyIHNpemUgaXMgdW5yZWFzb25hYmxlIik7CisgIH0KKyAgaGVhZGVyU2l6ZSAqPSA0OworICBjb25zdCB1aW50OF90KiBjb25zdCBoZWFkZXJCb3VuZGFyeSA9IHB0ciArIGhlYWRlclNpemU7CisgIGlmIChoZWFkZXJTaXplID4gc3opIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlYWRlciBzaXplIGlzIGxhcmdlciB0aGFuIGZyYW1lIik7CisgIH0KKyAgdWludDhfdCogZGF0YSA9IHB0ciArIGhlYWRlclNpemU7CisgIHB0ciArPSByZWFkVmFyaW50MTYocHRyLCAmcHJvdG9JZCwgaGVhZGVyQm91bmRhcnkpOworICBpbnQxNl90IG51bVRyYW5zZm9ybXM7CisgIHB0ciArPSByZWFkVmFyaW50MTYocHRyLCAmbnVtVHJhbnNmb3JtcywgaGVhZGVyQm91bmRhcnkpOworCisgIC8vIEZvciBub3cgYWxsIHRyYW5zZm9ybXMgY29uc2lzdCBvZiBvbmx5IHRoZSBJRCwgbm90IGRhdGEuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVHJhbnNmb3JtczsgaSsrKSB7CisgICAgaW50MzJfdCB0cmFuc0lkOworICAgIHB0ciArPSByZWFkVmFyaW50MzIocHRyLCAmdHJhbnNJZCwgaGVhZGVyQm91bmRhcnkpOworCisgICAgcmVhZFRyYW5zXy5wdXNoX2JhY2sodHJhbnNJZCk7CisgIH0KKworICAvLyBJbmZvIGhlYWRlcnMKKyAgd2hpbGUgKHB0ciA8IGhlYWRlckJvdW5kYXJ5KSB7CisgICAgaW50MzJfdCBpbmZvSWQ7CisgICAgcHRyICs9IHJlYWRWYXJpbnQzMihwdHIsICZpbmZvSWQsIGhlYWRlckJvdW5kYXJ5KTsKKworICAgIGlmIChpbmZvSWQgPT0gMCkgeworICAgICAgLy8gaGVhZGVyIHBhZGRpbmcKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaW5mb0lkID49IGluZm9JZFR5cGU6OkVORCkgeworICAgICAgLy8gY2Fubm90IGhhbmRsZSBpbmZvSWQKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBzd2l0Y2ggKGluZm9JZCkgeworICAgIGNhc2UgaW5mb0lkVHlwZTo6S0VZVkFMVUU6CisgICAgICAvLyBQcm9jZXNzIGtleS12YWx1ZSBoZWFkZXJzCisgICAgICB1aW50MzJfdCBudW1LVkhlYWRlcnM7CisgICAgICBwdHIgKz0gcmVhZFZhcmludDMyKHB0ciwgKGludDMyX3QqKSZudW1LVkhlYWRlcnMsIGhlYWRlckJvdW5kYXJ5KTsKKyAgICAgIC8vIGNvbnRpbnVlIHVudGlsIHdlIHJlYWNoIChwYWRkZWQpIGVuZCBvZiBwYWNrZXQKKyAgICAgIHdoaWxlIChudW1LVkhlYWRlcnMtLSAmJiBwdHIgPCBoZWFkZXJCb3VuZGFyeSkgeworICAgICAgICAvLyBmb3JtYXQ6IGtleTsgdmFsdWUKKyAgICAgICAgLy8gYm90aDogbGVuZ3RoICh2YXJpbnQzMik7IHZhbHVlIChzdHJpbmcpCisgICAgICAgIHN0cmluZyBrZXksIHZhbHVlOworICAgICAgICByZWFkU3RyaW5nKHB0ciwga2V5LCBoZWFkZXJCb3VuZGFyeSk7CisgICAgICAgIC8vIHZhbHVlCisgICAgICAgIHJlYWRTdHJpbmcocHRyLCB2YWx1ZSwgaGVhZGVyQm91bmRhcnkpOworICAgICAgICAvLyBzYXZlIHRvIGhlYWRlcnMKKyAgICAgICAgcmVhZEhlYWRlcnNfW2tleV0gPSB2YWx1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIFVudHJhbnNmb3JtIHRoZSBkYXRhIHNlY3Rpb24uICByQnVmIHdpbGwgY29udGFpbiByZXN1bHQuCisgIHVudHJhbnNmb3JtKGRhdGEsIHNhZmVfbnVtZXJpY19jYXN0PHVpbnQzMl90PihzdGF0aWNfY2FzdDxwdHJkaWZmX3Q+KHN6KSAtIChkYXRhIC0gckJ1Zl8uZ2V0KCkpKSk7Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6dW50cmFuc2Zvcm0odWludDhfdCogcHRyLCB1aW50MzJfdCBzeikgeworICAvLyBVcGRhdGUgdGhlIHRyYW5zZm9ybSBidWZmZXIgc2l6ZSBpZiBuZWVkZWQKKyAgcmVzaXplVHJhbnNmb3JtQnVmZmVyKCk7CisKKyAgZm9yICh2ZWN0b3I8dWludDE2X3Q+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHJlYWRUcmFuc18uYmVnaW4oKTsgaXQgIT0gcmVhZFRyYW5zXy5lbmQoKTsgKytpdCkgeworICAgIGNvbnN0IHVpbnQxNl90IHRyYW5zSWQgPSAqaXQ7CisKKyAgICBpZiAodHJhbnNJZCA9PSBaTElCX1RSQU5TRk9STSkgeworICAgICAgel9zdHJlYW0gc3RyZWFtOworICAgICAgaW50IGVycjsKKworICAgICAgc3RyZWFtLm5leHRfaW4gPSBwdHI7CisgICAgICBzdHJlYW0uYXZhaWxfaW4gPSBzejsKKworICAgICAgLy8gU2V0dGluZyB0aGVzZSB0byAwIG1lYW5zIHVzZSB0aGUgZGVmYXVsdCBmcmVlL2FsbG9jIGZ1bmN0aW9ucworICAgICAgc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7CisgICAgICBzdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CisgICAgICBzdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOworICAgICAgZXJyID0gaW5mbGF0ZUluaXQoJnN0cmVhbSk7CisgICAgICBpZiAoZXJyICE9IFpfT0spIHsKKyAgICAgICAgdGhyb3cgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6TUlTU0lOR19SRVNVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgemxpYiBkZWZsYXRlSW5pdCIpOworICAgICAgfQorICAgICAgc3RyZWFtLm5leHRfb3V0ID0gdEJ1Zl8uZ2V0KCk7CisgICAgICBzdHJlYW0uYXZhaWxfb3V0ID0gdEJ1ZlNpemVfOworICAgICAgZXJyID0gaW5mbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCk7CisgICAgICBpZiAoZXJyICE9IFpfU1RSRUFNX0VORCB8fCBzdHJlYW0uYXZhaWxfb3V0ID09IDApIHsKKyAgICAgICAgdGhyb3cgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6TUlTU0lOR19SRVNVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgemxpYiBkZWZsYXRlIik7CisgICAgICB9CisgICAgICBzeiA9IHN0cmVhbS50b3RhbF9vdXQ7CisKKyAgICAgIGVyciA9IGluZmxhdGVFbmQoJnN0cmVhbSk7CisgICAgICBpZiAoZXJyICE9IFpfT0spIHsKKyAgICAgICAgdGhyb3cgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6TUlTU0lOR19SRVNVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgemxpYiBkZWZsYXRlRW5kIik7CisgICAgICB9CisKKyAgICAgIG1lbWNweShwdHIsIHRCdWZfLmdldCgpLCBzeik7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb246Ok1JU1NJTkdfUkVTVUxULCAiVW5rbm93biB0cmFuc2Zvcm0iKTsKKyAgICB9CisgIH0KKworICBzZXRSZWFkQnVmZmVyKHB0ciwgc3opOworfQorCisvKioKKyAqIFdlIG1heSBoYXZlIHVwZGF0ZWQgdGhlIHdCdWYgc2l6ZSwgdXBkYXRlIHRoZSB0QnVmIHNpemUgdG8gbWF0Y2guCisgKiBTaG91bGQgYmUgY2FsbGVkIGluIHRyYW5zZm9ybS4KKyAqCisgKiBUaGUgYnVmZmVyIHNob3VsZCBiZSBzbGlnaHRseSBsYXJnZXIgdGhhbiB3cml0ZSBidWZmZXIgc2l6ZSBkdWUgdG8KKyAqIGNvbXByZXNzaW9uIHRyYW5zZm9ybXMgKHRoYXQgbWF5IHNsaWdodGx5IGdyb3cgb24gc21hbGwgZnJhbWUgc2l6ZXMpCisgKi8KK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6cmVzaXplVHJhbnNmb3JtQnVmZmVyKHVpbnQzMl90IGFkZGl0aW9uYWxTaXplKSB7CisgIGlmICh0QnVmU2l6ZV8gPCB3QnVmU2l6ZV8gKyBERUZBVUxUX0JVRkZFUl9TSVpFKSB7CisgICAgdWludDMyX3QgbmV3X3NpemUgPSB3QnVmU2l6ZV8gKyBERUZBVUxUX0JVRkZFUl9TSVpFICsgYWRkaXRpb25hbFNpemU7CisgICAgdWludDhfdCogbmV3X2J1ZiA9IG5ldyB1aW50OF90W25ld19zaXplXTsKKyAgICB0QnVmXy5yZXNldChuZXdfYnVmKTsKKyAgICB0QnVmU2l6ZV8gPSBuZXdfc2l6ZTsKKyAgfQorfQorCit2b2lkIFRIZWFkZXJUcmFuc3BvcnQ6OnRyYW5zZm9ybSh1aW50OF90KiBwdHIsIHVpbnQzMl90IHN6KSB7CisgIC8vIFVwZGF0ZSB0aGUgdHJhbnNmb3JtIGJ1ZmZlciBzaXplIGlmIG5lZWRlZAorICByZXNpemVUcmFuc2Zvcm1CdWZmZXIoKTsKKworICBmb3IgKHZlY3Rvcjx1aW50MTZfdD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gd3JpdGVUcmFuc18uYmVnaW4oKTsgaXQgIT0gd3JpdGVUcmFuc18uZW5kKCk7ICsraXQpIHsKKyAgICBjb25zdCB1aW50MTZfdCB0cmFuc0lkID0gKml0OworCisgICAgaWYgKHRyYW5zSWQgPT0gWkxJQl9UUkFOU0ZPUk0pIHsKKyAgICAgIHpfc3RyZWFtIHN0cmVhbTsKKyAgICAgIGludCBlcnI7CisKKyAgICAgIHN0cmVhbS5uZXh0X2luID0gcHRyOworICAgICAgc3RyZWFtLmF2YWlsX2luID0gc3o7CisKKyAgICAgIHN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOworICAgICAgc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOworICAgICAgc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKKyAgICAgIGVyciA9IGRlZmxhdGVJbml0KCZzdHJlYW0sIFpfREVGQVVMVF9DT01QUkVTU0lPTik7CisgICAgICBpZiAoZXJyICE9IFpfT0spIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgemxpYiBkZWZsYXRlSW5pdCIpOworICAgICAgfQorICAgICAgdWludDMyX3QgdGJ1Zl9zaXplID0gMDsKKyAgICAgIHdoaWxlIChlcnIgPT0gWl9PSykgeworICAgICAgICByZXNpemVUcmFuc2Zvcm1CdWZmZXIodGJ1Zl9zaXplKTsKKworICAgICAgICBzdHJlYW0ubmV4dF9vdXQgPSB0QnVmXy5nZXQoKTsKKyAgICAgICAgc3RyZWFtLmF2YWlsX291dCA9IHRCdWZTaXplXzsKKyAgICAgICAgZXJyID0gZGVmbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCk7CisgICAgICAgIHRidWZfc2l6ZSArPSBERUZBVUxUX0JVRkZFUl9TSVpFOworICAgICAgfQorICAgICAgc3ogPSBzdHJlYW0udG90YWxfb3V0OworCisgICAgICBlcnIgPSBkZWZsYXRlRW5kKCZzdHJlYW0pOworICAgICAgaWYgKGVyciAhPSBaX09LKSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdoaWxlIHpsaWIgZGVmbGF0ZUVuZCIpOworICAgICAgfQorCisgICAgICBtZW1jcHkocHRyLCB0QnVmXy5nZXQoKSwgc3opOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLCAiVW5rbm93biB0cmFuc2Zvcm0iKTsKKyAgICB9CisgIH0KKworICB3QmFzZV8gPSB3QnVmXy5nZXQoKSArIHN6OworfQorCit2b2lkIFRIZWFkZXJUcmFuc3BvcnQ6OnJlc2V0UHJvdG9jb2woKSB7CisgIC8vIFNldCB0byBhbnl0aGluZyBleGNlcHQgSFRUUCB0eXBlIHNvIHdlIGRvbid0IGZsdXNoIGFnYWluCisgIGNsaWVudFR5cGUgPSBUSFJJRlRfSEVBREVSX0NMSUVOVF9UWVBFOworCisgIC8vIFJlYWQgdGhlIGhlYWRlciBhbmQgZGVjaWRlIHdoaWNoIHByb3RvY29sIHRvIGdvIHdpdGgKKyAgcmVhZEZyYW1lKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJUcmFuc3BvcnQ6OmdldFdyaXRlQnl0ZXMoKSB7CisgIHJldHVybiBzYWZlX251bWVyaWNfY2FzdDx1aW50MzJfdD4od0Jhc2VfIC0gd0J1Zl8uZ2V0KCkpOworfQorCisvKioKKyAqIFdyaXRlcyBhIHN0cmluZyB0byBhIGJ5dGUgYnVmZmVyLCBhcyBzaXplICh2YXJpbnQzMikgKyBzdHJpbmcgKG5vbi1udWxsCisgKiB0ZXJtaW5hdGVkKQorICogQXV0b21hdGljYWxseSBhZHZhbmNlcyBwdHIgdG8gYWZ0ZXIgdGhlIHdyaXR0ZW4gcG9ydGlvbgorICovCit2b2lkIFRIZWFkZXJUcmFuc3BvcnQ6OndyaXRlU3RyaW5nKHVpbnQ4X3QqJiBwdHIsIGNvbnN0IHN0cmluZyYgc3RyKSB7CisgIGludDMyX3Qgc3RyTGVuID0gc2FmZV9udW1lcmljX2Nhc3Q8aW50MzJfdD4oc3RyLmxlbmd0aCgpKTsKKyAgcHRyICs9IHdyaXRlVmFyaW50MzIoc3RyTGVuLCBwdHIpOworICBtZW1jcHkocHRyLCBzdHIuY19zdHIoKSwgc3RyTGVuKTsgLy8gbm8gbmVlZCB0byB3cml0ZSBcMAorICBwdHIgKz0gc3RyTGVuOworfQorCit2b2lkIFRIZWFkZXJUcmFuc3BvcnQ6OnNldEhlYWRlcihjb25zdCBzdHJpbmcmIGtleSwgY29uc3Qgc3RyaW5nJiB2YWx1ZSkgeworICB3cml0ZUhlYWRlcnNfW2tleV0gPSB2YWx1ZTsKK30KKwordWludDMyX3QgVEhlYWRlclRyYW5zcG9ydDo6Z2V0TWF4V3JpdGVIZWFkZXJzU2l6ZSgpIGNvbnN0IHsKKyAgc2l6ZV90IG1heFdyaXRlSGVhZGVyc1NpemUgPSAwOworICBUSGVhZGVyVHJhbnNwb3J0OjpTdHJpbmdUb1N0cmluZ01hcDo6Y29uc3RfaXRlcmF0b3IgaXQ7CisgIGZvciAoaXQgPSB3cml0ZUhlYWRlcnNfLmJlZ2luKCk7IGl0ICE9IHdyaXRlSGVhZGVyc18uZW5kKCk7ICsraXQpIHsKKyAgICAvLyBhZGQgc2l6ZXMgb2Yga2V5IGFuZCB2YWx1ZSB0byBtYXhXcml0ZUhlYWRlcnNTaXplCisgICAgLy8gMiB2YXJpbnRzMzIgKyB0aGUgc3RyaW5ncyB0aGVtc2VsdmVzCisgICAgbWF4V3JpdGVIZWFkZXJzU2l6ZSArPSA1ICsgNSArIChpdC0+Zmlyc3QpLmxlbmd0aCgpICsgKGl0LT5zZWNvbmQpLmxlbmd0aCgpOworICB9CisgIHJldHVybiBzYWZlX251bWVyaWNfY2FzdDx1aW50MzJfdD4obWF4V3JpdGVIZWFkZXJzU2l6ZSk7Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6Y2xlYXJIZWFkZXJzKCkgeworICB3cml0ZUhlYWRlcnNfLmNsZWFyKCk7Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6Zmx1c2goKSB7CisgIC8vIFdyaXRlIG91dCBhbnkgZGF0YSB3YWl0aW5nIGluIHRoZSB3cml0ZSBidWZmZXIuCisgIHVpbnQzMl90IGhhdmVCeXRlcyA9IGdldFdyaXRlQnl0ZXMoKTsKKworICBpZiAoY2xpZW50VHlwZSA9PSBUSFJJRlRfSEVBREVSX0NMSUVOVF9UWVBFKSB7CisgICAgdHJhbnNmb3JtKHdCdWZfLmdldCgpLCBoYXZlQnl0ZXMpOworICAgIGhhdmVCeXRlcyA9IGdldFdyaXRlQnl0ZXMoKTsgLy8gdHJhbnNmb3JtIG1heSBoYXZlIGNoYW5nZWQgdGhlIHNpemUKKyAgfQorCisgIC8vIE5vdGUgdGhhdCB3ZSByZXNldCB3QmFzZV8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUKKyAgLy8gdG8gZW5zdXJlIHdlJ3JlIGluIGEgc2FuZSBzdGF0ZSAoaS5lLiBpbnRlcm5hbCBidWZmZXIgY2xlYW5lZCkKKyAgLy8gaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzIHVwIGFuIGV4Y2VwdGlvbgorICB3QmFzZV8gPSB3QnVmXy5nZXQoKTsKKworICBpZiAoaGF2ZUJ5dGVzID4gTUFYX0ZSQU1FX1NJWkUpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRpbmcgdG8gc2VuZCBmcmFtZSB0aGF0IGlzIHRvbyBsYXJnZSIpOworICB9CisKKyAgaWYgKGNsaWVudFR5cGUgPT0gVEhSSUZUX0hFQURFUl9DTElFTlRfVFlQRSkgeworICAgIC8vIGhlYWRlciBzaXplIHdpbGwgbmVlZCB0byBiZSB1cGRhdGVkIGF0IHRoZSBlbmQgYmVjYXVzZSBvZiB2YXJpbnRzLgorICAgIC8vIE1ha2UgaXQgYmlnIGVub3VnaCBoZXJlIGZvciBtYXggdmFyaW50IHNpemUsIHBsdXMgNCBmb3IgcGFkZGluZy4KKyAgICB1aW50MzJfdCBoZWFkZXJTaXplID0gKDIgKyBnZXROdW1UcmFuc2Zvcm1zKCkpICogVEhSSUZUX01BWF9WQVJJTlQzMl9CWVRFUyArIDQ7CisgICAgLy8gYWRkIGFwcHJveGltYXRlIHNpemUgb2YgaW5mbyBoZWFkZXJzCisgICAgaGVhZGVyU2l6ZSArPSBnZXRNYXhXcml0ZUhlYWRlcnNTaXplKCk7CisKKyAgICAvLyBQa3Qgc2l6ZQorICAgIHVpbnQzMl90IG1heFN6SGJvID0gaGVhZGVyU2l6ZSArIGhhdmVCeXRlcyAvLyB0aHJpZnQgaGVhZGVyICsgcGF5bG9hZAorICAgICAgICAgICAgICAgICAgICAgICAgKyAxMDsgICAgICAgICAgICAgICAgICAvLyBjb21tb24gaGVhZGVyIHNlY3Rpb24KKyAgICB1aW50OF90KiBwa3QgPSB0QnVmXy5nZXQoKTsKKyAgICB1aW50OF90KiBoZWFkZXJTdGFydDsKKyAgICB1aW50OF90KiBoZWFkZXJTaXplUHRyOworICAgIHVpbnQ4X3QqIHBrdFN0YXJ0ID0gcGt0OworCisgICAgaWYgKG1heFN6SGJvID4gdEJ1ZlNpemVfKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGluZyB0byBoZWFkZXIgZnJhbWUgdGhhdCBpcyB0b28gbGFyZ2UiKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBzekhibzsKKyAgICB1aW50MzJfdCBzek5ibzsKKyAgICB1aW50MTZfdCBoZWFkZXJTaXplTjsKKworICAgIC8vIEZpeHVwIHN6SGJvIGxhdGVyCisgICAgcGt0ICs9IHNpemVvZihzek5ibyk7CisgICAgdWludDE2X3QgaGVhZGVyTiA9IGh0b25zKEhFQURFUl9NQUdJQyA+PiAxNik7CisgICAgbWVtY3B5KHBrdCwgJmhlYWRlck4sIHNpemVvZihoZWFkZXJOKSk7CisgICAgcGt0ICs9IHNpemVvZihoZWFkZXJOKTsKKyAgICB1aW50MTZfdCBmbGFnc04gPSBodG9ucyhmbGFncyk7CisgICAgbWVtY3B5KHBrdCwgJmZsYWdzTiwgc2l6ZW9mKGZsYWdzTikpOworICAgIHBrdCArPSBzaXplb2YoZmxhZ3NOKTsKKyAgICB1aW50MzJfdCBzZXFJZE4gPSBodG9ubChzZXFJZCk7CisgICAgbWVtY3B5KHBrdCwgJnNlcUlkTiwgc2l6ZW9mKHNlcUlkTikpOworICAgIHBrdCArPSBzaXplb2Yoc2VxSWROKTsKKyAgICBoZWFkZXJTaXplUHRyID0gcGt0OworICAgIC8vIEZpeHVwIGhlYWRlclNpemVOIGxhdGVyCisgICAgcGt0ICs9IHNpemVvZihoZWFkZXJTaXplTik7CisgICAgaGVhZGVyU3RhcnQgPSBwa3Q7CisKKyAgICBwa3QgKz0gd3JpdGVWYXJpbnQzMihwcm90b0lkLCBwa3QpOworICAgIHBrdCArPSB3cml0ZVZhcmludDMyKGdldE51bVRyYW5zZm9ybXMoKSwgcGt0KTsKKworICAgIC8vIEZvciBub3csIGVhY2ggdHJhbnNmb3JtIGlzIG9ubHkgdGhlIElELCBubyBmb2xsb3dpbmcgZGF0YS4KKyAgICBmb3IgKHZlY3Rvcjx1aW50MTZfdD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gd3JpdGVUcmFuc18uYmVnaW4oKTsgaXQgIT0gd3JpdGVUcmFuc18uZW5kKCk7ICsraXQpIHsKKyAgICAgIHBrdCArPSB3cml0ZVZhcmludDMyKCppdCwgcGt0KTsKKyAgICB9CisKKyAgICAvLyB3cml0ZSBpbmZvIGhlYWRlcnMKKworICAgIC8vIGZvciBub3cgb25seSB3cml0ZSBrdi1oZWFkZXJzCisgICAgaW50MzJfdCBoZWFkZXJDb3VudCA9IHNhZmVfbnVtZXJpY19jYXN0PGludDMyX3Q+KHdyaXRlSGVhZGVyc18uc2l6ZSgpKTsKKyAgICBpZiAoaGVhZGVyQ291bnQgPiAwKSB7CisgICAgICBwa3QgKz0gd3JpdGVWYXJpbnQzMihpbmZvSWRUeXBlOjpLRVlWQUxVRSwgcGt0KTsKKyAgICAgIC8vIFdyaXRlIGtleS12YWx1ZSBoZWFkZXJzIGNvdW50CisgICAgICBwa3QgKz0gd3JpdGVWYXJpbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihoZWFkZXJDb3VudCksIHBrdCk7CisgICAgICAvLyBXcml0ZSBpbmZvIGhlYWRlcnMKKyAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0OworICAgICAgZm9yIChpdCA9IHdyaXRlSGVhZGVyc18uYmVnaW4oKTsgaXQgIT0gd3JpdGVIZWFkZXJzXy5lbmQoKTsgKytpdCkgeworICAgICAgICB3cml0ZVN0cmluZyhwa3QsIGl0LT5maXJzdCk7ICAvLyBrZXkKKyAgICAgICAgd3JpdGVTdHJpbmcocGt0LCBpdC0+c2Vjb25kKTsgLy8gdmFsdWUKKyAgICAgIH0KKyAgICAgIHdyaXRlSGVhZGVyc18uY2xlYXIoKTsKKyAgICB9CisKKyAgICAvLyBGaXh1cHMgYWZ0ZXIgdmFyaW50IHNpemUgY2FsY3VsYXRpb25zCisgICAgaGVhZGVyU2l6ZSA9IHNhZmVfbnVtZXJpY19jYXN0PHVpbnQzMl90Pihwa3QgLSBoZWFkZXJTdGFydCk7CisgICAgdWludDhfdCBwYWRkaW5nID0gNCAtIChoZWFkZXJTaXplICUgNCk7CisgICAgaGVhZGVyU2l6ZSArPSBwYWRkaW5nOworCisgICAgLy8gUGFkIG91dCBwa3Qgd2l0aCAweDAwCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWRkaW5nOyBpKyspIHsKKyAgICAgICoocGt0KyspID0gMHgwMDsKKyAgICB9CisKKyAgICAvLyBQa3Qgc2l6ZQorICAgIHB0cmRpZmZfdCBzekhicCA9IChoZWFkZXJTdGFydCAtIHBrdFN0YXJ0IC0gNCk7CisgICAgaWYgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzekhicCkgPiBzdGF0aWNfY2FzdDx1aW50NjRfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+KCkubWF4KSgpKSAtIChoZWFkZXJTaXplICsgaGF2ZUJ5dGVzKSkgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlYWRlciBzZWN0aW9uIHNpemUgaXMgdW5yZWFzb25hYmxlIik7CisgICAgfQorICAgIHN6SGJvID0gaGVhZGVyU2l6ZSArIGhhdmVCeXRlcyAgICAgICAgICAvLyB0aHJpZnQgaGVhZGVyICsgcGF5bG9hZAorICAgICAgICAgICAgKyBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3pIYnApOyAvLyBjb21tb24gaGVhZGVyIHNlY3Rpb24KKyAgICBoZWFkZXJTaXplTiA9IGh0b25zKGhlYWRlclNpemUgLyA0KTsKKyAgICBtZW1jcHkoaGVhZGVyU2l6ZVB0ciwgJmhlYWRlclNpemVOLCBzaXplb2YoaGVhZGVyU2l6ZU4pKTsKKworICAgIC8vIFNldCBmcmFtaW5nIHNpemUuCisgICAgc3pOYm8gPSBodG9ubChzekhibyk7CisgICAgbWVtY3B5KHBrdFN0YXJ0LCAmc3pOYm8sIHNpemVvZihzek5ibykpOworCisgICAgb3V0VHJhbnNwb3J0Xy0+d3JpdGUocGt0U3RhcnQsIHN6SGJvIC0gaGF2ZUJ5dGVzICsgNCk7CisgICAgb3V0VHJhbnNwb3J0Xy0+d3JpdGUod0J1Zl8uZ2V0KCksIGhhdmVCeXRlcyk7CisgIH0gZWxzZSBpZiAoY2xpZW50VHlwZSA9PSBUSFJJRlRfRlJBTUVEX0JJTkFSWSB8fCBjbGllbnRUeXBlID09IFRIUklGVF9GUkFNRURfQ09NUEFDVCkgeworICAgIHVpbnQzMl90IHN6SGJvID0gKHVpbnQzMl90KWhhdmVCeXRlczsKKyAgICB1aW50MzJfdCBzek5ibyA9IGh0b25sKHN6SGJvKTsKKworICAgIG91dFRyYW5zcG9ydF8tPndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZzek5ibyksIDQpOworICAgIG91dFRyYW5zcG9ydF8tPndyaXRlKHdCdWZfLmdldCgpLCBoYXZlQnl0ZXMpOworICB9IGVsc2UgaWYgKGNsaWVudFR5cGUgPT0gVEhSSUZUX1VORlJBTUVEX0JJTkFSWSB8fCBjbGllbnRUeXBlID09IFRIUklGVF9VTkZSQU1FRF9DT01QQUNUKSB7CisgICAgb3V0VHJhbnNwb3J0Xy0+d3JpdGUod0J1Zl8uZ2V0KCksIGhhdmVCeXRlcyk7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywgIlVua25vd24gY2xpZW50IHR5cGUiKTsKKyAgfQorCisgIC8vIEZsdXNoIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgb3V0VHJhbnNwb3J0Xy0+Zmx1c2goKTsKK30KKworLyoqCisgKiBSZWFkIGFuIGkxNiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gMyBieXRlcy4KKyAqLwordWludDMyX3QgVEhlYWRlclRyYW5zcG9ydDo6cmVhZFZhcmludDE2KHVpbnQ4X3QgY29uc3QqIHB0ciwgaW50MTZfdCogaTE2LCB1aW50OF90IGNvbnN0KiBib3VuZGFyeSkgeworICBpbnQzMl90IHZhbDsKKyAgdWludDMyX3QgcnNpemUgPSByZWFkVmFyaW50MzIocHRyLCAmdmFsLCBib3VuZGFyeSk7CisgICppMTYgPSAoaW50MTZfdCl2YWw7CisgIHJldHVybiByc2l6ZTsKK30KKworLyoqCisgKiBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gNSBieXRlcy4KKyAqLwordWludDMyX3QgVEhlYWRlclRyYW5zcG9ydDo6cmVhZFZhcmludDMyKHVpbnQ4X3QgY29uc3QqIHB0ciwgaW50MzJfdCogaTMyLCB1aW50OF90IGNvbnN0KiBib3VuZGFyeSkgeworCisgIHVpbnQzMl90IHJzaXplID0gMDsKKyAgdWludDMyX3QgdmFsID0gMDsKKyAgaW50IHNoaWZ0ID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmIChwdHIgPT0gYm91bmRhcnkpIHsKKyAgICAgIHRocm93IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb246OklOVkFMSURfTUVTU0FHRV9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcnlpbmcgdG8gcmVhZCBwYXN0IGhlYWRlciBib3VuZGFyeSIpOworICAgIH0KKyAgICB1aW50OF90IGJ5dGUgPSAqKHB0cisrKTsKKyAgICByc2l6ZSsrOworICAgIHZhbCB8PSAodWludDY0X3QpKGJ5dGUgJiAweDdmKSA8PCBzaGlmdDsKKyAgICBzaGlmdCArPSA3OworICAgIGlmICghKGJ5dGUgJiAweDgwKSkgeworICAgICAgKmkzMiA9IHZhbDsKKyAgICAgIHJldHVybiByc2l6ZTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorICovCit1aW50MzJfdCBUSGVhZGVyVHJhbnNwb3J0Ojp3cml0ZVZhcmludDMyKGludDMyX3QgbiwgdWludDhfdCogcGt0KSB7CisgIHVpbnQ4X3QgYnVmWzVdOworICB1aW50MzJfdCB3c2l6ZSA9IDA7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAoKG4gJiB+MHg3RikgPT0gMCkgeworICAgICAgYnVmW3dzaXplKytdID0gKGludDhfdCluOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9IChpbnQ4X3QpKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG4gPj49IDc7CisgICAgfQorICB9CisKKyAgLy8gQ2FsbGVyIHdpbGwgYWR2YW5jZSBwa3QuCisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB3c2l6ZTsgaSsrKSB7CisgICAgcGt0W2ldID0gYnVmW2ldOworICB9CisKKyAgcmV0dXJuIHdzaXplOworfQorCit1aW50MzJfdCBUSGVhZGVyVHJhbnNwb3J0Ojp3cml0ZVZhcmludDE2KGludDE2X3QgbiwgdWludDhfdCogcGt0KSB7CisgIHJldHVybiB3cml0ZVZhcmludDMyKG4sIHBrdCk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZjNTdlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsMjc1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1RSQU5TUE9SVF9USEVBREVSVFJBTlNQT1JUX0hfCisjZGVmaW5lIFRIUklGVF9UUkFOU1BPUlRfVEhFQURFUlRSQU5TUE9SVF9IXyAxCisKKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG1hcD4KKworI2lmZGVmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbGlmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9hcnJheS5ocHA+CisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVHlwZXMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oPgorCitlbnVtIENMSUVOVF9UWVBFIHsKKyAgVEhSSUZUX0hFQURFUl9DTElFTlRfVFlQRSA9IDAsCisgIFRIUklGVF9GUkFNRURfQklOQVJZID0gMSwKKyAgVEhSSUZUX1VORlJBTUVEX0JJTkFSWSA9IDIsCisgIFRIUklGVF9GUkFNRURfQ09NUEFDVCA9IDMsCisgIFRIUklGVF9VTkZSQU1FRF9DT01QQUNUID0gNCwKKyAgVEhSSUZUX1VOS05PV05fQ0xJRU5UX1RZUEUgPSA1LAorfTsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQ09NUEFDVF9QUk9UT0NPTDsKKworLyoqCisgKiBIZWFkZXIgdHJhbnNwb3J0LiBBbGwgd3JpdGVzIGdvIGludG8gYW4gaW4tbWVtb3J5IGJ1ZmZlciB1bnRpbCBmbHVzaCBpcworICogY2FsbGVkLCBhdCB3aGljaCBwb2ludCB0aGUgdHJhbnNwb3J0IHdyaXRlcyB0aGUgbGVuZ3RoIG9mIHRoZSBlbnRpcmUKKyAqIGJpbmFyeSBjaHVuayBmb2xsb3dlZCBieSB0aGUgZGF0YSBwYXlsb2FkLiBUaGlzIGFsbG93cyB0aGUgcmVjZWl2ZXIgb24gdGhlCisgKiBvdGhlciBlbmQgdG8gYWx3YXlzIGRvIGZpeGVkLWxlbmd0aCByZWFkcy4KKyAqCisgKiBTdWJjbGFzcyBURnJhbWVkVHJhbnNwb3J0IGJlY2F1c2UgbW9zdCBvZiB0aGUgcmVhZC93cml0ZSBtZXRob2RzIGFyZSBzaW1pbGFyCisgKiBhbmQgbmVlZCBzaW1pbGFyIGJ1ZmZlcnMuICBNYWpvciBjaGFuZ2VzIGFyZSByZWFkRnJhbWUgJiBmbHVzaC4KKyAqCisgKiBIZWFkZXIgVHJhbnNwb3J0ICptdXN0KiBiZSB0aGUgc2FtZSB0cmFuc3BvcnQgZm9yIGJvdGggaW5wdXQgYW5kCisgKiBvdXRwdXQgd2hlbiB1c2VkIG9uIHRoZSBzZXJ2ZXIgc2lkZSAtIGNsaWVudCByZXNwb25zZXMgc2hvdWxkIGJlCisgKiB0aGUgc2FtZSBwcm90b2NvbCBhcyB0aG9zZSBpbiB0aGUgcmVxdWVzdC4KKyAqLworY2xhc3MgVEhlYWRlclRyYW5zcG9ydCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUSGVhZGVyVHJhbnNwb3J0LCBURnJhbWVkVHJhbnNwb3J0PiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IDUxMnU7CisgIHN0YXRpYyBjb25zdCBpbnQgVEhSSUZUX01BWF9WQVJJTlQzMl9CWVRFUyA9IDU7CisKKyAgLy8vIFVzZSBkZWZhdWx0IGJ1ZmZlciBzaXplcy4KKyAgZXhwbGljaXQgVEhlYWRlclRyYW5zcG9ydChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIHRyYW5zcG9ydCkKKyAgICA6IFRWaXJ0dWFsVHJhbnNwb3J0KHRyYW5zcG9ydCksCisgICAgICBvdXRUcmFuc3BvcnRfKHRyYW5zcG9ydCksCisgICAgICBwcm90b0lkKFRfQ09NUEFDVF9QUk9UT0NPTCksCisgICAgICBjbGllbnRUeXBlKFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEUpLAorICAgICAgc2VxSWQoMCksCisgICAgICBmbGFncygwKSwKKyAgICAgIHRCdWZTaXplXygwKSwKKyAgICAgIHRCdWZfKE5VTEwpIHsKKyAgICBpZiAoIXRyYW5zcG9ydF8pIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgidHJhbnNwb3J0IGlzIGVtcHR5Iik7CisgICAgaW5pdEJ1ZmZlcnMoKTsKKyAgfQorCisgIFRIZWFkZXJUcmFuc3BvcnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGluVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRUcmFuc3BvcnQpCisgICAgOiBUVmlydHVhbFRyYW5zcG9ydChpblRyYW5zcG9ydCksCisgICAgICBvdXRUcmFuc3BvcnRfKG91dFRyYW5zcG9ydCksCisgICAgICBwcm90b0lkKFRfQ09NUEFDVF9QUk9UT0NPTCksCisgICAgICBjbGllbnRUeXBlKFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEUpLAorICAgICAgc2VxSWQoMCksCisgICAgICBmbGFncygwKSwKKyAgICAgIHRCdWZTaXplXygwKSwKKyAgICAgIHRCdWZfKE5VTEwpIHsKKyAgICBpZiAoIXRyYW5zcG9ydF8pIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiaW5UcmFuc3BvcnQgaXMgZW1wdHkiKTsKKyAgICBpZiAoIW91dFRyYW5zcG9ydF8pIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgib3V0VHJhbnNwb3J0IGlzIGVtcHR5Iik7CisgICAgaW5pdEJ1ZmZlcnMoKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB2aXJ0dWFsIHZvaWQgZmx1c2goKTsKKworICB2b2lkIHJlc2l6ZVRyYW5zZm9ybUJ1ZmZlcih1aW50MzJfdCBhZGRpdGlvbmFsU2l6ZSA9IDApOworCisgIHVpbnQxNl90IGdldFByb3RvY29sSWQoKSBjb25zdDsKKyAgdm9pZCBzZXRQcm90b2NvbElkKHVpbnQxNl90IHByb3RvSWQpIHsgdGhpcy0+cHJvdG9JZCA9IHByb3RvSWQ7IH0KKworICB2b2lkIHJlc2V0UHJvdG9jb2woKTsKKworICAvKioKKyAgICogV2Uga25vdyB3ZSBnb3QgYSBwYWNrZXQgaW4gaGVhZGVyIGZvcm1hdCBoZXJlLCB0cnkgdG8gcGFyc2UgdGhlIGhlYWRlcgorICAgKgorICAgKiBAcGFyYW0gaGVhZGVyU2l6ZSBzaXplIG9mIHRoZSBoZWFkZXIgcG9ydGlvbgorICAgKiBAcGFyYW0gc3ogU2l6ZSBvZiB0aGUgd2hvbGUgbWVzc2FnZSwgaW5jbHVkaW5nIGhlYWRlcgorICAgKi8KKyAgdm9pZCByZWFkSGVhZGVyRm9ybWF0KHVpbnQxNl90IGhlYWRlclNpemUsIHVpbnQzMl90IHN6KTsKKworICAvKioKKyAgICogVW50cmFuc2Zvcm0gdGhlIGRhdGEgYmFzZWQgb24gdGhlIHJlY2VpdmVkIGhlYWRlciBmbGFncworICAgKiBPbiBjb25jbHVzaW9uIG9mIGZ1bmN0aW9uLCBzZXRSZWFkQnVmZmVyIGlzIGNhbGxlZCB3aXRoIHRoZQorICAgKiB1bnRyYW5zZm9ybWVkIGRhdGEuCisgICAqCisgICAqIEBwYXJhbSBwdHIgcHRyIHRvIGRhdGEKKyAgICogQHBhcmFtIHNpemUgb2YgZGF0YQorICAgKi8KKyAgdm9pZCB1bnRyYW5zZm9ybSh1aW50OF90KiBwdHIsIHVpbnQzMl90IHN6KTsKKworICAvKioKKyAgICogVHJhbnNmb3JtIHRoZSBkYXRhIGJhc2VkIG9uIG91ciB3cml0ZSB0cmFuc2Zvcm0gZmxhZ3MKKyAgICogQXQgY29uY2x1c2lvbiBvZiBmdW5jdGlvbiB0aGUgd3JpdGUgYnVmZmVyIGlzIHNldCB0byB0aGUKKyAgICogdHJhbnNmb3JtZWQgZGF0YS4KKyAgICoKKyAgICogQHBhcmFtIHB0ciBQdHIgdG8gZGF0YSB0byB0cmFuc2Zvcm0KKyAgICogQHBhcmFtIHN6IFNpemUgb2YgZGF0YSBidWZmZXIKKyAgICovCisgIHZvaWQgdHJhbnNmb3JtKHVpbnQ4X3QqIHB0ciwgdWludDMyX3Qgc3opOworCisgIHVpbnQxNl90IGdldE51bVRyYW5zZm9ybXMoKSBjb25zdCB7CisgICAgcmV0dXJuIHNhZmVfbnVtZXJpY19jYXN0PHVpbnQxNl90Pih3cml0ZVRyYW5zXy5zaXplKCkpOworICB9CisKKyAgdm9pZCBzZXRUcmFuc2Zvcm0odWludDE2X3QgdHJhbnNJZCkgeyB3cml0ZVRyYW5zXy5wdXNoX2JhY2sodHJhbnNJZCk7IH0KKworICAvLyBJbmZvIGhlYWRlcnMKKworICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gU3RyaW5nVG9TdHJpbmdNYXA7CisKKyAgLy8gdGhlc2Ugd29yayB3aXRoIHdyaXRlIGhlYWRlcnMKKyAgdm9pZCBzZXRIZWFkZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKworICB2b2lkIGNsZWFySGVhZGVycygpOworCisgIFN0cmluZ1RvU3RyaW5nTWFwJiBnZXRXcml0ZUhlYWRlcnMoKSB7IHJldHVybiB3cml0ZUhlYWRlcnNfOyB9CisKKyAgLy8gdGhlc2Ugd29yayB3aXRoIHJlYWQgaGVhZGVycworICBjb25zdCBTdHJpbmdUb1N0cmluZ01hcCYgZ2V0SGVhZGVycygpIGNvbnN0IHsgcmV0dXJuIHJlYWRIZWFkZXJzXzsgfQorCisgIC8vIGFjY2Vzc29ycyBmb3Igc2VxSWQKKyAgaW50MzJfdCBnZXRTZXF1ZW5jZU51bWJlcigpIGNvbnN0IHsgcmV0dXJuIHNlcUlkOyB9CisgIHZvaWQgc2V0U2VxdWVuY2VOdW1iZXIoaW50MzJfdCBzZXFJZCkgeyB0aGlzLT5zZXFJZCA9IHNlcUlkOyB9CisKKyAgZW51bSBUUkFOU0ZPUk1TIHsKKyAgICBaTElCX1RSQU5TRk9STSA9IDB4MDEsCisgIH07CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqIFJlYWRzIGEgZnJhbWUgb2YgaW5wdXQgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAqCisgICAqIFJldHVybnMgdHJ1ZSBpZiBhIGZyYW1lIHdhcyByZWFkIHN1Y2Nlc3NmdWxseSwgb3IgZmFsc2Ugb24gRU9GLgorICAgKiAoUmFpc2VzIGEgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBFT0Ygb2NjdXJzIGFmdGVyIGEgcGFydGlhbCBmcmFtZS4pCisgICAqLworICB2aXJ0dWFsIGJvb2wgcmVhZEZyYW1lKCk7CisKKyAgdm9pZCBlbnN1cmVSZWFkQnVmZmVyKHVpbnQzMl90IHN6KTsKKyAgdWludDMyX3QgZ2V0V3JpdGVCeXRlcygpOworCisgIHZvaWQgaW5pdEJ1ZmZlcnMoKSB7CisgICAgc2V0UmVhZEJ1ZmZlcihOVUxMLCAwKTsKKyAgICBzZXRXcml0ZUJ1ZmZlcih3QnVmXy5nZXQoKSwgd0J1ZlNpemVfKTsKKyAgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRUcmFuc3BvcnRfOworCisgIC8vIDAgYW5kIDE2dGggYml0cyBtdXN0IGJlIDAgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGZyYW1lZCAmIHVuZnJhbWVkCisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBIRUFERVJfTUFHSUMgPSAweDBGRkYwMDAwOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgSEVBREVSX01BU0sgPSAweEZGRkYwMDAwOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgRkxBR1NfTUFTSyA9IDB4MDAwMEZGRkY7CisKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9GUkFNRV9TSVpFID0gMHgzRkZGRkZGRjsKKworICBpbnQxNl90IHByb3RvSWQ7CisgIHVpbnQxNl90IGNsaWVudFR5cGU7CisgIHVpbnQzMl90IHNlcUlkOworICB1aW50MTZfdCBmbGFnczsKKworICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gcmVhZFRyYW5zXzsKKyAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IHdyaXRlVHJhbnNfOworCisgIC8vIE1hcCB0byB1c2UgZm9yIGhlYWRlcnMKKyAgU3RyaW5nVG9TdHJpbmdNYXAgcmVhZEhlYWRlcnNfOworICBTdHJpbmdUb1N0cmluZ01hcCB3cml0ZUhlYWRlcnNfOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IHdyaXRlIGsvdiBoZWFkZXJzIGNhbiB0YWtlCisgICAqLworICB1aW50MzJfdCBnZXRNYXhXcml0ZUhlYWRlcnNTaXplKCkgY29uc3Q7CisKKyAgc3RydWN0IGluZm9JZFR5cGUgeworICAgIGVudW0gaWRUeXBlIHsKKyAgICAgIC8vIHN0YXJ0IGF0IDEgdG8gYXZvaWQgY29uZnVzaW5nIGhlYWRlciBwYWRkaW5nIGZvciBhbiBpbmZvSWQKKyAgICAgIEtFWVZBTFVFID0gMSwKKyAgICAgIEVORCAvLyBzaWduYWwgdGhlIGVuZCBvZiBpbmZvSWRzIHdlIGNhbiBoYW5kbGUKKyAgICB9OworICB9OworCisgIC8vIEJ1ZmZlcnMgdG8gdXNlIGZvciB0cmFuc2Zvcm0gcHJvY2Vzc2luZworICB1aW50MzJfdCB0QnVmU2l6ZV87CisgIGJvb3N0OjpzY29wZWRfYXJyYXk8dWludDhfdD4gdEJ1Zl87CisKKyAgdm9pZCByZWFkU3RyaW5nKHVpbnQ4X3QqJiBwdHIsIC8qIG91dCAqLyBzdGQ6OnN0cmluZyYgc3RyLCB1aW50OF90IGNvbnN0KiBoZWFkZXJCb3VuZGFyeSk7CisKKyAgdm9pZCB3cml0ZVN0cmluZyh1aW50OF90KiYgcHRyLCBjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworICAvLyBWYXJpbnQgdXRpbHMKKyAgLyoqCisgICAqIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDMgYnl0ZXMuCisgICAqLworICB1aW50MzJfdCByZWFkVmFyaW50MTYodWludDhfdCBjb25zdCogcHRyLCBpbnQxNl90KiBpMTYsIHVpbnQ4X3QgY29uc3QqIGJvdW5kYXJ5KTsKKworICAvKioKKyAgICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gNSBieXRlcy4KKyAgICovCisgIHVpbnQzMl90IHJlYWRWYXJpbnQzMih1aW50OF90IGNvbnN0KiBwdHIsIGludDMyX3QqIGkzMiwgdWludDhfdCBjb25zdCogYm91bmRhcnkpOworCisgIC8qKgorICAgKiBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgKi8KKyAgdWludDMyX3Qgd3JpdGVWYXJpbnQzMihpbnQzMl90IG4sIHVpbnQ4X3QqIHBrdCk7CisKKyAgLyoqCisgICAqIFdyaXRlIGFuIGkxNiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTMgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAqLworICB1aW50MzJfdCB3cml0ZVZhcmludDE2KGludDE2X3QgbiwgdWludDhfdCogcGt0KTsKK307CisKKy8qKgorICogV3JhcHMgYSB0cmFuc3BvcnQgaW50byBhIGhlYWRlciBvbmUuCisgKgorICovCitjbGFzcyBUSGVhZGVyVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7CitwdWJsaWM6CisgIFRIZWFkZXJUcmFuc3BvcnRGYWN0b3J5KCkge30KKworICB2aXJ0dWFsIH5USGVhZGVyVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisKKyAgLyoqCisgICAqIFdyYXBzIHRoZSB0cmFuc3BvcnQgaW50byBhIGhlYWRlciBvbmUuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVEhlYWRlclRyYW5zcG9ydCh0cmFucykpOworICB9Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIFRIUklGVF9UUkFOU1BPUlRfVEhFQURFUlRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTUyMTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5jcHAKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8Ym9vc3QvYWxnb3JpdGhtL3N0cmluZy5ocHA+CisKKyNpbmNsdWRlIDx0aHJpZnQvY29uZmlnLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorCit1c2luZyBzdGQ6OnN0cmluZzsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitUSHR0cENsaWVudDo6VEh0dHBDbGllbnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHBhdGgpCisgIDogVEh0dHBUcmFuc3BvcnQodHJhbnNwb3J0KSwgaG9zdF8oaG9zdCksIHBhdGhfKHBhdGgpIHsKK30KKworVEh0dHBDbGllbnQ6OlRIdHRwQ2xpZW50KHN0cmluZyBob3N0LCBpbnQgcG9ydCwgc3RyaW5nIHBhdGgpCisgIDogVEh0dHBUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUU29ja2V0KGhvc3QsIHBvcnQpKSksCisgICAgaG9zdF8oaG9zdCksCisgICAgcGF0aF8ocGF0aCkgeworfQorCitUSHR0cENsaWVudDo6flRIdHRwQ2xpZW50KCkgeworfQorCit2b2lkIFRIdHRwQ2xpZW50OjpwYXJzZUhlYWRlcihjaGFyKiBoZWFkZXIpIHsKKyAgY2hhciogY29sb24gPSBzdHJjaHIoaGVhZGVyLCAnOicpOworICBpZiAoY29sb24gPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBjaGFyKiB2YWx1ZSA9IGNvbG9uICsgMTsKKworICBpZiAoYm9vc3Q6OmlzdGFydHNfd2l0aChoZWFkZXIsICJUcmFuc2Zlci1FbmNvZGluZyIpKSB7CisgICAgaWYgKGJvb3N0OjppZW5kc193aXRoKHZhbHVlLCAiY2h1bmtlZCIpKSB7CisgICAgICBjaHVua2VkXyA9IHRydWU7CisgICAgfQorICB9IGVsc2UgaWYgKGJvb3N0Ojppc3RhcnRzX3dpdGgoaGVhZGVyLCAiQ29udGVudC1MZW5ndGgiKSkgeworICAgIGNodW5rZWRfID0gZmFsc2U7CisgICAgY29udGVudExlbmd0aF8gPSBhdG9pKHZhbHVlKTsKKyAgfQorfQorCitib29sIFRIdHRwQ2xpZW50OjpwYXJzZVN0YXR1c0xpbmUoY2hhciogc3RhdHVzKSB7CisgIGNoYXIqIGh0dHAgPSBzdGF0dXM7CisKKyAgY2hhciogY29kZSA9IHN0cmNocihodHRwLCAnICcpOworICBpZiAoY29kZSA9PSBOVUxMKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcoIkJhZCBTdGF0dXM6ICIpICsgc3RhdHVzKTsKKyAgfQorCisgICpjb2RlID0gJ1wwJzsKKyAgd2hpbGUgKCooY29kZSsrKSA9PSAnICcpIHsKKyAgfTsKKworICBjaGFyKiBtc2cgPSBzdHJjaHIoY29kZSwgJyAnKTsKKyAgaWYgKG1zZyA9PSBOVUxMKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcoIkJhZCBTdGF0dXM6ICIpICsgc3RhdHVzKTsKKyAgfQorICAqbXNnID0gJ1wwJzsKKworICBpZiAoc3RyY21wKGNvZGUsICIyMDAiKSA9PSAwKSB7CisgICAgLy8gSFRUUCAyMDAgPSBPSywgd2UgZ290IHRoZSByZXNwb25zZQorICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKHN0cmNtcChjb2RlLCAiMTAwIikgPT0gMCkgeworICAgIC8vIEhUVFAgMTAwID0gY29udGludWUsIGp1c3Qga2VlcCByZWFkaW5nCisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nKCJCYWQgU3RhdHVzOiAiKSArIHN0YXR1cyk7CisgIH0KK30KKwordm9pZCBUSHR0cENsaWVudDo6Zmx1c2goKSB7CisgIC8vIEZldGNoIHRoZSBjb250ZW50cyBvZiB0aGUgd3JpdGUgYnVmZmVyCisgIHVpbnQ4X3QqIGJ1ZjsKKyAgdWludDMyX3QgbGVuOworICB3cml0ZUJ1ZmZlcl8uZ2V0QnVmZmVyKCZidWYsICZsZW4pOworCisgIC8vIENvbnN0cnVjdCB0aGUgSFRUUCBoZWFkZXIKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGg7CisgIGggPDwgIlBPU1QgIiA8PCBwYXRoXyA8PCAiIEhUVFAvMS4xIiA8PCBDUkxGIDw8ICJIb3N0OiAiIDw8IGhvc3RfIDw8IENSTEYKKyAgICA8PCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCIgPDwgQ1JMRiA8PCAiQ29udGVudC1MZW5ndGg6ICIgPDwgbGVuIDw8IENSTEYKKyAgICA8PCAiQWNjZXB0OiBhcHBsaWNhdGlvbi94LXRocmlmdCIgPDwgQ1JMRiA8PCAiVXNlci1BZ2VudDogVGhyaWZ0LyIgPDwgUEFDS0FHRV9WRVJTSU9OCisgICAgPDwgIiAoQysrL1RIdHRwQ2xpZW50KSIgPDwgQ1JMRiA8PCBDUkxGOworICBzdHJpbmcgaGVhZGVyID0gaC5zdHIoKTsKKworICBpZiAoaGVhZGVyLnNpemUoKSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIkhlYWRlciB0b28gYmlnIik7CisgIC8vIFdyaXRlIHRoZSBoZWFkZXIsIHRoZW4gdGhlIGRhdGEsIHRoZW4gZmx1c2gKKyAgdHJhbnNwb3J0Xy0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QqKWhlYWRlci5jX3N0cigpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaGVhZGVyLnNpemUoKSkpOworICB0cmFuc3BvcnRfLT53cml0ZShidWYsIGxlbik7CisgIHRyYW5zcG9ydF8tPmZsdXNoKCk7CisKKyAgLy8gUmVzZXQgdGhlIGJ1ZmZlciBhbmQgaGVhZGVyIHZhcmlhYmxlcworICB3cml0ZUJ1ZmZlcl8ucmVzZXRCdWZmZXIoKTsKKyAgcmVhZEhlYWRlcnNfID0gdHJ1ZTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZmIxMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQQ0xJRU5UX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQQ0xJRU5UX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitjbGFzcyBUSHR0cENsaWVudCA6IHB1YmxpYyBUSHR0cFRyYW5zcG9ydCB7CitwdWJsaWM6CisgIFRIdHRwQ2xpZW50KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHN0ZDo6c3RyaW5nIGhvc3QsIHN0ZDo6c3RyaW5nIHBhdGggPSAiIik7CisKKyAgVEh0dHBDbGllbnQoc3RkOjpzdHJpbmcgaG9zdCwgaW50IHBvcnQsIHN0ZDo6c3RyaW5nIHBhdGggPSAiIik7CisKKyAgdmlydHVhbCB+VEh0dHBDbGllbnQoKTsKKworICB2aXJ0dWFsIHZvaWQgZmx1c2goKTsKKworcHJvdGVjdGVkOgorICBzdGQ6OnN0cmluZyBob3N0XzsKKyAgc3RkOjpzdHJpbmcgcGF0aF87CisKKyAgdmlydHVhbCB2b2lkIHBhcnNlSGVhZGVyKGNoYXIqIGhlYWRlcik7CisgIHZpcnR1YWwgYm9vbCBwYXJzZVN0YXR1c0xpbmUoY2hhciogc3RhdHVzKTsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBDTElFTlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZiMjQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDx0aHJpZnQvY29uZmlnLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pCisgICNpbmNsdWRlIDxTaGx3YXBpLmg+CisjZW5kaWYKKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworVEh0dHBTZXJ2ZXI6OlRIdHRwU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIDogVEh0dHBUcmFuc3BvcnQodHJhbnNwb3J0KSB7Cit9CisKK1RIdHRwU2VydmVyOjp+VEh0dHBTZXJ2ZXIoKSB7Cit9CisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorICAjZGVmaW5lIFRIUklGVF9HTVRJTUUoVE0sIFRJTUUpICAgICAgICAgICAgIGdtdGltZV9zKCZUTSwgJlRJTUUpCisgICNkZWZpbmUgVEhSSUZUX3N0cm5jYXNlY21wKHN0cjEsIHN0cjIsIGxlbikgX3N0cm5pY21wKHN0cjEsIHN0cjIsIGxlbikKKyAgI2RlZmluZSBUSFJJRlRfc3RyY2FzZXN0cihoYXlzdGFjaywgbmVlZGxlKSBTdHJTdHJJQShoYXlzdGFjaywgbmVlZGxlKQorI2Vsc2UKKyAgI2RlZmluZSBUSFJJRlRfR01USU1FKFRNLCBUSU1FKSAgICAgICAgICAgICBnbXRpbWVfcigmVElNRSwgJlRNKQorICAjZGVmaW5lIFRIUklGVF9zdHJuY2FzZWNtcChzdHIxLCBzdHIyLCBsZW4pIHN0cm5jYXNlY21wKHN0cjEsIHN0cjIsIGxlbikKKyAgI2RlZmluZSBUSFJJRlRfc3RyY2FzZXN0cihoYXlzdGFjaywgbmVlZGxlKSBzdHJjYXNlc3RyKGhheXN0YWNrLCBuZWVkbGUpCisjZW5kaWYKKwordm9pZCBUSHR0cFNlcnZlcjo6cGFyc2VIZWFkZXIoY2hhciogaGVhZGVyKSB7CisgIGNoYXIqIGNvbG9uID0gc3RyY2hyKGhlYWRlciwgJzonKTsKKyAgaWYgKGNvbG9uID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgc2l6ZV90IHN6ID0gY29sb24gLSBoZWFkZXI7CisgIGNoYXIqIHZhbHVlID0gY29sb24gKyAxOworCisgIGlmIChUSFJJRlRfc3RybmNhc2VjbXAoaGVhZGVyLCAiVHJhbnNmZXItRW5jb2RpbmciLCBzeikgPT0gMCkgeworICAgIGlmIChUSFJJRlRfc3RyY2FzZXN0cih2YWx1ZSwgImNodW5rZWQiKSAhPSBOVUxMKSB7CisgICAgICBjaHVua2VkXyA9IHRydWU7CisgICAgfQorICB9IGVsc2UgaWYgKFRIUklGVF9zdHJuY2FzZWNtcChoZWFkZXIsICJDb250ZW50LWxlbmd0aCIsIHN6KSA9PSAwKSB7CisgICAgY2h1bmtlZF8gPSBmYWxzZTsKKyAgICBjb250ZW50TGVuZ3RoXyA9IGF0b2kodmFsdWUpOworICB9IGVsc2UgaWYgKHN0cm5jbXAoaGVhZGVyLCAiWC1Gb3J3YXJkZWQtRm9yIiwgc3opID09IDApIHsKKyAgICBvcmlnaW5fID0gdmFsdWU7CisgIH0KK30KKworYm9vbCBUSHR0cFNlcnZlcjo6cGFyc2VTdGF0dXNMaW5lKGNoYXIqIHN0YXR1cykgeworICBjaGFyKiBtZXRob2QgPSBzdGF0dXM7CisKKyAgY2hhciogcGF0aCA9IHN0cmNocihtZXRob2QsICcgJyk7CisgIGlmIChwYXRoID09IE5VTEwpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZygiQmFkIFN0YXR1czogIikgKyBzdGF0dXMpOworICB9CisKKyAgKnBhdGggPSAnXDAnOworICB3aGlsZSAoKigrK3BhdGgpID09ICcgJykgeworICB9OworCisgIGNoYXIqIGh0dHAgPSBzdHJjaHIocGF0aCwgJyAnKTsKKyAgaWYgKGh0dHAgPT0gTlVMTCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nKCJCYWQgU3RhdHVzOiAiKSArIHN0YXR1cyk7CisgIH0KKyAgKmh0dHAgPSAnXDAnOworCisgIGlmIChzdHJjbXAobWV0aG9kLCAiUE9TVCIpID09IDApIHsKKyAgICAvLyBQT1NUIG1ldGhvZCBvaywgbG9va2luZyBmb3IgY29udGVudC4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmIChzdHJjbXAobWV0aG9kLCAiT1BUSU9OUyIpID09IDApIHsKKyAgICAvLyBwcmVmbGlnaHQgT1BUSU9OUyBtZXRob2QsIHdlIGRvbid0IG5lZWQgZnVydGhlciBjb250ZW50LgorICAgIC8vIGhvdyB0byBncmFjaW91c2x5IGNsb3NlIGNvbm5lY3Rpb24/CisgICAgdWludDhfdCogYnVmOworICAgIHVpbnQzMl90IGxlbjsKKyAgICB3cml0ZUJ1ZmZlcl8uZ2V0QnVmZmVyKCZidWYsICZsZW4pOworCisgICAgLy8gQ29uc3RydWN0IHRoZSBIVFRQIGhlYWRlcgorICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBoOworICAgIGggPDwgIkhUVFAvMS4xIDIwMCBPSyIgPDwgQ1JMRiA8PCAiRGF0ZTogIiA8PCBnZXRUaW1lUkZDMTEyMygpIDw8IENSTEYKKyAgICAgIDw8ICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoiIDw8IENSTEYgPDwgIkFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHM6IFBPU1QsIE9QVElPTlMiCisgICAgICA8PCBDUkxGIDw8ICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzOiBDb250ZW50LVR5cGUiIDw8IENSTEYgPDwgQ1JMRjsKKyAgICBzdHJpbmcgaGVhZGVyID0gaC5zdHIoKTsKKworICAgIC8vIFdyaXRlIHRoZSBoZWFkZXIsIHRoZW4gdGhlIGRhdGEsIHRoZW4gZmx1c2gKKyAgICB0cmFuc3BvcnRfLT53cml0ZSgoY29uc3QgdWludDhfdCopaGVhZGVyLmNfc3RyKCksIHN0YXRpY19jYXN0PHVpbnQzMl90PihoZWFkZXIuc2l6ZSgpKSk7CisgICAgdHJhbnNwb3J0Xy0+d3JpdGUoYnVmLCBsZW4pOworICAgIHRyYW5zcG9ydF8tPmZsdXNoKCk7CisKKyAgICAvLyBSZXNldCB0aGUgYnVmZmVyIGFuZCBoZWFkZXIgdmFyaWFibGVzCisgICAgd3JpdGVCdWZmZXJfLnJlc2V0QnVmZmVyKCk7CisgICAgcmVhZEhlYWRlcnNfID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZygiQmFkIFN0YXR1cyAodW5zdXBwb3J0ZWQgbWV0aG9kKTogIikgKyBzdGF0dXMpOworfQorCit2b2lkIFRIdHRwU2VydmVyOjpmbHVzaCgpIHsKKyAgLy8gRmV0Y2ggdGhlIGNvbnRlbnRzIG9mIHRoZSB3cml0ZSBidWZmZXIKKyAgdWludDhfdCogYnVmOworICB1aW50MzJfdCBsZW47CisgIHdyaXRlQnVmZmVyXy5nZXRCdWZmZXIoJmJ1ZiwgJmxlbik7CisKKyAgLy8gQ29uc3RydWN0IHRoZSBIVFRQIGhlYWRlcgorICBzdGQ6Om9zdHJpbmdzdHJlYW0gaDsKKyAgaCA8PCAiSFRUUC8xLjEgMjAwIE9LIiA8PCBDUkxGIDw8ICJEYXRlOiAiIDw8IGdldFRpbWVSRkMxMTIzKCkgPDwgQ1JMRiA8PCAiU2VydmVyOiBUaHJpZnQvIgorICAgIDw8IFBBQ0tBR0VfVkVSU0lPTiA8PCBDUkxGIDw8ICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoiIDw8IENSTEYKKyAgICA8PCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCIgPDwgQ1JMRiA8PCAiQ29udGVudC1MZW5ndGg6ICIgPDwgbGVuIDw8IENSTEYKKyAgICA8PCAiQ29ubmVjdGlvbjogS2VlcC1BbGl2ZSIgPDwgQ1JMRiA8PCBDUkxGOworICBzdHJpbmcgaGVhZGVyID0gaC5zdHIoKTsKKworICAvLyBXcml0ZSB0aGUgaGVhZGVyLCB0aGVuIHRoZSBkYXRhLCB0aGVuIGZsdXNoCisgIC8vIGNhc3Qgc2hvdWxkIGJlIGZpbmUsIGJlY2F1c2Ugbm9uZSBvZiAiaGVhZGVyIiBpcyB1bmRlciBhdHRhY2tlciBjb250cm9sCisgIHRyYW5zcG9ydF8tPndyaXRlKChjb25zdCB1aW50OF90KiloZWFkZXIuY19zdHIoKSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGhlYWRlci5zaXplKCkpKTsKKyAgdHJhbnNwb3J0Xy0+d3JpdGUoYnVmLCBsZW4pOworICB0cmFuc3BvcnRfLT5mbHVzaCgpOworCisgIC8vIFJlc2V0IHRoZSBidWZmZXIgYW5kIGhlYWRlciB2YXJpYWJsZXMKKyAgd3JpdGVCdWZmZXJfLnJlc2V0QnVmZmVyKCk7CisgIHJlYWRIZWFkZXJzXyA9IHRydWU7Cit9CisKK3N0ZDo6c3RyaW5nIFRIdHRwU2VydmVyOjpnZXRUaW1lUkZDMTEyMygpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIERheXNbXSA9IHsiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0In07CisgIHN0YXRpYyBjb25zdCBjaGFyKiBNb250aHNbXQorICAgICAgPSB7IkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIn07CisgIGNoYXIgYnVmZlsxMjhdOworCisgIHRpbWVfdCB0ID0gdGltZShOVUxMKTsKKyAgc3RydWN0IHRtIHRtYjsKKyAgVEhSSUZUX0dNVElNRSh0bWIsIHQpOworCisgIHNwcmludGYoYnVmZiwKKyAgICAgICAgICAiJXMsICVkICVzICVkICVkOiVkOiVkIEdNVCIsCisgICAgICAgICAgRGF5c1t0bWIudG1fd2RheV0sCisgICAgICAgICAgdG1iLnRtX21kYXksCisgICAgICAgICAgTW9udGhzW3RtYi50bV9tb25dLAorICAgICAgICAgIHRtYi50bV95ZWFyICsgMTkwMCwKKyAgICAgICAgICB0bWIudG1faG91ciwKKyAgICAgICAgICB0bWIudG1fbWluLAorICAgICAgICAgIHRtYi50bV9zZWMpOworICByZXR1cm4gc3RkOjpzdHJpbmcoYnVmZik7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzg2MDZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9USFRUUFNFUlZFUl9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9USFRUUFNFUlZFUl9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworY2xhc3MgVEh0dHBTZXJ2ZXIgOiBwdWJsaWMgVEh0dHBUcmFuc3BvcnQgeworcHVibGljOgorICBUSHR0cFNlcnZlcihzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KTsKKworICB2aXJ0dWFsIH5USHR0cFNlcnZlcigpOworCisgIHZpcnR1YWwgdm9pZCBmbHVzaCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgcmVhZEhlYWRlcnMoKTsKKyAgdmlydHVhbCB2b2lkIHBhcnNlSGVhZGVyKGNoYXIqIGhlYWRlcik7CisgIHZpcnR1YWwgYm9vbCBwYXJzZVN0YXR1c0xpbmUoY2hhciogc3RhdHVzKTsKKyAgc3RkOjpzdHJpbmcgZ2V0VGltZVJGQzExMjMoKTsKK307CisKKy8qKgorICogV3JhcHMgYSB0cmFuc3BvcnQgaW50byBIVFRQIHByb3RvY29sCisgKi8KK2NsYXNzIFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7CitwdWJsaWM6CisgIFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisKKyAgdmlydHVhbCB+VEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5KCkge30KKworICAvKioKKyAgICogV3JhcHMgdGhlIHRyYW5zcG9ydCBpbnRvIGEgYnVmZmVyZWQgb25lLgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRIdHRwU2VydmVyKHRyYW5zKSk7CisgIH0KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNjYzAzNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuY3BwCkBAIC0wLDAgKzEsMjcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oPgorCit1c2luZyBzdGQ6OnN0cmluZzsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvLyBZZWFoLCB5ZWFoLCBoYWNreSB0byBwdXQgdGhlc2UgaGVyZSwgSSBrbm93LgorY29uc3QgY2hhciogVEh0dHBUcmFuc3BvcnQ6OkNSTEYgPSAiXHJcbiI7Citjb25zdCBpbnQgVEh0dHBUcmFuc3BvcnQ6OkNSTEZfTEVOID0gMjsKKworVEh0dHBUcmFuc3BvcnQ6OlRIdHRwVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpCisgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAorICAgIG9yaWdpbl8oIiIpLAorICAgIHJlYWRIZWFkZXJzXyh0cnVlKSwKKyAgICBjaHVua2VkXyhmYWxzZSksCisgICAgY2h1bmtlZERvbmVfKGZhbHNlKSwKKyAgICBjaHVua1NpemVfKDApLAorICAgIGNvbnRlbnRMZW5ndGhfKDApLAorICAgIGh0dHBCdWZfKE5VTEwpLAorICAgIGh0dHBQb3NfKDApLAorICAgIGh0dHBCdWZMZW5fKDApLAorICAgIGh0dHBCdWZTaXplXygxMDI0KSB7CisgIGluaXQoKTsKK30KKwordm9pZCBUSHR0cFRyYW5zcG9ydDo6aW5pdCgpIHsKKyAgaHR0cEJ1Zl8gPSAoY2hhciopc3RkOjptYWxsb2MoaHR0cEJ1ZlNpemVfICsgMSk7CisgIGlmIChodHRwQnVmXyA9PSBOVUxMKSB7CisgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKyAgfQorICBodHRwQnVmX1todHRwQnVmTGVuX10gPSAnXDAnOworfQorCitUSHR0cFRyYW5zcG9ydDo6flRIdHRwVHJhbnNwb3J0KCkgeworICBpZiAoaHR0cEJ1Zl8gIT0gTlVMTCkgeworICAgIHN0ZDo6ZnJlZShodHRwQnVmXyk7CisgIH0KK30KKwordWludDMyX3QgVEh0dHBUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgaWYgKHJlYWRCdWZmZXJfLmF2YWlsYWJsZV9yZWFkKCkgPT0gMCkgeworICAgIHJlYWRCdWZmZXJfLnJlc2V0QnVmZmVyKCk7CisgICAgdWludDMyX3QgZ290ID0gcmVhZE1vcmVEYXRhKCk7CisgICAgaWYgKGdvdCA9PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlYWRCdWZmZXJfLnJlYWQoYnVmLCBsZW4pOworfQorCit1aW50MzJfdCBUSHR0cFRyYW5zcG9ydDo6cmVhZEVuZCgpIHsKKyAgLy8gUmVhZCBhbnkgcGVuZGluZyBjaHVua2VkIGRhdGEgKGZvb3RlcnMgZXRjLikKKyAgaWYgKGNodW5rZWRfKSB7CisgICAgd2hpbGUgKCFjaHVua2VkRG9uZV8pIHsKKyAgICAgIHJlYWRDaHVua2VkKCk7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCit1aW50MzJfdCBUSHR0cFRyYW5zcG9ydDo6cmVhZE1vcmVEYXRhKCkgeworICB1aW50MzJfdCBzaXplOworCisgIGlmIChodHRwUG9zXyA9PSBodHRwQnVmTGVuXykgeworICAgIC8vIEdldCBtb3JlIGRhdGEhCisgICAgcmVmaWxsKCk7CisgIH0KKworICBpZiAocmVhZEhlYWRlcnNfKSB7CisgICAgcmVhZEhlYWRlcnMoKTsKKyAgfQorCisgIGlmIChjaHVua2VkXykgeworICAgIHNpemUgPSByZWFkQ2h1bmtlZCgpOworICB9IGVsc2UgeworICAgIHNpemUgPSByZWFkQ29udGVudChjb250ZW50TGVuZ3RoXyk7CisgICAgcmVhZEhlYWRlcnNfID0gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBzaXplOworfQorCit1aW50MzJfdCBUSHR0cFRyYW5zcG9ydDo6cmVhZENodW5rZWQoKSB7CisgIHVpbnQzMl90IGxlbmd0aCA9IDA7CisKKyAgY2hhciogbGluZSA9IHJlYWRMaW5lKCk7CisgIHVpbnQzMl90IGNodW5rU2l6ZSA9IHBhcnNlQ2h1bmtTaXplKGxpbmUpOworICBpZiAoY2h1bmtTaXplID09IDApIHsKKyAgICByZWFkQ2h1bmtlZEZvb3RlcnMoKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBSZWFkIGRhdGEgY29udGVudAorICAgIGxlbmd0aCArPSByZWFkQ29udGVudChjaHVua1NpemUpOworICAgIC8vIFJlYWQgdHJhaWxpbmcgQ1JMRiBhZnRlciBjb250ZW50CisgICAgcmVhZExpbmUoKTsKKyAgfQorICByZXR1cm4gbGVuZ3RoOworfQorCit2b2lkIFRIdHRwVHJhbnNwb3J0OjpyZWFkQ2h1bmtlZEZvb3RlcnMoKSB7CisgIC8vIEVuZCBvZiBkYXRhLCByZWFkIGZvb3RlciBsaW5lcyB1bnRpbCBhIGJsYW5rIG9uZSBhcHBlYXJzCisgIHdoaWxlICh0cnVlKSB7CisgICAgY2hhciogbGluZSA9IHJlYWRMaW5lKCk7CisgICAgaWYgKHN0cmxlbihsaW5lKSA9PSAwKSB7CisgICAgICBjaHVua2VkRG9uZV8gPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK3VpbnQzMl90IFRIdHRwVHJhbnNwb3J0OjpwYXJzZUNodW5rU2l6ZShjaGFyKiBsaW5lKSB7CisgIGNoYXIqIHNlbWkgPSBzdHJjaHIobGluZSwgJzsnKTsKKyAgaWYgKHNlbWkgIT0gTlVMTCkgeworICAgICpzZW1pID0gJ1wwJzsKKyAgfQorICB1aW50MzJfdCBzaXplID0gMDsKKyAgc3NjYW5mKGxpbmUsICIleCIsICZzaXplKTsKKyAgcmV0dXJuIHNpemU7Cit9CisKK3VpbnQzMl90IFRIdHRwVHJhbnNwb3J0OjpyZWFkQ29udGVudCh1aW50MzJfdCBzaXplKSB7CisgIHVpbnQzMl90IG5lZWQgPSBzaXplOworICB3aGlsZSAobmVlZCA+IDApIHsKKyAgICB1aW50MzJfdCBhdmFpbCA9IGh0dHBCdWZMZW5fIC0gaHR0cFBvc187CisgICAgaWYgKGF2YWlsID09IDApIHsKKyAgICAgIC8vIFdlIGhhdmUgZ2l2ZW4gYWxsIHRoZSBkYXRhLCByZXNldCBwb3NpdGlvbiB0byBoZWFkIG9mIHRoZSBidWZmZXIKKyAgICAgIGh0dHBQb3NfID0gMDsKKyAgICAgIGh0dHBCdWZMZW5fID0gMDsKKyAgICAgIHJlZmlsbCgpOworCisgICAgICAvLyBOb3cgaGF2ZSBhdmFpbGFibGUgaG93ZXZlciBtdWNoIHdlIHJlYWQKKyAgICAgIGF2YWlsID0gaHR0cEJ1Zkxlbl87CisgICAgfQorICAgIHVpbnQzMl90IGdpdmUgPSBhdmFpbDsKKyAgICBpZiAobmVlZCA8IGdpdmUpIHsKKyAgICAgIGdpdmUgPSBuZWVkOworICAgIH0KKyAgICByZWFkQnVmZmVyXy53cml0ZSgodWludDhfdCopKGh0dHBCdWZfICsgaHR0cFBvc18pLCBnaXZlKTsKKyAgICBodHRwUG9zXyArPSBnaXZlOworICAgIG5lZWQgLT0gZ2l2ZTsKKyAgfQorICByZXR1cm4gc2l6ZTsKK30KKworY2hhciogVEh0dHBUcmFuc3BvcnQ6OnJlYWRMaW5lKCkgeworICB3aGlsZSAodHJ1ZSkgeworICAgIGNoYXIqIGVvbCA9IE5VTEw7CisKKyAgICBlb2wgPSBzdHJzdHIoaHR0cEJ1Zl8gKyBodHRwUG9zXywgQ1JMRik7CisKKyAgICAvLyBObyBDUkxGIHlldD8KKyAgICBpZiAoZW9sID09IE5VTEwpIHsKKyAgICAgIC8vIFNoaWZ0IHdoYXRldmVyIHdlIGhhdmUgbm93IHRvIGZyb250IGFuZCByZWZpbGwKKyAgICAgIHNoaWZ0KCk7CisgICAgICByZWZpbGwoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gUmV0dXJuIHBvaW50ZXIgdG8gbmV4dCBsaW5lCisgICAgICAqZW9sID0gJ1wwJzsKKyAgICAgIGNoYXIqIGxpbmUgPSBodHRwQnVmXyArIGh0dHBQb3NfOworICAgICAgaHR0cFBvc18gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oKGVvbCAtIGh0dHBCdWZfKSArIENSTEZfTEVOKTsKKyAgICAgIHJldHVybiBsaW5lOworICAgIH0KKyAgfQorfQorCit2b2lkIFRIdHRwVHJhbnNwb3J0OjpzaGlmdCgpIHsKKyAgaWYgKGh0dHBCdWZMZW5fID4gaHR0cFBvc18pIHsKKyAgICAvLyBTaGlmdCBkb3duIHJlbWFpbmluZyBkYXRhIGFuZCByZWFkIG1vcmUKKyAgICB1aW50MzJfdCBsZW5ndGggPSBodHRwQnVmTGVuXyAtIGh0dHBQb3NfOworICAgIG1lbW1vdmUoaHR0cEJ1Zl8sIGh0dHBCdWZfICsgaHR0cFBvc18sIGxlbmd0aCk7CisgICAgaHR0cEJ1Zkxlbl8gPSBsZW5ndGg7CisgIH0gZWxzZSB7CisgICAgaHR0cEJ1Zkxlbl8gPSAwOworICB9CisgIGh0dHBQb3NfID0gMDsKKyAgaHR0cEJ1Zl9baHR0cEJ1Zkxlbl9dID0gJ1wwJzsKK30KKwordm9pZCBUSHR0cFRyYW5zcG9ydDo6cmVmaWxsKCkgeworICB1aW50MzJfdCBhdmFpbCA9IGh0dHBCdWZTaXplXyAtIGh0dHBCdWZMZW5fOworICBpZiAoYXZhaWwgPD0gKGh0dHBCdWZTaXplXyAvIDQpKSB7CisgICAgaHR0cEJ1ZlNpemVfICo9IDI7CisgICAgY2hhciogdG1wQnVmID0gKGNoYXIqKXN0ZDo6cmVhbGxvYyhodHRwQnVmXywgaHR0cEJ1ZlNpemVfICsgMSk7CisgICAgaWYgKHRtcEJ1ZiA9PSBOVUxMKSB7CisgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworICAgIH0KKyAgICBodHRwQnVmXyA9IHRtcEJ1ZjsKKyAgfQorCisgIC8vIFJlYWQgbW9yZSBkYXRhCisgIHVpbnQzMl90IGdvdCA9IHRyYW5zcG9ydF8tPnJlYWQoKHVpbnQ4X3QqKShodHRwQnVmXyArIGh0dHBCdWZMZW5fKSwgaHR0cEJ1ZlNpemVfIC0gaHR0cEJ1Zkxlbl8pOworICBodHRwQnVmTGVuXyArPSBnb3Q7CisgIGh0dHBCdWZfW2h0dHBCdWZMZW5fXSA9ICdcMCc7CisKKyAgaWYgKGdvdCA9PSAwKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSwgIkNvdWxkIG5vdCByZWZpbGwgYnVmZmVyIik7CisgIH0KK30KKwordm9pZCBUSHR0cFRyYW5zcG9ydDo6cmVhZEhlYWRlcnMoKSB7CisgIC8vIEluaXRpYWxpemUgaGVhZGVycyBzdGF0ZSB2YXJpYWJsZXMKKyAgY29udGVudExlbmd0aF8gPSAwOworICBjaHVua2VkXyA9IGZhbHNlOworICBjaHVua2VkRG9uZV8gPSBmYWxzZTsKKyAgY2h1bmtTaXplXyA9IDA7CisKKyAgLy8gQ29udHJvbCBzdGF0ZSBmbG93CisgIGJvb2wgc3RhdHVzTGluZSA9IHRydWU7CisgIGJvb2wgZmluaXNoZWQgPSBmYWxzZTsKKworICAvLyBMb29wIHVudGlsIGhlYWRlcnMgYXJlIGZpbmlzaGVkCisgIHdoaWxlICh0cnVlKSB7CisgICAgY2hhciogbGluZSA9IHJlYWRMaW5lKCk7CisKKyAgICBpZiAoc3RybGVuKGxpbmUpID09IDApIHsKKyAgICAgIGlmIChmaW5pc2hlZCkgeworICAgICAgICByZWFkSGVhZGVyc18gPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTXVzdCBoYXZlIGJlZW4gYW4gSFRUUCAxMDAsIGtlZXAgZ29pbmcgZm9yIGFub3RoZXIgc3RhdHVzIGxpbmUKKyAgICAgICAgc3RhdHVzTGluZSA9IHRydWU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChzdGF0dXNMaW5lKSB7CisgICAgICAgIHN0YXR1c0xpbmUgPSBmYWxzZTsKKyAgICAgICAgZmluaXNoZWQgPSBwYXJzZVN0YXR1c0xpbmUobGluZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwYXJzZUhlYWRlcihsaW5lKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBUSHR0cFRyYW5zcG9ydDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgd3JpdGVCdWZmZXJfLndyaXRlKGJ1ZiwgbGVuKTsKK30KKworY29uc3Qgc3RkOjpzdHJpbmcgVEh0dHBUcmFuc3BvcnQ6OmdldE9yaWdpbigpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgaWYgKCFvcmlnaW5fLmVtcHR5KCkpIHsKKyAgICBvc3MgPDwgb3JpZ2luXyA8PCAiLCAiOworICB9CisgIG9zcyA8PCB0cmFuc3BvcnRfLT5nZXRPcmlnaW4oKTsKKyAgcmV0dXJuIG9zcy5zdHIoKTsKK30KK30KK30KK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDZhYjdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBUUkFOU1BPUlRfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBUUkFOU1BPUlRfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIEhUVFAgaW1wbGVtZW50YXRpb24gb2YgdGhlIHRocmlmdCB0cmFuc3BvcnQuIFRoaXMgd2FzIGlycml0YXRpbmcKKyAqIHRvIHdyaXRlLCBidXQgdGhlIGFsdGVybmF0aXZlcyBpbiBDKysgbGFuZCBhcmUgZGF1bnRpbmcuIExpbmtpbmcgQ1VSTAorICogcmVxdWlyZXMgMjMgZHluYW1pYyBsaWJyYXJpZXMgbGFzdCB0aW1lIEkgY2hlY2tlZCAoV1RGPyE/KS4gQWxsIHdlIGhhdmUKKyAqIGhlcmUgaXMgYSBWRVJZIGJhc2ljIEhUVFAvMS4xIGNsaWVudCB3aGljaCBzdXBwb3J0cyBIVFRQIDEwMCBDb250aW51ZSwKKyAqIGNodW5rZWQgdHJhbnNmZXIgZW5jb2RpbmcsIGtlZXBhbGl2ZSwgZXRjLiBUZXN0ZWQgYWdhaW5zdCBBcGFjaGUuCisgKi8KK2NsYXNzIFRIdHRwVHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRIdHRwVHJhbnNwb3J0PiB7CitwdWJsaWM6CisgIFRIdHRwVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpOworCisgIHZpcnR1YWwgflRIdHRwVHJhbnNwb3J0KCk7CisKKyAgdm9pZCBvcGVuKCkgeyB0cmFuc3BvcnRfLT5vcGVuKCk7IH0KKworICBib29sIGlzT3BlbigpIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmlzT3BlbigpOyB9CisKKyAgYm9vbCBwZWVrKCkgeyByZXR1cm4gdHJhbnNwb3J0Xy0+cGVlaygpOyB9CisKKyAgdm9pZCBjbG9zZSgpIHsgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsgfQorCisgIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHVpbnQzMl90IHJlYWRFbmQoKTsKKworICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICB2aXJ0dWFsIHZvaWQgZmx1c2goKSA9IDA7CisKKyAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyBnZXRPcmlnaW4oKTsKKworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKKyAgc3RkOjpzdHJpbmcgb3JpZ2luXzsKKworICBUTWVtb3J5QnVmZmVyIHdyaXRlQnVmZmVyXzsKKyAgVE1lbW9yeUJ1ZmZlciByZWFkQnVmZmVyXzsKKworICBib29sIHJlYWRIZWFkZXJzXzsKKyAgYm9vbCBjaHVua2VkXzsKKyAgYm9vbCBjaHVua2VkRG9uZV87CisgIHVpbnQzMl90IGNodW5rU2l6ZV87CisgIHVpbnQzMl90IGNvbnRlbnRMZW5ndGhfOworCisgIGNoYXIqIGh0dHBCdWZfOworICB1aW50MzJfdCBodHRwUG9zXzsKKyAgdWludDMyX3QgaHR0cEJ1Zkxlbl87CisgIHVpbnQzMl90IGh0dHBCdWZTaXplXzsKKworICB2aXJ0dWFsIHZvaWQgaW5pdCgpOworCisgIHVpbnQzMl90IHJlYWRNb3JlRGF0YSgpOworICBjaGFyKiByZWFkTGluZSgpOworCisgIHZvaWQgcmVhZEhlYWRlcnMoKTsKKyAgdmlydHVhbCB2b2lkIHBhcnNlSGVhZGVyKGNoYXIqIGhlYWRlcikgPSAwOworICB2aXJ0dWFsIGJvb2wgcGFyc2VTdGF0dXNMaW5lKGNoYXIqIHN0YXR1cykgPSAwOworCisgIHVpbnQzMl90IHJlYWRDaHVua2VkKCk7CisgIHZvaWQgcmVhZENodW5rZWRGb290ZXJzKCk7CisgIHVpbnQzMl90IHBhcnNlQ2h1bmtTaXplKGNoYXIqIGxpbmUpOworCisgIHVpbnQzMl90IHJlYWRDb250ZW50KHVpbnQzMl90IHNpemUpOworCisgIHZvaWQgcmVmaWxsKCk7CisgIHZvaWQgc2hpZnQoKTsKKworICBzdGF0aWMgY29uc3QgY2hhciogQ1JMRjsKKyAgc3RhdGljIGNvbnN0IGludCBDUkxGX0xFTjsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBDTElFTlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGVjNWQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBOb25ibG9ja2luZyBTU0wgc2VydmVyIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KKyAqLworVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0OjpUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSkKKyAgOiBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCksIGZhY3RvcnlfKGZhY3RvcnkpIHsKKyAgZmFjdG9yeV8tPnNlcnZlcih0cnVlKTsKK30KKworVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0OjpUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpCisgIDogVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KGFkZHJlc3MsIHBvcnQpLCBmYWN0b3J5XyhmYWN0b3J5KSB7CisgIGZhY3RvcnlfLT5zZXJ2ZXIodHJ1ZSk7Cit9CisKK1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldDo6VE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0KGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VuZFRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWN2VGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KQorICA6IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0LCBzZW5kVGltZW91dCwgcmVjdlRpbWVvdXQpLCBmYWN0b3J5XyhmYWN0b3J5KSB7CisgIGZhY3RvcnlfLT5zZXJ2ZXIodHJ1ZSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQ6OmNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIGNsaWVudCkgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gdFNTTFNvY2tldDsKKyAgdFNTTFNvY2tldCA9IGZhY3RvcnlfLT5jcmVhdGVTb2NrZXQoY2xpZW50KTsKKyAgdFNTTFNvY2tldC0+c2V0TGliZXZlbnRTYWZlKCk7CisgIHJldHVybiB0U1NMU29ja2V0OworfQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE1YzQwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1ROT05CTE9DS0lOR1NTTFNFUlZFUlNPQ0tFVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UTk9OQkxPQ0tJTkdTU0xTRVJWRVJTT0NLRVRfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitjbGFzcyBUU1NMU29ja2V0RmFjdG9yeTsKKworLyoqCisgKiBOb25ibG9ja2luZyBTZXJ2ZXIgc29ja2V0IHRoYXQgYWNjZXB0cyBTU0wgY29ubmVjdGlvbnMuCisgKi8KK2NsYXNzIFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldCA6IHB1YmxpYyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgeworcHVibGljOgorICAvKioKKyAgICogQ29uc3RydWN0b3IuICBCaW5kcyB0byBhbGwgaW50ZXJmYWNlcy4KKyAgICoKKyAgICogQHBhcmFtIHBvcnQgICAgTGlzdGVuaW5nIHBvcnQKKyAgICogQHBhcmFtIGZhY3RvcnkgU1NMIHNvY2tldCBmYWN0b3J5IGltcGxlbWVudGF0aW9uCisgICAqLworICBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLiAgQmluZHMgdG8gdGhlIHNwZWNpZmllZCBhZGRyZXNzLgorICAgKgorICAgKiBAcGFyYW0gYWRkcmVzcyBBZGRyZXNzIHRvIGJpbmQgdG8KKyAgICogQHBhcmFtIHBvcnQgICAgTGlzdGVuaW5nIHBvcnQKKyAgICogQHBhcmFtIGZhY3RvcnkgU1NMIHNvY2tldCBmYWN0b3J5IGltcGxlbWVudGF0aW9uCisgICAqLworICBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuICBCaW5kcyB0byBhbGwgaW50ZXJmYWNlcy4KKyAgICoKKyAgICogQHBhcmFtIHBvcnQgICAgICAgIExpc3RlbmluZyBwb3J0CisgICAqIEBwYXJhbSBzZW5kVGltZW91dCBTb2NrZXQgc2VuZCB0aW1lb3V0CisgICAqIEBwYXJhbSByZWN2VGltZW91dCBTb2NrZXQgcmVjZWl2ZSB0aW1lb3V0CisgICAqIEBwYXJhbSBmYWN0b3J5ICAgICBTU0wgc29ja2V0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24KKyAgICovCisgIFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICBpbnQgc2VuZFRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgaW50IHJlY3ZUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSk7CisKK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeV87Cit9OworfQorfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDM0Y2NhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuY3BwCkBAIC0wLDAgKzEsNTQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19VTl9ICisjaW5jbHVkZSA8c3lzL3VuLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19QT0xMX0gKKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfTkVUREJfSAorI2luY2x1ZGUgPG5ldGRiLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisKKyNpZm5kZWYgQUZfTE9DQUwKKyNkZWZpbmUgQUZfTE9DQUwgQUZfVU5JWAorI2VuZGlmCisKKyNpZm5kZWYgU09DS09QVF9DQVNUX1QKKyNpZm5kZWYgX1dJTjMyCisjZGVmaW5lIFNPQ0tPUFRfQ0FTVF9UIHZvaWQKKyNlbHNlCisjZGVmaW5lIFNPQ0tPUFRfQ0FTVF9UIGNoYXIKKyNlbmRpZiAvLyBfV0lOMzIKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBjb25zdCBTT0NLT1BUX0NBU1RfVCogY29uc3RfY2FzdF9zb2Nrb3B0KGNvbnN0IFQqIHYpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU09DS09QVF9DQVNUX1QqPih2KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitpbmxpbmUgU09DS09QVF9DQVNUX1QqIGNhc3Rfc29ja29wdChUKiB2KSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFNPQ0tPUFRfQ0FTVF9UKj4odik7Cit9CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK1ROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KGludCBwb3J0KQorICA6IHBvcnRfKHBvcnQpLAorICAgIGxpc3RlblBvcnRfKHBvcnQpLAorICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAgcmV0cnlMaW1pdF8oMCksCisgICAgcmV0cnlEZWxheV8oMCksCisgICAgdGNwU2VuZEJ1ZmZlcl8oMCksCisgICAgdGNwUmVjdkJ1ZmZlcl8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGlzdGVuaW5nXyhmYWxzZSkgeworfQorCitUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IHNlbmRUaW1lb3V0LCBpbnQgcmVjdlRpbWVvdXQpCisgIDogcG9ydF8ocG9ydCksCisgICAgbGlzdGVuUG9ydF8ocG9ydCksCisgICAgc2VydmVyU29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGFjY2VwdEJhY2tsb2dfKERFRkFVTFRfQkFDS0xPRyksCisgICAgc2VuZFRpbWVvdXRfKHNlbmRUaW1lb3V0KSwKKyAgICByZWN2VGltZW91dF8ocmVjdlRpbWVvdXQpLAorICAgIHJldHJ5TGltaXRfKDApLAorICAgIHJldHJ5RGVsYXlfKDApLAorICAgIHRjcFNlbmRCdWZmZXJfKDApLAorICAgIHRjcFJlY3ZCdWZmZXJfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpc3RlbmluZ18oZmFsc2UpIHsKK30KKworVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RyaW5nJiBhZGRyZXNzLCBpbnQgcG9ydCkKKyAgOiBwb3J0Xyhwb3J0KSwKKyAgICBsaXN0ZW5Qb3J0Xyhwb3J0KSwKKyAgICBhZGRyZXNzXyhhZGRyZXNzKSwKKyAgICBzZXJ2ZXJTb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgYWNjZXB0QmFja2xvZ18oREVGQVVMVF9CQUNLTE9HKSwKKyAgICBzZW5kVGltZW91dF8oMCksCisgICAgcmVjdlRpbWVvdXRfKDApLAorICAgIHJldHJ5TGltaXRfKDApLAorICAgIHJldHJ5RGVsYXlfKDApLAorICAgIHRjcFNlbmRCdWZmZXJfKDApLAorICAgIHRjcFJlY3ZCdWZmZXJfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpc3RlbmluZ18oZmFsc2UpIHsKK30KKworVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RyaW5nJiBwYXRoKQorICA6IHBvcnRfKDApLAorICAgIGxpc3RlblBvcnRfKDApLAorICAgIHBhdGhfKHBhdGgpLAorICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAgcmV0cnlMaW1pdF8oMCksCisgICAgcmV0cnlEZWxheV8oMCksCisgICAgdGNwU2VuZEJ1ZmZlcl8oMCksCisgICAgdGNwUmVjdkJ1ZmZlcl8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGlzdGVuaW5nXyhmYWxzZSkgeworfQorCitUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6On5UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoKSB7CisgIGNsb3NlKCk7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpzZXRTZW5kVGltZW91dChpbnQgc2VuZFRpbWVvdXQpIHsKKyAgc2VuZFRpbWVvdXRfID0gc2VuZFRpbWVvdXQ7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpzZXRSZWN2VGltZW91dChpbnQgcmVjdlRpbWVvdXQpIHsKKyAgcmVjdlRpbWVvdXRfID0gcmVjdlRpbWVvdXQ7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpzZXRBY2NlcHRCYWNrbG9nKGludCBhY2NCYWNrbG9nKSB7CisgIGFjY2VwdEJhY2tsb2dfID0gYWNjQmFja2xvZzsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldFJldHJ5TGltaXQoaW50IHJldHJ5TGltaXQpIHsKKyAgcmV0cnlMaW1pdF8gPSByZXRyeUxpbWl0OworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6c2V0UmV0cnlEZWxheShpbnQgcmV0cnlEZWxheSkgeworICByZXRyeURlbGF5XyA9IHJldHJ5RGVsYXk7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpzZXRUY3BTZW5kQnVmZmVyKGludCB0Y3BTZW5kQnVmZmVyKSB7CisgIHRjcFNlbmRCdWZmZXJfID0gdGNwU2VuZEJ1ZmZlcjsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldFRjcFJlY3ZCdWZmZXIoaW50IHRjcFJlY3ZCdWZmZXIpIHsKKyAgdGNwUmVjdkJ1ZmZlcl8gPSB0Y3BSZWN2QnVmZmVyOworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgeworICBsaXN0ZW5pbmdfID0gdHJ1ZTsKKyNpZmRlZiBfV0lOMzIKKyAgVFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOworI2VuZGlmIC8vIF9XSU4zMgorICAKKyAgLy8gVmFsaWRhdGUgcG9ydCBudW1iZXIKKyAgaWYgKHBvcnRfIDwgMCB8fCBwb3J0XyA+IDB4RkZGRikgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsICJTcGVjaWZpZWQgcG9ydCBpcyBpbnZhbGlkIik7CisgIH0KKworICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKnJlczsKKyAgaW50IGVycm9yOworICBjaGFyIHBvcnRbc2l6ZW9mKCI2NTUzNSIpXTsKKyAgVEhSSUZUX1NOUFJJTlRGKHBvcnQsIHNpemVvZihwb3J0KSwgIiVkIiwgcG9ydF8pOworCisgIHN0cnVjdCBhZGRyaW5mbyBoaW50czsKKyAgc3RkOjptZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKyAgaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOworICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICBoaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkUgfCBBSV9BRERSQ09ORklHOworCisgIC8vIElmIGFkZHJlc3MgaXMgbm90IHNwZWNpZmllZCB1c2Ugd2lsZGNhcmQgYWRkcmVzcyAoTlVMTCkKKyAgVEdldEFkZHJJbmZvV3JhcHBlciBpbmZvKGFkZHJlc3NfLmVtcHR5KCkgPyBOVUxMIDogJmFkZHJlc3NfWzBdLCBwb3J0LCAmaGludHMpOworCisgIGVycm9yID0gaW5mby5pbml0KCk7CisgIGlmIChlcnJvcikgeworICAgIEdsb2JhbE91dHB1dC5wcmludGYoImdldGFkZHJpbmZvICVkOiAlcyIsIGVycm9yLCBUSFJJRlRfR0FJX1NUUkVSUk9SKGVycm9yKSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCByZXNvbHZlIGhvc3QgZm9yIHNlcnZlciBzb2NrZXQuIik7CisgIH0KKworICAvLyBQaWNrIHRoZSBpcHY2IGFkZHJlc3MgZmlyc3Qgc2luY2UgaXB2NCBhZGRyZXNzZXMgY2FuIGJlIG1hcHBlZAorICAvLyBpbnRvIGlwdjYgc3BhY2UuCisgIGZvciAocmVzID0gaW5mby5yZXMoKTsgcmVzOyByZXMgPSByZXMtPmFpX25leHQpIHsKKyAgICBpZiAocmVzLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYgfHwgcmVzLT5haV9uZXh0ID09IE5VTEwpCisgICAgICBicmVhazsKKyAgfQorCisgIGlmICghcGF0aF8uZW1wdHkoKSkgeworICAgIHNlcnZlclNvY2tldF8gPSBzb2NrZXQoUEZfVU5JWCwgU09DS19TVFJFQU0sIElQUFJPVE9fSVApOworICB9IGVsc2UgaWYgKHJlcyAhPSBOVUxMKSB7CisgICAgc2VydmVyU29ja2V0XyA9IHNvY2tldChyZXMtPmFpX2ZhbWlseSwgcmVzLT5haV9zb2NrdHlwZSwgcmVzLT5haV9wcm90b2NvbCk7CisgIH0KKworICBpZiAoc2VydmVyU29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgc29ja2V0KCkgIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjcmVhdGUgc2VydmVyIHNvY2tldC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgIH0KKworICAvLyBTZXQgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIHRvIHByZXZlbnQgMk1TTCBkZWxheSBvbiBhY2NlcHQKKyAgaW50IG9uZSA9IDE7CisgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sCisgICAgICAgICAgICAgICAgICAgICAgIFNPTF9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORywKKyAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9zb2Nrb3B0KCZvbmUpLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob25lKSkpIHsKKy8vIGlnbm9yZSBlcnJvcnMgY29taW5nIG91dCBvZiB0aGlzIHNldHNvY2tvcHQgb24gV2luZG93cy4gIFRoaXMgaXMgYmVjYXVzZQorLy8gU09fRVhDTFVTSVZFQUREUlVTRSByZXF1aXJlcyBhZG1pbiBwcml2aWxlZ2VzIG9uIFdpblhQLCBidXQgd2UgZG9uJ3QKKy8vIHdhbnQgdG8gZm9yY2Ugc2VydmVycyB0byBiZSBhbiBhZG1pbi4KKyNpZm5kZWYgX1dJTjMyCisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2V0IFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyNlbmRpZgorICB9CisKKyAgLy8gU2V0IFRDUCBidWZmZXIgc2l6ZXMKKyAgaWYgKHRjcFNlbmRCdWZmZXJfID4gMCkgeworICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgU09MX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTT19TTkRCVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9zb2Nrb3B0KCZ0Y3BTZW5kQnVmZmVyXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRjcFNlbmRCdWZmZXJfKSkpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19TTkRCVUYgIiwgZXJybm9fY29weSk7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgU09fU05EQlVGIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgfQorICB9CisKKyAgaWYgKHRjcFJlY3ZCdWZmZXJfID4gMCkgeworICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgU09MX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTT19SQ1ZCVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9zb2Nrb3B0KCZ0Y3BSZWN2QnVmZmVyXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRjcFJlY3ZCdWZmZXJfKSkpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19SQ1ZCVUYgIiwgZXJybm9fY29weSk7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgU09fUkNWQlVGIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgfQorICB9CisKKyNpZmRlZiBJUFY2X1Y2T05MWQorICBpZiAocmVzLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYgJiYgcGF0aF8uZW1wdHkoKSkgeworICAgIGludCB6ZXJvID0gMDsKKyAgICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgIElQUFJPVE9fSVBWNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJUFY2X1Y2T05MWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJnplcm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih6ZXJvKSkpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgSVBWNl9WNk9OTFkgIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgIH0KKyAgfQorI2VuZGlmIC8vICNpZmRlZiBJUFY2X1Y2T05MWQorCisgIC8vIFR1cm4gbGluZ2VyIG9mZiwgZG9uJ3Qgd2FudCB0byBibG9jayBvbiBjYWxscyB0byBjbG9zZQorICBzdHJ1Y3QgbGluZ2VyIGxpbmcgPSB7MCwgMH07CisgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgY2FzdF9zb2Nrb3B0KCZsaW5nKSwgc2l6ZW9mKGxpbmcpKSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fTElOR0VSICIsIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBzZXQgU09fTElOR0VSIiwgZXJybm9fY29weSk7CisgIH0KKworICAvLyBLZWVwYWxpdmUgdG8gZW5zdXJlIGZ1bGwgcmVzdWx0IGZsdXNoaW5nCisgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgY29uc3RfY2FzdF9zb2Nrb3B0KCZvbmUpLCBzaXplb2Yob25lKSkpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX0tFRVBBTElWRSAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAiQ291bGQgbm90IHNldCBUQ1BfTk9ERUxBWSIsCisgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIFNldCBUQ1Agbm9kZWxheSBpZiBhdmFpbGFibGUsIE1BQyBPUyBYIEhhY2sKKyAgLy8gU2VlIGh0dHA6Ly9saXN0cy5kYW5nYS5jb20vcGlwZXJtYWlsL21lbWNhY2hlZC8yMDA1LU1hcmNoLzAwMTI0MC5odG1sCisjaWZuZGVmIFRDUF9OT1BVU0gKKyAgLy8gVW5peCBTb2NrZXRzIGRvIG5vdCBuZWVkIHRoYXQKKyAgaWYgKHBhdGhfLmVtcHR5KCkpIHsKKyAgICAvLyBUQ1AgTm9kZWxheSwgc3BlZWQgb3ZlciBiYW5kd2lkdGgKKyAgICBpZiAoLTEKKyAgICAgICAgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIGNhc3Rfc29ja29wdCgmb25lKSwgc2l6ZW9mKG9uZSkpKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgVENQX05PREVMQVkgIiwgZXJybm9fY29weSk7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgVENQX05PREVMQVkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisgIH0KKyNlbmRpZgorCisgIC8vIFNldCBOT05CTE9DSyBvbiB0aGUgYWNjZXB0IHNvY2tldAorICBpbnQgZmxhZ3MgPSBUSFJJRlRfRkNOVEwoc2VydmVyU29ja2V0XywgVEhSSUZUX0ZfR0VURkwsIDApOworICBpZiAoZmxhZ3MgPT0gLTEpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfR0VURkwgIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9GQ05UTCgpIFRIUklGVF9GX0dFVEZMIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIGlmICgtMSA9PSBUSFJJRlRfRkNOVEwoc2VydmVyU29ja2V0XywgVEhSSUZUX0ZfU0VURkwsIGZsYWdzIHwgVEhSSUZUX09fTk9OQkxPQ0spKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIFRIUklGVF9GQ05UTCgpIFRIUklGVF9PX05PTkJMT0NLICIsIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9TRVRGTCBUSFJJRlRfT19OT05CTE9DSyBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgIH0KKworI2lmZGVmIFRDUF9MT1dfTUlOX1JUTworICBpZiAoVFNvY2tldDo6Z2V0VXNlTG93TWluUnRvKCkpIHsKKyAgICBpZiAoLTEgPT0gc2V0c29ja29wdChzLCBJUFBST1RPX1RDUCwgVENQX0xPV19NSU5fUlRPLCBjb25zdF9jYXN0X3NvY2tvcHQoJm9uZSksIHNpemVvZihvbmUpKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFRDUF9MT1dfTUlOX1JUTyAiLCBlcnJub19jb3B5KTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAiQ291bGQgbm90IHNldCBUQ1BfTk9ERUxBWSIsCisgICAgICAgIGVycm5vX2NvcHkpOworICAgIH0KKyAgfQorI2VuZGlmCisKKyAgLy8gcHJlcGFyZSB0aGUgcG9ydCBpbmZvcm1hdGlvbgorICAvLyB3ZSBtYXkgd2FudCB0byB0cnkgdG8gYmluZCBtb3JlIHRoYW4gb25jZSwgc2luY2UgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIGRvZXNuJ3QKKyAgLy8gYWx3YXlzIHNlZW0gdG8gd29yay4gVGhlIGNsaWVudCBjYW4gY29uZmlndXJlIHRoZSByZXRyeSB2YXJpYWJsZXMuCisgIGludCByZXRyaWVzID0gMDsKKyAgaW50IGVycm5vX2NvcHkgPSAwOworCisgIGlmICghcGF0aF8uZW1wdHkoKSkgeworCisjaWZuZGVmIF9XSU4zMgorCisgICAgLy8gVW5peCBEb21haW4gU29ja2V0CisgICAgc2l6ZV90IGxlbiA9IHBhdGhfLnNpemUoKSArIDE7CisgICAgaWYgKGxlbiA+IHNpemVvZigoKHNvY2thZGRyX3VuKilOVUxMKS0+c3VuX3BhdGgpKSB7CisgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpsaXN0ZW4oKSBVbml4IERvbWFpbiBzb2NrZXQgcGF0aCB0b28gbG9uZyIsIGVycm5vX2NvcHkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuaXggRG9tYWluIHNvY2tldCBwYXRoIHRvbyBsb25nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgfQorCisgICAgc3RydWN0IHNvY2thZGRyX3VuIGFkZHJlc3M7CisgICAgYWRkcmVzcy5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKyAgICBtZW1jcHkoYWRkcmVzcy5zdW5fcGF0aCwgcGF0aF8uY19zdHIoKSwgbGVuKTsKKworICAgIHNvY2tsZW5fdCBzdHJ1Y3RsZW4gPSBzdGF0aWNfY2FzdDxzb2NrbGVuX3Q+KHNpemVvZihhZGRyZXNzKSk7CisKKyAgICBpZiAoIWFkZHJlc3Muc3VuX3BhdGhbMF0pIHsgLy8gYWJzdHJhY3QgbmFtZXNwYWNlIHNvY2tldAorI2lmZGVmIF9fbGludXhfXworICAgICAgLy8gc3VuX3BhdGggaXMgbm90IG51bGwtdGVybWluYXRlZCBpbiB0aGlzIGNhc2UgYW5kIHN0cnVjdGxlbiBkZXRlcm1pbmVzIGl0cyBsZW5ndGgKKyAgICAgIHN0cnVjdGxlbiAtPSBzaXplb2YoYWRkcmVzcy5zdW5fcGF0aCkgLSBsZW47CisjZWxzZQorICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIEFic3RyYWN0IE5hbWVzcGFjZSBEb21haW4gc29ja2V0cyBvbmx5IHN1cHBvcnRlZCBvbiBsaW51eDogIiwgLTk5KTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQWJzdHJhY3QgTmFtZXNwYWNlIERvbWFpbiBzb2NrZXQgcGF0aCBub3Qgc3VwcG9ydGVkIik7CisjZW5kaWYKKyAgICB9CisKKyAgICBkbyB7CisgICAgICBpZiAoMCA9PSA6OmJpbmQoc2VydmVyU29ja2V0XywgKHN0cnVjdCBzb2NrYWRkciopJmFkZHJlc3MsIHN0cnVjdGxlbikpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAvLyB1c2Ugc2hvcnQgY2lyY3VpdCBldmFsdWF0aW9uIGhlcmUgdG8gb25seSBzbGVlcCBpZiB3ZSBuZWVkIHRvCisgICAgfSB3aGlsZSAoKHJldHJpZXMrKyA8IHJldHJ5TGltaXRfKSAmJiAoVEhSSUZUX1NMRUVQX1NFQyhyZXRyeURlbGF5XykgPT0gMCkpOworI2Vsc2UKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgVW5peCBEb21haW4gc29ja2V0IHBhdGggbm90IHN1cHBvcnRlZCBvbiB3aW5kb3dzIiwgLTk5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBVbml4IERvbWFpbiBzb2NrZXQgcGF0aCBub3Qgc3VwcG9ydGVkIik7CisjZW5kaWYKKyAgfSBlbHNlIHsKKyAgICBkbyB7CisgICAgICBpZiAoMCA9PSA6OmJpbmQoc2VydmVyU29ja2V0XywgcmVzLT5haV9hZGRyLCBzdGF0aWNfY2FzdDxpbnQ+KHJlcy0+YWlfYWRkcmxlbikpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgLy8gdXNlIHNob3J0IGNpcmN1aXQgZXZhbHVhdGlvbiBoZXJlIHRvIG9ubHkgc2xlZXAgaWYgd2UgbmVlZCB0bworICAgIH0gd2hpbGUgKChyZXRyaWVzKysgPCByZXRyeUxpbWl0XykgJiYgKFRIUklGVF9TTEVFUF9TRUMocmV0cnlEZWxheV8pID09IDApKTsKKworICAgIC8vIHJldHJpZXZlIGJpbmQgaW5mbworICAgIGlmIChwb3J0XyA9PSAwICYmIHJldHJpZXMgPD0gcmV0cnlMaW1pdF8pIHsKKyAgICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNhOworICAgICAgc29ja2xlbl90IGxlbiA9IHNpemVvZihzYSk7CisgICAgICBzdGQ6Om1lbXNldCgmc2EsIDAsIGxlbik7CisgICAgICBpZiAoOjpnZXRzb2NrbmFtZShzZXJ2ZXJTb2NrZXRfLCByZWludGVycHJldF9jYXN0PHN0cnVjdCBzb2NrYWRkcio+KCZzYSksICZsZW4pIDwgMCkgeworICAgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6Z2V0UG9ydCgpIGdldHNvY2tuYW1lKCkgIiwgZXJybm9fY29weSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoc2Euc3NfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisgICAgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiogc2luID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42Kj4oJnNhKTsKKyAgICAgICAgICBsaXN0ZW5Qb3J0XyA9IG50b2hzKHNpbi0+c2luNl9wb3J0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4qIHNpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luKj4oJnNhKTsKKyAgICAgICAgICBsaXN0ZW5Qb3J0XyA9IG50b2hzKHNpbi0+c2luX3BvcnQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gdGhyb3cgYW4gZXJyb3IgaWYgd2UgZmFpbGVkIHRvIGJpbmQgcHJvcGVybHkKKyAgaWYgKHJldHJpZXMgPiByZXRyeUxpbWl0XykgeworICAgIGNoYXIgZXJyYnVmWzEwMjRdOworICAgIGlmICghcGF0aF8uZW1wdHkoKSkgeworICAgICAgVEhSSUZUX1NOUFJJTlRGKGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZiksICJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIFBBVEggJXMiLCBwYXRoXy5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgVEhSSUZUX1NOUFJJTlRGKGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZiksICJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIEJJTkQgJWQiLCBwb3J0Xyk7CisgICAgfQorICAgIEdsb2JhbE91dHB1dChlcnJidWYpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgYmluZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIGlmIChsaXN0ZW5DYWxsYmFja18pCisgICAgbGlzdGVuQ2FsbGJhY2tfKHNlcnZlclNvY2tldF8pOworCisgIC8vIENhbGwgbGlzdGVuCisgIGlmICgtMSA9PSA6Omxpc3RlbihzZXJ2ZXJTb2NrZXRfLCBhY2NlcHRCYWNrbG9nXykpIHsKKyAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBsaXN0ZW4oKSAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3QgbGlzdGVuIiwgZXJybm9fY29weSk7CisgIH0KKworICAvLyBUaGUgc29ja2V0IGlzIG5vdyBsaXN0ZW5pbmchCit9CisKK2ludCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OmdldFBvcnQoKSB7CisgIHJldHVybiBwb3J0XzsKK30KKworaW50IFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6Z2V0TGlzdGVuUG9ydCgpIHsKKyAgcmV0dXJuIGxpc3RlblBvcnRfOworfQorCitzaGFyZWRfcHRyPFRTb2NrZXQ+IFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIHsKKyAgaWYgKHNlcnZlclNvY2tldF8gPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlROb25ibG9ja2luZ1NlcnZlclNvY2tldCBub3QgbGlzdGVuaW5nIik7CisgIH0KKyAgCisgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGNsaWVudEFkZHJlc3M7CisgIGludCBzaXplID0gc2l6ZW9mKGNsaWVudEFkZHJlc3MpOworICBUSFJJRlRfU09DS0VUIGNsaWVudFNvY2tldAorICAgICAgPSA6OmFjY2VwdChzZXJ2ZXJTb2NrZXRfLCAoc3RydWN0IHNvY2thZGRyKikmY2xpZW50QWRkcmVzcywgKHNvY2tsZW5fdCopJnNpemUpOworCisgIGlmIChjbGllbnRTb2NrZXQgPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSA6OmFjY2VwdCgpICIsIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgImFjY2VwdCgpIiwgZXJybm9fY29weSk7CisgIH0KKworICAvLyBFeHBsaWNpdGx5IHNldCB0aGlzIHNvY2tldCB0byBOT05CTE9DSyBtb2RlCisgIGludCBmbGFncyA9IFRIUklGVF9GQ05UTChjbGllbnRTb2NrZXQsIFRIUklGVF9GX0dFVEZMLCAwKTsKKyAgaWYgKGZsYWdzID09IC0xKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChjbGllbnRTb2NrZXQpOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIFRIUklGVF9GQ05UTCgpIFRIUklGVF9GX0dFVEZMICIsIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfRkNOVEwoVEhSSUZUX0ZfR0VURkwpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgaWYgKC0xID09IFRIUklGVF9GQ05UTChjbGllbnRTb2NrZXQsIFRIUklGVF9GX1NFVEZMLCBmbGFncyB8IFRIUklGVF9PX05PTkJMT0NLKSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoY2xpZW50U29ja2V0KTsKKyAgICBHbG9iYWxPdXRwdXQKKyAgICAgICAgLnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfU0VURkwgflRIUklGVF9PX05PTkJMT0NLICIsCisgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9GQ05UTChUSFJJRlRfRl9TRVRGTCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgIH0KKworICBzaGFyZWRfcHRyPFRTb2NrZXQ+IGNsaWVudCA9IGNyZWF0ZVNvY2tldChjbGllbnRTb2NrZXQpOworICBpZiAoc2VuZFRpbWVvdXRfID4gMCkgeworICAgIGNsaWVudC0+c2V0U2VuZFRpbWVvdXQoc2VuZFRpbWVvdXRfKTsKKyAgfQorICBpZiAocmVjdlRpbWVvdXRfID4gMCkgeworICAgIGNsaWVudC0+c2V0UmVjdlRpbWVvdXQocmVjdlRpbWVvdXRfKTsKKyAgfQorICBpZiAoa2VlcEFsaXZlXykgeworICAgIGNsaWVudC0+c2V0S2VlcEFsaXZlKGtlZXBBbGl2ZV8pOworICB9CisgIGNsaWVudC0+c2V0Q2FjaGVkQWRkcmVzcygoc29ja2FkZHIqKSZjbGllbnRBZGRyZXNzLCBzaXplKTsKKworICBpZiAoYWNjZXB0Q2FsbGJhY2tfKQorICAgIGFjY2VwdENhbGxiYWNrXyhjbGllbnRTb2NrZXQpOworCisgIHJldHVybiBjbGllbnQ7Cit9CisKK3NoYXJlZF9wdHI8VFNvY2tldD4gVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBjbGllbnRTb2NrZXQpIHsKKyAgcmV0dXJuIHNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoY2xpZW50U29ja2V0KSk7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpjbG9zZSgpIHsKKyAgaWYgKHNlcnZlclNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgc2h1dGRvd24oc2VydmVyU29ja2V0XywgVEhSSUZUX1NIVVRfUkRXUik7CisgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoc2VydmVyU29ja2V0Xyk7CisgIH0KKyAgc2VydmVyU29ja2V0XyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgbGlzdGVuaW5nXyA9IGZhbHNlOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTg2ZmYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1ROT05CTE9DS0lOR1NFUlZFUlNPQ0tFVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UTk9OQkxPQ0tJTkdTRVJWRVJTT0NLRVRfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworY2xhc3MgVFNvY2tldDsKKworLyoqCisgKiBOb25ibG9ja2luZyBTZXJ2ZXIgc29ja2V0IGltcGxlbWVudGF0aW9uIG9mIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC4gV3JhcHBlciBhcm91bmQgYSB1bml4CisgKiBzb2NrZXQgbGlzdGVuIGFuZCBhY2NlcHQgY2FsbHMuCisgKgorICovCitjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgOiBwdWJsaWMgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoVEhSSUZUX1NPQ0tFVCBmZCk+IHNvY2tldF9mdW5jX3Q7CisKKyAgY29uc3Qgc3RhdGljIGludCBERUZBVUxUX0JBQ0tMT0cgPSAxMDI0OworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHBhcmFtIHBvcnQgICAgUG9ydCBudW1iZXIgdG8gYmluZCB0bworICAgKi8KKyAgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KGludCBwb3J0KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuCisgICAqCisgICAqIEBwYXJhbSBwb3J0ICAgICAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAqIEBwYXJhbSBzZW5kVGltZW91dCBTb2NrZXQgc2VuZCB0aW1lb3V0CisgICAqIEBwYXJhbSByZWN2VGltZW91dCBTb2NrZXQgcmVjZWl2ZSB0aW1lb3V0CisgICAqLworICBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBzZW5kVGltZW91dCwgaW50IHJlY3ZUaW1lb3V0KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuCisgICAqCisgICAqIEBwYXJhbSBhZGRyZXNzIEFkZHJlc3MgdG8gYmluZCB0bworICAgKiBAcGFyYW0gcG9ydCAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAqLworICBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MsIGludCBwb3J0KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IgdXNlZCBmb3IgdW5peCBzb2NrZXRzLgorICAgKgorICAgKiBAcGFyYW0gcGF0aCBQYXRobmFtZSBmb3IgdW5peCBzb2NrZXQuCisgICAqLworICBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOworCisgIHZpcnR1YWwgflROb25ibG9ja2luZ1NlcnZlclNvY2tldCgpOworCisgIHZvaWQgc2V0U2VuZFRpbWVvdXQoaW50IHNlbmRUaW1lb3V0KTsKKyAgdm9pZCBzZXRSZWN2VGltZW91dChpbnQgcmVjdlRpbWVvdXQpOworCisgIHZvaWQgc2V0QWNjZXB0QmFja2xvZyhpbnQgYWNjQmFja2xvZyk7CisKKyAgdm9pZCBzZXRSZXRyeUxpbWl0KGludCByZXRyeUxpbWl0KTsKKyAgdm9pZCBzZXRSZXRyeURlbGF5KGludCByZXRyeURlbGF5KTsKKworICB2b2lkIHNldEtlZXBBbGl2ZShib29sIGtlZXBBbGl2ZSkgeyBrZWVwQWxpdmVfID0ga2VlcEFsaXZlOyB9CisKKyAgdm9pZCBzZXRUY3BTZW5kQnVmZmVyKGludCB0Y3BTZW5kQnVmZmVyKTsKKyAgdm9pZCBzZXRUY3BSZWN2QnVmZmVyKGludCB0Y3BSZWN2QnVmZmVyKTsKKworICAvLyBsaXN0ZW5DYWxsYmFjayBnZXRzIGNhbGxlZCBqdXN0IGJlZm9yZSBsaXN0ZW4sIGFuZCBhZnRlciBhbGwgVGhyaWZ0CisgIC8vIHNldHNvY2tvcHQgY2FsbHMgaGF2ZSBiZWVuIG1hZGUuICBJZiB5b3UgaGF2ZSBjdXN0b20gc2V0c29ja29wdAorICAvLyB0aGluZ3MgdGhhdCBuZWVkIHRvIGhhcHBlbiBvbiB0aGUgbGlzdGVuaW5nIHNvY2tldCwgdGhpcyBpcyB0aGUgcGxhY2UgdG8gZG8gaXQuCisgIHZvaWQgc2V0TGlzdGVuQ2FsbGJhY2soY29uc3Qgc29ja2V0X2Z1bmNfdCYgbGlzdGVuQ2FsbGJhY2spIHsgbGlzdGVuQ2FsbGJhY2tfID0gbGlzdGVuQ2FsbGJhY2s7IH0KKworICAvLyBhY2NlcHRDYWxsYmFjayBnZXRzIGNhbGxlZCBhZnRlciBlYWNoIGFjY2VwdCBjYWxsLCBvbiB0aGUgbmV3bHkgY3JlYXRlZCBzb2NrZXQuCisgIC8vIEl0IGlzIGNhbGxlZCBhZnRlciBhbGwgVGhyaWZ0IHNldHNvY2tvcHQgY2FsbHMgaGF2ZSBiZWVuIG1hZGUuICBJZiB5b3UgaGF2ZQorICAvLyBjdXN0b20gc2V0c29ja29wdCB0aGluZ3MgdGhhdCBuZWVkIHRvIGhhcHBlbiBvbiB0aGUgYWNjZXB0ZWQKKyAgLy8gc29ja2V0LCB0aGlzIGlzIHRoZSBwbGFjZSB0byBkbyBpdC4KKyAgdm9pZCBzZXRBY2NlcHRDYWxsYmFjayhjb25zdCBzb2NrZXRfZnVuY190JiBhY2NlcHRDYWxsYmFjaykgeyBhY2NlcHRDYWxsYmFja18gPSBhY2NlcHRDYWxsYmFjazsgfQorCisgIFRIUklGVF9TT0NLRVQgZ2V0U29ja2V0RkQoKSB7IHJldHVybiBzZXJ2ZXJTb2NrZXRfOyB9CisKKyAgaW50IGdldFBvcnQoKTsKKyAgCisgIGludCBnZXRMaXN0ZW5Qb3J0KCk7CisKKyAgdm9pZCBsaXN0ZW4oKTsKKyAgdm9pZCBjbG9zZSgpOworCitwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBhY2NlcHRJbXBsKCk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIGNsaWVudCk7CisKK3ByaXZhdGU6CisgIGludCBwb3J0XzsKKyAgaW50IGxpc3RlblBvcnRfOworICBzdGQ6OnN0cmluZyBhZGRyZXNzXzsKKyAgc3RkOjpzdHJpbmcgcGF0aF87CisgIFRIUklGVF9TT0NLRVQgc2VydmVyU29ja2V0XzsKKyAgaW50IGFjY2VwdEJhY2tsb2dfOworICBpbnQgc2VuZFRpbWVvdXRfOworICBpbnQgcmVjdlRpbWVvdXRfOworICBpbnQgcmV0cnlMaW1pdF87CisgIGludCByZXRyeURlbGF5XzsKKyAgaW50IHRjcFNlbmRCdWZmZXJfOworICBpbnQgdGNwUmVjdkJ1ZmZlcl87CisgIGJvb2wga2VlcEFsaXZlXzsKKyAgYm9vbCBsaXN0ZW5pbmdfOworCisgIHNvY2tldF9mdW5jX3QgbGlzdGVuQ2FsbGJhY2tfOworICBzb2NrZXRfZnVuY190IGFjY2VwdENhbGxiYWNrXzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVE5PTkJMT0NLSU5HU0VSVkVSU09DS0VUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTQyZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1ROT05CTE9DS0lOR1NFUlZFUlRSQU5TUE9SVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UTk9OQkxPQ0tJTkdTRVJWRVJUUkFOU1BPUlRfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBTZXJ2ZXIgdHJhbnNwb3J0IGZyYW1ld29yay4gQSBzZXJ2ZXIgbmVlZHMgdG8gaGF2ZSBzb21lIGZhY2lsaXR5IGZvcgorICogY3JlYXRpbmcgYmFzZSB0cmFuc3BvcnRzIHRvIHJlYWQvd3JpdGUgZnJvbS4gIFRoZSBzZXJ2ZXIgaXMgZXhwZWN0ZWQKKyAqIHRvIGtlZXAgdHJhY2sgb2YgVFRyYW5zcG9ydCBjaGlsZHJlbiB0aGF0IGl0IGNyZWF0ZXMgZm9yIHB1cnBvc2VzIG9mCisgKiBjb250cm9sbGluZyB0aGVpciBsaWZldGltZS4KKyAqLworY2xhc3MgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0KCkge30KKworICAvKioKKyAgICogU3RhcnRzIHRoZSBzZXJ2ZXIgdHJhbnNwb3J0IGxpc3RlbmluZyBmb3IgbmV3IGNvbm5lY3Rpb25zLiBQcmlvciB0byB0aGlzCisgICAqIGNhbGwgbW9zdCB0cmFuc3BvcnRzIHdpbGwgbm90IHJldHVybiBhbnl0aGluZyB3aGVuIGFjY2VwdCBpcyBjYWxsZWQuCisgICAqCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB3ZSB3ZXJlIHVuYWJsZSB0byBsaXN0ZW4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBsaXN0ZW4oKSB7fQorCisgIC8qKgorICAgKiBHZXRzIGEgbmV3IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB0cmFuc3BvcnQgb2JqZWN0IGFuZCBwYXNzZXMgaXQgdG8gdGhlCisgICAqIGNhbGxlci4gTm90ZSB0aGF0IGl0IGlzIHRoZSBleHBsaWNpdCBkdXR5IG9mIHRoZSBjYWxsZXIgdG8gZnJlZSB0aGUKKyAgICogYWxsb2NhdGVkIG9iamVjdC4gVGhlIHJldHVybmVkIFRUcmFuc3BvcnQgb2JqZWN0IG11c3QgYWx3YXlzIGJlIGluIHRoZQorICAgKiBvcGVuZWQgc3RhdGUuIE5VTEwgc2hvdWxkIG5ldmVyIGJlIHJldHVybmVkLCBpbnN0ZWFkIGFuIEV4Y2VwdGlvbiBzaG91bGQKKyAgICogYWx3YXlzIGJlIHRocm93bi4KKyAgICoKKyAgICogQHJldHVybiBBIG5ldyBUVHJhbnNwb3J0IG9iamVjdAorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IKKyAgICovCisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBhY2NlcHQoKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHJlc3VsdCA9IGFjY2VwdEltcGwoKTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiYWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICogVXRpbGl0eSBtZXRob2QKKyAgKiAKKyAgKiBAcmV0dXJuIHNlcnZlciBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yIAorICAqIEB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycworICAqLworCisgIHZpcnR1YWwgVEhSSUZUX1NPQ0tFVCBnZXRTb2NrZXRGRCgpID0gMDsKKworICB2aXJ0dWFsIGludCBnZXRQb3J0KCkgPSAwOworCisgIHZpcnR1YWwgaW50IGdldExpc3RlblBvcnQoKSA9IDA7CisKKyAgLyoqCisgICAqIENsb3NlcyB0aGlzIHRyYW5zcG9ydCBzdWNoIHRoYXQgZnV0dXJlIGNhbGxzIHRvIGFjY2VwdCB3aWxsIGRvIG5vdGhpbmcuCisgICAqLworICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0KCkge30KKworICAvKioKKyAgICogU3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24gZm9yIGFjY2VwdC4KKyAgICoKKyAgICogQHJldHVybiBBIG5ld2x5IGFsbG9jYXRlZCBUVHJhbnNwb3J0IG9iamVjdAorICAgKiBAdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMKKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGFjY2VwdEltcGwoKSA9IDA7CisKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVE5PTkJMT0NLSU5HU0VSVkVSVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhODQ0NTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmNwcApAQCAtMCwwICsxLDM5OCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFBpcGUuaD4KKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5oPgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1N5bmMuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorKiBUUGlwZSBpbXBsZW1lbnRhdGlvbi4KKyovCisKKyNpZmRlZiBfV0lOMzIKKwordWludDMyX3QgcGlwZV9yZWFkKEhBTkRMRSBwaXBlLCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Cit2b2lkIHBpcGVfd3JpdGUoSEFORExFIHBpcGUsIGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKwordWludDMyX3QgcHNldWRvX3N5bmNfcmVhZChIQU5ETEUgcGlwZSwgSEFORExFIGV2ZW50LCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Cit2b2lkIHBzZXVkb19zeW5jX3dyaXRlKEhBTkRMRSBwaXBlLCBIQU5ETEUgZXZlbnQsIGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworY2xhc3MgVFBpcGVJbXBsIDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKK3B1YmxpYzoKKyAgVFBpcGVJbXBsKCkge30KKyAgdmlydHVhbCB+VFBpcGVJbXBsKCkge30KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSA9IDA7CisgIHZpcnR1YWwgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgPSAwOworICB2aXJ0dWFsIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCkgPSAwOyAvLyBkb3VibGVzIGFzIHRoZSByZWFkIGhhbmRsZSBmb3IgYW5vbiBwaXBlCisgIHZpcnR1YWwgdm9pZCBzZXRQaXBlSGFuZGxlKEhBTkRMRSBwaXBlaGFuZGxlKSA9IDA7CisgIHZpcnR1YWwgSEFORExFIGdldFdydFBpcGVIYW5kbGUoKSB7IHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsgfQorICB2aXJ0dWFsIHZvaWQgc2V0V3J0UGlwZUhhbmRsZShIQU5ETEUpIHt9CisgIHZpcnR1YWwgYm9vbCBpc0J1ZmZlcmVkRGF0YUF2YWlsYWJsZSgpIHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgSEFORExFIGdldE5hdGl2ZVdhaXRIYW5kbGUoKSB7IHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsgfQorfTsKKworY2xhc3MgVE5hbWVkUGlwZUltcGwgOiBwdWJsaWMgVFBpcGVJbXBsIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgVE5hbWVkUGlwZUltcGwoVEF1dG9IYW5kbGUgJnBpcGVoYW5kbGUpIDogUGlwZV8ocGlwZWhhbmRsZS5yZWxlYXNlKCkpIHt9CisgIHZpcnR1YWwgflROYW1lZFBpcGVJbXBsKCkge30KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgcmV0dXJuIHBzZXVkb19zeW5jX3JlYWQoUGlwZV8uaCwgcmVhZF9ldmVudF8uaCwgYnVmLCBsZW4pOworICB9CisgIHZpcnR1YWwgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAgIHBzZXVkb19zeW5jX3dyaXRlKFBpcGVfLmgsIHdyaXRlX2V2ZW50Xy5oLCBidWYsIGxlbik7CisgIH0KKworICB2aXJ0dWFsIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCkgeyByZXR1cm4gUGlwZV8uaDsgfQorICB2aXJ0dWFsIHZvaWQgc2V0UGlwZUhhbmRsZShIQU5ETEUgcGlwZWhhbmRsZSkgeyBQaXBlXy5yZXNldChwaXBlaGFuZGxlKTsgfQorCitwcml2YXRlOgorICBUTWFudWFsUmVzZXRFdmVudCByZWFkX2V2ZW50XzsKKyAgVE1hbnVhbFJlc2V0RXZlbnQgd3JpdGVfZXZlbnRfOworICBUQXV0b0hhbmRsZSBQaXBlXzsKK307CisKK2NsYXNzIFRBbm9uUGlwZUltcGwgOiBwdWJsaWMgVFBpcGVJbXBsIHsKK3B1YmxpYzoKKyAgVEFub25QaXBlSW1wbChIQU5ETEUgUGlwZVJkLCBIQU5ETEUgUGlwZVdydCkgOiBQaXBlUmRfKFBpcGVSZCksIFBpcGVXcnRfKFBpcGVXcnQpIHt9CisgIHZpcnR1YWwgflRBbm9uUGlwZUltcGwoKSB7fQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHBpcGVfcmVhZChQaXBlUmRfLmgsIGJ1ZiwgbGVuKTsgfQorICB2aXJ0dWFsIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcGlwZV93cml0ZShQaXBlV3J0Xy5oLCBidWYsIGxlbik7IH0KKworICB2aXJ0dWFsIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCkgeyByZXR1cm4gUGlwZVJkXy5oOyB9CisgIHZpcnR1YWwgdm9pZCBzZXRQaXBlSGFuZGxlKEhBTkRMRSBQaXBlUmQpIHsgUGlwZVJkXy5yZXNldChQaXBlUmQpOyB9CisgIHZpcnR1YWwgSEFORExFIGdldFdydFBpcGVIYW5kbGUoKSB7IHJldHVybiBQaXBlV3J0Xy5oOyB9CisgIHZpcnR1YWwgdm9pZCBzZXRXcnRQaXBlSGFuZGxlKEhBTkRMRSBQaXBlV3J0KSB7IFBpcGVXcnRfLnJlc2V0KFBpcGVXcnQpOyB9CisKK3ByaXZhdGU6CisgIFRBdXRvSGFuZGxlIFBpcGVSZF87CisgIFRBdXRvSGFuZGxlIFBpcGVXcnRfOworfTsKKworLy8gSWYgeW91IHdhbnQgYSBzZWxlY3QtbGlrZSBsb29wIHRvIHdvcmssIHVzZSB0aGlzIHN1YmNsYXNzLiAgQmUgd2FybmVkLi4uCisvLyB0aGUgcmVhZCBpbXBsZW1lbnRhdGlvbiBoYXMgc2V2ZXJhbCBjb250ZXh0IHN3aXRjaGVzLCBzbyB0aGlzIGlzIHNsb3dlcgorLy8gdGhhbiB1c2luZyB0aGUgcmVndWxhciBuYW1lZCBwaXBlIGltcGxlbWVudGF0aW9uCitjbGFzcyBUV2FpdGFibGVOYW1lZFBpcGVJbXBsIDogcHVibGljIFRQaXBlSW1wbCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFRXYWl0YWJsZU5hbWVkUGlwZUltcGwoVEF1dG9IYW5kbGUgJnBpcGVoYW5kbGUpCisgICAgOiBiZWdpbl91bnJlYWRfaWR4XygwKSwgZW5kX3VucmVhZF9pZHhfKDApIHsKKyAgICByZWFkT3ZlcmxhcF8uYWN0aW9uID0gVE92ZXJsYXBwZWRXb3JrSXRlbTo6UkVBRDsKKyAgICByZWFkT3ZlcmxhcF8uaCA9IHBpcGVoYW5kbGUuaDsKKyAgICBjYW5jZWxPdmVybGFwXy5hY3Rpb24gPSBUT3ZlcmxhcHBlZFdvcmtJdGVtOjpDQU5DRUxJTzsKKyAgICBjYW5jZWxPdmVybGFwXy5oID0gcGlwZWhhbmRsZS5oOworICAgIGJ1ZmZlcl8ucmVzaXplKDEwMjQgLyphcmJpdHJhcnkgYnVmZmVyIHNpemUqLywgJ1wwJyk7CisgICAgYmVnaW5Bc3luY1JlYWQoJmJ1ZmZlcl9bMF0sIHN0YXRpY19jYXN0PHVpbnQzMl90PihidWZmZXJfLnNpemUoKSkpOworICAgIFBpcGVfLnJlc2V0KHBpcGVoYW5kbGUucmVsZWFzZSgpKTsKKyAgfQorICB2aXJ0dWFsIH5UV2FpdGFibGVOYW1lZFBpcGVJbXBsKCkgeworICAgIC8vIHNlZSBpZiB0aGVyZSBpcyBhbiBvdXRzdGFuZGluZyByZWFkIHJlcXVlc3QKKyAgICBpZiAoYmVnaW5fdW5yZWFkX2lkeF8gPT0gZW5kX3VucmVhZF9pZHhfKSB7CisgICAgICAvLyBpZiBzbywgY2FuY2VsIGl0LCBhbmQgd2FpdCBmb3IgdGhlIGRlYWQgY29tcGxldGlvbgorICAgICAgdGhyZWFkXy0+YWRkV29ya0l0ZW0oJmNhbmNlbE92ZXJsYXBfKTsKKyAgICAgIHJlYWRPdmVybGFwXy5vdmVybGFwcGVkUmVzdWx0cyhmYWxzZSAvKmlnbm9yZSBlcnJvcnMqLyk7CisgICAgfQorICB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHZpcnR1YWwgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAgIHBzZXVkb19zeW5jX3dyaXRlKFBpcGVfLmgsIHdyaXRlX2V2ZW50Xy5oLCBidWYsIGxlbik7CisgIH0KKworICB2aXJ0dWFsIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCkgeyByZXR1cm4gUGlwZV8uaDsgfQorICB2aXJ0dWFsIHZvaWQgc2V0UGlwZUhhbmRsZShIQU5ETEUgcGlwZWhhbmRsZSkgeyBQaXBlXy5yZXNldChwaXBlaGFuZGxlKTsgfQorICB2aXJ0dWFsIGJvb2wgaXNCdWZmZXJlZERhdGFBdmFpbGFibGUoKSB7IHJldHVybiBiZWdpbl91bnJlYWRfaWR4XyA8IGVuZF91bnJlYWRfaWR4XzsgfQorICB2aXJ0dWFsIEhBTkRMRSBnZXROYXRpdmVXYWl0SGFuZGxlKCkgeyByZXR1cm4gcmVhZHlfZXZlbnRfLmg7IH0KKworcHJpdmF0ZToKKyAgdm9pZCBiZWdpbkFzeW5jUmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHVpbnQzMl90IGVuZEFzeW5jUmVhZCgpOworCisgIFRBdXRvT3ZlcmxhcFRocmVhZCB0aHJlYWRfOworICBUQXV0b0hhbmRsZSBQaXBlXzsKKyAgVE92ZXJsYXBwZWRXb3JrSXRlbSByZWFkT3ZlcmxhcF87CisgIFRPdmVybGFwcGVkV29ya0l0ZW0gY2FuY2VsT3ZlcmxhcF87CisgIFRNYW51YWxSZXNldEV2ZW50IHJlYWR5X2V2ZW50XzsKKyAgVE1hbnVhbFJlc2V0RXZlbnQgd3JpdGVfZXZlbnRfOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXJfOworICB1aW50MzJfdCBiZWdpbl91bnJlYWRfaWR4XzsKKyAgdWludDMyX3QgZW5kX3VucmVhZF9pZHhfOworfTsKKwordm9pZCBUV2FpdGFibGVOYW1lZFBpcGVJbXBsOjpiZWdpbkFzeW5jUmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBiZWdpbl91bnJlYWRfaWR4XyA9IGVuZF91bnJlYWRfaWR4XyA9IDA7CisgIHJlYWRPdmVybGFwXy5yZXNldChidWYsIGxlbiwgcmVhZHlfZXZlbnRfLmgpOworICB0aHJlYWRfLT5hZGRXb3JrSXRlbSgmcmVhZE92ZXJsYXBfKTsKKyAgaWYgKHJlYWRPdmVybGFwXy5zdWNjZXNzID09IEZBTFNFICYmIHJlYWRPdmVybGFwXy5sYXN0X2Vycm9yICE9IEVSUk9SX0lPX1BFTkRJTkcpIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZSA6OlJlYWRGaWxlIGVycm9yZWQgR0xFPSIsIHJlYWRPdmVybGFwXy5sYXN0X2Vycm9yKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJUUGlwZTogUmVhZEZpbGUgZmFpbGVkIik7CisgIH0KK30KKwordWludDMyX3QgVFdhaXRhYmxlTmFtZWRQaXBlSW1wbDo6ZW5kQXN5bmNSZWFkKCkgeworICByZXR1cm4gcmVhZE92ZXJsYXBfLm92ZXJsYXBwZWRSZXN1bHRzKCk7Cit9CisKK3VpbnQzMl90IFRXYWl0YWJsZU5hbWVkUGlwZUltcGw6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgaWYgKGJlZ2luX3VucmVhZF9pZHhfID09IGVuZF91bnJlYWRfaWR4XykgeworICAgIGVuZF91bnJlYWRfaWR4XyA9IGVuZEFzeW5jUmVhZCgpOworICB9CisKKyAgdWludDMyX3QgX19pZHhzaXplID0gZW5kX3VucmVhZF9pZHhfIC0gYmVnaW5fdW5yZWFkX2lkeF87CisgIHVpbnQzMl90IGJ5dGVzX3RvX2NvcHkgPSAobGVuIDwgX19pZHhzaXplKSA/IGxlbiA6IF9faWR4c2l6ZTsKKyAgbWVtY3B5KGJ1ZiwgJmJ1ZmZlcl9bYmVnaW5fdW5yZWFkX2lkeF9dLCBieXRlc190b19jb3B5KTsKKyAgYmVnaW5fdW5yZWFkX2lkeF8gKz0gYnl0ZXNfdG9fY29weTsKKyAgaWYgKGJlZ2luX3VucmVhZF9pZHhfICE9IGVuZF91bnJlYWRfaWR4XykgeworICAgIGFzc2VydChsZW4gPT0gYnl0ZXNfdG9fY29weSk7CisgICAgLy8gd2Ugd2VyZSBhYmxlIHRvIGZ1bGZpbGwgdGhlIHJlYWQgd2l0aCBqdXN0IHRoZSBieXRlcyBpbiBvdXIKKyAgICAvLyBidWZmZXIsIGFuZCB3ZSBzdGlsbCBoYXZlIGJ1ZmZlciBsZWZ0CisgICAgcmV0dXJuIGJ5dGVzX3RvX2NvcHk7CisgIH0KKyAgdWludDMyX3QgYnl0ZXNfY29waWVkID0gYnl0ZXNfdG9fY29weTsKKworICAvLyBhbGwgb2YgdGhlIHJlcXVlc3RlZCBkYXRhIGhhcyBiZWVuIHJlYWQuICBLaWNrIG9mZiBhbiBhc3luYyByZWFkIGZvciB0aGUgbmV4dCByb3VuZC4KKyAgYmVnaW5Bc3luY1JlYWQoJmJ1ZmZlcl9bMF0sIHN0YXRpY19jYXN0PHVpbnQzMl90PihidWZmZXJfLnNpemUoKSkpOworCisgIHJldHVybiBieXRlc19jb3BpZWQ7Cit9CisKK3ZvaWQgcHNldWRvX3N5bmNfd3JpdGUoSEFORExFIHBpcGUsIEhBTkRMRSBldmVudCwgY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgT1ZFUkxBUFBFRCB0ZW1wT3ZlcmxhcDsKKyAgbWVtc2V0KCZ0ZW1wT3ZlcmxhcCwgMCwgc2l6ZW9mKHRlbXBPdmVybGFwKSk7CisgIHRlbXBPdmVybGFwLmhFdmVudCA9IGV2ZW50OworCisgIHVpbnQzMl90IHdyaXR0ZW4gPSAwOworICB3aGlsZSAod3JpdHRlbiA8IGxlbikgeworICAgIEJPT0wgcmVzdWx0ID0gOjpXcml0ZUZpbGUocGlwZSwgYnVmICsgd3JpdHRlbiwgbGVuIC0gd3JpdHRlbiwgTlVMTCwgJnRlbXBPdmVybGFwKTsKKworICAgIGlmIChyZXN1bHQgPT0gRkFMU0UgJiYgOjpHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9JT19QRU5ESU5HKSB7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZSA6OldyaXRlRmlsZSBlcnJvcmVkIEdMRT0iLCA6OkdldExhc3RFcnJvcigpKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlRQaXBlOiB3cml0ZSBmYWlsZWQiKTsKKyAgICB9CisKKyAgICBEV09SRCBieXRlcyA9IDA7CisgICAgcmVzdWx0ID0gOjpHZXRPdmVybGFwcGVkUmVzdWx0KHBpcGUsICZ0ZW1wT3ZlcmxhcCwgJmJ5dGVzLCBUUlVFKTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGUgOjpHZXRPdmVybGFwcGVkUmVzdWx0IGVycm9yZWQgR0xFPSIsIDo6R2V0TGFzdEVycm9yKCkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVFBpcGU6IEdldE92ZXJsYXBwZWRSZXN1bHQgZmFpbGVkIik7CisgICAgfQorICAgIHdyaXR0ZW4gKz0gYnl0ZXM7CisgIH0KK30KKwordWludDMyX3QgcHNldWRvX3N5bmNfcmVhZChIQU5ETEUgcGlwZSwgSEFORExFIGV2ZW50LCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBPVkVSTEFQUEVEIHRlbXBPdmVybGFwOworICBtZW1zZXQoJnRlbXBPdmVybGFwLCAwLCBzaXplb2YodGVtcE92ZXJsYXApKTsKKyAgdGVtcE92ZXJsYXAuaEV2ZW50ID0gZXZlbnQ7CisKKyAgQk9PTCByZXN1bHQgPSA6OlJlYWRGaWxlKHBpcGUsIGJ1ZiwgbGVuLCBOVUxMLCAmdGVtcE92ZXJsYXApOworCisgIGlmIChyZXN1bHQgPT0gRkFMU0UgJiYgOjpHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9JT19QRU5ESU5HKSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGUgOjpSZWFkRmlsZSBlcnJvcmVkIEdMRT0iLCA6OkdldExhc3RFcnJvcigpKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJUUGlwZTogcmVhZCBmYWlsZWQiKTsKKyAgfQorCisgIERXT1JEIGJ5dGVzID0gMDsKKyAgcmVzdWx0ID0gOjpHZXRPdmVybGFwcGVkUmVzdWx0KHBpcGUsICZ0ZW1wT3ZlcmxhcCwgJmJ5dGVzLCBUUlVFKTsKKyAgaWYgKCFyZXN1bHQpIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZSA6OkdldE92ZXJsYXBwZWRSZXN1bHQgZXJyb3JlZCBHTEU9IiwgOjpHZXRMYXN0RXJyb3IoKSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVFBpcGU6IEdldE92ZXJsYXBwZWRSZXN1bHQgZmFpbGVkIik7CisgIH0KKyAgcmV0dXJuIGJ5dGVzOworfQorCisvLy0tLS0gQ29uc3RydWN0b3JzIC0tLS0KK1RQaXBlOjpUUGlwZShUQXV0b0hhbmRsZSAmUGlwZSkKKyAgOiBpbXBsXyhuZXcgVFdhaXRhYmxlTmFtZWRQaXBlSW1wbChQaXBlKSksIFRpbWVvdXRTZWNvbmRzXygzKSwgaXNBbm9ueW1vdXNfKGZhbHNlKSB7Cit9CisKK1RQaXBlOjpUUGlwZShIQU5ETEUgUGlwZSkKKyAgOiBUaW1lb3V0U2Vjb25kc18oMyksIGlzQW5vbnltb3VzXyhmYWxzZSkKK3sKKyAgVEF1dG9IYW5kbGUgcGlwZUhhbmRsZShQaXBlKTsKKyAgaW1wbF8ucmVzZXQobmV3IFRXYWl0YWJsZU5hbWVkUGlwZUltcGwocGlwZUhhbmRsZSkpOworfQorCitUUGlwZTo6VFBpcGUoY29uc3QgY2hhciogcGlwZW5hbWUpIDogVGltZW91dFNlY29uZHNfKDMpLCBpc0Fub255bW91c18oZmFsc2UpIHsKKyAgc2V0UGlwZW5hbWUocGlwZW5hbWUpOworfQorCitUUGlwZTo6VFBpcGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lKSA6IFRpbWVvdXRTZWNvbmRzXygzKSwgaXNBbm9ueW1vdXNfKGZhbHNlKSB7CisgIHNldFBpcGVuYW1lKHBpcGVuYW1lKTsKK30KKworVFBpcGU6OlRQaXBlKEhBTkRMRSBQaXBlUmQsIEhBTkRMRSBQaXBlV3J0KQorICA6IGltcGxfKG5ldyBUQW5vblBpcGVJbXBsKFBpcGVSZCwgUGlwZVdydCkpLCBUaW1lb3V0U2Vjb25kc18oMyksIGlzQW5vbnltb3VzXyh0cnVlKSB7Cit9CisKK1RQaXBlOjpUUGlwZSgpIDogVGltZW91dFNlY29uZHNfKDMpLCBpc0Fub255bW91c18oZmFsc2UpIHsKK30KKworVFBpcGU6On5UUGlwZSgpIHsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRyYW5zcG9ydCBjYWxsYmFja3MKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitib29sIFRQaXBlOjppc09wZW4oKSB7CisgIHJldHVybiBpbXBsXy5nZXQoKSAhPSBOVUxMOworfQorCitib29sIFRQaXBlOjpwZWVrKCkgeworICByZXR1cm4gaXNPcGVuKCk7Cit9CisKK3ZvaWQgVFBpcGU6Om9wZW4oKSB7CisgIGlmIChpc09wZW4oKSkKKyAgICByZXR1cm47CisKKyAgVEF1dG9IYW5kbGUgaFBpcGU7CisgIGRvIHsKKyAgICBEV09SRCBmbGFncyA9IEZJTEVfRkxBR19PVkVSTEFQUEVEOyAvLyBhc3luYyBtb2RlLCBzbyB3ZSBjYW4gZG8gcmVhZHMgYXQgdGhlIHNhbWUgdGltZSBhcyB3cml0ZXMKKyAgICBoUGlwZS5yZXNldChDcmVhdGVGaWxlQShwaXBlbmFtZV8uY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5FUklDX1JFQUQgfCBHRU5FUklDX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgIC8vIG5vIHNoYXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAvLyBkZWZhdWx0IHNlY3VyaXR5IGF0dHJpYnV0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEVOX0VYSVNUSU5HLCAvLyBvcGVucyBleGlzdGluZyBwaXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpOyAvLyBubyB0ZW1wbGF0ZSBmaWxlCisKKyAgICBpZiAoaFBpcGUuaCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgIGJyZWFrOyAvLyBzdWNjZXNzIQorCisgICAgaWYgKDo6R2V0TGFzdEVycm9yKCkgIT0gRVJST1JfUElQRV9CVVNZKSB7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZTo6b3BlbiA6OkNyZWF0ZUZpbGUgZXJyb3JlZCBHTEU9IiwgOjpHZXRMYXN0RXJyb3IoKSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVW5hYmxlIHRvIG9wZW4gcGlwZSIpOworICAgIH0KKyAgfSB3aGlsZSAoOjpXYWl0TmFtZWRQaXBlQShwaXBlbmFtZV8uY19zdHIoKSwgVGltZW91dFNlY29uZHNfICogMTAwMCkpOworCisgIGlmIChoUGlwZS5oID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGU6Om9wZW4gOjpDcmVhdGVGaWxlIGVycm9yZWQgR0xFPSIsIDo6R2V0TGFzdEVycm9yKCkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJVbmFibGUgdG8gb3BlbiBwaXBlIik7CisgIH0KKworICBpbXBsXy5yZXNldChuZXcgVE5hbWVkUGlwZUltcGwoaFBpcGUpKTsKK30KKwordm9pZCBUUGlwZTo6Y2xvc2UoKSB7CisgIGltcGxfLnJlc2V0KCk7Cit9CisKK3VpbnQzMl90IFRQaXBlOjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGlmICghaXNPcGVuKCkpCisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNhbGxlZCByZWFkIG9uIG5vbi1vcGVuIHBpcGUiKTsKKyAgcmV0dXJuIGltcGxfLT5yZWFkKGJ1ZiwgbGVuKTsKK30KKwordWludDMyX3QgcGlwZV9yZWFkKEhBTkRMRSBwaXBlLCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBEV09SRCBjYlJlYWQ7CisgIGludCBmU3VjY2VzcyA9IFJlYWRGaWxlKHBpcGUsICAgIC8vIHBpcGUgaGFuZGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgICAgIC8vIGJ1ZmZlciB0byByZWNlaXZlIHJlcGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgICAgIC8vIHNpemUgb2YgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYlJlYWQsIC8vIG51bWJlciBvZiBieXRlcyByZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOyAgIC8vIG5vdCBvdmVybGFwcGVkCisKKyAgaWYgKCFmU3VjY2VzcyAmJiBHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9NT1JFX0RBVEEpCisgICAgcmV0dXJuIDA7IC8vIE5vIG1vcmUgZGF0YSwgcG9zc2libHkgYmVjYXVzZSBjbGllbnQgZGlzY29ubmVjdGVkLgorCisgIHJldHVybiBjYlJlYWQ7Cit9CisKK3ZvaWQgVFBpcGU6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGlmICghaXNPcGVuKCkpCisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNhbGxlZCB3cml0ZSBvbiBub24tb3BlbiBwaXBlIik7CisgIGltcGxfLT53cml0ZShidWYsIGxlbik7Cit9CisKK3ZvaWQgcGlwZV93cml0ZShIQU5ETEUgcGlwZSwgY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgRFdPUkQgY2JXcml0dGVuOworICBpbnQgZlN1Y2Nlc3MgPSBXcml0ZUZpbGUocGlwZSwgICAgICAgLy8gcGlwZSBoYW5kbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgICAgICAgIC8vIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgICAgICAgIC8vIG1lc3NhZ2UgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2JXcml0dGVuLCAvLyBieXRlcyB3cml0dGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsgICAgICAvLyBub3Qgb3ZlcmxhcHBlZAorCisgIGlmICghZlN1Y2Nlc3MpCisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIldyaXRlIHRvIHBpcGUgZmFpbGVkIik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBY2Nlc3NvcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0ZDo6c3RyaW5nIFRQaXBlOjpnZXRQaXBlbmFtZSgpIHsKKyAgcmV0dXJuIHBpcGVuYW1lXzsKK30KKwordm9pZCBUUGlwZTo6c2V0UGlwZW5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lKSB7CisgIGlmIChwaXBlbmFtZS5maW5kKCJcXFxcIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgcGlwZW5hbWVfID0gIlxcXFwuXFxwaXBlXFwiICsgcGlwZW5hbWU7CisgIGVsc2UKKyAgICBwaXBlbmFtZV8gPSBwaXBlbmFtZTsKK30KKworSEFORExFIFRQaXBlOjpnZXRQaXBlSGFuZGxlKCkgeworICBpZiAoaW1wbF8pCisgICAgcmV0dXJuIGltcGxfLT5nZXRQaXBlSGFuZGxlKCk7CisgIHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsKK30KKwordm9pZCBUUGlwZTo6c2V0UGlwZUhhbmRsZShIQU5ETEUgcGlwZWhhbmRsZSkgeworICBpZiAoaXNBbm9ueW1vdXNfKQorICAgIGltcGxfLT5zZXRQaXBlSGFuZGxlKHBpcGVoYW5kbGUpOworICBlbHNlCisgIHsKKyAgICBUQXV0b0hhbmRsZSBwaXBlKHBpcGVoYW5kbGUpOworICAgIGltcGxfLnJlc2V0KG5ldyBUTmFtZWRQaXBlSW1wbChwaXBlKSk7CisgIH0KK30KKworSEFORExFIFRQaXBlOjpnZXRXcnRQaXBlSGFuZGxlKCkgeworICBpZiAoaW1wbF8pCisgICAgcmV0dXJuIGltcGxfLT5nZXRXcnRQaXBlSGFuZGxlKCk7CisgIHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsKK30KKwordm9pZCBUUGlwZTo6c2V0V3J0UGlwZUhhbmRsZShIQU5ETEUgcGlwZWhhbmRsZSkgeworICBpZiAoaW1wbF8pCisgICAgaW1wbF8tPnNldFdydFBpcGVIYW5kbGUocGlwZWhhbmRsZSk7Cit9CisKK0hBTkRMRSBUUGlwZTo6Z2V0TmF0aXZlV2FpdEhhbmRsZSgpIHsKKyAgaWYgKGltcGxfKQorICAgIHJldHVybiBpbXBsXy0+Z2V0TmF0aXZlV2FpdEhhbmRsZSgpOworICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Cit9CisKK2xvbmcgVFBpcGU6OmdldENvbm5UaW1lb3V0KCkgeworICByZXR1cm4gVGltZW91dFNlY29uZHNfOworfQorCit2b2lkIFRQaXBlOjpzZXRDb25uVGltZW91dChsb25nIHNlY29uZHMpIHsKKyAgVGltZW91dFNlY29uZHNfID0gc2Vjb25kczsKK30KKworI2VuZGlmIC8vX1dJTjMyCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTE0Zjk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFBJUEVfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFBJUEVfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oPgorI2lmbmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNlbmRpZgorI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1N5bmMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGJvb3N0L25vbmNvcHlhYmxlLmhwcD4KKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9TeW5jLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIFdpbmRvd3MgUGlwZXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorICogRG9uJ3QgZGVzdHJveSBhIFRQaXBlIGF0IGdsb2JhbCBzY29wZSwgYXMgdGhhdCB3aWxsIGNhdXNlIGEgdGhyZWFkIGpvaW4KKyAqIGR1cmluZyBETExNYWluLiAgVGhhdCBhbHNvIG1lYW5zIHRoYXQgY2xpZW50IG9iamVjdHMgdXNpbmcgVFBpcGUgc2hvdWxkbid0IGJlIGF0IGdsb2JhbAorICogc2NvcGUuCisgKi8KKyNpZmRlZiBfV0lOMzIKK2NsYXNzIFRQaXBlSW1wbDsKKworY2xhc3MgVFBpcGUgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VFBpcGU+IHsKK3B1YmxpYzoKKyAgLy8gQ29uc3RydWN0cyBhIG5ldyBwaXBlIG9iamVjdC4KKyAgVFBpcGUoKTsKKyAgLy8gTmFtZWQgcGlwZSBjb25zdHJ1Y3RvcnMgLQorICBleHBsaWNpdCBUUGlwZShIQU5ETEUgUGlwZSk7ICAgICAgIC8vIEhBTkRMRSBpcyBhIHZvaWQqCisgIGV4cGxpY2l0IFRQaXBlKFRBdXRvSGFuZGxlJiBQaXBlKTsgLy8gdGhpcyBjdG9yIHdpbGwgY2xlYXIgb3V0IC8gbW92ZSBmcm9tIFBpcGUKKyAgLy8gbmVlZCBhIGNvbnN0IGNoYXIgKiBvdmVybG9hZCBzbyBzdHJpbmcgbGl0ZXJhbHMgZG9uJ3QgZ28gdG8gdGhlIEhBTkRMRSBvdmVybG9hZAorICBleHBsaWNpdCBUUGlwZShjb25zdCBjaGFyKiBwaXBlbmFtZSk7CisgIGV4cGxpY2l0IFRQaXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSk7CisgIC8vIEFub255bW91cyBwaXBlIC0KKyAgVFBpcGUoSEFORExFIFBpcGVSZCwgSEFORExFIFBpcGVXcnQpOworCisgIC8vIERlc3Ryb3lzIHRoZSBwaXBlIG9iamVjdCwgY2xvc2luZyBpdCBpZiBuZWNlc3NhcnkuCisgIHZpcnR1YWwgflRQaXBlKCk7CisKKyAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBwaXBlIGlzIG9wZW4gJiB2YWxpZC4KKyAgdmlydHVhbCBib29sIGlzT3BlbigpOworCisgIC8vIENoZWNrcyB3aGV0aGVyIG1vcmUgZGF0YSBpcyBhdmFpbGFibGUgaW4gdGhlIHBpcGUuCisgIHZpcnR1YWwgYm9vbCBwZWVrKCk7CisKKyAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIG5hbWVkL2Fub255bW91cyBwaXBlLgorICB2aXJ0dWFsIHZvaWQgb3BlbigpOworCisgIC8vIFNodXRzIGRvd24gY29tbXVuaWNhdGlvbnMgb24gdGhlIHBpcGUuCisgIHZpcnR1YWwgdm9pZCBjbG9zZSgpOworCisgIC8vIFJlYWRzIGZyb20gdGhlIHBpcGUuCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgLy8gV3JpdGVzIHRvIHRoZSBwaXBlLgorICB2aXJ0dWFsIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIC8vIEFjY2Vzc29ycworICBzdGQ6OnN0cmluZyBnZXRQaXBlbmFtZSgpOworICB2b2lkIHNldFBpcGVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSk7CisgIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCk7IC8vIGRvdWJsZXMgYXMgdGhlIHJlYWQgaGFuZGxlIGZvciBhbm9uIHBpcGUKKyAgdm9pZCBzZXRQaXBlSGFuZGxlKEhBTkRMRSBwaXBlaGFuZGxlKTsKKyAgSEFORExFIGdldFdydFBpcGVIYW5kbGUoKTsKKyAgdm9pZCBzZXRXcnRQaXBlSGFuZGxlKEhBTkRMRSBwaXBlaGFuZGxlKTsKKyAgbG9uZyBnZXRDb25uVGltZW91dCgpOworICB2b2lkIHNldENvbm5UaW1lb3V0KGxvbmcgc2Vjb25kcyk7CisKKyAgLy8gdGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGdlbmVyaWMgLyB0ZW1wbGF0ZSBzaXR1YXRpb25zLAorICAvLyBzbyBpdHMgbmFtZSBuZWVkcyB0byBiZSB0aGUgc2FtZSBhcyBUUGlwZVNlcnZlcidzCisgIEhBTkRMRSBnZXROYXRpdmVXYWl0SGFuZGxlKCk7CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxUUGlwZUltcGw+IGltcGxfOworCisgIHN0ZDo6c3RyaW5nIHBpcGVuYW1lXzsKKworICBsb25nIFRpbWVvdXRTZWNvbmRzXzsKKyAgYm9vbCBpc0Fub255bW91c187Cit9OworCisjZWxzZQordHlwZWRlZiBUU29ja2V0IFRQaXBlOworI2VuZGlmCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFBJUEVfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVjMzU4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsNDU5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorI2luY2x1ZGUgPGNzdHJpbmc+CisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5oPgorI2luY2x1ZGUgPGJvb3N0L25vbmNvcHlhYmxlLmhwcD4KKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmg+CisjaW5jbHVkZSA8QWNjQ3RybC5oPgorI2luY2x1ZGUgPEFjbGFwaS5oPgorI2VuZGlmIC8vX1dJTjMyCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworI2lmZGVmIF9XSU4zMgorCit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK2NsYXNzIFRQaXBlU2VydmVySW1wbCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CitwdWJsaWM6CisgIFRQaXBlU2VydmVySW1wbCgpIHt9CisgIHZpcnR1YWwgflRQaXBlU2VydmVySW1wbCgpIHt9CisgIHZpcnR1YWwgdm9pZCBpbnRlcnJ1cHQoKSA9IDA7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKSA9IDA7CisKKyAgdmlydHVhbCBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpID0gMDsKKyAgdmlydHVhbCBIQU5ETEUgZ2V0V3J0UGlwZUhhbmRsZSgpID0gMDsKKyAgdmlydHVhbCBIQU5ETEUgZ2V0Q2xpZW50UmRQaXBlSGFuZGxlKCkgPSAwOworICB2aXJ0dWFsIEhBTkRMRSBnZXRDbGllbnRXcnRQaXBlSGFuZGxlKCkgPSAwOworICB2aXJ0dWFsIEhBTkRMRSBnZXROYXRpdmVXYWl0SGFuZGxlKCkgeyByZXR1cm4gTlVMTDsgfQorfTsKKworY2xhc3MgVEFub25QaXBlU2VydmVyIDogcHVibGljIFRQaXBlU2VydmVySW1wbCB7CitwdWJsaWM6CisgIFRBbm9uUGlwZVNlcnZlcigpIHsKKyAgICAvLyBUaGUgYW5vbnltb3VzIHBpcGUgbmVlZHMgdG8gYmUgY3JlYXRlZCBmaXJzdCBzbyB0aGF0IHRoZSBzZXJ2ZXIgY2FuCisgICAgLy8gcGFzcyB0aGUgaGFuZGxlcyBvbiB0byB0aGUgY2xpZW50IGJlZm9yZSB0aGUgc2VydmUgKGFjY2VwdEltcGwpCisgICAgLy8gYmxvY2tpbmcgY2FsbC4KKyAgICBpZiAoIWNyZWF0ZUFub25QaXBlKCkpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyIENyZWF0ZShBbm9uKVBpcGUgZmFpbGVkLCBHTEU9IiwgR2V0TGFzdEVycm9yKCkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBUUGlwZVNlcnZlciBDcmVhdGUoQW5vbilQaXBlIGZhaWxlZCIpOworICAgIH0KKyAgfQorCisgIHZpcnR1YWwgflRBbm9uUGlwZVNlcnZlcigpIHsKKyAgICBQaXBlUl8ucmVzZXQoKTsKKyAgICBQaXBlV18ucmVzZXQoKTsKKyAgICBDbGllbnRBbm9uUmVhZF8ucmVzZXQoKTsKKyAgICBDbGllbnRBbm9uV3JpdGVfLnJlc2V0KCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgaW50ZXJydXB0KCkge30gLy8gbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZAorCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKTsKKworICB2aXJ0dWFsIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCkgeyByZXR1cm4gUGlwZVJfLmg7IH0KKyAgdmlydHVhbCBIQU5ETEUgZ2V0V3J0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIFBpcGVXXy5oOyB9CisgIHZpcnR1YWwgSEFORExFIGdldENsaWVudFJkUGlwZUhhbmRsZSgpIHsgcmV0dXJuIENsaWVudEFub25SZWFkXy5oOyB9CisgIHZpcnR1YWwgSEFORExFIGdldENsaWVudFdydFBpcGVIYW5kbGUoKSB7IHJldHVybiBDbGllbnRBbm9uV3JpdGVfLmg7IH0KKworcHJpdmF0ZToKKyAgYm9vbCBjcmVhdGVBbm9uUGlwZSgpOworCisgIFRBdXRvSGFuZGxlIFBpcGVSXzsgLy8gQW5vbnltb3VzIFBpcGUgKFIpCisgIFRBdXRvSGFuZGxlIFBpcGVXXzsgLy8gQW5vbnltb3VzIFBpcGUgKFcpCisKKyAgLy8gQ2xpZW50IHNpZGUgYW5vbnltb3VzIHBpcGUgaGFuZGxlcworICAvLz8gRG8gd2UgbmVlZCBkdXBsaWNhdGVzIHRvIHNlbmQgdG8gY2xpZW50PworICBUQXV0b0hhbmRsZSBDbGllbnRBbm9uUmVhZF87CisgIFRBdXRvSGFuZGxlIENsaWVudEFub25Xcml0ZV87Cit9OworCitjbGFzcyBUTmFtZWRQaXBlU2VydmVyIDogcHVibGljIFRQaXBlU2VydmVySW1wbCB7CitwdWJsaWM6CisgIFROYW1lZFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lLCB1aW50MzJfdCBidWZzaXplLCB1aW50MzJfdCBtYXhjb25uZWN0aW9ucykKKyAgICA6IHN0b3BwaW5nXyhmYWxzZSksIHBpcGVuYW1lXyhwaXBlbmFtZSksIGJ1ZnNpemVfKGJ1ZnNpemUpLCBtYXhjb25uc18obWF4Y29ubmVjdGlvbnMpCisgIHsKKyAgICBjb25uZWN0T3ZlcmxhcF8uYWN0aW9uID0gVE92ZXJsYXBwZWRXb3JrSXRlbTo6Q09OTkVDVDsKKyAgICBjYW5jZWxPdmVybGFwXy5hY3Rpb24gPSBUT3ZlcmxhcHBlZFdvcmtJdGVtOjpDQU5DRUxJTzsKKyAgICBUQXV0b0NyaXQgbG9jayhwaXBlX3Byb3RlY3RfKTsKKyAgICBpbml0aWF0ZU5hbWVkQ29ubmVjdChsb2NrKTsKKyAgfQorICB2aXJ0dWFsIH5UTmFtZWRQaXBlU2VydmVyKCkge30KKworICB2aXJ0dWFsIHZvaWQgaW50ZXJydXB0KCkgeworICAgIFRBdXRvQ3JpdCBsb2NrKHBpcGVfcHJvdGVjdF8pOworICAgIGNhY2hlZF9jbGllbnRfLnJlc2V0KCk7CisgICAgaWYgKFBpcGVfLmggIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgIHN0b3BwaW5nXyA9IHRydWU7CisgICAgICBjYW5jZWxPdmVybGFwXy5oID0gUGlwZV8uaDsKKyAgICAgIC8vIFRoaXMgc2hvdWxkIHdha2UgdXAgR2V0T3ZlcmxhcHBlZFJlc3VsdAorICAgICAgdGhyZWFkXy0+YWRkV29ya0l0ZW0oJmNhbmNlbE92ZXJsYXBfKTsKKyAgICB9CisgIH0KKworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCk7CisKKyAgdmlydHVhbCBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIFBpcGVfLmg7IH0KKyAgdmlydHVhbCBIQU5ETEUgZ2V0V3J0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOyB9CisgIHZpcnR1YWwgSEFORExFIGdldENsaWVudFJkUGlwZUhhbmRsZSgpIHsgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOyB9CisgIHZpcnR1YWwgSEFORExFIGdldENsaWVudFdydFBpcGVIYW5kbGUoKSB7IHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsgfQorICB2aXJ0dWFsIEhBTkRMRSBnZXROYXRpdmVXYWl0SGFuZGxlKCkgeyByZXR1cm4gbGlzdGVuX2V2ZW50Xy5oOyB9CisKK3ByaXZhdGU6CisgIGJvb2wgY3JlYXRlTmFtZWRQaXBlKGNvbnN0IFRBdXRvQ3JpdCAmbG9ja1Byb29mKTsKKyAgdm9pZCBpbml0aWF0ZU5hbWVkQ29ubmVjdChjb25zdCBUQXV0b0NyaXQgJmxvY2tQcm9vZik7CisKKyAgVEF1dG9PdmVybGFwVGhyZWFkIHRocmVhZF87CisgIFRPdmVybGFwcGVkV29ya0l0ZW0gY29ubmVjdE92ZXJsYXBfOworICBUT3ZlcmxhcHBlZFdvcmtJdGVtIGNhbmNlbE92ZXJsYXBfOworCisgIGJvb2wgc3RvcHBpbmdfOworICBzdGQ6OnN0cmluZyBwaXBlbmFtZV87CisgIHVpbnQzMl90IGJ1ZnNpemVfOworICB1aW50MzJfdCBtYXhjb25uc187CisgIFRNYW51YWxSZXNldEV2ZW50IGxpc3Rlbl9ldmVudF87CisKKyAgVENyaXRpY2FsU2VjdGlvbiBwaXBlX3Byb3RlY3RfOworICAvLyBvbmx5IHJlYWQgb3Igd3JpdGUgdGhlc2UgdmFyaWFibGVzIHVuZGVybmVhdGggYSBsb2NrZWQgcGlwZV9wcm90ZWN0XworICBzdGQ6OnNoYXJlZF9wdHI8VFBpcGU+IGNhY2hlZF9jbGllbnRfOworICBUQXV0b0hhbmRsZSBQaXBlXzsKK307CisKK0hBTkRMRSBUUGlwZVNlcnZlcjo6Z2V0TmF0aXZlV2FpdEhhbmRsZSgpIHsKKyAgaWYgKGltcGxfKQorICAgIHJldHVybiBpbXBsXy0+Z2V0TmF0aXZlV2FpdEhhbmRsZSgpOworICByZXR1cm4gTlVMTDsKK30KKworLy8tLS0tIENvbnN0cnVjdG9ycyAtLS0tCitUUGlwZVNlcnZlcjo6VFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lLCB1aW50MzJfdCBidWZzaXplKQorICA6IGJ1ZnNpemVfKGJ1ZnNpemUpLCBpc0Fub255bW91c18oZmFsc2UpIHsKKyAgc2V0TWF4Q29ubmVjdGlvbnMoVFBJUEVfU0VSVkVSX01BWF9DT05OU19ERUZBVUxUKTsKKyAgc2V0UGlwZW5hbWUocGlwZW5hbWUpOworfQorCitUUGlwZVNlcnZlcjo6VFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lLCB1aW50MzJfdCBidWZzaXplLCB1aW50MzJfdCBtYXhjb25uZWN0aW9ucykKKyAgOiBidWZzaXplXyhidWZzaXplKSwgaXNBbm9ueW1vdXNfKGZhbHNlKSB7CisgIHNldE1heENvbm5lY3Rpb25zKG1heGNvbm5lY3Rpb25zKTsKKyAgc2V0UGlwZW5hbWUocGlwZW5hbWUpOworfQorCitUUGlwZVNlcnZlcjo6VFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lKSA6IGJ1ZnNpemVfKDEwMjQpLCBpc0Fub255bW91c18oZmFsc2UpIHsKKyAgc2V0TWF4Q29ubmVjdGlvbnMoVFBJUEVfU0VSVkVSX01BWF9DT05OU19ERUZBVUxUKTsKKyAgc2V0UGlwZW5hbWUocGlwZW5hbWUpOworfQorCitUUGlwZVNlcnZlcjo6VFBpcGVTZXJ2ZXIoaW50IGJ1ZnNpemUpIDogYnVmc2l6ZV8oYnVmc2l6ZSksIGlzQW5vbnltb3VzXyh0cnVlKSB7CisgIHNldE1heENvbm5lY3Rpb25zKDEpOworICBpbXBsXy5yZXNldChuZXcgVEFub25QaXBlU2VydmVyKTsKK30KKworVFBpcGVTZXJ2ZXI6OlRQaXBlU2VydmVyKCkgOiBidWZzaXplXygxMDI0KSwgaXNBbm9ueW1vdXNfKHRydWUpIHsKKyAgc2V0TWF4Q29ubmVjdGlvbnMoMSk7CisgIGltcGxfLnJlc2V0KG5ldyBUQW5vblBpcGVTZXJ2ZXIpOworfQorCisvLy0tLS0gRGVzdHJ1Y3RvciAtLS0tCitUUGlwZVNlcnZlcjo6flRQaXBlU2VydmVyKCkge30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRyYW5zcG9ydCBjYWxsYmFja3MKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIFRQaXBlU2VydmVyOjpsaXN0ZW4oKSB7CisgIGlmIChpc0Fub255bW91c18pCisgICAgcmV0dXJuOworICBpbXBsXy5yZXNldChuZXcgVE5hbWVkUGlwZVNlcnZlcihwaXBlbmFtZV8sIGJ1ZnNpemVfLCBtYXhjb25uc18pKTsKK30KKworc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBUUGlwZVNlcnZlcjo6YWNjZXB0SW1wbCgpIHsKKyAgcmV0dXJuIGltcGxfLT5hY2NlcHRJbXBsKCk7Cit9CisKK3NoYXJlZF9wdHI8VFRyYW5zcG9ydD4gVEFub25QaXBlU2VydmVyOjphY2NlcHRJbXBsKCkgeworICAvLyBUaGlzIDAtYnl0ZSByZWFkIHNlcnZlcyBtZXJlbHkgYXMgYSBibG9ja2luZyBjYWxsLgorICBieXRlIGJ1ZjsKKyAgRFdPUkQgYnI7CisgIGludCBmU3VjY2VzcyA9IFJlYWRGaWxlKFBpcGVSXy5oLCAvLyBwaXBlIGhhbmRsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmLCAgICAgLy8gYnVmZmVyIHRvIHJlY2VpdmUgcmVwbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgIC8vIHNpemUgb2YgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICZiciwgICAgICAvLyBudW1iZXIgb2YgYnl0ZXMgcmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsgICAgLy8gbm90IG92ZXJsYXBwZWQKKworICBpZiAoIWZTdWNjZXNzICYmIEdldExhc3RFcnJvcigpICE9IEVSUk9SX01PUkVfREFUQSkgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyIHVuYWJsZSB0byBpbml0aWF0ZSBwaXBlIGNvbW1zLCBHTEU9IiwgR2V0TGFzdEVycm9yKCkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFRQaXBlU2VydmVyIHVuYWJsZSB0byBpbml0aWF0ZSBwaXBlIGNvbW1zIik7CisgIH0KKyAgc2hhcmVkX3B0cjxUUGlwZT4gY2xpZW50KG5ldyBUUGlwZShQaXBlUl8uaCwgUGlwZVdfLmgpKTsKKyAgcmV0dXJuIGNsaWVudDsKK30KKwordm9pZCBUTmFtZWRQaXBlU2VydmVyOjppbml0aWF0ZU5hbWVkQ29ubmVjdChjb25zdCBUQXV0b0NyaXQgJmxvY2tQcm9vZikgeworICBpZiAoc3RvcHBpbmdfKQorICAgIHJldHVybjsKKyAgaWYgKCFjcmVhdGVOYW1lZFBpcGUobG9ja1Byb29mKSkgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyIENyZWF0ZU5hbWVkUGlwZSBmYWlsZWQsIEdMRT0iLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIiBUUGlwZVNlcnZlciBDcmVhdGVOYW1lZFBpcGUgZmFpbGVkIik7CisgIH0KKworICAvLyBUaGUgcHJpb3IgY29ubmVjdGlvbiBoYXMgYmVlbiBoYW5kbGVkLCBzbyBjbG9zZSB0aGUgZ2F0ZQorICBSZXNldEV2ZW50KGxpc3Rlbl9ldmVudF8uaCk7CisgIGNvbm5lY3RPdmVybGFwXy5yZXNldChOVUxMLCAwLCBsaXN0ZW5fZXZlbnRfLmgpOworICBjb25uZWN0T3ZlcmxhcF8uaCA9IFBpcGVfLmg7CisgIHRocmVhZF8tPmFkZFdvcmtJdGVtKCZjb25uZWN0T3ZlcmxhcF8pOworCisgIC8vIFdhaXQgZm9yIHRoZSBjbGllbnQgdG8gY29ubmVjdDsgaWYgaXQgc3VjY2VlZHMsIHRoZQorICAvLyBmdW5jdGlvbiByZXR1cm5zIGEgbm9uemVybyB2YWx1ZS4gSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMKKyAgLy8gemVybywgR2V0TGFzdEVycm9yIHNob3VsZCByZXR1cm4gRVJST1JfUElQRV9DT05ORUNURUQuCisgIGlmIChjb25uZWN0T3ZlcmxhcF8uc3VjY2VzcykgeworICAgIEdsb2JhbE91dHB1dC5wcmludGYoIkNsaWVudCBjb25uZWN0ZWQuIik7CisgICAgY2FjaGVkX2NsaWVudF8ucmVzZXQobmV3IFRQaXBlKFBpcGVfKSk7CisgICAgLy8gbWFrZSBzdXJlIHBlb3BsZSBrbm93IHRoYXQgYSBjb25uZWN0aW9uIGlzIHJlYWR5CisgICAgU2V0RXZlbnQobGlzdGVuX2V2ZW50Xy5oKTsKKyAgICByZXR1cm47CisgIH0KKworICBEV09SRCBkd0VyciA9IGNvbm5lY3RPdmVybGFwXy5sYXN0X2Vycm9yOworICBzd2l0Y2ggKGR3RXJyKSB7CisgIGNhc2UgRVJST1JfUElQRV9DT05ORUNURUQ6CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiQ2xpZW50IGNvbm5lY3RlZC4iKTsKKyAgICBjYWNoZWRfY2xpZW50Xy5yZXNldChuZXcgVFBpcGUoUGlwZV8pKTsKKyAgICAvLyBtYWtlIHN1cmUgcGVvcGxlIGtub3cgdGhhdCBhIGNvbm5lY3Rpb24gaXMgcmVhZHkKKyAgICBTZXRFdmVudChsaXN0ZW5fZXZlbnRfLmgpOworICAgIHJldHVybjsKKyAgY2FzZSBFUlJPUl9JT19QRU5ESU5HOgorICAgIHJldHVybjsgLy8gYWNjZXB0SW1wbCB3aWxsIGRvIHRoZSBhcHByb3ByaWF0ZSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzCisgIGRlZmF1bHQ6CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXIgQ29ubmVjdE5hbWVkUGlwZSBmYWlsZWQsIEdMRT0iLCBkd0Vycik7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVFBpcGVTZXJ2ZXIgQ29ubmVjdE5hbWVkUGlwZSBmYWlsZWQiKTsKKyAgfQorfQorCitzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IFROYW1lZFBpcGVTZXJ2ZXI6OmFjY2VwdEltcGwoKSB7CisgIHsKKyAgICBUQXV0b0NyaXQgbG9jayhwaXBlX3Byb3RlY3RfKTsKKyAgICBpZiAoY2FjaGVkX2NsaWVudF8uZ2V0KCkgIT0gTlVMTCkgeworICAgICAgc2hhcmVkX3B0cjxUUGlwZT4gY2xpZW50OworICAgICAgLy8gemVybyBvdXQgY2FjaGVkX2NsaWVudCwgc2luY2Ugd2UgYXJlIGFib3V0IHRvIHJldHVybiBpdC4KKyAgICAgIGNsaWVudC5zd2FwKGNhY2hlZF9jbGllbnRfKTsKKworICAgICAgLy8ga2ljayBvZmYgdGhlIG5leHQgY29ubmVjdGlvbiBiZWZvcmUgcmV0dXJuaW5nCisgICAgICBpbml0aWF0ZU5hbWVkQ29ubmVjdChsb2NrKTsKKyAgICAgIHJldHVybiBjbGllbnQ7IC8vIHN1Y2Nlc3MhCisgICAgfQorICB9CisKKyAgaWYgKFBpcGVfLmggPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlROYW1lZFBpcGVTZXJ2ZXI6IHNvbWVvbmUgY2FsbGVkIGFjY2VwdCBvbiBhIGNsb3NlZCBwaXBlIHNlcnZlciIpOworICB9CisKKyAgRFdPUkQgZHdEdW1teSA9IDA7CisKKyAgLy8gRm9yIHRoZSBtb3N0IHBhcnQsIFBpcGVfIHNob3VsZCBiZSBwcm90ZWN0ZWQgd2l0aCBwaXBlX3Byb3RlY3RfLiAgV2UgY2FuJ3QKKyAgLy8gcmVhc29uYWJseSBkbyB0aGF0IGhlcmUgdGhvdWdoIHdpdGhvdXQgYnJlYWtpbmcgaW50ZXJydXB0YWJpbGl0eS4gIEhvd2V2ZXIsCisgIC8vIHRoaXMgc2hvdWxkIGJlIHNhZmUsIHRob3VnaCBJJ20gbm90IGhhcHB5IGFib3V0IGl0LiAgV2Ugb25seSBuZWVkIHRvIGVuc3VyZQorICAvLyB0aGF0IG5vIG9uZSB3cml0ZXMgLyBtb2RpZmllcyBQaXBlXy5oIHdoaWxlIHdlIGFyZSByZWFkaW5nIGl0LiAgV2VsbCwgdGhlCisgIC8vIG9ubHkgdHdvIHRoaW5ncyB0aGF0IHNob3VsZCBiZSBtb2RpZnlpbmcgUGlwZV8gYXJlIGFjY2VwdEltcGwsIHRoZQorICAvLyBmdW5jdGlvbnMgaXQgY2FsbHMsIGFuZCB0aGUgZGVzdHJ1Y3Rvci4gIFRob3NlIHRoaW5ncyBzaG91bGRuJ3QgYmUgcnVuCisgIC8vIGNvbmN1cnJlbnRseSBhbnl3YXkuICBTbyB0aGlzIGNhbGwgaXMgJ3JlYWxseScganVzdCBhIHJlYWQgdGhhdCBtYXkgaGFwcGVuCisgIC8vIGNvbmN1cnJlbnRseSB3aXRoIGludGVycnVwdCwgYW5kIHRoYXQgc2hvdWxkIGJlIGZpbmUuCisgIGlmIChHZXRPdmVybGFwcGVkUmVzdWx0KFBpcGVfLmgsICZjb25uZWN0T3ZlcmxhcF8ub3ZlcmxhcCwgJmR3RHVtbXksIFRSVUUpKSB7CisgICAgVEF1dG9Dcml0IGxvY2socGlwZV9wcm90ZWN0Xyk7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiQ2xpZW50IGNvbm5lY3RlZC4iKTsKKyAgICBzaGFyZWRfcHRyPFRQaXBlPiBjbGllbnQobmV3IFRQaXBlKFBpcGVfKSk7CisgICAgLy8ga2ljayBvZmYgdGhlIG5leHQgY29ubmVjdGlvbiBiZWZvcmUgcmV0dXJuaW5nCisgICAgaW5pdGlhdGVOYW1lZENvbm5lY3QobG9jayk7CisgICAgcmV0dXJuIGNsaWVudDsgLy8gc3VjY2VzcyEKKyAgfQorICAvLyBpZiB3ZSBnb3QgaGVyZSwgdGhlbiB3ZSBhcmUgaW4gYW4gZXJyb3IgLyBzaHV0ZG93biBjYXNlCisgIERXT1JEIGdsZSA9IEdldExhc3RFcnJvcigpOyAvLyBzYXZlIGVycm9yIGJlZm9yZSBkb2luZyBjbGVhbnVwCisgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyIENvbm5lY3ROYW1lZFBpcGUgR0xFPSIsIGdsZSk7CisgIGlmKGdsZSA9PSBFUlJPUl9PUEVSQVRJT05fQUJPUlRFRCkgeworICAgIFRBdXRvQ3JpdCBsb2NrKHBpcGVfcHJvdGVjdF8pOyAgICAJLy8gTmVlZGVkIHRvIGluc3VyZSBjb25jdXJyZW50IHRocmVhZCB0byBiZSBvdXQgb2YgaW50ZXJydXB0LgorICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQsICJUUGlwZVNlcnZlcjogc2VydmVyIGludGVydXB0ZWQiKTsKKyAgfQorICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVFBpcGVTZXJ2ZXI6IGNsaWVudCBjb25uZWN0aW9uIGZhaWxlZCIpOworfQorCit2b2lkIFRQaXBlU2VydmVyOjppbnRlcnJ1cHQoKSB7CisgIGlmIChpbXBsXykKKyAgICBpbXBsXy0+aW50ZXJydXB0KCk7Cit9CisKK3ZvaWQgVFBpcGVTZXJ2ZXI6OmNsb3NlKCkgeworICBpbXBsXy5yZXNldCgpOworfQorCitib29sIFROYW1lZFBpcGVTZXJ2ZXI6OmNyZWF0ZU5hbWVkUGlwZShjb25zdCBUQXV0b0NyaXQgJiAvKmxvY2tQcm9vZiovKSB7CisKKyAgLy8gV2luZG93cyAtIHNldCBzZWN1cml0eSB0byBhbGxvdyBub24tZWxldmF0ZWQgYXBwcworICAvLyB0byBhY2Nlc3MgcGlwZXMgY3JlYXRlZCBieSBlbGV2YXRlZCBhcHBzLgorICBTSURfSURFTlRJRklFUl9BVVRIT1JJVFkgU0lEQXV0aFdvcmxkID0gU0VDVVJJVFlfV09STERfU0lEX0FVVEhPUklUWTsKKyAgUFNJRCBldmVyeW9uZV9zaWQgPSBOVUxMOworICBBbGxvY2F0ZUFuZEluaXRpYWxpemVTaWQoCisgICAgICAmU0lEQXV0aFdvcmxkLCAxLCBTRUNVUklUWV9XT1JMRF9SSUQsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICZldmVyeW9uZV9zaWQpOworCisgIEVYUExJQ0lUX0FDQ0VTUyBlYTsKKyAgWmVyb01lbW9yeSgmZWEsIHNpemVvZihFWFBMSUNJVF9BQ0NFU1MpKTsKKyAgZWEuZ3JmQWNjZXNzUGVybWlzc2lvbnMgPSBTUEVDSUZJQ19SSUdIVFNfQUxMIHwgU1RBTkRBUkRfUklHSFRTX0FMTDsKKyAgZWEuZ3JmQWNjZXNzTW9kZSA9IFNFVF9BQ0NFU1M7CisgIGVhLmdyZkluaGVyaXRhbmNlID0gTk9fSU5IRVJJVEFOQ0U7CisgIGVhLlRydXN0ZWUuVHJ1c3RlZUZvcm0gPSBUUlVTVEVFX0lTX1NJRDsKKyAgZWEuVHJ1c3RlZS5UcnVzdGVlVHlwZSA9IFRSVVNURUVfSVNfV0VMTF9LTk9XTl9HUk9VUDsKKyAgZWEuVHJ1c3RlZS5wdHN0ck5hbWUgPSBzdGF0aWNfY2FzdDxMUFRTVFI+KGV2ZXJ5b25lX3NpZCk7CisKKyAgUEFDTCBhY2wgPSBOVUxMOworICBTZXRFbnRyaWVzSW5BY2woMSwgJmVhLCBOVUxMLCAmYWNsKTsKKworICBQU0VDVVJJVFlfREVTQ1JJUFRPUiBzZCA9IChQU0VDVVJJVFlfREVTQ1JJUFRPUilMb2NhbEFsbG9jKExQVFIsIFNFQ1VSSVRZX0RFU0NSSVBUT1JfTUlOX0xFTkdUSCk7CisgIEluaXRpYWxpemVTZWN1cml0eURlc2NyaXB0b3Ioc2QsIFNFQ1VSSVRZX0RFU0NSSVBUT1JfUkVWSVNJT04pOworICBTZXRTZWN1cml0eURlc2NyaXB0b3JEYWNsKHNkLCBUUlVFLCBhY2wsIEZBTFNFKTsKKworICBTRUNVUklUWV9BVFRSSUJVVEVTIHNhOworICBzYS5uTGVuZ3RoID0gc2l6ZW9mKFNFQ1VSSVRZX0FUVFJJQlVURVMpOworICBzYS5scFNlY3VyaXR5RGVzY3JpcHRvciA9IHNkOworICBzYS5iSW5oZXJpdEhhbmRsZSA9IEZBTFNFOworCisgIC8vIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgbmFtZWQgcGlwZQorICBUQXV0b0hhbmRsZSBoUGlwZShDcmVhdGVOYW1lZFBpcGVBKHBpcGVuYW1lXy5jX3N0cigpLCAgICAvLyBwaXBlIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVBFX0FDQ0VTU19EVVBMRVggfCAgLy8gcmVhZC93cml0ZSBhY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX0ZMQUdfT1ZFUkxBUFBFRCwgLy8gYXN5bmMgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJUEVfVFlQRV9CWVRFIHwgICAgICAvLyBieXRlIHR5cGUgcGlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJUEVfUkVBRE1PREVfQllURSwgICAvLyBieXRlIHJlYWQgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGNvbm5zXywgICAgICAgICAgICAvLyBtYXguIGluc3RhbmNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemVfLCAgICAgICAgICAgICAvLyBvdXRwdXQgYnVmZmVyIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplXywgICAgICAgICAgICAgLy8gaW5wdXQgYnVmZmVyIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IHRpbWUtb3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhKSk7ICAgICAgICAgICAgICAgIC8vIHNlY3VyaXR5IGF0dHJpYnV0ZXMKKworICBEV09SRCBsYXN0RXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgTG9jYWxGcmVlKHNkKTsKKyAgTG9jYWxGcmVlKGFjbCk7CisgIEZyZWVTaWQoZXZlcnlvbmVfc2lkKTsKKworICBpZiAoaFBpcGUuaCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgIFBpcGVfLnJlc2V0KCk7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXI6OlRDcmVhdGVOYW1lZFBpcGUoKSBHTEU9IiwgbGFzdEVycm9yKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRDcmVhdGVOYW1lZFBpcGUoKSBmYWlsZWQiLAorICAgICAgICAgICAgICAgIGxhc3RFcnJvcik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgUGlwZV8ucmVzZXQoaFBpcGUucmVsZWFzZSgpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVEFub25QaXBlU2VydmVyOjpjcmVhdGVBbm9uUGlwZSgpIHsKKyAgU0VDVVJJVFlfQVRUUklCVVRFUyBzYTsKKyAgU0VDVVJJVFlfREVTQ1JJUFRPUiBzZDsgLy8gc2VjdXJpdHkgaW5mb3JtYXRpb24gZm9yIHBpcGVzCisKKyAgSW5pdGlhbGl6ZVNlY3VyaXR5RGVzY3JpcHRvcigmc2QsIFNFQ1VSSVRZX0RFU0NSSVBUT1JfUkVWSVNJT04pOworICBTZXRTZWN1cml0eURlc2NyaXB0b3JEYWNsKCZzZCwgdHJ1ZSwgTlVMTCwgZmFsc2UpOworICBzYS5scFNlY3VyaXR5RGVzY3JpcHRvciA9ICZzZDsKKyAgc2Eubkxlbmd0aCA9IHNpemVvZihTRUNVUklUWV9BVFRSSUJVVEVTKTsKKyAgc2EuYkluaGVyaXRIYW5kbGUgPSB0cnVlOyAvLyBhbGxvdyBwYXNzaW5nIGhhbmRsZSB0byBjaGlsZAorCisgIEhBTkRMRSBDbGllbnRBbm9uUmVhZEgsIFBpcGVXX0gsIENsaWVudEFub25Xcml0ZUgsIFBpcGVfSDsKKyAgaWYgKCFDcmVhdGVQaXBlKCZDbGllbnRBbm9uUmVhZEgsICZQaXBlV19ILCAmc2EsIDApKSAvLyBjcmVhdGUgc3RkaW4gcGlwZQorICB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXIgQ3JlYXRlUGlwZSAoYW5vbikgZmFpbGVkLCBHTEU9IiwgR2V0TGFzdEVycm9yKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUNyZWF0ZVBpcGUoJlBpcGVfSCwgJkNsaWVudEFub25Xcml0ZUgsICZzYSwgMCkpIC8vIGNyZWF0ZSBzdGRvdXQgcGlwZQorICB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXIgQ3JlYXRlUGlwZSAoYW5vbikgZmFpbGVkLCBHTEU9IiwgR2V0TGFzdEVycm9yKCkpOworICAgIENsb3NlSGFuZGxlKENsaWVudEFub25SZWFkSCk7CisgICAgQ2xvc2VIYW5kbGUoUGlwZVdfSCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQ2xpZW50QW5vblJlYWRfLnJlc2V0KENsaWVudEFub25SZWFkSCk7CisgIENsaWVudEFub25Xcml0ZV8ucmVzZXQoQ2xpZW50QW5vbldyaXRlSCk7CisgIFBpcGVSXy5yZXNldChQaXBlX0gpOworICBQaXBlV18ucmVzZXQoUGlwZVdfSCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBY2Nlc3NvcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGQ6OnN0cmluZyBUUGlwZVNlcnZlcjo6Z2V0UGlwZW5hbWUoKSB7CisgIHJldHVybiBwaXBlbmFtZV87Cit9CisKK3ZvaWQgVFBpcGVTZXJ2ZXI6OnNldFBpcGVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSkgeworICBpZiAocGlwZW5hbWUuZmluZCgiXFxcXCIpID09IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgIHBpcGVuYW1lXyA9ICJcXFxcLlxccGlwZVxcIiArIHBpcGVuYW1lOworICBlbHNlCisgICAgcGlwZW5hbWVfID0gcGlwZW5hbWU7Cit9CisKK2ludCBUUGlwZVNlcnZlcjo6Z2V0QnVmZmVyU2l6ZSgpIHsKKyAgcmV0dXJuIGJ1ZnNpemVfOworfQordm9pZCBUUGlwZVNlcnZlcjo6c2V0QnVmZmVyU2l6ZShpbnQgYnVmc2l6ZSkgeworICBidWZzaXplXyA9IGJ1ZnNpemU7Cit9CisKK0hBTkRMRSBUUGlwZVNlcnZlcjo6Z2V0UGlwZUhhbmRsZSgpIHsKKyAgcmV0dXJuIGltcGxfID8gaW1wbF8tPmdldFBpcGVIYW5kbGUoKSA6IElOVkFMSURfSEFORExFX1ZBTFVFOworfQorSEFORExFIFRQaXBlU2VydmVyOjpnZXRXcnRQaXBlSGFuZGxlKCkgeworICByZXR1cm4gaW1wbF8gPyBpbXBsXy0+Z2V0V3J0UGlwZUhhbmRsZSgpIDogSU5WQUxJRF9IQU5ETEVfVkFMVUU7Cit9CitIQU5ETEUgVFBpcGVTZXJ2ZXI6OmdldENsaWVudFJkUGlwZUhhbmRsZSgpIHsKKyAgcmV0dXJuIGltcGxfID8gaW1wbF8tPmdldENsaWVudFJkUGlwZUhhbmRsZSgpIDogSU5WQUxJRF9IQU5ETEVfVkFMVUU7Cit9CitIQU5ETEUgVFBpcGVTZXJ2ZXI6OmdldENsaWVudFdydFBpcGVIYW5kbGUoKSB7CisgIHJldHVybiBpbXBsXyA/IGltcGxfLT5nZXRDbGllbnRXcnRQaXBlSGFuZGxlKCkgOiBJTlZBTElEX0hBTkRMRV9WQUxVRTsKK30KKworYm9vbCBUUGlwZVNlcnZlcjo6Z2V0QW5vbnltb3VzKCkgeworICByZXR1cm4gaXNBbm9ueW1vdXNfOworfQordm9pZCBUUGlwZVNlcnZlcjo6c2V0QW5vbnltb3VzKGJvb2wgYW5vbikgeworICBpc0Fub255bW91c18gPSBhbm9uOworfQorCit2b2lkIFRQaXBlU2VydmVyOjpzZXRNYXhDb25uZWN0aW9ucyh1aW50MzJfdCBtYXhjb25uZWN0aW9ucykgeworICBpZiAobWF4Y29ubmVjdGlvbnMgPT0gMCkKKyAgICBtYXhjb25uc18gPSAxOworICBlbHNlIGlmIChtYXhjb25uZWN0aW9ucyA+IFBJUEVfVU5MSU1JVEVEX0lOU1RBTkNFUykKKyAgICBtYXhjb25uc18gPSBQSVBFX1VOTElNSVRFRF9JTlNUQU5DRVM7CisgIGVsc2UKKyAgICBtYXhjb25uc18gPSBtYXhjb25uZWN0aW9uczsKK30KKworI2VuZGlmIC8vX1dJTjMyCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWIxM2U1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUldJTlBJUEVTX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJXSU5QSVBFU19IXyAxCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0Lmg+CisjaWZuZGVmIF9XSU4zMgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2VuZGlmCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvU3luYy5oPgorI2VuZGlmCisKKyNkZWZpbmUgVFBJUEVfU0VSVkVSX01BWF9DT05OU19ERUZBVUxUIFBJUEVfVU5MSU1JVEVEX0lOU1RBTkNFUworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogV2luZG93cyBQaXBlcyBpbXBsZW1lbnRhdGlvbiBvZiBUU2VydmVyVHJhbnNwb3J0LgorICogRG9uJ3QgZGVzdHJveSBhIFRQaXBlU2VydmVyIGF0IGdsb2JhbCBzY29wZSwgYXMgdGhhdCB3aWxsIGNhdXNlIGEgdGhyZWFkIGpvaW4KKyAqIGR1cmluZyBETExNYWluLiAgVGhhdCBhbHNvIG1lYW5zIHRoYXQgVFNlcnZlcidzIHVzaW5nIFRQaXBlU2VydmVyIHNob3VsZG4ndCBiZSBhdCBnbG9iYWwKKyAqIHNjb3BlLgorICovCisjaWZkZWYgX1dJTjMyCitjbGFzcyBUUGlwZVNlcnZlckltcGw7CitjbGFzcyBUUGlwZTsKKworY2xhc3MgVFBpcGVTZXJ2ZXIgOiBwdWJsaWMgVFNlcnZlclRyYW5zcG9ydCB7CitwdWJsaWM6CisgIC8vIENvbnN0cnVjdG9ycworICAvLyBOYW1lZCBQaXBlIC0KKyAgVFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lLCB1aW50MzJfdCBidWZzaXplKTsKKyAgVFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lLCB1aW50MzJfdCBidWZzaXplLCB1aW50MzJfdCBtYXhjb25uZWN0aW9ucyk7CisgIFRQaXBlU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSk7CisgIC8vIEFub255bW91cyBwaXBlIC0KKyAgVFBpcGVTZXJ2ZXIoaW50IGJ1ZnNpemUpOworICBUUGlwZVNlcnZlcigpOworCisgIC8vIERlc3RydWN0b3IKKyAgdmlydHVhbCB+VFBpcGVTZXJ2ZXIoKTsKKworICAvLyBTdGFuZGFyZCB0cmFuc3BvcnQgY2FsbGJhY2tzCisgIHZpcnR1YWwgdm9pZCBpbnRlcnJ1cHQoKTsKKyAgdmlydHVhbCB2b2lkIGNsb3NlKCk7CisgIHZpcnR1YWwgdm9pZCBsaXN0ZW4oKTsKKworICAvLyBBY2Nlc3NvcnMKKyAgc3RkOjpzdHJpbmcgZ2V0UGlwZW5hbWUoKTsKKyAgdm9pZCBzZXRQaXBlbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUpOworICBpbnQgZ2V0QnVmZmVyU2l6ZSgpOworICB2b2lkIHNldEJ1ZmZlclNpemUoaW50IGJ1ZnNpemUpOworICBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpOyAvLyBOYW1lZCBQaXBlIFIvVyAtb3ItIEFub255bW91cyBwaXBlIFJlYWQgaGFuZGxlCisgIEhBTkRMRSBnZXRXcnRQaXBlSGFuZGxlKCk7CisgIEhBTkRMRSBnZXRDbGllbnRSZFBpcGVIYW5kbGUoKTsKKyAgSEFORExFIGdldENsaWVudFdydFBpcGVIYW5kbGUoKTsKKyAgYm9vbCBnZXRBbm9ueW1vdXMoKTsKKyAgdm9pZCBzZXRBbm9ueW1vdXMoYm9vbCBhbm9uKTsKKyAgdm9pZCBzZXRNYXhDb25uZWN0aW9ucyh1aW50MzJfdCBtYXhjb25uZWN0aW9ucyk7CisKKyAgLy8gdGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGdlbmVyaWMgLyB0ZW1wbGF0ZSBzaXR1YXRpb25zLAorICAvLyBzbyBpdHMgbmFtZSBuZWVkcyB0byBiZSB0aGUgc2FtZSBhcyBUUGlwZSdzCisgIEhBTkRMRSBnZXROYXRpdmVXYWl0SGFuZGxlKCk7CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpOworCitwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8VFBpcGVTZXJ2ZXJJbXBsPiBpbXBsXzsKKworICBzdGQ6OnN0cmluZyBwaXBlbmFtZV87CisgIHVpbnQzMl90IGJ1ZnNpemVfOworICB1aW50MzJfdCBtYXhjb25uc187CisgIGJvb2wgaXNBbm9ueW1vdXNfOworfTsKKyNlbHNlIC8vX1dJTjMyCisvLypOSVggbmFtZWQgcGlwZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGRvbWFpbiBzb2NrZXQKK3R5cGVkZWYgVFNlcnZlclNvY2tldCBUUGlwZVNlcnZlcjsKKyNlbmRpZgorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJXSU5QSVBFU19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ2MDVjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5jcHAKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBTU0wgc2VydmVyIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KKyAqLworVFNTTFNlcnZlclNvY2tldDo6VFNTTFNlcnZlclNvY2tldChpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KQorICA6IFRTZXJ2ZXJTb2NrZXQocG9ydCksIGZhY3RvcnlfKGZhY3RvcnkpIHsKKyAgZmFjdG9yeV8tPnNlcnZlcih0cnVlKTsKK30KKworVFNTTFNlcnZlclNvY2tldDo6VFNTTFNlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSkKKyAgOiBUU2VydmVyU29ja2V0KGFkZHJlc3MsIHBvcnQpLCBmYWN0b3J5XyhmYWN0b3J5KSB7CisgIGZhY3RvcnlfLT5zZXJ2ZXIodHJ1ZSk7Cit9CisKK1RTU0xTZXJ2ZXJTb2NrZXQ6OlRTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZW5kVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlY3ZUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpCisgIDogVFNlcnZlclNvY2tldChwb3J0LCBzZW5kVGltZW91dCwgcmVjdlRpbWVvdXQpLCBmYWN0b3J5XyhmYWN0b3J5KSB7CisgIGZhY3RvcnlfLT5zZXJ2ZXIodHJ1ZSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBUU1NMU2VydmVyU29ja2V0OjpjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBjbGllbnQpIHsKKyAgaWYgKGludGVycnVwdGFibGVDaGlsZHJlbl8pIHsKKyAgICAgIHJldHVybiBmYWN0b3J5Xy0+Y3JlYXRlU29ja2V0KGNsaWVudCwgcENoaWxkSW50ZXJydXB0U29ja1JlYWRlcl8pOworCisgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFjdG9yeV8tPmNyZWF0ZVNvY2tldChjbGllbnQpOworICB9Cit9Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNzVkZTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNTTFNFUlZFUlNPQ0tFVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU1NMU0VSVkVSU09DS0VUX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK2NsYXNzIFRTU0xTb2NrZXRGYWN0b3J5OworCisvKioKKyAqIFNlcnZlciBzb2NrZXQgdGhhdCBhY2NlcHRzIFNTTCBjb25uZWN0aW9ucy4KKyAqLworY2xhc3MgVFNTTFNlcnZlclNvY2tldCA6IHB1YmxpYyBUU2VydmVyU29ja2V0IHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLiAgQmluZHMgdG8gYWxsIGludGVyZmFjZXMuCisgICAqCisgICAqIEBwYXJhbSBwb3J0ICAgIExpc3RlbmluZyBwb3J0CisgICAqIEBwYXJhbSBmYWN0b3J5IFNTTCBzb2NrZXQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgorICAgKi8KKyAgVFNTTFNlcnZlclNvY2tldChpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuICBCaW5kcyB0byB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuCisgICAqCisgICAqIEBwYXJhbSBhZGRyZXNzIEFkZHJlc3MgdG8gYmluZCB0bworICAgKiBAcGFyYW0gcG9ydCAgICBMaXN0ZW5pbmcgcG9ydAorICAgKiBAcGFyYW0gZmFjdG9yeSBTU0wgc29ja2V0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24KKyAgICovCisgIFRTU0xTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuICBCaW5kcyB0byBhbGwgaW50ZXJmYWNlcy4KKyAgICoKKyAgICogQHBhcmFtIHBvcnQgICAgICAgIExpc3RlbmluZyBwb3J0CisgICAqIEBwYXJhbSBzZW5kVGltZW91dCBTb2NrZXQgc2VuZCB0aW1lb3V0CisgICAqIEBwYXJhbSByZWN2VGltZW91dCBTb2NrZXQgcmVjZWl2ZSB0aW1lb3V0CisgICAqIEBwYXJhbSBmYWN0b3J5ICAgICBTU0wgc29ja2V0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24KKyAgICovCisgIFRTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgaW50IHNlbmRUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgIGludCByZWN2VGltZW91dCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOworCitwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQpOworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnlfOworfTsKK30KK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MThlOWIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmNwcApAQCAtMCwwICsxLDExMTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2lmZGVmIEhBVkVfQVJQQV9JTkVUX0gKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfUE9MTF9ICisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfRkNOVExfSAorI2luY2x1ZGUgPGZjbnRsLmg+CisjZW5kaWYKKworI2RlZmluZSBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEX0JFRk9SRSAgICAweDEwMDAwMDAwTAorI2RlZmluZSBPUEVOU1NMX0VOR0lORV9DTEVBTlVQX1JFUVVJUkVEX0JFRk9SRSAweDEwMTAwMDAwTAorCisjaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX2FycmF5LmhwcD4KKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2x2Lmg+CisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX0VOR0lORV9DTEVBTlVQX1JFUVVJUkVEX0JFRk9SRSkKKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKK3VzaW5nIHN0ZDo6c3RyaW5nOworCitzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUgeworICBNdXRleCBtdXRleDsKK307CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLy8gT3BlblNTTCBpbml0aWFsaXphdGlvbi9jbGVhbnVwCisKK3N0YXRpYyBib29sIG9wZW5TU0xJbml0aWFsaXplZCA9IGZhbHNlOworc3RhdGljIGJvb3N0OjpzaGFyZWRfYXJyYXk8TXV0ZXg+IG11dGV4ZXM7CisKK3N0YXRpYyB2b2lkIGNhbGxiYWNrTG9ja2luZyhpbnQgbW9kZSwgaW50IG4sIGNvbnN0IGNoYXIqLCBpbnQpIHsKKyAgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykgeworICAgIC8vIGFzc2VydGlvbiBvZiAocHggIT0gMCkgaGVyZSB0eXBpY2FsbHkgbWVhbnMgdGhhdCBhIFRTU0xTb2NrZXQncyBsaWZldGltZQorICAgIC8vIGV4Y2VlZGVkIHRoZSBsaWZldGltZSBvZiB0aGUgVFNTTFNvY2tldEZhY3RvcnkgdGhhdCBjcmVhdGVkIGl0LCBhbmQgdGhlCisgICAgLy8gVFNTTFNvY2tldEZhY3RvcnkgYWxyZWFkeSByYW4gY2xlYW51cE9wZW5TU0woKSwgd2hpY2ggZGVsZXRlZCAibXV0ZXhlcyIuCisgICAgbXV0ZXhlc1tuXS5sb2NrKCk7CisgIH0gZWxzZSB7CisgICAgbXV0ZXhlc1tuXS51bmxvY2soKTsKKyAgfQorfQorCisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEX0JFRk9SRSkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNhbGxiYWNrVGhyZWFkSUQoKSB7CisjaWZkZWYgX1dJTjMyCisgIHJldHVybiAodW5zaWduZWQgbG9uZylHZXRDdXJyZW50VGhyZWFkSWQoKTsKKyNlbHNlCisgIHJldHVybiAodW5zaWduZWQgbG9uZylwdGhyZWFkX3NlbGYoKTsKKyNlbmRpZgorfQorI2VuZGlmCisKK3N0YXRpYyBDUllQVE9fZHlubG9ja192YWx1ZSogZHluX2NyZWF0ZShjb25zdCBjaGFyKiwgaW50KSB7CisgIHJldHVybiBuZXcgQ1JZUFRPX2R5bmxvY2tfdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIGR5bl9sb2NrKGludCBtb2RlLCBzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUqIGxvY2ssIGNvbnN0IGNoYXIqLCBpbnQpIHsKKyAgaWYgKGxvY2sgIT0gTlVMTCkgeworICAgIGlmIChtb2RlICYgQ1JZUFRPX0xPQ0spIHsKKyAgICAgIGxvY2stPm11dGV4LmxvY2soKTsKKyAgICB9IGVsc2UgeworICAgICAgbG9jay0+bXV0ZXgudW5sb2NrKCk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIGR5bl9kZXN0cm95KHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSogbG9jaywgY29uc3QgY2hhciosIGludCkgeworICBkZWxldGUgbG9jazsKK30KKwordm9pZCBpbml0aWFsaXplT3BlblNTTCgpIHsKKyAgaWYgKG9wZW5TU0xJbml0aWFsaXplZCkgeworICAgIHJldHVybjsKKyAgfQorICBvcGVuU1NMSW5pdGlhbGl6ZWQgPSB0cnVlOworICBTU0xfbGlicmFyeV9pbml0KCk7CisgIFNTTF9sb2FkX2Vycm9yX3N0cmluZ3MoKTsKKyAgRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKworICAvLyBzdGF0aWMgbG9ja2luZworICAvLyBuZXdlciB2ZXJzaW9ucyBvZiBPcGVuU1NMIGNoYW5nZWQgQ1JZUFRPX251bV9sb2NrcyAtIHNlZSBUSFJJRlQtMzg3OAorI2lmZGVmIENSWVBUT19udW1fbG9ja3MKKyAgbXV0ZXhlcyA9IGJvb3N0OjpzaGFyZWRfYXJyYXk8TXV0ZXg+KG5ldyBNdXRleFtDUllQVE9fbnVtX2xvY2tzKCldKTsKKyNlbHNlCisgIG11dGV4ZXMgPSBib29zdDo6c2hhcmVkX2FycmF5PE11dGV4PihuZXcgTXV0ZXhbIDo6Q1JZUFRPX251bV9sb2NrcygpXSk7CisjZW5kaWYKKworI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRF9CRUZPUkUpCisgIENSWVBUT19zZXRfaWRfY2FsbGJhY2soY2FsbGJhY2tUaHJlYWRJRCk7CisjZW5kaWYKKworICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soY2FsbGJhY2tMb2NraW5nKTsKKworICAvLyBkeW5hbWljIGxvY2tpbmcKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayhkeW5fY3JlYXRlKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2soZHluX2xvY2spOworICBDUllQVE9fc2V0X2R5bmxvY2tfZGVzdHJveV9jYWxsYmFjayhkeW5fZGVzdHJveSk7Cit9CisKK3ZvaWQgY2xlYW51cE9wZW5TU0woKSB7CisgIGlmICghb3BlblNTTEluaXRpYWxpemVkKSB7CisgICAgcmV0dXJuOworICB9CisgIG9wZW5TU0xJbml0aWFsaXplZCA9IGZhbHNlOworCisgIC8vIGh0dHBzOi8vd2lraS5vcGVuc3NsLm9yZy9pbmRleC5waHAvTGlicmFyeV9Jbml0aWFsaXphdGlvbiNDbGVhbnVwCisgIC8vIHdlIHB1cnBvc2VmdWxseSBkbyBOT1QgY2FsbCBGSVBTX21vZGVfc2V0KDApIGFuZCBsZWF2ZSBpdCB1cCB0byB0aGUgZW5jbG9zaW5nIGFwcGxpY2F0aW9uIHRvIG1hbmFnZSBGSVBTIGVudGlyZWx5CisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX0VOR0lORV9DTEVBTlVQX1JFUVVJUkVEX0JFRk9SRSkKKyAgRU5HSU5FX2NsZWFudXAoKTsgICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvZG9jcy9tYW4xLjEuMC9jcnlwdG8vRU5HSU5FX2NsZWFudXAuaHRtbCAtIGNsZWFudXAgY2FsbCBpcyBuZWVkZWQgYmVmb3JlIDEuMS4wCisjZW5kaWYKKyAgQ09ORl9tb2R1bGVzX3VubG9hZCgxKTsKKyAgRVZQX2NsZWFudXAoKTsKKyAgQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKTsKKyAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKKyAgRVJSX2ZyZWVfc3RyaW5ncygpOworCisgIG11dGV4ZXMucmVzZXQoKTsKK30KKworc3RhdGljIHZvaWQgYnVpbGRFcnJvcnMoc3RyaW5nJiBtZXNzYWdlLCBpbnQgZXJybm9fY29weSA9IDAsIGludCBzc2xlcnJubyA9IDApOworc3RhdGljIGJvb2wgbWF0Y2hOYW1lKGNvbnN0IGNoYXIqIGhvc3QsIGNvbnN0IGNoYXIqIHBhdHRlcm4sIGludCBzaXplKTsKK3N0YXRpYyBjaGFyIHVwcGVyY2FzZShjaGFyIGMpOworCisvLyBTU0xDb250ZXh0IGltcGxlbWVudGF0aW9uCitTU0xDb250ZXh0OjpTU0xDb250ZXh0KGNvbnN0IFNTTFByb3RvY29sJiBwcm90b2NvbCkgeworICBpZiAocHJvdG9jb2wgPT0gU1NMVExTKSB7CisgICAgY3R4XyA9IFNTTF9DVFhfbmV3KFNTTHYyM19tZXRob2QoKSk7CisjaWZuZGVmIE9QRU5TU0xfTk9fU1NMMworICB9IGVsc2UgaWYgKHByb3RvY29sID09IFNTTHYzKSB7CisgICAgY3R4XyA9IFNTTF9DVFhfbmV3KFNTTHYzX21ldGhvZCgpKTsKKyNlbmRpZgorICB9IGVsc2UgaWYgKHByb3RvY29sID09IFRMU3YxXzApIHsKKyAgICBjdHhfID0gU1NMX0NUWF9uZXcoVExTdjFfbWV0aG9kKCkpOworICB9IGVsc2UgaWYgKHByb3RvY29sID09IFRMU3YxXzEpIHsKKyAgICBjdHhfID0gU1NMX0NUWF9uZXcoVExTdjFfMV9tZXRob2QoKSk7CisgIH0gZWxzZSBpZiAocHJvdG9jb2wgPT0gVExTdjFfMikgeworICAgIGN0eF8gPSBTU0xfQ1RYX25ldyhUTFN2MV8yX21ldGhvZCgpKTsKKyAgfSBlbHNlIHsKKyAgICAvLy8gVU5LTk9XTiBQUk9UT0NPTCEKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfQ1RYX25ldzogVW5rbm93biBwcm90b2NvbCIpOworICB9CisKKyAgaWYgKGN0eF8gPT0gTlVMTCkgeworICAgIHN0cmluZyBlcnJvcnM7CisgICAgYnVpbGRFcnJvcnMoZXJyb3JzKTsKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfQ1RYX25ldzogIiArIGVycm9ycyk7CisgIH0KKyAgU1NMX0NUWF9zZXRfbW9kZShjdHhfLCBTU0xfTU9ERV9BVVRPX1JFVFJZKTsKKworICAvLyBEaXNhYmxlIGhvcnJpYmx5IGluc2VjdXJlIFNTTHYyIGFuZCBTU0x2MyBwcm90b2NvbHMgYnV0IGFsbG93IGEgaGFuZHNoYWtlCisgIC8vIHdpdGggb2xkZXIgY2xpZW50cyBzbyB0aGV5IGdldCBhIGdyYWNlZnVsIGRlbmlhbC4KKyAgaWYgKHByb3RvY29sID09IFNTTFRMUykgeworICAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjdHhfLCBTU0xfT1BfTk9fU1NMdjIpOworICAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjdHhfLCBTU0xfT1BfTk9fU1NMdjMpOyAgIC8vIFRIUklGVC0zMTY0CisgIH0KK30KKworU1NMQ29udGV4dDo6flNTTENvbnRleHQoKSB7CisgIGlmIChjdHhfICE9IE5VTEwpIHsKKyAgICBTU0xfQ1RYX2ZyZWUoY3R4Xyk7CisgICAgY3R4XyA9IE5VTEw7CisgIH0KK30KKworU1NMKiBTU0xDb250ZXh0OjpjcmVhdGVTU0woKSB7CisgIFNTTCogc3NsID0gU1NMX25ldyhjdHhfKTsKKyAgaWYgKHNzbCA9PSBOVUxMKSB7CisgICAgc3RyaW5nIGVycm9yczsKKyAgICBidWlsZEVycm9ycyhlcnJvcnMpOworICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9uZXc6ICIgKyBlcnJvcnMpOworICB9CisgIHJldHVybiBzc2w7Cit9CisKKy8vIFRTU0xTb2NrZXQgaW1wbGVtZW50YXRpb24KK1RTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCkKKyAgOiBUU29ja2V0KCksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKE5VTEwpLCBjdHhfKGN0eCkgeworICBpbml0KCk7Cit9CisKK1RTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKQorICAgICAgICA6IFRTb2NrZXQoKSwgc2VydmVyXyhmYWxzZSksIHNzbF8oTlVMTCksIGN0eF8oY3R4KSB7CisgIGluaXQoKTsKKyAgaW50ZXJydXB0TGlzdGVuZXJfID0gaW50ZXJydXB0TGlzdGVuZXI7Cit9CisKK1RTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgVEhSSUZUX1NPQ0tFVCBzb2NrZXQpCisgIDogVFNvY2tldChzb2NrZXQpLCBzZXJ2ZXJfKGZhbHNlKSwgc3NsXyhOVUxMKSwgY3R4XyhjdHgpIHsKKyAgaW5pdCgpOworfQorCitUU1NMU29ja2V0OjpUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIFRIUklGVF9TT0NLRVQgc29ja2V0LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpCisgICAgICAgIDogVFNvY2tldChzb2NrZXQsIGludGVycnVwdExpc3RlbmVyKSwgc2VydmVyXyhmYWxzZSksIHNzbF8oTlVMTCksIGN0eF8oY3R4KSB7CisgIGluaXQoKTsKK30KKworVFNTTFNvY2tldDo6VFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBzdHJpbmcgaG9zdCwgaW50IHBvcnQpCisgIDogVFNvY2tldChob3N0LCBwb3J0KSwgc2VydmVyXyhmYWxzZSksIHNzbF8oTlVMTCksIGN0eF8oY3R4KSB7CisgIGluaXQoKTsKK30KKworVFNTTFNvY2tldDo6VFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBzdHJpbmcgaG9zdCwgaW50IHBvcnQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikKKyAgICAgICAgOiBUU29ja2V0KGhvc3QsIHBvcnQpLCBzZXJ2ZXJfKGZhbHNlKSwgc3NsXyhOVUxMKSwgY3R4XyhjdHgpIHsKKyAgaW5pdCgpOworICBpbnRlcnJ1cHRMaXN0ZW5lcl8gPSBpbnRlcnJ1cHRMaXN0ZW5lcjsKK30KKworVFNTTFNvY2tldDo6flRTU0xTb2NrZXQoKSB7CisgIGNsb3NlKCk7Cit9CisKK2Jvb2wgVFNTTFNvY2tldDo6aGFzUGVuZGluZ0RhdGFUb1JlYWQoKSB7CisgIGlmICghaXNPcGVuKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaW5pdGlhbGl6ZUhhbmRzaGFrZSgpOworICBpZiAoIWNoZWNrSGFuZHNoYWtlKCkpCisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiVFNTTFNvY2tldDo6aGFzUGVuZGluZ0RhdGFUb1JlYWQ6IEhhbmRzaGFrZSBpcyBub3QgY29tcGxldGVkIik7CisgIC8vIGRhdGEgbWF5IGJlIGF2YWlsYWJsZSBpbiBTU0wgYnVmZmVycyAobm90ZTogU1NMX3BlbmRpbmcgZG9lcyBub3QgaGF2ZSBhIGZhaWx1cmUgbW9kZSkKKyAgcmV0dXJuIFNTTF9wZW5kaW5nKHNzbF8pID4gMCB8fCBUU29ja2V0OjpoYXNQZW5kaW5nRGF0YVRvUmVhZCgpOworfQorCit2b2lkIFRTU0xTb2NrZXQ6OmluaXQoKSB7CisgIGhhbmRzaGFrZUNvbXBsZXRlZF8gPSBmYWxzZTsKKyAgcmVhZFJldHJ5Q291bnRfID0gMDsKKyAgZXZlbnRTYWZlXyA9IGZhbHNlOworfQorCitib29sIFRTU0xTb2NrZXQ6OmlzT3BlbigpIHsKKyAgaWYgKHNzbF8gPT0gTlVMTCB8fCAhVFNvY2tldDo6aXNPcGVuKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaW50IHNodXRkb3duID0gU1NMX2dldF9zaHV0ZG93bihzc2xfKTsKKyAgLy8gIiEhIiBpcyBzcXVlbGNoaW5nIEM0ODAwICJmb3JjaW5nIGJvb2wgLT4gdHJ1ZSBvciBmYWxzZSIgcGVyZm9ybWFuY2Ugd2FybmluZworICBib29sIHNodXRkb3duUmVjZWl2ZWQgPSAhIShzaHV0ZG93biAmIFNTTF9SRUNFSVZFRF9TSFVURE9XTik7CisgIGJvb2wgc2h1dGRvd25TZW50ID0gISEoc2h1dGRvd24gJiBTU0xfU0VOVF9TSFVURE9XTik7CisgIGlmIChzaHV0ZG93blJlY2VpdmVkICYmIHNodXRkb3duU2VudCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIG5vdCBsaWJldmVudCBzYWZlLgorKi8KK2Jvb2wgVFNTTFNvY2tldDo6cGVlaygpIHsKKyAgaWYgKCFpc09wZW4oKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpbml0aWFsaXplSGFuZHNoYWtlKCk7CisgIGlmICghY2hlY2tIYW5kc2hha2UoKSkKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfcGVlazogSGFuZHNoYWtlIGlzIG5vdCBjb21wbGV0ZWQiKTsKKyAgaW50IHJjOworICB1aW50OF90IGJ5dGU7CisgIGRvIHsKKyAgICByYyA9IFNTTF9wZWVrKHNzbF8sICZieXRlLCAxKTsKKyAgICBpZiAocmMgPCAwKSB7CisKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBpbnQgZXJyb3IgPSBTU0xfZ2V0X2Vycm9yKHNzbF8sIHJjKTsKKyAgICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKyAgICAgICAgICBpZiAoKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VJTlRSKQorICAgICAgICAgICAgICAmJiAoZXJybm9fY29weSAhPSBUSFJJRlRfRUFHQUlOKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAvLyBmYWxsdGhyb3VnaAorICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiByZWFkIGV2ZW50IGFnYWluCisgICAgICAgICAgd2FpdEZvckV2ZW50KGVycm9yICE9IFNTTF9FUlJPUl9XQU5UX1dSSVRFKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZGVmYXVsdDo7Ly8gZG8gbm90aGluZworICAgICAgfQorICAgICAgc3RyaW5nIGVycm9yczsKKyAgICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSwgZXJyb3IpOworICAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX3BlZWs6ICIgKyBlcnJvcnMpOworICAgIH0gZWxzZSBpZiAocmMgPT0gMCkgeworICAgICAgRVJSX2NsZWFyX2Vycm9yKCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gd2hpbGUgKHRydWUpOworICByZXR1cm4gKHJjID4gMCk7Cit9CisKK3ZvaWQgVFNTTFNvY2tldDo6b3BlbigpIHsKKyAgaWYgKGlzT3BlbigpIHx8IHNlcnZlcigpKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUyk7CisgIH0KKyAgVFNvY2tldDo6b3BlbigpOworfQorCisvKgorICogTm90ZTogVGhpcyBtZXRob2QgaXMgbm90IGxpYmV2ZW50IHNhZmUuCisqLwordm9pZCBUU1NMU29ja2V0OjpjbG9zZSgpIHsKKyAgaWYgKHNzbF8gIT0gTlVMTCkgeworICAgIHRyeSB7CisgICAgICBpbnQgcmM7CisgICAgICBpbnQgZXJybm9fY29weSA9IDA7CisgICAgICBpbnQgZXJyb3IgPSAwOworCisgICAgICBkbyB7CisgICAgICAgIHJjID0gU1NMX3NodXRkb3duKHNzbF8pOworICAgICAgICBpZiAocmMgPD0gMCkgeworICAgICAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgICAgICBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsXywgcmMpOworICAgICAgICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgICAgICAgIGlmICgoZXJybm9fY29weSAhPSBUSFJJRlRfRUlOVFIpCisgICAgICAgICAgICAgICAgICAmJiAoZXJybm9fY29weSAhPSBUSFJJRlRfRUFHQUlOKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmYWxsdGhyb3VnaAorICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiB3cml0ZS9yZWFkIGV2ZW50IGFnYWluCisgICAgICAgICAgICAgIHdhaXRGb3JFdmVudChlcnJvciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKTsKKyAgICAgICAgICAgICAgcmMgPSAyOworICAgICAgICAgICAgZGVmYXVsdDo7Ly8gZG8gbm90aGluZworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAocmMgPT0gMik7CisKKyAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgc3RyaW5nIGVycm9yczsKKyAgICAgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5LCBlcnJvcik7CisgICAgICAgIEdsb2JhbE91dHB1dCgoIlNTTF9zaHV0ZG93bjogIiArIGVycm9ycykuY19zdHIoKSk7CisgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdGUpIHsKKyAgICAgIC8vIERvbid0IGVtaXQgYW4gZXhjZXB0aW9uIGJlY2F1c2UgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZQorICAgICAgLy8gZGVzdHJ1Y3Rvci4gVGhlcmUncyBhbHNvIG5vdCBtdWNoIHRoYXQgYSB1c2VyIGNhbiBkbyB0byByZWNvdmVyLCBzbworICAgICAgLy8ganVzdCBjbGVhbiB1cCBhcyBtdWNoIGFzIHBvc3NpYmxlIHdpdGhvdXQgdGhyb3dpbmcsIHNpbWlsYXIgdG8gdGhlIHJjCisgICAgICAvLyA8IDAgY2FzZSBhYm92ZS4KKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlNTTF9zaHV0ZG93bjogJXMiLCB0ZS53aGF0KCkpOworICAgIH0KKyAgICBTU0xfZnJlZShzc2xfKTsKKyAgICBzc2xfID0gTlVMTDsKKyAgICBoYW5kc2hha2VDb21wbGV0ZWRfID0gZmFsc2U7CisgICAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKKyAgfQorICBUU29ja2V0OjpjbG9zZSgpOworfQorCisvKgorICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcmVhZCBpbiBTU0wgU29ja2V0LgorICogSWYgZXZlbnRTYWZlIGlzIHNldCwgYW5kIGl0IG1heSByZXR1cm5zIDAgYnl0ZXMgdGhlbiByZWFkIG1ldGhvZAorICogbmVlZHMgdG8gYmUgY2FsbGVkIGFnYWluIHVudGlsIGl0IGlzIHN1Y2Nlc3NmdWxsIG9yIGl0IHRocm93cworICogZXhjZXB0aW9uIGluY2FzZSBvZiBmYWlsdXJlLgorKi8KK3VpbnQzMl90IFRTU0xTb2NrZXQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgaW5pdGlhbGl6ZUhhbmRzaGFrZSgpOworICBpZiAoIWNoZWNrSGFuZHNoYWtlKCkpCisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAicmV0cnkgYWdhaW4iKTsKKyAgaW50MzJfdCBieXRlcyA9IDA7CisgIHdoaWxlIChyZWFkUmV0cnlDb3VudF8gPCBtYXhSZWN2UmV0cmllc18pIHsKKyAgICBieXRlcyA9IFNTTF9yZWFkKHNzbF8sIGJ1ZiwgbGVuKTsKKyAgICBpbnQzMl90IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBpbnQzMl90IGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCBieXRlcyk7CisgICAgcmVhZFJldHJ5Q291bnRfKys7CisgICAgaWYgKGVycm9yID09IFNTTF9FUlJPUl9OT05FKSB7CisgICAgICByZWFkUmV0cnlDb3VudF8gPSAwOworICAgICAgYnJlYWs7CisgICAgfQorICAgIHVuc2lnbmVkIGludCB3YWl0RXZlbnRSZXR1cm47CisgICAgYm9vbCBicmVha291dCA9IGZhbHNlOworICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgIGNhc2UgU1NMX0VSUk9SX1pFUk9fUkVUVVJOOgorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFLCAiY2xpZW50IGRpc2Nvbm5lY3RlZCIpOworCisgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICBpZiAoZXJybm9fY29weSA9PSAwICYmIEVSUl9wZWVrX2Vycm9yKCkgPT0gMCkgeworICAgICAgICAgIGJyZWFrb3V0ID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VJTlRSKQorICAgICAgICAgICAgJiYgKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VBR0FJTikpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlYWRSZXRyeUNvdW50XyA+PSBtYXhSZWN2UmV0cmllc18pIHsKKyAgICAgICAgICAvLyBUSFJJRlRfRUlOVFIgbmVlZHMgdG8gYmUgaGFuZGxlZCBtYW51YWxseSBhbmQgd2UgY2FuIHRvbGVyYXRlCisgICAgICAgICAgLy8gYSBjZXJ0YWluIG51bWJlcgorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAvLyBmYWxsdGhyb3VnaAorCisgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICBpZiAoaXNMaWJldmVudFNhZmUoKSkgeworICAgICAgICAgIGlmIChyZWFkUmV0cnlDb3VudF8gPCBtYXhSZWN2UmV0cmllc18pIHsKKyAgICAgICAgICAgIC8vIFRIUklGVF9FSU5UUiBuZWVkcyB0byBiZSBoYW5kbGVkIG1hbnVhbGx5IGFuZCB3ZSBjYW4gdG9sZXJhdGUKKyAgICAgICAgICAgIC8vIGEgY2VydGFpbiBudW1iZXIKKyAgICAgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgInJldHJ5IGFnYWluIik7CisgICAgICAgICAgfQorICAgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IsICJ0b28gbXVjaCByZWN2IHJldHJpZXMiKTsKKyAgICAgICAgfQorICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBTU0xfRVJST1JfU1lTQ0FMTCB3ZSB3YW50IHRvIHdhaXQgZm9yIGFuIHJlYWQgZXZlbnQgYWdhaW4KKyAgICAgICAgZWxzZSBpZiAoKHdhaXRFdmVudFJldHVybiA9IHdhaXRGb3JFdmVudChlcnJvciAhPSBTU0xfRVJST1JfV0FOVF9XUklURSkpID09IFRTU0xfRUlOVFIgKSB7CisgICAgICAgICAgLy8gcmVwZWF0IG9wZXJhdGlvbgorICAgICAgICAgIGlmIChyZWFkUmV0cnlDb3VudF8gPCBtYXhSZWN2UmV0cmllc18pIHsKKyAgICAgICAgICAgIC8vIFRIUklGVF9FSU5UUiBuZWVkcyB0byBiZSBoYW5kbGVkIG1hbnVhbGx5IGFuZCB3ZSBjYW4gdG9sZXJhdGUKKyAgICAgICAgICAgIC8vIGEgY2VydGFpbiBudW1iZXIKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLCAidG9vIG11Y2ggcmVjdiByZXRyaWVzIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAod2FpdEV2ZW50UmV0dXJuID09IFRTU0xfREFUQSkgeworICAgICAgICAgICAgLy8gaW4gY2FzZSBvZiBTU0wgYW5kIGh1Z2UgdGhyaWZ0IHBhY2tldHMsIHRoZXJlIG1heSBiZSBhIG51bWJlciBvZgorICAgICAgICAgICAgLy8gc29ja2V0IG9wZXJhdGlvbnMsIGJlZm9yZSBhbnkgZGF0YSBiZWNvbWVzIGF2YWlsYWJsZSBieSBTU0xfcmVhZCgpLgorICAgICAgICAgICAgLy8gVGhlcmVmb3JlIHRoZSBudW1iZXIgb2YgcmV0cmllcyBzaG91bGQgbm90IGJlIGluY3JlYXNlZCBhbmQKKyAgICAgICAgICAgIC8vIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIHJlcGVhdGVkLgorICAgICAgICAgICAgcmVhZFJldHJ5Q291bnRfLS07CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLCAidW5rb3duIHdhaXRGb3JFdmVudCByZXR1cm4gdmFsdWUiKTsKKyAgICAgIGRlZmF1bHQ6Oy8vIGRvIG5vdGhpbmcKKyAgICB9CisgICAgaWYgKGJyZWFrb3V0KSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgc3RyaW5nIGVycm9yczsKKyAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHksIGVycm9yKTsKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfcmVhZDogIiArIGVycm9ycyk7CisgIH0KKyAgcmV0dXJuIGJ5dGVzOworfQorCit2b2lkIFRTU0xTb2NrZXQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGluaXRpYWxpemVIYW5kc2hha2UoKTsKKyAgaWYgKCFjaGVja0hhbmRzaGFrZSgpKQorICAgIHJldHVybjsKKyAgLy8gbG9vcCBpbiBjYXNlIFNTTF9NT0RFX0VOQUJMRV9QQVJUSUFMX1dSSVRFIGlzIHNldCBpbiBTU0xfQ1RYLgorICB1aW50MzJfdCB3cml0dGVuID0gMDsKKyAgd2hpbGUgKHdyaXR0ZW4gPCBsZW4pIHsKKyAgICBFUlJfY2xlYXJfZXJyb3IoKTsKKyAgICBpbnQzMl90IGJ5dGVzID0gU1NMX3dyaXRlKHNzbF8sICZidWZbd3JpdHRlbl0sIGxlbiAtIHdyaXR0ZW4pOworICAgIGlmIChieXRlcyA8PSAwKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgaW50IGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCBieXRlcyk7CisgICAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICAgJiYgKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VBR0FJTikpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgLy8gZmFsbHRocm91Z2ggICAgICAgIAorICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisgICAgICAgICAgaWYgKGlzTGliZXZlbnRTYWZlKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBTU0xfRVJST1JfU1lTQ0FMTCB3ZSB3YW50IHRvIHdhaXQgZm9yIGFuIHdyaXRlIGV2ZW50IGFnYWluCisgICAgICAgICAgICB3YWl0Rm9yRXZlbnQoZXJyb3IgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6Oy8vIGRvIG5vdGhpbmcKKyAgICAgIH0KKyAgICAgIHN0cmluZyBlcnJvcnM7CisgICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHksIGVycm9yKTsKKyAgICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF93cml0ZTogIiArIGVycm9ycyk7CisgICAgfQorICAgIHdyaXR0ZW4gKz0gYnl0ZXM7CisgIH0KK30KKworLyoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaW4gU1NMIFNvY2tldC4KKyAqIElmIGV2ZW50U2FmZSBpcyBzZXQsIGFuZCBpdCBtYXkgcmV0dXJucyAwIGJ5dGVzIHRoZW4gd3JpdGUgbWV0aG9kCisgKiBuZWVkcyB0byBiZSBjYWxsZWQgYWdhaW4gdW50aWwgaXQgaXMgc3VjY2Vzc2Z1bGwgb3IgaXQgdGhyb3dzCisgKiBleGNlcHRpb24gaW5jYXNlIG9mIGZhaWx1cmUuCisqLwordWludDMyX3QgVFNTTFNvY2tldDo6d3JpdGVfcGFydGlhbChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBpbml0aWFsaXplSGFuZHNoYWtlKCk7CisgIGlmICghY2hlY2tIYW5kc2hha2UoKSkKKyAgICByZXR1cm4gMDsKKyAgLy8gbG9vcCBpbiBjYXNlIFNTTF9NT0RFX0VOQUJMRV9QQVJUSUFMX1dSSVRFIGlzIHNldCBpbiBTU0xfQ1RYLgorICB1aW50MzJfdCB3cml0dGVuID0gMDsKKyAgd2hpbGUgKHdyaXR0ZW4gPCBsZW4pIHsKKyAgICBFUlJfY2xlYXJfZXJyb3IoKTsKKyAgICBpbnQzMl90IGJ5dGVzID0gU1NMX3dyaXRlKHNzbF8sICZidWZbd3JpdHRlbl0sIGxlbiAtIHdyaXR0ZW4pOworICAgIGlmIChieXRlcyA8PSAwKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgaW50IGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCBieXRlcyk7CisgICAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICAgJiYgKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VBR0FJTikpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgLy8gZmFsbHRocm91Z2gKKyAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgIGlmIChpc0xpYmV2ZW50U2FmZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBTU0xfRVJST1JfU1lTQ0FMTCB3ZSB3YW50IHRvIHdhaXQgZm9yIGFuIHdyaXRlIGV2ZW50IGFnYWluCisgICAgICAgICAgICB3YWl0Rm9yRXZlbnQoZXJyb3IgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6Oy8vIGRvIG5vdGhpbmcKKyAgICAgIH0KKyAgICAgIHN0cmluZyBlcnJvcnM7CisgICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHksIGVycm9yKTsKKyAgICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF93cml0ZTogIiArIGVycm9ycyk7CisgICAgfQorICAgIHdyaXR0ZW4gKz0gYnl0ZXM7CisgIH0KKyAgcmV0dXJuIHdyaXR0ZW47Cit9CisKK3ZvaWQgVFNTTFNvY2tldDo6Zmx1c2goKSB7CisgIC8vIERvbid0IHRocm93IGV4Y2VwdGlvbiBpZiBub3Qgb3Blbi4gVGhyaWZ0IHNlcnZlcnMgY2xvc2Ugc29ja2V0IHR3aWNlLgorICBpZiAoc3NsXyA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIGluaXRpYWxpemVIYW5kc2hha2UoKTsKKyAgaWYgKCFjaGVja0hhbmRzaGFrZSgpKQorICAgIHRocm93IFRTU0xFeGNlcHRpb24oIkJJT19mbHVzaDogSGFuZHNoYWtlIGlzIG5vdCBjb21wbGV0ZWQiKTsKKyAgQklPKiBiaW8gPSBTU0xfZ2V0X3diaW8oc3NsXyk7CisgIGlmIChiaW8gPT0gTlVMTCkgeworICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9nZXRfd2JpbyByZXR1cm5zIE5VTEwiKTsKKyAgfQorICBpZiAoQklPX2ZsdXNoKGJpbykgIT0gMSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgc3RyaW5nIGVycm9yczsKKyAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHkpOworICAgIHRocm93IFRTU0xFeGNlcHRpb24oIkJJT19mbHVzaDogIiArIGVycm9ycyk7CisgIH0KK30KKwordm9pZCBUU1NMU29ja2V0Ojppbml0aWFsaXplSGFuZHNoYWtlUGFyYW1zKCkgeworICAvLyBzZXQgdW5kZXJseWluZyBzb2NrZXQgdG8gbm9uLWJsb2NraW5nCisgIGludCBmbGFnczsKKyAgaWYgKChmbGFncyA9IFRIUklGVF9GQ05UTChzb2NrZXRfLCBUSFJJRlRfRl9HRVRGTCwgMCkpIDwgMAorICAgICAgfHwgVEhSSUZUX0ZDTlRMKHNvY2tldF8sIFRIUklGVF9GX1NFVEZMLCBmbGFncyB8IFRIUklGVF9PX05PTkJMT0NLKSA8IDApIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJ0aHJpZnRTZXJ2ZXJFdmVudEhhbmRsZXI6IHNldCBUSFJJRlRfT19OT05CTE9DSyAoVEhSSUZUX0ZDTlRMKSAiLAorICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKHNvY2tldF8pOworICAgIHJldHVybjsKKyAgfQorICBzc2xfID0gY3R4Xy0+Y3JlYXRlU1NMKCk7CisKKyAgU1NMX3NldF9mZChzc2xfLCBzdGF0aWNfY2FzdDxpbnQ+KHNvY2tldF8pKTsKK30KKworYm9vbCBUU1NMU29ja2V0OjpjaGVja0hhbmRzaGFrZSgpIHsKKyAgcmV0dXJuIGhhbmRzaGFrZUNvbXBsZXRlZF87Cit9CisKK3ZvaWQgVFNTTFNvY2tldDo6aW5pdGlhbGl6ZUhhbmRzaGFrZSgpIHsKKyAgaWYgKCFUU29ja2V0Ojppc09wZW4oKSkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICB9CisgIGlmIChjaGVja0hhbmRzaGFrZSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHNzbF8gPT0gTlVMTCkgeworICAgIGluaXRpYWxpemVIYW5kc2hha2VQYXJhbXMoKTsKKyAgfQorCisgIGludCByYzsKKyAgaW50IGVycm5vX2NvcHkgPSAwOworICBpbnQgZXJyb3IgPSAwOworICBpZiAoc2VydmVyKCkpIHsKKyAgICBkbyB7CisgICAgICByYyA9IFNTTF9hY2NlcHQoc3NsXyk7CisgICAgICBpZiAocmMgPD0gMCkgeworICAgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAgIGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCByYyk7CisgICAgICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICAgICAmJiAoZXJybm9fY29weSAhPSBUSFJJRlRfRUFHQUlOKSkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAvLyBmYWxsdGhyb3VnaAorICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgICAgaWYgKGlzTGliZXZlbnRTYWZlKCkpIHsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIC8vIHJlcGVhdCBvcGVyYXRpb24KKyAgICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiB3cml0ZS9yZWFkIGV2ZW50IGFnYWluCisgICAgICAgICAgICAgIHdhaXRGb3JFdmVudChlcnJvciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKTsKKyAgICAgICAgICAgICAgcmMgPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6Oy8vIGRvIG5vdGhpbmcKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gd2hpbGUgKHJjID09IDIpOworICB9IGVsc2UgeworICAgIC8vIE9wZW5TU0wgPCAwLjkuOGYgZG9lcyBub3QgaGF2ZSBTU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWUoKQorICAgICNpZiBkZWZpbmVkKFNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZSkKKyAgICAgIC8vIHNldCB0aGUgU05JIGhvc3RuYW1lCisgICAgICBTU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWUoc3NsXywgZ2V0SG9zdCgpLmNfc3RyKCkpOworICAgICNlbmRpZgorICAgIGRvIHsKKyAgICAgIHJjID0gU1NMX2Nvbm5lY3Qoc3NsXyk7CisgICAgICBpZiAocmMgPD0gMCkgeworICAgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAgIGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCByYyk7CisgICAgICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICAgICAmJiAoZXJybm9fY29weSAhPSBUSFJJRlRfRUFHQUlOKSkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAvLyBmYWxsdGhyb3VnaAorICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgICAgaWYgKGlzTGliZXZlbnRTYWZlKCkpIHsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIC8vIHJlcGVhdCBvcGVyYXRpb24KKyAgICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiB3cml0ZS9yZWFkIGV2ZW50IGFnYWluCisgICAgICAgICAgICAgIHdhaXRGb3JFdmVudChlcnJvciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKTsKKyAgICAgICAgICAgICAgcmMgPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6Oy8vIGRvIG5vdGhpbmcKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gd2hpbGUgKHJjID09IDIpOworICB9CisgIGlmIChyYyA8PSAwKSB7CisgICAgc3RyaW5nIGZuYW1lKHNlcnZlcigpID8gIlNTTF9hY2NlcHQiIDogIlNTTF9jb25uZWN0Iik7CisgICAgc3RyaW5nIGVycm9yczsKKyAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHksIGVycm9yKTsKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKGZuYW1lICsgIjogIiArIGVycm9ycyk7CisgIH0KKyAgYXV0aG9yaXplKCk7CisgIGhhbmRzaGFrZUNvbXBsZXRlZF8gPSB0cnVlOworfQorCit2b2lkIFRTU0xTb2NrZXQ6OmF1dGhvcml6ZSgpIHsKKyAgaW50IHJjID0gU1NMX2dldF92ZXJpZnlfcmVzdWx0KHNzbF8pOworICBpZiAocmMgIT0gWDUwOV9WX09LKSB7IC8vIHZlcmlmeSBhdXRoZW50aWNhdGlvbiByZXN1bHQKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKHN0cmluZygiU1NMX2dldF92ZXJpZnlfcmVzdWx0KCksICIpICsgWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcocmMpKTsKKyAgfQorCisgIFg1MDkqIGNlcnQgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc3NsXyk7CisgIGlmIChjZXJ0ID09IE5VTEwpIHsKKyAgICAvLyBjZXJ0aWZpY2F0ZSBpcyBub3QgcHJlc2VudAorICAgIGlmIChTU0xfZ2V0X3ZlcmlmeV9tb2RlKHNzbF8pICYgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkgeworICAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiYXV0aG9yaXplOiByZXF1aXJlZCBjZXJ0aWZpY2F0ZSBub3QgcHJlc2VudCIpOworICAgIH0KKyAgICAvLyBjZXJ0aWZpY2F0ZSB3YXMgb3B0aW9uYWw6IGRpZG4ndCBpbnRlbmQgdG8gYXV0aG9yaXplIHJlbW90ZQorICAgIGlmIChzZXJ2ZXIoKSAmJiBhY2Nlc3NfICE9IE5VTEwpIHsKKyAgICAgIHRocm93IFRTU0xFeGNlcHRpb24oImF1dGhvcml6ZTogY2VydGlmaWNhdGUgcmVxdWlyZWQgZm9yIGF1dGhvcml6YXRpb24iKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIC8vIGNlcnRpZmljYXRlIGlzIHByZXNlbnQKKyAgaWYgKGFjY2Vzc18gPT0gTlVMTCkgeworICAgIFg1MDlfZnJlZShjZXJ0KTsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gYm90aCBjZXJ0aWZpY2F0ZSBhbmQgYWNjZXNzIG1hbmFnZXIgYXJlIHByZXNlbnQKKworICBzdHJpbmcgaG9zdDsKKyAgc29ja2FkZHJfc3RvcmFnZSBzYTsKKyAgc29ja2xlbl90IHNhTGVuZ3RoID0gc2l6ZW9mKHNhKTsKKworICBpZiAoZ2V0cGVlcm5hbWUoc29ja2V0XywgKHNvY2thZGRyKikmc2EsICZzYUxlbmd0aCkgIT0gMCkgeworICAgIHNhLnNzX2ZhbWlseSA9IEFGX1VOU1BFQzsKKyAgfQorCisgIEFjY2Vzc01hbmFnZXI6OkRlY2lzaW9uIGRlY2lzaW9uID0gYWNjZXNzXy0+dmVyaWZ5KHNhKTsKKworICBpZiAoZGVjaXNpb24gIT0gQWNjZXNzTWFuYWdlcjo6U0tJUCkgeworICAgIFg1MDlfZnJlZShjZXJ0KTsKKyAgICBpZiAoZGVjaXNpb24gIT0gQWNjZXNzTWFuYWdlcjo6QUxMT1cpIHsKKyAgICAgIHRocm93IFRTU0xFeGNlcHRpb24oImF1dGhvcml6ZTogYWNjZXNzIGRlbmllZCBiYXNlZCBvbiByZW1vdGUgSVAiKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gZXh0cmFjdCBzdWJqZWN0QWx0ZXJuYXRpdmVOYW1lCisgIFNUQUNLX09GKEdFTkVSQUxfTkFNRSkqIGFsdGVybmF0aXZlcworICAgICAgPSAoU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSopWDUwOV9nZXRfZXh0X2QyaShjZXJ0LCBOSURfc3ViamVjdF9hbHRfbmFtZSwgTlVMTCwgTlVMTCk7CisgIGlmIChhbHRlcm5hdGl2ZXMgIT0gTlVMTCkgeworICAgIGNvbnN0IGludCBjb3VudCA9IHNrX0dFTkVSQUxfTkFNRV9udW0oYWx0ZXJuYXRpdmVzKTsKKyAgICBmb3IgKGludCBpID0gMDsgZGVjaXNpb24gPT0gQWNjZXNzTWFuYWdlcjo6U0tJUCAmJiBpIDwgY291bnQ7IGkrKykgeworICAgICAgY29uc3QgR0VORVJBTF9OQU1FKiBuYW1lID0gc2tfR0VORVJBTF9OQU1FX3ZhbHVlKGFsdGVybmF0aXZlcywgaSk7CisgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgY2hhciogZGF0YSA9IChjaGFyKilBU04xX1NUUklOR19kYXRhKG5hbWUtPmQuaWE1KTsKKyAgICAgIGludCBsZW5ndGggPSBBU04xX1NUUklOR19sZW5ndGgobmFtZS0+ZC5pYTUpOworICAgICAgc3dpdGNoIChuYW1lLT50eXBlKSB7CisgICAgICBjYXNlIEdFTl9ETlM6CisgICAgICAgIGlmIChob3N0LmVtcHR5KCkpIHsKKyAgICAgICAgICBob3N0ID0gKHNlcnZlcigpID8gZ2V0UGVlckhvc3QoKSA6IGdldEhvc3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgZGVjaXNpb24gPSBhY2Nlc3NfLT52ZXJpZnkoaG9zdCwgZGF0YSwgbGVuZ3RoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdFTl9JUEFERDoKKyAgICAgICAgZGVjaXNpb24gPSBhY2Nlc3NfLT52ZXJpZnkoc2EsIGRhdGEsIGxlbmd0aCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBza19HRU5FUkFMX05BTUVfcG9wX2ZyZWUoYWx0ZXJuYXRpdmVzLCBHRU5FUkFMX05BTUVfZnJlZSk7CisgIH0KKworICBpZiAoZGVjaXNpb24gIT0gQWNjZXNzTWFuYWdlcjo6U0tJUCkgeworICAgIFg1MDlfZnJlZShjZXJ0KTsKKyAgICBpZiAoZGVjaXNpb24gIT0gQWNjZXNzTWFuYWdlcjo6QUxMT1cpIHsKKyAgICAgIHRocm93IFRTU0xFeGNlcHRpb24oImF1dGhvcml6ZTogYWNjZXNzIGRlbmllZCIpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICAvLyBleHRyYWN0IGNvbW1vbk5hbWUKKyAgWDUwOV9OQU1FKiBuYW1lID0gWDUwOV9nZXRfc3ViamVjdF9uYW1lKGNlcnQpOworICBpZiAobmFtZSAhPSBOVUxMKSB7CisgICAgWDUwOV9OQU1FX0VOVFJZKiBlbnRyeTsKKyAgICB1bnNpZ25lZCBjaGFyKiB1dGY4OworICAgIGludCBsYXN0ID0gLTE7CisgICAgd2hpbGUgKGRlY2lzaW9uID09IEFjY2Vzc01hbmFnZXI6OlNLSVApIHsKKyAgICAgIGxhc3QgPSBYNTA5X05BTUVfZ2V0X2luZGV4X2J5X05JRChuYW1lLCBOSURfY29tbW9uTmFtZSwgbGFzdCk7CisgICAgICBpZiAobGFzdCA9PSAtMSkKKyAgICAgICAgYnJlYWs7CisgICAgICBlbnRyeSA9IFg1MDlfTkFNRV9nZXRfZW50cnkobmFtZSwgbGFzdCk7CisgICAgICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICAgICAgY29udGludWU7CisgICAgICBBU04xX1NUUklORyogY29tbW9uID0gWDUwOV9OQU1FX0VOVFJZX2dldF9kYXRhKGVudHJ5KTsKKyAgICAgIGludCBzaXplID0gQVNOMV9TVFJJTkdfdG9fVVRGOCgmdXRmOCwgY29tbW9uKTsKKyAgICAgIGlmIChob3N0LmVtcHR5KCkpIHsKKyAgICAgICAgaG9zdCA9IChzZXJ2ZXIoKSA/IGdldFBlZXJIb3N0KCkgOiBnZXRIb3N0KCkpOworICAgICAgfQorICAgICAgZGVjaXNpb24gPSBhY2Nlc3NfLT52ZXJpZnkoaG9zdCwgKGNoYXIqKXV0ZjgsIHNpemUpOworICAgICAgT1BFTlNTTF9mcmVlKHV0ZjgpOworICAgIH0KKyAgfQorICBYNTA5X2ZyZWUoY2VydCk7CisgIGlmIChkZWNpc2lvbiAhPSBBY2Nlc3NNYW5hZ2VyOjpBTExPVykgeworICAgIHRocm93IFRTU0xFeGNlcHRpb24oImF1dGhvcml6ZTogY2Fubm90IGF1dGhvcml6ZSBwZWVyIik7CisgIH0KK30KKworLyoKKyAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIG5vdCBsaWJldmVudCBzYWZlLgorKi8KK3Vuc2lnbmVkIGludCBUU1NMU29ja2V0Ojp3YWl0Rm9yRXZlbnQoYm9vbCB3YW50UmVhZCkgeworICBpbnQgZmRTb2NrZXQ7CisgIEJJTyogYmlvOworCisgIGlmICh3YW50UmVhZCkgeworICAgIGJpbyA9IFNTTF9nZXRfcmJpbyhzc2xfKTsKKyAgfSBlbHNlIHsKKyAgICBiaW8gPSBTU0xfZ2V0X3diaW8oc3NsXyk7CisgIH0KKworICBpZiAoYmlvID09IE5VTEwpIHsKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfZ2V0Xz9iaW8gcmV0dXJuZWQgTlVMTCIpOworICB9CisKKyAgaWYgKEJJT19nZXRfZmQoYmlvLCAmZmRTb2NrZXQpIDw9IDApIHsKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJCSU9fZ2V0X2ZkIGZhaWxlZCIpOworICB9CisKKyAgc3RydWN0IFRIUklGVF9QT0xMRkQgZmRzWzJdOworICBtZW1zZXQoZmRzLCAwLCBzaXplb2YoZmRzKSk7CisgIGZkc1swXS5mZCA9IGZkU29ja2V0OworICAvLyB1c2UgUE9MTElOIGFsc28gb24gd3JpdGUgb3BlcmF0aW9ucyB0b28sIHRoaXMgaXMgbmVlZGVkIGZvciBvcGVyYXRpb25zCisgIC8vIHdoaWNoIHJlcXVpcmVzIHJlYWQgYW5kIHdyaXRlIG9uIHRoZSBzb2NrZXQuCisgIGZkc1swXS5ldmVudHMgPSB3YW50UmVhZCA/IFRIUklGVF9QT0xMSU4gOiBUSFJJRlRfUE9MTElOIHwgVEhSSUZUX1BPTExPVVQ7CisKKyAgaWYgKGludGVycnVwdExpc3RlbmVyXykgeworICAgIGZkc1sxXS5mZCA9ICooaW50ZXJydXB0TGlzdGVuZXJfLmdldCgpKTsKKyAgICBmZHNbMV0uZXZlbnRzID0gVEhSSUZUX1BPTExJTjsKKyAgfQorCisgIGludCB0aW1lb3V0ID0gLTE7CisgIGlmICh3YW50UmVhZCAmJiByZWN2VGltZW91dF8pIHsKKyAgICB0aW1lb3V0ID0gcmVjdlRpbWVvdXRfOworICB9CisgIGlmICghd2FudFJlYWQgJiYgc2VuZFRpbWVvdXRfKSB7CisgICAgdGltZW91dCA9IHNlbmRUaW1lb3V0XzsKKyAgfQorCisgIGludCByZXQgPSBUSFJJRlRfUE9MTChmZHMsIGludGVycnVwdExpc3RlbmVyXyA/IDIgOiAxLCB0aW1lb3V0KTsKKworICBpZiAocmV0IDwgMCkgeworICAgIC8vIGVycm9yIGNhc2VzCisgICAgaWYgKFRIUklGVF9HRVRfU09DS0VUX0VSUk9SID09IFRIUklGVF9FSU5UUikgeworICAgICAgcmV0dXJuIFRTU0xfRUlOVFI7IC8vIHJlcGVhdCBvcGVyYXRpb24KKyAgICB9CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU1NMU29ja2V0OjpyZWFkIFRIUklGVF9QT0xMKCkgIiwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVW5rbm93biIsIGVycm5vX2NvcHkpOworICB9IGVsc2UgaWYgKHJldCA+IDApeworICAgIGlmIChmZHNbMV0ucmV2ZW50cyAmIFRIUklGVF9QT0xMSU4pIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQsICJJbnRlcnJ1cHRlZCIpOworICAgIH0KKyAgICByZXR1cm4gVFNTTF9EQVRBOworICB9IGVsc2UgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULCAiVEhSSUZUX1BPTEwgKHRpbWVkIG91dCkiKTsKKyAgfQorfQorCisvLyBUU1NMU29ja2V0RmFjdG9yeSBpbXBsZW1lbnRhdGlvbgordWludDY0X3QgVFNTTFNvY2tldEZhY3Rvcnk6OmNvdW50XyA9IDA7CitNdXRleCBUU1NMU29ja2V0RmFjdG9yeTo6bXV0ZXhfOworYm9vbCBUU1NMU29ja2V0RmFjdG9yeTo6bWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uXyA9IGZhbHNlOworCitUU1NMU29ja2V0RmFjdG9yeTo6VFNTTFNvY2tldEZhY3RvcnkoU1NMUHJvdG9jb2wgcHJvdG9jb2wpIDogc2VydmVyXyhmYWxzZSkgeworICBHdWFyZCBndWFyZChtdXRleF8pOworICBpZiAoY291bnRfID09IDApIHsKKyAgICBpZiAoIW1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbl8pIHsKKyAgICAgIGluaXRpYWxpemVPcGVuU1NMKCk7CisgICAgfQorICAgIHJhbmRvbWl6ZSgpOworICB9CisgIGNvdW50XysrOworICBjdHhfID0gc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+KG5ldyBTU0xDb250ZXh0KHByb3RvY29sKSk7Cit9CisKK1RTU0xTb2NrZXRGYWN0b3J5Ojp+VFNTTFNvY2tldEZhY3RvcnkoKSB7CisgIEd1YXJkIGd1YXJkKG11dGV4Xyk7CisgIGN0eF8ucmVzZXQoKTsKKyAgY291bnRfLS07CisgIGlmIChjb3VudF8gPT0gMCAmJiAhbWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uXykgeworICAgIGNsZWFudXBPcGVuU1NMKCk7CisgIH0KK30KKworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4XykpOworICBzZXR1cChzc2wpOworICByZXR1cm4gc3NsOworfQorCitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldChzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbChuZXcgVFNTTFNvY2tldChjdHhfLCBpbnRlcnJ1cHRMaXN0ZW5lcikpOworICBzZXR1cChzc2wpOworICByZXR1cm4gc3NsOworfQorCitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCkgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKG5ldyBUU1NMU29ja2V0KGN0eF8sIHNvY2tldCkpOworICBzZXR1cChzc2wpOworICByZXR1cm4gc3NsOworfQorCitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4Xywgc29ja2V0LCBpbnRlcnJ1cHRMaXN0ZW5lcikpOworICBzZXR1cChzc2wpOworICByZXR1cm4gc3NsOworfQorCitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldChjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0KSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4XywgaG9zdCwgcG9ydCkpOworICBzZXR1cChzc2wpOworICByZXR1cm4gc3NsOworfQorCitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldChjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbChuZXcgVFNTTFNvY2tldChjdHhfLCBob3N0LCBwb3J0LCBpbnRlcnJ1cHRMaXN0ZW5lcikpOworICBzZXR1cChzc2wpOworICByZXR1cm4gc3NsOworfQorCisKK3ZvaWQgVFNTTFNvY2tldEZhY3Rvcnk6OnNldHVwKHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wpIHsKKyAgc3NsLT5zZXJ2ZXIoc2VydmVyKCkpOworICBpZiAoYWNjZXNzXyA9PSBOVUxMICYmICFzZXJ2ZXIoKSkgeworICAgIGFjY2Vzc18gPSBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4obmV3IERlZmF1bHRDbGllbnRBY2Nlc3NNYW5hZ2VyKTsKKyAgfQorICBpZiAoYWNjZXNzXyAhPSBOVUxMKSB7CisgICAgc3NsLT5hY2Nlc3MoYWNjZXNzXyk7CisgIH0KK30KKwordm9pZCBUU1NMU29ja2V0RmFjdG9yeTo6Y2lwaGVycyhjb25zdCBzdHJpbmcmIGVuYWJsZSkgeworICBpbnQgcmMgPSBTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdChjdHhfLT5nZXQoKSwgZW5hYmxlLmNfc3RyKCkpOworICBpZiAoRVJSX3BlZWtfZXJyb3IoKSAhPSAwKSB7CisgICAgc3RyaW5nIGVycm9yczsKKyAgICBidWlsZEVycm9ycyhlcnJvcnMpOworICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9DVFhfc2V0X2NpcGhlcl9saXN0OiAiICsgZXJyb3JzKTsKKyAgfQorICBpZiAocmMgPT0gMCkgeworICAgIHRocm93IFRTU0xFeGNlcHRpb24oIk5vbmUgb2Ygc3BlY2lmaWVkIGNpcGhlcnMgYXJlIHN1cHBvcnRlZCIpOworICB9Cit9CisKK3ZvaWQgVFNTTFNvY2tldEZhY3Rvcnk6OmF1dGhlbnRpY2F0ZShib29sIHJlcXVpcmVkKSB7CisgIGludCBtb2RlOworICBpZiAocmVxdWlyZWQpIHsKKyAgICBtb2RlID0gU1NMX1ZFUklGWV9QRUVSIHwgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCB8IFNTTF9WRVJJRllfQ0xJRU5UX09OQ0U7CisgIH0gZWxzZSB7CisgICAgbW9kZSA9IFNTTF9WRVJJRllfTk9ORTsKKyAgfQorICBTU0xfQ1RYX3NldF92ZXJpZnkoY3R4Xy0+Z2V0KCksIG1vZGUsIE5VTEwpOworfQorCit2b2lkIFRTU0xTb2NrZXRGYWN0b3J5Ojpsb2FkQ2VydGlmaWNhdGUoY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogZm9ybWF0KSB7CisgIGlmIChwYXRoID09IE5VTEwgfHwgZm9ybWF0ID09IE5VTEwpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWRDZXJ0aWZpY2F0ZUNoYWluOiBlaXRoZXIgPHBhdGg+IG9yIDxmb3JtYXQ+IGlzIE5VTEwiKTsKKyAgfQorICBpZiAoc3RyY21wKGZvcm1hdCwgIlBFTSIpID09IDApIHsKKyAgICBpZiAoU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShjdHhfLT5nZXQoKSwgcGF0aCkgPT0gMCkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIHN0cmluZyBlcnJvcnM7CisgICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHkpOworICAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZTogIiArIGVycm9ycyk7CisgICAgfQorICB9IGVsc2UgeworICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGNlcnRpZmljYXRlIGZvcm1hdDogIiArIHN0cmluZyhmb3JtYXQpKTsKKyAgfQorfQorCit2b2lkIFRTU0xTb2NrZXRGYWN0b3J5Ojpsb2FkUHJpdmF0ZUtleShjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBmb3JtYXQpIHsKKyAgaWYgKHBhdGggPT0gTlVMTCB8fCBmb3JtYXQgPT0gTlVMTCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9hZFByaXZhdGVLZXk6IGVpdGhlciA8cGF0aD4gb3IgPGZvcm1hdD4gaXMgTlVMTCIpOworICB9CisgIGlmIChzdHJjbXAoZm9ybWF0LCAiUEVNIikgPT0gMCkgeworICAgIGlmIChTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoY3R4Xy0+Z2V0KCksIHBhdGgsIFNTTF9GSUxFVFlQRV9QRU0pID09IDApIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBzdHJpbmcgZXJyb3JzOworICAgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5KTsKKyAgICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZTogIiArIGVycm9ycyk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgVFNTTFNvY2tldEZhY3Rvcnk6OmxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIGNhcGF0aCkgeworICBpZiAocGF0aCA9PSBOVUxMKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2FkVHJ1c3RlZENlcnRpZmljYXRlczogPHBhdGg+IGlzIE5VTEwiKTsKKyAgfQorICBpZiAoU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY3R4Xy0+Z2V0KCksIHBhdGgsIGNhcGF0aCkgPT0gMCkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgc3RyaW5nIGVycm9yczsKKyAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHkpOworICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zOiAiICsgZXJyb3JzKTsKKyAgfQorfQorCit2b2lkIFRTU0xTb2NrZXRGYWN0b3J5OjpyYW5kb21pemUoKSB7CisgIFJBTkRfcG9sbCgpOworfQorCit2b2lkIFRTU0xTb2NrZXRGYWN0b3J5OjpvdmVycmlkZURlZmF1bHRQYXNzd29yZENhbGxiYWNrKCkgeworICBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYihjdHhfLT5nZXQoKSwgcGFzc3dvcmRDYWxsYmFjayk7CisgIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiX3VzZXJkYXRhKGN0eF8tPmdldCgpLCB0aGlzKTsKK30KKworaW50IFRTU0xTb2NrZXRGYWN0b3J5OjpwYXNzd29yZENhbGxiYWNrKGNoYXIqIHBhc3N3b3JkLCBpbnQgc2l6ZSwgaW50LCB2b2lkKiBkYXRhKSB7CisgIFRTU0xTb2NrZXRGYWN0b3J5KiBmYWN0b3J5ID0gKFRTU0xTb2NrZXRGYWN0b3J5KilkYXRhOworICBzdHJpbmcgdXNlclBhc3N3b3JkOworICBmYWN0b3J5LT5nZXRQYXNzd29yZCh1c2VyUGFzc3dvcmQsIHNpemUpOworICBpbnQgbGVuZ3RoID0gc3RhdGljX2Nhc3Q8aW50Pih1c2VyUGFzc3dvcmQuc2l6ZSgpKTsKKyAgaWYgKGxlbmd0aCA+IHNpemUpIHsKKyAgICBsZW5ndGggPSBzaXplOworICB9CisgIHN0cm5jcHkocGFzc3dvcmQsIHVzZXJQYXNzd29yZC5jX3N0cigpLCBsZW5ndGgpOworICB1c2VyUGFzc3dvcmQuYXNzaWduKHVzZXJQYXNzd29yZC5zaXplKCksICcqJyk7CisgIHJldHVybiBsZW5ndGg7Cit9CisKKy8vIGV4dHJhY3QgZXJyb3IgbWVzc2FnZXMgZnJvbSBlcnJvciBxdWV1ZQordm9pZCBidWlsZEVycm9ycyhzdHJpbmcmIGVycm9ycywgaW50IGVycm5vX2NvcHksIGludCBzc2xlcnJubykgeworICB1bnNpZ25lZCBsb25nIGVycm9yQ29kZTsKKyAgY2hhciBtZXNzYWdlWzI1Nl07CisKKyAgZXJyb3JzLnJlc2VydmUoNTEyKTsKKyAgd2hpbGUgKChlcnJvckNvZGUgPSBFUlJfZ2V0X2Vycm9yKCkpICE9IDApIHsKKyAgICBpZiAoIWVycm9ycy5lbXB0eSgpKSB7CisgICAgICBlcnJvcnMgKz0gIjsgIjsKKyAgICB9CisgICAgY29uc3QgY2hhciogcmVhc29uID0gRVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcoZXJyb3JDb2RlKTsKKyAgICBpZiAocmVhc29uID09IE5VTEwpIHsKKyAgICAgIFRIUklGVF9TTlBSSU5URihtZXNzYWdlLCBzaXplb2YobWVzc2FnZSkgLSAxLCAiU1NMIGVycm9yICMgJWx1IiwgZXJyb3JDb2RlKTsKKyAgICAgIHJlYXNvbiA9IG1lc3NhZ2U7CisgICAgfQorICAgIGVycm9ycyArPSByZWFzb247CisgIH0KKyAgaWYgKGVycm9ycy5lbXB0eSgpKSB7CisgICAgaWYgKGVycm5vX2NvcHkgIT0gMCkgeworICAgICAgZXJyb3JzICs9IFRPdXRwdXQ6OnN0cmVycm9yX3MoZXJybm9fY29weSk7CisgICAgfQorICB9CisgIGlmIChlcnJvcnMuZW1wdHkoKSkgeworICAgIGVycm9ycyA9ICJlcnJvciBjb2RlOiAiICsgdG9fc3RyaW5nKGVycm5vX2NvcHkpOworICB9CisgIGlmIChzc2xlcnJubykgeworICAgIGVycm9ycyArPSAiIChTU0xfZXJyb3JfY29kZSA9ICIgKyB0b19zdHJpbmcoc3NsZXJybm8pICsgIikiOworICAgIGlmIChzc2xlcnJubyA9PSBTU0xfRVJST1JfU1lTQ0FMTCkgeworICAgICAgY2hhciBidWZbNDA5Nl07CisgICAgICBpbnQgZXJyOworICAgICAgd2hpbGUgKChlcnIgPSBFUlJfZ2V0X2Vycm9yKCkpICE9IDApIHsKKyAgICAgICAgZXJyb3JzICs9ICIgIjsKKyAgICAgICAgZXJyb3JzICs9IEVSUl9lcnJvcl9zdHJpbmcoZXJyLCBidWYpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKioKKyAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgQWNjZXNzTWFuYWdlcgorICovCitEZWNpc2lvbiBEZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlcjo6dmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhKSBub2V4Y2VwdCB7CisgICh2b2lkKXNhOworICByZXR1cm4gU0tJUDsKK30KKworRGVjaXNpb24gRGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXI6OnZlcmlmeShjb25zdCBzdHJpbmcmIGhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKSBub2V4Y2VwdCB7CisgIGlmIChob3N0LmVtcHR5KCkgfHwgbmFtZSA9PSBOVUxMIHx8IHNpemUgPD0gMCkgeworICAgIHJldHVybiBTS0lQOworICB9CisgIHJldHVybiAobWF0Y2hOYW1lKGhvc3QuY19zdHIoKSwgbmFtZSwgc2l6ZSkgPyBBTExPVyA6IFNLSVApOworfQorCitEZWNpc2lvbiBEZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlcjo6dmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgbm9leGNlcHQgeworICBib29sIG1hdGNoID0gZmFsc2U7CisgIGlmIChzYS5zc19mYW1pbHkgPT0gQUZfSU5FVCAmJiBzaXplID09IHNpemVvZihpbl9hZGRyKSkgeworICAgIG1hdGNoID0gKG1lbWNtcCgmKChzb2NrYWRkcl9pbiopJnNhKS0+c2luX2FkZHIsIGRhdGEsIHNpemUpID09IDApOworICB9IGVsc2UgaWYgKHNhLnNzX2ZhbWlseSA9PSBBRl9JTkVUNiAmJiBzaXplID09IHNpemVvZihpbjZfYWRkcikpIHsKKyAgICBtYXRjaCA9IChtZW1jbXAoJigoc29ja2FkZHJfaW42Kikmc2EpLT5zaW42X2FkZHIsIGRhdGEsIHNpemUpID09IDApOworICB9CisgIHJldHVybiAobWF0Y2ggPyBBTExPVyA6IFNLSVApOworfQorCisvKioKKyAqIE1hdGNoIGEgbmFtZSB3aXRoIGEgcGF0dGVybi4gVGhlIHBhdHRlcm4gbWF5IGluY2x1ZGUgd2lsZGNhcmQuIEEgc2luZ2xlCisgKiB3aWxkY2FyZCAiKiIgY2FuIG1hdGNoIHVwIHRvIG9uZSBjb21wb25lbnQgaW4gdGhlIGRvbWFpbiBuYW1lLgorICoKKyAqIEBwYXJhbSAgaG9zdCAgICBIb3N0IG5hbWUsIHR5cGljYWxseSB0aGUgbmFtZSBvZiB0aGUgcmVtb3RlIGhvc3QKKyAqIEBwYXJhbSAgcGF0dGVybiBOYW1lIHJldHJpZXZlZCBmcm9tIGNlcnRpZmljYXRlCisgKiBAcGFyYW0gIHNpemUgICAgU2l6ZSBvZiAicGF0dGVybiIKKyAqIEByZXR1cm4gVHJ1ZSwgaWYgImhvc3QiIG1hdGNoZXMgInBhdHRlcm4iLiBGYWxzZSBvdGhlcndpc2UuCisgKi8KK2Jvb2wgbWF0Y2hOYW1lKGNvbnN0IGNoYXIqIGhvc3QsIGNvbnN0IGNoYXIqIHBhdHRlcm4sIGludCBzaXplKSB7CisgIGJvb2wgbWF0Y2ggPSBmYWxzZTsKKyAgaW50IGkgPSAwLCBqID0gMDsKKyAgd2hpbGUgKGkgPCBzaXplICYmIGhvc3Rbal0gIT0gJ1wwJykgeworICAgIGlmICh1cHBlcmNhc2UocGF0dGVybltpXSkgPT0gdXBwZXJjYXNlKGhvc3Rbal0pKSB7CisgICAgICBpKys7CisgICAgICBqKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHBhdHRlcm5baV0gPT0gJyonKSB7CisgICAgICB3aGlsZSAoaG9zdFtqXSAhPSAnLicgJiYgaG9zdFtqXSAhPSAnXDAnKSB7CisgICAgICAgIGorKzsKKyAgICAgIH0KKyAgICAgIGkrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICBpZiAoaSA9PSBzaXplICYmIGhvc3Rbal0gPT0gJ1wwJykgeworICAgIG1hdGNoID0gdHJ1ZTsKKyAgfQorICByZXR1cm4gbWF0Y2g7Cit9CisKKy8vIFRoaXMgaXMgdG8gd29yayBhcm91bmQgdGhlIFR1cmtpc2ggbG9jYWxlIGlzc3VlLCBpLmUuLAorLy8gdG91cHBlcignaScpICE9IHRvdXBwZXIoJ0knKSBpZiBsb2NhbGUgaXMgInRyX1RSIgorY2hhciB1cHBlcmNhc2UoY2hhciBjKSB7CisgIGlmICgnYScgPD0gYyAmJiBjIDw9ICd6JykgeworICAgIHJldHVybiBjICsgKCdBJyAtICdhJyk7CisgIH0KKyAgcmV0dXJuIGM7Cit9Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhODdkMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaApAQCAtMCwwICsxLDQzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTU0xTT0NLRVRfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNTTFNPQ0tFVF9IXyAxCisKKy8vIFB1dCB0aGlzIGZpcnN0IHRvIGF2b2lkIFdJTjMyIGJ1aWxkIGZhaWx1cmUKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK2NsYXNzIEFjY2Vzc01hbmFnZXI7CitjbGFzcyBTU0xDb250ZXh0OworCitlbnVtIFNTTFByb3RvY29sIHsKKyAgU1NMVExTICA9IDAsICAvLyBTdXBwb3J0cyBTU0x2MiBhbmQgU1NMdjMgaGFuZHNoYWtlIGJ1dCBvbmx5IG5lZ290aWF0ZXMgYXQgVExTdjFfMCBvciBsYXRlci4KKy8vU1NMdjIgICA9IDEsICAvLyBIT1JSSUJMWSBJTlNFQ1VSRSEKKyAgU1NMdjMgICA9IDIsICAvLyBTdXBwb3J0cyBTU0x2MyBvbmx5IC0gYWxzbyBob3JyaWJseSBpbnNlY3VyZSEKKyAgVExTdjFfMCA9IDMsICAvLyBTdXBwb3J0cyBUTFN2MV8wIG9yIGxhdGVyLgorICBUTFN2MV8xID0gNCwgIC8vIFN1cHBvcnRzIFRMU3YxXzEgb3IgbGF0ZXIuCisgIFRMU3YxXzIgPSA1LCAgLy8gU3VwcG9ydHMgVExTdjFfMiBvciBsYXRlci4KKyAgTEFURVNUICA9IFRMU3YxXzIKK307CisKKyNkZWZpbmUgVFNTTF9FSU5UUiAwCisjZGVmaW5lIFRTU0xfREFUQSAxCisKKy8qKgorICogSW5pdGlhbGl6ZSBPcGVuU1NMIGxpYnJhcnkuICBUaGlzIGZ1bmN0aW9uLCBvciBzb21lIG90aGVyCisgKiBlcXVpdmFsZW50IGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgT3BlblNTTCwgbXVzdCBiZSBjYWxsZWQgYmVmb3JlCisgKiBUU1NMU29ja2V0IGlzIHVzZWQuICBJZiB5b3Ugc2V0IFRTU0xTb2NrZXRGYWN0b3J5IHRvIHVzZSBtYW51YWwKKyAqIE9wZW5TU0wgaW5pdGlhbGl6YXRpb24sIHlvdSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIG9yIG90aGVyd2lzZQorICogZW5zdXJlIE9wZW5TU0wgaXMgaW5pdGlhbGl6ZWQgeW91cnNlbGYuCisgKi8KK3ZvaWQgaW5pdGlhbGl6ZU9wZW5TU0woKTsKKy8qKgorICogQ2xlYW51cCBPcGVuU1NMIGxpYnJhcnkuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgdG8gY2xlYW4KKyAqIHVwIE9wZW5TU0wgYWZ0ZXIgdXNlIG9mIE9wZW5TU0wgZnVuY3Rpb25hbGl0eSBpcyBmaW5pc2hlZC4gIElmIHlvdQorICogc2V0IFRTU0xTb2NrZXRGYWN0b3J5IHRvIHVzZSBtYW51YWwgT3BlblNTTCBpbml0aWFsaXphdGlvbiwgeW91CisgKiBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIHlvdXJzZWxmIG9yIGVuc3VyZSB0aGF0IHdoYXRldmVyCisgKiBpbml0aWFsaXplZCBPcGVuU1NMIGNsZWFucyBpdCB1cCB0b28uCisgKi8KK3ZvaWQgY2xlYW51cE9wZW5TU0woKTsKKworLyoqCisgKiBPcGVuU1NMIGltcGxlbWVudGF0aW9uIGZvciBTU0wgc29ja2V0IGludGVyZmFjZS4KKyAqLworY2xhc3MgVFNTTFNvY2tldCA6IHB1YmxpYyBUU29ja2V0IHsKK3B1YmxpYzoKKyAgflRTU0xTb2NrZXQoKTsKKyAgLyoqCisgICAqIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorICAgKi8KKyAgYm9vbCBpc09wZW4oKTsKKyAgYm9vbCBwZWVrKCk7CisgIHZvaWQgb3BlbigpOworICB2b2lkIGNsb3NlKCk7CisgIGJvb2wgaGFzUGVuZGluZ0RhdGFUb1JlYWQoKTsKKyAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB1aW50MzJfdCB3cml0ZV9wYXJ0aWFsKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdm9pZCBmbHVzaCgpOworICAvKioKKyAgKiBTZXQgd2hldGhlciB0byB1c2UgY2xpZW50IG9yIHNlcnZlciBzaWRlIFNTTCBoYW5kc2hha2UgcHJvdG9jb2wuCisgICoKKyAgKiBAcGFyYW0gZmxhZyAgVXNlIHNlcnZlciBzaWRlIGhhbmRzaGFrZSBwcm90b2NvbCBpZiB0cnVlLgorICAqLworICB2b2lkIHNlcnZlcihib29sIGZsYWcpIHsgc2VydmVyXyA9IGZsYWc7IH0KKyAgLyoqCisgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBTU0wgc29ja2V0IGlzIHNlcnZlciBvciBjbGllbnQgbW9kZS4KKyAgICovCisgIGJvb2wgc2VydmVyKCkgY29uc3QgeyByZXR1cm4gc2VydmVyXzsgfQorICAvKioKKyAgICogU2V0IEFjY2Vzc01hbmFnZXIuCisgICAqCisgICAqIEBwYXJhbSBtYW5hZ2VyICBJbnN0YW5jZSBvZiBBY2Nlc3NNYW5hZ2VyCisgICAqLworICB2aXJ0dWFsIHZvaWQgYWNjZXNzKHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBtYW5hZ2VyKSB7IGFjY2Vzc18gPSBtYW5hZ2VyOyB9CisgIC8qKgorICAgKiBTZXQgZXZlbnRTYWZlIGZsYWcgaWYgbGliZXZlbnQgaXMgdXNlZC4KKyAgICovCisgIHZvaWQgc2V0TGliZXZlbnRTYWZlKCkgeyBldmVudFNhZmVfID0gdHJ1ZTsgfQorICAvKioKKyAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIFNTTCBTb2NrZXQgaXMgbGliZXZlbnQgc2FmZSBvciBub3QuCisgICAqLworICBib29sIGlzTGliZXZlbnRTYWZlKCkgY29uc3QgeyByZXR1cm4gZXZlbnRTYWZlXzsgfQorCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICovCisgIFRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCk7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciB3aXRoIGFuIGludGVycnVwdCBzaWduYWwuCisgICAqLworICBUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQgZ2l2ZW4gYW4gZXhpc3Rpbmcgc29ja2V0LgorICAgKgorICAgKiBAcGFyYW0gc29ja2V0IEFuIGV4aXN0aW5nIHNvY2tldAorICAgKi8KKyAgVFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBUSFJJRlRfU09DS0VUIHNvY2tldCk7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQgZ2l2ZW4gYW4gZXhpc3Rpbmcgc29ja2V0IHRoYXQgY2FuIGJlIGludGVycnVwdGVkLgorICAgKgorICAgKiBAcGFyYW0gc29ja2V0IEFuIGV4aXN0aW5nIHNvY2tldAorICAgKi8KKyAgVFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBUSFJJRlRfU09DS0VUIHNvY2tldCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKKyAgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHBhcmFtIGhvc3QgIFJlbW90ZSBob3N0IG5hbWUKKyAgICogQHBhcmFtIHBvcnQgIFJlbW90ZSBwb3J0IG51bWJlcgorICAgKi8KKyAgVFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBzdGQ6OnN0cmluZyBob3N0LCBpbnQgcG9ydCk7CisgICAgLyoqCisgICogQ29uc3RydWN0b3Igd2l0aCBhbiBpbnRlcnJ1cHQgc2lnbmFsLgorICAqCisgICogQHBhcmFtIGhvc3QgIFJlbW90ZSBob3N0IG5hbWUKKyAgKiBAcGFyYW0gcG9ydCAgUmVtb3RlIHBvcnQgbnVtYmVyCisgICovCisgICAgVFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBzdGQ6OnN0cmluZyBob3N0LCBpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKKyAgLyoqCisgICAqIEF1dGhvcml6ZSBwZWVyIGFjY2VzcyBhZnRlciBTU0wgaGFuZHNoYWtlIGNvbXBsZXRlcy4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBhdXRob3JpemUoKTsKKyAgLyoqCisgICAqIEluaXRpYXRlIFNTTCBoYW5kc2hha2UgaWYgbm90IGFscmVhZHkgaW5pdGlhdGVkLgorICAgKi8KKyAgdm9pZCBpbml0aWFsaXplSGFuZHNoYWtlKCk7CisgIC8qKgorICAgKiBJbml0aWF0ZSBTU0wgaGFuZHNoYWtlIHBhcmFtcy4KKyAgICovCisgIHZvaWQgaW5pdGlhbGl6ZUhhbmRzaGFrZVBhcmFtcygpOworICAvKioKKyAgICogQ2hlY2sgaWYgIFNTTCBoYW5kc2hha2UgaXMgY29tcGxldGVkIG9yIG5vdC4KKyAgICovCisgIGJvb2wgY2hlY2tIYW5kc2hha2UoKTsKKyAgLyoqCisgICAqIFdhaXRzIGZvciBhbiBzb2NrZXQgb3Igc2h1dGRvd24gZXZlbnQuCisgICAqCisgICAqIEB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCBpZiBpbnRlcnJ1cHRlZCBpcyBzaWduYWxlZC4KKyAgICoKKyAgICogQHJldHVybiBUU1NMX0VJTlRSIGlmIEVJTlRSIGhhcHBlbmVkIG9uIHRoZSB1bmRlcmx5aW5nIHNvY2tldAorICAgKiAgICAgICAgIFRTU0xfREFUQSAgaWYgZGF0YSBpcyBhdmFpbGFibGUgb24gdGhlIHNvY2tldC4KKyAgICovCisgIHVuc2lnbmVkIGludCB3YWl0Rm9yRXZlbnQoYm9vbCB3YW50UmVhZCk7CisKKyAgYm9vbCBzZXJ2ZXJfOworICBTU0wqIHNzbF87CisgIHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHhfOworICBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4gYWNjZXNzXzsKKyAgZnJpZW5kIGNsYXNzIFRTU0xTb2NrZXRGYWN0b3J5OworCitwcml2YXRlOgorICBib29sIGhhbmRzaGFrZUNvbXBsZXRlZF87CisgIGludCByZWFkUmV0cnlDb3VudF87CisgIGJvb2wgZXZlbnRTYWZlXzsKKworICB2b2lkIGluaXQoKTsKK307CisKKy8qKgorICogU1NMIHNvY2tldCBmYWN0b3J5LiBTU0wgc29ja2V0cyBzaG91bGQgYmUgY3JlYXRlZCB2aWEgU1NMIGZhY3RvcnkuCisgKiBUaGUgZmFjdG9yeSB3aWxsIGF1dG9tYXRpY2FsbHkgaW5pdGlhbGl6ZSBhbmQgY2xlYW51cCBvcGVuc3NsIGFzIGxvbmcgYXMKKyAqIHRoZXJlIGlzIGEgVFNTTFNvY2tldEZhY3RvcnkgaW5zdGFudGlhdGVkLCBhbmQgYXMgbG9uZyBhcyB0aGUgc3RhdGljCisgKiBib29sZWFuIG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbl8gaXMgc2V0IHRvIGZhbHNlLCB0aGUgZGVmYXVsdC4KKyAqCisgKiBJZiB5b3Ugd291bGQgbGlrZSB0byBpbml0aWFsaXplIGFuZCBjbGVhbnVwIG9wZW5zc2wgeW91cnNlbGYsIHNldAorICogbWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uXyB0byB0cnVlIGFuZCBUU1NMU29ja2V0RmFjdG9yeSB3aWxsIG5vCisgKiBsb25nZXIgYmUgcmVzcG9uc2libGUgZm9yIG9wZW5zc2wgaW5pdGlhbGl6YXRpb24gYW5kIHRlYXJkb3duLgorICoKKyAqIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY29kZSB1c2luZyBUU1NMU29ja2V0RmFjdG9yeSB0bworICogZW5zdXJlIHRoYXQgdGhlIGZhY3RvcnkgbGlmZXRpbWUgZXhjZWVkcyB0aGUgbGlmZXRpbWUgb2YgYW55IHNvY2tldHMKKyAqIGl0IG1pZ2h0IGNyZWF0ZS4gIElmIHRoaXMgaXMgbm90IGd1YXJhbnRlZWQsIGEgc29ja2V0IG1heSBjYWxsIGludG8KKyAqIG9wZW5zc2wgYWZ0ZXIgdGhlIHNvY2tldCBmYWN0b3J5IGhhcyBjbGVhbmVkIHVwIG9wZW5zc2whICBUaGlzCisgKiBndWFyYW50ZWUgaXMgdW5uZWNlc3NhcnkgaWYgbWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uXyBpcyB0cnVlLAorICogaG93ZXZlciwgc2luY2UgaXQgd291bGQgYmUgdXAgdG8gdGhlIGNvbnN1bWluZyBhcHBsaWNhdGlvbiBpbnN0ZWFkLgorICovCitjbGFzcyBUU1NMU29ja2V0RmFjdG9yeSB7CitwdWJsaWM6CisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci9EZXN0cnVjdG9yCisgICAqCisgICAqIEBwYXJhbSBwcm90b2NvbCBUaGUgU1NML1RMUyBwcm90b2NvbCB0byB1c2UuCisgICAqLworICBUU1NMU29ja2V0RmFjdG9yeShTU0xQcm90b2NvbCBwcm90b2NvbCA9IFNTTFRMUyk7CisgIHZpcnR1YWwgflRTU0xTb2NrZXRGYWN0b3J5KCk7CisgIC8qKgorICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVFNTTFNvY2tldCB3aXRoIGEgZnJlc2ggbmV3IHNvY2tldC4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldCgpOworICAvKioKKyAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQgd2l0aCBhIGZyZXNoIG5ldyBzb2NrZXQsIHdoaWNoIGlzIGludGVycnVwdGFibGUuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjcmVhdGVTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKKyAgLyoqCisgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0IHdpdGggdGhlIGdpdmVuIHNvY2tldC4KKyAgICoKKyAgICogQHBhcmFtIHNvY2tldCBBbiBleGlzdGluZyBzb2NrZXQuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQpOworICAvKioKKyAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQgd2l0aCB0aGUgZ2l2ZW4gc29ja2V0IHdoaWNoIGlzIGludGVycnVwdGFibGUuCisgICAqCisgICAqIEBwYXJhbSBzb2NrZXQgQW4gZXhpc3Rpbmcgc29ja2V0LgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpOworICAvKioKKyAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVFNTTFNvY2tldC4KKyAgKgorICAqIEBwYXJhbSBob3N0ICBSZW1vdGUgaG9zdCB0byBiZSBjb25uZWN0ZWQgdG8KKyAgKiBAcGFyYW0gcG9ydCAgUmVtb3RlIHBvcnQgdG8gYmUgY29ubmVjdGVkIHRvCisgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgaW50IHBvcnQpOworICAvKioKKyAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVFNTTFNvY2tldC4KKyAgKgorICAqIEBwYXJhbSBob3N0ICBSZW1vdGUgaG9zdCB0byBiZSBjb25uZWN0ZWQgdG8KKyAgKiBAcGFyYW0gcG9ydCAgUmVtb3RlIHBvcnQgdG8gYmUgY29ubmVjdGVkIHRvCisgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgaW50IHBvcnQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CisgIC8qKgorICAgKiBTZXQgY2lwaGVycyB0byBiZSB1c2VkIGluIFNTTCBoYW5kc2hha2UgcHJvY2Vzcy4KKyAgICoKKyAgICogQHBhcmFtIGNpcGhlcnMgIEEgbGlzdCBvZiBjaXBoZXJzCisgICAqLworICB2aXJ0dWFsIHZvaWQgY2lwaGVycyhjb25zdCBzdGQ6OnN0cmluZyYgZW5hYmxlKTsKKyAgLyoqCisgICAqIEVuYWJsZS9EaXNhYmxlIGF1dGhlbnRpY2F0aW9uLgorICAgKgorICAgKiBAcGFyYW0gcmVxdWlyZWQgUmVxdWlyZSBwZWVyIHRvIHByZXNlbnQgdmFsaWQgY2VydGlmaWNhdGUgaWYgdHJ1ZQorICAgKi8KKyAgdmlydHVhbCB2b2lkIGF1dGhlbnRpY2F0ZShib29sIHJlcXVpcmVkKTsKKyAgLyoqCisgICAqIExvYWQgc2VydmVyIGNlcnRpZmljYXRlLgorICAgKgorICAgKiBAcGFyYW0gcGF0aCAgIFBhdGggdG8gdGhlIGNlcnRpZmljYXRlIGZpbGUKKyAgICogQHBhcmFtIGZvcm1hdCBDZXJ0aWZpY2F0ZSBmaWxlIGZvcm1hdAorICAgKi8KKyAgdmlydHVhbCB2b2lkIGxvYWRDZXJ0aWZpY2F0ZShjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBmb3JtYXQgPSAiUEVNIik7CisgIC8qKgorICAgKiBMb2FkIHByaXZhdGUga2V5LgorICAgKgorICAgKiBAcGFyYW0gcGF0aCAgIFBhdGggdG8gdGhlIHByaXZhdGUga2V5IGZpbGUKKyAgICogQHBhcmFtIGZvcm1hdCBQcml2YXRlIGtleSBmaWxlIGZvcm1hdAorICAgKi8KKyAgdmlydHVhbCB2b2lkIGxvYWRQcml2YXRlS2V5KGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIGZvcm1hdCA9ICJQRU0iKTsKKyAgLyoqCisgICAqIExvYWQgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgZnJvbSBzcGVjaWZpZWQgZmlsZS4KKyAgICoKKyAgICogQHBhcmFtIHBhdGggUGF0aCB0byB0cnVzdGVkIGNlcnRpZmljYXRlIGZpbGUKKyAgICovCisgIHZpcnR1YWwgdm9pZCBsb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBjYXBhdGggPSBOVUxMKTsKKyAgLyoqCisgICAqIERlZmF1bHQgcmFuZG9taXplIG1ldGhvZC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCByYW5kb21pemUoKTsKKyAgLyoqCisgICAqIE92ZXJyaWRlIGRlZmF1bHQgT3BlblNTTCBwYXNzd29yZCBjYWxsYmFjayB3aXRoIGdldFBhc3N3b3JkKCkuCisgICAqLworICB2b2lkIG92ZXJyaWRlRGVmYXVsdFBhc3N3b3JkQ2FsbGJhY2soKTsKKyAgLyoqCisgICAqIFNldC9VbnNldCBzZXJ2ZXIgbW9kZS4KKyAgICoKKyAgICogQHBhcmFtIGZsYWcgIFNlcnZlciBtb2RlIGlmIHRydWUKKyAgICovCisgIHZpcnR1YWwgdm9pZCBzZXJ2ZXIoYm9vbCBmbGFnKSB7IHNlcnZlcl8gPSBmbGFnOyB9CisgIC8qKgorICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgc29ja2V0IGlzIGluIHNlcnZlciBvciBjbGllbnQgbW9kZS4KKyAgICoKKyAgICogQHJldHVybiB0cnVlLCBpZiBzZXJ2ZXIgbW9kZSwgb3IsIGZhbHNlLCBpZiBjbGllbnQgbW9kZQorICAgKi8KKyAgdmlydHVhbCBib29sIHNlcnZlcigpIGNvbnN0IHsgcmV0dXJuIHNlcnZlcl87IH0KKyAgLyoqCisgICAqIFNldCBBY2Nlc3NNYW5hZ2VyLgorICAgKgorICAgKiBAcGFyYW0gbWFuYWdlciAgVGhlIEFjY2Vzc01hbmFnZXIgaW5zdGFuY2UKKyAgICovCisgIHZpcnR1YWwgdm9pZCBhY2Nlc3Moc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc01hbmFnZXI+IG1hbmFnZXIpIHsgYWNjZXNzXyA9IG1hbmFnZXI7IH0KKyAgc3RhdGljIHZvaWQgc2V0TWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uKGJvb2wgbWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uKSB7CisgICAgbWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uXyA9IG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbjsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHhfOworCisgIC8qKgorICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCBmb3IgY3VzdG9tIHBhc3N3b3JkIGNhbGxiYWNrLiBJdCBtYXkgYmUgY2FsbGVkCisgICAqIG11bHRpcGxlIHRpbWVzIGF0IGFueSB0aW1lIGR1cmluZyBhIHNlc3Npb24gYXMgbmVjZXNzYXJ5LgorICAgKgorICAgKiBAcGFyYW0gcGFzc3dvcmQgUGFzcyBjb2xsZWN0ZWQgcGFzc3dvcmQgdG8gT3BlblNTTAorICAgKiBAcGFyYW0gc2l6ZSAgICAgTWF4aW11bSBsZW5ndGggb2YgcGFzc3dvcmQgaW5jbHVkaW5nIE5VTEwgY2hhcmFjdGVyCisgICAqLworICB2aXJ0dWFsIHZvaWQgZ2V0UGFzc3dvcmQoc3RkOjpzdHJpbmcmIC8qIHBhc3N3b3JkICovLCBpbnQgLyogc2l6ZSAqLykge30KKworcHJpdmF0ZToKKyAgYm9vbCBzZXJ2ZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4gYWNjZXNzXzsKKyAgc3RhdGljIGNvbmN1cnJlbmN5OjpNdXRleCBtdXRleF87CisgIHN0YXRpYyB1aW50NjRfdCBjb3VudF87CisgIHN0YXRpYyBib29sIG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbl87CisgIHZvaWQgc2V0dXAoc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbCk7CisgIHN0YXRpYyBpbnQgcGFzc3dvcmRDYWxsYmFjayhjaGFyKiBwYXNzd29yZCwgaW50IHNpemUsIGludCwgdm9pZCogZGF0YSk7Cit9OworCisvKioKKyAqIFNTTCBleGNlcHRpb24uCisgKi8KK2NsYXNzIFRTU0xFeGNlcHRpb24gOiBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIFRTU0xFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpCisgICAgOiBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLCBtZXNzYWdlKSB7fQorCisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0IHsKKyAgICBpZiAobWVzc2FnZV8uZW1wdHkoKSkgeworICAgICAgcmV0dXJuICJUU1NMRXhjZXB0aW9uIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG1lc3NhZ2VfLmNfc3RyKCk7CisgICAgfQorICB9Cit9OworCisvKioKKyAqIFdyYXAgT3BlblNTTCBTU0xfQ1RYIGludG8gYSBjbGFzcy4KKyAqLworY2xhc3MgU1NMQ29udGV4dCB7CitwdWJsaWM6CisgIFNTTENvbnRleHQoY29uc3QgU1NMUHJvdG9jb2wmIHByb3RvY29sID0gU1NMVExTKTsKKyAgdmlydHVhbCB+U1NMQ29udGV4dCgpOworICBTU0wqIGNyZWF0ZVNTTCgpOworICBTU0xfQ1RYKiBnZXQoKSB7IHJldHVybiBjdHhfOyB9CisKK3ByaXZhdGU6CisgIFNTTF9DVFgqIGN0eF87Cit9OworCisvKioKKyAqIENhbGxiYWNrIGludGVyZmFjZSBmb3IgYWNjZXNzIGNvbnRyb2wuIEl0J3MgbWVhbnQgdG8gdmVyaWZ5IHRoZSByZW1vdGUgaG9zdC4KKyAqIEl0J3MgY29uc3RydWN0ZWQgd2hlbiBhcHBsaWNhdGlvbiBzdGFydHMgYW5kIHNldCB0byBUU1NMU29ja2V0RmFjdG9yeQorICogaW5zdGFuY2UuIEl0J3MgcGFzc2VkIG9udG8gYWxsIFRTU0xTb2NrZXQgaW5zdGFuY2VzIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5CisgKiBvYmplY3QuCisgKi8KK2NsYXNzIEFjY2Vzc01hbmFnZXIgeworcHVibGljOgorICBlbnVtIERlY2lzaW9uIHsKKyAgICBERU5ZID0gLTEsIC8vIGRlbnkgYWNjZXNzCisgICAgU0tJUCA9IDAsICAvLyBjYW5ub3QgbWFrZSBkZWNpc2lvbiwgbW92ZSBvbiB0byBuZXh0IChpZiBhbnkpCisgICAgQUxMT1cgPSAxICAvLyBhbGxvdyBhY2Nlc3MKKyAgfTsKKyAgLyoqCisgICAqIERlc3RydWN0b3IKKyAgICovCisgIHZpcnR1YWwgfkFjY2Vzc01hbmFnZXIoKSB7fQorICAvKioKKyAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBlZXIgc2hvdWxkIGJlIGdyYW50ZWQgYWNjZXNzIG9yIG5vdC4gSXQncyBjYWxsZWQKKyAgICogb25jZSBhZnRlciB0aGUgU1NMIGhhbmRzaGFrZSBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LCBiZWZvcmUgcGVlciBjZXJ0aWZpY2F0ZQorICAgKiBpcyBleGFtaW5lZC4KKyAgICoKKyAgICogSWYgYSB2YWxpZCBkZWNpc2lvbiAoQUxMT1cgb3IgREVOWSkgaXMgcmV0dXJuZWQsIHRoZSBwZWVyIGNlcnRpZmljYXRlIGlzCisgICAqIG5vdCB0byBiZSB2ZXJpZmllZC4KKyAgICoKKyAgICogQHBhcmFtICBzYSBQZWVyIElQIGFkZHJlc3MKKyAgICogQHJldHVybiBUcnVlIGlmIHRoZSBwZWVyIGlzIHRydXN0ZWQsIGZhbHNlIG90aGVyd2lzZQorICAgKi8KKyAgdmlydHVhbCBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgLyogc2EgKi8pIG5vZXhjZXB0IHsgcmV0dXJuIERFTlk7IH0KKyAgLyoqCisgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBwZWVyIHNob3VsZCBiZSBncmFudGVkIGFjY2VzcyBvciBub3QuIEl0J3MgY2FsbGVkCisgICAqIGV2ZXJ5IHRpbWUgYSBETlMgc3ViamVjdEFsdE5hbWUvY29tbW9uIG5hbWUgaXMgZXh0cmFjdGVkIGZyb20gcGVlcidzCisgICAqIGNlcnRpZmljYXRlLgorICAgKgorICAgKiBAcGFyYW0gIGhvc3QgQ2xpZW50IG1vZGU6IGhvc3QgbmFtZSByZXR1cm5lZCBieSBUU29ja2V0OjpnZXRIb3N0KCkKKyAgICogICAgICAgICAgICAgIFNlcnZlciBtb2RlOiBob3N0IG5hbWUgcmV0dXJuZWQgYnkgVFNvY2tldDo6Z2V0UGVlckhvc3QoKQorICAgKiBAcGFyYW0gIG5hbWUgU3ViamVjdEFsdE5hbWUgb3IgY29tbW9uIG5hbWUgZXh0cmFjdGVkIGZyb20gcGVlciBjZXJ0aWZpY2F0ZQorICAgKiBAcGFyYW0gIHNpemUgTGVuZ3RoIG9mIG5hbWUKKyAgICogQHJldHVybiBUcnVlIGlmIHRoZSBwZWVyIGlzIHRydXN0ZWQsIGZhbHNlIG90aGVyd2lzZQorICAgKgorICAgKiBOb3RlOiBUaGUgIm5hbWUiIHBhcmFtZXRlciBtYXkgYmUgVVRGOCBlbmNvZGVkLgorICAgKi8KKyAgdmlydHVhbCBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc3RkOjpzdHJpbmcmIC8qIGhvc3QgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBzaXplICovKSBub2V4Y2VwdCB7CisgICAgcmV0dXJuIERFTlk7CisgIH0KKyAgLyoqCisgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBwZWVyIHNob3VsZCBiZSBncmFudGVkIGFjY2VzcyBvciBub3QuIEl0J3MgY2FsbGVkCisgICAqIGV2ZXJ5IHRpbWUgYW4gSVAgc3ViamVjdEFsdE5hbWUgaXMgZXh0cmFjdGVkIGZyb20gcGVlcidzIGNlcnRpZmljYXRlLgorICAgKgorICAgKiBAcGFyYW0gIHNhICAgUGVlciBJUCBhZGRyZXNzIHJldHJpZXZlZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHNvY2tldAorICAgKiBAcGFyYW0gIGRhdGEgSVAgYWRkcmVzcyBleHRyYWN0ZWQgZnJvbSBjZXJ0aWZpY2F0ZQorICAgKiBAcGFyYW0gIHNpemUgTGVuZ3RoIG9mIHRoZSBJUCBhZGRyZXNzCisgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcGVlciBpcyB0cnVzdGVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICovCisgIHZpcnR1YWwgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIC8qIHNhICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiBkYXRhICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogc2l6ZSAqLykgbm9leGNlcHQgeworICAgIHJldHVybiBERU5ZOworICB9Cit9OworCit0eXBlZGVmIEFjY2Vzc01hbmFnZXI6OkRlY2lzaW9uIERlY2lzaW9uOworCitjbGFzcyBEZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlciA6IHB1YmxpYyBBY2Nlc3NNYW5hZ2VyIHsKK3B1YmxpYzoKKyAgLy8gQWNjZXNzTWFuYWdlciBpbnRlcmZhY2UKKyAgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhKSBub2V4Y2VwdDsKKyAgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBjb25zdCBjaGFyKiBuYW1lLCBpbnQgc2l6ZSkgbm9leGNlcHQ7CisgIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSwgY29uc3QgY2hhciogZGF0YSwgaW50IHNpemUpIG5vZXhjZXB0OworfTsKK30KK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMThiOTkzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcApAQCAtMCwwICsxLDY5NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfVU5fSAorI2luY2x1ZGUgPHN5cy91bi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfUE9MTF9ICisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfTkVUSU5FVF9JTl9ICisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX05FVERCX0gKKyNpbmNsdWRlIDxuZXRkYi5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKworI2lmbmRlZiBBRl9MT0NBTAorI2RlZmluZSBBRl9MT0NBTCBBRl9VTklYCisjZW5kaWYKKworI2lmbmRlZiBTT0NLT1BUX0NBU1RfVAorI2lmbmRlZiBfV0lOMzIKKyNkZWZpbmUgU09DS09QVF9DQVNUX1Qgdm9pZAorI2Vsc2UKKyNkZWZpbmUgU09DS09QVF9DQVNUX1QgY2hhcgorI2VuZGlmIC8vIF9XSU4zMgorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKiBjb25zdF9jYXN0X3NvY2tvcHQoY29uc3QgVCogdikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTT0NLT1BUX0NBU1RfVCo+KHYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBTT0NLT1BUX0NBU1RfVCogY2FzdF9zb2Nrb3B0KFQqIHYpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U09DS09QVF9DQVNUX1QqPih2KTsKK30KKwordm9pZCBkZXN0cm95ZXJfb2ZfZmluZV9zb2NrZXRzKFRIUklGVF9TT0NLRVQqIHNzb2NrKSB7CisgIDo6VEhSSUZUX0NMT1NFU09DS0VUKCpzc29jayk7CisgIGRlbGV0ZSBzc29jazsKK30KKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCitUR2V0QWRkckluZm9XcmFwcGVyOjpUR2V0QWRkckluZm9XcmFwcGVyKGNvbnN0IGNoYXIqIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyogaGludHMpCisgIDogbm9kZV8obm9kZSksIHNlcnZpY2VfKHNlcnZpY2UpLCBoaW50c18oaGludHMpLCByZXNfKE5VTEwpIHt9CisKK1RHZXRBZGRySW5mb1dyYXBwZXI6On5UR2V0QWRkckluZm9XcmFwcGVyKCkgeworICBpZiAodGhpcy0+cmVzXyAhPSBOVUxMKQorICAgIGZyZWVhZGRyaW5mbyh0aGlzLT5yZXNfKTsKK30KKworaW50IFRHZXRBZGRySW5mb1dyYXBwZXI6OmluaXQoKSB7CisgIGlmICh0aGlzLT5yZXNfID09IE5VTEwpCisgICAgcmV0dXJuIGdldGFkZHJpbmZvKHRoaXMtPm5vZGVfLCB0aGlzLT5zZXJ2aWNlXywgdGhpcy0+aGludHNfLCAmKHRoaXMtPnJlc18pKTsKKyAgcmV0dXJuIDA7Cit9CisKK2NvbnN0IHN0cnVjdCBhZGRyaW5mbyogVEdldEFkZHJJbmZvV3JhcHBlcjo6cmVzKCkgeworICByZXR1cm4gdGhpcy0+cmVzXzsKK30KKworVFNlcnZlclNvY2tldDo6VFNlcnZlclNvY2tldChpbnQgcG9ydCkKKyAgOiBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fKHRydWUpLAorICAgIHBvcnRfKHBvcnQpLAorICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAgYWNjVGltZW91dF8oLTEpLAorICAgIHJldHJ5TGltaXRfKDApLAorICAgIHJldHJ5RGVsYXlfKDApLAorICAgIHRjcFNlbmRCdWZmZXJfKDApLAorICAgIHRjcFJlY3ZCdWZmZXJfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpc3RlbmluZ18oZmFsc2UpLAorICAgIGludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgaW50ZXJydXB0U29ja1JlYWRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworfQorCitUU2VydmVyU29ja2V0OjpUU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgc2VuZFRpbWVvdXQsIGludCByZWN2VGltZW91dCkKKyAgOiBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fKHRydWUpLAorICAgIHBvcnRfKHBvcnQpLAorICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLAorICAgIHNlbmRUaW1lb3V0XyhzZW5kVGltZW91dCksCisgICAgcmVjdlRpbWVvdXRfKHJlY3ZUaW1lb3V0KSwKKyAgICBhY2NUaW1lb3V0XygtMSksCisgICAgcmV0cnlMaW1pdF8oMCksCisgICAgcmV0cnlEZWxheV8oMCksCisgICAgdGNwU2VuZEJ1ZmZlcl8oMCksCisgICAgdGNwUmVjdkJ1ZmZlcl8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGlzdGVuaW5nXyhmYWxzZSksCisgICAgaW50ZXJydXB0U29ja1dyaXRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBpbnRlcnJ1cHRTb2NrUmVhZGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7Cit9CisKK1RTZXJ2ZXJTb2NrZXQ6OlRTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RyaW5nJiBhZGRyZXNzLCBpbnQgcG9ydCkKKyAgOiBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fKHRydWUpLAorICAgIHBvcnRfKHBvcnQpLAorICAgIGFkZHJlc3NfKGFkZHJlc3MpLAorICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAgYWNjVGltZW91dF8oLTEpLAorICAgIHJldHJ5TGltaXRfKDApLAorICAgIHJldHJ5RGVsYXlfKDApLAorICAgIHRjcFNlbmRCdWZmZXJfKDApLAorICAgIHRjcFJlY3ZCdWZmZXJfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpc3RlbmluZ18oZmFsc2UpLAorICAgIGludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgaW50ZXJydXB0U29ja1JlYWRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworfQorCitUU2VydmVyU29ja2V0OjpUU2VydmVyU29ja2V0KGNvbnN0IHN0cmluZyYgcGF0aCkKKyAgOiBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fKHRydWUpLAorICAgIHBvcnRfKDApLAorICAgIHBhdGhfKHBhdGgpLAorICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAgYWNjVGltZW91dF8oLTEpLAorICAgIHJldHJ5TGltaXRfKDApLAorICAgIHJldHJ5RGVsYXlfKDApLAorICAgIHRjcFNlbmRCdWZmZXJfKDApLAorICAgIHRjcFJlY3ZCdWZmZXJfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpc3RlbmluZ18oZmFsc2UpLAorICAgIGludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgaW50ZXJydXB0U29ja1JlYWRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworfQorCitUU2VydmVyU29ja2V0Ojp+VFNlcnZlclNvY2tldCgpIHsKKyAgY2xvc2UoKTsKK30KKwordm9pZCBUU2VydmVyU29ja2V0OjpzZXRTZW5kVGltZW91dChpbnQgc2VuZFRpbWVvdXQpIHsKKyAgc2VuZFRpbWVvdXRfID0gc2VuZFRpbWVvdXQ7Cit9CisKK3ZvaWQgVFNlcnZlclNvY2tldDo6c2V0UmVjdlRpbWVvdXQoaW50IHJlY3ZUaW1lb3V0KSB7CisgIHJlY3ZUaW1lb3V0XyA9IHJlY3ZUaW1lb3V0OworfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldEFjY2VwdFRpbWVvdXQoaW50IGFjY1RpbWVvdXQpIHsKKyAgYWNjVGltZW91dF8gPSBhY2NUaW1lb3V0OworfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldEFjY2VwdEJhY2tsb2coaW50IGFjY0JhY2tsb2cpIHsKKyAgYWNjZXB0QmFja2xvZ18gPSBhY2NCYWNrbG9nOworfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldFJldHJ5TGltaXQoaW50IHJldHJ5TGltaXQpIHsKKyAgcmV0cnlMaW1pdF8gPSByZXRyeUxpbWl0OworfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldFJldHJ5RGVsYXkoaW50IHJldHJ5RGVsYXkpIHsKKyAgcmV0cnlEZWxheV8gPSByZXRyeURlbGF5OworfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldFRjcFNlbmRCdWZmZXIoaW50IHRjcFNlbmRCdWZmZXIpIHsKKyAgdGNwU2VuZEJ1ZmZlcl8gPSB0Y3BTZW5kQnVmZmVyOworfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldFRjcFJlY3ZCdWZmZXIoaW50IHRjcFJlY3ZCdWZmZXIpIHsKKyAgdGNwUmVjdkJ1ZmZlcl8gPSB0Y3BSZWN2QnVmZmVyOworfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldEludGVycnVwdGFibGVDaGlsZHJlbihib29sIGVuYWJsZSkgeworICBpZiAobGlzdGVuaW5nXykgeworICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoInNldEludGVycnVwdGFibGVDaGlsZHJlbiBjYW5ub3QgYmUgY2FsbGVkIGFmdGVyIGxpc3RlbigpIik7CisgIH0KKyAgaW50ZXJydXB0YWJsZUNoaWxkcmVuXyA9IGVuYWJsZTsKK30KKwordm9pZCBUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSB7CisgIGxpc3RlbmluZ18gPSB0cnVlOworI2lmZGVmIF9XSU4zMgorICBUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CisjZW5kaWYgLy8gX1dJTjMyCisgIFRIUklGVF9TT0NLRVQgc3ZbMl07CisgIC8vIENyZWF0ZSB0aGUgc29ja2V0IHBhaXIgdXNlZCB0byBpbnRlcnJ1cHQKKyAgaWYgKC0xID09IFRIUklGVF9TT0NLRVRQQUlSKEFGX0xPQ0FMLCBTT0NLX1NUUkVBTSwgMCwgc3YpKSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc29ja2V0cGFpcigpIGludGVycnVwdCIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgICBpbnRlcnJ1cHRTb2NrV3JpdGVyXyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgICBpbnRlcnJ1cHRTb2NrUmVhZGVyXyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgfSBlbHNlIHsKKyAgICBpbnRlcnJ1cHRTb2NrV3JpdGVyXyA9IHN2WzFdOworICAgIGludGVycnVwdFNvY2tSZWFkZXJfID0gc3ZbMF07CisgIH0KKworICAvLyBDcmVhdGUgdGhlIHNvY2tldCBwYWlyIHVzZWQgdG8gaW50ZXJydXB0IGFsbCBjbGllbnRzCisgIGlmICgtMSA9PSBUSFJJRlRfU09DS0VUUEFJUihBRl9MT0NBTCwgU09DS19TVFJFQU0sIDAsIHN2KSkgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNvY2tldHBhaXIoKSBjaGlsZEludGVycnVwdCIsCisgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgICBwQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyXy5yZXNldCgpOworICB9IGVsc2UgeworICAgIGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8gPSBzdlsxXTsKKyAgICBwQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyXworICAgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPihuZXcgVEhSSUZUX1NPQ0tFVChzdlswXSksIGRlc3Ryb3llcl9vZl9maW5lX3NvY2tldHMpOworICB9CisKKyAgLy8gVmFsaWRhdGUgcG9ydCBudW1iZXIKKyAgaWYgKHBvcnRfIDwgMCB8fCBwb3J0XyA+IDB4RkZGRikgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsICJTcGVjaWZpZWQgcG9ydCBpcyBpbnZhbGlkIik7CisgIH0KKworICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKnJlczsKKyAgaW50IGVycm9yOworICBjaGFyIHBvcnRbc2l6ZW9mKCI2NTUzNSIpXTsKKyAgVEhSSUZUX1NOUFJJTlRGKHBvcnQsIHNpemVvZihwb3J0KSwgIiVkIiwgcG9ydF8pOworCisgIHN0cnVjdCBhZGRyaW5mbyBoaW50czsKKyAgc3RkOjptZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKyAgaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOworICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICBoaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkUgfCBBSV9BRERSQ09ORklHOworCisgIC8vIElmIGFkZHJlc3MgaXMgbm90IHNwZWNpZmllZCB1c2Ugd2lsZGNhcmQgYWRkcmVzcyAoTlVMTCkKKyAgVEdldEFkZHJJbmZvV3JhcHBlciBpbmZvKGFkZHJlc3NfLmVtcHR5KCkgPyBOVUxMIDogJmFkZHJlc3NfWzBdLCBwb3J0LCAmaGludHMpOworCisgIGVycm9yID0gaW5mby5pbml0KCk7CisgIGlmIChlcnJvcikgeworICAgIEdsb2JhbE91dHB1dC5wcmludGYoImdldGFkZHJpbmZvICVkOiAlcyIsIGVycm9yLCBUSFJJRlRfR0FJX1NUUkVSUk9SKGVycm9yKSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCByZXNvbHZlIGhvc3QgZm9yIHNlcnZlciBzb2NrZXQuIik7CisgIH0KKworICAvLyBQaWNrIHRoZSBpcHY2IGFkZHJlc3MgZmlyc3Qgc2luY2UgaXB2NCBhZGRyZXNzZXMgY2FuIGJlIG1hcHBlZAorICAvLyBpbnRvIGlwdjYgc3BhY2UuCisgIGZvciAocmVzID0gaW5mby5yZXMoKTsgcmVzOyByZXMgPSByZXMtPmFpX25leHQpIHsKKyAgICBpZiAocmVzLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYgfHwgcmVzLT5haV9uZXh0ID09IE5VTEwpCisgICAgICBicmVhazsKKyAgfQorCisgIGlmICghcGF0aF8uZW1wdHkoKSkgeworICAgIHNlcnZlclNvY2tldF8gPSBzb2NrZXQoUEZfVU5JWCwgU09DS19TVFJFQU0sIElQUFJPVE9fSVApOworICB9IGVsc2UgaWYgKHJlcyAhPSBOVUxMKSB7CisgICAgc2VydmVyU29ja2V0XyA9IHNvY2tldChyZXMtPmFpX2ZhbWlseSwgcmVzLT5haV9zb2NrdHlwZSwgcmVzLT5haV9wcm90b2NvbCk7CisgIH0KKworICBpZiAoc2VydmVyU29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNvY2tldCgpICIsIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIHNlcnZlciBzb2NrZXQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgLy8gU2V0IFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyB0byBwcmV2ZW50IDJNU0wgZGVsYXkgb24gYWNjZXB0CisgIGludCBvbmUgPSAxOworICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLAorICAgICAgICAgICAgICAgICAgICAgICBTT0xfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcsCisgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rfc29ja29wdCgmb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9uZSkpKSB7CisvLyBpZ25vcmUgZXJyb3JzIGNvbWluZyBvdXQgb2YgdGhpcyBzZXRzb2Nrb3B0IG9uIFdpbmRvd3MuICBUaGlzIGlzIGJlY2F1c2UKKy8vIFNPX0VYQ0xVU0lWRUFERFJVU0UgcmVxdWlyZXMgYWRtaW4gcHJpdmlsZWdlcyBvbiBXaW5YUCwgYnV0IHdlIGRvbid0CisvLyB3YW50IHRvIGZvcmNlIHNlcnZlcnMgdG8gYmUgYW4gYWRtaW4uCisjaWZuZGVmIF9XSU4zMgorICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworI2VuZGlmCisgIH0KKworICAvLyBTZXQgVENQIGJ1ZmZlciBzaXplcworICBpZiAodGNwU2VuZEJ1ZmZlcl8gPiAwKSB7CisgICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTT0xfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgIFNPX1NOREJVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJnRjcFNlbmRCdWZmZXJfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodGNwU2VuZEJ1ZmZlcl8pKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19TTkRCVUYgIiwgZXJybm9fY29weSk7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgU09fU05EQlVGIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgfQorICB9CisKKyAgaWYgKHRjcFJlY3ZCdWZmZXJfID4gMCkgeworICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgU09MX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTT19SQ1ZCVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9zb2Nrb3B0KCZ0Y3BSZWN2QnVmZmVyXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRjcFJlY3ZCdWZmZXJfKSkpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fUkNWQlVGICIsIGVycm5vX2NvcHkpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2V0IFNPX1JDVkJVRiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgIH0KKyAgfQorCisvLyBEZWZlciBhY2NlcHQKKyNpZmRlZiBUQ1BfREVGRVJfQUNDRVBUCisgIGlmIChwYXRoXy5lbXB0eSgpKSB7CisgICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgSVBQUk9UT19UQ1AsIFRDUF9ERUZFUl9BQ0NFUFQsICZvbmUsIHNpemVvZihvbmUpKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBUQ1BfREVGRVJfQUNDRVBUICIsIGVycm5vX2NvcHkpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2V0IFRDUF9ERUZFUl9BQ0NFUFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisgIH0KKyNlbmRpZiAvLyAjaWZkZWYgVENQX0RFRkVSX0FDQ0VQVAorCisjaWZkZWYgSVBWNl9WNk9OTFkKKyAgaWYgKHJlcy0+YWlfZmFtaWx5ID09IEFGX0lORVQ2ICYmIHBhdGhfLmVtcHR5KCkpIHsKKyAgICBpbnQgemVybyA9IDA7CisgICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICBJUFBST1RPX0lQVjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgSVBWNl9WNk9OTFksCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9zb2Nrb3B0KCZ6ZXJvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoemVybykpKSB7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBJUFY2X1Y2T05MWSAiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgfQorICB9CisjZW5kaWYgLy8gI2lmZGVmIElQVjZfVjZPTkxZCisKKyAgLy8gVHVybiBsaW5nZXIgb2ZmLCBkb24ndCB3YW50IHRvIGJsb2NrIG9uIGNhbGxzIHRvIGNsb3NlCisgIHN0cnVjdCBsaW5nZXIgbGluZyA9IHswLCAwfTsKKyAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgU09MX1NPQ0tFVCwgU09fTElOR0VSLCBjYXN0X3NvY2tvcHQoJmxpbmcpLCBzaXplb2YobGluZykpKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fTElOR0VSICIsIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBzZXQgU09fTElOR0VSIiwgZXJybm9fY29weSk7CisgIH0KKworICAvLyBVbml4IFNvY2tldHMgZG8gbm90IG5lZWQgdGhhdAorICBpZiAocGF0aF8uZW1wdHkoKSkgeworICAgIC8vIFRDUCBOb2RlbGF5LCBzcGVlZCBvdmVyIGJhbmR3aWR0aAorICAgIGlmICgtMQorICAgICAgICA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgY2FzdF9zb2Nrb3B0KCZvbmUpLCBzaXplb2Yob25lKSkpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgVENQX05PREVMQVkgIiwgZXJybm9fY29weSk7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgVENQX05PREVMQVkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisgIH0KKworICAvLyBTZXQgTk9OQkxPQ0sgb24gdGhlIGFjY2VwdCBzb2NrZXQKKyAgaW50IGZsYWdzID0gVEhSSUZUX0ZDTlRMKHNlcnZlclNvY2tldF8sIFRIUklGVF9GX0dFVEZMLCAwKTsKKyAgaWYgKGZsYWdzID09IC0xKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9HRVRGTCAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfR0VURkwgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgaWYgKC0xID09IFRIUklGVF9GQ05UTChzZXJ2ZXJTb2NrZXRfLCBUSFJJRlRfRl9TRVRGTCwgZmxhZ3MgfCBUSFJJRlRfT19OT05CTE9DSykpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIFRIUklGVF9GQ05UTCgpIFRIUklGVF9PX05PTkJMT0NLICIsIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9TRVRGTCBUSFJJRlRfT19OT05CTE9DSyBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgIH0KKworICAvLyBwcmVwYXJlIHRoZSBwb3J0IGluZm9ybWF0aW9uCisgIC8vIHdlIG1heSB3YW50IHRvIHRyeSB0byBiaW5kIG1vcmUgdGhhbiBvbmNlLCBzaW5jZSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgZG9lc24ndAorICAvLyBhbHdheXMgc2VlbSB0byB3b3JrLiBUaGUgY2xpZW50IGNhbiBjb25maWd1cmUgdGhlIHJldHJ5IHZhcmlhYmxlcy4KKyAgaW50IHJldHJpZXMgPSAwOworICBpbnQgZXJybm9fY29weSA9IDA7CisKKyAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisKKyNpZm5kZWYgX1dJTjMyCisKKyAgICAvLyBVbml4IERvbWFpbiBTb2NrZXQKKyAgICBzaXplX3QgbGVuID0gcGF0aF8uc2l6ZSgpICsgMTsKKyAgICBpZiAobGVuID4gc2l6ZW9mKCgoc29ja2FkZHJfdW4qKU5VTEwpLT5zdW5fcGF0aCkpIHsKKyAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Omxpc3RlbigpIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIHRvbyBsb25nIiwgZXJybm9fY29weSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5peCBEb21haW4gc29ja2V0IHBhdGggdG9vIGxvbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcmVzczsKKyAgICBhZGRyZXNzLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICAgIG1lbWNweShhZGRyZXNzLnN1bl9wYXRoLCBwYXRoXy5jX3N0cigpLCBsZW4pOworCisgICAgc29ja2xlbl90IHN0cnVjdGxlbiA9IHN0YXRpY19jYXN0PHNvY2tsZW5fdD4oc2l6ZW9mKGFkZHJlc3MpKTsKKworICAgIGlmICghYWRkcmVzcy5zdW5fcGF0aFswXSkgeyAvLyBhYnN0cmFjdCBuYW1lc3BhY2Ugc29ja2V0CisjaWZkZWYgX19saW51eF9fCisgICAgICAvLyBzdW5fcGF0aCBpcyBub3QgbnVsbC10ZXJtaW5hdGVkIGluIHRoaXMgY2FzZSBhbmQgc3RydWN0bGVuIGRldGVybWluZXMgaXRzIGxlbmd0aAorICAgICAgc3RydWN0bGVuIC09IHNpemVvZihhZGRyZXNzLnN1bl9wYXRoKSAtIGxlbjsKKyNlbHNlCisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgQWJzdHJhY3QgTmFtZXNwYWNlIERvbWFpbiBzb2NrZXRzIG9ubHkgc3VwcG9ydGVkIG9uIGxpbnV4OiAiLCAtOTkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBYnN0cmFjdCBOYW1lc3BhY2UgRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorICAgIH0KKworICAgIGRvIHsKKyAgICAgIGlmICgwID09IDo6YmluZChzZXJ2ZXJTb2NrZXRfLCAoc3RydWN0IHNvY2thZGRyKikmYWRkcmVzcywgc3RydWN0bGVuKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIC8vIHVzZSBzaG9ydCBjaXJjdWl0IGV2YWx1YXRpb24gaGVyZSB0byBvbmx5IHNsZWVwIGlmIHdlIG5lZWQgdG8KKyAgICB9IHdoaWxlICgocmV0cmllcysrIDwgcmV0cnlMaW1pdF8pICYmIChUSFJJRlRfU0xFRVBfU0VDKHJldHJ5RGVsYXlfKSA9PSAwKSk7CisjZWxzZQorICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBVbml4IERvbWFpbiBzb2NrZXQgcGF0aCBub3Qgc3VwcG9ydGVkIG9uIHdpbmRvd3MiLCAtOTkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIGRvIHsKKyAgICAgIGlmICgwID09IDo6YmluZChzZXJ2ZXJTb2NrZXRfLCByZXMtPmFpX2FkZHIsIHN0YXRpY19jYXN0PGludD4ocmVzLT5haV9hZGRybGVuKSkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAvLyB1c2Ugc2hvcnQgY2lyY3VpdCBldmFsdWF0aW9uIGhlcmUgdG8gb25seSBzbGVlcCBpZiB3ZSBuZWVkIHRvCisgICAgfSB3aGlsZSAoKHJldHJpZXMrKyA8IHJldHJ5TGltaXRfKSAmJiAoVEhSSUZUX1NMRUVQX1NFQyhyZXRyeURlbGF5XykgPT0gMCkpOworCisgICAgLy8gcmV0cmlldmUgYmluZCBpbmZvCisgICAgaWYgKHBvcnRfID09IDAgJiYgcmV0cmllcyA8PSByZXRyeUxpbWl0XykgeworICAgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc2E7CisgICAgICBzb2NrbGVuX3QgbGVuID0gc2l6ZW9mKHNhKTsKKyAgICAgIHN0ZDo6bWVtc2V0KCZzYSwgMCwgbGVuKTsKKyAgICAgIGlmICg6OmdldHNvY2tuYW1lKHNlcnZlclNvY2tldF8sIHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IHNvY2thZGRyKj4oJnNhKSwgJmxlbikgPCAwKSB7CisgICAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6Z2V0UG9ydCgpIGdldHNvY2tuYW1lKCkgIiwgZXJybm9fY29weSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoc2Euc3NfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisgICAgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiogc2luID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42Kj4oJnNhKTsKKyAgICAgICAgICBwb3J0XyA9IG50b2hzKHNpbi0+c2luNl9wb3J0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4qIHNpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luKj4oJnNhKTsKKyAgICAgICAgICBwb3J0XyA9IG50b2hzKHNpbi0+c2luX3BvcnQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gdGhyb3cgYW4gZXJyb3IgaWYgd2UgZmFpbGVkIHRvIGJpbmQgcHJvcGVybHkKKyAgaWYgKHJldHJpZXMgPiByZXRyeUxpbWl0XykgeworICAgIGNoYXIgZXJyYnVmWzEwMjRdOworICAgIGlmICghcGF0aF8uZW1wdHkoKSkgeworICAgICAgVEhSSUZUX1NOUFJJTlRGKGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZiksICJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBQQVRIICVzIiwgcGF0aF8uY19zdHIoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIFRIUklGVF9TTlBSSU5URihlcnJidWYsIHNpemVvZihlcnJidWYpLCAiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgQklORCAlZCIsIHBvcnRfKTsKKyAgICB9CisgICAgR2xvYmFsT3V0cHV0KGVycmJ1Zik7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBiaW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgaWYgKGxpc3RlbkNhbGxiYWNrXykKKyAgICBsaXN0ZW5DYWxsYmFja18oc2VydmVyU29ja2V0Xyk7CisKKyAgLy8gQ2FsbCBsaXN0ZW4KKyAgaWYgKC0xID09IDo6bGlzdGVuKHNlcnZlclNvY2tldF8sIGFjY2VwdEJhY2tsb2dfKSkgeworICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBsaXN0ZW4oKSAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3QgbGlzdGVuIiwgZXJybm9fY29weSk7CisgIH0KKworICAvLyBUaGUgc29ja2V0IGlzIG5vdyBsaXN0ZW5pbmchCit9CisKK2ludCBUU2VydmVyU29ja2V0OjpnZXRQb3J0KCkgeworICByZXR1cm4gcG9ydF87Cit9CisKK3NoYXJlZF9wdHI8VFRyYW5zcG9ydD4gVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIHsKKyAgaWYgKHNlcnZlclNvY2tldF8gPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlRTZXJ2ZXJTb2NrZXQgbm90IGxpc3RlbmluZyIpOworICB9CisKKyAgc3RydWN0IFRIUklGVF9QT0xMRkQgZmRzWzJdOworCisgIGludCBtYXhFaW50cnMgPSA1OworICBpbnQgbnVtRWludHJzID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIHN0ZDo6bWVtc2V0KGZkcywgMCwgc2l6ZW9mKGZkcykpOworICAgIGZkc1swXS5mZCA9IHNlcnZlclNvY2tldF87CisgICAgZmRzWzBdLmV2ZW50cyA9IFRIUklGVF9QT0xMSU47CisgICAgaWYgKGludGVycnVwdFNvY2tSZWFkZXJfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgICAgZmRzWzFdLmZkID0gaW50ZXJydXB0U29ja1JlYWRlcl87CisgICAgICBmZHNbMV0uZXZlbnRzID0gVEhSSUZUX1BPTExJTjsKKyAgICB9CisgICAgLyoKKyAgICAgIFRPRE86IGlmIFRIUklGVF9FSU5UUiBpcyByZWNlaXZlZCwgd2UnbGwgcmVzdGFydCB0aGUgdGltZW91dC4KKyAgICAgIFRvIGJlIGFjY3VyYXRlLCB3ZSBuZWVkIHRvIGZpeCB0aGlzIGluIHRoZSBmdXR1cmUuCisgICAgICovCisgICAgaW50IHJldCA9IFRIUklGVF9QT0xMKGZkcywgMiwgYWNjVGltZW91dF8pOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgIC8vIGVycm9yIGNhc2VzCisgICAgICBpZiAoVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgPT0gVEhSSUZUX0VJTlRSICYmIChudW1FaW50cnMrKyA8IG1heEVpbnRycykpIHsKKyAgICAgICAgLy8gVEhSSUZUX0VJTlRSIG5lZWRzIHRvIGJlIGhhbmRsZWQgbWFudWFsbHkgYW5kIHdlIGNhbiB0b2xlcmF0ZQorICAgICAgICAvLyBhIGNlcnRhaW4gbnVtYmVyCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSBUSFJJRlRfUE9MTCgpICIsIGVycm5vX2NvcHkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVW5rbm93biIsIGVycm5vX2NvcHkpOworICAgIH0gZWxzZSBpZiAocmV0ID4gMCkgeworICAgICAgLy8gQ2hlY2sgZm9yIGFuIGludGVycnVwdCBzaWduYWwKKyAgICAgIGlmIChpbnRlcnJ1cHRTb2NrUmVhZGVyXyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgJiYgKGZkc1sxXS5yZXZlbnRzICYgVEhSSUZUX1BPTExJTikpIHsKKyAgICAgICAgaW50OF90IGJ1ZjsKKyAgICAgICAgaWYgKC0xID09IHJlY3YoaW50ZXJydXB0U29ja1JlYWRlcl8sIGNhc3Rfc29ja29wdCgmYnVmKSwgc2l6ZW9mKGludDhfdCksIDApKSB7CisgICAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIHJlY3YoKSBpbnRlcnJ1cHQgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVEKTsKKyAgICAgIH0KKworICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBhY3R1YWwgc2VydmVyIHNvY2tldCBiZWluZyByZWFkeQorICAgICAgaWYgKGZkc1swXS5yZXZlbnRzICYgVEhSSUZUX1BPTExJTikgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgR2xvYmFsT3V0cHV0KCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgVEhSSUZUX1BPTEwgMCIpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOKTsKKyAgICB9CisgIH0KKworICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBjbGllbnRBZGRyZXNzOworICBpbnQgc2l6ZSA9IHNpemVvZihjbGllbnRBZGRyZXNzKTsKKyAgVEhSSUZUX1NPQ0tFVCBjbGllbnRTb2NrZXQKKyAgICAgID0gOjphY2NlcHQoc2VydmVyU29ja2V0XywgKHN0cnVjdCBzb2NrYWRkciopJmNsaWVudEFkZHJlc3MsIChzb2NrbGVuX3QqKSZzaXplKTsKKworICBpZiAoY2xpZW50U29ja2V0ID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIDo6YWNjZXB0KCkgIiwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiYWNjZXB0KCkiLCBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIE1ha2Ugc3VyZSBjbGllbnQgc29ja2V0IGlzIGJsb2NraW5nCisgIGludCBmbGFncyA9IFRIUklGVF9GQ05UTChjbGllbnRTb2NrZXQsIFRIUklGVF9GX0dFVEZMLCAwKTsKKyAgaWYgKGZsYWdzID09IC0xKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChjbGllbnRTb2NrZXQpOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSBUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9HRVRGTCAiLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0ZDTlRMKFRIUklGVF9GX0dFVEZMKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIGlmICgtMSA9PSBUSFJJRlRfRkNOVEwoY2xpZW50U29ja2V0LCBUSFJJRlRfRl9TRVRGTCwgZmxhZ3MgJiB+VEhSSUZUX09fTk9OQkxPQ0spKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChjbGllbnRTb2NrZXQpOworICAgIEdsb2JhbE91dHB1dAorICAgICAgICAucGVycm9yKCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfU0VURkwgflRIUklGVF9PX05PTkJMT0NLICIsCisgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9GQ05UTChUSFJJRlRfRl9TRVRGTCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgIH0KKworICBzaGFyZWRfcHRyPFRTb2NrZXQ+IGNsaWVudCA9IGNyZWF0ZVNvY2tldChjbGllbnRTb2NrZXQpOworICBpZiAoc2VuZFRpbWVvdXRfID4gMCkgeworICAgIGNsaWVudC0+c2V0U2VuZFRpbWVvdXQoc2VuZFRpbWVvdXRfKTsKKyAgfQorICBpZiAocmVjdlRpbWVvdXRfID4gMCkgeworICAgIGNsaWVudC0+c2V0UmVjdlRpbWVvdXQocmVjdlRpbWVvdXRfKTsKKyAgfQorICBpZiAoa2VlcEFsaXZlXykgeworICAgIGNsaWVudC0+c2V0S2VlcEFsaXZlKGtlZXBBbGl2ZV8pOworICB9CisgIGNsaWVudC0+c2V0Q2FjaGVkQWRkcmVzcygoc29ja2FkZHIqKSZjbGllbnRBZGRyZXNzLCBzaXplKTsKKworICBpZiAoYWNjZXB0Q2FsbGJhY2tfKQorICAgIGFjY2VwdENhbGxiYWNrXyhjbGllbnRTb2NrZXQpOworCisgIHJldHVybiBjbGllbnQ7Cit9CisKK3NoYXJlZF9wdHI8VFNvY2tldD4gVFNlcnZlclNvY2tldDo6Y3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgY2xpZW50U29ja2V0KSB7CisgIGlmIChpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fKSB7CisgICAgcmV0dXJuIHNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoY2xpZW50U29ja2V0LCBwQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyXykpOworICB9IGVsc2UgeworICAgIHJldHVybiBzaGFyZWRfcHRyPFRTb2NrZXQ+KG5ldyBUU29ja2V0KGNsaWVudFNvY2tldCkpOworICB9Cit9CisKK3ZvaWQgVFNlcnZlclNvY2tldDo6bm90aWZ5KFRIUklGVF9TT0NLRVQgbm90aWZ5U29ja2V0KSB7CisgIGlmIChub3RpZnlTb2NrZXQgIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgaW50OF90IGJ5dGUgPSAwOworICAgIGlmICgtMSA9PSBzZW5kKG5vdGlmeVNvY2tldCwgY2FzdF9zb2Nrb3B0KCZieXRlKSwgc2l6ZW9mKGludDhfdCksIDApKSB7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0Ojpub3RpZnkoKSBzZW5kKCkgIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgIH0KKyAgfQorfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OmludGVycnVwdCgpIHsKKyAgY29uY3VycmVuY3k6Okd1YXJkIGcocndNdXRleF8pOworICBpZiAoaW50ZXJydXB0U29ja1dyaXRlcl8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgbm90aWZ5KGludGVycnVwdFNvY2tXcml0ZXJfKTsKKyAgfQorfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OmludGVycnVwdENoaWxkcmVuKCkgeworICBjb25jdXJyZW5jeTo6R3VhcmQgZyhyd011dGV4Xyk7CisgIGlmIChjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIG5vdGlmeShjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfKTsKKyAgfQorfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OmNsb3NlKCkgeworICBjb25jdXJyZW5jeTo6R3VhcmQgZyhyd011dGV4Xyk7CisgIGlmIChzZXJ2ZXJTb2NrZXRfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIHNodXRkb3duKHNlcnZlclNvY2tldF8sIFRIUklGVF9TSFVUX1JEV1IpOworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKHNlcnZlclNvY2tldF8pOworICB9CisgIGlmIChpbnRlcnJ1cHRTb2NrV3JpdGVyXyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChpbnRlcnJ1cHRTb2NrV3JpdGVyXyk7CisgIH0KKyAgaWYgKGludGVycnVwdFNvY2tSZWFkZXJfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGludGVycnVwdFNvY2tSZWFkZXJfKTsKKyAgfQorICBpZiAoY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfKTsKKyAgfQorICBzZXJ2ZXJTb2NrZXRfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICBpbnRlcnJ1cHRTb2NrV3JpdGVyXyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgaW50ZXJydXB0U29ja1JlYWRlcl8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgIGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgIHBDaGlsZEludGVycnVwdFNvY2tSZWFkZXJfLnJlc2V0KCk7CisgIGxpc3RlbmluZ18gPSBmYWxzZTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjNkMmMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmgKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSU09DS0VUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJTT0NLRVRfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX05FVERCX0gKKyNpbmNsdWRlIDxuZXRkYi5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworY2xhc3MgVFNvY2tldDsKKworY2xhc3MgVEdldEFkZHJJbmZvV3JhcHBlciB7CitwdWJsaWM6CisgIFRHZXRBZGRySW5mb1dyYXBwZXIoY29uc3QgY2hhciogbm9kZSwgY29uc3QgY2hhciogc2VydmljZSwgY29uc3Qgc3RydWN0IGFkZHJpbmZvKiBoaW50cyk7CisKKyAgdmlydHVhbCB+VEdldEFkZHJJbmZvV3JhcHBlcigpOworCisgIGludCBpbml0KCk7CisgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyogcmVzKCk7CisKK3ByaXZhdGU6CisgIGNvbnN0IGNoYXIqIG5vZGVfOworICBjb25zdCBjaGFyKiBzZXJ2aWNlXzsKKyAgY29uc3Qgc3RydWN0IGFkZHJpbmZvKiBoaW50c187CisgIHN0cnVjdCBhZGRyaW5mbyogcmVzXzsKK307CisKKy8qKgorICogU2VydmVyIHNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBUU2VydmVyVHJhbnNwb3J0LiBXcmFwcGVyIGFyb3VuZCBhIHVuaXgKKyAqIHNvY2tldCBsaXN0ZW4gYW5kIGFjY2VwdCBjYWxscy4KKyAqCisgKi8KK2NsYXNzIFRTZXJ2ZXJTb2NrZXQgOiBwdWJsaWMgVFNlcnZlclRyYW5zcG9ydCB7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKFRIUklGVF9TT0NLRVQgZmQpPiBzb2NrZXRfZnVuY190OworCisgIGNvbnN0IHN0YXRpYyBpbnQgREVGQVVMVF9CQUNLTE9HID0gMTAyNDsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuCisgICAqCisgICAqIEBwYXJhbSBwb3J0ICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICovCisgIFRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHBhcmFtIHBvcnQgICAgICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICogQHBhcmFtIHNlbmRUaW1lb3V0IFNvY2tldCBzZW5kIHRpbWVvdXQKKyAgICogQHBhcmFtIHJlY3ZUaW1lb3V0IFNvY2tldCByZWNlaXZlIHRpbWVvdXQKKyAgICovCisgIFRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBzZW5kVGltZW91dCwgaW50IHJlY3ZUaW1lb3V0KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuCisgICAqCisgICAqIEBwYXJhbSBhZGRyZXNzIEFkZHJlc3MgdG8gYmluZCB0bworICAgKiBAcGFyYW0gcG9ydCAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAqLworICBUU2VydmVyU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzLCBpbnQgcG9ydCk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yIHVzZWQgZm9yIHVuaXggc29ja2V0cy4KKyAgICoKKyAgICogQHBhcmFtIHBhdGggUGF0aG5hbWUgZm9yIHVuaXggc29ja2V0LgorICAgKi8KKyAgVFNlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CisKKyAgdmlydHVhbCB+VFNlcnZlclNvY2tldCgpOworCisgIHZvaWQgc2V0U2VuZFRpbWVvdXQoaW50IHNlbmRUaW1lb3V0KTsKKyAgdm9pZCBzZXRSZWN2VGltZW91dChpbnQgcmVjdlRpbWVvdXQpOworCisgIHZvaWQgc2V0QWNjZXB0VGltZW91dChpbnQgYWNjVGltZW91dCk7CisgIHZvaWQgc2V0QWNjZXB0QmFja2xvZyhpbnQgYWNjQmFja2xvZyk7CisKKyAgdm9pZCBzZXRSZXRyeUxpbWl0KGludCByZXRyeUxpbWl0KTsKKyAgdm9pZCBzZXRSZXRyeURlbGF5KGludCByZXRyeURlbGF5KTsKKworICB2b2lkIHNldEtlZXBBbGl2ZShib29sIGtlZXBBbGl2ZSkgeyBrZWVwQWxpdmVfID0ga2VlcEFsaXZlOyB9CisKKyAgdm9pZCBzZXRUY3BTZW5kQnVmZmVyKGludCB0Y3BTZW5kQnVmZmVyKTsKKyAgdm9pZCBzZXRUY3BSZWN2QnVmZmVyKGludCB0Y3BSZWN2QnVmZmVyKTsKKworICAvLyBsaXN0ZW5DYWxsYmFjayBnZXRzIGNhbGxlZCBqdXN0IGJlZm9yZSBsaXN0ZW4sIGFuZCBhZnRlciBhbGwgVGhyaWZ0CisgIC8vIHNldHNvY2tvcHQgY2FsbHMgaGF2ZSBiZWVuIG1hZGUuICBJZiB5b3UgaGF2ZSBjdXN0b20gc2V0c29ja29wdAorICAvLyB0aGluZ3MgdGhhdCBuZWVkIHRvIGhhcHBlbiBvbiB0aGUgbGlzdGVuaW5nIHNvY2tldCwgdGhpcyBpcyB0aGUgcGxhY2UgdG8gZG8gaXQuCisgIHZvaWQgc2V0TGlzdGVuQ2FsbGJhY2soY29uc3Qgc29ja2V0X2Z1bmNfdCYgbGlzdGVuQ2FsbGJhY2spIHsgbGlzdGVuQ2FsbGJhY2tfID0gbGlzdGVuQ2FsbGJhY2s7IH0KKworICAvLyBhY2NlcHRDYWxsYmFjayBnZXRzIGNhbGxlZCBhZnRlciBlYWNoIGFjY2VwdCBjYWxsLCBvbiB0aGUgbmV3bHkgY3JlYXRlZCBzb2NrZXQuCisgIC8vIEl0IGlzIGNhbGxlZCBhZnRlciBhbGwgVGhyaWZ0IHNldHNvY2tvcHQgY2FsbHMgaGF2ZSBiZWVuIG1hZGUuICBJZiB5b3UgaGF2ZQorICAvLyBjdXN0b20gc2V0c29ja29wdCB0aGluZ3MgdGhhdCBuZWVkIHRvIGhhcHBlbiBvbiB0aGUgYWNjZXB0ZWQKKyAgLy8gc29ja2V0LCB0aGlzIGlzIHRoZSBwbGFjZSB0byBkbyBpdC4KKyAgdm9pZCBzZXRBY2NlcHRDYWxsYmFjayhjb25zdCBzb2NrZXRfZnVuY190JiBhY2NlcHRDYWxsYmFjaykgeyBhY2NlcHRDYWxsYmFja18gPSBhY2NlcHRDYWxsYmFjazsgfQorCisgIC8vIFdoZW4gZW5hYmxlZCAodGhlIGRlZmF1bHQpLCBuZXcgY2hpbGRyZW4gVFNvY2tldHMgd2lsbCBiZSBjb25zdHJ1Y3RlZCBzbworICAvLyB0aGV5IGNhbiBiZSBpbnRlcnJ1cHRlZCBieSBUU2VydmVyVHJhbnNwb3J0OjppbnRlcnJ1cHRDaGlsZHJlbigpLgorICAvLyBUaGlzIGlzIG1vcmUgZXhwZW5zaXZlIGluIHRlcm1zIG9mIHN5c3RlbSBjYWxscyAocG9sbCArIHJlY3YpIGhvd2V2ZXIKKyAgLy8gZW5zdXJlcyBhIGNvbm5lY3RlZCBjbGllbnQgY2Fubm90IGludGVyZmVyZSB3aXRoIFRTZXJ2ZXI6OnN0b3AoKS4KKyAgLy8KKyAgLy8gV2hlbiBkaXNhYmxlZCwgVFNvY2tldCBjaGlsZHJlbiBkbyBub3QgaW5jdXIgYW4gYWRkaXRpb25hbCBwb2xsKCkgY2FsbC4KKyAgLy8gU2VydmVyLXNpZGUgcmVhZHMgYXJlIG1vcmUgZWZmaWNpZW50LCBob3dldmVyIGEgY2xpZW50IGNhbiBpbnRlcmZlcmUgd2l0aAorICAvLyB0aGUgc2VydmVyJ3MgYWJpbGl0eSB0byBzaHV0ZG93biBwcm9wZXJseSBieSBzdGF5aW5nIGNvbm5lY3RlZC4KKyAgLy8KKyAgLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGxpc3RlbigpOyBtb2RlIGNhbm5vdCBiZSBzd2l0Y2hlZCBhZnRlciB0aGF0LgorICAvLyBcdGhyb3dzIHN0ZDo6bG9naWNfZXJyb3IgaWYgbGlzdGVuKCkgaGFzIGJlZW4gY2FsbGVkCisgIHZvaWQgc2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKGJvb2wgZW5hYmxlKTsKKworICBUSFJJRlRfU09DS0VUIGdldFNvY2tldEZEKCkgeyByZXR1cm4gc2VydmVyU29ja2V0XzsgfQorCisgIGludCBnZXRQb3J0KCk7CisKKyAgdm9pZCBsaXN0ZW4oKTsKKyAgdm9pZCBpbnRlcnJ1cHQoKTsKKyAgdm9pZCBpbnRlcnJ1cHRDaGlsZHJlbigpOworICB2b2lkIGNsb3NlKCk7CisKK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgY2xpZW50KTsKKyAgYm9vbCBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fOworICBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gcENoaWxkSW50ZXJydXB0U29ja1JlYWRlcl87IC8vIGlmIGludGVycnVwdGFibGVDaGlsZHJlbl8gdGhpcyBpcyBzaGFyZWQgd2l0aCBjaGlsZCBUU29ja2V0cworCitwcml2YXRlOgorICB2b2lkIG5vdGlmeShUSFJJRlRfU09DS0VUIG5vdGlmeVNvY2spOworCisgIGludCBwb3J0XzsKKyAgc3RkOjpzdHJpbmcgYWRkcmVzc187CisgIHN0ZDo6c3RyaW5nIHBhdGhfOworICBUSFJJRlRfU09DS0VUIHNlcnZlclNvY2tldF87CisgIGludCBhY2NlcHRCYWNrbG9nXzsKKyAgaW50IHNlbmRUaW1lb3V0XzsKKyAgaW50IHJlY3ZUaW1lb3V0XzsKKyAgaW50IGFjY1RpbWVvdXRfOworICBpbnQgcmV0cnlMaW1pdF87CisgIGludCByZXRyeURlbGF5XzsKKyAgaW50IHRjcFNlbmRCdWZmZXJfOworICBpbnQgdGNwUmVjdkJ1ZmZlcl87CisgIGJvb2wga2VlcEFsaXZlXzsKKyAgYm9vbCBsaXN0ZW5pbmdfOworCisgIGNvbmN1cnJlbmN5OjpNdXRleCByd011dGV4XzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJlYWQtc2FmZSBpbnRlcnJ1cHQKKyAgVEhSSUZUX1NPQ0tFVCBpbnRlcnJ1cHRTb2NrV3JpdGVyXzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdGlmaWVkIG9uIGludGVycnVwdCgpCisgIFRIUklGVF9TT0NLRVQgaW50ZXJydXB0U29ja1JlYWRlcl87ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB1c2VkIGluIHNlbGVjdC9wb2xsIHdpdGggc2VydmVyU29ja2V0XyBmb3IgaW50ZXJydXB0YWJpbGl0eQorICBUSFJJRlRfU09DS0VUIGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl87ICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbm90aWZpZWQgb24gaW50ZXJydXB0Q2hpbGRyZW4oKQorCisgIHNvY2tldF9mdW5jX3QgbGlzdGVuQ2FsbGJhY2tfOworICBzb2NrZXRfZnVuY190IGFjY2VwdENhbGxiYWNrXzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlNPQ0tFVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjc2MzJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSVFJBTlNQT1JUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJUUkFOU1BPUlRfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBTZXJ2ZXIgdHJhbnNwb3J0IGZyYW1ld29yay4gQSBzZXJ2ZXIgbmVlZHMgdG8gaGF2ZSBzb21lIGZhY2lsaXR5IGZvcgorICogY3JlYXRpbmcgYmFzZSB0cmFuc3BvcnRzIHRvIHJlYWQvd3JpdGUgZnJvbS4gIFRoZSBzZXJ2ZXIgaXMgZXhwZWN0ZWQKKyAqIHRvIGtlZXAgdHJhY2sgb2YgVFRyYW5zcG9ydCBjaGlsZHJlbiB0aGF0IGl0IGNyZWF0ZXMgZm9yIHB1cnBvc2VzIG9mCisgKiBjb250cm9sbGluZyB0aGVpciBsaWZldGltZS4KKyAqLworY2xhc3MgVFNlcnZlclRyYW5zcG9ydCB7CitwdWJsaWM6CisgIHZpcnR1YWwgflRTZXJ2ZXJUcmFuc3BvcnQoKSB7fQorCisgIC8qKgorICAgKiBTdGFydHMgdGhlIHNlcnZlciB0cmFuc3BvcnQgbGlzdGVuaW5nIGZvciBuZXcgY29ubmVjdGlvbnMuIFByaW9yIHRvIHRoaXMKKyAgICogY2FsbCBtb3N0IHRyYW5zcG9ydHMgd2lsbCBub3QgcmV0dXJuIGFueXRoaW5nIHdoZW4gYWNjZXB0IGlzIGNhbGxlZC4KKyAgICoKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdlIHdlcmUgdW5hYmxlIHRvIGxpc3RlbgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGxpc3RlbigpIHt9CisKKyAgLyoqCisgICAqIEdldHMgYSBuZXcgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHRyYW5zcG9ydCBvYmplY3QgYW5kIHBhc3NlcyBpdCB0byB0aGUKKyAgICogY2FsbGVyLiBOb3RlIHRoYXQgaXQgaXMgdGhlIGV4cGxpY2l0IGR1dHkgb2YgdGhlIGNhbGxlciB0byBmcmVlIHRoZQorICAgKiBhbGxvY2F0ZWQgb2JqZWN0LiBUaGUgcmV0dXJuZWQgVFRyYW5zcG9ydCBvYmplY3QgbXVzdCBhbHdheXMgYmUgaW4gdGhlCisgICAqIG9wZW5lZCBzdGF0ZS4gTlVMTCBzaG91bGQgbmV2ZXIgYmUgcmV0dXJuZWQsIGluc3RlYWQgYW4gRXhjZXB0aW9uIHNob3VsZAorICAgKiBhbHdheXMgYmUgdGhyb3duLgorICAgKgorICAgKiBAcmV0dXJuIEEgbmV3IFRUcmFuc3BvcnQgb2JqZWN0CisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvcgorICAgKi8KKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdCgpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcmVzdWx0ID0gYWNjZXB0SW1wbCgpOworICAgIGlmICghcmVzdWx0KSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJhY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMIik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogRm9yICJzbWFydCIgVFNlcnZlclRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMgdGhhdCB3b3JrIGluIGEgbXVsdGkKKyAgICogdGhyZWFkZWQgY29udGV4dCB0aGlzIGNhbiBiZSB1c2VkIHRvIGJyZWFrIG91dCBvZiBhbiBhY2NlcHQoKSBjYWxsLgorICAgKiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSB0cmFuc3BvcnQgd2lsbCB0aHJvdyBhIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICogd2l0aCB0aGUgSU5URVJSVVBURUQgZXJyb3IgY29kZS4KKyAgICoKKyAgICogVGhpcyB3aWxsIG5vdCBtYWtlIGFuIGF0dGVtcHQgdG8gaW50ZXJydXB0IGFueSBUVHJhbnNwb3J0IGNoaWxkcmVuLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGludGVycnVwdCgpIHt9CisKKyAgLyoqCisgICAqIFRoaXMgd2lsbCBpbnRlcnJ1cHQgdGhlIGNoaWxkcmVuIGNyZWF0ZWQgYnkgdGhlIHNlcnZlciB0cmFuc3BvcnQuCisgICAqIGFsbG93aW5nIHRoZW0gdG8gYnJlYWsgb3V0IG9mIGFueSBibG9ja2luZyBkYXRhIHJlY2VwdGlvbiBjYWxsLgorICAgKiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBjaGlsZHJlbiB3aWxsIHRocm93IGEgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBJTlRFUlJVUFRFRCBlcnJvciBjb2RlLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGludGVycnVwdENoaWxkcmVuKCkge30KKworICAvKioKKyAgKiBVdGlsaXR5IG1ldGhvZAorICAqCisgICogQHJldHVybiBzZXJ2ZXIgc29ja2V0IGZpbGUgZGVzY3JpcHRvcgorICAqIEB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycworICAqLworCisgIHZpcnR1YWwgVEhSSUZUX1NPQ0tFVCBnZXRTb2NrZXRGRCgpIHsgcmV0dXJuIC0xOyB9CisKKyAgLyoqCisgICAqIENsb3NlcyB0aGlzIHRyYW5zcG9ydCBzdWNoIHRoYXQgZnV0dXJlIGNhbGxzIHRvIGFjY2VwdCB3aWxsIGRvIG5vdGhpbmcuCisgICAqLworICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgVFNlcnZlclRyYW5zcG9ydCgpIHt9CisKKyAgLyoqCisgICAqIFN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uIGZvciBhY2NlcHQuCisgICAqCisgICAqIEByZXR1cm4gQSBuZXdseSBhbGxvY2F0ZWQgVFRyYW5zcG9ydCBvYmplY3QKKyAgICogQHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCkgPSAwOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNob3J0UmVhZFRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExODI1MmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaApAQCAtMCwwICsxLDgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNIT1JUUkVBRFRSQU5TUE9SVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU0hPUlRSRUFEVFJBTlNQT1JUX0hfIDEKKworI2luY2x1ZGUgPGNzdGRsaWI+CisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSB0ZXN0IHsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIG9ubHkgbWVhbnQgZm9yIHRlc3RpbmcuICBJdCB3cmFwcyBhbm90aGVyIHRyYW5zcG9ydC4KKyAqIENhbGxzIHRvIHJlYWQgYXJlIHBhc3NlZCB0aHJvdWdoIHdpdGggc29tZSBwcm9iYWJpbGl0eS4gIE90aGVyd2lzZSwKKyAqIHRoZSByZWFkIGFtb3VudCBpcyByYW5kb21seSByZWR1Y2VkIGJlZm9yZSBiZWluZyBwYXNzZWQgdGhyb3VnaC4KKyAqCisgKi8KK2NsYXNzIFRTaG9ydFJlYWRUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VFNob3J0UmVhZFRyYW5zcG9ydD4geworcHVibGljOgorICBUU2hvcnRSZWFkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIGRvdWJsZSBmdWxsX3Byb2IpCisgICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksIGZ1bGxQcm9iXyhmdWxsX3Byb2IpIHt9CisKKyAgYm9vbCBpc09wZW4oKSB7IHJldHVybiB0cmFuc3BvcnRfLT5pc09wZW4oKTsgfQorCisgIGJvb2wgcGVlaygpIHsgcmV0dXJuIHRyYW5zcG9ydF8tPnBlZWsoKTsgfQorCisgIHZvaWQgb3BlbigpIHsgdHJhbnNwb3J0Xy0+b3BlbigpOyB9CisKKyAgdm9pZCBjbG9zZSgpIHsgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsgfQorCisgIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChyYW5kKCkgLyAoZG91YmxlKVJBTkRfTUFYID49IGZ1bGxQcm9iXykgeworICAgICAgbGVuID0gMSArIHJhbmQoKSAlIGxlbjsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zcG9ydF8tPnJlYWQoYnVmLCBsZW4pOworICB9CisKKyAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyB0cmFuc3BvcnRfLT53cml0ZShidWYsIGxlbik7IH0KKworICB2b2lkIGZsdXNoKCkgeyB0cmFuc3BvcnRfLT5mbHVzaCgpOyB9CisKKyAgY29uc3QgdWludDhfdCogYm9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgeyByZXR1cm4gdHJhbnNwb3J0Xy0+Ym9ycm93KGJ1ZiwgbGVuKTsgfQorCisgIHZvaWQgY29uc3VtZSh1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmNvbnN1bWUobGVuKTsgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgeyByZXR1cm4gdHJhbnNwb3J0XzsgfQorCitwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOworICBkb3VibGUgZnVsbFByb2JfOworfTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6dGVzdAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0hPUlRSRUFEVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMTM5OWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmNwcApAQCAtMCwwICsxLDY3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxpby5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworVFNpbXBsZUZpbGVUcmFuc3BvcnQ6OlRTaW1wbGVGaWxlVHJhbnNwb3J0KGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBib29sIHJlYWQsIGJvb2wgd3JpdGUpCisgIDogVEZEVHJhbnNwb3J0KC0xLCBURkRUcmFuc3BvcnQ6OkNMT1NFX09OX0RFU1RST1kpIHsKKyAgaW50IGZsYWdzID0gMDsKKyAgaWYgKHJlYWQgJiYgd3JpdGUpIHsKKyAgICBmbGFncyA9IE9fUkRXUjsKKyAgfSBlbHNlIGlmIChyZWFkKSB7CisgICAgZmxhZ3MgPSBPX1JET05MWTsKKyAgfSBlbHNlIGlmICh3cml0ZSkgeworICAgIGZsYWdzID0gT19XUk9OTFk7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiTmVpdGhlciBSRUFEIG5vciBXUklURSBzcGVjaWZpZWQiKTsKKyAgfQorICBpZiAod3JpdGUpIHsKKyAgICBmbGFncyB8PSBPX0NSRUFUIHwgT19BUFBFTkQ7CisgIH0KKyNpZm5kZWYgX1dJTjMyCisgIG1vZGVfdCBtb2RlID0gU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USDsKKyNlbHNlCisgIGludCBtb2RlID0gX1NfSVJFQUQgfCBfU19JV1JJVEU7CisjZW5kaWYKKyAgaW50IGZkID0gOjpUSFJJRlRfT1BFTihwYXRoLmNfc3RyKCksIGZsYWdzLCBtb2RlKTsKKyAgaWYgKGZkIDwgMCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oImZhaWxlZCB0byBvcGVuIGZpbGUgZm9yIHdyaXRpbmc6ICIgKyBwYXRoKTsKKyAgfQorICBzZXRGRChmZCk7CisgIG9wZW4oKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZTE4OTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTSU1QTEVGSUxFVFJBTlNQT1JUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTSU1QTEVGSUxFVFJBTlNQT1JUX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBEZWFkLXNpbXBsZSB3cmFwcGVyIGFyb3VuZCBhIGZpbGUuCisgKgorICogV3JpdGVhYmxlIGZpbGVzIGFyZSBvcGVuZWQgd2l0aCBPX0NSRUFUIGFuZCBPX0FQUEVORAorICovCitjbGFzcyBUU2ltcGxlRmlsZVRyYW5zcG9ydCA6IHB1YmxpYyBURkRUcmFuc3BvcnQgeworcHVibGljOgorICBUU2ltcGxlRmlsZVRyYW5zcG9ydChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgYm9vbCByZWFkID0gdHJ1ZSwgYm9vbCB3cml0ZSA9IGZhbHNlKTsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICBfVEhSSUZUX1RSQU5TUE9SVF9UU0lNUExFRklMRVRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZjMmJmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5jcHAKQEAgLTAsMCArMSw5NTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaWZkZWYgSEFWRV9TWVNfSU9DVExfSAorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19VTl9ICisjaW5jbHVkZSA8c3lzL3VuLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19QT0xMX0gKKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKworI2lmbmRlZiBTT0NLT1BUX0NBU1RfVAorI2lmbmRlZiBfV0lOMzIKKyNkZWZpbmUgU09DS09QVF9DQVNUX1Qgdm9pZAorI2Vsc2UKKyNkZWZpbmUgU09DS09QVF9DQVNUX1QgY2hhcgorI2VuZGlmIC8vIF9XSU4zMgorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKiBjb25zdF9jYXN0X3NvY2tvcHQoY29uc3QgVCogdikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTT0NLT1BUX0NBU1RfVCo+KHYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBTT0NLT1BUX0NBU1RfVCogY2FzdF9zb2Nrb3B0KFQqIHYpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U09DS09QVF9DQVNUX1QqPih2KTsKK30KKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBUU29ja2V0IGltcGxlbWVudGF0aW9uLgorICoKKyAqLworCitUU29ja2V0OjpUU29ja2V0KGNvbnN0IHN0cmluZyYgaG9zdCwgaW50IHBvcnQpCisgIDogaG9zdF8oaG9zdCksCisgICAgcG9ydF8ocG9ydCksCisgICAgc29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIHBlZXJQb3J0XygwKSwKKyAgICBjb25uVGltZW91dF8oMCksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaW5nZXJPbl8oMSksCisgICAgbGluZ2VyVmFsXygwKSwKKyAgICBub0RlbGF5XygxKSwKKyAgICBtYXhSZWN2UmV0cmllc18oNSkgeworfQorCitUU29ja2V0OjpUU29ja2V0KGNvbnN0IHN0cmluZyYgcGF0aCkKKyAgOiBwb3J0XygwKSwKKyAgICBwYXRoXyhwYXRoKSwKKyAgICBzb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgcGVlclBvcnRfKDApLAorICAgIGNvbm5UaW1lb3V0XygwKSwKKyAgICBzZW5kVGltZW91dF8oMCksCisgICAgcmVjdlRpbWVvdXRfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpbmdlck9uXygxKSwKKyAgICBsaW5nZXJWYWxfKDApLAorICAgIG5vRGVsYXlfKDEpLAorICAgIG1heFJlY3ZSZXRyaWVzXyg1KSB7CisgIGNhY2hlZFBlZXJBZGRyXy5pcHY0LnNpbl9mYW1pbHkgPSBBRl9VTlNQRUM7Cit9CisKK1RTb2NrZXQ6OlRTb2NrZXQoKQorICA6IHBvcnRfKDApLAorICAgIHNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBwZWVyUG9ydF8oMCksCisgICAgY29ublRpbWVvdXRfKDApLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGluZ2VyT25fKDEpLAorICAgIGxpbmdlclZhbF8oMCksCisgICAgbm9EZWxheV8oMSksCisgICAgbWF4UmVjdlJldHJpZXNfKDUpIHsKKyAgY2FjaGVkUGVlckFkZHJfLmlwdjQuc2luX2ZhbWlseSA9IEFGX1VOU1BFQzsKK30KKworVFNvY2tldDo6VFNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCkKKyAgOiBwb3J0XygwKSwKKyAgICBzb2NrZXRfKHNvY2tldCksCisgICAgcGVlclBvcnRfKDApLAorICAgIGNvbm5UaW1lb3V0XygwKSwKKyAgICBzZW5kVGltZW91dF8oMCksCisgICAgcmVjdlRpbWVvdXRfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpbmdlck9uXygxKSwKKyAgICBsaW5nZXJWYWxfKDApLAorICAgIG5vRGVsYXlfKDEpLAorICAgIG1heFJlY3ZSZXRyaWVzXyg1KSB7CisgIGNhY2hlZFBlZXJBZGRyXy5pcHY0LnNpbl9mYW1pbHkgPSBBRl9VTlNQRUM7CisjaWZkZWYgU09fTk9TSUdQSVBFCisgIHsKKyAgICBpbnQgb25lID0gMTsKKyAgICBzZXRzb2Nrb3B0KHNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX05PU0lHUElQRSwgJm9uZSwgc2l6ZW9mKG9uZSkpOworICB9CisjZW5kaWYKK30KKworVFNvY2tldDo6VFNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKQorICA6IHBvcnRfKDApLAorICAgIHNvY2tldF8oc29ja2V0KSwKKyAgICBwZWVyUG9ydF8oMCksCisgICAgaW50ZXJydXB0TGlzdGVuZXJfKGludGVycnVwdExpc3RlbmVyKSwKKyAgICBjb25uVGltZW91dF8oMCksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaW5nZXJPbl8oMSksCisgICAgbGluZ2VyVmFsXygwKSwKKyAgICBub0RlbGF5XygxKSwKKyAgICBtYXhSZWN2UmV0cmllc18oNSkgeworICBjYWNoZWRQZWVyQWRkcl8uaXB2NC5zaW5fZmFtaWx5ID0gQUZfVU5TUEVDOworI2lmZGVmIFNPX05PU0lHUElQRQorICB7CisgICAgaW50IG9uZSA9IDE7CisgICAgc2V0c29ja29wdChzb2NrZXRfLCBTT0xfU09DS0VULCBTT19OT1NJR1BJUEUsICZvbmUsIHNpemVvZihvbmUpKTsKKyAgfQorI2VuZGlmCit9CisKK1RTb2NrZXQ6On5UU29ja2V0KCkgeworICBjbG9zZSgpOworfQorCitib29sIFRTb2NrZXQ6Omhhc1BlbmRpbmdEYXRhVG9SZWFkKCkgeworICBpZiAoIWlzT3BlbigpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW50MzJfdCByZXRyaWVzID0gMDsKKyAgVEhSSUZUX0lPQ1RMX1NPQ0tFVF9OVU1fQllURVNfVFlQRSBudW1CeXRlc0F2YWlsYWJsZTsKK3RyeV9hZ2FpbjoKKyAgaW50IHIgPSBUSFJJRlRfSU9DVExfU09DS0VUKHNvY2tldF8sIEZJT05SRUFELCAmbnVtQnl0ZXNBdmFpbGFibGUpOworICBpZiAociA9PSAtMSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VJTlRSICYmIChyZXRyaWVzKysgPCBtYXhSZWN2UmV0cmllc18pKSB7CisgICAgICBnb3RvIHRyeV9hZ2FpbjsKKyAgICB9CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6aGFzUGVuZGluZ0RhdGFUb1JlYWQoKSBUSFJJRlRfSU9DVExfU09DS0VUKCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVW5rbm93biIsIGVycm5vX2NvcHkpOworICB9CisgIHJldHVybiBudW1CeXRlc0F2YWlsYWJsZSA+IDA7Cit9CisKK2Jvb2wgVFNvY2tldDo6aXNPcGVuKCkgeworICByZXR1cm4gKHNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKTsKK30KKworYm9vbCBUU29ja2V0OjpwZWVrKCkgeworICBpZiAoIWlzT3BlbigpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChpbnRlcnJ1cHRMaXN0ZW5lcl8pIHsKKyAgICBmb3IgKGludCByZXRyaWVzID0gMDs7KSB7CisgICAgICBzdHJ1Y3QgVEhSSUZUX1BPTExGRCBmZHNbMl07CisgICAgICBzdGQ6Om1lbXNldChmZHMsIDAsIHNpemVvZihmZHMpKTsKKyAgICAgIGZkc1swXS5mZCA9IHNvY2tldF87CisgICAgICBmZHNbMF0uZXZlbnRzID0gVEhSSUZUX1BPTExJTjsKKyAgICAgIGZkc1sxXS5mZCA9ICooaW50ZXJydXB0TGlzdGVuZXJfLmdldCgpKTsKKyAgICAgIGZkc1sxXS5ldmVudHMgPSBUSFJJRlRfUE9MTElOOworICAgICAgaW50IHJldCA9IFRIUklGVF9QT0xMKGZkcywgMiwgKHJlY3ZUaW1lb3V0XyA9PSAwKSA/IC0xIDogcmVjdlRpbWVvdXRfKTsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAvLyBlcnJvciBjYXNlcworICAgICAgICBpZiAoZXJybm9fY29weSA9PSBUSFJJRlRfRUlOVFIgJiYgKHJldHJpZXMrKyA8IG1heFJlY3ZSZXRyaWVzXykpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpwZWVrKCkgVEhSSUZUX1BPTEwoKSAiLCBlcnJub19jb3B5KTsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVW5rbm93biIsIGVycm5vX2NvcHkpOworICAgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CisgICAgICAgIC8vIENoZWNrIHRoZSBpbnRlcnJ1cHRMaXN0ZW5lcgorICAgICAgICBpZiAoZmRzWzFdLnJldmVudHMgJiBUSFJJRlRfUE9MTElOKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIFRoZXJlIG11c3QgYmUgZGF0YSBvciBhIGRpc2Nvbm5lY3Rpb24sIGZhbGwgdGhyb3VnaCB0byB0aGUgUEVFSworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHRpbWVvdXQKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIENoZWNrIHRvIHNlZSBpZiBkYXRhIGlzIGF2YWlsYWJsZSBvciBpZiB0aGUgcmVtb3RlIHNpZGUgY2xvc2VkCisgIHVpbnQ4X3QgYnVmOworICBpbnQgciA9IHN0YXRpY19jYXN0PGludD4ocmVjdihzb2NrZXRfLCBjYXN0X3NvY2tvcHQoJmJ1ZiksIDEsIE1TR19QRUVLKSk7CisgIGlmIChyID09IC0xKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyNpZiBkZWZpbmVkIF9fRnJlZUJTRF9fIHx8IGRlZmluZWQgX19NQUNIX18KKyAgICAvKiBzaGlnaW46CisgICAgICogZnJlZWJzZCByZXR1cm5zIC0xIGFuZCBUSFJJRlRfRUNPTk5SRVNFVCBpZiBzb2NrZXQgd2FzIGNsb3NlZCBieQorICAgICAqIHRoZSBvdGhlciBzaWRlCisgICAgICovCisgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VDT05OUkVTRVQpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisjZW5kaWYKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpwZWVrKCkgcmVjdigpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgInJlY3YoKSIsIGVycm5vX2NvcHkpOworICB9CisgIHJldHVybiAociA+IDApOworfQorCit2b2lkIFRTb2NrZXQ6Om9wZW5Db25uZWN0aW9uKHN0cnVjdCBhZGRyaW5mbyogcmVzKSB7CisKKyAgaWYgKGlzT3BlbigpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisgICAgc29ja2V0XyA9IHNvY2tldChQRl9VTklYLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19JUCk7CisgIH0gZWxzZSB7CisgICAgc29ja2V0XyA9IHNvY2tldChyZXMtPmFpX2ZhbWlseSwgcmVzLT5haV9zb2NrdHlwZSwgcmVzLT5haV9wcm90b2NvbCk7CisgIH0KKworICBpZiAoc29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBzb2NrZXQoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAic29ja2V0KCkiLCBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIFNlbmQgdGltZW91dAorICBpZiAoc2VuZFRpbWVvdXRfID4gMCkgeworICAgIHNldFNlbmRUaW1lb3V0KHNlbmRUaW1lb3V0Xyk7CisgIH0KKworICAvLyBSZWN2IHRpbWVvdXQKKyAgaWYgKHJlY3ZUaW1lb3V0XyA+IDApIHsKKyAgICBzZXRSZWN2VGltZW91dChyZWN2VGltZW91dF8pOworICB9CisKKyAgaWYgKGtlZXBBbGl2ZV8pIHsKKyAgICBzZXRLZWVwQWxpdmUoa2VlcEFsaXZlXyk7CisgIH0KKworICAvLyBMaW5nZXIKKyAgc2V0TGluZ2VyKGxpbmdlck9uXywgbGluZ2VyVmFsXyk7CisKKyAgLy8gTm8gZGVsYXkKKyAgc2V0Tm9EZWxheShub0RlbGF5Xyk7CisKKyNpZmRlZiBTT19OT1NJR1BJUEUKKyAgeworICAgIGludCBvbmUgPSAxOworICAgIHNldHNvY2tvcHQoc29ja2V0XywgU09MX1NPQ0tFVCwgU09fTk9TSUdQSVBFLCAmb25lLCBzaXplb2Yob25lKSk7CisgIH0KKyNlbmRpZgorCisvLyBVc2VzIGEgbG93IG1pbiBSVE8gaWYgYXNrZWQgdG8uCisjaWZkZWYgVENQX0xPV19NSU5fUlRPCisgIGlmIChnZXRVc2VMb3dNaW5SdG8oKSkgeworICAgIGludCBvbmUgPSAxOworICAgIHNldHNvY2tvcHQoc29ja2V0XywgSVBQUk9UT19UQ1AsIFRDUF9MT1dfTUlOX1JUTywgJm9uZSwgc2l6ZW9mKG9uZSkpOworICB9CisjZW5kaWYKKworICAvLyBTZXQgdGhlIHNvY2tldCB0byBiZSBub24gYmxvY2tpbmcgZm9yIGNvbm5lY3QgaWYgYSB0aW1lb3V0IGV4aXN0cworICBpbnQgZmxhZ3MgPSBUSFJJRlRfRkNOVEwoc29ja2V0XywgVEhSSUZUX0ZfR0VURkwsIDApOworICBpZiAoY29ublRpbWVvdXRfID4gMCkgeworICAgIGlmICgtMSA9PSBUSFJJRlRfRkNOVEwoc29ja2V0XywgVEhSSUZUX0ZfU0VURkwsIGZsYWdzIHwgVEhSSUZUX09fTk9OQkxPQ0spKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIFRIUklGVF9GQ05UTCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlRIUklGVF9GQ05UTCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoLTEgPT0gVEhSSUZUX0ZDTlRMKHNvY2tldF8sIFRIUklGVF9GX1NFVEZMLCBmbGFncyAmIH5USFJJRlRfT19OT05CTE9DSykpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgVEhSSUZUX0ZDTlRMICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlRIUklGVF9GQ05UTCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOworICAgIH0KKyAgfQorCisgIC8vIENvbm5lY3QgdGhlIHNvY2tldAorICBpbnQgcmV0OworICBpZiAoIXBhdGhfLmVtcHR5KCkpIHsKKworI2lmbmRlZiBfV0lOMzIKKyAgICBzaXplX3QgbGVuID0gcGF0aF8uc2l6ZSgpICsgMTsKKyAgICBpZiAobGVuID4gc2l6ZW9mKCgoc29ja2FkZHJfdW4qKU5VTEwpLT5zdW5fcGF0aCkpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgVW5peCBEb21haW4gc29ja2V0IHBhdGggdG9vIGxvbmciLCBlcnJub19jb3B5KTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICIgVW5peCBEb21haW4gc29ja2V0IHBhdGggdG9vIGxvbmciKTsKKyAgICB9CisKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcmVzczsKKyAgICBhZGRyZXNzLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICAgIG1lbWNweShhZGRyZXNzLnN1bl9wYXRoLCBwYXRoXy5jX3N0cigpLCBsZW4pOworCisgICAgc29ja2xlbl90IHN0cnVjdGxlbiA9IHN0YXRpY19jYXN0PHNvY2tsZW5fdD4oc2l6ZW9mKGFkZHJlc3MpKTsKKworICAgIGlmICghYWRkcmVzcy5zdW5fcGF0aFswXSkgeyAvLyBhYnN0cmFjdCBuYW1lc3BhY2Ugc29ja2V0CisjaWZkZWYgX19saW51eF9fCisgICAgICAvLyBzdW5fcGF0aCBpcyBub3QgbnVsbC10ZXJtaW5hdGVkIGluIHRoaXMgY2FzZSBhbmQgc3RydWN0bGVuIGRldGVybWluZXMgaXRzIGxlbmd0aAorICAgICAgc3RydWN0bGVuIC09IHNpemVvZihhZGRyZXNzLnN1bl9wYXRoKSAtIGxlbjsKKyNlbHNlCisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgQWJzdHJhY3QgTmFtZXNwYWNlIERvbWFpbiBzb2NrZXRzIG9ubHkgc3VwcG9ydGVkIG9uIGxpbnV4OiAiLCAtOTkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBYnN0cmFjdCBOYW1lc3BhY2UgRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorICAgIH0KKworICAgIHJldCA9IGNvbm5lY3Qoc29ja2V0XywgKHN0cnVjdCBzb2NrYWRkciopJmFkZHJlc3MsIHN0cnVjdGxlbik7CisjZWxzZQorICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBVbml4IERvbWFpbiBzb2NrZXQgcGF0aCBub3Qgc3VwcG9ydGVkIG9uIHdpbmRvd3MiLCAtOTkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorCisgIH0gZWxzZSB7CisgICAgcmV0ID0gY29ubmVjdChzb2NrZXRfLCByZXMtPmFpX2FkZHIsIHN0YXRpY19jYXN0PGludD4ocmVzLT5haV9hZGRybGVuKSk7CisgIH0KKworICAvLyBzdWNjZXNzIGNhc2UKKyAgaWYgKHJldCA9PSAwKSB7CisgICAgZ290byBkb25lOworICB9CisKKyAgaWYgKChUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiAhPSBUSFJJRlRfRUlOUFJPR1JFU1MpCisgICAgICAmJiAoVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgIT0gVEhSSUZUX0VXT1VMREJMT0NLKSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIGNvbm5lY3QoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiY29ubmVjdCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOworICB9CisKKyAgc3RydWN0IFRIUklGVF9QT0xMRkQgZmRzWzFdOworICBzdGQ6Om1lbXNldChmZHMsIDAsIHNpemVvZihmZHMpKTsKKyAgZmRzWzBdLmZkID0gc29ja2V0XzsKKyAgZmRzWzBdLmV2ZW50cyA9IFRIUklGVF9QT0xMT1VUOworICByZXQgPSBUSFJJRlRfUE9MTChmZHMsIDEsIGNvbm5UaW1lb3V0Xyk7CisKKyAgaWYgKHJldCA+IDApIHsKKyAgICAvLyBFbnN1cmUgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgYW5kIHRoYXQgdGhlcmUgYXJlIG5vIGVycm9ycyBzZXQKKyAgICBpbnQgdmFsOworICAgIHNvY2tsZW5fdCBsb247CisgICAgbG9uID0gc2l6ZW9mKGludCk7CisgICAgaW50IHJldDIgPSBnZXRzb2Nrb3B0KHNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCBjYXN0X3NvY2tvcHQoJnZhbCksICZsb24pOworICAgIGlmIChyZXQyID09IC0xKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIGdldHNvY2tvcHQoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJnZXRzb2Nrb3B0KCkiLCBlcnJub19jb3B5KTsKKyAgICB9CisgICAgLy8gbm8gZXJyb3JzIG9uIHNvY2tldCwgZ28gdG8gdG93bgorICAgIGlmICh2YWwgPT0gMCkgeworICAgICAgZ290byBkb25lOworICAgIH0KKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgZXJyb3Igb24gc29ja2V0IChhZnRlciBUSFJJRlRfUE9MTCkgIiArIGdldFNvY2tldEluZm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgInNvY2tldCBvcGVuKCkgZXJyb3IiLCB2YWwpOworICB9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisgICAgLy8gc29ja2V0IHRpbWVkIG91dAorICAgIHN0cmluZyBlcnJTdHIgPSAiVFNvY2tldDo6b3BlbigpIHRpbWVkIG91dCAiICsgZ2V0U29ja2V0SW5mbygpOworICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIm9wZW4oKSB0aW1lZCBvdXQiKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBlcnJvciBvbiBUSFJJRlRfUE9MTCgpCisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgVEhSSUZUX1BPTEwoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVEhSSUZUX1BPTEwoKSBmYWlsZWQiLCBlcnJub19jb3B5KTsKKyAgfQorCitkb25lOgorICAvLyBTZXQgc29ja2V0IGJhY2sgdG8gbm9ybWFsIG1vZGUgKGJsb2NraW5nKQorICBpZiAoLTEgPT0gVEhSSUZUX0ZDTlRMKHNvY2tldF8sIFRIUklGVF9GX1NFVEZMLCBmbGFncykpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBUSFJJRlRfRkNOVEwgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlRIUklGVF9GQ05UTCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOworICB9CisKKyAgaWYgKHBhdGhfLmVtcHR5KCkpIHsKKyAgICBzZXRDYWNoZWRBZGRyZXNzKHJlcy0+YWlfYWRkciwgc3RhdGljX2Nhc3Q8c29ja2xlbl90PihyZXMtPmFpX2FkZHJsZW4pKTsKKyAgfQorfQorCit2b2lkIFRTb2NrZXQ6Om9wZW4oKSB7CisgIGlmIChpc09wZW4oKSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoIXBhdGhfLmVtcHR5KCkpIHsKKyAgICB1bml4X29wZW4oKTsKKyAgfSBlbHNlIHsKKyAgICBsb2NhbF9vcGVuKCk7CisgIH0KK30KKwordm9pZCBUU29ja2V0Ojp1bml4X29wZW4oKSB7CisgIGlmICghcGF0aF8uZW1wdHkoKSkgeworICAgIC8vIFVuaXggRG9tYWluIFNPY2tldCBkb2VzIG5vdCBuZWVkIGFkZHJpbmZvIHN0cnVjdCwgc28gd2UgcGFzcyBOVUxMCisgICAgb3BlbkNvbm5lY3Rpb24oTlVMTCk7CisgIH0KK30KKwordm9pZCBUU29ja2V0Ojpsb2NhbF9vcGVuKCkgeworCisjaWZkZWYgX1dJTjMyCisgIFRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUoKTsKKyNlbmRpZiAvLyBfV0lOMzIKKworICBpZiAoaXNPcGVuKCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBWYWxpZGF0ZSBwb3J0IG51bWJlcgorICBpZiAocG9ydF8gPCAwIHx8IHBvcnRfID4gMHhGRkZGKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywgIlNwZWNpZmllZCBwb3J0IGlzIGludmFsaWQiKTsKKyAgfQorCisgIHN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlcywgKnJlczA7CisgIHJlcyA9IE5VTEw7CisgIHJlczAgPSBOVUxMOworICBpbnQgZXJyb3I7CisgIGNoYXIgcG9ydFtzaXplb2YoIjY1NTM1IildOworICBzdGQ6Om1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICBoaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIGhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRSB8IEFJX0FERFJDT05GSUc7CisgIHNwcmludGYocG9ydCwgIiVkIiwgcG9ydF8pOworCisgIGVycm9yID0gZ2V0YWRkcmluZm8oaG9zdF8uY19zdHIoKSwgcG9ydCwgJmhpbnRzLCAmcmVzMCk7CisKKyNpZmRlZiBfV0lOMzIKKyAgaWYgKGVycm9yID09IFdTQU5PX0RBVEEpIHsKKyAgICBoaW50cy5haV9mbGFncyAmPSB+QUlfQUREUkNPTkZJRzsKKyAgICBlcnJvciA9IGdldGFkZHJpbmZvKGhvc3RfLmNfc3RyKCksIHBvcnQsICZoaW50cywgJnJlczApOworICB9CisjZW5kaWYKKworICBpZiAoZXJyb3IpIHsKKyAgICBzdHJpbmcgZXJyU3RyID0gIlRTb2NrZXQ6Om9wZW4oKSBnZXRhZGRyaW5mbygpICIgKyBnZXRTb2NrZXRJbmZvKCkKKyAgICAgICAgICAgICAgICAgICAgKyBzdHJpbmcoVEhSSUZUX0dBSV9TVFJFUlJPUihlcnJvcikpOworICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCByZXNvbHZlIGhvc3QgZm9yIGNsaWVudCBzb2NrZXQuIik7CisgIH0KKworICAvLyBDeWNsZSB0aHJvdWdoIGFsbCB0aGUgcmV0dXJuZWQgYWRkcmVzc2VzIHVudGlsIG9uZQorICAvLyBjb25uZWN0cyBvciBwdXNoIHRoZSBleGNlcHRpb24gdXAuCisgIGZvciAocmVzID0gcmVzMDsgcmVzOyByZXMgPSByZXMtPmFpX25leHQpIHsKKyAgICB0cnkgeworICAgICAgb3BlbkNvbm5lY3Rpb24ocmVzKTsKKyAgICAgIGJyZWFrOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICBpZiAocmVzLT5haV9uZXh0KSB7CisgICAgICAgIGNsb3NlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjbG9zZSgpOworICAgICAgICBmcmVlYWRkcmluZm8ocmVzMCk7IC8vIGNsZWFudXAgb24gZmFpbHVyZQorICAgICAgICB0aHJvdzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBGcmVlIGFkZHJlc3Mgc3RydWN0dXJlIG1lbW9yeQorICBmcmVlYWRkcmluZm8ocmVzMCk7Cit9CisKK3ZvaWQgVFNvY2tldDo6Y2xvc2UoKSB7CisgIGlmIChzb2NrZXRfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIHNodXRkb3duKHNvY2tldF8sIFRIUklGVF9TSFVUX1JEV1IpOworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKHNvY2tldF8pOworICB9CisgIHNvY2tldF8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7Cit9CisKK3ZvaWQgVFNvY2tldDo6c2V0U29ja2V0RkQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQpIHsKKyAgaWYgKHNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgY2xvc2UoKTsKKyAgfQorICBzb2NrZXRfID0gc29ja2V0OworfQorCit1aW50MzJfdCBUU29ja2V0OjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGlmIChzb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDYWxsZWQgcmVhZCBvbiBub24tb3BlbiBzb2NrZXQiKTsKKyAgfQorCisgIGludDMyX3QgcmV0cmllcyA9IDA7CisKKyAgLy8gVEhSSUZUX0VBR0FJTiBjYW4gYmUgc2lnbmFsbGVkIGJvdGggd2hlbiBhIHRpbWVvdXQgaGFzIG9jY3VycmVkIGFuZCB3aGVuCisgIC8vIHRoZSBzeXN0ZW0gaXMgb3V0IG9mIHJlc291cmNlcyAoYW4gYXdlc29tZSB1bmRvY3VtZW50ZWQgZmVhdHVyZSkuCisgIC8vIFRoZSBmb2xsb3dpbmcgaXMgYW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgdGltZSBpbnRlcnZhbCB1bmRlciB3aGljaAorICAvLyBUSFJJRlRfRUFHQUlOIGlzIHRha2VuIHRvIGluZGljYXRlIGFuIG91dCBvZiByZXNvdXJjZXMgZXJyb3IuCisgIHVpbnQzMl90IGVhZ2FpblRocmVzaG9sZE1pY3JvcyA9IDA7CisgIGlmIChyZWN2VGltZW91dF8pIHsKKyAgICAvLyBpZiBhIHJlYWRUaW1lb3V0IGlzIHNwZWNpZmllZCBhbG9uZyB3aXRoIGEgbWF4IG51bWJlciBvZiByZWN2IHJldHJpZXMsIHRoZW4KKyAgICAvLyB0aGUgdGhyZXNob2xkIHdpbGwgZW5zdXJlIHRoYXQgdGhlIHJlYWQgdGltZW91dCBpcyBub3QgZXhjZWVkZWQgZXZlbiBpbiB0aGUKKyAgICAvLyBjYXNlIG9mIHJlc291cmNlIGVycm9ycworICAgIGVhZ2FpblRocmVzaG9sZE1pY3JvcyA9IChyZWN2VGltZW91dF8gKiAxMDAwKSAvICgobWF4UmVjdlJldHJpZXNfID4gMCkgPyBtYXhSZWN2UmV0cmllc18gOiAyKTsKKyAgfQorCit0cnlfYWdhaW46CisgIC8vIFJlYWQgZnJvbSB0aGUgc29ja2V0CisgIHN0cnVjdCB0aW1ldmFsIGJlZ2luOworICBpZiAocmVjdlRpbWVvdXRfID4gMCkgeworICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJmJlZ2luLCBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBpZiB0aGVyZSBpcyBubyByZWFkIHRpbWVvdXQgd2UgZG9uJ3QgbmVlZCB0aGUgVE9EIHRvIGRldGVybWluZSB3aGV0aGVyCisgICAgLy8gYW4gVEhSSUZUX0VBR0FJTiBpcyBkdWUgdG8gYSB0aW1lb3V0IG9yIGFuIG91dC1vZi1yZXNvdXJjZSBjb25kaXRpb24uCisgICAgYmVnaW4udHZfc2VjID0gYmVnaW4udHZfdXNlYyA9IDA7CisgIH0KKworICBpbnQgZ290ID0gMDsKKworICBpZiAoaW50ZXJydXB0TGlzdGVuZXJfKSB7CisgICAgc3RydWN0IFRIUklGVF9QT0xMRkQgZmRzWzJdOworICAgIHN0ZDo6bWVtc2V0KGZkcywgMCwgc2l6ZW9mKGZkcykpOworICAgIGZkc1swXS5mZCA9IHNvY2tldF87CisgICAgZmRzWzBdLmV2ZW50cyA9IFRIUklGVF9QT0xMSU47CisgICAgZmRzWzFdLmZkID0gKihpbnRlcnJ1cHRMaXN0ZW5lcl8uZ2V0KCkpOworICAgIGZkc1sxXS5ldmVudHMgPSBUSFJJRlRfUE9MTElOOworCisgICAgaW50IHJldCA9IFRIUklGVF9QT0xMKGZkcywgMiwgKHJlY3ZUaW1lb3V0XyA9PSAwKSA/IC0xIDogcmVjdlRpbWVvdXRfKTsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAvLyBlcnJvciBjYXNlcworICAgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VJTlRSICYmIChyZXRyaWVzKysgPCBtYXhSZWN2UmV0cmllc18pKSB7CisgICAgICAgIGdvdG8gdHJ5X2FnYWluOworICAgICAgfQorICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6cmVhZCgpIFRIUklGVF9QT0xMKCkgIiwgZXJybm9fY29weSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJVbmtub3duIiwgZXJybm9fY29weSk7CisgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CisgICAgICAvLyBDaGVjayB0aGUgaW50ZXJydXB0TGlzdGVuZXIKKyAgICAgIGlmIChmZHNbMV0ucmV2ZW50cyAmIFRIUklGVF9QT0xMSU4pIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCwgIkludGVycnVwdGVkIik7CisgICAgICB9CisgICAgfSBlbHNlIC8qIHJldCA9PSAwICovIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULCAiVEhSSUZUX0VBR0FJTiAodGltZWQgb3V0KSIpOworICAgIH0KKworICAgIC8vIGZhbGxpbmcgdGhyb3VnaCBtZWFucyB0aGVyZSBpcyBzb21ldGhpbmcgdG8gcmVjdiBhbmQgaXQgY2Fubm90IGJsb2NrCisgIH0KKworICBnb3QgPSBzdGF0aWNfY2FzdDxpbnQ+KHJlY3Yoc29ja2V0XywgY2FzdF9zb2Nrb3B0KGJ1ZiksIGxlbiwgMCkpOworICAvLyBUSFJJRlRfR0VUVElNRU9GREFZIGNhbiBjaGFuZ2UgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IKKyAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKworICAvLyBDaGVjayBmb3IgZXJyb3Igb24gcmVhZAorICBpZiAoZ290IDwgMCkgeworICAgIGlmIChlcnJub19jb3B5ID09IFRIUklGVF9FQUdBSU4pIHsKKyAgICAgIC8vIGlmIG5vIHRpbWVvdXQgd2UgY2FuIGFzc3VtZSB0aGF0IHJlc291cmNlIGV4aGF1c3Rpb24gaGFzIG9jY3VycmVkLgorICAgICAgaWYgKHJlY3ZUaW1lb3V0XyA9PSAwKSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfRUFHQUlOICh1bmF2YWlsYWJsZSByZXNvdXJjZXMpIik7CisgICAgICB9CisgICAgICAvLyBjaGVjayBpZiB0aGlzIGlzIHRoZSBsYWNrIG9mIHJlc291cmNlcyBvciB0aW1lb3V0IGNhc2UKKyAgICAgIHN0cnVjdCB0aW1ldmFsIGVuZDsKKyAgICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJmVuZCwgTlVMTCk7CisgICAgICB1aW50MzJfdCByZWFkRWxhcHNlZE1pY3JvcyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigoKGVuZC50dl9zZWMgLSBiZWdpbi50dl9zZWMpICogMTAwMCAqIDEwMDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChlbmQudHZfdXNlYyAtIGJlZ2luLnR2X3VzZWMpKTsKKworICAgICAgaWYgKCFlYWdhaW5UaHJlc2hvbGRNaWNyb3MgfHwgKHJlYWRFbGFwc2VkTWljcm9zIDwgZWFnYWluVGhyZXNob2xkTWljcm9zKSkgeworICAgICAgICBpZiAocmV0cmllcysrIDwgbWF4UmVjdlJldHJpZXNfKSB7CisgICAgICAgICAgVEhSSUZUX1NMRUVQX1VTRUMoNTApOworICAgICAgICAgIGdvdG8gdHJ5X2FnYWluOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9FQUdBSU4gKHVuYXZhaWxhYmxlIHJlc291cmNlcykiKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gaW5mZXIgdGhhdCB0aW1lb3V0IGhhcyBiZWVuIGhpdAorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwgIlRIUklGVF9FQUdBSU4gKHRpbWVkIG91dCkiKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiBpbnRlcnJ1cHRlZCwgdHJ5IGFnYWluCisgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VJTlRSICYmIHJldHJpZXMrKyA8IG1heFJlY3ZSZXRyaWVzXykgeworICAgICAgZ290byB0cnlfYWdhaW47CisgICAgfQorCisgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VDT05OUkVTRVQpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIFRoaXMgaXNoIGlzbid0IG9wZW4KKyAgICBpZiAoZXJybm9fY29weSA9PSBUSFJJRlRfRU5PVENPTk4pIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJUSFJJRlRfRU5PVENPTk4iKTsKKyAgICB9CisKKyAgICAvLyBUaW1lZCBvdXQhCisgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VUSU1FRE9VVCkgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQsICJUSFJJRlRfRVRJTUVET1VUIik7CisgICAgfQorCisgICAgLy8gTm93IGl0J3Mgbm90IGEgdHJ5IGFnYWluIGNhc2UsIGJ1dCBhIHJlYWwgcHJvYmJsZXoKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpyZWFkKCkgcmVjdigpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworCisgICAgLy8gU29tZSBvdGhlciBlcnJvciwgd2hhdGV2egorICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlVua25vd24iLCBlcnJub19jb3B5KTsKKyAgfQorCisgIHJldHVybiBnb3Q7Cit9CisKK3ZvaWQgVFNvY2tldDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgdWludDMyX3Qgc2VudCA9IDA7CisKKyAgd2hpbGUgKHNlbnQgPCBsZW4pIHsKKyAgICB1aW50MzJfdCBiID0gd3JpdGVfcGFydGlhbChidWYgKyBzZW50LCBsZW4gLSBzZW50KTsKKyAgICBpZiAoYiA9PSAwKSB7CisgICAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB0aGUgdGltZW91dCBzZXQgd2l0aCBTT19TTkRUSU1FTyBleHBpcmVkLgorICAgICAgLy8gUmFpc2UgYW4gZXhjZXB0aW9uLgorICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQsICJzZW5kIHRpbWVvdXQgZXhwaXJlZCIpOworICAgIH0KKyAgICBzZW50ICs9IGI7CisgIH0KK30KKwordWludDMyX3QgVFNvY2tldDo6d3JpdGVfcGFydGlhbChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBpZiAoc29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ2FsbGVkIHdyaXRlIG9uIG5vbi1vcGVuIHNvY2tldCIpOworICB9CisKKyAgdWludDMyX3Qgc2VudCA9IDA7CisKKyAgaW50IGZsYWdzID0gMDsKKyNpZmRlZiBNU0dfTk9TSUdOQUwKKyAgLy8gTm90ZSB0aGUgdXNlIG9mIE1TR19OT1NJR05BTCB0byBzdXBwcmVzcyBTSUdQSVBFIGVycm9ycywgaW5zdGVhZCB3ZQorICAvLyBjaGVjayBmb3IgdGhlIFRIUklGVF9FUElQRSByZXR1cm4gY29uZGl0aW9uIGFuZCBjbG9zZSB0aGUgc29ja2V0IGluIHRoYXQgY2FzZQorICBmbGFncyB8PSBNU0dfTk9TSUdOQUw7CisjZW5kaWYgLy8gaWZkZWYgTVNHX05PU0lHTkFMCisKKyAgaW50IGIgPSBzdGF0aWNfY2FzdDxpbnQ+KHNlbmQoc29ja2V0XywgY29uc3RfY2FzdF9zb2Nrb3B0KGJ1ZiArIHNlbnQpLCBsZW4gLSBzZW50LCBmbGFncykpOworCisgIGlmIChiIDwgMCkgeworICAgIGlmIChUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiA9PSBUSFJJRlRfRVdPVUxEQkxPQ0sgfHwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgPT0gVEhSSUZUX0VBR0FJTikgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIEZhaWwgb24gYSBzZW5kIGVycm9yCisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0Ojp3cml0ZV9wYXJ0aWFsKCkgc2VuZCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworCisgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VQSVBFIHx8IGVycm5vX2NvcHkgPT0gVEhSSUZUX0VDT05OUkVTRVQKKyAgICAgICAgfHwgZXJybm9fY29weSA9PSBUSFJJRlRfRU5PVENPTk4pIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJ3cml0ZSgpIHNlbmQoKSIsIGVycm5vX2NvcHkpOworICAgIH0KKworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIndyaXRlKCkgc2VuZCgpIiwgZXJybm9fY29weSk7CisgIH0KKworICAvLyBGYWlsIG9uIGJsb2NrZWQgc2VuZAorICBpZiAoYiA9PSAwKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlNvY2tldCBzZW5kIHJldHVybmVkIDAuIik7CisgIH0KKyAgcmV0dXJuIGI7Cit9CisKK3N0ZDo6c3RyaW5nIFRTb2NrZXQ6OmdldEhvc3QoKSB7CisgIHJldHVybiBob3N0XzsKK30KKworaW50IFRTb2NrZXQ6OmdldFBvcnQoKSB7CisgIHJldHVybiBwb3J0XzsKK30KKwordm9pZCBUU29ja2V0OjpzZXRIb3N0KHN0cmluZyBob3N0KSB7CisgIGhvc3RfID0gaG9zdDsKK30KKwordm9pZCBUU29ja2V0OjpzZXRQb3J0KGludCBwb3J0KSB7CisgIHBvcnRfID0gcG9ydDsKK30KKwordm9pZCBUU29ja2V0OjpzZXRMaW5nZXIoYm9vbCBvbiwgaW50IGxpbmdlcikgeworICBsaW5nZXJPbl8gPSBvbjsKKyAgbGluZ2VyVmFsXyA9IGxpbmdlcjsKKyAgaWYgKHNvY2tldF8gPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgcmV0dXJuOworICB9CisKKyNpZm5kZWYgX1dJTjMyCisgIHN0cnVjdCBsaW5nZXIgbCA9IHsobGluZ2VyT25fID8gMSA6IDApLCBsaW5nZXJWYWxffTsKKyNlbHNlCisgIHN0cnVjdCBsaW5nZXIgbCA9IHtzdGF0aWNfY2FzdDx1X3Nob3J0PihsaW5nZXJPbl8gPyAxIDogMCksIHN0YXRpY19jYXN0PHVfc2hvcnQ+KGxpbmdlclZhbF8pfTsKKyNlbmRpZgorCisgIGludCByZXQgPSBzZXRzb2Nrb3B0KHNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgY2FzdF9zb2Nrb3B0KCZsKSwgc2l6ZW9mKGwpKTsKKyAgaWYgKHJldCA9PSAtMSkgeworICAgIGludCBlcnJub19jb3B5CisgICAgICAgID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7IC8vIENvcHkgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgYmVjYXVzZSB3ZSdyZSBhbGxvY2F0aW5nIG1lbW9yeS4KKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpzZXRMaW5nZXIoKSBzZXRzb2Nrb3B0KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisgIH0KK30KKwordm9pZCBUU29ja2V0OjpzZXROb0RlbGF5KGJvb2wgbm9EZWxheSkgeworICBub0RlbGF5XyA9IG5vRGVsYXk7CisgIGlmIChzb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCB8fCAhcGF0aF8uZW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFNldCBzb2NrZXQgdG8gTk9ERUxBWQorICBpbnQgdiA9IG5vRGVsYXlfID8gMSA6IDA7CisgIGludCByZXQgPSBzZXRzb2Nrb3B0KHNvY2tldF8sIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgY2FzdF9zb2Nrb3B0KCZ2KSwgc2l6ZW9mKHYpKTsKKyAgaWYgKHJldCA9PSAtMSkgeworICAgIGludCBlcnJub19jb3B5CisgICAgICAgID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7IC8vIENvcHkgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgYmVjYXVzZSB3ZSdyZSBhbGxvY2F0aW5nIG1lbW9yeS4KKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpzZXROb0RlbGF5KCkgc2V0c29ja29wdCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICB9Cit9CisKK3ZvaWQgVFNvY2tldDo6c2V0Q29ublRpbWVvdXQoaW50IG1zKSB7CisgIGNvbm5UaW1lb3V0XyA9IG1zOworfQorCit2b2lkIHNldEdlbmVyaWNUaW1lb3V0KFRIUklGVF9TT0NLRVQgcywgaW50IHRpbWVvdXRfbXMsIGludCBvcHRuYW1lKSB7CisgIGlmICh0aW1lb3V0X21zIDwgMCkgeworICAgIGNoYXIgZXJyQnVmWzUxMl07CisgICAgc3ByaW50ZihlcnJCdWYsICJUU29ja2V0OjpzZXRHZW5lcmljVGltZW91dCB3aXRoIG5lZ2F0aXZlIGlucHV0OiAlZFxuIiwgdGltZW91dF9tcyk7CisgICAgR2xvYmFsT3V0cHV0KGVyckJ1Zik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHMgPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgcmV0dXJuOworICB9CisKKyNpZmRlZiBfV0lOMzIKKyAgRFdPUkQgcGxhdGZvcm1fdGltZSA9IHN0YXRpY19jYXN0PERXT1JEPih0aW1lb3V0X21zKTsKKyNlbHNlCisgIHN0cnVjdCB0aW1ldmFsIHBsYXRmb3JtX3RpbWUgPSB7KGludCkodGltZW91dF9tcyAvIDEwMDApLCAoaW50KSgodGltZW91dF9tcyAlIDEwMDApICogMTAwMCl9OworI2VuZGlmCisKKyAgaW50IHJldCA9IHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgb3B0bmFtZSwgY2FzdF9zb2Nrb3B0KCZwbGF0Zm9ybV90aW1lKSwgc2l6ZW9mKHBsYXRmb3JtX3RpbWUpKTsKKyAgaWYgKHJldCA9PSAtMSkgeworICAgIGludCBlcnJub19jb3B5CisgICAgICAgID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7IC8vIENvcHkgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgYmVjYXVzZSB3ZSdyZSBhbGxvY2F0aW5nIG1lbW9yeS4KKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpzZXRHZW5lcmljVGltZW91dCgpIHNldHNvY2tvcHQoKSAiLCBlcnJub19jb3B5KTsKKyAgfQorfQorCit2b2lkIFRTb2NrZXQ6OnNldFJlY3ZUaW1lb3V0KGludCBtcykgeworICBzZXRHZW5lcmljVGltZW91dChzb2NrZXRfLCBtcywgU09fUkNWVElNRU8pOworICByZWN2VGltZW91dF8gPSBtczsKK30KKwordm9pZCBUU29ja2V0OjpzZXRTZW5kVGltZW91dChpbnQgbXMpIHsKKyAgc2V0R2VuZXJpY1RpbWVvdXQoc29ja2V0XywgbXMsIFNPX1NORFRJTUVPKTsKKyAgc2VuZFRpbWVvdXRfID0gbXM7Cit9CisKK3ZvaWQgVFNvY2tldDo6c2V0S2VlcEFsaXZlKGJvb2wga2VlcEFsaXZlKSB7CisgIGtlZXBBbGl2ZV8gPSBrZWVwQWxpdmU7CisKKyAgaWYgKHNvY2tldF8gPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaW50IHZhbHVlID0ga2VlcEFsaXZlXzsKKyAgaW50IHJldAorICAgICAgPSBzZXRzb2Nrb3B0KHNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgY29uc3RfY2FzdF9zb2Nrb3B0KCZ2YWx1ZSksIHNpemVvZih2YWx1ZSkpOworCisgIGlmIChyZXQgPT0gLTEpIHsKKyAgICBpbnQgZXJybm9fY29weQorICAgICAgICA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOyAvLyBDb3B5IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SIGJlY2F1c2Ugd2UncmUgYWxsb2NhdGluZyBtZW1vcnkuCisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6c2V0S2VlcEFsaXZlKCkgc2V0c29ja29wdCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICB9Cit9CisKK3ZvaWQgVFNvY2tldDo6c2V0TWF4UmVjdlJldHJpZXMoaW50IG1heFJlY3ZSZXRyaWVzKSB7CisgIG1heFJlY3ZSZXRyaWVzXyA9IG1heFJlY3ZSZXRyaWVzOworfQorCitzdHJpbmcgVFNvY2tldDo6Z2V0U29ja2V0SW5mbygpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgaWYgKHBhdGhfLmVtcHR5KCkpIHsKKyAgICBpZiAoaG9zdF8uZW1wdHkoKSB8fCBwb3J0XyA9PSAwKSB7CisgICAgICBvc3MgPDwgIjxIb3N0OiAiIDw8IGdldFBlZXJBZGRyZXNzKCk7CisgICAgICBvc3MgPDwgIiBQb3J0OiAiIDw8IGdldFBlZXJQb3J0KCkgPDwgIj4iOworICAgIH0gZWxzZSB7CisgICAgICBvc3MgPDwgIjxIb3N0OiAiIDw8IGhvc3RfIDw8ICIgUG9ydDogIiA8PCBwb3J0XyA8PCAiPiI7CisgICAgfQorICB9IGVsc2UgeworICAgIG9zcyA8PCAiPFBhdGg6ICIgPDwgcGF0aF8gPDwgIj4iOworICB9CisgIHJldHVybiBvc3Muc3RyKCk7Cit9CisKK3N0ZDo6c3RyaW5nIFRTb2NrZXQ6OmdldFBlZXJIb3N0KCkgeworICBpZiAocGVlckhvc3RfLmVtcHR5KCkgJiYgcGF0aF8uZW1wdHkoKSkgeworICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7CisgICAgc3RydWN0IHNvY2thZGRyKiBhZGRyUHRyOworICAgIHNvY2tsZW5fdCBhZGRyTGVuOworCisgICAgaWYgKHNvY2tldF8gPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgICByZXR1cm4gaG9zdF87CisgICAgfQorCisgICAgYWRkclB0ciA9IGdldENhY2hlZEFkZHJlc3MoJmFkZHJMZW4pOworCisgICAgaWYgKGFkZHJQdHIgPT0gTlVMTCkgeworICAgICAgYWRkckxlbiA9IHNpemVvZihhZGRyKTsKKyAgICAgIGlmIChnZXRwZWVybmFtZShzb2NrZXRfLCAoc29ja2FkZHIqKSZhZGRyLCAmYWRkckxlbikgIT0gMCkgeworICAgICAgICByZXR1cm4gcGVlckhvc3RfOworICAgICAgfQorICAgICAgYWRkclB0ciA9IChzb2NrYWRkciopJmFkZHI7CisKKyAgICAgIHNldENhY2hlZEFkZHJlc3MoYWRkclB0ciwgYWRkckxlbik7CisgICAgfQorCisgICAgY2hhciBjbGllbnRob3N0W05JX01BWEhPU1RdOworICAgIGNoYXIgY2xpZW50c2VydmljZVtOSV9NQVhTRVJWXTsKKworICAgIGdldG5hbWVpbmZvKChzb2NrYWRkciopYWRkclB0ciwKKyAgICAgICAgICAgICAgICBhZGRyTGVuLAorICAgICAgICAgICAgICAgIGNsaWVudGhvc3QsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGNsaWVudGhvc3QpLAorICAgICAgICAgICAgICAgIGNsaWVudHNlcnZpY2UsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGNsaWVudHNlcnZpY2UpLAorICAgICAgICAgICAgICAgIDApOworCisgICAgcGVlckhvc3RfID0gY2xpZW50aG9zdDsKKyAgfQorICByZXR1cm4gcGVlckhvc3RfOworfQorCitzdGQ6OnN0cmluZyBUU29ja2V0OjpnZXRQZWVyQWRkcmVzcygpIHsKKyAgaWYgKHBlZXJBZGRyZXNzXy5lbXB0eSgpICYmIHBhdGhfLmVtcHR5KCkpIHsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyOworICAgIHN0cnVjdCBzb2NrYWRkciogYWRkclB0cjsKKyAgICBzb2NrbGVuX3QgYWRkckxlbjsKKworICAgIGlmIChzb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgICAgcmV0dXJuIHBlZXJBZGRyZXNzXzsKKyAgICB9CisKKyAgICBhZGRyUHRyID0gZ2V0Q2FjaGVkQWRkcmVzcygmYWRkckxlbik7CisKKyAgICBpZiAoYWRkclB0ciA9PSBOVUxMKSB7CisgICAgICBhZGRyTGVuID0gc2l6ZW9mKGFkZHIpOworICAgICAgaWYgKGdldHBlZXJuYW1lKHNvY2tldF8sIChzb2NrYWRkciopJmFkZHIsICZhZGRyTGVuKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBwZWVyQWRkcmVzc187CisgICAgICB9CisgICAgICBhZGRyUHRyID0gKHNvY2thZGRyKikmYWRkcjsKKworICAgICAgc2V0Q2FjaGVkQWRkcmVzcyhhZGRyUHRyLCBhZGRyTGVuKTsKKyAgICB9CisKKyAgICBjaGFyIGNsaWVudGhvc3RbTklfTUFYSE9TVF07CisgICAgY2hhciBjbGllbnRzZXJ2aWNlW05JX01BWFNFUlZdOworCisgICAgZ2V0bmFtZWluZm8oYWRkclB0ciwKKyAgICAgICAgICAgICAgICBhZGRyTGVuLAorICAgICAgICAgICAgICAgIGNsaWVudGhvc3QsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGNsaWVudGhvc3QpLAorICAgICAgICAgICAgICAgIGNsaWVudHNlcnZpY2UsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGNsaWVudHNlcnZpY2UpLAorICAgICAgICAgICAgICAgIE5JX05VTUVSSUNIT1NUIHwgTklfTlVNRVJJQ1NFUlYpOworCisgICAgcGVlckFkZHJlc3NfID0gY2xpZW50aG9zdDsKKyAgICBwZWVyUG9ydF8gPSBzdGQ6OmF0b2koY2xpZW50c2VydmljZSk7CisgIH0KKyAgcmV0dXJuIHBlZXJBZGRyZXNzXzsKK30KKworaW50IFRTb2NrZXQ6OmdldFBlZXJQb3J0KCkgeworICBnZXRQZWVyQWRkcmVzcygpOworICByZXR1cm4gcGVlclBvcnRfOworfQorCit2b2lkIFRTb2NrZXQ6OnNldENhY2hlZEFkZHJlc3MoY29uc3Qgc29ja2FkZHIqIGFkZHIsIHNvY2tsZW5fdCBsZW4pIHsKKyAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3dpdGNoIChhZGRyLT5zYV9mYW1pbHkpIHsKKyAgY2FzZSBBRl9JTkVUOgorICAgIGlmIChsZW4gPT0gc2l6ZW9mKHNvY2thZGRyX2luKSkgeworICAgICAgbWVtY3B5KCh2b2lkKikmY2FjaGVkUGVlckFkZHJfLmlwdjQsICh2b2lkKilhZGRyLCBsZW4pOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIEFGX0lORVQ2OgorICAgIGlmIChsZW4gPT0gc2l6ZW9mKHNvY2thZGRyX2luNikpIHsKKyAgICAgIG1lbWNweSgodm9pZCopJmNhY2hlZFBlZXJBZGRyXy5pcHY2LCAodm9pZCopYWRkciwgbGVuKTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcGVlckFkZHJlc3NfLmNsZWFyKCk7CisgIHBlZXJIb3N0Xy5jbGVhcigpOworfQorCitzb2NrYWRkciogVFNvY2tldDo6Z2V0Q2FjaGVkQWRkcmVzcyhzb2NrbGVuX3QqIGxlbikgY29uc3QgeworICBzd2l0Y2ggKGNhY2hlZFBlZXJBZGRyXy5pcHY0LnNpbl9mYW1pbHkpIHsKKyAgY2FzZSBBRl9JTkVUOgorICAgICpsZW4gPSBzaXplb2Yoc29ja2FkZHJfaW4pOworICAgIHJldHVybiAoc29ja2FkZHIqKSZjYWNoZWRQZWVyQWRkcl8uaXB2NDsKKworICBjYXNlIEFGX0lORVQ2OgorICAgICpsZW4gPSBzaXplb2Yoc29ja2FkZHJfaW42KTsKKyAgICByZXR1cm4gKHNvY2thZGRyKikmY2FjaGVkUGVlckFkZHJfLmlwdjY7CisKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitib29sIFRTb2NrZXQ6OnVzZUxvd01pblJ0b18gPSBmYWxzZTsKK3ZvaWQgVFNvY2tldDo6c2V0VXNlTG93TWluUnRvKGJvb2wgdXNlTG93TWluUnRvKSB7CisgIHVzZUxvd01pblJ0b18gPSB1c2VMb3dNaW5SdG87Cit9Citib29sIFRTb2NrZXQ6OmdldFVzZUxvd01pblJ0bygpIHsKKyAgcmV0dXJuIHVzZUxvd01pblJ0b187Cit9CisKK2NvbnN0IHN0ZDo6c3RyaW5nIFRTb2NrZXQ6OmdldE9yaWdpbigpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgb3NzIDw8IGdldFBlZXJIb3N0KCkgPDwgIjoiIDw8IGdldFBlZXJQb3J0KCk7CisgIHJldHVybiBvc3Muc3RyKCk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAzMGQ0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oCkBAIC0wLDAgKzEsMzUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNPQ0tFVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU09DS0VUX0hfIDEKKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisKKyNpZmRlZiBIQVZFX0FSUEFfSU5FVF9ICisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19USU1FX0gKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9ORVREQl9ICisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogVENQIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCisgKgorICovCitjbGFzcyBUU29ja2V0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRTb2NrZXQ+IHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgc29ja2V0LiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBhY3R1YWxseSBjb25uZWN0IHRoZQorICAgKiBzb2NrZXQuCisgICAqCisgICAqLworICBUU29ja2V0KCk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgc29ja2V0LiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBhY3R1YWxseSBjb25uZWN0IHRoZQorICAgKiBzb2NrZXQuCisgICAqCisgICAqIEBwYXJhbSBob3N0IEFuIElQIGFkZHJlc3Mgb3IgaG9zdG5hbWUgdG8gY29ubmVjdCB0bworICAgKiBAcGFyYW0gcG9ydCBUaGUgcG9ydCB0byBjb25uZWN0IG9uCisgICAqLworICBUU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBpbnQgcG9ydCk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgVW5peCBkb21haW4gc29ja2V0LgorICAgKiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBhY3R1YWxseSBjb25uZWN0IHRoZSBzb2NrZXQuCisgICAqCisgICAqIEBwYXJhbSBwYXRoIFRoZSBVbml4IGRvbWFpbiBzb2NrZXQgZS5nLiAiL3RtcC9UaHJpZnRUZXN0LmJpbmFyeS50aHJpZnQiCisgICAqLworICBUU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKKworICAvKioKKyAgICogRGVzdHJveWVzIHRoZSBzb2NrZXQgb2JqZWN0LCBjbG9zaW5nIGl0IGlmIG5lY2Vzc2FyeS4KKyAgICovCisgIHZpcnR1YWwgflRTb2NrZXQoKTsKKworICAvKioKKyAgICogV2hldGhlciB0aGUgc29ja2V0IGlzIGFsaXZlLgorICAgKgorICAgKiBAcmV0dXJuIElzIHRoZSBzb2NrZXQgYWxpdmU/CisgICAqLworICB2aXJ0dWFsIGJvb2wgaXNPcGVuKCk7CisKKyAgLyoqCisgICAqIENoZWNrcyB3aGV0aGVyIHRoZXJlIGlzIG1vcmUgZGF0YSBhdmFpbGFibGUgaW4gdGhlIHNvY2tldCB0byByZWFkLgorICAgKgorICAgKiBUaGlzIGNhbGwgYmxvY2tzIHVudGlsIGF0IGxlYXN0IG9uZSBieXRlIGlzIGF2YWlsYWJsZSBvciB0aGUgc29ja2V0IGlzIGNsb3NlZC4KKyAgICovCisgIHZpcnR1YWwgYm9vbCBwZWVrKCk7CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBVTklYIHNvY2tldC4KKyAgICoKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIElmIHRoZSBzb2NrZXQgY291bGQgbm90IGNvbm5lY3QKKyAgICovCisgIHZpcnR1YWwgdm9pZCBvcGVuKCk7CisKKyAgLyoqCisgICAqIFNodXRzIGRvd24gY29tbXVuaWNhdGlvbnMgb24gdGhlIHNvY2tldC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBjbG9zZSgpOworCisgIC8qKgorICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlcmUgaXMgcGVuZGluZyBkYXRhIHRvIHJlYWQgb3Igbm90LgorICAgKgorICAgKiBUaGlzIGNhbGwgZG9lcyBub3QgYmxvY2suCisgICAqIFx0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBvZiB0eXBlczoKKyAgICogICAgICAgICAgIE5PVF9PUEVOIG1lYW5zIHRoZSBzb2NrZXQgaGFzIGJlZW4gY2xvc2VkCisgICAqICAgICAgICAgICBVTktOT1dOIG1lYW5zIHNvbWV0aGluZyB1bmV4cGVjdGVkIGhhcHBlbmVkCisgICAqIFxyZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgcGVuZGluZyBkYXRhIHRvIHJlYWQsIGZhbHNlIG90aGVyd2lzZQorICAgKi8KKyAgdmlydHVhbCBib29sIGhhc1BlbmRpbmdEYXRhVG9SZWFkKCk7CisKKyAgLyoqCisgICAqIFJlYWRzIGZyb20gdGhlIHVuZGVybHlpbmcgc29ja2V0LgorICAgKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgMCBpbmRpY2F0ZXMgRU9GCisgICAqIFx0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBvZiB0eXBlczoKKyAgICogICAgICAgICAgIElOVEVSUlVQVEVEIG1lYW5zIHRoZSBzb2NrZXQgd2FzIGludGVycnVwdGVkCisgICAqICAgICAgICAgICAgICAgICAgICAgICBvdXQgb2YgYSBibG9ja2luZyBjYWxsCisgICAqICAgICAgICAgICBOT1RfT1BFTiBtZWFucyB0aGUgc29ja2V0IGhhcyBiZWVuIGNsb3NlZAorICAgKiAgICAgICAgICAgVElNRURfT1VUIG1lYW5zIHRoZSByZWNlaXZlIHRpbWVvdXQgZXhwaXJlZAorICAgKiAgICAgICAgICAgVU5LTk9XTiBtZWFucyBzb21ldGhpbmcgdW5leHBlY3RlZCBoYXBwZW5lZAorICAgKi8KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICAvKioKKyAgICogV3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4gIExvb3BzIHVudGlsIGRvbmUgb3IgZmFpbC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgLyoqCisgICAqIFdyaXRlcyB0byB0aGUgdW5kZXJseWluZyBzb2NrZXQuICBEb2VzIHNpbmdsZSBzZW5kKCkgYW5kIHJldHVybnMgcmVzdWx0LgorICAgKi8KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZV9wYXJ0aWFsKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICAvKioKKyAgICogR2V0IHRoZSBob3N0IHRoYXQgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KKyAgICoKKyAgICogQHJldHVybiBzdHJpbmcgaG9zdCBpZGVudGlmaWVyCisgICAqLworICBzdGQ6OnN0cmluZyBnZXRIb3N0KCk7CisKKyAgLyoqCisgICAqIEdldCB0aGUgcG9ydCB0aGF0IHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCisgICAqCisgICAqIEByZXR1cm4gaW50IHBvcnQgbnVtYmVyCisgICAqLworICBpbnQgZ2V0UG9ydCgpOworCisgIC8qKgorICAgKiBTZXQgdGhlIGhvc3QgdGhhdCBzb2NrZXQgd2lsbCBjb25uZWN0IHRvCisgICAqCisgICAqIEBwYXJhbSBob3N0IGhvc3QgaWRlbnRpZmllcgorICAgKi8KKyAgdm9pZCBzZXRIb3N0KHN0ZDo6c3RyaW5nIGhvc3QpOworCisgIC8qKgorICAgKiBTZXQgdGhlIHBvcnQgdGhhdCBzb2NrZXQgd2lsbCBjb25uZWN0IHRvCisgICAqCisgICAqIEBwYXJhbSBwb3J0IHBvcnQgbnVtYmVyCisgICAqLworICB2b2lkIHNldFBvcnQoaW50IHBvcnQpOworCisgIC8qKgorICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBsaW5nZXIgb3B0aW9uIGlzIHNldCBvbiB0aGUgc29ja2V0LgorICAgKgorICAgKiBAcGFyYW0gb24gICAgICBXaGV0aGVyIFNPX0xJTkdFUiBpcyBvbgorICAgKiBAcGFyYW0gbGluZ2VyICBJZiBsaW5nZXIgaXMgYWN0aXZlLCB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gbGluZ2VyIGZvcgorICAgKi8KKyAgdm9pZCBzZXRMaW5nZXIoYm9vbCBvbiwgaW50IGxpbmdlcik7CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gZW5hYmxlL2Rpc2FibGUgTmFnbGUncyBhbGdvcml0aG0uCisgICAqCisgICAqIEBwYXJhbSBub0RlbGF5IFdoZXRoZXIgb3Igbm90IHRvIGRpc2FibGUgdGhlIGFsZ29yaXRobS4KKyAgICogQHJldHVybgorICAgKi8KKyAgdm9pZCBzZXROb0RlbGF5KGJvb2wgbm9EZWxheSk7CisKKyAgLyoqCisgICAqIFNldCB0aGUgY29ubmVjdCB0aW1lb3V0CisgICAqLworICB2b2lkIHNldENvbm5UaW1lb3V0KGludCBtcyk7CisKKyAgLyoqCisgICAqIFNldCB0aGUgcmVjZWl2ZSB0aW1lb3V0CisgICAqLworICB2b2lkIHNldFJlY3ZUaW1lb3V0KGludCBtcyk7CisKKyAgLyoqCisgICAqIFNldCB0aGUgc2VuZCB0aW1lb3V0CisgICAqLworICB2b2lkIHNldFNlbmRUaW1lb3V0KGludCBtcyk7CisKKyAgLyoqCisgICAqIFNldCB0aGUgbWF4IG51bWJlciBvZiByZWN2IHJldHJpZXMgaW4gY2FzZSBvZiBhbiBUSFJJRlRfRUFHQUlOCisgICAqIGVycm9yCisgICAqLworICB2b2lkIHNldE1heFJlY3ZSZXRyaWVzKGludCBtYXhSZWN2UmV0cmllcyk7CisKKyAgLyoqCisgICAqIFNldCBTT19LRUVQQUxJVkUKKyAgICovCisgIHZvaWQgc2V0S2VlcEFsaXZlKGJvb2wga2VlcEFsaXZlKTsKKworICAvKioKKyAgICogR2V0IHNvY2tldCBpbmZvcm1hdGlvbiBmb3JtYXR0ZWQgYXMgYSBzdHJpbmcgPEhvc3Q6IHggUG9ydDogeD4KKyAgICovCisgIHN0ZDo6c3RyaW5nIGdldFNvY2tldEluZm8oKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgRE5TIG5hbWUgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQKKyAgICovCisgIHN0ZDo6c3RyaW5nIGdldFBlZXJIb3N0KCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQKKyAgICovCisgIHN0ZDo6c3RyaW5nIGdldFBlZXJBZGRyZXNzKCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHBvcnQgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQKKyAgICoqLworICBpbnQgZ2V0UGVlclBvcnQoKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yLgorICAgKi8KKyAgVEhSSUZUX1NPQ0tFVCBnZXRTb2NrZXRGRCgpIHsgcmV0dXJuIHNvY2tldF87IH0KKworICAvKioKKyAgICogKFJlLSlpbml0aWFsaXplIGEgVFNvY2tldCBmb3IgdGhlIHN1cHBsaWVkIGRlc2NyaXB0b3IuICBUaGlzIGlzIG9ubHkKKyAgICogaW50ZW5kZWQgZm9yIHVzZSBieSBUTm9uYmxvY2tpbmdTZXJ2ZXIgLS0gb3RoZXIgdXNlIG1heSByZXN1bHQgaW4KKyAgICogdW5mb3J0dW5hdGUgc3VycHJpc2VzLgorICAgKgorICAgKiBAcGFyYW0gZmQgdGhlIGRlc2NyaXB0b3IgZm9yIGFuIGFscmVhZHktY29ubmVjdGVkIHNvY2tldAorICAgKi8KKyAgdm9pZCBzZXRTb2NrZXRGRChUSFJJRlRfU09DS0VUIGZkKTsKKworICAvKgorICAgKiBSZXR1cm5zIGEgY2FjaGVkIGNvcHkgb2YgdGhlIHBlZXIgYWRkcmVzcy4KKyAgICovCisgIHNvY2thZGRyKiBnZXRDYWNoZWRBZGRyZXNzKHNvY2tsZW5fdCogbGVuKSBjb25zdDsKKworICAvKioKKyAgICogU2V0cyB3aGV0aGVyIHRvIHVzZSBhIGxvdyBtaW5pbXVtIFRDUCByZXRyYW5zbWlzc2lvbiB0aW1lb3V0LgorICAgKi8KKyAgc3RhdGljIHZvaWQgc2V0VXNlTG93TWluUnRvKGJvb2wgdXNlTG93TWluUnRvKTsKKworICAvKioKKyAgICogR2V0cyB3aGV0aGVyIHRvIHVzZSBhIGxvdyBtaW5pbXVtIFRDUCByZXRyYW5zbWlzc2lvbiB0aW1lb3V0LgorICAgKi8KKyAgc3RhdGljIGJvb2wgZ2V0VXNlTG93TWluUnRvKCk7CisKKyAgLyoqCisgICAqIEdldCB0aGUgb3JpZ2luIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCisgICAqCisgICAqIEByZXR1cm4gc3RyaW5nIHBlZXIgaG9zdCBpZGVudGlmaWVyIGFuZCBwb3J0CisgICAqLworICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nIGdldE9yaWdpbigpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciB0byBjcmVhdGUgc29ja2V0IGZyb20gZmlsZSBkZXNjcmlwdG9yLgorICAgKi8KKyAgVFNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBzb2NrZXQgZnJvbSBmaWxlIGRlc2NyaXB0b3IgdGhhdAorICAgKiBjYW4gYmUgaW50ZXJydXB0ZWQgc2FmZWx5LgorICAgKi8KKyAgVFNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKKworICAvKioKKyAgICogU2V0IGEgY2FjaGUgb2YgdGhlIHBlZXIgYWRkcmVzcyAodXNlZCB3aGVuIHRyaXZpYWxseSBhdmFpbGFibGU6IGUuZy4KKyAgICogYWNjZXB0KCkgb3IgY29ubmVjdCgpKS4gT25seSBjYWNoZXMgSVBWNCBhbmQgSVBWNjsgdW5zZXQgZm9yIG90aGVycy4KKyAgICovCisgIHZvaWQgc2V0Q2FjaGVkQWRkcmVzcyhjb25zdCBzb2NrYWRkciogYWRkciwgc29ja2xlbl90IGxlbik7CisKK3Byb3RlY3RlZDoKKyAgLyoqIGNvbm5lY3QsIGNhbGxlZCBieSBvcGVuICovCisgIHZvaWQgb3BlbkNvbm5lY3Rpb24oc3RydWN0IGFkZHJpbmZvKiByZXMpOworCisgIC8qKiBIb3N0IHRvIGNvbm5lY3QgdG8gKi8KKyAgc3RkOjpzdHJpbmcgaG9zdF87CisKKyAgLyoqIFBvcnQgbnVtYmVyIHRvIGNvbm5lY3Qgb24gKi8KKyAgaW50IHBvcnRfOworCisgIC8qKiBVTklYIGRvbWFpbiBzb2NrZXQgcGF0aCAqLworICBzdGQ6OnN0cmluZyBwYXRoXzsKKworICAvKiogVW5kZXJseWluZyBzb2NrZXQgaGFuZGxlICovCisgIFRIUklGVF9TT0NLRVQgc29ja2V0XzsKKworICAvKiogUGVlciBob3N0bmFtZSAqLworICBzdGQ6OnN0cmluZyBwZWVySG9zdF87CisKKyAgLyoqIFBlZXIgYWRkcmVzcyAqLworICBzdGQ6OnN0cmluZyBwZWVyQWRkcmVzc187CisKKyAgLyoqIFBlZXIgcG9ydCAqLworICBpbnQgcGVlclBvcnRfOworCisgIC8qKgorICAgKiBBIHNoYXJlZCBzb2NrZXQgcG9pbnRlciB0aGF0IHdpbGwgaW50ZXJydXB0IGEgYmxvY2tpbmcgcmVhZCBpZiBkYXRhCisgICAqIGJlY29tZXMgYXZhaWxhYmxlIG9uIGl0CisgICAqLworICBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXJfOworCisgIC8qKiBDb25uZWN0IHRpbWVvdXQgaW4gbXMgKi8KKyAgaW50IGNvbm5UaW1lb3V0XzsKKworICAvKiogU2VuZCB0aW1lb3V0IGluIG1zICovCisgIGludCBzZW5kVGltZW91dF87CisKKyAgLyoqIFJlY3YgdGltZW91dCBpbiBtcyAqLworICBpbnQgcmVjdlRpbWVvdXRfOworCisgIC8qKiBLZWVwIGFsaXZlIG9uICovCisgIGJvb2wga2VlcEFsaXZlXzsKKworICAvKiogTGluZ2VyIG9uICovCisgIGJvb2wgbGluZ2VyT25fOworCisgIC8qKiBMaW5nZXIgdmFsICovCisgIGludCBsaW5nZXJWYWxfOworCisgIC8qKiBOb2RlbGF5ICovCisgIGJvb2wgbm9EZWxheV87CisKKyAgLyoqIFJlY3YgRUdBSU4gcmV0cmllcyAqLworICBpbnQgbWF4UmVjdlJldHJpZXNfOworCisgIC8qKiBDYWNoZWQgcGVlciBhZGRyZXNzICovCisgIHVuaW9uIHsKKyAgICBzb2NrYWRkcl9pbiBpcHY0OworICAgIHNvY2thZGRyX2luNiBpcHY2OworICB9IGNhY2hlZFBlZXJBZGRyXzsKKworICAvKiogV2hldGhlciB0byB1c2UgbG93IG1pbmltdW0gVENQIHJldHJhbnNtaXNzaW9uIHRpbWVvdXQgKi8KKyAgc3RhdGljIGJvb2wgdXNlTG93TWluUnRvXzsKKworcHJpdmF0ZToKKyAgdm9pZCB1bml4X29wZW4oKTsKKyAgdm9pZCBsb2NhbF9vcGVuKCk7Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTT0NLRVRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3N2JiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuY3BwCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTcwM0wKKyNpbmNsdWRlIDxyYW5kb20+CisjZW5kaWYKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuaD4KKwordXNpbmcgc3RkOjpwYWlyOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKKy8qKgorICogVFNvY2tldFBvb2xTZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyAqCisgKi8KK1RTb2NrZXRQb29sU2VydmVyOjpUU29ja2V0UG9vbFNlcnZlcigpCisgIDogaG9zdF8oIiIpLCBwb3J0XygwKSwgc29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLCBsYXN0RmFpbFRpbWVfKDApLCBjb25zZWN1dGl2ZUZhaWx1cmVzXygwKSB7Cit9CisKKy8qKgorICogQ29uc3RydWN0b3IgZm9yIFRTb2NrZXRQb29sIHNlcnZlcgorICovCitUU29ja2V0UG9vbFNlcnZlcjo6VFNvY2tldFBvb2xTZXJ2ZXIoY29uc3Qgc3RyaW5nJiBob3N0LCBpbnQgcG9ydCkKKyAgOiBob3N0Xyhob3N0KSwKKyAgICBwb3J0Xyhwb3J0KSwKKyAgICBzb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgbGFzdEZhaWxUaW1lXygwKSwKKyAgICBjb25zZWN1dGl2ZUZhaWx1cmVzXygwKSB7Cit9CisKKy8qKgorICogVFNvY2tldFBvb2wgaW1wbGVtZW50YXRpb24uCisgKgorICovCisKK1RTb2NrZXRQb29sOjpUU29ja2V0UG9vbCgpCisgIDogVFNvY2tldCgpLAorICAgIG51bVJldHJpZXNfKDEpLAorICAgIHJldHJ5SW50ZXJ2YWxfKDYwKSwKKyAgICBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXygxKSwKKyAgICByYW5kb21pemVfKHRydWUpLAorICAgIGFsd2F5c1RyeUxhc3RfKHRydWUpIHsKK30KKworVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sKGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBob3N0cywgY29uc3QgdmVjdG9yPGludD4mIHBvcnRzKQorICA6IFRTb2NrZXQoKSwKKyAgICBudW1SZXRyaWVzXygxKSwKKyAgICByZXRyeUludGVydmFsXyg2MCksCisgICAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18oMSksCisgICAgcmFuZG9taXplXyh0cnVlKSwKKyAgICBhbHdheXNUcnlMYXN0Xyh0cnVlKSB7CisgIGlmIChob3N0cy5zaXplKCkgIT0gcG9ydHMuc2l6ZSgpKSB7CisgICAgR2xvYmFsT3V0cHV0KCJUU29ja2V0UG9vbDo6VFNvY2tldFBvb2w6IGhvc3RzLnNpemUgIT0gcG9ydHMuc2l6ZSIpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MpOworICB9CisKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBob3N0cy5zaXplKCk7ICsraSkgeworICAgIGFkZFNlcnZlcihob3N0c1tpXSwgcG9ydHNbaV0pOworICB9Cit9CisKK1RTb2NrZXRQb29sOjpUU29ja2V0UG9vbChjb25zdCB2ZWN0b3I8cGFpcjxzdHJpbmcsIGludD4gPiYgc2VydmVycykKKyAgOiBUU29ja2V0KCksCisgICAgbnVtUmV0cmllc18oMSksCisgICAgcmV0cnlJbnRlcnZhbF8oNjApLAorICAgIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKDEpLAorICAgIHJhbmRvbWl6ZV8odHJ1ZSksCisgICAgYWx3YXlzVHJ5TGFzdF8odHJ1ZSkgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2VydmVycy5zaXplKCk7ICsraSkgeworICAgIGFkZFNlcnZlcihzZXJ2ZXJzW2ldLmZpcnN0LCBzZXJ2ZXJzW2ldLnNlY29uZCk7CisgIH0KK30KKworVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sKGNvbnN0IHZlY3RvcjxzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKQorICA6IFRTb2NrZXQoKSwKKyAgICBzZXJ2ZXJzXyhzZXJ2ZXJzKSwKKyAgICBudW1SZXRyaWVzXygxKSwKKyAgICByZXRyeUludGVydmFsXyg2MCksCisgICAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18oMSksCisgICAgcmFuZG9taXplXyh0cnVlKSwKKyAgICBhbHdheXNUcnlMYXN0Xyh0cnVlKSB7Cit9CisKK1RTb2NrZXRQb29sOjpUU29ja2V0UG9vbChjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0KQorICA6IFRTb2NrZXQoKSwKKyAgICBudW1SZXRyaWVzXygxKSwKKyAgICByZXRyeUludGVydmFsXyg2MCksCisgICAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18oMSksCisgICAgcmFuZG9taXplXyh0cnVlKSwKKyAgICBhbHdheXNUcnlMYXN0Xyh0cnVlKSB7CisgIGFkZFNlcnZlcihob3N0LCBwb3J0KTsKK30KKworVFNvY2tldFBvb2w6On5UU29ja2V0UG9vbCgpIHsKKyAgdmVjdG9yPHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBzZXJ2ZXJzXy5iZWdpbigpOworICB2ZWN0b3I8c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPjo6Y29uc3RfaXRlcmF0b3IgaXRlckVuZCA9IHNlcnZlcnNfLmVuZCgpOworICBmb3IgKDsgaXRlciAhPSBpdGVyRW5kOyArK2l0ZXIpIHsKKyAgICBzZXRDdXJyZW50U2VydmVyKCppdGVyKTsKKyAgICBUU29ja2V0UG9vbDo6Y2xvc2UoKTsKKyAgfQorfQorCit2b2lkIFRTb2NrZXRQb29sOjphZGRTZXJ2ZXIoY29uc3Qgc3RyaW5nJiBob3N0LCBpbnQgcG9ydCkgeworICBzZXJ2ZXJzXy5wdXNoX2JhY2soc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4obmV3IFRTb2NrZXRQb29sU2VydmVyKGhvc3QsIHBvcnQpKSk7Cit9CisKK3ZvaWQgVFNvY2tldFBvb2w6OmFkZFNlcnZlcihzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiYgc2VydmVyKSB7CisgIGlmIChzZXJ2ZXIpIHsKKyAgICBzZXJ2ZXJzXy5wdXNoX2JhY2soc2VydmVyKTsKKyAgfQorfQorCit2b2lkIFRTb2NrZXRQb29sOjpzZXRTZXJ2ZXJzKGNvbnN0IHZlY3RvcjxzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKSB7CisgIHNlcnZlcnNfID0gc2VydmVyczsKK30KKwordm9pZCBUU29ja2V0UG9vbDo6Z2V0U2VydmVycyh2ZWN0b3I8c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycykgeworICBzZXJ2ZXJzID0gc2VydmVyc187Cit9CisKK3ZvaWQgVFNvY2tldFBvb2w6OnNldE51bVJldHJpZXMoaW50IG51bVJldHJpZXMpIHsKKyAgbnVtUmV0cmllc18gPSBudW1SZXRyaWVzOworfQorCit2b2lkIFRTb2NrZXRQb29sOjpzZXRSZXRyeUludGVydmFsKGludCByZXRyeUludGVydmFsKSB7CisgIHJldHJ5SW50ZXJ2YWxfID0gcmV0cnlJbnRlcnZhbDsKK30KKwordm9pZCBUU29ja2V0UG9vbDo6c2V0TWF4Q29uc2VjdXRpdmVGYWlsdXJlcyhpbnQgbWF4Q29uc2VjdXRpdmVGYWlsdXJlcykgeworICBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXyA9IG1heENvbnNlY3V0aXZlRmFpbHVyZXM7Cit9CisKK3ZvaWQgVFNvY2tldFBvb2w6OnNldFJhbmRvbWl6ZShib29sIHJhbmRvbWl6ZSkgeworICByYW5kb21pemVfID0gcmFuZG9taXplOworfQorCit2b2lkIFRTb2NrZXRQb29sOjpzZXRBbHdheXNUcnlMYXN0KGJvb2wgYWx3YXlzVHJ5TGFzdCkgeworICBhbHdheXNUcnlMYXN0XyA9IGFsd2F5c1RyeUxhc3Q7Cit9CisKK3ZvaWQgVFNvY2tldFBvb2w6OnNldEN1cnJlbnRTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4mIHNlcnZlcikgeworICBjdXJyZW50U2VydmVyXyA9IHNlcnZlcjsKKyAgaG9zdF8gPSBzZXJ2ZXItPmhvc3RfOworICBwb3J0XyA9IHNlcnZlci0+cG9ydF87CisgIHNvY2tldF8gPSBzZXJ2ZXItPnNvY2tldF87Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHNvY2tldCBvcGVuIGZhaWxzLiBXaGVuIHNvY2tldAorICogb3BlbnMgZmFpbHMsIHRoZSBzb2NrZXQgaW4gdGhlIGN1cnJlbnQgc2VydmVyIGlzIHJlc2V0LgorICovCisvKiBUT0RPOiB3aXRob3V0IGFwYyB3ZSBpZ25vcmUgYSBsb3Qgb2YgZnVuY3Rpb25hbGl0eSBmcm9tIHRoZSBwaHAgdmVyc2lvbiAqLwordm9pZCBUU29ja2V0UG9vbDo6b3BlbigpIHsKKworICBzaXplX3QgbnVtU2VydmVycyA9IHNlcnZlcnNfLnNpemUoKTsKKyAgaWYgKG51bVNlcnZlcnMgPT0gMCkgeworICAgIHNvY2tldF8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7CisgIH0KKworICBpZiAoaXNPcGVuKCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAocmFuZG9taXplXyAmJiBudW1TZXJ2ZXJzID4gMSkgeworI2lmIF9fY3BsdXNwbHVzID49IDIwMTcwM0wKKyAgICBzdGQ6OnJhbmRvbV9kZXZpY2Ugcm5nOworICAgIHN0ZDo6bXQxOTkzNyB1cm5nKHJuZygpKTsKKyAgICBzdGQ6OnNodWZmbGUoc2VydmVyc18uYmVnaW4oKSwgc2VydmVyc18uZW5kKCksIHVybmcpOworI2Vsc2UKKyAgICBzdGQ6OnJhbmRvbV9zaHVmZmxlKHNlcnZlcnNfLmJlZ2luKCksIHNlcnZlcnNfLmVuZCgpKTsKKyNlbmRpZgorICB9CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TZXJ2ZXJzOyArK2kpIHsKKworICAgIHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+JiBzZXJ2ZXIgPSBzZXJ2ZXJzX1tpXTsKKyAgICAvLyBJbXBlcnNvbmF0ZSB0aGUgc2VydmVyIHNvY2tldAorICAgIHNldEN1cnJlbnRTZXJ2ZXIoc2VydmVyKTsKKworICAgIGlmIChpc09wZW4oKSkgeworICAgICAgLy8gYWxyZWFkeSBvcGVuIG1lYW5zIHdlJ3JlIGRvbmUKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIHJldHJ5SW50ZXJ2YWxQYXNzZWQgPSAoc2VydmVyLT5sYXN0RmFpbFRpbWVfID09IDApOworICAgIGJvb2wgaXNMYXN0U2VydmVyID0gYWx3YXlzVHJ5TGFzdF8gPyAoaSA9PSAobnVtU2VydmVycyAtIDEpKSA6IGZhbHNlOworCisgICAgaWYgKHNlcnZlci0+bGFzdEZhaWxUaW1lXyA+IDApIHsKKyAgICAgIC8vIFRoZSBzZXJ2ZXIgd2FzIG1hcmtlZCBhcyBkb3duLCBzbyBjaGVjayBpZiBlbm91Z2ggdGltZSBoYXMgZWxhcHNlZCB0byByZXRyeQorICAgICAgdGltZV90IGVsYXBzZWRUaW1lID0gdGltZShOVUxMKSAtIHNlcnZlci0+bGFzdEZhaWxUaW1lXzsKKyAgICAgIGlmIChlbGFwc2VkVGltZSA+IHJldHJ5SW50ZXJ2YWxfKSB7CisgICAgICAgIHJldHJ5SW50ZXJ2YWxQYXNzZWQgPSB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXRyeUludGVydmFsUGFzc2VkIHx8IGlzTGFzdFNlcnZlcikgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudW1SZXRyaWVzXzsgKytqKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgVFNvY2tldDo6b3BlbigpOworICAgICAgICB9IGNhdGNoIChjb25zdCBURXhjZXB0aW9uICZlKSB7CisgICAgICAgICAgc3RyaW5nIGVyclN0ciA9ICJUU29ja2V0UG9vbDo6b3BlbiBmYWlsZWQgIiArIGdldFNvY2tldEluZm8oKSArICI6ICIgKyBlLndoYXQoKTsKKyAgICAgICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOworICAgICAgICAgIHNvY2tldF8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb3B5IG92ZXIgdGhlIG9wZW5lZCBzb2NrZXQgc28gdGhhdCB3ZSBjYW4ga2VlcCBpdCBwZXJzaXN0ZW50CisgICAgICAgIHNlcnZlci0+c29ja2V0XyA9IHNvY2tldF87CisgICAgICAgIC8vIHJlc2V0IGxhc3RGYWlsVGltZV8gaXMgcmVxdWlyZWQKKyAgICAgICAgc2VydmVyLT5sYXN0RmFpbFRpbWVfID0gMDsKKyAgICAgICAgLy8gc3VjY2VzcworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgICsrc2VydmVyLT5jb25zZWN1dGl2ZUZhaWx1cmVzXzsKKyAgICAgIGlmIChzZXJ2ZXItPmNvbnNlY3V0aXZlRmFpbHVyZXNfID4gbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18pIHsKKyAgICAgICAgLy8gTWFyayBzZXJ2ZXIgYXMgZG93bgorICAgICAgICBzZXJ2ZXItPmNvbnNlY3V0aXZlRmFpbHVyZXNfID0gMDsKKyAgICAgICAgc2VydmVyLT5sYXN0RmFpbFRpbWVfID0gdGltZShOVUxMKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBHbG9iYWxPdXRwdXQoIlRTb2NrZXRQb29sOjpvcGVuOiBhbGwgY29ubmVjdGlvbnMgZmFpbGVkIik7CisgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworfQorCit2b2lkIFRTb2NrZXRQb29sOjpjbG9zZSgpIHsKKyAgVFNvY2tldDo6Y2xvc2UoKTsKKyAgaWYgKGN1cnJlbnRTZXJ2ZXJfKSB7CisgICAgY3VycmVudFNlcnZlcl8tPnNvY2tldF8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgIH0KK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZjEwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmgKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU09DS0VUUE9PTF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU09DS0VUUE9PTF9IXyAxCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBDbGFzcyB0byBob2xkIHNlcnZlciBpbmZvcm1hdGlvbiBmb3IgVFNvY2tldFBvb2wKKyAqCisgKi8KK2NsYXNzIFRTb2NrZXRQb29sU2VydmVyIHsKKworcHVibGljOgorICAvKioKKyAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3Igc2VydmVyIGluZm8KKyAgICovCisgIFRTb2NrZXRQb29sU2VydmVyKCk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yIGZvciBUU29ja2V0UG9vbCBzZXJ2ZXIKKyAgICovCisgIFRTb2NrZXRQb29sU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBpbnQgcG9ydCk7CisKKyAgLy8gSG9zdCBuYW1lCisgIHN0ZDo6c3RyaW5nIGhvc3RfOworCisgIC8vIFBvcnQgdG8gY29ubmVjdCBvbgorICBpbnQgcG9ydF87CisKKyAgLy8gU29ja2V0IGZvciB0aGUgc2VydmVyCisgIFRIUklGVF9TT0NLRVQgc29ja2V0XzsKKworICAvLyBMYXN0IHRpbWUgY29ubmVjdGluZyB0byB0aGlzIHNlcnZlciBmYWlsZWQKKyAgdGltZV90IGxhc3RGYWlsVGltZV87CisKKyAgLy8gTnVtYmVyIG9mIGNvbnNlY3V0aXZlIHRpbWVzIGNvbm5lY3RpbmcgdG8gdGhpcyBzZXJ2ZXIgZmFpbGVkCisgIGludCBjb25zZWN1dGl2ZUZhaWx1cmVzXzsKK307CisKKy8qKgorICogVENQIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCisgKgorICovCitjbGFzcyBUU29ja2V0UG9vbCA6IHB1YmxpYyBUU29ja2V0IHsKKworcHVibGljOgorICAvKioKKyAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKKyAgICovCisgIFRTb2NrZXRQb29sKCk7CisKKyAgLyoqCisgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCisgICAqCisgICAqIEBwYXJhbSBob3N0cyBsaXN0IG9mIGhvc3QgbmFtZXMKKyAgICogQHBhcmFtIHBvcnRzIGxpc3Qgb2YgcG9ydCBuYW1lcworICAgKi8KKyAgVFNvY2tldFBvb2woY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBob3N0cywgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgcG9ydHMpOworCisgIC8qKgorICAgKiBTb2NrZXQgcG9vbCBjb25zdHJ1Y3RvcgorICAgKgorICAgKiBAcGFyYW0gc2VydmVycyBsaXN0IG9mIHBhaXJzIG9mIGhvc3QgbmFtZSBhbmQgcG9ydAorICAgKi8KKyAgVFNvY2tldFBvb2woY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBpbnQ+ID4mIHNlcnZlcnMpOworCisgIC8qKgorICAgKiBTb2NrZXQgcG9vbCBjb25zdHJ1Y3RvcgorICAgKgorICAgKiBAcGFyYW0gc2VydmVycyBsaXN0IG9mIFRTb2NrZXRQb29sU2VydmVycworICAgKi8KKyAgVFNvY2tldFBvb2woY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKTsKKworICAvKioKKyAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKKyAgICoKKyAgICogQHBhcmFtIGhvc3Qgc2luZ2xlIGhvc3QKKyAgICogQHBhcmFtIHBvcnQgc2luZ2xlIHBvcnQKKyAgICovCisgIFRTb2NrZXRQb29sKGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBpbnQgcG9ydCk7CisKKyAgLyoqCisgICAqIERlc3Ryb3llcyB0aGUgc29ja2V0IG9iamVjdCwgY2xvc2luZyBpdCBpZiBuZWNlc3NhcnkuCisgICAqLworICB2aXJ0dWFsIH5UU29ja2V0UG9vbCgpOworCisgIC8qKgorICAgKiBBZGQgYSBzZXJ2ZXIgdG8gdGhlIHBvb2wKKyAgICovCisgIHZvaWQgYWRkU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBpbnQgcG9ydCk7CisKKyAgLyoqCisgICAqIEFkZCBhIHNlcnZlciB0byB0aGUgcG9vbAorICAgKi8KKyAgdm9pZCBhZGRTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiYgc2VydmVyKTsKKworICAvKioKKyAgICogU2V0IGxpc3Qgb2Ygc2VydmVycyBpbiB0aGlzIHBvb2wKKyAgICovCisgIHZvaWQgc2V0U2VydmVycyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpOworCisgIC8qKgorICAgKiBHZXQgbGlzdCBvZiBzZXJ2ZXJzIGluIHRoaXMgcG9vbAorICAgKi8KKyAgdm9pZCBnZXRTZXJ2ZXJzKHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycyk7CisKKyAgLyoqCisgICAqIFNldHMgaG93IG1hbnkgdGltZXMgdG8ga2VlcCByZXRyeWluZyBhIGhvc3QgaW4gdGhlIGNvbm5lY3QgZnVuY3Rpb24uCisgICAqLworICB2b2lkIHNldE51bVJldHJpZXMoaW50IG51bVJldHJpZXMpOworCisgIC8qKgorICAgKiBTZXRzIGhvdyBsb25nIHRvIHdhaXQgdW50aWwgcmV0cnlpbmcgYSBob3N0IGlmIGl0IHdhcyBtYXJrZWQgZG93bgorICAgKi8KKyAgdm9pZCBzZXRSZXRyeUludGVydmFsKGludCByZXRyeUludGVydmFsKTsKKworICAvKioKKyAgICogU2V0cyBob3cgbWFueSB0aW1lcyB0byBrZWVwIHJldHJ5aW5nIGEgaG9zdCBiZWZvcmUgbWFya2luZyBpdCBhcyBkb3duLgorICAgKi8KKyAgdm9pZCBzZXRNYXhDb25zZWN1dGl2ZUZhaWx1cmVzKGludCBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzKTsKKworICAvKioKKyAgICogVHVybnMgcmFuZG9taXphdGlvbiBpbiBjb25uZWN0IG9yZGVyIG9uIG9yIG9mZi4KKyAgICovCisgIHZvaWQgc2V0UmFuZG9taXplKGJvb2wgcmFuZG9taXplKTsKKworICAvKioKKyAgICogV2hldGhlciB0byBhbHdheXMgdHJ5IHRoZSBsYXN0IHNlcnZlci4KKyAgICovCisgIHZvaWQgc2V0QWx3YXlzVHJ5TGFzdChib29sIGFsd2F5c1RyeUxhc3QpOworCisgIC8qKgorICAgKiBDcmVhdGVzIGFuZCBvcGVucyB0aGUgVU5JWCBzb2NrZXQuCisgICAqLworICB2b2lkIG9wZW4oKTsKKworICAvKgorICAgKiBDbG9zZXMgdGhlIFVOSVggc29ja2V0CisgICAqLworICB2b2lkIGNsb3NlKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBzZXRDdXJyZW50U2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4mIHNlcnZlcik7CisKKyAgLyoqIExpc3Qgb2Ygc2VydmVycyB0byBjb25uZWN0IHRvICovCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiBzZXJ2ZXJzXzsKKworICAvKiogQ3VycmVudCBzZXJ2ZXIgKi8KKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiBjdXJyZW50U2VydmVyXzsKKworICAvKiogSG93IG1hbnkgdGltZXMgdG8gcmV0cnkgZWFjaCBob3N0IGluIGNvbm5lY3QgKi8KKyAgaW50IG51bVJldHJpZXNfOworCisgIC8qKiBSZXRyeSBpbnRlcnZhbCBpbiBzZWNvbmRzLCBob3cgbG9uZyB0byBub3QgdHJ5IGEgaG9zdCBpZiBpdCBoYXMgYmVlbgorICAgKiBtYXJrZWQgYXMgZG93bi4KKyAgICovCisgIHRpbWVfdCByZXRyeUludGVydmFsXzsKKworICAvKiogTWF4IGNvbnNlY3V0aXZlIGZhaWx1cmVzIGJlZm9yZSBtYXJraW5nIGEgaG9zdCBkb3duLiAqLworICBpbnQgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc187CisKKyAgLyoqIFRyeSBob3N0cyBpbiBvcmRlcj8gb3IgUmFuZG9taXplZD8gKi8KKyAgYm9vbCByYW5kb21pemVfOworCisgIC8qKiBBbHdheXMgdHJ5IGxhc3QgaG9zdCwgZXZlbiBpZiBtYXJrZWQgZG93bj8gKi8KKyAgYm9vbCBhbHdheXNUcnlMYXN0XzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNPQ0tFVFBPT0xfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg0NDIzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsMjcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JUX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogSGVscGVyIHRlbXBsYXRlIHRvIGhvaXN0IHJlYWRBbGwgaW1wbGVtZW50YXRpb24gb3V0IG9mIFRUcmFuc3BvcnQKKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCByZWFkQWxsKFRyYW5zcG9ydF8mIHRyYW5zLCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICB1aW50MzJfdCBoYXZlID0gMDsKKyAgdWludDMyX3QgZ2V0ID0gMDsKKworICB3aGlsZSAoaGF2ZSA8IGxlbikgeworICAgIGdldCA9IHRyYW5zLnJlYWQoYnVmICsgaGF2ZSwgbGVuIC0gaGF2ZSk7CisgICAgaWYgKGdldCA8PSAwKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFLCAiTm8gbW9yZSBkYXRhIHRvIHJlYWQuIik7CisgICAgfQorICAgIGhhdmUgKz0gZ2V0OworICB9CisKKyAgcmV0dXJuIGhhdmU7Cit9CisKKy8qKgorICogR2VuZXJpYyBpbnRlcmZhY2UgZm9yIGEgbWV0aG9kIG9mIHRyYW5zcG9ydGluZyBkYXRhLiBBIFRUcmFuc3BvcnQgbWF5IGJlCisgKiBjYXBhYmxlIG9mIGVpdGhlciByZWFkaW5nIG9yIHdyaXRpbmcsIGJ1dCBub3QgbmVjZXNzYXJpbHkgYm90aC4KKyAqCisgKi8KK2NsYXNzIFRUcmFuc3BvcnQgeworcHVibGljOgorICAvKioKKyAgICogVmlydHVhbCBkZWNvbnN0cnVjdG9yLgorICAgKi8KKyAgdmlydHVhbCB+VFRyYW5zcG9ydCgpIHt9CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgb3Blbi4KKyAgICovCisgIHZpcnR1YWwgYm9vbCBpc09wZW4oKSB7IHJldHVybiBmYWxzZTsgfQorCisgIC8qKgorICAgKiBUZXN0cyB3aGV0aGVyIHRoZXJlIGlzIG1vcmUgZGF0YSB0byByZWFkIG9yIGlmIHRoZSByZW1vdGUgc2lkZSBpcworICAgKiBzdGlsbCBvcGVuLiBCeSBkZWZhdWx0IHRoaXMgaXMgdHJ1ZSB3aGVuZXZlciB0aGUgdHJhbnNwb3J0IGlzIG9wZW4sCisgICAqIGJ1dCBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGFkZCBsb2dpYyB0byB0ZXN0IGZvciB0aGlzIGNvbmRpdGlvbiB3aGVyZQorICAgKiBwb3NzaWJsZSAoaS5lLiBvbiBhIHNvY2tldCkuCisgICAqIFRoaXMgaXMgdXNlZCBieSBhIHNlcnZlciB0byBjaGVjayBpZiBpdCBzaG91bGQgbGlzdGVuIGZvciBhbm90aGVyCisgICAqIHJlcXVlc3QuCisgICAqLworICB2aXJ0dWFsIGJvb2wgcGVlaygpIHsgcmV0dXJuIGlzT3BlbigpOyB9CisKKyAgLyoqCisgICAqIE9wZW5zIHRoZSB0cmFuc3BvcnQgZm9yIGNvbW11bmljYXRpb25zLgorICAgKgorICAgKiBAcmV0dXJuIGJvb2wgV2hldGhlciB0aGUgdHJhbnNwb3J0IHdhcyBzdWNjZXNzZnVsbHkgb3BlbmVkCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBvcGVuaW5nIGZhaWxlZAorICAgKi8KKyAgdmlydHVhbCB2b2lkIG9wZW4oKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNhbm5vdCBvcGVuIGJhc2UgVFRyYW5zcG9ydC4iKTsKKyAgfQorCisgIC8qKgorICAgKiBDbG9zZXMgdGhlIHRyYW5zcG9ydC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ2Fubm90IGNsb3NlIGJhc2UgVFRyYW5zcG9ydC4iKTsKKyAgfQorCisgIC8qKgorICAgKiBBdHRlbXB0IHRvIHJlYWQgdXAgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgaW50byB0aGUgc3RyaW5nLgorICAgKgorICAgKiBAcGFyYW0gYnVmICBSZWZlcmVuY2UgdG8gdGhlIGxvY2F0aW9uIHRvIHdyaXRlIHRoZSBkYXRhCisgICAqIEBwYXJhbSBsZW4gIEhvdyBtYW55IGJ5dGVzIHRvIHJlYWQKKyAgICogQHJldHVybiBIb3cgbWFueSBieXRlcyB3ZXJlIGFjdHVhbGx5IHJlYWQKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycworICAgKi8KKyAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRfdmlydChidWYsIGxlbik7CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkX3ZpcnQodWludDhfdCogLyogYnVmICovLCB1aW50MzJfdCAvKiBsZW4gKi8pIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQmFzZSBUVHJhbnNwb3J0IGNhbm5vdCByZWFkLiIpOworICB9CisKKyAgLyoqCisgICAqIFJlYWRzIHRoZSBnaXZlbiBhbW91bnQgb2YgZGF0YSBpbiBpdHMgZW50aXJldHkgbm8gbWF0dGVyIHdoYXQuCisgICAqCisgICAqIEBwYXJhbSBzICAgICBSZWZlcmVuY2UgdG8gbG9jYXRpb24gZm9yIHJlYWQgZGF0YQorICAgKiBAcGFyYW0gbGVuICAgSG93IG1hbnkgYnl0ZXMgdG8gcmVhZAorICAgKiBAcmV0dXJuIEhvdyBtYW55IGJ5dGVzIHJlYWQsIHdoaWNoIG11c3QgYmUgZXF1YWwgdG8gc2l6ZQorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgaW5zdWZmaWNpZW50IGRhdGEgd2FzIHJlYWQKKyAgICovCisgIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkQWxsX3ZpcnQoYnVmLCBsZW4pOworICB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEFsbF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgcmV0dXJuIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OnJlYWRBbGwoKnRoaXMsIGJ1ZiwgbGVuKTsKKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgd2hlbiByZWFkIGlzIGNvbXBsZXRlZC4KKyAgICogVGhpcyBjYW4gYmUgb3Zlci1yaWRkZW4gdG8gcGVyZm9ybSBhIHRyYW5zcG9ydC1zcGVjaWZpYyBhY3Rpb24KKyAgICogZS5nLiBsb2dnaW5nIHRoZSByZXF1ZXN0IHRvIGEgZmlsZQorICAgKgorICAgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyByZWFkIGlmIGF2YWlsYWJsZSwgMCBvdGhlcndpc2UuCisgICAqLworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRFbmQoKSB7CisgICAgLy8gZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gZG8gbm90aGluZworICAgIHJldHVybiAwOworICB9CisKKyAgLyoqCisgICAqIFdyaXRlcyB0aGUgc3RyaW5nIGluIGl0cyBlbnRpcmV0eSB0byB0aGUgYnVmZmVyLgorICAgKgorICAgKiBOb3RlOiBZb3UgbXVzdCBjYWxsIGZsdXNoKCkgdG8gZW5zdXJlIHRoZSBkYXRhIGlzIGFjdHVhbGx5IHdyaXR0ZW4sCisgICAqIGFuZCBhdmFpbGFibGUgdG8gYmUgcmVhZCBiYWNrIGluIHRoZSBmdXR1cmUuICBEZXN0cm95aW5nIGEgVFRyYW5zcG9ydAorICAgKiBvYmplY3QgZG9lcyBub3QgYXV0b21hdGljYWxseSBmbHVzaCBwZW5kaW5nIGRhdGEtLWlmIHlvdSBkZXN0cm95IGEKKyAgICogVFRyYW5zcG9ydCBvYmplY3Qgd2l0aCB3cml0dGVuIGJ1dCB1bmZsdXNoZWQgZGF0YSwgdGhhdCBkYXRhIG1heSBiZQorICAgKiBkaXNjYXJkZWQuCisgICAqCisgICAqIEBwYXJhbSBidWYgIFRoZSBkYXRhIHRvIHdyaXRlIG91dAorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAqLworICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICB3cml0ZV92aXJ0KGJ1ZiwgbGVuKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgd3JpdGVfdmlydChjb25zdCB1aW50OF90KiAvKiBidWYgKi8sIHVpbnQzMl90IC8qIGxlbiAqLykgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJCYXNlIFRUcmFuc3BvcnQgY2Fubm90IHdyaXRlLiIpOworICB9CisKKyAgLyoqCisgICAqIENhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlZC4KKyAgICogVGhpcyBjYW4gYmUgb3Zlci1yaWRkZW4gdG8gcGVyZm9ybSBhIHRyYW5zcG9ydC1zcGVjaWZpYyBhY3Rpb24KKyAgICogYXQgdGhlIGVuZCBvZiBhIHJlcXVlc3QuCisgICAqCisgICAqIEByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaWYgYXZhaWxhYmxlLCAwIG90aGVyd2lzZQorICAgKi8KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUVuZCgpIHsKKyAgICAvLyBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byBkbyBub3RoaW5nCisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKioKKyAgICogRmx1c2hlcyBhbnkgcGVuZGluZyBkYXRhIHRvIGJlIHdyaXR0ZW4uIFR5cGljYWxseSB1c2VkIHdpdGggYnVmZmVyZWQKKyAgICogdHJhbnNwb3J0IG1lY2hhbmlzbXMuCisgICAqCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICovCisgIHZpcnR1YWwgdm9pZCBmbHVzaCgpIHsKKyAgICAvLyBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byBkbyBub3RoaW5nCisgIH0KKworICAvKioKKyAgICogQXR0ZW1wdHMgdG8gcmV0dXJuIGEgcG9pbnRlciB0byBcYyBsZW4gYnl0ZXMsIHBvc3NpYmx5IGNvcGllZCBpbnRvIFxjIGJ1Zi4KKyAgICogRG9lcyBub3QgY29uc3VtZSB0aGUgYnl0ZXMgcmVhZCAoaS5lLjogYSBsYXRlciByZWFkIHdpbGwgcmV0dXJuIHRoZSBzYW1lCisgICAqIGRhdGEpLiAgVGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gc3VwcG9ydCBwcm90b2NvbHMgdGhhdCBuZWVkIHRvIHJlYWQKKyAgICogdmFyaWFibGUtbGVuZ3RoIGZpZWxkcy4gIFRoZXkgY2FuIGF0dGVtcHQgdG8gYm9ycm93IHRoZSBtYXhpbXVtIGFtb3VudCBvZgorICAgKiBkYXRhIHRoYXQgdGhleSB3aWxsIG5lZWQsIHRoZW4gY29uc3VtZSAoc2VlIG5leHQgbWV0aG9kKSB3aGF0IHRoZXkKKyAgICogYWN0dWFsbHkgdXNlLiAgU29tZSB0cmFuc3BvcnRzIHdpbGwgbm90IHN1cHBvcnQgdGhpcyBtZXRob2QgYW5kIG90aGVycworICAgKiB3aWxsIGZhaWwgb2NjYXNpb25hbGx5LCBzbyBwcm90b2NvbHMgbXVzdCBiZSBwcmVwYXJlZCB0byB1c2UgcmVhZCBpZgorICAgKiBib3Jyb3cgZmFpbHMuCisgICAqCisgICAqIEBvYXJhbSBidWYgIEEgYnVmZmVyIHdoZXJlIHRoZSBkYXRhIGNhbiBiZSBzdG9yZWQgaWYgbmVlZGVkLgorICAgKiAgICAgICAgICAgICBJZiBib3Jyb3cgZG9lc24ndCByZXR1cm4gYnVmLCB0aGVuIHRoZSBjb250ZW50cyBvZgorICAgKiAgICAgICAgICAgICBidWYgYWZ0ZXIgdGhlIGNhbGwgYXJlIHVuZGVmaW5lZC4gIFRoaXMgcGFyYW1ldGVyIG1heSBiZQorICAgKiAgICAgICAgICAgICBOVUxMIHRvIGluZGljYXRlIHRoYXQgdGhlIGNhbGxlciBpcyBub3Qgc3VwcGx5aW5nIHN0b3JhZ2UsCisgICAqICAgICAgICAgICAgIGJ1dCB3b3VsZCBsaWtlIGEgcG9pbnRlciBpbnRvIGFuIGludGVybmFsIGJ1ZmZlciwgaWYKKyAgICogICAgICAgICAgICAgYXZhaWxhYmxlLgorICAgKiBAcGFyYW0gbGVuICAqbGVuIHNob3VsZCBpbml0aWFsbHkgY29udGFpbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJvcnJvdy4KKyAgICogICAgICAgICAgICAgSWYgYm9ycm93IHN1Y2NlZWRzLCAqbGVuIHdpbGwgY29udGFpbiB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgICAqICAgICAgICAgICAgIGF2YWlsYWJsZSBpbiB0aGUgcmV0dXJuZWQgcG9pbnRlci4gIFRoaXMgd2lsbCBiZSBhdCBsZWFzdAorICAgKiAgICAgICAgICAgICB3aGF0IHdhcyByZXF1ZXN0ZWQsIGJ1dCBtYXkgYmUgbW9yZSBpZiBib3Jyb3cgcmV0dXJucworICAgKiAgICAgICAgICAgICBhIHBvaW50ZXIgdG8gYW4gaW50ZXJuYWwgYnVmZmVyLCByYXRoZXIgdGhhbiBidWYuCisgICAqICAgICAgICAgICAgIElmIGJvcnJvdyBmYWlscywgdGhlIGNvbnRlbnRzIG9mICpsZW4gYXJlIHVuZGVmaW5lZC4KKyAgICogQHJldHVybiBJZiB0aGUgYm9ycm93IHN1Y2NlZWRzLCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBib3Jyb3dlZCBkYXRhLgorICAgKiAgICAgICAgIFRoaXMgbWlnaHQgYmUgZXF1YWwgdG8gXGMgYnVmLCBvciBpdCBtaWdodCBiZSBhIHBvaW50ZXIgaW50bworICAgKiAgICAgICAgIHRoZSB0cmFuc3BvcnQncyBpbnRlcm5hbCBidWZmZXJzLgorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAqLworICBjb25zdCB1aW50OF90KiBib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gYm9ycm93X3ZpcnQoYnVmLCBsZW4pOworICB9CisgIHZpcnR1YWwgY29uc3QgdWludDhfdCogYm9ycm93X3ZpcnQodWludDhfdCogLyogYnVmICovLCB1aW50MzJfdCogLyogbGVuICovKSB7IHJldHVybiBOVUxMOyB9CisKKyAgLyoqCisgICAqIFJlbW92ZSBsZW4gYnl0ZXMgZnJvbSB0aGUgdHJhbnNwb3J0LiAgVGhpcyBzaG91bGQgYWx3YXlzIGZvbGxvdyBhIGJvcnJvdworICAgKiBvZiBhdCBsZWFzdCBsZW4gYnl0ZXMsIGFuZCBzaG91bGQgYWx3YXlzIHN1Y2NlZWQuCisgICAqIFRPRE8oZHJlaXNzKTogSXMgdGhlcmUgYW55IHRyYW5zcG9ydCB0aGF0IGNvdWxkIGJvcnJvdyBidXQgZmFpbCB0bworICAgKiBjb25zdW1lLCBvciB0aGF0IHdvdWxkIHJlcXVpcmUgYSBidWZmZXIgdG8gZHVtcCB0aGUgY29uc3VtZWQgZGF0YT8KKyAgICoKKyAgICogQHBhcmFtIGxlbiAgSG93IG1hbnkgYnl0ZXMgdG8gY29uc3VtZQorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCisgICAqLworICB2b2lkIGNvbnN1bWUodWludDMyX3QgbGVuKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICBjb25zdW1lX3ZpcnQobGVuKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgY29uc3VtZV92aXJ0KHVpbnQzMl90IC8qIGxlbiAqLykgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJCYXNlIFRUcmFuc3BvcnQgY2Fubm90IGNvbnN1bWUuIik7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgb3JpZ2luIG9mIHRoZSB0cmFuc3BvcnRzIGNhbGwuIFRoZSB2YWx1ZSBkZXBlbmRzIG9uIHRoZQorICAgKiB0cmFuc3BvcnQgdXNlZC4gQW4gSVAgYmFzZWQgdHJhbnNwb3J0IGZvciBleGFtcGxlIHdpbGwgcmV0dXJuIHRoZQorICAgKiBJUCBhZGRyZXNzIG9mIHRoZSBjbGllbnQgbWFraW5nIHRoZSByZXF1ZXN0LgorICAgKiBJZiB0aGUgdHJhbnNwb3J0IGRvZXNuJ3Qga25vdyB0aGUgb3JpZ2luIFVua25vd24gaXMgcmV0dXJuZWQuCisgICAqCisgICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmUgdXNlZCBpbiBhIGxvZyBtZXNzYWdlIGZvciBleGFtcGxlCisgICAqLworICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nIGdldE9yaWdpbigpIHsgcmV0dXJuICJVbmtub3duIjsgfQorCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBTaW1wbGUgY29uc3RydWN0b3IuCisgICAqLworICBUVHJhbnNwb3J0KCkge30KK307CisKKy8qKgorICogR2VuZXJpYyBmYWN0b3J5IGNsYXNzIHRvIG1ha2UgYW4gaW5wdXQgYW5kIG91dHB1dCB0cmFuc3BvcnQgb3V0IG9mIGEKKyAqIHNvdXJjZSB0cmFuc3BvcnQuIENvbW1vbmx5IHVzZWQgaW5zaWRlIHNlcnZlcnMgdG8gbWFrZSBpbnB1dCBhbmQgb3V0cHV0CisgKiBzdHJlYW1zIG91dCBvZiByYXcgY2xpZW50cy4KKyAqCisgKi8KK2NsYXNzIFRUcmFuc3BvcnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVFRyYW5zcG9ydEZhY3RvcnkoKSB7fQorCisgIHZpcnR1YWwgflRUcmFuc3BvcnRGYWN0b3J5KCkge30KKworICAvKioKKyAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcsIGp1c3QgcmV0dXJucyB0aGUgdHJhbnNwb3J0IGdpdmVuLgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgeworICAgIHJldHVybiB0cmFuczsKKyAgfQorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTI3MzE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNwcApAQCAtMCwwICsxLDU5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworY29uc3QgY2hhciogVFRyYW5zcG9ydEV4Y2VwdGlvbjo6d2hhdCgpIGNvbnN0IG5vZXhjZXB0IHsKKyAgaWYgKG1lc3NhZ2VfLmVtcHR5KCkpIHsKKyAgICBzd2l0Y2ggKHR5cGVfKSB7CisgICAgY2FzZSBVTktOT1dOOgorICAgICAgcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBVbmtub3duIHRyYW5zcG9ydCBleGNlcHRpb24iOworICAgIGNhc2UgTk9UX09QRU46CisgICAgICByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IFRyYW5zcG9ydCBub3Qgb3BlbiI7CisgICAgY2FzZSBUSU1FRF9PVVQ6CisgICAgICByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IFRpbWVkIG91dCI7CisgICAgY2FzZSBFTkRfT0ZfRklMRToKKyAgICAgIHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogRW5kIG9mIGZpbGUiOworICAgIGNhc2UgSU5URVJSVVBURUQ6CisgICAgICByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IEludGVycnVwdGVkIjsKKyAgICBjYXNlIEJBRF9BUkdTOgorICAgICAgcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBJbnZhbGlkIGFyZ3VtZW50cyI7CisgICAgY2FzZSBDT1JSVVBURURfREFUQToKKyAgICAgIHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogQ29ycnVwdGVkIERhdGEiOworICAgIGNhc2UgSU5URVJOQUxfRVJST1I6CisgICAgICByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IEludGVybmFsIGVycm9yIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiAoSW52YWxpZCBleGNlcHRpb24gdHlwZSkiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbWVzc2FnZV8uY19zdHIoKTsKKyAgfQorfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNWYwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRFWENFUFRJT05fSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVEVYQ0VQVElPTl9IXyAxCisKKyNpbmNsdWRlIDxib29zdC9udW1lcmljL2NvbnZlcnNpb24vY2FzdC5ocHA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIENsYXNzIHRvIGVuY2Fwc3VsYXRlIGFsbCB0aGUgcG9zc2libGUgdHlwZXMgb2YgdHJhbnNwb3J0IGVycm9ycyB0aGF0IG1heQorICogb2NjdXIgaW4gdmFyaW91cyB0cmFuc3BvcnQgc3lzdGVtcy4gVGhpcyBwcm92aWRlcyBhIHNvcnQgb2YgZ2VuZXJpYworICogd3JhcHBlciBhcm91bmQgdGhlIHZhZ3VlIFVOSVggRV8gZXJyb3IgY29kZXMgdGhhdCBsZXRzIGEgY29tbW9uIGNvZGUKKyAqIGJhc2Ugb2YgZXJyb3IgaGFuZGxpbmcgdG8gYmUgdXNlZCBmb3IgdmFyaW91cyB0eXBlcyBvZiB0cmFuc3BvcnRzLCBpLmUuCisgKiBwaXBlcyBldGMuCisgKgorICovCitjbGFzcyBUVHJhbnNwb3J0RXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIEVycm9yIGNvZGVzIGZvciB0aGUgdmFyaW91cyB0eXBlcyBvZiBleGNlcHRpb25zLgorICAgKi8KKyAgZW51bSBUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB7CisgICAgVU5LTk9XTiA9IDAsCisgICAgTk9UX09QRU4gPSAxLAorICAgIFRJTUVEX09VVCA9IDIsCisgICAgRU5EX09GX0ZJTEUgPSAzLAorICAgIElOVEVSUlVQVEVEID0gNCwKKyAgICBCQURfQVJHUyA9IDUsCisgICAgQ09SUlVQVEVEX0RBVEEgPSA2LAorICAgIElOVEVSTkFMX0VSUk9SID0gNworICB9OworCisgIFRUcmFuc3BvcnRFeGNlcHRpb24oKSA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCksIHR5cGVfKFVOS05PV04pIHt9CisKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlKSA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCksIHR5cGVfKHR5cGUpIHt9CisKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKKyAgICA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLCB0eXBlXyhVTktOT1dOKSB7fQorCisgIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvblR5cGUgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpCisgICAgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihtZXNzYWdlKSwgdHlwZV8odHlwZSkge30KKworICBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlLCBpbnQgZXJybm9fY29weSkKKyAgICA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UgKyAiOiAiICsgVE91dHB1dDo6c3RyZXJyb3JfcyhlcnJub19jb3B5KSksIHR5cGVfKHR5cGUpIHt9CisKKyAgdmlydHVhbCB+VFRyYW5zcG9ydEV4Y2VwdGlvbigpIG5vZXhjZXB0IHt9CisKKyAgLyoqCisgICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIGVycm9yCisgICAqIHRoYXQgaGFzIG9jY3VycmVkLgorICAgKgorICAgKiBAcmV0dXJuIEVycm9yIGNvZGUKKyAgICovCisgIFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIGdldFR5cGUoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiB0eXBlXzsgfQorCisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0OworCitwcm90ZWN0ZWQ6CisgIC8qKiBKdXN0IGxpa2Ugc3RyZXJyb3JfciBidXQgcmV0dXJucyBhIEMrKyBzdHJpbmcgb2JqZWN0LiAqLworICBzdGQ6OnN0cmluZyBzdHJlcnJvcl9zKGludCBlcnJub19jb3B5KTsKKworICAvKiogRXJyb3IgY29kZSAqLworICBUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlXzsKK307CisKKy8qKgorICogTGVnYWN5IGNvZGUgaW4gdHJhbnNwb3J0IGltcGxlbWVudGF0aW9ucyBoYXZlIG92ZXJmbG93IGlzc3VlcworICogdGhhdCBuZWVkIHRvIGJlIGVuZm9yY2VkLgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20+IFRvIHNhZmVfbnVtZXJpY19jYXN0KEZyb20gaSkgeworICB0cnkgeworICAgIHJldHVybiBib29zdDo6bnVtZXJpY19jYXN0PFRvPihpKTsKKyAgfQorICBjYXRjaCAoY29uc3Qgc3RkOjpiYWRfY2FzdCYgYmMpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmMud2hhdCgpKTsKKyAgfQorfQorCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVEVYQ0VQVElPTl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNDdjNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5jcHAKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK3VpbnQzMl90IFRQaXBlZFRyYW5zcG9ydDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICB1aW50MzJfdCBuZWVkID0gbGVuOworCisgIC8vIFdlIGRvbid0IGhhdmUgZW5vdWdoIGRhdGEgeWV0CisgIGlmIChyTGVuXyAtIHJQb3NfIDwgbmVlZCkgeworICAgIC8vIENvcHkgb3V0IHdoYXRldmVyIHdlIGhhdmUKKyAgICBpZiAockxlbl8gLSByUG9zXyA+IDApIHsKKyAgICAgIG1lbWNweShidWYsIHJCdWZfICsgclBvc18sIHJMZW5fIC0gclBvc18pOworICAgICAgbmVlZCAtPSByTGVuXyAtIHJQb3NfOworICAgICAgYnVmICs9IHJMZW5fIC0gclBvc187CisgICAgICByUG9zXyA9IHJMZW5fOworICAgIH0KKworICAgIC8vIERvdWJsZSB0aGUgc2l6ZSBvZiB0aGUgdW5kZXJseWluZyBidWZmZXIgaWYgaXQgaXMgZnVsbAorICAgIGlmIChyTGVuXyA9PSByQnVmU2l6ZV8pIHsKKyAgICAgIHJCdWZTaXplXyAqPSAyOworICAgICAgdWludDhfdCAqdG1wQnVmID0gKHVpbnQ4X3QqKXN0ZDo6cmVhbGxvYyhyQnVmXywgc2l6ZW9mKHVpbnQ4X3QpICogckJ1ZlNpemVfKTsKKyAgICAgIGlmICh0bXBCdWYgPT0gTlVMTCkgeworICAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisgICAgICB9CisgICAgICByQnVmXyA9IHRtcEJ1ZjsKKyAgICB9CisKKyAgICAvLyB0cnkgdG8gZmlsbCB1cCB0aGUgYnVmZmVyCisgICAgckxlbl8gKz0gc3JjVHJhbnNfLT5yZWFkKHJCdWZfICsgclBvc18sIHJCdWZTaXplXyAtIHJQb3NfKTsKKyAgfQorCisgIC8vIEhhbmQgb3ZlciB3aGF0ZXZlciB3ZSBoYXZlCisgIHVpbnQzMl90IGdpdmUgPSBuZWVkOworICBpZiAockxlbl8gLSByUG9zXyA8IGdpdmUpIHsKKyAgICBnaXZlID0gckxlbl8gLSByUG9zXzsKKyAgfQorICBpZiAoZ2l2ZSA+IDApIHsKKyAgICBtZW1jcHkoYnVmLCByQnVmXyArIHJQb3NfLCBnaXZlKTsKKyAgICByUG9zXyArPSBnaXZlOworICAgIG5lZWQgLT0gZ2l2ZTsKKyAgfQorCisgIHJldHVybiAobGVuIC0gbmVlZCk7Cit9CisKK3ZvaWQgVFBpcGVkVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBpZiAobGVuID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBNYWtlIHRoZSBidWZmZXIgYXMgYmlnIGFzIGl0IG5lZWRzIHRvIGJlCisgIGlmICgobGVuICsgd0xlbl8pID49IHdCdWZTaXplXykgeworICAgIHVpbnQzMl90IG5ld0J1ZlNpemUgPSB3QnVmU2l6ZV8gKiAyOworICAgIHdoaWxlICgobGVuICsgd0xlbl8pID49IG5ld0J1ZlNpemUpIHsKKyAgICAgIG5ld0J1ZlNpemUgKj0gMjsKKyAgICB9CisgICAgdWludDhfdCAqdG1wQnVmPSAodWludDhfdCopc3RkOjpyZWFsbG9jKHdCdWZfLCBzaXplb2YodWludDhfdCkgKiBuZXdCdWZTaXplKTsKKyAgICBpZiAodG1wQnVmID09IE5VTEwpIHsKKyAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisgICAgfQorICAgIHdCdWZfID0gdG1wQnVmOworCisgICAgd0J1ZlNpemVfID0gbmV3QnVmU2l6ZTsKKyAgfQorCisgIC8vIENvcHkgaW50byB0aGUgYnVmZmVyCisgIG1lbWNweSh3QnVmXyArIHdMZW5fLCBidWYsIGxlbik7CisgIHdMZW5fICs9IGxlbjsKK30KKwordm9pZCBUUGlwZWRUcmFuc3BvcnQ6OmZsdXNoKCkgeworICAvLyBXcml0ZSBvdXQgYW55IGRhdGEgd2FpdGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyCisgIGlmICh3TGVuXyA+IDApIHsKKyAgICBzcmNUcmFuc18tPndyaXRlKHdCdWZfLCB3TGVuXyk7CisgICAgd0xlbl8gPSAwOworICB9CisKKyAgLy8gRmx1c2ggdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgIHNyY1RyYW5zXy0+Zmx1c2goKTsKK30KKworVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6VFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydCgKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHNyY1RyYW5zLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykKKyAgOiBUUGlwZWRUcmFuc3BvcnQoc3JjVHJhbnMsIGRzdFRyYW5zKSwgc3JjVHJhbnNfKHNyY1RyYW5zKSB7Cit9CisKK1RQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6On5UUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KCkgeworfQorCitib29sIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OmlzT3BlbigpIHsKKyAgcmV0dXJuIFRQaXBlZFRyYW5zcG9ydDo6aXNPcGVuKCk7Cit9CisKK2Jvb2wgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6cGVlaygpIHsKKyAgcmV0dXJuIFRQaXBlZFRyYW5zcG9ydDo6cGVlaygpOworfQorCit2b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6Om9wZW4oKSB7CisgIFRQaXBlZFRyYW5zcG9ydDo6b3BlbigpOworfQorCit2b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OmNsb3NlKCkgeworICBUUGlwZWRUcmFuc3BvcnQ6OmNsb3NlKCk7Cit9CisKK3VpbnQzMl90IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgcmV0dXJuIFRQaXBlZFRyYW5zcG9ydDo6cmVhZChidWYsIGxlbik7Cit9CisKK3VpbnQzMl90IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgdWludDMyX3QgaGF2ZSA9IDA7CisgIHVpbnQzMl90IGdldCA9IDA7CisKKyAgd2hpbGUgKGhhdmUgPCBsZW4pIHsKKyAgICBnZXQgPSByZWFkKGJ1ZiArIGhhdmUsIGxlbiAtIGhhdmUpOworICAgIGlmIChnZXQgPD0gMCkgeworICAgICAgdGhyb3cgVEVPRkV4Y2VwdGlvbigpOworICAgIH0KKyAgICBoYXZlICs9IGdldDsKKyAgfQorCisgIHJldHVybiBoYXZlOworfQorCit1aW50MzJfdCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpyZWFkRW5kKCkgeworICByZXR1cm4gVFBpcGVkVHJhbnNwb3J0OjpyZWFkRW5kKCk7Cit9CisKK3ZvaWQgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgVFBpcGVkVHJhbnNwb3J0Ojp3cml0ZShidWYsIGxlbik7Cit9CisKK3VpbnQzMl90IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OndyaXRlRW5kKCkgeworICByZXR1cm4gVFBpcGVkVHJhbnNwb3J0Ojp3cml0ZUVuZCgpOworfQorCit2b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OmZsdXNoKCkgeworICBUUGlwZWRUcmFuc3BvcnQ6OmZsdXNoKCk7Cit9CisKK2ludDMyX3QgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6Z2V0UmVhZFRpbWVvdXQoKSB7CisgIHJldHVybiBzcmNUcmFuc18tPmdldFJlYWRUaW1lb3V0KCk7Cit9CisKK3ZvaWQgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6c2V0UmVhZFRpbWVvdXQoaW50MzJfdCByZWFkVGltZW91dCkgeworICBzcmNUcmFuc18tPnNldFJlYWRUaW1lb3V0KHJlYWRUaW1lb3V0KTsKK30KKwordWludDMyX3QgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6Z2V0TnVtQ2h1bmtzKCkgeworICByZXR1cm4gc3JjVHJhbnNfLT5nZXROdW1DaHVua3MoKTsKK30KKwordWludDMyX3QgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6Z2V0Q3VyQ2h1bmsoKSB7CisgIHJldHVybiBzcmNUcmFuc18tPmdldEN1ckNodW5rKCk7Cit9CisKK3ZvaWQgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6c2Vla1RvQ2h1bmsoaW50MzJfdCBjaHVuaykgeworICBzcmNUcmFuc18tPnNlZWtUb0NodW5rKGNodW5rKTsKK30KKwordm9pZCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpzZWVrVG9FbmQoKSB7CisgIHNyY1RyYW5zXy0+c2Vla1RvRW5kKCk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjODJkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oCkBAIC0wLDAgKzEsMzE0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVFVUSUxTX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRVVElMU19IXyAxCisKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKy8vIEluY2x1ZGUgdGhlIGJ1ZmZlcmVkIHRyYW5zcG9ydHMgdGhhdCB1c2VkIHRvIGJlIGRlZmluZWQgaGVyZS4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogVGhlIG51bGwgdHJhbnNwb3J0IGlzIGEgZHVtbXkgdHJhbnNwb3J0IHRoYXQgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZy4KKyAqIEl0J3Mgc29ydCBvZiBhbiBhbmFsb2d5IHRvIC9kZXYvbnVsbCwgeW91IGNhbiBuZXZlciByZWFkIGFueXRoaW5nIGZyb20gaXQKKyAqIGFuZCBpdCB3aWxsIGxldCB5b3Ugd3JpdGUgYW55dGhpbmcgeW91IHdhbnQgdG8gaXQsIHRob3VnaCBpdCB3b24ndCBhY3R1YWxseQorICogZ28gYW55d2hlcmUuCisgKgorICovCitjbGFzcyBUTnVsbFRyYW5zcG9ydCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUTnVsbFRyYW5zcG9ydD4geworcHVibGljOgorICBUTnVsbFRyYW5zcG9ydCgpIHt9CisKKyAgflROdWxsVHJhbnNwb3J0KCkge30KKworICBib29sIGlzT3BlbigpIHsgcmV0dXJuIHRydWU7IH0KKworICB2b2lkIG9wZW4oKSB7fQorCisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogLyogYnVmICovLCB1aW50MzJfdCAvKiBsZW4gKi8pIHsgcmV0dXJuOyB9Cit9OworCisvKioKKyAqIFRQaXBlZFRyYW5zcG9ydC4gVGhpcyB0cmFuc3BvcnQgYWxsb3dzIHBpcGluZyBvZiBhIHJlcXVlc3QgZnJvbSBvbmUKKyAqIHRyYW5zcG9ydCB0byBhbm90aGVyIGVpdGhlciB3aGVuIHJlYWRFbmQoKSBvciB3cml0ZUVuZCgpLiBUaGUgdHlwaWNhbAorICogdXNlIGNhc2UgZm9yIHRoaXMgaXMgdG8gbG9nIGEgcmVxdWVzdCBvciBhIHJlcGx5IHRvIGRpc2suCisgKiBUaGUgdW5kZXJseWluZyBidWZmZXIgZXhwYW5kcyB0byBhIGtlZXAgYSBjb3B5IG9mIHRoZSBlbnRpcmUKKyAqIHJlcXVlc3QvcmVzcG9uc2UuCisgKgorICovCitjbGFzcyBUUGlwZWRUcmFuc3BvcnQgOiB2aXJ0dWFsIHB1YmxpYyBUVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgVFBpcGVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucywgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKQorICAgIDogc3JjVHJhbnNfKHNyY1RyYW5zKSwKKyAgICAgIGRzdFRyYW5zXyhkc3RUcmFucyksCisgICAgICByQnVmU2l6ZV8oNTEyKSwKKyAgICAgIHJQb3NfKDApLAorICAgICAgckxlbl8oMCksCisgICAgICB3QnVmU2l6ZV8oNTEyKSwKKyAgICAgIHdMZW5fKDApIHsKKworICAgIC8vIGRlZmF1bHQgaXMgdG8gdG8gcGlwZSB0aGUgcmVxdWVzdCB3aGVuIHJlYWRFbmQoKSBpcyBjYWxsZWQKKyAgICBwaXBlT25SZWFkXyA9IHRydWU7CisgICAgcGlwZU9uV3JpdGVfID0gZmFsc2U7CisKKyAgICByQnVmXyA9ICh1aW50OF90KilzdGQ6Om1hbGxvYyhzaXplb2YodWludDhfdCkgKiByQnVmU2l6ZV8pOworICAgIGlmIChyQnVmXyA9PSBOVUxMKSB7CisgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworICAgIH0KKyAgICB3QnVmXyA9ICh1aW50OF90KilzdGQ6Om1hbGxvYyhzaXplb2YodWludDhfdCkgKiB3QnVmU2l6ZV8pOworICAgIGlmICh3QnVmXyA9PSBOVUxMKSB7CisgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworICAgIH0KKyAgfQorCisgIFRQaXBlZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnMsCisgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMsCisgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzeikKKyAgICA6IHNyY1RyYW5zXyhzcmNUcmFucyksCisgICAgICBkc3RUcmFuc18oZHN0VHJhbnMpLAorICAgICAgckJ1ZlNpemVfKDUxMiksCisgICAgICByUG9zXygwKSwKKyAgICAgIHJMZW5fKDApLAorICAgICAgd0J1ZlNpemVfKHN6KSwKKyAgICAgIHdMZW5fKDApIHsKKworICAgIHJCdWZfID0gKHVpbnQ4X3QqKXN0ZDo6bWFsbG9jKHNpemVvZih1aW50OF90KSAqIHJCdWZTaXplXyk7CisgICAgaWYgKHJCdWZfID09IE5VTEwpIHsKKyAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisgICAgfQorICAgIHdCdWZfID0gKHVpbnQ4X3QqKXN0ZDo6bWFsbG9jKHNpemVvZih1aW50OF90KSAqIHdCdWZTaXplXyk7CisgICAgaWYgKHdCdWZfID09IE5VTEwpIHsKKyAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisgICAgfQorICB9CisKKyAgflRQaXBlZFRyYW5zcG9ydCgpIHsKKyAgICBzdGQ6OmZyZWUockJ1Zl8pOworICAgIHN0ZDo6ZnJlZSh3QnVmXyk7CisgIH0KKworICBib29sIGlzT3BlbigpIHsgcmV0dXJuIHNyY1RyYW5zXy0+aXNPcGVuKCk7IH0KKworICBib29sIHBlZWsoKSB7CisgICAgaWYgKHJQb3NfID49IHJMZW5fKSB7CisgICAgICAvLyBEb3VibGUgdGhlIHNpemUgb2YgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlmIGl0IGlzIGZ1bGwKKyAgICAgIGlmIChyTGVuXyA9PSByQnVmU2l6ZV8pIHsKKyAgICAgICAgckJ1ZlNpemVfICo9IDI7CisgICAgICAgIHVpbnQ4X3QgKiB0bXBCdWYgPSAodWludDhfdCopc3RkOjpyZWFsbG9jKHJCdWZfLCBzaXplb2YodWludDhfdCkgKiByQnVmU2l6ZV8pOworCWlmICh0bXBCdWYgPT0gTlVMTCkgeworCSAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKwl9CisJckJ1Zl8gPSB0bXBCdWY7CisgICAgICB9CisKKyAgICAgIC8vIHRyeSB0byBmaWxsIHVwIHRoZSBidWZmZXIKKyAgICAgIHJMZW5fICs9IHNyY1RyYW5zXy0+cmVhZChyQnVmXyArIHJQb3NfLCByQnVmU2l6ZV8gLSByUG9zXyk7CisgICAgfQorICAgIHJldHVybiAockxlbl8gPiByUG9zXyk7CisgIH0KKworICB2b2lkIG9wZW4oKSB7IHNyY1RyYW5zXy0+b3BlbigpOyB9CisKKyAgdm9pZCBjbG9zZSgpIHsgc3JjVHJhbnNfLT5jbG9zZSgpOyB9CisKKyAgdm9pZCBzZXRQaXBlT25SZWFkKGJvb2wgcGlwZVZhbCkgeyBwaXBlT25SZWFkXyA9IHBpcGVWYWw7IH0KKworICB2b2lkIHNldFBpcGVPbldyaXRlKGJvb2wgcGlwZVZhbCkgeyBwaXBlT25Xcml0ZV8gPSBwaXBlVmFsOyB9CisKKyAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgdWludDMyX3QgcmVhZEVuZCgpIHsKKworICAgIGlmIChwaXBlT25SZWFkXykgeworICAgICAgZHN0VHJhbnNfLT53cml0ZShyQnVmXywgclBvc18pOworICAgICAgZHN0VHJhbnNfLT5mbHVzaCgpOworICAgIH0KKworICAgIHNyY1RyYW5zXy0+cmVhZEVuZCgpOworCisgICAgLy8gSWYgcmVxdWVzdHMgYXJlIGJlaW5nIHBpcGVsaW5lZCwgY29weSBkb3duIG91ciByZWFkLWFoZWFkIGRhdGEsCisgICAgLy8gdGhlbiByZXNldCBvdXIgc3RhdGUuCisgICAgaW50IHJlYWRfYWhlYWQgPSByTGVuXyAtIHJQb3NfOworICAgIHVpbnQzMl90IGJ5dGVzID0gclBvc187CisgICAgbWVtY3B5KHJCdWZfLCByQnVmXyArIHJQb3NfLCByZWFkX2FoZWFkKTsKKyAgICByUG9zXyA9IDA7CisgICAgckxlbl8gPSByZWFkX2FoZWFkOworCisgICAgcmV0dXJuIGJ5dGVzOworICB9CisKKyAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgdWludDMyX3Qgd3JpdGVFbmQoKSB7CisgICAgaWYgKHBpcGVPbldyaXRlXykgeworICAgICAgZHN0VHJhbnNfLT53cml0ZSh3QnVmXywgd0xlbl8pOworICAgICAgZHN0VHJhbnNfLT5mbHVzaCgpOworICAgIH0KKyAgICByZXR1cm4gd0xlbl87CisgIH0KKworICB2b2lkIGZsdXNoKCk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRhcmdldFRyYW5zcG9ydCgpIHsgcmV0dXJuIGRzdFRyYW5zXzsgfQorCisgIC8qCisgICAqIE92ZXJyaWRlIFRUcmFuc3BvcnQgKl92aXJ0KCkgZnVuY3Rpb25zIHRvIGludm9rZSBvdXIgaW1wbGVtZW50YXRpb25zLgorICAgKiBXZSBjYW5ub3QgdXNlIFRWaXJ0dWFsVHJhbnNwb3J0IHRvIHByb3ZpZGUgdGhlc2UsIHNpbmNlIHdlIG5lZWQgdG8gaW5oZXJpdAorICAgKiB2aXJ0dWFsbHkgZnJvbSBUVHJhbnNwb3J0LgorICAgKi8KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHRoaXMtPnJlYWQoYnVmLCBsZW4pOyB9CisgIHZpcnR1YWwgdm9pZCB3cml0ZV92aXJ0KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHRoaXMtPndyaXRlKGJ1ZiwgbGVuKTsgfQorCitwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFuc187CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFuc187CisKKyAgdWludDhfdCogckJ1Zl87CisgIHVpbnQzMl90IHJCdWZTaXplXzsKKyAgdWludDMyX3QgclBvc187CisgIHVpbnQzMl90IHJMZW5fOworCisgIHVpbnQ4X3QqIHdCdWZfOworICB1aW50MzJfdCB3QnVmU2l6ZV87CisgIHVpbnQzMl90IHdMZW5fOworCisgIGJvb2wgcGlwZU9uUmVhZF87CisgIGJvb2wgcGlwZU9uV3JpdGVfOworfTsKKworLyoqCisgKiBXcmFwcyBhIHRyYW5zcG9ydCBpbnRvIGEgcGlwZWRUcmFuc3BvcnQgaW5zdGFuY2UuCisgKgorICovCitjbGFzcyBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRUcmFuc3BvcnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisgIFRQaXBlZFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKSB7CisgICAgaW5pdGlhbGl6ZVRhcmdldFRyYW5zcG9ydChkc3RUcmFucyk7CisgIH0KKyAgdmlydHVhbCB+VFBpcGVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisKKyAgLyoqCisgICAqIFdyYXBzIHRoZSBiYXNlIHRyYW5zcG9ydCBpbnRvIGEgcGlwZWQgdHJhbnNwb3J0LgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRQaXBlZFRyYW5zcG9ydChzcmNUcmFucywgZHN0VHJhbnNfKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6ZVRhcmdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpIHsKKyAgICBpZiAoZHN0VHJhbnNfLmdldCgpID09IE5VTEwpIHsKKyAgICAgIGRzdFRyYW5zXyA9IGRzdFRyYW5zOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBURXhjZXB0aW9uKCJUYXJnZXQgdHJhbnNwb3J0IGFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKKyAgICB9CisgIH0KKworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnNfOworfTsKKworLyoqCisgKiBUUGlwZWRGaWxlVHJhbnNwb3J0LiBUaGlzIGlzIGp1c3QgbGlrZSBhIFRUcmFuc3BvcnQsIGV4Y2VwdCB0aGF0CisgKiBpdCBpcyBhIHRlbXBsYXRpemVkIGNsYXNzLCBzbyB0aGF0IGNsaWVudHMgd2hvIHJlbHkgb24gYSBzcGVjaWZpYworICogVFRyYW5zcG9ydCBjYW4gc3RpbGwgYWNjZXNzIHRoZSBvcmlnaW5hbCB0cmFuc3BvcnQuCisgKgorICovCitjbGFzcyBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0IDogcHVibGljIFRQaXBlZFRyYW5zcG9ydCwgcHVibGljIFRGaWxlUmVhZGVyVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHNyY1RyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucyk7CisKKyAgflRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoKTsKKworICAvLyBUVHJhbnNwb3J0IGZ1bmN0aW9ucworICBib29sIGlzT3BlbigpOworICBib29sIHBlZWsoKTsKKyAgdm9pZCBvcGVuKCk7CisgIHZvaWQgY2xvc2UoKTsKKyAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB1aW50MzJfdCByZWFkRW5kKCk7CisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB1aW50MzJfdCB3cml0ZUVuZCgpOworICB2b2lkIGZsdXNoKCk7CisKKyAgLy8gVEZpbGVSZWFkZXJUcmFuc3BvcnQgZnVuY3Rpb25zCisgIGludDMyX3QgZ2V0UmVhZFRpbWVvdXQoKTsKKyAgdm9pZCBzZXRSZWFkVGltZW91dChpbnQzMl90IHJlYWRUaW1lb3V0KTsKKyAgdWludDMyX3QgZ2V0TnVtQ2h1bmtzKCk7CisgIHVpbnQzMl90IGdldEN1ckNodW5rKCk7CisgIHZvaWQgc2Vla1RvQ2h1bmsoaW50MzJfdCBjaHVuayk7CisgIHZvaWQgc2Vla1RvRW5kKCk7CisKKyAgLyoKKyAgICogT3ZlcnJpZGUgVFRyYW5zcG9ydCAqX3ZpcnQoKSBmdW5jdGlvbnMgdG8gaW52b2tlIG91ciBpbXBsZW1lbnRhdGlvbnMuCisgICAqIFdlIGNhbm5vdCB1c2UgVFZpcnR1YWxUcmFuc3BvcnQgdG8gcHJvdmlkZSB0aGVzZSwgc2luY2Ugd2UgbmVlZCB0byBpbmhlcml0CisgICAqIHZpcnR1YWxseSBmcm9tIFRUcmFuc3BvcnQuCisgICAqLworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gdGhpcy0+cmVhZChidWYsIGxlbik7IH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQWxsX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHRoaXMtPnJlYWRBbGwoYnVmLCBsZW4pOyB9CisgIHZpcnR1YWwgdm9pZCB3cml0ZV92aXJ0KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHRoaXMtPndyaXRlKGJ1ZiwgbGVuKTsgfQorCitwcm90ZWN0ZWQ6CisgIC8vIHNob3VsZG4ndCBiZSB1c2VkCisgIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFuc187Cit9OworCisvKioKKyAqIENyZWF0ZXMgYSBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0IGZyb20gYSBmaWxlcGF0aCBhbmQgYSBkZXN0aW5hdGlvbiB0cmFuc3BvcnQKKyAqCisgKi8KK2NsYXNzIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkgeworcHVibGljOgorICBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisgIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykKKyAgICA6IFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoZHN0VHJhbnMpIHt9CisgIHZpcnR1YWwgflRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5KCkge30KKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gcEZpbGVSZWFkZXJUcmFuc3BvcnQKKyAgICAgICAgPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRGaWxlUmVhZGVyVHJhbnNwb3J0PihzcmNUcmFucyk7CisgICAgaWYgKHBGaWxlUmVhZGVyVHJhbnNwb3J0LmdldCgpICE9IE5VTEwpIHsKKyAgICAgIHJldHVybiBnZXRGaWxlUmVhZGVyVHJhbnNwb3J0KHBGaWxlUmVhZGVyVHJhbnNwb3J0KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PigpOworICAgIH0KKyAgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gZ2V0RmlsZVJlYWRlclRyYW5zcG9ydCgKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gc3JjVHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PigKKyAgICAgICAgbmV3IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoc3JjVHJhbnMsIGRzdFRyYW5zXykpOworICB9Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRVVElMU19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYWNmNjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0LmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVklSVFVBTFRSQU5TUE9SVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UVklSVFVBTFRSQU5TUE9SVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0aGF0IHByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIFRUcmFuc3BvcnQgbWV0aG9kcy4KKyAqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIHJlYWQoKSwgcmVhZEFsbCgpLCB3cml0ZSgpLAorICogYm9ycm93KCkgYW5kIGNvbnN1bWUoKS4KKyAqCisgKiBJbiB0aGUgVFRyYW5zcG9ydCBiYXNlIGNsYXNzLCBlYWNoIG9mIHRoZXNlIG1ldGhvZHMgc2ltcGx5IGludm9rZXMgaXRzCisgKiB2aXJ0dWFsIGNvdW50ZXJwYXJ0LiAgVGhpcyBjbGFzcyBvdmVycmlkZXMgdGhlbSB0byBhbHdheXMgcGVyZm9ybSB0aGUKKyAqIGRlZmF1bHQgYmVoYXZpb3IsIHdpdGhvdXQgYSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwuCisgKgorICogVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIHNlcnZlIGFzIGEgYmFzZSBjbGFzcyBmb3IKKyAqIFRWaXJ0dWFsVHJhbnNwb3J0LCBhbmQgcHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24gaWYgb25lIG9mIGl0cyBzdWJjbGFzc2VzCisgKiBkb2VzIG5vdCBvdmVycmlkZSB0aGUgVFRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSBtZXRob2RzLiAgKFNpbmNlCisgKiBUVmlydHVhbFRyYW5zcG9ydDo6cmVhZF92aXJ0KCkgY2FsbHMgcmVhZCgpLCBhbmQgVFRyYW5zcG9ydDo6cmVhZCgpIGNhbGxzCisgKiByZWFkX3ZpcnQoKS4pCisgKi8KK2NsYXNzIFRUcmFuc3BvcnREZWZhdWx0cyA6IHB1YmxpYyBUVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgLyoKKyAgICogVFRyYW5zcG9ydCAqX3ZpcnQoKSBtZXRob2RzIHByb3ZpZGUgcmVhc29uYWJsZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucy4KKyAgICogSW52b2tlIHRoZW0gbm9uLXZpcnR1YWxseS4KKyAgICovCisgIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHRoaXMtPlRUcmFuc3BvcnQ6OnJlYWRfdmlydChidWYsIGxlbik7IH0KKyAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gdGhpcy0+VFRyYW5zcG9ydDo6cmVhZEFsbF92aXJ0KGJ1ZiwgbGVuKTsgfQorICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHRoaXMtPlRUcmFuc3BvcnQ6OndyaXRlX3ZpcnQoYnVmLCBsZW4pOyB9CisgIGNvbnN0IHVpbnQ4X3QqIGJvcnJvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsKKyAgICByZXR1cm4gdGhpcy0+VFRyYW5zcG9ydDo6Ym9ycm93X3ZpcnQoYnVmLCBsZW4pOworICB9CisgIHZvaWQgY29uc3VtZSh1aW50MzJfdCBsZW4pIHsgdGhpcy0+VFRyYW5zcG9ydDo6Y29uc3VtZV92aXJ0KGxlbik7IH0KKworcHJvdGVjdGVkOgorICBUVHJhbnNwb3J0RGVmYXVsdHMoKSB7fQorfTsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdG8gcHJvdmlkZSBwb2x5bW9ycGhpc20gZm9yIHN1YmNsYXNzZXMgb2YgVFRyYW5zcG9ydC4KKyAqCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgKl92aXJ0KCkgbWV0aG9kcyBvZiBUVHJhbnNwb3J0LCB0byBjYWxsIHRoZQorICogbm9uLXZpcnR1YWwgdmVyc2lvbnMgb2YgdGhlc2UgZnVuY3Rpb25zIGluIHRoZSBwcm9wZXIgc3ViY2xhc3MuCisgKgorICogVG8gZGVmaW5lIHlvdXIgb3duIHRyYW5zcG9ydCBjbGFzcyB1c2luZyBUVmlydHVhbFRyYW5zcG9ydDoKKyAqIDEpIERlcml2ZSB5b3VyIHN1YmNsYXNzIGZyb20gVFZpcnR1YWxUcmFuc3BvcnQ8eW91ciBjbGFzcz4KKyAqICAgIGUuZzogIGNsYXNzIE15VHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PE15VHJhbnNwb3J0PiB7CisgKiAyKSBQcm92aWRlIHlvdXIgb3duIGltcGxlbWVudGF0aW9ucyBvZiByZWFkKCksIHJlYWRBbGwoKSwgZXRjLgorICogICAgVGhlc2UgbWV0aG9kcyBzaG91bGQgYmUgbm9uLXZpcnR1YWwuCisgKgorICogVHJhbnNwb3J0IGltcGxlbWVudGF0aW9ucyB0aGF0IG5lZWQgdG8gdXNlIHZpcnR1YWwgaW5oZXJpdGFuY2Ugd2hlbgorICogaW5oZXJpdGluZyBmcm9tIFRUcmFuc3BvcnQgY2Fubm90IHVzZSBUVmlydHVhbFRyYW5zcG9ydC4KKyAqCisgKiBAYXV0aG9yIENoYWQgV2FsdGVycyA8Y2hhZEBwb3dlcnNldC5jb20+CisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBTdXBlcl8gPSBUVHJhbnNwb3J0RGVmYXVsdHM+CitjbGFzcyBUVmlydHVhbFRyYW5zcG9ydCA6IHB1YmxpYyBTdXBlcl8geworcHVibGljOgorICAvKgorICAgKiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhlICpfdmlydCgpIGZ1bmN0aW9ucywgdG8gY2FsbCB0aGUgc3ViY2xhc3MncworICAgKiBub24tdmlydHVhbCBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbi4KKyAgICovCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRyYW5zcG9ydF8qPih0aGlzKS0+cmVhZChidWYsIGxlbik7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRBbGxfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUcmFuc3BvcnRfKj4odGhpcyktPnJlYWRBbGwoYnVmLCBsZW4pOworICB9CisKKyAgdmlydHVhbCB2b2lkIHdyaXRlX3ZpcnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICBzdGF0aWNfY2FzdDxUcmFuc3BvcnRfKj4odGhpcyktPndyaXRlKGJ1ZiwgbGVuKTsKKyAgfQorCisgIHZpcnR1YWwgY29uc3QgdWludDhfdCogYm9ycm93X3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRyYW5zcG9ydF8qPih0aGlzKS0+Ym9ycm93KGJ1ZiwgbGVuKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBjb25zdW1lX3ZpcnQodWludDMyX3QgbGVuKSB7IHN0YXRpY19jYXN0PFRyYW5zcG9ydF8qPih0aGlzKS0+Y29uc3VtZShsZW4pOyB9CisKKyAgLyoKKyAgICogUHJvdmlkZSBhIGRlZmF1bHQgcmVhZEFsbCgpIGltcGxlbWVudGF0aW9uIHRoYXQgaW52b2tlcworICAgKiByZWFkKCkgbm9uLXZpcnR1YWxseS4KKyAgICoKKyAgICogTm90ZTogc3ViY2xhc3NlcyB0aGF0IHVzZSBUVmlydHVhbFRyYW5zcG9ydCB0byBkZXJpdmUgZnJvbSBhbm90aGVyCisgICAqIHRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbiAoaS5lLiwgbm90IFRUcmFuc3BvcnREZWZhdWx0cykgc2hvdWxkIGJld2FyZSB0aGF0CisgICAqIHRoaXMgbWF5IG92ZXJyaWRlIGFueSBub24tZGVmYXVsdCByZWFkQWxsKCkgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkKKyAgICogdGhlIHBhcmVudCB0cmFuc3BvcnQgY2xhc3MuICBUaGV5IG1heSBuZWVkIHRvIHJlZGVmaW5lIHJlYWRBbGwoKSB0byBjYWxsCisgICAqIHRoZSBjb3JyZWN0IHBhcmVudCBpbXBsZW1lbnRhdGlvbiwgaWYgZGVzaXJlZC4KKyAgICovCisgIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICBUcmFuc3BvcnRfKiB0cmFucyA9IHN0YXRpY19jYXN0PFRyYW5zcG9ydF8qPih0aGlzKTsKKyAgICByZXR1cm4gOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpyZWFkQWxsKCp0cmFucywgYnVmLCBsZW4pOworICB9CisKK3Byb3RlY3RlZDoKKyAgVFZpcnR1YWxUcmFuc3BvcnQoKSB7fQorCisgIC8qCisgICAqIFRlbXBsYXRpemVkIGNvbnN0cnVjdG9ycywgdG8gYWxsb3cgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgU3VwZXJfCisgICAqIGNvbnN0cnVjdG9yLiAgQ3VycmVudGx5IHdlIG9ubHkgc3VwcG9ydCAwLCAxLCBvciAyIGFyZ3VtZW50cywgYnV0CisgICAqIGFkZGl0aW9uYWwgdmVyc2lvbnMgY2FuIGJlIGFkZGVkIGFzIG5lZWRlZC4KKyAgICovCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdfPgorICBUVmlydHVhbFRyYW5zcG9ydChBcmdfIGNvbnN0JiBhcmcpCisgICAgOiBTdXBlcl8oYXJnKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmcxXywgdHlwZW5hbWUgQXJnMl8+CisgIFRWaXJ0dWFsVHJhbnNwb3J0KEFyZzFfIGNvbnN0JiBhMSwgQXJnMl8gY29uc3QmIGEyKQorICAgIDogU3VwZXJfKGExLCBhMikge30KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFZJUlRVQUxUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQyNmRjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuY3BwCkBAIC0wLDAgKzEsNDAyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaD4KKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLy8gRG9uJ3QgY2FsbCB0aGlzIG91dHNpZGUgb2YgdGhlIGNvbnN0cnVjdG9yLgordm9pZCBUWmxpYlRyYW5zcG9ydDo6aW5pdFpsaWIoKSB7CisgIGludCBydjsKKyAgYm9vbCByX2luaXQgPSBmYWxzZTsKKyAgdHJ5IHsKKyAgICByc3RyZWFtXyA9IG5ldyB6X3N0cmVhbTsKKyAgICB3c3RyZWFtXyA9IG5ldyB6X3N0cmVhbTsKKworICAgIHJzdHJlYW1fLT56YWxsb2MgPSBaX05VTEw7CisgICAgd3N0cmVhbV8tPnphbGxvYyA9IFpfTlVMTDsKKyAgICByc3RyZWFtXy0+emZyZWUgPSBaX05VTEw7CisgICAgd3N0cmVhbV8tPnpmcmVlID0gWl9OVUxMOworICAgIHJzdHJlYW1fLT5vcGFxdWUgPSBaX05VTEw7CisgICAgd3N0cmVhbV8tPm9wYXF1ZSA9IFpfTlVMTDsKKworICAgIHJzdHJlYW1fLT5uZXh0X2luID0gY3JidWZfOworICAgIHdzdHJlYW1fLT5uZXh0X2luID0gdXdidWZfOworICAgIHJzdHJlYW1fLT5uZXh0X291dCA9IHVyYnVmXzsKKyAgICB3c3RyZWFtXy0+bmV4dF9vdXQgPSBjd2J1Zl87CisgICAgcnN0cmVhbV8tPmF2YWlsX2luID0gMDsKKyAgICB3c3RyZWFtXy0+YXZhaWxfaW4gPSAwOworICAgIHJzdHJlYW1fLT5hdmFpbF9vdXQgPSB1cmJ1Zl9zaXplXzsKKyAgICB3c3RyZWFtXy0+YXZhaWxfb3V0ID0gY3didWZfc2l6ZV87CisKKyAgICBydiA9IGluZmxhdGVJbml0KHJzdHJlYW1fKTsKKyAgICBjaGVja1psaWJSdihydiwgcnN0cmVhbV8tPm1zZyk7CisKKyAgICAvLyBIYXZlIHRvIHNldCB0aGlzIGZsYWcgc28gd2Uga25vdyB3aGV0aGVyIHRvIGRlLWluaXRpYWxpemUuCisgICAgcl9pbml0ID0gdHJ1ZTsKKworICAgIHJ2ID0gZGVmbGF0ZUluaXQod3N0cmVhbV8sIGNvbXBfbGV2ZWxfKTsKKyAgICBjaGVja1psaWJSdihydiwgd3N0cmVhbV8tPm1zZyk7CisgIH0KKworICBjYXRjaCAoLi4uKSB7CisgICAgaWYgKHJfaW5pdCkgeworICAgICAgcnYgPSBpbmZsYXRlRW5kKHJzdHJlYW1fKTsKKyAgICAgIGNoZWNrWmxpYlJ2Tm90aHJvdyhydiwgcnN0cmVhbV8tPm1zZyk7CisgICAgfQorICAgIC8vIFRoZXJlIGlzIG5vIHdheSB3ZSBjYW4gZ2V0IGhlcmUgaWYgd3N0cmVhbV8gd2FzIGluaXRpYWxpemVkLgorCisgICAgdGhyb3c7CisgIH0KK30KKworaW5saW5lIHZvaWQgVFpsaWJUcmFuc3BvcnQ6OmNoZWNrWmxpYlJ2KGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHsKKyAgaWYgKHN0YXR1cyAhPSBaX09LKSB7CisgICAgdGhyb3cgVFpsaWJUcmFuc3BvcnRFeGNlcHRpb24oc3RhdHVzLCBtZXNzYWdlKTsKKyAgfQorfQorCitpbmxpbmUgdm9pZCBUWmxpYlRyYW5zcG9ydDo6Y2hlY2tabGliUnZOb3Rocm93KGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHsKKyAgaWYgKHN0YXR1cyAhPSBaX09LKSB7CisgICAgc3RyaW5nIG91dHB1dCA9ICJUWmxpYlRyYW5zcG9ydDogemxpYiBmYWlsdXJlIGluIGRlc3RydWN0b3I6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBUWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbjo6ZXJyb3JNZXNzYWdlKHN0YXR1cywgbWVzc2FnZSk7CisgICAgR2xvYmFsT3V0cHV0KG91dHB1dC5jX3N0cigpKTsKKyAgfQorfQorCitUWmxpYlRyYW5zcG9ydDo6flRabGliVHJhbnNwb3J0KCkgeworICBpbnQgcnY7CisgIHJ2ID0gaW5mbGF0ZUVuZChyc3RyZWFtXyk7CisgIGNoZWNrWmxpYlJ2Tm90aHJvdyhydiwgcnN0cmVhbV8tPm1zZyk7CisKKyAgcnYgPSBkZWZsYXRlRW5kKHdzdHJlYW1fKTsKKyAgLy8gWl9EQVRBX0VSUk9SIG1heSBiZSByZXR1cm5lZCBpZiB0aGUgY2FsbGVyIGhhcyB3cml0dGVuIGRhdGEsIGJ1dCBub3QKKyAgLy8gY2FsbGVkIGZsdXNoKCkgdG8gYWN0dWFsbHkgZmluaXNoIHdyaXRpbmcgdGhlIGRhdGEgb3V0IHRvIHRoZSB1bmRlcmx5aW5nCisgIC8vIHRyYW5zcG9ydC4gIFRoZSBkZWZpbmVkIFRUcmFuc3BvcnQgYmVoYXZpb3IgaW4gdGhpcyBjYXNlIGlzIHRoYXQgdGhpcyBkYXRhCisgIC8vIG1heSBiZSBkaXNjYXJkZWQsIHNvIHdlIGlnbm9yZSB0aGUgZXJyb3IgYW5kIHNpbGVudGx5IGRpc2NhcmQgdGhlIGRhdGEuCisgIC8vIEZvciBvdGhlciBlcnJvcywgbG9nIGEgbWVzc2FnZS4KKyAgaWYgKHJ2ICE9IFpfREFUQV9FUlJPUikgeworICAgIGNoZWNrWmxpYlJ2Tm90aHJvdyhydiwgd3N0cmVhbV8tPm1zZyk7CisgIH0KKworICBkZWxldGVbXSB1cmJ1Zl87CisgIGRlbGV0ZVtdIGNyYnVmXzsKKyAgZGVsZXRlW10gdXdidWZfOworICBkZWxldGVbXSBjd2J1Zl87CisgIGRlbGV0ZSByc3RyZWFtXzsKKyAgZGVsZXRlIHdzdHJlYW1fOworfQorCitib29sIFRabGliVHJhbnNwb3J0Ojppc09wZW4oKSB7CisgIHJldHVybiAocmVhZEF2YWlsKCkgPiAwKSB8fCAocnN0cmVhbV8tPmF2YWlsX2luID4gMCkgfHwgdHJhbnNwb3J0Xy0+aXNPcGVuKCk7Cit9CisKK2Jvb2wgVFpsaWJUcmFuc3BvcnQ6OnBlZWsoKSB7CisgIHJldHVybiAocmVhZEF2YWlsKCkgPiAwKSB8fCAocnN0cmVhbV8tPmF2YWlsX2luID4gMCkgfHwgdHJhbnNwb3J0Xy0+cGVlaygpOworfQorCisvLyBSRUFESU5HIFNUUkFURUdZCisvLworLy8gV2UgaGF2ZSB0d28gYnVmZmVycyBmb3IgcmVhZGluZzogb25lIGNvbnRhaW5pbmcgdGhlIGNvbXByZXNzZWQgZGF0YSAoY3JidWZfKQorLy8gYW5kIG9uZSBjb250YWluaW5nIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAodXJidWZfKS4gIFdoZW4gcmVhZCBpcyBjYWxsZWQsCisvLyB3ZSByZXBlYXQgdGhlIGZvbGxvd2luZyBzdGVwcyB1bnRpbCB3ZSBoYXZlIHNhdGlzZmllZCB0aGUgcmVxdWVzdDoKKy8vIC0gQ29weSBkYXRhIGZyb20gdXJidWZfIGludG8gdGhlIGNhbGxlcidzIGJ1ZmZlci4KKy8vIC0gSWYgd2UgaGFkIGVub3VnaCwgcmV0dXJuLgorLy8gLSBJZiB1cmJ1Zl8gaXMgZW1wdHksIHJlYWQgc29tZSBkYXRhIGludG8gaXQgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisvLyAtIEluZmxhdGUgZGF0YSBmcm9tIGNyYnVmXyBpbnRvIHVyYnVmXy4KKy8vCisvLyBJbiBzdGFuZGFsb25lIG9iamVjdHMsIHdlIHNldCBpbnB1dF9lbmRlZF8gdG8gdHJ1ZSB3aGVuIGluZmxhdGUgcmV0dXJucworLy8gWl9TVFJFQU1fRU5ELiAgVGhpcyBhbGxvd3MgdG8gbWFrZSBzdXJlIHRoYXQgYSBjaGVja3N1bSB3YXMgdmVyaWZpZWQuCisKK2lubGluZSBpbnQgVFpsaWJUcmFuc3BvcnQ6OnJlYWRBdmFpbCgpIHsKKyAgcmV0dXJuIHVyYnVmX3NpemVfIC0gcnN0cmVhbV8tPmF2YWlsX291dCAtIHVycG9zXzsKK30KKwordWludDMyX3QgVFpsaWJUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgdWludDMyX3QgbmVlZCA9IGxlbjsKKworICAvLyBUT0RPKGRyZWlzcyk6IFNraXAgdXJidWYgb24gYmlnIHJlYWRzLgorCisgIHdoaWxlICh0cnVlKSB7CisgICAgLy8gQ29weSBvdXQgd2hhdGV2ZXIgd2UgaGF2ZSBhdmFpbGFibGUsIHRoZW4gZ2l2ZSB0aGVtIHRoZSBtaW4gb2YKKyAgICAvLyB3aGF0IHdlIGhhdmUgYW5kIHdoYXQgdGhleSB3YW50LCB0aGVuIGFkdmFuY2UgaW5kaWNlcy4KKyAgICBpbnQgZ2l2ZSA9IChzdGQ6Om1pbikoKHVpbnQzMl90KXJlYWRBdmFpbCgpLCBuZWVkKTsKKyAgICBtZW1jcHkoYnVmLCB1cmJ1Zl8gKyB1cnBvc18sIGdpdmUpOworICAgIG5lZWQgLT0gZ2l2ZTsKKyAgICBidWYgKz0gZ2l2ZTsKKyAgICB1cnBvc18gKz0gZ2l2ZTsKKworICAgIC8vIElmIHRoZXkgd2VyZSBzYXRpc2ZpZWQsIHdlIGFyZSBkb25lLgorICAgIGlmIChuZWVkID09IDApIHsKKyAgICAgIHJldHVybiBsZW47CisgICAgfQorCisgICAgLy8gSWYgd2Ugd2lsbCBuZWVkIHRvIHJlYWQgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdG8gZ2V0IG1vcmUgZGF0YSwKKyAgICAvLyBidXQgd2UgYWxyZWFkeSBoYXZlIHNvbWUgZGF0YSBhdmFpbGFibGUsIHJldHVybiBpdCBub3cuICBSZWFkaW5nIGZyb20KKyAgICAvLyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgbWF5IGJsb2NrLCBhbmQgcmVhZCgpIGlzIG9ubHkgYWxsb3dlZCB0byBibG9jaworICAgIC8vIHdoZW4gbm8gZGF0YSBpcyBhdmFpbGFibGUuCisgICAgaWYgKG5lZWQgPCBsZW4gJiYgcnN0cmVhbV8tPmF2YWlsX2luID09IDApIHsKKyAgICAgIHJldHVybiBsZW4gLSBuZWVkOworICAgIH0KKworICAgIC8vIElmIHdlIGdldCB0byB0aGlzIHBvaW50LCB3ZSBuZWVkIHRvIGdldCBzb21lIG1vcmUgZGF0YS4KKworICAgIC8vIElmIHpsaWIgaGFzIHJlcG9ydGVkIHRoZSBlbmQgb2YgYSBzdHJlYW0sIHdlIGNhbid0IHJlYWxseSBkbyBhbnkgbW9yZS4KKyAgICBpZiAoaW5wdXRfZW5kZWRfKSB7CisgICAgICByZXR1cm4gbGVuIC0gbmVlZDsKKyAgICB9CisKKyAgICAvLyBUaGUgdW5jb21wcmVzc2VkIHJlYWQgYnVmZmVyIGlzIGVtcHR5LCBzbyByZXNldCB0aGUgc3RyZWFtIGZpZWxkcy4KKyAgICByc3RyZWFtXy0+bmV4dF9vdXQgPSB1cmJ1Zl87CisgICAgcnN0cmVhbV8tPmF2YWlsX291dCA9IHVyYnVmX3NpemVfOworICAgIHVycG9zXyA9IDA7CisKKyAgICAvLyBDYWxsIGluZmxhdGUoKSB0byB1bmNvbXByZXNzIHNvbWUgbW9yZSBkYXRhCisgICAgaWYgKCFyZWFkRnJvbVpsaWIoKSkgeworICAgICAgLy8gbm8gZGF0YSBhdmFpbGFibGUgZnJvbSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAgcmV0dXJuIGxlbiAtIG5lZWQ7CisgICAgfQorCisgICAgLy8gT2theS4gIFRoZSByZWFkIGJ1ZmZlciBzaG91bGQgaGF2ZSB3aGF0ZXZlciB3ZSBjYW4gZ2l2ZSBpdCBub3cuCisgICAgLy8gTG9vcCBiYWNrIHRvIHRoZSBzdGFydCBhbmQgdHJ5IHRvIGdpdmUgc29tZSBtb3JlLgorICB9Cit9CisKK2Jvb2wgVFpsaWJUcmFuc3BvcnQ6OnJlYWRGcm9tWmxpYigpIHsKKyAgYXNzZXJ0KCFpbnB1dF9lbmRlZF8pOworCisgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgY29tcHJlc3NlZCBkYXRhIGF2YWlsYWJsZSwKKyAgLy8gcmVhZCBzb21lIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICBpZiAocnN0cmVhbV8tPmF2YWlsX2luID09IDApIHsKKyAgICB1aW50MzJfdCBnb3QgPSB0cmFuc3BvcnRfLT5yZWFkKGNyYnVmXywgY3JidWZfc2l6ZV8pOworICAgIGlmIChnb3QgPT0gMCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByc3RyZWFtXy0+bmV4dF9pbiA9IGNyYnVmXzsKKyAgICByc3RyZWFtXy0+YXZhaWxfaW4gPSBnb3Q7CisgIH0KKworICAvLyBXZSBoYXZlIHNvbWUgY29tcHJlc3NlZCBkYXRhIG5vdy4gIFVuY29tcHJlc3MgaXQuCisgIGludCB6bGliX3J2ID0gaW5mbGF0ZShyc3RyZWFtXywgWl9TWU5DX0ZMVVNIKTsKKworICBpZiAoemxpYl9ydiA9PSBaX1NUUkVBTV9FTkQpIHsKKyAgICBpbnB1dF9lbmRlZF8gPSB0cnVlOworICB9IGVsc2UgeworICAgIGNoZWNrWmxpYlJ2KHpsaWJfcnYsIHJzdHJlYW1fLT5tc2cpOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFdSSVRJTkcgU1RSQVRFR1kKKy8vCisvLyBXZSBidWZmZXIgdXAgc21hbGwgd3JpdGVzIGJlZm9yZSBzZW5kaW5nIHRoZW0gdG8gemxpYiwgc28gb3VyIGxvZ2ljIGlzOgorLy8gLSBJcyB0aGUgd3JpdGUgYmlnPworLy8gICAtIFNlbmQgdGhlIGJ1ZmZlciB0byB6bGliLgorLy8gICAtIFNlbmQgdGhpcyBkYXRhIHRvIHpsaWIuCisvLyAtIElzIHRoZSB3cml0ZSBzbWFsbD8KKy8vICAgLSBJcyB0aGVyZSBpbnN1ZmZpY2llbnQgc3BhY2UgaW4gdGhlIGJ1ZmZlciBmb3IgaXQ/CisvLyAgICAgLSBTZW5kIHRoZSBidWZmZXIgdG8gemxpYi4KKy8vICAgLSBDb3B5IHRoZSBkYXRhIHRvIHRoZSBidWZmZXIuCisvLworLy8gV2UgaGF2ZSB0d28gYnVmZmVycyBmb3Igd3JpdGluZyBhbHNvOiB0aGUgdW5jb21wcmVzc2VkIGJ1ZmZlciAobWVudGlvbmVkCisvLyBhYm92ZSkgYW5kIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4gIFdoZW4gc2VuZGluZyBkYXRhIHRvIHpsaWIgd2UgbG9vcCBvdmVyCisvLyB0aGUgZm9sbG93aW5nIHVudGlsIHRoZSBzb3VyY2UgKHVuY29tcHJlc3NlZCBidWZmZXIgb3IgYmlnIHdyaXRlKSBpcyBlbXB0eToKKy8vIC0gSXMgdGhlcmUgbm8gbW9yZSBzcGFjZSBpbiB0aGUgY29tcHJlc3NlZCBidWZmZXI/CisvLyAgIC0gV3JpdGUgdGhlIGNvbXByZXNzZWQgYnVmZmVyIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKy8vIC0gRGVmbGF0ZSBmcm9tIHRoZSBzb3VyY2UgaW50byB0aGUgY29tcHJlc3NlZCBidWZmZXIuCisKK3ZvaWQgVFpsaWJUcmFuc3BvcnQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGlmIChvdXRwdXRfZmluaXNoZWRfKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywgIndyaXRlKCkgY2FsbGVkIGFmdGVyIGZpbmlzaCgpIik7CisgIH0KKworICAvLyB6bGliJ3MgImRlZmxhdGUiIGZ1bmN0aW9uIGhhcyBlbm91Z2ggbG9naWMgaW4gaXQgdGhhdCBJIHRoaW5rCisgIC8vIHdlJ3JlIGJldHRlciBvZmYgKHBlcmZvcm1hbmNlLXdpc2UpIGJ1ZmZlcmluZyB1cCBzbWFsbCB3cml0ZXMuCisgIGlmIChsZW4gPiBNSU5fRElSRUNUX0RFRkxBVEVfU0laRSkgeworICAgIGZsdXNoVG9abGliKHV3YnVmXywgdXdwb3NfLCBaX05PX0ZMVVNIKTsKKyAgICB1d3Bvc18gPSAwOworICAgIGZsdXNoVG9abGliKGJ1ZiwgbGVuLCBaX05PX0ZMVVNIKTsKKyAgfSBlbHNlIGlmIChsZW4gPiAwKSB7CisgICAgaWYgKHV3YnVmX3NpemVfIC0gdXdwb3NfIDwgbGVuKSB7CisgICAgICBmbHVzaFRvWmxpYih1d2J1Zl8sIHV3cG9zXywgWl9OT19GTFVTSCk7CisgICAgICB1d3Bvc18gPSAwOworICAgIH0KKyAgICBtZW1jcHkodXdidWZfICsgdXdwb3NfLCBidWYsIGxlbik7CisgICAgdXdwb3NfICs9IGxlbjsKKyAgfQorfQorCit2b2lkIFRabGliVHJhbnNwb3J0OjpmbHVzaCgpIHsKKyAgaWYgKG91dHB1dF9maW5pc2hlZF8pIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLCAiZmx1c2goKSBjYWxsZWQgYWZ0ZXIgZmluaXNoKCkiKTsKKyAgfQorCisgIGZsdXNoVG9abGliKHV3YnVmXywgdXdwb3NfLCBaX0JMT0NLKTsKKyAgdXdwb3NfID0gMDsKKworICBpZih3c3RyZWFtXy0+YXZhaWxfb3V0IDwgNil7CisgICAgdHJhbnNwb3J0Xy0+d3JpdGUoY3didWZfLCBjd2J1Zl9zaXplXyAtIHdzdHJlYW1fLT5hdmFpbF9vdXQpOworICAgIHdzdHJlYW1fLT5uZXh0X291dCA9IGN3YnVmXzsKKyAgICB3c3RyZWFtXy0+YXZhaWxfb3V0ID0gY3didWZfc2l6ZV87CisgIH0KKworICBmbHVzaFRvVHJhbnNwb3J0KFpfRlVMTF9GTFVTSCk7Cit9CisKK3ZvaWQgVFpsaWJUcmFuc3BvcnQ6OmZpbmlzaCgpIHsKKyAgaWYgKG91dHB1dF9maW5pc2hlZF8pIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLCAiZmluaXNoKCkgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIik7CisgIH0KKworICBmbHVzaFRvVHJhbnNwb3J0KFpfRklOSVNIKTsKK30KKwordm9pZCBUWmxpYlRyYW5zcG9ydDo6Zmx1c2hUb1RyYW5zcG9ydChpbnQgZmx1c2gpIHsKKyAgLy8gd3JpdGUgcGVuZGluZyBkYXRhIGluIHV3YnVmXyB0byB6bGliCisgIGZsdXNoVG9abGliKHV3YnVmXywgdXdwb3NfLCBmbHVzaCk7CisgIHV3cG9zXyA9IDA7CisKKyAgLy8gd3JpdGUgYWxsIGF2YWlsYWJsZSBkYXRhIGZyb20gemxpYiB0byB0aGUgdHJhbnNwb3J0CisgIHRyYW5zcG9ydF8tPndyaXRlKGN3YnVmXywgY3didWZfc2l6ZV8gLSB3c3RyZWFtXy0+YXZhaWxfb3V0KTsKKyAgd3N0cmVhbV8tPm5leHRfb3V0ID0gY3didWZfOworICB3c3RyZWFtXy0+YXZhaWxfb3V0ID0gY3didWZfc2l6ZV87CisKKyAgLy8gZmx1c2ggdGhlIHRyYW5zcG9ydAorICB0cmFuc3BvcnRfLT5mbHVzaCgpOworfQorCit2b2lkIFRabGliVHJhbnNwb3J0OjpmbHVzaFRvWmxpYihjb25zdCB1aW50OF90KiBidWYsIGludCBsZW4sIGludCBmbHVzaCkgeworICB3c3RyZWFtXy0+bmV4dF9pbiA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KGJ1Zik7CisgIHdzdHJlYW1fLT5hdmFpbF9pbiA9IGxlbjsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICgoZmx1c2ggPT0gWl9OT19GTFVTSCB8fCBmbHVzaCA9PSBaX0JMT0NLKSAmJiB3c3RyZWFtXy0+YXZhaWxfaW4gPT0gMCkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gSWYgb3VyIG91cHV0IGJ1ZmZlciBpcyBmdWxsLCBmbHVzaCB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgICAgaWYgKHdzdHJlYW1fLT5hdmFpbF9vdXQgPT0gMCkgeworICAgICAgdHJhbnNwb3J0Xy0+d3JpdGUoY3didWZfLCBjd2J1Zl9zaXplXyk7CisgICAgICB3c3RyZWFtXy0+bmV4dF9vdXQgPSBjd2J1Zl87CisgICAgICB3c3RyZWFtXy0+YXZhaWxfb3V0ID0gY3didWZfc2l6ZV87CisgICAgfQorCisgICAgaW50IHpsaWJfcnYgPSBkZWZsYXRlKHdzdHJlYW1fLCBmbHVzaCk7CisKKyAgICBpZiAoZmx1c2ggPT0gWl9GSU5JU0ggJiYgemxpYl9ydiA9PSBaX1NUUkVBTV9FTkQpIHsKKyAgICAgIGFzc2VydCh3c3RyZWFtXy0+YXZhaWxfaW4gPT0gMCk7CisgICAgICBvdXRwdXRfZmluaXNoZWRfID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNoZWNrWmxpYlJ2KHpsaWJfcnYsIHdzdHJlYW1fLT5tc2cpOworCisgICAgaWYgKChmbHVzaCA9PSBaX1NZTkNfRkxVU0ggfHwgZmx1c2ggPT0gWl9GVUxMX0ZMVVNIKSAmJiB3c3RyZWFtXy0+YXZhaWxfaW4gPT0gMAorICAgICAgICAmJiB3c3RyZWFtXy0+YXZhaWxfb3V0ICE9IDApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitjb25zdCB1aW50OF90KiBUWmxpYlRyYW5zcG9ydDo6Ym9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgeworICAodm9pZClidWY7CisgIC8vIERvbid0IHRyeSB0byBiZSBjbGV2ZXIgd2l0aCBzaGlmdGluZyBidWZmZXJzLgorICAvLyBJZiB3ZSBoYXZlIGVub3VnaCBkYXRhLCBnaXZlIGEgcG9pbnRlciB0byBpdCwKKyAgLy8gb3RoZXJ3aXNlIGxldCB0aGUgcHJvdGNvbCB1c2UgaXRzIHNsb3cgcGF0aC4KKyAgaWYgKHJlYWRBdmFpbCgpID49IChpbnQpKmxlbikgeworICAgICpsZW4gPSAodWludDMyX3QpcmVhZEF2YWlsKCk7CisgICAgcmV0dXJuIHVyYnVmXyArIHVycG9zXzsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBUWmxpYlRyYW5zcG9ydDo6Y29uc3VtZSh1aW50MzJfdCBsZW4pIHsKKyAgaWYgKHJlYWRBdmFpbCgpID49IChpbnQpbGVuKSB7CisgICAgdXJwb3NfICs9IGxlbjsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLCAiY29uc3VtZSBkaWQgbm90IGZvbGxvdyBhIGJvcnJvdy4iKTsKKyAgfQorfQorCit2b2lkIFRabGliVHJhbnNwb3J0Ojp2ZXJpZnlDaGVja3N1bSgpIHsKKyAgLy8gSWYgemxpYiBoYXMgYWxyZWFkeSByZXBvcnRlZCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0sCisgIC8vIGl0IGhhcyB2ZXJpZmllZCB0aGUgY2hlY2tzdW0uCisgIGlmIChpbnB1dF9lbmRlZF8pIHsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIHJlYWRpbmcgaXMgY29tcGxldGUuCisgIC8vIElmIHRoZSBjYWxsZXIgc3RpbGwgaGFzIHVucmVhZCBkYXRhLCB0aHJvdyBhbiBleGNlcHRpb24uCisgIGlmIChyZWFkQXZhaWwoKSA+IDApIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcmlmeUNoZWNrc3VtKCkgY2FsbGVkIGJlZm9yZSBlbmQgb2YgemxpYiBzdHJlYW0iKTsKKyAgfQorCisgIC8vIFJlc2V0IHRoZSByc3RyZWFtIGZpZWxkcywgaW4gY2FzZSBhdmFpbF9vdXQgaXMgMC4KKyAgLy8gKFNpbmNlIHJlYWRBdmFpbCgpIGlzIDAsIHdlIGtub3cgdGhlcmUgaXMgbm8gdW5yZWFkIGRhdGEgaW4gdXJidWZfKQorICByc3RyZWFtXy0+bmV4dF9vdXQgPSB1cmJ1Zl87CisgIHJzdHJlYW1fLT5hdmFpbF9vdXQgPSB1cmJ1Zl9zaXplXzsKKyAgdXJwb3NfID0gMDsKKworICAvLyBDYWxsIGluZmxhdGUoKQorICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjaGVja3N1bSBpcyBiYWQuCisgIGJvb2wgcGVyZm9ybWVkX2luZmxhdGUgPSByZWFkRnJvbVpsaWIoKTsKKyAgaWYgKCFwZXJmb3JtZWRfaW5mbGF0ZSkgeworICAgIC8vIFdlIG5lZWRlZCB0byByZWFkIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LCBhbmQgdGhlIHJlYWQoKSBjYWxsCisgICAgLy8gcmV0dXJuZWQgMC4KKyAgICAvLworICAgIC8vIE5vdCBhbGwgVFRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMgYmVoYXZlIHRoZSBzYW1lIHdheSBoZXJlLCBzbyB3ZSdsbAorICAgIC8vIGVuZCB1cCB3aXRoIGRpZmZlcmVudCBiZWhhdmlvciBkZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICAgIC8vCisgICAgLy8gRm9yIHNvbWUgdHJhbnNwb3J0cyAoZS5nLiwgVEZEVHJhbnNwb3J0KSwgcmVhZCgpIGJsb2NrcyBpZiBubyBtb3JlIGRhdGEKKyAgICAvLyBpcyBhdmFpbGFibGUuICBUaGV5IG9ubHkgcmV0dXJuIDAgaWYgRU9GIGhhcyBiZWVuIHJlYWNoZWQsIG9yIGlmIHRoZQorICAgIC8vIHJlbW90ZSBlbmRwb2ludCBoYXMgY2xvc2VkIHRoZSBjb25uZWN0aW9uLiAgRm9yIHRob3NlIHRyYW5zcG9ydHMsCisgICAgLy8gdmVyaWZ5Q2hlY2tzdW0oKSB3aWxsIGJsb2NrIHVudGlsIHRoZSBjaGVja3N1bSBiZWNvbWVzIGF2YWlsYWJsZS4KKyAgICAvLworICAgIC8vIE90aGVyIHRyYW5zcG9ydCB0eXBlcyAoZS5nLiwgVE1lbW9yeUJ1ZmZlcikgYWx3YXlzIHJldHVybiAwIGltbWVkaWF0ZWx5CisgICAgLy8gaWYgbm8gbW9yZSBkYXRhIGlzIGF2YWlsYWJsZS4gIEZvciB0aG9zZSB0cmFuc3BvcnQgdHlwZXMsIHZlcmlmeUNoZWNrc3VtCisgICAgLy8gd2lsbCByYWlzZSB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbiBpZiB0aGUgY2hlY2tzdW0gaXMgbm90IGF2YWlsYWJsZSBmcm9tCisgICAgLy8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHlldC4KKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoZWNrc3VtIG5vdCBhdmFpbGFibGUgeWV0IGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJpZnlDaGVja3N1bSgpIik7CisgIH0KKworICAvLyBJZiBpbnB1dF9lbmRlZF8gaXMgdHJ1ZSBub3csIHRoZSBjaGVja3N1bSBoYXMgYmVlbiB2ZXJpZmllZAorICBpZiAoaW5wdXRfZW5kZWRfKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gVGhlIGNhbGxlciBpbnZva2VkIHVzIGJlZm9yZSB0aGUgYWN0dWFsIGVuZCBvZiB0aGUgZGF0YSBzdHJlYW0KKyAgYXNzZXJ0KHJzdHJlYW1fLT5hdmFpbF9vdXQgPCB1cmJ1Zl9zaXplXyk7CisgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcmlmeUNoZWNrc3VtKCkgY2FsbGVkIGJlZm9yZSBlbmQgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ6bGliIHN0cmVhbSIpOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ1ZWM0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaApAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RaTElCVFJBTlNQT1JUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RaTElCVFJBTlNQT1JUX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVFRvU3RyaW5nLmg+CisjaW5jbHVkZSA8emxpYi5oPgorCitzdHJ1Y3Qgel9zdHJlYW1fczsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitjbGFzcyBUWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbiA6IHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKK3B1YmxpYzoKKyAgVFpsaWJUcmFuc3BvcnRFeGNlcHRpb24oaW50IHN0YXR1cywgY29uc3QgY2hhciogbXNnKQorICAgIDogVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUiwgZXJyb3JNZXNzYWdlKHN0YXR1cywgbXNnKSksCisgICAgICB6bGliX3N0YXR1c18oc3RhdHVzKSwKKyAgICAgIHpsaWJfbXNnXyhtc2cgPT0gTlVMTCA/ICIobnVsbCkiIDogbXNnKSB7fQorCisgIHZpcnR1YWwgflRabGliVHJhbnNwb3J0RXhjZXB0aW9uKCkgbm9leGNlcHQge30KKworICBpbnQgZ2V0WmxpYlN0YXR1cygpIHsgcmV0dXJuIHpsaWJfc3RhdHVzXzsgfQorICBzdGQ6OnN0cmluZyBnZXRabGliTWVzc2FnZSgpIHsgcmV0dXJuIHpsaWJfbXNnXzsgfQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBlcnJvck1lc3NhZ2UoaW50IHN0YXR1cywgY29uc3QgY2hhciogbXNnKSB7CisgICAgc3RkOjpzdHJpbmcgcnYgPSAiemxpYiBlcnJvcjogIjsKKyAgICBpZiAobXNnKSB7CisgICAgICBydiArPSBtc2c7CisgICAgfSBlbHNlIHsKKyAgICAgIHJ2ICs9ICIobm8gbWVzc2FnZSkiOworICAgIH0KKyAgICBydiArPSAiIChzdGF0dXMgPSAiOworICAgIHJ2ICs9IHRvX3N0cmluZyhzdGF0dXMpOworICAgIHJ2ICs9ICIpIjsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICBpbnQgemxpYl9zdGF0dXNfOworICBzdGQ6OnN0cmluZyB6bGliX21zZ187Cit9OworCisvKioKKyAqIFRoaXMgdHJhbnNwb3J0IHVzZXMgemxpYiB0byBjb21wcmVzcyBvbiB3cml0ZSBhbmQgZGVjb21wcmVzcyBvbiByZWFkCisgKgorICogVE9ETyhkcmVpc3MpOiBEb24ndCBkbyBhbiBleHRyYSBjb3B5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgaWYKKyAqICAgICAgICAgICAgICAgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGlzIFRCdWZmZXJlZCBvciBUTWVtb3J5LgorICoKKyAqLworY2xhc3MgVFpsaWJUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VFpsaWJUcmFuc3BvcnQ+IHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIEBwYXJhbSB0cmFuc3BvcnQgICAgVGhlIHRyYW5zcG9ydCB0byByZWFkIGNvbXByZXNzZWQgZGF0YSBmcm9tCisgICAqICAgICAgICAgICAgICAgICAgICAgYW5kIHdyaXRlIGNvbXByZXNzZWQgZGF0YSB0by4KKyAgICogQHBhcmFtIHVyYnVmX3NpemUgICBVbmNvbXByZXNzZWQgYnVmZmVyIHNpemUgZm9yIHJlYWRpbmcuCisgICAqIEBwYXJhbSBjcmJ1Zl9zaXplICAgQ29tcHJlc3NlZCBidWZmZXIgc2l6ZSBmb3IgcmVhZGluZy4KKyAgICogQHBhcmFtIHV3YnVmX3NpemUgICBVbmNvbXByZXNzZWQgYnVmZmVyIHNpemUgZm9yIHdyaXRpbmcuCisgICAqIEBwYXJhbSBjd2J1Zl9zaXplICAgQ29tcHJlc3NlZCBidWZmZXIgc2l6ZSBmb3Igd3JpdGluZy4KKyAgICogQHBhcmFtIGNvbXBfbGV2ZWwgICBDb21wcmVzc2lvbiBsZXZlbCAoMD1ub25lW2Zhc3RdLCA2PWRlZmF1bHQsIDk9bWF4W3Nsb3ddKS4KKyAgICovCisgIFRabGliVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgIGludCB1cmJ1Zl9zaXplID0gREVGQVVMVF9VUkJVRl9TSVpFLAorICAgICAgICAgICAgICAgICBpbnQgY3JidWZfc2l6ZSA9IERFRkFVTFRfQ1JCVUZfU0laRSwKKyAgICAgICAgICAgICAgICAgaW50IHV3YnVmX3NpemUgPSBERUZBVUxUX1VXQlVGX1NJWkUsCisgICAgICAgICAgICAgICAgIGludCBjd2J1Zl9zaXplID0gREVGQVVMVF9DV0JVRl9TSVpFLAorICAgICAgICAgICAgICAgICBpbnQxNl90IGNvbXBfbGV2ZWwgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pCisgICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCisgICAgICB1cnBvc18oMCksCisgICAgICB1d3Bvc18oMCksCisgICAgICBpbnB1dF9lbmRlZF8oZmFsc2UpLAorICAgICAgb3V0cHV0X2ZpbmlzaGVkXyhmYWxzZSksCisgICAgICB1cmJ1Zl9zaXplXyh1cmJ1Zl9zaXplKSwKKyAgICAgIGNyYnVmX3NpemVfKGNyYnVmX3NpemUpLAorICAgICAgdXdidWZfc2l6ZV8odXdidWZfc2l6ZSksCisgICAgICBjd2J1Zl9zaXplXyhjd2J1Zl9zaXplKSwKKyAgICAgIHVyYnVmXyhOVUxMKSwKKyAgICAgIGNyYnVmXyhOVUxMKSwKKyAgICAgIHV3YnVmXyhOVUxMKSwKKyAgICAgIGN3YnVmXyhOVUxMKSwKKyAgICAgIHJzdHJlYW1fKE5VTEwpLAorICAgICAgd3N0cmVhbV8oTlVMTCksCisgICAgICBjb21wX2xldmVsXyhjb21wX2xldmVsKSB7CisgICAgaWYgKHV3YnVmX3NpemVfIDwgTUlOX0RJUkVDVF9ERUZMQVRFX1NJWkUpIHsKKyAgICAgIC8vIEhhdmUgdG8gY29weSB0aGlzIGludG8gYSBsb2NhbCBiZWNhdXNlIG9mIGEgbGlua2luZyBpc3N1ZS4KKyAgICAgIGludCBtaW5pbXVtID0gTUlOX0RJUkVDVF9ERUZMQVRFX1NJWkU7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVFpMaWJUcmFuc3BvcnQ6IHVuY29tcHJlc3NlZCB3cml0ZSBidWZmZXIgbXVzdCBiZSBhdCBsZWFzdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0b19zdHJpbmcobWluaW11bSkgKyAiLiIpOworICAgIH0KKworICAgIHRyeSB7CisgICAgICB1cmJ1Zl8gPSBuZXcgdWludDhfdFt1cmJ1Zl9zaXplXTsKKyAgICAgIGNyYnVmXyA9IG5ldyB1aW50OF90W2NyYnVmX3NpemVdOworICAgICAgdXdidWZfID0gbmV3IHVpbnQ4X3RbdXdidWZfc2l6ZV07CisgICAgICBjd2J1Zl8gPSBuZXcgdWludDhfdFtjd2J1Zl9zaXplXTsKKworICAgICAgLy8gRG9uJ3QgY2FsbCB0aGlzIG91dHNpZGUgb2YgdGhlIGNvbnN0cnVjdG9yLgorICAgICAgaW5pdFpsaWIoKTsKKworICAgIH0gY2F0Y2ggKC4uLikgeworICAgICAgZGVsZXRlW10gdXJidWZfOworICAgICAgZGVsZXRlW10gY3JidWZfOworICAgICAgZGVsZXRlW10gdXdidWZfOworICAgICAgZGVsZXRlW10gY3didWZfOworICAgICAgdGhyb3c7CisgICAgfQorICB9CisKKyAgLy8gRG9uJ3QgY2FsbCB0aGlzIG91dHNpZGUgb2YgdGhlIGNvbnN0cnVjdG9yLgorICB2b2lkIGluaXRabGliKCk7CisKKyAgLyoqCisgICAqIFRabGliVHJhbnNwb3J0IGRlc3RydWN0b3IuCisgICAqCisgICAqIFdhcm5pbmc6IERlc3Ryb3lpbmcgYSBUWmxpYlRyYW5zcG9ydCBvYmplY3QgbWF5IGRpc2NhcmQgYW55IHdyaXR0ZW4gYnV0CisgICAqIHVuZmx1c2hlZCBkYXRhLiAgWW91IG11c3QgZXhwbGljaXRseSBjYWxsIGZsdXNoKCkgb3IgZmluaXNoKCkgdG8gZW5zdXJlCisgICAqIHRoYXQgZGF0YSBpcyBhY3R1YWxseSB3cml0dGVuIGFuZCBmbHVzaGVkIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICovCisgIH5UWmxpYlRyYW5zcG9ydCgpOworCisgIGJvb2wgaXNPcGVuKCk7CisgIGJvb2wgcGVlaygpOworCisgIHZvaWQgb3BlbigpIHsgdHJhbnNwb3J0Xy0+b3BlbigpOyB9CisKKyAgdm9pZCBjbG9zZSgpIHsgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsgfQorCisgIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHZvaWQgZmx1c2goKTsKKworICAvKioKKyAgICogRmluYWxpemUgdGhlIHpsaWIgc3RyZWFtLgorICAgKgorICAgKiBUaGlzIGNhdXNlcyB6bGliIHRvIGZsdXNoIGFueSBwZW5kaW5nIHdyaXRlIGRhdGEgYW5kIHdyaXRlIGVuZC1vZi1zdHJlYW0KKyAgICogaW5mb3JtYXRpb24sIGluY2x1ZGluZyB0aGUgY2hlY2tzdW0uICBPbmNlIGZpbmlzaCgpIGhhcyBiZWVuIGNhbGxlZCwgbm8KKyAgICogbmV3IGRhdGEgY2FuIGJlIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbS4KKyAgICovCisgIHZvaWQgZmluaXNoKCk7CisKKyAgY29uc3QgdWludDhfdCogYm9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbik7CisKKyAgdm9pZCBjb25zdW1lKHVpbnQzMl90IGxlbik7CisKKyAgLyoqCisgICAqIFZlcmlmeSB0aGUgY2hlY2tzdW0gYXQgdGhlIGVuZCBvZiB0aGUgemxpYiBzdHJlYW0uCisgICAqCisgICAqIFRoaXMgbWF5IG9ubHkgYmUgY2FsbGVkIGFmdGVyIGFsbCBkYXRhIGhhcyBiZWVuIHJlYWQuCisgICAqIEl0IHZlcmlmaWVzIHRoZSBjaGVja3N1bSB0aGF0IHdhcyB3cml0dGVuIGJ5IHRoZSBmaW5pc2goKSBjYWxsLgorICAgKi8KKyAgdm9pZCB2ZXJpZnlDaGVja3N1bSgpOworCisgIC8qKgorICAgKiBUT0RPKHNvbWVvbmVfc21hcnQpOiBDaG9vc2Ugc21hcnQgZGVmYXVsdHMuCisgICAqLworICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfVVJCVUZfU0laRSA9IDEyODsKKyAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0NSQlVGX1NJWkUgPSAxMDI0OworICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfVVdCVUZfU0laRSA9IDEyODsKKyAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0NXQlVGX1NJWkUgPSAxMDI0OworCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgY29uc3QgeyByZXR1cm4gdHJhbnNwb3J0XzsgfQorCitwcm90ZWN0ZWQ6CisgIGlubGluZSB2b2lkIGNoZWNrWmxpYlJ2KGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1zZyk7CisgIGlubGluZSB2b2lkIGNoZWNrWmxpYlJ2Tm90aHJvdyhpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBtc2cpOworICBpbmxpbmUgaW50IHJlYWRBdmFpbCgpOworICB2b2lkIGZsdXNoVG9UcmFuc3BvcnQoaW50IGZsdXNoKTsKKyAgdm9pZCBmbHVzaFRvWmxpYihjb25zdCB1aW50OF90KiBidWYsIGludCBsZW4sIGludCBmbHVzaCk7CisgIGJvb2wgcmVhZEZyb21abGliKCk7CisKK3Byb3RlY3RlZDoKKyAgLy8gV3JpdGVzIHNtYWxsZXIgdGhhbiB0aGlzIGFyZSBidWZmZXJlZCB1cC4KKyAgLy8gTGFyZ2VyIChvciBlcXVhbCkgd3JpdGVzIGFyZSBkdW1wZWQgc3RyYWlnaHQgdG8gemxpYi4KKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1JTl9ESVJFQ1RfREVGTEFURV9TSVpFID0gMzI7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CisKKyAgaW50IHVycG9zXzsKKyAgaW50IHV3cG9zXzsKKworICAvLy8gVHJ1ZSBpZmYgemxpYiBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBzdHJlYW0uCisgIGJvb2wgaW5wdXRfZW5kZWRfOworICAvLy8gVHJ1ZSBpZmYgd2UgaGF2ZSBmaW5pc2hlZCB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgYm9vbCBvdXRwdXRfZmluaXNoZWRfOworCisgIHVpbnQzMl90IHVyYnVmX3NpemVfOworICB1aW50MzJfdCBjcmJ1Zl9zaXplXzsKKyAgdWludDMyX3QgdXdidWZfc2l6ZV87CisgIHVpbnQzMl90IGN3YnVmX3NpemVfOworCisgIHVpbnQ4X3QqIHVyYnVmXzsKKyAgdWludDhfdCogY3JidWZfOworICB1aW50OF90KiB1d2J1Zl87CisgIHVpbnQ4X3QqIGN3YnVmXzsKKworICBzdHJ1Y3Qgel9zdHJlYW1fcyogcnN0cmVhbV87CisgIHN0cnVjdCB6X3N0cmVhbV9zKiB3c3RyZWFtXzsKKworICBjb25zdCBpbnQgY29tcF9sZXZlbF87Cit9OworCisvKioKKyAqIFdyYXBzIGEgdHJhbnNwb3J0IGludG8gYSB6bGliYmVkIG9uZS4KKyAqCisgKi8KK2NsYXNzIFRabGliVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7CitwdWJsaWM6CisgIFRabGliVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisKKyAgdmlydHVhbCB+VFpsaWJUcmFuc3BvcnRGYWN0b3J5KCkge30KKworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVFpsaWJUcmFuc3BvcnQodHJhbnMpKTsKKyAgfQorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UWkxJQlRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvR2V0VGltZU9mRGF5LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIwODI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5jcHAKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5oPgorI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKy8vIHdpbjMyCisjaWYgZGVmaW5lZChfX01JTkdXMzJfXykKKyAgI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX01TQ19FWFRFTlNJT05TKQorI2RlZmluZSBERUxUQV9FUE9DSF9JTl9NSUNST1NFQ1MgMTE2NDQ0NzM2MDAwMDAwMDBVaTY0CisjZWxzZQorI2RlZmluZSBERUxUQV9FUE9DSF9JTl9NSUNST1NFQ1MgMTE2NDQ0NzM2MDAwMDAwMDBVTEwKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX19NSU5HVzMyX18pCitzdHJ1Y3QgdGltZXpvbmUgeworICBpbnQgdHpfbWludXRlc3dlc3Q7IC8qIG1pbnV0ZXMgVyBvZiBHcmVlbndpY2ggKi8KKyAgaW50IHR6X2RzdHRpbWU7ICAgICAvKiB0eXBlIG9mIGRzdCBjb3JyZWN0aW9uICovCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQoraW50IHRocmlmdF9nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwqIHR2LCBzdHJ1Y3QgdGltZXpvbmUqIHR6KSB7CisgIHJldHVybiBnZXR0aW1lb2ZkYXkodHYsdHopOworfQorI2Vsc2UKK2ludCB0aHJpZnRfZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsKiB0diwgc3RydWN0IHRpbWV6b25lKiB0eikgeworICBGSUxFVElNRSBmdDsKKyAgdW5zaWduZWQgX19pbnQ2NCB0bXByZXMoMCk7CisgIHN0YXRpYyBpbnQgdHpmbGFnOworCisgIGlmIChOVUxMICE9IHR2KSB7CisgICAgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUoJmZ0KTsKKworICAgIHRtcHJlcyB8PSBmdC5kd0hpZ2hEYXRlVGltZTsKKyAgICB0bXByZXMgPDw9IDMyOworICAgIHRtcHJlcyB8PSBmdC5kd0xvd0RhdGVUaW1lOworCisgICAgLypjb252ZXJ0aW5nIGZpbGUgdGltZSB0byB1bml4IGVwb2NoKi8KKyAgICB0bXByZXMgLT0gREVMVEFfRVBPQ0hfSU5fTUlDUk9TRUNTOworICAgIHRtcHJlcyAvPSAxMDsgLypjb252ZXJ0IGludG8gbWljcm9zZWNvbmRzKi8KKyAgICB0di0+dHZfc2VjID0gKGxvbmcpKHRtcHJlcyAvIDEwMDAwMDBVTCk7CisgICAgdHYtPnR2X3VzZWMgPSAobG9uZykodG1wcmVzICUgMTAwMDAwMFVMKTsKKyAgfQorCisgIGlmIChOVUxMICE9IHR6KSB7CisgICAgaWYgKCF0emZsYWcpIHsKKyAgICAgIF90enNldCgpOworICAgICAgdHpmbGFnKys7CisgICAgfQorCisgICAgbG9uZyB0aW1lX3pvbmUoMCk7CisgICAgZXJybm9fdCBlcnIoX2dldF90aW1lem9uZSgmdGltZV96b25lKSk7CisgICAgaWYgKGVyciA9PSBOT19FUlJPUikgeworICAgICAgdHotPnR6X21pbnV0ZXN3ZXN0ID0gdGltZV96b25lIC8gNjA7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpbnQgZGF5X2xpZ2h0KDApOworICAgIGVyciA9IChfZ2V0X2RheWxpZ2h0KCZkYXlfbGlnaHQpKTsKKyAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7CisgICAgICB0ei0+dHpfZHN0dGltZSA9IGRheV9saWdodDsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworaW50IHRocmlmdF9zbGVlcCh1bnNpZ25lZCBpbnQgc2Vjb25kcykgeworICA6OlNsZWVwKHNlY29uZHMgKiAxMDAwKTsKKyAgcmV0dXJuIDA7Cit9CitpbnQgdGhyaWZ0X3VzbGVlcCh1bnNpZ25lZCBpbnQgbWljcm9zZWNvbmRzKSB7CisgIHVuc2lnbmVkIGludCBtaWxsaXNlY29uZHMgPSAobWljcm9zZWNvbmRzICsgOTk5KSAvIDEwMDA7CisgIDo6U2xlZXAobWlsbGlzZWNvbmRzKTsKKyAgcmV0dXJuIDA7Cit9CisKK2NoYXIqIHRocmlmdF9jdGltZV9yKGNvbnN0IHRpbWVfdCogX2Nsb2NrLCBjaGFyKiBfYnVmKSB7CisgIHN0cmNweShfYnVmLCBjdGltZShfY2xvY2spKTsKKyAgcmV0dXJuIF9idWY7Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9HZXRUaW1lT2ZEYXkuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MmFjNWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9HZXRUaW1lT2ZEYXkuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9XSU5ET1dTX0dFVFRJTUVPRkRBWV9IXworI2RlZmluZSBfVEhSSUZUX1dJTkRPV1NfR0VUVElNRU9GREFZX0hfCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPiAxMjAwKQorI3ByYWdtYSBvbmNlCisjZW5kaWYgLy8gX01TQ19WRVIKKworI2lmbmRlZiBfV0lOMzIKKyNlcnJvciBUaGlzIGlzIGEgTVNWQyBoZWFkZXIgb25seS4KKyNlbmRpZgorCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKK3N0cnVjdCB0aHJpZnRfdGltZXNwZWMgeworICBpbnQ2NF90IHR2X3NlYzsKKyAgaW50NjRfdCB0dl9uc2VjOworfTsKKworaW50IHRocmlmdF9nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwqIHR2LCBzdHJ1Y3QgdGltZXpvbmUqIHR6KTsKK2ludCB0aHJpZnRfc2xlZXAodW5zaWduZWQgaW50IHNlY29uZHMpOworaW50IHRocmlmdF91c2xlZXAodW5zaWduZWQgaW50IG1pY3JvX3NlY29uZHMpOworY2hhciogdGhyaWZ0X2N0aW1lX3IoY29uc3QgdGltZV90KiBfY2xvY2ssIGNoYXIqIF9idWYpOworCisjZW5kaWYgLy8gX1RIUklGVF9XSU5ET1dTX0dFVFRJTUVPRkRBWV9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvT3BlcmF0b3JzLmggYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PcGVyYXRvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjg2MDk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvT3BlcmF0b3JzLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfV0lORE9XU19PUEVSQVRPUlNfSF8KKyNkZWZpbmUgX1RIUklGVF9XSU5ET1dTX09QRVJBVE9SU19IXworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gMTIwMCkKKyNwcmFnbWEgb25jZQorI2VuZGlmIC8vIF9NU0NfVkVSCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisKK2NsYXNzIFRFbnVtSXRlcmF0b3I7CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVEVudW1JdGVyYXRvciYsIGNvbnN0IFRFbnVtSXRlcmF0b3ImKSB7CisgIC8vIE5vdCBlbnRpcmVseSBzdXJlIHdoYXQgdGhlIHRlc3Qgc2hvdWxkIGJlIGhlcmUuIEl0IGlzIG9ubHkgdG8gZW5hYmxlCisgIC8vIGl0ZXJhdG9yIGRlYnVnZ2luZyBhbmQgaXMgbm90IHVzZWQgaW4gcmVsZWFzZSBtb2RlLgorICByZXR1cm4gdHJ1ZTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKKworI2VuZGlmIC8vIF9USFJJRlRfV0lORE9XU19PUEVSQVRPUlNfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWM2ZmUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuY3BwCkBAIC0wLDAgKzEsMTUxIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxib29zdC9ub25jb3B5YWJsZS5ocHA+CisjaW5jbHVkZSA8Ym9vc3Qvc2NvcGVfZXhpdC5ocHA+CisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK1RPdmVybGFwcGVkV29ya0l0ZW06OlRPdmVybGFwcGVkV29ya0l0ZW0oKQorICA6IFNMSVNUX0VOVFJZKCksCisgICAgYWN0aW9uKFVOS05PV04pLAorICAgIGgoSU5WQUxJRF9IQU5ETEVfVkFMVUUpLAorICAgIGJ1ZmZlcihOVUxMKSwKKyAgICBidWZmZXJfbGVuKDApLAorICAgIG92ZXJsYXAoKSwKKyAgICBsYXN0X2Vycm9yKDApLAorICAgIHN1Y2Nlc3MoVFJVRSkgeworfQorCit2b2lkIFRPdmVybGFwcGVkV29ya0l0ZW06OnJlc2V0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuLCBIQU5ETEUgZXZlbnQpIHsKKyAgbWVtc2V0KCZvdmVybGFwLCAwLCBzaXplb2Yob3ZlcmxhcCkpOworICBvdmVybGFwLmhFdmVudCA9IGV2ZW50OworICBidWZmZXIgPSBidWY7CisgIGJ1ZmZlcl9sZW4gPSBsZW47CisgIGxhc3RfZXJyb3IgPSAwOworICBzdWNjZXNzID0gRkFMU0U7Cit9CisKK3VpbnQzMl90IFRPdmVybGFwcGVkV29ya0l0ZW06Om92ZXJsYXBwZWRSZXN1bHRzKGJvb2wgc2lnbmFsX2ZhaWx1cmUpIHsKKyAgRFdPUkQgYnl0ZXMgPSAwOworICBCT09MIHJlc3VsdCA9IDo6R2V0T3ZlcmxhcHBlZFJlc3VsdChoLCAmb3ZlcmxhcCwgJmJ5dGVzLCBUUlVFKTsKKyAgaWYgKHNpZ25hbF9mYWlsdXJlICYmICFyZXN1bHQpIC8vIGdldCBvdmVybGFwcGVkIGVycm9yIGNhc2UKKyAgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlIDo6R2V0T3ZlcmxhcHBlZFJlc3VsdCBlcnJvcmVkIEdMRT0iLCA6OkdldExhc3RFcnJvcigpKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJUUGlwZTogR2V0T3ZlcmxhcHBlZFJlc3VsdCBmYWlsZWQiKTsKKyAgfQorICByZXR1cm4gYnl0ZXM7Cit9CisKK2Jvb2wgVE92ZXJsYXBwZWRXb3JrSXRlbTo6cHJvY2VzcygpIHsKKyAgQk9PU1RfU0NPUEVfRVhJVCgoJmRvbmVTdWJtaXR0aW5nRXZlbnQpKSB7IFNldEV2ZW50KGRvbmVTdWJtaXR0aW5nRXZlbnQuaCk7IH0KKyAgQk9PU1RfU0NPUEVfRVhJVF9FTkQKKworICBzd2l0Y2ggKGFjdGlvbikgeworICBjYXNlIChDT05ORUNUKToKKyAgICBzdWNjZXNzID0gOjpDb25uZWN0TmFtZWRQaXBlKGgsICZvdmVybGFwKTsKKyAgICBpZiAoc3VjY2VzcyA9PSBGQUxTRSkKKyAgICAgIGxhc3RfZXJyb3IgPSA6OkdldExhc3RFcnJvcigpOworICAgIHJldHVybiB0cnVlOworICBjYXNlIChSRUFEKToKKyAgICBzdWNjZXNzID0gOjpSZWFkRmlsZShoLCBidWZmZXIsIGJ1ZmZlcl9sZW4sIE5VTEwsICZvdmVybGFwKTsKKyAgICBpZiAoc3VjY2VzcyA9PSBGQUxTRSkKKyAgICAgIGxhc3RfZXJyb3IgPSA6OkdldExhc3RFcnJvcigpOworICAgIHJldHVybiB0cnVlOworICBjYXNlIChDQU5DRUxJTyk6CisgICAgc3VjY2VzcyA9IDo6Q2FuY2VsSW8oaCk7CisgICAgaWYgKHN1Y2Nlc3MgPT0gRkFMU0UpCisgICAgICBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgY2FzZSAoU1RPUCk6CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK3ZvaWQgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjphZGRXb3JrSXRlbShUT3ZlcmxhcHBlZFdvcmtJdGVtKiBpdGVtKSB7CisgIEludGVybG9ja2VkUHVzaEVudHJ5U0xpc3QoJndvcmtMaXN0XywgaXRlbSk7CisgIFNldEV2ZW50KHdvcmtBdmFpbGFibGVFdmVudF8uaCk7CisgIFdhaXRGb3JTaW5nbGVPYmplY3QoaXRlbS0+ZG9uZVN1Ym1pdHRpbmdFdmVudC5oLCBJTkZJTklURSk7Cit9CisKK1RPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCogVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjphY3F1aXJlX2luc3RhbmNlKCkgeworICBUQXV0b0NyaXQgbG9jayhpbnN0YW5jZUd1YXJkXyk7CisgIGlmIChpbnN0YW5jZV8gPT0gTlVMTCkgeworICAgIGFzc2VydChpbnN0YW5jZVJlZkNvdW50XyA9PSAwKTsKKyAgICBpbnN0YW5jZV8gPSBuZXcgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOworICB9CisgICsraW5zdGFuY2VSZWZDb3VudF87CisgIHJldHVybiBpbnN0YW5jZV87Cit9Cit2b2lkIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6cmVsZWFzZV9pbnN0YW5jZSgpIHsKKyAgVEF1dG9Dcml0IGxvY2soaW5zdGFuY2VHdWFyZF8pOworICBpZiAoLS1pbnN0YW5jZVJlZkNvdW50XyA9PSAwKSB7CisgICAgZGVsZXRlIGluc3RhbmNlXzsKKyAgICBpbnN0YW5jZV8gPSBOVUxMOworICB9Cit9CisKK1RPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6VE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkKCkgeworICBzdG9wSXRlbV8uYWN0aW9uID0gVE92ZXJsYXBwZWRXb3JrSXRlbTo6U1RPUDsKKworICBJbml0aWFsaXplU0xpc3RIZWFkKCZ3b3JrTGlzdF8pOworICB0aHJlYWRfID0gKEhBTkRMRSlfYmVnaW50aHJlYWRleChOVUxMLCAwLCB0aHJlYWRfcHJvYywgdGhpcywgMCwgTlVMTCk7CisgIGlmICh0aHJlYWRfID09IDApIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQgdW5hYmxlIHRvIGNyZWF0ZSB0aHJlYWQsIGVycm5vPSIsIGVycm5vKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQgdW5hYmxlIHRvIGNyZWF0ZSB0aHJlYWQiKTsKKyAgfQorfQorCitUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6On5UT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQoKSB7CisgIGFkZFdvcmtJdGVtKCZzdG9wSXRlbV8pOworICA6OldhaXRGb3JTaW5nbGVPYmplY3QodGhyZWFkXywgSU5GSU5JVEUpOworICBDbG9zZUhhbmRsZSh0aHJlYWRfKTsKK30KKwordm9pZCBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6OnJ1bigpIHsKKyAgZm9yICg7OykgeworICAgIFdhaXRGb3JTaW5nbGVPYmplY3Qod29ya0F2YWlsYWJsZUV2ZW50Xy5oLCBJTkZJTklURSk7CisgICAgLy8gdG9kbyBjaGVjayByZXN1bHQKKyAgICBTTElTVF9FTlRSWSogZW50cnkgPSBOVUxMOworICAgIHdoaWxlICgoZW50cnkgPSBJbnRlcmxvY2tlZFBvcEVudHJ5U0xpc3QoJndvcmtMaXN0XykpICE9IE5VTEwpIHsKKyAgICAgIFRPdmVybGFwcGVkV29ya0l0ZW0mIGl0ZW0gPSAqc3RhdGljX2Nhc3Q8VE92ZXJsYXBwZWRXb3JrSXRlbSo+KGVudHJ5KTsKKyAgICAgIGlmICghaXRlbS5wcm9jZXNzKCkpCisgICAgICAgIHJldHVybjsKKyAgICB9CisgIH0KK30KKwordW5zaWduZWQgX19zdGRjYWxsIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6dGhyZWFkX3Byb2Modm9pZCogYWRkcikgeworICBzdGF0aWNfY2FzdDxUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQqPihhZGRyKS0+cnVuKCk7CisgIHJldHVybiAwOworfQorCitUQ3JpdGljYWxTZWN0aW9uIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6aW5zdGFuY2VHdWFyZF87CitUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQqIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6aW5zdGFuY2VfOwordWludDMyX3QgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjppbnN0YW5jZVJlZkNvdW50XyA9IDA7Cit9Cit9Cit9IC8vIGFwYWNoOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQwYzVjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1dJTkRPV1NfT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWRfSF8KKyNkZWZpbmUgX1RIUklGVF9XSU5ET1dTX092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkX0hfIDEKKworI2lmbmRlZiBfV0lOMzIKKyNlcnJvciAiT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuaCBpcyBvbmx5IHVzYWJsZSBvbiBXaW5kb3dzIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9TeW5jLmg+CisjaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgorI2luY2x1ZGUgPFdpbmRvd3MuaD4KKworLyoKKyAgKioqIFdoeSBkb2VzIHRoaXMgY2xhc3MgZXhpc3Q/CisgIEluIHNob3J0LCBiZWNhdXNlIHdlIHdhbnQgdG8gZW5hYmxlIHNvbWV0aGluZyBzaW1pbGFyIHRvIGEgInNlbGVjdCIgbG9vcCwgb24gV2luZG93cywgd2l0aAorICBuYW1lZCBwaXBlcy4gIFRoZSBjb3JlIG9mIHRoZSAic2VsZWN0IiBsb29wIGlzIGEgY2FsbCB0byBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzLiAgU28gdGhhdCBtZWFucworICB3ZSBuZWVkIGEgc2lnbmFsYWJsZSBvYmplY3QgdGhhdCBpbmRpY2F0ZXMgd2hlbiBkYXRhIGlzIGF2YWlsYWJsZS4KKworICBBIHBpcGUgaGFuZGxlIGRvZXNuJ3QgZG8gdGhhdC4gIEEgcGlwZSBoYW5kbGUgaXMgc2lnbmFsZWQgd2hlbiBhIHJlYWQgb3Igd3JpdGUgY29tcGxldGVzLCBhbmQgaWYKKyAgbm8gb25lIGhhcyBjYWxsZWQgcmVhZCBvciB3cml0ZSwgdGhlbiB0aGUgcGlwZSBoYW5kbGUgaXMgdXNlbGVzcyBpbiBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzLiAgU28KKyAgaW5zdGVhZCwgd2UgdXNlIG92ZXJsYXBwZWQgSS9PLiAgV2l0aCBvdmVybGFwcGVkIEkvTywgeW91IGNhbGwgcmVhZCwgYW5kIGFzc29jaWF0ZSBhbiBldmVudCB3aXRoCisgIHRoZSByZWFkLiAgV2hlbiB0aGUgcmVhZCBmaW5pc2hlcywgdGhlIGV2ZW50IGlzIHNpZ25hbGVkLiAgVGhpcyBtZWFucyB0aGF0IHdoZW4geW91IGNyZWF0ZSBhIHBpcGUsCisgIHlvdSBzdGFydCBhIHJlYWQuICBXaGVuIHRoZSBjdXN0b21lciBjYWxscyByZWFkIG9uIHlvdXIgdHJhbnNwb3J0IG9iamVjdCwgeW91IHdhaXQgZm9yIHRoZSBsYXN0CisgIHJlYWQgdG8gZmluaXNoLCBhbmQgdGhlbiBraWNrIG9mZiBhbm90aGVyLgorCisgIFRoZXJlIGlzIG9uZSBiaWcgY2F2ZWF0IHRvIHRoaXMgdGhvdWdoLiAgVGhlIHRocmVhZCB0aGF0IGluaXRpYXRlZCB0aGUgcmVhZCBtdXN0IHN0YXkgYWxpdmUuICBJZgorICB0aGUgdGhyZWFkIHRoYXQgaW5pdGlhdGVkIHRoZSByZWFkIGV4aXRzLCB0aGVuIHRoZSByZWFkIGNvbXBsZXRlcyBpbiBhbiBlcnJvciBzdGF0ZS4gIFRvIGVuc3VyZQorICB0aGF0IHRoZSBpbml0aWF0aW5nIHRocmVhZCBzdGF5cyBhbGl2ZSwgd2UgY3JlYXRlIGEgc2luZ2xldG9uIHRocmVhZCB3aG9zZSBzb2xlIHJlc3BvbnNpYmlsaXR5IGlzCisgIHRvIG1hbmFnZSB0aGlzIG92ZXJsYXBwZWQgSS9PIHJlcXVlc3RzLiAgVGhpcyBpbnRyb2R1Y2VzIHNvbWUgb3ZlcmhlYWQsIGJ1dCBpdCBpcyBvdmVyaGVhZCB0aGF0CisgIGlzIG5lY2Vzc2FyeSBmb3IgY29ycmVjdCBiZWhhdmlvci4KKworICBUaGlzIHRocmVhZCBjdXJyZW50bHkgc3VwcG9ydHMgY29ubmVjdCwgcmVhZCwgYW5kIGNhbmNlbCBpby4gIFNvIGZhciwgSSBoYXZlbid0IG5lZWRlZCB0byBwdXQgYW55CisgIHdyaXRlcyBvbiB0aGlzIHRocmVhZCwgYnV0IGlmIG5lZWRlZCwgaXQgY291bGQgYmUgZG9uZS4gIFRoZSBjbGllbnQgd3JpdGUgYnVmZmVyIHdvdWxkIG5lZWQgdG8gYmUKKyAgY29waWVkIHRvIGVuc3VyZSB0aGF0IGl0IGRvZXNuJ3QgZ2V0IGludmFsaWRhdGVkLgorCisgICoqKiBIb3cgZG9lcyBvbmUgdXNlIHRoaXMgY2xhc3M/CisgIENyZWF0ZSBhIFRPdmVybGFwcGVkV29ya0l0ZW0sIGFuZCBmaWxsIGluIHRoZSBhY3Rpb24gYW5kICJoIiwgdGhlbiBjYWxsIHJlc2V0KCkuICBZb3VyIHdvcmsgaXRlbQorICBpcyBub3cgcmVhZHkgdG8gYmUgc3VibWl0dGVkIHRvIHRoZSBvdmVybGFwcGVkIHN1Ym1pc3Npb24gdGhyZWFkLiAgQ3JlYXRlIGEgVEF1dG9PdmVybGFwVGhyZWFkLAorICBhbmQgY2FsbCB0aHJlYWQtPmFkZFdvcmtJdGVtIHdpdGggeW91ciB3b3JrIGl0ZW0uICBBZnRlciBhZGRXb3JrSXRlbSBjb21wbGV0ZXMsIHlvdSBtYXkgaW5zcGVjdAorICBsYXN0X2Vycm9yIGFuZCBzdWNjZXNzLiAgQXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLCBjYWxsIHdvcmtJdGVtLm92ZXJsYXBwZWRSZXN1bHRzIHRvIHdhaXQKKyAgdW50aWwgdGhlIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLgorKi8KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitzdHJ1Y3QgREVDTFNQRUNfQUxJR04oTUVNT1JZX0FMTE9DQVRJT05fQUxJR05NRU5UKSBUT3ZlcmxhcHBlZFdvcmtJdGVtIDogcHVibGljIFNMSVNUX0VOVFJZIHsKKyAgVE92ZXJsYXBwZWRXb3JrSXRlbSgpOworCisgIGVudW0gYWN0aW9uX3QgeworICAgIFVOS05PV04gPSAzMDAwLAorICAgIENPTk5FQ1QsCisgICAgUkVBRCwKKyAgICBDQU5DRUxJTywKKyAgICBTVE9QLAorICB9OworCisgIFRBdXRvUmVzZXRFdmVudCBkb25lU3VibWl0dGluZ0V2ZW50OworICBhY3Rpb25fdCBhY3Rpb247CisgIEhBTkRMRSBoOworICB1aW50OF90KiBidWZmZXI7CisgIHVpbnQzMl90IGJ1ZmZlcl9sZW47CisgIE9WRVJMQVBQRUQgb3ZlcmxhcDsKKworICBEV09SRCBsYXN0X2Vycm9yOworICBCT09MIHN1Y2Nlc3M7CisKKyAgdm9pZCByZXNldCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbiwgSEFORExFIGV2ZW50KTsKKyAgdWludDMyX3Qgb3ZlcmxhcHBlZFJlc3VsdHMoYm9vbCBzaWduYWxfZmFpbHVyZSA9IHRydWUpOworICBib29sIHByb2Nlc3MoKTsKK307CisKK2NsYXNzIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CitwdWJsaWM6CisgIHZvaWQgYWRkV29ya0l0ZW0oVE92ZXJsYXBwZWRXb3JrSXRlbSogaXRlbSk7CisKKyAgLy8gc2luZ2xldG9uIHN0dWZmCitwdWJsaWM6CisgIHN0YXRpYyBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQqIGFjcXVpcmVfaW5zdGFuY2UoKTsKKyAgc3RhdGljIHZvaWQgcmVsZWFzZV9pbnN0YW5jZSgpOworCitwcml2YXRlOgorICBzdGF0aWMgVENyaXRpY2FsU2VjdGlvbiBpbnN0YW5jZUd1YXJkXzsKKyAgc3RhdGljIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCogaW5zdGFuY2VfOworICBzdGF0aWMgdWludDMyX3QgaW5zdGFuY2VSZWZDb3VudF87CisKKyAgLy8gdGhyZWFkIGRldGFpbHMKK3ByaXZhdGU6CisgIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCgpOworICB+VE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkKCk7CisgIHZvaWQgcnVuKCk7CisgIHN0YXRpYyB1bnNpZ25lZCBfX3N0ZGNhbGwgdGhyZWFkX3Byb2Modm9pZCogYWRkcik7CisKK3ByaXZhdGU6CisgIERFQ0xTUEVDX0FMSUdOKE1FTU9SWV9BTExPQ0FUSU9OX0FMSUdOTUVOVCkgU0xJU1RfSEVBREVSIHdvcmtMaXN0XzsKKyAgVE92ZXJsYXBwZWRXb3JrSXRlbSBzdG9wSXRlbV87CisgIFRBdXRvUmVzZXRFdmVudCB3b3JrQXZhaWxhYmxlRXZlbnRfOworICBIQU5ETEUgdGhyZWFkXzsKK307CisKK2NsYXNzIFRBdXRvT3ZlcmxhcFRocmVhZCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7Citwcml2YXRlOgorICBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQqIHA7CisKK3B1YmxpYzoKKyAgVEF1dG9PdmVybGFwVGhyZWFkKCkgOiBwKFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6YWNxdWlyZV9pbnN0YW5jZSgpKSB7fQorICB+VEF1dG9PdmVybGFwVGhyZWFkKCkgeyBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6OnJlbGVhc2VfaW5zdGFuY2UoKTsgfQorICBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQqIG9wZXJhdG9yLT4oKSB7IHJldHVybiBwOyB9Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU29ja2V0UGFpci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9Tb2NrZXRQYWlyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjI4ODMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU29ja2V0UGFpci5jcHAKQEAgLTAsMCArMSwxMDAgQEAKKy8qIHNvY2tldHBhaXIuYworICogQ29weXJpZ2h0IDIwMDcgYnkgTmF0aGFuIEMuIE15ZXJzIDxuY21AY2FudHJpcC5vcmc+OyBzb21lIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgY29kZSBpcyBGcmVlIFNvZnR3YXJlLiAgSXQgbWF5IGJlIGNvcGllZCBmcmVlbHksIGluIG9yaWdpbmFsIG9yCisgKiBtb2RpZmllZCBmb3JtLCBzdWJqZWN0IG9ubHkgdG8gdGhlIHJlc3RyaWN0aW9ucyB0aGF0ICgxKSB0aGUgYXV0aG9yIGlzCisgKiByZWxpZXZlZCBmcm9tIGFsbCByZXNwb25zaWJpbGl0aWVzIGZvciBhbnkgdXNlIGZvciBhbnkgcHVycG9zZSwgYW5kICgyKQorICogdGhpcyBjb3B5cmlnaHQgbm90aWNlIG11c3QgYmUgcmV0YWluZWQsIHVuY2hhbmdlZCwgaW4gaXRzIGVudGlyZXR5LiAgSWYKKyAqIGZvciBhbnkgcmVhc29uIHRoZSBhdXRob3IgbWlnaHQgYmUgaGVsZCByZXNwb25zaWJsZSBmb3IgYW55IGNvbnNlcXVlbmNlcworICogb2YgY29weWluZyBvciB1c2UsIGxpY2Vuc2UgaXMgd2l0aGhlbGQuCisgKi8KKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvU29ja2V0UGFpci5oPgorI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKworLy8gc3RsCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8vIFdpbjMyCisjaW5jbHVkZSA8V1MydGNwaXAuaD4KKworaW50IHRocmlmdF9zb2NrZXRwYWlyKGludCBkLCBpbnQgdHlwZSwgaW50IHByb3RvY29sLCBUSFJJRlRfU09DS0VUIHN2WzJdKSB7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHR5cGUpOworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGQpOworCisgIHVuaW9uIHsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gaW5hZGRyOworICAgIHN0cnVjdCBzb2NrYWRkciBhZGRyOworICB9IGE7CisgIFRIUklGVF9TT0NLRVQgbGlzdGVuZXI7CisgIGludCBlOworICBzb2NrbGVuX3QgYWRkcmxlbiA9IHNpemVvZihhLmluYWRkcik7CisgIERXT1JEIGZsYWdzID0gMDsKKyAgaW50IHJldXNlID0gMTsKKworICBpZiAoc3YgPT0gMCkgeworICAgIFdTQVNldExhc3RFcnJvcihXU0FFSU5WQUwpOworICAgIHJldHVybiBTT0NLRVRfRVJST1I7CisgIH0KKworICBsaXN0ZW5lciA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOworICBpZiAobGlzdGVuZXIgPT0gSU5WQUxJRF9TT0NLRVQpCisgICAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKKworICBtZW1zZXQoJmEsIDAsIHNpemVvZihhKSk7CisgIGEuaW5hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICBhLmluYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spOworICBhLmluYWRkci5zaW5fcG9ydCA9IDA7CisKKyAgc3ZbMF0gPSBzdlsxXSA9IElOVkFMSURfU09DS0VUOworICBkbyB7CisgICAgLy8gaWdub3JlIGVycm9ycyBjb21pbmcgb3V0IG9mIHRoaXMgc2V0c29ja29wdC4gIFRoaXMgaXMgYmVjYXVzZQorICAgIC8vIFNPX0VYQ0xVU0lWRUFERFJVU0UgcmVxdWlyZXMgYWRtaW4gcHJpdmlsZWdlcyBvbiBXaW5YUCwgYnV0IHdlIGRvbid0CisgICAgLy8gd2FudCB0byBmb3JjZSBzb2NrZXQgcGFpcnMgdG8gYmUgYW4gYWRtaW4uCisgICAgc2V0c29ja29wdChsaXN0ZW5lciwgU09MX1NPQ0tFVCwgU09fRVhDTFVTSVZFQUREUlVTRSwgKGNoYXIqKSZyZXVzZSwgKHNvY2tsZW5fdClzaXplb2YocmV1c2UpKTsKKyAgICBpZiAoYmluZChsaXN0ZW5lciwgJmEuYWRkciwgc2l6ZW9mKGEuaW5hZGRyKSkgPT0gU09DS0VUX0VSUk9SKQorICAgICAgYnJlYWs7CisgICAgaWYgKGdldHNvY2tuYW1lKGxpc3RlbmVyLCAmYS5hZGRyLCAmYWRkcmxlbikgPT0gU09DS0VUX0VSUk9SKQorICAgICAgYnJlYWs7CisgICAgaWYgKGxpc3RlbihsaXN0ZW5lciwgMSkgPT0gU09DS0VUX0VSUk9SKQorICAgICAgYnJlYWs7CisgICAgc3ZbMF0gPSBXU0FTb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDAsIE5VTEwsIDAsIGZsYWdzKTsKKyAgICBpZiAoc3ZbMF0gPT0gSU5WQUxJRF9TT0NLRVQpCisgICAgICBicmVhazsKKyAgICBpZiAoY29ubmVjdChzdlswXSwgJmEuYWRkciwgc2l6ZW9mKGEuaW5hZGRyKSkgPT0gU09DS0VUX0VSUk9SKQorICAgICAgYnJlYWs7CisgICAgc3ZbMV0gPSBhY2NlcHQobGlzdGVuZXIsIE5VTEwsIE5VTEwpOworICAgIGlmIChzdlsxXSA9PSBJTlZBTElEX1NPQ0tFVCkKKyAgICAgIGJyZWFrOworCisgICAgY2xvc2Vzb2NrZXQobGlzdGVuZXIpOworICAgIHJldHVybiAwOworCisgIH0gd2hpbGUgKDApOworCisgIGUgPSBXU0FHZXRMYXN0RXJyb3IoKTsKKyAgY2xvc2Vzb2NrZXQobGlzdGVuZXIpOworICBjbG9zZXNvY2tldChzdlswXSk7CisgIGNsb3Nlc29ja2V0KHN2WzFdKTsKKyAgV1NBU2V0TGFzdEVycm9yKGUpOworICByZXR1cm4gU09DS0VUX0VSUk9SOworfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU29ja2V0UGFpci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU29ja2V0UGFpci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YmY0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9Tb2NrZXRQYWlyLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfV0lORE9XU19TT0NLRVRQQUlSX0hfCisjZGVmaW5lIF9USFJJRlRfV0lORE9XU19TT0NLRVRQQUlSX0hfIDEKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+IDEyMDApCisjcHJhZ21hIG9uY2UKKyNlbmRpZiAvLyBfTVNDX1ZFUgorCisjaWZuZGVmIF9XSU4zMgorI2Vycm9yIFRoaXMgaXMgYSBNU1ZDIGhlYWRlciBvbmx5LgorI2VuZGlmCisKKy8vIFdpbjMyCisjaW5jbHVkZSA8V2luc29jazIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCitpbnQgdGhyaWZ0X3NvY2tldHBhaXIoaW50IGQsIGludCB0eXBlLCBpbnQgcHJvdG9jb2wsIFRIUklGVF9TT0NLRVQgc3ZbMl0pOworCisjZW5kaWYgLy8gX1RIUklGVF9XSU5ET1dTX1NPQ0tFVFBBSVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1N5bmMuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1N5bmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDMyMTk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU3luYy5oCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9XSU5ET1dTX1N5bmNfSF8KKyNkZWZpbmUgX1RIUklGVF9XSU5ET1dTX1N5bmNfSF8gMQorCisjaWZuZGVmIF9XSU4zMgorI2Vycm9yICJ3aW5kb3dzL1N5bmMuaCBpcyBvbmx5IHVzYWJsZSBvbiBXaW5kb3dzIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgorI2luY2x1ZGUgPFdpbmRvd3MuaD4KKworLyoKKyAgTGlnaHR3ZWlnaHQgc3luY2hyb25pemF0aW9uIG9iamVjdHMgdGhhdCBvbmx5IG1ha2Ugc2Vuc2Ugb24gV2luZG93cy4gIEZvciBjcm9zcy1wbGF0Zm9ybQorICBjb2RlLCB1c2UgdGhlIGNsYXNzZXMgZm91bmQgaW4gdGhlIGNvbmN1cnJlbmN5IG5hbWVzcGFjZQorKi8KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKworc3RydWN0IFRDcml0aWNhbFNlY3Rpb24gOiBib29zdDo6bm9uY29weWFibGUgeworICBDUklUSUNBTF9TRUNUSU9OIGNzOworICBUQ3JpdGljYWxTZWN0aW9uKCkgeyBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCZjcyk7IH0KKyAgflRDcml0aWNhbFNlY3Rpb24oKSB7IERlbGV0ZUNyaXRpY2FsU2VjdGlvbigmY3MpOyB9Cit9OworCitjbGFzcyBUQXV0b0NyaXQgOiBib29zdDo6bm9uY29weWFibGUgeworcHJpdmF0ZToKKyAgQ1JJVElDQUxfU0VDVElPTiogY3NfOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFRBdXRvQ3JpdChUQ3JpdGljYWxTZWN0aW9uJiBjcykgOiBjc18oJmNzLmNzKSB7IEVudGVyQ3JpdGljYWxTZWN0aW9uKGNzXyk7IH0KKyAgflRBdXRvQ3JpdCgpIHsgTGVhdmVDcml0aWNhbFNlY3Rpb24oY3NfKTsgfQorfTsKKworc3RydWN0IFRBdXRvUmVzZXRFdmVudCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CisgIEhBTkRMRSBoOworCisgIFRBdXRvUmVzZXRFdmVudCgpIHsKKyAgICBoID0gQ3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUQXV0b1Jlc2V0RXZlbnQgdW5hYmxlIHRvIGNyZWF0ZSBldmVudCwgR0xFPSIsIEdldExhc3RFcnJvcigpKTsKKyAgICAgIHRocm93IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oIkNyZWF0ZUV2ZW50IGZhaWxlZCIpOworICAgIH0KKyAgfQorICB+VEF1dG9SZXNldEV2ZW50KCkgeyBDbG9zZUhhbmRsZShoKTsgfQorfTsKKworc3RydWN0IFRNYW51YWxSZXNldEV2ZW50IDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKKyAgSEFORExFIGg7CisKKyAgVE1hbnVhbFJlc2V0RXZlbnQoKSB7CisgICAgaCA9IENyZWF0ZUV2ZW50KE5VTEwsIFRSVUUsIEZBTFNFLCBOVUxMKTsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTWFudWFsUmVzZXRFdmVudCB1bmFibGUgdG8gY3JlYXRlIGV2ZW50LCBHTEU9IiwgR2V0TGFzdEVycm9yKCkpOworICAgICAgdGhyb3cgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigiQ3JlYXRlRXZlbnQgZmFpbGVkIik7CisgICAgfQorICB9CisgIH5UTWFudWFsUmVzZXRFdmVudCgpIHsgQ2xvc2VIYW5kbGUoaCk7IH0KK307CisKK3N0cnVjdCBUQXV0b0hhbmRsZSA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CisgIEhBTkRMRSBoOworICBleHBsaWNpdCBUQXV0b0hhbmRsZShIQU5ETEUgaF8gPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgOiBoKGhfKSB7fQorICB+VEF1dG9IYW5kbGUoKSB7CisgICAgaWYgKGggIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgICBDbG9zZUhhbmRsZShoKTsKKyAgfQorCisgIEhBTkRMRSByZWxlYXNlKCkgeworICAgIEhBTkRMRSByZXR2YWwgPSBoOworICAgIGggPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICByZXR1cm4gcmV0dmFsOworICB9CisgIHZvaWQgcmVzZXQoSEFORExFIGhfID0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICBpZiAoaF8gPT0gaCkKKyAgICAgIHJldHVybjsKKyAgICBpZiAoaCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgIENsb3NlSGFuZGxlKGgpOworICAgIGggPSBoXzsKKyAgfQorfTsKK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2ODNiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmNwcApAQCAtMCwwICsxLDYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgorCisvLyBib29zdAorI2luY2x1ZGUgPGJvb3N0L2Fzc2VydC5ocHA+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK1RXaW5zb2NrU2luZ2xldG9uOjppbnN0YW5jZV9wdHIgVFdpbnNvY2tTaW5nbGV0b246Omluc3RhbmNlX3B0cl8oTlVMTCk7CitzdGQ6Om9uY2VfZmxhZyBUV2luc29ja1NpbmdsZXRvbjo6ZmxhZ3NfOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVFdpbnNvY2tTaW5nbGV0b246OlRXaW5zb2NrU2luZ2xldG9uKHZvaWQpIHsKKyAgV09SRCB2ZXJzaW9uKE1BS0VXT1JEKDIsIDIpKTsKKyAgV1NBRGF0YSBkYXRhID0gezB9OworCisgIGludCBlcnJvcihXU0FTdGFydHVwKHZlcnNpb24sICZkYXRhKSk7CisgIGlmIChlcnJvciAhPSAwKSB7CisgICAgQk9PU1RfQVNTRVJUKGZhbHNlKTsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIkZhaWxlZCB0byBpbml0aWFsaXNlIFdpbnNvY2suIik7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RXaW5zb2NrU2luZ2xldG9uOjp+VFdpbnNvY2tTaW5nbGV0b24odm9pZCkgeworICBXU0FDbGVhbnVwKCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIFRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUodm9pZCkgeworICBzdGQ6OmNhbGxfb25jZShmbGFnc18sIGluaXQpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBUV2luc29ja1NpbmdsZXRvbjo6aW5pdCh2b2lkKSB7CisgIGluc3RhbmNlX3B0cl8ucmVzZXQobmV3IFRXaW5zb2NrU2luZ2xldG9uKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMwODA2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1dJTkRPV1NfVFdJTlNPQ0tTSU5HTEVUT05fSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfV0lORE9XU19UV0lOU09DS1NJTkdMRVRPTl9IXyAxCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPiAxMjAwKQorI3ByYWdtYSBvbmNlCisjZW5kaWYgLy8gX01TQ19WRVIKKworI2lmbmRlZiBfV0lOMzIKKyNlcnJvciBUaGlzIGlzIGEgTVNWQyBoZWFkZXIgb25seS4KKyNlbmRpZgorCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworLy8gYm9vc3QKKyNpbmNsdWRlIDxib29zdC9ub25jb3B5YWJsZS5ocHA+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIFdpbnNvY2syIG11c3QgYmUgaW50aWFsaXNlZCBvbmNlIG9ubHkgaW4gb3JkZXIgdG8gY3JlYXRlIHNvY2tldHMuIFRoaXMgY2xhc3MKKyAqIHBlcmZvcm1zIGEgb25lIHRpbWUgaW5pdGlhbGlzYXRpb24gd2hlbiBjcmVhdGUgaXMgY2FsbGVkLgorICovCitjbGFzcyBUV2luc29ja1NpbmdsZXRvbiA6IHByaXZhdGUgYm9vc3Q6Om5vbmNvcHlhYmxlIHsKKworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6c2hhcmVkX3B0cjxUV2luc29ja1NpbmdsZXRvbj4gaW5zdGFuY2VfcHRyOworCitwcml2YXRlOgorICBUV2luc29ja1NpbmdsZXRvbih2b2lkKTsKKworcHVibGljOgorICB+VFdpbnNvY2tTaW5nbGV0b24odm9pZCk7CisKK3B1YmxpYzoKKyAgc3RhdGljIHZvaWQgY3JlYXRlKHZvaWQpOworCitwcml2YXRlOgorICBzdGF0aWMgdm9pZCBpbml0KHZvaWQpOworCitwcml2YXRlOgorICBzdGF0aWMgaW5zdGFuY2VfcHRyIGluc3RhbmNlX3B0cl87CisgIHN0YXRpYyBzdGQ6Om9uY2VfZmxhZyBmbGFnc187Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyBfVEhSSUZUX1RSQU5TUE9SVF9XSU5ET1dTX1RXSU5TT0NLU0lOR0xFVE9OX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9XaW5GY250bC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9XaW5GY250bC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkwN2U5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1dpbkZjbnRsLmNwcApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuaD4KKworaW50IHRocmlmdF9mY250bChUSFJJRlRfU09DS0VUIGZkLCBpbnQgY21kLCBpbnQgZmxhZ3MpIHsKKyAgaWYgKGNtZCAhPSBUSFJJRlRfRl9HRVRGTCAmJiBjbWQgIT0gVEhSSUZUX0ZfU0VURkwpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoZmxhZ3MgIT0gVEhSSUZUX09fTk9OQkxPQ0sgJiYgZmxhZ3MgIT0gMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChjbWQgPT0gVEhSSUZUX0ZfR0VURkwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGludCByZXM7CisgIGlmIChmbGFncykgeworICAgIHJlcyA9IGlvY3Rsc29ja2V0KGZkLCBGSU9OQklPLCByZWludGVycHJldF9jYXN0PHVfbG9uZyo+KCYoZmxhZ3MgPSAxKSkpOworICB9IGVsc2UgeworICAgIHJlcyA9IGlvY3Rsc29ja2V0KGZkLCBGSU9OQklPLCByZWludGVycHJldF9jYXN0PHVfbG9uZyo+KCYoZmxhZ3MgPSAwKSkpOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworI2lmIFdJTlZFUiA8PSAweDA1MDIgLy8gWFAsIFNlcnZlcjIwMDMKK2ludCB0aHJpZnRfcG9sbChUSFJJRlRfUE9MTEZEKiBmZEFycmF5LCBVTE9ORyBuZmRzLCBJTlQgdGltZW91dCkgeworICBmZF9zZXQgcmVhZF9mZHMsIHdyaXRlX2ZkczsKKyAgZmRfc2V0KiByZWFkX2Zkc19wdHIgPSBOVUxMOworICBmZF9zZXQqIHdyaXRlX2Zkc19wdHIgPSBOVUxMOworCisgIEZEX1pFUk8oJnJlYWRfZmRzKTsKKyAgRkRfWkVSTygmd3JpdGVfZmRzKTsKKworICBmb3IgKFVMT05HIGkgPSAwOyBpIDwgbmZkczsgaSsrKSB7CisgICAgLy8gUmVhZCAoaW4pIHNvY2tldAorICAgIGlmICgoZmRBcnJheVtpXS5ldmVudHMgJiBUSFJJRlRfUE9MTElOKSA9PSBUSFJJRlRfUE9MTElOKSB7CisgICAgICByZWFkX2Zkc19wdHIgPSAmcmVhZF9mZHM7CisgICAgICBGRF9TRVQoZmRBcnJheVtpXS5mZCwgJnJlYWRfZmRzKTsKKyAgICB9CisgICAgLy8gV3JpdGUgKG91dCkgc29ja2V0CisgICAgZWxzZSBpZiAoKGZkQXJyYXlbaV0uZXZlbnRzICYgVEhSSUZUX1BPTExPVVQpID09IFRIUklGVF9QT0xMT1VUKSB7CisgICAgICB3cml0ZV9mZHNfcHRyID0gJndyaXRlX2ZkczsKKyAgICAgIEZEX1NFVChmZEFycmF5W2ldLmZkLCAmd3JpdGVfZmRzKTsKKyAgICB9CisgIH0KKworICB0aW1ldmFsIHRpbWVfb3V0OworICB0aW1ldmFsKiB0aW1lX291dF9wdHIgPSBOVUxMOworICBpZiAodGltZW91dCA+PSAwKSB7CisgICAgdGltZV9vdXQudHZfc2VjID0gdGltZW91dCAvIDEwMDA7CisgICAgdGltZV9vdXQudHZfdXNlYyA9ICh0aW1lb3V0ICUgMTAwMCkgKiAxMDAwOworICAgIHRpbWVfb3V0X3B0ciA9ICZ0aW1lX291dDsKKyAgfSBlbHNlIHsgLy8gdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MKKyAgICAodm9pZCl0aW1lX291dDsKKyAgICAodm9pZCl0aW1lb3V0OworICB9CisKKyAgaW50IHNrdHJlYWR5ID0gc2VsZWN0KDEsIHJlYWRfZmRzX3B0ciwgd3JpdGVfZmRzX3B0ciwgTlVMTCwgdGltZV9vdXRfcHRyKTsKKyAgaWYgKHNrdHJlYWR5ID4gMCkgeworICAgIGZvciAoVUxPTkcgaSA9IDA7IGkgPCBuZmRzOyBpKyspIHsKKyAgICAgIGZkQXJyYXlbaV0ucmV2ZW50cyA9IDA7CisgICAgICBpZiAoRkRfSVNTRVQoZmRBcnJheVtpXS5mZCwgJnJlYWRfZmRzKSkKKyAgICAgICAgZmRBcnJheVtpXS5yZXZlbnRzIHw9IFRIUklGVF9QT0xMSU47CisgICAgICBpZiAoRkRfSVNTRVQoZmRBcnJheVtpXS5mZCwgJndyaXRlX2ZkcykpCisgICAgICAgIGZkQXJyYXlbaV0ucmV2ZW50cyB8PSBUSFJJRlRfUE9MTE9VVDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNrdHJlYWR5OworfQorI2Vsc2UgIC8vIFZpc3RhLCBXaW43Li4uCitpbnQgdGhyaWZ0X3BvbGwoVEhSSUZUX1BPTExGRCogZmRBcnJheSwgVUxPTkcgbmZkcywgSU5UIHRpbWVvdXQpIHsKKyAgcmV0dXJuIFdTQVBvbGwoZmRBcnJheSwgbmZkcywgdGltZW91dCk7Cit9CisjZW5kaWYgLy8gV0lOVkVSCisKKyNpZmRlZiBfV0lOMzJfV0NFCitzdGQ6OnN0cmluZyB0aHJpZnRfd3N0cjJzdHIoc3RkOjp3c3RyaW5nIHdzKSB7CisgIHN0ZDo6c3RyaW5nIHMod3MuYmVnaW4oKSwgd3MuZW5kKCkpOworICByZXR1cm4gczsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1dpbkZjbnRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM2YmU5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1dpbkZjbnRsLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfV0lORE9XU19GQ05UTF9IXworI2RlZmluZSBfVEhSSUZUX1dJTkRPV1NfRkNOVExfSF8gMQorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gMTIwMCkKKyNwcmFnbWEgb25jZQorI2VuZGlmIC8vIF9NU0NfVkVSCisKKyNpZm5kZWYgX1dJTjMyCisjZXJyb3IgVGhpcyBpcyBhIE1TVkMgaGVhZGVyIG9ubHkuCisjZW5kaWYKKworI2lmZGVmIF9XSU4zMl9XQ0UKKyNpbmNsdWRlIDxzdHJpbmc+CisjZW5kaWYKKworLy8gV2luMzIKKyNpbmNsdWRlIDxXaW5zb2NrMi5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKworI2lmIFdJTlZFUiA8PSAweDA1MDIgLy8gWFAsIFNlcnZlcjIwMDMKK3N0cnVjdCB0aHJpZnRfcG9sbGZkIHsKKyAgVEhSSUZUX1NPQ0tFVCBmZDsKKyAgU0hPUlQgZXZlbnRzOworICBTSE9SVCByZXZlbnRzOworfTsKKyNlbmRpZgorCitleHRlcm4gIkMiIHsKK2ludCB0aHJpZnRfZmNudGwoVEhSSUZUX1NPQ0tFVCBmZCwgaW50IGNtZCwgaW50IGZsYWdzKTsKK2ludCB0aHJpZnRfcG9sbChUSFJJRlRfUE9MTEZEKiBmZEFycmF5LCBVTE9ORyBuZmRzLCBJTlQgdGltZW91dCk7Cit9CisKKyNpZmRlZiBfV0lOMzJfV0NFCitzdGQ6OnN0cmluZyB0aHJpZnRfd3N0cjJzdHIoc3RkOjp3c3RyaW5nIHdzKTsKKyNlbmRpZgorCisjZW5kaWYgLy8gX1RIUklGVF9XSU5ET1dTX0ZDTlRMX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9jb25maWcuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZjQ0NTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9jb25maWcuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfV0lORE9XU19DT05GSUdfSF8KKyNkZWZpbmUgX1RIUklGVF9XSU5ET1dTX0NPTkZJR19IXyAxCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPiAxMjAwKQorI3ByYWdtYSBvbmNlCisjZW5kaWYgLy8gX01TQ19WRVIKKworI2lmbmRlZiBfV0lOMzIKKyNlcnJvciAiVGhpcyBpcyBhIFdpbmRvd3MgaGVhZGVyIG9ubHkiCisjZW5kaWYKKworLy8gdXNlIHN0ZDo6dGhyZWFkIGluIE1TVkMxMSAoMjAxMikgb3IgbmV3ZXIgYW5kIGluIE1pbkdXCisjaWYgKF9NU0NfVkVSID49IDE3MDApIHx8IGRlZmluZWQoX19NSU5HVzMyX18pCisjZGVmaW5lIFVTRV9TVERfVEhSRUFEIDEKKyNlbmRpZgorCisvLyBTb21ldGhpbmcgdGhhdCBkZWZpbmVzIFBSSWQ2NCBpcyByZXF1aXJlZCB0byBidWlsZAorI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQorCisvLyBWUzIwMTAgb3IgbGF0ZXIgaGFzIHN0ZGludC5oIGFzIGRvZXMgTWluR1cKKyNpZiAoX01TQ19WRVIgPj0gMTYwMCkgfHwgZGVmaW5lZChfX01JTkdXMzJfXykKKyNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisjZW5kaWYKKworI2lmbmRlZiBUQVJHRVRfV0lOX1hQCisjZGVmaW5lIFRBUkdFVF9XSU5fWFAgMQorI2VuZGlmCisKKyNpZiBUQVJHRVRfV0lOX1hQCisjaWZuZGVmIFdJTlZFUgorI2RlZmluZSBXSU5WRVIgMHgwNTAxCisjZW5kaWYKKyNpZm5kZWYgX1dJTjMyX1dJTk5UCisjZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA1MDEKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX1dJTjMyX1dJTk5UCisjZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA2MDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKF9NX1g2NCkKKyNkZWZpbmUgQVJJVEhNRVRJQ19SSUdIVF9TSElGVCAxCisjZGVmaW5lIFNJR05FRF9SSUdIVF9TSElGVF9JUyAxCisjZW5kaWYKKworI2lmbmRlZiBfX01JTkdXMzJfXworI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0OTk2KSAvLyBEZXByZWNhdGVkIHBvc2l4IG5hbWUuCisjZW5kaWYKKworI2RlZmluZSBIQVZFX0dFVFRJTUVPRkRBWSAxCisjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCisKKy8vIE11c3QgYmUgdXNpbmcgVlMyMDEwIG9yIGxhdGVyLCBvciBib29zdCwgc28gdGhhdCBDOTkgdHlwZXMgYXJlIGRlZmluZWQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZWxzZQorI2luY2x1ZGUgPGJvb3N0L2NzdGRpbnQuaHBwPgorCit0eXBlZGVmIGJvb3N0OjppbnQ2NF90IGludDY0X3Q7Cit0eXBlZGVmIGJvb3N0Ojp1aW50NjRfdCB1aW50NjRfdDsKK3R5cGVkZWYgYm9vc3Q6OmludDMyX3QgaW50MzJfdDsKK3R5cGVkZWYgYm9vc3Q6OnVpbnQzMl90IHVpbnQzMl90OwordHlwZWRlZiBib29zdDo6aW50MTZfdCBpbnQxNl90OwordHlwZWRlZiBib29zdDo6dWludDE2X3QgdWludDE2X3Q7Cit0eXBlZGVmIGJvb3N0OjppbnQ4X3QgaW50OF90OwordHlwZWRlZiBib29zdDo6dWludDhfdCB1aW50OF90OworI2VuZGlmCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvR2V0VGltZU9mRGF5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvT3BlcmF0b3JzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9XaW5GY250bC5oPgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1NvY2tldFBhaXIuaD4KKworLy8gd2luZG93cworI2luY2x1ZGUgPFdpbnNvY2syLmg+CisjaW5jbHVkZSA8d3MydGNwaXAuaD4KKyNpZm5kZWYgX19NSU5HVzMyX18KKyAgI2lmZGVmIF9XSU4zMl9XQ0UKKyAgI3ByYWdtYSBjb21tZW50KGxpYiwgIldzMi5saWIiKQorICAjZWxzZQorICAjcHJhZ21hIGNvbW1lbnQobGliLCAiV3MyXzMyLmxpYiIpCisgICNwcmFnbWEgY29tbWVudChsaWIsICJhZHZhcGkzMi5saWIiKSAvLyBGb3Igc2VjdXJpdHkgQVBJcyBpbiBUUGlwZVNlcnZlcgorICAjcHJhZ21hIGNvbW1lbnQobGliLCAiU2hsd2FwaS5saWIiKSAgLy8gRm9yIFN0clN0cklBIGluIFRQaXBlU2VydmVyCisgICNlbmRpZgorI2VuZGlmIC8vIF9fTUlOR1czMl9fCisKKyNlbmRpZiAvLyBfVEhSSUZUX1dJTkRPV1NfQ09ORklHX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI5MjBjMi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0KLXVzaW5nIHN0ZDo6c3RyaW5nOwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi0KLXVpbnQzMl90IFRCdWZmZXJlZFRyYW5zcG9ydDo6cmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgdWludDMyX3QgaGF2ZSA9IHJCb3VuZF8gLSByQmFzZV87Ci0KLSAgLy8gV2Ugc2hvdWxkIG9ubHkgdGFrZSB0aGUgc2xvdyBwYXRoIGlmIHdlIGNhbid0IHNhdGlzZnkgdGhlIHJlYWQKLSAgLy8gd2l0aCB0aGUgZGF0YSBhbHJlYWR5IGluIHRoZSBidWZmZXIuCi0gIGFzc2VydChoYXZlIDwgbGVuKTsKLQotICAvLyBJZiB3ZSBoYXZlIHNvbWUgZGF0ZSBpbiB0aGUgYnVmZmVyLCBjb3B5IGl0IG91dCBhbmQgcmV0dXJuIGl0LgotICAvLyBXZSBoYXZlIHRvIHJldHVybiBpdCB3aXRob3V0IGF0dGVtcHRpbmcgdG8gcmVhZCBtb3JlLCBzaW5jZSB3ZSBhcmVuJ3QKLSAgLy8gZ3VhcmFudGVlZCB0aGF0IHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBhY3R1YWxseSBoYXMgbW9yZSBkYXRhLCBzbwotICAvLyBhdHRlbXB0aW5nIHRvIHJlYWQgZnJvbSBpdCBjb3VsZCBibG9jay4KLSAgaWYgKGhhdmUgPiAwKSB7Ci0gICAgbWVtY3B5KGJ1ZiwgckJhc2VfLCBoYXZlKTsKLSAgICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCAwKTsKLSAgICByZXR1cm4gaGF2ZTsKLSAgfQotCi0gIC8vIE5vIGRhdGEgaXMgYXZhaWxhYmxlIGluIG91ciBidWZmZXIuCi0gIC8vIEdldCBtb3JlIGZyb20gdW5kZXJseWluZyB0cmFuc3BvcnQgdXAgdG8gYnVmZmVyIHNpemUuCi0gIC8vIE5vdGUgdGhhdCB0aGlzIG1ha2VzIGEgbG90IG9mIHNlbnNlIGlmIGxlbiA8IHJCdWZTaXplXwotICAvLyBhbmQgYWxtb3N0IG5vIHNlbnNlIG90aGVyd2lzZS4gIFRPRE8oZHJlaXNzKTogRml4IHRoYXQKLSAgLy8gY2FzZSAocG9zc2libHkgaW5jbHVkaW5nIHNvbWUgcmVhZHYgaG90bmVzcykuCi0gIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIHRyYW5zcG9ydF8tPnJlYWQockJ1Zl8uZ2V0KCksIHJCdWZTaXplXykpOwotCi0gIC8vIEhhbmQgb3ZlciB3aGF0ZXZlciB3ZSBoYXZlLgotICB1aW50MzJfdCBnaXZlID0gc3RkOjptaW4obGVuLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4ockJvdW5kXyAtIHJCYXNlXykpOwotICBtZW1jcHkoYnVmLCByQmFzZV8sIGdpdmUpOwotICByQmFzZV8gKz0gZ2l2ZTsKLQotICByZXR1cm4gZ2l2ZTsKLX0KLQotdm9pZCBUQnVmZmVyZWRUcmFuc3BvcnQ6OndyaXRlU2xvdyhjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICB1aW50MzJfdCBoYXZlX2J5dGVzID0gd0Jhc2VfIC0gd0J1Zl8uZ2V0KCk7Ci0gIHVpbnQzMl90IHNwYWNlID0gd0JvdW5kXyAtIHdCYXNlXzsKLSAgLy8gV2Ugc2hvdWxkIG9ubHkgdGFrZSB0aGUgc2xvdyBwYXRoIGlmIHdlIGNhbid0IGFjY29tb2RhdGUgdGhlIHdyaXRlCi0gIC8vIHdpdGggdGhlIGZyZWUgc3BhY2UgYWxyZWFkeSBpbiB0aGUgYnVmZmVyLgotICBhc3NlcnQod0JvdW5kXyAtIHdCYXNlXyA8IHN0YXRpY19jYXN0PHB0cmRpZmZfdD4obGVuKSk7Ci0KLSAgLy8gTm93IGhlcmUncyB0aGUgdHJpY2t5IHF1ZXN0aW9uOiBzaG91bGQgd2UgY29weSBkYXRhIGZyb20gYnVmIGludG8gb3VyCi0gIC8vIGludGVybmFsIGJ1ZmZlciBhbmQgd3JpdGUgaXQgZnJvbSB0aGVyZSwgb3Igc2hvdWxkIHdlIGp1c3Qgd3JpdGUgb3V0Ci0gIC8vIHRoZSBjdXJyZW50IGludGVybmFsIGJ1ZmZlciBpbiBvbmUgc3lzY2FsbCBhbmQgd3JpdGUgb3V0IGJ1ZiBpbiBhbm90aGVyLgotICAvLyBJZiBvdXIgY3VycmVudGx5IGJ1ZmZlcmVkIGRhdGEgcGx1cyBidWYgaXMgYXQgbGVhc3QgZG91YmxlIG91ciBidWZmZXIKLSAgLy8gc2l6ZSwgd2Ugd2lsbCBoYXZlIHRvIGRvIHR3byBzeXNjYWxscyBubyBtYXR0ZXIgd2hhdCAoZXhjZXB0IGluIHRoZQotICAvLyBkZWdlbmVyYXRlIGNhc2Ugd2hlbiBvdXIgYnVmZmVyIGlzIGVtcHR5KSwgc28gdGhlcmUgaXMgbm8gdXNlIGNvcHlpbmcuCi0gIC8vIE90aGVyd2lzZSwgdGhlcmUgaXMgc29ydCBvZiBhIHNsaWRpbmcgc2NhbGUuICBJZiB3ZSBoYXZlIE4tMSBieXRlcwotICAvLyBidWZmZXJlZCBhbmQgbmVlZCB0byB3cml0ZSAyLCBpdCB3b3VsZCBiZSBjcmF6eSB0byBkbyB0d28gc3lzY2FsbHMuCi0gIC8vIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB3ZSBoYXZlIDIgYnl0ZXMgYnVmZmVyZWQgYW5kIGFyZSB3cml0aW5nIDJOLTMsCi0gIC8vIHdlIGNhbiBzYXZlIGEgc3lzY2FsbCBpbiB0aGUgc2hvcnQgdGVybSBieSBsb2FkaW5nIHVwIG91ciBidWZmZXIsIHdyaXRpbmcKLSAgLy8gaXQgb3V0LCBhbmQgY29weWluZyB0aGUgcmVzdCBvZiB0aGUgYnl0ZXMgaW50byBvdXIgYnVmZmVyLiAgT2YgY291cnNlLAotICAvLyBpZiB3ZSBnZXQgYW5vdGhlciAyLWJ5dGUgd3JpdGUsIHdlIGhhdmVuJ3Qgc2F2ZWQgYW55IHN5c2NhbGxzIGF0IGFsbCwKLSAgLy8gYW5kIGhhdmUganVzdCBjb3BpZWQgbmVhcmx5IDJOIGJ5dGVzIGZvciBub3RoaW5nLiAgRmluZGluZyBhIHBlcmZlY3QKLSAgLy8gcG9saWN5IHdvdWxkIHJlcXVpcmUgcHJlZGljdGluZyB0aGUgc2l6ZSBvZiBmdXR1cmUgd3JpdGVzLCBzbyB3ZSdyZSBqdXN0Ci0gIC8vIGdvaW5nIHRvIGFsd2F5cyBlc2NoZXcgc3lzY2FsbHMgaWYgd2UgaGF2ZSBsZXNzIHRoYW4gMk4gYnl0ZXMgdG8gd3JpdGUuCi0KLSAgLy8gVGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSB0byBkbyB0d28gc3lzY2FsbHMuCi0gIC8vIFRoaXMgY2FzZSBhbHNvIGNvdmVycyB0aGUgY2FzZSB3aGVyZSB0aGUgYnVmZmVyIGlzIGVtcHR5LAotICAvLyBidXQgaXQgaXMgY2xlYXJlciAoSSB0aGluaykgdG8gdGhpbmsgb2YgaXQgYXMgdHdvIHNlcGFyYXRlIGNhc2VzLgotICBpZiAoKGhhdmVfYnl0ZXMgKyBsZW4gPj0gMip3QnVmU2l6ZV8pIHx8IChoYXZlX2J5dGVzID09IDApKSB7Ci0gICAgLy8gVE9ETyhkcmVpc3MpOiB3cml0ZXYKLSAgICBpZiAoaGF2ZV9ieXRlcyA+IDApIHsKLSAgICAgIHRyYW5zcG9ydF8tPndyaXRlKHdCdWZfLmdldCgpLCBoYXZlX2J5dGVzKTsKLSAgICB9Ci0gICAgdHJhbnNwb3J0Xy0+d3JpdGUoYnVmLCBsZW4pOwotICAgIHdCYXNlXyA9IHdCdWZfLmdldCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIEZpbGwgdXAgb3VyIGludGVybmFsIGJ1ZmZlciBmb3IgYSB3cml0ZS4KLSAgbWVtY3B5KHdCYXNlXywgYnVmLCBzcGFjZSk7Ci0gIGJ1ZiArPSBzcGFjZTsKLSAgbGVuIC09IHNwYWNlOwotICB0cmFuc3BvcnRfLT53cml0ZSh3QnVmXy5nZXQoKSwgd0J1ZlNpemVfKTsKLQotICAvLyBDb3B5IHRoZSByZXN0IGludG8gb3VyIGJ1ZmZlci4KLSAgYXNzZXJ0KGxlbiA8IHdCdWZTaXplXyk7Ci0gIG1lbWNweSh3QnVmXy5nZXQoKSwgYnVmLCBsZW4pOwotICB3QmFzZV8gPSB3QnVmXy5nZXQoKSArIGxlbjsKLSAgcmV0dXJuOwotfQotCi1jb25zdCB1aW50OF90KiBUQnVmZmVyZWRUcmFuc3BvcnQ6OmJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7Ci0gICh2b2lkKSBidWY7Ci0gICh2b2lkKSBsZW47Ci0gIC8vIFNpbXBseSByZXR1cm4gTlVMTC4gIFdlIGRvbid0IGtub3cgaWYgdGhlcmUgaXMgYWN0dWFsbHkgZGF0YSBhdmFpbGFibGUgb24KLSAgLy8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LCBzbyBjYWxsaW5nIHJlYWQoKSBtaWdodCBibG9jay4KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgVEJ1ZmZlcmVkVHJhbnNwb3J0OjpmbHVzaCgpICB7Ci0gIC8vIFdyaXRlIG91dCBhbnkgZGF0YSB3YWl0aW5nIGluIHRoZSB3cml0ZSBidWZmZXIuCi0gIHVpbnQzMl90IGhhdmVfYnl0ZXMgPSB3QmFzZV8gLSB3QnVmXy5nZXQoKTsKLSAgaWYgKGhhdmVfYnl0ZXMgPiAwKSB7Ci0gICAgLy8gTm90ZSB0aGF0IHdlIHJlc2V0IHdCYXNlXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQotICAgIC8vIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUgKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpCi0gICAgLy8gaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzIHVwIGFuIGV4Y2VwdGlvbgotICAgIHdCYXNlXyA9IHdCdWZfLmdldCgpOwotICAgIHRyYW5zcG9ydF8tPndyaXRlKHdCdWZfLmdldCgpLCBoYXZlX2J5dGVzKTsKLSAgfQotCi0gIC8vIEZsdXNoIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KLSAgdHJhbnNwb3J0Xy0+Zmx1c2goKTsKLX0KLQotCi11aW50MzJfdCBURnJhbWVkVHJhbnNwb3J0OjpyZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICB1aW50MzJfdCB3YW50ID0gbGVuOwotICB1aW50MzJfdCBoYXZlID0gckJvdW5kXyAtIHJCYXNlXzsKLQotICAvLyBXZSBzaG91bGQgb25seSB0YWtlIHRoZSBzbG93IHBhdGggaWYgd2UgY2FuJ3Qgc2F0aXNmeSB0aGUgcmVhZAotICAvLyB3aXRoIHRoZSBkYXRhIGFscmVhZHkgaW4gdGhlIGJ1ZmZlci4KLSAgYXNzZXJ0KGhhdmUgPCB3YW50KTsKLQotICAvLyBDb3B5IG91dCB3aGF0ZXZlciB3ZSBoYXZlLgotICBpZiAoaGF2ZSA+IDApIHsKLSAgICBtZW1jcHkoYnVmLCByQmFzZV8sIGhhdmUpOwotICAgIHdhbnQgLT0gaGF2ZTsKLSAgICBidWYgKz0gaGF2ZTsKLSAgfQotCi0gIC8vIFJlYWQgYW5vdGhlciBmcmFtZS4KLSAgaWYgKCFyZWFkRnJhbWUoKSkgewotICAgIC8vIEVPRi4gIE5vIGZyYW1lIGF2YWlsYWJsZS4KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIFRPRE8oZHJlaXNzKTogU2hvdWxkIHdlIHdhcm4gd2hlbiByZWFkcyBjcm9zcyBmcmFtZXM/Ci0KLSAgLy8gSGFuZCBvdmVyIHdoYXRldmVyIHdlIGhhdmUuCi0gIHVpbnQzMl90IGdpdmUgPSBzdGQ6Om1pbih3YW50LCBzdGF0aWNfY2FzdDx1aW50MzJfdD4ockJvdW5kXyAtIHJCYXNlXykpOwotICBtZW1jcHkoYnVmLCByQmFzZV8sIGdpdmUpOwotICByQmFzZV8gKz0gZ2l2ZTsKLSAgd2FudCAtPSBnaXZlOwotCi0gIHJldHVybiAobGVuIC0gd2FudCk7Ci19Ci0KLWJvb2wgVEZyYW1lZFRyYW5zcG9ydDo6cmVhZEZyYW1lKCkgewotICAvLyBUT0RPKGRyZWlzcyk6IFRoaW5rIGFib3V0IHVzaW5nIHJlYWR2IGhlcmUsIGV2ZW4gdGhvdWdoIGl0IHdvdWxkCi0gIC8vIHJlc3VsdCBpbiAoZ2FzcCkgcmVhZC1haGVhZC4KLQotICAvLyBSZWFkIHRoZSBzaXplIG9mIHRoZSBuZXh0IGZyYW1lLgotICAvLyBXZSBjYW4ndCB1c2UgcmVhZEFsbCgmc3osIHNpemVvZihzeikpLCBzaW5jZSB0aGF0IGFsd2F5cyB0aHJvd3MgYW4KLSAgLy8gZXhjZXB0aW9uIG9uIEVPRi4gIFdlIHdhbnQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIG9ubHkgaWYgRU9GIG9jY3VycyBhZnRlcgotICAvLyBwYXJ0aWFsIHNpemUgZGF0YS4KLSAgaW50MzJfdCBzejsKLSAgdWludDMyX3Qgc2l6ZV9ieXRlc19yZWFkID0gMDsKLSAgd2hpbGUgKHNpemVfYnl0ZXNfcmVhZCA8IHNpemVvZihzeikpIHsKLSAgICB1aW50OF90KiBzenAgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmc3opICsgc2l6ZV9ieXRlc19yZWFkOwotICAgIHVpbnQzMl90IGJ5dGVzX3JlYWQgPSB0cmFuc3BvcnRfLT5yZWFkKHN6cCwgc2l6ZW9mKHN6KSAtIHNpemVfYnl0ZXNfcmVhZCk7Ci0gICAgaWYgKGJ5dGVzX3JlYWQgPT0gMCkgewotICAgICAgaWYgKHNpemVfYnl0ZXNfcmVhZCA9PSAwKSB7Ci0gICAgICAgIC8vIEVPRiBiZWZvcmUgYW55IGRhdGEgd2FzIHJlYWQuCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEVPRiBhZnRlciBhIHBhcnRpYWwgZnJhbWUgaGVhZGVyLiAgUmFpc2UgYW4gZXhjZXB0aW9uLgotICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBtb3JlIGRhdGEgdG8gcmVhZCBhZnRlciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnRpYWwgZnJhbWUgaGVhZGVyLiIpOwotICAgICAgfQotICAgIH0KLSAgICBzaXplX2J5dGVzX3JlYWQgKz0gYnl0ZXNfcmVhZDsKLSAgfQotCi0gIHN6ID0gbnRvaGwoc3opOwotCi0gIGlmIChzeiA8IDApIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJGcmFtZSBzaXplIGhhcyBuZWdhdGl2ZSB2YWx1ZSIpOwotICB9Ci0KLSAgLy8gUmVhZCB0aGUgZnJhbWUgcGF5bG9hZCwgYW5kIHJlc2V0IG1hcmtlcnMuCi0gIGlmIChzeiA+IHN0YXRpY19jYXN0PGludDMyX3Q+KHJCdWZTaXplXykpIHsKLSAgICByQnVmXy5yZXNldChuZXcgdWludDhfdFtzel0pOwotICAgIHJCdWZTaXplXyA9IHN6OwotICB9Ci0gIHRyYW5zcG9ydF8tPnJlYWRBbGwockJ1Zl8uZ2V0KCksIHN6KTsKLSAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgc3opOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBURnJhbWVkVHJhbnNwb3J0Ojp3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgLy8gRG91YmxlIGJ1ZmZlciBzaXplIHVudGlsIHN1ZmZpY2llbnQuCi0gIHVpbnQzMl90IGhhdmUgPSB3QmFzZV8gLSB3QnVmXy5nZXQoKTsKLSAgdWludDMyX3QgbmV3X3NpemUgPSB3QnVmU2l6ZV87Ci0gIHdoaWxlIChuZXdfc2l6ZSA8IGxlbiArIGhhdmUpIHsKLSAgICBuZXdfc2l6ZSA9IG5ld19zaXplID4gMCA/IG5ld19zaXplICogMiA6IDE7Ci0gIH0KLQotICAvLyBUT0RPKGRyZWlzcyk6IENvbnNpZGVyIG1vZGlmeWluZyB0aGlzIGNsYXNzIHRvIHVzZSBtYWxsb2MvZnJlZQotICAvLyBzbyB3ZSBjYW4gdXNlIHJlYWxsb2MgaGVyZS4KLQotICAvLyBBbGxvY2F0ZSBuZXcgYnVmZmVyLgotICB1aW50OF90KiBuZXdfYnVmID0gbmV3IHVpbnQ4X3RbbmV3X3NpemVdOwotCi0gIC8vIENvcHkgdGhlIG9sZCBidWZmZXIgdG8gdGhlIG5ldyBvbmUuCi0gIG1lbWNweShuZXdfYnVmLCB3QnVmXy5nZXQoKSwgaGF2ZSk7Ci0KLSAgLy8gTm93IHBvaW50IGJ1ZiB0byB0aGUgbmV3IG9uZS4KLSAgd0J1Zl8ucmVzZXQobmV3X2J1Zik7Ci0gIHdCdWZTaXplXyA9IG5ld19zaXplOwotICB3QmFzZV8gPSB3QnVmXy5nZXQoKSArIGhhdmU7Ci0gIHdCb3VuZF8gPSB3QnVmXy5nZXQoKSArIHdCdWZTaXplXzsKLQotICAvLyBDb3B5IHRoZSBkYXRhIGludG8gdGhlIG5ldyBidWZmZXIuCi0gIG1lbWNweSh3QmFzZV8sIGJ1ZiwgbGVuKTsKLSAgd0Jhc2VfICs9IGxlbjsKLX0KLQotdm9pZCBURnJhbWVkVHJhbnNwb3J0OjpmbHVzaCgpICB7Ci0gIGludDMyX3Qgc3pfaGJvLCBzel9uYm87Ci0gIGFzc2VydCh3QnVmU2l6ZV8gPiBzaXplb2Yoc3pfbmJvKSk7Ci0KLSAgLy8gU2xpcCB0aGUgZnJhbWUgc2l6ZSBpbnRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyLgotICBzel9oYm8gPSB3QmFzZV8gLSAod0J1Zl8uZ2V0KCkgKyBzaXplb2Yoc3pfbmJvKSk7Ci0gIHN6X25ibyA9IChpbnQzMl90KWh0b25sKCh1aW50MzJfdCkoc3pfaGJvKSk7Ci0gIG1lbWNweSh3QnVmXy5nZXQoKSwgKHVpbnQ4X3QqKSZzel9uYm8sIHNpemVvZihzel9uYm8pKTsKLQotICBpZiAoc3pfaGJvID4gMCkgewotICAgIC8vIE5vdGUgdGhhdCB3ZSByZXNldCB3QmFzZV8gKHdpdGggYSBwYWQgZm9yIHRoZSBmcmFtZSBzaXplKQotICAgIC8vIHByaW9yIHRvIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUKLSAgICAvLyAoaS5lLiBpbnRlcm5hbCBidWZmZXIgY2xlYW5lZCkgaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzCi0gICAgLy8gdXAgYW4gZXhjZXB0aW9uCi0gICAgd0Jhc2VfID0gd0J1Zl8uZ2V0KCkgKyBzaXplb2Yoc3pfbmJvKTsKLQotICAgIC8vIFdyaXRlIHNpemUgYW5kIGZyYW1lIGJvZHkuCi0gICAgdHJhbnNwb3J0Xy0+d3JpdGUod0J1Zl8uZ2V0KCksIHNpemVvZihzel9uYm8pK3N6X2hibyk7Ci0gIH0KLQotICAvLyBGbHVzaCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCi0gIHRyYW5zcG9ydF8tPmZsdXNoKCk7Ci19Ci0KLXVpbnQzMl90IFRGcmFtZWRUcmFuc3BvcnQ6OndyaXRlRW5kKCkgewotICByZXR1cm4gd0Jhc2VfIC0gd0J1Zl8uZ2V0KCk7Ci19Ci0KLWNvbnN0IHVpbnQ4X3QqIFRGcmFtZWRUcmFuc3BvcnQ6OmJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7Ci0gICh2b2lkKSBidWY7Ci0gICh2b2lkKSBsZW47Ci0gIC8vIERvbid0IHRyeSB0byBiZSBjbGV2ZXIgd2l0aCBzaGlmdGluZyBidWZmZXJzLgotICAvLyBJZiB0aGUgZmFzdCBwYXRoIGZhaWxlZCBsZXQgdGhlIHByb3RvY29sIHVzZSBpdHMgc2xvdyBwYXRoLgotICAvLyBCZXNpZGVzLCB3aG8gaXMgZ29pbmcgdG8gdHJ5IHRvIGJvcnJvdyBhY3Jvc3MgbWVzc2FnZXM/Ci0gIHJldHVybiBOVUxMOwotfQotCi11aW50MzJfdCBURnJhbWVkVHJhbnNwb3J0OjpyZWFkRW5kKCkgewotICAvLyBpbmNsdWRlIGZyYW1pbmcgYnl0ZXMKLSAgcmV0dXJuIHJCb3VuZF8gLSByQnVmXy5nZXQoKSArIHNpemVvZih1aW50MzJfdCk7Ci19Ci0KLXZvaWQgVE1lbW9yeUJ1ZmZlcjo6Y29tcHV0ZVJlYWQodWludDMyX3QgbGVuLCB1aW50OF90Kiogb3V0X3N0YXJ0LCB1aW50MzJfdCogb3V0X2dpdmUpIHsKLSAgLy8gQ29ycmVjdCByQm91bmRfIHNvIHdlIGNhbiB1c2UgdGhlIGZhc3QgcGF0aCBpbiB0aGUgZnV0dXJlLgotICByQm91bmRfID0gd0Jhc2VfOwotCi0gIC8vIERlY2lkZSBob3cgbXVjaCB0byBnaXZlLgotICB1aW50MzJfdCBnaXZlID0gc3RkOjptaW4obGVuLCBhdmFpbGFibGVfcmVhZCgpKTsKLQotICAqb3V0X3N0YXJ0ID0gckJhc2VfOwotICAqb3V0X2dpdmUgPSBnaXZlOwotCi0gIC8vIFByZWluY3JlbWVudCByQmFzZV8gc28gdGhlIGNhbGxlciBkb2Vzbid0IGhhdmUgdG8uCi0gIHJCYXNlXyArPSBnaXZlOwotfQotCi11aW50MzJfdCBUTWVtb3J5QnVmZmVyOjpyZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICB1aW50OF90KiBzdGFydDsKLSAgdWludDMyX3QgZ2l2ZTsKLSAgY29tcHV0ZVJlYWQobGVuLCAmc3RhcnQsICZnaXZlKTsKLQotICAvLyBDb3B5IGludG8gdGhlIHByb3ZpZGVkIGJ1ZmZlci4KLSAgbWVtY3B5KGJ1Ziwgc3RhcnQsIGdpdmUpOwotCi0gIHJldHVybiBnaXZlOwotfQotCi11aW50MzJfdCBUTWVtb3J5QnVmZmVyOjpyZWFkQXBwZW5kVG9TdHJpbmcoc3RkOjpzdHJpbmcmIHN0ciwgdWludDMyX3QgbGVuKSB7Ci0gIC8vIERvbid0IGdldCBzb21lIHN0dXBpZCBhc3NlcnRpb24gZmFpbHVyZS4KLSAgaWYgKGJ1ZmZlcl8gPT0gTlVMTCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgdWludDhfdCogc3RhcnQ7Ci0gIHVpbnQzMl90IGdpdmU7Ci0gIGNvbXB1dGVSZWFkKGxlbiwgJnN0YXJ0LCAmZ2l2ZSk7Ci0KLSAgLy8gQXBwZW5kIHRvIHRoZSBwcm92aWRlZCBzdHJpbmcuCi0gIHN0ci5hcHBlbmQoKGNoYXIqKXN0YXJ0LCBnaXZlKTsKLQotICByZXR1cm4gZ2l2ZTsKLX0KLQotdm9pZCBUTWVtb3J5QnVmZmVyOjplbnN1cmVDYW5Xcml0ZSh1aW50MzJfdCBsZW4pIHsKLSAgLy8gQ2hlY2sgYXZhaWxhYmxlIHNwYWNlCi0gIHVpbnQzMl90IGF2YWlsID0gYXZhaWxhYmxlX3dyaXRlKCk7Ci0gIGlmIChsZW4gPD0gYXZhaWwpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoIW93bmVyXykgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIkluc3VmZmljaWVudCBzcGFjZSBpbiBleHRlcm5hbCBNZW1vcnlCdWZmZXIiKTsKLSAgfQotCi0gIC8vIEdyb3cgdGhlIGJ1ZmZlciBhcyBuZWNlc3NhcnkuCi0gIHVpbnQzMl90IG5ld19zaXplID0gYnVmZmVyU2l6ZV87Ci0gIHdoaWxlIChsZW4gPiBhdmFpbCkgewotICAgIG5ld19zaXplID0gbmV3X3NpemUgPiAwID8gbmV3X3NpemUgKiAyIDogMTsKLSAgICBhdmFpbCA9IGF2YWlsYWJsZV93cml0ZSgpICsgKG5ld19zaXplIC0gYnVmZmVyU2l6ZV8pOwotICB9Ci0KLSAgLy8gQWxsb2NhdGUgaW50byBhIG5ldyBwb2ludGVyIHNvIHdlIGRvbid0IGJvcmsgb3VycyBpZiBpdCBmYWlscy4KLSAgdm9pZCogbmV3X2J1ZmZlciA9IHN0ZDo6cmVhbGxvYyhidWZmZXJfLCBuZXdfc2l6ZSk7Ci0gIGlmIChuZXdfYnVmZmVyID09IE5VTEwpIHsKLSAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwotICB9Ci0gIGJ1ZmZlclNpemVfID0gbmV3X3NpemU7Ci0KLSAgcHRyZGlmZl90IG9mZnNldCA9ICh1aW50OF90KiluZXdfYnVmZmVyIC0gYnVmZmVyXzsKLSAgYnVmZmVyXyArPSBvZmZzZXQ7Ci0gIHJCYXNlXyArPSBvZmZzZXQ7Ci0gIHJCb3VuZF8gKz0gb2Zmc2V0OwotICB3QmFzZV8gKz0gb2Zmc2V0OwotICB3Qm91bmRfID0gYnVmZmVyXyArIGJ1ZmZlclNpemVfOwotfQotCi12b2lkIFRNZW1vcnlCdWZmZXI6OndyaXRlU2xvdyhjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICBlbnN1cmVDYW5Xcml0ZShsZW4pOwotCi0gIC8vIENvcHkgaW50byB0aGUgYnVmZmVyIGFuZCBpbmNyZW1lbnQgd0Jhc2VfLgotICBtZW1jcHkod0Jhc2VfLCBidWYsIGxlbik7Ci0gIHdCYXNlXyArPSBsZW47Ci19Ci0KLXZvaWQgVE1lbW9yeUJ1ZmZlcjo6d3JvdGVCeXRlcyh1aW50MzJfdCBsZW4pIHsKLSAgdWludDMyX3QgYXZhaWwgPSBhdmFpbGFibGVfd3JpdGUoKTsKLSAgaWYgKGxlbiA+IGF2YWlsKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ2xpZW50IHdyb3RlIG1vcmUgYnl0ZXMgdGhhbiBzaXplIG9mIGJ1ZmZlci4iKTsKLSAgfQotICB3QmFzZV8gKz0gbGVuOwotfQotCi1jb25zdCB1aW50OF90KiBUTWVtb3J5QnVmZmVyOjpib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgewotICAodm9pZCkgYnVmOwotICByQm91bmRfID0gd0Jhc2VfOwotICBpZiAoYXZhaWxhYmxlX3JlYWQoKSA+PSAqbGVuKSB7Ci0gICAgKmxlbiA9IGF2YWlsYWJsZV9yZWFkKCk7Ci0gICAgcmV0dXJuIHJCYXNlXzsKLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmODI1N2UuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RCVUZGRVJUUkFOU1BPUlRTX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RCVUZGRVJUUkFOU1BPUlRTX0hfIDEKLQotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSAiYm9vc3Qvc2NvcGVkX2FycmF5LmhwcCIKLQotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+Ci0KLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBUREJfTElLRUxZKHZhbCkgKF9fYnVpbHRpbl9leHBlY3QoKHZhbCksIDEpKQotI2RlZmluZSBUREJfVU5MSUtFTFkodmFsKSAoX19idWlsdGluX2V4cGVjdCgodmFsKSwgMCkpCi0jZWxzZQotI2RlZmluZSBUREJfTElLRUxZKHZhbCkgKHZhbCkKLSNkZWZpbmUgVERCX1VOTElLRUxZKHZhbCkgKHZhbCkKLSNlbmRpZgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgYWxsIHRyYW5zcG9ydHMgdGhhdCB1c2UgcmVhZC93cml0ZSBidWZmZXJzIGZvciBwZXJmb3JtYW5jZS4KLSAqCi0gKiBUQnVmZmVyQmFzZSBpcyBkZXNpZ25lZCB0byBpbXBsZW1lbnQgdGhlIGZhc3QtcGF0aCAibWVtY3B5IiBzdHlsZQotICogb3BlcmF0aW9ucyB0aGF0IHdvcmsgaW4gdGhlIGNvbW1vbiBjYXNlLiAgSXQgZG9lcyBzbyB3aXRoIHNtYWxsIGFuZAotICogKGV2ZW50dWFsbHkpIG5vbnZpcnR1YWwsIGlubGluYWJsZSBtZXRob2RzLiAgVEJ1ZmZlckJhc2UgaXMgYW4gYWJzdHJhY3QKLSAqIGNsYXNzLiAgU3ViY2xhc3NlcyBhcmUgZXhwZWN0ZWQgdG8gZGVmaW5lIHRoZSAic2xvdyBwYXRoIiBvcGVyYXRpb25zCi0gKiB0aGF0IGhhdmUgdG8gYmUgZG9uZSB3aGVuIHRoZSBidWZmZXJzIGFyZSBmdWxsIG9yIGVtcHR5LgotICoKLSAqLwotY2xhc3MgVEJ1ZmZlckJhc2UgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VEJ1ZmZlckJhc2U+IHsKLQotIHB1YmxpYzoKLQotICAvKioKLSAgICogRmFzdC1wYXRoIHJlYWQuCi0gICAqCi0gICAqIFdoZW4gd2UgaGF2ZSBlbm91Z2ggZGF0YSBidWZmZXJlZCB0byBmdWxmaWxsIHRoZSByZWFkLCB3ZSBjYW4gc2F0aXNmeSBpdAotICAgKiB3aXRoIGEgc2luZ2xlIG1lbWNweSwgdGhlbiBhZGp1c3Qgb3VyIGludGVybmFsIHBvaW50ZXJzLiAgSWYgdGhlIGJ1ZmZlcgotICAgKiBpcyBlbXB0eSwgd2UgY2FsbCBvdXQgdG8gb3VyIHNsb3cgcGF0aCwgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcy4KLSAgICogVGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gZXZlbnR1YWxseSBiZSBub252aXJ0dWFsIGFuZCBpbmxpbmFibGUuCi0gICAqLwotICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgdWludDhfdCogbmV3X3JCYXNlID0gckJhc2VfICsgbGVuOwotICAgIGlmIChUREJfTElLRUxZKG5ld19yQmFzZSA8PSByQm91bmRfKSkgewotICAgICAgc3RkOjptZW1jcHkoYnVmLCByQmFzZV8sIGxlbik7Ci0gICAgICByQmFzZV8gPSBuZXdfckJhc2U7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgICByZXR1cm4gcmVhZFNsb3coYnVmLCBsZW4pOwotICB9Ci0KLSAgLyoqCi0gICAqIFNob3J0Y3V0dGVkIHZlcnNpb24gb2YgcmVhZEFsbC4KLSAgICovCi0gIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICB1aW50OF90KiBuZXdfckJhc2UgPSByQmFzZV8gKyBsZW47Ci0gICAgaWYgKFREQl9MSUtFTFkobmV3X3JCYXNlIDw9IHJCb3VuZF8pKSB7Ci0gICAgICBzdGQ6Om1lbWNweShidWYsIHJCYXNlXywgbGVuKTsKLSAgICAgIHJCYXNlXyA9IG5ld19yQmFzZTsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICAgIHJldHVybiBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpyZWFkQWxsKCp0aGlzLCBidWYsIGxlbik7Ci0gIH0KLQotICAvKioKLSAgICogRmFzdC1wYXRoIHdyaXRlLgotICAgKgotICAgKiBXaGVuIHdlIGhhdmUgZW5vdWdoIGVtcHR5IHNwYWNlIGluIG91ciBidWZmZXIgdG8gYWNjb21vZGF0ZSB0aGUgd3JpdGUsIHdlCi0gICAqIGNhbiBzYXRpc2Z5IGl0IHdpdGggYSBzaW5nbGUgbWVtY3B5LCB0aGVuIGFkanVzdCBvdXIgaW50ZXJuYWwgcG9pbnRlcnMuCi0gICAqIElmIHRoZSBidWZmZXIgaXMgZnVsbCwgd2UgY2FsbCBvdXQgdG8gb3VyIHNsb3cgcGF0aCwgaW1wbGVtZW50ZWQgYnkgYQotICAgKiBzdWJjbGFzcy4gIFRoaXMgbWV0aG9kIGlzIG1lYW50IHRvIGV2ZW50dWFsbHkgYmUgbm9udmlydHVhbCBhbmQKLSAgICogaW5saW5hYmxlLgotICAgKi8KLSAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHVpbnQ4X3QqIG5ld193QmFzZSA9IHdCYXNlXyArIGxlbjsKLSAgICBpZiAoVERCX0xJS0VMWShuZXdfd0Jhc2UgPD0gd0JvdW5kXykpIHsKLSAgICAgIHN0ZDo6bWVtY3B5KHdCYXNlXywgYnVmLCBsZW4pOwotICAgICAgd0Jhc2VfID0gbmV3X3dCYXNlOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB3cml0ZVNsb3coYnVmLCBsZW4pOwotICB9Ci0KLSAgLyoqCi0gICAqIEZhc3QtcGF0aCBib3Jyb3cuICBBIGxvdCBsaWtlIHRoZSBmYXN0LXBhdGggcmVhZC4KLSAgICovCi0gIGNvbnN0IHVpbnQ4X3QqIGJvcnJvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsKLSAgICBpZiAoVERCX0xJS0VMWShzdGF0aWNfY2FzdDxwdHJkaWZmX3Q+KCpsZW4pIDw9IHJCb3VuZF8gLSByQmFzZV8pKSB7Ci0gICAgICAvLyBXaXRoIHN0cmljdCBhbGlhc2luZywgd3JpdGluZyB0byBsZW4gc2hvdWxkbid0IGZvcmNlIHVzIHRvCi0gICAgICAvLyByZWZldGNoIHJCYXNlXyBmcm9tIG1lbW9yeS4gIFRPRE8oZHJlaXNzKTogVmVyaWZ5IHRoaXMuCi0gICAgICAqbGVuID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJCb3VuZF8gLSByQmFzZV8pOwotICAgICAgcmV0dXJuIHJCYXNlXzsKLSAgICB9Ci0gICAgcmV0dXJuIGJvcnJvd1Nsb3coYnVmLCBsZW4pOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN1bWUgZG9lc24ndCByZXF1aXJlIGEgc2xvdyBwYXRoLgotICAgKi8KLSAgdm9pZCBjb25zdW1lKHVpbnQzMl90IGxlbikgewotICAgIGlmIChUREJfTElLRUxZKHN0YXRpY19jYXN0PHB0cmRpZmZfdD4obGVuKSA8PSByQm91bmRfIC0gckJhc2VfKSkgewotICAgICAgckJhc2VfICs9IGxlbjsKLSAgICB9IGVsc2UgewotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnN1bWUgZGlkIG5vdCBmb2xsb3cgYSBib3Jyb3cuIik7Ci0gICAgfQotICB9Ci0KLQotIHByb3RlY3RlZDoKLQotICAvLy8gU2xvdyBwYXRoIHJlYWQuCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pID0gMDsKLQotICAvLy8gU2xvdyBwYXRoIHdyaXRlLgotICB2aXJ0dWFsIHZvaWQgd3JpdGVTbG93KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFNsb3cgcGF0aCBib3Jyb3cuCi0gICAqCi0gICAqIFBPU1RDT05ESVRJT046IHJldHVybiA9PSBOVUxMIHx8IHJCb3VuZF8gLSByQmFzZV8gPj0gKmxlbgotICAgKi8KLSAgdmlydHVhbCBjb25zdCB1aW50OF90KiBib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgPSAwOwotCi0gIC8qKgotICAgKiBUcml2aWFsIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBJbml0aWFsaXplIHBvaW50ZXJzIHNhZmVseS4gIENvbnN0cnVjdGluZyBpcyBub3QgYSB2ZXJ5Ci0gICAqIHBlcmZvcm1hbmNlLXNlbnNpdGl2ZSBvcGVyYXRpb24sIHNvIGl0IGlzIG9rYXkgdG8ganVzdCBsZWF2ZSBpdCB0bwotICAgKiB0aGUgY29uY3JldGUgY2xhc3MgdG8gc2V0IHVwIHBvaW50ZXJzIGNvcnJlY3RseS4KLSAgICovCi0gIFRCdWZmZXJCYXNlKCkKLSAgICA6IHJCYXNlXyhOVUxMKQotICAgICwgckJvdW5kXyhOVUxMKQotICAgICwgd0Jhc2VfKE5VTEwpCi0gICAgLCB3Qm91bmRfKE5VTEwpCi0gIHt9Ci0KLSAgLy8vIENvbnZlbmllbmNlIG11dGF0b3IgZm9yIHNldHRpbmcgdGhlIHJlYWQgYnVmZmVyLgotICB2b2lkIHNldFJlYWRCdWZmZXIodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICByQmFzZV8gPSBidWY7Ci0gICAgckJvdW5kXyA9IGJ1ZitsZW47Ci0gIH0KLQotICAvLy8gQ29udmVuaWVuY2UgbXV0YXRvciBmb3Igc2V0dGluZyB0aGUgd3JpdGUgYnVmZmVyLgotICB2b2lkIHNldFdyaXRlQnVmZmVyKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgd0Jhc2VfID0gYnVmOwotICAgIHdCb3VuZF8gPSBidWYrbGVuOwotICB9Ci0KLSAgdmlydHVhbCB+VEJ1ZmZlckJhc2UoKSB7fQotCi0gIC8vLyBSZWFkcyBiZWdpbiBoZXJlLgotICB1aW50OF90KiByQmFzZV87Ci0gIC8vLyBSZWFkcyBtYXkgZXh0ZW5kIHRvIGp1c3QgYmVmb3JlIGhlcmUuCi0gIHVpbnQ4X3QqIHJCb3VuZF87Ci0KLSAgLy8vIFdyaXRlcyBiZWdpbiBoZXJlLgotICB1aW50OF90KiB3QmFzZV87Ci0gIC8vLyBXcml0ZXMgbWF5IGV4dGVuZCB0byBqdXN0IGJlZm9yZSBoZXJlLgotICB1aW50OF90KiB3Qm91bmRfOwotfTsKLQotCi0vKioKLSAqIEJ1ZmZlcmVkIHRyYW5zcG9ydC4gRm9yIHJlYWRzIGl0IHdpbGwgcmVhZCBtb3JlIGRhdGEgdGhhbiBpcyByZXF1ZXN0ZWQKLSAqIGFuZCB3aWxsIHNlcnZlIGZ1dHVyZSBkYXRhIG91dCBvZiBhIGxvY2FsIGJ1ZmZlci4gRm9yIHdyaXRlcywgZGF0YSBpcwotICogc3RvcmVkIHRvIGFuIGluIG1lbW9yeSBidWZmZXIgYmVmb3JlIGJlaW5nIHdyaXR0ZW4gb3V0LgotICoKLSAqLwotY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0Ci0gIDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRCdWZmZXJlZFRyYW5zcG9ydCwgVEJ1ZmZlckJhc2U+IHsKLSBwdWJsaWM6Ci0KLSAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gNTEyOwotCi0gIC8vLyBVc2UgZGVmYXVsdCBidWZmZXIgc2l6ZXMuCi0gIFRCdWZmZXJlZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpCi0gICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCkKLSAgICAsIHJCdWZTaXplXyhERUZBVUxUX0JVRkZFUl9TSVpFKQotICAgICwgd0J1ZlNpemVfKERFRkFVTFRfQlVGRkVSX1NJWkUpCi0gICAgLCByQnVmXyhuZXcgdWludDhfdFtyQnVmU2l6ZV9dKQotICAgICwgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSkKLSAgewotICAgIGluaXRQb2ludGVycygpOwotICB9Ci0KLSAgLy8vIFVzZSBzcGVjaWZpZWQgYnVmZmVyIHNpemVzLgotICBUQnVmZmVyZWRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCB1aW50MzJfdCBzeikKLSAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KQotICAgICwgckJ1ZlNpemVfKHN6KQotICAgICwgd0J1ZlNpemVfKHN6KQotICAgICwgckJ1Zl8obmV3IHVpbnQ4X3RbckJ1ZlNpemVfXSkKLSAgICAsIHdCdWZfKG5ldyB1aW50OF90W3dCdWZTaXplX10pCi0gIHsKLSAgICBpbml0UG9pbnRlcnMoKTsKLSAgfQotCi0gIC8vLyBVc2Ugc3BlY2lmaWVkIHJlYWQgYW5kIHdyaXRlIGJ1ZmZlciBzaXplcy4KLSAgVEJ1ZmZlcmVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgdWludDMyX3QgcnN6LCB1aW50MzJfdCB3c3opCi0gICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCkKLSAgICAsIHJCdWZTaXplXyhyc3opCi0gICAgLCB3QnVmU2l6ZV8od3N6KQotICAgICwgckJ1Zl8obmV3IHVpbnQ4X3RbckJ1ZlNpemVfXSkKLSAgICAsIHdCdWZfKG5ldyB1aW50OF90W3dCdWZTaXplX10pCi0gIHsKLSAgICBpbml0UG9pbnRlcnMoKTsKLSAgfQotCi0gIHZvaWQgb3BlbigpIHsKLSAgICB0cmFuc3BvcnRfLT5vcGVuKCk7Ci0gIH0KLQotICBib29sIGlzT3BlbigpIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0Xy0+aXNPcGVuKCk7Ci0gIH0KLQotICBib29sIHBlZWsoKSB7Ci0gICAgaWYgKHJCYXNlXyA9PSByQm91bmRfKSB7Ci0gICAgICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCB0cmFuc3BvcnRfLT5yZWFkKHJCdWZfLmdldCgpLCByQnVmU2l6ZV8pKTsKLSAgICB9Ci0gICAgcmV0dXJuIChyQm91bmRfID4gckJhc2VfKTsKLSAgfQotCi0gIHZvaWQgY2xvc2UoKSB7Ci0gICAgZmx1c2goKTsKLSAgICB0cmFuc3BvcnRfLT5jbG9zZSgpOwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0KLSAgdmlydHVhbCB2b2lkIHdyaXRlU2xvdyhjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0KLSAgdm9pZCBmbHVzaCgpOwotCi0KLSAgLyoqCi0gICAqIFRoZSBmb2xsb3dpbmcgYmVoYXZpb3IgaXMgY3VycmVudGx5IGltcGxlbWVudGVkIGJ5IFRCdWZmZXJlZFRyYW5zcG9ydCwKLSAgICogYnV0IHRoYXQgbWF5IGNoYW5nZSBpbiBhIGZ1dHVyZSB2ZXJzaW9uOgotICAgKiAxLyBJZiBsZW4gaXMgYXQgbW9zdCByQnVmU2l6ZV8sIGJvcnJvdyB3aWxsIG5ldmVyIHJldHVybiBOVUxMLgotICAgKiAgICBEZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LCBpdCBjb3VsZCB0aHJvdyBhbiBleGNlcHRpb24KLSAgICogICAgb3IgaGFuZyBmb3JldmVyLgotICAgKiAyLyBTb21lIGJvcnJvdyByZXF1ZXN0cyBtYXkgY29weSBieXRlcyBpbnRlcm5hbGx5LiAgSG93ZXZlciwKLSAgICogICAgaWYgbGVuIGlzIGF0IG1vc3QgckJ1ZlNpemVfLzIsIG5vbmUgb2YgdGhlIGNvcGllZCBieXRlcwotICAgKiAgICB3aWxsIGV2ZXIgaGF2ZSB0byBiZSBjb3BpZWQgYWdhaW4uICBGb3Igb3B0aW1pYWwgcGVyZm9ybWFuY2UsCi0gICAqICAgIHN0YXkgdW5kZXIgdGhpcyBsaW1pdC4KLSAgICovCi0gIHZpcnR1YWwgY29uc3QgdWludDhfdCogYm9ycm93U2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pOwotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF87Ci0gIH0KLQotICAvKgotICAgKiBUVmlydHVhbFRyYW5zcG9ydCBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgcmVhZEFsbCgpLgotICAgKiBXZSB3YW50IHRvIHVzZSB0aGUgVEJ1ZmZlckJhc2UgdmVyc2lvbiBpbnN0ZWFkLgotICAgKi8KLSAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHJldHVybiBUQnVmZmVyQmFzZTo6cmVhZEFsbChidWYsIGxlbik7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgdm9pZCBpbml0UG9pbnRlcnMoKSB7Ci0gICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgMCk7Ci0gICAgc2V0V3JpdGVCdWZmZXIod0J1Zl8uZ2V0KCksIHdCdWZTaXplXyk7Ci0gICAgLy8gV3JpdGUgc2l6ZSBuZXZlciBjaGFuZ2VzLgotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKLQotICB1aW50MzJfdCByQnVmU2l6ZV87Ci0gIHVpbnQzMl90IHdCdWZTaXplXzsKLSAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiByQnVmXzsKLSAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiB3QnVmXzsKLX07Ci0KLQotLyoqCi0gKiBXcmFwcyBhIHRyYW5zcG9ydCBpbnRvIGEgYnVmZmVyZWQgb25lLgotICoKLSAqLwotY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7Ci0gcHVibGljOgotICBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KLQotICB2aXJ0dWFsIH5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KLQotICAvKioKLSAgICogV3JhcHMgdGhlIHRyYW5zcG9ydCBpbnRvIGEgYnVmZmVyZWQgb25lLgotICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRCdWZmZXJlZFRyYW5zcG9ydCh0cmFucykpOwotICB9Ci0KLX07Ci0KLQotLyoqCi0gKiBGcmFtZWQgdHJhbnNwb3J0LiBBbGwgd3JpdGVzIGdvIGludG8gYW4gaW4tbWVtb3J5IGJ1ZmZlciB1bnRpbCBmbHVzaCBpcwotICogY2FsbGVkLCBhdCB3aGljaCBwb2ludCB0aGUgdHJhbnNwb3J0IHdyaXRlcyB0aGUgbGVuZ3RoIG9mIHRoZSBlbnRpcmUKLSAqIGJpbmFyeSBjaHVuayBmb2xsb3dlZCBieSB0aGUgZGF0YSBwYXlsb2FkLiBUaGlzIGFsbG93cyB0aGUgcmVjZWl2ZXIgb24gdGhlCi0gKiBvdGhlciBlbmQgdG8gYWx3YXlzIGRvIGZpeGVkLWxlbmd0aCByZWFkcy4KLSAqCi0gKi8KLWNsYXNzIFRGcmFtZWRUcmFuc3BvcnQKLSAgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VEZyYW1lZFRyYW5zcG9ydCwgVEJ1ZmZlckJhc2U+IHsKLSBwdWJsaWM6Ci0KLSAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gNTEyOwotCi0gIC8vLyBVc2UgZGVmYXVsdCBidWZmZXIgc2l6ZXMuCi0gIFRGcmFtZWRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KQotICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpCi0gICAgLCByQnVmU2l6ZV8oMCkKLSAgICAsIHdCdWZTaXplXyhERUZBVUxUX0JVRkZFUl9TSVpFKQotICAgICwgckJ1Zl8oKQotICAgICwgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSkKLSAgewotICAgIGluaXRQb2ludGVycygpOwotICB9Ci0KLSAgVEZyYW1lZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHVpbnQzMl90IHN6KQotICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpCi0gICAgLCByQnVmU2l6ZV8oMCkKLSAgICAsIHdCdWZTaXplXyhzeikKLSAgICAsIHJCdWZfKCkKLSAgICAsIHdCdWZfKG5ldyB1aW50OF90W3dCdWZTaXplX10pCi0gIHsKLSAgICBpbml0UG9pbnRlcnMoKTsKLSAgfQotCi0gIHZvaWQgb3BlbigpIHsKLSAgICB0cmFuc3BvcnRfLT5vcGVuKCk7Ci0gIH0KLQotICBib29sIGlzT3BlbigpIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0Xy0+aXNPcGVuKCk7Ci0gIH0KLQotICBib29sIHBlZWsoKSB7Ci0gICAgcmV0dXJuIChyQmFzZV8gPCByQm91bmRfKSB8fCB0cmFuc3BvcnRfLT5wZWVrKCk7Ci0gIH0KLQotICB2b2lkIGNsb3NlKCkgewotICAgIGZsdXNoKCk7Ci0gICAgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIHZpcnR1YWwgdm9pZCB3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIHZpcnR1YWwgdm9pZCBmbHVzaCgpOwotCi0gIHVpbnQzMl90IHJlYWRFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZUVuZCgpOwotCi0gIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKTsKLQotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgewotICAgIHJldHVybiB0cmFuc3BvcnRfOwotICB9Ci0KLSAgLyoKLSAgICogVFZpcnR1YWxUcmFuc3BvcnQgcHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHJlYWRBbGwoKS4KLSAgICogV2Ugd2FudCB0byB1c2UgdGhlIFRCdWZmZXJCYXNlIHZlcnNpb24gaW5zdGVhZC4KLSAgICovCi0gIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICByZXR1cm4gVEJ1ZmZlckJhc2U6OnJlYWRBbGwoYnVmLGxlbik7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgLyoqCi0gICAqIFJlYWRzIGEgZnJhbWUgb2YgaW5wdXQgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0uCi0gICAqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiBhIGZyYW1lIHdhcyByZWFkIHN1Y2Nlc3NmdWxseSwgb3IgZmFsc2Ugb24gRU9GLgotICAgKiAoUmFpc2VzIGEgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBFT0Ygb2NjdXJzIGFmdGVyIGEgcGFydGlhbCBmcmFtZS4pCi0gICAqLwotICBib29sIHJlYWRGcmFtZSgpOwotCi0gIHZvaWQgaW5pdFBvaW50ZXJzKCkgewotICAgIHNldFJlYWRCdWZmZXIoTlVMTCwgMCk7Ci0gICAgc2V0V3JpdGVCdWZmZXIod0J1Zl8uZ2V0KCksIHdCdWZTaXplXyk7Ci0KLSAgICAvLyBQYWQgdGhlIGJ1ZmZlciBzbyB3ZSBjYW4gaW5zZXJ0IHRoZSBzaXplIGxhdGVyLgotICAgIGludDMyX3QgcGFkID0gMDsKLSAgICB0aGlzLT53cml0ZSgodWludDhfdCopJnBhZCwgc2l6ZW9mKHBhZCkpOwotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKLQotICB1aW50MzJfdCByQnVmU2l6ZV87Ci0gIHVpbnQzMl90IHdCdWZTaXplXzsKLSAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiByQnVmXzsKLSAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiB3QnVmXzsKLX07Ci0KLS8qKgotICogV3JhcHMgYSB0cmFuc3BvcnQgaW50byBhIGZyYW1lZCBvbmUuCi0gKgotICovCi1jbGFzcyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7Ci0gcHVibGljOgotICBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9Ci0KLSAgdmlydHVhbCB+VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoKSB7fQotCi0gIC8qKgotICAgKiBXcmFwcyB0aGUgdHJhbnNwb3J0IGludG8gYSBmcmFtZWQgb25lLgotICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpKTsKLSAgfQotCi19OwotCi0KLS8qKgotICogQSBtZW1vcnkgYnVmZmVyIGlzIGEgdHJhbnBzb3J0IHRoYXQgc2ltcGx5IHJlYWRzIGZyb20gYW5kIHdyaXRlcyB0byBhbgotICogaW4gbWVtb3J5IGJ1ZmZlci4gQW55dGltZSB5b3UgY2FsbCB3cml0ZSBvbiBpdCwgdGhlIGRhdGEgaXMgc2ltcGx5IHBsYWNlZAotICogaW50byBhIGJ1ZmZlciwgYW5kIGFueXRpbWUgeW91IGNhbGwgcmVhZCwgZGF0YSBpcyByZWFkIGZyb20gdGhhdCBidWZmZXIuCi0gKgotICogVGhlIGJ1ZmZlcnMgYXJlIGFsbG9jYXRlZCB1c2luZyBDIGNvbnN0cnVjdHMgbWFsbG9jLHJlYWxsb2MsIGFuZCB0aGUgc2l6ZQotICogZG91YmxlcyBhcyBuZWNlc3NhcnkuICBXZSd2ZSBjb25zaWRlcmVkIHVzaW5nIHNjb3BlZAotICoKLSAqLwotY2xhc3MgVE1lbW9yeUJ1ZmZlciA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUTWVtb3J5QnVmZmVyLCBUQnVmZmVyQmFzZT4gewotIHByaXZhdGU6Ci0KLSAgLy8gQ29tbW9uIGluaXRpYWxpemF0aW9uIGRvbmUgYnkgYWxsIGNvbnN0cnVjdG9ycy4KLSAgdm9pZCBpbml0Q29tbW9uKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3Qgc2l6ZSwgYm9vbCBvd25lciwgdWludDMyX3Qgd1BvcykgewotICAgIGlmIChidWYgPT0gTlVMTCAmJiBzaXplICE9IDApIHsKLSAgICAgIGFzc2VydChvd25lcik7Ci0gICAgICBidWYgPSAodWludDhfdCopc3RkOjptYWxsb2Moc2l6ZSk7Ci0gICAgICBpZiAoYnVmID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBidWZmZXJfID0gYnVmOwotICAgIGJ1ZmZlclNpemVfID0gc2l6ZTsKLQotICAgIHJCYXNlXyA9IGJ1ZmZlcl87Ci0gICAgckJvdW5kXyA9IGJ1ZmZlcl8gKyB3UG9zOwotICAgIC8vIFRPRE8oZHJlaXNzKTogSW52ZXN0aWdhdGUgTlVMTC1pbmcgdGhpcyBpZiAhb3duZXIuCi0gICAgd0Jhc2VfID0gYnVmZmVyXyArIHdQb3M7Ci0gICAgd0JvdW5kXyA9IGJ1ZmZlcl8gKyBidWZmZXJTaXplXzsKLQotICAgIG93bmVyXyA9IG93bmVyOwotCi0gICAgLy8gckJvdW5kXyBpcyByZWFsbHkgYW4gYXJ0aWZhY3QuICBJbiBwcmluY2lwbGUsIGl0IHNob3VsZCBhbHdheXMgYmUKLSAgICAvLyBlcXVhbCB0byB3QmFzZV8uICBXZSB1cGRhdGUgaXQgaW4gYSBmZXcgcGxhY2VzIChjb21wdXRlUmVhZCwgZXRjLikuCi0gIH0KLQotIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGRlZmF1bHRTaXplID0gMTAyNDsKLQotICAvKioKLSAgICogVGhpcyBlbnVtIHNwZWNpZmllcyBob3cgYSBUTWVtb3J5QnVmZmVyIHNob3VsZCB0cmVhdAotICAgKiBtZW1vcnkgcGFzc2VkIHRvIGl0IHZpYSBjb25zdHJ1Y3RvcnMgb3IgcmVzZXRCdWZmZXIuCi0gICAqCi0gICAqIE9CU0VSVkU6Ci0gICAqICAgVE1lbW9yeUJ1ZmZlciB3aWxsIHNpbXBseSBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlIG1lbW9yeS4KLSAgICogICBJdCBpcyB0aGUgY2FsbGVycyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGUgcG9pbnRlcgotICAgKiAgIHJlbWFpbnMgdmFsaWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgVE1lbW9yeUJ1ZmZlciwKLSAgICogICBhbmQgdGhhdCBpdCBpcyBwcm9wZXJseSBjbGVhbmVkIHVwLgotICAgKiAgIE5vdGUgdGhhdCBubyBkYXRhIGNhbiBiZSB3cml0dGVuIHRvIG9ic2VydmVkIGJ1ZmZlcnMuCi0gICAqCi0gICAqIENPUFk6Ci0gICAqICAgVE1lbW9yeUJ1ZmZlciB3aWxsIG1ha2UgYW4gaW50ZXJuYWwgY29weSBvZiB0aGUgYnVmZmVyLgotICAgKiAgIFRoZSBjYWxsZXIgaGFzIG5vIHJlc3BvbnNpYmlsaXRpZXMuCi0gICAqCi0gICAqIFRBS0VfT1dORVJTSElQOgotICAgKiAgIFRNZW1vcnlCdWZmZXIgd2lsbCBiZWNvbWUgdGhlICJvd25lciIgb2YgdGhlIGJ1ZmZlciwKLSAgICogICBhbmQgd2lsbCBiZSByZXNwb25zaWJsZSBmb3IgZnJlZWluZyBpdC4KLSAgICogICBUaGUgbWVtYm9yeSBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgd2l0aCBtYWxsb2MuCi0gICAqLwotICBlbnVtIE1lbW9yeVBvbGljeQotICB7IE9CU0VSVkUgPSAxCi0gICwgQ09QWSA9IDIKLSAgLCBUQUtFX09XTkVSU0hJUCA9IDMKLSAgfTsKLQotICAvKioKLSAgICogQ29uc3RydWN0IGEgVE1lbW9yeUJ1ZmZlciB3aXRoIGEgZGVmYXVsdC1zaXplZCBidWZmZXIsCi0gICAqIG93bmVkIGJ5IHRoZSBUTWVtb3J5QnVmZmVyIG9iamVjdC4KLSAgICovCi0gIFRNZW1vcnlCdWZmZXIoKSB7Ci0gICAgaW5pdENvbW1vbihOVUxMLCBkZWZhdWx0U2l6ZSwgdHJ1ZSwgMCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0IGEgVE1lbW9yeUJ1ZmZlciB3aXRoIGEgYnVmZmVyIG9mIGEgc3BlY2lmaWVkIHNpemUsCi0gICAqIG93bmVkIGJ5IHRoZSBUTWVtb3J5QnVmZmVyIG9iamVjdC4KLSAgICoKLSAgICogQHBhcmFtIHN6ICBUaGUgaW5pdGlhbCBzaXplIG9mIHRoZSBidWZmZXIuCi0gICAqLwotICBUTWVtb3J5QnVmZmVyKHVpbnQzMl90IHN6KSB7Ci0gICAgaW5pdENvbW1vbihOVUxMLCBzeiwgdHJ1ZSwgMCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0IGEgVE1lbW9yeUJ1ZmZlciB3aXRoIGJ1ZiBhcyBpdHMgaW5pdGlhbCBjb250ZW50cy4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZiAgICBUaGUgaW5pdGlhbCBjb250ZW50cyBvZiB0aGUgYnVmZmVyLgotICAgKiAgICAgICAgICAgICAgIE5vdGUgdGhhdCwgd2hpbGUgYnVmIGlzIGEgbm9uLWNvbnN0IHBvaW50ZXIsCi0gICAqICAgICAgICAgICAgICAgVE1lbW9yeUJ1ZmZlciB3aWxsIG5vdCB3cml0ZSB0byBpdCBpZiBwb2xpY3kgPT0gT0JTRVJWRSwKLSAgICogICAgICAgICAgICAgICBzbyBpdCBpcyBzYWZlIHRvIGNvbnN0X2Nhc3Q8dWludDhfdCo+KHdoYXRldmVyKS4KLSAgICogQHBhcmFtIHN6ICAgICBUaGUgc2l6ZSBvZiBAYyBidWYuCi0gICAqIEBwYXJhbSBwb2xpY3kgU2VlIEBsaW5rIE1lbW9yeVBvbGljeSBAZW5kbGluayAuCi0gICAqLwotICBUTWVtb3J5QnVmZmVyKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3Qgc3osIE1lbW9yeVBvbGljeSBwb2xpY3kgPSBPQlNFUlZFKSB7Ci0gICAgaWYgKGJ1ZiA9PSBOVUxMICYmIHN6ICE9IDApIHsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUTWVtb3J5QnVmZmVyIGdpdmVuIG51bGwgYnVmZmVyIHdpdGggbm9uLXplcm8gc2l6ZS4iKTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHBvbGljeSkgewotICAgICAgY2FzZSBPQlNFUlZFOgotICAgICAgY2FzZSBUQUtFX09XTkVSU0hJUDoKLSAgICAgICAgaW5pdENvbW1vbihidWYsIHN6LCBwb2xpY3kgPT0gVEFLRV9PV05FUlNISVAsIHN6KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIENPUFk6Ci0gICAgICAgIGluaXRDb21tb24oTlVMTCwgc3osIHRydWUsIDApOwotICAgICAgICB0aGlzLT53cml0ZShidWYsIHN6KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIE1lbW9yeVBvbGljeSBmb3IgVE1lbW9yeUJ1ZmZlciIpOwotICAgIH0KLSAgfQotCi0gIH5UTWVtb3J5QnVmZmVyKCkgewotICAgIGlmIChvd25lcl8pIHsKLSAgICAgIHN0ZDo6ZnJlZShidWZmZXJfKTsKLSAgICB9Ci0gIH0KLQotICBib29sIGlzT3BlbigpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGJvb2wgcGVlaygpIHsKLSAgICByZXR1cm4gKHJCYXNlXyA8IHdCYXNlXyk7Ci0gIH0KLQotICB2b2lkIG9wZW4oKSB7fQotCi0gIHZvaWQgY2xvc2UoKSB7fQotCi0gIC8vIFRPRE8oZHJlaXNzKTogTWFrZSBidWZQdHIgY29uc3QuCi0gIHZvaWQgZ2V0QnVmZmVyKHVpbnQ4X3QqKiBidWZQdHIsIHVpbnQzMl90KiBzeikgewotICAgICpidWZQdHIgPSByQmFzZV87Ci0gICAgKnN6ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCYXNlXyAtIHJCYXNlXyk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRCdWZmZXJBc1N0cmluZygpIHsKLSAgICBpZiAoYnVmZmVyXyA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotICAgIHVpbnQ4X3QqIGJ1ZjsKLSAgICB1aW50MzJfdCBzejsKLSAgICBnZXRCdWZmZXIoJmJ1ZiwgJnN6KTsKLSAgICByZXR1cm4gc3RkOjpzdHJpbmcoKGNoYXIqKWJ1ZiwgKHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUpc3opOwotICB9Ci0KLSAgdm9pZCBhcHBlbmRCdWZmZXJUb1N0cmluZyhzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgaWYgKGJ1ZmZlcl8gPT0gTlVMTCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB1aW50OF90KiBidWY7Ci0gICAgdWludDMyX3Qgc3o7Ci0gICAgZ2V0QnVmZmVyKCZidWYsICZzeik7Ci0gICAgc3RyLmFwcGVuZCgoY2hhciopYnVmLCBzeik7Ci0gIH0KLQotICB2b2lkIHJlc2V0QnVmZmVyKCkgewotICAgIHJCYXNlXyA9IGJ1ZmZlcl87Ci0gICAgckJvdW5kXyA9IGJ1ZmZlcl87Ci0gICAgd0Jhc2VfID0gYnVmZmVyXzsKLSAgICAvLyBJdCBpc24ndCBzYWZlIHRvIHdyaXRlIGludG8gYSBidWZmZXIgd2UgZG9uJ3Qgb3duLgotICAgIGlmICghb3duZXJfKSB7Ci0gICAgICB3Qm91bmRfID0gd0Jhc2VfOwotICAgICAgYnVmZmVyU2l6ZV8gPSAwOwotICAgIH0KLSAgfQotCi0gIC8vLyBTZWUgY29uc3RydWN0b3IgZG9jdW1lbnRhdGlvbi4KLSAgdm9pZCByZXNldEJ1ZmZlcih1aW50OF90KiBidWYsIHVpbnQzMl90IHN6LCBNZW1vcnlQb2xpY3kgcG9saWN5ID0gT0JTRVJWRSkgewotICAgIC8vIFVzZSBhIHZhcmlhbnQgb2YgdGhlIGNvcHktYW5kLXN3YXAgdHJpY2sgZm9yIGFzc2lnbm1lbnQgb3BlcmF0b3JzLgotICAgIC8vIFRoaXMgaXMgc3ViLW9wdGltYWwgaW4gdGVybXMgb2YgcGVyZm9ybWFuY2UgZm9yIHR3byByZWFzb25zOgotICAgIC8vICAgMS8gVGhlIGNvbnN0cnVjdGluZyBhbmQgc3dhcHBpbmcgb2YgdGhlIChzbWFsbCkgdmFsdWVzCi0gICAgLy8gICAgICBpbiB0aGUgdGVtcG9yYXJ5IG9iamVjdCB0YWtlcyBzb21lIHRpbWUsIGFuZCBpcyBub3QgbmVjZXNzYXJ5LgotICAgIC8vICAgMi8gSWYgcG9saWN5ID09IENPUFksIHdlIGFsbG9jYXRlIHRoZSBuZXcgYnVmZmVyIGJlZm9yZQotICAgIC8vICAgICAgZnJlZWluZyB0aGUgb2xkIG9uZSwgcHJlY2x1ZGluZyB0aGUgcG9zc2liaWxpdHkgb2YKLSAgICAvLyAgICAgIHJldXNpbmcgdGhhdCBtZW1vcnkuCi0gICAgLy8gSSBkb3VidCB0aGF0IGVpdGhlciBvZiB0aGVzZSBwcm9ibGVtcyBjb3VsZCBiZSBvcHRpbWl6ZWQgYXdheSwKLSAgICAvLyBidXQgdGhlIHNlY29uZCBpcyBwcm9iYWJseSBubyBhIGNvbW1vbiBjYXNlLCBhbmQgdGhlIGZpcnN0IGlzIG1pbm9yLgotICAgIC8vIEkgZG9uJ3QgZXhwZWN0IHJlc2V0QnVmZmVyIHRvIGJlIGEgY29tbW9uIG9wZXJhdGlvbiwgc28gSSdtIHdpbGxpbmcgdG8KLSAgICAvLyBiaXRlIHRoZSBwZXJmb3JtYW5jZSBidWxsZXQgdG8gbWFrZSB0aGUgbWV0aG9kIHRoaXMgc2ltcGxlLgotCi0gICAgLy8gQ29uc3RydWN0IHRoZSBuZXcgYnVmZmVyLgotICAgIFRNZW1vcnlCdWZmZXIgbmV3X2J1ZmZlcihidWYsIHN6LCBwb2xpY3kpOwotICAgIC8vIE1vdmUgaXQgaW50byBvdXJzZWxmLgotICAgIHRoaXMtPnN3YXAobmV3X2J1ZmZlcik7Ci0gICAgLy8gT3VyIG9sZCBzZWxmIGdldHMgZGVzdHJveWVkLgotICB9Ci0KLSAgLy8vIFNlZSBjb25zdHJ1Y3RvciBkb2N1bWVudGF0aW9uLgotICB2b2lkIHJlc2V0QnVmZmVyKHVpbnQzMl90IHN6KSB7Ci0gICAgLy8gQ29uc3RydWN0IHRoZSBuZXcgYnVmZmVyLgotICAgIFRNZW1vcnlCdWZmZXIgbmV3X2J1ZmZlcihzeik7Ci0gICAgLy8gTW92ZSBpdCBpbnRvIG91cnNlbGYuCi0gICAgdGhpcy0+c3dhcChuZXdfYnVmZmVyKTsKLSAgICAvLyBPdXIgb2xkIHNlbGYgZ2V0cyBkZXN0cm95ZWQuCi0gIH0gICAgCi0KLSAgc3RkOjpzdHJpbmcgcmVhZEFzU3RyaW5nKHVpbnQzMl90IGxlbikgewotICAgIHN0ZDo6c3RyaW5nIHN0cjsKLSAgICAodm9pZClyZWFkQXBwZW5kVG9TdHJpbmcoc3RyLCBsZW4pOwotICAgIHJldHVybiBzdHI7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkQXBwZW5kVG9TdHJpbmcoc3RkOjpzdHJpbmcmIHN0ciwgdWludDMyX3QgbGVuKTsKLQotICAvLyByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHJlYWQKLSAgdWludDMyX3QgcmVhZEVuZCgpIHsKLSAgICB1aW50MzJfdCBieXRlcyA9IHJCYXNlXyAtIGJ1ZmZlcl87Ci0gICAgaWYgKHJCYXNlXyA9PSB3QmFzZV8pIHsKLSAgICAgIHJlc2V0QnVmZmVyKCk7Ci0gICAgfQotICAgIHJldHVybiBieXRlczsKLSAgfQotCi0gIC8vIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbgotICB1aW50MzJfdCB3cml0ZUVuZCgpIHsKLSAgICByZXR1cm4gd0Jhc2VfIC0gYnVmZmVyXzsKLSAgfQotCi0gIHVpbnQzMl90IGF2YWlsYWJsZV9yZWFkKCkgY29uc3QgewotICAgIC8vIFJlbWVtYmVyLCB3QmFzZV8gaXMgdGhlIHJlYWwgckJvdW5kXy4KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCYXNlXyAtIHJCYXNlXyk7Ci0gIH0KLQotICB1aW50MzJfdCBhdmFpbGFibGVfd3JpdGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90Pih3Qm91bmRfIC0gd0Jhc2VfKTsKLSAgfQotCi0gIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBjbGllbnQgY2FuIHdyaXRlIGRhdGEgdG8gYXBwZW5kIHRvCi0gIC8vIHRoZSBUTWVtb3J5QnVmZmVyLCBhbmQgZW5zdXJlcyB0aGUgYnVmZmVyIGlzIGJpZyBlbm91Z2ggdG8gYWNjb21vZGF0ZSBhCi0gIC8vIHdyaXRlIG9mIHRoZSBwcm92aWRlZCBsZW5ndGguICBUaGUgcmV0dXJuZWQgcG9pbnRlciBpcyB2ZXJ5IGNvbnZlbmllbnQgZm9yCi0gIC8vIHBhc3NpbmcgdG8gcmVhZCgpLCByZWN2KCksIG9yIHNpbWlsYXIuIFlvdSBtdXN0IGNhbGwgd3JvdGVCeXRlcygpIGFzIHNvb24KLSAgLy8gYXMgZGF0YSBpcyB3cml0dGVuIG9yIHRoZSBidWZmZXIgd2lsbCBub3QgYmUgYXdhcmUgdGhhdCBkYXRhIGhhcyBjaGFuZ2VkLgotICB1aW50OF90KiBnZXRXcml0ZVB0cih1aW50MzJfdCBsZW4pIHsKLSAgICBlbnN1cmVDYW5Xcml0ZShsZW4pOwotICAgIHJldHVybiB3QmFzZV87Ci0gIH0KLQotICAvLyBJbmZvcm1zIHRoZSBidWZmZXIgdGhhdCB0aGUgY2xpZW50IGhhcyB3cml0dGVuICdsZW4nIGJ5dGVzIGludG8gc3RvcmFnZQotICAvLyB0aGF0IGhhZCBiZWVuIHByb3ZpZGVkIGJ5IGdldFdyaXRlUHRyKCkuCi0gIHZvaWQgd3JvdGVCeXRlcyh1aW50MzJfdCBsZW4pOwotCi0gIC8qCi0gICAqIFRWaXJ0dWFsVHJhbnNwb3J0IHByb3ZpZGVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiByZWFkQWxsKCkuCi0gICAqIFdlIHdhbnQgdG8gdXNlIHRoZSBUQnVmZmVyQmFzZSB2ZXJzaW9uIGluc3RlYWQuCi0gICAqLwotICB1aW50MzJfdCByZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgcmV0dXJuIFRCdWZmZXJCYXNlOjpyZWFkQWxsKGJ1ZixsZW4pOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgc3dhcChUTWVtb3J5QnVmZmVyJiB0aGF0KSB7Ci0gICAgdXNpbmcgc3RkOjpzd2FwOwotICAgIHN3YXAoYnVmZmVyXywgICAgIHRoYXQuYnVmZmVyXyk7Ci0gICAgc3dhcChidWZmZXJTaXplXywgdGhhdC5idWZmZXJTaXplXyk7Ci0KLSAgICBzd2FwKHJCYXNlXywgICAgICB0aGF0LnJCYXNlXyk7Ci0gICAgc3dhcChyQm91bmRfLCAgICAgdGhhdC5yQm91bmRfKTsKLSAgICBzd2FwKHdCYXNlXywgICAgICB0aGF0LndCYXNlXyk7Ci0gICAgc3dhcCh3Qm91bmRfLCAgICAgdGhhdC53Qm91bmRfKTsKLQotICAgIHN3YXAob3duZXJfLCAgICAgIHRoYXQub3duZXJfKTsKLSAgfQotCi0gIC8vIE1ha2Ugc3VyZSB0aGVyZSdzIGF0IGxlYXN0ICdsZW4nIGJ5dGVzIGF2YWlsYWJsZSBmb3Igd3JpdGluZy4KLSAgdm9pZCBlbnN1cmVDYW5Xcml0ZSh1aW50MzJfdCBsZW4pOwotCi0gIC8vIENvbXB1dGUgdGhlIHBvc2l0aW9uIGFuZCBhdmFpbGFibGUgZGF0YSBmb3IgcmVhZGluZy4KLSAgdm9pZCBjb21wdXRlUmVhZCh1aW50MzJfdCBsZW4sIHVpbnQ4X3QqKiBvdXRfc3RhcnQsIHVpbnQzMl90KiBvdXRfZ2l2ZSk7Ci0KLSAgdWludDMyX3QgcmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIHZvaWQgd3JpdGVTbG93KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLQotICBjb25zdCB1aW50OF90KiBib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbik7Ci0KLSAgLy8gRGF0YSBidWZmZXIKLSAgdWludDhfdCogYnVmZmVyXzsKLQotICAvLyBBbGxvY2F0ZWQgYnVmZmVyIHNpemUKLSAgdWludDMyX3QgYnVmZmVyU2l6ZV87Ci0KLSAgLy8gSXMgdGhpcyBvYmplY3QgdGhlIG93bmVyIG9mIHRoZSBidWZmZXI/Ci0gIGJvb2wgb3duZXJfOwotCi0gIC8vIERvbid0IGZvcmdldCB0byB1cGRhdGUgY29uc3RyY3RvcnMsIGluaXRDb21tb24sIGFuZCBzd2FwIGlmCi0gIC8vIHlvdSBhZGQgbmV3IG1lbWJlcnMuCi19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UQlVGRkVSVFJBTlNQT1JUU19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE0NzlmYS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGNlcnJubz4KLSNpbmNsdWRlIDxleGNlcHRpb24+Ci0KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEZEVHJhbnNwb3J0Lmg+Ci0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotdm9pZCBURkRUcmFuc3BvcnQ6OmNsb3NlKCkgewotICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW50IHJ2ID0gOjpjbG9zZShmZF8pOwotICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICBmZF8gPSAtMTsKLSAgLy8gSGF2ZSB0byBjaGVjayB1bmNhdWdodF9leGNlcHRpb24gYmVjYXVzZSB0aGlzIGlzIGNhbGxlZCBpbiB0aGUgZGVzdHJ1Y3Rvci4KLSAgaWYgKHJ2IDwgMCAmJiAhc3RkOjp1bmNhdWdodF9leGNlcHRpb24oKSkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJURkRUcmFuc3BvcnQ6OmNsb3NlKCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7Ci0gIH0KLX0KLQotdWludDMyX3QgVEZEVHJhbnNwb3J0OjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIHVuc2lnbmVkIGludCBtYXhSZXRyaWVzID0gNTsgLy8gc2FtZSBhcyB0aGUgVFNvY2tldCBkZWZhdWx0Ci0gIHVuc2lnbmVkIGludCByZXRyaWVzID0gMDsKLSAgd2hpbGUgKHRydWUpIHsKLSAgICBzc2l6ZV90IHJ2ID0gOjpyZWFkKGZkXywgYnVmLCBsZW4pOwotICAgIGlmIChydiA8IDApIHsKLSAgICAgIGlmIChlcnJubyA9PSBFSU5UUiAmJiByZXRyaWVzIDwgbWF4UmV0cmllcykgewotICAgICAgICAvLyBJZiBpbnRlcnJ1cHRlZCwgdHJ5IGFnYWluCi0gICAgICAgICsrcmV0cmllczsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEZEVHJhbnNwb3J0OjpyZWFkKCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci19Ci0KLXZvaWQgVEZEVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICB3aGlsZSAobGVuID4gMCkgewotICAgIHNzaXplX3QgcnYgPSA6OndyaXRlKGZkXywgYnVmLCBsZW4pOwotCi0gICAgaWYgKHJ2IDwgMCkgewotICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRGRFRyYW5zcG9ydDo6d3JpdGUoKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOwotICAgIH0gZWxzZSBpZiAocnYgPT0gMCkgewotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRGRFRyYW5zcG9ydDo6d3JpdGUoKSIpOwotICAgIH0KLQotICAgIGJ1ZiArPSBydjsKLSAgICBsZW4gLT0gcnY7Ci0gIH0KLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQxYTNlNi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEZEVFJBTlNQT1JUX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RGRFRSQU5TUE9SVF9IXyAxCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotI2luY2x1ZGUgIlRUcmFuc3BvcnQuaCIKLSNpbmNsdWRlICJUVmlydHVhbFRyYW5zcG9ydC5oIgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi0vKioKLSAqIERlYWQtc2ltcGxlIHdyYXBwZXIgYXJvdW5kIGEgZmlsZSBkZXNjcmlwdG9yLgotICoKLSAqLwotY2xhc3MgVEZEVHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRGRFRyYW5zcG9ydD4gewotIHB1YmxpYzoKLSAgZW51bSBDbG9zZVBvbGljeQotICB7IE5PX0NMT1NFX09OX0RFU1RST1kgPSAwCi0gICwgQ0xPU0VfT05fREVTVFJPWSA9IDEKLSAgfTsKLQotICBURkRUcmFuc3BvcnQoaW50IGZkLCBDbG9zZVBvbGljeSBjbG9zZV9wb2xpY3kgPSBOT19DTE9TRV9PTl9ERVNUUk9ZKQotICAgIDogZmRfKGZkKQotICAgICwgY2xvc2VfcG9saWN5XyhjbG9zZV9wb2xpY3kpCi0gIHt9Ci0KLSAgflRGRFRyYW5zcG9ydCgpIHsKLSAgICBpZiAoY2xvc2VfcG9saWN5XyA9PSBDTE9TRV9PTl9ERVNUUk9ZKSB7Ci0gICAgICBjbG9zZSgpOwotICAgIH0KLSAgfQotCi0gIGJvb2wgaXNPcGVuKCkgeyByZXR1cm4gZmRfID49IDA7IH0KLQotICB2b2lkIG9wZW4oKSB7fQotCi0gIHZvaWQgY2xvc2UoKTsKLQotICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLQotICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLQotICB2b2lkIHNldEZEKGludCBmZCkgeyBmZF8gPSBmZDsgfQotICBpbnQgZ2V0RkQoKSB7IHJldHVybiBmZF87IH0KLQotIHByb3RlY3RlZDoKLSAgaW50IGZkXzsKLSAgQ2xvc2VQb2xpY3kgY2xvc2VfcG9saWN5XzsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RGRFRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmNwcCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZWY1YmQuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlICJURmlsZVRyYW5zcG9ydC5oIgotI2luY2x1ZGUgIlRUcmFuc3BvcnRVdGlscy5oIgotCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHRpbWUuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi11c2luZyBib29zdDo6c2NvcGVkX3B0cjsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci0KLSNpZm5kZWYgSEFWRV9DTE9DS19HRVRUSU1FCi0KLS8qKgotICogRmFrZSBjbG9ja19nZXR0aW1lIGZvciBzeXN0ZW1zIGxpa2UgZGFyd2luCi0gKgotICovCi0jZGVmaW5lIENMT0NLX1JFQUxUSU1FIDAKLXN0YXRpYyBpbnQgY2xvY2tfZ2V0dGltZShpbnQgY2xrX2lkIC8qaWdub3JlZCovLCBzdHJ1Y3QgdGltZXNwZWMgKnRwKSB7Ci0gIHN0cnVjdCB0aW1ldmFsIG5vdzsKLQotICBpbnQgcnYgPSBnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7Ci0gIGlmIChydiAhPSAwKSB7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdHAtPnR2X3NlYyA9IG5vdy50dl9zZWM7Ci0gIHRwLT50dl9uc2VjID0gbm93LnR2X3VzZWMgKiAxMDAwOwotICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCi1URmlsZVRyYW5zcG9ydDo6VEZpbGVUcmFuc3BvcnQoc3RyaW5nIHBhdGgsIGJvb2wgcmVhZE9ubHkpCi0gIDogcmVhZFN0YXRlXygpCi0gICwgcmVhZEJ1ZmZfKE5VTEwpCi0gICwgY3VycmVudEV2ZW50XyhOVUxMKQotICAsIHJlYWRCdWZmU2l6ZV8oREVGQVVMVF9SRUFEX0JVRkZfU0laRSkKLSAgLCByZWFkVGltZW91dF8oTk9fVEFJTF9SRUFEX1RJTUVPVVQpCi0gICwgY2h1bmtTaXplXyhERUZBVUxUX0NIVU5LX1NJWkUpCi0gICwgZXZlbnRCdWZmZXJTaXplXyhERUZBVUxUX0VWRU5UX0JVRkZFUl9TSVpFKQotICAsIGZsdXNoTWF4VXNfKERFRkFVTFRfRkxVU0hfTUFYX1VTKQotICAsIGZsdXNoTWF4Qnl0ZXNfKERFRkFVTFRfRkxVU0hfTUFYX0JZVEVTKQotICAsIG1heEV2ZW50U2l6ZV8oREVGQVVMVF9NQVhfRVZFTlRfU0laRSkKLSAgLCBtYXhDb3JydXB0ZWRFdmVudHNfKERFRkFVTFRfTUFYX0NPUlJVUFRFRF9FVkVOVFMpCi0gICwgZW9mU2xlZXBUaW1lXyhERUZBVUxUX0VPRl9TTEVFUF9USU1FX1VTKQotICAsIGNvcnJ1cHRlZEV2ZW50U2xlZXBUaW1lXyhERUZBVUxUX0NPUlJVUFRFRF9TTEVFUF9USU1FX1VTKQotICAsIHdyaXRlclRocmVhZElPRXJyb3JTbGVlcFRpbWVfKERFRkFVTFRfV1JJVEVSX1RIUkVBRF9TTEVFUF9USU1FX1VTKQotICAsIHdyaXRlclRocmVhZElkXygwKQotICAsIGRlcXVldWVCdWZmZXJfKE5VTEwpCi0gICwgZW5xdWV1ZUJ1ZmZlcl8oTlVMTCkKLSAgLCBjbG9zaW5nXyhmYWxzZSkKLSAgLCBmb3JjZUZsdXNoXyhmYWxzZSkKLSAgLCBmaWxlbmFtZV8ocGF0aCkKLSAgLCBmZF8oMCkKLSAgLCBidWZmZXJBbmRUaHJlYWRJbml0aWFsaXplZF8oZmFsc2UpCi0gICwgb2Zmc2V0XygwKQotICAsIGxhc3RCYWRDaHVua18oMCkKLSAgLCBudW1Db3JydXB0ZWRFdmVudHNJbkNodW5rXygwKQotICAsIHJlYWRPbmx5XyhyZWFkT25seSkKLXsKLSAgLy8gaW5pdGlhbGl6ZSBhbGwgdGhlIGNvbmRpdGlvbiB2YXJzL211dGV4ZXMKLSAgcHRocmVhZF9tdXRleF9pbml0KCZtdXRleF8sIE5VTEwpOwotICBwdGhyZWFkX2NvbmRfaW5pdCgmbm90RnVsbF8sIE5VTEwpOwotICBwdGhyZWFkX2NvbmRfaW5pdCgmbm90RW1wdHlfLCBOVUxMKTsKLSAgcHRocmVhZF9jb25kX2luaXQoJmZsdXNoZWRfLCBOVUxMKTsKLQotICBvcGVuTG9nRmlsZSgpOwotfQotCi12b2lkIFRGaWxlVHJhbnNwb3J0OjpyZXNldE91dHB1dEZpbGUoaW50IGZkLCBzdHJpbmcgZmlsZW5hbWUsIGludDY0X3Qgb2Zmc2V0KSB7Ci0gIGZpbGVuYW1lXyA9IGZpbGVuYW1lOwotICBvZmZzZXRfID0gb2Zmc2V0OwotCi0gIC8vIGNoZWNrIGlmIGN1cnJlbnQgZmlsZSBpcyBzdGlsbCBvcGVuCi0gIGlmIChmZF8gPiAwKSB7Ci0gICAgLy8gZmx1c2ggYW55IGV2ZW50cyBpbiB0aGUgcXVldWUKLSAgICBmbHVzaCgpOwotICAgIEdsb2JhbE91dHB1dC5wcmludGYoImVycm9yLCBjdXJyZW50IGZpbGUgKCVzKSBub3QgY2xvc2VkIiwgZmlsZW5hbWVfLmNfc3RyKCkpOwotICAgIGlmICgtMSA9PSA6OmNsb3NlKGZkXykpIHsKLSAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogcmVzZXRPdXRwdXRGaWxlKCkgOjpjbG9zZSgpICIsIGVycm5vX2NvcHkpOwotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVEZpbGVUcmFuc3BvcnQ6IGVycm9yIGluIGZpbGUgY2xvc2UiLCBlcnJub19jb3B5KTsKLSAgICB9IGVsc2UgewotICAgICAgLy9zdWNjZXNzZnVsbHkgY2xvc2VkIGZkCi0gICAgICBmZF8gPSAwOwotICAgIH0KLSAgfQotCi0gIGlmIChmZCkgewotICAgIGZkXyA9IGZkOwotICB9IGVsc2UgewotICAgIC8vIG9wZW4gZmlsZSBpZiB0aGUgaW5wdXQgZmQgaXMgMAotICAgIG9wZW5Mb2dGaWxlKCk7Ci0gIH0KLX0KLQotCi1URmlsZVRyYW5zcG9ydDo6flRGaWxlVHJhbnNwb3J0KCkgewotICAvLyBmbHVzaCB0aGUgYnVmZmVyIGlmIGEgd3JpdGVyIHRocmVhZCBpcyBhY3RpdmUKLSAgaWYgKHdyaXRlclRocmVhZElkXyA+IDApIHsKLSAgICAvLyBzZXQgc3RhdGUgdG8gY2xvc2luZwotICAgIGNsb3NpbmdfID0gdHJ1ZTsKLQotICAgIC8vIHdha2UgdXAgdGhlIHdyaXRlciB0aHJlYWQKLSAgICAvLyBTaW5jZSBjbG9zaW5nXyBpcyB0cnVlLCBpdCB3aWxsIGF0dGVtcHQgdG8gZmx1c2ggYWxsIGRhdGEsIHRoZW4gZXhpdC4KLSAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZub3RFbXB0eV8pOwotCi0gICAgcHRocmVhZF9qb2luKHdyaXRlclRocmVhZElkXywgTlVMTCk7Ci0gICAgd3JpdGVyVGhyZWFkSWRfID0gMDsKLSAgfQotCi0gIGlmIChkZXF1ZXVlQnVmZmVyXykgewotICAgIGRlbGV0ZSBkZXF1ZXVlQnVmZmVyXzsKLSAgICBkZXF1ZXVlQnVmZmVyXyA9IE5VTEw7Ci0gIH0KLQotICBpZiAoZW5xdWV1ZUJ1ZmZlcl8pIHsKLSAgICBkZWxldGUgZW5xdWV1ZUJ1ZmZlcl87Ci0gICAgZW5xdWV1ZUJ1ZmZlcl8gPSBOVUxMOwotICB9Ci0KLSAgaWYgKHJlYWRCdWZmXykgewotICAgIGRlbGV0ZVtdIHJlYWRCdWZmXzsKLSAgICByZWFkQnVmZl8gPSBOVUxMOwotICB9Ci0KLSAgaWYgKGN1cnJlbnRFdmVudF8pIHsKLSAgICBkZWxldGUgY3VycmVudEV2ZW50XzsKLSAgICBjdXJyZW50RXZlbnRfID0gTlVMTDsKLSAgfQotCi0gIC8vIGNsb3NlIGxvZ2ZpbGUKLSAgaWYgKGZkXyA+IDApIHsKLSAgICBpZigtMSA9PSA6OmNsb3NlKGZkXykpIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiB+VEZpbGVUcmFuc3BvcnQoKSA6OmNsb3NlKCkgIiwgZXJybm8pOwotICAgIH0gZWxzZSB7Ci0gICAgICAvL3N1Y2Nlc3NmdWxseSBjbG9zZWQgZmQKLSAgICAgIGZkXyA9IDA7Ci0gICAgfQotICB9Ci19Ci0KLWJvb2wgVEZpbGVUcmFuc3BvcnQ6OmluaXRCdWZmZXJBbmRXcml0ZVRocmVhZCgpIHsKLSAgaWYgKGJ1ZmZlckFuZFRocmVhZEluaXRpYWxpemVkXykgewotICAgIFRfRVJST1IoIiVzIiwgIlRyeWluZyB0byBkb3VibGUtaW5pdCBURmlsZVRyYW5zcG9ydCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICh3cml0ZXJUaHJlYWRJZF8gPT0gMCkgewotICAgIGlmIChwdGhyZWFkX2NyZWF0ZSgmd3JpdGVyVGhyZWFkSWRfLCBOVUxMLCBzdGFydFdyaXRlclRocmVhZCwgKHZvaWQgKil0aGlzKSAhPSAwKSB7Ci0gICAgICBUX0VSUk9SKCIlcyIsICJDb3VsZCBub3QgY3JlYXRlIHdyaXRlciB0aHJlYWQiKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBkZXF1ZXVlQnVmZmVyXyA9IG5ldyBURmlsZVRyYW5zcG9ydEJ1ZmZlcihldmVudEJ1ZmZlclNpemVfKTsKLSAgZW5xdWV1ZUJ1ZmZlcl8gPSBuZXcgVEZpbGVUcmFuc3BvcnRCdWZmZXIoZXZlbnRCdWZmZXJTaXplXyk7Ci0gIGJ1ZmZlckFuZFRocmVhZEluaXRpYWxpemVkXyA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgVEZpbGVUcmFuc3BvcnQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIGlmIChyZWFkT25seV8pIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJURmlsZVRyYW5zcG9ydDogYXR0ZW1wdGluZyB0byB3cml0ZSB0byBmaWxlIG9wZW5lZCByZWFkb25seSIpOwotICB9Ci0KLSAgZW5xdWV1ZUV2ZW50KGJ1ZiwgbGVuKTsKLX0KLQotdm9pZCBURmlsZVRyYW5zcG9ydDo6ZW5xdWV1ZUV2ZW50KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgZXZlbnRMZW4pIHsKLSAgLy8gY2FuJ3QgZW5xdWV1ZSBtb3JlIGV2ZW50cyBpZiBmaWxlIGlzIGdvaW5nIHRvIGNsb3NlCi0gIGlmIChjbG9zaW5nXykgewotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIG1ha2Ugc3VyZSB0aGF0IGV2ZW50IHNpemUgaXMgdmFsaWQKLSAgaWYgKCAobWF4RXZlbnRTaXplXyA+IDApICYmIChldmVudExlbiA+IG1heEV2ZW50U2l6ZV8pICkgewotICAgIFRfRVJST1IoIm1zZyBzaXplIGlzIGdyZWF0ZXIgdGhhbiBtYXggZXZlbnQgc2l6ZTogJXUgPiAldVxuIiwgZXZlbnRMZW4sIG1heEV2ZW50U2l6ZV8pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChldmVudExlbiA9PSAwKSB7Ci0gICAgVF9FUlJPUigiJXMiLCAiY2Fubm90IGVucXVldWUgYW4gZW1wdHkgZXZlbnQiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBldmVudEluZm8qIHRvRW5xdWV1ZSA9IG5ldyBldmVudEluZm8oKTsKLSAgdG9FbnF1ZXVlLT5ldmVudEJ1ZmZfID0gKHVpbnQ4X3QgKilzdGQ6Om1hbGxvYygoc2l6ZW9mKHVpbnQ4X3QpICogZXZlbnRMZW4pICsgNCk7Ci0gIGlmICh0b0VucXVldWUtPmV2ZW50QnVmZl8gPT0gTlVMTCkgewotICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7Ci0gIH0KLSAgLy8gZmlyc3QgNCBieXRlcyBpcyB0aGUgZXZlbnQgbGVuZ3RoCi0gIG1lbWNweSh0b0VucXVldWUtPmV2ZW50QnVmZl8sICh2b2lkKikoJmV2ZW50TGVuKSwgNCk7Ci0gIC8vIGFjdHVhbCBldmVudCBjb250ZW50cwotICBtZW1jcHkodG9FbnF1ZXVlLT5ldmVudEJ1ZmZfICsgNCwgYnVmLCBldmVudExlbik7Ci0gIHRvRW5xdWV1ZS0+ZXZlbnRTaXplXyA9IGV2ZW50TGVuICsgNDsKLQotICAvLyBsb2NrIG11dGV4Ci0gIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXhfKTsKLQotICAvLyBtYWtlIHN1cmUgdGhhdCBlbnF1ZXVlIGJ1ZmZlciBpcyBpbml0aWFsaXplZCBhbmQgd3JpdGVyIHRocmVhZCBpcyBydW5uaW5nCi0gIGlmICghYnVmZmVyQW5kVGhyZWFkSW5pdGlhbGl6ZWRfKSB7Ci0gICAgaWYgKCFpbml0QnVmZmVyQW5kV3JpdGVUaHJlYWQoKSkgewotICAgICAgZGVsZXRlIHRvRW5xdWV1ZTsKLSAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleF8pOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIC8vIENhbid0IGVucXVldWUgd2hpbGUgYnVmZmVyIGlzIGZ1bGwKLSAgd2hpbGUgKGVucXVldWVCdWZmZXJfLT5pc0Z1bGwoKSkgewotICAgIHB0aHJlYWRfY29uZF93YWl0KCZub3RGdWxsXywgJm11dGV4Xyk7Ci0gIH0KLQotICAvLyBXZSBzaG91bGRuJ3QgYmUgdHJ5aW5nIHRvIGVucXVldWUgbmV3IGRhdGEgd2hpbGUgYSBmb3JjZWQgZmx1c2ggaXMKLSAgLy8gcmVxdWVzdGVkLiAgKE90aGVyd2lzZSB0aGUgd3JpdGVyIHRocmVhZCBtaWdodCBub3QgZXZlciBiZSBhYmxlIHRvIGZpbmlzaAotICAvLyB0aGUgZmx1c2ggaWYgbW9yZSBkYXRhIGtlZXBzIGJlaW5nIGVucXVldWVkLikKLSAgYXNzZXJ0KCFmb3JjZUZsdXNoXyk7Ci0KLSAgLy8gYWRkIHRvIHRoZSBidWZmZXIKLSAgaWYgKCFlbnF1ZXVlQnVmZmVyXy0+YWRkRXZlbnQodG9FbnF1ZXVlKSkgewotICAgIGRlbGV0ZSB0b0VucXVldWU7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gc2lnbmFsIGFueWJvZHkgd2hvJ3Mgd2FpdGluZyBmb3IgdGhlIGJ1ZmZlciB0byBiZSBub24tZW1wdHkKLSAgcHRocmVhZF9jb25kX3NpZ25hbCgmbm90RW1wdHlfKTsKLQotICAvLyB0aGlzIHJlYWxseSBzaG91bGQgYmUgYSBsb29wIHdoZXJlIGl0IG1ha2VzIHN1cmUgaXQgZ290IGZsdXNoZWQKLSAgLy8gYmVjYXVzZSBjb25kaXRpb24gdmFyaWFibGVzIGNhbiBnZXQgdHJpZ2dlcmVkIGJ5IHRoZSBvcyBmb3Igbm8gcmVhc29uCi0gIC8vIGl0IGlzIHByb2JhYmx5IGEgbm9uLWZhY3RvciBmb3IgdGhlIHRpbWUgYmVpbmcKLSAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7Ci19Ci0KLWJvb2wgVEZpbGVUcmFuc3BvcnQ6OnN3YXBFdmVudEJ1ZmZlcnMoc3RydWN0IHRpbWVzcGVjKiBkZWFkbGluZSkgewotICBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4Xyk7Ci0KLSAgYm9vbCBzd2FwOwotICBpZiAoIWVucXVldWVCdWZmZXJfLT5pc0VtcHR5KCkpIHsKLSAgICBzd2FwID0gdHJ1ZTsKLSAgfSBlbHNlIGlmIChjbG9zaW5nXykgewotICAgIC8vIGV2ZW4gdGhvdWdoIHRoZXJlIGlzIG5vIGRhdGEgdG8gd3JpdGUsCi0gICAgLy8gcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoZSB0cmFuc3BvcnQgaXMgY2xvc2luZwotICAgIHN3YXAgPSBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoZGVhZGxpbmUgIT0gTlVMTCkgewotICAgICAgLy8gaWYgd2Ugd2VyZSBoYW5kZWQgYSBkZWFkbGluZSB0aW1lIHN0cnVjdCwgZG8gYSB0aW1lZCB3YWl0Ci0gICAgICBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCZub3RFbXB0eV8sICZtdXRleF8sIGRlYWRsaW5lKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8ganVzdCB3YWl0IHVudGlsIHRoZSBidWZmZXIgZ2V0cyBhbiBpdGVtCi0gICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmbm90RW1wdHlfLCAmbXV0ZXhfKTsKLSAgICB9Ci0KLSAgICAvLyBjb3VsZCBiZSBlbXB0eSBpZiB3ZSB0aW1lZCBvdXQKLSAgICBzd2FwID0gZW5xdWV1ZUJ1ZmZlcl8tPmlzRW1wdHkoKTsKLSAgfQotCi0gIGlmIChzd2FwKSB7Ci0gICAgVEZpbGVUcmFuc3BvcnRCdWZmZXIgKnRlbXAgPSBlbnF1ZXVlQnVmZmVyXzsKLSAgICBlbnF1ZXVlQnVmZmVyXyA9IGRlcXVldWVCdWZmZXJfOwotICAgIGRlcXVldWVCdWZmZXJfID0gdGVtcDsKLSAgfQotCi0gIC8vIHVubG9jayB0aGUgbXV0ZXggYW5kIHNpZ25hbCBpZiByZXF1aXJlZAotICBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXhfKTsKLQotICBpZiAoc3dhcCkgewotICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJm5vdEZ1bGxfKTsKLSAgfQotCi0gIHJldHVybiBzd2FwOwotfQotCi0KLXZvaWQgVEZpbGVUcmFuc3BvcnQ6OndyaXRlclRocmVhZCgpIHsKLSAgYm9vbCBoYXNJT0Vycm9yID0gZmFsc2U7Ci0KLSAgLy8gb3BlbiBmaWxlIGlmIGl0IGlzIG5vdCBvcGVuCi0gIGlmKCFmZF8pIHsKLSAgICB0cnkgewotICAgICAgb3BlbkxvZ0ZpbGUoKTsKLSAgICB9IGNhdGNoICguLi4pIHsKLSAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogd3JpdGVyVGhyZWFkKCkgb3BlbkxvZ0ZpbGUoKSAiLCBlcnJub19jb3B5KTsKLSAgICAgIGZkXyA9IDA7Ci0gICAgICBoYXNJT0Vycm9yID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICAvLyBzZXQgdGhlIG9mZnNldCB0byB0aGUgY29ycmVjdCB2YWx1ZSAoRU9GKQotICBpZiAoIWhhc0lPRXJyb3IpIHsKLSAgICB0cnkgewotICAgICAgc2Vla1RvRW5kKCk7Ci0gICAgICAvLyB0aHJvdyBhd2F5IGFueSBwYXJ0aWFsIGV2ZW50cwotICAgICAgb2Zmc2V0XyArPSByZWFkU3RhdGVfLmxhc3REaXNwYXRjaFB0cl87Ci0gICAgICBmdHJ1bmNhdGUoZmRfLCBvZmZzZXRfKTsKLSAgICAgIHJlYWRTdGF0ZV8ucmVzZXRBbGxWYWx1ZXMoKTsKLSAgICB9IGNhdGNoICguLi4pIHsKLSAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogd3JpdGVyVGhyZWFkKCkgaW5pdGlhbGl6YXRpb24gIiwgZXJybm9fY29weSk7Ci0gICAgICBoYXNJT0Vycm9yID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICAvLyBGaWd1cmUgb3V0IHRoZSBuZXh0IHRpbWUgYnkgd2hpY2ggYSBmbHVzaCBtdXN0IHRha2UgcGxhY2UKLSAgc3RydWN0IHRpbWVzcGVjIHRzX25leHRfZmx1c2g7Ci0gIGdldE5leHRGbHVzaFRpbWUoJnRzX25leHRfZmx1c2gpOwotICB1aW50MzJfdCB1bmZsdXNoZWQgPSAwOwotCi0gIHdoaWxlICgxKSB7Ci0gICAgLy8gdGhpcyB3aWxsIG9ubHkgYmUgdHJ1ZSB3aGVuIHRoZSBkZXN0cnVjdG9yIGlzIGJlaW5nIGludm9rZWQKLSAgICBpZiAoY2xvc2luZ18pIHsKLSAgICAgIGlmIChoYXNJT0Vycm9yKSB7Ci0gICAgICAgIHB0aHJlYWRfZXhpdChOVUxMKTsKLSAgICAgIH0KLQotICAgICAgLy8gVHJ5IHRvIGVtcHR5IGJ1ZmZlcnMgYmVmb3JlIGV4aXQKLSAgICAgIGlmIChlbnF1ZXVlQnVmZmVyXy0+aXNFbXB0eSgpICYmIGRlcXVldWVCdWZmZXJfLT5pc0VtcHR5KCkpIHsKLSAgICAgICAgZnN5bmMoZmRfKTsKLSAgICAgICAgaWYgKC0xID09IDo6Y2xvc2UoZmRfKSkgewotICAgICAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlclRocmVhZCgpIDo6Y2xvc2UoKSAiLCBlcnJub19jb3B5KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvL2ZkIHN1Y2Nlc3NmdWxseSBjbG9zZWQKLSAgICAgICAgICBmZF8gPSAwOwotICAgICAgICB9Ci0gICAgICAgIHB0aHJlYWRfZXhpdChOVUxMKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoc3dhcEV2ZW50QnVmZmVycygmdHNfbmV4dF9mbHVzaCkpIHsKLSAgICAgIGV2ZW50SW5mbyogb3V0RXZlbnQ7Ci0gICAgICB3aGlsZSAoTlVMTCAhPSAob3V0RXZlbnQgPSBkZXF1ZXVlQnVmZmVyXy0+Z2V0TmV4dCgpKSkgewotICAgICAgICAvLyBSZW1vdmUgYW4gZXZlbnQgZnJvbSB0aGUgYnVmZmVyIGFuZCB3cml0ZSBpdCBvdXQgdG8gZGlzay4gSWYgdGhlcmUgaXMgYW55IElPIGVycm9yLCBmb3IgaW5zdGFuY2UsCi0gICAgICAgIC8vIHRoZSBvdXRwdXQgZmlsZSBpcyB1bm1vdW50ZWQgb3IgZGVsZXRlZCwgdGhlbiB0aGlzIGV2ZW50IGlzIGRyb3BwZWQuIEhvd2V2ZXIsIHRoZSB3cml0ZXIgdGhyZWFkCi0gICAgICAgIC8vIHdpbGw6ICgxKSBzbGVlcCBmb3IgYSBzaG9ydCB3aGlsZTsgKDIpIHRyeSB0byByZW9wZW4gdGhlIGZpbGU7ICgzKSBpZiBzdWNjZXNzZnVsIHRoZW4gc3RhcnQgd3JpdGluZwotICAgICAgICAvLyBmcm9tIHRoZSBlbmQuCi0KLSAgICAgICAgd2hpbGUgKGhhc0lPRXJyb3IpIHsKLSAgICAgICAgICBUX0VSUk9SKCJURmlsZVRyYW5zcG9ydDogd3JpdGVyIHRocmVhZCBnb2luZyB0byBzbGVlcCBmb3IgJWQgbWljcm9zZWNvbmRzIGR1ZSB0byBJTyBlcnJvcnMiLCB3cml0ZXJUaHJlYWRJT0Vycm9yU2xlZXBUaW1lXyk7Ci0gICAgICAgICAgdXNsZWVwKHdyaXRlclRocmVhZElPRXJyb3JTbGVlcFRpbWVfKTsKLSAgICAgICAgICBpZiAoY2xvc2luZ18pIHsKLSAgICAgICAgICAgIHB0aHJlYWRfZXhpdChOVUxMKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCFmZF8pIHsKLSAgICAgICAgICAgIDo6Y2xvc2UoZmRfKTsKLSAgICAgICAgICAgIGZkXyA9IDA7Ci0gICAgICAgICAgfQotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvcGVuTG9nRmlsZSgpOwotICAgICAgICAgICAgc2Vla1RvRW5kKCk7Ci0gICAgICAgICAgICB1bmZsdXNoZWQgPSAwOwotICAgICAgICAgICAgaGFzSU9FcnJvciA9IGZhbHNlOwotICAgICAgICAgICAgVF9MT0dfT1BFUigiVEZpbGVUcmFuc3BvcnQ6IGxvZyBmaWxlICVzIHJlb3BlbmVkIGJ5IHdyaXRlciB0aHJlYWQgZHVyaW5nIGVycm9yIHJlY292ZXJ5IiwgZmlsZW5hbWVfLmNfc3RyKCkpOwotICAgICAgICAgIH0gY2F0Y2ggKC4uLikgewotICAgICAgICAgICAgVF9FUlJPUigiVEZpbGVUcmFuc3BvcnQ6IHVuYWJsZSB0byByZW9wZW4gbG9nIGZpbGUgJXMgZHVyaW5nIGVycm9yIHJlY292ZXJ5IiwgZmlsZW5hbWVfLmNfc3RyKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNhbml0eSBjaGVjayBvbiBldmVudAotICAgICAgICBpZiAoKG1heEV2ZW50U2l6ZV8gPiAwKSAmJiAob3V0RXZlbnQtPmV2ZW50U2l6ZV8gPiBtYXhFdmVudFNpemVfKSkgewotICAgICAgICAgIFRfRVJST1IoIm1zZyBzaXplIGlzIGdyZWF0ZXIgdGhhbiBtYXggZXZlbnQgc2l6ZTogJXUgPiAldVxuIiwgb3V0RXZlbnQtPmV2ZW50U2l6ZV8sIG1heEV2ZW50U2l6ZV8pOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgY2h1bmtpbmcgaXMgcmVxdWlyZWQsIHRoZW4gbWFrZSBzdXJlIHRoYXQgbXNnIGRvZXMgbm90IGNyb3NzIGNodW5rIGJvdW5kYXJ5Ci0gICAgICAgIGlmICgob3V0RXZlbnQtPmV2ZW50U2l6ZV8gPiAwKSAmJiAoY2h1bmtTaXplXyAhPSAwKSkgewotICAgICAgICAgIC8vIGV2ZW50IHNpemUgbXVzdCBiZSBsZXNzIHRoYW4gY2h1bmsgc2l6ZQotICAgICAgICAgIGlmIChvdXRFdmVudC0+ZXZlbnRTaXplXyA+IGNodW5rU2l6ZV8pIHsKLSAgICAgICAgICAgIFRfRVJST1IoIlRGaWxlVHJhbnNwb3J0OiBldmVudCBzaXplKCV1KSA+IGNodW5rIHNpemUoJXUpOiBza2lwcGluZyBldmVudCIsIG91dEV2ZW50LT5ldmVudFNpemVfLCBjaHVua1NpemVfKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGludDY0X3QgY2h1bmsxID0gb2Zmc2V0Xy9jaHVua1NpemVfOwotICAgICAgICAgIGludDY0X3QgY2h1bmsyID0gKG9mZnNldF8gKyBvdXRFdmVudC0+ZXZlbnRTaXplXyAtIDEpL2NodW5rU2l6ZV87Ci0KLSAgICAgICAgICAvLyBpZiBhZGRpbmcgdGhpcyBldmVudCB3aWxsIGNyb3NzIGEgY2h1bmsgYm91bmRhcnksIHBhZCB0aGUgY2h1bmsgd2l0aCB6ZXJvcwotICAgICAgICAgIGlmIChjaHVuazEgIT0gY2h1bmsyKSB7Ci0gICAgICAgICAgICAvLyByZWZldGNoIHRoZSBvZmZzZXQgdG8ga2VlcCBpbiBzeW5jCi0gICAgICAgICAgICBvZmZzZXRfID0gbHNlZWsoZmRfLCAwLCBTRUVLX0NVUik7Ci0gICAgICAgICAgICBpbnQzMl90IHBhZGRpbmcgPSAoaW50MzJfdCkoKG9mZnNldF8gLyBjaHVua1NpemVfICsgMSkgKiBjaHVua1NpemVfIC0gb2Zmc2V0Xyk7Ci0KLSAgICAgICAgICAgIHVpbnQ4X3QqIHplcm9zID0gbmV3IHVpbnQ4X3RbcGFkZGluZ107Ci0gICAgICAgICAgICBtZW1zZXQoemVyb3MsICdcMCcsIHBhZGRpbmcpOwotICAgICAgICAgICAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiBhcnJheSh6ZXJvcyk7Ci0gICAgICAgICAgICBpZiAoLTEgPT0gOjp3cml0ZShmZF8sIHplcm9zLCBwYWRkaW5nKSkgewotICAgICAgICAgICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogd3JpdGVyVGhyZWFkKCkgZXJyb3Igd2hpbGUgcGFkZGluZyB6ZXJvcyAiLCBlcnJub19jb3B5KTsKLSAgICAgICAgICAgICAgaGFzSU9FcnJvciA9IHRydWU7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5mbHVzaGVkICs9IHBhZGRpbmc7Ci0gICAgICAgICAgICBvZmZzZXRfICs9IHBhZGRpbmc7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd3JpdGUgdGhlIGRlcXVldWVkIGV2ZW50IHRvIHRoZSBmaWxlCi0gICAgICAgIGlmIChvdXRFdmVudC0+ZXZlbnRTaXplXyA+IDApIHsKLSAgICAgICAgICBpZiAoLTEgPT0gOjp3cml0ZShmZF8sIG91dEV2ZW50LT5ldmVudEJ1ZmZfLCBvdXRFdmVudC0+ZXZlbnRTaXplXykpIHsKLSAgICAgICAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogZXJyb3Igd2hpbGUgd3JpdGluZyBldmVudCAiLCBlcnJub19jb3B5KTsKLSAgICAgICAgICAgIGhhc0lPRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIHVuZmx1c2hlZCArPSBvdXRFdmVudC0+ZXZlbnRTaXplXzsKLSAgICAgICAgICBvZmZzZXRfICs9IG91dEV2ZW50LT5ldmVudFNpemVfOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBkZXF1ZXVlQnVmZmVyXy0+cmVzZXQoKTsKLSAgICB9Ci0KLSAgICBpZiAoaGFzSU9FcnJvcikgewotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgLy8gTG9jYWwgdmFyaWFibGUgdG8gY2FjaGUgdGhlIHN0YXRlIG9mIGZvcmNlRmx1c2hfLgotICAgIC8vCi0gICAgLy8gV2Ugb25seSB3YW50IHRvIGNoZWNrIHRoZSB2YWx1ZSBvZiBmb3JjZUZsdXNoXyBvbmNlIGVhY2ggdGltZSBhcm91bmQgdGhlCi0gICAgLy8gbG9vcC4gIElmIHdlIGNoZWNrIGl0IG1vcmUgdGhhbiBvbmNlIHdpdGhvdXQgaG9sZGluZyB0aGUgbG9jayB0aGUgZW50aXJlCi0gICAgLy8gdGltZSwgaXQgY291bGQgaGF2ZSBjaGFuZ2VkIHN0YXRlIGluIGJldHdlZW4uICBUaGlzIHdpbGwgcmVzdWx0IGluIHVzCi0gICAgLy8gbWFraW5nIGluY29uc2lzdGVudCBkZWNpc2lvbnMuCi0gICAgYm9vbCBmb3JjZWRfZmx1c2ggPSBmYWxzZTsKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4Xyk7Ci0gICAgaWYgKGZvcmNlRmx1c2hfKSB7Ci0gICAgICBpZiAoIWVucXVldWVCdWZmZXJfLT5pc0VtcHR5KCkpIHsKLSAgICAgICAgLy8gSWYgZm9yY2VGbHVzaF8gaXMgdHJ1ZSwgd2UgbmVlZCB0byBmbHVzaCBhbGwgYXZhaWxhYmxlIGRhdGEuCi0gICAgICAgIC8vIElmIGVucXVldWVCdWZmZXJfIGlzIG5vdCBlbXB0eSwgZ28gYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIGxvb3AgdG8KLSAgICAgICAgLy8gd3JpdGUgaXQgb3V0LgotICAgICAgICAvLwotICAgICAgICAvLyBXZSBrbm93IHRoZSBtYWluIHRocmVhZCBpcyB3YWl0aW5nIG9uIGZvcmNlRmx1c2hfIHRvIGJlIGNsZWFyZWQsCi0gICAgICAgIC8vIHNvIG5vIG5ldyBldmVudHMgd2lsbCBiZSBhZGRlZCB0byBlbnF1ZXVlQnVmZmVyXyB1bnRpbCB3ZSBjbGVhcgotICAgICAgICAvLyBmb3JjZUZsdXNoXy4gIFRoZXJlZm9yZSB0aGUgbmV4dCB0aW1lIGFyb3VuZCB0aGUgbG9vcCBlbnF1ZXVlQnVmZmVyXwotICAgICAgICAvLyBpcyBndWFyYW50ZWVkIHRvIGJlIGVtcHR5LiAgKEkuZS4sIHdlJ3JlIGd1YXJhbnRlZWQgdG8gbWFrZSBwcm9ncmVzcwotICAgICAgICAvLyBhbmQgY2xlYXIgZm9yY2VGbHVzaF8gdGhlIG5leHQgdGltZSBhcm91bmQgdGhlIGxvb3AuKQotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXhfKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBmb3JjZWRfZmx1c2ggPSB0cnVlOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXhfKTsKLQotICAgIC8vIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIHBlcmZvcm0gYW4gZnN5bmMKLSAgICBib29sIGZsdXNoID0gZmFsc2U7Ci0gICAgaWYgKGZvcmNlZF9mbHVzaCB8fCB1bmZsdXNoZWQgPiBmbHVzaE1heEJ5dGVzXykgewotICAgICAgZmx1c2ggPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdHJ1Y3QgdGltZXNwZWMgY3VycmVudF90aW1lOwotICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJmN1cnJlbnRfdGltZSk7Ci0gICAgICBpZiAoY3VycmVudF90aW1lLnR2X3NlYyA+IHRzX25leHRfZmx1c2gudHZfc2VjIHx8Ci0gICAgICAgICAgKGN1cnJlbnRfdGltZS50dl9zZWMgPT0gdHNfbmV4dF9mbHVzaC50dl9zZWMgJiYKLSAgICAgICAgICAgY3VycmVudF90aW1lLnR2X25zZWMgPiB0c19uZXh0X2ZsdXNoLnR2X25zZWMpKSB7Ci0gICAgICAgIGlmICh1bmZsdXNoZWQgPiAwKSB7Ci0gICAgICAgICAgZmx1c2ggPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIG5ldyBkYXRhIHNpbmNlIHRoZSBsYXN0IGZzeW5jLAotICAgICAgICAgIC8vIGRvbid0IHBlcmZvcm0gdGhlIGZzeW5jLCBidXQgZG8gcmVzZXQgdGhlIHRpbWVyLgotICAgICAgICAgIGdldE5leHRGbHVzaFRpbWUoJnRzX25leHRfZmx1c2gpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGZsdXNoKSB7Ci0gICAgICAvLyBzeW5jIChmb3JjZSBmbHVzaCkgZmlsZSB0byBkaXNrCi0gICAgICBmc3luYyhmZF8pOwotICAgICAgdW5mbHVzaGVkID0gMDsKLSAgICAgIGdldE5leHRGbHVzaFRpbWUoJnRzX25leHRfZmx1c2gpOwotCi0gICAgICAvLyBub3RpZnkgYW55Ym9keSB3YWl0aW5nIGZvciBmbHVzaCBjb21wbGV0aW9uCi0gICAgICBpZiAoZm9yY2VkX2ZsdXNoKSB7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXhfKTsKLSAgICAgICAgZm9yY2VGbHVzaF8gPSBmYWxzZTsKLSAgICAgICAgYXNzZXJ0KGVucXVldWVCdWZmZXJfLT5pc0VtcHR5KCkpOwotICAgICAgICBhc3NlcnQoZGVxdWV1ZUJ1ZmZlcl8tPmlzRW1wdHkoKSk7Ci0gICAgICAgIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJmZsdXNoZWRfKTsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgVEZpbGVUcmFuc3BvcnQ6OmZsdXNoKCkgewotICAvLyBmaWxlIG11c3QgYmUgb3BlbiBmb3Igd3JpdGluZyBmb3IgYW55IGZsdXNoaW5nIHRvIHRha2UgcGxhY2UKLSAgaWYgKHdyaXRlclRocmVhZElkXyA8PSAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8vIHdhaXQgZm9yIGZsdXNoIHRvIHRha2UgcGxhY2UKLSAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleF8pOwotCi0gIC8vIEluZGljYXRlIHRoYXQgd2UgYXJlIHJlcXVlc3RpbmcgYSBmbHVzaAotICBmb3JjZUZsdXNoXyA9IHRydWU7Ci0gIC8vIFdha2UgdXAgdGhlIHdyaXRlciB0aHJlYWQgc28gaXQgd2lsbCBwZXJmb3JtIHRoZSBmbHVzaCBpbW1lZGlhdGVseQotICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZub3RFbXB0eV8pOwotCi0gIHdoaWxlIChmb3JjZUZsdXNoXykgewotICAgIHB0aHJlYWRfY29uZF93YWl0KCZmbHVzaGVkXywgJm11dGV4Xyk7Ci0gIH0KLQotICBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXhfKTsKLX0KLQotCi11aW50MzJfdCBURmlsZVRyYW5zcG9ydDo6cmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICB1aW50MzJfdCBoYXZlID0gMDsKLSAgdWludDMyX3QgZ2V0ID0gMDsKLQotICB3aGlsZSAoaGF2ZSA8IGxlbikgewotICAgIGdldCA9IHJlYWQoYnVmK2hhdmUsIGxlbi1oYXZlKTsKLSAgICBpZiAoZ2V0IDw9IDApIHsKLSAgICAgIHRocm93IFRFT0ZFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgaGF2ZSArPSBnZXQ7Ci0gIH0KLQotICByZXR1cm4gaGF2ZTsKLX0KLQotYm9vbCBURmlsZVRyYW5zcG9ydDo6cGVlaygpIHsKLSAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYW4gZXZlbnQgcmVhZHkgdG8gYmUgcmVhZAotICBpZiAoIWN1cnJlbnRFdmVudF8pIHsKLSAgICBjdXJyZW50RXZlbnRfID0gcmVhZEV2ZW50KCk7Ci0gIH0KLQotICAvLyBkaWQgbm90IG1hbmFnZSB0byByZWFkIGFuIGV2ZW50IGZyb20gdGhlIGZpbGUuIFRoaXMgY291bGQgaGF2ZSBoYXBwZW5lZAotICAvLyBpZiB0aGUgdGltZW91dCBleHBpcmVkIG9yIHRoZXJlIHdhcyBzb21lIG90aGVyIGVycm9yCi0gIGlmICghY3VycmVudEV2ZW50XykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGFueXRoaW5nIHRvIHJlYWQKLSAgcmV0dXJuIChjdXJyZW50RXZlbnRfLT5ldmVudFNpemVfIC0gY3VycmVudEV2ZW50Xy0+ZXZlbnRCdWZmUG9zXykgPiAwOwotfQotCi11aW50MzJfdCBURmlsZVRyYW5zcG9ydDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAvLyBjaGVjayBpZiB0aGVyZSBhbiBldmVudCBpcyByZWFkeSB0byBiZSByZWFkCi0gIGlmICghY3VycmVudEV2ZW50XykgewotICAgIGN1cnJlbnRFdmVudF8gPSByZWFkRXZlbnQoKTsKLSAgfQotCi0gIC8vIGRpZCBub3QgbWFuYWdlIHRvIHJlYWQgYW4gZXZlbnQgZnJvbSB0aGUgZmlsZS4gVGhpcyBjb3VsZCBoYXZlIGhhcHBlbmVkCi0gIC8vIGlmIHRoZSB0aW1lb3V0IGV4cGlyZWQgb3IgdGhlcmUgd2FzIHNvbWUgb3RoZXIgZXJyb3IKLSAgaWYgKCFjdXJyZW50RXZlbnRfKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyByZWFkIGFzIG11Y2ggb2YgdGhlIGN1cnJlbnQgZXZlbnQgYXMgcG9zc2libGUKLSAgaW50MzJfdCByZW1haW5pbmcgPSBjdXJyZW50RXZlbnRfLT5ldmVudFNpemVfIC0gY3VycmVudEV2ZW50Xy0+ZXZlbnRCdWZmUG9zXzsKLSAgaWYgKHJlbWFpbmluZyA8PSAoaW50MzJfdClsZW4pIHsKLSAgICAvLyBjb3B5IG92ZXIgYW55dGhpbmcgdGhhdHMgcmVtYWluaW5nCi0gICAgaWYgKHJlbWFpbmluZyA+IDApIHsKLSAgICAgIG1lbWNweShidWYsCi0gICAgICAgICAgICAgY3VycmVudEV2ZW50Xy0+ZXZlbnRCdWZmXyArIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZlBvc18sCi0gICAgICAgICAgICAgcmVtYWluaW5nKTsKLSAgICB9Ci0gICAgZGVsZXRlKGN1cnJlbnRFdmVudF8pOwotICAgIGN1cnJlbnRFdmVudF8gPSBOVUxMOwotICAgIHJldHVybiByZW1haW5pbmc7Ci0gIH0KLQotICAvLyByZWFkIGFzIG11Y2ggYXMgcG9zc2libGUKLSAgbWVtY3B5KGJ1ZiwgY3VycmVudEV2ZW50Xy0+ZXZlbnRCdWZmXyArIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZlBvc18sIGxlbik7Ci0gIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZlBvc18gKz0gbGVuOwotICByZXR1cm4gbGVuOwotfQotCi0vLyBub3RlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyByZXR1cm5lZCBldmVudHMKLWV2ZW50SW5mbyogVEZpbGVUcmFuc3BvcnQ6OnJlYWRFdmVudCgpIHsKLSAgaW50IHJlYWRUcmllcyA9IDA7Ci0KLSAgaWYgKCFyZWFkQnVmZl8pIHsKLSAgICByZWFkQnVmZl8gPSBuZXcgdWludDhfdFtyZWFkQnVmZlNpemVfXTsKLSAgfQotCi0gIHdoaWxlICgxKSB7Ci0gICAgLy8gcmVhZCBmcm9tIHRoZSBmaWxlIGlmIHJlYWQgYnVmZmVyIGlzIGV4aGF1c3RlZAotICAgIGlmIChyZWFkU3RhdGVfLmJ1ZmZlclB0cl8gPT0gcmVhZFN0YXRlXy5idWZmZXJMZW5fKSB7Ci0gICAgICAvLyBhZHZhbmNlIHRoZSBvZmZzZXQgcG9pbnRlcgotICAgICAgb2Zmc2V0XyArPSByZWFkU3RhdGVfLmJ1ZmZlckxlbl87Ci0gICAgICByZWFkU3RhdGVfLmJ1ZmZlckxlbl8gPSA6OnJlYWQoZmRfLCByZWFkQnVmZl8sIHJlYWRCdWZmU2l6ZV8pOwotICAgICAgLy8gICAgICAgaWYgKHJlYWRTdGF0ZV8uYnVmZmVyTGVuXykgewotICAgICAgLy8gICAgICAgICBUX0RFQlVHX0woMSwgIkFtb3VudCByZWFkOiAldSAob2Zmc2V0OiAlbHUpIiwgcmVhZFN0YXRlXy5idWZmZXJMZW5fLCBvZmZzZXRfKTsKLSAgICAgIC8vICAgICAgIH0KLSAgICAgIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyA9IDA7Ci0gICAgICByZWFkU3RhdGVfLmxhc3REaXNwYXRjaFB0cl8gPSAwOwotCi0gICAgICAvLyByZWFkIGVycm9yCi0gICAgICBpZiAocmVhZFN0YXRlXy5idWZmZXJMZW5fID09IC0xKSB7Ci0gICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRBbGxWYWx1ZXMoKTsKLSAgICAgICAgR2xvYmFsT3V0cHV0KCJURmlsZVRyYW5zcG9ydDogZXJyb3Igd2hpbGUgcmVhZGluZyBmcm9tIGZpbGUiKTsKLSAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiVEZpbGVUcmFuc3BvcnQ6IGVycm9yIHdoaWxlIHJlYWRpbmcgZnJvbSBmaWxlIik7Ci0gICAgICB9IGVsc2UgaWYgKHJlYWRTdGF0ZV8uYnVmZmVyTGVuXyA9PSAwKSB7ICAvLyBFT0YKLSAgICAgICAgLy8gd2FpdCBpbmRlZmluaXRlbHkgaWYgdGhlcmUgaXMgbm8gdGltZW91dAotICAgICAgICBpZiAocmVhZFRpbWVvdXRfID09IFRBSUxfUkVBRF9USU1FT1VUKSB7Ci0gICAgICAgICAgdXNsZWVwKGVvZlNsZWVwVGltZV8pOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9IGVsc2UgaWYgKHJlYWRUaW1lb3V0XyA9PSBOT19UQUlMX1JFQURfVElNRU9VVCkgewotICAgICAgICAgIC8vIHJlc2V0IHN0YXRlCi0gICAgICAgICAgcmVhZFN0YXRlXy5yZXNldFN0YXRlKDApOwotICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9IGVsc2UgaWYgKHJlYWRUaW1lb3V0XyA+IDApIHsKLSAgICAgICAgICAvLyB0aW1lb3V0IGFscmVhZHkgZXhwaXJlZCBvbmNlCi0gICAgICAgICAgaWYgKHJlYWRUcmllcyA+IDApIHsKLSAgICAgICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRTdGF0ZSgwKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1c2xlZXAocmVhZFRpbWVvdXRfICogMTAwMCk7Ci0gICAgICAgICAgICByZWFkVHJpZXMrKzsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJlYWRUcmllcyA9IDA7Ci0KLSAgICAvLyBhdHRlbXB0IHRvIHJlYWQgYW4gZXZlbnQgZnJvbSB0aGUgYnVmZmVyCi0gICAgd2hpbGUocmVhZFN0YXRlXy5idWZmZXJQdHJfIDwgcmVhZFN0YXRlXy5idWZmZXJMZW5fKSB7Ci0gICAgICBpZiAocmVhZFN0YXRlXy5yZWFkaW5nU2l6ZV8pIHsKLSAgICAgICAgaWYocmVhZFN0YXRlXy5ldmVudFNpemVCdWZmUG9zXyA9PSAwKSB7Ci0gICAgICAgICAgaWYgKCAob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXykvY2h1bmtTaXplXyAhPQotICAgICAgICAgICAgICAgKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfICsgMykvY2h1bmtTaXplXykpIHsKLSAgICAgICAgICAgIC8vIHNraXAgb25lIGJ5dGUgdG93YXJkcyBjaHVuayBib3VuZGFyeQotICAgICAgICAgICAgLy8gICAgICAgICAgICBUX0RFQlVHX0woMSwgIlNraXBwaW5nIGEgYnl0ZSIpOwotICAgICAgICAgICAgcmVhZFN0YXRlXy5idWZmZXJQdHJfKys7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZfW3JlYWRTdGF0ZV8uZXZlbnRTaXplQnVmZlBvc18rK10gPQotICAgICAgICAgIHJlYWRCdWZmX1tyZWFkU3RhdGVfLmJ1ZmZlclB0cl8rK107Ci0gICAgICAgIGlmIChyZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZQb3NfID09IDQpIHsKLSAgICAgICAgICAvLyAwIGxlbmd0aCBldmVudCBpbmRpY2F0ZXMgcGFkZGluZwotICAgICAgICAgIGlmICgqKCh1aW50MzJfdCAqKShyZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZfKSkgPT0gMCkgewotICAgICAgICAgICAgLy8gICAgICAgICAgICBUX0RFQlVHX0woMSwgIkdvdCBwYWRkaW5nIik7Ci0gICAgICAgICAgICByZWFkU3RhdGVfLnJlc2V0U3RhdGUocmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQdHJfKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBnb3QgYSB2YWxpZCBldmVudAotICAgICAgICAgIHJlYWRTdGF0ZV8ucmVhZGluZ1NpemVfID0gZmFsc2U7Ci0gICAgICAgICAgaWYgKHJlYWRTdGF0ZV8uZXZlbnRfKSB7Ci0gICAgICAgICAgICBkZWxldGUocmVhZFN0YXRlXy5ldmVudF8pOwotICAgICAgICAgIH0KLSAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50XyA9IG5ldyBldmVudEluZm8oKTsKLSAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXyA9ICooKHVpbnQzMl90ICopKHJlYWRTdGF0ZV8uZXZlbnRTaXplQnVmZl8pKTsKLQotICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBldmVudCBpcyBjb3JydXB0ZWQgYW5kIHBlcmZvcm0gcmVjb3ZlcnkgaWYgcmVxdWlyZWQKLSAgICAgICAgICBpZiAoaXNFdmVudENvcnJ1cHRlZCgpKSB7Ci0gICAgICAgICAgICBwZXJmb3JtUmVjb3ZlcnkoKTsKLSAgICAgICAgICAgIC8vIHN0YXJ0IGZyb20gdGhlIHRvcAotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoIXJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZfKSB7Ci0gICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZl8gPSBuZXcgdWludDhfdFtyZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplX107Ci0gICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18gPSAwOwotICAgICAgICB9Ci0gICAgICAgIC8vIHRha2UgZWl0aGVyIHRoZSBlbnRpcmUgZXZlbnQgb3IgdGhlIHJlbWFpbmluZyBieXRlcyBpbiB0aGUgYnVmZmVyCi0gICAgICAgIGludCByZWNsYWltQnVmZmVyID0gbWluKCh1aW50MzJfdCkocmVhZFN0YXRlXy5idWZmZXJMZW5fIC0gcmVhZFN0YXRlXy5idWZmZXJQdHJfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8gLSByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmUG9zXyk7Ci0KLSAgICAgICAgLy8gY29weSBkYXRhIGZyb20gcmVhZCBidWZmZXIgaW50byBldmVudCBidWZmZXIKLSAgICAgICAgbWVtY3B5KHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZfICsgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18sCi0gICAgICAgICAgICAgICByZWFkQnVmZl8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8sCi0gICAgICAgICAgICAgICByZWNsYWltQnVmZmVyKTsKLQotICAgICAgICAvLyBpbmNyZW1lbnQgcG9zaXRpb24gcHRycwotICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmUG9zXyArPSByZWNsYWltQnVmZmVyOwotICAgICAgICByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gKz0gcmVjbGFpbUJ1ZmZlcjsKLQotICAgICAgICAvLyBjaGVjayBpZiB0aGUgZXZlbnQgaGFzIGJlZW4gcmVhZCBpbiBmdWxsCi0gICAgICAgIGlmIChyZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmUG9zXyA9PSByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXykgewotICAgICAgICAgIC8vIHNldCB0aGUgY29tcGxldGVkIGV2ZW50IHRvIHRoZSBjdXJyZW50IGV2ZW50Ci0gICAgICAgICAgZXZlbnRJbmZvKiBjb21wbGV0ZUV2ZW50ID0gcmVhZFN0YXRlXy5ldmVudF87Ci0gICAgICAgICAgY29tcGxldGVFdmVudC0+ZXZlbnRCdWZmUG9zXyA9IDA7Ci0KLSAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50XyA9IE5VTEw7Ci0gICAgICAgICAgcmVhZFN0YXRlXy5yZXNldFN0YXRlKHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyk7Ci0KLSAgICAgICAgICAvLyBleGl0IGNyaXRlcmlhCi0gICAgICAgICAgcmV0dXJuIGNvbXBsZXRlRXZlbnQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotfQotCi1ib29sIFRGaWxlVHJhbnNwb3J0Ojppc0V2ZW50Q29ycnVwdGVkKCkgewotICAvLyBhbiBlcnJvciBpcyB0cmlnZ2VyZWQgaWY6Ci0gIGlmICggKG1heEV2ZW50U2l6ZV8gPiAwKSAmJiAgKHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfID4gbWF4RXZlbnRTaXplXykpIHsKLSAgICAvLyAxLiBFdmVudCBzaXplIGlzIGxhcmdlciB0aGFuIHVzZXItc3BlZmljaWVkIG1heC1ldmVudCBzaXplCi0gICAgVF9FUlJPUigiUmVhZCBjb3JydXB0IGV2ZW50LiBFdmVudCBzaXplKCV1KSBncmVhdGVyIHRoYW4gbWF4IGV2ZW50IHNpemUgKCV1KSIsCi0gICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXywgbWF4RXZlbnRTaXplXyk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAocmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8gPiBjaHVua1NpemVfKSB7Ci0gICAgLy8gMi4gRXZlbnQgc2l6ZSBpcyBsYXJnZXIgdGhhbiBjaHVuayBzaXplCi0gICAgVF9FUlJPUigiUmVhZCBjb3JydXB0IGV2ZW50LiBFdmVudCBzaXplKCV1KSBncmVhdGVyIHRoYW4gY2h1bmsgc2l6ZSAoJXUpIiwKLSAgICAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfLCBjaHVua1NpemVfKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIGlmKCAoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gLSA0KS9jaHVua1NpemVfKSAhPQotICAgICAgICAgICAgICgob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyArIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfIC0gMSkvY2h1bmtTaXplXykgKSB7Ci0gICAgLy8gMy4gc2l6ZSBpbmRpY2F0ZXMgdGhhdCBldmVudCBjcm9zc2VzIGNodW5rIGJvdW5kYXJ5Ci0gICAgVF9FUlJPUigiUmVhZCBjb3JydXB0IGV2ZW50LiBFdmVudCBjcm9zc2VzIGNodW5rIGJvdW5kYXJ5LiBFdmVudCBzaXplOiV1ICBPZmZzZXQ6JWx1IiwKLSAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfLAotICAgICAgICAgICAgKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gKyA0KSk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBURmlsZVRyYW5zcG9ydDo6cGVyZm9ybVJlY292ZXJ5KCkgewotICAvLyBwZXJmb3JtIHNvbWUga2lja2FzcyByZWNvdmVyeQotICB1aW50MzJfdCBjdXJDaHVuayA9IGdldEN1ckNodW5rKCk7Ci0gIGlmIChsYXN0QmFkQ2h1bmtfID09IGN1ckNodW5rKSB7Ci0gICAgbnVtQ29ycnVwdGVkRXZlbnRzSW5DaHVua18rKzsKLSAgfSBlbHNlIHsKLSAgICBsYXN0QmFkQ2h1bmtfID0gY3VyQ2h1bms7Ci0gICAgbnVtQ29ycnVwdGVkRXZlbnRzSW5DaHVua18gPSAxOwotICB9Ci0KLSAgaWYgKG51bUNvcnJ1cHRlZEV2ZW50c0luQ2h1bmtfIDwgbWF4Q29ycnVwdGVkRXZlbnRzXykgewotICAgIC8vIG1heWJlIHRoZXJlIHdhcyBhbiBlcnJvciBpbiByZWFkaW5nIHRoZSBmaWxlIGZyb20gZGlzawotICAgIC8vIHNlZWsgdG8gdGhlIGJlZ2lubmluZyBvZiBjaHVuayBhbmQgdHJ5IGFnYWluCi0gICAgc2Vla1RvQ2h1bmsoY3VyQ2h1bmspOwotICB9IGVsc2UgewotCi0gICAgLy8ganVzdCBza2lwIGFoZWFkIHRvIHRoZSBuZXh0IGNodW5rIGlmIHdlIG5vdCBhbHJlYWR5IGF0IHRoZSBsYXN0IGNodW5rCi0gICAgaWYgKGN1ckNodW5rICE9IChnZXROdW1DaHVua3MoKSAtIDEpKSB7Ci0gICAgICBzZWVrVG9DaHVuayhjdXJDaHVuayArIDEpOwotICAgIH0gZWxzZSBpZiAocmVhZFRpbWVvdXRfID09IFRBSUxfUkVBRF9USU1FT1VUKSB7Ci0gICAgICAvLyBpZiB0YWlsaW5nIHRoZSBmaWxlLCB3YWl0IHVudGlsIHRoZXJlIGlzIGVub3VnaCBkYXRhIHRvIHN0YXJ0Ci0gICAgICAvLyB0aGUgbmV4dCBjaHVuawotICAgICAgd2hpbGUoY3VyQ2h1bmsgPT0gKGdldE51bUNodW5rcygpIC0gMSkpIHsKLSAgICAgICAgdXNsZWVwKERFRkFVTFRfQ09SUlVQVEVEX1NMRUVQX1RJTUVfVVMpOwotICAgICAgfQotICAgICAgc2Vla1RvQ2h1bmsoY3VyQ2h1bmsgKyAxKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gcHJldHR5IGhvc2VkIGF0IHRoaXMgc3RhZ2UsIHJld2luZCB0aGUgZmlsZSBiYWNrIHRvIHRoZSBsYXN0IHN1Y2Nlc3NmdWwKLSAgICAgIC8vIHBvaW50IGFuZCBwdW50IG9uIHRoZSBlcnJvcgotICAgICAgcmVhZFN0YXRlXy5yZXNldFN0YXRlKHJlYWRTdGF0ZV8ubGFzdERpc3BhdGNoUHRyXyk7Ci0gICAgICBjdXJyZW50RXZlbnRfID0gTlVMTDsKLSAgICAgIGNoYXIgZXJyb3JNc2dbMTAyNF07Ci0gICAgICBzcHJpbnRmKGVycm9yTXNnLCAiVEZpbGVUcmFuc3BvcnQ6IGxvZyBmaWxlIGNvcnJ1cHRlZCBhdCBvZmZzZXQ6ICVsdSIsCi0gICAgICAgICAgICAgIChvZmZzZXRfICsgcmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQdHJfKSk7Ci0gICAgICAgICAgICAgIAotICAgICAgR2xvYmFsT3V0cHV0KGVycm9yTXNnKTsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oZXJyb3JNc2cpOwotICAgIH0KLSAgfQotCi19Ci0KLXZvaWQgVEZpbGVUcmFuc3BvcnQ6OnNlZWtUb0NodW5rKGludDMyX3QgY2h1bmspIHsKLSAgaWYgKGZkXyA8PSAwKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiRmlsZSBub3Qgb3BlbiIpOwotICB9Ci0KLSAgaW50MzJfdCBudW1DaHVua3MgPSBnZXROdW1DaHVua3MoKTsKLQotICAvLyBmaWxlIGlzIGVtcHR5LCBzZWVraW5nIHRvIGNodW5rIGlzIHBvaW50bGVzcwotICBpZiAobnVtQ2h1bmtzID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBuZWdhdGl2ZSBpbmRpY2F0ZXMgcmV2ZXJzZSBzZWVrIChmcm9tIHRoZSBlbmQpCi0gIGlmIChjaHVuayA8IDApIHsKLSAgICBjaHVuayArPSBudW1DaHVua3M7Ci0gIH0KLQotICAvLyB0b28gbGFyZ2UgYSB2YWx1ZSBmb3IgcmV2ZXJzZSBzZWVrLCBqdXN0IHNlZWsgdG8gYmVnaW5uaW5nCi0gIGlmIChjaHVuayA8IDApIHsKLSAgICBUX0RFQlVHKCIlcyIsICJJbmNvcnJlY3QgdmFsdWUgZm9yIHJldmVyc2Ugc2Vlay4gU2Vla2luZyB0byBiZWdpbm5pbmcuLi4iKTsKLSAgICBjaHVuayA9IDA7Ci0gIH0KLQotICAvLyBjYW5ub3Qgc2VlayBwYXN0IEVPRgotICBib29sIHNlZWtUb0VuZCA9IGZhbHNlOwotICBvZmZfdCBtaW5FbmRPZmZzZXQgPSAwOwotICBpZiAoY2h1bmsgPj0gbnVtQ2h1bmtzKSB7Ci0gICAgVF9ERUJVRygiJXMiLCAiVHJ5aW5nIHRvIHNlZWsgcGFzdCBFT0YuIFNlZWtpbmcgdG8gRU9GIGluc3RlYWQuLi4iKTsKLSAgICBzZWVrVG9FbmQgPSB0cnVlOwotICAgIGNodW5rID0gbnVtQ2h1bmtzIC0gMTsKLSAgICAvLyB0aGlzIGlzIHRoZSBtaW4gb2Zmc2V0IHRvIHByb2Nlc3MgZXZlbnRzIHRpbGwKLSAgICBtaW5FbmRPZmZzZXQgPSBsc2VlayhmZF8sIDAsIFNFRUtfRU5EKTsKLSAgfQotCi0gIG9mZl90IG5ld09mZnNldCA9IG9mZl90KGNodW5rKSAqIGNodW5rU2l6ZV87Ci0gIG9mZnNldF8gPSBsc2VlayhmZF8sIG5ld09mZnNldCwgU0VFS19TRVQpOwotICByZWFkU3RhdGVfLnJlc2V0QWxsVmFsdWVzKCk7Ci0gIGN1cnJlbnRFdmVudF8gPSBOVUxMOwotICBpZiAob2Zmc2V0XyA9PSAtMSkgewotICAgIEdsb2JhbE91dHB1dCgiVEZpbGVUcmFuc3BvcnQ6IGxzZWVrIGVycm9yIGluIHNlZWtUb0NodW5rIik7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiVEZpbGVUcmFuc3BvcnQ6IGxzZWVrIGVycm9yIGluIHNlZWtUb0NodW5rIik7Ci0gIH0KLQotICAvLyBzZWVrIHRvIEVPRiBpZiB1c2VyIHdhbnRlZCB0byBnbyB0byBsYXN0IGNodW5rCi0gIGlmIChzZWVrVG9FbmQpIHsKLSAgICB1aW50MzJfdCBvbGRSZWFkVGltZW91dCA9IGdldFJlYWRUaW1lb3V0KCk7Ci0gICAgc2V0UmVhZFRpbWVvdXQoTk9fVEFJTF9SRUFEX1RJTUVPVVQpOwotICAgIC8vIGtlZXAgb24gcmVhZGluZyB1bnRpIHRoZSBsYXN0IGV2ZW50IGF0IHBvaW50IG9mIHNlZWtDaHVuayBjYWxsCi0gICAgYm9vc3Q6OnNjb3BlZF9wdHI8ZXZlbnRJbmZvPiBldmVudDsKLSAgICB3aGlsZSAoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8pIDwgbWluRW5kT2Zmc2V0KSB7Ci0gICAgICBldmVudC5yZXNldChyZWFkRXZlbnQoKSk7Ci0gICAgICBpZiAoZXZlbnQuZ2V0KCkgPT0gTlVMTCkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgc2V0UmVhZFRpbWVvdXQob2xkUmVhZFRpbWVvdXQpOwotICB9Ci0KLX0KLQotdm9pZCBURmlsZVRyYW5zcG9ydDo6c2Vla1RvRW5kKCkgewotICBzZWVrVG9DaHVuayhnZXROdW1DaHVua3MoKSk7Ci19Ci0KLXVpbnQzMl90IFRGaWxlVHJhbnNwb3J0OjpnZXROdW1DaHVua3MoKSB7Ci0gIGlmIChmZF8gPD0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgc3RydWN0IHN0YXQgZl9pbmZvOwotICBpbnQgcnYgPSBmc3RhdChmZF8sICZmX2luZm8pOwotCi0gIGlmIChydiA8IDApIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJURmlsZVRyYW5zcG9ydDo6Z2V0TnVtQ2h1bmtzKCkgKGZzdGF0KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKLSAgfQotCi0gIGlmIChmX2luZm8uc3Rfc2l6ZSA+IDApIHsKLSAgICByZXR1cm4gKChmX2luZm8uc3Rfc2l6ZSkvY2h1bmtTaXplXykgKyAxOwotICB9Ci0KLSAgLy8gZW1wdHkgZmlsZSBoYXMgbm8gY2h1bmtzCi0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURmlsZVRyYW5zcG9ydDo6Z2V0Q3VyQ2h1bmsoKSB7Ci0gIHJldHVybiBvZmZzZXRfL2NodW5rU2l6ZV87Ci19Ci0KLS8vIFV0aWxpdHkgRnVuY3Rpb25zCi12b2lkIFRGaWxlVHJhbnNwb3J0OjpvcGVuTG9nRmlsZSgpIHsKLSAgbW9kZV90IG1vZGUgPSByZWFkT25seV8gPyBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEggOiBTX0lSVVNSIHwgU19JV1VTUnwgU19JUkdSUCB8IFNfSVJPVEg7Ci0gIGludCBmbGFncyA9IHJlYWRPbmx5XyA/IE9fUkRPTkxZIDogT19SRFdSIHwgT19DUkVBVCB8IE9fQVBQRU5EOwotICBmZF8gPSA6Om9wZW4oZmlsZW5hbWVfLmNfc3RyKCksIGZsYWdzLCBtb2RlKTsKLSAgb2Zmc2V0XyA9IDA7Ci0KLSAgLy8gbWFrZSBzdXJlIG9wZW4gY2FsbCB3YXMgc3VjY2Vzc2Z1bAotICBpZihmZF8gPT0gLTEpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiBvcGVuTG9nRmlsZSgpIDo6b3BlbigpIGZpbGU6ICIgKyBmaWxlbmFtZV8sIGVycm5vX2NvcHkpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sIGZpbGVuYW1lXywgZXJybm9fY29weSk7Ci0gIH0KLQotfQotCi12b2lkIFRGaWxlVHJhbnNwb3J0OjpnZXROZXh0Rmx1c2hUaW1lKHN0cnVjdCB0aW1lc3BlYyogdHNfbmV4dF9mbHVzaCkgewotICBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCB0c19uZXh0X2ZsdXNoKTsKLSAgdHNfbmV4dF9mbHVzaC0+dHZfbnNlYyArPSAoZmx1c2hNYXhVc18gJSAxMDAwMDAwKSAqIDEwMDA7Ci0gIGlmICh0c19uZXh0X2ZsdXNoLT50dl9uc2VjID4gMTAwMDAwMDAwMCkgewotICAgIHRzX25leHRfZmx1c2gtPnR2X25zZWMgLT0gMTAwMDAwMDAwMDsKLSAgICB0c19uZXh0X2ZsdXNoLT50dl9zZWMgKz0gMTsKLSAgfQotICB0c19uZXh0X2ZsdXNoLT50dl9zZWMgKz0gZmx1c2hNYXhVc18gLyAxMDAwMDAwOwotfQotCi1URmlsZVRyYW5zcG9ydEJ1ZmZlcjo6VEZpbGVUcmFuc3BvcnRCdWZmZXIodWludDMyX3Qgc2l6ZSkKLSAgOiBidWZmZXJNb2RlXyhXUklURSkKLSAgLCB3cml0ZVBvaW50XygwKQotICAsIHJlYWRQb2ludF8oMCkKLSAgLCBzaXplXyhzaXplKQotewotICBidWZmZXJfID0gbmV3IGV2ZW50SW5mbypbc2l6ZV07Ci19Ci0KLVRGaWxlVHJhbnNwb3J0QnVmZmVyOjp+VEZpbGVUcmFuc3BvcnRCdWZmZXIoKSB7Ci0gIGlmIChidWZmZXJfKSB7Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdyaXRlUG9pbnRfOyBpKyspIHsKLSAgICAgIGRlbGV0ZSBidWZmZXJfW2ldOwotICAgIH0KLSAgICBkZWxldGVbXSBidWZmZXJfOwotICAgIGJ1ZmZlcl8gPSBOVUxMOwotICB9Ci19Ci0KLWJvb2wgVEZpbGVUcmFuc3BvcnRCdWZmZXI6OmFkZEV2ZW50KGV2ZW50SW5mbyAqZXZlbnQpIHsKLSAgaWYgKGJ1ZmZlck1vZGVfID09IFJFQUQpIHsKLSAgICBHbG9iYWxPdXRwdXQoIlRyeWluZyB0byB3cml0ZSB0byBhIGJ1ZmZlciBpbiByZWFkIG1vZGUiKTsKLSAgfQotICBpZiAod3JpdGVQb2ludF8gPCBzaXplXykgewotICAgIGJ1ZmZlcl9bd3JpdGVQb2ludF8rK10gPSBldmVudDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICAvLyBidWZmZXIgaXMgZnVsbAotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi1ldmVudEluZm8qIFRGaWxlVHJhbnNwb3J0QnVmZmVyOjpnZXROZXh0KCkgewotICBpZiAoYnVmZmVyTW9kZV8gPT0gV1JJVEUpIHsKLSAgICBidWZmZXJNb2RlXyA9IFJFQUQ7Ci0gIH0KLSAgaWYgKHJlYWRQb2ludF8gPCB3cml0ZVBvaW50XykgewotICAgIHJldHVybiBidWZmZXJfW3JlYWRQb2ludF8rK107Ci0gIH0gZWxzZSB7Ci0gICAgLy8gbm8gbW9yZSBlbnRyaWVzCi0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotdm9pZCBURmlsZVRyYW5zcG9ydEJ1ZmZlcjo6cmVzZXQoKSB7Ci0gIGlmIChidWZmZXJNb2RlXyA9PSBXUklURSB8fCB3cml0ZVBvaW50XyA+IHJlYWRQb2ludF8pIHsKLSAgICBUX0RFQlVHKCIlcyIsICJSZXNldHRpbmcgYSBidWZmZXIgd2l0aCB1bnJlYWQgZW50cmllcyIpOwotICB9Ci0gIC8vIENsZWFuIHVwIHRoZSBvbGQgZW50cmllcwotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgd3JpdGVQb2ludF87IGkrKykgewotICAgIGRlbGV0ZSBidWZmZXJfW2ldOwotICB9Ci0gIGJ1ZmZlck1vZGVfID0gV1JJVEU7Ci0gIHdyaXRlUG9pbnRfID0gMDsKLSAgcmVhZFBvaW50XyA9IDA7Ci19Ci0KLWJvb2wgVEZpbGVUcmFuc3BvcnRCdWZmZXI6OmlzRnVsbCgpIHsKLSAgcmV0dXJuIHdyaXRlUG9pbnRfID09IHNpemVfOwotfQotCi1ib29sIFRGaWxlVHJhbnNwb3J0QnVmZmVyOjppc0VtcHR5KCkgewotICByZXR1cm4gd3JpdGVQb2ludF8gPT0gMDsKLX0KLQotVEZpbGVQcm9jZXNzb3I6OlRGaWxlUHJvY2Vzc29yKHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0KToKLSAgcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAotICBpbnB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKLSAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAotICBpbnB1dFRyYW5zcG9ydF8oaW5wdXRUcmFuc3BvcnQpIHsKLQotICAvLyBkZWZhdWx0IHRoZSBvdXRwdXQgdHJhbnNwb3J0IHRvIGEgbnVsbCB0cmFuc3BvcnQgKGNvbW1vbiBjYXNlKQotICBvdXRwdXRUcmFuc3BvcnRfID0gc2hhcmVkX3B0cjxUTnVsbFRyYW5zcG9ydD4obmV3IFROdWxsVHJhbnNwb3J0KCkpOwotfQotCi1URmlsZVByb2Nlc3Nvcjo6VEZpbGVQcm9jZXNzb3Ioc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCk6Ci0gIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKLSAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKGlucHV0UHJvdG9jb2xGYWN0b3J5KSwKLSAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XyhvdXRwdXRQcm90b2NvbEZhY3RvcnkpLAotICBpbnB1dFRyYW5zcG9ydF8oaW5wdXRUcmFuc3BvcnQpIHsKLQotICAvLyBkZWZhdWx0IHRoZSBvdXRwdXQgdHJhbnNwb3J0IHRvIGEgbnVsbCB0cmFuc3BvcnQgKGNvbW1vbiBjYXNlKQotICBvdXRwdXRUcmFuc3BvcnRfID0gc2hhcmVkX3B0cjxUTnVsbFRyYW5zcG9ydD4obmV3IFROdWxsVHJhbnNwb3J0KCkpOwotfQotCi1URmlsZVByb2Nlc3Nvcjo6VEZpbGVQcm9jZXNzb3Ioc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnQpOgotICBwcm9jZXNzb3JfKHByb2Nlc3NvciksCi0gIGlucHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAotICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCi0gIGlucHV0VHJhbnNwb3J0XyhpbnB1dFRyYW5zcG9ydCksCi0gIG91dHB1dFRyYW5zcG9ydF8ob3V0cHV0VHJhbnNwb3J0KSB7fQotCi12b2lkIFRGaWxlUHJvY2Vzc29yOjpwcm9jZXNzKHVpbnQzMl90IG51bUV2ZW50cywgYm9vbCB0YWlsKSB7Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydF8pOwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnRfKTsKLQotICAvLyBzZXQgdGhlIHJlYWQgdGltZW91dCB0byAwIGlmIHRhaWxpbmcgaXMgcmVxdWlyZWQKLSAgaW50MzJfdCBvbGRSZWFkVGltZW91dCA9IGlucHV0VHJhbnNwb3J0Xy0+Z2V0UmVhZFRpbWVvdXQoKTsKLSAgaWYgKHRhaWwpIHsKLSAgICAvLyBzYXZlIG9sZCByZWFkIHRpbWVvdXQgc28gaXQgY2FuIGJlIHJlc3RvcmVkCi0gICAgaW5wdXRUcmFuc3BvcnRfLT5zZXRSZWFkVGltZW91dChURmlsZVRyYW5zcG9ydDo6VEFJTF9SRUFEX1RJTUVPVVQpOwotICB9Ci0KLSAgdWludDMyX3QgbnVtUHJvY2Vzc2VkID0gMDsKLSAgd2hpbGUoMSkgewotICAgIC8vIGJhZCBmb3JtIHRvIHVzZSBleGNlcHRpb25zIGZvciBmbG93IGNvbnRyb2wgYnV0IHRoZXJlIGlzIHJlYWxseQotICAgIC8vIG5vIG90aGVyIHdheSBhcm91bmQgaXQKLSAgICB0cnkgewotICAgICAgcHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgTlVMTCk7Ci0gICAgICBudW1Qcm9jZXNzZWQrKzsKLSAgICAgIGlmICggKG51bUV2ZW50cyA+IDApICYmIChudW1Qcm9jZXNzZWQgPT0gbnVtRXZlbnRzKSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVEVPRkV4Y2VwdGlvbiYgdGVvZikgewotICAgICAgaWYgKCF0YWlsKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gJnRlKSB7Ci0gICAgICBjZXJyIDw8IHRlLndoYXQoKSA8PCBlbmRsOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gcmVzdG9yZSBvbGQgcmVhZCB0aW1lb3V0Ci0gIGlmICh0YWlsKSB7Ci0gICAgaW5wdXRUcmFuc3BvcnRfLT5zZXRSZWFkVGltZW91dChvbGRSZWFkVGltZW91dCk7Ci0gIH0KLQotfQotCi12b2lkIFRGaWxlUHJvY2Vzc29yOjpwcm9jZXNzQ2h1bmsoKSB7Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydF8pOwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnRfKTsKLQotICB1aW50MzJfdCBjdXJDaHVuayA9IGlucHV0VHJhbnNwb3J0Xy0+Z2V0Q3VyQ2h1bmsoKTsKLQotICB3aGlsZSgxKSB7Ci0gICAgLy8gYmFkIGZvcm0gdG8gdXNlIGV4Y2VwdGlvbnMgZm9yIGZsb3cgY29udHJvbCBidXQgdGhlcmUgaXMgcmVhbGx5Ci0gICAgLy8gbm8gb3RoZXIgd2F5IGFyb3VuZCBpdAotICAgIHRyeSB7Ci0gICAgICBwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLCBOVUxMKTsKLSAgICAgIGlmIChjdXJDaHVuayAhPSBpbnB1dFRyYW5zcG9ydF8tPmdldEN1ckNodW5rKCkpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVEVPRkV4Y2VwdGlvbiYgdGVvZikgewotICAgICAgYnJlYWs7Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiAmdGUpIHsKLSAgICAgIGNlcnIgPDwgdGUud2hhdCgpIDw8IGVuZGw7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYThjOWEuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RGSUxFVFJBTlNQT1JUX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RGSUxFVFJBTlNQT1JUX0hfIDEKLQotI2luY2x1ZGUgIlRUcmFuc3BvcnQuaCIKLSNpbmNsdWRlICJUaHJpZnQuaCIKLSNpbmNsdWRlICJUUHJvY2Vzc29yLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9wdHIuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi11c2luZyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvcjsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKLQotLy8gRGF0YSBwZXJ0YWluaW5nIHRvIGEgc2luZ2xlIGV2ZW50Ci10eXBlZGVmIHN0cnVjdCBldmVudEluZm8gewotICB1aW50OF90KiBldmVudEJ1ZmZfOwotICB1aW50MzJfdCBldmVudFNpemVfOwotICB1aW50MzJfdCBldmVudEJ1ZmZQb3NfOwotCi0gIGV2ZW50SW5mbygpOmV2ZW50QnVmZl8oTlVMTCksIGV2ZW50U2l6ZV8oMCksIGV2ZW50QnVmZlBvc18oMCl7fTsKLSAgfmV2ZW50SW5mbygpIHsKLSAgICBpZiAoZXZlbnRCdWZmXykgewotICAgICAgZGVsZXRlW10gZXZlbnRCdWZmXzsKLSAgICB9Ci0gIH0KLX0gZXZlbnRJbmZvOwotCi0vLyBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50IHJlYWQgc3RhdGUKLXR5cGVkZWYgc3RydWN0IHJlYWRTdGF0ZSB7Ci0gIGV2ZW50SW5mbyogZXZlbnRfOwotCi0gIC8vIGtlZXAgdHJhY2sgb2YgZXZlbnQgc2l6ZQotICB1aW50OF90ICAgZXZlbnRTaXplQnVmZl9bNF07Ci0gIHVpbnQ4X3QgICBldmVudFNpemVCdWZmUG9zXzsKLSAgYm9vbCAgICAgIHJlYWRpbmdTaXplXzsKLQotICAvLyByZWFkIGJ1ZmZlciB2YXJpYWJsZXMKLSAgaW50MzJfdCAgYnVmZmVyUHRyXzsKLSAgaW50MzJfdCAgYnVmZmVyTGVuXzsKLQotICAvLyBsYXN0IHN1Y2Nlc3NmdWwgZGlzcGF0Y2ggcG9pbnQKLSAgaW50MzJfdCBsYXN0RGlzcGF0Y2hQdHJfOwotCi0gIHZvaWQgcmVzZXRTdGF0ZSh1aW50MzJfdCBsYXN0RGlzcGF0Y2hQdHIpIHsKLSAgICByZWFkaW5nU2l6ZV8gPSB0cnVlOwotICAgIGV2ZW50U2l6ZUJ1ZmZQb3NfID0gMDsKLSAgICBsYXN0RGlzcGF0Y2hQdHJfID0gbGFzdERpc3BhdGNoUHRyOwotICB9Ci0KLSAgdm9pZCByZXNldEFsbFZhbHVlcygpIHsKLSAgICByZXNldFN0YXRlKDApOwotICAgIGJ1ZmZlclB0cl8gPSAwOwotICAgIGJ1ZmZlckxlbl8gPSAwOwotICAgIGlmIChldmVudF8pIHsKLSAgICAgIGRlbGV0ZShldmVudF8pOwotICAgIH0KLSAgICBldmVudF8gPSAwOwotICB9Ci0KLSAgcmVhZFN0YXRlKCkgewotICAgIGV2ZW50XyA9IDA7Ci0gICByZXNldEFsbFZhbHVlcygpOwotICB9Ci0KLSAgfnJlYWRTdGF0ZSgpIHsKLSAgICBpZiAoZXZlbnRfKSB7Ci0gICAgICBkZWxldGUoZXZlbnRfKTsKLSAgICB9Ci0gIH0KLQotfSByZWFkU3RhdGU7Ci0KLS8qKgotICogVEZpbGVUcmFuc3BvcnRCdWZmZXIgLSBidWZmZXIgY2xhc3MgdXNlZCBieSBURmlsZVRyYW5zcG9ydCBmb3IgcXVldWVpbmcgdXAgZXZlbnRzCi0gKiB0byBiZSB3cml0dGVuIHRvIGRpc2suICBTaG91bGQgYmUgdXNlZCBpbiB0aGUgZm9sbG93aW5nIHdheToKLSAqICAxKSBCdWZmZXIgY3JlYXRlZAotICogIDIpIEJ1ZmZlciB3cml0dGVuIHRvIChhZGRFdmVudCkKLSAqICAzKSBCdWZmZXIgcmVhZCBmcm9tIChnZXROZXh0KQotICogIDQpIEJ1ZmZlciByZXNldCAocmVzZXQpCi0gKiAgNSkgR28gYmFjayB0byAyLCBvciBkZXN0cm95IGJ1ZmZlcgotICoKLSAqIFRoZSBidWZmZXIgc2hvdWxkIG5ldmVyIGJlIHdyaXR0ZW4gdG8gYWZ0ZXIgaXQgaXMgcmVhZCBmcm9tLCB1bmxlc3MgaXQgaXMgcmVzZXQgZmlyc3QuCi0gKiBOb3RlOiBUaGUgYWJvdmUgcnVsZXMgYXJlIGVuZm9yY2VkIG1haW5seSBmb3IgZGVidWdnaW5nIGl0cyBzb2xlIGNsaWVudCBURmlsZVRyYW5zcG9ydAotICogICAgICAgd2hpY2ggdXNlcyB0aGUgYnVmZmVyIGluIHRoaXMgd2F5LgotICoKLSAqLwotY2xhc3MgVEZpbGVUcmFuc3BvcnRCdWZmZXIgewotICBwdWJsaWM6Ci0gICAgVEZpbGVUcmFuc3BvcnRCdWZmZXIodWludDMyX3Qgc2l6ZSk7Ci0gICAgflRGaWxlVHJhbnNwb3J0QnVmZmVyKCk7Ci0KLSAgICBib29sIGFkZEV2ZW50KGV2ZW50SW5mbyAqZXZlbnQpOwotICAgIGV2ZW50SW5mbyogZ2V0TmV4dCgpOwotICAgIHZvaWQgcmVzZXQoKTsKLSAgICBib29sIGlzRnVsbCgpOwotICAgIGJvb2wgaXNFbXB0eSgpOwotCi0gIHByaXZhdGU6Ci0gICAgVEZpbGVUcmFuc3BvcnRCdWZmZXIoKTsgLy8gc2hvdWxkIG5vdCBiZSB1c2VkCi0KLSAgICBlbnVtIG1vZGUgewotICAgICAgV1JJVEUsCi0gICAgICBSRUFECi0gICAgfTsKLSAgICBtb2RlIGJ1ZmZlck1vZGVfOwotCi0gICAgdWludDMyX3Qgd3JpdGVQb2ludF87Ci0gICAgdWludDMyX3QgcmVhZFBvaW50XzsKLSAgICB1aW50MzJfdCBzaXplXzsKLSAgICBldmVudEluZm8qKiBidWZmZXJfOwotfTsKLQotLyoqCi0gKiBBYnN0cmFjdCBpbnRlcmZhY2UgZm9yIHRyYW5zcG9ydHMgdXNlZCB0byByZWFkIGZpbGVzCi0gKi8KLWNsYXNzIFRGaWxlUmVhZGVyVHJhbnNwb3J0IDogdmlydHVhbCBwdWJsaWMgVFRyYW5zcG9ydCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIGludDMyX3QgZ2V0UmVhZFRpbWVvdXQoKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBzZXRSZWFkVGltZW91dChpbnQzMl90IHJlYWRUaW1lb3V0KSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCBnZXROdW1DaHVua3MoKSA9IDA7Ci0gIHZpcnR1YWwgdWludDMyX3QgZ2V0Q3VyQ2h1bmsoKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBzZWVrVG9DaHVuayhpbnQzMl90IGNodW5rKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBzZWVrVG9FbmQoKSA9IDA7Ci19OwotCi0vKioKLSAqIEFic3RyYWN0IGludGVyZmFjZSBmb3IgdHJhbnNwb3J0cyB1c2VkIHRvIHdyaXRlIGZpbGVzCi0gKi8KLWNsYXNzIFRGaWxlV3JpdGVyVHJhbnNwb3J0IDogdmlydHVhbCBwdWJsaWMgVFRyYW5zcG9ydCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHVpbnQzMl90IGdldENodW5rU2l6ZSgpID0gMDsKLSAgdmlydHVhbCB2b2lkIHNldENodW5rU2l6ZSh1aW50MzJfdCBjaHVua1NpemUpID0gMDsKLX07Ci0KLS8qKgotICogRmlsZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHRyYW5zcG9ydC4gUmVhZHMgYW5kIHdyaXRlcyBhcmUgZG9uZSB0byBhCi0gKiBmaWxlIG9uIGRpc2suCi0gKgotICovCi1jbGFzcyBURmlsZVRyYW5zcG9ydCA6IHB1YmxpYyBURmlsZVJlYWRlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFRGaWxlV3JpdGVyVHJhbnNwb3J0IHsKLSBwdWJsaWM6Ci0gIFRGaWxlVHJhbnNwb3J0KHN0ZDo6c3RyaW5nIHBhdGgsIGJvb2wgcmVhZE9ubHk9ZmFsc2UpOwotICB+VEZpbGVUcmFuc3BvcnQoKTsKLQotICAvLyBUT0RPOiB3aGF0IGlzIHRoZSBjb3JyZWN0IGJlaGF2aW91ciBmb3IgdGhpcz8KLSAgLy8gdGhlIGxvZyBmaWxlIGlzIGdlbmVyYWxseSBhbHdheXMgb3BlbgotICBib29sIGlzT3BlbigpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotICB2b2lkIGZsdXNoKCk7Ci0KLSAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0gIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotICBib29sIHBlZWsoKTsKLQotICAvLyBsb2ctZmlsZSBzcGVjaWZpYyBmdW5jdGlvbnMKLSAgdm9pZCBzZWVrVG9DaHVuayhpbnQzMl90IGNodW5rKTsKLSAgdm9pZCBzZWVrVG9FbmQoKTsKLSAgdWludDMyX3QgZ2V0TnVtQ2h1bmtzKCk7Ci0gIHVpbnQzMl90IGdldEN1ckNodW5rKCk7Ci0KLSAgLy8gZm9yIGNoYW5naW5nIHRoZSBvdXRwdXQgZmlsZQotICB2b2lkIHJlc2V0T3V0cHV0RmlsZShpbnQgZmQsIHN0ZDo6c3RyaW5nIGZpbGVuYW1lLCBpbnQ2NF90IG9mZnNldCk7Ci0KLSAgLy8gU2V0dGVyL0dldHRlciBmdW5jdGlvbnMgZm9yIHVzZXItY29udHJvbGxhYmxlIG9wdGlvbnMKLSAgdm9pZCBzZXRSZWFkQnVmZlNpemUodWludDMyX3QgcmVhZEJ1ZmZTaXplKSB7Ci0gICAgaWYgKHJlYWRCdWZmU2l6ZSkgewotICAgICAgcmVhZEJ1ZmZTaXplXyA9IHJlYWRCdWZmU2l6ZTsKLSAgICB9Ci0gIH0KLSAgdWludDMyX3QgZ2V0UmVhZEJ1ZmZTaXplKCkgewotICAgIHJldHVybiByZWFkQnVmZlNpemVfOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IGludDMyX3QgVEFJTF9SRUFEX1RJTUVPVVQgPSAtMTsKLSAgc3RhdGljIGNvbnN0IGludDMyX3QgTk9fVEFJTF9SRUFEX1RJTUVPVVQgPSAwOwotICB2b2lkIHNldFJlYWRUaW1lb3V0KGludDMyX3QgcmVhZFRpbWVvdXQpIHsKLSAgICByZWFkVGltZW91dF8gPSByZWFkVGltZW91dDsKLSAgfQotICBpbnQzMl90IGdldFJlYWRUaW1lb3V0KCkgewotICAgIHJldHVybiByZWFkVGltZW91dF87Ci0gIH0KLQotICB2b2lkIHNldENodW5rU2l6ZSh1aW50MzJfdCBjaHVua1NpemUpIHsKLSAgICBpZiAoY2h1bmtTaXplKSB7Ci0gICAgICBjaHVua1NpemVfID0gY2h1bmtTaXplOwotICAgIH0KLSAgfQotICB1aW50MzJfdCBnZXRDaHVua1NpemUoKSB7Ci0gICAgcmV0dXJuIGNodW5rU2l6ZV87Ci0gIH0KLQotICB2b2lkIHNldEV2ZW50QnVmZmVyU2l6ZSh1aW50MzJfdCBidWZmZXJTaXplKSB7Ci0gICAgaWYgKGJ1ZmZlckFuZFRocmVhZEluaXRpYWxpemVkXykgewotICAgICAgR2xvYmFsT3V0cHV0KCJDYW5ub3QgY2hhbmdlIHRoZSBidWZmZXIgc2l6ZSBhZnRlciB3cml0ZXIgdGhyZWFkIHN0YXJ0ZWQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZXZlbnRCdWZmZXJTaXplXyA9IGJ1ZmZlclNpemU7Ci0gIH0KLQotICB1aW50MzJfdCBnZXRFdmVudEJ1ZmZlclNpemUoKSB7Ci0gICAgcmV0dXJuIGV2ZW50QnVmZmVyU2l6ZV87Ci0gIH0KLQotICB2b2lkIHNldEZsdXNoTWF4VXModWludDMyX3QgZmx1c2hNYXhVcykgewotICAgIGlmIChmbHVzaE1heFVzKSB7Ci0gICAgICBmbHVzaE1heFVzXyA9IGZsdXNoTWF4VXM7Ci0gICAgfQotICB9Ci0gIHVpbnQzMl90IGdldEZsdXNoTWF4VXMoKSB7Ci0gICAgcmV0dXJuIGZsdXNoTWF4VXNfOwotICB9Ci0KLSAgdm9pZCBzZXRGbHVzaE1heEJ5dGVzKHVpbnQzMl90IGZsdXNoTWF4Qnl0ZXMpIHsKLSAgICBpZiAoZmx1c2hNYXhCeXRlcykgewotICAgICAgZmx1c2hNYXhCeXRlc18gPSBmbHVzaE1heEJ5dGVzOwotICAgIH0KLSAgfQotICB1aW50MzJfdCBnZXRGbHVzaE1heEJ5dGVzKCkgewotICAgIHJldHVybiBmbHVzaE1heEJ5dGVzXzsKLSAgfQotCi0gIHZvaWQgc2V0TWF4RXZlbnRTaXplKHVpbnQzMl90IG1heEV2ZW50U2l6ZSkgewotICAgIG1heEV2ZW50U2l6ZV8gPSBtYXhFdmVudFNpemU7Ci0gIH0KLSAgdWludDMyX3QgZ2V0TWF4RXZlbnRTaXplKCkgewotICAgIHJldHVybiBtYXhFdmVudFNpemVfOwotICB9Ci0KLSAgdm9pZCBzZXRNYXhDb3JydXB0ZWRFdmVudHModWludDMyX3QgbWF4Q29ycnVwdGVkRXZlbnRzKSB7Ci0gICAgbWF4Q29ycnVwdGVkRXZlbnRzXyA9IG1heENvcnJ1cHRlZEV2ZW50czsKLSAgfQotICB1aW50MzJfdCBnZXRNYXhDb3JydXB0ZWRFdmVudHMoKSB7Ci0gICAgcmV0dXJuIG1heENvcnJ1cHRlZEV2ZW50c187Ci0gIH0KLQotICB2b2lkIHNldEVvZlNsZWVwVGltZVVzKHVpbnQzMl90IGVvZlNsZWVwVGltZSkgewotICAgIGlmIChlb2ZTbGVlcFRpbWUpIHsKLSAgICAgIGVvZlNsZWVwVGltZV8gPSBlb2ZTbGVlcFRpbWU7Ci0gICAgfQotICB9Ci0gIHVpbnQzMl90IGdldEVvZlNsZWVwVGltZVVzKCkgewotICAgIHJldHVybiBlb2ZTbGVlcFRpbWVfOwotICB9Ci0KLSAgLyoKLSAgICogT3ZlcnJpZGUgVFRyYW5zcG9ydCAqX3ZpcnQoKSBmdW5jdGlvbnMgdG8gaW52b2tlIG91ciBpbXBsZW1lbnRhdGlvbnMuCi0gICAqIFdlIGNhbm5vdCB1c2UgVFZpcnR1YWxUcmFuc3BvcnQgdG8gcHJvdmlkZSB0aGVzZSwgc2luY2Ugd2UgbmVlZCB0byBpbmhlcml0Ci0gICAqIHZpcnR1YWxseSBmcm9tIFRUcmFuc3BvcnQuCi0gICAqLwotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHJldHVybiB0aGlzLT5yZWFkKGJ1ZiwgbGVuKTsKLSAgfQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRBbGxfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHJldHVybiB0aGlzLT5yZWFkQWxsKGJ1ZiwgbGVuKTsKLSAgfQotICB2aXJ0dWFsIHZvaWQgd3JpdGVfdmlydChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHRoaXMtPndyaXRlKGJ1ZiwgbGVuKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gaGVscGVyIGZ1bmN0aW9ucyBmb3Igd3JpdGluZyB0byBhIGZpbGUKLSAgdm9pZCBlbnF1ZXVlRXZlbnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBldmVudExlbik7Ci0gIGJvb2wgc3dhcEV2ZW50QnVmZmVycyhzdHJ1Y3QgdGltZXNwZWMqIGRlYWRsaW5lKTsKLSAgYm9vbCBpbml0QnVmZmVyQW5kV3JpdGVUaHJlYWQoKTsKLQotICAvLyBjb250cm9sIGZvciB3cml0ZXIgdGhyZWFkCi0gIHN0YXRpYyB2b2lkKiBzdGFydFdyaXRlclRocmVhZCh2b2lkKiBwdHIpIHsKLSAgICAoKChURmlsZVRyYW5zcG9ydCopcHRyKS0+d3JpdGVyVGhyZWFkKCkpOwotICAgIHJldHVybiAwOwotICB9Ci0gIHZvaWQgd3JpdGVyVGhyZWFkKCk7Ci0KLSAgLy8gaGVscGVyIGZ1bmN0aW9ucyBmb3IgcmVhZGluZyBmcm9tIGEgZmlsZQotICBldmVudEluZm8qIHJlYWRFdmVudCgpOwotCi0gIC8vIGV2ZW50IGNvcnJ1cHRpb24tcmVsYXRlZCBmdW5jdGlvbnMKLSAgYm9vbCBpc0V2ZW50Q29ycnVwdGVkKCk7Ci0gIHZvaWQgcGVyZm9ybVJlY292ZXJ5KCk7Ci0KLSAgLy8gVXRpbGl0eSBmdW5jdGlvbnMKLSAgdm9pZCBvcGVuTG9nRmlsZSgpOwotICB2b2lkIGdldE5leHRGbHVzaFRpbWUoc3RydWN0IHRpbWVzcGVjKiB0c19uZXh0X2ZsdXNoKTsKLQotICAvLyBDbGFzcyB2YXJpYWJsZXMKLSAgcmVhZFN0YXRlIHJlYWRTdGF0ZV87Ci0gIHVpbnQ4X3QqIHJlYWRCdWZmXzsKLSAgZXZlbnRJbmZvKiBjdXJyZW50RXZlbnRfOwotCi0gIHVpbnQzMl90IHJlYWRCdWZmU2l6ZV87Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX1JFQURfQlVGRl9TSVpFID0gMSAqIDEwMjQgKiAxMDI0OwotCi0gIGludDMyX3QgcmVhZFRpbWVvdXRfOwotICBzdGF0aWMgY29uc3QgaW50MzJfdCBERUZBVUxUX1JFQURfVElNRU9VVF9NUyA9IDIwMDsKLQotICAvLyBzaXplIG9mIGNodW5rcyB0aGF0IGZpbGUgd2lsbCBiZSBzcGxpdCB1cCBpbnRvCi0gIHVpbnQzMl90IGNodW5rU2l6ZV87Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX0NIVU5LX1NJWkUgPSAxNiAqIDEwMjQgKiAxMDI0OwotCi0gIC8vIHNpemUgb2YgZXZlbnQgYnVmZmVycwotICB1aW50MzJfdCBldmVudEJ1ZmZlclNpemVfOwotICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9FVkVOVF9CVUZGRVJfU0laRSA9IDEwMDAwOwotCi0gIC8vIG1heCBudW1iZXIgb2YgbWljcm9zZWNvbmRzIHRoYXQgY2FuIHBhc3Mgd2l0aG91dCBmbHVzaGluZwotICB1aW50MzJfdCBmbHVzaE1heFVzXzsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfRkxVU0hfTUFYX1VTID0gMzAwMDAwMDsKLQotICAvLyBtYXggbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHdyaXR0ZW4gd2l0aG91dCBmbHVzaGluZwotICB1aW50MzJfdCBmbHVzaE1heEJ5dGVzXzsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfRkxVU0hfTUFYX0JZVEVTID0gMTAwMCAqIDEwMjQ7Ci0KLSAgLy8gbWF4IGV2ZW50IHNpemUKLSAgdWludDMyX3QgbWF4RXZlbnRTaXplXzsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfTUFYX0VWRU5UX1NJWkUgPSAwOwotCi0gIC8vIG1heCBudW1iZXIgb2YgY29ycnVwdGVkIGV2ZW50cyBwZXIgY2h1bmsKLSAgdWludDMyX3QgbWF4Q29ycnVwdGVkRXZlbnRzXzsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfTUFYX0NPUlJVUFRFRF9FVkVOVFMgPSAwOwotCi0gIC8vIHNsZWVwIGR1cmF0aW9uIHdoZW4gRU9GIGlzIGhpdAotICB1aW50MzJfdCBlb2ZTbGVlcFRpbWVfOwotICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9FT0ZfU0xFRVBfVElNRV9VUyA9IDUwMCAqIDEwMDA7Ci0KLSAgLy8gc2xlZXAgZHVyYXRpb24gd2hlbiBhIGNvcnJ1cHRlZCBldmVudCBpcyBlbmNvdW50ZXJlZAotICB1aW50MzJfdCBjb3JydXB0ZWRFdmVudFNsZWVwVGltZV87Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX0NPUlJVUFRFRF9TTEVFUF9USU1FX1VTID0gMSAqIDEwMDAgKiAxMDAwOwotCi0gIC8vIHNsZWVwIGR1cmF0aW9uIGluIHNlY29uZHMgd2hlbiBhbiBJTyBlcnJvciBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgd3JpdGVyIHRocmVhZAotICB1aW50MzJfdCB3cml0ZXJUaHJlYWRJT0Vycm9yU2xlZXBUaW1lXzsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfV1JJVEVSX1RIUkVBRF9TTEVFUF9USU1FX1VTID0gNjAgKiAxMDAwICogMTAwMDsKLQotICAvLyB3cml0ZXIgdGhyZWFkIGlkCi0gIHB0aHJlYWRfdCB3cml0ZXJUaHJlYWRJZF87Ci0KLSAgLy8gYnVmZmVycyB0byBob2xkIGRhdGEgYmVmb3JlIGl0IGlzIGZsdXNoZWQuIEVhY2ggZWxlbWVudCBvZiB0aGUgYnVmZmVyIHN0b3JlcyBhIG1zZyB0aGF0Ci0gIC8vIG5lZWRzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGZpbGUuICBUaGUgYnVmZmVycyBhcmUgc3dhcHBlZCBieSB0aGUgd3JpdGVyIHRocmVhZC4KLSAgVEZpbGVUcmFuc3BvcnRCdWZmZXIgKmRlcXVldWVCdWZmZXJfOwotICBURmlsZVRyYW5zcG9ydEJ1ZmZlciAqZW5xdWV1ZUJ1ZmZlcl87Ci0KLSAgLy8gY29uZGl0aW9ucyB1c2VkIHRvIGJsb2NrIHdoZW4gdGhlIGJ1ZmZlciBpcyBmdWxsIG9yIGVtcHR5Ci0gIHB0aHJlYWRfY29uZF90IG5vdEZ1bGxfLCBub3RFbXB0eV87Ci0gIHZvbGF0aWxlIGJvb2wgY2xvc2luZ187Ci0KLSAgLy8gVG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIHRoZSBidWZmZXIgaGFzIGJlZW4gZmx1c2hlZAotICBwdGhyZWFkX2NvbmRfdCBmbHVzaGVkXzsKLSAgdm9sYXRpbGUgYm9vbCBmb3JjZUZsdXNoXzsKLQotICAvLyBNdXRleCB0aGF0IGlzIGdyYWJiZWQgd2hlbiBlbnF1ZXVlaW5nIGFuZCBzd2FwcGluZyB0aGUgcmVhZC93cml0ZSBidWZmZXJzCi0gIHB0aHJlYWRfbXV0ZXhfdCBtdXRleF87Ci0KLSAgLy8gRmlsZSBpbmZvcm1hdGlvbgotICBzdGQ6OnN0cmluZyBmaWxlbmFtZV87Ci0gIGludCBmZF87Ci0KLSAgLy8gV2hldGhlciB0aGUgd3JpdGVyIHRocmVhZCBhbmQgYnVmZmVycyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQKLSAgYm9vbCBidWZmZXJBbmRUaHJlYWRJbml0aWFsaXplZF87Ci0KLSAgLy8gT2Zmc2V0IHdpdGhpbiB0aGUgZmlsZQotICBvZmZfdCBvZmZzZXRfOwotCi0gIC8vIGV2ZW50IGNvcnJ1cHRpb24gaW5mb3JtYXRpb24KLSAgdWludDMyX3QgbGFzdEJhZENodW5rXzsKLSAgdWludDMyX3QgbnVtQ29ycnVwdGVkRXZlbnRzSW5DaHVua187Ci0KLSAgYm9vbCByZWFkT25seV87Ci19OwotCi0vLyBFeGNlcHRpb24gdGhyb3duIHdoZW4gRU9GIGlzIGhpdAotY2xhc3MgVEVPRkV4Y2VwdGlvbiA6IHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSBwdWJsaWM6Ci0gIFRFT0ZFeGNlcHRpb24oKToKLSAgICBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKSB7fTsKLX07Ci0KLQotLy8gd3JhcHBlciBjbGFzcyB0byBwcm9jZXNzIGV2ZW50cyBmcm9tIGEgZmlsZSBjb250YWluaW5nIHRocmlmdCBldmVudHMKLWNsYXNzIFRGaWxlUHJvY2Vzc29yIHsKLSBwdWJsaWM6Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciB0aGF0IGRlZmF1bHRzIG91dHB1dCB0cmFuc3BvcnQgdG8gbnVsbCB0cmFuc3BvcnQKLSAgICoKLSAgICogQHBhcmFtIHByb2Nlc3NvciBwcm9jZXNzZXMgbG9nLWZpbGUgZXZlbnRzCi0gICAqIEBwYXJhbSBwcm90b2NvbEZhY3RvcnkgcHJvdG9jb2wgZmFjdG9yeQotICAgKiBAcGFyYW0gaW5wdXRUcmFuc3BvcnQgZmlsZSB0cmFuc3BvcnQKLSAgICovCi0gIFRGaWxlUHJvY2Vzc29yKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQpOwotCi0gIFRGaWxlUHJvY2Vzc29yKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0KTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHByb2Nlc3NvciBwcm9jZXNzZXMgbG9nLWZpbGUgZXZlbnRzCi0gICAqIEBwYXJhbSBwcm90b2NvbEZhY3RvcnkgcHJvdG9jb2wgZmFjdG9yeQotICAgKiBAcGFyYW0gaW5wdXRUcmFuc3BvcnQgaW5wdXQgZmlsZSB0cmFuc3BvcnQKLSAgICogQHBhcmFtIG91dHB1dCBvdXRwdXQgdHJhbnNwb3J0Ci0gICAqLwotICBURmlsZVByb2Nlc3Nvcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnQpOwotCi0gIC8qKgotICAgKiBwcm9jZXNzZXMgZXZlbnRzIGZyb20gdGhlIGZpbGUKLSAgICoKLSAgICogQHBhcmFtIG51bUV2ZW50cyBudW1iZXIgb2YgZXZlbnRzIHRvIHByb2Nlc3MgKDAgZm9yIHVubGltaXRlZCkKLSAgICogQHBhcmFtIHRhaWwgdGFpbHMgdGhlIGZpbGUgaWYgdHJ1ZQotICAgKi8KLSAgdm9pZCBwcm9jZXNzKHVpbnQzMl90IG51bUV2ZW50cywgYm9vbCB0YWlsKTsKLQotICAvKioKLSAgICogcHJvY2VzcyBldmVudHMgdW50aWwgdGhlIGVuZCBvZiB0aGUgY2h1bmsKLSAgICoKLSAgICovCi0gIHZvaWQgcHJvY2Vzc0NodW5rKCk7Ci0KLSBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydF87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dHB1dFRyYW5zcG9ydF87Ci19OwotCi0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ci0KLSNlbmRpZiAvLyBfVEhSSUZUX1RSQU5TUE9SVF9URklMRVRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9USHR0cENsaWVudC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ODY0Y2UuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8Ym9vc3QvYWxnb3JpdGhtL3N0cmluZy5ocHA+Ci0KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEh0dHBDbGllbnQuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNvY2tldC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi1USHR0cENsaWVudDo6VEh0dHBDbGllbnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCBzdGQ6OnN0cmluZyBob3N0LCBzdGQ6OnN0cmluZyBwYXRoKSA6Ci0gIFRIdHRwVHJhbnNwb3J0KHRyYW5zcG9ydCksIGhvc3RfKGhvc3QpLCBwYXRoXyhwYXRoKSB7Ci19Ci0KLVRIdHRwQ2xpZW50OjpUSHR0cENsaWVudChzdHJpbmcgaG9zdCwgaW50IHBvcnQsIHN0cmluZyBwYXRoKSA6Ci0gIFRIdHRwVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUU29ja2V0KGhvc3QsIHBvcnQpKSksIGhvc3RfKGhvc3QpLCBwYXRoXyhwYXRoKSB7Ci19Ci0KLVRIdHRwQ2xpZW50Ojp+VEh0dHBDbGllbnQoKSB7fQotCi12b2lkIFRIdHRwQ2xpZW50OjpwYXJzZUhlYWRlcihjaGFyKiBoZWFkZXIpIHsKLSAgY2hhciogY29sb24gPSBzdHJjaHIoaGVhZGVyLCAnOicpOwotICBpZiAoY29sb24gPT0gTlVMTCkgewotICAgIHJldHVybjsKLSAgfQotICBjaGFyKiB2YWx1ZSA9IGNvbG9uKzE7Ci0KLSAgaWYgKGJvb3N0Ojppc3RhcnRzX3dpdGgoaGVhZGVyLCAiVHJhbnNmZXItRW5jb2RpbmciKSkgewotICAgIGlmIChib29zdDo6aWVuZHNfd2l0aCh2YWx1ZSwgImNodW5rZWQiKSkgewotICAgICAgY2h1bmtlZF8gPSB0cnVlOwotICAgIH0KLSAgfSBlbHNlIGlmIChib29zdDo6aXN0YXJ0c193aXRoKGhlYWRlciwgIkNvbnRlbnQtTGVuZ3RoIikpIHsgCi0gICAgY2h1bmtlZF8gPSBmYWxzZTsKLSAgICBjb250ZW50TGVuZ3RoXyA9IGF0b2kodmFsdWUpOwotICB9Ci19Ci0KLWJvb2wgVEh0dHBDbGllbnQ6OnBhcnNlU3RhdHVzTGluZShjaGFyKiBzdGF0dXMpIHsKLSAgY2hhciogaHR0cCA9IHN0YXR1czsKLQotICBjaGFyKiBjb2RlID0gc3RyY2hyKGh0dHAsICcgJyk7Ci0gIGlmIChjb2RlID09IE5VTEwpIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZygiQmFkIFN0YXR1czogIikgKyBzdGF0dXMpOwotICB9Ci0KLSAgKmNvZGUgPSAnXDAnOwotICB3aGlsZSAoKihjb2RlKyspID09ICcgJykge307Ci0KLSAgY2hhciogbXNnID0gc3RyY2hyKGNvZGUsICcgJyk7Ci0gIGlmIChtc2cgPT0gTlVMTCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nKCJCYWQgU3RhdHVzOiAiKSArIHN0YXR1cyk7Ci0gIH0KLSAgKm1zZyA9ICdcMCc7Ci0KLSAgaWYgKHN0cmNtcChjb2RlLCAiMjAwIikgPT0gMCkgewotICAgIC8vIEhUVFAgMjAwID0gT0ssIHdlIGdvdCB0aGUgcmVzcG9uc2UKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIGlmIChzdHJjbXAoY29kZSwgIjEwMCIpID09IDApIHsKLSAgICAvLyBIVFRQIDEwMCA9IGNvbnRpbnVlLCBqdXN0IGtlZXAgcmVhZGluZwotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZygiQmFkIFN0YXR1czogIikgKyBzdGF0dXMpOwotICB9Ci19Ci0KLXZvaWQgVEh0dHBDbGllbnQ6OmZsdXNoKCkgewotICAvLyBGZXRjaCB0aGUgY29udGVudHMgb2YgdGhlIHdyaXRlIGJ1ZmZlcgotICB1aW50OF90KiBidWY7Ci0gIHVpbnQzMl90IGxlbjsKLSAgd3JpdGVCdWZmZXJfLmdldEJ1ZmZlcigmYnVmLCAmbGVuKTsKLQotICAvLyBDb25zdHJ1Y3QgdGhlIEhUVFAgaGVhZGVyCi0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBoOwotICBoIDw8Ci0gICAgIlBPU1QgIiA8PCBwYXRoXyA8PCAiIEhUVFAvMS4xIiA8PCBDUkxGIDw8Ci0gICAgIkhvc3Q6ICIgPDwgaG9zdF8gPDwgQ1JMRiA8PAotICAgICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0IiA8PCBDUkxGIDw8Ci0gICAgIkNvbnRlbnQtTGVuZ3RoOiAiIDw8IGxlbiA8PCBDUkxGIDw8Ci0gICAgIkFjY2VwdDogYXBwbGljYXRpb24veC10aHJpZnQiIDw8IENSTEYgPDwKLSAgICAiVXNlci1BZ2VudDogVGhyaWZ0LyIgPDwgVkVSU0lPTiA8PCAiIChDKysvVEh0dHBDbGllbnQpIiA8PCBDUkxGIDw8Ci0gICAgQ1JMRjsKLSAgc3RyaW5nIGhlYWRlciA9IGguc3RyKCk7Ci0KLSAgLy8gV3JpdGUgdGhlIGhlYWRlciwgdGhlbiB0aGUgZGF0YSwgdGhlbiBmbHVzaAotICB0cmFuc3BvcnRfLT53cml0ZSgoY29uc3QgdWludDhfdCopaGVhZGVyLmNfc3RyKCksIGhlYWRlci5zaXplKCkpOwotICB0cmFuc3BvcnRfLT53cml0ZShidWYsIGxlbik7Ci0gIHRyYW5zcG9ydF8tPmZsdXNoKCk7Ci0KLSAgLy8gUmVzZXQgdGhlIGJ1ZmZlciBhbmQgaGVhZGVyIHZhcmlhYmxlcwotICB3cml0ZUJ1ZmZlcl8ucmVzZXRCdWZmZXIoKTsKLSAgcmVhZEhlYWRlcnNfID0gdHJ1ZTsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9USHR0cENsaWVudC5oIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MjA2M2QuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBDTElFTlRfSF8KLSNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBDTElFTlRfSF8gMQotCi0jaW5jbHVkZSA8dHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0Lmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLWNsYXNzIFRIdHRwQ2xpZW50IDogcHVibGljIFRIdHRwVHJhbnNwb3J0IHsKLSBwdWJsaWM6Ci0gIFRIdHRwQ2xpZW50KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgc3RkOjpzdHJpbmcgaG9zdCwgc3RkOjpzdHJpbmcgcGF0aD0iIik7Ci0KLSAgVEh0dHBDbGllbnQoc3RkOjpzdHJpbmcgaG9zdCwgaW50IHBvcnQsIHN0ZDo6c3RyaW5nIHBhdGg9IiIpOwotCi0gIHZpcnR1YWwgflRIdHRwQ2xpZW50KCk7Ci0KLSAgdmlydHVhbCB2b2lkIGZsdXNoKCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0KLSAgc3RkOjpzdHJpbmcgaG9zdF87Ci0gIHN0ZDo6c3RyaW5nIHBhdGhfOwotCi0gIHZpcnR1YWwgdm9pZCBwYXJzZUhlYWRlcihjaGFyKiBoZWFkZXIpOwotICB2aXJ0dWFsIGJvb2wgcGFyc2VTdGF0dXNMaW5lKGNoYXIqIHN0YXR1cyk7Ci0KLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQQ0xJRU5UX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY2YzBmNi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLQotI2luY2x1ZGUgPHRyYW5zcG9ydC9USHR0cFNlcnZlci5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU29ja2V0Lmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLVRIdHRwU2VydmVyOjpUSHR0cFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIDoKLSAgVEh0dHBUcmFuc3BvcnQodHJhbnNwb3J0KSB7Ci19Ci0KLVRIdHRwU2VydmVyOjp+VEh0dHBTZXJ2ZXIoKSB7fQotCi12b2lkIFRIdHRwU2VydmVyOjpwYXJzZUhlYWRlcihjaGFyKiBoZWFkZXIpIHsKLSAgY2hhciogY29sb24gPSBzdHJjaHIoaGVhZGVyLCAnOicpOwotICBpZiAoY29sb24gPT0gTlVMTCkgewotICAgIHJldHVybjsKLSAgfQotICB1aW50MzJfdCBzeiA9IGNvbG9uIC0gaGVhZGVyOwotICBjaGFyKiB2YWx1ZSA9IGNvbG9uKzE7Ci0KLSAgaWYgKHN0cm5jbXAoaGVhZGVyLCAiVHJhbnNmZXItRW5jb2RpbmciLCBzeikgPT0gMCkgewotICAgIGlmIChzdHJzdHIodmFsdWUsICJjaHVua2VkIikgIT0gTlVMTCkgewotICAgICAgY2h1bmtlZF8gPSB0cnVlOwotICAgIH0KLSAgfSBlbHNlIGlmIChzdHJuY21wKGhlYWRlciwgIkNvbnRlbnQtTGVuZ3RoIiwgc3opID09IDApIHsKLSAgICBjaHVua2VkXyA9IGZhbHNlOwotICAgIGNvbnRlbnRMZW5ndGhfID0gYXRvaSh2YWx1ZSk7Ci0gIH0KLX0KLQotYm9vbCBUSHR0cFNlcnZlcjo6cGFyc2VTdGF0dXNMaW5lKGNoYXIqIHN0YXR1cykgewotICBjaGFyKiBtZXRob2QgPSBzdGF0dXM7Ci0KLSAgY2hhciogcGF0aCA9IHN0cmNocihtZXRob2QsICcgJyk7Ci0gIGlmIChwYXRoID09IE5VTEwpIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZygiQmFkIFN0YXR1czogIikgKyBzdGF0dXMpOwotICB9Ci0KLSAgKnBhdGggPSAnXDAnOwotICB3aGlsZSAoKigrK3BhdGgpID09ICcgJykge307Ci0KLSAgY2hhciogaHR0cCA9IHN0cmNocihwYXRoLCAnICcpOwotICBpZiAoaHR0cCA9PSBOVUxMKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcoIkJhZCBTdGF0dXM6ICIpICsgc3RhdHVzKTsKLSAgfQotICAqaHR0cCA9ICdcMCc7Ci0KLSAgaWYgKHN0cmNtcChtZXRob2QsICJQT1NUIikgPT0gMCkgewotICAgIC8vIFBPU1QgbWV0aG9kIG9rLCBsb29raW5nIGZvciBjb250ZW50LgotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nKCJCYWQgU3RhdHVzICh1bnN1cHBvcnRlZCBtZXRob2QpOiAiKSArIHN0YXR1cyk7Ci19Ci0KLXZvaWQgVEh0dHBTZXJ2ZXI6OmZsdXNoKCkgewotICAvLyBGZXRjaCB0aGUgY29udGVudHMgb2YgdGhlIHdyaXRlIGJ1ZmZlcgotICB1aW50OF90KiBidWY7Ci0gIHVpbnQzMl90IGxlbjsKLSAgd3JpdGVCdWZmZXJfLmdldEJ1ZmZlcigmYnVmLCAmbGVuKTsKLQotICAvLyBDb25zdHJ1Y3QgdGhlIEhUVFAgaGVhZGVyCi0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBoOwotICBoIDw8Ci0gICAgIkhUVFAvMS4xIDIwMCBPSyIgPDwgQ1JMRiA8PAotICAgICJEYXRlOiAiIDw8IGdldFRpbWVSRkMxMTIzKCkgPDwgQ1JMRiA8PAotICAgICJTZXJ2ZXI6IFRocmlmdC8iIDw8IFZFUlNJT04gPDwgQ1JMRiA8PAotICAgICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0IiA8PCBDUkxGIDw8Ci0gICAgIkNvbnRlbnQtTGVuZ3RoOiAiIDw8IGxlbiA8PCBDUkxGIDw8Ci0gICAgIkNvbm5lY3Rpb246IEtlZXAtQWxpdmUiIDw8IENSTEYgPDwKLSAgICBDUkxGOwotICBzdHJpbmcgaGVhZGVyID0gaC5zdHIoKTsKLQotICAvLyBXcml0ZSB0aGUgaGVhZGVyLCB0aGVuIHRoZSBkYXRhLCB0aGVuIGZsdXNoCi0gIHRyYW5zcG9ydF8tPndyaXRlKChjb25zdCB1aW50OF90KiloZWFkZXIuY19zdHIoKSwgaGVhZGVyLnNpemUoKSk7Ci0gIHRyYW5zcG9ydF8tPndyaXRlKGJ1ZiwgbGVuKTsKLSAgdHJhbnNwb3J0Xy0+Zmx1c2goKTsKLQotICAvLyBSZXNldCB0aGUgYnVmZmVyIGFuZCBoZWFkZXIgdmFyaWFibGVzCi0gIHdyaXRlQnVmZmVyXy5yZXNldEJ1ZmZlcigpOwotICByZWFkSGVhZGVyc18gPSB0cnVlOwotfQotCi1zdGQ6OnN0cmluZyBUSHR0cFNlcnZlcjo6Z2V0VGltZVJGQzExMjMoKQotewotICBzdGF0aWMgY29uc3QgY2hhciogRGF5c1tdID0geyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQifTsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIE1vbnRoc1tdID0geyJKYW4iLCJGZWIiLCJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwiQXVnIiwgIlNlcCIsICJPY3QiLCJOb3YiLCJEZWMifTsKLSAgY2hhciBidWZmWzEyOF07Ci0gIHRpbWVfdCB0ID0gdGltZShOVUxMKTsKLSAgdG0qIGJyb2tlbl90ID0gZ210aW1lKCZ0KTsKLQotICBzcHJpbnRmKGJ1ZmYsIiVzLCAlZCAlcyAlZCAlZDolZDolZCBHTVQiLAotICAgICAgICAgIERheXNbYnJva2VuX3QtPnRtX3dkYXldLCBicm9rZW5fdC0+dG1fbWRheSwgTW9udGhzW2Jyb2tlbl90LT50bV9tb25dLAotICAgICAgICAgIGJyb2tlbl90LT50bV95ZWFyICsgMTkwMCwKLSAgICAgICAgICBicm9rZW5fdC0+dG1faG91cixicm9rZW5fdC0+dG1fbWluLGJyb2tlbl90LT50bV9zZWMpOwotICByZXR1cm4gc3RkOjpzdHJpbmcoYnVmZik7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9USHR0cFNlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTIzNDA4Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9USHR0cFNlcnZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQU0VSVkVSX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQU0VSVkVSX0hfIDEKLQotI2luY2x1ZGUgPHRyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi1jbGFzcyBUSHR0cFNlcnZlciA6IHB1YmxpYyBUSHR0cFRyYW5zcG9ydCB7Ci0gcHVibGljOgotICBUSHR0cFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpOwotCi0gIHZpcnR1YWwgflRIdHRwU2VydmVyKCk7Ci0KLSAgdmlydHVhbCB2b2lkIGZsdXNoKCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0KLSAgdm9pZCByZWFkSGVhZGVycygpOwotICB2aXJ0dWFsIHZvaWQgcGFyc2VIZWFkZXIoY2hhciogaGVhZGVyKTsKLSAgdmlydHVhbCBib29sIHBhcnNlU3RhdHVzTGluZShjaGFyKiBzdGF0dXMpOwotICBzdGQ6OnN0cmluZyBnZXRUaW1lUkZDMTEyMygpOwotCi19OwotCi0vKioKLSAqIFdyYXBzIGEgdHJhbnNwb3J0IGludG8gSFRUUCBwcm90b2NvbAotICovCi1jbGFzcyBUSHR0cFNlcnZlclRyYW5zcG9ydEZhY3RvcnkgOiBwdWJsaWMgVFRyYW5zcG9ydEZhY3RvcnkgewotIHB1YmxpYzoKLSAgVEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5KCkge30KLQotICB2aXJ0dWFsIH5USHR0cFNlcnZlclRyYW5zcG9ydEZhY3RvcnkoKSB7fQotCi0gIC8qKgotICAgKiBXcmFwcyB0aGUgdHJhbnNwb3J0IGludG8gYSBidWZmZXJlZCBvbmUuCi0gICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVEh0dHBTZXJ2ZXIodHJhbnMpKTsKLSAgfQotCi19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9USFRUUFNFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmNwcCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZmUyMDcuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotLy8gWWVhaCwgeWVhaCwgaGFja3kgdG8gcHV0IHRoZXNlIGhlcmUsIEkga25vdy4KLWNvbnN0IGNoYXIqIFRIdHRwVHJhbnNwb3J0OjpDUkxGID0gIlxyXG4iOwotY29uc3QgaW50IFRIdHRwVHJhbnNwb3J0OjpDUkxGX0xFTiA9IDI7Ci0KLVRIdHRwVHJhbnNwb3J0OjpUSHR0cFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIDoKLSAgdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAotICByZWFkSGVhZGVyc18odHJ1ZSksCi0gIGNodW5rZWRfKGZhbHNlKSwKLSAgY2h1bmtlZERvbmVfKGZhbHNlKSwKLSAgY2h1bmtTaXplXygwKSwKLSAgY29udGVudExlbmd0aF8oMCksCi0gIGh0dHBCdWZfKE5VTEwpLAotICBodHRwUG9zXygwKSwKLSAgaHR0cEJ1Zkxlbl8oMCksCi0gIGh0dHBCdWZTaXplXygxMDI0KSB7Ci0gIGluaXQoKTsKLX0KLQotdm9pZCBUSHR0cFRyYW5zcG9ydDo6aW5pdCgpIHsKLSAgaHR0cEJ1Zl8gPSAoY2hhciopc3RkOjptYWxsb2MoaHR0cEJ1ZlNpemVfKzEpOwotICBpZiAoaHR0cEJ1Zl8gPT0gTlVMTCkgewotICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7Ci0gIH0KLSAgaHR0cEJ1Zl9baHR0cEJ1Zkxlbl9dID0gJ1wwJzsKLX0KLQotVEh0dHBUcmFuc3BvcnQ6On5USHR0cFRyYW5zcG9ydCgpIHsKLSAgaWYgKGh0dHBCdWZfICE9IE5VTEwpIHsKLSAgICBzdGQ6OmZyZWUoaHR0cEJ1Zl8pOwotICB9Ci19Ci0KLXVpbnQzMl90IFRIdHRwVHJhbnNwb3J0OjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIGlmIChyZWFkQnVmZmVyXy5hdmFpbGFibGVfcmVhZCgpID09IDApIHsKLSAgICByZWFkQnVmZmVyXy5yZXNldEJ1ZmZlcigpOwotICAgIHVpbnQzMl90IGdvdCA9IHJlYWRNb3JlRGF0YSgpOwotICAgIGlmIChnb3QgPT0gMCkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZWFkQnVmZmVyXy5yZWFkKGJ1ZiwgbGVuKTsKLX0KLQotdWludDMyX3QgVEh0dHBUcmFuc3BvcnQ6OnJlYWRFbmQoKSB7Ci0gIC8vIFJlYWQgYW55IHBlbmRpbmcgY2h1bmtlZCBkYXRhIChmb290ZXJzIGV0Yy4pCi0gIGlmIChjaHVua2VkXykgewotICAgIHdoaWxlICghY2h1bmtlZERvbmVfKSB7Ci0gICAgICByZWFkQ2h1bmtlZCgpOwotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVEh0dHBUcmFuc3BvcnQ6OnJlYWRNb3JlRGF0YSgpIHsKLSAgdWludDMyX3Qgc2l6ZTsKLQotICAvLyBHZXQgbW9yZSBkYXRhIQotICByZWZpbGwoKTsKLQotICBpZiAocmVhZEhlYWRlcnNfKSB7Ci0gICAgcmVhZEhlYWRlcnMoKTsKLSAgfQotCi0gIGlmIChjaHVua2VkXykgewotICAgIHNpemUgPSByZWFkQ2h1bmtlZCgpOwotICB9IGVsc2UgewotICAgIHNpemUgPSByZWFkQ29udGVudChjb250ZW50TGVuZ3RoXyk7Ci0gIH0KLSAgcmVhZEhlYWRlcnNfID0gdHJ1ZTsKLSAgcmV0dXJuIHNpemU7Ci19Ci0KLXVpbnQzMl90IFRIdHRwVHJhbnNwb3J0OjpyZWFkQ2h1bmtlZCgpIHsKLSAgdWludDMyX3QgbGVuZ3RoID0gMDsKLQotICBjaGFyKiBsaW5lID0gcmVhZExpbmUoKTsKLSAgdWludDMyX3QgY2h1bmtTaXplID0gcGFyc2VDaHVua1NpemUobGluZSk7Ci0gIGlmIChjaHVua1NpemUgPT0gMCkgewotICAgIHJlYWRDaHVua2VkRm9vdGVycygpOwotICB9IGVsc2UgewotICAgIC8vIFJlYWQgZGF0YSBjb250ZW50Ci0gICAgbGVuZ3RoICs9IHJlYWRDb250ZW50KGNodW5rU2l6ZSk7Ci0gICAgLy8gUmVhZCB0cmFpbGluZyBDUkxGIGFmdGVyIGNvbnRlbnQKLSAgICByZWFkTGluZSgpOwotICB9Ci0gIHJldHVybiBsZW5ndGg7Ci19Ci0KLXZvaWQgVEh0dHBUcmFuc3BvcnQ6OnJlYWRDaHVua2VkRm9vdGVycygpIHsKLSAgLy8gRW5kIG9mIGRhdGEsIHJlYWQgZm9vdGVyIGxpbmVzIHVudGlsIGEgYmxhbmsgb25lIGFwcGVhcnMKLSAgd2hpbGUgKHRydWUpIHsKLSAgICBjaGFyKiBsaW5lID0gcmVhZExpbmUoKTsKLSAgICBpZiAoc3RybGVuKGxpbmUpID09IDApIHsKLSAgICAgIGNodW5rZWREb25lXyA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotdWludDMyX3QgVEh0dHBUcmFuc3BvcnQ6OnBhcnNlQ2h1bmtTaXplKGNoYXIqIGxpbmUpIHsKLSAgY2hhciogc2VtaSA9IHN0cmNocihsaW5lLCAnOycpOwotICBpZiAoc2VtaSAhPSBOVUxMKSB7Ci0gICAgKnNlbWkgPSAnXDAnOwotICB9Ci0gIHVpbnQzMl90IHNpemUgPSAwOwotICBzc2NhbmYobGluZSwgIiV4IiwgJnNpemUpOwotICByZXR1cm4gc2l6ZTsKLX0KLQotdWludDMyX3QgVEh0dHBUcmFuc3BvcnQ6OnJlYWRDb250ZW50KHVpbnQzMl90IHNpemUpIHsKLSAgdWludDMyX3QgbmVlZCA9IHNpemU7Ci0gIHdoaWxlIChuZWVkID4gMCkgewotICAgIHVpbnQzMl90IGF2YWlsID0gaHR0cEJ1Zkxlbl8gLSBodHRwUG9zXzsKLSAgICBpZiAoYXZhaWwgPT0gMCkgewotICAgICAgLy8gV2UgaGF2ZSBnaXZlbiBhbGwgdGhlIGRhdGEsIHJlc2V0IHBvc2l0aW9uIHRvIGhlYWQgb2YgdGhlIGJ1ZmZlcgotICAgICAgaHR0cFBvc18gPSAwOwotICAgICAgaHR0cEJ1Zkxlbl8gPSAwOwotICAgICAgcmVmaWxsKCk7Ci0KLSAgICAgIC8vIE5vdyBoYXZlIGF2YWlsYWJsZSBob3dldmVyIG11Y2ggd2UgcmVhZAotICAgICAgYXZhaWwgPSBodHRwQnVmTGVuXzsKLSAgICB9Ci0gICAgdWludDMyX3QgZ2l2ZSA9IGF2YWlsOwotICAgIGlmIChuZWVkIDwgZ2l2ZSkgewotICAgICAgZ2l2ZSA9IG5lZWQ7Ci0gICAgfQotICAgIHJlYWRCdWZmZXJfLndyaXRlKCh1aW50OF90KikoaHR0cEJ1Zl8raHR0cFBvc18pLCBnaXZlKTsKLSAgICBodHRwUG9zXyArPSBnaXZlOwotICAgIG5lZWQgLT0gZ2l2ZTsKLSAgfQotICByZXR1cm4gc2l6ZTsKLX0KLQotY2hhciogVEh0dHBUcmFuc3BvcnQ6OnJlYWRMaW5lKCkgewotICB3aGlsZSAodHJ1ZSkgewotICAgIGNoYXIqIGVvbCA9IE5VTEw7Ci0KLSAgICBlb2wgPSBzdHJzdHIoaHR0cEJ1Zl8raHR0cFBvc18sIENSTEYpOwotCi0gICAgLy8gTm8gQ1JMRiB5ZXQ/Ci0gICAgaWYgKGVvbCA9PSBOVUxMKSB7Ci0gICAgICAvLyBTaGlmdCB3aGF0ZXZlciB3ZSBoYXZlIG5vdyB0byBmcm9udCBhbmQgcmVmaWxsCi0gICAgICBzaGlmdCgpOwotICAgICAgcmVmaWxsKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFJldHVybiBwb2ludGVyIHRvIG5leHQgbGluZQotICAgICAgKmVvbCA9ICdcMCc7Ci0gICAgICBjaGFyKiBsaW5lID0gaHR0cEJ1Zl8raHR0cFBvc187Ci0gICAgICBodHRwUG9zXyA9IChlb2wtaHR0cEJ1Zl8pICsgQ1JMRl9MRU47Ci0gICAgICByZXR1cm4gbGluZTsKLSAgICB9Ci0gIH0KLQotfQotCi12b2lkIFRIdHRwVHJhbnNwb3J0OjpzaGlmdCgpIHsKLSAgaWYgKGh0dHBCdWZMZW5fID4gaHR0cFBvc18pIHsKLSAgICAvLyBTaGlmdCBkb3duIHJlbWFpbmluZyBkYXRhIGFuZCByZWFkIG1vcmUKLSAgICB1aW50MzJfdCBsZW5ndGggPSBodHRwQnVmTGVuXyAtIGh0dHBQb3NfOwotICAgIG1lbW1vdmUoaHR0cEJ1Zl8sIGh0dHBCdWZfK2h0dHBQb3NfLCBsZW5ndGgpOwotICAgIGh0dHBCdWZMZW5fID0gbGVuZ3RoOwotICB9IGVsc2UgewotICAgIGh0dHBCdWZMZW5fID0gMDsKLSAgfQotICBodHRwUG9zXyA9IDA7Ci0gIGh0dHBCdWZfW2h0dHBCdWZMZW5fXSA9ICdcMCc7Ci19Ci0KLXZvaWQgVEh0dHBUcmFuc3BvcnQ6OnJlZmlsbCgpIHsKLSAgdWludDMyX3QgYXZhaWwgPSBodHRwQnVmU2l6ZV8gLSBodHRwQnVmTGVuXzsKLSAgaWYgKGF2YWlsIDw9IChodHRwQnVmU2l6ZV8gLyA0KSkgewotICAgIGh0dHBCdWZTaXplXyAqPSAyOwotICAgIGh0dHBCdWZfID0gKGNoYXIqKXN0ZDo6cmVhbGxvYyhodHRwQnVmXywgaHR0cEJ1ZlNpemVfKzEpOwotICAgIGlmIChodHRwQnVmXyA9PSBOVUxMKSB7Ci0gICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwotICAgIH0KLSAgfQotCi0gIC8vIFJlYWQgbW9yZSBkYXRhCi0gIHVpbnQzMl90IGdvdCA9IHRyYW5zcG9ydF8tPnJlYWQoKHVpbnQ4X3QqKShodHRwQnVmXytodHRwQnVmTGVuXyksIGh0dHBCdWZTaXplXy1odHRwQnVmTGVuXyk7Ci0gIGh0dHBCdWZMZW5fICs9IGdvdDsKLSAgaHR0cEJ1Zl9baHR0cEJ1Zkxlbl9dID0gJ1wwJzsKLQotICBpZiAoZ290ID09IDApIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgcmVmaWxsIGJ1ZmZlciIpOwotICB9Ci19Ci0KLXZvaWQgVEh0dHBUcmFuc3BvcnQ6OnJlYWRIZWFkZXJzKCkgewotICAvLyBJbml0aWFsaXplIGhlYWRlcnMgc3RhdGUgdmFyaWFibGVzCi0gIGNvbnRlbnRMZW5ndGhfID0gMDsKLSAgY2h1bmtlZF8gPSBmYWxzZTsKLSAgY2h1bmtlZERvbmVfID0gZmFsc2U7Ci0gIGNodW5rU2l6ZV8gPSAwOwotCi0gIC8vIENvbnRyb2wgc3RhdGUgZmxvdwotICBib29sIHN0YXR1c0xpbmUgPSB0cnVlOwotICBib29sIGZpbmlzaGVkID0gZmFsc2U7Ci0KLSAgLy8gTG9vcCB1bnRpbCBoZWFkZXJzIGFyZSBmaW5pc2hlZAotICB3aGlsZSAodHJ1ZSkgewotICAgIGNoYXIqIGxpbmUgPSByZWFkTGluZSgpOwotCi0gICAgaWYgKHN0cmxlbihsaW5lKSA9PSAwKSB7Ci0gICAgICBpZiAoZmluaXNoZWQpIHsKLSAgICAgICAgcmVhZEhlYWRlcnNfID0gZmFsc2U7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIE11c3QgaGF2ZSBiZWVuIGFuIEhUVFAgMTAwLCBrZWVwIGdvaW5nIGZvciBhbm90aGVyIHN0YXR1cyBsaW5lCi0gICAgICAgIHN0YXR1c0xpbmUgPSB0cnVlOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoc3RhdHVzTGluZSkgewotICAgICAgICBzdGF0dXNMaW5lID0gZmFsc2U7Ci0gICAgICAgIGZpbmlzaGVkID0gcGFyc2VTdGF0dXNMaW5lKGxpbmUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcGFyc2VIZWFkZXIobGluZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgVEh0dHBUcmFuc3BvcnQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIHdyaXRlQnVmZmVyXy53cml0ZShidWYsIGxlbik7Ci19Ci0KLX19fQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc3YzY1Zi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBUUkFOU1BPUlRfSF8KLSNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBUUkFOU1BPUlRfSF8gMQotCi0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0jaW5jbHVkZSAiVFZpcnR1YWxUcmFuc3BvcnQuaCIKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotLyoqCi0gKiBIVFRQIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0aHJpZnQgdHJhbnNwb3J0LiBUaGlzIHdhcyBpcnJpdGF0aW5nCi0gKiB0byB3cml0ZSwgYnV0IHRoZSBhbHRlcm5hdGl2ZXMgaW4gQysrIGxhbmQgYXJlIGRhdW50aW5nLiBMaW5raW5nIENVUkwKLSAqIHJlcXVpcmVzIDIzIGR5bmFtaWMgbGlicmFyaWVzIGxhc3QgdGltZSBJIGNoZWNrZWQgKFdURj8hPykuIEFsbCB3ZSBoYXZlCi0gKiBoZXJlIGlzIGEgVkVSWSBiYXNpYyBIVFRQLzEuMSBjbGllbnQgd2hpY2ggc3VwcG9ydHMgSFRUUCAxMDAgQ29udGludWUsCi0gKiBjaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nLCBrZWVwYWxpdmUsIGV0Yy4gVGVzdGVkIGFnYWluc3QgQXBhY2hlLgotICovCi1jbGFzcyBUSHR0cFRyYW5zcG9ydCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUSHR0cFRyYW5zcG9ydD4gewotIHB1YmxpYzoKLSAgVEh0dHBUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KTsKLQotICB2aXJ0dWFsIH5USHR0cFRyYW5zcG9ydCgpOwotCi0gIHZvaWQgb3BlbigpIHsKLSAgICB0cmFuc3BvcnRfLT5vcGVuKCk7Ci0gIH0KLQotICBib29sIGlzT3BlbigpIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0Xy0+aXNPcGVuKCk7Ci0gIH0KLQotICBib29sIHBlZWsoKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF8tPnBlZWsoKTsKLSAgfQotCi0gIHZvaWQgY2xvc2UoKSB7Ci0gICAgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIHVpbnQzMl90IHJlYWRFbmQoKTsKLQotICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLQotICB2aXJ0dWFsIHZvaWQgZmx1c2goKSA9IDA7Ci0KLSBwcm90ZWN0ZWQ6Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKLQotICBUTWVtb3J5QnVmZmVyIHdyaXRlQnVmZmVyXzsKLSAgVE1lbW9yeUJ1ZmZlciByZWFkQnVmZmVyXzsKLQotICBib29sIHJlYWRIZWFkZXJzXzsKLSAgYm9vbCBjaHVua2VkXzsKLSAgYm9vbCBjaHVua2VkRG9uZV87Ci0gIHVpbnQzMl90IGNodW5rU2l6ZV87Ci0gIHVpbnQzMl90IGNvbnRlbnRMZW5ndGhfOwotCi0gIGNoYXIqIGh0dHBCdWZfOwotICB1aW50MzJfdCBodHRwUG9zXzsKLSAgdWludDMyX3QgaHR0cEJ1Zkxlbl87Ci0gIHVpbnQzMl90IGh0dHBCdWZTaXplXzsKLQotICB2aXJ0dWFsIHZvaWQgaW5pdCgpOwotCi0gIHVpbnQzMl90IHJlYWRNb3JlRGF0YSgpOwotICBjaGFyKiByZWFkTGluZSgpOwotCi0gIHZvaWQgcmVhZEhlYWRlcnMoKTsKLSAgdmlydHVhbCB2b2lkIHBhcnNlSGVhZGVyKGNoYXIqIGhlYWRlcikgPSAwOwotICB2aXJ0dWFsIGJvb2wgcGFyc2VTdGF0dXNMaW5lKGNoYXIqIHN0YXR1cykgPSAwOwotCi0gIHVpbnQzMl90IHJlYWRDaHVua2VkKCk7Ci0gIHZvaWQgcmVhZENodW5rZWRGb290ZXJzKCk7Ci0gIHVpbnQzMl90IHBhcnNlQ2h1bmtTaXplKGNoYXIqIGxpbmUpOwotCi0gIHVpbnQzMl90IHJlYWRDb250ZW50KHVpbnQzMl90IHNpemUpOwotCi0gIHZvaWQgcmVmaWxsKCk7Ci0gIHZvaWQgc2hpZnQoKTsKLQotICBzdGF0aWMgY29uc3QgY2hhciogQ1JMRjsKLSAgc3RhdGljIGNvbnN0IGludCBDUkxGX0xFTjsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQQ0xJRU5UX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5jcHAgYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMDZmMzAuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiVFNTTFNlcnZlclNvY2tldC5oIgotI2luY2x1ZGUgIlRTU0xTb2NrZXQuaCIKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotdXNpbmcgbmFtZXNwYWNlIGJvb3N0OwotCi0vKioKLSAqIFNTTCBzZXJ2ZXIgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICovCi1UU1NMU2VydmVyU29ja2V0OjpUU1NMU2VydmVyU29ja2V0KGludCBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclNvY2tldChwb3J0KSwgZmFjdG9yeV8oZmFjdG9yeSkgewotICBmYWN0b3J5Xy0+c2VydmVyKHRydWUpOwotfQotCi1UU1NMU2VydmVyU29ja2V0OjpUU1NMU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgc2VuZFRpbWVvdXQsIGludCByZWN2VGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJTb2NrZXQocG9ydCwgc2VuZFRpbWVvdXQsIHJlY3ZUaW1lb3V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeV8oZmFjdG9yeSkgewotICBmYWN0b3J5Xy0+c2VydmVyKHRydWUpOwotfQotCi1zaGFyZWRfcHRyPFRTb2NrZXQ+IFRTU0xTZXJ2ZXJTb2NrZXQ6OmNyZWF0ZVNvY2tldChpbnQgY2xpZW50KSB7Ci0gIHJldHVybiBmYWN0b3J5Xy0+Y3JlYXRlU29ja2V0KGNsaWVudCk7Ci19Ci0KLX19fQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZTY1OWQuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU1NMU0VSVkVSU09DS0VUX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTU0xTRVJWRVJTT0NLRVRfSF8gMQotCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0jaW5jbHVkZSAiVFNlcnZlclNvY2tldC5oIgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi1jbGFzcyBUU1NMU29ja2V0RmFjdG9yeTsKLQotLyoqCi0gKiBTZXJ2ZXIgc29ja2V0IHRoYXQgYWNjZXB0cyBTU0wgY29ubmVjdGlvbnMuCi0gKi8KLWNsYXNzIFRTU0xTZXJ2ZXJTb2NrZXQ6IHB1YmxpYyBUU2VydmVyU29ja2V0IHsKLSBwdWJsaWM6Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtIHBvcnQgICAgTGlzdGVuaW5nIHBvcnQKLSAgICogQHBhcmFtIGZhY3RvcnkgU1NMIHNvY2tldCBmYWN0b3J5IGltcGxlbWVudGF0aW9uCi0gICAqLwotICBUU1NMU2VydmVyU29ja2V0KGludCBwb3J0LCBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSk7Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtIHBvcnQgICAgICAgIExpc3RlbmluZyBwb3J0Ci0gICAqIEBwYXJhbSBzZW5kVGltZW91dCBTb2NrZXQgc2VuZCB0aW1lb3V0Ci0gICAqIEBwYXJhbSByZWN2VGltZW91dCBTb2NrZXQgcmVjZWl2ZSB0aW1lb3V0Ci0gICAqIEBwYXJhbSBmYWN0b3J5ICAgICBTU0wgc29ja2V0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24KLSAgICovCi0gIFRTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBzZW5kVGltZW91dCwgaW50IHJlY3ZUaW1lb3V0LAotICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KTsKLSBwcm90ZWN0ZWQ6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGNyZWF0ZVNvY2tldChpbnQgc29ja2V0KTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnlfOwotfTsKLQotfX19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MTNjMjU4Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfYXJyYXkuaHBwPgotI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgotI2luY2x1ZGUgImNvbmN1cnJlbmN5L011dGV4LmgiCi0jaW5jbHVkZSAiVFNTTFNvY2tldC5oIgotCi0jZGVmaW5lIE9QRU5TU0xfVkVSU0lPTl9OT19USFJFQURfSUQgMHgxMDAwMDAwMEwKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBib29zdDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7Ci0KLXN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSB7Ci0gIE11dGV4IG11dGV4OwotfTsKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotCi1zdGF0aWMgdm9pZCBidWlsZEVycm9ycyhzdHJpbmcmIG1lc3NhZ2UsIGludCBlcnJvciA9IDApOwotc3RhdGljIGJvb2wgbWF0Y2hOYW1lKGNvbnN0IGNoYXIqIGhvc3QsIGNvbnN0IGNoYXIqIHBhdHRlcm4sIGludCBzaXplKTsKLXN0YXRpYyBjaGFyIHVwcGVyY2FzZShjaGFyIGMpOwotCi0vLyBTU0xDb250ZXh0IGltcGxlbWVudGF0aW9uCi1TU0xDb250ZXh0OjpTU0xDb250ZXh0KCkgewotICBjdHhfID0gU1NMX0NUWF9uZXcoVExTdjFfbWV0aG9kKCkpOwotICBpZiAoY3R4XyA9PSBOVUxMKSB7Ci0gICAgc3RyaW5nIGVycm9yczsKLSAgICBidWlsZEVycm9ycyhlcnJvcnMpOwotICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9DVFhfbmV3OiAiICsgZXJyb3JzKTsKLSAgfQotICBTU0xfQ1RYX3NldF9tb2RlKGN0eF8sIFNTTF9NT0RFX0FVVE9fUkVUUlkpOwotfQotCi1TU0xDb250ZXh0Ojp+U1NMQ29udGV4dCgpIHsKLSAgaWYgKGN0eF8gIT0gTlVMTCkgewotICAgIFNTTF9DVFhfZnJlZShjdHhfKTsKLSAgICBjdHhfID0gTlVMTDsKLSAgfQotfQotCi1TU0wqIFNTTENvbnRleHQ6OmNyZWF0ZVNTTCgpIHsKLSAgU1NMKiBzc2wgPSBTU0xfbmV3KGN0eF8pOwotICBpZiAoc3NsID09IE5VTEwpIHsKLSAgICBzdHJpbmcgZXJyb3JzOwotICAgIGJ1aWxkRXJyb3JzKGVycm9ycyk7Ci0gICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX25ldzogIiArIGVycm9ycyk7Ci0gIH0KLSAgcmV0dXJuIHNzbDsKLX0KLQotLy8gVFNTTFNvY2tldCBpbXBsZW1lbnRhdGlvbgotVFNTTFNvY2tldDo6VFNTTFNvY2tldChzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCk6Ci0gIFRTb2NrZXQoKSwgc2VydmVyXyhmYWxzZSksIHNzbF8oTlVMTCksIGN0eF8oY3R4KSB7Ci19Ci0KLVRTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoc2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIGludCBzb2NrZXQpOgotICBUU29ja2V0KHNvY2tldCksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKE5VTEwpLCBjdHhfKGN0eCkgewotfQotCi1UU1NMU29ja2V0OjpUU1NMU29ja2V0KHNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBzdHJpbmcgaG9zdCwgaW50IHBvcnQpOgotICBUU29ja2V0KGhvc3QsIHBvcnQpLCBzZXJ2ZXJfKGZhbHNlKSwgc3NsXyhOVUxMKSwgY3R4XyhjdHgpIHsKLX0KLQotVFNTTFNvY2tldDo6flRTU0xTb2NrZXQoKSB7Ci0gIGNsb3NlKCk7Ci19Ci0KLWJvb2wgVFNTTFNvY2tldDo6aXNPcGVuKCkgewotICBpZiAoc3NsXyA9PSBOVUxMIHx8ICFUU29ja2V0Ojppc09wZW4oKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpbnQgc2h1dGRvd24gPSBTU0xfZ2V0X3NodXRkb3duKHNzbF8pOwotICBib29sIHNodXRkb3duUmVjZWl2ZWQgPSAoc2h1dGRvd24gJiBTU0xfUkVDRUlWRURfU0hVVERPV04pOwotICBib29sIHNodXRkb3duU2VudCAgICAgPSAoc2h1dGRvd24gJiBTU0xfU0VOVF9TSFVURE9XTik7Ci0gIGlmIChzaHV0ZG93blJlY2VpdmVkICYmIHNodXRkb3duU2VudCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBUU1NMU29ja2V0OjpwZWVrKCkgewotICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGNoZWNrSGFuZHNoYWtlKCk7Ci0gIGludCByYzsKLSAgdWludDhfdCBieXRlOwotICByYyA9IFNTTF9wZWVrKHNzbF8sICZieXRlLCAxKTsKLSAgaWYgKHJjIDwgMCkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgc3RyaW5nIGVycm9yczsKLSAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHkpOwotICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9wZWVrOiAiICsgZXJyb3JzKTsKLSAgfQotICBpZiAocmMgPT0gMCkgewotICAgIEVSUl9jbGVhcl9lcnJvcigpOwotICB9Ci0gIHJldHVybiAocmMgPiAwKTsKLX0KLQotdm9pZCBUU1NMU29ja2V0OjpvcGVuKCkgewotICBpZiAoaXNPcGVuKCkgfHwgc2VydmVyKCkpIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTKTsKLSAgfQotICBUU29ja2V0OjpvcGVuKCk7Ci19Ci0KLXZvaWQgVFNTTFNvY2tldDo6Y2xvc2UoKSB7Ci0gIGlmIChzc2xfICE9IE5VTEwpIHsKLSAgICBpbnQgcmMgPSBTU0xfc2h1dGRvd24oc3NsXyk7Ci0gICAgaWYgKHJjID09IDApIHsKLSAgICAgIHJjID0gU1NMX3NodXRkb3duKHNzbF8pOwotICAgIH0KLSAgICBpZiAocmMgPCAwKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgc3RyaW5nIGVycm9yczsKLSAgICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSk7Ci0gICAgICBHbG9iYWxPdXRwdXQoKCJTU0xfc2h1dGRvd246ICIgKyBlcnJvcnMpLmNfc3RyKCkpOwotICAgIH0KLSAgICBTU0xfZnJlZShzc2xfKTsKLSAgICBzc2xfID0gTlVMTDsKLSAgICBFUlJfcmVtb3ZlX3N0YXRlKDApOwotICB9Ci0gIFRTb2NrZXQ6OmNsb3NlKCk7Ci19Ci0KLXVpbnQzMl90IFRTU0xTb2NrZXQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgY2hlY2tIYW5kc2hha2UoKTsKLSAgaW50MzJfdCBieXRlcyA9IDA7Ci0gIGZvciAoaW50MzJfdCByZXRyaWVzID0gMDsgcmV0cmllcyA8IG1heFJlY3ZSZXRyaWVzXzsgcmV0cmllcysrKXsKLSAgICBieXRlcyA9IFNTTF9yZWFkKHNzbF8sIGJ1ZiwgbGVuKTsKLSAgICBpZiAoYnl0ZXMgPj0gMCkKLSAgICAgIGJyZWFrOwotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgaWYgKFNTTF9nZXRfZXJyb3Ioc3NsXywgYnl0ZXMpID09IFNTTF9FUlJPUl9TWVNDQUxMKSB7Ci0gICAgICBpZiAoRVJSX2dldF9lcnJvcigpID09IDAgJiYgZXJybm9fY29weSA9PSBFSU5UUikgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3RyaW5nIGVycm9yczsKLSAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHkpOwotICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9yZWFkOiAiICsgZXJyb3JzKTsKLSAgfQotICByZXR1cm4gYnl0ZXM7Ci19Ci0KLXZvaWQgVFNTTFNvY2tldDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgY2hlY2tIYW5kc2hha2UoKTsKLSAgLy8gbG9vcCBpbiBjYXNlIFNTTF9NT0RFX0VOQUJMRV9QQVJUSUFMX1dSSVRFIGlzIHNldCBpbiBTU0xfQ1RYLgotICB1aW50MzJfdCB3cml0dGVuID0gMDsKLSAgd2hpbGUgKHdyaXR0ZW4gPCBsZW4pIHsKLSAgICBpbnQzMl90IGJ5dGVzID0gU1NMX3dyaXRlKHNzbF8sICZidWZbd3JpdHRlbl0sIGxlbiAtIHdyaXR0ZW4pOwotICAgIGlmIChieXRlcyA8PSAwKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgc3RyaW5nIGVycm9yczsKLSAgICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSk7Ci0gICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfd3JpdGU6ICIgKyBlcnJvcnMpOwotICAgIH0KLSAgICB3cml0dGVuICs9IGJ5dGVzOwotICB9Ci19Ci0KLXZvaWQgVFNTTFNvY2tldDo6Zmx1c2goKSB7Ci0gIC8vIERvbid0IHRocm93IGV4Y2VwdGlvbiBpZiBub3Qgb3Blbi4gVGhyaWZ0IHNlcnZlcnMgY2xvc2Ugc29ja2V0IHR3aWNlLgotICBpZiAoc3NsXyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGNoZWNrSGFuZHNoYWtlKCk7Ci0gIEJJTyogYmlvID0gU1NMX2dldF93YmlvKHNzbF8pOwotICBpZiAoYmlvID09IE5VTEwpIHsKLSAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfZ2V0X3diaW8gcmV0dXJucyBOVUxMIik7Ci0gIH0KLSAgaWYgKEJJT19mbHVzaChiaW8pICE9IDEpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIHN0cmluZyBlcnJvcnM7Ci0gICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5KTsKLSAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJCSU9fZmx1c2g6ICIgKyBlcnJvcnMpOwotICB9Ci19Ci0KLXZvaWQgVFNTTFNvY2tldDo6Y2hlY2tIYW5kc2hha2UoKSB7Ci0gIGlmICghVFNvY2tldDo6aXNPcGVuKCkpIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKLSAgfQotICBpZiAoc3NsXyAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHNzbF8gPSBjdHhfLT5jcmVhdGVTU0woKTsKLSAgU1NMX3NldF9mZChzc2xfLCBzb2NrZXRfKTsKLSAgaW50IHJjOwotICBpZiAoc2VydmVyKCkpIHsKLSAgICByYyA9IFNTTF9hY2NlcHQoc3NsXyk7Ci0gIH0gZWxzZSB7Ci0gICAgcmMgPSBTU0xfY29ubmVjdChzc2xfKTsKLSAgfQotICBpZiAocmMgPD0gMCkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgc3RyaW5nIGZuYW1lKHNlcnZlcigpID8gIlNTTF9hY2NlcHQiIDogIlNTTF9jb25uZWN0Iik7Ci0gICAgc3RyaW5nIGVycm9yczsKLSAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHkpOwotICAgIHRocm93IFRTU0xFeGNlcHRpb24oZm5hbWUgKyAiOiAiICsgZXJyb3JzKTsKLSAgfQotICBhdXRob3JpemUoKTsKLX0KLQotdm9pZCBUU1NMU29ja2V0OjphdXRob3JpemUoKSB7Ci0gIGludCByYyA9IFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChzc2xfKTsKLSAgaWYgKHJjICE9IFg1MDlfVl9PSykgeyAgLy8gdmVyaWZ5IGF1dGhlbnRpY2F0aW9uIHJlc3VsdAotICAgIHRocm93IFRTU0xFeGNlcHRpb24oc3RyaW5nKCJTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoKSwgIikgKwotICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcocmMpKTsKLSAgfQotCi0gIFg1MDkqIGNlcnQgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc3NsXyk7Ci0gIGlmIChjZXJ0ID09IE5VTEwpIHsKLSAgICAvLyBjZXJ0aWZpY2F0ZSBpcyBub3QgcHJlc2VudAotICAgIGlmIChTU0xfZ2V0X3ZlcmlmeV9tb2RlKHNzbF8pICYgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkgewotICAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiYXV0aG9yaXplOiByZXF1aXJlZCBjZXJ0aWZpY2F0ZSBub3QgcHJlc2VudCIpOwotICAgIH0KLSAgICAvLyBjZXJ0aWZpY2F0ZSB3YXMgb3B0aW9uYWw6IGRpZG4ndCBpbnRlbmQgdG8gYXV0aG9yaXplIHJlbW90ZQotICAgIGlmIChzZXJ2ZXIoKSAmJiBhY2Nlc3NfICE9IE5VTEwpIHsKLSAgICAgIHRocm93IFRTU0xFeGNlcHRpb24oImF1dGhvcml6ZTogY2VydGlmaWNhdGUgcmVxdWlyZWQgZm9yIGF1dGhvcml6YXRpb24iKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8vIGNlcnRpZmljYXRlIGlzIHByZXNlbnQKLSAgaWYgKGFjY2Vzc18gPT0gTlVMTCkgewotICAgIFg1MDlfZnJlZShjZXJ0KTsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gYm90aCBjZXJ0aWZpY2F0ZSBhbmQgYWNjZXNzIG1hbmFnZXIgYXJlIHByZXNlbnQKLQotICBzdHJpbmcgaG9zdDsKLSAgc29ja2FkZHJfc3RvcmFnZSBzYTsKLSAgc29ja2xlbl90IHNhTGVuZ3RoID0gc2l6ZW9mKHNhKTsKLQotICBpZiAoZ2V0cGVlcm5hbWUoc29ja2V0XywgKHNvY2thZGRyKikmc2EsICZzYUxlbmd0aCkgIT0gMCkgewotICAgIHNhLnNzX2ZhbWlseSA9IEFGX1VOU1BFQzsKLSAgfQotCi0gIEFjY2Vzc01hbmFnZXI6OkRlY2lzaW9uIGRlY2lzaW9uID0gYWNjZXNzXy0+dmVyaWZ5KHNhKTsKLQotICBpZiAoZGVjaXNpb24gIT0gQWNjZXNzTWFuYWdlcjo6U0tJUCkgewotICAgIFg1MDlfZnJlZShjZXJ0KTsKLSAgICBpZiAoZGVjaXNpb24gIT0gQWNjZXNzTWFuYWdlcjo6QUxMT1cpIHsKLSAgICAgIHRocm93IFRTU0xFeGNlcHRpb24oImF1dGhvcml6ZTogYWNjZXNzIGRlbmllZCBiYXNlZCBvbiByZW1vdGUgSVAiKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gZXh0cmFjdCBzdWJqZWN0QWx0ZXJuYXRpdmVOYW1lCi0gIFNUQUNLX09GKEdFTkVSQUxfTkFNRSkqIGFsdGVybmF0aXZlcyA9IChTVEFDS19PRihHRU5FUkFMX05BTUUpKikKLSAgICAgICAgICAgICAgICAgICAgICAgWDUwOV9nZXRfZXh0X2QyaShjZXJ0LCBOSURfc3ViamVjdF9hbHRfbmFtZSwgTlVMTCwgTlVMTCk7Ci0gIGlmIChhbHRlcm5hdGl2ZXMgIT0gTlVMTCkgewotICAgIGNvbnN0IGludCBjb3VudCA9IHNrX0dFTkVSQUxfTkFNRV9udW0oYWx0ZXJuYXRpdmVzKTsKLSAgICBmb3IgKGludCBpID0gMDsgZGVjaXNpb24gPT0gQWNjZXNzTWFuYWdlcjo6U0tJUCAmJiBpIDwgY291bnQ7IGkrKykgewotICAgICAgY29uc3QgR0VORVJBTF9OQU1FKiBuYW1lID0gc2tfR0VORVJBTF9OQU1FX3ZhbHVlKGFsdGVybmF0aXZlcywgaSk7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgY2hhciogZGF0YSA9IChjaGFyKilBU04xX1NUUklOR19kYXRhKG5hbWUtPmQuaWE1KTsKLSAgICAgIGludCBsZW5ndGggPSBBU04xX1NUUklOR19sZW5ndGgobmFtZS0+ZC5pYTUpOwotICAgICAgc3dpdGNoIChuYW1lLT50eXBlKSB7Ci0gICAgICAgIGNhc2UgR0VOX0ROUzoKLSAgICAgICAgICBpZiAoaG9zdC5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBob3N0ID0gKHNlcnZlcigpID8gZ2V0UGVlckhvc3QoKSA6IGdldEhvc3QoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRlY2lzaW9uID0gYWNjZXNzXy0+dmVyaWZ5KGhvc3QsIGRhdGEsIGxlbmd0aCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR0VOX0lQQUREOgotICAgICAgICAgIGRlY2lzaW9uID0gYWNjZXNzXy0+dmVyaWZ5KHNhLCBkYXRhLCBsZW5ndGgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBza19HRU5FUkFMX05BTUVfcG9wX2ZyZWUoYWx0ZXJuYXRpdmVzLCBHRU5FUkFMX05BTUVfZnJlZSk7Ci0gIH0KLQotICBpZiAoZGVjaXNpb24gIT0gQWNjZXNzTWFuYWdlcjo6U0tJUCkgewotICAgIFg1MDlfZnJlZShjZXJ0KTsKLSAgICBpZiAoZGVjaXNpb24gIT0gQWNjZXNzTWFuYWdlcjo6QUxMT1cpIHsKLSAgICAgIHRocm93IFRTU0xFeGNlcHRpb24oImF1dGhvcml6ZTogYWNjZXNzIGRlbmllZCIpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBleHRyYWN0IGNvbW1vbk5hbWUKLSAgWDUwOV9OQU1FKiBuYW1lID0gWDUwOV9nZXRfc3ViamVjdF9uYW1lKGNlcnQpOwotICBpZiAobmFtZSAhPSBOVUxMKSB7Ci0gICAgWDUwOV9OQU1FX0VOVFJZKiBlbnRyeTsKLSAgICB1bnNpZ25lZCBjaGFyKiB1dGY4OwotICAgIGludCBsYXN0ID0gLTE7Ci0gICAgd2hpbGUgKGRlY2lzaW9uID09IEFjY2Vzc01hbmFnZXI6OlNLSVApIHsKLSAgICAgIGxhc3QgPSBYNTA5X05BTUVfZ2V0X2luZGV4X2J5X05JRChuYW1lLCBOSURfY29tbW9uTmFtZSwgbGFzdCk7Ci0gICAgICBpZiAobGFzdCA9PSAtMSkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBlbnRyeSA9IFg1MDlfTkFNRV9nZXRfZW50cnkobmFtZSwgbGFzdCk7Ci0gICAgICBpZiAoZW50cnkgPT0gTlVMTCkKLSAgICAgICAgY29udGludWU7Ci0gICAgICBBU04xX1NUUklORyogY29tbW9uID0gWDUwOV9OQU1FX0VOVFJZX2dldF9kYXRhKGVudHJ5KTsKLSAgICAgIGludCBzaXplID0gQVNOMV9TVFJJTkdfdG9fVVRGOCgmdXRmOCwgY29tbW9uKTsKLSAgICAgIGlmIChob3N0LmVtcHR5KCkpIHsKLSAgICAgICAgaG9zdCA9IChzZXJ2ZXIoKSA/IGdldEhvc3QoKSA6IGdldEhvc3QoKSk7Ci0gICAgICB9Ci0gICAgICBkZWNpc2lvbiA9IGFjY2Vzc18tPnZlcmlmeShob3N0LCAoY2hhciopdXRmOCwgc2l6ZSk7Ci0gICAgICBPUEVOU1NMX2ZyZWUodXRmOCk7Ci0gICAgfQotICB9Ci0gIFg1MDlfZnJlZShjZXJ0KTsKLSAgaWYgKGRlY2lzaW9uICE9IEFjY2Vzc01hbmFnZXI6OkFMTE9XKSB7Ci0gICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiYXV0aG9yaXplOiBjYW5ub3QgYXV0aG9yaXplIHBlZXIiKTsKLSAgfQotfQotCi0vLyBUU1NMU29ja2V0RmFjdG9yeSBpbXBsZW1lbnRhdGlvbgotYm9vbCAgICAgVFNTTFNvY2tldEZhY3Rvcnk6OmluaXRpYWxpemVkID0gZmFsc2U7Ci11aW50NjRfdCBUU1NMU29ja2V0RmFjdG9yeTo6Y291bnRfID0gMDsKLU11dGV4ICAgIFRTU0xTb2NrZXRGYWN0b3J5OjptdXRleF87Ci0KLVRTU0xTb2NrZXRGYWN0b3J5OjpUU1NMU29ja2V0RmFjdG9yeSgpOiBzZXJ2ZXJfKGZhbHNlKSB7Ci0gIEd1YXJkIGd1YXJkKG11dGV4Xyk7Ci0gIGlmIChjb3VudF8gPT0gMCkgewotICAgIGluaXRpYWxpemVPcGVuU1NMKCk7Ci0gICAgcmFuZG9taXplKCk7Ci0gIH0KLSAgY291bnRfKys7Ci0gIGN0eF8gPSBzaGFyZWRfcHRyPFNTTENvbnRleHQ+KG5ldyBTU0xDb250ZXh0KTsKLX0KLQotVFNTTFNvY2tldEZhY3Rvcnk6On5UU1NMU29ja2V0RmFjdG9yeSgpIHsKLSAgR3VhcmQgZ3VhcmQobXV0ZXhfKTsKLSAgY291bnRfLS07Ci0gIGlmIChjb3VudF8gPT0gMCkgewotICAgIGNsZWFudXBPcGVuU1NMKCk7Ci0gIH0KLX0KLQotc2hhcmVkX3B0cjxUU1NMU29ja2V0PiBUU1NMU29ja2V0RmFjdG9yeTo6Y3JlYXRlU29ja2V0KCkgewotICBzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbChuZXcgVFNTTFNvY2tldChjdHhfKSk7Ci0gIHNldHVwKHNzbCk7Ci0gIHJldHVybiBzc2w7Ci19Ci0KLXNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldChpbnQgc29ja2V0KSB7Ci0gIHNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKG5ldyBUU1NMU29ja2V0KGN0eF8sIHNvY2tldCkpOwotICBzZXR1cChzc2wpOwotICByZXR1cm4gc3NsOwotfQotCi1zaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoY29uc3Qgc3RyaW5nJiBob3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0KSB7Ci0gIHNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKG5ldyBUU1NMU29ja2V0KGN0eF8sIGhvc3QsIHBvcnQpKTsKLSAgc2V0dXAoc3NsKTsKLSAgcmV0dXJuIHNzbDsKLX0KLQotdm9pZCBUU1NMU29ja2V0RmFjdG9yeTo6c2V0dXAoc2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wpIHsKLSAgc3NsLT5zZXJ2ZXIoc2VydmVyKCkpOwotICBpZiAoYWNjZXNzXyA9PSBOVUxMICYmICFzZXJ2ZXIoKSkgewotICAgIGFjY2Vzc18gPSBzaGFyZWRfcHRyPEFjY2Vzc01hbmFnZXI+KG5ldyBEZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlcik7Ci0gIH0KLSAgaWYgKGFjY2Vzc18gIT0gTlVMTCkgewotICAgIHNzbC0+YWNjZXNzKGFjY2Vzc18pOwotICB9Ci19Ci0KLXZvaWQgVFNTTFNvY2tldEZhY3Rvcnk6OmNpcGhlcnMoY29uc3Qgc3RyaW5nJiBlbmFibGUpIHsKLSAgaW50IHJjID0gU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QoY3R4Xy0+Z2V0KCksIGVuYWJsZS5jX3N0cigpKTsKLSAgaWYgKEVSUl9wZWVrX2Vycm9yKCkgIT0gMCkgewotICAgIHN0cmluZyBlcnJvcnM7Ci0gICAgYnVpbGRFcnJvcnMoZXJyb3JzKTsKLSAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdDogIiArIGVycm9ycyk7Ci0gIH0KLSAgaWYgKHJjID09IDApIHsKLSAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJOb25lIG9mIHNwZWNpZmllZCBjaXBoZXJzIGFyZSBzdXBwb3J0ZWQiKTsKLSAgfQotfQotCi12b2lkIFRTU0xTb2NrZXRGYWN0b3J5OjphdXRoZW50aWNhdGUoYm9vbCByZXF1aXJlZCkgewotICBpbnQgbW9kZTsKLSAgaWYgKHJlcXVpcmVkKSB7Ci0gICAgbW9kZSAgPSBTU0xfVkVSSUZZX1BFRVIgfCBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUIHwgU1NMX1ZFUklGWV9DTElFTlRfT05DRTsKLSAgfSBlbHNlIHsKLSAgICBtb2RlID0gU1NMX1ZFUklGWV9OT05FOwotICB9Ci0gIFNTTF9DVFhfc2V0X3ZlcmlmeShjdHhfLT5nZXQoKSwgbW9kZSwgTlVMTCk7Ci19Ci0KLXZvaWQgVFNTTFNvY2tldEZhY3Rvcnk6OmxvYWRDZXJ0aWZpY2F0ZShjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBmb3JtYXQpIHsKLSAgaWYgKHBhdGggPT0gTlVMTCB8fCBmb3JtYXQgPT0gTlVMTCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCi0gICAgICAgICAibG9hZENlcnRpZmljYXRlQ2hhaW46IGVpdGhlciA8cGF0aD4gb3IgPGZvcm1hdD4gaXMgTlVMTCIpOwotICB9Ci0gIGlmIChzdHJjbXAoZm9ybWF0LCAiUEVNIikgPT0gMCkgewotICAgIGlmIChTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKGN0eF8tPmdldCgpLCBwYXRoKSA9PSAwKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgc3RyaW5nIGVycm9yczsKLSAgICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSk7Ci0gICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlOiAiICsgZXJyb3JzKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgY2VydGlmaWNhdGUgZm9ybWF0OiAiICsgc3RyaW5nKGZvcm1hdCkpOwotICB9Ci19Ci0KLXZvaWQgVFNTTFNvY2tldEZhY3Rvcnk6OmxvYWRQcml2YXRlS2V5KGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIGZvcm1hdCkgewotICBpZiAocGF0aCA9PSBOVUxMIHx8IGZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICJsb2FkUHJpdmF0ZUtleTogZWl0aGVyIDxwYXRoPiBvciA8Zm9ybWF0PiBpcyBOVUxMIik7Ci0gIH0KLSAgaWYgKHN0cmNtcChmb3JtYXQsICJQRU0iKSA9PSAwKSB7Ci0gICAgaWYgKFNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZShjdHhfLT5nZXQoKSwgcGF0aCwgU1NMX0ZJTEVUWVBFX1BFTSkgPT0gMCkgewotICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICAgIHN0cmluZyBlcnJvcnM7Ci0gICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHkpOwotICAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlOiAiICsgZXJyb3JzKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBUU1NMU29ja2V0RmFjdG9yeTo6bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY29uc3QgY2hhciogcGF0aCkgewotICBpZiAocGF0aCA9PSBOVUxMKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICJsb2FkVHJ1c3RlZENlcnRpZmljYXRlczogPHBhdGg+IGlzIE5VTEwiKTsKLSAgfQotICBpZiAoU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY3R4Xy0+Z2V0KCksIHBhdGgsIE5VTEwpID09IDApIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIHN0cmluZyBlcnJvcnM7Ci0gICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5KTsKLSAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9uczogIiArIGVycm9ycyk7Ci0gIH0KLX0KLQotdm9pZCBUU1NMU29ja2V0RmFjdG9yeTo6cmFuZG9taXplKCkgewotICBSQU5EX3BvbGwoKTsKLX0KLQotdm9pZCBUU1NMU29ja2V0RmFjdG9yeTo6b3ZlcnJpZGVEZWZhdWx0UGFzc3dvcmRDYWxsYmFjaygpIHsKLSAgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2IoY3R4Xy0+Z2V0KCksIHBhc3N3b3JkQ2FsbGJhY2spOwotICBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYl91c2VyZGF0YShjdHhfLT5nZXQoKSwgdGhpcyk7Ci19Ci0KLWludCBUU1NMU29ja2V0RmFjdG9yeTo6cGFzc3dvcmRDYWxsYmFjayhjaGFyKiBwYXNzd29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZGF0YSkgewotICBUU1NMU29ja2V0RmFjdG9yeSogZmFjdG9yeSA9IChUU1NMU29ja2V0RmFjdG9yeSopZGF0YTsKLSAgc3RyaW5nIHVzZXJQYXNzd29yZDsKLSAgZmFjdG9yeS0+Z2V0UGFzc3dvcmQodXNlclBhc3N3b3JkLCBzaXplKTsKLSAgaW50IGxlbmd0aCA9IHVzZXJQYXNzd29yZC5zaXplKCk7Ci0gIGlmIChsZW5ndGggPiBzaXplKSB7Ci0gICAgbGVuZ3RoID0gc2l6ZTsKLSAgfQotICBzdHJuY3B5KHBhc3N3b3JkLCB1c2VyUGFzc3dvcmQuY19zdHIoKSwgbGVuZ3RoKTsKLSAgcmV0dXJuIGxlbmd0aDsKLX0KLQotc3RhdGljIHNoYXJlZF9hcnJheTxNdXRleD4gbXV0ZXhlczsKLQotc3RhdGljIHZvaWQgY2FsbGJhY2tMb2NraW5nKGludCBtb2RlLCBpbnQgbiwgY29uc3QgY2hhciosIGludCkgewotICBpZiAobW9kZSAmIENSWVBUT19MT0NLKSB7Ci0gICAgbXV0ZXhlc1tuXS5sb2NrKCk7Ci0gIH0gZWxzZSB7Ci0gICAgbXV0ZXhlc1tuXS51bmxvY2soKTsKLSAgfQotfQotCi0jaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEKQotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FsbGJhY2tUaHJlYWRJRCgpIHsKLSAgcmV0dXJuICh1bnNpZ25lZCBsb25nKSBwdGhyZWFkX3NlbGYoKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgQ1JZUFRPX2R5bmxvY2tfdmFsdWUqIGR5bl9jcmVhdGUoY29uc3QgY2hhciosIGludCkgewotICByZXR1cm4gbmV3IENSWVBUT19keW5sb2NrX3ZhbHVlOwotfQotCi1zdGF0aWMgdm9pZCBkeW5fbG9jayhpbnQgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSogbG9jaywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBpbnQpIHsKLSAgaWYgKGxvY2sgIT0gTlVMTCkgewotICAgIGlmIChtb2RlICYgQ1JZUFRPX0xPQ0spIHsKLSAgICAgIGxvY2stPm11dGV4LmxvY2soKTsKLSAgICB9IGVsc2UgewotICAgICAgbG9jay0+bXV0ZXgudW5sb2NrKCk7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGR5bl9kZXN0cm95KHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSogbG9jaywgY29uc3QgY2hhciosIGludCkgewotICBkZWxldGUgbG9jazsKLX0KLQotdm9pZCBUU1NMU29ja2V0RmFjdG9yeTo6aW5pdGlhbGl6ZU9wZW5TU0woKSB7Ci0gIGlmIChpbml0aWFsaXplZCkgewotICAgIHJldHVybjsKLSAgfQotICBpbml0aWFsaXplZCA9IHRydWU7Ci0gIFNTTF9saWJyYXJ5X2luaXQoKTsKLSAgU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncygpOwotICAvLyBzdGF0aWMgbG9ja2luZwotICBtdXRleGVzID0gc2hhcmVkX2FycmF5PE11dGV4PihuZXcgTXV0ZXhbOjpDUllQVE9fbnVtX2xvY2tzKCldKTsKLSAgaWYgKG11dGV4ZXMgPT0gTlVMTCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IsCi0gICAgICAgICAgImluaXRpYWxpemVPcGVuU1NMKCkgZmFpbGVkLCAiCi0gICAgICAgICAgIm91dCBvZiBtZW1vcnkgd2hpbGUgY3JlYXRpbmcgbXV0ZXggYXJyYXkiKTsKLSAgfQotI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRCkKLSAgQ1JZUFRPX3NldF9pZF9jYWxsYmFjayhjYWxsYmFja1RocmVhZElEKTsKLSNlbmRpZgotICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soY2FsbGJhY2tMb2NraW5nKTsKLSAgLy8gZHluYW1pYyBsb2NraW5nCi0gIENSWVBUT19zZXRfZHlubG9ja19jcmVhdGVfY2FsbGJhY2soZHluX2NyZWF0ZSk7Ci0gIENSWVBUT19zZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrKGR5bl9sb2NrKTsKLSAgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2soZHluX2Rlc3Ryb3kpOwotfQotCi12b2lkIFRTU0xTb2NrZXRGYWN0b3J5OjpjbGVhbnVwT3BlblNTTCgpIHsKLSAgaWYgKCFpbml0aWFsaXplZCkgewotICAgIHJldHVybjsKLSAgfQotICBpbml0aWFsaXplZCA9IGZhbHNlOwotI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRCkKLSAgQ1JZUFRPX3NldF9pZF9jYWxsYmFjayhOVUxMKTsKLSNlbmRpZgotICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soTlVMTCk7Ci0gIENSWVBUT19zZXRfZHlubG9ja19jcmVhdGVfY2FsbGJhY2soTlVMTCk7Ci0gIENSWVBUT19zZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrKE5VTEwpOwotICBDUllQVE9fc2V0X2R5bmxvY2tfZGVzdHJveV9jYWxsYmFjayhOVUxMKTsKLSAgQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKTsKLSAgRVJSX2ZyZWVfc3RyaW5ncygpOwotICBFVlBfY2xlYW51cCgpOwotICBFUlJfcmVtb3ZlX3N0YXRlKDApOwotICBtdXRleGVzLnJlc2V0KCk7Ci19Ci0KLS8vIGV4dHJhY3QgZXJyb3IgbWVzc2FnZXMgZnJvbSBlcnJvciBxdWV1ZQotdm9pZCBidWlsZEVycm9ycyhzdHJpbmcmIGVycm9ycywgaW50IGVycm5vX2NvcHkpIHsKLSAgdW5zaWduZWQgbG9uZyAgZXJyb3JDb2RlOwotICBjaGFyICAgbWVzc2FnZVsyNTZdOwotCi0gIGVycm9ycy5yZXNlcnZlKDUxMik7Ci0gIHdoaWxlICgoZXJyb3JDb2RlID0gRVJSX2dldF9lcnJvcigpKSAhPSAwKSB7Ci0gICAgaWYgKCFlcnJvcnMuZW1wdHkoKSkgewotICAgICAgZXJyb3JzICs9ICI7ICI7Ci0gICAgfQotICAgIGNvbnN0IGNoYXIqIHJlYXNvbiA9IEVSUl9yZWFzb25fZXJyb3Jfc3RyaW5nKGVycm9yQ29kZSk7Ci0gICAgaWYgKHJlYXNvbiA9PSBOVUxMKSB7Ci0gICAgICBzbnByaW50ZihtZXNzYWdlLCBzaXplb2YobWVzc2FnZSkgLSAxLCAiU1NMIGVycm9yICMgJWx1IiwgZXJyb3JDb2RlKTsKLSAgICAgIHJlYXNvbiA9IG1lc3NhZ2U7Ci0gICAgfQotICAgIGVycm9ycyArPSByZWFzb247Ci0gIH0KLSAgaWYgKGVycm9ycy5lbXB0eSgpKSB7Ci0gICAgaWYgKGVycm5vX2NvcHkgIT0gMCkgewotICAgICAgZXJyb3JzICs9IFRPdXRwdXQ6OnN0cmVycm9yX3MoZXJybm9fY29weSk7Ci0gICAgfQotICB9Ci0gIGlmIChlcnJvcnMuZW1wdHkoKSkgewotICAgIGVycm9ycyA9ICJlcnJvciBjb2RlOiAiICsgbGV4aWNhbF9jYXN0PHN0cmluZz4oZXJybm9fY29weSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIEFjY2Vzc01hbmFnZXIKLSAqLwotRGVjaXNpb24gRGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXI6OnZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSkKLSAgdGhyb3coKSB7IAotICAodm9pZCkgc2E7Ci0gIHJldHVybiBTS0lQOwotfQotCi1EZWNpc2lvbiBEZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlcjo6dmVyaWZ5KGNvbnN0IHN0cmluZyYgaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpIHRocm93KCkgewotICBpZiAoaG9zdC5lbXB0eSgpIHx8IG5hbWUgPT0gTlVMTCB8fCBzaXplIDw9IDApIHsKLSAgICByZXR1cm4gU0tJUDsKLSAgfQotICByZXR1cm4gKG1hdGNoTmFtZShob3N0LmNfc3RyKCksIG5hbWUsIHNpemUpID8gQUxMT1cgOiBTS0lQKTsKLX0KLQotRGVjaXNpb24gRGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXI6OnZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpIHRocm93KCkgewotICBib29sIG1hdGNoID0gZmFsc2U7Ci0gIGlmIChzYS5zc19mYW1pbHkgPT0gQUZfSU5FVCAmJiBzaXplID09IHNpemVvZihpbl9hZGRyKSkgewotICAgIG1hdGNoID0gKG1lbWNtcCgmKChzb2NrYWRkcl9pbiopJnNhKS0+c2luX2FkZHIsIGRhdGEsIHNpemUpID09IDApOwotICB9IGVsc2UgaWYgKHNhLnNzX2ZhbWlseSA9PSBBRl9JTkVUNiAmJiBzaXplID09IHNpemVvZihpbjZfYWRkcikpIHsKLSAgICBtYXRjaCA9IChtZW1jbXAoJigoc29ja2FkZHJfaW42Kikmc2EpLT5zaW42X2FkZHIsIGRhdGEsIHNpemUpID09IDApOwotICB9Ci0gIHJldHVybiAobWF0Y2ggPyBBTExPVyA6IFNLSVApOwotfQotCi0vKioKLSAqIE1hdGNoIGEgbmFtZSB3aXRoIGEgcGF0dGVybi4gVGhlIHBhdHRlcm4gbWF5IGluY2x1ZGUgd2lsZGNhcmQuIEEgc2luZ2xlCi0gKiB3aWxkY2FyZCAiKiIgY2FuIG1hdGNoIHVwIHRvIG9uZSBjb21wb25lbnQgaW4gdGhlIGRvbWFpbiBuYW1lLgotICoKLSAqIEBwYXJhbSAgaG9zdCAgICBIb3N0IG5hbWUsIHR5cGljYWxseSB0aGUgbmFtZSBvZiB0aGUgcmVtb3RlIGhvc3QKLSAqIEBwYXJhbSAgcGF0dGVybiBOYW1lIHJldHJpZXZlZCBmcm9tIGNlcnRpZmljYXRlCi0gKiBAcGFyYW0gIHNpemUgICAgU2l6ZSBvZiAicGF0dGVybiIKLSAqIEByZXR1cm4gVHJ1ZSwgaWYgImhvc3QiIG1hdGNoZXMgInBhdHRlcm4iLiBGYWxzZSBvdGhlcndpc2UuCi0gKi8KLWJvb2wgbWF0Y2hOYW1lKGNvbnN0IGNoYXIqIGhvc3QsIGNvbnN0IGNoYXIqIHBhdHRlcm4sIGludCBzaXplKSB7Ci0gIGJvb2wgbWF0Y2ggPSBmYWxzZTsKLSAgaW50IGkgPSAwLCBqID0gMDsKLSAgd2hpbGUgKGkgPCBzaXplICYmIGhvc3Rbal0gIT0gJ1wwJykgewotICAgIGlmICh1cHBlcmNhc2UocGF0dGVybltpXSkgPT0gdXBwZXJjYXNlKGhvc3Rbal0pKSB7Ci0gICAgICBpKys7Ci0gICAgICBqKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKHBhdHRlcm5baV0gPT0gJyonKSB7Ci0gICAgICB3aGlsZSAoaG9zdFtqXSAhPSAnLicgJiYgaG9zdFtqXSAhPSAnXDAnKSB7Ci0gICAgICAgIGorKzsKLSAgICAgIH0KLSAgICAgIGkrKzsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotICBpZiAoaSA9PSBzaXplICYmIGhvc3Rbal0gPT0gJ1wwJykgewotICAgIG1hdGNoID0gdHJ1ZTsKLSAgfQotICByZXR1cm4gbWF0Y2g7Ci0KLX0KLQotLy8gVGhpcyBpcyB0byB3b3JrIGFyb3VuZCB0aGUgVHVya2lzaCBsb2NhbGUgaXNzdWUsIGkuZS4sCi0vLyB0b3VwcGVyKCdpJykgIT0gdG91cHBlcignSScpIGlmIGxvY2FsZSBpcyAidHJfVFIiCi1jaGFyIHVwcGVyY2FzZSAoY2hhciBjKSB7Ci0gIGlmICgnYScgPD0gYyAmJiBjIDw9ICd6JykgewotICAgIHJldHVybiBjICsgKCdBJyAtICdhJyk7Ci0gIH0KLSAgcmV0dXJuIGM7Ci19Ci0KLX19fQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEwYTE1MDIuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNTTFNPQ0tFVF9IXwotI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU1NMU09DS0VUX0hfIDEKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgotI2luY2x1ZGUgImNvbmN1cnJlbmN5L011dGV4LmgiCi0jaW5jbHVkZSAiVFNvY2tldC5oIgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi1jbGFzcyBBY2Nlc3NNYW5hZ2VyOwotY2xhc3MgU1NMQ29udGV4dDsKLQotLyoqCi0gKiBPcGVuU1NMIGltcGxlbWVudGF0aW9uIGZvciBTU0wgc29ja2V0IGludGVyZmFjZS4KLSAqLwotY2xhc3MgVFNTTFNvY2tldDogcHVibGljIFRTb2NrZXQgewotIHB1YmxpYzoKLSB+VFNTTFNvY2tldCgpOwotICAvKioKLSAgICogVFRyYW5zcG9ydCBpbnRlcmZhY2UuCi0gICAqLwotICBib29sICAgICBpc09wZW4oKTsKLSAgYm9vbCAgICAgcGVlaygpOwotICB2b2lkICAgICBvcGVuKCk7Ci0gIHZvaWQgICAgIGNsb3NlKCk7Ci0gIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotICB2b2lkICAgICB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0gIHZvaWQgICAgIGZsdXNoKCk7Ci0gICAvKioKLSAgICogU2V0IHdoZXRoZXIgdG8gdXNlIGNsaWVudCBvciBzZXJ2ZXIgc2lkZSBTU0wgaGFuZHNoYWtlIHByb3RvY29sLgotICAgKgotICAgKiBAcGFyYW0gZmxhZyAgVXNlIHNlcnZlciBzaWRlIGhhbmRzaGFrZSBwcm90b2NvbCBpZiB0cnVlLgotICAgKi8KLSAgdm9pZCBzZXJ2ZXIoYm9vbCBmbGFnKSB7IHNlcnZlcl8gPSBmbGFnOyB9Ci0gIC8qKgotICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgU1NMIHNvY2tldCBpcyBzZXJ2ZXIgb3IgY2xpZW50IG1vZGUuCi0gICAqLwotICBib29sIHNlcnZlcigpIGNvbnN0IHsgcmV0dXJuIHNlcnZlcl87IH0KLSAgLyoqCi0gICAqIFNldCBBY2Nlc3NNYW5hZ2VyLgotICAgKgotICAgKiBAcGFyYW0gbWFuYWdlciAgSW5zdGFuY2Ugb2YgQWNjZXNzTWFuYWdlcgotICAgKi8KLSAgdmlydHVhbCB2b2lkIGFjY2Vzcyhib29zdDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBtYW5hZ2VyKSB7Ci0gICAgYWNjZXNzXyA9IG1hbmFnZXI7Ci0gIH0KLXByb3RlY3RlZDoKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgVFNTTFNvY2tldChib29zdDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgpOwotICAvKioKLSAgICogQ29uc3RydWN0b3IsIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0IGdpdmVuIGFuIGV4aXN0aW5nIHNvY2tldC4KLSAgICoKLSAgICogQHBhcmFtIHNvY2tldCBBbiBleGlzdGluZyBzb2NrZXQKLSAgICovCi0gIFRTU0xTb2NrZXQoYm9vc3Q6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBpbnQgc29ja2V0KTsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gaG9zdCAgUmVtb3RlIGhvc3QgbmFtZQotICAgKiBAcGFyYW0gcG9ydCAgUmVtb3RlIHBvcnQgbnVtYmVyCi0gICAqLwotICBUU1NMU29ja2V0KGJvb3N0OjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBob3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQpOwotICAvKioKLSAgICogQXV0aG9yaXplIHBlZXIgYWNjZXNzIGFmdGVyIFNTTCBoYW5kc2hha2UgY29tcGxldGVzLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIGF1dGhvcml6ZSgpOwotICAvKioKLSAgICogSW5pdGlhdGUgU1NMIGhhbmRzaGFrZSBpZiBub3QgYWxyZWFkeSBpbml0aWF0ZWQuCi0gICAqLwotICB2b2lkIGNoZWNrSGFuZHNoYWtlKCk7Ci0KLSAgYm9vbCBzZXJ2ZXJfOwotICBTU0wqIHNzbF87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eF87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPEFjY2Vzc01hbmFnZXI+IGFjY2Vzc187Ci0gIGZyaWVuZCBjbGFzcyBUU1NMU29ja2V0RmFjdG9yeTsKLX07Ci0KLS8qKgotICogU1NMIHNvY2tldCBmYWN0b3J5LiBTU0wgc29ja2V0cyBzaG91bGQgYmUgY3JlYXRlZCB2aWEgU1NMIGZhY3RvcnkuCi0gKi8KLWNsYXNzIFRTU0xTb2NrZXRGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci9EZXN0cnVjdG9yCi0gICAqLwotICBUU1NMU29ja2V0RmFjdG9yeSgpOwotICB2aXJ0dWFsIH5UU1NMU29ja2V0RmFjdG9yeSgpOwotICAvKioKLSAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQgd2l0aCBhIGZyZXNoIG5ldyBzb2NrZXQuCi0gICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldCgpOwotICAvKioKLSAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQgd2l0aCB0aGUgZ2l2ZW4gc29ja2V0LgotICAgKgotICAgKiBAcGFyYW0gc29ja2V0IEFuIGV4aXN0aW5nIHNvY2tldC4KLSAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KGludCBzb2NrZXQpOwotICAgLyoqCi0gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0LgotICAgKgotICAgKiBAcGFyYW0gaG9zdCAgUmVtb3RlIGhvc3QgdG8gYmUgY29ubmVjdGVkIHRvCi0gICAqIEBwYXJhbSBwb3J0ICBSZW1vdGUgcG9ydCB0byBiZSBjb25uZWN0ZWQgdG8KLSAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCk7Ci0gIC8qKgotICAgKiBTZXQgY2lwaGVycyB0byBiZSB1c2VkIGluIFNTTCBoYW5kc2hha2UgcHJvY2Vzcy4KLSAgICoKLSAgICogQHBhcmFtIGNpcGhlcnMgIEEgbGlzdCBvZiBjaXBoZXJzCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgY2lwaGVycyhjb25zdCBzdGQ6OnN0cmluZyYgZW5hYmxlKTsKLSAgLyoqCi0gICAqIEVuYWJsZS9EaXNhYmxlIGF1dGhlbnRpY2F0aW9uLgotICAgKgotICAgKiBAcGFyYW0gcmVxdWlyZWQgUmVxdWlyZSBwZWVyIHRvIHByZXNlbnQgdmFsaWQgY2VydGlmaWNhdGUgaWYgdHJ1ZQotICAgKi8KLSAgdmlydHVhbCB2b2lkIGF1dGhlbnRpY2F0ZShib29sIHJlcXVpcmVkKTsKLSAgLyoqCi0gICAqIExvYWQgc2VydmVyIGNlcnRpZmljYXRlLgotICAgKgotICAgKiBAcGFyYW0gcGF0aCAgIFBhdGggdG8gdGhlIGNlcnRpZmljYXRlIGZpbGUKLSAgICogQHBhcmFtIGZvcm1hdCBDZXJ0aWZpY2F0ZSBmaWxlIGZvcm1hdAotICAgKi8KLSAgdmlydHVhbCB2b2lkIGxvYWRDZXJ0aWZpY2F0ZShjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBmb3JtYXQgPSAiUEVNIik7Ci0gIC8qKgotICAgKiBMb2FkIHByaXZhdGUga2V5LgotICAgKgotICAgKiBAcGFyYW0gcGF0aCAgIFBhdGggdG8gdGhlIHByaXZhdGUga2V5IGZpbGUKLSAgICogQHBhcmFtIGZvcm1hdCBQcml2YXRlIGtleSBmaWxlIGZvcm1hdAotICAgKi8KLSAgdmlydHVhbCB2b2lkIGxvYWRQcml2YXRlS2V5KGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIGZvcm1hdCA9ICJQRU0iKTsKLSAgLyoqCi0gICAqIExvYWQgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgZnJvbSBzcGVjaWZpZWQgZmlsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhdGggUGF0aCB0byB0cnVzdGVkIGNlcnRpZmljYXRlIGZpbGUKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBsb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjb25zdCBjaGFyKiBwYXRoKTsKLSAgLyoqCi0gICAqIERlZmF1bHQgcmFuZG9taXplIG1ldGhvZC4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCByYW5kb21pemUoKTsKLSAgLyoqCi0gICAqIE92ZXJyaWRlIGRlZmF1bHQgT3BlblNTTCBwYXNzd29yZCBjYWxsYmFjayB3aXRoIGdldFBhc3N3b3JkKCkuCi0gICAqLwotICB2b2lkIG92ZXJyaWRlRGVmYXVsdFBhc3N3b3JkQ2FsbGJhY2soKTsKLSAgLyoqCi0gICAqIFNldC9VbnNldCBzZXJ2ZXIgbW9kZS4KLSAgICoKLSAgICogQHBhcmFtIGZsYWcgIFNlcnZlciBtb2RlIGlmIHRydWUKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBzZXJ2ZXIoYm9vbCBmbGFnKSB7IHNlcnZlcl8gPSBmbGFnOyB9Ci0gIC8qKgotICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgc29ja2V0IGlzIGluIHNlcnZlciBvciBjbGllbnQgbW9kZS4KLSAgICoKLSAgICogQHJldHVybiB0cnVlLCBpZiBzZXJ2ZXIgbW9kZSwgb3IsIGZhbHNlLCBpZiBjbGllbnQgbW9kZQotICAgKi8KLSAgdmlydHVhbCBib29sIHNlcnZlcigpIGNvbnN0IHsgcmV0dXJuIHNlcnZlcl87IH0KLSAgLyoqCi0gICAqIFNldCBBY2Nlc3NNYW5hZ2VyLgotICAgKgotICAgKiBAcGFyYW0gbWFuYWdlciAgVGhlIEFjY2Vzc01hbmFnZXIgaW5zdGFuY2UKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBhY2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4gbWFuYWdlcikgewotICAgIGFjY2Vzc18gPSBtYW5hZ2VyOwotICB9Ci0gcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHhfOwotCi0gIHN0YXRpYyB2b2lkIGluaXRpYWxpemVPcGVuU1NMKCk7Ci0gIHN0YXRpYyB2b2lkIGNsZWFudXBPcGVuU1NMKCk7Ci0gIC8qKgotICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCBmb3IgY3VzdG9tIHBhc3N3b3JkIGNhbGxiYWNrLiBJdCBtYXkgYmUgY2FsbGVkCi0gICAqIG11bHRpcGxlIHRpbWVzIGF0IGFueSB0aW1lIGR1cmluZyBhIHNlc3Npb24gYXMgbmVjZXNzYXJ5LgotICAgKgotICAgKiBAcGFyYW0gcGFzc3dvcmQgUGFzcyBjb2xsZWN0ZWQgcGFzc3dvcmQgdG8gT3BlblNTTAotICAgKiBAcGFyYW0gc2l6ZSAgICAgTWF4aW11bSBsZW5ndGggb2YgcGFzc3dvcmQgaW5jbHVkaW5nIE5VTEwgY2hhcmFjdGVyCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgZ2V0UGFzc3dvcmQoc3RkOjpzdHJpbmcmIC8qIHBhc3N3b3JkICovLCBpbnQgLyogc2l6ZSAqLykge30KLSBwcml2YXRlOgotICBib29sIHNlcnZlcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPEFjY2Vzc01hbmFnZXI+IGFjY2Vzc187Ci0gIHN0YXRpYyBib29sIGluaXRpYWxpemVkOwotICBzdGF0aWMgY29uY3VycmVuY3k6Ok11dGV4IG11dGV4XzsKLSAgc3RhdGljIHVpbnQ2NF90IGNvdW50XzsKLSAgdm9pZCBzZXR1cChib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wpOwotICBzdGF0aWMgaW50IHBhc3N3b3JkQ2FsbGJhY2soY2hhciogcGFzc3dvcmQsIGludCBzaXplLCBpbnQsIHZvaWQqIGRhdGEpOwotfTsKLQotLyoqCi0gKiBTU0wgZXhjZXB0aW9uLgotICovCi1jbGFzcyBUU1NMRXhjZXB0aW9uOiBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0gcHVibGljOgotICBUU1NMRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKToKLSAgICBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLCBtZXNzYWdlKSB7fQotCi0gIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCkgewotICAgIGlmIChtZXNzYWdlXy5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gIlRTU0xFeGNlcHRpb24iOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gbWVzc2FnZV8uY19zdHIoKTsKLSAgICB9Ci0gIH0KLX07Ci0KLS8qKgotICogV3JhcCBPcGVuU1NMIFNTTF9DVFggaW50byBhIGNsYXNzLgotICovCi1jbGFzcyBTU0xDb250ZXh0IHsKLSBwdWJsaWM6Ci0gIFNTTENvbnRleHQoKTsKLSAgdmlydHVhbCB+U1NMQ29udGV4dCgpOwotICBTU0wqIGNyZWF0ZVNTTCgpOwotICBTU0xfQ1RYKiBnZXQoKSB7IHJldHVybiBjdHhfOyB9Ci0gcHJpdmF0ZToKLSAgU1NMX0NUWCogY3R4XzsKLX07Ci0KLS8qKgotICogQ2FsbGJhY2sgaW50ZXJmYWNlIGZvciBhY2Nlc3MgY29udHJvbC4gSXQncyBtZWFudCB0byB2ZXJpZnkgdGhlIHJlbW90ZSBob3N0LgotICogSXQncyBjb25zdHJ1Y3RlZCB3aGVuIGFwcGxpY2F0aW9uIHN0YXJ0cyBhbmQgc2V0IHRvIFRTU0xTb2NrZXRGYWN0b3J5Ci0gKiBpbnN0YW5jZS4gSXQncyBwYXNzZWQgb250byBhbGwgVFNTTFNvY2tldCBpbnN0YW5jZXMgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkKLSAqIG9iamVjdC4KLSAqLwotY2xhc3MgQWNjZXNzTWFuYWdlciB7Ci0gcHVibGljOgotICBlbnVtIERlY2lzaW9uIHsKLSAgICBERU5ZICAgPSAtMSwgICAgLy8gZGVueSBhY2Nlc3MKLSAgICBTS0lQICAgPSAgMCwgICAgLy8gY2Fubm90IG1ha2UgZGVjaXNpb24sIG1vdmUgb24gdG8gbmV4dCAoaWYgYW55KQotICAgIEFMTE9XICA9ICAxICAgICAvLyBhbGxvdyBhY2Nlc3MKLSAgfTsKLSAvKioKLSAgKiBEZXN0cnVjdG9yCi0gICovCi0gdmlydHVhbCB+QWNjZXNzTWFuYWdlcigpIHt9Ci0gLyoqCi0gICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBlZXIgc2hvdWxkIGJlIGdyYW50ZWQgYWNjZXNzIG9yIG5vdC4gSXQncyBjYWxsZWQKLSAgKiBvbmNlIGFmdGVyIHRoZSBTU0wgaGFuZHNoYWtlIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHksIGJlZm9yZSBwZWVyIGNlcnRpZmljYXRlCi0gICogaXMgZXhhbWluZWQuCi0gICoKLSAgKiBJZiBhIHZhbGlkIGRlY2lzaW9uIChBTExPVyBvciBERU5ZKSBpcyByZXR1cm5lZCwgdGhlIHBlZXIgY2VydGlmaWNhdGUgaXMKLSAgKiBub3QgdG8gYmUgdmVyaWZpZWQuCi0gICoKLSAgKiBAcGFyYW0gIHNhIFBlZXIgSVAgYWRkcmVzcwotICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcGVlciBpcyB0cnVzdGVkLCBmYWxzZSBvdGhlcndpc2UKLSAgKi8KLSB2aXJ0dWFsIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiAvKiBzYSAqLyApIHRocm93KCkgeyByZXR1cm4gREVOWTsgfQotIC8qKgotICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBwZWVyIHNob3VsZCBiZSBncmFudGVkIGFjY2VzcyBvciBub3QuIEl0J3MgY2FsbGVkCi0gICogZXZlcnkgdGltZSBhIEROUyBzdWJqZWN0QWx0TmFtZS9jb21tb24gbmFtZSBpcyBleHRyYWN0ZWQgZnJvbSBwZWVyJ3MKLSAgKiBjZXJ0aWZpY2F0ZS4KLSAgKgotICAqIEBwYXJhbSAgaG9zdCBDbGllbnQgbW9kZTogaG9zdCBuYW1lIHJldHVybmVkIGJ5IFRTb2NrZXQ6OmdldEhvc3QoKQotICAqICAgICAgICAgICAgICBTZXJ2ZXIgbW9kZTogaG9zdCBuYW1lIHJldHVybmVkIGJ5IFRTb2NrZXQ6OmdldFBlZXJIb3N0KCkKLSAgKiBAcGFyYW0gIG5hbWUgU3ViamVjdEFsdE5hbWUgb3IgY29tbW9uIG5hbWUgZXh0cmFjdGVkIGZyb20gcGVlciBjZXJ0aWZpY2F0ZQotICAqIEBwYXJhbSAgc2l6ZSBMZW5ndGggb2YgbmFtZQotICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcGVlciBpcyB0cnVzdGVkLCBmYWxzZSBvdGhlcndpc2UKLSAgKgotICAqIE5vdGU6IFRoZSAibmFtZSIgcGFyYW1ldGVyIG1heSBiZSBVVEY4IGVuY29kZWQuCi0gICovCi0gdmlydHVhbCBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc3RkOjpzdHJpbmcmIC8qIGhvc3QgKi8sIGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8sIGludCAvKiBzaXplICovKQotICAgdGhyb3coKSB7IHJldHVybiBERU5ZOyB9Ci0gLyoqCi0gICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBlZXIgc2hvdWxkIGJlIGdyYW50ZWQgYWNjZXNzIG9yIG5vdC4gSXQncyBjYWxsZWQKLSAgKiBldmVyeSB0aW1lIGFuIElQIHN1YmplY3RBbHROYW1lIGlzIGV4dHJhY3RlZCBmcm9tIHBlZXIncyBjZXJ0aWZpY2F0ZS4KLSAgKgotICAqIEBwYXJhbSAgc2EgICBQZWVyIElQIGFkZHJlc3MgcmV0cmlldmVkIGZyb20gdGhlIHVuZGVybHlpbmcgc29ja2V0Ci0gICogQHBhcmFtICBkYXRhIElQIGFkZHJlc3MgZXh0cmFjdGVkIGZyb20gY2VydGlmaWNhdGUKLSAgKiBAcGFyYW0gIHNpemUgTGVuZ3RoIG9mIHRoZSBJUCBhZGRyZXNzCi0gICogQHJldHVybiBUcnVlIGlmIHRoZSBwZWVyIGlzIHRydXN0ZWQsIGZhbHNlIG90aGVyd2lzZQotICAqLwotIHZpcnR1YWwgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIC8qIHNhICovLCBjb25zdCBjaGFyKiAvKiBkYXRhICovLCBpbnQgLyogc2l6ZSAqLykKLSAgIHRocm93KCkgeyByZXR1cm4gREVOWTsgfQotfTsKLQotdHlwZWRlZiBBY2Nlc3NNYW5hZ2VyOjpEZWNpc2lvbiBEZWNpc2lvbjsKLQotY2xhc3MgRGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXI6IHB1YmxpYyBBY2Nlc3NNYW5hZ2VyIHsKLSBwdWJsaWM6Ci0gIC8vIEFjY2Vzc01hbmFnZXIgaW50ZXJmYWNlCi0gIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSkgdGhyb3coKTsKLSAgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBjb25zdCBjaGFyKiBuYW1lLCBpbnQgc2l6ZSkgdGhyb3coKTsKLSAgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhLCBjb25zdCBjaGFyKiBkYXRhLCBpbnQgc2l6ZSkgdGhyb3coKTsKLX07Ci0KLQotfX19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWQzM2UwLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvdW4uaD4KLSNpbmNsdWRlIDxzeXMvcG9sbC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAiVFNvY2tldC5oIgotI2luY2x1ZGUgIlRTZXJ2ZXJTb2NrZXQuaCIKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotI2lmbmRlZiBBRl9MT0NBTAotI2RlZmluZSBBRl9MT0NBTCBBRl9VTklYCi0jZW5kaWYKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotCi1UU2VydmVyU29ja2V0OjpUU2VydmVyU29ja2V0KGludCBwb3J0KSA6Ci0gIHBvcnRfKHBvcnQpLAotICBzZXJ2ZXJTb2NrZXRfKC0xKSwKLSAgYWNjZXB0QmFja2xvZ18oMTAyNCksCi0gIHNlbmRUaW1lb3V0XygwKSwKLSAgcmVjdlRpbWVvdXRfKDApLAotICByZXRyeUxpbWl0XygwKSwKLSAgcmV0cnlEZWxheV8oMCksCi0gIHRjcFNlbmRCdWZmZXJfKDApLAotICB0Y3BSZWN2QnVmZmVyXygwKSwKLSAgaW50U29jazFfKC0xKSwKLSAgaW50U29jazJfKC0xKSB7fQotCi1UU2VydmVyU29ja2V0OjpUU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgc2VuZFRpbWVvdXQsIGludCByZWN2VGltZW91dCkgOgotICBwb3J0Xyhwb3J0KSwKLSAgc2VydmVyU29ja2V0XygtMSksCi0gIGFjY2VwdEJhY2tsb2dfKDEwMjQpLAotICBzZW5kVGltZW91dF8oc2VuZFRpbWVvdXQpLAotICByZWN2VGltZW91dF8ocmVjdlRpbWVvdXQpLAotICByZXRyeUxpbWl0XygwKSwKLSAgcmV0cnlEZWxheV8oMCksCi0gIHRjcFNlbmRCdWZmZXJfKDApLAotICB0Y3BSZWN2QnVmZmVyXygwKSwKLSAgaW50U29jazFfKC0xKSwKLSAgaW50U29jazJfKC0xKSB7fQotCi1UU2VydmVyU29ja2V0OjpUU2VydmVyU29ja2V0KHN0cmluZyBwYXRoKSA6Ci0gIHBvcnRfKDApLAotICBwYXRoXyhwYXRoKSwKLSAgc2VydmVyU29ja2V0XygtMSksCi0gIGFjY2VwdEJhY2tsb2dfKDEwMjQpLAotICBzZW5kVGltZW91dF8oMCksCi0gIHJlY3ZUaW1lb3V0XygwKSwKLSAgcmV0cnlMaW1pdF8oMCksCi0gIHJldHJ5RGVsYXlfKDApLAotICB0Y3BTZW5kQnVmZmVyXygwKSwKLSAgdGNwUmVjdkJ1ZmZlcl8oMCksCi0gIGludFNvY2sxXygtMSksCi0gIGludFNvY2syXygtMSkge30KLQotVFNlcnZlclNvY2tldDo6flRTZXJ2ZXJTb2NrZXQoKSB7Ci0gIGNsb3NlKCk7Ci19Ci0KLXZvaWQgVFNlcnZlclNvY2tldDo6c2V0U2VuZFRpbWVvdXQoaW50IHNlbmRUaW1lb3V0KSB7Ci0gIHNlbmRUaW1lb3V0XyA9IHNlbmRUaW1lb3V0OwotfQotCi12b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldFJlY3ZUaW1lb3V0KGludCByZWN2VGltZW91dCkgewotICByZWN2VGltZW91dF8gPSByZWN2VGltZW91dDsKLX0KLQotdm9pZCBUU2VydmVyU29ja2V0OjpzZXRSZXRyeUxpbWl0KGludCByZXRyeUxpbWl0KSB7Ci0gIHJldHJ5TGltaXRfID0gcmV0cnlMaW1pdDsKLX0KLQotdm9pZCBUU2VydmVyU29ja2V0OjpzZXRSZXRyeURlbGF5KGludCByZXRyeURlbGF5KSB7Ci0gIHJldHJ5RGVsYXlfID0gcmV0cnlEZWxheTsKLX0KLQotdm9pZCBUU2VydmVyU29ja2V0OjpzZXRUY3BTZW5kQnVmZmVyKGludCB0Y3BTZW5kQnVmZmVyKSB7Ci0gIHRjcFNlbmRCdWZmZXJfID0gdGNwU2VuZEJ1ZmZlcjsKLX0KLQotdm9pZCBUU2VydmVyU29ja2V0OjpzZXRUY3BSZWN2QnVmZmVyKGludCB0Y3BSZWN2QnVmZmVyKSB7Ci0gIHRjcFJlY3ZCdWZmZXJfID0gdGNwUmVjdkJ1ZmZlcjsKLX0KLQotdm9pZCBUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSB7Ci0gIGludCBzdlsyXTsKLSAgaWYgKC0xID09IHNvY2tldHBhaXIoQUZfTE9DQUwsIFNPQ0tfU1RSRUFNLCAwLCBzdikpIHsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzb2NrZXRwYWlyKCkgIiwgZXJybm8pOwotICAgIGludFNvY2sxXyA9IC0xOwotICAgIGludFNvY2syXyA9IC0xOwotICB9IGVsc2UgewotICAgIGludFNvY2sxXyA9IHN2WzFdOwotICAgIGludFNvY2syXyA9IHN2WzBdOwotICB9Ci0KLSAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzLCAqcmVzMDsKLSAgaW50IGVycm9yOwotICBjaGFyIHBvcnRbc2l6ZW9mKCI2NTUzNiIpICsgMV07Ci0gIHN0ZDo6bWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7Ci0gIGhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKLSAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKLSAgaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFIHwgQUlfQUREUkNPTkZJRzsKLSAgc3ByaW50Zihwb3J0LCAiJWQiLCBwb3J0Xyk7Ci0KLSAgLy8gV2lsZGNhcmQgYWRkcmVzcwotICBlcnJvciA9IGdldGFkZHJpbmZvKE5VTEwsIHBvcnQsICZoaW50cywgJnJlczApOwotICBpZiAoZXJyb3IpIHsKLSAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJnZXRhZGRyaW5mbyAlZDogJXMiLCBlcnJvciwgZ2FpX3N0cmVycm9yKGVycm9yKSk7Ci0gICAgY2xvc2UoKTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHJlc29sdmUgaG9zdCBmb3Igc2VydmVyIHNvY2tldC4iKTsKLSAgfQotCi0gIC8vIFBpY2sgdGhlIGlwdjYgYWRkcmVzcyBmaXJzdCBzaW5jZSBpcHY0IGFkZHJlc3NlcyBjYW4gYmUgbWFwcGVkCi0gIC8vIGludG8gaXB2NiBzcGFjZS4KLSAgZm9yIChyZXMgPSByZXMwOyByZXM7IHJlcyA9IHJlcy0+YWlfbmV4dCkgewotICAgIGlmIChyZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUNiB8fCByZXMtPmFpX25leHQgPT0gTlVMTCkKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKCEgcGF0aF8uZW1wdHkoKSkgewotICAgIHNlcnZlclNvY2tldF8gPSBzb2NrZXQoUEZfVU5JWCwgU09DS19TVFJFQU0sIElQUFJPVE9fSVApOwotICB9IGVsc2UgewotICAgIHNlcnZlclNvY2tldF8gPSBzb2NrZXQocmVzLT5haV9mYW1pbHksIHJlcy0+YWlfc29ja3R5cGUsIHJlcy0+YWlfcHJvdG9jb2wpOwotICB9Ci0KLSAgaWYgKHNlcnZlclNvY2tldF8gPT0gLTEpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNvY2tldCgpICIsIGVycm5vX2NvcHkpOwotICAgIGNsb3NlKCk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBjcmVhdGUgc2VydmVyIHNvY2tldC4iLCBlcnJub19jb3B5KTsKLSAgfQotCi0gIC8vIFNldCByZXVzYWRkcmVzcyB0byBwcmV2ZW50IDJNU0wgZGVsYXkgb24gYWNjZXB0Ci0gIGludCBvbmUgPSAxOwotICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsCi0gICAgICAgICAgICAgICAgICAgICAgICZvbmUsIHNpemVvZihvbmUpKSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1JFVVNFQUREUiAiLCBlcnJub19jb3B5KTsKLSAgICBjbG9zZSgpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3Qgc2V0IFNPX1JFVVNFQUREUiIsIGVycm5vX2NvcHkpOwotICB9Ci0KLSAgLy8gU2V0IFRDUCBidWZmZXIgc2l6ZXMKLSAgaWYgKHRjcFNlbmRCdWZmZXJfID4gMCkgewotICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmdGNwU2VuZEJ1ZmZlcl8sIHNpemVvZih0Y3BTZW5kQnVmZmVyXykpKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1NOREJVRiAiLCBlcnJub19jb3B5KTsKLSAgICAgIGNsb3NlKCk7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHNldCBTT19TTkRCVUYiLCBlcnJub19jb3B5KTsKLSAgICB9Ci0gIH0KLQotICBpZiAodGNwUmVjdkJ1ZmZlcl8gPiAwKSB7Ci0gICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgU09MX1NPQ0tFVCwgU09fUkNWQlVGLAotICAgICAgICAgICAgICAgICAgICAgICAgICZ0Y3BSZWN2QnVmZmVyXywgc2l6ZW9mKHRjcFJlY3ZCdWZmZXJfKSkpIHsKLSAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fUkNWQlVGICIsIGVycm5vX2NvcHkpOwotICAgICAgY2xvc2UoKTsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3Qgc2V0IFNPX1JDVkJVRiIsIGVycm5vX2NvcHkpOwotICAgIH0KLSAgfQotCi0gIC8vIERlZmVyIGFjY2VwdAotICAjaWZkZWYgVENQX0RFRkVSX0FDQ0VQVAotICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBTT0xfU09DS0VULCBUQ1BfREVGRVJfQUNDRVBULAotICAgICAgICAgICAgICAgICAgICAgICAmb25lLCBzaXplb2Yob25lKSkpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBUQ1BfREVGRVJfQUNDRVBUICIsIGVycm5vX2NvcHkpOwotICAgIGNsb3NlKCk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBzZXQgVENQX0RFRkVSX0FDQ0VQVCIsIGVycm5vX2NvcHkpOwotICB9Ci0gICNlbmRpZiAvLyAjaWZkZWYgVENQX0RFRkVSX0FDQ0VQVAotCi0gICNpZmRlZiBJUFY2X1Y2T05MWQotICBpZiAocmVzLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYgJiYgcGF0aF8uZW1wdHkoKSkgewotICAgIGludCB6ZXJvID0gMDsKLSAgICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBJUFBST1RPX0lQVjYsIElQVjZfVjZPTkxZLCAKLSAgICAgICAgICAmemVybywgc2l6ZW9mKHplcm8pKSkgewotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgSVBWNl9WNk9OTFkgIiwgZXJybm8pOwotICAgIH0KLSAgfQotICAjZW5kaWYgLy8gI2lmZGVmIElQVjZfVjZPTkxZCi0KLSAgLy8gVHVybiBsaW5nZXIgb2ZmLCBkb24ndCB3YW50IHRvIGJsb2NrIG9uIGNhbGxzIHRvIGNsb3NlCi0gIHN0cnVjdCBsaW5nZXIgbGluZyA9IHswLCAwfTsKLSAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgU09MX1NPQ0tFVCwgU09fTElOR0VSLAotICAgICAgICAgICAgICAgICAgICAgICAmbGluZywgc2l6ZW9mKGxpbmcpKSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX0xJTkdFUiAiLCBlcnJub19jb3B5KTsKLSAgICBjbG9zZSgpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3Qgc2V0IFNPX0xJTkdFUiIsIGVycm5vX2NvcHkpOwotICB9Ci0KLSAgLy8gVW5peCBTb2NrZXRzIGRvIG5vdCBuZWVkIHRoYXQKLSAgaWYgKHBhdGhfLmVtcHR5KCkpIHsKLSAgICAvLyBUQ1AgTm9kZWxheSwgc3BlZWQgb3ZlciBiYW5kd2lkdGgKLSAgICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgJm9uZSwgc2l6ZW9mKG9uZSkpKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFRDUF9OT0RFTEFZICIsIGVycm5vX2NvcHkpOwotICAgICAgY2xvc2UoKTsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3Qgc2V0IFRDUF9OT0RFTEFZIiwgZXJybm9fY29weSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gU2V0IE5PTkJMT0NLIG9uIHRoZSBhY2NlcHQgc29ja2V0Ci0gIGludCBmbGFncyA9IGZjbnRsKHNlcnZlclNvY2tldF8sIEZfR0VURkwsIDApOwotICBpZiAoZmxhZ3MgPT0gLTEpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIGZjbnRsKCkgRl9HRVRGTCAiLCBlcnJub19jb3B5KTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiZmNudGwoKSBmYWlsZWQiLCBlcnJub19jb3B5KTsKLSAgfQotCi0gIGlmICgtMSA9PSBmY250bChzZXJ2ZXJTb2NrZXRfLCBGX1NFVEZMLCBmbGFncyB8IE9fTk9OQkxPQ0spKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBmY250bCgpIE9fTk9OQkxPQ0sgIiwgZXJybm9fY29weSk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgImZjbnRsKCkgZmFpbGVkIiwgZXJybm9fY29weSk7Ci0gIH0KLQotICAvLyBwcmVwYXJlIHRoZSBwb3J0IGluZm9ybWF0aW9uCi0gIC8vIHdlIG1heSB3YW50IHRvIHRyeSB0byBiaW5kIG1vcmUgdGhhbiBvbmNlLCBzaW5jZSBTT19SRVVTRUFERFIgZG9lc24ndAotICAvLyBhbHdheXMgc2VlbSB0byB3b3JrLiBUaGUgY2xpZW50IGNhbiBjb25maWd1cmUgdGhlIHJldHJ5IHZhcmlhYmxlcy4KLSAgaW50IHJldHJpZXMgPSAwOwotCi0gIGlmICghIHBhdGhfLmVtcHR5KCkpIHsKLSAgICAvLyBVbml4IERvbWFpbiBTb2NrZXQKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcmVzczsKLSAgICBzb2NrbGVuX3QgbGVuOwotCi0gICAgaWYgKHBhdGhfLmxlbmd0aCgpID4gc2l6ZW9mKGFkZHJlc3Muc3VuX3BhdGgpKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6bGlzdGVuKCkgVW5peCBEb21haW4gc29ja2V0IHBhdGggdG9vIGxvbmciLCBlcnJub19jb3B5KTsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICIgVW5peCBEb21haW4gc29ja2V0IHBhdGggdG9vIGxvbmciKTsKLSAgICB9Ci0KLSAgICBhZGRyZXNzLnN1bl9mYW1pbHkgPSBBRl9VTklYOwotICAgIHNucHJpbnRmKGFkZHJlc3Muc3VuX3BhdGgsIHNpemVvZihhZGRyZXNzLnN1bl9wYXRoKSwgIiVzIiwgcGF0aF8uY19zdHIoKSk7Ci0gICAgbGVuID0gc2l6ZW9mKGFkZHJlc3MpOwotCi0gICAgZG8gewotICAgICAgaWYgKDAgPT0gYmluZChzZXJ2ZXJTb2NrZXRfLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyZXNzLCBsZW4pKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgLy8gdXNlIHNob3J0IGNpcmN1aXQgZXZhbHVhdGlvbiBoZXJlIHRvIG9ubHkgc2xlZXAgaWYgd2UgbmVlZCB0bwotICAgIH0gd2hpbGUgKChyZXRyaWVzKysgPCByZXRyeUxpbWl0XykgJiYgKHNsZWVwKHJldHJ5RGVsYXlfKSA9PSAwKSk7Ci0gIH0gZWxzZSB7Ci0gICAgZG8gewotICAgICAgaWYgKDAgPT0gYmluZChzZXJ2ZXJTb2NrZXRfLCByZXMtPmFpX2FkZHIsIHJlcy0+YWlfYWRkcmxlbikpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAvLyB1c2Ugc2hvcnQgY2lyY3VpdCBldmFsdWF0aW9uIGhlcmUgdG8gb25seSBzbGVlcCBpZiB3ZSBuZWVkIHRvCi0gICAgfSB3aGlsZSAoKHJldHJpZXMrKyA8IHJldHJ5TGltaXRfKSAmJiAoc2xlZXAocmV0cnlEZWxheV8pID09IDApKTsKLQotICAgIC8vIGZyZWUgYWRkcmluZm8KLSAgICBmcmVlYWRkcmluZm8ocmVzMCk7Ci0gIH0KLQotICAvLyB0aHJvdyBhbiBlcnJvciBpZiB3ZSBmYWlsZWQgdG8gYmluZCBwcm9wZXJseQotICBpZiAocmV0cmllcyA+IHJldHJ5TGltaXRfKSB7Ci0gICAgY2hhciBlcnJidWZbMTAyNF07Ci0gICAgaWYgKCEgcGF0aF8uZW1wdHkoKSkgewotICAgICAgc3ByaW50ZihlcnJidWYsICJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBQQVRIICVzIiwgcGF0aF8uY19zdHIoKSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgc3ByaW50ZihlcnJidWYsICJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBCSU5EICVkIiwgcG9ydF8pOwotICAgIH0KLSAgICBHbG9iYWxPdXRwdXQoZXJyYnVmKTsKLSAgICBjbG9zZSgpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3QgYmluZCIpOwotICB9Ci0KLSAgLy8gQ2FsbCBsaXN0ZW4KLSAgaWYgKC0xID09IDo6bGlzdGVuKHNlcnZlclNvY2tldF8sIGFjY2VwdEJhY2tsb2dfKSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgbGlzdGVuKCkgIiwgZXJybm9fY29weSk7Ci0gICAgY2xvc2UoKTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IGxpc3RlbiIsIGVycm5vX2NvcHkpOwotICB9Ci0KLSAgLy8gVGhlIHNvY2tldCBpcyBub3cgbGlzdGVuaW5nIQotfQotCi1zaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IFRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSB7Ci0gIGlmIChzZXJ2ZXJTb2NrZXRfIDwgMCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJUU2VydmVyU29ja2V0IG5vdCBsaXN0ZW5pbmciKTsKLSAgfQotCi0gIHN0cnVjdCBwb2xsZmQgZmRzWzJdOwotCi0gIGludCBtYXhFaW50cnMgPSA1OwotICBpbnQgbnVtRWludHJzID0gMDsKLQotICB3aGlsZSAodHJ1ZSkgewotICAgIHN0ZDo6bWVtc2V0KGZkcywgMCAsIHNpemVvZihmZHMpKTsKLSAgICBmZHNbMF0uZmQgPSBzZXJ2ZXJTb2NrZXRfOwotICAgIGZkc1swXS5ldmVudHMgPSBQT0xMSU47Ci0gICAgaWYgKGludFNvY2syXyA+PSAwKSB7Ci0gICAgICBmZHNbMV0uZmQgPSBpbnRTb2NrMl87Ci0gICAgICBmZHNbMV0uZXZlbnRzID0gUE9MTElOOwotICAgIH0KLSAgICBpbnQgcmV0ID0gcG9sbChmZHMsIDIsIC0xKTsKLQotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAvLyBlcnJvciBjYXNlcwotICAgICAgaWYgKGVycm5vID09IEVJTlRSICYmIChudW1FaW50cnMrKyA8IG1heEVpbnRycykpIHsKLSAgICAgICAgLy8gRUlOVFIgbmVlZHMgdG8gYmUgaGFuZGxlZCBtYW51YWxseSBhbmQgd2UgY2FuIHRvbGVyYXRlCi0gICAgICAgIC8vIGEgY2VydGFpbiBudW1iZXIKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIHBvbGwoKSAiLCBlcnJub19jb3B5KTsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlVua25vd24iLCBlcnJub19jb3B5KTsKLSAgICB9IGVsc2UgaWYgKHJldCA+IDApIHsKLSAgICAgIC8vIENoZWNrIGZvciBhbiBpbnRlcnJ1cHQgc2lnbmFsCi0gICAgICBpZiAoaW50U29jazJfID49IDAgJiYgKGZkc1sxXS5yZXZlbnRzICYgUE9MTElOKSkgewotICAgICAgICBpbnQ4X3QgYnVmOwotICAgICAgICBpZiAoLTEgPT0gcmVjdihpbnRTb2NrMl8sICZidWYsIHNpemVvZihpbnQ4X3QpLCAwKSkgewotICAgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSByZWN2KCkgaW50ZXJydXB0ICIsIGVycm5vKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVEKTsKLSAgICAgIH0KLQotICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBhY3R1YWwgc2VydmVyIHNvY2tldCBiZWluZyByZWFkeQotICAgICAgaWYgKGZkc1swXS5yZXZlbnRzICYgUE9MTElOKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBHbG9iYWxPdXRwdXQoIlRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSBwb2xsIDAiKTsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTik7Ci0gICAgfQotICB9Ci0KLSAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgY2xpZW50QWRkcmVzczsKLSAgaW50IHNpemUgPSBzaXplb2YoY2xpZW50QWRkcmVzcyk7Ci0gIGludCBjbGllbnRTb2NrZXQgPSA6OmFjY2VwdChzZXJ2ZXJTb2NrZXRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmY2xpZW50QWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzb2NrbGVuX3QgKikgJnNpemUpOwotCi0gIGlmIChjbGllbnRTb2NrZXQgPCAwKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgOjphY2NlcHQoKSAiLCBlcnJub19jb3B5KTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJhY2NlcHQoKSIsIGVycm5vX2NvcHkpOwotICB9Ci0KLSAgLy8gTWFrZSBzdXJlIGNsaWVudCBzb2NrZXQgaXMgYmxvY2tpbmcKLSAgaW50IGZsYWdzID0gZmNudGwoY2xpZW50U29ja2V0LCBGX0dFVEZMLCAwKTsKLSAgaWYgKGZsYWdzID09IC0xKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgZmNudGwoKSBGX0dFVEZMICIsIGVycm5vX2NvcHkpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgImZjbnRsKEZfR0VURkwpIiwgZXJybm9fY29weSk7Ci0gIH0KLQotICBpZiAoLTEgPT0gZmNudGwoY2xpZW50U29ja2V0LCBGX1NFVEZMLCBmbGFncyAmIH5PX05PTkJMT0NLKSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIGZjbnRsKCkgRl9TRVRGTCB+T19OT05CTE9DSyAiLCBlcnJub19jb3B5KTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJmY250bChGX1NFVEZMKSIsIGVycm5vX2NvcHkpOwotICB9Ci0KLSAgc2hhcmVkX3B0cjxUU29ja2V0PiBjbGllbnQgPSBjcmVhdGVTb2NrZXQoY2xpZW50U29ja2V0KTsKLSAgaWYgKHNlbmRUaW1lb3V0XyA+IDApIHsKLSAgICBjbGllbnQtPnNldFNlbmRUaW1lb3V0KHNlbmRUaW1lb3V0Xyk7Ci0gIH0KLSAgaWYgKHJlY3ZUaW1lb3V0XyA+IDApIHsKLSAgICBjbGllbnQtPnNldFJlY3ZUaW1lb3V0KHJlY3ZUaW1lb3V0Xyk7Ci0gIH0KLSAgY2xpZW50LT5zZXRDYWNoZWRBZGRyZXNzKChzb2NrYWRkciopICZjbGllbnRBZGRyZXNzLCBzaXplKTsKLSAgCi0gIHJldHVybiBjbGllbnQ7Ci19Ci0KLXNoYXJlZF9wdHI8VFNvY2tldD4gVFNlcnZlclNvY2tldDo6Y3JlYXRlU29ja2V0KGludCBjbGllbnRTb2NrZXQpIHsKLSAgcmV0dXJuIHNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoY2xpZW50U29ja2V0KSk7Ci19Ci0KLXZvaWQgVFNlcnZlclNvY2tldDo6aW50ZXJydXB0KCkgewotICBpZiAoaW50U29jazFfID49IDApIHsKLSAgICBpbnQ4X3QgYnl0ZSA9IDA7Ci0gICAgaWYgKC0xID09IHNlbmQoaW50U29jazFfLCAmYnl0ZSwgc2l6ZW9mKGludDhfdCksIDApKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjppbnRlcnJ1cHQoKSBzZW5kKCkgIiwgZXJybm8pOwotICAgIH0KLSAgfQotfQotCi12b2lkIFRTZXJ2ZXJTb2NrZXQ6OmNsb3NlKCkgewotICBpZiAoc2VydmVyU29ja2V0XyA+PSAwKSB7Ci0gICAgc2h1dGRvd24oc2VydmVyU29ja2V0XywgU0hVVF9SRFdSKTsKLSAgICA6OmNsb3NlKHNlcnZlclNvY2tldF8pOwotICB9Ci0gIGlmIChpbnRTb2NrMV8gPj0gMCkgewotICAgIDo6Y2xvc2UoaW50U29jazFfKTsKLSAgfQotICBpZiAoaW50U29jazJfID49IDApIHsKLSAgICA6OmNsb3NlKGludFNvY2syXyk7Ci0gIH0KLSAgc2VydmVyU29ja2V0XyA9IC0xOwotICBpbnRTb2NrMV8gPSAtMTsKLSAgaW50U29jazJfID0gLTE7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBhMTE0OC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJTT0NLRVRfSF8KLSNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlNPQ0tFVF9IXyAxCi0KLSNpbmNsdWRlICJUU2VydmVyVHJhbnNwb3J0LmgiCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLWNsYXNzIFRTb2NrZXQ7Ci0KLS8qKgotICogU2VydmVyIHNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBUU2VydmVyVHJhbnNwb3J0LiBXcmFwcGVyIGFyb3VuZCBhIHVuaXgKLSAqIHNvY2tldCBsaXN0ZW4gYW5kIGFjY2VwdCBjYWxscy4KLSAqCi0gKi8KLWNsYXNzIFRTZXJ2ZXJTb2NrZXQgOiBwdWJsaWMgVFNlcnZlclRyYW5zcG9ydCB7Ci0gcHVibGljOgotICBUU2VydmVyU29ja2V0KGludCBwb3J0KTsKLSAgVFNlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IHNlbmRUaW1lb3V0LCBpbnQgcmVjdlRpbWVvdXQpOwotICBUU2VydmVyU29ja2V0KHN0ZDo6c3RyaW5nIHBhdGgpOwotCi0gIH5UU2VydmVyU29ja2V0KCk7Ci0KLSAgdm9pZCBzZXRTZW5kVGltZW91dChpbnQgc2VuZFRpbWVvdXQpOwotICB2b2lkIHNldFJlY3ZUaW1lb3V0KGludCByZWN2VGltZW91dCk7Ci0KLSAgdm9pZCBzZXRSZXRyeUxpbWl0KGludCByZXRyeUxpbWl0KTsKLSAgdm9pZCBzZXRSZXRyeURlbGF5KGludCByZXRyeURlbGF5KTsKLQotICB2b2lkIHNldFRjcFNlbmRCdWZmZXIoaW50IHRjcFNlbmRCdWZmZXIpOwotICB2b2lkIHNldFRjcFJlY3ZCdWZmZXIoaW50IHRjcFJlY3ZCdWZmZXIpOwotCi0gIHZvaWQgbGlzdGVuKCk7Ci0gIHZvaWQgY2xvc2UoKTsKLQotICB2b2lkIGludGVycnVwdCgpOwotCi0gcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCk7Ci0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gY3JlYXRlU29ja2V0KGludCBjbGllbnQpOwotCi0gcHJpdmF0ZToKLSAgaW50IHBvcnRfOwotICBzdGQ6OnN0cmluZyBwYXRoXzsKLSAgaW50IHNlcnZlclNvY2tldF87Ci0gIGludCBhY2NlcHRCYWNrbG9nXzsKLSAgaW50IHNlbmRUaW1lb3V0XzsKLSAgaW50IHJlY3ZUaW1lb3V0XzsKLSAgaW50IHJldHJ5TGltaXRfOwotICBpbnQgcmV0cnlEZWxheV87Ci0gIGludCB0Y3BTZW5kQnVmZmVyXzsKLSAgaW50IHRjcFJlY3ZCdWZmZXJfOwotCi0gIGludCBpbnRTb2NrMV87Ci0gIGludCBpbnRTb2NrMl87Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSU09DS0VUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBiYmM2Yy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJUUkFOU1BPUlRfSF8KLSNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlRSQU5TUE9SVF9IXyAxCi0KLSNpbmNsdWRlICJUVHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAiVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi0vKioKLSAqIFNlcnZlciB0cmFuc3BvcnQgZnJhbWV3b3JrLiBBIHNlcnZlciBuZWVkcyB0byBoYXZlIHNvbWUgZmFjaWxpdHkgZm9yCi0gKiBjcmVhdGluZyBiYXNlIHRyYW5zcG9ydHMgdG8gcmVhZC93cml0ZSBmcm9tLgotICoKLSAqLwotY2xhc3MgVFNlcnZlclRyYW5zcG9ydCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5UU2VydmVyVHJhbnNwb3J0KCkge30KLQotICAvKioKLSAgICogU3RhcnRzIHRoZSBzZXJ2ZXIgdHJhbnNwb3J0IGxpc3RlbmluZyBmb3IgbmV3IGNvbm5lY3Rpb25zLiBQcmlvciB0byB0aGlzCi0gICAqIGNhbGwgbW9zdCB0cmFuc3BvcnRzIHdpbGwgbm90IHJldHVybiBhbnl0aGluZyB3aGVuIGFjY2VwdCBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB3ZSB3ZXJlIHVuYWJsZSB0byBsaXN0ZW4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBsaXN0ZW4oKSB7fQotCi0gIC8qKgotICAgKiBHZXRzIGEgbmV3IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB0cmFuc3BvcnQgb2JqZWN0IGFuZCBwYXNzZXMgaXQgdG8gdGhlCi0gICAqIGNhbGxlci4gTm90ZSB0aGF0IGl0IGlzIHRoZSBleHBsaWNpdCBkdXR5IG9mIHRoZSBjYWxsZXIgdG8gZnJlZSB0aGUKLSAgICogYWxsb2NhdGVkIG9iamVjdC4gVGhlIHJldHVybmVkIFRUcmFuc3BvcnQgb2JqZWN0IG11c3QgYWx3YXlzIGJlIGluIHRoZQotICAgKiBvcGVuZWQgc3RhdGUuIE5VTEwgc2hvdWxkIG5ldmVyIGJlIHJldHVybmVkLCBpbnN0ZWFkIGFuIEV4Y2VwdGlvbiBzaG91bGQKLSAgICogYWx3YXlzIGJlIHRocm93bi4KLSAgICoKLSAgICogQHJldHVybiBBIG5ldyBUVHJhbnNwb3J0IG9iamVjdAotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IKLSAgICovCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdCgpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiByZXN1bHQgPSBhY2NlcHRJbXBsKCk7Ci0gICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJhY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMIik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogRm9yICJzbWFydCIgVFNlcnZlclRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMgdGhhdCB3b3JrIGluIGEgbXVsdGkKLSAgICogdGhyZWFkZWQgY29udGV4dCB0aGlzIGNhbiBiZSB1c2VkIHRvIGJyZWFrIG91dCBvZiBhbiBhY2NlcHQoKSBjYWxsLgotICAgKiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSB0cmFuc3BvcnQgd2lsbCB0aHJvdyBhIFRUcmFuc3BvcnRFeGNlcHRpb24KLSAgICogd2l0aCB0aGUgaW50ZXJydXB0ZWQgZXJyb3IgY29kZS4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBpbnRlcnJ1cHQoKSB7fQotCi0gIC8qKgotICAgKiBDbG9zZXMgdGhpcyB0cmFuc3BvcnQgc3VjaCB0aGF0IGZ1dHVyZSBjYWxscyB0byBhY2NlcHQgd2lsbCBkbyBub3RoaW5nLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIGNsb3NlKCkgPSAwOwotCi0gcHJvdGVjdGVkOgotICBUU2VydmVyVHJhbnNwb3J0KCkge30KLQotICAvKioKLSAgICogU3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24gZm9yIGFjY2VwdC4KLSAgICoKLSAgICogQHJldHVybiBBIG5ld2x5IGFsbG9jYXRlZCBUVHJhbnNwb3J0IG9iamVjdAotICAgKiBAdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMKLSAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpID0gMDsKLQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2hvcnRSZWFkVHJhbnNwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMGViODYuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0hPUlRSRUFEVFJBTlNQT1JUX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTSE9SVFJFQURUUkFOU1BPUlRfSF8gMQotCi0jaW5jbHVkZSA8Y3N0ZGxpYj4KLQotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7IG5hbWVzcGFjZSB0ZXN0IHsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIG9ubHkgbWVhbnQgZm9yIHRlc3RpbmcuICBJdCB3cmFwcyBhbm90aGVyIHRyYW5zcG9ydC4KLSAqIENhbGxzIHRvIHJlYWQgYXJlIHBhc3NlZCB0aHJvdWdoIHdpdGggc29tZSBwcm9iYWJpbGl0eS4gIE90aGVyd2lzZSwKLSAqIHRoZSByZWFkIGFtb3VudCBpcyByYW5kb21seSByZWR1Y2VkIGJlZm9yZSBiZWluZyBwYXNzZWQgdGhyb3VnaC4KLSAqCi0gKi8KLWNsYXNzIFRTaG9ydFJlYWRUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VFNob3J0UmVhZFRyYW5zcG9ydD4gewotIHB1YmxpYzoKLSAgVFNob3J0UmVhZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIGRvdWJsZSBmdWxsX3Byb2IpCi0gICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCkKLSAgICAsIGZ1bGxQcm9iXyhmdWxsX3Byb2IpCi0gIHt9Ci0KLSAgYm9vbCBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF8tPmlzT3BlbigpOwotICB9Ci0KLSAgYm9vbCBwZWVrKCkgewotICAgIHJldHVybiB0cmFuc3BvcnRfLT5wZWVrKCk7Ci0gIH0KLQotICB2b2lkIG9wZW4oKSB7Ci0gICAgdHJhbnNwb3J0Xy0+b3BlbigpOwotICB9Ci0KLSAgdm9pZCBjbG9zZSgpIHsKLSAgICB0cmFuc3BvcnRfLT5jbG9zZSgpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKHJhbmQoKS8oZG91YmxlKVJBTkRfTUFYID49IGZ1bGxQcm9iXykgewotICAgICAgbGVuID0gMSArIHJhbmQoKSVsZW47Ci0gICAgfQotICAgIHJldHVybiB0cmFuc3BvcnRfLT5yZWFkKGJ1ZiwgbGVuKTsKLSAgfQotCi0gIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICB0cmFuc3BvcnRfLT53cml0ZShidWYsIGxlbik7Ci0gIH0KLQotICB2b2lkIGZsdXNoKCkgewotICAgIHRyYW5zcG9ydF8tPmZsdXNoKCk7Ci0gIH0KLQotICBjb25zdCB1aW50OF90KiBib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF8tPmJvcnJvdyhidWYsIGxlbik7Ci0gIH0KLQotICB2b2lkIGNvbnN1bWUodWludDMyX3QgbGVuKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF8tPmNvbnN1bWUobGVuKTsKLSAgfQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF87Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKLSAgZG91YmxlIGZ1bGxQcm9iXzsKLX07Ci0KLX19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6dGVzdAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0hPUlRSRUFEVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU4YTU3NC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiVFNpbXBsZUZpbGVUcmFuc3BvcnQuaCIKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotVFNpbXBsZUZpbGVUcmFuc3BvcnQ6OgotVFNpbXBsZUZpbGVUcmFuc3BvcnQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGJvb2wgcmVhZCwgYm9vbCB3cml0ZSkKLSAgICA6IFRGRFRyYW5zcG9ydCgtMSwgVEZEVHJhbnNwb3J0OjpDTE9TRV9PTl9ERVNUUk9ZKSB7Ci0gIGludCBmbGFncyA9IDA7Ci0gIGlmIChyZWFkICYmIHdyaXRlKSB7Ci0gICAgZmxhZ3MgPSBPX1JEV1I7Ci0gIH0gZWxzZSBpZiAocmVhZCkgewotICAgIGZsYWdzID0gT19SRE9OTFk7Ci0gIH0gZWxzZSBpZiAod3JpdGUpIHsKLSAgICBmbGFncyA9IE9fV1JPTkxZOwotICB9IGVsc2UgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIk5laXRoZXIgUkVBRCBub3IgV1JJVEUgc3BlY2lmaWVkIik7Ci0gIH0KLSAgaWYgKHdyaXRlKSB7Ci0gICAgZmxhZ3MgfD0gT19DUkVBVCB8IE9fQVBQRU5EOwotICB9Ci0gIGludCBmZCA9IDo6b3BlbihwYXRoLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgIFNfSVJVU1IgfCBTX0lXVVNSfCBTX0lSR1JQIHwgU19JUk9USCk7Ci0gIGlmIChmZCA8IDApIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJmYWlsZWQgdG8gb3BlbiBmaWxlIGZvciB3cml0aW5nOiAiICsgcGF0aCk7Ci0gIH0KLSAgc2V0RkQoZmQpOwotICBvcGVuKCk7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2M1MmVhLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTSU1QTEVGSUxFVFJBTlNQT1JUX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTSU1QTEVGSUxFVFJBTlNQT1JUX0hfIDEKLQotI2luY2x1ZGUgIlRGRFRyYW5zcG9ydC5oIgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi0vKioKLSAqIERlYWQtc2ltcGxlIHdyYXBwZXIgYXJvdW5kIGEgZmlsZS4KLSAqCi0gKiBXcml0ZWFibGUgZmlsZXMgYXJlIG9wZW5lZCB3aXRoIE9fQ1JFQVQgYW5kIE9fQVBQRU5ECi0gKi8KLWNsYXNzIFRTaW1wbGVGaWxlVHJhbnNwb3J0IDogcHVibGljIFRGRFRyYW5zcG9ydCB7Ci0gcHVibGljOgotICBUU2ltcGxlRmlsZVRyYW5zcG9ydChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWFkID0gIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGUgPSBmYWxzZSk7Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCi0jZW5kaWYgLy8gIF9USFJJRlRfVFJBTlNQT1JUX1RTSU1QTEVGSUxFVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldC5jcHAgYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMWQzNTYuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTb2NrZXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3VuLmg+Ci0jaW5jbHVkZSA8c3lzL3BvbGwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLQotI2luY2x1ZGUgImNvbmN1cnJlbmN5L01vbml0b3IuaCIKLSNpbmNsdWRlICJUU29ja2V0LmgiCi0jaW5jbHVkZSAiVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0vLyBHbG9iYWwgdmFyIHRvIHRyYWNrIHRvdGFsIHNvY2tldCBzeXMgY2FsbHMKLXVpbnQzMl90IGdfc29ja2V0X3N5c2NhbGxzID0gMDsKLQotLyoqCi0gKiBUU29ja2V0IGltcGxlbWVudGF0aW9uLgotICoKLSAqLwotCi1UU29ja2V0OjpUU29ja2V0KHN0cmluZyBob3N0LCBpbnQgcG9ydCkgOgotICBob3N0Xyhob3N0KSwKLSAgcG9ydF8ocG9ydCksCi0gIHBhdGhfKCIiKSwKLSAgc29ja2V0XygtMSksCi0gIGNvbm5UaW1lb3V0XygwKSwKLSAgc2VuZFRpbWVvdXRfKDApLAotICByZWN2VGltZW91dF8oMCksCi0gIGxpbmdlck9uXygxKSwKLSAgbGluZ2VyVmFsXygwKSwKLSAgbm9EZWxheV8oMSksCi0gIG1heFJlY3ZSZXRyaWVzXyg1KSB7Ci0gIHJlY3ZUaW1ldmFsXy50dl9zZWMgPSAoaW50KShyZWN2VGltZW91dF8vMTAwMCk7Ci0gIHJlY3ZUaW1ldmFsXy50dl91c2VjID0gKGludCkoKHJlY3ZUaW1lb3V0XyUxMDAwKSoxMDAwKTsKLX0KLQotVFNvY2tldDo6VFNvY2tldChzdHJpbmcgcGF0aCkgOgotICBob3N0XygiIiksCi0gIHBvcnRfKDApLAotICBwYXRoXyhwYXRoKSwKLSAgc29ja2V0XygtMSksCi0gIGNvbm5UaW1lb3V0XygwKSwKLSAgc2VuZFRpbWVvdXRfKDApLAotICByZWN2VGltZW91dF8oMCksCi0gIGxpbmdlck9uXygxKSwKLSAgbGluZ2VyVmFsXygwKSwKLSAgbm9EZWxheV8oMSksCi0gIG1heFJlY3ZSZXRyaWVzXyg1KSB7Ci0gIHJlY3ZUaW1ldmFsXy50dl9zZWMgPSAoaW50KShyZWN2VGltZW91dF8vMTAwMCk7Ci0gIHJlY3ZUaW1ldmFsXy50dl91c2VjID0gKGludCkoKHJlY3ZUaW1lb3V0XyUxMDAwKSoxMDAwKTsKLSAgY2FjaGVkUGVlckFkZHJfLmlwdjQuc2luX2ZhbWlseSA9IEFGX1VOU1BFQzsKLX0KLQotVFNvY2tldDo6VFNvY2tldCgpIDoKLSAgaG9zdF8oIiIpLAotICBwb3J0XygwKSwKLSAgcGF0aF8oIiIpLAotICBzb2NrZXRfKC0xKSwKLSAgY29ublRpbWVvdXRfKDApLAotICBzZW5kVGltZW91dF8oMCksCi0gIHJlY3ZUaW1lb3V0XygwKSwKLSAgbGluZ2VyT25fKDEpLAotICBsaW5nZXJWYWxfKDApLAotICBub0RlbGF5XygxKSwKLSAgbWF4UmVjdlJldHJpZXNfKDUpIHsKLSAgcmVjdlRpbWV2YWxfLnR2X3NlYyA9IChpbnQpKHJlY3ZUaW1lb3V0Xy8xMDAwKTsKLSAgcmVjdlRpbWV2YWxfLnR2X3VzZWMgPSAoaW50KSgocmVjdlRpbWVvdXRfJTEwMDApKjEwMDApOwotICBjYWNoZWRQZWVyQWRkcl8uaXB2NC5zaW5fZmFtaWx5ID0gQUZfVU5TUEVDOwotfQotCi1UU29ja2V0OjpUU29ja2V0KGludCBzb2NrZXQpIDoKLSAgaG9zdF8oIiIpLAotICBwb3J0XygwKSwKLSAgcGF0aF8oIiIpLAotICBzb2NrZXRfKHNvY2tldCksCi0gIGNvbm5UaW1lb3V0XygwKSwKLSAgc2VuZFRpbWVvdXRfKDApLAotICByZWN2VGltZW91dF8oMCksCi0gIGxpbmdlck9uXygxKSwKLSAgbGluZ2VyVmFsXygwKSwKLSAgbm9EZWxheV8oMSksCi0gIG1heFJlY3ZSZXRyaWVzXyg1KSB7Ci0gIHJlY3ZUaW1ldmFsXy50dl9zZWMgPSAoaW50KShyZWN2VGltZW91dF8vMTAwMCk7Ci0gIHJlY3ZUaW1ldmFsXy50dl91c2VjID0gKGludCkoKHJlY3ZUaW1lb3V0XyUxMDAwKSoxMDAwKTsKLSAgY2FjaGVkUGVlckFkZHJfLmlwdjQuc2luX2ZhbWlseSA9IEFGX1VOU1BFQzsKLX0KLQotVFNvY2tldDo6flRTb2NrZXQoKSB7Ci0gIGNsb3NlKCk7Ci19Ci0KLWJvb2wgVFNvY2tldDo6aXNPcGVuKCkgewotICByZXR1cm4gKHNvY2tldF8gPj0gMCk7Ci19Ci0KLWJvb2wgVFNvY2tldDo6cGVlaygpIHsKLSAgaWYgKCFpc09wZW4oKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB1aW50OF90IGJ1ZjsKLSAgaW50IHIgPSByZWN2KHNvY2tldF8sICZidWYsIDEsIE1TR19QRUVLKTsKLSAgaWYgKHIgPT0gLTEpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICNpZiBkZWZpbmVkIF9fRnJlZUJTRF9fIHx8IGRlZmluZWQgX19NQUNIX18KLSAgICAvKiBzaGlnaW46Ci0gICAgICogZnJlZWJzZCByZXR1cm5zIC0xIGFuZCBFQ09OTlJFU0VUIGlmIHNvY2tldCB3YXMgY2xvc2VkIGJ5IAotICAgICAqIHRoZSBvdGhlciBzaWRlCi0gICAgICovCi0gICAgaWYgKGVycm5vX2NvcHkgPT0gRUNPTk5SRVNFVCkKLSAgICB7Ci0gICAgICBjbG9zZSgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAjZW5kaWYKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpwZWVrKCkgcmVjdigpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgInJlY3YoKSIsIGVycm5vX2NvcHkpOwotICB9Ci0gIHJldHVybiAociA+IDApOwotfQotCi12b2lkIFRTb2NrZXQ6Om9wZW5Db25uZWN0aW9uKHN0cnVjdCBhZGRyaW5mbyAqcmVzKSB7Ci0gIGlmIChpc09wZW4oKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIGlmICghIHBhdGhfLmVtcHR5KCkpIHsKLSAgICBzb2NrZXRfID0gc29ja2V0KFBGX1VOSVgsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX0lQKTsKLSAgfSBlbHNlIHsKLSAgICBzb2NrZXRfID0gc29ja2V0KHJlcy0+YWlfZmFtaWx5LCByZXMtPmFpX3NvY2t0eXBlLCByZXMtPmFpX3Byb3RvY29sKTsKLSAgfQotCi0gIGlmIChzb2NrZXRfID09IC0xKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgc29ja2V0KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgInNvY2tldCgpIiwgZXJybm9fY29weSk7Ci0gIH0KLQotICAvLyBTZW5kIHRpbWVvdXQKLSAgaWYgKHNlbmRUaW1lb3V0XyA+IDApIHsKLSAgICBzZXRTZW5kVGltZW91dChzZW5kVGltZW91dF8pOwotICB9Ci0KLSAgLy8gUmVjdiB0aW1lb3V0Ci0gIGlmIChyZWN2VGltZW91dF8gPiAwKSB7Ci0gICAgc2V0UmVjdlRpbWVvdXQocmVjdlRpbWVvdXRfKTsKLSAgfQotCi0gIC8vIExpbmdlcgotICBzZXRMaW5nZXIobGluZ2VyT25fLCBsaW5nZXJWYWxfKTsKLQotICAvLyBObyBkZWxheQotICBzZXROb0RlbGF5KG5vRGVsYXlfKTsKLQotICAvLyBVc2VzIGEgbG93IG1pbiBSVE8gaWYgYXNrZWQgdG8uCi0jaWZkZWYgVENQX0xPV19NSU5fUlRPCi0gIGlmIChnZXRVc2VMb3dNaW5SdG8oKSkgewotICAgIGludCBvbmUgPSAxOwotICAgIHNldHNvY2tvcHQoc29ja2V0XywgSVBQUk9UT19UQ1AsIFRDUF9MT1dfTUlOX1JUTywgJm9uZSwgc2l6ZW9mKG9uZSkpOwotICB9Ci0jZW5kaWYKLQotCi0gIC8vIFNldCB0aGUgc29ja2V0IHRvIGJlIG5vbiBibG9ja2luZyBmb3IgY29ubmVjdCBpZiBhIHRpbWVvdXQgZXhpc3RzCi0gIGludCBmbGFncyA9IGZjbnRsKHNvY2tldF8sIEZfR0VURkwsIDApOwotICBpZiAoY29ublRpbWVvdXRfID4gMCkgewotICAgIGlmICgtMSA9PSBmY250bChzb2NrZXRfLCBGX1NFVEZMLCBmbGFncyB8IE9fTk9OQkxPQ0spKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIGZjbnRsKCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiZmNudGwoKSBmYWlsZWQiLCBlcnJub19jb3B5KTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKC0xID09IGZjbnRsKHNvY2tldF8sIEZfU0VURkwsIGZsYWdzICYgfk9fTk9OQkxPQ0spKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIGZjbnRsICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgImZjbnRsKCkgZmFpbGVkIiwgZXJybm9fY29weSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gQ29ubmVjdCB0aGUgc29ja2V0Ci0gIGludCByZXQ7Ci0gIGlmICghIHBhdGhfLmVtcHR5KCkpIHsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcmVzczsKLSAgICBzb2NrbGVuX3QgbGVuOwotCi0gICAgaWYgKHBhdGhfLmxlbmd0aCgpID4gc2l6ZW9mKGFkZHJlc3Muc3VuX3BhdGgpKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIHRvbyBsb25nIiwgZXJybm9fY29weSk7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIHRvbyBsb25nIik7Ci0gICAgfQotCi0gICAgYWRkcmVzcy5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKLSAgICBzbnByaW50ZihhZGRyZXNzLnN1bl9wYXRoLCBzaXplb2YoYWRkcmVzcy5zdW5fcGF0aCksICIlcyIsIHBhdGhfLmNfc3RyKCkpOwotICAgIGxlbiA9IHNpemVvZihhZGRyZXNzKTsKLSAgICByZXQgPSBjb25uZWN0KHNvY2tldF8sIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHJlc3MsIGxlbik7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0ID0gY29ubmVjdChzb2NrZXRfLCByZXMtPmFpX2FkZHIsIHJlcy0+YWlfYWRkcmxlbik7Ci0gIH0KLQotICAvLyBzdWNjZXNzIGNhc2UKLSAgaWYgKHJldCA9PSAwKSB7Ci0gICAgZ290byBkb25lOwotICB9Ci0KLSAgaWYgKGVycm5vICE9IEVJTlBST0dSRVNTKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgY29ubmVjdCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJjb25uZWN0KCkgZmFpbGVkIiwgZXJybm9fY29weSk7Ci0gIH0KLQotCi0gIHN0cnVjdCBwb2xsZmQgZmRzWzFdOwotICBzdGQ6Om1lbXNldChmZHMsIDAgLCBzaXplb2YoZmRzKSk7Ci0gIGZkc1swXS5mZCA9IHNvY2tldF87Ci0gIGZkc1swXS5ldmVudHMgPSBQT0xMT1VUOwotICByZXQgPSBwb2xsKGZkcywgMSwgY29ublRpbWVvdXRfKTsKLQotICBpZiAocmV0ID4gMCkgewotICAgIC8vIEVuc3VyZSB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCBhbmQgdGhhdCB0aGVyZSBhcmUgbm8gZXJyb3JzIHNldAotICAgIGludCB2YWw7Ci0gICAgc29ja2xlbl90IGxvbjsKLSAgICBsb24gPSBzaXplb2YoaW50KTsKLSAgICBpbnQgcmV0MiA9IGdldHNvY2tvcHQoc29ja2V0XywgU09MX1NPQ0tFVCwgU09fRVJST1IsICh2b2lkICopJnZhbCwgJmxvbik7Ci0gICAgaWYgKHJldDIgPT0gLTEpIHsKLSAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgZ2V0c29ja29wdCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgImdldHNvY2tvcHQoKSIsIGVycm5vX2NvcHkpOwotICAgIH0KLSAgICAvLyBubyBlcnJvcnMgb24gc29ja2V0LCBnbyB0byB0b3duCi0gICAgaWYgKHZhbCA9PSAwKSB7Ci0gICAgICBnb3RvIGRvbmU7Ci0gICAgfQotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBlcnJvciBvbiBzb2NrZXQgKGFmdGVyIHBvbGwpICIgKyBnZXRTb2NrZXRJbmZvKCksIHZhbCk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgInNvY2tldCBvcGVuKCkgZXJyb3IiLCB2YWwpOwotICB9IGVsc2UgaWYgKHJldCA9PSAwKSB7Ci0gICAgLy8gc29ja2V0IHRpbWVkIG91dAotICAgIHN0cmluZyBlcnJTdHIgPSAiVFNvY2tldDo6b3BlbigpIHRpbWVkIG91dCAiICsgZ2V0U29ja2V0SW5mbygpOwotICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIm9wZW4oKSB0aW1lZCBvdXQiKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBlcnJvciBvbiBwb2xsKCkKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBwb2xsKCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgInBvbGwoKSBmYWlsZWQiLCBlcnJub19jb3B5KTsKLSAgfQotCi0gZG9uZToKLSAgLy8gU2V0IHNvY2tldCBiYWNrIHRvIG5vcm1hbCBtb2RlIChibG9ja2luZykKLSAgZmNudGwoc29ja2V0XywgRl9TRVRGTCwgZmxhZ3MpOwotCi0gIGlmIChwYXRoXy5lbXB0eSgpKSB7Ci0gICAgc2V0Q2FjaGVkQWRkcmVzcyhyZXMtPmFpX2FkZHIsIHJlcy0+YWlfYWRkcmxlbik7Ci0gIH0KLX0KLQotdm9pZCBUU29ja2V0OjpvcGVuKCkgewotICBpZiAoaXNPcGVuKCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKCEgcGF0aF8uZW1wdHkoKSkgewotICAgIHVuaXhfb3BlbigpOwotICB9IGVsc2UgewotICAgIGxvY2FsX29wZW4oKTsKLSAgfQotfQotCi12b2lkIFRTb2NrZXQ6OnVuaXhfb3BlbigpewotICBpZiAoISBwYXRoXy5lbXB0eSgpKSB7Ci0gICAgLy8gVW5peCBEb21haW4gU09ja2V0IGRvZXMgbm90IG5lZWQgYWRkcmluZm8gc3RydWN0LCBzbyB3ZSBwYXNzIE5VTEwKLSAgICBvcGVuQ29ubmVjdGlvbihOVUxMKTsKLSAgfQotfQotCi12b2lkIFRTb2NrZXQ6OmxvY2FsX29wZW4oKXsKLSAgaWYgKGlzT3BlbigpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gVmFsaWRhdGUgcG9ydCBudW1iZXIKLSAgaWYgKHBvcnRfIDwgMCB8fCBwb3J0XyA+IDB4RkZGRikgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJTcGVjaWZpZWQgcG9ydCBpcyBpbnZhbGlkIik7Ci0gIH0KLQotICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXMsICpyZXMwOwotICByZXMgPSBOVUxMOwotICByZXMwID0gTlVMTDsKLSAgaW50IGVycm9yOwotICBjaGFyIHBvcnRbc2l6ZW9mKCI2NTUzNSIpXTsKLSAgc3RkOjptZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKLSAgaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOwotICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOwotICBoaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkUgfCBBSV9BRERSQ09ORklHOwotICBzcHJpbnRmKHBvcnQsICIlZCIsIHBvcnRfKTsKLQotICBlcnJvciA9IGdldGFkZHJpbmZvKGhvc3RfLmNfc3RyKCksIHBvcnQsICZoaW50cywgJnJlczApOwotCi0gIGlmIChlcnJvcikgewotICAgIHN0cmluZyBlcnJTdHIgPSAiVFNvY2tldDo6b3BlbigpIGdldGFkZHJpbmZvKCkgIiArIGdldFNvY2tldEluZm8oKSArIHN0cmluZyhnYWlfc3RyZXJyb3IoZXJyb3IpKTsKLSAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIGNsb3NlKCk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCByZXNvbHZlIGhvc3QgZm9yIGNsaWVudCBzb2NrZXQuIik7Ci0gIH0KLQotICAvLyBDeWNsZSB0aHJvdWdoIGFsbCB0aGUgcmV0dXJuZWQgYWRkcmVzc2VzIHVudGlsIG9uZQotICAvLyBjb25uZWN0cyBvciBwdXNoIHRoZSBleGNlcHRpb24gdXAuCi0gIGZvciAocmVzID0gcmVzMDsgcmVzOyByZXMgPSByZXMtPmFpX25leHQpIHsKLSAgICB0cnkgewotICAgICAgb3BlbkNvbm5lY3Rpb24ocmVzKTsKLSAgICAgIGJyZWFrOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgaWYgKHJlcy0+YWlfbmV4dCkgewotICAgICAgICBjbG9zZSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgZnJlZWFkZHJpbmZvKHJlczApOyAvLyBjbGVhbnVwIG9uIGZhaWx1cmUKLSAgICAgICAgdGhyb3c7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gRnJlZSBhZGRyZXNzIHN0cnVjdHVyZSBtZW1vcnkKLSAgZnJlZWFkZHJpbmZvKHJlczApOwotfQotCi12b2lkIFRTb2NrZXQ6OmNsb3NlKCkgewotICBpZiAoc29ja2V0XyA+PSAwKSB7Ci0gICAgc2h1dGRvd24oc29ja2V0XywgU0hVVF9SRFdSKTsKLSAgICA6OmNsb3NlKHNvY2tldF8pOwotICB9Ci0gIHNvY2tldF8gPSAtMTsKLX0KLQotdm9pZCBUU29ja2V0OjpzZXRTb2NrZXRGRChpbnQgc29ja2V0KSB7Ci0gIGlmIChzb2NrZXRfID49IDApIHsKLSAgICBjbG9zZSgpOwotICB9Ci0gIHNvY2tldF8gPSBzb2NrZXQ7Ci19Ci0KLXVpbnQzMl90IFRTb2NrZXQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgaWYgKHNvY2tldF8gPCAwKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNhbGxlZCByZWFkIG9uIG5vbi1vcGVuIHNvY2tldCIpOwotICB9Ci0KLSAgaW50MzJfdCByZXRyaWVzID0gMDsKLQotICAvLyBFQUdBSU4gY2FuIGJlIHNpZ25hbGxlZCBib3RoIHdoZW4gYSB0aW1lb3V0IGhhcyBvY2N1cnJlZCBhbmQgd2hlbgotICAvLyB0aGUgc3lzdGVtIGlzIG91dCBvZiByZXNvdXJjZXMgKGFuIGF3ZXNvbWUgdW5kb2N1bWVudGVkIGZlYXR1cmUpLgotICAvLyBUaGUgZm9sbG93aW5nIGlzIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIHRpbWUgaW50ZXJ2YWwgdW5kZXIgd2hpY2gKLSAgLy8gRUFHQUlOIGlzIHRha2VuIHRvIGluZGljYXRlIGFuIG91dCBvZiByZXNvdXJjZXMgZXJyb3IuCi0gIHVpbnQzMl90IGVhZ2FpblRocmVzaG9sZE1pY3JvcyA9IDA7Ci0gIGlmIChyZWN2VGltZW91dF8pIHsKLSAgICAvLyBpZiBhIHJlYWRUaW1lb3V0IGlzIHNwZWNpZmllZCBhbG9uZyB3aXRoIGEgbWF4IG51bWJlciBvZiByZWN2IHJldHJpZXMsIHRoZW4KLSAgICAvLyB0aGUgdGhyZXNob2xkIHdpbGwgZW5zdXJlIHRoYXQgdGhlIHJlYWQgdGltZW91dCBpcyBub3QgZXhjZWVkZWQgZXZlbiBpbiB0aGUKLSAgICAvLyBjYXNlIG9mIHJlc291cmNlIGVycm9ycwotICAgIGVhZ2FpblRocmVzaG9sZE1pY3JvcyA9IChyZWN2VGltZW91dF8qMTAwMCkvICgobWF4UmVjdlJldHJpZXNfPjApID8gbWF4UmVjdlJldHJpZXNfIDogMik7Ci0gIH0KLQotIHRyeV9hZ2FpbjoKLSAgLy8gUmVhZCBmcm9tIHRoZSBzb2NrZXQKLSAgc3RydWN0IHRpbWV2YWwgYmVnaW47Ci0gIGlmIChyZWN2VGltZW91dF8gPiAwKSB7Ci0gICAgZ2V0dGltZW9mZGF5KCZiZWdpbiwgTlVMTCk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gaWYgdGhlcmUgaXMgbm8gcmVhZCB0aW1lb3V0IHdlIGRvbid0IG5lZWQgdGhlIFRPRCB0byBkZXRlcm1pbmUgd2hldGhlcgotICAgIC8vIGFuIEVBR0FJTiBpcyBkdWUgdG8gYSB0aW1lb3V0IG9yIGFuIG91dC1vZi1yZXNvdXJjZSBjb25kaXRpb24uCi0gICAgYmVnaW4udHZfc2VjID0gYmVnaW4udHZfdXNlYyA9IDA7Ci0gIH0KLSAgaW50IGdvdCA9IHJlY3Yoc29ja2V0XywgYnVmLCBsZW4sIDApOwotICBpbnQgZXJybm9fY29weSA9IGVycm5vOyAvL2dldHRpbWVvZmRheSBjYW4gY2hhbmdlIGVycm5vCi0gICsrZ19zb2NrZXRfc3lzY2FsbHM7Ci0KLSAgLy8gQ2hlY2sgZm9yIGVycm9yIG9uIHJlYWQKLSAgaWYgKGdvdCA8IDApIHsKLSAgICBpZiAoZXJybm9fY29weSA9PSBFQUdBSU4pIHsKLSAgICAgIC8vIGlmIG5vIHRpbWVvdXQgd2UgY2FuIGFzc3VtZSB0aGF0IHJlc291cmNlIGV4aGF1c3Rpb24gaGFzIG9jY3VycmVkLgotICAgICAgaWYgKHJlY3ZUaW1lb3V0XyA9PSAwKSB7Ci0gICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVBR0FJTiAodW5hdmFpbGFibGUgcmVzb3VyY2VzKSIpOwotICAgICAgfQotICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyB0aGUgbGFjayBvZiByZXNvdXJjZXMgb3IgdGltZW91dCBjYXNlCi0gICAgICBzdHJ1Y3QgdGltZXZhbCBlbmQ7Ci0gICAgICBnZXR0aW1lb2ZkYXkoJmVuZCwgTlVMTCk7Ci0gICAgICB1aW50MzJfdCByZWFkRWxhcHNlZE1pY3JvcyA9ICAoKChlbmQudHZfc2VjIC0gYmVnaW4udHZfc2VjKSAqIDEwMDAgKiAxMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCgodWludDY0X3QpKGVuZC50dl91c2VjIC0gYmVnaW4udHZfdXNlYykpKSk7Ci0KLSAgICAgIGlmICghZWFnYWluVGhyZXNob2xkTWljcm9zIHx8IChyZWFkRWxhcHNlZE1pY3JvcyA8IGVhZ2FpblRocmVzaG9sZE1pY3JvcykpIHsKLSAgICAgICAgaWYgKHJldHJpZXMrKyA8IG1heFJlY3ZSZXRyaWVzXykgewotICAgICAgICAgIHVzbGVlcCg1MCk7Ci0gICAgICAgICAgZ290byB0cnlfYWdhaW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUFHQUlOICh1bmF2YWlsYWJsZSByZXNvdXJjZXMpIik7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGluZmVyIHRoYXQgdGltZW91dCBoYXMgYmVlbiBoaXQKLSAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVBR0FJTiAodGltZWQgb3V0KSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIGludGVycnVwdGVkLCB0cnkgYWdhaW4KLSAgICBpZiAoZXJybm9fY29weSA9PSBFSU5UUiAmJiByZXRyaWVzKysgPCBtYXhSZWN2UmV0cmllc18pIHsKLSAgICAgIGdvdG8gdHJ5X2FnYWluOwotICAgIH0KLQotICAgICNpZiBkZWZpbmVkIF9fRnJlZUJTRF9fIHx8IGRlZmluZWQgX19NQUNIX18KLSAgICBpZiAoZXJybm9fY29weSA9PSBFQ09OTlJFU0VUKSB7Ci0gICAgICAvKiBzaGlnaW46IGZyZWVic2QgZG9lc24ndCBmb2xsb3cgUE9TSVggc2VtYW50aWMgb2YgcmVjdiBhbmQgZmFpbHMgd2l0aAotICAgICAgICogRUNPTk5SRVNFVCBpZiBwZWVyIHBlcmZvcm1lZCBzaHV0ZG93biAKLSAgICAgICAqIGVkaGFsbDogZWxpbWluYXRlZCBjbG9zZSgpIHNpbmNlIHdlIGRvIHRoYXQgaW4gdGhlIGRlc3RydWN0b3IuCi0gICAgICAgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAjZW5kaWYKLQotICAgIC8vIE5vdyBpdCdzIG5vdCBhIHRyeSBhZ2FpbiBjYXNlLCBidXQgYSByZWFsIHByb2JibGV6Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6cmVhZCgpIHJlY3YoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKLQotICAgIC8vIElmIHdlIGRpc2Nvbm5lY3Qgd2l0aCBubyBsaW5nZXIgdGltZQotICAgIGlmIChlcnJub19jb3B5ID09IEVDT05OUkVTRVQpIHsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJFQ09OTlJFU0VUIik7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBpc2ggaXNuJ3Qgb3BlbgotICAgIGlmIChlcnJub19jb3B5ID09IEVOT1RDT05OKSB7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiRU5PVENPTk4iKTsKLSAgICB9Ci0KLSAgICAvLyBUaW1lZCBvdXQhCi0gICAgaWYgKGVycm5vX2NvcHkgPT0gRVRJTUVET1VUKSB7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwgIkVUSU1FRE9VVCIpOwotICAgIH0KLQotICAgIC8vIFNvbWUgb3RoZXIgZXJyb3IsIHdoYXRldnoKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJVbmtub3duIiwgZXJybm9fY29weSk7Ci0gIH0KLQotICAvLyBUaGUgcmVtb3RlIGhvc3QgaGFzIGNsb3NlZCB0aGUgc29ja2V0Ci0gIGlmIChnb3QgPT0gMCkgewotICAgIC8vIGVkaGFsbDogd2UgdXNlZCB0byBjYWxsIGNsb3NlKCkgaGVyZSwgYnV0IG91ciBjYWxsZXIgbWF5IHdhbnQgdG8gZGVhbAotICAgIC8vIHdpdGggdGhlIHNvY2tldCBmZCBhbmQgd2UnbGwgY2xvc2UoKSBpbiBvdXIgZGVzdHJ1Y3RvciBpbiBhbnkgY2FzZS4KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIFBhY2sgZGF0YSBpbnRvIHN0cmluZwotICByZXR1cm4gZ290OwotfQotCi12b2lkIFRTb2NrZXQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIHVpbnQzMl90IHNlbnQgPSAwOwotCi0gIHdoaWxlIChzZW50IDwgbGVuKSB7Ci0gICAgdWludDMyX3QgYiA9IHdyaXRlX3BhcnRpYWwoYnVmICsgc2VudCwgbGVuIC0gc2VudCk7Ci0gICAgaWYgKGIgPT0gMCkgewotICAgICAgLy8gV2UgYXNzdW1lIHRoYXQgd2UgZ290IDAgYmVjYXVzZSBzZW5kKCkgZXJyb3JlZCB3aXRoIEVBR0FJTiBkdWUgdG8KLSAgICAgIC8vIGxhY2sgb2Ygc3lzdGVtIHJlc291cmNlczsgcmVsZWFzZSB0aGUgQ1BVIGZvciBhIGJpdC4KLSAgICAgIHVzbGVlcCg1MCk7Ci0gICAgfQotICAgIHNlbnQgKz0gYjsKLSAgfQotfQotCi11aW50MzJfdCBUU29ja2V0Ojp3cml0ZV9wYXJ0aWFsKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIGlmIChzb2NrZXRfIDwgMCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDYWxsZWQgd3JpdGUgb24gbm9uLW9wZW4gc29ja2V0Iik7Ci0gIH0KLQotICB1aW50MzJfdCBzZW50ID0gMDsKLQotICBpbnQgZmxhZ3MgPSAwOwotI2lmZGVmIE1TR19OT1NJR05BTAotICAvLyBOb3RlIHRoZSB1c2Ugb2YgTVNHX05PU0lHTkFMIHRvIHN1cHByZXNzIFNJR1BJUEUgZXJyb3JzLCBpbnN0ZWFkIHdlCi0gIC8vIGNoZWNrIGZvciB0aGUgRVBJUEUgcmV0dXJuIGNvbmRpdGlvbiBhbmQgY2xvc2UgdGhlIHNvY2tldCBpbiB0aGF0IGNhc2UKLSAgZmxhZ3MgfD0gTVNHX05PU0lHTkFMOwotI2VuZGlmIC8vIGlmZGVmIE1TR19OT1NJR05BTAotCi0gIGludCBiID0gc2VuZChzb2NrZXRfLCBidWYgKyBzZW50LCBsZW4gLSBzZW50LCBmbGFncyk7Ci0gICsrZ19zb2NrZXRfc3lzY2FsbHM7Ci0KLSAgaWYgKGIgPCAwKSB7Ci0gICAgaWYgKGVycm5vID09IEVXT1VMREJMT0NLIHx8IGVycm5vID09IEVBR0FJTikgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIC8vIEZhaWwgb24gYSBzZW5kIGVycm9yCi0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0Ojp3cml0ZV9wYXJ0aWFsKCkgc2VuZCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwotCi0gICAgaWYgKGVycm5vX2NvcHkgPT0gRVBJUEUgfHwgZXJybm9fY29weSA9PSBFQ09OTlJFU0VUIHx8IGVycm5vX2NvcHkgPT0gRU5PVENPTk4pIHsKLSAgICAgIGNsb3NlKCk7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAid3JpdGUoKSBzZW5kKCkiLCBlcnJub19jb3B5KTsKLSAgICB9Ci0KLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJ3cml0ZSgpIHNlbmQoKSIsIGVycm5vX2NvcHkpOwotICB9Ci0gIAotICAvLyBGYWlsIG9uIGJsb2NrZWQgc2VuZAotICBpZiAoYiA9PSAwKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlNvY2tldCBzZW5kIHJldHVybmVkIDAuIik7Ci0gIH0KLSAgcmV0dXJuIGI7Ci19Ci0KLXN0ZDo6c3RyaW5nIFRTb2NrZXQ6OmdldEhvc3QoKSB7Ci0gIHJldHVybiBob3N0XzsKLX0KLQotaW50IFRTb2NrZXQ6OmdldFBvcnQoKSB7Ci0gIHJldHVybiBwb3J0XzsKLX0KLQotdm9pZCBUU29ja2V0OjpzZXRIb3N0KHN0cmluZyBob3N0KSB7Ci0gIGhvc3RfID0gaG9zdDsKLX0KLQotdm9pZCBUU29ja2V0OjpzZXRQb3J0KGludCBwb3J0KSB7Ci0gIHBvcnRfID0gcG9ydDsKLX0KLQotdm9pZCBUU29ja2V0OjpzZXRMaW5nZXIoYm9vbCBvbiwgaW50IGxpbmdlcikgewotICBsaW5nZXJPbl8gPSBvbjsKLSAgbGluZ2VyVmFsXyA9IGxpbmdlcjsKLSAgaWYgKHNvY2tldF8gPCAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RydWN0IGxpbmdlciBsID0geyhsaW5nZXJPbl8gPyAxIDogMCksIGxpbmdlclZhbF99OwotICBpbnQgcmV0ID0gc2V0c29ja29wdChzb2NrZXRfLCBTT0xfU09DS0VULCBTT19MSU5HRVIsICZsLCBzaXplb2YobCkpOwotICBpZiAocmV0ID09IC0xKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsgIC8vIENvcHkgZXJybm8gYmVjYXVzZSB3ZSdyZSBhbGxvY2F0aW5nIG1lbW9yeS4KLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpzZXRMaW5nZXIoKSBzZXRzb2Nrb3B0KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7Ci0gIH0KLX0KLQotdm9pZCBUU29ja2V0OjpzZXROb0RlbGF5KGJvb2wgbm9EZWxheSkgewotICBub0RlbGF5XyA9IG5vRGVsYXk7Ci0gIGlmIChzb2NrZXRfIDwgMCB8fCAhcGF0aF8uZW1wdHkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFNldCBzb2NrZXQgdG8gTk9ERUxBWQotICBpbnQgdiA9IG5vRGVsYXlfID8gMSA6IDA7Ci0gIGludCByZXQgPSBzZXRzb2Nrb3B0KHNvY2tldF8sIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgJnYsIHNpemVvZih2KSk7Ci0gIGlmIChyZXQgPT0gLTEpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOyAgLy8gQ29weSBlcnJubyBiZWNhdXNlIHdlJ3JlIGFsbG9jYXRpbmcgbWVtb3J5LgotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OnNldE5vRGVsYXkoKSBzZXRzb2Nrb3B0KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7Ci0gIH0KLX0KLQotdm9pZCBUU29ja2V0OjpzZXRDb25uVGltZW91dChpbnQgbXMpIHsKLSAgY29ublRpbWVvdXRfID0gbXM7Ci19Ci0KLXZvaWQgVFNvY2tldDo6c2V0UmVjdlRpbWVvdXQoaW50IG1zKSB7Ci0gIGlmIChtcyA8IDApIHsKLSAgICBjaGFyIGVyckJ1Zls1MTJdOwotICAgIHNwcmludGYoZXJyQnVmLCAiVFNvY2tldDo6c2V0UmVjdlRpbWVvdXQgd2l0aCBuZWdhdGl2ZSBpbnB1dDogJWRcbiIsIG1zKTsKLSAgICBHbG9iYWxPdXRwdXQoZXJyQnVmKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcmVjdlRpbWVvdXRfID0gbXM7Ci0KLSAgaWYgKHNvY2tldF8gPCAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcmVjdlRpbWV2YWxfLnR2X3NlYyA9IChpbnQpKHJlY3ZUaW1lb3V0Xy8xMDAwKTsKLSAgcmVjdlRpbWV2YWxfLnR2X3VzZWMgPSAoaW50KSgocmVjdlRpbWVvdXRfJTEwMDApKjEwMDApOwotCi0gIC8vIENvcHkgYmVjYXVzZSBwb2xsIG1heSBtb2RpZnkKLSAgc3RydWN0IHRpbWV2YWwgciA9IHJlY3ZUaW1ldmFsXzsKLSAgaW50IHJldCA9IHNldHNvY2tvcHQoc29ja2V0XywgU09MX1NPQ0tFVCwgU09fUkNWVElNRU8sICZyLCBzaXplb2YocikpOwotICBpZiAocmV0ID09IC0xKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsgIC8vIENvcHkgZXJybm8gYmVjYXVzZSB3ZSdyZSBhbGxvY2F0aW5nIG1lbW9yeS4KLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpzZXRSZWN2VGltZW91dCgpIHNldHNvY2tvcHQoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKLSAgfQotfQotCi12b2lkIFRTb2NrZXQ6OnNldFNlbmRUaW1lb3V0KGludCBtcykgewotICBpZiAobXMgPCAwKSB7Ci0gICAgY2hhciBlcnJCdWZbNTEyXTsKLSAgICBzcHJpbnRmKGVyckJ1ZiwgIlRTb2NrZXQ6OnNldFNlbmRUaW1lb3V0IHdpdGggbmVnYXRpdmUgaW5wdXQ6ICVkXG4iLCBtcyk7Ci0gICAgR2xvYmFsT3V0cHV0KGVyckJ1Zik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHNlbmRUaW1lb3V0XyA9IG1zOwotCi0gIGlmIChzb2NrZXRfIDwgMCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHN0cnVjdCB0aW1ldmFsIHMgPSB7KGludCkoc2VuZFRpbWVvdXRfLzEwMDApLAotICAgICAgICAgICAgICAgICAgICAgIChpbnQpKChzZW5kVGltZW91dF8lMTAwMCkqMTAwMCl9OwotICBpbnQgcmV0ID0gc2V0c29ja29wdChzb2NrZXRfLCBTT0xfU09DS0VULCBTT19TTkRUSU1FTywgJnMsIHNpemVvZihzKSk7Ci0gIGlmIChyZXQgPT0gLTEpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOyAgLy8gQ29weSBlcnJubyBiZWNhdXNlIHdlJ3JlIGFsbG9jYXRpbmcgbWVtb3J5LgotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OnNldFNlbmRUaW1lb3V0KCkgc2V0c29ja29wdCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwotICB9Ci19Ci0KLXZvaWQgVFNvY2tldDo6c2V0TWF4UmVjdlJldHJpZXMoaW50IG1heFJlY3ZSZXRyaWVzKSB7Ci0gIG1heFJlY3ZSZXRyaWVzXyA9IG1heFJlY3ZSZXRyaWVzOwotfQotCi1zdHJpbmcgVFNvY2tldDo6Z2V0U29ja2V0SW5mbygpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKLSAgaWYgKGhvc3RfLmVtcHR5KCkgfHwgcG9ydF8gPT0gMCkgewotICAgIG9zcyA8PCAiPEhvc3Q6ICIgPDwgZ2V0UGVlckFkZHJlc3MoKTsKLSAgICBvc3MgPDwgIiBQb3J0OiAiIDw8IGdldFBlZXJQb3J0KCkgPDwgIj4iOwotICB9IGVsc2UgewotICAgIG9zcyA8PCAiPEhvc3Q6ICIgPDwgaG9zdF8gPDwgIiBQb3J0OiAiIDw8IHBvcnRfIDw8ICI+IjsKLSAgfQotICByZXR1cm4gb3NzLnN0cigpOwotfQotCi1zdGQ6OnN0cmluZyBUU29ja2V0OjpnZXRQZWVySG9zdCgpIHsKLSAgaWYgKHBlZXJIb3N0Xy5lbXB0eSgpICYmIHBhdGhfLmVtcHR5KCkpIHsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyOwotICAgIHN0cnVjdCBzb2NrYWRkciogYWRkclB0cjsKLSAgICBzb2NrbGVuX3QgYWRkckxlbjsKLQotICAgIGlmIChzb2NrZXRfIDwgMCkgewotICAgICAgcmV0dXJuIGhvc3RfOwotICAgIH0KLQotICAgIGFkZHJQdHIgPSBnZXRDYWNoZWRBZGRyZXNzKCZhZGRyTGVuKTsKLQotICAgIGlmIChhZGRyUHRyID09IE5VTEwpIHsKLSAgICAgIGFkZHJMZW4gPSBzaXplb2YoYWRkcik7Ci0gICAgICBpZiAoZ2V0cGVlcm5hbWUoc29ja2V0XywgKHNvY2thZGRyKikgJmFkZHIsICZhZGRyTGVuKSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBwZWVySG9zdF87Ci0gICAgICB9Ci0gICAgICBhZGRyUHRyID0gKHNvY2thZGRyKikmYWRkcjsKLQotICAgICAgc2V0Q2FjaGVkQWRkcmVzcyhhZGRyUHRyLCBhZGRyTGVuKTsKLSAgICB9Ci0KLSAgICBjaGFyIGNsaWVudGhvc3RbTklfTUFYSE9TVF07Ci0gICAgY2hhciBjbGllbnRzZXJ2aWNlW05JX01BWFNFUlZdOwotCi0gICAgZ2V0bmFtZWluZm8oKHNvY2thZGRyKikgYWRkclB0ciwgYWRkckxlbiwKLSAgICAgICAgICAgICAgICBjbGllbnRob3N0LCBzaXplb2YoY2xpZW50aG9zdCksCi0gICAgICAgICAgICAgICAgY2xpZW50c2VydmljZSwgc2l6ZW9mKGNsaWVudHNlcnZpY2UpLCAwKTsKLQotICAgIHBlZXJIb3N0XyA9IGNsaWVudGhvc3Q7Ci0gIH0KLSAgcmV0dXJuIHBlZXJIb3N0XzsKLX0KLQotc3RkOjpzdHJpbmcgVFNvY2tldDo6Z2V0UGVlckFkZHJlc3MoKSB7Ci0gIGlmIChwZWVyQWRkcmVzc18uZW1wdHkoKSAmJiBwYXRoXy5lbXB0eSgpKSB7Ci0gICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKLSAgICBzdHJ1Y3Qgc29ja2FkZHIqIGFkZHJQdHI7Ci0gICAgc29ja2xlbl90IGFkZHJMZW47Ci0KLSAgICBpZiAoc29ja2V0XyA8IDApIHsKLSAgICAgIHJldHVybiBwZWVyQWRkcmVzc187Ci0gICAgfQotCi0gICAgYWRkclB0ciA9IGdldENhY2hlZEFkZHJlc3MoJmFkZHJMZW4pOwotCi0gICAgaWYgKGFkZHJQdHIgPT0gTlVMTCkgewotICAgICAgYWRkckxlbiA9IHNpemVvZihhZGRyKTsKLSAgICAgIGlmIChnZXRwZWVybmFtZShzb2NrZXRfLCAoc29ja2FkZHIqKSAmYWRkciwgJmFkZHJMZW4pICE9IDApIHsKLSAgICAgICAgcmV0dXJuIHBlZXJBZGRyZXNzXzsKLSAgICAgIH0KLSAgICAgIGFkZHJQdHIgPSAoc29ja2FkZHIqKSZhZGRyOwotCi0gICAgICBzZXRDYWNoZWRBZGRyZXNzKGFkZHJQdHIsIGFkZHJMZW4pOwotICAgIH0KLQotICAgIGNoYXIgY2xpZW50aG9zdFtOSV9NQVhIT1NUXTsKLSAgICBjaGFyIGNsaWVudHNlcnZpY2VbTklfTUFYU0VSVl07Ci0KLSAgICBnZXRuYW1laW5mbyhhZGRyUHRyLCBhZGRyTGVuLAotICAgICAgICAgICAgICAgIGNsaWVudGhvc3QsIHNpemVvZihjbGllbnRob3N0KSwKLSAgICAgICAgICAgICAgICBjbGllbnRzZXJ2aWNlLCBzaXplb2YoY2xpZW50c2VydmljZSksCi0gICAgICAgICAgICAgICAgTklfTlVNRVJJQ0hPU1R8TklfTlVNRVJJQ1NFUlYpOwotCi0gICAgcGVlckFkZHJlc3NfID0gY2xpZW50aG9zdDsKLSAgICBwZWVyUG9ydF8gPSBzdGQ6OmF0b2koY2xpZW50c2VydmljZSk7Ci0gIH0KLSAgcmV0dXJuIHBlZXJBZGRyZXNzXzsKLX0KLQotaW50IFRTb2NrZXQ6OmdldFBlZXJQb3J0KCkgewotICBnZXRQZWVyQWRkcmVzcygpOwotICByZXR1cm4gcGVlclBvcnRfOwotfQotCi12b2lkIFRTb2NrZXQ6OnNldENhY2hlZEFkZHJlc3MoY29uc3Qgc29ja2FkZHIqIGFkZHIsIHNvY2tsZW5fdCBsZW4pIHsKLSAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3dpdGNoIChhZGRyLT5zYV9mYW1pbHkpIHsKLSAgY2FzZSBBRl9JTkVUOgotICAgIGlmIChsZW4gPT0gc2l6ZW9mKHNvY2thZGRyX2luKSkgewotICAgICAgbWVtY3B5KCh2b2lkKikmY2FjaGVkUGVlckFkZHJfLmlwdjQsICh2b2lkKilhZGRyLCBsZW4pOwotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIEFGX0lORVQ2OgotICAgIGlmIChsZW4gPT0gc2l6ZW9mKHNvY2thZGRyX2luNikpIHsKLSAgICAgIG1lbWNweSgodm9pZCopJmNhY2hlZFBlZXJBZGRyXy5pcHY2LCAodm9pZCopYWRkciwgbGVuKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotc29ja2FkZHIqIFRTb2NrZXQ6OmdldENhY2hlZEFkZHJlc3Moc29ja2xlbl90KiBsZW4pIGNvbnN0IHsKLSAgc3dpdGNoIChjYWNoZWRQZWVyQWRkcl8uaXB2NC5zaW5fZmFtaWx5KSB7Ci0gIGNhc2UgQUZfSU5FVDoKLSAgICAqbGVuID0gc2l6ZW9mKHNvY2thZGRyX2luKTsKLSAgICByZXR1cm4gKHNvY2thZGRyKikgJmNhY2hlZFBlZXJBZGRyXy5pcHY0OwotCi0gIGNhc2UgQUZfSU5FVDY6Ci0gICAgKmxlbiA9IHNpemVvZihzb2NrYWRkcl9pbjYpOwotICAgIHJldHVybiAoc29ja2FkZHIqKSAmY2FjaGVkUGVlckFkZHJfLmlwdjY7Ci0KLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotfSAKLQotYm9vbCBUU29ja2V0Ojp1c2VMb3dNaW5SdG9fID0gZmFsc2U7Ci12b2lkIFRTb2NrZXQ6OnNldFVzZUxvd01pblJ0byhib29sIHVzZUxvd01pblJ0bykgewotICB1c2VMb3dNaW5SdG9fID0gdXNlTG93TWluUnRvOwotfQotYm9vbCBUU29ja2V0OjpnZXRVc2VMb3dNaW5SdG8oKSB7Ci0gIHJldHVybiB1c2VMb3dNaW5SdG9fOwotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTb2NrZXQuaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU29ja2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MjE0OTEuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTb2NrZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNPQ0tFVF9IXwotI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU09DS0VUX0hfIDEKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0KLSNpbmNsdWRlICJUVHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAiVFZpcnR1YWxUcmFuc3BvcnQuaCIKLSNpbmNsdWRlICJUU2VydmVyU29ja2V0LmgiCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLS8qKgotICogVENQIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCi0gKgotICovCi1jbGFzcyBUU29ja2V0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRTb2NrZXQ+IHsKLSBwdWJsaWM6Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHNvY2tldC4gTm90ZSB0aGF0IHRoaXMgZG9lcyBOT1QgYWN0dWFsbHkgY29ubmVjdCB0aGUKLSAgICogc29ja2V0LgotICAgKgotICAgKi8KLSAgVFNvY2tldCgpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHNvY2tldC4gTm90ZSB0aGF0IHRoaXMgZG9lcyBOT1QgYWN0dWFsbHkgY29ubmVjdCB0aGUKLSAgICogc29ja2V0LgotICAgKgotICAgKiBAcGFyYW0gaG9zdCBBbiBJUCBhZGRyZXNzIG9yIGhvc3RuYW1lIHRvIGNvbm5lY3QgdG8KLSAgICogQHBhcmFtIHBvcnQgVGhlIHBvcnQgdG8gY29ubmVjdCBvbgotICAgKi8KLSAgVFNvY2tldChzdGQ6OnN0cmluZyBob3N0LCBpbnQgcG9ydCk7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBuZXcgVW5peCBkb21haW4gc29ja2V0LgotICAgKiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBhY3R1YWxseSBjb25uZWN0IHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBwYXRoIFRoZSBVbml4IGRvbWFpbiBzb2NrZXQgZS5nLiAiL3RtcC9UaHJpZnRUZXN0LmJpbmFyeS50aHJpZnQiCi0gICAqLwotICBUU29ja2V0KHN0ZDo6c3RyaW5nIHBhdGgpOwotCi0gIC8qKgotICAgKiBEZXN0cm95ZXMgdGhlIHNvY2tldCBvYmplY3QsIGNsb3NpbmcgaXQgaWYgbmVjZXNzYXJ5LgotICAgKi8KLSAgdmlydHVhbCB+VFNvY2tldCgpOwotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRoZSBzb2NrZXQgaXMgYWxpdmUuCi0gICAqCi0gICAqIEByZXR1cm4gSXMgdGhlIHNvY2tldCBhbGl2ZT8KLSAgICovCi0gIHZpcnR1YWwgYm9vbCBpc09wZW4oKTsKLQotICAvKioKLSAgICogQ2FsbHMgc2VsZWN0IG9uIHRoZSBzb2NrZXQgdG8gc2VlIGlmIHRoZXJlIGlzIG1vcmUgZGF0YSBhdmFpbGFibGUuCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgcGVlaygpOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuZCBvcGVucyB0aGUgVU5JWCBzb2NrZXQuCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBJZiB0aGUgc29ja2V0IGNvdWxkIG5vdCBjb25uZWN0Ci0gICAqLwotICB2aXJ0dWFsIHZvaWQgb3BlbigpOwotCi0gIC8qKgotICAgKiBTaHV0cyBkb3duIGNvbW11bmljYXRpb25zIG9uIHRoZSBzb2NrZXQuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKLQotICAvKioKLSAgICogUmVhZHMgZnJvbSB0aGUgdW5kZXJseWluZyBzb2NrZXQuCi0gICAqLwotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIC8qKgotICAgKiBXcml0ZXMgdG8gdGhlIHVuZGVybHlpbmcgc29ja2V0LiAgTG9vcHMgdW50aWwgZG9uZSBvciBmYWlsLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLQotICAvKioKLSAgICogV3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4gIERvZXMgc2luZ2xlIHNlbmQoKSBhbmQgcmV0dXJucyByZXN1bHQuCi0gICAqLwotICB1aW50MzJfdCB3cml0ZV9wYXJ0aWFsKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBob3N0IHRoYXQgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KLSAgICoKLSAgICogQHJldHVybiBzdHJpbmcgaG9zdCBpZGVudGlmaWVyCi0gICAqLwotICBzdGQ6OnN0cmluZyBnZXRIb3N0KCk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgcG9ydCB0aGF0IHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCi0gICAqCi0gICAqIEByZXR1cm4gaW50IHBvcnQgbnVtYmVyCi0gICAqLwotICBpbnQgZ2V0UG9ydCgpOwotCi0gIC8qKgotICAgKiBTZXQgdGhlIGhvc3QgdGhhdCBzb2NrZXQgd2lsbCBjb25uZWN0IHRvCi0gICAqCi0gICAqIEBwYXJhbSBob3N0IGhvc3QgaWRlbnRpZmllcgotICAgKi8KLSAgdm9pZCBzZXRIb3N0KHN0ZDo6c3RyaW5nIGhvc3QpOwotCi0gIC8qKgotICAgKiBTZXQgdGhlIHBvcnQgdGhhdCBzb2NrZXQgd2lsbCBjb25uZWN0IHRvCi0gICAqCi0gICAqIEBwYXJhbSBwb3J0IHBvcnQgbnVtYmVyCi0gICAqLwotICB2b2lkIHNldFBvcnQoaW50IHBvcnQpOwotCi0gIC8qKgotICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBsaW5nZXIgb3B0aW9uIGlzIHNldCBvbiB0aGUgc29ja2V0LgotICAgKgotICAgKiBAcGFyYW0gb24gICAgICBXaGV0aGVyIFNPX0xJTkdFUiBpcyBvbgotICAgKiBAcGFyYW0gbGluZ2VyICBJZiBsaW5nZXIgaXMgYWN0aXZlLCB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gbGluZ2VyIGZvcgotICAgKi8KLSAgdm9pZCBzZXRMaW5nZXIoYm9vbCBvbiwgaW50IGxpbmdlcik7Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdG8gZW5hYmxlL2Rpc2FibGUgTmFnbGUncyBhbGdvcml0aG0uCi0gICAqCi0gICAqIEBwYXJhbSBub0RlbGF5IFdoZXRoZXIgb3Igbm90IHRvIGRpc2FibGUgdGhlIGFsZ29yaXRobS4KLSAgICogQHJldHVybgotICAgKi8KLSAgdm9pZCBzZXROb0RlbGF5KGJvb2wgbm9EZWxheSk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgY29ubmVjdCB0aW1lb3V0Ci0gICAqLwotICB2b2lkIHNldENvbm5UaW1lb3V0KGludCBtcyk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgcmVjZWl2ZSB0aW1lb3V0Ci0gICAqLwotICB2b2lkIHNldFJlY3ZUaW1lb3V0KGludCBtcyk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgc2VuZCB0aW1lb3V0Ci0gICAqLwotICB2b2lkIHNldFNlbmRUaW1lb3V0KGludCBtcyk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbWF4IG51bWJlciBvZiByZWN2IHJldHJpZXMgaW4gY2FzZSBvZiBhbiBFQUdBSU4KLSAgICogZXJyb3IKLSAgICovCi0gIHZvaWQgc2V0TWF4UmVjdlJldHJpZXMoaW50IG1heFJlY3ZSZXRyaWVzKTsKLQotICAvKioKLSAgICogR2V0IHNvY2tldCBpbmZvcm1hdGlvbiBmb3JtYXRlZCBhcyBhIHN0cmluZyA8SG9zdDogeCBQb3J0OiB4PgotICAgKi8KLSAgc3RkOjpzdHJpbmcgZ2V0U29ja2V0SW5mbygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBETlMgbmFtZSBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZAotICAgKi8KLSAgc3RkOjpzdHJpbmcgZ2V0UGVlckhvc3QoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZAotICAgKi8KLSAgc3RkOjpzdHJpbmcgZ2V0UGVlckFkZHJlc3MoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcG9ydCBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZAotICAgKiovCi0gIGludCBnZXRQZWVyUG9ydCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IuCi0gICAqLwotICBpbnQgZ2V0U29ja2V0RkQoKSB7Ci0gICAgcmV0dXJuIHNvY2tldF87Ci0gIH0KLQotICAvKioKLSAgICogKFJlLSlpbml0aWFsaXplIGEgVFNvY2tldCBmb3IgdGhlIHN1cHBsaWVkIGRlc2NyaXB0b3IuICBUaGlzIGlzIG9ubHkKLSAgICogaW50ZW5kZWQgZm9yIHVzZSBieSBUTm9uYmxvY2tpbmdTZXJ2ZXIgLS0gb3RoZXIgdXNlIG1heSByZXN1bHQgaW4KLSAgICogdW5mb3J0dW5hdGUgc3VycHJpc2VzLgotICAgKgotICAgKiBAcGFyYW0gZmQgdGhlIGRlc2NyaXB0b3IgZm9yIGFuIGFscmVhZHktY29ubmVjdGVkIHNvY2tldAotICAgKi8KLSAgdm9pZCBzZXRTb2NrZXRGRChpbnQgZmQpOwotCi0gIC8qCi0gICAqIFJldHVybnMgYSBjYWNoZWQgY29weSBvZiB0aGUgcGVlciBhZGRyZXNzLgotICAgKi8KLSAgc29ja2FkZHIqIGdldENhY2hlZEFkZHJlc3Moc29ja2xlbl90KiBsZW4pIGNvbnN0OwotCi0gIC8qKgotICAgKiBTZXRzIHdoZXRoZXIgdG8gdXNlIGEgbG93IG1pbmltdW0gVENQIHJldHJhbnNtaXNzaW9uIHRpbWVvdXQuCi0gICAqLwotICBzdGF0aWMgdm9pZCBzZXRVc2VMb3dNaW5SdG8oYm9vbCB1c2VMb3dNaW5SdG8pOwotCi0gIC8qKgotICAgKiBHZXRzIHdoZXRoZXIgdG8gdXNlIGEgbG93IG1pbmltdW0gVENQIHJldHJhbnNtaXNzaW9uIHRpbWVvdXQuCi0gICAqLwotICBzdGF0aWMgYm9vbCBnZXRVc2VMb3dNaW5SdG8oKTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIHNvY2tldCBmcm9tIHJhdyBVTklYIGhhbmRsZS4KLSAgICovCi0gIFRTb2NrZXQoaW50IHNvY2tldCk7Ci0KLSAgLyoqCi0gICAqIFNldCBhIGNhY2hlIG9mIHRoZSBwZWVyIGFkZHJlc3MgKHVzZWQgd2hlbiB0cml2aWFsbHkgYXZhaWxhYmxlOiBlLmcuCi0gICAqIGFjY2VwdCgpIG9yIGNvbm5lY3QoKSkuIE9ubHkgY2FjaGVzIElQVjQgYW5kIElQVjY7IHVuc2V0IGZvciBvdGhlcnMuCi0gICAqLwotICB2b2lkIHNldENhY2hlZEFkZHJlc3MoY29uc3Qgc29ja2FkZHIqIGFkZHIsIHNvY2tsZW5fdCBsZW4pOwotCi0gcHJvdGVjdGVkOgotICAvKiogY29ubmVjdCwgY2FsbGVkIGJ5IG9wZW4gKi8KLSAgdm9pZCBvcGVuQ29ubmVjdGlvbihzdHJ1Y3QgYWRkcmluZm8gKnJlcyk7Ci0KLSAgLyoqIEhvc3QgdG8gY29ubmVjdCB0byAqLwotICBzdGQ6OnN0cmluZyBob3N0XzsKLQotICAvKiogUGVlciBob3N0bmFtZSAqLwotICBzdGQ6OnN0cmluZyBwZWVySG9zdF87Ci0KLSAgLyoqIFBlZXIgYWRkcmVzcyAqLwotICBzdGQ6OnN0cmluZyBwZWVyQWRkcmVzc187Ci0KLSAgLyoqIFBlZXIgcG9ydCAqLwotICBpbnQgcGVlclBvcnRfOwotCi0gIC8qKiBQb3J0IG51bWJlciB0byBjb25uZWN0IG9uICovCi0gIGludCBwb3J0XzsKLQotICAvKiogVU5JWCBkb21haW4gc29ja2V0IHBhdGggKi8KLSAgc3RkOjpzdHJpbmcgcGF0aF87Ci0KLSAgLyoqIFVuZGVybHlpbmcgVU5JWCBzb2NrZXQgaGFuZGxlICovCi0gIGludCBzb2NrZXRfOwotCi0gIC8qKiBDb25uZWN0IHRpbWVvdXQgaW4gbXMgKi8KLSAgaW50IGNvbm5UaW1lb3V0XzsKLQotICAvKiogU2VuZCB0aW1lb3V0IGluIG1zICovCi0gIGludCBzZW5kVGltZW91dF87Ci0KLSAgLyoqIFJlY3YgdGltZW91dCBpbiBtcyAqLwotICBpbnQgcmVjdlRpbWVvdXRfOwotCi0gIC8qKiBMaW5nZXIgb24gKi8KLSAgYm9vbCBsaW5nZXJPbl87Ci0KLSAgLyoqIExpbmdlciB2YWwgKi8KLSAgaW50IGxpbmdlclZhbF87Ci0KLSAgLyoqIE5vZGVsYXkgKi8KLSAgYm9vbCBub0RlbGF5XzsKLQotICAvKiogUmVjdiBFR0FJTiByZXRyaWVzICovCi0gIGludCBtYXhSZWN2UmV0cmllc187Ci0KLSAgLyoqIFJlY3YgdGltZW91dCB0aW1ldmFsICovCi0gIHN0cnVjdCB0aW1ldmFsIHJlY3ZUaW1ldmFsXzsKLQotICAvKiogQ2FjaGVkIHBlZXIgYWRkcmVzcyAqLwotICB1bmlvbiB7Ci0gICAgc29ja2FkZHJfaW4gaXB2NDsKLSAgICBzb2NrYWRkcl9pbjYgaXB2NjsKLSAgfSBjYWNoZWRQZWVyQWRkcl87Ci0KLSAgLyoqIENvbm5lY3Rpb24gc3RhcnQgdGltZSAqLwotICB0aW1lc3BlYyBzdGFydFRpbWVfOwotCi0gIC8qKiBXaGV0aGVyIHRvIHVzZSBsb3cgbWluaW11bSBUQ1AgcmV0cmFuc21pc3Npb24gdGltZW91dCAqLwotICBzdGF0aWMgYm9vbCB1c2VMb3dNaW5SdG9fOwotCi0gcHJpdmF0ZToKLSAgdm9pZCB1bml4X29wZW4oKTsKLSAgdm9pZCBsb2NhbF9vcGVuKCk7Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU09DS0VUX0hfCi0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAgYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldFBvb2wuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjBjNWEzLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSAiVFNvY2tldFBvb2wuaCIKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci0KLS8qKgotICogVFNvY2tldFBvb2xTZXJ2ZXIgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLVRTb2NrZXRQb29sU2VydmVyOjpUU29ja2V0UG9vbFNlcnZlcigpCi0gIDogaG9zdF8oIiIpLAotICAgIHBvcnRfKDApLAotICAgIHNvY2tldF8oLTEpLAotICAgIGxhc3RGYWlsVGltZV8oMCksCi0gICAgY29uc2VjdXRpdmVGYWlsdXJlc18oMCkge30KLQotLyoqCi0gKiBDb25zdHJ1Y3RvciBmb3IgVFNvY2tldFBvb2wgc2VydmVyCi0gKi8KLVRTb2NrZXRQb29sU2VydmVyOjpUU29ja2V0UG9vbFNlcnZlcihjb25zdCBzdHJpbmcgJmhvc3QsIGludCBwb3J0KQotICA6IGhvc3RfKGhvc3QpLAotICAgIHBvcnRfKHBvcnQpLAotICAgIHNvY2tldF8oLTEpLAotICAgIGxhc3RGYWlsVGltZV8oMCksCi0gICAgY29uc2VjdXRpdmVGYWlsdXJlc18oMCkge30KLQotLyoqCi0gKiBUU29ja2V0UG9vbCBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKi8KLQotVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sKCkgOiBUU29ja2V0KCksCi0gIG51bVJldHJpZXNfKDEpLAotICByZXRyeUludGVydmFsXyg2MCksCi0gIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKDEpLAotICByYW5kb21pemVfKHRydWUpLAotICBhbHdheXNUcnlMYXN0Xyh0cnVlKSB7Ci19Ci0KLVRTb2NrZXRQb29sOjpUU29ja2V0UG9vbChjb25zdCB2ZWN0b3I8c3RyaW5nPiAmaG9zdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPGludD4gJnBvcnRzKSA6IFRTb2NrZXQoKSwKLSAgbnVtUmV0cmllc18oMSksCi0gIHJldHJ5SW50ZXJ2YWxfKDYwKSwKLSAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18oMSksCi0gIHJhbmRvbWl6ZV8odHJ1ZSksCi0gIGFsd2F5c1RyeUxhc3RfKHRydWUpCi17Ci0gIGlmIChob3N0cy5zaXplKCkgIT0gcG9ydHMuc2l6ZSgpKSB7Ci0gICAgR2xvYmFsT3V0cHV0KCJUU29ja2V0UG9vbDo6VFNvY2tldFBvb2w6IGhvc3RzLnNpemUgIT0gcG9ydHMuc2l6ZSIpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MpOwotICB9Ci0KLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBob3N0cy5zaXplKCk7ICsraSkgewotICAgIGFkZFNlcnZlcihob3N0c1tpXSwgcG9ydHNbaV0pOwotICB9Ci19Ci0KLVRTb2NrZXRQb29sOjpUU29ja2V0UG9vbChjb25zdCB2ZWN0b3I8cGFpcjxzdHJpbmcsIGludD4gPiYgc2VydmVycykgOiBUU29ja2V0KCksCi0gIG51bVJldHJpZXNfKDEpLAotICByZXRyeUludGVydmFsXyg2MCksCi0gIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKDEpLAotICByYW5kb21pemVfKHRydWUpLAotICBhbHdheXNUcnlMYXN0Xyh0cnVlKQotewotICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2VydmVycy5zaXplKCk7ICsraSkgewotICAgIGFkZFNlcnZlcihzZXJ2ZXJzW2ldLmZpcnN0LCBzZXJ2ZXJzW2ldLnNlY29uZCk7Ci0gIH0KLX0KLQotVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sKGNvbnN0IHZlY3Rvcjwgc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycykgOiBUU29ja2V0KCksCi0gIHNlcnZlcnNfKHNlcnZlcnMpLAotICBudW1SZXRyaWVzXygxKSwKLSAgcmV0cnlJbnRlcnZhbF8oNjApLAotICBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXygxKSwKLSAgcmFuZG9taXplXyh0cnVlKSwKLSAgYWx3YXlzVHJ5TGFzdF8odHJ1ZSkKLXsKLX0KLQotVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sKGNvbnN0IHN0cmluZyYgaG9zdCwgaW50IHBvcnQpIDogVFNvY2tldCgpLAotICBudW1SZXRyaWVzXygxKSwKLSAgcmV0cnlJbnRlcnZhbF8oNjApLAotICBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXygxKSwKLSAgcmFuZG9taXplXyh0cnVlKSwKLSAgYWx3YXlzVHJ5TGFzdF8odHJ1ZSkKLXsKLSAgYWRkU2VydmVyKGhvc3QsIHBvcnQpOwotfQotCi1UU29ja2V0UG9vbDo6flRTb2NrZXRQb29sKCkgewotICB2ZWN0b3I8IHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBzZXJ2ZXJzXy5iZWdpbigpOwotICB2ZWN0b3I8IHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID46OmNvbnN0X2l0ZXJhdG9yIGl0ZXJFbmQgPSBzZXJ2ZXJzXy5lbmQoKTsKLSAgZm9yICg7IGl0ZXIgIT0gaXRlckVuZDsgKytpdGVyKSB7Ci0gICAgc2V0Q3VycmVudFNlcnZlcigqaXRlcik7Ci0gICAgVFNvY2tldFBvb2w6OmNsb3NlKCk7Ci0gIH0KLX0KLQotdm9pZCBUU29ja2V0UG9vbDo6YWRkU2VydmVyKGNvbnN0IHN0cmluZyYgaG9zdCwgaW50IHBvcnQpIHsKLSAgc2VydmVyc18ucHVzaF9iYWNrKHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+KG5ldyBUU29ja2V0UG9vbFNlcnZlcihob3N0LCBwb3J0KSkpOwotfQotCi12b2lkIFRTb2NrZXRQb29sOjphZGRTZXJ2ZXIoc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gJnNlcnZlcikgewotICBpZiAoc2VydmVyKSB7Ci0gICAgc2VydmVyc18ucHVzaF9iYWNrKHNlcnZlcik7Ci0gIH0KLX0KLQotdm9pZCBUU29ja2V0UG9vbDo6c2V0U2VydmVycyhjb25zdCB2ZWN0b3I8IHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpIHsKLSAgc2VydmVyc18gPSBzZXJ2ZXJzOwotfQotCi12b2lkIFRTb2NrZXRQb29sOjpnZXRTZXJ2ZXJzKHZlY3Rvcjwgc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycykgewotICBzZXJ2ZXJzID0gc2VydmVyc187Ci19Ci0KLXZvaWQgVFNvY2tldFBvb2w6OnNldE51bVJldHJpZXMoaW50IG51bVJldHJpZXMpIHsKLSAgbnVtUmV0cmllc18gPSBudW1SZXRyaWVzOwotfQotCi12b2lkIFRTb2NrZXRQb29sOjpzZXRSZXRyeUludGVydmFsKGludCByZXRyeUludGVydmFsKSB7Ci0gIHJldHJ5SW50ZXJ2YWxfID0gcmV0cnlJbnRlcnZhbDsKLX0KLQotCi12b2lkIFRTb2NrZXRQb29sOjpzZXRNYXhDb25zZWN1dGl2ZUZhaWx1cmVzKGludCBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzKSB7Ci0gIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfID0gbWF4Q29uc2VjdXRpdmVGYWlsdXJlczsKLX0KLQotdm9pZCBUU29ja2V0UG9vbDo6c2V0UmFuZG9taXplKGJvb2wgcmFuZG9taXplKSB7Ci0gIHJhbmRvbWl6ZV8gPSByYW5kb21pemU7Ci19Ci0KLXZvaWQgVFNvY2tldFBvb2w6OnNldEFsd2F5c1RyeUxhc3QoYm9vbCBhbHdheXNUcnlMYXN0KSB7Ci0gIGFsd2F5c1RyeUxhc3RfID0gYWx3YXlzVHJ5TGFzdDsKLX0KLQotdm9pZCBUU29ja2V0UG9vbDo6c2V0Q3VycmVudFNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiAmc2VydmVyKSB7Ci0gIGN1cnJlbnRTZXJ2ZXJfID0gc2VydmVyOwotICBob3N0XyA9IHNlcnZlci0+aG9zdF87Ci0gIHBvcnRfID0gc2VydmVyLT5wb3J0XzsKLSAgc29ja2V0XyA9IHNlcnZlci0+c29ja2V0XzsKLX0KLQotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIHRocm93cyBhbiBleGNlcHRpb24gaWYgc29ja2V0IG9wZW4gZmFpbHMuIFdoZW4gc29ja2V0Ci0gKiBvcGVucyBmYWlscywgdGhlIHNvY2tldCBpbiB0aGUgY3VycmVudCBzZXJ2ZXIgaXMgcmVzZXQuCi0gKi8KLS8qIFRPRE86IHdpdGhvdXQgYXBjIHdlIGlnbm9yZSBhIGxvdCBvZiBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIHBocCB2ZXJzaW9uICovCi12b2lkIFRTb2NrZXRQb29sOjpvcGVuKCkgewotCi0gIHVuc2lnbmVkIGludCBudW1TZXJ2ZXJzID0gc2VydmVyc18uc2l6ZSgpOwotICBpZiAobnVtU2VydmVycyA9PSAwKSB7Ci0gICAgc29ja2V0XyA9IC0xOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOwotICB9Ci0KLSAgaWYgKGlzT3BlbigpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHJhbmRvbWl6ZV8gJiYgbnVtU2VydmVycyA+IDEpIHsKLSAgICByYW5kb21fc2h1ZmZsZShzZXJ2ZXJzXy5iZWdpbigpLCBzZXJ2ZXJzXy5lbmQoKSk7Ci0gIH0KLQotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG51bVNlcnZlcnM7ICsraSkgewotCi0gICAgc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gJnNlcnZlciA9IHNlcnZlcnNfW2ldOwotICAgIC8vIEltcGVyc29uYXRlIHRoZSBzZXJ2ZXIgc29ja2V0Ci0gICAgc2V0Q3VycmVudFNlcnZlcihzZXJ2ZXIpOwotCi0gICAgaWYgKGlzT3BlbigpKSB7Ci0gICAgICAvLyBhbHJlYWR5IG9wZW4gbWVhbnMgd2UncmUgZG9uZQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGJvb2wgcmV0cnlJbnRlcnZhbFBhc3NlZCA9IChzZXJ2ZXItPmxhc3RGYWlsVGltZV8gPT0gMCk7Ci0gICAgYm9vbCBpc0xhc3RTZXJ2ZXIgPSBhbHdheXNUcnlMYXN0XyA/IChpID09IChudW1TZXJ2ZXJzIC0gMSkpIDogZmFsc2U7Ci0KLSAgICBpZiAoc2VydmVyLT5sYXN0RmFpbFRpbWVfID4gMCkgewotICAgICAgLy8gVGhlIHNlcnZlciB3YXMgbWFya2VkIGFzIGRvd24sIHNvIGNoZWNrIGlmIGVub3VnaCB0aW1lIGhhcyBlbGFwc2VkIHRvIHJldHJ5Ci0gICAgICBpbnQgZWxhcHNlZFRpbWUgPSB0aW1lKE5VTEwpIC0gc2VydmVyLT5sYXN0RmFpbFRpbWVfOwotICAgICAgaWYgKGVsYXBzZWRUaW1lID4gcmV0cnlJbnRlcnZhbF8pIHsKLSAgICAgICAgcmV0cnlJbnRlcnZhbFBhc3NlZCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHJldHJ5SW50ZXJ2YWxQYXNzZWQgfHwgaXNMYXN0U2VydmVyKSB7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IG51bVJldHJpZXNfOyArK2opIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBUU29ja2V0OjpvcGVuKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgewotICAgICAgICAgIHN0cmluZyBlcnJTdHIgPSAiVFNvY2tldFBvb2w6Om9wZW4gZmFpbGVkICIrZ2V0U29ja2V0SW5mbygpKyI6ICIrZS53aGF0KCk7Ci0gICAgICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICAgICAgICBzb2NrZXRfID0gLTE7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDb3B5IG92ZXIgdGhlIG9wZW5lZCBzb2NrZXQgc28gdGhhdCB3ZSBjYW4ga2VlcCBpdCBwZXJzaXN0ZW50Ci0gICAgICAgIHNlcnZlci0+c29ja2V0XyA9IHNvY2tldF87Ci0gICAgICAgIC8vIHJlc2V0IGxhc3RGYWlsVGltZV8gaXMgcmVxdWlyZWQKLSAgICAgICAgc2VydmVyLT5sYXN0RmFpbFRpbWVfID0gMDsKLSAgICAgICAgLy8gc3VjY2VzcwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgICsrc2VydmVyLT5jb25zZWN1dGl2ZUZhaWx1cmVzXzsKLSAgICAgIGlmIChzZXJ2ZXItPmNvbnNlY3V0aXZlRmFpbHVyZXNfID4gbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18pIHsKLSAgICAgICAgLy8gTWFyayBzZXJ2ZXIgYXMgZG93bgotICAgICAgICBzZXJ2ZXItPmNvbnNlY3V0aXZlRmFpbHVyZXNfID0gMDsKLSAgICAgICAgc2VydmVyLT5sYXN0RmFpbFRpbWVfID0gdGltZShOVUxMKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBHbG9iYWxPdXRwdXQoIlRTb2NrZXRQb29sOjpvcGVuOiBhbGwgY29ubmVjdGlvbnMgZmFpbGVkIik7Ci0gIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOwotfQotCi12b2lkIFRTb2NrZXRQb29sOjpjbG9zZSgpIHsKLSAgVFNvY2tldDo6Y2xvc2UoKTsKLSAgaWYgKGN1cnJlbnRTZXJ2ZXJfKSB7Ci0gICAgY3VycmVudFNlcnZlcl8tPnNvY2tldF8gPSAtMTsKLSAgfQotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmggYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldFBvb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ5MTE2YS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldFBvb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNPQ0tFVFBPT0xfSF8KLSNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNPQ0tFVFBPT0xfSF8gMQotCi0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgIlRTb2NrZXQuaCIKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotIC8qKgotICAqIENsYXNzIHRvIGhvbGQgc2VydmVyIGluZm9ybWF0aW9uIGZvciBUU29ja2V0UG9vbAotICAqCi0gICovCi1jbGFzcyBUU29ja2V0UG9vbFNlcnZlciB7Ci0KLSAgcHVibGljOgotICAvKioKLSAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3Igc2VydmVyIGluZm8KLSAgICovCi0gIFRTb2NrZXRQb29sU2VydmVyKCk7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBUU29ja2V0UG9vbCBzZXJ2ZXIKLSAgICovCi0gIFRTb2NrZXRQb29sU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nICZob3N0LCBpbnQgcG9ydCk7Ci0KLSAgLy8gSG9zdCBuYW1lCi0gIHN0ZDo6c3RyaW5nIGhvc3RfOwotCi0gIC8vIFBvcnQgdG8gY29ubmVjdCBvbgotICBpbnQgcG9ydF87Ci0KLSAgLy8gU29ja2V0IGZvciB0aGUgc2VydmVyCi0gIGludCBzb2NrZXRfOwotCi0gIC8vIExhc3QgdGltZSBjb25uZWN0aW5nIHRvIHRoaXMgc2VydmVyIGZhaWxlZAotICBpbnQgbGFzdEZhaWxUaW1lXzsKLQotICAvLyBOdW1iZXIgb2YgY29uc2VjdXRpdmUgdGltZXMgY29ubmVjdGluZyB0byB0aGlzIHNlcnZlciBmYWlsZWQKLSAgaW50IGNvbnNlY3V0aXZlRmFpbHVyZXNfOwotfTsKLQotLyoqCi0gKiBUQ1AgU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KLSAqCi0gKi8KLWNsYXNzIFRTb2NrZXRQb29sIDogcHVibGljIFRTb2NrZXQgewotCi0gcHVibGljOgotCi0gICAvKioKLSAgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCi0gICAgKi8KLSAgIFRTb2NrZXRQb29sKCk7Ci0KLSAgIC8qKgotICAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKLSAgICAqCi0gICAgKiBAcGFyYW0gaG9zdHMgbGlzdCBvZiBob3N0IG5hbWVzCi0gICAgKiBAcGFyYW0gcG9ydHMgbGlzdCBvZiBwb3J0IG5hbWVzCi0gICAgKi8KLSAgIFRTb2NrZXRQb29sKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmaG9zdHMsCi0gICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+ICZwb3J0cyk7Ci0KLSAgIC8qKgotICAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKLSAgICAqCi0gICAgKiBAcGFyYW0gc2VydmVycyBsaXN0IG9mIHBhaXJzIG9mIGhvc3QgbmFtZSBhbmQgcG9ydAotICAgICovCi0gICBUU29ja2V0UG9vbChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludD4gPiYgc2VydmVycyk7Ci0KLSAgIC8qKgotICAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKLSAgICAqCi0gICAgKiBAcGFyYW0gc2VydmVycyBsaXN0IG9mIFRTb2NrZXRQb29sU2VydmVycwotICAgICovCi0gIFRTb2NrZXRQb29sKGNvbnN0IHN0ZDo6dmVjdG9yPCBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycyk7Ci0KLSAgIC8qKgotICAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKLSAgICAqCi0gICAgKiBAcGFyYW0gaG9zdCBzaW5nbGUgaG9zdAotICAgICogQHBhcmFtIHBvcnQgc2luZ2xlIHBvcnQKLSAgICAqLwotICAgVFNvY2tldFBvb2woY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsIGludCBwb3J0KTsKLQotICAgLyoqCi0gICAgKiBEZXN0cm95ZXMgdGhlIHNvY2tldCBvYmplY3QsIGNsb3NpbmcgaXQgaWYgbmVjZXNzYXJ5LgotICAgICovCi0gICB2aXJ0dWFsIH5UU29ja2V0UG9vbCgpOwotCi0gICAvKioKLSAgICAqIEFkZCBhIHNlcnZlciB0byB0aGUgcG9vbAotICAgICovCi0gICB2b2lkIGFkZFNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgaW50IHBvcnQpOwotCi0gICAvKioKLSAgICAqIEFkZCBhIHNlcnZlciB0byB0aGUgcG9vbAotICAgICovCi0gIHZvaWQgYWRkU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiAmc2VydmVyKTsKLQotICAgLyoqCi0gICAgKiBTZXQgbGlzdCBvZiBzZXJ2ZXJzIGluIHRoaXMgcG9vbAotICAgICovCi0gIHZvaWQgc2V0U2VydmVycyhjb25zdCBzdGQ6OnZlY3RvcjwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpOwotCi0gICAvKioKLSAgICAqIEdldCBsaXN0IG9mIHNlcnZlcnMgaW4gdGhpcyBwb29sCi0gICAgKi8KLSAgdm9pZCBnZXRTZXJ2ZXJzKHN0ZDo6dmVjdG9yPCBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycyk7Ci0KLSAgIC8qKgotICAgICogU2V0cyBob3cgbWFueSB0aW1lcyB0byBrZWVwIHJldHJ5aW5nIGEgaG9zdCBpbiB0aGUgY29ubmVjdCBmdW5jdGlvbi4KLSAgICAqLwotICAgdm9pZCBzZXROdW1SZXRyaWVzKGludCBudW1SZXRyaWVzKTsKLQotICAgLyoqCi0gICAgKiBTZXRzIGhvdyBsb25nIHRvIHdhaXQgdW50aWwgcmV0cnlpbmcgYSBob3N0IGlmIGl0IHdhcyBtYXJrZWQgZG93bgotICAgICovCi0gICB2b2lkIHNldFJldHJ5SW50ZXJ2YWwoaW50IHJldHJ5SW50ZXJ2YWwpOwotCi0gICAvKioKLSAgICAqIFNldHMgaG93IG1hbnkgdGltZXMgdG8ga2VlcCByZXRyeWluZyBhIGhvc3QgYmVmb3JlIG1hcmtpbmcgaXQgYXMgZG93bi4KLSAgICAqLwotICAgdm9pZCBzZXRNYXhDb25zZWN1dGl2ZUZhaWx1cmVzKGludCBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzKTsKLQotICAgLyoqCi0gICAgKiBUdXJucyByYW5kb21pemF0aW9uIGluIGNvbm5lY3Qgb3JkZXIgb24gb3Igb2ZmLgotICAgICovCi0gICB2b2lkIHNldFJhbmRvbWl6ZShib29sIHJhbmRvbWl6ZSk7Ci0KLSAgIC8qKgotICAgICogV2hldGhlciB0byBhbHdheXMgdHJ5IHRoZSBsYXN0IHNlcnZlci4KLSAgICAqLwotICAgdm9pZCBzZXRBbHdheXNUcnlMYXN0KGJvb2wgYWx3YXlzVHJ5TGFzdCk7Ci0KLSAgIC8qKgotICAgICogQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIFVOSVggc29ja2V0LgotICAgICovCi0gICB2b2lkIG9wZW4oKTsKLQotICAgLyoKLSAgICAqIENsb3NlcyB0aGUgVU5JWCBzb2NrZXQKLSAgICAqLwotICAgdm9pZCBjbG9zZSgpOwotCi0gcHJvdGVjdGVkOgotCi0gIHZvaWQgc2V0Q3VycmVudFNlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gJnNlcnZlcik7Ci0KLSAgIC8qKiBMaXN0IG9mIHNlcnZlcnMgdG8gY29ubmVjdCB0byAqLwotICBzdGQ6OnZlY3RvcjwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4gc2VydmVyc187Ci0KLSAgLyoqIEN1cnJlbnQgc2VydmVyICovCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiBjdXJyZW50U2VydmVyXzsKLQotICAgLyoqIEhvdyBtYW55IHRpbWVzIHRvIHJldHJ5IGVhY2ggaG9zdCBpbiBjb25uZWN0ICovCi0gICBpbnQgbnVtUmV0cmllc187Ci0KLSAgIC8qKiBSZXRyeSBpbnRlcnZhbCBpbiBzZWNvbmRzLCBob3cgbG9uZyB0byBub3QgdHJ5IGEgaG9zdCBpZiBpdCBoYXMgYmVlbgotICAgICogbWFya2VkIGFzIGRvd24uCi0gICAgKi8KLSAgIGludCByZXRyeUludGVydmFsXzsKLQotICAgLyoqIE1heCBjb25zZWN1dGl2ZSBmYWlsdXJlcyBiZWZvcmUgbWFya2luZyBhIGhvc3QgZG93bi4gKi8KLSAgIGludCBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXzsKLQotICAgLyoqIFRyeSBob3N0cyBpbiBvcmRlcj8gb3IgUmFuZG9taXplZD8gKi8KLSAgIGJvb2wgcmFuZG9taXplXzsKLQotICAgLyoqIEFsd2F5cyB0cnkgbGFzdCBob3N0LCBldmVuIGlmIG1hcmtlZCBkb3duPyAqLwotICAgYm9vbCBhbHdheXNUcnlMYXN0XzsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTT0NLRVRQT09MX0hfCi0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTBlZDhhLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRfSF8KLSNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVF9IXyAxCi0KLSNpbmNsdWRlIDxUaHJpZnQuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotLyoqCi0gKiBIZWxwZXIgdGVtcGxhdGUgdG8gaG9pc3QgcmVhZEFsbCBpbXBsZW1lbnRhdGlvbiBvdXQgb2YgVFRyYW5zcG9ydAotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IHJlYWRBbGwoVHJhbnNwb3J0XyAmdHJhbnMsIHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIHVpbnQzMl90IGhhdmUgPSAwOwotICB1aW50MzJfdCBnZXQgPSAwOwotCi0gIHdoaWxlIChoYXZlIDwgbGVuKSB7Ci0gICAgZ2V0ID0gdHJhbnMucmVhZChidWYraGF2ZSwgbGVuLWhhdmUpOwotICAgIGlmIChnZXQgPD0gMCkgewotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIG1vcmUgZGF0YSB0byByZWFkLiIpOwotICAgIH0KLSAgICBoYXZlICs9IGdldDsKLSAgfQotCi0gIHJldHVybiBoYXZlOwotfQotCi0KLS8qKgotICogR2VuZXJpYyBpbnRlcmZhY2UgZm9yIGEgbWV0aG9kIG9mIHRyYW5zcG9ydGluZyBkYXRhLiBBIFRUcmFuc3BvcnQgbWF5IGJlCi0gKiBjYXBhYmxlIG9mIGVpdGhlciByZWFkaW5nIG9yIHdyaXRpbmcsIGJ1dCBub3QgbmVjZXNzYXJpbHkgYm90aC4KLSAqCi0gKi8KLWNsYXNzIFRUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgLyoqCi0gICAqIFZpcnR1YWwgZGVjb25zdHJ1Y3Rvci4KLSAgICovCi0gIHZpcnR1YWwgflRUcmFuc3BvcnQoKSB7fQotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW4uCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgaXNPcGVuKCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBUZXN0cyB3aGV0aGVyIHRoZXJlIGlzIG1vcmUgZGF0YSB0byByZWFkIG9yIGlmIHRoZSByZW1vdGUgc2lkZSBpcwotICAgKiBzdGlsbCBvcGVuLiBCeSBkZWZhdWx0IHRoaXMgaXMgdHJ1ZSB3aGVuZXZlciB0aGUgdHJhbnNwb3J0IGlzIG9wZW4sCi0gICAqIGJ1dCBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGFkZCBsb2dpYyB0byB0ZXN0IGZvciB0aGlzIGNvbmRpdGlvbiB3aGVyZQotICAgKiBwb3NzaWJsZSAoaS5lLiBvbiBhIHNvY2tldCkuCi0gICAqIFRoaXMgaXMgdXNlZCBieSBhIHNlcnZlciB0byBjaGVjayBpZiBpdCBzaG91bGQgbGlzdGVuIGZvciBhbm90aGVyCi0gICAqIHJlcXVlc3QuCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgcGVlaygpIHsKLSAgICByZXR1cm4gaXNPcGVuKCk7Ci0gIH0KLQotICAvKioKLSAgICogT3BlbnMgdGhlIHRyYW5zcG9ydCBmb3IgY29tbXVuaWNhdGlvbnMuCi0gICAqCi0gICAqIEByZXR1cm4gYm9vbCBXaGV0aGVyIHRoZSB0cmFuc3BvcnQgd2FzIHN1Y2Nlc3NmdWxseSBvcGVuZWQKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIG9wZW5pbmcgZmFpbGVkCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgb3BlbigpIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gYmFzZSBUVHJhbnNwb3J0LiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgdHJhbnNwb3J0LgotICAgKi8KLSAgdmlydHVhbCB2b2lkIGNsb3NlKCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDYW5ub3QgY2xvc2UgYmFzZSBUVHJhbnNwb3J0LiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEF0dGVtcHQgdG8gcmVhZCB1cCB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBpbnRvIHRoZSBzdHJpbmcuCi0gICAqCi0gICAqIEBwYXJhbSBidWYgIFJlZmVyZW5jZSB0byB0aGUgbG9jYXRpb24gdG8gd3JpdGUgdGhlIGRhdGEKLSAgICogQHBhcmFtIGxlbiAgSG93IG1hbnkgYnl0ZXMgdG8gcmVhZAotICAgKiBAcmV0dXJuIEhvdyBtYW55IGJ5dGVzIHdlcmUgYWN0dWFsbHkgcmVhZAotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCi0gICAqLwotICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gcmVhZF92aXJ0KGJ1ZiwgbGVuKTsKLSAgfQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRfdmlydCh1aW50OF90KiAvKiBidWYgKi8sIHVpbnQzMl90IC8qIGxlbiAqLykgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFzZSBUVHJhbnNwb3J0IGNhbm5vdCByZWFkLiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWRzIHRoZSBnaXZlbiBhbW91bnQgb2YgZGF0YSBpbiBpdHMgZW50aXJldHkgbm8gbWF0dGVyIHdoYXQuCi0gICAqCi0gICAqIEBwYXJhbSBzICAgICBSZWZlcmVuY2UgdG8gbG9jYXRpb24gZm9yIHJlYWQgZGF0YQotICAgKiBAcGFyYW0gbGVuICAgSG93IG1hbnkgYnl0ZXMgdG8gcmVhZAotICAgKiBAcmV0dXJuIEhvdyBtYW55IGJ5dGVzIHJlYWQsIHdoaWNoIG11c3QgYmUgZXF1YWwgdG8gc2l6ZQotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgaW5zdWZmaWNpZW50IGRhdGEgd2FzIHJlYWQKLSAgICovCi0gIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiByZWFkQWxsX3ZpcnQoYnVmLCBsZW4pOwotICB9Ci0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEFsbF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgcmV0dXJuIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OnJlYWRBbGwoKnRoaXMsIGJ1ZiwgbGVuKTsKLSAgfQotCi0gIC8qKgotICAgKiBDYWxsZWQgd2hlbiByZWFkIGlzIGNvbXBsZXRlZC4KLSAgICogVGhpcyBjYW4gYmUgb3Zlci1yaWRkZW4gdG8gcGVyZm9ybSBhIHRyYW5zcG9ydC1zcGVjaWZpYyBhY3Rpb24KLSAgICogZS5nLiBsb2dnaW5nIHRoZSByZXF1ZXN0IHRvIGEgZmlsZQotICAgKgotICAgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyByZWFkIGlmIGF2YWlsYWJsZSwgMCBvdGhlcndpc2UuCi0gICAqLwotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRFbmQoKSB7Ci0gICAgLy8gZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gZG8gbm90aGluZwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyB0aGUgc3RyaW5nIGluIGl0cyBlbnRpcmV0eSB0byB0aGUgYnVmZmVyLgotICAgKgotICAgKiBOb3RlOiBZb3UgbXVzdCBjYWxsIGZsdXNoKCkgdG8gZW5zdXJlIHRoZSBkYXRhIGlzIGFjdHVhbGx5IHdyaXR0ZW4sCi0gICAqIGFuZCBhdmFpbGFibGUgdG8gYmUgcmVhZCBiYWNrIGluIHRoZSBmdXR1cmUuICBEZXN0cm95aW5nIGEgVFRyYW5zcG9ydAotICAgKiBvYmplY3QgZG9lcyBub3QgYXV0b21hdGljYWxseSBmbHVzaCBwZW5kaW5nIGRhdGEtLWlmIHlvdSBkZXN0cm95IGEKLSAgICogVFRyYW5zcG9ydCBvYmplY3Qgd2l0aCB3cml0dGVuIGJ1dCB1bmZsdXNoZWQgZGF0YSwgdGhhdCBkYXRhIG1heSBiZQotICAgKiBkaXNjYXJkZWQuCi0gICAqCi0gICAqIEBwYXJhbSBidWYgIFRoZSBkYXRhIHRvIHdyaXRlIG91dAotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAqLwotICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICB3cml0ZV92aXJ0KGJ1ZiwgbGVuKTsKLSAgfQotICB2aXJ0dWFsIHZvaWQgd3JpdGVfdmlydChjb25zdCB1aW50OF90KiAvKiBidWYgKi8sIHVpbnQzMl90IC8qIGxlbiAqLykgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFzZSBUVHJhbnNwb3J0IGNhbm5vdCB3cml0ZS4iKTsKLSAgfQotCi0gIC8qKgotICAgKiBDYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZWQuCi0gICAqIFRoaXMgY2FuIGJlIG92ZXItcmlkZGVuIHRvIHBlcmZvcm0gYSB0cmFuc3BvcnQtc3BlY2lmaWMgYWN0aW9uCi0gICAqIGF0IHRoZSBlbmQgb2YgYSByZXF1ZXN0LgotICAgKgotICAgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGlmIGF2YWlsYWJsZSwgMCBvdGhlcndpc2UKLSAgICovCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVFbmQoKSB7Ci0gICAgLy8gZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gZG8gbm90aGluZwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLyoqCi0gICAqIEZsdXNoZXMgYW55IHBlbmRpbmcgZGF0YSB0byBiZSB3cml0dGVuLiBUeXBpY2FsbHkgdXNlZCB3aXRoIGJ1ZmZlcmVkCi0gICAqIHRyYW5zcG9ydCBtZWNoYW5pc21zLgotICAgKgotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgZmx1c2goKSB7Ci0gICAgLy8gZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gZG8gbm90aGluZwotICB9Ci0KLSAgLyoqCi0gICAqIEF0dGVtcHRzIHRvIHJldHVybiBhIHBvaW50ZXIgdG8gXGMgbGVuIGJ5dGVzLCBwb3NzaWJseSBjb3BpZWQgaW50byBcYyBidWYuCi0gICAqIERvZXMgbm90IGNvbnN1bWUgdGhlIGJ5dGVzIHJlYWQgKGkuZS46IGEgbGF0ZXIgcmVhZCB3aWxsIHJldHVybiB0aGUgc2FtZQotICAgKiBkYXRhKS4gIFRoaXMgbWV0aG9kIGlzIG1lYW50IHRvIHN1cHBvcnQgcHJvdG9jb2xzIHRoYXQgbmVlZCB0byByZWFkCi0gICAqIHZhcmlhYmxlLWxlbmd0aCBmaWVsZHMuICBUaGV5IGNhbiBhdHRlbXB0IHRvIGJvcnJvdyB0aGUgbWF4aW11bSBhbW91bnQgb2YKLSAgICogZGF0YSB0aGF0IHRoZXkgd2lsbCBuZWVkLCB0aGVuIGNvbnN1bWUgKHNlZSBuZXh0IG1ldGhvZCkgd2hhdCB0aGV5Ci0gICAqIGFjdHVhbGx5IHVzZS4gIFNvbWUgdHJhbnNwb3J0cyB3aWxsIG5vdCBzdXBwb3J0IHRoaXMgbWV0aG9kIGFuZCBvdGhlcnMKLSAgICogd2lsbCBmYWlsIG9jY2FzaW9uYWxseSwgc28gcHJvdG9jb2xzIG11c3QgYmUgcHJlcGFyZWQgdG8gdXNlIHJlYWQgaWYKLSAgICogYm9ycm93IGZhaWxzLgotICAgKgotICAgKiBAb2FyYW0gYnVmICBBIGJ1ZmZlciB3aGVyZSB0aGUgZGF0YSBjYW4gYmUgc3RvcmVkIGlmIG5lZWRlZC4KLSAgICogICAgICAgICAgICAgSWYgYm9ycm93IGRvZXNuJ3QgcmV0dXJuIGJ1ZiwgdGhlbiB0aGUgY29udGVudHMgb2YKLSAgICogICAgICAgICAgICAgYnVmIGFmdGVyIHRoZSBjYWxsIGFyZSB1bmRlZmluZWQuICBUaGlzIHBhcmFtZXRlciBtYXkgYmUKLSAgICogICAgICAgICAgICAgTlVMTCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjYWxsZXIgaXMgbm90IHN1cHBseWluZyBzdG9yYWdlLAotICAgKiAgICAgICAgICAgICBidXQgd291bGQgbGlrZSBhIHBvaW50ZXIgaW50byBhbiBpbnRlcm5hbCBidWZmZXIsIGlmCi0gICAqICAgICAgICAgICAgIGF2YWlsYWJsZS4KLSAgICogQHBhcmFtIGxlbiAgKmxlbiBzaG91bGQgaW5pdGlhbGx5IGNvbnRhaW4gdGhlIG51bWJlciBvZiBieXRlcyB0byBib3Jyb3cuCi0gICAqICAgICAgICAgICAgIElmIGJvcnJvdyBzdWNjZWVkcywgKmxlbiB3aWxsIGNvbnRhaW4gdGhlIG51bWJlciBvZiBieXRlcwotICAgKiAgICAgICAgICAgICBhdmFpbGFibGUgaW4gdGhlIHJldHVybmVkIHBvaW50ZXIuICBUaGlzIHdpbGwgYmUgYXQgbGVhc3QKLSAgICogICAgICAgICAgICAgd2hhdCB3YXMgcmVxdWVzdGVkLCBidXQgbWF5IGJlIG1vcmUgaWYgYm9ycm93IHJldHVybnMKLSAgICogICAgICAgICAgICAgYSBwb2ludGVyIHRvIGFuIGludGVybmFsIGJ1ZmZlciwgcmF0aGVyIHRoYW4gYnVmLgotICAgKiAgICAgICAgICAgICBJZiBib3Jyb3cgZmFpbHMsIHRoZSBjb250ZW50cyBvZiAqbGVuIGFyZSB1bmRlZmluZWQuCi0gICAqIEByZXR1cm4gSWYgdGhlIGJvcnJvdyBzdWNjZWVkcywgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYm9ycm93ZWQgZGF0YS4KLSAgICogICAgICAgICBUaGlzIG1pZ2h0IGJlIGVxdWFsIHRvIFxjIGJ1Ziwgb3IgaXQgbWlnaHQgYmUgYSBwb2ludGVyIGludG8KLSAgICogICAgICAgICB0aGUgdHJhbnNwb3J0J3MgaW50ZXJuYWwgYnVmZmVycy4KLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgKi8KLSAgY29uc3QgdWludDhfdCogYm9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIGJvcnJvd192aXJ0KGJ1ZiwgbGVuKTsKLSAgfQotICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd192aXJ0KHVpbnQ4X3QqIC8qIGJ1ZiAqLywgdWludDMyX3QqIC8qIGxlbiAqLykgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZSBsZW4gYnl0ZXMgZnJvbSB0aGUgdHJhbnNwb3J0LiAgVGhpcyBzaG91bGQgYWx3YXlzIGZvbGxvdyBhIGJvcnJvdwotICAgKiBvZiBhdCBsZWFzdCBsZW4gYnl0ZXMsIGFuZCBzaG91bGQgYWx3YXlzIHN1Y2NlZWQuCi0gICAqIFRPRE8oZHJlaXNzKTogSXMgdGhlcmUgYW55IHRyYW5zcG9ydCB0aGF0IGNvdWxkIGJvcnJvdyBidXQgZmFpbCB0bwotICAgKiBjb25zdW1lLCBvciB0aGF0IHdvdWxkIHJlcXVpcmUgYSBidWZmZXIgdG8gZHVtcCB0aGUgY29uc3VtZWQgZGF0YT8KLSAgICoKLSAgICogQHBhcmFtIGxlbiAgSG93IG1hbnkgYnl0ZXMgdG8gY29uc3VtZQotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCi0gICAqLwotICB2b2lkIGNvbnN1bWUodWludDMyX3QgbGVuKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICBjb25zdW1lX3ZpcnQobGVuKTsKLSAgfQotICB2aXJ0dWFsIHZvaWQgY29uc3VtZV92aXJ0KHVpbnQzMl90IC8qIGxlbiAqLykgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFzZSBUVHJhbnNwb3J0IGNhbm5vdCBjb25zdW1lLiIpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8qKgotICAgKiBTaW1wbGUgY29uc3RydWN0b3IuCi0gICAqLwotICBUVHJhbnNwb3J0KCkge30KLX07Ci0KLS8qKgotICogR2VuZXJpYyBmYWN0b3J5IGNsYXNzIHRvIG1ha2UgYW4gaW5wdXQgYW5kIG91dHB1dCB0cmFuc3BvcnQgb3V0IG9mIGEKLSAqIHNvdXJjZSB0cmFuc3BvcnQuIENvbW1vbmx5IHVzZWQgaW5zaWRlIHNlcnZlcnMgdG8gbWFrZSBpbnB1dCBhbmQgb3V0cHV0Ci0gKiBzdHJlYW1zIG91dCBvZiByYXcgY2xpZW50cy4KLSAqCi0gKi8KLWNsYXNzIFRUcmFuc3BvcnRGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIFRUcmFuc3BvcnRGYWN0b3J5KCkge30KLQotICB2aXJ0dWFsIH5UVHJhbnNwb3J0RmFjdG9yeSgpIHt9Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLCBqdXN0IHJldHVybnMgdGhlIHRyYW5zcG9ydCBnaXZlbi4KLSAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgcmV0dXJuIHRyYW5zOwotICB9Ci0KLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNwcCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBhYWVkYy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgotI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxjb25maWcuaD4KLQotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBib29zdDo6bGV4aWNhbF9jYXN0OwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA2MzBlZi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JURVhDRVBUSU9OX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRFWENFUFRJT05fSF8gMQotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPFRocmlmdC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi0vKioKLSAqIENsYXNzIHRvIGVuY2Fwc3VsYXRlIGFsbCB0aGUgcG9zc2libGUgdHlwZXMgb2YgdHJhbnNwb3J0IGVycm9ycyB0aGF0IG1heQotICogb2NjdXIgaW4gdmFyaW91cyB0cmFuc3BvcnQgc3lzdGVtcy4gVGhpcyBwcm92aWRlcyBhIHNvcnQgb2YgZ2VuZXJpYwotICogd3JhcHBlciBhcm91bmQgdGhlIHZhZ3VlIFVOSVggRV8gZXJyb3IgY29kZXMgdGhhdCBsZXRzIGEgY29tbW9uIGNvZGUKLSAqIGJhc2Ugb2YgZXJyb3IgaGFuZGxpbmcgdG8gYmUgdXNlZCBmb3IgdmFyaW91cyB0eXBlcyBvZiB0cmFuc3BvcnRzLCBpLmUuCi0gKiBwaXBlcyBldGMuCi0gKgotICovCi1jbGFzcyBUVHJhbnNwb3J0RXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKLSBwdWJsaWM6Ci0gIC8qKgotICAgKiBFcnJvciBjb2RlcyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgZXhjZXB0aW9ucy4KLSAgICovCi0gIGVudW0gVFRyYW5zcG9ydEV4Y2VwdGlvblR5cGUKLSAgeyBVTktOT1dOID0gMAotICAsIE5PVF9PUEVOID0gMQotICAsIFRJTUVEX09VVCA9IDIKLSAgLCBFTkRfT0ZfRklMRSA9IDMKLSAgLCBJTlRFUlJVUFRFRCA9IDQKLSAgLCBCQURfQVJHUyA9IDUKLSAgLCBDT1JSVVBURURfREFUQSA9IDYKLSAgLCBJTlRFUk5BTF9FUlJPUiA9IDcKLSAgfTsKLQotICBUVHJhbnNwb3J0RXhjZXB0aW9uKCkgOgotICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCksCi0gICAgdHlwZV8oVU5LTk9XTikge30KLQotICBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIHR5cGUpIDoKLSAgICBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigpLAotICAgIHR5cGVfKHR5cGUpIHt9Ci0KLSAgVFRyYW5zcG9ydEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOgotICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLAotICAgIHR5cGVfKFVOS05PV04pIHt9Ci0KLSAgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOgotICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLAotICAgIHR5cGVfKHR5cGUpIHt9Ci0KLSAgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJub19jb3B5KSA6Ci0gICAgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24obWVzc2FnZSArICI6ICIgKyBUT3V0cHV0OjpzdHJlcnJvcl9zKGVycm5vX2NvcHkpKSwKLSAgICB0eXBlXyh0eXBlKSB7fQotCi0gIHZpcnR1YWwgflRUcmFuc3BvcnRFeGNlcHRpb24oKSB0aHJvdygpIHt9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIGVycm9yCi0gICAqIHRoYXQgaGFzIG9jY3VycmVkLgotICAgKgotICAgKiBAcmV0dXJuIEVycm9yIGNvZGUKLSAgICovCi0gIFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIGdldFR5cGUoKSBjb25zdCB0aHJvdygpIHsKLSAgICByZXR1cm4gdHlwZV87Ci0gIH0KLQotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpIHsKLSAgICBpZiAobWVzc2FnZV8uZW1wdHkoKSkgewotICAgICAgc3dpdGNoICh0eXBlXykgewotICAgICAgICBjYXNlIFVOS05PV04gICAgICAgIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBVbmtub3duIHRyYW5zcG9ydCBleGNlcHRpb24iOwotICAgICAgICBjYXNlIE5PVF9PUEVOICAgICAgIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBUcmFuc3BvcnQgbm90IG9wZW4iOwotICAgICAgICBjYXNlIFRJTUVEX09VVCAgICAgIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBUaW1lZCBvdXQiOwotICAgICAgICBjYXNlIEVORF9PRl9GSUxFICAgIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBFbmQgb2YgZmlsZSI7Ci0gICAgICAgIGNhc2UgSU5URVJSVVBURUQgICAgOiByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IEludGVycnVwdGVkIjsKLSAgICAgICAgY2FzZSBCQURfQVJHUyAgICAgICA6IHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogSW52YWxpZCBhcmd1bWVudHMiOwotICAgICAgICBjYXNlIENPUlJVUFRFRF9EQVRBIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBDb3JydXB0ZWQgRGF0YSI7Ci0gICAgICAgIGNhc2UgSU5URVJOQUxfRVJST1IgOiByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IEludGVybmFsIGVycm9yIjsKLSAgICAgICAgZGVmYXVsdCAgICAgICAgICAgICA6IHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogKEludmFsaWQgZXhjZXB0aW9uIHR5cGUpIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIG1lc3NhZ2VfLmNfc3RyKCk7Ci0gICAgfQotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8qKiBKdXN0IGxpa2Ugc3RyZXJyb3JfciBidXQgcmV0dXJucyBhIEMrKyBzdHJpbmcgb2JqZWN0LiAqLwotICBzdGQ6OnN0cmluZyBzdHJlcnJvcl9zKGludCBlcnJub19jb3B5KTsKLQotICAvKiogRXJyb3IgY29kZSAqLwotICBUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlXzsKLQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVEVYQ0VQVElPTl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5jcHAgYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIyODliYy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+Ci0KLXVzaW5nIHN0ZDo6c3RyaW5nOwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi11aW50MzJfdCBUUGlwZWRUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgdWludDMyX3QgbmVlZCA9IGxlbjsKLQotICAvLyBXZSBkb24ndCBoYXZlIGVub3VnaCBkYXRhIHlldAotICBpZiAockxlbl8tclBvc18gPCBuZWVkKSB7Ci0gICAgLy8gQ29weSBvdXQgd2hhdGV2ZXIgd2UgaGF2ZQotICAgIGlmIChyTGVuXy1yUG9zXyA+IDApIHsKLSAgICAgIG1lbWNweShidWYsIHJCdWZfK3JQb3NfLCByTGVuXy1yUG9zXyk7Ci0gICAgICBuZWVkIC09IHJMZW5fLXJQb3NfOwotICAgICAgYnVmICs9IHJMZW5fLXJQb3NfOwotICAgICAgclBvc18gPSByTGVuXzsKLSAgICB9Ci0KLSAgICAvLyBEb3VibGUgdGhlIHNpemUgb2YgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlmIGl0IGlzIGZ1bGwKLSAgICBpZiAockxlbl8gPT0gckJ1ZlNpemVfKSB7Ci0gICAgICByQnVmU2l6ZV8gKj0yOwotICAgICAgckJ1Zl8gPSAodWludDhfdCAqKXN0ZDo6cmVhbGxvYyhyQnVmXywgc2l6ZW9mKHVpbnQ4X3QpICogckJ1ZlNpemVfKTsKLSAgICB9Ci0KLSAgICAvLyB0cnkgdG8gZmlsbCB1cCB0aGUgYnVmZmVyCi0gICAgckxlbl8gKz0gc3JjVHJhbnNfLT5yZWFkKHJCdWZfK3JQb3NfLCByQnVmU2l6ZV8gLSByUG9zXyk7Ci0gIH0KLQotCi0gIC8vIEhhbmQgb3ZlciB3aGF0ZXZlciB3ZSBoYXZlCi0gIHVpbnQzMl90IGdpdmUgPSBuZWVkOwotICBpZiAockxlbl8tclBvc18gPCBnaXZlKSB7Ci0gICAgZ2l2ZSA9IHJMZW5fLXJQb3NfOwotICB9Ci0gIGlmIChnaXZlID4gMCkgewotICAgIG1lbWNweShidWYsIHJCdWZfK3JQb3NfLCBnaXZlKTsKLSAgICByUG9zXyArPSBnaXZlOwotICAgIG5lZWQgLT0gZ2l2ZTsKLSAgfQotCi0gIHJldHVybiAobGVuIC0gbmVlZCk7Ci19Ci0KLXZvaWQgVFBpcGVkVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICBpZiAobGVuID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBNYWtlIHRoZSBidWZmZXIgYXMgYmlnIGFzIGl0IG5lZWRzIHRvIGJlCi0gIGlmICgobGVuICsgd0xlbl8pID49IHdCdWZTaXplXykgewotICAgIHVpbnQzMl90IG5ld0J1ZlNpemUgPSB3QnVmU2l6ZV8qMjsKLSAgICB3aGlsZSAoKGxlbiArIHdMZW5fKSA+PSBuZXdCdWZTaXplKSB7Ci0gICAgICBuZXdCdWZTaXplICo9IDI7Ci0gICAgfQotICAgIHdCdWZfID0gKHVpbnQ4X3QgKilzdGQ6OnJlYWxsb2Mod0J1Zl8sIHNpemVvZih1aW50OF90KSAqIG5ld0J1ZlNpemUpOwotICAgIHdCdWZTaXplXyA9IG5ld0J1ZlNpemU7Ci0gIH0KLQotICAvLyBDb3B5IGludG8gdGhlIGJ1ZmZlcgotICBtZW1jcHkod0J1Zl8gKyB3TGVuXywgYnVmLCBsZW4pOwotICB3TGVuXyArPSBsZW47Ci19Ci0KLXZvaWQgVFBpcGVkVHJhbnNwb3J0OjpmbHVzaCgpICB7Ci0gIC8vIFdyaXRlIG91dCBhbnkgZGF0YSB3YWl0aW5nIGluIHRoZSB3cml0ZSBidWZmZXIKLSAgaWYgKHdMZW5fID4gMCkgewotICAgIHNyY1RyYW5zXy0+d3JpdGUod0J1Zl8sIHdMZW5fKTsKLSAgICB3TGVuXyA9IDA7Ci0gIH0KLQotICAvLyBGbHVzaCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQKLSAgc3JjVHJhbnNfLT5mbHVzaCgpOwotfQotCi1UUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucywgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpCi0gIDogVFBpcGVkVHJhbnNwb3J0KHNyY1RyYW5zLCBkc3RUcmFucyksCi0gICAgc3JjVHJhbnNfKHNyY1RyYW5zKSB7Ci19Ci0KLVRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6On5UUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KCkgewotfQotCi1ib29sIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OmlzT3BlbigpIHsKLSAgcmV0dXJuIFRQaXBlZFRyYW5zcG9ydDo6aXNPcGVuKCk7Ci19Ci0KLWJvb2wgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6cGVlaygpIHsKLSAgcmV0dXJuIFRQaXBlZFRyYW5zcG9ydDo6cGVlaygpOwotfQotCi12b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6Om9wZW4oKSB7Ci0gIFRQaXBlZFRyYW5zcG9ydDo6b3BlbigpOwotfQotCi12b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OmNsb3NlKCkgewotICBUUGlwZWRUcmFuc3BvcnQ6OmNsb3NlKCk7Ci19Ci0KLXVpbnQzMl90IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgcmV0dXJuIFRQaXBlZFRyYW5zcG9ydDo6cmVhZChidWYsIGxlbik7Ci19Ci0KLXVpbnQzMl90IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgdWludDMyX3QgaGF2ZSA9IDA7Ci0gIHVpbnQzMl90IGdldCA9IDA7Ci0KLSAgd2hpbGUgKGhhdmUgPCBsZW4pIHsKLSAgICBnZXQgPSByZWFkKGJ1ZitoYXZlLCBsZW4taGF2ZSk7Ci0gICAgaWYgKGdldCA8PSAwKSB7Ci0gICAgICB0aHJvdyBURU9GRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIGhhdmUgKz0gZ2V0OwotICB9Ci0KLSAgcmV0dXJuIGhhdmU7Ci19Ci0KLXVpbnQzMl90IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnJlYWRFbmQoKSB7Ci0gIHJldHVybiBUUGlwZWRUcmFuc3BvcnQ6OnJlYWRFbmQoKTsKLX0KLQotdm9pZCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICBUUGlwZWRUcmFuc3BvcnQ6OndyaXRlKGJ1ZiwgbGVuKTsKLX0KLQotdWludDMyX3QgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6d3JpdGVFbmQoKSB7Ci0gIHJldHVybiBUUGlwZWRUcmFuc3BvcnQ6OndyaXRlRW5kKCk7Ci19Ci0KLXZvaWQgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6Zmx1c2goKSB7Ci0gIFRQaXBlZFRyYW5zcG9ydDo6Zmx1c2goKTsKLX0KLQotaW50MzJfdCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpnZXRSZWFkVGltZW91dCgpIHsKLSAgcmV0dXJuIHNyY1RyYW5zXy0+Z2V0UmVhZFRpbWVvdXQoKTsKLX0KLQotdm9pZCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpzZXRSZWFkVGltZW91dChpbnQzMl90IHJlYWRUaW1lb3V0KSB7Ci0gIHNyY1RyYW5zXy0+c2V0UmVhZFRpbWVvdXQocmVhZFRpbWVvdXQpOwotfQotCi11aW50MzJfdCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpnZXROdW1DaHVua3MoKSB7Ci0gIHJldHVybiBzcmNUcmFuc18tPmdldE51bUNodW5rcygpOwotfQotCi11aW50MzJfdCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpnZXRDdXJDaHVuaygpIHsKLSAgcmV0dXJuIHNyY1RyYW5zXy0+Z2V0Q3VyQ2h1bmsoKTsKLX0KLQotdm9pZCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpzZWVrVG9DaHVuayhpbnQzMl90IGNodW5rKSB7Ci0gIHNyY1RyYW5zXy0+c2Vla1RvQ2h1bmsoY2h1bmspOwotfQotCi12b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnNlZWtUb0VuZCgpIHsKLSAgc3JjVHJhbnNfLT5zZWVrVG9FbmQoKTsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjZGFhZC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRVVElMU19IXwotI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JUVVRJTFNfSF8gMQotCi0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KLS8vIEluY2x1ZGUgdGhlIGJ1ZmZlcmVkIHRyYW5zcG9ydHMgdGhhdCB1c2VkIHRvIGJlIGRlZmluZWQgaGVyZS4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotLyoqCi0gKiBUaGUgbnVsbCB0cmFuc3BvcnQgaXMgYSBkdW1teSB0cmFuc3BvcnQgdGhhdCBkb2Vzbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nLgotICogSXQncyBzb3J0IG9mIGFuIGFuYWxvZ3kgdG8gL2Rldi9udWxsLCB5b3UgY2FuIG5ldmVyIHJlYWQgYW55dGhpbmcgZnJvbSBpdAotICogYW5kIGl0IHdpbGwgbGV0IHlvdSB3cml0ZSBhbnl0aGluZyB5b3Ugd2FudCB0byBpdCwgdGhvdWdoIGl0IHdvbid0IGFjdHVhbGx5Ci0gKiBnbyBhbnl3aGVyZS4KLSAqCi0gKi8KLWNsYXNzIFROdWxsVHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFROdWxsVHJhbnNwb3J0PiB7Ci0gcHVibGljOgotICBUTnVsbFRyYW5zcG9ydCgpIHt9Ci0KLSAgflROdWxsVHJhbnNwb3J0KCkge30KLQotICBib29sIGlzT3BlbigpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZvaWQgb3BlbigpIHt9Ci0KLSAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiAvKiBidWYgKi8sIHVpbnQzMl90IC8qIGxlbiAqLykgewotICAgIHJldHVybjsKLSAgfQotCi19OwotCi0KLS8qKgotICogVFBpcGVkVHJhbnNwb3J0LiBUaGlzIHRyYW5zcG9ydCBhbGxvd3MgcGlwaW5nIG9mIGEgcmVxdWVzdCBmcm9tIG9uZQotICogdHJhbnNwb3J0IHRvIGFub3RoZXIgZWl0aGVyIHdoZW4gcmVhZEVuZCgpIG9yIHdyaXRlRW5kKCkuIFRoZSB0eXBpY2FsCi0gKiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0byBsb2cgYSByZXF1ZXN0IG9yIGEgcmVwbHkgdG8gZGlzay4KLSAqIFRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBleHBhbmRzIHRvIGEga2VlcCBhIGNvcHkgb2YgdGhlIGVudGlyZQotICogcmVxdWVzdC9yZXNwb25zZS4KLSAqCi0gKi8KLWNsYXNzIFRQaXBlZFRyYW5zcG9ydCA6IHZpcnR1YWwgcHVibGljIFRUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgVFBpcGVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zLAotICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpIDoKLSAgICBzcmNUcmFuc18oc3JjVHJhbnMpLAotICAgIGRzdFRyYW5zXyhkc3RUcmFucyksCi0gICAgckJ1ZlNpemVfKDUxMiksIHJQb3NfKDApLCByTGVuXygwKSwKLSAgICB3QnVmU2l6ZV8oNTEyKSwgd0xlbl8oMCkgewotCi0gICAgLy8gZGVmYXVsdCBpcyB0byB0byBwaXBlIHRoZSByZXF1ZXN0IHdoZW4gcmVhZEVuZCgpIGlzIGNhbGxlZAotICAgIHBpcGVPblJlYWRfID0gdHJ1ZTsKLSAgICBwaXBlT25Xcml0ZV8gPSBmYWxzZTsKLQotICAgIHJCdWZfID0gKHVpbnQ4X3QqKSBzdGQ6Om1hbGxvYyhzaXplb2YodWludDhfdCkgKiByQnVmU2l6ZV8pOwotICAgIGlmIChyQnVmXyA9PSBOVUxMKSB7Ci0gICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwotICAgIH0KLSAgICB3QnVmXyA9ICh1aW50OF90Kikgc3RkOjptYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICogd0J1ZlNpemVfKTsKLSAgICBpZiAod0J1Zl8gPT0gTlVMTCkgewotICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKLSAgICB9Ci0gIH0KLQotICBUUGlwZWRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnMsCi0gICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucywKLSAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN6KSA6Ci0gICAgc3JjVHJhbnNfKHNyY1RyYW5zKSwKLSAgICBkc3RUcmFuc18oZHN0VHJhbnMpLAotICAgIHJCdWZTaXplXyg1MTIpLCByUG9zXygwKSwgckxlbl8oMCksCi0gICAgd0J1ZlNpemVfKHN6KSwgd0xlbl8oMCkgewotCi0gICAgckJ1Zl8gPSAodWludDhfdCopIHN0ZDo6bWFsbG9jKHNpemVvZih1aW50OF90KSAqIHJCdWZTaXplXyk7Ci0gICAgaWYgKHJCdWZfID09IE5VTEwpIHsKLSAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7Ci0gICAgfQotICAgIHdCdWZfID0gKHVpbnQ4X3QqKSBzdGQ6Om1hbGxvYyhzaXplb2YodWludDhfdCkgKiB3QnVmU2l6ZV8pOwotICAgIGlmICh3QnVmXyA9PSBOVUxMKSB7Ci0gICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwotICAgIH0KLSAgfQotCi0gIH5UUGlwZWRUcmFuc3BvcnQoKSB7Ci0gICAgc3RkOjpmcmVlKHJCdWZfKTsKLSAgICBzdGQ6OmZyZWUod0J1Zl8pOwotICB9Ci0KLSAgYm9vbCBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIHNyY1RyYW5zXy0+aXNPcGVuKCk7Ci0gIH0KLQotICBib29sIHBlZWsoKSB7Ci0gICAgaWYgKHJQb3NfID49IHJMZW5fKSB7Ci0gICAgICAvLyBEb3VibGUgdGhlIHNpemUgb2YgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlmIGl0IGlzIGZ1bGwKLSAgICAgIGlmIChyTGVuXyA9PSByQnVmU2l6ZV8pIHsKLSAgICAgICAgckJ1ZlNpemVfICo9MjsKLSAgICAgICAgckJ1Zl8gPSAodWludDhfdCAqKXN0ZDo6cmVhbGxvYyhyQnVmXywgc2l6ZW9mKHVpbnQ4X3QpICogckJ1ZlNpemVfKTsKLSAgICAgIH0KLQotICAgICAgLy8gdHJ5IHRvIGZpbGwgdXAgdGhlIGJ1ZmZlcgotICAgICAgckxlbl8gKz0gc3JjVHJhbnNfLT5yZWFkKHJCdWZfK3JQb3NfLCByQnVmU2l6ZV8gLSByUG9zXyk7Ci0gICAgfQotICAgIHJldHVybiAockxlbl8gPiByUG9zXyk7Ci0gIH0KLQotCi0gIHZvaWQgb3BlbigpIHsKLSAgICBzcmNUcmFuc18tPm9wZW4oKTsKLSAgfQotCi0gIHZvaWQgY2xvc2UoKSB7Ci0gICAgc3JjVHJhbnNfLT5jbG9zZSgpOwotICB9Ci0KLSAgdm9pZCBzZXRQaXBlT25SZWFkKGJvb2wgcGlwZVZhbCkgewotICAgIHBpcGVPblJlYWRfID0gcGlwZVZhbDsKLSAgfQotCi0gIHZvaWQgc2V0UGlwZU9uV3JpdGUoYm9vbCBwaXBlVmFsKSB7Ci0gICAgcGlwZU9uV3JpdGVfID0gcGlwZVZhbDsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIHVpbnQzMl90IHJlYWRFbmQoKSB7Ci0KLSAgICBpZiAocGlwZU9uUmVhZF8pIHsKLSAgICAgIGRzdFRyYW5zXy0+d3JpdGUockJ1Zl8sIHJQb3NfKTsKLSAgICAgIGRzdFRyYW5zXy0+Zmx1c2goKTsKLSAgICB9Ci0KLSAgICBzcmNUcmFuc18tPnJlYWRFbmQoKTsKLQotICAgIC8vIElmIHJlcXVlc3RzIGFyZSBiZWluZyBwaXBlbGluZWQsIGNvcHkgZG93biBvdXIgcmVhZC1haGVhZCBkYXRhLAotICAgIC8vIHRoZW4gcmVzZXQgb3VyIHN0YXRlLgotICAgIGludCByZWFkX2FoZWFkID0gckxlbl8gLSByUG9zXzsKLSAgICB1aW50MzJfdCBieXRlcyA9IHJQb3NfOwotICAgIG1lbWNweShyQnVmXywgckJ1Zl8gKyByUG9zXywgcmVhZF9haGVhZCk7Ci0gICAgclBvc18gPSAwOwotICAgIHJMZW5fID0gcmVhZF9haGVhZDsKLQotICAgIHJldHVybiBieXRlczsKLSAgfQotCi0gIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIHVpbnQzMl90IHdyaXRlRW5kKCkgewotICAgIGlmIChwaXBlT25Xcml0ZV8pIHsKLSAgICAgIGRzdFRyYW5zXy0+d3JpdGUod0J1Zl8sIHdMZW5fKTsKLSAgICAgIGRzdFRyYW5zXy0+Zmx1c2goKTsKLSAgICB9Ci0gICAgcmV0dXJuIHdMZW5fOwotICB9Ci0KLSAgdm9pZCBmbHVzaCgpOwotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRhcmdldFRyYW5zcG9ydCgpIHsKLSAgICByZXR1cm4gZHN0VHJhbnNfOwotICB9Ci0KLSAgLyoKLSAgICogT3ZlcnJpZGUgVFRyYW5zcG9ydCAqX3ZpcnQoKSBmdW5jdGlvbnMgdG8gaW52b2tlIG91ciBpbXBsZW1lbnRhdGlvbnMuCi0gICAqIFdlIGNhbm5vdCB1c2UgVFZpcnR1YWxUcmFuc3BvcnQgdG8gcHJvdmlkZSB0aGVzZSwgc2luY2Ugd2UgbmVlZCB0byBpbmhlcml0Ci0gICAqIHZpcnR1YWxseSBmcm9tIFRUcmFuc3BvcnQuCi0gICAqLwotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHJldHVybiB0aGlzLT5yZWFkKGJ1ZiwgbGVuKTsKLSAgfQotICB2aXJ0dWFsIHZvaWQgd3JpdGVfdmlydChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHRoaXMtPndyaXRlKGJ1ZiwgbGVuKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFuc187Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zXzsKLQotICB1aW50OF90KiByQnVmXzsKLSAgdWludDMyX3QgckJ1ZlNpemVfOwotICB1aW50MzJfdCByUG9zXzsKLSAgdWludDMyX3Qgckxlbl87Ci0KLSAgdWludDhfdCogd0J1Zl87Ci0gIHVpbnQzMl90IHdCdWZTaXplXzsKLSAgdWludDMyX3Qgd0xlbl87Ci0KLSAgYm9vbCBwaXBlT25SZWFkXzsKLSAgYm9vbCBwaXBlT25Xcml0ZV87Ci19OwotCi0KLS8qKgotICogV3JhcHMgYSB0cmFuc3BvcnQgaW50byBhIHBpcGVkVHJhbnNwb3J0IGluc3RhbmNlLgotICoKLSAqLwotY2xhc3MgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7Ci0gcHVibGljOgotICBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KLSAgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykgewotICAgIGluaXRpYWxpemVUYXJnZXRUcmFuc3BvcnQoZHN0VHJhbnMpOwotICB9Ci0gIHZpcnR1YWwgflRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoKSB7fQotCi0gIC8qKgotICAgKiBXcmFwcyB0aGUgYmFzZSB0cmFuc3BvcnQgaW50byBhIHBpcGVkIHRyYW5zcG9ydC4KLSAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUUGlwZWRUcmFuc3BvcnQoc3JjVHJhbnMsIGRzdFRyYW5zXykpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIGluaXRpYWxpemVUYXJnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpIHsKLSAgICBpZiAoZHN0VHJhbnNfLmdldCgpID09IE5VTEwpIHsKLSAgICAgIGRzdFRyYW5zXyA9IGRzdFRyYW5zOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKCJUYXJnZXQgdHJhbnNwb3J0IGFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKLSAgICB9Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnNfOwotfTsKLQotLyoqCi0gKiBUUGlwZWRGaWxlVHJhbnNwb3J0LiBUaGlzIGlzIGp1c3QgbGlrZSBhIFRUcmFuc3BvcnQsIGV4Y2VwdCB0aGF0Ci0gKiBpdCBpcyBhIHRlbXBsYXRpemVkIGNsYXNzLCBzbyB0aGF0IGNsaWVudHMgd2hvIHJlbHkgb24gYSBzcGVjaWZpYwotICogVFRyYW5zcG9ydCBjYW4gc3RpbGwgYWNjZXNzIHRoZSBvcmlnaW5hbCB0cmFuc3BvcnQuCi0gKgotICovCi1jbGFzcyBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0IDogcHVibGljIFRQaXBlZFRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVEZpbGVSZWFkZXJUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gc3JjVHJhbnMsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKTsKLQotICB+VFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydCgpOwotCi0gIC8vIFRUcmFuc3BvcnQgZnVuY3Rpb25zCi0gIGJvb2wgaXNPcGVuKCk7Ci0gIGJvb2wgcGVlaygpOwotICB2b2lkIG9wZW4oKTsKLSAgdm9pZCBjbG9zZSgpOwotICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLSAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0gIHVpbnQzMl90IHJlYWRFbmQoKTsKLSAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0gIHVpbnQzMl90IHdyaXRlRW5kKCk7Ci0gIHZvaWQgZmx1c2goKTsKLQotICAvLyBURmlsZVJlYWRlclRyYW5zcG9ydCBmdW5jdGlvbnMKLSAgaW50MzJfdCBnZXRSZWFkVGltZW91dCgpOwotICB2b2lkIHNldFJlYWRUaW1lb3V0KGludDMyX3QgcmVhZFRpbWVvdXQpOwotICB1aW50MzJfdCBnZXROdW1DaHVua3MoKTsKLSAgdWludDMyX3QgZ2V0Q3VyQ2h1bmsoKTsKLSAgdm9pZCBzZWVrVG9DaHVuayhpbnQzMl90IGNodW5rKTsKLSAgdm9pZCBzZWVrVG9FbmQoKTsKLQotICAvKgotICAgKiBPdmVycmlkZSBUVHJhbnNwb3J0ICpfdmlydCgpIGZ1bmN0aW9ucyB0byBpbnZva2Ugb3VyIGltcGxlbWVudGF0aW9ucy4KLSAgICogV2UgY2Fubm90IHVzZSBUVmlydHVhbFRyYW5zcG9ydCB0byBwcm92aWRlIHRoZXNlLCBzaW5jZSB3ZSBuZWVkIHRvIGluaGVyaXQKLSAgICogdmlydHVhbGx5IGZyb20gVFRyYW5zcG9ydC4KLSAgICovCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgcmV0dXJuIHRoaXMtPnJlYWQoYnVmLCBsZW4pOwotICB9Ci0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEFsbF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgcmV0dXJuIHRoaXMtPnJlYWRBbGwoYnVmLCBsZW4pOwotICB9Ci0gIHZpcnR1YWwgdm9pZCB3cml0ZV92aXJ0KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgdGhpcy0+d3JpdGUoYnVmLCBsZW4pOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8vIHNob3VsZG4ndCBiZSB1c2VkCi0gIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHNyY1RyYW5zXzsKLX07Ci0KLS8qKgotICogQ3JlYXRlcyBhIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQgZnJvbSBhIGZpbGVwYXRoIGFuZCBhIGRlc3RpbmF0aW9uIHRyYW5zcG9ydAotICoKLSAqLwotY2xhc3MgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydEZhY3RvcnkgOiBwdWJsaWMgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSB7Ci0gcHVibGljOgotICBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0RmFjdG9yeSgpIHt9Ci0gIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKQotICAgIDogVFBpcGVkVHJhbnNwb3J0RmFjdG9yeShkc3RUcmFucykKLSAge30KLSAgdmlydHVhbCB+VFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydEZhY3RvcnkoKSB7fQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucykgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBwRmlsZVJlYWRlclRyYW5zcG9ydCA9IGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxURmlsZVJlYWRlclRyYW5zcG9ydD4oc3JjVHJhbnMpOwotICAgIGlmIChwRmlsZVJlYWRlclRyYW5zcG9ydC5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICByZXR1cm4gZ2V0RmlsZVJlYWRlclRyYW5zcG9ydChwRmlsZVJlYWRlclRyYW5zcG9ydCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PigpOwotICAgIH0KLSAgfQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBnZXRGaWxlUmVhZGVyVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucykgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4obmV3IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoc3JjVHJhbnMsIGRzdFRyYW5zXykpOwotICB9Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JUVVRJTFNfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NjA2ODEuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RWSVJUVUFMVFJBTlNQT1JUX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RWSVJUVUFMVFJBTlNQT1JUX0hfIDEKLQotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdGhhdCBwcm92aWRlcyBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiBUVHJhbnNwb3J0IG1ldGhvZHMuCi0gKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiByZWFkKCksIHJlYWRBbGwoKSwgd3JpdGUoKSwKLSAqIGJvcnJvdygpIGFuZCBjb25zdW1lKCkuCi0gKgotICogSW4gdGhlIFRUcmFuc3BvcnQgYmFzZSBjbGFzcywgZWFjaCBvZiB0aGVzZSBtZXRob2RzIHNpbXBseSBpbnZva2VzIGl0cwotICogdmlydHVhbCBjb3VudGVycGFydC4gIFRoaXMgY2xhc3Mgb3ZlcnJpZGVzIHRoZW0gdG8gYWx3YXlzIHBlcmZvcm0gdGhlCi0gKiBkZWZhdWx0IGJlaGF2aW9yLCB3aXRob3V0IGEgdmlydHVhbCBmdW5jdGlvbiBjYWxsLgotICoKLSAqIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byBzZXJ2ZSBhcyBhIGJhc2UgY2xhc3MgZm9yCi0gKiBUVmlydHVhbFRyYW5zcG9ydCwgYW5kIHByZXZlbnQgaW5maW5pdGUgcmVjdXJzaW9uIGlmIG9uZSBvZiBpdHMgc3ViY2xhc3NlcwotICogZG9lcyBub3Qgb3ZlcnJpZGUgdGhlIFRUcmFuc3BvcnQgaW1wbGVtZW50YXRpb24gb2YgdGhlc2UgbWV0aG9kcy4gIChTaW5jZQotICogVFZpcnR1YWxUcmFuc3BvcnQ6OnJlYWRfdmlydCgpIGNhbGxzIHJlYWQoKSwgYW5kIFRUcmFuc3BvcnQ6OnJlYWQoKSBjYWxscwotICogcmVhZF92aXJ0KCkuKQotICovCi1jbGFzcyBUVHJhbnNwb3J0RGVmYXVsdHMgOiBwdWJsaWMgVFRyYW5zcG9ydCB7Ci0gcHVibGljOgotICAvKgotICAgKiBUVHJhbnNwb3J0ICpfdmlydCgpIG1ldGhvZHMgcHJvdmlkZSByZWFzb25hYmxlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zLgotICAgKiBJbnZva2UgdGhlbSBub24tdmlydHVhbGx5LgotICAgKi8KLSAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHJldHVybiB0aGlzLT5UVHJhbnNwb3J0OjpyZWFkX3ZpcnQoYnVmLCBsZW4pOwotICB9Ci0gIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICByZXR1cm4gdGhpcy0+VFRyYW5zcG9ydDo6cmVhZEFsbF92aXJ0KGJ1ZiwgbGVuKTsKLSAgfQotICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgdGhpcy0+VFRyYW5zcG9ydDo6d3JpdGVfdmlydChidWYsIGxlbik7Ci0gIH0KLSAgY29uc3QgdWludDhfdCogYm9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgewotICAgIHJldHVybiB0aGlzLT5UVHJhbnNwb3J0Ojpib3Jyb3dfdmlydChidWYsIGxlbik7Ci0gIH0KLSAgdm9pZCBjb25zdW1lKHVpbnQzMl90IGxlbikgewotICAgIHRoaXMtPlRUcmFuc3BvcnQ6OmNvbnN1bWVfdmlydChsZW4pOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIFRUcmFuc3BvcnREZWZhdWx0cygpIHt9Ci19OwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBwcm92aWRlIHBvbHltb3JwaGlzbSBmb3Igc3ViY2xhc3NlcyBvZiBUVHJhbnNwb3J0LgotICoKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyAqX3ZpcnQoKSBtZXRob2RzIG9mIFRUcmFuc3BvcnQsIHRvIGNhbGwgdGhlCi0gKiBub24tdmlydHVhbCB2ZXJzaW9ucyBvZiB0aGVzZSBmdW5jdGlvbnMgaW4gdGhlIHByb3BlciBzdWJjbGFzcy4KLSAqCi0gKiBUbyBkZWZpbmUgeW91ciBvd24gdHJhbnNwb3J0IGNsYXNzIHVzaW5nIFRWaXJ0dWFsVHJhbnNwb3J0OgotICogMSkgRGVyaXZlIHlvdXIgc3ViY2xhc3MgZnJvbSBUVmlydHVhbFRyYW5zcG9ydDx5b3VyIGNsYXNzPgotICogICAgZS5nOiAgY2xhc3MgTXlUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8TXlUcmFuc3BvcnQ+IHsKLSAqIDIpIFByb3ZpZGUgeW91ciBvd24gaW1wbGVtZW50YXRpb25zIG9mIHJlYWQoKSwgcmVhZEFsbCgpLCBldGMuCi0gKiAgICBUaGVzZSBtZXRob2RzIHNob3VsZCBiZSBub24tdmlydHVhbC4KLSAqCi0gKiBUcmFuc3BvcnQgaW1wbGVtZW50YXRpb25zIHRoYXQgbmVlZCB0byB1c2UgdmlydHVhbCBpbmhlcml0YW5jZSB3aGVuCi0gKiBpbmhlcml0aW5nIGZyb20gVFRyYW5zcG9ydCBjYW5ub3QgdXNlIFRWaXJ0dWFsVHJhbnNwb3J0LgotICoKLSAqIEBhdXRob3IgQ2hhZCBXYWx0ZXJzIDxjaGFkQHBvd2Vyc2V0LmNvbT4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIFN1cGVyXz1UVHJhbnNwb3J0RGVmYXVsdHM+Ci1jbGFzcyBUVmlydHVhbFRyYW5zcG9ydCA6IHB1YmxpYyBTdXBlcl8gewotIHB1YmxpYzoKLSAgLyoKLSAgICogSW1wbGVtZW50YXRpb25zIG9mIHRoZSAqX3ZpcnQoKSBmdW5jdGlvbnMsIHRvIGNhbGwgdGhlIHN1YmNsYXNzJ3MKLSAgICogbm9uLXZpcnR1YWwgaW1wbGVtZW50YXRpb24gZnVuY3Rpb24uCi0gICAqLwotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxUcmFuc3BvcnRfKj4odGhpcyktPnJlYWQoYnVmLCBsZW4pOwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkQWxsX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VHJhbnNwb3J0Xyo+KHRoaXMpLT5yZWFkQWxsKGJ1ZiwgbGVuKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCB3cml0ZV92aXJ0KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgc3RhdGljX2Nhc3Q8VHJhbnNwb3J0Xyo+KHRoaXMpLT53cml0ZShidWYsIGxlbik7Ci0gIH0KLQotICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd192aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxUcmFuc3BvcnRfKj4odGhpcyktPmJvcnJvdyhidWYsIGxlbik7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgY29uc3VtZV92aXJ0KHVpbnQzMl90IGxlbikgewotICAgIHN0YXRpY19jYXN0PFRyYW5zcG9ydF8qPih0aGlzKS0+Y29uc3VtZShsZW4pOwotICB9Ci0KLSAgLyoKLSAgICogUHJvdmlkZSBhIGRlZmF1bHQgcmVhZEFsbCgpIGltcGxlbWVudGF0aW9uIHRoYXQgaW52b2tlcwotICAgKiByZWFkKCkgbm9uLXZpcnR1YWxseS4KLSAgICoKLSAgICogTm90ZTogc3ViY2xhc3NlcyB0aGF0IHVzZSBUVmlydHVhbFRyYW5zcG9ydCB0byBkZXJpdmUgZnJvbSBhbm90aGVyCi0gICAqIHRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbiAoaS5lLiwgbm90IFRUcmFuc3BvcnREZWZhdWx0cykgc2hvdWxkIGJld2FyZSB0aGF0Ci0gICAqIHRoaXMgbWF5IG92ZXJyaWRlIGFueSBub24tZGVmYXVsdCByZWFkQWxsKCkgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkKLSAgICogdGhlIHBhcmVudCB0cmFuc3BvcnQgY2xhc3MuICBUaGV5IG1heSBuZWVkIHRvIHJlZGVmaW5lIHJlYWRBbGwoKSB0byBjYWxsCi0gICAqIHRoZSBjb3JyZWN0IHBhcmVudCBpbXBsZW1lbnRhdGlvbiwgaWYgZGVzaXJlZC4KLSAgICovCi0gIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICBUcmFuc3BvcnRfKiB0cmFucyA9IHN0YXRpY19jYXN0PFRyYW5zcG9ydF8qPih0aGlzKTsKLSAgICByZXR1cm4gOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpyZWFkQWxsKCp0cmFucywgYnVmLCBsZW4pOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIFRWaXJ0dWFsVHJhbnNwb3J0KCkge30KLQotICAvKgotICAgKiBUZW1wbGF0aXplZCBjb25zdHJ1Y3RvcnMsIHRvIGFsbG93IGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIFN1cGVyXwotICAgKiBjb25zdHJ1Y3Rvci4gIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgMCwgMSwgb3IgMiBhcmd1bWVudHMsIGJ1dAotICAgKiBhZGRpdGlvbmFsIHZlcnNpb25zIGNhbiBiZSBhZGRlZCBhcyBuZWVkZWQuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnXz4KLSAgVFZpcnR1YWxUcmFuc3BvcnQoQXJnXyBjb25zdCYgYXJnKSA6IFN1cGVyXyhhcmcpIHsgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmcxXywgdHlwZW5hbWUgQXJnMl8+Ci0gIFRWaXJ0dWFsVHJhbnNwb3J0KEFyZzFfIGNvbnN0JiBhMSwgQXJnMl8gY29uc3QmIGEyKSA6IFN1cGVyXyhhMSwgYTIpIHsgfQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFZJUlRVQUxUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTY1Mjg4Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaD4KLSNpbmNsdWRlIDx6bGliLmg+Ci0KLXVzaW5nIHN0ZDo6c3RyaW5nOwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi0vLyBEb24ndCBjYWxsIHRoaXMgb3V0c2lkZSBvZiB0aGUgY29uc3RydWN0b3IuCi12b2lkIFRabGliVHJhbnNwb3J0Ojppbml0WmxpYigpIHsKLSAgaW50IHJ2OwotICBib29sIHJfaW5pdCA9IGZhbHNlOwotICB0cnkgewotICAgIHJzdHJlYW1fID0gbmV3IHpfc3RyZWFtOwotICAgIHdzdHJlYW1fID0gbmV3IHpfc3RyZWFtOwotCi0gICAgcnN0cmVhbV8tPnphbGxvYyA9IFpfTlVMTDsKLSAgICB3c3RyZWFtXy0+emFsbG9jID0gWl9OVUxMOwotICAgIHJzdHJlYW1fLT56ZnJlZSAgPSBaX05VTEw7Ci0gICAgd3N0cmVhbV8tPnpmcmVlICA9IFpfTlVMTDsKLSAgICByc3RyZWFtXy0+b3BhcXVlID0gWl9OVUxMOwotICAgIHdzdHJlYW1fLT5vcGFxdWUgPSBaX05VTEw7Ci0KLSAgICByc3RyZWFtXy0+bmV4dF9pbiAgID0gY3JidWZfOwotICAgIHdzdHJlYW1fLT5uZXh0X2luICAgPSB1d2J1Zl87Ci0gICAgcnN0cmVhbV8tPm5leHRfb3V0ICA9IHVyYnVmXzsKLSAgICB3c3RyZWFtXy0+bmV4dF9vdXQgID0gY3didWZfOwotICAgIHJzdHJlYW1fLT5hdmFpbF9pbiAgPSAwOwotICAgIHdzdHJlYW1fLT5hdmFpbF9pbiAgPSAwOwotICAgIHJzdHJlYW1fLT5hdmFpbF9vdXQgPSB1cmJ1Zl9zaXplXzsKLSAgICB3c3RyZWFtXy0+YXZhaWxfb3V0ID0gY3didWZfc2l6ZV87Ci0KLSAgICBydiA9IGluZmxhdGVJbml0KHJzdHJlYW1fKTsKLSAgICBjaGVja1psaWJSdihydiwgcnN0cmVhbV8tPm1zZyk7Ci0KLSAgICAvLyBIYXZlIHRvIHNldCB0aGlzIGZsYWcgc28gd2Uga25vdyB3aGV0aGVyIHRvIGRlLWluaXRpYWxpemUuCi0gICAgcl9pbml0ID0gdHJ1ZTsKLQotICAgIHJ2ID0gZGVmbGF0ZUluaXQod3N0cmVhbV8sIFpfREVGQVVMVF9DT01QUkVTU0lPTik7Ci0gICAgY2hlY2tabGliUnYocnYsIHdzdHJlYW1fLT5tc2cpOwotICB9Ci0KLSAgY2F0Y2ggKC4uLikgewotICAgIGlmIChyX2luaXQpIHsKLSAgICAgIHJ2ID0gaW5mbGF0ZUVuZChyc3RyZWFtXyk7Ci0gICAgICBjaGVja1psaWJSdk5vdGhyb3cocnYsIHJzdHJlYW1fLT5tc2cpOwotICAgIH0KLSAgICAvLyBUaGVyZSBpcyBubyB3YXkgd2UgY2FuIGdldCBoZXJlIGlmIHdzdHJlYW1fIHdhcyBpbml0aWFsaXplZC4KLQotICAgIHRocm93OwotICB9Ci19Ci0KLWlubGluZSB2b2lkIFRabGliVHJhbnNwb3J0OjpjaGVja1psaWJSdihpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBtZXNzYWdlKSB7Ci0gIGlmIChzdGF0dXMgIT0gWl9PSykgewotICAgIHRocm93IFRabGliVHJhbnNwb3J0RXhjZXB0aW9uKHN0YXR1cywgbWVzc2FnZSk7Ci0gIH0KLX0KLQotaW5saW5lIHZvaWQgVFpsaWJUcmFuc3BvcnQ6OmNoZWNrWmxpYlJ2Tm90aHJvdyhpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBtZXNzYWdlKSB7Ci0gIGlmIChzdGF0dXMgIT0gWl9PSykgewotICAgIHN0cmluZyBvdXRwdXQgPSAiVFpsaWJUcmFuc3BvcnQ6IHpsaWIgZmFpbHVyZSBpbiBkZXN0cnVjdG9yOiAiICsKLSAgICAgIFRabGliVHJhbnNwb3J0RXhjZXB0aW9uOjplcnJvck1lc3NhZ2Uoc3RhdHVzLCBtZXNzYWdlKTsKLSAgICBHbG9iYWxPdXRwdXQob3V0cHV0LmNfc3RyKCkpOwotICB9Ci19Ci0KLVRabGliVHJhbnNwb3J0Ojp+VFpsaWJUcmFuc3BvcnQoKSB7Ci0gIGludCBydjsKLSAgcnYgPSBpbmZsYXRlRW5kKHJzdHJlYW1fKTsKLSAgY2hlY2tabGliUnZOb3Rocm93KHJ2LCByc3RyZWFtXy0+bXNnKTsKLQotICBydiA9IGRlZmxhdGVFbmQod3N0cmVhbV8pOwotICAvLyBaX0RBVEFfRVJST1IgbWF5IGJlIHJldHVybmVkIGlmIHRoZSBjYWxsZXIgaGFzIHdyaXR0ZW4gZGF0YSwgYnV0IG5vdAotICAvLyBjYWxsZWQgZmx1c2goKSB0byBhY3R1YWxseSBmaW5pc2ggd3JpdGluZyB0aGUgZGF0YSBvdXQgdG8gdGhlIHVuZGVybHlpbmcKLSAgLy8gdHJhbnNwb3J0LiAgVGhlIGRlZmluZWQgVFRyYW5zcG9ydCBiZWhhdmlvciBpbiB0aGlzIGNhc2UgaXMgdGhhdCB0aGlzIGRhdGEKLSAgLy8gbWF5IGJlIGRpc2NhcmRlZCwgc28gd2UgaWdub3JlIHRoZSBlcnJvciBhbmQgc2lsZW50bHkgZGlzY2FyZCB0aGUgZGF0YS4KLSAgLy8gRm9yIG90aGVyIGVycm9zLCBsb2cgYSBtZXNzYWdlLgotICBpZiAocnYgIT0gWl9EQVRBX0VSUk9SKSB7Ci0gICAgY2hlY2tabGliUnZOb3Rocm93KHJ2LCB3c3RyZWFtXy0+bXNnKTsKLSAgfQotCi0gIGRlbGV0ZVtdIHVyYnVmXzsKLSAgZGVsZXRlW10gY3JidWZfOwotICBkZWxldGVbXSB1d2J1Zl87Ci0gIGRlbGV0ZVtdIGN3YnVmXzsKLSAgZGVsZXRlIHJzdHJlYW1fOwotICBkZWxldGUgd3N0cmVhbV87Ci19Ci0KLWJvb2wgVFpsaWJUcmFuc3BvcnQ6OmlzT3BlbigpIHsKLSAgcmV0dXJuIChyZWFkQXZhaWwoKSA+IDApIHx8IHRyYW5zcG9ydF8tPmlzT3BlbigpOwotfQotCi0vLyBSRUFESU5HIFNUUkFURUdZCi0vLwotLy8gV2UgaGF2ZSB0d28gYnVmZmVycyBmb3IgcmVhZGluZzogb25lIGNvbnRhaW5pbmcgdGhlIGNvbXByZXNzZWQgZGF0YSAoY3JidWZfKQotLy8gYW5kIG9uZSBjb250YWluaW5nIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAodXJidWZfKS4gIFdoZW4gcmVhZCBpcyBjYWxsZWQsCi0vLyB3ZSByZXBlYXQgdGhlIGZvbGxvd2luZyBzdGVwcyB1bnRpbCB3ZSBoYXZlIHNhdGlzZmllZCB0aGUgcmVxdWVzdDoKLS8vIC0gQ29weSBkYXRhIGZyb20gdXJidWZfIGludG8gdGhlIGNhbGxlcidzIGJ1ZmZlci4KLS8vIC0gSWYgd2UgaGFkIGVub3VnaCwgcmV0dXJuLgotLy8gLSBJZiB1cmJ1Zl8gaXMgZW1wdHksIHJlYWQgc29tZSBkYXRhIGludG8gaXQgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCi0vLyAtIEluZmxhdGUgZGF0YSBmcm9tIGNyYnVmXyBpbnRvIHVyYnVmXy4KLS8vCi0vLyBJbiBzdGFuZGFsb25lIG9iamVjdHMsIHdlIHNldCBpbnB1dF9lbmRlZF8gdG8gdHJ1ZSB3aGVuIGluZmxhdGUgcmV0dXJucwotLy8gWl9TVFJFQU1fRU5ELiAgVGhpcyBhbGxvd3MgdG8gbWFrZSBzdXJlIHRoYXQgYSBjaGVja3N1bSB3YXMgdmVyaWZpZWQuCi0KLWlubGluZSBpbnQgVFpsaWJUcmFuc3BvcnQ6OnJlYWRBdmFpbCgpIHsKLSAgcmV0dXJuIHVyYnVmX3NpemVfIC0gcnN0cmVhbV8tPmF2YWlsX291dCAtIHVycG9zXzsKLX0KLQotdWludDMyX3QgVFpsaWJUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgdWludDMyX3QgbmVlZCA9IGxlbjsKLQotICAvLyBUT0RPKGRyZWlzcyk6IFNraXAgdXJidWYgb24gYmlnIHJlYWRzLgotCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgLy8gQ29weSBvdXQgd2hhdGV2ZXIgd2UgaGF2ZSBhdmFpbGFibGUsIHRoZW4gZ2l2ZSB0aGVtIHRoZSBtaW4gb2YKLSAgICAvLyB3aGF0IHdlIGhhdmUgYW5kIHdoYXQgdGhleSB3YW50LCB0aGVuIGFkdmFuY2UgaW5kaWNlcy4KLSAgICBpbnQgZ2l2ZSA9IHN0ZDo6bWluKCh1aW50MzJfdCkgcmVhZEF2YWlsKCksIG5lZWQpOwotICAgIG1lbWNweShidWYsIHVyYnVmXyArIHVycG9zXywgZ2l2ZSk7Ci0gICAgbmVlZCAtPSBnaXZlOwotICAgIGJ1ZiArPSBnaXZlOwotICAgIHVycG9zXyArPSBnaXZlOwotCi0gICAgLy8gSWYgdGhleSB3ZXJlIHNhdGlzZmllZCwgd2UgYXJlIGRvbmUuCi0gICAgaWYgKG5lZWQgPT0gMCkgewotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0KLSAgICAvLyBJZiB3ZSB3aWxsIG5lZWQgdG8gcmVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byBnZXQgbW9yZSBkYXRhLAotICAgIC8vIGJ1dCB3ZSBhbHJlYWR5IGhhdmUgc29tZSBkYXRhIGF2YWlsYWJsZSwgcmV0dXJuIGl0IG5vdy4gIFJlYWRpbmcgZnJvbQotICAgIC8vIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBtYXkgYmxvY2ssIGFuZCByZWFkKCkgaXMgb25seSBhbGxvd2VkIHRvIGJsb2NrCi0gICAgLy8gd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZS4KLSAgICBpZiAobmVlZCA8IGxlbiAmJiByc3RyZWFtXy0+YXZhaWxfaW4gPT0gMCkgewotICAgICAgcmV0dXJuIGxlbiAtIG5lZWQ7Ci0gICAgfQotCi0gICAgLy8gSWYgd2UgZ2V0IHRvIHRoaXMgcG9pbnQsIHdlIG5lZWQgdG8gZ2V0IHNvbWUgbW9yZSBkYXRhLgotCi0gICAgLy8gSWYgemxpYiBoYXMgcmVwb3J0ZWQgdGhlIGVuZCBvZiBhIHN0cmVhbSwgd2UgY2FuJ3QgcmVhbGx5IGRvIGFueSBtb3JlLgotICAgIGlmIChpbnB1dF9lbmRlZF8pIHsKLSAgICAgIHJldHVybiBsZW4gLSBuZWVkOwotICAgIH0KLQotICAgIC8vIFRoZSB1bmNvbXByZXNzZWQgcmVhZCBidWZmZXIgaXMgZW1wdHksIHNvIHJlc2V0IHRoZSBzdHJlYW0gZmllbGRzLgotICAgIHJzdHJlYW1fLT5uZXh0X291dCAgPSB1cmJ1Zl87Ci0gICAgcnN0cmVhbV8tPmF2YWlsX291dCA9IHVyYnVmX3NpemVfOwotICAgIHVycG9zXyA9IDA7Ci0KLSAgICAvLyBDYWxsIGluZmxhdGUoKSB0byB1bmNvbXByZXNzIHNvbWUgbW9yZSBkYXRhCi0gICAgaWYgKCFyZWFkRnJvbVpsaWIoKSkgewotICAgICAgLy8gbm8gZGF0YSBhdmFpbGFibGUgZnJvbSB1bmRlcmx5aW5nIHRyYW5zcG9ydAotICAgICAgcmV0dXJuIGxlbiAtIG5lZWQ7Ci0gICAgfQotCi0gICAgLy8gT2theS4gIFRoZSByZWFkIGJ1ZmZlciBzaG91bGQgaGF2ZSB3aGF0ZXZlciB3ZSBjYW4gZ2l2ZSBpdCBub3cuCi0gICAgLy8gTG9vcCBiYWNrIHRvIHRoZSBzdGFydCBhbmQgdHJ5IHRvIGdpdmUgc29tZSBtb3JlLgotICB9Ci19Ci0KLWJvb2wgVFpsaWJUcmFuc3BvcnQ6OnJlYWRGcm9tWmxpYigpIHsKLSAgYXNzZXJ0KCFpbnB1dF9lbmRlZF8pOwotCi0gIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgY29tcHJlc3NlZCBkYXRhIGF2YWlsYWJsZSwKLSAgLy8gcmVhZCBzb21lIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgotICBpZiAocnN0cmVhbV8tPmF2YWlsX2luID09IDApIHsKLSAgICB1aW50MzJfdCBnb3QgPSB0cmFuc3BvcnRfLT5yZWFkKGNyYnVmXywgY3JidWZfc2l6ZV8pOwotICAgIGlmIChnb3QgPT0gMCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByc3RyZWFtXy0+bmV4dF9pbiAgPSBjcmJ1Zl87Ci0gICAgcnN0cmVhbV8tPmF2YWlsX2luID0gZ290OwotICB9Ci0KLSAgLy8gV2UgaGF2ZSBzb21lIGNvbXByZXNzZWQgZGF0YSBub3cuICBVbmNvbXByZXNzIGl0LgotICBpbnQgemxpYl9ydiA9IGluZmxhdGUocnN0cmVhbV8sIFpfU1lOQ19GTFVTSCk7Ci0KLSAgaWYgKHpsaWJfcnYgPT0gWl9TVFJFQU1fRU5EKSB7Ci0gICAgaW5wdXRfZW5kZWRfID0gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICBjaGVja1psaWJSdih6bGliX3J2LCByc3RyZWFtXy0+bXNnKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8vIFdSSVRJTkcgU1RSQVRFR1kKLS8vCi0vLyBXZSBidWZmZXIgdXAgc21hbGwgd3JpdGVzIGJlZm9yZSBzZW5kaW5nIHRoZW0gdG8gemxpYiwgc28gb3VyIGxvZ2ljIGlzOgotLy8gLSBJcyB0aGUgd3JpdGUgYmlnPwotLy8gICAtIFNlbmQgdGhlIGJ1ZmZlciB0byB6bGliLgotLy8gICAtIFNlbmQgdGhpcyBkYXRhIHRvIHpsaWIuCi0vLyAtIElzIHRoZSB3cml0ZSBzbWFsbD8KLS8vICAgLSBJcyB0aGVyZSBpbnN1ZmZpY2llbnQgc3BhY2UgaW4gdGhlIGJ1ZmZlciBmb3IgaXQ/Ci0vLyAgICAgLSBTZW5kIHRoZSBidWZmZXIgdG8gemxpYi4KLS8vICAgLSBDb3B5IHRoZSBkYXRhIHRvIHRoZSBidWZmZXIuCi0vLwotLy8gV2UgaGF2ZSB0d28gYnVmZmVycyBmb3Igd3JpdGluZyBhbHNvOiB0aGUgdW5jb21wcmVzc2VkIGJ1ZmZlciAobWVudGlvbmVkCi0vLyBhYm92ZSkgYW5kIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4gIFdoZW4gc2VuZGluZyBkYXRhIHRvIHpsaWIgd2UgbG9vcCBvdmVyCi0vLyB0aGUgZm9sbG93aW5nIHVudGlsIHRoZSBzb3VyY2UgKHVuY29tcHJlc3NlZCBidWZmZXIgb3IgYmlnIHdyaXRlKSBpcyBlbXB0eToKLS8vIC0gSXMgdGhlcmUgbm8gbW9yZSBzcGFjZSBpbiB0aGUgY29tcHJlc3NlZCBidWZmZXI/Ci0vLyAgIC0gV3JpdGUgdGhlIGNvbXByZXNzZWQgYnVmZmVyIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KLS8vIC0gRGVmbGF0ZSBmcm9tIHRoZSBzb3VyY2UgaW50byB0aGUgY29tcHJlc3NlZCBidWZmZXIuCi0KLXZvaWQgVFpsaWJUcmFuc3BvcnQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIGlmIChvdXRwdXRfZmluaXNoZWRfKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSgpIGNhbGxlZCBhZnRlciBmaW5pc2goKSIpOwotICB9Ci0KLSAgLy8gemxpYidzICJkZWZsYXRlIiBmdW5jdGlvbiBoYXMgZW5vdWdoIGxvZ2ljIGluIGl0IHRoYXQgSSB0aGluawotICAvLyB3ZSdyZSBiZXR0ZXIgb2ZmIChwZXJmb3JtYW5jZS13aXNlKSBidWZmZXJpbmcgdXAgc21hbGwgd3JpdGVzLgotICBpZiAobGVuID4gTUlOX0RJUkVDVF9ERUZMQVRFX1NJWkUpIHsKLSAgICBmbHVzaFRvWmxpYih1d2J1Zl8sIHV3cG9zXywgWl9OT19GTFVTSCk7Ci0gICAgdXdwb3NfID0gMDsKLSAgICBmbHVzaFRvWmxpYihidWYsIGxlbiwgWl9OT19GTFVTSCk7Ci0gIH0gZWxzZSBpZiAobGVuID4gMCkgewotICAgIGlmICh1d2J1Zl9zaXplXyAtIHV3cG9zXyA8IGxlbikgewotICAgICAgZmx1c2hUb1psaWIodXdidWZfLCB1d3Bvc18sIFpfTk9fRkxVU0gpOwotICAgICAgdXdwb3NfID0gMDsKLSAgICB9Ci0gICAgbWVtY3B5KHV3YnVmXyArIHV3cG9zXywgYnVmLCBsZW4pOwotICAgIHV3cG9zXyArPSBsZW47Ci0gIH0KLX0KLQotdm9pZCBUWmxpYlRyYW5zcG9ydDo6Zmx1c2goKSAgewotICBpZiAob3V0cHV0X2ZpbmlzaGVkXykgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmx1c2goKSBjYWxsZWQgYWZ0ZXIgZmluaXNoKCkiKTsKLSAgfQotCi0gIGZsdXNoVG9UcmFuc3BvcnQoWl9TWU5DX0ZMVVNIKTsKLX0KLQotdm9pZCBUWmxpYlRyYW5zcG9ydDo6ZmluaXNoKCkgIHsKLSAgaWYgKG91dHB1dF9maW5pc2hlZF8pIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbmlzaCgpIGNhbGxlZCBtb3JlIHRoYW4gb25jZSIpOwotICB9Ci0KLSAgZmx1c2hUb1RyYW5zcG9ydChaX0ZJTklTSCk7Ci19Ci0KLXZvaWQgVFpsaWJUcmFuc3BvcnQ6OmZsdXNoVG9UcmFuc3BvcnQoaW50IGZsdXNoKSAgewotICAvLyB3cml0ZSBwZW5kaW5nIGRhdGEgaW4gdXdidWZfIHRvIHpsaWIKLSAgZmx1c2hUb1psaWIodXdidWZfLCB1d3Bvc18sIGZsdXNoKTsKLSAgdXdwb3NfID0gMDsKLQotICAvLyB3cml0ZSBhbGwgYXZhaWxhYmxlIGRhdGEgZnJvbSB6bGliIHRvIHRoZSB0cmFuc3BvcnQKLSAgdHJhbnNwb3J0Xy0+d3JpdGUoY3didWZfLCBjd2J1Zl9zaXplXyAtIHdzdHJlYW1fLT5hdmFpbF9vdXQpOwotICB3c3RyZWFtXy0+bmV4dF9vdXQgPSBjd2J1Zl87Ci0gIHdzdHJlYW1fLT5hdmFpbF9vdXQgPSBjd2J1Zl9zaXplXzsKLQotICAvLyBmbHVzaCB0aGUgdHJhbnNwb3J0Ci0gIHRyYW5zcG9ydF8tPmZsdXNoKCk7Ci19Ci0KLXZvaWQgVFpsaWJUcmFuc3BvcnQ6OmZsdXNoVG9abGliKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgaW50IGxlbiwgaW50IGZsdXNoKSB7Ci0gIHdzdHJlYW1fLT5uZXh0X2luICA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KGJ1Zik7Ci0gIHdzdHJlYW1fLT5hdmFpbF9pbiA9IGxlbjsKLQotICB3aGlsZSAodHJ1ZSkgewotICAgIGlmIChmbHVzaCA9PSBaX05PX0ZMVVNIICYmIHdzdHJlYW1fLT5hdmFpbF9pbiA9PSAwKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBJZiBvdXIgb3VwdXQgYnVmZmVyIGlzIGZ1bGwsIGZsdXNoIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KLSAgICBpZiAod3N0cmVhbV8tPmF2YWlsX291dCA9PSAwKSB7Ci0gICAgICB0cmFuc3BvcnRfLT53cml0ZShjd2J1Zl8sIGN3YnVmX3NpemVfKTsKLSAgICAgIHdzdHJlYW1fLT5uZXh0X291dCAgPSBjd2J1Zl87Ci0gICAgICB3c3RyZWFtXy0+YXZhaWxfb3V0ID0gY3didWZfc2l6ZV87Ci0gICAgfQotCi0gICAgaW50IHpsaWJfcnYgPSBkZWZsYXRlKHdzdHJlYW1fLCBmbHVzaCk7Ci0KLSAgICBpZiAoZmx1c2ggPT0gWl9GSU5JU0ggJiYgemxpYl9ydiA9PSBaX1NUUkVBTV9FTkQpIHsKLSAgICAgIGFzc2VydCh3c3RyZWFtXy0+YXZhaWxfaW4gPT0gMCk7Ci0gICAgICBvdXRwdXRfZmluaXNoZWRfID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNoZWNrWmxpYlJ2KHpsaWJfcnYsIHdzdHJlYW1fLT5tc2cpOwotCi0gICAgaWYgKChmbHVzaCA9PSBaX1NZTkNfRkxVU0ggfHwgZmx1c2ggPT0gWl9GVUxMX0ZMVVNIKSAmJgotICAgICAgICB3c3RyZWFtXy0+YXZhaWxfaW4gPT0gMCAmJiB3c3RyZWFtXy0+YXZhaWxfb3V0ICE9IDApIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi1jb25zdCB1aW50OF90KiBUWmxpYlRyYW5zcG9ydDo6Ym9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgewotICAodm9pZCkgYnVmOwotICAvLyBEb24ndCB0cnkgdG8gYmUgY2xldmVyIHdpdGggc2hpZnRpbmcgYnVmZmVycy4KLSAgLy8gSWYgd2UgaGF2ZSBlbm91Z2ggZGF0YSwgZ2l2ZSBhIHBvaW50ZXIgdG8gaXQsCi0gIC8vIG90aGVyd2lzZSBsZXQgdGhlIHByb3Rjb2wgdXNlIGl0cyBzbG93IHBhdGguCi0gIGlmIChyZWFkQXZhaWwoKSA+PSAoaW50KSpsZW4pIHsKLSAgICAqbGVuID0gKHVpbnQzMl90KXJlYWRBdmFpbCgpOwotICAgIHJldHVybiB1cmJ1Zl8gKyB1cnBvc187Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgVFpsaWJUcmFuc3BvcnQ6OmNvbnN1bWUodWludDMyX3QgbGVuKSB7Ci0gIGlmIChyZWFkQXZhaWwoKSA+PSAoaW50KWxlbikgewotICAgIHVycG9zXyArPSBsZW47Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25zdW1lIGRpZCBub3QgZm9sbG93IGEgYm9ycm93LiIpOwotICB9Ci19Ci0KLXZvaWQgVFpsaWJUcmFuc3BvcnQ6OnZlcmlmeUNoZWNrc3VtKCkgewotICAvLyBJZiB6bGliIGhhcyBhbHJlYWR5IHJlcG9ydGVkIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSwKLSAgLy8gaXQgaGFzIHZlcmlmaWVkIHRoZSBjaGVja3N1bS4KLSAgaWYgKGlucHV0X2VuZGVkXykgewotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gcmVhZGluZyBpcyBjb21wbGV0ZS4KLSAgLy8gSWYgdGhlIGNhbGxlciBzdGlsbCBoYXMgdW5yZWFkIGRhdGEsIHRocm93IGFuIGV4Y2VwdGlvbi4KLSAgaWYgKHJlYWRBdmFpbCgpID4gMCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oCi0gICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAotICAgICAgICAidmVyaWZ5Q2hlY2tzdW0oKSBjYWxsZWQgYmVmb3JlIGVuZCBvZiB6bGliIHN0cmVhbSIpOwotICB9Ci0KLSAgLy8gUmVzZXQgdGhlIHJzdHJlYW0gZmllbGRzLCBpbiBjYXNlIGF2YWlsX291dCBpcyAwLgotICAvLyAoU2luY2UgcmVhZEF2YWlsKCkgaXMgMCwgd2Uga25vdyB0aGVyZSBpcyBubyB1bnJlYWQgZGF0YSBpbiB1cmJ1Zl8pCi0gIHJzdHJlYW1fLT5uZXh0X291dCAgPSB1cmJ1Zl87Ci0gIHJzdHJlYW1fLT5hdmFpbF9vdXQgPSB1cmJ1Zl9zaXplXzsKLSAgdXJwb3NfID0gMDsKLQotICAvLyBDYWxsIGluZmxhdGUoKQotICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjaGVja3N1bSBpcyBiYWQuCi0gIGJvb2wgcGVyZm9ybWVkX2luZmxhdGUgPSByZWFkRnJvbVpsaWIoKTsKLSAgaWYgKCFwZXJmb3JtZWRfaW5mbGF0ZSkgewotICAgIC8vIFdlIG5lZWRlZCB0byByZWFkIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LCBhbmQgdGhlIHJlYWQoKSBjYWxsCi0gICAgLy8gcmV0dXJuZWQgMC4KLSAgICAvLwotICAgIC8vIE5vdCBhbGwgVFRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMgYmVoYXZlIHRoZSBzYW1lIHdheSBoZXJlLCBzbyB3ZSdsbAotICAgIC8vIGVuZCB1cCB3aXRoIGRpZmZlcmVudCBiZWhhdmlvciBkZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgotICAgIC8vCi0gICAgLy8gRm9yIHNvbWUgdHJhbnNwb3J0cyAoZS5nLiwgVEZEVHJhbnNwb3J0KSwgcmVhZCgpIGJsb2NrcyBpZiBubyBtb3JlIGRhdGEKLSAgICAvLyBpcyBhdmFpbGFibGUuICBUaGV5IG9ubHkgcmV0dXJuIDAgaWYgRU9GIGhhcyBiZWVuIHJlYWNoZWQsIG9yIGlmIHRoZQotICAgIC8vIHJlbW90ZSBlbmRwb2ludCBoYXMgY2xvc2VkIHRoZSBjb25uZWN0aW9uLiAgRm9yIHRob3NlIHRyYW5zcG9ydHMsCi0gICAgLy8gdmVyaWZ5Q2hlY2tzdW0oKSB3aWxsIGJsb2NrIHVudGlsIHRoZSBjaGVja3N1bSBiZWNvbWVzIGF2YWlsYWJsZS4KLSAgICAvLwotICAgIC8vIE90aGVyIHRyYW5zcG9ydCB0eXBlcyAoZS5nLiwgVE1lbW9yeUJ1ZmZlcikgYWx3YXlzIHJldHVybiAwIGltbWVkaWF0ZWx5Ci0gICAgLy8gaWYgbm8gbW9yZSBkYXRhIGlzIGF2YWlsYWJsZS4gIEZvciB0aG9zZSB0cmFuc3BvcnQgdHlwZXMsIHZlcmlmeUNoZWNrc3VtCi0gICAgLy8gd2lsbCByYWlzZSB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbiBpZiB0aGUgY2hlY2tzdW0gaXMgbm90IGF2YWlsYWJsZSBmcm9tCi0gICAgLy8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHlldC4KLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoZWNrc3VtIG5vdCBhdmFpbGFibGUgeWV0IGluICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJpZnlDaGVja3N1bSgpIik7Ci0gIH0KLQotICAvLyBJZiBpbnB1dF9lbmRlZF8gaXMgdHJ1ZSBub3csIHRoZSBjaGVja3N1bSBoYXMgYmVlbiB2ZXJpZmllZAotICBpZiAoaW5wdXRfZW5kZWRfKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gVGhlIGNhbGxlciBpbnZva2VkIHVzIGJlZm9yZSB0aGUgYWN0dWFsIGVuZCBvZiB0aGUgZGF0YSBzdHJlYW0KLSAgYXNzZXJ0KHJzdHJlYW1fLT5hdmFpbF9vdXQgPCB1cmJ1Zl9zaXplXyk7Ci0gIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcmlmeUNoZWNrc3VtKCkgY2FsbGVkIGJlZm9yZSBlbmQgb2YgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ6bGliIHN0cmVhbSIpOwotfQotCi0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmJmZjMxLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UWkxJQlRSQU5TUE9SVF9IXwotI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UWkxJQlRSQU5TUE9SVF9IXyAxCi0KLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+Ci0KLXN0cnVjdCB6X3N0cmVhbV9zOwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi1jbGFzcyBUWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbiA6IHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSBwdWJsaWM6Ci0gIFRabGliVHJhbnNwb3J0RXhjZXB0aW9uKGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1zZykgOgotICAgIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2Uoc3RhdHVzLCBtc2cpKSwKLSAgICB6bGliX3N0YXR1c18oc3RhdHVzKSwKLSAgICB6bGliX21zZ18obXNnID09IE5VTEwgPyAiKG51bGwpIiA6IG1zZykge30KLQotICB2aXJ0dWFsIH5UWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbigpIHRocm93KCkge30KLQotICBpbnQgZ2V0WmxpYlN0YXR1cygpIHsgcmV0dXJuIHpsaWJfc3RhdHVzXzsgfQotICBzdGQ6OnN0cmluZyBnZXRabGliTWVzc2FnZSgpIHsgcmV0dXJuIHpsaWJfbXNnXzsgfQotCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBlcnJvck1lc3NhZ2UoaW50IHN0YXR1cywgY29uc3QgY2hhciogbXNnKSB7Ci0gICAgc3RkOjpzdHJpbmcgcnYgPSAiemxpYiBlcnJvcjogIjsKLSAgICBpZiAobXNnKSB7Ci0gICAgICBydiArPSBtc2c7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJ2ICs9ICIobm8gbWVzc2FnZSkiOwotICAgIH0KLSAgICBydiArPSAiIChzdGF0dXMgPSAiOwotICAgIHJ2ICs9IGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KHN0YXR1cyk7Ci0gICAgcnYgKz0gIikiOwotICAgIHJldHVybiBydjsKLSAgfQotCi0gIGludCB6bGliX3N0YXR1c187Ci0gIHN0ZDo6c3RyaW5nIHpsaWJfbXNnXzsKLX07Ci0KLS8qKgotICogVGhpcyB0cmFuc3BvcnQgdXNlcyB6bGliJ3MgY29tcHJlc3NlZCBmb3JtYXQgb24gdGhlICJmYXIiIHNpZGUuCi0gKgotICogVGhlcmUgYXJlIHR3byBraW5kcyBvZiBUWmxpYlRyYW5zcG9ydCBvYmplY3RzOgotICogLSBTdGFuZGFsb25lIG9iamVjdHMgYXJlIHVzZWQgdG8gZW5jb2RlIHNlbGYtY29udGFpbmVkIGNodW5rcyBvZiBkYXRhCi0gKiAgIChsaWtlIHN0cnVjdHVyZXMpLiAgVGhleSBpbmNsdWRlIGNoZWNrc3Vtcy4KLSAqIC0gTm9uLXN0YW5kYWxvbmUgdHJhbnNwb3J0cyBhcmUgdXNlZCBmb3IgUlBDLiAgVGhleSBhcmUgbm90IGltcGxlbWVudGVkIHlldC4KLSAqCi0gKiBUT0RPKGRyZWlzcyk6IERvbid0IGRvIGFuIGV4dHJhIGNvcHkgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBpZgotICogICAgICAgICAgICAgICB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgaXMgVEJ1ZmZlcmVkIG9yIFRNZW1vcnkuCi0gKgotICovCi1jbGFzcyBUWmxpYlRyYW5zcG9ydCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUWmxpYlRyYW5zcG9ydD4gewotIHB1YmxpYzoKLQotICAvKioKLSAgICogQHBhcmFtIHRyYW5zcG9ydCAgICBUaGUgdHJhbnNwb3J0IHRvIHJlYWQgY29tcHJlc3NlZCBkYXRhIGZyb20KLSAgICogICAgICAgICAgICAgICAgICAgICBhbmQgd3JpdGUgY29tcHJlc3NlZCBkYXRhIHRvLgotICAgKiBAcGFyYW0gdXJidWZfc2l6ZSAgIFVuY29tcHJlc3NlZCBidWZmZXIgc2l6ZSBmb3IgcmVhZGluZy4KLSAgICogQHBhcmFtIGNyYnVmX3NpemUgICBDb21wcmVzc2VkIGJ1ZmZlciBzaXplIGZvciByZWFkaW5nLgotICAgKiBAcGFyYW0gdXdidWZfc2l6ZSAgIFVuY29tcHJlc3NlZCBidWZmZXIgc2l6ZSBmb3Igd3JpdGluZy4KLSAgICogQHBhcmFtIGN3YnVmX3NpemUgICBDb21wcmVzc2VkIGJ1ZmZlciBzaXplIGZvciB3cml0aW5nLgotICAgKgotICAgKiBUT0RPKGRyZWlzcyk6IFdyaXRlIGEgY29uc3RydWN0b3IgdGhhdCBpc24ndCBhIHBhaW4uCi0gICAqLwotICBUWmxpYlRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgIGludCB1cmJ1Zl9zaXplID0gREVGQVVMVF9VUkJVRl9TSVpFLAotICAgICAgICAgICAgICAgICBpbnQgY3JidWZfc2l6ZSA9IERFRkFVTFRfQ1JCVUZfU0laRSwKLSAgICAgICAgICAgICAgICAgaW50IHV3YnVmX3NpemUgPSBERUZBVUxUX1VXQlVGX1NJWkUsCi0gICAgICAgICAgICAgICAgIGludCBjd2J1Zl9zaXplID0gREVGQVVMVF9DV0JVRl9TSVpFKSA6Ci0gICAgdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAotICAgIHVycG9zXygwKSwKLSAgICB1d3Bvc18oMCksCi0gICAgaW5wdXRfZW5kZWRfKGZhbHNlKSwKLSAgICBvdXRwdXRfZmluaXNoZWRfKGZhbHNlKSwKLSAgICB1cmJ1Zl9zaXplXyh1cmJ1Zl9zaXplKSwKLSAgICBjcmJ1Zl9zaXplXyhjcmJ1Zl9zaXplKSwKLSAgICB1d2J1Zl9zaXplXyh1d2J1Zl9zaXplKSwKLSAgICBjd2J1Zl9zaXplXyhjd2J1Zl9zaXplKSwKLSAgICB1cmJ1Zl8oTlVMTCksCi0gICAgY3JidWZfKE5VTEwpLAotICAgIHV3YnVmXyhOVUxMKSwKLSAgICBjd2J1Zl8oTlVMTCksCi0gICAgcnN0cmVhbV8oTlVMTCksCi0gICAgd3N0cmVhbV8oTlVMTCkKLSAgewotICAgIGlmICh1d2J1Zl9zaXplXyA8IE1JTl9ESVJFQ1RfREVGTEFURV9TSVpFKSB7Ci0gICAgICAvLyBIYXZlIHRvIGNvcHkgdGhpcyBpbnRvIGEgbG9jYWwgYmVjYXVzZSBvZiBhIGxpbmtpbmcgaXNzdWUuCi0gICAgICBpbnQgbWluaW11bSA9IE1JTl9ESVJFQ1RfREVGTEFURV9TSVpFOwotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigKLSAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICAiVFpMaWJUcmFuc3BvcnQ6IHVuY29tcHJlc3NlZCB3cml0ZSBidWZmZXIgbXVzdCBiZSBhdCBsZWFzdCIKLSAgICAgICAgICArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KG1pbmltdW0pICsgIi4iKTsKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgdXJidWZfID0gbmV3IHVpbnQ4X3RbdXJidWZfc2l6ZV07Ci0gICAgICBjcmJ1Zl8gPSBuZXcgdWludDhfdFtjcmJ1Zl9zaXplXTsKLSAgICAgIHV3YnVmXyA9IG5ldyB1aW50OF90W3V3YnVmX3NpemVdOwotICAgICAgY3didWZfID0gbmV3IHVpbnQ4X3RbY3didWZfc2l6ZV07Ci0KLSAgICAgIC8vIERvbid0IGNhbGwgdGhpcyBvdXRzaWRlIG9mIHRoZSBjb25zdHJ1Y3Rvci4KLSAgICAgIGluaXRabGliKCk7Ci0KLSAgICB9IGNhdGNoICguLi4pIHsKLSAgICAgIGRlbGV0ZVtdIHVyYnVmXzsKLSAgICAgIGRlbGV0ZVtdIGNyYnVmXzsKLSAgICAgIGRlbGV0ZVtdIHV3YnVmXzsKLSAgICAgIGRlbGV0ZVtdIGN3YnVmXzsKLSAgICAgIHRocm93OwotICAgIH0KLSAgfQotCi0gIC8vIERvbid0IGNhbGwgdGhpcyBvdXRzaWRlIG9mIHRoZSBjb25zdHJ1Y3Rvci4KLSAgdm9pZCBpbml0WmxpYigpOwotCi0gIC8qKgotICAgKiBUWmxpYlRyYW5zcG9ydCBkZXN0cnVjdG9yLgotICAgKgotICAgKiBXYXJuaW5nOiBEZXN0cm95aW5nIGEgVFpsaWJUcmFuc3BvcnQgb2JqZWN0IG1heSBkaXNjYXJkIGFueSB3cml0dGVuIGJ1dAotICAgKiB1bmZsdXNoZWQgZGF0YS4gIFlvdSBtdXN0IGV4cGxpY2l0bHkgY2FsbCBmbHVzaCgpIG9yIGZpbmlzaCgpIHRvIGVuc3VyZQotICAgKiB0aGF0IGRhdGEgaXMgYWN0dWFsbHkgd3JpdHRlbiBhbmQgZmx1c2hlZCB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCi0gICAqLwotICB+VFpsaWJUcmFuc3BvcnQoKTsKLQotICBib29sIGlzT3BlbigpOwotCi0gIHZvaWQgb3BlbigpIHsKLSAgICB0cmFuc3BvcnRfLT5vcGVuKCk7Ci0gIH0KLQotICB2b2lkIGNsb3NlKCkgewotICAgIHRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLQotICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLQotICB2b2lkIGZsdXNoKCk7Ci0KLSAgLyoqCi0gICAqIEZpbmFsaXplIHRoZSB6bGliIHN0cmVhbS4KLSAgICoKLSAgICogVGhpcyBjYXVzZXMgemxpYiB0byBmbHVzaCBhbnkgcGVuZGluZyB3cml0ZSBkYXRhIGFuZCB3cml0ZSBlbmQtb2Ytc3RyZWFtCi0gICAqIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgdGhlIGNoZWNrc3VtLiAgT25jZSBmaW5pc2goKSBoYXMgYmVlbiBjYWxsZWQsIG5vCi0gICAqIG5ldyBkYXRhIGNhbiBiZSB3cml0dGVuIHRvIHRoZSBzdHJlYW0uCi0gICAqLwotICB2b2lkIGZpbmlzaCgpOwotCi0gIGNvbnN0IHVpbnQ4X3QqIGJvcnJvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pOwotCi0gIHZvaWQgY29uc3VtZSh1aW50MzJfdCBsZW4pOwotCi0gIC8qKgotICAgKiBWZXJpZnkgdGhlIGNoZWNrc3VtIGF0IHRoZSBlbmQgb2YgdGhlIHpsaWIgc3RyZWFtLgotICAgKgotICAgKiBUaGlzIG1heSBvbmx5IGJlIGNhbGxlZCBhZnRlciBhbGwgZGF0YSBoYXMgYmVlbiByZWFkLgotICAgKiBJdCB2ZXJpZmllcyB0aGUgY2hlY2tzdW0gdGhhdCB3YXMgd3JpdHRlbiBieSB0aGUgZmluaXNoKCkgY2FsbC4KLSAgICovCi0gIHZvaWQgdmVyaWZ5Q2hlY2tzdW0oKTsKLQotICAgLyoqCi0gICAgKiBUT0RPKHNvbWVvbmVfc21hcnQpOiBDaG9vc2Ugc21hcnQgZGVmYXVsdHMuCi0gICAgKi8KLSAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX1VSQlVGX1NJWkUgPSAxMjg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9DUkJVRl9TSVpFID0gMTAyNDsKLSAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX1VXQlVGX1NJWkUgPSAxMjg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9DV0JVRl9TSVpFID0gMTAyNDsKLQotIHByb3RlY3RlZDoKLQotICBpbmxpbmUgdm9pZCBjaGVja1psaWJSdihpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBtc2cpOwotICBpbmxpbmUgdm9pZCBjaGVja1psaWJSdk5vdGhyb3coaW50IHN0YXR1cywgY29uc3QgY2hhciogbXNnKTsKLSAgaW5saW5lIGludCByZWFkQXZhaWwoKTsKLSAgdm9pZCBmbHVzaFRvVHJhbnNwb3J0KGludCBmbHVzaCk7Ci0gIHZvaWQgZmx1c2hUb1psaWIoY29uc3QgdWludDhfdCogYnVmLCBpbnQgbGVuLCBpbnQgZmx1c2gpOwotICBib29sIHJlYWRGcm9tWmxpYigpOwotCi0gcHJpdmF0ZToKLSAgLy8gRGVwcmVjYXRlZCBjb25zdHJ1Y3RvciBzaWduYXR1cmUuCi0gIC8vCi0gIC8vIFRoaXMgdXNlZCB0byBiZSB0aGUgY29uc3RydWN0b3Igc2lnbmF0dXJlLiAgSWYgeW91IGFyZSBnZXR0aW5nIGEgY29tcGlsZQotICAvLyBlcnJvciBiZWNhdXNlIHlvdSBhcmUgdHJ5aW5nIHRvIHVzZSB0aGlzIGNvbnN0cnVjdG9yLCB5b3UgbmVlZCB0byB1cGRhdGUKLSAgLy8geW91ciBjb2RlIGFzIGZvbGxvd3M6Ci0gIC8vIC0gUmVtb3ZlIHRoZSB1c2VfZm9yX3JwYyBhcmd1bWVudCBpbiB0aGUgY29uc3RydWN0dXIuCi0gIC8vICAgVGhlcmUgaXMgbm8gbG9uZ2VyIGFueSBkaXN0aW5jdGlvbiBiZXR3ZWVuIFJQQyBhbmQgc3RhbmRhbG9uZSB6bGliCi0gIC8vICAgdHJhbnNwb3J0cy4gIChQcmV2aW91c2x5LCBvbmx5IHN0YW5kYWxvbmUgd2FzIGFsbG93ZWQsIGFueXdheS4pCi0gIC8vIC0gUmVwbGFjZSBUWmxpYlRyYW5zcG9ydDo6Zmx1c2goKSBjYWxscyB3aXRoIFRabGliVHJhbnNwb3J0OjpmaW5pc2goKQotICAvLyAgIGluIHlvdXIgY29kZS4gIFByZXZpb3VzbHksIGZsdXNoKCkgdXNlZCB0byBmaW5pc2ggdGhlIHpsaWIgc3RyZWFtLgotICAvLyAgIE5vdyBmbHVzaCgpIG9ubHkgZmx1c2hlcyBvdXQgcGVuZGluZyBkYXRhLCBzbyBtb3JlIHdyaXRlcyBjYW4gYmUKLSAgLy8gICBwZXJmb3JtZWQgYWZ0ZXIgYSBmbHVzaCgpLiAgVGhlIGZpbmlzaCgpIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBmaW5hbGl6ZQotICAvLyAgIHRoZSB6bGliIHN0cmVhbS4KLSAgLy8KLSAgLy8gSWYgd2UgZG9uJ3QgZGVjbGFyZSB0aGlzIGNvbnN0cnVjdG9yLCBvbGQgY29kZSB3cml0dGVuIGFzCi0gIC8vIFRabGliVHJhbnNwb3J0KHRyYW5zLCBmYWxzZSkgc3RpbGwgY29tcGlsZXMgYnV0IGJlaGF2ZXMgaW5jb3JyZWN0bHkuCi0gIC8vIFRoZSBzZWNvbmQgYm9vbCBhcmd1bWVudCBpcyBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlciBhbmQgdXNlZCBhcyB0aGUKLSAgLy8gdXJidWZfc2l6ZS4KLSAgVFpsaWJUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICBib29sIHVzZV9mb3JfcnBjLAotICAgICAgICAgICAgICAgICBpbnQgdXJidWZfc2l6ZSA9IERFRkFVTFRfVVJCVUZfU0laRSwKLSAgICAgICAgICAgICAgICAgaW50IGNyYnVmX3NpemUgPSBERUZBVUxUX0NSQlVGX1NJWkUsCi0gICAgICAgICAgICAgICAgIGludCB1d2J1Zl9zaXplID0gREVGQVVMVF9VV0JVRl9TSVpFLAotICAgICAgICAgICAgICAgICBpbnQgY3didWZfc2l6ZSA9IERFRkFVTFRfQ1dCVUZfU0laRSk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8vIFdyaXRlcyBzbWFsbGVyIHRoYW4gdGhpcyBhcmUgYnVmZmVyZWQgdXAuCi0gIC8vIExhcmdlciAob3IgZXF1YWwpIHdyaXRlcyBhcmUgZHVtcGVkIHN0cmFpZ2h0IHRvIHpsaWIuCi0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNSU5fRElSRUNUX0RFRkxBVEVfU0laRSA9IDMyOwotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87Ci0KLSAgaW50IHVycG9zXzsKLSAgaW50IHV3cG9zXzsKLQotICAvLy8gVHJ1ZSBpZmYgemxpYiBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBzdHJlYW0uCi0gIGJvb2wgaW5wdXRfZW5kZWRfOwotICAvLy8gVHJ1ZSBpZmYgd2UgaGF2ZSBmaW5pc2hlZCB0aGUgb3V0cHV0IHN0cmVhbS4KLSAgYm9vbCBvdXRwdXRfZmluaXNoZWRfOwotCi0gIHVpbnQzMl90IHVyYnVmX3NpemVfOwotICB1aW50MzJfdCBjcmJ1Zl9zaXplXzsKLSAgdWludDMyX3QgdXdidWZfc2l6ZV87Ci0gIHVpbnQzMl90IGN3YnVmX3NpemVfOwotCi0gIHVpbnQ4X3QqIHVyYnVmXzsKLSAgdWludDhfdCogY3JidWZfOwotICB1aW50OF90KiB1d2J1Zl87Ci0gIHVpbnQ4X3QqIGN3YnVmXzsKLQotICBzdHJ1Y3Qgel9zdHJlYW1fcyogcnN0cmVhbV87Ci0gIHN0cnVjdCB6X3N0cmVhbV9zKiB3c3RyZWFtXzsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RaTElCVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xUZXN0cy5jcHAgYi9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xUZXN0cy5jcHAKaW5kZXggOGZlYzdmNS4uNmI1YzdjNCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L0FsbFByb3RvY29sVGVzdHMuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9BbGxQcm90b2NvbFRlc3RzLmNwcApAQCAtMTksOSArMTksMTMgQEAKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIEFsbFByb3RvY29sVGVzdHMKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKICNpbmNsdWRlICJBbGxQcm90b2NvbFRlc3RzLnRjYyIKIAogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwpAQCAtMzAsMTUgKzM0LDE0IEBACiAKIGNoYXIgZXJyb3JNZXNzYWdlW0VSUl9MRU5dOwogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgKHZvaWQpIGFyZ2M7Ci0gICh2b2lkKSBhcmd2OwotICB0cnkgewotICAgIHRlc3RQcm90b2NvbDxUQmluYXJ5UHJvdG9jb2w+KCJUQmluYXJ5UHJvdG9jb2wiKTsKLSAgICB0ZXN0UHJvdG9jb2w8VENvbXBhY3RQcm90b2NvbD4oIlRDb21wYWN0UHJvdG9jb2wiKTsKLSAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7Ci0gICAgcHJpbnRmKCIlc1xuIiwgZS53aGF0KCkpOwotICAgIHJldHVybiAxOwotICB9Ci0gIHJldHVybiAwOworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9iaW5hcnlfcHJvdG9jb2wpIHsKKyAgdGVzdFByb3RvY29sPFRCaW5hcnlQcm90b2NvbD4oIlRCaW5hcnlQcm90b2NvbCIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2xpdHRsZV9iaW5hcnlfcHJvdG9jb2wpIHsKKyAgdGVzdFByb3RvY29sPFRMRUJpbmFyeVByb3RvY29sPigiVExFQmluYXJ5UHJvdG9jb2wiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9jb21wYWN0X3Byb3RvY29sKSB7CisgIHRlc3RQcm90b2NvbDxUQ29tcGFjdFByb3RvY29sPigiVENvbXBhY3RQcm90b2NvbCIpOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0FsbFByb3RvY29sVGVzdHMudGNjIGIvbGliL2NwcC90ZXN0L0FsbFByb3RvY29sVGVzdHMudGNjCmluZGV4IGE1YTMxMTUuLmE3ZWFiMDcgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9BbGxQcm90b2NvbFRlc3RzLnRjYworKysgYi9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xUZXN0cy50Y2MKQEAgLTIyLDEzICsyMiwxMyBAQAogCiAjaW5jbHVkZSA8bGltaXRzPgogCi0jaW5jbHVkZSA8cHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0jaW5jbHVkZSA8VGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CiAKICNpbmNsdWRlICJHZW5lcmljSGVscGVycy5oIgogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKQEAgLTQ1LDcgKzQ1LDEwIEBACiAgIFZhbCBvdXQ7CiAgIEdlbmVyaWNJTzo6cmVhZChwcm90b2NvbCwgb3V0KTsKICAgaWYgKG91dCAhPSB2YWwpIHsKLSAgICBzbnByaW50ZihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICJJbnZhbGlkIG5ha2VkIHRlc3QgKHR5cGU6ICVzKSIsIENsYXNzTmFtZXM6OmdldE5hbWU8VmFsPigpKTsKKyAgICBUSFJJRlRfU05QUklOVEYoZXJyb3JNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICBFUlJfTEVOLAorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBuYWtlZCB0ZXN0ICh0eXBlOiAlcykiLAorICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWVzOjpnZXROYW1lPFZhbD4oKSk7CiAgICAgdGhyb3cgVEV4Y2VwdGlvbihlcnJvck1lc3NhZ2UpOwogICB9CiB9CkBAIC03MSwxMSArNzQsMTEgQEAKICAgcHJvdG9jb2wtPnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7CiAKICAgaWYgKGZpZWxkSWQgIT0gMTUpIHsKLSAgICBzbnByaW50ZihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICJJbnZhbGlkIElEICh0eXBlOiAlcykiLCB0eXBlaWQodmFsKS5uYW1lKCkpOworICAgIFRIUklGVF9TTlBSSU5URihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICJJbnZhbGlkIElEICh0eXBlOiAlcykiLCB0eXBlaWQodmFsKS5uYW1lKCkpOwogICAgIHRocm93IFRFeGNlcHRpb24oZXJyb3JNZXNzYWdlKTsKICAgfQogICBpZiAoZmllbGRUeXBlICE9IHR5cGUpIHsKLSAgICBzbnByaW50ZihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICJJbnZhbGlkIEZpZWxkIFR5cGUgKHR5cGU6ICVzKSIsIHR5cGVpZCh2YWwpLm5hbWUoKSk7CisgICAgVEhSSUZUX1NOUFJJTlRGKGVycm9yTWVzc2FnZSwgRVJSX0xFTiwgIkludmFsaWQgRmllbGQgVHlwZSAodHlwZTogJXMpIiwgdHlwZWlkKHZhbCkubmFtZSgpKTsKICAgICB0aHJvdyBURXhjZXB0aW9uKGVycm9yTWVzc2FnZSk7CiAgIH0KIApAQCAtODMsNyArODYsNyBAQAogICBHZW5lcmljSU86OnJlYWQocHJvdG9jb2wsIG91dCk7CiAKICAgaWYgKG91dCAhPSB2YWwpIHsKLSAgICBzbnByaW50ZihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICJJbnZhbGlkIHZhbHVlIHJlYWQgKHR5cGU6ICVzKSIsIHR5cGVpZCh2YWwpLm5hbWUoKSk7CisgICAgVEhSSUZUX1NOUFJJTlRGKGVycm9yTWVzc2FnZSwgRVJSX0xFTiwgIkludmFsaWQgdmFsdWUgcmVhZCAodHlwZTogJXMpIiwgdHlwZWlkKHZhbCkubmFtZSgpKTsKICAgICB0aHJvdyBURXhjZXB0aW9uKGVycm9yTWVzc2FnZSk7CiAgIH0KIApAQCAtOTcsMjAgKzEwMCwxOCBAQAogICAgIGNvbnN0IGNoYXIqIG5hbWU7CiAgICAgVE1lc3NhZ2VUeXBlIHR5cGU7CiAgICAgaW50MzJfdCBzZXFpZDsKLSAgfSBtZXNzYWdlc1s0XSA9IHsKLSAgICB7InNob3J0IG1lc3NhZ2UgbmFtZSIsIFRfQ0FMTCwgMH0sCi0gICAgeyIxIiwgVF9SRVBMWSwgMTIzNDV9LAotICAgIHsibG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyIsIFRfRVhDRVBUSU9OLCAxIDw8IDE2fSwKLSAgICB7Ikphbmt5IiwgVF9DQUxMLCAwfQotICB9OworICB9IG1lc3NhZ2VzW10gPSB7eyJzaG9ydCBtZXNzYWdlIG5hbWUiLCBUX0NBTEwsIDB9LAorICAgICAgICAgICAgICAgICAgeyIxIiwgVF9SRVBMWSwgMTIzNDV9LAorICAgICAgICAgICAgICAgICAgeyJsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIiwgVF9FWENFUFRJT04sIDEgPDwgMTZ9LAorICAgICAgICAgICAgICAgICAgeyJvbmUgd2F5IHB1c2giLCBUX09ORVdBWSwgMTJ9LAorICAgICAgICAgICAgICAgICAgeyJKYW5reSIsIFRfQ0FMTCwgMH19OworICBjb25zdCBpbnQgbWVzc2FnZXNfY291bnQgPSBzaXplb2YobWVzc2FnZXMpIC8gc2l6ZW9mKFRNZXNzYWdlKTsKIAotICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VzX2NvdW50OyBpKyspIHsKICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRQcm90byh0cmFuc3BvcnQpKTsKIAotICAgIHByb3RvY29sLT53cml0ZU1lc3NhZ2VCZWdpbihtZXNzYWdlc1tpXS5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1tpXS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1tpXS5zZXFpZCk7CisgICAgcHJvdG9jb2wtPndyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2VzW2ldLm5hbWUsIG1lc3NhZ2VzW2ldLnR5cGUsIG1lc3NhZ2VzW2ldLnNlcWlkKTsKICAgICBwcm90b2NvbC0+d3JpdGVNZXNzYWdlRW5kKCk7CiAKICAgICBzdGQ6OnN0cmluZyBuYW1lOwpAQCAtMTE4LDkgKzExOSw3IEBACiAgICAgaW50MzJfdCBzZXFpZDsKIAogICAgIHByb3RvY29sLT5yZWFkTWVzc2FnZUJlZ2luKG5hbWUsIHR5cGUsIHNlcWlkKTsKLSAgICBpZiAobmFtZSAhPSBtZXNzYWdlc1tpXS5uYW1lIHx8Ci0gICAgICAgIHR5cGUgIT0gbWVzc2FnZXNbaV0udHlwZSB8fAotICAgICAgICBzZXFpZCAhPSBtZXNzYWdlc1tpXS5zZXFpZCkgeworICAgIGlmIChuYW1lICE9IG1lc3NhZ2VzW2ldLm5hbWUgfHwgdHlwZSAhPSBtZXNzYWdlc1tpXS50eXBlIHx8IHNlcWlkICE9IG1lc3NhZ2VzW2ldLnNlcWlkKSB7CiAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJyZWFkTWVzc2FnZUJlZ2luIGZhaWxlZC4iKTsKICAgICB9CiAgIH0KQEAgLTE0Myw4ICsxNDIsOCBAQAogICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KChpbnQxNl90KS0xKTsKICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQxNl90PigoaW50MTZfdCktMTUwMDApOwogICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KChpbnQxNl90KS0weDdmZmYpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1pbigpKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQxNl90PihzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptYXgoKSk7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MTZfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1pbikoKSk7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MTZfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1heCkoKSk7CiAKICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kxNiwgaW50MTZfdD4oKGludDE2X3QpMCk7CiAgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMTYsIGludDE2X3Q+KChpbnQxNl90KTEpOwpAQCAtMTY1LDggKzE2NCw4IEBACiAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MzJfdD4oLTEpOwogICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KC0xNTAwMCk7CiAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MzJfdD4oLTB4ZmZmZik7Ci0gICAgdGVzdE5ha2VkPFRQcm90bywgaW50MzJfdD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKCkpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpKTsKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQzMl90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKSgpKTsKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQzMl90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKTsKIAogICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigwKTsKICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oMSk7CkBAIC0xODIsMjQgKzE4MSwyMyBAQAogICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigtMTUwMDApOwogICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigtMHhmZmZmKTsKICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oLTB4ZmZmZmZmKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90PihzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptaW4oKSk7Ci0gICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCkpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbigpICsgMTApOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpIC0gMTYpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbigpKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90PihzdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgoKSk7Ci0KKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKSgpKTsKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKTsKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKSgpICsgMTApOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkgLSAxNik7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbikoKSk7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCkoKSk7CiAKICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90PigwKTsKICAgICBmb3IgKGludDY0X3QgaSA9IDA7IGkgPCA2MjsgaSsrKSB7Ci0gICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90PigxTCA8PCBpKTsKLSAgICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KC0oMUwgPDwgaSkpOworICAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oMUxMIDw8IGkpOworICAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oLSgxTEwgPDwgaSkpOwogICAgIH0KIAogICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTY0LCBpbnQ2NF90PigwKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IDYyOyBpKyspIHsKLSAgICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTY0LCBpbnQ2NF90PigxTCA8PCBpKTsKLSAgICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTY0LCBpbnQ2NF90PigtKDFMIDw8IGkpKTsKKyAgICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTY0LCBpbnQ2NF90PigxTEwgPDwgaSk7CisgICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0k2NCwgaW50NjRfdD4oLSgxTEwgPDwgaSkpOwogICAgIH0KIAogICAgIHRlc3ROYWtlZDxUUHJvdG8sIGRvdWJsZT4oMTIzLjQ1Nik7CkBAIC0yMDgsNyArMjA2LDcgQEAKICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBzdGQ6OnN0cmluZz4oInNob3J0Iik7CiAgICAgdGVzdE5ha2VkPFRQcm90bywgc3RkOjpzdHJpbmc+KCJib3JkZXJsaW5ldGlueSIpOwogICAgIHRlc3ROYWtlZDxUUHJvdG8sIHN0ZDo6c3RyaW5nPigiYSBiaXQgbG9uZ2VyIHRoYW4gdGhlIHNtYWxsZXN0IHBvc3NpYmxlIik7Ci0gICAgdGVzdE5ha2VkPFRQcm90bywgc3RkOjpzdHJpbmc+KCJceDFceDJceDNceDRceDVceDZceDdceDhceDlceEEiKTsgLy9raW5kYSBiaW5hcnkgdGVzdAorICAgIHRlc3ROYWtlZDxUUHJvdG8sIHN0ZDo6c3RyaW5nPigiXHgxXHgyXHgzXHg0XHg1XHg2XHg3XHg4XHg5XHhBIik7IC8vIGtpbmRhIGJpbmFyeSB0ZXN0CiAKICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX1NUUklORywgc3RkOjpzdHJpbmc+KCIiKTsKICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX1NUUklORywgc3RkOjpzdHJpbmc+KCJzaG9ydCIpOwpAQCAtMjE5LDcgKzIxNyw3IEBACiAKICAgICBwcmludGYoIiVzID0+IE9LXG4iLCBwcm90b25hbWUpOwogICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKLSAgICBzbnByaW50ZihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICIlcyA9PiBUZXN0IEZBSUxFRDogJXMiLCBwcm90b25hbWUsIGUud2hhdCgpKTsKKyAgICBUSFJJRlRfU05QUklOVEYoZXJyb3JNZXNzYWdlLCBFUlJfTEVOLCAiJXMgPT4gVGVzdCBGQUlMRUQ6ICVzIiwgcHJvdG9uYW1lLCBlLndoYXQoKSk7CiAgICAgdGhyb3cgVEV4Y2VwdGlvbihlcnJvck1lc3NhZ2UpOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvQW5ub3RhdGlvblRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L0Fubm90YXRpb25UZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTE4ODQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L0Fubm90YXRpb25UZXN0LmNwcApAQCAtMCwwICsxLDY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIEFubm90YXRpb25UZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgImdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuaCIKKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKy8vIE5vcm1hbGx5IHRocmlmdCBnZW5lcmF0ZXMgb3N0cmVhbSBvcGVyYXRvcnMsIGhvd2V2ZXIKKy8vIHdpdGggdGhlIGFubm90YXRpb24gImNwcC5jdXN0b21vc3RyZWFtIiBvbmUgY2FuIHRlbGwgdGhlCisvLyBjb21waWxlciB0aGV5IGFyZSBnb2luZyB0byBwcm92aWRlIHRoZWlyIG93biwgYW5kIG5vdAorLy8gZW1pdCBvcGVyYXRvciA8PCBvciBwcmludFRvKCkuCisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBvc3RyX2N1c3RvbSYgb3NjKQoreworICBvcyA8PCAieyBiYXIgPSAiIDw8IG9zYy5iYXIgPDwgIjsgfSI7CisgIHJldHVybiBvczsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFKEJPT1NUX1RFU1RfTU9EVUxFKQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2NwcF9jb21waWxlcl9nZW5lcmF0ZWRfb3N0cmVhbV9vcGVyYXRvcikKK3sKKyAgb3N0cl9kZWZhdWx0IGRlZjsKKyAgZGVmLl9fc2V0X2JhcigxMCk7CisKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3NkOworICBzc2QgPDwgZGVmOworICBCT09TVF9DSEVDS19FUVVBTChzc2Quc3RyKCksICJvc3RyX2RlZmF1bHQoYmFyPTEwKSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2NwcF9jdXN0b21vc3RyZWFtX3VzZXNfY29uc3VtaW5nX2FwcGxpY2F0aW9uX2RlZmluaXRpb24pCit7CisgIG9zdHJfY3VzdG9tIGN1czsKKyAgY3VzLl9fc2V0X2JhcigxMCk7CisKKyAgc3RkOjpzdHJpbmdzdHJlYW0gY3NkOworICBjc2QgPDwgY3VzOworICBCT09TVF9DSEVDS19FUVVBTChjc2Quc3RyKCksICJ7IGJhciA9IDEwOyB9Iik7Cit9CisKKy8qKgorICogRGlzYWJsZWQ7IHNlZSBUSFJJRlQtMTU2NyAtIG5vdCBzdXJlIHdoYXQgaXQgaXMgc3VwcG9zZWQgdG8gZG8KK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfY3BwX3R5cGUpIHsKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgImNwcC50eXBlIiBhbm5vdGF0aW9uIGNoYW5nZXMgInN0cnVjdCBmb28iIHRvICJEZW5zZUZvbyIKKyAgLy8gVGhpcyB3b24ndCBjb21waWxlIGlmIHRoZSBhbm5vdGF0aW9uIGlzIG1pc2hhbmRsZWQKKyAgRGVuc2VGb28gZm9vOworICBmb28uX19zZXRfYmFyKDUpOworfQorICovCisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0Jhc2U2NFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L0Jhc2U2NFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ODZlNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvQmFzZTY0VGVzdC5jcHAKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC9hdXRvX3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5oPgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OmJhc2U2NF9lbmNvZGU7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OmJhc2U2NF9kZWNvZGU7CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShCYXNlNjRUZXN0KQorCit2b2lkIHNldHVwVGVzdERhdGEoaW50IGksIHVpbnQ4X3QqIGRhdGEsIGludCYgbGVuKSB7CisgIGxlbiA9IDA7CisgIGRvIHsKKyAgICBkYXRhW2xlbl0gPSAodWludDhfdCkoaSAmIDB4RkYpOworICAgIGkgPj49IDg7CisgICAgbGVuKys7CisgIH0gd2hpbGUgKChsZW4gPCAzKSAmJiAoaSAhPSAwKSk7CisKKyAgQk9PU1RfQVNTRVJUKGkgPT0gMCk7Cit9CisKK3ZvaWQgY2hlY2tFbmNvZGluZyh1aW50OF90KiBkYXRhLCBpbnQgbGVuKSB7CisjaWZkZWYgTkRFQlVHCisgICgodm9pZClkYXRhKTsKKyNlbmRpZgorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBCT09TVF9BU1NFUlQoaXNhbG51bShkYXRhW2ldKSB8fCBkYXRhW2ldID09ICcvJyB8fCBkYXRhW2ldID09ICcrJyk7CisgIH0KK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9CYXNlNjRfRW5jb2RlX0RlY29kZSkgeworICBpbnQgbGVuOworICB1aW50OF90IHRlc3RJbnB1dFszXTsKKyAgdWludDhfdCB0ZXN0T3V0cHV0WzRdOworCisgIC8vIFRlc3QgYWxsIHBvc3NpYmxlIGVuY29kaW5nIC8gZGVjb2RpbmcgY2FzZXMgZ2l2ZW4gdGhlCisgIC8vIHRocmVlIGJ5dGUgbGltaXQgZm9yIGJhc2U2NF9lbmNvZGUuCisKKyAgZm9yIChpbnQgaSA9IDB4RkZGRkZGOyBpID49IDA7IGktLSkgeworCisgICAgLy8gZmlsbCB0ZXN0SW5wdXQgYmFzZWQgb24gaQorICAgIHNldHVwVGVzdERhdGEoaSwgdGVzdElucHV0LCBsZW4pOworCisgICAgLy8gZW5jb2RlIHRoZSB0ZXN0IGRhdGEsIHRoZW4gZGVjb2RlIGl0IGFnYWluCisgICAgYmFzZTY0X2VuY29kZSh0ZXN0SW5wdXQsIGxlbiwgdGVzdE91dHB1dCk7CisKKyAgICAvLyB2ZXJpZnkgZWFjaCBieXRlIGhhcyBhIHZhbGlkIEJhc2U2NCB2YWx1ZSAoYWxwaGFudW1lcmljIG9yIGVpdGhlciArIG9yIC8pCisgICAgY2hlY2tFbmNvZGluZyh0ZXN0T3V0cHV0LCBsZW4pOworCisgICAgLy8gZGVjb2RlIG91dHB1dCBhbmQgY2hlY2sgdGhhdCBpdCBtYXRjaGVzIGlucHV0CisgICAgYmFzZTY0X2RlY29kZSh0ZXN0T3V0cHV0LCBsZW4gKyAxKTsKKyAgICBCT09TVF9BU1NFUlQoMCA9PSBtZW1jbXAodGVzdElucHV0LCB0ZXN0T3V0cHV0LCBsZW4pKTsKKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9CZW5jaG1hcmsuY3BwIGIvbGliL2NwcC90ZXN0L0JlbmNobWFyay5jcHAKaW5kZXggZjRjZDM5Mi4uNWZmNzdhYSAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L0JlbmNobWFyay5jcHAKKysrIGIvbGliL2NwcC90ZXN0L0JlbmNobWFyay5jcHAKQEAgLTE3LDg4ICsxNywyMjYgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxjbWF0aD4KLSNpbmNsdWRlICJ0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaCIKLSNpbmNsdWRlICJwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaCIKKyNkZWZpbmUgX1VTRV9NQVRIX0RFRklORVMKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgInRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmgiCiAjaW5jbHVkZSAiZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIgotI2luY2x1ZGUgPHRpbWUuaD4KKworI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAogI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKIAogY2xhc3MgVGltZXIgewogcHVibGljOgogICB0aW1ldmFsIHZTdGFydDsKIAotICBUaW1lcigpIHsKLSAgICBnZXR0aW1lb2ZkYXkoJnZTdGFydCwgMCk7Ci0gIH0KLSAgdm9pZCBzdGFydCgpIHsKLSAgICBnZXR0aW1lb2ZkYXkoJnZTdGFydCwgMCk7Ci0gIH0KKyAgVGltZXIoKSB7IFRIUklGVF9HRVRUSU1FT0ZEQVkoJnZTdGFydCwgMCk7IH0KKyAgdm9pZCBzdGFydCgpIHsgVEhSSUZUX0dFVFRJTUVPRkRBWSgmdlN0YXJ0LCAwKTsgfQogCiAgIGRvdWJsZSBmcmFtZSgpIHsKICAgICB0aW1ldmFsIHZFbmQ7Ci0gICAgZ2V0dGltZW9mZGF5KCZ2RW5kLCAwKTsKKyAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZ2RW5kLCAwKTsKICAgICBkb3VibGUgZHN0YXJ0ID0gdlN0YXJ0LnR2X3NlYyArICgoZG91YmxlKXZTdGFydC50dl91c2VjIC8gMTAwMDAwMC4wKTsKICAgICBkb3VibGUgZGVuZCA9IHZFbmQudHZfc2VjICsgKChkb3VibGUpdkVuZC50dl91c2VjIC8gMTAwMDAwMC4wKTsKICAgICByZXR1cm4gZGVuZCAtIGRzdGFydDsKICAgfQotCiB9OwogCiBpbnQgbWFpbigpIHsKLSAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICAgdXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDo6ZGVidWc7CiAgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q7CisgIHVzaW5nIHN0ZDo6Y291dDsKKyAgdXNpbmcgc3RkOjplbmRsOwogCiAgIE9uZU9mRWFjaCBvb2U7Ci0gIG9vZS5pbV90cnVlICAgPSB0cnVlOwotICBvb2UuaW1fZmFsc2UgID0gZmFsc2U7Ci0gIG9vZS5hX2JpdGUgICAgPSAweDdmOworICBvb2UuaW1fdHJ1ZSA9IHRydWU7CisgIG9vZS5pbV9mYWxzZSA9IGZhbHNlOworICBvb2UuYV9iaXRlID0gMHg3ZjsKICAgb29lLmludGVnZXIxNiA9IDI3MDAwOwotICBvb2UuaW50ZWdlcjMyID0gMTw8MjQ7CisgIG9vZS5pbnRlZ2VyMzIgPSAxIDw8IDI0OwogICBvb2UuaW50ZWdlcjY0ID0gKHVpbnQ2NF90KTYwMDAgKiAxMDAwICogMTAwMDsKICAgb29lLmRvdWJsZV9wcmVjaXNpb24gPSBNX1BJOwotICBvb2Uuc29tZV9jaGFyYWN0ZXJzICA9ICJKU09OIFRISVMhIFwiXDEiOwotICBvb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQ3XG5cYVx0IjsKKyAgb29lLnNvbWVfY2hhcmFjdGVycyA9ICJKU09OIFRISVMhIFwiXDEiOworICBvb2Uuem9tZ191bmljb2RlID0gIlx4ZDdcblxhXHQiOwogICBvb2UuYmFzZTY0ID0gIlwxXDJcM1wyNTUiOwogCi0gIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBpbnQgbnVtID0gMTAwMDAwOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmKG5ldyBUTWVtb3J5QnVmZmVyKG51bSoxMDAwKSk7CiAKLSAgaW50IG51bSA9IDEwMDAwMDA7CisgIHVpbnQ4X3QqIGRhdGEgPSBOVUxMOworICB1aW50MzJfdCBkYXRhc2l6ZSA9IDA7CiAKICAgeworICAgIGJ1Zi0+cmVzZXRCdWZmZXIoKTsKKyAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXI+IHByb3QoYnVmKTsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKICAgICBUaW1lciB0aW1lcjsKIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpICsrKSB7Ci0gICAgICBidWYtPnJlc2V0QnVmZmVyKCk7Ci0gICAgICBUQmluYXJ5UHJvdG9jb2xUPFRCdWZmZXJCYXNlPiBwcm90KGJ1Zik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgewogICAgICAgb29lLndyaXRlKCZwcm90KTsKICAgICB9Ci0gICAgY291dCA8PCAiV3JpdGU6ICIgPDwgbnVtIC8gKDEwMDAgKiB0aW1lci5mcmFtZSgpKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICJXcml0ZSBiaWcgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CiAgIH0KIAotICB1aW50OF90KiBkYXRhOwotICB1aW50MzJfdCBkYXRhc2l6ZTsKLQogICBidWYtPmdldEJ1ZmZlcigmZGF0YSwgJmRhdGFzaXplKTsKIAogICB7Ci0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlcj4gcHJvdChidWYyKTsKKyAgICBPbmVPZkVhY2ggb29lMjsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKICAgICBUaW1lciB0aW1lcjsKIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpICsrKSB7Ci0gICAgICBPbmVPZkVhY2ggb29lMjsKLSAgICAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOwotICAgICAgLy9idWYyLT5yZXNldEJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSk7Ci0gICAgICBUQmluYXJ5UHJvdG9jb2xUPFRCdWZmZXJCYXNlPiBwcm90KGJ1ZjIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKICAgICAgIG9vZTIucmVhZCgmcHJvdCk7Ci0KLSAgICAgIC8vY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcob29lMikgPDwgZW5kbCA8PCBlbmRsOwogICAgIH0KLSAgICBjb3V0IDw8ICIgUmVhZDogIiA8PCBudW0gLyAoMTAwMCAqIHRpbWVyLmZyYW1lKCkpIDw8ICIga0h6IiA8PCBlbmRsOworICAgIGVsYXBzZWQgPSB0aW1lci5mcmFtZSgpOworICAgIGNvdXQgPDwgIiBSZWFkIGJpZyBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgfQorCisgIHsKKyAgICBidWYtPnJlc2V0QnVmZmVyKCk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyLCBUTmV0d29ya0xpdHRsZUVuZGlhbj4gcHJvdChidWYpOworICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOworICAgIFRpbWVyIHRpbWVyOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgICAgb29lLndyaXRlKCZwcm90KTsKKyAgICB9CisgICAgZWxhcHNlZCA9IHRpbWVyLmZyYW1lKCk7CisgICAgY291dCA8PCAiV3JpdGUgbGl0dGxlIGVuZGlhbjogIiA8PCBudW0gLyAoMTAwMCAqIGVsYXBzZWQpIDw8ICIga0h6IiA8PCBlbmRsOworICB9CisKKyAgeworICAgIE9uZU9mRWFjaCBvb2UyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIGRhdGFzaXplKSk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyLCBUTmV0d29ya0xpdHRsZUVuZGlhbj4gcHJvdChidWYyKTsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKKyAgICBUaW1lciB0aW1lcjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgIG9vZTIucmVhZCgmcHJvdCk7CisgICAgfQorICAgIGVsYXBzZWQgPSB0aW1lci5mcmFtZSgpOworICAgIGNvdXQgPDwgIiBSZWFkIGxpdHRsZSBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgfQorCisgIHsKKyAgICBidWYtPnJlc2V0QnVmZmVyKCk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyPiBwcm90KGJ1Zik7CisgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CisgICAgVGltZXIgdGltZXI7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKSB7CisgICAgICBvb2Uud3JpdGUoJnByb3QpOworICAgIH0KKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICJXcml0ZSBiaWcgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CisgIH0KKworICB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKKyAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXI+IHByb3QoYnVmMik7CisgICAgT25lT2ZFYWNoIG9vZTI7CisgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CisgICAgVGltZXIgdGltZXI7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKSB7CisgICAgICBvb2UyLnJlYWQoJnByb3QpOworICAgIH0KKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICIgUmVhZCBiaWcgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CisgIH0KKworCisgIGRhdGEgPSBOVUxMOworICBkYXRhc2l6ZSA9IDA7CisgIG51bSA9IDEwMDAwMDAwOworCisgIExpc3REb3VibGVQZXJmIGxpc3REb3VibGVQZXJmOworICBsaXN0RG91YmxlUGVyZi5maWVsZC5yZXNlcnZlKG51bSk7CisgIGZvciAoaW50IHggPSAwOyB4IDwgbnVtOyArK3gpCisgICAgbGlzdERvdWJsZVBlcmYuZmllbGQucHVzaF9iYWNrKGRvdWJsZSh4KSk7CisKKyAgYnVmLnJlc2V0KG5ldyBUTWVtb3J5QnVmZmVyKG51bSAqIDEwMCkpOworCisgIHsKKyAgICBidWYtPnJlc2V0QnVmZmVyKCk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyPiBwcm90KGJ1Zik7CisgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CisgICAgVGltZXIgdGltZXI7CisKKyAgICBsaXN0RG91YmxlUGVyZi53cml0ZSgmcHJvdCk7CisgICAgZWxhcHNlZCA9IHRpbWVyLmZyYW1lKCk7CisgICAgY291dCA8PCAiRG91YmxlIHdyaXRlIGJpZyBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgfQorCisgIGJ1Zi0+Z2V0QnVmZmVyKCZkYXRhLCAmZGF0YXNpemUpOworCisgIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlcj4gcHJvdChidWYyKTsKKyAgICBMaXN0RG91YmxlUGVyZiBsaXN0RG91YmxlUGVyZjI7CisgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CisgICAgVGltZXIgdGltZXI7CisKKyAgICBsaXN0RG91YmxlUGVyZjIucmVhZCgmcHJvdCk7CisgICAgZWxhcHNlZCA9IHRpbWVyLmZyYW1lKCk7CisgICAgY291dCA8PCAiIERvdWJsZSByZWFkIGJpZyBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgfQorCisgIHsKKyAgICBidWYtPnJlc2V0QnVmZmVyKCk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyLCBUTmV0d29ya0xpdHRsZUVuZGlhbj4gcHJvdChidWYpOworICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOworICAgIFRpbWVyIHRpbWVyOworCisgICAgbGlzdERvdWJsZVBlcmYud3JpdGUoJnByb3QpOworICAgIGVsYXBzZWQgPSB0aW1lci5mcmFtZSgpOworICAgIGNvdXQgPDwgIkRvdWJsZSB3cml0ZSBsaXR0bGUgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CisgIH0KKworICB7CisgICAgTGlzdERvdWJsZVBlcmYgbGlzdERvdWJsZVBlcmYyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIGRhdGFzaXplKSk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyLCBUTmV0d29ya0xpdHRsZUVuZGlhbj4gcHJvdChidWYyKTsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKKyAgICBUaW1lciB0aW1lcjsKKworICAgIGxpc3REb3VibGVQZXJmMi5yZWFkKCZwcm90KTsKKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICIgRG91YmxlIHJlYWQgbGl0dGxlIGVuZGlhbjogIiA8PCBudW0gLyAoMTAwMCAqIGVsYXBzZWQpIDw8ICIga0h6IiA8PCBlbmRsOworICB9CisKKyAgeworICAgIGJ1Zi0+cmVzZXRCdWZmZXIoKTsKKyAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXI+IHByb3QoYnVmKTsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKKyAgICBUaW1lciB0aW1lcjsKKworICAgIGxpc3REb3VibGVQZXJmLndyaXRlKCZwcm90KTsKKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICJEb3VibGUgd3JpdGUgYmlnIGVuZGlhbjogIiA8PCBudW0gLyAoMTAwMCAqIGVsYXBzZWQpIDw8ICIga0h6IiA8PCBlbmRsOworICB9CisKKyAgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIGRhdGFzaXplKSk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyPiBwcm90KGJ1ZjIpOworICAgIExpc3REb3VibGVQZXJmIGxpc3REb3VibGVQZXJmMjsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKKyAgICBUaW1lciB0aW1lcjsKKworICAgIGxpc3REb3VibGVQZXJmMi5yZWFkKCZwcm90KTsKKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICIgRG91YmxlIHJlYWQgYmlnIGVuZGlhbjogIiA8PCBudW0gLyAoMTAwMCAqIGVsYXBzZWQpIDw8ICIga0h6IiA8PCBlbmRsOwogICB9CiAKIApkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0NNYWtlTGlzdHMudHh0IGIvbGliL2NwcC90ZXN0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZDQ3YTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw0MDUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtCb29zdF9JTkNMVURFX0RJUlN9IikKKworaWYgKFdJVEhfRFlOX0xJTktfVEVTVCkKKyAgICBhZGRfZGVmaW5pdGlvbnMoIC1EQk9PU1RfVEVTVF9EWU5fTElOSyApCitlbmRpZigpCisKKyMgTWFrZSBzdXJlIGdlbi1jcHAgZmlsZXMgY2FuIGJlIGluY2x1ZGVkCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iKQorCisjIENyZWF0ZSB0aGUgdGhyaWZ0IEMrKyB0ZXN0IGxpYnJhcnkKK3NldCh0ZXN0Z2VuY3BwX1NPVVJDRVMKKyAgICBnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuaAorICAgIGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuY3BwCisgICAgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oCisgICAgZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5jcHAKKyAgICBnZW4tY3BwL0VudW1UZXN0X3R5cGVzLmgKKyAgICBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuaAorICAgIGdlbi1jcHAvUmVjdXJzaXZlX3R5cGVzLmNwcAorICAgIGdlbi1jcHAvUmVjdXJzaXZlX3R5cGVzLmgKKyAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmgKKyAgICBnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuY3BwCisgICAgZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmgKKyAgICBnZW4tY3BwL09uZVdheVNlcnZpY2UuY3BwCisgICAgZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmgKKyAgICBnZW4tY3BwL1R5cGVkZWZUZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuaAorICAgIFRocmlmdFRlc3RfZXh0cmFzLmNwcAorICAgIERlYnVnUHJvdG9UZXN0X2V4dHJhcy5jcHAKKykKKworYWRkX2xpYnJhcnkodGVzdGdlbmNwcCBTVEFUSUMgJHt0ZXN0Z2VuY3BwX1NPVVJDRVN9KQorCitzZXQodGVzdGdlbmNwcF9jb2JfU09VUkNFUworICAgIGdlbi1jcHAvQ2hpbGRTZXJ2aWNlLmNwcAorICAgIGdlbi1jcHAvQ2hpbGRTZXJ2aWNlLmgKKyAgICBnZW4tY3BwL0VtcHR5U2VydmljZS5jcHAKKyAgICBnZW4tY3BwL0VtcHR5U2VydmljZS5oCisgICAgZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmNwcAorICAgIGdlbi1jcHAvUGFyZW50U2VydmljZS5oCisgICAgZ2VuLWNwcC9wcm9jX3R5cGVzLmNwcAorICAgIGdlbi1jcHAvcHJvY190eXBlcy5oCispCithZGRfbGlicmFyeSh0ZXN0Z2VuY3BwX2NvYiBTVEFUSUMgJHt0ZXN0Z2VuY3BwX2NvYl9TT1VSQ0VTfSkKKworYWRkX2V4ZWN1dGFibGUoQmVuY2htYXJrIEJlbmNobWFyay5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoQmVuY2htYXJrIHRlc3RnZW5jcHApCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoQmVuY2htYXJrIHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgQmVuY2htYXJrIENPTU1BTkQgQmVuY2htYXJrKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKEJlbmNobWFyayB0ZXN0Z2VuY3BwKQorCitzZXQoVW5pdFRlc3RfU09VUkNFUworICAgIFVuaXRUZXN0TWFpbi5jcHAKKyAgICBPbmVXYXlIVFRQVGVzdC5jcHAKKyAgICBUTWVtb3J5QnVmZmVyVGVzdC5jcHAKKyAgICBUQnVmZmVyQmFzZVRlc3QuY3BwCisgICAgQmFzZTY0VGVzdC5jcHAKKyAgICBUb1N0cmluZ1Rlc3QuY3BwCisgICAgVHlwZWRlZlRlc3QuY3BwCisgICAgVFNlcnZlclNvY2tldFRlc3QuY3BwCisgICAgVFNlcnZlclRyYW5zcG9ydFRlc3QuY3BwCispCisKK2lmKE5PVCBXSVRIX1NURFRIUkVBRFMgQU5EIE5PVCBNU1ZDIEFORCBOT1QgTUlOR1cpCisgICAgbGlzdChBUFBFTkQgVW5pdFRlc3RfU09VUkNFUyBjb25jdXJyZW5jeS9NdXRleFRlc3QuY3BwKQorICAgIGxpc3QoQVBQRU5EIFVuaXRUZXN0X1NPVVJDRVMgY29uY3VycmVuY3kvUldNdXRleFN0YXJ2ZVRlc3QuY3BwKQorZW5kaWYoKQorCithZGRfZXhlY3V0YWJsZShVbml0VGVzdHMgJHtVbml0VGVzdF9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhVbml0VGVzdHMgdGVzdGdlbmNwcCAke0Jvb3N0X0xJQlJBUklFU30pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVW5pdFRlc3RzIHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgVW5pdFRlc3RzIENPTU1BTkQgVW5pdFRlc3RzKQoraWYgKCBNU1ZDICkKKyAgICAjIERpc2FibGUgQzQ1MDM6IGRlY29yYXRlZCBuYW1lIGxlbmd0aCBleGNlZWRlZCwgbmFtZSB3YXMgdHJ1bmNhdGVkCisgICAgIyAnaW5zYW5pdHknIHJlc3VsdHMgaW4gdmVyeSBsb25nIGRlY29yYXRlZCBuYW1lcworICAgIHNldF9wcm9wZXJ0eSggVEFSR0VUIFVuaXRUZXN0cyBBUFBFTkRfU1RSSU5HIFBST1BFUlRZIENPTVBJTEVfRkxBR1MgL3dkNDUwMyApCitlbmRpZiAoIE1TVkMgKQorCisKK3NldCggVEludGVycnVwdFRlc3RfU09VUkNFUworICAgICBUU29ja2V0SW50ZXJydXB0VGVzdC5jcHAKKyAgICAgVFNTTFNvY2tldEludGVycnVwdFRlc3QuY3BwCispCitpZiAoV0lOMzIpCisgICAgbGlzdChBUFBFTkQgVEludGVycnVwdFRlc3RfU09VUkNFUworICAgICAgICBUUGlwZUludGVycnVwdFRlc3QuY3BwCisgICAgKQorZW5kaWYoKQorYWRkX2V4ZWN1dGFibGUoVEludGVycnVwdFRlc3QgJHtUSW50ZXJydXB0VGVzdF9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUSW50ZXJydXB0VGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUSW50ZXJydXB0VGVzdCB0aHJpZnQpCitpZiAoTk9UIE1TVkMgQU5EIE5PVCAke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJEYXJ3aW4iIEFORCBOT1QgTUlOR1cpCit0YXJnZXRfbGlua19saWJyYXJpZXMoVEludGVycnVwdFRlc3QgLWxydCkKK2VuZGlmICgpCithZGRfdGVzdChOQU1FIFRJbnRlcnJ1cHRUZXN0IENPTU1BTkQgVEludGVycnVwdFRlc3QgLS0gIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLi8uLi8uLi90ZXN0L2tleXMiKQorCithZGRfZXhlY3V0YWJsZShUU2VydmVySW50ZWdyYXRpb25UZXN0IFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QKKyAgICB0ZXN0Z2VuY3BwX2NvYgorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QgdGhyaWZ0KQoraWYgKE5PVCBNU1ZDIEFORCBOT1QgJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiRGFyd2luIiBBTkQgTk9UIE1JTkdXKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QgLWxydCkKK2VuZGlmICgpCithZGRfdGVzdChOQU1FIFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QgQ09NTUFORCBUU2VydmVySW50ZWdyYXRpb25UZXN0KQorCitpZihXSVRIX1pMSUIpCitpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtaTElCX0lOQ0xVREVfRElSU30iKQorYWRkX2V4ZWN1dGFibGUoVHJhbnNwb3J0VGVzdCBUcmFuc3BvcnRUZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUcmFuc3BvcnRUZXN0CisgICAgdGVzdGdlbmNwcAorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorICAgICR7WkxJQl9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVHJhbnNwb3J0VGVzdCB0aHJpZnQpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVHJhbnNwb3J0VGVzdCB0aHJpZnR6KQorYWRkX3Rlc3QoTkFNRSBUcmFuc3BvcnRUZXN0IENPTU1BTkQgVHJhbnNwb3J0VGVzdCkKKworYWRkX2V4ZWN1dGFibGUoWmxpYlRlc3QgWmxpYlRlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFpsaWJUZXN0CisgICAgdGVzdGdlbmNwcAorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorICAgICR7WkxJQl9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoWmxpYlRlc3QgdGhyaWZ0KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFpsaWJUZXN0IHRocmlmdHopCithZGRfdGVzdChOQU1FIFpsaWJUZXN0IENPTU1BTkQgWmxpYlRlc3QpCitlbmRpZihXSVRIX1pMSUIpCisKK2FkZF9leGVjdXRhYmxlKEFubm90YXRpb25UZXN0IEFubm90YXRpb25UZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhBbm5vdGF0aW9uVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShBbm5vdGF0aW9uVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIEFubm90YXRpb25UZXN0IENPTU1BTkQgQW5ub3RhdGlvblRlc3QpCisKK2FkZF9leGVjdXRhYmxlKEVudW1UZXN0IEVudW1UZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhFbnVtVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShFbnVtVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIEVudW1UZXN0IENPTU1BTkQgRW51bVRlc3QpCisKK2lmKEhBVkVfR0VUT1BUX0gpCithZGRfZXhlY3V0YWJsZShURmlsZVRyYW5zcG9ydFRlc3QgVEZpbGVUcmFuc3BvcnRUZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhURmlsZVRyYW5zcG9ydFRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVEZpbGVUcmFuc3BvcnRUZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgVEZpbGVUcmFuc3BvcnRUZXN0IENPTU1BTkQgVEZpbGVUcmFuc3BvcnRUZXN0KQorZW5kaWYoKQorCithZGRfZXhlY3V0YWJsZShURkRUcmFuc3BvcnRUZXN0IFRGRFRyYW5zcG9ydFRlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRGRFRyYW5zcG9ydFRlc3QKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShURkRUcmFuc3BvcnRUZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgVEZEVHJhbnNwb3J0VGVzdCBDT01NQU5EIFRGRFRyYW5zcG9ydFRlc3QpCisKK2FkZF9leGVjdXRhYmxlKFRQaXBlZFRyYW5zcG9ydFRlc3QgVFBpcGVkVHJhbnNwb3J0VGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoVFBpcGVkVHJhbnNwb3J0VGVzdAorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRQaXBlZFRyYW5zcG9ydFRlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBUUGlwZWRUcmFuc3BvcnRUZXN0IENPTU1BTkQgVFBpcGVkVHJhbnNwb3J0VGVzdCkKKworc2V0KEFsbFByb3RvY29sc1Rlc3RfU09VUkNFUworICAgIEFsbFByb3RvY29sVGVzdHMuY3BwCisgICAgQWxsUHJvdG9jb2xUZXN0cy50Y2MKKyAgICBHZW5lcmljSGVscGVycworICAgICkKKworYWRkX2V4ZWN1dGFibGUoQWxsUHJvdG9jb2xzVGVzdCAke0FsbFByb3RvY29sc1Rlc3RfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoQWxsUHJvdG9jb2xzVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShBbGxQcm90b2NvbHNUZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgQWxsUHJvdG9jb2xzVGVzdCBDT01NQU5EIEFsbFByb3RvY29sc1Rlc3QpCisKKyMgVGhlIGRlYnVnIHJ1bi10aW1lIGluIFdpbmRvd3MgYXNzZXJ0cyBvbiBpc3ByaW50KCkgd2l0aCBuZWdhdGl2ZSBpbnB1dHMKK2lmIChOT1QgTVNWQyBPUiAoTVNWQyBBTkQgQ01BS0VfQlVJTERfVFlQRSBFUVVBTCAiREVCVUciKSkKK2FkZF9leGVjdXRhYmxlKERlYnVnUHJvdG9UZXN0IERlYnVnUHJvdG9UZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhEZWJ1Z1Byb3RvVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShEZWJ1Z1Byb3RvVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIERlYnVnUHJvdG9UZXN0IENPTU1BTkQgRGVidWdQcm90b1Rlc3QpCitlbmRpZigpCisKK2FkZF9leGVjdXRhYmxlKEpTT05Qcm90b1Rlc3QgSlNPTlByb3RvVGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoSlNPTlByb3RvVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShKU09OUHJvdG9UZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgSlNPTlByb3RvVGVzdCBDT01NQU5EIEpTT05Qcm90b1Rlc3QpCisKK2FkZF9leGVjdXRhYmxlKE9wdGlvbmFsUmVxdWlyZWRUZXN0IE9wdGlvbmFsUmVxdWlyZWRUZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhPcHRpb25hbFJlcXVpcmVkVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShPcHRpb25hbFJlcXVpcmVkVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIE9wdGlvbmFsUmVxdWlyZWRUZXN0IENPTU1BTkQgT3B0aW9uYWxSZXF1aXJlZFRlc3QpCisKK2FkZF9leGVjdXRhYmxlKFJlY3Vyc2l2ZVRlc3QgUmVjdXJzaXZlVGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoUmVjdXJzaXZlVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShSZWN1cnNpdmVUZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgUmVjdXJzaXZlVGVzdCBDT01NQU5EIFJlY3Vyc2l2ZVRlc3QpCisKK2FkZF9leGVjdXRhYmxlKFNwZWNpYWxpemF0aW9uVGVzdCBTcGVjaWFsaXphdGlvblRlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFNwZWNpYWxpemF0aW9uVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShTcGVjaWFsaXphdGlvblRlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBTcGVjaWFsaXphdGlvblRlc3QgQ09NTUFORCBTcGVjaWFsaXphdGlvblRlc3QpCisKK3NldChjb25jdXJyZW5jeV90ZXN0X1NPVVJDRVMKKyAgICBjb25jdXJyZW5jeS9UZXN0cy5jcHAKKyAgICBjb25jdXJyZW5jeS9UaHJlYWRGYWN0b3J5VGVzdHMuaAorICAgIGNvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXJUZXN0cy5oCisgICAgY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyVGVzdHMuaAorKQorYWRkX2V4ZWN1dGFibGUoY29uY3VycmVuY3lfdGVzdCAke2NvbmN1cnJlbmN5X3Rlc3RfU09VUkNFU30pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoY29uY3VycmVuY3lfdGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIGNvbmN1cnJlbmN5X3Rlc3QgQ09NTUFORCBjb25jdXJyZW5jeV90ZXN0KQorCitzZXQobGlua190ZXN0X1NPVVJDRVMKKyAgICBsaW5rL0xpbmtUZXN0LmNwcAorICAgIGdlbi1jcHAvUGFyZW50U2VydmljZS5oCisgICAgbGluay9UZW1wbGF0ZWRTZXJ2aWNlMS5jcHAKKyAgICBsaW5rL1RlbXBsYXRlZFNlcnZpY2UyLmNwcAorKQorCithZGRfZXhlY3V0YWJsZShsaW5rX3Rlc3QgJHtsaW5rX3Rlc3RfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMobGlua190ZXN0IHRlc3RnZW5jcHBfY29iKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKGxpbmtfdGVzdCB0aHJpZnQpCit0YXJnZXRfbGlua19saWJyYXJpZXMobGlua190ZXN0IHRlc3RnZW5jcHApCithZGRfdGVzdChOQU1FIGxpbmtfdGVzdCBDT01NQU5EIGxpbmtfdGVzdCkKKworaWYoV0lUSF9MSUJFVkVOVCkKK3NldChwcm9jZXNzb3JfdGVzdF9TT1VSQ0VTCisgICAgcHJvY2Vzc29yL1Byb2Nlc3NvclRlc3QuY3BwCisgICAgcHJvY2Vzc29yL0V2ZW50TG9nLmNwcAorICAgIHByb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuY3BwCisgICAgcHJvY2Vzc29yL0V2ZW50TG9nLmgKKyAgICBwcm9jZXNzb3IvSGFuZGxlcnMuaAorICAgIHByb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuaAorKQorYWRkX2V4ZWN1dGFibGUocHJvY2Vzc29yX3Rlc3QgJHtwcm9jZXNzb3JfdGVzdF9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhwcm9jZXNzb3JfdGVzdAorICAgIHRlc3RnZW5jcHBfY29iCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkocHJvY2Vzc29yX3Rlc3QgdGhyaWZ0KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHByb2Nlc3Nvcl90ZXN0IHRocmlmdG5iKQorYWRkX3Rlc3QoTkFNRSBwcm9jZXNzb3JfdGVzdCBDT01NQU5EIHByb2Nlc3Nvcl90ZXN0KQorCitzZXQoVE5vbmJsb2NraW5nU2VydmVyVGVzdF9TT1VSQ0VTIFROb25ibG9ja2luZ1NlcnZlclRlc3QuY3BwKQorYWRkX2V4ZWN1dGFibGUoVE5vbmJsb2NraW5nU2VydmVyVGVzdCAke1ROb25ibG9ja2luZ1NlcnZlclRlc3RfU09VUkNFU30pCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7TElCRVZFTlRfSU5DTFVERV9ESVJTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0CisgICAgdGVzdGdlbmNwcF9jb2IKKyAgICAke0xJQkVWRU5UX0xJQlJBUklFU30KKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0IHRocmlmdCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0IHRocmlmdG5iKQorYWRkX3Rlc3QoTkFNRSBUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0IENPTU1BTkQgVE5vbmJsb2NraW5nU2VydmVyVGVzdCkKKworaWYoT1BFTlNTTF9GT1VORCBBTkQgV0lUSF9PUEVOU1NMKQorICBzZXQoVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdF9TT1VSQ0VTIFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QuY3BwKQorICBhZGRfZXhlY3V0YWJsZShUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0ICR7VE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdF9TT1VSQ0VTfSkKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0xJQkVWRU5UX0lOQ0xVREVfRElSU30pCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0CisgICAgdGVzdGdlbmNwcF9jb2IKKyAgICAke0xJQkVWRU5UX0xJQlJBUklFU30KKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKyAgKQorICBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdCB0aHJpZnQpCisgIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0IHRocmlmdG5iKQorICBhZGRfdGVzdChOQU1FIFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QgQ09NTUFORCBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0IC0tICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vLi4vLi4vdGVzdC9rZXlzIikKK2VuZGlmKE9QRU5TU0xfRk9VTkQgQU5EIFdJVEhfT1BFTlNTTCkKK2VuZGlmKFdJVEhfTElCRVZFTlQpCisKK2lmKE9QRU5TU0xfRk9VTkQgQU5EIFdJVEhfT1BFTlNTTCkKK2FkZF9leGVjdXRhYmxlKE9wZW5TU0xNYW51YWxJbml0VGVzdCBPcGVuU1NMTWFudWFsSW5pdFRlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKE9wZW5TU0xNYW51YWxJbml0VGVzdAorICAgICR7T1BFTlNTTF9MSUJSQVJJRVN9CisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoT3BlblNTTE1hbnVhbEluaXRUZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgT3BlblNTTE1hbnVhbEluaXRUZXN0IENPTU1BTkQgT3BlblNTTE1hbnVhbEluaXRUZXN0KQorCithZGRfZXhlY3V0YWJsZShTZWN1cml0eVRlc3QgU2VjdXJpdHlUZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhTZWN1cml0eVRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoU2VjdXJpdHlUZXN0IHRocmlmdCkKK2lmIChOT1QgTVNWQyBBTkQgTk9UICR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIkRhcndpbiIgQU5EIE5PVCBNSU5HVykKK3RhcmdldF9saW5rX2xpYnJhcmllcyhTZWN1cml0eVRlc3QgLWxydCkKK2VuZGlmICgpCithZGRfdGVzdChOQU1FIFNlY3VyaXR5VGVzdCBDT01NQU5EIFNlY3VyaXR5VGVzdCAtLSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uLy4uLy4uL3Rlc3Qva2V5cyIpCisKK2VuZGlmKCkKKworaWYoV0lUSF9RVDQpCitzZXQoQ01BS0VfQVVUT01PQyBPTikKK2ZpbmRfcGFja2FnZShRdDQgUkVRVUlSRUQgQ09NUE9ORU5UUyBRdFRlc3QpCitzZXQoVFFUY3BTZXJ2ZXJUZXN0X1NPVVJDRVMKKyAgICBxdC9UUVRjcFNlcnZlclRlc3QuY3BwCispCithZGRfZXhlY3V0YWJsZShUUVRjcFNlcnZlclRlc3QgJHtUUVRjcFNlcnZlclRlc3RfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoVFFUY3BTZXJ2ZXJUZXN0IHRlc3RnZW5jcHBfY29iIHRocmlmdHF0IFF0NDo6UXRUZXN0KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRRVGNwU2VydmVyVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIFRRVGNwU2VydmVyVGVzdCBDT01NQU5EIFRRVGNwU2VydmVyVGVzdCkKK2VuZGlmKCkKKworaWYoV0lUSF9RVDUpCithZGRfc3ViZGlyZWN0b3J5KHF0KQorZW5kaWYoKQorCisjCisjIENvbW1vbiB0aHJpZnQgY29kZSBnZW5lcmF0aW9uIHJ1bGVzCisjCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF9jb25zdGFudHMuY3BwCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfY29uc3RhbnRzLmgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5jcHAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5oCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbi1jcHAvZm9vX3NlcnZpY2UuY3BwCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbi1jcHAvZm9vX3NlcnZpY2UuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9Bbm5vdGF0aW9uVGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmNwcCBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmggZ2VuLWNwcC9FbXB0eVNlcnZpY2UuY3BwIGdlbi1jcHAvRW1wdHlTZXJ2aWNlLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0VudW1UZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UeXBlZGVmVGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9SZWN1cnNpdmVfdHlwZXMuY3BwIGdlbi1jcHAvUmVjdXJzaXZlX3R5cGVzLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvU2VydmljZS5jcHAgZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9TdHJlc3NUZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvU2Vjb25kU2VydmljZS5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmNwcCBnZW4tY3BwL09uZVdheVRlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuaCBnZW4tY3BwL09uZVdheVNlcnZpY2UuaCBnZW4tY3BwL09uZVdheVRlc3RfY29uc3RhbnRzLmggZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmNwcAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vT25lV2F5VGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL0NoaWxkU2VydmljZS5jcHAgZ2VuLWNwcC9DaGlsZFNlcnZpY2UuaCBnZW4tY3BwL1BhcmVudFNlcnZpY2UuY3BwIGdlbi1jcHAvUGFyZW50U2VydmljZS5oIGdlbi1jcHAvcHJvY190eXBlcy5jcHAgZ2VuLWNwcC9wcm9jX3R5cGVzLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHA6dGVtcGxhdGVzLGNvYl9zdHlsZSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vcHJvY2Vzc29yL3Byb2MudGhyaWZ0CispCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvRGVidWdQcm90b1Rlc3QuY3BwIGIvbGliL2NwcC90ZXN0L0RlYnVnUHJvdG9UZXN0LmNwcAppbmRleCA0ZjQ1NmYzLi4wNjBmMzU0IDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvRGVidWdQcm90b1Rlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdC5jcHAKQEAgLTE3LDg5ICsxNywyOTQgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxpb3N0cmVhbT4KKyNkZWZpbmUgX1VTRV9NQVRIX0RFRklORVMKICNpbmNsdWRlIDxjbWF0aD4KICNpbmNsdWRlICJnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmgiCi0jaW5jbHVkZSA8cHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKLWludCBtYWluKCkgewotICB1c2luZyBzdGQ6OmNvdXQ7Ci0gIHVzaW5nIHN0ZDo6ZW5kbDsKLSAgdXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDo6ZGVidWc7CisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIERlYnVnUHJvdG9UZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgogCit1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OjpkZWJ1ZzsKIAotICBPbmVPZkVhY2ggb29lOwotICBvb2UuaW1fdHJ1ZSAgID0gdHJ1ZTsKLSAgb29lLmltX2ZhbHNlICA9IGZhbHNlOwotICBvb2UuYV9iaXRlICAgID0gMHg3ZjsKLSAgb29lLmludGVnZXIxNiA9IDI3MDAwOwotICBvb2UuaW50ZWdlcjMyID0gMTw8MjQ7Ci0gIG9vZS5pbnRlZ2VyNjQgPSAodWludDY0X3QpNjAwMCAqIDEwMDAgKiAxMDAwOwotICBvb2UuZG91YmxlX3ByZWNpc2lvbiA9IE1fUEk7Ci0gIG9vZS5zb21lX2NoYXJhY3RlcnMgID0gIkRlYnVnIFRISVMhIjsKLSAgb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkN1xuXGFcdCI7CitzdGF0aWMgOjpzdGQ6OnNoYXJlZF9wdHI8T25lT2ZFYWNoPiBvb2U7CiAKLSAgY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcob29lKSA8PCBlbmRsIDw8IGVuZGw7Cit2b2lkIHRlc3RDYXNlU2V0dXBfMSgpIHsKKyAgb29lLnJlc2V0KG5ldyBPbmVPZkVhY2gpOworICBvb2UtPmltX3RydWUgPSB0cnVlOworICBvb2UtPmltX2ZhbHNlID0gZmFsc2U7CisgIG9vZS0+YV9iaXRlID0gMHg3ZjsKKyAgb29lLT5pbnRlZ2VyMTYgPSAyNzAwMDsKKyAgb29lLT5pbnRlZ2VyMzIgPSAxIDw8IDI0OworICBvb2UtPmludGVnZXI2NCA9ICh1aW50NjRfdCk2MDAwICogMTAwMCAqIDEwMDA7CisgIG9vZS0+ZG91YmxlX3ByZWNpc2lvbiA9IE1fUEk7CisgIG9vZS0+c29tZV9jaGFyYWN0ZXJzID0gIkRlYnVnIFRISVMhIjsKKyAgb29lLT56b21nX3VuaWNvZGUgPSAiXHhkN1xuXGFcdCI7Cit9CiAKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZGVidWdfcHJvdG9fMSkgeworICB0ZXN0Q2FzZVNldHVwXzEoKTsKIAotICBOZXN0aW5nIG47Ci0gIG4ubXlfb29lID0gb29lOwotICBuLm15X29vZS5pbnRlZ2VyMTYgPSAxNjsKLSAgbi5teV9vb2UuaW50ZWdlcjMyID0gMzI7Ci0gIG4ubXlfb29lLmludGVnZXI2NCA9IDY0OwotICBuLm15X29vZS5kb3VibGVfcHJlY2lzaW9uID0gKHN0ZDo6c3FydCg1LjApKzEpLzI7Ci0gIG4ubXlfb29lLnNvbWVfY2hhcmFjdGVycyAgPSAiOlIgKG1lIGdvaW5nIFwicnJyclwiKSI7Ci0gIG4ubXlfb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkM1x4ODBceGUyXHg4NVx4YWVceGNlXHg5ZFx4MjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhkMFx4OWRceGNlXHhiZlx4ZTJceDg1XHhiZlx4ZDBceGJlXHhjOVx4YTFceGQwXHhiM1x4ZDBceGIwXHhjZlx4ODFceGUyXHg4NFx4OGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgyMFx4Y2VceDkxXHg3NFx4NzRceGNlXHhiMVx4ZTJceDg1XHhiZFx4Y2VceGJhXHhjN1x4ODNceGUyXHg4MFx4YmMiOwotICBuLm15X2JvbmsudHlwZSAgICA9IDMxMzM3OwotICBuLm15X2JvbmsubWVzc2FnZSA9ICJJIGFtIGEgYm9uay4uLiB4b3IhIjsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJPbmVPZkVhY2gge1xuIgorICAgICIgIDAxOiBpbV90cnVlIChib29sKSA9IHRydWUsXG4iCisgICAgIiAgMDI6IGltX2ZhbHNlIChib29sKSA9IGZhbHNlLFxuIgorICAgICIgIDAzOiBhX2JpdGUgKGJ5dGUpID0gMHg3ZixcbiIKKyAgICAiICAwNDogaW50ZWdlcjE2IChpMTYpID0gMjcwMDAsXG4iCisgICAgIiAgMDU6IGludGVnZXIzMiAoaTMyKSA9IDE2Nzc3MjE2LFxuIgorICAgICIgIDA2OiBpbnRlZ2VyNjQgKGk2NCkgPSA2MDAwMDAwMDAwLFxuIgorICAgICIgIDA3OiBkb3VibGVfcHJlY2lzaW9uIChkb3VibGUpID0gMy4xNDE1OTI2NTM1ODk3OTMxLFxuIgorICAgICIgIDA4OiBzb21lX2NoYXJhY3RlcnMgKHN0cmluZykgPSBcIkRlYnVnIFRISVMhXCIsXG4iCisgICAgIiAgMDk6IHpvbWdfdW5pY29kZSAoc3RyaW5nKSA9IFwiXFx4ZDdcXG5cXGFcXHRcIixcbiIKKyAgICAiICAxMDogd2hhdF93aG8gKGJvb2wpID0gZmFsc2UsXG4iCisgICAgIiAgMTE6IGJhc2U2NCAoc3RyaW5nKSA9IFwiXCIsXG4iCisgICAgIiAgMTI6IGJ5dGVfbGlzdCAobGlzdCkgPSBsaXN0PGJ5dGU+WzNdIHtcbiIKKyAgICAiICAgIFswXSA9IDB4MDEsXG4iCisgICAgIiAgICBbMV0gPSAweDAyLFxuIgorICAgICIgICAgWzJdID0gMHgwMyxcbiIKKyAgICAiICB9LFxuIgorICAgICIgIDEzOiBpMTZfbGlzdCAobGlzdCkgPSBsaXN0PGkxNj5bM10ge1xuIgorICAgICIgICAgWzBdID0gMSxcbiIKKyAgICAiICAgIFsxXSA9IDIsXG4iCisgICAgIiAgICBbMl0gPSAzLFxuIgorICAgICIgIH0sXG4iCisgICAgIiAgMTQ6IGk2NF9saXN0IChsaXN0KSA9IGxpc3Q8aTY0PlszXSB7XG4iCisgICAgIiAgICBbMF0gPSAxLFxuIgorICAgICIgICAgWzFdID0gMixcbiIKKyAgICAiICAgIFsyXSA9IDMsXG4iCisgICAgIiAgfSxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKCpvb2UpKTsKIAotICBjb3V0IDw8IGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhuKSA8PCBlbmRsIDw8IGVuZGw7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQogCitzdGF0aWMgOjpzdGQ6OnNoYXJlZF9wdHI8TmVzdGluZz4gbjsKIAotICBIb2x5TW9sZXkgaG07Cit2b2lkIHRlc3RDYXNlU2V0dXBfMigpIHsKKyAgdGVzdENhc2VTZXR1cF8xKCk7CiAKLSAgaG0uYmlnLnB1c2hfYmFjayhvb2UpOwotICBobS5iaWcucHVzaF9iYWNrKG4ubXlfb29lKTsKLSAgaG0uYmlnWzBdLmFfYml0ZSA9IDB4MjI7Ci0gIGhtLmJpZ1sxXS5hX2JpdGUgPSAweDMzOworICBuLnJlc2V0KG5ldyBOZXN0aW5nKTsKKyAgbi0+bXlfb29lID0gKm9vZTsKKyAgbi0+bXlfb29lLmludGVnZXIxNiA9IDE2OworICBuLT5teV9vb2UuaW50ZWdlcjMyID0gMzI7CisgIG4tPm15X29vZS5pbnRlZ2VyNjQgPSA2NDsKKyAgbi0+bXlfb29lLmRvdWJsZV9wcmVjaXNpb24gPSAoc3RkOjpzcXJ0KDUuMCkgKyAxKSAvIDI7CisgIG4tPm15X29vZS5zb21lX2NoYXJhY3RlcnMgPSAiOlIgKG1lIGdvaW5nIFwicnJyclwiKSI7CisgIG4tPm15X29vZS56b21nX3VuaWNvZGUgICAgID0gIlx4ZDNceDgwXHhlMlx4ODVceGFlXHhjZVx4OWRceDIwXHhkMFx4OWRceGNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGJmXHhlMlx4ODVceGJmXHhkMFx4YmVceGM5XHhhMVx4ZDBceGIzXHhkMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhiMFx4Y2ZceDgxXHhlMlx4ODRceDhlXHgyMFx4Y2VceDkxXHg3NFx4NzQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4Y2VceGIxXHhlMlx4ODVceGJkXHhjZVx4YmFceGM3XHg4M1x4ZTJceDgwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGJjIjsKKyAgbi0+bXlfYm9uay50eXBlID0gMzEzMzc7CisgIG4tPm15X2JvbmsubWVzc2FnZSA9ICJJIGFtIGEgYm9uay4uLiB4b3IhIjsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9kZWJ1Z19wcm90b18yKSB7CisgIHRlc3RDYXNlU2V0dXBfMigpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiTmVzdGluZyB7XG4iCisgICAgIiAgMDE6IG15X2JvbmsgKHN0cnVjdCkgPSBCb25rIHtcbiIKKyAgICAiICAgIDAxOiB0eXBlIChpMzIpID0gMzEzMzcsXG4iCisgICAgIiAgICAwMjogbWVzc2FnZSAoc3RyaW5nKSA9IFwiSSBhbSBhIGJvbmsuLi4geG9yIVwiLFxuIgorICAgICIgIH0sXG4iCisgICAgIiAgMDI6IG15X29vZSAoc3RydWN0KSA9IE9uZU9mRWFjaCB7XG4iCisgICAgIiAgICAwMTogaW1fdHJ1ZSAoYm9vbCkgPSB0cnVlLFxuIgorICAgICIgICAgMDI6IGltX2ZhbHNlIChib29sKSA9IGZhbHNlLFxuIgorICAgICIgICAgMDM6IGFfYml0ZSAoYnl0ZSkgPSAweDdmLFxuIgorICAgICIgICAgMDQ6IGludGVnZXIxNiAoaTE2KSA9IDE2LFxuIgorICAgICIgICAgMDU6IGludGVnZXIzMiAoaTMyKSA9IDMyLFxuIgorICAgICIgICAgMDY6IGludGVnZXI2NCAoaTY0KSA9IDY0LFxuIgorICAgICIgICAgMDc6IGRvdWJsZV9wcmVjaXNpb24gKGRvdWJsZSkgPSAxLjYxODAzMzk4ODc0OTg5NDksXG4iCisgICAgIiAgICAwODogc29tZV9jaGFyYWN0ZXJzIChzdHJpbmcpID0gXCI6UiAobWUgZ29pbmcgXFxcInJycnJcXFwiKVwiLFxuIgorICAgICIgICAgMDk6IHpvbWdfdW5pY29kZSAoc3RyaW5nKSA9IFwiXFx4ZDNcXHg4MFxceGUyXFx4ODVcXHhhZVxceGNlXFx4OWQgXFx4ZCIKKyAgICAgICIwXFx4OWRcXHhjZVxceGJmXFx4ZTJcXHg4NVxceGJmXFx4ZDBcXHhiZVxceGM5XFx4YTFcXHhkMFxceGIzXFx4ZDBcXHhiMCIKKyAgICAgICJcXHhjZlxceDgxXFx4ZTJcXHg4NFxceDhlIFxceGNlXFx4OTF0dFxceGNlXFx4YjFcXHhlMlxceDg1XFx4YmRcXHhjZVxceGIiCisgICAgICAiYVxceGM3XFx4ODNcXHhlMlxceDgwXFx4YmNcIixcbiIKKyAgICAiICAgIDEwOiB3aGF0X3dobyAoYm9vbCkgPSBmYWxzZSxcbiIKKyAgICAiICAgIDExOiBiYXNlNjQgKHN0cmluZykgPSBcIlwiLFxuIgorICAgICIgICAgMTI6IGJ5dGVfbGlzdCAobGlzdCkgPSBsaXN0PGJ5dGU+WzNdIHtcbiIKKyAgICAiICAgICAgWzBdID0gMHgwMSxcbiIKKyAgICAiICAgICAgWzFdID0gMHgwMixcbiIKKyAgICAiICAgICAgWzJdID0gMHgwMyxcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgICAxMzogaTE2X2xpc3QgKGxpc3QpID0gbGlzdDxpMTY+WzNdIHtcbiIKKyAgICAiICAgICAgWzBdID0gMSxcbiIKKyAgICAiICAgICAgWzFdID0gMixcbiIKKyAgICAiICAgICAgWzJdID0gMyxcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgICAxNDogaTY0X2xpc3QgKGxpc3QpID0gbGlzdDxpNjQ+WzNdIHtcbiIKKyAgICAiICAgICAgWzBdID0gMSxcbiIKKyAgICAiICAgICAgWzFdID0gMixcbiIKKyAgICAiICAgICAgWzJdID0gMyxcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgfSxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKCpuKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK3N0YXRpYyA6OnN0ZDo6c2hhcmVkX3B0cjxIb2x5TW9sZXk+IGhtOworCit2b2lkIHRlc3RDYXNlU2V0dXBfMygpIHsKKyAgdGVzdENhc2VTZXR1cF8yKCk7CisKKyAgaG0ucmVzZXQobmV3IEhvbHlNb2xleSk7CisKKyAgaG0tPmJpZy5wdXNoX2JhY2soKm9vZSk7CisgIGhtLT5iaWcucHVzaF9iYWNrKG4tPm15X29vZSk7CisgIGhtLT5iaWdbMF0uYV9iaXRlID0gMHgyMjsKKyAgaG0tPmJpZ1sxXS5hX2JpdGUgPSAweDMzOwogCiAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdGFnZTE7CiAgIHN0YWdlMS5wdXNoX2JhY2soImFuZCBhIG9uZSIpOwogICBzdGFnZTEucHVzaF9iYWNrKCJhbmQgYSB0d28iKTsKLSAgaG0uY29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKKyAgaG0tPmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7CiAgIHN0YWdlMS5jbGVhcigpOwogICBzdGFnZTEucHVzaF9iYWNrKCJ0aGVuIGEgb25lLCB0d28iKTsKICAgc3RhZ2UxLnB1c2hfYmFjaygidGhyZWUhIik7CiAgIHN0YWdlMS5wdXNoX2JhY2soIkZPVVIhISIpOwotICBobS5jb250YWluLmluc2VydChzdGFnZTEpOworICBobS0+Y29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKICAgc3RhZ2UxLmNsZWFyKCk7Ci0gIGhtLmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7CisgIGhtLT5jb250YWluLmluc2VydChzdGFnZTEpOwogCiAgIHN0ZDo6dmVjdG9yPEJvbms+IHN0YWdlMjsKLSAgaG0uYm9ua3NbIm5vdGhpbmciXSA9IHN0YWdlMjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOworICBobS0+Ym9ua3NbIm5vdGhpbmciXSA9IHN0YWdlMjsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDE7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJXYWl0LiI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDI7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJXaGF0PyI7Ci0gIGhtLmJvbmtzWyJzb21ldGhpbmciXSA9IHN0YWdlMjsKKyAgaG0tPmJvbmtzWyJzb21ldGhpbmciXSA9IHN0YWdlMjsKICAgc3RhZ2UyLmNsZWFyKCk7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDM7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJxdW90aCI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDQ7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJ0aGUgcmF2ZW4iOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7CisgIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSArIDEpOwogICBzdGFnZTIuYmFjaygpLnR5cGUgPSA1OwogICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAibmV2ZXJtb3JlIjsKLSAgaG0uYm9ua3NbInBvZSJdID0gc3RhZ2UyOworICBobS0+Ym9ua3NbInBvZSJdID0gc3RhZ2UyOworfQogCi0gIGNvdXQgPDwgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKGhtKSA8PCBlbmRsIDw8IGVuZGw7CitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2RlYnVnX3Byb3RvXzMpIHsKKyAgdGVzdENhc2VTZXR1cF8zKCk7CiAKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJIb2x5TW9sZXkge1xuIgorICAgICIgIDAxOiBiaWcgKGxpc3QpID0gbGlzdDxzdHJ1Y3Q+WzJdIHtcbiIKKyAgICAiICAgIFswXSA9IE9uZU9mRWFjaCB7XG4iCisgICAgIiAgICAgIDAxOiBpbV90cnVlIChib29sKSA9IHRydWUsXG4iCisgICAgIiAgICAgIDAyOiBpbV9mYWxzZSAoYm9vbCkgPSBmYWxzZSxcbiIKKyAgICAiICAgICAgMDM6IGFfYml0ZSAoYnl0ZSkgPSAweDIyLFxuIgorICAgICIgICAgICAwNDogaW50ZWdlcjE2IChpMTYpID0gMjcwMDAsXG4iCisgICAgIiAgICAgIDA1OiBpbnRlZ2VyMzIgKGkzMikgPSAxNjc3NzIxNixcbiIKKyAgICAiICAgICAgMDY6IGludGVnZXI2NCAoaTY0KSA9IDYwMDAwMDAwMDAsXG4iCisgICAgIiAgICAgIDA3OiBkb3VibGVfcHJlY2lzaW9uIChkb3VibGUpID0gMy4xNDE1OTI2NTM1ODk3OTMxLFxuIgorICAgICIgICAgICAwODogc29tZV9jaGFyYWN0ZXJzIChzdHJpbmcpID0gXCJEZWJ1ZyBUSElTIVwiLFxuIgorICAgICIgICAgICAwOTogem9tZ191bmljb2RlIChzdHJpbmcpID0gXCJcXHhkN1xcblxcYVxcdFwiLFxuIgorICAgICIgICAgICAxMDogd2hhdF93aG8gKGJvb2wpID0gZmFsc2UsXG4iCisgICAgIiAgICAgIDExOiBiYXNlNjQgKHN0cmluZykgPSBcIlwiLFxuIgorICAgICIgICAgICAxMjogYnl0ZV9saXN0IChsaXN0KSA9IGxpc3Q8Ynl0ZT5bM10ge1xuIgorICAgICIgICAgICAgIFswXSA9IDB4MDEsXG4iCisgICAgIiAgICAgICAgWzFdID0gMHgwMixcbiIKKyAgICAiICAgICAgICBbMl0gPSAweDAzLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgICAxMzogaTE2X2xpc3QgKGxpc3QpID0gbGlzdDxpMTY+WzNdIHtcbiIKKyAgICAiICAgICAgICBbMF0gPSAxLFxuIgorICAgICIgICAgICAgIFsxXSA9IDIsXG4iCisgICAgIiAgICAgICAgWzJdID0gMyxcbiIKKyAgICAiICAgICAgfSxcbiIKKyAgICAiICAgICAgMTQ6IGk2NF9saXN0IChsaXN0KSA9IGxpc3Q8aTY0PlszXSB7XG4iCisgICAgIiAgICAgICAgWzBdID0gMSxcbiIKKyAgICAiICAgICAgICBbMV0gPSAyLFxuIgorICAgICIgICAgICAgIFsyXSA9IDMsXG4iCisgICAgIiAgICAgIH0sXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgICAgWzFdID0gT25lT2ZFYWNoIHtcbiIKKyAgICAiICAgICAgMDE6IGltX3RydWUgKGJvb2wpID0gdHJ1ZSxcbiIKKyAgICAiICAgICAgMDI6IGltX2ZhbHNlIChib29sKSA9IGZhbHNlLFxuIgorICAgICIgICAgICAwMzogYV9iaXRlIChieXRlKSA9IDB4MzMsXG4iCisgICAgIiAgICAgIDA0OiBpbnRlZ2VyMTYgKGkxNikgPSAxNixcbiIKKyAgICAiICAgICAgMDU6IGludGVnZXIzMiAoaTMyKSA9IDMyLFxuIgorICAgICIgICAgICAwNjogaW50ZWdlcjY0IChpNjQpID0gNjQsXG4iCisgICAgIiAgICAgIDA3OiBkb3VibGVfcHJlY2lzaW9uIChkb3VibGUpID0gMS42MTgwMzM5ODg3NDk4OTQ5LFxuIgorICAgICIgICAgICAwODogc29tZV9jaGFyYWN0ZXJzIChzdHJpbmcpID0gXCI6UiAobWUgZ29pbmcgXFxcInJycnJcXFwiKVwiLFxuIgorICAgICIgICAgICAwOTogem9tZ191bmljb2RlIChzdHJpbmcpID0gXCJcXHhkM1xceDgwXFx4ZTJcXHg4NVxceGFlXFx4Y2VcXHg5ZCBcXCIKKyAgICAgICJ4ZDBcXHg5ZFxceGNlXFx4YmZcXHhlMlxceDg1XFx4YmZcXHhkMFxceGJlXFx4YzlcXHhhMVxceGQwXFx4YjNcXHhkMFxceGIiCisgICAgICAiMFxceGNmXFx4ODFcXHhlMlxceDg0XFx4OGUgXFx4Y2VcXHg5MXR0XFx4Y2VcXHhiMVxceGUyXFx4ODVcXHhiZFxceGNlXFx4IgorICAgICAgImJhXFx4YzdcXHg4M1xceGUyXFx4ODBcXHhiY1wiLFxuIgorICAgICIgICAgICAxMDogd2hhdF93aG8gKGJvb2wpID0gZmFsc2UsXG4iCisgICAgIiAgICAgIDExOiBiYXNlNjQgKHN0cmluZykgPSBcIlwiLFxuIgorICAgICIgICAgICAxMjogYnl0ZV9saXN0IChsaXN0KSA9IGxpc3Q8Ynl0ZT5bM10ge1xuIgorICAgICIgICAgICAgIFswXSA9IDB4MDEsXG4iCisgICAgIiAgICAgICAgWzFdID0gMHgwMixcbiIKKyAgICAiICAgICAgICBbMl0gPSAweDAzLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgICAxMzogaTE2X2xpc3QgKGxpc3QpID0gbGlzdDxpMTY+WzNdIHtcbiIKKyAgICAiICAgICAgICBbMF0gPSAxLFxuIgorICAgICIgICAgICAgIFsxXSA9IDIsXG4iCisgICAgIiAgICAgICAgWzJdID0gMyxcbiIKKyAgICAiICAgICAgfSxcbiIKKyAgICAiICAgICAgMTQ6IGk2NF9saXN0IChsaXN0KSA9IGxpc3Q8aTY0PlszXSB7XG4iCisgICAgIiAgICAgICAgWzBdID0gMSxcbiIKKyAgICAiICAgICAgICBbMV0gPSAyLFxuIgorICAgICIgICAgICAgIFsyXSA9IDMsXG4iCisgICAgIiAgICAgIH0sXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgIH0sXG4iCisgICAgIiAgMDI6IGNvbnRhaW4gKHNldCkgPSBzZXQ8bGlzdD5bM10ge1xuIgorICAgICIgICAgbGlzdDxzdHJpbmc+WzBdIHtcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgICBsaXN0PHN0cmluZz5bMl0ge1xuIgorICAgICIgICAgICBbMF0gPSBcImFuZCBhIG9uZVwiLFxuIgorICAgICIgICAgICBbMV0gPSBcImFuZCBhIHR3b1wiLFxuIgorICAgICIgICAgfSxcbiIKKyAgICAiICAgIGxpc3Q8c3RyaW5nPlszXSB7XG4iCisgICAgIiAgICAgIFswXSA9IFwidGhlbiBhIG9uZSwgdHdvXCIsXG4iCisgICAgIiAgICAgIFsxXSA9IFwidGhyZWUhXCIsXG4iCisgICAgIiAgICAgIFsyXSA9IFwiRk9VUiEhXCIsXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgIH0sXG4iCisgICAgIiAgMDM6IGJvbmtzIChtYXApID0gbWFwPHN0cmluZyxsaXN0PlszXSB7XG4iCisgICAgIiAgICBcIm5vdGhpbmdcIiAtPiBsaXN0PHN0cnVjdD5bMF0ge1xuIgorICAgICIgICAgfSxcbiIKKyAgICAiICAgIFwicG9lXCIgLT4gbGlzdDxzdHJ1Y3Q+WzNdIHtcbiIKKyAgICAiICAgICAgWzBdID0gQm9uayB7XG4iCisgICAgIiAgICAgICAgMDE6IHR5cGUgKGkzMikgPSAzLFxuIgorICAgICIgICAgICAgIDAyOiBtZXNzYWdlIChzdHJpbmcpID0gXCJxdW90aFwiLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgICBbMV0gPSBCb25rIHtcbiIKKyAgICAiICAgICAgICAwMTogdHlwZSAoaTMyKSA9IDQsXG4iCisgICAgIiAgICAgICAgMDI6IG1lc3NhZ2UgKHN0cmluZykgPSBcInRoZSByYXZlblwiLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgICBbMl0gPSBCb25rIHtcbiIKKyAgICAiICAgICAgICAwMTogdHlwZSAoaTMyKSA9IDUsXG4iCisgICAgIiAgICAgICAgMDI6IG1lc3NhZ2UgKHN0cmluZykgPSBcIm5ldmVybW9yZVwiLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgfSxcbiIKKyAgICAiICAgIFwic29tZXRoaW5nXCIgLT4gbGlzdDxzdHJ1Y3Q+WzJdIHtcbiIKKyAgICAiICAgICAgWzBdID0gQm9uayB7XG4iCisgICAgIiAgICAgICAgMDE6IHR5cGUgKGkzMikgPSAxLFxuIgorICAgICIgICAgICAgIDAyOiBtZXNzYWdlIChzdHJpbmcpID0gXCJXYWl0LlwiLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgICBbMV0gPSBCb25rIHtcbiIKKyAgICAiICAgICAgICAwMTogdHlwZSAoaTMyKSA9IDIsXG4iCisgICAgIiAgICAgICAgMDI6IG1lc3NhZ2UgKHN0cmluZykgPSBcIldoYXQ/XCIsXG4iCisgICAgIiAgICAgIH0sXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgIH0sXG4iCisgICAgIn0iKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZygqaG0pKTsKIAotICByZXR1cm4gMDsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvRGVidWdQcm90b1Rlc3RfZXh0cmFzLmNwcCBiL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwCmluZGV4IGM4OWRiNzQuLjVjNGZkMzUgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwCkBAIC0yMSwxMyArMjEsMTUgQEAKIAogI2luY2x1ZGUgImdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCIKIAotCi1uYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRlc3QgeyBuYW1lc3BhY2UgZGVidWcgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdGVzdCB7CituYW1lc3BhY2UgZGVidWcgewogCiBib29sIEVtcHR5OjpvcGVyYXRvcjwoRW1wdHkgY29uc3QmIG90aGVyKSBjb25zdCB7Ci0gICh2b2lkKSBvdGhlcjsKKyAgKHZvaWQpb3RoZXI7CiAgIC8vIEl0IGlzIGVtcHR5LCBzbyBhbGwgYXJlIGVxdWFsLgogICByZXR1cm4gZmFsc2U7CiB9Ci0KLX19fQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0RlbnNlUHJvdG9UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9EZW5zZVByb3RvVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5Zjc4NjUuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC90ZXN0L0RlbnNlUHJvdG9UZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGNwcDpkZW5zZSBEZWJ1Z1Byb3RvVGVzdC50aHJpZnQKLS4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gY3BwOmRlbnNlIE9wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdAotZysrIC1XYWxsIC1nIC1JLi4vbGliL2NwcC9zcmMgLUkvdXNyL2xvY2FsL2luY2x1ZGUvYm9vc3QtMV8zM18xIFwKLSAgZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5jcHAgXAotICBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmNwcCBcCi0gIERlbnNlUHJvdG9UZXN0LmNwcCAuLi9saWIvY3BwLy5saWJzL2xpYnRocmlmdC5hIC1vIERlbnNlUHJvdG9UZXN0Ci0uL0RlbnNlUHJvdG9UZXN0Ci0qLwotCi0vLyBJIGRvIHRoaXMgdG8gcmVhY2ggaW50byB0aGUgZ3V0cyBvZiBURGVuc2VQcm90b2NvbC4gIFNvcnJ5LgotI2RlZmluZSBwcml2YXRlIHB1YmxpYwotI2RlZmluZSBpbmxpbmUKLQotI3VuZGVmIE5ERUJVRwotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxjbWF0aD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAiZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIgotI2luY2x1ZGUgImdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuaCIKLSNpbmNsdWRlIDxwcm90b2NvbC9URGVuc2VQcm90b2NvbC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotCi0KLS8vIENhbid0IHVzZSBtZW1jbXAgaGVyZS4gIEdDQyBpcyB0b28gc21hcnQuCi1ib29sIG15X21lbWVxKGNvbnN0IGNoYXIqIHN0cjEsIGNvbnN0IGNoYXIqIHN0cjIsIGludCBsZW4pIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgIGlmIChzdHIxW2ldICE9IHN0cjJbaV0pIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotaW50IG1haW4oKSB7Ci0gIHVzaW5nIHN0ZDo6c3RyaW5nOwotICB1c2luZyBzdGQ6OmNvdXQ7Ci0gIHVzaW5nIHN0ZDo6ZW5kbDsKLSAgdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci0gIHVzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q6OmRlYnVnOwotICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLSAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLQotCi0gIE9uZU9mRWFjaCBvb2U7Ci0gIG9vZS5pbV90cnVlICAgPSB0cnVlOwotICBvb2UuaW1fZmFsc2UgID0gZmFsc2U7Ci0gIG9vZS5hX2JpdGUgICAgPSAweGQ2OwotICBvb2UuaW50ZWdlcjE2ID0gMjcwMDA7Ci0gIG9vZS5pbnRlZ2VyMzIgPSAxPDwyNDsKLSAgb29lLmludGVnZXI2NCA9ICh1aW50NjRfdCk2MDAwICogMTAwMCAqIDEwMDA7Ci0gIG9vZS5kb3VibGVfcHJlY2lzaW9uID0gTV9QSTsKLSAgb29lLnNvbWVfY2hhcmFjdGVycyAgPSAiRGVidWcgVEhJUyEiOwotICBvb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQ3XG5cYVx0IjsKLQotICAvL2NvdXQgPDwgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKG9vZSkgPDwgZW5kbCA8PCBlbmRsOwotCi0KLSAgTmVzdGluZyBuOwotICBuLm15X29vZSA9IG9vZTsKLSAgbi5teV9vb2UuaW50ZWdlcjE2ID0gMTY7Ci0gIG4ubXlfb29lLmludGVnZXIzMiA9IDMyOwotICBuLm15X29vZS5pbnRlZ2VyNjQgPSA2NDsKLSAgbi5teV9vb2UuZG91YmxlX3ByZWNpc2lvbiA9IChzdGQ6OnNxcnQoNSkrMSkvMjsKLSAgbi5teV9vb2Uuc29tZV9jaGFyYWN0ZXJzICA9ICI6UiAobWUgZ29pbmcgXCJycnJyXCIpIjsKLSAgbi5teV9vb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQzXHg4MFx4ZTJceDg1XHhhZVx4Y2VceDlkXHgyMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGQwXHg5ZFx4Y2VceGJmXHhlMlx4ODVceGJmXHhkMFx4YmVceGM5XHhhMVx4ZDBceGIzXHhkMFx4YjBceGNmXHg4MVx4ZTJceDg0XHg4ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDIwXHhjZVx4OTFceDc0XHg3NFx4Y2VceGIxXHhlMlx4ODVceGJkXHhjZVx4YmFceGM3XHg4M1x4ZTJceDgwXHhiYyI7Ci0gIG4ubXlfYm9uay50eXBlICAgID0gMzEzMzc7Ci0gIG4ubXlfYm9uay5tZXNzYWdlID0gIkkgYW0gYSBib25rLi4uIHhvciEiOwotCi0gIC8vY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcobikgPDwgZW5kbCA8PCBlbmRsOwotCi0KLSAgSG9seU1vbGV5IGhtOwotCi0gIGhtLmJpZy5wdXNoX2JhY2sob29lKTsKLSAgaG0uYmlnLnB1c2hfYmFjayhuLm15X29vZSk7Ci0gIGhtLmJpZ1swXS5hX2JpdGUgPSAweDIyOwotICBobS5iaWdbMV0uYV9iaXRlID0gMHgzMzsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RhZ2UxOwotICBzdGFnZTEucHVzaF9iYWNrKCJhbmQgYSBvbmUiKTsKLSAgc3RhZ2UxLnB1c2hfYmFjaygiYW5kIGEgdHdvIik7Ci0gIGhtLmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7Ci0gIHN0YWdlMS5jbGVhcigpOwotICBzdGFnZTEucHVzaF9iYWNrKCJ0aGVuIGEgb25lLCB0d28iKTsKLSAgc3RhZ2UxLnB1c2hfYmFjaygidGhyZWUhIik7Ci0gIHN0YWdlMS5wdXNoX2JhY2soIkZPVVIhISIpOwotICBobS5jb250YWluLmluc2VydChzdGFnZTEpOwotICBzdGFnZTEuY2xlYXIoKTsKLSAgaG0uY29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKLQotICBzdGQ6OnZlY3RvcjxCb25rPiBzdGFnZTI7Ci0gIGhtLmJvbmtzWyJub3RoaW5nIl0gPSBzdGFnZTI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKLSAgc3RhZ2UyLmJhY2soKS50eXBlID0gMTsKLSAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldhaXQuIjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOwotICBzdGFnZTIuYmFjaygpLnR5cGUgPSAyOwotICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAiV2hhdD8iOwotICBobS5ib25rc1sic29tZXRoaW5nIl0gPSBzdGFnZTI7Ci0gIHN0YWdlMi5jbGVhcigpOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7Ci0gIHN0YWdlMi5iYWNrKCkudHlwZSA9IDM7Ci0gIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJxdW90aCI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKLSAgc3RhZ2UyLmJhY2soKS50eXBlID0gNDsKLSAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gInRoZSByYXZlbiI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKLSAgc3RhZ2UyLmJhY2soKS50eXBlID0gNTsKLSAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIm5ldmVybW9yZSI7Ci0gIGhtLmJvbmtzWyJwb2UiXSA9IHN0YWdlMjsKLQotICAvL2NvdXQgPDwgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKGhtKSA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0gIHNoYXJlZF9wdHI8VERlbnNlUHJvdG9jb2w+IHByb3RvKG5ldyBURGVuc2VQcm90b2NvbChidWZmZXIpKTsKLSAgcHJvdG8tPnNldFR5cGVTcGVjKEhvbHlNb2xleTo6bG9jYWxfcmVmbGVjdGlvbik7Ci0KLSAgaG0ud3JpdGUocHJvdG8uZ2V0KCkpOwotICBIb2x5TW9sZXkgaG0yOwotICBobTIucmVhZChwcm90by5nZXQoKSk7Ci0KLSAgYXNzZXJ0KGhtID09IGhtMik7Ci0KLQotICAvLyBMZXQncyB0ZXN0IG91dCB0aGUgdmFyaWFibGUtbGVuZ3RoIGludHMsIHNoYWxsIHdlPwotICB1aW50NjRfdCB2bHE7Ci0gICNkZWZpbmUgY2hlY2tvdXQoaSwgYykgeyBcCi0gICAgYnVmZmVyLT5yZXNldEJ1ZmZlcigpOyBcCi0gICAgcHJvdG8tPnZscVdyaXRlKGkpOyBcCi0gICAgcHJvdG8tPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyBcCi0gICAgYXNzZXJ0KG15X21lbWVxKGJ1ZmZlci0+Z2V0QnVmZmVyQXNTdHJpbmcoKS5kYXRhKCksIGMsIHNpemVvZihjKS0xKSk7IFwKLSAgICBwcm90by0+dmxxUmVhZCh2bHEpOyBcCi0gICAgYXNzZXJ0KHZscSA9PSBpKTsgXAotICB9Ci0KLSAgY2hlY2tvdXQoMHgwMDAwMDAwMCwgIlx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDA0MCwgIlx4NDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDA3RiwgIlx4N0YiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDA4MCwgIlx4ODFceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDIwMDAsICJceEMwXHgwMCIpOwotICBjaGVja291dCgweDAwMDAzRkZGLCAiXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHgwMDAwNDAwMCwgIlx4ODFceDgwXHgwMCIpOwotICBjaGVja291dCgweDAwMTAwMDAwLCAiXHhDMFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAxRkZGRkYsICJceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHgwMDIwMDAwMCwgIlx4ODFceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwODAwMDAwMCwgIlx4QzBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwRkZGRkZGRiwgIlx4RkZceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHgxMDAwMDAwMCwgIlx4ODFceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MjAwMDAwMDAsICJceDgyXHg4MFx4ODBceDgwXHgwMCIpOwotICBjaGVja291dCgweDFGRkZGRkZGLCAiXHg4MVx4RkZceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHhGRkZGRkZGRiwgIlx4OEZceEZGXHhGRlx4RkZceDdGIik7Ci0KLSAgY2hlY2tvdXQoMHgwMDAwMDAwMTAwMDAwMDAwdWxsLCAiXHg5MFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwMjAwMDAwMDAwdWxsLCAiXHhBMFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwMzAwMDAwMDAwdWxsLCAiXHhCMFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwNzAwMDAwMDAwdWxsLCAiXHhGMFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwN0YwMDAwMDAwdWxsLCAiXHhGRlx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwN0ZGRkZGRkZGdWxsLCAiXHhGRlx4RkZceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwODAwMDAwMDAwdWxsLCAiXHg4MVx4ODBceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MUZGRkZGRkZGRkZGRkZGRnVsbCwgIlx4OUZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHg3RiIpOwotICBjaGVja291dCgweDdGRkZGRkZGRkZGRkZGRkZ1bGwsICJceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHhGRkZGRkZGRkZGRkZGRkZGdWxsLCAiXHg4MVx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHg3RiIpOwotCi0gIC8vIFRlc3Qgb3V0IHRoZSBzbG93IHBhdGggd2l0aCBhIFRCdWZmZXJlZFRyYW5zcG9ydC4KLSAgc2hhcmVkX3B0cjxUQnVmZmVyZWRUcmFuc3BvcnQ+IGJ1ZmZfdHJhbnMobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChidWZmZXIsIDMpKTsKLSAgcHJvdG8ucmVzZXQobmV3IFREZW5zZVByb3RvY29sKGJ1ZmZfdHJhbnMpKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwMTAwMDAwMDAwdWxsLCAiXHg5MFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwMjAwMDAwMDAwdWxsLCAiXHhBMFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwMzAwMDAwMDAwdWxsLCAiXHhCMFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwNzAwMDAwMDAwdWxsLCAiXHhGMFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwN0YwMDAwMDAwdWxsLCAiXHhGRlx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwN0ZGRkZGRkZGdWxsLCAiXHhGRlx4RkZceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwODAwMDAwMDAwdWxsLCAiXHg4MVx4ODBceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MUZGRkZGRkZGRkZGRkZGRnVsbCwgIlx4OUZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHg3RiIpOwotICBjaGVja291dCgweDdGRkZGRkZGRkZGRkZGRkZ1bGwsICJceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHhGRkZGRkZGRkZGRkZGRkZGdWxsLCAiXHg4MVx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHg3RiIpOwotCi0gIC8vIFRlc3Qgb3B0aW9uYWwgc3R1ZmYuCi0gIHByb3RvLnJlc2V0KG5ldyBURGVuc2VQcm90b2NvbChidWZmZXIpKTsKLSAgcHJvdG8tPnNldFR5cGVTcGVjKE1hbnlPcHQ6OmxvY2FsX3JlZmxlY3Rpb24pOwotICBNYW55T3B0IG1vMSwgbW8yLCBtbzMsIG1vNCwgbW81LCBtbzY7Ci0gIG1vMS5vcHQxID0gOTIzNzU5MzQ3OwotICBtbzEub3B0MiA9IDM5Mjc0OTI3NDsKLSAgbW8xLm9wdDMgPSAzOTU3Mzk0MDI7Ci0gIG1vMS5kZWY0ID0gMjk0NzMwOTI4OwotICBtbzEub3B0NSA9IDM5NDMwOTIxODsKLSAgbW8xLm9wdDYgPSA4MzIxOTQ3MjM7Ci0gIG1vMS5fX2lzc2V0Lm9wdDEgPSB0cnVlOwotICBtbzEuX19pc3NldC5vcHQyID0gdHJ1ZTsKLSAgbW8xLl9faXNzZXQub3B0MyA9IHRydWU7Ci0gIG1vMS5fX2lzc2V0LmRlZjQgPSB0cnVlOwotICBtbzEuX19pc3NldC5vcHQ1ID0gdHJ1ZTsKLSAgbW8xLl9faXNzZXQub3B0NiA9IHRydWU7Ci0KLSAgbW8xLndyaXRlKHByb3RvLmdldCgpKTsKLSAgbW8yLnJlYWQocHJvdG8uZ2V0KCkpOwotCi0gIGFzc2VydChtbzIuX19pc3NldC5vcHQxID09IHRydWUpOwotICBhc3NlcnQobW8yLl9faXNzZXQub3B0MiA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vMi5fX2lzc2V0Lm9wdDMgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzIuX19pc3NldC5kZWY0ID09IHRydWUpOwotICBhc3NlcnQobW8yLl9faXNzZXQub3B0NSA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vMi5fX2lzc2V0Lm9wdDYgPT0gdHJ1ZSk7Ci0KLSAgYXNzZXJ0KG1vMSA9PSBtbzIpOwotCi0gIG1vMS5fX2lzc2V0Lm9wdDEgPSBmYWxzZTsKLSAgbW8xLl9faXNzZXQub3B0MyA9IGZhbHNlOwotICBtbzEuX19pc3NldC5vcHQ1ID0gZmFsc2U7Ci0KLSAgbW8xLndyaXRlKHByb3RvLmdldCgpKTsKLSAgbW8zLnJlYWQocHJvdG8uZ2V0KCkpOwotCi0gIGFzc2VydChtbzMuX19pc3NldC5vcHQxID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vMy5fX2lzc2V0Lm9wdDIgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzMuX19pc3NldC5vcHQzID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vMy5fX2lzc2V0LmRlZjQgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzMuX19pc3NldC5vcHQ1ID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vMy5fX2lzc2V0Lm9wdDYgPT0gdHJ1ZSk7Ci0KLSAgYXNzZXJ0KG1vMSA9PSBtbzMpOwotCi0gIG1vMS5fX2lzc2V0Lm9wdDEgPSB0cnVlOwotICBtbzEuX19pc3NldC5vcHQzID0gdHJ1ZTsKLSAgbW8xLl9faXNzZXQub3B0NSA9IHRydWU7Ci0gIG1vMS5fX2lzc2V0Lm9wdDIgPSBmYWxzZTsKLSAgbW8xLl9faXNzZXQub3B0NiA9IGZhbHNlOwotCi0gIG1vMS53cml0ZShwcm90by5nZXQoKSk7Ci0gIG1vNC5yZWFkKHByb3RvLmdldCgpKTsKLQotICBhc3NlcnQobW80Ll9faXNzZXQub3B0MSA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vNC5fX2lzc2V0Lm9wdDIgPT0gZmFsc2UpOwotICBhc3NlcnQobW80Ll9faXNzZXQub3B0MyA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vNC5fX2lzc2V0LmRlZjQgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzQuX19pc3NldC5vcHQ1ID09IHRydWUpOwotICBhc3NlcnQobW80Ll9faXNzZXQub3B0NiA9PSBmYWxzZSk7Ci0KLSAgYXNzZXJ0KG1vMSA9PSBtbzQpOwotCi0gIG1vMS5fX2lzc2V0Lm9wdDEgPSBmYWxzZTsKLSAgbW8xLl9faXNzZXQub3B0NSA9IGZhbHNlOwotCi0gIG1vMS53cml0ZShwcm90by5nZXQoKSk7Ci0gIG1vNS5yZWFkKHByb3RvLmdldCgpKTsKLQotICBhc3NlcnQobW81Ll9faXNzZXQub3B0MSA9PSBmYWxzZSk7Ci0gIGFzc2VydChtbzUuX19pc3NldC5vcHQyID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vNS5fX2lzc2V0Lm9wdDMgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzUuX19pc3NldC5kZWY0ID09IHRydWUpOwotICBhc3NlcnQobW81Ll9faXNzZXQub3B0NSA9PSBmYWxzZSk7Ci0gIGFzc2VydChtbzUuX19pc3NldC5vcHQ2ID09IGZhbHNlKTsKLQotICBhc3NlcnQobW8xID09IG1vNSk7Ci0KLSAgbW8xLl9faXNzZXQub3B0MyA9IGZhbHNlOwotCi0gIG1vMS53cml0ZShwcm90by5nZXQoKSk7Ci0gIG1vNi5yZWFkKHByb3RvLmdldCgpKTsKLQotICBhc3NlcnQobW82Ll9faXNzZXQub3B0MSA9PSBmYWxzZSk7Ci0gIGFzc2VydChtbzYuX19pc3NldC5vcHQyID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vNi5fX2lzc2V0Lm9wdDMgPT0gZmFsc2UpOwotICBhc3NlcnQobW82Ll9faXNzZXQuZGVmNCA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vNi5fX2lzc2V0Lm9wdDUgPT0gZmFsc2UpOwotICBhc3NlcnQobW82Ll9faXNzZXQub3B0NiA9PSBmYWxzZSk7Ci0KLSAgYXNzZXJ0KG1vMSA9PSBtbzYpOwotCi0KLSAgLy8gVGVzdCBmaW5nZXJwcmludCBjaGVja2luZyBzdHVmZi4KLQotICB7Ci0gICAgLy8gRGVmYXVsdCBhbmQgcmVxdWlyZWQgaGF2ZSB0aGUgc2FtZSBmaW5nZXJwcmludC4KLSAgICBUcmlja3kxIHQxOwotICAgIFRyaWNreTMgdDM7Ci0gICAgYXNzZXJ0KHN0cmluZyhUcmlja3kxOjphc2NpaV9maW5nZXJwcmludCkgPT0gVHJpY2t5Mzo6YXNjaWlfZmluZ2VycHJpbnQpOwotICAgIHByb3RvLT5zZXRUeXBlU3BlYyhUcmlja3kxOjpsb2NhbF9yZWZsZWN0aW9uKTsKLSAgICB0MS5pbV9kZWZhdWx0ID0gMjI3OwotICAgIHQxLndyaXRlKHByb3RvLmdldCgpKTsKLSAgICBwcm90by0+c2V0VHlwZVNwZWMoVHJpY2t5Mzo6bG9jYWxfcmVmbGVjdGlvbik7Ci0gICAgdDMucmVhZChwcm90by5nZXQoKSk7Ci0gICAgYXNzZXJ0KHQzLmltX3JlcXVpcmVkID09IDIyNyk7Ci0gIH0KLQotICB7Ci0gICAgLy8gT3B0aW9uYWwgY2hhbmdlcyB0aGluZ3MuCi0gICAgVHJpY2t5MSB0MTsKLSAgICBUcmlja3kyIHQyOwotICAgIGFzc2VydChzdHJpbmcoVHJpY2t5MTo6YXNjaWlfZmluZ2VycHJpbnQpICE9IFRyaWNreTI6OmFzY2lpX2ZpbmdlcnByaW50KTsKLSAgICBwcm90by0+c2V0VHlwZVNwZWMoVHJpY2t5MTo6bG9jYWxfcmVmbGVjdGlvbik7Ci0gICAgdDEuaW1fZGVmYXVsdCA9IDIyNzsKLSAgICB0MS53cml0ZShwcm90by5nZXQoKSk7Ci0gICAgdHJ5IHsKLSAgICAgIHByb3RvLT5zZXRUeXBlU3BlYyhUcmlja3kyOjpsb2NhbF9yZWZsZWN0aW9uKTsKLSAgICAgIHQyLnJlYWQocHJvdG8uZ2V0KCkpOwotICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICB9IGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24mIGV4KSB7Ci0gICAgICBidWZmZXItPnJlc2V0QnVmZmVyKCk7Ci0gICAgfQotICB9Ci0KLSAgewotICAgIC8vIEhvbHkgY293LiAgV2UgY2FuIHVzZSB0aGUgVHJpY2t5MSB0eXBlc3BlYyB3aXRoIHRoZSBUcmlja3kyIHN0cnVjdHVyZS4KLSAgICBUcmlja3kxIHQxOwotICAgIFRyaWNreTIgdDI7Ci0gICAgcHJvdG8tPnNldFR5cGVTcGVjKFRyaWNreTE6OmxvY2FsX3JlZmxlY3Rpb24pOwotICAgIHQxLmltX2RlZmF1bHQgPSAyMjc7Ci0gICAgdDEud3JpdGUocHJvdG8uZ2V0KCkpOwotICAgIHQyLnJlYWQocHJvdG8uZ2V0KCkpOwotICAgIGFzc2VydCh0Mi5fX2lzc2V0LmltX29wdGlvbmFsID09IHRydWUpOwotICAgIGFzc2VydCh0Mi5pbV9vcHRpb25hbCA9PSAyMjcpOwotICB9Ci0KLSAgewotICAgIC8vIEFuZCB0b3RhbGx5IG9mZiB0aGUgd2FsbC4KLSAgICBUcmlja3kxIHQxOwotICAgIE9uZU9mRWFjaCBvb2UyOwotICAgIGFzc2VydChzdHJpbmcoVHJpY2t5MTo6YXNjaWlfZmluZ2VycHJpbnQpICE9IE9uZU9mRWFjaDo6YXNjaWlfZmluZ2VycHJpbnQpOwotICAgIHByb3RvLT5zZXRUeXBlU3BlYyhUcmlja3kxOjpsb2NhbF9yZWZsZWN0aW9uKTsKLSAgICB0MS5pbV9kZWZhdWx0ID0gMjI3OwotICAgIHQxLndyaXRlKHByb3RvLmdldCgpKTsKLSAgICB0cnkgewotICAgICAgcHJvdG8tPnNldFR5cGVTcGVjKE9uZU9mRWFjaDo6bG9jYWxfcmVmbGVjdGlvbik7Ci0gICAgICBvb2UyLnJlYWQocHJvdG8uZ2V0KCkpOwotICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICB9IGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24mIGV4KSB7Ci0gICAgICBidWZmZXItPnJlc2V0QnVmZmVyKCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gT2theSwgdGhpcyBpcyByZWFsbHkgb2ZmIHRoZSB3YWxsLgotICAvLyBKdXN0IGRvbid0IGNyYXNoLgotICBjb3V0IDw8ICJTdGFydGluZyBmdXp6IHRlc3QuICBUaGlzIHRha2VzIGEgd2hpbGUuICAoMjAgZG90cy4pIiA8PCBlbmRsOwotICBzdGQ6OnNyYW5kKDEyMzQ1KTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKLSAgICBpZiAoaSAlIDEwMCA9PSAwKSB7Ci0gICAgICBjb3V0IDw8ICIuIjsKLSAgICAgIGNvdXQuZmx1c2goKTsKLSAgICB9Ci0gICAgYnVmZmVyLT5yZXNldEJ1ZmZlcigpOwotICAgIC8vIE1ha2Ugc3VyZSB0aGUgZmluZ2VycHJpbnQgcHJlZml4IGlzIHJpZ2h0LgotICAgIGJ1ZmZlci0+d3JpdGUoTmVzdGluZzo6YmluYXJ5X2ZpbmdlcnByaW50LCA0KTsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwMjQqMTAyNDsgaisrKSB7Ci0gICAgICB1aW50OF90IHIgPSBzdGQ6OnJhbmQoKTsKLSAgICAgIGJ1ZmZlci0+d3JpdGUoJnIsIDEpOwotICAgIH0KLSAgICBOZXN0aW5nIG47Ci0gICAgcHJvdG8tPnNldFR5cGVTcGVjKE9uZU9mRWFjaDo6bG9jYWxfcmVmbGVjdGlvbik7Ci0gICAgdHJ5IHsKLSAgICAgIG4ucmVhZChwcm90by5nZXQoKSk7Ci0gICAgfSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uJiBleCkgewotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIGV4KSB7Ci0gICAgfQotICB9Ci0gIGNvdXQgPDwgZW5kbDsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9FbnVtVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvRW51bVRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MzViYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvRW51bVRlc3QuY3BwCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgRW51bVRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSAiZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5oIgorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IE15RW51bVdpdGhDdXN0b21Pc3RyZWFtOjp0eXBlJiB2YWwpCit7CisgIG9zIDw8ICJ7IiA8PCAoaW50KXZhbCA8PCAiOkNVU1RPTSEiIDw8ICJ9IjsKKyAgcmV0dXJuIG9zOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoRW51bVRlc3QpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZW51bV92YWx1ZSkgeworICAvLyBDaGVjayB0aGF0IGFsbCB0aGUgZW51bSB2YWx1ZXMgbWF0Y2ggd2hhdCB3ZSBleHBlY3QKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMTo6TUUxXzAsIDApOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0xOjpNRTFfMSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTE6Ok1FMV8yLCAyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMTo6TUUxXzMsIDMpOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0xOjpNRTFfNSwgNSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTE6Ok1FMV82LCA2KTsKKworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0yOjpNRTJfMCwgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTI6Ok1FMl8xLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMjo6TUUyXzIsIDIpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTM6Ok1FM18wLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMzo6TUUzXzEsIDEpOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0zOjpNRTNfTjIsIC0yKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMzo6TUUzX04xLCAtMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTM6Ok1FM19EMCwgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTM6Ok1FM19EMSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTM6Ok1FM185LCA5KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMzo6TUUzXzEwLCAxMCk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtNDo6TUU0X0EsIDB4N2ZmZmZmZmQpOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW00OjpNRTRfQiwgMHg3ZmZmZmZmZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTQ6Ok1FNF9DLCAweDdmZmZmZmZmKTsKKworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW01OjplMSwgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTU6OmUyLCA0Mik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVD4KK3N0ZDo6c3RyaW5nIEVudW1Ub1N0cmluZyhfVCBlKQoreworICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgc3MgPDwgZTsKKyAgcmV0dXJuIHNzLnN0cigpOworfQorCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZW51bV9vc3RyZWFtKQoreworICBCT09TVF9DSEVDS19FUVVBTChFbnVtVG9TdHJpbmcoTXlFbnVtMTo6TUUxXzApLCAiTUUxXzAiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRW51bVRvU3RyaW5nKE15RW51bTU6OmUyKSwgImUyIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEVudW1Ub1N0cmluZyhNeUVudW0zOjpNRTNfTjEpLCAiTUUzX04xIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEVudW1Ub1N0cmluZyhNeUVudW1XaXRoQ3VzdG9tT3N0cmVhbTo6Q3VzdG9NMiksICJ7MjpDVVNUT00hfSIpOworCisgIC8vIHNvbWUgaW52YWxpZCBvciB1bmtub3duIHZhbHVlCisgIE15RW51bTU6OnR5cGUgdXV0ID0gKE15RW51bTU6OnR5cGUpNDQ7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEVudW1Ub1N0cmluZyh1dXQpLCAiNDQiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9lbnVtX2NvbnN0YW50KQoreworICBNeVN0cnVjdCBtczsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobXMubWUyXzIsIDIpOworICBCT09TVF9DSEVDS19FUVVBTChtcy5tZTNfbjIsIC0yKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobXMubWUzX2QxLCAxKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvR2VuZXJpY0hlbHBlcnMuaCBiL2xpYi9jcHAvdGVzdC9HZW5lcmljSGVscGVycy5oCmluZGV4IGQ2NjFkOGIuLmJjZWY5ZjIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9HZW5lcmljSGVscGVycy5oCisrKyBiL2xpYi9jcHAvdGVzdC9HZW5lcmljSGVscGVycy5oCkBAIC0yMCw4MyArMjAsODggQEAKICNpZm5kZWYgX1RIUklGVF9URVNUX0dFTkVSSUNIRUxQRVJTX0hfCiAjZGVmaW5lIF9USFJJRlRfVEVTVF9HRU5FUklDSEVMUEVSU19IXyAxCiAKLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLSNpbmNsdWRlIDxUaHJpZnQuaD4KLQotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgogCiAvKiBDbGFzc05hbWUgSGVscGVyIGZvciBjbGVhbmVyIGV4Y2VwdGlvbnMgKi8KIGNsYXNzIENsYXNzTmFtZXMgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCkgeyByZXR1cm4gIlVua25vd24gdHlwZSI7IH0KKyAgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKSB7CisgICAgcmV0dXJuICJVbmtub3duIHR5cGUiOworICB9CiB9OwogCi10ZW1wbGF0ZSA8PiBjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPGludDhfdD4oKSB7IHJldHVybiAiYnl0ZSI7IH0KLXRlbXBsYXRlIDw+IGNvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8aW50MTZfdD4oKSB7IHJldHVybiAic2hvcnQiOyB9Ci10ZW1wbGF0ZSA8PiBjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPGludDMyX3Q+KCkgeyByZXR1cm4gImludCI7IH0KLXRlbXBsYXRlIDw+IGNvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8aW50NjRfdD4oKSB7IHJldHVybiAibG9uZyI7IH0KLXRlbXBsYXRlIDw+IGNvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8ZG91YmxlPigpIHsgcmV0dXJuICJkb3VibGUiOyB9Ci10ZW1wbGF0ZSA8PiBjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPHN0ZDo6c3RyaW5nPigpIHsgcmV0dXJuICJzdHJpbmciOyB9Cit0ZW1wbGF0ZSA8PgorY29uc3QgY2hhciogQ2xhc3NOYW1lczo6Z2V0TmFtZTxpbnQ4X3Q+KCkgeworICByZXR1cm4gImJ5dGUiOworfQordGVtcGxhdGUgPD4KK2NvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8aW50MTZfdD4oKSB7CisgIHJldHVybiAic2hvcnQiOworfQordGVtcGxhdGUgPD4KK2NvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8aW50MzJfdD4oKSB7CisgIHJldHVybiAiaW50IjsKK30KK3RlbXBsYXRlIDw+Citjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPGludDY0X3Q+KCkgeworICByZXR1cm4gImxvbmciOworfQordGVtcGxhdGUgPD4KK2NvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8ZG91YmxlPigpIHsKKyAgcmV0dXJuICJkb3VibGUiOworfQordGVtcGxhdGUgPD4KK2NvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8c3RkOjpzdHJpbmc+KCkgeworICByZXR1cm4gInN0cmluZyI7Cit9CiAKIC8qIEdlbmVyaWMgUHJvdG9jb2wgSS9PIGZ1bmN0aW9uIGZvciB0ZXN0cyAqLwogY2xhc3MgR2VuZXJpY0lPIHsKLSBwdWJsaWM6Ci0KK3B1YmxpYzoKICAgLyogV3JpdGUgZnVuY3Rpb25zICovCiAKLSAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50OF90JiB2YWwpIHsKKyAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDhfdCYgdmFsKSB7CiAgICAgcmV0dXJuIHByb3RvLT53cml0ZUJ5dGUodmFsKTsKICAgfQogCi0gIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDE2X3QmIHZhbCkgeworICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50MTZfdCYgdmFsKSB7CiAgICAgcmV0dXJuIHByb3RvLT53cml0ZUkxNih2YWwpOwogICB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50MzJfdCYgdmFsKSB7CisgIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBpbnQzMl90JiB2YWwpIHsKICAgICByZXR1cm4gcHJvdG8tPndyaXRlSTMyKHZhbCk7CiAgIH0KIAotICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBkb3VibGUmIHZhbCkgeworICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgY29uc3QgZG91YmxlJiB2YWwpIHsKICAgICByZXR1cm4gcHJvdG8tPndyaXRlRG91YmxlKHZhbCk7CiAgIH0KIAotICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBpbnQ2NF90JiB2YWwpIHsKKyAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDY0X3QmIHZhbCkgewogICAgIHJldHVybiBwcm90by0+d3JpdGVJNjQodmFsKTsKICAgfQogCi0gIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWwpIHsKKyAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWwpIHsKICAgICByZXR1cm4gcHJvdG8tPndyaXRlU3RyaW5nKHZhbCk7CiAgIH0KIAogICAvKiBSZWFkIGZ1bmN0aW9ucyAqLwogCi0gIHN0YXRpYyB1aW50MzJfdCByZWFkKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgaW50OF90JiB2YWwpIHsKLSAgICByZXR1cm4gcHJvdG8tPnJlYWRCeXRlKHZhbCk7Ci0gIH0KKyAgc3RhdGljIHVpbnQzMl90IHJlYWQoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgaW50OF90JiB2YWwpIHsgcmV0dXJuIHByb3RvLT5yZWFkQnl0ZSh2YWwpOyB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHJlYWQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBpbnQxNl90JiB2YWwpIHsKLSAgICByZXR1cm4gcHJvdG8tPnJlYWRJMTYodmFsKTsKLSAgfQorICBzdGF0aWMgdWludDMyX3QgcmVhZChzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBpbnQxNl90JiB2YWwpIHsgcmV0dXJuIHByb3RvLT5yZWFkSTE2KHZhbCk7IH0KIAotICBzdGF0aWMgdWludDMyX3QgcmVhZChzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGludDMyX3QmIHZhbCkgewotICAgIHJldHVybiBwcm90by0+cmVhZEkzMih2YWwpOwotICB9CisgIHN0YXRpYyB1aW50MzJfdCByZWFkKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGludDMyX3QmIHZhbCkgeyByZXR1cm4gcHJvdG8tPnJlYWRJMzIodmFsKTsgfQogCi0gIHN0YXRpYyB1aW50MzJfdCByZWFkKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgaW50NjRfdCYgdmFsKSB7Ci0gICAgcmV0dXJuIHByb3RvLT5yZWFkSTY0KHZhbCk7Ci0gIH0KKyAgc3RhdGljIHVpbnQzMl90IHJlYWQoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgaW50NjRfdCYgdmFsKSB7IHJldHVybiBwcm90by0+cmVhZEk2NCh2YWwpOyB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHJlYWQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBkb3VibGUmIHZhbCkgewotICAgIHJldHVybiBwcm90by0+cmVhZERvdWJsZSh2YWwpOwotICB9CisgIHN0YXRpYyB1aW50MzJfdCByZWFkKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGRvdWJsZSYgdmFsKSB7IHJldHVybiBwcm90by0+cmVhZERvdWJsZSh2YWwpOyB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHJlYWQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBzdGQ6OnN0cmluZyYgdmFsKSB7CisgIHN0YXRpYyB1aW50MzJfdCByZWFkKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIHN0ZDo6c3RyaW5nJiB2YWwpIHsKICAgICByZXR1cm4gcHJvdG8tPnJlYWRTdHJpbmcodmFsKTsKICAgfQotCiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9KU09OUHJvdG9UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9KU09OUHJvdG9UZXN0LmNwcAppbmRleCBhOTI2OGEyLi5jMmFkNzNlIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvSlNPTlByb3RvVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L0pTT05Qcm90b1Rlc3QuY3BwCkBAIC0xNywxMjggKzE3LDIyNyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGlvc3RyZWFtPgorI2RlZmluZSBfVVNFX01BVEhfREVGSU5FUwogI2luY2x1ZGUgPGNtYXRoPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogI2luY2x1ZGUgImdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCIKIAotaW50IG1haW4oKSB7Ci0gIHVzaW5nIHN0ZDo6Y291dDsKLSAgdXNpbmcgc3RkOjplbmRsOwotICB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OjpkZWJ1ZzsKLSAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKLSAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUSlNPTlByb3RvY29sOworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBKU09OUHJvdG9UZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgogCi0gIE9uZU9mRWFjaCBvb2U7Ci0gIG9vZS5pbV90cnVlICAgPSB0cnVlOwotICBvb2UuaW1fZmFsc2UgID0gZmFsc2U7Ci0gIG9vZS5hX2JpdGUgICAgPSAweDdmOwotICBvb2UuaW50ZWdlcjE2ID0gMjcwMDA7Ci0gIG9vZS5pbnRlZ2VyMzIgPSAxPDwyNDsKLSAgb29lLmludGVnZXI2NCA9ICh1aW50NjRfdCk2MDAwICogMTAwMCAqIDEwMDA7Ci0gIG9vZS5kb3VibGVfcHJlY2lzaW9uID0gTV9QSTsKLSAgb29lLnNvbWVfY2hhcmFjdGVycyAgPSAiSlNPTiBUSElTISBcIlwxIjsKLSAgb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkN1xuXGFcdCI7Ci0gIG9vZS5iYXNlNjQgPSAiXDFcMlwzXDI1NSI7Ci0gIGNvdXQgPDwgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdEpTT05TdHJpbmcob29lKSA8PCBlbmRsIDw8IGVuZGw7Cit1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OjpkZWJ1ZzsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRKU09OUHJvdG9jb2w7CiAKK3N0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8T25lT2ZFYWNoPiBvb2U7CiAKLSAgTmVzdGluZyBuOwotICBuLm15X29vZSA9IG9vZTsKLSAgbi5teV9vb2UuaW50ZWdlcjE2ID0gMTY7Ci0gIG4ubXlfb29lLmludGVnZXIzMiA9IDMyOwotICBuLm15X29vZS5pbnRlZ2VyNjQgPSA2NDsKLSAgbi5teV9vb2UuZG91YmxlX3ByZWNpc2lvbiA9IChzdGQ6OnNxcnQoNS4wKSsxKS8yOwotICBuLm15X29vZS5zb21lX2NoYXJhY3RlcnMgID0gIjpSIChtZSBnb2luZyBcInJycnJcIikiOwotICBuLm15X29vZS56b21nX3VuaWNvZGUgICAgID0gIlx4ZDNceDgwXHhlMlx4ODVceGFlXHhjZVx4OWRceDIwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZDBceDlkXHhjZVx4YmZceGUyXHg4NVx4YmZceGQwXHhiZVx4YzlceGExXHhkMFx4YjNceGQwXHhiMFx4Y2ZceDgxXHhlMlx4ODRceDhlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MjBceGNlXHg5MVx4NzRceDc0XHhjZVx4YjFceGUyXHg4NVx4YmRceGNlXHhiYVx4YzdceDgzXHhlMlx4ODBceGJjIjsKLSAgbi5teV9ib25rLnR5cGUgICAgPSAzMTMzNzsKLSAgbi5teV9ib25rLm1lc3NhZ2UgPSAiSSBhbSBhIGJvbmsuLi4geG9yISI7Cit2b2lkIHRlc3RDYXNlU2V0dXBfMSgpIHsKKyAgb29lLnJlc2V0KG5ldyBPbmVPZkVhY2gpOworICBvb2UtPmltX3RydWUgPSB0cnVlOworICBvb2UtPmltX2ZhbHNlID0gZmFsc2U7CisgIG9vZS0+YV9iaXRlID0gMHg3ZjsKKyAgb29lLT5pbnRlZ2VyMTYgPSAyNzAwMDsKKyAgb29lLT5pbnRlZ2VyMzIgPSAxIDw8IDI0OworICBvb2UtPmludGVnZXI2NCA9ICh1aW50NjRfdCk2MDAwICogMTAwMCAqIDEwMDA7CisgIG9vZS0+ZG91YmxlX3ByZWNpc2lvbiA9IE1fUEk7CisgIG9vZS0+c29tZV9jaGFyYWN0ZXJzID0gIkpTT04gVEhJUyEgXCJcMSI7CisgIG9vZS0+em9tZ191bmljb2RlID0gIlx4ZDdcblxhXHQiOworICBvb2UtPmJhc2U2NCA9ICJcMVwyXDNcMjU1IjsKK30KIAotICBjb3V0IDw8IGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnRKU09OU3RyaW5nKG4pIDw8IGVuZGwgPDwgZW5kbDsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b18xKSB7CisgIHRlc3RDYXNlU2V0dXBfMSgpOwogCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgIntcIjFcIjp7XCJ0ZlwiOjF9LFwiMlwiOntcInRmXCI6MH0sXCIzXCI6e1wiaThcIjoxMjd9LFwiNFwiOntcImkxNlwiOjI3MDAwfSwiCisgICJcIjVcIjp7XCJpMzJcIjoxNjc3NzIxNn0sXCI2XCI6e1wiaTY0XCI6NjAwMDAwMDAwMH0sXCI3XCI6e1wiZGJsXCI6My4xNDE1OTI2IgorICAiNTM1ODk3OTMxfSxcIjhcIjp7XCJzdHJcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIn0sXCI5XCI6e1wic3RyXCI6XCJceGQ3XFwiCisgICJuXFx1MDAwN1xcdFwifSxcIjEwXCI6e1widGZcIjowfSxcIjExXCI6e1wic3RyXCI6XCJBUUlEclFcIn0sXCIxMlwiOntcImxzdFwiIgorICAiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NCIKKyAgIlwiLDMsMSwyLDNdfX0iKTsKIAotICBIb2x5TW9sZXkgaG07CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0SlNPTlN0cmluZygqb29lKSk7CiAKLSAgaG0uYmlnLnB1c2hfYmFjayhvb2UpOwotICBobS5iaWcucHVzaF9iYWNrKG4ubXlfb29lKTsKLSAgaG0uYmlnWzBdLmFfYml0ZSA9IDB4MjI7Ci0gIGhtLmJpZ1sxXS5hX2JpdGUgPSAweDMzOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KKworc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxOZXN0aW5nPiBuOworCit2b2lkIHRlc3RDYXNlU2V0dXBfMigpIHsKKyAgdGVzdENhc2VTZXR1cF8xKCk7CisKKyAgbi5yZXNldChuZXcgTmVzdGluZyk7CisgIG4tPm15X29vZSA9ICpvb2U7CisgIG4tPm15X29vZS5pbnRlZ2VyMTYgPSAxNjsKKyAgbi0+bXlfb29lLmludGVnZXIzMiA9IDMyOworICBuLT5teV9vb2UuaW50ZWdlcjY0ID0gNjQ7CisgIG4tPm15X29vZS5kb3VibGVfcHJlY2lzaW9uID0gKHN0ZDo6c3FydCg1LjApICsgMSkgLyAyOworICBuLT5teV9vb2Uuc29tZV9jaGFyYWN0ZXJzID0gIjpSIChtZSBnb2luZyBcInJycnJcIikiOworICBuLT5teV9vb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQzXHg4MFx4ZTJceDg1XHhhZVx4Y2VceDlkXHgyMFx4ZDBceDlkXHhjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhiZlx4ZTJceDg1XHhiZlx4ZDBceGJlXHhjOVx4YTFceGQwXHhiM1x4ZDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4YjBceGNmXHg4MVx4ZTJceDg0XHg4ZVx4MjBceGNlXHg5MVx4NzRceDc0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGNlXHhiMVx4ZTJceDg1XHhiZFx4Y2VceGJhXHhjN1x4ODNceGUyXHg4MCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhiYyI7CisgIG4tPm15X2JvbmsudHlwZSA9IDMxMzM3OworICBuLT5teV9ib25rLm1lc3NhZ2UgPSAiSSBhbSBhIGJvbmsuLi4geG9yISI7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b18yKSB7CisgIHRlc3RDYXNlU2V0dXBfMigpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAie1wiMVwiOntcInJlY1wiOntcIjFcIjp7XCJpMzJcIjozMTMzN30sXCIyXCI6e1wic3RyXCI6XCJJIGFtIGEgYm9uay4uLiB4b3IiCisgICAgIiFcIn19fSxcIjJcIjp7XCJyZWNcIjp7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LFwiM1wiOntcImk4XCI6MTI3IgorICAgICJ9LFwiNFwiOntcImkxNlwiOjE2fSxcIjVcIjp7XCJpMzJcIjozMn0sXCI2XCI6e1wiaTY0XCI6NjR9LFwiN1wiOntcImRibFwiOiIKKyAgICAiMS42MTgwMzM5ODg3NDk4OTQ5fSxcIjhcIjp7XCJzdHJcIjpcIjpSIChtZSBnb2luZyBcXFwicnJyclxcXCIpXCJ9LFwiOVwiOnsiCisgICAgIlwic3RyXCI6XCLTgOKFrs6dINCdzr/ihb/Qvsmh0LPQsM+B4oSOIM6RdHTOseKFvc66x4PigLxcIn0sXCIxMFwiOntcInRmXCI6MH0sXCIxMVwiOntcInN0clwiOlwiIgorICAgICJBUUlEclFcIn0sXCIxMlwiOntcImxzdFwiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiIKKyAgICAiLDNdfSxcIjE0XCI6e1wibHN0XCI6W1wiaTY0XCIsMywxLDIsM119fX19IgorICApOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0SlNPTlN0cmluZygqbikpOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQorCitzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEhvbHlNb2xleT4gaG07CisKK3ZvaWQgdGVzdENhc2VTZXR1cF8zKCkgeworICB0ZXN0Q2FzZVNldHVwXzIoKTsKKworICBobS5yZXNldChuZXcgSG9seU1vbGV5KTsKKworICBobS0+YmlnLnB1c2hfYmFjaygqb29lKTsKKyAgaG0tPmJpZy5wdXNoX2JhY2sobi0+bXlfb29lKTsKKyAgaG0tPmJpZ1swXS5hX2JpdGUgPSAweDIyOworICBobS0+YmlnWzFdLmFfYml0ZSA9IDB4MzM7CiAKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0YWdlMTsKICAgc3RhZ2UxLnB1c2hfYmFjaygiYW5kIGEgb25lIik7CiAgIHN0YWdlMS5wdXNoX2JhY2soImFuZCBhIHR3byIpOwotICBobS5jb250YWluLmluc2VydChzdGFnZTEpOworICBobS0+Y29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKICAgc3RhZ2UxLmNsZWFyKCk7CiAgIHN0YWdlMS5wdXNoX2JhY2soInRoZW4gYSBvbmUsIHR3byIpOwogICBzdGFnZTEucHVzaF9iYWNrKCJ0aHJlZSEiKTsKICAgc3RhZ2UxLnB1c2hfYmFjaygiRk9VUiEhIik7Ci0gIGhtLmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7CisgIGhtLT5jb250YWluLmluc2VydChzdGFnZTEpOwogICBzdGFnZTEuY2xlYXIoKTsKLSAgaG0uY29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKKyAgaG0tPmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7CiAKICAgc3RkOjp2ZWN0b3I8Qm9uaz4gc3RhZ2UyOwotICBobS5ib25rc1sibm90aGluZyJdID0gc3RhZ2UyOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7CisgIGhtLT5ib25rc1sibm90aGluZyJdID0gc3RhZ2UyOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKICAgc3RhZ2UyLmJhY2soKS50eXBlID0gMTsKICAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldhaXQuIjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKICAgc3RhZ2UyLmJhY2soKS50eXBlID0gMjsKICAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldoYXQ/IjsKLSAgaG0uYm9ua3NbInNvbWV0aGluZyJdID0gc3RhZ2UyOworICBobS0+Ym9ua3NbInNvbWV0aGluZyJdID0gc3RhZ2UyOwogICBzdGFnZTIuY2xlYXIoKTsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKICAgc3RhZ2UyLmJhY2soKS50eXBlID0gMzsKICAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gInF1b3RoIjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKICAgc3RhZ2UyLmJhY2soKS50eXBlID0gNDsKICAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gInRoZSByYXZlbiI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDU7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJuZXZlcm1vcmUiOwotICBobS5ib25rc1sicG9lIl0gPSBzdGFnZTI7CisgIGhtLT5ib25rc1sicG9lIl0gPSBzdGFnZTI7Cit9CiAKLSAgY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0SlNPTlN0cmluZyhobSkgPDwgZW5kbCA8PCBlbmRsOworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3Byb3RvXzMpIHsKKyAgdGVzdENhc2VTZXR1cF8zKCk7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAie1wiMVwiOntcImxzdFwiOltcInJlY1wiLDIse1wiMVwiOntcInRmXCI6MX0sXCIyXCI6e1widGZcIjowfSxcIjNcIjp7XCJpOFwiOiIKKyAgIjM0fSxcIjRcIjp7XCJpMTZcIjoyNzAwMH0sXCI1XCI6e1wiaTMyXCI6MTY3NzcyMTZ9LFwiNlwiOntcImk2NFwiOjYwMDAwMDAwMDAiCisgICJ9LFwiN1wiOntcImRibFwiOjMuMTQxNTkyNjUzNTg5NzkzMX0sXCI4XCI6e1wic3RyXCI6XCJKU09OIFRISVMhIFxcXCJcXHUwMDAxIgorICAiXCJ9LFwiOVwiOntcInN0clwiOlwiXHhkN1xcblxcdTAwMDdcXHRcIn0sXCIxMFwiOntcInRmXCI6MH0sXCIxMVwiOntcInN0clwiOiIKKyAgIlwiQVFJRHJRXCJ9LFwiMTJcIjp7XCJsc3RcIjpbXCJpOFwiLDMsMSwyLDNdfSxcIjEzXCI6e1wibHN0XCI6W1wiaTE2XCIsMywxLDIiCisgICIsM119LFwiMTRcIjp7XCJsc3RcIjpbXCJpNjRcIiwzLDEsMiwzXX19LHtcIjFcIjp7XCJ0ZlwiOjF9LFwiMlwiOntcInRmXCI6MH0sIgorICAiXCIzXCI6e1wiaThcIjo1MX0sXCI0XCI6e1wiaTE2XCI6MTZ9LFwiNVwiOntcImkzMlwiOjMyfSxcIjZcIjp7XCJpNjRcIjo2NH0sIgorICAiXCI3XCI6e1wiZGJsXCI6MS42MTgwMzM5ODg3NDk4OTQ5fSxcIjhcIjp7XCJzdHJcIjpcIjpSIChtZSBnb2luZyBcXFwicnJyclxcXCIiCisgICIpXCJ9LFwiOVwiOntcInN0clwiOlwi04Diha7OnSDQnc6/4oW/0L7JodCz0LDPgeKEjiDOkXR0zrHihb3OuseD4oC8XCJ9LFwiMTBcIjp7XCJ0ZlwiOjB9LFwiMTFcIjp7IgorICAiXCJzdHJcIjpcIkFRSURyUVwifSxcIjEyXCI6e1wibHN0XCI6W1wiaThcIiwzLDEsMiwzXX0sXCIxM1wiOntcImxzdFwiOltcImkxNiIKKyAgIlwiLDMsMSwyLDNdfSxcIjE0XCI6e1wibHN0XCI6W1wiaTY0XCIsMywxLDIsM119fV19LFwiMlwiOntcInNldFwiOltcImxzdFwiLDMiCisgICIsW1wic3RyXCIsMF0sW1wic3RyXCIsMixcImFuZCBhIG9uZVwiLFwiYW5kIGEgdHdvXCJdLFtcInN0clwiLDMsXCJ0aGVuIGEgb25lIgorICAiLCB0d29cIixcInRocmVlIVwiLFwiRk9VUiEhXCJdXX0sXCIzXCI6e1wibWFwXCI6W1wic3RyXCIsXCJsc3RcIiwzLHtcIm5vdGhpbiIKKyAgImdcIjpbXCJyZWNcIiwwXSxcInBvZVwiOltcInJlY1wiLDMse1wiMVwiOntcImkzMlwiOjN9LFwiMlwiOntcInN0clwiOlwicXVvdGgiCisgICJcIn19LHtcIjFcIjp7XCJpMzJcIjo0fSxcIjJcIjp7XCJzdHJcIjpcInRoZSByYXZlblwifX0se1wiMVwiOntcImkzMlwiOjV9LFwiIgorICAiMlwiOntcInN0clwiOlwibmV2ZXJtb3JlXCJ9fV0sXCJzb21ldGhpbmdcIjpbXCJyZWNcIiwyLHtcIjFcIjp7XCJpMzJcIjoxfSxcIiIKKyAgIjJcIjp7XCJzdHJcIjpcIldhaXQuXCJ9fSx7XCIxXCI6e1wiaTMyXCI6Mn0sXCIyXCI6e1wic3RyXCI6XCJXaGF0P1wifX1dfV19fSIKKyAgKTsKIAorICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdEpTT05TdHJpbmcoKmhtKSk7CiAKLSAgY291dCA8PCAiVGVzdGluZyBvb2UiIDw8IGVuZGw7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQogCi0gIG9vZS53cml0ZShwcm90by5nZXQoKSk7CitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2pzb25fcHJvdG9fNCkgeworICB0ZXN0Q2FzZVNldHVwXzEoKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzdGQ6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisKKyAgb29lLT53cml0ZShwcm90by5nZXQoKSk7CiAgIE9uZU9mRWFjaCBvb2UyOwogICBvb2UyLnJlYWQocHJvdG8uZ2V0KCkpOwogCi0gIGFzc2VydChvb2UgPT0gb29lMik7CisgIEJPT1NUX0NIRUNLKCpvb2UgPT0gb29lMik7Cit9CiAKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b181KSB7CisgIHRlc3RDYXNlU2V0dXBfMygpOwogCi0gIGNvdXQgPDwgIlRlc3RpbmcgaG0iIDw8IGVuZGw7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKIAotICBobS53cml0ZShwcm90by5nZXQoKSk7CisgIGhtLT53cml0ZShwcm90by5nZXQoKSk7CiAgIEhvbHlNb2xleSBobTI7CiAgIGhtMi5yZWFkKHByb3RvLmdldCgpKTsKIAotICBhc3NlcnQoaG0gPT0gaG0yKTsKKyAgQk9PU1RfQ0hFQ0soKmhtID09IGhtMik7CiAKICAgaG0yLmJpZ1swXS5hX2JpdGUgPSAweDAwOwogCi0gIGFzc2VydChobSAhPSBobTIpOworICBCT09TVF9DSEVDSygqaG0gIT0gaG0yKTsKK30KIAorQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3Byb3RvXzYpIHsKICAgRG91YmxlcyBkdWI7Ci0gIGR1Yi5uYW4gPSBIVUdFX1ZBTC9IVUdFX1ZBTDsKKyAgZHViLm5hbiA9IEhVR0VfVkFMIC8gSFVHRV9WQUw7CiAgIGR1Yi5pbmYgPSBIVUdFX1ZBTDsKICAgZHViLm5lZ2luZiA9IC1IVUdFX1ZBTDsKLSAgZHViLnJlcGVhdGluZyA9IDEwLjAvMy4wOworICBkdWIucmVwZWF0aW5nID0gMTAuMCAvIDMuMDsKICAgZHViLmJpZyA9IDFFKzMwNTsKLSAgZHViLnNtYWxsID0gMUUtMzA1OworICBkdWIudGlueSA9IDFFLTMwNTsKICAgZHViLnplcm8gPSAwLjA7CiAgIGR1Yi5uZWd6ZXJvID0gLTAuMDsKLSAgY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0SlNPTlN0cmluZyhkdWIpIDw8IGVuZGwgPDwgZW5kbDsKIAotICBjb3V0IDw8ICJUZXN0aW5nIGJhc2UiIDw8IGVuZGw7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgIntcIjFcIjp7XCJkYmxcIjpcIk5hTlwifSxcIjJcIjp7XCJkYmxcIjpcIkluZmluaXR5XCJ9LFwiM1wiOntcImRibFwiOlwiLUluZmkiCisgICJuaXR5XCJ9LFwiNFwiOntcImRibFwiOjMuMzMzMzMzMzMzMzMzMzMzNX0sXCI1XCI6e1wiZGJsXCI6OS45OTk5OTk5OTk5OTk5OTk0ZSsiCisgICIzMDR9LFwiNlwiOntcImRibFwiOjFlLTMwNX0sXCI3XCI6e1wiZGJsXCI6MH0sXCI4XCI6e1wiZGJsXCI6LTB9fSIKKyAgKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdEpTT05TdHJpbmcoZHViKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b183KSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKIAogICBCYXNlNjQgYmFzZTsKICAgYmFzZS5hID0gMTIzOwpAQCAtMTUzLDcgKzI1Miw5MiBAQAogICBCYXNlNjQgYmFzZTI7CiAgIGJhc2UyLnJlYWQocHJvdG8uZ2V0KCkpOwogCi0gIGFzc2VydChiYXNlID09IGJhc2UyKTsKKyAgQk9PU1RfQ0hFQ0soYmFzZSA9PSBiYXNlMik7Cit9CiAKLSAgcmV0dXJuIDA7CitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2pzb25fcHJvdG9fOCkgeworICBjb25zdCBjaGFyKiBqc29uX3N0cmluZyA9CisgICJ7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LFwiM1wiOntcImk4XCI6MTI3fSxcIjRcIjp7XCJpMTZcIjoyNzAwMH0sIgorICAiXCI1XCI6e1wiaTMyXCI6MTYuNzcyMTZ9LFwiNlwiOntcImk2NFwiOjYwMDAwMDAwMDB9LFwiN1wiOntcImRibFwiOjMuMTQxNTkyNiIKKyAgIjUzNTg5NzkzMX0sXCI4XCI6e1wic3RyXCI6XCJKU09OIFRISVMhIFxcXCJcXHUwMDAxXCJ9LFwiOVwiOntcInN0clwiOlwiXHhkN1xcIgorICAiblxcdTAwMDdcXHRcIn0sXCIxMFwiOntcInRmXCI6MH0sXCIxMVwiOntcInN0clwiOlwiQVFJRHJRXCJ9LFwiMTJcIjp7XCJsc3RcIiIKKyAgIjpbXCJpOFwiLDMsMSwyLDNdfSxcIjEzXCI6e1wibHN0XCI6W1wiaTE2XCIsMywxLDIsM119LFwiMTRcIjp7XCJsc3RcIjpbXCJpNjQiCisgICJcIiwzLDEsMiwzXX19IjsKKworICBjb25zdCBzdGQ6OnNpemVfdCBidWZTaXogPSBzdHJsZW4oanNvbl9zdHJpbmcpICogc2l6ZW9mKGNoYXIpOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKAorICAgICh1aW50OF90KikoanNvbl9zdHJpbmcpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYnVmU2l6KSkpOworICBzdGQ6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisKKyAgT25lT2ZFYWNoIG9vZTI7CisKKyAgQk9PU1RfQ0hFQ0tfVEhST1cob29lMi5yZWFkKHByb3RvLmdldCgpKSwKKyAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEV4Y2VwdGlvbik7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyB0b0hleFNlcXVlbmNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6c2V0ZmlsbCgnMCcpOworICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgaSsrKSB7CisgICAgc3MgPDwgIlxceCIgPDwgaW50KHVpbnQ4X3Qoc3RyW2ldKSk7CisgIH0KKyAgcmV0dXJuIHNzLnN0cigpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2pzb25fdW5pY29kZV9lc2NhcGVkKSB7CisgIGNvbnN0IGNoYXIganNvbl9zdHJpbmdbXSA9CisgICJ7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LFwiM1wiOntcImk4XCI6MTI3fSxcIjRcIjp7XCJpMTZcIjoyNzAwMH0sIgorICAiXCI1XCI6e1wiaTMyXCI6MTZ9LFwiNlwiOntcImk2NFwiOjYwMDAwMDAwMDB9LFwiN1wiOntcImRibFwiOjMuMTQxNTkyNiIKKyAgIjUzNTg5NzkzMX0sXCI4XCI6e1wic3RyXCI6XCJKU09OIFRISVMhXCJ9LFwiOVwiOntcInN0clwiOlwiXFx1MGUwMSBcXHVkODM1XFx1ZGQzZVwifSwiCisgICJcIjEwXCI6e1widGZcIjowfSxcIjExXCI6e1wic3RyXCI6XCIwMDAwMDBcIn0sXCIxMlwiOntcImxzdFwiIgorICAiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NCIKKyAgIlwiLDMsMSwyLDNdfX0iOworICBjb25zdCBjaGFyKiBleHBlY3RlZF96b21nX3VuaWNvZGUgPSAiXHhlMFx4YjhceDgxIFx4ZjBceDlkXHg5NFx4YmUiOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoCisgICAgKHVpbnQ4X3QqKShqc29uX3N0cmluZyksIHNpemVvZihqc29uX3N0cmluZykpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRKU09OUHJvdG9jb2w+IHByb3RvKG5ldyBUSlNPTlByb3RvY29sKGJ1ZmZlcikpOworCisgIE9uZU9mRWFjaCBvb2UyOworICBvb2UyLnJlYWQocHJvdG8uZ2V0KCkpOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFvb2UyLnpvbWdfdW5pY29kZS5jb21wYXJlKGV4cGVjdGVkX3pvbWdfdW5pY29kZSksCisgICAgIkV4cGVjdGVkOlxuIiA8PCB0b0hleFNlcXVlbmNlKGV4cGVjdGVkX3pvbWdfdW5pY29kZSkgPDwgIlxuR290dGVuOlxuIgorICAgICAgICAgICAgICAgICAgPDwgdG9IZXhTZXF1ZW5jZShvb2UyLnpvbWdfdW5pY29kZSkpOworCit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl91bmljb2RlX2VzY2FwZWRfbWlzc2luZ19sb3dfc3Vycm9nYXRlKSB7CisgIGNvbnN0IGNoYXIganNvbl9zdHJpbmdbXSA9CisgICJ7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LFwiM1wiOntcImk4XCI6MTI3fSxcIjRcIjp7XCJpMTZcIjoyNzAwMH0sIgorICAiXCI1XCI6e1wiaTMyXCI6MTZ9LFwiNlwiOntcImk2NFwiOjYwMDAwMDAwMDB9LFwiN1wiOntcImRibFwiOjMuMTQxNTkyNiIKKyAgIjUzNTg5NzkzMX0sXCI4XCI6e1wic3RyXCI6XCJKU09OIFRISVMhXCJ9LFwiOVwiOntcInN0clwiOlwiXFx1ZDgzNVwifSwiCisgICJcIjEwXCI6e1widGZcIjowfSxcIjExXCI6e1wic3RyXCI6XCIwMDAwMDBcIn0sXCIxMlwiOntcImxzdFwiIgorICAiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NCIKKyAgIlwiLDMsMSwyLDNdfX0iOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoCisgICAgKHVpbnQ4X3QqKShqc29uX3N0cmluZyksIHNpemVvZihqc29uX3N0cmluZykpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRKU09OUHJvdG9jb2w+IHByb3RvKG5ldyBUSlNPTlByb3RvY29sKGJ1ZmZlcikpOworCisgIE9uZU9mRWFjaCBvb2UyOworICBCT09TVF9DSEVDS19USFJPVyhvb2UyLnJlYWQocHJvdG8uZ2V0KCkpLAorICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRXhjZXB0aW9uKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3VuaWNvZGVfZXNjYXBlZF9taXNzaW5nX2hpX3N1cnJvZ2F0ZSkgeworICBjb25zdCBjaGFyIGpzb25fc3RyaW5nW10gPQorICAie1wiMVwiOntcInRmXCI6MX0sXCIyXCI6e1widGZcIjowfSxcIjNcIjp7XCJpOFwiOjEyN30sXCI0XCI6e1wiaTE2XCI6MjcwMDB9LCIKKyAgIlwiNVwiOntcImkzMlwiOjE2fSxcIjZcIjp7XCJpNjRcIjo2MDAwMDAwMDAwfSxcIjdcIjp7XCJkYmxcIjozLjE0MTU5MjYiCisgICI1MzU4OTc5MzF9LFwiOFwiOntcInN0clwiOlwiSlNPTiBUSElTIVwifSxcIjlcIjp7XCJzdHJcIjpcIlxcdWRkM2VcIn0sIgorICAiXCIxMFwiOntcInRmXCI6MH0sXCIxMVwiOntcInN0clwiOlwiMDAwMDAwXCJ9LFwiMTJcIjp7XCJsc3RcIiIKKyAgIjpbXCJpOFwiLDMsMSwyLDNdfSxcIjEzXCI6e1wibHN0XCI6W1wiaTE2XCIsMywxLDIsM119LFwiMTRcIjp7XCJsc3RcIjpbXCJpNjQiCisgICJcIiwzLDEsMiwzXX19IjsKKworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKAorICAgICh1aW50OF90KikoanNvbl9zdHJpbmcpLCBzaXplb2YoanNvbl9zdHJpbmcpKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKKworICBPbmVPZkVhY2ggb29lMjsKKyAgQk9PU1RfQ0hFQ0tfVEhST1cob29lMi5yZWFkKHByb3RvLmdldCgpKSwKKyAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEV4Y2VwdGlvbik7CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0Kb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA2MzkxYTg3Li5kNjQ1YTY1Ci0tLSBhL2xpYi9jcHAvdGVzdC9NYWtlZmlsZS5hbQorKysgYi9saWIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTE2LDI1ICsxNiw2OSBAQAogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIworQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzIHNlcmlhbC10ZXN0cwogCi1ub2luc3RfTFRMSUJSQVJJRVMgPSBsaWJ0ZXN0Z2VuY3BwLmxhCitCVUlMVF9TT1VSQ0VTID0gZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5oIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmggXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvRW51bVRlc3RfdHlwZXMuaCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5oIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5oIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9UeXBlZGVmVGVzdF90eXBlcy5oIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL0NoaWxkU2VydmljZS5oIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL0VtcHR5U2VydmljZS5oIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCBcCisJCWdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5oIFwKKwkJZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmggXAorCQlnZW4tY3BwL09uZVdheVRlc3RfY29uc3RhbnRzLmggXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvcHJvY190eXBlcy5oCisKK25vaW5zdF9MVExJQlJBUklFUyA9IGxpYnRlc3RnZW5jcHAubGEgbGlicHJvY2Vzc29ydGVzdC5sYQogbm9kaXN0X2xpYnRlc3RnZW5jcHBfbGFfU09VUkNFUyA9IFwKKwlnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmNwcCBcCisJZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5oIFwKIAlnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmNwcCBcCi0JZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5jcHAgXAotCWdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuY3BwIFwKLQlnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIFwKIAlnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmggXAorCWdlbi1jcHAvRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuY3BwIFwKKwlnZW4tY3BwL0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLmggXAorCWdlbi1jcHAvRW51bVRlc3RfdHlwZXMuY3BwIFwKKwlnZW4tY3BwL0VudW1UZXN0X3R5cGVzLmggXAorCWdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuY3BwIFwKIAlnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmggXAorCWdlbi1jcHAvUmVjdXJzaXZlX3R5cGVzLmNwcCBcCisJZ2VuLWNwcC9SZWN1cnNpdmVfdHlwZXMuaCBcCisJZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBcCiAJZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmggXAorCWdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIFwKKwlnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmggXAorCWdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuY3BwIFwKKwlnZW4tY3BwL1R5cGVkZWZUZXN0X3R5cGVzLmggXAorCWdlbi1jcHAvT25lV2F5U2VydmljZS5jcHAgXAorCWdlbi1jcHAvT25lV2F5VGVzdF9jb25zdGFudHMuY3BwIFwKKwlnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuaCBcCisJZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmggXAorCWdlbi1jcHAvT25lV2F5VGVzdF9jb25zdGFudHMuaCBcCisJZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmNwcCBcCiAJVGhyaWZ0VGVzdF9leHRyYXMuY3BwIFwKIAlEZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwCiAKK25vZGlzdF9saWJwcm9jZXNzb3J0ZXN0X2xhX1NPVVJDRVMgPSBcCisJZ2VuLWNwcC9DaGlsZFNlcnZpY2UuY3BwIFwKKwlnZW4tY3BwL0NoaWxkU2VydmljZS5oIFwKKwlnZW4tY3BwL0VtcHR5U2VydmljZS5jcHAgXAorCWdlbi1jcHAvRW1wdHlTZXJ2aWNlLmggXAorCWdlbi1jcHAvUGFyZW50U2VydmljZS5jcHAgXAorCWdlbi1jcHAvUGFyZW50U2VydmljZS5oIFwKKwlnZW4tY3BwL3Byb2NfdHlwZXMuY3BwIFwKKwlnZW4tY3BwL3Byb2NfdHlwZXMuaAorCiBUaHJpZnRUZXN0X2V4dHJhcy5vOiBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaAogRGVidWdQcm90b1Rlc3RfZXh0cmFzLm86IGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaAogCiBsaWJ0ZXN0Z2VuY3BwX2xhX0xJQkFERCA9ICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQogCi1ub2luc3RfUFJPR1JBTVMgPSBCZW5jaG1hcmsKK25vaW5zdF9QUk9HUkFNUyA9IEJlbmNobWFyayBcCisJY29uY3VycmVuY3lfdGVzdAogCiBCZW5jaG1hcmtfU09VUkNFUyA9IFwKIAlCZW5jaG1hcmsuY3BwCkBAIC00MiwzNSArODYsOTcgQEAKIEJlbmNobWFya19MREFERCA9IGxpYnRlc3RnZW5jcHAubGEKIAogY2hlY2tfUFJPR1JBTVMgPSBcCisJVW5pdFRlc3RzIFwKIAlURkRUcmFuc3BvcnRUZXN0IFwKIAlUUGlwZWRUcmFuc3BvcnRUZXN0IFwKIAlEZWJ1Z1Byb3RvVGVzdCBcCiAJSlNPTlByb3RvVGVzdCBcCiAJT3B0aW9uYWxSZXF1aXJlZFRlc3QgXAorCVJlY3Vyc2l2ZVRlc3QgXAogCVNwZWNpYWxpemF0aW9uVGVzdCBcCiAJQWxsUHJvdG9jb2xzVGVzdCBcCiAJVHJhbnNwb3J0VGVzdCBcCisJVEludGVycnVwdFRlc3QgXAorCVRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QgXAorCVNlY3VyaXR5VGVzdCBcCiAJWmxpYlRlc3QgXAogCVRGaWxlVHJhbnNwb3J0VGVzdCBcCi0JVW5pdFRlc3RzCisJbGlua190ZXN0IFwKKwlPcGVuU1NMTWFudWFsSW5pdFRlc3QgXAorCUVudW1UZXN0IFwKKwlSZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QgXAorICAgICAgICBBbm5vdGF0aW9uVGVzdAorCitpZiBBTVhfSEFWRV9MSUJFVkVOVAorbm9pbnN0X1BST0dSQU1TICs9IFwKKwlwcm9jZXNzb3JfdGVzdAorY2hlY2tfUFJPR1JBTVMgKz0gXAorCVROb25ibG9ja2luZ1NlcnZlclRlc3QgXAorCVROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QKK2VuZGlmCiAKIFRFU1RTX0VOVklST05NRU5UPSBcCiAJQk9PU1RfVEVTVF9MT0dfU0lOSz10ZXN0cy54bWwgXAogCUJPT1NUX1RFU1RfTE9HX0xFVkVMPXRlc3Rfc3VpdGUgXAotCUJPT1NUX1RFU1RfTE9HX0ZPUk1BVD14bWwKKwlCT09TVF9URVNUX0xPR19GT1JNQVQ9WE1MCiAKIFRFU1RTID0gXAogCSQoY2hlY2tfUFJPR1JBTVMpCiAKIFVuaXRUZXN0c19TT1VSQ0VTID0gXAogCVVuaXRUZXN0TWFpbi5jcHAgXAorCU9uZVdheUhUVFBUZXN0LmNwcCBcCiAJVE1lbW9yeUJ1ZmZlclRlc3QuY3BwIFwKLQlUQnVmZmVyQmFzZVRlc3QuY3BwCisJVEJ1ZmZlckJhc2VUZXN0LmNwcCBcCisJQmFzZTY0VGVzdC5jcHAgXAorCVRvU3RyaW5nVGVzdC5jcHAgXAorCVR5cGVkZWZUZXN0LmNwcCBcCisJVFNlcnZlclNvY2tldFRlc3QuY3BwIFwKKwlUU2VydmVyVHJhbnNwb3J0VGVzdC5jcHAgXAorCVRUcmFuc3BvcnRDaGVja1Rocm93LmgKKworVW5pdFRlc3RzX1NPVVJDRVMgKz0gXAorICBjb25jdXJyZW5jeS9NdXRleFRlc3QuY3BwIFwKKyAgY29uY3VycmVuY3kvUldNdXRleFN0YXJ2ZVRlc3QuY3BwCiAKIFVuaXRUZXN0c19MREFERCA9IFwKLSAgJChCT09TVF9MREZMQUdTKSBcCiAgIGxpYnRlc3RnZW5jcHAubGEgXAotICAkKEJPT1NUX1JPT1RfUEFUSCkvbGliL2xpYmJvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsuYQorICAkKEJPT1NUX1RFU1RfTERBREQpIFwKKyAgJChCT09TVF9TWVNURU1fTERBREQpIFwKKyAgJChCT09TVF9USFJFQURfTERBREQpCisKK1RJbnRlcnJ1cHRUZXN0X1NPVVJDRVMgPSBcCisJVFNvY2tldEludGVycnVwdFRlc3QuY3BwIFwKKwlUU1NMU29ja2V0SW50ZXJydXB0VGVzdC5jcHAKKworVEludGVycnVwdFRlc3RfTERBREQgPSBcCisgIGxpYnRlc3RnZW5jcHAubGEgXAorICAkKEJPT1NUX1RFU1RfTERBREQpIFwKKyAgJChCT09TVF9GSUxFU1lTVEVNX0xEQUREKSBcCisgICQoQk9PU1RfQ0hST05PX0xEQUREKSBcCisgICQoQk9PU1RfU1lTVEVNX0xEQUREKSBcCisgICQoQk9PU1RfVEhSRUFEX0xEQUREKQorCitUU2VydmVySW50ZWdyYXRpb25UZXN0X1NPVVJDRVMgPSBcCisJVFNlcnZlckludGVncmF0aW9uVGVzdC5jcHAKKworVFNlcnZlckludGVncmF0aW9uVGVzdF9MREFERCA9IFwKKyAgbGlidGVzdGdlbmNwcC5sYSBcCisgIGxpYnByb2Nlc3NvcnRlc3QubGEgXAorICAkKEJPT1NUX1RFU1RfTERBREQpIFwKKyAgJChCT09TVF9TWVNURU1fTERBREQpIFwKKyAgJChCT09TVF9USFJFQURfTERBREQpCisKK1NlY3VyaXR5VGVzdF9TT1VSQ0VTID0gXAorCVNlY3VyaXR5VGVzdC5jcHAKKworU2VjdXJpdHlUZXN0X0xEQUREID0gXAorICBsaWJ0ZXN0Z2VuY3BwLmxhIFwKKyAgbGlicHJvY2Vzc29ydGVzdC5sYSBcCisgICQoQk9PU1RfVEVTVF9MREFERCkgXAorICAkKEJPT1NUX0ZJTEVTWVNURU1fTERBREQpIFwKKyAgJChCT09TVF9TWVNURU1fTERBREQpIFwKKyAgJChCT09TVF9USFJFQURfTERBREQpCiAKIFRyYW5zcG9ydFRlc3RfU09VUkNFUyA9IFwKIAlUcmFuc3BvcnRUZXN0LmNwcApAQCAtNzgsNyArMTg0LDcgQEAKIFRyYW5zcG9ydFRlc3RfTERBREQgPSBcCiAgIGxpYnRlc3RnZW5jcHAubGEgXAogICAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnR6LmxhIFwKLSAgJChCT09TVF9ST09UX1BBVEgpL2xpYi9saWJib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrLmEgXAorICAkKEJPT1NUX1RFU1RfTERBREQpIFwKICAgLWx6CiAKIFpsaWJUZXN0X1NPVVJDRVMgPSBcCkBAIC04NywxNSArMTkzLDMzIEBACiBabGliVGVzdF9MREFERCA9IFwKICAgbGlidGVzdGdlbmNwcC5sYSBcCiAgICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdHoubGEgXAotICAkKEJPT1NUX1JPT1RfUEFUSCkvbGliL2xpYmJvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsuYSBcCisgICQoQk9PU1RfVEVTVF9MREFERCkgXAogICAtbHoKIAorRW51bVRlc3RfU09VUkNFUyA9IFwKKwlFbnVtVGVzdC5jcHAKKworRW51bVRlc3RfTERBREQgPSBcCisgIGxpYnRlc3RnZW5jcHAubGEgXAorICAkKEJPT1NUX1RFU1RfTERBREQpCisKK1JlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdF9TT1VSQ0VTID0gUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0LmNwcAorCitSZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3RfTERBREQgPSBsaWJ0ZXN0Z2VuY3BwLmxhICQoQk9PU1RfVEVTVF9MREFERCkKKworQW5ub3RhdGlvblRlc3RfU09VUkNFUyA9IFwKKwlBbm5vdGF0aW9uVGVzdC5jcHAKKworQW5ub3RhdGlvblRlc3RfTERBREQgPSBcCisgIGxpYnRlc3RnZW5jcHAubGEgXAorICAkKEJPT1NUX1RFU1RfTERBREQpCisKIFRGaWxlVHJhbnNwb3J0VGVzdF9TT1VSQ0VTID0gXAogCVRGaWxlVHJhbnNwb3J0VGVzdC5jcHAKIAogVEZpbGVUcmFuc3BvcnRUZXN0X0xEQUREID0gXAogICBsaWJ0ZXN0Z2VuY3BwLmxhIFwKLSAgJChCT09TVF9ST09UX1BBVEgpL2xpYi9saWJib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrLmEKKyAgJChCT09TVF9URVNUX0xEQUREKQogCiAjCiAjIFRGRFRyYW5zcG9ydFRlc3QKQEAgLTEwMywxOCArMjI3LDI0IEBACiBURkRUcmFuc3BvcnRUZXN0X1NPVVJDRVMgPSBcCiAJVEZEVHJhbnNwb3J0VGVzdC5jcHAKIAotVEZEVHJhbnNwb3J0VGVzdF9MREFERCA9IFwKLQkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEKK1RGRFRyYW5zcG9ydFRlc3RfTERBREQgPSAgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYSBcCisJJChCT09TVF9URVNUX0xEQUREKQogCiAKICMKICMgVFBpcGVkVHJhbnNwb3J0VGVzdAogIwogVFBpcGVkVHJhbnNwb3J0VGVzdF9TT1VSQ0VTID0gXAotCVRQaXBlZFRyYW5zcG9ydFRlc3QuY3BwCisJVFBpcGVkVHJhbnNwb3J0VGVzdC5jcHAgXAorCVRQaXBlSW50ZXJydXB0VGVzdC5jcHAKIAogVFBpcGVkVHJhbnNwb3J0VGVzdF9MREFERCA9IFwKLQkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEKKwlsaWJ0ZXN0Z2VuY3BwLmxhIFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEgXAorCSQoQk9PU1RfVEVTVF9MREFERCkgXAorCSQoQk9PU1RfU1lTVEVNX0xEQUREKSBcCisJJChCT09TVF9USFJFQURfTERBREQpCiAKICMKICMgQWxsUHJvdG9jb2xzVGVzdApAQCAtMTI0LDcgKzI1NCw5IEBACiAJQWxsUHJvdG9jb2xUZXN0cy50Y2MgXAogCUdlbmVyaWNIZWxwZXJzLmgKIAotQWxsUHJvdG9jb2xzVGVzdF9MREFERCA9IGxpYnRlc3RnZW5jcHAubGEKK0FsbFByb3RvY29sc1Rlc3RfTERBREQgPSBcCisgIGxpYnRlc3RnZW5jcHAubGEgXAorICAkKEJPT1NUX1RFU1RfTERBREQpCiAKICMKICMgRGVidWdQcm90b1Rlc3QKQEAgLTEzMiw3ICsyNjQsOSBAQAogRGVidWdQcm90b1Rlc3RfU09VUkNFUyA9IFwKIAlEZWJ1Z1Byb3RvVGVzdC5jcHAKIAotRGVidWdQcm90b1Rlc3RfTERBREQgPSBsaWJ0ZXN0Z2VuY3BwLmxhCitEZWJ1Z1Byb3RvVGVzdF9MREFERCA9IFwKKwlsaWJ0ZXN0Z2VuY3BwLmxhIFwKKwkkKEJPT1NUX1RFU1RfTERBREQpCiAKIAogIwpAQCAtMTQxLDcgKzI3NSwzNiBAQAogSlNPTlByb3RvVGVzdF9TT1VSQ0VTID0gXAogCUpTT05Qcm90b1Rlc3QuY3BwCiAKLUpTT05Qcm90b1Rlc3RfTERBREQgPSBsaWJ0ZXN0Z2VuY3BwLmxhCitKU09OUHJvdG9UZXN0X0xEQUREID0gXAorCWxpYnRlc3RnZW5jcHAubGEgXAorCSQoQk9PU1RfVEVTVF9MREFERCkKKworIworIyBUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0CisjCitUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0X1NPVVJDRVMgPSBUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0LmNwcAorCitUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0X0xEQUREID0gbGlicHJvY2Vzc29ydGVzdC5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnRuYi5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9URVNUX0xEQUREKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9MREZMQUdTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChMSUJFVkVOVF9MSUJTKQorIworIyBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0CisjCitUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0X1NPVVJDRVMgPSBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0LmNwcAorCitUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0X0xEQUREID0gbGlicHJvY2Vzc29ydGVzdC5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnRuYi5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9URVNUX0xEQUREKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9MREZMQUdTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9GSUxFU1lTVEVNX0xEQUREKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9DSFJPTk9fTERBREQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX1NZU1RFTV9MREFERCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfVEhSRUFEX0xEQUREKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChMSUJFVkVOVF9MSUJTKQogCiAjCiAjIE9wdGlvbmFsUmVxdWlyZWRUZXN0CkBAIC0xNDksNyArMzEyLDE5IEBACiBPcHRpb25hbFJlcXVpcmVkVGVzdF9TT1VSQ0VTID0gXAogCU9wdGlvbmFsUmVxdWlyZWRUZXN0LmNwcAogCi1PcHRpb25hbFJlcXVpcmVkVGVzdF9MREFERCA9IGxpYnRlc3RnZW5jcHAubGEKK09wdGlvbmFsUmVxdWlyZWRUZXN0X0xEQUREID0gXAorCWxpYnRlc3RnZW5jcHAubGEgXAorCSQoQk9PU1RfVEVTVF9MREFERCkKKworIworIyBPcHRpb25hbFJlcXVpcmVkVGVzdAorIworUmVjdXJzaXZlVGVzdF9TT1VSQ0VTID0gXAorCVJlY3Vyc2l2ZVRlc3QuY3BwCisKK1JlY3Vyc2l2ZVRlc3RfTERBREQgPSBcCisJbGlidGVzdGdlbmNwcC5sYSBcCisJJChCT09TVF9URVNUX0xEQUREKQogCiAjCiAjIFNwZWNpYWxpemF0aW9uVGVzdApAQCAtMTU3LDM2ICszMzIsOTggQEAKIFNwZWNpYWxpemF0aW9uVGVzdF9TT1VSQ0VTID0gXAogCVNwZWNpYWxpemF0aW9uVGVzdC5jcHAKIAotU3BlY2lhbGl6YXRpb25UZXN0X0xEQUREID0gbGlidGVzdGdlbmNwcC5sYQorU3BlY2lhbGl6YXRpb25UZXN0X0xEQUREID0gXAorCWxpYnRlc3RnZW5jcHAubGEgXAorCSQoQk9PU1RfVEVTVF9MREFERCkKIAorY29uY3VycmVuY3lfdGVzdF9TT1VSQ0VTID0gXAorCWNvbmN1cnJlbmN5L1Rlc3RzLmNwcCBcCisJY29uY3VycmVuY3kvVGhyZWFkRmFjdG9yeVRlc3RzLmggXAorCWNvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXJUZXN0cy5oIFwKKwljb25jdXJyZW5jeS9UaW1lck1hbmFnZXJUZXN0cy5oCisKK2NvbmN1cnJlbmN5X3Rlc3RfTERBREQgPSBcCisgICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQorCitsaW5rX3Rlc3RfU09VUkNFUyA9IFwKKyAgbGluay9MaW5rVGVzdC5jcHAgXAorICBsaW5rL1RlbXBsYXRlZFNlcnZpY2UxLmNwcCBcCisgIGxpbmsvVGVtcGxhdGVkU2VydmljZTIuY3BwCisKK3Byb2Nlc3Nvcl90ZXN0X1NPVVJDRVMgPSBcCisJcHJvY2Vzc29yL1Byb2Nlc3NvclRlc3QuY3BwIFwKKwlwcm9jZXNzb3IvRXZlbnRMb2cuY3BwIFwKKwlwcm9jZXNzb3IvU2VydmVyVGhyZWFkLmNwcCBcCisJcHJvY2Vzc29yL0V2ZW50TG9nLmggXAorCXByb2Nlc3Nvci9IYW5kbGVycy5oIFwKKwlwcm9jZXNzb3IvU2VydmVyVGhyZWFkLmgKKworcHJvY2Vzc29yX3Rlc3RfTERBREQgPSBsaWJwcm9jZXNzb3J0ZXN0LmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0bmIubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX1RFU1RfTERBREQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9MREZMQUdTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICQoTElCRVZFTlRfTElCUykKKworT3BlblNTTE1hbnVhbEluaXRUZXN0X1NPVVJDRVMgPSBcCisJT3BlblNTTE1hbnVhbEluaXRUZXN0LmNwcAorCitPcGVuU1NMTWFudWFsSW5pdFRlc3RfTERBREQgPSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhIFwKKwkkKEJPT1NUX1RFU1RfTERBREQpIFwKKwkkKE9QRU5TU0xfTERGTEFHUykgXAorCSQoT1BFTlNTTF9MSUJTKQogCiAjCiAjIENvbW1vbiB0aHJpZnQgY29kZSBnZW5lcmF0aW9uIHJ1bGVzCiAjCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAogCi1nZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmNwcCBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmg6ICQodG9wX3NyY2RpcikvdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKLQkkKFRIUklGVCkgLS1nZW4gY3BwOmRlbnNlICQ8CitnZW4tY3BwL0Fubm90YXRpb25UZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF9jb25zdGFudHMuaCBnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmNwcCBnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmg6ICQodG9wX3NyY2RpcikvdGVzdC9Bbm5vdGF0aW9uVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CisKK2dlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuY3BwIGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCBnZW4tY3BwL0VtcHR5U2VydmljZS5jcHAgZ2VuLWNwcC9FbXB0eVNlcnZpY2UuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKKworZ2VuLWNwcC9Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CisKKworZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvRW51bVRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAorCitnZW4tY3BwL1R5cGVkZWZUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1R5cGVkZWZUZXN0X3R5cGVzLmg6ICQodG9wX3NyY2RpcikvdGVzdC9UeXBlZGVmVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CiAKIGdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdAotCSQoVEhSSUZUKSAtLWdlbiBjcHA6ZGVuc2UgJDwKKwkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CisKK2dlbi1jcHAvUmVjdXJzaXZlX3R5cGVzLmNwcCBnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvUmVjdXJzaXZlLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKIAogZ2VuLWNwcC9TZXJ2aWNlLmNwcCBnZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuY3BwOiAkKHRvcF9zcmNkaXIpL3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQKLQkkKFRIUklGVCkgLS1nZW4gY3BwOmRlbnNlICQ8CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAogCiBnZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ci0JJChUSFJJRlQpIC0tZ2VuIGNwcDpkZW5zZSAkPAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKIAotSU5DTFVERVMgPSBcCi0JLUkkKHRvcF9zcmNkaXIpL2xpYi9jcHAvc3JjCitnZW4tY3BwL09uZVdheVNlcnZpY2UuY3BwIGdlbi1jcHAvT25lV2F5VGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5oIGdlbi1jcHAvT25lV2F5U2VydmljZS5oIGdlbi1jcHAvT25lV2F5VGVzdF9jb25zdGFudHMuaCBnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuY3BwOiBPbmVXYXlUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKIAotQU1fQ1BQRkxBR1MgPSAkKEJPT1NUX0NQUEZMQUdTKQotQU1fQ1hYRkxBR1MgPSAtV2FsbAorZ2VuLWNwcC9DaGlsZFNlcnZpY2UuY3BwIGdlbi1jcHAvQ2hpbGRTZXJ2aWNlLmggZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmNwcCBnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCBnZW4tY3BwL3Byb2NfdHlwZXMuY3BwIGdlbi1jcHAvcHJvY190eXBlcy5oOiBwcm9jZXNzb3IvcHJvYy50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3BwOnRlbXBsYXRlcyxjb2Jfc3R5bGUgJDwKKworQU1fQ1BQRkxBR1MgPSAkKEJPT1NUX0NQUEZMQUdTKSAtSSQodG9wX3NyY2RpcikvbGliL2NwcC9zcmMgLURfX1NURENfRk9STUFUX01BQ1JPUyAtRF9fU1REQ19MSU1JVF9NQUNST1MgLUkuCitBTV9MREZMQUdTID0gJChCT09TVF9MREZMQUdTKQorQU1fQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYwogCiBjbGVhbi1sb2NhbDoKLQkkKFJNKSAtciBnZW4tY3BwCisJJChSTSkgZ2VuLWNwcC8qCiAKIEVYVFJBX0RJU1QgPSBcCi0JRGVuc2VQcm90b1Rlc3QuY3BwIFwKKwljb25jdXJyZW5jeSBcCisJcHJvY2Vzc29yIFwKKwlxdCBcCisJQ01ha2VMaXN0cy50eHQgXAorCURlYnVnUHJvdG9UZXN0X2V4dHJhcy5jcHAgXAogCVRocmlmdFRlc3RfZXh0cmFzLmNwcCBcCi0JRGVidWdQcm90b1Rlc3RfZXh0cmFzLmNwcAorCU9uZVdheVRlc3QudGhyaWZ0CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvT25lV2F5SFRUUFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L09uZVdheUhUVFBUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWZhMTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L09uZVdheUhUVFBUZXN0LmNwcApAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC9hdXRvX3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdGhyZWFkLmhwcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgImdlbi1jcHAvT25lV2F5U2VydmljZS5oIgorCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoT25lV2F5SFRUUFRlc3QpCisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRKU09OUHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRKU09OUHJvdG9jb2xGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFRocmVhZGVkU2VydmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUSHR0cFNlcnZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRIdHRwQ2xpZW50OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlcmVkVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OmNvdXQ7Cit1c2luZyBzdGQ6OmNlcnI7Cit1c2luZyBzdGQ6OmVuZGw7Cit1c2luZyBzdGQ6OnN0cmluZzsKK25hbWVzcGFjZSB1dGYgPSBib29zdDo6dW5pdF90ZXN0OworCisvLyBEZWZpbmUgdGhpcyBlbnYgdmFyIHRvIGVuYWJsZSBzb21lIGxvZ2dpbmcgKGluIGNhc2UgeW91IG5lZWQgdG8gZGVidWcpCisjdW5kZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisKK2NsYXNzIE9uZVdheVNlcnZpY2VIYW5kbGVyIDogcHVibGljIG9uZXdheXRlc3Q6Ok9uZVdheVNlcnZpY2VJZiB7CitwdWJsaWM6CisgIE9uZVdheVNlcnZpY2VIYW5kbGVyKCkge30KKworICB2b2lkIHJvdW5kVHJpcFJQQygpIG92ZXJyaWRlIHsKKyNpZmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKyAgICBjZXJyIDw8ICJyb3VuZFRyaXBSUEMoKSIgPDwgZW5kbDsKKyNlbmRpZgorICB9CisgIHZvaWQgb25lV2F5UlBDKCkgeworI2lmZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworICAgIGNlcnIgPDwgIm9uZVdheVJQQygpIiA8PCBzdGQ6OmVuZGwgOworI2VuZGlmCisgfQorfTsKKworY2xhc3MgT25lV2F5U2VydmljZUNsb25lRmFjdG9yeSA6IHZpcnR1YWwgcHVibGljIG9uZXdheXRlc3Q6Ok9uZVdheVNlcnZpY2VJZkZhY3RvcnkgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+T25lV2F5U2VydmljZUNsb25lRmFjdG9yeSgpIHt9CisgIHZpcnR1YWwgb25ld2F5dGVzdDo6T25lV2F5U2VydmljZUlmKiBnZXRIYW5kbGVyKGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OlRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pCisgIHsKKyAgICAodm9pZCljb25uSW5mbyA7CisgICAgcmV0dXJuIG5ldyBPbmVXYXlTZXJ2aWNlSGFuZGxlcjsKKyAgfQorICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUhhbmRsZXIoIG9uZXdheXRlc3Q6Ok9uZVdheVNlcnZpY2VJZiogaGFuZGxlcikgeworICAgIGRlbGV0ZSBoYW5kbGVyOworICB9Cit9OworCitjbGFzcyBSUEMwVGhyZWFkQ2xhc3MgeworcHVibGljOgorICBSUEMwVGhyZWFkQ2xhc3MoVFRocmVhZGVkU2VydmVyJiBzZXJ2ZXIpIDogc2VydmVyXyhzZXJ2ZXIpIHsgfSAvLyBDb25zdHJ1Y3RvcgorflJQQzBUaHJlYWRDbGFzcygpIHsgfSAvLyBEZXN0cnVjdG9yCisKK3ZvaWQgUnVuKCkgeworICBzZXJ2ZXJfLnNlcnZlKCkgOworfQorIFRUaHJlYWRlZFNlcnZlciYgc2VydmVyXyA7Cit9IDsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3luY2hyb25pemVkOworCisvLyBjb3BpZWQgZnJvbSBJbnRlZ3JhdGlvblRlc3QKK2NsYXNzIFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlciA6IHB1YmxpYyBUU2VydmVyRXZlbnRIYW5kbGVyLCBwdWJsaWMgTW9uaXRvciB7CitwdWJsaWM6CisgIFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcigpIDogaXNMaXN0ZW5pbmdfKGZhbHNlKSwgYWNjZXB0ZWRfKDApIHt9CisgIHZpcnR1YWwgflRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcigpIHt9CisgIHZpcnR1YWwgdm9pZCBwcmVTZXJ2ZSgpIHsKKyAgICBTeW5jaHJvbml6ZWQgc3luYygqdGhpcyk7CisgICAgaXNMaXN0ZW5pbmdfID0gdHJ1ZTsKKyAgICBub3RpZnkoKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQqIGNyZWF0ZUNvbnRleHQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCkgeworICAgIFN5bmNocm9uaXplZCBzeW5jKCp0aGlzKTsKKyAgICArK2FjY2VwdGVkXzsKKyAgICBub3RpZnkoKTsKKworICAgICh2b2lkKWlucHV0OworICAgICh2b2lkKW91dHB1dDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBib29sIGlzTGlzdGVuaW5nKCkgY29uc3QgeyByZXR1cm4gaXNMaXN0ZW5pbmdfOyB9CisgIHVpbnQ2NF90IGFjY2VwdGVkQ291bnQoKSBjb25zdCB7IHJldHVybiBhY2NlcHRlZF87IH0KKworcHJpdmF0ZToKKyAgYm9vbCBpc0xpc3RlbmluZ187CisgIHVpbnQ2NF90IGFjY2VwdGVkXzsKK307CisKK2NsYXNzIFRCbG9ja2FibGVCdWZmZXJlZFRyYW5zcG9ydCA6IHB1YmxpYyBUQnVmZmVyZWRUcmFuc3BvcnQgeworIHB1YmxpYzoKKyAgVEJsb2NrYWJsZUJ1ZmZlcmVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpCisgICAgOiBUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnNwb3J0LCAxMDI0MCksCisgICAgYmxvY2tlZF8oZmFsc2UpIHsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlX2J1ZmZlcl9sZW5ndGgoKSB7CisgICAgdWludDMyX3QgaGF2ZV9ieXRlcyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSB3QnVmXy5nZXQoKSk7CisgICAgcmV0dXJuIGhhdmVfYnl0ZXMgOworICB9CisKKyAgdm9pZCBibG9jaygpIHsKKyAgICBibG9ja2VkXyA9IHRydWUgOworI2lmZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworICAgIGNlcnIgPDwgImJsb2NrIGZsdXNoaW5nXG4iIDsKKyNlbmRpZgorIH0KKyAgdm9pZCB1bmJsb2NrKCkgeworICAgIGJsb2NrZWRfID0gZmFsc2UgOworI2lmZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworICAgIGNlcnIgPDwgInVuYmxvY2sgZmx1c2hpbmcsIGJ1ZmZlciBpc1xuPDwiIDw8IHN0ZDo6c3RyaW5nKChjaGFyICopd0J1Zl8uZ2V0KCksIHdyaXRlX2J1ZmZlcl9sZW5ndGgoKSkgPDwgIj4+XG4iIDsKKyNlbmRpZgorIH0KKworICB2b2lkIGZsdXNoKCkgb3ZlcnJpZGUgeworICAgIGlmIChibG9ja2VkXykgeworI2lmZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworICAgICAgY2VyciA8PCAiZmx1c2ggd2FzIGJsb2NrZWRcbiIgOworI2VuZGlmCisgICAgICByZXR1cm4gOworICAgIH0KKyAgICBUQnVmZmVyZWRUcmFuc3BvcnQ6OmZsdXNoKCkgOworICB9CisKKyAgYm9vbCBibG9ja2VkXyA7Cit9IDsKKworQk9PU1RfQVVUT19URVNUX0NBU0UoIEpTT05fQnVmZmVyZWRIVFRQICkKK3sKKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNzID0gc3RkOjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0PigwKSA7CisgIFRUaHJlYWRlZFNlcnZlciBzZXJ2ZXIoCisgICAgc3RkOjptYWtlX3NoYXJlZDxvbmV3YXl0ZXN0OjpPbmVXYXlTZXJ2aWNlUHJvY2Vzc29yRmFjdG9yeT4oc3RkOjptYWtlX3NoYXJlZDxPbmVXYXlTZXJ2aWNlQ2xvbmVGYWN0b3J5PigpKSwKKyAgICBzcywgLy9wb3J0CisgICAgc3RkOjptYWtlX3NoYXJlZDxUSHR0cFNlcnZlclRyYW5zcG9ydEZhY3Rvcnk+KCksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUSlNPTlByb3RvY29sRmFjdG9yeT4oKSk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcj4gcEV2ZW50SGFuZGxlcihuZXcgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKSA7CisgIHNlcnZlci5zZXRTZXJ2ZXJFdmVudEhhbmRsZXIocEV2ZW50SGFuZGxlcik7CisKKyNpZmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKyAgY2VyciA8PCAiU3RhcnRpbmcgdGhlIHNlcnZlci4uLlxuIjsKKyNlbmRpZgorICBSUEMwVGhyZWFkQ2xhc3MgdChzZXJ2ZXIpIDsKKyAgYm9vc3Q6OnRocmVhZCB0aHJlYWQoJlJQQzBUaHJlYWRDbGFzczo6UnVuLCAmdCk7CisKKyAgeworICAgIFN5bmNocm9uaXplZCBzeW5jKCoocEV2ZW50SGFuZGxlci5nZXQoKSkpOworICAgIHdoaWxlICghcEV2ZW50SGFuZGxlci0+aXNMaXN0ZW5pbmcoKSkgeworICAgICAgcEV2ZW50SGFuZGxlci0+d2FpdCgpOworICAgIH0KKyAgfQorCisgIGludCBwb3J0ID0gc3MtPmdldFBvcnQoKSA7CisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgIGNlcnIgPDwgInBvcnQgIiA8PCBwb3J0IDw8IGVuZGwgOworI2VuZGlmCisKKyAgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIHBvcnQpKTsKKyAgICBzb2NrZXQtPnNldFJlY3ZUaW1lb3V0KDEwMDAwKSA7IC8vIDEwMDBtc2VjIHNob3VsZCBiZSBlbm91Z2gKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VEJsb2NrYWJsZUJ1ZmZlcmVkVHJhbnNwb3J0PiBibG9ja2FibGVfdHJhbnNwb3J0KG5ldyBUQmxvY2thYmxlQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVEh0dHBDbGllbnQoYmxvY2thYmxlX3RyYW5zcG9ydCwgImxvY2FsaG9zdCIsICIvc2VydmljZSIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICBvbmV3YXl0ZXN0OjpPbmVXYXlTZXJ2aWNlQ2xpZW50IGNsaWVudChwcm90b2NvbCk7CisKKworICAgIHRyYW5zcG9ydC0+b3BlbigpOworICAgIGNsaWVudC5yb3VuZFRyaXBSUEMoKTsKKyAgICBibG9ja2FibGVfdHJhbnNwb3J0LT5ibG9jaygpIDsKKyAgICB1aW50MzJfdCBzaXplMCA9IGJsb2NrYWJsZV90cmFuc3BvcnQtPndyaXRlX2J1ZmZlcl9sZW5ndGgoKSA7CisgICAgY2xpZW50LnNlbmRfb25lV2F5UlBDKCkgOworICAgIHVpbnQzMl90IHNpemUxID0gYmxvY2thYmxlX3RyYW5zcG9ydC0+d3JpdGVfYnVmZmVyX2xlbmd0aCgpIDsKKyAgICBjbGllbnQuc2VuZF9vbmVXYXlSUEMoKSA7CisgICAgdWludDMyX3Qgc2l6ZTIgPSBibG9ja2FibGVfdHJhbnNwb3J0LT53cml0ZV9idWZmZXJfbGVuZ3RoKCkgOworICAgIEJPT1NUX0NIRUNLKChzaXplMSAtIHNpemUwKSA9PSAoc2l6ZTIgLSBzaXplMSkpIDsKKyAgICBibG9ja2FibGVfdHJhbnNwb3J0LT51bmJsb2NrKCkgOworICAgIGNsaWVudC5zZW5kX3JvdW5kVHJpcFJQQygpIDsKKyAgICBibG9ja2FibGVfdHJhbnNwb3J0LT5mbHVzaCgpIDsKKyAgICB0cnkgeworICAgICAgY2xpZW50LnJlY3Zfcm91bmRUcmlwUlBDKCkgOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgQk9PU1RfRVJST1IoICJ3ZSBzaG91bGQgbm90IGdldCBhIHRyYW5zcG9ydCBleGNlcHRpb24gLS0gdGhpcyBtZWFucyB3ZSBmYWlsZWQ6ICIgKyBzdGQ6OnN0cmluZyhlLndoYXQoKSkgKSA7CisgICAgfQorICAgIHRyYW5zcG9ydC0+Y2xvc2UoKTsKKyAgfQorICBzZXJ2ZXIuc3RvcCgpOworICB0aHJlYWQuam9pbigpIDsKKyNpZmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKyAgY2VyciA8PCAiZmluaXNoZWQuXG4iOworI2VuZGlmCit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L09uZVdheVRlc3QudGhyaWZ0IGIvbGliL2NwcC90ZXN0L09uZVdheVRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyN2U5ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvT25lV2F5VGVzdC50aHJpZnQKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworbmFtZXNwYWNlIGNfZ2xpYiBPbmVXYXlUZXN0CituYW1lc3BhY2UgamF2YSBvbmV3YXl0ZXN0CituYW1lc3BhY2UgY3BwIG9uZXdheXRlc3QKK25hbWVzcGFjZSByYiBPbmV3YXl0ZXN0CituYW1lc3BhY2UgcGVybCBPbmVXYXlUZXN0CituYW1lc3BhY2UgY3NoYXJwIE9uZXdheXRlc3QKK25hbWVzcGFjZSBqcyBPbmVXYXlUZXN0CituYW1lc3BhY2Ugc3QgT25lV2F5VGVzdAorbmFtZXNwYWNlIHB5IE9uZVdheVRlc3QKK25hbWVzcGFjZSBweS50d2lzdGVkIE9uZVdheVRlc3QKK25hbWVzcGFjZSBnbyBvbmV3YXl0ZXN0CituYW1lc3BhY2UgcGhwIE9uZVdheVRlc3QKK25hbWVzcGFjZSBkZWxwaGkgT25ld2F5dGVzdAorbmFtZXNwYWNlIGNvY29hIE9uZVdheVRlc3QKK25hbWVzcGFjZSBsdWEgT25lV2F5VGVzdAorbmFtZXNwYWNlIHhzZCB0ZXN0ICh1cmkgPSAnaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL25zL09uZVdheVRlc3QnKQorbmFtZXNwYWNlIG5ldGNvcmUgVGhyaWZ0QXN5bmMuT25lV2F5VGVzdAorCisvLyBhIG1pbmltYWwgVGhyaWZ0IHNlcnZpY2UsIGZvciB1c2UgaW4gT25lV2F5SFRUUFR0ZXN0LmNwcAorc2VydmljZSBPbmVXYXlTZXJ2aWNlIHsKKyAgdm9pZCByb3VuZFRyaXBSUEMoKSwKKyAgb25ld2F5IHZvaWQgb25lV2F5UlBDKCkKK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9PcGVuU1NMTWFudWFsSW5pdFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L09wZW5TU0xNYW51YWxJbml0VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMwYjMwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9PcGVuU1NMTWFudWFsSW5pdFRlc3QuY3BwCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8vIFRvIHNob3cgdGhhdCB0aGlzIHRlc3QgYWN0dWFsbHkgdGVzdHMgc29tZXRoaW5nLCB5b3UgY2FuIGNoYW5nZQorLy8gTUFOVUFMX09QRU5TU0xfSU5JVCB0byAwIHRvIGNhdXNlIGF1dG9tYXRpYyBPcGVuU1NMIGluaXQvY2xlYW51cCwKKy8vIHdoaWNoIHdpbGwgY2F1c2UgdGhlIHRlc3QgdG8gZmFpbAorI2RlZmluZSBNQU5VQUxfT1BFTlNTTF9JTklUIDEKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxXaW5Tb2NrMi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CisKK3ZvaWQgbWFrZV9pc29sYXRlZF9zc2xzb2NrZXRmYWN0b3J5KCkgeworICAvLyBIZXJlIHdlIGNyZWF0ZSBhbiBpc29sYXRlZCBUU1NMU29ja2V0RmFjdG9yeSB0byBlbnN1cmUgdGhlCisgIC8vIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIG9mIFRTU0xTb2NrZXRGYWN0b3J5IGdldCBydW4uICBUaHVzCisgIC8vIHdpdGhvdXQgbWFudWFsIGluaXRpYWxpemF0aW9uIG5vcm1hbGx5IE9wZW5TU0wgd291bGQgYmUKKyAgLy8gdW5pbml0aWFsaXplZCBhZnRlciB0aGlzIGZ1bmN0aW9uLgorICBUU1NMU29ja2V0RmFjdG9yeSBmYWN0b3J5OworfQorCit2b2lkIG9wZW5zc2xfaW5pdCgpIHsKKyNpZiBNQU5VQUxfT1BFTlNTTF9JTklUCisgIFRTU0xTb2NrZXRGYWN0b3J5OjpzZXRNYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb24odHJ1ZSk7CisgIGluaXRpYWxpemVPcGVuU1NMKCk7CisjZW5kaWYKK30KKwordm9pZCBvcGVuc3NsX2NsZWFudXAoKSB7CisjaWYgTUFOVUFMX09QRU5TU0xfSU5JVAorICBjbGVhbnVwT3BlblNTTCgpOworI2VuZGlmCit9CisKK3ZvaWQgdGVzdF9vcGVuc3NsX2F2YWlsYWJpbGl0eSgpIHsKKyAgLy8gQ2hlY2sgd2hldGhlciBUaHJpZnQgbGVhdmVzIE9wZW5TU0wgZnVuY3Rpb25hbGl0eSBhdmFpbGFibGUgYWZ0ZXIKKyAgLy8gdGhlIGxhc3QgVFNTTFNvY2tldEZhY3RvcnkgaXMgZGVzdHJveWVkIHdoZW4gbWFudWFsCisgIC8vIGluaXRpYWxpemF0aW9uIGlzIHNldAorICBvcGVuc3NsX2luaXQoKTsKKyAgbWFrZV9pc29sYXRlZF9zc2xzb2NrZXRmYWN0b3J5KCk7CisKKyAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpcyBvbmUgdGhhdCB3aWxsIGZhaWwgaWYgT3BlblNTTCBpcworICAvLyB1bmluaXRpYWxpemVkLiAgSXQgbWlnaHQgYWxzbyBmYWlsIG9uIHZlcnkgb2xkIHZlcnNpb25zIG9mCisgIC8vIE9wZW5TU0wuLi4KKyAgY29uc3QgRVZQX01EKiBtZCA9IEVWUF9nZXRfZGlnZXN0YnluYW1lKCJTSEEyNTYiKTsKKyAgQk9PU1RfQ0hFQ0sobWQgIT0gTlVMTCk7CisgIG9wZW5zc2xfY2xlYW51cCgpOworfQorCisjaWZkZWYgQk9PU1RfVEVTVF9EWU5fTElOSworYm9vbCBpbml0X3VuaXRfdGVzdF9zdWl0ZSgpIHsKKyAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUgPSAmYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpOworICBzdWl0ZS0+cF9uYW1lLnZhbHVlID0gIk9wZW5TU0xNYW51YWxJbml0IjsKKworICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSh0ZXN0X29wZW5zc2xfYXZhaWxhYmlsaXR5KSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisgCitpbnQgbWFpbiggaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSApIHsKKyAgcmV0dXJuIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6dW5pdF90ZXN0X21haW4oJmluaXRfdW5pdF90ZXN0X3N1aXRlLGFyZ2MsYXJndik7Cit9CisjZWxzZQorYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogaW5pdF91bml0X3Rlc3Rfc3VpdGUoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGFyZ2MpOworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGFyZ3YpOworICBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBzdWl0ZSA9ICZib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCk7CisgIHN1aXRlLT5wX25hbWUudmFsdWUgPSAiT3BlblNTTE1hbnVhbEluaXQiOworCisgIHN1aXRlLT5hZGQoQk9PU1RfVEVTVF9DQVNFKHRlc3Rfb3BlbnNzbF9hdmFpbGFiaWxpdHkpKTsKKworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwCmluZGV4IDc0NzI2MDMuLjRjNDM1NDYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LmNwcApAQCAtMjEsMjI2ICsyMSwzNjYgQEAKICAqIGRldGFpbHMuCiAgKi8KIAotI2luY2x1ZGUgPGNhc3NlcnQ+CiAjaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHByb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KICNpbmNsdWRlICJnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmgiCiAKLXVzaW5nIHN0ZDo6Y291dDsKLXVzaW5nIHN0ZDo6ZW5kbDsKLXVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpzdHJpbmc7CisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIE9wdGlvbmFsUmVxdWlyZWRUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCiB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogCi0KIC8qCiB0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJ1Y3Q+CiB2b2lkIHRyeXdyaXRlKGNvbnN0IFN0cnVjdCYgcywgYm9vbCBzaG91bGRfd29yaykgewogICBib29sIHdvcmtlZDsKICAgdHJ5IHsKLSAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRNZW1vcnlCdWZmZXIpKTsKKyAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUTWVtb3J5QnVmZmVyKSk7CiAgICAgcy53cml0ZSgmcHJvdG9jb2wpOwogICAgIHdvcmtlZCA9IHRydWU7CiAgIH0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiAmIGV4KSB7CiAgICAgd29ya2VkID0gZmFsc2U7CiAgIH0KLSAgYXNzZXJ0KHdvcmtlZCA9PSBzaG91bGRfd29yayk7CisgIEJPT1NUX0NIRUNLKHdvcmtlZCA9PSBzaG91bGRfd29yayk7CiB9CiAqLwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RydWN0MSwgdHlwZW5hbWUgU3RydWN0Mj4KLXZvaWQgd3JpdGVfdG9fcmVhZChjb25zdCBTdHJ1Y3QxICYgdywgU3RydWN0MiAmIHIpIHsKLSAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUTWVtb3J5QnVmZmVyKSk7Cit2b2lkIHdyaXRlX3RvX3JlYWQoY29uc3QgU3RydWN0MSYgdywgU3RydWN0MiYgcikgeworICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUTWVtb3J5QnVmZmVyKSk7CiAgIHcud3JpdGUoJnByb3RvY29sKTsKICAgci5yZWFkKCZwcm90b2NvbCk7CiB9CiAKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMSkgeworICBPbGRTY2hvb2wgbzsKIAotaW50IG1haW4oKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiT2xkU2Nob29sIHtcbiIKKyAgICAiICAwMTogaW1faW50IChpMTYpID0gMCxcbiIKKyAgICAiICAwMjogaW1fc3RyIChzdHJpbmcpID0gXCJcIixcbiIKKyAgICAiICAwMzogaW1fYmlnIChsaXN0KSA9IGxpc3Q8bWFwPlswXSB7XG4iCisgICAgIiAgfSxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKG8pKTsKIAotICBjb3V0IDw8ICJUaGlzIG9sZCBzY2hvb2wgc3RydWN0IHNob3VsZCBoYXZlIHRocmVlIGZpZWxkcy4iIDw8IGVuZGw7Ci0gIHsKLSAgICBPbGRTY2hvb2wgbzsKLSAgICBjb3V0IDw8IFRocmlmdERlYnVnU3RyaW5nKG8pIDw8IGVuZGw7Ci0gIH0KLSAgY291dCA8PCBlbmRsOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KIAotICBjb3V0IDw8ICJTZXR0aW5nIGEgdmFsdWUgYmVmb3JlIHNldHRpbmcgaXNzZXQuIiA8PCBlbmRsOwotICB7Ci0gICAgU2ltcGxlIHM7Ci0gICAgY291dCA8PCBUaHJpZnREZWJ1Z1N0cmluZyhzKSA8PCBlbmRsOwotICAgIHMuaW1fb3B0aW9uYWwgPSAxMDsKLSAgICBjb3V0IDw8IFRocmlmdERlYnVnU3RyaW5nKHMpIDw8IGVuZGw7Ci0gICAgcy5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKLSAgICBjb3V0IDw8IFRocmlmdERlYnVnU3RyaW5nKHMpIDw8IGVuZGw7Ci0gIH0KLSAgY291dCA8PCBlbmRsOworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF8yXzEpIHsKKyAgU2ltcGxlIHM7CiAKLSAgY291dCA8PCAiU2V0dGluZyBpc3NldCBiZWZvcmUgc2V0dGluZyBhIHZhbHVlLiIgPDwgZW5kbDsKLSAgewotICAgIFNpbXBsZSBzOwotICAgIGNvdXQgPDwgVGhyaWZ0RGVidWdTdHJpbmcocykgPDwgZW5kbDsKLSAgICBzLl9faXNzZXQuaW1fb3B0aW9uYWwgPSB0cnVlOwotICAgIGNvdXQgPDwgVGhyaWZ0RGVidWdTdHJpbmcocykgPDwgZW5kbDsKLSAgICBzLmltX29wdGlvbmFsID0gMTA7Ci0gICAgY291dCA8PCBUaHJpZnREZWJ1Z1N0cmluZyhzKSA8PCBlbmRsOwotICB9Ci0gIGNvdXQgPDwgZW5kbDsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJTaW1wbGUge1xuIgorICAgICIgIDAxOiBpbV9kZWZhdWx0IChpMTYpID0gMCxcbiIKKyAgICAiICAwMjogaW1fcmVxdWlyZWQgKGkxNikgPSAwLFxuIgorICAgICJ9Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcocykpOwogCisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzJfMikgeworICBTaW1wbGUgczsKKyAgcy5pbV9vcHRpb25hbCA9IDEwOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiU2ltcGxlIHtcbiIKKyAgICAiICAwMTogaW1fZGVmYXVsdCAoaTE2KSA9IDAsXG4iCisgICAgIiAgMDI6IGltX3JlcXVpcmVkIChpMTYpID0gMCxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKHMpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF8yXzMpIHsKKyAgU2ltcGxlIHM7CisgIHMuaW1fb3B0aW9uYWwgPSAxMDsKKyAgcy5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKKworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCisgICAgIlNpbXBsZSB7XG4iCisgICAgIiAgMDE6IGltX2RlZmF1bHQgKGkxNikgPSAwLFxuIgorICAgICIgIDAyOiBpbV9yZXF1aXJlZCAoaTE2KSA9IDAsXG4iCisgICAgIiAgMDM6IGltX29wdGlvbmFsIChpMTYpID0gMTAsXG4iCisgICAgIn0iKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhzKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMl80KSB7CisgIFNpbXBsZSBzOworICBzLl9faXNzZXQuaW1fb3B0aW9uYWwgPSB0cnVlOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiU2ltcGxlIHtcbiIKKyAgICAiICAwMTogaW1fZGVmYXVsdCAoaTE2KSA9IDAsXG4iCisgICAgIiAgMDI6IGltX3JlcXVpcmVkIChpMTYpID0gMCxcbiIKKyAgICAiICAwMzogaW1fb3B0aW9uYWwgKGkxNikgPSAwLFxuIgorICAgICJ9Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcocykpOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzJfNSkgeworICBTaW1wbGUgczsKKyAgcy5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKKyAgcy5pbV9vcHRpb25hbCA9IDEwOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiU2ltcGxlIHtcbiIKKyAgICAiICAwMTogaW1fZGVmYXVsdCAoaTE2KSA9IDAsXG4iCisgICAgIiAgMDI6IGltX3JlcXVpcmVkIChpMTYpID0gMCxcbiIKKyAgICAiICAwMzogaW1fb3B0aW9uYWwgKGkxNikgPSAxMCxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKHMpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF8zKSB7CisgIC8vIGFzc2lnbi9jb3B5LWNvbnN0cnVjdCB3aXRoIG5vbi1yZXF1aXJlZCBmaWVsZHMKKworICBTaW1wbGUgczEsIHMyOworICBzMS5fX2lzc2V0LmltX2RlZmF1bHQgPSB0cnVlOworICBzMS5fX3NldF9pbV9vcHRpb25hbCgxMCk7CisgIEJPT1NUX0NIRUNLKHMxLl9faXNzZXQuaW1fZGVmYXVsdCk7CisgIEJPT1NUX0NIRUNLKHMxLl9faXNzZXQuaW1fb3B0aW9uYWwpOworCisgIHMyID0gczE7CisKKyAgQk9PU1RfQ0hFQ0soczIuX19pc3NldC5pbV9kZWZhdWx0KTsKKyAgQk9PU1RfQ0hFQ0soczIuX19pc3NldC5pbV9vcHRpb25hbCk7CisKKyAgU2ltcGxlIHMzKHMxKTsKKworICBCT09TVF9DSEVDSyhzMy5fX2lzc2V0LmltX2RlZmF1bHQpOworICBCT09TVF9DSEVDSyhzMy5fX2lzc2V0LmltX29wdGlvbmFsKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF80KSB7CiAgIC8vIFdyaXRlLXRvLXJlYWQgd2l0aCBvcHRpb25hbCBmaWVsZHMuCi0gIHsKLSAgICBTaW1wbGUgczEsIHMyLCBzMzsKLSAgICBzMS5pbV9vcHRpb25hbCA9IDEwOwotICAgIGFzc2VydCghczEuX19pc3NldC5pbV9kZWZhdWx0KTsKLSAgLy9hc3NlcnQoIXMxLl9faXNzZXQuaW1fcmVxdWlyZWQpOyAgLy8gQ29tcGlsZSBlcnJvci4KLSAgICBhc3NlcnQoIXMxLl9faXNzZXQuaW1fb3B0aW9uYWwpOwogCi0gICAgd3JpdGVfdG9fcmVhZChzMSwgczIpOworICBTaW1wbGUgczEsIHMyLCBzMzsKKyAgczEuaW1fb3B0aW9uYWwgPSAxMDsKKyAgQk9PU1RfQ0hFQ0soIXMxLl9faXNzZXQuaW1fZGVmYXVsdCk7CisgIC8vIEJPT1NUX0NIRUNLKCFzMS5fX2lzc2V0LmltX3JlcXVpcmVkKTsgIC8vIENvbXBpbGUgZXJyb3IuCisgIEJPT1NUX0NIRUNLKCFzMS5fX2lzc2V0LmltX29wdGlvbmFsKTsKIAotICAgIGFzc2VydCggczIuX19pc3NldC5pbV9kZWZhdWx0KTsKLSAgLy9hc3NlcnQoIHMyLl9faXNzZXQuaW1fcmVxdWlyZWQpOyAgLy8gQ29tcGlsZSBlcnJvci4KLSAgICBhc3NlcnQoIXMyLl9faXNzZXQuaW1fb3B0aW9uYWwpOwotICAgIGFzc2VydChzMy5pbV9vcHRpb25hbCA9PSAwKTsKKyAgd3JpdGVfdG9fcmVhZChzMSwgczIpOwogCi0gICAgczEuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7Ci0gICAgd3JpdGVfdG9fcmVhZChzMSwgczMpOworICBCT09TVF9DSEVDSyhzMi5fX2lzc2V0LmltX2RlZmF1bHQpOworICAvLyBCT09TVF9DSEVDSyggczIuX19pc3NldC5pbV9yZXF1aXJlZCk7ICAvLyBDb21waWxlIGVycm9yLgorICBCT09TVF9DSEVDSyghczIuX19pc3NldC5pbV9vcHRpb25hbCk7CisgIEJPT1NUX0NIRUNLKHMzLmltX29wdGlvbmFsID09IDApOwogCi0gICAgYXNzZXJ0KCBzMy5fX2lzc2V0LmltX2RlZmF1bHQpOwotICAvL2Fzc2VydCggczMuX19pc3NldC5pbV9yZXF1aXJlZCk7ICAvLyBDb21waWxlIGVycm9yLgotICAgIGFzc2VydCggczMuX19pc3NldC5pbV9vcHRpb25hbCk7Ci0gICAgYXNzZXJ0KHMzLmltX29wdGlvbmFsID09IDEwKTsKLSAgfQorICBzMS5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKKyAgd3JpdGVfdG9fcmVhZChzMSwgczMpOwogCisgIEJPT1NUX0NIRUNLKHMzLl9faXNzZXQuaW1fZGVmYXVsdCk7CisgIC8vIEJPT1NUX0NIRUNLKCBzMy5fX2lzc2V0LmltX3JlcXVpcmVkKTsgIC8vIENvbXBpbGUgZXJyb3IuCisgIEJPT1NUX0NIRUNLKHMzLl9faXNzZXQuaW1fb3B0aW9uYWwpOworICBCT09TVF9DSEVDSyhzMy5pbV9vcHRpb25hbCA9PSAxMCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfNSkgewogICAvLyBXcml0aW5nIGJldHdlZW4gb3B0aW9uYWwgYW5kIGRlZmF1bHQuCi0gIHsKLSAgICBUcmlja3kxIHQxOwotICAgIFRyaWNreTIgdDI7CiAKLSAgICB0Mi5pbV9vcHRpb25hbCA9IDEwOwotICAgIHdyaXRlX3RvX3JlYWQodDIsIHQxKTsKLSAgICB3cml0ZV90b19yZWFkKHQxLCB0Mik7Ci0gICAgYXNzZXJ0KCF0MS5fX2lzc2V0LmltX2RlZmF1bHQpOwotICAgIGFzc2VydCggdDIuX19pc3NldC5pbV9vcHRpb25hbCk7Ci0gICAgYXNzZXJ0KHQxLmltX2RlZmF1bHQgPT0gdDIuaW1fb3B0aW9uYWwpOwotICAgIGFzc2VydCh0MS5pbV9kZWZhdWx0ID09IDApOwotICB9CisgIFRyaWNreTEgdDE7CisgIFRyaWNreTIgdDI7CiAKKyAgdDIuaW1fb3B0aW9uYWwgPSAxMDsKKyAgd3JpdGVfdG9fcmVhZCh0MiwgdDEpOworICB3cml0ZV90b19yZWFkKHQxLCB0Mik7CisgIEJPT1NUX0NIRUNLKCF0MS5fX2lzc2V0LmltX2RlZmF1bHQpOworICBCT09TVF9DSEVDSyh0Mi5fX2lzc2V0LmltX29wdGlvbmFsKTsKKyAgQk9PU1RfQ0hFQ0sodDEuaW1fZGVmYXVsdCA9PSB0Mi5pbV9vcHRpb25hbCk7CisgIEJPT1NUX0NIRUNLKHQxLmltX2RlZmF1bHQgPT0gMCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfNikgewogICAvLyBXcml0aW5nIGJldHdlZW4gZGVmYXVsdCBhbmQgcmVxdWlyZWQuCi0gIHsKLSAgICBUcmlja3kxIHQxOwotICAgIFRyaWNreTMgdDM7Ci0gICAgd3JpdGVfdG9fcmVhZCh0MSwgdDMpOwotICAgIHdyaXRlX3RvX3JlYWQodDMsIHQxKTsKLSAgICBhc3NlcnQodDEuX19pc3NldC5pbV9kZWZhdWx0KTsKLSAgfQogCisgIFRyaWNreTEgdDE7CisgIFRyaWNreTMgdDM7CisgIHdyaXRlX3RvX3JlYWQodDEsIHQzKTsKKyAgd3JpdGVfdG9fcmVhZCh0MywgdDEpOworICBCT09TVF9DSEVDSyh0MS5fX2lzc2V0LmltX2RlZmF1bHQpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzcpIHsKICAgLy8gV3JpdGluZyBiZXR3ZWVuIG9wdGlvbmFsIGFuZCByZXF1aXJlZC4KLSAgewotICAgIFRyaWNreTIgdDI7Ci0gICAgVHJpY2t5MyB0MzsKLSAgICB0Mi5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKLSAgICB3cml0ZV90b19yZWFkKHQyLCB0Myk7Ci0gICAgd3JpdGVfdG9fcmVhZCh0MywgdDIpOwotICB9CiAKKyAgVHJpY2t5MiB0MjsKKyAgVHJpY2t5MyB0MzsKKyAgdDIuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7CisgIHdyaXRlX3RvX3JlYWQodDIsIHQzKTsKKyAgd3JpdGVfdG9fcmVhZCh0MywgdDIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzgpIHsKICAgLy8gTXUtaHUtaGEtaGEtaGEhCi0gIHsKLSAgICBUcmlja3kyIHQyOwotICAgIFRyaWNreTMgdDM7Ci0gICAgdHJ5IHsKLSAgICAgIHdyaXRlX3RvX3JlYWQodDIsIHQzKTsKLSAgICAgIGFib3J0KCk7Ci0gICAgfQotICAgIGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24mIGV4KSB7fQogCi0gICAgd3JpdGVfdG9fcmVhZCh0MywgdDIpOwotICAgIGFzc2VydCh0Mi5fX2lzc2V0LmltX29wdGlvbmFsKTsKKyAgVHJpY2t5MiB0MjsKKyAgVHJpY2t5MyB0MzsKKyAgdHJ5IHsKKyAgICB3cml0ZV90b19yZWFkKHQyLCB0Myk7CisgICAgYWJvcnQoKTsKKyAgfSBjYXRjaCAoY29uc3QgVFByb3RvY29sRXhjZXB0aW9uJikgewogICB9CiAKLSAgY291dCA8PCAiQ29tcGxleCBzdHJ1Y3QsIHNpbXBsZSB0ZXN0LiIgPDwgZW5kbDsKLSAgewotICAgIENvbXBsZXggYzsKLSAgICBjb3V0IDw8IFRocmlmdERlYnVnU3RyaW5nKGMpIDw8IGVuZGw7Ci0gIH0KKyAgd3JpdGVfdG9fcmVhZCh0MywgdDIpOworICBCT09TVF9DSEVDSyh0Mi5fX2lzc2V0LmltX29wdGlvbmFsKTsKK30KIAorQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF85KSB7CisgIENvbXBsZXggYzsKIAotICB7Ci0gICAgVHJpY2t5MSB0MTsKLSAgICBUcmlja3kyIHQyOwotICAgIC8vIENvbXBpbGUgZXJyb3IuCi0gICAgLy8odm9pZCkodDEgPT0gdDIpOwotICB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiQ29tcGxleCB7XG4iCisgICAgIiAgMDE6IGNwX2RlZmF1bHQgKGkxNikgPSAwLFxuIgorICAgICIgIDAyOiBjcF9yZXF1aXJlZCAoaTE2KSA9IDAsXG4iCisgICAgIiAgMDQ6IHRoZV9tYXAgKG1hcCkgPSBtYXA8aTE2LHN0cnVjdD5bMF0ge1xuIgorICAgICIgIH0sXG4iCisgICAgIiAgMDU6IHJlcV9zaW1wIChzdHJ1Y3QpID0gU2ltcGxlIHtcbiIKKyAgICAiICAgIDAxOiBpbV9kZWZhdWx0IChpMTYpID0gMCxcbiIKKyAgICAiICAgIDAyOiBpbV9yZXF1aXJlZCAoaTE2KSA9IDAsXG4iCisgICAgIiAgfSxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKGMpKTsKIAotICB7Ci0gICAgT2xkU2Nob29sIG8xLCBvMiwgbzM7Ci0gICAgYXNzZXJ0KG8xID09IG8yKTsKLSAgICBvMS5pbV9pbnQgPSBvMi5pbV9pbnQgPSAxMDsKLSAgICBhc3NlcnQobzEgPT0gbzIpOwotICAgIG8xLl9faXNzZXQuaW1faW50ID0gdHJ1ZTsKLSAgICBvMi5fX2lzc2V0LmltX2ludCA9IGZhbHNlOwotICAgIGFzc2VydChvMSA9PSBvMik7Ci0gICAgbzEuaW1faW50ID0gMjA7Ci0gICAgbzEuX19pc3NldC5pbV9pbnQgPSBmYWxzZTsKLSAgICBhc3NlcnQobzEgIT0gbzIpOwotICAgIG8xLmltX2ludCA9IDEwOwotICAgIGFzc2VydChvMSA9PSBvMik7Ci0gICAgbzEuaW1fc3RyID0gbzIuaW1fc3RyID0gImZvbyI7Ci0gICAgYXNzZXJ0KG8xID09IG8yKTsKLSAgICBvMS5fX2lzc2V0LmltX3N0ciA9IG8yLl9faXNzZXQuaW1fc3RyID0gdHJ1ZTsKLSAgICBhc3NlcnQobzEgPT0gbzIpOwotICAgIG1hcDxpbnQzMl90LHN0cmluZz4gbXltYXA7Ci0gICAgbXltYXBbMV0gPSAiYmFyIjsKLSAgICBteW1hcFsyXSA9ICJiYXoiOwotICAgIG8xLmltX2JpZy5wdXNoX2JhY2sobWFwPGludDMyX3Qsc3RyaW5nPigpKTsKLSAgICBhc3NlcnQobzEgIT0gbzIpOwotICAgIG8yLmltX2JpZy5wdXNoX2JhY2sobWFwPGludDMyX3Qsc3RyaW5nPigpKTsKLSAgICBhc3NlcnQobzEgPT0gbzIpOwotICAgIG8yLmltX2JpZy5wdXNoX2JhY2sobXltYXApOwotICAgIGFzc2VydChvMSAhPSBvMik7Ci0gICAgbzEuaW1fYmlnLnB1c2hfYmFjayhteW1hcCk7Ci0gICAgYXNzZXJ0KG8xID09IG8yKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CiAKLSAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRNZW1vcnlCdWZmZXIpKTsKLSAgICBvMS53cml0ZSgmcHJvdG9jb2wpOworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF8xMCkgeworICBUcmlja3kxIHQxOworICBUcmlja3kyIHQyOworICAvLyBDb21waWxlIGVycm9yLgorICAvLyh2b2lkKSh0MSA9PSB0Mik7Cit9CiAKLSAgICBvMS5pbV9iaWcucHVzaF9iYWNrKG15bWFwKTsKLSAgICBteW1hcFszXSA9ICJxdXgiOwotICAgIG8yLmltX2JpZy5wdXNoX2JhY2sobXltYXApOwotICAgIGFzc2VydChvMSAhPSBvMik7Ci0gICAgbzEuaW1fYmlnLmJhY2soKVszXSA9ICJxdXgiOwotICAgIGFzc2VydChvMSA9PSBvMik7CitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzExKSB7CisgIE9sZFNjaG9vbCBvMSwgbzIsIG8zOworICBCT09TVF9DSEVDSyhvMSA9PSBvMik7CisgIG8xLmltX2ludCA9IG8yLmltX2ludCA9IDEwOworICBCT09TVF9DSEVDSyhvMSA9PSBvMik7CisgIG8xLl9faXNzZXQuaW1faW50ID0gdHJ1ZTsKKyAgbzIuX19pc3NldC5pbV9pbnQgPSBmYWxzZTsKKyAgQk9PU1RfQ0hFQ0sobzEgPT0gbzIpOworICBvMS5pbV9pbnQgPSAyMDsKKyAgbzEuX19pc3NldC5pbV9pbnQgPSBmYWxzZTsKKyAgQk9PU1RfQ0hFQ0sobzEgIT0gbzIpOworICBvMS5pbV9pbnQgPSAxMDsKKyAgQk9PU1RfQ0hFQ0sobzEgPT0gbzIpOworICBvMS5pbV9zdHIgPSBvMi5pbV9zdHIgPSAiZm9vIjsKKyAgQk9PU1RfQ0hFQ0sobzEgPT0gbzIpOworICBvMS5fX2lzc2V0LmltX3N0ciA9IG8yLl9faXNzZXQuaW1fc3RyID0gdHJ1ZTsKKyAgQk9PU1RfQ0hFQ0sobzEgPT0gbzIpOworICBzdGQ6Om1hcDxpbnQzMl90LCBzdGQ6OnN0cmluZz4gbXltYXA7CisgIG15bWFwWzFdID0gImJhciI7CisgIG15bWFwWzJdID0gImJheiI7CisgIG8xLmltX2JpZy5wdXNoX2JhY2soc3RkOjptYXA8aW50MzJfdCwgc3RkOjpzdHJpbmc+KCkpOworICBCT09TVF9DSEVDSyhvMSAhPSBvMik7CisgIG8yLmltX2JpZy5wdXNoX2JhY2soc3RkOjptYXA8aW50MzJfdCwgc3RkOjpzdHJpbmc+KCkpOworICBCT09TVF9DSEVDSyhvMSA9PSBvMik7CisgIG8yLmltX2JpZy5wdXNoX2JhY2sobXltYXApOworICBCT09TVF9DSEVDSyhvMSAhPSBvMik7CisgIG8xLmltX2JpZy5wdXNoX2JhY2sobXltYXApOworICBCT09TVF9DSEVDSyhvMSA9PSBvMik7CiAKLSAgICBvMy5yZWFkKCZwcm90b2NvbCk7Ci0gICAgbzMuaW1fYmlnLnB1c2hfYmFjayhteW1hcCk7Ci0gICAgYXNzZXJ0KG8xID09IG8zKTsKKyAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVE1lbW9yeUJ1ZmZlcikpOworICBvMS53cml0ZSgmcHJvdG9jb2wpOwogCi0gICAgLy9jb3V0IDw8IFRocmlmdERlYnVnU3RyaW5nKG8zKSA8PCBlbmRsOwotICB9CisgIG8xLmltX2JpZy5wdXNoX2JhY2sobXltYXApOworICBteW1hcFszXSA9ICJxdXgiOworICBvMi5pbV9iaWcucHVzaF9iYWNrKG15bWFwKTsKKyAgQk9PU1RfQ0hFQ0sobzEgIT0gbzIpOworICBvMS5pbV9iaWcuYmFjaygpWzNdID0gInF1eCI7CisgIEJPT1NUX0NIRUNLKG8xID09IG8yKTsKKyAgCisgIG8zLnJlYWQoJnByb3RvY29sKTsKKyAgbzMuaW1fYmlnLnB1c2hfYmFjayhteW1hcCk7CisgIEJPT1NUX0NIRUNLKG8xID09IG8zKTsKIAotICB7Ci0gICAgVHJpY2t5MiB0MSwgdDI7Ci0gICAgYXNzZXJ0KHQxLl9faXNzZXQuaW1fb3B0aW9uYWwgPT0gZmFsc2UpOwotICAgIGFzc2VydCh0Mi5fX2lzc2V0LmltX29wdGlvbmFsID09IGZhbHNlKTsKLSAgICBhc3NlcnQodDEgPT0gdDIpOwotICAgIHQxLmltX29wdGlvbmFsID0gNTsKLSAgICBhc3NlcnQodDEgPT0gdDIpOwotICAgIHQyLmltX29wdGlvbmFsID0gNTsKLSAgICBhc3NlcnQodDEgPT0gdDIpOwotICAgIHQxLl9faXNzZXQuaW1fb3B0aW9uYWwgPSB0cnVlOwotICAgIGFzc2VydCh0MSAhPSB0Mik7Ci0gICAgdDIuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7Ci0gICAgYXNzZXJ0KHQxID09IHQyKTsKLSAgICB0MS5pbV9vcHRpb25hbCA9IDEwOwotICAgIGFzc2VydCh0MSAhPSB0Mik7Ci0gICAgdDIuX19pc3NldC5pbV9vcHRpb25hbCA9IGZhbHNlOwotICAgIGFzc2VydCh0MSAhPSB0Mik7Ci0gIH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJPbGRTY2hvb2wge1xuIgorICAgICIgIDAxOiBpbV9pbnQgKGkxNikgPSAxMCxcbiIKKyAgICAiICAwMjogaW1fc3RyIChzdHJpbmcpID0gXCJmb29cIixcbiIKKyAgICAiICAwMzogaW1fYmlnIChsaXN0KSA9IGxpc3Q8bWFwPlszXSB7XG4iCisgICAgIiAgICBbMF0gPSBtYXA8aTMyLHN0cmluZz5bMF0ge1xuIgorICAgICIgICAgfSxcbiIKKyAgICAiICAgIFsxXSA9IG1hcDxpMzIsc3RyaW5nPlsyXSB7XG4iCisgICAgIiAgICAgIDEgLT4gXCJiYXJcIixcbiIKKyAgICAiICAgICAgMiAtPiBcImJhelwiLFxuIgorICAgICIgICAgfSxcbiIKKyAgICAiICAgIFsyXSA9IG1hcDxpMzIsc3RyaW5nPlszXSB7XG4iCisgICAgIiAgICAgIDEgLT4gXCJiYXJcIixcbiIKKyAgICAiICAgICAgMiAtPiBcImJhelwiLFxuIgorICAgICIgICAgICAzIC0+IFwicXV4XCIsXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgIH0sXG4iCisgICAgIn0iKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhvMykpOwogCi0gIHJldHVybiAwOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF8xMikgeworICBUcmlja3kyIHQxLCB0MjsKKyAgQk9PU1RfQ0hFQ0sodDEuX19pc3NldC5pbV9vcHRpb25hbCA9PSBmYWxzZSk7CisgIEJPT1NUX0NIRUNLKHQyLl9faXNzZXQuaW1fb3B0aW9uYWwgPT0gZmFsc2UpOworICBCT09TVF9DSEVDSyh0MSA9PSB0Mik7CisgIHQxLmltX29wdGlvbmFsID0gNTsKKyAgQk9PU1RfQ0hFQ0sodDEgPT0gdDIpOworICB0Mi5pbV9vcHRpb25hbCA9IDU7CisgIEJPT1NUX0NIRUNLKHQxID09IHQyKTsKKyAgdDEuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7CisgIEJPT1NUX0NIRUNLKHQxICE9IHQyKTsKKyAgdDIuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7CisgIEJPT1NUX0NIRUNLKHQxID09IHQyKTsKKyAgdDEuaW1fb3B0aW9uYWwgPSAxMDsKKyAgQk9PU1RfQ0hFQ0sodDEgIT0gdDIpOworICB0Mi5fX2lzc2V0LmltX29wdGlvbmFsID0gZmFsc2U7CisgIEJPT1NUX0NIRUNLKHQxICE9IHQyKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF8xMykgeworICBPcHRpb25hbERlZmF1bHQgdDEsIHQyOworCisgIEJPT1NUX0NIRUNLKHQxLl9faXNzZXQub3B0X2ludCA9PSB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0sodDEuX19pc3NldC5vcHRfc3RyID09IHRydWUpOworICBCT09TVF9DSEVDSyh0MS5vcHRfaW50ID09IHQyLm9wdF9pbnQpOworICBCT09TVF9DSEVDSyh0MS5vcHRfc3RyID09IHQyLm9wdF9zdHIpOworCisgIHdyaXRlX3RvX3JlYWQodDEsIHQyKTsKKyAgQk9PU1RfQ0hFQ0sodDIuX19pc3NldC5vcHRfaW50ID09IHRydWUpOworICBCT09TVF9DSEVDSyh0Mi5fX2lzc2V0Lm9wdF9zdHIgPT0gdHJ1ZSk7CisgIEJPT1NUX0NIRUNLKHQxLm9wdF9pbnQgPT0gdDIub3B0X2ludCk7CisgIEJPT1NUX0NIRUNLKHQxLm9wdF9zdHIgPT0gdDIub3B0X3N0cik7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJPcHRpb25hbERlZmF1bHQge1xuIgorICAgICIgIDAxOiBvcHRfaW50IChpMTYpID0gMTIzNCxcbiIKKyAgICAiICAwMjogb3B0X3N0ciAoc3RyaW5nKSA9IFwiZGVmYXVsdFwiLFxuIgorICAgICJ9Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcodDIpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9SZWN1cnNpdmVUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9SZWN1cnNpdmVUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWYyMzRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1JlY3Vyc2l2ZVRlc3QuY3BwCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlICJnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5oIgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFJlY3Vyc2l2ZVRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZWN1cnNpdmVfMSkgeworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IHByb3QobmV3IFRCaW5hcnlQcm90b2NvbChidWYpKTsKKworICBSZWNUcmVlIHRyZWU7CisgIFJlY1RyZWUgY2hpbGQ7CisgIHRyZWUuY2hpbGRyZW4ucHVzaF9iYWNrKGNoaWxkKTsKKworICB0cmVlLndyaXRlKHByb3QuZ2V0KCkpOworCisgIFJlY1RyZWUgcmVzdWx0OworICByZXN1bHQucmVhZChwcm90LmdldCgpKTsKKyAgQk9PU1RfQ0hFQ0sodHJlZSA9PSByZXN1bHQpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3JlY3Vyc2l2ZV8yKSB7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRCaW5hcnlQcm90b2NvbD4gcHJvdChuZXcgVEJpbmFyeVByb3RvY29sKGJ1ZikpOworCisgIFJlY0xpc3QgbDsKKyAgc2hhcmVkX3B0cjxSZWNMaXN0PiBsMihuZXcgUmVjTGlzdCk7CisgIGwubmV4dGl0ZW0gPSBsMjsKKworICBsLndyaXRlKHByb3QuZ2V0KCkpOworCisgIFJlY0xpc3QgcmVzdWx0bGlzdDsKKyAgcmVzdWx0bGlzdC5yZWFkKHByb3QuZ2V0KCkpOworICBCT09TVF9DSEVDSyhyZXN1bHRsaXN0Lm5leHRpdGVtICE9IE5VTEwpOworICBCT09TVF9DSEVDSyhyZXN1bHRsaXN0Lm5leHRpdGVtLT5uZXh0aXRlbSA9PSBOVUxMKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZWN1cnNpdmVfMykgeworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IHByb3QobmV3IFRCaW5hcnlQcm90b2NvbChidWYpKTsKKworICBDb1JlYyBjOworICBzaGFyZWRfcHRyPENvUmVjMj4gcihuZXcgQ29SZWMyKTsKKyAgYy5vdGhlciA9IHI7CisKKyAgYy53cml0ZShwcm90LmdldCgpKTsKKworICBjLnJlYWQocHJvdC5nZXQoKSk7CisgIEJPT1NUX0NIRUNLKGMub3RoZXIgIT0gTlVMTCk7CisgIEJPT1NUX0NIRUNLKGMub3RoZXItPm90aGVyLm90aGVyID09IE5VTEwpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3JlY3Vyc2l2ZV80KSB7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRCaW5hcnlQcm90b2NvbD4gcHJvdChuZXcgVEJpbmFyeVByb3RvY29sKGJ1ZikpOworCisgIHNoYXJlZF9wdHI8UmVjTGlzdD4gZGVwdGhMaW1pdChuZXcgUmVjTGlzdCk7CisgIGRlcHRoTGltaXQtPm5leHRpdGVtID0gZGVwdGhMaW1pdDsKKyAgQk9PU1RfQ0hFQ0tfVEhST1coZGVwdGhMaW1pdC0+d3JpdGUocHJvdC5nZXQoKSksCisgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xFeGNlcHRpb24pOworCisgIGRlcHRoTGltaXQtPm5leHRpdGVtLnJlc2V0KCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9SZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYTA0MmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0LmNwcApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBFUFNJTE9OIDAuMDAwMDAwMQorI2luY2x1ZGUgPHR5cGVpbmRleD4KKyNpbmNsdWRlIDx0eXBlaW5mbz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJnZW4tY3BwL0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLmgiCit1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OworCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdCkKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZW5kZXJlZF9kb3VibGVfY29uc3RhbnRzKSB7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQgPSAxLjA7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQgPSAtMTAwLjA7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcuMDsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCA9IC05MjIzMzcyMDM2ODU0Nzc1ODA3LjA7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTID0gMy4xNDE1OTI2NTM1OTsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFID0gMTAwMDAwMC4xOworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUgPSAtMTAwMDAwMC4xOworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFID0gMS43ZSszMDg7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDM7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUgPSAtMS43ZSszMDg7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgPSAtOTIyMzM3MjAzNjg1NDc3NTgxNi40MzsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5ULCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUywgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFLCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUykuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKQorICAgICAgICAgICAgLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFKS5oYXNoX2NvZGUoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVuZGVyZWRfZG91YmxlX2xpc3QpIHsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjxkb3VibGU+IEVYUEVDVEVEX0RPVUJMRV9MSVNUezEuMCwtMTAwLjAsMTAwLjAsOTIyMzM3MjAzNjg1NDc3NTgwNy4wLC05MjIzMzcyMDM2ODU0Nzc1ODA3LjAsCisgICAgICAgIDMuMTQxNTkyNjUzNTksMTAwMDAwMC4xLC0xMDAwMDAwLjEsMS43ZSszMDgsLTEuN2UrMzA4LDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMsLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDN9OworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0xJU1RfVEVTVC5zaXplKCksIEVYUEVDVEVEX0RPVUJMRV9MSVNULnNpemUoKSk7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBFWFBFQ1RFRF9ET1VCTEVfTElTVC5zaXplKCk7ICsraSkgeworICAgICAgICBCT09TVF9DSEVDS19DTE9TRShnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9MSVNUX1RFU1RbaV0sIEVYUEVDVEVEX0RPVUJMRV9MSVNUW2ldLCBFUFNJTE9OKTsKKyAgICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1NlY3VyaXR5VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvU2VjdXJpdHlUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODJhNGYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1NlY3VyaXR5VGVzdC5jcHAKQEAgLTAsMCArMSwyNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBTZWN1cml0eVRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZmlsZXN5c3RlbS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZm9yZWFjaC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZm9ybWF0LmhwcD4KKyNpbmNsdWRlIDxib29zdC90aHJlYWQuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaWZkZWYgX19saW51eF9fCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNTTFNlcnZlclNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU1NMU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNTTFNvY2tldEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OworCit1c2luZyBzdGQ6OmJpbmQ7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK2Jvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIGtleURpcjsKK2Jvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIGNlcnRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkKK3sKKyAgICByZXR1cm4ga2V5RGlyIC8gZmlsZW5hbWU7Cit9Citib29zdDo6bXV0ZXggZ011dGV4OworCitzdHJ1Y3QgR2xvYmFsRml4dHVyZQoreworICAgIEdsb2JhbEZpeHR1cmUoKQorICAgIHsKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJnYzsgKytpKQorICAgIHsKKyAgICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJhcmd2WyUxJV0gPSBcIiUyJVwiIikgJSBpICUgbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2W2ldKTsKKyAgICB9CisKKyAgICAjaWZkZWYgX19saW51eF9fCisgICAgLy8gT3BlblNTTCBjYWxscyBzZW5kKCkgd2l0aG91dCBNU0dfTk9TSUdQSVBFIHNvIHdyaXRpbmcgdG8gYSBzb2NrZXQgdGhhdCBoYXMKKyAgICAvLyBkaXNjb25uZWN0ZWQgY2FuIGNhdXNlIGEgU0lHUElQRSBzaWduYWwuLi4KKyAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisgICAgI2VuZGlmCisKKyAgICBUU1NMU29ja2V0RmFjdG9yeTo6c2V0TWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uKHRydWUpOworICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OmluaXRpYWxpemVPcGVuU1NMKCk7CisKKyAgICBrZXlEaXIgPSBib29zdDo6ZmlsZXN5c3RlbTo6Y3VycmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkgLyAidGVzdCIgLyAia2V5cyI7CisgICAgaWYgKCFib29zdDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKGNlcnRGaWxlKCJzZXJ2ZXIuY3J0IikpKQorICAgIHsKKyAgICAgIGtleURpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpwYXRoKG1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJndlttYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2MgLSAxXSk7CisgICAgICBpZiAoIWJvb3N0OjpmaWxlc3lzdGVtOjpleGlzdHMoY2VydEZpbGUoInNlcnZlci5jcnQiKSkpCisgICAgICB7CisgICAgICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiVGhlIGxhc3QgYXJndW1lbnQgdG8gdGhpcyB0ZXN0IG11c3QgYmUgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0ZXN0IGNlcnRpZmljYXRlKHMpLiIpOworICAgICAgfQorICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIH5HbG9iYWxGaXh0dXJlKCkKKyAgICB7CisgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6Y2xlYW51cE9wZW5TU0woKTsKKyNpZmRlZiBfX2xpbnV4X18KKyAgICBzaWduYWwoU0lHUElQRSwgU0lHX0RGTCk7CisjZW5kaWYKKyAgICB9Cit9OworCisjaWYgKEJPT1NUX1ZFUlNJT04gPj0gMTA1OTAwKQorQk9PU1RfR0xPQkFMX0ZJWFRVUkUoR2xvYmFsRml4dHVyZSk7CisjZWxzZQorQk9PU1RfR0xPQkFMX0ZJWFRVUkUoR2xvYmFsRml4dHVyZSkKKyNlbmRpZgorCitzdHJ1Y3QgU2VjdXJpdHlGaXh0dXJlCit7CisgICAgdm9pZCBzZXJ2ZXIoYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6U1NMUHJvdG9jb2wgcHJvdG9jb2wpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vc3Q6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG1NdXRleCk7CisKKyAgICAgICAgICAgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBTZXJ2ZXJTb2NrZXRGYWN0b3J5OworICAgICAgICAgICAgc2hhcmVkX3B0cjxUU1NMU2VydmVyU29ja2V0PiBwU2VydmVyU29ja2V0OworCisgICAgICAgICAgICBwU2VydmVyU29ja2V0RmFjdG9yeS5yZXNldChuZXcgVFNTTFNvY2tldEZhY3Rvcnkoc3RhdGljX2Nhc3Q8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6U1NMUHJvdG9jb2w+KHByb3RvY29sKSkpOworICAgICAgICAgICAgcFNlcnZlclNvY2tldEZhY3RvcnktPmNpcGhlcnMoIkFMTDohQURIOiFMT1c6IUVYUDohTUQ1OkBTVFJFTkdUSCIpOworICAgICAgICAgICAgcFNlcnZlclNvY2tldEZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZShjZXJ0RmlsZSgic2VydmVyLmNydCIpLnN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgcFNlcnZlclNvY2tldEZhY3RvcnktPmxvYWRQcml2YXRlS2V5KGNlcnRGaWxlKCJzZXJ2ZXIua2V5Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICBwU2VydmVyU29ja2V0RmFjdG9yeS0+c2VydmVyKHRydWUpOworICAgICAgICAgICAgcFNlcnZlclNvY2tldC5yZXNldChuZXcgVFNTTFNlcnZlclNvY2tldCgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpKTsKKyAgICAgICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gY29ubmVjdGVkQ2xpZW50OworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU2VydmVyU29ja2V0LT5saXN0ZW4oKTsKKyAgICAgICAgICAgICAgICBtUG9ydCA9IHBTZXJ2ZXJTb2NrZXQtPmdldFBvcnQoKTsKKyAgICAgICAgICAgICAgICBtQ1Zhci5ub3RpZnlfb25lKCk7CisgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKworICAgICAgICAgICAgICAgIGNvbm5lY3RlZENsaWVudCA9IHBTZXJ2ZXJTb2NrZXQtPmFjY2VwdCgpOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVmWzJdOworICAgICAgICAgICAgICAgIGJ1ZlswXSA9ICdPJzsKKyAgICAgICAgICAgICAgICBidWZbMV0gPSAnSyc7CisgICAgICAgICAgICAgICAgY29ubmVjdGVkQ2xpZW50LT53cml0ZSgmYnVmWzBdLCAyKTsKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWRDbGllbnQtPmZsdXNoKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhdGNoIChhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29zdDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2soZ011dGV4KTsKKyAgICAgICAgICAgICAgICBCT09TVF9URVNUX01FU1NBR0UoYm9vc3Q6OmZvcm1hdCgiU1JWICUxJSBFeGNlcHRpb246ICUyJSIpICUgYm9vc3Q6OnRoaXNfdGhyZWFkOjpnZXRfaWQoKSAlIGV4LndoYXQoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uZWN0ZWRDbGllbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29ubmVjdGVkQ2xpZW50LT5jbG9zZSgpOworICAgICAgICAgICAgICAgIGNvbm5lY3RlZENsaWVudC5yZXNldCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwU2VydmVyU29ja2V0LT5jbG9zZSgpOworICAgICAgICAgICAgcFNlcnZlclNvY2tldC5yZXNldCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJPT1NUX0ZBSUwoYm9vc3Q6OmZvcm1hdCgiJTElOiAlMiUiKSAlIHR5cGVpZChleCkubmFtZSgpICUgZXgud2hhdCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgY2xpZW50KGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlNTTFByb3RvY29sIHByb3RvY29sKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5OworICAgICAgICAgICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0PiBwQ2xpZW50U29ja2V0OworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQ2xpZW50U29ja2V0RmFjdG9yeS5yZXNldChuZXcgVFNTTFNvY2tldEZhY3Rvcnkoc3RhdGljX2Nhc3Q8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6U1NMUHJvdG9jb2w+KHByb3RvY29sKSkpOworICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5hdXRoZW50aWNhdGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgcENsaWVudFNvY2tldEZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZShjZXJ0RmlsZSgiY2xpZW50LmNydCIpLnN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShjZXJ0RmlsZSgiY2xpZW50LmtleSIpLnN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjZXJ0RmlsZSgiQ0EucGVtIikuc3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcENsaWVudFNvY2tldCA9IHBDbGllbnRTb2NrZXRGYWN0b3J5LT5jcmVhdGVTb2NrZXQoImxvY2FsaG9zdCIsIG1Qb3J0KTsKKyAgICAgICAgICAgICAgICBwQ2xpZW50U29ja2V0LT5vcGVuKCk7CisKKyAgICAgICAgICAgICAgICB1aW50OF90IGJ1ZlszXTsKKyAgICAgICAgICAgICAgICBidWZbMF0gPSAwOworICAgICAgICAgICAgICAgIGJ1ZlsxXSA9IDA7CisgICAgICAgICAgICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMiwgcENsaWVudFNvY2tldC0+cmVhZCgmYnVmWzBdLCAyKSk7CisgICAgICAgICAgICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgbWVtY21wKCZidWZbMF0sICJPSyIsIDIpKTsKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29zdDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2soZ011dGV4KTsKKyAgICAgICAgICAgICAgICBCT09TVF9URVNUX01FU1NBR0UoYm9vc3Q6OmZvcm1hdCgiQ0xJICUxJSBFeGNlcHRpb246ICUyJSIpICUgYm9vc3Q6OnRoaXNfdGhyZWFkOjpnZXRfaWQoKSAlIGV4LndoYXQoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwQ2xpZW50U29ja2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXQtPmNsb3NlKCk7CisgICAgICAgICAgICAgICAgcENsaWVudFNvY2tldC5yZXNldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJPT1NUX0ZBSUwoYm9vc3Q6OmZvcm1hdCgiJTElOiAlMiUiKSAlIHR5cGVpZChleCkubmFtZSgpICUgZXgud2hhdCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBjaGFyICpwcm90b2NvbDJzdHIoc2l6ZV90IHByb3RvY29sKQorICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKnN0cmluZ3NbYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6TEFURVNUICsgMV0gPQorICAgICAgICB7CisgICAgICAgICAgICAgICAgIlNTTFRMUyIsCisgICAgICAgICAgICAgICAgIlNTTHYyIiwKKyAgICAgICAgICAgICAgICAiU1NMdjMiLAorICAgICAgICAgICAgICAgICJUTFN2MV8wIiwKKyAgICAgICAgICAgICAgICAiVExTdjFfMSIsCisgICAgICAgICAgICAgICAgIlRMU3YxXzIiCisgICAgICAgIH07CisgICAgICAgIHJldHVybiBzdHJpbmdzW3Byb3RvY29sXTsKKyAgICB9CisKKyAgICBib29zdDo6bXV0ZXggbU11dGV4OworICAgIGJvb3N0Ojpjb25kaXRpb25fdmFyaWFibGUgbUNWYXI7CisgICAgaW50IG1Qb3J0OworICAgIGJvb2wgbUNvbm5lY3RlZDsKK307CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShCT09TVF9URVNUX01PRFVMRSwgU2VjdXJpdHlGaXh0dXJlKQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShzc2xfc2VjdXJpdHlfbWF0cml4KQoreworICAgIHRyeQorICAgIHsKKyAgICAgICAgLy8gbWF0cml4IG9mIGNvbm5lY3Rpb24gc3VjY2VzcyBiZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyIHdpdGggZGlmZmVyZW50IFNTTFByb3RvY29sIHNlbGVjdGlvbnMKKyAgICAgICAgYm9vbCBtYXRyaXhbYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6TEFURVNUICsgMV1bYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6TEFURVNUICsgMV0gPQorICAgICAgICB7CisgICAgLy8gICBzZXJ2ZXIgICAgPSBTU0xUTFMgICBTU0x2MiAgICBTU0x2MyAgICBUTFN2MV8wICBUTFN2MV8xICBUTFN2MV8yCisgICAgLy8gY2xpZW50CisgICAgLyogU1NMVExTICAqLyAgeyB0cnVlLCAgICBmYWxzZSwgICBmYWxzZSwgICB0cnVlLCAgICB0cnVlLCAgICB0cnVlICAgIH0sCisgICAgLyogU1NMdjIgICAqLyAgeyBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSAgIH0sCisgICAgLyogU1NMdjMgICAqLyAgeyBmYWxzZSwgICBmYWxzZSwgICB0cnVlLCAgICBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSAgIH0sCisgICAgLyogVExTdjFfMCAqLyAgeyB0cnVlLCAgICBmYWxzZSwgICBmYWxzZSwgICB0cnVlLCAgICBmYWxzZSwgICBmYWxzZSAgIH0sCisgICAgLyogVExTdjFfMSAqLyAgeyB0cnVlLCAgICBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSwgICB0cnVlLCAgICBmYWxzZSAgIH0sCisgICAgLyogVExTdjFfMiAqLyAgeyB0cnVlLCAgICBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSwgICB0cnVlICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBmb3IgKHNpemVfdCBzaSA9IDA7IHNpIDw9IGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OkxBVEVTVDsgKytzaSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChzaXplX3QgY2kgPSAwOyBjaSA8PSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpMQVRFU1Q7ICsrY2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNpID09IDEgfHwgY2kgPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgYWxsIFNTTHYyIGNhc2VzIC0gcHJvdG9jb2wgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyNpZmRlZiBPUEVOU1NMX05PX1NTTDMKKyAgICAgICAgICAgICAgICBpZiAoc2kgPT0gMiB8fCBjaSA9PSAyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBhbGwgU1NMdjMgY2FzZXMgLSBwcm90b2NvbCBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAgICAgYm9vc3Q6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG1NdXRleCk7CisKKyAgICAgICAgICAgICAgICBCT09TVF9URVNUX01FU1NBR0UoYm9vc3Q6OmZvcm1hdCgiVEVTVDogU2VydmVyID0gJTElLCBDbGllbnQgPSAlMiUiKQorICAgICAgICAgICAgICAgICAgICAlIHByb3RvY29sMnN0cihzaSkgJSBwcm90b2NvbDJzdHIoY2kpKTsKKworICAgICAgICAgICAgICAgIG1Db25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAvLyB0aHJlYWRfZ3JvdXAgbWFuYWdlcyB0aGUgdGhyZWFkIGxpZmV0aW1lIC0gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2YgY3JlYXRlX3RocmVhZAorICAgICAgICAgICAgICAgIGJvb3N0Ojp0aHJlYWRfZ3JvdXAgdGhyZWFkczsKKyAgICAgICAgICAgICAgICAodm9pZCl0aHJlYWRzLmNyZWF0ZV90aHJlYWQoYmluZCgmU2VjdXJpdHlGaXh0dXJlOjpzZXJ2ZXIsIHRoaXMsIHN0YXRpY19jYXN0PGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlNTTFByb3RvY29sPihzaSkpKTsKKyAgICAgICAgICAgICAgICBtQ1Zhci53YWl0KGxvY2spOyAgICAgICAgICAgLy8gd2FpdCBmb3IgbGlzdGVuKCkgdG8gc3VjY2VlZAorICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgKHZvaWQpdGhyZWFkcy5jcmVhdGVfdGhyZWFkKGJpbmQoJlNlY3VyaXR5Rml4dHVyZTo6Y2xpZW50LCB0aGlzLCBzdGF0aWNfY2FzdDxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpTU0xQcm90b2NvbD4oY2kpKSk7CisgICAgICAgICAgICAgICAgdGhyZWFkcy5qb2luX2FsbCgpOworCisgICAgICAgICAgICAgICAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShtQ29ubmVjdGVkID09IG1hdHJpeFtjaV1bc2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OmZvcm1hdCgiICAgICAgU2VydmVyID0gJTElLCBDbGllbnQgPSAlMiUgZXhwZWN0ZWQgbUNvbm5lY3RlZCA9PSAlMyUgYnV0IHdhcyAlNCUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgcHJvdG9jb2wyc3RyKHNpKSAlIHByb3RvY29sMnN0cihjaSkgJSBtYXRyaXhbY2ldW3NpXSAlIG1Db25uZWN0ZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZXgpCisgICAgeworICAgICAgICBCT09TVF9GQUlMKGJvb3N0Ojpmb3JtYXQoIiUxJTogJTIlIikgJSB0eXBlaWQoZXgpLm5hbWUoKSAlIGV4LndoYXQoKSk7CisgICAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9TcGVjaWFsaXphdGlvblRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1NwZWNpYWxpemF0aW9uVGVzdC5jcHAKaW5kZXggZmFlMWQzMi4uMDA4ODM3ZCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1NwZWNpYWxpemF0aW9uVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1NwZWNpYWxpemF0aW9uVGVzdC5jcHAKQEAgLTEsMzAgKzEsMzAgQEAKLSNpbmNsdWRlIDxpb3N0cmVhbT4KKyNkZWZpbmUgX1VTRV9NQVRIX0RFRklORVMKICNpbmNsdWRlIDxjbWF0aD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CiAjaW5jbHVkZSA8Z2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oPgogCi11c2luZyBzdGQ6OmNvdXQ7Ci11c2luZyBzdGQ6OmVuZGw7CiB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OjpkZWJ1ZzsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKIAorI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBTcGVjaWFsaXphdGlvblRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKIHR5cGVkZWYgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyPiBNeVByb3RvY29sOwotLy90eXBlZGVmIFRCaW5hcnlQcm90b2NvbFQ8VFRyYW5zcG9ydD4gTXlQcm90b2NvbDsKKy8vIHR5cGVkZWYgVEJpbmFyeVByb3RvY29sVDxUVHJhbnNwb3J0PiBNeVByb3RvY29sOwogCi1pbnQgbWFpbigpIHsKLQorQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zcGVjaWFsaXphdGlvbl8xKSB7CiAgIE9uZU9mRWFjaCBvb2U7Ci0gIG9vZS5pbV90cnVlICAgPSB0cnVlOwotICBvb2UuaW1fZmFsc2UgID0gZmFsc2U7Ci0gIG9vZS5hX2JpdGUgICAgPSAweDdmOworICBvb2UuaW1fdHJ1ZSA9IHRydWU7CisgIG9vZS5pbV9mYWxzZSA9IGZhbHNlOworICBvb2UuYV9iaXRlID0gMHg3ZjsKICAgb29lLmludGVnZXIxNiA9IDI3MDAwOwotICBvb2UuaW50ZWdlcjMyID0gMTw8MjQ7CisgIG9vZS5pbnRlZ2VyMzIgPSAxIDw8IDI0OwogICBvb2UuaW50ZWdlcjY0ID0gKHVpbnQ2NF90KTYwMDAgKiAxMDAwICogMTAwMDsKICAgb29lLmRvdWJsZV9wcmVjaXNpb24gPSBNX1BJOwotICBvb2Uuc29tZV9jaGFyYWN0ZXJzICA9ICJKU09OIFRISVMhIFwiXDEiOwotICBvb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQ3XG5cYVx0IjsKKyAgb29lLnNvbWVfY2hhcmFjdGVycyA9ICJKU09OIFRISVMhIFwiXDEiOworICBvb2Uuem9tZ191bmljb2RlID0gIlx4ZDdcblxhXHQiOwogICBvb2UuYmFzZTY0ID0gIlwxXDJcM1wyNTUiOwogCiAgIE5lc3RpbmcgbjsKQEAgLTMyLDEyICszMiwxNCBAQAogICBuLm15X29vZS5pbnRlZ2VyMTYgPSAxNjsKICAgbi5teV9vb2UuaW50ZWdlcjMyID0gMzI7CiAgIG4ubXlfb29lLmludGVnZXI2NCA9IDY0OwotICBuLm15X29vZS5kb3VibGVfcHJlY2lzaW9uID0gKHN0ZDo6c3FydCg1KSsxKS8yOwotICBuLm15X29vZS5zb21lX2NoYXJhY3RlcnMgID0gIjpSIChtZSBnb2luZyBcInJycnJcIikiOwotICBuLm15X29vZS56b21nX3VuaWNvZGUgICAgID0gIlx4ZDNceDgwXHhlMlx4ODVceGFlXHhjZVx4OWRceDIwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZDBceDlkXHhjZVx4YmZceGUyXHg4NVx4YmZceGQwXHhiZVx4YzlceGExXHhkMFx4YjNceGQwXHhiMFx4Y2ZceDgxXHhlMlx4ODRceDhlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MjBceGNlXHg5MVx4NzRceDc0XHhjZVx4YjFceGUyXHg4NVx4YmRceGNlXHhiYVx4YzdceDgzXHhlMlx4ODBceGJjIjsKLSAgbi5teV9ib25rLnR5cGUgICAgPSAzMTMzNzsKKyAgbi5teV9vb2UuZG91YmxlX3ByZWNpc2lvbiA9IChzdGQ6OnNxcnQoNS4wKSArIDEpIC8gMjsKKyAgbi5teV9vb2Uuc29tZV9jaGFyYWN0ZXJzID0gIjpSIChtZSBnb2luZyBcInJycnJcIikiOworICBuLm15X29vZS56b21nX3VuaWNvZGUgICAgID0gIlx4ZDNceDgwXHhlMlx4ODVceGFlXHhjZVx4OWRceDIwXHhkMFx4OWRceGNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4YmZceGUyXHg4NVx4YmZceGQwXHhiZVx4YzlceGExXHhkMFx4YjNceGQwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4YjBceGNmXHg4MVx4ZTJceDg0XHg4ZVx4MjBceGNlXHg5MVx4NzRceDc0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4Y2VceGIxXHhlMlx4ODVceGJkXHhjZVx4YmFceGM3XHg4M1x4ZTJceDgwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4YmMiOworICBuLm15X2JvbmsudHlwZSA9IDMxMzM3OwogICBuLm15X2JvbmsubWVzc2FnZSA9ICJJIGFtIGEgYm9uay4uLiB4b3IhIjsKIAogICBIb2x5TW9sZXkgaG07CkBAIC02MSw0OCArNjMsNDEgQEAKIAogICBzdGQ6OnZlY3RvcjxCb25rPiBzdGFnZTI7CiAgIGhtLmJvbmtzWyJub3RoaW5nIl0gPSBzdGFnZTI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDE7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJXYWl0LiI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDI7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJXaGF0PyI7CiAgIGhtLmJvbmtzWyJzb21ldGhpbmciXSA9IHN0YWdlMjsKICAgc3RhZ2UyLmNsZWFyKCk7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDM7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJxdW90aCI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDQ7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJ0aGUgcmF2ZW4iOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7CisgIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSArIDEpOwogICBzdGFnZTIuYmFjaygpLnR5cGUgPSA1OwogICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAibmV2ZXJtb3JlIjsKICAgaG0uYm9ua3NbInBvZSJdID0gc3RhZ2UyOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90byhuZXcgTXlQcm90b2NvbChidWZmZXIpKTsKLQotICBjb3V0IDw8ICJUZXN0aW5nIG9vZSIgPDwgZW5kbDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8obmV3IE15UHJvdG9jb2woYnVmZmVyKSk7CiAKICAgb29lLndyaXRlKHByb3RvLmdldCgpKTsKICAgT25lT2ZFYWNoIG9vZTI7CiAgIG9vZTIucmVhZChwcm90by5nZXQoKSk7CiAKLSAgYXNzZXJ0KG9vZSA9PSBvb2UyKTsKLQotCi0gIGNvdXQgPDwgIlRlc3RpbmcgaG0iIDw8IGVuZGw7CisgIEJPT1NUX0NIRUNLKG9vZSA9PSBvb2UyKTsKIAogICBobS53cml0ZShwcm90by5nZXQoKSk7CiAgIEhvbHlNb2xleSBobTI7CiAgIGhtMi5yZWFkKHByb3RvLmdldCgpKTsKIAotICBhc3NlcnQoaG0gPT0gaG0yKTsKKyAgQk9PU1RfQ0hFQ0soaG0gPT0gaG0yKTsKIAogICBobTIuYmlnWzBdLmFfYml0ZSA9IDB4MDA7CiAKLSAgYXNzZXJ0KGhtICE9IGhtMik7Ci0KLSAgcmV0dXJuIDA7CisgIEJPT1NUX0NIRUNLKGhtICE9IGhtMik7CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVEJ1ZmZlckJhc2VUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UQnVmZmVyQmFzZVRlc3QuY3BwCmluZGV4IDFhMDU1MmEuLjQzMDMwMmMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9UQnVmZmVyQmFzZVRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9UQnVmZmVyQmFzZVRlc3QuY3BwCkBAIC0xOSwxNSArMTksMTYgQEAKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNob3J0UmVhZFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlcmVkVHJhbnNwb3J0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEZyYW1lZFRyYW5zcG9ydDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OnRlc3Q6OlRTaG9ydFJlYWRUcmFuc3BvcnQ7Cit1c2luZyBzdGQ6OnN0cmluZzsKIAogLy8gU2hhbWVsZXNzbHkgY29waWVkIGZyb20gWmxpYlRyYW5zcG9ydC4gIFRPRE86IHJlZmFjdG9yLgogdW5zaWduZWQgaW50IGRpc3RbXVs1MDAwXSA9IHsKQEAgLTM0OSw3ICszNTAsNyBAQAogICAgICAgaW50IHdyaXRlX2luZGV4ID0gMDsKICAgICAgIHVuc2lnbmVkIGludCB0b193cml0ZSA9ICgxPDwxNCktNDI7CiAgICAgICB3aGlsZSAodG9fd3JpdGUgPiAwKSB7Ci0gICAgICAgIGludCB3cml0ZV9hbXQgPSBzdGQ6Om1pbihkaXN0W2QxXVt3cml0ZV9pbmRleF0sIHRvX3dyaXRlKTsKKyAgICAgICAgaW50IHdyaXRlX2FtdCA9IChzdGQ6Om1pbikoZGlzdFtkMV1bd3JpdGVfaW5kZXhdLCB0b193cml0ZSk7CiAgICAgICAgIGJ1ZmZlci53cml0ZSgmZGF0YVt3cml0ZV9vZmZzZXRdLCB3cml0ZV9hbXQpOwogICAgICAgICB3cml0ZV9vZmZzZXQgKz0gd3JpdGVfYW10OwogICAgICAgICB3cml0ZV9pbmRleCsrOwpAQCAtMzYwLDcgKzM2MSw3IEBACiAgICAgICBpbnQgcmVhZF9pbmRleCA9IDA7CiAgICAgICB1bnNpZ25lZCBpbnQgdG9fcmVhZCA9ICgxPDwxMyktNDI7CiAgICAgICB3aGlsZSAodG9fcmVhZCA+IDApIHsKLSAgICAgICAgaW50IHJlYWRfYW10ID0gc3RkOjptaW4oZGlzdFtkMl1bcmVhZF9pbmRleF0sIHRvX3JlYWQpOworICAgICAgICBpbnQgcmVhZF9hbXQgPSAoc3RkOjptaW4pKGRpc3RbZDJdW3JlYWRfaW5kZXhdLCB0b19yZWFkKTsKICAgICAgICAgaW50IGdvdCA9IGJ1ZmZlci5yZWFkKCZkYXRhX291dFtyZWFkX29mZnNldF0sIHJlYWRfYW10KTsKICAgICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ290LCByZWFkX2FtdCk7CiAgICAgICAgIHJlYWRfb2Zmc2V0ICs9IHJlYWRfYW10OwpAQCAtMzc0LDcgKzM3NSw3IEBACiAgICAgICBpbnQgc2Vjb25kX2luZGV4ID0gd3JpdGVfaW5kZXgtMTsKICAgICAgIHVuc2lnbmVkIGludCB0b19zZWNvbmQgPSAoMTw8MTQpKzQyOwogICAgICAgd2hpbGUgKHRvX3NlY29uZCA+IDApIHsKLSAgICAgICAgaW50IHNlY29uZF9hbXQgPSBzdGQ6Om1pbihkaXN0W2QxXVtzZWNvbmRfaW5kZXhdLCB0b19zZWNvbmQpOworICAgICAgICBpbnQgc2Vjb25kX2FtdCA9IChzdGQ6Om1pbikoZGlzdFtkMV1bc2Vjb25kX2luZGV4XSwgdG9fc2Vjb25kKTsKICAgICAgICAgLy9wcmludGYoIiVkXG4iLCBzZWNvbmRfYW10KTsKICAgICAgICAgYnVmZmVyLndyaXRlKCZkYXRhW3NlY29uZF9vZmZzZXRdLCBzZWNvbmRfYW10KTsKICAgICAgICAgc2Vjb25kX29mZnNldCArPSBzZWNvbmRfYW10OwpAQCAtNTY2LDcgKzU2Nyw3IEBACiAgICAgICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgewogICAgICAgICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigxNikpOwogICAgICAgICBURnJhbWVkVHJhbnNwb3J0IHRyYW5zKGJ1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIHVpbnQ4X3QgZGF0YV9vdXRbMTw8MTVdOworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhX291dCgxPDwxNywgMCk7CiAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gZmx1c2hfc2l6ZXM7CiAKICAgICAgICAgaW50IHdyaXRlX29mZnNldCA9IDA7CkBAIC02MDQsNyArNjA1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKCh1bnNpZ25lZCBpbnQpcmVhZF9vZmZzZXQsIHNpemVvZihkYXRhKSk7Ci0gICAgICAgIEJPT1NUX0NIRUNLKCFtZW1jbXAoZGF0YSwgZGF0YV9vdXQsIHNpemVvZihkYXRhKSkpOworICAgICAgICBCT09TVF9DSEVDSyghbWVtY21wKGRhdGEsICZkYXRhX291dFswXSwgc2l6ZW9mKGRhdGEpKSk7CiAgICAgICB9CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVEZEVHJhbnNwb3J0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVEZEVHJhbnNwb3J0VGVzdC5jcHAKaW5kZXggMWVjNTM4ZS4uMGJhMDM1YSAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RGRFRyYW5zcG9ydFRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9URkRUcmFuc3BvcnRUZXN0LmNwcApAQCAtMTksMzggKzE5LDMyIEBACiAKICNpbmNsdWRlIDxjc3RkbGliPgogI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KLSNpbmNsdWRlIDxUaHJpZnQuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEZEVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0Lmg+CisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgVEZEVHJhbnNwb3J0VGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKworLy8gRGlzYWJsZWQgb24gTVNWQyBiZWNhdXNlIHRoZSBSVEwgYXNzZXJ0cyBvbiBhbiBpbnZhbGlkIGZpbGUgZGVzY3JpcHRvcgorLy8gaW4gYm90aCBkZWJ1ZyBhbmQgcmVsZWFzZSBtb2RlOyBhdCBsZWFzdCBpbiBNU1ZDUjEwMCAoVmlzdWFsIFN0dWRpbyAyMDEwKQorI2lmICFkZWZpbmVkKFdJTjMyKQorCiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEZEVHJhbnNwb3J0OwogCi1jbGFzcyBEdW1teUV4Y2VwdGlvbiA6IHN0ZDo6ZXhjZXB0aW9uIHsKLX07Ci0KLWludCBtYWluKCkgewotICB7Ci0gICAgVEZEVHJhbnNwb3J0IHQoMjU2LCBURkRUcmFuc3BvcnQ6Ok5PX0NMT1NFX09OX0RFU1RST1kpOwotICB9Ci0KLSAgdHJ5IHsKLSAgICB7Ci0gICAgICBURkRUcmFuc3BvcnQgdCgyNTYsIFRGRFRyYW5zcG9ydDo6Q0xPU0VfT05fREVTVFJPWSk7Ci0gICAgfQotICAgIHN0ZDo6YWJvcnQoKTsKLSAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikgewotICB9Ci0KLSAgdHJ5IHsKLSAgICB7Ci0gICAgICBURkRUcmFuc3BvcnQgdCgyNTYsIFRGRFRyYW5zcG9ydDo6Q0xPU0VfT05fREVTVFJPWSk7Ci0gICAgICB0aHJvdyBEdW1teUV4Y2VwdGlvbigpOwotICAgIH0KLSAgICBzdGQ6OmFib3J0KCk7Ci0gIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7Ci0gICAgYWJvcnQoKTsKLSAgfSBjYXRjaCAoRHVtbXlFeGNlcHRpb24mKSB7Ci0gIH0KLQotICByZXR1cm4gMDsKLQorQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF90ZmR0cmFuc3BvcnRfMSkgeworICBCT09TVF9DSEVDS19OT19USFJPVyhURkRUcmFuc3BvcnQgdCgyNTYsIFRGRFRyYW5zcG9ydDo6Q0xPU0VfT05fREVTVFJPWSkpOwogfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3RmZHRyYW5zcG9ydF8yKSB7CisgIFRGRFRyYW5zcG9ydCB0KDI1NiwgVEZEVHJhbnNwb3J0OjpDTE9TRV9PTl9ERVNUUk9ZKTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1codC5jbG9zZSgpLCBUVHJhbnNwb3J0RXhjZXB0aW9uKTsKK30KKworI2Vsc2UKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF90ZmR0cmFuc3BvcnRfZHVtbXkpIHsKKyAgQk9PU1RfQ0hFQ0sodHJ1ZSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RGaWxlVHJhbnNwb3J0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVEZpbGVUcmFuc3BvcnRUZXN0LmNwcAppbmRleCA2ZGJlN2M4Li5kMGMyNmIzIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvVEZpbGVUcmFuc3BvcnRUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvVEZpbGVUcmFuc3BvcnRUZXN0LmNwcApAQCAtMjAsMTEgKzIwLDIzIEBACiAjZGVmaW5lIF9HTlVfU09VUkNFIC8vIG5lZWRlZCBmb3IgZ2V0b3B0X2xvbmcKICNlbmRpZgogCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAogI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKICNpbmNsdWRlIDxnZXRvcHQuaD4KICNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CiAKLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0Lmg+CisKKyNpZmRlZiBfX01JTkdXMzJfXworICAjaW5jbHVkZSA8aW8uaD4KKyAgI2luY2x1ZGUgPHVuaXN0ZC5oPgorICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisgICNpbmNsdWRlIDxmY250bC5oPgorICAjaW5jbHVkZSA8c3lzXHN0YXQuaD4KKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKIApAQCAtMzcsMzAgKzQ5LDE1IEBACiBjbGFzcyBGc3luY0xvZzsKIEZzeW5jTG9nKiBmc3luY19sb2c7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBIZWxwZXIgY29kZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vLyBQcm92aWRlIEJPT1NUX0NIRUNLX0xUKCkgYW5kIEJPT1NUX0NIRUNLX0dUKCksIGluIGNhc2Ugd2UncmUgY29tcGlsZWQKLS8vIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBib29zdAotI2lmbmRlZiBCT09TVF9DSEVDS19MVAotI2RlZmluZSBCT09TVF9DSEVDS19DTVAoYSwgYiwgb3AsIGNoZWNrX2ZuKSBcCi0gIGNoZWNrX2ZuKChhKSBvcCAoYiksIFwKLSAgICAgICAgICAgImNoZWNrICIgQk9PU1RfU1RSSU5HSVpFKGEpICIgIiBCT09TVF9TVFJJTkdJWkUob3ApICIgIiBcCi0gICAgICAgICAgIEJPT1NUX1NUUklOR0laRShiKSAiIGZhaWxlZDogIiBCT09TVF9TVFJJTkdJWkUoYSkgIj0iIDw8IChhKSA8PCBcCi0gICAgICAgICAgICIgIiBCT09TVF9TVFJJTkdJWkUoYikgIj0iIDw8IChiKSkKLQotI2RlZmluZSBCT09TVF9DSEVDS19MVChhLCBiKSBCT09TVF9DSEVDS19DTVAoYSwgYiwgPCwgQk9PU1RfQ0hFQ0tfTUVTU0FHRSkKLSNkZWZpbmUgQk9PU1RfQ0hFQ0tfR1QoYSwgYikgQk9PU1RfQ0hFQ0tfQ01QKGEsIGIsID4sIEJPT1NUX0NIRUNLX01FU1NBR0UpCi0jZGVmaW5lIEJPT1NUX1JFUVVJUkVfTFQoYSwgYikgQk9PU1RfQ0hFQ0tfQ01QKGEsIGIsIDwsIEJPT1NUX1JFUVVJUkVfTUVTU0FHRSkKLSNlbmRpZiAvLyBCT09TVF9DSEVDS19MVAotCiAvKioKICAqIENsYXNzIHRvIHJlY29yZCBjYWxscyB0byBmc3luYwogICovCiBjbGFzcyBGc3luY0xvZyB7Ci0gcHVibGljOgorcHVibGljOgogICBzdHJ1Y3QgRnN5bmNDYWxsIHsKICAgICBzdHJ1Y3QgdGltZXZhbCB0aW1lOwogICAgIGludCBmZDsKQEAgLTcwLDE3ICs2NywxNSBAQAogICBGc3luY0xvZygpIHt9CiAKICAgdm9pZCBmc3luYyhpbnQgZmQpIHsKLSAgICAodm9pZCkgZmQ7CisgICAgKHZvaWQpZmQ7CiAgICAgRnN5bmNDYWxsIGNhbGw7Ci0gICAgZ2V0dGltZW9mZGF5KCZjYWxsLnRpbWUsIE5VTEwpOworICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJmNhbGwudGltZSwgTlVMTCk7CiAgICAgY2FsbHNfLnB1c2hfYmFjayhjYWxsKTsKICAgfQogCi0gIGNvbnN0IENhbGxMaXN0KiBnZXRDYWxscygpIGNvbnN0IHsKLSAgICByZXR1cm4gJmNhbGxzXzsKLSAgfQorICBjb25zdCBDYWxsTGlzdCogZ2V0Q2FsbHMoKSBjb25zdCB7IHJldHVybiAmY2FsbHNfOyB9CiAKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgQ2FsbExpc3QgY2FsbHNfOwogfTsKIApAQCAtODgsOCArODMsMjIgQEAKICAqIEhlbHBlciBjbGFzcyB0byBjbGVhbiB1cCB0ZW1wb3JhcnkgZmlsZXMKICAqLwogY2xhc3MgVGVtcEZpbGUgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgVGVtcEZpbGUoY29uc3QgY2hhciogZGlyZWN0b3J5LCBjb25zdCBjaGFyKiBwcmVmaXgpIHsKKyAgI2lmZGVmIF9fTUlOR1czMl9fCisgICAgKCh2b2lkKWRpcmVjdG9yeSk7CisgICAgc2l6ZV90IHBhdGhfbGVuID0gc3RybGVuKHByZWZpeCkgKyA4OworICAgIHBhdGhfID0gbmV3IGNoYXJbcGF0aF9sZW5dOworICAgIHNucHJpbnRmKHBhdGhfLCBwYXRoX2xlbiwgIiVzWFhYWFhYIiwgcHJlZml4KTsKKyAgICBpZiAoX21rdGVtcF9zKHBhdGhfLHBhdGhfbGVuKSA9PSAwKSB7CisgICAgICBmZF8gPSBvcGVuKHBhdGhfLE9fQ1JFQVQgfCBPX1JEV1IgfCBPX0JJTkFSWSxTX0lSRUFEIHwgU19JV1JJVEUpOworICAgICAgaWYgKGZkXyA8IDApIHsKKyAgICAgICAgdGhyb3cgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oIl9ta3RlbXBfcygpIGZhaWxlZCIpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigiX21rdGVtcF9zKCkgZmFpbGVkIik7CisgICAgfQorICAjZWxzZQogICAgIHNpemVfdCBwYXRoX2xlbiA9IHN0cmxlbihkaXJlY3RvcnkpICsgc3RybGVuKHByZWZpeCkgKyA4OwogICAgIHBhdGhfID0gbmV3IGNoYXJbcGF0aF9sZW5dOwogICAgIHNucHJpbnRmKHBhdGhfLCBwYXRoX2xlbiwgIiVzLyVzWFhYWFhYIiwgZGlyZWN0b3J5LCBwcmVmaXgpOwpAQCAtOTgsNiArMTA3LDcgQEAKICAgICBpZiAoZmRfIDwgMCkgewogICAgICAgdGhyb3cgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oIm1rc3RlbXAoKSBmYWlsZWQiKTsKICAgICB9CisgICNlbmRpZgogICB9CiAKICAgflRlbXBGaWxlKCkgewpAQCAtMTA1LDEzICsxMTUsOSBAQAogICAgIGNsb3NlKCk7CiAgIH0KIAotICBjb25zdCBjaGFyKiBnZXRQYXRoKCkgY29uc3QgewotICAgIHJldHVybiBwYXRoXzsKLSAgfQorICBjb25zdCBjaGFyKiBnZXRQYXRoKCkgY29uc3QgeyByZXR1cm4gcGF0aF87IH0KIAotICBpbnQgZ2V0RkQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZkXzsKLSAgfQorICBpbnQgZ2V0RkQoKSBjb25zdCB7IHJldHVybiBmZF87IH0KIAogICB2b2lkIHVubGluaygpIHsKICAgICBpZiAocGF0aF8pIHsKQEAgLTEzMCw3ICsxMzYsNyBAQAogICAgIGZkXyA9IC0xOwogICB9CiAKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgY2hhciogcGF0aF87CiAgIGludCBmZF87CiB9OwpAQCAtMTM4LDggKzE0NCw3IEBACiAvLyBVc2Ugb3VyIG93biB2ZXJzaW9uIG9mIGZzeW5jKCkgZm9yIHRlc3RpbmcuCiAvLyBUaGlzIHJldHVybnMgaW1tZWRpYXRlbHksIHNvIHRpbWluZyBpbiB0ZXN0X2Rlc3RydWN0b3IoKSBpc24ndCBhZmZlY3RlZCBieQogLy8gd2FpdGluZyBvbiB0aGUgYWN0dWFsIGZpbGVzeXN0ZW0uCi1leHRlcm4gIkMiCi1pbnQgZnN5bmMoaW50IGZkKSB7CitleHRlcm4gIkMiIGludCBmc3luYyhpbnQgZmQpIHsKICAgaWYgKGZzeW5jX2xvZykgewogICAgIGZzeW5jX2xvZy0+ZnN5bmMoZmQpOwogICB9CkBAIC0xNTAsNyArMTU1LDYgQEAKICAgcmV0dXJuICh0Mi0+dHZfdXNlYyAtIHQxLT50dl91c2VjKSArICh0Mi0+dHZfc2VjIC0gdDEtPnR2X3NlYykgKiAxMDAwMDAwOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogVGVzdCBjYXNlcwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTcyLDcgKzE3Niw3IEBACiAKICAgdW5zaWduZWQgaW50IG51bV9vdmVyID0gMDsKICAgZm9yICh1bnNpZ25lZCBpbnQgbiA9IDA7IG4gPCBOVU1fSVRFUkFUSU9OUzsgKytuKSB7Ci0gICAgZnRydW5jYXRlKGYuZ2V0RkQoKSwgMCk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgZnRydW5jYXRlKGYuZ2V0RkQoKSwgMCkpOwogCiAgICAgVEZpbGVUcmFuc3BvcnQqIHRyYW5zcG9ydCA9IG5ldyBURmlsZVRyYW5zcG9ydChmLmdldFBhdGgoKSk7CiAKQEAgLTE5MSwxNiArMTk1LDE2IEBACiAgICAgc3RydWN0IHRpbWV2YWwgc3RhcnQ7CiAgICAgc3RydWN0IHRpbWV2YWwgZW5kOwogCi0gICAgZ2V0dGltZW9mZGF5KCZzdGFydCwgTlVMTCk7CisgICAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmc3RhcnQsIE5VTEwpOwogICAgIGRlbGV0ZSB0cmFuc3BvcnQ7Ci0gICAgZ2V0dGltZW9mZGF5KCZlbmQsIE5VTEwpOworICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJmVuZCwgTlVMTCk7CiAKICAgICBpbnQgZGVsdGEgPSB0aW1lX2RpZmYoJnN0YXJ0LCAmZW5kKTsKIAogICAgIC8vIElmIGFueSBhdHRlbXB0IHRha2VzIG1vcmUgdGhhbiA1MDBtcywgdHJlYXQgdGhhdCBhcyBhIGZhaWx1cmUuCiAgICAgLy8gVHJlYXQgdGhpcyBhcyBhIGZhdGFsIGZhaWx1cmUsIHNvIHdlJ2xsIHJldHVybiBub3cgaW5zdGVhZCBvZgogICAgIC8vIGxvb3Bpbmcgb3ZlciBhIHZlcnkgc2xvdyBvcGVyYXRpb24uCi0gICAgQk9PU1RfUkVRVUlSRV9MVChkZWx0YSwgNTAwMDAwKTsKKyAgICBCT09TVF9XQVJOKCBkZWx0YSA8IDUwMDAwMCApOwogCiAgICAgLy8gTm9ybWFsbHksIGl0IHRha2VzIGxlc3MgdGhhbiAxMDBtcyBvbiBteSBkZXYgYm94LgogICAgIC8vIEhvd2V2ZXIsIGlmIHRoZSBib3ggaXMgaGVhdmlseSBsb2FkZWQsIHNvbWUgb2YgdGhlIHRlc3QgcnVucwpAQCAtMjExLDE3ICsyMTUsMTYgQEAKICAgfQogCiAgIC8vIE1ha2Ugc3VyZSBmZXdlciB0aGFuIDEwJSBvZiB0aGUgcnVucyB0b29rIGxvbmdlciB0aGFuIDEwMDB1cwotICBCT09TVF9DSEVDSyhudW1fb3ZlciA8IChOVU1fSVRFUkFUSU9OUyAvIDEwKSk7CisgIEJPT1NUX1dBUk4obnVtX292ZXIgPCAoTlVNX0lURVJBVElPTlMgLyAxMCkpOwogfQogCiAvKioKICAqIE1ha2Ugc3VyZSBzZXRGbHVzaE1heFVzKCkgaXMgaG9ub3JlZC4KICAqLwotdm9pZCB0ZXN0X2ZsdXNoX21heF91c19pbXBsKHVpbnQzMl90IGZsdXNoX3VzLCB1aW50MzJfdCB3cml0ZV91cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0ZXN0X3VzKSB7Cit2b2lkIHRlc3RfZmx1c2hfbWF4X3VzX2ltcGwodWludDMyX3QgZmx1c2hfdXMsIHVpbnQzMl90IHdyaXRlX3VzLCB1aW50MzJfdCB0ZXN0X3VzKSB7CiAgIC8vIFRGaWxlVHJhbnNwb3J0IG9ubHkgY2FsbHMgZnN5bmMoKSBpZiBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4sCiAgIC8vIHNvIG1ha2Ugc3VyZSB0aGUgd3JpdGUgaW50ZXJ2YWwgaXMgc21hbGxlciB0aGFuIHRoZSBmbHVzaCBpbnRlcnZhbC4KLSAgQk9PU1RfUkVRVUlSRSh3cml0ZV91cyA8IGZsdXNoX3VzKTsKKyAgQk9PU1RfV0FSTih3cml0ZV91cyA8IGZsdXNoX3VzKTsKIAogICBUZW1wRmlsZSBmKHRtcF9kaXIsICJ0aHJpZnQuVEZpbGVUcmFuc3BvcnRUZXN0LiIpOwogCkBAIC0yNzMsMTYgKzI3NiwxMyBAQAogICBjb25zdCBGc3luY0xvZzo6Q2FsbExpc3QqIGNhbGxzID0gbG9nLmdldENhbGxzKCk7CiAgIC8vIFdlIGFkZGVkIDEgZnN5bmMgY2FsbCBhYm92ZS4KICAgLy8gTWFrZSBzdXJlIFRGaWxlVHJhbnNwb3J0IGNhbGxlZCBmc3luYyBhdCBsZWFzdCBvbmNlCi0gIEJPT1NUX0NIRUNLX0dUKGNhbGxzLT5zaXplKCksCi0gICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZzeW5jTG9nOjpDYWxsTGlzdDo6c2l6ZV90eXBlPigxKSk7CisgIEJPT1NUX1dBUk5fR0UoY2FsbHMtPnNpemUoKSwgc3RhdGljX2Nhc3Q8RnN5bmNMb2c6OkNhbGxMaXN0OjpzaXplX3R5cGU+KDEpKTsKIAogICBjb25zdCBzdHJ1Y3QgdGltZXZhbCogcHJldl90aW1lID0gTlVMTDsKLSAgZm9yIChGc3luY0xvZzo6Q2FsbExpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY2FsbHMtPmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gY2FsbHMtPmVuZCgpOwotICAgICAgICsraXQpIHsKKyAgZm9yIChGc3luY0xvZzo6Q2FsbExpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY2FsbHMtPmJlZ2luKCk7IGl0ICE9IGNhbGxzLT5lbmQoKTsgKytpdCkgewogICAgIGlmIChwcmV2X3RpbWUpIHsKICAgICAgIGludCBkZWx0YSA9IHRpbWVfZGlmZihwcmV2X3RpbWUsICZpdC0+dGltZSk7Ci0gICAgICBCT09TVF9DSEVDS19MVChkZWx0YSwgbWF4X2FsbG93ZWRfZGVsdGEpOworICAgICAgQk9PU1RfV0FSTiggZGVsdGEgPCBtYXhfYWxsb3dlZF9kZWx0YSApOwogICAgIH0KICAgICBwcmV2X3RpbWUgPSAmaXQtPnRpbWU7CiAgIH0KQEAgLTMxOCwxMyArMzE4LDEzIEBACiAgIHRyYW5zcG9ydC53cml0ZShidWYsIDEpOwogCiAgIHN0cnVjdCB0aW1ldmFsIHN0YXJ0OwotICBnZXR0aW1lb2ZkYXkoJnN0YXJ0LCBOVUxMKTsKKyAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmc3RhcnQsIE5VTEwpOwogCiAgIGZvciAodW5zaWduZWQgaW50IG4gPSAwOyBuIDwgMTA7ICsrbikgewogICAgIHRyYW5zcG9ydC5mbHVzaCgpOwogCiAgICAgc3RydWN0IHRpbWV2YWwgbm93OwotICAgIGdldHRpbWVvZmRheSgmbm93LCBOVUxMKTsKKyAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZub3csIE5VTEwpOwogCiAgICAgLy8gRmFpbCBpZiBhdCBhbnkgcG9pbnQgd2UndmUgYmVlbiBydW5uaW5nIGZvciBsb25nZXIgdGhhbiBoYWxmIGEgc2Vjb25kLgogICAgIC8vIChXaXRoIHRoZSBidWdneSBjb2RlLCBURmlsZVRyYW5zcG9ydCB1c2VkIHRvIHRha2UgMyBzZWNvbmRzIHBlciBmbHVzaCgpKQpAQCAtMzMyLDcgKzMzMiw3IEBACiAgICAgLy8gVXNlIGEgZmF0YWwgZmFpbCBzbyB3ZSBicmVhayBvdXQgZWFybHksIHJhdGhlciB0aGFuIGNvbnRpbnVpbmcgdG8gbWFrZQogICAgIC8vIG1hbnkgbW9yZSBzbG93IGZsdXNoKCkgY2FsbHMuCiAgICAgaW50IGRlbHRhID0gdGltZV9kaWZmKCZzdGFydCwgJm5vdyk7Ci0gICAgQk9PU1RfUkVRVUlSRV9MVChkZWx0YSwgMjAwMDAwMCk7CisgICAgQk9PU1RfV0FSTiggZGVsdGEgPCAyMDAwMDAwICk7CiAgIH0KIH0KIApAQCAtMzQ4LDExICszNDgsOCBAQAogfQogCiB2b2lkIHBhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewotICBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0c1tdID0gewotICAgIHsgImhlbHAiLCBmYWxzZSwgTlVMTCwgJ2gnIH0sCi0gICAgeyAidG1wLWRpciIsIHRydWUsIE5VTEwsICd0JyB9LAotICAgIHsgTlVMTCwgMCwgTlVMTCwgMCB9Ci0gIH07CisgIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRzW10KKyAgICAgID0ge3siaGVscCIsIGZhbHNlLCBOVUxMLCAnaCd9LCB7InRtcC1kaXIiLCB0cnVlLCBOVUxMLCAndCd9LCB7TlVMTCwgMCwgTlVMTCwgMH19OwogCiAgIHdoaWxlICh0cnVlKSB7CiAgICAgb3B0b3B0ID0gMTsKQEAgLTM2MiwyOCArMzU5LDQ2IEBACiAgICAgfQogCiAgICAgc3dpdGNoIChvcHRjaGFyKSB7Ci0gICAgICBjYXNlICd0JzoKLSAgICAgICAgdG1wX2RpciA9IG9wdGFyZzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdoJzoKLSAgICAgICAgcHJpbnRfdXNhZ2Uoc3Rkb3V0LCBhcmd2WzBdKTsKLSAgICAgICAgZXhpdCgwKTsKLSAgICAgIGNhc2UgJz8nOgotICAgICAgICBleGl0KDEpOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgLy8gT25seSBoYXBwZW5zIGlmIHNvbWVvbmUgYWRkcyBhbm90aGVyIG9wdGlvbiB0byB0aGUgb3B0YXJnIHN0cmluZywKLSAgICAgICAgLy8gYnV0IGRvZXNuJ3QgdXBkYXRlIHRoZSBzd2l0Y2ggc3RhdGVtZW50IHRvIGhhbmRsZSBpdC4KLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmtub3duIG9wdGlvbiBcIi0lY1wiXG4iLCBvcHRjaGFyKTsKLSAgICAgICAgZXhpdCgxKTsKKyAgICBjYXNlICd0JzoKKyAgICAgIHRtcF9kaXIgPSBvcHRhcmc7CisgICAgICBicmVhazsKKyAgICBjYXNlICdoJzoKKyAgICAgIHByaW50X3VzYWdlKHN0ZG91dCwgYXJndlswXSk7CisgICAgICBleGl0KDApOworICAgIGNhc2UgJz8nOgorICAgICAgZXhpdCgxKTsKKyAgICBkZWZhdWx0OgorICAgICAgLy8gT25seSBoYXBwZW5zIGlmIHNvbWVvbmUgYWRkcyBhbm90aGVyIG9wdGlvbiB0byB0aGUgb3B0YXJnIHN0cmluZywKKyAgICAgIC8vIGJ1dCBkb2Vzbid0IHVwZGF0ZSB0aGUgc3dpdGNoIHN0YXRlbWVudCB0byBoYW5kbGUgaXQuCisgICAgICBmcHJpbnRmKHN0ZGVyciwgInVua25vd24gb3B0aW9uIFwiLSVjXCJcbiIsIG9wdGNoYXIpOworICAgICAgZXhpdCgxKTsKICAgICB9CiAgIH0KIH0KIAorI2lmZGVmIEJPT1NUX1RFU1RfRFlOX0xJTksKK3N0YXRpYyBpbnQgbXlBcmdjID0gMDsKK3N0YXRpYyBjaGFyICoqbXlBcmd2ID0gTlVMTDsKKworYm9vbCBpbml0X3VuaXRfdGVzdF9zdWl0ZSgpIHsKKyAgYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLnBfbmFtZS52YWx1ZSA9ICJURmlsZVRyYW5zcG9ydFRlc3QiOworCisgIC8vIFBhcnNlIGFyZ3VtZW50cworICBwYXJzZV9hcmdzKG15QXJnYyxteUFyZ3YpOworICByZXR1cm4gdHJ1ZTsKK30KKworaW50IG1haW4oIGludCBhcmdjLCBjaGFyKiBhcmd2W10gKSB7CisgIG15QXJnYyA9IGFyZ2M7CisgIG15QXJndiA9IGFyZ3Y7CisgIHJldHVybiA6OmJvb3N0Ojp1bml0X3Rlc3Q6OnVuaXRfdGVzdF9tYWluKCZpbml0X3VuaXRfdGVzdF9zdWl0ZSxhcmdjLGFyZ3YpOworfQorI2Vsc2UKIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKLSAgYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLnBfbmFtZS52YWx1ZSA9Ci0gICAgIlRGaWxlVHJhbnNwb3J0VGVzdCI7CisgIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5wX25hbWUudmFsdWUgPSAiVEZpbGVUcmFuc3BvcnRUZXN0IjsKIAogICAvLyBQYXJzZSBhcmd1bWVudHMKICAgcGFyc2VfYXJncyhhcmdjLCBhcmd2KTsKICAgcmV0dXJuIE5VTEw7CiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UTWVtb3J5QnVmZmVyVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVE1lbW9yeUJ1ZmZlclRlc3QuY3BwCmluZGV4IDM3MTE5NzAuLjkyMDY4NzIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9UTWVtb3J5QnVmZmVyVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1RNZW1vcnlCdWZmZXJUZXN0LmNwcApAQCAtMjAsODkgKzIwLDE0MSBAQAogI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPGNsaW1pdHM+Ci0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAjaW5jbHVkZSAiZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmgiCiAKLUJPT1NUX0FVVE9fVEVTVF9TVUlURSggVE1lbW9yeUJ1ZmZlclRlc3QgKQorQk9PU1RfQVVUT19URVNUX1NVSVRFKFRNZW1vcnlCdWZmZXJUZXN0KQogCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9yb3VuZHRyaXAgKSB7Ci0gICAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKLSAgICB1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKLSAgICB1c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OmNvdXQ7Cit1c2luZyBzdGQ6OmVuZGw7Cit1c2luZyBzdGQ6OnN0cmluZzsKIAotICAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gc3RyQnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICAgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBiaW5hcnlQcm90Y29sKG5ldyBUQmluYXJ5UHJvdG9jb2woc3RyQnVmZmVyKSk7CitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3JlYWRfd3JpdGVfZ3JvdykgeworICAvLyBBZGRlZCB0byB0ZXN0IHRoZSBmaXggZm9yIFRIUklGVC0xMjQ4CisgIFRNZW1vcnlCdWZmZXIgdXV0OworICBjb25zdCBpbnQgbWF4U2l6ZSA9IDY1NTM2OworICB1aW50OF90IHZlcmlmeVttYXhTaXplXTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmOworICBidWYucmVzaXplKG1heFNpemUpOwogCi0gICAgdGhyaWZ0Ojp0ZXN0OjpYdHJ1Y3QgYTsKLSAgICBhLmkzMl90aGluZyA9IDEwOwotICAgIGEuaTY0X3RoaW5nID0gMzA7Ci0gICAgYS5zdHJpbmdfdGhpbmcgPSJob2xsYSBiYWNrIGEiOwotCi0gICAgYS53cml0ZShiaW5hcnlQcm90Y29sLmdldCgpKTsKLSAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkID0gc3RyQnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpOwotCi0gICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBzdHJCdWZmZXIyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICAgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBiaW5hcnlQcm90Y29sMihuZXcgVEJpbmFyeVByb3RvY29sKHN0ckJ1ZmZlcjIpKTsKLQotICAgIHN0ckJ1ZmZlcjItPnJlc2V0QnVmZmVyKCh1aW50OF90KilzZXJpYWxpemVkLmRhdGEoKSwgc2VyaWFsaXplZC5sZW5ndGgoKSk7Ci0gICAgdGhyaWZ0Ojp0ZXN0OjpYdHJ1Y3QgYTI7Ci0gICAgYTIucmVhZChiaW5hcnlQcm90Y29sMi5nZXQoKSk7Ci0KLSAgICBhc3NlcnQoYSA9PSBhMik7CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtYXhTaXplOyArK2kpIHsKKyAgICBidWZbaV0gPSBzdGF0aWNfY2FzdDx1aW50OF90PihpKTsKICAgfQogCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9jb3B5ICkKKyAgZm9yICh1aW50MzJfdCBpID0gMTsgaSA8IG1heFNpemU7IGkgKj0gMikgeworICAgIHV1dC53cml0ZSgmYnVmWzBdLCBpKTsKKyAgfQorCisgIGZvciAodWludDMyX3QgaSA9IDE7IGkgPCBtYXhTaXplOyBpICo9IDIpIHsKKyAgICB1dXQucmVhZCh2ZXJpZnksIGkpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIDo6bWVtY21wKHZlcmlmeSwgJmJ1ZlswXSwgaSkpOworICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfcm91bmR0cmlwKSB7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gc3RyQnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRCaW5hcnlQcm90b2NvbD4gYmluYXJ5UHJvdGNvbChuZXcgVEJpbmFyeVByb3RvY29sKHN0ckJ1ZmZlcikpOworCisgIHRocmlmdDo6dGVzdDo6WHRydWN0IGE7CisgIGEuaTMyX3RoaW5nID0gMTA7CisgIGEuaTY0X3RoaW5nID0gMzA7CisgIGEuc3RyaW5nX3RoaW5nID0gImhvbGxhIGJhY2sgYSI7CisKKyAgYS53cml0ZShiaW5hcnlQcm90Y29sLmdldCgpKTsKKyAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZCA9IHN0ckJ1ZmZlci0+Z2V0QnVmZmVyQXNTdHJpbmcoKTsKKworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IHN0ckJ1ZmZlcjIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBiaW5hcnlQcm90Y29sMihuZXcgVEJpbmFyeVByb3RvY29sKHN0ckJ1ZmZlcjIpKTsKKworICBzdHJCdWZmZXIyLT5yZXNldEJ1ZmZlcigodWludDhfdCopc2VyaWFsaXplZC5kYXRhKCksIHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXJpYWxpemVkLmxlbmd0aCgpKSk7CisgIHRocmlmdDo6dGVzdDo6WHRydWN0IGEyOworICBhMi5yZWFkKGJpbmFyeVByb3Rjb2wyLmdldCgpKTsKKworICBCT09TVF9DSEVDSyhhID09IGEyKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZWFkQXBwZW5kVG9TdHJpbmcpIHsKKyAgc3RyaW5nKiBzdHIxID0gbmV3IHN0cmluZygiYWJjZDEyMzQiKTsKKyAgVE1lbW9yeUJ1ZmZlciBidWYoKHVpbnQ4X3QqKXN0cjEtPmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0cjEtPmxlbmd0aCgpKSwKKyAgICAgICAgICAgICAgICAgICAgVE1lbW9yeUJ1ZmZlcjo6Q09QWSk7CisKKyAgc3RyaW5nIHN0cjMgPSAid3h5eiIsIHN0cjQgPSAiNjc4OSI7CisgIGJ1Zi5yZWFkQXBwZW5kVG9TdHJpbmcoc3RyMywgNCk7CisgIGJ1Zi5yZWFkQXBwZW5kVG9TdHJpbmcoc3RyNCwgSU5UX01BWCk7CisKKyAgQk9PU1RfQ0hFQ0soc3RyMyA9PSAid3h5emFiY2QiKTsKKyAgQk9PU1RfQ0hFQ0soc3RyNCA9PSAiNjc4OTEyMzQiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9leGNlcHRpb25zKSB7CisgIGNoYXIgZGF0YVtdID0gImZvb1wwYmFyIjsKKworICBUTWVtb3J5QnVmZmVyIGJ1ZjEoKHVpbnQ4X3QqKWRhdGEsIDcsIFRNZW1vcnlCdWZmZXI6Ok9CU0VSVkUpOworICBzdHJpbmcgc3RyID0gYnVmMS5nZXRCdWZmZXJBc1N0cmluZygpOworICBCT09TVF9DSEVDSyhzdHIubGVuZ3RoKCkgPT0gNyk7CisKKyAgYnVmMS5yZXNldEJ1ZmZlcigpOworCisgIEJPT1NUX0NIRUNLX1RIUk9XKGJ1ZjEud3JpdGUoKGNvbnN0IHVpbnQ4X3QqKSJmb28iLCAzKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbik7CisKKyAgVE1lbW9yeUJ1ZmZlciBidWYyKCh1aW50OF90KilkYXRhLCA3LCBUTWVtb3J5QnVmZmVyOjpDT1BZKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coYnVmMi53cml0ZSgoY29uc3QgdWludDhfdCopImJhciIsIDMpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9kZWZhdWx0X21heGltdW1fYnVmZmVyX3NpemUpCit7CisgIEJPT1NUX0NIRUNLX0VRVUFMKChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpLCBUTWVtb3J5QnVmZmVyKCkuZ2V0TWF4QnVmZmVyU2l6ZSgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9kZWZhdWx0X2J1ZmZlcl9zaXplKQoreworICBCT09TVF9DSEVDS19FUVVBTCgxMDI0LCBUTWVtb3J5QnVmZmVyKCkuZ2V0QnVmZmVyU2l6ZSgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9lcnJvcl9zZXRfbWF4X2J1ZmZlcl9zaXplX3Rvb19zbWFsbCkKK3sKKyAgVE1lbW9yeUJ1ZmZlciBidWY7CisgIEJPT1NUX0NIRUNLX1RIUk9XKGJ1Zi5zZXRNYXhCdWZmZXJTaXplKGJ1Zi5nZXRCdWZmZXJTaXplKCkgLSAxKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfbWF4aW11bV9idWZmZXJfc2l6ZSkKK3sKKyAgVE1lbW9yeUJ1ZmZlciBidWY7CisgIGJ1Zi5zZXRNYXhCdWZmZXJTaXplKDgxOTIpOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzbWFsbF9idWZmKDEpOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgODE5MjsgKytpKQogICB7Ci0gICAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKLSAgICB1c2luZyBzdGQ6OnN0cmluZzsKLSAgICB1c2luZyBzdGQ6OmNvdXQ7Ci0gICAgdXNpbmcgc3RkOjplbmRsOwotCi0gICAgc3RyaW5nKiBzdHIxID0gbmV3IHN0cmluZygiYWJjZDEyMzQiKTsKLSAgICBjb25zdCBjaGFyKiBkYXRhMSA9IHN0cjEtPmRhdGEoKTsKLSAgICBUTWVtb3J5QnVmZmVyIGJ1ZigodWludDhfdCopc3RyMS0+ZGF0YSgpLCBzdHIxLT5sZW5ndGgoKSwgVE1lbW9yeUJ1ZmZlcjo6Q09QWSk7Ci0gICAgZGVsZXRlIHN0cjE7Ci0gICAgc3RyaW5nKiBzdHIyID0gbmV3IHN0cmluZygicGxzcmV1c2UiKTsKLSAgICBib29sIG9ial9yZXVzZSA9IChzdHIxID09IHN0cjIpOwotICAgIGJvb2wgZGF0X3JldXNlID0gKGRhdGExID09IHN0cjItPmRhdGEoKSk7Ci0gICAgY291dCA8PCAiT2JqZWN0IHJldXNlOiAiIDw8IG9ial9yZXVzZSA8PCAiICAgRGF0YSByZXVzZTogIiA8PCBkYXRfcmV1c2UKLSAgICAgIDw8ICgob2JqX3JldXNlICYmIGRhdF9yZXVzZSkgPyAiICAgWUFZISIgOiAiIikgPDwgZW5kbDsKLSAgICBkZWxldGUgc3RyMjsKLQotICAgIHN0cmluZyBzdHIzID0gInd4eXoiLCBzdHI0ID0gIjY3ODkiOwotICAgIGJ1Zi5yZWFkQXBwZW5kVG9TdHJpbmcoc3RyMywgNCk7Ci0gICAgYnVmLnJlYWRBcHBlbmRUb1N0cmluZyhzdHI0LCBJTlRfTUFYKTsKLQotICAgIGFzc2VydChzdHIzID09ICJ3eHl6YWJjZCIpOwotICAgIGFzc2VydChzdHI0ID09ICI2Nzg5MTIzNCIpOworICAgIGJ1Zi53cml0ZSgmc21hbGxfYnVmZlswXSwgMSk7CiAgIH0KIAotQk9PU1RfQVVUT19URVNUX0NBU0UoIHRlc3RfZXhjZXB0aW9ucyApCi0gIHsKLSAgICB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwotICAgIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Ci0gICAgdXNpbmcgc3RkOjpzdHJpbmc7CisgIEJPT1NUX0NIRUNLX1RIUk9XKGJ1Zi53cml0ZSgmc21hbGxfYnVmZlswXSwgMSksIFRUcmFuc3BvcnRFeGNlcHRpb24pOworfQogCi0gICAgY2hhciBkYXRhW10gPSAiZm9vXDBiYXIiOworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9tZW1vcnlfYnVmZmVyX3RvX2dldF9zaXplb2Zfb2JqZWN0cykKK3sKKyAgLy8gVGhpcyBpcyBhIGRlbW9uc3RyYXRpb24gb2YgaG93IHRvIHVzZSBUTWVtb3J5QnVmZmVyIHRvIGRldGVybWluZQorICAvLyB0aGUgc2VyaWFsaXplZCBzaXplIG9mIGEgdGhyaWZ0IG9iamVjdCBpbiB0aGUgQmluYXJ5IHByb3RvY29sLgorICAvLyBTZWUgVEhSSUZULTM0ODAKIAotICAgIFRNZW1vcnlCdWZmZXIgYnVmMSgodWludDhfdCopZGF0YSwgNywgVE1lbW9yeUJ1ZmZlcjo6T0JTRVJWRSk7Ci0gICAgc3RyaW5nIHN0ciA9IGJ1ZjEuZ2V0QnVmZmVyQXNTdHJpbmcoKTsKLSAgICBhc3NlcnQoc3RyLmxlbmd0aCgpID09IDcpOwotICAgIGJ1ZjEucmVzZXRCdWZmZXIoKTsKLSAgICB0cnkgewotICAgICAgYnVmMS53cml0ZSgoY29uc3QgdWludDhfdCopImZvbyIsIDMpOwotICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkge30KKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1CdWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBiaW5hcnlQcm90Y29sKG5ldyBUQmluYXJ5UHJvdG9jb2wobWVtQnVmZmVyKSk7CiAKLSAgICBUTWVtb3J5QnVmZmVyIGJ1ZjIoKHVpbnQ4X3QqKWRhdGEsIDcsIFRNZW1vcnlCdWZmZXI6OkNPUFkpOwotICAgIHRyeSB7Ci0gICAgICBidWYyLndyaXRlKChjb25zdCB1aW50OF90KikiYmFyIiwgMyk7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZXgpIHsKLSAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgfQotICB9CisgIHRocmlmdDo6dGVzdDo6WHRydWN0IG9iamVjdDsKKyAgb2JqZWN0LmkzMl90aGluZyA9IDEwOworICBvYmplY3QuaTY0X3RoaW5nID0gMzA7CisgIG9iamVjdC5zdHJpbmdfdGhpbmcgPSAid2hvJ3MgeW91ciBkYWRkeT8iOworCisgIHVpbnQzMl90IHNpemUgPSBvYmplY3Qud3JpdGUoYmluYXJ5UHJvdGNvbC5nZXQoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDQ3LCBzaXplKTsKK30KIAogQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCi0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzAzODBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QuY3BwCkBAIC0wLDAgKzEsMjkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtLmhwcD4KKyNpbmNsdWRlIDxib29zdC9mb3JtYXQuaHBwPgorCisjaW5jbHVkZSAidGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5oIgorCisjaW5jbHVkZSAiZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmgiCisKKyNpbmNsdWRlIDxldmVudC5oPgorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU1NMU29ja2V0RmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTU0xTb2NrZXQ7CisKK3N0cnVjdCBIYW5kbGVyIDogcHVibGljIHRlc3Q6OlBhcmVudFNlcnZpY2VJZiB7CisgIHZvaWQgYWRkU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7IHN0cmluZ3NfLnB1c2hfYmFjayhzKTsgfQorICB2b2lkIGdldFN0cmluZ3Moc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBfcmV0dXJuKSB7IF9yZXR1cm4gPSBzdHJpbmdzXzsgfQorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nc187CisKKyAgLy8gZHVtbXkgb3ZlcnJpZGVzIG5vdCB1c2VkIGluIHRoaXMgdGVzdAorICBpbnQzMl90IGluY3JlbWVudEdlbmVyYXRpb24oKSB7IHJldHVybiAwOyB9CisgIGludDMyX3QgZ2V0R2VuZXJhdGlvbigpIHsgcmV0dXJuIDA7IH0KKyAgdm9pZCBnZXREYXRhV2FpdChzdGQ6OnN0cmluZyYsIGNvbnN0IGludDMyX3QpIHt9CisgIHZvaWQgb25ld2F5V2FpdCgpIHt9CisgIHZvaWQgZXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYpIHt9CisgIHZvaWQgdW5leHBlY3RlZEV4Y2VwdGlvbldhaXQoY29uc3Qgc3RkOjpzdHJpbmcmKSB7fQorfTsKKworYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGgga2V5RGlyOworYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGggY2VydEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKQoreworICByZXR1cm4ga2V5RGlyIC8gZmlsZW5hbWU7Cit9CisKK3N0cnVjdCBHbG9iYWxGaXh0dXJlU1NMCit7CisgICAgR2xvYmFsRml4dHVyZVNTTCgpCisgICAgeworICAgICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmdjOyArK2kpCisgICAgICB7CisgICAgICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJhcmd2WyUxJV0gPSBcIiUyJVwiIikgJSBpICUgbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2W2ldKTsKKyAgICAgIH0KKworI2lmZGVmIF9fbGludXhfXworICAgICAgLy8gT3BlblNTTCBjYWxscyBzZW5kKCkgd2l0aG91dCBNU0dfTk9TSUdQSVBFIHNvIHdyaXRpbmcgdG8gYSBzb2NrZXQgdGhhdCBoYXMKKyAgICAgIC8vIGRpc2Nvbm5lY3RlZCBjYW4gY2F1c2UgYSBTSUdQSVBFIHNpZ25hbC4uLgorICAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworI2VuZGlmCisKKyAgICAgIFRTU0xTb2NrZXRGYWN0b3J5OjpzZXRNYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb24odHJ1ZSk7CisgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ojppbml0aWFsaXplT3BlblNTTCgpOworCisgICAgICBrZXlEaXIgPSBib29zdDo6ZmlsZXN5c3RlbTo6Y3VycmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkgLyAidGVzdCIgLyAia2V5cyI7CisgICAgICBpZiAoIWJvb3N0OjpmaWxlc3lzdGVtOjpleGlzdHMoY2VydEZpbGUoInNlcnZlci5jcnQiKSkpCisgICAgICB7CisgICAgICAgIGtleURpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpwYXRoKG1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJndlttYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2MgLSAxXSk7CisgICAgICAgIGlmICghYm9vc3Q6OmZpbGVzeXN0ZW06OmV4aXN0cyhjZXJ0RmlsZSgic2VydmVyLmNydCIpKSkKKyAgICAgICAgeworICAgICAgICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiVGhlIGxhc3QgYXJndW1lbnQgdG8gdGhpcyB0ZXN0IG11c3QgYmUgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0ZXN0IGNlcnRpZmljYXRlKHMpLiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB+R2xvYmFsRml4dHVyZVNTTCgpCisgICAgeworICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6Y2xlYW51cE9wZW5TU0woKTsKKyNpZmRlZiBfX2xpbnV4X18KKyAgICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfREZMKTsKKyNlbmRpZgorICAgIH0KK307CisKKyNpZiAoQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDApCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlU1NMKTsKKyNlbHNlCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlU1NMKQorI2VuZGlmCisKK3N0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeTsKKworICBwU2VydmVyU29ja2V0RmFjdG9yeS5yZXNldChuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7CisgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5jaXBoZXJzKCJBTEw6IUFESDohTE9XOiFFWFA6IU1ENTpAU1RSRU5HVEgiKTsKKyAgcFNlcnZlclNvY2tldEZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZShjZXJ0RmlsZSgic2VydmVyLmNydCIpLnN0cmluZygpLmNfc3RyKCkpOworICBwU2VydmVyU29ja2V0RmFjdG9yeS0+bG9hZFByaXZhdGVLZXkoY2VydEZpbGUoInNlcnZlci5rZXkiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgcFNlcnZlclNvY2tldEZhY3RvcnktPnNlcnZlcih0cnVlKTsKKyAgcmV0dXJuIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5OworfQorCitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGNyZWF0ZUNsaWVudFNvY2tldEZhY3RvcnkoKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3Rvcnk7CisKKyAgcENsaWVudFNvY2tldEZhY3RvcnkucmVzZXQobmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+YXV0aGVudGljYXRlKHRydWUpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKGNlcnRGaWxlKCJjbGllbnQuY3J0Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShjZXJ0RmlsZSgiY2xpZW50LmtleSIpLnN0cmluZygpLmNfc3RyKCkpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY2VydEZpbGUoIkNBLnBlbSIpLnN0cmluZygpLmNfc3RyKCkpOworICByZXR1cm4gcENsaWVudFNvY2tldEZhY3Rvcnk7Cit9CisKK2NsYXNzIEZpeHR1cmUgeworcHJpdmF0ZToKKyAgc3RydWN0IExpc3RlbkV2ZW50SGFuZGxlciA6IHB1YmxpYyBUU2VydmVyRXZlbnRIYW5kbGVyIHsKKyAgICBwdWJsaWM6CisgICAgICBMaXN0ZW5FdmVudEhhbmRsZXIoTXV0ZXgqIG11dGV4KSA6IGxpc3Rlbk1vbml0b3JfKG11dGV4KSwgcmVhZHlfKGZhbHNlKSB7fQorCisgICAgICB2b2lkIHByZVNlcnZlKCkgLyogb3ZlcnJpZGUgKi8geworICAgICAgICBHdWFyZCBnKGxpc3Rlbk1vbml0b3JfLm11dGV4KCkpOworICAgICAgICByZWFkeV8gPSB0cnVlOworICAgICAgICBsaXN0ZW5Nb25pdG9yXy5ub3RpZnkoKTsKKyAgICAgIH0KKworICAgICAgTW9uaXRvciBsaXN0ZW5Nb25pdG9yXzsKKyAgICAgIGJvb2wgcmVhZHlfOworICB9OworCisgIHN0cnVjdCBSdW5uZXIgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpSdW5uYWJsZSB7CisgICAgaW50IHBvcnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPGV2ZW50X2Jhc2U+IHVzZXJFdmVudEJhc2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUTm9uYmxvY2tpbmdTZXJ2ZXI+IHNlcnZlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuRXZlbnRIYW5kbGVyPiBsaXN0ZW5IYW5kbGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3Rvcnk7CisgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0PiBzb2NrZXQ7CisgICAgTXV0ZXggbXV0ZXhfOworCisgICAgUnVubmVyKCkgeworICAgICAgbGlzdGVuSGFuZGxlci5yZXNldChuZXcgTGlzdGVuRXZlbnRIYW5kbGVyKCZtdXRleF8pKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcnVuKCkgeworICAgICAgLy8gV2hlbiBiaW5kaW5nIHRvIGV4cGxpY2l0IHBvcnQsIGFsbG93IHJldHJ5aW5nIHRvIHdvcmthcm91bmQgYmluZCBmYWlsdXJlcyBvbiBwb3J0cyBpbiB1c2UKKyAgICAgIGludCByZXRyeUNvdW50ID0gcG9ydCA/IDEwIDogMDsKKyAgICAgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5ID0gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpOyAgCisgICAgICBzdGFydFNlcnZlcihyZXRyeUNvdW50KTsKKyAgICB9CisKKyAgICB2b2lkIHJlYWR5QmFycmllcigpIHsKKyAgICAgIC8vIGJsb2NrIHVudGlsIHNlcnZlciBpcyBsaXN0ZW5pbmcgYW5kIHJlYWR5IHRvIGFjY2VwdCBjb25uZWN0aW9ucworICAgICAgR3VhcmQgZyhtdXRleF8pOworICAgICAgd2hpbGUgKCFsaXN0ZW5IYW5kbGVyLT5yZWFkeV8pIHsKKyAgICAgICAgbGlzdGVuSGFuZGxlci0+bGlzdGVuTW9uaXRvcl8ud2FpdCgpOworICAgICAgfQorICAgIH0KKyAgcHJpdmF0ZToKKyAgICB2b2lkIHN0YXJ0U2VydmVyKGludCByZXRyeV9jb3VudCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgc29ja2V0LnJlc2V0KG5ldyB0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChwb3J0LCBwU2VydmVyU29ja2V0RmFjdG9yeSkpOworICAgICAgICBzZXJ2ZXIucmVzZXQobmV3IHNlcnZlcjo6VE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3Nvciwgc29ja2V0KSk7CisJICAgICAgc2VydmVyLT5zZXRTZXJ2ZXJFdmVudEhhbmRsZXIobGlzdGVuSGFuZGxlcik7CisgICAgICAgIHNlcnZlci0+c2V0TnVtSU9UaHJlYWRzKDEpOworICAgICAgICBpZiAodXNlckV2ZW50QmFzZSkgeworICAgICAgICAgIHNlcnZlci0+cmVnaXN0ZXJFdmVudHModXNlckV2ZW50QmFzZS5nZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgc2VydmVyLT5zZXJ2ZSgpOworICAgICAgfSBjYXRjaCAoY29uc3QgdHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgICBpZiAocmV0cnlfY291bnQgPiAwKSB7CisgICAgICAgICAgKytwb3J0OworICAgICAgICAgIHN0YXJ0U2VydmVyKHJldHJ5X2NvdW50IC0gMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3c7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgc3RydWN0IEV2ZW50RGVsZXRlciB7CisgICAgdm9pZCBvcGVyYXRvcigpKGV2ZW50X2Jhc2UqIHApIHsgZXZlbnRfYmFzZV9mcmVlKHApOyB9CisgIH07CisKK3Byb3RlY3RlZDoKKyAgRml4dHVyZSgpIDogcHJvY2Vzc29yKG5ldyB0ZXN0OjpQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yKHN0ZDo6bWFrZV9zaGFyZWQ8SGFuZGxlcj4oKSkpIHt9CisKKyAgfkZpeHR1cmUoKSB7CisgICAgaWYgKHNlcnZlcikgeworICAgICAgc2VydmVyLT5zdG9wKCk7CisgICAgfQorICAgIGlmICh0aHJlYWQpIHsKKyAgICAgIHRocmVhZC0+am9pbigpOworICAgIH0KKyAgfQorCisgIHZvaWQgc2V0RXZlbnRCYXNlKGV2ZW50X2Jhc2UqIHVzZXJfZXZlbnRfYmFzZSkgeworICAgIHVzZXJFdmVudEJhc2VfLnJlc2V0KHVzZXJfZXZlbnRfYmFzZSwgRXZlbnREZWxldGVyKCkpOworICB9CisKKyAgaW50IHN0YXJ0U2VydmVyKGludCBwb3J0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFJ1bm5lcj4gcnVubmVyKG5ldyBSdW5uZXIpOworICAgIHJ1bm5lci0+cG9ydCA9IHBvcnQ7CisgICAgcnVubmVyLT5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisgICAgcnVubmVyLT51c2VyRXZlbnRCYXNlID0gdXNlckV2ZW50QmFzZV87CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KAorICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkoCisjaWYgIVVTRV9TVERfVEhSRUFECisgICAgICAgICAgICBjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5OjpPVEhFUiwgY29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeTo6Tk9STUFMLAorICAgICAgICAgICAgMSwKKyNlbmRpZgorICAgICAgICAgICAgZmFsc2UpKTsKKyAgICB0aHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQocnVubmVyKTsKKyAgICB0aHJlYWQtPnN0YXJ0KCk7CisgICAgcnVubmVyLT5yZWFkeUJhcnJpZXIoKTsKKworICAgIHNlcnZlciA9IHJ1bm5lci0+c2VydmVyOworICAgIHJldHVybiBydW5uZXItPnBvcnQ7CisgIH0KKworICBib29sIGNhbkNvbW11bmljYXRlKGludCBzZXJ2ZXJQb3J0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwQ2xpZW50U29ja2V0RmFjdG9yeSA9IGNyZWF0ZUNsaWVudFNvY2tldEZhY3RvcnkoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc29ja2V0ID0gcENsaWVudFNvY2tldEZhY3RvcnktPmNyZWF0ZVNvY2tldCgibG9jYWxob3N0Iiwgc2VydmVyUG9ydCk7CisgICAgc29ja2V0LT5vcGVuKCk7CisgICAgdGVzdDo6UGFyZW50U2VydmljZUNsaWVudCBjbGllbnQoc3RkOjptYWtlX3NoYXJlZDxwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sPigKKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDx0cmFuc3BvcnQ6OlRGcmFtZWRUcmFuc3BvcnQ+KHNvY2tldCkpKTsKKyAgICBjbGllbnQuYWRkU3RyaW5nKCJmb28iKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nczsKKyAgICBjbGllbnQuZ2V0U3RyaW5ncyhzdHJpbmdzKTsKKyAgICByZXR1cm4gc3RyaW5ncy5zaXplKCkgPT0gMSAmJiAhKHN0cmluZ3NbMF0uY29tcGFyZSgiZm9vIikpOworICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxldmVudF9iYXNlPiB1c2VyRXZlbnRCYXNlXzsKKyAgc3RkOjpzaGFyZWRfcHRyPHRlc3Q6OlBhcmVudFNlcnZpY2VQcm9jZXNzb3I+IHByb2Nlc3NvcjsKK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPHNlcnZlcjo6VE5vbmJsb2NraW5nU2VydmVyPiBzZXJ2ZXI7Citwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+IHRocmVhZDsKKworfTsKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QpCisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKGdldF9zcGVjaWZpZWRfcG9ydCwgRml4dHVyZSkgeworICBpbnQgc3BlY2lmaWVkX3BvcnQgPSBzdGFydFNlcnZlcigxMjM0NSk7CisgIEJPT1NUX1JFUVVJUkVfR0Uoc3BlY2lmaWVkX3BvcnQsIDEyMzQ1KTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChzZXJ2ZXItPmdldExpc3RlblBvcnQoKSwgc3BlY2lmaWVkX3BvcnQpOworICBCT09TVF9DSEVDSyhjYW5Db21tdW5pY2F0ZShzcGVjaWZpZWRfcG9ydCkpOworCisgIHNlcnZlci0+c3RvcCgpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShnZXRfYXNzaWduZWRfcG9ydCwgRml4dHVyZSkgeworICBpbnQgc3BlY2lmaWVkX3BvcnQgPSBzdGFydFNlcnZlcigwKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChzcGVjaWZpZWRfcG9ydCwgMCk7CisgIGludCBhc3NpZ25lZF9wb3J0ID0gc2VydmVyLT5nZXRMaXN0ZW5Qb3J0KCk7CisgIEJPT1NUX1JFUVVJUkVfTkUoYXNzaWduZWRfcG9ydCwgMCk7CisgIEJPT1NUX0NIRUNLKGNhbkNvbW11bmljYXRlKGFzc2lnbmVkX3BvcnQpKTsKKworICBzZXJ2ZXItPnN0b3AoKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UocHJvdmlkZV9ldmVudF9iYXNlLCBGaXh0dXJlKSB7CisgIGV2ZW50X2Jhc2UqIGViID0gZXZlbnRfYmFzZV9uZXcoKTsKKyAgc2V0RXZlbnRCYXNlKGViKTsKKyAgc3RhcnRTZXJ2ZXIoMCk7CisKKyAgLy8gYXNzZXJ0IHRoYXQgdGhlIHNlcnZlciB3b3JrcworICBCT09TVF9DSEVDSyhjYW5Db21tdW5pY2F0ZShzZXJ2ZXItPmdldExpc3RlblBvcnQoKSkpOworI2lmIExJQkVWRU5UX1ZFUlNJT05fTlVNQkVSID4gMHgwMjAxMDQwMAorICAvLyBhbHNvIGFzc2VydCB0aGF0IHRoZSBldmVudF9iYXNlIGlzIGFjdHVhbGx5IHVzZWQgd2hlbiBpdCdzIGVhc3kKKyAgQk9PU1RfQ0hFQ0tfR1QoZXZlbnRfYmFzZV9nZXRfbnVtX2V2ZW50cyhlYiwgRVZFTlRfQkFTRV9DT1VOVF9BRERFRCksIDApOworI2VuZGlmCit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NlcnZlclRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NlcnZlclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYmIyODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVE5vbmJsb2NraW5nU2VydmVyVGVzdC5jcHAKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgInRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmgiCisjaW5jbHVkZSAidGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oIgorI2luY2x1ZGUgInRocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmgiCisjaW5jbHVkZSAidGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaCIKKworI2luY2x1ZGUgImdlbi1jcHAvUGFyZW50U2VydmljZS5oIgorCisjaW5jbHVkZSA8ZXZlbnQuaD4KKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXg7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UnVubmFibGU7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI7Cit1c2luZyBzdGQ6Om1ha2Vfc2hhcmVkOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CisKK3N0cnVjdCBIYW5kbGVyIDogcHVibGljIHRlc3Q6OlBhcmVudFNlcnZpY2VJZiB7CisgIHZvaWQgYWRkU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7IHN0cmluZ3NfLnB1c2hfYmFjayhzKTsgfQorICB2b2lkIGdldFN0cmluZ3Moc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBfcmV0dXJuKSB7IF9yZXR1cm4gPSBzdHJpbmdzXzsgfQorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nc187CisKKyAgLy8gZHVtbXkgb3ZlcnJpZGVzIG5vdCB1c2VkIGluIHRoaXMgdGVzdAorICBpbnQzMl90IGluY3JlbWVudEdlbmVyYXRpb24oKSB7IHJldHVybiAwOyB9CisgIGludDMyX3QgZ2V0R2VuZXJhdGlvbigpIHsgcmV0dXJuIDA7IH0KKyAgdm9pZCBnZXREYXRhV2FpdChzdGQ6OnN0cmluZyYsIGNvbnN0IGludDMyX3QpIHt9CisgIHZvaWQgb25ld2F5V2FpdCgpIHt9CisgIHZvaWQgZXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYpIHt9CisgIHZvaWQgdW5leHBlY3RlZEV4Y2VwdGlvbldhaXQoY29uc3Qgc3RkOjpzdHJpbmcmKSB7fQorfTsKKworY2xhc3MgRml4dHVyZSB7Citwcml2YXRlOgorICBzdHJ1Y3QgTGlzdGVuRXZlbnRIYW5kbGVyIDogcHVibGljIFRTZXJ2ZXJFdmVudEhhbmRsZXIgeworICAgIHB1YmxpYzoKKyAgICAgIExpc3RlbkV2ZW50SGFuZGxlcihNdXRleCogbXV0ZXgpIDogbGlzdGVuTW9uaXRvcl8obXV0ZXgpLCByZWFkeV8oZmFsc2UpIHt9CisKKyAgICAgIHZvaWQgcHJlU2VydmUoKSAvKiBvdmVycmlkZSAqLyB7CisgICAgICAgIEd1YXJkIGcobGlzdGVuTW9uaXRvcl8ubXV0ZXgoKSk7CisgICAgICAgIHJlYWR5XyA9IHRydWU7CisgICAgICAgIGxpc3Rlbk1vbml0b3JfLm5vdGlmeSgpOworICAgICAgfQorCisgICAgICBNb25pdG9yIGxpc3Rlbk1vbml0b3JfOworICAgICAgYm9vbCByZWFkeV87CisgIH07CisKKyAgc3RydWN0IFJ1bm5lciA6IHB1YmxpYyBSdW5uYWJsZSB7CisgICAgaW50IHBvcnQ7CisgICAgc2hhcmVkX3B0cjxldmVudF9iYXNlPiB1c2VyRXZlbnRCYXNlOworICAgIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yOworICAgIHNoYXJlZF9wdHI8c2VydmVyOjpUTm9uYmxvY2tpbmdTZXJ2ZXI+IHNlcnZlcjsKKyAgICBzaGFyZWRfcHRyPExpc3RlbkV2ZW50SGFuZGxlcj4gbGlzdGVuSGFuZGxlcjsKKyAgICBzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0PiBzb2NrZXQ7CisgICAgTXV0ZXggbXV0ZXhfOworCisgICAgUnVubmVyKCkgeworICAgICAgbGlzdGVuSGFuZGxlci5yZXNldChuZXcgTGlzdGVuRXZlbnRIYW5kbGVyKCZtdXRleF8pKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcnVuKCkgeworICAgICAgLy8gV2hlbiBiaW5kaW5nIHRvIGV4cGxpY2l0IHBvcnQsIGFsbG93IHJldHJ5aW5nIHRvIHdvcmthcm91bmQgYmluZCBmYWlsdXJlcyBvbiBwb3J0cyBpbiB1c2UKKyAgICAgIGludCByZXRyeUNvdW50ID0gcG9ydCA/IDEwIDogMDsKKyAgICAgIHN0YXJ0U2VydmVyKHJldHJ5Q291bnQpOworICAgIH0KKworICAgIHZvaWQgcmVhZHlCYXJyaWVyKCkgeworICAgICAgLy8gYmxvY2sgdW50aWwgc2VydmVyIGlzIGxpc3RlbmluZyBhbmQgcmVhZHkgdG8gYWNjZXB0IGNvbm5lY3Rpb25zCisgICAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgICB3aGlsZSAoIWxpc3RlbkhhbmRsZXItPnJlYWR5XykgeworICAgICAgICBsaXN0ZW5IYW5kbGVyLT5saXN0ZW5Nb25pdG9yXy53YWl0KCk7CisgICAgICB9CisgICAgfQorICBwcml2YXRlOgorICAgIHZvaWQgc3RhcnRTZXJ2ZXIoaW50IHJldHJ5X2NvdW50KSB7CisgICAgICB0cnkgeworICAgICAgICBzb2NrZXQucmVzZXQobmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICAgICAgc2VydmVyLnJlc2V0KG5ldyBzZXJ2ZXI6OlROb25ibG9ja2luZ1NlcnZlcihwcm9jZXNzb3IsIHNvY2tldCkpOworICAgICAgICBzZXJ2ZXItPnNldFNlcnZlckV2ZW50SGFuZGxlcihsaXN0ZW5IYW5kbGVyKTsKKyAgICAgICAgaWYgKHVzZXJFdmVudEJhc2UpIHsKKyAgICAgICAgICBzZXJ2ZXItPnJlZ2lzdGVyRXZlbnRzKHVzZXJFdmVudEJhc2UuZ2V0KCkpOworICAgICAgICB9CisgICAgICAgIHNlcnZlci0+c2VydmUoKTsKKyAgICAgIH0gY2F0Y2ggKGNvbnN0IHRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgICAgaWYgKHJldHJ5X2NvdW50ID4gMCkgeworICAgICAgICAgICsrcG9ydDsKKyAgICAgICAgICBzdGFydFNlcnZlcihyZXRyeV9jb3VudCAtIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9OworCisgIHN0cnVjdCBFdmVudERlbGV0ZXIgeworICAgIHZvaWQgb3BlcmF0b3IoKShldmVudF9iYXNlKiBwKSB7IGV2ZW50X2Jhc2VfZnJlZShwKTsgfQorICB9OworCitwcm90ZWN0ZWQ6CisgIEZpeHR1cmUoKSA6IHByb2Nlc3NvcihuZXcgdGVzdDo6UGFyZW50U2VydmljZVByb2Nlc3NvcihtYWtlX3NoYXJlZDxIYW5kbGVyPigpKSkge30KKworICB+Rml4dHVyZSgpIHsKKyAgICBpZiAoc2VydmVyKSB7CisgICAgICBzZXJ2ZXItPnN0b3AoKTsKKyAgICB9CisgICAgaWYgKHRocmVhZCkgeworICAgICAgdGhyZWFkLT5qb2luKCk7CisgICAgfQorICB9CisKKyAgdm9pZCBzZXRFdmVudEJhc2UoZXZlbnRfYmFzZSogdXNlcl9ldmVudF9iYXNlKSB7CisgICAgdXNlckV2ZW50QmFzZV8ucmVzZXQodXNlcl9ldmVudF9iYXNlLCBFdmVudERlbGV0ZXIoKSk7CisgIH0KKworICBpbnQgc3RhcnRTZXJ2ZXIoaW50IHBvcnQpIHsKKyAgICBzaGFyZWRfcHRyPFJ1bm5lcj4gcnVubmVyKG5ldyBSdW5uZXIpOworICAgIHJ1bm5lci0+cG9ydCA9IHBvcnQ7CisgICAgcnVubmVyLT5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisgICAgcnVubmVyLT51c2VyRXZlbnRCYXNlID0gdXNlckV2ZW50QmFzZV87CisKKyAgICBzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkoCisgICAgICAgIG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoCisjaWYgIVVTRV9TVERfVEhSRUFECisgICAgICAgICAgICBQbGF0Zm9ybVRocmVhZEZhY3Rvcnk6Ok9USEVSLCBQbGF0Zm9ybVRocmVhZEZhY3Rvcnk6Ok5PUk1BTCwKKyAgICAgICAgICAgIDEsCisjZW5kaWYKKyAgICAgICAgICAgIGZhbHNlKSk7CisgICAgdGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHJ1bm5lcik7CisgICAgdGhyZWFkLT5zdGFydCgpOworICAgIHJ1bm5lci0+cmVhZHlCYXJyaWVyKCk7CisKKyAgICBzZXJ2ZXIgPSBydW5uZXItPnNlcnZlcjsKKyAgICByZXR1cm4gcnVubmVyLT5wb3J0OworICB9CisKKyAgYm9vbCBjYW5Db21tdW5pY2F0ZShpbnQgc2VydmVyUG9ydCkgeworICAgIHNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUU29ja2V0PiBzb2NrZXQobmV3IHRyYW5zcG9ydDo6VFNvY2tldCgibG9jYWxob3N0Iiwgc2VydmVyUG9ydCkpOworICAgIHNvY2tldC0+b3BlbigpOworICAgIHRlc3Q6OlBhcmVudFNlcnZpY2VDbGllbnQgY2xpZW50KG1ha2Vfc2hhcmVkPHByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w+KAorICAgICAgICBtYWtlX3NoYXJlZDx0cmFuc3BvcnQ6OlRGcmFtZWRUcmFuc3BvcnQ+KHNvY2tldCkpKTsKKyAgICBjbGllbnQuYWRkU3RyaW5nKCJmb28iKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nczsKKyAgICBjbGllbnQuZ2V0U3RyaW5ncyhzdHJpbmdzKTsKKyAgICByZXR1cm4gc3RyaW5ncy5zaXplKCkgPT0gMSAmJiAhKHN0cmluZ3NbMF0uY29tcGFyZSgiZm9vIikpOworICB9CisKK3ByaXZhdGU6CisgIHNoYXJlZF9wdHI8ZXZlbnRfYmFzZT4gdXNlckV2ZW50QmFzZV87CisgIHNoYXJlZF9wdHI8dGVzdDo6UGFyZW50U2VydmljZVByb2Nlc3Nvcj4gcHJvY2Vzc29yOworcHJvdGVjdGVkOgorICBzaGFyZWRfcHRyPHNlcnZlcjo6VE5vbmJsb2NraW5nU2VydmVyPiBzZXJ2ZXI7Citwcml2YXRlOgorICBzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkPiB0aHJlYWQ7CisKK307CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0KQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShnZXRfc3BlY2lmaWVkX3BvcnQsIEZpeHR1cmUpIHsKKyAgaW50IHNwZWNpZmllZF9wb3J0ID0gc3RhcnRTZXJ2ZXIoMTIzNDUpOworICBCT09TVF9SRVFVSVJFX0dFKHNwZWNpZmllZF9wb3J0LCAxMjM0NSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoc2VydmVyLT5nZXRMaXN0ZW5Qb3J0KCksIHNwZWNpZmllZF9wb3J0KTsKKyAgQk9PU1RfQ0hFQ0soY2FuQ29tbXVuaWNhdGUoc3BlY2lmaWVkX3BvcnQpKTsKKworICBzZXJ2ZXItPnN0b3AoKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoZ2V0X2Fzc2lnbmVkX3BvcnQsIEZpeHR1cmUpIHsKKyAgaW50IHNwZWNpZmllZF9wb3J0ID0gc3RhcnRTZXJ2ZXIoMCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoc3BlY2lmaWVkX3BvcnQsIDApOworICBpbnQgYXNzaWduZWRfcG9ydCA9IHNlcnZlci0+Z2V0TGlzdGVuUG9ydCgpOworICBCT09TVF9SRVFVSVJFX05FKGFzc2lnbmVkX3BvcnQsIDApOworICBCT09TVF9DSEVDSyhjYW5Db21tdW5pY2F0ZShhc3NpZ25lZF9wb3J0KSk7CisKKyAgc2VydmVyLT5zdG9wKCk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHByb3ZpZGVfZXZlbnRfYmFzZSwgRml4dHVyZSkgeworICBldmVudF9iYXNlKiBlYiA9IGV2ZW50X2Jhc2VfbmV3KCk7CisgIHNldEV2ZW50QmFzZShlYik7CisgIHN0YXJ0U2VydmVyKDApOworCisgIC8vIGFzc2VydCB0aGF0IHRoZSBzZXJ2ZXIgd29ya3MKKyAgQk9PU1RfQ0hFQ0soY2FuQ29tbXVuaWNhdGUoc2VydmVyLT5nZXRMaXN0ZW5Qb3J0KCkpKTsKKyNpZiBMSUJFVkVOVF9WRVJTSU9OX05VTUJFUiA+IDB4MDIwMTA0MDAKKyAgLy8gYWxzbyBhc3NlcnQgdGhhdCB0aGUgZXZlbnRfYmFzZSBpcyBhY3R1YWxseSB1c2VkIHdoZW4gaXQncyBlYXN5CisgIEJPT1NUX0NIRUNLX0dUKGV2ZW50X2Jhc2VfZ2V0X251bV9ldmVudHMoZWIsIEVWRU5UX0JBU0VfQ09VTlRfQURERUQpLCAwKTsKKyNlbmRpZgorfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UUGlwZUludGVycnVwdFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RQaXBlSW50ZXJydXB0VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyM2Y1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9UUGlwZUludGVycnVwdFRlc3QuY3BwCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmZGVmIF9XSU4zMgorCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC90ZXN0X3Rvb2xzLmhwcD4KKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdF9zdWl0ZS5ocHA+CisKKyNpbmNsdWRlIDxib29zdC9jaHJvbm8vZHVyYXRpb24uaHBwPgorI2luY2x1ZGUgPGJvb3N0L2RhdGVfdGltZS9wb3NpeF90aW1lL3Bvc2l4X3RpbWVfZHVyYXRpb24uaHBwPgorI2luY2x1ZGUgPGJvb3N0L3RocmVhZC90aHJlYWQuaHBwPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFBpcGUuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUGlwZVNlcnZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRQaXBlOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShUUGlwZUludGVycnVwdFRlc3QpCisKKy8vIFRPRE86IGR1cGxpY2F0ZSB0aGUgdGVzdCBjYXNlcyBpbiBUU29ja2V0SW50ZXJydXB0VGVzdCBmb3IgcGlwZXMsCisvLyBvbmNlIHBpcGVzIGltcGxlbWVudCBpbnRlcnJ1cHRDaGlsZHJlbgorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2ludGVycnVwdF9iZWZvcmVfYWNjZXB0KSB7CisgIFRQaXBlU2VydmVyIHBpcGUxKCJUUGlwZUludGVycnVwdFRlc3QiKTsKKyAgcGlwZTEubGlzdGVuKCk7CisgIHBpcGUxLmludGVycnVwdCgpOworICBCT09TVF9DSEVDS19USFJPVyhwaXBlMS5hY2NlcHQoKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkIGFjY2VwdFdvcmtlcihUUGlwZVNlcnZlciAqcGlwZSkgeworICB0cnkKKyAgeworICAgIGZvciAoOzspCisgICAgeworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRlbXAgPSBwaXBlLT5hY2NlcHQoKTsKKyAgICB9CisgIH0KKyAgY2F0Y2ggKC4uLikgey8qanVzdCB3YW50IHRvIG1ha2Ugc3VyZSBub3RoaW5nIGNyYXNoZXMqLyB9Cit9CisKK3N0YXRpYyB2b2lkIGludGVycnVwdFdvcmtlcihUUGlwZVNlcnZlciAqcGlwZSkgeworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoMTApKTsKKyAgcGlwZS0+aW50ZXJydXB0KCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHN0cmVzc19waXBlX2FjY2VwdF9pbnRlcnJ1cHRpb24pIHsKKyAgaW50IGludGVycnVwdEl0ZXJzID0gMTA7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcnJ1cHRJdGVyczsgKytpKQorICB7CisgICAgVFBpcGVTZXJ2ZXIgcGlwZVNlcnZlcigiVFBpcGVJbnRlcnJ1cHRUZXN0Iik7CisgICAgcGlwZVNlcnZlci5saXN0ZW4oKTsKKyAgICBib29zdDo6dGhyZWFkIGFjY2VwdFRocmVhZChzdGQ6OmJpbmQoYWNjZXB0V29ya2VyLCAmcGlwZVNlcnZlcikpOworICAgIGJvb3N0Ojp0aHJlYWQgaW50ZXJydXB0VGhyZWFkKHN0ZDo6YmluZChpbnRlcnJ1cHRXb3JrZXIsICZwaXBlU2VydmVyKSk7CisgICAgdHJ5CisgICAgeworICAgICAgZm9yICg7OykKKyAgICAgIHsKKyAgICAgICAgVFBpcGUgY2xpZW50KCJUUGlwZUludGVycnVwdFRlc3QiKTsKKyAgICAgICAgY2xpZW50LnNldENvbm5UaW1lb3V0KDEpOworICAgICAgICBjbGllbnQub3BlbigpOworICAgICAgfQorICAgIH0gY2F0Y2ggKC4uLikgeyAvKmp1c3QgdGVzdGluZyBmb3IgY3Jhc2hlcyovIH0KKyAgICBpbnRlcnJ1cHRUaHJlYWQuam9pbigpOworICAgIGFjY2VwdFRocmVhZC5qb2luKCk7CisgIH0KK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UUGlwZWRUcmFuc3BvcnRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UUGlwZWRUcmFuc3BvcnRUZXN0LmNwcAppbmRleCA1NzA4ZmQyLi5mMzA5MWE0IDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvVFBpcGVkVHJhbnNwb3J0VGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1RQaXBlZFRyYW5zcG9ydFRlc3QuY3BwCkBAIC0xNywzOCArMTcsMzcgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KLSNpbmNsdWRlIDxUaHJpZnQuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7CisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBUUGlwZWRUcmFuc3BvcnRUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFBpcGVkVHJhbnNwb3J0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKIAotaW50IG1haW4oKSB7Ci0gIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gdW5kZXJseWluZyhuZXcgVE1lbW9yeUJ1ZmZlcik7Ci0gIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gcGlwZShuZXcgVE1lbW9yeUJ1ZmZlcik7Ci0gIHNoYXJlZF9wdHI8VFBpcGVkVHJhbnNwb3J0PiB0cmFucyhuZXcgVFBpcGVkVHJhbnNwb3J0KHVuZGVybHlpbmcsIHBpcGUpKTsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVhZF93cml0ZSkgeworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gdW5kZXJseWluZyhuZXcgVE1lbW9yeUJ1ZmZlcik7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBwaXBlKG5ldyBUTWVtb3J5QnVmZmVyKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQaXBlZFRyYW5zcG9ydD4gdHJhbnMobmV3IFRQaXBlZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCBwaXBlKSk7CiAKICAgdWludDhfdCBidWZmZXJbNF07CiAKICAgdW5kZXJseWluZy0+d3JpdGUoKHVpbnQ4X3QqKSJhYmNkIiwgNCk7CiAgIHRyYW5zLT5yZWFkQWxsKGJ1ZmZlciwgMik7Ci0gIGFzc2VydCggc3RyaW5nKChjaGFyKilidWZmZXIsIDIpID09ICJhYiIgKTsKKyAgQk9PU1RfQ0hFQ0soc3RkOjpzdHJpbmcoKGNoYXIqKWJ1ZmZlciwgMikgPT0gImFiIik7CiAgIHRyYW5zLT5yZWFkRW5kKCk7Ci0gIGFzc2VydCggcGlwZS0+Z2V0QnVmZmVyQXNTdHJpbmcoKSA9PSAiYWIiICk7CisgIEJPT1NUX0NIRUNLKHBpcGUtPmdldEJ1ZmZlckFzU3RyaW5nKCkgPT0gImFiIik7CiAgIHBpcGUtPnJlc2V0QnVmZmVyKCk7CiAgIHVuZGVybHlpbmctPndyaXRlKCh1aW50OF90KikiZWYiLCAyKTsKICAgdHJhbnMtPnJlYWRBbGwoYnVmZmVyLCAyKTsKLSAgYXNzZXJ0KCBzdHJpbmcoKGNoYXIqKWJ1ZmZlciwgMikgPT0gImNkIiApOworICBCT09TVF9DSEVDSyhzdGQ6OnN0cmluZygoY2hhciopYnVmZmVyLCAyKSA9PSAiY2QiKTsKICAgdHJhbnMtPnJlYWRBbGwoYnVmZmVyLCAyKTsKLSAgYXNzZXJ0KCBzdHJpbmcoKGNoYXIqKWJ1ZmZlciwgMikgPT0gImVmIiApOworICBCT09TVF9DSEVDSyhzdGQ6OnN0cmluZygoY2hhciopYnVmZmVyLCAyKSA9PSAiZWYiKTsKICAgdHJhbnMtPnJlYWRFbmQoKTsKLSAgYXNzZXJ0KCBwaXBlLT5nZXRCdWZmZXJBc1N0cmluZygpID09ICJjZGVmIiApOwotCi0gIHJldHVybiAwOwotCisgIEJPT1NUX0NIRUNLKHBpcGUtPmdldEJ1ZmZlckFzU3RyaW5nKCkgPT0gImNkZWYiKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UU1NMU29ja2V0SW50ZXJydXB0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVFNTTFNvY2tldEludGVycnVwdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZjY4NmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVFNTTFNvY2tldEludGVycnVwdFRlc3QuY3BwCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdF9zdWl0ZS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvY2hyb25vL2R1cmF0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC9kYXRlX3RpbWUvcG9zaXhfdGltZS9wb3NpeF90aW1lX2R1cmF0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC90aHJlYWQvdGhyZWFkLmhwcD4KKyNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtLmhwcD4KKyNpbmNsdWRlIDxib29zdC9mb3JtYXQuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaD4KKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNlbmRpZgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU1NMU2VydmVyU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNTTFNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNTTFNvY2tldEZhY3Rvcnk7CisKK3VzaW5nIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFRTU0xTb2NrZXRJbnRlcnJ1cHRUZXN0KQorCitib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBrZXlEaXI7Citib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBjZXJ0RmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpCit7CisgIHJldHVybiBrZXlEaXIgLyBmaWxlbmFtZTsKK30KK2Jvb3N0OjptdXRleCBnTXV0ZXg7CisKK3N0cnVjdCBHbG9iYWxGaXh0dXJlU1NMCit7CisgICAgR2xvYmFsRml4dHVyZVNTTCgpCisgICAgeworICAgICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmdjOyArK2kpCisgICAgICB7CisgICAgICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJhcmd2WyUxJV0gPSBcIiUyJVwiIikgJSBpICUgbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2W2ldKTsKKyAgICAgIH0KKworI2lmZGVmIF9fbGludXhfXworICAgICAgLy8gT3BlblNTTCBjYWxscyBzZW5kKCkgd2l0aG91dCBNU0dfTk9TSUdQSVBFIHNvIHdyaXRpbmcgdG8gYSBzb2NrZXQgdGhhdCBoYXMKKyAgICAgIC8vIGRpc2Nvbm5lY3RlZCBjYW4gY2F1c2UgYSBTSUdQSVBFIHNpZ25hbC4uLgorICAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworI2VuZGlmCisKKyAgICAgIFRTU0xTb2NrZXRGYWN0b3J5OjpzZXRNYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb24odHJ1ZSk7CisgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ojppbml0aWFsaXplT3BlblNTTCgpOworCisgICAgICBrZXlEaXIgPSBib29zdDo6ZmlsZXN5c3RlbTo6Y3VycmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkgLyAidGVzdCIgLyAia2V5cyI7CisgICAgICBpZiAoIWJvb3N0OjpmaWxlc3lzdGVtOjpleGlzdHMoY2VydEZpbGUoInNlcnZlci5jcnQiKSkpCisgICAgICB7CisgICAgICAgIGtleURpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpwYXRoKG1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJndlttYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2MgLSAxXSk7CisgICAgICAgIGlmICghYm9vc3Q6OmZpbGVzeXN0ZW06OmV4aXN0cyhjZXJ0RmlsZSgic2VydmVyLmNydCIpKSkKKyAgICAgICAgeworICAgICAgICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiVGhlIGxhc3QgYXJndW1lbnQgdG8gdGhpcyB0ZXN0IG11c3QgYmUgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0ZXN0IGNlcnRpZmljYXRlKHMpLiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB+R2xvYmFsRml4dHVyZVNTTCgpCisgICAgeworICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6Y2xlYW51cE9wZW5TU0woKTsKKyNpZmRlZiBfX2xpbnV4X18KKyAgICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfREZMKTsKKyNlbmRpZgorICAgIH0KK307CisKKyNpZiAoQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDApCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlU1NMKTsKKyNlbHNlCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlU1NMKQorI2VuZGlmCisKK3ZvaWQgcmVhZGVyV29ya2VyKHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQsIHVpbnQzMl90IGV4cGVjdGVkUmVzdWx0KSB7CisgIHVpbnQ4X3QgYnVmWzRdOworICB0cnkgeworICAgIHR0LT5yZWFkKGJ1ZiwgMSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXhwZWN0ZWRSZXN1bHQsIHR0LT5yZWFkKGJ1ZiwgNCkpOworICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0eCkgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwgdHguZ2V0VHlwZSgpKTsKKyAgfQorfQorCit2b2lkIHJlYWRlcldvcmtlck11c3RUaHJvdyhzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHR0KSB7CisgIHRyeSB7CisgICAgdWludDhfdCBidWZbNDAwXTsKKyAgICB0dC0+cmVhZChidWYsIDEpOworICAgIHR0LT5yZWFkKGJ1ZiwgNDAwKTsKKyAgICBCT09TVF9FUlJPUigic2hvdWxkIG5vdCBoYXZlIGdvdHRlbiBoZXJlIik7CisgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR4KSB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQsIHR4LmdldFR5cGUoKSk7CisgIH0KK30KKworc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpIHsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3Rvcnk7CisKKyAgcFNlcnZlclNvY2tldEZhY3RvcnkucmVzZXQobmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOworICBwU2VydmVyU29ja2V0RmFjdG9yeS0+Y2lwaGVycygiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIik7CisgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoY2VydEZpbGUoInNlcnZlci5jcnQiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgcFNlcnZlclNvY2tldEZhY3RvcnktPmxvYWRQcml2YXRlS2V5KGNlcnRGaWxlKCJzZXJ2ZXIua2V5Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5zZXJ2ZXIodHJ1ZSk7CisgIHJldHVybiBwU2VydmVyU29ja2V0RmFjdG9yeTsKK30KKworc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpIHsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3Rvcnk7CisKKyAgcENsaWVudFNvY2tldEZhY3RvcnkucmVzZXQobmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+YXV0aGVudGljYXRlKHRydWUpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKGNlcnRGaWxlKCJjbGllbnQuY3J0Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShjZXJ0RmlsZSgiY2xpZW50LmtleSIpLnN0cmluZygpLmNfc3RyKCkpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY2VydEZpbGUoIkNBLnBlbSIpLnN0cmluZygpLmNfc3RyKCkpOworICByZXR1cm4gcENsaWVudFNvY2tldEZhY3Rvcnk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3NsX2ludGVycnVwdGFibGVfY2hpbGRfcmVhZF93aGlsZV9oYW5kc2hha2luZykgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeSA9IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKTsKKyAgVFNTTFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpOworICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5ID0gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNsaWVudFNvY2sgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay0+b3BlbigpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGJvb3N0Ojp0aHJlYWQgcmVhZFRocmVhZChzdGQ6OmJpbmQocmVhZGVyV29ya2VyTXVzdFRocm93LCBhY2NlcHRlZCkpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcmVhZFRocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIG5vdworICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOworICBCT09TVF9DSEVDS19NRVNTQUdFKHJlYWRUaHJlYWQudHJ5X2pvaW5fZm9yKGJvb3N0OjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMCkpLAorICAic2VydmVyIHNvY2tldCBpbnRlcnJ1cHRDaGlsZHJlbiBkaWQgbm90IGludGVycnVwdCBjaGlsZCByZWFkIik7CisgIGNsaWVudFNvY2stPmNsb3NlKCk7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3NzbF9pbnRlcnJ1cHRhYmxlX2NoaWxkX3JlYWQpIHsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3RvcnkgPSBjcmVhdGVTZXJ2ZXJTb2NrZXRGYWN0b3J5KCk7CisgIFRTU0xTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDAsIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5KTsKKyAgc29jazEubGlzdGVuKCk7CisgIGludCBwb3J0ID0gc29jazEuZ2V0UG9ydCgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwQ2xpZW50U29ja2V0RmFjdG9yeSA9IGNyZWF0ZUNsaWVudFNvY2tldEZhY3RvcnkoKTsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjbGllbnRTb2NrID0gcENsaWVudFNvY2tldEZhY3RvcnktPmNyZWF0ZVNvY2tldCgibG9jYWxob3N0IiwgcG9ydCk7CisgIGNsaWVudFNvY2stPm9wZW4oKTsKKyAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRlZCA9IHNvY2sxLmFjY2VwdCgpOworICBib29zdDo6dGhyZWFkIHJlYWRUaHJlYWQoc3RkOjpiaW5kKHJlYWRlcldvcmtlck11c3RUaHJvdywgYWNjZXB0ZWQpKTsKKyAgY2xpZW50U29jay0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QqKSIwIiwgMSk7CisgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcyg1MCkpOworICAvLyByZWFkVGhyZWFkIGlzIHByYWN0aWNhbGx5IGd1YXJhbnRlZWQgdG8gYmUgYmxvY2tpbmcgbm93CisgIHNvY2sxLmludGVycnVwdENoaWxkcmVuKCk7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UocmVhZFRocmVhZC50cnlfam9pbl9mb3IoYm9vc3Q6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwKSksCisgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBzb2NrZXQgaW50ZXJydXB0Q2hpbGRyZW4gZGlkIG5vdCBpbnRlcnJ1cHQgY2hpbGQgcmVhZCIpOworICBhY2NlcHRlZC0+Y2xvc2UoKTsKKyAgY2xpZW50U29jay0+Y2xvc2UoKTsKKyAgc29jazEuY2xvc2UoKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zc2xfbm9uX2ludGVycnVwdGFibGVfY2hpbGRfcmVhZCkgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeSA9IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKTsKKyAgVFNTTFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpOworICBzb2NrMS5zZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oZmFsc2UpOyAvLyByZXR1cm5zIHRvIHByZS1USFJJRlQtMjQ0MSBiZWhhdmlvcgorICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5ID0gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNsaWVudFNvY2sgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay0+b3BlbigpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIHN0YXRpY19wb2ludGVyX2Nhc3Q8VFNTTFNvY2tldD4oYWNjZXB0ZWQpLT5zZXRSZWN2VGltZW91dCgxMDAwKTsKKyAgYm9vc3Q6OnRocmVhZCByZWFkVGhyZWFkKHN0ZDo6YmluZChyZWFkZXJXb3JrZXIsIGFjY2VwdGVkLCAwKSk7CisgIGNsaWVudFNvY2stPndyaXRlKChjb25zdCB1aW50OF90KikiMCIsIDEpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcmVhZFRocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIGhlcmUKKyAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghcmVhZFRocmVhZC50cnlfam9pbl9mb3IoYm9vc3Q6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwMCkpLAorICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgc29ja2V0IGludGVycnVwdENoaWxkcmVuIGludGVycnVwdGVkIGNoaWxkIHJlYWQiKTsKKworICAvLyB3YWl0IGZvciByZWNlaXZlIHRpbWVvdXQgdG8ga2ljayBpbgorICByZWFkVGhyZWFkLmpvaW4oKTsKKyAgYWNjZXB0ZWQtPmNsb3NlKCk7CisgIGNsaWVudFNvY2stPmNsb3NlKCk7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3NsX2Nhbm5vdF9jaGFuZ2VfYWZ0ZXJfbGlzdGVuKSB7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBTZXJ2ZXJTb2NrZXRGYWN0b3J5ID0gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpOworICBUU1NMU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwLCBwU2VydmVyU29ja2V0RmFjdG9yeSk7CisgIHNvY2sxLmxpc3RlbigpOworICBCT09TVF9DSEVDS19USFJPVyhzb2NrMS5zZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oZmFsc2UpLCBzdGQ6OmxvZ2ljX2Vycm9yKTsKKyAgc29jazEuY2xvc2UoKTsKK30KKwordm9pZCBwZWVrZXJXb3JrZXIoc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCwgYm9vbCBleHBlY3RlZFJlc3VsdCkgeworICB1aW50OF90IGJ1Zls0MDBdOworICB0cnkgeworICAgIHR0LT5yZWFkKGJ1ZiwgMSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXhwZWN0ZWRSZXN1bHQsIHR0LT5wZWVrKCkpOworICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0eCkgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwgdHguZ2V0VHlwZSgpKTsKKyAgfQorfQorCit2b2lkIHBlZWtlcldvcmtlckludGVycnVwdChzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHR0KSB7CisgIHVpbnQ4X3QgYnVmWzQwMF07CisgIHRyeSB7CisgICAgdHQtPnJlYWQoYnVmLCAxKTsKKyAgICB0dC0+cGVlaygpOworICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0eCkgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVELCB0eC5nZXRUeXBlKCkpOworICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3NsX2ludGVycnVwdGFibGVfY2hpbGRfcGVlaykgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeSA9IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKTsKKyAgVFNTTFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpOworICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5ID0gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNsaWVudFNvY2sgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay0+b3BlbigpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGJvb3N0Ojp0aHJlYWQgcGVla1RocmVhZChzdGQ6OmJpbmQocGVla2VyV29ya2VySW50ZXJydXB0LCBhY2NlcHRlZCkpOworICBjbGllbnRTb2NrLT53cml0ZSgoY29uc3QgdWludDhfdCopIjAiLCAxKTsKKyAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKDUwKSk7CisgIC8vIHBlZWtUaHJlYWQgaXMgcHJhY3RpY2FsbHkgZ3VhcmFudGVlZCB0byBiZSBibG9ja2luZyBub3cKKyAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShwZWVrVGhyZWFkLnRyeV9qb2luX2Zvcihib29zdDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjAwKSksCisgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBzb2NrZXQgaW50ZXJydXB0Q2hpbGRyZW4gZGlkIG5vdCBpbnRlcnJ1cHQgY2hpbGQgcGVlayIpOworICBhY2NlcHRlZC0+Y2xvc2UoKTsKKyAgY2xpZW50U29jay0+Y2xvc2UoKTsKKyAgc29jazEuY2xvc2UoKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zc2xfbm9uX2ludGVycnVwdGFibGVfY2hpbGRfcGVlaykgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeSA9IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKTsKKyAgVFNTTFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpOworICBzb2NrMS5zZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oZmFsc2UpOyAvLyByZXR1cm5zIHRvIHByZS1USFJJRlQtMjQ0MSBiZWhhdmlvcgorICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5ID0gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNsaWVudFNvY2sgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay0+b3BlbigpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIHN0YXRpY19wb2ludGVyX2Nhc3Q8VFNTTFNvY2tldD4oYWNjZXB0ZWQpLT5zZXRSZWN2VGltZW91dCgxMDAwKTsKKyAgYm9vc3Q6OnRocmVhZCBwZWVrVGhyZWFkKHN0ZDo6YmluZChwZWVrZXJXb3JrZXIsIGFjY2VwdGVkLCBmYWxzZSkpOworICBjbGllbnRTb2NrLT53cml0ZSgoY29uc3QgdWludDhfdCopIjAiLCAxKTsKKyAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKDUwKSk7CisgIC8vIHBlZWtUaHJlYWQgaXMgcHJhY3RpY2FsbHkgZ3VhcmFudGVlZCB0byBiZSBibG9ja2luZyBub3cKKyAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghcGVla1RocmVhZC50cnlfam9pbl9mb3IoYm9vc3Q6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwMCkpLAorICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgc29ja2V0IGludGVycnVwdENoaWxkcmVuIGludGVycnVwdGVkIGNoaWxkIHBlZWsiKTsKKworICAvLyB3YWl0IGZvciB0aGUgcmVjZWl2ZSB0aW1lb3V0IHRvIGtpY2sgaW4KKyAgcGVla1RocmVhZC5qb2luKCk7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBjbGllbnRTb2NrLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UU2VydmVySW50ZWdyYXRpb25UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UU2VydmVySW50ZWdyYXRpb25UZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTc2YzhiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1RTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QuY3BwCkBAIC0wLDAgKzEsNTM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgVFNlcnZlckludGVncmF0aW9uVGVzdAorI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC9kYXRlX3RpbWUvcG9zaXhfdGltZS9wdGltZS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZm9yZWFjaC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZm9ybWF0LmhwcD4KKyNpbmNsdWRlIDxib29zdC90aHJlYWQuaHBwPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSAiZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXg7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2xGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2ltcGxlU2VydmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFRocmVhZFBvb2xTZXJ2ZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXI7Cit1c2luZyBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0OwordXNpbmcgc3RkOjptYWtlX3NoYXJlZDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0OjpQYXJlbnRTZXJ2aWNlQ2xpZW50OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRlc3Q6OlBhcmVudFNlcnZpY2VJZjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0OjpQYXJlbnRTZXJ2aWNlSWZGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRlc3Q6OlBhcmVudFNlcnZpY2VJZlNpbmdsZXRvbkZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dGVzdDo6UGFyZW50U2VydmljZVByb2Nlc3NvcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0OjpQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5OwordXNpbmcgYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kczsKKworLyoqCisgKiBwcmVTZXJ2ZSBydW5zIGFmdGVyIGxpc3RlbigpIGlzIHN1Y2Nlc3NmdWwsIHdoZW4gd2UgY2FuIGNvbm5lY3QKKyAqLworY2xhc3MgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyIDogcHVibGljIFRTZXJ2ZXJFdmVudEhhbmRsZXIsIHB1YmxpYyBNb25pdG9yIHsKK3B1YmxpYzoKKyAgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKCkgOiBpc0xpc3RlbmluZ18oZmFsc2UpLCBhY2NlcHRlZF8oMCkge30KKyAgdmlydHVhbCB+VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKCkge30KKyAgdmlydHVhbCB2b2lkIHByZVNlcnZlKCkgeworICAgIFN5bmNocm9uaXplZCBzeW5jKCp0aGlzKTsKKyAgICBpc0xpc3RlbmluZ18gPSB0cnVlOworICAgIG5vdGlmeSgpOworICB9CisgIHZpcnR1YWwgdm9pZCogY3JlYXRlQ29udGV4dChzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0KSB7CisgICAgU3luY2hyb25pemVkIHN5bmMoKnRoaXMpOworICAgICsrYWNjZXB0ZWRfOworICAgIG5vdGlmeSgpOworCisgICAgKHZvaWQpaW5wdXQ7CisgICAgKHZvaWQpb3V0cHV0OworICAgIHJldHVybiBOVUxMOworICB9CisgIGJvb2wgaXNMaXN0ZW5pbmcoKSBjb25zdCB7IHJldHVybiBpc0xpc3RlbmluZ187IH0KKyAgdWludDY0X3QgYWNjZXB0ZWRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIGFjY2VwdGVkXzsgfQorCitwcml2YXRlOgorICBib29sIGlzTGlzdGVuaW5nXzsKKyAgdWludDY0X3QgYWNjZXB0ZWRfOworfTsKKworLyoqCisgKiBSZXVzaW5nIGFub3RoZXIgZ2VuZXJhdGVkIHRlc3QsIGp1c3Qgc29tZXRoaW5nIHRvIHNlcnZlIHVwCisgKi8KK2NsYXNzIFBhcmVudEhhbmRsZXIgOiBwdWJsaWMgUGFyZW50U2VydmljZUlmIHsKK3B1YmxpYzoKKyAgUGFyZW50SGFuZGxlcigpIDogZ2VuZXJhdGlvbl8oMCkge30KKworICBpbnQzMl90IGluY3JlbWVudEdlbmVyYXRpb24oKSB7CisgICAgR3VhcmQgZyhtdXRleF8pOworICAgIHJldHVybiArK2dlbmVyYXRpb25fOworICB9CisKKyAgaW50MzJfdCBnZXRHZW5lcmF0aW9uKCkgeworICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICByZXR1cm4gZ2VuZXJhdGlvbl87CisgIH0KKworICB2b2lkIGFkZFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgcykgeworICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICBzdHJpbmdzXy5wdXNoX2JhY2socyk7CisgIH0KKworICB2b2lkIGdldFN0cmluZ3Moc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBfcmV0dXJuKSB7CisgICAgR3VhcmQgZyhtdXRleF8pOworICAgIF9yZXR1cm4gPSBzdHJpbmdzXzsKKyAgfQorCisgIHZvaWQgZ2V0RGF0YVdhaXQoc3RkOjpzdHJpbmcmIF9yZXR1cm4sIGNvbnN0IGludDMyX3QgbGVuZ3RoKSB7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShfcmV0dXJuKTsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGxlbmd0aCk7CisgIH0KKworICB2b2lkIG9uZXdheVdhaXQoKSB7fQorCisgIHZvaWQgZXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeyBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKG1lc3NhZ2UpOyB9CisKKyAgdm9pZCB1bmV4cGVjdGVkRXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeyBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKG1lc3NhZ2UpOyB9CisKK3Byb3RlY3RlZDoKKyAgTXV0ZXggbXV0ZXhfOworICBpbnQzMl90IGdlbmVyYXRpb25fOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nc187Cit9OworCit2b2lkIGF1dG9Tb2NrZXRDbG9zZXIoVFNvY2tldCogcFNvY2spIHsKKyAgcFNvY2stPmNsb3NlKCk7CisgIGRlbGV0ZSBwU29jazsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRTZXJ2ZXJUeXBlPgorY2xhc3MgVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmUgeworcHVibGljOgorICBUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZShjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgX3Byb2Nlc3NvckZhY3RvcnkpCisgICAgOiBwU2VydmVyKG5ldyBUU2VydmVyVHlwZShfcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRTZXJ2ZXJTb2NrZXQoImxvY2FsaG9zdCIsIDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KSkpLAorICAgICAgcEV2ZW50SGFuZGxlcihzaGFyZWRfcHRyPFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcj4obmV3IFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcikpLAorICAgIGJTdHJlc3NEb25lKGZhbHNlKSwKKyAgICBiU3RyZXNzQ29ubmVjdGlvbkNvdW50KDApLAorICAgIGJTdHJlc3NSZXF1ZXN0Q291bnQoMCkgeworICAgIHBTZXJ2ZXItPnNldFNlcnZlckV2ZW50SGFuZGxlcihwRXZlbnRIYW5kbGVyKTsKKyAgfQorCisgIFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIF9wcm9jZXNzb3IpCisgICAgOiBwU2VydmVyKAorICAgICAgICAgIG5ldyBUU2VydmVyVHlwZShfcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+KG5ldyBUU2VydmVyU29ja2V0KCJsb2NhbGhvc3QiLCAwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkpKSksCisgICAgICBwRXZlbnRIYW5kbGVyKHNoYXJlZF9wdHI8VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyPihuZXcgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKSksCisgICAgICBiU3RyZXNzRG9uZShmYWxzZSksCisgICAgYlN0cmVzc0Nvbm5lY3Rpb25Db3VudCgwKSwKKyAgICBiU3RyZXNzUmVxdWVzdENvdW50KDApIHsKKyAgICBwU2VydmVyLT5zZXRTZXJ2ZXJFdmVudEhhbmRsZXIocEV2ZW50SGFuZGxlcik7CisgIH0KKworICB2b2lkIHN0YXJ0U2VydmVyKCkgeworICAgIHBTZXJ2ZXJUaHJlYWQucmVzZXQobmV3IGJvb3N0Ojp0aHJlYWQoc3RkOjpiaW5kKCZUU2VydmVyVHlwZTo6c2VydmUsIHBTZXJ2ZXIuZ2V0KCkpKSk7CisKKyAgICAvLyBibG9jayB1bnRpbCBsaXN0ZW4oKSBjb21wbGV0ZXMgc28gY2xpZW50cyB3aWxsIGJlIGFibGUgdG8gY29ubmVjdAorICAgIFN5bmNocm9uaXplZCBzeW5jKCoocEV2ZW50SGFuZGxlci5nZXQoKSkpOworICAgIHdoaWxlICghcEV2ZW50SGFuZGxlci0+aXNMaXN0ZW5pbmcoKSkgeworICAgICAgcEV2ZW50SGFuZGxlci0+d2FpdCgpOworICAgIH0KKworICAgIEJPT1NUX1RFU1RfTUVTU0FHRSgiICBzZXJ2ZXIgaXMgbGlzdGVuaW5nIik7CisgIH0KKworICB2b2lkIGJsb2NrVW50aWxBY2NlcHRlZCh1aW50NjRfdCBudW1BY2NlcHRlZCkgeworICAgIFN5bmNocm9uaXplZCBzeW5jKCoocEV2ZW50SGFuZGxlci5nZXQoKSkpOworICAgIHdoaWxlIChwRXZlbnRIYW5kbGVyLT5hY2NlcHRlZENvdW50KCkgPCBudW1BY2NlcHRlZCkgeworICAgICAgcEV2ZW50SGFuZGxlci0+d2FpdCgpOworICAgIH0KKworICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCIgIHNlcnZlciBoYXMgYWNjZXB0ZWQgJTElIikgJSBudW1BY2NlcHRlZCk7CisgIH0KKworICB2b2lkIHN0b3BTZXJ2ZXIoKSB7CisgICAgaWYgKHBTZXJ2ZXJUaHJlYWQpIHsKKyAgICAgIHBTZXJ2ZXItPnN0b3AoKTsKKyAgICAgIEJPT1NUX1RFU1RfTUVTU0FHRSgiICBzZXJ2ZXIgc3RvcCBjb21wbGV0ZWQiKTsKKworICAgICAgcFNlcnZlclRocmVhZC0+am9pbigpOworICAgICAgQk9PU1RfVEVTVF9NRVNTQUdFKCIgIHNlcnZlciB0aHJlYWQgam9pbmVkIik7CisgICAgICBwU2VydmVyVGhyZWFkLnJlc2V0KCk7CisgICAgfQorICB9CisKKyAgflRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlKCkgeyBzdG9wU2VydmVyKCk7IH0KKworICAvKioKKyAgICogUGVyZm9ybXMgYSBiYXNlbGluZSB0ZXN0IHdoZXJlIHNvbWUgY2xpZW50cyBhcmUgb3BlbmVkIGFuZCBpc3N1ZSBhIHNpbmdsZSBvcGVyYXRpb24KKyAgICogYW5kIHRoZW4gZGlzY29ubmVjdCBhdCBkaWZmZXJlbnQgaW50ZXJ2YWxzLgorICAgKiBccGFyYW1baW5dICBudW1Ub01ha2UgIHRoZSBudW1iZXIgb2YgY29uY3VycmVudCBjbGllbnRzCisgICAqIFxwYXJhbVtpbl0gIGV4cGVjdGVkSFdNICB0aGUgaGlnaCB3YXRlciBtYXJrIHdlIGV4cGVjdCBvZiBjb25jdXJyZW5jeQorICAgKiBccGFyYW1baW5dICBwdXJwb3NlICBhIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXN0IGZvciBsb2dnaW5nIHB1cnBvc2VzCisgICAqLworICB2b2lkIGJhc2VsaW5lKGludDY0X3QgbnVtVG9NYWtlLCBpbnQ2NF90IGV4cGVjdGVkSFdNLCBjb25zdCBzdGQ6OnN0cmluZyYgcHVycG9zZSkgeworICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJUZXN0aW5nICUxJTogJTIlIHdpdGggJTMlIGNsaWVudHMsIGV4cGVjdCAlNCUgSFdNIikKKyAgICAgICAgICAgICUgdHlwZWlkKFRTZXJ2ZXJUeXBlKS5uYW1lKCkgJSBwdXJwb3NlICUgbnVtVG9NYWtlICUgZXhwZWN0ZWRIV00pOworCisgICAgc3RhcnRTZXJ2ZXIoKTsKKworICAgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8VFNvY2tldD4gPiBob2xkU29ja2V0czsKKyAgICBzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+ID4gaG9sZFRocmVhZHM7CisKKyAgICBmb3IgKGludDY0X3QgaSA9IDA7IGkgPCBudW1Ub01ha2U7ICsraSkgeworICAgICAgc2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jayhuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Tb2NrZXRDbG9zZXIpOworICAgICAgaG9sZFNvY2tldHMucHVzaF9iYWNrKHBDbGllbnRTb2NrKTsKKyAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBwQ2xpZW50UHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbChwQ2xpZW50U29jaykpOworICAgICAgUGFyZW50U2VydmljZUNsaWVudCBjbGllbnQocENsaWVudFByb3RvY29sKTsKKyAgICAgIHBDbGllbnRTb2NrLT5vcGVuKCk7CisgICAgICBjbGllbnQuaW5jcmVtZW50R2VuZXJhdGlvbigpOworICAgICAgaG9sZFRocmVhZHMucHVzaF9iYWNrKHNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4oCisgICAgICAgICAgbmV3IGJvb3N0Ojp0aHJlYWQoc3RkOjpiaW5kKCZUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTo6ZGVsYXlDbG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcygxMCAqIG51bVRvTWFrZSkpKSkpOworICAgIH0KKworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGV4cGVjdGVkSFdNLCBwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50Q291bnRIV00oKSk7CisKKyAgICBCT09TVF9GT1JFQUNIIChzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+IHBUaHJlYWQsIGhvbGRUaHJlYWRzKSB7IHBUaHJlYWQtPmpvaW4oKTsgfQorICAgIGhvbGRUaHJlYWRzLmNsZWFyKCk7CisgICAgaG9sZFNvY2tldHMuY2xlYXIoKTsKKworICAgIHN0b3BTZXJ2ZXIoKTsKKyAgfQorCisgIC8qKgorICAgKiBIZWxwZXIgbWV0aG9kIHVzZWQgdG8gY2xvc2UgYSBjb25uZWN0aW9uIGFmdGVyIGEgZGVsYXkuCisgICAqIFxwYXJhbVtpbl0gIHRvQ2xvc2UgIHRoZSBjb25uZWN0aW9uIHRvIGNsb3NlCisgICAqIFxwYXJhbVtpbl0gIGFmdGVyICB0aGUgZGVsYXkgdG8gaW1wb3NlCisgICAqLworICB2b2lkIGRlbGF5Q2xvc2Uoc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0b0Nsb3NlLCBib29zdDo6cG9zaXhfdGltZTo6dGltZV9kdXJhdGlvbiBhZnRlcikgeworICAgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYWZ0ZXIpOworICAgIHRvQ2xvc2UtPmNsb3NlKCk7CisgIH0KKworICAvKioKKyAgICogXHJldHVybnMgIHRoZSBzZXJ2ZXIgcG9ydCBudW1iZXIKKyAgICovCisgIGludCBnZXRTZXJ2ZXJQb3J0KCkgeworICAgIFRTZXJ2ZXJTb2NrZXQqIHBTb2NrID0gZHluYW1pY19jYXN0PFRTZXJ2ZXJTb2NrZXQqPihwU2VydmVyLT5nZXRTZXJ2ZXJUcmFuc3BvcnQoKS5nZXQoKSk7CisgICAgaWYgKCFwU29jaykgeyB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJob3cgY29tZT8iKTsgfQorICAgIHJldHVybiBwU29jay0+Z2V0UG9ydCgpOworICB9CisKKyAgLyoqCisgICAqIFBlcmZvcm1zIGEgc3RyZXNzIHRlc3QgYnkgc3Bhd25pbmcgdGhyZWFkcyB0aGF0IGNvbm5lY3QsIGRvIGEgbnVtYmVyIG9mIG9wZXJhdGlvbnMKKyAgICogYW5kIGRpc2Nvbm5lY3QsIHRoZW4gYSByYW5kb20gZGVsYXksIHRoZW4gZG8gaXQgb3ZlciBhZ2Fpbi4gIFRoaXMgaXMgZG9uZSBmb3IgYSBmaXhlZAorICAgKiBwZXJpb2Qgb2YgdGltZSB0byB0ZXN0IGZvciBjb25jdXJyZW5jeSBjb3JyZWN0bmVzcy4KKyAgICogXHBhcmFtW2luXSAgbnVtVG9NYWtlICB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgY2xpZW50cworICAgKi8KKyAgdm9pZCBzdHJlc3MoaW50NjRfdCBudW1Ub01ha2UsIGNvbnN0IGJvb3N0Ojpwb3NpeF90aW1lOjp0aW1lX2R1cmF0aW9uJiBkdXJhdGlvbikgeworICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJTdHJlc3MgdGVzdGluZyAlMSUgd2l0aCAlMiUgY2xpZW50cyBmb3IgJTMlIHNlY29uZHMiKQorICAgICAgICAlIHR5cGVpZChUU2VydmVyVHlwZSkubmFtZSgpICUgbnVtVG9NYWtlICUgZHVyYXRpb24udG90YWxfc2Vjb25kcygpKTsKKworICAgIHN0YXJ0U2VydmVyKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+ID4gaG9sZFRocmVhZHM7CisgICAgZm9yIChpbnQ2NF90IGkgPSAwOyBpIDwgbnVtVG9NYWtlOyArK2kpIHsKKyAgICAgIGhvbGRUaHJlYWRzLnB1c2hfYmFjayhzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+KAorICAgICAgICBuZXcgYm9vc3Q6OnRocmVhZChzdGQ6OmJpbmQoJlRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlOjpzdHJlc3NvciwgdGhpcykpKSk7CisgICAgfQorCisgICAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChkdXJhdGlvbik7CisgICAgYlN0cmVzc0RvbmUgPSB0cnVlOworCisgICAgQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoIiAgc2VydmljZWQgJTElIGNvbm5lY3Rpb25zIChIV00gJTIlKSB0b3RhbGluZyAlMyUgcmVxdWVzdHMiKQorICAgICAgICAlIGJTdHJlc3NDb25uZWN0aW9uQ291bnQgJSBwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50Q291bnRIV00oKSAlIGJTdHJlc3NSZXF1ZXN0Q291bnQpOworCisgICAgQk9PU1RfRk9SRUFDSCAoc2hhcmVkX3B0cjxib29zdDo6dGhyZWFkPiBwVGhyZWFkLCBob2xkVGhyZWFkcykgeyBwVGhyZWFkLT5qb2luKCk7IH0KKyAgICBob2xkVGhyZWFkcy5jbGVhcigpOworCisgICAgQk9PU1RfQ0hFQ0soYlN0cmVzc1JlcXVlc3RDb3VudCA+IDApOworCisgICAgc3RvcFNlcnZlcigpOworICB9CisKKyAgLyoqCisgICAqIEhlbHBlciBtZXRob2QgdG8gc3RyZXNzIHRoZSBzeXN0ZW0KKyAgICovCisgIHZvaWQgc3RyZXNzb3IoKSB7CisgIHdoaWxlICghYlN0cmVzc0RvbmUpIHsKKyAgICAgIHNoYXJlZF9wdHI8VFNvY2tldD4gcFNvY2tldChuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwgYXV0b1NvY2tldENsb3Nlcik7CisgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gcFByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2wocFNvY2tldCkpOworICAgICAgUGFyZW50U2VydmljZUNsaWVudCBjbGllbnQocFByb3RvY29sKTsKKyAgICAgIHBTb2NrZXQtPm9wZW4oKTsKKyAgICAgIGJTdHJlc3NDb25uZWN0aW9uQ291bnQuZmV0Y2hfYWRkKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYW5kKCkgJSAxMDAwOyArK2kpIHsKKyAgICAgIGNsaWVudC5pbmNyZW1lbnRHZW5lcmF0aW9uKCk7CisgICAgICAgIGJTdHJlc3NSZXF1ZXN0Q291bnQuZmV0Y2hfYWRkKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHNoYXJlZF9wdHI8VFNlcnZlclR5cGU+IHBTZXJ2ZXI7CisgIHNoYXJlZF9wdHI8VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyPiBwRXZlbnRIYW5kbGVyOworICBzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+IHBTZXJ2ZXJUaHJlYWQ7CisgIHN0ZDo6YXRvbWljPGJvb2w+IGJTdHJlc3NEb25lOworICBzdGQ6OmF0b21pYzxpbnQ2NF90PiBiU3RyZXNzQ29ubmVjdGlvbkNvdW50OworICBzdGQ6OmF0b21pYzxpbnQ2NF90PiBiU3RyZXNzUmVxdWVzdENvdW50OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFRTZXJ2ZXJUeXBlPgorY2xhc3MgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yRmFjdG9yeVRlc3RGaXh0dXJlCisgICAgOiBwdWJsaWMgVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU8VFNlcnZlclR5cGU+IHsKK3B1YmxpYzoKKyAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yRmFjdG9yeVRlc3RGaXh0dXJlKCkKKyAgICA6IFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlPFRTZXJ2ZXJUeXBlPihtYWtlX3NoYXJlZDxQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yRmFjdG9yeT4oCisgICAgICAgICAgbWFrZV9zaGFyZWQ8UGFyZW50U2VydmljZUlmU2luZ2xldG9uRmFjdG9yeT4oCisgICAgICAgICAgICAgIG1ha2Vfc2hhcmVkPFBhcmVudEhhbmRsZXI+KCkpKSkge30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBUU2VydmVyVHlwZT4KK2NsYXNzIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlIDogcHVibGljIFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlPFRTZXJ2ZXJUeXBlPiB7CitwdWJsaWM6CisgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlKCkKKyAgICA6IFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlPFRTZXJ2ZXJUeXBlPigKKyAgICAgICAgICBtYWtlX3NoYXJlZDxQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yPihtYWtlX3NoYXJlZDxQYXJlbnRIYW5kbGVyPigpKSkge30KK307CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShjb25zdHJ1Y3RvcnMpCisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3Rfc2ltcGxlX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JGYWN0b3J5VGVzdEZpeHR1cmU8VFNpbXBsZVNlcnZlcj4pIHsKKyAgYmFzZWxpbmUoMywgMSwgImZhY3RvcnkiKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UodGVzdF9zaW1wbGUsIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlPFRTaW1wbGVTZXJ2ZXI+KSB7CisgIGJhc2VsaW5lKDMsIDEsICJwcm9jZXNzb3IiKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UodGVzdF90aHJlYWRlZF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yRmFjdG9yeVRlc3RGaXh0dXJlPFRUaHJlYWRlZFNlcnZlcj4pIHsKKyAgYmFzZWxpbmUoMTAsIDEwLCAiZmFjdG9yeSIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZGVkLCBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JUZXN0Rml4dHVyZTxUVGhyZWFkZWRTZXJ2ZXI+KSB7CisgIGJhc2VsaW5lKDEwLCAxMCwgInByb2Nlc3NvciIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZGVkX2JvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yVGVzdEZpeHR1cmU8VFRocmVhZGVkU2VydmVyPikgeworICBwU2VydmVyLT5zZXRDb25jdXJyZW50Q2xpZW50TGltaXQoNCk7CisgIGJhc2VsaW5lKDEwLCA0LCAibGltaXQgYnkgc2VydmVyIGZyYW1ld29yayIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZGVkX3N0cmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvckZhY3RvcnlUZXN0Rml4dHVyZTxUVGhyZWFkZWRTZXJ2ZXI+KSB7CisgIHN0cmVzcygxMCwgYm9vc3Q6OnBvc2l4X3RpbWU6OnNlY29uZHMoMykpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZHBvb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvckZhY3RvcnlUZXN0Rml4dHVyZTxUVGhyZWFkUG9vbFNlcnZlcj4pIHsKKyAgcFNlcnZlci0+Z2V0VGhyZWFkTWFuYWdlcigpLT50aHJlYWRGYWN0b3J5KAorICAgICAgc2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSkpOworICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnN0YXJ0KCk7CisKKyAgLy8gdGhyZWFkIGZhY3RvcnkgaGFzIDQgdGhyZWFkcyBhcyBhIGRlZmF1bHQKKyAgLy8gdGhyZWFkIGZhY3RvcnkgaG93ZXZlciBpcyBhIGJhZCB3YXkgdG8gbGltaXQgY29uY3VycmVudCBjbGllbnRzCisgIC8vIGFzIGFjY2VwdCgpIHdpbGwgYmUgY2FsbGVkIHRvIGdyYWIgYSA1dGggY2xpZW50IHNvY2tldCwgaW4gdGhpcyBjYXNlCisgIC8vIGFuZCB0aGVuIHRoZSB0aHJlYWQgZmFjdG9yeSB3aWxsIGJsb2NrIGFkZGluZyB0aGUgdGhyZWFkIHRvIG1hbmFnZQorICAvLyB0aGF0IGNsaWVudC4KKyAgYmFzZWxpbmUoMTAsIDUsICJsaW1pdCBieSB0aHJlYWQgbWFuYWdlciIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JUZXN0Rml4dHVyZTxUVGhyZWFkUG9vbFNlcnZlcj4pIHsKKyAgcFNlcnZlci0+Z2V0VGhyZWFkTWFuYWdlcigpLT50aHJlYWRGYWN0b3J5KAorICAgICAgc2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSkpOworICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnN0YXJ0KCk7CisKKyAgLy8gdGhyZWFkIGZhY3RvcnkgaGFzIDQgdGhyZWFkcyBhcyBhIGRlZmF1bHQKKyAgLy8gdGhyZWFkIGZhY3RvcnkgaG93ZXZlciBpcyBhIGJhZCB3YXkgdG8gbGltaXQgY29uY3VycmVudCBjbGllbnRzCisgIC8vIGFzIGFjY2VwdCgpIHdpbGwgYmUgY2FsbGVkIHRvIGdyYWIgYSA1dGggY2xpZW50IHNvY2tldCwgaW4gdGhpcyBjYXNlCisgIC8vIGFuZCB0aGVuIHRoZSB0aHJlYWQgZmFjdG9yeSB3aWxsIGJsb2NrIGFkZGluZyB0aGUgdGhyZWFkIHRvIG1hbmFnZQorICAvLyB0aGF0IGNsaWVudC4KKyAgYmFzZWxpbmUoMTAsIDUsICJsaW1pdCBieSB0aHJlYWQgbWFuYWdlciIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZHBvb2xfYm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JUZXN0Rml4dHVyZTxUVGhyZWFkUG9vbFNlcnZlcj4pIHsKKyAgcFNlcnZlci0+Z2V0VGhyZWFkTWFuYWdlcigpLT50aHJlYWRGYWN0b3J5KAorICAgICAgc2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSkpOworICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnN0YXJ0KCk7CisgIHBTZXJ2ZXItPnNldENvbmN1cnJlbnRDbGllbnRMaW1pdCg0KTsKKworICBiYXNlbGluZSgxMCwgNCwgInNlcnZlciBmcmFtZXdvcmsgY29ubmVjdGlvbiBsaW1pdCIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZHBvb2xfc3RyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yVGVzdEZpeHR1cmU8VFRocmVhZFBvb2xTZXJ2ZXI+KSB7CisgIHBTZXJ2ZXItPmdldFRocmVhZE1hbmFnZXIoKS0+dGhyZWFkRmFjdG9yeSgKKyAgICAgIHNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PigKKyAgICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkpKTsKKyAgcFNlcnZlci0+Z2V0VGhyZWFkTWFuYWdlcigpLT5zdGFydCgpOworCisgIHN0cmVzcygxMCwgYm9vc3Q6OnBvc2l4X3RpbWU6OnNlY29uZHMoMykpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yVGVzdEZpeHR1cmU8VFRocmVhZGVkU2VydmVyPikKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zdG9wX3dpdGhfaW50ZXJydXB0YWJsZV9jbGllbnRzX2Nvbm5lY3RlZCkgeworICAvLyBUaGlzIHRlc3RzIFRIUklGVC0yNDQxIG5ldyBiZWhhdmlvcjogc3RvcHBpbmcgdGhlIHNlcnZlciBkaXNjb25uZWN0cyBjbGllbnRzCisgIEJPT1NUX1RFU1RfTUVTU0FHRSgiVGVzdGluZyBzdG9wIHdpdGggaW50ZXJydXB0YWJsZSBjbGllbnRzIik7CisKKyAgc3RhcnRTZXJ2ZXIoKTsKKworICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMShuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Tb2NrZXRDbG9zZXIpOworICBwQ2xpZW50U29jazEtPm9wZW4oKTsKKworICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMihuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Tb2NrZXRDbG9zZXIpOworICBwQ2xpZW50U29jazItPm9wZW4oKTsKKworICAvLyBFbnN1cmUgdGhleSBoYXZlIGJlZW4gYWNjZXB0ZWQKKyAgYmxvY2tVbnRpbEFjY2VwdGVkKDIpOworCisgIC8vIFRoZSB0ZXN0IGZpeHR1cmUgZGVzdHJ1Y3RvciB3aWxsIGZvcmNlIHRoZSBzb2NrZXRzIHRvIGRpc2Nvbm5lY3QKKyAgLy8gUHJpb3IgdG8gVEhSSUZULTI0NDEsIHBTZXJ2ZXItPnN0b3AoKSB3b3VsZCBoYW5nIHVudGlsIGNsaWVudHMgZGlzY29ubmVjdGVkCisgIHN0b3BTZXJ2ZXIoKTsKKworICAvLyBleHRyYSBwcm9vZiB0aGUgc2VydmVyIGVuZCBkaXNjb25uZWN0ZWQgdGhlIGNsaWVudHMKKyAgdWludDhfdCBidWZbMV07CisgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIHBDbGllbnRTb2NrMS0+cmVhZCgmYnVmWzBdLCAxKSk7IC8vIDAgPSBkaXNjb25uZWN0ZWQKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgcENsaWVudFNvY2syLT5yZWFkKCZidWZbMF0sIDEpKTsgLy8gMCA9IGRpc2Nvbm5lY3RlZAorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3N0b3Bfd2l0aF91bmludGVycnVwdGFibGVfY2xpZW50c19jb25uZWN0ZWQpIHsKKyAgLy8gVGhpcyB0ZXN0cyBwcmUtVEhSSUZULTI0NDEgYmVoYXZpb3I6IHN0b3BwaW5nIHRoZSBzZXJ2ZXIgYmxvY2tzIHVudGlsIGNsaWVudHMKKyAgLy8gZGlzY29ubmVjdC4KKyAgICBCT09TVF9URVNUX01FU1NBR0UoIlRlc3Rpbmcgc3RvcCB3aXRoIHVuaW50ZXJydXB0YWJsZSBjbGllbnRzIik7CisKKyAgZHluYW1pY19wb2ludGVyX2Nhc3Q8VFNlcnZlclNvY2tldD4ocFNlcnZlci0+Z2V0U2VydmVyVHJhbnNwb3J0KCkpCisgICAgICAtPnNldEludGVycnVwdGFibGVDaGlsZHJlbihmYWxzZSk7IC8vIHJldHVybnMgdG8gcHJlLVRIUklGVC0yNDQxIGJlaGF2aW9yCisKKyAgc3RhcnRTZXJ2ZXIoKTsKKworICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMShuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Tb2NrZXRDbG9zZXIpOworICBwQ2xpZW50U29jazEtPm9wZW4oKTsKKworICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMihuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Tb2NrZXRDbG9zZXIpOworICBwQ2xpZW50U29jazItPm9wZW4oKTsKKworICAvLyBFbnN1cmUgdGhleSBoYXZlIGJlZW4gYWNjZXB0ZWQKKyAgYmxvY2tVbnRpbEFjY2VwdGVkKDIpOworCisgIGJvb3N0Ojp0aHJlYWQgdDEoc3RkOjpiaW5kKCZUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTo6ZGVsYXlDbG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWxsaXNlY29uZHMoMjUwKSkpOworICBib29zdDo6dGhyZWFkIHQyKHN0ZDo6YmluZCgmVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU6OmRlbGF5Q2xvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U29jazIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzKDI1MCkpKTsKKworICAvLyBPbmNlIHRoZSBjbGllbnRzIGRpc2Nvbm5lY3QgdGhlIHNlcnZlciB3aWxsIHN0b3AKKyAgc3RvcFNlcnZlcigpOworICBCT09TVF9DSEVDSyhwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50Q291bnRIV00oKSA+IDApOworICB0MS5qb2luKCk7CisgIHQyLmpvaW4oKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9jb25jdXJyZW50X2NsaWVudF9saW1pdCkgeworICBzdGFydFNlcnZlcigpOworICBCT09TVF9URVNUX01FU1NBR0UoIlRlc3RpbmcgdGhlIGNvbmN1cnJlbnQgY2xpZW50IGxpbWl0Iik7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoSU5UNjRfTUFYLCBwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50TGltaXQoKSk7CisgIHBTZXJ2ZXItPnNldENvbmN1cnJlbnRDbGllbnRMaW1pdCgyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50KCkpOworICBCT09TVF9DSEVDS19FUVVBTCgyLCBwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50TGltaXQoKSk7CisKKyAgc2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazEobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU29ja2V0Q2xvc2VyKTsKKyAgcENsaWVudFNvY2sxLT5vcGVuKCk7CisgIGJsb2NrVW50aWxBY2NlcHRlZCgxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMSwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50KCkpOworCisgIHNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2syKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NvY2tldENsb3Nlcik7CisgIHBDbGllbnRTb2NrMi0+b3BlbigpOworICBibG9ja1VudGlsQWNjZXB0ZWQoMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDIsIHBTZXJ2ZXItPmdldENvbmN1cnJlbnRDbGllbnRDb3VudCgpKTsKKworICAvLyBhIHRoaXJkIGNsaWVudCBjYW5ub3QgY29ubmVjdCB1bnRpbCBvbmUgb2YgdGhlIG90aGVyIHR3byBjbG9zZXMKKyAgYm9vc3Q6OnRocmVhZCB0MihzdGQ6OmJpbmQoJlRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlOjpkZWxheUNsb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNvY2syLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcygyNTApKSk7CisgIHNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2szKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NvY2tldENsb3Nlcik7CisgIHBDbGllbnRTb2NrMi0+b3BlbigpOworICBibG9ja1VudGlsQWNjZXB0ZWQoMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDIsIHBTZXJ2ZXItPmdldENvbmN1cnJlbnRDbGllbnRDb3VudCgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMiwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50SFdNKCkpOworCisgIHN0b3BTZXJ2ZXIoKTsKKyAgQk9PU1RfQ0hFQ0socFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50SFdNKCkgPiAwKTsKKyAgdDIuam9pbigpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UU2VydmVyU29ja2V0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVFNlcnZlclNvY2tldFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYzZkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVFNlcnZlclNvY2tldFRlc3QuY3BwCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlICJUVHJhbnNwb3J0Q2hlY2tUaHJvdy5oIgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoVFNlcnZlclNvY2tldFRlc3QpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfYmluZF90b19hZGRyZXNzKSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDApOworICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIFRTb2NrZXQgY2xpZW50U29jaygibG9jYWxob3N0IiwgcG9ydCk7CisgIGNsaWVudFNvY2sub3BlbigpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworCisgIHN0ZDo6Y291dCA8PCAiQW4gZXJyb3IgbWVzc2FnZSBmcm9tIGdldGFkZHJpbmZvIG9uIHRoZSBjb25zb2xlIGlzIGV4cGVjdGVkOiIgPDwgc3RkOjplbmRsOworICBUU2VydmVyU29ja2V0IHNvY2syKCIyNTcuMjU4LjI1OS4yNjAiLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1coc29jazIubGlzdGVuKCksIFRUcmFuc3BvcnRFeGNlcHRpb24pOworICBzb2NrMi5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2xpc3Rlbl92YWxpZF9wb3J0KSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoLTEpOworICBUVFJBTlNQT1JUX0NIRUNLX1RIUk9XKHNvY2sxLmxpc3RlbigpLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUyk7CisKKyAgVFNlcnZlclNvY2tldCBzb2NrMig2NTUzNik7CisgIFRUUkFOU1BPUlRfQ0hFQ0tfVEhST1coc29jazIubGlzdGVuKCksIFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9jbG9zZV9iZWZvcmVfbGlzdGVuKSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDApOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2dldF9wb3J0KSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsSG9zdCIsIDg4OCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDg4OCwgc29jazEuZ2V0UG9ydCgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVFNlcnZlclRyYW5zcG9ydFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RTZXJ2ZXJUcmFuc3BvcnRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzliZDI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1RTZXJ2ZXJUcmFuc3BvcnRUZXN0LmNwcApAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFRTZXJ2ZXJUcmFuc3BvcnRUZXN0KQorCitjbGFzcyBUZXN0VFRyYW5zcG9ydCA6IHB1YmxpYyBUVHJhbnNwb3J0IHt9OworCitjbGFzcyBUZXN0VFNlcnZlclRyYW5zcG9ydCA6IHB1YmxpYyBUU2VydmVyVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgVGVzdFRTZXJ2ZXJUcmFuc3BvcnQoKSA6IHZhbGlkXyh0cnVlKSB7fQorICB2b2lkIGNsb3NlKCkge30KKyAgYm9vbCB2YWxpZF87CisKK3Byb3RlY3RlZDoKKyAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCkgeworICAgIHJldHVybiB2YWxpZF8gPyBzaGFyZWRfcHRyPFRlc3RUVHJhbnNwb3J0PihuZXcgVGVzdFRUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICA6IHNoYXJlZF9wdHI8VGVzdFRUcmFuc3BvcnQ+KCk7CisgIH0KK307CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcG9zaXRpdmVfYWNjZXB0KSB7CisgIFRlc3RUU2VydmVyVHJhbnNwb3J0IHV1dDsKKyAgQk9PU1RfQ0hFQ0sodXV0LmFjY2VwdCgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9uZWdhdGl2ZV9hY2NlcHQpIHsKKyAgVGVzdFRTZXJ2ZXJUcmFuc3BvcnQgdXV0OworICB1dXQudmFsaWRfID0gZmFsc2U7CisgIEJPT1NUX0NIRUNLX1RIUk9XKHV1dC5hY2NlcHQoKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UU29ja2V0SW50ZXJydXB0VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY2MjQyZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9UU29ja2V0SW50ZXJydXB0VGVzdC5jcHAKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBUU29ja2V0SW50ZXJydXB0VGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgorCisjaW5jbHVkZSA8Ym9vc3QvY2hyb25vL2R1cmF0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC9kYXRlX3RpbWUvcG9zaXhfdGltZS9wb3NpeF90aW1lX2R1cmF0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC90aHJlYWQvdGhyZWFkLmhwcD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShUU29ja2V0SW50ZXJydXB0VGVzdCkKKwordm9pZCByZWFkZXJXb3JrZXIoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHR0LCB1aW50MzJfdCBleHBlY3RlZFJlc3VsdCkgeworICB1aW50OF90IGJ1Zls0XTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXhwZWN0ZWRSZXN1bHQsIHR0LT5yZWFkKGJ1ZiwgNCkpOworfQorCit2b2lkIHJlYWRlcldvcmtlck11c3RUaHJvdyhzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQpIHsKKyAgdHJ5IHsKKyAgICB1aW50OF90IGJ1Zls0XTsKKyAgICB0dC0+cmVhZChidWYsIDQpOworICAgIEJPT1NUX0VSUk9SKCJzaG91bGQgbm90IGhhdmUgZ290dGVuIGhlcmUiKTsKKyAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHgpIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTChUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCwgdHguZ2V0VHlwZSgpKTsKKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2ludGVycnVwdGFibGVfY2hpbGRfcmVhZCkgeworICBUU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwKTsKKyAgc29jazEubGlzdGVuKCk7CisgIGludCBwb3J0ID0gc29jazEuZ2V0UG9ydCgpOworICBUU29ja2V0IGNsaWVudFNvY2soImxvY2FsaG9zdCIsIHBvcnQpOworICBjbGllbnRTb2NrLm9wZW4oKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGJvb3N0Ojp0aHJlYWQgcmVhZFRocmVhZChzdGQ6OmJpbmQocmVhZGVyV29ya2VyTXVzdFRocm93LCBhY2NlcHRlZCkpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcmVhZFRocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIG5vdworICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOworICBCT09TVF9DSEVDS19NRVNTQUdFKHJlYWRUaHJlYWQudHJ5X2pvaW5fZm9yKGJvb3N0OjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIHNvY2tldCBpbnRlcnJ1cHRDaGlsZHJlbiBkaWQgbm90IGludGVycnVwdCBjaGlsZCByZWFkIik7CisgIGNsaWVudFNvY2suY2xvc2UoKTsKKyAgYWNjZXB0ZWQtPmNsb3NlKCk7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfbm9uX2ludGVycnVwdGFibGVfY2hpbGRfcmVhZCkgeworICBUU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwKTsKKyAgc29jazEuc2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKGZhbHNlKTsgLy8gcmV0dXJucyB0byBwcmUtVEhSSUZULTI0NDEgYmVoYXZpb3IKKyAgc29jazEubGlzdGVuKCk7CisgIGludCBwb3J0ID0gc29jazEuZ2V0UG9ydCgpOworICBUU29ja2V0IGNsaWVudFNvY2soImxvY2FsaG9zdCIsIHBvcnQpOworICBjbGllbnRTb2NrLm9wZW4oKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGJvb3N0Ojp0aHJlYWQgcmVhZFRocmVhZChzdGQ6OmJpbmQocmVhZGVyV29ya2VyLCBhY2NlcHRlZCwgMCkpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcmVhZFRocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIGhlcmUKKyAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghcmVhZFRocmVhZC50cnlfam9pbl9mb3IoYm9vc3Q6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwMCkpLAorICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgc29ja2V0IGludGVycnVwdENoaWxkcmVuIGludGVycnVwdGVkIGNoaWxkIHJlYWQiKTsKKworICAvLyBvbmx5IHdheSB0byBwcm9jZWVkIGlzIHRvIGhhdmUgdGhlIGNsaWVudCBkaXNjb25uZWN0CisgIGNsaWVudFNvY2suY2xvc2UoKTsKKyAgcmVhZFRocmVhZC5qb2luKCk7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2Nhbm5vdF9jaGFuZ2VfYWZ0ZXJfbGlzdGVuKSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDApOworICBzb2NrMS5saXN0ZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1coc29jazEuc2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKGZhbHNlKSwgc3RkOjpsb2dpY19lcnJvcik7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK3ZvaWQgcGVla2VyV29ya2VyKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCwgYm9vbCBleHBlY3RlZFJlc3VsdCkgeworICBCT09TVF9DSEVDS19FUVVBTChleHBlY3RlZFJlc3VsdCwgdHQtPnBlZWsoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfaW50ZXJydXB0YWJsZV9jaGlsZF9wZWVrKSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDApOworICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIFRTb2NrZXQgY2xpZW50U29jaygibG9jYWxob3N0IiwgcG9ydCk7CisgIGNsaWVudFNvY2sub3BlbigpOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKKyAgLy8gcGVlaygpIHdpbGwgcmV0dXJuIGZhbHNlIGlmIGNoaWxkIGlzIGludGVycnVwdGVkCisgIGJvb3N0Ojp0aHJlYWQgcGVla1RocmVhZChzdGQ6OmJpbmQocGVla2VyV29ya2VyLCBhY2NlcHRlZCwgZmFsc2UpKTsKKyAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKDUwKSk7CisgIC8vIHBlZWtUaHJlYWQgaXMgcHJhY3RpY2FsbHkgZ3VhcmFudGVlZCB0byBiZSBibG9ja2luZyBub3cKKyAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShwZWVrVGhyZWFkLnRyeV9qb2luX2Zvcihib29zdDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjAwKSksCisgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBzb2NrZXQgaW50ZXJydXB0Q2hpbGRyZW4gZGlkIG5vdCBpbnRlcnJ1cHQgY2hpbGQgcGVlayIpOworICBjbGllbnRTb2NrLmNsb3NlKCk7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X25vbl9pbnRlcnJ1cHRhYmxlX2NoaWxkX3BlZWspIHsKKyAgVFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCk7CisgIHNvY2sxLnNldEludGVycnVwdGFibGVDaGlsZHJlbihmYWxzZSk7IC8vIHJldHVybnMgdG8gcHJlLVRIUklGVC0yNDQxIGJlaGF2aW9yCisgIHNvY2sxLmxpc3RlbigpOworICBpbnQgcG9ydCA9IHNvY2sxLmdldFBvcnQoKTsKKyAgVFNvY2tldCBjbGllbnRTb2NrKCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay5vcGVuKCk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRlZCA9IHNvY2sxLmFjY2VwdCgpOworICAvLyBwZWVrKCkgd2lsbCByZXR1cm4gZmFsc2Ugd2hlbiByZW1vdGUgc2lkZSBpcyBjbG9zZWQKKyAgYm9vc3Q6OnRocmVhZCBwZWVrVGhyZWFkKHN0ZDo6YmluZChwZWVrZXJXb3JrZXIsIGFjY2VwdGVkLCBmYWxzZSkpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcGVla1RocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIG5vdworICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFwZWVrVGhyZWFkLnRyeV9qb2luX2Zvcihib29zdDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjAwKSksCisgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBzb2NrZXQgaW50ZXJydXB0Q2hpbGRyZW4gaW50ZXJydXB0ZWQgY2hpbGQgcGVlayIpOworCisgIC8vIG9ubHkgd2F5IHRvIHByb2NlZWQgaXMgdG8gaGF2ZSB0aGUgY2xpZW50IGRpc2Nvbm5lY3QKKyAgY2xpZW50U29jay5jbG9zZSgpOworICBwZWVrVGhyZWFkLmpvaW4oKTsKKyAgYWNjZXB0ZWQtPmNsb3NlKCk7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RUcmFuc3BvcnRDaGVja1Rocm93LmggYi9saWIvY3BwL3Rlc3QvVFRyYW5zcG9ydENoZWNrVGhyb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjI3N2I0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1RUcmFuc3BvcnRDaGVja1Rocm93LmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2RlZmluZSBUVFJBTlNQT1JUX0NIRUNLX1RIUk9XKF9DQUxMLCBfVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJvb2wgY2F1Z2h0ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKF9DQUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gJiBleCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXguZ2V0VHlwZSgpLCBfVFlQRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2F1Z2h0ID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJPT1NUX0NIRUNLX01FU1NBR0UoY2F1Z2h0LCAiZXhwZWN0ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiBidXQgbm90aGluZyB3YXMgdGhyb3duIik7ICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgVFRSQU5TUE9SVF9SRVFVSVJFX1RIUk9XKF9DQUxMLCBfVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBib29sIGNhdWdodCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0cnkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfQ0FMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICYgZXgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZXguZ2V0VHlwZSgpLCBfVFlQRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNhdWdodCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCT09TVF9SRVFVSVJFX01FU1NBR0UoY2F1Z2h0LCAiZXhwZWN0ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiBidXQgbm90aGluZyB3YXMgdGhyb3duIik7ICAgICAgICAgIFwKKyAgfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RocmlmdFRlc3RfZXh0cmFzLmNwcCBiL2xpYi9jcHAvdGVzdC9UaHJpZnRUZXN0X2V4dHJhcy5jcHAKaW5kZXggYjc4ZjI3Ni4uYWY1NjA2ZSAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RocmlmdFRlc3RfZXh0cmFzLmNwcAorKysgYi9saWIvY3BwL3Rlc3QvVGhyaWZ0VGVzdF9leHRyYXMuY3BwCkBAIC0xOSwxNSArMTksMTUgQEAKIAogLy8gRXh0cmEgZnVuY3Rpb25zIHJlcXVpcmVkIGZvciBUaHJpZnRUZXN0X3R5cGVzIHRvIHdvcmsKIAotI2luY2x1ZGUgPHByb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+CiAjaW5jbHVkZSAiZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmgiCiAKLQotbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0ZXN0IHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRlc3QgewogCiBib29sIEluc2FuaXR5OjpvcGVyYXRvcjwodGhyaWZ0Ojp0ZXN0OjpJbnNhbml0eSBjb25zdCYgb3RoZXIpIGNvbnN0IHsKICAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nOwogICByZXR1cm4gVGhyaWZ0RGVidWdTdHJpbmcoKnRoaXMpIDwgVGhyaWZ0RGVidWdTdHJpbmcob3RoZXIpOwogfQotCi19fQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RvU3RyaW5nVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVG9TdHJpbmdUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjA0Y2IzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1RvU3RyaW5nVGVzdC5jcHAKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KKworI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KKworI2luY2x1ZGUgImdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oIgorI2luY2x1ZGUgImdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuaCIKKyNpbmNsdWRlICJnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmgiCisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0b19zdHJpbmc7CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShUb1N0cmluZ1Rlc3QpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKGJhc2VfdHlwZXNfdG9fc3RyaW5nKSB7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZygxMCksICIxMCIpOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcodHJ1ZSksICIxIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZygnYScpLCAiYSIpOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoMS4yKSwgIjEuMiIpOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoImFiYyIpLCAiYWJjIik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKGVtcHR5X3ZlY3Rvcl90b19zdHJpbmcpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiBsOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcobCksICJbXSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShzaW5nbGVfaXRlbV92ZWN0b3JfdG9fc3RyaW5nKSB7CisgIHN0ZDo6dmVjdG9yPGludD4gbDsKKyAgbC5wdXNoX2JhY2soMTAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKGwpLCAiWzEwMF0iKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UobXVsdGlwbGVfaXRlbV92ZWN0b3JfdG9fc3RyaW5nKSB7CisgIHN0ZDo6dmVjdG9yPGludD4gbDsKKyAgbC5wdXNoX2JhY2soMTAwKTsKKyAgbC5wdXNoX2JhY2soMTUwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKGwpLCAiWzEwMCwgMTUwXSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShlbXB0eV9tYXBfdG9fc3RyaW5nKSB7CisgIHN0ZDo6bWFwPGludCwgc3RkOjpzdHJpbmc+IG07CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhtKSwgInt9Iik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHNpbmdsZV9pdGVtX21hcF90b19zdHJpbmcpIHsKKyAgc3RkOjptYXA8aW50LCBzdGQ6OnN0cmluZz4gbTsKKyAgbVsxMl0gPSAiYWJjIjsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKG0pLCAiezEyOiBhYmN9Iik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKG11bHRpX2l0ZW1fbWFwX3RvX3N0cmluZykgeworICBzdGQ6Om1hcDxpbnQsIHN0ZDo6c3RyaW5nPiBtOworICBtWzEyXSA9ICJhYmMiOworICBtWzMxXSA9ICJ4eXoiOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcobSksICJ7MTI6IGFiYywgMzE6IHh5en0iKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoZW1wdHlfc2V0X3RvX3N0cmluZykgeworICBzdGQ6OnNldDxjaGFyPiBzOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcocyksICJ7fSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShzaW5nbGVfaXRlbV9zZXRfdG9fc3RyaW5nKSB7CisgIHN0ZDo6c2V0PGNoYXI+IHM7CisgIHMuaW5zZXJ0KCdjJyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhzKSwgIntjfSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShtdWx0aV9pdGVtX3NldF90b19zdHJpbmcpIHsKKyAgc3RkOjpzZXQ8Y2hhcj4gczsKKyAgcy5pbnNlcnQoJ2EnKTsKKyAgcy5pbnNlcnQoJ3onKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKHMpLCAie2EsIHp9Iik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKGdlbmVyYXRlZF9lbXB0eV9vYmplY3RfdG9fc3RyaW5nKSB7CisgIHRocmlmdDo6dGVzdDo6RW1wdHlTdHJ1Y3QgZTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKGUpLCAiRW1wdHlTdHJ1Y3QoKSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShnZW5lcmF0ZWRfc2luZ2xlX2Jhc2ljX2ZpZWxkX29iamVjdF90b19zdHJpbmcpIHsKKyAgdGhyaWZ0Ojp0ZXN0OjpTdHJ1Y3RBIGE7CisgIGEuX19zZXRfcygiYWJjZCIpOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoYSksICJTdHJ1Y3RBKHM9YWJjZCkiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoZ2VuZXJhdGVkX3R3b19iYXNpY19maWVsZHNfb2JqZWN0X3RvX3N0cmluZykgeworICB0aHJpZnQ6OnRlc3Q6OkJvbmsgYTsKKyAgYS5fX3NldF9tZXNzYWdlKCJhYmNkIik7CisgIGEuX19zZXRfdHlwZSgxMjM0KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKGEpLCAiQm9uayhtZXNzYWdlPWFiY2QsIHR5cGU9MTIzNCkiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoZ2VuZXJhdGVkX29wdGlvbmFsX2ZpZWxkc19vYmplY3RfdG9fc3RyaW5nKSB7CisgIHRocmlmdDo6dGVzdDo6VHJpY2t5MiBhOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoYSksICJUcmlja3kyKGltX29wdGlvbmFsPTxudWxsPikiKTsKKyAgYS5fX3NldF9pbV9vcHRpb25hbCgxMjMpOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoYSksICJUcmlja3kyKGltX29wdGlvbmFsPTEyMykiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoZ2VuZXJhdGVkX25lc3RlZF9vYmplY3RfdG9fc3RyaW5nKSB7CisgIHRocmlmdDo6dGVzdDo6T25lRmllbGQgYTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKGEpLCAiT25lRmllbGQoZmllbGQ9RW1wdHlTdHJ1Y3QoKSkiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoZ2VuZXJhdGVkX25lc3RlZF9saXN0X29iamVjdF90b19zdHJpbmcpIHsKKyAgdGhyaWZ0Ojp0ZXN0OjpMaXN0Qm9ua3MgbDsKKyAgbC5ib25rLmFzc2lnbigyLCB0aHJpZnQ6OnRlc3Q6OkJvbmsoKSk7CisgIGwuYm9ua1swXS5fX3NldF9tZXNzYWdlKCJhIik7CisgIGwuYm9ua1sxXS5fX3NldF9tZXNzYWdlKCJiIik7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKGwpLAorICAgICAgICAgICAgICAgICAgICAiTGlzdEJvbmtzKGJvbms9W0JvbmsobWVzc2FnZT1hLCB0eXBlPTApLCBCb25rKG1lc3NhZ2U9YiwgdHlwZT0wKV0pIik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RyYW5zcG9ydFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RyYW5zcG9ydFRlc3QuY3BwCmluZGV4IGQxMmUzODQuLmNlMTk1NDQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9UcmFuc3BvcnRUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvVHJhbnNwb3J0VGVzdC5jcHAKQEAgLTE2LDQ4ICsxNiw1NCBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLSNpZm5kZWYgX0dOVV9TT1VSQ0UKLSNkZWZpbmUgX0dOVV9TT1VSQ0UgLy8gbmVlZGVkIGZvciBnZXRvcHRfbG9uZwotI2VuZGlmCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgogCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGdldG9wdC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgorI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCiAjaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDx0cjEvZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxmc3RyZWFtPgogCiAjaW5jbHVkZSA8Ym9vc3QvbXBsL2xpc3QuaHBwPgogI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9hcnJheS5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvcmFuZG9tLmhwcD4KICNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgogCi0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9GdW5jdGlvblJ1bm5lci5oPgorI2lmIF9XSU4zMgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFBpcGUuaD4KKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgorI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwogCiBzdGF0aWMgYm9vc3Q6Om10MTk5Mzcgcm5nOwotc3RhdGljIGNvbnN0IGNoYXIqIHRtcF9kaXIgPSAiL3RtcCI7CiAKIHZvaWQgaW5pdHJhbmQodW5zaWduZWQgaW50IHNlZWQpIHsKICAgcm5nLnNlZWQoc2VlZCk7CiB9CiAKIGNsYXNzIFNpemVHZW5lcmF0b3IgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgdmlydHVhbCB+U2l6ZUdlbmVyYXRvcigpIHt9CiAgIHZpcnR1YWwgdWludDMyX3QgbmV4dFNpemUoKSA9IDA7CiAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCA9IDA7CiB9OwogCiBjbGFzcyBDb25zdGFudFNpemVHZW5lcmF0b3IgOiBwdWJsaWMgU2l6ZUdlbmVyYXRvciB7Ci0gcHVibGljOgorcHVibGljOgogICBDb25zdGFudFNpemVHZW5lcmF0b3IodWludDMyX3QgdmFsdWUpIDogdmFsdWVfKHZhbHVlKSB7fQogICB1aW50MzJfdCBuZXh0U2l6ZSgpIHsgcmV0dXJuIHZhbHVlXzsgfQogICBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IHsKQEAgLTY2LDE0ICs3MiwxNCBAQAogICAgIHJldHVybiBkZXNjLnN0cigpOwogICB9CiAKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgdWludDMyX3QgdmFsdWVfOwogfTsKIAogY2xhc3MgUmFuZG9tU2l6ZUdlbmVyYXRvciA6IHB1YmxpYyBTaXplR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIFJhbmRvbVNpemVHZW5lcmF0b3IodWludDMyX3QgbWluLCB1aW50MzJfdCBtYXgpIDoKLSAgICBnZW5lcmF0b3JfKHJuZywgYm9vc3Q6OnVuaWZvcm1faW50PGludD4obWluLCBtYXgpKSB7fQorcHVibGljOgorICBSYW5kb21TaXplR2VuZXJhdG9yKHVpbnQzMl90IG1pbiwgdWludDMyX3QgbWF4KQorICAgIDogZ2VuZXJhdG9yXyhybmcsIGJvb3N0Ojp1bmlmb3JtX2ludDxpbnQ+KG1pbiwgbWF4KSkge30KIAogICB1aW50MzJfdCBuZXh0U2l6ZSgpIHsgcmV0dXJuIGdlbmVyYXRvcl8oKTsgfQogCkBAIC04MywxMiArODksMTEgQEAKICAgICByZXR1cm4gZGVzYy5zdHIoKTsKICAgfQogCi0gIHVpbnQzMl90IGdldE1pbigpIGNvbnN0IHsgcmV0dXJuIGdlbmVyYXRvcl8uZGlzdHJpYnV0aW9uKCkubWluKCk7IH0KLSAgdWludDMyX3QgZ2V0TWF4KCkgY29uc3QgeyByZXR1cm4gZ2VuZXJhdG9yXy5kaXN0cmlidXRpb24oKS5tYXgoKTsgfQorICB1aW50MzJfdCBnZXRNaW4oKSBjb25zdCB7IHJldHVybiAoZ2VuZXJhdG9yXy5kaXN0cmlidXRpb24oKS5taW4pKCk7IH0KKyAgdWludDMyX3QgZ2V0TWF4KCkgY29uc3QgeyByZXR1cm4gKGdlbmVyYXRvcl8uZGlzdHJpYnV0aW9uKCkubWF4KSgpOyB9CiAKLSBwcml2YXRlOgotICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8IGJvb3N0OjptdDE5OTM3JiwgYm9vc3Q6OnVuaWZvcm1faW50PGludD4gPgotICAgIGdlbmVyYXRvcl87Citwcml2YXRlOgorICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8Ym9vc3Q6Om10MTk5MzcmLCBib29zdDo6dW5pZm9ybV9pbnQ8aW50PiA+IGdlbmVyYXRvcl87CiB9OwogCiAvKioKQEAgLTk5LDE3ICsxMDQsMTYgQEAKICAqICAgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIGdlbmVyYXRvciB0byBiaW5kIGl0IHRvIHRoZSB0ZXN0IGZ1bmN0aW9uLikKICAqLwogY2xhc3MgR2VuZXJpY1NpemVHZW5lcmF0b3IgOiBwdWJsaWMgU2l6ZUdlbmVyYXRvciB7Ci0gcHVibGljOgotICBHZW5lcmljU2l6ZUdlbmVyYXRvcih1aW50MzJfdCB2YWx1ZSkgOgotICAgIGdlbmVyYXRvcl8obmV3IENvbnN0YW50U2l6ZUdlbmVyYXRvcih2YWx1ZSkpIHt9Ci0gIEdlbmVyaWNTaXplR2VuZXJhdG9yKHVpbnQzMl90IG1pbiwgdWludDMyX3QgbWF4KSA6Ci0gICAgZ2VuZXJhdG9yXyhuZXcgUmFuZG9tU2l6ZUdlbmVyYXRvcihtaW4sIG1heCkpIHt9CitwdWJsaWM6CisgIEdlbmVyaWNTaXplR2VuZXJhdG9yKHVpbnQzMl90IHZhbHVlKSA6IGdlbmVyYXRvcl8obmV3IENvbnN0YW50U2l6ZUdlbmVyYXRvcih2YWx1ZSkpIHt9CisgIEdlbmVyaWNTaXplR2VuZXJhdG9yKHVpbnQzMl90IG1pbiwgdWludDMyX3QgbWF4KQorICAgIDogZ2VuZXJhdG9yXyhuZXcgUmFuZG9tU2l6ZUdlbmVyYXRvcihtaW4sIG1heCkpIHt9CiAKICAgdWludDMyX3QgbmV4dFNpemUoKSB7IHJldHVybiBnZW5lcmF0b3JfLT5uZXh0U2l6ZSgpOyB9CiAgIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgeyByZXR1cm4gZ2VuZXJhdG9yXy0+ZGVzY3JpYmUoKTsgfQogCi0gcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4gZ2VuZXJhdG9yXzsKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiBnZW5lcmF0b3JfOwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMjYsMzEgKzEzMCwzMSBAQAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KIGNsYXNzIENvdXBsZWRUcmFuc3BvcnRzIHsKLSBwdWJsaWM6CitwdWJsaWM6CisgIHZpcnR1YWwgfkNvdXBsZWRUcmFuc3BvcnRzKCkge30KICAgdHlwZWRlZiBUcmFuc3BvcnRfIFRyYW5zcG9ydFR5cGU7CiAKICAgQ291cGxlZFRyYW5zcG9ydHMoKSA6IGluKCksIG91dCgpIHt9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gaW47Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IG91dDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IGluOworICBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gb3V0OwogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIENvdXBsZWRUcmFuc3BvcnRzKGNvbnN0IENvdXBsZWRUcmFuc3BvcnRzJik7Ci0gIENvdXBsZWRUcmFuc3BvcnRzICZvcGVyYXRvcj0oY29uc3QgQ291cGxlZFRyYW5zcG9ydHMmKTsKKyAgQ291cGxlZFRyYW5zcG9ydHMmIG9wZXJhdG9yPShjb25zdCBDb3VwbGVkVHJhbnNwb3J0cyYpOwogfTsKIAogLyoqCiAgKiBDb3VwbGVkIFRNZW1vcnlCdWZmZXJzCiAgKi8KIGNsYXNzIENvdXBsZWRNZW1vcnlCdWZmZXJzIDogcHVibGljIENvdXBsZWRUcmFuc3BvcnRzPFRNZW1vcnlCdWZmZXI+IHsKLSBwdWJsaWM6Ci0gIENvdXBsZWRNZW1vcnlCdWZmZXJzKCkgOgotICAgIGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcikgeworcHVibGljOgorICBDb3VwbGVkTWVtb3J5QnVmZmVycygpIDogYnVmKG5ldyBUTWVtb3J5QnVmZmVyKSB7CiAgICAgaW4gPSBidWY7CiAgICAgb3V0ID0gYnVmOwogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmOwogfTsKIAogLyoqCkBAIC0xNTksNyArMTYzLDcgQEAKICAqLwogdGVtcGxhdGUgPGNsYXNzIFdyYXBwZXJUcmFuc3BvcnRfLCBjbGFzcyBJbm5lckNvdXBsZWRUcmFuc3BvcnRzXz4KIGNsYXNzIENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0c1QgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8V3JhcHBlclRyYW5zcG9ydF8+IHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0c1QoKSB7CiAgICAgaWYgKGlubmVyXy5pbikgewogICAgICAgdGhpcy0+aW4ucmVzZXQobmV3IFdyYXBwZXJUcmFuc3BvcnRfKGlubmVyXy5pbikpOwpAQCAtMTc2LDQwICsxODAsMzUgQEAKICAqIENvdXBsZWQgVEJ1ZmZlcmVkVHJhbnNwb3J0cy4KICAqLwogdGVtcGxhdGUgPGNsYXNzIElubmVyVHJhbnNwb3J0Xz4KLWNsYXNzIENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHNUIDoKLSAgcHVibGljIENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0c1Q8VEJ1ZmZlcmVkVHJhbnNwb3J0LCBJbm5lclRyYW5zcG9ydF8+IHsKLX07CitjbGFzcyBDb3VwbGVkQnVmZmVyZWRUcmFuc3BvcnRzVAorICAgIDogcHVibGljIENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0c1Q8VEJ1ZmZlcmVkVHJhbnNwb3J0LCBJbm5lclRyYW5zcG9ydF8+IHt9OwogCi10eXBlZGVmIENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHNUPENvdXBsZWRNZW1vcnlCdWZmZXJzPgotICBDb3VwbGVkQnVmZmVyZWRUcmFuc3BvcnRzOwordHlwZWRlZiBDb3VwbGVkQnVmZmVyZWRUcmFuc3BvcnRzVDxDb3VwbGVkTWVtb3J5QnVmZmVycz4gQ291cGxlZEJ1ZmZlcmVkVHJhbnNwb3J0czsKIAogLyoqCiAgKiBDb3VwbGVkIFRGcmFtZWRUcmFuc3BvcnRzLgogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgSW5uZXJUcmFuc3BvcnRfPgotY2xhc3MgQ291cGxlZEZyYW1lZFRyYW5zcG9ydHNUIDoKLSAgcHVibGljIENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0c1Q8VEZyYW1lZFRyYW5zcG9ydCwgSW5uZXJUcmFuc3BvcnRfPiB7Ci19OworY2xhc3MgQ291cGxlZEZyYW1lZFRyYW5zcG9ydHNUCisgICAgOiBwdWJsaWMgQ291cGxlZFdyYXBwZXJUcmFuc3BvcnRzVDxURnJhbWVkVHJhbnNwb3J0LCBJbm5lclRyYW5zcG9ydF8+IHt9OwogCi10eXBlZGVmIENvdXBsZWRGcmFtZWRUcmFuc3BvcnRzVDxDb3VwbGVkTWVtb3J5QnVmZmVycz4KLSAgQ291cGxlZEZyYW1lZFRyYW5zcG9ydHM7Cit0eXBlZGVmIENvdXBsZWRGcmFtZWRUcmFuc3BvcnRzVDxDb3VwbGVkTWVtb3J5QnVmZmVycz4gQ291cGxlZEZyYW1lZFRyYW5zcG9ydHM7CiAKIC8qKgogICogQ291cGxlZCBUWmxpYlRyYW5zcG9ydHMuCiAgKi8KIHRlbXBsYXRlIDxjbGFzcyBJbm5lclRyYW5zcG9ydF8+Ci1jbGFzcyBDb3VwbGVkWmxpYlRyYW5zcG9ydHNUIDoKLSAgcHVibGljIENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0c1Q8VFpsaWJUcmFuc3BvcnQsIElubmVyVHJhbnNwb3J0Xz4gewotfTsKK2NsYXNzIENvdXBsZWRabGliVHJhbnNwb3J0c1QgOiBwdWJsaWMgQ291cGxlZFdyYXBwZXJUcmFuc3BvcnRzVDxUWmxpYlRyYW5zcG9ydCwgSW5uZXJUcmFuc3BvcnRfPiB7fTsKIAotdHlwZWRlZiBDb3VwbGVkWmxpYlRyYW5zcG9ydHNUPENvdXBsZWRNZW1vcnlCdWZmZXJzPgotICBDb3VwbGVkWmxpYlRyYW5zcG9ydHM7Cit0eXBlZGVmIENvdXBsZWRabGliVHJhbnNwb3J0c1Q8Q291cGxlZE1lbW9yeUJ1ZmZlcnM+IENvdXBsZWRabGliVHJhbnNwb3J0czsKIAorI2lmbmRlZiBfV0lOMzIKKy8vIEZEIHRyYW5zcG9ydCBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSBvbiBXaW5kb3dzLgogLyoqCiAgKiBDb3VwbGVkIFRGRFRyYW5zcG9ydHMuCiAgKi8KIGNsYXNzIENvdXBsZWRGRFRyYW5zcG9ydHMgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8VEZEVHJhbnNwb3J0PiB7Ci0gcHVibGljOgorcHVibGljOgogICBDb3VwbGVkRkRUcmFuc3BvcnRzKCkgewogICAgIGludCBwaXBlc1syXTsKIApAQCAtMjIxLDU0ICsyMjAsNzMgQEAKICAgICBvdXQucmVzZXQobmV3IFRGRFRyYW5zcG9ydChwaXBlc1sxXSwgVEZEVHJhbnNwb3J0OjpDTE9TRV9PTl9ERVNUUk9ZKSk7CiAgIH0KIH07CisjZWxzZQorLyoqCisgKiBDb3VwbGVkIHBpcGUgdHJhbnNwb3J0cworICovCitjbGFzcyBDb3VwbGVkUGlwZVRyYW5zcG9ydHMgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8VFBpcGU+IHsKK3B1YmxpYzoKKyAgSEFORExFIGhSZWFkOworICBIQU5ETEUgaFdyaXRlOworCisgIENvdXBsZWRQaXBlVHJhbnNwb3J0cygpIHsKKyAgICBCT09TVF9SRVFVSVJFKENyZWF0ZVBpcGUoJmhSZWFkLCAmaFdyaXRlLCBOVUxMLCAxMDQ4NTc2ICogMikpOworICAgIGluLnJlc2V0KG5ldyBUUGlwZShoUmVhZCwgaFdyaXRlKSk7CisgICAgaW4tPm9wZW4oKTsKKyAgICBvdXQgPSBpbjsKKyAgfQorfTsKKyNlbmRpZgogCiAvKioKICAqIENvdXBsZWQgVFNvY2tldHMKICAqLwogY2xhc3MgQ291cGxlZFNvY2tldFRyYW5zcG9ydHMgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8VFNvY2tldD4gewotIHB1YmxpYzoKK3B1YmxpYzoKICAgQ291cGxlZFNvY2tldFRyYW5zcG9ydHMoKSB7Ci0gICAgaW50IHNvY2tldHNbMl07Ci0gICAgaWYgKHNvY2tldHBhaXIoUEZfVU5JWCwgU09DS19TVFJFQU0sIDAsIHNvY2tldHMpICE9IDApIHsKKyAgICBUSFJJRlRfU09DS0VUIHNvY2tldHNbMl0gPSB7MH07CisgICAgaWYgKFRIUklGVF9TT0NLRVRQQUlSKFBGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBzb2NrZXRzKSAhPSAwKSB7CiAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgaW4ucmVzZXQobmV3IFRTb2NrZXQoc29ja2V0c1swXSkpOwogICAgIG91dC5yZXNldChuZXcgVFNvY2tldChzb2NrZXRzWzFdKSk7CisgICAgb3V0LT5zZXRTZW5kVGltZW91dCgxMDApOwogICB9CiB9OwogCisvLyBUaGVzZSBjb3VsZCBiZSBtYWRlIHRvIHdvcmsgb24gV2luZG93cywgYnV0IEkgZG9uJ3QgY2FyZSBlbm91Z2ggdG8gbWFrZSBpdCBoYXBwZW4KKyNpZm5kZWYgX1dJTjMyCiAvKioKICAqIENvdXBsZWQgVEZpbGVUcmFuc3BvcnRzCiAgKi8KIGNsYXNzIENvdXBsZWRGaWxlVHJhbnNwb3J0cyA6IHB1YmxpYyBDb3VwbGVkVHJhbnNwb3J0czxURmlsZVRyYW5zcG9ydD4gewotIHB1YmxpYzoKK3B1YmxpYzoKICAgQ291cGxlZEZpbGVUcmFuc3BvcnRzKCkgeworI2lmbmRlZiBfV0lOMzIKKyAgICBjb25zdCBjaGFyKiB0bXBfZGlyID0gIi90bXAiOworI2RlZmluZSBGSUxFTkFNRV9TVUZGSVggIi90aHJpZnQudHJhbnNwb3J0X3Rlc3QiCisjZWxzZQorICAgIGNvbnN0IGNoYXIqIHRtcF9kaXIgPSBnZXRlbnYoIlRNUCIpOworI2RlZmluZSBGSUxFTkFNRV9TVUZGSVggIlxcdGhyaWZ0LnRyYW5zcG9ydF90ZXN0IgorI2VuZGlmCisKICAgICAvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSB0byB1c2UKLSAgICBzaXplX3QgZmlsZW5hbWVfbGVuID0gc3RybGVuKHRtcF9kaXIpICsgMzI7Ci0gICAgZmlsZW5hbWUgPSBuZXcgY2hhcltmaWxlbmFtZV9sZW5dOwotICAgIHNucHJpbnRmKGZpbGVuYW1lLCBmaWxlbmFtZV9sZW4sCi0gICAgICAgICAgICAgIiVzL3RocmlmdC50cmFuc3BvcnRfdGVzdC5YWFhYWFgiLCB0bXBfZGlyKTsKLSAgICBmZCA9IG1rc3RlbXAoZmlsZW5hbWUpOwotICAgIGlmIChmZCA8IDApIHsKLSAgICAgIHJldHVybjsKLSAgICB9CisgICAgZmlsZW5hbWUucmVzaXplKHN0cmxlbih0bXBfZGlyKSArIHN0cmxlbihGSUxFTkFNRV9TVUZGSVgpKTsKKyAgICBUSFJJRlRfU05QUklOVEYoJmZpbGVuYW1lWzBdLCBmaWxlbmFtZS5zaXplKCksICIlcyIgRklMRU5BTUVfU1VGRklYLCB0bXBfZGlyKTsKKyN1bmRlZiBGSUxFTkFNRV9TVUZGSVgKKworICAgIHsgc3RkOjpvZnN0cmVhbSBkdW1teV9jcmVhdGlvbihmaWxlbmFtZS5jX3N0cigpLCBzdGQ6Om9mc3RyZWFtOjp0cnVuYyk7IH0KIAogICAgIGluLnJlc2V0KG5ldyBURmlsZVRyYW5zcG9ydChmaWxlbmFtZSwgdHJ1ZSkpOwogICAgIG91dC5yZXNldChuZXcgVEZpbGVUcmFuc3BvcnQoZmlsZW5hbWUpKTsKICAgfQogCi0gIH5Db3VwbGVkRmlsZVRyYW5zcG9ydHMoKSB7Ci0gICAgaWYgKGZkID49IDApIHsKLSAgICAgIGNsb3NlKGZkKTsKLSAgICAgIHVubGluayhmaWxlbmFtZSk7Ci0gICAgfQotICAgIGRlbGV0ZVtdIGZpbGVuYW1lOwotICB9CisgIH5Db3VwbGVkRmlsZVRyYW5zcG9ydHMoKSB7IHJlbW92ZShmaWxlbmFtZS5jX3N0cigpKTsgfQogCi0gIGNoYXIqIGZpbGVuYW1lOwotICBpbnQgZmQ7CisgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lOwogfTsKKyNlbmRpZgogCiAvKioKICAqIFdyYXBwZXIgYXJvdW5kIGFub3RoZXIgQ291cGxlZFRyYW5zcG9ydHMgaW1wbGVtZW50YXRpb24gdGhhdCBleHBvc2VzIHRoZQpAQCAtMjgwLDcgKzI5OCw3IEBACiAgKi8KIHRlbXBsYXRlIDxjbGFzcyBDb3VwbGVkVHJhbnNwb3J0c18+CiBjbGFzcyBDb3VwbGVkVFRyYW5zcG9ydHMgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8VFRyYW5zcG9ydD4gewotIHB1YmxpYzoKK3B1YmxpYzoKICAgQ291cGxlZFRUcmFuc3BvcnRzKCkgOiB0cmFuc3BvcnRzKCkgewogICAgIGluID0gdHJhbnNwb3J0cy5pbjsKICAgICBvdXQgPSB0cmFuc3BvcnRzLm91dDsKQEAgLTI5OCw3ICszMTYsNyBAQAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgQ291cGxlZFRyYW5zcG9ydHNfPgogY2xhc3MgQ291cGxlZEJ1ZmZlckJhc2VzIDogcHVibGljIENvdXBsZWRUcmFuc3BvcnRzPFRCdWZmZXJCYXNlPiB7Ci0gcHVibGljOgorcHVibGljOgogICBDb3VwbGVkQnVmZmVyQmFzZXMoKSA6IHRyYW5zcG9ydHMoKSB7CiAgICAgaW4gPSB0cmFuc3BvcnRzLmluOwogICAgIG91dCA9IHRyYW5zcG9ydHMub3V0OwpAQCAtMzIyLDQ0ICszNDAsNDIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RydWN0IFRyaWdnZXJJbmZvIHsKLSAgVHJpZ2dlckluZm8oaW50IHNlY29uZHMsIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgIHVpbnQzMl90IHdyaXRlTGVuZ3RoKSA6Ci0gICAgdGltZW91dFNlY29uZHMoc2Vjb25kcyksCi0gICAgdHJhbnNwb3J0KHRyYW5zcG9ydCksCi0gICAgd3JpdGVMZW5ndGgod3JpdGVMZW5ndGgpLAotICAgIG5leHQoTlVMTCkge30KKyAgVHJpZ2dlckluZm8oaW50IHNlY29uZHMsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgdHJhbnNwb3J0LCB1aW50MzJfdCB3cml0ZUxlbmd0aCkKKyAgICA6IHRpbWVvdXRTZWNvbmRzKHNlY29uZHMpLCB0cmFuc3BvcnQodHJhbnNwb3J0KSwgd3JpdGVMZW5ndGgod3JpdGVMZW5ndGgpLCBuZXh0KE5VTEwpIHt9CiAKICAgaW50IHRpbWVvdXRTZWNvbmRzOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CiAgIHVpbnQzMl90IHdyaXRlTGVuZ3RoOwogICBUcmlnZ2VySW5mbyogbmV4dDsKIH07CiAKLVRyaWdnZXJJbmZvKiB0cmlnZ2VySW5mbzsKLXVuc2lnbmVkIGludCBudW1UcmlnZ2Vyc0ZpcmVkOworYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yIGdfYWxhcm1fbW9uaXRvcjsKK1RyaWdnZXJJbmZvKiBnX3RyaWdnZXJJbmZvOwordW5zaWduZWQgaW50IGdfbnVtVHJpZ2dlcnNGaXJlZDsKK2Jvb2wgZ190ZWFyZG93biA9IGZhbHNlOwogCi12b2lkIHNldF9hbGFybSgpOwordm9pZCBhbGFybV9oYW5kbGVyKCkgeworICBUcmlnZ2VySW5mbyogaW5mbyA9IE5VTEw7CisgIHsKKyAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKGdfYWxhcm1fbW9uaXRvcik7CisgICAgLy8gVGhlIGFsYXJtIHRpbWVkIG91dCwgd2hpY2ggYWxtb3N0IGNlcnRhaW5seSBtZWFucyB3ZSdyZSBzdHVjaworICAgIC8vIG9uIGEgdHJhbnNwb3J0IHRoYXQgaXMgaW5jb3JyZWN0bHkgYmxvY2tlZC4KKyAgICArK2dfbnVtVHJpZ2dlcnNGaXJlZDsKIAotdm9pZCBhbGFybV9oYW5kbGVyKGludCBzaWdudW0pIHsKLSAgKHZvaWQpIHNpZ251bTsKLSAgLy8gVGhlIGFsYXJtIHRpbWVkIG91dCwgd2hpY2ggYWxtb3N0IGNlcnRhaW5seSBtZWFucyB3ZSdyZSBzdHVjawotICAvLyBvbiBhIHRyYW5zcG9ydCB0aGF0IGlzIGluY29ycmVjdGx5IGJsb2NrZWQuCi0gICsrbnVtVHJpZ2dlcnNGaXJlZDsKKyAgICAvLyBOb3RlOiB3ZSBwcmludCBtZXNzYWdlcyB0byBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIsIHNpbmNlCisgICAgLy8gdG9vbHMvdGVzdC9ydW5uZXIgb25seSByZWNvcmRzIHN0ZG91dCBtZXNzYWdlcyBpbiB0aGUgZmFpbHVyZSBtZXNzYWdlcyBmb3IKKyAgICAvLyBib29zdCB0ZXN0cy4gIChib29zdCBwcmludHMgaXRzIHRlc3QgaW5mbyB0byBzdGRvdXQuKQorICAgIHByaW50ZigiVGltZW91dCBhbGFybSBleHBpcmVkOyBhdHRlbXB0aW5nIHRvIHVuYmxvY2sgdHJhbnNwb3J0XG4iKTsKKyAgICBpZiAoZ190cmlnZ2VySW5mbyA9PSBOVUxMKSB7CisgICAgICBwcmludGYoIiAgdHJpZ2dlciBzdGFjayBpcyBlbXB0eSFcbiIpOworICAgIH0KIAotICAvLyBOb3RlOiB3ZSBwcmludCBtZXNzYWdlcyB0byBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIsIHNpbmNlCi0gIC8vIHRvb2xzL3Rlc3QvcnVubmVyIG9ubHkgcmVjb3JkcyBzdGRvdXQgbWVzc2FnZXMgaW4gdGhlIGZhaWx1cmUgbWVzc2FnZXMgZm9yCi0gIC8vIGJvb3N0IHRlc3RzLiAgKGJvb3N0IHByaW50cyBpdHMgdGVzdCBpbmZvIHRvIHN0ZG91dC4pCi0gIHByaW50ZigiVGltZW91dCBhbGFybSBleHBpcmVkOyBhdHRlbXB0aW5nIHRvIHVuYmxvY2sgdHJhbnNwb3J0XG4iKTsKLSAgaWYgKHRyaWdnZXJJbmZvID09IE5VTEwpIHsKLSAgICBwcmludGYoIiAgdHJpZ2dlciBzdGFjayBpcyBlbXB0eSFcbiIpOworICAgIC8vIFBvcCBvZmYgdGhlIGZpcnN0IFRyaWdnZXJJbmZvLgorICAgIC8vIElmIHRoZXJlIGlzIGFub3RoZXIgb25lLCBzY2hlZHVsZSBhbiBhbGFybSBmb3IgaXQuCisgICAgaW5mbyA9IGdfdHJpZ2dlckluZm87CisgICAgZ190cmlnZ2VySW5mbyA9IGluZm8tPm5leHQ7CiAgIH0KIAotICAvLyBQb3Agb2ZmIHRoZSBmaXJzdCBUcmlnZ2VySW5mby4KLSAgLy8gSWYgdGhlcmUgaXMgYW5vdGhlciBvbmUsIHNjaGVkdWxlIGFuIGFsYXJtIGZvciBpdC4KLSAgVHJpZ2dlckluZm8qIGluZm8gPSB0cmlnZ2VySW5mbzsKLSAgdHJpZ2dlckluZm8gPSBpbmZvLT5uZXh0OwotICBzZXRfYWxhcm0oKTsKLQogICAvLyBXcml0ZSBzb21lIGRhdGEgdG8gdGhlIHRyYW5zcG9ydCB0byBob3BlZnVsbHkgdW5ibG9jayBpdC4KICAgdWludDhfdCogYnVmID0gbmV3IHVpbnQ4X3RbaW5mby0+d3JpdGVMZW5ndGhdOwogICBtZW1zZXQoYnVmLCAnYicsIGluZm8tPndyaXRlTGVuZ3RoKTsKQEAgLTM3MCwyMSArMzg2LDI4IEBACiAgIGRlbGV0ZSBpbmZvOwogfQogCi12b2lkIHNldF9hbGFybSgpIHsKLSAgaWYgKHRyaWdnZXJJbmZvID09IE5VTEwpIHsKLSAgICAvLyBjbGVhciBhbnkgYWxhcm0KLSAgICBhbGFybSgwKTsKLSAgICByZXR1cm47Cit2b2lkIGFsYXJtX2hhbmRsZXJfd3JhcHBlcigpIHsKKyAgaW50NjRfdCB0aW1lb3V0ID0gMDsgLy8gdGltZW91dCBvZiAwIG1lYW5zIHdhaXQgZm9yZXZlcgorICB3aGlsZSAodHJ1ZSkgeworICAgIGJvb2wgZmlyZUhhbmRsZXIgPSBmYWxzZTsKKyAgICB7CisgICAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKGdfYWxhcm1fbW9uaXRvcik7CisgICAgICBpZiAoZ190ZWFyZG93bikKKyAgICAgICAgcmV0dXJuOworICAgICAgLy8gY2FsY3VsYXRlIHRpbWVvdXQKKyAgICAgIGlmIChnX3RyaWdnZXJJbmZvID09IE5VTEwpIHsKKyAgICAgICAgdGltZW91dCA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aW1lb3V0ID0gZ190cmlnZ2VySW5mby0+dGltZW91dFNlY29uZHMgKiAxMDAwOworICAgICAgfQorCisgICAgICBpbnQgd2FpdFJlc3VsdCA9IGdfYWxhcm1fbW9uaXRvci53YWl0Rm9yVGltZVJlbGF0aXZlKHRpbWVvdXQpOworICAgICAgaWYgKHdhaXRSZXN1bHQgPT0gVEhSSUZUX0VUSU1FRE9VVCkKKyAgICAgICAgZmlyZUhhbmRsZXIgPSB0cnVlOworICAgIH0KKyAgICBpZiAoZmlyZUhhbmRsZXIpCisgICAgICBhbGFybV9oYW5kbGVyKCk7IC8vIGNhbGxpbmcgb3V0c2lkZSB0aGUgbG9jawogICB9Ci0KLSAgc3RydWN0IHNpZ2FjdGlvbiBhY3Rpb247Ci0gIG1lbXNldCgmYWN0aW9uLCAwLCBzaXplb2YoYWN0aW9uKSk7Ci0gIGFjdGlvbi5zYV9oYW5kbGVyID0gYWxhcm1faGFuZGxlcjsKLSAgYWN0aW9uLnNhX2ZsYWdzID0gU0FfUkVTRVRIQU5EOwotICBzaWdlbXB0eXNldCgmYWN0aW9uLnNhX21hc2spOwotICBzaWdhY3Rpb24oU0lHQUxSTSwgJmFjdGlvbiwgTlVMTCk7Ci0KLSAgYWxhcm0odHJpZ2dlckluZm8tPnRpbWVvdXRTZWNvbmRzKTsKIH0KIAogLyoqCkBAIC0zOTYsMzEgKzQxOSwzNyBAQAogICogdG8gdGhlIGVuZC4pCiAgKi8KIHZvaWQgYWRkX3RyaWdnZXIodW5zaWduZWQgaW50IHNlY29uZHMsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+ICZ0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgdHJhbnNwb3J0LAogICAgICAgICAgICAgICAgICB1aW50MzJfdCB3cml0ZV9sZW4pIHsKICAgVHJpZ2dlckluZm8qIGluZm8gPSBuZXcgVHJpZ2dlckluZm8oc2Vjb25kcywgdHJhbnNwb3J0LCB3cml0ZV9sZW4pOwotCi0gIGlmICh0cmlnZ2VySW5mbyA9PSBOVUxMKSB7Ci0gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdHJpZ2dlci4KLSAgICAvLyBTZXQgdHJpZ2dlckluZm8sIGFuZCBzY2hlZHVsZSB0aGUgYWxhcm0KLSAgICB0cmlnZ2VySW5mbyA9IGluZm87Ci0gICAgc2V0X2FsYXJtKCk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gQWRkIHRoaXMgdHJpZ2dlciB0byB0aGUgZW5kIG9mIHRoZSBsaXN0Ci0gICAgVHJpZ2dlckluZm8qIHByZXYgPSB0cmlnZ2VySW5mbzsKLSAgICB3aGlsZSAocHJldi0+bmV4dCkgewotICAgICAgcHJldiA9IHByZXYtPm5leHQ7CisgIHsKKyAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKGdfYWxhcm1fbW9uaXRvcik7CisgICAgaWYgKGdfdHJpZ2dlckluZm8gPT0gTlVMTCkgeworICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdHJpZ2dlci4KKyAgICAgIC8vIFNldCBnX3RyaWdnZXJJbmZvLCBhbmQgc2NoZWR1bGUgdGhlIGFsYXJtCisgICAgICBnX3RyaWdnZXJJbmZvID0gaW5mbzsKKyAgICAgIGdfYWxhcm1fbW9uaXRvci5ub3RpZnkoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQWRkIHRoaXMgdHJpZ2dlciB0byB0aGUgZW5kIG9mIHRoZSBsaXN0CisgICAgICBUcmlnZ2VySW5mbyogcHJldiA9IGdfdHJpZ2dlckluZm87CisgICAgICB3aGlsZSAocHJldi0+bmV4dCkgeworICAgICAgICBwcmV2ID0gcHJldi0+bmV4dDsKKyAgICAgIH0KKyAgICAgIHByZXYtPm5leHQgPSBpbmZvOwogICAgIH0KLQotICAgIHByZXYtPm5leHQgPSBpbmZvOwogICB9CiB9CiAKIHZvaWQgY2xlYXJfdHJpZ2dlcnMoKSB7Ci0gIFRyaWdnZXJJbmZvICppbmZvID0gdHJpZ2dlckluZm87Ci0gIGFsYXJtKDApOwotICB0cmlnZ2VySW5mbyA9IE5VTEw7Ci0gIG51bVRyaWdnZXJzRmlyZWQgPSAwOworICBUcmlnZ2VySW5mbyogaW5mbyA9IE5VTEw7CisKKyAgeworICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3luY2hyb25pemVkIHMoZ19hbGFybV9tb25pdG9yKTsKKyAgICBpbmZvID0gZ190cmlnZ2VySW5mbzsKKyAgICBnX3RyaWdnZXJJbmZvID0gTlVMTDsKKyAgICBnX251bVRyaWdnZXJzRmlyZWQgPSAwOworICAgIGdfYWxhcm1fbW9uaXRvci5ub3RpZnkoKTsKKyAgfQogCiAgIHdoaWxlIChpbmZvICE9IE5VTEwpIHsKICAgICBUcmlnZ2VySW5mbyogbmV4dCA9IGluZm8tPm5leHQ7CkBAIC00MzAsNyArNDU5LDcgQEAKIH0KIAogdm9pZCBzZXRfdHJpZ2dlcih1bnNpZ25lZCBpbnQgc2Vjb25kcywKLSAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gJnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiB0cmFuc3BvcnQsCiAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdyaXRlX2xlbikgewogICBjbGVhcl90cmlnZ2VycygpOwogICBhZGRfdHJpZ2dlcihzZWNvbmRzLCB0cmFuc3BvcnQsIHdyaXRlX2xlbik7CkBAIC00NzQsMTAgKzUwMyw4IEBACiAgIEJPT1NUX1JFUVVJUkUodHJhbnNwb3J0cy5pbiAhPSBOVUxMKTsKICAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLm91dCAhPSBOVUxMKTsKIAotICBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IHdidWYgPQotICAgIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4obmV3IHVpbnQ4X3RbdG90YWxTaXplXSk7Ci0gIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gcmJ1ZiA9Ci0gICAgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PihuZXcgdWludDhfdFt0b3RhbFNpemVdKTsKKyAgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiB3YnVmID0gYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PihuZXcgdWludDhfdFt0b3RhbFNpemVdKTsKKyAgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiByYnVmID0gYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PihuZXcgdWludDhfdFt0b3RhbFNpemVdKTsKIAogICAvLyBzdG9yZSBzb21lIGRhdGEgaW4gd2J1ZgogICBmb3IgKHVpbnQzMl90IG4gPSAwOyBuIDwgdG90YWxTaXplOyArK24pIHsKQEAgLTQ5Nyw4ICs1MjQsNyBAQAogCiAgICAgLy8gTWFrZSBzdXJlICh0b3RhbF93cml0dGVuIC0gdG90YWxfcmVhZCkgKyB3Y2h1bmtfc2l6ZQogICAgIC8vIGlzIGxlc3MgdGhhbiBtYXhPdXRzdGFuZGluZwotICAgIGlmIChtYXhPdXRzdGFuZGluZyA+IDAgJiYKLSAgICAgICAgd2NodW5rX3NpemUgPiBtYXhPdXRzdGFuZGluZyAtICh0b3RhbF93cml0dGVuIC0gdG90YWxfcmVhZCkpIHsKKyAgICBpZiAobWF4T3V0c3RhbmRpbmcgPiAwICYmIHdjaHVua19zaXplID4gbWF4T3V0c3RhbmRpbmcgLSAodG90YWxfd3JpdHRlbiAtIHRvdGFsX3JlYWQpKSB7CiAgICAgICB3Y2h1bmtfc2l6ZSA9IG1heE91dHN0YW5kaW5nIC0gKHRvdGFsX3dyaXR0ZW4gLSB0b3RhbF9yZWFkKTsKICAgICB9CiAKQEAgLTUxMCw3ICs1MzYsMTMgQEAKICAgICAgICAgd3JpdGVfc2l6ZSA9IHdjaHVua19zaXplIC0gY2h1bmtfd3JpdHRlbjsKICAgICAgIH0KIAotICAgICAgdHJhbnNwb3J0cy5vdXQtPndyaXRlKHdidWYuZ2V0KCkgKyB0b3RhbF93cml0dGVuLCB3cml0ZV9zaXplKTsKKyAgICAgIHRyeSB7CisgICAgICAgIHRyYW5zcG9ydHMub3V0LT53cml0ZSh3YnVmLmdldCgpICsgdG90YWxfd3JpdHRlbiwgd3JpdGVfc2l6ZSk7CisgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0ZSkgeworICAgICAgICBpZiAodGUuZ2V0VHlwZSgpID09IFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgdGhyb3cgdGU7CisgICAgICB9CiAgICAgICBjaHVua193cml0dGVuICs9IHdyaXRlX3NpemU7CiAgICAgICB0b3RhbF93cml0dGVuICs9IHdyaXRlX3NpemU7CiAgICAgfQpAQCAtNTQwLDE3ICs1NzIsMTUgQEAKICAgICAgIHRyeSB7CiAgICAgICAgIGJ5dGVzX3JlYWQgPSB0cmFuc3BvcnRzLmluLT5yZWFkKHJidWYuZ2V0KCkgKyB0b3RhbF9yZWFkLCByZWFkX3NpemUpOwogICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZSkgewotICAgICAgICBCT09TVF9GQUlMKCJyZWFkKHBvcz0iIDw8IHRvdGFsX3JlYWQgPDwgIiwgc2l6ZT0iIDw8IHJlYWRfc2l6ZSA8PAotICAgICAgICAgICAgICAgICAgICIpIHRocmV3IGV4Y2VwdGlvbiBcIiIgPDwgZS53aGF0KCkgPDwKLSAgICAgICAgICAgICAgICAgICAiXCI7IHdyaXR0ZW4gc28gZmFyOiAiIDw8IHRvdGFsX3dyaXR0ZW4gPDwgIiAvICIgPDwKLSAgICAgICAgICAgICAgICAgICB0b3RhbFNpemUgPDwgIiBieXRlcyIpOworICAgICAgICBCT09TVF9GQUlMKCJyZWFkKHBvcz0iIDw8IHRvdGFsX3JlYWQgPDwgIiwgc2l6ZT0iIDw8IHJlYWRfc2l6ZSA8PCAiKSB0aHJldyBleGNlcHRpb24gXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZS53aGF0KCkgPDwgIlwiOyB3cml0dGVuIHNvIGZhcjogIiA8PCB0b3RhbF93cml0dGVuIDw8ICIgLyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdG90YWxTaXplIDw8ICIgYnl0ZXMiKTsKICAgICAgIH0KIAogICAgICAgQk9PU1RfUkVRVUlSRV9NRVNTQUdFKGJ5dGVzX3JlYWQgPiAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkKHBvcz0iIDw8IHRvdGFsX3JlYWQgPDwgIiwgc2l6ZT0iIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9zaXplIDw8ICIpIHJldHVybmVkICIgPDwgYnl0ZXNfcmVhZCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7IHdyaXR0ZW4gc28gZmFyOiAiIDw8IHRvdGFsX3dyaXR0ZW4gPDwgIiAvICIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFNpemUgPDwgIiBieXRlcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkKHBvcz0iIDw8IHRvdGFsX3JlYWQgPDwgIiwgc2l6ZT0iIDw8IHJlYWRfc2l6ZSA8PCAiKSByZXR1cm5lZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYnl0ZXNfcmVhZCA8PCAiOyB3cml0dGVuIHNvIGZhcjogIiA8PCB0b3RhbF93cml0dGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAvICIgPDwgdG90YWxTaXplIDw8ICIgYnl0ZXMiKTsKICAgICAgIGNodW5rX3JlYWQgKz0gYnl0ZXNfcmVhZDsKICAgICAgIHRvdGFsX3JlYWQgKz0gYnl0ZXNfcmVhZDsKICAgICB9CkBAIC01NzYsOCArNjA2LDM1IEBACiAgIHRyYW5zcG9ydHMub3V0LT5mbHVzaCgpOwogICBzZXRfdHJpZ2dlcigzLCB0cmFuc3BvcnRzLm91dCwgMSk7CiAgIHVpbnQzMl90IGJ5dGVzX3JlYWQgPSB0cmFuc3BvcnRzLmluLT5yZWFkKHJlYWRfYnVmLCAxMCk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKG51bVRyaWdnZXJzRmlyZWQsICh1bnNpZ25lZCBpbnQpIDApOwotICBCT09TVF9DSEVDS19FUVVBTChieXRlc19yZWFkLCAodWludDMyX3QpIDkpOworICBCT09TVF9DSEVDS19FUVVBTChnX251bVRyaWdnZXJzRmlyZWQsICh1bnNpZ25lZCBpbnQpMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGJ5dGVzX3JlYWQsICh1aW50MzJfdCk5KTsKKworICBjbGVhcl90cmlnZ2VycygpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQ291cGxlZFRyYW5zcG9ydHM+Cit2b2lkIHRlc3RfcmVhZF9wYXJ0X2F2YWlsYWJsZV9pbl9jaHVua3MoKSB7CisgIENvdXBsZWRUcmFuc3BvcnRzIHRyYW5zcG9ydHM7CisgIEJPT1NUX1JFUVVJUkUodHJhbnNwb3J0cy5pbiAhPSBOVUxMKTsKKyAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLm91dCAhPSBOVUxMKTsKKworICB1aW50OF90IHdyaXRlX2J1ZlsxNl07CisgIHVpbnQ4X3QgcmVhZF9idWZbMTZdOworICBtZW1zZXQod3JpdGVfYnVmLCAnYScsIHNpemVvZih3cml0ZV9idWYpKTsKKworICAvLyBXcml0ZSAxMCBieXRlcyAoaW4gYSBzaW5nbGUgZnJhbWUsIGZvciB0cmFuc3BvcnRzIHRoYXQgdXNlIGZyYW1pbmcpCisgIHRyYW5zcG9ydHMub3V0LT53cml0ZSh3cml0ZV9idWYsIDEwKTsKKyAgdHJhbnNwb3J0cy5vdXQtPmZsdXNoKCk7CisKKyAgLy8gUmVhZCAxIGJ5dGUsIHRvIGZvcmNlIHRoZSB0cmFuc3BvcnQgdG8gcmVhZCB0aGUgZnJhbWUKKyAgdWludDMyX3QgYnl0ZXNfcmVhZCA9IHRyYW5zcG9ydHMuaW4tPnJlYWQocmVhZF9idWYsIDEpOworICBCT09TVF9DSEVDS19FUVVBTChieXRlc19yZWFkLCAxdSk7CisKKyAgLy8gUmVhZCBtb3JlIHRoYW4gd2hhdCBpcyByZW1haW5pbmcgYW5kIHZlcmlmeSB0aGUgdHJhbnNwb3J0IGRvZXMgbm90IGJsb2NrCisgIHNldF90cmlnZ2VyKDMsIHRyYW5zcG9ydHMub3V0LCAxKTsKKyAgYnl0ZXNfcmVhZCA9IHRyYW5zcG9ydHMuaW4tPnJlYWQocmVhZF9idWYsIDEwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ19udW1UcmlnZ2Vyc0ZpcmVkLCAwdSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGJ5dGVzX3JlYWQsIDl1KTsKIAogICBjbGVhcl90cmlnZ2VycygpOwogfQpAQCAtNjE2LDcgKzY3Myw3IEBACiAKICAgLy8gTm93IHJlYWQgNCBieXRlcywgc28gdGhhdCB3ZSBhcmUgcGFydHdheSB0aHJvdWdoIHRoZSB3cml0dGVuIGRhdGEuCiAgIHVpbnQzMl90IGJ5dGVzX3JlYWQgPSB0cmFuc3BvcnRzLmluLT5yZWFkKHJlYWRfYnVmLCA0KTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnl0ZXNfcmVhZCwgKHVpbnQzMl90KSA0KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnl0ZXNfcmVhZCwgKHVpbnQzMl90KTQpOwogCiAgIC8vIE5vdyBhdHRlbXB0IHRvIHJlYWQgMTAgYnl0ZXMuICBPbmx5IDkgbW9yZSBhcmUgYXZhaWxhYmxlLgogICAvLwpAQCAtNjI5LDEzICs2ODYsMTMgQEAKICAgd2hpbGUgKHRvdGFsX3JlYWQgPCA5KSB7CiAgICAgc2V0X3RyaWdnZXIoMywgdHJhbnNwb3J0cy5vdXQsIDEpOwogICAgIGJ5dGVzX3JlYWQgPSB0cmFuc3BvcnRzLmluLT5yZWFkKHJlYWRfYnVmLCAxMCk7Ci0gICAgQk9PU1RfUkVRVUlSRV9FUVVBTChudW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KSAwKTsKLSAgICBCT09TVF9SRVFVSVJFX0dUKGJ5dGVzX3JlYWQsICh1aW50MzJfdCkgMCk7CisgICAgQk9PU1RfUkVRVUlSRV9FUVVBTChnX251bVRyaWdnZXJzRmlyZWQsICh1bnNpZ25lZCBpbnQpMCk7CisgICAgQk9PU1RfUkVRVUlSRV9HVChieXRlc19yZWFkLCAodWludDMyX3QpMCk7CiAgICAgdG90YWxfcmVhZCArPSBieXRlc19yZWFkOwotICAgIEJPT1NUX1JFUVVJUkVfTEUodG90YWxfcmVhZCwgKHVpbnQzMl90KSA5KTsKKyAgICBCT09TVF9SRVFVSVJFX0xFKHRvdGFsX3JlYWQsICh1aW50MzJfdCk5KTsKICAgfQogCi0gIEJPT1NUX0NIRUNLX0VRVUFMKHRvdGFsX3JlYWQsICh1aW50MzJfdCkgOSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvdGFsX3JlYWQsICh1aW50MzJfdCk5KTsKIAogICBjbGVhcl90cmlnZ2VycygpOwogfQpAQCAtNjU3LDcgKzcxNCw3IEBACiAgIHNldF90cmlnZ2VyKDMsIHRyYW5zcG9ydHMub3V0LCAxKTsKICAgdWludDMyX3QgYm9ycm93X2xlbiA9IDEwOwogICBjb25zdCB1aW50OF90KiBib3Jyb3dlZF9idWYgPSB0cmFuc3BvcnRzLmluLT5ib3Jyb3cocmVhZF9idWYsICZib3Jyb3dfbGVuKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwobnVtVHJpZ2dlcnNGaXJlZCwgKHVuc2lnbmVkIGludCkgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGdfbnVtVHJpZ2dlcnNGaXJlZCwgKHVuc2lnbmVkIGludCkwKTsKICAgQk9PU1RfQ0hFQ0soYm9ycm93ZWRfYnVmID09IE5VTEwpOwogCiAgIGNsZWFyX3RyaWdnZXJzKCk7CkBAIC02ODMsMTEgKzc0MCwxMSBAQAogICBhZGRfdHJpZ2dlcigxLCB0cmFuc3BvcnRzLm91dCwgOCk7CiAgIHVpbnQzMl90IGJ5dGVzX3JlYWQgPSB0cmFuc3BvcnRzLmluLT5yZWFkKHJlYWRfYnVmLCAxMCk7CiAgIGlmIChieXRlc19yZWFkID09IDApIHsKLSAgICBCT09TVF9DSEVDS19FUVVBTChudW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KSAwKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChnX251bVRyaWdnZXJzRmlyZWQsICh1bnNpZ25lZCBpbnQpMCk7CiAgICAgY2xlYXJfdHJpZ2dlcnMoKTsKICAgfSBlbHNlIHsKLSAgICBCT09TVF9DSEVDS19FUVVBTChudW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KSAxKTsKLSAgICBCT09TVF9DSEVDS19FUVVBTChieXRlc19yZWFkLCAodWludDMyX3QpIDIpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGdfbnVtVHJpZ2dlcnNGaXJlZCwgKHVuc2lnbmVkIGludCkxKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChieXRlc19yZWFkLCAodWludDMyX3QpMik7CiAgIH0KIAogICBjbGVhcl90cmlnZ2VycygpOwpAQCAtNzA3LDcgKzc2NCw3IEBACiAgIHVpbnQzMl90IGJvcnJvd19sZW4gPSAxMDsKICAgY29uc3QgdWludDhfdCogYm9ycm93ZWRfYnVmID0gdHJhbnNwb3J0cy5pbi0+Ym9ycm93KE5VTEwsICZib3Jyb3dfbGVuKTsKICAgQk9PU1RfQ0hFQ0soYm9ycm93ZWRfYnVmID09IE5VTEwpOwotICBCT09TVF9DSEVDS19FUVVBTChudW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KSAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ19udW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KTApOwogCiAgIGNsZWFyX3RyaWdnZXJzKCk7CiB9CkBAIC03MjIsNTMgKzc3OSw0NiBAQAogICogLSBDb21iaW5pbmcgbWFueSB0ZXN0cyBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uIG1ha2VzIGl0IG1vcmUgZGlmZmljdWx0IHRvCiAgKiAgIHRlbGwgcHJlY2lzZWx5IHdoaWNoIHRlc3RzIGZhaWxlZC4gIEl0IGFsc28gbWVhbnMgeW91IGNhbid0IGdldCBhIHByb2dyZXNzCiAgKiAgIHVwZGF0ZSBhZnRlciBlYWNoIHRlc3QsIGFuZCB0aGUgdGVzdHMgYXJlIGFscmVhZHkgZmFpcmx5IHNsb3cuCi0gKiAtIFNpbWlsYXIgcmVnaXN0cmF0aW9uIGNvdWxkIGJlIGFjaGVpdmVkIHdpdGggQk9PU1RfVEVTVF9DQVNFX1RFTVBMQVRFLAorICogLSBTaW1pbGFyIHJlZ2lzdHJhdGlvbiBjb3VsZCBiZSBhY2hpZXZlZCB3aXRoIEJPT1NUX1RFU1RfQ0FTRV9URU1QTEFURSwKICAqICAgYnV0IGl0IHJlcXVpcmVzIGEgbG90IG9mIGF3a3dhcmQgTVBMIGNvZGUsIGFuZCByZXN1bHRzIGluIHVzZWxlc3MgdGVzdAogICogICBjYXNlIG5hbWVzLiAgKFRoZSBuYW1lcyBhcmUgZ2VuZXJhdGVkIGZyb20gc3RkOjp0eXBlX2luZm86Om5hbWUoKSwgd2hpY2gKICAqICAgaXMgY29tcGlsZXItZGVwZW5kZW50LiAgZ2NjIHJldHVybnMgbWFuZ2xlZCBuYW1lcy4pCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgQUREX1RFU1RfUlcoQ291cGxlZFRyYW5zcG9ydHMsIHRvdGFsU2l6ZSwgLi4uKSBcCi0gICAgYWRkVGVzdFJXPCBDb3VwbGVkVHJhbnNwb3J0cyA+KEJPT1NUX1NUUklOR0laRShDb3VwbGVkVHJhbnNwb3J0cyksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTaXplLCAjIyBfX1ZBX0FSR1NfXyk7CisjZGVmaW5lIEFERF9URVNUX1JXKENvdXBsZWRUcmFuc3BvcnRzLCB0b3RhbFNpemUsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFkZFRlc3RSVzxDb3VwbGVkVHJhbnNwb3J0cz4oQk9PU1RfU1RSSU5HSVpFKENvdXBsZWRUcmFuc3BvcnRzKSwgdG90YWxTaXplLCAjI19fVkFfQVJHU19fKTsKIAotI2RlZmluZSBURVNUX1JXKENvdXBsZWRUcmFuc3BvcnRzLCB0b3RhbFNpemUsIC4uLikgXAotICBkbyB7IFwKLSAgICAvKiBBZGQgdGhlIHRlc3QgYXMgc3BlY2lmaWVkLCB0byB0ZXN0IHRoZSBub24tdmlydHVhbCBmdW5jdGlvbiBjYWxscyAqLyBcCi0gICAgQUREX1RFU1RfUlcoQ291cGxlZFRyYW5zcG9ydHMsIHRvdGFsU2l6ZSwgIyMgX19WQV9BUkdTX18pOyBcCi0gICAgLyogXAotICAgICAqIEFsc28gdGVzdCB1c2luZyB0aGUgdHJhbnNwb3J0IGFzIGEgVFRyYW5zcG9ydCosIHRvIHRlc3QgXAotICAgICAqIHRoZSByZWFkX3ZpcnQoKS93cml0ZV92aXJ0KCkgY2FsbHMgXAotICAgICAqLyBcCi0gICAgQUREX1RFU1RfUlcoQ291cGxlZFRUcmFuc3BvcnRzPENvdXBsZWRUcmFuc3BvcnRzPiwgXAotICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSwgIyMgX19WQV9BUkdTX18pOyBcCi0gICAgLyogVGVzdCB3cmFwcGluZyB0aGUgdHJhbnNwb3J0IHdpdGggVEJ1ZmZlcmVkVHJhbnNwb3J0ICovIFwKLSAgICBBRERfVEVTVF9SVyhDb3VwbGVkQnVmZmVyZWRUcmFuc3BvcnRzVDxDb3VwbGVkVHJhbnNwb3J0cz4sIFwKLSAgICAgICAgICAgICAgICB0b3RhbFNpemUsICMjIF9fVkFfQVJHU19fKTsgXAotICAgIC8qIFRlc3Qgd3JhcHBpbmcgdGhlIHRyYW5zcG9ydCB3aXRoIFRGcmFtZWRUcmFuc3BvcnRzICovIFwKLSAgICBBRERfVEVTVF9SVyhDb3VwbGVkRnJhbWVkVHJhbnNwb3J0c1Q8Q291cGxlZFRyYW5zcG9ydHM+LCBcCi0gICAgICAgICAgICAgICAgdG90YWxTaXplLCAjIyBfX1ZBX0FSR1NfXyk7IFwKLSAgICAvKiBUZXN0IHdyYXBwaW5nIHRoZSB0cmFuc3BvcnQgd2l0aCBUWmxpYlRyYW5zcG9ydCAqLyBcCi0gICAgQUREX1RFU1RfUlcoQ291cGxlZFpsaWJUcmFuc3BvcnRzVDxDb3VwbGVkVHJhbnNwb3J0cz4sIFwKLSAgICAgICAgICAgICAgICB0b3RhbFNpemUsICMjIF9fVkFfQVJHU19fKTsgXAorI2RlZmluZSBURVNUX1JXKENvdXBsZWRUcmFuc3BvcnRzLCB0b3RhbFNpemUsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIEFkZCB0aGUgdGVzdCBhcyBzcGVjaWZpZWQsIHRvIHRlc3QgdGhlIG5vbi12aXJ0dWFsIGZ1bmN0aW9uIGNhbGxzICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFERF9URVNUX1JXKENvdXBsZWRUcmFuc3BvcnRzLCB0b3RhbFNpemUsICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAqIEFsc28gdGVzdCB1c2luZyB0aGUgdHJhbnNwb3J0IGFzIGEgVFRyYW5zcG9ydCosIHRvIHRlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAqIHRoZSByZWFkX3ZpcnQoKS93cml0ZV92aXJ0KCkgY2FsbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFERF9URVNUX1JXKENvdXBsZWRUVHJhbnNwb3J0czxDb3VwbGVkVHJhbnNwb3J0cz4sIHRvdGFsU2l6ZSwgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgXAorICAgIC8qIFRlc3Qgd3JhcHBpbmcgdGhlIHRyYW5zcG9ydCB3aXRoIFRCdWZmZXJlZFRyYW5zcG9ydCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFERF9URVNUX1JXKENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHNUPENvdXBsZWRUcmFuc3BvcnRzPiwgdG90YWxTaXplLCAjI19fVkFfQVJHU19fKTsgICAgICAgICAgXAorICAgIC8qIFRlc3Qgd3JhcHBpbmcgdGhlIHRyYW5zcG9ydCB3aXRoIFRGcmFtZWRUcmFuc3BvcnRzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFERF9URVNUX1JXKENvdXBsZWRGcmFtZWRUcmFuc3BvcnRzVDxDb3VwbGVkVHJhbnNwb3J0cz4sIHRvdGFsU2l6ZSwgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgXAorICAgIC8qIFRlc3Qgd3JhcHBpbmcgdGhlIHRyYW5zcG9ydCB3aXRoIFRabGliVHJhbnNwb3J0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFERF9URVNUX1JXKENvdXBsZWRabGliVHJhbnNwb3J0c1Q8Q291cGxlZFRyYW5zcG9ydHM+LCB0b3RhbFNpemUsICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgXAogICB9IHdoaWxlICgwKQogCi0jZGVmaW5lIEFERF9URVNUX0JMT0NLSU5HKENvdXBsZWRUcmFuc3BvcnRzKSBcCi0gICAgYWRkVGVzdEJsb2NraW5nPCBDb3VwbGVkVHJhbnNwb3J0cyA+KEJPT1NUX1NUUklOR0laRShDb3VwbGVkVHJhbnNwb3J0cykpOworI2RlZmluZSBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkVHJhbnNwb3J0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhZGRUZXN0QmxvY2tpbmc8Q291cGxlZFRyYW5zcG9ydHM+KEJPT1NUX1NUUklOR0laRShDb3VwbGVkVHJhbnNwb3J0cykpOwogCi0jZGVmaW5lIFRFU1RfQkxPQ0tJTkdfQkVIQVZJT1IoQ291cGxlZFRyYW5zcG9ydHMpIFwKLSAgQUREX1RFU1RfQkxPQ0tJTkcoQ291cGxlZFRyYW5zcG9ydHMpOyBcCi0gIEFERF9URVNUX0JMT0NLSU5HKENvdXBsZWRUVHJhbnNwb3J0czxDb3VwbGVkVHJhbnNwb3J0cz4pOyBcCi0gIEFERF9URVNUX0JMT0NLSU5HKENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHNUPENvdXBsZWRUcmFuc3BvcnRzPik7IFwKLSAgQUREX1RFU1RfQkxPQ0tJTkcoQ291cGxlZEZyYW1lZFRyYW5zcG9ydHNUPENvdXBsZWRUcmFuc3BvcnRzPik7IFwKKyNkZWZpbmUgVEVTVF9CTE9DS0lOR19CRUhBVklPUihDb3VwbGVkVHJhbnNwb3J0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQUREX1RFU1RfQkxPQ0tJTkcoQ291cGxlZFRyYW5zcG9ydHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQUREX1RFU1RfQkxPQ0tJTkcoQ291cGxlZFRUcmFuc3BvcnRzPENvdXBsZWRUcmFuc3BvcnRzPik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQUREX1RFU1RfQkxPQ0tJTkcoQ291cGxlZEJ1ZmZlcmVkVHJhbnNwb3J0c1Q8Q291cGxlZFRyYW5zcG9ydHM+KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQUREX1RFU1RfQkxPQ0tJTkcoQ291cGxlZEZyYW1lZFRyYW5zcG9ydHNUPENvdXBsZWRUcmFuc3BvcnRzPik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgQUREX1RFU1RfQkxPQ0tJTkcoQ291cGxlZFpsaWJUcmFuc3BvcnRzVDxDb3VwbGVkVHJhbnNwb3J0cz4pOwogCiBjbGFzcyBUcmFuc3BvcnRUZXN0R2VuIHsKLSBwdWJsaWM6Ci0gIFRyYW5zcG9ydFRlc3RHZW4oYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUsCi0gICAgICAgICAgICAgICAgICAgZmxvYXQgc2l6ZU11bHRpcGxpZXIpIDoKLSAgICAgIHN1aXRlXyhzdWl0ZSksCi0gICAgICBzaXplTXVsdGlwbGllcl8oc2l6ZU11bHRpcGxpZXIpIHt9CitwdWJsaWM6CisgIFRyYW5zcG9ydFRlc3RHZW4oYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUsIGZsb2F0IHNpemVNdWx0aXBsaWVyKQorICAgIDogc3VpdGVfKHN1aXRlKSwgc2l6ZU11bHRpcGxpZXJfKHNpemVNdWx0aXBsaWVyKSB7fQogCiAgIHZvaWQgZ2VuZXJhdGUoKSB7CiAgICAgR2VuZXJpY1NpemVHZW5lcmF0b3IgcmFuZDRrKDEsIDQwOTYpOwpAQCAtNzc5LDEwNCArODI5LDEzOSBAQAogICAgICAqLwogCiAgICAgLy8gVE1lbW9yeUJ1ZmZlciB0ZXN0cwotICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQqMTAyNCwgMCwgMCk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCoyNTYsIHJhbmQ0aywgcmFuZDRrKTsKLSAgICBURVNUX1JXKENvdXBsZWRNZW1vcnlCdWZmZXJzLCAxMDI0KjI1NiwgMTY3LCAxNjMpOwotICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQqMTYsIDEsIDEpOworICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQgKiAxMDI0LCAwLCAwKTsKKyAgICBURVNUX1JXKENvdXBsZWRNZW1vcnlCdWZmZXJzLCAxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCAqIDI1NiwgMTY3LCAxNjMpOworICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQgKiAxNiwgMSwgMSk7CiAKLSAgICBURVNUX1JXKENvdXBsZWRNZW1vcnlCdWZmZXJzLCAxMDI0KjI1NiwgMCwgMCwgcmFuZDRrLCByYW5kNGspOwotICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQqMjU2LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOwotICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQqMjU2LCAxNjcsIDE2MywgcmFuZDRrLCByYW5kNGspOwotICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQqMTYsIDEsIDEsIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRNZW1vcnlCdWZmZXJzLCAxMDI0ICogMjU2LCAwLCAwLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCAqIDI1NiwgcmFuZDRrLCByYW5kNGssIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRNZW1vcnlCdWZmZXJzLCAxMDI0ICogMjU2LCAxNjcsIDE2MywgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQgKiAxNiwgMSwgMSwgcmFuZDRrLCByYW5kNGspOwogCiAgICAgVEVTVF9CTE9DS0lOR19CRUhBVklPUihDb3VwbGVkTWVtb3J5QnVmZmVycyk7CiAKKyNpZm5kZWYgX1dJTjMyCiAgICAgLy8gVEZEVHJhbnNwb3J0IHRlc3RzCiAgICAgLy8gU2luY2UgQ291cGxlZEZEVHJhbnNwb3J0cyB0ZXN0cyB3aXRoIGEgcGlwZSwgd3JpdGVzIHdpbGwgYmxvY2sKICAgICAvLyBpZiB0aGVyZSBpcyB0b28gbXVjaCBvdXRzdGFuZGluZyB1bnJlYWQgZGF0YSBpbiB0aGUgcGlwZS4KICAgICB1aW50MzJfdCBmZF9tYXhfb3V0c3RhbmRpbmcgPSA0MDk2OwotICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCoxMDI0LCAwLCAwLAotICAgICAgICAgICAgMCwgMCwgZmRfbWF4X291dHN0YW5kaW5nKTsKLSAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQqMjU2LCByYW5kNGssIHJhbmQ0aywKLSAgICAgICAgICAgIDAsIDAsIGZkX21heF9vdXRzdGFuZGluZyk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0KjI1NiwgMTY3LCAxNjMsCi0gICAgICAgICAgICAwLCAwLCBmZF9tYXhfb3V0c3RhbmRpbmcpOwotICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCoxNiwgMSwgMSwKLSAgICAgICAgICAgIDAsIDAsIGZkX21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0ICogMTAyNCwgMCwgMCwgMCwgMCwgZmRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrLCAwLCAwLCBmZF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgMTY3LCAxNjMsIDAsIDAsIGZkX21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0ICogMTYsIDEsIDEsIDAsIDAsIGZkX21heF9vdXRzdGFuZGluZyk7CiAKLSAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQqMjU2LCAwLCAwLAotICAgICAgICAgICAgcmFuZDRrLCByYW5kNGssIGZkX21heF9vdXRzdGFuZGluZyk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0KjI1NiwgcmFuZDRrLCByYW5kNGssCi0gICAgICAgICAgICByYW5kNGssIHJhbmQ0aywgZmRfbWF4X291dHN0YW5kaW5nKTsKLSAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQqMjU2LCAxNjcsIDE2MywKLSAgICAgICAgICAgIHJhbmQ0aywgcmFuZDRrLCBmZF9tYXhfb3V0c3RhbmRpbmcpOwotICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCoxNiwgMSwgMSwKLSAgICAgICAgICAgIHJhbmQ0aywgcmFuZDRrLCBmZF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgMCwgMCwgcmFuZDRrLCByYW5kNGssIGZkX21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGssIGZkX21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCAxNjcsIDE2MywgcmFuZDRrLCByYW5kNGssIGZkX21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0ICogMTYsIDEsIDEsIHJhbmQ0aywgcmFuZDRrLCBmZF9tYXhfb3V0c3RhbmRpbmcpOwogCiAgICAgVEVTVF9CTE9DS0lOR19CRUhBVklPUihDb3VwbGVkRkRUcmFuc3BvcnRzKTsKKyNlbHNlCisgICAgLy8gVFBpcGUgdGVzdHMgKFdJTjMyIG9ubHkpCisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAxMDI0LCAwLCAwKTsKKyAgICBURVNUX1JXKENvdXBsZWRQaXBlVHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCAxNjcsIDE2Myk7CisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAxNiwgMSwgMSk7CisKKyAgICBURVNUX1JXKENvdXBsZWRQaXBlVHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgMCwgMCwgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCAxNjcsIDE2MywgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMTYsIDEsIDEsIHJhbmQ0aywgcmFuZDRrKTsKKworICAgIFRFU1RfQkxPQ0tJTkdfQkVIQVZJT1IoQ291cGxlZFBpcGVUcmFuc3BvcnRzKTsKKyNlbmRpZiAvL19XSU4zMgogCiAgICAgLy8gVFNvY2tldCB0ZXN0cwogICAgIHVpbnQzMl90IHNvY2tldF9tYXhfb3V0c3RhbmRpbmcgPSA0MDk2OwotICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQqMTAyNCwgMCwgMCwKLSAgICAgICAgICAgIDAsIDAsIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOwotICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQqMjU2LCByYW5kNGssIHJhbmQ0aywKLSAgICAgICAgICAgIDAsIDAsIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOwotICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQqMjU2LCAxNjcsIDE2MywKLSAgICAgICAgICAgIDAsIDAsIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQgKiAxMDI0LCAwLCAwLCAwLCAwLCBzb2NrZXRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0aywgMCwgMCwgc29ja2V0X21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgMTY3LCAxNjMsIDAsIDAsIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOwogICAgIC8vIERvaC4gIEFwcGFyZW50bHkgd3JpdGluZyB0byBhIHNvY2tldCBoYXMgc29tZSBhZGRpdGlvbmFsIG92ZXJoZWFkIGZvcgogICAgIC8vIGVhY2ggc2VuZCgpIGNhbGwuICBJZiB3ZSBoYXZlIG1vcmUgdGhhbiB+NDAwIG91dHN0YW5kaW5nIDEtYnl0ZSB3cml0ZQogICAgIC8vIHJlcXVlc3RzLCBhZGRpdGlvbmFsIHNlbmQoKSBjYWxscyBzdGFydCBibG9ja2luZy4KLSAgICBURVNUX1JXKENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzLCAxMDI0KjE2LCAxLCAxLAotICAgICAgICAgICAgMCwgMCwgNDAwKTsKLSAgICBURVNUX1JXKENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzLCAxMDI0KjI1NiwgMCwgMCwKLSAgICAgICAgICAgIHJhbmQ0aywgcmFuZDRrLCBzb2NrZXRfbWF4X291dHN0YW5kaW5nKTsKLSAgICBURVNUX1JXKENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzLCAxMDI0KjI1NiwgcmFuZDRrLCByYW5kNGssCi0gICAgICAgICAgICByYW5kNGssIHJhbmQ0aywgc29ja2V0X21heF9vdXRzdGFuZGluZyk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCoyNTYsIDE2NywgMTYzLAotICAgICAgICAgICAgcmFuZDRrLCByYW5kNGssIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOwotICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQqMTYsIDEsIDEsCi0gICAgICAgICAgICByYW5kNGssIHJhbmQ0aywgNDAwKTsKKyAgICBURVNUX1JXKENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzLCAxMDI0ICogMTYsIDEsIDEsIDAsIDAsIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIDAsIDAsIHJhbmQ0aywgcmFuZDRrLCBzb2NrZXRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzLAorICAgICAgICAgICAgMTAyNCAqIDI1NiwKKyAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIDE2NywgMTYzLCByYW5kNGssIHJhbmQ0aywgc29ja2V0X21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCAqIDE2LCAxLCAxLCByYW5kNGssIHJhbmQ0aywgc29ja2V0X21heF9vdXRzdGFuZGluZyk7CiAKICAgICBURVNUX0JMT0NLSU5HX0JFSEFWSU9SKENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzKTsKIAorLy8gVGhlc2UgY291bGQgYmUgbWFkZSB0byB3b3JrIG9uIFdpbmRvd3MsIGJ1dCBJIGRvbid0IGNhcmUgZW5vdWdoIHRvIG1ha2UgaXQgaGFwcGVuCisjaWZuZGVmIF9XSU4zMgogICAgIC8vIFRGaWxlVHJhbnNwb3J0IHRlc3RzCiAgICAgLy8gV2UgdXNlIHNtYWxsZXIgYnVmZmVyIHNpemVzIGhlcmUsIHNpbmNlIFRGaWxlVHJhbnNwb3J0IGlzIGZhaXJseSBzbG93LgogICAgIC8vCiAgICAgLy8gVEZpbGVUcmFuc3BvcnQgY2FuJ3Qgd3JpdGUgbW9yZSB0aGFuIDE2TUIgYXQgb25jZQotICAgIHVpbnQzMl90IG1heF93cml0ZV9hdF9vbmNlID0gMTAyNCoxMDI0KjE2IC0gNDsKLSAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCoxMDI0LCBtYXhfd3JpdGVfYXRfb25jZSwgMCk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQqMTI4LCByYW5kNGssIHJhbmQ0ayk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQqMTI4LCAxNjcsIDE2Myk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQqMiwgMSwgMSk7CisgICAgdWludDMyX3QgbWF4X3dyaXRlX2F0X29uY2UgPSAxMDI0ICogMTAyNCAqIDE2IC0gNDsKKyAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCAqIDEwMjQsIG1heF93cml0ZV9hdF9vbmNlLCAwKTsKKyAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCAqIDEyOCwgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0ICogMTI4LCAxNjcsIDE2Myk7CisgICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQgKiAyLCAxLCAxKTsKIAotICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0KjY0LCAwLCAwLCByYW5kNGssIHJhbmQ0ayk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQqNjQsCi0gICAgICAgICAgICByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOwotICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0KjY0LCAxNjcsIDE2MywgcmFuZDRrLCByYW5kNGspOwotICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0KjIsIDEsIDEsIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCAqIDY0LCAwLCAwLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQgKiA2NCwgcmFuZDRrLCByYW5kNGssIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCAqIDY0LCAxNjcsIDE2MywgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0ICogMiwgMSwgMSwgcmFuZDRrLCByYW5kNGspOwogCiAgICAgVEVTVF9CTE9DS0lOR19CRUhBVklPUihDb3VwbGVkRmlsZVRyYW5zcG9ydHMpOworI2VuZGlmCiAKICAgICAvLyBBZGQgc29tZSB0ZXN0cyB0aGF0IGFjY2VzcyBUQnVmZmVyZWRUcmFuc3BvcnQgYW5kIFRGcmFtZWRUcmFuc3BvcnQKICAgICAvLyB2aWEgVFRyYW5zcG9ydCBwb2ludGVycyBhbmQgVEJ1ZmZlckJhc2UgcG9pbnRlcnMuCiAgICAgQUREX1RFU1RfUlcoQ291cGxlZFRUcmFuc3BvcnRzPENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHM+LAotICAgICAgICAgICAgICAgIDEwMjQqMTAyNCwgcmFuZDRrLCByYW5kNGssIHJhbmQ0aywgcmFuZDRrKTsKKyAgICAgICAgICAgICAgICAxMDI0ICogMTAyNCwKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGspOwogICAgIEFERF9URVNUX1JXKENvdXBsZWRCdWZmZXJCYXNlczxDb3VwbGVkQnVmZmVyZWRUcmFuc3BvcnRzPiwKLSAgICAgICAgICAgICAgICAxMDI0KjEwMjQsIHJhbmQ0aywgcmFuZDRrLCByYW5kNGssIHJhbmQ0ayk7CisgICAgICAgICAgICAgICAgMTAyNCAqIDEwMjQsCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrKTsKICAgICBBRERfVEVTVF9SVyhDb3VwbGVkVFRyYW5zcG9ydHM8Q291cGxlZEZyYW1lZFRyYW5zcG9ydHM+LAotICAgICAgICAgICAgICAgIDEwMjQqMTAyNCwgcmFuZDRrLCByYW5kNGssIHJhbmQ0aywgcmFuZDRrKTsKKyAgICAgICAgICAgICAgICAxMDI0ICogMTAyNCwKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGspOwogICAgIEFERF9URVNUX1JXKENvdXBsZWRCdWZmZXJCYXNlczxDb3VwbGVkRnJhbWVkVHJhbnNwb3J0cz4sCi0gICAgICAgICAgICAgICAgMTAyNCoxMDI0LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOworICAgICAgICAgICAgICAgIDEwMjQgKiAxMDI0LAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0ayk7CiAKICAgICAvLyBUZXN0IHVzaW5nIFRabGliVHJhbnNwb3J0IHZpYSBhIFRUcmFuc3BvcnQgcG9pbnRlcgogICAgIEFERF9URVNUX1JXKENvdXBsZWRUVHJhbnNwb3J0czxDb3VwbGVkWmxpYlRyYW5zcG9ydHM+LAotICAgICAgICAgICAgICAgIDEwMjQqMTAyNCwgcmFuZDRrLCByYW5kNGssIHJhbmQ0aywgcmFuZDRrKTsKKyAgICAgICAgICAgICAgICAxMDI0ICogMTAyNCwKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGspOwogICB9CiAKLSBwcml2YXRlOgorI2lmIChCT09TVF9WRVJTSU9OID49IDEwNTkwMCkKKyNkZWZpbmUgTUFLRV9URVNUX0NBU0UoX0ZVTkMsIF9OQU1FKSBib29zdDo6dW5pdF90ZXN0OjptYWtlX3Rlc3RfY2FzZShfRlVOQywgX05BTUUsIF9fRklMRV9fLCBfX0xJTkVfXykKKyNlbHNlCisjZGVmaW5lIE1BS0VfVEVTVF9DQVNFKF9GVU5DLCBfTkFNRSkgYm9vc3Q6OnVuaXRfdGVzdDo6bWFrZV90ZXN0X2Nhc2UoX0ZVTkMsIF9OQU1FKQorI2VuZGlmCisKK3ByaXZhdGU6CiAgIHRlbXBsYXRlIDxjbGFzcyBDb3VwbGVkVHJhbnNwb3J0cz4KLSAgdm9pZCBhZGRUZXN0UlcoY29uc3QgY2hhciogdHJhbnNwb3J0X25hbWUsIHVpbnQzMl90IHRvdGFsU2l6ZSwKLSAgICAgICAgICAgICAgICAgR2VuZXJpY1NpemVHZW5lcmF0b3Igd1NpemVHZW4sIEdlbmVyaWNTaXplR2VuZXJhdG9yIHJTaXplR2VuLAorICB2b2lkIGFkZFRlc3RSVyhjb25zdCBjaGFyKiB0cmFuc3BvcnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgdWludDMyX3QgdG90YWxTaXplLAorICAgICAgICAgICAgICAgICBHZW5lcmljU2l6ZUdlbmVyYXRvciB3U2l6ZUdlbiwKKyAgICAgICAgICAgICAgICAgR2VuZXJpY1NpemVHZW5lcmF0b3IgclNpemVHZW4sCiAgICAgICAgICAgICAgICAgIEdlbmVyaWNTaXplR2VuZXJhdG9yIHdDaHVua1NpemVHZW4gPSAwLAogICAgICAgICAgICAgICAgICBHZW5lcmljU2l6ZUdlbmVyYXRvciByQ2h1bmtTaXplR2VuID0gMCwKICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4T3V0c3RhbmRpbmcgPSAwLApAQCAtODg1LDU1ICs5NzAsNDYgQEAKICAgICB0b3RhbFNpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odG90YWxTaXplICogc2l6ZU11bHRpcGxpZXJfKTsKIAogICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBuYW1lOwotICAgIG5hbWUgPDwgdHJhbnNwb3J0X25hbWUgPDwgIjo6dGVzdF9ydygiIDw8IHRvdGFsU2l6ZSA8PCAiLCAiIDw8Ci0gICAgICB3U2l6ZUdlbi5kZXNjcmliZSgpIDw8ICIsICIgPDwgclNpemVHZW4uZGVzY3JpYmUoKSA8PCAiLCAiIDw8Ci0gICAgICB3Q2h1bmtTaXplR2VuLmRlc2NyaWJlKCkgPDwgIiwgIiA8PCByQ2h1bmtTaXplR2VuLmRlc2NyaWJlKCkgPDwgIiwgIiA8PAotICAgICAgbWF4T3V0c3RhbmRpbmcgPDwgIikiOworICAgIG5hbWUgPDwgdHJhbnNwb3J0X25hbWUgPDwgIjo6dGVzdF9ydygiIDw8IHRvdGFsU2l6ZSA8PCAiLCAiIDw8IHdTaXplR2VuLmRlc2NyaWJlKCkgPDwgIiwgIgorICAgICAgICAgPDwgclNpemVHZW4uZGVzY3JpYmUoKSA8PCAiLCAiIDw8IHdDaHVua1NpemVHZW4uZGVzY3JpYmUoKSA8PCAiLCAiCisgICAgICAgICA8PCByQ2h1bmtTaXplR2VuLmRlc2NyaWJlKCkgPDwgIiwgIiA8PCBtYXhPdXRzdGFuZGluZyA8PCAiKSI7CiAKLSAgICBib29zdDo6dW5pdF90ZXN0OjpjYWxsYmFjazA8PiB0ZXN0X2Z1bmMgPQotICAgICAgc3RkOjp0cjE6OmJpbmQodGVzdF9ydzxDb3VwbGVkVHJhbnNwb3J0cz4sIHRvdGFsU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIHdTaXplR2VuLCByU2l6ZUdlbiwgd0NodW5rU2l6ZUdlbiwgckNodW5rU2l6ZUdlbiwKLSAgICAgICAgICAgICAgICAgICAgIG1heE91dHN0YW5kaW5nKTsKLSAgICBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X2Nhc2UqIHRjID0KLSAgICAgIGJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKHRlc3RfZnVuYywgbmFtZS5zdHIoKSk7Ci0gICAgc3VpdGVfLT5hZGQodGMsIGV4cGVjdGVkRmFpbHVyZXMpOworI2lmIChCT09TVF9WRVJTSU9OID49IDEwNTkwMCkKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQgKCk+IHRlc3RfZnVuYworI2Vsc2UKKyAgICBib29zdDo6dW5pdF90ZXN0OjpjYWxsYmFjazA8PiB0ZXN0X2Z1bmMKKyNlbmRpZgorICAgICAgICA9IHN0ZDo6YmluZCh0ZXN0X3J3PENvdXBsZWRUcmFuc3BvcnRzPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdTaXplR2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgclNpemVHZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Q2h1bmtTaXplR2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgckNodW5rU2l6ZUdlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE91dHN0YW5kaW5nKTsKKyAgICBzdWl0ZV8tPmFkZChNQUtFX1RFU1RfQ0FTRSh0ZXN0X2Z1bmMsIG5hbWUuc3RyKCkpLCBleHBlY3RlZEZhaWx1cmVzKTsKICAgfQogCiAgIHRlbXBsYXRlIDxjbGFzcyBDb3VwbGVkVHJhbnNwb3J0cz4KLSAgdm9pZCBhZGRUZXN0QmxvY2tpbmcoY29uc3QgY2hhciogdHJhbnNwb3J0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXhwZWN0ZWRGYWlsdXJlcyA9IDApIHsKKyAgdm9pZCBhZGRUZXN0QmxvY2tpbmcoY29uc3QgY2hhciogdHJhbnNwb3J0TmFtZSwgdWludDMyX3QgZXhwZWN0ZWRGYWlsdXJlcyA9IDApIHsKICAgICBjaGFyIG5hbWVbMTAyNF07Ci0gICAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9jYXNlKiB0YzsKIAotICAgIHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzOjp0ZXN0X3JlYWRfcGFydF9hdmFpbGFibGUoKSIsCi0gICAgICAgICAgICAgdHJhbnNwb3J0TmFtZSk7Ci0gICAgdGMgPSBib29zdDo6dW5pdF90ZXN0OjptYWtlX3Rlc3RfY2FzZSgKLSAgICAgICAgICB0ZXN0X3JlYWRfcGFydF9hdmFpbGFibGU8Q291cGxlZFRyYW5zcG9ydHM+LCBuYW1lKTsKLSAgICBzdWl0ZV8tPmFkZCh0YywgZXhwZWN0ZWRGYWlsdXJlcyk7CisgICAgVEhSSUZUX1NOUFJJTlRGKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzOjp0ZXN0X3JlYWRfcGFydF9hdmFpbGFibGUoKSIsIHRyYW5zcG9ydE5hbWUpOworICAgIHN1aXRlXy0+YWRkKE1BS0VfVEVTVF9DQVNFKHRlc3RfcmVhZF9wYXJ0X2F2YWlsYWJsZTxDb3VwbGVkVHJhbnNwb3J0cz4sIG5hbWUpLCBleHBlY3RlZEZhaWx1cmVzKTsKIAotICAgIHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzOjp0ZXN0X3JlYWRfcGFydGlhbF9taWRmcmFtZSgpIiwKLSAgICAgICAgICAgICB0cmFuc3BvcnROYW1lKTsKLSAgICB0YyA9IGJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKAotICAgICAgICAgIHRlc3RfcmVhZF9wYXJ0aWFsX21pZGZyYW1lPENvdXBsZWRUcmFuc3BvcnRzPiwgbmFtZSk7Ci0gICAgc3VpdGVfLT5hZGQodGMsIGV4cGVjdGVkRmFpbHVyZXMpOworICAgIFRIUklGVF9TTlBSSU5URihuYW1lLCBzaXplb2YobmFtZSksICIlczo6dGVzdF9yZWFkX3BhcnRfYXZhaWxhYmxlX2luX2NodW5rcygpIiwgdHJhbnNwb3J0TmFtZSk7CisgICAgc3VpdGVfLT5hZGQoTUFLRV9URVNUX0NBU0UodGVzdF9yZWFkX3BhcnRfYXZhaWxhYmxlX2luX2NodW5rczxDb3VwbGVkVHJhbnNwb3J0cz4sIG5hbWUpLCBleHBlY3RlZEZhaWx1cmVzKTsKIAotICAgIHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzOjp0ZXN0X3JlYWRfbm9uZV9hdmFpbGFibGUoKSIsCi0gICAgICAgICAgICAgdHJhbnNwb3J0TmFtZSk7Ci0gICAgdGMgPSBib29zdDo6dW5pdF90ZXN0OjptYWtlX3Rlc3RfY2FzZSgKLSAgICAgICAgICB0ZXN0X3JlYWRfbm9uZV9hdmFpbGFibGU8Q291cGxlZFRyYW5zcG9ydHM+LCBuYW1lKTsKLSAgICBzdWl0ZV8tPmFkZCh0YywgZXhwZWN0ZWRGYWlsdXJlcyk7CisgICAgVEhSSUZUX1NOUFJJTlRGKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzOjp0ZXN0X3JlYWRfcGFydGlhbF9taWRmcmFtZSgpIiwgdHJhbnNwb3J0TmFtZSk7CisgICAgc3VpdGVfLT5hZGQoTUFLRV9URVNUX0NBU0UodGVzdF9yZWFkX3BhcnRpYWxfbWlkZnJhbWU8Q291cGxlZFRyYW5zcG9ydHM+LCBuYW1lKSwgZXhwZWN0ZWRGYWlsdXJlcyk7CiAKLSAgICBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlczo6dGVzdF9ib3Jyb3dfcGFydF9hdmFpbGFibGUoKSIsCi0gICAgICAgICAgICAgdHJhbnNwb3J0TmFtZSk7Ci0gICAgdGMgPSBib29zdDo6dW5pdF90ZXN0OjptYWtlX3Rlc3RfY2FzZSgKLSAgICAgICAgICB0ZXN0X2JvcnJvd19wYXJ0X2F2YWlsYWJsZTxDb3VwbGVkVHJhbnNwb3J0cz4sIG5hbWUpOwotICAgIHN1aXRlXy0+YWRkKHRjLCBleHBlY3RlZEZhaWx1cmVzKTsKKyAgICBUSFJJRlRfU05QUklOVEYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfcmVhZF9ub25lX2F2YWlsYWJsZSgpIiwgdHJhbnNwb3J0TmFtZSk7CisgICAgc3VpdGVfLT5hZGQoTUFLRV9URVNUX0NBU0UodGVzdF9yZWFkX25vbmVfYXZhaWxhYmxlPENvdXBsZWRUcmFuc3BvcnRzPiwgbmFtZSksIGV4cGVjdGVkRmFpbHVyZXMpOwogCi0gICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfYm9ycm93X25vbmVfYXZhaWxhYmxlKCkiLAotICAgICAgICAgICAgIHRyYW5zcG9ydE5hbWUpOwotICAgIHRjID0gYm9vc3Q6OnVuaXRfdGVzdDo6bWFrZV90ZXN0X2Nhc2UoCi0gICAgICAgICAgdGVzdF9ib3Jyb3dfbm9uZV9hdmFpbGFibGU8Q291cGxlZFRyYW5zcG9ydHM+LCBuYW1lKTsKLSAgICBzdWl0ZV8tPmFkZCh0YywgZXhwZWN0ZWRGYWlsdXJlcyk7CisgICAgVEhSSUZUX1NOUFJJTlRGKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzOjp0ZXN0X2JvcnJvd19wYXJ0X2F2YWlsYWJsZSgpIiwgdHJhbnNwb3J0TmFtZSk7CisgICAgc3VpdGVfLT5hZGQoTUFLRV9URVNUX0NBU0UodGVzdF9ib3Jyb3dfcGFydF9hdmFpbGFibGU8Q291cGxlZFRyYW5zcG9ydHM+LCBuYW1lKSwgZXhwZWN0ZWRGYWlsdXJlcyk7CisKKyAgICBUSFJJRlRfU05QUklOVEYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfYm9ycm93X25vbmVfYXZhaWxhYmxlKCkiLCB0cmFuc3BvcnROYW1lKTsKKyAgICBzdWl0ZV8tPmFkZChNQUtFX1RFU1RfQ0FTRSh0ZXN0X2JvcnJvd19ub25lX2F2YWlsYWJsZTxDb3VwbGVkVHJhbnNwb3J0cz4sIG5hbWUpLCBleHBlY3RlZEZhaWx1cmVzKTsKICAgfQogCiAgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlXzsKQEAgLTk0OCwxMDMgKzEwMjQsNjggQEAKICAqIEdlbmVyYWwgSW5pdGlhbGl6YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBwcmludF91c2FnZShGSUxFKiBmLCBjb25zdCBjaGFyKiBhcmd2MCkgewotICBmcHJpbnRmKGYsICJVc2FnZTogJXMgW2Jvb3N0X29wdGlvbnNdIFtvcHRpb25zXVxuIiwgYXJndjApOwotICBmcHJpbnRmKGYsICJPcHRpb25zOlxuIik7Ci0gIGZwcmludGYoZiwgIiAgLS1zZWVkPTxOPiwgLXMgPE4+XG4iKTsKLSAgZnByaW50ZihmLCAiICAtLXRtcC1kaXI9RElSLCAtdCBESVJcbiIpOwotICBmcHJpbnRmKGYsICIgIC0taGVscFxuIik7Ci19CitzdHJ1Y3QgZ2xvYmFsX2ZpeHR1cmUgeworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+IGFsYXJtVGhyZWFkXzsKKyAgZ2xvYmFsX2ZpeHR1cmUoKSB7CisjaWYgX1dJTjMyCisgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOworI2VuZGlmCiAKLXN0cnVjdCBPcHRpb25zIHsKLSAgaW50IHNlZWQ7Ci0gIGJvb2wgaGF2ZVNlZWQ7Ci0gIGZsb2F0IHNpemVNdWx0aXBsaWVyOworICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5IGZhY3Rvcnk7CisgICAgZmFjdG9yeS5zZXREZXRhY2hlZChmYWxzZSk7CisKKyAgICBhbGFybVRocmVhZF8gPSBmYWN0b3J5Lm5ld1RocmVhZCgKKyAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpGdW5jdGlvblJ1bm5lcjo6Y3JlYXRlKGFsYXJtX2hhbmRsZXJfd3JhcHBlcikpOworICAgIGFsYXJtVGhyZWFkXy0+c3RhcnQoKTsKKyAgfQorICB+Z2xvYmFsX2ZpeHR1cmUoKSB7CisgICAgeworICAgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQgcyhnX2FsYXJtX21vbml0b3IpOworICAgICAgZ190ZWFyZG93biA9IHRydWU7CisgICAgICBnX2FsYXJtX21vbml0b3Iubm90aWZ5KCk7CisgICAgfQorICAgIGFsYXJtVGhyZWFkXy0+am9pbigpOworICB9CiB9OwogCi12b2lkIHBhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSwgT3B0aW9ucyogb3B0aW9ucykgewotICBib29sIGhhdmVfc2VlZCA9IGZhbHNlOwotICBvcHRpb25zLT5zaXplTXVsdGlwbGllciA9IDE7CisjaWYgKEJPT1NUX1ZFUlNJT04gPj0gMTA1OTAwKQorQk9PU1RfR0xPQkFMX0ZJWFRVUkUoZ2xvYmFsX2ZpeHR1cmUpOworI2Vsc2UKK0JPT1NUX0dMT0JBTF9GSVhUVVJFKGdsb2JhbF9maXh0dXJlKQorI2VuZGlmCiAKLSAgc3RydWN0IG9wdGlvbiBsb25nX29wdHNbXSA9IHsKLSAgICB7ICJoZWxwIiwgZmFsc2UsIE5VTEwsICdoJyB9LAotICAgIHsgInNlZWQiLCB0cnVlLCBOVUxMLCAncycgfSwKLSAgICB7ICJ0bXAtZGlyIiwgdHJ1ZSwgTlVMTCwgJ3QnIH0sCi0gICAgeyAic2l6ZS1tdWx0aXBsaWVyIiwgdHJ1ZSwgTlVMTCwgJ3gnIH0sCi0gICAgeyBOVUxMLCAwLCBOVUxMLCAwIH0KLSAgfTsKKyNpZmRlZiBCT09TVF9URVNUX0RZTl9MSU5LCitib29sIGluaXRfdW5pdF90ZXN0X3N1aXRlKCkgeworICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmdHYsIE5VTEwpOworICBpbnQgc2VlZCA9IHR2LnR2X3NlYyBeIHR2LnR2X3VzZWM7CiAKLSAgd2hpbGUgKHRydWUpIHsKLSAgICBvcHRvcHQgPSAxOwotICAgIGludCBvcHRjaGFyID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImhzOnQ6eDoiLCBsb25nX29wdHMsIE5VTEwpOwotICAgIGlmIChvcHRjaGFyID09IC0xKSB7Ci0gICAgICBicmVhazsKLSAgICB9CisgIGluaXRyYW5kKHNlZWQpOwogCi0gICAgc3dpdGNoIChvcHRjaGFyKSB7Ci0gICAgICBjYXNlICd0JzoKLSAgICAgICAgdG1wX2RpciA9IG9wdGFyZzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdzJzogewotICAgICAgICBjaGFyICplbmRwdHI7Ci0gICAgICAgIG9wdGlvbnMtPnNlZWQgPSBzdHJ0b2wob3B0YXJnLCAmZW5kcHRyLCAwKTsKLSAgICAgICAgaWYgKGVuZHB0ciA9PSBvcHRhcmcgfHwgKmVuZHB0ciAhPSAnXDAnKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIHNlZWQgdmFsdWUgXCIlc1wiOiBtdXN0IGJlIGFuIGludGVnZXJcbiIsCi0gICAgICAgICAgICAgICAgICBvcHRhcmcpOwotICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaGF2ZV9zZWVkID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlICdoJzoKLSAgICAgICAgcHJpbnRfdXNhZ2Uoc3Rkb3V0LCBhcmd2WzBdKTsKLSAgICAgICAgZXhpdCgwKTsKLSAgICAgIGNhc2UgJ3gnOiB7Ci0gICAgICAgIGNoYXIgKmVuZHB0cjsKLSAgICAgICAgb3B0aW9ucy0+c2l6ZU11bHRpcGxpZXIgPSBzdHJ0b2Yob3B0YXJnLCAmZW5kcHRyKTsKLSAgICAgICAgaWYgKGVuZHB0ciA9PSBvcHRhcmcgfHwgKmVuZHB0ciAhPSAnXDAnKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIHNpemUgbXVsdGlwbGllciBcIiVzXCI6IG11c3QgYmUgYSBudW1iZXJcbiIsCi0gICAgICAgICAgICAgICAgICBvcHRhcmcpOwotICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9wdGlvbnMtPnNpemVNdWx0aXBsaWVyIDwgMCkgewotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW52YWxpZCBzaXplIG11bHRpcGxpZXIgXCIlc1wiOiAiCi0gICAgICAgICAgICAgICAgICAibXVzdCBiZSBub24tbmVnYXRpdmVcbiIsIG9wdGFyZyk7Ci0gICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgJz8nOgotICAgICAgICBleGl0KDEpOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgLy8gT25seSBoYXBwZW5zIGlmIHNvbWVvbmUgYWRkcyBhbm90aGVyIG9wdGlvbiB0byB0aGUgb3B0YXJnIHN0cmluZywKLSAgICAgICAgLy8gYnV0IGRvZXNuJ3QgdXBkYXRlIHRoZSBzd2l0Y2ggc3RhdGVtZW50IHRvIGhhbmRsZSBpdC4KLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmtub3duIG9wdGlvbiBcIi0lY1wiXG4iLCBvcHRjaGFyKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoIWhhdmVfc2VlZCkgewotICAgIC8vIGNob29zZSBhIHNlZWQgbm93IGlmIHRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IG9uZQotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgIHN0cnVjdCB0aW1lem9uZSB0ejsKLSAgICBnZXR0aW1lb2ZkYXkoJnR2LCAmdHopOwotICAgIG9wdGlvbnMtPnNlZWQgPSB0di50dl9zZWMgXiB0di50dl91c2VjOwotICB9CisgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlID0gJmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKTsKKyAgc3VpdGUtPnBfbmFtZS52YWx1ZSA9ICJUcmFuc3BvcnRUZXN0IjsKKyAgVHJhbnNwb3J0VGVzdEdlbiB0cmFuc3BvcnRfdGVzdF9nZW5lcmF0b3Ioc3VpdGUsIDEpOworICB0cmFuc3BvcnRfdGVzdF9nZW5lcmF0b3IuZ2VuZXJhdGUoKTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciogYXJndltdICkgeworICByZXR1cm4gOjpib29zdDo6dW5pdF90ZXN0Ojp1bml0X3Rlc3RfbWFpbigmaW5pdF91bml0X3Rlc3Rfc3VpdGUsYXJnYyxhcmd2KTsKK30KKyNlbHNlCiBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBpbml0X3VuaXRfdGVzdF9zdWl0ZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7Ci0gIC8vIFBhcnNlIGFyZ3VtZW50cwotICBPcHRpb25zIG9wdGlvbnM7Ci0gIHBhcnNlX2FyZ3MoYXJnYywgYXJndiwgJm9wdGlvbnMpOworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGFyZ2MpOworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGFyZ3YpOworICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmdHYsIE5VTEwpOworICBpbnQgc2VlZCA9IHR2LnR2X3NlYyBeIHR2LnR2X3VzZWM7CiAKLSAgaW5pdHJhbmQob3B0aW9ucy5zZWVkKTsKKyAgaW5pdHJhbmQoc2VlZCk7CiAKLSAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUgPQotICAgICZib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCk7CisgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlID0gJmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKTsKICAgc3VpdGUtPnBfbmFtZS52YWx1ZSA9ICJUcmFuc3BvcnRUZXN0IjsKLSAgVHJhbnNwb3J0VGVzdEdlbiB0cmFuc3BvcnRfdGVzdF9nZW5lcmF0b3Ioc3VpdGUsIG9wdGlvbnMuc2l6ZU11bHRpcGxpZXIpOworICBUcmFuc3BvcnRUZXN0R2VuIHRyYW5zcG9ydF90ZXN0X2dlbmVyYXRvcihzdWl0ZSwgMSk7CiAgIHRyYW5zcG9ydF90ZXN0X2dlbmVyYXRvci5nZW5lcmF0ZSgpOwotCiAgIHJldHVybiBOVUxMOwogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVHlwZWRlZlRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1R5cGVkZWZUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGU5MjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1R5cGVkZWZUZXN0LmNwcApAQCAtMCwwICsxLDI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9pc19zYW1lLmhwcD4KKyNpbmNsdWRlIDxib29zdC9zdGF0aWNfYXNzZXJ0LmhwcD4KKworI2luY2x1ZGUgImdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuaCIKKworQk9PU1RfU1RBVElDX0FTU0VSVCgoYm9vc3Q6OmlzX3NhbWU8aW50MzJfdCwgdGhyaWZ0Ojp0ZXN0OjpNeUludDMyPjo6dmFsdWUpKTsKK0JPT1NUX1NUQVRJQ19BU1NFUlQoKGJvb3N0Ojppc19zYW1lPHN0ZDo6c3RyaW5nLCB0aHJpZnQ6OnRlc3Q6Ok15U3RyaW5nPjo6dmFsdWUpKTsKK0JPT1NUX1NUQVRJQ19BU1NFUlQoCisgICAgKGJvb3N0Ojppc19zYW1lPHRocmlmdDo6dGVzdDo6VHlwZWRlZlRlc3RTdHJ1Y3QsIHRocmlmdDo6dGVzdDo6TXlTdHJ1Y3Q+Ojp2YWx1ZSkpOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1psaWJUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9abGliVGVzdC5jcHAKaW5kZXggOWRmOWRjNC4uYzgyNjgxNCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1psaWJUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvWmxpYlRlc3QuY3BwCkBAIC0xNywzMSArMTcsMzggQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUwotI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUwotCiAjaWZuZGVmIF9HTlVfU09VUkNFCiAjZGVmaW5lIF9HTlVfU09VUkNFIC8vIG5lZWRlZCBmb3IgZ2V0b3B0X2xvbmcKICNlbmRpZgogCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSIDw9IDE3MDApCisvLyBwb2x5bm9taWFsIGFuZCBzdGQ6OmZpbGxfdCB3YXJuaW5nIGhhcHBlbnMgaW4gTVNWQyAyMDEwLCAyMDEzLCBtYXliZSBvdGhlcnMKKy8vIGh0dHBzOi8vc3ZuLmJvb3N0Lm9yZy90cmFjL2Jvb3N0L3RpY2tldC8xMTQyNgorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDk5NikKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVERJTlRfSAogI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxnZXRvcHQuaD4KKyNlbmRpZgogI2luY2x1ZGUgPGNzdGRkZWY+CiAjaW5jbHVkZSA8ZnN0cmVhbT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx0cjEvZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKICNpbmNsdWRlIDxib29zdC9yYW5kb20uaHBwPgogI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9hcnJheS5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgogCi0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RabGliVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaD4KIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBib29zdDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzdHJpbmc7CiAKIGJvb3N0OjptdDE5OTM3IHJuZzsKIApAQCAtNTAsMjYgKzU3LDI0IEBACiAgKi8KIAogY2xhc3MgU2l6ZUdlbmVyYXRvciB7Ci0gcHVibGljOgorcHVibGljOgogICB2aXJ0dWFsIH5TaXplR2VuZXJhdG9yKCkge30KICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgZ2V0U2l6ZSgpID0gMDsKIH07CiAKIGNsYXNzIENvbnN0YW50U2l6ZUdlbmVyYXRvciA6IHB1YmxpYyBTaXplR2VuZXJhdG9yIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIENvbnN0YW50U2l6ZUdlbmVyYXRvcih1bnNpZ25lZCBpbnQgdmFsdWUpIDogdmFsdWVfKHZhbHVlKSB7fQotICB2aXJ0dWFsIHVuc2lnbmVkIGludCBnZXRTaXplKCkgewotICAgIHJldHVybiB2YWx1ZV87Ci0gIH0KKyAgdmlydHVhbCB1bnNpZ25lZCBpbnQgZ2V0U2l6ZSgpIHsgcmV0dXJuIHZhbHVlXzsgfQogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIHVuc2lnbmVkIGludCB2YWx1ZV87CiB9OwogCiBjbGFzcyBMb2dOb3JtYWxTaXplR2VuZXJhdG9yIDogcHVibGljIFNpemVHZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgTG9nTm9ybWFsU2l6ZUdlbmVyYXRvcihkb3VibGUgbWVhbiwgZG91YmxlIHN0ZF9kZXYpIDoKLSAgICAgIGdlbl8ocm5nLCBsb2dub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4obWVhbiwgc3RkX2RldikpIHt9CitwdWJsaWM6CisgIExvZ05vcm1hbFNpemVHZW5lcmF0b3IoZG91YmxlIG1lYW4sIGRvdWJsZSBzdGRfZGV2KQorICAgIDogZ2VuXyhybmcsIGJvb3N0Ojpsb2dub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4obWVhbiwgc3RkX2RldikpIHt9CiAKICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgZ2V0U2l6ZSgpIHsKICAgICAvLyBMb29wIHVudGlsIHdlIGdldCBhIHNpemUgb2YgMSBvciBtb3JlCkBAIC04MSwyNiArODYsMjYgQEAKICAgICB9CiAgIH0KIAotIHByaXZhdGU6Ci0gIHZhcmlhdGVfZ2VuZXJhdG9yPCBtdDE5OTM3LCBsb2dub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4gPiBnZW5fOworcHJpdmF0ZToKKyAgYm9vc3Q6OnZhcmlhdGVfZ2VuZXJhdG9yPGJvb3N0OjptdDE5OTM3LCBib29zdDo6bG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbjxkb3VibGU+ID4gZ2VuXzsKIH07CiAKLXVpbnQ4X3QqIGdlbl91bmlmb3JtX2J1ZmZlcih1aW50MzJfdCBidWZfbGVuLCB1aW50OF90IGMpIHsKK2Jvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gZ2VuX3VuaWZvcm1fYnVmZmVyKHVpbnQzMl90IGJ1Zl9sZW4sIHVpbnQ4X3QgYykgewogICB1aW50OF90KiBidWYgPSBuZXcgdWludDhfdFtidWZfbGVuXTsKICAgbWVtc2V0KGJ1ZiwgYywgYnVmX2xlbik7Ci0gIHJldHVybiBidWY7CisgIHJldHVybiBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+KGJ1Zik7CiB9CiAKLXVpbnQ4X3QqIGdlbl9jb21wcmVzc2libGVfYnVmZmVyKHVpbnQzMl90IGJ1Zl9sZW4pIHsKK2Jvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gZ2VuX2NvbXByZXNzaWJsZV9idWZmZXIodWludDMyX3QgYnVmX2xlbikgewogICB1aW50OF90KiBidWYgPSBuZXcgdWludDhfdFtidWZfbGVuXTsKIAogICAvLyBHZW5lcmF0ZSBzbWFsbCBydW5zIG9mIGFsdGVybmF0ZWx5IGluY3JlYXNpbmcgYW5kIGRlY3JlYXNpbmcgYnl0ZXMKICAgYm9vc3Q6OnVuaWZvcm1fc21hbGxpbnQ8dWludDMyX3Q+IHJ1bl9sZW5ndGhfZGlzdHJpYnV0aW9uKDEsIDY0KTsKICAgYm9vc3Q6OnVuaWZvcm1fc21hbGxpbnQ8dWludDhfdD4gYnl0ZV9kaXN0cmlidXRpb24oMCwgVUlOVDhfTUFYKTsKLSAgYm9vc3Q6OnZhcmlhdGVfZ2VuZXJhdG9yPCBib29zdDo6bXQxOTkzNywgYm9vc3Q6OnVuaWZvcm1fc21hbGxpbnQ8dWludDhfdD4gPgotICAgIGJ5dGVfZ2VuZXJhdG9yKHJuZywgYnl0ZV9kaXN0cmlidXRpb24pOwotICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8IGJvb3N0OjptdDE5OTM3LCBib29zdDo6dW5pZm9ybV9zbWFsbGludDx1aW50MzJfdD4gPgotICAgIHJ1bl9sZW5fZ2VuZXJhdG9yKHJuZywgcnVuX2xlbmd0aF9kaXN0cmlidXRpb24pOworICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8Ym9vc3Q6Om10MTk5MzcsIGJvb3N0Ojp1bmlmb3JtX3NtYWxsaW50PHVpbnQ4X3Q+ID4KKyAgICAgIGJ5dGVfZ2VuZXJhdG9yKHJuZywgYnl0ZV9kaXN0cmlidXRpb24pOworICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8Ym9vc3Q6Om10MTk5MzcsIGJvb3N0Ojp1bmlmb3JtX3NtYWxsaW50PHVpbnQzMl90PiA+CisgICAgICBydW5fbGVuX2dlbmVyYXRvcihybmcsIHJ1bl9sZW5ndGhfZGlzdHJpYnV0aW9uKTsKIAogICB1aW50MzJfdCBpZHggPSAwOwogICBpbnQ4X3Qgc3RlcCA9IDE7CkBAIC0xMjAsNDEgKzEyNSw0MSBAQAogICAgIHN0ZXAgKj0gLTE7CiAgIH0KIAotICByZXR1cm4gYnVmOworICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PihidWYpOwogfQogCi11aW50OF90KiBnZW5fcmFuZG9tX2J1ZmZlcih1aW50MzJfdCBidWZfbGVuKSB7Citib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGdlbl9yYW5kb21fYnVmZmVyKHVpbnQzMl90IGJ1Zl9sZW4pIHsKICAgdWludDhfdCogYnVmID0gbmV3IHVpbnQ4X3RbYnVmX2xlbl07CiAKICAgYm9vc3Q6OnVuaWZvcm1fc21hbGxpbnQ8dWludDhfdD4gZGlzdHJpYnV0aW9uKDAsIFVJTlQ4X01BWCk7Ci0gIGJvb3N0Ojp2YXJpYXRlX2dlbmVyYXRvcjwgYm9vc3Q6Om10MTk5MzcsIGJvb3N0Ojp1bmlmb3JtX3NtYWxsaW50PHVpbnQ4X3Q+ID4KLSAgICBnZW5lcmF0b3Iocm5nLCBkaXN0cmlidXRpb24pOworICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8Ym9vc3Q6Om10MTk5MzcsIGJvb3N0Ojp1bmlmb3JtX3NtYWxsaW50PHVpbnQ4X3Q+ID4KKyAgICAgIGdlbmVyYXRvcihybmcsIGRpc3RyaWJ1dGlvbik7CiAKICAgZm9yICh1aW50MzJfdCBuID0gMDsgbiA8IGJ1Zl9sZW47ICsrbikgewogICAgIGJ1ZltuXSA9IGdlbmVyYXRvcigpOwogICB9CiAKLSAgcmV0dXJuIGJ1ZjsKKyAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4oYnVmKTsKIH0KIAogLyoKICAqIFRlc3QgZnVuY3Rpb25zCiAgKi8KIAotdm9pZCB0ZXN0X3dyaXRlX3RoZW5fcmVhZChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4pIHsKK3ZvaWQgdGVzdF93cml0ZV90aGVuX3JlYWQoY29uc3QgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4pIHsKICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CiAgIHNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOwotICB6bGliX3RyYW5zLT53cml0ZShidWYsIGJ1Zl9sZW4pOworICB6bGliX3RyYW5zLT53cml0ZShidWYuZ2V0KCksIGJ1Zl9sZW4pOwogICB6bGliX3RyYW5zLT5maW5pc2goKTsKIAogICBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IG1pcnJvcihuZXcgdWludDhfdFtidWZfbGVuXSk7CiAgIHVpbnQzMl90IGdvdCA9IHpsaWJfdHJhbnMtPnJlYWRBbGwobWlycm9yLmdldCgpLCBidWZfbGVuKTsKICAgQk9PU1RfUkVRVUlSRV9FUVVBTChnb3QsIGJ1Zl9sZW4pOwotICBCT09TVF9DSEVDS19FUVVBTChtZW1jbXAobWlycm9yLmdldCgpLCBidWYsIGJ1Zl9sZW4pLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtY21wKG1pcnJvci5nZXQoKSwgYnVmLmdldCgpLCBidWZfbGVuKSwgMCk7CiAgIHpsaWJfdHJhbnMtPnZlcmlmeUNoZWNrc3VtKCk7CiB9CiAKLXZvaWQgdGVzdF9zZXBhcmF0ZV9jaGVja3N1bShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4pIHsKK3ZvaWQgdGVzdF9zZXBhcmF0ZV9jaGVja3N1bShjb25zdCBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGJ1ZiwgdWludDMyX3QgYnVmX2xlbikgewogICAvLyBUaGlzIG9uZSBpcyB0cmlja3kuICBJIHNlcGFyYXRlIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIHN0cmVhbSBvdXQKICAgLy8gaW50byBhIHNlcGFyYXRlIGNyYnVmXy4gIFRoZSBsYXN0IGJ5dGUgaXMgcGFydCBvZiB0aGUgY2hlY2tzdW0sCiAgIC8vIHNvIHRoZSBlbnRpcmUgcmVhZCBnb2VzIGZpbmUsIGJ1dCB3aGVuIEkgZ28gdG8gdmVyaWZ5IHRoZSBjaGVja3N1bQpAQCAtMTYzLDM5ICsxNjgsMzggQEAKICAgLy8gSXQgd29ya2VkLiAgQXdlc29tZS4KICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CiAgIHNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOwotICB6bGliX3RyYW5zLT53cml0ZShidWYsIGJ1Zl9sZW4pOworICB6bGliX3RyYW5zLT53cml0ZShidWYuZ2V0KCksIGJ1Zl9sZW4pOwogICB6bGliX3RyYW5zLT5maW5pc2goKTsKICAgc3RyaW5nIHRtcF9idWY7CiAgIG1lbWJ1Zi0+YXBwZW5kQnVmZmVyVG9TdHJpbmcodG1wX2J1Zik7CiAgIHpsaWJfdHJhbnMucmVzZXQobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFpsaWJUcmFuc3BvcnQ6OkRFRkFVTFRfVVJCVUZfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wX2J1Zi5sZW5ndGgoKS0xKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90Pih0bXBfYnVmLmxlbmd0aCgpIC0gMSkpKTsKIAogICBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IG1pcnJvcihuZXcgdWludDhfdFtidWZfbGVuXSk7CiAgIHVpbnQzMl90IGdvdCA9IHpsaWJfdHJhbnMtPnJlYWRBbGwobWlycm9yLmdldCgpLCBidWZfbGVuKTsKICAgQk9PU1RfUkVRVUlSRV9FUVVBTChnb3QsIGJ1Zl9sZW4pOwotICBCT09TVF9DSEVDS19FUVVBTChtZW1jbXAobWlycm9yLmdldCgpLCBidWYsIGJ1Zl9sZW4pLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtY21wKG1pcnJvci5nZXQoKSwgYnVmLmdldCgpLCBidWZfbGVuKSwgMCk7CiAgIHpsaWJfdHJhbnMtPnZlcmlmeUNoZWNrc3VtKCk7CiB9CiAKLXZvaWQgdGVzdF9pbmNvbXBsZXRlX2NoZWNrc3VtKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgYnVmX2xlbikgewordm9pZCB0ZXN0X2luY29tcGxldGVfY2hlY2tzdW0oY29uc3QgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4pIHsKICAgLy8gTWFrZSBzdXJlIHdlIHN0aWxsIGdldCB0aGF0ICJub3QgY29tcGxldGUiIGVycm9yIGlmCiAgIC8vIGl0IHJlYWxseSBpc24ndCBjb21wbGV0ZS4KICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CiAgIHNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOwotICB6bGliX3RyYW5zLT53cml0ZShidWYsIGJ1Zl9sZW4pOworICB6bGliX3RyYW5zLT53cml0ZShidWYuZ2V0KCksIGJ1Zl9sZW4pOwogICB6bGliX3RyYW5zLT5maW5pc2goKTsKICAgc3RyaW5nIHRtcF9idWY7CiAgIG1lbWJ1Zi0+YXBwZW5kQnVmZmVyVG9TdHJpbmcodG1wX2J1Zik7CiAgIHRtcF9idWYuZXJhc2UodG1wX2J1Zi5sZW5ndGgoKSAtIDEpOwotICBtZW1idWYtPnJlc2V0QnVmZmVyKGNvbnN0X2Nhc3Q8dWludDhfdCo+KAotICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4odG1wX2J1Zi5kYXRhKCkpKSwKLSAgICAgICAgICAgICAgICAgICAgICB0bXBfYnVmLmxlbmd0aCgpKTsKKyAgbWVtYnVmLT5yZXNldEJ1ZmZlcihjb25zdF9jYXN0PHVpbnQ4X3QqPihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPih0bXBfYnVmLmRhdGEoKSkpLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90Pih0bXBfYnVmLmxlbmd0aCgpKSk7CiAKICAgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBtaXJyb3IobmV3IHVpbnQ4X3RbYnVmX2xlbl0pOwogICB1aW50MzJfdCBnb3QgPSB6bGliX3RyYW5zLT5yZWFkQWxsKG1pcnJvci5nZXQoKSwgYnVmX2xlbik7CiAgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZ290LCBidWZfbGVuKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtY21wKG1pcnJvci5nZXQoKSwgYnVmLCBidWZfbGVuKSwgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG1lbWNtcChtaXJyb3IuZ2V0KCksIGJ1Zi5nZXQoKSwgYnVmX2xlbiksIDApOwogICB0cnkgewogICAgIHpsaWJfdHJhbnMtPnZlcmlmeUNoZWNrc3VtKCk7CiAgICAgQk9PU1RfRVJST1IoInZlcmlmeUNoZWNrc3VtKCkgZGlkIG5vdCByZXBvcnQgYW4gZXJyb3IiKTsKQEAgLTIwNCw3ICsyMDgsOCBAQAogICB9CiB9CiAKLXZvaWQgdGVzdF9yZWFkX3dyaXRlX21peChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4sCit2b2lkIHRlc3RfcmVhZF93cml0ZV9taXgoY29uc3QgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+JiB3cml0ZV9nZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiYgcmVhZF9nZW4pIHsKICAgLy8gVHJ5IGl0IHdpdGggYSBtaXggb2YgcmVhZC93cml0ZSBzaXplcy4KQEAgLTIxOCw3ICsyMjMsNyBAQAogICAgIGlmICh0b3QgKyB3cml0ZV9sZW4gPiBidWZfbGVuKSB7CiAgICAgICB3cml0ZV9sZW4gPSBidWZfbGVuIC0gdG90OwogICAgIH0KLSAgICB6bGliX3RyYW5zLT53cml0ZShidWYgKyB0b3QsIHdyaXRlX2xlbik7CisgICAgemxpYl90cmFucy0+d3JpdGUoYnVmLmdldCgpICsgdG90LCB3cml0ZV9sZW4pOwogICAgIHRvdCArPSB3cml0ZV9sZW47CiAgIH0KIApAQCAtMjM0LDE5ICsyMzksMTkgQEAKICAgICB9CiAgICAgdWludDMyX3QgZ290ID0gemxpYl90cmFucy0+cmVhZChtaXJyb3IuZ2V0KCkgKyB0b3QsIHJlYWRfbGVuKTsKICAgICBCT09TVF9SRVFVSVJFX0xFKGdvdCwgZXhwZWN0ZWRfcmVhZF9sZW4pOwotICAgIEJPT1NUX1JFUVVJUkVfTkUoZ290LCAodWludDMyX3QpIDApOworICAgIEJPT1NUX1JFUVVJUkVfTkUoZ290LCAodWludDMyX3QpMCk7CiAgICAgdG90ICs9IGdvdDsKICAgfQogCi0gIEJPT1NUX0NIRUNLX0VRVUFMKG1lbWNtcChtaXJyb3IuZ2V0KCksIGJ1ZiwgYnVmX2xlbiksIDApOworICBCT09TVF9DSEVDS19FUVVBTChtZW1jbXAobWlycm9yLmdldCgpLCBidWYuZ2V0KCksIGJ1Zl9sZW4pLCAwKTsKICAgemxpYl90cmFucy0+dmVyaWZ5Q2hlY2tzdW0oKTsKIH0KIAotdm9pZCB0ZXN0X2ludmFsaWRfY2hlY2tzdW0oY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBidWZfbGVuKSB7Cit2b2lkIHRlc3RfaW52YWxpZF9jaGVja3N1bShjb25zdCBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGJ1ZiwgdWludDMyX3QgYnVmX2xlbikgewogICAvLyBWZXJpZnkgY2hlY2tzdW0gY2hlY2tpbmcuCiAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwogICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKLSAgemxpYl90cmFucy0+d3JpdGUoYnVmLCBidWZfbGVuKTsKKyAgemxpYl90cmFucy0+d3JpdGUoYnVmLmdldCgpLCBidWZfbGVuKTsKICAgemxpYl90cmFucy0+ZmluaXNoKCk7CiAgIHN0cmluZyB0bXBfYnVmOwogICBtZW1idWYtPmFwcGVuZEJ1ZmZlclRvU3RyaW5nKHRtcF9idWYpOwpAQCAtMjY0LDExICsyNjksMTAgQEAKICAgLy8gKFdoZW4gdGhpcyBvY2N1cnMsIHZlcmlmeUNoZWNrc3VtKCkgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nCiAgIC8vIHRoYXQgdGhlIGVuZCBvZiB0aGUgZGF0YSBoYXNuJ3QgYmVlbiByZWFjaGVkLikgIEkgaGF2ZW4ndCBzZWVuIHRoaXMKICAgLy8gZXJyb3Igd2hlbiBvbmx5IG1vZGlmeWluZyBjaGVja3N1bSBieXRlcy4KLSAgaW50IGluZGV4ID0gdG1wX2J1Zi5zaXplKCkgLSAxOworICBpbnQgaW5kZXggPSBzdGF0aWNfY2FzdDxpbnQ+KHRtcF9idWYuc2l6ZSgpIC0gMSk7CiAgIHRtcF9idWZbaW5kZXhdKys7Ci0gIG1lbWJ1Zi0+cmVzZXRCdWZmZXIoY29uc3RfY2FzdDx1aW50OF90Kj4oCi0gICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPih0bXBfYnVmLmRhdGEoKSkpLAotICAgICAgICAgICAgICAgICAgICAgIHRtcF9idWYubGVuZ3RoKCkpOworICBtZW1idWYtPnJlc2V0QnVmZmVyKGNvbnN0X2Nhc3Q8dWludDhfdCo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHRtcF9idWYuZGF0YSgpKSksCisgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHRtcF9idWYubGVuZ3RoKCkpKTsKIAogICBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IG1pcnJvcihuZXcgdWludDhfdFtidWZfbGVuXSk7CiAgIHRyeSB7CkBAIC0yODAsMTEgKzI4NCwxMSBAQAogICB9CiB9CiAKLXZvaWQgdGVzdF93cml0ZV9hZnRlcl9mbHVzaChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4pIHsKK3ZvaWQgdGVzdF93cml0ZV9hZnRlcl9mbHVzaChjb25zdCBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGJ1ZiwgdWludDMyX3QgYnVmX2xlbikgewogICAvLyB3cml0ZSBzb21lIGRhdGEKICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CiAgIHNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOwotICB6bGliX3RyYW5zLT53cml0ZShidWYsIGJ1Zl9sZW4pOworICB6bGliX3RyYW5zLT53cml0ZShidWYuZ2V0KCksIGJ1Zl9sZW4pOwogCiAgIC8vIGNhbGwgZmluaXNoKCkKICAgemxpYl90cmFucy0+ZmluaXNoKCk7CkBAIC0zMjUsMjUgKzMyOSw0NSBAQAogICAgIFRabGliVHJhbnNwb3J0IHdfemxpYl90cmFucyhtZW1idWYpOwogICB9CiAKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtYnVmLT5hdmFpbGFibGVfcmVhZCgpLCAodWludDMyX3QpIDApOworICBCT09TVF9DSEVDS19FUVVBTChtZW1idWYtPmF2YWlsYWJsZV9yZWFkKCksICh1aW50MzJfdCkwKTsKK30KKwordm9pZCB0ZXN0X2dldF91bmRlcmx5aW5nX3RyYW5zcG9ydCgpIHsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOworICBCT09TVF9DSEVDS19FUVVBTChtZW1idWYuZ2V0KCksIHpsaWJfdHJhbnMtPmdldFVuZGVybHlpbmdUcmFuc3BvcnQoKS5nZXQoKSk7CiB9CiAKIC8qCiAgKiBJbml0aWFsaXphdGlvbgogICovCiAKLSNkZWZpbmUgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSwgZnVuY3Rpb24sIC4uLikgXAotICBkbyB7IFwKLSAgICA6OnN0ZDo6b3N0cmluZ3N0cmVhbSBuYW1lX3NzOyBcCi0gICAgbmFtZV9zcyA8PCBuYW1lIDw8ICItIiA8PCBCT09TVF9TVFJJTkdJWkUoZnVuY3Rpb24pOyBcCi0gICAgOjpib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X2Nhc2UqIHRjID0gOjpib29zdDo6dW5pdF90ZXN0OjptYWtlX3Rlc3RfY2FzZSggXAotICAgICAgICA6OnN0ZDo6dHIxOjpiaW5kKGZ1bmN0aW9uLCAjIyBfX1ZBX0FSR1NfXyksIFwKLSAgICAgICAgbmFtZV9zcy5zdHIoKSk7IFwKLSAgICAoc3VpdGUpLT5hZGQodGMpOyBcCisjaWYgKEJPT1NUX1ZFUlNJT04gPj0gMTA1OTAwKQorI2RlZmluZSBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lLCBfRlVOQywgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDo6c3RkOjpvc3RyaW5nc3RyZWFtIG5hbWVfc3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5hbWVfc3MgPDwgbmFtZSA8PCAiLSIgPDwgQk9PU1RfU1RSSU5HSVpFKF9GVU5DKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDo6c3RkOjpmdW5jdGlvbjx2b2lkICgpPiB0ZXN0X2Z1bmMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDo6c3RkOjpiaW5kKF9GVU5DLCAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6OmJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3RfY2FzZSogdGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgPSA6OmJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKHRlc3RfZnVuYywgbmFtZV9zcy5zdHIoKSwgX19GSUxFX18sIF9fTElORV9fKTsgICAgICAgIFwKKyAgICAoc3VpdGUpLT5hZGQodGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUsIF9GVU5DLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOjpzdGQ6Om9zdHJpbmdzdHJlYW0gbmFtZV9zczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmFtZV9zcyA8PCBuYW1lIDw8ICItIiA8PCBCT09TVF9TVFJJTkdJWkUoX0ZVTkMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOjpib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X2Nhc2UqIHRjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgID0gOjpib29zdDo6dW5pdF90ZXN0OjptYWtlX3Rlc3RfY2FzZSg6OnN0ZDo6YmluZChfRlVOQywgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjI19fVkFfQVJHU19fKSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfc3Muc3RyKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoc3VpdGUpLT5hZGQodGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgogCi12b2lkIGFkZF90ZXN0cyh1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlLAotICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYnVmLAordm9pZCBhZGRfdGVzdHMoYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUsCisgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+JiBidWYsCiAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSkgewogICBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lLCB0ZXN0X3dyaXRlX3RoZW5fcmVhZCwgYnVmLCBidWZfbGVuKTsKQEAgLTM1MiwyMCArMzc2LDMwIEBACiAgIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUsIHRlc3RfaW52YWxpZF9jaGVja3N1bSwgYnVmLCBidWZfbGVuKTsKICAgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSwgdGVzdF93cml0ZV9hZnRlcl9mbHVzaCwgYnVmLCBidWZfbGVuKTsKIAotICBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IHNpemVfMzJrKG5ldyBDb25zdGFudFNpemVHZW5lcmF0b3IoMTw8MTUpKTsKKyAgc2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiBzaXplXzMyayhuZXcgQ29uc3RhbnRTaXplR2VuZXJhdG9yKDEgPDwgMTUpKTsKICAgc2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiBzaXplX2xvZ25vcm1hbChuZXcgTG9nTm9ybWFsU2l6ZUdlbmVyYXRvcigyMCwgMzApKTsKLSAgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSA8PCAiLWNvbnN0YW50IiwKLSAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfd3JpdGVfbWl4LCBidWYsIGJ1Zl9sZW4sCi0gICAgICAgICAgICAgICAgc2l6ZV8zMmssIHNpemVfMzJrKTsKLSAgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSA8PCAiLWxvZ25vcm1hbC13cml0ZSIsCi0gICAgICAgICAgICAgICAgdGVzdF9yZWFkX3dyaXRlX21peCwgYnVmLCBidWZfbGVuLAotICAgICAgICAgICAgICAgIHNpemVfbG9nbm9ybWFsLCBzaXplXzMyayk7Ci0gIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUgPDwgIi1sb2dub3JtYWwtcmVhZCIsCi0gICAgICAgICAgICAgICAgdGVzdF9yZWFkX3dyaXRlX21peCwgYnVmLCBidWZfbGVuLAotICAgICAgICAgICAgICAgIHNpemVfMzJrLCBzaXplX2xvZ25vcm1hbCk7Ci0gIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUgPDwgIi1sb2dub3JtYWwtYm90aCIsCi0gICAgICAgICAgICAgICAgdGVzdF9yZWFkX3dyaXRlX21peCwgYnVmLCBidWZfbGVuLAotICAgICAgICAgICAgICAgIHNpemVfbG9nbm9ybWFsLCBzaXplX2xvZ25vcm1hbCk7CisgIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUgPDwgIi1jb25zdGFudCIsIHRlc3RfcmVhZF93cml0ZV9taXgsIGJ1ZiwgYnVmX2xlbiwgc2l6ZV8zMmssIHNpemVfMzJrKTsKKyAgQUREX1RFU1RfQ0FTRShzdWl0ZSwKKyAgICAgICAgICAgICAgICBuYW1lIDw8ICItbG9nbm9ybWFsLXdyaXRlIiwKKyAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfd3JpdGVfbWl4LAorICAgICAgICAgICAgICAgIGJ1ZiwKKyAgICAgICAgICAgICAgICBidWZfbGVuLAorICAgICAgICAgICAgICAgIHNpemVfbG9nbm9ybWFsLAorICAgICAgICAgICAgICAgIHNpemVfMzJrKTsKKyAgQUREX1RFU1RfQ0FTRShzdWl0ZSwKKyAgICAgICAgICAgICAgICBuYW1lIDw8ICItbG9nbm9ybWFsLXJlYWQiLAorICAgICAgICAgICAgICAgIHRlc3RfcmVhZF93cml0ZV9taXgsCisgICAgICAgICAgICAgICAgYnVmLAorICAgICAgICAgICAgICAgIGJ1Zl9sZW4sCisgICAgICAgICAgICAgICAgc2l6ZV8zMmssCisgICAgICAgICAgICAgICAgc2l6ZV9sb2dub3JtYWwpOworICBBRERfVEVTVF9DQVNFKHN1aXRlLAorICAgICAgICAgICAgICAgIG5hbWUgPDwgIi1sb2dub3JtYWwtYm90aCIsCisgICAgICAgICAgICAgICAgdGVzdF9yZWFkX3dyaXRlX21peCwKKyAgICAgICAgICAgICAgICBidWYsCisgICAgICAgICAgICAgICAgYnVmX2xlbiwKKyAgICAgICAgICAgICAgICBzaXplX2xvZ25vcm1hbCwKKyAgICAgICAgICAgICAgICBzaXplX2xvZ25vcm1hbCk7CiAKICAgLy8gVGVzdCB3aXRoIGEgcmFuZG9tIHNpemUgZGlzdHJpYnV0aW9uLAogICAvLyBidXQgdXNlIHRoZSBleGFjdCBzYW1lIGRpc3RyaWJ1dGlvbiBmb3IgcmVhZGluZyBhcyBmb3Igd3JpdGluZy4KQEAgLTM3NSw5ICs0MDksMTMgQEAKICAgLy8gYm90aCBzdGFydCB3aXRoIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9ycyBpbiB0aGUgc2FtZSBzdGF0ZS4KICAgc2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiB3cml0ZV9zaXplX2dlbihuZXcgTG9nTm9ybWFsU2l6ZUdlbmVyYXRvcigyMCwgMzApKTsKICAgc2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiByZWFkX3NpemVfZ2VuKG5ldyBMb2dOb3JtYWxTaXplR2VuZXJhdG9yKDIwLCAzMCkpOwotICBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lIDw8ICItbG9nbm9ybWFsLXNhbWUtZGlzdHJpYnV0aW9uIiwKLSAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfd3JpdGVfbWl4LCBidWYsIGJ1Zl9sZW4sCi0gICAgICAgICAgICAgICAgd3JpdGVfc2l6ZV9nZW4sIHJlYWRfc2l6ZV9nZW4pOworICBBRERfVEVTVF9DQVNFKHN1aXRlLAorICAgICAgICAgICAgICAgIG5hbWUgPDwgIi1sb2dub3JtYWwtc2FtZS1kaXN0cmlidXRpb24iLAorICAgICAgICAgICAgICAgIHRlc3RfcmVhZF93cml0ZV9taXgsCisgICAgICAgICAgICAgICAgYnVmLAorICAgICAgICAgICAgICAgIGJ1Zl9sZW4sCisgICAgICAgICAgICAgICAgd3JpdGVfc2l6ZV9nZW4sCisgICAgICAgICAgICAgICAgcmVhZF9zaXplX2dlbik7CiB9CiAKIHZvaWQgcHJpbnRfdXNhZ2UoRklMRSogZiwgY29uc3QgY2hhciogYXJndjApIHsKQEAgLTM4Nyw2NCArNDI1LDQ1IEBACiAgIGZwcmludGYoZiwgIiAgLS1oZWxwXG4iKTsKIH0KIAotdm9pZCBwYXJzZV9hcmdzKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKLSAgdWludDMyX3Qgc2VlZCA9IDA7Ci0gIGJvb2wgaGFzX3NlZWQgPSBmYWxzZTsKLQotICBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0c1tdID0gewotICAgIHsgImhlbHAiLCBmYWxzZSwgTlVMTCwgJ2gnIH0sCi0gICAgeyAic2VlZCIsIHRydWUsIE5VTEwsICdzJyB9LAotICAgIHsgTlVMTCwgMCwgTlVMTCwgMCB9Ci0gIH07Ci0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICBvcHRvcHQgPSAxOwotICAgIGludCBvcHRjaGFyID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImhzOiIsIGxvbmdfb3B0cywgTlVMTCk7Ci0gICAgaWYgKG9wdGNoYXIgPT0gLTEpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHN3aXRjaCAob3B0Y2hhcikgewotICAgICAgY2FzZSAncyc6IHsKLSAgICAgICAgY2hhciAqZW5kcHRyOwotICAgICAgICBzZWVkID0gc3RydG9sKG9wdGFyZywgJmVuZHB0ciwgMCk7Ci0gICAgICAgIGlmIChlbmRwdHIgPT0gb3B0YXJnIHx8ICplbmRwdHIgIT0gJ1wwJykgewotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW52YWxpZCBzZWVkIHZhbHVlIFwiJXNcIjogbXVzdCBiZSBhIHBvc2l0aXZlICIKLSAgICAgICAgICAgICAgICAgICJpbnRlZ2VyXG4iLCBvcHRhcmcpOwotICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaGFzX3NlZWQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgJ2gnOgotICAgICAgICBwcmludF91c2FnZShzdGRvdXQsIGFyZ3ZbMF0pOwotICAgICAgICBleGl0KDApOwotICAgICAgY2FzZSAnPyc6Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAvLyBPbmx5IGhhcHBlbnMgaWYgc29tZW9uZSBhZGRzIGFub3RoZXIgb3B0aW9uIHRvIHRoZSBvcHRhcmcgc3RyaW5nLAotICAgICAgICAvLyBidXQgZG9lc24ndCB1cGRhdGUgdGhlIHN3aXRjaCBzdGF0ZW1lbnQgdG8gaGFuZGxlIGl0LgotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVua25vd24gb3B0aW9uIFwiLSVjXCJcbiIsIG9wdGNoYXIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgfQotCi0gIGlmICghaGFzX3NlZWQpIHsKLSAgICBzZWVkID0gdGltZShOVUxMKTsKLSAgfQotCisjaWZkZWYgQk9PU1RfVEVTVF9EWU5fTElOSworYm9vbCBpbml0X3VuaXRfdGVzdF9zdWl0ZSgpIHsKKyAgdWludDMyX3Qgc2VlZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0aW1lKE5VTEwpKTsKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKICAgcHJpbnRmKCJzZWVkOiAlIiBQUkl1MzIgIlxuIiwgc2VlZCk7CisjZW5kaWYKICAgcm5nLnNlZWQoc2VlZCk7Ci19CiAKLXVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogaW5pdF91bml0X3Rlc3Rfc3VpdGUoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewotICBwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpOwotCi0gIHVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUgPQotICAgICZib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCk7CisgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlID0gJmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKTsKICAgc3VpdGUtPnBfbmFtZS52YWx1ZSA9ICJabGliVGVzdCI7CiAKLSAgdWludDMyX3QgYnVmX2xlbiA9IDEwMjQqMzI7CisgIHVpbnQzMl90IGJ1Zl9sZW4gPSAxMDI0ICogMzI7CisgIGFkZF90ZXN0cyhzdWl0ZSwgZ2VuX3VuaWZvcm1fYnVmZmVyKGJ1Zl9sZW4sICdhJyksIGJ1Zl9sZW4sICJ1bmlmb3JtIik7CisgIGFkZF90ZXN0cyhzdWl0ZSwgZ2VuX2NvbXByZXNzaWJsZV9idWZmZXIoYnVmX2xlbiksIGJ1Zl9sZW4sICJjb21wcmVzc2libGUiKTsKKyAgYWRkX3Rlc3RzKHN1aXRlLCBnZW5fcmFuZG9tX2J1ZmZlcihidWZfbGVuKSwgYnVmX2xlbiwgInJhbmRvbSIpOworCisgIHN1aXRlLT5hZGQoQk9PU1RfVEVTVF9DQVNFKHRlc3Rfbm9fd3JpdGUpKTsKKyAgc3VpdGUtPmFkZChCT09TVF9URVNUX0NBU0UodGVzdF9nZXRfdW5kZXJseWluZ190cmFuc3BvcnQpKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworaW50IG1haW4oIGludCBhcmdjLCBjaGFyKiBhcmd2W10gKSB7CisgIHJldHVybiA6OmJvb3N0Ojp1bml0X3Rlc3Q6OnVuaXRfdGVzdF9tYWluKCZpbml0X3VuaXRfdGVzdF9zdWl0ZSxhcmdjLGFyZ3YpOworfQorI2Vsc2UKK2Jvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmdjKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmd2KTsKKyAgdWludDMyX3Qgc2VlZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0aW1lKE5VTEwpKTsKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyAgcHJpbnRmKCJzZWVkOiAlIiBQUkl1MzIgIlxuIiwgc2VlZCk7CisjZW5kaWYKKyAgcm5nLnNlZWQoc2VlZCk7CisKKyAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUgPSAmYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpOworICBzdWl0ZS0+cF9uYW1lLnZhbHVlID0gIlpsaWJUZXN0IjsKKworICB1aW50MzJfdCBidWZfbGVuID0gMTAyNCAqIDMyOwogICBhZGRfdGVzdHMoc3VpdGUsIGdlbl91bmlmb3JtX2J1ZmZlcihidWZfbGVuLCAnYScpLCBidWZfbGVuLCAidW5pZm9ybSIpOwogICBhZGRfdGVzdHMoc3VpdGUsIGdlbl9jb21wcmVzc2libGVfYnVmZmVyKGJ1Zl9sZW4pLCBidWZfbGVuLCAiY29tcHJlc3NpYmxlIik7CiAgIGFkZF90ZXN0cyhzdWl0ZSwgZ2VuX3JhbmRvbV9idWZmZXIoYnVmX2xlbiksIGJ1Zl9sZW4sICJyYW5kb20iKTsKQEAgLTQ1MywzICs0NzIsNCBAQAogCiAgIHJldHVybiBOVUxMOwogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvTXV0ZXhUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9NdXRleFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MWVjMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvTXV0ZXhUZXN0LmNwcApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBUaGlzIGlzIGxpbmtlZCBpbnRvIHRoZSBVbml0VGVzdHMgdGVzdCBleGVjdXRhYmxlCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKKyNpbmNsdWRlICJ0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmgiCisKK3VzaW5nIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGU7Cit1c2luZyBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlOworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OworCitzdHJ1Y3QgTEZBVAoreworICBMRkFUKCkKKyAgICA6IHV1dChNdXRleDo6RVJST1JDSEVDS19JTklUSUFMSVpFUikKKyAgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbXgsIDApKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTCgwLCBwdGhyZWFkX2NvbmRfaW5pdCgmY3YsIDApKTsKKyAgfQorCisgIE11dGV4IHV1dDsKKyAgcHRocmVhZF9tdXRleF90IG14OworICBwdGhyZWFkX2NvbmRfdCBjdjsKK307CisKKy8vIEhlbHBlciBmb3IgdGVzdGluZyBtdXRleCBiZWhhdmlvciB3aGVuIGxvY2tlZCBieSBhbm90aGVyIHRocmVhZAordm9pZCAqIGxvY2tGcm9tQW5vdGhlclRocmVhZCh2b2lkICpwdHIpCit7CisgIHN0cnVjdCBMRkFUICpsZmF0ID0gKExGQVQgKilwdHI7CisgIEJPT1NUX0NIRUNLX0VRVUFMICAgKDAsIHB0aHJlYWRfbXV0ZXhfbG9jaygmbGZhdC0+bXgpKTsgICAgICAgICAgIC8vIHN5bmNocm9uaXplIHdpdGggdGVzdGluZyB0aHJlYWQKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIGxmYXQtPnV1dC5sb2NrKCkpOworICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX2NvbmRfc2lnbmFsKCZsZmF0LT5jdikpOyAgICAgICAgICAvLyB0ZWxsIHRlc3RpbmcgdGhyZWFkIHdlIGhhdmUgbG9ja2VkIHRoZSBtdXRleAorICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX2NvbmRfd2FpdCgmbGZhdC0+Y3YsICZsZmF0LT5teCkpOyAvLyB3YWl0IGZvciB0ZXN0aW5nIHRocmVhZCB0byBzaWduYWwgY29uZGl0aW9uIHZhcmlhYmxlIHRlbGxpbmcgdXMgdG8gdW5sb2NrCisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCBsZmF0LT51dXQudW5sb2NrKCkpOworICByZXR1cm4gcHRyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXN0aW5nIHRocmVhZCBzaG91bGQgam9pbiB0byBlbnN1cmUgY29tcGxldGVuZXNzCit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShNdXRleFRlc3QpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKGhhcHB5X3BhdGgpCit7CisgIE11dGV4IHV1dChNdXRleDo6RVJST1JDSEVDS19JTklUSUFMSVpFUik7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWRlZCB0byB0ZXN0IHVubG9ja2luZyB0d2ljZSB3aXRob3V0IHVuZGVmaW5lZCBiZWhhdmlvcgorCisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1cgICAoIHV1dC5sb2NrKCksIFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKTsgICAgICAgLy8gRURFQURMSyAodGhpcyB0aHJlYWQgb3ducyBpdCkKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC51bmxvY2soKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHJlY3Vyc2l2ZV9oYXBweV9wYXRoKQoreworICBNdXRleCB1dXQoTXV0ZXg6OlJFQ1VSU0lWRV9JTklUSUFMSVpFUik7CisKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC5sb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQudW5sb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC51bmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC51bmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQudW5sb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LnVubG9jaygpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodHJ5bG9jaykKK3sKKyAgTXV0ZXggdXV0KE11dGV4OjpBREFQVElWRV9JTklUSUFMSVpFUik7ICAgLy8ganVzdCB1c2luZyBhbm90aGVyIGluaXRpYWxpemVyIGZvciBjb3ZlcmFnZQorCisgIEJPT1NUX0NIRUNLICAgICAgICAgKCB1dXQudHJ5bG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0sgICAgICAgICAoIXV1dC50cnlsb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LnVubG9jaygpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGltZWRsb2NrKQoreworICBwdGhyZWFkX3QgdGg7CisgIHN0cnVjdCBMRkFUIGxmYXQ7CisKKyAgQk9PU1RfQ0hFQ0sgICAgICAgICAoIGxmYXQudXV0LnRpbWVkbG9jaygxMDApKTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1cgICAoIGxmYXQudXV0LnRpbWVkbG9jaygxMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24pOyAgICAgICAgICAgICAgICAgICAvLyBFREVBRExLIChjdXJyZW50IHRocmVhZCBvd25zIG11dGV4IC0gbG9naWMgZXJyb3IpCisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCBsZmF0LnV1dC51bmxvY2soKSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9tdXRleF9sb2NrKCZsZmF0Lm14KSk7ICAgICAgICAgICAgLy8gc3luY2hyb25pemUgd2l0aCBoZWxwZXIgdGhyZWFkCisgIEJPT1NUX0NIRUNLX0VRVUFMICAgKDAsIHB0aHJlYWRfY3JlYXRlKCZ0aCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrRnJvbUFub3RoZXJUaHJlYWQsICZsZmF0KSk7ICAgICAgICAgLy8gY3JlYXRlIGhlbHBlciB0aHJlYWQKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9jb25kX3dhaXQoJmxmYXQuY3YsICZsZmF0Lm14KSk7ICAgLy8gd2FpdCBmb3IgaGVscGVyIHRocmVhZCB0byBsb2NrIG11dGV4CisKKyAgQk9PU1RfQ0hFQ0sgICAgICAgICAoIWxmYXQudXV0LnRpbWVkbG9jaygxMDApKTsgICAgICAgICAgICAgICAgICAgLy8gZmFsc2U6IGFub3RoZXIgdGhyZWFkIG93bnMgdGhlIGxvY2sKKworICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX2NvbmRfc2lnbmFsKCZsZmF0LmN2KSk7ICAgICAgICAgICAvLyB0ZWxsIGhlbHBlciB0aHJlYWQgd2UgYXJlIGRvbmUKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9tdXRleF91bmxvY2soJmxmYXQubXgpKTsgICAgICAgICAgLy8gbGV0IGhlbHBlciB0aHJlYWQgY2xlYW4gdXAKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9qb2luKHRoLCAwKSk7ICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgdGVzdGluZyB0aHJlYWQgdG8gdW5sb2NrIGFuZCBiZSBkb25lCit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHVuZGVybHlpbmcpCit7CisgIE11dGV4IHV1dDsKKworICBCT09TVF9DSEVDSyAgICAgICAgICggdXV0LmdldFVuZGVybHlpbmdJbXBsKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9SV011dGV4U3RhcnZlVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvUldNdXRleFN0YXJ2ZVRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NWEyMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvUldNdXRleFN0YXJ2ZVRlc3QuY3BwCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFRoaXMgaXMgbGlua2VkIGludG8gdGhlIFVuaXRUZXN0cyB0ZXN0IGV4ZWN1dGFibGUKKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKworI2luY2x1ZGUgInRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oIgorI2luY2x1ZGUgInRocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGU7Cit1c2luZyBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlOworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OworCitjbGFzcyBMb2NrZXIgOiBwdWJsaWMgUnVubmFibGUgeworcHJvdGVjdGVkOgorICBMb2NrZXIoc2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrLCBib29sIHdyaXRlcikKKyAgICA6IHJ3bG9ja18ocndsb2NrKSwgd3JpdGVyXyh3cml0ZXIpLCBzdGFydGVkXyhmYWxzZSksIGdvdExvY2tfKGZhbHNlKSwgc2lnbmFsZWRfKGZhbHNlKSB7fQorCitwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBydW4oKSB7CisgICAgc3RhcnRlZF8gPSB0cnVlOworICAgIGlmICh3cml0ZXJfKSB7CisgICAgICByd2xvY2tfLT5hY3F1aXJlV3JpdGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgcndsb2NrXy0+YWNxdWlyZVJlYWQoKTsKKyAgICB9CisgICAgZ290TG9ja18gPSB0cnVlOworICAgIHdoaWxlICghc2lnbmFsZWRfKSB7CisgICAgICB1c2xlZXAoNTAwMCk7CisgICAgfQorICAgIHJ3bG9ja18tPnJlbGVhc2UoKTsKKyAgfQorCisgIGJvb2wgc3RhcnRlZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXJ0ZWRfOyB9CisgIGJvb2wgZ290TG9jaygpIGNvbnN0IHsgcmV0dXJuIGdvdExvY2tfOyB9CisgIHZvaWQgc2lnbmFsKCkgeyBzaWduYWxlZF8gPSB0cnVlOyB9CisKK3Byb3RlY3RlZDoKKyAgc2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrXzsKKyAgYm9vbCB3cml0ZXJfOworICB2b2xhdGlsZSBib29sIHN0YXJ0ZWRfOworICB2b2xhdGlsZSBib29sIGdvdExvY2tfOworICB2b2xhdGlsZSBib29sIHNpZ25hbGVkXzsKK307CisKK2NsYXNzIFJlYWRlciA6IHB1YmxpYyBMb2NrZXIgeworcHVibGljOgorICBSZWFkZXIoc2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrKSA6IExvY2tlcihyd2xvY2ssIGZhbHNlKSB7fQorfTsKKworY2xhc3MgV3JpdGVyIDogcHVibGljIExvY2tlciB7CitwdWJsaWM6CisgIFdyaXRlcihzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2spIDogTG9ja2VyKHJ3bG9jaywgdHJ1ZSkge30KK307CisKK3ZvaWQgdGVzdF9zdGFydmUoUG9zaXhUaHJlYWRGYWN0b3J5OjpQT0xJQ1kgcG9saWN5KSB7CisgIC8vIHRoZSBtYW4gcGFnZXMgZm9yIHB0aHJlYWRfd3Jsb2NrX3JkbG9jayBzdWdnZXN0IHRoYXQgYW55IE9TIGd1YXJhbnRlZSBhYm91dAorICAvLyB3cml0ZXIgc3RhcnZhdGlvbiBtYXkgYmUgaW5mbHVlbmNlZCBieSB0aGUgc2NoZWR1bGluZyBwb2xpY3ksIHNvIGxldCdzIHRyeQorICAvLyBhbGwgMyBwb2xpY2llcyB0byBzZWUgaWYgYW55IG9mIHRoZW0gd29yay4KKyAgUG9zaXhUaHJlYWRGYWN0b3J5IGZhY3RvcnkocG9saWN5KTsKKyAgZmFjdG9yeS5zZXREZXRhY2hlZChmYWxzZSk7CisKKyAgc2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrKG5ldyBOb1N0YXJ2ZVJlYWRXcml0ZU11dGV4KCkpOworCisgIHNoYXJlZF9wdHI8UmVhZGVyPiByZWFkZXIxKG5ldyBSZWFkZXIocndsb2NrKSk7CisgIHNoYXJlZF9wdHI8UmVhZGVyPiByZWFkZXIyKG5ldyBSZWFkZXIocndsb2NrKSk7CisgIHNoYXJlZF9wdHI8V3JpdGVyPiB3cml0ZXIobmV3IFdyaXRlcihyd2xvY2spKTsKKworICBzaGFyZWRfcHRyPFRocmVhZD4gdHJlYWRlcjEgPSBmYWN0b3J5Lm5ld1RocmVhZChyZWFkZXIxKTsKKyAgc2hhcmVkX3B0cjxUaHJlYWQ+IHRyZWFkZXIyID0gZmFjdG9yeS5uZXdUaHJlYWQocmVhZGVyMik7CisgIHNoYXJlZF9wdHI8VGhyZWFkPiB0d3JpdGVyID0gZmFjdG9yeS5uZXdUaHJlYWQod3JpdGVyKTsKKworICAvLyBsYXVuY2ggYSByZWFkZXIgYW5kIG1ha2Ugc3VyZSBoZSBoYXMgdGhlIGxvY2sKKyAgdHJlYWRlcjEtPnN0YXJ0KCk7CisgIHdoaWxlICghcmVhZGVyMS0+Z290TG9jaygpKSB7CisgICAgdXNsZWVwKDIwMDApOworICB9CisKKyAgLy8gbGF1bmNoIGEgd3JpdGVyIGFuZCBtYWtlIHN1cmUgaGUncyBibG9ja2VkIG9uIHRoZSBsb2NrCisgIHR3cml0ZXItPnN0YXJ0KCk7CisgIHdoaWxlICghd3JpdGVyLT5zdGFydGVkKCkpIHsKKyAgICB1c2xlZXAoMjAwMCk7CisgIH0KKyAgLy8gdHJpY2t5IHBhcnQuLi4gd2UgY2FuIG5ldmVyIGJlIDEwMCUgc3VyZSB0aGF0IHRoZSB3cml0ZXIgaXMgYWN0dWFsbHkKKyAgLy8gYmxvY2tlZCBvbiB0aGUgbG9jaywgYnV0IHdlIGNhbiBwcmV0dHkgcmVhc29uYWJseSBzdXJlIGJlY2F1c2Ugd2Uga25vdworICAvLyBoZSBqdXN0IGV4ZWN1dGVkIHRoZSBsaW5lIGltbWVkaWF0ZWx5IGJlZm9yZSBnZXR0aW5nIHRoZSBsb2NrLCBhbmQKKyAgLy8gd2UnbGwgd2FpdCBhIGZ1bGwgc2Vjb25kIGZvciBoaW0gdG8gZ2V0IG9uIGl0LgorICBzbGVlcCgxKTsKKworICAvLyBsYXVuY2ggYSBzZWNvbmQgcmVhZGVyLi4uIGlmIHRoZSBSV011dGV4IGd1YXJhbnRlZXMgdGhhdCB3cml0ZXJzIHdvbid0CisgIC8vIHN0YXJ2ZSwgdGhpcyByZWFkZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGFjcXVpcmUgdGhlIGxvY2sgdW50aWwgdGhlIHdyaXRlcgorICAvLyBoYXMgYWNxdWlyZWQgYW5kIHJlbGVhc2VkIGl0LgorICB0cmVhZGVyMi0+c3RhcnQoKTsKKyAgd2hpbGUgKCFyZWFkZXIyLT5zdGFydGVkKCkpIHsKKyAgICB1c2xlZXAoMjAwMCk7CisgIH0KKyAgLy8gYWdhaW4uLi4gY2FuJ3QgYmUgMTAwJSBzdXJlIHRoZSByZWFkZXIgaXMgd2FpdGluZyBvbiAob3IgaGFzKSB0aGUgbG9jaworICAvLyBidXQgd2UgY2FuIGJlIGNsb3NlLgorICBzbGVlcCgxKTsKKworICAvLyB0ZWxsIHJlYWRlciAxIHRvIGxldCBnbyBvZiB0aGUgbG9jaworICByZWFkZXIxLT5zaWduYWwoKTsKKworICAvLyB3YWl0IGZvciBzb21lb25lIHRvIGdldCB0aGUgbG9jaworICB3aGlsZSAoIXJlYWRlcjItPmdvdExvY2soKSAmJiAhd3JpdGVyLT5nb3RMb2NrKCkpIHsKKyAgICB1c2xlZXAoMjAwMCk7CisgIH0KKworICAvLyB0aGUgdGVzdCBzdWNjZWVkZWQgaWYgdGhlIFdSSVRFUiBnb3QgdGhlIGxvY2suCisgIGJvb2wgc3VjY2VzcyA9IHdyaXRlci0+Z290TG9jaygpOworCisgIC8vIHRlbGwgZXZlcnlvbmUgd2UncmUgZG9uZSBhbmQgd2FpdCBmb3IgdGhlbSB0byBmaW5pc2gKKyAgcmVhZGVyMi0+c2lnbmFsKCk7CisgIHdyaXRlci0+c2lnbmFsKCk7CisgIHRyZWFkZXIxLT5qb2luKCk7CisgIHRyZWFkZXIyLT5qb2luKCk7CisgIHR3cml0ZXItPmpvaW4oKTsKKworICAvLyBtYWtlIHN1cmUgaXQgd29ya2VkLgorICBCT09TVF9DSEVDS19NRVNTQUdFKHN1Y2Nlc3MsICJ3cml0ZXIgaXMgc3RhcnZpbmciKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFJXTXV0ZXhTdGFydmVUZXN0KQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3N0YXJ2ZV9vdGhlcikgeworICB0ZXN0X3N0YXJ2ZShQb3NpeFRocmVhZEZhY3Rvcnk6Ok9USEVSKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zdGFydmVfcnIpIHsKKyAgdGVzdF9zdGFydmUoUG9zaXhUaHJlYWRGYWN0b3J5OjpST1VORF9ST0JJTik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3RhcnZlX2ZpZm8pIHsKKyAgdGVzdF9zdGFydmUoUG9zaXhUaHJlYWRGYWN0b3J5OjpGSUZPKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGVzdHMuY3BwIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1Rlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzBiYTdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1Rlc3RzLmNwcApAQCAtMCwwICsxLDIyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgIlRocmVhZEZhY3RvcnlUZXN0cy5oIgorI2luY2x1ZGUgIlRpbWVyTWFuYWdlclRlc3RzLmgiCisjaW5jbHVkZSAiVGhyZWFkTWFuYWdlclRlc3RzLmgiCisKKy8vIFRoZSB0ZXN0IHdlaWdodCwgd2hlcmUgMTAgaXMgMTAgdGltZXMgbW9yZSB0aHJlYWRzIHRoYW4gYmFzZWxpbmUKKy8vIGFuZCB0aGUgYmFzZWxpbmUgaXMgb3B0aW1pemVkIGZvciBydW5uaW5nIGluIHZhbGdyaW5kCitzdGF0aWMgaW50IFdFSUdIVCA9IDEwOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKworICBzdGQ6OnN0cmluZyBhcmc7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ3MoYXJnYyAtIDEgPiAxID8gYXJnYyAtIDEgOiAxKTsKKworICBhcmdzWzBdID0gImFsbCI7CisKKyAgZm9yIChpbnQgaXggPSAxOyBpeCA8IGFyZ2M7IGl4KyspIHsKKyAgICBhcmdzW2l4IC0gMV0gPSBzdGQ6OnN0cmluZyhhcmd2W2l4XSk7CisgIH0KKworICBpZiAoZ2V0ZW52KCJWQUxHUklORCIpICE9IDApIHsKKwkgIC8vIGxvd2VyIHRoZSBzY2FsZSBvZiBldmVyeSB0ZXN0CisJICBXRUlHSFQgPSAxOworICB9CisKKyAgYm9vbCBydW5BbGwgPSBhcmdzWzBdLmNvbXBhcmUoImFsbCIpID09IDA7CisKKyAgaWYgKHJ1bkFsbCB8fCBhcmdzWzBdLmNvbXBhcmUoInRocmVhZC1mYWN0b3J5IikgPT0gMCkgeworCisgICAgVGhyZWFkRmFjdG9yeVRlc3RzIHRocmVhZEZhY3RvcnlUZXN0czsKKworICAgIHN0ZDo6Y291dCA8PCAiVGhyZWFkRmFjdG9yeSB0ZXN0cy4uLiIgPDwgc3RkOjplbmRsOworCisgICAgaW50IHJlYXBMb29wcyA9IDIgKiBXRUlHSFQ7CisgICAgaW50IHJlYXBDb3VudCA9IDEwMCAqIFdFSUdIVDsKKyAgICBzaXplX3QgZmxvb2RMb29wcyA9IDM7CisgICAgc2l6ZV90IGZsb29kQ291bnQgPSA1MDAgKiBXRUlHSFQ7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IHJlYXAgTiB0aHJlYWRzIHRlc3Q6IE4gPSAiIDw8IHJlYXBMb29wcyA8PCAieCIgPDwgcmVhcENvdW50IDw8IHN0ZDo6ZW5kbDsKKworICAgIGlmICghdGhyZWFkRmFjdG9yeVRlc3RzLnJlYXBOVGhyZWFkcyhyZWFwTG9vcHMsIHJlYXBDb3VudCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdHRUaHJlYWRGYWN0b3J5IHJlYXAgTiB0aHJlYWRzIEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkRmFjdG9yeSBmbG9vZCBOIHRocmVhZHMgdGVzdDogTiA9ICIgPDwgZmxvb2RMb29wcyA8PCAieCIgPDwgZmxvb2RDb3VudCA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRocmVhZEZhY3RvcnlUZXN0cy5mbG9vZE5UZXN0KGZsb29kTG9vcHMsIGZsb29kQ291bnQpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHR0VGhyZWFkRmFjdG9yeSBmbG9vZCBOIHRocmVhZHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IHN5bmNocm9ub3VzIHN0YXJ0IHRlc3QiIDw8IHN0ZDo6ZW5kbDsKKworICAgIGlmICghdGhyZWFkRmFjdG9yeVRlc3RzLnN5bmNoU3RhcnRUZXN0KCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdHRUaHJlYWRGYWN0b3J5IHN5bmNocm9ub3VzIHN0YXJ0IEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkRmFjdG9yeSBtb25pdG9yIHRpbWVvdXQgdGVzdCIgPDwgc3RkOjplbmRsOworCisgICAgaWYgKCF0aHJlYWRGYWN0b3J5VGVzdHMubW9uaXRvclRpbWVvdXRUZXN0KCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdHRUaHJlYWRGYWN0b3J5IG1vbml0b3IgdGltZW91dCBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIGlmIChydW5BbGwgfHwgYXJnc1swXS5jb21wYXJlKCJ1dGlsIikgPT0gMCkgeworCisgICAgc3RkOjpjb3V0IDw8ICJVdGlsIHRlc3RzLi4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRVdGlsIG1pbmltdW0gdGltZSIgPDwgc3RkOjplbmRsOworCisgICAgaW50NjRfdCB0aW1lMDAgPSBVdGlsOjpjdXJyZW50VGltZSgpOworICAgIGludDY0X3QgdGltZTAxID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0TWluaW11bSB0aW1lOiAiIDw8IHRpbWUwMSAtIHRpbWUwMCA8PCAibXMiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRpbWUwMCA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgdGltZTAxID0gdGltZTAwOworICAgIHNpemVfdCBjb3VudCA9IDA7CisKKyAgICB3aGlsZSAodGltZTAxIDwgdGltZTAwICsgMTApIHsKKyAgICAgIGNvdW50Kys7CisgICAgICB0aW1lMDEgPSBVdGlsOjpjdXJyZW50VGltZSgpOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0c2NhbGwgcGVyIG1zOiAiIDw8IGNvdW50IC8gKHRpbWUwMSAtIHRpbWUwMCkgPDwgc3RkOjplbmRsOworICB9CisKKyAgaWYgKHJ1bkFsbCB8fCBhcmdzWzBdLmNvbXBhcmUoInRpbWVyLW1hbmFnZXIiKSA9PSAwKSB7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlRpbWVyTWFuYWdlciB0ZXN0cy4uLiIgPDwgc3RkOjplbmRsOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGltZXJNYW5hZ2VyIHRlc3QwMCIgPDwgc3RkOjplbmRsOworCisgICAgVGltZXJNYW5hZ2VyVGVzdHMgdGltZXJNYW5hZ2VyVGVzdHM7CisKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMCgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdDAxIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdDAyIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMigpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdDAzIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMygpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdDA0IiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwNCgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKworICBpZiAocnVuQWxsIHx8IGFyZ3NbMF0uY29tcGFyZSgidGhyZWFkLW1hbmFnZXIiKSA9PSAwKSB7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlRocmVhZE1hbmFnZXIgdGVzdHMuLi4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIHsKKyAgICAgIHNpemVfdCB3b3JrZXJDb3VudCA9IDEwICogV0VJR0hUOworICAgICAgc2l6ZV90IHRhc2tDb3VudCA9IDUwMCAqIFdFSUdIVDsKKyAgICAgIGludDY0X3QgZGVsYXkgPSAxMExMOworCisgICAgICBUaHJlYWRNYW5hZ2VyVGVzdHMgdGhyZWFkTWFuYWdlclRlc3RzOworCisgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGFwaSB0ZXN0OiIgPDwgc3RkOjplbmRsOworCisgICAgICBpZiAoIXRocmVhZE1hbmFnZXJUZXN0cy5hcGlUZXN0KCkpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0VGhyZWFkTWFuYWdlciBhcGlUZXN0IEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKworICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkTWFuYWdlciBsb2FkIHRlc3Q6IHdvcmtlciBjb3VudDogIiA8PCB3b3JrZXJDb3VudAorICAgICAgICAgICAgICAgIDw8ICIgdGFzayBjb3VudDogIiA8PCB0YXNrQ291bnQgPDwgIiBkZWxheTogIiA8PCBkZWxheSA8PCBzdGQ6OmVuZGw7CisKKyAgICAgIGlmICghdGhyZWFkTWFuYWdlclRlc3RzLmxvYWRUZXN0KHRhc2tDb3VudCwgZGVsYXksIHdvcmtlckNvdW50KSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGxvYWRUZXN0IEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKworICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkTWFuYWdlciBibG9jayB0ZXN0OiB3b3JrZXIgY291bnQ6ICIgPDwgd29ya2VyQ291bnQKKyAgICAgICAgICAgICAgICA8PCAiIGRlbGF5OiAiIDw8IGRlbGF5IDw8IHN0ZDo6ZW5kbDsKKworICAgICAgaWYgKCF0aHJlYWRNYW5hZ2VyVGVzdHMuYmxvY2tUZXN0KGRlbGF5LCB3b3JrZXJDb3VudCkpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0VGhyZWFkTWFuYWdlciBibG9ja1Rlc3QgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChydW5BbGwgfHwgYXJnc1swXS5jb21wYXJlKCJ0aHJlYWQtbWFuYWdlci1iZW5jaG1hcmsiKSA9PSAwKSB7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlRocmVhZE1hbmFnZXIgYmVuY2htYXJrIHRlc3RzLi4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB7CisKKyAgICAgIHNpemVfdCBtaW5Xb3JrZXJDb3VudCA9IDI7CisKKyAgICAgIHNpemVfdCBtYXhXb3JrZXJDb3VudCA9IDg7CisKKyAgICAgIHNpemVfdCB0YXNrc1BlcldvcmtlciA9IDEwMCAqIFdFSUdIVDsKKworICAgICAgaW50NjRfdCBkZWxheSA9IDVMTDsKKworICAgICAgZm9yIChzaXplX3Qgd29ya2VyQ291bnQgPSBtaW5Xb3JrZXJDb3VudDsgd29ya2VyQ291bnQgPD0gbWF4V29ya2VyQ291bnQ7IHdvcmtlckNvdW50ICo9IDQpIHsKKworICAgICAgICBzaXplX3QgdGFza0NvdW50ID0gd29ya2VyQ291bnQgKiB0YXNrc1BlcldvcmtlcjsKKworICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGxvYWQgdGVzdDogd29ya2VyIGNvdW50OiAiIDw8IHdvcmtlckNvdW50CisgICAgICAgICAgICAgICAgICA8PCAiIHRhc2sgY291bnQ6ICIgPDwgdGFza0NvdW50IDw8ICIgZGVsYXk6ICIgPDwgZGVsYXkgPDwgc3RkOjplbmRsOworCisgICAgICAgIFRocmVhZE1hbmFnZXJUZXN0cyB0aHJlYWRNYW5hZ2VyVGVzdHM7CisKKyAgICAgICAgaWYgKCF0aHJlYWRNYW5hZ2VyVGVzdHMubG9hZFRlc3QodGFza0NvdW50LCBkZWxheSwgd29ya2VyQ291bnQpKQorICAgICAgICB7CisgICAgICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0VGhyZWFkTWFuYWdlciBsb2FkVGVzdCBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0ZDo6Y291dCA8PCAiQUxMIFRFU1RTIFBBU1NFRCIgPDwgc3RkOjplbmRsOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaHJlYWRGYWN0b3J5VGVzdHMuaCBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaHJlYWRGYWN0b3J5VGVzdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTk4NTAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnlUZXN0cy5oCkBAIC0wLDAgKzEsMzA5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKK25hbWVzcGFjZSB0ZXN0IHsKKwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKKworLyoqCisgKiBUaHJlYWRNYW5hZ2VyVGVzdHMgY2xhc3MKKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBUaHJlYWRGYWN0b3J5VGVzdHMgeworCitwdWJsaWM6CisgIC8qKgorICAgKiBSZWFwIE4gdGhyZWFkcworICAgKi8KKyAgY2xhc3MgUmVhcE5UYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKKworICBwdWJsaWM6CisgICAgUmVhcE5UYXNrKE1vbml0b3ImIG1vbml0b3IsIGludCYgYWN0aXZlQ291bnQpIDogX21vbml0b3IobW9uaXRvciksIF9jb3VudChhY3RpdmVDb3VudCkge30KKworICAgIHZvaWQgcnVuKCkgeworICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworICAgICAgCisgICAgICBpZiAoLS1fY291bnQgPT0gMCkgeworICAgICAgICBfbW9uaXRvci5ub3RpZnkoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBNb25pdG9yJiBfbW9uaXRvcjsKKyAgICBpbnQmIF9jb3VudDsKKyAgfTsKKworICBib29sIHJlYXBOVGhyZWFkcyhpbnQgbG9vcCA9IDEsIGludCBjb3VudCA9IDEwKSB7CisKKyAgICBQbGF0Zm9ybVRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSA9IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpOworICAgIHNoYXJlZF9wdHI8TW9uaXRvcj4gbW9uaXRvcihuZXcgTW9uaXRvcik7CisKKyAgICBmb3IgKGludCBsaXggPSAwOyBsaXggPCBsb29wOyBsaXgrKykgeworCisgICAgICBpbnQgYWN0aXZlQ291bnQgPSAwOworCisgICAgICBzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPFRocmVhZD4gPiB0aHJlYWRzOworICAgICAgaW50IHRpeDsKKworICAgICAgZm9yICh0aXggPSAwOyB0aXggPCBjb3VudDsgdGl4KyspIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICArK2FjdGl2ZUNvdW50OworICAgICAgICAgIHRocmVhZHMucHVzaF9iYWNrKAorICAgICAgICAgICAgICB0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZChzaGFyZWRfcHRyPFJ1bm5hYmxlPihuZXcgUmVhcE5UYXNrKCptb25pdG9yLCBhY3RpdmVDb3VudCkpKSk7CisgICAgICAgIH0gY2F0Y2ggKFN5c3RlbVJlc291cmNlRXhjZXB0aW9uJiBlKSB7CisgICAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRmYWlsZWQgdG8gY3JlYXRlICIgPDwgbGl4KiBjb3VudCArIHRpeCA8PCAiIHRocmVhZCAiIDw8IGUud2hhdCgpCisgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRpeCA9IDA7CisgICAgICBmb3IgKHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSB0aHJlYWRzLmJlZ2luKCk7CisgICAgICAgICAgIHRocmVhZCAhPSB0aHJlYWRzLmVuZCgpOworICAgICAgICAgICB0aXgrKywgKyt0aHJlYWQpIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICgqdGhyZWFkKS0+c3RhcnQoKTsKKyAgICAgICAgfSBjYXRjaCAoU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24mIGUpIHsKKyAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZhaWxlZCB0byBzdGFydCAgIiA8PCBsaXgqIGNvdW50ICsgdGl4IDw8ICIgdGhyZWFkICIgPDwgZS53aGF0KCkKKyAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgeworICAgICAgICBTeW5jaHJvbml6ZWQgcygqbW9uaXRvcik7CisgICAgICAgIHdoaWxlIChhY3RpdmVDb3VudCA+IDApIHsKKyAgICAgICAgICBtb25pdG9yLT53YWl0KDEwMDApOworICAgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0cmVhcGVkICIgPDwgbGl4KiBjb3VudCA8PCAiIHRocmVhZHMiIDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFN1Y2Nlc3MhIiA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjbGFzcyBTeW5jaFN0YXJ0VGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7CisKKyAgcHVibGljOgorICAgIGVudW0gU1RBVEUgeyBVTklOSVRJQUxJWkVELCBTVEFSVElORywgU1RBUlRFRCwgU1RPUFBJTkcsIFNUT1BQRUQgfTsKKworICAgIFN5bmNoU3RhcnRUYXNrKE1vbml0b3ImIG1vbml0b3IsIHZvbGF0aWxlIFNUQVRFJiBzdGF0ZSkgOiBfbW9uaXRvcihtb25pdG9yKSwgX3N0YXRlKHN0YXRlKSB7fQorCisgICAgdm9pZCBydW4oKSB7CisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKyAgICAgICAgaWYgKF9zdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6U1RBUlRJTkcpIHsKKyAgICAgICAgICBfc3RhdGUgPSBTeW5jaFN0YXJ0VGFzazo6U1RBUlRFRDsKKyAgICAgICAgICBfbW9uaXRvci5ub3RpZnkoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKyAgICAgICAgd2hpbGUgKF9zdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6U1RBUlRFRCkgeworICAgICAgICAgIF9tb25pdG9yLndhaXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfc3RhdGUgPT0gU3luY2hTdGFydFRhc2s6OlNUT1BQSU5HKSB7CisgICAgICAgICAgX3N0YXRlID0gU3luY2hTdGFydFRhc2s6OlNUT1BQRUQ7CisgICAgICAgICAgX21vbml0b3Iubm90aWZ5QWxsKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBNb25pdG9yJiBfbW9uaXRvcjsKKyAgICB2b2xhdGlsZSBTVEFURSYgX3N0YXRlOworICB9OworCisgIGJvb2wgc3luY2hTdGFydFRlc3QoKSB7CisKKyAgICBNb25pdG9yIG1vbml0b3I7CisKKyAgICBTeW5jaFN0YXJ0VGFzazo6U1RBVEUgc3RhdGUgPSBTeW5jaFN0YXJ0VGFzazo6VU5JTklUSUFMSVpFRDsKKworICAgIHNoYXJlZF9wdHI8U3luY2hTdGFydFRhc2s+IHRhc2sKKyAgICAgICAgPSBzaGFyZWRfcHRyPFN5bmNoU3RhcnRUYXNrPihuZXcgU3luY2hTdGFydFRhc2sobW9uaXRvciwgc3RhdGUpKTsKKworICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5ID0gUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCk7CisKKyAgICBzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkID0gdGhyZWFkRmFjdG9yeS5uZXdUaHJlYWQodGFzayk7CisKKyAgICBpZiAoc3RhdGUgPT0gU3luY2hTdGFydFRhc2s6OlVOSU5JVElBTElaRUQpIHsKKworICAgICAgc3RhdGUgPSBTeW5jaFN0YXJ0VGFzazo6U1RBUlRJTkc7CisKKyAgICAgIHRocmVhZC0+c3RhcnQoKTsKKyAgICB9CisKKyAgICB7CisgICAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKKyAgICAgIHdoaWxlIChzdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6U1RBUlRJTkcpIHsKKyAgICAgICAgbW9uaXRvci53YWl0KCk7CisgICAgICB9CisgICAgfQorCisgICAgYXNzZXJ0KHN0YXRlICE9IFN5bmNoU3RhcnRUYXNrOjpTVEFSVElORyk7CisKKyAgICB7CisgICAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgbW9uaXRvci53YWl0KDEwMCk7CisgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiYpIHsKKyAgICAgIH0KKworICAgICAgaWYgKHN0YXRlID09IFN5bmNoU3RhcnRUYXNrOjpTVEFSVEVEKSB7CisKKyAgICAgICAgc3RhdGUgPSBTeW5jaFN0YXJ0VGFzazo6U1RPUFBJTkc7CisKKyAgICAgICAgbW9uaXRvci5ub3RpZnkoKTsKKyAgICAgIH0KKworICAgICAgd2hpbGUgKHN0YXRlID09IFN5bmNoU3RhcnRUYXNrOjpTVE9QUElORykgeworICAgICAgICBtb25pdG9yLndhaXQoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBhc3NlcnQoc3RhdGUgPT0gU3luY2hTdGFydFRhc2s6OlNUT1BQRUQpOworCisgICAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAoc3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJGYWlsdXJlIikgPDwgIiEiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAqIFRoZSBvbmx5IGd1YXJhbnRlZSBhIG1vbml0b3IgdGltZW91dCBjYW4gZ2l2ZSB5b3UgaXMgdGhhdAorICAgKiBpdCB3aWxsIHRha2UgImF0IGxlYXN0IiBhcyBsb25nIGFzIHRoZSB0aW1lb3V0LCBubyBsZXNzLgorICAgKiBUaGVyZSBpcyBhYnNvbHV0ZWx5IG5vIGd1YXJhbnRlZSBhcm91bmQgcmVnYWluaW5nIGV4ZWN1dGlvbgorICAgKiBuZWFyIHRoZSB0aW1lb3V0LiAgT24gYSBidXN5IHN5c3RlbSAobGlrZSBpbnNpZGUgYSB0aGlyZCBwYXJ0eQorICAgKiBDSSBlbnZpcm9ubWVudCkgaXQgY291bGQgdGFrZSBxdWl0ZSBhIGJpdCBsb25nZXIgdGhhbiB0aGUKKyAgICogcmVxdWVzdGVkIHRpbWVvdXQsIGFuZCB0aGF0J3Mgb2suCisgICAqLworCisgIGJvb2wgbW9uaXRvclRpbWVvdXRUZXN0KGludDY0X3QgY291bnQgPSAxMDAwLCBpbnQ2NF90IHRpbWVvdXQgPSAyKSB7CisKKyAgICBNb25pdG9yIG1vbml0b3I7CisKKyAgICBpbnQ2NF90IHN0YXJ0VGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisKKyAgICBmb3IgKGludDY0X3QgaXggPSAwOyBpeCA8IGNvdW50OyBpeCsrKSB7CisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOworICAgICAgICB0cnkgeworICAgICAgICAgIG1vbml0b3Iud2FpdCh0aW1lb3V0KTsKKyAgICAgICAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24mKSB7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpbnQ2NF90IGVuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOworCisgIGJvb2wgc3VjY2VzcyA9IChlbmRUaW1lIC0gc3RhcnRUaW1lKSA+PSAoY291bnQgKiB0aW1lb3V0KTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAoc3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJGYWlsdXJlIikKKyAgICAgICAgICAgICAgPDwgIjogbWluaW11bSByZXF1aXJlZCB0aW1lIHRvIGVsYXBzZSAiIDw8IGNvdW50ICogdGltZW91dAorICAgICAgICAgICAgICA8PCAibXM7IGFjdHVhbCBlbGFwc2VkIHRpbWUgIiA8PCBlbmRUaW1lIC0gc3RhcnRUaW1lIDw8ICJtcyIKKyAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworCisgICAgcmV0dXJuIHN1Y2Nlc3M7CisgIH0KKworICBjbGFzcyBGbG9vZFRhc2sgOiBwdWJsaWMgUnVubmFibGUgeworICBwdWJsaWM6CisgICAgRmxvb2RUYXNrKGNvbnN0IHNpemVfdCBpZCwgTW9uaXRvciYgbW9uKSA6IF9pZChpZCksIF9tb24obW9uKSB7fQorICAgIH5GbG9vZFRhc2soKSB7CisgICAgICBpZiAoX2lkICUgMTAwMDAgPT0gMCkgeworCQlTeW5jaHJvbml6ZWQgc3luYyhfbW9uKTsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0dGhyZWFkICIgPDwgX2lkIDw8ICIgZG9uZSIgPDwgc3RkOjplbmRsOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcnVuKCkgeworICAgICAgaWYgKF9pZCAlIDEwMDAwID09IDApIHsKKwkJU3luY2hyb25pemVkIHN5bmMoX21vbik7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdHRocmVhZCAiIDw8IF9pZCA8PCAiIHN0YXJ0ZWQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgY29uc3Qgc2l6ZV90IF9pZDsKKyAgICBNb25pdG9yJiBfbW9uOworICB9OworCisgIHZvaWQgZm9vKFBsYXRmb3JtVGhyZWFkRmFjdG9yeSogdGYpIHsgKHZvaWQpdGY7IH0KKworICBib29sIGZsb29kTlRlc3Qoc2l6ZV90IGxvb3AgPSAxLCBzaXplX3QgY291bnQgPSAxMDAwMDApIHsKKworICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICAgIE1vbml0b3IgbW9uOworCQorICAgIGZvciAoc2l6ZV90IGxpeCA9IDA7IGxpeCA8IGxvb3A7IGxpeCsrKSB7CisKKyAgICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5ID0gUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCk7CisgICAgICB0aHJlYWRGYWN0b3J5LnNldERldGFjaGVkKHRydWUpOworCisgICAgICBmb3IgKHNpemVfdCB0aXggPSAwOyB0aXggPCBjb3VudDsgdGl4KyspIHsKKworICAgICAgICB0cnkgeworCisgICAgICAgICAgc2hhcmVkX3B0cjxGbG9vZFRhc2s+IHRhc2sobmV3IEZsb29kVGFzayhsaXggKiBjb3VudCArIHRpeCwgbW9uKSk7CisgICAgICAgICAgc2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZCA9IHRocmVhZEZhY3RvcnkubmV3VGhyZWFkKHRhc2spOworICAgICAgICAgIHRocmVhZC0+c3RhcnQoKTsKKworICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uJiBlKSB7CisKKyAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZhaWxlZCB0byBzdGFydCAgIiA8PCBsaXgqIGNvdW50ICsgdGl4IDw8ICIgdGhyZWFkICIgPDwgZS53aGF0KCkKKyAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworCisgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgU3luY2hyb25pemVkIHN5bmMobW9uKTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0Zmxvb2RlZCAiIDw8IChsaXggKyAxKSAqIGNvdW50IDw8ICIgdGhyZWFkcyIgPDwgc3RkOjplbmRsOworICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIHN1Y2Nlc3M7CisgIH0KK307CisKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ojp0ZXN0CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlclRlc3RzLmggYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlclRlc3RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZjMDkyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyVGVzdHMuaApAQCAtMCwwICsxLDY4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworbmFtZXNwYWNlIHRlc3QgeworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OworCitzdGF0aWMgc3RkOjpkZXF1ZTxzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+ID4gbV9leHBpcmVkOworc3RhdGljIHZvaWQgZXhwaXJlZE5vdGlmaWVyKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpCit7CisgIG1fZXhwaXJlZC5wdXNoX2JhY2socnVubmFibGUpOworfQorCitzdGF0aWMgdm9pZCBzbGVlcF8oaW50NjRfdCBtaWxsaXNlYykgeworICBNb25pdG9yIF9zbGVlcDsKKyAgU3luY2hyb25pemVkIHMoX3NsZWVwKTsKKworICB0cnkgeworICAgIF9zbGVlcC53YWl0KG1pbGxpc2VjKTsKKyAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24mKSB7CisgICAgOworICB9IGNhdGNoICguLi4pIHsKKyAgICBhc3NlcnQoMCk7CisgIH0KK30KKworY2xhc3MgVGhyZWFkTWFuYWdlclRlc3RzIHsKKworcHVibGljOgorICBjbGFzcyBUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKKworICBwdWJsaWM6CisgICAgVGFzayhNb25pdG9yJiBtb25pdG9yLCBzaXplX3QmIGNvdW50LCBpbnQ2NF90IHRpbWVvdXQpCisgICAgICA6IF9tb25pdG9yKG1vbml0b3IpLCBfY291bnQoY291bnQpLCBfdGltZW91dCh0aW1lb3V0KSwgX3N0YXJ0VGltZSgwKSwgX2VuZFRpbWUoMCksIF9kb25lKGZhbHNlKSB7fQorCisgICAgdm9pZCBydW4oKSB7CisKKyAgICAgIF9zdGFydFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOworCisgICAgICBzbGVlcF8oX3RpbWVvdXQpOworCisgICAgICBfZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisKKyAgICAgIF9kb25lID0gdHJ1ZTsKKworICAgICAgeworICAgICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisKKyAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICJUaHJlYWQgIiA8PCBfY291bnQgPDwgIiBjb21wbGV0ZWQgIiA8PCBzdGQ6OmVuZGw7CisKKyAgICAgICAgX2NvdW50LS07CisgICAgICAgIGlmIChfY291bnQgJSAxMDAwMCA9PSAwKSB7CisgICAgICAgICAgX21vbml0b3Iubm90aWZ5KCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBNb25pdG9yJiBfbW9uaXRvcjsKKyAgICBzaXplX3QmIF9jb3VudDsKKyAgICBpbnQ2NF90IF90aW1lb3V0OworICAgIGludDY0X3QgX3N0YXJ0VGltZTsKKyAgICBpbnQ2NF90IF9lbmRUaW1lOworICAgIGJvb2wgX2RvbmU7CisgICAgTW9uaXRvciBfc2xlZXA7CisgIH07CisKKyAgLyoqCisgICAqIERpc3BhdGNoIGNvdW50IHRhc2tzLCBlYWNoIG9mIHdoaWNoIGJsb2NrcyBmb3IgdGltZW91dCBtaWxsaXNlY29uZHMgdGhlbgorICAgKiBjb21wbGV0ZXMuIFZlcmlmeSB0aGF0IGFsbCB0YXNrcyBjb21wbGV0ZWQgYW5kIHRoYXQgdGhyZWFkIG1hbmFnZXIgY2xlYW5zCisgICAqIHVwIHByb3Blcmx5IG9uIGRlbGV0ZS4KKyAgICovCisgIGJvb2wgbG9hZFRlc3Qoc2l6ZV90IGNvdW50ID0gMTAwLCBpbnQ2NF90IHRpbWVvdXQgPSAxMDBMTCwgc2l6ZV90IHdvcmtlckNvdW50ID0gNCkgeworCisgICAgTW9uaXRvciBtb25pdG9yOworCisgICAgc2l6ZV90IGFjdGl2ZUNvdW50ID0gY291bnQ7CisKKyAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlckNvdW50KTsKKworICAgIHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5CisgICAgICAgID0gc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoZmFsc2UpKTsKKworI2lmICFVU0VfU1REX1RIUkVBRAorICAgIHRocmVhZEZhY3RvcnktPnNldFByaW9yaXR5KFBvc2l4VGhyZWFkRmFjdG9yeTo6SElHSEVTVCk7CisjZW5kaWYKKyAgICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOworCisgICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKKworICAgIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPiA+IHRhc2tzOworCisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IGNvdW50OyBpeCsrKSB7CisKKyAgICAgIHRhc2tzLmluc2VydChzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4oCisgICAgICAgICAgbmV3IFRocmVhZE1hbmFnZXJUZXN0czo6VGFzayhtb25pdG9yLCBhY3RpdmVDb3VudCwgdGltZW91dCkpKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IHRpbWUwMCA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisKKyAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPiA+OjppdGVyYXRvciBpeCA9IHRhc2tzLmJlZ2luKCk7CisgICAgICAgICBpeCAhPSB0YXNrcy5lbmQoKTsKKyAgICAgICAgIGl4KyspIHsKKworICAgICAgdGhyZWFkTWFuYWdlci0+YWRkKCppeCk7CisgICAgfQorCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGxvYWRlZCAiIDw8IGNvdW50IDw8ICIgdGFza3MgdG8gZXhlY3V0ZSIgPDwgc3RkOjplbmRsOworCisgICAgeworICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7CisKKyAgICAgIHdoaWxlIChhY3RpdmVDb3VudCA+IDApIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFjdGl2ZUNvdW50ID0gIiA8PCBhY3RpdmVDb3VudCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIG1vbml0b3Iud2FpdCgpOworICAgICAgfQorICAgIH0KKworICAgIGludDY0X3QgdGltZTAxID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKworICAgIGludDY0X3QgZmlyc3RUaW1lID0gOTIyMzM3MjAzNjg1NDc3NTgwN0xMOworICAgIGludDY0X3QgbGFzdFRpbWUgPSAwOworCisgICAgZG91YmxlIGF2ZXJhZ2VUaW1lID0gMDsKKyAgICBpbnQ2NF90IG1pblRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7CisgICAgaW50NjRfdCBtYXhUaW1lID0gMDsKKworICAgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2s+ID46Oml0ZXJhdG9yIGl4ID0gdGFza3MuYmVnaW4oKTsKKyAgICAgICAgIGl4ICE9IHRhc2tzLmVuZCgpOworICAgICAgICAgaXgrKykgeworCisgICAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4gdGFzayA9ICppeDsKKworICAgICAgaW50NjRfdCBkZWx0YSA9IHRhc2stPl9lbmRUaW1lIC0gdGFzay0+X3N0YXJ0VGltZTsKKworICAgICAgYXNzZXJ0KGRlbHRhID4gMCk7CisKKyAgICAgIGlmICh0YXNrLT5fc3RhcnRUaW1lIDwgZmlyc3RUaW1lKSB7CisgICAgICAgIGZpcnN0VGltZSA9IHRhc2stPl9zdGFydFRpbWU7CisgICAgICB9CisKKyAgICAgIGlmICh0YXNrLT5fZW5kVGltZSA+IGxhc3RUaW1lKSB7CisgICAgICAgIGxhc3RUaW1lID0gdGFzay0+X2VuZFRpbWU7CisgICAgICB9CisKKyAgICAgIGlmIChkZWx0YSA8IG1pblRpbWUpIHsKKyAgICAgICAgbWluVGltZSA9IGRlbHRhOworICAgICAgfQorCisgICAgICBpZiAoZGVsdGEgPiBtYXhUaW1lKSB7CisgICAgICAgIG1heFRpbWUgPSBkZWx0YTsKKyAgICAgIH0KKworICAgICAgYXZlcmFnZVRpbWUgKz0gZGVsdGE7CisgICAgfQorCisgICAgYXZlcmFnZVRpbWUgLz0gY291bnQ7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZpcnN0IHN0YXJ0OiAiIDw8IGZpcnN0VGltZSA8PCAiIExhc3QgZW5kOiAiIDw8IGxhc3RUaW1lCisgICAgICAgICAgICAgIDw8ICIgbWluOiAiIDw8IG1pblRpbWUgPDwgIm1zIG1heDogIiA8PCBtYXhUaW1lIDw8ICJtcyBhdmVyYWdlOiAiIDw8IGF2ZXJhZ2VUaW1lCisgICAgICAgICAgICAgIDw8ICJtcyIgPDwgc3RkOjplbmRsOworCisgICAgYm9vbCBzdWNjZXNzID0gKHRpbWUwMSAtIHRpbWUwMCkgPj0gKChpbnQ2NF90KWNvdW50ICogdGltZW91dCkgLyAoaW50NjRfdCl3b3JrZXJDb3VudDsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAoc3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJGYWlsdXJlIikKKyAgICAgICAgICAgICAgPDwgIiEgZXhwZWN0ZWQgdGltZTogIiA8PCAoKGludDY0X3QpY291bnQgKiB0aW1lb3V0KSAvIChpbnQ2NF90KXdvcmtlckNvdW50IDw8ICJtcyBlbGFwc2VkIHRpbWU6ICIgPDwgdGltZTAxIC0gdGltZTAwCisgICAgICAgICAgICAgIDw8ICJtcyIgPDwgc3RkOjplbmRsOworCisgICAgcmV0dXJuIHN1Y2Nlc3M7CisgIH0KKworICBjbGFzcyBCbG9ja1Rhc2sgOiBwdWJsaWMgUnVubmFibGUgeworCisgIHB1YmxpYzoKKyAgICBCbG9ja1Rhc2soTW9uaXRvciYgZW50cnlNb25pdG9yLCBNb25pdG9yJiBibG9ja01vbml0b3IsIGJvb2wmIGJsb2NrZWQsIE1vbml0b3ImIGRvbmVNb25pdG9yLCBzaXplX3QmIGNvdW50KQorICAgICAgOiBfZW50cnlNb25pdG9yKGVudHJ5TW9uaXRvciksIF9lbnRlcmVkKGZhbHNlKSwgX2Jsb2NrTW9uaXRvcihibG9ja01vbml0b3IpLCBfYmxvY2tlZChibG9ja2VkKSwgX2RvbmVNb25pdG9yKGRvbmVNb25pdG9yKSwgX2NvdW50KGNvdW50KSB7fQorCisgICAgdm9pZCBydW4oKSB7CisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKF9lbnRyeU1vbml0b3IpOworICAgICAgICBfZW50ZXJlZCA9IHRydWU7CisgICAgICAgIF9lbnRyeU1vbml0b3Iubm90aWZ5KCk7CisgICAgICB9CisKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoX2Jsb2NrTW9uaXRvcik7CisgICAgICAgIHdoaWxlIChfYmxvY2tlZCkgeworICAgICAgICAgIF9ibG9ja01vbml0b3Iud2FpdCgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoX2RvbmVNb25pdG9yKTsKKyAgICAgICAgaWYgKC0tX2NvdW50ID09IDApIHsKKyAgICAgICAgICBfZG9uZU1vbml0b3Iubm90aWZ5KCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBNb25pdG9yJiBfZW50cnlNb25pdG9yOworICAgIGJvb2wgX2VudGVyZWQ7CisgICAgTW9uaXRvciYgX2Jsb2NrTW9uaXRvcjsKKyAgICBib29sJiBfYmxvY2tlZDsKKyAgICBNb25pdG9yJiBfZG9uZU1vbml0b3I7CisgICAgc2l6ZV90JiBfY291bnQ7CisgIH07CisKKyAgLyoqCisgICAqIEJsb2NrIHRlc3QuICBDcmVhdGUgcGVuZGluZ1Rhc2tDb3VudE1heCB0YXNrcy4gIFZlcmlmeSB0aGF0IHdlIGJsb2NrIGFkZGluZyB0aGUKKyAgICogcGVuZGluZ1Rhc2tDb3VudE1heCArIDF0aCB0YXNrLiAgVmVyaWZ5IHRoYXQgd2UgdW5ibG9jayB3aGVuIGEgdGFzayBjb21wbGV0ZXMgKi8KKworICBib29sIGJsb2NrVGVzdChpbnQ2NF90IHRpbWVvdXQgPSAxMDBMTCwgc2l6ZV90IHdvcmtlckNvdW50ID0gMikgeworICAgICh2b2lkKXRpbWVvdXQ7CisgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisKKyAgICB0cnkgeworCisgICAgICBNb25pdG9yIGVudHJ5TW9uaXRvcjsgICAvLyBub3QgdXNlZCBieSB0aGlzIHRlc3QKKyAgICAgIE1vbml0b3IgYmxvY2tNb25pdG9yOworICAgICAgYm9vbCBibG9ja2VkW10gPSB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX07CisgICAgICBNb25pdG9yIGRvbmVNb25pdG9yOworCisgICAgICBzaXplX3QgcGVuZGluZ1Rhc2tNYXhDb3VudCA9IHdvcmtlckNvdW50OworCisgICAgICBzaXplX3QgYWN0aXZlQ291bnRzW10gPSB7d29ya2VyQ291bnQsIHBlbmRpbmdUYXNrTWF4Q291bnQsIDF9OworCisgICAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIKKyAgICAgICAgICA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2VyQ291bnQsIHBlbmRpbmdUYXNrTWF4Q291bnQpOworCisgICAgICBzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeQorICAgICAgICAgID0gc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSk7CisKKyNpZiAhVVNFX1NURF9USFJFQUQKKyAgICAgIHRocmVhZEZhY3RvcnktPnNldFByaW9yaXR5KFBvc2l4VGhyZWFkRmFjdG9yeTo6SElHSEVTVCk7CisjZW5kaWYKKyAgICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CisKKyAgICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CisKKyAgICAgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+ID4gdGFza3M7CisgICAgICB0YXNrcy5yZXNlcnZlKHdvcmtlckNvdW50ICsgcGVuZGluZ1Rhc2tNYXhDb3VudCk7CisKKyAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCB3b3JrZXJDb3VudDsgaXgrKykgeworCisgICAgICAgIHRhc2tzLnB1c2hfYmFjayhzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPigKKyAgICAgICAgICAgIG5ldyBUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzayhlbnRyeU1vbml0b3IsIGJsb2NrTW9uaXRvciwgYmxvY2tlZFswXSwgZG9uZU1vbml0b3IsIGFjdGl2ZUNvdW50c1swXSkpKTsKKyAgICAgIH0KKworICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IHBlbmRpbmdUYXNrTWF4Q291bnQ7IGl4KyspIHsKKworICAgICAgICB0YXNrcy5wdXNoX2JhY2soc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4oCisgICAgICAgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2soZW50cnlNb25pdG9yLCBibG9ja01vbml0b3IsIGJsb2NrZWRbMV0sIGRvbmVNb25pdG9yLCBhY3RpdmVDb3VudHNbMV0pKSk7CisgICAgICB9CisKKyAgICAgIGZvciAoc3RkOjp2ZWN0b3I8c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4gPjo6aXRlcmF0b3IgaXggPSB0YXNrcy5iZWdpbigpOworICAgICAgICAgICBpeCAhPSB0YXNrcy5lbmQoKTsKKyAgICAgICAgICAgaXgrKykgeworICAgICAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoKml4KTsKKyAgICAgIH0KKworICAgICAgaWYgKCEoc3VjY2VzcyA9ICh0aHJlYWRNYW5hZ2VyLT50b3RhbFRhc2tDb3VudCgpID09IHBlbmRpbmdUYXNrTWF4Q291bnQgKyB3b3JrZXJDb3VudCkpKSB7CisgICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgcGVuZGluZyB0YXNrIGNvdW50Iik7CisgICAgICB9CisKKyAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+IGV4dHJhVGFzaygKKyAgICAgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2soZW50cnlNb25pdG9yLCBibG9ja01vbml0b3IsIGJsb2NrZWRbMl0sIGRvbmVNb25pdG9yLCBhY3RpdmVDb3VudHNbMl0pKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgdGhyZWFkTWFuYWdlci0+YWRkKGV4dHJhVGFzaywgMSk7CisgICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3VjY2VzcyBhZGRpbmcgdGFzayBpbiBleGNlc3Mgb2YgcGVuZGluZyB0YXNrIGNvdW50Iik7CisgICAgICB9IGNhdGNoIChUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uJikgeworICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJTaG91bGQgaGF2ZSB0aW1lZCBvdXQgYWRkaW5nIHRhc2sgaW4gZXhjZXNzIG9mIHBlbmRpbmcgdGFzayBjb3VudCIpOworICAgICAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24mKSB7CisgICAgICAgIC8vIEV4cGVjdGVkIHJlc3VsdAorICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoZXh0cmFUYXNrLCAtMSk7CisgICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3VjY2VzcyBhZGRpbmcgdGFzayBpbiBleGNlc3Mgb2YgcGVuZGluZyB0YXNrIGNvdW50Iik7CisgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiYpIHsKKyAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCB0aW1lb3V0IGFkZGluZyB0YXNrIGluIGV4Y2VzcyBvZiBwZW5kaW5nIHRhc2sgY291bnQiKTsKKyAgICAgIH0gY2F0Y2ggKFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24mKSB7CisgICAgICAgIC8vIEV4cGVjdGVkIHJlc3VsdAorICAgICAgfQorCisgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIKKyAgICAgICAgICAgICAgICA8PCAiUGVuZGluZyB0YXNrcyAiIDw8IHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSA8PCBzdGQ6OmVuZGw7CisKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoYmxvY2tNb25pdG9yKTsKKyAgICAgICAgYmxvY2tlZFswXSA9IGZhbHNlOworICAgICAgICBibG9ja01vbml0b3Iubm90aWZ5QWxsKCk7CisgICAgICB9CisKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoZG9uZU1vbml0b3IpOworICAgICAgICB3aGlsZSAoYWN0aXZlQ291bnRzWzBdICE9IDApIHsKKyAgICAgICAgICBkb25lTW9uaXRvci53YWl0KCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiCisgICAgICAgICAgICAgICAgPDwgIlBlbmRpbmcgdGFza3MgIiA8PCB0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCkgPDwgc3RkOjplbmRsOworCisgICAgICB0cnkgeworICAgICAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoZXh0cmFUYXNrLCAxKTsKKyAgICAgIH0gY2F0Y2ggKFRpbWVkT3V0RXhjZXB0aW9uJikgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIKKyAgICAgICAgICAgICAgICAgIDw8ICJhZGQgdGltZWQgb3V0IHVuZXhwZWN0ZWRseSIgPDwgc3RkOjplbmRsOworICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJVbmV4cGVjdGVkIHRpbWVvdXQgYWRkaW5nIHRhc2siKTsKKworICAgICAgfSBjYXRjaCAoVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiYpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiCisgICAgICAgICAgICAgICAgICA8PCAiYWRkIGVuY291bnRlcmVkIHRvbyBtYW55IHBlbmRpbmcgZXhlcGN0aW9ucyIgPDwgc3RkOjplbmRsOworICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJVbmV4cGVjdGVkIHRpbWVvdXQgYWRkaW5nIHRhc2siKTsKKyAgICAgIH0KKworICAgICAgLy8gV2FrZSB1cCB0YXNrcyB0aGF0IHdlcmUgcGVuZGluZyBiZWZvcmUgYW5kIHdhaXQgZm9yIHRoZW0gdG8gY29tcGxldGUKKworICAgICAgeworICAgICAgICBTeW5jaHJvbml6ZWQgcyhibG9ja01vbml0b3IpOworICAgICAgICBibG9ja2VkWzFdID0gZmFsc2U7CisgICAgICAgIGJsb2NrTW9uaXRvci5ub3RpZnlBbGwoKTsKKyAgICAgIH0KKworICAgICAgeworICAgICAgICBTeW5jaHJvbml6ZWQgcyhkb25lTW9uaXRvcik7CisgICAgICAgIHdoaWxlIChhY3RpdmVDb3VudHNbMV0gIT0gMCkgeworICAgICAgICAgIGRvbmVNb25pdG9yLndhaXQoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBXYWtlIHVwIHRoZSBleHRyYSB0YXNrIGFuZCB3YWl0IGZvciBpdCB0byBjb21wbGV0ZQorCisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKGJsb2NrTW9uaXRvcik7CisgICAgICAgIGJsb2NrZWRbMl0gPSBmYWxzZTsKKyAgICAgICAgYmxvY2tNb25pdG9yLm5vdGlmeUFsbCgpOworICAgICAgfQorCisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKGRvbmVNb25pdG9yKTsKKyAgICAgICAgd2hpbGUgKGFjdGl2ZUNvdW50c1syXSAhPSAwKSB7CisgICAgICAgICAgZG9uZU1vbml0b3Iud2FpdCgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRocmVhZE1hbmFnZXItPnN0b3AoKTsKKworICAgICAgaWYgKCEoc3VjY2VzcyA9ICh0aHJlYWRNYW5hZ2VyLT50b3RhbFRhc2tDb3VudCgpID09IDApKSkgeworICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJVbmV4cGVjdGVkIHRvdGFsIHRhc2sgY291bnQiKTsKKyAgICAgIH0KKworICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIGUpIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAiRVJST1I6ICIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAoc3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJGYWlsdXJlIikgPDwgc3RkOjplbmRsOworICAgIHJldHVybiBzdWNjZXNzOworICB9CisKKworICBib29sIGFwaVRlc3QoKSB7CisKKyAgICAvLyBwcm92ZSBjdXJyZW50VGltZSBoYXMgbWlsbGlzZWNvbmRzIGdyYW51bGFyaXR5IHNpbmNlIG1hbnkgb3RoZXIgdGhpbmdzIGRlcGVuZCBvbiBpdAorICAgIGludDY0X3QgYSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgc2xlZXBfKDEwMCk7CisgICAgaW50NjRfdCBiID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICBpZiAoYiAtIGEgPCA1MCB8fCBiIC0gYSA+IDE1MCkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRleHBlY3RlZCAxMDBtcyBnYXAsIGZvdW5kICIgPDwgKGItYSkgPDwgIm1zIGdhcCBpbnN0ZWFkLiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworI2lmICFVU0VfU1REX1RIUkVBRAorICAgIC8vIHRlc3Qgb25jZSB3aXRoIGEgZGV0YWNoZWQgdGhyZWFkIGZhY3RvcnkgYW5kIG9uY2Ugd2l0aCBhIGpvaW5hYmxlIHRocmVhZCBmYWN0b3J5CisKKyAgICBzaGFyZWRfcHRyPFBvc2l4VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeQorICAgICAgICA9IHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KGZhbHNlKSk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGFwaVRlc3Qgd2l0aCBqb2luYWJsZSB0aHJlYWQgZmFjdG9yeSIgPDwgc3RkOjplbmRsOworICAgIGlmICghYXBpVGVzdFdpdGhUaHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdGhyZWFkRmFjdG9yeS5yZXNldChuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KHRydWUpKTsKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGFwaVRlc3Qgd2l0aCBkZXRhY2hlZCB0aHJlYWQgZmFjdG9yeSIgPDwgc3RkOjplbmRsOworICAgIHJldHVybiBhcGlUZXN0V2l0aFRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CisjZWxzZQorICAgIHJldHVybiBhcGlUZXN0V2l0aFRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSkpOworI2VuZGlmCisKKyAgfQorCisgIGJvb2wgYXBpVGVzdFdpdGhUaHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KQorICB7CisgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcigxKTsKKyAgICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOworCisjaWYgIVVTRV9TVERfVEhSRUFECisgICAgdGhyZWFkRmFjdG9yeS0+c2V0UHJpb3JpdHkoUG9zaXhUaHJlYWRGYWN0b3J5OjpISUdIRVNUKTsKKworICAgIC8vIHZlcmlmeSB3ZSBjYW5ub3QgY2hhbmdlIHRoZSB0aHJlYWQgZmFjdG9yeSB0byBvbmUgd2l0aCB0aGUgb3Bwb3NpdGUgZGV0YWNoZWQgc2V0dGluZworICAgIHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5MgorICAgICAgICA9IHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KAorICAgICAgICAgIFBvc2l4VGhyZWFkRmFjdG9yeTo6Uk9VTkRfUk9CSU4sCisgICAgICAgICAgUG9zaXhUaHJlYWRGYWN0b3J5OjpOT1JNQUwsCisgICAgICAgICAgMSwKKyAgICAgICAgICAhdGhyZWFkRmFjdG9yeS0+aXNEZXRhY2hlZCgpKSk7CisgICAgdHJ5IHsKKyAgICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeTIpOworICAgICAgLy8gaWYgdGhlIGNhbGwgc3VjY2VlZGVkIHdlIGNoYW5nZWQgdGhlIHRocmVhZCBmYWN0b3J5IHRvIG9uZSB0aGF0IGhhZCB0aGUgb3Bwb3NpdGUgc2V0dGluZyBmb3IgImlzRGV0YWNoZWQoKSIuCisgICAgICAvLyB0aGlzIGlzIGJhZCwgYmVjYXVzZSB0aGUgdGhyZWFkIG1hbmFnZXIgY2hlY2tzIHdpdGggdGhlIHRocmVhZCBmYWN0b3J5IHRvIHNlZSBpZiBpdCBzaG91bGQgam9pbiB0aHJlYWRzCisgICAgICAvLyBhcyB0aGV5IGFyZSBsZWF2aW5nIC0gc28gdGhlIGRldGFjaGVkIHN0YXR1cyBvZiBuZXcgdGhyZWFkcyBjYW5ub3QgY2hhbmdlIHdoaWxlIHRoZXJlIGFyZSBleGlzdGluZyB0aHJlYWRzLgorICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRTaG91bGQgbm90IGJlIGFibGUgdG8gY2hhbmdlIHRocmVhZCBmYWN0b3J5IGRldGFjaGVkIGRpc3Bvc2l0aW9uIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNhdGNoIChJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24mIGV4KSB7CisgICAgICAvKiBleHBlY3RlZCAqLworICAgIH0KKyNlbmRpZgorCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHN0YXJ0aW5nLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOworICAgIHRocmVhZE1hbmFnZXItPnNldEV4cGlyZUNhbGxiYWNrKGV4cGlyZWROb3RpZmllcik7IC8vIHN0ZDo6YmluZCgmVGhyZWFkTWFuYWdlclRlc3RzOjpleHBpcmVkTm90aWZpZXIsIHRoaXMpKTsKKworI2RlZmluZSBFWFBFQ1QoRlVOQywgQ09VTlQpIHsgc2l6ZV90IGMgPSBGVU5DOyBpZiAoYyAhPSBDT1VOVCkgeyBzdGQ6OmNlcnIgPDwgImV4cGVjdGVkICIgI0ZVTkMiIHRvIGJlICIgI0NPVU5UICIsIGJ1dCB3YXMgIiA8PCBjIDw8IHN0ZDo6ZW5kbDsgcmV0dXJuIGZhbHNlOyB9IH0KKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAxKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCAybmQgd29ya2VyLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGRXb3JrZXIoKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAyKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDIpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHJlbW92ZSAybmQgd29ya2VyLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmVXb3JrZXIoKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAxKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHJlbW92ZSAxc3Qgd29ya2VyLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmVXb3JrZXIoKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCBibG9ja2luZyB0YXNrLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICAvLyBXZSdyZSBnb2luZyB0byB0aHJvdyBhIGJsb2NraW5nIHRhc2sgaW50byB0aGUgbWl4CisgICAgTW9uaXRvciBlbnRyeU1vbml0b3I7ICAgLy8gc2lnbmFsZWQgd2hlbiB0YXNrIGlzIHJ1bm5pbmcKKyAgICBNb25pdG9yIGJsb2NrTW9uaXRvcjsgICAvLyB0byBiZSBzaWduYWxlZCB0byB1bmJsb2NrIHRoZSB0YXNrCisgICAgYm9vbCBibG9ja2VkKHRydWUpOyAgICAgLy8gc2V0IHRvIGZhbHNlIGJlZm9yZSBub3RpZnlpbmcKKyAgICBNb25pdG9yIGRvbmVNb25pdG9yOyAgICAvLyBzaWduYWxlZCB3aGVuIGNvdW50IHJlYWNoZXMgemVybworICAgIHNpemVfdCBhY3RpdmVDb3VudCA9IDE7CisgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4gYmxvY2tpbmdUYXNrKAorICAgICAgbmV3IFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrKGVudHJ5TW9uaXRvciwgYmxvY2tNb25pdG9yLCBibG9ja2VkLCBkb25lTW9uaXRvciwgYWN0aXZlQ291bnQpKTsKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoYmxvY2tpbmdUYXNrKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDEpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCBvdGhlciB0YXNrLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4gb3RoZXJUYXNrKAorICAgICAgbmV3IFRocmVhZE1hbmFnZXJUZXN0czo6VGFzayhkb25lTW9uaXRvciwgYWN0aXZlQ291bnQsIDApKTsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZChvdGhlclRhc2spOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMik7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIGJsb2NraW5nIHRhc2sgc3BlY2lmaWNhbGx5Li4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmUoYmxvY2tpbmdUYXNrKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDEpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHJlbW92ZSBuZXh0IHBlbmRpbmcgdGFzay4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBuZXh0VGFzayA9IHRocmVhZE1hbmFnZXItPnJlbW92ZU5leHRQZW5kaW5nKCk7CisgICAgaWYgKG5leHRUYXNrICE9IG90aGVyVGFzaykgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRcdFx0ZXhwZWN0ZWQgcmVtb3ZlTmV4dFBlbmRpbmcgdG8gcmV0dXJuIG90aGVyVGFzayIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHJlbW92ZSBuZXh0IHBlbmRpbmcgdGFzayAobm9uZSBsZWZ0KS4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBuZXh0VGFzayA9IHRocmVhZE1hbmFnZXItPnJlbW92ZU5leHRQZW5kaW5nKCk7CisgICAgaWYgKG5leHRUYXNrKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCByZW1vdmVOZXh0UGVuZGluZyB0byByZXR1cm4gYW4gZW1wdHkgUnVubmFibGUiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIDIgZXhwaXJlZCB0YXNrcyBhbmQgMSBub3QuLiIgPDwgc3RkOjplbmRsOworCisgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2s+IGV4cGlyZWRUYXNrKAorICAgICAgbmV3IFRocmVhZE1hbmFnZXJUZXN0czo6VGFzayhkb25lTW9uaXRvciwgYWN0aXZlQ291bnQsIDApKTsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZChleHBpcmVkVGFzaywgMCwgMSk7CisgICAgdGhyZWFkTWFuYWdlci0+YWRkKGJsb2NraW5nVGFzayk7ICAgICAgIC8vIGFkZCBvbmUgdGhhdCBoYXNuJ3QgZXhwaXJlZCB0byBtYWtlIHN1cmUgaXQgZ2V0cyBza2lwcGVkCisgICAgdGhyZWFkTWFuYWdlci0+YWRkKGV4cGlyZWRUYXNrLCAwLCAxKTsgIC8vIGFkZCBhIHNlY29uZCBleHBpcmVkIHRvIGVuc3VyZSByZW1vdmVFeHBpcmVkVGFza3MgcmVtb3ZlcyBib3RoCisKKyAgICBzbGVlcF8oNTApOyAgLy8gbWFrZSBzdXJlIGVub3VnaCB0aW1lIGVsYXBzZXMgZm9yIGl0IHRvIGV4cGlyZSAtIHRoZSBzaG9ydGVzdCBleHBpcmF0aW9uIHRpbWUgaXMgMSBtaWxsaXNlY29uZAorCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMyk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmV4cGlyZWRUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIGV4cGlyZWQgdGFza3MuLiIgPDwgc3RkOjplbmRsOworCisgICAgaWYgKCFtX2V4cGlyZWQuZW1wdHkoKSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRcdFx0ZXhwZWN0ZWQgbV9leHBpcmVkIHRvIGJlIGVtcHR5IiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdGhyZWFkTWFuYWdlci0+cmVtb3ZlRXhwaXJlZFRhc2tzKCk7CisKKyAgICBpZiAobV9leHBpcmVkLnNpemUoKSAhPSAyKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBtX2V4cGlyZWQgdG8gYmUgc2V0IiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1fZXhwaXJlZC5mcm9udCgpICE9IGV4cGlyZWRUYXNrKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBtX2V4cGlyZWRbMF0gdG8gYmUgdGhlIGV4cGlyZWQgdGFzayIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtX2V4cGlyZWQucG9wX2Zyb250KCk7CisKKyAgICBpZiAobV9leHBpcmVkLmZyb250KCkgIT0gZXhwaXJlZFRhc2spIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFx0XHRcdGV4cGVjdGVkIG1fZXhwaXJlZFsxXSB0byBiZSB0aGUgZXhwaXJlZCB0YXNrIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9leHBpcmVkLmNsZWFyKCk7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmUoYmxvY2tpbmdUYXNrKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5leHBpcmVkVGFza0NvdW50KCksIDIpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCBleHBpcmVkIHRhc2sgKGFnYWluKS4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoZXhwaXJlZFRhc2ssIDAsIDEpOyAgLy8gZXhwaXJlcyBpbiAxbXMKKyAgICBzbGVlcF8oNTApOyAgLy8gbWFrZSBzdXJlIGVub3VnaCB0aW1lIGVsYXBzZXMgZm9yIGl0IHRvIGV4cGlyZSAtIHRoZSBzaG9ydGVzdCBleHBpcmF0aW9uIHRpbWUgaXMgMW1zCisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIHdvcmtlciB0byBjb25zdW1lIGV4cGlyZWQgdGFzay4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGRXb3JrZXIoKTsKKyAgICBzbGVlcF8oMTAwKTsgIC8vIG1ha2Ugc3VyZSBpdCBoYXMgdGltZSB0byBzcGluIHVwIGFuZCBleHBpcmUgdGhlIHRhc2sKKworICAgIGlmIChtX2V4cGlyZWQuZW1wdHkoKSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRcdFx0ZXhwZWN0ZWQgbV9leHBpcmVkIHRvIGJlIHNldCIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChtX2V4cGlyZWQuZnJvbnQoKSAhPSBleHBpcmVkVGFzaykgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRcdFx0ZXhwZWN0ZWQgbV9leHBpcmVkIHRvIGJlIHRoZSBleHBpcmVkIHRhc2siIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2V4cGlyZWQuY2xlYXIoKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAxKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5leHBpcmVkVGFza0NvdW50KCksIDMpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHRyeSB0byByZW1vdmUgdG9vIG1hbnkgd29ya2VycyIgPDwgc3RkOjplbmRsOworICAgIHRyeSB7CisgICAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmVXb3JrZXIoMik7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGNhdGNoIChjb25zdCBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24mKSB7CisgICAgICAvKiBleHBlY3RlZCAqLworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRyZW1vdmUgd29ya2VyLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmVXb3JrZXIoKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5leHBpcmVkVGFza0NvdW50KCksIDMpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCBibG9ja2luZyB0YXNrLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoYmxvY2tpbmdUYXNrKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDEpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZFdvcmtlcigpOworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKGVudHJ5TW9uaXRvcik7CisgICAgICB3aGlsZSAoIWJsb2NraW5nVGFzay0+X2VudGVyZWQpIHsKKyAgICAgICAgZW50cnlNb25pdG9yLndhaXQoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+d29ya2VyQ291bnQoKSwgMSk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmlkbGVXb3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+cGVuZGluZ1Rhc2tDb3VudCgpLCAwKTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHR1bmJsb2NrIHRhc2sgYW5kIHJlbW92ZSB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKGJsb2NrTW9uaXRvcik7CisgICAgICBibG9ja2VkID0gZmFsc2U7CisgICAgICBibG9ja01vbml0b3Iubm90aWZ5QWxsKCk7CisgICAgfQorICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZVdvcmtlcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0Y2xlYW51cC4uICIgPDwgc3RkOjplbmRsOworCisgICAgYmxvY2tpbmdUYXNrLnJlc2V0KCk7CisgICAgdGhyZWFkTWFuYWdlci5yZXNldCgpOworICAgIHJldHVybiB0cnVlOworICB9Cit9OworCit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ojp0ZXN0OwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlclRlc3RzLmggYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyVGVzdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzUyYzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlclRlc3RzLmgKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworbmFtZXNwYWNlIHRlc3QgeworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OworCitjbGFzcyBUaW1lck1hbmFnZXJUZXN0cyB7CisKK3B1YmxpYzoKKyAgY2xhc3MgVGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7CisgIHB1YmxpYzoKKyAgICBUYXNrKE1vbml0b3ImIG1vbml0b3IsIGludDY0X3QgdGltZW91dCkKKyAgICAgIDogX3RpbWVvdXQodGltZW91dCksCisgICAgICAgIF9zdGFydFRpbWUoVXRpbDo6Y3VycmVudFRpbWUoKSksCisgICAgICAgIF9lbmRUaW1lKDApLAorICAgICAgICBfbW9uaXRvcihtb25pdG9yKSwKKyAgICAgICAgX3N1Y2Nlc3MoZmFsc2UpLAorICAgICAgICBfZG9uZShmYWxzZSkge30KKworICAgIH5UYXNrKCkgeyBzdGQ6OmNlcnIgPDwgdGhpcyA8PCBzdGQ6OmVuZGw7IH0KKworICAgIHZvaWQgcnVuKCkgeworCisgICAgICBfZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgICBfc3VjY2VzcyA9IChfZW5kVGltZSAtIF9zdGFydFRpbWUpID49IF90aW1lb3V0OworCisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKyAgICAgICAgX2RvbmUgPSB0cnVlOworICAgICAgICBfbW9uaXRvci5ub3RpZnlBbGwoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbnQ2NF90IF90aW1lb3V0OworICAgIGludDY0X3QgX3N0YXJ0VGltZTsKKyAgICBpbnQ2NF90IF9lbmRUaW1lOworICAgIE1vbml0b3ImIF9tb25pdG9yOworICAgIGJvb2wgX3N1Y2Nlc3M7CisgICAgYm9vbCBfZG9uZTsKKyAgfTsKKworICAvKioKKyAgICogVGhpcyB0ZXN0IGNyZWF0ZXMgdHdvIHRhc2tzIGFuZCB3YWl0cyBmb3IgdGhlIGZpcnN0IHRvIGV4cGlyZSB3aXRoaW4gMTAlCisgICAqIG9mIHRoZSBleHBlY3RlZCBleHBpcmF0aW9uIHRpbWUuIEl0IHRoZW4gdmVyaWZpZXMgdGhhdCB0aGUgdGltZXIgbWFuYWdlcgorICAgKiBwcm9wZXJseSBjbGVhbiB1cCBpdHNlbGYgYW5kIHRoZSByZW1haW5pbmcgb3JwaGFuZWQgdGltZW91dCB0YXNrIHdoZW4gdGhlCisgICAqIG1hbmFnZXIgZ29lcyBvdXQgb2Ygc2NvcGUgYW5kIGl0cyBkZXN0cnVjdG9yIGlzIGNhbGxlZC4KKyAgICovCisgIGJvb2wgdGVzdDAwKGludDY0X3QgdGltZW91dCA9IDEwMDBMTCkgeworCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gb3JwaGFuVGFzaworICAgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgMTAgKiB0aW1lb3V0KSk7CisKKyAgICB7CisgICAgICBUaW1lck1hbmFnZXIgdGltZXJNYW5hZ2VyOworICAgICAgdGltZXJNYW5hZ2VyLnRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSkpOworICAgICAgdGltZXJNYW5hZ2VyLnN0YXJ0KCk7CisgICAgICBpZiAodGltZXJNYW5hZ2VyLnN0YXRlKCkgIT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAidGltZXJNYW5hZ2VyIGlzIG5vdCBpbiB0aGUgU1RBUlRFRCBzdGF0ZSwgYnV0IHNob3VsZCBiZSIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIC8vIERvbid0IGNyZWF0ZSB0YXNrIHlldCwgYmVjYXVzZSBpdHMgY29uc3RydWN0b3Igc2V0cyB0aGUgZXhwZWN0ZWQgY29tcGxldGlvbiB0aW1lLCBhbmQgd2UKKyAgICAgIC8vIG5lZWQgdG8gZGVsYXkgYmV0d2VlbiBpbnNlcnRpbmcgdGhlIHR3byB0YXNrcyBpbnRvIHRoZSBydW4gcXVldWUuCisgICAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrOworCisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKyAgICAgICAgdGltZXJNYW5hZ2VyLmFkZChvcnBoYW5UYXNrLCAxMCAqIHRpbWVvdXQpOworCisgICAgICAgIFRIUklGVF9TTEVFUF9VU0VDKHRpbWVvdXQgKiAxMDAwKTsKKworICAgICAgICB0YXNrLnJlc2V0KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCkpOworICAgICAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2ssIHRpbWVvdXQpOworICAgICAgICBfbW9uaXRvci53YWl0KCk7CisgICAgICB9CisKKyAgICAgIGlmICghdGFzay0+X2RvbmUpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJ0YXNrIGlzIG5vdCBkb25lLCBidXQgaXQgc2hvdWxkIGhhdmUgZXhlY3V0ZWQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgKHRhc2stPl9zdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKSA8PCAiISIgPDwgc3RkOjplbmRsOworICAgIH0KKworICAgIGlmIChvcnBoYW5UYXNrLT5fZG9uZSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJvcnBoYW4gdGFzayBpcyBkb25lLCBidXQgaXQgc2hvdWxkIG5vdCBoYXZlIGV4ZWN1dGVkIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKioKKyAgICogVGhpcyB0ZXN0IGNyZWF0ZXMgdHdvIHRhc2tzLCByZW1vdmVzIHRoZSBmaXJzdCBvbmUgdGhlbiB3YWl0cyBmb3IgdGhlIHNlY29uZCBvbmUuIEl0IHRoZW4KKyAgICogdmVyaWZpZXMgdGhhdCB0aGUgdGltZXIgbWFuYWdlciBwcm9wZXJseSBjbGVhbiB1cCBpdHNlbGYgYW5kIHRoZSByZW1haW5pbmcgb3JwaGFuZWQgdGltZW91dAorICAgKiB0YXNrIHdoZW4gdGhlIG1hbmFnZXIgZ29lcyBvdXQgb2Ygc2NvcGUgYW5kIGl0cyBkZXN0cnVjdG9yIGlzIGNhbGxlZC4KKyAgICovCisgIGJvb2wgdGVzdDAxKGludDY0X3QgdGltZW91dCA9IDEwMDBMTCkgeworICAgIFRpbWVyTWFuYWdlciB0aW1lck1hbmFnZXI7CisgICAgdGltZXJNYW5hZ2VyLnRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSkpOworICAgIHRpbWVyTWFuYWdlci5zdGFydCgpOworICAgIGFzc2VydCh0aW1lck1hbmFnZXIuc3RhdGUoKSA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQpOworCisgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworCisgICAgLy8gU2V0dXAgdGhlIHR3byB0YXNrcworICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2tUb1JlbW92ZQorICAgICAgPSBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQgLyAyKSk7CisgICAgdGltZXJNYW5hZ2VyLmFkZCh0YXNrVG9SZW1vdmUsIHRhc2tUb1JlbW92ZS0+X3RpbWVvdXQpOworCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFzaworICAgICAgPSBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQpKTsKKyAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2ssIHRhc2stPl90aW1lb3V0KTsKKworICAgIC8vIFJlbW92ZSBvbmUgdGFzayBhbmQgd2FpdCB1bnRpbCB0aGUgb3RoZXIgaGFzIGNvbXBsZXRlZAorICAgIHRpbWVyTWFuYWdlci5yZW1vdmUodGFza1RvUmVtb3ZlKTsKKyAgICBfbW9uaXRvci53YWl0KHRpbWVvdXQgKiAyKTsKKworICAgIGFzc2VydCghdGFza1RvUmVtb3ZlLT5fZG9uZSk7CisgICAgYXNzZXJ0KHRhc2stPl9kb25lKTsKKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAqIFRoaXMgdGVzdCBjcmVhdGVzIHR3byB0YXNrcyB3aXRoIHRoZSBzYW1lIGNhbGxiYWNrIGFuZCBhbm90aGVyIG9uZSwgdGhlbiByZW1vdmVzIHRoZSB0d28KKyAgICogZHVwbGljYXRlZCB0aGVuIHdhaXRzIGZvciB0aGUgbGFzdCBvbmUuIEl0IHRoZW4gdmVyaWZpZXMgdGhhdCB0aGUgdGltZXIgbWFuYWdlciBwcm9wZXJseQorICAgKiBjbGVhbiB1cCBpdHNlbGYgYW5kIHRoZSByZW1haW5pbmcgb3JwaGFuZWQgdGltZW91dCB0YXNrIHdoZW4gdGhlIG1hbmFnZXIgZ29lcyBvdXQgb2Ygc2NvcGUKKyAgICogYW5kIGl0cyBkZXN0cnVjdG9yIGlzIGNhbGxlZC4KKyAgICovCisgIGJvb2wgdGVzdDAyKGludDY0X3QgdGltZW91dCA9IDEwMDBMTCkgeworICAgIFRpbWVyTWFuYWdlciB0aW1lck1hbmFnZXI7CisgICAgdGltZXJNYW5hZ2VyLnRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSkpOworICAgIHRpbWVyTWFuYWdlci5zdGFydCgpOworICAgIGFzc2VydCh0aW1lck1hbmFnZXIuc3RhdGUoKSA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQpOworCisgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworCisgICAgLy8gU2V0dXAgdGhlIG9uZSB0YXNrcyBhbmQgYWRkIGl0IHR3aWNlCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFza1RvUmVtb3ZlCisgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCAvIDMpKTsKKyAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2tUb1JlbW92ZSwgdGFza1RvUmVtb3ZlLT5fdGltZW91dCk7CisgICAgdGltZXJNYW5hZ2VyLmFkZCh0YXNrVG9SZW1vdmUsIHRhc2tUb1JlbW92ZS0+X3RpbWVvdXQgKiAyKTsKKworICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2sKKyAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0KSk7CisgICAgdGltZXJNYW5hZ2VyLmFkZCh0YXNrLCB0YXNrLT5fdGltZW91dCk7CisKKyAgICAvLyBSZW1vdmUgdGhlIGZpcnN0IHRhc2sgKGUuZy4gdHdvIHRpbWVycykgYW5kIHdhaXQgdW50aWwgdGhlIG90aGVyIGhhcyBjb21wbGV0ZWQKKyAgICB0aW1lck1hbmFnZXIucmVtb3ZlKHRhc2tUb1JlbW92ZSk7CisgICAgX21vbml0b3Iud2FpdCh0aW1lb3V0ICogMik7CisKKyAgICBhc3NlcnQoIXRhc2tUb1JlbW92ZS0+X2RvbmUpOworICAgIGFzc2VydCh0YXNrLT5fZG9uZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGlzIHRlc3QgY3JlYXRlcyB0d28gdGFza3MsIHJlbW92ZXMgdGhlIGZpcnN0IG9uZSB0aGVuIHdhaXRzIGZvciB0aGUgc2Vjb25kIG9uZS4gSXQgdGhlbgorICAgKiB2ZXJpZmllcyB0aGF0IHRoZSB0aW1lciBtYW5hZ2VyIHByb3Blcmx5IGNsZWFuIHVwIGl0c2VsZiBhbmQgdGhlIHJlbWFpbmluZyBvcnBoYW5lZCB0aW1lb3V0CisgICAqIHRhc2sgd2hlbiB0aGUgbWFuYWdlciBnb2VzIG91dCBvZiBzY29wZSBhbmQgaXRzIGRlc3RydWN0b3IgaXMgY2FsbGVkLgorICAgKi8KKyAgYm9vbCB0ZXN0MDMoaW50NjRfdCB0aW1lb3V0ID0gMTAwMExMKSB7CisgICAgVGltZXJNYW5hZ2VyIHRpbWVyTWFuYWdlcjsKKyAgICB0aW1lck1hbmFnZXIudGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKSk7CisgICAgdGltZXJNYW5hZ2VyLnN0YXJ0KCk7CisgICAgYXNzZXJ0KHRpbWVyTWFuYWdlci5zdGF0ZSgpID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCk7CisKKyAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisKKyAgICAvLyBTZXR1cCB0aGUgdHdvIHRhc2tzCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFza1RvUmVtb3ZlCisgICAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0IC8gMikpOworICAgIFRpbWVyTWFuYWdlcjo6VGltZXIgdGltZXIgPSB0aW1lck1hbmFnZXIuYWRkKHRhc2tUb1JlbW92ZSwgdGFza1RvUmVtb3ZlLT5fdGltZW91dCk7CisKKyAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrCisgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCkpOworICAgIHRpbWVyTWFuYWdlci5hZGQodGFzaywgdGFzay0+X3RpbWVvdXQpOworCisgICAgLy8gUmVtb3ZlIG9uZSB0YXNrIGFuZCB3YWl0IHVudGlsIHRoZSBvdGhlciBoYXMgY29tcGxldGVkCisgICAgdGltZXJNYW5hZ2VyLnJlbW92ZSh0aW1lcik7CisgICAgX21vbml0b3Iud2FpdCh0aW1lb3V0ICogMik7CisKKyAgICBhc3NlcnQoIXRhc2tUb1JlbW92ZS0+X2RvbmUpOworICAgIGFzc2VydCh0YXNrLT5fZG9uZSk7CisKKyAgICAvLyBWZXJpZnkgYmVoYXZpb3Igd2hlbiByZW1vdmluZyB0aGUgcmVtb3ZlZCB0YXNrCisgICAgdHJ5IHsKKyAgICAgIHRpbWVyTWFuYWdlci5yZW1vdmUodGltZXIpOworICAgICAgYXNzZXJ0KDAgPT0gIkVSUk9SOiBUaGlzIHJlbW92ZSBzaG91bGQgc2VuZCBhIE5vU3VjaFRhc2tFeGNlcHRpb24gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKE5vU3VjaFRhc2tFeGNlcHRpb24mKSB7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKioKKyAgICogVGhpcyB0ZXN0IGNyZWF0ZXMgb25lIHRhc2tzLCBhbmQgdHJpZXMgdG8gcmVtb3ZlIGl0IGFmdGVyIGl0IGhhcyBleHBpcmVkLgorICAgKi8KKyAgYm9vbCB0ZXN0MDQoaW50NjRfdCB0aW1lb3V0ID0gMTAwMExMKSB7CisgICAgVGltZXJNYW5hZ2VyIHRpbWVyTWFuYWdlcjsKKyAgICB0aW1lck1hbmFnZXIudGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKSk7CisgICAgdGltZXJNYW5hZ2VyLnN0YXJ0KCk7CisgICAgYXNzZXJ0KHRpbWVyTWFuYWdlci5zdGF0ZSgpID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCk7CisKKyAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisKKyAgICAvLyBTZXR1cCB0aGUgdGFzaworICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2sKKyAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0IC8gMTApKTsKKyAgICBUaW1lck1hbmFnZXI6OlRpbWVyIHRpbWVyID0gdGltZXJNYW5hZ2VyLmFkZCh0YXNrLCB0YXNrLT5fdGltZW91dCk7CisKKyAgICAvLyBXYWl0IHVudGlsIHRoZSB0YXNrIGhhcyBjb21wbGV0ZWQKKyAgICBfbW9uaXRvci53YWl0KHRpbWVvdXQpOworCisgICAgLy8gVmVyaWZ5IGJlaGF2aW9yIHdoZW4gcmVtb3ZpbmcgdGhlIGV4cGlyZWQgdGFzaworICAgIHRyeSB7CisgICAgICB0aW1lck1hbmFnZXIucmVtb3ZlKHRpbWVyKTsKKyAgICAgIGFzc2VydCgwID09ICJFUlJPUjogVGhpcyByZW1vdmUgc2hvdWxkIHNlbmQgYSBOb1N1Y2hUYXNrRXhjZXB0aW9uIGV4Y2VwdGlvbi4iKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hUYXNrRXhjZXB0aW9uJikgeworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgZnJpZW5kIGNsYXNzIFRlc3RUYXNrOworCisgIE1vbml0b3IgX21vbml0b3I7Cit9OworCit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L2xpbmsvTGlua1Rlc3QuY3BwIGIvbGliL2NwcC90ZXN0L2xpbmsvTGlua1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZTE0ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvbGluay9MaW5rVGVzdC5jcHAKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbnQgbWFpbihpbnQsIGNoYXIqKikgeworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9saW5rL1RlbXBsYXRlZFNlcnZpY2UxLmNwcCBiL2xpYi9jcHAvdGVzdC9saW5rL1RlbXBsYXRlZFNlcnZpY2UxLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTE3OTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L2xpbmsvVGVtcGxhdGVkU2VydmljZTEuY3BwCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhIHBhcnQgb2YgYSBsaW5rIHRlc3QgdGhhdCBtYWtlcyBzdXJlIGdlbmVyYXRlZAorICogdGVtcGxhdGVkIHNlcnZpY2UgaGVhZGVycyBjYW4gYmUgaW5jbHVkZWQgZnJvbSBtdWx0aXBsZQorICogaW1wbGVtZW50YXRpb24gZmlsZXMuCisgKi8KKworI2luY2x1ZGUgImdlbi1jcHAvUGFyZW50U2VydmljZS5oIgpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L2xpbmsvVGVtcGxhdGVkU2VydmljZTIuY3BwIGIvbGliL2NwcC90ZXN0L2xpbmsvVGVtcGxhdGVkU2VydmljZTIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMTc5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvbGluay9UZW1wbGF0ZWRTZXJ2aWNlMi5jcHAKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGEgcGFydCBvZiBhIGxpbmsgdGVzdCB0aGF0IG1ha2VzIHN1cmUgZ2VuZXJhdGVkCisgKiB0ZW1wbGF0ZWQgc2VydmljZSBoZWFkZXJzIGNhbiBiZSBpbmNsdWRlZCBmcm9tIG11bHRpcGxlCisgKiBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqLworCisjaW5jbHVkZSAiZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmgiCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0V2ZW50TG9nLmNwcCBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvRXZlbnRMb2cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZGRiY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0V2ZW50TG9nLmNwcApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIkV2ZW50TG9nLmgiCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKKworbmFtZXNwYWNlIHsKKworLy8gRGVmaW5lIGVudmlyb25tZW50IHZhcmlhYmxlIERFQlVHX0VWRU5UTE9HIHRvIGVuYWJsZSBkZWJ1ZyBsb2dnaW5nCisvLyBleDogJCBERUJVR19FVkVOVExPRz0xIHByb2Nlc3Nvcl90ZXN0CitzdGF0aWMgY29uc3QgY2hhciAqIERFQlVHX0VWRU5UTE9HID0gZ2V0ZW52KCJERUJVR19FVkVOVExPRyIpOworCit2b2lkIGRlYnVnKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIGlmIChERUJVR19FVkVOVExPRykgeworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKyAgICB2YV9lbmQoYXApOworCisgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICB9Cit9Cit9CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdGVzdCB7CisKK3VpbnQzMl90IEV2ZW50TG9nOjpuZXh0SWRfID0gMDsKKworI2RlZmluZSBFVkVOVF9UWVBFKHZhbHVlKSBFdmVudFR5cGUgRXZlbnRMb2c6OnZhbHVlID0gI3ZhbHVlCitFVkVOVF9UWVBFKEVUX0xPR19FTkQpOworRVZFTlRfVFlQRShFVF9DT05OX0NSRUFURUQpOworRVZFTlRfVFlQRShFVF9DT05OX0RFU1RST1lFRCk7CitFVkVOVF9UWVBFKEVUX0NBTExfU1RBUlRFRCk7CitFVkVOVF9UWVBFKEVUX0NBTExfRklOSVNIRUQpOworRVZFTlRfVFlQRShFVF9QUk9DRVNTKTsKK0VWRU5UX1RZUEUoRVRfUFJFX1JFQUQpOworRVZFTlRfVFlQRShFVF9QT1NUX1JFQUQpOworRVZFTlRfVFlQRShFVF9QUkVfV1JJVEUpOworRVZFTlRfVFlQRShFVF9QT1NUX1dSSVRFKTsKK0VWRU5UX1RZUEUoRVRfQVNZTkNfQ09NUExFVEUpOworRVZFTlRfVFlQRShFVF9IQU5ETEVSX0VSUk9SKTsKKworRVZFTlRfVFlQRShFVF9DQUxMX0lOQ1JFTUVOVF9HRU5FUkFUSU9OKTsKK0VWRU5UX1RZUEUoRVRfQ0FMTF9HRVRfR0VORVJBVElPTik7CitFVkVOVF9UWVBFKEVUX0NBTExfQUREX1NUUklORyk7CitFVkVOVF9UWVBFKEVUX0NBTExfR0VUX1NUUklOR1MpOworRVZFTlRfVFlQRShFVF9DQUxMX0dFVF9EQVRBX1dBSVQpOworRVZFTlRfVFlQRShFVF9DQUxMX09ORVdBWV9XQUlUKTsKK0VWRU5UX1RZUEUoRVRfQ0FMTF9FWENFUFRJT05fV0FJVCk7CitFVkVOVF9UWVBFKEVUX0NBTExfVU5FWFBFQ1RFRF9FWENFUFRJT05fV0FJVCk7CitFVkVOVF9UWVBFKEVUX0NBTExfU0VUX1ZBTFVFKTsKK0VWRU5UX1RZUEUoRVRfQ0FMTF9HRVRfVkFMVUUpOworRVZFTlRfVFlQRShFVF9XQUlUX1JFVFVSTik7CisKK0V2ZW50TG9nOjpFdmVudExvZygpIHsKKyAgaWRfID0gbmV4dElkXysrOworICBkZWJ1ZygiTmV3IGxvZzogJWQiLCBpZF8pOworfQorCit2b2lkIEV2ZW50TG9nOjphcHBlbmQoRXZlbnRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNhbGxJZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeworICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgIGRlYnVnKCIlZCA8LS0gJXUsICV1LCAlcyBcIiVzXCIiLCBpZF8sIGNvbm5lY3Rpb25JZCwgY2FsbElkLCB0eXBlLCBtZXNzYWdlLmNfc3RyKCkpOworCisgIEV2ZW50IGUodHlwZSwgY29ubmVjdGlvbklkLCBjYWxsSWQsIG1lc3NhZ2UpOworICBldmVudHNfLnB1c2hfYmFjayhlKTsKKworICBtb25pdG9yXy5ub3RpZnkoKTsKK30KKworRXZlbnQgRXZlbnRMb2c6OndhaXRGb3JFdmVudChpbnQ2NF90IHRpbWVvdXQpIHsKKyAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworCisgIHRyeSB7CisgICAgd2hpbGUgKGV2ZW50c18uZW1wdHkoKSkgeworICAgICAgbW9uaXRvcl8ud2FpdCh0aW1lb3V0KTsKKyAgICB9CisgIH0gY2F0Y2ggKFRpbWVkT3V0RXhjZXB0aW9uIGV4KSB7CisgICAgcmV0dXJuIEV2ZW50KEVUX0xPR19FTkQsIDAsIDAsICIiKTsKKyAgfQorCisgIEV2ZW50IGV2ZW50ID0gZXZlbnRzXy5mcm9udCgpOworICBldmVudHNfLnBvcF9mcm9udCgpOworICByZXR1cm4gZXZlbnQ7Cit9CisKK0V2ZW50IEV2ZW50TG9nOjp3YWl0Rm9yQ29ubkV2ZW50KHVpbnQzMl90IGNvbm5JZCwgaW50NjRfdCB0aW1lb3V0KSB7CisgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKworICBFdmVudExpc3Q6Oml0ZXJhdG9yIGl0ID0gZXZlbnRzXy5iZWdpbigpOworICB3aGlsZSAodHJ1ZSkgeworICAgIHRyeSB7CisgICAgICAvLyBUT0RPOiBpdCB3b3VsZCBiZSBuaWNlciB0byBob25vciB0aW1lb3V0IGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcworICAgICAgLy8gY2FsbCwgcmF0aGVyIHRoYW4gcmVzdGFydGluZyBpdCBmb3IgZWFjaCBjYWxsIHRvIHdhaXQoKS4gIEl0IHNob3VsZG4ndAorICAgICAgLy8gYmUgYSBiaWcgcHJvYmxlbSBpbiBwcmFjdGljZSwgdGhvdWdoLgorICAgICAgd2hpbGUgKGl0ID09IGV2ZW50c18uZW5kKCkpIHsKKyAgICAgICAgbW9uaXRvcl8ud2FpdCh0aW1lb3V0KTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiBleCkgeworICAgICAgcmV0dXJuIEV2ZW50KEVUX0xPR19FTkQsIDAsIDAsICIiKTsKKyAgICB9CisKKyAgICBpZiAoaXQtPmNvbm5lY3Rpb25JZCA9PSBjb25uSWQpIHsKKyAgICAgIEV2ZW50IGV2ZW50ID0gKml0OworICAgICAgZXZlbnRzXy5lcmFzZShpdCk7CisgICAgICByZXR1cm4gZXZlbnQ7CisgICAgfQorICB9Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0V2ZW50TG9nLmggYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0V2ZW50TG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY4Mjc1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvRXZlbnRMb2cuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9USFJJRlRfVEVTVF9FVkVOVExPR19IXworI2RlZmluZSBfVEhSSUZUX1RFU1RfRVZFTlRMT0dfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0ZXN0IHsKKworLy8gSW5pdGlhbGx5IEkgbWFkZSBFdmVudFR5cGUgYW4gZW51bSwgYnV0IHVzaW5nIGNoYXIqIHJlc3VsdHMKKy8vIGluIG11Y2ggbW9yZSByZWFkYWJsZSBlcnJvciBtZXNzYWdlcyB3aGVuIHRoZXJlIGlzIGEgbWlzbWF0Y2guCisvLyBJdCBhbHNvIGxldHMgdXNlcnMgb2YgRXZlbnRMb2cgZWFzaWx5IGRlZmluZSB0aGVpciBvd24gbmV3IHR5cGVzLgorLy8gQ29tcGFyaW5nIHRoZSBsaXRlcmFsIHBvaW50ZXIgdmFsdWVzIHNob3VsZCBiZSBzYWZlLCBiYXJyaW5nIGFueSBzdHJhbmdlCisvLyBsaW5raW5nIHNldHVwIHRoYXQgcmVzdWx0cyBpbiBkdXBsaWNhdGUgc3ltYm9scy4KK3R5cGVkZWYgY29uc3QgY2hhciogRXZlbnRUeXBlOworCitzdHJ1Y3QgRXZlbnQgeworICBFdmVudChFdmVudFR5cGUgdHlwZSwgdWludDMyX3QgY29ubmVjdGlvbklkLCB1aW50MzJfdCBjYWxsSWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKQorICAgIDogdHlwZSh0eXBlKSwgY29ubmVjdGlvbklkKGNvbm5lY3Rpb25JZCksIGNhbGxJZChjYWxsSWQpLCBtZXNzYWdlKG1lc3NhZ2UpIHt9CisKKyAgRXZlbnRUeXBlIHR5cGU7CisgIHVpbnQzMl90IGNvbm5lY3Rpb25JZDsKKyAgdWludDMyX3QgY2FsbElkOworICBzdGQ6OnN0cmluZyBtZXNzYWdlOworfTsKKworY2xhc3MgRXZlbnRMb2cgeworcHVibGljOgorICBzdGF0aWMgRXZlbnRUeXBlIEVUX0xPR19FTkQ7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ09OTl9DUkVBVEVEOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX0NPTk5fREVTVFJPWUVEOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX0NBTExfU1RBUlRFRDsKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9DQUxMX0ZJTklTSEVEOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX1BST0NFU1M7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfUFJFX1JFQUQ7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfUE9TVF9SRUFEOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX1BSRV9XUklURTsKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9QT1NUX1dSSVRFOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX0FTWU5DX0NPTVBMRVRFOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX0hBTkRMRVJfRVJST1I7CisKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9DQUxMX0lOQ1JFTUVOVF9HRU5FUkFUSU9OOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX0NBTExfR0VUX0dFTkVSQVRJT047CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ0FMTF9BRERfU1RSSU5HOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX0NBTExfR0VUX1NUUklOR1M7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ0FMTF9HRVRfREFUQV9XQUlUOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX0NBTExfT05FV0FZX1dBSVQ7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ0FMTF9VTkVYUEVDVEVEX0VYQ0VQVElPTl9XQUlUOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX0NBTExfRVhDRVBUSU9OX1dBSVQ7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfV0FJVF9SRVRVUk47CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ0FMTF9TRVRfVkFMVUU7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ0FMTF9HRVRfVkFMVUU7CisKKyAgRXZlbnRMb2coKTsKKworICB2b2lkIGFwcGVuZChFdmVudFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgdWludDMyX3QgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICB1aW50MzJfdCBjYWxsSWQsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlID0gIiIpOworCisgIEV2ZW50IHdhaXRGb3JFdmVudChpbnQ2NF90IHRpbWVvdXQgPSA1MDApOworICBFdmVudCB3YWl0Rm9yQ29ubkV2ZW50KHVpbnQzMl90IGNvbm5JZCwgaW50NjRfdCB0aW1lb3V0ID0gNTAwKTsKKworcHJvdGVjdGVkOgorICB0eXBlZGVmIHN0ZDo6bGlzdDxFdmVudD4gRXZlbnRMaXN0OworCisgIGNvbmN1cnJlbmN5OjpNb25pdG9yIG1vbml0b3JfOworICBFdmVudExpc3QgZXZlbnRzXzsKKyAgdWludDMyX3QgaWRfOworCisgIHN0YXRpYyB1aW50MzJfdCBuZXh0SWRfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRlc3QKKworI2VuZGlmIC8vIF9USFJJRlRfVEVTVF9FVkVOVExPR19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9IYW5kbGVycy5oIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9IYW5kbGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5Nzg0ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0hhbmRsZXJzLmgKQEAgLTAsMCArMSwzMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX1RIUklGVF9QUk9DRVNTT1JfVEVTVF9IQU5ETEVSU19IXworI2RlZmluZSBfVEhSSUZUX1BST0NFU1NPUl9URVNUX0hBTkRMRVJTX0hfIDEKKworI2luY2x1ZGUgIkV2ZW50TG9nLmgiCisjaW5jbHVkZSAiZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmgiCisjaW5jbHVkZSAiZ2VuLWNwcC9DaGlsZFNlcnZpY2UuaCIKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0ZXN0IHsKKworY2xhc3MgUGFyZW50SGFuZGxlciA6IHZpcnR1YWwgcHVibGljIFBhcmVudFNlcnZpY2VJZiB7CitwdWJsaWM6CisgIFBhcmVudEhhbmRsZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKQorICAgIDogdHJpZ2dlck1vbml0b3IoJm11dGV4XyksIGdlbmVyYXRpb25fKDApLCB3YWl0XyhmYWxzZSksIGxvZ18obG9nKSB7fQorCisgIGludDMyX3QgaW5jcmVtZW50R2VuZXJhdGlvbigpIHsKKyAgICBjb25jdXJyZW5jeTo6R3VhcmQgZyhtdXRleF8pOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ0FMTF9JTkNSRU1FTlRfR0VORVJBVElPTiwgMCwgMCk7CisgICAgcmV0dXJuICsrZ2VuZXJhdGlvbl87CisgIH0KKworICBpbnQzMl90IGdldEdlbmVyYXRpb24oKSB7CisgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfR0VUX0dFTkVSQVRJT04sIDAsIDApOworICAgIHJldHVybiBnZW5lcmF0aW9uXzsKKyAgfQorCisgIHZvaWQgYWRkU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7CisgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfQUREX1NUUklORywgMCwgMCk7CisgICAgc3RyaW5nc18ucHVzaF9iYWNrKHMpOworICB9CisKKyAgdm9pZCBnZXRTdHJpbmdzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgX3JldHVybikgeworICAgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKG11dGV4Xyk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DQUxMX0dFVF9TVFJJTkdTLCAwLCAwKTsKKyAgICBfcmV0dXJuID0gc3RyaW5nc187CisgIH0KKworICB2b2lkIGdldERhdGFXYWl0KHN0ZDo6c3RyaW5nJiBfcmV0dXJuLCBjb25zdCBpbnQzMl90IGxlbmd0aCkgeworICAgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKG11dGV4Xyk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DQUxMX0dFVF9EQVRBX1dBSVQsIDAsIDApOworCisgICAgYmxvY2tVbnRpbFRyaWdnZXJlZCgpOworCisgICAgX3JldHVybi5hcHBlbmQobGVuZ3RoLCAnYScpOworICB9CisKKyAgdm9pZCBvbmV3YXlXYWl0KCkgeworICAgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKG11dGV4Xyk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DQUxMX09ORVdBWV9XQUlULCAwLCAwKTsKKworICAgIGJsb2NrVW50aWxUcmlnZ2VyZWQoKTsKKyAgfQorCisgIHZvaWQgZXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeworICAgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKG11dGV4Xyk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DQUxMX0VYQ0VQVElPTl9XQUlULCAwLCAwKTsKKworICAgIGJsb2NrVW50aWxUcmlnZ2VyZWQoKTsKKworICAgIE15RXJyb3IgZTsKKyAgICBlLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIHRocm93IGU7CisgIH0KKworICB2b2lkIHVuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CisgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfVU5FWFBFQ1RFRF9FWENFUFRJT05fV0FJVCwgMCwgMCk7CisKKyAgICBibG9ja1VudGlsVHJpZ2dlcmVkKCk7CisKKyAgICBNeUVycm9yIGU7CisgICAgZS5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB0aHJvdyBlOworICB9CisKKyAgLyoqCisgICAqIEFmdGVyIHByZXBhcmVUcmlnZ2VyZWRDYWxsKCkgaXMgaW52b2tlZCwgY2FsbHMgdG8gYW55IG9mIHRoZSAqV2FpdCgpCisgICAqIGZ1bmN0aW9ucyB3b24ndCByZXR1cm4gdW50aWwgdHJpZ2dlclBlbmRpbmdDYWxscygpIGlzIGludm9rZWQKKyAgICoKKyAgICogVGhpcyBoYXMgdG8gYmUgYSBzZXBhcmF0ZSBmdW5jdGlvbiBpbnZva2VkIGJ5IHRoZSBtYWluIHRlc3QgdGhyZWFkCisgICAqIGluIG9yZGVyIHRvIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucy4KKyAgICovCisgIHZvaWQgcHJlcGFyZVRyaWdnZXJlZENhbGwoKSB7CisgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKKyAgICB3YWl0XyA9IHRydWU7CisgIH0KKworICAvKioKKyAgICogV2FrZSB1cCBhbGwgY2FsbHMgd2FpdGluZyBpbiBibG9ja1VudGlsVHJpZ2dlcmVkKCkKKyAgICovCisgIHZvaWQgdHJpZ2dlclBlbmRpbmdDYWxscygpIHsKKyAgICBjb25jdXJyZW5jeTo6R3VhcmQgZyhtdXRleF8pOworICAgIHdhaXRfID0gZmFsc2U7CisgICAgdHJpZ2dlck1vbml0b3Iubm90aWZ5QWxsKCk7CisgIH0KKworcHJvdGVjdGVkOgorICAvKioKKyAgICogYmxvY2tVbnRpbFRyaWdnZXJlZCgpIHdvbid0IHJldHVybiB1bnRpbCB0cmlnZ2VyUGVuZGluZ0NhbGxzKCkgaXMgaW52b2tlZAorICAgKiBpbiBhbm90aGVyIHRocmVhZC4KKyAgICoKKyAgICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiBhbHJlYWR5IGhvbGRpbmcgbXV0ZXhfLgorICAgKi8KKyAgdm9pZCBibG9ja1VudGlsVHJpZ2dlcmVkKCkgeworICAgIHdoaWxlICh3YWl0XykgeworICAgICAgdHJpZ2dlck1vbml0b3Iud2FpdEZvcmV2ZXIoKTsKKyAgICB9CisKKyAgICAvLyBMb2cgYW4gZXZlbnQgd2hlbiB3ZSByZXR1cm4KKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX1dBSVRfUkVUVVJOLCAwLCAwKTsKKyAgfQorCisgIGNvbmN1cnJlbmN5OjpNdXRleCBtdXRleF87CisgIGNvbmN1cnJlbmN5OjpNb25pdG9yIHRyaWdnZXJNb25pdG9yOworICBpbnQzMl90IGdlbmVyYXRpb25fOworICBib29sIHdhaXRfOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nc187CisgIHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4gbG9nXzsKK307CisKKyNpZmRlZiBfV0lOMzIKKyAgI3ByYWdtYSB3YXJuaW5nKCBwdXNoICkKKyAgI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDI1MCApIC8vaW5oZXJpdGluZyBtZXRob2RzIHZpYSBkb21pbmFuY2UKKyNlbmRpZgorCitjbGFzcyBDaGlsZEhhbmRsZXIgOiBwdWJsaWMgUGFyZW50SGFuZGxlciwgdmlydHVhbCBwdWJsaWMgQ2hpbGRTZXJ2aWNlSWYgeworcHVibGljOgorICBDaGlsZEhhbmRsZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKSA6IFBhcmVudEhhbmRsZXIobG9nKSwgdmFsdWVfKDApIHt9CisKKyAgaW50MzJfdCBzZXRWYWx1ZShjb25zdCBpbnQzMl90IHZhbHVlKSB7CisgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfU0VUX1ZBTFVFLCAwLCAwKTsKKworICAgIGludDMyX3Qgb2xkVmFsdWUgPSB2YWx1ZV87CisgICAgdmFsdWVfID0gdmFsdWU7CisgICAgcmV0dXJuIG9sZFZhbHVlOworICB9CisKKyAgaW50MzJfdCBnZXRWYWx1ZSgpIHsKKyAgICBjb25jdXJyZW5jeTo6R3VhcmQgZyhtdXRleF8pOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ0FMTF9HRVRfVkFMVUUsIDAsIDApOworCisgICAgcmV0dXJuIHZhbHVlXzsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGludDMyX3QgdmFsdWVfOworfTsKKworI2lmZGVmIF9XSU4zMgorICAjcHJhZ21hIHdhcm5pbmcoIHBvcCApCisjZW5kaWYKKworc3RydWN0IENvbm5Db250ZXh0IHsKK3B1YmxpYzoKKyAgQ29ubkNvbnRleHQoc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAorICAgICAgICAgICAgICB1aW50MzJfdCBpZCkKKyAgICA6IGlucHV0KGluKSwgb3V0cHV0KG91dCksIGlkKGlkKSB7fQorCisgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbnB1dDsKKyAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dHB1dDsKKyAgdWludDMyX3QgaWQ7Cit9OworCitzdHJ1Y3QgQ2FsbENvbnRleHQgeworcHVibGljOgorICBDYWxsQ29udGV4dChDb25uQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKQorICAgIDogY29ubkNvbnRleHQoY29udGV4dCksIG5hbWUobmFtZSksIGlkKGlkKSB7fQorCisgIENvbm5Db250ZXh0KiBjb25uQ29udGV4dDsKKyAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgdWludDMyX3QgaWQ7Cit9OworCitjbGFzcyBTZXJ2ZXJFdmVudEhhbmRsZXIgOiBwdWJsaWMgc2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyIHsKK3B1YmxpYzoKKyAgU2VydmVyRXZlbnRIYW5kbGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgOiBuZXh0SWRfKDEpLCBsb2dfKGxvZykge30KKworICB2aXJ0dWFsIHZvaWQgcHJlU2VydmUoKSB7fQorCisgIHZpcnR1YWwgdm9pZCogY3JlYXRlQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0KSB7CisgICAgQ29ubkNvbnRleHQqIGNvbnRleHQgPSBuZXcgQ29ubkNvbnRleHQoaW5wdXQsIG91dHB1dCwgbmV4dElkXyk7CisgICAgKytuZXh0SWRfOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ09OTl9DUkVBVEVELCBjb250ZXh0LT5pZCwgMCk7CisgICAgcmV0dXJuIGNvbnRleHQ7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZGVsZXRlQ29udGV4dCh2b2lkKiBzZXJ2ZXJDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXRwdXQpIHsKKyAgICBDb25uQ29udGV4dCogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q29ubkNvbnRleHQqPihzZXJ2ZXJDb250ZXh0KTsKKworICAgIGlmIChpbnB1dCAhPSBjb250ZXh0LT5pbnB1dCkgeworICAgICAgYWJvcnQoKTsKKyAgICB9CisgICAgaWYgKG91dHB1dCAhPSBjb250ZXh0LT5vdXRwdXQpIHsKKyAgICAgIGFib3J0KCk7CisgICAgfQorCisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DT05OX0RFU1RST1lFRCwgY29udGV4dC0+aWQsIDApOworCisgICAgZGVsZXRlIGNvbnRleHQ7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0NvbnRleHQodm9pZCogc2VydmVyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgeworLy8gVE9ETzogV2UgY3VycmVudGx5IGRvbid0IHRlc3QgdGhlIGJlaGF2aW9yIG9mIHRoZSBwcm9jZXNzQ29udGV4dCgpCisvLyBjYWxscy4gIFRoZSB2YXJpb3VzIHNlcnZlciBpbXBsZW1lbnRhdGlvbnMgY2FsbCBwcm9jZXNzQ29udGV4dCgpIGF0CisvLyBzbGlnaHRseSBkaWZmZXJlbnQgdGltZXMsIGFuZCBpdCBpcyB0b28gYW5ub3lpbmcgdG8gdHJ5IGFuZCBhY2NvdW50IGZvcgorLy8gdGhlaXIgdmFyaW91cyBkaWZmZXJlbmNlcy4KKy8vCisvLyBUVGhyZWFkZWRTZXJ2ZXIsIFRUaHJlYWRQb29sU2VydmVyLCBhbmQgVFNpbXBsZVNlcnZlciB1c3VhbGx5IHdhaXQgdW50aWwKKy8vIHRoZXkgc2VlIHRoZSBmaXJzdCBieXRlIG9mIGEgcmVxdWVzdCBiZWZvcmUgY2FsbGluZyBwcm9jZXNzQ29udGV4dCgpLgorLy8gSG93ZXZlciwgdGhleSBkb24ndCB3YWl0IGZvciB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgdmVyeSBmaXJzdCByZXF1ZXN0LAorLy8gYW5kIGluc3RlYWQgaW1tZWRpYXRlbHkgY2FsbCBwcm9jZXNzQ29udGV4dCgpIGJlZm9yZSBhbnkgZGF0YSBpcworLy8gcmVjZWl2ZWQuCisvLworLy8gVE5vbmJsb2NraW5nU2VydmVyIGFsd2F5cyB3YWl0cyB1bnRpbCByZWNlaXZpbmcgdGhlIGZ1bGwgcmVxdWVzdCBiZWZvcmUKKy8vIGNhbGxpbmcgcHJvY2Vzc0NvbnRleHQoKS4KKyNpZiAwCisgICAgQ29ubkNvbnRleHQqIGNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENvbm5Db250ZXh0Kj4oc2VydmVyQ29udGV4dCk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9QUk9DRVNTLCBjb250ZXh0LT5pZCwgMCk7CisjZWxzZQorICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoc2VydmVyQ29udGV4dCk7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSh0cmFuc3BvcnQpOworI2VuZGlmCisgIH0KKworcHJvdGVjdGVkOgorICB1aW50MzJfdCBuZXh0SWRfOworICBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+IGxvZ187Cit9OworCitjbGFzcyBQcm9jZXNzb3JFdmVudEhhbmRsZXIgOiBwdWJsaWMgVFByb2Nlc3NvckV2ZW50SGFuZGxlciB7CitwdWJsaWM6CisgIFByb2Nlc3NvckV2ZW50SGFuZGxlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIDogbmV4dElkXygxKSwgbG9nXyhsb2cpIHt9CisKKyAgdm9pZCogZ2V0Q29udGV4dChjb25zdCBjaGFyKiBmbk5hbWUsIHZvaWQqIHNlcnZlckNvbnRleHQpIHsKKyAgICBDb25uQ29udGV4dCogY29ubkNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENvbm5Db250ZXh0Kj4oc2VydmVyQ29udGV4dCk7CisKKyAgICBDYWxsQ29udGV4dCogY29udGV4dCA9IG5ldyBDYWxsQ29udGV4dChjb25uQ29udGV4dCwgbmV4dElkXywgZm5OYW1lKTsKKyAgICArK25leHRJZF87CisKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfU1RBUlRFRCwgY29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwgZm5OYW1lKTsKKyAgICByZXR1cm4gY29udGV4dDsKKyAgfQorCisgIHZvaWQgZnJlZUNvbnRleHQodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbk5hbWUpIHsKKyAgICBDYWxsQ29udGV4dCogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2FsbENvbnRleHQqPihjdHgpOworICAgIGNoZWNrTmFtZShjb250ZXh0LCBmbk5hbWUpOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ0FMTF9GSU5JU0hFRCwgY29udGV4dC0+Y29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwgZm5OYW1lKTsKKyAgICBkZWxldGUgY29udGV4dDsKKyAgfQorCisgIHZvaWQgcHJlUmVhZCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuTmFtZSkgeworICAgIENhbGxDb250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDYWxsQ29udGV4dCo+KGN0eCk7CisgICAgY2hlY2tOYW1lKGNvbnRleHQsIGZuTmFtZSk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9QUkVfUkVBRCwgY29udGV4dC0+Y29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwgZm5OYW1lKTsKKyAgfQorCisgIHZvaWQgcG9zdFJlYWQodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbk5hbWUsIHVpbnQzMl90IGJ5dGVzKSB7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShieXRlcyk7CisgICAgQ2FsbENvbnRleHQqIGNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENhbGxDb250ZXh0Kj4oY3R4KTsKKyAgICBjaGVja05hbWUoY29udGV4dCwgZm5OYW1lKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX1BPU1RfUkVBRCwgY29udGV4dC0+Y29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwgZm5OYW1lKTsKKyAgfQorCisgIHZvaWQgcHJlV3JpdGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbk5hbWUpIHsKKyAgICBDYWxsQ29udGV4dCogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2FsbENvbnRleHQqPihjdHgpOworICAgIGNoZWNrTmFtZShjb250ZXh0LCBmbk5hbWUpOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfUFJFX1dSSVRFLCBjb250ZXh0LT5jb25uQ29udGV4dC0+aWQsIGNvbnRleHQtPmlkLCBmbk5hbWUpOworICB9CisKKyAgdm9pZCBwb3N0V3JpdGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbk5hbWUsIHVpbnQzMl90IGJ5dGVzKSB7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShieXRlcyk7CisgICAgQ2FsbENvbnRleHQqIGNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENhbGxDb250ZXh0Kj4oY3R4KTsKKyAgICBjaGVja05hbWUoY29udGV4dCwgZm5OYW1lKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX1BPU1RfV1JJVEUsIGNvbnRleHQtPmNvbm5Db250ZXh0LT5pZCwgY29udGV4dC0+aWQsIGZuTmFtZSk7CisgIH0KKworICB2b2lkIGFzeW5jQ29tcGxldGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbk5hbWUpIHsKKyAgICBDYWxsQ29udGV4dCogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2FsbENvbnRleHQqPihjdHgpOworICAgIGNoZWNrTmFtZShjb250ZXh0LCBmbk5hbWUpOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQVNZTkNfQ09NUExFVEUsIGNvbnRleHQtPmNvbm5Db250ZXh0LT5pZCwgY29udGV4dC0+aWQsIGZuTmFtZSk7CisgIH0KKworICB2b2lkIGhhbmRsZXJFcnJvcih2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuTmFtZSkgeworICAgIENhbGxDb250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDYWxsQ29udGV4dCo+KGN0eCk7CisgICAgY2hlY2tOYW1lKGNvbnRleHQsIGZuTmFtZSk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9IQU5ETEVSX0VSUk9SLCBjb250ZXh0LT5jb25uQ29udGV4dC0+aWQsIGNvbnRleHQtPmlkLCBmbk5hbWUpOworICB9CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBjaGVja05hbWUoY29uc3QgQ2FsbENvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGZuTmFtZSkgeworICAgIC8vIE5vdGU6IHdlIGNhbid0IHVzZSBCT09TVF9DSEVDS19FUVVBTCBoZXJlLCBzaW5jZSB0aGUgaGFuZGxlciBydW5zIGluIGEKKyAgICAvLyBkaWZmZXJlbnQgdGhyZWFkIGZyb20gdGhlIHRlc3QgZnVuY3Rpb25zLiAgSnVzdCBhYm9ydCBpZiB0aGUgbmFtZXMgYXJlCisgICAgLy8gZGlmZmVyZW50CisgICAgaWYgKGNvbnRleHQtPm5hbWUgIT0gZm5OYW1lKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgImNhbGwgY29udGV4dCBuYW1lIG1pc21hdGNoOiBcIiVzXCIgIT0gXCIlc1wiXG4iLAorICAgICAgICAgICAgICBjb250ZXh0LT5uYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgIGZuTmFtZSk7CisgICAgICBmZmx1c2goc3RkZXJyKTsKKyAgICAgIGFib3J0KCk7CisgICAgfQorICB9CisKKyAgdWludDMyX3QgbmV4dElkXzsKKyAgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiBsb2dfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRlc3QKKworI2VuZGlmIC8vIF9USFJJRlRfUFJPQ0VTU09SX1RFU1RfSEFORExFUlNfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvUHJvY2Vzc29yVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1Byb2Nlc3NvclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2Y2UwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1Byb2Nlc3NvclRlc3QuY3BwCkBAIC0wLDAgKzEsOTI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGVzdHMgdGhhdCBlbnN1cmUgVFByb2Nlc3NvckV2ZW50SGFuZGxlciBhbmQKKyAqIFRTZXJ2ZXJFdmVudEhhbmRsZXIgYXJlIGludm9rZWQgcHJvcGVybHkgYnkgdGhlIHZhcmlvdXMgc2VydmVyCisgKiBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Lmg+CisKKyNpbmNsdWRlICJFdmVudExvZy5oIgorI2luY2x1ZGUgIlNlcnZlclRocmVhZC5oIgorI2luY2x1ZGUgIkhhbmRsZXJzLmgiCisjaW5jbHVkZSAiZ2VuLWNwcC9DaGlsZFNlcnZpY2UuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dGVzdDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworLyoKKyAqIFRyYWl0cyBjbGFzc2VzIHRoYXQgZW5jYXBzdWxhdGUgaG93IHRvIGNyZWF0ZSB2YXJpb3VzIHR5cGVzIG9mIHNlcnZlcnMuCisgKi8KKworY2xhc3MgVFNpbXBsZVNlcnZlclRyYWl0cyB7CitwdWJsaWM6CisgIHR5cGVkZWYgVFNpbXBsZVNlcnZlciBTZXJ2ZXJUeXBlOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUU2ltcGxlU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIHVpbnQxNl90IHBvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRTaW1wbGVTZXJ2ZXI+KAorICAgICAgICBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSk7CisgIH0KK307CisKK2NsYXNzIFRUaHJlYWRlZFNlcnZlclRyYWl0cyB7CitwdWJsaWM6CisgIHR5cGVkZWYgVFRocmVhZGVkU2VydmVyIFNlcnZlclR5cGU7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUaHJlYWRlZFNlcnZlcj4gY3JlYXRlU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICB1aW50MTZfdCBwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVGhyZWFkZWRTZXJ2ZXI+KAorICAgICAgICBuZXcgVFRocmVhZGVkU2VydmVyKHByb2Nlc3Nvciwgc29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKTsKKyAgfQorfTsKKworY2xhc3MgVFRocmVhZFBvb2xTZXJ2ZXJUcmFpdHMgeworcHVibGljOgorICB0eXBlZGVmIFRUaHJlYWRQb29sU2VydmVyIFNlcnZlclR5cGU7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUaHJlYWRQb29sU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIHVpbnQxNl90IHBvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkobmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKDgpOworICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CisgICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKKworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRocmVhZFBvb2xTZXJ2ZXI+KAorICAgICAgICBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIocHJvY2Vzc29yLCBzb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgdGhyZWFkTWFuYWdlcikpOworICB9Cit9OworCitjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFpdHMgeworcHVibGljOgorICB0eXBlZGVmIFROb25ibG9ja2luZ1NlcnZlciBTZXJ2ZXJUeXBlOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgdWludDE2X3QgcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkgeworICAgIC8vIFROb25ibG9ja2luZ1NlcnZlciBhdXRvbWF0aWNhbGx5IHVzZXMgVEZyYW1lZFRyYW5zcG9ydC4KKyAgICAvLyBSYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIHN1cHBsaWVkIHRyYW5zcG9ydCBmYWN0b3J5IGlzIG5vdCBhCisgICAgLy8gVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkKKyAgICBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSogZnJhbWVkRmFjdG9yeQorICAgICAgICA9IGR5bmFtaWNfY2FzdDxURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSo+KHRyYW5zcG9ydEZhY3RvcnkuZ2V0KCkpOworICAgIGlmIChmcmFtZWRGYWN0b3J5ID09IE5VTEwpIHsKKyAgICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlciBtdXN0IHVzZSBURnJhbWVkVHJhbnNwb3J0Iik7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlclNvY2tldD4gc29ja2V0KG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkobmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKDgpOworICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CisgICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKKworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nU2VydmVyPigKKyAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlcihwcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgc29ja2V0LCB0aHJlYWRNYW5hZ2VyKSk7CisgIH0KK307CisKK2NsYXNzIFROb25ibG9ja2luZ1NlcnZlck5vVGhyZWFkc1RyYWl0cyB7CitwdWJsaWM6CisgIHR5cGVkZWYgVE5vbmJsb2NraW5nU2VydmVyIFNlcnZlclR5cGU7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlcj4gY3JlYXRlU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICB1aW50MTZfdCBwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KSB7CisgICAgLy8gVE5vbmJsb2NraW5nU2VydmVyIGF1dG9tYXRpY2FsbHkgdXNlcyBURnJhbWVkVHJhbnNwb3J0LgorICAgIC8vIFJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc3VwcGxpZWQgdHJhbnNwb3J0IGZhY3RvcnkgaXMgbm90IGEKKyAgICAvLyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeQorICAgIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KiBmcmFtZWRGYWN0b3J5CisgICAgICAgID0gZHluYW1pY19jYXN0PFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Kj4odHJhbnNwb3J0RmFjdG9yeS5nZXQoKSk7CisgICAgaWYgKGZyYW1lZEZhY3RvcnkgPT0gTlVMTCkgeworICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyIG11c3QgdXNlIFRGcmFtZWRUcmFuc3BvcnQiKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nU2VydmVyU29ja2V0PiBzb2NrZXQobmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0KSk7CisgICAgLy8gVXNlIGEgTlVMTCBUaHJlYWRNYW5hZ2VyCisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXI7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXI+KAorICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBzb2NrZXQsIHRocmVhZE1hbmFnZXIpKTsKKyAgfQorfTsKKworLyoKKyAqIFRyYWl0cyBjbGFzc2VzIGZvciBjb250cm9sbGluZyBpZiB3ZSBpbnN0YW50aWF0ZSB0ZW1wbGF0ZWQgb3IgZ2VuZXJpYworICogcHJvdG9jb2wgZmFjdG9yaWVzLCBwcm9jZXNzb3JzLCBjbGllbnRzLCBldGMuCisgKgorICogVGhlIGdvYWwgaXMgdG8gYWxsb3cgdGhlIG91dGVyIHRlc3QgY29kZSB0byBzZWxlY3Qgd2hpY2ggc2VydmVyIHR5cGUgaXMKKyAqIGJlaW5nIHRlc3RlZCwgYW5kIHdoZXRoZXIgb3Igbm90IHdlIGFyZSB0ZXN0aW5nIHRoZSB0ZW1wbGF0ZWQgY2xhc3Nlcywgb3IKKyAqIHRoZSBnZW5lcmljIGNsYXNzZXMuCisgKgorICogRWFjaCBzcGVjaWZpYyB0ZXN0IGNhc2UgY2FuIGNvbnRyb2wgd2hldGhlciB3ZSBjcmVhdGUgYSBjaGlsZCBvciBwYXJlbnQKKyAqIHNlcnZlciwgYW5kIHdoZXRoZXIgd2UgdXNlIFRGcmFtZWRUcmFuc3BvcnQgb3IgVEJ1ZmZlcmVkVHJhbnNwb3J0LgorICovCisKK2NsYXNzIFVudGVtcGxhdGVkVHJhaXRzIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IFByb3RvY29sRmFjdG9yeTsKKyAgdHlwZWRlZiBUQmluYXJ5UHJvdG9jb2wgUHJvdG9jb2w7CisKKyAgdHlwZWRlZiBQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yIFBhcmVudFByb2Nlc3NvcjsKKyAgdHlwZWRlZiBDaGlsZFNlcnZpY2VQcm9jZXNzb3IgQ2hpbGRQcm9jZXNzb3I7CisgIHR5cGVkZWYgUGFyZW50U2VydmljZUNsaWVudCBQYXJlbnRDbGllbnQ7CisgIHR5cGVkZWYgQ2hpbGRTZXJ2aWNlQ2xpZW50IENoaWxkQ2xpZW50OworfTsKKworY2xhc3MgVGVtcGxhdGVkVHJhaXRzIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5VDxUQnVmZmVyQmFzZT4gUHJvdG9jb2xGYWN0b3J5OworICB0eXBlZGVmIFRCaW5hcnlQcm90b2NvbFQ8VEJ1ZmZlckJhc2U+IFByb3RvY29sOworCisgIHR5cGVkZWYgUGFyZW50U2VydmljZVByb2Nlc3NvclQ8UHJvdG9jb2w+IFBhcmVudFByb2Nlc3NvcjsKKyAgdHlwZWRlZiBDaGlsZFNlcnZpY2VQcm9jZXNzb3JUPFByb3RvY29sPiBDaGlsZFByb2Nlc3NvcjsKKyAgdHlwZWRlZiBQYXJlbnRTZXJ2aWNlQ2xpZW50VDxQcm90b2NvbD4gUGFyZW50Q2xpZW50OworICB0eXBlZGVmIENoaWxkU2VydmljZUNsaWVudFQ8UHJvdG9jb2w+IENoaWxkQ2xpZW50OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzXz4KK2NsYXNzIFBhcmVudFNlcnZpY2VUcmFpdHMgeworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzXzo6UGFyZW50UHJvY2Vzc29yIFByb2Nlc3NvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0c186OlBhcmVudENsaWVudCBDbGllbnQ7CisgIHR5cGVkZWYgUGFyZW50SGFuZGxlciBIYW5kbGVyOworCisgIHR5cGVkZWYgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHNfOjpQcm90b2NvbEZhY3RvcnkgUHJvdG9jb2xGYWN0b3J5OworICB0eXBlZGVmIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzXzo6UHJvdG9jb2wgUHJvdG9jb2w7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGVtcGxhdGVUcmFpdHNfPgorY2xhc3MgQ2hpbGRTZXJ2aWNlVHJhaXRzIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0c186OkNoaWxkUHJvY2Vzc29yIFByb2Nlc3NvcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0c186OkNoaWxkQ2xpZW50IENsaWVudDsKKyAgdHlwZWRlZiBDaGlsZEhhbmRsZXIgSGFuZGxlcjsKKworICB0eXBlZGVmIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzXzo6UHJvdG9jb2xGYWN0b3J5IFByb3RvY29sRmFjdG9yeTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0c186OlByb3RvY29sIFByb3RvY29sOworfTsKKworLy8gVE9ETzogSXQgd291bGQgYmUgbmljZXIgaWYgdGhlIFRUcmFuc3BvcnRGYWN0b3J5IHR5cGVzIGRlZmluZWQgYSB0eXBlZGVmLAorLy8gdG8gYWxsb3cgdXMgdG8gZmlndXJlIG91dCB0aGUgZXhhY3QgdHJhbnNwb3J0IHR5cGUgd2l0aG91dCBoYXZpbmcgdG8gcGFzcyBpdAorLy8gaW4gYXMgYSBzZXBhcmF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaGVyZS4KKy8vCisvLyBJdCB3b3VsZCBhbHNvIGJlIG5pZWMgaWYgdGhleSB1c2VkIGNvdmFyaWFudCByZXR1cm4gdHlwZXMuICBVbmZvcnR1bmF0ZWx5LAorLy8gc2luY2UgdGhleSByZXR1cm4gc2hhcmVkX3B0ciBpbnN0ZWFkIG9mIHJhdyBwb2ludGVycywgY292YXJpYW50IHJldHVybiB0eXBlcworLy8gd29uJ3Qgd29yay4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHNfLAorICAgICAgICAgIHR5cGVuYW1lIFNlcnZpY2VUcmFpdHNfLAorICAgICAgICAgIHR5cGVuYW1lIFRyYW5zcG9ydEZhY3RvcnlfID0gVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgdHlwZW5hbWUgVHJhbnNwb3J0XyA9IFRGcmFtZWRUcmFuc3BvcnQ+CitjbGFzcyBTZXJ2aWNlU3RhdGUgOiBwdWJsaWMgU2VydmVyU3RhdGUgeworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIFNlcnZpY2VUcmFpdHNfOjpQcm9jZXNzb3IgUHJvY2Vzc29yOworICB0eXBlZGVmIHR5cGVuYW1lIFNlcnZpY2VUcmFpdHNfOjpDbGllbnQgQ2xpZW50OworICB0eXBlZGVmIHR5cGVuYW1lIFNlcnZpY2VUcmFpdHNfOjpIYW5kbGVyIEhhbmRsZXI7CisKKyAgU2VydmljZVN0YXRlKCkKKyAgICA6IHBvcnRfKDApLAorICAgICAgbG9nXyhuZXcgRXZlbnRMb2cpLAorICAgICAgaGFuZGxlcl8obmV3IEhhbmRsZXIobG9nXykpLAorICAgICAgcHJvY2Vzc29yXyhuZXcgUHJvY2Vzc29yKGhhbmRsZXJfKSksCisgICAgICB0cmFuc3BvcnRGYWN0b3J5XyhuZXcgVHJhbnNwb3J0RmFjdG9yeV8pLAorICAgICAgcHJvdG9jb2xGYWN0b3J5XyhuZXcgdHlwZW5hbWUgU2VydmljZVRyYWl0c186OlByb3RvY29sRmFjdG9yeSksCisgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXJfKG5ldyBTZXJ2ZXJFdmVudEhhbmRsZXIobG9nXykpLAorICAgICAgcHJvY2Vzc29yRXZlbnRIYW5kbGVyXyhuZXcgUHJvY2Vzc29yRXZlbnRIYW5kbGVyKGxvZ18pKSB7CisgICAgcHJvY2Vzc29yXy0+c2V0RXZlbnRIYW5kbGVyKHByb2Nlc3NvckV2ZW50SGFuZGxlcl8pOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXI+IGNyZWF0ZVNlcnZlcih1aW50MTZfdCBwb3J0KSB7CisgICAgU2VydmVyVHJhaXRzXyBzZXJ2ZXJUcmFpdHM7CisgICAgcmV0dXJuIHNlcnZlclRyYWl0cy5jcmVhdGVTZXJ2ZXIocHJvY2Vzc29yXywgcG9ydCwgdHJhbnNwb3J0RmFjdG9yeV8sIHByb3RvY29sRmFjdG9yeV8pOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGdldFNlcnZlckV2ZW50SGFuZGxlcigpIHsgcmV0dXJuIHNlcnZlckV2ZW50SGFuZGxlcl87IH0KKworICB2b2lkIGJpbmRTdWNjZXNzZnVsKHVpbnQxNl90IHBvcnQpIHsgcG9ydF8gPSBwb3J0OyB9CisKKyAgdWludDE2X3QgZ2V0UG9ydCgpIGNvbnN0IHsgcmV0dXJuIHBvcnRfOyB9CisKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgZ2V0TG9nKCkgY29uc3QgeyByZXR1cm4gbG9nXzsgfQorCisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyPiYgZ2V0SGFuZGxlcigpIGNvbnN0IHsgcmV0dXJuIGhhbmRsZXJfOyB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPENsaWVudD4gY3JlYXRlQ2xpZW50KCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgU2VydmljZVRyYWl0c186OlByb3RvY29sIFByb3RvY29sOworCisgICAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgcG9ydF8pKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gdHJhbnNwb3J0KG5ldyBUcmFuc3BvcnRfKHNvY2tldCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxQcm90b2NvbD4gcHJvdG9jb2wobmV3IFByb3RvY29sKHRyYW5zcG9ydCkpOworICAgIHRyYW5zcG9ydC0+b3BlbigpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPENsaWVudD4gY2xpZW50KG5ldyBDbGllbnQocHJvdG9jb2wpKTsKKyAgICByZXR1cm4gY2xpZW50OworICB9CisKK3ByaXZhdGU6CisgIHVpbnQxNl90IHBvcnRfOworICBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+IGxvZ187CisgIHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyPiBoYW5kbGVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gcHJvY2Vzc29yRXZlbnRIYW5kbGVyXzsKK307CisKKy8qKgorICogQ2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBldmVudHMgaW4gdGhlIGxvZworICovCit2b2lkIGNoZWNrTm9FdmVudHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKSB7CisgIC8vIFdhaXQgZm9yIGFuIGV2ZW50IHdpdGggYSB2ZXJ5IHNob3J0IHRpbWVvdXQgcGVyaW9kLiAgV2UgZG9uJ3QgZXhwZWN0CisgIC8vIGFueXRoaW5nIHRvIGJlIHByZXNlbnQsIHNvIHdlIHdpbGwgbm9ybWFsbHkgd2FpdCBmb3IgdGhlIGZ1bGwgdGltZW91dC4KKyAgLy8gT24gdGhlIG90aGVyIGhhbmQsIGEgbm9uLXplcm8gdGltZW91dCBpcyBuaWNlIHNpbmNlIGl0IGRvZXMgZ2l2ZSBhIHNob3J0CisgIC8vIHdpbmRvdyBmb3IgZXZlbnRzIHRvIGFycml2ZSBpbiBjYXNlIHRoZXJlIGlzIGEgcHJvYmxlbS4KKyAgRXZlbnQgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgxMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9MT0dfRU5ELCBldmVudC50eXBlKTsKK30KKworLyoqCisgKiBDaGVjayBmb3IgdGhlIGV2ZW50cyB0aGF0IHNob3VsZCBiZSBsb2dnZWQgd2hlbiBhIG5ldyBjb25uZWN0aW9uIGlzIGNyZWF0ZWQuCisgKgorICogUmV0dXJucyB0aGUgY29ubmVjdGlvbiBJRCBhbGxvY2F0ZWQgYnkgdGhlIHNlcnZlci4KKyAqLwordWludDMyX3QgY2hlY2tOZXdDb25uRXZlbnRzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgeworICAvLyBDaGVjayBmb3IgYW4gRVRfQ09OTl9DUkVBVEVEIGV2ZW50CisgIEV2ZW50IGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoMjUwMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9DT05OX0NSRUFURUQsIGV2ZW50LnR5cGUpOworCisgIC8vIFNvbWUgc2VydmVycyBjYWxsIHRoZSBwcm9jZXNzQ29udGV4dCgpIGhvb2sgaW1tZWRpYXRlbHkuCisgIC8vIE90aGVycyAoVE5vbmJsb2NraW5nU2VydmVyKSBvbmx5IGNhbGwgaXQgb25jZSBhIGZ1bGwgcmVxdWVzdCBpcyByZWNlaXZlZC4KKyAgLy8gV2UgZG9uJ3QgY2hlY2sgZm9yIGl0IHlldCwgdG8gYWxsb3cgZWl0aGVyIGJlaGF2aW9yLgorCisgIHJldHVybiBldmVudC5jb25uZWN0aW9uSWQ7Cit9CisKKy8qKgorICogQ2hlY2sgZm9yIHRoZSBldmVudHMgdGhhdCBzaG91bGQgYmUgbG9nZ2VkIHdoZW4gYSBjb25uZWN0aW9uIGlzIGNsb3NlZC4KKyAqLwordm9pZCBjaGVja0Nsb3NlRXZlbnRzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZywgdWludDMyX3QgY29ubklkKSB7CisgIC8vIENoZWNrIGZvciBhbiBFVF9DT05OX0RFU1RST1lFRCBldmVudAorICBFdmVudCBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9DT05OX0RFU1RST1lFRCwgZXZlbnQudHlwZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvbm5JZCwgZXZlbnQuY29ubmVjdGlvbklkKTsKKworICAvLyBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG1vcmUgZXZlbnRzCisgIGNoZWNrTm9FdmVudHMobG9nKTsKK30KKworLyoqCisgKiBDaGVjayBmb3IgdGhlIGV2ZW50cyB0aGF0IHNob3VsZCBiZSBsb2dnZWQgd2hlbiBhIGNhbGwgaXMgcmVjZWl2ZWQKKyAqIGFuZCB0aGUgaGFuZGxlciBpcyBpbnZva2VkLgorICoKKyAqIEl0IGRvZXMgbm90IGNoZWNrIGZvciBhbnl0aGluZyBhZnRlciB0aGUgaGFuZGxlciBpbnZvY2F0aW9uLgorICoKKyAqIFJldHVybnMgdGhlIGNhbGwgSUQgYWxsb2NhdGVkIGJ5IHRoZSBzZXJ2ZXIuCisgKi8KK3VpbnQzMl90IGNoZWNrQ2FsbEhhbmRsZXJFdmVudHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb25uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VHlwZSBjYWxsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjYWxsTmFtZSkgeworICAvLyBDYWxsIHN0YXJ0ZWQKKyAgRXZlbnQgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfQ0FMTF9TVEFSVEVELCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsTmFtZSwgZXZlbnQubWVzc2FnZSk7CisgIHVpbnQzMl90IGNhbGxJZCA9IGV2ZW50LmNhbGxJZDsKKworICAvLyBQcmUtcmVhZAorICBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9QUkVfUkVBRCwgZXZlbnQudHlwZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvbm5JZCwgZXZlbnQuY29ubmVjdGlvbklkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbElkLCBldmVudC5jYWxsSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsTmFtZSwgZXZlbnQubWVzc2FnZSk7CisKKyAgLy8gUG9zdC1yZWFkCisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX1BPU1RfUkVBRCwgZXZlbnQudHlwZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvbm5JZCwgZXZlbnQuY29ubmVjdGlvbklkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbElkLCBldmVudC5jYWxsSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsTmFtZSwgZXZlbnQubWVzc2FnZSk7CisKKyAgLy8gSGFuZGxlciBpbnZvY2F0aW9uCisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbFR5cGUsIGV2ZW50LnR5cGUpOworICAvLyBUaGUgaGFuZGxlciBkb2Vzbid0IGhhdmUgYW55IGNvbm5lY3Rpb24gb3IgY2FsbCBjb250ZXh0LAorICAvLyBzbyB0aGUgY29ubmVjdGlvbklkIGFuZCBjYWxsSWQgaW4gdGhpcyBldmVudCBhcmVuJ3QgdmFsaWQKKworICByZXR1cm4gY2FsbElkOworfQorCisvKioKKyAqIENoZWNrIGZvciB0aGUgZXZlbnRzIHRoYXQgc2hvdWxkIGJlIGFmdGVyIGEgaGFuZGxlciByZXR1cm5zLgorICovCit2b2lkIGNoZWNrQ2FsbFBvc3RIYW5kbGVyRXZlbnRzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29ubklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjYWxsSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY2FsbE5hbWUpIHsKKyAgLy8gUHJlLXdyaXRlCisgIEV2ZW50IGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX1BSRV9XUklURSwgZXZlbnQudHlwZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvbm5JZCwgZXZlbnQuY29ubmVjdGlvbklkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbElkLCBldmVudC5jYWxsSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsTmFtZSwgZXZlbnQubWVzc2FnZSk7CisKKyAgLy8gUG9zdC13cml0ZQorICBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9QT1NUX1dSSVRFLCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsSWQsIGV2ZW50LmNhbGxJZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxOYW1lLCBldmVudC5tZXNzYWdlKTsKKworICAvLyBDYWxsIGZpbmlzaGVkCisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX0NBTExfRklOSVNIRUQsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxJZCwgZXZlbnQuY2FsbElkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbE5hbWUsIGV2ZW50Lm1lc3NhZ2UpOworCisgIC8vIEl0IGlzIGFjY2VwdGFibGUgZm9yIHNlcnZlcnMgdG8gY2FsbCBwcm9jZXNzQ29udGV4dCgpIGFnYWluIGltbWVkaWF0ZWx5CisgIC8vIHRvIHN0YXJ0IHdhaXRpbmcgb24gdGhlIG5leHQgcmVxdWVzdC4gIEhvd2V2ZXIsIHNvbWUgc2VydmVycyB3YWl0IGJlZm9yZQorICAvLyBnZXR0aW5nIGVpdGhlciBhIHBhcnRpYWwgcmVxdWVzdCBvciB0aGUgZnVsbCByZXF1ZXN0IGJlZm9yZSBjYWxsaW5nCisgIC8vIHByb2Nlc3NDb250ZXh0KCkuICBXZSBkb24ndCBjaGVjayBmb3IgdGhlIG5leHQgY2FsbCB0byBwcm9jZXNzQ29udGV4dCgpCisgIC8vIHlldC4KK30KKworLyoqCisgKiBDaGVjayBmb3IgdGhlIGV2ZW50cyB0aGF0IHNob3VsZCBiZSBsb2dnZWQgd2hlbiBhIGNhbGwgaXMgbWFkZS4KKyAqCisgKiBUaGlzIGp1c3QgY2FsbHMgY2hlY2tDYWxsSGFuZGxlckV2ZW50cygpIGZvbGxvd2VkIGJ5CisgKiBjaGVja0NhbGxQb3N0SGFuZGxlckV2ZW50cygpLgorICoKKyAqIFJldHVybnMgdGhlIGNhbGwgSUQgYWxsb2NhdGVkIGJ5IHRoZSBzZXJ2ZXIuCisgKi8KK3VpbnQzMl90IGNoZWNrQ2FsbEV2ZW50cyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29ubklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VHlwZSBjYWxsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNhbGxOYW1lKSB7CisgIHVpbnQzMl90IGNhbGxJZCA9IGNoZWNrQ2FsbEhhbmRsZXJFdmVudHMobG9nLCBjb25uSWQsIGNhbGxUeXBlLCBjYWxsTmFtZSk7CisgIGNoZWNrQ2FsbFBvc3RIYW5kbGVyRXZlbnRzKGxvZywgY29ubklkLCBjYWxsSWQsIGNhbGxOYW1lKTsKKworICByZXR1cm4gY2FsbElkOworfQorCisvKgorICogVGVzdCBmdW5jdGlvbnMKKyAqLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RhdGVfPgordm9pZCB0ZXN0UGFyZW50U2VydmljZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U3RhdGVfPiYgc3RhdGUpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlXzo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CisKKyAgaW50MzJfdCBnZW4gPSBjbGllbnQtPmdldEdlbmVyYXRpb24oKTsKKyAgaW50MzJfdCBuZXdHZW4gPSBjbGllbnQtPmluY3JlbWVudEdlbmVyYXRpb24oKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ2VuICsgMSwgbmV3R2VuKTsKKyAgbmV3R2VuID0gY2xpZW50LT5nZXRHZW5lcmF0aW9uKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGdlbiArIDEsIG5ld0dlbik7CisKKyAgY2xpZW50LT5hZGRTdHJpbmcoImZvbyIpOworICBjbGllbnQtPmFkZFN0cmluZygiYmFyIik7CisgIGNsaWVudC0+YWRkU3RyaW5nKCJhc2RmIik7CisKKyAgdmVjdG9yPHN0cmluZz4gc3RyaW5nczsKKyAgY2xpZW50LT5nZXRTdHJpbmdzKHN0cmluZ3MpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKDMsIHN0cmluZ3Muc2l6ZSgpKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTCgiZm9vIiwgc3RyaW5nc1swXSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoImJhciIsIHN0cmluZ3NbMV0pOworICBCT09TVF9SRVFVSVJFX0VRVUFMKCJhc2RmIiwgc3RyaW5nc1syXSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTdGF0ZV8+Cit2b2lkIHRlc3RDaGlsZFNlcnZpY2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFN0YXRlXz4mIHN0YXRlKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZV86OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOworCisgIC8vIFRlc3QgY2FsbGluZyBzb21lIG9mIHRoZSBwYXJlbnQgbWV0aGlkcyB2aWEgdGhlIGEgY2hpbGQgY2xpZW50CisgIGludDMyX3QgZ2VuID0gY2xpZW50LT5nZXRHZW5lcmF0aW9uKCk7CisgIGludDMyX3QgbmV3R2VuID0gY2xpZW50LT5pbmNyZW1lbnRHZW5lcmF0aW9uKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGdlbiArIDEsIG5ld0dlbik7CisgIG5ld0dlbiA9IGNsaWVudC0+Z2V0R2VuZXJhdGlvbigpOworICBCT09TVF9DSEVDS19FUVVBTChnZW4gKyAxLCBuZXdHZW4pOworCisgIC8vIFRlc3Qgc29tZSBvZiB0aGUgY2hpbGQgbWV0aG9kcworICBjbGllbnQtPnNldFZhbHVlKDEwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMTAsIGNsaWVudC0+Z2V0VmFsdWUoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDEwLCBjbGllbnQtPnNldFZhbHVlKDk5KSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDk5LCBjbGllbnQtPmdldFZhbHVlKCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VydmVyVHJhaXRzLCB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0cz4KK3ZvaWQgdGVzdEJhc2ljU2VydmljZSgpIHsKKyAgdHlwZWRlZiBTZXJ2aWNlU3RhdGU8U2VydmVyVHJhaXRzLCBQYXJlbnRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiA+IFN0YXRlOworCisgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIKKyAgc3RkOjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOworICBTZXJ2ZXJUaHJlYWQgc2VydmVyVGhyZWFkKHN0YXRlLCB0cnVlKTsKKworICB0ZXN0UGFyZW50U2VydmljZShzdGF0ZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHMsIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzPgordm9pZCB0ZXN0SW5oZXJpdGVkU2VydmljZSgpIHsKKyAgdHlwZWRlZiBTZXJ2aWNlU3RhdGU8U2VydmVyVHJhaXRzLCBDaGlsZFNlcnZpY2VUcmFpdHM8VGVtcGxhdGVUcmFpdHM+ID4gU3RhdGU7CisKKyAgLy8gU3RhcnQgdGhlIHNlcnZlcgorICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOworCisgIHRlc3RQYXJlbnRTZXJ2aWNlKHN0YXRlKTsKKyAgdGVzdENoaWxkU2VydmljZShzdGF0ZSk7Cit9CisKKy8qKgorICogVGVzdCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgVFNlcnZlckV2ZW50SGFuZGxlciBhbmQgVFByb2Nlc3NvckV2ZW50SGFuZGxlcgorICogbWV0aG9kcyBhcmUgaW52b2tlZCBpbiB0aGUgY29ycmVjdCBvcmRlciB3aXRoIHRoZSBhY3R1YWwgZXZlbnRzLgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VydmVyVHJhaXRzLCB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0cz4KK3ZvaWQgdGVzdEV2ZW50U2VxdWVuY2luZygpIHsKKyAgLy8gV2UgdXNlIFRCdWZmZXJlZFRyYW5zcG9ydCBmb3IgdGhpcyB0ZXN0LCBpbnN0ZWFkIG9mIFRGcmFtZWRUcmFuc3BvcnQuCisgIC8vIFRoaXMgd2F5IHRoZSBzZXJ2ZXIgd2lsbCBzdGFydCBwcm9jZXNzaW5nIGRhdGEgYXMgc29vbiBhcyBpdCBpcyByZWNlaXZlZCwKKyAgLy8gaW5zdGVhZCBvZiB3YWl0aW5nIGZvciB0aGUgZnVsbCByZXF1ZXN0LiAgVGhpcyBpcyBuZWNlc3Nhcnkgc28gd2UgY2FuCisgIC8vIHNlcGFyYXRlIHRoZSBwcmVSZWFkKCkgYW5kIHBvc3RSZWFkKCkgZXZlbnRzLgorICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsCisgICAgICAgICAgICAgICAgICAgICAgIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4sCisgICAgICAgICAgICAgICAgICAgICAgIFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgIFRCdWZmZXJlZFRyYW5zcG9ydD4gU3RhdGU7CisKKyAgLy8gU3RhcnQgdGhlIHNlcnZlcgorICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOworCisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZyA9IHN0YXRlLT5nZXRMb2coKTsKKworICAvLyBNYWtlIHN1cmUgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgbG9nCisgIGNoZWNrTm9FdmVudHMobG9nKTsKKworICBzdGF0ZS0+Z2V0SGFuZGxlcigpLT5wcmVwYXJlVHJpZ2dlcmVkQ2FsbCgpOworCisgIC8vIE1ha2Ugc3VyZSBjcmVhdGVDb250ZXh0KCkgaXMgY2FsbGVkIGFmdGVyIGEgY29ubmVjdGlvbiBoYXMgYmVlbgorICAvLyBlc3RhYmxpc2hlZC4gIFdlIG9wZW4gYSBwbGFpbiBzb2NrZXQgaW5zdGVhZCBvZiBjcmVhdGluZyBhIGNsaWVudC4KKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgc3RhdGUtPmdldFBvcnQoKSkpOworICBzb2NrZXQtPm9wZW4oKTsKKworICAvLyBNYWtlIHN1cmUgdGhlIHByb3BlciBldmVudHMgb2NjdXJyZWQgYWZ0ZXIgYSBuZXcgY29ubmVjdGlvbgorICB1aW50MzJfdCBjb25uSWQgPSBjaGVja05ld0Nvbm5FdmVudHMobG9nKTsKKworICAvLyBTZW5kIGEgbWVzc2FnZSBoZWFkZXIuICBXZSBtYW51YWxseSBjb25zdHJ1Y3QgdGhlIHJlcXVlc3Qgc28gdGhhdCB3ZQorICAvLyBjYW4gdGVzdCB0aGUgdGltaW5nIGZvciB0aGUgcHJlUmVhZCgpIGNhbGwuCisgIHN0cmluZyByZXF1ZXN0TmFtZSA9ICJnZXREYXRhV2FpdCI7CisgIHN0cmluZyBldmVudE5hbWUgPSAiUGFyZW50U2VydmljZS5nZXREYXRhV2FpdCI7CisgIGludDMyX3Qgc2VxaWQgPSBpbnQzMl90KHRpbWUoTlVMTCkpOworICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2woc29ja2V0KTsKKyAgcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4ocmVxdWVzdE5hbWUsIFRfQ0FMTCwgc2VxaWQpOworICBzb2NrZXQtPmZsdXNoKCk7CisKKyAgLy8gTWFrZSBzdXJlIHdlIHNhdyB0aGUgY2FsbCBzdGFydGVkIGFuZCBwcmUtcmVhZCBldmVudHMKKyAgRXZlbnQgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfQ0FMTF9TVEFSVEVELCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXZlbnROYW1lLCBldmVudC5tZXNzYWdlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICB1aW50MzJfdCBjYWxsSWQgPSBldmVudC5jYWxsSWQ7CisKKyAgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfUFJFX1JFQUQsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChldmVudE5hbWUsIGV2ZW50Lm1lc3NhZ2UpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxJZCwgZXZlbnQuY2FsbElkKTsKKworICAvLyBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG5ldyBldmVudHMKKyAgY2hlY2tOb0V2ZW50cyhsb2cpOworCisgIC8vIFNlbmQgdGhlIHJlc3Qgb2YgdGhlIHJlcXVlc3QKKyAgcHJvdG9jb2wud3JpdGVTdHJ1Y3RCZWdpbigiUGFyZW50U2VydmljZV9nZXREYXRhTm90aWZpZWRfcGFyZ3MiKTsKKyAgcHJvdG9jb2wud3JpdGVGaWVsZEJlZ2luKCJsZW5ndGgiLCBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTMyLCAxKTsKKyAgcHJvdG9jb2wud3JpdGVJMzIoOCAqIDEwMjQgKiAxMDI0KTsKKyAgcHJvdG9jb2wud3JpdGVGaWVsZEVuZCgpOworICBwcm90b2NvbC53cml0ZUZpZWxkU3RvcCgpOworICBwcm90b2NvbC53cml0ZVN0cnVjdEVuZCgpOworICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgc29ja2V0LT53cml0ZUVuZCgpOworICBzb2NrZXQtPmZsdXNoKCk7CisKKyAgLy8gV2Ugc2hvdWxkIHRoZW4gc2VlIHBvc3RSZWFkKCkKKyAgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfUE9TVF9SRUFELCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXZlbnROYW1lLCBldmVudC5tZXNzYWdlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsSWQsIGV2ZW50LmNhbGxJZCk7CisKKyAgLy8gVGhlbiB0aGUgaGFuZGxlciBzaG91bGQgYmUgaW52b2tlZAorICBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9DQUxMX0dFVF9EQVRBX1dBSVQsIGV2ZW50LnR5cGUpOworCisgIC8vIFRoZSBoYW5kbGVyIHdvbid0IHJlc3BvbmQgdW50aWwgd2Ugbm90aWZ5IGl0LgorICAvLyBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG1vcmUgZXZlbnRzLgorICBjaGVja05vRXZlbnRzKGxvZyk7CisKKyAgLy8gTm90aWZ5IHRoZSBoYW5kbGVyIHRoYXQgaXQgc2hvdWxkIHJldHVybgorICAvLyBXZSBqdXN0IHVzZSBhIGdsb2JhbCBsb2NrIGZvciBub3csIHNpbmNlIGl0IGlzIGVhc2llc3QKKyAgc3RhdGUtPmdldEhhbmRsZXIoKS0+dHJpZ2dlclBlbmRpbmdDYWxscygpOworCisgIC8vIFRoZSBoYW5kbGVyIHdpbGwgbG9nIGEgc2VwYXJhdGUgZXZlbnQgYmVmb3JlIGl0IHJldHVybnMKKyAgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfV0FJVF9SRVRVUk4sIGV2ZW50LnR5cGUpOworCisgIC8vIFdlIHNob3VsZCB0aGVuIHNlZSBwcmVXcml0ZSgpCisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX1BSRV9XUklURSwgZXZlbnQudHlwZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGV2ZW50TmFtZSwgZXZlbnQubWVzc2FnZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvbm5JZCwgZXZlbnQuY29ubmVjdGlvbklkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbElkLCBldmVudC5jYWxsSWQpOworCisgIC8vIFdlIHJlcXVlc3RlZCBtb3JlIGRhdGEgdGhhbiBjYW4gYmUgYnVmZmVyZWQsIGFuZCB3ZSBhcmVuJ3QgcmVhZGluZyBpdCwKKyAgLy8gc28gdGhlIHNlcnZlciBzaG91bGRuJ3QgYmUgYWJsZSB0byBmaW5pc2ggaXRzIHdyaXRlIHlldC4KKyAgLy8gTWFrZSBzdXJlIHRoZXJlIGFyZSBubyBtb3JlIGV2ZW50cy4KKyAgY2hlY2tOb0V2ZW50cyhsb2cpOworCisgIC8vIFJlYWQgdGhlIHJlc3BvbnNlIGhlYWRlcgorICBzdHJpbmcgcmVzcG9uc2VOYW1lOworICBpbnQzMl90IHJlc3BvbnNlU2VxaWQgPSAwOworICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSByZXNwb25zZVR5cGU7CisgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4ocmVzcG9uc2VOYW1lLCByZXNwb25zZVR5cGUsIHJlc3BvbnNlU2VxaWQpOworICBCT09TVF9DSEVDS19FUVVBTChyZXNwb25zZVNlcWlkLCBzZXFpZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHJlcXVlc3ROYW1lLCByZXNwb25zZU5hbWUpOworICBCT09TVF9DSEVDS19FUVVBTChyZXNwb25zZVR5cGUsIFRfUkVQTFkpOworICAvLyBSZWFkIHRoZSBib2R5LiAgV2UganVzdCBpZ25vcmUgaXQgZm9yIG5vdy4KKyAgcHJvdG9jb2wuc2tpcChUX1NUUlVDVCk7CisKKyAgLy8gTm93IHRoYXQgd2UgaGF2ZSByZWFkLCB0aGUgc2VydmVyIHNob3VsZCBoYXZlIGZpbmlzaGVkIHNlbmRpbmcgdGhlIGRhdGEKKyAgLy8gYW5kIGNhbGxlZCB0aGUgcG9zdFdyaXRlKCkgaGFuZGxlcgorICBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9QT1NUX1dSSVRFLCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXZlbnROYW1lLCBldmVudC5tZXNzYWdlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsSWQsIGV2ZW50LmNhbGxJZCk7CisKKyAgLy8gQ2FsbCBmaW5pc2hlZCBzaG91bGQgYmUgbGFzdAorICBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9DQUxMX0ZJTklTSEVELCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXZlbnROYW1lLCBldmVudC5tZXNzYWdlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsSWQsIGV2ZW50LmNhbGxJZCk7CisKKyAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIG1vcmUgZXZlbnRzCisgIGNoZWNrTm9FdmVudHMobG9nKTsKKworICAvLyBDbG9zZSB0aGUgY29ubmVjdGlvbiwgYW5kIG1ha2Ugc3VyZSB3ZSBnZXQgYSBjb25uZWN0aW9uIGRlc3Ryb3llZCBldmVudAorICBzb2NrZXQtPmNsb3NlKCk7CisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX0NPTk5fREVTVFJPWUVELCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworCisgIC8vIFRoZXJlIHNob3VsZCBiZSBubyBtb3JlIGV2ZW50cworICBjaGVja05vRXZlbnRzKGxvZyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHMsIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzPgordm9pZCB0ZXN0U2VwYXJhdGVDb25uZWN0aW9ucygpIHsKKyAgdHlwZWRlZiBTZXJ2aWNlU3RhdGU8U2VydmVyVHJhaXRzLCBDaGlsZFNlcnZpY2VUcmFpdHM8VGVtcGxhdGVUcmFpdHM+ID4gU3RhdGU7CisKKyAgLy8gU3RhcnQgdGhlIHNlcnZlcgorICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOworCisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZyA9IHN0YXRlLT5nZXRMb2coKTsKKworICAvLyBDcmVhdGUgYSBjbGllbnQKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudDEgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CisKKyAgLy8gTWFrZSBzdXJlIHRoZSBleHBlY3RlZCBldmVudHMgd2VyZSBsb2dnZWQKKyAgdWludDMyX3QgY2xpZW50MUlkID0gY2hlY2tOZXdDb25uRXZlbnRzKGxvZyk7CisKKyAgLy8gQ3JlYXRlIGEgc2Vjb25kIGNsaWVudAorICBzdGQ6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50MiA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKKworICAvLyBNYWtlIHN1cmUgdGhlIGV4cGVjdGVkIGV2ZW50cyB3ZXJlIGxvZ2dlZAorICB1aW50MzJfdCBjbGllbnQySWQgPSBjaGVja05ld0Nvbm5FdmVudHMobG9nKTsKKworICAvLyBUaGUgdHdvIGNvbm5lY3Rpb25zIHNob3VsZCBoYXZlIGRpZmZlcmVudCBJRHMKKyAgQk9PU1RfQ0hFQ0tfTkUoY2xpZW50MUlkLCBjbGllbnQySWQpOworCisgIC8vIE1ha2UgYSBjYWxsLCBhbmQgY2hlY2sgZm9yIHRoZSBwcm9wZXIgZXZlbnRzCisgIGludDMyX3QgdmFsdWUgPSA1OworICBjbGllbnQxLT5zZXRWYWx1ZSh2YWx1ZSk7CisgIHVpbnQzMl90IGNhbGwxCisgICAgICA9IGNoZWNrQ2FsbEV2ZW50cyhsb2csIGNsaWVudDFJZCwgRXZlbnRMb2c6OkVUX0NBTExfU0VUX1ZBTFVFLCAiQ2hpbGRTZXJ2aWNlLnNldFZhbHVlIik7CisKKyAgLy8gTWFrZSBhIGNhbGwgd2l0aCBjbGllbnQyCisgIGludDMyX3QgdiA9IGNsaWVudDItPmdldFZhbHVlKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHZhbHVlLCB2KTsKKyAgY2hlY2tDYWxsRXZlbnRzKGxvZywgY2xpZW50MklkLCBFdmVudExvZzo6RVRfQ0FMTF9HRVRfVkFMVUUsICJDaGlsZFNlcnZpY2UuZ2V0VmFsdWUiKTsKKworICAvLyBNYWtlIGFub3RoZXIgY2FsbCB3aXRoIGNsaWVudDEKKyAgdiA9IGNsaWVudDEtPmdldFZhbHVlKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHZhbHVlLCB2KTsKKyAgdWludDMyX3QgY2FsbDIKKyAgICAgID0gY2hlY2tDYWxsRXZlbnRzKGxvZywgY2xpZW50MUlkLCBFdmVudExvZzo6RVRfQ0FMTF9HRVRfVkFMVUUsICJDaGlsZFNlcnZpY2UuZ2V0VmFsdWUiKTsKKyAgQk9PU1RfQ0hFQ0tfTkUoY2FsbDEsIGNhbGwyKTsKKworICAvLyBDbG9zZSB0aGUgc2Vjb25kIGNsaWVudCwgYW5kIGNoZWNrIGZvciB0aGUgYXBwcm9wcmlhdGUgZXZlbnRzCisgIGNsaWVudDIucmVzZXQoKTsKKyAgY2hlY2tDbG9zZUV2ZW50cyhsb2csIGNsaWVudDJJZCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHMsIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzPgordm9pZCB0ZXN0T25ld2F5Q2FsbCgpIHsKKyAgdHlwZWRlZiBTZXJ2aWNlU3RhdGU8U2VydmVyVHJhaXRzLCBDaGlsZFNlcnZpY2VUcmFpdHM8VGVtcGxhdGVUcmFpdHM+ID4gU3RhdGU7CisKKyAgLy8gU3RhcnQgdGhlIHNlcnZlcgorICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOworCisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZyA9IHN0YXRlLT5nZXRMb2coKTsKKworICAvLyBDcmVhdGUgYSBjbGllbnQKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudCA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKKyAgdWludDMyX3QgY29ubklkID0gY2hlY2tOZXdDb25uRXZlbnRzKGxvZyk7CisKKyAgLy8gTWFrZSBhIG9uZXdheSBjYWxsCisgIC8vIEl0IHNob3VsZCByZXR1cm4gaW1tZWRpYXRlbHksIGV2ZW4gdGhvdWdoIHRoZSBzZXJ2ZXIncyBoYW5kbGVyCisgIC8vIHdvbid0IHJldHVybiByaWdodCBhd2F5CisgIHN0YXRlLT5nZXRIYW5kbGVyKCktPnByZXBhcmVUcmlnZ2VyZWRDYWxsKCk7CisgIGNsaWVudC0+b25ld2F5V2FpdCgpOworICBzdHJpbmcgY2FsbE5hbWUgPSAiUGFyZW50U2VydmljZS5vbmV3YXlXYWl0IjsKKyAgdWludDMyX3QgY2FsbElkID0gY2hlY2tDYWxsSGFuZGxlckV2ZW50cyhsb2csIGNvbm5JZCwgRXZlbnRMb2c6OkVUX0NBTExfT05FV0FZX1dBSVQsIGNhbGxOYW1lKTsKKworICAvLyBUaGVyZSBzaG91bGRuJ3QgYmUgYW55IG1vcmUgZXZlbnRzCisgIGNoZWNrTm9FdmVudHMobG9nKTsKKworICAvLyBUcmlnZ2VyIHRoZSBoYW5kbGVyIHRvIHJldHVybgorICBzdGF0ZS0+Z2V0SGFuZGxlcigpLT50cmlnZ2VyUGVuZGluZ0NhbGxzKCk7CisKKyAgLy8gVGhlIGhhbmRsZXIgd2lsbCBsb2cgYW4gRVRfV0FJVF9SRVRVUk4gZXZlbnQgd2hlbiBpdCB3YWtlcyB1cAorICBFdmVudCBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9XQUlUX1JFVFVSTiwgZXZlbnQudHlwZSk7CisKKyAgLy8gTm93IHdlIHNob3VsZCBzZWUgdGhlIGFzeW5jIGNvbXBsZXRlIGV2ZW50LCB0aGVuIGNhbGwgZmluaXNoZWQKKyAgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfQVNZTkNfQ09NUExFVEUsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxJZCwgZXZlbnQuY2FsbElkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbE5hbWUsIGV2ZW50Lm1lc3NhZ2UpOworCisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX0NBTExfRklOSVNIRUQsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxJZCwgZXZlbnQuY2FsbElkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbE5hbWUsIGV2ZW50Lm1lc3NhZ2UpOworCisgIC8vIERlc3Ryb3kgdGhlIGNsaWVudCwgYW5kIGNoZWNrIGZvciBjb25uZWN0aW9uIGNsb3NlZCBldmVudHMKKyAgY2xpZW50LnJlc2V0KCk7CisgIGNoZWNrQ2xvc2VFdmVudHMobG9nLCBjb25uSWQpOworCisgIGNoZWNrTm9FdmVudHMobG9nKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZlclRyYWl0cywgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHM+Cit2b2lkIHRlc3RFeHBlY3RlZEVycm9yKCkgeworICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPiBTdGF0ZTsKKworICAvLyBTdGFydCB0aGUgc2VydmVyCisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKKyAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CisKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOworCisgIC8vIENyZWF0ZSBhIGNsaWVudAorICBzdGQ6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOworICB1aW50MzJfdCBjb25uSWQgPSBjaGVja05ld0Nvbm5FdmVudHMobG9nKTsKKworICAvLyBTZW5kIHRoZSBleGNlcHRpb25XYWl0KCkgY2FsbAorICBzdGF0ZS0+Z2V0SGFuZGxlcigpLT5wcmVwYXJlVHJpZ2dlcmVkQ2FsbCgpOworICBzdHJpbmcgbWVzc2FnZSA9ICJ0ZXN0IDEyMzQgdGVzdCI7CisgIGNsaWVudC0+c2VuZF9leGNlcHRpb25XYWl0KG1lc3NhZ2UpOworICBzdHJpbmcgY2FsbE5hbWUgPSAiUGFyZW50U2VydmljZS5leGNlcHRpb25XYWl0IjsKKyAgdWludDMyX3QgY2FsbElkID0gY2hlY2tDYWxsSGFuZGxlckV2ZW50cyhsb2csIGNvbm5JZCwgRXZlbnRMb2c6OkVUX0NBTExfRVhDRVBUSU9OX1dBSVQsIGNhbGxOYW1lKTsKKworICAvLyBUaGVyZSBzaG91bGRuJ3QgYmUgYW55IG1vcmUgZXZlbnRzCisgIGNoZWNrTm9FdmVudHMobG9nKTsKKworICAvLyBUcmlnZ2VyIHRoZSBoYW5kbGVyIHRvIHJldHVybgorICBzdGF0ZS0+Z2V0SGFuZGxlcigpLT50cmlnZ2VyUGVuZGluZ0NhbGxzKCk7CisKKyAgLy8gVGhlIGhhbmRsZXIgd2lsbCBsb2cgYW4gRVRfV0FJVF9SRVRVUk4gZXZlbnQgd2hlbiBpdCB3YWtlcyB1cAorICBFdmVudCBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9XQUlUX1JFVFVSTiwgZXZlbnQudHlwZSk7CisKKyAgLy8gTm93IHJlY2VpdmUgdGhlIHJlc3BvbnNlCisgIHRyeSB7CisgICAgY2xpZW50LT5yZWN2X2V4Y2VwdGlvbldhaXQoKTsKKyAgICBCT09TVF9GQUlMKCJleHBlY3RlZCBNeUVycm9yIHRvIGJlIHRocm93biIpOworICB9IGNhdGNoIChjb25zdCBNeUVycm9yJiBlKSB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVzc2FnZSwgZS5tZXNzYWdlKTsKKyAgICAvLyBDaGVjayBpZiBzdGQ6OmV4Y2VwdGlvbjo6d2hhdCgpIGlzIGhhbmRsZWQgcHJvcGVybHkKKyAgICBzaXplX3QgbWVzc2FnZV9wb3MgPSBzdHJpbmcoZS53aGF0KCkpLmZpbmQoIlRFeGNlcHRpb24gLSBzZXJ2aWNlIGhhcyB0aHJvd246IE15RXJyb3IiKTsKKyAgICBCT09TVF9DSEVDS19ORShtZXNzYWdlX3Bvcywgc3RyaW5nOjpucG9zKTsKKyAgfQorCisgIC8vIE5vdyB3ZSBzaG91bGQgc2VlIHRoZSBldmVudHMgZm9yIGEgbm9ybWFsIGNhbGwgZmluaXNoCisgIGNoZWNrQ2FsbFBvc3RIYW5kbGVyRXZlbnRzKGxvZywgY29ubklkLCBjYWxsSWQsIGNhbGxOYW1lKTsKKworICAvLyBUaGVyZSBzaG91bGRuJ3QgYmUgYW55IG1vcmUgZXZlbnRzCisgIGNoZWNrTm9FdmVudHMobG9nKTsKKworICAvLyBEZXN0cm95IHRoZSBjbGllbnQsIGFuZCBjaGVjayBmb3IgY29ubmVjdGlvbiBjbG9zZWQgZXZlbnRzCisgIGNsaWVudC5yZXNldCgpOworICBjaGVja0Nsb3NlRXZlbnRzKGxvZywgY29ubklkKTsKKworICBjaGVja05vRXZlbnRzKGxvZyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHMsIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzPgordm9pZCB0ZXN0VW5leHBlY3RlZEVycm9yKCkgeworICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPiBTdGF0ZTsKKworICAvLyBTdGFydCB0aGUgc2VydmVyCisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKKyAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CisKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOworCisgIC8vIENyZWF0ZSBhIGNsaWVudAorICBzdGQ6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOworICB1aW50MzJfdCBjb25uSWQgPSBjaGVja05ld0Nvbm5FdmVudHMobG9nKTsKKworICAvLyBTZW5kIHRoZSB1bmV4cGVjdGVkRXhjZXB0aW9uV2FpdCgpIGNhbGwKKyAgc3RhdGUtPmdldEhhbmRsZXIoKS0+cHJlcGFyZVRyaWdnZXJlZENhbGwoKTsKKyAgc3RyaW5nIG1lc3NhZ2UgPSAiMTIzNCB0ZXN0IDU2NzgiOworICBjbGllbnQtPnNlbmRfdW5leHBlY3RlZEV4Y2VwdGlvbldhaXQobWVzc2FnZSk7CisgIHN0cmluZyBjYWxsTmFtZSA9ICJQYXJlbnRTZXJ2aWNlLnVuZXhwZWN0ZWRFeGNlcHRpb25XYWl0IjsKKyAgdWludDMyX3QgY2FsbElkCisgICAgICA9IGNoZWNrQ2FsbEhhbmRsZXJFdmVudHMobG9nLCBjb25uSWQsIEV2ZW50TG9nOjpFVF9DQUxMX1VORVhQRUNURURfRVhDRVBUSU9OX1dBSVQsIGNhbGxOYW1lKTsKKworICAvLyBUaGVyZSBzaG91bGRuJ3QgYmUgYW55IG1vcmUgZXZlbnRzCisgIGNoZWNrTm9FdmVudHMobG9nKTsKKworICAvLyBUcmlnZ2VyIHRoZSBoYW5kbGVyIHRvIHJldHVybgorICBzdGF0ZS0+Z2V0SGFuZGxlcigpLT50cmlnZ2VyUGVuZGluZ0NhbGxzKCk7CisKKyAgLy8gVGhlIGhhbmRsZXIgd2lsbCBsb2cgYW4gRVRfV0FJVF9SRVRVUk4gZXZlbnQgd2hlbiBpdCB3YWtlcyB1cAorICBFdmVudCBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9XQUlUX1JFVFVSTiwgZXZlbnQudHlwZSk7CisKKyAgLy8gTm93IHJlY2VpdmUgdGhlIHJlc3BvbnNlCisgIHRyeSB7CisgICAgY2xpZW50LT5yZWN2X3VuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KCk7CisgICAgQk9PU1RfRkFJTCgiZXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXJyb3IgdG8gYmUgdGhyb3duIik7CisgIH0gY2F0Y2ggKGNvbnN0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiYpIHsKKyAgfQorCisgIC8vIE5vdyB3ZSBzaG91bGQgc2VlIGEgaGFuZGxlciBlcnJvciBldmVudAorICBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9IQU5ETEVSX0VSUk9SLCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsSWQsIGV2ZW50LmNhbGxJZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxOYW1lLCBldmVudC5tZXNzYWdlKTsKKworICAvLyBwcmUtd3JpdGUgYW5kIHBvc3Qtd3JpdGUgZXZlbnRzIGFyZW4ndCBnZW5lcmF0ZWQgYWZ0ZXIgYSBoYW5kbGVyIGVycm9yCisgIC8vIChFdmVuIGZvciBub24tb25ld2F5IGNhbGxzIHdoZXJlIGEgcmVzcG9uc2UgaXMgd3JpdHRlbi4pCisgIC8vCisgIC8vIEEgY2FsbCBmaW5pc2hlZCBldmVudCBpcyBsb2dnZWQgd2hlbiB0aGUgY2FsbCBjb250ZXh0IGlzIGRlc3Ryb3llZAorICBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9DQUxMX0ZJTklTSEVELCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsSWQsIGV2ZW50LmNhbGxJZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxOYW1lLCBldmVudC5tZXNzYWdlKTsKKworICAvLyBUaGVyZSBzaG91bGRuJ3QgYmUgYW55IG1vcmUgZXZlbnRzCisgIGNoZWNrTm9FdmVudHMobG9nKTsKKworICAvLyBEZXN0cm95IHRoZSBjbGllbnQsIGFuZCBjaGVjayBmb3IgY29ubmVjdGlvbiBjbG9zZWQgZXZlbnRzCisgIGNsaWVudC5yZXNldCgpOworICBjaGVja0Nsb3NlRXZlbnRzKGxvZywgY29ubklkKTsKKworICBjaGVja05vRXZlbnRzKGxvZyk7Cit9CisKKy8vIE1hY3JvIHRvIGRlZmluZSBzaW1wbGUgdGVzdHMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIGFsbCBzZXJ2ZXIgdHlwZXMKKyNkZWZpbmUgREVGSU5FX1NJTVBMRV9URVNUUyhTZXJ2ZXIsIFRlbXBsYXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX2Jhc2ljU2VydmljZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0QmFzaWNTZXJ2aWNlPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX2luaGVyaXRlZFNlcnZpY2UpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0SW5oZXJpdGVkU2VydmljZTxTZXJ2ZXIjI1RyYWl0cywgVGVtcGxhdGUjI1RyYWl0cz4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX29uZXdheSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0T25ld2F5Q2FsbDxTZXJ2ZXIjI1RyYWl0cywgVGVtcGxhdGUjI1RyYWl0cz4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX2V4Y2VwdGlvbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0RXhwZWN0ZWRFcnJvcjxTZXJ2ZXIjI1RyYWl0cywgVGVtcGxhdGUjI1RyYWl0cz4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX3VuZXhwZWN0ZWRFeGNlcHRpb24pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0VW5leHBlY3RlZEVycm9yPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvLyBUZXN0cyB0aGF0IHJlcXVpcmUgdGhlIHNlcnZlciB0byBwcm9jZXNzIG11bHRpcGxlIGNvbm5lY3Rpb25zIGNvbmN1cnJlbnRseQorLy8gKGkuZS4sIG5vdCBUU2ltcGxlU2VydmVyKQorI2RlZmluZSBERUZJTkVfQ09OQ1VSUkVOVF9TRVJWRVJfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCT09TVF9BVVRPX1RFU1RfQ0FTRShTZXJ2ZXIjI18jI1RlbXBsYXRlIyNfc2VwYXJhdGVDb25uZWN0aW9ucykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlc3RTZXBhcmF0ZUNvbm5lY3Rpb25zPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKy8vIFRoZSB0ZXN0RXZlbnRTZXF1ZW5jaW5nKCkgdGVzdCBtYW51YWxseSBnZW5lcmF0ZXMgYSByZXF1ZXN0IGZvciB0aGUgc2VydmVyLAorLy8gYW5kIGRvZXNuJ3Qgd29yayB3aXRoIFRGcmFtZWRUcmFuc3BvcnQuICBUaGVyZWZvcmUgd2UgY2FuJ3QgdGVzdCBpdCB3aXRoCisvLyBUTm9uYmxvY2tpbmdTZXJ2ZXIuCisjZGVmaW5lIERFRklORV9OT0ZSQU1FX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEJPT1NUX0FVVE9fVEVTVF9DQVNFKFNlcnZlciMjXyMjVGVtcGxhdGUjI19ldmVudFNlcXVlbmNpbmcpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVzdEV2ZW50U2VxdWVuY2luZzxTZXJ2ZXIjI1RyYWl0cywgVGVtcGxhdGUjI1RyYWl0cz4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBERUZJTkVfVE5PTkJMT0NLSU5HU0VSVkVSX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBERUZJTkVfU0lNUExFX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBERUZJTkVfQ09OQ1VSUkVOVF9TRVJWRVJfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkKKworI2RlZmluZSBERUZJTkVfQUxMX1NFUlZFUl9URVNUUyhTZXJ2ZXIsIFRlbXBsYXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBERUZJTkVfU0lNUExFX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBERUZJTkVfQ09OQ1VSUkVOVF9TRVJWRVJfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBERUZJTkVfTk9GUkFNRV9URVNUUyhTZXJ2ZXIsIFRlbXBsYXRlKQorCitERUZJTkVfQUxMX1NFUlZFUl9URVNUUyhUVGhyZWFkZWRTZXJ2ZXIsIFRlbXBsYXRlZCkKK0RFRklORV9BTExfU0VSVkVSX1RFU1RTKFRUaHJlYWRlZFNlcnZlciwgVW50ZW1wbGF0ZWQpCitERUZJTkVfQUxMX1NFUlZFUl9URVNUUyhUVGhyZWFkUG9vbFNlcnZlciwgVGVtcGxhdGVkKQorREVGSU5FX0FMTF9TRVJWRVJfVEVTVFMoVFRocmVhZFBvb2xTZXJ2ZXIsIFVudGVtcGxhdGVkKQorCitERUZJTkVfVE5PTkJMT0NLSU5HU0VSVkVSX1RFU1RTKFROb25ibG9ja2luZ1NlcnZlciwgVGVtcGxhdGVkKQorREVGSU5FX1ROT05CTE9DS0lOR1NFUlZFUl9URVNUUyhUTm9uYmxvY2tpbmdTZXJ2ZXIsIFVudGVtcGxhdGVkKQorREVGSU5FX1ROT05CTE9DS0lOR1NFUlZFUl9URVNUUyhUTm9uYmxvY2tpbmdTZXJ2ZXJOb1RocmVhZHMsIFRlbXBsYXRlZCkKK0RFRklORV9UTk9OQkxPQ0tJTkdTRVJWRVJfVEVTVFMoVE5vbmJsb2NraW5nU2VydmVyTm9UaHJlYWRzLCBVbnRlbXBsYXRlZCkKKworREVGSU5FX1NJTVBMRV9URVNUUyhUU2ltcGxlU2VydmVyLCBUZW1wbGF0ZWQpCitERUZJTkVfU0lNUExFX1RFU1RTKFRTaW1wbGVTZXJ2ZXIsIFVudGVtcGxhdGVkKQorREVGSU5FX05PRlJBTUVfVEVTVFMoVFNpbXBsZVNlcnZlciwgVGVtcGxhdGVkKQorREVGSU5FX05PRlJBTUVfVEVTVFMoVFNpbXBsZVNlcnZlciwgVW50ZW1wbGF0ZWQpCisKKy8vIFRPRE86IFdlIHNob3VsZCB0ZXN0IFRFdmVudFNlcnZlciBpbiB0aGUgZnV0dXJlLgorLy8gRm9yIG5vdywgaXQgaXMga25vd24gbm90IHRvIHdvcmsgY29ycmVjdGx5IHdpdGggVFByb2Nlc3NvckV2ZW50SGFuZGxlci4KKyNpZmRlZiBCT09TVF9URVNUX0RZTl9MSU5LCitib29sIGluaXRfdW5pdF90ZXN0X3N1aXRlKCkgeworICA6OmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5wX25hbWUudmFsdWUgPSAiUHJvY2Vzc29yVGVzdCI7CisgIHJldHVybiB0cnVlOworfQorCitpbnQgbWFpbiggaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSApIHsKKyAgcmV0dXJuIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6dW5pdF90ZXN0X21haW4oJmluaXRfdW5pdF90ZXN0X3N1aXRlLGFyZ2MsYXJndik7Cit9CisjZWxzZQorOjpib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBpbml0X3VuaXRfdGVzdF9zdWl0ZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJnYyk7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJndik7CisgIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLnBfbmFtZS52YWx1ZSA9ICJQcm9jZXNzb3JUZXN0IjsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvU2VydmVyVGhyZWFkLmNwcCBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvU2VydmVyVGhyZWFkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDFlYzRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuY3BwCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9USFJJRlRfVEVTVF9TRVJWRVJUSFJFQURfVENDXworI2RlZmluZSBfVEhSSUZUX1RFU1RfU0VSVkVSVEhSRUFEX1RDQ18gMQorCisjaW5jbHVkZSAiU2VydmVyVGhyZWFkLmgiCisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRlc3QgeworCit2b2lkIFNlcnZlclRocmVhZDo6c3RhcnQoKSB7CisgIGFzc2VydCghcnVubmluZ18pOworICBydW5uaW5nXyA9IHRydWU7CisKKyAgaGVscGVyXy5yZXNldChuZXcgSGVscGVyKHRoaXMpKTsKKworICAvLyBTdGFydCB0aGUgb3RoZXIgdGhyZWFkCisgIGNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeTsKKyAgdGhyZWFkRmFjdG9yeS5zZXREZXRhY2hlZChmYWxzZSk7CisgIHRocmVhZF8gPSB0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZChoZWxwZXJfKTsKKworICB0aHJlYWRfLT5zdGFydCgpOworCisgIC8vIFdhaXQgb24gdGhlIG90aGVyIHRocmVhZCB0byB0ZWxsIHVzIHRoYXQgaXQgaGFzIHN1Y2Nlc3NmdWxseQorICAvLyBib3VuZCB0byB0aGUgcG9ydCBhbmQgc3RhcnRlZCBsaXN0ZW5pbmcgKG9yIHVudGlsIGFuIGVycm9yIG9jY3VycykuCisgIGNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQgcyhzZXJ2ZXJNb25pdG9yXyk7CisgIHdoaWxlICghc2VydmluZ18gJiYgIWVycm9yXykgeworICAgIHNlcnZlck1vbml0b3JfLndhaXRGb3JldmVyKCk7CisgIH0KKworICBpZiAoZXJyb3JfKSB7CisgICAgdGhyb3cgdHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uKHRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gYmluZCBvbiBzZXJ2ZXIgc29ja2V0Iik7CisgIH0KK30KKwordm9pZCBTZXJ2ZXJUaHJlYWQ6OnN0b3AoKSB7CisgIGlmICghcnVubmluZ18pIHsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBUZWxsIHRoZSBzZXJ2ZXIgdG8gc3RvcAorICBzZXJ2ZXJfLT5zdG9wKCk7CisgIHJ1bm5pbmdfID0gZmFsc2U7CisKKyAgLy8gV2FpdCBmb3IgdGhlIHNlcnZlciB0aHJlYWQgdG8gZXhpdAorICAvLworICAvLyBOb3RlOiB0aGlzIG9ubHkgd29ya3MgaWYgYWxsIGNsaWVudCBjb25uZWN0aW9ucyBoYXZlIGNsb3NlZC4gIFRoZSBzZXJ2ZXJzCisgIC8vIGdlbmVyYWxseSB3YWl0IGZvciBldmVyeXRoaW5nIHRvIGJlIGNsb3NlZCBiZWZvcmUgZXhpdGluZzsgdGhlcmUgY3VycmVudGx5CisgIC8vIGlzbid0IGEgd2F5IHRvIHRlbGwgdGhlbSB0byBqdXN0IGV4aXQgbm93LCBhbmQgc2h1dCBkb3duIGV4aXN0aW5nCisgIC8vIGNvbm5lY3Rpb25zLgorICB0aHJlYWRfLT5qb2luKCk7Cit9CisKK3ZvaWQgU2VydmVyVGhyZWFkOjpydW4oKSB7CisgIC8qCisgICAqIFRyeSBiaW5kaW5nIHRvIHNldmVyYWwgcG9ydHMsIGluIGNhc2UgdGhlIG9uZSB3ZSB3YW50IGlzIGFscmVhZHkgaW4gdXNlLgorICAgKi8KKyAgcG9ydF8gPSAxMjM0NTsKKyAgdW5zaWduZWQgaW50IG1heFJldHJpZXMgPSAxMDsKKyAgZm9yICh1bnNpZ25lZCBpbnQgbiA9IDA7IG4gPCBtYXhSZXRyaWVzOyArK24pIHsKKyAgICAvLyBDcmVhdGUgdGhlIHNlcnZlcgorICAgIHNlcnZlcl8gPSBzZXJ2ZXJTdGF0ZV8tPmNyZWF0ZVNlcnZlcihwb3J0Xyk7CisgICAgLy8gSW5zdGFsbCBvdXIgaGVscGVyIGFzIHRoZSBzZXJ2ZXIgZXZlbnQgaGFuZGxlciwgc28gdGhhdCBvdXIKKyAgICAvLyBwcmVTZXJ2ZSgpIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBvbmNlIHdlJ3ZlIHN1Y2Nlc3NmdWxseSBib3VuZCB0bworICAgIC8vIHRoZSBwb3J0IGFuZCBhcmUgYWJvdXQgdG8gc3RhcnQgbGlzdGVuaW5nLgorICAgIHNlcnZlcl8tPnNldFNlcnZlckV2ZW50SGFuZGxlcihoZWxwZXJfKTsKKworICAgIHRyeSB7CisgICAgICAvLyBUcnkgdG8gc2VydmUgcmVxdWVzdHMKKyAgICAgIHNlcnZlcl8tPnNlcnZlKCk7CisgICAgfSBjYXRjaCAoY29uc3QgVEV4Y2VwdGlvbiYpIHsKKyAgICAgIC8vIFROb25ibG9ja2luZ1NlcnZlciB0aHJvd3MgYSBnZW5lcmljIFRFeGNlcHRpb24gaWYgaXQgZmFpbHMgdG8gYmluZC4KKyAgICAgIC8vIElmIHdlIGdldCBhIFRFeGNlcHRpb24sIHdlJ2xsIG9wdGltaXN0aWNhbGx5IGFzc3VtZSB0aGUgYmluZCBmYWlsZWQuCisgICAgICArK3BvcnRfOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gU2VyaW91c2x5PyAgc2VydmUoKSBpcyBwcmV0dHkgbGFtZS4gIElmIGl0IGZhaWxzIHRvIHN0YXJ0IHNlcnZpbmcgaXQKKyAgICAvLyBqdXN0IHJldHVybnMgcmF0aGVyIHRoYW4gdGhyb3dpbmcgYW4gZXhjZXB0aW9uLgorICAgIC8vCisgICAgLy8gV2UgaGF2ZSB0byB1c2Ugb3VyIHByZVNlcnZlKCkgaG9vayB0byB0ZWxsIGlmIHNlcnZlKCkgc3VjY2Vzc2Z1bGx5CisgICAgLy8gc3RhcnRlZCBzZXJ2aW5nIGFuZCBpcyByZXR1cm5pbmcgYmVjYXVzZSBzdG9wKCkgaXMgY2FsbGVkLCBvciBpZiBpdCBqdXN0CisgICAgLy8gZmFpbGVkIHRvIHN0YXJ0IHNlcnZpbmcgaW4gdGhlIGZpcnN0IHBsYWNlLgorICAgIGNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQgcyhzZXJ2ZXJNb25pdG9yXyk7CisgICAgaWYgKHNlcnZpbmdfKSB7CisgICAgICAvLyBPaCBnb29kLCB3ZSBzdGFydGVkIHNlcnZpbmcgYW5kIGFyZSBleGl0aW5nIGJlY2F1c2UKKyAgICAgIC8vIHdlJ3JlIHRyeWluZyB0byBzdG9wLgorICAgICAgc2VydmluZ18gPSBmYWxzZTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgLy8gV2UgbmV2ZXIgc3RhcnRlZCBzZXJ2aW5nLCBwcm9iYWJseSBiZWNhdXNlIHdlIGZhaWxlZCB0byBiaW5kIHRvIHRoZQorICAgICAgLy8gcG9ydC4gIEluY3JlbWVudCB0aGUgcG9ydCBudW1iZXIgYW5kIHRyeSBhZ2Fpbi4KKyAgICAgICsrcG9ydF87CisgICAgICBjb250aW51ZTsKKyAgICB9CisgIH0KKworICAvLyBXZSBmYWlsZWQgdG8gYmluZCBvbiBhbnkgcG9ydC4KKyAgY29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKHNlcnZlck1vbml0b3JfKTsKKyAgZXJyb3JfID0gdHJ1ZTsKKyAgc2VydmVyTW9uaXRvcl8ubm90aWZ5KCk7Cit9CisKK3ZvaWQgU2VydmVyVGhyZWFkOjpwcmVTZXJ2ZSgpIHsKKyAgLy8gV2UgYm91bmQgdG8gdGhlIHBvcnQgc3VjY2Vzc2Z1bGx5LCBhbmQgYXJlIGFib3V0IHRvIHN0YXJ0IHNlcnZpbmcgcmVxdWVzdHMKKyAgc2VydmVyU3RhdGVfLT5iaW5kU3VjY2Vzc2Z1bChwb3J0Xyk7CisKKyAgLy8gU2V0IHRoZSByZWFsIHNlcnZlciBldmVudCBoYW5kbGVyIChyZXBsYWNpbmcgb3Vyc2VsZikKKyAgc3RkOjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcj4gc2VydmVyRXZlbnRIYW5kbGVyCisgICAgICA9IHNlcnZlclN0YXRlXy0+Z2V0U2VydmVyRXZlbnRIYW5kbGVyKCk7CisgIHNlcnZlcl8tPnNldFNlcnZlckV2ZW50SGFuZGxlcihzZXJ2ZXJFdmVudEhhbmRsZXIpOworCisgIC8vIE5vdGlmeSB0aGUgbWFpbiB0aHJlYWQgdGhhdCB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBzdGFydGVkIHNlcnZpbmcgcmVxdWVzdHMKKyAgY29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKHNlcnZlck1vbml0b3JfKTsKKyAgc2VydmluZ18gPSB0cnVlOworICBzZXJ2ZXJNb25pdG9yXy5ub3RpZnkoKTsKKworICAvLyBJbnZva2UgcHJlU2VydmUoKSBvbiB0aGUgcmVhbCBldmVudCBoYW5kbGVyLCBzaW5jZSB3ZSBhdGUKKyAgLy8gdGhlIG9yaWdpbmFsIHByZVNlcnZlKCkgZXZlbnQuCisgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIpIHsKKyAgICBzZXJ2ZXJFdmVudEhhbmRsZXItPnByZVNlcnZlKCk7CisgIH0KK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRlc3QKKworI2VuZGlmIC8vIF9USFJJRlRfVEVTVF9TRVJWRVJUSFJFQURfVENDXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuaCBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvU2VydmVyVGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFlMzFhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvU2VydmVyVGhyZWFkLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX1RIUklGVF9URVNUX1NFUlZFUlRIUkVBRF9IXworI2RlZmluZSBfVEhSSUZUX1RFU1RfU0VSVkVSVEhSRUFEX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9UUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorCisjaW5jbHVkZSAiRXZlbnRMb2cuaCIKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0ZXN0IHsKKworLyoqCisgKiBBIGhlbHBlciBjbGFzcyB0byB0ZWxsIFNlcnZlclRocmVhZCBob3cgdG8gY3JlYXRlIHRoZSBzZXJ2ZXIKKyAqLworY2xhc3MgU2VydmVyU3RhdGUgeworcHVibGljOgorICB2aXJ0dWFsIH5TZXJ2ZXJTdGF0ZSgpIHt9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIHNlcnZlciB0byBsaXN0ZW4gb24gdGhlIHNwZWNpZmllZCBwb3J0LgorICAgKgorICAgKiBJZiB0aGUgc2VydmVyIHJldHVybmVkIGZhaWxzIHRvIGJpbmQgdG8gdGhlIHNwZWNpZmllZCBwb3J0IHdoZW4gc2VydmUoKSBpcworICAgKiBjYWxsZWQgb24gaXQsIGNyZWF0ZVNlcnZlcigpIG1heSBiZSBjYWxsZWQgYWdhaW4gb24gYSBkaWZmZXJlbnQgcG9ydC4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlcj4gY3JlYXRlU2VydmVyKHVpbnQxNl90IHBvcnQpID0gMDsKKworICAvKioKKyAgICogR2V0IHRoZSBUU2VydmVyRXZlbnRIYW5kbGVyIHRvIHNldCBvbiB0aGUgc2VydmVyLgorICAgKgorICAgKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGFmdGVyIHRoZSBzZXJ2ZXIgc3VjY2Vzc2Z1bGx5IGJpbmRzIGFuZCBpcyBhYm91dCB0bworICAgKiBzdGFydCBzZXJ2aW5nIHRyYWZmaWMuICBJdCBpcyBpbnZva2VkIGZyb20gdGhlIHNlcnZlciB0aHJlYWQsIHJhdGhlciB0aGFuCisgICAqIHRoZSBtYWluIHRocmVhZC4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcj4gZ2V0U2VydmVyRXZlbnRIYW5kbGVyKCkgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPigpOworICB9CisKKyAgLyoqCisgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbiB0aGUgc2VydmVyIHRocmVhZCBhZnRlciBzZXJ2ZXIgYmluZGluZyBzdWNjZWVkcy4KKyAgICoKKyAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSB3aXNoIHRvIHJlY29yZCB0aGUgZmluYWwKKyAgICogcG9ydCB0aGF0IHdhcyB1c2VkIGZvciB0aGUgc2VydmVyLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGJpbmRTdWNjZXNzZnVsKHVpbnQxNl90IC8qcG9ydCovKSB7fQorfTsKKworLyoqCisgKiBTZXJ2ZXJUaHJlYWQgc3RhcnRzIGEgdGhyaWZ0IHNlcnZlciBydW5uaW5nIGluIGEgc2VwYXJhdGUgdGhyZWFkLgorICovCitjbGFzcyBTZXJ2ZXJUaHJlYWQgeworcHVibGljOgorICBTZXJ2ZXJUaHJlYWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFNlcnZlclN0YXRlPiYgc3RhdGUsIGJvb2wgYXV0b1N0YXJ0KQorICAgIDogcG9ydF8oMCksCisgICAgICBydW5uaW5nXyhmYWxzZSksCisgICAgICBzZXJ2aW5nXyhmYWxzZSksCisgICAgICBlcnJvcl8oZmFsc2UpLAorICAgICAgc2VydmVyU3RhdGVfKHN0YXRlKSB7CisgICAgaWYgKGF1dG9TdGFydCkgeworICAgICAgc3RhcnQoKTsKKyAgICB9CisgIH0KKworICB2b2lkIHN0YXJ0KCk7CisgIHZvaWQgc3RvcCgpOworCisgIHVpbnQxNl90IGdldFBvcnQoKSBjb25zdCB7IHJldHVybiBwb3J0XzsgfQorCisgIH5TZXJ2ZXJUaHJlYWQoKSB7CisgICAgaWYgKHJ1bm5pbmdfKSB7CisgICAgICB0cnkgeworICAgICAgICBzdG9wKCk7CisgICAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiZXJyb3Igc2h1dHRpbmcgZG93biBzZXJ2ZXIiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworcHJvdGVjdGVkOgorICAvLyBBbm5veWluZy4gIHRocmlmdCBmb3JjZXMgdXMgdG8gdXNlIHNoYXJlZF9wdHIsIHNvIHdlIGhhdmUgdG8gdXNlCisgIC8vIGEgaGVscGVyIGNsYXNzIHRoYXQgd2UgY2FuIGFsbG9jYXRlIG9uIHRoZSBoZWFwIGFuZCBnaXZlIHRvIHRocmlmdC4KKyAgLy8gSXQgd291bGQgYmUgc2ltcGxlciBpZiB3ZSBjb3VsZCBqdXN0IG1ha2UgUnVubmFibGUgYW5kIFRTZXJ2ZXJFdmVudEhhbmRsZXIKKyAgLy8gcHJpdmF0ZSBiYXNlIGNsYXNzZXMgb2YgU2VydmVyVGhyZWFkLgorICBjbGFzcyBIZWxwZXIgOiBwdWJsaWMgY29uY3VycmVuY3k6OlJ1bm5hYmxlLCBwdWJsaWMgc2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyIHsKKyAgcHVibGljOgorICAgIEhlbHBlcihTZXJ2ZXJUaHJlYWQqIHNlcnZlclRocmVhZCkgOiBzZXJ2ZXJUaHJlYWRfKHNlcnZlclRocmVhZCkge30KKworICAgIHZvaWQgcnVuKCkgeyBzZXJ2ZXJUaHJlYWRfLT5ydW4oKTsgfQorCisgICAgdm9pZCBwcmVTZXJ2ZSgpIHsgc2VydmVyVGhyZWFkXy0+cHJlU2VydmUoKTsgfQorCisgIHByaXZhdGU6CisgICAgU2VydmVyVGhyZWFkKiBzZXJ2ZXJUaHJlYWRfOworICB9OworCisgIHZvaWQgcnVuKCk7CisgIHZvaWQgcHJlU2VydmUoKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8SGVscGVyPiBoZWxwZXJfOworCisgIHVpbnQxNl90IHBvcnRfOworICBib29sIHJ1bm5pbmdfOworICBib29sIHNlcnZpbmdfOworICBib29sIGVycm9yXzsKKyAgY29uY3VycmVuY3k6Ok1vbml0b3Igc2VydmVyTW9uaXRvcl87CisKKyAgc3RkOjpzaGFyZWRfcHRyPFNlcnZlclN0YXRlPiBzZXJ2ZXJTdGF0ZV87CisgIHN0ZDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlRTZXJ2ZXI+IHNlcnZlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxjb25jdXJyZW5jeTo6VGhyZWFkPiB0aHJlYWRfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRlc3QKKworI2VuZGlmIC8vIF9USFJJRlRfVEVTVF9TRVJWRVJUSFJFQURfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvcHJvYy50aHJpZnQgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL3Byb2MudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjM2M1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL3Byb2MudGhyaWZ0CkBAIC0wLDAgKzEsMjIgQEAKK25hbWVzcGFjZSBjcHAgYXBhY2hlLnRocmlmdC50ZXN0CisKK2V4Y2VwdGlvbiBNeUVycm9yIHsKKyAgMTogc3RyaW5nIG1lc3NhZ2UKK30KKworc2VydmljZSBQYXJlbnRTZXJ2aWNlIHsKKyAgaTMyIGluY3JlbWVudEdlbmVyYXRpb24oKQorICBpMzIgZ2V0R2VuZXJhdGlvbigpCisgIHZvaWQgYWRkU3RyaW5nKDE6IHN0cmluZyBzKQorICBsaXN0PHN0cmluZz4gZ2V0U3RyaW5ncygpCisKKyAgYmluYXJ5IGdldERhdGFXYWl0KDE6IGkzMiBsZW5ndGgpCisgIG9uZXdheSB2b2lkIG9uZXdheVdhaXQoKQorICB2b2lkIGV4Y2VwdGlvbldhaXQoMTogc3RyaW5nIG1lc3NhZ2UpIHRocm93cyAoMjogTXlFcnJvciBlcnJvcikKKyAgdm9pZCB1bmV4cGVjdGVkRXhjZXB0aW9uV2FpdCgxOiBzdHJpbmcgbWVzc2FnZSkKK30KKworc2VydmljZSBDaGlsZFNlcnZpY2UgZXh0ZW5kcyBQYXJlbnRTZXJ2aWNlIHsKKyAgaTMyIHNldFZhbHVlKDE6IGkzMiB2YWx1ZSkKKyAgaTMyIGdldFZhbHVlKCkKK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9xdC9DTWFrZUxpc3RzLnR4dCBiL2xpYi9jcHAvdGVzdC9xdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjM0MWNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L3F0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzZXQoQ01BS0VfQVVUT01PQyBPTikKK2ZpbmRfcGFja2FnZShRdDUgUkVRVUlSRUQgQ09NUE9ORU5UUyBUZXN0IE5ldHdvcmspCitzZXQoVFFUY3BTZXJ2ZXJUZXN0X1F0NV9TT1VSQ0VTCisgICAgVFFUY3BTZXJ2ZXJUZXN0LmNwcAorKQorYWRkX2V4ZWN1dGFibGUoVFFUY3BTZXJ2ZXJUZXN0X1F0NSAke1RRVGNwU2VydmVyVGVzdF9RdDVfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoVFFUY3BTZXJ2ZXJUZXN0X1F0NSB0ZXN0Z2VuY3BwX2NvYikKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUUVRjcFNlcnZlclRlc3RfUXQ1IHRocmlmdHF0NSkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUUVRjcFNlcnZlclRlc3RfUXQ1IHRocmlmdCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUUVRjcFNlcnZlclRlc3RfUXQ1IFF0NTo6VGVzdCBRdDU6Ok5ldHdvcmspCisKK2FkZF90ZXN0KE5BTUUgVFFUY3BTZXJ2ZXJUZXN0X1F0NSBDT01NQU5EIFRRVGNwU2VydmVyVGVzdF9RdDUpCisKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9xdC9UUVRjcFNlcnZlclRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L3F0L1RRVGNwU2VydmVyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThkMGM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9xdC9UUVRjcFNlcnZlclRlc3QuY3BwCkBAIC0wLDAgKzEsMTEzIEBACisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFRRVGNwU2VydmVyVGVzdAorI2luY2x1ZGUgPFFUZXN0PgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8UVRjcFNlcnZlcj4KKyNpbmNsdWRlIDxRVGNwU29ja2V0PgorI2luY2x1ZGUgPFFIb3N0QWRkcmVzcz4KKyNpbmNsdWRlIDxRVGhyZWFkPgorCisjaWZuZGVmIFFfTU9DX1JVTgorICAjaW5jbHVkZSAidGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIgorICAjaW5jbHVkZSAidGhyaWZ0L2FzeW5jL1RBc3luY1Byb2Nlc3Nvci5oIgorICAjaW5jbHVkZSAidGhyaWZ0L3F0L1RRVGNwU2VydmVyLmgiCisgICNpbmNsdWRlICJ0aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5oIgorCisgICNpbmNsdWRlICJnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CisKK3N0cnVjdCBBc3luY0hhbmRsZXIgOiBwdWJsaWMgdGVzdDo6UGFyZW50U2VydmljZUNvYlN2SWYgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nczsKKyAgdmlydHVhbCB2b2lkIGFkZFN0cmluZyhzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY29iLCBjb25zdCBzdGQ6OnN0cmluZyYgcykgeworICAgIHN0cmluZ3MucHVzaF9iYWNrKHMpOworICAgIGNvYigpOworICB9CisgIHZpcnR1YWwgdm9pZCBnZXRTdHJpbmdzKHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIF9yZXR1cm4pPiBjb2IpIHsKKyAgICBjb2Ioc3RyaW5ncyk7CisgIH0KKworICAvLyBPdmVycmlkZXMgbm90IHVzZWQgaW4gdGhpcyB0ZXN0CisgIHZpcnR1YWwgdm9pZCBpbmNyZW1lbnRHZW5lcmF0aW9uKHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQzMl90IGNvbnN0JiBfcmV0dXJuKT4gY29iKSB7fQorICB2aXJ0dWFsIHZvaWQgZ2V0R2VuZXJhdGlvbihzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50MzJfdCBjb25zdCYgX3JldHVybik+IGNvYikge30KKyAgdmlydHVhbCB2b2lkIGdldERhdGFXYWl0KHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZyBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgbGVuZ3RoKSB7fQorICB2aXJ0dWFsIHZvaWQgb25ld2F5V2FpdChzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY29iKSB7fQorICB2aXJ0dWFsIHZvaWQgZXhjZXB0aW9uV2FpdCgKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk+IC8qIGV4bl9jb2IgKi8sCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkge30KKyAgdmlydHVhbCB2b2lkIHVuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7fQorfTsKKworY2xhc3MgVFFUY3BTZXJ2ZXJUZXN0IDogcHVibGljIFFPYmplY3QgeworICBRX09CSkVDVAorCitwcml2YXRlIHNsb3RzOgorICB2b2lkIGluaXRUZXN0Q2FzZSgpOworICB2b2lkIGNsZWFudXBUZXN0Q2FzZSgpOworICB2b2lkIHRlc3RfY29tbXVuaWNhdGUoKTsKKworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPFFUaHJlYWQ+IHNlcnZlclRocmVhZDsKKyAgc3RkOjpzaGFyZWRfcHRyPGFzeW5jOjpUUVRjcFNlcnZlcj4gc2VydmVyOworICBzdGQ6OnNoYXJlZF9wdHI8dGVzdDo6UGFyZW50U2VydmljZUNsaWVudD4gY2xpZW50OworfTsKKwordm9pZCBUUVRjcFNlcnZlclRlc3Q6OmluaXRUZXN0Q2FzZSgpIHsKKyAgLy8gc2V0dXAgc2VydmVyCisgIHN0ZDo6c2hhcmVkX3B0cjxRVGNwU2VydmVyPiBzZXJ2ZXJTb2NrZXQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFFUY3BTZXJ2ZXI+KCk7CisgIHNlcnZlci5yZXNldChuZXcgYXN5bmM6OlRRVGNwU2VydmVyKHNlcnZlclNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDx0ZXN0OjpQYXJlbnRTZXJ2aWNlQXN5bmNQcm9jZXNzb3I+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEFzeW5jSGFuZGxlcj4oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbEZhY3Rvcnk+KCkpKTsKKyAgUVZFUklGWShzZXJ2ZXJTb2NrZXQtPmxpc3RlbihRSG9zdEFkZHJlc3M6OkxvY2FsSG9zdCkpOworICBpbnQgcG9ydCA9IHNlcnZlclNvY2tldC0+c2VydmVyUG9ydCgpOworICBRVkVSSUZZKHBvcnQgPiAwKTsKKworICAvL3NldHVwIHNlcnZlciB0aHJlYWQgYW5kIG1vdmUgc2VydmVyIHRvIGl0CisgIHNlcnZlclRocmVhZC5yZXNldChuZXcgUVRocmVhZCgpKTsKKyAgc2VydmVyU29ja2V0LT5tb3ZlVG9UaHJlYWQoc2VydmVyVGhyZWFkLmdldCgpKTsKKyAgc2VydmVyLT5tb3ZlVG9UaHJlYWQoc2VydmVyVGhyZWFkLmdldCgpKTsKKyAgc2VydmVyVGhyZWFkLT5zdGFydCgpOworCisgIC8vIHNldHVwIGNsaWVudAorICBzdGQ6OnNoYXJlZF9wdHI8UVRjcFNvY2tldD4gc29ja2V0ID0gc3RkOjptYWtlX3NoYXJlZDxRVGNwU29ja2V0PigpOworICBjbGllbnQucmVzZXQobmV3IHRlc3Q6OlBhcmVudFNlcnZpY2VDbGllbnQoc3RkOjptYWtlX3NoYXJlZDxwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sPigKKyAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8dHJhbnNwb3J0OjpUUUlPRGV2aWNlVHJhbnNwb3J0Pihzb2NrZXQpKSkpOworICBzb2NrZXQtPmNvbm5lY3RUb0hvc3QoUUhvc3RBZGRyZXNzOjpMb2NhbEhvc3QsIHBvcnQpOworICBRVkVSSUZZKHNvY2tldC0+d2FpdEZvckNvbm5lY3RlZCgpKTsKK30KKwordm9pZCBUUVRjcFNlcnZlclRlc3Q6OmNsZWFudXBUZXN0Q2FzZSgpIHsKKyAgLy9maXJzdCwgc3RvcCB0aGUgdGhyZWFkIHdoaWNoIGhvbGRzIHRoZSBzZXJ2ZXIKKyAgc2VydmVyVGhyZWFkLT5xdWl0KCk7CisgIHNlcnZlclRocmVhZC0+d2FpdCgpOworICAvLyBub3csIGl0IGlzIHNhZmUgdG8gZGVsZXRlIHRoZSBzZXJ2ZXIKKyAgc2VydmVyLnJlc2V0KCk7CisgIC8vIGRlbGV0ZSB0aHJlYWQgbm93CisgIHNlcnZlclRocmVhZC5yZXNldCgpOworCisgIC8vIGNsZWFudXAgY2xpZW50CisgIGNsaWVudC5yZXNldCgpOworfQorCit2b2lkIFRRVGNwU2VydmVyVGVzdDo6dGVzdF9jb21tdW5pY2F0ZSgpIHsKKyAgY2xpZW50LT5hZGRTdHJpbmcoImZvbyIpOworICBjbGllbnQtPmFkZFN0cmluZygiYmFyIik7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlcGx5OworICBjbGllbnQtPmdldFN0cmluZ3MocmVwbHkpOworICBRQ09NUEFSRShRU3RyaW5nOjpmcm9tU3RkU3RyaW5nKHJlcGx5WzBdKSwgUVN0cmluZygiZm9vIikpOworICBRQ09NUEFSRShRU3RyaW5nOjpmcm9tU3RkU3RyaW5nKHJlcGx5WzFdKSwgUVN0cmluZygiYmFyIikpOworfQorCisKKyNpZiAoUVRfVkVSU0lPTiA+PSBRVF9WRVJTSU9OX0NIRUNLKDUsIDAsIDApKQorUVRFU1RfR1VJTEVTU19NQUlOKFRRVGNwU2VydmVyVGVzdCk7CisjZWxzZQorI3VuZGVmIFFUX0dVSV9MSUIKK1FURVNUX01BSU4oVFFUY3BTZXJ2ZXJUZXN0KTsKKyNlbmRpZgorI2luY2x1ZGUgIlRRVGNwU2VydmVyVGVzdC5tb2MiCmRpZmYgLS1naXQgYS9saWIvY3BwL3RocmlmdC1uYi5wYy5pbiBiL2xpYi9jcHAvdGhyaWZ0LW5iLnBjLmluCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggYWUwNTE4OC4uMmM2YTk2OQotLS0gYS9saWIvY3BwL3RocmlmdC1uYi5wYy5pbgorKysgYi9saWIvY3BwL3RocmlmdC1uYi5wYy5pbgpAQCAtMjcsNCArMjcsNCBAQAogVmVyc2lvbjogQFZFUlNJT05ACiBSZXF1aXJlczogdGhyaWZ0ID0gQFZFUlNJT05ACiBMaWJzOiAtTCR7bGliZGlyfSAtbHRocmlmdG5iCi1DZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfS90aHJpZnQKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9saWIvY3BwL3RocmlmdC1xdC5wYy5pbiBiL2xpYi9jcHAvdGhyaWZ0LXF0LnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVlNjBkODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3RocmlmdC1xdC5wYy5pbgpAQCAtMCwwICsxLDMwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitsaWJkaXI9QGxpYmRpckAKK2luY2x1ZGVkaXI9QGluY2x1ZGVkaXJACisKK05hbWU6IFRocmlmdAorRGVzY3JpcHRpb246IFRocmlmdCBRdCBBUEkKK1ZlcnNpb246IEBWRVJTSU9OQAorUmVxdWlyZXM6IHRocmlmdCA9IEBWRVJTSU9OQAorTGliczogLUwke2xpYmRpcn0gLWx0aHJpZnRxdAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGhyaWZ0LXF0NS5wYy5pbiBiL2xpYi9jcHAvdGhyaWZ0LXF0NS5wYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hOGIxNjY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90aHJpZnQtcXQ1LnBjLmluCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAKKworTmFtZTogVGhyaWZ0CitEZXNjcmlwdGlvbjogVGhyaWZ0IFF0NSBBUEkKK1ZlcnNpb246IEBWRVJTSU9OQAorUmVxdWlyZXM6IHRocmlmdCA9IEBWRVJTSU9OQAorTGliczogLUwke2xpYmRpcn0gLWx0aHJpZnRxdDUKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9saWIvY3BwL3RocmlmdC16LnBjLmluIGIvbGliL2NwcC90aHJpZnQtei5wYy5pbgpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDcyZjQ2YmYuLjQ2N2QyZTEKLS0tIGEvbGliL2NwcC90aHJpZnQtei5wYy5pbgorKysgYi9saWIvY3BwL3RocmlmdC16LnBjLmluCkBAIC0yNyw0ICsyNyw0IEBACiBWZXJzaW9uOiBAVkVSU0lPTkAKIFJlcXVpcmVzOiB0aHJpZnQgPSBAVkVSU0lPTkAKIExpYnM6IC1MJHtsaWJkaXJ9IC1sdGhyaWZ0egotQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0vdGhyaWZ0CitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90aHJpZnQucGMuaW4gYi9saWIvY3BwL3RocmlmdC5wYy5pbgpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDdhZWMwOWYuLmQxMWU2ZGIKLS0tIGEvbGliL2NwcC90aHJpZnQucGMuaW4KKysrIGIvbGliL2NwcC90aHJpZnQucGMuaW4KQEAgLTI2LDQgKzI2LDQgQEAKIERlc2NyaXB0aW9uOiBUaHJpZnQgQysrIEFQSQogVmVyc2lvbjogQFZFUlNJT05ACiBMaWJzOiAtTCR7bGliZGlyfSAtbHRocmlmdAotQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0vdGhyaWZ0CitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90aHJpZnQuc2xuIGIvbGliL2NwcC90aHJpZnQuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMGY0NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3RocmlmdC5zbG4KQEAgLTAsMCArMSw2MSBAQAor77u/CitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMS4wMAorIyBWaXN1YWwgU3R1ZGlvIDIwMTAKK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAibGlidGhyaWZ0bmIiLCAibGlidGhyaWZ0bmIudmN4cHJvaiIsICJ7RDg2OTZDQ0UtN0Q0Ni00NjU5LUI0MzItOTE3NTRBNDFERUIwfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAibGlidGhyaWZ0IiwgImxpYnRocmlmdC52Y3hwcm9qIiwgIntERDI2RjU3RS02MEYyLTRGMzctQTYxNi1EMjE5QTlCRjMzOEZ9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezIxNTBFMzMzLThGREMtNDJBMy05NDc0LTFBMzk1NkQ0NkRFOH0iKSA9ICJkb2MiLCAiZG9jIiwgInswMDY5ODRFMC03Q0MxLTQ3RTItQUNEMi1BNDBGRTREMzg2OTN9IgorCVByb2plY3RTZWN0aW9uKFNvbHV0aW9uSXRlbXMpID0gcHJlUHJvamVjdAorCQlSRUFETUUubWQgPSBSRUFETUUubWQKKwlFbmRQcm9qZWN0U2VjdGlvbgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMgorCQlEZWJ1Z3x4NjQgPSBEZWJ1Z3x4NjQKKwkJRGVidWctbXR8V2luMzIgPSBEZWJ1Zy1tdHxXaW4zMgorCQlEZWJ1Zy1tdHx4NjQgPSBEZWJ1Zy1tdHx4NjQKKwkJUmVsZWFzZXxXaW4zMiA9IFJlbGVhc2V8V2luMzIKKwkJUmVsZWFzZXx4NjQgPSBSZWxlYXNlfHg2NAorCQlSZWxlYXNlLW10fFdpbjMyID0gUmVsZWFzZS1tdHxXaW4zMgorCQlSZWxlYXNlLW10fHg2NCA9IFJlbGVhc2UtbXR8eDY0CisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgorCQl7RDg2OTZDQ0UtN0Q0Ni00NjU5LUI0MzItOTE3NTRBNDFERUIwfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8eDY0CisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8eDY0CisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LkRlYnVnLW10fFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnLW10fFdpbjMyCisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LkRlYnVnLW10fFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Zy1tdHxXaW4zMgorCQl7RDg2OTZDQ0UtN0Q0Ni00NjU5LUI0MzItOTE3NTRBNDFERUIwfS5EZWJ1Zy1tdHx4NjQuQWN0aXZlQ2ZnID0gRGVidWctbXR8eDY0CisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LkRlYnVnLW10fHg2NC5CdWlsZC4wID0gRGVidWctbXR8eDY0CisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7RDg2OTZDQ0UtN0Q0Ni00NjU5LUI0MzItOTE3NTRBNDFERUIwfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0CisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NAorCQl7RDg2OTZDQ0UtN0Q0Ni00NjU5LUI0MzItOTE3NTRBNDFERUIwfS5SZWxlYXNlLW10fFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2UtbXR8V2luMzIKKwkJe0Q4Njk2Q0NFLTdENDYtNDY1OS1CNDMyLTkxNzU0QTQxREVCMH0uUmVsZWFzZS1tdHxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZS1tdHxXaW4zMgorCQl7RDg2OTZDQ0UtN0Q0Ni00NjU5LUI0MzItOTE3NTRBNDFERUIwfS5SZWxlYXNlLW10fHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlLW10fHg2NAorCQl7RDg2OTZDQ0UtN0Q0Ni00NjU5LUI0MzItOTE3NTRBNDFERUIwfS5SZWxlYXNlLW10fHg2NC5CdWlsZC4wID0gUmVsZWFzZS1tdHx4NjQKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXtERDI2RjU3RS02MEYyLTRGMzctQTYxNi1EMjE5QTlCRjMzOEZ9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uRGVidWctbXR8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWctbXR8V2luMzIKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uRGVidWctbXR8V2luMzIuQnVpbGQuMCA9IERlYnVnLW10fFdpbjMyCisJCXtERDI2RjU3RS02MEYyLTRGMzctQTYxNi1EMjE5QTlCRjMzOEZ9LkRlYnVnLW10fHg2NC5BY3RpdmVDZmcgPSBEZWJ1Zy1tdHx4NjQKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uRGVidWctbXR8eDY0LkJ1aWxkLjAgPSBEZWJ1Zy1tdHx4NjQKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXtERDI2RjU3RS02MEYyLTRGMzctQTYxNi1EMjE5QTlCRjMzOEZ9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0CisJCXtERDI2RjU3RS02MEYyLTRGMzctQTYxNi1EMjE5QTlCRjMzOEZ9LlJlbGVhc2UtbXR8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZS1tdHxXaW4zMgorCQl7REQyNkY1N0UtNjBGMi00RjM3LUE2MTYtRDIxOUE5QkYzMzhGfS5SZWxlYXNlLW10fFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlLW10fFdpbjMyCisJCXtERDI2RjU3RS02MEYyLTRGMzctQTYxNi1EMjE5QTlCRjMzOEZ9LlJlbGVhc2UtbXR8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2UtbXR8eDY0CisJCXtERDI2RjU3RS02MEYyLTRGMzctQTYxNi1EMjE5QTlCRjMzOEZ9LlJlbGVhc2UtbXR8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlLW10fHg2NAorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvTWFrZWZpbGUuYW0gYi9saWIvY3NoYXJwL01ha2VmaWxlLmFtCmluZGV4IDhhYTlhMWYuLjU2YThiMGYgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvTWFrZWZpbGUuYW0KKysrIGIvbGliL2NzaGFycC9NYWtlZmlsZS5hbQpAQCAtMTcsOCArMTcsMTMgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVENPREU9IFwKK1NVQkRJUlMgPSAuIHRlc3QvTXVsdGlwbGV4CisKK1RIUklGVENPREUgPSBcCiAgICAgICAgICAgICBzcmMvQ29sbGVjdGlvbnMvVEhhc2hTZXQuY3MgXAorICAgICAgICAgICAgc3JjL0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9ucy5jcyBcCisgICAgICAgICAgICBzcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgXAorICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RBYnN0cmFjdEJhc2UuY3MgXAogICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RCYXNlLmNzIFwKICAgICAgICAgICAgIHNyYy9Qcm90b2NvbC9UQmFzZTY0VXRpbHMuY3MgXAogICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3MgXApAQCAtMzAsMTggKzM1LDI0IEBACiAgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVFByb3RvY29sVXRpbC5jcyBcCiAgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVE1lc3NhZ2VUeXBlLmNzIFwKICAgICAgICAgICAgIHNyYy9Qcm90b2NvbC9UUHJvdG9jb2wuY3MgXAorICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5jcyBcCisgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuY3MgXAorICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5jcyBcCiAgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVFR5cGUuY3MgXAogICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RGaWVsZC5jcyBcCiAgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVE1lc3NhZ2UuY3MgXAogICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RTdHJ1Y3QuY3MgXAogICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcyBcCisgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5jcyBcCiAgICAgICAgICAgICBzcmMvU2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcyBcCiAgICAgICAgICAgICBzcmMvU2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNzIFwKICAgICAgICAgICAgIHNyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcyBcCiAgICAgICAgICAgICBzcmMvU2VydmVyL1RTZXJ2ZXIuY3MgXAorICAgICAgICAgICAgc3JjL1NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydC5jcyBcCiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RTb2NrZXQuY3MgXAorICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UU29ja2V0VmVyc2lvbml6ZXIuY3MgXAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFN0cmVhbVRyYW5zcG9ydC5jcyBcCiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuY3MgXApAQCAtNTAsMjYgKzYxLDU1IEBACiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5LmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVEh0dHBDbGllbnQuY3MgXAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9USHR0cEhhbmRsZXIuY3MgXAorICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmNzIFwKKyAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcyBcCisgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1ROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQuY3MgXAorICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UVExTU29ja2V0LmNzIFwKKyAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFRMU1NlcnZlclNvY2tldC5jcyBcCiAgICAgICAgICAgICBzcmMvVFByb2Nlc3Nvci5jcyBcCisgICAgICAgICAgICBzcmMvVFByb2Nlc3NvckZhY3RvcnkuY3MgXAorICAgICAgICAgICAgc3JjL1RTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5LmNzIFwKKyAgICAgICAgICAgIHNyYy9UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeS5jcyBcCisgICAgICAgICAgICBzcmMvVENvbnRyb2xsaW5nSGFuZGxlci5jcyBcCisgICAgICAgICAgICBzcmMvVEV4Y2VwdGlvbi5jcyBcCiAgICAgICAgICAgICBzcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCiAKLQotQ1NDPWdtY3MKLQotaWYgTkVUXzJfMAotTU9OT19ERUZJTkVTPS9kOk5FVF8yXzAKK2lmIE1PTk9fTUNTCitleHBvcnQgQ1NDID0gbWNzCitlbHNlCitleHBvcnQgQ1NDID0gZ21jcwogZW5kaWYKIAotYWxsLWxvY2FsOiBUaHJpZnQuZGxsCitpZiBORVRfMl8wCitleHBvcnQgQ1NDX0RFRklORVMgPSAtZDpORVRfMl8wCitlbmRpZgorCithbGwtbG9jYWw6IFRocmlmdC5kbGwgVGhyaWZ0LjQ1LmRsbAogCiBUaHJpZnQuZGxsOiAkKFRIUklGVENPREUpCi0JJChDU0MpICQoVEhSSUZUQ09ERSkgL291dDpUaHJpZnQuZGxsIC90YXJnZXQ6bGlicmFyeSAvcmVmZXJlbmNlOlN5c3RlbS5XZWIgJChNT05PX0RFRklORVMpCisJJChDU0MpICQoQ1NDX0RFRklORVMpIC1vdXQ6JEAgLXRhcmdldDpsaWJyYXJ5IC1yZWZlcmVuY2U6U3lzdGVtLldlYiAkKFRIUklGVENPREUpCisKK1RocmlmdC40NS5kbGw6ICQoVEhSSUZUQ09ERSkKKwkkKENTQykgJChDU0NfREVGSU5FUykgLW91dDokQCAtdGFyZ2V0OmxpYnJhcnkgLXJlZmVyZW5jZTpTeXN0ZW0uV2ViICQoVEhSSUZUQ09ERSkKIAogY2xlYW4tbG9jYWw6Ci0JJChSTSkgVGhyaWZ0LmRsbAorCSQoUk0pIFRocmlmdC5kbGwgIFwKKwkkKFJNKSBUaHJpZnQuNDUuZGxsCiAKIEVYVFJBX0RJU1QgPSBcCi0gICAgICAgICAgICAgJChUSFJJRlRDT0RFKSBcCi0gICAgICAgICAgICAgVGhyaWZ0TVNCdWlsZFRhc2sgXAotICAgICAgICAgICAgIHNyYy9UaHJpZnQuY3Nwcm9qIFwKLSAgICAgICAgICAgICBzcmMvVGhyaWZ0LnNsbgorCSQoVEhSSUZUQ09ERSkgXAorCVRocmlmdE1TQnVpbGRUYXNrIFwKKwlzcmMvVGhyaWZ0LmNzcHJvaiBcCisJc3JjL1RocmlmdC40NS5jc3Byb2ogXAorCXNyYy9UaHJpZnQuc2xuIFwKKwlzcmMvTmV0MzUvRXh0ZW5zaW9uc05ldDM1LmNzIFwKKwlzcmMvVHJhbnNwb3J0L1RTaWx2ZXJsaWdodFNvY2tldC5jcyBcCisJc3JjL1RyYW5zcG9ydC9USHR0cFRhc2tBc3luY0hhbmRsZXIuY3MgXAorCXNyYy9UQXN5bmNQcm9jZXNzb3IuY3MgXAorCXRlc3QgXAorCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCVJFQURNRS5tZAorCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IFwKKwlNYWtlZmlsZSBcCisJTWFrZWZpbGUuaW4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvUkVBRE1FIGIvbGliL2NzaGFycC9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9jc2hhcnAvUkVBRE1FCnJlbmFtZSB0byBsaWIvY3NoYXJwL1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKaW5kZXggODc2OWYxYS4uYzc0MWI3MiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcworKysgYi9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC01Niw1ICs1Niw1IEBACiAvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycwogLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKIC8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjAuNy4wLioiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLioiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuKiIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRCdWlsZC5jcyBiL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0QnVpbGQuY3MKaW5kZXggNzViYjMzOS4uNGU2ZDMwMSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRCdWlsZC5jcworKysgYi9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdEJ1aWxkLmNzCkBAIC0zMywyMTQgKzMzLDIxNCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0TVNCdWlsZFRhc2sKIHsKLQkvLy8gPHN1bW1hcnk+Ci0JLy8vIE1TQnVpbGQgVGFzayB0byBnZW5lcmF0ZSBjc2hhcnAgZnJvbSAudGhyaWZ0IGZpbGVzLCBhbmQgY29tcGlsZSB0aGUgY29kZSBpbnRvIGEgbGlicmFyeTogVGhyaWZ0SW1wbC5kbGwKLQkvLy8gPC9zdW1tYXJ5PgotCXB1YmxpYyBjbGFzcyBUaHJpZnRCdWlsZCA6IFRhc2sKLQl7Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFRoZSBmdWxsIHBhdGggdG8gdGhlIHRocmlmdC5leGUgY29tcGlsZXIKLQkJLy8vIDwvc3VtbWFyeT4KLQkJW1JlcXVpcmVkXQotCQlwdWJsaWMgSVRhc2tJdGVtIFRocmlmdEV4ZWN1dGFibGUKLQkJewotCQkJZ2V0OwotCQkJc2V0OwotCQl9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBNU0J1aWxkIFRhc2sgdG8gZ2VuZXJhdGUgY3NoYXJwIGZyb20gLnRocmlmdCBmaWxlcywgYW5kIGNvbXBpbGUgdGhlIGNvZGUgaW50byBhIGxpYnJhcnk6IFRocmlmdEltcGwuZGxsCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVGhyaWZ0QnVpbGQgOiBUYXNrCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgZnVsbCBwYXRoIHRvIHRoZSB0aHJpZnQuZXhlIGNvbXBpbGVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFtSZXF1aXJlZF0KKyAgICAgICAgcHVibGljIElUYXNrSXRlbSBUaHJpZnRFeGVjdXRhYmxlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQogCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFRoZSBmdWxsIHBhdGggdG8gYSB0aHJpZnQuZGxsIEMjIGxpYnJhcnkKLQkJLy8vIDwvc3VtbWFyeT4KLQkJW1JlcXVpcmVkXQotCQlwdWJsaWMgSVRhc2tJdGVtIFRocmlmdExpYnJhcnkKLQkJewotCQkJZ2V0OwotCQkJc2V0OwotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBmdWxsIHBhdGggdG8gYSB0aHJpZnQuZGxsIEMjIGxpYnJhcnkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgW1JlcXVpcmVkXQorICAgICAgICBwdWJsaWMgSVRhc2tJdGVtIFRocmlmdExpYnJhcnkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gQSBkaXJlY290cnkgY29udGFpbmluZyAudGhyaWZ0IGZpbGVzCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCVtSZXF1aXJlZF0KLQkJcHVibGljIElUYXNrSXRlbSBUaHJpZnREZWZpbml0aW9uRGlyCi0JCXsKLQkJCWdldDsKLQkJCXNldDsKLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIGRpcmVjb3RyeSBjb250YWluaW5nIC50aHJpZnQgZmlsZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgW1JlcXVpcmVkXQorICAgICAgICBwdWJsaWMgSVRhc2tJdGVtIFRocmlmdERlZmluaXRpb25EaXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gVGhlIG5hbWUgb2YgdGhlIGF1dG8tZ2VuIGFuZCBjb21waWxlZCB0aHJpZnQgbGlicmFyeS4gSXQgd2lsbCBwbGFjZWQgaW4KLQkJLy8vIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBUaHJpZnRMaWJyYXJ5Ci0JCS8vLyA8L3N1bW1hcnk+Ci0JCVtSZXF1aXJlZF0KLQkJcHVibGljIElUYXNrSXRlbSBPdXRwdXROYW1lCi0JCXsKLQkJCWdldDsKLQkJCXNldDsKLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgbmFtZSBvZiB0aGUgYXV0by1nZW4gYW5kIGNvbXBpbGVkIHRocmlmdCBsaWJyYXJ5LiBJdCB3aWxsIHBsYWNlZCBpbgorICAgICAgICAvLy8gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIFRocmlmdExpYnJhcnkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgW1JlcXVpcmVkXQorICAgICAgICBwdWJsaWMgSVRhc2tJdGVtIE91dHB1dE5hbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gVGhlIGZ1bGwgcGF0aCB0byB0aGUgY29tcGlsZWQgVGhyaWZ0TGlicmFyeS4gVGhpcyBhbGxvd3MgbXNidWlsZCB0YXNrcyB0byB1c2UgdGhpcwotCQkvLy8gb3V0cHV0IGFzIGEgdmFyaWFibGUgZm9yIHVzZSBlbHNld2hlcmUuCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCVtPdXRwdXRdCi0JCXB1YmxpYyBJVGFza0l0ZW0gVGhyaWZ0SW1wbGVtZW50YXRpb24KLQkJewotCQkJZ2V0IHsgcmV0dXJuIHRocmlmdEltcGw7IH0KLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgZnVsbCBwYXRoIHRvIHRoZSBjb21waWxlZCBUaHJpZnRMaWJyYXJ5LiBUaGlzIGFsbG93cyBtc2J1aWxkIHRhc2tzIHRvIHVzZSB0aGlzCisgICAgICAgIC8vLyBvdXRwdXQgYXMgYSB2YXJpYWJsZSBmb3IgdXNlIGVsc2V3aGVyZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgW091dHB1dF0KKyAgICAgICAgcHVibGljIElUYXNrSXRlbSBUaHJpZnRJbXBsZW1lbnRhdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdGhyaWZ0SW1wbDsgfQorICAgICAgICB9CiAKLQkJcHJpdmF0ZSBJVGFza0l0ZW0gdGhyaWZ0SW1wbDsKLQkJcHJpdmF0ZSBjb25zdCBzdHJpbmcgbGFzdENvbXBpbGF0aW9uTmFtZSA9ICJMQVNUX0NPTVBfVElNRVNUQU1QIjsKKyAgICAgICAgcHJpdmF0ZSBJVGFza0l0ZW0gdGhyaWZ0SW1wbDsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgbGFzdENvbXBpbGF0aW9uTmFtZSA9ICJMQVNUX0NPTVBfVElNRVNUQU1QIjsKIAotCQkvL3VzZSB0aGUgTWVzc2FnZSBCdWlsZCBUYXNrIHRvIHdyaXRlIHNvbWV0aGluZyB0byBidWlsZCBsb2cKLQkJcHJpdmF0ZSB2b2lkIExvZ01lc3NhZ2Uoc3RyaW5nIHRleHQsIE1lc3NhZ2VJbXBvcnRhbmNlIGltcG9ydGFuY2UpCi0JCXsKLQkJCU1lc3NhZ2UgbSA9IG5ldyBNZXNzYWdlKCk7Ci0JCQltLlRleHQgPSB0ZXh0OwotCQkJbS5JbXBvcnRhbmNlID0gaW1wb3J0YW5jZS5Ub1N0cmluZygpOwotCQkJbS5CdWlsZEVuZ2luZSA9IHRoaXMuQnVpbGRFbmdpbmU7Ci0JCQltLkV4ZWN1dGUoKTsKLQkJfQorICAgICAgICAvL3VzZSB0aGUgTWVzc2FnZSBCdWlsZCBUYXNrIHRvIHdyaXRlIHNvbWV0aGluZyB0byBidWlsZCBsb2cKKyAgICAgICAgcHJpdmF0ZSB2b2lkIExvZ01lc3NhZ2Uoc3RyaW5nIHRleHQsIE1lc3NhZ2VJbXBvcnRhbmNlIGltcG9ydGFuY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgICAgICBtLlRleHQgPSB0ZXh0OworICAgICAgICAgICAgbS5JbXBvcnRhbmNlID0gaW1wb3J0YW5jZS5Ub1N0cmluZygpOworICAgICAgICAgICAgbS5CdWlsZEVuZ2luZSA9IHRoaXMuQnVpbGRFbmdpbmU7CisgICAgICAgICAgICBtLkV4ZWN1dGUoKTsKKyAgICAgICAgfQogCi0JCS8vcmVjdXJzaXZlbHkgZmluZCAuY3MgZmlsZXMgaW4gc3JjRGlyLCBwYXRocyBzaG91bGQgaW5pdGlhbGx5IGJlIG5vbi1udWxsIGFuZCBlbXB0eQotCQlwcml2YXRlIHZvaWQgRmluZFNvdXJjZXNIZWxwZXIoc3RyaW5nIHNyY0RpciwgTGlzdDxzdHJpbmc+IHBhdGhzKQotCQl7Ci0JCQlzdHJpbmdbXSBmaWxlcyA9IERpcmVjdG9yeS5HZXRGaWxlcyhzcmNEaXIsICIqLmNzIik7Ci0JCQlmb3JlYWNoIChzdHJpbmcgZiBpbiBmaWxlcykKLQkJCXsKLQkJCQlwYXRocy5BZGQoZik7Ci0JCQl9Ci0JCQlzdHJpbmdbXSBkaXJzID0gRGlyZWN0b3J5LkdldERpcmVjdG9yaWVzKHNyY0Rpcik7Ci0JCQlmb3JlYWNoIChzdHJpbmcgZGlyIGluIGRpcnMpCi0JCQl7Ci0JCQkJRmluZFNvdXJjZXNIZWxwZXIoZGlyLCBwYXRocyk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgLy9yZWN1cnNpdmVseSBmaW5kIC5jcyBmaWxlcyBpbiBzcmNEaXIsIHBhdGhzIHNob3VsZCBpbml0aWFsbHkgYmUgbm9uLW51bGwgYW5kIGVtcHR5CisgICAgICAgIHByaXZhdGUgdm9pZCBGaW5kU291cmNlc0hlbHBlcihzdHJpbmcgc3JjRGlyLCBMaXN0PHN0cmluZz4gcGF0aHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZ1tdIGZpbGVzID0gRGlyZWN0b3J5LkdldEZpbGVzKHNyY0RpciwgIiouY3MiKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBmIGluIGZpbGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhdGhzLkFkZChmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmluZ1tdIGRpcnMgPSBEaXJlY3RvcnkuR2V0RGlyZWN0b3JpZXMoc3JjRGlyKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBkaXIgaW4gZGlycykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaW5kU291cmNlc0hlbHBlcihkaXIsIHBhdGhzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFF1b3RlIHBhdGhzIHdpdGggc3BhY2VzCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXByaXZhdGUgc3RyaW5nIFNhZmVQYXRoKHN0cmluZyBwYXRoKQotCQl7Ci0JCQlpZiAocGF0aC5Db250YWlucygnICcpICYmICFwYXRoLlN0YXJ0c1dpdGgoIlwiIikpCi0JCQl7Ci0JCQkJcmV0dXJuICJcIiIgKyBwYXRoICsgIlwiIjsKLQkJCX0KLQkJCXJldHVybiBwYXRoOwotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFF1b3RlIHBhdGhzIHdpdGggc3BhY2VzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgc3RyaW5nIFNhZmVQYXRoKHN0cmluZyBwYXRoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGF0aC5Db250YWlucygnICcpICYmICFwYXRoLlN0YXJ0c1dpdGgoIlwiIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJcIiIgKyBwYXRoICsgIlwiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwYXRoOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSBJVGFza0l0ZW1bXSBGaW5kU291cmNlcyhzdHJpbmcgc3JjRGlyKQotCQl7Ci0JCQlMaXN0PHN0cmluZz4gZmlsZXMgPSBuZXcgTGlzdDxzdHJpbmc+KCk7Ci0JCQlGaW5kU291cmNlc0hlbHBlcihzcmNEaXIsIGZpbGVzKTsKLQkJCUlUYXNrSXRlbVtdIGl0ZW1zID0gbmV3IElUYXNrSXRlbVtmaWxlcy5Db3VudF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLkxlbmd0aDsgaSsrKQotCQkJewotCQkJCWl0ZW1zW2ldID0gbmV3IFRhc2tJdGVtKGZpbGVzW2ldKTsKLQkJCX0KLQkJCXJldHVybiBpdGVtczsKLQkJfQorICAgICAgICBwcml2YXRlIElUYXNrSXRlbVtdIEZpbmRTb3VyY2VzKHN0cmluZyBzcmNEaXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIExpc3Q8c3RyaW5nPiBmaWxlcyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKKyAgICAgICAgICAgIEZpbmRTb3VyY2VzSGVscGVyKHNyY0RpciwgZmlsZXMpOworICAgICAgICAgICAgSVRhc2tJdGVtW10gaXRlbXMgPSBuZXcgSVRhc2tJdGVtW2ZpbGVzLkNvdW50XTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuTGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaXRlbXNbaV0gPSBuZXcgVGFza0l0ZW0oZmlsZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGl0ZW1zOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSBzdHJpbmcgTGFzdFdyaXRlVGltZShzdHJpbmcgZGVmRGlyKQotCQl7Ci0JCQlzdHJpbmdbXSBmaWxlcyA9IERpcmVjdG9yeS5HZXRGaWxlcyhkZWZEaXIsICIqLnRocmlmdCIpOwotCQkJRGF0ZVRpbWUgZCA9IChuZXcgRGlyZWN0b3J5SW5mbyhkZWZEaXIpKS5MYXN0V3JpdGVUaW1lOwotCQkJZm9yZWFjaChzdHJpbmcgZmlsZSBpbiBmaWxlcykKLQkJCXsKLQkJCQlGaWxlSW5mbyBmID0gbmV3IEZpbGVJbmZvKGZpbGUpOwotCQkJCURhdGVUaW1lIGN1cnIgPSBmLkxhc3RXcml0ZVRpbWU7Ci0JCQkJaWYgKERhdGVUaW1lLkNvbXBhcmUoY3VyciwgZCkgPiAwKQotCQkJCXsKLQkJCQkJZCA9IGN1cnI7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGQuVG9GaWxlVGltZVV0YygpLlRvU3RyaW5nKCk7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgTGFzdFdyaXRlVGltZShzdHJpbmcgZGVmRGlyKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmdbXSBmaWxlcyA9IERpcmVjdG9yeS5HZXRGaWxlcyhkZWZEaXIsICIqLnRocmlmdCIpOworICAgICAgICAgICAgRGF0ZVRpbWUgZCA9IChuZXcgRGlyZWN0b3J5SW5mbyhkZWZEaXIpKS5MYXN0V3JpdGVUaW1lOworICAgICAgICAgICAgZm9yZWFjaChzdHJpbmcgZmlsZSBpbiBmaWxlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxlSW5mbyBmID0gbmV3IEZpbGVJbmZvKGZpbGUpOworICAgICAgICAgICAgICAgIERhdGVUaW1lIGN1cnIgPSBmLkxhc3RXcml0ZVRpbWU7CisgICAgICAgICAgICAgICAgaWYgKERhdGVUaW1lLkNvbXBhcmUoY3VyciwgZCkgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZCA9IGN1cnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGQuVG9GaWxlVGltZVV0YygpLlRvU3RyaW5nKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFeGVjdXRlKCkKLQkJewotCQkJc3RyaW5nIGRlZkRpciA9IFNhZmVQYXRoKFRocmlmdERlZmluaXRpb25EaXIuSXRlbVNwZWMpOwotCQkJLy9sb29rIGZvciBsYXN0IGNvbXBpbGF0aW9uIHRpbWVzdGFtcAotCQkJc3RyaW5nIGxhc3RCdWlsZFBhdGggPSBQYXRoLkNvbWJpbmUoZGVmRGlyLCBsYXN0Q29tcGlsYXRpb25OYW1lKTsKLQkJCURpcmVjdG9yeUluZm8gZGVmRGlySW5mbyA9IG5ldyBEaXJlY3RvcnlJbmZvKGRlZkRpcik7Ci0JCQlzdHJpbmcgbGFzdFdyaXRlID0gTGFzdFdyaXRlVGltZShkZWZEaXIpOwotCQkJaWYgKEZpbGUuRXhpc3RzKGxhc3RCdWlsZFBhdGgpKQotCQkJewotCQkJCXN0cmluZyBsYXN0Q29tcCA9IEZpbGUuUmVhZEFsbFRleHQobGFzdEJ1aWxkUGF0aCk7Ci0JCQkJLy9kb24ndCByZWNvbXBpbGUgaWYgdGhlIHRocmlmdCBsaWJyYXJ5IGhhcyBiZWVuIHVwZGF0ZWQgc2luY2UgbGFzdENvbXAKLQkJCQlGaWxlSW5mbyBmID0gbmV3IEZpbGVJbmZvKFRocmlmdExpYnJhcnkuSXRlbVNwZWMpOwotCQkJCXN0cmluZyB0aHJpZnRMaWJUaW1lID0gZi5MYXN0V3JpdGVUaW1lVXRjLlRvRmlsZVRpbWVVdGMoKS5Ub1N0cmluZygpOwotCQkJCWlmIChsYXN0Q29tcC5Db21wYXJlVG8odGhyaWZ0TGliVGltZSkgPCAwKQotCQkJCXsKLQkJCQkJLy9uZXcgdGhyaWZ0IGxpYnJhcnksIGRvIGEgY29tcGlsZQotCQkJCQlsYXN0V3JpdGUgPSB0aHJpZnRMaWJUaW1lOwotCQkJCX0KLQkJCQllbHNlIGlmIChsYXN0Q29tcCA9PSBsYXN0V3JpdGUgfHwgKGxhc3RDb21wID09IHRocmlmdExpYlRpbWUgJiYgbGFzdENvbXAuQ29tcGFyZVRvKGxhc3RXcml0ZSkgPiAwKSkKLQkJCQl7Ci0JCQkJCS8vdGhlIC50aHJpZnQgZGlyIGhhc24ndCBiZWVuIHdyaXR0ZW4gdG8gc2luY2UgbGFzdCBjb21waWxhdGlvbiwgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZwotCQkJCQlMb2dNZXNzYWdlKCJUaHJpZnRJbXBsIHVwLXRvLWRhdGUiLCBNZXNzYWdlSW1wb3J0YW5jZS5IaWdoKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFeGVjdXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIGRlZkRpciA9IFNhZmVQYXRoKFRocmlmdERlZmluaXRpb25EaXIuSXRlbVNwZWMpOworICAgICAgICAgICAgLy9sb29rIGZvciBsYXN0IGNvbXBpbGF0aW9uIHRpbWVzdGFtcAorICAgICAgICAgICAgc3RyaW5nIGxhc3RCdWlsZFBhdGggPSBQYXRoLkNvbWJpbmUoZGVmRGlyLCBsYXN0Q29tcGlsYXRpb25OYW1lKTsKKyAgICAgICAgICAgIERpcmVjdG9yeUluZm8gZGVmRGlySW5mbyA9IG5ldyBEaXJlY3RvcnlJbmZvKGRlZkRpcik7CisgICAgICAgICAgICBzdHJpbmcgbGFzdFdyaXRlID0gTGFzdFdyaXRlVGltZShkZWZEaXIpOworICAgICAgICAgICAgaWYgKEZpbGUuRXhpc3RzKGxhc3RCdWlsZFBhdGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBsYXN0Q29tcCA9IEZpbGUuUmVhZEFsbFRleHQobGFzdEJ1aWxkUGF0aCk7CisgICAgICAgICAgICAgICAgLy9kb24ndCByZWNvbXBpbGUgaWYgdGhlIHRocmlmdCBsaWJyYXJ5IGhhcyBiZWVuIHVwZGF0ZWQgc2luY2UgbGFzdENvbXAKKyAgICAgICAgICAgICAgICBGaWxlSW5mbyBmID0gbmV3IEZpbGVJbmZvKFRocmlmdExpYnJhcnkuSXRlbVNwZWMpOworICAgICAgICAgICAgICAgIHN0cmluZyB0aHJpZnRMaWJUaW1lID0gZi5MYXN0V3JpdGVUaW1lVXRjLlRvRmlsZVRpbWVVdGMoKS5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIGlmIChsYXN0Q29tcC5Db21wYXJlVG8odGhyaWZ0TGliVGltZSkgPCAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9uZXcgdGhyaWZ0IGxpYnJhcnksIGRvIGEgY29tcGlsZQorICAgICAgICAgICAgICAgICAgICBsYXN0V3JpdGUgPSB0aHJpZnRMaWJUaW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChsYXN0Q29tcCA9PSBsYXN0V3JpdGUgfHwgKGxhc3RDb21wID09IHRocmlmdExpYlRpbWUgJiYgbGFzdENvbXAuQ29tcGFyZVRvKGxhc3RXcml0ZSkgPiAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vdGhlIC50aHJpZnQgZGlyIGhhc24ndCBiZWVuIHdyaXR0ZW4gdG8gc2luY2UgbGFzdCBjb21waWxhdGlvbiwgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZworICAgICAgICAgICAgICAgICAgICBMb2dNZXNzYWdlKCJUaHJpZnRJbXBsIHVwLXRvLWRhdGUiLCBNZXNzYWdlSW1wb3J0YW5jZS5IaWdoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQkvL2ZpbmQgdGhlIGRpcmVjdG9yeSBvZiB0aGUgdGhyaWZ0bGlicmFyeSAodGhhdCdzIHdoZXJlIG91dHB1dCB3aWxsIGdvKQotCQkJRmlsZUluZm8gdGhyaWZ0TGliSW5mbyA9IG5ldyBGaWxlSW5mbyhTYWZlUGF0aChUaHJpZnRMaWJyYXJ5Lkl0ZW1TcGVjKSk7Ci0JCQlzdHJpbmcgdGhyaWZ0RGlyID0gdGhyaWZ0TGliSW5mby5EaXJlY3RvcnkuRnVsbE5hbWU7CisgICAgICAgICAgICAvL2ZpbmQgdGhlIGRpcmVjdG9yeSBvZiB0aGUgdGhyaWZ0bGlicmFyeSAodGhhdCdzIHdoZXJlIG91dHB1dCB3aWxsIGdvKQorICAgICAgICAgICAgRmlsZUluZm8gdGhyaWZ0TGliSW5mbyA9IG5ldyBGaWxlSW5mbyhTYWZlUGF0aChUaHJpZnRMaWJyYXJ5Lkl0ZW1TcGVjKSk7CisgICAgICAgICAgICBzdHJpbmcgdGhyaWZ0RGlyID0gdGhyaWZ0TGliSW5mby5EaXJlY3RvcnkuRnVsbE5hbWU7CiAKLQkJCXN0cmluZyBnZW5EaXIgPSBQYXRoLkNvbWJpbmUodGhyaWZ0RGlyLCAiZ2VuLWNzaGFycCIpOwotCQkJaWYgKERpcmVjdG9yeS5FeGlzdHMoZ2VuRGlyKSkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCURpcmVjdG9yeS5EZWxldGUoZ2VuRGlyLCB0cnVlKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggeyAvKmVoIGkgdHJpZWQsIGp1c3Qgb3Zlci13cml0ZSBub3cqL30KLQkJCX0KKyAgICAgICAgICAgIHN0cmluZyBnZW5EaXIgPSBQYXRoLkNvbWJpbmUodGhyaWZ0RGlyLCAiZ2VuLWNzaGFycCIpOworICAgICAgICAgICAgaWYgKERpcmVjdG9yeS5FeGlzdHMoZ2VuRGlyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERpcmVjdG9yeS5EZWxldGUoZ2VuRGlyLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggeyAvKmVoIGkgdHJpZWQsIGp1c3Qgb3Zlci13cml0ZSBub3cqL30KKyAgICAgICAgICAgIH0KIAotCQkJLy9ydW4gdGhlIHRocmlmdCBleGVjdXRhYmxlIHRvIGdlbmVyYXRlIEMjCi0JCQlmb3JlYWNoIChzdHJpbmcgdGhyaWZ0RmlsZSBpbiBEaXJlY3RvcnkuR2V0RmlsZXMoZGVmRGlyLCAiKi50aHJpZnQiKSkKLQkJCXsKLQkJCQlMb2dNZXNzYWdlKCJHZW5lcmF0aW5nIGNvZGUgZm9yOiAiICsgdGhyaWZ0RmlsZSwgTWVzc2FnZUltcG9ydGFuY2UuTm9ybWFsKTsKLQkJCQlQcm9jZXNzIHAgPSBuZXcgUHJvY2VzcygpOwotCQkJCXAuU3RhcnRJbmZvLkZpbGVOYW1lID0gU2FmZVBhdGgoVGhyaWZ0RXhlY3V0YWJsZS5JdGVtU3BlYyk7Ci0JCQkJcC5TdGFydEluZm8uQXJndW1lbnRzID0gIi0tZ2VuIGNzaGFycCAtbyAiICsgU2FmZVBhdGgodGhyaWZ0RGlyKSArICIgLXIgIiArIHRocmlmdEZpbGU7Ci0JCQkJcC5TdGFydEluZm8uVXNlU2hlbGxFeGVjdXRlID0gZmFsc2U7Ci0JCQkJcC5TdGFydEluZm8uQ3JlYXRlTm9XaW5kb3cgPSB0cnVlOwotCQkJCXAuU3RhcnRJbmZvLlJlZGlyZWN0U3RhbmRhcmRPdXRwdXQgPSBmYWxzZTsKLQkJCQlwLlN0YXJ0KCk7Ci0JCQkJcC5XYWl0Rm9yRXhpdCgpOwotCQkJCWlmIChwLkV4aXRDb2RlICE9IDApCi0JCQkJewotCQkJCQlMb2dNZXNzYWdlKCJ0aHJpZnQuZXhlIGZhaWxlZCB0byBjb21waWxlICIgKyB0aHJpZnRGaWxlLCBNZXNzYWdlSW1wb3J0YW5jZS5IaWdoKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAocC5FeGl0Q29kZSAhPSAwKQotCQkJCXsKLQkJCQkJTG9nTWVzc2FnZSgidGhyaWZ0LmV4ZSBmYWlsZWQgdG8gY29tcGlsZSAiICsgdGhyaWZ0RmlsZSwgTWVzc2FnZUltcG9ydGFuY2UuSGlnaCk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICAvL3J1biB0aGUgdGhyaWZ0IGV4ZWN1dGFibGUgdG8gZ2VuZXJhdGUgQyMKKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyB0aHJpZnRGaWxlIGluIERpcmVjdG9yeS5HZXRGaWxlcyhkZWZEaXIsICIqLnRocmlmdCIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ01lc3NhZ2UoIkdlbmVyYXRpbmcgY29kZSBmb3I6ICIgKyB0aHJpZnRGaWxlLCBNZXNzYWdlSW1wb3J0YW5jZS5Ob3JtYWwpOworICAgICAgICAgICAgICAgIFByb2Nlc3MgcCA9IG5ldyBQcm9jZXNzKCk7CisgICAgICAgICAgICAgICAgcC5TdGFydEluZm8uRmlsZU5hbWUgPSBTYWZlUGF0aChUaHJpZnRFeGVjdXRhYmxlLkl0ZW1TcGVjKTsKKyAgICAgICAgICAgICAgICBwLlN0YXJ0SW5mby5Bcmd1bWVudHMgPSAiLS1nZW4gY3NoYXJwIC1vICIgKyBTYWZlUGF0aCh0aHJpZnREaXIpICsgIiAtciAiICsgdGhyaWZ0RmlsZTsKKyAgICAgICAgICAgICAgICBwLlN0YXJ0SW5mby5Vc2VTaGVsbEV4ZWN1dGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBwLlN0YXJ0SW5mby5DcmVhdGVOb1dpbmRvdyA9IHRydWU7CisgICAgICAgICAgICAgICAgcC5TdGFydEluZm8uUmVkaXJlY3RTdGFuZGFyZE91dHB1dCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHAuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICBwLldhaXRGb3JFeGl0KCk7CisgICAgICAgICAgICAgICAgaWYgKHAuRXhpdENvZGUgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExvZ01lc3NhZ2UoInRocmlmdC5leGUgZmFpbGVkIHRvIGNvbXBpbGUgIiArIHRocmlmdEZpbGUsIE1lc3NhZ2VJbXBvcnRhbmNlLkhpZ2gpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwLkV4aXRDb2RlICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMb2dNZXNzYWdlKCJ0aHJpZnQuZXhlIGZhaWxlZCB0byBjb21waWxlICIgKyB0aHJpZnRGaWxlLCBNZXNzYWdlSW1wb3J0YW5jZS5IaWdoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJQ3NjIGNzYyA9IG5ldyBDc2MoKTsKLQkJCWNzYy5UYXJnZXRUeXBlID0gImxpYnJhcnkiOwotCQkJY3NjLlJlZmVyZW5jZXMgPSBuZXcgSVRhc2tJdGVtW10geyBuZXcgVGFza0l0ZW0oVGhyaWZ0TGlicmFyeS5JdGVtU3BlYykgfTsKLQkJCWNzYy5FbWl0RGVidWdJbmZvcm1hdGlvbiA9IHRydWU7Ci0JCQlzdHJpbmcgb3V0cHV0UGF0aCA9IFBhdGguQ29tYmluZSh0aHJpZnREaXIsIE91dHB1dE5hbWUuSXRlbVNwZWMpOwotCQkJY3NjLk91dHB1dEFzc2VtYmx5ID0gbmV3IFRhc2tJdGVtKG91dHB1dFBhdGgpOwotCQkJY3NjLlNvdXJjZXMgPSBGaW5kU291cmNlcyhQYXRoLkNvbWJpbmUodGhyaWZ0RGlyLCAiZ2VuLWNzaGFycCIpKTsKLQkJCWNzYy5CdWlsZEVuZ2luZSA9IHRoaXMuQnVpbGRFbmdpbmU7Ci0JCQlMb2dNZXNzYWdlKCJDb21waWxpbmcgZ2VuZXJhdGVkIGNzLi4uIiwgTWVzc2FnZUltcG9ydGFuY2UuTm9ybWFsKTsKLQkJCWlmICghY3NjLkV4ZWN1dGUoKSkKLQkJCXsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9CisgICAgICAgICAgICBDc2MgY3NjID0gbmV3IENzYygpOworICAgICAgICAgICAgY3NjLlRhcmdldFR5cGUgPSAibGlicmFyeSI7CisgICAgICAgICAgICBjc2MuUmVmZXJlbmNlcyA9IG5ldyBJVGFza0l0ZW1bXSB7IG5ldyBUYXNrSXRlbShUaHJpZnRMaWJyYXJ5Lkl0ZW1TcGVjKSB9OworICAgICAgICAgICAgY3NjLkVtaXREZWJ1Z0luZm9ybWF0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIHN0cmluZyBvdXRwdXRQYXRoID0gUGF0aC5Db21iaW5lKHRocmlmdERpciwgT3V0cHV0TmFtZS5JdGVtU3BlYyk7CisgICAgICAgICAgICBjc2MuT3V0cHV0QXNzZW1ibHkgPSBuZXcgVGFza0l0ZW0ob3V0cHV0UGF0aCk7CisgICAgICAgICAgICBjc2MuU291cmNlcyA9IEZpbmRTb3VyY2VzKFBhdGguQ29tYmluZSh0aHJpZnREaXIsICJnZW4tY3NoYXJwIikpOworICAgICAgICAgICAgY3NjLkJ1aWxkRW5naW5lID0gdGhpcy5CdWlsZEVuZ2luZTsKKyAgICAgICAgICAgIExvZ01lc3NhZ2UoIkNvbXBpbGluZyBnZW5lcmF0ZWQgY3MuLi4iLCBNZXNzYWdlSW1wb3J0YW5jZS5Ob3JtYWwpOworICAgICAgICAgICAgaWYgKCFjc2MuRXhlY3V0ZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KIAotCQkJLy93cml0ZSBmaWxlIHRvIGRlZkRpciB0byBpbmRpY2F0ZSBhIGJ1aWxkIHdhcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkCi0JCQlGaWxlLldyaXRlQWxsVGV4dChsYXN0QnVpbGRQYXRoLCBsYXN0V3JpdGUpOworICAgICAgICAgICAgLy93cml0ZSBmaWxlIHRvIGRlZkRpciB0byBpbmRpY2F0ZSBhIGJ1aWxkIHdhcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkCisgICAgICAgICAgICBGaWxlLldyaXRlQWxsVGV4dChsYXN0QnVpbGRQYXRoLCBsYXN0V3JpdGUpOwogCi0JCQl0aHJpZnRJbXBsID0gbmV3IFRhc2tJdGVtKG91dHB1dFBhdGgpOworICAgICAgICAgICAgdGhyaWZ0SW1wbCA9IG5ldyBUYXNrSXRlbShvdXRwdXRQYXRoKTsKIAotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0TVNCdWlsZFRhc2suY3Nwcm9qIGIvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRNU0J1aWxkVGFzay5jc3Byb2oKaW5kZXggMTVjY2I3Zi4uYTMxOWRmMiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRNU0J1aWxkVGFzay5jc3Byb2oKKysrIGIvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRNU0J1aWxkVGFzay5jc3Byb2oKQEAgLTEsNCArMSw1IEBACi3vu788IS0tIAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQogICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgpAQCAtMTYsOCArMTcsNyBAQAogICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KICAgPFByb3BlcnR5R3JvdXA+CiAgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CiAgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgpAQCAtMzAsNiArMzAsMjUgQEAKICAgICA8QXNzZW1ibHlOYW1lPlRocmlmdE1TQnVpbGRUYXNrPC9Bc3NlbWJseU5hbWU+CiAgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KICAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+CisgICAgPEZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPC9GaWxlVXBncmFkZUZsYWdzPgorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+CisgICAgPFVwZ3JhZGVCYWNrdXBMb2NhdGlvbiAvPgorICAgIDxQdWJsaXNoVXJsPnB1Ymxpc2hcPC9QdWJsaXNoVXJsPgorICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPEluc3RhbGxGcm9tPkRpc2s8L0luc3RhbGxGcm9tPgorICAgIDxVcGRhdGVFbmFibGVkPmZhbHNlPC9VcGRhdGVFbmFibGVkPgorICAgIDxVcGRhdGVNb2RlPkZvcmVncm91bmQ8L1VwZGF0ZU1vZGU+CisgICAgPFVwZGF0ZUludGVydmFsPjc8L1VwZGF0ZUludGVydmFsPgorICAgIDxVcGRhdGVJbnRlcnZhbFVuaXRzPkRheXM8L1VwZGF0ZUludGVydmFsVW5pdHM+CisgICAgPFVwZGF0ZVBlcmlvZGljYWxseT5mYWxzZTwvVXBkYXRlUGVyaW9kaWNhbGx5PgorICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+CisgICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgorICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+CisgICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4wPC9BcHBsaWNhdGlvblZlcnNpb24+CisgICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4KKyAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KKyAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgogICA8L1Byb3BlcnR5R3JvdXA+CiAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgogICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgpAQCAtMzksNiArNTgsNyBAQAogICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KICAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KICAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgogICA8L1Byb3BlcnR5R3JvdXA+CiAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CiAgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CkBAIC00Nyw2ICs2Nyw3IEBACiAgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgogICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgogICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CiAgIDwvUHJvcGVydHlHcm91cD4KICAgPEl0ZW1Hcm91cD4KICAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5CdWlsZC5GcmFtZXdvcmsiIC8+CkBAIC02OSw2ICs5MCwyMyBAQAogICAgIDxDb21waWxlIEluY2x1ZGU9IlRocmlmdEJ1aWxkLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgogICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkNsaWVudC4zLjUiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMSBDbGllbnQgUHJvZmlsZTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41LlNQMSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5XaW5kb3dzLkluc3RhbGxlci4zLjEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+V2luZG93cyBJbnN0YWxsZXIgMy4xPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICA8L0l0ZW1Hcm91cD4KICAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KICAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4KICAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvY3NoYXJwL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM4NzE5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxLDYgQEAKKyMjIEMjIENvZGluZyBTdGFuZGFyZHMKKworUGxlYXNlIGZvbGxvdzoKKyAqIFtUaHJpZnQgR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCisgKiBbTVNETiBDIyBDb2RpbmcgQ29udmVudGlvbnNdKGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9mZjkyNjA3NC5hc3B4KQorICogW0MjIENvZGluZyBHdWlkZWxpbmVzXShodHRwOi8vY3NoYXJwZ3VpZGVsaW5lcy5jb2RlcGxleC5jb20vKQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzIGIvbGliL2NzaGFycC9zcmMvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YWZiNmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnMuY3MKQEAgLTAsMCArMSw5NCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKKworbmFtZXNwYWNlIFRocmlmdC5Db2xsZWN0aW9ucworeworICAgIHB1YmxpYyBjbGFzcyBUQ29sbGVjdGlvbnMKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoaXMgd2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgdHdvIGNvbGxlY3Rpb25zIGFyZSB2YWx1ZS13aXNlIHRoZSBzYW1lLgorICAgICAgICAvLy8gSWYgdGhlIGNvbGxlY3Rpb24gY29udGFpbnMgYSBjb2xsZWN0aW9uLCB0aGUgY29sbGVjdGlvbnMgd2lsbCBiZSBjb21wYXJlZCB1c2luZyB0aGlzIG1ldGhvZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIEVxdWFscyAoSUVudW1lcmFibGUgZmlyc3QsIElFbnVtZXJhYmxlIHNlY29uZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpcnN0ID09IG51bGwgJiYgc2Vjb25kID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmlyc3QgPT0gbnVsbCB8fCBzZWNvbmQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJRW51bWVyYXRvciBmaXRlciA9IGZpcnN0LkdldEVudW1lcmF0b3IgKCk7CisgICAgICAgICAgICBJRW51bWVyYXRvciBzaXRlciA9IHNlY29uZC5HZXRFbnVtZXJhdG9yICgpOworCisgICAgICAgICAgICBib29sIGZuZXh0ID0gZml0ZXIuTW92ZU5leHQgKCk7CisgICAgICAgICAgICBib29sIHNuZXh0ID0gc2l0ZXIuTW92ZU5leHQgKCk7CisgICAgICAgICAgICB3aGlsZSAoZm5leHQgJiYgc25leHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSUVudW1lcmFibGUgZmVudW0gPSBmaXRlci5DdXJyZW50IGFzIElFbnVtZXJhYmxlOworICAgICAgICAgICAgICAgIElFbnVtZXJhYmxlIHNlbnVtID0gc2l0ZXIuQ3VycmVudCBhcyBJRW51bWVyYWJsZTsKKyAgICAgICAgICAgICAgICBpZiAoZmVudW0gIT0gbnVsbCAmJiBzZW51bSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFFcXVhbHMoZmVudW0sIHNlbnVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZlbnVtID09IG51bGwgXiBzZW51bSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICghRXF1YWxzKGZpdGVyLkN1cnJlbnQsIHNpdGVyLkN1cnJlbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmbmV4dCA9IGZpdGVyLk1vdmVOZXh0KCk7CisgICAgICAgICAgICAgICAgc25leHQgPSBzaXRlci5Nb3ZlTmV4dCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZm5leHQgPT0gc25leHQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGlzIHJldHVybnMgYSBoYXNoY29kZSBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhlIGVudW1lcmFibGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEdldEhhc2hDb2RlIChJRW51bWVyYWJsZSBlbnVtZXJhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZW51bWVyYWJsZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgaGFzaGNvZGUgPSAwOworICAgICAgICAgICAgZm9yZWFjaCAob2JqZWN0IG9iaiBpbiBlbnVtZXJhYmxlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElFbnVtZXJhYmxlIGVudW0yID0gb2JqIGFzIElFbnVtZXJhYmxlOworICAgICAgICAgICAgICAgIGludCBvYmpIYXNoID0gZW51bTIgPT0gbnVsbCA/IG9iai5HZXRIYXNoQ29kZSAoKSA6IEdldEhhc2hDb2RlIChlbnVtMik7CisgICAgICAgICAgICAgICAgdW5jaGVja2VkCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBoYXNoY29kZSA9IChoYXNoY29kZSAqIDM5NykgXiAob2JqSGFzaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGhhc2hjb2RlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvQ29sbGVjdGlvbnMvVEhhc2hTZXQuY3MgYi9saWIvY3NoYXJwL3NyYy9Db2xsZWN0aW9ucy9USGFzaFNldC5jcwppbmRleCAwZGRlYTU0Li5lMjkyNzFhIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Db2xsZWN0aW9ucy9USGFzaFNldC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Db2xsZWN0aW9ucy9USGFzaFNldC5jcwpAQCAtMjEsMTIzICsyMSwxNDAgQEAKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogCisjaWYgU0lMVkVSTElHSFQKK3VzaW5nIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb247CisjZW5kaWYKKwogbmFtZXNwYWNlIFRocmlmdC5Db2xsZWN0aW9ucwogewotICAgICBbU2VyaWFsaXphYmxlXQotCXB1YmxpYyBjbGFzcyBUSGFzaFNldDxUPiA6IElDb2xsZWN0aW9uPFQ+Ci0JewotI2lmIE5FVF8yXzAKLQkJVERpY3RTZXQ8VD4gc2V0ID0gbmV3IFREaWN0U2V0PFQ+KCk7CisjaWYgU0lMVkVSTElHSFQKKyAgICBbRGF0YUNvbnRyYWN0XQogI2Vsc2UKLQkJSGFzaFNldDxUPiBzZXQgPSBuZXcgSGFzaFNldDxUPigpOworICAgIFtTZXJpYWxpemFibGVdCiAjZW5kaWYKLQkJcHVibGljIGludCBDb3VudAotCQl7Ci0JCQlnZXQgeyByZXR1cm4gc2V0LkNvdW50OyB9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbCBJc1JlYWRPbmx5Ci0JCXsKLQkJCWdldCB7IHJldHVybiBmYWxzZTsgfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgQWRkKFQgaXRlbSkKLQkJewotCQkJc2V0LkFkZChpdGVtKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIENsZWFyKCkKLQkJewotCQkJc2V0LkNsZWFyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbCBDb250YWlucyhUIGl0ZW0pCi0JCXsKLQkJCXJldHVybiBzZXQuQ29udGFpbnMoaXRlbSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBDb3B5VG8oVFtdIGFycmF5LCBpbnQgYXJyYXlJbmRleCkKLQkJewotCQkJc2V0LkNvcHlUbyhhcnJheSwgYXJyYXlJbmRleCk7Ci0JCX0KLQotCQlwdWJsaWMgSUVudW1lcmF0b3IgR2V0RW51bWVyYXRvcigpCi0JCXsKLQkJCXJldHVybiBzZXQuR2V0RW51bWVyYXRvcigpOwotCQl9Ci0KLQkJSUVudW1lcmF0b3I8VD4gSUVudW1lcmFibGU8VD4uR2V0RW51bWVyYXRvcigpCi0JCXsKLQkJCXJldHVybiAoKElFbnVtZXJhYmxlPFQ+KXNldCkuR2V0RW51bWVyYXRvcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2wgUmVtb3ZlKFQgaXRlbSkKLQkJewotCQkJcmV0dXJuIHNldC5SZW1vdmUoaXRlbSk7Ci0JCX0KLQotI2lmIE5FVF8yXzAKLQkJcHJpdmF0ZSBjbGFzcyBURGljdFNldDxWPiA6IElDb2xsZWN0aW9uPFY+Ci0JCXsKLQkJCURpY3Rpb25hcnk8ViwgVERpY3RTZXQ8Vj4+IGRpY3QgPSBuZXcgRGljdGlvbmFyeTxWLCBURGljdFNldDxWPj4oKTsKLQotCQkJcHVibGljIGludCBDb3VudAotCQkJewotCQkJCWdldCB7IHJldHVybiBkaWN0LkNvdW50OyB9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sIElzUmVhZE9ubHkKLQkJCXsKLQkJCQlnZXQgeyByZXR1cm4gZmFsc2U7IH0KLQkJCX0KLQotCQkJcHVibGljIElFbnVtZXJhdG9yIEdldEVudW1lcmF0b3IoKQotCQkJewotCQkJCXJldHVybiAoKElFbnVtZXJhYmxlKWRpY3QuS2V5cykuR2V0RW51bWVyYXRvcigpOwotCQkJfQotCi0JCQlJRW51bWVyYXRvcjxWPiBJRW51bWVyYWJsZTxWPi5HZXRFbnVtZXJhdG9yKCkKLQkJCXsKLQkJCQlyZXR1cm4gZGljdC5LZXlzLkdldEVudW1lcmF0b3IoKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2wgQWRkKFYgaXRlbSkKLQkJCXsKLQkJCQlpZiAoIWRpY3QuQ29udGFpbnNLZXkoaXRlbSkpCi0JCQkJewotCQkJCQlkaWN0W2l0ZW1dID0gdGhpczsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQl2b2lkIElDb2xsZWN0aW9uPFY+LkFkZChWIGl0ZW0pCi0JCQl7Ci0JCQkJQWRkKGl0ZW0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBDbGVhcigpCi0JCQl7Ci0JCQkJZGljdC5DbGVhcigpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbCBDb250YWlucyhWIGl0ZW0pCi0JCQl7Ci0JCQkJcmV0dXJuIGRpY3QuQ29udGFpbnNLZXkoaXRlbSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIENvcHlUbyhWW10gYXJyYXksIGludCBhcnJheUluZGV4KQotCQkJewotCQkJCWRpY3QuS2V5cy5Db3B5VG8oYXJyYXksIGFycmF5SW5kZXgpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbCBSZW1vdmUoViBpdGVtKQotCQkJewotCQkJCXJldHVybiBkaWN0LlJlbW92ZShpdGVtKTsKLQkJCX0KLQkJfQorICAgIHB1YmxpYyBjbGFzcyBUSGFzaFNldDxUPiA6IElDb2xsZWN0aW9uPFQ+CisgICAgeworI2lmIE5FVF8yXzAgfHwgU0lMVkVSTElHSFQKKyNpZiBTSUxWRVJMSUdIVAorICAgICAgICBbRGF0YU1lbWJlcl0KICNlbmRpZgotCX0KKyAgICAgICAgVERpY3RTZXQ8VD4gc2V0ID0gbmV3IFREaWN0U2V0PFQ+KCk7CisjZWxzZQorICAgICAgICBIYXNoU2V0PFQ+IHNldCA9IG5ldyBIYXNoU2V0PFQ+KCk7CisjZW5kaWYKKyAgICAgICAgcHVibGljIGludCBDb3VudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gc2V0LkNvdW50OyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBJc1JlYWRPbmx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgQWRkKFQgaXRlbSkKKyAgICAgICAgeworICAgICAgICAgICAgc2V0LkFkZChpdGVtKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFyKCkKKyAgICAgICAgeworICAgICAgICAgICAgc2V0LkNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBDb250YWlucyhUIGl0ZW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzZXQuQ29udGFpbnMoaXRlbSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBDb3B5VG8oVFtdIGFycmF5LCBpbnQgYXJyYXlJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgc2V0LkNvcHlUbyhhcnJheSwgYXJyYXlJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSUVudW1lcmF0b3IgR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzZXQuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgSUVudW1lcmF0b3I8VD4gSUVudW1lcmFibGU8VD4uR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoKElFbnVtZXJhYmxlPFQ+KXNldCkuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgUmVtb3ZlKFQgaXRlbSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNldC5SZW1vdmUoaXRlbSk7CisgICAgICAgIH0KKworI2lmIE5FVF8yXzAgfHwgU0lMVkVSTElHSFQKKyNpZiBTSUxWRVJMSUdIVAorICAgICAgICBbRGF0YUNvbnRyYWN0XQorI2VuZGlmCisgICAgICAgIHByaXZhdGUgY2xhc3MgVERpY3RTZXQ8Vj4gOiBJQ29sbGVjdGlvbjxWPgorICAgICAgICB7CisjaWYgU0lMVkVSTElHSFQKKyAgICAgICAgICAgIFtEYXRhTWVtYmVyXQorI2VuZGlmCisgICAgICAgICAgICBEaWN0aW9uYXJ5PFYsIFREaWN0U2V0PFY+PiBkaWN0ID0gbmV3IERpY3Rpb25hcnk8ViwgVERpY3RTZXQ8Vj4+KCk7CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgQ291bnQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gZGljdC5Db3VudDsgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBJc1JlYWRPbmx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBJRW51bWVyYXRvciBHZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChJRW51bWVyYWJsZSlkaWN0LktleXMpLkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgSUVudW1lcmF0b3I8Vj4gSUVudW1lcmFibGU8Vj4uR2V0RW51bWVyYXRvcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRpY3QuS2V5cy5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sIEFkZChWIGl0ZW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFkaWN0LkNvbnRhaW5zS2V5KGl0ZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGljdFtpdGVtXSA9IHRoaXM7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBJQ29sbGVjdGlvbjxWPi5BZGQoViBpdGVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFkZChpdGVtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgQ2xlYXIoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRpY3QuQ2xlYXIoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2wgQ29udGFpbnMoViBpdGVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBkaWN0LkNvbnRhaW5zS2V5KGl0ZW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBDb3B5VG8oVltdIGFycmF5LCBpbnQgYXJyYXlJbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaWN0LktleXMuQ29weVRvKGFycmF5LCBhcnJheUluZGV4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2wgUmVtb3ZlKFYgaXRlbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGljdC5SZW1vdmUoaXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvTmV0MzUvRXh0ZW5zaW9uc05ldDM1LmNzIGIvbGliL2NzaGFycC9zcmMvTmV0MzUvRXh0ZW5zaW9uc05ldDM1LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYTQyMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9OZXQzNS9FeHRlbnNpb25zTmV0MzUuY3MKQEAgLTAsMCArMSwzMSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCisjaWYgKCFORVQ0NSkKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICBzdGF0aWMgY2xhc3MgU3RyZWFtRXh0ZW5zaW9uc05ldDM1CisgICAgeworICAgICAgICAvLyBDb3B5VG8oKSBoYXMgYmVlbiBhZGRlZCBpbiA0LjAKKyAgICAgICAgcHVibGljIHN0YXRpYyBsb25nIENvcHlUbyh0aGlzIFN0cmVhbSBzb3VyY2UsIFN0cmVhbSB0YXJnZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs4MTkyXTsgIC8vIG11bHRpcGxlIG9mIDQwOTYKKyAgICAgICAgICAgIGxvbmcgblRvdGFsID0gMDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBuUmVhZCA9IHNvdXJjZS5SZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKG5SZWFkIDw9IDApICAvLyBkb25lPworICAgICAgICAgICAgICAgICAgICByZXR1cm4gblRvdGFsOworCisgICAgICAgICAgICAgICAgdGFyZ2V0LldyaXRlKGJ1ZmZlciwgMCwgblJlYWQpOworICAgICAgICAgICAgICAgIG5Ub3RhbCArPSBuUmVhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA5YzZlY2RkLi43ZTg2NzgxCi0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0xNCw0MyArMTQsNDIgQEAKICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQogICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXVzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOw0KLXVzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7DQotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOw0KLQ0KLS8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcNCi0vLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbg0KLS8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4NCi1bYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlRocmlmdCIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiQyMgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0iKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildDQotLy9AVE9ETyB3aGVyZSB0byBwdXQgTGljZW5zZSBpbmZvcm1hdGlvbj8NCi0NCi0vLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUNCi0vLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tDQotLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLg0KLVthc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldDQotDQotLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NDQotW2Fzc2VtYmx5OiBHdWlkKCJkZjNmOGVmMC1lMGEzLTRjODYtYTY1Yi04ZWM4NGUwMTZiMWQiKV0NCi0NCi0vLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOg0KLS8vDQotLy8gICAgICBNYWpvciBWZXJzaW9uDQotLy8gICAgICBNaW5vciBWZXJzaW9uDQotLy8gICAgICBCdWlsZCBOdW1iZXINCi0vLyAgICAgIFJldmlzaW9uDQotLy8NCi0vLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycw0KLS8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6DQotLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjAuNy4wLioiKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjAuNy4wLioiKV0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIkMjIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorLy9AVE9ETyB3aGVyZSB0byBwdXQgTGljZW5zZSBpbmZvcm1hdGlvbj8KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiZGYzZjhlZjAtZTBhMy00Yzg2LWE2NWItOGVjODRlMDE2YjFkIildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24KKy8vICAgICAgQnVpbGQgTnVtYmVyCisvLyAgICAgIFJldmlzaW9uCisvLworLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQWJzdHJhY3RCYXNlLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEFic3RyYWN0QmFzZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWE2MWNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEFic3RyYWN0QmFzZS5jcwpAQCAtMCwwICsxLDI5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCit7CisgICAgcHVibGljIGludGVyZmFjZSBUQWJzdHJhY3RCYXNlCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZXMgdGhlIG9iamVjdHMgb3V0IHRvIHRoZSBwcm90b2NvbC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgdm9pZCBXcml0ZShUUHJvdG9jb2wgdFByb3RvY29sKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmFzZS5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCYXNlLmNzCmluZGV4IDE5NjliYjMuLjQxMWU0ZDkgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCYXNlLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCYXNlLmNzCkBAIC0xOSwxNiArMTksMTEgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCXB1YmxpYyBpbnRlcmZhY2UgVEJhc2UKLQl7Ci0JCS8vLwotCQkvLy8gUmVhZHMgdGhlIFRPYmplY3QgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgcHJvdG9jb2wuCi0JCS8vLwotCQl2b2lkIFJlYWQoVFByb3RvY29sIHRQcm90b2NvbCk7Ci0KLQkJLy8vCi0JCS8vLyBXcml0ZXMgdGhlIG9iamVjdHMgb3V0IHRvIHRoZSBwcm90b2NvbAotCQkvLy8KLQkJdm9pZCBXcml0ZShUUHJvdG9jb2wgdFByb3RvY29sKTsKLQl9CisgICAgcHVibGljIGludGVyZmFjZSBUQmFzZSA6IFRBYnN0cmFjdEJhc2UKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWRzIHRoZSBUT2JqZWN0IGZyb20gdGhlIGdpdmVuIGlucHV0IHByb3RvY29sLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICB2b2lkIFJlYWQoVFByb3RvY29sIHRQcm90b2NvbCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJhc2U2NFV0aWxzLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJhc2U2NFV0aWxzLmNzCmluZGV4IGY4NTdkNmYuLjllYWFlYmQgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCYXNlNjRVdGlscy5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmFzZTY0VXRpbHMuY3MKQEAgLTIxLDgwICsyMSw4MCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0JaW50ZXJuYWwgc3RhdGljIGNsYXNzIFRCYXNlNjRVdGlscwotCXsKLQkJaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEVOQ09ERV9UQUJMRSA9Ci0JCQkiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CisgICAgaW50ZXJuYWwgc3RhdGljIGNsYXNzIFRCYXNlNjRVdGlscworICAgIHsKKyAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEVOQ09ERV9UQUJMRSA9CisgICAgICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CiAKLQkJaW50ZXJuYWwgc3RhdGljIHZvaWQgZW5jb2RlKGJ5dGVbXSBzcmMsIGludCBzcmNPZmYsIGludCBsZW4sIGJ5dGVbXSBkc3QsCi0JCQkJCQkJCWludCBkc3RPZmYpCi0JCXsKLQkJCWRzdFtkc3RPZmZdID0gKGJ5dGUpRU5DT0RFX1RBQkxFWyhzcmNbc3JjT2ZmXSA+PiAyKSAmIDB4M0ZdOwotCQkJaWYgKGxlbiA9PSAzKQotCQkJewotCQkJCWRzdFtkc3RPZmYgKyAxXSA9Ci0JCQkJCShieXRlKUVOQ09ERV9UQUJMRVsKLQkJCQkJCSgoc3JjW3NyY09mZl0gPDwgNCkgKyAoc3JjW3NyY09mZiArIDFdID4+IDQpKSAmIDB4M0ZdOwotCQkJCWRzdFtkc3RPZmYgKyAyXSA9Ci0JCQkJCShieXRlKUVOQ09ERV9UQUJMRVsKLQkJCQkJCSgoc3JjW3NyY09mZiArIDFdIDw8IDIpICsgKHNyY1tzcmNPZmYgKyAyXSA+PiA2KSkgJiAweDNGXTsKLQkJCQlkc3RbZHN0T2ZmICsgM10gPQotCQkJCQkoYnl0ZSlFTkNPREVfVEFCTEVbc3JjW3NyY09mZiArIDJdICYgMHgzRl07Ci0JCQl9Ci0JCQllbHNlIGlmIChsZW4gPT0gMikKLQkJCXsKLQkJCQlkc3RbZHN0T2ZmICsgMV0gPQotCQkJCQkoYnl0ZSlFTkNPREVfVEFCTEVbCi0JCQkJCQkoKHNyY1tzcmNPZmZdIDw8IDQpICsgKHNyY1tzcmNPZmYgKyAxXSA+PiA0KSkgJiAweDNGXTsKLQkJCQlkc3RbZHN0T2ZmICsgMl0gPQotCQkJCQkoYnl0ZSlFTkNPREVfVEFCTEVbKHNyY1tzcmNPZmYgKyAxXSA8PCAyKSAmIDB4M0ZdOworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBlbmNvZGUoYnl0ZVtdIHNyYywgaW50IHNyY09mZiwgaW50IGxlbiwgYnl0ZVtdIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdE9mZikKKyAgICAgICAgeworICAgICAgICAgICAgZHN0W2RzdE9mZl0gPSAoYnl0ZSlFTkNPREVfVEFCTEVbKHNyY1tzcmNPZmZdID4+IDIpICYgMHgzRl07CisgICAgICAgICAgICBpZiAobGVuID09IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFWworICAgICAgICAgICAgICAgICAgICAgICAgKChzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzApIHwgKChzcmNbc3JjT2ZmICsgMV0gPj4gNCkgJiAweDBGKV07CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDJdID0KKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFWworICAgICAgICAgICAgICAgICAgICAgICAgKChzcmNbc3JjT2ZmICsgMV0gPDwgMikgJiAweDNDKSB8ICgoc3JjW3NyY09mZiArIDJdID4+IDYpICYgMHgwMyldOworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAzXSA9CisgICAgICAgICAgICAgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRVtzcmNbc3JjT2ZmICsgMl0gJiAweDNGXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxlbiA9PSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9CisgICAgICAgICAgICAgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRVsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjW3NyY09mZl0gPDwgNCkgJiAweDMwKSB8ICgoc3JjW3NyY09mZiArIDFdID4+IDQpICYgMHgwRildOworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAyXSA9CisgICAgICAgICAgICAgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRVsoc3JjW3NyY09mZiArIDFdIDw8IDIpICYgMHgzQ107CiAKLQkJCX0KLQkJCWVsc2UKLQkJCXsgLy8gbGVuID09IDEpIHsKLQkJCQlkc3RbZHN0T2ZmICsgMV0gPQotCQkJCQkoYnl0ZSlFTkNPREVfVEFCTEVbKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzRl07Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgLy8gbGVuID09IDEpIHsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMV0gPQorICAgICAgICAgICAgICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEVbKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwcml2YXRlIHN0YXRpYyBpbnRbXSBERUNPREVfVEFCTEUgPSB7Ci0JCQktMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLQkJCS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotCQkJLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsNjIsLTEsLTEsLTEsNjMsCi0JCQk1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSwtMSwtMSwtMSwtMSwtMSwtMSwKLQkJCS0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LDEwLDExLDEyLDEzLDE0LAotCQkJMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsLTEsLTEsLTEsLTEsLTEsCi0JCQktMSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCwKLQkJCTQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLC0xLC0xLC0xLC0xLC0xLAotCQkJLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0JCQktMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLQkJCS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotCQkJLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0JCQktMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLQkJCS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotCQkJLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0JCQktMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLQkJfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gREVDT0RFX1RBQkxFID0geworICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDYyLC0xLC0xLC0xLDYzLAorICAgICAgICAgICAgNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwxMCwxMSwxMiwxMywxNCwKKyAgICAgICAgICAgIDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgLTEsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsCisgICAgICAgICAgICA0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgIH07CiAKLQkJaW50ZXJuYWwgc3RhdGljIHZvaWQgZGVjb2RlKGJ5dGVbXSBzcmMsIGludCBzcmNPZmYsIGludCBsZW4sIGJ5dGVbXSBkc3QsCi0JCQkJCQkJCSBpbnQgZHN0T2ZmKQotCQl7Ci0JCQlkc3RbZHN0T2ZmXSA9IChieXRlKQotCQkJCSgoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmZdICYgMHgwRkZdIDw8IDIpIHwKLQkJCQkoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAxXSAmIDB4MEZGXSA+PiA0KSk7Ci0JCQlpZiAobGVuID4gMikKLQkJCXsKLQkJCQlkc3RbZHN0T2ZmICsgMV0gPSAoYnl0ZSkKLQkJCQkJKCgoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAxXSAmIDB4MEZGXSA8PCA0KSAmIDB4RjApIHwKLQkJCQkJKERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmICsgMl0gJiAweDBGRl0gPj4gMikpOwotCQkJCWlmIChsZW4gPiAzKQotCQkJCXsKLQkJCQkJZHN0W2RzdE9mZiArIDJdID0gKGJ5dGUpCi0JCQkJCQkoKChERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDJdICYgMHgwRkZdIDw8IDYpICYgMHhDMCkgfAotCQkJCQkJREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAzXSAmIDB4MEZGXSk7Ci0JCQkJfQotCQkJfQotCQl9CisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIGRlY29kZShieXRlW10gc3JjLCBpbnQgc3JjT2ZmLCBpbnQgbGVuLCBieXRlW10gZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdE9mZikKKyAgICAgICAgeworICAgICAgICAgICAgZHN0W2RzdE9mZl0gPSAoYnl0ZSkKKyAgICAgICAgICAgICAgICAoKERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmXSAmIDB4MEZGXSA8PCAyKSB8CisgICAgICAgICAgICAgICAgKERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmICsgMV0gJiAweDBGRl0gPj4gNCkpOworICAgICAgICAgICAgaWYgKGxlbiA+IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0gKGJ5dGUpCisgICAgICAgICAgICAgICAgICAgICgoKERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmICsgMV0gJiAweDBGRl0gPDwgNCkgJiAweEYwKSB8CisgICAgICAgICAgICAgICAgICAgIChERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDJdICYgMHgwRkZdID4+IDIpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuID4gMykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAyXSA9IChieXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgKCgoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAyXSAmIDB4MEZGXSA8PCA2KSAmIDB4QzApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmICsgM10gJiAweDBGRl0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcwppbmRleCA0YjM5ODBlLi5hNGZhYTk0IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmNzCkBAIC0yNywzNzAgKzI3LDM2OSBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0JcHVibGljIGNsYXNzIFRCaW5hcnlQcm90b2NvbCA6IFRQcm90b2NvbAotCXsKLQkJcHJvdGVjdGVkIGNvbnN0IHVpbnQgVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMDsKLQkJcHJvdGVjdGVkIGNvbnN0IHVpbnQgVkVSU0lPTl8xID0gMHg4MDAxMDAwMDsKKyAgICBwdWJsaWMgY2xhc3MgVEJpbmFyeVByb3RvY29sIDogVFByb3RvY29sCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgY29uc3QgdWludCBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwOworICAgICAgICBwcm90ZWN0ZWQgY29uc3QgdWludCBWRVJTSU9OXzEgPSAweDgwMDEwMDAwOwogCi0JCXByb3RlY3RlZCBib29sIHN0cmljdFJlYWRfID0gZmFsc2U7Ci0JCXByb3RlY3RlZCBib29sIHN0cmljdFdyaXRlXyA9IHRydWU7CisgICAgICAgIHByb3RlY3RlZCBib29sIHN0cmljdFJlYWRfID0gZmFsc2U7CisgICAgICAgIHByb3RlY3RlZCBib29sIHN0cmljdFdyaXRlXyA9IHRydWU7CiAKLQkJcHJvdGVjdGVkIGludCByZWFkTGVuZ3RoXzsKLQkJcHJvdGVjdGVkIGJvb2wgY2hlY2tSZWFkTGVuZ3RoXyA9IGZhbHNlOworICAgICAgICAjcmVnaW9uIEJpbmFyeVByb3RvY29sIEZhY3RvcnkKIAorICAgICAgICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2wgc3RyaWN0UmVhZF8gPSBmYWxzZTsKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sIHN0cmljdFdyaXRlXyA9IHRydWU7CiAKLQkJI3JlZ2lvbiBCaW5hcnlQcm90b2NvbCBGYWN0b3J5Ci0JCSAvKioKLQkJICAqIEZhY3RvcnkKLQkJICAqLwotCQkgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeSB7CisgICAgICAgICAgICBwdWJsaWMgRmFjdG9yeSgpCisgICAgICAgICAgICAgICAgOiB0aGlzKGZhbHNlLCB0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQogCi0JCQkgIHByb3RlY3RlZCBib29sIHN0cmljdFJlYWRfID0gZmFsc2U7Ci0JCQkgIHByb3RlY3RlZCBib29sIHN0cmljdFdyaXRlXyA9IHRydWU7CisgICAgICAgICAgICBwdWJsaWMgRmFjdG9yeShib29sIHN0cmljdFJlYWQsIGJvb2wgc3RyaWN0V3JpdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaWN0UmVhZF8gPSBzdHJpY3RSZWFkOworICAgICAgICAgICAgICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOworICAgICAgICAgICAgfQogCi0JCQkgIHB1YmxpYyBGYWN0b3J5KCkKLQkJCQkgIDp0aGlzKGZhbHNlLCB0cnVlKQotCQkJICB7Ci0JCQkgIH0KKyAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucywgc3RyaWN0UmVhZF8sIHN0cmljdFdyaXRlXyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkJICBwdWJsaWMgRmFjdG9yeShib29sIHN0cmljdFJlYWQsIGJvb2wgc3RyaWN0V3JpdGUpCi0JCQkgIHsKLQkJCQkgIHN0cmljdFJlYWRfID0gc3RyaWN0UmVhZDsKLQkJCQkgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOwotCQkJICB9CisgICAgICAgICNlbmRyZWdpb24KIAotCQkJcHVibGljIFRQcm90b2NvbCBHZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKSB7Ci0JCQkgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zLCBzdHJpY3RSZWFkXywgc3RyaWN0V3JpdGVfKTsKLQkJCX0KLQkJICB9CisgICAgICAgIHB1YmxpYyBUQmluYXJ5UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIDogdGhpcyh0cmFucywgZmFsc2UsIHRydWUpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCSNlbmRyZWdpb24KKyAgICAgICAgcHVibGljIFRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zLCBib29sIHN0cmljdFJlYWQsIGJvb2wgc3RyaWN0V3JpdGUpCisgICAgICAgICAgICA6IGJhc2UodHJhbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmljdFJlYWRfID0gc3RyaWN0UmVhZDsKKyAgICAgICAgICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOworICAgICAgICB9CiAKLQkJcHVibGljIFRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQotCQkJOiB0aGlzKHRyYW5zLCBmYWxzZSwgdHJ1ZSkKLQkJewotCQl9CisgICAgICAgICNyZWdpb24gV3JpdGUgTWV0aG9kcwogCi0JCXB1YmxpYyBUQmluYXJ5UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucywgYm9vbCBzdHJpY3RSZWFkLCBib29sIHN0cmljdFdyaXRlKQotCQkJOmJhc2UodHJhbnMpCi0JCXsKLQkJCXN0cmljdFJlYWRfID0gc3RyaWN0UmVhZDsKLQkJCXN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJpY3RXcml0ZV8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludCB2ZXJzaW9uID0gVkVSU0lPTl8xIHwgKHVpbnQpKG1lc3NhZ2UuVHlwZSk7CisgICAgICAgICAgICAgICAgV3JpdGVJMzIoKGludCl2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBXcml0ZVN0cmluZyhtZXNzYWdlLk5hbWUpOworICAgICAgICAgICAgICAgIFdyaXRlSTMyKG1lc3NhZ2UuU2VxSUQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdyaXRlU3RyaW5nKG1lc3NhZ2UuTmFtZSk7CisgICAgICAgICAgICAgICAgV3JpdGVCeXRlKChzYnl0ZSltZXNzYWdlLlR5cGUpOworICAgICAgICAgICAgICAgIFdyaXRlSTMyKG1lc3NhZ2UuU2VxSUQpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJI3JlZ2lvbiBXcml0ZSBNZXRob2RzCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUVuZCgpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpCi0JCXsKLQkJCWlmIChzdHJpY3RXcml0ZV8pCi0JCQl7Ci0JCQkJdWludCB2ZXJzaW9uID0gVkVSU0lPTl8xIHwgKHVpbnQpKG1lc3NhZ2UuVHlwZSk7Ci0JCQkJV3JpdGVJMzIoKGludCl2ZXJzaW9uKTsKLQkJCQlXcml0ZVN0cmluZyhtZXNzYWdlLk5hbWUpOwotCQkJCVdyaXRlSTMyKG1lc3NhZ2UuU2VxSUQpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCVdyaXRlU3RyaW5nKG1lc3NhZ2UuTmFtZSk7Ci0JCQkJV3JpdGVCeXRlKChieXRlKW1lc3NhZ2UuVHlwZSk7Ci0JCQkJV3JpdGVJMzIobWVzc2FnZS5TZXFJRCk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1lc3NhZ2VFbmQoKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJ1Y3RFbmQoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWMpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJ5dGUoKHNieXRlKWZpZWxkLlR5cGUpOworICAgICAgICAgICAgV3JpdGVJMTYoZmllbGQuSUQpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJ1Y3RFbmQoKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpCi0JCXsKLQkJCVdyaXRlQnl0ZSgoYnl0ZSlmaWVsZC5UeXBlKTsKLQkJCVdyaXRlSTE2KGZpZWxkLklEKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkU3RvcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZSgoc2J5dGUpVFR5cGUuU3RvcCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkRW5kKCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWFwQmVnaW4oVE1hcCBtYXApCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZSgoc2J5dGUpbWFwLktleVR5cGUpOworICAgICAgICAgICAgV3JpdGVCeXRlKChzYnl0ZSltYXAuVmFsdWVUeXBlKTsKKyAgICAgICAgICAgIFdyaXRlSTMyKG1hcC5Db3VudCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkU3RvcCgpCi0JCXsKLQkJCVdyaXRlQnl0ZSgoYnl0ZSlUVHlwZS5TdG9wKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1hcEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWFwQmVnaW4oVE1hcCBtYXApCi0JCXsKLQkJCVdyaXRlQnl0ZSgoYnl0ZSltYXAuS2V5VHlwZSk7Ci0JCQlXcml0ZUJ5dGUoKGJ5dGUpbWFwLlZhbHVlVHlwZSk7Ci0JCQlXcml0ZUkzMihtYXAuQ291bnQpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZSgoc2J5dGUpbGlzdC5FbGVtZW50VHlwZSk7CisgICAgICAgICAgICBXcml0ZUkzMihsaXN0LkNvdW50KTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWFwRW5kKCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTGlzdEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpCi0JCXsKLQkJCVdyaXRlQnl0ZSgoYnl0ZSlsaXN0LkVsZW1lbnRUeXBlKTsKLQkJCVdyaXRlSTMyKGxpc3QuQ291bnQpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU2V0QmVnaW4oVFNldCBzZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZSgoc2J5dGUpc2V0LkVsZW1lbnRUeXBlKTsKKyAgICAgICAgICAgIFdyaXRlSTMyKHNldC5Db3VudCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RFbmQoKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTZXRFbmQoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEJlZ2luKFRTZXQgc2V0KQotCQl7Ci0JCQlXcml0ZUJ5dGUoKGJ5dGUpc2V0LkVsZW1lbnRUeXBlKTsKLQkJCVdyaXRlSTMyKHNldC5Db3VudCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCb29sKGJvb2wgYikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVCeXRlKGIgPyAoc2J5dGUpMSA6IChzYnl0ZSkwKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU2V0RW5kKCkKLQkJewotCQl9CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIGJvdXQgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCeXRlKHNieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvdXRbMF0gPSAoYnl0ZSliOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoYm91dCwgMCwgMSk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJvb2woYm9vbCBiKQotCQl7Ci0JCQlXcml0ZUJ5dGUoYiA/IChieXRlKTEgOiAoYnl0ZSkwKTsKLQkJfQorICAgICAgICBwcml2YXRlIGJ5dGVbXSBpMTZvdXQgPSBuZXcgYnl0ZVsyXTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMTYoc2hvcnQgcykKKyAgICAgICAgeworICAgICAgICAgICAgaTE2b3V0WzBdID0gKGJ5dGUpKDB4ZmYgJiAocyA+PiA4KSk7CisgICAgICAgICAgICBpMTZvdXRbMV0gPSAoYnl0ZSkoMHhmZiAmIHMpOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoaTE2b3V0LCAwLCAyKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgYnl0ZVtdIGJvdXQgPSBuZXcgYnl0ZVsxXTsKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCeXRlKGJ5dGUgYikKLQkJewotCQkJYm91dFswXSA9IGI7Ci0JCQl0cmFucy5Xcml0ZShib3V0LCAwLCAxKTsKLQkJfQorICAgICAgICBwcml2YXRlIGJ5dGVbXSBpMzJvdXQgPSBuZXcgYnl0ZVs0XTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMzIoaW50IGkzMikKKyAgICAgICAgeworICAgICAgICAgICAgaTMyb3V0WzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDI0KSk7CisgICAgICAgICAgICBpMzJvdXRbMV0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gMTYpKTsKKyAgICAgICAgICAgIGkzMm91dFsyXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiA4KSk7CisgICAgICAgICAgICBpMzJvdXRbM10gPSAoYnl0ZSkoMHhmZiAmIGkzMik7CisgICAgICAgICAgICB0cmFucy5Xcml0ZShpMzJvdXQsIDAsIDQpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSBieXRlW10gaTE2b3V0ID0gbmV3IGJ5dGVbMl07Ci0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTE2KHNob3J0IHMpCi0JCXsKLQkJCWkxNm91dFswXSA9IChieXRlKSgweGZmICYgKHMgPj4gOCkpOwotCQkJaTE2b3V0WzFdID0gKGJ5dGUpKDB4ZmYgJiBzKTsKLQkJCXRyYW5zLldyaXRlKGkxNm91dCwgMCwgMik7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gaTY0b3V0ID0gbmV3IGJ5dGVbOF07CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTY0KGxvbmcgaTY0KQorICAgICAgICB7CisgICAgICAgICAgICBpNjRvdXRbMF0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNTYpKTsKKyAgICAgICAgICAgIGk2NG91dFsxXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA0OCkpOworICAgICAgICAgICAgaTY0b3V0WzJdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDQwKSk7CisgICAgICAgICAgICBpNjRvdXRbM10gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMzIpKTsKKyAgICAgICAgICAgIGk2NG91dFs0XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAyNCkpOworICAgICAgICAgICAgaTY0b3V0WzVdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDE2KSk7CisgICAgICAgICAgICBpNjRvdXRbNl0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gOCkpOworICAgICAgICAgICAgaTY0b3V0WzddID0gKGJ5dGUpKDB4ZmYgJiBpNjQpOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoaTY0b3V0LCAwLCA4KTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgYnl0ZVtdIGkzMm91dCA9IG5ldyBieXRlWzRdOwotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUkzMihpbnQgaTMyKQotCQl7Ci0JCQlpMzJvdXRbMF0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gMjQpKTsKLQkJCWkzMm91dFsxXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiAxNikpOwotCQkJaTMyb3V0WzJdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDgpKTsKLQkJCWkzMm91dFszXSA9IChieXRlKSgweGZmICYgaTMyKTsKLQkJCXRyYW5zLldyaXRlKGkzMm91dCwgMCwgNCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVEb3VibGUoZG91YmxlIGQpCisgICAgICAgIHsKKyNpZiAhU0lMVkVSTElHSFQKKyAgICAgICAgICAgIFdyaXRlSTY0KEJpdENvbnZlcnRlci5Eb3VibGVUb0ludDY0Qml0cyhkKSk7CisjZWxzZQorICAgICAgICAgICAgdmFyIGJ5dGVzID0gQml0Q29udmVydGVyLkdldEJ5dGVzKGQpOworICAgICAgICAgICAgV3JpdGVJNjQoQml0Q29udmVydGVyLlRvSW50NjQoYnl0ZXMsIDApKTsKKyNlbmRpZgorICAgICAgICB9CiAKLQkJcHJpdmF0ZSBieXRlW10gaTY0b3V0ID0gbmV3IGJ5dGVbOF07Ci0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTY0KGxvbmcgaTY0KQotCQl7Ci0JCQlpNjRvdXRbMF0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNTYpKTsKLQkJCWk2NG91dFsxXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA0OCkpOwotCQkJaTY0b3V0WzJdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDQwKSk7Ci0JCQlpNjRvdXRbM10gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMzIpKTsKLQkJCWk2NG91dFs0XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAyNCkpOwotCQkJaTY0b3V0WzVdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDE2KSk7Ci0JCQlpNjRvdXRbNl0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gOCkpOwotCQkJaTY0b3V0WzddID0gKGJ5dGUpKDB4ZmYgJiBpNjQpOwotCQkJdHJhbnMuV3JpdGUoaTY0b3V0LCAwLCA4KTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJpbmFyeShieXRlW10gYikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVJMzIoYi5MZW5ndGgpOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoYiwgMCwgYi5MZW5ndGgpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVEb3VibGUoZG91YmxlIGQpCi0JCXsKLQkJCVdyaXRlSTY0KEJpdENvbnZlcnRlci5Eb3VibGVUb0ludDY0Qml0cyhkKSk7Ci0JCX0KKyAgICAgICAgI2VuZHJlZ2lvbgogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQmluYXJ5KGJ5dGVbXSBiKQotCQl7Ci0JCQlXcml0ZUkzMihiLkxlbmd0aCk7Ci0JCQl0cmFucy5Xcml0ZShiLCAwLCBiLkxlbmd0aCk7Ci0JCX0KKyAgICAgICAgI3JlZ2lvbiBSZWFkTWV0aG9kcwogCi0JCSNlbmRyZWdpb24KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRNZXNzYWdlIFJlYWRNZXNzYWdlQmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBUTWVzc2FnZSBtZXNzYWdlID0gbmV3IFRNZXNzYWdlKCk7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IFJlYWRJMzIoKTsKKyAgICAgICAgICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50IHZlcnNpb24gPSAodWludClzaXplICYgVkVSU0lPTl9NQVNLOworICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLCAiQmFkIHZlcnNpb24gaW4gUmVhZE1lc3NhZ2VCZWdpbjogIiArIHZlcnNpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZXNzYWdlLlR5cGUgPSAoVE1lc3NhZ2VUeXBlKShzaXplICYgMHgwMDAwMDBmZik7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5OYW1lID0gUmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQgPSBSZWFkSTMyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmljdFJlYWRfKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sICJNaXNzaW5nIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbiwgb2xkIGNsaWVudD8iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVzc2FnZS5OYW1lID0gUmVhZFN0cmluZ0JvZHkoc2l6ZSk7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5UeXBlID0gKFRNZXNzYWdlVHlwZSlSZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQgPSBSZWFkSTMyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICAgICAgfQogCi0JCSNyZWdpb24gUmVhZE1ldGhvZHMKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1lc3NhZ2VFbmQoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgVE1lc3NhZ2UgUmVhZE1lc3NhZ2VCZWdpbigpCi0JCXsKLQkJCVRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoKTsKLQkJCWludCBzaXplID0gUmVhZEkzMigpOwotCQkJaWYgKHNpemUgPCAwKQotCQkJewotCQkJCXVpbnQgdmVyc2lvbiA9ICh1aW50KXNpemUgJiBWRVJTSU9OX01BU0s7Ci0JCQkJaWYgKHZlcnNpb24gIT0gVkVSU0lPTl8xKQotCQkJCXsKLQkJCQkJdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sICJCYWQgdmVyc2lvbiBpbiBSZWFkTWVzc2FnZUJlZ2luOiAiICsgdmVyc2lvbik7Ci0JCQkJfQotCQkJCW1lc3NhZ2UuVHlwZSA9IChUTWVzc2FnZVR5cGUpKHNpemUgJiAweDAwMDAwMGZmKTsKLQkJCQltZXNzYWdlLk5hbWUgPSBSZWFkU3RyaW5nKCk7Ci0JCQkJbWVzc2FnZS5TZXFJRCA9IFJlYWRJMzIoKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoc3RyaWN0UmVhZF8pCi0JCQkJewotCQkJCQl0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwgIk1pc3NpbmcgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luLCBvbGQgY2xpZW50PyIpOwotCQkJCX0KLQkJCQltZXNzYWdlLk5hbWUgPSBSZWFkU3RyaW5nQm9keShzaXplKTsKLQkJCQltZXNzYWdlLlR5cGUgPSAoVE1lc3NhZ2VUeXBlKVJlYWRCeXRlKCk7Ci0JCQkJbWVzc2FnZS5TZXFJRCA9IFJlYWRJMzIoKTsKLQkJCX0KLQkJCXJldHVybiBtZXNzYWdlOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUU3RydWN0IFJlYWRTdHJ1Y3RCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVFN0cnVjdCgpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1lc3NhZ2VFbmQoKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZFN0cnVjdEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBUU3RydWN0IFJlYWRTdHJ1Y3RCZWdpbigpCi0JCXsKLQkJCXJldHVybiBuZXcgVFN0cnVjdCgpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBURmllbGQgUmVhZEZpZWxkQmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7CisgICAgICAgICAgICBmaWVsZC5UeXBlID0gKFRUeXBlKVJlYWRCeXRlKCk7CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZFN0cnVjdEVuZCgpCi0JCXsKLQkJfQorICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgIT0gVFR5cGUuU3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWVsZC5JRCA9IFJlYWRJMTYoKTsKKyAgICAgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgVEZpZWxkIFJlYWRGaWVsZEJlZ2luKCkKLQkJewotCQkJVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgpOwotCQkJZmllbGQuVHlwZSA9IChUVHlwZSlSZWFkQnl0ZSgpOworICAgICAgICAgICAgcmV0dXJuIGZpZWxkOworICAgICAgICB9CiAKLQkJCWlmIChmaWVsZC5UeXBlICE9IFRUeXBlLlN0b3ApCi0JCQl7Ci0JCQkJZmllbGQuSUQgPSBSZWFkSTE2KCk7Ci0JCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRGaWVsZEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCQlyZXR1cm4gZmllbGQ7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRNYXAgUmVhZE1hcEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgVE1hcCBtYXAgPSBuZXcgVE1hcCgpOworICAgICAgICAgICAgbWFwLktleVR5cGUgPSAoVFR5cGUpUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIG1hcC5WYWx1ZVR5cGUgPSAoVFR5cGUpUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIG1hcC5Db3VudCA9IFJlYWRJMzIoKTsKIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkRmllbGRFbmQoKQotCQl7Ci0JCX0KKyAgICAgICAgICAgIHJldHVybiBtYXA7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgVE1hcCBSZWFkTWFwQmVnaW4oKQotCQl7Ci0JCQlUTWFwIG1hcCA9IG5ldyBUTWFwKCk7Ci0JCQltYXAuS2V5VHlwZSA9IChUVHlwZSlSZWFkQnl0ZSgpOwotCQkJbWFwLlZhbHVlVHlwZSA9IChUVHlwZSlSZWFkQnl0ZSgpOwotCQkJbWFwLkNvdW50ID0gUmVhZEkzMigpOworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTWFwRW5kKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJCXJldHVybiBtYXA7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRMaXN0IFJlYWRMaXN0QmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBUTGlzdCBsaXN0ID0gbmV3IFRMaXN0KCk7CisgICAgICAgICAgICBsaXN0LkVsZW1lbnRUeXBlID0gKFRUeXBlKVJlYWRCeXRlKCk7CisgICAgICAgICAgICBsaXN0LkNvdW50ID0gUmVhZEkzMigpOwogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRNYXBFbmQoKQotCQl7Ci0JCX0KKyAgICAgICAgICAgIHJldHVybiBsaXN0OworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIFRMaXN0IFJlYWRMaXN0QmVnaW4oKQotCQl7Ci0JCQlUTGlzdCBsaXN0ID0gbmV3IFRMaXN0KCk7Ci0JCQlsaXN0LkVsZW1lbnRUeXBlID0gKFRUeXBlKVJlYWRCeXRlKCk7Ci0JCQlsaXN0LkNvdW50ID0gUmVhZEkzMigpOworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTGlzdEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCQlyZXR1cm4gbGlzdDsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVFNldCBSZWFkU2V0QmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBUU2V0IHNldCA9IG5ldyBUU2V0KCk7CisgICAgICAgICAgICBzZXQuRWxlbWVudFR5cGUgPSAoVFR5cGUpUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIHNldC5Db3VudCA9IFJlYWRJMzIoKTsKIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTGlzdEVuZCgpCi0JCXsKLQkJfQorICAgICAgICAgICAgcmV0dXJuIHNldDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBUU2V0IFJlYWRTZXRCZWdpbigpCi0JCXsKLQkJCVRTZXQgc2V0ID0gbmV3IFRTZXQoKTsKLQkJCXNldC5FbGVtZW50VHlwZSA9IChUVHlwZSlSZWFkQnl0ZSgpOwotCQkJc2V0LkNvdW50ID0gUmVhZEkzMigpOworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU2V0RW5kKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJCXJldHVybiBzZXQ7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgUmVhZEJvb2woKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUmVhZEJ5dGUoKSA9PSAxOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZFNldEVuZCgpCi0JCXsKLQkJfQorICAgICAgICBwcml2YXRlIGJ5dGVbXSBiaW4gPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHNieXRlIFJlYWRCeXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEFsbChiaW4sIDAsIDEpOworICAgICAgICAgICAgcmV0dXJuIChzYnl0ZSliaW5bMF07CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgYm9vbCBSZWFkQm9vbCgpCi0JCXsKLQkJCXJldHVybiBSZWFkQnl0ZSgpID09IDE7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gaTE2aW4gPSBuZXcgYnl0ZVsyXTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHNob3J0IFJlYWRJMTYoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkQWxsKGkxNmluLCAwLCAyKTsKKyAgICAgICAgICAgIHJldHVybiAoc2hvcnQpKCgoaTE2aW5bMF0gJiAweGZmKSA8PCA4KSB8ICgoaTE2aW5bMV0gJiAweGZmKSkpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSBieXRlW10gYmluID0gbmV3IGJ5dGVbMV07Ci0JCXB1YmxpYyBvdmVycmlkZSBieXRlIFJlYWRCeXRlKCkKLQkJewotCQkJUmVhZEFsbChiaW4sIDAsIDEpOwotCQkJcmV0dXJuIGJpblswXTsKLQkJfQorICAgICAgICBwcml2YXRlIGJ5dGVbXSBpMzJpbiA9IG5ldyBieXRlWzRdOworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWRJMzIoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkQWxsKGkzMmluLCAwLCA0KTsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSgoKGkzMmluWzBdICYgMHhmZikgPDwgMjQpIHwgKChpMzJpblsxXSAmIDB4ZmYpIDw8IDE2KSB8ICgoaTMyaW5bMl0gJiAweGZmKSA8PCA4KSB8ICgoaTMyaW5bM10gJiAweGZmKSkpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSBieXRlW10gaTE2aW4gPSBuZXcgYnl0ZVsyXTsKLQkJcHVibGljIG92ZXJyaWRlIHNob3J0IFJlYWRJMTYoKQotCQl7Ci0JCQlSZWFkQWxsKGkxNmluLCAwLCAyKTsKLQkJCXJldHVybiAoc2hvcnQpKCgoaTE2aW5bMF0gJiAweGZmKSA8PCA4KSB8ICgoaTE2aW5bMV0gJiAweGZmKSkpOwotCQl9CisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSA2NzUKIAotCQlwcml2YXRlIGJ5dGVbXSBpMzJpbiA9IG5ldyBieXRlWzRdOwotCQlwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWRJMzIoKQotCQl7Ci0JCQlSZWFkQWxsKGkzMmluLCAwLCA0KTsKLQkJCXJldHVybiAoaW50KSgoKGkzMmluWzBdICYgMHhmZikgPDwgMjQpIHwgKChpMzJpblsxXSAmIDB4ZmYpIDw8IDE2KSB8ICgoaTMyaW5bMl0gJiAweGZmKSA8PCA4KSB8ICgoaTMyaW5bM10gJiAweGZmKSkpOwotCQl9CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIGk2NGluID0gbmV3IGJ5dGVbOF07CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBsb25nIFJlYWRJNjQoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkQWxsKGk2NGluLCAwLCA4KTsKKyAgICAgICAgICAgIHVuY2hlY2tlZAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAobG9uZykoCisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bMF0gJiAweGZmKSA8PCA1NikgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzFdICYgMHhmZikgPDwgNDgpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpblsyXSAmIDB4ZmYpIDw8IDQwKSB8CisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bM10gJiAweGZmKSA8PCAzMikgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzRdICYgMHhmZikgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpbls1XSAmIDB4ZmYpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bNl0gJiAweGZmKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bN10gJiAweGZmKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHJpdmF0ZSBieXRlW10gaTY0aW4gPSBuZXcgYnl0ZVs4XTsKLQkJcHVibGljIG92ZXJyaWRlIGxvbmcgUmVhZEk2NCgpCi0JCXsKLQkJCVJlYWRBbGwoaTY0aW4sIDAsIDgpOwotCQkJcmV0dXJuIChsb25nKSgoKGxvbmcpKGk2NGluWzBdICYgMHhmZikgPDwgNTYpIHwgKChsb25nKShpNjRpblsxXSAmIDB4ZmYpIDw8IDQ4KSB8ICgobG9uZykoaTY0aW5bMl0gJiAweGZmKSA8PCA0MCkgfCAoKGxvbmcpKGk2NGluWzNdICYgMHhmZikgPDwgMzIpIHwKLQkJCQkoKGxvbmcpKGk2NGluWzRdICYgMHhmZikgPDwgMjQpIHwgKChsb25nKShpNjRpbls1XSAmIDB4ZmYpIDw8IDE2KSB8ICgobG9uZykoaTY0aW5bNl0gJiAweGZmKSA8PCA4KSB8ICgobG9uZykoaTY0aW5bN10gJiAweGZmKSkpOwotCQl9CisjcHJhZ21hIHdhcm5pbmcgcmVzdG9yZSA2NzUKIAotCQlwdWJsaWMgb3ZlcnJpZGUgZG91YmxlIFJlYWREb3VibGUoKQotCQl7Ci0JCQlyZXR1cm4gQml0Q29udmVydGVyLkludDY0Qml0c1RvRG91YmxlKFJlYWRJNjQoKSk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGRvdWJsZSBSZWFkRG91YmxlKCkKKyAgICAgICAgeworI2lmICFTSUxWRVJMSUdIVAorICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5JbnQ2NEJpdHNUb0RvdWJsZShSZWFkSTY0KCkpOworI2Vsc2UKKyAgICAgICAgICAgIHZhciB2YWx1ZSA9IFJlYWRJNjQoKTsKKyAgICAgICAgICAgIHZhciBieXRlcyA9IEJpdENvbnZlcnRlci5HZXRCeXRlcyh2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLlRvRG91YmxlKGJ5dGVzLCAwKTsKKyNlbmRpZgorICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgU2V0UmVhZExlbmd0aChpbnQgcmVhZExlbmd0aCkKLQkJewotCQkJcmVhZExlbmd0aF8gPSByZWFkTGVuZ3RoOwotCQkJY2hlY2tSZWFkTGVuZ3RoXyA9IHRydWU7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJ5dGVbXSBSZWFkQmluYXJ5KCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHNpemUgPSBSZWFkSTMyKCk7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgICAgICB0cmFucy5SZWFkQWxsKGJ1ZiwgMCwgc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgc3RyaW5nIFJlYWRTdHJpbmdCb2R5KGludCBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgICAgICB0cmFucy5SZWFkQWxsKGJ1ZiwgMCwgc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgfQogCi0JCXByb3RlY3RlZCB2b2lkIENoZWNrUmVhZExlbmd0aChpbnQgbGVuZ3RoKQotCQl7Ci0JCQlpZiAoY2hlY2tSZWFkTGVuZ3RoXykKLQkJCXsKLQkJCQlyZWFkTGVuZ3RoXyAtPSBsZW5ndGg7Ci0JCQkJaWYgKHJlYWRMZW5ndGhfIDwgMCkKLQkJCQl7Ci0JCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIk1lc3NhZ2UgbGVuZ3RoIGV4Y2VlZGVkOiAiICsgbGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBpbnQgUmVhZEFsbChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJhbnMuUmVhZEFsbChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBieXRlW10gUmVhZEJpbmFyeSgpCi0JCXsKLQkJCWludCBzaXplID0gUmVhZEkzMigpOwotCQkJQ2hlY2tSZWFkTGVuZ3RoKHNpemUpOwotCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW3NpemVdOwotCQkJdHJhbnMuUmVhZEFsbChidWYsIDAsIHNpemUpOwotCQkJcmV0dXJuIGJ1ZjsKLQkJfQotCQlwcml2YXRlICBzdHJpbmcgUmVhZFN0cmluZ0JvZHkoaW50IHNpemUpCi0JCXsKLQkJCUNoZWNrUmVhZExlbmd0aChzaXplKTsKLQkJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtzaXplXTsKLQkJCXRyYW5zLlJlYWRBbGwoYnVmLCAwLCBzaXplKTsKLQkJCXJldHVybiBFbmNvZGluZy5VVEY4LkdldFN0cmluZyhidWYpOwotCQl9Ci0KLQkJcHJpdmF0ZSBpbnQgUmVhZEFsbChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQotCQl7Ci0JCQlDaGVja1JlYWRMZW5ndGgobGVuKTsKLQkJCXJldHVybiB0cmFucy5SZWFkQWxsKGJ1Ziwgb2ZmLCBsZW4pOwotCQl9Ci0KLQkJI2VuZHJlZ2lvbgotCX0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNjczOTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmNzCkBAIC0wLDAgKzEsODQ5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKK3sKKyAgICBwdWJsaWMgY2xhc3MgVENvbXBhY3RQcm90b2NvbCA6IFRQcm90b2NvbAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVFN0cnVjdCBBTk9OWU1PVVNfU1RSVUNUID0gbmV3IFRTdHJ1Y3QoIiIpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBURmllbGQgVFNUT1AgPSBuZXcgVEZpZWxkKCIiLCBUVHlwZS5TdG9wLCAoc2hvcnQpMCk7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHR0eXBlVG9Db21wYWN0VHlwZSA9IG5ldyBieXRlWzE2XTsKKworICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgUFJPVE9DT0xfSUQgPSAweDgyOworICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVkVSU0lPTiA9IDE7CisgICAgICAgIHByaXZhdGUgY29uc3QgYnl0ZSBWRVJTSU9OX01BU0sgPSAweDFmOyAvLyAwMDAxIDExMTEKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBieXRlIFRZUEVfTUFTSyA9IDB4RTA7IC8vIDExMTAgMDAwMAorICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVFlQRV9CSVRTID0gMHgwNzsgLy8gMDAwMCAwMTExCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBbGwgb2YgdGhlIG9uLXdpcmUgdHlwZSBjb2Rlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHlwZXMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgU1RPUCA9IDB4MDA7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBCT09MRUFOX1RSVUUgPSAweDAxOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgQk9PTEVBTl9GQUxTRSA9IDB4MDI7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBCWVRFID0gMHgwMzsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEkxNiA9IDB4MDQ7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBJMzIgPSAweDA1OworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgSTY0ID0gMHgwNjsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIERPVUJMRSA9IDB4MDc7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBCSU5BUlkgPSAweDA4OworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgTElTVCA9IDB4MDk7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBTRVQgPSAweDBBOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgTUFQID0gMHgwQjsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIFNUUlVDVCA9IDB4MEM7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAorICAgICAgICAvLy8gc28gd2UgY2FuIGRvIHRoZSBkZWx0YSBzdHVmZi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBTdGFjazxzaG9ydD4gbGFzdEZpZWxkXyA9IG5ldyBTdGFjazxzaG9ydD4oMTUpOworCisgICAgICAgIHByaXZhdGUgc2hvcnQgbGFzdEZpZWxkSWRfID0gMDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZSBzbyBpdCBjYW4KKyAgICAgICAgLy8vIGhhdmUgdGhlIHZhbHVlIGluY29ycG9yYXRlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBOdWxsYWJsZTxURmllbGQ+IGJvb2xlYW5GaWVsZF87CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSWYgd2UgUmVhZCBhIGZpZWxkIGhlYWRlciwgYW5kIGl0J3MgYSBib29sZWFuIGZpZWxkLCBzYXZlIHRoZSBib29sZWFuCisgICAgICAgIC8vLyB2YWx1ZSBoZXJlIHNvIHRoYXQgUmVhZEJvb2wgY2FuIHVzZSBpdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBOdWxsYWJsZTxCb29sZWFuPiBib29sVmFsdWVfOworCisKKyAgICAgICAgI3JlZ2lvbiBDb21wYWN0UHJvdG9jb2wgRmFjdG9yeQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgRmFjdG9yeSgpIHsgfQorCisgICAgICAgICAgICBwdWJsaWMgVFByb3RvY29sIEdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBwdWJsaWMgVENvbXBhY3RQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgOiBiYXNlKHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5TdG9wXSA9IFR5cGVzLlNUT1A7CisgICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5Cb29sXSA9IFR5cGVzLkJPT0xFQU5fVFJVRTsKKyAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLkJ5dGVdID0gVHlwZXMuQllURTsKKyAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLkkxNl0gPSBUeXBlcy5JMTY7CisgICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5JMzJdID0gVHlwZXMuSTMyOworICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuSTY0XSA9IFR5cGVzLkk2NDsKKyAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLkRvdWJsZV0gPSBUeXBlcy5ET1VCTEU7CisgICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5TdHJpbmddID0gVHlwZXMuQklOQVJZOworICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuTGlzdF0gPSBUeXBlcy5MSVNUOworICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuU2V0XSA9IFR5cGVzLlNFVDsKKyAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLk1hcF0gPSBUeXBlcy5NQVA7CisgICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5TdHJ1Y3RdID0gVHlwZXMuU1RSVUNUOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoKQorICAgICAgICB7CisgICAgICAgICAgICBsYXN0RmllbGRfLkNsZWFyKCk7CisgICAgICAgICAgICBsYXN0RmllbGRJZF8gPSAwOworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBXcml0ZSBNZXRob2RzCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCisgICAgICAgIC8vLyBVc2VkIGludGVybmFsbHkgYnkgb3RoZXIgd3JpdGluZyBtZXRob2RzIHRoYXQga25vdyB0aGV5IG5lZWQgdG8gV3JpdGUgYSBieXRlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGJ5dGVbXSBieXRlRGlyZWN0QnVmZmVyID0gbmV3IGJ5dGVbMV07CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlQnl0ZURpcmVjdChieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVEaXJlY3RCdWZmZXJbMF0gPSBiOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoYnl0ZURpcmVjdEJ1ZmZlcik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlQnl0ZURpcmVjdChpbnQgbikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KChieXRlKW4pOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICAgICAgLy8vIFRPRE86IG1ha2UgYSBwZXJtYW5lbnQgYnVmZmVyIGxpa2UgV3JpdGVWYXJpbnQ2ND8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgYnl0ZVtdIGkzMmJ1ZiA9IG5ldyBieXRlWzVdOworCisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZVZhcmludDMyKHVpbnQgbikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGlkeCA9IDA7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKG4gJiB+MHg3RikgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGkzMmJ1ZltpZHgrK10gPSAoYnl0ZSluOworICAgICAgICAgICAgICAgICAgICAvLyBXcml0ZUJ5dGVEaXJlY3QoKGJ5dGUpbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGkzMmJ1ZltpZHgrK10gPSAoYnl0ZSkoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgICAgICAgICAgICAgICAvLyBXcml0ZUJ5dGVEaXJlY3QoKGJ5dGUpKChuICYgMHg3RikgfCAweDgwKSk7CisgICAgICAgICAgICAgICAgICAgIG4gPj49IDc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhbnMuV3JpdGUoaTMyYnVmLCAwLCBpZHgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBtZXNzYWdlIGhlYWRlciB0byB0aGUgd2lyZS4gQ29tcGFjdCBQcm90b2NvbCBtZXNzYWdlcyBjb250YWluIHRoZQorICAgICAgICAvLy8gcHJvdG9jb2wgdmVyc2lvbiBzbyB3ZSBjYW4gbWlncmF0ZSBmb3J3YXJkcyBpbiB0aGUgZnV0dXJlIGlmIG5lZWQgYmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdChQUk9UT0NPTF9JRCk7CisgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoKGJ5dGUpKChWRVJTSU9OICYgVkVSU0lPTl9NQVNLKSB8ICgoKCh1aW50KW1lc3NhZ2UuVHlwZSkgPDwgVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9NQVNLKSkpOworICAgICAgICAgICAgV3JpdGVWYXJpbnQzMigodWludCltZXNzYWdlLlNlcUlEKTsKKyAgICAgICAgICAgIFdyaXRlU3RyaW5nKG1lc3NhZ2UuTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIHN0cnVjdCBiZWdpbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UKKyAgICAgICAgLy8vIHVzZSBpdCBhcyBhbiBvcHBvcnR1bml0eSB0byBwdXQgc3BlY2lhbCBwbGFjZWhvbGRlciBtYXJrZXJzIG9uIHRoZSBmaWVsZAorICAgICAgICAvLy8gc3RhY2sgc28gd2UgY2FuIGdldCB0aGUgZmllbGQgaWQgZGVsdGFzIGNvcnJlY3QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJjdCkKKyAgICAgICAgeworICAgICAgICAgICAgbGFzdEZpZWxkXy5QdXNoKGxhc3RGaWVsZElkXyk7CisgICAgICAgICAgICBsYXN0RmllbGRJZF8gPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBzdHJ1Y3QgZW5kLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZSB1c2UKKyAgICAgICAgLy8vIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcG9wIHRoZSBsYXN0IGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgc3RydWN0IG9mZgorICAgICAgICAvLy8gb2YgdGhlIGZpZWxkIHN0YWNrLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cnVjdEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxhc3RGaWVsZElkXyA9IGxhc3RGaWVsZF8uUG9wKCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIGZpZWxkIGhlYWRlciBjb250YWluaW5nIHRoZSBmaWVsZCBpZCBhbmQgZmllbGQgdHlwZS4gSWYgdGhlCisgICAgICAgIC8vLyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgZmllbGQgaWQgYW5kIHRoZSBsYXN0IG9uZSBpcyBzbWFsbCAoJmx0OyAxNSksCisgICAgICAgIC8vLyB0aGVuIHRoZSBmaWVsZCBpZCB3aWxsIGJlIGVuY29kZWQgaW4gdGhlIDQgTVNCIGFzIGEgZGVsdGEuIE90aGVyd2lzZSwgdGhlCisgICAgICAgIC8vLyBmaWVsZCBpZCB3aWxsIGZvbGxvdyB0aGUgdHlwZSBoZWFkZXIgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5Cb29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHdlIHdhbnQgdG8gcG9zc2libHkgaW5jbHVkZSB0aGUgdmFsdWUsIHNvIHdlJ2xsIHdhaXQuCisgICAgICAgICAgICAgICAgYm9vbGVhbkZpZWxkXyA9IGZpZWxkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdyaXRlRmllbGRCZWdpbkludGVybmFsKGZpZWxkLCAweEZGKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB3b3JraG9yc2Ugb2YgV3JpdGVGaWVsZEJlZ2luLiBJdCBoYXMgdGhlIG9wdGlvbiBvZiBkb2luZyBhCisgICAgICAgIC8vLyAndHlwZSBvdmVycmlkZScgb2YgdGhlIHR5cGUgaGVhZGVyLiBUaGlzIGlzIHVzZWQgc3BlY2lmaWNhbGx5IGluIHRoZQorICAgICAgICAvLy8gYm9vbGVhbiBmaWVsZCBjYXNlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoVEZpZWxkIGZpZWxkLCBieXRlIHR5cGVPdmVycmlkZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gc2hvcnQgbGFzdEZpZWxkID0gbGFzdEZpZWxkXy5Qb3AoKTsKKworICAgICAgICAgICAgLy8gaWYgdGhlcmUncyBhIHR5cGUgb3ZlcnJpZGUsIHVzZSB0aGF0LgorICAgICAgICAgICAgYnl0ZSB0eXBlVG9Xcml0ZSA9IHR5cGVPdmVycmlkZSA9PSAweEZGID8gZ2V0Q29tcGFjdFR5cGUoZmllbGQuVHlwZSkgOiB0eXBlT3ZlcnJpZGU7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAorICAgICAgICAgICAgaWYgKGZpZWxkLklEID4gbGFzdEZpZWxkSWRfICYmIGZpZWxkLklEIC0gbGFzdEZpZWxkSWRfIDw9IDE1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFdyaXRlIHRoZW0gdG9nZXRoZXIKKyAgICAgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoKGZpZWxkLklEIC0gbGFzdEZpZWxkSWRfKSA8PCA0IHwgdHlwZVRvV3JpdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFdyaXRlIHRoZW0gc2VwYXJhdGUKKyAgICAgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QodHlwZVRvV3JpdGUpOworICAgICAgICAgICAgICAgIFdyaXRlSTE2KGZpZWxkLklEKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGFzdEZpZWxkSWRfID0gZmllbGQuSUQ7CisgICAgICAgICAgICAvLyBsYXN0RmllbGRfLnB1c2goZmllbGQuaWQpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgdGhlIFNUT1Agc3ltYm9sIHNvIHdlIGtub3cgdGhlcmUgYXJlIG5vIG1vcmUgZmllbGRzIGluIHRoaXMgc3RydWN0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkU3RvcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdChUeXBlcy5TVE9QKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgbWFwIGhlYWRlci4gSWYgdGhlIG1hcCBpcyBlbXB0eSwgb21pdCB0aGUga2V5IGFuZCB2YWx1ZSB0eXBlCisgICAgICAgIC8vLyBoZWFkZXJzLCBhcyB3ZSBkb24ndCBuZWVkIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHNraXAgaXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWFwQmVnaW4oVE1hcCBtYXApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtYXAuQ291bnQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgV3JpdGVWYXJpbnQzMigodWludCltYXAuQ291bnQpOworICAgICAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdChnZXRDb21wYWN0VHlwZShtYXAuS2V5VHlwZSkgPDwgNCB8IGdldENvbXBhY3RUeXBlKG1hcC5WYWx1ZVR5cGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgbGlzdCBoZWFkZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQ29sbGVjdGlvbkJlZ2luKGxpc3QuRWxlbWVudFR5cGUsIGxpc3QuQ291bnQpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBzZXQgaGVhZGVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEJlZ2luKFRTZXQgc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUNvbGxlY3Rpb25CZWdpbihzZXQuRWxlbWVudFR5cGUsIHNldC5Db3VudCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIGJvb2xlYW4gdmFsdWUuIFBvdGVudGlhbGx5LCB0aGlzIGNvdWxkIGJlIGEgYm9vbGVhbiBmaWVsZCwgaW4KKyAgICAgICAgLy8vIHdoaWNoIGNhc2UgdGhlIGZpZWxkIGhlYWRlciBpbmZvIGlzbid0IHdyaXR0ZW4geWV0LiBJZiBzbywgZGVjaWRlIHdoYXQgdGhlCisgICAgICAgIC8vLyByaWdodCB0eXBlIGhlYWRlciBpcyBmb3IgdGhlIHZhbHVlIGFuZCB0aGVuIFdyaXRlIHRoZSBmaWVsZCBoZWFkZXIuCisgICAgICAgIC8vLyBPdGhlcndpc2UsIFdyaXRlIGEgc2luZ2xlIGJ5dGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQm9vbChCb29sZWFuIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChib29sZWFuRmllbGRfICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0CisgICAgICAgICAgICAgICAgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoYm9vbGVhbkZpZWxkXy5WYWx1ZSwgYiA/IFR5cGVzLkJPT0xFQU5fVFJVRSA6IFR5cGVzLkJPT0xFQU5fRkFMU0UpOworICAgICAgICAgICAgICAgIGJvb2xlYW5GaWVsZF8gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3QgV3JpdGUgdGhlIHZhbHVlLgorICAgICAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdChiID8gVHlwZXMuQk9PTEVBTl9UUlVFIDogVHlwZXMuQk9PTEVBTl9GQUxTRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIGJ5dGUuIE5vdGhpbmcgdG8gc2VlIGhlcmUhCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQnl0ZShzYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoKGJ5dGUpYik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhbiBJMTYgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUkxNihzaG9ydCBpMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlVmFyaW50MzIoaW50VG9aaWdaYWcoaTE2KSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhbiBpMzIgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUkzMihpbnQgaTMyKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZVZhcmludDMyKGludFRvWmlnWmFnKGkzMikpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYW4gaTY0IGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJNjQobG9uZyBpNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlVmFyaW50NjQobG9uZ1RvWmlnemFnKGk2NCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBkb3VibGUgdG8gdGhlIHdpcmUgYXMgOCBieXRlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVEb3VibGUoZG91YmxlIGR1YikKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtdIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworICAgICAgICAgICAgZml4ZWRMb25nVG9CeXRlcyhCaXRDb252ZXJ0ZXIuRG91YmxlVG9JbnQ2NEJpdHMoZHViKSwgZGF0YSwgMCk7CisgICAgICAgICAgICB0cmFucy5Xcml0ZShkYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSB3aXJlIHdpdGggYSB2YXJpbnQgc2l6ZSBwcmVjZWRpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RyaW5nKHN0cmluZyBzdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IFVURjhFbmNvZGluZy5VVEY4LkdldEJ5dGVzKHN0cik7CisgICAgICAgICAgICBXcml0ZUJpbmFyeShieXRlcywgMCwgYnl0ZXMuTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgYnl0ZSBhcnJheSwgdXNpbmcgYSB2YXJpbnQgZm9yIHRoZSBzaXplLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJpbmFyeShieXRlW10gYmluKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJpbmFyeShiaW4sIDAsIGJpbi5MZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlQmluYXJ5KGJ5dGVbXSBidWYsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlVmFyaW50MzIoKHVpbnQpbGVuZ3RoKTsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIGJ5IHN0cnVjdHMsIGJ1dCBkb24ndCBhY3R1YWxseSBoYXZlIGFueSB3aXJlCisgICAgICAgIC8vIG91dHB1dCBvciBwdXJwb3NlLgorICAgICAgICAvLworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUVuZCgpIHsgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1hcEVuZCgpIHsgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RFbmQoKSB7IH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTZXRFbmQoKSB7IH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZEVuZCgpIHsgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEludGVybmFsIHdyaXRpbmcgbWV0aG9kcworICAgICAgICAvLworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFic3RyYWN0IG1ldGhvZCBmb3Igd3JpdGluZyB0aGUgc3RhcnQgb2YgbGlzdHMgYW5kIHNldHMuIExpc3QgYW5kIHNldHMgb24KKyAgICAgICAgLy8vIHRoZSB3aXJlIGRpZmZlciBvbmx5IGJ5IHRoZSB0eXBlIGluZGljYXRvci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgV3JpdGVDb2xsZWN0aW9uQmVnaW4oVFR5cGUgZWxlbVR5cGUsIGludCBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2l6ZSA8PSAxNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3Qoc2l6ZSA8PCA0IHwgZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoMHhmMCB8IGdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSk7CisgICAgICAgICAgICAgICAgV3JpdGVWYXJpbnQzMigodWludClzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBieXRlW10gdmFyaW50NjRvdXQgPSBuZXcgYnl0ZVsxMF07CisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZVZhcmludDY0KHVsb25nIG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpZHggPSAwOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChuICYgfih1bG9uZykweDdGTCkgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhcmludDY0b3V0W2lkeCsrXSA9IChieXRlKW47CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXJpbnQ2NG91dFtpZHgrK10gPSAoKGJ5dGUpKChuICYgMHg3RikgfCAweDgwKSk7CisgICAgICAgICAgICAgICAgICAgIG4gPj49IDc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhbnMuV3JpdGUodmFyaW50NjRvdXQsIDAsIGlkeCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgICAgICAgIC8vLyByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdWxvbmcgbG9uZ1RvWmlnemFnKGxvbmcgbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICh1bG9uZykobiA8PCAxKSBeICh1bG9uZykobiA+PiA2Myk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBpbnQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAgICAgICAgLy8vIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB1aW50IGludFRvWmlnWmFnKGludCBuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKHVpbnQpKG4gPDwgMSkgXiAodWludCkobiA+PiAzMSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGEgbG9uZyBpbnRvIGxpdHRsZS1lbmRpYW4gYnl0ZXMgaW4gYnVmIHN0YXJ0aW5nIGF0IG9mZiBhbmQgZ29pbmcKKyAgICAgICAgLy8vIHVudGlsIG9mZis3LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHZvaWQgZml4ZWRMb25nVG9CeXRlcyhsb25nIG4sIGJ5dGVbXSBidWYsIGludCBvZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyAwXSA9IChieXRlKShuICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgMV0gPSAoYnl0ZSkoKG4gPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyAyXSA9IChieXRlKSgobiA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyAzXSA9IChieXRlKSgobiA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyA0XSA9IChieXRlKSgobiA+PiAzMikgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyA1XSA9IChieXRlKSgobiA+PiA0MCkgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyA2XSA9IChieXRlKSgobiA+PiA0OCkgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyA3XSA9IChieXRlKSgobiA+PiA1NikgJiAweGZmKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIFJlYWRNZXRob2RzCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIG1lc3NhZ2UgaGVhZGVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVE1lc3NhZ2UgUmVhZE1lc3NhZ2VCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGUgcHJvdG9jb2xJZCA9IChieXRlKVJlYWRCeXRlKCk7CisgICAgICAgICAgICBpZiAocHJvdG9jb2xJZCAhPSBQUk9UT0NPTF9JRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJFeHBlY3RlZCBwcm90b2NvbCBpZCAiICsgUFJPVE9DT0xfSUQuVG9TdHJpbmcoIlgiKSArICIgYnV0IGdvdCAiICsgcHJvdG9jb2xJZC5Ub1N0cmluZygiWCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ5dGUgdmVyc2lvbkFuZFR5cGUgPSAoYnl0ZSlSZWFkQnl0ZSgpOworICAgICAgICAgICAgYnl0ZSB2ZXJzaW9uID0gKGJ5dGUpKHZlcnNpb25BbmRUeXBlICYgVkVSU0lPTl9NQVNLKTsKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT04pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiRXhwZWN0ZWQgdmVyc2lvbiAiICsgVkVSU0lPTiArICIgYnV0IGdvdCAiICsgdmVyc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBieXRlIHR5cGUgPSAoYnl0ZSkoKHZlcnNpb25BbmRUeXBlID4+IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfQklUUyk7CisgICAgICAgICAgICBpbnQgc2VxaWQgPSAoaW50KVJlYWRWYXJpbnQzMigpOworICAgICAgICAgICAgc3RyaW5nIG1lc3NhZ2VOYW1lID0gUmVhZFN0cmluZygpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBUTWVzc2FnZShtZXNzYWdlTmFtZSwgKFRNZXNzYWdlVHlwZSl0eXBlLCBzZXFpZCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgc3RydWN0IGJlZ2luLiBUaGVyZSdzIG5vdGhpbmcgb24gdGhlIHdpcmUgZm9yIHRoaXMsIGJ1dCBpdCBpcyBvdXIKKyAgICAgICAgLy8vIG9wcG9ydHVuaXR5IHRvIHB1c2ggYSBuZXcgc3RydWN0IGJlZ2luIG1hcmtlciBvbnRvIHRoZSBmaWVsZCBzdGFjay4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRTdHJ1Y3QgUmVhZFN0cnVjdEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgbGFzdEZpZWxkXy5QdXNoKGxhc3RGaWVsZElkXyk7CisgICAgICAgICAgICBsYXN0RmllbGRJZF8gPSAwOworICAgICAgICAgICAgcmV0dXJuIEFOT05ZTU9VU19TVFJVQ1Q7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvcgorICAgICAgICAvLy8gdGhpcyBzdHJ1Y3QgZnJvbSB0aGUgZmllbGQgc3RhY2suCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRTdHJ1Y3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBjb25zdW1lIHRoZSBsYXN0IGZpZWxkIHdlIFJlYWQgb2ZmIHRoZSB3aXJlLgorICAgICAgICAgICAgbGFzdEZpZWxkSWRfID0gbGFzdEZpZWxkXy5Qb3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBmaWVsZCBoZWFkZXIgb2ZmIHRoZSB3aXJlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVEZpZWxkIFJlYWRGaWVsZEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZSB0eXBlID0gKGJ5dGUpUmVhZEJ5dGUoKTsKKworICAgICAgICAgICAgLy8gaWYgaXQncyBhIHN0b3AsIHRoZW4gd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseSwgYXMgdGhlIHN0cnVjdCBpcyBvdmVyLgorICAgICAgICAgICAgaWYgKHR5cGUgPT0gVHlwZXMuU1RPUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFNUT1A7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNob3J0IGZpZWxkSWQ7CisKKyAgICAgICAgICAgIC8vIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KKyAgICAgICAgICAgIHNob3J0IG1vZGlmaWVyID0gKHNob3J0KSgodHlwZSAmIDB4ZjApID4+IDQpOworICAgICAgICAgICAgaWYgKG1vZGlmaWVyID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbm90IGEgZGVsdGEuIGxvb2sgYWhlYWQgZm9yIHRoZSB6aWd6YWcgdmFyaW50IGZpZWxkIGlkLgorICAgICAgICAgICAgICAgIGZpZWxkSWQgPSBSZWFkSTE2KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaGFzIGEgZGVsdGEuIGFkZCB0aGUgZGVsdGEgdG8gdGhlIGxhc3QgUmVhZCBmaWVsZCBpZC4KKyAgICAgICAgICAgICAgICBmaWVsZElkID0gKHNob3J0KShsYXN0RmllbGRJZF8gKyBtb2RpZmllcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoIiIsIGdldFRUeXBlKChieXRlKSh0eXBlICYgMHgwZikpLCBmaWVsZElkKTsKKworICAgICAgICAgICAgLy8gaWYgdGhpcyBoYXBwZW5zIHRvIGJlIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIGlzIGVuY29kZWQgaW4gdGhlIHR5cGUKKyAgICAgICAgICAgIGlmIChpc0Jvb2xUeXBlKHR5cGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlLgorICAgICAgICAgICAgICAgIGJvb2xWYWx1ZV8gPSAoYnl0ZSkodHlwZSAmIDB4MGYpID09IFR5cGVzLkJPT0xFQU5fVFJVRSA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcHVzaCB0aGUgbmV3IGZpZWxkIG9udG8gdGhlIGZpZWxkIHN0YWNrIHNvIHdlIGNhbiBrZWVwIHRoZSBkZWx0YXMgZ29pbmcuCisgICAgICAgICAgICBsYXN0RmllbGRJZF8gPSBmaWVsZC5JRDsKKyAgICAgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBtYXAgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNpemUgaXMgemVybywgc2tpcCBSZWFkaW5nIHRoZSBrZXkKKyAgICAgICAgLy8vIGFuZCB2YWx1ZSB0eXBlLiBUaGlzIG1lYW5zIHRoYXQgMC1sZW5ndGggbWFwcyB3aWxsIHlpZWxkIFRNYXBzIHdpdGhvdXQgdGhlCisgICAgICAgIC8vLyAiY29ycmVjdCIgdHlwZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUTWFwIFJlYWRNYXBCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzaXplID0gKGludClSZWFkVmFyaW50MzIoKTsKKyAgICAgICAgICAgIGJ5dGUga2V5QW5kVmFsdWVUeXBlID0gc2l6ZSA9PSAwID8gKGJ5dGUpMCA6IChieXRlKVJlYWRCeXRlKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRNYXAoZ2V0VFR5cGUoKGJ5dGUpKGtleUFuZFZhbHVlVHlwZSA+PiA0KSksIGdldFRUeXBlKChieXRlKShrZXlBbmRWYWx1ZVR5cGUgJiAweGYpKSwgc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgbGlzdCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgbGlzdCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKKyAgICAgICAgLy8vIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIGxpc3QsIHRoZSA0IE1TQgorICAgICAgICAvLy8gb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQorICAgICAgICAvLy8gdHJ1ZSBzaXplLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVExpc3QgUmVhZExpc3RCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGUgc2l6ZV9hbmRfdHlwZSA9IChieXRlKVJlYWRCeXRlKCk7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IChzaXplX2FuZF90eXBlID4+IDQpICYgMHgwZjsKKyAgICAgICAgICAgIGlmIChzaXplID09IDE1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpemUgPSAoaW50KVJlYWRWYXJpbnQzMigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVFR5cGUgdHlwZSA9IGdldFRUeXBlKHNpemVfYW5kX3R5cGUpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBUTGlzdCh0eXBlLCBzaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBzZXQgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNldCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKKyAgICAgICAgLy8vIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIHNldCwgdGhlIDQgTVNCCisgICAgICAgIC8vLyBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisgICAgICAgIC8vLyB0cnVlIHNpemUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUU2V0IFJlYWRTZXRCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVFNldChSZWFkTGlzdEJlZ2luKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIGJvb2xlYW4gb2ZmIHRoZSB3aXJlLiBJZiB0aGlzIGlzIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIHNob3VsZAorICAgICAgICAvLy8gYWxyZWFkeSBoYXZlIGJlZW4gUmVhZCBkdXJpbmcgUmVhZEZpZWxkQmVnaW4sIHNvIHdlJ2xsIGp1c3QgY29uc3VtZSB0aGUKKyAgICAgICAgLy8vIHByZS1zdG9yZWQgdmFsdWUuIE90aGVyd2lzZSwgUmVhZCBhIGJ5dGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCb29sZWFuIFJlYWRCb29sKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJvb2xWYWx1ZV8gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sIHJlc3VsdCA9IGJvb2xWYWx1ZV8uVmFsdWU7CisgICAgICAgICAgICAgICAgYm9vbFZhbHVlXyA9IG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBSZWFkQnl0ZSgpID09IFR5cGVzLkJPT0xFQU5fVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIGJ5dGVbXSBieXRlUmF3QnVmID0gbmV3IGJ5dGVbMV07CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHNieXRlIFJlYWRCeXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhbnMuUmVhZEFsbChieXRlUmF3QnVmLCAwLCAxKTsKKyAgICAgICAgICAgIHJldHVybiAoc2J5dGUpYnl0ZVJhd0J1ZlswXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc2hvcnQgUmVhZEkxNigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoc2hvcnQpemlnemFnVG9JbnQoUmVhZFZhcmludDMyKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZEkzMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB6aWd6YWdUb0ludChSZWFkVmFyaW50MzIoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgUmVhZEk2NCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB6aWd6YWdUb0xvbmcoUmVhZFZhcmludDY0KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTm8gbWFnaWMgaGVyZSAtIGp1c3QgUmVhZCBhIGRvdWJsZSBvZmYgdGhlIHdpcmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBkb3VibGUgUmVhZERvdWJsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBsb25nQml0cyA9IG5ldyBieXRlWzhdOworICAgICAgICAgICAgdHJhbnMuUmVhZEFsbChsb25nQml0cywgMCwgOCk7CisgICAgICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLkludDY0Qml0c1RvRG91YmxlKGJ5dGVzVG9Mb25nKGxvbmdCaXRzKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkcyBhIGJ5dGVbXSAodmlhIFJlYWRCaW5hcnkpLCBhbmQgdGhlbiBVVEYtOCBkZWNvZGVzIGl0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFJlYWRTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gKGludClSZWFkVmFyaW50MzIoKTsKKworICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIEVuY29kaW5nLlVURjguR2V0U3RyaW5nKFJlYWRCaW5hcnkobGVuZ3RoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgYnl0ZVtdIGZyb20gdGhlIHdpcmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBieXRlW10gUmVhZEJpbmFyeSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAoaW50KVJlYWRWYXJpbnQzMigpOworICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gbmV3IGJ5dGVbMF07CisKKyAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgICAgICAgICAgdHJhbnMuUmVhZEFsbChidWYsIDAsIGxlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIGJ5dGVbXSBvZiBhIGtub3duIGxlbmd0aCBmcm9tIHRoZSB3aXJlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGJ5dGVbXSBSZWFkQmluYXJ5KGludCBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIG5ldyBieXRlWzBdOworCisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgICAgIHRyYW5zLlJlYWRBbGwoYnVmLCAwLCBsZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZXNlIG1ldGhvZHMgYXJlIGhlcmUgZm9yIHRoZSBzdHJ1Y3QgdG8gY2FsbCwgYnV0IGRvbid0IGhhdmUgYW55IHdpcmUKKyAgICAgICAgLy8gZW5jb2RpbmcuCisgICAgICAgIC8vCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRNZXNzYWdlRW5kKCkgeyB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRGaWVsZEVuZCgpIHsgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTWFwRW5kKCkgeyB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRMaXN0RW5kKCkgeyB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRTZXRFbmQoKSB7IH0KKworICAgICAgICAvLworICAgICAgICAvLyBJbnRlcm5hbCBSZWFkaW5nIG1ldGhvZHMKKyAgICAgICAgLy8KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAgICAgICAgLy8vIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIFJlYWQgdXAgdG8gNSBieXRlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB1aW50IFJlYWRWYXJpbnQzMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQgcmVzdWx0ID0gMDsKKyAgICAgICAgICAgIGludCBzaGlmdCA9IDA7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlIGIgPSAoYnl0ZSlSZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgIHJlc3VsdCB8PSAodWludCkoYiAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgICAgICAgICAgIGlmICgoYiAmIDB4ODApICE9IDB4ODApIGJyZWFrOworICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAgICAvLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byAxMCBieXRlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB1bG9uZyBSZWFkVmFyaW50NjQoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc2hpZnQgPSAwOworICAgICAgICAgICAgdWxvbmcgcmVzdWx0ID0gMDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGUgYiA9IChieXRlKVJlYWRCeXRlKCk7CisgICAgICAgICAgICAgICAgcmVzdWx0IHw9ICh1bG9uZykoYiAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgICAgICAgICAgIGlmICgoYiAmIDB4ODApICE9IDB4ODApIGJyZWFrOworICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gZW5jb2RpbmcgaGVscGVycworICAgICAgICAvLworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnZlcnQgZnJvbSB6aWd6YWcgaW50IHRvIGludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBpbnQgemlnemFnVG9JbnQodWludCBuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGludCkobiA+PiAxKSBeICgtKGludCkobiAmIDEpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnZlcnQgZnJvbSB6aWd6YWcgbG9uZyB0byBsb25nLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGxvbmcgemlnemFnVG9Mb25nKHVsb25nIG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAobG9uZykobiA+PiAxKSBeICgtKGxvbmcpKG4gJiAxKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBOb3RlIHRoYXQgaXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgbWFzayBieXRlcyBhcmUgbG9uZyBsaXRlcmFscywKKyAgICAgICAgLy8vIG90aGVyd2lzZSB0aGV5J2xsIGRlZmF1bHQgdG8gaW50cywgYW5kIHdoZW4geW91IHNoaWZ0IGFuIGludCBsZWZ0IDU2IGJpdHMsCisgICAgICAgIC8vLyB5b3UganVzdCBnZXQgYSBtZXNzZWQgdXAgaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGxvbmcgYnl0ZXNUb0xvbmcoYnl0ZVtdIGJ5dGVzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgKChieXRlc1s3XSAmIDB4ZmZMKSA8PCA1NikgfAorICAgICAgICAgICAgICAoKGJ5dGVzWzZdICYgMHhmZkwpIDw8IDQ4KSB8CisgICAgICAgICAgICAgICgoYnl0ZXNbNV0gJiAweGZmTCkgPDwgNDApIHwKKyAgICAgICAgICAgICAgKChieXRlc1s0XSAmIDB4ZmZMKSA8PCAzMikgfAorICAgICAgICAgICAgICAoKGJ5dGVzWzNdICYgMHhmZkwpIDw8IDI0KSB8CisgICAgICAgICAgICAgICgoYnl0ZXNbMl0gJiAweGZmTCkgPDwgMTYpIHwKKyAgICAgICAgICAgICAgKChieXRlc1sxXSAmIDB4ZmZMKSA8PCA4KSB8CisgICAgICAgICAgICAgICgoYnl0ZXNbMF0gJiAweGZmTCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdHlwZSB0ZXN0aW5nIGFuZCBjb252ZXJ0aW5nCisgICAgICAgIC8vCisKKyAgICAgICAgcHJpdmF0ZSBCb29sZWFuIGlzQm9vbFR5cGUoYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbG93ZXJOaWJibGUgPSBiICYgMHgwZjsKKyAgICAgICAgICAgIHJldHVybiBsb3dlck5pYmJsZSA9PSBUeXBlcy5CT09MRUFOX1RSVUUgfHwgbG93ZXJOaWJibGUgPT0gVHlwZXMuQk9PTEVBTl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdpdmVuIGEgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudCwgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZworICAgICAgICAvLy8gVFR5cGUgdmFsdWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgVFR5cGUgZ2V0VFR5cGUoYnl0ZSB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKChieXRlKSh0eXBlICYgMHgwZikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5TVE9QOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuU3RvcDsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJPT0xFQU5fRkFMU0U6CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5CT09MRUFOX1RSVUU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5Cb29sOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuQllURToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkJ5dGU7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5JMTY6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5JMTY7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5JMzI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5JMzI7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5JNjQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5JNjQ7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5ET1VCTEU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5Eb3VibGU7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5CSU5BUlk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5TdHJpbmc7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5MSVNUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuTGlzdDsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLlNFVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLlNldDsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLk1BUDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLk1hcDsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLlN0cnVjdDsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJkb24ndCBrbm93IHdoYXQgdHlwZTogIiArIChieXRlKSh0eXBlICYgMHgwZikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2l2ZW4gYSBUVHlwZSB2YWx1ZSwgZmluZCB0aGUgYXBwcm9wcmlhdGUgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBieXRlIGdldENvbXBhY3RUeXBlKFRUeXBlIHR0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpdHR5cGVdOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEZpZWxkLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEZpZWxkLmNzCmluZGV4IGZhMTA1ODQuLjgxNzk1NTcgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RGaWVsZC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9URmllbGQuY3MKQEAgLTI3LDM2ICsyNywzNiBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0JcHVibGljIHN0cnVjdCBURmllbGQKLQl7Ci0JCXByaXZhdGUgc3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgVFR5cGUgdHlwZTsKLQkJcHJpdmF0ZSBzaG9ydCBpZDsKKyAgICBwdWJsaWMgc3RydWN0IFRGaWVsZAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgbmFtZTsKKyAgICAgICAgcHJpdmF0ZSBUVHlwZSB0eXBlOworICAgICAgICBwcml2YXRlIHNob3J0IGlkOwogCi0JCXB1YmxpYyBURmllbGQoc3RyaW5nIG5hbWUsIFRUeXBlIHR5cGUsIHNob3J0IGlkKQotCQkJOnRoaXMoKQotCQl7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXRoaXMuaWQgPSBpZDsKLQkJfQorICAgICAgICBwdWJsaWMgVEZpZWxkKHN0cmluZyBuYW1lLCBUVHlwZSB0eXBlLCBzaG9ydCBpZCkKKyAgICAgICAgICAgIDp0aGlzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIH0KIAotCQlwdWJsaWMgc3RyaW5nIE5hbWUKLQkJewotCQkJZ2V0IHsgcmV0dXJuIG5hbWU7IH0KLQkJCXNldCB7IG5hbWUgPSB2YWx1ZTsgfQotCQl9CisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gbmFtZTsgfQorICAgICAgICAgICAgc2V0IHsgbmFtZSA9IHZhbHVlOyB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFR5cGUgVHlwZQotCQl7Ci0JCQlnZXQgeyByZXR1cm4gdHlwZTsgfQotCQkJc2V0IHsgdHlwZSA9IHZhbHVlOyB9Ci0JCX0KKyAgICAgICAgcHVibGljIFRUeXBlIFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHR5cGU7IH0KKyAgICAgICAgICAgIHNldCB7IHR5cGUgPSB2YWx1ZTsgfQorICAgICAgICB9CiAKLQkJcHVibGljIHNob3J0IElECi0JCXsKLQkJCWdldCB7IHJldHVybiBpZDsgfQotCQkJc2V0IHsgaWQgPSB2YWx1ZTsgfQotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgc2hvcnQgSUQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGlkOyB9CisgICAgICAgICAgICBzZXQgeyBpZCA9IHZhbHVlOyB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9USlNPTlByb3RvY29sLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcwppbmRleCBhMzVmY2QzLi45ZGJkZWE5IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9USlNPTlByb3RvY29sLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3MKQEAgLTI3LDEwNDUgKzI3LDEwOTggQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCS8vLyA8c3VtbWFyeT4KLQkvLy8gSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgotCS8vLwotCS8vLyBUaGlzIGlzIGEgZnVsbC1mZWF0dXJlZCBwcm90b2NvbCBzdXBwb3J0aW5nIFdyaXRlIGFuZCBSZWFkLgotCS8vLwotCS8vLyBQbGVhc2Ugc2VlIHRoZSBDKysgY2xhc3MgaGVhZGVyIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZQotCS8vLyBwcm90b2NvbCdzIHdpcmUgZm9ybWF0LgotCS8vLwotCS8vLyBBZGFwdGVkIGZyb20gdGhlIEphdmEgdmVyc2lvbi4KLQkvLy8gPC9zdW1tYXJ5PgotCXB1YmxpYyBjbGFzcyBUSlNPTlByb3RvY29sIDogVFByb3RvY29sCi0JewotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBGYWN0b3J5IGZvciBKU09OIHByb3RvY29sIG9iamVjdHMKLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5Ci0JCXsKLQkJCXB1YmxpYyBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykKLQkJCXsKLQkJCQlyZXR1cm4gbmV3IFRKU09OUHJvdG9jb2wodHJhbnMpOwotCQkJfQotCQl9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBKU09OIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciB0aHJpZnQuCisgICAgLy8vIDxwYXJhLz4KKyAgICAvLy8gVGhpcyBpcyBhIGZ1bGwtZmVhdHVyZWQgcHJvdG9jb2wgc3VwcG9ydGluZyBXcml0ZSBhbmQgUmVhZC4KKyAgICAvLy8gPHBhcmEvPgorICAgIC8vLyBQbGVhc2Ugc2VlIHRoZSBDKysgY2xhc3MgaGVhZGVyIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZQorICAgIC8vLyBwcm90b2NvbCdzIHdpcmUgZm9ybWF0LgorICAgIC8vLyA8cGFyYS8+CisgICAgLy8vIEFkYXB0ZWQgZnJvbSB0aGUgSmF2YSB2ZXJzaW9uLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFRKU09OUHJvdG9jb2wgOiBUUHJvdG9jb2wKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEZhY3RvcnkgZm9yIEpTT04gcHJvdG9jb2wgb2JqZWN0cy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRKU09OUHJvdG9jb2wodHJhbnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIENPTU1BID0gbmV3IGJ5dGVbXSB7IChieXRlKScsJyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gQ09MT04gPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJzonIH07Ci0JCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBMQlJBQ0UgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ3snIH07Ci0JCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBSQlJBQ0UgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ30nIH07Ci0JCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBMQlJBQ0tFVCA9IG5ldyBieXRlW10geyAoYnl0ZSknWycgfTsKLQkJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIFJCUkFDS0VUID0gbmV3IGJ5dGVbXSB7IChieXRlKSddJyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gUVVPVEUgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJyInIH07Ci0JCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBCQUNLU0xBU0ggPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ1xcJyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gWkVSTyA9IG5ldyBieXRlW10geyAoYnl0ZSknMCcgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIENPTU1BID0gbmV3IGJ5dGVbXSB7IChieXRlKScsJyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gQ09MT04gPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJzonIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBMQlJBQ0UgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ3snIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBSQlJBQ0UgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ30nIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBMQlJBQ0tFVCA9IG5ldyBieXRlW10geyAoYnl0ZSknWycgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIFJCUkFDS0VUID0gbmV3IGJ5dGVbXSB7IChieXRlKSddJyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gUVVPVEUgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJyInIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBCQUNLU0xBU0ggPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ1xcJyB9OwogCi0JCXByaXZhdGUgYnl0ZVtdIEVTQ1NFUSA9IG5ldyBieXRlW10geyAoYnl0ZSknXFwnLCAoYnl0ZSkndScsIChieXRlKScwJywgKGJ5dGUpJzAnIH07CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIEVTQ1NFUSA9IG5ldyBieXRlW10geyAoYnl0ZSknXFwnLCAoYnl0ZSkndScsIChieXRlKScwJywgKGJ5dGUpJzAnIH07CiAKLQkJcHJpdmF0ZSBjb25zdCBsb25nIFZFUlNJT04gPSAxOwotCQlwcml2YXRlIGJ5dGVbXSBKU09OX0NIQVJfVEFCTEUgPSB7Ci0JMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsKGJ5dGUpJ2InLChieXRlKSd0JywoYnl0ZSknbicsICAwLChieXRlKSdmJywoYnl0ZSkncicsICAwLCAgMCwgCi0JMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgCi0JMSwgIDEsKGJ5dGUpJyInLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBsb25nIFZFUlNJT04gPSAxOworICAgICAgICBwcml2YXRlIGJ5dGVbXSBKU09OX0NIQVJfVEFCTEUgPSB7CisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsKGJ5dGUpJ2InLChieXRlKSd0JywoYnl0ZSknbicsICAwLChieXRlKSdmJywoYnl0ZSkncicsICAwLCAgMCwKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgIDEsICAxLChieXRlKSciJywgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCiAgIH07CiAKLQkJcHJpdmF0ZSBjaGFyW10gRVNDQVBFX0NIQVJTID0gIlwiXFxiZm5ydCIuVG9DaGFyQXJyYXkoKTsKKyAgICAgICAgcHJpdmF0ZSBjaGFyW10gRVNDQVBFX0NIQVJTID0gIlwiXFwvYmZucnQiLlRvQ2hhckFycmF5KCk7CiAKLQkJcHJpdmF0ZSBieXRlW10gRVNDQVBFX0NIQVJfVkFMUyA9IHsKLQkoYnl0ZSknIicsIChieXRlKSdcXCcsIChieXRlKSdcYicsIChieXRlKSdcZicsIChieXRlKSdcbicsIChieXRlKSdccicsIChieXRlKSdcdCcsCisgICAgICAgIHByaXZhdGUgYnl0ZVtdIEVTQ0FQRV9DSEFSX1ZBTFMgPSB7CisgICAgKGJ5dGUpJyInLCAoYnl0ZSknXFwnLCAoYnl0ZSknLycsIChieXRlKSdcYicsIChieXRlKSdcZicsIChieXRlKSdcbicsIChieXRlKSdccicsIChieXRlKSdcdCcsCiAgIH07CiAKLQkJcHJpdmF0ZSBjb25zdCBpbnQgREVGX1NUUklOR19TSVpFID0gMTY7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IERFRl9TVFJJTkdfU0laRSA9IDE2OwogCi0JCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0JPT0wgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ3QnLCAoYnl0ZSknZicgfTsKLQkJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIE5BTUVfQllURSA9IG5ldyBieXRlW10geyAoYnl0ZSknaScsIChieXRlKSc4JyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9JMTYgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ2knLCAoYnl0ZSknMScsIChieXRlKSc2JyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9JMzIgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ2knLCAoYnl0ZSknMycsIChieXRlKScyJyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9JNjQgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ2knLCAoYnl0ZSknNicsIChieXRlKSc0JyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9ET1VCTEUgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ2QnLCAoYnl0ZSknYicsIChieXRlKSdsJyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9TVFJVQ1QgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ3InLCAoYnl0ZSknZScsIChieXRlKSdjJyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9TVFJJTkcgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ3MnLCAoYnl0ZSkndCcsIChieXRlKSdyJyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9NQVAgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ20nLCAoYnl0ZSknYScsIChieXRlKSdwJyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9MSVNUID0gbmV3IGJ5dGVbXSB7IChieXRlKSdsJywgKGJ5dGUpJ3MnLCAoYnl0ZSkndCcgfTsKLQkJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIE5BTUVfU0VUID0gbmV3IGJ5dGVbXSB7IChieXRlKSdzJywgKGJ5dGUpJ2UnLCAoYnl0ZSkndCcgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIE5BTUVfQk9PTCA9IG5ldyBieXRlW10geyAoYnl0ZSkndCcsIChieXRlKSdmJyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9CWVRFID0gbmV3IGJ5dGVbXSB7IChieXRlKSdpJywgKGJ5dGUpJzgnIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0kxNiA9IG5ldyBieXRlW10geyAoYnl0ZSknaScsIChieXRlKScxJywgKGJ5dGUpJzYnIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0kzMiA9IG5ldyBieXRlW10geyAoYnl0ZSknaScsIChieXRlKSczJywgKGJ5dGUpJzInIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0k2NCA9IG5ldyBieXRlW10geyAoYnl0ZSknaScsIChieXRlKSc2JywgKGJ5dGUpJzQnIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0RPVUJMRSA9IG5ldyBieXRlW10geyAoYnl0ZSknZCcsIChieXRlKSdiJywgKGJ5dGUpJ2wnIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX1NUUlVDVCA9IG5ldyBieXRlW10geyAoYnl0ZSkncicsIChieXRlKSdlJywgKGJ5dGUpJ2MnIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX1NUUklORyA9IG5ldyBieXRlW10geyAoYnl0ZSkncycsIChieXRlKSd0JywgKGJ5dGUpJ3InIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX01BUCA9IG5ldyBieXRlW10geyAoYnl0ZSknbScsIChieXRlKSdhJywgKGJ5dGUpJ3AnIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0xJU1QgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ2wnLCAoYnl0ZSkncycsIChieXRlKSd0JyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9TRVQgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ3MnLCAoYnl0ZSknZScsIChieXRlKSd0JyB9OwogCi0JCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBHZXRUeXBlTmFtZUZvclR5cGVJRChUVHlwZSB0eXBlSUQpCi0JCXsKLQkJCXN3aXRjaCAodHlwZUlEKQotCQkJewotCQkJCWNhc2UgVFR5cGUuQm9vbDoKLQkJCQkJcmV0dXJuIE5BTUVfQk9PTDsKLQkJCQljYXNlIFRUeXBlLkJ5dGU6Ci0JCQkJCXJldHVybiBOQU1FX0JZVEU7Ci0JCQkJY2FzZSBUVHlwZS5JMTY6Ci0JCQkJCXJldHVybiBOQU1FX0kxNjsKLQkJCQljYXNlIFRUeXBlLkkzMjoKLQkJCQkJcmV0dXJuIE5BTUVfSTMyOwotCQkJCWNhc2UgVFR5cGUuSTY0OgotCQkJCQlyZXR1cm4gTkFNRV9JNjQ7Ci0JCQkJY2FzZSBUVHlwZS5Eb3VibGU6Ci0JCQkJCXJldHVybiBOQU1FX0RPVUJMRTsKLQkJCQljYXNlIFRUeXBlLlN0cmluZzoKLQkJCQkJcmV0dXJuIE5BTUVfU1RSSU5HOwotCQkJCWNhc2UgVFR5cGUuU3RydWN0OgotCQkJCQlyZXR1cm4gTkFNRV9TVFJVQ1Q7Ci0JCQkJY2FzZSBUVHlwZS5NYXA6Ci0JCQkJCXJldHVybiBOQU1FX01BUDsKLQkJCQljYXNlIFRUeXBlLlNldDoKLQkJCQkJcmV0dXJuIE5BTUVfU0VUOwotCQkJCWNhc2UgVFR5cGUuTGlzdDoKLQkJCQkJcmV0dXJuIE5BTUVfTElTVDsKLQkJCQlkZWZhdWx0OgotCQkJCQl0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5OT1RfSU1QTEVNRU5URUQsCi0JCQkJCQkJCQkJCQkgIlVucmVjb2duaXplZCB0eXBlIik7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIEdldFR5cGVOYW1lRm9yVHlwZUlEKFRUeXBlIHR5cGVJRCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh0eXBlSUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5Cb29sOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkFNRV9CT09MOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuQnl0ZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5BTUVfQllURTsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5BTUVfSTE2OworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkFNRV9JMzI7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JNjQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOQU1FX0k2NDsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkRvdWJsZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5BTUVfRE9VQkxFOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU3RyaW5nOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkFNRV9TVFJJTkc7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TdHJ1Y3Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOQU1FX1NUUlVDVDsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLk1hcDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5BTUVfTUFQOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU2V0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkFNRV9TRVQ7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5MaXN0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkFNRV9MSVNUOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLk5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXByaXZhdGUgc3RhdGljIFRUeXBlIEdldFR5cGVJREZvclR5cGVOYW1lKGJ5dGVbXSBuYW1lKQotCQl7Ci0JCQlUVHlwZSByZXN1bHQgPSBUVHlwZS5TdG9wOwotCQkJaWYgKG5hbWUuTGVuZ3RoID4gMSkKLQkJCXsKLQkJCQlzd2l0Y2ggKG5hbWVbMF0pCi0JCQkJewotCQkJCQljYXNlIChieXRlKSdkJzoKLQkJCQkJCXJlc3VsdCA9IFRUeXBlLkRvdWJsZTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChieXRlKSdpJzoKLQkJCQkJCXN3aXRjaCAobmFtZVsxXSkKLQkJCQkJCXsKLQkJCQkJCQljYXNlIChieXRlKSc4JzoKLQkJCQkJCQkJcmVzdWx0ID0gVFR5cGUuQnl0ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAoYnl0ZSknMSc6Ci0JCQkJCQkJCXJlc3VsdCA9IFRUeXBlLkkxNjsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAoYnl0ZSknMyc6Ci0JCQkJCQkJCXJlc3VsdCA9IFRUeXBlLkkzMjsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAoYnl0ZSknNic6Ci0JCQkJCQkJCXJlc3VsdCA9IFRUeXBlLkk2NDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAoYnl0ZSknbCc6Ci0JCQkJCQlyZXN1bHQgPSBUVHlwZS5MaXN0OwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgKGJ5dGUpJ20nOgotCQkJCQkJcmVzdWx0ID0gVFR5cGUuTWFwOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgKGJ5dGUpJ3InOgotCQkJCQkJcmVzdWx0ID0gVFR5cGUuU3RydWN0OwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgKGJ5dGUpJ3MnOgotCQkJCQkJaWYgKG5hbWVbMV0gPT0gKGJ5dGUpJ3QnKQotCQkJCQkJewotCQkJCQkJCXJlc3VsdCA9IFRUeXBlLlN0cmluZzsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKG5hbWVbMV0gPT0gKGJ5dGUpJ2UnKQotCQkJCQkJewotCQkJCQkJCXJlc3VsdCA9IFRUeXBlLlNldDsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChieXRlKSd0JzoKLQkJCQkJCXJlc3VsdCA9IFRUeXBlLkJvb2w7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocmVzdWx0ID09IFRUeXBlLlN0b3ApCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELAotCQkJCQkJCQkJCQkgIlVucmVjb2duaXplZCB0eXBlIik7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9CisgICAgICAgIHByaXZhdGUgc3RhdGljIFRUeXBlIEdldFR5cGVJREZvclR5cGVOYW1lKGJ5dGVbXSBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBUVHlwZSByZXN1bHQgPSBUVHlwZS5TdG9wOworICAgICAgICAgICAgaWYgKG5hbWUuTGVuZ3RoID4gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG5hbWVbMF0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSdkJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkRvdWJsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSdpJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobmFtZVsxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc4JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuQnl0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkkxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkkzMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknNic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkk2NDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknbCc6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5MaXN0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJ20nOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuTWFwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJ3InOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuU3RydWN0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJ3MnOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVbMV0gPT0gKGJ5dGUpJ3QnKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLlN0cmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVbMV0gPT0gKGJ5dGUpJ2UnKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLlNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSd0JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkJvb2w7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IFRUeXBlLlN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCB0eXBlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CiAKLQkJLy8vPHN1bW1hcnk+Ci0JCS8vLyBCYXNlIGNsYXNzIGZvciB0cmFja2luZyBKU09OIGNvbnRleHRzIHRoYXQgbWF5IHJlcXVpcmUKLQkJLy8vIGluc2VydGluZy9SZWFkaW5nIGFkZGl0aW9uYWwgSlNPTiBzeW50YXggY2hhcmFjdGVycwotCQkvLy8gVGhpcyBiYXNlIGNvbnRleHQgZG9lcyBub3RoaW5nLgotCQkvLy88L3N1bW1hcnk+Ci0JCXByb3RlY3RlZCBjbGFzcyBKU09OQmFzZUNvbnRleHQKLQkJewotCQkJcHJvdGVjdGVkIFRKU09OUHJvdG9jb2wgcHJvdG87CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEJhc2UgY2xhc3MgZm9yIHRyYWNraW5nIEpTT04gY29udGV4dHMgdGhhdCBtYXkgcmVxdWlyZQorICAgICAgICAvLy8gaW5zZXJ0aW5nL1JlYWRpbmcgYWRkaXRpb25hbCBKU09OIHN5bnRheCBjaGFyYWN0ZXJzCisgICAgICAgIC8vLyBUaGlzIGJhc2UgY29udGV4dCBkb2VzIG5vdGhpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCBjbGFzcyBKU09OQmFzZUNvbnRleHQKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdGVjdGVkIFRKU09OUHJvdG9jb2wgcHJvdG87CiAKLQkJCXB1YmxpYyBKU09OQmFzZUNvbnRleHQoVEpTT05Qcm90b2NvbCBwcm90bykKLQkJCXsKLQkJCQl0aGlzLnByb3RvID0gcHJvdG87Ci0JCQl9CisgICAgICAgICAgICBwdWJsaWMgSlNPTkJhc2VDb250ZXh0KFRKU09OUHJvdG9jb2wgcHJvdG8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5wcm90byA9IHByb3RvOworICAgICAgICAgICAgfQogCi0JCQlwdWJsaWMgdmlydHVhbCB2b2lkIFdyaXRlKCkgeyB9CisgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFdyaXRlKCkgeyB9CiAKLQkJCXB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVhZCgpIHsgfQorICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZWFkKCkgeyB9CiAKLQkJCXB1YmxpYyB2aXJ0dWFsIGJvb2wgRXNjYXBlTnVtYmVycygpIHsgcmV0dXJuIGZhbHNlOyB9Ci0JCX0KKyAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGJvb2wgRXNjYXBlTnVtYmVycygpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIH0KIAotCQkvLy88c3VtbWFyeT4KLQkJLy8vIENvbnRleHQgZm9yIEpTT04gbGlzdHMuIFdpbGwgaW5zZXJ0L1JlYWQgY29tbWFzIGJlZm9yZSBlYWNoIGl0ZW0gZXhjZXB0Ci0JCS8vLyBmb3IgdGhlIGZpcnN0IG9uZQotCQkvLy88L3N1bW1hcnk+Ci0JCXByb3RlY3RlZCBjbGFzcyBKU09OTGlzdENvbnRleHQgOiBKU09OQmFzZUNvbnRleHQKLQkJewotCQkJcHVibGljIEpTT05MaXN0Q29udGV4dChUSlNPTlByb3RvY29sIHByb3RvY29sKQotCQkJCTogYmFzZShwcm90b2NvbCkKLQkJCXsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29udGV4dCBmb3IgSlNPTiBsaXN0cy4gV2lsbCBpbnNlcnQvUmVhZCBjb21tYXMgYmVmb3JlIGVhY2ggaXRlbSBleGNlcHQKKyAgICAgICAgLy8vIGZvciB0aGUgZmlyc3Qgb25lCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCBjbGFzcyBKU09OTGlzdENvbnRleHQgOiBKU09OQmFzZUNvbnRleHQKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIEpTT05MaXN0Q29udGV4dChUSlNPTlByb3RvY29sIHByb3RvY29sKQorICAgICAgICAgICAgICAgIDogYmFzZShwcm90b2NvbCkKKyAgICAgICAgICAgIHsKIAotCQkJfQorICAgICAgICAgICAgfQogCi0JCQlwcml2YXRlIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgcHJpdmF0ZSBib29sIGZpcnN0ID0gdHJ1ZTsKIAotCQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoKQotCQkJewotCQkJCWlmIChmaXJzdCkKLQkJCQl7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXByb3RvLnRyYW5zLldyaXRlKENPTU1BKTsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8udHJhbnMuV3JpdGUoQ09NTUEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZCgpCi0JCQl7Ci0JCQkJaWYgKGZpcnN0KQotCQkJCXsKLQkJCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcHJvdG8uUmVhZEpTT05TeW50YXhDaGFyKENPTU1BKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByb3RvLlJlYWRKU09OU3ludGF4Q2hhcihDT01NQSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLy8vPHN1bW1hcnk+Ci0JCS8vLyBDb250ZXh0IGZvciBKU09OIHJlY29yZHMuIFdpbGwgaW5zZXJ0L1JlYWQgY29sb25zIGJlZm9yZSB0aGUgdmFsdWUgcG9ydGlvbgotCQkvLy8gb2YgZWFjaCByZWNvcmQgcGFpciwgYW5kIGNvbW1hcyBiZWZvcmUgZWFjaCBrZXkgZXhjZXB0IHRoZSBmaXJzdC4gSW4KLQkJLy8vIGFkZGl0aW9uLCB3aWxsIGluZGljYXRlIHRoYXQgbnVtYmVycyBpbiB0aGUga2V5IHBvc2l0aW9uIG5lZWQgdG8gYmUKLQkJLy8vIGVzY2FwZWQgaW4gcXVvdGVzIChzaW5jZSBKU09OIGtleXMgbXVzdCBiZSBzdHJpbmdzKS4KLQkJLy8vPC9zdW1tYXJ5PgotCQlwcm90ZWN0ZWQgY2xhc3MgSlNPTlBhaXJDb250ZXh0IDogSlNPTkJhc2VDb250ZXh0Ci0JCXsKLQkJCXB1YmxpYyBKU09OUGFpckNvbnRleHQoVEpTT05Qcm90b2NvbCBwcm90bykKLQkJCQk6IGJhc2UocHJvdG8pCi0JCQl7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnRleHQgZm9yIEpTT04gcmVjb3Jkcy4gV2lsbCBpbnNlcnQvUmVhZCBjb2xvbnMgYmVmb3JlIHRoZSB2YWx1ZSBwb3J0aW9uCisgICAgICAgIC8vLyBvZiBlYWNoIHJlY29yZCBwYWlyLCBhbmQgY29tbWFzIGJlZm9yZSBlYWNoIGtleSBleGNlcHQgdGhlIGZpcnN0LiBJbgorICAgICAgICAvLy8gYWRkaXRpb24sIHdpbGwgaW5kaWNhdGUgdGhhdCBudW1iZXJzIGluIHRoZSBrZXkgcG9zaXRpb24gbmVlZCB0byBiZQorICAgICAgICAvLy8gZXNjYXBlZCBpbiBxdW90ZXMgKHNpbmNlIEpTT04ga2V5cyBtdXN0IGJlIHN0cmluZ3MpLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgSlNPTlBhaXJDb250ZXh0IDogSlNPTkJhc2VDb250ZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBKU09OUGFpckNvbnRleHQoVEpTT05Qcm90b2NvbCBwcm90bykKKyAgICAgICAgICAgICAgICA6IGJhc2UocHJvdG8pCisgICAgICAgICAgICB7CiAKLQkJCX0KKyAgICAgICAgICAgIH0KIAotCQkJcHJpdmF0ZSBib29sIGZpcnN0ID0gdHJ1ZTsKLQkJCXByaXZhdGUgYm9vbCBjb2xvbiA9IHRydWU7CisgICAgICAgICAgICBwcml2YXRlIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgcHJpdmF0ZSBib29sIGNvbG9uID0gdHJ1ZTsKIAotCQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoKQotCQkJewotCQkJCWlmIChmaXJzdCkKLQkJCQl7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJCWNvbG9uID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcHJvdG8udHJhbnMuV3JpdGUoY29sb24gPyBDT0xPTiA6IENPTU1BKTsKLQkJCQkJY29sb24gPSAhY29sb247Ci0JCQkJfQotCQkJfQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGNvbG9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8udHJhbnMuV3JpdGUoY29sb24gPyBDT0xPTiA6IENPTU1BKTsKKyAgICAgICAgICAgICAgICAgICAgY29sb24gPSAhY29sb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkKCkKLQkJCXsKLQkJCQlpZiAoZmlyc3QpCi0JCQkJewotCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCQljb2xvbiA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXByb3RvLlJlYWRKU09OU3ludGF4Q2hhcihjb2xvbiA/IENPTE9OIDogQ09NTUEpOwotCQkJCQljb2xvbiA9ICFjb2xvbjsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBjb2xvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByb3RvLlJlYWRKU09OU3ludGF4Q2hhcihjb2xvbiA/IENPTE9OIDogQ09NTUEpOworICAgICAgICAgICAgICAgICAgICBjb2xvbiA9ICFjb2xvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJCXB1YmxpYyBvdmVycmlkZSBib29sIEVzY2FwZU51bWJlcnMoKQotCQkJewotCQkJCXJldHVybiBjb2xvbjsKLQkJCX0KLQkJfQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXNjYXBlTnVtYmVycygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9uOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLy8vPHN1bW1hcnk+Ci0JCS8vLyBIb2xkcyB1cCB0byBvbmUgYnl0ZSBmcm9tIHRoZSB0cmFuc3BvcnQKLQkJLy8vPC9zdW1tYXJ5PgotCQlwcm90ZWN0ZWQgY2xhc3MgTG9va2FoZWFkUmVhZGVyCi0JCXsKLQkJCXByb3RlY3RlZCBUSlNPTlByb3RvY29sIHByb3RvOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBIb2xkcyB1cCB0byBvbmUgYnl0ZSBmcm9tIHRoZSB0cmFuc3BvcnQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIGNsYXNzIExvb2thaGVhZFJlYWRlcgorICAgICAgICB7CisgICAgICAgICAgICBwcm90ZWN0ZWQgVEpTT05Qcm90b2NvbCBwcm90bzsKIAotCQkJcHVibGljIExvb2thaGVhZFJlYWRlcihUSlNPTlByb3RvY29sIHByb3RvKQotCQkJewotCQkJCXRoaXMucHJvdG8gPSBwcm90bzsKLQkJCX0KKyAgICAgICAgICAgIHB1YmxpYyBMb29rYWhlYWRSZWFkZXIoVEpTT05Qcm90b2NvbCBwcm90bykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnByb3RvID0gcHJvdG87CisgICAgICAgICAgICB9CiAKLQkJCXByaXZhdGUgYm9vbCBoYXNEYXRhOwotCQkJcHJpdmF0ZSBieXRlW10gZGF0YSA9IG5ldyBieXRlWzFdOworICAgICAgICAgICAgcHJpdmF0ZSBib29sIGhhc0RhdGE7CisgICAgICAgICAgICBwcml2YXRlIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbMV07CiAKLQkJCS8vLzxzdW1tYXJ5PgotCQkJLy8vIFJldHVybiBhbmQgY29uc3VtZSB0aGUgbmV4dCBieXRlIHRvIGJlIFJlYWQsIGVpdGhlciB0YWtpbmcgaXQgZnJvbSB0aGUKLQkJCS8vLyBkYXRhIGJ1ZmZlciBpZiBwcmVzZW50IG9yIGdldHRpbmcgaXQgZnJvbSB0aGUgdHJhbnNwb3J0IG90aGVyd2lzZS4KLQkJCS8vLzwvc3VtbWFyeT4KLQkJCXB1YmxpYyBieXRlIFJlYWQoKQotCQkJewotCQkJCWlmIChoYXNEYXRhKQotCQkJCXsKLQkJCQkJaGFzRGF0YSA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlwcm90by50cmFucy5SZWFkQWxsKGRhdGEsIDAsIDEpOwotCQkJCX0KLQkJCQlyZXR1cm4gZGF0YVswXTsKLQkJCX0KKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyBSZXR1cm4gYW5kIGNvbnN1bWUgdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkLCBlaXRoZXIgdGFraW5nIGl0IGZyb20gdGhlCisgICAgICAgICAgICAvLy8gZGF0YSBidWZmZXIgaWYgcHJlc2VudCBvciBnZXR0aW5nIGl0IGZyb20gdGhlIHRyYW5zcG9ydCBvdGhlcndpc2UuCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgcHVibGljIGJ5dGUgUmVhZCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGhhc0RhdGEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBoYXNEYXRhID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByb3RvLnRyYW5zLlJlYWRBbGwoZGF0YSwgMCwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBkYXRhWzBdOworICAgICAgICAgICAgfQogCi0JCQkvLy88c3VtbWFyeT4KLQkJCS8vLyBSZXR1cm4gdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkIHdpdGhvdXQgY29uc3VtaW5nLCBmaWxsaW5nIHRoZSBkYXRhCi0JCQkvLy8gYnVmZmVyIGlmIGl0IGhhcyBub3QgYmVlbiBmaWxsZWQgYWxSZWFkeS4KLQkJCS8vLzwvc3VtbWFyeT4KLQkJCXB1YmxpYyBieXRlIFBlZWsoKQotCQkJewotCQkJCWlmICghaGFzRGF0YSkKLQkJCQl7Ci0JCQkJCXByb3RvLnRyYW5zLlJlYWRBbGwoZGF0YSwgMCwgMSk7Ci0JCQkJfQotCQkJCWhhc0RhdGEgPSB0cnVlOwotCQkJCXJldHVybiBkYXRhWzBdOwotCQkJfQotCQl9CisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgICAgICAvLy8gUmV0dXJuIHRoZSBuZXh0IGJ5dGUgdG8gYmUgUmVhZCB3aXRob3V0IGNvbnN1bWluZywgZmlsbGluZyB0aGUgZGF0YQorICAgICAgICAgICAgLy8vIGJ1ZmZlciBpZiBpdCBoYXMgbm90IGJlZW4gZmlsbGVkIGFsUmVhZHkuCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgcHVibGljIGJ5dGUgUGVlaygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFoYXNEYXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8udHJhbnMuUmVhZEFsbChkYXRhLCAwLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaGFzRGF0YSA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvLyBEZWZhdWx0IGVuY29kaW5nCi0JCXByb3RlY3RlZCBFbmNvZGluZyB1dGY4RW5jb2RpbmcgPSBVVEY4RW5jb2RpbmcuVVRGODsKKyAgICAgICAgLy8gRGVmYXVsdCBlbmNvZGluZworICAgICAgICBwcm90ZWN0ZWQgRW5jb2RpbmcgdXRmOEVuY29kaW5nID0gVVRGOEVuY29kaW5nLlVURjg7CiAKLQkJLy8gU3RhY2sgb2YgbmVzdGVkIGNvbnRleHRzIHRoYXQgd2UgbWF5IGJlIGluCi0JCXByb3RlY3RlZCBTdGFjazxKU09OQmFzZUNvbnRleHQ+IGNvbnRleHRTdGFjayA9IG5ldyBTdGFjazxKU09OQmFzZUNvbnRleHQ+KCk7CisgICAgICAgIC8vIFN0YWNrIG9mIG5lc3RlZCBjb250ZXh0cyB0aGF0IHdlIG1heSBiZSBpbgorICAgICAgICBwcm90ZWN0ZWQgU3RhY2s8SlNPTkJhc2VDb250ZXh0PiBjb250ZXh0U3RhY2sgPSBuZXcgU3RhY2s8SlNPTkJhc2VDb250ZXh0PigpOwogCi0JCS8vIEN1cnJlbnQgY29udGV4dCB0aGF0IHdlIGFyZSBpbgotCQlwcm90ZWN0ZWQgSlNPTkJhc2VDb250ZXh0IGNvbnRleHQ7CisgICAgICAgIC8vIEN1cnJlbnQgY29udGV4dCB0aGF0IHdlIGFyZSBpbgorICAgICAgICBwcm90ZWN0ZWQgSlNPTkJhc2VDb250ZXh0IGNvbnRleHQ7CiAKLQkJLy8gUmVhZGVyIHRoYXQgbWFuYWdlcyBhIDEtYnl0ZSBidWZmZXIKLQkJcHJvdGVjdGVkIExvb2thaGVhZFJlYWRlciByZWFkZXI7CisgICAgICAgIC8vIFJlYWRlciB0aGF0IG1hbmFnZXMgYSAxLWJ5dGUgYnVmZmVyCisgICAgICAgIHByb3RlY3RlZCBMb29rYWhlYWRSZWFkZXIgcmVhZGVyOwogCi0JCS8vLzxzdW1tYXJ5PgotCQkvLy8gUHVzaCBhIG5ldyBKU09OIGNvbnRleHQgb250byB0aGUgc3RhY2suCi0JCS8vLzwvc3VtbWFyeT4KLQkJcHJvdGVjdGVkIHZvaWQgUHVzaENvbnRleHQoSlNPTkJhc2VDb250ZXh0IGMpCi0JCXsKLQkJCWNvbnRleHRTdGFjay5QdXNoKGNvbnRleHQpOwotCQkJY29udGV4dCA9IGM7Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUHVzaCBhIG5ldyBKU09OIGNvbnRleHQgb250byB0aGUgc3RhY2suCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCB2b2lkIFB1c2hDb250ZXh0KEpTT05CYXNlQ29udGV4dCBjKQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0U3RhY2suUHVzaChjb250ZXh0KTsKKyAgICAgICAgICAgIGNvbnRleHQgPSBjOworICAgICAgICB9CiAKLQkJLy8vPHN1bW1hcnk+Ci0JCS8vLyBQb3AgdGhlIGxhc3QgSlNPTiBjb250ZXh0IG9mZiB0aGUgc3RhY2sKLQkJLy8vPC9zdW1tYXJ5PgotCQlwcm90ZWN0ZWQgdm9pZCBQb3BDb250ZXh0KCkKLQkJewotCQkJY29udGV4dCA9IGNvbnRleHRTdGFjay5Qb3AoKTsKLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQb3AgdGhlIGxhc3QgSlNPTiBjb250ZXh0IG9mZiB0aGUgc3RhY2sKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgUG9wQ29udGV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0U3RhY2suUG9wKCk7CisgICAgICAgIH0KIAotCQkvLy88c3VtbWFyeT4KLQkJLy8vIFRKU09OUHJvdG9jb2wgQ29uc3RydWN0b3IKLQkJLy8vPC9zdW1tYXJ5PgotCQlwdWJsaWMgVEpTT05Qcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQotCQkJOiBiYXNlKHRyYW5zKQotCQl7Ci0JCQljb250ZXh0ID0gbmV3IEpTT05CYXNlQ29udGV4dCh0aGlzKTsKLQkJCXJlYWRlciA9IG5ldyBMb29rYWhlYWRSZWFkZXIodGhpcyk7Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVEpTT05Qcm90b2NvbCBDb25zdHJ1Y3RvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgVEpTT05Qcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgOiBiYXNlKHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0ID0gbmV3IEpTT05CYXNlQ29udGV4dCh0aGlzKTsKKyAgICAgICAgICAgIHJlYWRlciA9IG5ldyBMb29rYWhlYWRSZWFkZXIodGhpcyk7CisgICAgICAgIH0KIAotCQkvLyBUZW1wb3JhcnkgYnVmZmVyIHVzZWQgYnkgc2V2ZXJhbCBtZXRob2RzCi0JCXByaXZhdGUgYnl0ZVtdIHRlbXBCdWZmZXIgPSBuZXcgYnl0ZVs0XTsKKyAgICAgICAgLy8gVGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGJ5IHNldmVyYWwgbWV0aG9kcworICAgICAgICBwcml2YXRlIGJ5dGVbXSB0ZW1wQnVmZmVyID0gbmV3IGJ5dGVbNF07CiAKLQkJLy8vPHN1bW1hcnk+Ci0JCS8vLyBSZWFkIGEgYnl0ZSB0aGF0IG11c3QgbWF0Y2ggYlswXTsgb3RoZXJ3aXNlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JCS8vLyBNYXJrZWQgcHJvdGVjdGVkIHRvIGF2b2lkIHN5bnRoZXRpYyBhY2Nlc3NvciBpbiBKU09OTGlzdENvbnRleHQuUmVhZAotCQkvLy8gYW5kIEpTT05QYWlyQ29udGV4dC5SZWFkCi0JCS8vLzwvc3VtbWFyeT4KLQkJcHJvdGVjdGVkIHZvaWQgUmVhZEpTT05TeW50YXhDaGFyKGJ5dGVbXSBiKQotCQl7Ci0JCQlieXRlIGNoID0gcmVhZGVyLlJlYWQoKTsKLQkJCWlmIChjaCAhPSBiWzBdKQotCQkJewotCQkJCXRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLQkJCQkJCQkJCQkJICJVbmV4cGVjdGVkIGNoYXJhY3RlcjoiICsgKGNoYXIpY2gpOwotCQkJfQotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBieXRlIHRoYXQgbXVzdCBtYXRjaCBiWzBdOyBvdGhlcndpc2UgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgICAgLy8vIE1hcmtlZCBwcm90ZWN0ZWQgdG8gYXZvaWQgc3ludGhldGljIGFjY2Vzc29yIGluIEpTT05MaXN0Q29udGV4dC5SZWFkCisgICAgICAgIC8vLyBhbmQgSlNPTlBhaXJDb250ZXh0LlJlYWQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgUmVhZEpTT05TeW50YXhDaGFyKGJ5dGVbXSBiKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlIGNoID0gcmVhZGVyLlJlYWQoKTsKKyAgICAgICAgICAgIGlmIChjaCAhPSBiWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGNoYXJhY3RlcjoiICsgKGNoYXIpY2gpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLy8vPHN1bW1hcnk+Ci0JCS8vLyBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IGNoYXIgKCcwJy0nOScgb3IgJ2EnLSdmJykgaW50byBpdHMKLQkJLy8vIGNvcnJlc3BvbmRpbmcgaGV4IHZhbHVlCi0JCS8vLzwvc3VtbWFyeT4KLQkJcHJpdmF0ZSBzdGF0aWMgYnl0ZSBIZXhWYWwoYnl0ZSBjaCkKLQkJewotCQkJaWYgKChjaCA+PSAnMCcpICYmIChjaCA8PSAnOScpKQotCQkJewotCQkJCXJldHVybiAoYnl0ZSkoKGNoYXIpY2ggLSAnMCcpOwotCQkJfQotCQkJZWxzZSBpZiAoKGNoID49ICdhJykgJiYgKGNoIDw9ICdmJykpCi0JCQl7Ci0JCQkJcmV0dXJuIChieXRlKSgoY2hhciljaCAtICdhJyk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotCQkJCQkJCQkJCQkgIkV4cGVjdGVkIGhleCBjaGFyYWN0ZXIiKTsKLQkJCX0KLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IGNoYXIgKCcwJy0nOScgb3IgJ2EnLSdmJykgaW50byBpdHMKKyAgICAgICAgLy8vIGNvcnJlc3BvbmRpbmcgaGV4IHZhbHVlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGUgSGV4VmFsKGJ5dGUgY2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKWNoIC0gJzAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKChjaCA+PSAnYScpICYmIChjaCA8PSAnZicpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoICs9IDEwOworICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpY2ggLSAnYScpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBoZXggY2hhcmFjdGVyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvLy88c3VtbWFyeT4KLQkJLy8vIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggdmFsdWUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgaGV4IGNoYXJhY3RlcgotCQkvLy88L3N1bW1hcnk+Ci0JCXByaXZhdGUgc3RhdGljIGJ5dGUgSGV4Q2hhcihieXRlIHZhbCkKLQkJewotCQkJdmFsICY9IDB4MEY7Ci0JCQlpZiAodmFsIDwgMTApCi0JCQl7Ci0JCQkJcmV0dXJuIChieXRlKSgoY2hhcil2YWwgKyAnMCcpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJldHVybiAoYnl0ZSkoKGNoYXIpdmFsICsgJ2EnKTsKLQkJCX0KLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IHZhbHVlIHRvIGl0cyBjb3JyZXNwb25kaW5nIGhleCBjaGFyYWN0ZXIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZSBIZXhDaGFyKGJ5dGUgdmFsKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwgJj0gMHgwRjsKKyAgICAgICAgICAgIGlmICh2YWwgPCAxMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKXZhbCArICcwJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsIC09IDEwOworICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpdmFsICsgJ2EnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCS8vLzxzdW1tYXJ5PgotCQkvLy8gV3JpdGUgdGhlIGJ5dGVzIGluIGFycmF5IGJ1ZiBhcyBhIEpTT04gY2hhcmFjdGVycywgZXNjYXBpbmcgYXMgbmVlZGVkCi0JCS8vLzwvc3VtbWFyeT4KLQkJcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTlN0cmluZyhieXRlW10gYikKLQkJewotCQkJY29udGV4dC5Xcml0ZSgpOwotCQkJdHJhbnMuV3JpdGUoUVVPVEUpOwotCQkJaW50IGxlbiA9IGIuTGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJCXsKLQkJCQlpZiAoKGJbaV0gJiAweDAwRkYpID49IDB4MzApCi0JCQkJewotCQkJCQlpZiAoYltpXSA9PSBCQUNLU0xBU0hbMF0pCi0JCQkJCXsKLQkJCQkJCXRyYW5zLldyaXRlKEJBQ0tTTEFTSCk7Ci0JCQkJCQl0cmFucy5Xcml0ZShCQUNLU0xBU0gpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJdHJhbnMuV3JpdGUoYiwgaSwgMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJdGVtcEJ1ZmZlclswXSA9IEpTT05fQ0hBUl9UQUJMRVtiW2ldXTsKLQkJCQkJaWYgKHRlbXBCdWZmZXJbMF0gPT0gMSkKLQkJCQkJewotCQkJCQkJdHJhbnMuV3JpdGUoYiwgaSwgMSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAodGVtcEJ1ZmZlclswXSA+IDEpCi0JCQkJCXsKLQkJCQkJCXRyYW5zLldyaXRlKEJBQ0tTTEFTSCk7Ci0JCQkJCQl0cmFucy5Xcml0ZSh0ZW1wQnVmZmVyLCAwLCAxKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXRyYW5zLldyaXRlKEVTQ1NFUSk7Ci0JCQkJCQl0ZW1wQnVmZmVyWzBdID0gSGV4Q2hhcigoYnl0ZSkoYltpXSA+PiA0KSk7Ci0JCQkJCQl0ZW1wQnVmZmVyWzFdID0gSGV4Q2hhcihiW2ldKTsKLQkJCQkJCXRyYW5zLldyaXRlKHRlbXBCdWZmZXIsIDAsIDIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdHJhbnMuV3JpdGUoUVVPVEUpOwotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIHRoZSBieXRlcyBpbiBhcnJheSBidWYgYXMgYSBKU09OIGNoYXJhY3RlcnMsIGVzY2FwaW5nIGFzIG5lZWRlZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVKU09OU3RyaW5nKGJ5dGVbXSBiKQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LldyaXRlKCk7CisgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CisgICAgICAgICAgICBpbnQgbGVuID0gYi5MZW5ndGg7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoYltpXSAmIDB4MDBGRikgPj0gMHgzMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChiW2ldID09IEJBQ0tTTEFTSFswXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUoQkFDS1NMQVNIKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLldyaXRlKEJBQ0tTTEFTSCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShiLCBpLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0ZW1wQnVmZmVyWzBdID0gSlNPTl9DSEFSX1RBQkxFW2JbaV1dOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcEJ1ZmZlclswXSA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShiLCBpLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wQnVmZmVyWzBdID4gMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUoQkFDS1NMQVNIKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLldyaXRlKHRlbXBCdWZmZXIsIDAsIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUoRVNDU0VRKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBCdWZmZXJbMF0gPSBIZXhDaGFyKChieXRlKShiW2ldID4+IDQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBCdWZmZXJbMV0gPSBIZXhDaGFyKGJbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUodGVtcEJ1ZmZlciwgMCwgMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CisgICAgICAgIH0KIAotCQkvLy88c3VtbWFyeT4KLQkJLy8vIFdyaXRlIG91dCBudW1iZXIgYXMgYSBKU09OIHZhbHVlLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcyBzbywgaXQgd2lsbCBiZQotCQkvLy8gd3JhcHBlZCBpbiBxdW90ZXMgdG8gb3V0cHV0IGFzIGEgSlNPTiBzdHJpbmcuCi0JCS8vLzwvc3VtbWFyeT4KLQkJcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTkludGVnZXIobG9uZyBudW0pCi0JCXsKLQkJCWNvbnRleHQuV3JpdGUoKTsKLQkJCVN0cmluZyBzdHIgPSBudW0uVG9TdHJpbmcoKTsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgb3V0IG51bWJlciBhcyBhIEpTT04gdmFsdWUuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzIHNvLCBpdCB3aWxsIGJlCisgICAgICAgIC8vLyB3cmFwcGVkIGluIHF1b3RlcyB0byBvdXRwdXQgYXMgYSBKU09OIHN0cmluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTkludGVnZXIobG9uZyBudW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKyAgICAgICAgICAgIHN0cmluZyBzdHIgPSBudW0uVG9TdHJpbmcoKTsKIAotCQkJYm9vbCBlc2NhcGVOdW0gPSBjb250ZXh0LkVzY2FwZU51bWJlcnMoKTsKLQkJCWlmIChlc2NhcGVOdW0pCi0JCQkJdHJhbnMuV3JpdGUoUVVPVEUpOworICAgICAgICAgICAgYm9vbCBlc2NhcGVOdW0gPSBjb250ZXh0LkVzY2FwZU51bWJlcnMoKTsKKyAgICAgICAgICAgIGlmIChlc2NhcGVOdW0pCisgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUoUVVPVEUpOwogCi0JCQl0cmFucy5Xcml0ZSh1dGY4RW5jb2RpbmcuR2V0Qnl0ZXMoc3RyKSk7CisgICAgICAgICAgICB0cmFucy5Xcml0ZSh1dGY4RW5jb2RpbmcuR2V0Qnl0ZXMoc3RyKSk7CiAKLQkJCWlmIChlc2NhcGVOdW0pCi0JCQkJdHJhbnMuV3JpdGUoUVVPVEUpOwotCQl9CisgICAgICAgICAgICBpZiAoZXNjYXBlTnVtKQorICAgICAgICAgICAgICAgIHRyYW5zLldyaXRlKFFVT1RFKTsKKyAgICAgICAgfQogCi0JCS8vLzxzdW1tYXJ5PgotCQkvLy8gV3JpdGUgb3V0IGEgZG91YmxlIGFzIGEgSlNPTiB2YWx1ZS4gSWYgaXQgaXMgTmFOIG9yIGluZmluaXR5IG9yIGlmIHRoZQotCQkvLy8gY29udGV4dCBkaWN0YXRlcyBlc2NhcGluZywgV3JpdGUgb3V0IGFzIEpTT04gc3RyaW5nLgotCQkvLy88L3N1bW1hcnk+Ci0JCXByaXZhdGUgdm9pZCBXcml0ZUpTT05Eb3VibGUoZG91YmxlIG51bSkKLQkJewotCQkJY29udGV4dC5Xcml0ZSgpOwotCQkJU3RyaW5nIHN0ciA9IG51bS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLQkJCWJvb2wgc3BlY2lhbCA9IGZhbHNlOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBvdXQgYSBkb3VibGUgYXMgYSBKU09OIHZhbHVlLiBJZiBpdCBpcyBOYU4gb3IgaW5maW5pdHkgb3IgaWYgdGhlCisgICAgICAgIC8vLyBjb250ZXh0IGRpY3RhdGVzIGVzY2FwaW5nLCBXcml0ZSBvdXQgYXMgSlNPTiBzdHJpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUpTT05Eb3VibGUoZG91YmxlIG51bSkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5Xcml0ZSgpOworICAgICAgICAgICAgc3RyaW5nIHN0ciA9IG51bS5Ub1N0cmluZygiRzE3IiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICBib29sIHNwZWNpYWwgPSBmYWxzZTsKIAotCQkJc3dpdGNoIChzdHJbMF0pCi0JCQl7Ci0JCQkJY2FzZSAnTic6IC8vIE5hTgotCQkJCWNhc2UgJ0knOiAvLyBJbmZpbml0eQotCQkJCQlzcGVjaWFsID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnLSc6Ci0JCQkJCWlmIChzdHJbMV0gPT0gJ0knKQotCQkJCQl7IC8vIC1JbmZpbml0eQotCQkJCQkJc3BlY2lhbCA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9CisgICAgICAgICAgICBzd2l0Y2ggKHN0clswXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICdOJzogLy8gTmFOCisgICAgICAgICAgICAgICAgY2FzZSAnSSc6IC8vIEluZmluaXR5CisgICAgICAgICAgICAgICAgICAgIHNwZWNpYWwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICctJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0clsxXSA9PSAnSScpCisgICAgICAgICAgICAgICAgICAgIHsgLy8gLUluZmluaXR5CisgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KIAotCQkJYm9vbCBlc2NhcGVOdW0gPSBzcGVjaWFsIHx8IGNvbnRleHQuRXNjYXBlTnVtYmVycygpOworICAgICAgICAgICAgYm9vbCBlc2NhcGVOdW0gPSBzcGVjaWFsIHx8IGNvbnRleHQuRXNjYXBlTnVtYmVycygpOwogCi0JCQlpZiAoZXNjYXBlTnVtKQotCQkJCXRyYW5zLldyaXRlKFFVT1RFKTsKKyAgICAgICAgICAgIGlmIChlc2NhcGVOdW0pCisgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUoUVVPVEUpOwogCi0JCQl0cmFucy5Xcml0ZSh1dGY4RW5jb2RpbmcuR2V0Qnl0ZXMoc3RyKSk7CisgICAgICAgICAgICB0cmFucy5Xcml0ZSh1dGY4RW5jb2RpbmcuR2V0Qnl0ZXMoc3RyKSk7CiAKLQkJCWlmIChlc2NhcGVOdW0pCi0JCQkJdHJhbnMuV3JpdGUoUVVPVEUpOwotCQl9Ci0JCS8vLzxzdW1tYXJ5PgotCQkvLy8gV3JpdGUgb3V0IGNvbnRlbnRzIG9mIGJ5dGUgYXJyYXkgYiBhcyBhIEpTT04gc3RyaW5nIHdpdGggYmFzZS02NCBlbmNvZGVkCi0JCS8vLyBkYXRhCi0JCS8vLzwvc3VtbWFyeT4KLQkJcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTkJhc2U2NChieXRlW10gYikKLQkJewotCQkJY29udGV4dC5Xcml0ZSgpOwotCQkJdHJhbnMuV3JpdGUoUVVPVEUpOworICAgICAgICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgb3V0IGNvbnRlbnRzIG9mIGJ5dGUgYXJyYXkgYiBhcyBhIEpTT04gc3RyaW5nIHdpdGggYmFzZS02NCBlbmNvZGVkCisgICAgICAgIC8vLyBkYXRhCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUpTT05CYXNlNjQoYnl0ZVtdIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKFFVT1RFKTsKIAotCQkJaW50IGxlbiA9IGIuTGVuZ3RoOwotCQkJaW50IG9mZiA9IDA7CisgICAgICAgICAgICBpbnQgbGVuID0gYi5MZW5ndGg7CisgICAgICAgICAgICBpbnQgb2ZmID0gMDsKIAotCQkJd2hpbGUgKGxlbiA+PSAzKQotCQkJewotCQkJCS8vIEVuY29kZSAzIGJ5dGVzIGF0IGEgdGltZQotCQkJCVRCYXNlNjRVdGlscy5lbmNvZGUoYiwgb2ZmLCAzLCB0ZW1wQnVmZmVyLCAwKTsKLQkJCQl0cmFucy5Xcml0ZSh0ZW1wQnVmZmVyLCAwLCA0KTsKLQkJCQlvZmYgKz0gMzsKLQkJCQlsZW4gLT0gMzsKLQkJCX0KLQkJCWlmIChsZW4gPiAwKQotCQkJewotCQkJCS8vIEVuY29kZSByZW1haW5kZXIKLQkJCQlUQmFzZTY0VXRpbHMuZW5jb2RlKGIsIG9mZiwgbGVuLCB0ZW1wQnVmZmVyLCAwKTsKLQkJCQl0cmFucy5Xcml0ZSh0ZW1wQnVmZmVyLCAwLCBsZW4gKyAxKTsKLQkJCX0KKyAgICAgICAgICAgIHdoaWxlIChsZW4gPj0gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBFbmNvZGUgMyBieXRlcyBhdCBhIHRpbWUKKyAgICAgICAgICAgICAgICBUQmFzZTY0VXRpbHMuZW5jb2RlKGIsIG9mZiwgMywgdGVtcEJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUodGVtcEJ1ZmZlciwgMCwgNCk7CisgICAgICAgICAgICAgICAgb2ZmICs9IDM7CisgICAgICAgICAgICAgICAgbGVuIC09IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGVuID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBFbmNvZGUgcmVtYWluZGVyCisgICAgICAgICAgICAgICAgVEJhc2U2NFV0aWxzLmVuY29kZShiLCBvZmYsIGxlbiwgdGVtcEJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUodGVtcEJ1ZmZlciwgMCwgbGVuICsgMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKFFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUpTT05PYmplY3RTdGFydCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKExCUkFDRSk7CisgICAgICAgICAgICBQdXNoQ29udGV4dChuZXcgSlNPTlBhaXJDb250ZXh0KHRoaXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUpTT05PYmplY3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgICAgICB0cmFucy5Xcml0ZShSQlJBQ0UpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTkFycmF5U3RhcnQoKQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LldyaXRlKCk7CisgICAgICAgICAgICB0cmFucy5Xcml0ZShMQlJBQ0tFVCk7CisgICAgICAgICAgICBQdXNoQ29udGV4dChuZXcgSlNPTkxpc3RDb250ZXh0KHRoaXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUpTT05BcnJheUVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKFJCUkFDS0VUKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIoVkVSU0lPTik7CisKKyAgICAgICAgICAgIGJ5dGVbXSBiID0gdXRmOEVuY29kaW5nLkdldEJ5dGVzKG1lc3NhZ2UuTmFtZSk7CisgICAgICAgICAgICBXcml0ZUpTT05TdHJpbmcoYik7CisKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIoKGxvbmcpbWVzc2FnZS5UeXBlKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIobWVzc2FnZS5TZXFJRCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1lc3NhZ2VFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05BcnJheUVuZCgpOworICAgICAgICB9CiAKLQkJCXRyYW5zLldyaXRlKFFVT1RFKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RyKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05PYmplY3RTdGFydCgpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTk9iamVjdFN0YXJ0KCkKLQkJewotCQkJY29udGV4dC5Xcml0ZSgpOwotCQkJdHJhbnMuV3JpdGUoTEJSQUNFKTsKLQkJCVB1c2hDb250ZXh0KG5ldyBKU09OUGFpckNvbnRleHQodGhpcykpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RydWN0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OT2JqZWN0RW5kKCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgV3JpdGVKU09OT2JqZWN0RW5kKCkKLQkJewotCQkJUG9wQ29udGV4dCgpOwotCQkJdHJhbnMuV3JpdGUoUkJSQUNFKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKGZpZWxkLklEKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgICAgICBXcml0ZUpTT05TdHJpbmcoR2V0VHlwZU5hbWVGb3JUeXBlSUQoZmllbGQuVHlwZSkpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTkFycmF5U3RhcnQoKQotCQl7Ci0JCQljb250ZXh0LldyaXRlKCk7Ci0JCQl0cmFucy5Xcml0ZShMQlJBQ0tFVCk7Ci0JCQlQdXNoQ29udGV4dChuZXcgSlNPTkxpc3RDb250ZXh0KHRoaXMpKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkRW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OT2JqZWN0RW5kKCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgV3JpdGVKU09OQXJyYXlFbmQoKQotCQl7Ci0JCQlQb3BDb250ZXh0KCk7Ci0JCQl0cmFucy5Xcml0ZShSQlJBQ0tFVCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZFN0b3AoKSB7IH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKQotCQl7Ci0JCQlXcml0ZUpTT05BcnJheVN0YXJ0KCk7Ci0JCQlXcml0ZUpTT05JbnRlZ2VyKFZFUlNJT04pOworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1hcEJlZ2luKFRNYXAgbWFwKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICAgICBXcml0ZUpTT05TdHJpbmcoR2V0VHlwZU5hbWVGb3JUeXBlSUQobWFwLktleVR5cGUpKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTlN0cmluZyhHZXRUeXBlTmFtZUZvclR5cGVJRChtYXAuVmFsdWVUeXBlKSk7CisgICAgICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKG1hcC5Db3VudCk7CisgICAgICAgICAgICBXcml0ZUpTT05PYmplY3RTdGFydCgpOworICAgICAgICB9CiAKLQkJCWJ5dGVbXSBiID0gdXRmOEVuY29kaW5nLkdldEJ5dGVzKG1lc3NhZ2UuTmFtZSk7Ci0JCQlXcml0ZUpTT05TdHJpbmcoYik7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWFwRW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OT2JqZWN0RW5kKCk7CisgICAgICAgICAgICBXcml0ZUpTT05BcnJheUVuZCgpOworICAgICAgICB9CiAKLQkJCVdyaXRlSlNPTkludGVnZXIoKGxvbmcpbWVzc2FnZS5UeXBlKTsKLQkJCVdyaXRlSlNPTkludGVnZXIobWVzc2FnZS5TZXFJRCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OQXJyYXlTdGFydCgpOworICAgICAgICAgICAgV3JpdGVKU09OU3RyaW5nKEdldFR5cGVOYW1lRm9yVHlwZUlEKGxpc3QuRWxlbWVudFR5cGUpKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIobGlzdC5Db3VudCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1lc3NhZ2VFbmQoKQotCQl7Ci0JCQlXcml0ZUpTT05BcnJheUVuZCgpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTGlzdEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RyKQotCQl7Ci0JCQlXcml0ZUpTT05PYmplY3RTdGFydCgpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU2V0QmVnaW4oVFNldCBzZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTlN0cmluZyhHZXRUeXBlTmFtZUZvclR5cGVJRChzZXQuRWxlbWVudFR5cGUpKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIoc2V0LkNvdW50KTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RydWN0RW5kKCkKLQkJewotCQkJV3JpdGVKU09OT2JqZWN0RW5kKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTZXRFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05BcnJheUVuZCgpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkKLQkJewotCQkJV3JpdGVKU09OSW50ZWdlcihmaWVsZC5JRCk7Ci0JCQlXcml0ZUpTT05PYmplY3RTdGFydCgpOwotCQkJV3JpdGVKU09OU3RyaW5nKEdldFR5cGVOYW1lRm9yVHlwZUlEKGZpZWxkLlR5cGUpKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJvb2woYm9vbCBiKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKGIgPyAobG9uZykxIDogKGxvbmcpMCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkRW5kKCkKLQkJewotCQkJV3JpdGVKU09OT2JqZWN0RW5kKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCeXRlKHNieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIoKGxvbmcpYik7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkU3RvcCgpIHsgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUkxNihzaG9ydCBpMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIoKGxvbmcpaTE2KTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWFwQmVnaW4oVE1hcCBtYXApCi0JCXsKLQkJCVdyaXRlSlNPTkFycmF5U3RhcnQoKTsKLQkJCVdyaXRlSlNPTlN0cmluZyhHZXRUeXBlTmFtZUZvclR5cGVJRChtYXAuS2V5VHlwZSkpOwotCQkJV3JpdGVKU09OU3RyaW5nKEdldFR5cGVOYW1lRm9yVHlwZUlEKG1hcC5WYWx1ZVR5cGUpKTsKLQkJCVdyaXRlSlNPTkludGVnZXIobWFwLkNvdW50KTsKLQkJCVdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMzIoaW50IGkzMikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlcigobG9uZylpMzIpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNYXBFbmQoKQotCQl7Ci0JCQlXcml0ZUpTT05PYmplY3RFbmQoKTsKLQkJCVdyaXRlSlNPTkFycmF5RW5kKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJNjQobG9uZyBpNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIoaTY0KTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpCi0JCXsKLQkJCVdyaXRlSlNPTkFycmF5U3RhcnQoKTsKLQkJCVdyaXRlSlNPTlN0cmluZyhHZXRUeXBlTmFtZUZvclR5cGVJRChsaXN0LkVsZW1lbnRUeXBlKSk7Ci0JCQlXcml0ZUpTT05JbnRlZ2VyKGxpc3QuQ291bnQpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRG91YmxlKGRvdWJsZSBkdWIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkRvdWJsZShkdWIpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0RW5kKCkKLQkJewotCQkJV3JpdGVKU09OQXJyYXlFbmQoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cmluZyhzdHJpbmcgc3RyKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gYiA9IHV0ZjhFbmNvZGluZy5HZXRCeXRlcyhzdHIpOworICAgICAgICAgICAgV3JpdGVKU09OU3RyaW5nKGIpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTZXRCZWdpbihUU2V0IHNldCkKLQkJewotCQkJV3JpdGVKU09OQXJyYXlTdGFydCgpOwotCQkJV3JpdGVKU09OU3RyaW5nKEdldFR5cGVOYW1lRm9yVHlwZUlEKHNldC5FbGVtZW50VHlwZSkpOwotCQkJV3JpdGVKU09OSW50ZWdlcihzZXQuQ291bnQpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQmluYXJ5KGJ5dGVbXSBiaW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkJhc2U2NChiaW4pOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTZXRFbmQoKQotCQl7Ci0JCQlXcml0ZUpTT05BcnJheUVuZCgpOwotCQl9CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAgICAgICAqLwogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQm9vbChib29sIGIpCi0JCXsKLQkJCVdyaXRlSlNPTkludGVnZXIoYiA/IChsb25nKTEgOiAobG9uZykwKTsKLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGluIGEgSlNPTiBzdHJpbmcsIHVuZXNjYXBpbmcgYXMgYXBwcm9wcmlhdGUuLiBTa2lwIFJlYWRpbmcgZnJvbSB0aGUKKyAgICAgICAgLy8vIGNvbnRleHQgaWYgc2tpcENvbnRleHQgaXMgdHJ1ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gUmVhZEpTT05TdHJpbmcoYm9vbCBza2lwQ29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgTWVtb3J5U3RyZWFtIGJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIExpc3Q8Y2hhcj4gY29kZXVuaXRzID0gbmV3IExpc3Q8Y2hhcj4oKTsKIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJ5dGUoYnl0ZSBiKQotCQl7Ci0JCQlXcml0ZUpTT05JbnRlZ2VyKChsb25nKWIpOwotCQl9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMTYoc2hvcnQgaTE2KQotCQl7Ci0JCQlXcml0ZUpTT05JbnRlZ2VyKChsb25nKWkxNik7Ci0JCX0KKyAgICAgICAgICAgIGlmICghc2tpcENvbnRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGV4dC5SZWFkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZSBjaCA9IHJlYWRlci5SZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKGNoID09IFFVT1RFWzBdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTMyKGludCBpMzIpCi0JCXsKLQkJCVdyaXRlSlNPTkludGVnZXIoKGxvbmcpaTMyKTsKLQkJfQorICAgICAgICAgICAgICAgIC8vIGVzY2FwZWQ/CisgICAgICAgICAgICAgICAgaWYgKGNoICE9IEVTQ1NFUVswXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5Xcml0ZShuZXcgYnl0ZVtdIHsgKGJ5dGUpY2ggfSwgMCwgMSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUk2NChsb25nIGk2NCkKLQkJewotCQkJV3JpdGVKU09OSW50ZWdlcihpNjQpOwotCQl9CisgICAgICAgICAgICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBcdVhYWFggYW5kIFw/CisgICAgICAgICAgICAgICAgY2ggPSByZWFkZXIuUmVhZCgpOworICAgICAgICAgICAgICAgIGlmIChjaCAhPSBFU0NTRVFbMV0pICAvLyBjb250cm9sIGNoYXJzIGxpa2UgXG4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBvZmYgPSBBcnJheS5JbmRleE9mKEVTQ0FQRV9DSEFSUywgKGNoYXIpY2gpOworICAgICAgICAgICAgICAgICAgICBpZiAob2ZmID09IC0xKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBjb250cm9sIGNoYXIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjaCA9IEVTQ0FQRV9DSEFSX1ZBTFNbb2ZmXTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLldyaXRlKG5ldyBieXRlW10geyAoYnl0ZSljaCB9LCAwLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRG91YmxlKGRvdWJsZSBkdWIpCi0JCXsKLQkJCVdyaXRlSlNPTkRvdWJsZShkdWIpOwotCQl9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJpbmcoU3RyaW5nIHN0cikKLQkJewotCQkJYnl0ZVtdIGIgPSB1dGY4RW5jb2RpbmcuR2V0Qnl0ZXMoc3RyKTsKLQkJCVdyaXRlSlNPTlN0cmluZyhiKTsKLQkJfQorICAgICAgICAgICAgICAgIC8vIGl0J3MgXHVYWFhYCisgICAgICAgICAgICAgICAgdHJhbnMuUmVhZEFsbCh0ZW1wQnVmZmVyLCAwLCA0KTsKKyAgICAgICAgICAgICAgICB2YXIgd2NoID0gKHNob3J0KSgoSGV4VmFsKChieXRlKXRlbXBCdWZmZXJbMF0pIDw8IDEyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhleFZhbCgoYnl0ZSl0ZW1wQnVmZmVyWzFdKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhleFZhbCgoYnl0ZSl0ZW1wQnVmZmVyWzJdKSA8PCA0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhleFZhbCh0ZW1wQnVmZmVyWzNdKSk7CisgICAgICAgICAgICAgICAgaWYgKENoYXIuSXNIaWdoU3Vycm9nYXRlKChjaGFyKXdjaCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29kZXVuaXRzLkFkZCgoY2hhcil3Y2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChDaGFyLklzTG93U3Vycm9nYXRlKChjaGFyKXdjaCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLkNvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGhpZ2ggc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb2RldW5pdHMuQWRkKChjaGFyKXdjaCk7CisgICAgICAgICAgICAgICAgICAgIHZhciB0bXAgPSB1dGY4RW5jb2RpbmcuR2V0Qnl0ZXMoY29kZXVuaXRzLlRvQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5Xcml0ZSh0bXAsIDAsIHRtcC5MZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBjb2RldW5pdHMuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHRtcCA9IHV0ZjhFbmNvZGluZy5HZXRCeXRlcyhuZXcgY2hhcltdIHsgKGNoYXIpd2NoIH0pOworICAgICAgICAgICAgICAgICAgICBidWZmZXIuV3JpdGUodG1wLCAwLCB0bXAuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCaW5hcnkoYnl0ZVtdIGJpbikKLQkJewotCQkJV3JpdGVKU09OQmFzZTY0KGJpbik7Ci0JCX0KIAotCQkvKioKLQkJICogUmVhZGluZyBtZXRob2RzLgotCQkgKi8KKyAgICAgICAgICAgIGlmIChjb2RldW5pdHMuQ291bnQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgIH0KIAotCQkvLy88c3VtbWFyeT4KLQkJLy8vIFJlYWQgaW4gYSBKU09OIHN0cmluZywgdW5lc2NhcGluZyBhcyBhcHByb3ByaWF0ZS4uIFNraXAgUmVhZGluZyBmcm9tIHRoZQotCQkvLy8gY29udGV4dCBpZiBza2lwQ29udGV4dCBpcyB0cnVlLgotCQkvLy88L3N1bW1hcnk+Ci0JCXByaXZhdGUgYnl0ZVtdIFJlYWRKU09OU3RyaW5nKGJvb2wgc2tpcENvbnRleHQpCi0JCXsKLQkJCU1lbW9yeVN0cmVhbSBidWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICByZXR1cm4gYnVmZmVyLlRvQXJyYXkoKTsKKyAgICAgICAgfQogCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBieXRlIGNvdWxkIGJlIGEgdmFsaWQgcGFydCBvZiBhIEpTT04gbnVtYmVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGJvb2wgSXNKU09OTnVtZXJpYyhieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKScrJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSctJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKScuJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKScwJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKScxJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKScyJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSczJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc0JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc1JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc2JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc3JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc4JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc5JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSdFJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSdlJzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KIAotCQkJaWYgKCFza2lwQ29udGV4dCkKLQkJCXsKLQkJCQljb250ZXh0LlJlYWQoKTsKLQkJCX0KLQkJCVJlYWRKU09OU3ludGF4Q2hhcihRVU9URSk7Ci0JCQl3aGlsZSAodHJ1ZSkKLQkJCXsKLQkJCQlieXRlIGNoID0gcmVhZGVyLlJlYWQoKTsKLQkJCQlpZiAoY2ggPT0gUVVPVEVbMF0pCi0JCQkJewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKGNoID09IEVTQ1NFUVswXSkKLQkJCQl7Ci0JCQkJCWNoID0gcmVhZGVyLlJlYWQoKTsKLQkJCQkJaWYgKGNoID09IEVTQ1NFUVsxXSkKLQkJCQkJewotCQkJCQkJUmVhZEpTT05TeW50YXhDaGFyKFpFUk8pOwotCQkJCQkJUmVhZEpTT05TeW50YXhDaGFyKFpFUk8pOwotCQkJCQkJdHJhbnMuUmVhZEFsbCh0ZW1wQnVmZmVyLCAwLCAyKTsKLQkJCQkJCWNoID0gKGJ5dGUpKChIZXhWYWwoKGJ5dGUpdGVtcEJ1ZmZlclswXSkgPDwgNCkgKyBIZXhWYWwodGVtcEJ1ZmZlclsxXSkpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJaW50IG9mZiA9IEFycmF5LkluZGV4T2YoRVNDQVBFX0NIQVJTLCAoY2hhciljaCk7Ci0JCQkJCQlpZiAob2ZmID09IC0xKQotCQkJCQkJewotCQkJCQkJCXRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLQkJCQkJCQkJCQkJCQkJICJFeHBlY3RlZCBjb250cm9sIGNoYXIiKTsKLQkJCQkJCX0KLQkJCQkJCWNoID0gRVNDQVBFX0NIQVJfVkFMU1tvZmZdOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJ1ZmZlci5Xcml0ZShuZXcgYnl0ZVtdIHsgKGJ5dGUpY2ggfSwgMCwgMSk7Ci0JCQl9Ci0JCQlyZXR1cm4gYnVmZmVyLlRvQXJyYXkoKTsKLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGluIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB0aGF0IGFyZSBhbGwgdmFsaWQgaW4gSlNPTiBudW1iZXJzLiBEb2VzCisgICAgICAgIC8vLyBub3QgZG8gYSBjb21wbGV0ZSByZWdleCBjaGVjayB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkgYSBudW1iZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgc3RyaW5nIFJlYWRKU09OTnVtZXJpY0NoYXJzKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzdHJibGQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZSBjaCA9IHJlYWRlci5QZWVrKCk7CisgICAgICAgICAgICAgICAgaWYgKCFJc0pTT05OdW1lcmljKGNoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJibGQuQXBwZW5kKChjaGFyKXJlYWRlci5SZWFkKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0cmJsZC5Ub1N0cmluZygpOworICAgICAgICB9CiAKLQkJLy8vPHN1bW1hcnk+Ci0JCS8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnl0ZSBjb3VsZCBiZSBhIHZhbGlkIHBhcnQgb2YgYSBKU09OIG51bWJlci4KLQkJLy8vPC9zdW1tYXJ5PgotCQlwcml2YXRlIGJvb2wgSXNKU09OTnVtZXJpYyhieXRlIGIpCi0JCXsKLQkJCXN3aXRjaCAoYikKLQkJCXsKLQkJCQljYXNlIChieXRlKScrJzoKLQkJCQljYXNlIChieXRlKSctJzoKLQkJCQljYXNlIChieXRlKScuJzoKLQkJCQljYXNlIChieXRlKScwJzoKLQkJCQljYXNlIChieXRlKScxJzoKLQkJCQljYXNlIChieXRlKScyJzoKLQkJCQljYXNlIChieXRlKSczJzoKLQkJCQljYXNlIChieXRlKSc0JzoKLQkJCQljYXNlIChieXRlKSc1JzoKLQkJCQljYXNlIChieXRlKSc2JzoKLQkJCQljYXNlIChieXRlKSc3JzoKLQkJCQljYXNlIChieXRlKSc4JzoKLQkJCQljYXNlIChieXRlKSc5JzoKLQkJCQljYXNlIChieXRlKSdFJzoKLQkJCQljYXNlIChieXRlKSdlJzoKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBpbiBhIEpTT04gbnVtYmVyLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcywgUmVhZCBpbiBlbmNsb3NpbmcgcXVvdGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGxvbmcgUmVhZEpTT05JbnRlZ2VyKCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5SZWFkKCk7CisgICAgICAgICAgICBpZiAoY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKTsKKyAgICAgICAgICAgIH0KIAotCQkvLy88c3VtbWFyeT4KLQkJLy8vIFJlYWQgaW4gYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGFsbCB2YWxpZCBpbiBKU09OIG51bWJlcnMuIERvZXMKLQkJLy8vIG5vdCBkbyBhIGNvbXBsZXRlIHJlZ2V4IGNoZWNrIHRvIHZhbGlkYXRlIHRoYXQgdGhpcyBpcyBhY3R1YWxseSBhIG51bWJlci4KLQkJLy8vLzwvc3VtbWFyeT4KLQkJcHJpdmF0ZSBTdHJpbmcgUmVhZEpTT05OdW1lcmljQ2hhcnMoKQotCQl7Ci0JCQlTdHJpbmdCdWlsZGVyIHN0cmJsZCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQl3aGlsZSAodHJ1ZSkKLQkJCXsKLQkJCQlieXRlIGNoID0gcmVhZGVyLlBlZWsoKTsKLQkJCQlpZiAoIUlzSlNPTk51bWVyaWMoY2gpKQotCQkJCXsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXN0cmJsZC5BcHBlbmQoKGNoYXIpcmVhZGVyLlJlYWQoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RyYmxkLlRvU3RyaW5nKCk7Ci0JCX0KKyAgICAgICAgICAgIHN0cmluZyBzdHIgPSBSZWFkSlNPTk51bWVyaWNDaGFycygpOworICAgICAgICAgICAgaWYgKGNvbnRleHQuRXNjYXBlTnVtYmVycygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhcihRVU9URSk7CisgICAgICAgICAgICB9CiAKLQkJLy8vPHN1bW1hcnk+Ci0JCS8vLyBSZWFkIGluIGEgSlNPTiBudW1iZXIuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzLCBSZWFkIGluIGVuY2xvc2luZyBxdW90ZXMuCi0JCS8vLzwvc3VtbWFyeT4KLQkJcHJpdmF0ZSBsb25nIFJlYWRKU09OSW50ZWdlcigpCi0JCXsKLQkJCWNvbnRleHQuUmVhZCgpOwotCQkJaWYgKGNvbnRleHQuRXNjYXBlTnVtYmVycygpKQotCQkJewotCQkJCVJlYWRKU09OU3ludGF4Q2hhcihRVU9URSk7Ci0JCQl9Ci0JCQlTdHJpbmcgc3RyID0gUmVhZEpTT05OdW1lcmljQ2hhcnMoKTsKLQkJCWlmIChjb250ZXh0LkVzY2FwZU51bWJlcnMoKSkKLQkJCXsKLQkJCQlSZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpOwotCQkJfQotCQkJdHJ5Ci0JCQl7Ci0JCQkJcmV0dXJuIEludDY0LlBhcnNlKHN0cik7Ci0JCQl9Ci0JCQljYXRjaCAoRm9ybWF0RXhjZXB0aW9uKQotCQkJewotCQkJCXRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLQkJCQkJCQkJCQkJICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIik7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBJbnQ2NC5QYXJzZShzdHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbiBmZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiLCBmZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLy8vPHN1bW1hcnk+Ci0JCS8vLyBSZWFkIGluIGEgSlNPTiBkb3VibGUgdmFsdWUuIFRocm93IGlmIHRoZSB2YWx1ZSBpcyBub3Qgd3JhcHBlZCBpbiBxdW90ZXMKLQkJLy8vIHdoZW4gZXhwZWN0ZWQgb3IgaWYgd3JhcHBlZCBpbiBxdW90ZXMgd2hlbiBub3QgZXhwZWN0ZWQuCi0JCS8vLzwvc3VtbWFyeT4KLQkJcHJpdmF0ZSBkb3VibGUgUmVhZEpTT05Eb3VibGUoKQotCQl7Ci0JCQljb250ZXh0LlJlYWQoKTsKLQkJCWlmIChyZWFkZXIuUGVlaygpID09IFFVT1RFWzBdKQotCQkJewotCQkJCWJ5dGVbXSBhcnIgPSBSZWFkSlNPTlN0cmluZyh0cnVlKTsKLQkJCQlkb3VibGUgZHViID0gRG91YmxlLlBhcnNlKHV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYXJyKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgaW4gYSBKU09OIGRvdWJsZSB2YWx1ZS4gVGhyb3cgaWYgdGhlIHZhbHVlIGlzIG5vdCB3cmFwcGVkIGluIHF1b3RlcworICAgICAgICAvLy8gd2hlbiBleHBlY3RlZCBvciBpZiB3cmFwcGVkIGluIHF1b3RlcyB3aGVuIG5vdCBleHBlY3RlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBkb3VibGUgUmVhZEpTT05Eb3VibGUoKQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LlJlYWQoKTsKKyAgICAgICAgICAgIGlmIChyZWFkZXIuUGVlaygpID09IFFVT1RFWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGVbXSBhcnIgPSBSZWFkSlNPTlN0cmluZyh0cnVlKTsKKyAgICAgICAgICAgICAgICBkb3VibGUgZHViID0gRG91YmxlLlBhcnNlKHV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYXJyLCAwLCBhcnIuTGVuZ3RoKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CiAKLQkJCQlpZiAoIWNvbnRleHQuRXNjYXBlTnVtYmVycygpICYmICFEb3VibGUuSXNOYU4oZHViKSAmJgotCQkJCQkhRG91YmxlLklzSW5maW5pdHkoZHViKSkKLQkJCQl7Ci0JCQkJCS8vIFRocm93IGV4Y2VwdGlvbiAtLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluIHRoaXMgY2FzZQotCQkJCQl0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCi0JCQkJCQkJCQkJCQkgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7Ci0JCQkJfQotCQkJCXJldHVybiBkdWI7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKGNvbnRleHQuRXNjYXBlTnVtYmVycygpKQotCQkJCXsKLQkJCQkJLy8gVGhpcyB3aWxsIHRocm93IC0gd2Ugc2hvdWxkIGhhdmUgaGFkIGEgcXVvdGUgaWYgZXNjYXBlTnVtID09IHRydWUKLQkJCQkJUmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKTsKLQkJCQl9Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlyZXR1cm4gRG91YmxlLlBhcnNlKFJlYWRKU09OTnVtZXJpY0NoYXJzKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoRm9ybWF0RXhjZXB0aW9uKQotCQkJCXsKLQkJCQkJdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotCQkJCQkJCQkJCQkJICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIik7Ci0JCQkJfQotCQkJfQotCQl9CisgICAgICAgICAgICAgICAgaWYgKCFjb250ZXh0LkVzY2FwZU51bWJlcnMoKSAmJiAhRG91YmxlLklzTmFOKGR1YikgJiYgIURvdWJsZS5Jc0luZmluaXR5KGR1YikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZHViOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LkVzY2FwZU51bWJlcnMoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyAtIHdlIHNob3VsZCBoYXZlIGhhZCBhIHF1b3RlIGlmIGVzY2FwZU51bSA9PSB0cnVlCisgICAgICAgICAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhcihRVU9URSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERvdWJsZS5QYXJzZShSZWFkSlNPTk51bWVyaWNDaGFycygpLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbiBmZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiLCBmZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCS8vPHN1bW1hcnk+Ci0JCS8vLyBSZWFkIGluIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBiYXNlLTY0IGVuY29kZWQgZGF0YSBhbmQgZGVjb2RlIGl0LgotCQkvLy88L3N1bW1hcnk+Ci0JCXByaXZhdGUgYnl0ZVtdIFJlYWRKU09OQmFzZTY0KCkKLQkJewotCQkJYnl0ZVtdIGIgPSBSZWFkSlNPTlN0cmluZyhmYWxzZSk7Ci0JCQlpbnQgbGVuID0gYi5MZW5ndGg7Ci0JCQlpbnQgb2ZmID0gMDsKLQkJCWludCBzaXplID0gMDsKLQkJCXdoaWxlIChsZW4gPj0gNCkKLQkJCXsKLQkJCQkvLyBEZWNvZGUgNCBieXRlcyBhdCBhIHRpbWUKLQkJCQlUQmFzZTY0VXRpbHMuZGVjb2RlKGIsIG9mZiwgNCwgYiwgc2l6ZSk7IC8vIE5COiBkZWNvZGVkIGluIHBsYWNlCi0JCQkJb2ZmICs9IDQ7Ci0JCQkJbGVuIC09IDQ7Ci0JCQkJc2l6ZSArPSAzOwotCQkJfQotCQkJLy8gRG9uJ3QgZGVjb2RlIGlmIHdlIGhpdCB0aGUgZW5kIG9yIGdvdCBhIHNpbmdsZSBsZWZ0b3ZlciBieXRlIChpbnZhbGlkCi0JCQkvLyBiYXNlNjQgYnV0IGxlZ2FsIGZvciBza2lwIG9mIHJlZ3VsYXIgc3RyaW5nIHR5cGUpCi0JCQlpZiAobGVuID4gMSkKLQkJCXsKLQkJCQkvLyBEZWNvZGUgcmVtYWluZGVyCi0JCQkJVEJhc2U2NFV0aWxzLmRlY29kZShiLCBvZmYsIGxlbiwgYiwgc2l6ZSk7IC8vIE5COiBkZWNvZGVkIGluIHBsYWNlCi0JCQkJc2l6ZSArPSBsZW4gLSAxOwotCQkJfQotCQkJLy8gU2FkbHkgd2UgbXVzdCBjb3B5IHRoZSBieXRlW10gKGFueSB3YXkgYXJvdW5kIHRoaXM/KQotCQkJYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW3NpemVdOwotCQkJQXJyYXkuQ29weShiLCAwLCByZXN1bHQsIDAsIHNpemUpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGluIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBiYXNlLTY0IGVuY29kZWQgZGF0YSBhbmQgZGVjb2RlIGl0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGJ5dGVbXSBSZWFkSlNPTkJhc2U2NCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBiID0gUmVhZEpTT05TdHJpbmcoZmFsc2UpOworICAgICAgICAgICAgaW50IGxlbiA9IGIuTGVuZ3RoOworICAgICAgICAgICAgaW50IG9mZiA9IDA7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IDA7CisgICAgICAgICAgICAvLyByZWR1Y2UgbGVuIHRvIGlnbm9yZSBmaWxsIGJ5dGVzCisgICAgICAgICAgICB3aGlsZSAoKGxlbiA+IDApICYmIChiW2xlbiAtIDFdID09ICc9JykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLS1sZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyByZWFkICYgZGVjb2RlIGZ1bGwgYnl0ZSB0cmlwbGV0cyA9IDQgc291cmNlIGJ5dGVzCisgICAgICAgICAgICB3aGlsZSAobGVuID4gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBEZWNvZGUgNCBieXRlcyBhdCBhIHRpbWUKKyAgICAgICAgICAgICAgICBUQmFzZTY0VXRpbHMuZGVjb2RlKGIsIG9mZiwgNCwgYiwgc2l6ZSk7IC8vIE5COiBkZWNvZGVkIGluIHBsYWNlCisgICAgICAgICAgICAgICAgb2ZmICs9IDQ7CisgICAgICAgICAgICAgICAgbGVuIC09IDQ7CisgICAgICAgICAgICAgICAgc2l6ZSArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRG9uJ3QgZGVjb2RlIGlmIHdlIGhpdCB0aGUgZW5kIG9yIGdvdCBhIHNpbmdsZSBsZWZ0b3ZlciBieXRlIChpbnZhbGlkCisgICAgICAgICAgICAvLyBiYXNlNjQgYnV0IGxlZ2FsIGZvciBza2lwIG9mIHJlZ3VsYXIgc3RyaW5nIHR5cGUpCisgICAgICAgICAgICBpZiAobGVuID4gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBEZWNvZGUgcmVtYWluZGVyCisgICAgICAgICAgICAgICAgVEJhc2U2NFV0aWxzLmRlY29kZShiLCBvZmYsIGxlbiwgYiwgc2l6ZSk7IC8vIE5COiBkZWNvZGVkIGluIHBsYWNlCisgICAgICAgICAgICAgICAgc2l6ZSArPSBsZW4gLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gU2FkbHkgd2UgbXVzdCBjb3B5IHRoZSBieXRlW10gKGFueSB3YXkgYXJvdW5kIHRoaXM/KQorICAgICAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW3NpemVdOworICAgICAgICAgICAgQXJyYXkuQ29weShiLCAwLCByZXN1bHQsIDAsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCBSZWFkSlNPTk9iamVjdFN0YXJ0KCkKLQkJewotCQkJY29udGV4dC5SZWFkKCk7Ci0JCQlSZWFkSlNPTlN5bnRheENoYXIoTEJSQUNFKTsKLQkJCVB1c2hDb250ZXh0KG5ldyBKU09OUGFpckNvbnRleHQodGhpcykpOwotCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCBSZWFkSlNPTk9iamVjdFN0YXJ0KCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5SZWFkKCk7CisgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoTEJSQUNFKTsKKyAgICAgICAgICAgIFB1c2hDb250ZXh0KG5ldyBKU09OUGFpckNvbnRleHQodGhpcykpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIFJlYWRKU09OT2JqZWN0RW5kKCkKLQkJewotCQkJUmVhZEpTT05TeW50YXhDaGFyKFJCUkFDRSk7Ci0JCQlQb3BDb250ZXh0KCk7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFJlYWRKU09OT2JqZWN0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKFJCUkFDRSk7CisgICAgICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgUmVhZEpTT05BcnJheVN0YXJ0KCkKLQkJewotCQkJY29udGV4dC5SZWFkKCk7Ci0JCQlSZWFkSlNPTlN5bnRheENoYXIoTEJSQUNLRVQpOwotCQkJUHVzaENvbnRleHQobmV3IEpTT05MaXN0Q29udGV4dCh0aGlzKSk7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFJlYWRKU09OQXJyYXlTdGFydCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQuUmVhZCgpOworICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKExCUkFDS0VUKTsKKyAgICAgICAgICAgIFB1c2hDb250ZXh0KG5ldyBKU09OTGlzdENvbnRleHQodGhpcykpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIFJlYWRKU09OQXJyYXlFbmQoKQotCQl7Ci0JCQlSZWFkSlNPTlN5bnRheENoYXIoUkJSQUNLRVQpOwotCQkJUG9wQ29udGV4dCgpOwotCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCBSZWFkSlNPTkFycmF5RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKFJCUkFDS0VUKTsKKyAgICAgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBUTWVzc2FnZSBSZWFkTWVzc2FnZUJlZ2luKCkKLQkJewotCQkJVE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgpOwotCQkJUmVhZEpTT05BcnJheVN0YXJ0KCk7Ci0JCQlpZiAoUmVhZEpTT05JbnRlZ2VyKCkgIT0gVkVSU0lPTikKLQkJCXsKLQkJCQl0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKLQkJCQkJCQkJCQkJICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKTsKLQkJCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRNZXNzYWdlIFJlYWRNZXNzYWdlQmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBUTWVzc2FnZSBtZXNzYWdlID0gbmV3IFRNZXNzYWdlKCk7CisgICAgICAgICAgICBSZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgICAgIGlmIChSZWFkSlNPTkludGVnZXIoKSAhPSBWRVJTSU9OKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiIpOworICAgICAgICAgICAgfQogCi0JCQltZXNzYWdlLk5hbWUgPSB1dGY4RW5jb2RpbmcuR2V0U3RyaW5nKFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7Ci0JCQltZXNzYWdlLlR5cGUgPSAoVE1lc3NhZ2VUeXBlKVJlYWRKU09OSW50ZWdlcigpOwotCQkJbWVzc2FnZS5TZXFJRCA9IChpbnQpUmVhZEpTT05JbnRlZ2VyKCk7Ci0JCQlyZXR1cm4gbWVzc2FnZTsKLQkJfQorICAgICAgICAgICAgdmFyIGJ1ZiA9IFJlYWRKU09OU3RyaW5nKGZhbHNlKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuTmFtZSA9IHV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuVHlwZSA9IChUTWVzc2FnZVR5cGUpUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgICAgICBtZXNzYWdlLlNlcUlEID0gKGludClSZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1lc3NhZ2VFbmQoKQotCQl7Ci0JCQlSZWFkSlNPTkFycmF5RW5kKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1lc3NhZ2VFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkSlNPTkFycmF5RW5kKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgVFN0cnVjdCBSZWFkU3RydWN0QmVnaW4oKQotCQl7Ci0JCQlSZWFkSlNPTk9iamVjdFN0YXJ0KCk7Ci0JCQlyZXR1cm4gbmV3IFRTdHJ1Y3QoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVFN0cnVjdCBSZWFkU3RydWN0QmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRTdHJ1Y3QoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRTdHJ1Y3RFbmQoKQotCQl7Ci0JCQlSZWFkSlNPTk9iamVjdEVuZCgpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRTdHJ1Y3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkSlNPTk9iamVjdEVuZCgpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIFRGaWVsZCBSZWFkRmllbGRCZWdpbigpCi0JCXsKLQkJCVRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsKLQkJCWJ5dGUgY2ggPSByZWFkZXIuUGVlaygpOwotCQkJaWYgKGNoID09IFJCUkFDRVswXSkKLQkJCXsKLQkJCQlmaWVsZC5UeXBlID0gVFR5cGUuU3RvcDsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlmaWVsZC5JRCA9IChzaG9ydClSZWFkSlNPTkludGVnZXIoKTsKLQkJCQlSZWFkSlNPTk9iamVjdFN0YXJ0KCk7Ci0JCQkJZmllbGQuVHlwZSA9IEdldFR5cGVJREZvclR5cGVOYW1lKFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmllbGQ7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRGaWVsZCBSZWFkRmllbGRCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsKKyAgICAgICAgICAgIGJ5dGUgY2ggPSByZWFkZXIuUGVlaygpOworICAgICAgICAgICAgaWYgKGNoID09IFJCUkFDRVswXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWVsZC5UeXBlID0gVFR5cGUuU3RvcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWVsZC5JRCA9IChzaG9ydClSZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgICAgICAgICBSZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgICAgICAgICAgZmllbGQuVHlwZSA9IEdldFR5cGVJREZvclR5cGVOYW1lKFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkRmllbGRFbmQoKQotCQl7Ci0JCQlSZWFkSlNPTk9iamVjdEVuZCgpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRGaWVsZEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlYWRKU09OT2JqZWN0RW5kKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgVE1hcCBSZWFkTWFwQmVnaW4oKQotCQl7Ci0JCQlUTWFwIG1hcCA9IG5ldyBUTWFwKCk7Ci0JCQlSZWFkSlNPTkFycmF5U3RhcnQoKTsKLQkJCW1hcC5LZXlUeXBlID0gR2V0VHlwZUlERm9yVHlwZU5hbWUoUmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKLQkJCW1hcC5WYWx1ZVR5cGUgPSBHZXRUeXBlSURGb3JUeXBlTmFtZShSZWFkSlNPTlN0cmluZyhmYWxzZSkpOwotCQkJbWFwLkNvdW50ID0gKGludClSZWFkSlNPTkludGVnZXIoKTsKLQkJCVJlYWRKU09OT2JqZWN0U3RhcnQoKTsKLQkJCXJldHVybiBtYXA7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRNYXAgUmVhZE1hcEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgVE1hcCBtYXAgPSBuZXcgVE1hcCgpOworICAgICAgICAgICAgUmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICAgICBtYXAuS2V5VHlwZSA9IEdldFR5cGVJREZvclR5cGVOYW1lKFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgICAgICBtYXAuVmFsdWVUeXBlID0gR2V0VHlwZUlERm9yVHlwZU5hbWUoUmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgICAgIG1hcC5Db3VudCA9IChpbnQpUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgICAgICBSZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgICAgICByZXR1cm4gbWFwOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1hcEVuZCgpCi0JCXsKLQkJCVJlYWRKU09OT2JqZWN0RW5kKCk7Ci0JCQlSZWFkSlNPTkFycmF5RW5kKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1hcEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlYWRKU09OT2JqZWN0RW5kKCk7CisgICAgICAgICAgICBSZWFkSlNPTkFycmF5RW5kKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgVExpc3QgUmVhZExpc3RCZWdpbigpCi0JCXsKLQkJCVRMaXN0IGxpc3QgPSBuZXcgVExpc3QoKTsKLQkJCVJlYWRKU09OQXJyYXlTdGFydCgpOwotCQkJbGlzdC5FbGVtZW50VHlwZSA9IEdldFR5cGVJREZvclR5cGVOYW1lKFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7Ci0JCQlsaXN0LkNvdW50ID0gKGludClSZWFkSlNPTkludGVnZXIoKTsKLQkJCXJldHVybiBsaXN0OwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUTGlzdCBSZWFkTGlzdEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgVExpc3QgbGlzdCA9IG5ldyBUTGlzdCgpOworICAgICAgICAgICAgUmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICAgICBsaXN0LkVsZW1lbnRUeXBlID0gR2V0VHlwZUlERm9yVHlwZU5hbWUoUmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgICAgIGxpc3QuQ291bnQgPSAoaW50KVJlYWRKU09OSW50ZWdlcigpOworICAgICAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTGlzdEVuZCgpCi0JCXsKLQkJCVJlYWRKU09OQXJyYXlFbmQoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTGlzdEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBUU2V0IFJlYWRTZXRCZWdpbigpCi0JCXsKLQkJCVRTZXQgc2V0ID0gbmV3IFRTZXQoKTsKLQkJCVJlYWRKU09OQXJyYXlTdGFydCgpOwotCQkJc2V0LkVsZW1lbnRUeXBlID0gR2V0VHlwZUlERm9yVHlwZU5hbWUoUmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKLQkJCXNldC5Db3VudCA9IChpbnQpUmVhZEpTT05JbnRlZ2VyKCk7Ci0JCQlyZXR1cm4gc2V0OwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUU2V0IFJlYWRTZXRCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRTZXQgc2V0ID0gbmV3IFRTZXQoKTsKKyAgICAgICAgICAgIFJlYWRKU09OQXJyYXlTdGFydCgpOworICAgICAgICAgICAgc2V0LkVsZW1lbnRUeXBlID0gR2V0VHlwZUlERm9yVHlwZU5hbWUoUmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgICAgIHNldC5Db3VudCA9IChpbnQpUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgICAgICByZXR1cm4gc2V0OworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZFNldEVuZCgpCi0JCXsKLQkJCVJlYWRKU09OQXJyYXlFbmQoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU2V0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEpTT05BcnJheUVuZCgpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIGJvb2wgUmVhZEJvb2woKQotCQl7Ci0JCQlyZXR1cm4gKFJlYWRKU09OSW50ZWdlcigpID09IDAgPyBmYWxzZSA6IHRydWUpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIFJlYWRCb29sKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChSZWFkSlNPTkludGVnZXIoKSA9PSAwID8gZmFsc2UgOiB0cnVlKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBieXRlIFJlYWRCeXRlKCkKLQkJewotCQkJcmV0dXJuIChieXRlKVJlYWRKU09OSW50ZWdlcigpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzYnl0ZSBSZWFkQnl0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoc2J5dGUpUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgc2hvcnQgUmVhZEkxNigpCi0JCXsKLQkJCXJldHVybiAoc2hvcnQpUmVhZEpTT05JbnRlZ2VyKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHNob3J0IFJlYWRJMTYoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKHNob3J0KVJlYWRKU09OSW50ZWdlcigpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIGludCBSZWFkSTMyKCkKLQkJewotCQkJcmV0dXJuIChpbnQpUmVhZEpTT05JbnRlZ2VyKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkSTMyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChpbnQpUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgbG9uZyBSZWFkSTY0KCkKLQkJewotCQkJcmV0dXJuIChsb25nKVJlYWRKU09OSW50ZWdlcigpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBsb25nIFJlYWRJNjQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGxvbmcpUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgZG91YmxlIFJlYWREb3VibGUoKQotCQl7Ci0JCQlyZXR1cm4gUmVhZEpTT05Eb3VibGUoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgZG91YmxlIFJlYWREb3VibGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUmVhZEpTT05Eb3VibGUoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBTdHJpbmcgUmVhZFN0cmluZygpCi0JCXsKLQkJCXJldHVybiB1dGY4RW5jb2RpbmcuR2V0U3RyaW5nKFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBSZWFkU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJ1ZiA9IFJlYWRKU09OU3RyaW5nKGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiB1dGY4RW5jb2RpbmcuR2V0U3RyaW5nKGJ1ZiwgMCwgYnVmLkxlbmd0aCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgYnl0ZVtdIFJlYWRCaW5hcnkoKQotCQl7Ci0JCQlyZXR1cm4gUmVhZEpTT05CYXNlNjQoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYnl0ZVtdIFJlYWRCaW5hcnkoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUmVhZEpTT05CYXNlNjQoKTsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RMaXN0LmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVExpc3QuY3MKaW5kZXggYTY1MWViMS4uMGM4ZjIxNCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVExpc3QuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVExpc3QuY3MKQEAgLTI3LDI4ICsyNywyOCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0JcHVibGljIHN0cnVjdCBUTGlzdAotCXsKLQkJcHJpdmF0ZSBUVHlwZSBlbGVtZW50VHlwZTsKLQkJcHJpdmF0ZSBpbnQgY291bnQ7CisgICAgcHVibGljIHN0cnVjdCBUTGlzdAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBUVHlwZSBlbGVtZW50VHlwZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnQ7CiAKLQkJcHVibGljIFRMaXN0KFRUeXBlIGVsZW1lbnRUeXBlLCBpbnQgY291bnQpCi0JCQk6dGhpcygpCi0JCXsKLQkJCXRoaXMuZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKLQkJCXRoaXMuY291bnQgPSBjb3VudDsKLQkJfQorICAgICAgICBwdWJsaWMgVExpc3QoVFR5cGUgZWxlbWVudFR5cGUsIGludCBjb3VudCkKKyAgICAgICAgICAgIDp0aGlzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOworICAgICAgICAgICAgdGhpcy5jb3VudCA9IGNvdW50OworICAgICAgICB9CiAKLQkJcHVibGljIFRUeXBlIEVsZW1lbnRUeXBlCi0JCXsKLQkJCWdldCB7IHJldHVybiBlbGVtZW50VHlwZTsgfQotCQkJc2V0IHsgZWxlbWVudFR5cGUgPSB2YWx1ZTsgfQotCQl9CisgICAgICAgIHB1YmxpYyBUVHlwZSBFbGVtZW50VHlwZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZWxlbWVudFR5cGU7IH0KKyAgICAgICAgICAgIHNldCB7IGVsZW1lbnRUeXBlID0gdmFsdWU7IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBpbnQgQ291bnQKLQkJewotCQkJZ2V0IHsgcmV0dXJuIGNvdW50OyB9Ci0JCQlzZXQgeyBjb3VudCA9IHZhbHVlOyB9Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGNvdW50OyB9CisgICAgICAgICAgICBzZXQgeyBjb3VudCA9IHZhbHVlOyB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWFwLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1hcC5jcwppbmRleCA1YzhkNjUwLi5hYmE5ZDNhIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWFwLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNYXAuY3MKQEAgLTI3LDM2ICsyNywzNiBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0JcHVibGljIHN0cnVjdCBUTWFwCi0JewotCQlwcml2YXRlIFRUeXBlIGtleVR5cGU7Ci0JCXByaXZhdGUgVFR5cGUgdmFsdWVUeXBlOwotCQlwcml2YXRlIGludCBjb3VudDsKKyAgICBwdWJsaWMgc3RydWN0IFRNYXAKKyAgICB7CisgICAgICAgIHByaXZhdGUgVFR5cGUga2V5VHlwZTsKKyAgICAgICAgcHJpdmF0ZSBUVHlwZSB2YWx1ZVR5cGU7CisgICAgICAgIHByaXZhdGUgaW50IGNvdW50OwogCi0JCXB1YmxpYyBUTWFwKFRUeXBlIGtleVR5cGUsIFRUeXBlIHZhbHVlVHlwZSwgaW50IGNvdW50KQotCQkJOnRoaXMoKQotCQl7Ci0JCQl0aGlzLmtleVR5cGUgPSBrZXlUeXBlOwotCQkJdGhpcy52YWx1ZVR5cGUgPSB2YWx1ZVR5cGU7Ci0JCQl0aGlzLmNvdW50ID0gY291bnQ7Ci0JCX0KKyAgICAgICAgcHVibGljIFRNYXAoVFR5cGUga2V5VHlwZSwgVFR5cGUgdmFsdWVUeXBlLCBpbnQgY291bnQpCisgICAgICAgICAgICA6dGhpcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMua2V5VHlwZSA9IGtleVR5cGU7CisgICAgICAgICAgICB0aGlzLnZhbHVlVHlwZSA9IHZhbHVlVHlwZTsKKyAgICAgICAgICAgIHRoaXMuY291bnQgPSBjb3VudDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUVHlwZSBLZXlUeXBlCi0JCXsKLQkJCWdldCB7IHJldHVybiBrZXlUeXBlOyB9Ci0JCQlzZXQgeyBrZXlUeXBlID0gdmFsdWU7IH0KLQkJfQorICAgICAgICBwdWJsaWMgVFR5cGUgS2V5VHlwZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4ga2V5VHlwZTsgfQorICAgICAgICAgICAgc2V0IHsga2V5VHlwZSA9IHZhbHVlOyB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFR5cGUgVmFsdWVUeXBlCi0JCXsKLQkJCWdldCB7IHJldHVybiB2YWx1ZVR5cGU7IH0KLQkJCXNldCB7IHZhbHVlVHlwZSA9IHZhbHVlOyB9Ci0JCX0KKyAgICAgICAgcHVibGljIFRUeXBlIFZhbHVlVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdmFsdWVUeXBlOyB9CisgICAgICAgICAgICBzZXQgeyB2YWx1ZVR5cGUgPSB2YWx1ZTsgfQorICAgICAgICB9CiAKLQkJcHVibGljIGludCBDb3VudAotCQl7Ci0JCQlnZXQgeyByZXR1cm4gY291bnQ7IH0KLQkJCXNldCB7IGNvdW50ID0gdmFsdWU7IH0KLQkJfQotCX0KKyAgICAgICAgcHVibGljIGludCBDb3VudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gY291bnQ7IH0KKyAgICAgICAgICAgIHNldCB7IGNvdW50ID0gdmFsdWU7IH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNZXNzYWdlLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2UuY3MKaW5kZXggOGU5NmRhNS4uMzQ4MjYzYyAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2UuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2UuY3MKQEAgLTI3LDM2ICsyNywzNiBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0JcHVibGljIHN0cnVjdCBUTWVzc2FnZQotCXsKLQkJcHJpdmF0ZSBzdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBUTWVzc2FnZVR5cGUgdHlwZTsKLQkJcHJpdmF0ZSBpbnQgc2VxSUQ7CisgICAgcHVibGljIHN0cnVjdCBUTWVzc2FnZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgbmFtZTsKKyAgICAgICAgcHJpdmF0ZSBUTWVzc2FnZVR5cGUgdHlwZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgc2VxSUQ7CiAKLQkJcHVibGljIFRNZXNzYWdlKHN0cmluZyBuYW1lLCBUTWVzc2FnZVR5cGUgdHlwZSwgaW50IHNlcWlkKQotCQkJOnRoaXMoKQotCQl7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXRoaXMuc2VxSUQgPSBzZXFpZDsKLQkJfQorICAgICAgICBwdWJsaWMgVE1lc3NhZ2Uoc3RyaW5nIG5hbWUsIFRNZXNzYWdlVHlwZSB0eXBlLCBpbnQgc2VxaWQpCisgICAgICAgICAgICA6dGhpcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICAgICAgdGhpcy5zZXFJRCA9IHNlcWlkOworICAgICAgICB9CiAKLQkJcHVibGljIHN0cmluZyBOYW1lCi0JCXsKLQkJCWdldCB7IHJldHVybiBuYW1lOyB9Ci0JCQlzZXQgeyBuYW1lID0gdmFsdWU7IH0KLQkJfQorICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIG5hbWU7IH0KKyAgICAgICAgICAgIHNldCB7IG5hbWUgPSB2YWx1ZTsgfQorICAgICAgICB9CiAKLQkJcHVibGljIFRNZXNzYWdlVHlwZSBUeXBlCi0JCXsKLQkJCWdldCB7IHJldHVybiB0eXBlOyB9Ci0JCQlzZXQgeyB0eXBlID0gdmFsdWU7IH0KLQkJfQorICAgICAgICBwdWJsaWMgVE1lc3NhZ2VUeXBlIFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHR5cGU7IH0KKyAgICAgICAgICAgIHNldCB7IHR5cGUgPSB2YWx1ZTsgfQorICAgICAgICB9CiAKLQkJcHVibGljIGludCBTZXFJRAotCQl7Ci0JCQlnZXQgeyByZXR1cm4gc2VxSUQ7IH0KLQkJCXNldCB7IHNlcUlEID0gdmFsdWU7IH0KLQkJfQotCX0KKyAgICAgICAgcHVibGljIGludCBTZXFJRAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gc2VxSUQ7IH0KKyAgICAgICAgICAgIHNldCB7IHNlcUlEID0gdmFsdWU7IH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNZXNzYWdlVHlwZS5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNZXNzYWdlVHlwZS5jcwppbmRleCBhYjA3Y2Y2Li5jNzA5MWZlIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWVzc2FnZVR5cGUuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2VUeXBlLmNzCkBAIC0yMSwxMSArMjEsMTEgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCXB1YmxpYyBlbnVtIFRNZXNzYWdlVHlwZQotCXsKLQkJQ2FsbCA9IDEsCi0JCVJlcGx5ID0gMiwKLQkJRXhjZXB0aW9uID0gMywKLQkJT25ld2F5ID0gNAotCX0KKyAgICBwdWJsaWMgZW51bSBUTWVzc2FnZVR5cGUKKyAgICB7CisgICAgICAgIENhbGwgPSAxLAorICAgICAgICBSZXBseSA9IDIsCisgICAgICAgIEV4Y2VwdGlvbiA9IDMsCisgICAgICAgIE9uZXdheSA9IDQKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE5MWM1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5jcwpAQCAtMCwwICsxLDE4MyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyA8c2VlIGNyZWY9IlRNdWx0aXBsZXhlZFByb2Nlc3NvciIvPiBpcyBhIDxzZWUgY3JlZj0iVFByb2Nlc3NvciIvPiBhbGxvd2luZyBhIHNpbmdsZSA8c2VlIGNyZWY9IlRocmlmdC5TZXJ2ZXIuVFNlcnZlciIvPgorICAgIC8vLyB0byBwcm92aWRlIG11bHRpcGxlIHNlcnZpY2VzLgorICAgIC8vLyA8cGFyYS8+CisgICAgLy8vIFRvIGRvIHNvLCB5b3UgaW5zdGFudGlhdGUgdGhlIHByb2Nlc3NvciBhbmQgdGhlbiByZWdpc3RlciBhZGRpdGlvbmFsIHByb2Nlc3NvcnMgd2l0aCBpdCwKKyAgICAvLy8gYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgorICAgIC8vLyA8cGFyYS8+CisgICAgLy8vIDxjb2RlPgorICAgIC8vLyAgICAgVE11bHRpcGxleGVkUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKKyAgICAvLy8KKyAgICAvLy8gICAgIHByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigKKyAgICAvLy8gICAgICAgICAiQ2FsY3VsYXRvciIsCisgICAgLy8vICAgICAgICAgbmV3IENhbGN1bGF0b3IuUHJvY2Vzc29yKG5ldyBDYWxjdWxhdG9ySGFuZGxlcigpKSk7CisgICAgLy8vCisgICAgLy8vICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgICAgLy8vICAgICAgICAgIldlYXRoZXJSZXBvcnQiLAorICAgIC8vLyAgICAgICAgIG5ldyBXZWF0aGVyUmVwb3J0LlByb2Nlc3NvcihuZXcgV2VhdGhlclJlcG9ydEhhbmRsZXIoKSkpOworICAgIC8vLworICAgIC8vLyAgICAgVFNlcnZlclRyYW5zcG9ydCB0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCk7CisgICAgLy8vICAgICBUU2ltcGxlU2VydmVyIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKHByb2Nlc3NvciwgdCk7CisgICAgLy8vCisgICAgLy8vICAgICBzZXJ2ZXIuc2VydmUoKTsKKyAgICAvLy8gPC9jb2RlPgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFRNdWx0aXBsZXhlZFByb2Nlc3NvciA6IFRQcm9jZXNzb3IKKyAgICB7CisgICAgICAgIHByaXZhdGUgRGljdGlvbmFyeTxzdHJpbmcsIFRQcm9jZXNzb3I+IFNlcnZpY2VQcm9jZXNzb3JNYXAgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIFRQcm9jZXNzb3I+KCk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gJ1JlZ2lzdGVyJyBhIHNlcnZpY2Ugd2l0aCB0aGlzIFRNdWx0aXBsZXhlZFByb2Nlc3Nvci4gVGhpcyBhbGxvd3MgdXMgdG8gYnJva2VyCisgICAgICAgIC8vLyByZXF1ZXN0cyB0byBpbmRpdmlkdWFsIHNlcnZpY2VzIGJ5IHVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gc2VsZWN0IHRoZW0gYXQgcmVxdWVzdCB0aW1lLgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIEFyZ3M6CisgICAgICAgIC8vLyAtIHNlcnZpY2VOYW1lICAgIE5hbWUgb2YgYSBzZXJ2aWNlLCBoYXMgdG8gYmUgaWRlbnRpY2FsIHRvIHRoZSBuYW1lCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgIGRlY2xhcmVkIGluIHRoZSBUaHJpZnQgSURMLCBlLmcuICJXZWF0aGVyUmVwb3J0Ii4KKyAgICAgICAgLy8vIC0gcHJvY2Vzc29yICAgICAgSW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2aWNlLCB1c3VhbGx5IHJlZmVycmVkIHRvIGFzICJoYW5kbGVycyIsCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgIGUuZy4gV2VhdGhlclJlcG9ydEhhbmRsZXIgaW1wbGVtZW50aW5nIFdlYXRoZXJSZXBvcnQuSWZhY2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyB2b2lkIFJlZ2lzdGVyUHJvY2Vzc29yKHN0cmluZyBzZXJ2aWNlTmFtZSwgVFByb2Nlc3NvciBwcm9jZXNzb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcnZpY2VQcm9jZXNzb3JNYXAuQWRkKHNlcnZpY2VOYW1lLCBwcm9jZXNzb3IpOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIHZvaWQgRmFpbChUUHJvdG9jb2wgb3Byb3QsIFRNZXNzYWdlIG1lc3NhZ2UsIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlIGV4dHlwZSwgc3RyaW5nIGV0eHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBhcHBleCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oZXh0eXBlLCBldHh0KTsKKworICAgICAgICAgICAgVE1lc3NhZ2UgbmV3TWVzc2FnZSA9IG5ldyBUTWVzc2FnZShtZXNzYWdlLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1lc3NhZ2UuU2VxSUQpOworCisgICAgICAgICAgICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXdNZXNzYWdlKTsKKyAgICAgICAgICAgIGFwcGV4LldyaXRlKG9wcm90KTsKKyAgICAgICAgICAgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOworICAgICAgICAgICAgb3Byb3QuVHJhbnNwb3J0LkZsdXNoKCk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgcHJvY2VzcyBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHN0ZXBzOgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIC0gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXNzYWdlLgorICAgICAgICAvLy8gLSBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgbWVzc2FnZS4KKyAgICAgICAgLy8vIC0gVXNpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byBsb2NhdGUgdGhlIGFwcHJvcHJpYXRlIHByb2Nlc3Nvci4KKyAgICAgICAgLy8vIC0gRGlzcGF0Y2ggdG8gdGhlIHByb2Nlc3Nvciwgd2l0aCBhIGRlY29yYXRlZCBpbnN0YW5jZSBvZiBUUHJvdG9jb2wKKyAgICAgICAgLy8vICAgIHRoYXQgYWxsb3dzIHJlYWRNZXNzYWdlQmVnaW4oKSB0byByZXR1cm4gdGhlIG9yaWdpbmFsIFRNZXNzYWdlLgorICAgICAgICAvLy8gPHBhcmEvPgorICAgICAgICAvLy8gVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZgorICAgICAgICAvLy8gLSB0aGUgbWVzc2FnZSB0eXBlIGlzIG5vdCBDQUxMIG9yIE9ORVdBWSwKKyAgICAgICAgLy8vIC0gdGhlIHNlcnZpY2UgbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBtZXNzYWdlLCBvcgorICAgICAgICAvLy8gLSB0aGUgc2VydmljZSBuYW1lIGhhcyBub3QgYmVlbiBSZWdpc3RlclByb2Nlc3NvcigpZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFByb2Nlc3MoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qICBVc2UgdGhlIGFjdHVhbCB1bmRlcmx5aW5nIHByb3RvY29sIChlLmcuIFRCaW5hcnlQcm90b2NvbCkgdG8gcmVhZCB0aGUKKyAgICAgICAgICAgICAgICBtZXNzYWdlIGhlYWRlci4gIFRoaXMgcHVsbHMgdGhlIG1lc3NhZ2UgIm9mZiB0aGUgd2lyZSIsIHdoaWNoIHdlJ2xsCisgICAgICAgICAgICAgICAgZGVhbCB3aXRoIGF0IHRoZSBlbmQgb2YgdGhpcyBtZXRob2QuICovCisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRNZXNzYWdlIG1lc3NhZ2UgPSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoKG1lc3NhZ2UuVHlwZSAhPSBUTWVzc2FnZVR5cGUuQ2FsbCkgJiYgKG1lc3NhZ2UuVHlwZSAhPSBUTWVzc2FnZVR5cGUuT25ld2F5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZhaWwob3Byb3QsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludmFsaWRNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgdHlwZSBDQUxMIG9yIE9ORVdBWSBleHBlY3RlZCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lCisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbWVzc2FnZS5OYW1lLkluZGV4T2YoVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRmFpbChvcHJvdCwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW52YWxpZFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6ICIgKyBtZXNzYWdlLk5hbWUgKyAiLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpZCB5b3UgZm9yZ2V0IHRvIHVzZSBhIFRNdWx0aXBsZXhQcm90b2NvbCBpbiB5b3VyIGNsaWVudD8iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBUTWVzc2FnZSwgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGNvbnN1bWVkIGJ5IGFueSBUUHJvdG9jb2wKKyAgICAgICAgICAgICAgICBzdHJpbmcgc2VydmljZU5hbWUgPSBtZXNzYWdlLk5hbWUuU3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgICAgICAgICAgICBUUHJvY2Vzc29yIGFjdHVhbFByb2Nlc3NvcjsKKyAgICAgICAgICAgICAgICBpZiAoIVNlcnZpY2VQcm9jZXNzb3JNYXAuVHJ5R2V0VmFsdWUoc2VydmljZU5hbWUsIG91dCBhY3R1YWxQcm9jZXNzb3IpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRmFpbChvcHJvdCwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJuYWxFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZpY2UgbmFtZSBub3QgZm91bmQ6ICIgKyBzZXJ2aWNlTmFtZSArICIuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCBSZWdpc3RlclByb2Nlc3NvcigpPyIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCByZW1vdmluZyB0aGUgc2VydmljZSBuYW1lCisgICAgICAgICAgICAgICAgVE1lc3NhZ2UgbmV3TWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuTmFtZS5TdWJzdHJpbmcoc2VydmljZU5hbWUuTGVuZ3RoICsgVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SLkxlbmd0aCksCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlNlcUlEKTsKKworICAgICAgICAgICAgICAgIC8vIERpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKKyAgICAgICAgICAgICAgICByZXR1cm4gYWN0dWFsUHJvY2Vzc29yLlByb2Nlc3MobmV3IFN0b3JlZE1lc3NhZ2VQcm90b2NvbChpcHJvdCwgbmV3TWVzc2FnZSksIG9wcm90KTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIHNpbWlsYXIgdG8gYWxsIG90aGVyIHByb2Nlc3NvcnMKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gIE91ciBnb2FsIHdhcyB0byB3b3JrIHdpdGggYW55IHByb3RvY29sLiAgSW4gb3JkZXIgdG8gZG8gdGhhdCwgd2UgbmVlZGVkCisgICAgICAgIC8vLyAgdG8gYWxsb3cgdGhlbSB0byBjYWxsIHJlYWRNZXNzYWdlQmVnaW4oKSBhbmQgZ2V0IGEgVE1lc3NhZ2UgaW4gZXhhY3RseQorICAgICAgICAvLy8gIHRoZSBzdGFuZGFyZCBmb3JtYXQsIHdpdGhvdXQgdGhlIHNlcnZpY2UgbmFtZSBwcmVwZW5kZWQgdG8gVE1lc3NhZ2UubmFtZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBTdG9yZWRNZXNzYWdlUHJvdG9jb2wgOiBUUHJvdG9jb2xEZWNvcmF0b3IKKyAgICAgICAgeworICAgICAgICAgICAgVE1lc3NhZ2UgTXNnQmVnaW47CisKKyAgICAgICAgICAgIHB1YmxpYyBTdG9yZWRNZXNzYWdlUHJvdG9jb2woVFByb3RvY29sIHByb3RvY29sLCBUTWVzc2FnZSBtZXNzYWdlQmVnaW4pCisgICAgICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuTXNnQmVnaW4gPSBtZXNzYWdlQmVnaW47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUTWVzc2FnZSBSZWFkTWVzc2FnZUJlZ2luKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTXNnQmVnaW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJkNDIwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNzCkBAIC0wLDAgKzEsMTAzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKK3sKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVE11bHRpcGxleGVkUHJvdG9jb2wgaXMgYSBwcm90b2NvbC1pbmRlcGVuZGVudCBjb25jcmV0ZSBkZWNvcmF0b3IgdGhhdCBhbGxvd3MgYSBUaHJpZnQKKyAgICAvLy8gY2xpZW50IHRvIGNvbW11bmljYXRlIHdpdGggYSBtdWx0aXBsZXhpbmcgVGhyaWZ0IHNlcnZlciwgYnkgcHJlcGVuZGluZyB0aGUgc2VydmljZSBuYW1lCisgICAgLy8vIHRvIHRoZSBmdW5jdGlvbiBuYW1lIGR1cmluZyBmdW5jdGlvbiBjYWxscy4KKyAgICAvLy8gPHBhcmEvPgorICAgIC8vLyBOT1RFOiBUSElTIElTIE5PVCBUTyBCRSBVU0VEIEJZIFNFUlZFUlMuCisgICAgLy8vIE9uIHRoZSBzZXJ2ZXIsIHVzZSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgdG8gaGFuZGxlIHJlcXVlc3RzIGZyb20gYSBtdWx0aXBsZXhpbmcgY2xpZW50LgorICAgIC8vLyA8cGFyYS8+CisgICAgLy8vIFRoaXMgZXhhbXBsZSB1c2VzIGEgc2luZ2xlIHNvY2tldCB0cmFuc3BvcnQgdG8gaW52b2tlIHR3byBzZXJ2aWNlczoKKyAgICAvLy8gPGNvZGU+CisgICAgLy8vICAgICBUU29ja2V0IHRyYW5zcG9ydCA9IG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKTsKKyAgICAvLy8gICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgICAgLy8vCisgICAgLy8vICAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgLy8vCisgICAgLy8vICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIkNhbGN1bGF0b3IiKTsKKyAgICAvLy8gICAgIENhbGN1bGF0b3IuQ2xpZW50IHNlcnZpY2UgPSBuZXcgQ2FsY3VsYXRvci5DbGllbnQobXApOworICAgIC8vLworICAgIC8vLyAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAyID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiV2VhdGhlclJlcG9ydCIpOworICAgIC8vLyAgICAgV2VhdGhlclJlcG9ydC5DbGllbnQgc2VydmljZTIgPSBuZXcgV2VhdGhlclJlcG9ydC5DbGllbnQobXAyKTsKKyAgICAvLy8KKyAgICAvLy8gICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZXJ2aWNlLmFkZCgyLDIpKTsKKyAgICAvLy8gICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZXJ2aWNlMi5nZXRUZW1wZXJhdHVyZSgpKTsKKyAgICAvLy8gPC9jb2RlPgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFRNdWx0aXBsZXhlZFByb3RvY29sIDogVFByb3RvY29sRGVjb3JhdG9yCisgICAgeworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVzZWQgdG8gZGVsaW1pdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIGZ1bmN0aW9uIG5hbWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFNFUEFSQVRPUiA9ICI6IjsKKworICAgICAgICBwcml2YXRlIHN0cmluZyBTZXJ2aWNlTmFtZTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcmFwIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wsIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBhCisgICAgICAgIC8vLyBtdWx0aXBsZXhpbmcgc2VydmVyLiAgVGhlIDxwYXJhbXJlZiBuYW1lPSJzZXJ2aWNlTmFtZSIvPiBpcyByZXF1aXJlZCBhcyBpdCBpcworICAgICAgICAvLy8gcHJlcGVuZGVkIHRvIHRoZSBtZXNzYWdlIGhlYWRlciBzbyB0aGF0IHRoZSBtdWx0aXBsZXhpbmcgc2VydmVyIGNhbiBicm9rZXIKKyAgICAgICAgLy8vIHRoZSBmdW5jdGlvbiBjYWxsIHRvIHRoZSBwcm9wZXIgc2VydmljZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcm90b2NvbCI+WW91ciBjb21tdW5pY2F0aW9uIHByb3RvY29sIG9mIGNob2ljZSwgZS5nLiA8c2VlIGNyZWY9IlRCaW5hcnlQcm90b2NvbCIvPi48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNlcnZpY2VOYW1lIj5UaGUgc2VydmljZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGNvbW11bmljYXRpbmcgdmlhIHRoaXMgcHJvdG9jb2wuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRNdWx0aXBsZXhlZFByb3RvY29sKFRQcm90b2NvbCBwcm90b2NvbCwgc3RyaW5nIHNlcnZpY2VOYW1lKQorICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sKQorICAgICAgICB7CisgICAgICAgICAgICBTZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0TWVzc2FnZSI+VGhlIG9yaWdpbmFsIG1lc3NhZ2UuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgdE1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAodE1lc3NhZ2UuVHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFRNZXNzYWdlVHlwZS5DYWxsOgorICAgICAgICAgICAgICAgIGNhc2UgVE1lc3NhZ2VUeXBlLk9uZXdheToKKyAgICAgICAgICAgICAgICAgICAgYmFzZS5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlTmFtZSArIFNFUEFSQVRPUiArIHRNZXNzYWdlLk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0TWVzc2FnZS5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgdE1lc3NhZ2UuU2VxSUQpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBiYXNlLldyaXRlTWVzc2FnZUJlZ2luKHRNZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2wuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2wuY3MKaW5kZXggNGY3MjNkZC4uZGQ3YTZlMCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbC5jcwpAQCAtMjcsNjUgKzI3LDExNiBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0JcHVibGljIGFic3RyYWN0IGNsYXNzIFRQcm90b2NvbAotCXsKLQkJcHJvdGVjdGVkIFRUcmFuc3BvcnQgdHJhbnM7CisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRQcm90b2NvbCA6IElEaXNwb3NhYmxlCisgICAgeworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBERUZBVUxUX1JFQ1VSU0lPTl9ERVBUSCA9IDY0OwogCi0JCXByb3RlY3RlZCBUUHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykKLQkJewotCQkJdGhpcy50cmFucyA9IHRyYW5zOwotCQl9CisgICAgICAgIHByb3RlY3RlZCBUVHJhbnNwb3J0IHRyYW5zOworICAgICAgICBwcm90ZWN0ZWQgaW50IHJlY3Vyc2lvbkxpbWl0OworICAgICAgICBwcm90ZWN0ZWQgaW50IHJlY3Vyc2lvbkRlcHRoOwogCi0JCXB1YmxpYyBUVHJhbnNwb3J0IFRyYW5zcG9ydAotCQl7Ci0JCQlnZXQgeyByZXR1cm4gdHJhbnM7IH0KLQkJfQorICAgICAgICBwcm90ZWN0ZWQgVFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudHJhbnMgPSB0cmFuczsKKyAgICAgICAgICAgIHRoaXMucmVjdXJzaW9uTGltaXQgPSBERUZBVUxUX1JFQ1VSU0lPTl9ERVBUSDsKKyAgICAgICAgICAgIHRoaXMucmVjdXJzaW9uRGVwdGggPSAwOworICAgICAgICB9CiAKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlTWVzc2FnZUVuZCgpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWMpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZVN0cnVjdEVuZCgpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVGaWVsZEVuZCgpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUZpZWxkU3RvcCgpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZU1hcEJlZ2luKFRNYXAgbWFwKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVNYXBFbmQoKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlTGlzdEVuZCgpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZVNldEJlZ2luKFRTZXQgc2V0KTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVTZXRFbmQoKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVCb29sKGJvb2wgYik7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlQnl0ZShieXRlIGIpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUkxNihzaG9ydCBpMTYpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUkzMihpbnQgaTMyKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVJNjQobG9uZyBpNjQpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZURvdWJsZShkb3VibGUgZCk7Ci0JCXB1YmxpYyB2aXJ0dWFsIHZvaWQgV3JpdGVTdHJpbmcoc3RyaW5nIHMpIHsKLQkJCVdyaXRlQmluYXJ5KEVuY29kaW5nLlVURjguR2V0Qnl0ZXMocykpOwotCQl9Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlQmluYXJ5KGJ5dGVbXSBiKTsKKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnQgVHJhbnNwb3J0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0cmFuczsgfQorICAgICAgICB9CiAKLQkJcHVibGljIGFic3RyYWN0IFRNZXNzYWdlIFJlYWRNZXNzYWdlQmVnaW4oKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgUmVhZE1lc3NhZ2VFbmQoKTsKLQkJcHVibGljIGFic3RyYWN0IFRTdHJ1Y3QgUmVhZFN0cnVjdEJlZ2luKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFJlYWRTdHJ1Y3RFbmQoKTsKLQkJcHVibGljIGFic3RyYWN0IFRGaWVsZCBSZWFkRmllbGRCZWdpbigpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZWFkRmllbGRFbmQoKTsKLQkJcHVibGljIGFic3RyYWN0IFRNYXAgUmVhZE1hcEJlZ2luKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFJlYWRNYXBFbmQoKTsKLQkJcHVibGljIGFic3RyYWN0IFRMaXN0IFJlYWRMaXN0QmVnaW4oKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgUmVhZExpc3RFbmQoKTsKLQkJcHVibGljIGFic3RyYWN0IFRTZXQgUmVhZFNldEJlZ2luKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFJlYWRTZXRFbmQoKTsKLQkJcHVibGljIGFic3RyYWN0IGJvb2wgUmVhZEJvb2woKTsKLQkJcHVibGljIGFic3RyYWN0IGJ5dGUgUmVhZEJ5dGUoKTsKLQkJcHVibGljIGFic3RyYWN0IHNob3J0IFJlYWRJMTYoKTsKLQkJcHVibGljIGFic3RyYWN0IGludCBSZWFkSTMyKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCBsb25nIFJlYWRJNjQoKTsKLQkJcHVibGljIGFic3RyYWN0IGRvdWJsZSBSZWFkRG91YmxlKCk7Ci0JCXB1YmxpYyB2aXJ0dWFsIHN0cmluZyBSZWFkU3RyaW5nKCkgewotCQkgICAgICAgcmV0dXJuIEVuY29kaW5nLlVURjguR2V0U3RyaW5nKFJlYWRCaW5hcnkoKSk7Ci0JCX0KLQkJcHVibGljIGFic3RyYWN0IGJ5dGVbXSBSZWFkQmluYXJ5KCk7Ci0JfQorICAgICAgICBwdWJsaWMgaW50IFJlY3Vyc2lvbkxpbWl0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiByZWN1cnNpb25MaW1pdDsgfQorICAgICAgICAgICAgc2V0IHsgcmVjdXJzaW9uTGltaXQgPSB2YWx1ZTsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocmVjdXJzaW9uRGVwdGggPCByZWN1cnNpb25MaW1pdCkKKyAgICAgICAgICAgICAgICArK3JlY3Vyc2lvbkRlcHRoOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkRFUFRIX0xJTUlULCAiRGVwdGggbGltaXQgZXhjZWVkZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkKKyAgICAgICAgeworICAgICAgICAgICAgLS1yZWN1cnNpb25EZXB0aDsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyAgICAgICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOworCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBEaXNwb3NlKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnMgaXMgSURpc3Bvc2FibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAodHJhbnMgYXMgSURpc3Bvc2FibGUpLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVNYXBCZWdpbihUTWFwIG1hcCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlTWFwRW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUxpc3RFbmQoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVTZXRCZWdpbihUU2V0IHNldCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlU2V0RW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlQm9vbChib29sIGIpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUJ5dGUoc2J5dGUgYik7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlSTE2KHNob3J0IGkxNik7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlSTMyKGludCBpMzIpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUk2NChsb25nIGk2NCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlRG91YmxlKGRvdWJsZSBkKTsKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBXcml0ZVN0cmluZyhzdHJpbmcgcykKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVCaW5hcnkoRW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhzKSk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVCaW5hcnkoYnl0ZVtdIGIpOworCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUTWVzc2FnZSBSZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFJlYWRNZXNzYWdlRW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUU3RydWN0IFJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZWFkU3RydWN0RW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBURmllbGQgUmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgUmVhZEZpZWxkRW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUTWFwIFJlYWRNYXBCZWdpbigpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZWFkTWFwRW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUTGlzdCBSZWFkTGlzdEJlZ2luKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFJlYWRMaXN0RW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUU2V0IFJlYWRTZXRCZWdpbigpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZWFkU2V0RW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sIFJlYWRCb29sKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBzYnl0ZSBSZWFkQnl0ZSgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgc2hvcnQgUmVhZEkxNigpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IFJlYWRJMzIoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGxvbmcgUmVhZEk2NCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIFJlYWREb3VibGUoKTsKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFJlYWRTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYnVmID0gUmVhZEJpbmFyeSgpOworICAgICAgICAgICAgcmV0dXJuIEVuY29kaW5nLlVURjguR2V0U3RyaW5nKGJ1ZiwgMCwgYnVmLkxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IGJ5dGVbXSBSZWFkQmluYXJ5KCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MDAwMDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuY3MKQEAgLTAsMCArMSwyNjEgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gPHNlZSBjcmVmPSJUUHJvdG9jb2xEZWNvcmF0b3IiLz4gZm9yd2FyZHMgYWxsIHJlcXVlc3RzIHRvIGFuIGVuY2xvc2VkIDxzZWUgY3JlZj0iVFByb3RvY29sIi8+IGluc3RhbmNlLAorICAgIC8vLyBwcm92aWRpbmcgYSB3YXkgdG8gYXV0aG9yIGNvbmNpc2UgY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuIFdoaWxlIGl0IGhhcworICAgIC8vLyBubyBhYnN0cmFjdCBtZXRob2RzLCBpdCBpcyBtYXJrZWQgYWJzdHJhY3QgYXMgYSByZW1pbmRlciB0aGF0IGJ5IGl0c2VsZiwKKyAgICAvLy8gaXQgZG9lcyBub3QgbW9kaWZ5IHRoZSBiZWhhdmlvdXIgb2YgdGhlIGVuY2xvc2VkIDxzZWUgY3JlZj0iVFByb3RvY29sIi8+LgorICAgIC8vLyA8cGFyYS8+CisgICAgLy8vIFNlZSBwLjE3NSBvZiBEZXNpZ24gUGF0dGVybnMgKGJ5IEdhbW1hIGV0IGFsLikKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJUTXVsdGlwbGV4ZWRQcm90b2NvbCIvPgorICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3IgOiBUUHJvdG9jb2wKKyAgICB7CisgICAgICAgIHByaXZhdGUgVFByb3RvY29sIFdyYXBwZWRQcm90b2NvbDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBFbmNsb3NlcyB0aGUgc3BlY2lmaWVkIHByb3RvY29sLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByb3RvY29sIj5BbGwgb3BlcmF0aW9ucyB3aWxsIGJlIGZvcndhcmQgdG8gdGhpcyBwcm90b2NvbC4gIE11c3QgYmUgbm9uLW51bGwuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRQcm90b2NvbERlY29yYXRvcihUUHJvdG9jb2wgcHJvdG9jb2wpCisgICAgICAgICAgICA6IGJhc2UocHJvdG9jb2wuVHJhbnNwb3J0KQorICAgICAgICB7CisKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbCA9IHByb3RvY29sOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgdE1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZU1lc3NhZ2VCZWdpbih0TWVzc2FnZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1lc3NhZ2VFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3QgdFN0cnVjdCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlU3RydWN0QmVnaW4odFN0cnVjdCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cnVjdEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZVN0cnVjdEVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZEJlZ2luKFRGaWVsZCB0RmllbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZUZpZWxkQmVnaW4odEZpZWxkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZFN0b3AoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWFwQmVnaW4oVE1hcCB0TWFwKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVNYXBCZWdpbih0TWFwKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWFwRW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlTWFwRW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RCZWdpbihUTGlzdCB0TGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlTGlzdEJlZ2luKHRMaXN0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTGlzdEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZUxpc3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU2V0QmVnaW4oVFNldCB0U2V0KQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVTZXRCZWdpbih0U2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU2V0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlU2V0RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJvb2woYm9vbCBiKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVCb29sKGIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCeXRlKHNieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZUJ5dGUoYik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUkxNihzaG9ydCBpKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVJMTYoaSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUkzMihpbnQgaSkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlSTMyKGkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJNjQobG9uZyBsKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVJNjQobCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZURvdWJsZShkb3VibGUgdikKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlRG91YmxlKHYpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJpbmcoc3RyaW5nIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZVN0cmluZyhzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQmluYXJ5KGJ5dGVbXSBieXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlQmluYXJ5KGJ5dGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUTWVzc2FnZSBSZWFkTWVzc2FnZUJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTWVzc2FnZUVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5SZWFkTWVzc2FnZUVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRTdHJ1Y3QgUmVhZFN0cnVjdEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRTdHJ1Y3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuUmVhZFN0cnVjdEVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRGaWVsZCBSZWFkRmllbGRCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRGaWVsZEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5SZWFkRmllbGRFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUTWFwIFJlYWRNYXBCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZE1hcEJlZ2luKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTWFwRW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLlJlYWRNYXBFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUTGlzdCBSZWFkTGlzdEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkTGlzdEJlZ2luKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTGlzdEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5SZWFkTGlzdEVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRTZXQgUmVhZFNldEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkU2V0QmVnaW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRTZXRFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuUmVhZFNldEVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgUmVhZEJvb2woKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV3JhcHBlZFByb3RvY29sLlJlYWRCb29sKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc2J5dGUgUmVhZEJ5dGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV3JhcHBlZFByb3RvY29sLlJlYWRCeXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc2hvcnQgUmVhZEkxNigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZEkxNigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkSTMyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkSTMyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBSZWFkSTY0KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkSTY0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgZG91YmxlIFJlYWREb3VibGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV3JhcHBlZFByb3RvY29sLlJlYWREb3VibGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgUmVhZFN0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZFN0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJ5dGVbXSBSZWFkQmluYXJ5KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkQmluYXJ5KCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5jcwppbmRleCAyMDdmNWU5Li5jMGYwMDdlIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmNzCkBAIC0yNSw0MiArMjUsNDMgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCWNsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiA6IEV4Y2VwdGlvbgotCXsKLQkJcHVibGljIGNvbnN0IGludCBVTktOT1dOID0gMDsKLQkJcHVibGljIGNvbnN0IGludCBJTlZBTElEX0RBVEEgPSAxOwotCQlwdWJsaWMgY29uc3QgaW50IE5FR0FUSVZFX1NJWkUgPSAyOwotCQlwdWJsaWMgY29uc3QgaW50IFNJWkVfTElNSVQgPSAzOwotCQlwdWJsaWMgY29uc3QgaW50IEJBRF9WRVJTSU9OID0gNDsKLQkJcHVibGljIGNvbnN0IGludCBOT1RfSU1QTEVNRU5URUQ9IDU7CisgICAgcHVibGljIGNsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgVU5LTk9XTiA9IDA7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgSU5WQUxJRF9EQVRBID0gMTsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBORUdBVElWRV9TSVpFID0gMjsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBTSVpFX0xJTUlUID0gMzsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBCQURfVkVSU0lPTiA9IDQ7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTk9UX0lNUExFTUVOVEVEID0gNTsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBERVBUSF9MSU1JVCA9IDY7CiAKLQkJcHJvdGVjdGVkIGludCB0eXBlXyA9IFVOS05PV047CisgICAgICAgIHByb3RlY3RlZCBpbnQgdHlwZV8gPSBVTktOT1dOOwogCi0JCXB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oKQotCQkJOiBiYXNlKCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oKQorICAgICAgICAgICAgOiBiYXNlKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihpbnQgdHlwZSkKLQkJCTogYmFzZSgpCi0JCXsKLQkJCXR5cGVfID0gdHlwZTsKLQkJfQorICAgICAgICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKGludCB0eXBlKQorICAgICAgICAgICAgOiBiYXNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZV8gPSB0eXBlOworICAgICAgICB9CiAKLQkJcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihpbnQgdHlwZSwgU3RyaW5nIG1lc3NhZ2UpCi0JCQk6IGJhc2UobWVzc2FnZSkKLQkJewotCQkJdHlwZV8gPSB0eXBlOwotCQl9CisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oaW50IHR5cGUsIHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXIgPSBudWxsKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlXyA9IHR5cGU7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKQotCQkJOiBiYXNlKG1lc3NhZ2UpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXIgPSBudWxsKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgaW50IGdldFR5cGUoKQotCQl7Ci0JCQlyZXR1cm4gdHlwZV87Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlXzsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmNzCmluZGV4IGViYzczNjcuLjcxMzYwYTEgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5jcwpAQCAtMjYsOCArMjYsOCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0JcHVibGljIGludGVyZmFjZSBUUHJvdG9jb2xGYWN0b3J5Ci0JewotCQlUUHJvdG9jb2wgR2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucyk7Ci0JfQorICAgIHB1YmxpYyBpbnRlcmZhY2UgVFByb3RvY29sRmFjdG9yeQorICAgIHsKKyAgICAgICAgVFByb3RvY29sIEdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbFV0aWwuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xVdGlsLmNzCmluZGV4IDgyY2QzZTMuLmQ5OTVjNmMgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbFV0aWwuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sVXRpbC5jcwpAQCAtMjUsNzQgKzI1LDg0IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRQcm90b2NvbFV0aWwKLQl7Ci0JCXB1YmxpYyBzdGF0aWMgdm9pZCBTa2lwKFRQcm90b2NvbCBwcm90LCBUVHlwZSB0eXBlKQotCQl7Ci0JCQlzd2l0Y2ggKHR5cGUpCi0JCQl7Ci0JCQkJY2FzZSBUVHlwZS5Cb29sOgotCQkJCQlwcm90LlJlYWRCb29sKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVFR5cGUuQnl0ZToKLQkJCQkJcHJvdC5SZWFkQnl0ZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRUeXBlLkkxNjoKLQkJCQkJcHJvdC5SZWFkSTE2KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVFR5cGUuSTMyOgotCQkJCQlwcm90LlJlYWRJMzIoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUVHlwZS5JNjQ6Ci0JCQkJCXByb3QuUmVhZEk2NCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRUeXBlLkRvdWJsZToKLQkJCQkJcHJvdC5SZWFkRG91YmxlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVFR5cGUuU3RyaW5nOgotCQkJCQkvLyBEb24ndCB0cnkgdG8gZGVjb2RlIHRoZSBzdHJpbmcsIGp1c3Qgc2tpcCBpdC4KLQkJCQkJcHJvdC5SZWFkQmluYXJ5KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVFR5cGUuU3RydWN0OgotCQkJCQlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOwotCQkJCQl3aGlsZSAodHJ1ZSkKLQkJCQkJewotCQkJCQkJVEZpZWxkIGZpZWxkID0gcHJvdC5SZWFkRmllbGRCZWdpbigpOwotCQkJCQkJaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkKLQkJCQkJCXsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCVNraXAocHJvdCwgZmllbGQuVHlwZSk7Ci0JCQkJCQlwcm90LlJlYWRGaWVsZEVuZCgpOwotCQkJCQl9Ci0JCQkJCXByb3QuUmVhZFN0cnVjdEVuZCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRUeXBlLk1hcDoKLQkJCQkJVE1hcCBtYXAgPSBwcm90LlJlYWRNYXBCZWdpbigpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcC5Db3VudDsgaSsrKQotCQkJCQl7Ci0JCQkJCQlTa2lwKHByb3QsIG1hcC5LZXlUeXBlKTsKLQkJCQkJCVNraXAocHJvdCwgbWFwLlZhbHVlVHlwZSk7Ci0JCQkJCX0KLQkJCQkJcHJvdC5SZWFkTWFwRW5kKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVFR5cGUuU2V0OgotCQkJCQlUU2V0IHNldCA9IHByb3QuUmVhZFNldEJlZ2luKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2V0LkNvdW50OyBpKyspCi0JCQkJCXsKLQkJCQkJCVNraXAocHJvdCwgc2V0LkVsZW1lbnRUeXBlKTsKLQkJCQkJfQotCQkJCQlwcm90LlJlYWRTZXRFbmQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUVHlwZS5MaXN0OgotCQkJCQlUTGlzdCBsaXN0ID0gcHJvdC5SZWFkTGlzdEJlZ2luKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5Db3VudDsgaSsrKQotCQkJCQl7Ci0JCQkJCQlTa2lwKHByb3QsIGxpc3QuRWxlbWVudFR5cGUpOwotCQkJCQl9Ci0JCQkJCXByb3QuUmVhZExpc3RFbmQoKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUUHJvdG9jb2xVdGlsCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgU2tpcChUUHJvdG9jb2wgcHJvdCwgVFR5cGUgdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5Cb29sOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkQm9vbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuQnl0ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZEkxNigpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkSTMyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JNjQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRJNjQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkRvdWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZERvdWJsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU3RyaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgdHJ5IHRvIGRlY29kZSB0aGUgc3RyaW5nLCBqdXN0IHNraXAgaXQuCisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRCaW5hcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlN0cnVjdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBURmllbGQgZmllbGQgPSBwcm90LlJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2lwKHByb3QsIGZpZWxkLlR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZEZpZWxkRW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLk1hcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFRNYXAgbWFwID0gcHJvdC5SZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwLkNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpcChwcm90LCBtYXAuS2V5VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpcChwcm90LCBtYXAuVmFsdWVUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZE1hcEVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU2V0OgorICAgICAgICAgICAgICAgICAgICAgICAgVFNldCBzZXQgPSBwcm90LlJlYWRTZXRCZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXQuQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2lwKHByb3QsIHNldC5FbGVtZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRTZXRFbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkxpc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBUTGlzdCBsaXN0ID0gcHJvdC5SZWFkTGlzdEJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2lwKHByb3QsIGxpc3QuRWxlbWVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkTGlzdEVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJVbmtub3duIGRhdGEgdHlwZSAiICsgdHlwZS5Ub1N0cmluZygiZCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFNldC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RTZXQuY3MKaW5kZXggYWZmN2Y2NS4uYTkxOGFiNSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFNldC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UU2V0LmNzCkBAIC0yNywyOCArMjcsMzMgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCXB1YmxpYyBzdHJ1Y3QgVFNldAotCXsKLQkJcHJpdmF0ZSBUVHlwZSBlbGVtZW50VHlwZTsKLQkJcHJpdmF0ZSBpbnQgY291bnQ7CisgICAgcHVibGljIHN0cnVjdCBUU2V0CisgICAgeworICAgICAgICBwcml2YXRlIFRUeXBlIGVsZW1lbnRUeXBlOworICAgICAgICBwcml2YXRlIGludCBjb3VudDsKIAotCQlwdWJsaWMgVFNldChUVHlwZSBlbGVtZW50VHlwZSwgaW50IGNvdW50KQotCQkJOnRoaXMoKQotCQl7Ci0JCQl0aGlzLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7Ci0JCQl0aGlzLmNvdW50ID0gY291bnQ7Ci0JCX0KKyAgICAgICAgcHVibGljIFRTZXQoVFR5cGUgZWxlbWVudFR5cGUsIGludCBjb3VudCkKKyAgICAgICAgICAgIDp0aGlzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOworICAgICAgICAgICAgdGhpcy5jb3VudCA9IGNvdW50OworICAgICAgICB9CiAKLQkJcHVibGljIFRUeXBlIEVsZW1lbnRUeXBlCi0JCXsKLQkJCWdldCB7IHJldHVybiBlbGVtZW50VHlwZTsgfQotCQkJc2V0IHsgZWxlbWVudFR5cGUgPSB2YWx1ZTsgfQotCQl9CisgICAgICAgIHB1YmxpYyBUU2V0KFRMaXN0IGxpc3QpCisgICAgICAgICAgICA6IHRoaXMobGlzdC5FbGVtZW50VHlwZSwgbGlzdC5Db3VudCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIGludCBDb3VudAotCQl7Ci0JCQlnZXQgeyByZXR1cm4gY291bnQ7IH0KLQkJCXNldCB7IGNvdW50ID0gdmFsdWU7IH0KLQkJfQotCX0KKyAgICAgICAgcHVibGljIFRUeXBlIEVsZW1lbnRUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBlbGVtZW50VHlwZTsgfQorICAgICAgICAgICAgc2V0IHsgZWxlbWVudFR5cGUgPSB2YWx1ZTsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBDb3VudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gY291bnQ7IH0KKyAgICAgICAgICAgIHNldCB7IGNvdW50ID0gdmFsdWU7IH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RTdHJ1Y3QuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UU3RydWN0LmNzCmluZGV4IDM3ZDExMDYuLmY0ODQ0YTQgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RTdHJ1Y3QuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFN0cnVjdC5jcwpAQCAtMjcsMjAgKzI3LDIwIEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgc3RydWN0IFRTdHJ1Y3QKLQl7Ci0JCXByaXZhdGUgc3RyaW5nIG5hbWU7CisgICAgcHVibGljIHN0cnVjdCBUU3RydWN0CisgICAgeworICAgICAgICBwcml2YXRlIHN0cmluZyBuYW1lOwogCi0JCXB1YmxpYyBUU3RydWN0KHN0cmluZyBuYW1lKQotCQkJOnRoaXMoKQotCQl7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9CisgICAgICAgIHB1YmxpYyBUU3RydWN0KHN0cmluZyBuYW1lKQorICAgICAgICAgICAgOnRoaXMoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CiAKLQkJcHVibGljIHN0cmluZyBOYW1lCi0JCXsKLQkJCWdldCB7IHJldHVybiBuYW1lOyB9Ci0JCQlzZXQgeyBuYW1lID0gdmFsdWU7IH0KLQkJfQotCX0KKyAgICAgICAgcHVibGljIHN0cmluZyBOYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBuYW1lOyB9CisgICAgICAgICAgICBzZXQgeyBuYW1lID0gdmFsdWU7IH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RUeXBlLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFR5cGUuY3MKaW5kZXggZWZjN2JlZi4uOWNlOTE1ZSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFR5cGUuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFR5cGUuY3MKQEAgLTI1LDIwICsyNSwyMCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0JcHVibGljIGVudW0gVFR5cGUgOiBieXRlCi0JewotCQlTdG9wID0gMCwKLQkJVm9pZCA9IDEsCi0JCUJvb2wgPSAyLAotCQlCeXRlID0gMywKLQkJRG91YmxlID0gNCwKLQkJSTE2ID0gNiwKLQkJSTMyID0gOCwKLQkJSTY0ID0gMTAsCi0JCVN0cmluZyA9IDExLAotCQlTdHJ1Y3QgPSAxMiwKLQkJTWFwID0gMTMsCi0JCVNldCA9IDE0LAotCQlMaXN0ID0gMTUKLQl9CisgICAgcHVibGljIGVudW0gVFR5cGUgOiBieXRlCisgICAgeworICAgICAgICBTdG9wID0gMCwKKyAgICAgICAgVm9pZCA9IDEsCisgICAgICAgIEJvb2wgPSAyLAorICAgICAgICBCeXRlID0gMywKKyAgICAgICAgRG91YmxlID0gNCwKKyAgICAgICAgSTE2ID0gNiwKKyAgICAgICAgSTMyID0gOCwKKyAgICAgICAgSTY0ID0gMTAsCisgICAgICAgIFN0cmluZyA9IDExLAorICAgICAgICBTdHJ1Y3QgPSAxMiwKKyAgICAgICAgTWFwID0gMTMsCisgICAgICAgIFNldCA9IDE0LAorICAgICAgICBMaXN0ID0gMTUKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyLmNzCmluZGV4IDdiZjI3NDcuLjJiYzA0ZjMgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyLmNzCkBAIC0yOCwxMTIgKzI4LDEyOCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlNlcnZlcgogewotCXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUU2VydmVyCi0JewotCQkvKioKLQkJICogQ29yZSBwcm9jZXNzb3IKLQkJICovCi0JCXByb3RlY3RlZCBUUHJvY2Vzc29yIHByb2Nlc3NvcjsKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFNlcnZlcgorICAgIHsKKyAgICAgICAgLy9BdHRyaWJ1dGVzCisgICAgICAgIHByb3RlY3RlZCBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICAgIHByb3RlY3RlZCBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgVFNlcnZlckV2ZW50SGFuZGxlciBzZXJ2ZXJFdmVudEhhbmRsZXIgPSBudWxsOwogCi0JCS8qKgotCQkgKiBTZXJ2ZXIgdHJhbnNwb3J0Ci0JCSAqLwotCQlwcm90ZWN0ZWQgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICAgIC8vTWV0aG9kcworICAgICAgICBwdWJsaWMgdm9pZCBzZXRFdmVudEhhbmRsZXIoVFNlcnZlckV2ZW50SGFuZGxlciBzZWgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlciA9IHNlaDsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgVFNlcnZlckV2ZW50SGFuZGxlciBnZXRFdmVudEhhbmRsZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc2VydmVyRXZlbnRIYW5kbGVyOworICAgICAgICB9CiAKLQkJLyoqCi0JCSAqIElucHV0IFRyYW5zcG9ydCBGYWN0b3J5Ci0JCSAqLwotCQlwcm90ZWN0ZWQgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICAvL0xvZyBkZWxlZ2F0aW9uCisgICAgICAgIHB1YmxpYyBkZWxlZ2F0ZSB2b2lkIExvZ0RlbGVnYXRlKHN0cmluZyBzdHIpOworICAgICAgICBwcml2YXRlIExvZ0RlbGVnYXRlIF9sb2dEZWxlZ2F0ZTsKKyAgICAgICAgcHJvdGVjdGVkIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfbG9nRGVsZWdhdGU7IH0KKyAgICAgICAgICAgIHNldCB7IF9sb2dEZWxlZ2F0ZSA9ICh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlIDogRGVmYXVsdExvZ0RlbGVnYXRlOyB9CisgICAgICAgIH0KKyAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIERlZmF1bHRMb2dEZWxlZ2F0ZShzdHJpbmcgcykKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUocyk7CisgICAgICAgIH0KIAotCQkvKioKLQkJICogT3V0cHV0IFRyYW5zcG9ydCBGYWN0b3J5Ci0JCSAqLwotCQlwcm90ZWN0ZWQgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgLy9Db25zdHJ1Y3Rpb24KKyAgICAgICAgcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKKyAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQkvKioKLQkJICogSW5wdXQgUHJvdG9jb2wgRmFjdG9yeQotCQkgKi8KLQkJcHJvdGVjdGVkIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQorICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsCisgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQkvKioKLQkJICogT3V0cHV0IFByb3RvY29sIEZhY3RvcnkKLQkJICovCi0JCXByb3RlY3RlZCBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeTsKLQkJcHVibGljIGRlbGVnYXRlIHZvaWQgTG9nRGVsZWdhdGUoc3RyaW5nIHN0cik7Ci0JCXByb3RlY3RlZCBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZTsKKyAgICAgICAgcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnkpCisgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwKKyAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJLyoqCi0JCSAqIERlZmF1bHQgY29uc3RydWN0b3JzLgotCQkgKi8KKyAgICAgICAgcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yLAorICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0JCQkJCQkgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQotCQkJOnRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnByb2Nlc3NvckZhY3RvcnkgPSBuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKTsKKyAgICAgICAgICAgIHRoaXMuc2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0OworICAgICAgICAgICAgdGhpcy5pbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLmxvZ0RlbGVnYXRlID0gKGxvZ0RlbGVnYXRlICE9IG51bGwpID8gbG9nRGVsZWdhdGUgOiBEZWZhdWx0TG9nRGVsZWdhdGU7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJCQkJCVRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotCQkJCQkJTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCi0JCQk6IHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucHJvY2Vzc29yRmFjdG9yeSA9IHByb2Nlc3NvckZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLnNlcnZlclRyYW5zcG9ydCA9IHNlcnZlclRyYW5zcG9ydDsKKyAgICAgICAgICAgIHRoaXMuaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMuaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5sb2dEZWxlZ2F0ZSA9IChsb2dEZWxlZ2F0ZSAhPSBudWxsKSA/IGxvZ0RlbGVnYXRlIDogRGVmYXVsdExvZ0RlbGVnYXRlOworICAgICAgICB9CiAKLQkJcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0JCQkJCQkgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotCQkJCQkJICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5KQotCQkJOnRoaXMocHJvY2Vzc29yLAotCQkJCSBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJIHRyYW5zcG9ydEZhY3RvcnksCi0JCQkJIHRyYW5zcG9ydEZhY3RvcnksCi0JCQkJIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotCQkJCSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLQkJCQkgRGVmYXVsdExvZ0RlbGVnYXRlKQotCQl7Ci0JCX0KLQotCQlwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJCQkJCSAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJCQkgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCi0JCQkJCQkgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQotCQkJOnRoaXMocHJvY2Vzc29yLAotCQkJCSBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJIHRyYW5zcG9ydEZhY3RvcnksCi0JCQkJIHRyYW5zcG9ydEZhY3RvcnksCi0JCQkJIHByb3RvY29sRmFjdG9yeSwKLQkJCQkgcHJvdG9jb2xGYWN0b3J5LAotCQkJICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCi0JCXsKLQkJfQotCi0JCXB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLQkJCQkJCSAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotCQkJCQkJICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotCQkJCQkJICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotCQkJCQkJICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKLQkJCQkJCSAgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCi0JCXsKLQkJCXRoaXMucHJvY2Vzc29yID0gcHJvY2Vzc29yOwotCQkJdGhpcy5zZXJ2ZXJUcmFuc3BvcnQgPSBzZXJ2ZXJUcmFuc3BvcnQ7Ci0JCQl0aGlzLmlucHV0VHJhbnNwb3J0RmFjdG9yeSA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKLQkJCXRoaXMub3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7Ci0JCQl0aGlzLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7Ci0JCQl0aGlzLm91dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeTsKLQkJCXRoaXMubG9nRGVsZWdhdGUgPSBsb2dEZWxlZ2F0ZTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgcnVuIG1ldGhvZCBmaXJlcyB1cCB0aGUgc2VydmVyIGFuZCBnZXRzIHRoaW5ncyBnb2luZy4KLQkJICovCi0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFNlcnZlKCk7Ci0KLQkJcHVibGljIGFic3RyYWN0IHZvaWQgU3RvcCgpOwotCi0JCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBEZWZhdWx0TG9nRGVsZWdhdGUoc3RyaW5nIHMpCi0JCXsKLQkJCUNvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKHMpOwotCQl9Ci0JfQorICAgICAgICAvL0Fic3RyYWN0IEludGVyZmFjZQorICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBTZXJ2ZSgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBTdG9wKCk7CisgICAgfQogfQotCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MWVmYzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5jcwpAQCAtMCwwICsxLDUzIEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKwordXNpbmcgU3lzdGVtOworCituYW1lc3BhY2UgVGhyaWZ0LlNlcnZlcgoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHNlcnZlciB1c2VycyB0byBoYW5kbGUgZXZlbnRzIGZyb20gdGhlIHNlcnZlci4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBpbnRlcmZhY2UgVFNlcnZlckV2ZW50SGFuZGxlcgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2FsbGVkIGJlZm9yZSB0aGUgc2VydmVyIGJlZ2lucy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgdm9pZCBwcmVTZXJ2ZSgpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENhbGxlZCB3aGVuIGEgbmV3IGNsaWVudCBoYXMgY29ubmVjdGVkIGFuZCBpcyBhYm91dCB0byBiZWluZyBwcm9jZXNzaW5nLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBvYmplY3QgY3JlYXRlQ29udGV4dChUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIGlucHV0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIG91dHB1dCk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2FsbGVkIHdoZW4gYSBjbGllbnQgaGFzIGZpbmlzaGVkIHJlcXVlc3QtaGFuZGxpbmcgdG8gZGVsZXRlIHNlcnZlciBjb250ZXh0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICB2b2lkIGRlbGV0ZUNvbnRleHQob2JqZWN0IHNlcnZlckNvbnRleHQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgaW5wdXQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgb3V0cHV0KTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDYWxsZWQgd2hlbiBhIGNsaWVudCBpcyBhYm91dCB0byBjYWxsIHRoZSBwcm9jZXNzb3IuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHZvaWQgcHJvY2Vzc0NvbnRleHQob2JqZWN0IHNlcnZlckNvbnRleHQsIFRocmlmdC5UcmFuc3BvcnQuVFRyYW5zcG9ydCB0cmFuc3BvcnQpOworICAgIH07Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2ltcGxlU2VydmVyLmNzCmluZGV4IGM2ZmQ5OWUuLjRlN2VhOTYgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2ltcGxlU2VydmVyLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2ltcGxlU2VydmVyLmNzCkBAIC0yNywxMjYgKzI3LDE1NCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlNlcnZlcgogewotCS8vLyA8c3VtbWFyeT4KLQkvLy8gU2ltcGxlIHNpbmdsZS10aHJlYWRlZCBzZXJ2ZXIgZm9yIHRlc3RpbmcKLQkvLy8gPC9zdW1tYXJ5PgotCXB1YmxpYyBjbGFzcyBUU2ltcGxlU2VydmVyIDogVFNlcnZlcgotCXsKLQkJcHJpdmF0ZSBib29sIHN0b3AgPSBmYWxzZTsKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFNpbXBsZSBzaW5nbGUtdGhyZWFkZWQgc2VydmVyIGZvciB0ZXN0aW5nLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFRTaW1wbGVTZXJ2ZXIgOiBUU2VydmVyCisgICAgeworICAgICAgICBwcml2YXRlIGJvb2wgc3RvcCA9IGZhbHNlOwogCi0JCXB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKLQkJCTpiYXNlKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgRGVmYXVsdExvZ0RlbGVnYXRlKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKKyAgICAgICAgICA6IGJhc2UocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJCVRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotCQkJCQkJCUxvZ0RlbGVnYXRlIGxvZ0RlbCkKLQkJCTogYmFzZShwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIGxvZ0RlbCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICBMb2dEZWxlZ2F0ZSBsb2dEZWwpCisgICAgICAgICAgOiBiYXNlKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbG9nRGVsKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJCQkJCSAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJCQkgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnkpCi0JCQk6YmFzZShwcm9jZXNzb3IsCi0JCQkJIHNlcnZlclRyYW5zcG9ydCwKLQkJCQkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0JCQkJIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotCQkJICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSkKKyAgICAgICAgICA6IGJhc2UocHJvY2Vzc29yLAorICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLQkJCQkJCSAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkJCSAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCi0JCQk6YmFzZShwcm9jZXNzb3IsCi0JCQkJIHNlcnZlclRyYW5zcG9ydCwKLQkJCQkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkgcHJvdG9jb2xGYWN0b3J5LAotCQkJCSBwcm90b2NvbEZhY3RvcnksCi0JCQkJIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgICAgICA6IGJhc2UocHJvY2Vzc29yLAorICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFNlcnZlKCkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpOwotCQkJfQotCQkJY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQotCQkJewotCQkJCWxvZ0RlbGVnYXRlKHR0eC5Ub1N0cmluZygpKTsKLQkJCQlyZXR1cm47Ci0JCQl9CisgICAgICAgIHB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICA6IGJhc2UocHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQkJd2hpbGUgKCFzdG9wKQotCQkJewotCQkJCVRUcmFuc3BvcnQgY2xpZW50ID0gbnVsbDsKLQkJCQlUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0ID0gbnVsbDsKLQkJCQlUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCA9IG51bGw7Ci0JCQkJVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOwotCQkJCVRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCA9IG51bGw7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQljbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCk7Ci0JCQkJCWlmIChjbGllbnQgIT0gbnVsbCkKLQkJCQkJewotCQkJCQkJaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7Ci0JCQkJCQlvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOwotCQkJCQkJaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKLQkJCQkJCW91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7Ci0JCQkJCQl3aGlsZSAocHJvY2Vzc29yLlByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKSB7IH0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0JCQkJewotCQkJCQkvLyBDbGllbnQgZGllZCwganVzdCBtb3ZlIG9uCi0JCQkJCWlmIChzdG9wKQotCQkJCQl7Ci0JCQkJCQlsb2dEZWxlZ2F0ZSgiVFNpbXBsZVNlcnZlciB3YXMgc2h1dHRpbmcgZG93biwgY2F1Z2h0ICIgKyB0dHguR2V0VHlwZSgpLk5hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24geCkKLQkJCQl7Ci0JCQkJCWxvZ0RlbGVnYXRlKHguVG9TdHJpbmcoKSk7Ci0JCQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXJ2ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSh0dHguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogCi0JCQkJaWYgKGlucHV0VHJhbnNwb3J0ICE9IG51bGwpCi0JCQkJewotCQkJCQlpbnB1dFRyYW5zcG9ydC5DbG9zZSgpOwotCQkJCX0KKyAgICAgICAgICAgIC8vRmlyZSB0aGUgcHJlU2VydmUgc2VydmVyIGV2ZW50IHdoZW4gc2VydmVyIGlzIHVwIGJ1dCBiZWZvcmUgYW55IGNsaWVudCBjb25uZWN0aW9ucworICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcmVTZXJ2ZSgpOwogCi0JCQkJaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBudWxsKQotCQkJCXsKLQkJCQkJb3V0cHV0VHJhbnNwb3J0LkNsb3NlKCk7Ci0JCQkJfQotCQkJfQorICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IGNsaWVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgICAgIG9iamVjdCBjb25uZWN0aW9uQ29udGV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1c2luZyAoY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IgPSBwcm9jZXNzb3JGYWN0b3J5LkdldFByb2Nlc3NvcihjbGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKIAotCQkJaWYgKHN0b3ApCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQotCQkJCXsKLQkJCQkJbG9nRGVsZWdhdGUoIlRTZXJ2ZXJUcmFucG9ydCBmYWlsZWQgb24gY2xvc2U6ICIgKyB0dHguTWVzc2FnZSk7Ci0JCQkJfQotCQkJCXN0b3AgPSBmYWxzZTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9SZWNvdmVyIGV2ZW50IGhhbmRsZXIgKGlmIGFueSkgYW5kIGZpcmUgY3JlYXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgd2hlbiBhIGNsaWVudCBjb25uZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gc2VydmVyRXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOwogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFN0b3AoKQotCQl7Ci0JCQlzdG9wID0gdHJ1ZTsKLQkJCXNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOwotCQl9Ci0JfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Qcm9jZXNzIGNsaWVudCByZXF1ZXN0cyB1bnRpbCBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghc3RvcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlucHV0VHJhbnNwb3J0LlBlZWsoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ZpcmUgcHJvY2Vzc0NvbnRleHQgc2VydmVyIGV2ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9OLkIuIFRoaXMgaXMgdGhlIHBhdHRlcm4gaW1wbGVtZW50ZWQgaW4gQysrIGFuZCB0aGUgZXZlbnQgZmlyZXMgcHJvdmlzaW9uYWxseS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RoYXQgaXMgdG8gc2F5IGl0IG1heSBiZSBtYW55IG1pbnV0ZXMgYmV0d2VlbiB0aGUgZXZlbnQgZmlyaW5nIGFuZCB0aGUgY2xpZW50IHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2FjdHVhbGx5IGFycml2aW5nIG9yIHRoZSBjbGllbnQgbWF5IGhhbmcgdXAgd2l0aG91dCBldmVyIG1ha2VpbmcgYSByZXF1ZXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Qcm9jZXNzIGNsaWVudCByZXF1ZXN0IChibG9ja3MgdW50aWwgdHJhbnNwb3J0IGlzIHJlYWRhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc29yLlByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0b3AgfHwgdHR4LlR5cGUgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSh0dHguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9VbmV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKHguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy9GaXJlIGRlbGV0ZUNvbnRleHQgc2VydmVyIGV2ZW50IGFmdGVyIGNsaWVudCBkaXNjb25uZWN0cworICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFN0b3AoKQorICAgICAgICB7CisgICAgICAgICAgICBzdG9wID0gdHJ1ZTsKKyAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNzIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNzCmluZGV4IGNmODM1NGUuLmE0OTRjZTcgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3MKQEAgLTI4LDE2MyArMjgsMjY4IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuU2VydmVyCiB7Ci0JLy8vIDxzdW1tYXJ5PgotCS8vLyBTZXJ2ZXIgdGhhdCB1c2VzIEMjIGJ1aWx0LWluIFRocmVhZFBvb2wgdG8gc3Bhd24gdGhyZWFkcyB3aGVuIGhhbmRsaW5nIHJlcXVlc3RzCi0JLy8vIDwvc3VtbWFyeT4KLQlwdWJsaWMgY2xhc3MgVFRocmVhZFBvb2xTZXJ2ZXIgOiBUU2VydmVyCi0JewotCQlwcml2YXRlIGNvbnN0IGludCBERUZBVUxUX01JTl9USFJFQURTID0gMTA7Ci0JCXByaXZhdGUgY29uc3QgaW50IERFRkFVTFRfTUFYX1RIUkVBRFMgPSAxMDA7Ci0JCXByaXZhdGUgdm9sYXRpbGUgYm9vbCBzdG9wID0gZmFsc2U7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBTZXJ2ZXIgdGhhdCB1c2VzIEMjIGJ1aWx0LWluIFRocmVhZFBvb2wgdG8gc3Bhd24gdGhyZWFkcyB3aGVuIGhhbmRsaW5nIHJlcXVlc3RzLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFRUaHJlYWRQb29sU2VydmVyIDogVFNlcnZlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgREVGQVVMVF9NSU5fVEhSRUFEUyA9IC0xOyAgLy8gdXNlIC5ORVQgVGhyZWFkUG9vbCBkZWZhdWx0cworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBERUZBVUxUX01BWF9USFJFQURTID0gLTE7ICAvLyB1c2UgLk5FVCBUaHJlYWRQb29sIGRlZmF1bHRzCisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbCBzdG9wID0gZmFsc2U7CiAKLQkJcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKLQkJCTp0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotCQkJCSBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCi0JCQkJIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLQkJCQkgREVGQVVMVF9NSU5fVEhSRUFEUywgREVGQVVMVF9NQVhfVEhSRUFEUywgRGVmYXVsdExvZ0RlbGVnYXRlKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIHN0cnVjdCBDb25maWd1cmF0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgTWluV29ya2VyVGhyZWFkczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgTWF4V29ya2VyVGhyZWFkczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgTWluSU9UaHJlYWRzOworICAgICAgICAgICAgcHVibGljIGludCBNYXhJT1RocmVhZHM7CiAKLQkJcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCi0JCQk6IHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKLQkJCQkgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotCQkJCSBERUZBVUxUX01JTl9USFJFQURTLCBERUZBVUxUX01BWF9USFJFQURTLCBsb2dEZWxlZ2F0ZSkKLQkJewotCQl9CisgICAgICAgICAgICBwdWJsaWMgQ29uZmlndXJhdGlvbihpbnQgbWluID0gREVGQVVMVF9NSU5fVEhSRUFEUywgaW50IG1heCA9IERFRkFVTFRfTUFYX1RIUkVBRFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTWluV29ya2VyVGhyZWFkcyA9IG1pbjsKKyAgICAgICAgICAgICAgICBNYXhXb3JrZXJUaHJlYWRzID0gbWF4OworICAgICAgICAgICAgICAgIE1pbklPVGhyZWFkcyA9IG1pbjsKKyAgICAgICAgICAgICAgICBNYXhJT1RocmVhZHMgPSBtYXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBDb25maWd1cmF0aW9uKGludCBtaW5Xb3JrLCBpbnQgbWF4V29yaywgaW50IG1pbklPLCBpbnQgbWF4SU8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTWluV29ya2VyVGhyZWFkcyA9IG1pbldvcms7CisgICAgICAgICAgICAgICAgTWF4V29ya2VyVGhyZWFkcyA9IG1heFdvcms7CisgICAgICAgICAgICAgICAgTWluSU9UaHJlYWRzID0gbWluSU87CisgICAgICAgICAgICAgICAgTWF4SU9UaHJlYWRzID0gbWF4SU87CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbigpLCBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbigpLCBsb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgICAgICA6IHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgIG5ldyBDb25maWd1cmF0aW9uKCksIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbigpLCBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgaW50IG1pblRocmVhZFBvb2xUaHJlYWRzLCBpbnQgbWF4VGhyZWFkUG9vbFRocmVhZHMsIExvZ0RlbGVnYXRlIGxvZ0RlbCkKKyAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgIG5ldyBDb25maWd1cmF0aW9uKG1pblRocmVhZFBvb2xUaHJlYWRzLCBtYXhUaHJlYWRQb29sVGhyZWFkcyksCisgICAgICAgICAgICAgbG9nRGVsKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gdGhyZWFkQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgTG9nRGVsZWdhdGUgbG9nRGVsKQorICAgICAgICAgICAgOiBiYXNlKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSwgbG9nRGVsKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NrICh0eXBlb2YoVFRocmVhZFBvb2xTZXJ2ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhyZWFkQ29uZmlnLk1heFdvcmtlclRocmVhZHMgPiAwKSB8fCAodGhyZWFkQ29uZmlnLk1heElPVGhyZWFkcyA+IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHdvcmssIGNvbW07CisgICAgICAgICAgICAgICAgICAgIFRocmVhZFBvb2wuR2V0TWF4VGhyZWFkcyhvdXQgd29yaywgb3V0IGNvbW0pOworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkQ29uZmlnLk1heFdvcmtlclRocmVhZHMgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgd29yayA9IHRocmVhZENvbmZpZy5NYXhXb3JrZXJUaHJlYWRzOworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkQ29uZmlnLk1heElPVGhyZWFkcyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBjb21tID0gdGhyZWFkQ29uZmlnLk1heElPVGhyZWFkczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFUaHJlYWRQb29sLlNldE1heFRocmVhZHMod29yaywgY29tbSkpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJFcnJvcjogY291bGQgbm90IFNldE1heFRocmVhZHMgaW4gVGhyZWFkUG9vbCIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhyZWFkQ29uZmlnLk1pbldvcmtlclRocmVhZHMgPiAwKSB8fCAodGhyZWFkQ29uZmlnLk1pbklPVGhyZWFkcyA+IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHdvcmssIGNvbW07CisgICAgICAgICAgICAgICAgICAgIFRocmVhZFBvb2wuR2V0TWluVGhyZWFkcyhvdXQgd29yaywgb3V0IGNvbW0pOworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkQ29uZmlnLk1pbldvcmtlclRocmVhZHMgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgd29yayA9IHRocmVhZENvbmZpZy5NaW5Xb3JrZXJUaHJlYWRzOworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkQ29uZmlnLk1pbklPVGhyZWFkcyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBjb21tID0gdGhyZWFkQ29uZmlnLk1pbklPVGhyZWFkczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFUaHJlYWRQb29sLlNldE1pblRocmVhZHMod29yaywgY29tbSkpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJFcnJvcjogY291bGQgbm90IFNldE1pblRocmVhZHMgaW4gVGhyZWFkUG9vbCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAKLQkJcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJCQkgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJCQkJCSBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAotCQkJCQkJCQkgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCi0JCQk6dGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLQkJCQkgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCi0JCQkJIERFRkFVTFRfTUlOX1RIUkVBRFMsIERFRkFVTFRfTUFYX1RIUkVBRFMsIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLQkJewotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVzZSBuZXcgVGhyZWFkUG9vbCB0aHJlYWQgZm9yIGVhY2ggbmV3IGNsaWVudCBjb25uZWN0aW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXJ2ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSgiRXJyb3IsIGNvdWxkIG5vdCBsaXN0ZW4gb24gU2VydmVyVHJhbnNwb3J0OiAiICsgdHR4KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAKLQkJcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJCQkgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJCQkJCSBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0JCQkJCQkJCSBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotCQkJCQkJCQkgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKLQkJCQkJCQkJIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotCQkJCQkJCQkgaW50IG1pblRocmVhZFBvb2xUaHJlYWRzLCBpbnQgbWF4VGhyZWFkUG9vbFRocmVhZHMsIExvZ0RlbGVnYXRlIGxvZ0RlbCkKLQkJCTpiYXNlKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0JCQkJICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBsb2dEZWwpCi0JCXsKLQkJCWlmICghVGhyZWFkUG9vbC5TZXRNaW5UaHJlYWRzKG1pblRocmVhZFBvb2xUaHJlYWRzLCBtaW5UaHJlYWRQb29sVGhyZWFkcykpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXJyb3I6IGNvdWxkIG5vdCBTZXRNaW5UaHJlYWRzIGluIFRocmVhZFBvb2wiKTsKLQkJCX0KLQkJCWlmICghVGhyZWFkUG9vbC5TZXRNYXhUaHJlYWRzKG1heFRocmVhZFBvb2xUaHJlYWRzLCBtYXhUaHJlYWRQb29sVGhyZWFkcykpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXJyb3I6IGNvdWxkIG5vdCBTZXRNYXhUaHJlYWRzIGluIFRocmVhZFBvb2wiKTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgLy9GaXJlIHRoZSBwcmVTZXJ2ZSBzZXJ2ZXIgZXZlbnQgd2hlbiBzZXJ2ZXIgaXMgdXAgYnV0IGJlZm9yZSBhbnkgY2xpZW50IGNvbm5lY3Rpb25zCisgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByZVNlcnZlKCk7CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gVXNlIG5ldyBUaHJlYWRQb29sIHRocmVhZCBmb3IgZWFjaCBuZXcgY2xpZW50IGNvbm5lY3Rpb24KLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgU2VydmUoKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQlzZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCk7Ci0JCQl9Ci0JCQljYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0JCQl7Ci0JCQkJbG9nRGVsZWdhdGUoIkVycm9yLCBjb3VsZCBub3QgbGlzdGVuIG9uIFNlcnZlclRyYW5zcG9ydDogIiArIHR0eCk7Ci0JCQkJcmV0dXJuOwotCQkJfQorICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBmYWlsdXJlQ291bnQgPSAwOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCk7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZFBvb2wuUXVldWVVc2VyV29ya0l0ZW0odGhpcy5FeGVjdXRlLCBjbGllbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0b3AgfHwgdHR4LlR5cGUgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICArK2ZhaWx1cmVDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKHR0eC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0JCQl3aGlsZSAoIXN0b3ApCi0JCQl7Ci0JCQkJaW50IGZhaWx1cmVDb3VudCA9IDA7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlUVHJhbnNwb3J0IGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKTsKLQkJCQkJVGhyZWFkUG9vbC5RdWV1ZVVzZXJXb3JrSXRlbSh0aGlzLkV4ZWN1dGUsIGNsaWVudCk7Ci0JCQkJfQotCQkJCWNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLQkJCQl7Ci0JCQkJCWlmIChzdG9wKQotCQkJCQl7Ci0JCQkJCQlsb2dEZWxlZ2F0ZSgiVFRocmVhZFBvb2xTZXJ2ZXIgd2FzIHNodXR0aW5nIGRvd24sIGNhdWdodCAiICsgdHR4LkdldFR5cGUoKS5OYW1lKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCSsrZmFpbHVyZUNvdW50OwotCQkJCQkJbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOwotCQkJCQl9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQkJfQotCQkJfQorICAgICAgICAgICAgaWYgKHN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoIlRTZXJ2ZXJUcmFuc3BvcnQgZmFpbGVkIG9uIGNsb3NlOiAiICsgdHR4Lk1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdG9wID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkJaWYgKHN0b3ApCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQotCQkJCXsKLQkJCQkJbG9nRGVsZWdhdGUoIlRTZXJ2ZXJUcmFuc3BvcnQgZmFpbGVkIG9uIGNsb3NlOiAiICsgdHR4Lk1lc3NhZ2UpOwotCQkJCX0KLQkJCQlzdG9wID0gZmFsc2U7Ci0JCQl9Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTG9vcHMgb24gcHJvY2Vzc2luZyBhIGNsaWVudCBmb3JldmVyCisgICAgICAgIC8vLyB0aHJlYWRDb250ZXh0IHdpbGwgYmUgYSBUVHJhbnNwb3J0IGluc3RhbmNlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGhyZWFkQ29udGV4dCI+PC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEV4ZWN1dGUob2JqZWN0IHRocmVhZENvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChUVHJhbnNwb3J0IGNsaWVudCA9IChUVHJhbnNwb3J0KXRocmVhZENvbnRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IgPSBwcm9jZXNzb3JGYWN0b3J5LkdldFByb2Nlc3NvcihjbGllbnQsIHRoaXMpOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgICAgICBvYmplY3QgY29ubmVjdGlvbkNvbnRleHQgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOwogCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIExvb3BzIG9uIHByb2Nlc3NpbmcgYSBjbGllbnQgZm9yZXZlcgotCQkvLy8gdGhyZWFkQ29udGV4dCB3aWxsIGJlIGEgVFRyYW5zcG9ydCBpbnN0YW5jZQotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9InRocmVhZENvbnRleHQiPjwvcGFyYW0+Ci0JCXByaXZhdGUgdm9pZCBFeGVjdXRlKE9iamVjdCB0aHJlYWRDb250ZXh0KQotCQl7Ci0JCQlUVHJhbnNwb3J0IGNsaWVudCA9IChUVHJhbnNwb3J0KXRocmVhZENvbnRleHQ7Ci0JCQlUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0ID0gbnVsbDsKLQkJCVRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0ID0gbnVsbDsKLQkJCVRQcm90b2NvbCBpbnB1dFByb3RvY29sID0gbnVsbDsKLQkJCVRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCA9IG51bGw7Ci0JCQl0cnkKLQkJCXsKLQkJCQlpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKLQkJCQlvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOwotCQkJCWlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7Ci0JCQkJb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKLQkJCQl3aGlsZSAocHJvY2Vzc29yLlByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKQotCQkJCXsKLQkJCQkJLy9rZWVwIHByb2Nlc3NpbmcgcmVxdWVzdHMgdW50aWwgY2xpZW50IGRpc2Nvbm5lY3RzCi0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCi0JCQl7Ci0JCQkJLy8gQXNzdW1lIHRoZSBjbGllbnQgZGllZCBhbmQgY29udGludWUgc2lsZW50bHkKLQkJCQkvL0NvbnNvbGUuV3JpdGVMaW5lKHR0eCk7Ci0JCQl9Ci0JCQkKLQkJCWNhdGNoIChFeGNlcHRpb24geCkKLQkJCXsKLQkJCQlsb2dEZWxlZ2F0ZSgiRXJyb3I6ICIgKyB4KTsKLQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVjb3ZlciBldmVudCBoYW5kbGVyIChpZiBhbnkpIGFuZCBmaXJlIGNyZWF0ZUNvbnRleHQgc2VydmVyIGV2ZW50IHdoZW4gYSBjbGllbnQgY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCA9IHNlcnZlckV2ZW50SGFuZGxlci5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKIAotCQkJaWYgKGlucHV0VHJhbnNwb3J0ICE9IG51bGwpCi0JCQl7Ci0JCQkJaW5wdXRUcmFuc3BvcnQuQ2xvc2UoKTsKLQkJCX0KLQkJCWlmIChvdXRwdXRUcmFuc3BvcnQgIT0gbnVsbCkKLQkJCXsKLQkJCQlvdXRwdXRUcmFuc3BvcnQuQ2xvc2UoKTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgLy9Qcm9jZXNzIGNsaWVudCByZXF1ZXN0cyB1bnRpbCBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghc3RvcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlucHV0VHJhbnNwb3J0LlBlZWsoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgU3RvcCgpCi0JCXsKLQkJCXN0b3AgPSB0cnVlOwotCQkJc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9GaXJlIHByb2Nlc3NDb250ZXh0IHNlcnZlciBldmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTi5CLiBUaGlzIGlzIHRoZSBwYXR0ZXJuIGltcGxlbWVudGVkIGluIEMrKyBhbmQgdGhlIGV2ZW50IGZpcmVzIHByb3Zpc2lvbmFsbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UaGF0IGlzIHRvIHNheSBpdCBtYXkgYmUgbWFueSBtaW51dGVzIGJldHdlZW4gdGhlIGV2ZW50IGZpcmluZyBhbmQgdGhlIGNsaWVudCByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hY3R1YWxseSBhcnJpdmluZyBvciB0aGUgY2xpZW50IG1heSBoYW5nIHVwIHdpdGhvdXQgZXZlciBtYWtlaW5nIGEgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdCAoYmxvY2tzIHVudGlsIHRyYW5zcG9ydCBpcyByZWFkYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVXN1YWxseSBhIGNsaWVudCBkaXNjb25uZWN0LCBleHBlY3RlZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9VbmV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSgiRXJyb3I6ICIgKyB4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vRmlyZSBkZWxldGVDb250ZXh0IHNlcnZlciBldmVudCBhZnRlciBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0Nsb3NlIHRyYW5zcG9ydHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnQuQ2xvc2UoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBkaXNwb3NhYmxlIHN0dWZmIHNob3VsZCBiZSBkaXNwb3NlZAorICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRQcm90b2NvbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRQcm90b2NvbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RvcCA9IHRydWU7CisgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNzCmluZGV4IGYyYmUwNzMuLmNjMDUxYTMgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcwpAQCAtMjYsMjA5ICsyNiwyNTcgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKIHsKLQkvLy8gPHN1bW1hcnk+Ci0JLy8vIFNlcnZlciB0aGF0IHVzZXMgQyMgdGhyZWFkcyAoYXMgb3Bwb3NlZCB0byB0aGUgVGhyZWFkUG9vbCkgd2hlbiBoYW5kbGluZyByZXF1ZXN0cwotCS8vLyA8L3N1bW1hcnk+Ci0JcHVibGljIGNsYXNzIFRUaHJlYWRlZFNlcnZlciA6IFRTZXJ2ZXIKLQl7Ci0JCXByaXZhdGUgY29uc3QgaW50IERFRkFVTFRfTUFYX1RIUkVBRFMgPSAxMDA7Ci0JCXByaXZhdGUgdm9sYXRpbGUgYm9vbCBzdG9wID0gZmFsc2U7Ci0JCXByaXZhdGUgcmVhZG9ubHkgaW50IG1heFRocmVhZHM7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBTZXJ2ZXIgdGhhdCB1c2VzIEMjIHRocmVhZHMgKGFzIG9wcG9zZWQgdG8gdGhlIFRocmVhZFBvb2wpIHdoZW4gaGFuZGxpbmcgcmVxdWVzdHMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVFRocmVhZGVkU2VydmVyIDogVFNlcnZlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgREVGQVVMVF9NQVhfVEhSRUFEUyA9IDEwMDsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sIHN0b3AgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgbWF4VGhyZWFkczsKIAotCQlwcml2YXRlIFF1ZXVlPFRUcmFuc3BvcnQ+IGNsaWVudFF1ZXVlOwotCQlwcml2YXRlIFRIYXNoU2V0PFRocmVhZD4gY2xpZW50VGhyZWFkczsKLQkJcHJpdmF0ZSBvYmplY3QgY2xpZW50TG9jazsKLQkJcHJpdmF0ZSBUaHJlYWQgd29ya2VyVGhyZWFkOworICAgICAgICBwcml2YXRlIFF1ZXVlPFRUcmFuc3BvcnQ+IGNsaWVudFF1ZXVlOworICAgICAgICBwcml2YXRlIFRIYXNoU2V0PFRocmVhZD4gY2xpZW50VGhyZWFkczsKKyAgICAgICAgcHJpdmF0ZSBvYmplY3QgY2xpZW50TG9jazsKKyAgICAgICAgcHJpdmF0ZSBUaHJlYWQgd29ya2VyVGhyZWFkOwogCi0JCXB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQotCQkJOiB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotCQkJCSBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCi0JCQkJIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLQkJCQkgREVGQVVMVF9NQVhfVEhSRUFEUywgRGVmYXVsdExvZ0RlbGVnYXRlKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIGludCBDbGllbnRUaHJlYWRzQ291bnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGNsaWVudFRocmVhZHMuQ291bnQ7IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LCBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZSkKLQkJCTogdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLQkJCQkgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAotCQkJCSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0JCQkJIERFRkFVTFRfTUFYX1RIUkVBRFMsIGxvZ0RlbGVnYXRlKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgICAgICAgICA6IHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIERFRkFVTFRfTUFYX1RIUkVBRFMsIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBERUZBVUxUX01BWF9USFJFQURTLCBsb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CiAKIAotCQlwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJCQkgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJCQkJCSBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAotCQkJCQkJCQkgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCi0JCQk6IHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCi0JCQkJIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LAotCQkJCSBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgICAgICA6IHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgIERFRkFVTFRfTUFYX1RIUkVBRFMsIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJCQkJCQkJIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotCQkJCQkJCQkgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotCQkJCQkJCQkgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkJCQkJIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0JCQkJCQkJCSBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKLQkJCQkJCQkJIGludCBtYXhUaHJlYWRzLCBMb2dEZWxlZ2F0ZSBsb2dEZWwpCi0JCQk6IGJhc2UocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksIGxvZ0RlbCkKLQkJewotCQkJdGhpcy5tYXhUaHJlYWRzID0gbWF4VGhyZWFkczsKLQkJCWNsaWVudFF1ZXVlID0gbmV3IFF1ZXVlPFRUcmFuc3BvcnQ+KCk7Ci0JCQljbGllbnRMb2NrID0gbmV3IG9iamVjdCgpOwotCQkJY2xpZW50VGhyZWFkcyA9IG5ldyBUSGFzaFNldDxUaHJlYWQ+KCk7Ci0JCX0KKyAgICAgICAgcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgREVGQVVMVF9NQVhfVEhSRUFEUywgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgaW50IG1heFRocmVhZHMsIExvZ0RlbGVnYXRlIGxvZ0RlbCkKKyAgICAgICAgICA6IGJhc2UocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksIGxvZ0RlbCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5tYXhUaHJlYWRzID0gbWF4VGhyZWFkczsKKyAgICAgICAgICAgIGNsaWVudFF1ZXVlID0gbmV3IFF1ZXVlPFRUcmFuc3BvcnQ+KCk7CisgICAgICAgICAgICBjbGllbnRMb2NrID0gbmV3IG9iamVjdCgpOworICAgICAgICAgICAgY2xpZW50VGhyZWFkcyA9IG5ldyBUSGFzaFNldDxUaHJlYWQ+KCk7CisgICAgICAgIH0KIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBVc2UgbmV3IFRocmVhZCBmb3IgZWFjaCBuZXcgY2xpZW50IGNvbm5lY3Rpb24uIGJsb2NrIHVudGlsIG51bUNvbm5lY3Rpb25zIDwgbWF4VGhyZWFkcwotCQkvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXJ2ZSgpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCS8vc3RhcnQgd29ya2VyIHRocmVhZAotCQkJCXdvcmtlclRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFRocmVhZFN0YXJ0KEV4ZWN1dGUpKTsKLQkJCQl3b3JrZXJUaHJlYWQuU3RhcnQoKTsKLQkJCQlzZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCk7Ci0JCQl9Ci0JCQljYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0JCQl7Ci0JCQkJbG9nRGVsZWdhdGUoIkVycm9yLCBjb3VsZCBub3QgbGlzdGVuIG9uIFNlcnZlclRyYW5zcG9ydDogIiArIHR0eCk7Ci0JCQkJcmV0dXJuOwotCQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVc2UgbmV3IFRocmVhZCBmb3IgZWFjaCBuZXcgY2xpZW50IGNvbm5lY3Rpb24uIGJsb2NrIHVudGlsIG51bUNvbm5lY3Rpb25zICZsdDsgbWF4VGhyZWFkcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2VydmUoKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3N0YXJ0IHdvcmtlciB0aHJlYWQKKyAgICAgICAgICAgICAgICB3b3JrZXJUaHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBUaHJlYWRTdGFydChFeGVjdXRlKSk7CisgICAgICAgICAgICAgICAgd29ya2VyVGhyZWFkLlN0YXJ0KCk7CisgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKCJFcnJvciwgY291bGQgbm90IGxpc3RlbiBvbiBTZXJ2ZXJUcmFuc3BvcnQ6ICIgKyB0dHgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KIAotCQkJd2hpbGUgKCFzdG9wKQotCQkJewotCQkJCWludCBmYWlsdXJlQ291bnQgPSAwOwotCQkJCXRyeQotCQkJCXsKLQkJCQkJVFRyYW5zcG9ydCBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCk7Ci0JCQkJCWxvY2sgKGNsaWVudExvY2spCi0JCQkJCXsKLQkJCQkJCWNsaWVudFF1ZXVlLkVucXVldWUoY2xpZW50KTsKLQkJCQkJCU1vbml0b3IuUHVsc2UoY2xpZW50TG9jayk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQotCQkJCXsKLQkJCQkJaWYgKHN0b3ApCi0JCQkJCXsKLQkJCQkJCWxvZ0RlbGVnYXRlKCJUVGhyZWFkUG9vbFNlcnZlciB3YXMgc2h1dHRpbmcgZG93biwgY2F1Z2h0ICIgKyB0dHgpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJKytmYWlsdXJlQ291bnQ7Ci0JCQkJCQlsb2dEZWxlZ2F0ZSh0dHguVG9TdHJpbmcoKSk7Ci0JCQkJCX0KKyAgICAgICAgICAgIC8vRmlyZSB0aGUgcHJlU2VydmUgc2VydmVyIGV2ZW50IHdoZW4gc2VydmVyIGlzIHVwIGJ1dCBiZWZvcmUgYW55IGNsaWVudCBjb25uZWN0aW9ucworICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcmVTZXJ2ZSgpOwogCi0JCQkJfQotCQkJfQorICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBmYWlsdXJlQ291bnQgPSAwOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCk7CisgICAgICAgICAgICAgICAgICAgIGxvY2sgKGNsaWVudExvY2spCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFF1ZXVlLkVucXVldWUoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vbml0b3IuUHVsc2UoY2xpZW50TG9jayk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG9wIHx8IHR0eC5UeXBlICE9IFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKytmYWlsdXJlQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSh0dHguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KIAotCQkJaWYgKHN0b3ApCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQotCQkJCXsKLQkJCQkJbG9nRGVsZWdhdGUoIlRTZXJ2ZVRyYW5zcG9ydCBmYWlsZWQgb24gY2xvc2U6ICIgKyB0dHguTWVzc2FnZSk7Ci0JCQkJfQotCQkJCXN0b3AgPSBmYWxzZTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBMb29wcyBvbiBwcm9jZXNzaW5nIGEgY2xpZW50IGZvcmV2ZXIKLQkJLy8vIHRocmVhZENvbnRleHQgd2lsbCBiZSBhIFRUcmFuc3BvcnQgaW5zdGFuY2UKLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJ0aHJlYWRDb250ZXh0Ij48L3BhcmFtPgotCQlwcml2YXRlIHZvaWQgRXhlY3V0ZSgpCi0JCXsKLQkJCXdoaWxlICghc3RvcCkKLQkJCXsKLQkJCQlUVHJhbnNwb3J0IGNsaWVudDsKLQkJCQlUaHJlYWQgdDsKLQkJCQlsb2NrIChjbGllbnRMb2NrKQotCQkJCXsKLQkJCQkJLy9kb24ndCBkZXF1ZXVlIGlmIHRvbyBtYW55IGNvbm5lY3Rpb25zCi0JCQkJCXdoaWxlIChjbGllbnRUaHJlYWRzLkNvdW50ID49IG1heFRocmVhZHMpCi0JCQkJCXsKLQkJCQkJCU1vbml0b3IuV2FpdChjbGllbnRMb2NrKTsKLQkJCQkJfQorICAgICAgICAgICAgaWYgKHN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoIlRTZXJ2ZVRyYW5zcG9ydCBmYWlsZWQgb24gY2xvc2U6ICIgKyB0dHguTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0b3AgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCQkJCXdoaWxlIChjbGllbnRRdWV1ZS5Db3VudCA9PSAwKQotCQkJCQl7Ci0JCQkJCQlNb25pdG9yLldhaXQoY2xpZW50TG9jayk7Ci0JCQkJCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTG9vcHMgb24gcHJvY2Vzc2luZyBhIGNsaWVudCBmb3JldmVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBFeGVjdXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgY2xpZW50OworICAgICAgICAgICAgICAgIFRocmVhZCB0OworICAgICAgICAgICAgICAgIGxvY2sgKGNsaWVudExvY2spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL2Rvbid0IGRlcXVldWUgaWYgdG9vIG1hbnkgY29ubmVjdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNsaWVudFRocmVhZHMuQ291bnQgPj0gbWF4VGhyZWFkcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTW9uaXRvci5XYWl0KGNsaWVudExvY2spOworICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCQkJY2xpZW50ID0gY2xpZW50UXVldWUuRGVxdWV1ZSgpOwotCQkJCQl0ID0gbmV3IFRocmVhZChuZXcgUGFyYW1ldGVyaXplZFRocmVhZFN0YXJ0KENsaWVudFdvcmtlcikpOwotCQkJCQljbGllbnRUaHJlYWRzLkFkZCh0KTsKLQkJCQl9Ci0JCQkJLy9zdGFydCBwcm9jZXNzaW5nIHJlcXVlc3RzIGZyb20gY2xpZW50IG9uIG5ldyB0aHJlYWQKLQkJCQl0LlN0YXJ0KGNsaWVudCk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNsaWVudFF1ZXVlLkNvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vbml0b3IuV2FpdChjbGllbnRMb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCBDbGllbnRXb3JrZXIoT2JqZWN0IGNvbnRleHQpCi0JCXsKLQkJCVRUcmFuc3BvcnQgY2xpZW50ID0gKFRUcmFuc3BvcnQpY29udGV4dDsKLQkJCVRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQgPSBudWxsOwotCQkJVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOwotCQkJVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOwotCQkJVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKLQkJCXRyeQotCQkJewotCQkJCWlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOwotCQkJCW91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7Ci0JCQkJaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKLQkJCQlvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOwotCQkJCXdoaWxlIChwcm9jZXNzb3IuUHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpCi0JCQkJewotCQkJCQkvL2tlZXAgcHJvY2Vzc2luZyByZXF1ZXN0cyB1bnRpbCBjbGllbnQgZGlzY29ubmVjdHMKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKLQkJCXsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24geCkKLQkJCXsKLQkJCQlsb2dEZWxlZ2F0ZSgiRXJyb3I6ICIgKyB4KTsKLQkJCX0KKyAgICAgICAgICAgICAgICAgICAgY2xpZW50ID0gY2xpZW50UXVldWUuRGVxdWV1ZSgpOworICAgICAgICAgICAgICAgICAgICB0ID0gbmV3IFRocmVhZChuZXcgUGFyYW1ldGVyaXplZFRocmVhZFN0YXJ0KENsaWVudFdvcmtlcikpOworICAgICAgICAgICAgICAgICAgICBjbGllbnRUaHJlYWRzLkFkZCh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9zdGFydCBwcm9jZXNzaW5nIHJlcXVlc3RzIGZyb20gY2xpZW50IG9uIG5ldyB0aHJlYWQKKyAgICAgICAgICAgICAgICB0LlN0YXJ0KGNsaWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkJaWYgKGlucHV0VHJhbnNwb3J0ICE9IG51bGwpCi0JCQl7Ci0JCQkJaW5wdXRUcmFuc3BvcnQuQ2xvc2UoKTsKLQkJCX0KLQkJCWlmIChvdXRwdXRUcmFuc3BvcnQgIT0gbnVsbCkKLQkJCXsKLQkJCQlvdXRwdXRUcmFuc3BvcnQuQ2xvc2UoKTsKLQkJCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIENsaWVudFdvcmtlcihvYmplY3QgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKFRUcmFuc3BvcnQgY2xpZW50ID0gKFRUcmFuc3BvcnQpY29udGV4dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciA9IHByb2Nlc3NvckZhY3RvcnkuR2V0UHJvY2Vzc29yKGNsaWVudCk7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgICAgIG9iamVjdCBjb25uZWN0aW9uQ29udGV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CiAKLQkJCWxvY2sgKGNsaWVudExvY2spCi0JCQl7Ci0JCQkJY2xpZW50VGhyZWFkcy5SZW1vdmUoVGhyZWFkLkN1cnJlbnRUaHJlYWQpOwotCQkJCU1vbml0b3IuUHVsc2UoY2xpZW50TG9jayk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVjb3ZlciBldmVudCBoYW5kbGVyIChpZiBhbnkpIGFuZCBmaXJlIGNyZWF0ZUNvbnRleHQgc2VydmVyIGV2ZW50IHdoZW4gYSBjbGllbnQgY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCA9IHNlcnZlckV2ZW50SGFuZGxlci5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKLQkJewotCQkJc3RvcCA9IHRydWU7Ci0JCQlzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKLQkJCS8vY2xlYW4gdXAgYWxsIHRoZSB0aHJlYWRzIG15c2VsZgotCQkJd29ya2VyVGhyZWFkLkFib3J0KCk7Ci0JCQlmb3JlYWNoIChUaHJlYWQgdCBpbiBjbGllbnRUaHJlYWRzKQotCQkJewotCQkJCXQuQWJvcnQoKTsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdHMgdW50aWwgY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnB1dFRyYW5zcG9ydC5QZWVrKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9GaXJlIHByb2Nlc3NDb250ZXh0IHNlcnZlciBldmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTi5CLiBUaGlzIGlzIHRoZSBwYXR0ZXJuIGltcGxlbWVudGVkIGluIEMrKyBhbmQgdGhlIGV2ZW50IGZpcmVzIHByb3Zpc2lvbmFsbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UaGF0IGlzIHRvIHNheSBpdCBtYXkgYmUgbWFueSBtaW51dGVzIGJldHdlZW4gdGhlIGV2ZW50IGZpcmluZyBhbmQgdGhlIGNsaWVudCByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hY3R1YWxseSBhcnJpdmluZyBvciB0aGUgY2xpZW50IG1heSBoYW5nIHVwIHdpdGhvdXQgZXZlciBtYWtlaW5nIGEgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdCAoYmxvY2tzIHVudGlsIHRyYW5zcG9ydCBpcyByZWFkYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVXN1YWxseSBhIGNsaWVudCBkaXNjb25uZWN0LCBleHBlY3RlZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9VbmV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSgiRXJyb3I6ICIgKyB4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vRmlyZSBkZWxldGVDb250ZXh0IHNlcnZlciBldmVudCBhZnRlciBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKworICAgICAgICAgICAgICAgICAgICBsb2NrIChjbGllbnRMb2NrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRUaHJlYWRzLlJlbW92ZShUaHJlYWQuQ3VycmVudFRocmVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBNb25pdG9yLlB1bHNlKGNsaWVudExvY2spOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9DbG9zZSB0cmFuc3BvcnRzCisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0LkNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBzdHVmZiBzaG91bGQgYmUgZGlzcG9zZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0UHJvdG9jb2wgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0UHJvdG9jb2wgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RvcCA9IHRydWU7CisgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgIC8vY2xlYW4gdXAgYWxsIHRoZSB0aHJlYWRzIG15c2VsZgorICAgICAgICAgICAgd29ya2VyVGhyZWFkLkFib3J0KCk7CisgICAgICAgICAgICBmb3JlYWNoIChUaHJlYWQgdCBpbiBjbGllbnRUaHJlYWRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHQuQWJvcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcyBiL2xpYi9jc2hhcnAvc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcwppbmRleCA1N2RkMzc1Li44ZGQ3YWU1IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCkBAIC0yNiwxMTEgKzI2LDEyMSBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0CiB7Ci0JcHVibGljIGNsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA6IEV4Y2VwdGlvbgotCXsKLQkJcHJvdGVjdGVkIEV4Y2VwdGlvblR5cGUgdHlwZTsKKyAgICBwdWJsaWMgY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIDogVEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIEV4Y2VwdGlvblR5cGUgdHlwZTsKIAotCQlwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSkKLQkJewotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJfQorICAgICAgICBwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlLCBzdHJpbmcgbWVzc2FnZSkKLQkJCTogYmFzZShtZXNzYWdlKQotCQl7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl9CisgICAgICAgIHB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlLCBzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBudWxsKSAvLyBUQXBwbGljYXRpb25FeGNlcHRpb24gaXMgc2VyaWFsaXphYmxlLCBidXQgd2UgbmV2ZXIgc2VyaWFsaXplIElubmVyRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIH0KIAotCQlwdWJsaWMgc3RhdGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBSZWFkKFRQcm90b2NvbCBpcHJvdCkKLQkJewotCQkJVEZpZWxkIGZpZWxkOworICAgICAgICBwdWJsaWMgc3RhdGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBSZWFkKFRQcm90b2NvbCBpcHJvdCkKKyAgICAgICAgeworICAgICAgICAgICAgVEZpZWxkIGZpZWxkOwogCi0JCQlzdHJpbmcgbWVzc2FnZSA9IG51bGw7Ci0JCQlFeGNlcHRpb25UeXBlIHR5cGUgPSBFeGNlcHRpb25UeXBlLlVua25vd247CisgICAgICAgICAgICBzdHJpbmcgbWVzc2FnZSA9IG51bGw7CisgICAgICAgICAgICBFeGNlcHRpb25UeXBlIHR5cGUgPSBFeGNlcHRpb25UeXBlLlVua25vd247CiAKLQkJCWlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOwotCQkJd2hpbGUgKHRydWUpCi0JCQl7Ci0JCQkJZmllbGQgPSBpcHJvdC5SZWFkRmllbGRCZWdpbigpOwotCQkJCWlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApCi0JCQkJewotCQkJCQlicmVhazsKLQkJCQl9CisgICAgICAgICAgICBpcHJvdC5SZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkID0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJc3dpdGNoIChmaWVsZC5JRCkKLQkJCQl7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCWlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0cmluZykKLQkJCQkJCXsKLQkJCQkJCQltZXNzYWdlID0gaXByb3QuUmVhZFN0cmluZygpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCVRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAyOgotCQkJCQkJaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuSTMyKQotCQkJCQkJewotCQkJCQkJCXR5cGUgPSAoRXhjZXB0aW9uVHlwZSlpcHJvdC5SZWFkSTMyKCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLklEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBpcHJvdC5SZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5JMzIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IChFeGNlcHRpb25UeXBlKWlwcm90LlJlYWRJMzIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJaXByb3QuUmVhZEZpZWxkRW5kKCk7Ci0JCQl9CisgICAgICAgICAgICAgICAgaXByb3QuUmVhZEZpZWxkRW5kKCk7CisgICAgICAgICAgICB9CiAKLQkJCWlwcm90LlJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgICAgICAgIGlwcm90LlJlYWRTdHJ1Y3RFbmQoKTsKIAotCQkJcmV0dXJuIG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24odHlwZSwgbWVzc2FnZSk7Ci0JCX0KKyAgICAgICAgICAgIHJldHVybiBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKHR5cGUsIG1lc3NhZ2UpOworICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgV3JpdGUoVFByb3RvY29sIG9wcm90KQotCQl7Ci0JCQlUU3RydWN0IHN0cnVjID0gbmV3IFRTdHJ1Y3QoIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpOwotCQkJVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgpOworICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZShUUHJvdG9jb2wgb3Byb3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRTdHJ1Y3Qgc3RydWMgPSBuZXcgVFN0cnVjdCgiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIik7CisgICAgICAgICAgICBURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7CiAKLQkJCW9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOworICAgICAgICAgICAgb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7CiAKLQkJCWlmICghU3RyaW5nLklzTnVsbE9yRW1wdHkoTWVzc2FnZSkpCi0JCQl7Ci0JCQkJZmllbGQuTmFtZSA9ICJtZXNzYWdlIjsKLQkJCQlmaWVsZC5UeXBlID0gVFR5cGUuU3RyaW5nOwotCQkJCWZpZWxkLklEID0gMTsKLQkJCQlvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOwotCQkJCW9wcm90LldyaXRlU3RyaW5nKE1lc3NhZ2UpOwotCQkJCW9wcm90LldyaXRlRmllbGRFbmQoKTsKLQkJCX0KKyAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoTWVzc2FnZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGQuTmFtZSA9ICJtZXNzYWdlIjsKKyAgICAgICAgICAgICAgICBmaWVsZC5UeXBlID0gVFR5cGUuU3RyaW5nOworICAgICAgICAgICAgICAgIGZpZWxkLklEID0gMTsKKyAgICAgICAgICAgICAgICBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOworICAgICAgICAgICAgICAgIG9wcm90LldyaXRlU3RyaW5nKE1lc3NhZ2UpOworICAgICAgICAgICAgICAgIG9wcm90LldyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgICAgIH0KIAotCQkJZmllbGQuTmFtZSA9ICJ0eXBlIjsKLQkJCWZpZWxkLlR5cGUgPSBUVHlwZS5JMzI7Ci0JCQlmaWVsZC5JRCA9IDI7Ci0JCQlvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOwotCQkJb3Byb3QuV3JpdGVJMzIoKGludCl0eXBlKTsKLQkJCW9wcm90LldyaXRlRmllbGRFbmQoKTsKLQkJCW9wcm90LldyaXRlRmllbGRTdG9wKCk7Ci0JCQlvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOwotCQl9CisgICAgICAgICAgICBmaWVsZC5OYW1lID0gInR5cGUiOworICAgICAgICAgICAgZmllbGQuVHlwZSA9IFRUeXBlLkkzMjsKKyAgICAgICAgICAgIGZpZWxkLklEID0gMjsKKyAgICAgICAgICAgIG9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZCk7CisgICAgICAgICAgICBvcHJvdC5Xcml0ZUkzMigoaW50KXR5cGUpOworICAgICAgICAgICAgb3Byb3QuV3JpdGVGaWVsZEVuZCgpOworICAgICAgICAgICAgb3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgICAgICAgIG9wcm90LldyaXRlU3RydWN0RW5kKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgZW51bSBFeGNlcHRpb25UeXBlCi0JCXsKLQkJCVVua25vd24sCi0JCQlVbmtub3duTWV0aG9kLAotCQkJSW52YWxpZE1lc3NhZ2VUeXBlLAotCQkJV3JvbmdNZXRob2ROYW1lLAotCQkJQmFkU2VxdWVuY2VJRCwKLQkJCU1pc3NpbmdSZXN1bHQKLQkJfQotCX0KKyAgICAgICAgcHVibGljIGVudW0gRXhjZXB0aW9uVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBVbmtub3duLAorICAgICAgICAgICAgVW5rbm93bk1ldGhvZCwKKyAgICAgICAgICAgIEludmFsaWRNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgIFdyb25nTWV0aG9kTmFtZSwKKyAgICAgICAgICAgIEJhZFNlcXVlbmNlSUQsCisgICAgICAgICAgICBNaXNzaW5nUmVzdWx0LAorICAgICAgICAgICAgSW50ZXJuYWxFcnJvciwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3IsCisgICAgICAgICAgICBJbnZhbGlkVHJhbnNmb3JtLAorICAgICAgICAgICAgSW52YWxpZFByb3RvY29sLAorICAgICAgICAgICAgVW5zdXBwb3J0ZWRDbGllbnRUeXBlCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRXhjZXB0aW9uVHlwZSBUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0eXBlOyB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UQXN5bmNQcm9jZXNzb3IuY3MgYi9saWIvY3NoYXJwL3NyYy9UQXN5bmNQcm9jZXNzb3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI0MzIyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RBc3luY1Byb2Nlc3Nvci5jcwpAQCAtMCwwICsxLDM4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBQcm9jZXNzZXMgYSBtZXNzYWdlIGFzeW5jaHJvbm91c2x5LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGludGVyZmFjZSBUQXN5bmNQcm9jZXNzb3IKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFByb2Nlc3NlcyB0aGUgbmV4dCBwYXJ0IG9mIHRoZSBtZXNzYWdlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Imlwcm90Ij5UaGUgaW5wdXQgcHJvdG9jb2wuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvcHJvdCI+VGhlIG91dHB1dCBwcm90b2NvbC48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dHJ1ZSBpZiB0aGVyZSdzIG1vcmUgdG8gcHJvY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLjwvcmV0dXJucz4KKyAgICAgICAgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RDb250cm9sbGluZ0hhbmRsZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9UQ29udHJvbGxpbmdIYW5kbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNTIwM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UQ29udHJvbGxpbmdIYW5kbGVyLmNzCkBAIC0wLDAgKzEsMjkgQEAKK++7vy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIHB1YmxpYyBpbnRlcmZhY2UgVENvbnRyb2xsaW5nSGFuZGxlcgorICAgIHsKKyAgICAgICAgVFNlcnZlciBzZXJ2ZXIgeyBnZXQ7IHNldDsgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RFeGNlcHRpb24uY3MgYi9saWIvY3NoYXJwL3NyYy9URXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOWEyMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9URXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsNDAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgVEV4Y2VwdGlvbiA6IEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIFRFeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGlubmVyKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RQcm9jZXNzb3IuY3MgYi9saWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yLmNzCmluZGV4IGRjMWI3OTUuLjcxY2U3NTUgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RQcm9jZXNzb3IuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVFByb2Nlc3Nvci5jcwpAQCAtMjYsOCArMjYsOCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0CiB7Ci0JcHVibGljIGludGVyZmFjZSBUUHJvY2Vzc29yCi0JewotCQlib29sIFByb2Nlc3MoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpOwotCX0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRQcm9jZXNzb3IKKyAgICB7CisgICAgICAgIGJvb2wgUHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVFByb2Nlc3NvckZhY3RvcnkuY3MgYi9saWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGY2MzFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVFByb2Nlc3NvckZhY3RvcnkuY3MKQEAgLTAsMCArMSwzMCBAQAor77u/LyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIHB1YmxpYyBpbnRlcmZhY2UgVFByb2Nlc3NvckZhY3RvcnkKKyAgICB7CisgICAgICAgIFRQcm9jZXNzb3IgR2V0UHJvY2Vzc29yKFRUcmFuc3BvcnQgdHJhbnMsIFRTZXJ2ZXIgc2VydmVyID0gbnVsbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkuY3MgYi9saWIvY3NoYXJwL3NyYy9UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjQ3MjYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkuY3MKQEAgLTAsMCArMSw1NSBAQAor77u/LyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIHB1YmxpYyBjbGFzcyBUUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeTxQLCBIPiA6IFRQcm9jZXNzb3JGYWN0b3J5IHdoZXJlIFAgOiBUUHJvY2Vzc29yCisgICAgeworICAgICAgICBvYmplY3RbXSBoYW5kbGVyQXJncyA9IG51bGw7CisKKyAgICAgICAgcHVibGljIFRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5KCkKKyAgICAgICAgeworICAgICAgICAgICAgaGFuZGxlckFyZ3MgPSBuZXcgb2JqZWN0WzBdOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5KHBhcmFtcyBvYmplY3RbXSBoYW5kbGVyQXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5oYW5kbGVyQXJncyA9IGhhbmRsZXJBcmdzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRQcm9jZXNzb3IgR2V0UHJvY2Vzc29yKFRUcmFuc3BvcnQgdHJhbnMsIFRTZXJ2ZXIgc2VydmVyID0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgSCBoYW5kbGVyID0gKEgpQWN0aXZhdG9yLkNyZWF0ZUluc3RhbmNlKHR5cGVvZihIKSwgaGFuZGxlckFyZ3MpOworCisgICAgICAgICAgICBUQ29udHJvbGxpbmdIYW5kbGVyIGhhbmRsZXJTZXJ2ZXJSZWYgPSBoYW5kbGVyIGFzIFRDb250cm9sbGluZ0hhbmRsZXI7CisgICAgICAgICAgICBpZiAoaGFuZGxlclNlcnZlclJlZiAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhhbmRsZXJTZXJ2ZXJSZWYuc2VydmVyID0gc2VydmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEFjdGl2YXRvci5DcmVhdGVJbnN0YW5jZSh0eXBlb2YoUCksIG5ldyBvYmplY3RbXSB7IGhhbmRsZXIgfSkgYXMgVFByb2Nlc3NvcjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5LmNzIGIvbGliL2NzaGFycC9zcmMvVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyODk3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5LmNzCkBAIC0wLDAgKzEsNDMgQEAKK++7vy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkgOiBUUHJvY2Vzc29yRmFjdG9yeQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUUHJvY2Vzc29yIHByb2Nlc3Nvcl87CisKKyAgICAgICAgcHVibGljIFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KFRQcm9jZXNzb3IgcHJvY2Vzc29yKQorICAgICAgICB7CisgICAgICAgICAgICBwcm9jZXNzb3JfID0gcHJvY2Vzc29yOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRQcm9jZXNzb3IgR2V0UHJvY2Vzc29yKFRUcmFuc3BvcnQgdHJhbnMsIFRTZXJ2ZXIgc2VydmVyID0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3Nvcl87CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UaHJpZnQuNDUuY3Nwcm9qIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LjQ1LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTI4YjI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LjQ1LmNzcHJvagpAQCAtMCwwICsxLDEyOSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2plY3RHdWlkPntFQkNFMzVEQS1DRjZBLTQyQkMtQTM1Ny1BOUMwOUI1MzQyOTl9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5UaHJpZnQ8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5UaHJpZnQ0NTwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxEZWJ1Z1R5cGU+cG9ydGFibGU8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtERUJVRztORVQ0NTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnVHlwZT5wb3J0YWJsZTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtORVQ0NTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sLkxpbnEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YS5EYXRhU2V0RXh0ZW5zaW9ucyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5DU2hhcnAiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFRDb2xsZWN0aW9ucy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xUSGFzaFNldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQWJzdHJhY3RCYXNlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRCYXNlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRCYXNlNjRVdGlscy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2wuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVENvbXBhY3RQcm90b2NvbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxURmllbGQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEpTT05Qcm90b2NvbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTGlzdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTWFwLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNZXNzYWdlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNZXNzYWdlVHlwZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE11bHRpcGxleGVkUHJvdG9jb2wuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbERlY29yYXRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xFeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sRmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xVdGlsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRTZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFN0cnVjdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUVHlwZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFNlcnZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFNlcnZlckV2ZW50SGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFNpbXBsZVNlcnZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFRocmVhZGVkU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUVGhyZWFkUG9vbFNlcnZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUQXBwbGljYXRpb25FeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVEFzeW5jUHJvY2Vzc29yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRDb250cm9sbGluZ0hhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVEV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUUHJvY2Vzc29yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRQcm9jZXNzb3JGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUQnVmZmVyZWRUcmFuc3BvcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRGcmFtZWRUcmFuc3BvcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRIdHRwQ2xpZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUSHR0cEhhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRIdHRwVGFza0FzeW5jSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNlcnZlclNvY2tldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNlcnZlclRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNpbHZlcmxpZ2h0U29ja2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU29ja2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU29ja2V0VmVyc2lvbml6ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTdHJlYW1UcmFuc3BvcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUTFNTZXJ2ZXJTb2NrZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUTFNTb2NrZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUcmFuc3BvcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUcmFuc3BvcnRFeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUcmFuc3BvcnRGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5LmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Rm9sZGVyIEluY2x1ZGU9IlNlcnZlclxDb2xsZWN0aW9uc1wiIC8+CisgICAgPEZvbGRlciBJbmNsdWRlPSJTZXJ2ZXJcUHJvdG9jb2xcIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PgorICAtLT4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UaHJpZnQuY3Nwcm9qIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LmNzcHJvagppbmRleCAyM2ZlMDE4Li5iZjY1NTY5IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UaHJpZnQuY3Nwcm9qCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5jc3Byb2oKQEAgLTEsNCArMSw1IEBACi3vu788IS0tCivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQogICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCiAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCkBAIC0xNiw3ICsxNyw3IEBACiAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMy41IiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CiAgIDxQcm9wZXJ0eUdyb3VwPgogICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgogICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KQEAgLTI5LDIzICszMCw0NSBAQAogICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CiAgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgogICAgIDxSb290TmFtZXNwYWNlPlRocmlmdDwvUm9vdE5hbWVzcGFjZT4KKyAgICA8RmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8L0ZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4KKyAgICA8VXBncmFkZUJhY2t1cExvY2F0aW9uIC8+CisgICAgPFB1Ymxpc2hVcmw+cHVibGlzaFw8L1B1Ymxpc2hVcmw+CisgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8SW5zdGFsbEZyb20+RGlzazwvSW5zdGFsbEZyb20+CisgICAgPFVwZGF0ZUVuYWJsZWQ+ZmFsc2U8L1VwZGF0ZUVuYWJsZWQ+CisgICAgPFVwZGF0ZU1vZGU+Rm9yZWdyb3VuZDwvVXBkYXRlTW9kZT4KKyAgICA8VXBkYXRlSW50ZXJ2YWw+NzwvVXBkYXRlSW50ZXJ2YWw+CisgICAgPFVwZGF0ZUludGVydmFsVW5pdHM+RGF5czwvVXBkYXRlSW50ZXJ2YWxVbml0cz4KKyAgICA8VXBkYXRlUGVyaW9kaWNhbGx5PmZhbHNlPC9VcGRhdGVQZXJpb2RpY2FsbHk+CisgICAgPFVwZGF0ZVJlcXVpcmVkPmZhbHNlPC9VcGRhdGVSZXF1aXJlZD4KKyAgICA8TWFwRmlsZUV4dGVuc2lvbnM+dHJ1ZTwvTWFwRmlsZUV4dGVuc2lvbnM+CisgICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4KKyAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLjA8L0FwcGxpY2F0aW9uVmVyc2lvbj4KKyAgICA8SXNXZWJCb290c3RyYXBwZXI+ZmFsc2U8L0lzV2ViQm9vdHN0cmFwcGVyPgorICAgIDxVc2VBcHBsaWNhdGlvblRydXN0PmZhbHNlPC9Vc2VBcHBsaWNhdGlvblRydXN0PgorICAgIDxCb290c3RyYXBwZXJFbmFibGVkPnRydWU8L0Jvb3RzdHJhcHBlckVuYWJsZWQ+CiAgIDwvUHJvcGVydHlHcm91cD4KICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CiAgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+Ci0gICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPERlYnVnVHlwZT5wb3J0YWJsZTwvRGVidWdUeXBlPgogICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CiAgICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtERUJVRzwvRGVmaW5lQ29uc3RhbnRzPgogICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgogICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CiAgIDwvUHJvcGVydHlHcm91cD4KICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KLSAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8RGVidWdUeXBlPnBvcnRhYmxlPC9EZWJ1Z1R5cGU+CiAgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgogICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPERlZmluZUNvbnN0YW50cz4KKyAgICA8L0RlZmluZUNvbnN0YW50cz4KICAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KICAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgogICA8L1Byb3BlcnR5R3JvdXA+CiAgIDxJdGVtR3JvdXA+CiAgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CkBAIC01NSw0NCArNzgsODAgQEAKICAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFRDb2xsZWN0aW9ucy5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xUSGFzaFNldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJOZXQzNVxFeHRlbnNpb25zTmV0MzUuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEFic3RyYWN0QmFzZS5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQmFzZS5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQmFzZTY0VXRpbHMuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRDb21wYWN0UHJvdG9jb2wuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEZpZWxkLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRKU09OUHJvdG9jb2wuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVExpc3QuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE1hcC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTWVzc2FnZS5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTWVzc2FnZVR5cGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNdWx0aXBsZXhlZFByb3RvY29sLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xEZWNvcmF0b3IuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sRXhjZXB0aW9uLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbEZhY3RvcnkuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sVXRpbC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUU2V0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRTdHJ1Y3QuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFR5cGUuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRUaHJlYWRlZFNlcnZlci5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFNlcnZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFNlcnZlckV2ZW50SGFuZGxlci5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFNpbXBsZVNlcnZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFRocmVhZGVkU2VydmVyLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUVGhyZWFkUG9vbFNlcnZlci5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUQXBwbGljYXRpb25FeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVENvbnRyb2xsaW5nSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJURXhjZXB0aW9uLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRQcm9jZXNzb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRCdWZmZXJlZFRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEZyYW1lZFRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEh0dHBDbGllbnQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRIdHRwSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNlcnZlclNvY2tldC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNlcnZlclRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNvY2tldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNvY2tldFZlcnNpb25pemVyLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU3RyZWFtVHJhbnNwb3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVExTU2VydmVyU29ja2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVExTU29ja2V0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0RXhjZXB0aW9uLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0RmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeS5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5DbGllbnQuMy41Ij4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDEgQ2xpZW50IFByb2ZpbGU8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2luZG93cy5JbnN0YWxsZXIuMy4xIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPldpbmRvd3MgSW5zdGFsbGVyIDMuMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KICAgPC9JdGVtR3JvdXA+CiAgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcTWljcm9zb2Z0LkNTSEFSUC5UYXJnZXRzIiAvPgogICA8UHJvamVjdEV4dGVuc2lvbnM+CiAgICAgPFZpc3VhbFN0dWRpbyBBbGxvd0V4aXN0aW5nRm9sZGVyPSJ0cnVlIiAvPgogICA8L1Byb2plY3RFeHRlbnNpb25zPgotPC9Qcm9qZWN0PgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5zbG4gYi9saWIvY3NoYXJwL3NyYy9UaHJpZnQuc2xuCmluZGV4IDI5NTUzNzkuLmEyOWU0NjggMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5zbG4KKysrIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LnNsbgpAQCAtMSwzMyArMSwxNiBAQAot77u/IwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTAuMDAKLSMgVmlzdWFsIFN0dWRpbyAyMDA4Civvu78KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDExLjAwCisjIFZpc3VhbCBTdHVkaW8gMjAxMAogUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnQiLCAiVGhyaWZ0LmNzcHJvaiIsICJ7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfSIKIEVuZFByb2plY3QKLVByb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0VGVzdCIsICIuLlwuLlwuLlx0ZXN0XGNzaGFycFxUaHJpZnRUZXN0XFRocmlmdFRlc3QuY3Nwcm9qIiwgIns0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9IgotCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QKLQkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0gPSB7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfQotCUVuZFByb2plY3RTZWN0aW9uCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRocmlmdFRlc3QiLCAiLi5cdGVzdFxUaHJpZnRUZXN0XFRocmlmdFRlc3QuY3Nwcm9qIiwgIns0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9IgogRW5kUHJvamVjdAogUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnRNU0J1aWxkVGFzayIsICIuLlxUaHJpZnRNU0J1aWxkVGFza1xUaHJpZnRNU0J1aWxkVGFzay5jc3Byb2oiLCAie0VDMEEwMjMxLTY2RUEtNDU5My1BNzkyLUM2Q0EzQkI4NjY4RX0iCiBFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRocmlmdC40NSIsICJUaHJpZnQuNDUuY3Nwcm9qIiwgIntFQkNFMzVEQS1DRjZBLTQyQkMtQTM1Ny1BOUMwOUI1MzQyOTl9IgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnRNVkNUZXN0IiwgIi4uXHRlc3RcVGhyaWZ0TVZDVGVzdFxUaHJpZnRNVkNUZXN0LmNzcHJvaiIsICJ7ODkxQjQ0ODctQzdCQS00MjdFLUJCQzgtNEM1OTZDMjI5QTEwfSIKK0VuZFByb2plY3QKIEdsb2JhbAogCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCiAJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCkBAIC00Niw4ICsyOSwxOSBAQAogCQl7RUMwQTAyMzEtNjZFQS00NTkzLUE3OTItQzZDQTNCQjg2NjhFfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCiAJCXtFQzBBMDIzMS02NkVBLTQ1OTMtQTc5Mi1DNkNBM0JCODY2OEV9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKIAkJe0VDMEEwMjMxLTY2RUEtNDU5My1BNzkyLUM2Q0EzQkI4NjY4RX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0VCQ0UzNURBLUNGNkEtNDJCQy1BMzU3LUE5QzA5QjUzNDI5OX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFQkNFMzVEQS1DRjZBLTQyQkMtQTM1Ny1BOUMwOUI1MzQyOTl9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0VCQ0UzNURBLUNGNkEtNDJCQy1BMzU3LUE5QzA5QjUzNDI5OX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RUJDRTM1REEtQ0Y2QS00MkJDLUEzNTctQTlDMDlCNTM0Mjk5fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7ODkxQjQ0ODctQzdCQS00MjdFLUJCQzgtNEM1OTZDMjI5QTEwfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezg5MUI0NDg3LUM3QkEtNDI3RS1CQkM4LTRDNTk2QzIyOUExMH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7ODkxQjQ0ODctQzdCQS00MjdFLUJCQzgtNEM1OTZDMjI5QTEwfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs4OTFCNDQ4Ny1DN0JBLTQyN0UtQkJDOC00QzU5NkMyMjlBMTB9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCiAJRW5kR2xvYmFsU2VjdGlvbgogCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCiAJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQogCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKE1vbm9EZXZlbG9wUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQkgICAgICAgIFN0YXJ0dXBJdGVtID0gVGhyaWZ0LmNzcHJvagorCUVuZEdsb2JhbFNlY3Rpb24KIEVuZEdsb2JhbApkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQuY3MKaW5kZXggMjhhODU1YS4uODg3MDk4OCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LmNzCkBAIC0yMiw3OSArMjIsMTczIEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CiB7Ci0JcHVibGljIGNsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQKLQl7Ci0JCXByaXZhdGUgQnVmZmVyZWRTdHJlYW0gaW5wdXRCdWZmZXI7Ci0JCXByaXZhdGUgQnVmZmVyZWRTdHJlYW0gb3V0cHV0QnVmZmVyOwotCQlwcml2YXRlIGludCBidWZTaXplOwotCQlwcml2YXRlIFRTdHJlYW1UcmFuc3BvcnQgdHJhbnNwb3J0OworICAgIHB1YmxpYyBjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnQgOiBUVHJhbnNwb3J0LCBJRGlzcG9zYWJsZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgYnVmU2l6ZTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZW1vcnlTdHJlYW0gaW5wdXRCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKDApOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBvdXRwdXRCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKDApOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRUcmFuc3BvcnQgdHJhbnNwb3J0OwogCi0JCXB1YmxpYyBUQnVmZmVyZWRUcmFuc3BvcnQoVFN0cmVhbVRyYW5zcG9ydCB0cmFuc3BvcnQpCi0JCQk6dGhpcyh0cmFuc3BvcnQsIDEwMjQpCi0JCXsKKyAgICAgICAgcHVibGljIFRCdWZmZXJlZFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCwgaW50IGJ1ZlNpemUgPSAxMDI0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodHJhbnNwb3J0ID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigidHJhbnNwb3J0Iik7CisgICAgICAgICAgICBpZiAoYnVmU2l6ZSA8PSAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiYnVmU2l6ZSIsICJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyLiIpOworICAgICAgICAgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisgICAgICAgICAgICB0aGlzLmJ1ZlNpemUgPSBidWZTaXplOworICAgICAgICB9CiAKLQkJfQorICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydCBVbmRlcmx5aW5nVHJhbnNwb3J0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0OworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIFRCdWZmZXJlZFRyYW5zcG9ydChUU3RyZWFtVHJhbnNwb3J0IHRyYW5zcG9ydCwgaW50IGJ1ZlNpemUpCi0JCXsKLQkJCXRoaXMuYnVmU2l6ZSA9IGJ1ZlNpemU7Ci0JCQl0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKLQkJCUluaXRCdWZmZXJzKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFdlIGNhbiBsZWdpdGltYXRlbHkgdGhyb3cgaGVyZSBidXQgYmUgbmljZSBhIGJpdC4KKyAgICAgICAgICAgICAgICAvLyBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICFfSXNEaXNwb3NlZCAmJiB0cmFuc3BvcnQuSXNPcGVuOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIEluaXRCdWZmZXJzKCkKLQkJewotCQkJaWYgKHRyYW5zcG9ydC5JbnB1dFN0cmVhbSAhPSBudWxsKQotCQkJewotCQkJCWlucHV0QnVmZmVyID0gbmV3IEJ1ZmZlcmVkU3RyZWFtKHRyYW5zcG9ydC5JbnB1dFN0cmVhbSwgYnVmU2l6ZSk7Ci0JCQl9Ci0JCQlpZiAodHJhbnNwb3J0Lk91dHB1dFN0cmVhbSAhPSBudWxsKQotCQkJewotCQkJCW91dHB1dEJ1ZmZlciA9IG5ldyBCdWZmZXJlZFN0cmVhbSh0cmFuc3BvcnQuT3V0cHV0U3RyZWFtLCBidWZTaXplKTsKLQkJCX0KLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgdHJhbnNwb3J0Lk9wZW4oKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUVHJhbnNwb3J0IFVuZGVybHlpbmdUcmFuc3BvcnQKLQkJewotCQkJZ2V0IHsgcmV0dXJuIHRyYW5zcG9ydDsgfQotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KLQkJewotCQkJZ2V0IHsgcmV0dXJuIHRyYW5zcG9ydC5Jc09wZW47IH0KLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgaWYgKCFJc09wZW4pCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOwogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKQotCQl7Ci0JCQl0cmFuc3BvcnQuT3BlbigpOwotCQkJSW5pdEJ1ZmZlcnMoKTsKLQkJfQorICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVyLkNhcGFjaXR5IDwgYnVmU2l6ZSkKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5DYXBhY2l0eSA9IGJ1ZlNpemU7CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQotCQl7Ci0JCQlpZiAoaW5wdXRCdWZmZXIgIT0gbnVsbCAmJiBpbnB1dEJ1ZmZlci5DYW5SZWFkKQotCQkJewotCQkJCWlucHV0QnVmZmVyLkNsb3NlKCk7Ci0JCQl9Ci0JCQlpZiAob3V0cHV0QnVmZmVyICE9IG51bGwgJiYgb3V0cHV0QnVmZmVyLkNhbldyaXRlKQotCQkJewotCQkJCW91dHB1dEJ1ZmZlci5DbG9zZSgpOwotCQkJfQotCQl9CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZ290ID0gaW5wdXRCdWZmZXIuUmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoZ290ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdvdDsKIAotCQlwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKLQkJewotCQkJcmV0dXJuIGlucHV0QnVmZmVyLlJlYWQoYnVmLCBvZmYsIGxlbik7Ci0JCX0KKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLlNldExlbmd0aChpbnB1dEJ1ZmZlci5DYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgaW50IGZpbGxlZCA9IHRyYW5zcG9ydC5SZWFkKGlucHV0QnVmZmVyLkdldEJ1ZmZlcigpLCAwLCAoaW50KWlucHV0QnVmZmVyLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuU2V0TGVuZ3RoKGZpbGxlZCk7CisgICAgICAgICAgICAgICAgaWYgKGZpbGxlZCA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCi0JCXsKLQkJCW91dHB1dEJ1ZmZlci5Xcml0ZShidWYsIG9mZiwgbGVuKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICAvLyBSZWxhdGl2ZSBvZmZzZXQgZnJvbSAib2ZmIiBhcmd1bWVudAorICAgICAgICAgICAgaW50IG9mZnNldCA9IDA7CisgICAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGNhcGEgPSAoaW50KShvdXRwdXRCdWZmZXIuQ2FwYWNpdHkgLSBvdXRwdXRCdWZmZXIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpbnQgd3JpdGVTaXplID0gY2FwYSA8PSBsZW4gPyBjYXBhIDogbGVuOworICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5Xcml0ZShidWYsIG9mZiwgd3JpdGVTaXplKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gd3JpdGVTaXplOworICAgICAgICAgICAgICAgIGlmICh3cml0ZVNpemUgPT0gY2FwYSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5Xcml0ZShvdXRwdXRCdWZmZXIuR2V0QnVmZmVyKCksIDAsIChpbnQpb3V0cHV0QnVmZmVyLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5TZXRMZW5ndGgoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKGxlbiAtIG9mZnNldCA+PSBidWZTaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5Xcml0ZShidWYsIG9mZiArIG9mZnNldCwgYnVmU2l6ZSk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGJ1ZlNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgcmVtYWluID0gbGVuIC0gb2Zmc2V0OworICAgICAgICAgICAgaWYgKHJlbWFpbiA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlci5DYXBhY2l0eSA8IGJ1ZlNpemUpCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5DYXBhY2l0eSA9IGJ1ZlNpemU7CisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLldyaXRlKGJ1Ziwgb2ZmICsgb2Zmc2V0LCByZW1haW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQotCQl7Ci0JCQlvdXRwdXRCdWZmZXIuRmx1c2goKTsKLQkJfQotCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEludGVybmFsRmx1c2goKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0LldyaXRlKG91dHB1dEJ1ZmZlci5HZXRCdWZmZXIoKSwgMCwgKGludClvdXRwdXRCdWZmZXIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXIuU2V0TGVuZ3RoKDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBJbnRlcm5hbEZsdXNoKCk7CisKKyAgICAgICAgICAgIHRyYW5zcG9ydC5GbHVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElBc3luY1Jlc3VsdCBCZWdpbkZsdXNoKEFzeW5jQ2FsbGJhY2sgY2FsbGJhY2ssIG9iamVjdCBzdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgSW50ZXJuYWxGbHVzaCgpOworCisgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0LkJlZ2luRmx1c2goIGNhbGxiYWNrLCBzdGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFbmRGbHVzaChJQXN5bmNSZXN1bHQgYXN5bmNSZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5FbmRGbHVzaCggYXN5bmNSZXN1bHQpOworICAgICAgICB9CisKKworCisgICAgICAgIHByb3RlY3RlZCB2b2lkIENoZWNrTm90RGlzcG9zZWQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX0lzRGlzcG9zZWQpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uKCJUQnVmZmVyZWRUcmFuc3BvcnQiKTsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyAgICAgICAgcHJvdGVjdGVkIGJvb2wgX0lzRGlzcG9zZWQgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmNzCmluZGV4IGUyNTlmNWEuLmE3NDZhMzIgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmNzCkBAIC0xNiwxMjIgKzE2LDE5MCBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLQordXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLklPOwogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotCXB1YmxpYyBjbGFzcyBURnJhbWVkVHJhbnNwb3J0IDogVFRyYW5zcG9ydAotCXsKLQkJcHJvdGVjdGVkIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbnVsbDsKLQkJcHJvdGVjdGVkIE1lbW9yeVN0cmVhbSB3cml0ZUJ1ZmZlcjsKLQkJcHJvdGVjdGVkIE1lbW9yeVN0cmVhbSByZWFkQnVmZmVyID0gbnVsbDsKKyAgICBwdWJsaWMgY2xhc3MgVEZyYW1lZFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQsIElEaXNwb3NhYmxlCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRUcmFuc3BvcnQgdHJhbnNwb3J0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSB3cml0ZUJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oMTAyNCk7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIHJlYWRCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKDEwMjQpOwogCi0JCXByaXZhdGUgY29uc3QgaW50IGhlYWRlcl9zaXplID0gNDsKLQkJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGhlYWRlcl9kdW1teSA9IG5ldyBieXRlW2hlYWRlcl9zaXplXTsgLy8gdXNlZCBhcyBoZWFkZXIgcGxhY2Vob2xkZXIgd2hpbGUgaW5pdGlsaXppbmcgbmV3IHdyaXRlIGJ1ZmZlcgorICAgICAgICBwcml2YXRlIGNvbnN0IGludCBIZWFkZXJTaXplID0gNDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBieXRlW10gaGVhZGVyQnVmID0gbmV3IGJ5dGVbSGVhZGVyU2l6ZV07CiAKLQkJcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUVHJhbnNwb3J0RmFjdG9yeQotCQl7Ci0JCQlwdWJsaWMgb3ZlcnJpZGUgVFRyYW5zcG9ydCBHZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFucykKLQkJCXsKLQkJCQlyZXR1cm4gbmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogVFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIFRUcmFuc3BvcnQgR2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBURnJhbWVkVHJhbnNwb3J0KCkKLQkJewotCQkJSW5pdFdyaXRlQnVmZmVyKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIFRGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJ0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgICAgICAgICAgSW5pdFdyaXRlQnVmZmVyKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVEZyYW1lZFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgOiB0aGlzKCkKLQkJewotCQkJdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5PcGVuKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKLQkJewotCQkJdHJhbnNwb3J0Lk9wZW4oKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gV2UgY2FuIGxlZ2l0aW1hdGVseSB0aHJvdyBoZXJlIGJ1dCBiZSBuaWNlIGEgYml0LgorICAgICAgICAgICAgICAgIC8vIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gIV9Jc0Rpc3Bvc2VkICYmIHRyYW5zcG9ydC5Jc09wZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KLQkJewotCQkJZ2V0Ci0JCQl7Ci0JCQkJcmV0dXJuIHRyYW5zcG9ydC5Jc09wZW47Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKLQkJewotCQkJdHJhbnNwb3J0LkNsb3NlKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIGludCBnb3QgPSByZWFkQnVmZmVyLlJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICBpZiAoZ290ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ290OworICAgICAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQotCQl7Ci0JCQlpZiAocmVhZEJ1ZmZlciAhPSBudWxsKQotCQkJewotCQkJCWludCBnb3QgPSByZWFkQnVmZmVyLlJlYWQoYnVmLCBvZmYsIGxlbik7Ci0JCQkJaWYgKGdvdCA+IDApCi0JCQkJewotCQkJCQlyZXR1cm4gZ290OwotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgIC8vIFJlYWQgYW5vdGhlciBmcmFtZSBvZiBkYXRhCisgICAgICAgICAgICBSZWFkRnJhbWUoKTsKIAotCQkJLy8gUmVhZCBhbm90aGVyIGZyYW1lIG9mIGRhdGEKLQkJCVJlYWRGcmFtZSgpOworICAgICAgICAgICAgcmV0dXJuIHJlYWRCdWZmZXIuUmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQogCi0JCQlyZXR1cm4gcmVhZEJ1ZmZlci5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOwotCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCBSZWFkRnJhbWUoKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuUmVhZEFsbChoZWFkZXJCdWYsIDAsIEhlYWRlclNpemUpOworICAgICAgICAgICAgaW50IHNpemUgPSBEZWNvZGVGcmFtZVNpemUoaGVhZGVyQnVmKTsKIAotCQlwcml2YXRlIHZvaWQgUmVhZEZyYW1lKCkKLQkJewotCQkJYnl0ZVtdIGkzMnJkID0gbmV3IGJ5dGVbaGVhZGVyX3NpemVdOwotCQkJdHJhbnNwb3J0LlJlYWRBbGwoaTMycmQsIDAsIGhlYWRlcl9zaXplKTsKLQkJCWludCBzaXplID0KLQkJCQkoKGkzMnJkWzBdICYgMHhmZikgPDwgMjQpIHwKLQkJCQkoKGkzMnJkWzFdICYgMHhmZikgPDwgMTYpIHwKLQkJCQkoKGkzMnJkWzJdICYgMHhmZikgPDwgIDgpIHwKLQkJCQkoKGkzMnJkWzNdICYgMHhmZikpOworICAgICAgICAgICAgcmVhZEJ1ZmZlci5TZXRMZW5ndGgoc2l6ZSk7CisgICAgICAgICAgICByZWFkQnVmZmVyLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICBieXRlW10gYnVmZiA9IHJlYWRCdWZmZXIuR2V0QnVmZmVyKCk7CisgICAgICAgICAgICB0cmFuc3BvcnQuUmVhZEFsbChidWZmLCAwLCBzaXplKTsKKyAgICAgICAgfQogCi0JCQlieXRlW10gYnVmZiA9IG5ldyBieXRlW3NpemVdOwotCQkJdHJhbnNwb3J0LlJlYWRBbGwoYnVmZiwgMCwgc2l6ZSk7Ci0JCQlyZWFkQnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbShidWZmKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICBpZiAod3JpdGVCdWZmZXIuTGVuZ3RoICsgKGxvbmcpbGVuID4gKGxvbmcpaW50Lk1heFZhbHVlKQorICAgICAgICAgICAgICAgIEZsdXNoKCk7CisgICAgICAgICAgICB3cml0ZUJ1ZmZlci5Xcml0ZShidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCi0JCXsKLQkJCXdyaXRlQnVmZmVyLldyaXRlKGJ1Ziwgb2ZmLCBsZW4pOwotCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCBJbnRlcm5hbEZsdXNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgaWYgKCFJc09wZW4pCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IHdyaXRlQnVmZmVyLkdldEJ1ZmZlcigpOworICAgICAgICAgICAgaW50IGxlbiA9IChpbnQpd3JpdGVCdWZmZXIuTGVuZ3RoOworICAgICAgICAgICAgaW50IGRhdGFfbGVuID0gbGVuIC0gSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgIGlmIChkYXRhX2xlbiA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5c3RlbS5JbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IC8vIGxvZ2ljIGVycm9yIGFjdHVhbGx5CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQotCQl7Ci0JCQlieXRlW10gYnVmID0gd3JpdGVCdWZmZXIuR2V0QnVmZmVyKCk7Ci0JCQlpbnQgbGVuID0gKGludCl3cml0ZUJ1ZmZlci5MZW5ndGg7Ci0JCQlpbnQgZGF0YV9sZW4gPSBsZW4gLSBoZWFkZXJfc2l6ZTsKLQkJCWlmICggZGF0YV9sZW4gPCAwICkKLQkJCQl0aHJvdyBuZXcgU3lzdGVtLkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24gKCk7IC8vIGxvZ2ljIGVycm9yIGFjdHVhbGx5CisgICAgICAgICAgICAvLyBJbmplY3QgbWVzc2FnZSBoZWFkZXIgaW50byB0aGUgcmVzZXJ2ZWQgYnVmZmVyIHNwYWNlCisgICAgICAgICAgICBFbmNvZGVGcmFtZVNpemUoZGF0YV9sZW4sIGJ1Zik7CiAKLQkJCUluaXRXcml0ZUJ1ZmZlcigpOworICAgICAgICAgICAgLy8gU2VuZCB0aGUgZW50aXJlIG1lc3NhZ2UgYXQgb25jZQorICAgICAgICAgICAgdHJhbnNwb3J0LldyaXRlKGJ1ZiwgMCwgbGVuKTsKIAotCQkJLy8gSW5qZWN0IG1lc3NhZ2UgaGVhZGVyIGludG8gdGhlIHJlc2VydmVkIGJ1ZmZlciBzcGFjZQotCQkJYnVmWzBdID0gKGJ5dGUpKDB4ZmYgJiAoZGF0YV9sZW4gPj4gMjQpKTsKLQkJCWJ1ZlsxXSA9IChieXRlKSgweGZmICYgKGRhdGFfbGVuID4+IDE2KSk7Ci0JCQlidWZbMl0gPSAoYnl0ZSkoMHhmZiAmIChkYXRhX2xlbiA+PiA4KSk7Ci0JCQlidWZbM10gPSAoYnl0ZSkoMHhmZiAmIChkYXRhX2xlbikpOworICAgICAgICAgICAgSW5pdFdyaXRlQnVmZmVyKCk7CisgICAgICAgIH0KIAotCQkJLy8gU2VuZCB0aGUgZW50aXJlIG1lc3NhZ2UgYXQgb25jZQotCQkJdHJhbnNwb3J0LldyaXRlKGJ1ZiwgMCwgbGVuKTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBJbnRlcm5hbEZsdXNoKCk7CiAKLQkJCXRyYW5zcG9ydC5GbHVzaCgpOwotCQl9CisgICAgICAgICAgICB0cmFuc3BvcnQuRmx1c2goKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCBJbml0V3JpdGVCdWZmZXIgKCkKLQkJewotCQkJLy8gQ3JlYXRlIG5ldyBidWZmZXIgaW5zdGFuY2UKLQkJCXdyaXRlQnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgxMDI0KTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElBc3luY1Jlc3VsdCBCZWdpbkZsdXNoKEFzeW5jQ2FsbGJhY2sgY2FsbGJhY2ssIG9iamVjdCBzdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgSW50ZXJuYWxGbHVzaCgpOwogCi0JCQkvLyBSZXNlcnZlIHNwYWNlIGZvciBtZXNzYWdlIGhlYWRlciB0byBiZSBwdXQgcmlnaHQgYmVmb3JlIHNlbmRpbmcgaXQgb3V0Ci0JCQl3cml0ZUJ1ZmZlci5Xcml0ZSAoIGhlYWRlcl9kdW1teSwgMCwgaGVhZGVyX3NpemUgKTsKLQkJfQotCX0KKyAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQuQmVnaW5GbHVzaCggY2FsbGJhY2ssIHN0YXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEVuZEZsdXNoKElBc3luY1Jlc3VsdCBhc3luY1Jlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhbnNwb3J0LkVuZEZsdXNoKCBhc3luY1Jlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgSW5pdFdyaXRlQnVmZmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgbWVzc2FnZSBoZWFkZXIgdG8gYmUgcHV0IHJpZ2h0IGJlZm9yZSBzZW5kaW5nIGl0IG91dAorICAgICAgICAgICAgd3JpdGVCdWZmZXIuU2V0TGVuZ3RoKEhlYWRlclNpemUpOworICAgICAgICAgICAgd3JpdGVCdWZmZXIuU2VlaygwLCBTZWVrT3JpZ2luLkVuZCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEVuY29kZUZyYW1lU2l6ZShpbnQgZnJhbWVTaXplLCBieXRlW10gYnVmKQorICAgICAgICB7CisgICAgICAgICAgICBidWZbMF0gPSAoYnl0ZSkoMHhmZiAmIChmcmFtZVNpemUgPj4gMjQpKTsKKyAgICAgICAgICAgIGJ1ZlsxXSA9IChieXRlKSgweGZmICYgKGZyYW1lU2l6ZSA+PiAxNikpOworICAgICAgICAgICAgYnVmWzJdID0gKGJ5dGUpKDB4ZmYgJiAoZnJhbWVTaXplID4+IDgpKTsKKyAgICAgICAgICAgIGJ1ZlszXSA9IChieXRlKSgweGZmICYgKGZyYW1lU2l6ZSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IERlY29kZUZyYW1lU2l6ZShieXRlW10gYnVmKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAoKGJ1ZlswXSAmIDB4ZmYpIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgKChidWZbMV0gJiAweGZmKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICgoYnVmWzJdICYgMHhmZikgPDwgOCkgfAorICAgICAgICAgICAgICAgICgoYnVmWzNdICYgMHhmZikpOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIHZvaWQgQ2hlY2tOb3REaXNwb3NlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIlRGcmFtZWRUcmFuc3BvcnQiKTsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyAgICAgICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOworCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX0lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkQnVmZmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkQnVmZmVyLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlQnVmZmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUJ1ZmZlci5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBDbGllbnQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBDbGllbnQuY3MKaW5kZXggYmY2Y2E0ZC4uNjY3ZmMyNSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cENsaWVudC5jcwpAQCAtNyw3ICs3LDcgQEAKICAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqCSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCiAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgpAQCAtMTUsMTc0ICsxNSw0NjEgQEAKICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqIAotICogCisgKgorICoKICAqLwogCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5JTzsKIHVzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Cit1c2luZyBTeXN0ZW0uSU8uQ29tcHJlc3Npb247CiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CiB7Ci0JcHVibGljIGNsYXNzIFRIdHRwQ2xpZW50IDogVFRyYW5zcG9ydAotCXsKLQkJcHJpdmF0ZSByZWFkb25seSBVcmkgdXJpOwotCQlwcml2YXRlIFN0cmVhbSBpbnB1dFN0cmVhbTsKLQkJcHJpdmF0ZSBNZW1vcnlTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOwotCQlwcml2YXRlIGludCBjb25uZWN0VGltZW91dCA9IDA7Ci0JCXByaXZhdGUgaW50IHJlYWRUaW1lb3V0ID0gMDsKLQkJcHJpdmF0ZSBJRGljdGlvbmFyeTxTdHJpbmcsIFN0cmluZz4gY3VzdG9tSGVhZGVycyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPigpOworICAgIHB1YmxpYyBjbGFzcyBUSHR0cENsaWVudCA6IFRUcmFuc3BvcnQsIElEaXNwb3NhYmxlCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFVyaSB1cmk7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgWDUwOUNlcnRpZmljYXRlW10gY2VydGlmaWNhdGVzOworICAgICAgICBwcml2YXRlIFN0cmVhbSBpbnB1dFN0cmVhbTsKKyAgICAgICAgcHJpdmF0ZSBNZW1vcnlTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOwogCi0JCXB1YmxpYyBUSHR0cENsaWVudChVcmkgdSkKLQkJewotCQkJdXJpID0gdTsKLQkJfQorICAgICAgICAvLyBUaW1lb3V0cyBpbiBtaWxsaXNlY29uZHMKKyAgICAgICAgcHJpdmF0ZSBpbnQgY29ubmVjdFRpbWVvdXQgPSAzMDAwMDsKIAotCQlwdWJsaWMgaW50IENvbm5lY3RUaW1lb3V0Ci0JCXsKLQkJCXNldAotCQkJewotCQkJICAgY29ubmVjdFRpbWVvdXQgPSB2YWx1ZTsKLQkJCX0KLQkJfQorICAgICAgICBwcml2YXRlIGludCByZWFkVGltZW91dCA9IDMwMDAwOwogCi0JCXB1YmxpYyBpbnQgUmVhZFRpbWVvdXQKLQkJewotCQkJc2V0Ci0JCQl7Ci0JCQkJcmVhZFRpbWVvdXQgPSB2YWx1ZTsKLQkJCX0KLQkJfQorICAgICAgICBwcml2YXRlIElEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBjdXN0b21IZWFkZXJzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCk7CiAKLQkJcHVibGljIElEaWN0aW9uYXJ5PFN0cmluZywgU3RyaW5nPiBDdXN0b21IZWFkZXJzCi0JCXsKLQkJCWdldAotCQkJewotCQkJCXJldHVybiBjdXN0b21IZWFkZXJzOwotCQkJfQotCQl9CisjaWYgIVNJTFZFUkxJR0hUCisgICAgICAgIHByaXZhdGUgSVdlYlByb3h5IHByb3h5ID0gV2ViUmVxdWVzdC5EZWZhdWx0V2ViUHJveHk7CisjZW5kaWYKIAotCQlwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KLQkJewotCQkJZ2V0Ci0JCQl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIFRIdHRwQ2xpZW50KFVyaSB1KQorICAgICAgICAgICAgOiB0aGlzKHUsIEVudW1lcmFibGUuRW1wdHk8WDUwOUNlcnRpZmljYXRlPigpKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUSHR0cENsaWVudChVcmkgdSwgSUVudW1lcmFibGU8WDUwOUNlcnRpZmljYXRlPiBjZXJ0aWZpY2F0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVyaSA9IHU7CisgICAgICAgICAgICB0aGlzLmNlcnRpZmljYXRlcyA9IChjZXJ0aWZpY2F0ZXMgPz8gRW51bWVyYWJsZS5FbXB0eTxYNTA5Q2VydGlmaWNhdGU+KCkpLlRvQXJyYXkoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKLQkJewotCQkJaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCi0JCQl7Ci0JCQkJaW5wdXRTdHJlYW0uQ2xvc2UoKTsKLQkJCQlpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCQl9Ci0JCQlpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpCi0JCQl7Ci0JCQkJb3V0cHV0U3RyZWFtLkNsb3NlKCk7Ci0JCQkJb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJCX0KLQkJfQorICAgICAgICBwdWJsaWMgaW50IENvbm5lY3RUaW1lb3V0CisgICAgICAgIHsKKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbm5lY3RUaW1lb3V0ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKLQkJewotCQkJaWYgKGlucHV0U3RyZWFtID09IG51bGwpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJObyByZXF1ZXN0IGhhcyBiZWVuIHNlbnQiKTsKLQkJCX0KKyAgICAgICAgcHVibGljIGludCBSZWFkVGltZW91dAorICAgICAgICB7CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZWFkVGltZW91dCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJCXRyeQotCQkJewotCQkJCWludCByZXQgPSBpbnB1dFN0cmVhbS5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICBwdWJsaWMgSURpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IEN1c3RvbUhlYWRlcnMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbUhlYWRlcnM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkJCWlmIChyZXQgPT0gLTEpCi0JCQkJewotCQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuRW5kT2ZGaWxlLCAiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZSIpOwotCQkJCX0KKyNpZiAhU0lMVkVSTElHSFQKKyAgICAgICAgcHVibGljIElXZWJQcm94eSBQcm94eQorICAgICAgICB7CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcm94eSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKIAotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gaW94KQotCQkJeyAKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgaW94LlRvU3RyaW5nKCkpOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCi0JCXsKLQkJCW91dHB1dFN0cmVhbS5Xcml0ZShidWYsIG9mZiwgbGVuKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQotCQl7Ci0JCQl0cnkgCi0JCQl7Ci0JCQkJU2VuZFJlcXVlc3QoKTsKLQkJCX0KLQkJCWZpbmFsbHkKLQkJCXsKLQkJCQlvdXRwdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5DbG9zZSgpOworICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0uQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIFNlbmRSZXF1ZXN0KCkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJSHR0cFdlYlJlcXVlc3QgY29ubmVjdGlvbiA9IENyZWF0ZVJlcXVlc3QoKTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbnB1dFN0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiTm8gcmVxdWVzdCBoYXMgYmVlbiBzZW50Iik7CisgICAgICAgICAgICB9CiAKLQkJCQlieXRlW10gZGF0YSA9IG91dHB1dFN0cmVhbS5Ub0FycmF5KCk7Ci0JCQkJY29ubmVjdGlvbi5Db250ZW50TGVuZ3RoID0gZGF0YS5MZW5ndGg7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcmV0ID0gaW5wdXRTdHJlYW0uUmVhZChidWYsIG9mZiwgbGVuKTsKIAotCQkJCVN0cmVhbSByZXF1ZXN0U3RyZWFtID0gY29ubmVjdGlvbi5HZXRSZXF1ZXN0U3RyZWFtKCk7Ci0JCQkJcmVxdWVzdFN0cmVhbS5Xcml0ZShkYXRhLCAwLCBkYXRhLkxlbmd0aCk7Ci0JCQkJaW5wdXRTdHJlYW0gPSBjb25uZWN0aW9uLkdldFJlc3BvbnNlKCkuR2V0UmVzcG9uc2VTdHJlYW0oKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sIGlveC5Ub1N0cmluZygpKTsKLQkJCX0KLQkJCWNhdGNoIChXZWJFeGNlcHRpb24gd3gpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sICJDb3VsZG4ndCBjb25uZWN0IHRvIHNlcnZlcjogIiArIHd4KTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuRW5kT2ZGaWxlLCAiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgICAgIH0KIAotCQlwcml2YXRlIEh0dHBXZWJSZXF1ZXN0IENyZWF0ZVJlcXVlc3QoKQotCQl7Ci0JCQlIdHRwV2ViUmVxdWVzdCBjb25uZWN0aW9uID0gKEh0dHBXZWJSZXF1ZXN0KVdlYlJlcXVlc3QuQ3JlYXRlKHVyaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sIGlveC5Ub1N0cmluZygpLCBpb3gpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJCWlmIChjb25uZWN0VGltZW91dCA+IDApCi0JCQl7Ci0JCQkJY29ubmVjdGlvbi5UaW1lb3V0ID0gY29ubmVjdFRpbWVvdXQ7Ci0JCQl9Ci0JCQlpZiAocmVhZFRpbWVvdXQgPiAwKQotCQkJewotCQkJCWNvbm5lY3Rpb24uUmVhZFdyaXRlVGltZW91dCA9IHJlYWRUaW1lb3V0OwotCQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBvdXRwdXRTdHJlYW0uV3JpdGUoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIH0KIAotCQkJLy8gTWFrZSB0aGUgcmVxdWVzdAotCQkJY29ubmVjdGlvbi5Db250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi94LXRocmlmdCI7Ci0JCQljb25uZWN0aW9uLkFjY2VwdCA9ICJhcHBsaWNhdGlvbi94LXRocmlmdCI7Ci0JCQljb25uZWN0aW9uLlVzZXJBZ2VudCA9ICJDIy9USHR0cENsaWVudCI7Ci0JCQljb25uZWN0aW9uLk1ldGhvZCA9ICJQT1NUIjsKLQkJCWNvbm5lY3Rpb24uUHJvdG9jb2xWZXJzaW9uID0gSHR0cFZlcnNpb24uVmVyc2lvbjEwOworI2lmICFTSUxWRVJMSUdIVAorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGbHVzaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNlbmRSZXF1ZXN0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJCS8vYWRkIGN1c3RvbSBoZWFkZXJzIGhlcmUKLQkJCWZvcmVhY2ggKEtleVZhbHVlUGFpcjxzdHJpbmcsIHN0cmluZz4gaXRlbSBpbiBjdXN0b21IZWFkZXJzKQotCQkJewotCQkJCWNvbm5lY3Rpb24uSGVhZGVycy5BZGQoaXRlbS5LZXksIGl0ZW0uVmFsdWUpOwotCQkJfQorICAgICAgICBwcml2YXRlIHZvaWQgU2VuZFJlcXVlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBIdHRwV2ViUmVxdWVzdCBjb25uZWN0aW9uID0gQ3JlYXRlUmVxdWVzdCgpOworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uSGVhZGVycy5BZGQoIkFjY2VwdC1FbmNvZGluZyIsICJnemlwLCBkZWZsYXRlIik7CiAKLQkJCWNvbm5lY3Rpb24uUHJveHkgPSBudWxsOworICAgICAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gb3V0cHV0U3RyZWFtLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLkNvbnRlbnRMZW5ndGggPSBkYXRhLkxlbmd0aDsKIAotCQkJcmV0dXJuIGNvbm5lY3Rpb247Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgdXNpbmcgKFN0cmVhbSByZXF1ZXN0U3RyZWFtID0gY29ubmVjdGlvbi5HZXRSZXF1ZXN0U3RyZWFtKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0U3RyZWFtLldyaXRlKGRhdGEsIDAsIGRhdGEuTGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBSZXNvbHZlIEhUVFAgaGFuZyB0aGF0IGNhbiBoYXBwZW5zIGFmdGVyIHN1Y2Nlc3NpdmUgY2FsbHMgYnkgbWFraW5nIHN1cmUKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCB3ZSByZWxlYXNlIHRoZSByZXNwb25zZSBhbmQgcmVzcG9uc2Ugc3RyZWFtLiBUbyBzdXBwb3J0IHRoaXMsIHdlIGNvcHkKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3BvbnNlIHRvIGEgbWVtb3J5IHN0cmVhbS4KKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgKHZhciByZXNwb25zZSA9IGNvbm5lY3Rpb24uR2V0UmVzcG9uc2UoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKHZhciByZXNwb25zZVN0cmVhbSA9IHJlc3BvbnNlLkdldFJlc3BvbnNlU3RyZWFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29weSB0aGUgcmVzcG9uc2UgdG8gYSBtZW1vcnkgc3RyZWFtIHNvIHRoYXQgd2UgY2FuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5seSBjbG9zZSB0aGUgcmVzcG9uc2UgYW5kIHJlc3BvbnNlIHN0cmVhbS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbODE5Ml07ICAvLyBtdWx0aXBsZSBvZiA0MDk2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzUmVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGJ5dGVzUmVhZCA9IHJlc3BvbnNlU3RyZWFtLlJlYWQoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoKSkgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uV3JpdGUoYnVmZmVyLCAwLCBieXRlc1JlYWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5TZWVrKDAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5jb2RpbmdzID0gcmVzcG9uc2UuSGVhZGVycy5HZXRWYWx1ZXMoIkNvbnRlbnQtRW5jb2RpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZ3MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZW5jb2RpbmcgaW4gZW5jb2RpbmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZ3ppcCI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb21wcmVzc0daaXBwZWQocmVmIGlucHV0U3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImRlZmxhdGUiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29tcHJlc3NEZWZsYXRlZChyZWYgaW5wdXRTdHJlYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sIGlveC5Ub1N0cmluZygpLCBpb3gpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFdlYkV4Y2VwdGlvbiB3eCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgIkNvdWxkbid0IGNvbm5lY3QgdG8gc2VydmVyOiAiICsgd3gsIHd4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBEZWNvbXByZXNzRGVmbGF0ZWQocmVmIFN0cmVhbSBpbnB1dFN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRtcCA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgZGVjb21wID0gbmV3IERlZmxhdGVTdHJlYW0oaW5wdXRTdHJlYW0sIENvbXByZXNzaW9uTW9kZS5EZWNvbXByZXNzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWNvbXAuQ29weVRvKHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IHRtcDsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtLlNlZWsoMCwgMCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgRGVjb21wcmVzc0daaXBwZWQocmVmIFN0cmVhbSBpbnB1dFN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRtcCA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgZGVjb21wID0gbmV3IEdaaXBTdHJlYW0oaW5wdXRTdHJlYW0sIENvbXByZXNzaW9uTW9kZS5EZWNvbXByZXNzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWNvbXAuQ29weVRvKHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IHRtcDsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtLlNlZWsoMCwgMCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBwcml2YXRlIEh0dHBXZWJSZXF1ZXN0IENyZWF0ZVJlcXVlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBIdHRwV2ViUmVxdWVzdCBjb25uZWN0aW9uID0gKEh0dHBXZWJSZXF1ZXN0KVdlYlJlcXVlc3QuQ3JlYXRlKHVyaSk7CisKKworI2lmICFTSUxWRVJMSUdIVAorICAgICAgICAgICAgLy8gQWRkaW5nIGNlcnRpZmljYXRlcyB0aHJvdWdoIGNvZGUgaXMgbm90IHN1cHBvcnRlZCB3aXRoIFdQNyBTaWx2ZXJsaWdodAorICAgICAgICAgICAgLy8gc2VlICJXaW5kb3dzIFBob25lIDcgYW5kIENlcnRpZmljYXRlc19GSU5BTF8xMjE2MTAucGRmIgorICAgICAgICAgICAgY29ubmVjdGlvbi5DbGllbnRDZXJ0aWZpY2F0ZXMuQWRkUmFuZ2UoY2VydGlmaWNhdGVzKTsKKworICAgICAgICAgICAgaWYgKGNvbm5lY3RUaW1lb3V0ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLlRpbWVvdXQgPSBjb25uZWN0VGltZW91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZWFkVGltZW91dCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5SZWFkV3JpdGVUaW1lb3V0ID0gcmVhZFRpbWVvdXQ7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIC8vIE1ha2UgdGhlIHJlcXVlc3QKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uQ29udGVudFR5cGUgPSAiYXBwbGljYXRpb24veC10aHJpZnQiOworICAgICAgICAgICAgY29ubmVjdGlvbi5BY2NlcHQgPSAiYXBwbGljYXRpb24veC10aHJpZnQiOworICAgICAgICAgICAgY29ubmVjdGlvbi5Vc2VyQWdlbnQgPSAiQyMvVEh0dHBDbGllbnQiOworICAgICAgICAgICAgY29ubmVjdGlvbi5NZXRob2QgPSAiUE9TVCI7CisjaWYgIVNJTFZFUkxJR0hUCisgICAgICAgICAgICBjb25uZWN0aW9uLlByb3RvY29sVmVyc2lvbiA9IEh0dHBWZXJzaW9uLlZlcnNpb24xMDsKKyNlbmRpZgorCisgICAgICAgICAgICAvL2FkZCBjdXN0b20gaGVhZGVycyBoZXJlCisgICAgICAgICAgICBmb3JlYWNoIChLZXlWYWx1ZVBhaXI8c3RyaW5nLCBzdHJpbmc+IGl0ZW0gaW4gY3VzdG9tSGVhZGVycykKKyAgICAgICAgICAgIHsKKyNpZiAhU0lMVkVSTElHSFQKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLkhlYWRlcnMuQWRkKGl0ZW0uS2V5LCBpdGVtLlZhbHVlKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5IZWFkZXJzW2l0ZW0uS2V5XSA9IGl0ZW0uVmFsdWU7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworI2lmICFTSUxWRVJMSUdIVAorICAgICAgICAgICAgY29ubmVjdGlvbi5Qcm94eSA9IHByb3h5OworI2VuZGlmCisKKyAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElBc3luY1Jlc3VsdCBCZWdpbkZsdXNoKEFzeW5jQ2FsbGJhY2sgY2FsbGJhY2ssIG9iamVjdCBzdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRXh0cmFjdCByZXF1ZXN0IGFuZCByZXNldCBidWZmZXIKKyAgICAgICAgICAgIHZhciBkYXRhID0gb3V0cHV0U3RyZWFtLlRvQXJyYXkoKTsKKworICAgICAgICAgICAgLy9yZXF1ZXN0QnVmZmVyXyA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGNvbm5lY3Rpb24gb2JqZWN0CisgICAgICAgICAgICAgICAgdmFyIGZsdXNoQXN5bmNSZXN1bHQgPSBuZXcgRmx1c2hBc3luY1Jlc3VsdChjYWxsYmFjaywgc3RhdGUpOworICAgICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuQ29ubmVjdGlvbiA9IENyZWF0ZVJlcXVlc3QoKTsKKworICAgICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuRGF0YSA9IGRhdGE7CisKKworICAgICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuQ29ubmVjdGlvbi5CZWdpbkdldFJlcXVlc3RTdHJlYW0oR2V0UmVxdWVzdFN0cmVhbUNhbGxiYWNrLCBmbHVzaEFzeW5jUmVzdWx0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmx1c2hBc3luY1Jlc3VsdDsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihpb3guVG9TdHJpbmcoKSwgaW94KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEVuZEZsdXNoKElBc3luY1Jlc3VsdCBhc3luY1Jlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGZsdXNoQXN5bmNSZXN1bHQgPSAoRmx1c2hBc3luY1Jlc3VsdClhc3luY1Jlc3VsdDsKKworICAgICAgICAgICAgICAgIGlmICghZmx1c2hBc3luY1Jlc3VsdC5Jc0NvbXBsZXRlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB3YWl0SGFuZGxlID0gZmx1c2hBc3luY1Jlc3VsdC5Bc3luY1dhaXRIYW5kbGU7CisgICAgICAgICAgICAgICAgICAgIHdhaXRIYW5kbGUuV2FpdE9uZSgpOyAgLy8gYmxvY2tpbmcgSU5GSU5JVEVseQorICAgICAgICAgICAgICAgICAgICB3YWl0SGFuZGxlLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGZsdXNoQXN5bmNSZXN1bHQuQXN5bmNFeGNlcHRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGZsdXNoQXN5bmNSZXN1bHQuQXN5bmNFeGNlcHRpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEdldFJlcXVlc3RTdHJlYW1DYWxsYmFjayhJQXN5bmNSZXN1bHQgYXN5bmNocm9ub3VzUmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZmx1c2hBc3luY1Jlc3VsdCA9IChGbHVzaEFzeW5jUmVzdWx0KWFzeW5jaHJvbm91c1Jlc3VsdC5Bc3luY1N0YXRlOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHJlcVN0cmVhbSA9IGZsdXNoQXN5bmNSZXN1bHQuQ29ubmVjdGlvbi5FbmRHZXRSZXF1ZXN0U3RyZWFtKGFzeW5jaHJvbm91c1Jlc3VsdCk7CisgICAgICAgICAgICAgICAgcmVxU3RyZWFtLldyaXRlKGZsdXNoQXN5bmNSZXN1bHQuRGF0YSwgMCwgZmx1c2hBc3luY1Jlc3VsdC5EYXRhLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgcmVxU3RyZWFtLkZsdXNoKCk7CisgICAgICAgICAgICAgICAgcmVxU3RyZWFtLkNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICAvLyBTdGFydCB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB0byBnZXQgdGhlIHJlc3BvbnNlCisgICAgICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5Db25uZWN0aW9uLkJlZ2luR2V0UmVzcG9uc2UoR2V0UmVzcG9uc2VDYWxsYmFjaywgZmx1c2hBc3luY1Jlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0LkFzeW5jRXhjZXB0aW9uID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXhjZXB0aW9uLlRvU3RyaW5nKCksIGV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5VcGRhdGVTdGF0dXNUb0NvbXBsZXRlKCk7CisgICAgICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5Ob3RpZnlDYWxsYmFja1doZW5BdmFpbGFibGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBHZXRSZXNwb25zZUNhbGxiYWNrKElBc3luY1Jlc3VsdCBhc3luY2hyb25vdXNSZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmbHVzaEFzeW5jUmVzdWx0ID0gKEZsdXNoQXN5bmNSZXN1bHQpYXN5bmNocm9ub3VzUmVzdWx0LkFzeW5jU3RhdGU7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IGZsdXNoQXN5bmNSZXN1bHQuQ29ubmVjdGlvbi5FbmRHZXRSZXNwb25zZShhc3luY2hyb25vdXNSZXN1bHQpLkdldFJlc3BvbnNlU3RyZWFtKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0LkFzeW5jRXhjZXB0aW9uID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXhjZXB0aW9uLlRvU3RyaW5nKCksIGV4Y2VwdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0LlVwZGF0ZVN0YXR1c1RvQ29tcGxldGUoKTsKKyAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuTm90aWZ5Q2FsbGJhY2tXaGVuQXZhaWxhYmxlKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBCYXNlZCBvbiBodHRwOi8vbXNtdnBzLmNvbS9ibG9ncy9sdWlzYWJyZXUvYXJjaGl2ZS8yMDA5LzA2LzE1L211bHRpdGhyZWFkaW5nLWltcGxlbWVudGluZy10aGUtaWFzeW5jcmVzdWx0LWludGVyZmFjZS5hc3B4CisgICAgICAgIGNsYXNzIEZsdXNoQXN5bmNSZXN1bHQgOiBJQXN5bmNSZXN1bHQKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBCb29sZWFuIF9pc0NvbXBsZXRlZDsKKyAgICAgICAgICAgIHByaXZhdGUgTWFudWFsUmVzZXRFdmVudCBfZXZ0OworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBBc3luY0NhbGxiYWNrIF9jYk1ldGhvZDsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb2JqZWN0IF9zdGF0ZTsKKworICAgICAgICAgICAgcHVibGljIEZsdXNoQXN5bmNSZXN1bHQoQXN5bmNDYWxsYmFjayBjYk1ldGhvZCwgb2JqZWN0IHN0YXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jYk1ldGhvZCA9IGNiTWV0aG9kOworICAgICAgICAgICAgICAgIF9zdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnRlcm5hbCBieXRlW10gRGF0YSB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBpbnRlcm5hbCBIdHRwV2ViUmVxdWVzdCBDb25uZWN0aW9uIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIGludGVybmFsIFRUcmFuc3BvcnRFeGNlcHRpb24gQXN5bmNFeGNlcHRpb24geyBnZXQ7IHNldDsgfQorCisgICAgICAgICAgICBwdWJsaWMgb2JqZWN0IEFzeW5jU3RhdGUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gX3N0YXRlOyB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgV2FpdEhhbmRsZSBBc3luY1dhaXRIYW5kbGUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gR2V0RXZ0SGFuZGxlKCk7IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBib29sIENvbXBsZXRlZFN5bmNocm9ub3VzbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBib29sIElzQ29tcGxldGVkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9pc0NvbXBsZXRlZDsgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvYmplY3QgX2xvY2tlciA9IG5ldyBvYmplY3QoKTsKKyAgICAgICAgICAgIHByaXZhdGUgTWFudWFsUmVzZXRFdmVudCBHZXRFdnRIYW5kbGUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvY2sgKF9sb2NrZXIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX2V2dCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfZXZ0ID0gbmV3IE1hbnVhbFJlc2V0RXZlbnQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChfaXNDb21wbGV0ZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9ldnQuU2V0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9ldnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnRlcm5hbCB2b2lkIFVwZGF0ZVN0YXR1c1RvQ29tcGxldGUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9pc0NvbXBsZXRlZCA9IHRydWU7IC8vMS4gc2V0IF9pc2NvbXBsZXRlZCB0byB0cnVlCisgICAgICAgICAgICAgICAgbG9jayAoX2xvY2tlcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfZXZ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9ldnQuU2V0KCk7IC8vMi4gc2V0IHRoZSBldmVudCwgd2hlbiBpdCBleGlzdHMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50ZXJuYWwgdm9pZCBOb3RpZnlDYWxsYmFja1doZW5BdmFpbGFibGUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfY2JNZXRob2QgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9jYk1ldGhvZCh0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCisgICAgICAgIHByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsKKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cEhhbmRsZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBIYW5kbGVyLmNzCmluZGV4IDdmZTc1MGQuLjQxMTVlZjkgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cEhhbmRsZXIuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RIdHRwSGFuZGxlci5jcwpAQCAtMSwxNCArMSwyOCBAQAotLy8KLS8vICBUSHR0cEhhbmRsZXIuY3MKLS8vCi0vLyAgQXV0aG9yczoKLS8vCQlGcmVkcmlrIEhlZGJlcmcgPGZoZWRiZXJnQGF2YWlsby5jb20+Ci0vLwotLy8gIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBBcGFjaGUgUHVibGljIExpY2Vuc2UKLS8vCisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqCisgKi8KIAogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLldlYjsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uSU87CiAKIHVzaW5nIFRocmlmdC5Qcm90b2NvbDsKIApAQCAtMjEsMTIgKzM1LDE1IEBACiAgICAgICAgIHByb3RlY3RlZCBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5OwogICAgICAgICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CiAKKyAgICAgICAgcHJvdGVjdGVkIGNvbnN0IHN0cmluZyBjb250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi94LXRocmlmdCI7CisgICAgICAgIHByb3RlY3RlZCBTeXN0ZW0uVGV4dC5FbmNvZGluZyBlbmNvZGluZyA9IFN5c3RlbS5UZXh0LkVuY29kaW5nLlVURjg7CisKICAgICAgICAgcHVibGljIFRIdHRwSGFuZGxlcihUUHJvY2Vzc29yIHByb2Nlc3NvcikKICAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpKQogICAgICAgICB7CiAKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBwdWJsaWMgVEh0dHBIYW5kbGVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKICAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQogICAgICAgICB7CkBAIC00MCwzNyArNTcsNDEgQEAKICAgICAgICAgICAgIHRoaXMub3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHZvaWQgUHJvY2Vzc1JlcXVlc3QoSHR0cExpc3RlbmVyQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LlJlc3BvbnNlLkNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7CisgICAgICAgICAgICBjb250ZXh0LlJlc3BvbnNlLkNvbnRlbnRFbmNvZGluZyA9IGVuY29kaW5nOworICAgICAgICAgICAgUHJvY2Vzc1JlcXVlc3QoY29udGV4dC5SZXF1ZXN0LklucHV0U3RyZWFtLCBjb250ZXh0LlJlc3BvbnNlLk91dHB1dFN0cmVhbSk7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgdm9pZCBQcm9jZXNzUmVxdWVzdChIdHRwQ29udGV4dCBjb250ZXh0KQogICAgICAgICB7Ci0gICAgICAgICAgICBjb250ZXh0LlJlc3BvbnNlLkNvbnRlbnRUeXBlID0gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IjsKLSAgICAgICAgICAgIGNvbnRleHQuUmVzcG9uc2UuQ29udGVudEVuY29kaW5nID0gU3lzdGVtLlRleHQuRW5jb2RpbmcuVVRGODsKKyAgICAgICAgICAgIGNvbnRleHQuUmVzcG9uc2UuQ29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKKyAgICAgICAgICAgIGNvbnRleHQuUmVzcG9uc2UuQ29udGVudEVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgICAgICAgICBQcm9jZXNzUmVxdWVzdChjb250ZXh0LlJlcXVlc3QuSW5wdXRTdHJlYW0sIGNvbnRleHQuUmVzcG9uc2UuT3V0cHV0U3RyZWFtKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG5ldyBUU3RyZWFtVHJhbnNwb3J0KGNvbnRleHQuUmVxdWVzdC5JbnB1dFN0cmVhbSwgY29udGV4dC5SZXNwb25zZS5PdXRwdXRTdHJlYW0pOwotCi0gICAgICAgICAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7Ci0gICAgICAgICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICBwdWJsaWMgdm9pZCBQcm9jZXNzUmVxdWVzdChTdHJlYW0gaW5wdXQsIFN0cmVhbSBvdXRwdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbmV3IFRTdHJlYW1UcmFuc3BvcnQoaW5wdXQsb3V0cHV0KTsKIAogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB2YXIgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgdmFyIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCk7CiAKLSAgICAgICAgICAgICAgICB3aGlsZSAocHJvY2Vzc29yLlByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKSB7IH0KKyAgICAgICAgICAgICAgICB3aGlsZSAocHJvY2Vzc29yLlByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBDbGllbnQgZGllZCwganVzdCBtb3ZlIG9uCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHR4KQorICAgICAgICAgICAgZmluYWxseQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGUodHgpOworICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5DbG9zZSgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGUoeCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyYW5zcG9ydC5DbG9zZSgpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGJvb2wgSXNSZXVzYWJsZQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RIdHRwVGFza0FzeW5jSGFuZGxlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cFRhc2tBc3luY0hhbmRsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ5MWYzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cFRhc2tBc3luY0hhbmRsZXIuY3MKQEAgLTAsMCArMSw5NyBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBTeXN0ZW0uV2ViOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQW4gYXN5bmMgdGFzayBiYXNlZCBIVFRQIGhhbmRsZXIgZm9yIHByb2Nlc3NpbmcgdGhyaWZ0IHNlcnZpY2VzLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFRIdHRwVGFza0FzeW5jSGFuZGxlciA6IEh0dHBUYXNrQXN5bmNIYW5kbGVyCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRBc3luY1Byb2Nlc3NvciBfcHJvY2Vzc29yOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRQcm90b2NvbEZhY3RvcnkgX2lucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRQcm90b2NvbEZhY3RvcnkgX291dHB1dFByb3RvY29sRmFjdG9yeTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUSHR0cFRhc2tBc3luY0hhbmRsZXIiLz4gY2xhc3MKKyAgICAgICAgLy8vIHVzaW5nIHRoZSA8c2VlIGNyZWY9IlRCaW5hcnlQcm90b2NvbC5GYWN0b3J5Ii8+IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgc3RyZWFtcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcm9jZXNzb3IiPlRoZSBhc3luYyBwcm9jZXNzb3IgaW1wbGVtZW50YXRpb24uPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRIdHRwVGFza0FzeW5jSGFuZGxlcihUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yKQorICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCkpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlRIdHRwVGFza0FzeW5jSGFuZGxlciIvPiBjbGFzcworICAgICAgICAvLy8gdXNpbmcgPHBhcmFtcmVmIG5hbWU9InByb3RvY29sRmFjdG9yeSIvPiBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvY2Vzc29yIj5UaGUgYXN5bmMgcHJvY2Vzc29yIGltcGxlbWVudGF0aW9uLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvdG9jb2xGYWN0b3J5Ij5UaGUgcHJvdG9jb2wgZmFjdG9yeS48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVEh0dHBUYXNrQXN5bmNIYW5kbGVyKFRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IsIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlRIdHRwVGFza0FzeW5jSGFuZGxlciIvPiBjbGFzcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcm9jZXNzb3IiPlRoZSBhc3luYyBwcm9jZXNzb3IgaW1wbGVtZW50YXRpb24uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbnB1dFByb3RvY29sRmFjdG9yeSI+VGhlIGlucHV0IHByb3RvY29sIGZhY3RvcnkuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvdXRwdXRQcm90b2NvbEZhY3RvcnkiPlRoZSBvdXRwdXQgcHJvdG9jb2wgZmFjdG9yeS48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVEh0dHBUYXNrQXN5bmNIYW5kbGVyKFRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IsIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgeworICAgICAgICAgICAgX3Byb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgICAgICAgICAgIF9pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICAgICAgX291dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFByb2Nlc3NSZXF1ZXN0QXN5bmMoSHR0cENvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUU3RyZWFtVHJhbnNwb3J0KGNvbnRleHQuUmVxdWVzdC5JbnB1dFN0cmVhbSwgY29udGV4dC5SZXNwb25zZS5PdXRwdXRTdHJlYW0pOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSBfaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB2YXIgb3V0cHV0ID0gX291dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpOworCisgICAgICAgICAgICAgICAgd2hpbGUgKGF3YWl0IF9wcm9jZXNzb3IuUHJvY2Vzc0FzeW5jKGlucHV0LCBvdXRwdXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDbGllbnQgZGllZCwganVzdCBtb3ZlIG9uCisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwM2QwODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5jcwpAQCAtMCwwICsxLDExNyBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0Cit7CisgICAgcHVibGljIGNsYXNzIFRNZW1vcnlCdWZmZXIgOiBUVHJhbnNwb3J0CisgICAgeworCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIGJ5dGVTdHJlYW07CisKKyAgICAgICAgcHVibGljIFRNZW1vcnlCdWZmZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlU3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRNZW1vcnlCdWZmZXIoYnl0ZVtdIGJ1ZikKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvKiogZG8gbm90aGluZyAqKi8KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoqIGRvIG5vdGhpbmcgKiovCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGJ5dGVTdHJlYW0uUmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVTdHJlYW0uV3JpdGUoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYnl0ZVtdIEdldEJ1ZmZlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBieXRlU3RyZWFtLlRvQXJyYXkoKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0cnVlOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBTZXJpYWxpemUoVEFic3RyYWN0QmFzZSBzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7CisgICAgICAgICAgICB2YXIgcCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodCk7CisKKyAgICAgICAgICAgIHMuV3JpdGUocCk7CisKKyAgICAgICAgICAgIHJldHVybiB0LkdldEJ1ZmZlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBUIERlU2VyaWFsaXplPFQ+KGJ5dGVbXSBidWYpIHdoZXJlIFQgOiBUQWJzdHJhY3RCYXNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFucyA9IG5ldyBUTWVtb3J5QnVmZmVyKGJ1Zik7CisgICAgICAgICAgICB2YXIgcCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnMpOworICAgICAgICAgICAgaWYgKHR5cGVvZihUQmFzZSkuSXNBc3NpZ25hYmxlRnJvbSh0eXBlb2YoVCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB0eXBlb2YoVCkuR2V0TWV0aG9kKCJSZWFkIiwgQmluZGluZ0ZsYWdzLkluc3RhbmNlIHwgQmluZGluZ0ZsYWdzLlB1YmxpYyk7CisgICAgICAgICAgICAgICAgdmFyIHQgPSBBY3RpdmF0b3IuQ3JlYXRlSW5zdGFuY2U8VD4oKTsKKyAgICAgICAgICAgICAgICBtZXRob2QuSW52b2tlKHQsIG5ldyBvYmplY3RbXSB7IHAgfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG1ldGhvZCA9IHR5cGVvZihUKS5HZXRNZXRob2QoIlJlYWQiLCBCaW5kaW5nRmxhZ3MuU3RhdGljIHwgQmluZGluZ0ZsYWdzLlB1YmxpYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChUKW1ldGhvZC5JbnZva2UobnVsbCwgbmV3IG9iamVjdFtdIHsgcCB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsKKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZVN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1ROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWE1MGFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1ROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwxMTEgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU8uUGlwZXM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAoreworICAgIHB1YmxpYyBjbGFzcyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0IDogVFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBOYW1lZFBpcGVDbGllbnRTdHJlYW0gY2xpZW50OworICAgICAgICBwcml2YXRlIHN0cmluZyBTZXJ2ZXJOYW1lOworICAgICAgICBwcml2YXRlIHN0cmluZyBQaXBlTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgQ29ubmVjdFRpbWVvdXQ7CisKKyAgICAgICAgcHVibGljIFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQoc3RyaW5nIHBpcGUsIGludCB0aW1lb3V0ID0gVGltZW91dC5JbmZpbml0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2VydmVyTmFtZSA9ICIuIjsKKyAgICAgICAgICAgIFBpcGVOYW1lID0gcGlwZTsKKyAgICAgICAgICAgIENvbm5lY3RUaW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0KHN0cmluZyBzZXJ2ZXIsIHN0cmluZyBwaXBlLCBpbnQgdGltZW91dCA9IFRpbWVvdXQuSW5maW5pdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcnZlck5hbWUgPSAoc2VydmVyICE9ICIiKSA/IHNlcnZlciA6ICIuIjsKKyAgICAgICAgICAgIFBpcGVOYW1lID0gcGlwZTsKKyAgICAgICAgICAgIENvbm5lY3RUaW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gY2xpZW50ICE9IG51bGwgJiYgY2xpZW50LklzQ29ubmVjdGVkOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKElzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuQWxyZWFkeU9wZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xpZW50ID0gbmV3IE5hbWVkUGlwZUNsaWVudFN0cmVhbShTZXJ2ZXJOYW1lLCBQaXBlTmFtZSwgUGlwZURpcmVjdGlvbi5Jbk91dCwgUGlwZU9wdGlvbnMuTm9uZSk7CisgICAgICAgICAgICBjbGllbnQuQ29ubmVjdChDb25uZWN0VGltZW91dCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbGllbnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICBjbGllbnQgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBjbGllbnQuUmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIG5lY2Vzc2FyeSwgc2VuZCB0aGUgZGF0YSBpbiBjaHVua3MKKyAgICAgICAgICAgIC8vIHRoZXJlJ3MgYSBzeXN0ZW0gbGltaXQgYXJvdW5kIDB4MTAwMDAgYnl0ZXMgdGhhdCB3ZSBoaXQgb3RoZXJ3aXNlCisgICAgICAgICAgICAvLyBNU0ROOiAiUGlwZSB3cml0ZSBvcGVyYXRpb25zIGFjcm9zcyBhIG5ldHdvcmsgYXJlIGxpbWl0ZWQgdG8gNjUsNTM1IGJ5dGVzIHBlciB3cml0ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHBpcGVzLCBzZWUgdGhlIFJlbWFya3Mgc2VjdGlvbi4iCisgICAgICAgICAgICB2YXIgbkJ5dGVzID0gTWF0aC5NaW4obGVuLCAxNSAqIDQwOTYpOyAgLy8gMTYgd291bGQgZXhjZWVkIHRoZSBsaW1pdAorICAgICAgICAgICAgd2hpbGUgKG5CeXRlcyA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LldyaXRlKGJ1Ziwgb2ZmLCBuQnl0ZXMpOworCisgICAgICAgICAgICAgICAgb2ZmICs9IG5CeXRlczsKKyAgICAgICAgICAgICAgICBsZW4gLT0gbkJ5dGVzOworICAgICAgICAgICAgICAgIG5CeXRlcyA9IE1hdGguTWluKGxlbiwgbkJ5dGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaWVudC5EaXNwb3NlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMjE1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDI5NiBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTy5QaXBlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAoreworICAgIHB1YmxpYyBjbGFzcyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhpcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgUGlwZSBvbiB0aGUgbG9jYWxob3N0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBwaXBlQWRkcmVzczsKKyAgICAgICAgcHJpdmF0ZSBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0gc3RyZWFtID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBib29sIGFzeW5jTW9kZSA9IHRydWU7CisKKyAgICAgICAgcHVibGljIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQoc3RyaW5nIHBpcGVBZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnBpcGVBZGRyZXNzID0gcGlwZUFkZHJlc3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMaXN0ZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEVuc3VyZVBpcGVJbnN0YW5jZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZGlyZWN0aW9uID0gUGlwZURpcmVjdGlvbi5Jbk91dDsKKyAgICAgICAgICAgICAgICB2YXIgbWF4Y29ubiA9IE5hbWVkUGlwZVNlcnZlclN0cmVhbS5NYXhBbGxvd2VkU2VydmVySW5zdGFuY2VzOworICAgICAgICAgICAgICAgIHZhciBtb2RlID0gUGlwZVRyYW5zbWlzc2lvbk1vZGUuQnl0ZTsKKyAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IGFzeW5jTW9kZSA/IFBpcGVPcHRpb25zLkFzeW5jaHJvbm91cyA6IFBpcGVPcHRpb25zLk5vbmU7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IElOQlVGX1NJWkUgPSA0MDk2OworICAgICAgICAgICAgICAgIGNvbnN0IGludCBPVVRCVUZfU0laRSA9IDQwOTY7CisKKyAgICAgICAgICAgICAgICAvLyBzZWN1cml0eQorICAgICAgICAgICAgICAgIHZhciBzZWN1cml0eSA9IG5ldyBQaXBlU2VjdXJpdHkoKTsKKyAgICAgICAgICAgICAgICBzZWN1cml0eS5BZGRBY2Nlc3NSdWxlKAorICAgICAgICAgICAgICAgICAgICBuZXcgUGlwZUFjY2Vzc1J1bGUoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2VjdXJpdHlJZGVudGlmaWVyKFdlbGxLbm93blNpZFR5cGUuV29ybGRTaWQsIG51bGwpLAorICAgICAgICAgICAgICAgICAgICAgICAgUGlwZUFjY2Vzc1JpZ2h0cy5SZWFkIHwgUGlwZUFjY2Vzc1JpZ2h0cy5Xcml0ZSB8IFBpcGVBY2Nlc3NSaWdodHMuU3luY2hyb25pemUgfCBQaXBlQWNjZXNzUmlnaHRzLkNyZWF0ZU5ld0luc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLlNlY3VyaXR5LkFjY2Vzc0NvbnRyb2wuQWNjZXNzQ29udHJvbFR5cGUuQWxsb3cKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0ocGlwZUFkZHJlc3MsIGRpcmVjdGlvbiwgbWF4Y29ubiwgbW9kZSwgb3B0aW9ucywgSU5CVUZfU0laRSwgT1VUQlVGX1NJWkUsIHNlY3VyaXR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKSAgLy8gTW9ubyBzdGlsbCBkb2VzIG5vdCBzdXBwb3J0IGFzeW5jLCBmYWxsYmFjayB0byBzeW5jCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoYXN5bmNNb2RlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zICY9ICh+UGlwZU9wdGlvbnMuQXN5bmNocm9ub3VzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0ocGlwZUFkZHJlc3MsIGRpcmVjdGlvbiwgbWF4Y29ubiwgbW9kZSwgb3B0aW9ucywgSU5CVUZfU0laRSwgT1VUQlVGX1NJWkUsIHNlY3VyaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jTW9kZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUVHJhbnNwb3J0IEFjY2VwdEltcGwoKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFbnN1cmVQaXBlSW5zdGFuY2UoKTsKKworICAgICAgICAgICAgICAgIGlmIChhc3luY01vZGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZXZ0ID0gbmV3IE1hbnVhbFJlc2V0RXZlbnQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb24gZU91dGVyID0gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0uQmVnaW5XYWl0Rm9yQ29ubmVjdGlvbihhc3luY1Jlc3VsdCA9PgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5FbmRXYWl0Rm9yQ29ubmVjdGlvbihhc3luY1Jlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCwgZS5NZXNzYWdlLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGV2dC5TZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSwgbnVsbCk7CisKKyAgICAgICAgICAgICAgICAgICAgZXZ0LldhaXRPbmUoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZU91dGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlT3V0ZXI7IC8vIHJldGhyb3cgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5XYWl0Rm9yQ29ubmVjdGlvbigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciB0cmFucyA9IG5ldyBTZXJ2ZXJUcmFuc3BvcnQoc3RyZWFtLGFzeW5jTW9kZSk7CisgICAgICAgICAgICAgICAgc3RyZWFtID0gbnVsbDsgIC8vIHBhc3Mgb3duZXJzaGlwIHRvIFNlcnZlclRyYW5zcG9ydAorICAgICAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENsb3NlKCk7CisgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgZS5NZXNzYWdlLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY2xhc3MgU2VydmVyVHJhbnNwb3J0IDogVFRyYW5zcG9ydAorICAgICAgICB7CisgICAgICAgICAgICBwcml2YXRlIE5hbWVkUGlwZVNlcnZlclN0cmVhbSBzdHJlYW07CisgICAgICAgICAgICBwcml2YXRlIGJvb2wgYXN5bmNNb2RlOworCisgICAgICAgICAgICBwdWJsaWMgU2VydmVyVHJhbnNwb3J0KE5hbWVkUGlwZVNlcnZlclN0cmVhbSBzdHJlYW0sIGJvb2wgYXN5bmNNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOworICAgICAgICAgICAgICAgIHRoaXMuYXN5bmNNb2RlID0gYXN5bmNNb2RlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gc3RyZWFtICE9IG51bGwgJiYgc3RyZWFtLklzQ29ubmVjdGVkOyB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0uQ2xvc2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChhc3luY01vZGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb24gZU91dGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGV2dCA9IG5ldyBNYW51YWxSZXNldEV2ZW50KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkJlZ2luUmVhZChidWYsIG9mZiwgbGVuLCBhc3luY1Jlc3VsdCA9PgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHN0cmVhbS5FbmRSZWFkKGFzeW5jUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkLCBlLk1lc3NhZ2UsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LlNldCgpOworICAgICAgICAgICAgICAgICAgICB9LCBudWxsKTsKKworICAgICAgICAgICAgICAgICAgICBldnQuV2FpdE9uZSgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChlT3V0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVPdXRlcjsgLy8gcmV0aHJvdyBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gaWYgbmVjZXNzYXJ5LCBzZW5kIHRoZSBkYXRhIGluIGNodW5rcworICAgICAgICAgICAgICAgIC8vIHRoZXJlJ3MgYSBzeXN0ZW0gbGltaXQgYXJvdW5kIDB4MTAwMDAgYnl0ZXMgdGhhdCB3ZSBoaXQgb3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgLy8gTVNETjogIlBpcGUgd3JpdGUgb3BlcmF0aW9ucyBhY3Jvc3MgYSBuZXR3b3JrIGFyZSBsaW1pdGVkIHRvIDY1LDUzNSBieXRlcyBwZXIgd3JpdGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBwaXBlcywgc2VlIHRoZSBSZW1hcmtzIHNlY3Rpb24uIgorICAgICAgICAgICAgICAgIHZhciBuQnl0ZXMgPSBNYXRoLk1pbihsZW4sIDE1ICogNDA5Nik7ICAvLyAxNiB3b3VsZCBleGNlZWQgdGhlIGxpbWl0CisgICAgICAgICAgICAgICAgd2hpbGUgKG5CeXRlcyA+IDApCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIGlmIChhc3luY01vZGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBlT3V0ZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2dCA9IG5ldyBNYW51YWxSZXNldEV2ZW50KGZhbHNlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkJlZ2luV3JpdGUoYnVmLCBvZmYsIG5CeXRlcywgYXN5bmNSZXN1bHQgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5FbmRXcml0ZShhc3luY1Jlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCwgZS5NZXNzYWdlLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LlNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSwgbnVsbCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2dC5XYWl0T25lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlT3V0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlT3V0ZXI7IC8vIHJldGhyb3cgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uV3JpdGUoYnVmLCBvZmYsIG5CeXRlcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBvZmYgKz0gbkJ5dGVzOworICAgICAgICAgICAgICAgICAgICBsZW4gLT0gbkJ5dGVzOworICAgICAgICAgICAgICAgICAgICBuQnl0ZXMgPSBNYXRoLk1pbihsZW4sIG5CeXRlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNzCmluZGV4IGZkNWM2NjIuLmQ4ZWM2MmEgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNzCkBAIC0yNywxMzYgKzI3LDE1MCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotCXB1YmxpYyBjbGFzcyBUU2VydmVyU29ja2V0IDogVFNlcnZlclRyYW5zcG9ydAotCXsKLQkJLyoqCi0JCSogVW5kZXJseWluZyBzZXJ2ZXIgd2l0aCBzb2NrZXQKLQkJKi8KLQkJcHJpdmF0ZSBUY3BMaXN0ZW5lciBzZXJ2ZXIgPSBudWxsOworICAgIHB1YmxpYyBjbGFzcyBUU2VydmVyU29ja2V0IDogVFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVW5kZXJseWluZyBzZXJ2ZXIgd2l0aCBzb2NrZXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgVGNwTGlzdGVuZXIgc2VydmVyID0gbnVsbDsKIAotCQkvKioKLQkJICogUG9ydCB0byBsaXN0ZW4gb24KLQkJICovCi0JCXByaXZhdGUgaW50IHBvcnQgPSAwOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQb3J0IHRvIGxpc3RlbiBvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBpbnQgcG9ydCA9IDA7CiAKLQkJLyoqCi0JCSAqIFRpbWVvdXQgZm9yIGNsaWVudCBzb2NrZXRzIGZyb20gYWNjZXB0Ci0JCSAqLwotCQlwcml2YXRlIGludCBjbGllbnRUaW1lb3V0ID0gMDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGltZW91dCBmb3IgY2xpZW50IHNvY2tldHMgZnJvbSBhY2NlcHQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgaW50IGNsaWVudFRpbWVvdXQgPSAwOwogCi0JCS8qKgotCQkgKiBXaGV0aGVyIG9yIG5vdCB0byB3cmFwIG5ldyBUU29ja2V0IGNvbm5lY3Rpb25zIGluIGJ1ZmZlcnMKLQkJICovCi0JCXByaXZhdGUgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMgPSBmYWxzZTsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV2hldGhlciBvciBub3QgdG8gd3JhcCBuZXcgVFNvY2tldCBjb25uZWN0aW9ucyBpbiBidWZmZXJzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzID0gZmFsc2U7CiAKLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBzZXJ2ZXIgc29ja2V0IGZyb20gdW5kZXJseWluZyBzb2NrZXQgb2JqZWN0Ci0JCSAqLwotCQlwdWJsaWMgVFNlcnZlclNvY2tldChUY3BMaXN0ZW5lciBsaXN0ZW5lcikKLQkJCTp0aGlzKGxpc3RlbmVyLCAwKQotCQl7Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBhIHNlcnZlciBzb2NrZXQgZnJvbSB1bmRlcmx5aW5nIHNvY2tldCBvYmplY3QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0KFRjcExpc3RlbmVyIGxpc3RlbmVyKQorICAgICAgICAgICAgOiB0aGlzKGxpc3RlbmVyLCAwKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQkvKioKLQkJICogQ3JlYXRlcyBhIHNlcnZlciBzb2NrZXQgZnJvbSB1bmRlcmx5aW5nIHNvY2tldCBvYmplY3QKLQkJICovCi0JCXB1YmxpYyBUU2VydmVyU29ja2V0KFRjcExpc3RlbmVyIGxpc3RlbmVyLCBpbnQgY2xpZW50VGltZW91dCkKLQkJewotCQkJdGhpcy5zZXJ2ZXIgPSBsaXN0ZW5lcjsKLQkJCXRoaXMuY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBhIHNlcnZlciBzb2NrZXQgZnJvbSB1bmRlcmx5aW5nIHNvY2tldCBvYmplY3QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0KFRjcExpc3RlbmVyIGxpc3RlbmVyLCBpbnQgY2xpZW50VGltZW91dCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5zZXJ2ZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgIH0KIAotCQkvKioKLQkJICogQ3JlYXRlcyBqdXN0IGEgcG9ydCBsaXN0ZW5pbmcgc2VydmVyIHNvY2tldAotCQkgKi8KLQkJcHVibGljIFRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpCi0JCQk6IHRoaXMocG9ydCwgMCkKLQkJewotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMganVzdCBhIHBvcnQgbGlzdGVuaW5nIHNlcnZlciBzb2NrZXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0KGludCBwb3J0KQorICAgICAgICAgICAgOiB0aGlzKHBvcnQsIDApCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCS8qKgotCQkgKiBDcmVhdGVzIGp1c3QgYSBwb3J0IGxpc3RlbmluZyBzZXJ2ZXIgc29ja2V0Ci0JCSAqLwotCQlwdWJsaWMgVFNlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQpCi0JCQk6dGhpcyhwb3J0LCBjbGllbnRUaW1lb3V0LCBmYWxzZSkKLQkJewotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMganVzdCBhIHBvcnQgbGlzdGVuaW5nIHNlcnZlciBzb2NrZXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCkKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCBjbGllbnRUaW1lb3V0LCBmYWxzZSkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIFRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBjbGllbnRUaW1lb3V0LCBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cykKLQkJewotCQkJdGhpcy5wb3J0ID0gcG9ydDsKLQkJCXRoaXMuY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7Ci0JCQl0aGlzLnVzZUJ1ZmZlcmVkU29ja2V0cyA9IHVzZUJ1ZmZlcmVkU29ja2V0czsKLQkJCXRyeQotCQkJewotCQkJCS8vIE1ha2Ugc2VydmVyIHNvY2tldAotCQkJCXNlcnZlciA9IG5ldyBUY3BMaXN0ZW5lcihTeXN0ZW0uTmV0LklQQWRkcmVzcy5BbnksIHRoaXMucG9ydCk7Ci0JCQkJc2VydmVyLlNlcnZlci5Ob0RlbGF5ID0gdHJ1ZTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24pCi0JCQl7Ci0JCQkJc2VydmVyID0gbnVsbDsKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCAiICsgcG9ydCArICIuIik7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBjbGllbnRUaW1lb3V0LCBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgICAgICB0aGlzLnVzZUJ1ZmZlcmVkU29ja2V0cyA9IHVzZUJ1ZmZlcmVkU29ja2V0czsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc2VydmVyIHNvY2tldAorICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyID0gVFNvY2tldFZlcnNpb25pemVyLkNyZWF0ZVRjcExpc3RlbmVyKHRoaXMucG9ydCk7CisgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuU2VydmVyLk5vRGVsYXkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBwb3J0ICIgKyB0aGlzLnBvcnQgKyAiLiIsIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIExpc3RlbigpCi0JCXsKLQkJCS8vIE1ha2Ugc3VyZSBub3QgdG8gYmxvY2sgb24gYWNjZXB0Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlzZXJ2ZXIuU3RhcnQoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkKLQkJCQl7Ci0JCQkJCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICIgKyBzeC5NZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgTGlzdGVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIG5vdCB0byBibG9jayBvbiBhY2NlcHQKKyAgICAgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5TdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIHN4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBhY2NlcHQgb24gbGlzdGVuaW5nIHNvY2tldDogIiArIHN4Lk1lc3NhZ2UsIHN4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwcm90ZWN0ZWQgb3ZlcnJpZGUgVFRyYW5zcG9ydCBBY2NlcHRJbXBsKCkKLQkJewotCQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJewotCQkJCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiTm8gdW5kZXJseWluZyBzZXJ2ZXIgc29ja2V0LiIpOwotCQkJfQotCQkJdHJ5Ci0JCQl7Ci0JCQkJVGNwQ2xpZW50IHJlc3VsdCA9IHNlcnZlci5BY2NlcHRUY3BDbGllbnQoKTsKLQkJCQlUU29ja2V0IHJlc3VsdDIgPSBuZXcgVFNvY2tldChyZXN1bHQpOwotCQkJCXJlc3VsdDIuVGltZW91dCA9IGNsaWVudFRpbWVvdXQ7Ci0JCQkJaWYgKHVzZUJ1ZmZlcmVkU29ja2V0cykKLQkJCQl7Ci0JCQkJCVRCdWZmZXJlZFRyYW5zcG9ydCByZXN1bHQzID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydChyZXN1bHQyKTsKLQkJCQkJcmV0dXJuIHJlc3VsdDM7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXJldHVybiByZXN1bHQyOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZXgpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguVG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRUcmFuc3BvcnQgQWNjZXB0SW1wbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzZXJ2ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRTb2NrZXQgcmVzdWx0MiA9IG51bGw7CisgICAgICAgICAgICAgICAgVGNwQ2xpZW50IHJlc3VsdCA9IHNlcnZlci5BY2NlcHRUY3BDbGllbnQoKTsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdDIgPSBuZXcgVFNvY2tldChyZXN1bHQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQyLlRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OworICAgICAgICAgICAgICAgICAgICBpZiAodXNlQnVmZmVyZWRTb2NrZXRzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBUQnVmZmVyZWRUcmFuc3BvcnQgcmVzdWx0MyA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQocmVzdWx0Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0MzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChTeXN0ZW0uRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBUU29ja2V0IHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCwgdGhlbiBsZXQKKyAgICAgICAgICAgICAgICAgICAgLy8gaXQgZG8gcHJvcGVyIGNsZWFudXAgb2YgdGhlIFRjcENsaWVudCBvYmplY3QuCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQyLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSAvLyAgT3RoZXJ3aXNlLCBjbGVhbiBpdCB1cCBvdXJzZWx2ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAoKElEaXNwb3NhYmxlKXJlc3VsdCkuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LlRvU3RyaW5nKCksIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKLQkJewotCQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJc2VydmVyLlN0b3AoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLQkJCQl7Ci0JCQkJCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJXQVJOSU5HOiBDb3VsZCBub3QgY2xvc2Ugc2VydmVyIHNvY2tldDogIiArIGV4KTsKLQkJCQl9Ci0JCQkJc2VydmVyID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2VydmVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuU3RvcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIldBUk5JTkc6IENvdWxkIG5vdCBjbG9zZSBzZXJ2ZXIgc29ja2V0OiAiICsgZXgsIGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuY3MKaW5kZXggYzk5ZDA3Zi4uZTYzODgwYiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuY3MKQEAgLTI1LDE5ICsyNSwyMCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotCXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUU2VydmVyVHJhbnNwb3J0Ci0JewotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBMaXN0ZW4oKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgQ2xvc2UoKTsKLQkJcHJvdGVjdGVkIGFic3RyYWN0IFRUcmFuc3BvcnQgQWNjZXB0SW1wbCgpOworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUU2VydmVyVHJhbnNwb3J0CisgICAgeworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBMaXN0ZW4oKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgQ2xvc2UoKTsKKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFRUcmFuc3BvcnQgQWNjZXB0SW1wbCgpOwogCi0JCXB1YmxpYyBUVHJhbnNwb3J0IEFjY2VwdCgpCi0JCXsKLQkJCVRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gQWNjZXB0SW1wbCgpOwotCQkJaWYgKHRyYW5zcG9ydCA9PSBudWxsKSB7Ci0JCQkgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJhY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMIik7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJhbnNwb3J0OwotCQkgfQotCX0KKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnQgQWNjZXB0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQgPSBBY2NlcHRJbXBsKCk7CisgICAgICAgICAgICBpZiAodHJhbnNwb3J0ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oImFjY2VwdCgpIG1heSBub3QgcmV0dXJuIE5VTEwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQ7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNpbHZlcmxpZ2h0U29ja2V0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTaWx2ZXJsaWdodFNvY2tldC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDQ2OWFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTaWx2ZXJsaWdodFNvY2tldC5jcwpAQCAtMCwwICsxLDM5MyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKy8qIG9ubHkgZm9yIHNpbHZlcmxpZ2h0ICovCisjaWYgU0lMVkVSTElHSFQKKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLk5ldC5Tb2NrZXRzOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0Cit7CisgICAgcHVibGljIGNsYXNzIFRTaWx2ZXJsaWdodFNvY2tldCA6IFRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIFNvY2tldCBzb2NrZXQgPSBudWxsOworICAgICAgICBzdGF0aWMgTWFudWFsUmVzZXRFdmVudCByZWFkQXN5bmNDb21wbGV0ZSA9IG5ldyBNYW51YWxSZXNldEV2ZW50KGZhbHNlKTsKKyAgICAgICAgcHVibGljIGV2ZW50IEV2ZW50SGFuZGxlcjxTb2NrZXRBc3luY0V2ZW50QXJncz4gY29ubmVjdEhhbmRsZXIgPSBudWxsOworCisgICAgICAgIC8vIG1lbW9yeSBzdHJlYW0gZm9yIHdyaXRlIGNhY2hlLgorICAgICAgICBwcml2YXRlIE1lbW9yeVN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgaG9zdCA9IG51bGw7CisgICAgICAgIHByaXZhdGUgaW50IHBvcnQgPSAwOworICAgICAgICBwcml2YXRlIGludCB0aW1lb3V0ID0gMDsKKworICAgICAgICAvLyBjb25zdHJ1Y3RvcgorICAgICAgICBwdWJsaWMgVFNpbHZlcmxpZ2h0U29ja2V0KHN0cmluZyBob3N0LCBpbnQgcG9ydCkKKyAgICAgICAgICAgIDogdGhpcyhob3N0LCBwb3J0LCAwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb25zdHJ1Y3RvcgorICAgICAgICBwdWJsaWMgVFNpbHZlcmxpZ2h0U29ja2V0KHN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgICAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKKworICAgICAgICAgICAgSW5pdFNvY2tldCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRTb2NrZXQoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDcmVhdGUgYSBzdHJlYW0tYmFzZWQsIFRDUCBzb2NrZXQgdXNpbmcgdGhlIEludGVyTmV0d29yayBBZGRyZXNzIEZhbWlseS4KKyAgICAgICAgICAgIHNvY2tldCA9IG5ldyBTb2NrZXQoQWRkcmVzc0ZhbWlseS5JbnRlck5ldHdvcmssIFNvY2tldFR5cGUuU3RyZWFtLCBQcm90b2NvbFR5cGUuVGNwKTsKKyAgICAgICAgICAgIHNvY2tldC5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgVGltZW91dAorICAgICAgICB7CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aW1lb3V0ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIEhvc3QKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhvc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IFBvcnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBvcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNvY2tldCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBzb2NrZXQuQ29ubmVjdGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShob3N0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIG51bGwgaG9zdCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocG9ydCA8PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzb2NrZXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbml0U29ja2V0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0aW1lb3V0ID09IDApICAgICAvLyBubyB0aW1lb3V0IC0+IGluZmluaXRlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGltZW91dCA9IDEwMDAwOyAgLy8gc2V0IGEgZGVmYXVsdCB0aW1lb3V0IGZvciBXUC4KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBEbnNFbmRQb2ludC4gVGhlIGhvc3ROYW1lIGFuZCBwb3J0IGFyZSBwYXNzZWQgaW4gdG8gdGhpcyBtZXRob2QuCisgICAgICAgICAgICAgICAgRG5zRW5kUG9pbnQgaG9zdEVudHJ5ID0gbmV3IERuc0VuZFBvaW50KHRoaXMuaG9zdCwgdGhpcy5wb3J0KTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIFNvY2tldEFzeW5jRXZlbnRBcmdzIG9iamVjdCB0byBiZSB1c2VkIGluIHRoZSBjb25uZWN0aW9uIHJlcXVlc3QKKyAgICAgICAgICAgICAgICBTb2NrZXRBc3luY0V2ZW50QXJncyBzb2NrZXRFdmVudEFyZyA9IG5ldyBTb2NrZXRBc3luY0V2ZW50QXJncygpOworICAgICAgICAgICAgICAgIHNvY2tldEV2ZW50QXJnLlJlbW90ZUVuZFBvaW50ID0gaG9zdEVudHJ5OworCisgICAgICAgICAgICAgICAgLy8gSW5saW5lIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBDb21wbGV0ZWQgZXZlbnQuCisgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhpcyBldmVudCBoYW5kbGVyIHdhcyBpbXBsZW1lbnRlZCBpbmxpbmUgaW4gb3JkZXIgdG8gbWFrZSB0aGlzIG1ldGhvZCBzZWxmLWNvbnRhaW5lZC4KKyAgICAgICAgICAgICAgICBzb2NrZXRFdmVudEFyZy5Db21wbGV0ZWQgKz0gbmV3IEV2ZW50SGFuZGxlcjxTb2NrZXRBc3luY0V2ZW50QXJncz4oZGVsZWdhdGUob2JqZWN0IHMsIFNvY2tldEFzeW5jRXZlbnRBcmdzIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdEhhbmRsZXIodGhpcywgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIC8vIE1ha2UgYW4gYXN5bmNocm9ub3VzIENvbm5lY3QgcmVxdWVzdCBvdmVyIHRoZSBzb2NrZXQKKyAgICAgICAgICAgICAgICBzb2NrZXQuQ29ubmVjdEFzeW5jKHNvY2tldEV2ZW50QXJnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIF90aW1lb3V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHN0cmluZyBfZXJyb3IgPSBudWxsOworICAgICAgICAgICAgaW50IF9yZWN2Qnl0ZXMgPSAtMTsKKworICAgICAgICAgICAgaWYgKHNvY2tldCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiU29ja2V0IGlzIG5vdCBvcGVuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBTb2NrZXRBc3luY0V2ZW50QXJncyBjb250ZXh0IG9iamVjdAorICAgICAgICAgICAgU29ja2V0QXN5bmNFdmVudEFyZ3Mgc29ja2V0RXZlbnRBcmcgPSBuZXcgU29ja2V0QXN5bmNFdmVudEFyZ3MoKTsKKyAgICAgICAgICAgIHNvY2tldEV2ZW50QXJnLlJlbW90ZUVuZFBvaW50ID0gc29ja2V0LlJlbW90ZUVuZFBvaW50OworCisgICAgICAgICAgICAvLyBTZXR1cCB0aGUgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGRhdGEKKyAgICAgICAgICAgIHNvY2tldEV2ZW50QXJnLlNldEJ1ZmZlcihidWYsIG9mZiwgbGVuKTsKKworICAgICAgICAgICAgLy8gSW5saW5lIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBDb21wbGV0ZWQgZXZlbnQuCisgICAgICAgICAgICAvLyBOb3RlOiBUaGlzIGV2ZW4gaGFuZGxlciB3YXMgaW1wbGVtZW50ZWQgaW5saW5lIGluIG9yZGVyIHRvIG1ha2UKKyAgICAgICAgICAgIC8vIHRoaXMgbWV0aG9kIHNlbGYtY29udGFpbmVkLgorICAgICAgICAgICAgc29ja2V0RXZlbnRBcmcuQ29tcGxldGVkICs9IG5ldyBFdmVudEhhbmRsZXI8U29ja2V0QXN5bmNFdmVudEFyZ3M+KGRlbGVnYXRlKG9iamVjdCBzLCBTb2NrZXRBc3luY0V2ZW50QXJncyBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF90aW1lb3V0ID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBpZiAoZS5Tb2NrZXRFcnJvciA9PSBTb2NrZXRFcnJvci5TdWNjZXNzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3JlY3ZCeXRlcyA9IGUuQnl0ZXNUcmFuc2ZlcnJlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2Vycm9yID0gZS5Tb2NrZXRFcnJvci5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJlYWRBc3luY0NvbXBsZXRlLlNldCgpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIC8vIFNldHMgdGhlIHN0YXRlIG9mIHRoZSBldmVudCB0byBub25zaWduYWxlZCwgY2F1c2luZyB0aHJlYWRzIHRvIGJsb2NrCisgICAgICAgICAgICByZWFkQXN5bmNDb21wbGV0ZS5SZXNldCgpOworCisgICAgICAgICAgICAvLyBNYWtlIGFuIGFzeW5jaHJvbm91cyBSZWNlaXZlIHJlcXVlc3Qgb3ZlciB0aGUgc29ja2V0CisgICAgICAgICAgICBzb2NrZXQuUmVjZWl2ZUFzeW5jKHNvY2tldEV2ZW50QXJnKTsKKworICAgICAgICAgICAgLy8gQmxvY2sgdGhlIFVJIHRocmVhZCBmb3IgYSBtYXhpbXVtIG9mIFRJTUVPVVRfTUlMTElTRUNPTkRTIG1pbGxpc2Vjb25kcy4KKyAgICAgICAgICAgIC8vIElmIG5vIHJlc3BvbnNlIGNvbWVzIGJhY2sgd2l0aGluIHRoaXMgdGltZSB0aGVuIHByb2NlZWQKKyAgICAgICAgICAgIHJlYWRBc3luY0NvbXBsZXRlLldhaXRPbmUodGhpcy50aW1lb3V0KTsKKworICAgICAgICAgICAgaWYgKF90aW1lb3V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5UaW1lZE91dCwgIlNvY2tldCByZWN2IHRpbWVvdXQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9lcnJvciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBfZXJyb3IpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gX3JlY3ZCeXRlczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dFN0cmVhbS5Xcml0ZShidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBiZWdpbkZsdXNoX0NvbXBsZXRlZChvYmplY3Qgc2VuZGVyLCBTb2NrZXRBc3luY0V2ZW50QXJncyBlKQorICAgICAgICB7CisgICAgICAgICAgICBGbHVzaEFzeW5jUmVzdWx0IGZsdXNoQXN5bmNSZXN1bHQgPSBlLlVzZXJUb2tlbiBhcyBGbHVzaEFzeW5jUmVzdWx0OworICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5VcGRhdGVTdGF0dXNUb0NvbXBsZXRlKCk7CisgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0Lk5vdGlmeUNhbGxiYWNrV2hlbkF2YWlsYWJsZSgpOworCisgICAgICAgICAgICBpZiAoZS5Tb2NrZXRFcnJvciAhPSBTb2NrZXRFcnJvci5TdWNjZXNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBlLlNvY2tldEVycm9yLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElBc3luY1Jlc3VsdCBCZWdpbkZsdXNoKEFzeW5jQ2FsbGJhY2sgY2FsbGJhY2ssIG9iamVjdCBzdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRXh0cmFjdCByZXF1ZXN0IGFuZCByZXNldCBidWZmZXIKKyAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gb3V0cHV0U3RyZWFtLlRvQXJyYXkoKTsKKworICAgICAgICAgICAgRmx1c2hBc3luY1Jlc3VsdCBmbHVzaEFzeW5jUmVzdWx0ID0gbmV3IEZsdXNoQXN5bmNSZXN1bHQoY2FsbGJhY2ssIHN0YXRlKTsKKworICAgICAgICAgICAgU29ja2V0QXN5bmNFdmVudEFyZ3Mgc29ja2V0RXZlbnRBcmcgPSBuZXcgU29ja2V0QXN5bmNFdmVudEFyZ3MoKTsKKyAgICAgICAgICAgIHNvY2tldEV2ZW50QXJnLlJlbW90ZUVuZFBvaW50ID0gc29ja2V0LlJlbW90ZUVuZFBvaW50OworICAgICAgICAgICAgc29ja2V0RXZlbnRBcmcuVXNlclRva2VuID0gZmx1c2hBc3luY1Jlc3VsdDsKKworICAgICAgICAgICAgc29ja2V0RXZlbnRBcmcuQ29tcGxldGVkICs9IGJlZ2luRmx1c2hfQ29tcGxldGVkOworICAgICAgICAgICAgc29ja2V0RXZlbnRBcmcuU2V0QnVmZmVyKGRhdGEsIDAsIGRhdGEuTGVuZ3RoKTsKKworICAgICAgICAgICAgc29ja2V0LlNlbmRBc3luYyhzb2NrZXRFdmVudEFyZyk7CisKKyAgICAgICAgICAgIHJldHVybiBmbHVzaEFzeW5jUmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRW5kRmx1c2goSUFzeW5jUmVzdWx0IGFzeW5jUmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZmx1c2hBc3luY1Jlc3VsdCA9IChGbHVzaEFzeW5jUmVzdWx0KWFzeW5jUmVzdWx0OworCisgICAgICAgICAgICAgICAgaWYgKCFmbHVzaEFzeW5jUmVzdWx0LklzQ29tcGxldGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHdhaXRIYW5kbGUgPSBmbHVzaEFzeW5jUmVzdWx0LkFzeW5jV2FpdEhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgd2FpdEhhbmRsZS5XYWl0T25lKCk7CisgICAgICAgICAgICAgICAgICAgIHdhaXRIYW5kbGUuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZmx1c2hBc3luY1Jlc3VsdC5Bc3luY0V4Y2VwdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmx1c2hBc3luY1Jlc3VsdC5Bc3luY0V4Y2VwdGlvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ29weSBmcm9tIGltcGwgZnJvbSBUSHR0cENsaWVudC5jcworICAgICAgICAvLyBCYXNlZCBvbiBodHRwOi8vbXNtdnBzLmNvbS9ibG9ncy9sdWlzYWJyZXUvYXJjaGl2ZS8yMDA5LzA2LzE1L211bHRpdGhyZWFkaW5nLWltcGxlbWVudGluZy10aGUtaWFzeW5jcmVzdWx0LWludGVyZmFjZS5hc3B4CisgICAgICAgIGNsYXNzIEZsdXNoQXN5bmNSZXN1bHQgOiBJQXN5bmNSZXN1bHQKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBCb29sZWFuIF9pc0NvbXBsZXRlZDsKKyAgICAgICAgICAgIHByaXZhdGUgTWFudWFsUmVzZXRFdmVudCBfZXZ0OworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBBc3luY0NhbGxiYWNrIF9jYk1ldGhvZDsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb2JqZWN0IF9zdGF0ZTsKKworICAgICAgICAgICAgcHVibGljIEZsdXNoQXN5bmNSZXN1bHQoQXN5bmNDYWxsYmFjayBjYk1ldGhvZCwgb2JqZWN0IHN0YXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jYk1ldGhvZCA9IGNiTWV0aG9kOworICAgICAgICAgICAgICAgIF9zdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnRlcm5hbCBieXRlW10gRGF0YSB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBpbnRlcm5hbCBTb2NrZXQgQ29ubmVjdGlvbiB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBpbnRlcm5hbCBUVHJhbnNwb3J0RXhjZXB0aW9uIEFzeW5jRXhjZXB0aW9uIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBBc3luY1N0YXRlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9zdGF0ZTsgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgV2FpdEhhbmRsZSBBc3luY1dhaXRIYW5kbGUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gR2V0RXZ0SGFuZGxlKCk7IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2wgQ29tcGxldGVkU3luY2hyb25vdXNseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBJc0NvbXBsZXRlZAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBfaXNDb21wbGV0ZWQ7IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvYmplY3QgX2xvY2tlciA9IG5ldyBvYmplY3QoKTsKKworICAgICAgICAgICAgcHJpdmF0ZSBNYW51YWxSZXNldEV2ZW50IEdldEV2dEhhbmRsZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9jayAoX2xvY2tlcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfZXZ0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9ldnQgPSBuZXcgTWFudWFsUmVzZXRFdmVudChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKF9pc0NvbXBsZXRlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX2V2dC5TZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2V2dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50ZXJuYWwgdm9pZCBVcGRhdGVTdGF0dXNUb0NvbXBsZXRlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfaXNDb21wbGV0ZWQgPSB0cnVlOyAvLzEuIHNldCBfaXNjb21wbGV0ZWQgdG8gdHJ1ZQorICAgICAgICAgICAgICAgIGxvY2sgKF9sb2NrZXIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX2V2dCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfZXZ0LlNldCgpOyAvLzIuIHNldCB0aGUgZXZlbnQsIHdoZW4gaXQgZXhpc3RzCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludGVybmFsIHZvaWQgTm90aWZ5Q2FsbGJhY2tXaGVuQXZhaWxhYmxlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2NiTWV0aG9kICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfY2JNZXRob2QodGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc29ja2V0ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc29ja2V0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgc29ja2V0ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCisgICAgICAgIHByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsKKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNvY2tldCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKElEaXNwb3NhYmxlKXNvY2tldCkuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisjZW5kcmVnaW9uCisgICAgfQorfQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldC5jcwppbmRleCBmZWI1NTAzLi5kOGZhMzM1IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldC5jcwpAQCAtMjYsMTI0ICsyNiwyMjAgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKIHsKLQlwdWJsaWMgY2xhc3MgVFNvY2tldCA6IFRTdHJlYW1UcmFuc3BvcnQKLQl7Ci0JCXByaXZhdGUgVGNwQ2xpZW50IGNsaWVudCA9IG51bGw7Ci0JCXByaXZhdGUgc3RyaW5nIGhvc3QgPSBudWxsOwotCQlwcml2YXRlIGludCBwb3J0ID0gMDsKLQkJcHJpdmF0ZSBpbnQgdGltZW91dCA9IDA7CisgICAgcHVibGljIGNsYXNzIFRTb2NrZXQgOiBUU3RyZWFtVHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIFRjcENsaWVudCBjbGllbnQgPSBudWxsOworICAgICAgICBwcml2YXRlIHN0cmluZyBob3N0ID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgcG9ydCA9IDA7CisgICAgICAgIHByaXZhdGUgaW50IHRpbWVvdXQgPSAwOwogCi0JCXB1YmxpYyBUU29ja2V0KFRjcENsaWVudCBjbGllbnQpCi0JCXsKLQkJCXRoaXMuY2xpZW50ID0gY2xpZW50OworICAgICAgICBwdWJsaWMgVFNvY2tldChUY3BDbGllbnQgY2xpZW50KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDsKIAotCQkJaWYgKElzT3BlbikKLQkJCXsKLQkJCQlpbnB1dFN0cmVhbSA9IGNsaWVudC5HZXRTdHJlYW0oKTsKLQkJCQlvdXRwdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIFRTb2NrZXQoc3RyaW5nIGhvc3QsIGludCBwb3J0KSA6IHRoaXMoaG9zdCwgcG9ydCwgMCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUU29ja2V0KHN0cmluZyBob3N0LCBpbnQgcG9ydCkKKyAgICAgICAgICAgIDogdGhpcyhob3N0LCBwb3J0LCAwKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFNvY2tldChzdHJpbmcgaG9zdCwgaW50IHBvcnQsIGludCB0aW1lb3V0KQotCQl7Ci0JCQl0aGlzLmhvc3QgPSBob3N0OwotCQkJdGhpcy5wb3J0ID0gcG9ydDsKLQkJCXRoaXMudGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgIHB1YmxpYyBUU29ja2V0KHN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgICAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKIAotCQkJSW5pdFNvY2tldCgpOwotCQl9CisgICAgICAgICAgICBJbml0U29ja2V0KCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgSW5pdFNvY2tldCgpCi0JCXsKLQkJCWNsaWVudCA9IG5ldyBUY3BDbGllbnQoKTsKLQkJCWNsaWVudC5SZWNlaXZlVGltZW91dCA9IGNsaWVudC5TZW5kVGltZW91dCA9IHRpbWVvdXQ7Ci0JCQljbGllbnQuQ2xpZW50Lk5vRGVsYXkgPSB0cnVlOwotCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCBJbml0U29ja2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5jbGllbnQgPSBUU29ja2V0VmVyc2lvbml6ZXIuQ3JlYXRlVGNwQ2xpZW50KCk7CisgICAgICAgICAgICB0aGlzLmNsaWVudC5SZWNlaXZlVGltZW91dCA9IGNsaWVudC5TZW5kVGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgICAgICB0aGlzLmNsaWVudC5DbGllbnQuTm9EZWxheSA9IHRydWU7CisgICAgICAgIH0KIAotCQlwdWJsaWMgaW50IFRpbWVvdXQKLQkJewotCQkJc2V0Ci0JCQl7Ci0JCQkJY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gY2xpZW50LlNlbmRUaW1lb3V0ID0gdGltZW91dCA9IHZhbHVlOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBpbnQgVGltZW91dAorICAgICAgICB7CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSBjbGllbnQuU2VuZFRpbWVvdXQgPSB0aW1lb3V0ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgVGNwQ2xpZW50IFRjcENsaWVudAotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQlyZXR1cm4gY2xpZW50OwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBUY3BDbGllbnQgVGNwQ2xpZW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgc3RyaW5nIEhvc3QKLQkJewotCQkJZ2V0Ci0JCQl7Ci0JCQkJcmV0dXJuIGhvc3Q7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIHN0cmluZyBIb3N0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBob3N0OworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIGludCBQb3J0Ci0JCXsKLQkJCWdldAotCQkJewotCQkJCXJldHVybiBwb3J0OwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBpbnQgUG9ydAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcG9ydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQlpZiAoY2xpZW50ID09IG51bGwpCi0JCQkJewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KIAotCQkJCXJldHVybiBjbGllbnQuQ29ubmVjdGVkOwotCQkJfQotCQl9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudC5Db25uZWN0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKLQkJewotCQkJaWYgKElzT3BlbikKLQkJCXsKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuQWxyZWFkeU9wZW4sICJTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQiKTsKLQkJCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkIik7CisgICAgICAgICAgICB9CiAKLQkJCWlmIChTdHJpbmcuSXNOdWxsT3JFbXB0eShob3N0KSkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIG51bGwgaG9zdCIpOwotCQkJfQorICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGhvc3QpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gbnVsbCBob3N0Iik7CisgICAgICAgICAgICB9CiAKLQkJCWlmIChwb3J0IDw9IDApCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3Qgb3BlbiB3aXRob3V0IHBvcnQiKTsKLQkJCX0KKyAgICAgICAgICAgIGlmIChwb3J0IDw9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3Qgb3BlbiB3aXRob3V0IHBvcnQiKTsKKyAgICAgICAgICAgIH0KIAotCQkJaWYgKGNsaWVudCA9PSBudWxsKQotCQkJewotCQkJCUluaXRTb2NrZXQoKTsKLQkJCX0KKyAgICAgICAgICAgIGlmIChjbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbml0U29ja2V0KCk7CisgICAgICAgICAgICB9CiAKLQkJCWNsaWVudC5Db25uZWN0KGhvc3QsIHBvcnQpOwotCQkJaW5wdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7Ci0JCQlvdXRwdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7Ci0JCX0KKyAgICAgICAgICAgIGlmICh0aW1lb3V0ID09IDApICAgICAgICAgICAgLy8gbm8gdGltZW91dCAtPiBpbmZpbml0ZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaWVudC5Db25uZWN0KGhvc3QsIHBvcnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgYSB0aW1lb3V0IC0+IHVzZSBpdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbm5lY3RIZWxwZXIgaGxwID0gbmV3IENvbm5lY3RIZWxwZXIoY2xpZW50KTsKKyAgICAgICAgICAgICAgICBJQXN5bmNSZXN1bHQgYXN5bmNyZXMgPSBjbGllbnQuQmVnaW5Db25uZWN0KGhvc3QsIHBvcnQsIG5ldyBBc3luY0NhbGxiYWNrKENvbm5lY3RDYWxsYmFjayksIGhscCk7CisgICAgICAgICAgICAgICAgYm9vbCBiQ29ubmVjdGVkID0gYXN5bmNyZXMuQXN5bmNXYWl0SGFuZGxlLldhaXRPbmUodGltZW91dCkgJiYgY2xpZW50LkNvbm5lY3RlZDsKKyAgICAgICAgICAgICAgICBpZiAoIWJDb25uZWN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2NrIChobHAuTXV0ZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChobHAuQ2FsbGJhY2tEb25lKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jcmVzLkFzeW5jV2FpdEhhbmRsZS5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhscC5Eb0NsZWFudXAgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlRpbWVkT3V0LCAiQ29ubmVjdCB0aW1lZCBvdXQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQotCQl7Ci0JCQliYXNlLkNsb3NlKCk7Ci0JCQlpZiAoY2xpZW50ICE9IG51bGwpCi0JCQl7Ci0JCQkJY2xpZW50LkNsb3NlKCk7Ci0JCQkJY2xpZW50ID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgICAgIGlucHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICB9CisKKworICAgICAgICBzdGF0aWMgdm9pZCBDb25uZWN0Q2FsbGJhY2soSUFzeW5jUmVzdWx0IGFzeW5jcmVzKQorICAgICAgICB7CisgICAgICAgICAgICBDb25uZWN0SGVscGVyIGhscCA9IGFzeW5jcmVzLkFzeW5jU3RhdGUgYXMgQ29ubmVjdEhlbHBlcjsKKyAgICAgICAgICAgIGxvY2sgKGhscC5NdXRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBobHAuQ2FsbGJhY2tEb25lID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhscC5DbGllbnQuQ2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBobHAuQ2xpZW50LkVuZENvbm5lY3QoYXN5bmNyZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2F0Y2ggdGhhdCBhd2F5CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGhscC5Eb0NsZWFudXApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNyZXMuQXN5bmNXYWl0SGFuZGxlLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikgeyB9CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChobHAuQ2xpZW50IGlzIElEaXNwb3NhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSURpc3Bvc2FibGUpaGxwLkNsaWVudCkuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pIHsgfQorICAgICAgICAgICAgICAgICAgICBobHAuQ2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIENvbm5lY3RIZWxwZXIKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIG9iamVjdCBNdXRleCA9IG5ldyBvYmplY3QoKTsKKyAgICAgICAgICAgIHB1YmxpYyBib29sIERvQ2xlYW51cCA9IGZhbHNlOworICAgICAgICAgICAgcHVibGljIGJvb2wgQ2FsbGJhY2tEb25lID0gZmFsc2U7CisgICAgICAgICAgICBwdWJsaWMgVGNwQ2xpZW50IENsaWVudDsKKyAgICAgICAgICAgIHB1YmxpYyBDb25uZWN0SGVscGVyKFRjcENsaWVudCBjbGllbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2xpZW50ID0gY2xpZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNlLkNsb3NlKCk7CisgICAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgY2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyAgICAgICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOworCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX0lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICgoSURpc3Bvc2FibGUpY2xpZW50KS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGJhc2UuRGlzcG9zZShkaXNwb3NpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXRWZXJzaW9uaXplci5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0VmVyc2lvbml6ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY0YzBlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0VmVyc2lvbml6ZXIuY3MKQEAgLTAsMCArMSw3OCBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5UZXh0OworI2lmIE5FVDQ1Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworI2VuZGlmCisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBQcm9wZXJ0eUluZm8gZm9yIHRoZSBEdWFsTW9kZSBwcm9wZXJ0eSBvZiB0aGUgU3lzdGVtLk5ldC5Tb2NrZXRzLlNvY2tldCBjbGFzcy4gVXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHNvY2tldHMgYXJlIGNhcGFibGUgb2YKKyAgICAvLy8gYXV0b21hdGljIElQdjQgYW5kIElQdjYgaGFuZGxpbmcuIElmIER1YWxNb2RlIGlzIHByZXNlbnQgdGhlIHNvY2tldHMgYXV0b21hdGljYWxseSBoYW5kbGUgSVB2NCBhbmQgSVB2NiBjb25uZWN0aW9ucy4KKyAgICAvLy8gSWYgdGhlIER1YWxNb2RlIGlzIG5vdCBhdmFpbGFibGUgdGhlIHN5c3RlbSBjb25maWd1cmF0aW9uIGRldGVybWluZXMgd2hldGhlciBJUHY0IG9yIElQdjYgaXMgdXNlZC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBUU29ja2V0VmVyc2lvbml6ZXIKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBUY3BDbGllbnQgYWNjb3JkaW5nIHRvIHRoZSBjYXBhYmlsaXRpdGVzIG9mIHRoZSB1c2VkIGZyYW1ld29yaworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgVGNwQ2xpZW50IENyZWF0ZVRjcENsaWVudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRjcENsaWVudCBjbGllbnQgPSBudWxsOworCisjaWYgTkVUNDUKKyAgICAgICAgICAgIGNsaWVudCA9IG5ldyBUY3BDbGllbnQoQWRkcmVzc0ZhbWlseS5JbnRlck5ldHdvcmtWNik7CisgICAgICAgICAgICBjbGllbnQuQ2xpZW50LkR1YWxNb2RlID0gdHJ1ZTsKKyNlbHNlCisgICAgICAgICAgICBjbGllbnQgPSBuZXcgVGNwQ2xpZW50KEFkZHJlc3NGYW1pbHkuSW50ZXJOZXR3b3JrKTsKKyNlbmRpZgorCisgICAgICAgICAgICByZXR1cm4gY2xpZW50OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBhIFRjcExpc3RlbmVyIGFjY29yZGluZyB0byB0aGUgY2FwYWJpbGl0aXRlcyBvZiB0aGUgdXNlZCBmcmFtZXdvcmsuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGludGVybmFsIHN0YXRpYyBUY3BMaXN0ZW5lciBDcmVhdGVUY3BMaXN0ZW5lcihJbnQzMiBwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICBUY3BMaXN0ZW5lciBsaXN0ZW5lciA9IG51bGw7CisKKyNpZiBORVQ0NQorICAgICAgICAgICAgbGlzdGVuZXIgPSBuZXcgVGNwTGlzdGVuZXIoU3lzdGVtLk5ldC5JUEFkZHJlc3MuSVB2NkFueSwgcG9ydCk7CisgICAgICAgICAgICBsaXN0ZW5lci5TZXJ2ZXIuRHVhbE1vZGUgPSB0cnVlOworI2Vsc2UKKworICAgICAgICAgICAgbGlzdGVuZXIgPSBuZXcgVGNwTGlzdGVuZXIoU3lzdGVtLk5ldC5JUEFkZHJlc3MuQW55LCBwb3J0KTsKKyNlbmRpZgorCisgICAgICAgICAgICByZXR1cm4gbGlzdGVuZXI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFN0cmVhbVRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzCmluZGV4IDYwYTg0MTIuLjMwNDU5OWYgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzCkBAIC0yNiw4MiArMjYsMTAzIEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CiB7Ci0JcHVibGljIGNsYXNzIFRTdHJlYW1UcmFuc3BvcnQgOiBUVHJhbnNwb3J0Ci0JewotCQlwcm90ZWN0ZWQgU3RyZWFtIGlucHV0U3RyZWFtOwotCQlwcm90ZWN0ZWQgU3RyZWFtIG91dHB1dFN0cmVhbTsKKyAgICBwdWJsaWMgY2xhc3MgVFN0cmVhbVRyYW5zcG9ydCA6IFRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBTdHJlYW0gaW5wdXRTdHJlYW07CisgICAgICAgIHByb3RlY3RlZCBTdHJlYW0gb3V0cHV0U3RyZWFtOwogCi0JCXB1YmxpYyBUU3RyZWFtVHJhbnNwb3J0KCkKLQkJewotCQl9CisgICAgICAgIHByb3RlY3RlZCBUU3RyZWFtVHJhbnNwb3J0KCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIFRTdHJlYW1UcmFuc3BvcnQoU3RyZWFtIGlucHV0U3RyZWFtLCBTdHJlYW0gb3V0cHV0U3RyZWFtKQotCQl7Ci0JCQl0aGlzLmlucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JCQl0aGlzLm91dHB1dFN0cmVhbSA9IG91dHB1dFN0cmVhbTsKLQkJfQorICAgICAgICBwdWJsaWMgVFN0cmVhbVRyYW5zcG9ydChTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmVhbSBvdXRwdXRTdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0U3RyZWFtID0gb3V0cHV0U3RyZWFtOworICAgICAgICB9CiAKLQkJcHVibGljIFN0cmVhbSBPdXRwdXRTdHJlYW0KLQkJewotCQkJZ2V0IHsgcmV0dXJuIG91dHB1dFN0cmVhbTsgfQotCQl9CisgICAgICAgIHB1YmxpYyBTdHJlYW0gT3V0cHV0U3RyZWFtCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBvdXRwdXRTdHJlYW07IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBTdHJlYW0gSW5wdXRTdHJlYW0KLQkJewotCQkJZ2V0IHsgcmV0dXJuIGlucHV0U3RyZWFtOyB9Ci0JCX0KKyAgICAgICAgcHVibGljIFN0cmVhbSBJbnB1dFN0cmVhbQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gaW5wdXRTdHJlYW07IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgotCQl7Ci0JCQlnZXQgeyByZXR1cm4gdHJ1ZTsgfQotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQotCQl7Ci0JCQlpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkKLQkJCXsKLQkJCQlpbnB1dFN0cmVhbS5DbG9zZSgpOwotCQkJCWlucHV0U3RyZWFtID0gbnVsbDsKLQkJCX0KLQkJCWlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkKLQkJCXsKLQkJCQlvdXRwdXRTdHJlYW0uQ2xvc2UoKTsKLQkJCQlvdXRwdXRTdHJlYW0gPSBudWxsOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQotCQl7Ci0JCQlpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCByZWFkIGZyb20gbnVsbCBpbnB1dHN0cmVhbSIpOwotCQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3QgcmVhZCBmcm9tIG51bGwgaW5wdXRzdHJlYW0iKTsKKyAgICAgICAgICAgIH0KIAotCQkJcmV0dXJuIGlucHV0U3RyZWFtLlJlYWQoYnVmLCBvZmYsIGxlbik7Ci0JCX0KKyAgICAgICAgICAgIHJldHVybiBpbnB1dFN0cmVhbS5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKLQkJewotCQkJaWYgKG91dHB1dFN0cmVhbSA9PSBudWxsKQotCQkJewotCQkJCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IHdyaXRlIHRvIG51bGwgb3V0cHV0c3RyZWFtIik7Ci0JCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCB3cml0ZSB0byBudWxsIG91dHB1dHN0cmVhbSIpOworICAgICAgICAgICAgfQogCi0JCQlvdXRwdXRTdHJlYW0uV3JpdGUoYnVmLCBvZmYsIGxlbik7Ci0JCX0KKyAgICAgICAgICAgIG91dHB1dFN0cmVhbS5Xcml0ZShidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKLQkJewotCQkJaWYgKG91dHB1dFN0cmVhbSA9PSBudWxsKQotCQkJewotCQkJCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IGZsdXNoIG51bGwgb3V0cHV0c3RyZWFtIik7Ci0JCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IGZsdXNoIG51bGwgb3V0cHV0c3RyZWFtIik7CisgICAgICAgICAgICB9CiAKLQkJCW91dHB1dFN0cmVhbS5GbHVzaCgpOwotCQl9Ci0JfQorICAgICAgICAgICAgb3V0cHV0U3RyZWFtLkZsdXNoKCk7CisgICAgICAgIH0KKworCisgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyAgICAgICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOworCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX0lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChJbnB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoT3V0cHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUTFNTZXJ2ZXJTb2NrZXQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRMU1NlcnZlclNvY2tldC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTZhOTdjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUTFNTZXJ2ZXJTb2NrZXQuY3MKQEAgLTAsMCArMSwyMjMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5OZXQuU2VjdXJpdHk7Cit1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQXV0aGVudGljYXRpb247Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBTU0wgU2VydmVyIFNvY2tldCBXcmFwcGVyIENsYXNzCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVFRMU1NlcnZlclNvY2tldCA6IFRTZXJ2ZXJUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVuZGVybHlpbmcgdGNwIHNlcnZlcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIFRjcExpc3RlbmVyIHNlcnZlciA9IG51bGw7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHBvcnQgd2hlcmUgdGhlIHNvY2tldCBsaXN0ZW4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBpbnQgcG9ydCA9IDA7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGltZW91dCBmb3IgdGhlIGNyZWF0ZWQgc2VydmVyIHNvY2tldAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBjbGllbnRUaW1lb3V0OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdoZXRoZXIgb3Igbm90IHRvIHdyYXAgbmV3IFRTb2NrZXQgY29ubmVjdGlvbnMgaW4gYnVmZmVycworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzID0gZmFsc2U7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHNlcnZlcmNlcnRpZmljYXRlIHdpdGggdGhlIHByaXZhdGUtIGFuZCBwdWJsaWMta2V5CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgWDUwOUNlcnRpZmljYXRlIHNlcnZlckNlcnRpZmljYXRlOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBmdW5jdGlvbiB0byB2YWxpZGF0ZSB0aGUgY2xpZW50IGNlcnRpZmljYXRlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNsaWVudENlcnRWYWxpZGF0b3I7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGljaCBjZXJ0aWZpY2F0ZSB0byB1c2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgU3NsUHJvdG9jb2xzIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvdG9jb2wgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29sczsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUVExTU2VydmVyU29ja2V0IiAvPiBjbGFzcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwb3J0Ij5UaGUgcG9ydCB3aGVyZSB0aGUgc2VydmVyIHJ1bnMuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0aWZpY2F0ZSI+VGhlIGNlcnRpZmljYXRlIG9iamVjdC48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVFRMU1NlcnZlclNvY2tldChpbnQgcG9ydCwgWDUwOUNlcnRpZmljYXRlMiBjZXJ0aWZpY2F0ZSkKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCAwLCBjZXJ0aWZpY2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVFRMU1NlcnZlclNvY2tldCIgLz4gY2xhc3MuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icG9ydCI+VGhlIHBvcnQgd2hlcmUgdGhlIHNlcnZlciBydW5zLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2xpZW50VGltZW91dCI+U2VuZC9yZWNlaXZlIHRpbWVvdXQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0aWZpY2F0ZSI+VGhlIGNlcnRpZmljYXRlIG9iamVjdC48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVFRMU1NlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQsIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUpCisgICAgICAgICAgICA6IHRoaXMocG9ydCwgY2xpZW50VGltZW91dCwgZmFsc2UsIGNlcnRpZmljYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUVExTU2VydmVyU29ja2V0IiAvPiBjbGFzcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwb3J0Ij5UaGUgcG9ydCB3aGVyZSB0aGUgc2VydmVyIHJ1bnMuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjbGllbnRUaW1lb3V0Ij5TZW5kL3JlY2VpdmUgdGltZW91dC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InVzZUJ1ZmZlcmVkU29ja2V0cyI+SWYgc2V0IHRvIDxjPnRydWU8L2M+IFt1c2UgYnVmZmVyZWQgc29ja2V0c10uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0aWZpY2F0ZSI+VGhlIGNlcnRpZmljYXRlIG9iamVjdC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNsaWVudENlcnRWYWxpZGF0b3IiPlRoZSBjZXJ0aWZpY2F0ZSB2YWxpZGF0b3IuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2siPlRoZSBjYWxsYmFjayB0byBzZWxlY3Qgd2hpY2ggY2VydGlmaWNhdGUgdG8gdXNlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3NsUHJvdG9jb2xzIj5UaGUgU3NsUHJvdG9jb2xzIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvdG9jb2wgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRUTFNTZXJ2ZXJTb2NrZXQoCisgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgIGludCBjbGllbnRUaW1lb3V0LAorICAgICAgICAgICAgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2xpZW50Q2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIC8vIFRPRE86IEVuYWJsZSBUbHMxMSBhbmQgVGxzMTIgKFRMUyAxLjEgYW5kIDEuMikgYnkgZGVmYXVsdCBvbmNlIHdlIHN0YXJ0IHVzaW5nIC5ORVQgNC41Ky4KKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWNlcnRpZmljYXRlLkhhc1ByaXZhdGVLZXkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sICJZb3VyIHNlcnZlci1jZXJ0aWZpY2F0ZSBuZWVkcyB0byBoYXZlIGEgcHJpdmF0ZSBrZXkiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgICAgICB0aGlzLnNlcnZlckNlcnRpZmljYXRlID0gY2VydGlmaWNhdGU7CisgICAgICAgICAgICB0aGlzLnVzZUJ1ZmZlcmVkU29ja2V0cyA9IHVzZUJ1ZmZlcmVkU29ja2V0czsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50Q2VydFZhbGlkYXRvciA9IGNsaWVudENlcnRWYWxpZGF0b3I7CisgICAgICAgICAgICB0aGlzLmxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgICAgIHRoaXMuc3NsUHJvdG9jb2xzID0gc3NsUHJvdG9jb2xzOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHNlcnZlciBzb2NrZXQKKyAgICAgICAgICAgICAgICB0aGlzLnNlcnZlciA9IFRTb2NrZXRWZXJzaW9uaXplci5DcmVhdGVUY3BMaXN0ZW5lcih0aGlzLnBvcnQpOworICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLlNlcnZlci5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCAiICsgdGhpcy5wb3J0ICsgIi4iLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTdGFydHMgdGhlIHNlcnZlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgTGlzdGVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGFjY2VwdCBpcyBub3QgYmxvY2tpbmcKKyAgICAgICAgICAgIGlmICh0aGlzLnNlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICIgKyBzeC5NZXNzYWdlLCBzeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2FsbGJhY2sgZm9yIEFjY2VwdCBJbXBsZW1lbnRhdGlvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+CisgICAgICAgIC8vLyBUVHJhbnNwb3J0LW9iamVjdC4KKyAgICAgICAgLy8vIDwvcmV0dXJucz4KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRUcmFuc3BvcnQgQWNjZXB0SW1wbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0aGlzLnNlcnZlciA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiTm8gdW5kZXJseWluZyBzZXJ2ZXIgc29ja2V0LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUY3BDbGllbnQgY2xpZW50ID0gdGhpcy5zZXJ2ZXIuQWNjZXB0VGNwQ2xpZW50KCk7CisgICAgICAgICAgICAgICAgY2xpZW50LlNlbmRUaW1lb3V0ID0gY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gdGhpcy5jbGllbnRUaW1lb3V0OworCisgICAgICAgICAgICAgICAgLy93cmFwIHRoZSBjbGllbnQgaW4gYW4gU1NMIFNvY2tldCBwYXNzaW5nIGluIHRoZSBTU0wgY2VydAorICAgICAgICAgICAgICAgIFRUTFNTb2NrZXQgc29ja2V0ID0gbmV3IFRUTFNTb2NrZXQoCisgICAgICAgICAgICAgICAgICAgIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXJDZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGllbnRDZXJ0VmFsaWRhdG9yLAorICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5zc2xQcm90b2NvbHMpOworCisgICAgICAgICAgICAgICAgc29ja2V0LnNldHVwVExTKCk7CisKKyAgICAgICAgICAgICAgICBpZiAodXNlQnVmZmVyZWRTb2NrZXRzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVEJ1ZmZlcmVkVHJhbnNwb3J0IHRyYW5zID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb2NrZXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LlRvU3RyaW5nKCksIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFN0b3BzIHRoZSBTZXJ2ZXIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGhpcy5zZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLlN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJXQVJOSU5HOiBDb3VsZCBub3QgY2xvc2Ugc2VydmVyIHNvY2tldDogIiArIGV4LCBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVExTU29ja2V0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUTFNTb2NrZXQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQwMTljMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVExTU29ja2V0LmNzCkBAIC0wLDAgKzEsMzcxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTmV0LlNlY3VyaXR5OwordXNpbmcgU3lzdGVtLk5ldC5Tb2NrZXRzOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkF1dGhlbnRpY2F0aW9uOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU1NMIFNvY2tldCBXcmFwcGVyIGNsYXNzCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVFRMU1NvY2tldCA6IFRTdHJlYW1UcmFuc3BvcnQKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEludGVybmFsIFRDUCBDbGllbnQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBUY3BDbGllbnQgY2xpZW50OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBob3N0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgc3RyaW5nIGhvc3Q7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHBvcnQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBpbnQgcG9ydDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgdGltZW91dCBmb3IgdGhlIGNvbm5lY3Rpb24KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBpbnQgdGltZW91dDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbnRlcm5hbCBTU0wgU3RyZWFtIGZvciBJTworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIFNzbFN0cmVhbSBzZWN1cmVTdHJlYW07CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRGVmaW5lcyB3aGV0ZXIgb3Igbm90IHRoaXMgc29ja2V0IGlzIGEgc2VydmVyIHNvY2tldDxici8+CisgICAgICAgIC8vLyBUaGlzIGlzIHVzZWQgZm9yIHRoZSBUTFMtYXV0aGVudGljYXRpb24KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBib29sIGlzU2VydmVyOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBjZXJ0aWZpY2F0ZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVc2VyIGRlZmluZWQgY2VydGlmaWNhdGUgdmFsaWRhdG9yLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3I7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGljaCBjZXJ0aWZpY2F0ZSB0byB1c2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgU3NsUHJvdG9jb2xzIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvdG9jb2wgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uU1NMIHByb3RvY29scyB0byBiZSB1c2VkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFNzbFByb3RvY29scyBzc2xQcm90b2NvbHM7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVFRMU1NvY2tldCIvPiBjbGFzcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjbGllbnQiPkFuIGFscmVhZHkgY3JlYXRlZCBUQ1AtY2xpZW50PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0aWZpY2F0ZSI+VGhlIGNlcnRpZmljYXRlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXNTZXJ2ZXIiPmlmIHNldCB0byA8Yz50cnVlPC9jPiBbaXMgc2VydmVyXS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRWYWxpZGF0b3IiPlVzZXIgZGVmaW5lZCBjZXJ0IHZhbGlkYXRvci48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayI+VGhlIGNhbGxiYWNrIHRvIHNlbGVjdCB3aGljaCBjZXJ0aWZpY2F0ZSB0byB1c2UuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzc2xQcm90b2NvbHMiPlRoZSBTc2xQcm90b2NvbHMgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBwcm90b2NvbCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVFRMU1NvY2tldCgKKyAgICAgICAgICAgIFRjcENsaWVudCBjbGllbnQsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBib29sIGlzU2VydmVyID0gZmFsc2UsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgLy8gVE9ETzogRW5hYmxlIFRsczExIGFuZCBUbHMxMiAoVExTIDEuMSBhbmQgMS4yKSBieSBkZWZhdWx0IG9uY2Ugd2Ugc3RhcnQgdXNpbmcgLk5FVCA0LjUrLgorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50OworICAgICAgICAgICAgdGhpcy5jZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOworICAgICAgICAgICAgdGhpcy5jZXJ0VmFsaWRhdG9yID0gY2VydFZhbGlkYXRvcjsKKyAgICAgICAgICAgIHRoaXMubG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworICAgICAgICAgICAgdGhpcy5zc2xQcm90b2NvbHMgPSBzc2xQcm90b2NvbHM7CisgICAgICAgICAgICB0aGlzLmlzU2VydmVyID0gaXNTZXJ2ZXI7CisgICAgICAgICAgICBpZiAoaXNTZXJ2ZXIgJiYgY2VydGlmaWNhdGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIlRUTFNTb2NrZXQgbmVlZHMgY2VydGlmaWNhdGUgdG8gYmUgdXNlZCBmb3Igc2VydmVyIiwgImNlcnRpZmljYXRlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmFzZS5pbnB1dFN0cmVhbSA9IGNsaWVudC5HZXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBiYXNlLm91dHB1dFN0cmVhbSA9IGNsaWVudC5HZXRTdHJlYW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlRUTFNTb2NrZXQiLz4gY2xhc3MuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaG9zdCI+VGhlIGhvc3QsIHdoZXJlIHRoZSBzb2NrZXQgc2hvdWxkIGNvbm5lY3QgdG8uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwb3J0Ij5UaGUgcG9ydC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRpZmljYXRlUGF0aCI+VGhlIGNlcnRpZmljYXRlIHBhdGguPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0VmFsaWRhdG9yIj5Vc2VyIGRlZmluZWQgY2VydCB2YWxpZGF0b3IuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2siPlRoZSBjYWxsYmFjayB0byBzZWxlY3Qgd2hpY2ggY2VydGlmaWNhdGUgdG8gdXNlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3NsUHJvdG9jb2xzIj5UaGUgU3NsUHJvdG9jb2xzIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvdG9jb2wgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRUTFNTb2NrZXQoCisgICAgICAgICAgICBzdHJpbmcgaG9zdCwKKyAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgc3RyaW5nIGNlcnRpZmljYXRlUGF0aCwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRscykKKyAgICAgICAgICAgIDogdGhpcyhob3N0LCBwb3J0LCAwLCBYNTA5Q2VydGlmaWNhdGUuQ3JlYXRlRnJvbUNlcnRGaWxlKGNlcnRpZmljYXRlUGF0aCksIGNlcnRWYWxpZGF0b3IsIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaywgc3NsUHJvdG9jb2xzKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUVExTU29ja2V0Ii8+IGNsYXNzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Imhvc3QiPlRoZSBob3N0LCB3aGVyZSB0aGUgc29ja2V0IHNob3VsZCBjb25uZWN0IHRvLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icG9ydCI+VGhlIHBvcnQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0aWZpY2F0ZSI+VGhlIGNlcnRpZmljYXRlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydFZhbGlkYXRvciI+VXNlciBkZWZpbmVkIGNlcnQgdmFsaWRhdG9yLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIj5UaGUgY2FsbGJhY2sgdG8gc2VsZWN0IHdoaWNoIGNlcnRpZmljYXRlIHRvIHVzZS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNzbFByb3RvY29scyI+VGhlIFNzbFByb3RvY29scyB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIHByb3RvY29sIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUVExTU29ja2V0KAorICAgICAgICAgICAgc3RyaW5nIGhvc3QsCisgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSA9IG51bGwsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMpCisgICAgICAgICAgICA6IHRoaXMoaG9zdCwgcG9ydCwgMCwgY2VydGlmaWNhdGUsIGNlcnRWYWxpZGF0b3IsIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaywgc3NsUHJvdG9jb2xzKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUVExTU29ja2V0Ii8+IGNsYXNzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Imhvc3QiPlRoZSBob3N0LCB3aGVyZSB0aGUgc29ja2V0IHNob3VsZCBjb25uZWN0IHRvLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icG9ydCI+VGhlIHBvcnQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0aW1lb3V0Ij5UaGUgdGltZW91dC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRpZmljYXRlIj5UaGUgY2VydGlmaWNhdGUuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0VmFsaWRhdG9yIj5Vc2VyIGRlZmluZWQgY2VydCB2YWxpZGF0b3IuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2siPlRoZSBjYWxsYmFjayB0byBzZWxlY3Qgd2hpY2ggY2VydGlmaWNhdGUgdG8gdXNlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3NsUHJvdG9jb2xzIj5UaGUgU3NsUHJvdG9jb2xzIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvdG9jb2wgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRUTFNTb2NrZXQoCisgICAgICAgICAgICBzdHJpbmcgaG9zdCwKKyAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgaW50IHRpbWVvdXQsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgICAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgICAgIHRoaXMuY2VydGlmaWNhdGUgPSBjZXJ0aWZpY2F0ZTsKKyAgICAgICAgICAgIHRoaXMuY2VydFZhbGlkYXRvciA9IGNlcnRWYWxpZGF0b3I7CisgICAgICAgICAgICB0aGlzLmxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgICAgIHRoaXMuc3NsUHJvdG9jb2xzID0gc3NsUHJvdG9jb2xzOworCisgICAgICAgICAgICBJbml0U29ja2V0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIHRoZSBUY3BDbGllbnQgYW5kIHNldHMgdGhlIHRpbWVvdXRzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBJbml0U29ja2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpZW50ID0gVFNvY2tldFZlcnNpb25pemVyLkNyZWF0ZVRjcENsaWVudCgpOworICAgICAgICAgICAgY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gY2xpZW50LlNlbmRUaW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgICAgIGNsaWVudC5DbGllbnQuTm9EZWxheSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZXRzIFNlbmQgLyBSZWN2IFRpbWVvdXQgZm9yIElPCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgVGltZW91dAorICAgICAgICB7CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNsaWVudC5SZWNlaXZlVGltZW91dCA9IHRoaXMuY2xpZW50LlNlbmRUaW1lb3V0ID0gdGhpcy50aW1lb3V0ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIHRoZSBUQ1AgY2xpZW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgVGNwQ2xpZW50IFRjcENsaWVudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cyB0aGUgaG9zdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBIb3N0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBob3N0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cyB0aGUgcG9ydC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBQb3J0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBwb3J0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBUQ1AgQ2xpZW50IGlzIENwZW4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLmNsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5Db25uZWN0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBWYWxpZGF0ZXMgdGhlIGNlcnRpZmljYXRlcyE8YnIvPgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNlbmRlciI+VGhlIHNlbmRlci1vYmplY3QuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0aWZpY2F0ZSI+VGhlIHVzZWQgY2VydGlmaWNhdGUuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjaGFpbiI+VGhlIGNlcnRpZmljYXRlIGNoYWluLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3NsVmFsaWRhdGlvbkVycm9ycyI+QW4gZW51bSwgd2hpY2ggbGlzdHMgYWxsIHRoZSBlcnJvcnMgZnJvbSB0aGUgLk5FVCBjZXJ0aWZpY2F0ZSBjaGVjay48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwcml2YXRlIGJvb2wgRGVmYXVsdENlcnRpZmljYXRlVmFsaWRhdG9yKG9iamVjdCBzZW5kZXIsIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSwgWDUwOUNoYWluIGNoYWluLCBTc2xQb2xpY3lFcnJvcnMgc3NsVmFsaWRhdGlvbkVycm9ycykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChzc2xWYWxpZGF0aW9uRXJyb3JzID09IFNzbFBvbGljeUVycm9ycy5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbm5lY3RzIHRvIHRoZSBob3N0IGFuZCBzdGFydHMgdGhlIHJvdXRpbmUsIHdoaWNoIHNldHMgdXAgdGhlIFRMUworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKElzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuQWxyZWFkeU9wZW4sICJTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGhvc3QpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gbnVsbCBob3N0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwb3J0IDw9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3Qgb3BlbiB3aXRob3V0IHBvcnQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluaXRTb2NrZXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpZW50LkNvbm5lY3QoaG9zdCwgcG9ydCk7CisKKyAgICAgICAgICAgIHNldHVwVExTKCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIGEgVExTLXN0cmVhbSBhbmQgbGF5cyBpdCBvdmVyIHRoZSBleGlzdGluZyBzb2NrZXQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHZvaWQgc2V0dXBUTFMoKQorICAgICAgICB7CisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayB2YWxpZGF0b3IgPSB0aGlzLmNlcnRWYWxpZGF0b3IgPz8gRGVmYXVsdENlcnRpZmljYXRlVmFsaWRhdG9yOworCisgICAgICAgICAgICBpZiAodGhpcy5sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnNlY3VyZVN0cmVhbSA9IG5ldyBTc2xTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50LkdldFN0cmVhbSgpLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLAorICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaworICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5zZWN1cmVTdHJlYW0gPSBuZXcgU3NsU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudC5HZXRTdHJlYW0oKSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcgorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpc1NlcnZlcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNlcnZlciBhdXRoZW50aWNhdGlvbgorICAgICAgICAgICAgICAgICAgICB0aGlzLnNlY3VyZVN0cmVhbS5BdXRoZW50aWNhdGVBc1NlcnZlcih0aGlzLmNlcnRpZmljYXRlLCB0aGlzLmNlcnRWYWxpZGF0b3IgIT0gbnVsbCwgc3NsUHJvdG9jb2xzLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xpZW50IGF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24gY2VydHMgPSBjZXJ0aWZpY2F0ZSAhPSBudWxsID8gbmV3IFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24geyBjZXJ0aWZpY2F0ZSB9IDogbmV3IFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWN1cmVTdHJlYW0uQXV0aGVudGljYXRlQXNDbGllbnQoaG9zdCwgY2VydHMsIHNzbFByb3RvY29scywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlucHV0U3RyZWFtID0gdGhpcy5zZWN1cmVTdHJlYW07CisgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSB0aGlzLnNlY3VyZVN0cmVhbTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENsb3NlcyB0aGUgU1NMIFNvY2tldAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2UuQ2xvc2UoKTsKKyAgICAgICAgICAgIGlmICh0aGlzLmNsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgdGhpcy5jbGllbnQgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGhpcy5zZWN1cmVTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnNlY3VyZVN0cmVhbS5DbG9zZSgpOworICAgICAgICAgICAgICAgIHRoaXMuc2VjdXJlU3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnQuY3MKaW5kZXggY2VjZGU4Ny4uNWU0YWMyMiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnQuY3MKQEAgLTIyLDU0ICsyMiwxMjUgQEAKICAqLwogCiB1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87CiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CiB7Ci0JcHVibGljIGFic3RyYWN0IGNsYXNzIFRUcmFuc3BvcnQKLQl7Ci0JCXB1YmxpYyBhYnN0cmFjdCBib29sIElzT3BlbgotCQl7Ci0JCQlnZXQ7Ci0JCX0KKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFRyYW5zcG9ydCA6IElEaXNwb3NhYmxlCisgICAgeworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CiAKLQkJcHVibGljIGJvb2wgUGVlaygpCi0JCXsKLQkJCXJldHVybiBJc09wZW47Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gX3BlZWtCdWZmZXIgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9oYXNQZWVrQnl0ZTsKIAotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBPcGVuKCk7CisgICAgICAgIHB1YmxpYyBib29sIFBlZWsoKQorICAgICAgICB7CisgICAgICAgICAgICAvL0lmIHdlIGFscmVhZHkgaGF2ZSBhIGJ5dGUgcmVhZCBidXQgbm90IGNvbnN1bWVkLCBkbyBub3RoaW5nLgorICAgICAgICAgICAgaWYgKF9oYXNQZWVrQnl0ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKIAotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBDbG9zZSgpOworICAgICAgICAgICAgLy9JZiB0cmFuc3BvcnQgY2xvc2VkIHdlIGNhbid0IHBlZWsuCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLQkJcHVibGljIGFic3RyYWN0IGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pOworICAgICAgICAgICAgLy9UcnkgdG8gcmVhZCBvbmUgYnl0ZS4gSWYgc3VjY2VlZHMgd2Ugd2lsbCBuZWVkIHRvIHN0b3JlIGl0IGZvciB0aGUgbmV4dCByZWFkLgorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGJ5dGVzID0gUmVhZChfcGVla0J1ZmZlciwgMCwgMSk7CisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CiAKLQkJcHVibGljIGludCBSZWFkQWxsKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCi0JCXsKLQkJCWludCBnb3QgPSAwOwotCQkJaW50IHJldCA9IDA7CisgICAgICAgICAgICBfaGFzUGVla0J5dGUgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KIAotCQkJd2hpbGUgKGdvdCA8IGxlbikKLQkJCXsKLQkJCQlyZXQgPSBSZWFkKGJ1Ziwgb2ZmICsgZ290LCBsZW4gLSBnb3QpOwotCQkJCWlmIChyZXQgPD0gMCkKLQkJCQl7Ci0JCQkJCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDYW5ub3QgcmVhZCwgUmVtb3RlIHNpZGUgaGFzIGNsb3NlZCIpOwotCQkJCX0KLQkJCQlnb3QgKz0gcmV0OwotCQkJfQorICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBPcGVuKCk7CiAKLQkJCXJldHVybiBnb3Q7Ci0JCX0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgQ2xvc2UoKTsKIAotCQlwdWJsaWMgdmlydHVhbCB2b2lkIFdyaXRlKGJ5dGVbXSBidWYpIAotCQl7Ci0JCQlXcml0ZSAoYnVmLCAwLCBidWYuTGVuZ3RoKTsKLQkJfQorICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgVmFsaWRhdGVCdWZmZXJBcmdzKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChidWYgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJidWYiKTsKKyAgICAgICAgICAgIGlmIChvZmYgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIkJ1ZmZlciBvZmZzZXQgaXMgc21hbGxlciB0aGFuIHplcm8uIik7CisgICAgICAgICAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJCdWZmZXIgbGVuZ3RoIGlzIHNtYWxsZXIgdGhhbiB6ZXJvLiIpOworICAgICAgICAgICAgaWYgKG9mZiArIGxlbiA+IGJ1Zi5MZW5ndGgpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiTm90IGVub3VnaCBkYXRhLiIpOworICAgICAgICB9CiAKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbik7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKTsKIAotCQlwdWJsaWMgdmlydHVhbCB2b2lkIEZsdXNoKCkKLQkJewotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgaW50IFJlYWRBbGwoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgaW50IGdvdCA9IDA7CisKKyAgICAgICAgICAgIC8vSWYgd2UgcHJldmlvdXNseSBwZWVrZWQgYSBieXRlLCB3ZSBuZWVkIHRvIHVzZSB0aGF0IGZpcnN0LgorICAgICAgICAgICAgaWYgKF9oYXNQZWVrQnl0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWZbb2ZmICsgZ290KytdID0gX3BlZWtCdWZmZXJbMF07CisgICAgICAgICAgICAgICAgX2hhc1BlZWtCeXRlID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlIChnb3QgPCBsZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHJldCA9IFJlYWQoYnVmLCBvZmYgKyBnb3QsIGxlbiAtIGdvdCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuRW5kT2ZGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkLCBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdvdCArPSByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZ290OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBXcml0ZShieXRlW10gYnVmKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZShidWYsIDAsIGJ1Zi5MZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBGbHVzaCgpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElBc3luY1Jlc3VsdCBCZWdpbkZsdXNoKEFzeW5jQ2FsbGJhY2sgY2FsbGJhY2ssIG9iamVjdCBzdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sCisgICAgICAgICAgICAgICAgIkFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgdHJhbnNwb3J0LiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFbmRGbHVzaChJQXN5bmNSZXN1bHQgYXN5bmNSZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLAorICAgICAgICAgICAgICAgICJBc3luY2hyb25vdXMgb3BlcmF0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIHRyYW5zcG9ydC4iKTsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZyk7CisKKyAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIERvIG5vdCBjaGFuZ2UgdGhpcyBjb2RlLiAgUHV0IGNsZWFudXAgY29kZSBpbiBEaXNwb3NlKEJ5VmFsIGRpc3Bvc2luZyBBcyBCb29sZWFuKSBhYm92ZS4KKyAgICAgICAgICAgIERpc3Bvc2UodHJ1ZSk7CisgICAgICAgICAgICBHQy5TdXBwcmVzc0ZpbmFsaXplKHRoaXMpOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzCmluZGV4IGI5NmY3ZTguLjdmNmNjMTggMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzCkBAIC0yNSw0NCArMjUsNDUgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKIHsKLQlwdWJsaWMgY2xhc3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiA6IEV4Y2VwdGlvbgotCXsKLQkJcHJvdGVjdGVkIEV4Y2VwdGlvblR5cGUgdHlwZTsKKyAgICBwdWJsaWMgY2xhc3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBFeGNlcHRpb25UeXBlIHR5cGU7CiAKLQkJcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oKQotCQkJOiBiYXNlKCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKCkKKyAgICAgICAgICAgIDogYmFzZSgpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSkKLQkJCTogdGhpcygpCi0JCXsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCX0KKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlKQorICAgICAgICAgICAgOiB0aGlzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSwgc3RyaW5nIG1lc3NhZ2UpCi0JCQk6IGJhc2UobWVzc2FnZSkKLQkJewotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJfQorICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihFeGNlcHRpb25UeXBlIHR5cGUsIHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXIgPSBudWxsKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB9CiAKLQkJcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpCi0JCQk6IGJhc2UobWVzc2FnZSkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXIgPSBudWxsKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgRXhjZXB0aW9uVHlwZSBUeXBlCi0JCXsKLQkJCWdldCB7IHJldHVybiB0eXBlOyB9Ci0JCX0KKyAgICAgICAgcHVibGljIEV4Y2VwdGlvblR5cGUgVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdHlwZTsgfQorICAgICAgICB9CiAKLQkJcHVibGljIGVudW0gRXhjZXB0aW9uVHlwZQotCQl7Ci0JCQlVbmtub3duLAotCQkJTm90T3BlbiwKLQkJCUFscmVhZHlPcGVuLAotCQkJVGltZWRPdXQsCi0JCQlFbmRPZkZpbGUKLQkJfQotCX0KKyAgICAgICAgcHVibGljIGVudW0gRXhjZXB0aW9uVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBVbmtub3duLAorICAgICAgICAgICAgTm90T3BlbiwKKyAgICAgICAgICAgIEFscmVhZHlPcGVuLAorICAgICAgICAgICAgVGltZWRPdXQsCisgICAgICAgICAgICBFbmRPZkZpbGUsCisgICAgICAgICAgICBJbnRlcnJ1cHRlZAorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5LmNzCmluZGV4IDhmNGYxNWQuLjQ3YTBjNjIgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkuY3MKQEAgLTI1LDE4ICsyNSwxOCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotCS8vLyA8c3VtbWFyeT4KLQkvLy8gRnJvbSBNYXJrIFNsZWUgJiBBZGl0eWEgQWdhcndhbCBvZiBGYWNlYm9vazoKLQkvLy8gRmFjdG9yeSBjbGFzcyB1c2VkIHRvIGNyZWF0ZSB3cmFwcGVkIGluc3RhbmNlIG9mIFRyYW5zcG9ydHMuCi0JLy8vIFRoaXMgaXMgdXNlZCBwcmltYXJpbHkgaW4gc2VydmVycywgd2hpY2ggZ2V0IFRyYW5zcG9ydHMgZnJvbQotCS8vLyBhIFNlcnZlclRyYW5zcG9ydCBhbmQgdGhlbiBtYXkgd2FudCB0byBtdXRhdGUgdGhlbSAoaS5lLiBjcmVhdGUKLQkvLy8gYSBCdWZmZXJlZFRyYW5zcG9ydCBmcm9tIHRoZSB1bmRlcmx5aW5nIGJhc2UgdHJhbnNwb3J0KQotCS8vLyA8L3N1bW1hcnk+Ci0JcHVibGljIGNsYXNzIFRUcmFuc3BvcnRGYWN0b3J5Ci0JewotCQlwdWJsaWMgdmlydHVhbCBUVHJhbnNwb3J0IEdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zKQotCQl7Ci0JCQlyZXR1cm4gdHJhbnM7Ci0JCX0KLQl9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBGcm9tIE1hcmsgU2xlZSAmYW1wOyBBZGl0eWEgQWdhcndhbCBvZiBGYWNlYm9vazoKKyAgICAvLy8gRmFjdG9yeSBjbGFzcyB1c2VkIHRvIGNyZWF0ZSB3cmFwcGVkIGluc3RhbmNlIG9mIFRyYW5zcG9ydHMuCisgICAgLy8vIFRoaXMgaXMgdXNlZCBwcmltYXJpbHkgaW4gc2VydmVycywgd2hpY2ggZ2V0IFRyYW5zcG9ydHMgZnJvbQorICAgIC8vLyBhIFNlcnZlclRyYW5zcG9ydCBhbmQgdGhlbiBtYXkgd2FudCB0byBtdXRhdGUgdGhlbSAoaS5lLiBjcmVhdGUKKyAgICAvLy8gYSBCdWZmZXJlZFRyYW5zcG9ydCBmcm9tIHRoZSB1bmRlcmx5aW5nIGJhc2UgdHJhbnNwb3J0KQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFRUcmFuc3BvcnRGYWN0b3J5CisgICAgeworICAgICAgICBwdWJsaWMgdmlydHVhbCBUVHJhbnNwb3J0IEdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJhbnM7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvSlNPTi9KU09OVGVzdC5jc3Byb2ogYi9saWIvY3NoYXJwL3Rlc3QvSlNPTi9KU09OVGVzdC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA3ZDQzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9KU09OL0pTT05UZXN0LmNzcHJvagpAQCAtMCwwICsxLDg1IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj54ODY8L1BsYXRmb3JtPgorICAgIDxQcm9kdWN0VmVyc2lvbj44LjAuMzA3MDM8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KKyAgICA8UHJvamVjdEd1aWQ+e0UzN0EwMDM0LURDQkYtNDg4Ni1BMERBLTI1QTAzRDEyRDk3NX08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+SlNPTlRlc3Q8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5KU09OVGVzdDwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPFRhcmdldEZyYW1ld29ya1Byb2ZpbGU+CisgICAgPC9UYXJnZXRGcmFtZXdvcmtQcm9maWxlPgorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfHg4NicgIj4KKyAgICA8UGxhdGZvcm1UYXJnZXQ+eDg2PC9QbGF0Zm9ybVRhcmdldD4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXx4ODYnICI+CisgICAgPFBsYXRmb3JtVGFyZ2V0Png4NjwvUGxhdGZvcm1UYXJnZXQ+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbC5MaW5xIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEuRGF0YVNldEV4dGVuc2lvbnMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQ1NoYXJwIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9ncmFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Tm9uZSBJbmNsdWRlPSJhcHAuY29uZmlnIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxzcmNcVGhyaWZ0LmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPlRocmlmdDwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LgorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L0pTT04vUHJvZ3JhbS5jcyBiL2xpYi9jc2hhcnAvdGVzdC9KU09OL1Byb2dyYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxMzg4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9KU09OL1Byb2dyYW0uY3MKQEAgLTAsMCArMSw5NSBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIEpTT05UZXN0Cit7CisgICAgY2xhc3MgUHJvZ3JhbQorICAgIHsKKyAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0VGhyaWZ0MjM2NSgpOyAgLy8gSlNPTiBiaW5hcnkgZGVjb2RlcyB0b28gbXVjaCBkYXRhCisgICAgICAgICAgICBUZXN0VGhyaWZ0MjMzNigpOyAgLy8gaGV4IGVuY29kaW5nIHVzaW5nIFx1WFhYWCB3aGVyZSAweFhYWFggPiAweEZGCisgICAgICAgICAgICBUZXN0VGhyaWZ0MzQwMygpOyAvLyBKU09OIGVzY2FwZWQgdW5pY29kZSBzdXJyb2dhdGUgcGFpciBzdXBwb3J0LgorICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgVGVzdFRocmlmdDIzNjUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcm5kID0gbmV3IFJhbmRvbSgpOworICAgICAgICAgICAgZm9yICh2YXIgbGVuID0gMDsgbGVuIDwgMTA7ICsrbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGVbXSBkYXRhV3JpdHRlbiA9IG5ldyBieXRlW2xlbl07CisgICAgICAgICAgICAgICAgcm5kLk5leHRCeXRlcyhkYXRhV3JpdHRlbik7CisKKyAgICAgICAgICAgICAgICBTdHJlYW0gc3RtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChudWxsLCBzdG0pOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBwcm90ID0gbmV3IFRKU09OUHJvdG9jb2wodHJhbnMpOworICAgICAgICAgICAgICAgIHByb3QuV3JpdGVCaW5hcnkoZGF0YVdyaXR0ZW4pOworCisgICAgICAgICAgICAgICAgc3RtLlBvc2l0aW9uID0gMDsKKyAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUU3RyZWFtVHJhbnNwb3J0KHN0bSwgbnVsbCk7CisgICAgICAgICAgICAgICAgcHJvdCA9IG5ldyBUSlNPTlByb3RvY29sKHRyYW5zKTsKKyAgICAgICAgICAgICAgICBieXRlW10gZGF0YVJlYWQgPSBwcm90LlJlYWRCaW5hcnkoKTsKKworICAgICAgICAgICAgICAgIERlYnVnLkFzc2VydChkYXRhUmVhZC5MZW5ndGggPT0gZGF0YVdyaXR0ZW4uTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFSZWFkLkxlbmd0aDsgKytpKQorICAgICAgICAgICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQoZGF0YVJlYWRbaV0gPT0gZGF0YVdyaXR0ZW5baV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgVGVzdFRocmlmdDIzMzYoKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgUlVTU0lBTl9URVhUID0gIlx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzNSBcdTA0MWRcdTA0MzBcdTA0MzdcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUiOworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIFJVU1NJQU5fSlNPTiA9ICJcIlxcdTA0MjBcXHUwNDQzXFx1MDQ0MVxcdTA0NDFcXHUwNDNhXFx1MDQzZVxcdTA0MzUgXFx1MDQxZFxcdTA0MzBcXHUwNDM3XFx1MDQzMlxcdTA0MzBcXHUwNDNkXFx1MDQzOFxcdTA0MzVcIiI7CisKKyAgICAgICAgICAgIC8vIHByZXBhcmUgYnVmZmVyIHdpdGggSlNPTiBkYXRhCisgICAgICAgICAgICBieXRlW10gcmF3Qnl0ZXMgPSBuZXcgYnl0ZVtSVVNTSUFOX0pTT04uTGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgUlVTU0lBTl9KU09OLkxlbmd0aDsgKytpKQorICAgICAgICAgICAgICAgIHJhd0J5dGVzW2ldID0gKGJ5dGUpKFJVU1NJQU5fSlNPTltpXSAmIChjaGFyKTB4RkYpOyAgLy8gb25seSBsb3cgYnl0ZXMKKworICAgICAgICAgICAgLy8gcGFyc2UgYW5kIGNoZWNrCisgICAgICAgICAgICB2YXIgc3RtID0gbmV3IE1lbW9yeVN0cmVhbShyYXdCeXRlcyk7CisgICAgICAgICAgICB2YXIgdHJhbnMgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChzdG0sIG51bGwpOworICAgICAgICAgICAgdmFyIHByb3QgPSBuZXcgVEpTT05Qcm90b2NvbCh0cmFucyk7CisgICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQocHJvdC5SZWFkU3RyaW5nKCkgPT0gUlVTU0lBTl9URVhULCAicmVhZGluZyBKU09OIHdpdGggaGV4LWVuY29kZWQgY2hhcnMgPiA4IGJpdCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFRlc3RUaHJpZnQzNDAzKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIEdDTEVGX1RFWFQgPSAiXHVkODM0XHVkZDFlIjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBHQ0xFRl9KU09OID0gIlwiXFx1ZDgzNFxcdWRkMWVcIiI7CisKKyAgICAgICAgICAgIC8vIHBhcnNlIGFuZCBjaGVjaworICAgICAgICAgICAgdmFyIHN0bSA9IG5ldyBNZW1vcnlTdHJlYW0oRW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhHQ0xFRl9KU09OKSk7CisgICAgICAgICAgICB2YXIgdHJhbnMgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChzdG0sIG51bGwpOworICAgICAgICAgICAgdmFyIHByb3QgPSBuZXcgVEpTT05Qcm90b2NvbCh0cmFucyk7CisgICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQocHJvdC5SZWFkU3RyaW5nKCkgPT0gR0NMRUZfVEVYVCwgInJlYWRpbmcgSlNPTiB3aXRoIHN1cnJvZ2F0ZSBwYWlyIGhleC1lbmNvZGVkIGNoYXJzIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvSlNPTi9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9jc2hhcnAvdGVzdC9KU09OL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZmY0YTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvSlNPTi9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDU1IEBACivvu78vKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gQWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIMO8YmVyIGVpbmUgQXNzZW1ibHkgd2VyZGVuIMO8YmVyIGRpZSBmb2xnZW5kZW4KKy8vIEF0dHJpYnV0ZSBnZXN0ZXVlcnQuIMOEbmRlcm4gU2llIGRpZXNlIEF0dHJpYnV0d2VydGUsIHVtIGRpZSBJbmZvcm1hdGlvbmVuIHp1IMOkbmRlcm4sCisvLyBkaWUgbWl0IGVpbmVyIEFzc2VtYmx5IHZlcmtuw7xwZnQgc2luZC4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiSlNPTlRlc3QiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBEdXJjaCBGZXN0bGVnZW4gdm9uIENvbVZpc2libGUgYXVmICJmYWxzZSIgd2VyZGVuIGRpZSBUeXBlbiBpbiBkaWVzZXIgQXNzZW1ibHkgdW5zaWNodGJhcgorLy8gZsO8ciBDT00tS29tcG9uZW50ZW4uIFdlbm4gU2llIGF1ZiBlaW5lbiBUeXAgaW4gZGllc2VyIEFzc2VtYmx5IHZvbgorLy8gQ09NIHp1Z3JlaWZlbiBtw7xzc2VuLCBsZWdlbiBTaWUgZGFzIENvbVZpc2libGUtQXR0cmlidXQgZsO8ciBkaWVzZW4gVHlwIGF1ZiAidHJ1ZSIgZmVzdC4KK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIERpZSBmb2xnZW5kZSBHVUlEIGJlc3RpbW10IGRpZSBJRCBkZXIgVHlwYmlibGlvdGhlaywgd2VubiBkaWVzZXMgUHJvamVrdCBmw7xyIENPTSB2ZXJmw7xnYmFyIGdlbWFjaHQgd2lyZAorW2Fzc2VtYmx5OiBHdWlkKCIyYjJlN2Q1Ni0zZTY1LTQzNjgtOTJkNy1lMzRkNTZiNzEwNWUiKV0KKworLy8gVmVyc2lvbnNpbmZvcm1hdGlvbmVuIGbDvHIgZWluZSBBc3NlbWJseSBiZXN0ZWhlbiBhdXMgZGVuIGZvbGdlbmRlbiB2aWVyIFdlcnRlbjoKKy8vCisvLyAgICAgIEhhdXB0dmVyc2lvbgorLy8gICAgICBOZWJlbnZlcnNpb24KKy8vICAgICAgQnVpbGRudW1tZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCisvLyBTaWUga8O2bm5lbiBhbGxlIFdlcnRlIGFuZ2ViZW4gb2RlciBkaWUgc3RhbmRhcmRtw6TDn2lnZW4gQnVpbGQtIHVuZCBSZXZpc2lvbnNudW1tZXJuCisvLyDDvGJlcm5laG1lbiwgaW5kZW0gU2llICIqIiBlaW5nZWJlbjoKKy8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L0pTT04vYXBwLmNvbmZpZyBiL2xpYi9jc2hhcnAvdGVzdC9KU09OL2FwcC5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxOTE5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9KU09OL2FwcC5jb25maWcKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uPgorPHN0YXJ0dXA+PHN1cHBvcnRlZFJ1bnRpbWUgdmVyc2lvbj0idjQuMCIgc2t1PSIuTkVURnJhbWV3b3JrLFZlcnNpb249djQuMCIvPjwvc3RhcnR1cD48L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9NdWx0aXBsZXguVGVzdC5DbGllbnQuY3MgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9NdWx0aXBsZXguVGVzdC5DbGllbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgxMGEwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L011bHRpcGxleC5UZXN0LkNsaWVudC5jcwpAQCAtMCwwICsxLDgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQ7Cit1c2luZyBUZXN0Lk11bHRpcGxleDsKKworbmFtZXNwYWNlIFRlc3QuTXVsdGlwbGV4LkNsaWVudAoreworICAgIHB1YmxpYyBjbGFzcyBUZXN0Q2xpZW50CisgICAgeworICAgICAgICBzdGF0aWMgdm9pZCBFeGVjdXRlKGludCBwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IHRyYW5zOworICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIHBvcnQpOworICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgICAgICAgIHRyYW5zLk9wZW4oKTsKKworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBQcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnMsIHRydWUsIHRydWUpOworCisgICAgICAgICAgICAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXVsdGlwbGV4OworCisgICAgICAgICAgICAgICAgbXVsdGlwbGV4ID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKFByb3RvY29sLCBDb25zdGFudHMuTkFNRV9CRU5DSE1BUktTRVJWSUNFKTsKKyAgICAgICAgICAgICAgICBCZW5jaG1hcmtTZXJ2aWNlLklmYWNlIGJlbmNoID0gbmV3IEJlbmNobWFya1NlcnZpY2UuQ2xpZW50KG11bHRpcGxleCk7CisKKyAgICAgICAgICAgICAgICBtdWx0aXBsZXggPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2woUHJvdG9jb2wsIENvbnN0YW50cy5OQU1FX0FHR1IpOworICAgICAgICAgICAgICAgIEFnZ3IuSWZhY2UgYWdnciA9IG5ldyBBZ2dyLkNsaWVudChtdWx0aXBsZXgpOworCisgICAgICAgICAgICAgICAgZm9yIChzYnl0ZSBpID0gMTsgMTAgPj0gaTsgKytpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWdnci5hZGRWYWx1ZShiZW5jaC5maWJvbmFjY2koaSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBrIGluIGFnZ3IuZ2V0VmFsdWVzKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGsuVG9TdHJpbmcoKSArICIgIik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhbnMuQ2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShlLk1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcG9ydCA9IDkwOTA7CisgICAgICAgICAgICBpZiAoYXJncy5MZW5ndGggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvcnQgPSB1c2hvcnQuUGFyc2UoYXJnc1swXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFeGVjdXRlKHBvcnQpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImRvbmUuIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L011bHRpcGxleENsaWVudC5jc3Byb2ogYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9NdWx0aXBsZXhDbGllbnQuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZTFjZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9NdWx0aXBsZXhDbGllbnQuY3Nwcm9qCkBAIC0wLDAgKzEsMTQ4IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMjEwMjI8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KKyAgICA8UHJvamVjdEd1aWQ+ezVFOTFEQTE3LUU1NDgtNDE1Ri04QzlGLTlFODRFREY4RUUwNn08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+TXVsdGlwbGV4Q2xpZW50PC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+TXVsdGlwbGV4Q2xpZW50PC9Bc3NlbWJseU5hbWU+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+CisgICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4KKyAgICA8RmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8L0ZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4KKyAgICA8VXBncmFkZUJhY2t1cExvY2F0aW9uIC8+CisgICAgPFB1Ymxpc2hVcmw+cHVibGlzaFw8L1B1Ymxpc2hVcmw+CisgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8SW5zdGFsbEZyb20+RGlzazwvSW5zdGFsbEZyb20+CisgICAgPFVwZGF0ZUVuYWJsZWQ+ZmFsc2U8L1VwZGF0ZUVuYWJsZWQ+CisgICAgPFVwZGF0ZU1vZGU+Rm9yZWdyb3VuZDwvVXBkYXRlTW9kZT4KKyAgICA8VXBkYXRlSW50ZXJ2YWw+NzwvVXBkYXRlSW50ZXJ2YWw+CisgICAgPFVwZGF0ZUludGVydmFsVW5pdHM+RGF5czwvVXBkYXRlSW50ZXJ2YWxVbml0cz4KKyAgICA8VXBkYXRlUGVyaW9kaWNhbGx5PmZhbHNlPC9VcGRhdGVQZXJpb2RpY2FsbHk+CisgICAgPFVwZGF0ZVJlcXVpcmVkPmZhbHNlPC9VcGRhdGVSZXF1aXJlZD4KKyAgICA8TWFwRmlsZUV4dGVuc2lvbnM+dHJ1ZTwvTWFwRmlsZUV4dGVuc2lvbnM+CisgICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4KKyAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLjA8L0FwcGxpY2F0aW9uVmVyc2lvbj4KKyAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KKyAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+Li5cYmluXERlYnVnXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD4uLlxiaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cTXVsdGlwbGV4LlRlc3QuQ29tbW9uLmNzIj4KKyAgICAgIDxMaW5rPk11bHRpcGxleC5UZXN0LkNvbW1vbi5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxBZ2dyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcQmVuY2htYXJrU2VydmljZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXEVycm9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik11bHRpcGxleC5UZXN0LkNsaWVudC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5DbGllbnQuMy41Ij4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDEgQ2xpZW50IFByb2ZpbGU8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjIuMCI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAyLjAgJTI4eDg2JTI5PC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjAiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy4wICUyOHg4NiUyOTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41Ij4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUuU1AxIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5XaW5kb3dzLkluc3RhbGxlci4zLjEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+V2luZG93cyBJbnN0YWxsZXIgMy4xPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxzcmNcVGhyaWZ0LmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPlRocmlmdDwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LgorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxQcmVCdWlsZEV2ZW50PnJtZGlyIC9zIC9xICIkKFByb2plY3REaXIpZ2VuLWNzaGFycCIKK2RlbCAvZiAvcSAiJChQcm9qZWN0RGlyKVRocmlmdEltcGwuZGxsIgorU0VUIE9VVFBVVF9ESVI9JChQcm9qZWN0RGlyKQorCitTRVQgVEhSSUZUX0ZJTEU9JChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlwuLlxjb250cmliXGFzeW5jLXRlc3RcYWdnci50aHJpZnQKK2ZvciAlMjUlMjVJIGluICgiJTI1T1VUUFVUX0RJUiUyNSIpIGRvIHNldCBTSE9SVF9ESVI9JTI1JTI1fmZzSQorZm9yICUyNSUyNUkgaW4gKCIlMjVUSFJJRlRfRklMRSUyNSIpIGRvIHNldCBUSFJJRlRfU0hPUlQ9JTI1JTI1fmZzSQorIiQoUHJvamVjdERpcilcLi5cLi5cLi5cLi5cLi5cY29tcGlsZXJcY3BwXHRocmlmdC5leGUiIC0tZ2VuIGNzaGFycCAtbyAlMjVTSE9SVF9ESVIlMjUgJTI1VEhSSUZUX1NIT1JUJTI1CisKK1NFVCBUSFJJRlRfRklMRT0kKFByb2plY3REaXIpXC4uXC4uXC4uXC4uXC4uXGxpYlxyYlxiZW5jaG1hcmtcQmVuY2htYXJrLnRocmlmdAorZm9yICUyNSUyNUkgaW4gKCIlMjVPVVRQVVRfRElSJTI1IikgZG8gc2V0IFNIT1JUX0RJUj0lMjUlMjV+ZnNJCitmb3IgJTI1JTI1SSBpbiAoIiUyNVRIUklGVF9GSUxFJTI1IikgZG8gc2V0IFRIUklGVF9TSE9SVD0lMjUlMjV+ZnNJCisiJChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlwuLlxjb21waWxlclxjcHBcdGhyaWZ0LmV4ZSIgLS1nZW4gY3NoYXJwIC1vICUyNVNIT1JUX0RJUiUyNSAlMjVUSFJJRlRfU0hPUlQlMjUKKworPC9QcmVCdWlsZEV2ZW50PgorICA8L1Byb3BlcnR5R3JvdXA+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ODZkZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiTXVsdGlwbGV4Q2xpZW50IildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiNjZGQzYxRTUtNDIwQi00YjU2LTgwMTItRDZENkNFMjI1MzdGIildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24KKy8vICAgICAgQnVpbGQgTnVtYmVyCisvLyAgICAgIFJldmlzaW9uCisvLworLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CisvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvTWFrZWZpbGUuYW0gYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MjUzZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNTIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitHRU5FUkFURUQgPSBcCisJZ2VuLWNzaGFycC9BZ2dyLmNzIFwKKwlnZW4tY3NoYXJwL0JlbmNobWFya1NlcnZpY2UuY3MgXAorCWdlbi1jc2hhcnAvRXJyb3IuY3MKKworQlVJTFRfU09VUkNFUyA9ICQoR0VORVJBVEVEKQorCitUSFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCitnZW4tY3NoYXJwL0FnZ3IuY3M6ICQodG9wX3NyY2RpcikvY29udHJpYi9hc3luYy10ZXN0L2FnZ3IudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNzaGFycCAkPAorCitnZW4tY3NoYXJwL0JlbmNobWFya1NlcnZpY2UuY3MgZ2VuLWNzaGFycC9FcnJvci5jczogJCh0b3Bfc3JjZGlyKS9saWIvcmIvYmVuY2htYXJrL0JlbmNobWFyay50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3NoYXJwICQ8CisKK1RocmlmdEltcGwuZGxsOiBNdWx0aXBsZXguVGVzdC5Db21tb24uY3MgJChHRU5FUkFURUQpIC4uLy4uL1RocmlmdC5kbGwKKwkkKENTQykgJChDU0NfREVGSU5FUykgLXQ6bGlicmFyeSAtb3V0Oi4vVGhyaWZ0SW1wbC5kbGwgLXJlZmVyZW5jZTouLi8uLi9UaHJpZnQuZGxsICQoR0VORVJBVEVEKSAkPAorCitNdWx0aXBsZXhDbGllbnQuZXhlOiBDbGllbnQvTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmNzIFRocmlmdEltcGwuZGxsCisJJChDU0MpICQoQ1NDX0RFRklORVMpIC1vdXQ6JEAgLXJlZmVyZW5jZTouLi8uLi9UaHJpZnQuZGxsIC1yZWZlcmVuY2U6VGhyaWZ0SW1wbC5kbGwgJDwKKworTXVsdGlwbGV4U2VydmVyLmV4ZTogU2VydmVyL011bHRpcGxleC5UZXN0LlNlcnZlci5jcyBUaHJpZnRJbXBsLmRsbAorCSQoQ1NDKSAkKENTQ19ERUZJTkVTKSAtb3V0OiRAIC1yZWZlcmVuY2U6Li4vLi4vVGhyaWZ0LmRsbCAtcmVmZXJlbmNlOlRocmlmdEltcGwuZGxsICQ8CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yZiBnZW4tY3NoYXJwICouZXhlICouZGxsCisKK1RFU1RQT1JUID0gOTUwMQorY2hlY2stbG9jYWw6IE11bHRpcGxleFNlcnZlci5leGUgTXVsdGlwbGV4Q2xpZW50LmV4ZQorCWVjaG8gJChURVNUUE9SVCkKKwlNT05PX1BBVEg9Li4vLi4vIHRpbWVvdXQgMTAgbW9ubyBNdWx0aXBsZXhTZXJ2ZXIuZXhlICQoVEVTVFBPUlQpICYKKwlzbGVlcCAxCisJTU9OT19QQVRIPS4uLy4uLyBtb25vIE11bHRpcGxleENsaWVudC5leGUgJChURVNUUE9SVCkKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvTXVsdGlwbGV4LlRlc3QuQ29tbW9uLmNzIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9NdWx0aXBsZXguVGVzdC5Db21tb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY4Nzg1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvTXVsdGlwbGV4LlRlc3QuQ29tbW9uLmNzCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlCisvLworLy8gU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0Ugb3IgdmlzaXQgdGhlIFRocmlmdCBzaXRlIGF0OgorLy8gaHR0cDovL2RldmVsb3BlcnMuZmFjZWJvb2suY29tL3RocmlmdC8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7CisKK25hbWVzcGFjZSBUZXN0Lk11bHRpcGxleAoreworICAgIHB1YmxpYyBjbGFzcyBDb25zdGFudHMKKyAgICB7CisgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgTkFNRV9CRU5DSE1BUktTRVJWSUNFID0gIkJlbmNobWFya1NlcnZpY2UiOworICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIE5BTUVfQUdHUiAgICAgICAgICAgICA9ICJBZ2dyIjsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmNzIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ODYxODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXguVGVzdC5TZXJ2ZXIuY3MKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdDsKK3VzaW5nIFRlc3QuTXVsdGlwbGV4OworCituYW1lc3BhY2UgVGVzdC5NdWx0aXBsZXguU2VydmVyCit7CisgICAgcHVibGljIGNsYXNzIFRlc3RTZXJ2ZXIKKyAgICB7CisgICAgICAgIGNsYXNzIEJlbmNobWFya1NlcnZpY2VJbXBsIDogQmVuY2htYXJrU2VydmljZS5JZmFjZQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgaW50IGZpYm9uYWNjaShzYnl0ZSBuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBwcmV2LCBuZXh0LCByZXN1bHQ7CisgICAgICAgICAgICAgICAgcHJldiAgID0gMDsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAxOworICAgICAgICAgICAgICAgIHdoaWxlIChuID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5leHQgICA9IHJlc3VsdCArIHByZXY7CisgICAgICAgICAgICAgICAgICAgIHByZXYgICA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgLS1uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgQWdnclNlcnZpY2VJbXBsIDogQWdnci5JZmFjZQorICAgICAgICB7CisgICAgICAgICAgICBMaXN0PGludD4gdmFsdWVzID0gbmV3IExpc3Q8aW50PigpOworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZShpbnQgdmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsdWVzLkFkZCh2YWx1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0PGludD4gZ2V0VmFsdWVzKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHZvaWQgRXhlY3V0ZShpbnQgcG9ydCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHByb3RvY29sIGZhY3RvcnksIGRlZmF1bHQgdG8gQmluYXJ5UHJvdG9jb2wKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSh0cnVlLHRydWUpOworICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVydHJhbnMgPSBuZXcgVFNlcnZlclNvY2tldChwb3J0LCAwLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgVHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBURnJhbWVkVHJhbnNwb3J0LkZhY3RvcnkoKTsKKworICAgICAgICAgICAgICAgIEJlbmNobWFya1NlcnZpY2UuSWZhY2UgYmVuY2hIYW5kbGVyID0gbmV3IEJlbmNobWFya1NlcnZpY2VJbXBsKCk7CisgICAgICAgICAgICAgICAgVFByb2Nlc3NvciBiZW5jaFByb2Nlc3NvciA9IG5ldyBCZW5jaG1hcmtTZXJ2aWNlLlByb2Nlc3NvcihiZW5jaEhhbmRsZXIpOworCisgICAgICAgICAgICAgICAgQWdnci5JZmFjZSBhZ2dySGFuZGxlciA9IG5ldyBBZ2dyU2VydmljZUltcGwoKTsKKyAgICAgICAgICAgICAgICBUUHJvY2Vzc29yIGFnZ3JQcm9jZXNzb3IgPSBuZXcgQWdnci5Qcm9jZXNzb3IoYWdnckhhbmRsZXIpOworCisgICAgICAgICAgICAgICAgVE11bHRpcGxleGVkUHJvY2Vzc29yIG11bHRpcGxleCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKKyAgICAgICAgICAgICAgICBtdWx0aXBsZXguUmVnaXN0ZXJQcm9jZXNzb3IoQ29uc3RhbnRzLk5BTUVfQkVOQ0hNQVJLU0VSVklDRSwgYmVuY2hQcm9jZXNzb3IpOworICAgICAgICAgICAgICAgIG11bHRpcGxleC5SZWdpc3RlclByb2Nlc3NvcihDb25zdGFudHMuTkFNRV9BR0dSLCBhZ2dyUHJvY2Vzc29yKTsKKworICAgICAgICAgICAgICAgIFRTZXJ2ZXIgU2VydmVyRW5naW5lID0gbmV3IFRTaW1wbGVTZXJ2ZXIobXVsdGlwbGV4LCBzZXJ2ZXJ0cmFucywgVHJhbnNwb3J0RmFjdG9yeSwgUHJvdG9jb2xGYWN0b3J5KTsKKworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTdGFydGluZyB0aGUgc2VydmVyIC4uLiIpOworICAgICAgICAgICAgICAgIFNlcnZlckVuZ2luZS5TZXJ2ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGUuTWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBwb3J0ID0gOTA5MDsKKyAgICAgICAgICAgIGlmIChhcmdzLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG9ydCA9IHVzaG9ydC5QYXJzZShhcmdzWzBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV4ZWN1dGUocG9ydCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL011bHRpcGxleFNlcnZlci5jc3Byb2ogYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXhTZXJ2ZXIuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YTQzOTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXhTZXJ2ZXIuY3Nwcm9qCkBAIC0wLDAgKzEsMTQ4IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMjEwMjI8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KKyAgICA8UHJvamVjdEd1aWQ+e0Q1OTJCREYzLTBEQ0UtNDhGQi04OTBGLUU0QUUxRDlDRTdDRH08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+TXVsdGlwbGV4U2VydmVyPC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+TXVsdGlwbGV4U2VydmVyPC9Bc3NlbWJseU5hbWU+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+CisgICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4KKyAgICA8RmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8L0ZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4KKyAgICA8VXBncmFkZUJhY2t1cExvY2F0aW9uIC8+CisgICAgPFB1Ymxpc2hVcmw+cHVibGlzaFw8L1B1Ymxpc2hVcmw+CisgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8SW5zdGFsbEZyb20+RGlzazwvSW5zdGFsbEZyb20+CisgICAgPFVwZGF0ZUVuYWJsZWQ+ZmFsc2U8L1VwZGF0ZUVuYWJsZWQ+CisgICAgPFVwZGF0ZU1vZGU+Rm9yZWdyb3VuZDwvVXBkYXRlTW9kZT4KKyAgICA8VXBkYXRlSW50ZXJ2YWw+NzwvVXBkYXRlSW50ZXJ2YWw+CisgICAgPFVwZGF0ZUludGVydmFsVW5pdHM+RGF5czwvVXBkYXRlSW50ZXJ2YWxVbml0cz4KKyAgICA8VXBkYXRlUGVyaW9kaWNhbGx5PmZhbHNlPC9VcGRhdGVQZXJpb2RpY2FsbHk+CisgICAgPFVwZGF0ZVJlcXVpcmVkPmZhbHNlPC9VcGRhdGVSZXF1aXJlZD4KKyAgICA8TWFwRmlsZUV4dGVuc2lvbnM+dHJ1ZTwvTWFwRmlsZUV4dGVuc2lvbnM+CisgICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4KKyAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLjA8L0FwcGxpY2F0aW9uVmVyc2lvbj4KKyAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KKyAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+Li5cYmluXERlYnVnXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD4uLlxiaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cTXVsdGlwbGV4LlRlc3QuQ29tbW9uLmNzIj4KKyAgICAgIDxMaW5rPk11bHRpcGxleC5UZXN0LkNvbW1vbi5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxBZ2dyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcQmVuY2htYXJrU2VydmljZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXEVycm9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik11bHRpcGxleC5UZXN0LlNlcnZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5DbGllbnQuMy41Ij4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDEgQ2xpZW50IFByb2ZpbGU8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjIuMCI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAyLjAgJTI4eDg2JTI5PC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjAiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy4wICUyOHg4NiUyOTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41Ij4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUuU1AxIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5XaW5kb3dzLkluc3RhbGxlci4zLjEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+V2luZG93cyBJbnN0YWxsZXIgMy4xPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxzcmNcVGhyaWZ0LmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPlRocmlmdDwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LgorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxQcmVCdWlsZEV2ZW50PnJtZGlyIC9zIC9xICIkKFByb2plY3REaXIpZ2VuLWNzaGFycCIKK2RlbCAvZiAvcSAiJChQcm9qZWN0RGlyKVRocmlmdEltcGwuZGxsIgorU0VUIE9VVFBVVF9ESVI9JChQcm9qZWN0RGlyKQorCitTRVQgVEhSSUZUX0ZJTEU9JChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlwuLlxjb250cmliXGFzeW5jLXRlc3RcYWdnci50aHJpZnQKK2ZvciAlMjUlMjVJIGluICgiJTI1T1VUUFVUX0RJUiUyNSIpIGRvIHNldCBTSE9SVF9ESVI9JTI1JTI1fmZzSQorZm9yICUyNSUyNUkgaW4gKCIlMjVUSFJJRlRfRklMRSUyNSIpIGRvIHNldCBUSFJJRlRfU0hPUlQ9JTI1JTI1fmZzSQorIiQoUHJvamVjdERpcilcLi5cLi5cLi5cLi5cLi5cY29tcGlsZXJcY3BwXHRocmlmdC5leGUiIC0tZ2VuIGNzaGFycCAtbyAlMjVTSE9SVF9ESVIlMjUgJTI1VEhSSUZUX1NIT1JUJTI1CisKK1NFVCBUSFJJRlRfRklMRT0kKFByb2plY3REaXIpXC4uXC4uXC4uXC4uXC4uXGxpYlxyYlxiZW5jaG1hcmtcQmVuY2htYXJrLnRocmlmdAorZm9yICUyNSUyNUkgaW4gKCIlMjVPVVRQVVRfRElSJTI1IikgZG8gc2V0IFNIT1JUX0RJUj0lMjUlMjV+ZnNJCitmb3IgJTI1JTI1SSBpbiAoIiUyNVRIUklGVF9GSUxFJTI1IikgZG8gc2V0IFRIUklGVF9TSE9SVD0lMjUlMjV+ZnNJCisiJChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlwuLlxjb21waWxlclxjcHBcdGhyaWZ0LmV4ZSIgLS1nZW4gY3NoYXJwIC1vICUyNVNIT1JUX0RJUiUyNSAlMjVUSFJJRlRfU0hPUlQlMjUKKworPC9QcmVCdWlsZEV2ZW50PgorICA8L1Byb3BlcnR5R3JvdXA+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNDA1NDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiTXVsdGlwbGV4U2VydmVyIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiRjJGNDM2QzEtM0Q0Ri00MTFhLUFEQzMtQjk4ODQ4NDc2QThFIildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24KKy8vICAgICAgQnVpbGQgTnVtYmVyCisvLyAgICAgIFJldmlzaW9uCisvLworLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CisvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0FwcF9TdGFydC9GaWx0ZXJDb25maWcuY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9BcHBfU3RhcnQvRmlsdGVyQ29uZmlnLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NTE4NGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9BcHBfU3RhcnQvRmlsdGVyQ29uZmlnLmNzCkBAIC0wLDAgKzEsMzEgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5XZWIuTXZjOworCituYW1lc3BhY2UgVGhyaWZ0TVZDVGVzdAoreworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmlsdGVyQ29uZmlnCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgUmVnaXN0ZXJHbG9iYWxGaWx0ZXJzKEdsb2JhbEZpbHRlckNvbGxlY3Rpb24gZmlsdGVycykKKyAgICAgICAgeworICAgICAgICAgICAgZmlsdGVycy5BZGQobmV3IEhhbmRsZUVycm9yQXR0cmlidXRlKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXBwX1N0YXJ0L1JvdXRlQ29uZmlnLmNzIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXBwX1N0YXJ0L1JvdXRlQ29uZmlnLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YjYwMjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9BcHBfU3RhcnQvUm91dGVDb25maWcuY3MKQEAgLTAsMCArMSwzOSBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLldlYi5NdmM7Cit1c2luZyBTeXN0ZW0uV2ViLlJvdXRpbmc7CisKK25hbWVzcGFjZSBUaHJpZnRNVkNUZXN0Cit7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSb3V0ZUNvbmZpZworICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlZ2lzdGVyUm91dGVzKFJvdXRlQ29sbGVjdGlvbiByb3V0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJvdXRlcy5JZ25vcmVSb3V0ZSgie3Jlc291cmNlfS50aHJpZnQiKTsKKyAgICAgICAgICAgIHJvdXRlcy5JZ25vcmVSb3V0ZSgie3Jlc291cmNlfS5heGQveypwYXRoSW5mb30iKTsKKworICAgICAgICAgICAgcm91dGVzLk1hcFJvdXRlKAorICAgICAgICAgICAgICAgIG5hbWU6ICJEZWZhdWx0IiwKKyAgICAgICAgICAgICAgICB1cmw6ICJ7Y29udHJvbGxlcn0ve2FjdGlvbn0ve2lkfSIsCisgICAgICAgICAgICAgICAgZGVmYXVsdHM6IG5ldyB7IGNvbnRyb2xsZXIgPSAiSG9tZSIsIGFjdGlvbiA9ICJJbmRleCIsIGlkID0gVXJsUGFyYW1ldGVyLk9wdGlvbmFsIH0KKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Bc3luY0h0dHBIYW5kbGVyLmNzIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXN5bmNIdHRwSGFuZGxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjI2MTg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXN5bmNIdHRwSGFuZGxlci5jcwpAQCAtMCwwICsxLDMyIEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCituYW1lc3BhY2UgVGhyaWZ0TVZDVGVzdAoreworICAgIHB1YmxpYyBjbGFzcyBBc3luY0h0dHBIYW5kbGVyIDogVEh0dHBUYXNrQXN5bmNIYW5kbGVyCisgICAgeworICAgICAgICBwdWJsaWMgQXN5bmNIdHRwSGFuZGxlcigpCisgICAgICAgICAgICA6IGJhc2UoCisgICAgICAgICAgICAgICAgbmV3IFRocmlmdC5UZXN0LlNlY29uZFNlcnZpY2UuQXN5bmNQcm9jZXNzb3IobmV3IFNlY29uZFNlcnZpY2VJbXBsKCkpKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQ29udHJvbGxlcnMvSG9tZUNvbnRyb2xsZXIuY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Db250cm9sbGVycy9Ib21lQ29udHJvbGxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWExZWM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQ29udHJvbGxlcnMvSG9tZUNvbnRyb2xsZXIuY3MKQEAgLTAsMCArMSw3MCBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFN5c3RlbS5XZWIuTXZjOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlRlc3Q7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCituYW1lc3BhY2UgVGhyaWZ0TVZDVGVzdC5Db250cm9sbGVycworeworICAgIHB1YmxpYyBjbGFzcyBIb21lQ29udHJvbGxlciA6IENvbnRyb2xsZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBBY3Rpb25SZXN1bHQgSW5kZXgoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVmlldygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8QWN0aW9uUmVzdWx0PiBUZXN0VGhyaWZ0QXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYmFzZVVyaSA9IG5ldyBVcmkoc3RyaW5nLkZvcm1hdCgiezB9Oi8vezF9ezJ9IiwgUmVxdWVzdC5VcmwuU2NoZW1lLCBSZXF1ZXN0LlVybC5BdXRob3JpdHksCisgICAgICAgICAgICAgICAgVXJsLkNvbnRlbnQoIn4iKSkpOworCisgICAgICAgICAgICBTZWNvbmRTZXJ2aWNlLklBc3luYyBhc3luY1NlcnZpY2UgPQorICAgICAgICAgICAgICAgIG5ldyBTZWNvbmRTZXJ2aWNlLkNsaWVudChuZXcgVEJpbmFyeVByb3RvY29sKG5ldyBUSHR0cENsaWVudChuZXcgVXJpKGJhc2VVcmksICJBc3luYy50aHJpZnQiKSkpKTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGFzeW5jU2VydmljZS5zZWNvbmR0ZXN0U3RyaW5nQXN5bmMoIlRlc3RTdHJpbmciKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gInRlc3RTdHJpbmcoXCJUZXN0U3RyaW5nXCIpIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgd3JvbmcgcmVzdWx0IHdhcyByZXR1cm5lZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gUmVkaXJlY3RUb0FjdGlvbigiSW5kZXgiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBY3Rpb25SZXN1bHQgVGVzdFRocmlmdFN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYmFzZVVyaSA9IG5ldyBVcmkoc3RyaW5nLkZvcm1hdCgiezB9Oi8vezF9ezJ9IiwgUmVxdWVzdC5VcmwuU2NoZW1lLCBSZXF1ZXN0LlVybC5BdXRob3JpdHksCisgICAgICAgICAgICAgICAgVXJsLkNvbnRlbnQoIn4iKSkpOworCisgICAgICAgICAgICBTZWNvbmRTZXJ2aWNlLklTeW5jIHNlcnZpY2UgPQorICAgICAgICAgICAgICAgIG5ldyBTZWNvbmRTZXJ2aWNlLkNsaWVudChuZXcgVEJpbmFyeVByb3RvY29sKG5ldyBUSHR0cENsaWVudChuZXcgVXJpKGJhc2VVcmksICJTeW5jLnRocmlmdCIpKSkpOworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gc2VydmljZS5zZWNvbmR0ZXN0U3RyaW5nKCJUZXN0U3RyaW5nIik7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9ICJ0ZXN0U3RyaW5nKFwiVGVzdFN0cmluZ1wiKSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIHdyb25nIHJlc3VsdCB3YXMgcmV0dXJuZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIFJlZGlyZWN0VG9BY3Rpb24oIkluZGV4Iik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9HbG9iYWwuYXNheCBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0dsb2JhbC5hc2F4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYjY4OGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9HbG9iYWwuYXNheApAQCAtMCwwICsxLDE5IEBACivvu788JUAgQXBwbGljYXRpb24gQ29kZWJlaGluZD0iR2xvYmFsLmFzYXguY3MiIEluaGVyaXRzPSJUaHJpZnRNVkNUZXN0Lk12Y0FwcGxpY2F0aW9uIiBMYW5ndWFnZT0iQyMiICU+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9HbG9iYWwuYXNheC5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0dsb2JhbC5hc2F4LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NzMxZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9HbG9iYWwuYXNheC5jcwpAQCAtMCwwICsxLDM0IEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uV2ViLk12YzsKK3VzaW5nIFN5c3RlbS5XZWIuUm91dGluZzsKKworbmFtZXNwYWNlIFRocmlmdE1WQ1Rlc3QKK3sKKyAgICBwdWJsaWMgY2xhc3MgTXZjQXBwbGljYXRpb24gOiBTeXN0ZW0uV2ViLkh0dHBBcHBsaWNhdGlvbgorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgQXBwbGljYXRpb25fU3RhcnQoKQorICAgICAgICB7CisgICAgICAgICAgICBBcmVhUmVnaXN0cmF0aW9uLlJlZ2lzdGVyQWxsQXJlYXMoKTsKKyAgICAgICAgICAgIEZpbHRlckNvbmZpZy5SZWdpc3Rlckdsb2JhbEZpbHRlcnMoR2xvYmFsRmlsdGVycy5GaWx0ZXJzKTsKKyAgICAgICAgICAgIFJvdXRlQ29uZmlnLlJlZ2lzdGVyUm91dGVzKFJvdXRlVGFibGUuUm91dGVzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZlODg5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNTMgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJUaHJpZnRNVkNUZXN0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIkEgd2ViIHByb2plY3QgZm9yIHRlc3RpbmcgdGhlIHRocmlmdCBBU1AuTkVUIGZlYXR1cmVzLiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiMzY2ZjliZDAtM2MwZS00OGFhLWIyY2EtNjFmZDRhOTNlNDI3IildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24KKy8vICAgICAgQnVpbGQgTnVtYmVyCisvLyAgICAgIFJldmlzaW9uCisvLworLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9TZWNvbmRTZXJ2aWNlSW1wbC5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1NlY29uZFNlcnZpY2VJbXBsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZDMwMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9TZWNvbmRTZXJ2aWNlSW1wbC5jcwpAQCAtMCwwICsxLDM3IEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlRlc3Q7CisKK25hbWVzcGFjZSBUaHJpZnRNVkNUZXN0Cit7CisgICAgcHVibGljIGNsYXNzIFNlY29uZFNlcnZpY2VJbXBsIDogU2Vjb25kU2VydmljZS5JQXN5bmMsIFNlY29uZFNlcnZpY2UuSVN5bmMKKyAgICB7CisgICAgICAgIHB1YmxpYyBUYXNrPHN0cmluZz4gc2Vjb25kdGVzdFN0cmluZ0FzeW5jKHN0cmluZyB0aGluZykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIHNlY29uZHRlc3RTdHJpbmcoc3RyaW5nIHRoaW5nKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gInRlc3RTdHJpbmcoXCIiICsgdGhpbmcgKyAiXCIpIjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1N5bmNIdHRwSGFuZGxlci5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1N5bmNIdHRwSGFuZGxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmUyNjYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvU3luY0h0dHBIYW5kbGVyLmNzCkBAIC0wLDAgKzEsMzIgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBUaHJpZnRNVkNUZXN0Cit7CisgICAgcHVibGljIGNsYXNzIFN5bmNIdHRwSGFuZGxlciA6IFRIdHRwSGFuZGxlcgorICAgIHsKKyAgICAgICAgcHVibGljIFN5bmNIdHRwSGFuZGxlcigpCisgICAgICAgICAgICA6IGJhc2UoCisgICAgICAgICAgICAgICAgbmV3IFRocmlmdC5UZXN0LlNlY29uZFNlcnZpY2UuUHJvY2Vzc29yKG5ldyBTZWNvbmRTZXJ2aWNlSW1wbCgpKSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1RocmlmdE1WQ1Rlc3QuY3Nwcm9qIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVGhyaWZ0TVZDVGVzdC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViOTY5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1RocmlmdE1WQ1Rlc3QuY3Nwcm9qCkBAIC0wLDAgKzEsMjAwIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSIxMi4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoKVwkKE1TQnVpbGRUb29sc1ZlcnNpb24pXE1pY3Jvc29mdC5Db21tb24ucHJvcHMiIENvbmRpdGlvbj0iRXhpc3RzKCckKE1TQnVpbGRFeHRlbnNpb25zUGF0aClcJChNU0J1aWxkVG9vbHNWZXJzaW9uKVxNaWNyb3NvZnQuQ29tbW9uLnByb3BzJykiIC8+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+CisgICAgPC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPns4OTFCNDQ4Ny1DN0JBLTQyN0UtQkJDOC00QzU5NkMyMjlBMTB9PC9Qcm9qZWN0R3VpZD4KKyAgICA8UHJvamVjdFR5cGVHdWlkcz57MzQ5YzU4NTEtNjVkZi0xMWRhLTkzODQtMDAwNjViODQ2ZjIxfTt7ZmFlMDRlYzAtMzAxZi0xMWQzLWJmNGItMDBjMDRmNzllZmJjfTwvUHJvamVjdFR5cGVHdWlkcz4KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5UaHJpZnRNVkNUZXN0PC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0TVZDVGVzdDwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPE12Y0J1aWxkVmlld3M+ZmFsc2U8L012Y0J1aWxkVmlld3M+CisgICAgPFVzZUlJU0V4cHJlc3M+dHJ1ZTwvVXNlSUlTRXhwcmVzcz4KKyAgICA8SUlTRXhwcmVzc1NTTFBvcnQgLz4KKyAgICA8SUlTRXhwcmVzc0Fub255bW91c0F1dGhlbnRpY2F0aW9uIC8+CisgICAgPElJU0V4cHJlc3NXaW5kb3dzQXV0aGVudGljYXRpb24gLz4KKyAgICA8SUlTRXhwcmVzc1VzZUNsYXNzaWNQaXBlbGluZU1vZGUgLz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQ1NoYXJwIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRHJhd2luZyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuRHluYW1pY0RhdGEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLkVudGl0eSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuQXBwbGljYXRpb25TZXJ2aWNlcyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db21wb25lbnRNb2RlbC5EYXRhQW5ub3RhdGlvbnMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhLkRhdGFTZXRFeHRlbnNpb25zIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbC5MaW5xIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYiIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuRXh0ZW5zaW9ucyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuQWJzdHJhY3Rpb25zIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5Sb3V0aW5nIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db25maWd1cmF0aW9uIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5TZXJ2aWNlcyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5FbnRlcnByaXNlU2VydmljZXMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2ViLkluZnJhc3RydWN0dXJlLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4KKyAgICAgIDxIaW50UGF0aD4uLlxwYWNrYWdlc1xNaWNyb3NvZnQuV2ViLkluZnJhc3RydWN0dXJlLjEuMC4wLjBcbGliXG5ldDQwXE1pY3Jvc29mdC5XZWIuSW5mcmFzdHJ1Y3R1cmUuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5OZXQuSHR0cCI+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lkh0dHAuV2ViUmVxdWVzdCI+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLkhlbHBlcnMsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPgorICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXE1pY3Jvc29mdC5Bc3BOZXQuV2ViUGFnZXMuMy4yLjNcbGliXG5ldDQ1XFN5c3RlbS5XZWIuSGVscGVycy5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5NdmMsIFZlcnNpb249NS4yLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPgorICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXE1pY3Jvc29mdC5Bc3BOZXQuTXZjLjUuMi4zXGxpYlxuZXQ0NVxTeXN0ZW0uV2ViLk12Yy5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5SYXpvciwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+CisgICAgICA8SGludFBhdGg+Li5ccGFja2FnZXNcTWljcm9zb2Z0LkFzcE5ldC5SYXpvci4zLjIuM1xsaWJcbmV0NDVcU3lzdGVtLldlYi5SYXpvci5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5XZWJQYWdlcywgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+CisgICAgICA8SGludFBhdGg+Li5ccGFja2FnZXNcTWljcm9zb2Z0LkFzcE5ldC5XZWJQYWdlcy4zLjIuM1xsaWJcbmV0NDVcU3lzdGVtLldlYi5XZWJQYWdlcy5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5XZWJQYWdlcy5EZXBsb3ltZW50LCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4KKyAgICAgIDxIaW50UGF0aD4uLlxwYWNrYWdlc1xNaWNyb3NvZnQuQXNwTmV0LldlYlBhZ2VzLjMuMi4zXGxpYlxuZXQ0NVxTeXN0ZW0uV2ViLldlYlBhZ2VzLkRlcGxveW1lbnQuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuV2ViUGFnZXMuUmF6b3IsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPgorICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXE1pY3Jvc29mdC5Bc3BOZXQuV2ViUGFnZXMuMy4yLjNcbGliXG5ldDQ1XFN5c3RlbS5XZWIuV2ViUGFnZXMuUmF6b3IuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlRocmlmdEltcGwiPgorICAgICAgPEhpbnRQYXRoPi5cVGhyaWZ0SW1wbC5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBcHBfU3RhcnRcRmlsdGVyQ29uZmlnLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFwcF9TdGFydFxSb3V0ZUNvbmZpZy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTeW5jSHR0cEhhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQXN5bmNIdHRwSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb250cm9sbGVyc1xIb21lQ29udHJvbGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHbG9iYWwuYXNheC5jcyI+CisgICAgICA8RGVwZW5kZW50VXBvbj5HbG9iYWwuYXNheDwvRGVwZW5kZW50VXBvbj4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2Vjb25kU2VydmljZUltcGwuY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb250ZW50IEluY2x1ZGU9ImZhdmljb24uaWNvIiAvPgorICAgIDxDb250ZW50IEluY2x1ZGU9Ikdsb2JhbC5hc2F4IiAvPgorICAgIDxDb250ZW50IEluY2x1ZGU9IldlYi5jb25maWciIC8+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iV2ViLkRlYnVnLmNvbmZpZyI+CisgICAgICA8RGVwZW5kZW50VXBvbj5XZWIuY29uZmlnPC9EZXBlbmRlbnRVcG9uPgorICAgIDwvQ29udGVudD4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJXZWIuUmVsZWFzZS5jb25maWciPgorICAgICAgPERlcGVuZGVudFVwb24+V2ViLmNvbmZpZzwvRGVwZW5kZW50VXBvbj4KKyAgICA8L0NvbnRlbnQ+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iVmlld3NcV2ViLmNvbmZpZyIgLz4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJWaWV3c1xfVmlld1N0YXJ0LmNzaHRtbCIgLz4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJWaWV3c1xTaGFyZWRcX0xheW91dC5jc2h0bWwiIC8+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iVmlld3NcSG9tZVxJbmRleC5jc2h0bWwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxGb2xkZXIgSW5jbHVkZT0iQXBwX0RhdGFcIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJwYWNrYWdlcy5jb25maWciPgorICAgICAgPFN1YlR5cGU+RGVzaWduZXI8L1N1YlR5cGU+CisgICAgPC9Db250ZW50PgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxzcmNcVGhyaWZ0LjQ1LmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57ZWJjZTM1ZGEtY2Y2YS00MmJjLWEzNTctYTljMDliNTM0Mjk5fTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPlRocmlmdC40NTwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8VmlzdWFsU3R1ZGlvVmVyc2lvbiBDb25kaXRpb249IickKFZpc3VhbFN0dWRpb1ZlcnNpb24pJyA9PSAnJyI+MTAuMDwvVmlzdWFsU3R1ZGlvVmVyc2lvbj4KKyAgICA8VlNUb29sc1BhdGggQ29uZGl0aW9uPSInJChWU1Rvb2xzUGF0aCknID09ICcnIj4kKE1TQnVpbGRFeHRlbnNpb25zUGF0aDMyKVxNaWNyb3NvZnRcVmlzdWFsU3R1ZGlvXHYkKFZpc3VhbFN0dWRpb1ZlcnNpb24pPC9WU1Rvb2xzUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZTVG9vbHNQYXRoKVxXZWJBcHBsaWNhdGlvbnNcTWljcm9zb2Z0LldlYkFwcGxpY2F0aW9uLnRhcmdldHMiIENvbmRpdGlvbj0iJyQoVlNUb29sc1BhdGgpJyAhPSAnJyIgLz4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aDMyKVxNaWNyb3NvZnRcVmlzdWFsU3R1ZGlvXHYxMC4wXFdlYkFwcGxpY2F0aW9uc1xNaWNyb3NvZnQuV2ViQXBwbGljYXRpb24udGFyZ2V0cyIgQ29uZGl0aW9uPSJmYWxzZSIgLz4KKyAgPFRhcmdldCBOYW1lPSJNdmNCdWlsZFZpZXdzIiBBZnRlclRhcmdldHM9IkFmdGVyQnVpbGQiIENvbmRpdGlvbj0iJyQoTXZjQnVpbGRWaWV3cyknPT0ndHJ1ZSciPgorICAgIDxBc3BOZXRDb21waWxlciBWaXJ0dWFsUGF0aD0idGVtcCIgUGh5c2ljYWxQYXRoPSIkKFdlYlByb2plY3RPdXRwdXREaXIpIiAvPgorICA8L1RhcmdldD4KKyAgPFByb2plY3RFeHRlbnNpb25zPgorICAgIDxWaXN1YWxTdHVkaW8+CisgICAgICA8Rmxhdm9yUHJvcGVydGllcyBHVUlEPSJ7MzQ5YzU4NTEtNjVkZi0xMWRhLTkzODQtMDAwNjViODQ2ZjIxfSI+CisgICAgICAgIDxXZWJQcm9qZWN0UHJvcGVydGllcz4KKyAgICAgICAgICA8VXNlSUlTPlRydWU8L1VzZUlJUz4KKyAgICAgICAgICA8QXV0b0Fzc2lnblBvcnQ+VHJ1ZTwvQXV0b0Fzc2lnblBvcnQ+CisgICAgICAgICAgPERldmVsb3BtZW50U2VydmVyUG9ydD41NzQ4MjwvRGV2ZWxvcG1lbnRTZXJ2ZXJQb3J0PgorICAgICAgICAgIDxEZXZlbG9wbWVudFNlcnZlclZQYXRoPi88L0RldmVsb3BtZW50U2VydmVyVlBhdGg+CisgICAgICAgICAgPElJU1VybD5odHRwOi8vbG9jYWxob3N0OjU3NDgyLzwvSUlTVXJsPgorICAgICAgICAgIDxOVExNQXV0aGVudGljYXRpb24+RmFsc2U8L05UTE1BdXRoZW50aWNhdGlvbj4KKyAgICAgICAgICA8VXNlQ3VzdG9tU2VydmVyPkZhbHNlPC9Vc2VDdXN0b21TZXJ2ZXI+CisgICAgICAgICAgPEN1c3RvbVNlcnZlclVybD4KKyAgICAgICAgICA8L0N1c3RvbVNlcnZlclVybD4KKyAgICAgICAgICA8U2F2ZVNlcnZlclNldHRpbmdzSW5Vc2VyRmlsZT5GYWxzZTwvU2F2ZVNlcnZlclNldHRpbmdzSW5Vc2VyRmlsZT4KKyAgICAgICAgPC9XZWJQcm9qZWN0UHJvcGVydGllcz4KKyAgICAgIDwvRmxhdm9yUHJvcGVydGllcz4KKyAgICA8L1Zpc3VhbFN0dWRpbz4KKyAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFByZUJ1aWxkRXZlbnQ+cm1kaXIgL3MgL3EgIiQoUHJvamVjdERpcilnZW4tY3NoYXJwIgorZGVsIC9mIC9xICIkKFByb2plY3REaXIpVGhyaWZ0SW1wbC5kbGwiCitTRVQgT1VUUFVUX0RJUj0kKFByb2plY3REaXIpCitTRVQgVEhSSUZUX0ZJTEU9JChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlx0ZXN0XFRocmlmdFRlc3QudGhyaWZ0Citmb3IgJTI1JTI1SSBpbiAoIiUyNU9VVFBVVF9ESVIlMjUiKSBkbyBzZXQgU0hPUlRfRElSPSUyNSUyNX5mc0kKK2ZvciAlMjUlMjVJIGluICgiJTI1VEhSSUZUX0ZJTEUlMjUiKSBkbyBzZXQgVEhSSUZUX1NIT1JUPSUyNSUyNX5mc0kKKyIkKFByb2plY3REaXIpXC4uXC4uXC4uXC4uXGNvbXBpbGVyXGNwcFxEZWJ1Z1x0aHJpZnQuZXhlIiAtLWdlbiBjc2hhcnA6YXN5bmM9dHJ1ZSAtbyAlMjVTSE9SVF9ESVIlMjUgJTI1VEhSSUZUX1NIT1JUJTI1CisiJChNU0J1aWxkVG9vbHNQYXRoKVxDc2MuZXhlIiAvdDpsaWJyYXJ5IC9vdXQ6IiQoUHJvamVjdERpcilUaHJpZnRJbXBsLmRsbCIgL3JlY3Vyc2U6IiQoUHJvamVjdERpcilnZW4tY3NoYXJwIlwqIC9yZWZlcmVuY2U6IiQoUHJvamVjdERpcikuLlwuLlxzcmNcYmluXERlYnVnXFRocmlmdDQ1LmRsbCI8L1ByZUJ1aWxkRXZlbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+IC0tPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL0hvbWUvSW5kZXguY3NodG1sIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvSG9tZS9JbmRleC5jc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjYTdkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL0hvbWUvSW5kZXguY3NodG1sCkBAIC0wLDAgKzEsMjUgQEAKK++7v0AqCisgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICAgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgICAgdW5kZXIgdGhlIExpY2Vuc2UuCisqQAorCitAeworICAgIFZpZXdCYWcuVGl0bGUgPSAiSG9tZSBQYWdlIjsKK30KKworPHA+QEh0bWwuQWN0aW9uTGluaygiVGVzdCBUaHJpZnQgQXN5bmMgU2VydmljZSIsICJUZXN0VGhyaWZ0QXN5bmMiKTwvcD4KKzxwPkBIdG1sLkFjdGlvbkxpbmsoIlRlc3QgVGhyaWZ0IFN5bmMgU2VydmljZSIsICJUZXN0VGhyaWZ0U3luYyIpPC9wPgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvU2hhcmVkL19MYXlvdXQuY3NodG1sIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvU2hhcmVkL19MYXlvdXQuY3NodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MWM5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9TaGFyZWQvX0xheW91dC5jc2h0bWwKQEAgLTAsMCArMSwzMCBAQAor77u/QCoKKyAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgICAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgICB1bmRlciB0aGUgTGljZW5zZS4KKypACisKKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+Cis8aGVhZD4KKyAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCIgLz4KKyAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CisgICAgPHRpdGxlPlRocmlmdCBBU1AuTkVUIFRlc3Q8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgQFJlbmRlckJvZHkoKQorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvV2ViLmNvbmZpZyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL1dlYi5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyMTEzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL1dlYi5jb25maWcKQEAgLTAsMCArMSw2MCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbj4KKyAgPGNvbmZpZ1NlY3Rpb25zPgorICAgIDxzZWN0aW9uR3JvdXAgbmFtZT0ic3lzdGVtLndlYi53ZWJQYWdlcy5yYXpvciIgdHlwZT0iU3lzdGVtLldlYi5XZWJQYWdlcy5SYXpvci5Db25maWd1cmF0aW9uLlJhem9yV2ViU2VjdGlvbkdyb3VwLCBTeXN0ZW0uV2ViLldlYlBhZ2VzLlJhem9yLCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSI+CisgICAgICA8c2VjdGlvbiBuYW1lPSJob3N0IiB0eXBlPSJTeXN0ZW0uV2ViLldlYlBhZ2VzLlJhem9yLkNvbmZpZ3VyYXRpb24uSG9zdFNlY3Rpb24sIFN5c3RlbS5XZWIuV2ViUGFnZXMuUmF6b3IsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1IiByZXF1aXJlUGVybWlzc2lvbj0iZmFsc2UiIC8+CisgICAgICA8c2VjdGlvbiBuYW1lPSJwYWdlcyIgdHlwZT0iU3lzdGVtLldlYi5XZWJQYWdlcy5SYXpvci5Db25maWd1cmF0aW9uLlJhem9yUGFnZXNTZWN0aW9uLCBTeXN0ZW0uV2ViLldlYlBhZ2VzLlJhem9yLCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSIgcmVxdWlyZVBlcm1pc3Npb249ImZhbHNlIiAvPgorICAgIDwvc2VjdGlvbkdyb3VwPgorICA8L2NvbmZpZ1NlY3Rpb25zPgorCisgIDxzeXN0ZW0ud2ViLndlYlBhZ2VzLnJhem9yPgorICAgIDxob3N0IGZhY3RvcnlUeXBlPSJTeXN0ZW0uV2ViLk12Yy5NdmNXZWJSYXpvckhvc3RGYWN0b3J5LCBTeXN0ZW0uV2ViLk12YywgVmVyc2lvbj01LjIuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiIC8+CisgICAgPHBhZ2VzIHBhZ2VCYXNlVHlwZT0iU3lzdGVtLldlYi5NdmMuV2ViVmlld1BhZ2UiPgorICAgICAgPG5hbWVzcGFjZXM+CisgICAgICAgIDxhZGQgbmFtZXNwYWNlPSJTeXN0ZW0uV2ViLk12YyIgLz4KKyAgICAgICAgPGFkZCBuYW1lc3BhY2U9IlN5c3RlbS5XZWIuTXZjLkFqYXgiIC8+CisgICAgICAgIDxhZGQgbmFtZXNwYWNlPSJTeXN0ZW0uV2ViLk12Yy5IdG1sIiAvPgorICAgICAgICA8YWRkIG5hbWVzcGFjZT0iU3lzdGVtLldlYi5PcHRpbWl6YXRpb24iLz4KKyAgICAgICAgPGFkZCBuYW1lc3BhY2U9IlN5c3RlbS5XZWIuUm91dGluZyIgLz4KKyAgICAgICAgPGFkZCBuYW1lc3BhY2U9IlRocmlmdE1WQ1Rlc3QiIC8+CisgICAgICA8L25hbWVzcGFjZXM+CisgICAgPC9wYWdlcz4KKyAgPC9zeXN0ZW0ud2ViLndlYlBhZ2VzLnJhem9yPgorCisgIDxhcHBTZXR0aW5ncz4KKyAgICA8YWRkIGtleT0id2VicGFnZXM6RW5hYmxlZCIgdmFsdWU9ImZhbHNlIiAvPgorICA8L2FwcFNldHRpbmdzPgorCisgIDxzeXN0ZW0ud2ViU2VydmVyPgorICAgIDxoYW5kbGVycz4KKyAgICAgIDxyZW1vdmUgbmFtZT0iQmxvY2tWaWV3SGFuZGxlciIvPgorICAgICAgPGFkZCBuYW1lPSJCbG9ja1ZpZXdIYW5kbGVyIiBwYXRoPSIqIiB2ZXJiPSIqIiBwcmVDb25kaXRpb249ImludGVncmF0ZWRNb2RlIiB0eXBlPSJTeXN0ZW0uV2ViLkh0dHBOb3RGb3VuZEhhbmRsZXIiIC8+CisgICAgPC9oYW5kbGVycz4KKyAgPC9zeXN0ZW0ud2ViU2VydmVyPgorCisgIDxzeXN0ZW0ud2ViPgorICAgIDxjb21waWxhdGlvbj4KKyAgICAgIDxhc3NlbWJsaWVzPgorICAgICAgICA8YWRkIGFzc2VtYmx5PSJTeXN0ZW0uV2ViLk12YywgVmVyc2lvbj01LjIuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiIC8+CisgICAgICA8L2Fzc2VtYmxpZXM+CisgICAgPC9jb21waWxhdGlvbj4KKyAgPC9zeXN0ZW0ud2ViPgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvX1ZpZXdTdGFydC5jc2h0bWwgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9fVmlld1N0YXJ0LmNzaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2RlMmVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvX1ZpZXdTdGFydC5jc2h0bWwKQEAgLTAsMCArMSwyMiBAQAor77u/QCoKKyAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgICAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgICB1bmRlciB0aGUgTGljZW5zZS4KKypACisKK0B7CisgICAgTGF5b3V0ID0gIn4vVmlld3MvU2hhcmVkL19MYXlvdXQuY3NodG1sIjsKK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5EZWJ1Zy5jb25maWcgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuRGVidWcuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZDU2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuRGVidWcuY29uZmlnCkBAIC0wLDAgKzEsNDUgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24geG1sbnM6eGR0PSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL1hNTC1Eb2N1bWVudC1UcmFuc2Zvcm0iPgorICA8IS0tCisgICAgSW4gdGhlIGV4YW1wbGUgYmVsb3csIHRoZSAiU2V0QXR0cmlidXRlcyIgdHJhbnNmb3JtIHdpbGwgY2hhbmdlIHRoZSB2YWx1ZSBvZgorICAgICJjb25uZWN0aW9uU3RyaW5nIiB0byB1c2UgIlJlbGVhc2VTUUxTZXJ2ZXIiIG9ubHkgd2hlbiB0aGUgIk1hdGNoIiBsb2NhdG9yCisgICAgZmluZHMgYW4gYXR0cmlidXRlICJuYW1lIiB0aGF0IGhhcyBhIHZhbHVlIG9mICJNeURCIi4KKworICAgIDxjb25uZWN0aW9uU3RyaW5ncz4KKyAgICAgIDxhZGQgbmFtZT0iTXlEQiIKKyAgICAgICAgY29ubmVjdGlvblN0cmluZz0iRGF0YSBTb3VyY2U9UmVsZWFzZVNRTFNlcnZlcjtJbml0aWFsIENhdGFsb2c9TXlSZWxlYXNlREI7SW50ZWdyYXRlZCBTZWN1cml0eT1UcnVlIgorICAgICAgICB4ZHQ6VHJhbnNmb3JtPSJTZXRBdHRyaWJ1dGVzIiB4ZHQ6TG9jYXRvcj0iTWF0Y2gobmFtZSkiLz4KKyAgICA8L2Nvbm5lY3Rpb25TdHJpbmdzPgorICAtLT4KKyAgPHN5c3RlbS53ZWI+CisgICAgPCEtLQorICAgICAgSW4gdGhlIGV4YW1wbGUgYmVsb3csIHRoZSAiUmVwbGFjZSIgdHJhbnNmb3JtIHdpbGwgcmVwbGFjZSB0aGUgZW50aXJlCisgICAgICA8Y3VzdG9tRXJyb3JzPiBzZWN0aW9uIG9mIHlvdXIgV2ViLmNvbmZpZyBmaWxlLgorICAgICAgTm90ZSB0aGF0IGJlY2F1c2UgdGhlcmUgaXMgb25seSBvbmUgY3VzdG9tRXJyb3JzIHNlY3Rpb24gdW5kZXIgdGhlCisgICAgICA8c3lzdGVtLndlYj4gbm9kZSwgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgdGhlICJ4ZHQ6TG9jYXRvciIgYXR0cmlidXRlLgorCisgICAgICA8Y3VzdG9tRXJyb3JzIGRlZmF1bHRSZWRpcmVjdD0iR2VuZXJpY0Vycm9yLmh0bSIKKyAgICAgICAgbW9kZT0iUmVtb3RlT25seSIgeGR0OlRyYW5zZm9ybT0iUmVwbGFjZSI+CisgICAgICAgIDxlcnJvciBzdGF0dXNDb2RlPSI1MDAiIHJlZGlyZWN0PSJJbnRlcm5hbEVycm9yLmh0bSIvPgorICAgICAgPC9jdXN0b21FcnJvcnM+CisgICAgLS0+CisgIDwvc3lzdGVtLndlYj4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5SZWxlYXNlLmNvbmZpZyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5SZWxlYXNlLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTdjMzQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLlJlbGVhc2UuY29uZmlnCkBAIC0wLDAgKzEsNDYgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24geG1sbnM6eGR0PSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL1hNTC1Eb2N1bWVudC1UcmFuc2Zvcm0iPgorICA8IS0tCisgICAgSW4gdGhlIGV4YW1wbGUgYmVsb3csIHRoZSAiU2V0QXR0cmlidXRlcyIgdHJhbnNmb3JtIHdpbGwgY2hhbmdlIHRoZSB2YWx1ZSBvZgorICAgICJjb25uZWN0aW9uU3RyaW5nIiB0byB1c2UgIlJlbGVhc2VTUUxTZXJ2ZXIiIG9ubHkgd2hlbiB0aGUgIk1hdGNoIiBsb2NhdG9yCisgICAgZmluZHMgYW4gYXR0cmlidXRlICJuYW1lIiB0aGF0IGhhcyBhIHZhbHVlIG9mICJNeURCIi4KKworICAgIDxjb25uZWN0aW9uU3RyaW5ncz4KKyAgICAgIDxhZGQgbmFtZT0iTXlEQiIKKyAgICAgICAgY29ubmVjdGlvblN0cmluZz0iRGF0YSBTb3VyY2U9UmVsZWFzZVNRTFNlcnZlcjtJbml0aWFsIENhdGFsb2c9TXlSZWxlYXNlREI7SW50ZWdyYXRlZCBTZWN1cml0eT1UcnVlIgorICAgICAgICB4ZHQ6VHJhbnNmb3JtPSJTZXRBdHRyaWJ1dGVzIiB4ZHQ6TG9jYXRvcj0iTWF0Y2gobmFtZSkiLz4KKyAgICA8L2Nvbm5lY3Rpb25TdHJpbmdzPgorICAtLT4KKyAgPHN5c3RlbS53ZWI+CisgICAgPGNvbXBpbGF0aW9uIHhkdDpUcmFuc2Zvcm09IlJlbW92ZUF0dHJpYnV0ZXMoZGVidWcpIiAvPgorICAgIDwhLS0KKyAgICAgIEluIHRoZSBleGFtcGxlIGJlbG93LCB0aGUgIlJlcGxhY2UiIHRyYW5zZm9ybSB3aWxsIHJlcGxhY2UgdGhlIGVudGlyZQorICAgICAgPGN1c3RvbUVycm9ycz4gc2VjdGlvbiBvZiB5b3VyIFdlYi5jb25maWcgZmlsZS4KKyAgICAgIE5vdGUgdGhhdCBiZWNhdXNlIHRoZXJlIGlzIG9ubHkgb25lIGN1c3RvbUVycm9ycyBzZWN0aW9uIHVuZGVyIHRoZQorICAgICAgPHN5c3RlbS53ZWI+IG5vZGUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIHRoZSAieGR0OkxvY2F0b3IiIGF0dHJpYnV0ZS4KKworICAgICAgPGN1c3RvbUVycm9ycyBkZWZhdWx0UmVkaXJlY3Q9IkdlbmVyaWNFcnJvci5odG0iCisgICAgICAgIG1vZGU9IlJlbW90ZU9ubHkiIHhkdDpUcmFuc2Zvcm09IlJlcGxhY2UiPgorICAgICAgICA8ZXJyb3Igc3RhdHVzQ29kZT0iNTAwIiByZWRpcmVjdD0iSW50ZXJuYWxFcnJvci5odG0iLz4KKyAgICAgIDwvY3VzdG9tRXJyb3JzPgorICAgIC0tPgorICA8L3N5c3RlbS53ZWI+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuY29uZmlnIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzU3ZDExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLmNvbmZpZwpAQCAtMCwwICsxLDkyIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorCis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KKyAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbmZpZ3VyZSB5b3VyIEFTUC5ORVQgYXBwbGljYXRpb24sIHBsZWFzZSB2aXNpdAorICBodHRwOi8vZ28ubWljcm9zb2Z0LmNvbS9md2xpbmsvP0xpbmtJZD0zMDE4ODAKKyAgLS0+Cis8Y29uZmlndXJhdGlvbj4KKyAgPGFwcFNldHRpbmdzPgorICAgIDxhZGQga2V5PSJ3ZWJwYWdlczpWZXJzaW9uIiB2YWx1ZT0iMy4wLjAuMCIgLz4KKyAgICA8YWRkIGtleT0id2VicGFnZXM6RW5hYmxlZCIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxhZGQga2V5PSJDbGllbnRWYWxpZGF0aW9uRW5hYmxlZCIgdmFsdWU9InRydWUiIC8+CisgICAgPGFkZCBrZXk9IlVub2J0cnVzaXZlSmF2YVNjcmlwdEVuYWJsZWQiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxhZGQga2V5PSJvd2luOkF1dG9tYXRpY0FwcFN0YXJ0dXAiIHZhbHVlPSJmYWxzZSIgLz4KKyAgPC9hcHBTZXR0aW5ncz4KKyAgPHN5c3RlbS53ZWI+CisgICAgPGF1dGhlbnRpY2F0aW9uIG1vZGU9Ik5vbmUiIC8+CisgICAgPGNvbXBpbGF0aW9uIGRlYnVnPSJ0cnVlIiB0YXJnZXRGcmFtZXdvcms9IjQuNSIgLz4KKyAgICA8aHR0cFJ1bnRpbWUgdGFyZ2V0RnJhbWV3b3JrPSI0LjUiIC8+CisgIDwvc3lzdGVtLndlYj4KKyAgPHN5c3RlbS53ZWJTZXJ2ZXI+CisgICAgPG1vZHVsZXM+CisgICAgICA8cmVtb3ZlIG5hbWU9IkZvcm1zQXV0aGVudGljYXRpb24iIC8+CisgICAgPC9tb2R1bGVzPgorICAgIDxoYW5kbGVycz4KKyAgICAgIDxhZGQgbmFtZT0iQXN5bmNIdHRwSGFuZGxlciIgdmVyYj0iKiIgcGF0aD0iQXN5bmMudGhyaWZ0IiB0eXBlPSJUaHJpZnRNVkNUZXN0LkFzeW5jSHR0cEhhbmRsZXIsIFRocmlmdE1WQ1Rlc3QiIC8+CisgICAgICA8YWRkIG5hbWU9IlN5bmNIdHRwSGFuZGxlciIgdmVyYj0iKiIgcGF0aD0iU3luYy50aHJpZnQiIHR5cGU9IlRocmlmdE1WQ1Rlc3QuU3luY0h0dHBIYW5kbGVyLCBUaHJpZnRNVkNUZXN0IiAvPgorICAgIDwvaGFuZGxlcnM+CisgIDwvc3lzdGVtLndlYlNlcnZlcj4KKyAgPHJ1bnRpbWU+CisgICAgPGFzc2VtYmx5QmluZGluZyB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjEiPgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJNaWNyb3NvZnQuT3dpbi5TZWN1cml0eSIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMC4wLjAuMC0zLjAuMS4wIiBuZXdWZXJzaW9uPSIzLjAuMS4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iTWljcm9zb2Z0Lk93aW4uU2VjdXJpdHkuT0F1dGgiIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjAuMC4wLjAtMy4wLjEuMCIgbmV3VmVyc2lvbj0iMy4wLjEuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9Ik1pY3Jvc29mdC5Pd2luLlNlY3VyaXR5LkNvb2tpZXMiIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjAuMC4wLjAtMy4wLjEuMCIgbmV3VmVyc2lvbj0iMy4wLjEuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9Ik1pY3Jvc29mdC5Pd2luIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIwLjAuMC4wLTMuMC4xLjAiIG5ld1ZlcnNpb249IjMuMC4xLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJOZXd0b25zb2Z0Lkpzb24iIGN1bHR1cmU9Im5ldXRyYWwiIHB1YmxpY0tleVRva2VuPSIzMGFkNGZlNmIyYTZhZWVkIiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjAuMC4wLjAtNi4wLjAuMCIgbmV3VmVyc2lvbj0iNi4wLjAuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5XZWIuT3B0aW1pemF0aW9uIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIxLjAuMC4wLTEuMS4wLjAiIG5ld1ZlcnNpb249IjEuMS4wLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJXZWJHcmVhc2UiIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjAuMC4wLjAtMS41LjIuMTQyMzQiIG5ld1ZlcnNpb249IjEuNS4yLjE0MjM0IiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtLldlYi5IZWxwZXJzIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIxLjAuMC4wLTMuMC4wLjAiIG5ld1ZlcnNpb249IjMuMC4wLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0uV2ViLk12YyIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMS4wLjAuMC01LjIuMy4wIiBuZXdWZXJzaW9uPSI1LjIuMy4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtLldlYi5XZWJQYWdlcyIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMS4wLjAuMC0zLjAuMC4wIiBuZXdWZXJzaW9uPSIzLjAuMC4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICA8L2Fzc2VtYmx5QmluZGluZz4KKyAgPC9ydW50aW1lPgorPC9jb25maWd1cmF0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L2Zhdmljb24uaWNvIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvZmF2aWNvbi5pY28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhNzk5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L2Zhdmljb24uaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L3BhY2thZ2VzLmNvbmZpZyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L3BhY2thZ2VzLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGM4NDE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvcGFja2FnZXMuY29uZmlnCkBAIC0wLDAgKzEsMjUgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cGFja2FnZXM+CisgIDxwYWNrYWdlIGlkPSJNaWNyb3NvZnQuQXNwTmV0Lk12YyIgdmVyc2lvbj0iNS4yLjMiIHRhcmdldEZyYW1ld29yaz0ibmV0NDUiIC8+CisgIDxwYWNrYWdlIGlkPSJNaWNyb3NvZnQuQXNwTmV0LlJhem9yIiB2ZXJzaW9uPSIzLjIuMyIgdGFyZ2V0RnJhbWV3b3JrPSJuZXQ0NSIgLz4KKyAgPHBhY2thZ2UgaWQ9Ik1pY3Jvc29mdC5Bc3BOZXQuV2ViUGFnZXMiIHZlcnNpb249IjMuMi4zIiB0YXJnZXRGcmFtZXdvcms9Im5ldDQ1IiAvPgorICA8cGFja2FnZSBpZD0iTWljcm9zb2Z0LldlYi5JbmZyYXN0cnVjdHVyZSIgdmVyc2lvbj0iMS4wLjAuMCIgdGFyZ2V0RnJhbWV3b3JrPSJuZXQ0NSIgLz4KKzwvcGFja2FnZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2QvTWFrZWZpbGUuYW0gYi9saWIvZC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTgxMjE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxOTQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitBVVRPTUFLRV9PUFRJT05TID0gc2VyaWFsLXRlc3RzCisKK1NVQkRJUlMgPSAuCisKK2lmIFdJVEhfVEVTVFMKK1NVQkRJUlMgKz0gdGVzdAorZW5kaWYKKworIworIyBFbnVtZXJhdGlvbiBvZiBhbGwgdGhlIHB1YmxpYyBhbmQgcHJpdmF0ZSBtb2R1bGVzLgorIworIyBXZSB1bmNvbmRpdGlvbmFsbHkgaW5zdGFsbCBhbGwgb2YgdGhlbSwgZXZlbiBpZiBsaWJldmVudCBvciBPcGVuU1NMIGFyZQorIyBub3QgYXZhaWxhYmxlLCBidXQgYnVpbGQgdGhlIHJlc3BlY3RpdmUgbGlicmFyaWVzIG9ubHkgaWYgdGhlIERlaW1vcyBoZWFkZXJzCisjIGNvdWxkIGJlIGZvdW5kLgorIworZF90aHJpZnRtb2R1bGVzID0gJChhZGRwcmVmaXggdGhyaWZ0LywgYmFzZSkKK2RfdGhyaWZ0ZGlyID0gJChEX0lNUE9SVF9QUkVGSVgpL3RocmlmdAorZF90aHJpZnRfREFUQSA9ICQoYWRkcHJlZml4IHNyYy8sICQoYWRkc3VmZml4IC5kLCAkKGRfdGhyaWZ0bW9kdWxlcykpKQorCitkX2FzeW5jbW9kdWxlcyA9ICQoYWRkcHJlZml4IHRocmlmdC9hc3luYy8sIGJhc2UgbGliZXZlbnQgc29ja2V0IHNzbCkKK2RfYXN5bmNkaXIgPSAkKGRfdGhyaWZ0ZGlyKS9hc3luYworZF9hc3luY19EQVRBID0gJChhZGRwcmVmaXggc3JjLywgJChhZGRzdWZmaXggLmQsICQoZF9hc3luY21vZHVsZXMpKSkKKworZF9jb2RlZ2VubW9kdWxlcyA9ICQoYWRkcHJlZml4IHRocmlmdC9jb2RlZ2VuLywgYXN5bmNfY2xpZW50IFwKKwlhc3luY19jbGllbnRfcG9vbCBiYXNlIGNsaWVudCBjbGllbnRfcG9vbCBwcm9jZXNzb3IpCisjZF9jb2RlZ2VubW9kdWxlcyA9ICQoYWRkcHJlZml4IHRocmlmdC9jb2RlZ2VuLywgYXN5bmNfY2xpZW50IFwKKyMJYXN5bmNfY2xpZW50X3Bvb2wgYmFzZSBjbGllbnQgY2xpZW50X3Bvb2wgaWRsZ2VuIHByb2Nlc3NvcikKKworZF9jb2RlZ2VuZGlyID0gJChkX3RocmlmdGRpcikvY29kZWdlbgorZF9jb2RlZ2VuX0RBVEEgPSAkKGFkZHByZWZpeCBzcmMvLCAkKGFkZHN1ZmZpeCAuZCwgJChkX2NvZGVnZW5tb2R1bGVzKSkpCisKK2RfcHJvdG9jb2xtb2R1bGVzID0gJChhZGRwcmVmaXggdGhyaWZ0L3Byb3RvY29sLywgYmFzZSBiaW5hcnkgY29tcGFjdCBqc29uIFwKKwlwcm9jZXNzb3IpCitkX3Byb3RvY29sZGlyID0gJChkX3RocmlmdGRpcikvcHJvdG9jb2wKK2RfcHJvdG9jb2xfREFUQSA9ICQoYWRkcHJlZml4IHNyYy8sICQoYWRkc3VmZml4IC5kLCAkKGRfcHJvdG9jb2xtb2R1bGVzKSkpCisKK2Rfc2VydmVybW9kdWxlcyA9ICQoYWRkcHJlZml4IHRocmlmdC9zZXJ2ZXIvLCBiYXNlIHNpbXBsZSBub25ibG9ja2luZyBcCisJdGFza3Bvb2wgdGhyZWFkZWQpCitkX3NlcnZlcmRpciA9ICQoZF90aHJpZnRkaXIpL3NlcnZlcgorZF9zZXJ2ZXJfREFUQSA9ICQoYWRkcHJlZml4IHNyYy8sICQoYWRkc3VmZml4IC5kLCAkKGRfc2VydmVybW9kdWxlcykpKQorCitkX3NlcnZlcnRyYW5zcG9ydG1vZHVsZXMgPSAkKGFkZHByZWZpeCB0aHJpZnQvc2VydmVyL3RyYW5zcG9ydC8sIGJhc2Ugc29ja2V0IHNzbCkKK2Rfc2VydmVydHJhbnNwb3J0ZGlyID0gJChkX3RocmlmdGRpcikvc2VydmVyL3RyYW5zcG9ydAorZF9zZXJ2ZXJ0cmFuc3BvcnRfREFUQSA9ICQoYWRkcHJlZml4IHNyYy8sICQoYWRkc3VmZml4IC5kLCBcCisJJChkX3NlcnZlcnRyYW5zcG9ydG1vZHVsZXMpKSkKKworZF90cmFuc3BvcnRtb2R1bGVzID0gJChhZGRwcmVmaXggdGhyaWZ0L3RyYW5zcG9ydC8sIGJhc2UgYnVmZmVyZWQgZmlsZSBcCisJZnJhbWVkIGh0dHAgbWVtb3J5IHBpcGVkIHJhbmdlIHNvY2tldCBzc2wgemxpYikKK2RfdHJhbnNwb3J0ZGlyID0gJChkX3RocmlmdGRpcikvdHJhbnNwb3J0CitkX3RyYW5zcG9ydF9EQVRBID0gJChhZGRwcmVmaXggc3JjLywgJChhZGRzdWZmaXggLmQsICQoZF90cmFuc3BvcnRtb2R1bGVzKSkpCisKK2RfdXRpbG1vZHVsZXMgPSAkKGFkZHByZWZpeCB0aHJpZnQvdXRpbC8sIGF3YWl0YWJsZSBjYW5jZWxsYXRpb24gZnV0dXJlIFwKKwloYXNoc2V0KQorZF91dGlsZGlyID0gJChkX3RocmlmdGRpcikvdXRpbAorZF91dGlsX0RBVEEgPSAkKGFkZHByZWZpeCBzcmMvLCAkKGFkZHN1ZmZpeCAuZCwgJChkX3V0aWxtb2R1bGVzKSkpCisKK2RfaW50ZXJuYWxtb2R1bGVzID0gJChhZGRwcmVmaXggdGhyaWZ0L2ludGVybmFsLywgYWxnb3JpdGhtIGNvZGVnZW4gY3RmZSBcCisJZW5kaWFuIHJlc291cmNlX3Bvb2wgc29ja2V0IHNzbCBzc2xfYmlvIHRyYWl0cykKK2RfaW50ZXJuYWxkaXIgPSAkKGRfdGhyaWZ0ZGlyKS9pbnRlcm5hbAorZF9pbnRlcm5hbF9EQVRBID0gJChhZGRwcmVmaXggc3JjLywgJChhZGRzdWZmaXggLmQsICQoZF9pbnRlcm5hbG1vZHVsZXMpKSkKKworZF90ZXN0bW9kdWxlcyA9ICQoYWRkcHJlZml4IHRocmlmdC9pbnRlcm5hbC90ZXN0LywgcHJvdG9jb2wgc2VydmVyKQorZF90ZXN0ZGlyID0gJChkX2ludGVybmFsZGlyKS90ZXN0CitkX3Rlc3RfREFUQSA9ICQoYWRkcHJlZml4IHNyYy8sICQoYWRkc3VmZml4IC5kLCAkKGRfdGVzdG1vZHVsZXMpKSkKKworZF9wdWJsaWNtb2R1bGVzID0gJChkX3RocmlmdG1vZHVsZXMpICQoZF9hc3luY21vZHVsZXMpIFwKKwkkKGRfY29kZWdlbm1vZHVsZXMpICQoZF9wcm90b2NvbG1vZHVsZXMpICQoZF9zZXJ2ZXJtb2R1bGVzKSBcCisJJChkX3NlcnZlcnRyYW5zcG9ydG1vZHVsZXMpICQoZF90cmFuc3BvcnRtb2R1bGVzKSAkKGRfdXRpbG1vZHVsZXMpCitkX3B1YmxpY3NvdXJjZXMgPSAkKGFkZHByZWZpeCBzcmMvLCAkKGFkZHN1ZmZpeCAuZCwgJChkX3B1YmxpY21vZHVsZXMpKSkKKworZF9tb2R1bGVzID0gJChkX3B1YmxpY21vZHVsZXMpICQoZF9pbnRlcm5hbG1vZHVsZXMpICQoZF90ZXN0bW9kdWxlcykKKworIyBMaXN0IG1vZHVsZXMgd2l0aCBleHRlcm5hbCBkZXBlbmRlbmNpZXMgYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhlIG1haW4gbGlzdAorZF9saWJldmVudF9kZXBlbmRlbnRfbW9kdWxlcyA9IHRocmlmdC9hc3luYy9saWJldmVudCB0aHJpZnQvc2VydmVyL25vbmJsb2NraW5nCitkX29wZW5zc2xfZGVwZW5kZW50X21vZHVsZXMgPSB0aHJpZnQvYXN5bmMvc3NsIHRocmlmdC9pbnRlcm5hbC9zc2wgXAorCXRocmlmdC9pbnRlcm5hbC9zc2xfYmlvIHRocmlmdC90cmFuc3BvcnQvc3NsIHRocmlmdC9zZXJ2ZXIvdHJhbnNwb3J0L3NzbAorZF9tYWluX21vZHVsZXMgPSAkKGZpbHRlci1vdXQgJChkX2xpYmV2ZW50X2RlcGVuZGVudF9tb2R1bGVzKSBcCisJJChkX29wZW5zc2xfZGVwZW5kZW50X21vZHVsZXMpLCQoZF9tb2R1bGVzKSkKKworCitkX2xpYl9mbGFncyA9IC13IC13aSAtSXNyYyAtbGliCithbGxfdGFyZ2V0cyA9CisKKyMKKyMgbGliZXZlbnQtZGVwZW5kZW50IG1vZHVsZXMuCisjCitpZiBIQVZFX0RFSU1PU19FVkVOVDIKKyQoRF9FVkVOVF9MSUJfTkFNRSk6ICQoYWRkcHJlZml4IHNyYy8sICQoYWRkc3VmZml4IC5kLCAkKGRfbGliZXZlbnRfZGVwZW5kZW50X21vZHVsZXMpKSkKKwkkKERNRCkgLW9mJChEX0VWRU5UX0xJQl9OQU1FKSAkKGRfbGliX2ZsYWdzKSAkXgorYWxsX3RhcmdldHMgKz0gJChEX0VWRU5UX0xJQl9OQU1FKQorZW5kaWYKKworIworIyBPcGVuU1NMLWRlcGVuZGVudCBtb2R1bGVzLgorIworaWYgSEFWRV9ERUlNT1NfT1BFTlNTTAorJChEX1NTTF9MSUJfTkFNRSk6ICQoYWRkcHJlZml4IHNyYy8sICQoYWRkc3VmZml4IC5kLCAkKGRfb3BlbnNzbF9kZXBlbmRlbnRfbW9kdWxlcykpKQorCSQoRE1EKSAtb2YkKERfU1NMX0xJQl9OQU1FKSAkKGRfbGliX2ZsYWdzKSAkXgorYWxsX3RhcmdldHMgKz0gJChEX1NTTF9MSUJfTkFNRSkKK2VuZGlmCisKKyMKKyMgTWFpbiBsaWJyYXJ5IHRhcmdldC4KKyMKKyQoRF9MSUJfTkFNRSk6ICQoYWRkcHJlZml4IHNyYy8sICQoYWRkc3VmZml4IC5kLCAkKGRfbWFpbl9tb2R1bGVzKSkpCisJJChETUQpIC1vZiQoRF9MSUJfTkFNRSkgJChkX2xpYl9mbGFncykgJF4KK2FsbF90YXJnZXRzICs9ICQoRF9MSUJfTkFNRSkKKworCisjCisjIERvY3VtZW50YXRpb24gdGFyZ2V0IChyZXF1aXJlcyBEaWwpLgorIworZG9jczogJChkX3B1YmxpY3NvdXJjZXMpIHNyYy90aHJpZnQvaW5kZXguZAorCWRpbCBkZG9jIGRvY3MgLWhsIC0ta2FuZGlsICReCisKKworIworIyBIb29rIGN1c3RvbSBsaWJyYXJ5IHRhcmdldHMgaW50byB0aGUgYXV0b21ha2UgYWxsL2luc3RhbGwgdGFyZ2V0cy4KKyMKK2FsbC1sb2NhbDogJChhbGxfdGFyZ2V0cykKKworaW5zdGFsbC1leGVjLWxvY2FsOgorCSQoSU5TVEFMTF9QUk9HUkFNKSAkKGFsbF90YXJnZXRzKSAkKERFU1RESVIpJChsaWJkaXIpCisKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXJmIGRvY3MgJChEX0xJQl9OQU1FKSAkKERfRVZFTlRfTElCX05BTUUpICQoRF9TU0xfTElCX05BTUUpIHVuaXR0ZXN0CisKKworIworIyBVbml0IHRlc3RzIChidWlsdCBib3RoIGluIGRlYnVnIGFuZCByZWxlYXNlIG1vZGUpLgorIworZF90ZXN0X2ZsYWdzID0gLXVuaXR0ZXN0IC13IC13aSAtSSQodG9wX3NyY2RpcikvbGliL2Qvc3JjCisKKyMgVGhlcmUganVzdCBtdXN0IGJlIHNvbWUgd2F5IHRvIHJlYXNzaWduIGEgdmFyaWFibGUgd2l0aG91dCB3YXJuaW5ncyBpbgorIyBBdXRvbWFrZS4uLgorZF90ZXN0X21vZHVsZXNfXyA9ICQoZF9tb2R1bGVzKQorCitpZiBXSVRIX0RfRVZFTlRfVEVTVFMKK2RfdGVzdF9mbGFncyArPSAkKERNRF9MSUJFVkVOVF9GTEFHUykKK2RfdGVzdF9tb2R1bGVzXyA9ICQoZF90ZXN0X21vZHVsZXNfXykKK2Vsc2UKK2RfdGVzdF9tb2R1bGVzXyA9ICQoZmlsdGVyLW91dCAkKGRfbGliZXZlbnRfZGVwZW5kZW50X21vZHVsZXMpLCAkKGRfdGVzdF9tb2R1bGVzX18pKQorZW5kaWYKKworaWYgV0lUSF9EX1NTTF9URVNUUworZF90ZXN0X2ZsYWdzICs9ICQoRE1EX09QRU5TU0xfRkxBR1MpCitkX3Rlc3RfbW9kdWxlcyA9ICQoZF90ZXN0X21vZHVsZXNfKQorZWxzZQorZF90ZXN0X21vZHVsZXMgPSAkKGZpbHRlci1vdXQgJChkX29wZW5zc2xfZGVwZW5kZW50X21vZHVsZXMpLCAkKGRfdGVzdF9tb2R1bGVzXykpCitlbmRpZgorCit1bml0dGVzdC9lbXB0eW1haW4uZDogdW5pdHRlc3QvLmRpcmVjdG9yeQorCUBlY2hvICd2b2lkIG1haW4oKXt9JyA+JEAKKwordW5pdHRlc3QvLmRpcmVjdG9yeToKKwlta2RpciAtcCB1bml0dGVzdCB8fCBleGlzdHMgdW5pdHRlc3QKKwl0b3VjaCAkQAorCit1bml0dGVzdC9kZWJ1Zy8lOiBzcmMvJS5kICQoYWxsX3RhcmdldHMpIHVuaXR0ZXN0L2VtcHR5bWFpbi5kCisJJChETUQpIC1nIC1vZiQoc3Vic3QgLywkKERNRF9PRl9ESVJTRVApLCRAKSAkKGRfdGVzdF9mbGFncykgJF4KKwordW5pdHRlc3QvcmVsZWFzZS8lOiBzcmMvJS5kICQoYWxsX3RhcmdldHMpIHVuaXR0ZXN0L2VtcHR5bWFpbi5kCisJJChETUQpIC1PIC1yZWxlYXNlIC1vZiQoc3Vic3QgLywkKERNRF9PRl9ESVJTRVApLCRAKSAkKGRfdGVzdF9mbGFncykgJF4KKworVEVTVFMgPSAkKGFkZHByZWZpeCB1bml0dGVzdC9kZWJ1Zy8sICQoZF90ZXN0X21vZHVsZXMpKSBcCisJJChhZGRwcmVmaXggdW5pdHRlc3QvcmVsZWFzZS8sICQoZF90ZXN0X21vZHVsZXMpKQorCitwcmVjcm9zczogYWxsLWxvY2FsCisJJChNQUtFKSAtQyB0ZXN0IHByZWNyb3NzCisKK0VYVFJBX0RJU1QgPSBcCisJc3JjIFwKKwl0ZXN0IFwKKwlSRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9kL1JFQURNRS5tZCBiL2xpYi9kL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDM3ZTRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNTggQEAKK1RocmlmdCBEIFNvZnR3YXJlIExpYnJhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworTGljZW5zZQorLS0tLS0tLQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworVGVzdGluZworLS0tLS0tLQorCitEIHN1cHBvcnQgaW4gVGhyaWZ0IGlzIGNvdmVyZWQgYnkgdHdvIHNldHMgb2YgdGVzdHM6IGZpcnN0LAordGhlIHVuaXQgdGVzdCBibG9ja3MgY29udGFpbmVkIGluIHRoZSBEIHNvdXJjZSBmaWxlcywgYW5kCitzZWNvbmQsIHRoZSBtb3JlIGV4dGVuc2l2ZSB0ZXN0aW5nIGFwcGxpY2F0aW9ucyBpbiB0aGUgdGVzdC8KK3N1YmRpcmVjdG9yeSwgd2hpY2ggYWxzbyBtYWtlIHVzZSBvZiB0aGUgVGhyaWZ0IGNvbXBpbGVyLgorQm90aCBhcmUgYnVpbHQgd2hlbiBydW5uaW5nICJtYWtlIGNoZWNrIiwgYnV0IG9ubHkgdGhlCit1bml0IHRlc3RzIGFyZSBpbW1lZGlhdGVseSBydW4sIGhvd2V2ZXIg4oCTIHRoZSBzZXBhcmF0ZSB0ZXN0CitjYXNlcyB0eXBpY2FsbHkgcnVuIGxvbmdlciBvciByZXF1aXJlIG1hbnVhbCBpbnRlcnZlbnRpb24uCitJdCBtaWdodCBhbHNvIGJlIHBydWRlbnQgdG8gcnVuIHRoZSBpbmRlcGVuZGVudCB0ZXN0cywKK3doaWNoIHR5cGljYWxseSBjb25zaXN0IG9mIGEgc2VydmVyIGFuZCBhIGNsaWVudCBwYXJ0LAorYWdhaW5zdCB0aGUgb3RoZXIgbGFuZ3VhZ2UgaW1wbGVtZW50YXRpb25zLgorCitUbyBidWlsZCB0aGUgdW5pdCB0ZXN0cyBvbiBXaW5kb3dzLCB0aGUgZWFzaWVzdCB3YXkgbWlnaHQKK2JlIHRvIG1hbnVhbGx5IGNyZWF0ZSBhIGZpbGUgY29udGFpbmluZyBhbiBlbXB0eSBtYWluKCkgYW5kCitpbnZva2UgdGhlIGNvbXBpbGVyIGJ5IHJ1bm5pbmcgdGhlIGZvbGxvd2luZyBpbiB0aGUgc3JjLworZGlyZWN0b3J5IChQb3dlclNoZWxsIHN5bnRheCk6CisKK2RtZCAtb2Z1bml0dGVzdCAtdW5pdHRlc3QgLXcgJChkaXIgLXIgLWZpbHRlciAnKi5kJyAtbmFtZSkKKworSWYgeW91IHdhbnQgdG8gcnVuIHRoZSB0ZXN0IGNsaWVudHMvc2VydmVycyBpbiBPcGVuU1NMCittb2RlLCB5b3UgaGF2ZSB0byBwcm92aWRlIMK7c2VydmVyLXByaXZhdGUta2V5LnBlbcKrIGFuZAorwrtzZXJ2ZXItY2VydGlmaWNhdGUucGVtwqsgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSB0aGUgc2VydmVyCitleGVjdXRhYmxlIHJlc2lkZXMgaW4sIGFuZCBhIMK7dHJ1c3RlZC1jYS1jZXJ0aWZpY2F0ZS5wZW3CqworZmlsZSBmb3IgdGhlIGNsaWVudC4gVGhlIGVhc2llc3Qgd2F5IGlzIHRvIGdlbmVyYXRlIGEgbmV3CitzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZSB1c2luZyB0aGUgcHJvdmlkZWQgY29uZmlnIGZpbGUKKyhvcGVuc3NsLnRlc3QuY25mKToKKworb3BlbnNzbCByZXEgLW5ldyAteDUwOSAtbm9kZXMgLWNvbmZpZyBvcGVuc3NsLnRlc3QuY25mIFwKKyAgLW91dCBzZXJ2ZXItY2VydGlmaWNhdGUucGVtCitjYXQgc2VydmVyLWNlcnRpZmljYXRlLnBlbSA+IHRydXN0ZWQtY2EtY2VydGlmaWNhdGUucGVtCisKK1RoaXMgc3RlcHMgYXJlIGFsc28gcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlCitBdXRvdG9vbHMgYnVpbGQgc3lzdGVtIGlmIHRoZSBmaWxlcyBhcmUgbm90IHByZXNlbnQuCmRpZmYgLS1naXQgYS9saWIvZC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2QvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvYmFzZS5kIGIvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9iYXNlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlYmMzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvYmFzZS5kCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogRGVmaW5lcyB0aGUgaW50ZXJmYWNlIHVzZWQgZm9yIGNsaWVudC1zaWRlIGhhbmRsaW5nIG9mIGFzeW5jaHJvbm91cworICogSS9PIG9wZXJhdGlvbnMsIGJhc2VkIG9uIGNvcm91dGluZXMuCisgKgorICogVGhlIG1haW4gcGllY2Ugb2YgdGhlIMK7Y2xpZW50IHNpZGXCqyAoZS5nLiBmb3IgVEFzeW5jQ2xpZW50IHVzZXJzKSBvZiB0aGUKKyAqIEFQSSBpcyBURnV0dXJlLCB3aGljaCByZXByZXNlbnRzIGFuIGFzeW5jaHJvbm91c2x5IGV4ZWN1dGVkIG9wZXJhdGlvbiwKKyAqIHdoaWNoIGNhbiBoYXZlIGEgcmV0dXJuIHZhbHVlLCB0aHJvdyBleGNlcHRpb25zLCBhbmQgd2hpY2ggY2FuIGJlIHdhaXRlZAorICogdXBvbi4KKyAqCisgKiBPbiB0aGUgwrtpbXBsZW1lbnRhdGlvbiBzaWRlwqssIHRoZSBpZGVhIGlzIHRoYXQgYnkgdXNpbmcgYSBUQXN5bmNUcmFuc3BvcnQKKyAqIGluc3RlYWQgb2YgYSBub3JtYWwgVFRyYW5zcG9ydCBhbmQgZXhlY3V0aW5nIHRoZSB3b3JrIHRocm91Z2ggYQorICogVEFzeW5jTWFuYWdlciwgdGhlIHNhbWUgY29kZSBhcyBmb3Igc3luY2hyb25vdXMgSS9PIGNhbiBiZSB1c2VkIGZvcgorICogYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBhcyB3ZWxsLCBmb3IgZXhhbXBsZToKKyAqCisgKiAtLS0KKyAqIGF1dG8gc29ja2V0ID0gbmV3IFRBc3luY1NvY2tldChzb21lVEFzeW5jU29ja2V0TWFuYWdlcigpLCBob3N0LCBwb3J0KTsKKyAqIC8vIOKApgorICogc29ja2V0LmFzeW5jTWFuYWdlci5leGVjdXRlKHNvY2tldCwgeworICogICBTb21lVGhyaWZ0U3RydWN0IHM7CisgKgorICogICAvLyBXYWl0aW5nIGZvciBzb2NrZXQgSS9PIHdpbGwgbm90IGJsb2NrIGFuIGVudGlyZSB0aHJlYWQgYnV0IGNhdXNlCisgKiAgIC8vIHRoZSBhc3luYyBtYW5hZ2VyIHRvIGV4ZWN1dGUgYW5vdGhlciB0YXNrIGluIHRoZSBtZWFudGltZSwgYmVjYXVzZQorICogICAvLyB3ZSBhcmUgdXNpbmcgVEFzeW5jU29ja2V0IGluc3RlYWQgb2YgVFNvY2tldC4KKyAqICAgcy5yZWFkKHNvY2tldCk7CisgKgorICogICAvLyBEbyBzb21ldGhpbmcgd2l0aCBzLCBlLmcuIHNldCBhIFRQcm9taXNlIHJlc3VsdCB0byBpdC4KKyAqICAgd3JpdGVsbihzKTsKKyAqIH0pOworICogLS0tCisgKi8KK21vZHVsZSB0aHJpZnQuYXN5bmMuYmFzZTsKKworaW1wb3J0IGNvcmUudGltZSA6IER1cmF0aW9uLCBkdXI7CitpbXBvcnQgc3RkLnNvY2tldC8rIDogU29ja2V0Ky87IC8vIERNRCBAQEJVRzMxNEBACitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKKworLyoqCisgKiBNYW5hZ2VzIG9uZSBvciBtb3JlIGFzeW5jaHJvbm91cyB0cmFuc3BvcnQgcmVzb3VyY2VzIChlLmcuIHNvY2tldHMgaW4gdGhlCisgKiBjYXNlIG9mIFRBc3luY1NvY2tldE1hbmFnZXIpIGFuZCBhbGxvd3Mgd29yayBpdGVtcyB0byBiZSBzdWJtaXR0ZWQgZm9yIHRoZW0uCisgKgorICogSW1wbGVtZW50YXRpb25zIHdpbGwgdHlwaWNhbGx5IHJ1biBvbmUgb3IgbW9yZSBiYWNrZ3JvdW5kIHRocmVhZHMgZm9yCisgKiBleGVjdXRpbmcgdGhlIHdvcmssIHdoaWNoIGlzIG9uZSBvZiB0aGUgcmVhc29ucyBmb3IgYSBUQXN5bmNNYW5hZ2VyIHRvIGJlCisgKiB1c2VkLiBFYWNoIHdvcmsgaXRlbSBpcyBydW4gaW4gaXRzIG93biBmaWJlciBhbmQgaXMgZXhwZWN0ZWQgdG8geWllbGQoKSBhd2F5CisgKiB3aGlsZSB3YWl0aW5nIGZvciB0aW1lLWNvbnN1bWluZyBvcGVyYXRpb25zLgorICoKKyAqIFRoZSBzZWNvbmQgaW1wb3J0YW50IHB1cnBvc2Ugb2YgVEFzeW5jTWFuYWdlciBpcyB0byBzZXJpYWxpemUgYWNjZXNzIHRvCisgKiB0aGUgdHJhbnNwb3J0IHJlc291cmNlcyDigJMgd2l0aG91dCB0YWtpbmcgY2FyZSBvZiB0aGF0LCBlLmcuIGlzc3VpbmcgbXVsdGlwbGUKKyAqIFJQQyBjYWxscyBvdmVyIHRoZSBzYW1lIGNvbm5lY3Rpb24gaW4gcmFwaWQgc3VjY2Vzc2lvbiB3b3VsZCBsaWtlbHkgbGVhZCB0bworICogbW9yZSB0aGFuIG9uZSByZXF1ZXN0IGJlaW5nIHdyaXR0ZW4gYXQgdGhlIHNhbWUgdGltZSwgY2F1c2luZyBvbmx5IGdhcmJhZ2UKKyAqIHRvIGFycml2ZSBhdCB0aGUgcmVtb3RlIGVuZC4KKyAqCisgKiBBbGwgbWV0aG9kcyBhcmUgdGhyZWFkLXNhZmUuCisgKi8KK2ludGVyZmFjZSBUQXN5bmNNYW5hZ2VyIHsKKyAgLyoqCisgICAqIFN1Ym1pdHMgYSB3b3JrIGl0ZW0gdG8gYmUgZXhlY3V0ZWQgYXN5bmNocm9ub3VzbHkuCisgICAqCisgICAqIEFjY2VzcyB0byBhc255YyB0cmFuc3BvcnRzIGlzIHNlcmlhbGl6ZWQg4oCTIGlmIHR3byB3b3JrIGl0ZW1zIGFzc29jaWF0ZWQKKyAgICogd2l0aCB0aGUgc2FtZSB0cmFuc3BvcnQgYXJlIHN1Ym1pdHRlZCwgdGhlIHNlY29uZCBkZWxlZ2F0ZSB3aWxsIG5vdCBiZQorICAgKiBpbnZva2VkIHVudGlsIHRoZSBmaXJzdCBoYXMgcmV0dXJuZWQsIGV2ZW4gaXQgdGhlIGxhdHRlciBjb250ZXh0LXN3aXRjaGVzCisgICAqIGF3YXkgKGJlY2F1c2UgaXQgaXMgd2FpdGluZyBmb3IgSS9PKSBhbmQgdGhlIGFzeW5jIG1hbmFnZXIgaXMgaWRsZQorICAgKiBvdGhlcndpc2UuCisgICAqCisgICAqIE9wdGlvbmFsbHksIGEgVENhbmNlbGxhdGlvbiBpbnN0YW5jZSBjYW4gYmUgc3BlY2lmaWVkLiBJZiBwcmVzZW50LAorICAgKiB0cmlnZ2VyaW5nIGl0IHdpbGwgYmUgY29uc2lkZXJlZCBhIHJlcXVlc3QgdG8gY2FuY2VsIHRoZSB3b3JrIGl0ZW0sIGlmIGl0CisgICAqIGlzIHN0aWxsIHdhaXRpbmcgZm9yIHRoZSBhc3NvY2lhdGVkIHRyYW5zcG9ydCB0byBiZWNvbWUgYXZhaWxhYmxlLgorICAgKiBEZWxlZ2F0ZXMgd2hpY2ggYXJlIGFscmVhZHkgYmVpbmcgcHJvY2Vzc2VkIChpLmUuIHdhaXRpbmcgZm9yIEkvTykgYXJlIG5vdAorICAgKiBhZmZlY3RlZCBiZWNhdXNlIHRoaXMgd291bGQgYnJpbmcgdGhlIGNvbm5lY3Rpb24gaW50byBhbiB1bmRlZmluZWQgc3RhdGUKKyAgICogKGFzIHByb2JhYmx5IGhhbGYtd3JpdHRlbiByZXF1ZXN0IG9yIGEgaGFsZi1yZWFkIHJlc3BvbnNlIHdvdWxkIGJlIGxlZnQKKyAgICogYmVoaW5kKS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHRyYW5zcG9ydCA9IFRoZSBUQXN5bmNUcmFuc3BvcnQgdGhlIHdvcmsgZGVsZWdhdGUgd2lsbCBvcGVyYXRlIG9uLiBNdXN0CisgICAqICAgICBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBUQXN5bmNNYW5hZ2VyIGluc3RhbmNlLgorICAgKiAgIHdvcmsgPSBUaGUgb3BlcmF0aW9ucyB0byBleGVjdXRlIG9uIHRoZSBnaXZlbiB0cmFuc3BvcnQuIE11c3QgbmV2ZXIKKyAgICogICAgIHRocm93LCBlcnJvcnMgc2hvdWxkIGJlIGhhbmRsZWQgaW4gYW5vdGhlciB3YXkuIG5vdGhyb3cgc2VtYW50aWNzIGFyZQorICAgKiAgICAgZGlmZmljdWx0IHRvIGVuZm9yY2UgaW4gY29tYmluYXRpb24gd2l0aCBmaWJyZXMgdGhvdWdoLCBzbyBjdXJyZW50bHkKKyAgICogICAgIGV4Y2VwdGlvbnMgYXJlIGp1c3Qgc3dhbGxvd2VkIGJ5IFRBc3luY01hbmFnZXIgaW1wbGVtZW50YXRpb25zLgorICAgKiAgIGNhbmNlbGxhdGlvbiA9IElmIHNldCwgY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCBjYW5jZWxsYXRpbm9uIG9mIHRoaXMgd29yaworICAgKiAgICAgaXRlbSBpZiBpdCBpcyBzdGlsbCB3YWl0aW5nIHRvIGJlIGV4ZWN1dGVkLgorICAgKgorICAgKiBOb3RlOiBUaGUgd29yayBpdGVtIHdpbGwgbGlrZWx5IGJlIGV4ZWN1dGVkIGluIGEgZGlmZmVyZW50IHRocmVhZCwgc28gbWFrZQorICAgKiAgIHN1cmUgdGhlIGNvZGUgaXQgcmVsaWVzIG9uIGlzIHRocmVhZC1zYWZlLiBBbiBleGNlcHRpb24gYXJlIHRoZSBhc3luYworICAgKiAgIHRyYW5zcG9ydHMgdGhlbXNlbHZlcywgdG8gd2hpY2ggYWNjZXNzIGlzIHNlcmlhbGl6ZWQgYXMgbm90ZWQgYWJvdmUuCisgICAqLworICB2b2lkIGV4ZWN1dGUoVEFzeW5jVHJhbnNwb3J0IHRyYW5zcG9ydCwgdm9pZCBkZWxlZ2F0ZSgpIHdvcmssCisgICAgVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24gPSBudWxsCisgICkgaW4geworICAgIGFzc2VydCh0cmFuc3BvcnQuYXN5bmNNYW5hZ2VyIGlzIHRoaXMsCisgICAgICAiVGhlIGdpdmVuIHRyYW5zcG9ydCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFRBc3luY01hbmFnZXIuIik7CisgIH0KKworICAvKioKKyAgICogU3VibWl0cyBhIGRlbGVnYXRlIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZSBoYXMKKyAgICogcGFzc2VkLgorICAgKgorICAgKiBUaGUgYWN0dWFsIGFtb3VudCBvZiB0aW1lIGVsYXBzZWQgY2FuIGJlIGhpZ2hlciBpZiB0aGUgYXN5bmMgbWFuYWdlcgorICAgKiBpbnN0YW5jZSBpcyBidXN5IGFuZCB0aHVzIHNob3VsZCBub3QgYmUgcmVsaWVkIG9uLiBUaGUKKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGR1cmF0aW9uID0gVGhlIGFtb3VudCBvZiB0aW1lIHRvIHdhaXQgYmVmb3JlIHN0YXJ0aW5nIHRvIGV4ZWN1dGUgdGhlCisgICAqICAgICB3b3JrIGRlbGVnYXRlLgorICAgKiAgIHdvcmsgPSBUaGUgY29kZSB0byBleGVjdXRlIGFmdGVyIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUgaGFzIHBhc3NlZC4KKyAgICoKKyAgICogRXhhbXBsZToKKyAgICogLS0tCisgICAqIC8vIEEgdmVyeSBiYXNpYyBleGFtcGxlIOKAkyB1c3VhbGx5LCB0aGUgYWN0dWFsbCB3b3JrIGl0ZW0gd291bGQgZW5xdWV1ZQorICAgKiAvLyBzb21lIGFzeW5jIHRyYW5zcG9ydCBvcGVyYXRpb24uCisgICAqIGF1dG8gYXN5bmNNYW5nYWdlciA9IHNvbWVBc3luY01hbmFnZXIoKTsKKyAgICoKKyAgICogVEZ1dHVyZSFpbnQgY2FsY3VsYXRlKCkgeworICAgKiAgIC8vIENyZWF0ZSBhIHByb21pc2UgYW5kIGFzeW5jaHJvbm91c2x5IHNldCBpdHMgdmFsdWUgYWZ0ZXIgdGhyZWUKKyAgICogICAvLyBzZWNvbmRzIGhhdmUgcGFzc2VkLgorICAgKiAgIGF1dG8gcHJvbWlzZSA9IG5ldyBUUHJvbWlzZSFpbnQ7CisgICAqICAgYXN5bmNNYW5hZ2VyLmRlbGF5KGR1ciEic2Vjb25kcyIoMyksIHsKKyAgICogICAgIHByb21pc2Uuc3VjY2VlZCg0Mik7CisgICAqICAgfSk7CisgICAqCisgICAqICAgLy8gSW1tZWRpYXRlbHkgcmV0dXJuIGl0IHRvIHRoZSBjYWxsZXIuCisgICAqICAgcmV0dXJuIHByb21pc2U7CisgICAqIH0KKyAgICoKKyAgICogLy8gVGhpcyB3aWxsIHdhaXQgdW50aWwgdGhlIHJlc3VsdCBpcyBhdmFpbGFibGUgYW5kIHRoZW4gcHJpbnQgaXQuCisgICAqIHdyaXRlbG4oY2FsY3VsYXRlKCkud2FpdEdldCgpKTsKKyAgICogLS0tCisgICAqLworICB2b2lkIGRlbGF5KER1cmF0aW9uIGR1cmF0aW9uLCB2b2lkIGRlbGVnYXRlKCkgd29yayk7CisKKyAgLyoqCisgICAqIFNodXRzIGRvd24gYWxsIGJhY2tncm91bmQgdGhyZWFkcyBvciBvdGhlciBmYWNpbGl0aWVzIHRoYXQgbWlnaHQgaGF2ZQorICAgKiBiZWVuIHN0YXJ0ZWQgaW4gb3JkZXIgdG8gZXhlY3V0ZSB3b3JrIGl0ZW1zLiBUaGlzIGZ1bmN0aW9uIGlzIHR5cGljYWxseQorICAgKiBjYWxsZWQgZHVyaW5nIHByb2dyYW0gc2h1dGRvd24uCisgICAqCisgICAqIElmIHRoZXJlIGFyZSBzdGlsbCB0YXNrcyB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSB0aW1lb3V0IGV4cGlyZXMsIGFueQorICAgKiBjdXJyZW50bHkgZXhlY3V0ZWQgd29yayBpdGVtcyB3aWxsIG5ldmVyIHJlY2VpdmUgYW55IG5vdGlmaWNhdGlvbnMKKyAgICogZm9yIGFzeW5jIHRyYW5zcG9ydHMgbWFuYWdlZCBieSB0aGlzIGluc3RhbmNlLCBxdWV1ZWQgd29yayBpdGVtcyB3aWxsCisgICAqIGJlIHNpbGVudGx5IGRyb3BwZWQsIGFuZCBpbXBsZW1lbnRhdGlvbnMgYXJlIGFsbG93ZWQgdG8gbGVhayByZXNvdXJjZXMuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICB3YWl0RmluaXNoVGltZW91dCA9IElmIHBvc2l0aXZlLCB3YWl0cyBmb3IgYWxsIHdvcmsgaXRlbXMgdG8gYmUKKyAgICogICAgIGZpbmlzaGVkIGZvciB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lLCBpZiBuZWdhdGl2ZSwgd2FpdHMgZm9yCisgICAqICAgICBjb21wbGV0aW9uIHdpdGhvdXQgZXZlciB0aW1pbmcgb3V0LCBpZiB6ZXJvLCBpbW1lZGlhdGVseSBzaHV0cyBkb3duCisgICAqICAgICB0aGUgYmFja2dyb3VuZCBmYWNpbGl0aWVzLgorICAgKi8KKyAgYm9vbCBzdG9wKER1cmF0aW9uIHdhaXRGaW5pc2hUaW1lb3V0ID0gZHVyISJobnNlY3MiKC0xKSk7Cit9CisKKy8qKgorICogQSBUVHJhbnNwb3J0IHdoaWNoIHVzZXMgYSBUQXN5bmNNYW5hZ2VyIHRvIHNjaGVkdWxlIG5vbi1ibG9ja2luZyBvcGVyYXRpb25zLgorICoKKyAqIFRoZSBhY3R1YWwgdHlwZSBvZiBkZXZpY2UgaXMgbm90IHNwZWNpZmllZDsgdHlwaWNhbGx5LCBpbXBsZW1lbnRhdGlvbnMgd2lsbAorICogZGVwZW5kIG9uIGFuIGludGVyZmFjZSBkZXJpdmVkIGZyb20gVEFzeW5jTWFuYWdlciB0byBiZSBub3RpZmllZCBvZiBjaGFuZ2VzCisgKiBpbiB0aGUgdHJhbnNwb3J0IHN0YXRlLgorICoKKyAqIFRoZSBwZWVraW5nLCByZWFkaW5nLCB3cml0aW5nIGFuZCBmbHVzaGluZyBtZXRob2RzIG11c3QgYWx3YXlzIGJlIGNhbGxlZAorICogZnJvbSB3aXRoaW4gdGhlIGFzc29jaWF0ZWQgYXN5bmMgbWFuYWdlci4KKyAqLworaW50ZXJmYWNlIFRBc3luY1RyYW5zcG9ydCA6IFRUcmFuc3BvcnQgeworICAvKioKKyAgICogVGhlIFRBc3luY01hbmFnZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNwb3J0LgorICAgKi8KKyAgVEFzeW5jTWFuYWdlciBhc3luY01hbmFnZXIoKSBAcHJvcGVydHk7Cit9CisKKy8qKgorICogQSBUQXN5bmNNYW5hZ2VyIHByb3ZpZGluZyBub3RpZmljaWF0aW9ucyBmb3Igc29ja2V0IGV2ZW50cy4KKyAqLworaW50ZXJmYWNlIFRBc3luY1NvY2tldE1hbmFnZXIgOiBUQXN5bmNNYW5hZ2VyIHsKKyAgLyoqCisgICAqIEFkZHMgYSBsaXN0ZW5lciB0aGF0IGlzIHRyaWdnZXJlZCBvbmNlIHdoZW4gYW4gZXZlbnQgb2YgdGhlIHNwZWNpZmllZCB0eXBlCisgICAqIG9jY3VycywgYW5kIHJlbW92ZWQgYWZ0ZXJ3YXJkcy4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHNvY2tldCA9IFRoZSBzb2NrZXQgdG8gbGlzdGVuIGZvciBldmVudHMgYXQuCisgICAqICAgZXZlbnRUeXBlID0gVGhlIHR5cGUgb2YgdGhlIGV2ZW50IHRvIGxpc3RlbiBmb3IuCisgICAqICAgdGltZW91dCA9IFRoZSBwZXJpb2Qgb2YgdGltZSBhZnRlciB3aGljaCB0aGUgbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQKKyAgICogICAgIHdpdGggVEFzeW5jRXZlbnRSZWFzb24uVElNRURfT1VUIGlmIG5vIGV2ZW50IGhhcHBlbmVkLgorICAgKiAgIGxpc3RlbmVyID0gVGhlIGRlbGVnYXRlIHRvIGNhbGwgd2hlbiBhbiBldmVudCBoYXBwZW5lZC4KKyAgICovCisgIHZvaWQgYWRkT25lc2hvdExpc3RlbmVyKFNvY2tldCBzb2NrZXQsIFRBc3luY0V2ZW50VHlwZSBldmVudFR5cGUsCisgICAgRHVyYXRpb24gdGltZW91dCwgVFNvY2tldEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpOworCisgIC8vLyBEaXR0bworICB2b2lkIGFkZE9uZXNob3RMaXN0ZW5lcihTb2NrZXQgc29ja2V0LCBUQXN5bmNFdmVudFR5cGUgZXZlbnRUeXBlLAorICAgIFRTb2NrZXRFdmVudExpc3RlbmVyIGxpc3RlbmVyKTsKK30KKworLyoqCisgKiBUeXBlcyBvZiBldmVudHMgdGhhdCBjYW4gaGFwcGVuIGZvciBhbiBhc3luY2hyb25vdXMgdHJhbnNwb3J0LgorICovCitlbnVtIFRBc3luY0V2ZW50VHlwZSB7CisgIFJFQUQsIC8vLyBOZXcgZGF0YSBiZWNhbWUgYXZhaWxhYmxlIHRvIHJlYWQuCisgIFdSSVRFIC8vLyBUaGUgdHJhbnNwb3J0IGJlY2FtZSByZWFkeSB0byBiZSB3cml0dGVuIHRvLgorfQorCisvKioKKyAqIFRoZSB0eXBlIG9mIHRoZSBkZWxlZ2F0ZXMgdXNlZCB0byByZWdpc3RlciBzb2NrZXQgZXZlbnQgaGFuZGxlcnMuCisgKi8KK2FsaWFzIHZvaWQgZGVsZWdhdGUoVEFzeW5jRXZlbnRSZWFzb24gY2FsbFJlYXNvbikgVFNvY2tldEV2ZW50TGlzdGVuZXI7CisKKy8qKgorICogVGhlIHJlYXNvbiBhIGxpc3RlbmVyIHdhcyBjYWxsZWQuCisgKi8KK2VudW0gVEFzeW5jRXZlbnRSZWFzb24gOiBieXRlIHsKKyAgTk9STUFMLCAvLy8gVGhlIGV2ZW50IGxpc3RlbmVkIGZvciB3YXMgdHJpZ2dlcmVkIG5vcm1hbGx5LgorICBUSU1FRF9PVVQgLy8vIEEgdGltZW91dCBmb3IgdGhlIGV2ZW50IHdhcyBzZXQsIGFuZCBpdCBleHBpcmVkLgorfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9saWJldmVudC5kIGIvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9saWJldmVudC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMmU0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL2xpYmV2ZW50LmQKQEAgLTAsMCArMSw0NjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuYXN5bmMubGliZXZlbnQ7CisKK2ltcG9ydCBjb3JlLmF0b21pYzsKK2ltcG9ydCBjb3JlLnRpbWUgOiBEdXJhdGlvbiwgZHVyOworaW1wb3J0IGNvcmUuZXhjZXB0aW9uIDogb25PdXRPZk1lbW9yeUVycm9yOworaW1wb3J0IGNvcmUubWVtb3J5IDogR0M7CitpbXBvcnQgY29yZS50aHJlYWQgOiBGaWJlciwgVGhyZWFkOworaW1wb3J0IGNvcmUuc3luYy5jb25kaXRpb247CitpbXBvcnQgY29yZS5zeW5jLm11dGV4OworaW1wb3J0IGNvcmUuc3RkYy5zdGRsaWIgOiBmcmVlLCBtYWxsb2M7CitpbXBvcnQgZGVpbW9zLmV2ZW50Mi5ldmVudDsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eSwgZnJvbnQsIHBvcEZyb250OworaW1wb3J0IHN0ZC5jb252IDogdGV4dCwgdG87CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgc3RkLnNvY2tldCA6IFNvY2tldCwgc29ja2V0UGFpcjsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuYXN5bmMuYmFzZTsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuc29ja2V0OworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC50cmFpdHM7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOworCisvLyBUbyBhdm9pZCBETUQgQEBCVUc2Mzk1QEAuCitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmFsZ29yaXRobTsKKworLyoqCisgKiBBIFRBc3luY01hbmFnZXIgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gbGliZXZlbnQuCisgKgorICogVGhlIGxpYmV2ZW50IGxvb3AgZm9yIGhhbmRsaW5nIG5vbi1ibG9ja2luZyBzb2NrZXRzIGlzIHJ1biBpbiBhIGJhY2tncm91bmQKKyAqIHRocmVhZCwgd2hpY2ggaXMgbGF6aWx5IHNwYXduZWQuIFRoZSB0aHJlYWQgaXMgbm90IGRhZW1vbml6ZWQgdG8gYXZvaWQKKyAqIGNyYXNoZXMgb24gcHJvZ3JhbSBzaHV0ZG93biwgaXQgaXMgb25seSBzdG9wcGVkIHdoZW4gdGhlIG1hbmFnZXIgaW5zdGFuY2UKKyAqIGlzIGRlc3Ryb3llZC4gU28sIHRvIGVuc3VyZSBhIGNsZWFuIHByb2dyYW0gdGVhcmRvd24sIGVpdGhlciBtYWtlIHN1cmUgdGhpcworICogaW5zdGFuY2UgZ2V0cyBkZXN0cm95ZWQgKGUuZy4gYnkgdXNpbmcgc2NvcGUpLCBvciBtYW51YWxseSBjYWxsIHN0b3AoKSBhdAorICogdGhlIGVuZC4KKyAqLworY2xhc3MgVExpYmV2ZW50QXN5bmNNYW5hZ2VyIDogVEFzeW5jU29ja2V0TWFuYWdlciB7CisgIHRoaXMoKSB7CisgICAgZXZlbnRCYXNlXyA9IGV2ZW50X2Jhc2VfbmV3KCk7CisKKyAgICAvLyBTZXQgdXAgdGhlIHNvY2tldCBwYWlyIGZvciB0cmFuc2ZlcnJpbmcgY29udHJvbCBtZXNzYWdlcyB0byB0aGUgZXZlbnQKKyAgICAvLyBsb29wLgorICAgIGF1dG8gcGFpciA9IHNvY2tldFBhaXIoKTsKKyAgICBjb250cm9sU2VuZFNvY2tldF8gPSBwYWlyWzBdOworICAgIGNvbnRyb2xSZWNlaXZlU29ja2V0XyA9IHBhaXJbMV07CisgICAgY29udHJvbFJlY2VpdmVTb2NrZXRfLmJsb2NraW5nID0gZmFsc2U7CisKKyAgICAvLyBSZWdpc3RlciBhbiBldmVudCBmb3IgcmVjZWl2aW5nIGNvbnRyb2wgbWVzc2FnZXMuCisgICAgY29udHJvbFJlY2VpdmVFdmVudF8gPSBldmVudF9uZXcoZXZlbnRCYXNlXywgY29udHJvbFJlY2VpdmVTb2NrZXRfLmhhbmRsZSwKKyAgICAgIEVWX1JFQUQgfCBFVl9QRVJTSVNUIHwgRVZfRVQsIGFzc3VtZU5vdGhyb3coJmNvbnRyb2xNc2dSZWNlaXZlQ2FsbGJhY2spLAorICAgICAgY2FzdCh2b2lkKil0aGlzKTsKKyAgICBldmVudF9hZGQoY29udHJvbFJlY2VpdmVFdmVudF8sIG51bGwpOworCisgICAgcXVldWVkQ291bnRNdXRleF8gPSBuZXcgTXV0ZXg7CisgICAgemVyb1F1ZXVlZENvbmRpdGlvbl8gPSBuZXcgQ29uZGl0aW9uKHF1ZXVlZENvdW50TXV0ZXhfKTsKKyAgfQorCisgIH50aGlzKCkgeworICAgIC8vIHN0b3AoKSBzaG91bGQgYmUgc2FmZSB0byBjYWxsLCBiZWNhdXNlIGVpdGhlciB3ZSBkb24ndCBoYXZlIGEgd29ya2VyCisgICAgLy8gdGhyZWFkIHJ1bm5pbmcgYW5kIGl0IGlzIGEgbm8tb3AgYW55d2F5LCBvciBpdCBpcyBndWFyYW50ZWVkIHRvIGJlCisgICAgLy8gc3RpbGwgcnVubmluZyAoYmxvY2tlZCBpbiBldmVudF9iYXNlX2xvb3ApLCBhbmQgdGh1cyBndWFyYW50ZWVkIG5vdCB0bworICAgIC8vIGJlIGdhcmJhZ2UgY29sbGVjdGVkIHlldC4KKyAgICBzdG9wKGR1ciEiaG5zZWNzIigwKSk7CisKKyAgICBldmVudF9mcmVlKGNvbnRyb2xSZWNlaXZlRXZlbnRfKTsKKyAgICBldmVudF9iYXNlX2ZyZWUoZXZlbnRCYXNlXyk7CisgICAgZXZlbnRCYXNlXyA9IG51bGw7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGV4ZWN1dGUoVEFzeW5jVHJhbnNwb3J0IHRyYW5zcG9ydCwgV29yayB3b3JrLAorICAgIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uID0gbnVsbAorICApIHsKKyAgICBpZiAoY2FuY2VsbGF0aW9uICYmIGNhbmNlbGxhdGlvbi50cmlnZ2VyZWQpIHJldHVybjsKKworICAgIC8vIEtlZXAgdHJhY2sgdGhhdCB0aGVyZSBpcyBhIG5ldyB3b3JrIGl0ZW0gdG8gYmUgcHJvY2Vzc2VkLgorICAgIGluY3JlbWVudFF1ZXVlZENvdW50KCk7CisKKyAgICBlbnN1cmVXb3JrZXJUaHJlYWRSdW5uaW5nKCk7CisKKyAgICAvLyBXZSBzaG91bGQgYmUgYWJsZSB0byBzZW5kIHRoZSBjb250cm9sIG1lc3NhZ2UgYXMgYSB3aG9sZSDigJMgd2UgY3VycmVudGx5CisgICAgLy8gYXNzdW1lIHRvIGJlIGFibGUgdG8gcmVjZWl2ZSBpdCBhdCBvbmNlIGFzIHdlbGwuIElmIHRoaXMgcHJvdmVzIHRvIGJlCisgICAgLy8gdW5zdGFibGUgKGUuZy4gc2VuZCBjb3VsZCBwb3NzaWJseSByZXR1cm4gZWFybHkgaWYgdGhlIHJlY2VpdmluZyBidWZmZXIKKyAgICAvLyBpcyBmdWxsIGFuZCB0aGUgYmxvY2tpbmcgY2FsbCBnZXRzIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsKSwgaXQgY291bGQKKyAgICAvLyBiZSBjaGFuZ2VkIHRvIGEgbW9yZSBzb3BoaXN0aWNhdGVkIHNjaGVtZS4KKworICAgIC8vIE1ha2Ugc3VyZSB0aGUgZGVsZWdhdGUgY29udGV4dCBkb2Vzbid0IGdldCBHQ2Qgd2hpbGUgdGhlIHdvcmsgaXRlbSBpcworICAgIC8vIG9uIHRoZSB3aXJlLgorICAgIEdDLmFkZFJvb3Qod29yay5wdHIpOworCisgICAgLy8gU2VuZCB3b3JrIG1lc3NhZ2UuCisgICAgc2VuZENvbnRyb2xNc2coQ29udHJvbE1zZyhNc2dUeXBlLldPUkssIHdvcmssIHRyYW5zcG9ydCkpOworCisgICAgaWYgKGNhbmNlbGxhdGlvbikgeworICAgICAgY2FuY2VsbGF0aW9uLnRyaWdnZXJpbmcuYWRkQ2FsbGJhY2soeworICAgICAgICBzZW5kQ29udHJvbE1zZyhDb250cm9sTXNnKE1zZ1R5cGUuQ0FOQ0VMLCB3b3JrLCB0cmFuc3BvcnQpKTsKKyAgICAgIH0pOworICAgIH0KKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgZGVsYXkoRHVyYXRpb24gZHVyYXRpb24sIHZvaWQgZGVsZWdhdGUoKSB3b3JrKSB7CisgICAgaW5jcmVtZW50UXVldWVkQ291bnQoKTsKKworICAgIGVuc3VyZVdvcmtlclRocmVhZFJ1bm5pbmcoKTsKKworICAgIGNvbnN0IHR2ID0gdG9UaW1ldmFsKGR1cmF0aW9uKTsKKworICAgIC8vIERNRCBAQEJVR0BAOiBDYW5ub3QgZGVkdWNlIFQgdG8gdm9pZCBkZWxlZ2F0ZSgpIGhlcmUuCisgICAgcmVnaXN0ZXJPbmVzaG90RXZlbnQhKHZvaWQgZGVsZWdhdGUoKSkoCisgICAgICAtMSwgMCwgYXNzdW1lTm90aHJvdygmZGVsYXlDYWxsYmFjayksICZ0diwKKyAgICAgIHsKKyAgICAgICAgd29yaygpOworICAgICAgICBkZWNyZW1lbnRRdWV1ZWRDb3VudCgpOworICAgICAgfQorICAgICk7CisgIH0KKworICBvdmVycmlkZSBib29sIHN0b3AoRHVyYXRpb24gd2FpdEZpbmlzaFRpbWVvdXQgPSBkdXIhImhuc2VjcyIoLTEpKSB7CisgICAgYm9vbCBjbGVhbkV4aXQgPSB0cnVlOworCisgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICBpZiAod29ya2VyVGhyZWFkXykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHF1ZXVlZENvdW50TXV0ZXhfKSB7CisgICAgICAgICAgaWYgKHdhaXRGaW5pc2hUaW1lb3V0ID4gZHVyISJobnNlY3MiKDApKSB7CisgICAgICAgICAgICBpZiAocXVldWVkQ291bnRfID4gMCkgeworICAgICAgICAgICAgICB6ZXJvUXVldWVkQ29uZGl0aW9uXy53YWl0KHdhaXRGaW5pc2hUaW1lb3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKHdhaXRGaW5pc2hUaW1lb3V0IDwgZHVyISJobnNlY3MiKDApKSB7CisgICAgICAgICAgICB3aGlsZSAocXVldWVkQ291bnRfID4gMCkgemVyb1F1ZXVlZENvbmRpdGlvbl8ud2FpdCgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB3YWl0RmluaXNoVGltZW91dCBpcyB6ZXJvLCBpbW1lZGlhdGVseSBleGl0IGluIGFsbCBjYXNlcy4KKyAgICAgICAgICB9CisgICAgICAgICAgY2xlYW5FeGl0ID0gKHF1ZXVlZENvdW50XyA9PSAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGV2ZW50X2Jhc2VfbG9vcGJyZWFrKGV2ZW50QmFzZV8pOworICAgICAgICBzZW5kQ29udHJvbE1zZyhDb250cm9sTXNnKE1zZ1R5cGUuU0hVVERPV04pKTsKKyAgICAgICAgd29ya2VyVGhyZWFkXy5qb2luKCk7CisgICAgICAgIHdvcmtRdWV1ZXNfID0gbnVsbDsKKyAgICAgICAgLy8gV2UgaGF2ZSBudWtlZCBhbGwgY3VycmVudGx5IGVucXVldWVkIGl0ZW1zLCBzbyBzZXQgdGhlIGNvdW50IHRvCisgICAgICAgIC8vIHplcm8uIFRoaXMgaXMgc2FmZSB0byBkbyB3aXRob3V0IGxvY2tpbmcsIHNpbmNlIHRoZSB3b3JrZXIgdGhyZWFkCisgICAgICAgIC8vIGlzIGRvd24uCisgICAgICAgIHF1ZXVlZENvdW50XyA9IDA7CisgICAgICAgIGF0b21pY1N0b3JlKCooY2FzdChzaGFyZWQpJndvcmtlclRocmVhZF8pLCBjYXN0KHNoYXJlZChUaHJlYWQpKW51bGwpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjbGVhbkV4aXQ7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGFkZE9uZXNob3RMaXN0ZW5lcihTb2NrZXQgc29ja2V0LCBUQXN5bmNFdmVudFR5cGUgZXZlbnRUeXBlLAorICAgICBUU29ja2V0RXZlbnRMaXN0ZW5lciBsaXN0ZW5lcgorICApIHsKKyAgICBhZGRPbmVzaG90TGlzdGVuZXJJbXBsKHNvY2tldCwgZXZlbnRUeXBlLCBudWxsLCBsaXN0ZW5lcik7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGFkZE9uZXNob3RMaXN0ZW5lcihTb2NrZXQgc29ja2V0LCBUQXN5bmNFdmVudFR5cGUgZXZlbnRUeXBlLAorICAgIER1cmF0aW9uIHRpbWVvdXQsIFRTb2NrZXRFdmVudExpc3RlbmVyIGxpc3RlbmVyCisgICkgeworICAgIGlmICh0aW1lb3V0IDw9IGR1ciEiaG5zZWNzIigwKSkgeworICAgICAgYWRkT25lc2hvdExpc3RlbmVySW1wbChzb2NrZXQsIGV2ZW50VHlwZSwgbnVsbCwgbGlzdGVuZXIpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBUaGlzIGlzIG5vdCByZWFsbHkgZG9jdW1lbnRlZCB3ZWxsLCBidXQgbGliZXZlbnQgZG9lcyBub3QgcmVxdWlyZSB0bworICAgICAgLy8ga2VlcCB0aGUgdGltZXZhbCBhcm91bmQgYWZ0ZXIgdGhlIGV2ZW50IHdhcyBhZGRlZC4KKyAgICAgIGF1dG8gdHYgPSB0b1RpbWV2YWwodGltZW91dCk7CisgICAgICBhZGRPbmVzaG90TGlzdGVuZXJJbXBsKHNvY2tldCwgZXZlbnRUeXBlLCAmdHYsIGxpc3RlbmVyKTsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgYWxpYXMgdm9pZCBkZWxlZ2F0ZSgpIFdvcms7CisKKyAgdm9pZCBhZGRPbmVzaG90TGlzdGVuZXJJbXBsKFNvY2tldCBzb2NrZXQsIFRBc3luY0V2ZW50VHlwZSBldmVudFR5cGUsCisgICAgIGNvbnN0KHRpbWV2YWwpKiB0aW1lb3V0LCBUU29ja2V0RXZlbnRMaXN0ZW5lciBsaXN0ZW5lcgorICApIHsKKyAgICByZWdpc3Rlck9uZXNob3RFdmVudChzb2NrZXQuaGFuZGxlLCBsaWJldmVudEV2ZW50VHlwZShldmVudFR5cGUpLAorICAgICAgYXNzdW1lTm90aHJvdygmc29ja2V0Q2FsbGJhY2spLCB0aW1lb3V0LCBsaXN0ZW5lcik7CisgIH0KKworICB2b2lkIHJlZ2lzdGVyT25lc2hvdEV2ZW50KFQpKGV2dXRpbF9zb2NrZXRfdCBmZCwgc2hvcnQgdHlwZSwKKyAgICBldmVudF9jYWxsYmFja19mbiBjYWxsYmFjaywgY29uc3QodGltZXZhbCkqIHRpbWVvdXQsIFQgcGF5bG9hZAorICApIHsKKyAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSBwYXlsb2FkIG9uIHRoZSBDIGhlYXAuCisgICAgYXV0byBwYXlsb2FkTWVtID0gbWFsbG9jKHBheWxvYWQuc2l6ZW9mKTsKKyAgICBpZiAoIXBheWxvYWRNZW0pIG9uT3V0T2ZNZW1vcnlFcnJvcigpOworICAgIChjYXN0KFQqKXBheWxvYWRNZW0pWzAgLi4gMV0gPSBwYXlsb2FkOworICAgIEdDLmFkZFJhbmdlKHBheWxvYWRNZW0sIHBheWxvYWQuc2l6ZW9mKTsKKworICAgIGF1dG8gcmVzdWx0ID0gZXZlbnRfYmFzZV9vbmNlKGV2ZW50QmFzZV8sIGZkLCB0eXBlLCBjYWxsYmFjaywKKyAgICAgIHBheWxvYWRNZW0sIHRpbWVvdXQpOworCisgICAgLy8gQXNzdW1pbmcgdGhhdCB3ZSBkaWRuJ3QgZ2V0IG91ciBhcmd1bWVudHMgd3JvbmcgYWJvdmUsIHRoZSBvbmx5IG90aGVyCisgICAgLy8gc2l0dWF0aW9uIGluIHdoaWNoIGV2ZW50X2Jhc2Vfb25jZSBjYW4gZmFpbCBpcyB3aGVuIGl0IGNhbid0IGFsbG9jYXRlCisgICAgLy8gbWVtb3J5LgorICAgIGlmIChyZXN1bHQgIT0gMCkgb25PdXRPZk1lbW9yeUVycm9yKCk7CisgIH0KKworICBlbnVtIE1zZ1R5cGUgOiB1Ynl0ZSB7CisgICAgU0hVVERPV04sCisgICAgV09SSywKKyAgICBDQU5DRUwKKyAgfQorCisgIHN0cnVjdCBDb250cm9sTXNnIHsKKyAgICBNc2dUeXBlIHR5cGU7CisgICAgV29yayB3b3JrOworICAgIFRBc3luY1RyYW5zcG9ydCB0cmFuc3BvcnQ7CisgIH0KKworICAvKioKKyAgICogU3RhcnRzIHRoZSB3b3JrZXIgdGhyZWFkIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHJ1bm5pbmcuCisgICAqLworICB2b2lkIGVuc3VyZVdvcmtlclRocmVhZFJ1bm5pbmcoKSB7CisgICAgLy8gVGVjaG5pY2FsbHksIG9ubHkgaGFsZiBiYXJyaWVycyB3b3VsZCBiZSByZXF1aXJlZCBoZXJlLCBidXQgYWRkaW5nIHRoZQorICAgIC8vIGFyZ3VtZW50IHNlZW1zIHRvIHRyaWdnZXIgYSBETUQgdGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uIEBAQlVHQEAuCisgICAgaWYgKCFhdG9taWNMb2FkKCooY2FzdChzaGFyZWQpJndvcmtlclRocmVhZF8pKSkgeworICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgIGlmICghd29ya2VyVGhyZWFkXykgeworICAgICAgICAgIGF1dG8gdGhyZWFkID0gbmV3IFRocmVhZCh7IGV2ZW50X2Jhc2VfbG9vcChldmVudEJhc2VfLCAwKTsgfSk7CisgICAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CisgICAgICAgICAgYXRvbWljU3RvcmUoKihjYXN0KHNoYXJlZCkmd29ya2VyVGhyZWFkXyksIGNhc3Qoc2hhcmVkKXRocmVhZCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogU2VuZHMgYSBjb250cm9sIG1lc3NhZ2UgdG8gdGhlIHdvcmtlciB0aHJlYWQuCisgICAqLworICB2b2lkIHNlbmRDb250cm9sTXNnKGNvbnN0KENvbnRyb2xNc2cpIG1zZykgeworICAgIGF1dG8gcmVzdWx0ID0gY29udHJvbFNlbmRTb2NrZXRfLnNlbmQoKCZtc2cpWzAgLi4gMV0pOworICAgIGVudW0gc2l6ZSA9IG1zZy5zaXplb2Y7CisgICAgZW5mb3JjZShyZXN1bHQgPT0gc2l6ZSwgbmV3IFRFeGNlcHRpb24odGV4dCgKKyAgICAgICJTZW5kaW5nIGNvbnRyb2wgbWVzc2FnZSBvZiB0eXBlICIsIG1zZy50eXBlLCAiIGZhaWxlZCAoIiwgcmVzdWx0LAorICAgICAgIiBieXRlcyBpbnN0ZWFkIG9mICIsIHNpemUsICIgdHJhbnNtaXR0ZWQpLiIpKSk7CisgIH0KKworICAvKioKKyAgICogUmVjZWl2ZXMgbWVzc2FnZXMgZnJvbSB0aGUgY29udHJvbCBtZXNzYWdlIHNvY2tldCBhbmQgYWN0cyBvbiB0aGVtLiBDYWxsZWQKKyAgICogZnJvbSB0aGUgd29ya2VyIHRocmVhZC4KKyAgICovCisgIHZvaWQgcmVjZWl2ZUNvbnRyb2xNc2coKSB7CisgICAgLy8gUmVhZCBhcyBtYW55IG5ldyB3b3JrIGl0ZW1zIG9mZiB0aGUgc29ja2V0IGFzIHBvc3NpYmxlIChhdCBsZWFzdCBvbmUKKyAgICAvLyBzaG91bGQgYmUgYXZhaWxhYmxlLCBhcyB3ZSBnb3Qgbm90aWZpZWQgYnkgbGliZXZlbnQpLgorICAgIENvbnRyb2xNc2cgbXNnOworICAgIHB0cmRpZmZfdCBieXRlc1JlYWQ7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGJ5dGVzUmVhZCA9IGNvbnRyb2xSZWNlaXZlU29ja2V0Xy5yZWNlaXZlKGNhc3QodWJ5dGVbXSkoKCZtc2cpWzAgLi4gMV0pKTsKKworICAgICAgaWYgKGJ5dGVzUmVhZCA8IDApIHsKKyAgICAgICAgYXV0byBlcnJubyA9IGdldFNvY2tldEVycm5vKCk7CisgICAgICAgIGlmIChlcnJubyAhPSBXT1VMRF9CTE9DS19FUlJOTykgeworICAgICAgICAgIGxvZ0Vycm9yKCJSZWFkaW5nIGNvbnRyb2wgbWVzc2FnZSwgc29tZSB3b3JrIGl0ZW0gd2lsbCBwb3NzaWJseSAiIH4KKyAgICAgICAgICAgICJuZXZlciBiZSBleGVjdXRlZDogJXMiLCBzb2NrZXRFcnJub1N0cmluZyhlcnJubykpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoYnl0ZXNSZWFkICE9IG1zZy5zaXplb2YpIGJyZWFrOworCisgICAgICAvLyBFdmVyeXRoaW5nIHdlbnQgZmluZSwgd2UgcmVjZWl2ZWQgYSBuZXcgY29udHJvbCBtZXNzYWdlLgorICAgICAgZmluYWwgc3dpdGNoIChtc2cudHlwZSkgeworICAgICAgICBjYXNlIE1zZ1R5cGUuU0hVVERPV046CisgICAgICAgICAgLy8gVGhlIG1lc3NhZ2Ugd2FzIGp1c3QgaW50ZW5kZWQgdG8gd2FrZSB1cyB1cCBmb3Igc2h1dGRvd24uCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNc2dUeXBlLkNBTkNFTDoKKyAgICAgICAgICAvLyBXaGVuIHByb2Nlc3NpbmcgYSBjYW5jZWxsYXRpb24sIHdlIG11c3Qgbm90IHRvdWNoIHRoZSBmaXJzdCBpdGVtLAorICAgICAgICAgIC8vIHNpbmNlIGl0IGlzIGFscmVhZHkgYmVpbmcgcHJvY2Vzc2VkLgorICAgICAgICAgIGF1dG8gcXVldWUgPSB3b3JrUXVldWVzX1ttc2cudHJhbnNwb3J0XTsKKyAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgd29ya1F1ZXVlc19bbXNnLnRyYW5zcG9ydF0gPSBbcXVldWVbMF1dIH4KKyAgICAgICAgICAgICAgcmVtb3ZlRXF1YWwocXVldWVbMSAuLiAkXSwgbXNnLndvcmspOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1zZ1R5cGUuV09SSzoKKyAgICAgICAgICAvLyBOb3cgdGhhdCB0aGUgd29yayBpdGVtIGlzIGJhY2sgaW4gdGhlIEQgd29ybGQsIHdlIGRvbid0IG5lZWQgdGhlCisgICAgICAgICAgLy8gZXh0cmEgR0Mgcm9vdCBmb3IgdGhlIGNvbnRleHQgcG9pbnRlciBhbnltb3JlIChzZWUgZXhlY3V0ZSgpKS4KKyAgICAgICAgICBHQy5yZW1vdmVSb290KG1zZy53b3JrLnB0cik7CisKKyAgICAgICAgICAvLyBBZGQgdGhlIHdvcmsgaXRlbSB0byB0aGUgcXVldWUgYW5kIGV4ZWN1dGUgaXQuCisgICAgICAgICAgYXV0byBxdWV1ZSA9IG1zZy50cmFuc3BvcnQgaW4gd29ya1F1ZXVlc187CisgICAgICAgICAgaWYgKHF1ZXVlIGlzIG51bGwgfHwgKCpxdWV1ZSkuZW1wdHkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBxdWV1ZSBpcyBlbXB0eSwgYWRkIHRoZSBuZXcgd29yayBpdGVtIHRvIHRoZSBxdWV1ZSBhcyB3ZWxsLAorICAgICAgICAgICAgLy8gYnV0IGltbWVkaWF0ZWx5IHN0YXJ0IGV4ZWN1dGluZyBpdC4KKyAgICAgICAgICAgIHdvcmtRdWV1ZXNfW21zZy50cmFuc3BvcnRdID0gW21zZy53b3JrXTsKKyAgICAgICAgICAgIGV4ZWN1dGVXb3JrKG1zZy50cmFuc3BvcnQsIG1zZy53b3JrKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKCpxdWV1ZSkgfj0gbXNnLndvcms7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHRoZSBsYXN0IHJlYWQgd2FzIHN1Y2Nlc3NmdWwsIGJ1dCBkaWRuJ3QgcmVhZCBlbm91Z2ggYnl0ZXMsIHdlIGdvdAorICAgIC8vIGEgcHJvYmxlbS4KKyAgICBpZiAoYnl0ZXNSZWFkID4gMCkgeworICAgICAgbG9nRXJyb3IoIlVuZXhwZWN0ZWQgcGFydGlhbCBjb250cm9sIG1lc3NhZ2UgcmVhZCAoJXMgYnl0ZShzKSAiIH4KKyAgICAgICAgImluc3RlYWQgb2YgJXMpLCBzb21lIHdvcmsgaXRlbSB3aWxsIHBvc3NpYmx5IG5ldmVyIGJlIGV4ZWN1dGVkLiIsCisgICAgICAgIGJ5dGVzUmVhZCwgbXNnLnNpemVvZik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEV4ZWN1dGVzIHRoZSBnaXZlbiB3b3JrIGl0ZW0gYW5kIGFsbCBvdGhlcnMgZW5xdWV1ZWQgZm9yIHRoZSBzYW1lCisgICAqIHRyYW5zcG9ydCBpbiBhIG5ldyBmaWJlci4gQ2FsbGVkIGZyb20gdGhlIHdvcmtlciB0aHJlYWQuCisgICAqLworICB2b2lkIGV4ZWN1dGVXb3JrKFRBc3luY1RyYW5zcG9ydCB0cmFuc3BvcnQsIFdvcmsgd29yaykgeworICAgIChuZXcgRmliZXIoeworICAgICAgYXV0byBpdGVtID0gd29yazsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgLy8gRXhlY3V0ZSB0aGUgYWN0dWFsIHdvcmsuIEl0IHdpbGwgcG9zc2libHkgYWRkIGxpc3RlbmVycyB0byB0aGUKKyAgICAgICAgICAvLyBldmVudCBsb29wIGFuZCB5aWVsZCBhd2F5IGlmIGl0IGhhcyB0byB3YWl0IGZvciBibG9ja2luZworICAgICAgICAgIC8vIG9wZXJhdGlvbnMuIEl0IGlzIHF1aXRlIHBvc3NpYmxlIHRoYXQgYW5vdGhlciBmaWJlciB3aWxsIG1vZGlmeQorICAgICAgICAgIC8vIHRoZSB3b3JrIHF1ZXVlIGZvciB0aGUgY3VycmVudCB0cmFuc3BvcnQuCisgICAgICAgICAgaXRlbSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwganVzdCB0byBiZSBzdXJlIHRoZSB3b3JrZXIgdGhyZWFkCisgICAgICAgICAgLy8gZG9lc24ndCBzdG9wIHdvcmtpbmcgaW4gbXlzdGVyaW91cyB3YXlzIGJlY2F1c2Ugb2YgYW4gdW5oYW5kbGVkCisgICAgICAgICAgLy8gZXhjZXB0aW9uLgorICAgICAgICAgIGxvZ0Vycm9yKCJFeGNlcHRpb24gdGhyb3duIGJ5IHdvcmsgaXRlbTogJXMiLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92ZSB0aGUgaXRlbSBmcm9tIHRoZSB3b3JrIHF1ZXVlLgorICAgICAgICAvLyBOb3RlOiBEdWUgdG8gdGhlIHZhbHVlIHNlbWFudGljcyBvZiBhcnJheSBzbGljZXMsIHdlIGhhdmUgdG8KKyAgICAgICAgLy8gcmUtbG9va3VwIHRoaXMgb24gZXZlcnkgaXRlcmF0aW9uLiBUaGlzIGNvdWxkIGJlIHNvbHZlZCwgYnV0IEknZAorICAgICAgICAvLyByYXRoZXIgcmVwbGFjZSB0aGlzIGRpcmVjdGx5IHdpdGggYSBxdWV1ZSB0eXBlIG9uY2Ugb25lIGJlY29tZXMKKyAgICAgICAgLy8gYXZhaWxhYmxlIGluIFBob2Jvcy4KKyAgICAgICAgYXV0byBxdWV1ZSA9IHdvcmtRdWV1ZXNfW3RyYW5zcG9ydF07CisgICAgICAgIGFzc2VydChxdWV1ZS5mcm9udCA9PSBpdGVtKTsKKyAgICAgICAgcXVldWUucG9wRnJvbnQoKTsKKyAgICAgICAgd29ya1F1ZXVlc19bdHJhbnNwb3J0XSA9IHF1ZXVlOworCisgICAgICAgIC8vIE5vdyB0aGF0IHRoZSB3b3JrIGl0ZW0gaXMgZG9uZSwgbm8gbG9uZ2VyIGNvdW50IGl0IGFzIHF1ZXVlZC4KKyAgICAgICAgZGVjcmVtZW50UXVldWVkQ291bnQoKTsKKworICAgICAgICBpZiAocXVldWUuZW1wdHkpIGJyZWFrOworCisgICAgICAgIC8vIElmIHRoZSBxdWV1ZSBpcyBub3QgZW1wdHksIGV4ZWN1dGUgdGhlIG5leHQgd2FpdGluZyBpdGVtLgorICAgICAgICBpdGVtID0gcXVldWUuZnJvbnQ7CisgICAgICB9CisgICAgfSkpLmNhbGwoKTsKKyAgfQorCisgIC8qKgorICAgKiBJbmNyZW1lbnRzIHRoZSBhbW91bnQgb2YgcXVldWVkIGl0ZW1zLgorICAgKi8KKyAgdm9pZCBpbmNyZW1lbnRRdWV1ZWRDb3VudCgpIHsKKyAgICBzeW5jaHJvbml6ZWQgKHF1ZXVlZENvdW50TXV0ZXhfKSB7CisgICAgICArK3F1ZXVlZENvdW50XzsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRGVjcmVtZW50cyB0aGUgYW1vdW50IG9mIHF1ZXVlZCBpdGVtcy4KKyAgICovCisgIHZvaWQgZGVjcmVtZW50UXVldWVkQ291bnQoKSB7CisgICAgc3luY2hyb25pemVkIChxdWV1ZWRDb3VudE11dGV4XykgeworICAgICAgYXNzZXJ0KHF1ZXVlZENvdW50XyA+IDApOworICAgICAgLS1xdWV1ZWRDb3VudF87CisgICAgICBpZiAocXVldWVkQ291bnRfID09IDApIHsKKyAgICAgICAgemVyb1F1ZXVlZENvbmRpdGlvbl8ubm90aWZ5QWxsKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RhdGljIGV4dGVybihDKSB2b2lkIGNvbnRyb2xNc2dSZWNlaXZlQ2FsbGJhY2soZXZ1dGlsX3NvY2tldF90LCBzaG9ydCwKKyAgICB2b2lkICptYW5hZ2VyVGhpcworICApIHsKKyAgICAoY2FzdChUTGliZXZlbnRBc3luY01hbmFnZXIpbWFuYWdlclRoaXMpLnJlY2VpdmVDb250cm9sTXNnKCk7CisgIH0KKworICBzdGF0aWMgZXh0ZXJuKEMpIHZvaWQgc29ja2V0Q2FsbGJhY2soZXZ1dGlsX3NvY2tldF90LCBzaG9ydCBmbGFncywKKyAgICB2b2lkICphcmcKKyAgKSB7CisgICAgYXV0byByZWFzb24gPSAoZmxhZ3MgJiBFVl9USU1FT1VUKSA/IFRBc3luY0V2ZW50UmVhc29uLlRJTUVEX09VVCA6CisgICAgICBUQXN5bmNFdmVudFJlYXNvbi5OT1JNQUw7CisgICAgKCooY2FzdChUU29ja2V0RXZlbnRMaXN0ZW5lciopYXJnKSkocmVhc29uKTsKKyAgICBHQy5yZW1vdmVSYW5nZShhcmcpOworICAgIGRlc3Ryb3koYXJnKTsKKyAgICBmcmVlKGFyZyk7CisgIH0KKworICBzdGF0aWMgZXh0ZXJuKEMpIHZvaWQgZGVsYXlDYWxsYmFjayhldnV0aWxfc29ja2V0X3QsIHNob3J0IGZsYWdzLAorICAgIHZvaWQgKmFyZworICApIHsKKyAgICBhc3NlcnQoZmxhZ3MgJiBFVl9USU1FT1VUKTsKKyAgICAoKihjYXN0KHZvaWQgZGVsZWdhdGUoKSopYXJnKSkoKTsKKyAgICBHQy5yZW1vdmVSYW5nZShhcmcpOworICAgIGRlc3Ryb3koYXJnKTsKKyAgICBmcmVlKGFyZyk7CisgIH0KKworICBUaHJlYWQgd29ya2VyVGhyZWFkXzsKKworICBldmVudF9iYXNlKiBldmVudEJhc2VfOworCisgIC8vLyBUaGUgc29ja2V0IHVzZWQgZm9yIHJlY2VpdmluZyBuZXcgd29yayBpdGVtcyBpbiB0aGUgZXZlbnQgbG9vcC4gUGFpcmVkCisgIC8vLyB3aXRoIGNvbnRyb2xTZW5kU29ja2V0Xy4gSW52YWxpZCAoaS5lLiBUQXN5bmNXb3JrSXRlbS5pbml0KSBpdGVtcyBhcmUKKyAgLy8vIGlnbm9yZWQgYW5kIGNhbiBiZSB1c2VkIHRvIHdha2UgdXAgdGhlIHdvcmtlciB0aHJlYWQuCisgIFNvY2tldCBjb250cm9sUmVjZWl2ZVNvY2tldF87CisgIGV2ZW50KiBjb250cm9sUmVjZWl2ZUV2ZW50XzsKKworICAvLy8gVGhlIHNvY2tldCB1c2VkIHRvIHNlbmQgbmV3IHdvcmsgaXRlbXMgdG8gdGhlIGV2ZW50IGxvb3AuIEl0IGlzCisgIC8vLyBleHBlY3RlZCB0aGF0IHdvcmsgaXRlbXMgY2FuIGFsd2F5cyBiZSByZWFkIGF0IG9uY2UgZnJvbSBpdCwgaS5lLiB0aGF0CisgIC8vLyB0aGVyZSB3aWxsIG5ldmVyIGJlIHNob3J0IHJlYWRzLgorICBTb2NrZXQgY29udHJvbFNlbmRTb2NrZXRfOworCisgIC8vLyBRdWV1ZWQgdXAgd29yayBkZWxlZ2F0ZXMgZm9yIGFzeW5jIHRyYW5zcG9ydHMuIFRoaXMgYWxzbyBpbmNsdWRlcworICAvLy8gY3VycmVudGx5IGFjdGl2ZSBvbmVzLCB0aGV5IGFyZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIG9uIGNvbXBsZXRpb24sCisgIC8vLyB3aGljaCBpcyByZWxpZWQgb24gYnkgdGhlIGNvbnRyb2wgbWVzc2FnZSByZWNlaXZlIGZpYmVyICh0aGUgbWFpbiBvbmUpCisgIC8vLyB0byBkZWNpZGUgd2hldGhlciB0byBpbW1lZGlhdGVseSBzdGFydCBleGVjdXRpbmcgaXRlbXMgb3Igbm90LgorICAvLyBUT0RPOiBUaGlzIHNob3VsZCByZWFsbHkgYmUgb2Ygc29tZSBxdWV1ZSB0eXBlLCBub3QgYW4gYXJyYXkgc2xpY2UsIGJ1dAorICAvLyBzdGQuY29udGFpbmVyIGRvZXNuJ3QgaGF2ZSBhbnl0aGluZy4KKyAgV29ya1tdW1RBc3luY1RyYW5zcG9ydF0gd29ya1F1ZXVlc187CisKKyAgLy8vIFRoZSB0b3RhbCBudW1iZXIgb2Ygd29yayBpdGVtcyBub3QgeWV0IGZpbmlzaGVkIChxdWV1ZWQgYW5kIGN1cnJlbnRseQorICAvLy8gZXhlY3V0ZWQpIGFuZCBkZWxheXMgbm90IHlldCBleGVjdXRlZC4KKyAgdWludCBxdWV1ZWRDb3VudF87CisKKyAgLy8vIFByb3RlY3RzIHF1ZXVlZENvdW50Xy4KKyAgTXV0ZXggcXVldWVkQ291bnRNdXRleF87CisKKyAgLy8vIFRyaWdnZXJlZCB3aGVuIHF1ZXVlZENvdW50XyByZWFjaGVzIHplcm8sIHByb3RlY3RlZCBieSBxdWV1ZWRDb3VudE11dGV4Xy4KKyAgQ29uZGl0aW9uIHplcm9RdWV1ZWRDb25kaXRpb25fOworfQorCitwcml2YXRlIHsKKyAgdGltZXZhbCB0b1RpbWV2YWwoY29uc3QoRHVyYXRpb24pIGR1cikgeworICAgIHRpbWV2YWwgdHY7CisgICAgZHVyLnNwbGl0ISgic2Vjb25kcyIsICJ1c2VjcyIpKHR2LnR2X3NlYywgdHYudHZfdXNlYyk7CisgICAgcmV0dXJuIHR2OworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGxpYmV2ZW50IGZsYWdzIGNvbWJpbmF0aW9uIHRvIHJlcHJlc2VudCBhIGdpdmVuIFRBc3luY0V2ZW50VHlwZS4KKyAgICovCisgIHNob3J0IGxpYmV2ZW50RXZlbnRUeXBlKFRBc3luY0V2ZW50VHlwZSB0eXBlKSB7CisgICAgZmluYWwgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIFRBc3luY0V2ZW50VHlwZS5SRUFEOgorICAgICAgICByZXR1cm4gRVZfUkVBRCB8IEVWX0VUOworICAgICAgY2FzZSBUQXN5bmNFdmVudFR5cGUuV1JJVEU6CisgICAgICAgIHJldHVybiBFVl9XUklURSB8IEVWX0VUOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9zb2NrZXQuZCBiL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvc29ja2V0LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA4ZjUxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvc29ja2V0LmQKQEAgLTAsMCArMSwzNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuYXN5bmMuc29ja2V0OworCitpbXBvcnQgY29yZS5zdGRjLmVycm5vOiBFQ09OTlJFU0VUOworaW1wb3J0IGNvcmUudGhyZWFkIDogRmliZXI7CitpbXBvcnQgY29yZS50aW1lIDogZHVyLCBEdXJhdGlvbjsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eTsKK2ltcG9ydCBzdGQuY29udiA6IHRvOworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHN0ZC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmFzeW5jLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc29ja2V0IDogVFNvY2tldEJhc2U7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmVuZGlhbjsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuc29ja2V0OworCit2ZXJzaW9uIChXaW5kb3dzKSB7CisgIGltcG9ydCBzdGQuYy53aW5kb3dzLndpbnNvY2sgOiBjb25uZWN0OworfSBlbHNlIHZlcnNpb24gKFBvc2l4KSB7CisgIGltcG9ydCBjb3JlLnN5cy5wb3NpeC5zeXMuc29ja2V0IDogY29ubmVjdDsKK30gZWxzZSBzdGF0aWMgYXNzZXJ0KDAsICJEb24ndCBrbm93IGNvbm5lY3Qgb24gdGhpcyBwbGF0Zm9ybS4iKTsKKworLyoqCisgKiBOb24tYmxvY2tpbmcgc29ja2V0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KKyAqCisgKiBXaGVuZXZlciBhIHNvY2tldCBvcGVyYXRpb24gd291bGQgYmxvY2ssIFRBc3luY1NvY2tldCByZWdpc3RlcnMgYSBjYWxsYmFjaworICogd2l0aCB0aGUgc3BlY2lmaWVkIFRBc3luY1NvY2tldE1hbmFnZXIgYW5kIHlpZWxkcy4KKyAqCisgKiBBcyBmb3IgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQsIGR1ZSB0byB0aGUgbGltaXRhdGlvbnMgb2Ygc3RkLnNvY2tldCwKKyAqIGN1cnJlbnRseSBvbmx5IFRDUC9JUCBzb2NrZXRzIGFyZSBzdXBwb3J0ZWQgKGkuZS4gVW5peCBkb21haW4gc29ja2V0cyBhcmUKKyAqIG5vdCkuCisgKi8KK2NsYXNzIFRBc3luY1NvY2tldCA6IFRTb2NrZXRCYXNlLCBUQXN5bmNUcmFuc3BvcnQgeworICAvKioKKyAgICogQ29uc3RydWN0b3IgdGhhdCB0YWtlcyBhbiBhbHJlYWR5IGNyZWF0ZWQsIGNvbm5lY3RlZCAoISkgc29ja2V0LgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgYXN5bmNNYW5hZ2VyID0gVGhlIFRBc3luY1NvY2tldE1hbmFnZXIgdG8gdXNlIGZvciBub24tYmxvY2tpbmcgSS9PLgorICAgKiAgIHNvY2tldCA9IEFscmVhZHkgY3JlYXRlZCwgY29ubmVjdGVkIHNvY2tldCBvYmplY3QuIFdpbGwgYmUgc3dpdGNoZWQgdG8KKyAgICogICAgIG5vbi1ibG9ja2luZyBtb2RlIGlmIGl0IGlzbid0IGFscmVhZHkuCisgICAqLworICB0aGlzKFRBc3luY1NvY2tldE1hbmFnZXIgYXN5bmNNYW5hZ2VyLCBTb2NrZXQgc29ja2V0KSB7CisgICAgYXN5bmNNYW5hZ2VyXyA9IGFzeW5jTWFuYWdlcjsKKyAgICBzb2NrZXQuYmxvY2tpbmcgPSBmYWxzZTsKKyAgICBzdXBlcihzb2NrZXQpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgdW5jb25uZWN0ZWQgc29ja2V0IHRoYXQgd2lsbCBjb25uZWN0IHRvIHRoZSBnaXZlbiBob3N0CisgICAqIG9uIHRoZSBnaXZlbiBwb3J0LgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgYXN5bmNNYW5hZ2VyID0gVGhlIFRBc3luY1NvY2tldE1hbmFnZXIgdG8gdXNlIGZvciBub24tYmxvY2tpbmcgSS9PLgorICAgKiAgIGhvc3QgPSBSZW1vdGUgaG9zdC4KKyAgICogICBwb3J0ID0gUmVtb3RlIHBvcnQuCisgICAqLworICB0aGlzKFRBc3luY1NvY2tldE1hbmFnZXIgYXN5bmNNYW5hZ2VyLCBzdHJpbmcgaG9zdCwgdXNob3J0IHBvcnQpIHsKKyAgICBhc3luY01hbmFnZXJfID0gYXN5bmNNYW5hZ2VyOworICAgIHN1cGVyKGhvc3QsIHBvcnQpOworICB9CisKKyAgb3ZlcnJpZGUgVEFzeW5jTWFuYWdlciBhc3luY01hbmFnZXIoKSBAcHJvcGVydHkgeworICAgIHJldHVybiBhc3luY01hbmFnZXJfOworICB9CisKKyAgLyoqCisgICAqIEFzeW5jaHJvbm91c2x5IGNvbm5lY3RzIHRoZSBzb2NrZXQuCisgICAqCisgICAqIENvbXBsZXRlcyB3aXRob3V0IGJsb2NraW5nIGFuZCBkZWZlcnMgZnVydGhlciBvcGVyYXRpb25zIG9uIHRoZSBzb2NrZXQKKyAgICogdW50aWwgdGhlIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQuIElmIGNvbm5lY3RpbmcgZmFpbHMsIHRoaXMgaXMKKyAgICogY3VycmVudGx5IG5vdCBpbmRpY2F0ZWQgaW4gYW55IHdheSBvdGhlciB0aGFuIGV2ZXJ5IGNhbGwgdG8gcmVhZC93cml0ZQorICAgKiBmYWlsaW5nLgorICAgKi8KKyAgb3ZlcnJpZGUgdm9pZCBvcGVuKCkgeworICAgIGlmIChpc09wZW4pIHJldHVybjsKKworICAgIGVuZm9yY2UoIWhvc3RfLmVtcHR5LCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3Qgb3BlbiBudWxsIGhvc3QuIiwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisgICAgZW5mb3JjZShwb3J0XyAhPSAwLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3Qgb3BlbiB3aXRoIG51bGwgcG9ydC4iLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4pKTsKKworCisgICAgLy8gQ2Fubm90IHVzZSBzdGQuc29ja2V0LlNvY2tldC5jb25uZWN0IGhlcmUgYmVjYXVzZSBpdCBoaWRlcyBhd2F5CisgICAgLy8gRUlOUFJPR1JFU1MvV1NBV09VTERCTE9DSy4KKyAgICBBZGRyZXNzIGFkZHI7CisgICAgdHJ5IHsKKyAgICAgIC8vIEN1cnJlbnRseSwgd2UganVzdCBnbyB3aXRoIHRoZSBmaXJzdCBhZGRyZXNzIHJldHVybmVkLCBjb3VsZCBiZSBtYWRlCisgICAgICAvLyBtb3JlIGludGVsbGlnZW50IHRob3VnaCDigJMgSVB2Nj8KKyAgICAgIGFkZHIgPSBnZXRBZGRyZXNzKGhvc3RfLCBwb3J0XylbMF07CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGBVbmFibGUgdG8gcmVzb2x2ZSBob3N0ICJgIH4gaG9zdF8gfiBgIi5gLAorICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4sIF9fRklMRV9fLCBfX0xJTkVfXywgZSk7CisgICAgfQorCisgICAgc29ja2V0XyA9IG5ldyBUY3BTb2NrZXQoYWRkci5hZGRyZXNzRmFtaWx5KTsKKyAgICBzb2NrZXRfLmJsb2NraW5nID0gZmFsc2U7CisgICAgc2V0U29ja2V0T3B0cygpOworCisgICAgYXV0byBlcnJvckNvZGUgPSBjb25uZWN0KHNvY2tldF8uaGFuZGxlLCBhZGRyLm5hbWUoKSwgYWRkci5uYW1lTGVuKCkpOworICAgIGlmIChlcnJvckNvZGUgPT0gMCkgeworICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gY291bGQgYmUgZXN0YWJsaXNoZWQgaW1tZWRpYXRlbHksIGp1c3QgcmV0dXJuLiBJCisgICAgICAvLyBkb24ndCBrbm93IGlmIHRoaXMgZXZlciBoYXBwZW5zLgorICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gZXJybm8gPSBnZXRTb2NrZXRFcnJubygpOworICAgIGlmIChlcnJubyAhPSBDT05ORUNUX0lOUFJPR1JFU1NfRVJSTk8pIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGBDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gImAgfgorICAgICAgICBob3N0XyB+IGAiOiBgIH4gc29ja2V0RXJybm9TdHJpbmcoZXJybm8pLAorICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4pOworICAgIH0KKworICAgIC8vIFRoaXMgaXMgdGhlIGV4cGVjdGVkIGNhc2U6IGNvbm5lY3QoKSBzaWduYWxsZWQgdGhhdCB0aGUgY29ubmVjdGlvbgorICAgIC8vIGlzIGJlaW5nIGVzdGFibGlzaGVkIGluIHRoZSBiYWNrZ3JvdW5kLiBRdWV1ZSB1cCBhIHdvcmsgaXRlbSB3aXRoIHRoZQorICAgIC8vIGFzeW5jIG1hbmFnZXIgd2hpY2gganVzdCBkZWZlcnMgYW55IG90aGVyIG9wZXJhdGlvbnMgb24gdGhpcworICAgIC8vIFRBc3luY1NvY2tldCBpbnN0YW5jZSB1bnRpbCB0aGUgc29ja2V0IGlzIHJlYWR5LgorICAgIGFzeW5jTWFuYWdlcl8uZXhlY3V0ZSh0aGlzLAorICAgICAgeworICAgICAgICBhdXRvIGZpYmVyID0gRmliZXIuZ2V0VGhpcygpOworICAgICAgICBUQXN5bmNFdmVudFJlYXNvbiByZWFzb24gPSB2b2lkOworICAgICAgICBhc3luY01hbmFnZXJfLmFkZE9uZXNob3RMaXN0ZW5lcihzb2NrZXRfLCBUQXN5bmNFdmVudFR5cGUuV1JJVEUsCisgICAgICAgICAgY29ubmVjdFRpbWVvdXQsCisgICAgICAgICAgc2NvcGVkRGVsZWdhdGUoKFRBc3luY0V2ZW50UmVhc29uIHIpeyByZWFzb24gPSByOyBmaWJlci5jYWxsKCk7IH0pCisgICAgICAgICk7CisgICAgICAgIEZpYmVyLnlpZWxkKCk7CisKKyAgICAgICAgaWYgKHJlYXNvbiA9PSBUQXN5bmNFdmVudFJlYXNvbi5USU1FRF9PVVQpIHsKKyAgICAgICAgICAvLyBDbG9zZSB0aGUgY29ubmVjdGlvbiwgc28gdGhhdCBzdWJzZXF1ZW50IHdvcmsgaXRlbXMgZmFpbCBpbW1lZGlhdGVseS4KKyAgICAgICAgICBjbG9zZUltbWVkaWF0ZWx5KCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaW50IGVycm9yQ29kZSA9IHZvaWQ7CisgICAgICAgIHNvY2tldF8uZ2V0T3B0aW9uKFNvY2tldE9wdGlvbkxldmVsLlNPQ0tFVCwgY2FzdChTb2NrZXRPcHRpb24pU09fRVJST1IsCisgICAgICAgICAgZXJyb3JDb2RlKTsKKworICAgICAgICBpZiAoZXJyb3JDb2RlKSB7CisgICAgICAgICAgbG9nSW5mbygiQ291bGQgbm90IGNvbm5lY3QgVEFzeW5jU29ja2V0OiAlcyIsCisgICAgICAgICAgICBzb2NrZXRFcnJub1N0cmluZyhlcnJvckNvZGUpKTsKKworICAgICAgICAgIC8vIENsb3NlIHRoZSBjb25uZWN0aW9uLCBzbyB0aGF0IHN1YnNlcXVlbnQgd29yayBpdGVtcyBmYWlsIGltbWVkaWF0ZWx5LgorICAgICAgICAgIGNsb3NlSW1tZWRpYXRlbHkoKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgfQorICAgICk7CisgIH0KKworICAvKioKKyAgICogQ2xvc2VzIHRoZSBzb2NrZXQuCisgICAqCisgICAqIFdpbGwgYmxvY2sgdW50aWwgYWxsIGN1cnJlbnRseSBhY3RpdmUgb3BlcmF0aW9ucyBhcmUgZmluaXNoZWQgYmVmb3JlIHRoZQorICAgKiBzb2NrZXQgaXMgY2xvc2VkLgorICAgKi8KKyAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAoIWlzT3BlbikgcmV0dXJuOworCisgICAgaW1wb3J0IGNvcmUuc3luYy5jb25kaXRpb247CisgICAgaW1wb3J0IGNvcmUuc3luYy5tdXRleDsKKworICAgIGF1dG8gZG9uZU11dGV4ID0gbmV3IE11dGV4OworICAgIGF1dG8gZG9uZUNvbmQgPSBuZXcgQ29uZGl0aW9uKGRvbmVNdXRleCk7CisgICAgc3luY2hyb25pemVkIChkb25lTXV0ZXgpIHsKKyAgICAgIGFzeW5jTWFuYWdlcl8uZXhlY3V0ZSh0aGlzLAorICAgICAgICBzY29wZWREZWxlZ2F0ZSgKKyAgICAgICAgICB7CisgICAgICAgICAgICBjbG9zZUltbWVkaWF0ZWx5KCk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGRvbmVNdXRleCkgZG9uZUNvbmQubm90aWZ5QWxsKCk7CisgICAgICAgICAgfQorICAgICAgICApCisgICAgICApOworICAgICAgZG9uZUNvbmQud2FpdCgpOworICAgIH0KKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgcGVlaygpIHsKKyAgICBpZiAoIWlzT3BlbikgcmV0dXJuIGZhbHNlOworCisgICAgdWJ5dGUgYnVmOworICAgIGF1dG8gciA9IHNvY2tldF8ucmVjZWl2ZSgoJmJ1ZilbMC4uMV0sIFNvY2tldEZsYWdzLlBFRUspOworICAgIGlmIChyID09IFNvY2tldC5FUlJPUikgeworICAgICAgYXV0byBsYXN0RXJybm8gPSBnZXRTb2NrZXRFcnJubygpOworICAgICAgc3RhdGljIGlmIChjb25ucmVzZXRPblBlZXJTaHV0ZG93bikgeworICAgICAgICBpZiAobGFzdEVycm5vID09IEVDT05OUkVTRVQpIHsKKyAgICAgICAgICBjbG9zZUltbWVkaWF0ZWx5KCk7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUGVla2luZyBpbnRvIHNvY2tldCBmYWlsZWQ6ICIgfgorICAgICAgICBzb2NrZXRFcnJub1N0cmluZyhsYXN0RXJybm8pLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuVU5LTk9XTik7CisgICAgfQorICAgIHJldHVybiAociA+IDApOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWQodWJ5dGVbXSBidWYpIHsKKyAgICBlbmZvcmNlKGlzT3BlbiwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiQ2Fubm90IHJlYWQgaWYgc29ja2V0IGlzIG5vdCBvcGVuLiIsIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTikpOworCisgICAgdHlwZW9mKGdldFNvY2tldEVycm5vKCkpIGxhc3RFcnJubzsKKworICAgIGF1dG8gciA9IHlpZWxkT25CbG9jayhzb2NrZXRfLnJlY2VpdmUoY2FzdCh2b2lkW10pYnVmKSwKKyAgICAgIFRBc3luY0V2ZW50VHlwZS5SRUFEKTsKKworICAgIC8vIElmIHJlY3Ygd2VudCBmaW5lLCBpbW1lZGlhdGVseSByZXR1cm4uCisgICAgaWYgKHIgPj0gMCkgcmV0dXJuIHI7CisKKyAgICAvLyBTb21ldGhpbmcgd2VudCB3cm9uZywgZmluZCBvdXQgaG93IHRvIGhhbmRsZSBpdC4KKyAgICBsYXN0RXJybm8gPSBnZXRTb2NrZXRFcnJubygpOworCisgICAgc3RhdGljIGlmIChjb25ucmVzZXRPblBlZXJTaHV0ZG93bikgeworICAgICAgLy8gU2VlIHRvcCBjb21tZW50LgorICAgICAgaWYgKGxhc3RFcnJubyA9PSBFQ09OTlJFU0VUKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKworICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJSZWNlaXZpbmcgZnJvbSBzb2NrZXQgZmFpbGVkOiAiIH4KKyAgICAgIHNvY2tldEVycm5vU3RyaW5nKGxhc3RFcnJubyksIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5VTktOT1dOKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgd3JpdGUoaW4gdWJ5dGVbXSBidWYpIHsKKyAgICBzaXplX3Qgc2VudDsKKyAgICB3aGlsZSAoc2VudCA8IGJ1Zi5sZW5ndGgpIHsKKyAgICAgIHNlbnQgKz0gd3JpdGVTb21lKGJ1ZltzZW50IC4uICRdKTsKKyAgICB9CisgICAgYXNzZXJ0KHNlbnQgPT0gYnVmLmxlbmd0aCk7CisgIH0KKworICBvdmVycmlkZSBzaXplX3Qgd3JpdGVTb21lKGluIHVieXRlW10gYnVmKSB7CisgICAgZW5mb3JjZShpc09wZW4sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCB3cml0ZSBpZiBzb2NrZXQgaXMgbm90IG9wZW4uIiwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisKKyAgICBhdXRvIHIgPSB5aWVsZE9uQmxvY2soc29ja2V0Xy5zZW5kKGJ1ZiksIFRBc3luY0V2ZW50VHlwZS5XUklURSk7CisKKyAgICAvLyBFdmVyeXRoaW5nIHdlbnQgd2VsbCwganVzdCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgorICAgIGlmIChyID4gMCkgcmV0dXJuIHI7CisKKyAgICAvLyBIYW5kbGUgZXJyb3IgY29uZGl0aW9ucy4KKyAgICBpZiAociA8IDApIHsKKyAgICAgIGF1dG8gbGFzdEVycm5vID0gZ2V0U29ja2V0RXJybm8oKTsKKworICAgICAgYXV0byB0eXBlID0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLlVOS05PV047CisgICAgICBpZiAoaXNTb2NrZXRDbG9zZUVycm5vKGxhc3RFcnJubykpIHsKKyAgICAgICAgdHlwZSA9IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTjsKKyAgICAgICAgY2xvc2VJbW1lZGlhdGVseSgpOworICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiU2VuZGluZyB0byBzb2NrZXQgZmFpbGVkOiAiIH4KKyAgICAgICAgc29ja2V0RXJybm9TdHJpbmcobGFzdEVycm5vKSwgdHlwZSk7CisgICAgfQorCisgICAgLy8gc2VuZCgpIHNob3VsZCBuZXZlciByZXR1cm4gMC4KKyAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiU2VuZGluZyB0byBzb2NrZXQgZmFpbGVkICgwIGJ5dGVzIHdyaXR0ZW4pLiIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuVU5LTk9XTik7CisgIH0KKworICAvLy8gVGhlIGFtb3VudCBvZiB0aW1lIGluIHdoaWNoIGEgY29ubmNldGlvbiBtdXN0IGJlIGVzdGFibGlzaGVkIGJlZm9yZSB0aGUKKyAgLy8vIG9wZW4oKSBjYWxsIHRpbWVzIG91dC4KKyAgRHVyYXRpb24gY29ubmVjdFRpbWVvdXQgPSBkdXIhInNlY29uZHMiKDUpOworCitwcml2YXRlOgorICB2b2lkIGNsb3NlSW1tZWRpYXRlbHkoKSB7CisgICAgc29ja2V0Xy5jbG9zZSgpOworICAgIHNvY2tldF8gPSBudWxsOworICB9CisKKyAgVCB5aWVsZE9uQmxvY2soVCkobGF6eSBUIGNhbGwsIFRBc3luY0V2ZW50VHlwZSBldmVudFR5cGUpIHsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgYXV0byByZXN1bHQgPSBjYWxsKCk7CisgICAgICBpZiAocmVzdWx0ICE9IFNvY2tldC5FUlJPUiB8fCBnZXRTb2NrZXRFcnJubygpICE9IFdPVUxEX0JMT0NLX0VSUk5PKSByZXR1cm4gcmVzdWx0OworCisgICAgICAvLyBXZSBnb3QgYW4gRUFHQUlOIHJlc3VsdCwgcmVnaXN0ZXIgYSBjYWxsYmFjayB0byByZXR1cm4gaGVyZSBvbmNlIHNvbWUKKyAgICAgIC8vIGV2ZW50IGhhcHBlbnMgYW5kIHlpZWxkLgorCisgICAgICBEdXJhdGlvbiB0aW1lb3V0ID0gdm9pZDsKKyAgICAgIGZpbmFsIHN3aXRjaCAoZXZlbnRUeXBlKSB7CisgICAgICAgIGNhc2UgVEFzeW5jRXZlbnRUeXBlLlJFQUQ6CisgICAgICAgICAgdGltZW91dCA9IHJlY3ZUaW1lb3V0XzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUQXN5bmNFdmVudFR5cGUuV1JJVEU6CisgICAgICAgICAgdGltZW91dCA9IHNlbmRUaW1lb3V0XzsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgYXV0byBmaWJlciA9IEZpYmVyLmdldFRoaXMoKTsKKyAgICAgIGFzc2VydChmaWJlciwgIkN1cnJlbnQgZmliZXIgbnVsbCDigJMgbm90IHJ1bm5pbmcgaW4gVEFzeW5jTWFuYWdlcj8iKTsKKyAgICAgIFRBc3luY0V2ZW50UmVhc29uIGV2ZW50UmVhc29uID0gdm9pZDsKKyAgICAgIGFzeW5jTWFuYWdlcl8uYWRkT25lc2hvdExpc3RlbmVyKHNvY2tldF8sIGV2ZW50VHlwZSwgdGltZW91dCwKKyAgICAgICAgc2NvcGVkRGVsZWdhdGUoKFRBc3luY0V2ZW50UmVhc29uIHJlYXNvbikgeworICAgICAgICAgIGV2ZW50UmVhc29uID0gcmVhc29uOworICAgICAgICAgIGZpYmVyLmNhbGwoKTsKKyAgICAgICAgfSkKKyAgICAgICk7CisKKyAgICAgIC8vIFlpZWxkcyBleGVjdXRpb24gYmFjayB0byB0aGUgYXN5bmMgbWFuYWdlciwgd2lsbCByZXR1cm4gYmFjayBoZXJlIG9uY2UKKyAgICAgIC8vIHRoZSBhYm92ZSBsaXN0ZW5lciBpcyBjYWxsZWQuCisgICAgICBGaWJlci55aWVsZCgpOworCisgICAgICBpZiAoZXZlbnRSZWFzb24gPT0gVEFzeW5jRXZlbnRSZWFzb24uVElNRURfT1VUKSB7CisgICAgICAgIC8vIElmIHdlIGFyZSBjYW5jZWxsaW5nIHRoZSByZXF1ZXN0IGR1ZSB0byBhIHRpbWVkIG91dCBvcGVyYXRpb24sIHRoZQorICAgICAgICAvLyBjb25uZWN0aW9uIGlzIGluIGFuIHVuZGVmaW5lZCBzdGF0ZSwgYmVjYXVzZSB0aGUgc2VydmVyIGNvdWxkIGRlY2lkZQorICAgICAgICAvLyB0byBzZW5kIHRoZSByZXF1ZXN0ZWQgZGF0YSBsYXRlciwgb3Igd2UgY291bGQgaGF2ZSBhbHJlYWR5IGJlZW4gaGFsZi0KKyAgICAgICAgLy8gd2F5IGludG8gd3JpdGluZyBhIHJlcXVlc3QuIFRodXMsIHdlIGNsb3NlIHRoZSBjb25uZWN0aW9uIHRvIG1ha2UgYW55CisgICAgICAgIC8vIHBvc3NpYmx5IHF1ZXVlZCB1cCB3b3JrIGl0ZW1zIGZhaWwgaW1tZWRpYXRlbHkuIEJlc2lkZXMsIHRoZSBzZXJ2ZXIKKyAgICAgICAgLy8gaXMgbm90IHZlcnkgbGlrZWx5IHRvIGltbWVkaWF0ZWx5IHJlY292ZXIgYWZ0ZXIgYSBzb2NrZXQtbGV2ZWwKKyAgICAgICAgLy8gdGltZW91dCBoYXMgZXhwaXJlZCBhbnl3YXkuCisgICAgICAgIGNsb3NlSW1tZWRpYXRlbHkoKTsKKworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiVGltZWQgb3V0IHdoaWxlIHdhaXRpbmcgZm9yIHNvY2tldCAiIH4KKyAgICAgICAgICAidG8gZ2V0IHJlYWR5IHRvICIgfiB0byFzdHJpbmcoZXZlbnRUeXBlKSB+ICIuIiwKKyAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuVElNRURfT1VUKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLy8gVGhlIFRBc3luY1NvY2tldE1hbmFnZXIgdG8gdXNlIGZvciBub24tYmxvY2tpbmcgSS9PLgorICBUQXN5bmNTb2NrZXRNYW5hZ2VyIGFzeW5jTWFuYWdlcl87Cit9CisKK3ByaXZhdGUgeworICAvLyBzdGQuc29ja2V0IGRvZXNuJ3QgaW5jbHVkZSBTT19FUlJPUiBmb3IgcmVhc29ucyB1bmtub3duLgorICB2ZXJzaW9uIChsaW51eCkgeworICAgIGVudW0gU09fRVJST1IgPSA0OworICB9IGVsc2UgdmVyc2lvbiAoT1NYKSB7CisgICAgZW51bSBTT19FUlJPUiA9IDB4MTAwNzsKKyAgfSBlbHNlIHZlcnNpb24gKEZyZWVCU0QpIHsKKyAgICBlbnVtIFNPX0VSUk9SID0gMHgxMDA3OworICB9IGVsc2UgdmVyc2lvbiAoV2luMzIpIHsKKyAgICBpbXBvcnQgc3RkLmMud2luZG93cy53aW5zb2NrIDogU09fRVJST1I7CisgIH0gZWxzZSBzdGF0aWMgYXNzZXJ0KGZhbHNlLCAiRG9uJ3Qga25vdyBTT19FUlJPUiBvbiB0aGlzIHBsYXRmb3JtLiIpOworCisgIC8vIFRoaXMgaGFjayBmb3JjZXMgYSBkZWxlZ2F0ZSBsaXRlcmFsIHRvIGJlIHNjb3BlZCwgZXZlbiBpZiBpdCBpcyBwYXNzZWQgdG8KKyAgLy8gYSBmdW5jdGlvbiBhY2NlcHRpbmcgbm9ybWFsIGRlbGVnYXRlcyBhcyB3ZWxsLiBETUQgbGlrZXMgdG8gYWxsb2NhdGUgdGhlCisgIC8vIGNvbnRleHQgb24gdGhlIGhlYXAgYW55d2F5LCBidXQgaXQgc2VlbXMgdG8gd29yayBmb3IgTERDLgorICBpbXBvcnQgc3RkLnRyYWl0cyA6IGlzRGVsZWdhdGU7CisgIGF1dG8gc2NvcGVkRGVsZWdhdGUoRCkoc2NvcGUgRCBkKSBpZiAoaXNEZWxlZ2F0ZSFEKSB7CisgICAgcmV0dXJuIGQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvc3NsLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL3NzbC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNjI0MjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL3NzbC5kCkBAIC0wLDAgKzEsMjkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LmFzeW5jLnNzbDsKKworaW1wb3J0IGNvcmUudGhyZWFkIDogRmliZXI7CitpbXBvcnQgY29yZS50aW1lIDogRHVyYXRpb247CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHk7CitpbXBvcnQgc3RkLmNvbnYgOiB0bzsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCBzdGQuc29ja2V0OworaW1wb3J0IGRlaW1vcy5vcGVuc3NsLmVycjsKK2ltcG9ydCBkZWltb3Mub3BlbnNzbC5zc2w7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmFzeW5jLmJhc2U7CitpbXBvcnQgdGhyaWZ0LmFzeW5jLnNvY2tldDsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuc3NsOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5zc2xfYmlvOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnNzbDsKKworLyoqCisgKiBQcm92aWRlcyBTU0wvVExTIGVuY3J5cHRpb24gZm9yIGFzeW5jIHNvY2tldHMuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgY29uc2lkZXJlZCBleHBlcmltZW50YWwsIGFzIGl0IGNvbnRleHQtc3dpdGNoZXMKKyAqIGJldHdlZW4gZmliZXJzIGZyb20gd2l0aGluIE9wZW5TU0wgY2FsbHMsIGFuZCB0aGUgc2FmZXR5IG9mIHRoaXMgaGFzIG5vdCB5ZXQKKyAqIGJlZW4gdmVyaWZpZWQuCisgKgorICogRm9yIG9idmlvdXMgcmVhc29ucyAodGhlIFNTTCBjb25uZWN0aW9uIGlzIHN0YXRlZnVsKSwgbW9yZSB0aGFuIG9uZSBpbnN0YW5jZQorICogc2hvdWxkIG5ldmVyIGJlIHVzZWQgb24gYSBnaXZlbiBzb2NrZXQgYXQgdGhlIHNhbWUgdGltZS4KKyAqLworLy8gTm90ZTogVGhpcyBjb3VsZCBlYXNpbHkgYmUgZXh0ZW5kZWQgdG8gb3RoZXIgdHJhbnNwb3J0cyBpbiB0aGUgZnV0dXJlIGFzIHdlbGwuCisvLyBUaGVyZSBhcmUgb25seSB0d28gcGFydHMgb2YgdGhlIGltcGxlbWVudGF0aW9uIHdoaWNoIGRvbid0IHdvcmsgd2l0aCBhIGdlbmVyaWMKKy8vIFRUcmFuc3BvcnQ6IDEpIHRoZSBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24sIGZvciB3aGljaCBwZWVyIG5hbWUvYWRkcmVzcyBhcmUKKy8vIG5lZWRlZCBmcm9tIHRoZSBzb2NrZXQsIGFuZCAyKSB0aGUgY29ubmVjdGlvbiBzaHV0ZG93biwgd2hlcmUgdGhlIGFzc29jaWF0ZWQKKy8vIGFzeW5jIG1hbmFnZXIgaXMgbmVlZGVkIGJlY2F1c2UgY2xvc2UoKSBpcyBub3QgdXN1YWxseSBjYWxsZWQgZnJvbSB3aXRoaW4gYQorLy8gd29yayBpdGVtLgorZmluYWwgY2xhc3MgVEFzeW5jU1NMU29ja2V0IDogVEJhc2VUcmFuc3BvcnQgeworICAvKioKKyAgICogQ29uc3RydWN0b3IuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBjb250ZXh0ID0gVGhlIFNTTCBzb2NrZXQgY29udGV4dCB0byB1c2UuIEEgcmVmZXJlbmNlIHRvIGl0IGlzIHN0b3JlZCBzbworICAgKiAgICAgdGhhdCBpdCBkb2VzIG5vdCBnZXQgY2xlYW5lZCB1cCB3aGlsZSB0aGUgc29ja2V0IGlzIHVzZWQuCisgICAqICAgdHJhbnNwb3J0ID0gVGhlIHVuZGVybHlpbmcgYXN5bmMgbmV0d29yayB0cmFuc3BvcnQgdG8gdXNlIGZvcgorICAgKiAgICAgY29tbXVuaWNhdGlvbi4KKyAgICovCisgIHRoaXMoVEFzeW5jU29ja2V0IHVuZGVybHlpbmdTb2NrZXQsIFRTU0xDb250ZXh0IGNvbnRleHQpIHsKKyAgICBzb2NrZXRfID0gdW5kZXJseWluZ1NvY2tldDsKKyAgICBjb250ZXh0XyA9IGNvbnRleHQ7CisgICAgc2VydmVyU2lkZV8gPSBjb250ZXh0LnNlcnZlclNpZGU7CisgICAgYWNjZXNzTWFuYWdlcl8gPSBjb250ZXh0LmFjY2Vzc01hbmFnZXI7CisgIH0KKworICBvdmVycmlkZSBib29sIGlzT3BlbigpIEBwcm9wZXJ0eSB7CisgICAgaWYgKHNzbF8gaXMgbnVsbCB8fCAhc29ja2V0Xy5pc09wZW4pIHJldHVybiBmYWxzZTsKKworICAgIGF1dG8gc2h1dGRvd24gPSBTU0xfZ2V0X3NodXRkb3duKHNzbF8pOworICAgIGJvb2wgc2h1dGRvd25SZWNlaXZlZCA9IChzaHV0ZG93biAmIFNTTF9SRUNFSVZFRF9TSFVURE9XTikgIT0gMDsKKyAgICBib29sIHNodXRkb3duU2VudCA9IChzaHV0ZG93biAmIFNTTF9TRU5UX1NIVVRET1dOKSAhPSAwOworICAgIHJldHVybiAhKHNodXRkb3duUmVjZWl2ZWQgJiYgc2h1dGRvd25TZW50KTsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgcGVlaygpIHsKKyAgICBpZiAoIWlzT3BlbikgcmV0dXJuIGZhbHNlOworICAgIGNoZWNrSGFuZHNoYWtlKCk7CisKKyAgICBieXRlIGJ0ID0gdm9pZDsKKyAgICBhdXRvIHJjID0gU1NMX3BlZWsoc3NsXywgJmJ0LCBidC5zaXplb2YpOworICAgIHNzbEVuZm9yY2UocmMgPj0gMCwgIlNTTF9wZWVrIik7CisKKyAgICBpZiAocmMgPT0gMCkgeworICAgICAgRVJSX2NsZWFyX2Vycm9yKCk7CisgICAgfQorICAgIHJldHVybiAocmMgPiAwKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgb3BlbigpIHsKKyAgICBlbmZvcmNlKCFzZXJ2ZXJTaWRlXywgIkNhbm5vdCBvcGVuIGEgc2VydmVyLXNpZGUgU1NMIHNvY2tldC4iKTsKKyAgICBpZiAoaXNPcGVuKSByZXR1cm47CisKKyAgICBpZiAoc3NsXykgeworICAgICAgLy8gSWYgdGhlIHVuZGVybHlpbmcgc29ja2V0IHdhcyBhdXRvbWF0aWNhbGx5IGNsb3NlZCBiZWNhdXNlIG9mIGFuIGVycm9yCisgICAgICAvLyAoaS5lLiBjbG9zZSgpIHdhcyBjYWxsZWQgZnJvbSBpbnNpZGUgYSBzb2NrZXQgbWV0aG9kKSwgd2UgY2FuIGxhbmQKKyAgICAgIC8vIGhlcmUgd2l0aCB0aGUgU1NMIG9iamVjdCBzdGlsbCBhbGxvY2F0ZWQ7IGRlbGV0ZSBpdCBoZXJlLgorICAgICAgY2xlYW51cFNTTCgpOworICAgIH0KKworICAgIHNvY2tldF8ub3BlbigpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAoIWlzT3BlbikgcmV0dXJuOworCisgICAgaWYgKHNzbF8gIWlzIG51bGwpIHsKKyAgICAgIC8vIFNTTCBuZWVkcyB0byBzZW5kL3JlY2VpdmUgZGF0YSBvdmVyIHRoZSBzb2NrZXQgYXMgcGFydCBvZiB0aGUgc2h1dGRvd24KKyAgICAgIC8vIHByb3RvY29sLCBzbyB3ZSBtdXN0IGV4ZWN1dGUgdGhlIGNhbGxzIGluIHRoZSBjb250ZXh0IG9mIHRoZSBhc3NvY2lhdGVkCisgICAgICAvLyBhc3luYyBtYW5hZ2VyLiBPbiB0aGUgb3RoZXIgaGFuZCwgVFRyYW5zcG9ydCBjbGllbnRzIGV4cGVjdCB0aGUgc29ja2V0CisgICAgICAvLyB0byBiZSBjbG9zZWQgd2hlbiBjbG9zZSgpIHJldHVybnMsIHNvIHdlIGhhdmUgdG8gYmxvY2sgdW50aWwgdGhlCisgICAgICAvLyBzaHV0ZG93biB3b3JrIGl0ZW0gaGFzIGJlZW4gZXhlY3V0ZWQuCisgICAgICBpbXBvcnQgY29yZS5zeW5jLmNvbmRpdGlvbjsKKyAgICAgIGltcG9ydCBjb3JlLnN5bmMubXV0ZXg7CisKKyAgICAgIGludCByYyA9IHZvaWQ7CisgICAgICBhdXRvIGRvbmVNdXRleCA9IG5ldyBNdXRleDsKKyAgICAgIGF1dG8gZG9uZUNvbmQgPSBuZXcgQ29uZGl0aW9uKGRvbmVNdXRleCk7CisgICAgICBzeW5jaHJvbml6ZWQgKGRvbmVNdXRleCkgeworICAgICAgICBzb2NrZXRfLmFzeW5jTWFuYWdlci5leGVjdXRlKHNvY2tldF8sIHsKKyAgICAgICAgICByYyA9IFNTTF9zaHV0ZG93bihzc2xfKTsKKyAgICAgICAgICBpZiAocmMgPT0gMCkgeworICAgICAgICAgICAgcmMgPSBTU0xfc2h1dGRvd24oc3NsXyk7CisgICAgICAgICAgfQorICAgICAgICAgIHN5bmNocm9uaXplZCAoZG9uZU11dGV4KSBkb25lQ29uZC5ub3RpZnlBbGwoKTsKKyAgICAgICAgfSk7CisgICAgICAgIGRvbmVDb25kLndhaXQoKTsKKyAgICAgIH0KKworICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAvLyBEbyBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIGhlcmUgYXMgbGVhdmluZyB0aGUgdHJhbnNwb3J0ICJvcGVuIiB3aWxsCisgICAgICAgIC8vIHByb2JhYmx5IHByb2R1Y2Ugb25seSBtb3JlIGVycm9ycywgYW5kIHRoZSBjaGFuY2Ugd2UgY2FuIGRvCisgICAgICAgIC8vIHNvbWV0aGluZyBhYm91dCB0aGUgZXJyb3IgZS5nLiBieSByZXRyeWluZyBpcyB2ZXJ5IGxvdy4KKyAgICAgICAgbG9nRXJyb3IoIkVycm9yIHdoaWxlIHNodXR0aW5nIGRvd24gU1NMOiAlcyIsIGdldFNTTEV4Y2VwdGlvbigpKTsKKyAgICAgIH0KKworICAgICAgY2xlYW51cFNTTCgpOworICAgIH0KKworICAgIHNvY2tldF8uY2xvc2UoKTsKKyAgfQorCisgIG92ZXJyaWRlIHNpemVfdCByZWFkKHVieXRlW10gYnVmKSB7CisgICAgY2hlY2tIYW5kc2hha2UoKTsKKyAgICBhdXRvIHJjID0gU1NMX3JlYWQoc3NsXywgYnVmLnB0ciwgY2FzdChpbnQpYnVmLmxlbmd0aCk7CisgICAgc3NsRW5mb3JjZShyYyA+PSAwLCAiU1NMX3JlYWQiKTsKKyAgICByZXR1cm4gcmM7CisgIH0KKworICBvdmVycmlkZSB2b2lkIHdyaXRlKGluIHVieXRlW10gYnVmKSB7CisgICAgY2hlY2tIYW5kc2hha2UoKTsKKworICAgIC8vIExvb3AgaW4gY2FzZSBTU0xfTU9ERV9FTkFCTEVfUEFSVElBTF9XUklURSBpcyBzZXQgaW4gU1NMX0NUWC4KKyAgICBzaXplX3Qgd3JpdHRlbiA9IDA7CisgICAgd2hpbGUgKHdyaXR0ZW4gPCBidWYubGVuZ3RoKSB7CisgICAgICBhdXRvIGJ5dGVzID0gU1NMX3dyaXRlKHNzbF8sIGJ1Zi5wdHIgKyB3cml0dGVuLAorICAgICAgICBjYXN0KGludCkoYnVmLmxlbmd0aCAtIHdyaXR0ZW4pKTsKKyAgICAgIHNzbEVuZm9yY2UoYnl0ZXMgPiAwLCAiU1NMX3dyaXRlIik7CisgICAgICB3cml0dGVuICs9IGJ5dGVzOworICAgIH0KKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgZmx1c2goKSB7CisgICAgY2hlY2tIYW5kc2hha2UoKTsKKworICAgIGF1dG8gYmlvID0gU1NMX2dldF93YmlvKHNzbF8pOworICAgIGVuZm9yY2UoYmlvICFpcyBudWxsLCBuZXcgVFNTTEV4Y2VwdGlvbigiU1NMX2dldF93YmlvIHJldHVybmVkIG51bGwiKSk7CisKKyAgICBhdXRvIHJjID0gQklPX2ZsdXNoKGJpbyk7CisgICAgc3NsRW5mb3JjZShyYyA9PSAxLCAiQklPX2ZsdXNoIik7CisgIH0KKworICAvKioKKyAgICogV2hldGhlciB0byB1c2UgY2xpZW50IG9yIHNlcnZlciBzaWRlIFNTTCBoYW5kc2hha2UgcHJvdG9jb2wuCisgICAqLworICBib29sIHNlcnZlclNpZGUoKSBAcHJvcGVydHkgY29uc3QgeworICAgIHJldHVybiBzZXJ2ZXJTaWRlXzsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIHNlcnZlclNpZGUoYm9vbCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBzZXJ2ZXJTaWRlXyA9IHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIFRoZSBhY2Nlc3MgbWFuYWdlciB0byB1c2UuCisgICAqLworICB2b2lkIGFjY2Vzc01hbmFnZXIoVEFjY2Vzc01hbmFnZXIgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgYWNjZXNzTWFuYWdlcl8gPSB2YWx1ZTsKKyAgfQorCitwcml2YXRlOgorICAvKioKKyAgICogSWYgdGhlIGNvbmRpdGlvbiBpcyBmYWxzZSwgY2xlYW5zIHVwIHRoZSBTU0wgY29ubmVjdGlvbiBhbmQgdGhyb3dzIHRoZQorICAgKiBleGNlcHRpb24gZm9yIHRoZSBsYXN0IFNTTCBlcnJvci4KKyAgICovCisgIHZvaWQgc3NsRW5mb3JjZShib29sIGNvbmRpdGlvbiwgc3RyaW5nIGxvY2F0aW9uKSB7CisgICAgaWYgKCFjb25kaXRpb24pIHsKKyAgICAgIC8vIFdlIG5lZWQgdG8gZmV0Y2ggdGhlIGVycm9yIGZpcnN0LCBhcyB0aGUgZXJyb3Igc3RhY2sgd2lsbCBiZSBjbGVhbmVkCisgICAgICAvLyB3aGVuIHNodXR0aW5nIGRvd24gU1NMLgorICAgICAgYXV0byBlID0gZ2V0U1NMRXhjZXB0aW9uKGxvY2F0aW9uKTsKKyAgICAgIGNsZWFudXBTU0woKTsKKyAgICAgIHRocm93IGU7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEZyZWVzIHRoZSBTU0wgY29ubmVjdGlvbiBvYmplY3QgYW5kIGNsZWFycyB0aGUgU1NMIGVycm9yIHN0YXRlLgorICAgKi8KKyAgdm9pZCBjbGVhbnVwU1NMKCkgeworICAgIFNTTF9mcmVlKHNzbF8pOworICAgIHNzbF8gPSBudWxsOworICAgIEVSUl9yZW1vdmVfc3RhdGUoMCk7CisgIH0KKworICAvKioKKyAgICogTWFrZXMgc3VyZSB0aGUgU1NMIGNvbm5lY3Rpb24gaXMgdXAgYW5kIHJ1bm5pbmcsIGFuZCBpbml0aWFsaXplcyBpdCBpZiBub3QuCisgICAqLworICB2b2lkIGNoZWNrSGFuZHNoYWtlKCkgeworICAgIGVuZm9yY2Uoc29ja2V0Xy5pc09wZW4sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisKKyAgICBpZiAoc3NsXyAhaXMgbnVsbCkgcmV0dXJuOworICAgIHNzbF8gPSBjb250ZXh0Xy5jcmVhdGVTU0woKTsKKworICAgIGF1dG8gYmlvID0gY3JlYXRlVFRyYW5zcG9ydEJJTyhzb2NrZXRfLCBmYWxzZSk7CisgICAgU1NMX3NldF9iaW8oc3NsXywgYmlvLCBiaW8pOworCisgICAgaW50IHJjID0gdm9pZDsKKyAgICBpZiAoc2VydmVyU2lkZV8pIHsKKyAgICAgIHJjID0gU1NMX2FjY2VwdChzc2xfKTsKKyAgICB9IGVsc2UgeworICAgICAgcmMgPSBTU0xfY29ubmVjdChzc2xfKTsKKyAgICB9CisgICAgZW5mb3JjZShyYyA+IDAsIGdldFNTTEV4Y2VwdGlvbigpKTsKKworICAgIGF1dG8gYWRkciA9IHNvY2tldF8uZ2V0UGVlckFkZHJlc3MoKTsKKyAgICBhdXRob3JpemUoc3NsXywgYWNjZXNzTWFuYWdlcl8sIGFkZHIsCisgICAgICAoc2VydmVyU2lkZV8gPyBhZGRyLnRvSG9zdE5hbWVTdHJpbmcoKSA6IHNvY2tldF8uaG9zdCkpOworICB9CisKKyAgVEFzeW5jU29ja2V0IHNvY2tldF87CisgIGJvb2wgc2VydmVyU2lkZV87CisgIFNTTCogc3NsXzsKKyAgVFNTTENvbnRleHQgY29udGV4dF87CisgIFRBY2Nlc3NNYW5hZ2VyIGFjY2Vzc01hbmFnZXJfOworfQorCisvKioKKyAqIFdyYXBzIHBhc3NlZCBUQXN5bmNTb2NrZXQgaW5zdGFuY2VzIGludG8gVEFzeW5jU1NMU29ja2V0cy4KKyAqCisgKiBUeXBpY2FsbHkgdXNlZCB3aXRoIFRBc3luY0NsaWVudC4gQXMgYW4gdW5mb3J0dW5hdGUgY29uc2VxdWVuY2Ugb2YgdGhlCisgKiBhc3luYyBjbGllbnQgZGVzaWduLCB0aGUgcGFzc2VkIHRyYW5zcG9ydHMgY2Fubm90IGJlIHN0YXRpY2FsbHkgdmVyaWZpZWQgdG8KKyAqIGJlIG9mIHR5cGUgVEFzeW5jU29ja2V0LiBJbnN0ZWFkLCB0aGUgdHlwZSBpcyB2ZXJpZmllZCBhdCBydW50aW1lIOKAkyBpZiBhCisgKiB0cmFuc3BvcnQgb2YgYW4gdW5leHBlY3RlZCB0eXBlIGlzIHBhc3NlZCB0byBnZXRUcmFuc3BvcnQoKSwgaXQgZmFpbHMsCisgKiB0aHJvd2luZyBhIFRUcmFuc3BvcnRFeGNlcHRpb24uCisgKgorICogRXhhbXBsZToKKyAqIC0tLQorICogYXV0byBjb250ZXh0ID0gbndlIFRTU0xDb250ZXh0KCk7CisgKiAuLi4gLy8gQ29uZmlndXJlIFNTTCBjb250ZXh0LgorICogYXV0byBmYWN0b3J5ID0gbmV3IFRBc3luY1NTTFNvY2tldEZhY3RvcnkoY29udGV4dCk7CisgKgorICogYXV0byBzb2NrZXQgPSBuZXcgVEFzeW5jU29ja2V0KHNvbWVBc3luY01hbmFnZXIsIGhvc3QsIHBvcnQpOworICogc29ja2V0Lm9wZW4oKTsKKyAqCisgKiBhdXRvIGNsaWVudCA9IG5ldyBUQXN5bmNDbGllbnQhU2VydmljZSh0cmFuc3BvcnQsIGZhY3RvcnksCisgKiAgIG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ISgpKTsKKyAqIC0tLQorICovCitjbGFzcyBUQXN5bmNTU0xTb2NrZXRGYWN0b3J5IDogVFRyYW5zcG9ydEZhY3RvcnkgeworICAvLy8KKyAgdGhpcyhUU1NMQ29udGV4dCBjb250ZXh0KSB7CisgICAgY29udGV4dF8gPSBjb250ZXh0OworICB9CisKKyAgb3ZlcnJpZGUgVEFzeW5jU1NMU29ja2V0IGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworICAgIGF1dG8gc29ja2V0ID0gY2FzdChUQXN5bmNTb2NrZXQpdHJhbnNwb3J0OworICAgIGVuZm9yY2Uoc29ja2V0LCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJUQXN5bmNTU0xTb2NrZXRGYWN0b3J5IHJlcXVpcmVzIGEgVEFzeW5jU29ja2V0IHRvIHdvcmsgb24sIG5vdCBhICIgfgorICAgICAgdG8hc3RyaW5nKHR5cGVpZCh0cmFuc3BvcnQpKSB+ICIuIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5JTlRFUk5BTF9FUlJPUgorICAgICkpOworICAgIHJldHVybiBuZXcgVEFzeW5jU1NMU29ja2V0KHNvY2tldCwgY29udGV4dF8pOworICB9CisKK3ByaXZhdGU6CisgIFRTU0xDb250ZXh0IGNvbnRleHRfOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9iYXNlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2Jhc2UuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWVjZTczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9iYXNlLmQKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuYmFzZTsKKworLyoqCisgKiBDb21tb24gYmFzZSBjbGFzcyBmb3IgYWxsIFRocmlmdCBleGNlcHRpb25zLgorICovCitjbGFzcyBURXhjZXB0aW9uIDogRXhjZXB0aW9uIHsKKyAgLy8vCisgIHRoaXMoc3RyaW5nIG1zZyA9ICIiLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fLAorICAgIFRocm93YWJsZSBuZXh0ID0gbnVsbCkKKyAgeworICAgIHN1cGVyKG1zZywgZmlsZSwgbGluZSwgbmV4dCk7CisgIH0KK30KKworLyoqCisgKiBBbiBvcGVyYXRpb24gZmFpbGVkIGJlY2F1c2Ugb25lIG9yIG1vcmUgc3ViLXRhc2tzIGZhaWxlZC4KKyAqLworY2xhc3MgVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uIDogVEV4Y2VwdGlvbiB7CisgIC8vLworICB0aGlzKHN0cmluZyBtc2csIEV4Y2VwdGlvbltdIGV4Y2VwdGlvbnMsIHN0cmluZyBmaWxlID0gX19GSUxFX18sCisgICAgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywgVGhyb3dhYmxlIG5leHQgPSBudWxsKQorICB7CisgICAgc3VwZXIobXNnLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgICB0aGlzLmV4Y2VwdGlvbnMgPSBleGNlcHRpb25zOworICB9CisKKyAgLy8vIFRoZSBleGNlcHRpb25zIHRocm93biBieSB0aGUgY2hpbGRyZW4gb2YgdGhlIG9wZXJhdGlvbi4gSWYgYXBwbGljYWJsZSwKKyAgLy8vIHRoZSBsaXN0IGlzIG9yZGVyZWQgaW4gdGhlIHNhbWUgd2F5IHRoZSBleGNlcHRpb25zIG9jY3VycmVkLgorICBFeGNlcHRpb25bXSBleGNlcHRpb25zOworfQorCisvLy8gVGhlIFRocmlmdCB2ZXJzaW9uIHN0cmluZywgdXNlZCBmb3IgaW5mb3JtYXRpdmUgcHVycG9zZXMuCisvLyBOb3RlOiBUaGlzIGlzIGN1cnJlbnRseSBoYXJkY29kZWQsIGJ1dCB3aWxsIGxpa2VseSBiZSBmaWxsZWQgaW4gYnkgdGhlIGJ1aWxkCisvLyBzeXN0ZW0gaW4gZnV0dXJlIHZlcnNpb25zLgorZW51bSBWRVJTSU9OID0gIjEuMC4wIjsKKworLyoqCisgKiBGdW5jdGlvbnMgdXNlZCBmb3IgbG9nZ2luZyBpbnNpZGUgVGhyaWZ0LgorICoKKyAqIEJ5IGRlZmF1bHQsIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZXMgYXJlIHdyaXR0ZW4gdG8gc3Rkb3V0L3N0ZGVyciwgYnV0IHRoaXMKKyAqIGJlaGF2aW9yIGNhbiBiZSBvdmVyd3JpdHRlbiBieSBwcm92aWRpbmcgY3VzdG9tIGdfe0luZm8sIEVycm9yfUxvZ1NpbmsKKyAqIGhhbmRsZXJzLgorICoKKyAqIEV4YW1wbGVzOgorICogLS0tCisgKiBsb2dJbmZvKCJBbiBpbmZvcm1hdGl2ZSBtZXNzYWdlLiIpOworICogbG9nRXJyb3IoIlNvbWUgZXJyb3Igb2NjdXJyZWQ6ICVzIiwgZSk7CisgKiAtLS0KKyAqLworYWxpYXMgbG9nRm9ybWF0dGVkIWdfaW5mb0xvZ1NpbmsgbG9nSW5mbzsKK2FsaWFzIGxvZ0Zvcm1hdHRlZCFnX2Vycm9yTG9nU2luayBsb2dFcnJvcjsgLy8vIERpdHRvCisKKy8qKgorICogRXJyb3IgYW5kIGluZm8gbG9nIG1lc3NhZ2Ugc2lua3MuCisgKgorICogVGhlc2UgZGVsZWdhdGVzIGFyZSBjYWxsZWQgd2l0aCB0aGUgbG9nIG1lc3NhZ2UgcGFzc2VkIGFzIGNvbnN0KGNoYXIpW10KKyAqIGFyZ3VtZW50LCBhbmQgY2FuIGJlIG92ZXJ3cml0dGVuIHRvIGhvb2sgdGhlIFRocmlmdCBsaWJyYXJpZXMgdXAgd2l0aCBhCisgKiBjdXN0b20gbG9nZ2luZyBzeXN0ZW0uIEJ5IGRlZmF1bHQsIHRoZXkgZm9yd2FyZCBhbGwgb3V0cHV0IHRvIHN0ZG91dC9zdGRlcnIuCisgKi8KK19fZ3NoYXJlZCB2b2lkIGRlbGVnYXRlKGNvbnN0KGNoYXIpW10pIGdfaW5mb0xvZ1Npbms7CitfX2dzaGFyZWQgdm9pZCBkZWxlZ2F0ZShjb25zdChjaGFyKVtdKSBnX2Vycm9yTG9nU2luazsgLy8vIERpdHRvCisKK3NoYXJlZCBzdGF0aWMgdGhpcygpIHsKKyAgaW1wb3J0IHN0ZC5zdGRpbzsKKworICBnX2luZm9Mb2dTaW5rID0gKGNvbnN0KGNoYXIpW10gdGV4dCkgeworICAgIHN0ZG91dC53cml0ZWxuKHRleHQpOworICB9OworCisgIGdfZXJyb3JMb2dTaW5rID0gKGNvbnN0KGNoYXIpW10gdGV4dCkgeworICAgIHN0ZGVyci53cml0ZWxuKHRleHQpOworICB9OworfQorCisvLyBUaGlzIHNob3VsZCBiZSBwcml2YXRlLCBpZiBpdCBjb3VsZCBzdGlsbCBiZSB1c2VkIHRocm91Z2ggdGhlIGFsaWFzZXMgdGhlbi4KK3RlbXBsYXRlIGxvZ0Zvcm1hdHRlZChhbGlhcyB0YXJnZXQpIHsKKyAgdm9pZCBsb2dGb3JtYXR0ZWQoc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgaW50IGxpbmUgPSBfX0xJTkVfXywKKyAgICBULi4uKShzdHJpbmcgZm10LCBUIGFyZ3MpIGlmICgKKyAgICBfX3RyYWl0cyhjb21waWxlcywgeyB0YXJnZXQoIiIpOyB9KQorICApIHsKKyAgICBpbXBvcnQgc3RkLmZvcm1hdCwgc3RkLnN0ZGlvOworICAgIGlmICh0YXJnZXQgIWlzIG51bGwpIHsKKyAgICAgIHNjb3BlKGV4aXQpIGdfZm9ybWF0QnVmZmVyLmNsZWFyKCk7CisKKyAgICAgIC8vIFBob2JvcyBAQEJVR0BAOiBJZiB0aGUgZW1wdHkgc3RyaW5nIHB1dCgpIGlzIHJlbW92ZWQsIEFwcGVuZGVyLmRhdGEKKyAgICAgIC8vIHN0YXlzIGVtcHR5LgorICAgICAgZ19mb3JtYXRCdWZmZXIucHV0KCIiKTsKKworICAgICAgZm9ybWF0dGVkV3JpdGUoZ19mb3JtYXRCdWZmZXIsICIlczolczogIiwgZmlsZSwgbGluZSk7CisKKyAgICAgIHN0YXRpYyBpZiAoVC5sZW5ndGggPT0gMCkgeworICAgICAgICBnX2Zvcm1hdEJ1ZmZlci5wdXQoZm10KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvcm1hdHRlZFdyaXRlKGdfZm9ybWF0QnVmZmVyLCBmbXQsIGFyZ3MpOworICAgICAgfQorICAgICAgdGFyZ2V0KGdfZm9ybWF0QnVmZmVyLmRhdGEpOworICAgIH0KKyAgfQorfQorCitwcml2YXRlIHsKKyAgLy8gVXNlIGEgZ2xvYmFsLCBidXQgdGhyZWFkLWxvY2FsIGJ1ZmZlciBmb3IgY29uc3RydWN0aW5nIGxvZyBtZXNzYWdlcy4KKyAgaW1wb3J0IHN0ZC5hcnJheSA6IEFwcGVuZGVyOworICBBcHBlbmRlciEoY2hhcltdKSBnX2Zvcm1hdEJ1ZmZlcjsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9hc3luY19jbGllbnQuZCBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9hc3luY19jbGllbnQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTE2ZGVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2FzeW5jX2NsaWVudC5kCkBAIC0wLDAgKzEsMjU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LmNvZGVnZW4uYXN5bmNfY2xpZW50OworCitpbXBvcnQgc3RkLmNvbnYgOiB0ZXh0LCB0bzsKK2ltcG9ydCBzdGQudHJhaXRzIDogUGFyYW1ldGVyU3RvcmFnZUNsYXNzLCBQYXJhbWV0ZXJTdG9yYWdlQ2xhc3NUdXBsZSwKKyAgUGFyYW1ldGVyVHlwZVR1cGxlLCBSZXR1cm5UeXBlOworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5hc3luYy5iYXNlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmJhc2U7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uY2xpZW50OworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5jb2RlZ2VuOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5jdGZlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudXRpbC5jYW5jZWxsYXRpb247CitpbXBvcnQgdGhyaWZ0LnV0aWwuZnV0dXJlOworCisvKioKKyAqIEFzeW5jaHJvbm91cyBUaHJpZnQgc2VydmljZSBjbGllbnQgd2hpY2ggcmV0dXJucyB0aGUgcmVzdWx0cyBhcyBURnV0dXJlcyBhbgorICogdXNlcyBhIFRBc3luY01hbmFnZXIgdG8gcGVyZm9ybSB0aGUgYWN0dWFsIHdvcmsuCisgKgorICogVEFzeW5jQ2xpZW50QmFzZSBzZXJ2ZXMgYXMgYSBzdXBlcnR5cGUgZm9yIGFsbCBUQXN5bmNDbGllbnRzIGZvciB0aGUgc2FtZQorICogc2VydmljZSwgd2hpY2ggbWlnaHQgYmUgaW5zdGFudGlhdGVkIHdpdGggZGlmZmVyZW50IGNvbmNyZXRlIHByb3RvY29sIHR5cGVzCisgKiAodGhlcmUgaXMgbm8gY292YXJpYW5jZSBmb3IgdGVtcGxhdGUgdHlwZSBwYXJhbWV0ZXJzKSwgYW5kIGV4dGVuZHMKKyAqIFRGdXR1cmVJbnRlcmZhY2UhSW50ZXJmYWNlLiBJZiBJbnRlcmZhY2UgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgc2VydmljZQorICogQmFzZUludGVyZmFjZSwgaXQgYWxzbyBleHRlbmRzIFRBc3luY0NsaWVudEJhc2UhQmFzZUludGVyZmFjZS4KKyAqCisgKiBUQXN5bmNDbGllbnQgaW1wbGVtZW50cyBUQXN5bmNDbGllbnRCYXNlIGFuZCBvZmZlcnMgdHdvIGNvbnN0cnVjdG9ycyB3aXRoCisgKiB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZXM6CisgKiAtLS0KKyAqIHRoaXMoVEFzeW5jVHJhbnNwb3J0IHRyYW5zLCBUVHJhbnNwb3J0RmFjdG9yeSB0ZiwgVFByb3RvY29sRmFjdG9yeSBwZik7CisgKiB0aGlzKFRBc3luY1RyYW5zcG9ydCB0cmFucywgVFRyYW5zcG9ydEZhY3RvcnkgaXRmLCBUVHJhbnNwb3J0RmFjdG9yeSBvdGYsCisgKiAgIFRQcm90b2NvbEZhY3RvcnkgaXBmLCBUUHJvdG9jb2xGYWN0b3J5IG9wZik7CisgKiAtLS0KKyAqCisgKiBBZ2FpbiwgaWYgSW50ZXJmYWNlIHJlcHJlc2VudHMgYSBkZXJpdmVkIFRocmlmdCBzZXJ2aWNlLAorICogVEFzeW5jQ2xpZW50IUludGVyZmFjZSBpcyBhbHNvIGRlcml2ZWQgZnJvbSBUQXN5bmNDbGllbnQhQmFzZUludGVyZmFjZS4KKyAqCisgKiBUQXN5bmNDbGllbnQgY2FuIGV4Y2x1c2l2ZWx5IGJlIHVzZWQgd2l0aCBUQXN5bmNUcmFuc3BvcnRzLCBhcyBpdCBuZWVkcyB0bworICogYWNjZXNzIHRoZSBhc3NvY2lhdGVkIFRBc3luY01hbmFnZXIuIFRvIHNldCB1cCBhbnkgd3JhcHBlciB0cmFuc3BvcnRzCisgKiAoZS5nLiBidWZmZXJlZCwgZnJhbWVkKSBvbiB0b3Agb2YgaXQgYW5kIHRvIGluc3RhbmNpYXRlIHRoZSBwcm90b2NvbHMgdG8gdXNlLAorICogVFRyYW5zcG9ydEZhY3RvcnkgYW5kIFRQcm90b2NvbEZhY3RvcnkgaW5zdGFuY2VzIGFyZSBwYXNzZWQgdG8gdGhlCisgKiBjb25zdHJ1Y3RvcnMg4oCTIHRoZSB0aHJlZSBhcmd1bWVudCBjb25zdHJ1Y3RvciBpcyBhIHNob3J0Y3V0IGlmIHRoZSBzYW1lCisgKiB0cmFuc3BvcnQgYW5kIHByb3RvY29sIGFyZSB0byBiZSB1c2VkIGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQsIHdoaWNoIGlzCisgKiB0aGUgbW9zdCBjb21tb24gY2FzZS4KKyAqCisgKiBJZiB0aGUgc2FtZSB0cmFuc3BvcnQgZmFjdG9yeSBpcyBwYXNzZWQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCB0cmFuc3BvcnRzLAorICogb25seSBhIHNpbmdsZSB3cmFwcGVyIHRyYW5zcG9ydCB3aWxsIGJlIGNyZWF0ZWQgYW5kIHVzZWQgZm9yIGJvdGggZGlyZWN0aW9ucy4KKyAqIFRoaXMgYWxsb3dzIGVhc3kgaW1wbGVtZW50YXRpb24gb2YgcHJvdG9jb2xzIGxpa2UgU1NMLgorICoKKyAqIEp1c3QgYXMgVENsaWVudCBkb2VzLCBUQXN5bmNDbGllbnQgYWxzbyB0YWtlcyB0d28gb3B0aW9uYWwgdGVtcGxhdGUKKyAqIGFyZ3VtZW50cyB3aGljaCBjYW4gYmUgdXNlZCBmb3Igc3BlY2lmeWluZyB0aGUgYWN0dWFsIFRQcm90b2NvbAorICogaW1wbGVtZW50YXRpb24gdXNlZCBmb3Igb3B0aW1pemF0aW9uIHB1cnBvc2VzLCBhcyB2aXJ0dWFsIGNhbGxzIGNhbgorICogY29tcGxldGVseSBiZSBlbGltaW5hdGVkIHRoZW4uIElmIHRoZSBhY3R1YWwgdHlwZXMgb2YgdGhlIHByb3RvY29scworICogaW5zdGFudGlhdGVkIGJ5IHRoZSBmYWN0b3JpZXMgdXNlZCBkb2VzIG5vdCBtYXRjaCB0aGUgb25lcyBzdGF0aWNhbGx5CisgKiBzcGVjaWZpZWQgaW4gdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMsIGEgVEV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nCisgKiBjb25zdHJ1Y3Rpb24uCisgKgorICogRXhhbXBsZToKKyAqIC0tLQorICogLy8gQSBzaW1wbGUgVGhyaWZ0IHNlcnZpY2UuCisgKiBpbnRlcmZhY2UgRm9vIHsgaW50IGZvbygpOyB9CisgKgorICogLy8gQ3JlYXRlIGEgVEFzeW5jU29ja2V0TWFuYWdlciDigJMgdGhyaWZ0LmFzeW5jLmxpYmV2ZW50IGlzIHVzZWQgZm9yIHRoaXMKKyAqIC8vIGV4YW1wbGUuCisgKiBhdXRvIG1hbmFnZXIgPSBuZXcgVExpYmV2ZW50QXN5bmNNYW5hZ2VyOworICoKKyAqIC8vIFNldCB1cCBhbiBhc3luYyB0cmFuc3BvcnQgdG8gdXNlLgorICogYXV0byBzb2NrZXQgPSBuZXcgVEFzeW5jU29ja2V0KG1hbmFnZXIsIGhvc3QsIHBvcnQpOworICoKKyAqIC8vIENyZWF0ZSBhIGNsaWVudCBpbnN0YW5jZS4KKyAqIGF1dG8gY2xpZW50ID0gbmV3IFRBc3luY0NsaWVudCFGb28oCisgKiAgIHNvY2tldCwKKyAqICAgbmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnksIC8vIFdyYXAgdGhlIHNvY2tldCBpbiBhIFRCdWZmZXJlZFRyYW5zcG9ydC4KKyAqICAgbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkhKCkgLy8gVXNlIHRoZSBCaW5hcnkgcHJvdG9jb2wuCisgKiApOworICoKKyAqIC8vIENhbGwgZm9vIGFuZCB1c2UgdGhlIHJldHVybmVkIGZ1dHVyZS4KKyAqIGF1dG8gcmVzdWx0ID0gY2xpZW50LmZvbygpOworICogcHJhZ21hKG1zZywgdHlwZW9mKHJlc3VsdCkpOyAvLyBURnV0dXJlIWludAorICogaW50IHJlc3VsdFZhbHVlID0gcmVzdWx0LndhaXRHZXQoKTsgLy8gV2FpdHMgdW50aWwgdGhlIHJlc3VsdCBpcyBhdmFpbGFibGUuCisgKiAtLS0KKyAqLworaW50ZXJmYWNlIFRBc3luY0NsaWVudEJhc2UoSW50ZXJmYWNlKSBpZiAoaXNCYXNlU2VydmljZSFJbnRlcmZhY2UpIDoKKyAgVEZ1dHVyZUludGVyZmFjZSFJbnRlcmZhY2UKK3sKKyAgLyoqCisgICAqIFRoZSB1bmRlcmx5aW5nIFRBc3luY1RyYW5zcG9ydCB1c2VkIGJ5IHRoaXMgY2xpZW50IGluc3RhbmNlLgorICAgKi8KKyAgVEFzeW5jVHJhbnNwb3J0IHRyYW5zcG9ydCgpIEBwcm9wZXJ0eTsKK30KKworLy8vIERpdHRvCitpbnRlcmZhY2UgVEFzeW5jQ2xpZW50QmFzZShJbnRlcmZhY2UpIGlmIChpc0Rlcml2ZWRTZXJ2aWNlIUludGVyZmFjZSkgOgorICBUQXN5bmNDbGllbnRCYXNlIShCYXNlU2VydmljZSFJbnRlcmZhY2UpLCBURnV0dXJlSW50ZXJmYWNlIUludGVyZmFjZQore30KKworLy8vIERpdHRvCit0ZW1wbGF0ZSBUQXN5bmNDbGllbnQoSW50ZXJmYWNlLCBJbnB1dFByb3RvY29sID0gVFByb3RvY29sLCBPdXRwdXRQcm90b2NvbCA9IHZvaWQpIGlmICgKKyAgaXNTZXJ2aWNlIUludGVyZmFjZSAmJiBpc1RQcm90b2NvbCFJbnB1dFByb3RvY29sICYmCisgIChpc1RQcm90b2NvbCFPdXRwdXRQcm90b2NvbCB8fCBpcyhPdXRwdXRQcm90b2NvbCA9PSB2b2lkKSkKKykgeworICBtaXhpbih7CisgICAgc3RhdGljIGlmIChpc0Rlcml2ZWRTZXJ2aWNlIUludGVyZmFjZSkgeworICAgICAgc3RyaW5nIGNvZGUgPSAiY2xhc3MgVEFzeW5jQ2xpZW50IDogIiB+CisgICAgICAgICJUQXN5bmNDbGllbnQhKEJhc2VTZXJ2aWNlIUludGVyZmFjZSwgSW5wdXRQcm90b2NvbCwgT3V0cHV0UHJvdG9jb2wpLCAiIH4KKyAgICAgICAgIlRBc3luY0NsaWVudEJhc2UhSW50ZXJmYWNlIHtcbiI7CisgICAgICBjb2RlIH49IHF7CisgICAgICAgIHRoaXMoVEFzeW5jVHJhbnNwb3J0IHRyYW5zLCBUVHJhbnNwb3J0RmFjdG9yeSB0ZiwgVFByb3RvY29sRmFjdG9yeSBwZikgeworICAgICAgICAgIHRoaXModHJhbnMsIHRmLCB0ZiwgcGYsIHBmKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMoVEFzeW5jVHJhbnNwb3J0IHRyYW5zLCBUVHJhbnNwb3J0RmFjdG9yeSBpdGYsCisgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3RmLCBUUHJvdG9jb2xGYWN0b3J5IGlwZiwgVFByb3RvY29sRmFjdG9yeSBvcGYKKyAgICAgICAgKSB7CisgICAgICAgICAgc3VwZXIodHJhbnMsIGl0Ziwgb3RmLCBpcGYsIG9wZik7CisgICAgICAgICAgY2xpZW50XyA9IG5ldyB0eXBlb2YoY2xpZW50XykoaXByb3RfLCBvcHJvdF8pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBUQ2xpZW50IShJbnRlcmZhY2UsIElQcm90LCBPUHJvdCkgY2xpZW50XzsKKyAgICAgIH07CisgICAgfSBlbHNlIHsKKyAgICAgIHN0cmluZyBjb2RlID0gImNsYXNzIFRBc3luY0NsaWVudCA6IFRBc3luY0NsaWVudEJhc2UhSW50ZXJmYWNlIHsiOworICAgICAgY29kZSB+PSBxeworICAgICAgICBhbGlhcyBJbnB1dFByb3RvY29sIElQcm90OworICAgICAgICBzdGF0aWMgaWYgKGlzVFByb3RvY29sIU91dHB1dFByb3RvY29sKSB7CisgICAgICAgICAgYWxpYXMgT3V0cHV0UHJvdG9jb2wgT1Byb3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RhdGljIGFzc2VydChpcyhPdXRwdXRQcm90b2NvbCA9PSB2b2lkKSk7CisgICAgICAgICAgYWxpYXMgSW5wdXRQcm90b2NvbCBPUHJvdDsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMoVEFzeW5jVHJhbnNwb3J0IHRyYW5zLCBUVHJhbnNwb3J0RmFjdG9yeSB0ZiwgVFByb3RvY29sRmFjdG9yeSBwZikgeworICAgICAgICAgIHRoaXModHJhbnMsIHRmLCB0ZiwgcGYsIHBmKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMoVEFzeW5jVHJhbnNwb3J0IHRyYW5zLCBUVHJhbnNwb3J0RmFjdG9yeSBpdGYsCisgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3RmLCBUUHJvdG9jb2xGYWN0b3J5IGlwZiwgVFByb3RvY29sRmFjdG9yeSBvcGYKKyAgICAgICAgKSB7CisgICAgICAgICAgaW1wb3J0IHN0ZC5leGNlcHRpb247CisgICAgICAgICAgdHJhbnNwb3J0XyA9IHRyYW5zOworCisgICAgICAgICAgYXV0byBpcCA9IGl0Zi5nZXRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgIFRUcmFuc3BvcnQgb3AgPSB2b2lkOworICAgICAgICAgIGlmIChpdGYgPT0gb3RmKSB7CisgICAgICAgICAgICBvcCA9IGlwOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcCA9IG90Zi5nZXRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgIH0KKworICAgICAgICAgIGF1dG8gaXByb3QgPSBpcGYuZ2V0UHJvdG9jb2woaXApOworICAgICAgICAgIGlwcm90XyA9IGNhc3QoSVByb3QpaXByb3Q7CisgICAgICAgICAgZW5mb3JjZShpcHJvdF8sIG5ldyBURXhjZXB0aW9uKHRleHQoIklucHV0IHByb3RvY29sIG5vdCBvZiB0aGUgIiB+CisgICAgICAgICAgICAic3BlY2lmaWVkIGNvbmNyZXRlIHR5cGUgKCIsIElQcm90LnN0cmluZ29mLCAiKS4iKSkpOworCisgICAgICAgICAgYXV0byBvcHJvdCA9IG9wZi5nZXRQcm90b2NvbChvcCk7CisgICAgICAgICAgb3Byb3RfID0gY2FzdChPUHJvdClvcHJvdDsKKyAgICAgICAgICBlbmZvcmNlKG9wcm90XywgbmV3IFRFeGNlcHRpb24odGV4dCgiT3V0cHV0IHByb3RvY29sIG5vdCBvZiB0aGUgIiB+CisgICAgICAgICAgICAic3BlY2lmaWVkIGNvbmNyZXRlIHR5cGUgKCIsIE9Qcm90LnN0cmluZ29mLCAiKS4iKSkpOworCisgICAgICAgICAgY2xpZW50XyA9IG5ldyB0eXBlb2YoY2xpZW50XykoaXByb3RfLCBvcHJvdF8pOworICAgICAgICB9CisKKyAgICAgICAgb3ZlcnJpZGUgVEFzeW5jVHJhbnNwb3J0IHRyYW5zcG9ydCgpIEBwcm9wZXJ0eSB7CisgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydF87CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgVEFzeW5jVHJhbnNwb3J0IHRyYW5zcG9ydF87CisgICAgICAgIHByb3RlY3RlZCBJUHJvdCBpcHJvdF87CisgICAgICAgIHByb3RlY3RlZCBPUHJvdCBvcHJvdF87CisgICAgICAgIHByaXZhdGUgVENsaWVudCEoSW50ZXJmYWNlLCBJUHJvdCwgT1Byb3QpIGNsaWVudF87CisgICAgICB9OworICAgIH0KKworICAgIGZvcmVhY2ggKG1ldGhvZE5hbWU7CisgICAgICBGaWx0ZXJNZXRob2ROYW1lcyEoSW50ZXJmYWNlLCBfX3RyYWl0cyhkZXJpdmVkTWVtYmVycywgSW50ZXJmYWNlKSkKKyAgICApIHsKKyAgICAgIHN0cmluZ1tdIHBhcmFtTGlzdDsKKyAgICAgIHN0cmluZ1tdIHBhcmFtTmFtZXM7CisgICAgICBmb3JlYWNoIChpLCBfOyBQYXJhbWV0ZXJUeXBlVHVwbGUhKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSkgeworICAgICAgICBpbW11dGFibGUgcGFyYW1OYW1lID0gInBhcmFtIiB+IHRvIXN0cmluZyhpICsgMSk7CisgICAgICAgIGltbXV0YWJsZSBzdG9yYWdlID0gUGFyYW1ldGVyU3RvcmFnZUNsYXNzVHVwbGUhKAorICAgICAgICAgIG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKVtpXTsKKworICAgICAgICBwYXJhbUxpc3Qgfj0gKChzdG9yYWdlICYgUGFyYW1ldGVyU3RvcmFnZUNsYXNzLnJlZl8pID8gInJlZiAiIDogIiIpIH4KKyAgICAgICAgICAiUGFyYW1ldGVyVHlwZVR1cGxlIShJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUgfiAiKVsiIH4KKyAgICAgICAgICB0byFzdHJpbmcoaSkgfiAiXSAiIH4gcGFyYW1OYW1lOworICAgICAgICBwYXJhbU5hbWVzIH49IHBhcmFtTmFtZTsKKyAgICAgIH0KKyAgICAgIHBhcmFtTGlzdCB+PSAiVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24gPSBudWxsIjsKKworICAgICAgaW1tdXRhYmxlIHJldHVyblR5cGVDb2RlID0gIlJldHVyblR5cGUhKEludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSB+ICIpIjsKKyAgICAgIGNvZGUgfj0gIlRGdXR1cmUhKCIgfiByZXR1cm5UeXBlQ29kZSB+ICIpICIgfiBtZXRob2ROYW1lIH4gIigiIH4KKyAgICAgICAgY3RmZUpvaW4ocGFyYW1MaXN0KSB+ICIpIHtcbiI7CisKKyAgICAgIC8vIENyZWF0ZSB0aGUgZnV0dXJlIGluc3RhbmNlIHRoYXQgd2lsbCByZXBlc2VudCB0aGUgcmVzdWx0LgorICAgICAgY29kZSB+PSAiYXV0byBwcm9taXNlID0gbmV3IFRQcm9taXNlISgiIH4gcmV0dXJuVHlwZUNvZGUgfiAiKTtcbiI7CisKKyAgICAgIC8vIFByZXBhcmUgZGVsZWdhdGUgd2hpY2ggZXhlY3V0ZXMgdGhlIFRDbGllbnQgbWV0aG9kIGNhbGwuCisgICAgICBjb2RlIH49ICJhdXRvIHdvcmsgPSB7XG4iOworICAgICAgY29kZSB+PSAidHJ5IHtcbiI7CisgICAgICBjb2RlIH49ICJzdGF0aWMgaWYgKGlzKFJldHVyblR5cGUhKEludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSB+CisgICAgICAgICIpID09IHZvaWQpKSB7XG4iOworICAgICAgY29kZSB+PSAiY2xpZW50Xy4iIH4gbWV0aG9kTmFtZSB+ICIoIiB+IGN0ZmVKb2luKHBhcmFtTmFtZXMpIH4gIik7XG4iOworICAgICAgY29kZSB+PSAicHJvbWlzZS5zdWNjZWVkKCk7XG4iOworICAgICAgY29kZSB+PSAifSBlbHNlIHtcbiI7CisgICAgICBjb2RlIH49ICJhdXRvIHJlc3VsdCA9IGNsaWVudF8uIiB+IG1ldGhvZE5hbWUgfiAiKCIgfgorICAgICAgICBjdGZlSm9pbihwYXJhbU5hbWVzKSB+ICIpO1xuIjsKKyAgICAgIGNvZGUgfj0gInByb21pc2Uuc3VjY2VlZChyZXN1bHQpO1xuIjsKKyAgICAgIGNvZGUgfj0gIn1cbiI7CisgICAgICBjb2RlIH49ICJ9IGNhdGNoIChFeGNlcHRpb24gZSkge1xuIjsKKyAgICAgIGNvZGUgfj0gInByb21pc2UuZmFpbChlKTtcbiI7CisgICAgICBjb2RlIH49ICJ9XG4iOworICAgICAgY29kZSB+PSAifTtcbiI7CisKKyAgICAgIC8vIElmIHRoZSByZXF1ZXN0IGlzIGNhbmNlbGxlZCwgc2V0IHRoZSByZXN1bHQgcHJvbWlzZSB0byBjYW5jZWxsZWQKKyAgICAgIC8vIGFzIHdlbGwuIFRoaXMgY291bGQgYmUgbW92ZWQgaW50byBhbiBhZGRpdGlvbmFsIFRBc3luY1dvcmtJdGVtCisgICAgICAvLyBkZWxlZ2F0ZSBwYXJhbWV0ZXIuCisgICAgICBjb2RlIH49IHF7CisgICAgICAgIGlmIChjYW5jZWxsYXRpb24pIHsKKyAgICAgICAgICBjYW5jZWxsYXRpb24udHJpZ2dlcmluZy5hZGRDYWxsYmFjayh7CisgICAgICAgICAgICBwcm9taXNlLmNhbmNlbCgpOworICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICB9OworCisgICAgICAvLyBFbnF1ZXVlIHRoZSB3b3JrIGl0ZW0gYW5kIGltbWVkaWF0ZWx5IHJldHVybiB0aGUgcHJvbWlzZSAocmVzcC4gaXRzCisgICAgICAvLyBmdXR1cmUgaW50ZXJmYWNlKS4KKyAgICAgIGNvZGUgfj0gInRyYW5zcG9ydF8uYXN5bmNNYW5hZ2VyLmV4ZWN1dGUodHJhbnNwb3J0Xywgd29yaywgY2FuY2VsbGF0aW9uKTtcbiI7CisgICAgICBjb2RlIH49ICJyZXR1cm4gcHJvbWlzZTtcbiI7CisgICAgICBjb2RlIH49ICJ9XG4iOworCisgICAgfQorCisgICAgY29kZSB+PSAifVxuIjsKKyAgICByZXR1cm4gY29kZTsKKyAgfSgpKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9hc3luY19jbGllbnRfcG9vbC5kIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2FzeW5jX2NsaWVudF9wb29sLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjYjk3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9hc3luY19jbGllbnRfcG9vbC5kCkBAIC0wLDAgKzEsOTA2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogVXRpbGl0aWVzIGZvciBhc3luY2hyb25vdXNseSBxdWVyeWluZyBtdWx0aXBsZSBzZXJ2ZXJzLCBidWlsZGluZyBvbgorICogVEFzeW5jQ2xpZW50LgorICoKKyAqIFRlcm1pbm9sb2d5IG5vdGU6IFRoZSBuYW1lcyBvZiB0aGUgYXJ0aWZhY3RzIGRlZmluZWQgaW4gdGhpcyBtb2R1bGUgYXJlCisgKiAgIGRlcml2ZWQgZnJvbSDCu2NsaWVudCBwb29swqssIGJlY2F1c2UgdGhleSBvcGVyYXRlIG9uIGEgcG9vbCBvZgorICogICBUQXN5bmNDbGllbnRzLiBIb3dldmVyLCBmcm9tIGEgYXJjaGl0ZWN0dXJhbCBwb2ludCBvZiB2aWV3LCB0aGV5IG9mdGVuCisgKiAgIHJlcHJlc2VudCBhIHBvb2wgb2YgaG9zdHMgYSBUaHJpZnQgY2xpZW50IGFwcGxpY2F0aW9uIGNvbW11bmljYXRlcyB3aXRoCisgKiAgIHVzaW5nIFJQQyBjYWxscy4KKyAqLworbW9kdWxlIHRocmlmdC5jb2RlZ2VuLmFzeW5jX2NsaWVudF9wb29sOworCitpbXBvcnQgY29yZS5zeW5jLm11dGV4OworaW1wb3J0IGNvcmUudGltZSA6IER1cmF0aW9uLCBkdXI7CitpbXBvcnQgc3RkLmFsZ29yaXRobSA6IG1hcDsKK2ltcG9ydCBzdGQuYXJyYXkgOiBhcnJheSwgZW1wdHk7CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgc3RkLnRyYWl0cyA6IFBhcmFtZXRlclR5cGVUdXBsZSwgUmV0dXJuVHlwZTsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5iYXNlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmFzeW5jX2NsaWVudDsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuYWxnb3JpdGhtOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5jb2RlZ2VuOworaW1wb3J0IHRocmlmdC51dGlsLmF3YWl0YWJsZTsKK2ltcG9ydCB0aHJpZnQudXRpbC5jYW5jZWxsYXRpb247CitpbXBvcnQgdGhyaWZ0LnV0aWwuZnV0dXJlOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5yZXNvdXJjZV9wb29sOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBnZW5lcmljIGNsaWVudCBwb29sIHdoaWNoIGltcGxlbWVudHMgVEZ1dHVyZUludGVyZmFjZSFJbnRlcmZhY2UKKyAqIHVzaW5nIG11bHRpcGxlIFRBc3luY0NsaWVudHMuCisgKi8KK2ludGVyZmFjZSBUQXN5bmNDbGllbnRQb29sQmFzZShJbnRlcmZhY2UpIGlmIChpc1NlcnZpY2UhSW50ZXJmYWNlKSA6CisgIFRGdXR1cmVJbnRlcmZhY2UhSW50ZXJmYWNlCit7CisgIC8vLyBTaG9ydGhhbmQgZm9yIHRoZSBjbGllbnQgdHlwZSB0aGlzIHBvb2wgb3BlcmF0ZXMgb24uCisgIGFsaWFzIFRBc3luY0NsaWVudEJhc2UhSW50ZXJmYWNlIENsaWVudDsKKworICAvKioKKyAgICogQWRkcyBhIGNsaWVudCB0byB0aGUgcG9vbC4KKyAgICovCisgIHZvaWQgYWRkQ2xpZW50KENsaWVudCBjbGllbnQpOworCisgIC8qKgorICAgKiBSZW1vdmVzIGEgY2xpZW50IGZyb20gdGhlIHBvb2wuCisgICAqCisgICAqIFJldHVybnM6IFdoZXRoZXIgdGhlIGNsaWVudCB3YXMgZm91bmQgaW4gdGhlIHBvb2wuCisgICAqLworICBib29sIHJlbW92ZUNsaWVudChDbGllbnQgY2xpZW50KTsKKworICAvKioKKyAgICogQ2FsbGVkIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGV4Y2VwdGlvbiBjb21lcyBmcm9tIGEgY2xpZW50IGZyb20gdGhlCisgICAqIHBvb2wgbm90IHdvcmtpbmcgcHJvcGVybHksIG9yIGlmIGl0IGFuIGV4Y2VwdGlvbiB0aHJvd24gYXQgdGhlCisgICAqIGFwcGxpY2F0aW9uIGxldmVsLgorICAgKgorICAgKiBJZiB0aGUgZGVsZWdhdGUgcmV0dXJucyB0cnVlLCB0aGUgc2VydmVyL2Nvbm5lY3Rpb24gaXMgY29uc2lkZXJlZCB0byBiZQorICAgKiBhdCBmYXVsdCwgaWYgaXQgcmV0dXJucyBmYWxzZSwgdGhlIGV4Y2VwdGlvbiBpcyBqdXN0IHBhc3NlZCBvbiB0byB0aGUKKyAgICogY2FsbGVyLgorICAgKgorICAgKiBCeSBkZWZhdWx0LCByZXR1cm5zIHRydWUgZm9yIGluc3RhbmNlcyBvZiBUVHJhbnNwb3J0RXhjZXB0aW9uIGFuZAorICAgKiBUQXBwbGljYXRpb25FeGNlcHRpb24sIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIGJvb2wgZGVsZWdhdGUoRXhjZXB0aW9uKSBycGNGYXVsdEZpbHRlcigpIGNvbnN0IEBwcm9wZXJ0eTsKKyAgdm9pZCBycGNGYXVsdEZpbHRlcihib29sIGRlbGVnYXRlKEV4Y2VwdGlvbikpIEBwcm9wZXJ0eTsgLy8vIERpdHRvCisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gb3BlbiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnRzIG9mIGEgY2xpZW50IGJlZm9yZSB0cnlpbmcgdG8KKyAgICogZXhlY3V0ZSBhIG1ldGhvZCBpZiB0aGV5IGFyZSBub3Qgb3Blbi4gVGhpcyBpcyB1c3VhbGx5IGRlc2lyYWJsZQorICAgKiBiZWNhdXNlIGl0IGFsbG93cyBlLmcuIHRvIGF1dG9tYXRpY2FsbHkgcmVjb25uZWN0IHRvIGEgcmVtb3RlIHNlcnZlcgorICAgKiBpZiB0aGUgbmV0d29yayBjb25uZWN0aW9uIGlzIGRyb3BwZWQuCisgICAqCisgICAqIERlZmF1bHRzIHRvIHRydWUuCisgICAqLworICBib29sIHJlb3BlblRyYW5zcG9ydHMoKSBjb25zdCBAcHJvcGVydHk7CisgIHZvaWQgcmVvcGVuVHJhbnNwb3J0cyhib29sKSBAcHJvcGVydHk7IC8vLyBEaXR0bworfQorCitpbW11dGFibGUgYm9vbCBkZWxlZ2F0ZShFeGNlcHRpb24pIGRlZmF1bHRScGNGYXVsdEZpbHRlcjsKK3N0YXRpYyB0aGlzKCkgeworICBkZWZhdWx0UnBjRmF1bHRGaWx0ZXIgPSAoRXhjZXB0aW9uIGUpIHsKKyAgICBpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CisgICAgaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKKyAgICByZXR1cm4gKAorICAgICAgKGNhc3QoVFRyYW5zcG9ydEV4Y2VwdGlvbillICFpcyBudWxsKSB8fAorICAgICAgKGNhc3QoVEFwcGxpY2F0aW9uRXhjZXB0aW9uKWUgIWlzIG51bGwpCisgICAgKTsKKyAgfTsKK30KKworLyoqCisgKiBBIFRBc3luY0NsaWVudFBvb2xCYXNlIGltcGxlbWVudGF0aW9uIHdoaWNoIHF1ZXJpZXMgbXVsdGlwbGUgc2VydmVycyBpbiBhCisgKiByb3cgdW50aWwgYSByZXF1ZXN0IHN1Y2NlZWRzLCB0aGUgcmVzdWx0IG9mIHdoaWNoIGlzIHRoZW4gcmV0dXJuZWQuCisgKgorICogVGhlIGRlZmluaXRpb24gb2YgwrtzdWNjZXNzwqsgY2FuIGJlIGN1c3RvbWl6ZWQgdXNpbmcgdGhlIHJwY0ZhdWx0RmlsdGVyKCkKKyAqIGRlbGVnYXRlIHByb3BlcnR5LiBJZiBpdCBpcyBub24tbnVsbCBhbmQgY2FsbGluZyBpdCBmb3IgYW4gZXhjZXB0aW9uIHNldCBieQorICogYSBmYWlsZWQgbWV0aG9kIGludm9jYXRpb24gcmV0dXJucyB0cnVlLCB0aGUgZXJyb3IgaXMgY29uc2lkZXJlZCB0byBiZQorICogY2F1c2VkIGJ5IHRoZSBSUEMgbGF5ZXIgcmF0aGVyIHRoYW4gdGhlIGFwcGxpY2F0aW9uIGxheWVyLCBhbmQgdGhlIG5leHQKKyAqIHNlcnZlciBpbiB0aGUgcG9vbCBpcyB0cmllZC4gSWYgdGhlcmUgYXJlIG5vIG1vcmUgY2xpZW50cyB0byB0cnksIHRoZQorICogb3BlcmF0aW9uIGlzIG1hcmtlZCBhcyBmYWlsZWQgd2l0aCBhIFRDb21wb3VuZE9wZXJhdGlvbkV4Y2VwdGlvbi4KKyAqCisgKiBJZiBhIFRBc3luY0NsaWVudCBpbiB0aGUgcG9vbCBmYWlscyB3aXRoIGFuIFJQQyBleGNlcHRpb24gZm9yIGEgbnVtYmVyIG9mCisgKiBjb25zZWN1dGl2ZSB0cmllcywgaXQgaXMgdGVtcG9yYXJpbHkgZGlzYWJsZWQgKG5vdCB0cmllZCBhbnkgbG9uZ2VyKSBmb3IKKyAqIGEgY2VydGFpbiBkdXJhdGlvbi4gQm90aCB0aGUgbGltaXQgYW5kIHRoZSB0aW1lb3V0IGNhbiBiZSBjb25maWd1cmVkLiBJZiBhbGwKKyAqIGNsaWVudHMgZmFpbCAoYW5kIGtlZXBUcnlpbmcgaXMgZmFsc2UpLCB0aGUgb3BlcmF0aW9uIGZhaWxzIHdpdGggYQorICogVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uIHdoaWNoIGNvbnRhaW5zIHRoZSBjb2xsZWN0ZWQgUlBDIGV4Y2VwdGlvbnMuCisgKi8KK2ZpbmFsIGNsYXNzIFRBc3luY0NsaWVudFBvb2woSW50ZXJmYWNlKSBpZiAoaXNTZXJ2aWNlIUludGVyZmFjZSkgOgorICBUQXN5bmNDbGllbnRQb29sQmFzZSFJbnRlcmZhY2UKK3sKKyAgLy8vCisgIHRoaXMoQ2xpZW50W10gY2xpZW50cykgeworICAgIHBvb2xfID0gbmV3IFRSZXNvdXJjZVBvb2whQ2xpZW50KGNsaWVudHMpOworICAgIHJwY0ZhdWx0RmlsdGVyXyA9IGRlZmF1bHRScGNGYXVsdEZpbHRlcjsKKyAgICByZW9wZW5UcmFuc3BvcnRzXyA9IHRydWU7CisgIH0KKworICAvK292ZXJyaWRlKy8gdm9pZCBhZGRDbGllbnQoQ2xpZW50IGNsaWVudCkgeworICAgIHBvb2xfLmFkZChjbGllbnQpOworICB9CisKKyAgLytvdmVycmlkZSsvIGJvb2wgcmVtb3ZlQ2xpZW50KENsaWVudCBjbGllbnQpIHsKKyAgICByZXR1cm4gcG9vbF8ucmVtb3ZlKGNsaWVudCk7CisgIH0KKworICAvKioKKyAgICogV2hldGhlciB0byBrZWVwIHRyeWluZyB0byBmaW5kIGEgd29ya2luZyBjbGllbnQgaWYgYWxsIGhhdmUgZmFpbGVkIGluIGEKKyAgICogcm93LgorICAgKgorICAgKiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICovCisgIGJvb2wga2VlcFRyeWluZygpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHBvb2xfLmN5Y2xlOworICB9CisKKyAgLy8vIERpdHRvCisgIHZvaWQga2VlcFRyeWluZyhib29sIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHBvb2xfLmN5Y2xlID0gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogV2hldGhlciB0byB1c2UgYSByYW5kb20gcGVybXV0YXRpb24gb2YgdGhlIGNsaWVudCBwb29sIG9uIGV2ZXJ5IGNhbGwgdG8KKyAgICogZXhlY3V0ZSgpLiBUaGlzIGNhbiBiZSB1c2VkIGUuZy4gYXMgYSBzaW1wbGUgZm9ybSBvZiBsb2FkIGJhbGFuY2luZy4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICovCisgIGJvb2wgcGVybXV0ZUNsaWVudHMoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBwb29sXy5wZXJtdXRlOworICB9CisKKyAgLy8vIERpdHRvCisgIHZvaWQgcGVybXV0ZUNsaWVudHMoYm9vbCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBwb29sXy5wZXJtdXRlID0gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogVGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBmYXVsdHMgYWZ0ZXIgd2hpY2ggYSBjbGllbnQgaXMgZGlzYWJsZWQgdW50aWwKKyAgICogZmF1bHREaXNhYmxlRHVyYXRpb24gaGFzIHBhc3NlZC4gMCB0byBuZXZlciBkaXNhYmxlIGNsaWVudHMuCisgICAqCisgICAqIERlZmF1bHRzIHRvIDAuCisgICAqLworICB1c2hvcnQgZmF1bHREaXNhYmxlQ291bnQoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBwb29sXy5mYXVsdERpc2FibGVDb3VudDsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIGZhdWx0RGlzYWJsZUNvdW50KHVzaG9ydCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBwb29sXy5mYXVsdERpc2FibGVDb3VudCA9IHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIFRoZSBkdXJhdGlvbiBmb3Igd2hpY2ggYSBjbGllbnQgaXMgbm8gbG9uZ2VyIGNvbnNpZGVyZWQgYWZ0ZXIgaXQgaGFzCisgICAqIGZhaWxlZCB0b28gb2Z0ZW4uCisgICAqCisgICAqIERlZmF1bHRzIHRvIG9uZSBzZWNvbmQuCisgICAqLworICBEdXJhdGlvbiBmYXVsdERpc2FibGVEdXJhdGlvbigpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHBvb2xfLmZhdWx0RGlzYWJsZUR1cmF0aW9uOworICB9CisKKyAgLy8vIERpdHRvCisgIHZvaWQgZmF1bHREaXNhYmxlRHVyYXRpb24oRHVyYXRpb24gdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgcG9vbF8uZmF1bHREaXNhYmxlRHVyYXRpb24gPSB2YWx1ZTsKKyAgfQorCisgIC8rb3ZlcnJpZGUrLyBib29sIGRlbGVnYXRlKEV4Y2VwdGlvbikgcnBjRmF1bHRGaWx0ZXIoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBycGNGYXVsdEZpbHRlcl87CisgIH0KKworICAvK292ZXJyaWRlKy8gdm9pZCBycGNGYXVsdEZpbHRlcihib29sIGRlbGVnYXRlKEV4Y2VwdGlvbikgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgcnBjRmF1bHRGaWx0ZXJfID0gdmFsdWU7CisgIH0KKworICAvK292ZXJyaWRlKy8gYm9vbCByZW9wZW5UcmFuc3BvcnRzKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcmVvcGVuVHJhbnNwb3J0c187CisgIH0KKworICAvK292ZXJyaWRlKy8gdm9pZCByZW9wZW5UcmFuc3BvcnRzKGJvb2wgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgcmVvcGVuVHJhbnNwb3J0c18gPSB2YWx1ZTsKKyAgfQorCisgIG1peGluKGZhbGxiYWNrUG9vbEZvcndhcmRDb2RlIUludGVyZmFjZSgpKTsKKworcHJvdGVjdGVkOgorICAvLyBUaGUgYWN0dWFsIHdvcmtlciBpbXBsZW1lbnRhdGlvbiB0byB3aGljaCBSUEMgbWV0aG9kIGNhbGxzIGFyZSBmb3J3YXJkZWQuCisgIGF1dG8gZXhlY3V0ZU9uUG9vbChzdHJpbmcgbWV0aG9kLCBBcmdzLi4uKShBcmdzIGFyZ3MsCisgICAgVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24KKyAgKSB7CisgICAgYXV0byBjbGllbnRzID0gcG9vbF9bXTsKKyAgICBpZiAoY2xpZW50cy5lbXB0eSkgeworICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vIGNsaWVudHMgYXZhaWxhYmxlIHRvIHRyeS4iKTsKKyAgICB9CisKKyAgICBhdXRvIHByb21pc2UgPSBuZXcgVFByb21pc2UhKFJldHVyblR5cGUhKE1lbWJlclR5cGUhKEludGVyZmFjZSwgbWV0aG9kKSkpOworICAgIEV4Y2VwdGlvbltdIHJwY0V4Y2VwdGlvbnM7CisKKyAgICB2b2lkIHRyeU5leHQoKSB7CisgICAgICB3aGlsZSAoY2xpZW50cy5lbXB0eSkgeworICAgICAgICBDbGllbnQgbmV4dDsKKyAgICAgICAgRHVyYXRpb24gd2FpdFRpbWU7CisgICAgICAgIGlmIChjbGllbnRzLndpbGxCZWNvbWVOb25lbXB0eShuZXh0LCB3YWl0VGltZSkpIHsKKyAgICAgICAgICBpZiAod2FpdFRpbWUgPiBkdXIhImhuc2VjcyIoMCkpIHsKKyAgICAgICAgICAgIGlmICh3YWl0VGltZSA8IGR1ciEidXNlY3MiKDEwKSkgeworICAgICAgICAgICAgICBpbXBvcnQgY29yZS50aHJlYWQ7CisgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCh3YWl0VGltZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBuZXh0LnRyYW5zcG9ydC5hc3luY01hbmFnZXIuZGVsYXkod2FpdFRpbWUsIHsgdHJ5TmV4dCgpOyB9KTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcm9taXNlLmZhaWwobmV3IFRDb21wb3VuZE9wZXJhdGlvbkV4Y2VwdGlvbigiQWxsIGNsaWVudHMgZmFpbGVkLiIsCisgICAgICAgICAgICBycGNFeGNlcHRpb25zKSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGF1dG8gY2xpZW50ID0gY2xpZW50cy5mcm9udDsKKyAgICAgIGNsaWVudHMucG9wRnJvbnQ7CisKKyAgICAgIGlmIChyZW9wZW5UcmFuc3BvcnRzKSB7CisgICAgICAgIGlmICghY2xpZW50LnRyYW5zcG9ydC5pc09wZW4pIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xpZW50LnRyYW5zcG9ydC5vcGVuKCk7CisgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHBvb2xfLnJlY29yZEZhdWx0KGNsaWVudCk7CisgICAgICAgICAgICB0cnlOZXh0KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGF1dG8gZnV0dXJlID0gbWl4aW4oImNsaWVudC4iIH4gbWV0aG9kKShhcmdzLCBjYW5jZWxsYXRpb24pOworICAgICAgZnV0dXJlLmNvbXBsZXRpb24uYWRkQ2FsbGJhY2soeworICAgICAgICBpZiAoZnV0dXJlLnN0YXR1cyA9PSBURnV0dXJlU3RhdHVzLkNBTkNFTExFRCkgeworICAgICAgICAgIHByb21pc2UuY2FuY2VsKCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYXV0byBlID0gZnV0dXJlLmdldEV4Y2VwdGlvbigpOworICAgICAgICBpZiAoZSkgeworICAgICAgICAgIGlmIChycGNGYXVsdEZpbHRlcl8gJiYgcnBjRmF1bHRGaWx0ZXJfKGUpKSB7CisgICAgICAgICAgICBwb29sXy5yZWNvcmRGYXVsdChjbGllbnQpOworICAgICAgICAgICAgcnBjRXhjZXB0aW9ucyB+PSBlOworICAgICAgICAgICAgdHJ5TmV4dCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwb29sXy5yZWNvcmRTdWNjZXNzKGNsaWVudCk7CisgICAgICAgIHByb21pc2UuY29tcGxldGUoZnV0dXJlKTsKKyAgICAgIH0pOworICAgIH0KKworICAgIHRyeU5leHQoKTsKKyAgICByZXR1cm4gcHJvbWlzZTsKKyAgfQorCitwcml2YXRlOgorICBUUmVzb3VyY2VQb29sIUNsaWVudCBwb29sXzsKKyAgYm9vbCBkZWxlZ2F0ZShFeGNlcHRpb24pIHJwY0ZhdWx0RmlsdGVyXzsKKyAgYm9vbCByZW9wZW5UcmFuc3BvcnRzXzsKK30KKworLyoqCisgKiBUQXN5bmNDbGllbnRQb29sIGNvbnN0cnVjdGlvbiBoZWxwZXIgdG8gYXZvaWQgaGF2aW5nIHRvIGV4cGxpY2l0bHkKKyAqIHNwZWNpZnkgdGhlIGludGVyZmFjZSB0eXBlLCBpLmUuIHRvIGFsbG93IHRoZSBjb25zdHJ1Y3RvciBiZWluZyBjYWxsZWQKKyAqIHVzaW5nIElGVEkgKHNlZSAkKERNREJVRyA2MDgyLCBEIEJ1Z3ppbGxhIGVuaGFuY2VtZW50IHJlcXVlc3QgNjA4MikpLgorICovCitUQXN5bmNDbGllbnRQb29sIUludGVyZmFjZSB0QXN5bmNDbGllbnRQb29sKEludGVyZmFjZSkoCisgIFRBc3luY0NsaWVudEJhc2UhSW50ZXJmYWNlW10gY2xpZW50cworKSBpZiAoaXNTZXJ2aWNlIUludGVyZmFjZSkgeworICByZXR1cm4gbmV3IHR5cGVvZihyZXR1cm4pKGNsaWVudHMpOworfQorCitwcml2YXRlIHsKKyAgLy8gQ2Fubm90IHVzZSBhbiBhbm9ueW1vdXMgZGVsZWdhdGUgbGl0ZXJhbCBmb3IgdGhpcyBiZWNhdXNlIHRoZXkgYXJlbid0CisgIC8vIGFsbG93ZWQgaW4gY2xhc3Mgc2NvcGUuCisgIHN0cmluZyBmYWxsYmFja1Bvb2xGb3J3YXJkQ29kZShJbnRlcmZhY2UpKCkgeworICAgIHN0cmluZyBjb2RlID0gIiI7CisKKyAgICBmb3JlYWNoIChtZXRob2ROYW1lOyBBbGxNZW1iZXJNZXRob2ROYW1lcyFJbnRlcmZhY2UpIHsKKyAgICAgIGVudW0gcW4gPSAiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lOworICAgICAgY29kZSB+PSAiVEZ1dHVyZSEoUmV0dXJuVHlwZSEoIiB+IHFuIH4gIikpICIgfiBtZXRob2ROYW1lIH4KKyAgICAgICAgIihQYXJhbWV0ZXJUeXBlVHVwbGUhKCIgfiBxbiB+ICIpIGFyZ3MsIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uID0gbnVsbCkge1xuIjsKKyAgICAgIGNvZGUgfj0gInJldHVybiBleGVjdXRlT25Qb29sIShgIiB+IG1ldGhvZE5hbWUgfiAiYCkoYXJncywgY2FuY2VsbGF0aW9uKTtcbiI7CisgICAgICBjb2RlIH49ICJ9XG4iOworICAgIH0KKworICAgIHJldHVybiBjb2RlOworICB9Cit9CisKKy8qKgorICogQSBUQXN5bmNDbGllbnRQb29sQmFzZSBpbXBsZW1lbnRhdGlvbiB3aGljaCBxdWVyaWVzIG11bHRpcGxlIHNlcnZlcnMgYXQKKyAqIHRoZSBzYW1lIHRpbWUgYW5kIHJldHVybnMgdGhlIGZpcnN0IHN1Y2Nlc3MgcmVzcG9uc2UuCisgKgorICogVGhlIGRlZmluaXRpb24gb2YgwrtzdWNjZXNzwqsgY2FuIGJlIGN1c3RvbWl6ZWQgdXNpbmcgdGhlIHJwY0ZhdWx0RmlsdGVyKCkKKyAqIGRlbGVnYXRlIHByb3BlcnR5LiBJZiBpdCBpcyBub24tbnVsbCBhbmQgY2FsbGluZyBpdCBmb3IgYW4gZXhjZXB0aW9uIHNldCBieQorICogYSBmYWlsZWQgbWV0aG9kIGludm9jYXRpb24gcmV0dXJucyB0cnVlLCB0aGUgZXJyb3IgaXMgY29uc2lkZXJlZCB0byBiZQorICogY2F1c2VkIGJ5IHRoZSBSUEMgbGF5ZXIgcmF0aGVyIHRoYW4gdGhlIGFwcGxpY2F0aW9uIGxheWVyLCBhbmQgdGhlIG5leHQKKyAqIHNlcnZlciBpbiB0aGUgcG9vbCBpcyB0cmllZC4gSWYgYWxsIGNsaWVudHMgZmFpbCwgdGhlIG9wZXJhdGlvbiBpcyBtYXJrZWQKKyAqIGFzIGZhaWxlZCB3aXRoIGEgVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uLgorICovCitmaW5hbCBjbGFzcyBUQXN5bmNGYXN0ZXN0Q2xpZW50UG9vbChJbnRlcmZhY2UpIGlmIChpc1NlcnZpY2UhSW50ZXJmYWNlKSA6CisgIFRBc3luY0NsaWVudFBvb2xCYXNlIUludGVyZmFjZQoreworICAvLy8KKyAgdGhpcyhDbGllbnRbXSBjbGllbnRzKSB7CisgICAgY2xpZW50c18gPSBjbGllbnRzOworICAgIHJwY0ZhdWx0RmlsdGVyXyA9IGRlZmF1bHRScGNGYXVsdEZpbHRlcjsKKyAgICByZW9wZW5UcmFuc3BvcnRzXyA9IHRydWU7CisgIH0KKworICAvK292ZXJyaWRlKy8gdm9pZCBhZGRDbGllbnQoQ2xpZW50IGNsaWVudCkgeworICAgIGNsaWVudHNfIH49IGNsaWVudDsKKyAgfQorCisgIC8rb3ZlcnJpZGUrLyBib29sIHJlbW92ZUNsaWVudChDbGllbnQgY2xpZW50KSB7CisgICAgYXV0byBvbGRMZW5ndGggPSBjbGllbnRzXy5sZW5ndGg7CisgICAgY2xpZW50c18gPSByZW1vdmVFcXVhbChjbGllbnRzXywgY2xpZW50KTsKKyAgICByZXR1cm4gY2xpZW50c18ubGVuZ3RoIDwgb2xkTGVuZ3RoOworICB9CisKKworICAvK292ZXJyaWRlKy8gYm9vbCBkZWxlZ2F0ZShFeGNlcHRpb24pIHJwY0ZhdWx0RmlsdGVyKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcnBjRmF1bHRGaWx0ZXJfOworICB9CisKKyAgLytvdmVycmlkZSsvIHZvaWQgcnBjRmF1bHRGaWx0ZXIoYm9vbCBkZWxlZ2F0ZShFeGNlcHRpb24pIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHJwY0ZhdWx0RmlsdGVyXyA9IHZhbHVlOworICB9CisKKyAgLytvdmVycmlkZSsvYm9vbCByZW9wZW5UcmFuc3BvcnRzKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcmVvcGVuVHJhbnNwb3J0c187CisgIH0KKworICAvK292ZXJyaWRlKy8gdm9pZCByZW9wZW5UcmFuc3BvcnRzKGJvb2wgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgcmVvcGVuVHJhbnNwb3J0c18gPSB2YWx1ZTsKKyAgfQorCisgIG1peGluKGZhc3Rlc3RQb29sRm9yd2FyZENvZGUhSW50ZXJmYWNlKCkpOworCitwcml2YXRlOgorICBDbGllbnRbXSBjbGllbnRzXzsKKyAgYm9vbCBkZWxlZ2F0ZShFeGNlcHRpb24pIHJwY0ZhdWx0RmlsdGVyXzsKKyAgYm9vbCByZW9wZW5UcmFuc3BvcnRzXzsKK30KKworLyoqCisgKiBUQXN5bmNGYXN0ZXN0Q2xpZW50UG9vbCBjb25zdHJ1Y3Rpb24gaGVscGVyIHRvIGF2b2lkIGhhdmluZyB0byBleHBsaWNpdGx5CisgKiBzcGVjaWZ5IHRoZSBpbnRlcmZhY2UgdHlwZSwgaS5lLiB0byBhbGxvdyB0aGUgY29uc3RydWN0b3IgYmVpbmcgY2FsbGVkCisgKiB1c2luZyBJRlRJIChzZWUgJChETURCVUcgNjA4MiwgRCBCdWd6aWxsYSBlbmhhbmNlbWVudCByZXF1ZXN0IDYwODIpKS4KKyAqLworVEFzeW5jRmFzdGVzdENsaWVudFBvb2whSW50ZXJmYWNlIHRBc3luY0Zhc3Rlc3RDbGllbnRQb29sKEludGVyZmFjZSkoCisgIFRBc3luY0NsaWVudEJhc2UhSW50ZXJmYWNlW10gY2xpZW50cworKSBpZiAoaXNTZXJ2aWNlIUludGVyZmFjZSkgeworICByZXR1cm4gbmV3IHR5cGVvZihyZXR1cm4pKGNsaWVudHMpOworfQorCitwcml2YXRlIHsKKyAgLy8gQ2Fubm90IHVzZSBhbiBhbm9ueW1vdXMgZGVsZWdhdGUgbGl0ZXJhbCBmb3IgdGhpcyBiZWNhdXNlIHRoZXkgYXJlbid0CisgIC8vIGFsbG93ZWQgaW4gY2xhc3Mgc2NvcGUuCisgIHN0cmluZyBmYXN0ZXN0UG9vbEZvcndhcmRDb2RlKEludGVyZmFjZSkoKSB7CisgICAgc3RyaW5nIGNvZGUgPSAiIjsKKworICAgIGZvcmVhY2ggKG1ldGhvZE5hbWU7IEFsbE1lbWJlck1ldGhvZE5hbWVzIUludGVyZmFjZSkgeworICAgICAgZW51bSBxbiA9ICJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWU7CisgICAgICBjb2RlIH49ICJURnV0dXJlIShSZXR1cm5UeXBlISgiIH4gcW4gfiAiKSkgIiB+IG1ldGhvZE5hbWUgfgorICAgICAgICAiKFBhcmFtZXRlclR5cGVUdXBsZSEoIiB+IHFuIH4gIikgYXJncywgIiB+CisgICAgICAgICJUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbiA9IG51bGwpIHtcbiI7CisgICAgICBjb2RlIH49ICJlbnVtIG1ldGhvZE5hbWUgPSBgIiB+IG1ldGhvZE5hbWUgfiAiYDtcbiI7CisgICAgICBjb2RlIH49IHF7CisgICAgICAgIGFsaWFzIFJldHVyblR5cGUhKE1lbWJlclR5cGUhKEludGVyZmFjZSwgbWV0aG9kTmFtZSkpIFJlc3VsdFR5cGU7CisKKyAgICAgICAgYXV0byBjaGlsZENhbmNlbGxhdGlvbiA9IG5ldyBUQ2FuY2VsbGF0aW9uT3JpZ2luOworCisgICAgICAgIFRGdXR1cmUhUmVzdWx0VHlwZVtdIGZ1dHVyZXM7CisgICAgICAgIGZ1dHVyZXMucmVzZXJ2ZShjbGllbnRzXy5sZW5ndGgpOworCisgICAgICAgIGZvcmVhY2ggKGM7IGNsaWVudHNfKSB7CisgICAgICAgICAgaWYgKHJlb3BlblRyYW5zcG9ydHMpIHsKKyAgICAgICAgICAgIGlmICghYy50cmFuc3BvcnQuaXNPcGVuKSB7CisgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYy50cmFuc3BvcnQub3BlbigpOworICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGZ1dHVyZXMgfj0gbWl4aW4oImMuIiB+IG1ldGhvZE5hbWUpKGFyZ3MsIGNoaWxkQ2FuY2VsbGF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgRmFzdGVzdFBvb2xKb2IhKFJlc3VsdFR5cGUpKAorICAgICAgICAgIGZ1dHVyZXMsIHJwY0ZhdWx0RmlsdGVyLCBjYW5jZWxsYXRpb24sIGNoaWxkQ2FuY2VsbGF0aW9uKTsKKyAgICAgIH07CisgICAgICBjb2RlIH49ICJ9XG4iOworICAgIH0KKworICAgIHJldHVybiBjb2RlOworICB9CisKKyAgZmluYWwgY2xhc3MgRmFzdGVzdFBvb2xKb2IoUmVzdWx0KSA6IFRGdXR1cmUhUmVzdWx0IHsKKyAgICB0aGlzKFRGdXR1cmUhUmVzdWx0W10gcG9vbEZ1dHVyZXMsIGJvb2wgZGVsZWdhdGUoRXhjZXB0aW9uKSBycGNGYXVsdEZpbHRlciwKKyAgICAgIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uLCBUQ2FuY2VsbGF0aW9uT3JpZ2luIGNoaWxkQ2FuY2VsbGF0aW9uCisgICAgKSB7CisgICAgICByZXN1bHRQcm9taXNlXyA9IG5ldyBUUHJvbWlzZSFSZXN1bHQ7CisgICAgICBwb29sRnV0dXJlc18gPSBwb29sRnV0dXJlczsKKyAgICAgIHJwY0ZhdWx0RmlsdGVyXyA9IHJwY0ZhdWx0RmlsdGVyOworICAgICAgY2hpbGRDYW5jZWxsYXRpb25fID0gY2hpbGRDYW5jZWxsYXRpb247CisKKyAgICAgIGZvcmVhY2ggKGZ1dHVyZTsgcG9vbEZ1dHVyZXMpIHsKKyAgICAgICAgZnV0dXJlLmNvbXBsZXRpb24uYWRkQ2FsbGJhY2soeworICAgICAgICAgIGF1dG8gZiA9IGZ1dHVyZTsKKyAgICAgICAgICByZXR1cm4geyBjb21wbGV0aW9uQ2FsbGJhY2soZik7IH07CisgICAgICAgIH0oKSk7CisgICAgICAgIGlmIChmdXR1cmUuc3RhdHVzICE9IFRGdXR1cmVTdGF0dXMuUlVOTklORykgeworICAgICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGZ1dHVyZSBpcyBhbHJlYWR5IGNvbXBsZXRlZCwgd2UgYXJlIGRvbmUsIGRvbid0CisgICAgICAgICAgLy8gYm90aGVyIGFkZGluZyBjYWxsYmFja3MgZm9yIHRoZSBvdGhlcnMgKHRoZXkgd291bGQganVzdCByZXR1cm4KKyAgICAgICAgICAvLyBpbW1lZGlhdGVseSBhZnRlciBhY3F1aXJpbmcgdGhlIGxvY2spLgorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoY2FuY2VsbGF0aW9uKSB7CisgICAgICAgIGNhbmNlbGxhdGlvbi50cmlnZ2VyaW5nLmFkZENhbGxiYWNrKHsKKyAgICAgICAgICByZXN1bHRQcm9taXNlXy5jYW5jZWwoKTsKKyAgICAgICAgICBjaGlsZENhbmNlbGxhdGlvbi50cmlnZ2VyKCk7CisgICAgICAgIH0pOworICAgICAgfQorICAgIH0KKworICAgIFRGdXR1cmVTdGF0dXMgc3RhdHVzKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICAgIHJldHVybiByZXN1bHRQcm9taXNlXy5zdGF0dXM7CisgICAgfQorCisgICAgVEF3YWl0YWJsZSBjb21wbGV0aW9uKCkgQHByb3BlcnR5IHsKKyAgICAgIHJldHVybiByZXN1bHRQcm9taXNlXy5jb21wbGV0aW9uOworICAgIH0KKworICAgIFJlc3VsdCBnZXQoKSB7CisgICAgICByZXR1cm4gcmVzdWx0UHJvbWlzZV8uZ2V0KCk7CisgICAgfQorCisgICAgRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpIHsKKyAgICAgIHJldHVybiByZXN1bHRQcm9taXNlXy5nZXRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIGNvbXBsZXRpb25DYWxsYmFjayhURnV0dXJlIVJlc3VsdCBmdXR1cmUpIHsKKyAgICAgIHN5bmNocm9uaXplZCB7CisgICAgICAgIGlmIChmdXR1cmUuc3RhdHVzID09IFRGdXR1cmVTdGF0dXMuQ0FOQ0VMTEVEKSB7CisgICAgICAgICAgYXNzZXJ0KHJlc3VsdFByb21pc2VfLnN0YXR1cyAhPSBURnV0dXJlU3RhdHVzLlJVTk5JTkcpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXN1bHRQcm9taXNlXy5zdGF0dXMgIT0gVEZ1dHVyZVN0YXR1cy5SVU5OSU5HKSB7CisgICAgICAgICAgLy8gVGhlIG9wZXJhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4gVGhpcyBjYW4gaGFwcGVuIGlmCisgICAgICAgICAgLy8gYW5vdGhlciBjbGllbnQgY29tcGxldGVkIGZpcnN0LCBidXQgdGhpcyBjYWxsYmFjayB3YXMgYWxyZWFkeQorICAgICAgICAgIC8vIHdhaXRpbmcgZm9yIHRoZSBsb2NrIHdoZW4gaXQgY2FsbGVkIGNhbmNlbCgpLgorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmdXR1cmUuc3RhdHVzID09IFRGdXR1cmVTdGF0dXMuRkFJTEVEKSB7CisgICAgICAgICAgYXV0byBlID0gZnV0dXJlLmdldEV4Y2VwdGlvbigpOworICAgICAgICAgIGlmIChycGNGYXVsdEZpbHRlcl8gJiYgcnBjRmF1bHRGaWx0ZXJfKGUpKSB7CisgICAgICAgICAgICBycGNFeGNlcHRpb25zXyB+PSBlOworCisgICAgICAgICAgICBpZiAocnBjRXhjZXB0aW9uc18ubGVuZ3RoID09IHBvb2xGdXR1cmVzXy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgcmVzdWx0UHJvbWlzZV8uZmFpbChuZXcgVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJBbGwgY2hpbGQgb3BlcmF0aW9ucyBmYWlsZWQsIHVuYWJsZSB0byByZXRyaWV2ZSBhIHJlc3VsdC4iLAorICAgICAgICAgICAgICAgIHJwY0V4Y2VwdGlvbnNfCisgICAgICAgICAgICAgICkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcmUgdGhlIHJlc3VsdCB0byB0aGUgdGFyZ2V0IHByb21pc2UuCisgICAgICAgIHJlc3VsdFByb21pc2VfLmNvbXBsZXRlKGZ1dHVyZSk7CisKKyAgICAgICAgLy8gQ2FuY2VsIHRoZSBvdGhlciBmdXR1cmVzLCB3ZSB3b3VsZCBqdXN0IGRpc2NhcmQgdGhlaXIgcmVzdWx0cy4KKyAgICAgICAgLy8gTm90ZTogV2UgZG8gdGhpcyBhZnRlciB3ZSBoYXZlIHN0b3JlZCB0aGUgcmVzdWx0cyB0byBvdXIgcHJvbWlzZSwKKyAgICAgICAgLy8gc2VlIHRoZSBhc3NlcnQgYXQgdGhlIHRvcCBvZiB0aGUgZnVuY3Rpb24uCisgICAgICAgIGNoaWxkQ2FuY2VsbGF0aW9uXy50cmlnZ2VyKCk7CisgICAgICB9CisgICAgfQorCisgICAgVFByb21pc2UhUmVzdWx0IHJlc3VsdFByb21pc2VfOworICAgIFRGdXR1cmUhUmVzdWx0W10gcG9vbEZ1dHVyZXNfOworICAgIEV4Y2VwdGlvbltdIHJwY0V4Y2VwdGlvbnNfOworICAgIGJvb2wgZGVsZWdhdGUoRXhjZXB0aW9uKSBycGNGYXVsdEZpbHRlcl87CisgICAgVENhbmNlbGxhdGlvbk9yaWdpbiBjaGlsZENhbmNlbGxhdGlvbl87CisgIH0KK30KKworLyoqCisgKiBBbGxvd3MgZWFzaWx5IGFnZ3JlZ2F0aW5nIHJlc3VsdHMgZnJvbSBhIG51bWJlciBvZiBUQXN5bmNDbGllbnRzLgorICoKKyAqIENvbnRyYXJ5IHRvIFRBc3luY3tGYWxsYmFjaywgRmFzdGVzdH1DbGllbnRQb29sLCB0aGlzIGNsYXNzIGRvZXMgbm90CisgKiBzaW1wbHkgaW1wbGVtZW50IFRGdXR1cmVJbnRlcmZhY2UhSW50ZXJmYWNlLiBJdCBtYW5hZ2VzIGEgcG9vbCBvZiBjbGllbnRzLAorICogYnV0IGFsbG93cyB0aGUgdXNlciB0byBzcGVjaWZ5IGEgY3VzdG9tIGFjY3VtdWxhdG9yIGZ1bmN0aW9uIHRvIHVzZSBvciB0bworICogaXRlcmF0ZSBvdmVyIHRoZSByZXN1bHRzIHVzaW5nIGEgVEZ1dHVyZUFnZ3JlZ2F0b3JSYW5nZS4KKyAqCisgKiBGb3IgZWFjaCBzZXJ2aWNlIG1ldGhvZCwgVEFzeW5jQWdncmVnYXRvciBvZmZlcnMgYSBtZXRob2QKKyAqIGFjY2VwdGluZyB0aGUgc2FtZSBhcmd1bWVudHMsIGFuZCBhbiBvcHRpb25hbCBUQ2FuY2VsbGF0aW9uIGluc3RhbmNlLCBqdXN0CisgKiBsaWtlIHdpdGggVEZ1dHVyZUludGVyZmFjZS4gVGhlIHJldHVybiB0eXBlLCBob3dldmVyLCBpcyBhIHByb3h5IG9iamVjdAorICogdGhhdCBvZmZlcnMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorICogLS0tCisgKiAvKysKKyAqICArIFJldHVybnMgYSB0aHJpZnQudXRpbC5mdXR1cmUuVEZ1dHVyZUFnZ3JlZ2F0b3JSYW5nZSBmb3IgdGhlIHJlc3VsdHMgb2YKKyAqICArIHRoZSBjbGllbnQgcG9vbCBtZXRob2QgaW52b2NhdGlvbnMuCisgKiAgKworICogICsgVGhlIFtdIChzbGljaW5nKSBvcGVyYXRvciBjYW4gYWxzbyBiZSB1c2VkIHRvIG9idGFpbiB0aGUgcmFuZ2UuCisgKiAgKworICogICsgUGFyYW1zOgorICogICsgICB0aW1lb3V0ID0gQSB0aW1lb3V0IHRvIHBhc3MgdG8gdGhlIFRGdXR1cmVBZ2dyZWdhdG9yUmFuZ2UgY29uc3RydWN0b3IsCisgKiAgKyAgICAgZGVmYXVsdHMgdG8gemVybyAobm8gdGltZW91dCkuCisgKiAgKy8KKyAqIFRGdXR1cmVBZ2dyZWdhdG9yUmFuZ2UhUmV0dXJuVHlwZSByYW5nZShEdXJhdGlvbiB0aW1lb3V0ID0gZHVyISJobnNlY3MiKDApKTsKKyAqIGF1dG8gb3BTbGljZSgpIHsgcmV0dXJuIHJhbmdlKCk7IH0gLy8vIERpdHRvCisgKgorICogLysrCisgKiAgKyBSZXR1cm5zIGEgZnV0dXJlIHRoYXQgZ2F0aGVycyB0aGUgcmVzdWx0cyBmcm9tIHRoZSBjbGllbnRzIGluIHRoZSBwb29sCisgKiAgKyBhbmQgaW52b2tlcyBhIHVzZXItc3VwcGxpZWQgYWNjdW11bGF0b3IgZnVuY3Rpb24gb24gdGhlbSwgcmV0dXJuaW5nIGl0cworICogICsgcmV0dXJuIHZhbHVlIHRvIHRoZSBjbGllbnQuCisgKiAgKworICogICsgSW4gYWRkaXRpb24gdG8gdGhlIFRGdXR1cmUhQWNjdW11bGF0ZWRUeXBlIGludGVyZmFjZSAod2hlcmUKKyAqICArIEFjY3VtdWxhdGVkVHlwZSBpcyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGFjY3VtdWxhdG9yIGZ1bmN0aW9uKSwgdGhlCisgKiAgKyByZXR1cm5lZCBvYmplY3QgYWxzbyBvZmZlcnMgdHdvIGFkZGl0aW9uYWwgbWV0aG9kcywgZmluaXNoKCkgYW5kCisgKiAgKyBmaW5pc2hHZXQoKTogQnkgZGVmYXVsdCwgdGhlIGFjY3VtdWxhdG9yIGZ1bmN0aW9ucyBpcyBjYWxsZWQgYWZ0ZXIgYWxsCisgKiAgKyB0aGUgcmVzdWx0cyBmcm9tIHRoZSBwb29sIGNsaWVudHMgaGF2ZSBiZWNvbWUgYXZhaWxhYmxlLiBDYWxsaW5nIGZpbmlzaCgpCisgKiAgKyBjYXVzZXMgdGhlIGFjY3VtdWxhdG9yIGZ1dHVyZSB0byBzdG9wIHdhaXRpbmcgZm9yIG90aGVyIHJlc3VsdHMgYW5kCisgKiAgKyBpbW1lZGlhdGVseSBpbnZva2luZyB0aGUgYWNjdW11bGF0b3IgZnVuY3Rpb24gb24gdGhlIHJlc3VsdHMgY3VycmVudGx5CisgKiAgKyBhdmFpbGFibGUuIElmIGFsbCByZXN1bHRzIGFyZSBhbHJlYWR5IGF2YWlsYWJsZSwgZmluaXNoKCkgaXMgYSBuby1vcC4KKyAqICArIGZpbmlzaEdldCgpIGlzIGEgY29udmVuaWVuY2Ugc2hvcnRjdXQgZm9yIGNvbWJpbmluZyBpdCB3aXRoCisgKiAgKyBhIGNhbGwgdG8gZ2V0KCkgaW1tZWRpYXRlbHkgYWZ0ZXJ3YXJkcywgbGlrZSB3YWl0R2V0KCkgaXMgZm9yIHdhaXQoKS4KKyAqICArCisgKiAgKyBUaGUgYWNjIGFsaWFzIGNhbiBwb2ludCB0byBhbnkgY2FsbGFibGUgYWNjZXB0aW5nIGVpdGhlciBhbiBhcnJheSBvZgorICogICsgcmV0dXJuIHZhbHVlcyBvciBhbiBhcnJheSBvZiByZXR1cm4gdmFsdWVzIGFuZCBhbiBhcnJheSBvZiBleGNlcHRpb25zOworICogICsgc2VlIGlzQWNjdW11bGF0b3IhKCkgZm9yIGRldGFpbHMuIFRoZSBkZWZhdWx0IGFjY3VtdWxhdG9yIGNvbmNhdGVuYXRlcworICogICsgcmV0dXJuIHZhbHVlcyB0aGF0IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBlYWNoIG90aGVycyAoZS5nLiBhcnJheXMpLAorICogICsgYW5kIHNpbXBseSByZXR1cm5zIGFuIGFycmF5IG9mIHZhbHVlcyBvdGhlcndpc2UsIGZhaWxpbmcgd2l0aCBhCisgKiAgKyBUQ29tcG91bmRPcGVyYXRpb25FeGNlcHRpb24gbm8gdmFsdWVzIHdlcmUgcmV0dXJuZWQuCisgKiAgKworICogICsgVGhlIGFjY3VtdWxhdG9yIGZ1bmN0aW9uIGlzIG5vdCBleGVjdXRlZCBpbiBhbnkgb2YgdGhlIGFzeW5jIG1hbmFnZXIKKyAqICArIHdvcmtlciB0aHJlYWRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXN5bmMgY2xpZW50cywgYnV0IGluc3RlYWQgaXQgaXMKKyAqICArIGludm9rZWQgd2hlbiB0aGUgYWN0dWFsIHJlc3VsdCBpcyByZXF1ZXN0ZWQgZm9yIHRoZSBmaXJzdCB0aW1lIGFmdGVyIHRoZQorICogICsgb3BlcmF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gVGhpcyBhbHNvIGluY2x1ZGVzIGNoZWNraW5nIHRoZSBzdGF0dXMKKyAqICArIG9mIHRoZSBvcGVyYXRpb24gb25jZSBpdCBpcyBubyBsb25nZXIgcnVubmluZywgc2luY2UgdGhlIGFjY3VtdWxhdG9yCisgKiAgKyBoYXMgdG8gYmUgcnVuIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkIG9yIGZhaWxlZC4KKyAqICArLworICogYXV0byBhY2N1bXVsYXRlKGFsaWFzIGFjYyA9IGRlZmF1bHRBY2N1bXVsYXRvcikoKSBpZiAoaXNBY2N1bXVsYXRvciFhY2MpOworICogLS0tCisgKgorICogRXhhbXBsZToKKyAqIC0tLQorICogLy8gU29tZSBUaHJpZnQgc2VydmljZS4KKyAqIGludGVyZmFjZSBGb28geworICogICBpbnQgZm9vKHN0cmluZyBuYW1lKTsKKyAqICAgYnl0ZVtdIGJhcigpOworICogfQorICoKKyAqIC8vIENyZWF0ZSB0aGUgYWdncmVnYXRvciBwb29sIOKAkyBjbGllbnQwLCBjbGllbnQxLCBjbGllbnQyIGFyZSBzb21lCisgKiAvLyBUQXN5bmNDbGllbnQhRm9vIGluc3RhbmNlcywgYnV0IGluIHRoZW9yeSBjb3VsZCBhbHNvIGJlIG90aGVyCisgKiAvLyBURnV0dXJlSW50ZXJmYWNlIUZvbyBpbXBsZW1lbnRhdGlvbnMgKGUuZy4gc29tZSBhc3luYyBjbGllbnQgcG9vbCkuCisgKiBhdXRvIHBvb2wgPSBuZXcgVEFzeW5jQWdncmVnYXRvciFGb28oW2NsaWVudDAsIGNsaWVudDEsIGNsaWVudDJdKTsKKyAqCisgKiBmb3JlYWNoICh2YWw7IHBvb2wuZm9vKCJiYXoiKS5yYW5nZShkdXIhInNlY29uZHMiKDEpKSkgeworICogICAvLyBQcm9jZXNzIGFsbCB0aGUgcmVzdWx0cyB0aGF0IGFyZSBhdmFpbGFibGUgYmVmb3JlIGEgc2Vjb25kIGhhcyBwYXNzZWQsCisgKiAgIC8vIGluIHRoZSBvcmRlciB0aGV5IGFycml2ZS4KKyAqICAgd3JpdGVsbih2YWwpOworICogfQorICoKKyAqIGF1dG8gc3VtUm9vdHMgPSBwb29sLmZvbygiYmF6IikuYWNjdW11bGF0ZSEoKGludFtdIHZhbHMsIEV4Y2VwdGlvbnNbXSBleHMpeworICogICBpZiAodmFscy5lbXB0eSkgeworICogICAgIHRocm93IG5ldyBUQ29tcG91bmRPcGVyYXRpb25FeGNlcHRpb24oIkFsbCBjbGllbnRzIGZhaWxlZCIsIGV4cyk7CisgKiAgIH0KKyAqCisgKiAgIC8vIEp1c3QgdG8gaWxsdXN0cmF0ZSB0aGF0IHRoZSB0eXBlIG9mIHRoZSB2YWx1ZXMgY2FuIGNoYW5nZSwgY29udmVydCB0aGUKKyAqICAgLy8gbnVtYmVycyB0byBkb3VibGUgYW5kIHN1bSB1cCB0aGVpciByb290cy4KKyAqICAgZG91YmxlIHJlc3VsdCA9IDA7CisgKiAgIGZvcmVhY2ggKHY7IHZhbHMpIHJlc3VsdCArPSBzcXJ0KGNhc3QoZG91YmxlKXYpOworICogICByZXR1cm4gcmVzdWx0OworICogfSkoKTsKKyAqCisgKiAvLyBXYWl0IHVwIHRvIHRocmVlIHNlY29uZHMgZm9yIHRoZSByZXN1bHQsIGFuZCB0aGVuIGFjY3VtdWxhdGUgd2hhdCBoYXMKKyAqIC8vIGFycml2ZWQgc28gZmFyLgorICogc3VtUm9vdHMuY29tcGxldGlvbi53YWl0KGR1ciEic2Vjb25kcyIoMykpOworICogd3JpdGVsbihzdW1Sb290cy5maW5pc2hHZXQoKSk7CisgKgorICogLy8gRm9yIHNjYWxhcnMsIHRoZSBkZWZhdWx0IGFjY3VtdWxhdG9yIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHZhbHVlcy4KKyAqIHByYWdtYShtc2csIHR5cGVvZihwb29sLmZvbygiIikuYWNjdW11bGF0ZSgpLmdldCgpKTsgLy8gaW50W10uCisgKgorICogLy8gRm9yIGxpc3RzLCBldGMuLCBpdCBjb25jYXRlbmF0ZXMgdGhlIHJlc3VsdHMgdG9nZXRoZXIuCisgKiBwcmFnbWEobXNnLCB0eXBlb2YocG9vbC5iYXIoKS5hY2N1bXVsYXRlKCkuZ2V0KCkpKTsgLy8gYnl0ZVtdLgorICogLS0tCisgKgorICogTm90ZTogRm9yIHRoZSBhY2N1bXVsYXRlISgpIGludGVyZmFjZSwgeW91IG1pZ2h0IGN1cnJlbnRseSBoaXQgYSDCu2Nhbm5vdCB1c2UKKyAqIGxvY2FsICfigKYnIGFzIHBhcmFtZXRlciB0byBub24tZ2xvYmFsIHRlbXBsYXRlIGFjY3VtdWxhdGXCqy1lcnJvciwgc2VlCisgKiAkKERNREJVRyA1NzEwLCBETUQgaXNzdWUgNTcxMCkuIElmIHlvdXIgYWNjdW11bGF0b3IgZnVuY3Rpb24gZG9lcyBub3QgbmVlZAorICogdG8gYWNjZXNzIHRoZSBzdXJyb3VuZGluZyBzY29wZSwgeW91IG1pZ2h0IHdhbnQgdG8gdXNlIGEgZnVuY3Rpb24gbGl0ZXJhbAorICogaW5zdGVhZCBvZiBhIGRlbGVnYXRlIHRvIGF2b2lkIHRoZSBpc3N1ZS4KKyAqLworY2xhc3MgVEFzeW5jQWdncmVnYXRvcihJbnRlcmZhY2UpIGlmIChpc0Jhc2VTZXJ2aWNlIUludGVyZmFjZSkgeworICAvLy8gU2hvcnRoYW5kIGZvciB0aGUgY2xpZW50IHR5cGUgdGhpcyBpbnN0YW5jZSBvcGVyYXRlcyBvbi4KKyAgYWxpYXMgVEFzeW5jQ2xpZW50QmFzZSFJbnRlcmZhY2UgQ2xpZW50OworCisgIC8vLworICB0aGlzKENsaWVudFtdIGNsaWVudHMpIHsKKyAgICBjbGllbnRzXyA9IGNsaWVudHM7CisgIH0KKworICAvLy8gV2hldGhlciB0byBvcGVuIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydHMgb2YgYSBjbGllbnQgYmVmb3JlIHRyeWluZyB0bworICAvLy8gZXhlY3V0ZSBhIG1ldGhvZCBpZiB0aGV5IGFyZSBub3Qgb3Blbi4gVGhpcyBpcyB1c3VhbGx5IGRlc2lyYWJsZQorICAvLy8gYmVjYXVzZSBpdCBhbGxvd3MgZS5nLiB0byBhdXRvbWF0aWNhbGx5IHJlY29ubmVjdCB0byBhIHJlbW90ZSBzZXJ2ZXIKKyAgLy8vIGlmIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gaXMgZHJvcHBlZC4KKyAgLy8vCisgIC8vLyBEZWZhdWx0cyB0byB0cnVlLgorICBib29sIHJlb3BlblRyYW5zcG9ydHMgPSB0cnVlOworCisgIG1peGluIEFnZ3JlZ2F0b3JPcERpc3BhdGNoISgpOworCitwcml2YXRlOgorICBDbGllbnRbXSBjbGllbnRzXzsKK30KKworLy8vIERpdHRvCitjbGFzcyBUQXN5bmNBZ2dyZWdhdG9yKEludGVyZmFjZSkgaWYgKGlzRGVyaXZlZFNlcnZpY2UhSW50ZXJmYWNlKSA6CisgIFRBc3luY0FnZ3JlZ2F0b3IhKEJhc2VTZXJ2aWNlIUludGVyZmFjZSkKK3sKKyAgLy8vIFNob3J0aGFuZCBmb3IgdGhlIGNsaWVudCB0eXBlIHRoaXMgaW5zdGFuY2Ugb3BlcmF0ZXMgb24uCisgIGFsaWFzIFRBc3luY0NsaWVudEJhc2UhSW50ZXJmYWNlIENsaWVudDsKKworICAvLy8KKyAgdGhpcyhDbGllbnRbXSBjbGllbnRzKSB7CisgICAgc3VwZXIoY2FzdChUQXN5bmNDbGllbnRCYXNlIShCYXNlU2VydmljZSFJbnRlcmZhY2UpW10pY2xpZW50cyk7CisgIH0KKworICBtaXhpbiBBZ2dyZWdhdG9yT3BEaXNwYXRjaCEoKTsKK30KKworLyoqCisgKiBXaGV0aGVyIGZ1biBpcyBhIHZhbGlkIGFjY3VtdWxhdG9yIGZ1bmN0aW9uIGZvciB2YWx1ZXMgb2YgdHlwZSBWYWx1ZVR5cGUuCisgKgorICogRm9yIHRoaXMgdG8gYmUgdHJ1ZSwgZnVuIG11c3QgYmUgYSBjYWxsYWJsZSBtYXRjaGluZyBvbmUgb2YgdGhlIGZvbGxvd2luZworICogYXJndW1lbnQgbGlzdHM6CisgKiAtLS0KKyAqIGZ1bihWYWx1ZVR5cGVbXSB2YWx1ZXMpOworICogZnVuKFZhbHVlVHlwZVtdIHZhbHVlcywgRXhjZXB0aW9uW10gZXhjZXB0aW9ucyk7CisgKiAtLS0KKyAqCisgKiBUaGUgc2Vjb25kIHZlcnNpb24gaXMgcGFzc2VkIHRoZSBjb2xsZWN0ZWQgYXJyYXkgZXhjZXB0aW9ucyBmcm9tIGFsbCB0aGUKKyAqIGNsaWVudHMgaW4gdGhlIHBvb2wuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYWNjdW11bGF0b3IgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHRoZSBjbGllbnQgKHZpYQorICogdGhlIHJlc3VsdCBmdXR1cmUpLiBJZiBpdCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB0aGUgb3BlcmF0aW9uIGlzIG1hcmtlZCBhcworICogZmFpbGVkIHdpdGggdGhlIGdpdmVuIGV4Y2VwdGlvbiBpbnN0ZWFkLgorICovCit0ZW1wbGF0ZSBpc0FjY3VtdWxhdG9yKFZhbHVlVHlwZSwgYWxpYXMgZnVuKSB7CisgIGVudW0gaXNBY2N1bXVsYXRvciA9IGlzKHR5cGVvZihmdW4oY2FzdChWYWx1ZVR5cGVbXSlbXSkpKSB8fAorICAgIGlzKHR5cGVvZihmdW4oY2FzdChWYWx1ZVR5cGVbXSlbXSwgY2FzdChFeGNlcHRpb25bXSlbXSkpKTsKK30KKworLyoqCisgKiBUQXN5bmNBZ2dyZWdhdG9yIGNvbnN0cnVjdGlvbiBoZWxwZXIgdG8gYXZvaWQgaGF2aW5nIHRvIGV4cGxpY2l0bHkKKyAqIHNwZWNpZnkgdGhlIGludGVyZmFjZSB0eXBlLCBpLmUuIHRvIGFsbG93IHRoZSBjb25zdHJ1Y3RvciBiZWluZyBjYWxsZWQKKyAqIHVzaW5nIElGVEkgKHNlZSAkKERNREJVRyA2MDgyLCBEIEJ1Z3ppbGxhIGVuaGFuY2VtZW50IHJlcXVlc3QgNjA4MikpLgorICovCitUQXN5bmNBZ2dyZWdhdG9yIUludGVyZmFjZSB0QXN5bmNBZ2dyZWdhdG9yKEludGVyZmFjZSkoCisgIFRBc3luY0NsaWVudEJhc2UhSW50ZXJmYWNlW10gY2xpZW50cworKSBpZiAoaXNTZXJ2aWNlIUludGVyZmFjZSkgeworICByZXR1cm4gbmV3IHR5cGVvZihyZXR1cm4pKGNsaWVudHMpOworfQorCitwcml2YXRlIHsKKyAgbWl4aW4gdGVtcGxhdGUgQWdncmVnYXRvck9wRGlzcGF0Y2goKSB7CisgICAgYXV0byBvcERpc3BhdGNoKHN0cmluZyBuYW1lLCBBcmdzLi4uKShBcmdzIGFyZ3MpIGlmICgKKyAgICAgIGlzKHR5cGVvZihtaXhpbigiSW50ZXJmYWNlLmluaXQuIiB+IG5hbWUpKGFyZ3MpKSkKKyAgICApIHsKKyAgICAgIGFsaWFzIFJldHVyblR5cGUhKE1lbWJlclR5cGUhKEludGVyZmFjZSwgbmFtZSkpIFJlc3VsdFR5cGU7CisKKyAgICAgIGF1dG8gY2hpbGRDYW5jZWxsYXRpb24gPSBuZXcgVENhbmNlbGxhdGlvbk9yaWdpbjsKKworICAgICAgVEZ1dHVyZSFSZXN1bHRUeXBlW10gZnV0dXJlczsKKyAgICAgIGZ1dHVyZXMucmVzZXJ2ZShjbGllbnRzXy5sZW5ndGgpOworCisgICAgICBmb3JlYWNoIChjOyBjYXN0KENsaWVudFtdKWNsaWVudHNfKSB7CisgICAgICAgIGlmIChyZW9wZW5UcmFuc3BvcnRzKSB7CisgICAgICAgICAgaWYgKCFjLnRyYW5zcG9ydC5pc09wZW4pIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIGMudHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmdXR1cmVzIH49IG1peGluKCJjLiIgfiBuYW1lKShhcmdzLCBjaGlsZENhbmNlbGxhdGlvbik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBBZ2dyZWdhdGlvblJlc3VsdCFSZXN1bHRUeXBlKGZ1dHVyZXMsIGNoaWxkQ2FuY2VsbGF0aW9uKTsKKyAgICB9CisgIH0KKworICBzdHJ1Y3QgQWdncmVnYXRpb25SZXN1bHQoVCkgeworICAgIGF1dG8gb3BTbGljZSgpIHsKKyAgICAgIHJldHVybiByYW5nZSgpOworICAgIH0KKworICAgIGF1dG8gcmFuZ2UoRHVyYXRpb24gdGltZW91dCA9IGR1ciEiaG5zZWNzIigwKSkgeworICAgICAgcmV0dXJuIHRGdXR1cmVBZ2dyZWdhdG9yUmFuZ2UoZnV0dXJlc18sIGNoaWxkQ2FuY2VsbGF0aW9uXywgdGltZW91dCk7CisgICAgfQorCisgICAgYXV0byBhY2N1bXVsYXRlKGFsaWFzIGFjYyA9IGRlZmF1bHRBY2N1bXVsYXRvcikoKSBpZiAoaXNBY2N1bXVsYXRvciEoVCwgYWNjKSkgeworICAgICAgcmV0dXJuIG5ldyBBY2N1bXVsYXRvckpvYiEoVCwgYWNjKShmdXR1cmVzXywgY2hpbGRDYW5jZWxsYXRpb25fKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBURnV0dXJlIVRbXSBmdXR1cmVzXzsKKyAgICBUQ2FuY2VsbGF0aW9uT3JpZ2luIGNoaWxkQ2FuY2VsbGF0aW9uXzsKKyAgfQorCisgIGF1dG8gZGVmYXVsdEFjY3VtdWxhdG9yKFQpKFRbXSB2YWx1ZXMsIEV4Y2VwdGlvbltdIGV4Y2VwdGlvbnMpIHsKKyAgICBpZiAodmFsdWVzLmVtcHR5KSB7CisgICAgICB0aHJvdyBuZXcgVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uKCJBbGwgY2xpZW50cyBmYWlsZWQiLAorICAgICAgICBleGNlcHRpb25zKTsKKyAgICB9CisKKyAgICBzdGF0aWMgaWYgKGlzKHR5cGVvZihULmluaXQgfiBULmluaXQpKSkgeworICAgICAgaW1wb3J0IHN0ZC5hbGdvcml0aG07CisgICAgICByZXR1cm4gcmVkdWNlISJhIH4gYiIodmFsdWVzKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHZhbHVlczsKKyAgICB9CisgIH0KKworICBmaW5hbCBjbGFzcyBBY2N1bXVsYXRvckpvYihULCBhbGlhcyBhY2N1bXVsYXRvcikgaWYgKAorICAgIGlzQWNjdW11bGF0b3IhKFQsIGFjY3VtdWxhdG9yKQorICApIDogVEZ1dHVyZSEoQWNjdW11bGF0b3JSZXN1bHQhKFQsIGFjY3VtdWxhdG9yKSkgeworICAgIHRoaXMoVEZ1dHVyZSFUW10gZnV0dXJlcywgVENhbmNlbGxhdGlvbk9yaWdpbiBjaGlsZENhbmNlbGxhdGlvbikgeworICAgICAgZnV0dXJlc18gPSBmdXR1cmVzOworICAgICAgY2hpbGRDYW5jZWxsYXRpb25fID0gY2hpbGRDYW5jZWxsYXRpb247CisgICAgICByZXN1bHRNdXRleF8gPSBuZXcgTXV0ZXg7CisgICAgICBjb21wbGV0aW9uRXZlbnRfID0gbmV3IFRPbmVzaG90RXZlbnQ7CisKKyAgICAgIGZvcmVhY2ggKGZ1dHVyZTsgZnV0dXJlcykgeworICAgICAgICBmdXR1cmUuY29tcGxldGlvbi5hZGRDYWxsYmFjayh7CisgICAgICAgICAgYXV0byBmID0gZnV0dXJlOworICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHJlc3VsdE11dGV4XykgeworICAgICAgICAgICAgICBpZiAoZi5zdGF0dXMgPT0gVEZ1dHVyZVN0YXR1cy5DQU5DRUxMRUQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZpbmlzaGVkXykgeworICAgICAgICAgICAgICAgICAgc3RhdHVzXyA9IFRGdXR1cmVTdGF0dXMuQ0FOQ0VMTEVEOworICAgICAgICAgICAgICAgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKGYuc3RhdHVzID09IFRGdXR1cmVTdGF0dXMuRkFJTEVEKSB7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uc18gfj0gZi5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXN1bHRzXyB+PSBmLmdldCgpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKHJlc3VsdHNfLmxlbmd0aCArIGV4Y2VwdGlvbnNfLmxlbmd0aCA9PSBmdXR1cmVzXy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBmaW5pc2hlZF8gPSB0cnVlOworICAgICAgICAgICAgICAgIGNvbXBsZXRpb25FdmVudF8udHJpZ2dlcigpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfTsKKyAgICAgICAgfSgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBURnV0dXJlU3RhdHVzIHN0YXR1cygpIEBwcm9wZXJ0eSB7CisgICAgICBzeW5jaHJvbml6ZWQgKHJlc3VsdE11dGV4XykgeworICAgICAgICBpZiAoIWZpbmlzaGVkXykgcmV0dXJuIFRGdXR1cmVTdGF0dXMuUlVOTklORzsKKyAgICAgICAgaWYgKHN0YXR1c18gIT0gVEZ1dHVyZVN0YXR1cy5SVU5OSU5HKSByZXR1cm4gc3RhdHVzXzsKKworICAgICAgICB0cnkgeworICAgICAgICAgIHJlc3VsdF8gPSBpbnZva2VBY2N1bXVsYXRvciFhY2N1bXVsYXRvcihyZXN1bHRzXywgZXhjZXB0aW9uc18pOworICAgICAgICAgIHN0YXR1c18gPSBURnV0dXJlU3RhdHVzLlNVQ0NFRURFRDsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBleGNlcHRpb25fID0gZTsKKyAgICAgICAgICBzdGF0dXNfID0gVEZ1dHVyZVN0YXR1cy5GQUlMRUQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3RhdHVzXzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBUQXdhaXRhYmxlIGNvbXBsZXRpb24oKSBAcHJvcGVydHkgeworICAgICAgcmV0dXJuIGNvbXBsZXRpb25FdmVudF87CisgICAgfQorCisgICAgQWNjdW11bGF0b3JSZXN1bHQhKFQsIGFjY3VtdWxhdG9yKSBnZXQoKSB7CisgICAgICBhdXRvIHMgPSBzdGF0dXM7CisKKyAgICAgIGVuZm9yY2UocyAhPSBURnV0dXJlU3RhdHVzLlJVTk5JTkcsCisgICAgICAgIG5ldyBURnV0dXJlRXhjZXB0aW9uKCJPcGVyYXRpb24gbm90IHlldCBjb21wbGV0ZWQuIikpOworCisgICAgICBpZiAocyA9PSBURnV0dXJlU3RhdHVzLkNBTkNFTExFRCkgdGhyb3cgbmV3IFRDYW5jZWxsZWRFeGNlcHRpb247CisgICAgICBpZiAocyA9PSBURnV0dXJlU3RhdHVzLkZBSUxFRCkgdGhyb3cgZXhjZXB0aW9uXzsKKyAgICAgIHJldHVybiByZXN1bHRfOworICAgIH0KKworICAgIEV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKSB7CisgICAgICBhdXRvIHMgPSBzdGF0dXM7CisgICAgICBlbmZvcmNlKHMgIT0gVEZ1dHVyZVN0YXR1cy5SVU5OSU5HLAorICAgICAgICBuZXcgVEZ1dHVyZUV4Y2VwdGlvbigiT3BlcmF0aW9uIG5vdCB5ZXQgY29tcGxldGVkLiIpKTsKKworICAgICAgaWYgKHMgPT0gVEZ1dHVyZVN0YXR1cy5DQU5DRUxMRUQpIHRocm93IG5ldyBUQ2FuY2VsbGVkRXhjZXB0aW9uOworCisgICAgICBpZiAocyA9PSBURnV0dXJlU3RhdHVzLlNVQ0NFRURFRCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBleGNlcHRpb25fOworICAgIH0KKworICAgIHZvaWQgZmluaXNoKCkgeworICAgICAgc3luY2hyb25pemVkIChyZXN1bHRNdXRleF8pIHsKKyAgICAgICAgaWYgKCFmaW5pc2hlZF8pIHsKKyAgICAgICAgICBmaW5pc2hlZF8gPSB0cnVlOworICAgICAgICAgIGNoaWxkQ2FuY2VsbGF0aW9uXy50cmlnZ2VyKCk7CisgICAgICAgICAgY29tcGxldGlvbkV2ZW50Xy50cmlnZ2VyKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBhdXRvIGZpbmlzaEdldCgpIHsKKyAgICAgIGZpbmlzaCgpOworICAgICAgcmV0dXJuIGdldCgpOworICAgIH0KKworICBwcml2YXRlOgorICAgIFRGdXR1cmUhVFtdIGZ1dHVyZXNfOworICAgIFRDYW5jZWxsYXRpb25PcmlnaW4gY2hpbGRDYW5jZWxsYXRpb25fOworCisgICAgYm9vbCBmaW5pc2hlZF87CisgICAgVFtdIHJlc3VsdHNfOworICAgIEV4Y2VwdGlvbltdIGV4Y2VwdGlvbnNfOworCisgICAgVEZ1dHVyZVN0YXR1cyBzdGF0dXNfOworICAgIE11dGV4IHJlc3VsdE11dGV4XzsKKyAgICB1bmlvbiB7CisgICAgICBBY2N1bXVsYXRvclJlc3VsdCEoVCwgYWNjdW11bGF0b3IpIHJlc3VsdF87CisgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uXzsKKyAgICB9CisgICAgVE9uZXNob3RFdmVudCBjb21wbGV0aW9uRXZlbnRfOworICB9CisKKyAgYXV0byBpbnZva2VBY2N1bXVsYXRvcihhbGlhcyBhY2N1bXVsYXRvciwgVCkoCisgICAgVFtdIHZhbHVlcywgRXhjZXB0aW9uW10gZXhjZXB0aW9ucworICApIGlmICgKKyAgICBpc0FjY3VtdWxhdG9yIShULCBhY2N1bXVsYXRvcikKKyAgKSB7CisgICAgc3RhdGljIGlmIChpcyh0eXBlb2YoYWNjdW11bGF0b3IodmFsdWVzLCBleGNlcHRpb25zKSkpKSB7CisgICAgICByZXR1cm4gYWNjdW11bGF0b3IodmFsdWVzLCBleGNlcHRpb25zKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yKHZhbHVlcyk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgQWNjdW11bGF0b3JSZXN1bHQoVCwgYWxpYXMgYWNjKSB7CisgICAgYWxpYXMgdHlwZW9mKGludm9rZUFjY3VtdWxhdG9yIWFjYyhjYXN0KFRbXSlbXSwgY2FzdChFeGNlcHRpb25bXSlbXSkpCisgICAgICBBY2N1bXVsYXRvclJlc3VsdDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2Jhc2UuZCBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9iYXNlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI1NDk5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9iYXNlLmQKQEAgLTAsMCArMSwxMDIxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogQ29kZSBnZW5lcmF0aW9uIG1ldGFkYXRhIGFuZCB0ZW1wbGF0ZXMgdXNlZCBmb3IgaW1wbGVtZW50aW5nIHN0cnVjdAorICogc2VyaWFsaXphdGlvbi4KKyAqCisgKiBNYW55IHRlbXBsYXRlcyBjYW4gYmUgY3VzdG9taXplZCB1c2luZyBmaWVsZCBtZXRhIGRhdGEsIHdoaWNoIGlzIHJlYWQgZnJvbQorICogYSBtYW5pZmVzdCBjb25zdGFudCBtZW1iZXIgb2YgdGhlIGdpdmVuIHR5cGUgY2FsbGVkIGZpZWxkTWV0YSAoaWYgcHJlc2VudCksCisgKiBhbmQgaXMgY29uY2F0ZW5hdGVkIHdpdGggdGhlIGVsZW1lbnRzIGZyb20gdGhlIG9wdGlvbmFsIGZpZWxkTWV0YURhdGEKKyAqIHRlbXBsYXRlIGFsaWFzIHBhcmFtZXRlci4KKyAqCisgKiBTb21lIGNvZGUgZ2VuZXJhdGlvbiB0ZW1wbGF0ZXMgdGFrZSBhY2NvdW50IG9mIHRoZSBvcHRpb25hbCBUVmVyYm9zZUNvZGVnZW4KKyAqIHZlcnNpb24gZGVjbGFyYXRpb24sIHdoaWNoIGNhdXNlcyB3YXJuaW5nIG1lc3NhZ2VzIHRvIGJlIGVtaXR0ZWQgaWYgbm8KKyAqIG1ldGFkYXRhIGZvciBhIGZpZWxkL21ldGhvZCBoYXMgYmVlbiBmb3VuZCBhbmQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMKKyAqIHVzZWQgaW5zdGVhZC4gSWYgdGhpcyB2ZXJzaW9uIGlzIG5vdCBkZWZpbmVkLCB0aGUgdGVtcGxhdGVzIGp1c3Qgc2lsZW50bHkKKyAqIGJlaGF2ZSBsaWtlIHRoZSBUaHJpZnQgY29tcGlsZXIgZG9lcyBpbiB0aGlzIHNpdHVhdGlvbiwgaS5lLiBhdXRvbWF0aWNhbGx5CisgKiBhc3NpZ24gbmVnYXRpdmUgaWRzIChzdGFydGluZyBhdCAtMSkgZm9yIGZpZWxkcyBhbmQgYXNzdW1lIFRSZXEuQVVUTyBhcworICogcmVxdWlyZW1lbnQgbGV2ZWwuCisgKi8KKy8vIEltcGxlbWVudGF0aW9uIG5vdGU6IEFsbCB0aGUgdGVtcGxhdGVzIGluIGhlcmUgdGFraW5nIGEgZmllbGQgbWV0YWRhdGEKKy8vIHBhcmFtZXRlciBzaG91bGQgaWRlYWxseSBoYXZlIGEgY29uc3RyYWludCB0aGF0IHJlc3RyaWN0cyB0aGUgYWxpYXMgdG8KKy8vIFRGaWVsZE1ldGFbXS10eXBlZCB2YWx1ZXMsIGJ1dCB0aGUgaXMoKSBleHByZXNzaW9ucyBzZWVtcyB0byBhbHdheXMgZmFpbC4KK21vZHVsZSB0aHJpZnQuY29kZWdlbi5iYXNlOworCitpbXBvcnQgc3RkLmFsZ29yaXRobSA6IGZpbmQ7CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHksIGZyb250OworaW1wb3J0IHN0ZC5jb252IDogdG87CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgc3RkLnRyYWl0cyA6IEJhc2VUeXBlVHVwbGUsIGlzUG9pbnRlciwgaXNTb21lRnVuY3Rpb24sIFBvaW50ZXJUYXJnZXQsCisgIFJldHVyblR5cGU7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmNvZGVnZW47CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnV0aWwuaGFzaHNldDsKKworLyoKKyAqIFRocmlmdCBzdHJ1Y3Qvc2VydmljZSBtZXRhIGRhdGEsIHdoaWNoIGlzIHVzZWQgdG8gc3RvcmUgaW5mb3JtYXRpb24gZnJvbQorICogdGhlIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzIG5vdCByZXByZXNlbnRhYmxlIGluIHBsYWluIEQsIGkuZS4gZmllbGQKKyAqIHJlcXVpcmVtZW50IGxldmVscywgVGhyaWZ0IGZpZWxkIElEcywgZXRjLgorICovCisKKy8qKgorICogU3RydWN0IGZpZWxkIHJlcXVpcmVtZW50IGxldmVscy4KKyAqLworZW51bSBUUmVxIHsKKyAgLy8vIERldGVjdCB0aGUgcmVxdWlyZWRuZXNzIGZyb20gdGhlIGZpZWxkIHR5cGU6IGlmIGl0IGlzIG51bGxhYmxlLCB0cmVhdAorICAvLy8gdGhlIGZpZWxkIGFzIG9wdGlvbmFsLCBpZiBpdCBpcyBub24tbnVsbGFibGUsIHRyZWF0IHRoZSBmaWVsZCBhcworICAvLy8gcmVxdWlyZWQuIFRoaXMgaXMgdGhlIGRlZmF1bHQgdXNlZCBmb3IgaGFuZGxpbmcgc3RydWN0cyBub3QgZ2VuZXJhdGVkCisgIC8vLyBmcm9tIGFuIElETCBmaWxlLCBhbmQgbmV2ZXIgZW1pdHRlZCBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyLiBUUmVxLkFVVE8KKyAgLy8vIHNob3VsZG4ndCBiZSBzcGVjaWZpZWQgZXhwbGljaXRseS4KKyAgLy8gSW1wbGVtZW50YXRpb24gbm90ZTogdGhyaWZ0LmNvZGVnZW4gdGVtcGxhdGVzIHVzZQorICAvLyB0aHJpZnQuaW50ZXJuYWwuY29kZWdlbi5tZW1iZXJSZXEgdG8gcmVzb2x2ZSBBVVRPIHRvIFJFUVVJUkVEL09QVElPTkFMCisgIC8vIGluc3RlYWQgb2YgaGFuZGxpbmcgaXQgZGlyZWN0bHkuCisgIEFVVE8sCisKKyAgLy8vIFRoZSBmaWVsZCBpcyB0cmVhdGVkIGFzIG9wdGlvbmFsIHdoZW4gZGVzZXJpYWxpemluZy9yZWNlaXZpbmcgdGhlIHN0cnVjdAorICAvLy8gYW5kIGFzIHJlcXVpcmVkIHdoZW4gc2VyaWFsaXppbmcvc2VuZGluZy4gVGhpcyBpcyB0aGUgVGhyaWZ0IGRlZmF1bHQgaWYKKyAgLy8vIG5laXRoZXIgInJlcXVpcmVkIiBub3IgIm9wdGlvbmFsIiBhcmUgc3BlY2lmaWVkIGluIHRoZSBJREwgZmlsZS4KKyAgT1BUX0lOX1JFUV9PVVQsCisKKyAgLy8vIFRoZSBmaWVsZCBpcyBvcHRpb25hbC4KKyAgT1BUSU9OQUwsCisKKyAgLy8vIFRoZSBmaWVsZCBpcyByZXF1aXJlZC4KKyAgUkVRVUlSRUQsCisKKyAgLy8vIElnbm9yZSB0aGUgc3RydWN0IGZpZWxkIHdoZW4gc2VyaWFsaXppbmcvZGVzZXJpYWxpemluZy4KKyAgSUdOT1JFCit9CisKKy8qKgorICogVGhlIHdheSBob3cgbWV0aG9kcyBhcmUgY2FsbGVkLgorICovCitlbnVtIFRNZXRob2RUeXBlIHsKKyAgLy8vIENhbGxlZCBpbiB0aGUgbm9ybWFsIHR3by13YXkgc2NoZW1lIGNvbnNpc3Rpbmcgb2YgYSByZXF1ZXN0IGFuZCBhCisgIC8vLyByZXNwb25zZS4KKyAgUkVHVUxBUiwKKworICAvLy8gQSBmaXJlLWFuZC1mb3JnZXQgb25lLXdheSBtZXRob2QsIHdoZXJlIG5vIHJlc3BvbnNlIGlzIHNlbnQgYW5kIHRoZQorICAvLy8gY2xpZW50IGltbWVkaWF0ZWx5IHJldHVybnMuCisgIE9ORVdBWQorfQorCisvKioKKyAqIENvbXBpbGUtdGltZSBtZXRhZGF0YSBmb3IgYSBzdHJ1Y3QgZmllbGQuCisgKi8KK3N0cnVjdCBURmllbGRNZXRhIHsKKyAgLy8vIFRoZSBuYW1lIG9mIHRoZSBmaWVsZC4gVXNlZCBmb3IgbWF0Y2hpbmcgYSBURmllbGRNZXRhIHdpdGggdGhlIGFjdHVhbAorICAvLy8gRCBzdHJ1Y3QgbWVtYmVyIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCisgIHN0cmluZyBuYW1lOworCisgIC8vLyBUaGUgKFRocmlmdCkgaWQgb2YgdGhlIGZpZWxkLgorICBzaG9ydCBpZDsKKworICAvLy8gV2hldGhlciB0aGUgZmllbGQgaXMgcmVxdXJpZWQuCisgIFRSZXEgcmVxOworCisgIC8vLyBBIGNvZGUgc3RyaW5nIGNvbnRhaW5pbmcgYSBEIGV4cHJlc3Npb24gZm9yIHRoZSBkZWZhdWx0IHZhbHVlLCBpZiB0aGVyZQorICAvLy8gaXMgb25lLgorICBzdHJpbmcgZGVmYXVsdFZhbHVlOworfQorCisvKioKKyAqIENvbXBpbGUtdGltZSBtZXRhZGF0YSBmb3IgYSBzZXJ2aWNlIG1ldGhvZC4KKyAqLworc3RydWN0IFRNZXRob2RNZXRhIHsKKyAgLy8vIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QuIFVzZWQgZm9yIG1hdGNoaW5nIGEgVE1ldGhvZE1ldGEgd2l0aCB0aGUgYWN0dWFsCisgIC8vLyBtZXRob2QgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KKyAgc3RyaW5nIG5hbWU7CisKKyAgLy8vIE1ldGEgaW5mb3JtYXRpb24gZm9yIHRoZSBwYXJhbWV0ZXJlcy4KKyAgVFBhcmFtTWV0YVtdIHBhcmFtczsKKworICAvLy8gU3BlY2lmaWVzIHdoaWNoIGV4Y2VwdGlvbnMgY2FuIGJlIHRocm93biBieSB0aGUgbWV0aG9kLiBBbGwgb3RoZXIKKyAgLy8vIGV4Y2VwdGlvbnMgYXJlIGNvbnZlcnRlZCB0byBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBpbnN0ZWFkLgorICBURXhjZXB0aW9uTWV0YVtdIGV4Y2VwdGlvbnM7CisKKyAgLy8vIFRoZSBmdW5kYW1lbnRhbCB0eXBlIG9mIHRoZSBtZXRob2QuCisgIFRNZXRob2RUeXBlIHR5cGU7Cit9CisKKy8qKgorICogQ29tcGlsZS10aW1lIG1ldGFkYXRhIGZvciBhIHNlcnZpY2UgbWV0aG9kIHBhcmFtZXRlci4KKyAqLworc3RydWN0IFRQYXJhbU1ldGEgeworICAvLy8gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlci4gQ29udHJhcnkgdG8gVEZpZWxkTWV0YSwgaXQgb25seSBzZXJ2ZXMKKyAgLy8vIGRlY29yYXRpdmUgcHVycG9zZXMgaGVyZS4KKyAgc3RyaW5nIG5hbWU7CisKKyAgLy8vIFRoZSBUaHJpZnQgaWQgb2YgdGhlIHBhcmFtZXRlciBpbiB0aGUgcGFyYW0gc3RydWN0LgorICBzaG9ydCBpZDsKKworICAvLy8gQSBjb2RlIHN0cmluZyBjb250YWluaW5nIGEgRCBleHByZXNzaW9uIGZvciB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCisgIC8vLyBwYXJhbWV0ZXIsIGlmIGFueS4KKyAgc3RyaW5nIGRlZmF1bHRWYWx1ZTsKK30KKworLyoqCisgKiBDb21waWxlLXRpbWUgbWV0YWRhdGEgZm9yIGEgc2VydmljZSBtZXRob2QgZXhjZXB0aW9uIGFubm90YXRpb24uCisgKi8KK3N0cnVjdCBURXhjZXB0aW9uTWV0YSB7CisgIC8vLyBUaGUgbmFtZSBvZiB0aGUgZXhjZXB0aW9uIMK7cmV0dXJuIHZhbHVlwqsuIENvbnRyYXJ5IHRvIFRGaWVsZE1ldGEsIGl0CisgIC8vLyBvbmx5IHNlcnZlcyBkZWNvcmF0aXZlIHB1cnBvc2VzIGhlcmUsIGFzIGl0IGlzIG9ubHkgdXNlZCBpbiBjb2RlIG5vdAorICAvLy8gdmlzaWJsZSB0byBwcm9jZXNzb3IgaW1wbGVtZW50YXRpb25zL3NlcnZpY2UgY2xpZW50cy4KKyAgc3RyaW5nIG5hbWU7CisKKyAgLy8vIFRoZSBUaHJpZnQgaWQgb2YgdGhlIGV4Y2VwdGlvbiBmaWVsZCBpbiB0aGUgcmV0dXJuIHZhbHVlIHN0cnVjdC4KKyAgc2hvcnQgaWQ7CisKKyAgLy8vIFRoZSBuYW1lIG9mIHRoZSBleGNlcHRpb24gdHlwZS4KKyAgc3RyaW5nIHR5cGU7Cit9CisKKy8qKgorICogQSBwYWlyIG9mIHR3byBUUG9yb3RvY29scy4gVG8gYmUgdXNlZCBpbiBwbGFjZXMgd2hlcmUgYSBsaXN0IG9mIHByb3RvY29scworICogaXMgZXhwZWN0ZWQsIGZvciBzcGVjaWZ5aW5nIGRpZmZlcmVudCBwcm90b2NvbHMgZm9yIGlucHV0IGFuZCBvdXRwdXQuCisgKi8KK3N0cnVjdCBUUHJvdG9jb2xQYWlyKElucHV0UHJvdG9jb2wsIE91dHB1dFByb3RvY29sKSBpZiAoCisgIGlzVFByb3RvY29sIUlucHV0UHJvdG9jb2wgJiYgaXNUUHJvdG9jb2whT3V0cHV0UHJvdG9jb2wKKykge30KKworLyoqCisgKiB0cnVlIGlmIFQgaXMgYSBUUHJvdG9jb2xQYWlyLgorICovCit0ZW1wbGF0ZSBpc1RQcm90b2NvbFBhaXIoVCkgeworICBzdGF0aWMgaWYgKGlzKFQgXyA9PSBUUHJvdG9jb2xQYWlyIShJLCBPKSwgSSwgTykpIHsKKyAgICBlbnVtIGlzVFByb3RvY29sUGFpciA9IHRydWU7CisgIH0gZWxzZSB7CisgICAgZW51bSBpc1RQcm90b2NvbFBhaXIgPSBmYWxzZTsKKyAgfQorfQorCit1bml0dGVzdCB7CisgIHN0YXRpYyBhc3NlcnQoaXNUUHJvdG9jb2xQYWlyIShUUHJvdG9jb2xQYWlyIShUUHJvdG9jb2wsIFRQcm90b2NvbCkpKTsKKyAgc3RhdGljIGFzc2VydCghaXNUUHJvdG9jb2xQYWlyIVRQcm90b2NvbCk7Cit9CisKKy8qKgorICogdHJ1ZSBpZiBUIGlzIGEgVFByb3RvY29sIG9yIGEgVFByb3RvY29sUGFpci4KKyAqLwordGVtcGxhdGUgaXNUUHJvdG9jb2xPclBhaXIoVCkgeworICBlbnVtIGlzVFByb3RvY29sT3JQYWlyID0gaXNUUHJvdG9jb2whVCB8fCBpc1RQcm90b2NvbFBhaXIhVDsKK30KKwordW5pdHRlc3QgeworICBzdGF0aWMgYXNzZXJ0KGlzVFByb3RvY29sT3JQYWlyIVRQcm90b2NvbCk7CisgIHN0YXRpYyBhc3NlcnQoaXNUUHJvdG9jb2xPclBhaXIhKFRQcm90b2NvbFBhaXIhKFRQcm90b2NvbCwgVFByb3RvY29sKSkpOworICBzdGF0aWMgYXNzZXJ0KCFpc1RQcm90b2NvbE9yUGFpciF2b2lkKTsKK30KKworLyoqCisgKiB0cnVlIGlmIFQgcmVwcmVzZW50cyBhIFRocmlmdCBzZXJ2aWNlLgorICovCit0ZW1wbGF0ZSBpc1NlcnZpY2UoVCkgeworICBlbnVtIGlzU2VydmljZSA9IGlzQmFzZVNlcnZpY2UhVCB8fCBpc0Rlcml2ZWRTZXJ2aWNlIVQ7Cit9CisKKy8qKgorICogdHJ1ZSBpZiBUIHJlcHJlc2VudHMgYSBUaHJpZnQgc2VydmljZSBub3QgZGVyaXZlZCBmcm9tIGFub3RoZXIgc2VydmljZS4KKyAqLwordGVtcGxhdGUgaXNCYXNlU2VydmljZShUKSB7CisgIHN0YXRpYyBpZihpcyhUIF8gPT0gaW50ZXJmYWNlKSAmJgorICAgICghaXMoVCBUQmFzZXMgPT0gc3VwZXIpIHx8IFRCYXNlcy5sZW5ndGggPT0gMCkKKyAgKSB7CisgICAgZW51bSBpc0Jhc2VTZXJ2aWNlID0gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBlbnVtIGlzQmFzZVNlcnZpY2UgPSBmYWxzZTsKKyAgfQorfQorCisvKioKKyAqIHRydWUgaWYgVCByZXByZXNlbnRzIGEgVGhyaWZ0IHNlcnZpY2UgZGVyaXZlZCBmcm9tIGFub3RoZXIgc2VydmljZS4KKyAqLwordGVtcGxhdGUgaXNEZXJpdmVkU2VydmljZShUKSB7CisgIHN0YXRpYyBpZihpcyhUIF8gPT0gaW50ZXJmYWNlKSAmJgorICAgIGlzKFQgVEJhc2VzID09IHN1cGVyKSAmJiBUQmFzZXMubGVuZ3RoID09IDEKKyAgKSB7CisgICAgZW51bSBpc0Rlcml2ZWRTZXJ2aWNlID0gaXNTZXJ2aWNlIShUQmFzZXNbMF0pOworICB9IGVsc2UgeworICAgIGVudW0gaXNEZXJpdmVkU2VydmljZSA9IGZhbHNlOworICB9Cit9CisKKy8qKgorICogRm9yIGRlcml2ZWQgc2VydmljZXMsIGdldHMgdGhlIGJhc2Ugc2VydmljZSBpbnRlcmZhY2UuCisgKi8KK3RlbXBsYXRlIEJhc2VTZXJ2aWNlKFQpIGlmIChpc0Rlcml2ZWRTZXJ2aWNlIVQpIHsKKyAgYWxpYXMgQmFzZVR5cGVUdXBsZSFUWzBdIEJhc2VTZXJ2aWNlOworfQorCisKKy8qCisgKiBDb2RlIGdlbmVyYXRpb24gdGVtcGxhdGVzLgorICovCisKKy8qKgorICogTWl4aW4gdGVtcGxhdGUgZGVmaW5pbmcgYWRkaXRpb25hbCBoZWxwZXIgbWV0aG9kcyBmb3IgdXNpbmcgYSBzdHJ1Y3Qgd2l0aAorICogVGhyaWZ0LCBhbmQgYSBtZW1iZXIgY2FsbGVkIGlzU2V0RmxhZ3MgaWYgdGhlIHN0cnVjdCBjb250YWlucyBhbnkgZmllbGRzCisgKiBmb3Igd2hpY2ggYW4gwrtpcyBzZXTCqyBmbGFnIGlzIG5lZWRlZC4KKyAqCisgKiBJdCBjYW4gb25seSBiZSB1c2VkIGluc2lkZSBzdHJ1Y3RzIG9yIEV4Y2VwdGlvbiBjbGFzc2VzLgorICoKKyAqIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIHN0cnVjdCBkZWZpbml0aW9uOgorICogLS0tCisgKiBzdHJ1Y3QgRm9vIHsKKyAqICAgc3RyaW5nIGE7CisgKiAgIGludCBiOworICogICBpbnQgYzsKKyAqCisgKiAgIG1peGluIFRTdHJ1Y3RIZWxwZXJzIShbCisgKiAgICAgVEZpZWxkTWV0YSgiYSIsIDEpLCAvLyBJbXBsaWNpdGx5IG9wdGlvbmFsIChudWxsYWJsZSkuCisgKiAgICAgVEZpZWxkTWV0YSgiYiIsIDIpLCAvLyBJbXBsaWNpdGx5IHJlcXVpcmVkIChub24tbnVsbGFibGUpLgorICogICAgIFRGaWVsZE1ldGEoImMiLCAzLCBUUmVxLlJFUVVJUkVELCAiNCIpCisgKiAgIF0pOworICogfQorICogLS0tCisgKgorICogVFN0cnVjdEhlbHBlciBhZGRzIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyB0byB0aGUgc3RydWN0OgorICogLS0tCisgKiAvKysKKyAqICArIFNldHMgbWVtYmVyIGZpZWxkTmFtZSB0byB0aGUgZ2l2ZW4gdmFsdWUgYW5kIG1hcmtzIGl0IGFzIHNldC4KKyAqICArCisgKiAgKyBFeGFtcGxlczoKKyAqICArIC0tLQorICogICsgYXV0byBmID0gRm9vKCk7CisgKiAgKyBmLnNldCEiYiIoMTIzNDUpOworICogICsgYXNzZXJ0KGYuaXNTZXQhImIiKTsKKyAqICArIC0tLQorICogICsvCisgKiB2b2lkIHNldChzdHJpbmcgZmllbGROYW1lKShNZW1iZXJUeXBlIShUaGlzLCBmaWVsZE5hbWUpIHZhbHVlKTsKKyAqCisgKiAvKysKKyAqICArIFJlc2V0cyBtZW1iZXIgZmllbGROYW1lIHRvIHRoZSBpbml0IHByb3BlcnR5IG9mIGl0cyB0eXBlIGFuZCBtYXJrcyBpdCBhcworICogICsgbm90IHNldC4KKyAqICArCisgKiAgKyBFeGFtcGxlczoKKyAqICArIC0tLQorICogICsgLy8gU2V0IGYuYiB0byBzb21lIHZhbHVlLgorICogICsgYXV0byBmID0gRm9vKCk7CisgKiAgKyBmLnNldCEiYiIoMTIzNDUpOworICogICsKKyAqICArIGYudW5zZXQhYigpOworICogICsKKyAqICArIC8vIGYuYiBpcyBub3cgdW5zZXQgYWdhaW4uCisgKiAgKyBhc3NlcnQoIWYuaXNTZXQhImIiKTsKKyAqICArIC0tLQorICogICsvCisgKiB2b2lkIHVuc2V0KHN0cmluZyBmaWVsZE5hbWUpKCk7CisgKgorICogLysrCisgKiAgKyBSZXR1cm5zIHdoZXRoZXIgbWVtYmVyIGZpZWxkTmFtZSBpcyBzZXQuCisgKiAgKworICogICsgRXhhbXBsZXM6CisgKiAgKyAtLS0KKyAqICArIGF1dG8gZiA9IEZvbygpOworICogICsgYXNzZXJ0KCFmLmlzU2V0ISJiIik7CisgKiAgKyBmLnNldCEiYiIoMTIzNDUpOworICogICsgYXNzZXJ0KGYuaXNTZXQhImIiKTsKKyAqICArIC0tLQorICogICsvCisgKiBib29sIGlzU2V0KHN0cmluZyBmaWVsZE5hbWUpKCkgY29uc3QgQHByb3BlcnR5OworICoKKyAqIC8rKworICogICsgUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RydWN0LgorICogICsKKyAqICArIEV4YW1wbGVzOgorICogICsgLS0tCisgKiAgKyBhdXRvIGYgPSBGb28oKTsKKyAqICArIGYuYSA9ICJhIHN0cmluZyI7CisgKiAgKyBhc3NlcnQoZi50b1N0cmluZygpID09IGBGb28oImEgc3RyaW5nIiwgMCAodW5zZXQpLCA0KWApOworICogICsgLS0tCisgKiAgKy8KKyAqIHN0cmluZyB0b1N0cmluZygpIGNvbnN0OworICoKKyAqIC8rKworICogICsgRGVzZXJpYWxpemVzIHRoZSBzdHJ1Y3QsIHNldHRpbmcgaXRzIG1lbWJlcnMgdG8gdGhlIHZhbHVlcyByZWFkIGZyb20gdGhlCisgKiAgKyBwcm90b2NvbC4gRm9yd2FyZHMgdG8gcmVhZFN0cnVjdCh0aGlzLCBwcm90byk7CisgKiAgKy8KKyAqIHZvaWQgcmVhZChQcm90b2NvbCkoUHJvdG9jb2wgcHJvdG8pIGlmIChpc1RQcm90b2NvbCFQcm90b2NvbCk7CisgKgorICogLysrCisgKiAgKyBTZXJpYWxpemVzIHRoZSBzdHJ1Y3QgdG8gdGhlIHRhcmdldCBwcm90b2NvbC4gRm9yd2FyZHMgdG8KKyAqICArIHdyaXRlU3RydWN0KHRoaXMsIHByb3RvKTsKKyAqICArLworICogdm9pZCB3cml0ZShQcm90b2NvbCkoUHJvdG9jb2wgcHJvdG8pIGNvbnN0IGlmIChpc1RQcm90b2NvbCFQcm90b2NvbCk7CisgKiAtLS0KKyAqCisgKiBBZGRpdGlvbmFsbHksIGFuIG9wRXF1YWxzKCkgaW1wbGVtZW50YXRpb24gaXMgcHJvdmlkZWQgd2hpY2ggc2ltcGx5CisgKiBjb21wYXJlcyBhbGwgZmllbGRzLCBidXQgZGlzcmVnYXJkcyB0aGUgaXMgc2V0IHN0cnVjdCwgaWYgYW55ICh0aGUgZXhhY3QKKyAqIHNpZ25hdHVyZSBvYnZpb3VzbHkgZGlmZmVycyBiZXR3ZWVuIHN0cnVjdHMgYW5kIGV4Y2VwdGlvbiBjbGFzc2VzKS4gVGhlCisgKiBtZXRhZGF0YSBpcyBzdG9yZWQgaW4gYSBtYW5pZmVzdCBjb25zdGFudCBjYWxsZWQgZmllbGRNZXRhLgorICoKKyAqIE5vdGU6IFRvIHNldCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIGZpZWxkcyB3aGVyZSBvbmUgaGFzIGJlZW4gc3BlY2lmaWVkIGluCisgKiB0aGUgZmllbGQgbWV0YWRhdGEsIGEgcGFyYW1ldGVybGVzcyBzdGF0aWMgb3BDYWxsIGlzIGdlbmVyYXRlZCwgYmVjYXVzZSBECisgKiBkb2VzIG5vdCBhbGxvdyBwYXJhbWV0ZXJsZXNzIChkZWZhdWx0KSBjb25zdHJ1Y3RvcnMgZm9yIHN0cnVjdHMuIFRodXMsIGJlCisgKiBhbHdheXMgdG8gdXNlIHRvIGluaXRpYWxpemUgc3RydWN0czoKKyAqIC0tLQorICogRm9vIGZvbzsgLy8gV3JvbmchCisgKiBhdXRvIGZvbyA9IEZvbygpOyAvLyBDb3JyZWN0LgorICogLS0tCisgKi8KK21peGluIHRlbXBsYXRlIFRTdHJ1Y3RIZWxwZXJzKGFsaWFzIGZpZWxkTWV0YURhdGEgPSBjYXN0KFRGaWVsZE1ldGFbXSludWxsKSBpZiAoCisgIGlzKHR5cGVvZihmaWVsZE1ldGFEYXRhKSA6IFRGaWVsZE1ldGFbXSkKKykgeworICBpbXBvcnQgc3RkLmFsZ29yaXRobSA6IGFueTsKKyAgaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmJhc2U7CisgIGltcG9ydCB0aHJpZnQuaW50ZXJuYWwuY29kZWdlbiA6IGlzTnVsbGFibGUsIE1lbWJlclR5cGUsIG1lcmdlRmllbGRNZXRhLAorICAgIEZpZWxkTmFtZXM7CisgIGltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZSA6IFRQcm90b2NvbCwgaXNUUHJvdG9jb2w7CisKKyAgYWxpYXMgdHlwZW9mKHRoaXMpIFRoaXM7CisgIHN0YXRpYyBhc3NlcnQoaXMoVGhpcyA9PSBzdHJ1Y3QpIHx8IGlzKFRoaXMgOiBFeGNlcHRpb24pLAorICAgICJUU3RydWN0SGVscGVycyBjYW4gb25seSBiZSB1c2VkIGluc2lkZSBhIHN0cnVjdCBvciBhbiBFeGNlcHRpb24gY2xhc3MuIik7CisKKyAgc3RhdGljIGlmIChUSXNTZXRGbGFncyEoVGhpcywgZmllbGRNZXRhRGF0YSkudHVwbGVvZi5sZW5ndGggPiAwKSB7CisgICAgLy8gSWYgd2UgbmVlZCB0byBrZWVwIGlzU2V0IGZsYWdzIGFyb3VuZCwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZQorICAgIC8vIGNvbnRhaW5lciBzdHJ1Y3QuCisgICAgVElzU2V0RmxhZ3MhKFRoaXMsIGZpZWxkTWV0YURhdGEpIGlzU2V0RmxhZ3M7CisgICAgZW51bSBmaWVsZE1ldGEgPSBmaWVsZE1ldGFEYXRhIH4gW1RGaWVsZE1ldGEoImlzU2V0RmxhZ3MiLCAwLCBUUmVxLklHTk9SRSldOworICB9IGVsc2UgeworICAgIGVudW0gZmllbGRNZXRhID0gZmllbGRNZXRhRGF0YTsKKyAgfQorCisgIHZvaWQgc2V0KHN0cmluZyBmaWVsZE5hbWUpKE1lbWJlclR5cGUhKFRoaXMsIGZpZWxkTmFtZSkgdmFsdWUpIGlmICgKKyAgICBpcyhNZW1iZXJUeXBlIShUaGlzLCBmaWVsZE5hbWUpKQorICApIHsKKyAgICBfX3RyYWl0cyhnZXRNZW1iZXIsIHRoaXMsIGZpZWxkTmFtZSkgPSB2YWx1ZTsKKyAgICBzdGF0aWMgaWYgKGlzKHR5cGVvZihtaXhpbigidGhpcy5pc1NldEZsYWdzLiIgfiBmaWVsZE5hbWUpKSA6IGJvb2wpKSB7CisgICAgICBfX3RyYWl0cyhnZXRNZW1iZXIsIHRoaXMuaXNTZXRGbGFncywgZmllbGROYW1lKSA9IHRydWU7CisgICAgfQorICB9CisKKyAgdm9pZCB1bnNldChzdHJpbmcgZmllbGROYW1lKSgpIGlmIChpcyhNZW1iZXJUeXBlIShUaGlzLCBmaWVsZE5hbWUpKSkgeworICAgIHN0YXRpYyBpZiAoaXModHlwZW9mKG1peGluKCJ0aGlzLmlzU2V0RmxhZ3MuIiB+IGZpZWxkTmFtZSkpIDogYm9vbCkpIHsKKyAgICAgIF9fdHJhaXRzKGdldE1lbWJlciwgdGhpcy5pc1NldEZsYWdzLCBmaWVsZE5hbWUpID0gZmFsc2U7CisgICAgfQorICAgIF9fdHJhaXRzKGdldE1lbWJlciwgdGhpcywgZmllbGROYW1lKSA9IE1lbWJlclR5cGUhKFRoaXMsIGZpZWxkTmFtZSkuaW5pdDsKKyAgfQorCisgIGJvb2wgaXNTZXQoc3RyaW5nIGZpZWxkTmFtZSkoKSBjb25zdCBAcHJvcGVydHkgaWYgKAorICAgIGlzKE1lbWJlclR5cGUhKFRoaXMsIGZpZWxkTmFtZSkpCisgICkgeworICAgIHN0YXRpYyBpZiAoaXNOdWxsYWJsZSEoTWVtYmVyVHlwZSEoVGhpcywgZmllbGROYW1lKSkpIHsKKyAgICAgIHJldHVybiBfX3RyYWl0cyhnZXRNZW1iZXIsIHRoaXMsIGZpZWxkTmFtZSkgIWlzIG51bGw7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXModHlwZW9mKG1peGluKCJ0aGlzLmlzU2V0RmxhZ3MuIiB+IGZpZWxkTmFtZSkpIDogYm9vbCkpIHsKKyAgICAgIHJldHVybiBfX3RyYWl0cyhnZXRNZW1iZXIsIHRoaXMuaXNTZXRGbGFncywgZmllbGROYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVGhpcyBpcyBhIHJlcXVpcmVkIGZpZWxkLCB3aGljaCBpcyBhbHdheXMgc2V0LgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgc3RhdGljIGlmIChpcyhUaGlzIF8gPT0gY2xhc3MpKSB7CisgICAgb3ZlcnJpZGUgc3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgcmV0dXJuIHRocmlmdFRvU3RyaW5nSW1wbCgpOworICAgIH0KKworICAgIG92ZXJyaWRlIGJvb2wgb3BFcXVhbHMoT2JqZWN0IG90aGVyKSBjb25zdCB7CisgICAgICBhdXRvIHJocyA9IGNhc3QoVGhpcylvdGhlcjsKKyAgICAgIGlmIChyaHMpIHsKKyAgICAgICAgcmV0dXJuIHRocmlmdE9wRXF1YWxzSW1wbChyaHMpOworICAgICAgfQorCisgICAgICByZXR1cm4gKGNhc3QoKXN1cGVyKS5vcEVxdWFscyhvdGhlcik7CisgICAgfQorCisgICAgb3ZlcnJpZGUgc2l6ZV90IHRvSGFzaCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiB0aHJpZnRUb0hhc2hJbXBsKCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgIHJldHVybiB0aHJpZnRUb1N0cmluZ0ltcGwoKTsKKyAgICB9CisKKyAgICBib29sIG9wRXF1YWxzKHJlZiBjb25zdCBUaGlzIG90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gdGhyaWZ0T3BFcXVhbHNJbXBsKG90aGVyKTsKKyAgICB9CisKKyAgICBzaXplX3QgdG9IYXNoKCkgY29uc3QgQHNhZmUgbm90aHJvdyB7CisgICAgICByZXR1cm4gdGhyaWZ0VG9IYXNoSW1wbCgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RyaW5nIHRocmlmdFRvU3RyaW5nSW1wbCgpIGNvbnN0IHsKKyAgICBpbXBvcnQgc3RkLmNvbnYgOiB0bzsKKyAgICBzdHJpbmcgcmVzdWx0ID0gVGhpcy5zdHJpbmdvZiB+ICIoIjsKKyAgICBtaXhpbih7CisgICAgICBzdHJpbmcgY29kZSA9ICIiOworICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICBmb3JlYWNoIChuYW1lOyBGaWVsZE5hbWVzIShUaGlzLCBmaWVsZE1ldGEpKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29kZSB+PSAicmVzdWx0IH49IGAsIGA7XG4iOworICAgICAgICB9CisgICAgICAgIGNvZGUgfj0gInJlc3VsdCB+PSBgIiB+IG5hbWUgfiAiOiBgIH4gdG8hc3RyaW5nKGNhc3QoKXRoaXMuIiB+IG5hbWUgfiAiKTtcbiI7CisgICAgICAgIGNvZGUgfj0gImlmICghaXNTZXQhcXsiIH4gbmFtZSB+ICJ9KSB7XG4iOworICAgICAgICBjb2RlIH49ICJyZXN1bHQgfj0gYCAodW5zZXQpYDtcbiI7CisgICAgICAgIGNvZGUgfj0gIn1cbiI7CisgICAgICB9CisgICAgICByZXR1cm4gY29kZTsKKyAgICB9KCkpOworICAgIHJlc3VsdCB+PSAiKSI7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgYm9vbCB0aHJpZnRPcEVxdWFsc0ltcGwoY29uc3QgcmVmIFRoaXMgcmhzKSBjb25zdCB7CisgICAgZm9yZWFjaCAobmFtZTsgRmllbGROYW1lcyFUaGlzKSB7CisgICAgICBpZiAobWl4aW4oInRoaXMuIiB+IG5hbWUpICE9IG1peGluKCJyaHMuIiB+IG5hbWUpKSByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcHJpdmF0ZSBzaXplX3QgdGhyaWZ0VG9IYXNoSW1wbCgpIGNvbnN0IEB0cnVzdGVkIG5vdGhyb3cgeworICAgIHNpemVfdCBoYXNoID0gMDsKKyAgICBmb3JlYWNoIChpLCBfOyB0aGlzLnR1cGxlb2YpIHsKKyAgICAgIGF1dG8gdmFsID0gdGhpcy50dXBsZW9mW2ldOworICAgICAgaGFzaCArPSB0eXBlaWQodmFsKS5nZXRIYXNoKCZ2YWwpOworICAgIH0KKyAgICByZXR1cm4gaGFzaDsKKyAgfQorCisgIHN0YXRpYyBpZiAoYW55IWAhYS5kZWZhdWx0VmFsdWUuZW1wdHlgKG1lcmdlRmllbGRNZXRhIShUaGlzLCBmaWVsZE1ldGFEYXRhKSkpIHsKKyAgICBzdGF0aWMgaWYgKGlzKFRoaXMgXyA9PSBjbGFzcykpIHsKKyAgICAgIHRoaXMoKSB7CisgICAgICAgIG1peGluKHRocmlmdEZpZWxkSW5pdENvZGUhKG1lcmdlRmllbGRNZXRhIShUaGlzLCBmaWVsZE1ldGFEYXRhKSkoInRoaXMiKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIERNRCBAQEJVR0BAOiBIYXZlIHRvIHVzZSBhdXRvIGhlcmUgdG8gYXZvaWQgwrtubyBzaXplIHlldCBmb3IgZm9yd2FyZAorICAgICAgLy8gcmVmZXJlbmNlwqsgZXJyb3JzLgorICAgICAgc3RhdGljIGF1dG8gb3BDYWxsKCkgeworICAgICAgICBhdXRvIHJlc3VsdCA9IFRoaXMuaW5pdDsKKyAgICAgICAgbWl4aW4odGhyaWZ0RmllbGRJbml0Q29kZSEobWVyZ2VGaWVsZE1ldGEhKFRoaXMsIGZpZWxkTWV0YURhdGEpKSgicmVzdWx0IikpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAgIH0KKyAgfQorCisgIHZvaWQgcmVhZChQcm90b2NvbCkoUHJvdG9jb2wgcHJvdG8pIGlmIChpc1RQcm90b2NvbCFQcm90b2NvbCkgeworICAgIC8vIE5lZWQgdG8gZXhwbGljaXRseSBzcGVjaWZ5IGZpZWxkTWV0YURhdGEgaGVyZSwgc2luY2UgaXQgaXNuJ3QgYWxyZWFkeQorICAgIC8vIHBpY2tlZCB1cCBpbiBzb21lIHNpdHVhdGlvbnMgKGUuZy4gdGhlIFRBcmdzIHN0cnVjdCBmb3IgbWV0aG9kcyB3aXRoCisgICAgLy8gbXVsdGlwbGUgcGFyYW1ldGVycyBpbiBhc3luY190ZXN0X3NlcnZlcnMpIG90aGVyd2lzZS4gRHVlIHRvIGEgRE1ECisgICAgLy8gQEBCVUdAQCwgd2UgbmVlZCB0byBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIG90aGVyIHRlbXBsYXRlIHBhcmFtZXRlcnMKKyAgICAvLyBhcyB3ZWxsLgorICAgIHJlYWRTdHJ1Y3QhKFRoaXMsIFByb3RvY29sLCBmaWVsZE1ldGFEYXRhLCBmYWxzZSkodGhpcywgcHJvdG8pOworICB9CisKKyAgdm9pZCB3cml0ZShQcm90b2NvbCkoUHJvdG9jb2wgcHJvdG8pIGNvbnN0IGlmIChpc1RQcm90b2NvbCFQcm90b2NvbCkgeworICAgIHdyaXRlU3RydWN0IShUaGlzLCBQcm90b2NvbCwgZmllbGRNZXRhRGF0YSwgZmFsc2UpKHRoaXMsIHByb3RvKTsKKyAgfQorfQorCisvLyBETUQgQEBCVUdAQDogSGF2aW5nIHRoaXMgaW5zaWRlIFRTdHJ1Y3RIZWxwZXJzIGxlYWRzIHRvIHdlaXJkIGxvb2t1cCBlcnJvcnMKKy8vIChlLmcuIGZvciBzdGQuYXJyeS5lbXB0eSkuCitzdHJpbmcgdGhyaWZ0RmllbGRJbml0Q29kZShhbGlhcyBmaWVsZE1ldGEpKHN0cmluZyB0aGlzTmFtZSkgeworICBzdHJpbmcgY29kZSA9ICIiOworICBmb3JlYWNoIChmaWVsZDsgZmllbGRNZXRhKSB7CisgICAgaWYgKGZpZWxkLmRlZmF1bHRWYWx1ZS5lbXB0eSkgY29udGludWU7CisgICAgY29kZSB+PSB0aGlzTmFtZSB+ICIuIiB+IGZpZWxkLm5hbWUgfiAiID0gIiB+IGZpZWxkLmRlZmF1bHRWYWx1ZSB+ICI7XG4iOworICB9CisgIHJldHVybiBjb2RlOworfQorCit1bml0dGVzdCB7CisgIC8vIENhbm5vdCBtYWtlIHRoaXMgbmVzdGVkIGluIHRoZSB1bml0dGVzdCBibG9jayBkdWUgdG8gYSDCu25vIHNpemUgeWV0IGZvcgorICAvLyBmb3J3YXJkIHJlZmVyZW5jZcKrIGVycm9yLgorICBzdGF0aWMgc3RydWN0IEZvbyB7CisgICAgc3RyaW5nIGE7CisgICAgaW50IGI7CisgICAgaW50IGM7CisKKyAgICBtaXhpbiBUU3RydWN0SGVscGVycyEoWworICAgICAgVEZpZWxkTWV0YSgiYSIsIDEpLAorICAgICAgVEZpZWxkTWV0YSgiYiIsIDIsIFRSZXEuT1BUX0lOX1JFUV9PVVQpLAorICAgICAgVEZpZWxkTWV0YSgiYyIsIDMsIFRSZXEuUkVRVUlSRUQsICI0IikKKyAgICBdKTsKKyAgfQorCisgIGF1dG8gZiA9IEZvbygpOworCisgIGYuc2V0ISJiIigxMjM0NSk7CisgIGFzc2VydChmLmlzU2V0ISJiIik7CisgIGYudW5zZXQhImIiKCk7CisgIGFzc2VydCghZi5pc1NldCEiYiIpOworICBmLnNldCEiYiIoMTIzNDUpOworICBhc3NlcnQoZi5pc1NldCEiYiIpOworICBmLnVuc2V0ISJiIigpOworCisgIGYuYSA9ICJhIHN0cmluZyI7CisgIGFzc2VydChmLnRvU3RyaW5nKCkgPT0gYEZvbyhhOiBhIHN0cmluZywgYjogMCAodW5zZXQpLCBjOiA0KWApOworfQorCisKKy8qKgorICogR2VuZXJhdGVzIGFuIGVwb255bW91cyBzdHJ1Y3Qgd2l0aCBib29sZWFuIGZsYWdzIGZvciB0aGUgbm9uLXJlcXVpcmVkCisgKiBub24tbnVsbGFibGUgZmllbGRzIG9mIFQuCisgKgorICogTnVsbGFibGUgZmllbGRzIGFyZSBqdXN0IHNldCB0byBudWxsIHRvIHNpZ25hbCDCu25vdCBzZXTCqywgc28gbm8gZmxhZyBpcworICogZW1pdHRlZCBmb3IgdGhlbSwgZXZlbiBpZiB0aGV5IGFyZSBvcHRpb25hbC4KKyAqCisgKiBJbiBtb3N0IGNhc2VzLCB5b3UgZG8gbm90IHdhbnQgdG8gdXNlIHRoaXMgZGlyZWN0bHksIGJ1dCB2aWEgVFN0cnVjdEhlbHBlcnMKKyAqIGluc3RlYWQuCisgKi8KK3RlbXBsYXRlIFRJc1NldEZsYWdzKFQsIGFsaWFzIGZpZWxkTWV0YURhdGEpIHsKKyAgbWl4aW4oeworICAgIHN0cmluZyBjb2RlID0gInN0cnVjdCBUSXNTZXRGbGFncyB7XG4iOworICAgIGZvcmVhY2ggKG1ldGE7IGZpZWxkTWV0YURhdGEpIHsKKyAgICAgIGNvZGUgfj0gInN0YXRpYyBpZiAoIWlzKE1lbWJlclR5cGUhKFQsIGAiIH4gbWV0YS5uYW1lIH4gImApKSkge1xuIjsKKyAgICAgIGNvZGUgfj0gcXsKKyAgICAgICAgc3RhdGljIGFzc2VydChmYWxzZSwgIkZpZWxkICciIH4gbWV0YS5uYW1lIH4KKyAgICAgICAgICAiJyByZWZlcmVuY2VkIGluIG1ldGFkYXRhIG5vdCBwcmVzZW50IGluIHN0cnVjdCAnIiB+IFQuc3RyaW5nb2YgfiAiJy4iKTsKKyAgICAgIH07CisgICAgICBjb2RlIH49ICJ9IjsKKyAgICAgIGlmIChtZXRhLnJlcSA9PSBUUmVxLk9QVElPTkFMIHx8IG1ldGEucmVxID09IFRSZXEuT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgICAgY29kZSB+PSAiZWxzZSBzdGF0aWMgaWYgKCFpc051bGxhYmxlIShNZW1iZXJUeXBlIShULCBgIiB+IG1ldGEubmFtZSB+ICJgKSkpIHtcbiI7CisgICAgICAgIGNvZGUgfj0gIiAgYm9vbCAiIH4gbWV0YS5uYW1lIH4gIjtcbiI7CisgICAgICAgIGNvZGUgfj0gIn1cbiI7CisgICAgICB9CisgICAgfQorICAgIGNvZGUgfj0gIn0iOworICAgIHJldHVybiBjb2RlOworICB9KCkpOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIFRocmlmdCBzdHJ1Y3QgZnJvbSBhIHByb3RvY29sLgorICoKKyAqIFVzaW5nIHRoZSBQcm90b2NvbCB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIHRoZSBjb25jcmV0ZSBUUHJvdG9jb2wgdG8gdXNlIGNhbiBiZQorICogYmUgc3BlY2lmaWVkLiBJZiB0aGUgcG9pbnRlclN0cnVjdCBwYXJhbWV0ZXIgaXMgc2V0IHRvIHRydWUsIHRoZSBzdHJ1Y3QKKyAqIGZpZWxkcyBhcmUgZXhwZWN0ZWQgdG8gYmUgcG9pbnRlcnMgdG8gdGhlIGFjdHVhbCBkYXRhLiBUaGlzIGlzIHVzZWQKKyAqIGludGVybmFsbHkgKGNvbWJpbmVkIHdpdGggVFBSZXN1bHRTdHJ1Y3QpIGFuZCB1c3VhbGx5IHNob3VsZCBub3QgYmUgdXNlZCBpbgorICogdXNlciBjb2RlLgorICoKKyAqIFRoaXMgaXMgYSBmcmVlIGZ1bmN0aW9uIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gcmVhZCBleGlzaXRpbmcgc3RydWN0cyBmcm9tCisgKiB0aGUgd2lyZSB3aXRob3V0IGFsdGVyaW5nIHRoZWlyIGRlZmluaXRpb25zLgorICovCit2b2lkIHJlYWRTdHJ1Y3QoVCwgUHJvdG9jb2wsIGFsaWFzIGZpZWxkTWV0YURhdGEgPSBjYXN0KFRGaWVsZE1ldGFbXSludWxsLAorICBib29sIHBvaW50ZXJTdHJ1Y3QgPSBmYWxzZSkoYXV0byByZWYgVCBzLCBQcm90b2NvbCBwKSBpZiAoaXNUUHJvdG9jb2whUHJvdG9jb2wpCit7CisgIG1peGluKHsKKyAgICBzdHJpbmcgY29kZTsKKworICAgIC8vIENoZWNrIHRoYXQgYWxsIGZpZWxkcyBmb3Igd2hpY2ggdGhlcmUgaXMgbWV0YSBpbmZvIGFyZSBhY3R1YWxseSBpbiB0aGUKKyAgICAvLyBwYXNzZWQgc3RydWN0IHR5cGUuCisgICAgZm9yZWFjaCAoZmllbGQ7IG1lcmdlRmllbGRNZXRhIShULCBmaWVsZE1ldGFEYXRhKSkgeworICAgICAgY29kZSB+PSAic3RhdGljIGFzc2VydChpcyhNZW1iZXJUeXBlIShULCBgIiB+IGZpZWxkLm5hbWUgfiAiYCkpKTtcbiI7CisgICAgfQorCisgICAgLy8gUmV0dXJucyB0aGUgY29kZSBzdHJpbmcgZm9yIHJlYWRpbmcgYSB2YWx1ZSBvZiB0eXBlIEYgb2ZmIHRoZSB3aXJlIGFuZAorICAgIC8vIGFzc2lnbmluZyBpdCB0byB2LiBUaGUgbGV2ZWwgcGFyYW1ldGVyIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlcmUKKyAgICAvLyBhcmUgbm8gY29uZmxpY3RpbmcgdmFyaWFibGUgbmFtZXMgb24gcmVjdXJzaXZlIGNhbGxzLgorICAgIHN0cmluZyByZWFkVmFsdWVDb2RlKFZhbHVlVHlwZSkoc3RyaW5nIHYsIHNpemVfdCBsZXZlbCA9IDApIHsKKyAgICAgIC8vIFNvbWUgbm9uLWFtYmlnb3VzIG5hbWVzIHRvIHVzZSAoc2hhZG93aW5nIGlzIG5vdCBhbGxvd2VkIGluIEQpLgorICAgICAgaW1tdXRhYmxlIGkgPSAiaSIgfiB0byFzdHJpbmcobGV2ZWwpOworICAgICAgaW1tdXRhYmxlIGVsZW0gPSAiZWxlbSIgfiB0byFzdHJpbmcobGV2ZWwpOworICAgICAgaW1tdXRhYmxlIGtleSA9ICJrZXkiIH4gdG8hc3RyaW5nKGxldmVsKTsKKyAgICAgIGltbXV0YWJsZSBsaXN0ID0gImxpc3QiIH4gdG8hc3RyaW5nKGxldmVsKTsKKyAgICAgIGltbXV0YWJsZSBtYXAgPSAibWFwIiB+IHRvIXN0cmluZyhsZXZlbCk7CisgICAgICBpbW11dGFibGUgc2V0ID0gInNldCIgfiB0byFzdHJpbmcobGV2ZWwpOworICAgICAgaW1tdXRhYmxlIHZhbHVlID0gInZhbHVlIiB+IHRvIXN0cmluZyhsZXZlbCk7CisKKyAgICAgIGFsaWFzIEZ1bGx5VW5xdWFsIVZhbHVlVHlwZSBGOworCisgICAgICBzdGF0aWMgaWYgKGlzKEYgPT0gYm9vbCkpIHsKKyAgICAgICAgcmV0dXJuIHYgfiAiID0gcC5yZWFkQm9vbCgpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGID09IGJ5dGUpKSB7CisgICAgICAgIHJldHVybiB2IH4gIiA9IHAucmVhZEJ5dGUoKTsiOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiA9PSBkb3VibGUpKSB7CisgICAgICAgIHJldHVybiB2IH4gIiA9IHAucmVhZERvdWJsZSgpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGID09IHNob3J0KSkgeworICAgICAgICByZXR1cm4gdiB+ICIgPSBwLnJlYWRJMTYoKTsiOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiA9PSBpbnQpKSB7CisgICAgICAgIHJldHVybiB2IH4gIiA9IHAucmVhZEkzMigpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGID09IGxvbmcpKSB7CisgICAgICAgIHJldHVybiB2IH4gIiA9IHAucmVhZEk2NCgpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGIDogc3RyaW5nKSkgeworICAgICAgICByZXR1cm4gdiB+ICIgPSBwLnJlYWRTdHJpbmcoKTsiOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiA9PSBlbnVtKSkgeworICAgICAgICByZXR1cm4gdiB+ICIgPSBjYXN0KHR5cGVvZigiIH4gdiB+ICIpKXAucmVhZEkzMigpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGIF8gOiBFW10sIEUpKSB7CisgICAgICAgIHJldHVybiAie1xuIiB+CisgICAgICAgICAgImF1dG8gIiB+IGxpc3QgfiAiID0gcC5yZWFkTGlzdEJlZ2luKCk7XG4iIH4KKyAgICAgICAgICAvLyBUT0RPOiBDaGVjayBlbGVtZW50IHR5cGUgaGVyZT8KKyAgICAgICAgICB2IH4gIiA9IG5ldyB0eXBlb2YoIiB+IHYgfiAiWzBdKVsiIH4gbGlzdCB+ICIuc2l6ZV07XG4iIH4KKyAgICAgICAgICAiZm9yZWFjaCAoIiB+IGkgfiAiOyAwIC4uICIgfiBsaXN0IH4gIi5zaXplKSB7XG4iIH4KKyAgICAgICAgICAgIHJlYWRWYWx1ZUNvZGUhRSh2IH4gIlsiIH4gaSB+ICJdIiwgbGV2ZWwgKyAxKSB+ICJcbiIgfgorICAgICAgICAgICJ9XG4iIH4KKyAgICAgICAgICAicC5yZWFkTGlzdEVuZCgpO1xuIiB+CisgICAgICAgICJ9IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgXyA6IFZbS10sIEssIFYpKSB7CisgICAgICAgIHJldHVybiAie1xuIiB+CisgICAgICAgICAgImF1dG8gIiB+IG1hcCB+ICIgPSBwLnJlYWRNYXBCZWdpbigpOyIgfgorICAgICAgICAgIHYgfiAiID0gbnVsbDtcbiIgfgorICAgICAgICAgIC8vIFRPRE86IENoZWNrIGtleS92YWx1ZSB0eXBlcyBoZXJlPworICAgICAgICAgICJmb3JlYWNoICgiIH4gaSB+ICI7IDAgLi4gIiB+IG1hcCB+ICIuc2l6ZSkge1xuIiB+CisgICAgICAgICAgICAiRnVsbHlVbnF1YWwhKHR5cGVvZigiIH4gdiB+ICIua2V5c1swXSkpICIgfiBrZXkgfiAiO1xuIiB+CisgICAgICAgICAgICByZWFkVmFsdWVDb2RlIUsoa2V5LCBsZXZlbCArIDEpIH4gIlxuIiB+CisgICAgICAgICAgICAidHlwZW9mKCIgfiB2IH4gIi52YWx1ZXNbMF0pICIgfiB2YWx1ZSB+ICI7XG4iIH4KKyAgICAgICAgICAgIHJlYWRWYWx1ZUNvZGUhVih2YWx1ZSwgbGV2ZWwgKyAxKSB+ICJcbiIgfgorICAgICAgICAgICAgdiB+ICJbY2FzdCh0eXBlb2YoIiB+IHYgfiAiLmtleXNbMF0pKSIgfiBrZXkgfiAiXSA9ICIgfiB2YWx1ZSB+ICI7XG4iIH4KKyAgICAgICAgICAifVxuIiB+CisgICAgICAgICAgInAucmVhZE1hcEVuZCgpOyIgfgorICAgICAgICAifSI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGIF8gOiBIYXNoU2V0IShFKSwgRSkpIHsKKyAgICAgICAgcmV0dXJuICJ7XG4iIH4KKyAgICAgICAgICAiYXV0byAiIH4gc2V0IH4gIiA9IHAucmVhZFNldEJlZ2luKCk7IiB+CisgICAgICAgICAgLy8gVE9ETzogQ2hlY2sgZWxlbWVudCB0eXBlIGhlcmU/CisgICAgICAgICAgdiB+ICIgPSBuZXcgdHlwZW9mKCIgfiB2IH4gIikoKTtcbiIgfgorICAgICAgICAgICJmb3JlYWNoICgiIH4gaSB+ICI7IDAgLi4gIiB+IHNldCB+ICIuc2l6ZSkge1xuIiB+CisgICAgICAgICAgICAidHlwZW9mKCIgfiB2IH4gIltdWzBdKSAiIH4gZWxlbSB+ICI7XG4iIH4KKyAgICAgICAgICAgIHJlYWRWYWx1ZUNvZGUhRShlbGVtLCBsZXZlbCArIDEpIH4gIlxuIiB+CisgICAgICAgICAgICB2IH4gIiB+PSAiIH4gZWxlbSB+ICI7XG4iIH4KKyAgICAgICAgICAifVxuIiB+CisgICAgICAgICAgInAucmVhZFNldEVuZCgpOyIgfgorICAgICAgICAifSI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGID09IHN0cnVjdCkgfHwgaXMoRiA6IFRFeGNlcHRpb24pKSB7CisgICAgICAgIHN0YXRpYyBpZiAoaXMoRiA9PSBzdHJ1Y3QpKSB7CisgICAgICAgICAgYXV0byByZXN1bHQgPSB2IH4gIiA9IHR5cGVvZigiIH4gdiB+ICIpKCk7XG4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGF1dG8gcmVzdWx0ID0gdiB+ICIgPSBuZXcgdHlwZW9mKCIgfiB2IH4gIikoKTtcbiI7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgaWYgKF9fdHJhaXRzKGNvbXBpbGVzLCBGLmluaXQucmVhZChUUHJvdG9jb2wuaW5pdCkpKSB7CisgICAgICAgICAgcmVzdWx0IH49IHYgfiAiLnJlYWQocCk7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXN1bHQgfj0gInJlYWRTdHJ1Y3QoIiB+IHYgfiAiLCBwKTsiOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdGF0aWMgYXNzZXJ0KGZhbHNlLCAiQ2Fubm90IHJlcHJlc2VudCB0eXBlIGluIFRocmlmdDogIiB+IEYuc3RyaW5nb2YpOworICAgICAgfQorICAgIH0KKworICAgIHN0cmluZyByZWFkRmllbGRDb2RlKEZpZWxkVHlwZSkoc3RyaW5nIG5hbWUsIHNob3J0IGlkLCBUUmVxIHJlcSkgeworICAgICAgc3RhdGljIGlmIChwb2ludGVyU3RydWN0ICYmIGlzUG9pbnRlciFGaWVsZFR5cGUpIHsKKyAgICAgICAgaW1tdXRhYmxlIHYgPSAiKCpzLiIgfiBuYW1lIH4gIikiOworICAgICAgICBhbGlhcyBQb2ludGVyVGFyZ2V0IUZpZWxkVHlwZSBGOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW1tdXRhYmxlIHYgPSAicy4iIH4gbmFtZTsKKyAgICAgICAgYWxpYXMgRmllbGRUeXBlIEY7CisgICAgICB9CisKKyAgICAgIHN0cmluZyBjb2RlID0gImNhc2UgIiB+IHRvIXN0cmluZyhpZCkgfiAiOlxuIjsKKyAgICAgIGNvZGUgfj0gImlmIChmLnR5cGUgPT0gIiB+IGRUb1RUeXBlU3RyaW5nIUYgfiAiKSB7XG4iOworICAgICAgY29kZSB+PSByZWFkVmFsdWVDb2RlIUYodikgfiAiXG4iOworICAgICAgaWYgKHJlcSA9PSBUUmVxLlJFUVVJUkVEKSB7CisgICAgICAgIC8vIEZvciByZXF1aXJlZCBmaWVsZHMsIHNldCB0aGUgY29ycmVzcG9uZGluZyBsb2NhbCBpc1NldCB2YXJpYWJsZS4KKyAgICAgICAgY29kZSB+PSAiaXNTZXRfIiB+IG5hbWUgfiAiID0gdHJ1ZTtcbiI7CisgICAgICB9IGVsc2UgaWYgKCFpc051bGxhYmxlIUYpeworICAgICAgICBjb2RlIH49ICJzLmlzU2V0RmxhZ3MuIiB+IG5hbWUgfiAiID0gdHJ1ZTtcbiI7CisgICAgICB9CisgICAgICBjb2RlIH49ICJ9IGVsc2Ugc2tpcChwLCBmLnR5cGUpO1xuIjsKKyAgICAgIGNvZGUgfj0gImJyZWFrO1xuIjsKKyAgICAgIHJldHVybiBjb2RlOworICAgIH0KKworICAgIC8vIENvZGUgZm9yIHRoZSBsb2NhbCBib29sZWFuIGZsYWdzIHVzZWQgdG8gbWFrZSBzdXJlIHJlcXVpcmVkIGZpZWxkcyBoYXZlCisgICAgLy8gYmVlbiBmb3VuZC4KKyAgICBzdHJpbmcgaXNTZXRGbGFnQ29kZSA9ICIiOworCisgICAgLy8gQ29kZSBmb3IgY2hlY2tpbmcgd2hldGhlciB0aGUgZmxhZ3MgZm9yIHRoZSByZXF1aXJlZCBmaWVsZHMgYXJlIHRydWUuCisgICAgc3RyaW5nIGlzU2V0Q2hlY2tDb2RlID0gIiI7CisKKyAgICAvLy8gQ29kZSBmb3IgdGhlIGNhc2Ugc3RhdGVtZW50cyBzdG9yaW5nIHRoZSBmaWVsZHMgdG8gdGhlIHJlc3VsdCBzdHJ1Y3QuCisgICAgc3RyaW5nIHJlYWRNZW1iZXJzQ29kZSA9ICIiOworCisgICAgLy8gVGhlIGxhc3QgYXV0b21hdGljYWxseSBhc3NpZ25lZCBpZCDigJMgZmllbGRzIHdpdGggbm8gbWV0YSBpbmZvcm1hdGlvbgorICAgIC8vIGFyZSBhc3NpZ25lZCAoaW4gbGV4aWNhbCBvcmRlcikgZGVzY2VuZGluZyBuZWdhdGl2ZSBpZHMsIHN0YXJ0aW5nIHdpdGgKKyAgICAvLyAtMSwganVzdCBsaWtlIHRoZSBUaHJpZnQgY29tcGlsZXIgZG9lcy4KKyAgICBzaG9ydCBsYXN0SWQ7CisKKyAgICBmb3JlYWNoIChuYW1lOyBGaWVsZE5hbWVzIVQpIHsKKyAgICAgIGVudW0gcmVxID0gbWVtYmVyUmVxIShULCBuYW1lLCBmaWVsZE1ldGFEYXRhKTsKKyAgICAgIGlmIChyZXEgPT0gVFJlcS5SRVFVSVJFRCkgeworICAgICAgICAvLyBGb3IgcmVxdWlyZWQgZmllbGRzLCBnZW5lcmF0ZSBsb2NhbCBib29sIGZsYWdzIHRvIGtlZXAgdHJhY2sKKyAgICAgICAgLy8gd2hldGhlciB0aGUgZmllbGQgaGFzIGJlZW4gZW5jb3VudGVyZWQuCisgICAgICAgIGltbXV0YWJsZSBuID0gImlzU2V0XyIgfiBuYW1lOworICAgICAgICBpc1NldEZsYWdDb2RlIH49ICJib29sICIgfiBuIH4gIjtcbiI7CisgICAgICAgIGlzU2V0Q2hlY2tDb2RlIH49ICJlbmZvcmNlKCIgfiBuIH4gIiwgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiIH4KKyAgICAgICAgICAiYFJlcXVpcmVkIGZpZWxkICciIH4gbmFtZSB+ICInIG5vdCBmb3VuZCBpbiBzZXJpYWxpemVkIGRhdGFgLCAiIH4KKyAgICAgICAgICAiVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9EQVRBKSk7XG4iOworICAgICAgfQorCisgICAgICBlbnVtIG1ldGEgPSBmaW5kIWBhLm5hbWUgPT0gYmAobWVyZ2VGaWVsZE1ldGEhKFQsIGZpZWxkTWV0YURhdGEpLCBuYW1lKTsKKyAgICAgIHN0YXRpYyBpZiAobWV0YS5lbXB0eSkgeworICAgICAgICAtLWxhc3RJZDsKKyAgICAgICAgdmVyc2lvbiAoVFZlcmJvc2VDb2RlZ2VuKSB7CisgICAgICAgICAgY29kZSB+PSAicHJhZ21hKG1zZywgYFt0aHJpZnQuY29kZWdlbi5iYXNlLnJlYWRTdHJ1Y3RdIFdhcm5pbmc6IE5vICIgfgorICAgICAgICAgICAgIm1ldGEgaW5mb3JtYXRpb24gZm9yIGZpZWxkICciIH4gbmFtZSB+ICInIGluIHN0cnVjdCAnIiB+CisgICAgICAgICAgICBULnN0cmluZ29mIH4gIicuIEFzc2lnbmVkIGlkOiAiIH4gdG8hc3RyaW5nKGxhc3RJZCkgfiAiLmApO1xuIjsKKyAgICAgICAgfQorICAgICAgICByZWFkTWVtYmVyc0NvZGUgfj0gcmVhZEZpZWxkQ29kZSEoTWVtYmVyVHlwZSEoVCwgbmFtZSkpKAorICAgICAgICAgIG5hbWUsIGxhc3RJZCwgcmVxKTsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKHJlcSAhPSBUUmVxLklHTk9SRSkgeworICAgICAgICByZWFkTWVtYmVyc0NvZGUgfj0gcmVhZEZpZWxkQ29kZSEoTWVtYmVyVHlwZSEoVCwgbmFtZSkpKAorICAgICAgICAgIG5hbWUsIG1ldGEuZnJvbnQuaWQsIHJlcSk7CisgICAgICB9CisgICAgfQorCisgICAgY29kZSB+PSBpc1NldEZsYWdDb2RlOworICAgIGNvZGUgfj0gInAucmVhZFN0cnVjdEJlZ2luKCk7XG4iOworICAgIGNvZGUgfj0gIndoaWxlICh0cnVlKSB7XG4iOworICAgIGNvZGUgfj0gImF1dG8gZiA9IHAucmVhZEZpZWxkQmVnaW4oKTtcbiI7CisgICAgY29kZSB+PSAiaWYgKGYudHlwZSA9PSBUVHlwZS5TVE9QKSBicmVhaztcbiI7CisgICAgY29kZSB+PSAic3dpdGNoKGYuaWQpIHtcbiI7CisgICAgY29kZSB+PSByZWFkTWVtYmVyc0NvZGU7CisgICAgY29kZSB+PSAiZGVmYXVsdDogc2tpcChwLCBmLnR5cGUpO1xuIjsKKyAgICBjb2RlIH49ICJ9XG4iOworICAgIGNvZGUgfj0gInAucmVhZEZpZWxkRW5kKCk7XG4iOworICAgIGNvZGUgfj0gIn1cbiI7CisgICAgY29kZSB+PSAicC5yZWFkU3RydWN0RW5kKCk7XG4iOworICAgIGNvZGUgfj0gaXNTZXRDaGVja0NvZGU7CisKKyAgICByZXR1cm4gY29kZTsKKyAgfSgpKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgc3RydWN0IHRvIHRoZSB0YXJnZXQgcHJvdG9jb2wuCisgKgorICogVXNpbmcgdGhlIFByb3RvY29sIHRlbXBsYXRlIHBhcmFtZXRlciwgdGhlIGNvbmNyZXRlIFRQcm90b2NvbCB0byB1c2UgY2FuIGJlCisgKiBiZSBzcGVjaWZpZWQuIElmIHRoZSBwb2ludGVyU3RydWN0IHBhcmFtZXRlciBpcyBzZXQgdG8gdHJ1ZSwgdGhlIHN0cnVjdAorICogZmllbGRzIGFyZSBleHBlY3RlZCB0byBiZSBwb2ludGVycyB0byB0aGUgYWN0dWFsIGRhdGEuIFRoaXMgaXMgdXNlZAorICogaW50ZXJuYWxseSAoY29tYmluZWQgd2l0aCBUUGFyZ3NTdHJ1Y3QpIGFuZCB1c3VhbGx5IHNob3VsZCBub3QgYmUgdXNlZCBpbgorICogdXNlciBjb2RlLgorICoKKyAqIFRoaXMgaXMgYSBmcmVlIGZ1bmN0aW9uIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gcmVhZCBleGlzaXRpbmcgc3RydWN0cyBmcm9tCisgKiB0aGUgd2lyZSB3aXRob3V0IGFsdGVyaW5nIHRoZWlyIGRlZmluaXRpb25zLgorICovCit2b2lkIHdyaXRlU3RydWN0KFQsIFByb3RvY29sLCBhbGlhcyBmaWVsZE1ldGFEYXRhID0gY2FzdChURmllbGRNZXRhW10pbnVsbCwKKyAgYm9vbCBwb2ludGVyU3RydWN0ID0gZmFsc2UpIChjb25zdCBUIHMsIFByb3RvY29sIHApIGlmIChpc1RQcm90b2NvbCFQcm90b2NvbCkKK3sKKyAgbWl4aW4oeworICAgIC8vIENoZWNrIHRoYXQgYWxsIGZpZWxkcyBmb3Igd2hpY2ggdGhlcmUgaXMgbWV0YSBpbmZvIGFyZSBhY3R1YWxseSBpbiB0aGUKKyAgICAvLyBwYXNzZWQgc3RydWN0IHR5cGUuCisgICAgc3RyaW5nIGNvZGUgPSAiIjsKKyAgICBmb3JlYWNoIChmaWVsZDsgbWVyZ2VGaWVsZE1ldGEhKFQsIGZpZWxkTWV0YURhdGEpKSB7CisgICAgICBjb2RlIH49ICJzdGF0aWMgYXNzZXJ0KGlzKE1lbWJlclR5cGUhKFQsIGAiIH4gZmllbGQubmFtZSB+ICJgKSkpO1xuIjsKKyAgICB9CisKKyAgICAvLyBDaGVjayB0aGF0IHJlcXVpcmVkIG51bGxhYmxlIG1lbWJlcnMgYXJlIG5vbi1udWxsLgorICAgIC8vIFdPUktBUk9VTkQ6IFRvIHN0b3AgTERDIGZyb20gZW1pdHRpbmcgdGhlIG1hbmlmZXN0IGNvbnN0YW50IMK7bWV0YcKrIGJlbG93CisgICAgLy8gaW50byB0aGUgd3JpdGVTdHJ1Y3QgZnVuY3Rpb24gYm9keSB0aGlzIGlzIGluc2lkZSB0aGUgc3RyaW5nIG1peGluCisgICAgLy8gYmxvY2sg4oCTIHRoZSBjb2RlIHdvdWxkbid0IGRlcGVuZCBvbiBpdCAodGhpcyBpcyBhbiBMREMgYnVnLCBhbmQgYmVjYXVzZQorICAgIC8vIG9mIGl0IGEgbmV3IGFycmF5IHdvdWxkIGJlIGFsbG9jYXRlZCBvbiBlYWNoIG1ldGhvZCBpbnZvY2F0aW9uIGF0IHJ1bnRpbWUpLgorICAgIGZvcmVhY2ggKG5hbWU7IFN0YXRpY0ZpbHRlciEoCisgICAgICBDb21wb3NlIShpc051bGxhYmxlLCBQQXBwbHkhKE1lbWJlclR5cGUsIFQpKSwKKyAgICAgIEZpZWxkTmFtZXMhVAorICAgICkpIHsKKyAgICAgICBzdGF0aWMgaWYgKG1lbWJlclJlcSEoVCwgbmFtZSwgZmllbGRNZXRhRGF0YSkgPT0gVFJlcS5SRVFVSVJFRCkgeworICAgICAgICAgY29kZSB+PSAiZW5mb3JjZShfX3RyYWl0cyhnZXRNZW1iZXIsIHMsIGAiIH4gbmFtZSB+ICJgKSAhaXMgbnVsbCwKKyAgICAgICAgICAgbmV3IFRFeGNlcHRpb24oYFJlcXVpcmVkIGZpZWxkICciIH4gbmFtZSB+ICInIGlzIG51bGwuYCkpO1xuIjsKKyAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNvZGU7CisgIH0oKSk7CisKKyAgcC53cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3QoVC5zdHJpbmdvZikpOworICBtaXhpbih7CisgICAgc3RyaW5nIHdyaXRlVmFsdWVDb2RlKFZhbHVlVHlwZSkoc3RyaW5nIHYsIHNpemVfdCBsZXZlbCA9IDApIHsKKyAgICAgIC8vIFNvbWUgbm9uLWFtYmlnb3VzIG5hbWVzIHRvIHVzZSAoc2hhZG93aW5nIGlzIG5vdCBhbGxvd2VkIGluIEQpLgorICAgICAgaW1tdXRhYmxlIGVsZW0gPSAiZWxlbSIgfiB0byFzdHJpbmcobGV2ZWwpOworICAgICAgaW1tdXRhYmxlIGtleSA9ICJrZXkiIH4gdG8hc3RyaW5nKGxldmVsKTsKKyAgICAgIGltbXV0YWJsZSB2YWx1ZSA9ICJ2YWx1ZSIgfiB0byFzdHJpbmcobGV2ZWwpOworCisgICAgICBhbGlhcyBGdWxseVVucXVhbCFWYWx1ZVR5cGUgRjsKKyAgICAgIHN0YXRpYyBpZiAoaXMoRiA9PSBib29sKSkgeworICAgICAgICByZXR1cm4gInAud3JpdGVCb29sKCIgfiB2IH4gIik7IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgPT0gYnl0ZSkpIHsKKyAgICAgICAgcmV0dXJuICJwLndyaXRlQnl0ZSgiIH4gdiB+ICIpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGID09IGRvdWJsZSkpIHsKKyAgICAgICAgcmV0dXJuICJwLndyaXRlRG91YmxlKCIgfiB2IH4gIik7IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgPT0gc2hvcnQpKSB7CisgICAgICAgIHJldHVybiAicC53cml0ZUkxNigiIH4gdiB+ICIpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGID09IGludCkpIHsKKyAgICAgICAgcmV0dXJuICJwLndyaXRlSTMyKCIgfiB2IH4gIik7IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgPT0gbG9uZykpIHsKKyAgICAgICAgcmV0dXJuICJwLndyaXRlSTY0KCIgfiB2IH4gIik7IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgOiBzdHJpbmcpKSB7CisgICAgICAgIHJldHVybiAicC53cml0ZVN0cmluZygiIH4gdiB+ICIpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGID09IGVudW0pKSB7CisgICAgICAgIHJldHVybiAicC53cml0ZUkzMihjYXN0KGludCkiIH4gdiB+ICIpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGIF8gOiBFW10sIEUpKSB7CisgICAgICAgIHJldHVybiAicC53cml0ZUxpc3RCZWdpbihUTGlzdCgiIH4gZFRvVFR5cGVTdHJpbmchRSB+ICIsICIgfiB2IH4KKyAgICAgICAgICAiLmxlbmd0aCkpO1xuIiB+CisgICAgICAgICAgImZvcmVhY2ggKCIgfiBlbGVtIH4gIjsgIiB+IHYgfiAiKSB7XG4iIH4KKyAgICAgICAgICAgIHdyaXRlVmFsdWVDb2RlIUUoZWxlbSwgbGV2ZWwgKyAxKSB+ICJcbiIgfgorICAgICAgICAgICJ9XG4iIH4KKyAgICAgICAgICAicC53cml0ZUxpc3RFbmQoKTsiOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiBfIDogVltLXSwgSywgVikpIHsKKyAgICAgICAgcmV0dXJuICJwLndyaXRlTWFwQmVnaW4oVE1hcCgiIH4gZFRvVFR5cGVTdHJpbmchSyB+ICIsICIgfgorICAgICAgICAgIGRUb1RUeXBlU3RyaW5nIVYgfiAiLCAiIH4gdiB+ICIubGVuZ3RoKSk7XG4iIH4KKyAgICAgICAgICAiZm9yZWFjaCAoIiB+IGtleSB+ICIsICIgfiB2YWx1ZSB+ICI7ICIgfiB2IH4gIikge1xuIiB+CisgICAgICAgICAgICB3cml0ZVZhbHVlQ29kZSFLKGtleSwgbGV2ZWwgKyAxKSB+ICJcbiIgfgorICAgICAgICAgICAgd3JpdGVWYWx1ZUNvZGUhVih2YWx1ZSwgbGV2ZWwgKyAxKSB+ICJcbiIgfgorICAgICAgICAgICJ9XG4iIH4KKyAgICAgICAgICAicC53cml0ZU1hcEVuZCgpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGIF8gOiBIYXNoU2V0IUUsIEUpKSB7CisgICAgICAgIHJldHVybiAicC53cml0ZVNldEJlZ2luKFRTZXQoIiB+IGRUb1RUeXBlU3RyaW5nIUUgfiAiLCAiIH4gdiB+CisgICAgICAgICAgIi5sZW5ndGgpKTtcbiIgfgorICAgICAgICAgICJmb3JlYWNoICgiIH4gZWxlbSB+ICI7ICIgfiB2IH4gIltdKSB7XG4iIH4KKyAgICAgICAgICAgIHdyaXRlVmFsdWVDb2RlIUUoZWxlbSwgbGV2ZWwgKyAxKSB+ICJcbiIgfgorICAgICAgICAgICJ9XG4iIH4KKyAgICAgICAgICAicC53cml0ZVNldEVuZCgpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGID09IHN0cnVjdCkgfHwgaXMoRiA6IFRFeGNlcHRpb24pKSB7CisgICAgICAgIHN0YXRpYyBpZiAoX190cmFpdHMoY29tcGlsZXMsIEYuaW5pdC53cml0ZShUUHJvdG9jb2wuaW5pdCkpKSB7CisgICAgICAgICAgcmV0dXJuIHYgfiAiLndyaXRlKHApOyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuICJ3cml0ZVN0cnVjdCgiIH4gdiB+ICIsIHApOyI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXRpYyBhc3NlcnQoZmFsc2UsICJDYW5ub3QgcmVwcmVzZW50IHR5cGUgaW4gVGhyaWZ0OiAiIH4gRi5zdHJpbmdvZik7CisgICAgICB9CisgICAgfQorCisgICAgc3RyaW5nIHdyaXRlRmllbGRDb2RlKEZpZWxkVHlwZSkoc3RyaW5nIG5hbWUsIHNob3J0IGlkLCBUUmVxIHJlcSkgeworICAgICAgc3RyaW5nIGNvZGU7CisgICAgICBpZiAoIXBvaW50ZXJTdHJ1Y3QgJiYgcmVxID09IFRSZXEuT1BUSU9OQUwpIHsKKyAgICAgICAgY29kZSB+PSAiaWYgKHMuaXNTZXQhYCIgfiBuYW1lIH4gImApIHtcbiI7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBpZiAocG9pbnRlclN0cnVjdCAmJiBpc1BvaW50ZXIhRmllbGRUeXBlKSB7CisgICAgICAgIGltbXV0YWJsZSB2ID0gIigqcy4iIH4gbmFtZSB+ICIpIjsKKyAgICAgICAgYWxpYXMgUG9pbnRlclRhcmdldCFGaWVsZFR5cGUgRjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGltbXV0YWJsZSB2ID0gInMuIiB+IG5hbWU7CisgICAgICAgIGFsaWFzIEZpZWxkVHlwZSBGOworICAgICAgfQorCisgICAgICBjb2RlIH49ICJwLndyaXRlRmllbGRCZWdpbihURmllbGQoYCIgfiBuYW1lIH4gImAsICIgfiBkVG9UVHlwZVN0cmluZyFGIH4KKyAgICAgICAgIiwgIiB+IHRvIXN0cmluZyhpZCkgfiAiKSk7XG4iOworICAgICAgY29kZSB+PSB3cml0ZVZhbHVlQ29kZSFGKHYpIH4gIlxuIjsKKyAgICAgIGNvZGUgfj0gInAud3JpdGVGaWVsZEVuZCgpO1xuIjsKKworICAgICAgaWYgKCFwb2ludGVyU3RydWN0ICYmIHJlcSA9PSBUUmVxLk9QVElPTkFMKSB7CisgICAgICAgIGNvZGUgfj0gIn1cbiI7CisgICAgICB9CisgICAgICByZXR1cm4gY29kZTsKKyAgICB9CisKKyAgICAvLyBUaGUgbGFzdCBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkIGlkIOKAkyBmaWVsZHMgd2l0aCBubyBtZXRhIGluZm9ybWF0aW9uCisgICAgLy8gYXJlIGFzc2lnbmVkIChpbiBsZXhpY2FsIG9yZGVyKSBkZXNjZW5kaW5nIG5lZ2F0aXZlIGlkcywgc3RhcnRpbmcgd2l0aAorICAgIC8vIC0xLCBqdXN0IGxpa2UgdGhlIFRocmlmdCBjb21waWxlciBkb2VzLgorICAgIHNob3J0IGxhc3RJZDsKKworICAgIHN0cmluZyBjb2RlID0gIiI7CisgICAgZm9yZWFjaCAobmFtZTsgRmllbGROYW1lcyFUKSB7CisgICAgICBhbGlhcyBNZW1iZXJUeXBlIShULCBuYW1lKSBGOworICAgICAgZW51bSByZXEgPSBtZW1iZXJSZXEhKFQsIG5hbWUsIGZpZWxkTWV0YURhdGEpOworICAgICAgZW51bSBtZXRhID0gZmluZCFgYS5uYW1lID09IGJgKG1lcmdlRmllbGRNZXRhIShULCBmaWVsZE1ldGFEYXRhKSwgbmFtZSk7CisgICAgICBpZiAobWV0YS5lbXB0eSkgeworICAgICAgICAtLWxhc3RJZDsKKyAgICAgICAgdmVyc2lvbiAoVFZlcmJvc2VDb2RlZ2VuKSB7CisgICAgICAgICAgY29kZSB+PSAicHJhZ21hKG1zZywgYFt0aHJpZnQuY29kZWdlbi5iYXNlLndyaXRlU3RydWN0XSBXYXJuaW5nOiBObyAiIH4KKyAgICAgICAgICAgICJtZXRhIGluZm9ybWF0aW9uIGZvciBmaWVsZCAnIiB+IG5hbWUgfiAiJyBpbiBzdHJ1Y3QgJyIgfgorICAgICAgICAgICAgVC5zdHJpbmdvZiB+ICInLiBBc3NpZ25lZCBpZDogIiB+IHRvIXN0cmluZyhsYXN0SWQpIH4gIi5gKTtcbiI7CisgICAgICAgIH0KKyAgICAgICAgY29kZSB+PSB3cml0ZUZpZWxkQ29kZSFGKG5hbWUsIGxhc3RJZCwgcmVxKTsKKyAgICAgIH0gZWxzZSBpZiAocmVxICE9IFRSZXEuSUdOT1JFKSB7CisgICAgICAgIGNvZGUgfj0gd3JpdGVGaWVsZENvZGUhRihuYW1lLCBtZXRhLmZyb250LmlkLCByZXEpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjb2RlOworICB9KCkpOworICBwLndyaXRlRmllbGRTdG9wKCk7CisgIHAud3JpdGVTdHJ1Y3RFbmQoKTsKK30KKwordW5pdHRlc3QgeworICAvLyBFbnN1cmUgdGhhdCB0aGUgZ2VuZXJhdGVkIGNvZGUgYXQgbGVhc3QgY29tcGlsZXMgZm9yIHRoZSBiYXNpYyBmaWVsZCB0eXBlCisgIC8vIGNvbWJpbmF0aW9ucy4gRnVuY3Rpb25hbGl0eSBjaGVja3MgYXJlIGNvdmVyZWQgYnkgdGhlIHJlc3Qgb2YgdGhlIHRlc3QKKyAgLy8gc3VpdGUuCisKKyAgc3RhdGljIHN0cnVjdCBUZXN0IHsKKyAgICAvLyBOb24tbnVsbGFibGUuCisgICAgaW50IGExOworICAgIGludCBhMjsKKyAgICBpbnQgYTM7CisgICAgaW50IGE0OworCisgICAgLy8gTnVsbGFibGUuCisgICAgc3RyaW5nIGIxOworICAgIHN0cmluZyBiMjsKKyAgICBzdHJpbmcgYjM7CisgICAgc3RyaW5nIGI0OworCisgICAgbWl4aW4gVFN0cnVjdEhlbHBlcnMhKFsKKyAgICAgIFRGaWVsZE1ldGEoImExIiwgMSwgVFJlcS5PUFRfSU5fUkVRX09VVCksCisgICAgICBURmllbGRNZXRhKCJhMiIsIDIsIFRSZXEuT1BUSU9OQUwpLAorICAgICAgVEZpZWxkTWV0YSgiYTMiLCAzLCBUUmVxLlJFUVVJUkVEKSwKKyAgICAgIFRGaWVsZE1ldGEoImE0IiwgNCwgVFJlcS5JR05PUkUpLAorICAgICAgVEZpZWxkTWV0YSgiYjEiLCA1LCBUUmVxLk9QVF9JTl9SRVFfT1VUKSwKKyAgICAgIFRGaWVsZE1ldGEoImIyIiwgNiwgVFJlcS5PUFRJT05BTCksCisgICAgICBURmllbGRNZXRhKCJiMyIsIDcsIFRSZXEuUkVRVUlSRUQpLAorICAgICAgVEZpZWxkTWV0YSgiYjQiLCA4LCBUUmVxLklHTk9SRSksCisgICAgXSk7CisgIH0KKworICBzdGF0aWMgYXNzZXJ0KF9fdHJhaXRzKGNvbXBpbGVzLCB7IFRlc3QgdDsgdC5yZWFkKGNhc3QoVFByb3RvY29sKW51bGwpOyB9KSk7CisgIHN0YXRpYyBhc3NlcnQoX190cmFpdHMoY29tcGlsZXMsIHsgVGVzdCB0OyB0LndyaXRlKGNhc3QoVFByb3RvY29sKW51bGwpOyB9KSk7Cit9CisKKy8vIEVuc3VyZSBvcEVxdWFscyBhbmQgdG9IYXNoIGNvbnNpc3RlbmN5LgordW5pdHRlc3QgeworICBzdHJ1Y3QgVGVzdEVxdWFscyB7CisgICAgaW50IGExOworCisgICAgbWl4aW4gVFN0cnVjdEhlbHBlcnMhKFsKKyAgICAgIFRGaWVsZE1ldGEoImExIiwgMSwgVFJlcS5PUFRfSU5fUkVRX09VVCksCisgICAgXSk7CisgIH0KKworICBUZXN0RXF1YWxzIGEsIGI7CisgIGFzc2VydChhID09IGIpOworICBhc3NlcnQoYS50b0hhc2goKSA9PSBiLnRvSGFzaCgpKTsKKworICBhLmExID0gNDI7CisgIGFzc2VydChhICE9IGIpOworICBhc3NlcnQoYS50b0hhc2goKSAhPSBiLnRvSGFzaCgpKTsKKworICBiLmExID0gNDI7CisgIGFzc2VydChhID09IGIpOworICBhc3NlcnQoYS50b0hhc2goKSA9PSBiLnRvSGFzaCgpKTsKK30KKworcHJpdmF0ZSB7CisgIC8qCisgICAqIFJldHVybnMgYSBEIGNvZGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1hdGNoaW5nIFRUeXBlIHZhbHVlIGZvciBhIHBhc3NlZAorICAgKiBEIHR5cGUsIGUuZy4gZFRvVFR5cGVTdHJpbmchYnl0ZSA9PSAiVFR5cGUuQllURSIuCisgICAqLworICB0ZW1wbGF0ZSBkVG9UVHlwZVN0cmluZyhUKSB7CisgICAgc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGJvb2wpKSB7CisgICAgICBlbnVtIGRUb1RUeXBlU3RyaW5nID0gIlRUeXBlLkJPT0wiOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gYnl0ZSkpIHsKKyAgICAgIGVudW0gZFRvVFR5cGVTdHJpbmcgPSAiVFR5cGUuQllURSI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBkb3VibGUpKSB7CisgICAgICBlbnVtIGRUb1RUeXBlU3RyaW5nID0gIlRUeXBlLkRPVUJMRSI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBzaG9ydCkpIHsKKyAgICAgIGVudW0gZFRvVFR5cGVTdHJpbmcgPSAiVFR5cGUuSTE2IjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGludCkpIHsKKyAgICAgIGVudW0gZFRvVFR5cGVTdHJpbmcgPSAiVFR5cGUuSTMyIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGxvbmcpKSB7CisgICAgICBlbnVtIGRUb1RUeXBlU3RyaW5nID0gIlRUeXBlLkk2NCI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA6IHN0cmluZykpIHsKKyAgICAgIGVudW0gZFRvVFR5cGVTdHJpbmcgPSAiVFR5cGUuU1RSSU5HIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGVudW0pKSB7CisgICAgICBlbnVtIGRUb1RUeXBlU3RyaW5nID0gIlRUeXBlLkkzMiI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCBfIDogVVtdLCBVKSkgeworICAgICAgZW51bSBkVG9UVHlwZVN0cmluZyA9ICJUVHlwZS5MSVNUIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUIF8gOiBWW0tdLCBLLCBWKSkgeworICAgICAgZW51bSBkVG9UVHlwZVN0cmluZyA9ICJUVHlwZS5NQVAiOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgXyA6IEhhc2hTZXQhRSwgRSkpIHsKKyAgICAgIGVudW0gZFRvVFR5cGVTdHJpbmcgPSAiVFR5cGUuU0VUIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IHN0cnVjdCkpIHsKKyAgICAgIGVudW0gZFRvVFR5cGVTdHJpbmcgPSAiVFR5cGUuU1RSVUNUIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUIDogVEV4Y2VwdGlvbikpIHsKKyAgICAgIGVudW0gZFRvVFR5cGVTdHJpbmcgPSAiVFR5cGUuU1RSVUNUIjsKKyAgICB9IGVsc2UgeworICAgICAgc3RhdGljIGFzc2VydChmYWxzZSwgIkNhbm5vdCByZXByZXNlbnQgdHlwZSBpbiBUaHJpZnQ6ICIgfiBULnN0cmluZ29mKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9jbGllbnQuZCBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9jbGllbnQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTdiMDc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2NsaWVudC5kCkBAIC0wLDAgKzEsNDg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LmNvZGVnZW4uY2xpZW50OworCitpbXBvcnQgc3RkLmFsZ29yaXRobSA6IGZpbmQ7CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHksIGZyb250OworaW1wb3J0IHN0ZC5jb252IDogdG87CitpbXBvcnQgc3RkLnRyYWl0cyA6IGlzU29tZUZ1bmN0aW9uLCBQYXJhbWV0ZXJTdG9yYWdlQ2xhc3MsCisgIFBhcmFtZXRlclN0b3JhZ2VDbGFzc1R1cGxlLCBQYXJhbWV0ZXJUeXBlVHVwbGUsIFJldHVyblR5cGU7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uYmFzZTsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuY29kZWdlbjsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuY3RmZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKKworLyoqCisgKiBUaHJpZnQgc2VydmljZSBjbGllbnQsIHdoaWNoIGltcGxlbWVudHMgYW4gaW50ZXJmYWNlIGJ5IHN5bmNocm9ub3VzbHkKKyAqIGNhbGxpbmcgYSBzZXJ2ZXIgb3ZlciBhIFRQcm90b2NvbC4KKyAqCisgKiBUQ2xpZW50QmFzZSBzaW1wbHkgZXh0ZW5kcyBJbnRlcmZhY2Ugd2l0aCBnZW5lcmljIGlucHV0L291dHB1dCBwcm90b2NvbAorICogcHJvcGVydGllcyB0byBzZXJ2ZSBhcyBhIHN1cGVydHlwZSBmb3IgYWxsIFRDbGllbnRzIGZvciB0aGUgc2FtZSBzZXJ2aWNlLAorICogd2hpY2ggbWlnaHQgYmUgaW5zdGFudGlhdGVkIHdpdGggZGlmZmVyZW50IGNvbmNyZXRlIHByb3RvY29sIHR5cGVzICh0aGVyZQorICogaXMgbm8gY292YXJpYW5jZSBmb3IgdGVtcGxhdGUgdHlwZSBwYXJhbWV0ZXJzKS4gSWYgSW50ZXJmYWNlIGlzIGRlcml2ZWQKKyAqIGZyb20gYW5vdGhlciBpbnRlcmZhY2UgQmFzZUludGVyZmFjZSwgaXQgYWxzbyBleHRlbmRzCisgKiBUQ2xpZW50QmFzZSFCYXNlSW50ZXJmYWNlLgorICoKKyAqIFRDbGllbnQgaXMgdGhlIGNsYXNzIHRoYXQgYWN0dWFsbHkgaW1wbGVtZW50cyBUQ2xpZW50QmFzZS4gSnVzdCBhcworICogVENsaWVudEJhc2UsIGl0IGlzIGFsc28gZGVyaXZlZCBmcm9tIFRDbGllbnQhQmFzZUludGVyZmFjZSBmb3IgaW5oZXJpdGluZworICogc2VydmljZXMuCisgKgorICogVENsaWVudCB0YWtlcyB0d28gb3B0aW9uYWwgdGVtcGxhdGUgYXJndW1lbnRzIHdoaWNoIGNhbiBiZSB1c2VkIGZvcgorICogc3BlY2lmeWluZyB0aGUgYWN0dWFsIFRQcm90b2NvbCBpbXBsZW1lbnRhdGlvbiB1c2VkIGZvciBvcHRpbWl6YXRpb24KKyAqIHB1cnBvc2VzLCBhcyB2aXJ0dWFsIGNhbGxzIGNhbiBjb21wbGV0ZWx5IGJlIGVsaW1pbmF0ZWQgdGhlbi4gSWYKKyAqIE91dHB1dFByb3RvY29sIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGlzIGFzc3VtZWQgdG8gYmUgdGhlIHNhbWUgYXMKKyAqIElucHV0UHJvdG9jb2wuIFRoZSBwcm90b2NvbCBwcm9wZXJ0aWVzIGRlZmluZWQgYnkgVENsaWVudEJhc2UgYXJlIGV4cG9zZWQKKyAqIHdpdGggdGhlaXIgY29uY3JldGUgdHlwZSAocmV0dXJuIHR5cGUgY292YXJpYW5jZSkuCisgKgorICogSW4gYWRkaXRpb24gdG8gaW1wbGVtZW50aW5nIFRDbGllbnRCYXNlIUludGVyZmFjZSwgVENsaWVudCBvZmZlcnMgdGhlCisgKiBmb2xsb3dpbmcgY29uc3RydWN0b3JzOgorICogLS0tCisgKiB0aGlzKElucHV0UHJvdG9jb2wgaXByb3QsIE91dHB1dFByb3RvY29sIG9wcm90KTsKKyAqIC8vIE9ubHkgaWYgaXMoSW5wdXRQcm90b2NvbCA9PSBPdXRwdXRQcm90b2NvbCksIHRvIHVzZSB0aGUgc2FtZSBwcm90b2NvbAorICogLy8gZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dDoKKyAqIHRoaXMoSW5wdXRQcm90b2NvbCBwcm90KTsKKyAqIC0tLQorICoKKyAqIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGUgbWV0aG9kIGNhbGxzIHN0YXJ0cyBhdCB6ZXJvIGFuZCBpcyBhdXRvbWF0aWNhbGx5CisgKiBpbmNyZW1lbnRlZC4KKyAqLworaW50ZXJmYWNlIFRDbGllbnRCYXNlKEludGVyZmFjZSkgaWYgKGlzQmFzZVNlcnZpY2UhSW50ZXJmYWNlKSA6IEludGVyZmFjZSB7CisgIC8qKgorICAgKiBUaGUgaW5wdXQgcHJvdG9jb2wgdXNlZCBieSB0aGUgY2xpZW50LgorICAgKi8KKyAgVFByb3RvY29sIGlucHV0UHJvdG9jb2woKSBAcHJvcGVydHk7CisKKyAgLyoqCisgICAqIFRoZSBvdXRwdXQgcHJvdG9jb2wgdXNlZCBieSB0aGUgY2xpZW50LgorICAgKi8KKyAgVFByb3RvY29sIG91dHB1dFByb3RvY29sKCkgQHByb3BlcnR5OworfQorCisvLy8gRGl0dG8KK2ludGVyZmFjZSBUQ2xpZW50QmFzZShJbnRlcmZhY2UpIGlmIChpc0Rlcml2ZWRTZXJ2aWNlIUludGVyZmFjZSkgOgorICBUQ2xpZW50QmFzZSEoQmFzZVNlcnZpY2UhSW50ZXJmYWNlKSwgSW50ZXJmYWNlIHt9CisKKy8vLyBEaXR0bwordGVtcGxhdGUgVENsaWVudChJbnRlcmZhY2UsIElucHV0UHJvdG9jb2wgPSBUUHJvdG9jb2wsIE91dHB1dFByb3RvY29sID0gdm9pZCkgaWYgKAorICBpc1NlcnZpY2UhSW50ZXJmYWNlICYmIGlzVFByb3RvY29sIUlucHV0UHJvdG9jb2wgJiYKKyAgKGlzVFByb3RvY29sIU91dHB1dFByb3RvY29sIHx8IGlzKE91dHB1dFByb3RvY29sID09IHZvaWQpKQorKSB7CisgIG1peGluKHsKKyAgICBzdGF0aWMgaWYgKGlzRGVyaXZlZFNlcnZpY2UhSW50ZXJmYWNlKSB7CisgICAgICBzdHJpbmcgY29kZSA9ICJjbGFzcyBUQ2xpZW50IDogVENsaWVudCEoQmFzZVNlcnZpY2UhSW50ZXJmYWNlLCAiIH4KKyAgICAgICAgIklucHV0UHJvdG9jb2wsIE91dHB1dFByb3RvY29sKSwgVENsaWVudEJhc2UhSW50ZXJmYWNlIHtcbiI7CisgICAgICBjb2RlIH49IHF7CisgICAgICAgIHRoaXMoSVByb3QgaXByb3QsIE9Qcm90IG9wcm90KSB7CisgICAgICAgICAgc3VwZXIoaXByb3QsIG9wcm90KTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBpZiAoaXMoSVByb3QgPT0gT1Byb3QpKSB7CisgICAgICAgICAgdGhpcyhJUHJvdCBwcm90KSB7CisgICAgICAgICAgICBzdXBlcihwcm90KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBETUQgQEBCVUdAQDogSWYgdGhlc2UgYXJlIG5vdCBwcmVzZW50IGluIHRoaXMgY2xhc3MgKHdvdWxkIGJlKQorICAgICAgICAvLyBpbmhlcml0ZWQgYW55d2F5LCDCu25vdCBpbXBsZW1lbnRlZMKrIGVycm9ycyBhcmUgcmFpc2VkLgorICAgICAgICBvdmVycmlkZSBJUHJvdCBpbnB1dFByb3RvY29sKCkgQHByb3BlcnR5IHsKKyAgICAgICAgICByZXR1cm4gc3VwZXIuaW5wdXRQcm90b2NvbDsKKyAgICAgICAgfQorICAgICAgICBvdmVycmlkZSBPUHJvdCBvdXRwdXRQcm90b2NvbCgpIEBwcm9wZXJ0eSB7CisgICAgICAgICAgcmV0dXJuIHN1cGVyLm91dHB1dFByb3RvY29sOworICAgICAgICB9CisgICAgICB9OworICAgIH0gZWxzZSB7CisgICAgICBzdHJpbmcgY29kZSA9ICJjbGFzcyBUQ2xpZW50IDogVENsaWVudEJhc2UhSW50ZXJmYWNlIHsiOworICAgICAgY29kZSB+PSBxeworICAgICAgICBhbGlhcyBJbnB1dFByb3RvY29sIElQcm90OworICAgICAgICBzdGF0aWMgaWYgKGlzVFByb3RvY29sIU91dHB1dFByb3RvY29sKSB7CisgICAgICAgICAgYWxpYXMgT3V0cHV0UHJvdG9jb2wgT1Byb3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RhdGljIGFzc2VydChpcyhPdXRwdXRQcm90b2NvbCA9PSB2b2lkKSk7CisgICAgICAgICAgYWxpYXMgSW5wdXRQcm90b2NvbCBPUHJvdDsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMoSVByb3QgaXByb3QsIE9Qcm90IG9wcm90KSB7CisgICAgICAgICAgaXByb3RfID0gaXByb3Q7CisgICAgICAgICAgb3Byb3RfID0gb3Byb3Q7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgaWYgKGlzKElQcm90ID09IE9Qcm90KSkgeworICAgICAgICAgIHRoaXMoSVByb3QgcHJvdCkgeworICAgICAgICAgICAgdGhpcyhwcm90LCBwcm90KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBJUHJvdCBpbnB1dFByb3RvY29sKCkgQHByb3BlcnR5IHsKKyAgICAgICAgICByZXR1cm4gaXByb3RfOworICAgICAgICB9CisKKyAgICAgICAgT1Byb3Qgb3V0cHV0UHJvdG9jb2woKSBAcHJvcGVydHkgeworICAgICAgICAgIHJldHVybiBvcHJvdF87CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgSVByb3QgaXByb3RfOworICAgICAgICBwcm90ZWN0ZWQgT1Byb3Qgb3Byb3RfOworICAgICAgICBwcm90ZWN0ZWQgaW50IHNlcWlkXzsKKyAgICAgIH07CisgICAgfQorCisgICAgZm9yZWFjaCAobWV0aG9kTmFtZTsgX190cmFpdHMoZGVyaXZlZE1lbWJlcnMsIEludGVyZmFjZSkpIHsKKyAgICAgIHN0YXRpYyBpZiAoaXNTb21lRnVuY3Rpb24hKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSkgeworICAgICAgICBib29sIG1ldGhvZE1ldGFGb3VuZDsKKyAgICAgICAgVE1ldGhvZE1ldGEgbWV0aG9kTWV0YTsKKyAgICAgICAgc3RhdGljIGlmIChpcyh0eXBlb2YoSW50ZXJmYWNlLm1ldGhvZE1ldGEpIDogVE1ldGhvZE1ldGFbXSkpIHsKKyAgICAgICAgICBlbnVtIG1ldGEgPSBmaW5kIWBhLm5hbWUgPT0gYmAoSW50ZXJmYWNlLm1ldGhvZE1ldGEsIG1ldGhvZE5hbWUpOworICAgICAgICAgIGlmICghbWV0YS5lbXB0eSkgeworICAgICAgICAgICAgbWV0aG9kTWV0YUZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIG1ldGhvZE1ldGEgPSBtZXRhLmZyb250OworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEdlbmVyYXRlIHRoZSBjb2RlIGZvciBzZW5kaW5nLgorICAgICAgICBzdHJpbmdbXSBwYXJhbUxpc3Q7CisgICAgICAgIHN0cmluZyBwYXJhbUFzc2lnbkNvZGU7CisgICAgICAgIGZvcmVhY2ggKGksIF87IFBhcmFtZXRlclR5cGVUdXBsZSEobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpKSB7CisgICAgICAgICAgLy8gVXNlIHRoZSBwYXJhbSBuYW1lIHNwZWZpY2llZCBpbiB0aGUgbWV0YSBpbmZvcm1hdGlvbiBpZiBhbnkg4oCTCisgICAgICAgICAgLy8ganVzdCBjb3NtZXRpY3MgaW4gdGhpcyBjYXNlLgorICAgICAgICAgIHN0cmluZyBwYXJhbU5hbWU7CisgICAgICAgICAgaWYgKG1ldGhvZE1ldGFGb3VuZCAmJiBpIDwgbWV0aG9kTWV0YS5wYXJhbXMubGVuZ3RoKSB7CisgICAgICAgICAgICBwYXJhbU5hbWUgPSBtZXRob2RNZXRhLnBhcmFtc1tpXS5uYW1lOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXJhbU5hbWUgPSAicGFyYW0iIH4gdG8hc3RyaW5nKGkgKyAxKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpbW11dGFibGUgc3RvcmFnZSA9IFBhcmFtZXRlclN0b3JhZ2VDbGFzc1R1cGxlISgKKyAgICAgICAgICAgIG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKVtpXTsKKyAgICAgICAgICBwYXJhbUxpc3Qgfj0gKChzdG9yYWdlICYgUGFyYW1ldGVyU3RvcmFnZUNsYXNzLnJlZl8pID8gInJlZiAiIDogIiIpIH4KKyAgICAgICAgICAgICJQYXJhbWV0ZXJUeXBlVHVwbGUhKEludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSB+ICIpWyIgfgorICAgICAgICAgICAgdG8hc3RyaW5nKGkpIH4gIl0gIiB+IHBhcmFtTmFtZTsKKyAgICAgICAgICBwYXJhbUFzc2lnbkNvZGUgfj0gImFyZ3MuIiB+IHBhcmFtTmFtZSB+ICIgPSAmIiB+IHBhcmFtTmFtZSB+ICI7XG4iOworICAgICAgICB9CisgICAgICAgIGNvZGUgfj0gIlJldHVyblR5cGUhKEludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSB+ICIpICIgfiBtZXRob2ROYW1lIH4KKyAgICAgICAgICAiKCIgfiBjdGZlSm9pbihwYXJhbUxpc3QpIH4gIikge1xuIjsKKworICAgICAgICBjb2RlIH49ICJpbW11dGFibGUgbWV0aG9kTmFtZSA9IGAiIH4gbWV0aG9kTmFtZSB+ICJgO1xuIjsKKworICAgICAgICBpbW11dGFibGUgcGFyYW1TdHJ1Y3RUeXBlID0KKyAgICAgICAgICAiVFBhcmdzU3RydWN0IShJbnRlcmZhY2UsIGAiIH4gbWV0aG9kTmFtZSB+ICJgKSI7CisgICAgICAgIGNvZGUgfj0gcGFyYW1TdHJ1Y3RUeXBlIH4gIiBhcmdzID0gIiB+IHBhcmFtU3RydWN0VHlwZSB+ICIoKTtcbiI7CisgICAgICAgIGNvZGUgfj0gcGFyYW1Bc3NpZ25Db2RlOworICAgICAgICBjb2RlIH49ICJvcHJvdF8ud3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UoYCIgfiBtZXRob2ROYW1lIH4gImAsICI7CisgICAgICAgIGNvZGUgfj0gKChtZXRob2RNZXRhRm91bmQgJiYgbWV0aG9kTWV0YS50eXBlID09IFRNZXRob2RUeXBlLk9ORVdBWSkKKyAgICAgICAgICAgICAgICAgPyAiVE1lc3NhZ2VUeXBlLk9ORVdBWSIgOiAiVE1lc3NhZ2VUeXBlLkNBTEwiKTsKKyAgICAgICAgY29kZSB+PSAiLCArK3NlcWlkXykpO1xuIjsKKyAgICAgICAgY29kZSB+PSAiYXJncy53cml0ZShvcHJvdF8pO1xuIjsKKyAgICAgICAgY29kZSB+PSAib3Byb3RfLndyaXRlTWVzc2FnZUVuZCgpO1xuIjsKKyAgICAgICAgY29kZSB+PSAib3Byb3RfLnRyYW5zcG9ydC5mbHVzaCgpO1xuIjsKKworICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIG9uZXdheSBtZXRob2QsIGdlbmVyYXRlIHRoZSByZWNlaXZpbmcgY29kZS4KKyAgICAgICAgaWYgKCFtZXRob2RNZXRhRm91bmQgfHwgbWV0aG9kTWV0YS50eXBlICE9IFRNZXRob2RUeXBlLk9ORVdBWSkgeworICAgICAgICAgIGNvZGUgfj0gIlRQcmVzdWx0U3RydWN0IShJbnRlcmZhY2UsIGAiIH4gbWV0aG9kTmFtZSB+ICJgKSByZXN1bHQ7XG4iOworCisgICAgICAgICAgaWYgKCFpcyhSZXR1cm5UeXBlIShtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkgPT0gdm9pZCkpIHsKKyAgICAgICAgICAgIGNvZGUgfj0gIlJldHVyblR5cGUhKEludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSB+ICIpIF9yZXR1cm47XG4iOworICAgICAgICAgICAgY29kZSB+PSAicmVzdWx0LnN1Y2Nlc3MgPSAmX3JldHVybjtcbiI7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gVE9ETzogVGhlIEMrKyBpbXBsZW1lbnRhdGlvbiBjaGVja3MgZm9yIG1hdGNoaW5nIG1ldGhvZCBuYW1lIGhlcmUsCisgICAgICAgICAgLy8gc2hvdWxkIHdlIGRvIGFzIHdlbGw/CisgICAgICAgICAgY29kZSB+PSBxeworICAgICAgICAgICAgYXV0byBtc2cgPSBpcHJvdF8ucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgICAgICAgc2NvcGUgKGV4aXQpIHsKKyAgICAgICAgICAgICAgaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7CisgICAgICAgICAgICAgIGlwcm90Xy50cmFuc3BvcnQucmVhZEVuZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeworICAgICAgICAgICAgICBhdXRvIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKG51bGwpOworICAgICAgICAgICAgICB4LnJlYWQoaXByb3RfKTsKKyAgICAgICAgICAgICAgaXByb3RfLnRyYW5zcG9ydC5yZWFkRW5kKCk7CisgICAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobXNnLnR5cGUgIT0gVE1lc3NhZ2VUeXBlLlJFUExZKSB7CisgICAgICAgICAgICAgIHNraXAoaXByb3RfLCBUVHlwZS5TVFJVQ1QpOworICAgICAgICAgICAgICBpcHJvdF8udHJhbnNwb3J0LnJlYWRFbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtc2cuc2VxaWQgIT0gc2VxaWRfKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSB+ICIgZmFpbGVkOiBPdXQgb2Ygc2VxdWVuY2UgcmVzcG9uc2UuIiwKKyAgICAgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uVHlwZS5CQURfU0VRVUVOQ0VfSUQKKyAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5yZWFkKGlwcm90Xyk7CisgICAgICAgICAgfTsKKworICAgICAgICAgIGlmIChtZXRob2RNZXRhRm91bmQpIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKGU7IG1ldGhvZE1ldGEuZXhjZXB0aW9ucykgeworICAgICAgICAgICAgICBjb2RlIH49ICJpZiAocmVzdWx0LmlzU2V0IWAiIH4gZS5uYW1lIH4gImApIHRocm93IHJlc3VsdC4iIH4KKyAgICAgICAgICAgICAgICBlLm5hbWUgfiAiO1xuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWlzKFJldHVyblR5cGUhKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSA9PSB2b2lkKSkgeworICAgICAgICAgICAgY29kZSB+PSBxeworICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzU2V0IWBzdWNjZXNzYCkgcmV0dXJuIF9yZXR1cm47CisgICAgICAgICAgICAgIHRocm93IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSB+ICIgZmFpbGVkOiBVbmtub3duIHJlc3VsdC4iLAorICAgICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5UeXBlLk1JU1NJTkdfUkVTVUxUCisgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb2RlIH49ICJ9XG4iOworICAgICAgfQorICAgIH0KKworICAgIGNvZGUgfj0gIn1cbiI7CisgICAgcmV0dXJuIGNvZGU7CisgIH0oKSk7Cit9CisKKy8qKgorICogVENsaWVudCBjb25zdHJ1Y3Rpb24gaGVscGVyIHRvIGF2b2lkIGhhdmluZyB0byBleHBsaWNpdGx5IHNwZWNpZnkKKyAqIHRoZSBwcm90b2NvbCB0eXBlcywgaS5lLiB0byBhbGxvdyB0aGUgY29uc3RydWN0b3IgYmVpbmcgY2FsbGVkIHVzaW5nIElGVEkKKyAqIChzZWUgJChETURCVUcgNjA4MiwgRCBCdWd6aWxsYSBlbmhhbmNlbWVudCByZXF1ZXQgNjA4MikpLgorICovCitUQ2xpZW50IShJbnRlcmZhY2UsIFByb3QpIHRDbGllbnQoSW50ZXJmYWNlLCBQcm90KShQcm90IHByb3QpIGlmICgKKyAgaXNTZXJ2aWNlIUludGVyZmFjZSAmJiBpc1RQcm90b2NvbCFQcm90CispIHsKKyAgcmV0dXJuIG5ldyBUQ2xpZW50IShJbnRlcmZhY2UsIFByb3QpKHByb3QpOworfQorCisvLy8gRGl0dG8KK1RDbGllbnQhKEludGVyZmFjZSwgSVByb3QsIE9wcm90KSB0Q2xpZW50KEludGVyZmFjZSwgSVByb3QsIE9Qcm90KQorICAoSVByb3QgaXByb3QsIE9Qcm90IG9wcm90KSBpZiAoCisgIGlzU2VydmljZSFJbnRlcmZhY2UgJiYgaXNUUHJvdG9jb2whSVByb3QgJiYgaXNUUHJvdG9jb2whT1Byb3QKKykgeworICByZXR1cm4gbmV3IFRDbGllbnQhKEludGVyZmFjZSwgSVByb3QsIE9Qcm90KShpcHJvdCwgb3Byb3QpOworfQorCisvKioKKyAqIFJlcHJlc2VudHMgdGhlIGFyZ3VtZW50cyBvZiBhIFRocmlmdCBtZXRob2QgY2FsbCwgYXMgcG9pbnRlcnMgdG8gdGhlIChjb25zdCkKKyAqIHBhcmFtZXRlciB0eXBlIHRvIGF2b2lkIGNvcHlpbmcuCisgKgorICogVGhlcmUgc2hvdWxkIHVzdWFsbHkgYmUgbm8gcmVhc29uIHRvIHVzZSB0aGlzIHN0cnVjdCBkaXJlY3RseSB3aXRob3V0IHRoZQorICogaGVscCBvZiBUQ2xpZW50LCBidXQgaXQgaXMgZG9jdW1lbnRlZCBwdWJsaWNseSB0byBoZWxwIGRlYnVnZ2luZyBpbiBjYXNlCisgKiBvZiBDVEZFIGVycm9ycy4KKyAqCisgKiBDb25zaWRlciB0aGlzIGV4YW1wbGU6CisgKiAtLS0KKyAqIGludGVyZmFjZSBGb28geworICogICBpbnQgYmFyKHN0cmluZyBhLCBib29sIGIpOworICoKKyAqICAgZW51bSBtZXRob2RNZXRhID0gWworICogICAgIFRNZXRob2RNZXRhKCJiYXIiLCBbVFBhcmFtTWV0YSgiYSIsIDEpLCBUUGFyYW1NZXRhKCJiIiwgMildKQorICogICBdOworICogfQorICoKKyAqIGFsaWFzIFRQYXJnc1N0cnVjdCEoRm9vLCAiYmFyIikgRm9vQmFyUGFyZ3M7CisgKiAtLS0KKyAqCisgKiBUaGUgZGVmaW5pdGlvbiBvZiBGb29CYXJQYXJncyBpcyBlcXVpdmFsZW50IHRvIChpZ25vcmluZyB0aGUgbmVjZXNzYXJ5CisgKiBtZXRhZGF0YSB0byBhc3NpZ24gdGhlIGZpZWxkIElEcyk6CisgKiAtLS0KKyAqIHN0cnVjdCBGb29CYXJQYXJncyB7CisgKiAgIGNvbnN0KHN0cmluZykqIGE7CisgKiAgIGNvbnN0KGJvb2wpKiBiOworICoKKyAqICAgdm9pZCB3cml0ZShQcm90b2NvbCkoUHJvdG9jb2wgcHJvdG8pIGNvbnN0IGlmIChpc1RQcm90b2NvbCFQcm90b2NvbCk7CisgKiB9CisgKiAtLS0KKyAqLwordGVtcGxhdGUgVFBhcmdzU3RydWN0KEludGVyZmFjZSwgc3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgc3RhdGljIGFzc2VydChpcyh0eXBlb2YobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpKSwKKyAgICAiQ291bGQgbm90IGZpbmQgbWV0aG9kICciIH4gbWV0aG9kTmFtZSB+ICInIGluICciIH4gSW50ZXJmYWNlLnN0cmluZ29mIH4gIicuIik7CisgIG1peGluKHsKKyAgICBib29sIG1ldGhvZE1ldGFGb3VuZDsKKyAgICBUTWV0aG9kTWV0YSBtZXRob2RNZXRhOworICAgIHN0YXRpYyBpZiAoaXModHlwZW9mKEludGVyZmFjZS5tZXRob2RNZXRhKSA6IFRNZXRob2RNZXRhW10pKSB7CisgICAgICBhdXRvIG1ldGEgPSBmaW5kIWBhLm5hbWUgPT0gYmAoSW50ZXJmYWNlLm1ldGhvZE1ldGEsIG1ldGhvZE5hbWUpOworICAgICAgaWYgKCFtZXRhLmVtcHR5KSB7CisgICAgICAgIG1ldGhvZE1ldGFGb3VuZCA9IHRydWU7CisgICAgICAgIG1ldGhvZE1ldGEgPSBtZXRhLmZyb250OworICAgICAgfQorICAgIH0KKworICAgIHN0cmluZyBtZW1iZXJDb2RlOworICAgIHN0cmluZ1tdIGZpZWxkTWV0YUNvZGVzOworICAgIGZvcmVhY2ggKGksIF87IFBhcmFtZXRlclR5cGVUdXBsZSEobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpKSB7CisgICAgICAvLyBJZiB3ZSBoYXZlIG5vIG1ldGEgaW5mb3JtYXRpb24sIGp1c3QgdXNlIHBhcmFtMSwgcGFyYW0yLCBldGMuIGFzCisgICAgICAvLyBmaWVsZCBuYW1lcywgaXQgc2hvdWxkbid0IHJlYWxseSBtYXR0ZXIgYW55d2F5LiAxLWJhc2VkIMK7aW5kZXhpbmfCqworICAgICAgLy8gaXMgdXNlZCB0byBtYXRjaCB0aGUgY29tbW9uIHNjaGVtZSBpbiB0aGUgVGhyaWZ0IHdvcmxkLgorICAgICAgc3RyaW5nIG1lbWJlcklkOworICAgICAgc3RyaW5nIG1lbWJlck5hbWU7CisgICAgICBpZiAobWV0aG9kTWV0YUZvdW5kICYmIGkgPCBtZXRob2RNZXRhLnBhcmFtcy5sZW5ndGgpIHsKKyAgICAgICAgbWVtYmVySWQgPSB0byFzdHJpbmcobWV0aG9kTWV0YS5wYXJhbXNbaV0uaWQpOworICAgICAgICBtZW1iZXJOYW1lID0gbWV0aG9kTWV0YS5wYXJhbXNbaV0ubmFtZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWJlcklkID0gdG8hc3RyaW5nKGkgKyAxKTsKKyAgICAgICAgbWVtYmVyTmFtZSA9ICJwYXJhbSIgfiB0byFzdHJpbmcoaSArIDEpOworICAgICAgfQorCisgICAgICAvLyBXb3JrYXJvdW5kIGZvciBETUQgQEBCVUdAQCA2MDU2OiBtYWtlIGFuIGludGVybWVkaWFyeSBhbGlhcyBmb3IgdGhlCisgICAgICAvLyBwYXJhbWV0ZXIgdHlwZSwgYW5kIGRlY2xhcmUgdGhlIG1lbWJlciB1c2luZyBjb25zdChtZW1iZXJOYW1lVHlwZSkqLgorICAgICAgbWVtYmVyQ29kZSB+PSAiYWxpYXMgUGFyYW1ldGVyVHlwZVR1cGxlIShJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUgfgorICAgICAgICAiKVsiIH4gdG8hc3RyaW5nKGkpIH4gIl0gIiB+IG1lbWJlck5hbWUgfiAiVHlwZTtcbiI7CisgICAgICBtZW1iZXJDb2RlIH49ICJjb25zdCgiIH4gbWVtYmVyTmFtZSB+ICJUeXBlKSogIiB+IG1lbWJlck5hbWUgfiAiO1xuIjsKKworICAgICAgZmllbGRNZXRhQ29kZXMgfj0gIlRGaWVsZE1ldGEoYCIgfiBtZW1iZXJOYW1lIH4gImAsICIgfiBtZW1iZXJJZCB+CisgICAgICAgICIsIFRSZXEuT1BUX0lOX1JFUV9PVVQpIjsKKyAgICB9CisKKyAgICBzdHJpbmcgY29kZSA9ICJzdHJ1Y3QgVFBhcmdzU3RydWN0IHtcbiI7CisgICAgY29kZSB+PSBtZW1iZXJDb2RlOworICAgIHZlcnNpb24gKFRWZXJib3NlQ29kZWdlbikgeworICAgICAgaWYgKCFtZXRob2RNZXRhRm91bmQgJiYKKyAgICAgICAgUGFyYW1ldGVyVHlwZVR1cGxlIShtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkubGVuZ3RoID4gMCkKKyAgICAgIHsKKyAgICAgICAgY29kZSB+PSAicHJhZ21hKG1zZywgYFt0aHJpZnQuY29kZWdlbi5iYXNlLlRQYXJnc1N0cnVjdF0gV2FybmluZzogTm8gIiB+CisgICAgICAgICAgIm1ldGEgaW5mb3JtYXRpb24gZm9yIG1ldGhvZCAnIiB+IG1ldGhvZE5hbWUgfiAiJyBpbiBzZXJ2aWNlICciIH4KKyAgICAgICAgICBJbnRlcmZhY2Uuc3RyaW5nb2YgfiAiJyBmb3VuZC5gKTtcbiI7CisgICAgICB9CisgICAgfQorICAgIGNvZGUgfj0gInZvaWQgd3JpdGUoUCkoUCBwcm90bykgY29uc3QgaWYgKGlzVFByb3RvY29sIVApIHtcbiI7CisgICAgY29kZSB+PSAid3JpdGVTdHJ1Y3QhKHR5cGVvZih0aGlzKSwgUCwgWyIgfiBjdGZlSm9pbihmaWVsZE1ldGFDb2RlcykgfgorICAgICAgIl0sIHRydWUpKHRoaXMsIHByb3RvKTtcbiI7CisgICAgY29kZSB+PSAifVxuIjsKKyAgICBjb2RlIH49ICJ9XG4iOworICAgIHJldHVybiBjb2RlOworICB9KCkpOworfQorCisvKioKKyAqIFJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBhIFRocmlmdCBtZXRob2QgY2FsbCwgdXNpbmcgYSBwb2ludGVyIHRvIHRoZSByZXR1cm4KKyAqIHZhbHVlIHRvIGF2b2lkIGNvcHlpbmcuCisgKgorICogVGhlcmUgc2hvdWxkIHVzdWFsbHkgYmUgbm8gcmVhc29uIHRvIHVzZSB0aGlzIHN0cnVjdCBkaXJlY3RseSB3aXRob3V0IHRoZQorICogaGVscCBvZiBUQ2xpZW50LCBidXQgaXQgaXMgZG9jdW1lbnRlZCBwdWJsaWNseSB0byBoZWxwIGRlYnVnZ2luZyBpbiBjYXNlCisgKiBvZiBDVEZFIGVycm9ycy4KKyAqCisgKiBDb25zaWRlciB0aGlzIGV4YW1wbGU6CisgKiAtLS0KKyAqIGludGVyZmFjZSBGb28geworICogICBpbnQgYmFyKHN0cmluZyBhKTsKKyAqCisgKiAgIGFsaWFzIC5Gb29FeGNlcHRpb24gRm9vRXhjZXB0aW9uOworICoKKyAqICAgZW51bSBtZXRob2RNZXRhID0gWworICogICAgIFRNZXRob2RNZXRhKCJiYXIiLAorICogICAgICAgW1RQYXJhbU1ldGEoImEiLCAxKV0sCisgKiAgICAgICBbVEV4Y2VwdGlvbk1ldGEoImZvb2UiLCAxLCAiRm9vRXhjZXB0aW9uIildCisgKiAgICAgKQorICogICBdOworICogfQorICogYWxpYXMgVFByZXN1bHRTdHJ1Y3QhKEZvbywgImJhciIpIEZvb0JhclByZXN1bHQ7CisgKiAtLS0KKyAqCisgKiBUaGUgZGVmaW5pdGlvbiBvZiBGb29CYXJQcmVzdWx0IGlzIGVxdWl2YWxlbnQgdG8gKGlnbm9yaW5nIHRoZSBuZWNlc3NhcnkKKyAqIG1ldGFkYXRhIHRvIGFzc2lnbiB0aGUgZmllbGQgSURzKToKKyAqIC0tLQorICogc3RydWN0IEZvb0JhclByZXN1bHQgeworICogICBpbnQqIHN1Y2Nlc3M7CisgKiAgIEZvby5Gb29FeGNlcHRpb24gZm9vZTsKKyAqCisgKiAgIHN0cnVjdCBJc1NldEZsYWdzIHsKKyAqICAgICBib29sIHN1Y2Nlc3M7CisgKiAgIH0KKyAqICAgSXNTZXRGbGFncyBpc1NldEZsYWdzOworICoKKyAqICAgYm9vbCBpc1NldChzdHJpbmcgZmllbGROYW1lKSgpIGNvbnN0IEBwcm9wZXJ0eTsKKyAqICAgdm9pZCByZWFkKFByb3RvY29sKShQcm90b2NvbCBwcm90bykgaWYgKGlzVFByb3RvY29sIVByb3RvY29sKTsKKyAqIH0KKyAqIC0tLQorICovCit0ZW1wbGF0ZSBUUHJlc3VsdFN0cnVjdChJbnRlcmZhY2UsIHN0cmluZyBtZXRob2ROYW1lKSB7CisgIHN0YXRpYyBhc3NlcnQoaXModHlwZW9mKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSksCisgICAgIkNvdWxkIG5vdCBmaW5kIG1ldGhvZCAnIiB+IG1ldGhvZE5hbWUgfiAiJyBpbiAnIiB+IEludGVyZmFjZS5zdHJpbmdvZiB+ICInLiIpOworCisgIG1peGluKHsKKyAgICBzdHJpbmcgY29kZSA9ICJzdHJ1Y3QgVFByZXN1bHRTdHJ1Y3Qge1xuIjsKKworICAgIHN0cmluZ1tdIGZpZWxkTWV0YUNvZGVzOworCisgICAgYWxpYXMgUmV0dXJuVHlwZSEobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpIFJlc3VsdFR5cGU7CisgICAgc3RhdGljIGlmICghaXMoUmVzdWx0VHlwZSA9PSB2b2lkKSkgeworICAgICAgY29kZSB+PSBxeworICAgICAgICBSZXR1cm5UeXBlIShtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkqIHN1Y2Nlc3M7CisgICAgICB9OworICAgICAgZmllbGRNZXRhQ29kZXMgfj0gIlRGaWVsZE1ldGEoYHN1Y2Nlc3NgLCAwLCBUUmVxLk9QVElPTkFMKSI7CisKKyAgICAgIHN0YXRpYyBpZiAoIWlzTnVsbGFibGUhUmVzdWx0VHlwZSkgeworICAgICAgICBjb2RlIH49IHF7CisgICAgICAgICAgc3RydWN0IElzU2V0RmxhZ3MgeworICAgICAgICAgICAgYm9vbCBzdWNjZXNzOworICAgICAgICAgIH0KKyAgICAgICAgICBJc1NldEZsYWdzIGlzU2V0RmxhZ3M7CisgICAgICAgIH07CisgICAgICAgIGZpZWxkTWV0YUNvZGVzIH49ICJURmllbGRNZXRhKGBpc1NldEZsYWdzYCwgMCwgVFJlcS5JR05PUkUpIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBib29sIG1ldGhvZE1ldGFGb3VuZDsKKyAgICBzdGF0aWMgaWYgKGlzKHR5cGVvZihJbnRlcmZhY2UubWV0aG9kTWV0YSkgOiBUTWV0aG9kTWV0YVtdKSkgeworICAgICAgYXV0byBtZXRhID0gZmluZCFgYS5uYW1lID09IGJgKEludGVyZmFjZS5tZXRob2RNZXRhLCBtZXRob2ROYW1lKTsKKyAgICAgIGlmICghbWV0YS5lbXB0eSkgeworICAgICAgICBmb3JlYWNoIChlOyBtZXRhLmZyb250LmV4Y2VwdGlvbnMpIHsKKyAgICAgICAgICBjb2RlIH49ICJJbnRlcmZhY2UuIiB+IGUudHlwZSB+ICIgIiB+IGUubmFtZSB+ICI7XG4iOworICAgICAgICAgIGZpZWxkTWV0YUNvZGVzIH49ICJURmllbGRNZXRhKGAiIH4gZS5uYW1lIH4gImAsICIgfiB0byFzdHJpbmcoZS5pZCkgfgorICAgICAgICAgICAgIiwgVFJlcS5PUFRJT05BTCkiOworICAgICAgICB9CisgICAgICAgIG1ldGhvZE1ldGFGb3VuZCA9IHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgdmVyc2lvbiAoVFZlcmJvc2VDb2RlZ2VuKSB7CisgICAgICBpZiAoIW1ldGhvZE1ldGFGb3VuZCAmJgorICAgICAgICBQYXJhbWV0ZXJUeXBlVHVwbGUhKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKS5sZW5ndGggPiAwKQorICAgICAgeworICAgICAgICBjb2RlIH49ICJwcmFnbWEobXNnLCBgW3RocmlmdC5jb2RlZ2VuLmJhc2UuVFByZXN1bHRTdHJ1Y3RdIFdhcm5pbmc6IE5vICIgfgorICAgICAgICAgICJtZXRhIGluZm9ybWF0aW9uIGZvciBtZXRob2QgJyIgfiBtZXRob2ROYW1lIH4gIicgaW4gc2VydmljZSAnIiB+CisgICAgICAgICAgSW50ZXJmYWNlLnN0cmluZ29mIH4gIicgZm91bmQuYCk7XG4iOworICAgICAgfQorICAgIH0KKworICAgIGNvZGUgfj0gcXsKKyAgICAgIGJvb2wgaXNTZXQoc3RyaW5nIGZpZWxkTmFtZSkoKSBjb25zdCBAcHJvcGVydHkgaWYgKAorICAgICAgICBpcyhNZW1iZXJUeXBlISh0eXBlb2YodGhpcyksIGZpZWxkTmFtZSkpCisgICAgICApIHsKKyAgICAgICAgc3RhdGljIGlmIChmaWVsZE5hbWUgPT0gInN1Y2Nlc3MiKSB7CisgICAgICAgICAgc3RhdGljIGlmIChpc051bGxhYmxlISh0eXBlb2YoKnN1Y2Nlc3MpKSkgeworICAgICAgICAgICAgcmV0dXJuICpzdWNjZXNzICFpcyBudWxsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gaXNTZXRGbGFncy5zdWNjZXNzOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBXZSBhcmUgZGVhbGluZyB3aXRoIGFuIGV4Y2VwdGlvbiBtZW1iZXIsIHdoaWNoLCBiZWluZyBhIG51bGxhYmxlCisgICAgICAgICAgLy8gdHlwZSAoZXhjZXB0aW9ucyBhcmUgYWx3YXlzIGNsYXNzZXMpLCBoYXMgbm8gaXNTZXQgZmxhZy4KKyAgICAgICAgICByZXR1cm4gX190cmFpdHMoZ2V0TWVtYmVyLCB0aGlzLCBmaWVsZE5hbWUpICFpcyBudWxsOworICAgICAgICB9CisgICAgICB9CisgICAgfTsKKworICAgIGNvZGUgfj0gInZvaWQgcmVhZChQKShQIHByb3RvKSBpZiAoaXNUUHJvdG9jb2whUCkge1xuIjsKKyAgICBjb2RlIH49ICJyZWFkU3RydWN0ISh0eXBlb2YodGhpcyksIFAsIFsiIH4gY3RmZUpvaW4oZmllbGRNZXRhQ29kZXMpIH4KKyAgICAgICJdLCB0cnVlKSh0aGlzLCBwcm90byk7XG4iOworICAgIGNvZGUgfj0gIn1cbiI7CisgICAgY29kZSB+PSAifVxuIjsKKyAgICByZXR1cm4gY29kZTsKKyAgfSgpKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9jbGllbnRfcG9vbC5kIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2NsaWVudF9wb29sLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ2Yjc0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9jbGllbnRfcG9vbC5kCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LmNvZGVnZW4uY2xpZW50X3Bvb2w7CisKK2ltcG9ydCBjb3JlLnRpbWUgOiBkdXIsIER1cmF0aW9uLCBUaWNrRHVyYXRpb247CitpbXBvcnQgc3RkLnRyYWl0cyA6IFBhcmFtZXRlclR5cGVUdXBsZSwgUmV0dXJuVHlwZTsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5iYXNlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmNsaWVudDsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuY29kZWdlbjsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwucmVzb3VyY2VfcG9vbDsKKworLyoqCisgKiBNYW5hZ2VzIGEgcG9vbCBvZiBUQ2xpZW50cyBmb3IgdGhlIGdpdmVuIGludGVyZmFjZSwgZm9yd2FyZGluZyBSUEMgY2FsbHMgdG8KKyAqIG1lbWJlcnMgb2YgdGhlIHBvb2wuCisgKgorICogSWYgYSByZXF1ZXN0IGZhaWxzLCBhbm90aGVyIGNsaWVudCBmcm9tIHRoZSBwb29sIGlzIHRyaWVkLCBhbmQgb3B0aW9uYWxseSwKKyAqIGEgY2xpZW50IGlzIGRpc2FibGVkIGZvciBhIGNvbmZpZ3VyYWJsZSBhbW91bnQgb2YgdGltZSBpZiBpdCBmYWlscyB0b28KKyAqIG9mdGVuLiBJZiBhbGwgY2xpZW50cyBmYWlsIChhbmQga2VlcFRyeWluZyBpcyBmYWxzZSksIGEKKyAqIFRDb21wb3VuZE9wZXJhdGlvbkV4Y2VwdGlvbiBpcyB0aHJvd24sIGNvbnRhaW5pbmcgYWxsIHRoZSBjb2xsZWN0ZWQgUlBDCisgKiBleGNlcHRpb25zLgorICovCitjbGFzcyBUQ2xpZW50UG9vbChJbnRlcmZhY2UpIGlmIChpc1NlcnZpY2UhSW50ZXJmYWNlKSA6IEludGVyZmFjZSB7CisgIC8vLyBTaG9ydGhhbmQgZm9yIFRDbGllbnRCYXNlIUludGVyZmFjZSwgdGhlIGNsaWVudCB0eXBlIHRoaXMgaW5zdGFuY2UKKyAgLy8vIG9wZXJhdGVzIG9uLgorICBhbGlhcyBUQ2xpZW50QmFzZSFJbnRlcmZhY2UgQ2xpZW50OworCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGFuZCBhZGRzIHRoZSBnaXZlbiBjbGllbnRzIHRvIHRoZSBwb29sLgorICAgKi8KKyAgdGhpcyhDbGllbnRbXSBjbGllbnRzKSB7CisgICAgcG9vbF8gPSBuZXcgVFJlc291cmNlUG9vbCFDbGllbnQoY2xpZW50cyk7CisKKyAgICBycGNGYXVsdEZpbHRlciA9IChFeGNlcHRpb24gZSkgeworICAgICAgaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworICAgICAgaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKKyAgICAgIHJldHVybiAoCisgICAgICAgIChjYXN0KFRUcmFuc3BvcnRFeGNlcHRpb24pZSAhaXMgbnVsbCkgfHwKKyAgICAgICAgKGNhc3QoVEFwcGxpY2F0aW9uRXhjZXB0aW9uKWUgIWlzIG51bGwpCisgICAgICApOworICAgIH07CisgIH0KKworICAvKioKKyAgICogRXhlY3V0ZXMgYW4gb3BlcmF0aW9uIG9uIHRoZSBmaXJzdCBjdXJyZW50bHkgYWN0aXZlIGNsaWVudC4KKyAgICoKKyAgICogSWYgdGhlIG9wZXJhdGlvbiBmYWlscyAodGhyb3dzIGFuIGV4Y2VwdGlvbiBmb3Igd2hpY2ggcnBjRmF1bHRGaWx0ZXIgaXMKKyAgICogdHJ1ZSksIHRoZSBmYWlsdXJlIGlzIHJlY29yZGVkIGFuZCB0aGUgbmV4dCBjbGllbnQgaW4gdGhlIHBvb2wgaXMgdHJpZWQuCisgICAqCisgICAqIFRocm93czogQW55IG5vbi1ycGMgZXhjZXB0aW9uIHRoYXQgb2NjdXJzLCBhIFRDb21wb3VuZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgKiAgIGlmIGFsbCBjbGllbnRzIGZhaWxlZCB3aXRoIGFuIHJwYyBleGNlcHRpb24gKGlmIGtlZXBUcnlpbmcgaXMgZmFsc2UpLgorICAgKgorICAgKiBFeGFtcGxlOgorICAgKiAtLS0KKyAgICogaW50ZXJmYWNlIEZvbyB7IHN0cmluZyBiYXIoKTsgfQorICAgKiBhdXRvIHBvb2xDbGllbnQgPSB0Q2xpZW50UG9vbChbdENsaWVudCFGb28oc29tZVByb3RvY29sKV0pOworICAgKiBhdXRvIHJlc3VsdCA9IHBvb2xDbGllbnQuZXhlY3V0ZSgoYyl7IHJldHVybiBjLmJhcigpOyB9KTsKKyAgICogLS0tCisgICAqLworICBSZXN1bHRUeXBlIGV4ZWN1dGUoUmVzdWx0VHlwZSkoc2NvcGUgUmVzdWx0VHlwZSBkZWxlZ2F0ZShDbGllbnQpIHdvcmspIHsKKyAgICByZXR1cm4gZXhlY3V0ZU9uUG9vbCFDbGllbnQod29yayk7CisgIH0KKworICAvKioKKyAgICogQWRkcyBhIGNsaWVudCB0byB0aGUgcG9vbC4KKyAgICovCisgIHZvaWQgYWRkQ2xpZW50KENsaWVudCBjbGllbnQpIHsKKyAgICBwb29sXy5hZGQoY2xpZW50KTsKKyAgfQorCisgIC8qKgorICAgKiBSZW1vdmVzIGEgY2xpZW50IGZyb20gdGhlIHBvb2wuCisgICAqCisgICAqIFJldHVybnM6IFdoZXRoZXIgdGhlIGNsaWVudCB3YXMgZm91bmQgaW4gdGhlIHBvb2wuCisgICAqLworICBib29sIHJlbW92ZUNsaWVudChDbGllbnQgY2xpZW50KSB7CisgICAgcmV0dXJuIHBvb2xfLnJlbW92ZShjbGllbnQpOworICB9CisKKyAgbWl4aW4ocG9vbEZvcndhcmRDb2RlIUludGVyZmFjZSgpKTsKKworICAvLy8gV2hldGhlciB0byBvcGVuIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydHMgb2YgYSBjbGllbnQgYmVmb3JlIHRyeWluZyB0bworICAvLy8gZXhlY3V0ZSBhIG1ldGhvZCBpZiB0aGV5IGFyZSBub3Qgb3Blbi4gVGhpcyBpcyB1c3VhbGx5IGRlc2lyYWJsZQorICAvLy8gYmVjYXVzZSBpdCBhbGxvd3MgZS5nLiB0byBhdXRvbWF0aWNhbGx5IHJlY29ubmVjdCB0byBhIHJlbW90ZSBzZXJ2ZXIKKyAgLy8vIGlmIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gaXMgZHJvcHBlZC4KKyAgLy8vCisgIC8vLyBEZWZhdWx0cyB0byB0cnVlLgorICBib29sIHJlb3BlblRyYW5zcG9ydHMgPSB0cnVlOworCisgIC8vLyBDYWxsZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gZXhjZXB0aW9uIGNvbWVzIGZyb20gYSBjbGllbnQgZnJvbSB0aGUKKyAgLy8vIHBvb2wgbm90IHdvcmtpbmcgcHJvcGVybHksIG9yIGlmIGl0IGFuIGV4Y2VwdGlvbiB0aHJvd24gYXQgdGhlCisgIC8vLyBhcHBsaWNhdGlvbiBsZXZlbC4KKyAgLy8vCisgIC8vLyBJZiB0aGUgZGVsZWdhdGUgcmV0dXJucyB0cnVlLCB0aGUgc2VydmVyL2Nvbm5lY3Rpb24gaXMgY29uc2lkZXJlZCB0byBiZQorICAvLy8gYXQgZmF1bHQsIGlmIGl0IHJldHVybnMgZmFsc2UsIHRoZSBleGNlcHRpb24gaXMganVzdCBwYXNzZWQgb24gdG8gdGhlCisgIC8vLyBjYWxsZXIuCisgIC8vLworICAvLy8gQnkgZGVmYXVsdCwgcmV0dXJucyB0cnVlIGZvciBpbnN0YW5jZXMgb2YgVFRyYW5zcG9ydEV4Y2VwdGlvbiBhbmQKKyAgLy8vIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIGRlbGVnYXRlKEV4Y2VwdGlvbikgcnBjRmF1bHRGaWx0ZXI7CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8ga2VlcCB0cnlpbmcgdG8gZmluZCBhIHdvcmtpbmcgY2xpZW50IGlmIGFsbCBoYXZlIGZhaWxlZCBpbiBhCisgICAqIHJvdy4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gZmFsc2UuCisgICAqLworICBib29sIGtlZXBUcnlpbmcoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBwb29sXy5jeWNsZTsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIGtlZXBUcnlpbmcoYm9vbCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBwb29sXy5jeWNsZSA9IHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gdXNlIGEgcmFuZG9tIHBlcm11dGF0aW9uIG9mIHRoZSBjbGllbnQgcG9vbCBvbiBldmVyeSBjYWxsIHRvCisgICAqIGV4ZWN1dGUoKS4gVGhpcyBjYW4gYmUgdXNlZCBlLmcuIGFzIGEgc2ltcGxlIGZvcm0gb2YgbG9hZCBiYWxhbmNpbmcuCisgICAqCisgICAqIERlZmF1bHRzIHRvIHRydWUuCisgICAqLworICBib29sIHBlcm11dGVDbGllbnRzKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcG9vbF8ucGVybXV0ZTsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIHBlcm11dGVDbGllbnRzKGJvb2wgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgcG9vbF8ucGVybXV0ZSA9IHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIFRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgZmF1bHRzIGFmdGVyIHdoaWNoIGEgY2xpZW50IGlzIGRpc2FibGVkIHVudGlsCisgICAqIGZhdWx0RGlzYWJsZUR1cmF0aW9uIGhhcyBwYXNzZWQuIDAgdG8gbmV2ZXIgZGlzYWJsZSBjbGllbnRzLgorICAgKgorICAgKiBEZWZhdWx0cyB0byAwLgorICAgKi8KKyAgdXNob3J0IGZhdWx0RGlzYWJsZUNvdW50KCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcG9vbF8uZmF1bHREaXNhYmxlQ291bnQ7CisgIH0KKworICAvLy8gRGl0dG8KKyAgdm9pZCBmYXVsdERpc2FibGVDb3VudCh1c2hvcnQgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgcG9vbF8uZmF1bHREaXNhYmxlQ291bnQgPSB2YWx1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgZHVyYXRpb24gZm9yIHdoaWNoIGEgY2xpZW50IGlzIG5vIGxvbmdlciBjb25zaWRlcmVkIGFmdGVyIGl0IGhhcworICAgKiBmYWlsZWQgdG9vIG9mdGVuLgorICAgKgorICAgKiBEZWZhdWx0cyB0byBvbmUgc2Vjb25kLgorICAgKi8KKyAgRHVyYXRpb24gZmF1bHREaXNhYmxlRHVyYXRpb24oKSBAcHJvcGVydHkgeworICAgIHJldHVybiBwb29sXy5mYXVsdERpc2FibGVEdXJhdGlvbjsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIGZhdWx0RGlzYWJsZUR1cmF0aW9uKER1cmF0aW9uIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHBvb2xfLmZhdWx0RGlzYWJsZUR1cmF0aW9uID0gdmFsdWU7CisgIH0KKworcHJvdGVjdGVkOgorICBSZXN1bHRUeXBlIGV4ZWN1dGVPblBvb2woUmVzdWx0VHlwZSkoc2NvcGUgUmVzdWx0VHlwZSBkZWxlZ2F0ZShDbGllbnQpIHdvcmspIHsKKyAgICBhdXRvIGNsaWVudHMgPSBwb29sX1tdOworICAgIGlmIChjbGllbnRzLmVtcHR5KSB7CisgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm8gY2xpZW50cyBhdmFpbGFibGUgdG8gdHJ5LiIpOworICAgIH0KKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBFeGNlcHRpb25bXSBycGNFeGNlcHRpb25zOworICAgICAgd2hpbGUgKCFjbGllbnRzLmVtcHR5KSB7CisgICAgICAgIGF1dG8gYyA9IGNsaWVudHMuZnJvbnQ7CisgICAgICAgIGNsaWVudHMucG9wRnJvbnQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc2NvcGUgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIHBvb2xfLnJlY29yZFN1Y2Nlc3MoYyk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHJlb3BlblRyYW5zcG9ydHMpIHsKKyAgICAgICAgICAgIGMuaW5wdXRQcm90b2NvbC50cmFuc3BvcnQub3BlbigpOworICAgICAgICAgICAgYy5vdXRwdXRQcm90b2NvbC50cmFuc3BvcnQub3BlbigpOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiB3b3JrKGMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIGlmIChycGNGYXVsdEZpbHRlciAmJiBycGNGYXVsdEZpbHRlcihlKSkgeworICAgICAgICAgICAgcG9vbF8ucmVjb3JkRmF1bHQoYyk7CisgICAgICAgICAgICBycGNFeGNlcHRpb25zIH49IGU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFdlIGFyZSBkZWFsaW5nIHdpdGggYSBub3JtYWwgZXhjZXB0aW9uIHRocm93biBieSB0aGUKKyAgICAgICAgICAgIC8vIHNlcnZlci1zaWRlIG1ldGhvZCwganVzdCBwYXNzIGl0IG9uLiBBcyBmYXIgYXMgd2UgYXJlCisgICAgICAgICAgICAvLyBjb25jZXJuZWQsIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkZWQuCisgICAgICAgICAgICBwb29sXy5yZWNvcmRTdWNjZXNzKGMpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUsIG5vIGNsaWVudCBzdWNjZWVkZWQgZHVyaW5nIHRoZSBjdXJyZW50IGl0ZXJhdGlvbi4KKyAgICAgIER1cmF0aW9uIHdhaXRUaW1lOworICAgICAgQ2xpZW50IGR1bW15OworICAgICAgaWYgKGNsaWVudHMud2lsbEJlY29tZU5vbmVtcHR5KGR1bW15LCB3YWl0VGltZSkpIHsKKyAgICAgICAgaWYgKHdhaXRUaW1lID4gZHVyISJobnNlY3MiKDApKSB7CisgICAgICAgICAgaW1wb3J0IGNvcmUudGhyZWFkOworICAgICAgICAgIFRocmVhZC5zbGVlcCh3YWl0VGltZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBUQ29tcG91bmRPcGVyYXRpb25FeGNlcHRpb24oIkFsbCBjbGllbnRzIGZhaWxlZC4iLAorICAgICAgICAgIHJwY0V4Y2VwdGlvbnMpOworICAgICAgfQorICAgIH0KKyAgfQorCitwcml2YXRlOgorICBUUmVzb3VyY2VQb29sIUNsaWVudCBwb29sXzsKK30KKworcHJpdmF0ZSB7CisgIC8vIENhbm5vdCB1c2UgYW4gYW5vbnltb3VzIGRlbGVnYXRlIGxpdGVyYWwgZm9yIHRoaXMgYmVjYXVzZSB0aGV5IGFyZW4ndAorICAvLyBhbGxvd2VkIGluIGNsYXNzIHNjb3BlLgorICBzdHJpbmcgcG9vbEZvcndhcmRDb2RlKEludGVyZmFjZSkoKSB7CisgICAgc3RyaW5nIGNvZGUgPSAiIjsKKworICAgIGZvcmVhY2ggKG1ldGhvZE5hbWU7IEFsbE1lbWJlck1ldGhvZE5hbWVzIUludGVyZmFjZSkgeworICAgICAgZW51bSBxbiA9ICJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWU7CisgICAgICBjb2RlIH49ICJSZXR1cm5UeXBlISgiIH4gcW4gfiAiKSAiIH4gbWV0aG9kTmFtZSB+CisgICAgICAgICIoUGFyYW1ldGVyVHlwZVR1cGxlISgiIH4gcW4gfiAiKSBhcmdzKSB7XG4iOworICAgICAgY29kZSB+PSAicmV0dXJuIGV4ZWN1dGVPblBvb2woKENsaWVudCBjKXsgcmV0dXJuIGMuIiB+CisgICAgICAgIG1ldGhvZE5hbWUgfiAiKGFyZ3MpOyB9KTtcbiI7CisgICAgICBjb2RlIH49ICJ9XG4iOworICAgIH0KKworICAgIHJldHVybiBjb2RlOworICB9Cit9CisKKy8qKgorICogVENsaWVudFBvb2wgY29uc3RydWN0aW9uIGhlbHBlciB0byBhdm9pZCBoYXZpbmcgdG8gZXhwbGljaXRseSBzcGVjaWZ5CisgKiB0aGUgaW50ZXJmYWNlIHR5cGUsIGkuZS4gdG8gYWxsb3cgdGhlIGNvbnN0cnVjdG9yIGJlaW5nIGNhbGxlZCB1c2luZyBJRlRJCisgKiAoc2VlICQoRE1EQlVHIDYwODIsIEQgQnVnemlsbGEgZW5oYW5jZW1lbnQgcmVxdWV0IDYwODIpKS4KKyAqLworVENsaWVudFBvb2whSW50ZXJmYWNlIHRDbGllbnRQb29sKEludGVyZmFjZSkoCisgIFRDbGllbnRCYXNlIUludGVyZmFjZVtdIGNsaWVudHMKKykgaWYgKGlzU2VydmljZSFJbnRlcmZhY2UpIHsKKyAgcmV0dXJuIG5ldyB0eXBlb2YocmV0dXJuKShjbGllbnRzKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9pZGxnZW4uZCBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9pZGxnZW4uZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjg4OTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2lkbGdlbi5kCkBAIC0wLDAgKzEsNzcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogQ29udGFpbnMgPGI+ZXhwZXJpbWVudGFsPC9iPiBmdW5jdGlvbmFsaXR5IGZvciBnZW5lcmF0aW5nIFRocmlmdCBJREwgZmlsZXMKKyAqICgudGhyaWZ0KSBmcm9tIGV4aXN0aW5nIEQgZGF0YSBzdHJ1Y3R1cmVzLCBpLmUuIHRoZSByZXZlcnNlIG9mIHdoYXQgdGhlCisgKiBUaHJpZnQgY29tcGlsZXIgZG9lcy4KKyAqLworbW9kdWxlIHRocmlmdC5jb2RlZ2VuLmlkbGdlbjsKKworaW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBmaW5kOworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5LCBmcm9udDsKK2ltcG9ydCBzdGQuY29udiA6IHRvOworaW1wb3J0IHN0ZC50cmFpdHMgOiBFbnVtTWVtYmVycywgaXNTb21lRnVuY3Rpb24sIE9yaWdpbmFsVHlwZSwKKyAgUGFyYW1ldGVyVHlwZVR1cGxlLCBSZXR1cm5UeXBlOworaW1wb3J0IHN0ZC50eXBldHVwbGUgOiBhbGxTYXRpc2Z5LCBzdGF0aWNJbmRleE9mLCBzdGF0aWNNYXAsIE5vRHVwbGljYXRlcywKKyAgVHlwZVR1cGxlOworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmJhc2U7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmNvZGVnZW47CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmN0ZmU7CitpbXBvcnQgdGhyaWZ0LnV0aWwuaGFzaHNldDsKKworLyoqCisgKiBUcnVlIGlmIHRoZSBwYXNzZWQgdHlwZSBpcyBhIFRocmlmdCBlbnRpdHkgKHN0cnVjdCwgZXhjZXB0aW9uLCBlbnVtLAorICogc2VydmljZSkuCisgKi8KK2FsaWFzIEFueSEoaXNTdHJ1Y3QsIGlzRXhjZXB0aW9uLCBpc0VudW0sIGlzU2VydmljZSkgaXNUaHJpZnRFbnRpdHk7CisKKy8qKgorICogUmV0dXJucyBhbiBJREwgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHBhc3NlZCDCu3Jvb3TCqyBlbnRpdGllcyBhbmQgYWxsIHR5cGVzCisgKiB0aGV5IGRlcGVuZCBvbi4KKyAqLwordGVtcGxhdGUgaWRsU3RyaW5nKFJvb3RzLi4uKSBpZiAoYWxsU2F0aXNmeSEoaXNUaHJpZnRFbnRpdHksIFJvb3RzKSkgeworICBlbnVtIGlkbFN0cmluZyA9IGlkbFN0cmluZ0ltcGwhUm9vdHMucmVzdWx0OworfQorCitwcml2YXRlIHsKKyAgdGVtcGxhdGUgaWRsU3RyaW5nSW1wbChSb290cy4uLikgaWYgKGFsbFNhdGlzZnkhKGlzVGhyaWZ0RW50aXR5LCBSb290cykpIHsKKyAgICBhbGlhcyBGb3JBbGxXaXRoTGlzdCEoCisgICAgICBDb25maW5lZFR1cGxlIShTdGF0aWNGaWx0ZXIhKGlzU2VydmljZSwgUm9vdHMpKSwKKyAgICAgIEFkZEJhc2VTZXJ2aWNlcworICAgICkgU2VydmljZXM7CisKKyAgICBhbGlhcyBUeXBlVHVwbGUhKAorICAgICAgU3RhdGljRmlsdGVyIShpc0VudW0sIFJvb3RzKSwKKyAgICAgIEZvckFsbFdpdGhMaXN0ISgKKyAgICAgICAgQ29uZmluZWRUdXBsZSEoCisgICAgICAgICAgU3RhdGljRmlsdGVyIShBbnkhKGlzRXhjZXB0aW9uLCBpc1N0cnVjdCksIFJvb3RzKSwKKyAgICAgICAgICBzdGF0aWNNYXAhKENvbXBvc2l0ZVR5cGVEZXBzLCBzdGF0aWNNYXAhKFNlcnZpY2VUeXBlRGVwcywgU2VydmljZXMpKQorICAgICAgICApLAorICAgICAgICBBZGRTdHJ1Y3RXaXRoRGVwcworICAgICAgKQorICAgICkgVHlwZXM7CisKKyAgICBlbnVtIHJlc3VsdCA9IGN0ZmVKb2luKAorICAgICAgWworICAgICAgICBzdGF0aWNNYXAhKAorICAgICAgICAgIGVudW1JZGxTdHJpbmcsCisgICAgICAgICAgU3RhdGljRmlsdGVyIShpc0VudW0sIFR5cGVzKQorICAgICAgICApLAorICAgICAgICBzdGF0aWNNYXAhKAorICAgICAgICAgIHN0cnVjdElkbFN0cmluZywKKyAgICAgICAgICBTdGF0aWNGaWx0ZXIhKEFueSEoaXNTdHJ1Y3QsIGlzRXhjZXB0aW9uKSwgVHlwZXMpCisgICAgICAgICksCisgICAgICAgIHN0YXRpY01hcCEoCisgICAgICAgICAgc2VydmljZUlkbFN0cmluZywKKyAgICAgICAgICBTZXJ2aWNlcworICAgICAgICApCisgICAgICBdLAorICAgICAgIlxuIgorICAgICk7CisgIH0KKworICB0ZW1wbGF0ZSBTZXJ2aWNlVHlwZURlcHMoVCkgaWYgKGlzU2VydmljZSFUKSB7CisgICAgYWxpYXMgc3RhdGljTWFwISgKKyAgICAgIFBBcHBseSEoTWV0aG9kVHlwZURlcHMsIFQpLAorICAgICAgRmlsdGVyTWV0aG9kTmFtZXMhKFQsIF9fdHJhaXRzKGRlcml2ZWRNZW1iZXJzLCBUKSkKKyAgICApIFNlcnZpY2VUeXBlRGVwczsKKyAgfQorCisgIHRlbXBsYXRlIE1ldGhvZFR5cGVEZXBzKFQsIHN0cmluZyBuYW1lKSBpZiAoCisgICAgaXNTZXJ2aWNlIVQgJiYgaXNTb21lRnVuY3Rpb24hKE1lbWJlclR5cGUhKFQsIG5hbWUpKQorICApIHsKKyAgICBhbGlhcyBUeXBlVHVwbGUhKAorICAgICAgUmV0dXJuVHlwZSEoTWVtYmVyVHlwZSEoVCwgbmFtZSkpLAorICAgICAgUGFyYW1ldGVyVHlwZVR1cGxlIShNZW1iZXJUeXBlIShULCBuYW1lKSksCisgICAgICBFeGNlcHRpb25UeXBlcyEoVCwgbmFtZSkKKyAgICApIE1ldGhvZFR5cGVEZXBzOworICB9CisKKyAgdGVtcGxhdGUgRXhjZXB0aW9uVHlwZXMoVCwgc3RyaW5nIG5hbWUpIGlmICgKKyAgICBpc1NlcnZpY2UhVCAmJiBpc1NvbWVGdW5jdGlvbiEoTWVtYmVyVHlwZSEoVCwgbmFtZSkpCisgICkgeworICAgIG1peGluKHsKKyAgICAgIGVudW0gbWV0YSA9IGZpbmQhYGEubmFtZSA9PSBiYChnZXRNZXRob2RNZXRhIVQsIG5hbWUpOworICAgICAgaWYgKG1ldGEuZW1wdHkpIHJldHVybiAiYWxpYXMgVHlwZVR1cGxlISgpIEV4Y2VwdGlvblR5cGVzOyI7CisKKyAgICAgIHN0cmluZyByZXN1bHQgPSAiYWxpYXMgVHlwZVR1cGxlISgiOworICAgICAgZm9yZWFjaCAoaSwgZTsgbWV0YS5mcm9udC5leGNlcHRpb25zKSB7CisgICAgICAgIGlmIChpID4gMCkgcmVzdWx0IH49ICIsICI7CisgICAgICAgIHJlc3VsdCB+PSAibWl4aW4oYFQuIiB+IGUudHlwZSB+ICJgKSI7CisgICAgICB9CisgICAgICByZXN1bHQgfj0gIikgRXhjZXB0aW9uVHlwZXM7IjsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSgpKTsKKyAgfQorCisgIHRlbXBsYXRlIEFkZEJhc2VTZXJ2aWNlcyhULCBMaXN0Li4uKSB7CisgICAgc3RhdGljIGlmIChzdGF0aWNJbmRleE9mIShULCBMaXN0KSA9PSAtMSkgeworICAgICAgYWxpYXMgTm9EdXBsaWNhdGVzIShCYXNlU2VydmljZXMhVCwgTGlzdCkgQWRkQmFzZVNlcnZpY2VzOworICAgIH0gZWxzZSB7CisgICAgICBhbGlhcyBMaXN0IEFkZFN0cnVjdFdpdGhEZXBzOworICAgIH0KKyAgfQorCisgIHVuaXR0ZXN0IHsKKyAgICBpbnRlcmZhY2UgQSB7fQorICAgIGludGVyZmFjZSBCIDogQSB7fQorICAgIGludGVyZmFjZSBDIDogQiB7fQorICAgIGludGVyZmFjZSBEIDogQSB7fQorCisgICAgc3RhdGljIGFzc2VydChpcyhBZGRCYXNlU2VydmljZXMhKEMpID09IFR5cGVUdXBsZSEoQSwgQiwgQykpKTsKKyAgICBzdGF0aWMgYXNzZXJ0KGlzKEZvckFsbFdpdGhMaXN0IShDb25maW5lZFR1cGxlIShDLCBEKSwgQWRkQmFzZVNlcnZpY2VzKSA9PQorICAgICAgVHlwZVR1cGxlIShBLCBELCBCLCBDKSkpOworICB9CisKKyAgdGVtcGxhdGUgQmFzZVNlcnZpY2VzKFQsIFJlc3QuLi4pIGlmIChpc1NlcnZpY2UhVCkgeworICAgIHN0YXRpYyBpZiAoaXNEZXJpdmVkU2VydmljZSFUKSB7CisgICAgICBhbGlhcyBCYXNlU2VydmljZXMhKEJhc2VTZXJ2aWNlIVQsIFQsIFJlc3QpIEJhc2VTZXJ2aWNlczsKKyAgICB9IGVsc2UgeworICAgICAgYWxpYXMgVHlwZVR1cGxlIShULCBSZXN0KSBCYXNlU2VydmljZXM7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgQWRkU3RydWN0V2l0aERlcHMoVCwgTGlzdC4uLikgeworICAgIHN0YXRpYyBpZiAoc3RhdGljSW5kZXhPZiEoVCwgTGlzdCkgPT0gLTEpIHsKKyAgICAgIC8vIFQgaXMgbm90IGFscmVhZHkgaW4gdGhlIExpc3QsIHNvIGFkZCBUIGFuZCB0aGUgdHlwZXMgaXQgZGVwZW5kcyBvbiBpbgorICAgICAgLy8gdGhlIGZyb250LiBCZWNhdXNlIHdpdGggdGhlIFRocmlmdCBjb21waWxlciB0eXBlcyBjYW4gb25seSBkZXBlbmQgb24KKyAgICAgIC8vIG90aGVyIHR5cGVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gZGVmaW5lZCwgd2UgY29sbGVjdCBhbGwgdGhlCisgICAgICAvLyBkZXBlbmRlbmNpZXMsIHByZXBlbmQgdGhlbSB0byB0aGUgbGlzdCwgYW5kIHRoZW4gcHJ1bmUgdGhlIGR1cGxpY2F0ZXMKKyAgICAgIC8vIChrZWVwaW5nIHRoZSBmaXJzdCBvY2N1cnJlbmNlcykuIElmIHRoaXMgcmVxdWlyZW1lbnQgc2hvdWxkIGV2ZXIgYmUKKyAgICAgIC8vIGRyb3BwZWQgZnJvbSBUaHJpZnQsIHRoaXMgY291bGQgYmUgZWFzaWx5IGFkYXB0ZWQgdG8gaGFuZGxlIGNpcmN1bGFyCisgICAgICAvLyBkZXBlbmRlbmNpZXMgYnkgcGFzc2luZyBUeXBlVHVwbGUhKFQsIExpc3QpIHRvIEZvckFsbFdpdGhMaXN0IGluc3RlYWQKKyAgICAgIC8vIG9mIGFwcGVuZGluZyBMaXN0IGFmdGVyd2FyZHMsIGFuZCByZW1vdmluZyB0aGUgbm93IHVubmVjZXNzYXJ5CisgICAgICAvLyBOb0R1cGxpY2F0ZXMuCisgICAgICBhbGlhcyBOb0R1cGxpY2F0ZXMhKAorICAgICAgICBGb3JBbGxXaXRoTGlzdCEoCisgICAgICAgICAgQ29uZmluZWRUdXBsZSEoCisgICAgICAgICAgICBzdGF0aWNNYXAhKAorICAgICAgICAgICAgICBDb21wb3NpdGVUeXBlRGVwcywKKyAgICAgICAgICAgICAgc3RhdGljTWFwISgKKyAgICAgICAgICAgICAgICBQQXBwbHkhKE1lbWJlclR5cGUsIFQpLAorICAgICAgICAgICAgICAgIEZpZWxkTmFtZXMhVAorICAgICAgICAgICAgICApCisgICAgICAgICAgICApCisgICAgICAgICAgKSwKKyAgICAgICAgICAuQWRkU3RydWN0V2l0aERlcHMsCisgICAgICAgICAgVAorICAgICAgICApLAorICAgICAgICBMaXN0CisgICAgICApIEFkZFN0cnVjdFdpdGhEZXBzOworICAgIH0gZWxzZSB7CisgICAgICBhbGlhcyBMaXN0IEFkZFN0cnVjdFdpdGhEZXBzOworICAgIH0KKyAgfQorCisgIHZlcnNpb24gKHVuaXR0ZXN0KSB7CisgICAgc3RydWN0IEEge30KKyAgICBzdHJ1Y3QgQiB7CisgICAgICBBIGE7CisgICAgICBpbnQgYjsKKyAgICAgIEEgYzsKKyAgICAgIHN0cmluZyBkOworICAgIH0KKyAgICBzdHJ1Y3QgQyB7CisgICAgICBCIGI7CisgICAgICBBIGE7CisgICAgfQorCisgICAgc3RhdGljIGFzc2VydChpcyhBZGRTdHJ1Y3RXaXRoRGVwcyFDID09IFR5cGVUdXBsZSEoQSwgQiwgQykpKTsKKworICAgIHN0cnVjdCBEIHsKKyAgICAgIEMgYzsKKyAgICAgIG1peGluIFRTdHJ1Y3RIZWxwZXJzIShbVEZpZWxkTWV0YSgiYyIsIDAsIFRSZXEuSUdOT1JFKV0pOworICAgIH0KKyAgICBzdGF0aWMgYXNzZXJ0KGlzKEFkZFN0cnVjdFdpdGhEZXBzIUQgPT0gVHlwZVR1cGxlIShEKSkpOworICB9CisKKyAgdmVyc2lvbiAodW5pdHRlc3QpIHsKKyAgICAvLyBDaXJjbGVzIGluIHRoZSB0eXBlIGRlcGVuZGVuY3kgZ3JhcGggYXJlIG5vdCBhbGxvd2VkIGluIFRocmlmdCwgYnV0IG1ha2UKKyAgICAvLyBzdXJlIHdlIGZhaWwgaW4gYSBzYW5lIHdheSBpbnN0ZWFkIG9mIGNyYXNoaW5nIHRoZSBjb21waWxlci4KKworICAgIHN0cnVjdCBSZWMxIHsKKyAgICAgIFJlYzJbXSBvdGhlcjsKKyAgICB9CisKKyAgICBzdHJ1Y3QgUmVjMiB7CisgICAgICBSZWMxW10gb3RoZXI7CisgICAgfQorCisgICAgc3RhdGljIGFzc2VydCghX190cmFpdHMoY29tcGlsZXMsIEFkZFN0cnVjdFdpdGhEZXBzIVJlYzEpKTsKKyAgfQorCisgIC8qCisgICAqIFJldHVybnMgdGhlIG5vbi1wcmltaXRpdmUgdHlwZXMgVCBkaXJlY3RseSBkZXBlbmRzIG9uLgorICAgKgorICAgKiBGb3IgZXhhbXBsZSwgQ29tcG9zaXRlVHlwZURlcHMhaW50IHdvdWxkIHlpZWxkIGFuIGVtcHR5IHR5cGUgdHVwbGUsCisgICAqIENvbXBvc2l0ZVR5cGVEZXBzIVNvbWVTdHJ1Y3Qgd291bGQgZ2l2ZSBTb21lU3RydWN0LCBhbmQKKyAgICogQ29tcG9zaXRlVHlwZURlcHMhKEFbQl0pIGJvdGggQ29tcG9zaXRlVHlwZURlcHMhQSBhbmQgQ29tcG9zaXRlVHlwZURlcHMhQi4KKyAgICovCisgIHRlbXBsYXRlIENvbXBvc2l0ZVR5cGVEZXBzKFQpIHsKKyAgICBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gYm9vbCkgfHwgaXMoRnVsbHlVbnF1YWwhVCA9PSBieXRlKSB8fAorICAgICAgaXMoRnVsbHlVbnF1YWwhVCA9PSBzaG9ydCkgfHwgaXMoRnVsbHlVbnF1YWwhVCA9PSBpbnQpIHx8CisgICAgICBpcyhGdWxseVVucXVhbCFUID09IGxvbmcpIHx8IGlzKEZ1bGx5VW5xdWFsIVQgOiBzdHJpbmcpIHx8CisgICAgICBpcyhGdWxseVVucXVhbCFUID09IGRvdWJsZSkgfHwgaXMoRnVsbHlVbnF1YWwhVCA9PSB2b2lkKQorICAgICkgeworICAgICAgYWxpYXMgVHlwZVR1cGxlISgpIENvbXBvc2l0ZVR5cGVEZXBzOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgXyA6IFVbXSwgVSkpIHsKKyAgICAgIGFsaWFzIENvbXBvc2l0ZVR5cGVEZXBzIVUgQ29tcG9zaXRlVHlwZURlcHM7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCBfIDogSGFzaFNldCFFLCBFKSkgeworICAgICAgYWxpYXMgQ29tcG9zaXRlVHlwZURlcHMhRSBDb21wb3NpdGVUeXBlRGVwczsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUIF8gOiBWW0tdLCBLLCBWKSkgeworICAgICAgYWxpYXMgVHlwZVR1cGxlIShDb21wb3NpdGVUeXBlRGVwcyFLLCBDb21wb3NpdGVUeXBlRGVwcyFWKSBDb21wb3NpdGVUeXBlRGVwczsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGVudW0pIHx8IGlzKEZ1bGx5VW5xdWFsIVQgPT0gc3RydWN0KSB8fAorICAgICAgaXMoRnVsbHlVbnF1YWwhVCA6IFRFeGNlcHRpb24pCisgICAgKSB7CisgICAgICBhbGlhcyBUeXBlVHVwbGUhKEZ1bGx5VW5xdWFsIVQpIENvbXBvc2l0ZVR5cGVEZXBzOworICAgIH0gZWxzZSB7CisgICAgICBzdGF0aWMgYXNzZXJ0KGZhbHNlLCAiQ2Fubm90IHJlcHJlc2VudCB0eXBlIGluIFRocmlmdDogIiB+IFQuc3RyaW5nb2YpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFJldHVybnMgYW4gSURMIHN0cmluZyBkZXNjcmliaW5nIHRoZSBwYXNzZWQgc2VydmljZS4gSURMIGNvZGUgZm9yIGFueSB0eXBlCisgKiBkZXBlbmRjaWVzIGlzIG5vdCBpbmNsdWRlZC4KKyAqLwordGVtcGxhdGUgc2VydmljZUlkbFN0cmluZyhUKSBpZiAoaXNTZXJ2aWNlIVQpIHsKKyAgZW51bSBzZXJ2aWNlSWRsU3RyaW5nID0geworICAgIHN0cmluZyByZXN1bHQgPSAic2VydmljZSAiIH4gVC5zdHJpbmdvZjsKKyAgICBzdGF0aWMgaWYgKGlzRGVyaXZlZFNlcnZpY2UhVCkgeworICAgICAgcmVzdWx0IH49ICIgZXh0ZW5kcyAiIH4gQmFzZVNlcnZpY2UhVC5zdHJpbmdvZjsKKyAgICB9CisgICAgcmVzdWx0IH49ICIge1xuIjsKKworICAgIGZvcmVhY2ggKG1ldGhvZE5hbWU7IEZpbHRlck1ldGhvZE5hbWVzIShULCBfX3RyYWl0cyhkZXJpdmVkTWVtYmVycywgVCkpKSB7CisgICAgICByZXN1bHQgfj0gIiAgIjsKKworICAgICAgZW51bSBtZXRhID0gZmluZCFgYS5uYW1lID09IGJgKFQubWV0aG9kTWV0YSwgbWV0aG9kTmFtZSk7CisKKyAgICAgIHN0YXRpYyBpZiAoIW1ldGEuZW1wdHkgJiYgbWV0YS5mcm9udC50eXBlID09IFRNZXRob2RUeXBlLk9ORVdBWSkgeworICAgICAgICByZXN1bHQgfj0gIm9uZXdheSAiOworICAgICAgfQorCisgICAgICBhbGlhcyBSZXR1cm5UeXBlIShNZW1iZXJUeXBlIShULCBtZXRob2ROYW1lKSkgUlQ7CisgICAgICBzdGF0aWMgaWYgKGlzKFJUID09IHZvaWQpKSB7CisgICAgICAgIC8vIFdlIHNwZWNpYWwtY2FzZSB0aGlzIGhlcmUgaW5zdGVhZCBvZiBhZGRpbmcgdm9pZCB0byBkVG9JZGxUeXBlIHRvCisgICAgICAgIC8vIGF2b2lkIGFjY2VwdGluZyB0aGluZ3MgbGlrZSB2b2lkW10uCisgICAgICAgIHJlc3VsdCB+PSAidm9pZCAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0IH49IGRUb0lkbFR5cGUhUlQgfiAiICI7CisgICAgICB9CisgICAgICByZXN1bHQgfj0gbWV0aG9kTmFtZSB+ICIoIjsKKworICAgICAgc2hvcnQgbGFzdElkOworICAgICAgZm9yZWFjaCAoaSwgUGFyYW1UeXBlOyBQYXJhbWV0ZXJUeXBlVHVwbGUhKE1lbWJlclR5cGUhKFQsIG1ldGhvZE5hbWUpKSkgeworICAgICAgICBzdGF0aWMgaWYgKCFtZXRhLmVtcHR5ICYmIGkgPCBtZXRhLmZyb250LnBhcmFtcy5sZW5ndGgpIHsKKyAgICAgICAgICBlbnVtIGhhdmVQTSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZW51bSBoYXZlUE0gPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHNob3J0IGlkOworICAgICAgICBzdGF0aWMgaWYgKGhhdmVQTSkgeworICAgICAgICAgIGlkID0gbWV0YS5mcm9udC5wYXJhbXNbaV0uaWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWQgPSAtLWxhc3RJZDsKKyAgICAgICAgfQorCisgICAgICAgIHN0cmluZyBwYXJhbU5hbWU7CisgICAgICAgIHN0YXRpYyBpZiAoaGF2ZVBNKSB7CisgICAgICAgICAgcGFyYW1OYW1lID0gbWV0YS5mcm9udC5wYXJhbXNbaV0ubmFtZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwYXJhbU5hbWUgPSAicGFyYW0iIH4gdG8hc3RyaW5nKGkgKyAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCB+PSB0byFzdHJpbmcoaWQpIH4gIjogIiB+IGRUb0lkbFR5cGUhUGFyYW1UeXBlIH4gIiAiIH4gcGFyYW1OYW1lOworCisgICAgICAgIHN0YXRpYyBpZiAoaGF2ZVBNICYmICFtZXRhLmZyb250LnBhcmFtc1tpXS5kZWZhdWx0VmFsdWUuZW1wdHkpIHsKKyAgICAgICAgICByZXN1bHQgfj0gIiA9ICIgfiBkVG9JZGxDb25zdChtaXhpbihtZXRhLmZyb250LnBhcmFtc1tpXS5kZWZhdWx0VmFsdWUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCBnZXR0aW5nIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBwYXJhbWV0ZXJzIGZyb20gYQorICAgICAgICAgIC8vIGZ1bmN0aW9uIGFsaWFzIGlzbid0IHBvc3NpYmxlIOKAkyB3ZSBjYW4ndCB0cmFuc2ZlciB0aGUgZGVmYXVsdAorICAgICAgICAgIC8vIHZhbHVlIHRvIHRoZSBJREwgZS5nLiBmb3IgaW50ZXJmYWNlIEZvbyB7IHZvaWQgZm9vKGludCBhID0gNSk7IH0KKyAgICAgICAgICAvLyB3aXRob3V0IHRoZSB1c2VyIGV4cGxpY2l0bHkgZGVjbGFyaW5nIGl0IGluIG1ldGFkYXRhLgorICAgICAgICB9CisgICAgICAgIHJlc3VsdCB+PSAiLCAiOworICAgICAgfQorICAgICAgcmVzdWx0IH49ICIpIjsKKworICAgICAgc3RhdGljIGlmICghbWV0YS5lbXB0eSAmJiAhbWV0YS5mcm9udC5leGNlcHRpb25zLmVtcHR5KSB7CisgICAgICAgIHJlc3VsdCB+PSAiIHRocm93cyAoIjsKKyAgICAgICAgZm9yZWFjaCAoZTsgbWV0YS5mcm9udC5leGNlcHRpb25zKSB7CisgICAgICAgICAgcmVzdWx0IH49IHRvIXN0cmluZyhlLmlkKSB+ICI6ICIgfiBlLnR5cGUgfiAiICIgfiBlLm5hbWUgfiAiLCAiOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCB+PSAiKSI7CisgICAgICB9CisKKyAgICAgIHJlc3VsdCB+PSAiLFxuIjsKKyAgICB9CisKKyAgICByZXN1bHQgfj0gIn1cbiI7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfSgpOworfQorCisvKioKKyAqIFJldHVybnMgYW4gSURMIHN0cmluZyBkZXNjcmliaW5nIHRoZSBwYXNzZWQgZW51bS4gSURMIGNvZGUgZm9yIGFueSB0eXBlCisgKiBkZXBlbmRjaWVzIGlzIG5vdCBpbmNsdWRlZC4KKyAqLwordGVtcGxhdGUgZW51bUlkbFN0cmluZyhUKSBpZiAoaXNFbnVtIVQpIHsKKyAgZW51bSBlbnVtSWRsU3RyaW5nID0geworICAgIHN0YXRpYyBhc3NlcnQoaXMoT3JpZ2luYWxUeXBlIVQgOiBsb25nKSwKKyAgICAgICJDYW4gb25seSBoYXZlIGludGVnZXIgZW51bXMgaW4gVGhyaWZ0IChub3QgIiB+IE9yaWdpbmFsVHlwZSFULnN0cmluZ29mIH4KKyAgICAgICIsIGZvciAiIH4gVC5zdHJpbmdvZiB+ICIpLiIpOworCisgICAgc3RyaW5nIHJlc3VsdCA9ICJlbnVtICIgfiBULnN0cmluZ29mIH4gIiB7XG4iOworCisgICAgZm9yZWFjaCAobmFtZTsgX190cmFpdHMoZGVyaXZlZE1lbWJlcnMsIFQpKSB7CisgICAgICByZXN1bHQgfj0gIiAgIiB+IG5hbWUgfiAiID0gIiB+IGRUb0lkbENvbnN0KEdldE1lbWJlciEoVCwgbmFtZSkpIH4gIixcbiI7CisgICAgfQorCisgICAgcmVzdWx0IH49ICJ9XG4iOworICAgIHJldHVybiByZXN1bHQ7CisgIH0oKTsKK30KKworLyoqCisgKiBSZXR1cm5zIGFuIElETCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcGFzc2VkIHN0cnVjdC4gSURMIGNvZGUgZm9yIGFueSB0eXBlCisgKiBkZXBlbmRjaWVzIGlzIG5vdCBpbmNsdWRlZC4KKyAqLwordGVtcGxhdGUgc3RydWN0SWRsU3RyaW5nKFQpIGlmIChpc1N0cnVjdCFUIHx8IGlzRXhjZXB0aW9uIVQpIHsKKyAgZW51bSBzdHJ1Y3RJZGxTdHJpbmcgPSB7CisgICAgbWl4aW4oeworICAgICAgc3RyaW5nIGNvZGUgPSAiIjsKKyAgICAgIGZvcmVhY2ggKGZpZWxkOyBnZXRGaWVsZE1ldGEhVCkgeworICAgICAgICBjb2RlIH49ICJzdGF0aWMgYXNzZXJ0KGlzKE1lbWJlclR5cGUhKFQsIGAiIH4gZmllbGQubmFtZSB+ICJgKSkpO1xuIjsKKyAgICAgIH0KKyAgICAgIHJldHVybiBjb2RlOworICAgIH0oKSk7CisKKyAgICBzdHJpbmcgcmVzdWx0OworICAgIHN0YXRpYyBpZiAoaXNFeGNlcHRpb24hVCkgeworICAgICAgcmVzdWx0ID0gImV4Y2VwdGlvbiAiOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgPSAic3RydWN0ICI7CisgICAgfQorICAgIHJlc3VsdCB+PSBULnN0cmluZ29mIH4gIiB7XG4iOworCisgICAgLy8gVGhlIGxhc3QgYXV0b21hdGljYWxseSBhc3NpZ25lZCBpZCDigJMgZmllbGRzIHdpdGggbm8gbWV0YSBpbmZvcm1hdGlvbgorICAgIC8vIGFyZSBhc3NpZ25lZCAoaW4gbGV4aWNhbCBvcmRlcikgZGVzY2VuZGluZyBuZWdhdGl2ZSBpZHMsIHN0YXJ0aW5nIHdpdGgKKyAgICAvLyAtMSwganVzdCBsaWtlIHRoZSBUaHJpZnQgY29tcGlsZXIgZG9lcy4KKyAgICBzaG9ydCBsYXN0SWQ7CisKKyAgICBmb3JlYWNoIChuYW1lOyBGaWVsZE5hbWVzIVQpIHsKKyAgICAgIGVudW0gbWV0YSA9IGZpbmQhYGEubmFtZSA9PSBiYChnZXRGaWVsZE1ldGEhVCwgbmFtZSk7CisKKyAgICAgIHN0YXRpYyBpZiAobWV0YS5lbXB0eSB8fCBtZXRhLmZyb250LnJlcSAhPSBUUmVxLklHTk9SRSkgeworICAgICAgICBzaG9ydCBpZDsKKyAgICAgICAgc3RhdGljIGlmIChtZXRhLmVtcHR5KSB7CisgICAgICAgICAgaWQgPSAtLWxhc3RJZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZCA9IG1ldGEuZnJvbnQuaWQ7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgfj0gIiAgIiB+IHRvIXN0cmluZyhpZCkgfiAiOiI7CisgICAgICAgIHN0YXRpYyBpZiAoIW1ldGEuZW1wdHkpIHsKKyAgICAgICAgICByZXN1bHQgfj0gZFRvSWRsUmVxKG1ldGEuZnJvbnQucmVxKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgfj0gIiAiIH4gZFRvSWRsVHlwZSEoTWVtYmVyVHlwZSEoVCwgbmFtZSkpIH4gIiAiIH4gbmFtZTsKKworICAgICAgICBzdGF0aWMgaWYgKCFtZXRhLmVtcHR5ICYmICFtZXRhLmZyb250LmRlZmF1bHRWYWx1ZS5lbXB0eSkgeworICAgICAgICAgIHJlc3VsdCB+PSAiID0gIiB+IGRUb0lkbENvbnN0KG1peGluKG1ldGEuZnJvbnQuZGVmYXVsdFZhbHVlKSk7CisgICAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKF9fdHJhaXRzKGNvbXBpbGVzLCBmaWVsZEluaXRBIShULCBuYW1lKSkpIHsKKyAgICAgICAgICBzdGF0aWMgaWYgKGlzKHR5cGVvZihmaWVsZEluaXRBIShULCBuYW1lKSkpICYmCisgICAgICAgICAgICAhaXModHlwZW9mKGZpZWxkSW5pdEEhKFQsIG5hbWUpKSA9PSB2b2lkKQorICAgICAgICAgICkgeworICAgICAgICAgICAgcmVzdWx0IH49ICIgPSAiIH4gZFRvSWRsQ29uc3QoZmllbGRJbml0QSEoVCwgbmFtZSkpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXModHlwZW9mKGZpZWxkSW5pdEIhKFQsIG5hbWUpKSkgJiYKKyAgICAgICAgICAhaXModHlwZW9mKGZpZWxkSW5pdEIhKFQsIG5hbWUpKSA9PSB2b2lkKQorICAgICAgICApIHsKKyAgICAgICAgICByZXN1bHQgfj0gIiA9ICIgfiBkVG9JZGxDb25zdChmaWVsZEluaXRCIShULCBuYW1lKSk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0IH49ICIsXG4iOworICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdCB+PSAifVxuIjsKKyAgICByZXR1cm4gcmVzdWx0OworICB9KCk7Cit9CisKK3ByaXZhdGUgeworICAvLyBUaGlzIHZlcnkgY29udm9sdXRlZCB3YXkgb2YgZG9pbmcgdGhpbmdzIHdhcyBjaG9zZW4gYmVjYXVzZSBwdXR0aW5nIHRoZQorICAvLyBzdGF0aWMgaWYgZGlyZWN0bHkgaW50byBzdHJ1Y3RJZGxTdHJpbmcgY2F1c2VkIMK7bm90IGV2YWx1YXRhYmxlIGF0IGNvbXBpbGUKKyAgLy8gdGltZcKrIGVycm9ycyB0byBzbGlwIHRocm91Z2ggZXZlbiB0aG91Z2ggdHlwZW9mKCkgd2FzIHVzZWQsIHJlc3AuIHRoZQorICAvLyBjb25kaXRpb24gdG8gYmUgdHJ1ZSBldmVuIHRob3VnaCB0aGUgdmFsdWUgY291bGRuJ3QgYWN0dWFsbHkgYmUgcmVhZCBhdAorICAvLyBjb21waWxlIHRpbWUgZHVlIHRvIGEgQEBCVUdAQCBpbiBETUQgMi4wNTUuCisgIC8vIFRoZSBleHRyYSDCu2NvbXBpbGVkwqsgZmllbGQgaW4gZmllbGRJbml0QSBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBtdXN0IG5vdCB0cnkKKyAgLy8gdG8gdXNlICE9IGlmICFpcyBjb21waWxlZCBhcyB3ZWxsIChidXQgd2FzIGZhbHNlKSwgZS5nLiBmb3IgZmxvYXRpbmcgcG9pbnQKKyAgLy8gdHlwZXMuCisgIHRlbXBsYXRlIGZpZWxkSW5pdEEoVCwgc3RyaW5nIG5hbWUpIHsKKyAgICBzdGF0aWMgaWYgKG1peGluKCJULmluaXQuIiB+IG5hbWUpICFpcyBNZW1iZXJUeXBlIShULCBuYW1lKS5pbml0KSB7CisgICAgICBlbnVtIGZpZWxkSW5pdEEgPSBtaXhpbigiVC5pbml0LiIgfiBuYW1lKTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSBmaWVsZEluaXRCKFQsIHN0cmluZyBuYW1lKSB7CisgICAgc3RhdGljIGlmIChtaXhpbigiVC5pbml0LiIgfiBuYW1lKSAhPSBNZW1iZXJUeXBlIShULCBuYW1lKS5pbml0KSB7CisgICAgICBlbnVtIGZpZWxkSW5pdEIgPSBtaXhpbigiVC5pbml0LiIgfiBuYW1lKTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSBkVG9JZGxUeXBlKFQpIHsKKyAgICBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gYm9vbCkpIHsKKyAgICAgIGVudW0gZFRvSWRsVHlwZSA9ICJib29sIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGJ5dGUpKSB7CisgICAgICBlbnVtIGRUb0lkbFR5cGUgPSAiYnl0ZSI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBkb3VibGUpKSB7CisgICAgICBlbnVtIGRUb0lkbFR5cGUgPSAiZG91YmxlIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IHNob3J0KSkgeworICAgICAgZW51bSBkVG9JZGxUeXBlID0gImkxNiI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBpbnQpKSB7CisgICAgICBlbnVtIGRUb0lkbFR5cGUgPSAiaTMyIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGxvbmcpKSB7CisgICAgICBlbnVtIGRUb0lkbFR5cGUgPSAiaTY0IjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUIDogc3RyaW5nKSkgeworICAgICAgZW51bSBkVG9JZGxUeXBlID0gInN0cmluZyI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCBfIDogVVtdLCBVKSkgeworICAgICAgZW51bSBkVG9JZGxUeXBlID0gImxpc3Q8IiB+IGRUb0lkbFR5cGUhVSB+ICI+IjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUIF8gOiBWW0tdLCBLLCBWKSkgeworICAgICAgZW51bSBkVG9JZGxUeXBlID0gIm1hcDwiIH4gZFRvSWRsVHlwZSFLIH4gIiwgIiB+IGRUb0lkbFR5cGUhViB+ICI+IjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUIF8gOiBIYXNoU2V0IUUsIEUpKSB7CisgICAgICBlbnVtIGRUb0lkbFR5cGUgPSAic2V0PCIgfiBkVG9JZGxUeXBlIUUgfiAiPiI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBzdHJ1Y3QpIHx8IGlzKEZ1bGx5VW5xdWFsIVQgPT0gZW51bSkgfHwKKyAgICAgIGlzKEZ1bGx5VW5xdWFsIVQgOiBURXhjZXB0aW9uKQorICAgICkgeworICAgICAgZW51bSBkVG9JZGxUeXBlID0gRnVsbHlVbnF1YWwhKFQpLnN0cmluZ29mOworICAgIH0gZWxzZSB7CisgICAgICBzdGF0aWMgYXNzZXJ0KGZhbHNlLCAiQ2Fubm90IHJlcHJlc2VudCB0eXBlIGluIFRocmlmdDogIiB+IFQuc3RyaW5nb2YpOworICAgIH0KKyAgfQorCisgIHN0cmluZyBkVG9JZGxSZXEoVFJlcSByZXEpIHsKKyAgICBzd2l0Y2ggKHJlcSkgeworICAgICAgY2FzZSBUUmVxLlJFUVVJUkVEOiByZXR1cm4gIiByZXF1aXJlZCI7CisgICAgICBjYXNlIFRSZXEuT1BUSU9OQUw6IHJldHVybiAiIG9wdGlvbmFsIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiIjsKKyAgICB9CisgIH0KKworICBzdHJpbmcgZFRvSWRsQ29uc3QoVCkoVCB2YWx1ZSkgeworICAgIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBib29sKSkgeworICAgICAgcmV0dXJuIHZhbHVlID8gIjEiIDogIjAiOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gYnl0ZSkgfHwKKyAgICAgIGlzKEZ1bGx5VW5xdWFsIVQgPT0gc2hvcnQpIHx8IGlzKEZ1bGx5VW5xdWFsIVQgPT0gaW50KSB8fAorICAgICAgaXMoRnVsbHlVbnF1YWwhVCA9PSBsb25nKQorICAgICkgeworICAgICAgcmV0dXJuIHRvIXN0cmluZyh2YWx1ZSk7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA6IHN0cmluZykpIHsKKyAgICAgIHJldHVybiBgImAgfiB0byFzdHJpbmcodmFsdWUpIH4gYCJgOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gZG91YmxlKSkgeworICAgICAgcmV0dXJuIGN0ZmVUb1N0cmluZyh2YWx1ZSk7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCBfIDogVVtdLCBVKSB8fAorICAgICAgaXMoRnVsbHlVbnF1YWwhVCBfIDogSGFzaFNldCFFLCBFKQorICAgICkgeworICAgICAgc3RyaW5nIHJlc3VsdCA9ICJbIjsKKyAgICAgIGZvcmVhY2ggKGU7IHZhbHVlKSB7CisgICAgICAgIHJlc3VsdCB+PSBkVG9JZGxDb25zdChlKSB+ICIsICI7CisgICAgICB9CisgICAgICByZXN1bHQgfj0gIl0iOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUIF8gOiBWW0tdLCBLLCBWKSkgeworICAgICAgc3RyaW5nIHJlc3VsdCA9ICJ7IjsKKyAgICAgIGZvcmVhY2ggKGtleSwgdmFsOyB2YWx1ZSkgeworICAgICAgICByZXN1bHQgfj0gZFRvSWRsQ29uc3Qoa2V5KSB+ICI6ICIgfiBkVG9JZGxDb25zdCh2YWwpIH4gIiwgIjsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCB+PSAifSI7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gZW51bSkpIHsKKyAgICAgIGltcG9ydCBzdGQuY29udjsKKyAgICAgIGltcG9ydCBzdGQudHJhaXRzOworICAgICAgcmV0dXJuIHRvIXN0cmluZyhjYXN0KE9yaWdpbmFsVHlwZSFUKXZhbHVlKTsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IHN0cnVjdCkgfHwKKyAgICAgIGlzKEZ1bGx5VW5xdWFsIVQgOiBURXhjZXB0aW9uKQorICAgICkgeworICAgICAgc3RyaW5nIHJlc3VsdCA9ICJ7IjsKKyAgICAgIGZvcmVhY2ggKG5hbWU7IF9fdHJhaXRzKGRlcml2ZWRNZW1iZXJzLCBUKSkgeworICAgICAgICBzdGF0aWMgaWYgKG1lbWJlclJlcSEoVCwgbmFtZSkgIT0gVFJlcS5JR05PUkUpIHsKKyAgICAgICAgICByZXN1bHQgfj0gbmFtZSB+ICI6ICIgfiBkVG9JZGxDb25zdChtaXhpbigidmFsdWUuIiB+IG5hbWUpKSB+ICIsICI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJlc3VsdCB+PSAifSI7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0gZWxzZSB7CisgICAgICBzdGF0aWMgYXNzZXJ0KGZhbHNlLCAiQ2Fubm90IHJlcHJlc2VudCB0eXBlIGluIFRocmlmdDogIiB+IFQuc3RyaW5nb2YpOworICAgIH0KKyAgfQorfQorCit2ZXJzaW9uICh1bml0dGVzdCkgeworICBlbnVtIEZvbyB7CisgICAgYSA9IDEsCisgICAgYiA9IDEwLAorICAgIGMgPSA1CisgIH0KKworICBzdGF0aWMgYXNzZXJ0KGVudW1JZGxTdHJpbmchRm9vID09CitgZW51bSBGb28geworICBhID0gMSwKKyAgYiA9IDEwLAorICBjID0gNSwKK30KK2ApOworfQorCisKK3ZlcnNpb24gKHVuaXR0ZXN0KSB7CisgIHN0cnVjdCBXaXRob3V0TWV0YSB7CisgICAgc3RyaW5nIGE7CisgICAgaW50IGI7CisgIH0KKworICBzdHJ1Y3QgV2l0aERlZmF1bHRzIHsKKyAgICBzdHJpbmcgYSA9ICJhc2RmIjsKKyAgICBkb3VibGUgYiA9IDMuMTQxNTsKKyAgICBXaXRob3V0TWV0YSBjOworCisgICAgbWl4aW4gVFN0cnVjdEhlbHBlcnMhKFsKKyAgICAgIFRGaWVsZE1ldGEoImMiLCAxLCBUUmVxLmluaXQsIGBXaXRob3V0TWV0YSgiZm9vIiwgMylgKQorICAgIF0pOworICB9CisKKyAgLy8gVGhlc2UgYXJlIGZyb20gRGVidWdQcm90b1Rlc3QudGhyaWZ0LgorICBzdHJ1Y3QgT25lT2ZFYWNoIHsKKyAgICBib29sIGltX3RydWU7CisgICAgYm9vbCBpbV9mYWxzZTsKKyAgICBieXRlIGFfYml0ZTsKKyAgICBzaG9ydCBpbnRlZ2VyMTY7CisgICAgaW50IGludGVnZXIzMjsKKyAgICBsb25nIGludGVnZXI2NDsKKyAgICBkb3VibGUgZG91YmxlX3ByZWNpc2lvbjsKKyAgICBzdHJpbmcgc29tZV9jaGFyYWN0ZXJzOworICAgIHN0cmluZyB6b21nX3VuaWNvZGU7CisgICAgYm9vbCB3aGF0X3dobzsKKyAgICBzdHJpbmcgYmFzZTY0OworICAgIGJ5dGVbXSBieXRlX2xpc3Q7CisgICAgc2hvcnRbXSBpMTZfbGlzdDsKKyAgICBsb25nW10gaTY0X2xpc3Q7CisKKyAgICBtaXhpbiBUU3RydWN0SGVscGVycyEoWworICAgICAgVEZpZWxkTWV0YShgaW1fdHJ1ZWAsIDEpLAorICAgICAgVEZpZWxkTWV0YShgaW1fZmFsc2VgLCAyKSwKKyAgICAgIFRGaWVsZE1ldGEoYGFfYml0ZWAsIDMsIFRSZXEuT1BUX0lOX1JFUV9PVVQsIHF7Y2FzdChieXRlKTEyN30pLAorICAgICAgVEZpZWxkTWV0YShgaW50ZWdlcjE2YCwgNCwgVFJlcS5PUFRfSU5fUkVRX09VVCwgcXtjYXN0KHNob3J0KTMyNzY3fSksCisgICAgICBURmllbGRNZXRhKGBpbnRlZ2VyMzJgLCA1KSwKKyAgICAgIFRGaWVsZE1ldGEoYGludGVnZXI2NGAsIDYsIFRSZXEuT1BUX0lOX1JFUV9PVVQsIHF7MTAwMDAwMDAwMDBMfSksCisgICAgICBURmllbGRNZXRhKGBkb3VibGVfcHJlY2lzaW9uYCwgNyksCisgICAgICBURmllbGRNZXRhKGBzb21lX2NoYXJhY3RlcnNgLCA4KSwKKyAgICAgIFRGaWVsZE1ldGEoYHpvbWdfdW5pY29kZWAsIDkpLAorICAgICAgVEZpZWxkTWV0YShgd2hhdF93aG9gLCAxMCksCisgICAgICBURmllbGRNZXRhKGBiYXNlNjRgLCAxMSksCisgICAgICBURmllbGRNZXRhKGBieXRlX2xpc3RgLCAxMiwgVFJlcS5PUFRfSU5fUkVRX09VVCwgcXt7CisgICAgICAgIGJ5dGVbXSB2OworICAgICAgICB2IH49IGNhc3QoYnl0ZSkxOworICAgICAgICB2IH49IGNhc3QoYnl0ZSkyOworICAgICAgICB2IH49IGNhc3QoYnl0ZSkzOworICAgICAgICByZXR1cm4gdjsKKyAgICAgIH0oKX0pLAorICAgICAgVEZpZWxkTWV0YShgaTE2X2xpc3RgLCAxMywgVFJlcS5PUFRfSU5fUkVRX09VVCwgcXt7CisgICAgICAgIHNob3J0W10gdjsKKyAgICAgICAgdiB+PSBjYXN0KHNob3J0KTE7CisgICAgICAgIHYgfj0gY2FzdChzaG9ydCkyOworICAgICAgICB2IH49IGNhc3Qoc2hvcnQpMzsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgICB9KCl9KSwKKyAgICAgIFRGaWVsZE1ldGEoYGk2NF9saXN0YCwgMTQsIFRSZXEuT1BUX0lOX1JFUV9PVVQsIHF7eworICAgICAgICBsb25nW10gdjsKKyAgICAgICAgdiB+PSAxTDsKKyAgICAgICAgdiB+PSAyTDsKKyAgICAgICAgdiB+PSAzTDsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgICB9KCl9KQorICAgIF0pOworICB9CisKKyAgc3RydWN0IEJvbmsgeworICAgIGludCB0eXBlOworICAgIHN0cmluZyBtZXNzYWdlOworCisgICAgbWl4aW4gVFN0cnVjdEhlbHBlcnMhKFsKKyAgICAgIFRGaWVsZE1ldGEoYHR5cGVgLCAxKSwKKyAgICAgIFRGaWVsZE1ldGEoYG1lc3NhZ2VgLCAyKQorICAgIF0pOworICB9CisKKyAgc3RydWN0IEhvbHlNb2xleSB7CisgICAgT25lT2ZFYWNoW10gYmlnOworICAgIEhhc2hTZXQhKHN0cmluZ1tdKSBjb250YWluOworICAgIEJvbmtbXVtzdHJpbmddIGJvbmtzOworCisgICAgbWl4aW4gVFN0cnVjdEhlbHBlcnMhKFsKKyAgICAgIFRGaWVsZE1ldGEoYGJpZ2AsIDEpLAorICAgICAgVEZpZWxkTWV0YShgY29udGFpbmAsIDIpLAorICAgICAgVEZpZWxkTWV0YShgYm9ua3NgLCAzKQorICAgIF0pOworICB9CisKKyAgc3RhdGljIGFzc2VydChzdHJ1Y3RJZGxTdHJpbmchV2l0aG91dE1ldGEgPT0KK2BzdHJ1Y3QgV2l0aG91dE1ldGEgeworICAtMTogc3RyaW5nIGEsCisgIC0yOiBpMzIgYiwKK30KK2ApOworCitpbXBvcnQgc3RkLmFsZ29yaXRobTsKKyAgc3RhdGljIGFzc2VydChzdHJ1Y3RJZGxTdHJpbmchV2l0aERlZmF1bHRzLnN0YXJ0c1dpdGgoCitgc3RydWN0IFdpdGhEZWZhdWx0cyB7CisgIC0xOiBzdHJpbmcgYSA9ICJhc2RmIiwKKyAgLTI6IGRvdWJsZSBiID0gMy4xNDFgKSk7CisKKyAgc3RhdGljIGFzc2VydChzdHJ1Y3RJZGxTdHJpbmchV2l0aERlZmF1bHRzLmVuZHNXaXRoKAorYDE6IFdpdGhvdXRNZXRhIGMgPSB7YTogImZvbyIsIGI6IDMsIH0sCit9CitgKSk7CisKKyAgc3RhdGljIGFzc2VydChzdHJ1Y3RJZGxTdHJpbmchT25lT2ZFYWNoID09Citgc3RydWN0IE9uZU9mRWFjaCB7CisgIDE6IGJvb2wgaW1fdHJ1ZSwKKyAgMjogYm9vbCBpbV9mYWxzZSwKKyAgMzogYnl0ZSBhX2JpdGUgPSAxMjcsCisgIDQ6IGkxNiBpbnRlZ2VyMTYgPSAzMjc2NywKKyAgNTogaTMyIGludGVnZXIzMiwKKyAgNjogaTY0IGludGVnZXI2NCA9IDEwMDAwMDAwMDAwLAorICA3OiBkb3VibGUgZG91YmxlX3ByZWNpc2lvbiwKKyAgODogc3RyaW5nIHNvbWVfY2hhcmFjdGVycywKKyAgOTogc3RyaW5nIHpvbWdfdW5pY29kZSwKKyAgMTA6IGJvb2wgd2hhdF93aG8sCisgIDExOiBzdHJpbmcgYmFzZTY0LAorICAxMjogbGlzdDxieXRlPiBieXRlX2xpc3QgPSBbMSwgMiwgMywgXSwKKyAgMTM6IGxpc3Q8aTE2PiBpMTZfbGlzdCA9IFsxLCAyLCAzLCBdLAorICAxNDogbGlzdDxpNjQ+IGk2NF9saXN0ID0gWzEsIDIsIDMsIF0sCit9CitgKTsKKworICBzdGF0aWMgYXNzZXJ0KHN0cnVjdElkbFN0cmluZyFCb25rID09Citgc3RydWN0IEJvbmsgeworICAxOiBpMzIgdHlwZSwKKyAgMjogc3RyaW5nIG1lc3NhZ2UsCit9CitgKTsKKworICBzdGF0aWMgYXNzZXJ0KHN0cnVjdElkbFN0cmluZyFIb2x5TW9sZXkgPT0KK2BzdHJ1Y3QgSG9seU1vbGV5IHsKKyAgMTogbGlzdDxPbmVPZkVhY2g+IGJpZywKKyAgMjogc2V0PGxpc3Q8c3RyaW5nPj4gY29udGFpbiwKKyAgMzogbWFwPHN0cmluZywgbGlzdDxCb25rPj4gYm9ua3MsCit9CitgKTsKK30KKwordmVyc2lvbiAodW5pdHRlc3QpIHsKKyAgY2xhc3MgRXhjZXB0aW9uV2l0aEFNYXAgOiBURXhjZXB0aW9uIHsKKyAgICBzdHJpbmcgYmxhaDsKKyAgICBzdHJpbmdbc3RyaW5nXSBtYXBfZmllbGQ7CisKKyAgICBtaXhpbiBUU3RydWN0SGVscGVycyEoWworICAgICAgVEZpZWxkTWV0YShgYmxhaGAsIDEpLAorICAgICAgVEZpZWxkTWV0YShgbWFwX2ZpZWxkYCwgMikKKyAgICBdKTsKKyAgfQorCisgIGludGVyZmFjZSBTcnYgeworICAgIHZvaWQgdm9pZE1ldGhvZCgpOworICAgIGludCBwcmltaXRpdmVNZXRob2QoKTsKKyAgICBPbmVPZkVhY2ggc3RydWN0TWV0aG9kKCk7CisgICAgdm9pZCBtZXRob2RXaXRoRGVmYXVsdEFyZ3MoaW50IHNvbWV0aGluZyk7CisgICAgdm9pZCBvbmV3YXlNZXRob2QoKTsKKyAgICB2b2lkIGV4Y2VwdGlvbk1ldGhvZCgpOworCisgICAgYWxpYXMgLkV4Y2VwdGlvbldpdGhBTWFwIEV4Y2VwdGlvbldpdGhBTWFwOworCisgICAgZW51bSBtZXRob2RNZXRhID0gWworICAgICAgVE1ldGhvZE1ldGEoYG1ldGhvZFdpdGhEZWZhdWx0QXJnc2AsCisgICAgICAgIFtUUGFyYW1NZXRhKGBzb21ldGhpbmdgLCAxLCBxezJ9KV0KKyAgICAgICksCisgICAgICBUTWV0aG9kTWV0YShgb25ld2F5TWV0aG9kYCwKKyAgICAgICAgW10sCisgICAgICAgIFtdLAorICAgICAgICBUTWV0aG9kVHlwZS5PTkVXQVkKKyAgICAgICksCisgICAgICBUTWV0aG9kTWV0YShgZXhjZXB0aW9uTWV0aG9kYCwKKyAgICAgICAgW10sCisgICAgICAgIFsKKyAgICAgICAgICBURXhjZXB0aW9uTWV0YSgiYSIsIDEsICJFeGNlcHRpb25XaXRoQU1hcCIpLAorICAgICAgICAgIFRFeGNlcHRpb25NZXRhKCJiIiwgMiwgIkV4Y2VwdGlvbldpdGhBTWFwIikKKyAgICAgICAgXQorICAgICAgKQorICAgIF07CisgIH0KKworICBpbnRlcmZhY2UgQ2hpbGRTcnYgOiBTcnYgeworICAgIGludCBjaGlsZE1ldGhvZChpbnQgYXJnKTsKKyAgfQorCisgIHN0YXRpYyBhc3NlcnQoaWRsU3RyaW5nIUNoaWxkU3J2ID09CitgZXhjZXB0aW9uIEV4Y2VwdGlvbldpdGhBTWFwIHsKKyAgMTogc3RyaW5nIGJsYWgsCisgIDI6IG1hcDxzdHJpbmcsIHN0cmluZz4gbWFwX2ZpZWxkLAorfQorCitzdHJ1Y3QgT25lT2ZFYWNoIHsKKyAgMTogYm9vbCBpbV90cnVlLAorICAyOiBib29sIGltX2ZhbHNlLAorICAzOiBieXRlIGFfYml0ZSA9IDEyNywKKyAgNDogaTE2IGludGVnZXIxNiA9IDMyNzY3LAorICA1OiBpMzIgaW50ZWdlcjMyLAorICA2OiBpNjQgaW50ZWdlcjY0ID0gMTAwMDAwMDAwMDAsCisgIDc6IGRvdWJsZSBkb3VibGVfcHJlY2lzaW9uLAorICA4OiBzdHJpbmcgc29tZV9jaGFyYWN0ZXJzLAorICA5OiBzdHJpbmcgem9tZ191bmljb2RlLAorICAxMDogYm9vbCB3aGF0X3dobywKKyAgMTE6IHN0cmluZyBiYXNlNjQsCisgIDEyOiBsaXN0PGJ5dGU+IGJ5dGVfbGlzdCA9IFsxLCAyLCAzLCBdLAorICAxMzogbGlzdDxpMTY+IGkxNl9saXN0ID0gWzEsIDIsIDMsIF0sCisgIDE0OiBsaXN0PGk2ND4gaTY0X2xpc3QgPSBbMSwgMiwgMywgXSwKK30KKworc2VydmljZSBTcnYgeworICB2b2lkIHZvaWRNZXRob2QoKSwKKyAgaTMyIHByaW1pdGl2ZU1ldGhvZCgpLAorICBPbmVPZkVhY2ggc3RydWN0TWV0aG9kKCksCisgIHZvaWQgbWV0aG9kV2l0aERlZmF1bHRBcmdzKDE6IGkzMiBzb21ldGhpbmcgPSAyLCApLAorICBvbmV3YXkgdm9pZCBvbmV3YXlNZXRob2QoKSwKKyAgdm9pZCBleGNlcHRpb25NZXRob2QoKSB0aHJvd3MgKDE6IEV4Y2VwdGlvbldpdGhBTWFwIGEsIDI6IEV4Y2VwdGlvbldpdGhBTWFwIGIsICksCit9CisKK3NlcnZpY2UgQ2hpbGRTcnYgZXh0ZW5kcyBTcnYgeworICBpMzIgY2hpbGRNZXRob2QoLTE6IGkzMiBwYXJhbTEsICksCit9CitgKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9wcm9jZXNzb3IuZCBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9wcm9jZXNzb3IuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2U3YWM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL3Byb2Nlc3Nvci5kCkBAIC0wLDAgKzEsNDk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LmNvZGVnZW4ucHJvY2Vzc29yOworCitpbXBvcnQgc3RkLmFsZ29yaXRobSA6IGZpbmQ7CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHksIGZyb250OworaW1wb3J0IHN0ZC5jb252IDogdG87CitpbXBvcnQgc3RkLnRyYWl0cyA6IFBhcmFtZXRlclR5cGVUdXBsZSwgUmV0dXJuVHlwZSwgVW5xdWFsOworaW1wb3J0IHN0ZC50eXBldHVwbGUgOiBhbGxTYXRpc2Z5LCBUeXBlVHVwbGU7CitpbXBvcnQgc3RkLnZhcmlhbnQgOiBWYXJpYW50OworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmJhc2U7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmNvZGVnZW47CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmN0ZmU7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLnByb2Nlc3NvcjsKKworLyoqCisgKiBTZXJ2aWNlIHByb2Nlc3NvciBmb3IgSW50ZXJmYWNlLCB3aGljaCBpbXBsZW1lbnRzIFRQcm9jZXNzb3IgYnkKKyAqIHN5bmNocm9ub3VzbHkgZm9yd2FyZGluZyByZXF1ZXN0cyBmb3IgdGhlIHNlcnZpY2UgbWV0aG9kcyB0byBhIGhhbmRsZXIKKyAqIGltcGxlbWVudGluZyBJbnRlcmZhY2UuCisgKgorICogVGhlIGdlbmVyYXRlZCBjbGFzcyBpbXBsZW1lbnRzIFRQcm9jZXNzb3IgYW5kIGFkZGl0aW9uYWxseSBhbGxvd3MgYQorICogVFByb2Nlc3NvckV2ZW50SGFuZGxlciB0byBiZSBzcGVjaWZpZWQgdmlhIHRoZSBwdWJsaWMgZXZlbnRIYW5kbGVyIHByb3BlcnR5LgorICogVGhlIGNvbnN0cnVjdG9yIHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50IG9mIHR5cGUgSW50ZXJmYWNlLCB3aGljaCBpcyB0aGUKKyAqIGhhbmRsZXIgdG8gZm9yd2FyZCB0aGUgcmVxdWVzdHMgdG86CisgKiAtLS0KKyAqIHRoaXMoSW50ZXJmYWNlIGlmYWNlKTsKKyAqIFRQcm9jZXNzb3JFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyOworICogLS0tCisgKgorICogSWYgSW50ZXJmYWNlIGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIHNlcnZpY2UgQmFzZUludGVyZmFjZSwgdGhpcyBjbGFzcyBpcworICogYWxzbyBkZXJpdmVkIGZyb20gVFNlcnZpY2VQcm9jZXNzb3IhQmFzZUludGVyZmFjZS4KKyAqCisgKiBUaGUgb3B0aW9uYWwgUHJvdG9jb2xzIHRlbXBsYXRlIHR1cGxlIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5CisgKiBvbmUgb3IgbW9yZSBUUHJvdG9jb2wgaW1wbGVtZW50YXRpb25zIHRvIHNwZWNpZmljYWxseSBnZW5lcmF0ZSBjb2RlIGZvci4gSWYKKyAqIHRoZSBhY3R1YWwgdHlwZXMgb2YgdGhlIHByb3RvY29scyBwYXNzZWQgdG8gcHJvY2VzcygpIGF0IHJ1bnRpbWUgbWF0Y2ggb25lCisgKiBvZiB0aGUgaXRlbXMgZnJvbSB0aGUgbGlzdCwgdGhlIG9wdGltaXplZCBjb2RlIHBhdGhzIGFyZSB0YWtlbiwgb3RoZXJ3aXNlLAorICogYSBnZW5lcmljIFRQcm90b2NvbCB2ZXJzaW9uIGlzIHVzZWQgYXMgZmFsbGJhY2suIEZvciBjYXNlcyB3aGVyZSB0aGUgaW5wdXQKKyAqIGFuZCBvdXRwdXQgcHJvdG9jb2xzIGRpZmZlciwgVFByb3RvY29sUGFpciEoSW5wdXRQcm90b2NvbCwgT3V0cHV0UHJvdG9jb2wpCisgKiBjYW4gYmUgdXNlZCBpbiB0aGUgUHJvdG9jb2xzIGxpc3Q6CisgKiAtLS0KKyAqIGludGVyZmFjZSBGb29TZXJ2aWNlIHsgdm9pZCBmb28oKTsgfQorICogY2xhc3MgRm9vSW1wbCB7IG92ZXJyaWRlIHZvaWQgZm9vIHt9IH0KKyAqCisgKiAvLyBQcm92aWRlcyBmYXN0IHBhdGggaWYgVEJpbmFyeVByb3RvY29sIVRCdWZmZXJlZFRyYW5zcG9ydCBpcyB1c2VkIGZvcgorICogLy8gYm90aCBpbnB1dCBhbmQgb3V0cHV0OgorICogYWxpYXMgVFNlcnZpY2VQcm9jZXNzb3IhKEZvb1NlcnZpY2UsIFRCaW5hcnlQcm90b2NvbCFUQnVmZmVyZWRUcmFuc3BvcnQpCisgKiAgIEJpbmFyeVByb2Nlc3NvcjsKKyAqCisgKiBhdXRvIHByb2MgPSBuZXcgQmluYXJ5UHJvY2Vzc29yKG5ldyBGb29JbXBsKCkpOworICoKKyAqIC8vIExvdyBvdmVyaGVhZC4KKyAqIHByb2MucHJvY2Vzcyh0QmluYXJ5UHJvdG9jb2wodEJ1ZmZlclRyYW5zcG9ydChzb21lU29ja2V0KSkpOworICoKKyAqIC8vIE5vdCBpbiB0aGUgc3BlY2lhbGl6YXRpb24gbGlzdCDigJMgaGlnaGVyIG92ZXJoZWFkLgorICogcHJvYy5wcm9jZXNzKHRCaW5hcnlQcm90b2NvbCh0RnJhbWVkVHJhbnNwb3J0KHNvbWVTb2NrZXQpKSk7CisgKgorICogLy8gU2FtZSBhcyBhYm92ZSwgYnV0IG9wdGltaXplZCBmb3IgdGhlIENvbXBhY3QgcHJvdG9jb2wgYmFja2VkIGJ5IGEKKyAqIC8vIFRQaXBlZFRyYW5zcG9ydCBmb3IgaW5wdXQgYW5kIGEgVEJ1ZmZlcmVkVHJhbnNwb3J0IGZvciBvdXRwdXQuCisgKiBhbGlhcyBUU2VydmljZVByb2Nlc3NvciEoRm9vU2VydmljZSwgVFByb3RvY29sUGFpciEoCisgKiAgIFRDb21wYWN0UHJvdG9jb2whVFBpcGVkVHJhbnNwb3J0LCBUQ29tcGFjdFByb3RvY29sIVRCdWZmZXJlZFRyYW5zcG9ydCkKKyAqICkgTWl4ZWRQcm9jZXNzb3I7CisgKiAtLS0KKyAqLwordGVtcGxhdGUgVFNlcnZpY2VQcm9jZXNzb3IoSW50ZXJmYWNlLCBQcm90b2NvbHMuLi4pIGlmICgKKyAgaXNTZXJ2aWNlIUludGVyZmFjZSAmJiBhbGxTYXRpc2Z5IShpc1RQcm90b2NvbE9yUGFpciwgUHJvdG9jb2xzKQorKSB7CisgIG1peGluKHsKKyAgICBzdGF0aWMgaWYgKGlzKEludGVyZmFjZSBCYXNlSW50ZXJmYWNlcyA9PSBzdXBlcikgJiYgQmFzZUludGVyZmFjZXMubGVuZ3RoID4gMCkgeworICAgICAgc3RhdGljIGFzc2VydChCYXNlSW50ZXJmYWNlcy5sZW5ndGggPT0gMSwKKyAgICAgICAgIlNlcnZpY2VzIGNhbm5vdCBiZSBkZXJpdmVkIGZyb20gbW9yZSB0aGFuIG9uZSBwYXJlbnQuIik7CisKKyAgICAgIHN0cmluZyBjb2RlID0gImNsYXNzIFRTZXJ2aWNlUHJvY2Vzc29yIDogIiB+CisgICAgICAgICJUU2VydmljZVByb2Nlc3NvciEoQmFzZVNlcnZpY2UhSW50ZXJmYWNlKSB7XG4iOworICAgICAgY29kZSB+PSAicHJpdmF0ZSBJbnRlcmZhY2UgaWZhY2VfO1xuIjsKKworICAgICAgc3RyaW5nIGNvbnN0cnVjdG9yQ29kZSA9ICJ0aGlzKEludGVyZmFjZSBpZmFjZSkge1xuIjsKKyAgICAgIGNvbnN0cnVjdG9yQ29kZSB+PSAic3VwZXIoaWZhY2UpO1xuIjsKKyAgICAgIGNvbnN0cnVjdG9yQ29kZSB+PSAiaWZhY2VfID0gaWZhY2U7XG4iOworICAgIH0gZWxzZSB7CisgICAgICBzdHJpbmcgY29kZSA9ICJjbGFzcyBUU2VydmljZVByb2Nlc3NvciA6IFRQcm9jZXNzb3IgeyI7CisgICAgICBjb2RlIH49IHF7CisgICAgICAgIG92ZXJyaWRlIGJvb2wgcHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCwKKyAgICAgICAgICBWYXJpYW50IGNvbnRleHQgPSBWYXJpYW50KCkKKyAgICAgICAgKSB7CisgICAgICAgICAgYXV0byBtc2cgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7CisKKyAgICAgICAgICB2b2lkIHdyaXRlRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwKKyAgICAgICAgICAgICAgbXNnLnNlcWlkKSk7CisgICAgICAgICAgICBlLndyaXRlKG9wcm90KTsKKyAgICAgICAgICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOworICAgICAgICAgICAgb3Byb3QudHJhbnNwb3J0LndyaXRlRW5kKCk7CisgICAgICAgICAgICBvcHJvdC50cmFuc3BvcnQuZmx1c2goKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAobXNnLnR5cGUgIT0gVE1lc3NhZ2VUeXBlLkNBTEwgJiYgbXNnLnR5cGUgIT0gVE1lc3NhZ2VUeXBlLk9ORVdBWSkgeworICAgICAgICAgICAgc2tpcChpcHJvdCwgVFR5cGUuU1RSVUNUKTsKKyAgICAgICAgICAgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCk7CisgICAgICAgICAgICBpcHJvdC50cmFuc3BvcnQucmVhZEVuZCgpOworCisgICAgICAgICAgICB3cml0ZUV4Y2VwdGlvbihuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uVHlwZS5JTlZBTElEX01FU1NBR0VfVFlQRSkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKworICAgICAgICAgIGF1dG8gZGcgPSBtc2cubmFtZSBpbiBwcm9jZXNzTWFwXzsKKyAgICAgICAgICBpZiAoIWRnKSB7CisgICAgICAgICAgICBza2lwKGlwcm90LCBUVHlwZS5TVFJVQ1QpOworICAgICAgICAgICAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsKKyAgICAgICAgICAgIGlwcm90LnRyYW5zcG9ydC5yZWFkRW5kKCk7CisKKyAgICAgICAgICAgIHdyaXRlRXhjZXB0aW9uKG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oIkludmFsaWQgbWV0aG9kIG5hbWU6ICciIH4KKyAgICAgICAgICAgICAgbXNnLm5hbWUgfiAiJy4iLCBUQXBwbGljYXRpb25FeGNlcHRpb24uVHlwZS5JTlZBTElEX01FU1NBR0VfVFlQRSkpOworCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorCisgICAgICAgICAgKCpkZykobXNnLnNlcWlkLCBpcHJvdCwgb3Byb3QsIGNvbnRleHQpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgVFByb2Nlc3NvckV2ZW50SGFuZGxlciBldmVudEhhbmRsZXI7CisKKyAgICAgICAgYWxpYXMgdm9pZCBkZWxlZ2F0ZShpbnQsIFRQcm90b2NvbCwgVFByb3RvY29sLCBWYXJpYW50KSBQcm9jZXNzRnVuYzsKKyAgICAgICAgcHJvdGVjdGVkIFByb2Nlc3NGdW5jW3N0cmluZ10gcHJvY2Vzc01hcF87CisgICAgICAgIHByaXZhdGUgSW50ZXJmYWNlIGlmYWNlXzsKKyAgICAgIH07CisKKyAgICAgIHN0cmluZyBjb25zdHJ1Y3RvckNvZGUgPSAidGhpcyhJbnRlcmZhY2UgaWZhY2UpIHtcbiI7CisgICAgICBjb25zdHJ1Y3RvckNvZGUgfj0gImlmYWNlXyA9IGlmYWNlO1xuIjsKKyAgICB9CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxpbmcgY29kZSBmb3IgZWFjaCBtZXRob2QsIGNvbnNpc3Rpbmcgb2YgdGhlIGRpc3BhdGNoCisgICAgLy8gZnVuY3Rpb24sIHJlZ2lzdGVyaW5nIGl0IGluIHRoZSBjb25zdHJ1Y3RvciwgYW5kIHRoZSBhY3R1YWwgdGVtcGxhdGVkCisgICAgLy8gaGFuZGxlciBmdW5jdGlvbi4KKyAgICBmb3JlYWNoIChtZXRob2ROYW1lOworICAgICAgRmlsdGVyTWV0aG9kTmFtZXMhKEludGVyZmFjZSwgX190cmFpdHMoZGVyaXZlZE1lbWJlcnMsIEludGVyZmFjZSkpCisgICAgKSB7CisgICAgICAvLyBSZWdpc3RlciB0aGUgcHJvY2Vzc2luZyBmdW5jdGlvbiBpbiB0aGUgY29uc3RydWN0b3IuCisgICAgICBpbW11dGFibGUgcHJvY0Z1bmNOYW1lID0gInByb2Nlc3NfIiB+IG1ldGhvZE5hbWU7CisgICAgICBpbW11dGFibGUgZGlzcGF0Y2hGdW5jTmFtZSA9IHByb2NGdW5jTmFtZSB+ICJfcHJvdG9jb2xEaXNwYXRjaCI7CisgICAgICBjb25zdHJ1Y3RvckNvZGUgfj0gInByb2Nlc3NNYXBfW2AiIH4gbWV0aG9kTmFtZSB+ICJgXSA9ICYiIH4KKyAgICAgICAgZGlzcGF0Y2hGdW5jTmFtZSB+ICI7XG4iOworCisgICAgICBib29sIG1ldGhvZE1ldGFGb3VuZDsKKyAgICAgIFRNZXRob2RNZXRhIG1ldGhvZE1ldGE7CisgICAgICBzdGF0aWMgaWYgKGlzKHR5cGVvZihJbnRlcmZhY2UubWV0aG9kTWV0YSkgOiBUTWV0aG9kTWV0YVtdKSkgeworICAgICAgICBlbnVtIG1ldGEgPSBmaW5kIWBhLm5hbWUgPT0gYmAoSW50ZXJmYWNlLm1ldGhvZE1ldGEsIG1ldGhvZE5hbWUpOworICAgICAgICBpZiAoIW1ldGEuZW1wdHkpIHsKKyAgICAgICAgICBtZXRob2RNZXRhRm91bmQgPSB0cnVlOworICAgICAgICAgIG1ldGhvZE1ldGEgPSBtZXRhLmZyb250OworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIFRoZSBkaXNwYXRjaCBmdW5jdGlvbiB0byBjYWxsIHRoZSBzcGVjaWFsaXplZCBoYW5kbGVyIGZ1bmN0aW9ucy4gV2UKKyAgICAgIC8vIHRlc3QgdGhlIHByb3RvY29scyBpZiB0aGV5IGNhbiBiZSBjb252ZXJ0ZWQgdG8gb25lIG9mIHRoZSBwYXNzZWQKKyAgICAgIC8vIHByb3RvY29sIHR5cGVzLCBhbmQgaWYgbm90LCBmYWxsIGJhY2sgdG8gdGhlIGdlbmVyaWMgVFByb3RvY29sCisgICAgICAvLyB2ZXJzaW9uIG9mIHRoZSBwcm9jZXNzaW5nIGZ1bmN0aW9uLgorICAgICAgY29kZSB+PSAidm9pZCAiIH4gZGlzcGF0Y2hGdW5jTmFtZSB+CisgICAgICAgICIoaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCwgVmFyaWFudCBjb250ZXh0KSB7XG4iOworICAgICAgY29kZSB+PSAiZm9yZWFjaCAoUHJvdG9jb2w7IFR5cGVUdXBsZSEoUHJvdG9jb2xzLCBUUHJvdG9jb2wpKSB7XG4iOworICAgICAgY29kZSB+PSBxeworICAgICAgICBzdGF0aWMgaWYgKGlzKFByb3RvY29sIF8gOiBUUHJvdG9jb2xQYWlyIShJLCBPKSwgSSwgTykpIHsKKyAgICAgICAgICBhbGlhcyBJIElQcm90OworICAgICAgICAgIGFsaWFzIE8gT1Byb3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYWxpYXMgUHJvdG9jb2wgSVByb3Q7CisgICAgICAgICAgYWxpYXMgUHJvdG9jb2wgT1Byb3Q7CisgICAgICAgIH0KKyAgICAgICAgYXV0byBjYXN0ZWRJUHJvdCA9IGNhc3QoSVByb3QpaXByb3Q7CisgICAgICAgIGF1dG8gY2FzdGVkT1Byb3QgPSBjYXN0KE9Qcm90KW9wcm90OworICAgICAgfTsKKyAgICAgIGNvZGUgfj0gImlmIChjYXN0ZWRJUHJvdCAmJiBjYXN0ZWRPUHJvdCkge1xuIjsKKyAgICAgIGNvZGUgfj0gcHJvY0Z1bmNOYW1lIH4KKyAgICAgICAgIiEoSVByb3QsIE9Qcm90KShzZXFpZCwgY2FzdGVkSVByb3QsIGNhc3RlZE9Qcm90LCBjb250ZXh0KTtcbiI7CisgICAgICBjb2RlIH49ICJyZXR1cm47XG4iOworICAgICAgY29kZSB+PSAifVxuIjsKKyAgICAgIGNvZGUgfj0gIn1cbiI7CisgICAgICBjb2RlIH49ICJ0aHJvdyBuZXcgVEV4Y2VwdGlvbihgSW50ZXJuYWwgZXJyb3I6IE51bGwgaXByb3Qvb3Byb3QgIiB+CisgICAgICAgICJwYXNzZWQgdG8gcHJvY2Vzc29yIHByb3RvY29sIGRpc3BhdGNoIGZ1bmN0aW9uLmApO1xuIjsKKyAgICAgIGNvZGUgfj0gIn1cbiI7CisKKyAgICAgIC8vIFRoZSBhY3R1YWwgaGFuZGxlciBmdW5jdGlvbiwgdGVtcGxhdGVkIG9uIHRoZSBpbnB1dCBhbmQgb3V0cHV0CisgICAgICAvLyBwcm90b2NvbCB0eXBlcy4KKyAgICAgIGNvZGUgfj0gInZvaWQgIiB+IHByb2NGdW5jTmFtZSB+ICIoSVByb3QsIE9Qcm90KShpbnQgc2VxaWQsIElQcm90ICIgfgorICAgICAgICAiaXByb3QsIE9Qcm90IG9wcm90LCBWYXJpYW50IGNvbm5lY3Rpb25Db250ZXh0KSAiIH4KKyAgICAgICAgImlmIChpc1RQcm90b2NvbCFJUHJvdCAmJiBpc1RQcm90b2NvbCFPUHJvdCkge1xuIjsKKyAgICAgIGNvZGUgfj0gIlRBcmdzU3RydWN0IShJbnRlcmZhY2UsIGAiIH4gbWV0aG9kTmFtZSB+ICJgKSBhcmdzO1xuIjsKKworICAgICAgLy8gU3RvcmUgdGhlIChxdWFsaWZpZWQpIG1ldGhvZCBuYW1lIGluIGEgbWFuaWZlc3QgY29uc3RhbnQgdG8gYXZvaWQKKyAgICAgIC8vIGhhdmluZyB0byBsaXR0ZXIgdGhlIGNvZGUgYmVsb3cgd2l0aCBsb3RzIG9mIHN0cmluZyBtYW5pcHVsYXRpb24uCisgICAgICBjb2RlIH49ICJlbnVtIG1ldGhvZE5hbWUgPSBgIiB+IG1ldGhvZE5hbWUgfiAiYDtcbiI7CisKKyAgICAgIGNvZGUgfj0gcXsKKyAgICAgICAgZW51bSBxTmFtZSA9IEludGVyZmFjZS5zdHJpbmdvZiB+ICIuIiB+IG1ldGhvZE5hbWU7CisKKyAgICAgICAgVmFyaWFudCBjYWxsQ29udGV4dDsKKyAgICAgICAgaWYgKGV2ZW50SGFuZGxlcikgeworICAgICAgICAgIGNhbGxDb250ZXh0ID0gZXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQocU5hbWUsIGNvbm5lY3Rpb25Db250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHNjb3BlIChleGl0KSB7CisgICAgICAgICAgaWYgKGV2ZW50SGFuZGxlcikgeworICAgICAgICAgICAgZXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY2FsbENvbnRleHQsIHFOYW1lKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXZlbnRIYW5kbGVyKSBldmVudEhhbmRsZXIucHJlUmVhZChjYWxsQ29udGV4dCwgcU5hbWUpOworCisgICAgICAgIGFyZ3MucmVhZChpcHJvdCk7CisgICAgICAgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCk7CisgICAgICAgIGlwcm90LnRyYW5zcG9ydC5yZWFkRW5kKCk7CisKKyAgICAgICAgaWYgKGV2ZW50SGFuZGxlcikgZXZlbnRIYW5kbGVyLnBvc3RSZWFkKGNhbGxDb250ZXh0LCBxTmFtZSk7CisgICAgICB9OworCisgICAgICBjb2RlIH49ICJUUmVzdWx0U3RydWN0IShJbnRlcmZhY2UsIGAiIH4gbWV0aG9kTmFtZSB+ICJgKSByZXN1bHQ7XG4iOworICAgICAgY29kZSB+PSAidHJ5IHtcbiI7CisKKyAgICAgIC8vIEdlbmVyYXRlIHRoZSBwYXJhbWV0ZXIgbGlzdCB0byBwYXNzIHRvIHRoZSBjYWxsZWQgaWZhY2UgZnVuY3Rpb24uCisgICAgICBzdHJpbmdbXSBwYXJhbUxpc3Q7CisgICAgICBmb3JlYWNoIChpLCBfOyBQYXJhbWV0ZXJUeXBlVHVwbGUhKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSkgeworICAgICAgICBzdHJpbmcgcGFyYW1OYW1lOworICAgICAgICBpZiAobWV0aG9kTWV0YUZvdW5kICYmIGkgPCBtZXRob2RNZXRhLnBhcmFtcy5sZW5ndGgpIHsKKyAgICAgICAgICBwYXJhbU5hbWUgPSBtZXRob2RNZXRhLnBhcmFtc1tpXS5uYW1lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBhcmFtTmFtZSA9ICJwYXJhbSIgfiB0byFzdHJpbmcoaSArIDEpOworICAgICAgICB9CisgICAgICAgIHBhcmFtTGlzdCB+PSAiYXJncy4iIH4gcGFyYW1OYW1lOworICAgICAgfQorCisgICAgICBpbW11dGFibGUgY2FsbCA9ICJpZmFjZV8uIiB+IG1ldGhvZE5hbWUgfiAiKCIgfiBjdGZlSm9pbihwYXJhbUxpc3QpIH4gIikiOworICAgICAgaWYgKGlzKFJldHVyblR5cGUhKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSA9PSB2b2lkKSkgeworICAgICAgICBjb2RlIH49IGNhbGwgfiAiO1xuIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvZGUgfj0gInJlc3VsdC5zZXQhYHN1Y2Nlc3NgKCIgfiBjYWxsIH4gIik7XG4iOworICAgICAgfQorCisgICAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIG9uZXdheSBtZXRob2QsIGdlbmVyYXRlIHRoZSByZWNlaXZpbmcgY29kZS4KKyAgICAgIGlmICghbWV0aG9kTWV0YUZvdW5kIHx8IG1ldGhvZE1ldGEudHlwZSAhPSBUTWV0aG9kVHlwZS5PTkVXQVkpIHsKKyAgICAgICAgaWYgKG1ldGhvZE1ldGFGb3VuZCkgeworICAgICAgICAgIGZvcmVhY2ggKGU7IG1ldGhvZE1ldGEuZXhjZXB0aW9ucykgeworICAgICAgICAgICAgY29kZSB+PSAifSBjYXRjaCAoSW50ZXJmYWNlLiIgfiBlLnR5cGUgfiAiICIgfiBlLm5hbWUgfiAiKSB7XG4iOworICAgICAgICAgICAgY29kZSB+PSAicmVzdWx0LnNldCFgIiB+IGUubmFtZSB+ICJgKCIgfiBlLm5hbWUgfiAiKTtcbiI7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvZGUgfj0gIn1cbiI7CisKKyAgICAgICAgY29kZSB+PSBxeworICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGV2ZW50SGFuZGxlcikgeworICAgICAgICAgICAgICBldmVudEhhbmRsZXIuaGFuZGxlckVycm9yKGNhbGxDb250ZXh0LCBxTmFtZSwgZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF1dG8geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24odG8hc3RyaW5nKGUpKTsKKyAgICAgICAgICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKAorICAgICAgICAgICAgICBUTWVzc2FnZShtZXRob2ROYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOworICAgICAgICAgICAgeC53cml0ZShvcHJvdCk7CisgICAgICAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgICAgICAgIG9wcm90LnRyYW5zcG9ydC53cml0ZUVuZCgpOworICAgICAgICAgICAgb3Byb3QudHJhbnNwb3J0LmZsdXNoKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGV2ZW50SGFuZGxlcikgZXZlbnRIYW5kbGVyLnByZVdyaXRlKGNhbGxDb250ZXh0LCBxTmFtZSk7CisKKyAgICAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZShtZXRob2ROYW1lLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkpOworICAgICAgICAgIHJlc3VsdC53cml0ZShvcHJvdCk7CisgICAgICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICAgICAgb3Byb3QudHJhbnNwb3J0LndyaXRlRW5kKCk7CisgICAgICAgICAgb3Byb3QudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgICAgICBpZiAoZXZlbnRIYW5kbGVyKSBldmVudEhhbmRsZXIucG9zdFdyaXRlKGNhbGxDb250ZXh0LCBxTmFtZSk7CisgICAgICAgIH07CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBGb3Igb25ld2F5IG1ldGhvZHMsIHdlIG9idmlvdXNseSBjYW5ub3Qgbm90aWZ5IHRoZSBjbGllbnQgb2YgYW55CisgICAgICAgIC8vIGV4Y2VwdGlvbnMsIGp1c3QgY2FsbCB0aGUgZXZlbnQgaGFuZGxlciBpZiBvbmUgaXMgc2V0LgorICAgICAgICBjb2RlIH49ICJ9XG4iOworICAgICAgICBjb2RlIH49IHF7CisgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoZXZlbnRIYW5kbGVyKSB7CisgICAgICAgICAgICAgIGV2ZW50SGFuZGxlci5oYW5kbGVyRXJyb3IoY2FsbENvbnRleHQsIHFOYW1lLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZXZlbnRIYW5kbGVyKSBldmVudEhhbmRsZXIub25ld2F5Q29tcGxldGUoY2FsbENvbnRleHQsIHFOYW1lKTsKKyAgICAgICAgfTsKKyAgICAgIH0KKyAgICAgIGNvZGUgfj0gIn1cbiI7CisKKyAgICB9CisKKyAgICBjb2RlIH49IGNvbnN0cnVjdG9yQ29kZSB+ICJ9XG4iOworICAgIGNvZGUgfj0gIn1cbiI7CisKKyAgICByZXR1cm4gY29kZTsKKyAgfSgpKTsKK30KKworLyoqCisgKiBBIHN0cnVjdCByZXByZXNlbnRpbmcgdGhlIGFyZ3VtZW50cyBvZiBhIFRocmlmdCBtZXRob2QgY2FsbC4KKyAqCisgKiBUaGVyZSBzaG91bGQgdXN1YWxseSBiZSBubyByZWFzb24gdG8gdXNlIHRoaXMgZGlyZWN0bHkgd2l0aG91dCB0aGUgaGVscCBvZgorICogVFNlcnZpY2VQcm9jZXNzb3IsIGJ1dCBpdCBpcyBkb2N1bWVudGVkIHB1YmxpY2x5IHRvIGhlbHAgZGVidWdnaW5nIGluIGNhc2UKKyAqIG9mIENURkUgZXJyb3JzLgorICoKKyAqIENvbnNpZGVyIHRoaXMgZXhhbXBsZToKKyAqIC0tLQorICogaW50ZXJmYWNlIEZvbyB7CisgKiAgIGludCBiYXIoc3RyaW5nIGEsIGJvb2wgYik7CisgKgorICogICBlbnVtIG1ldGhvZE1ldGEgPSBbCisgKiAgICAgVE1ldGhvZE1ldGEoImJhciIsIFtUUGFyYW1NZXRhKCJhIiwgMSksIFRQYXJhbU1ldGEoImIiLCAyKV0pCisgKiAgIF07CisgKiB9CisgKgorICogYWxpYXMgVEFyZ3NTdHJ1Y3QhKEZvbywgImJhciIpIEZvb0JhckFyZ3M7CisgKiAtLS0KKyAqCisgKiBUaGUgZGVmaW5pdGlvbiBvZiBGb29CYXJBcmdzIGlzIGVxdWl2YWxlbnQgdG86CisgKiAtLS0KKyAqIHN0cnVjdCBGb29CYXJBcmdzIHsKKyAqICAgc3RyaW5nIGE7CisgKiAgIGJvb2wgYjsKKyAqCisgKiAgIG1peGluIFRTdHJ1Y3RIZWxwZXJzIShbVEZpZWxkTWV0YSgiYSIsIDEsIFRSZXEuT1BUX0lOX1JFUV9PVVQpLAorICogICAgIFRGaWVsZE1ldGEoImIiLCAyLCBUUmVxLk9QVF9JTl9SRVFfT1VUKV0pOworICogfQorICogLS0tCisgKgorICogSWYgdGhlIFRWZXJib3NlQ29kZWdlbiB2ZXJzaW9uIGlzIGRlZmluZWQsIGEgd2FybmluZyBtZXNzYWdlIGlzIGlzc3VlZCBhdAorICogY29tcGlsYXRpb24gaWYgbm8gVE1ldGhvZE1ldGEgZm9yIEludGVyZmFjZS5tZXRob2ROYW1lIGlzIGZvdW5kLgorICovCit0ZW1wbGF0ZSBUQXJnc1N0cnVjdChJbnRlcmZhY2UsIHN0cmluZyBtZXRob2ROYW1lKSB7CisgIHN0YXRpYyBhc3NlcnQoaXModHlwZW9mKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSksCisgICAgIkNvdWxkIG5vdCBmaW5kIG1ldGhvZCAnIiB+IG1ldGhvZE5hbWUgfiAiJyBpbiAnIiB+IEludGVyZmFjZS5zdHJpbmdvZiB+ICInLiIpOworICBtaXhpbih7CisgICAgYm9vbCBtZXRob2RNZXRhRm91bmQ7CisgICAgVE1ldGhvZE1ldGEgbWV0aG9kTWV0YTsKKyAgICBzdGF0aWMgaWYgKGlzKHR5cGVvZihJbnRlcmZhY2UubWV0aG9kTWV0YSkgOiBUTWV0aG9kTWV0YVtdKSkgeworICAgICAgYXV0byBtZXRhID0gZmluZCFgYS5uYW1lID09IGJgKEludGVyZmFjZS5tZXRob2RNZXRhLCBtZXRob2ROYW1lKTsKKyAgICAgIGlmICghbWV0YS5lbXB0eSkgeworICAgICAgICBtZXRob2RNZXRhRm91bmQgPSB0cnVlOworICAgICAgICBtZXRob2RNZXRhID0gbWV0YS5mcm9udDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdHJpbmcgbWVtYmVyQ29kZTsKKyAgICBzdHJpbmdbXSBmaWVsZE1ldGFDb2RlczsKKyAgICBmb3JlYWNoIChpLCBfOyBQYXJhbWV0ZXJUeXBlVHVwbGUhKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSkgeworICAgICAgLy8gSWYgd2UgaGF2ZSBubyBtZXRhIGluZm9ybWF0aW9uLCBqdXN0IHVzZSBwYXJhbTEsIHBhcmFtMiwgZXRjLiBhcworICAgICAgLy8gZmllbGQgbmFtZXMsIGl0IHNob3VsZG4ndCByZWFsbHkgbWF0dGVyIGFueXdheS4gMS1iYXNlZCDCu2luZGV4aW5nwqsKKyAgICAgIC8vIGlzIHVzZWQgdG8gbWF0Y2ggdGhlIGNvbW1vbiBzY2hlbWUgaW4gdGhlIFRocmlmdCB3b3JsZC4KKyAgICAgIHN0cmluZyBtZW1iZXJJZDsKKyAgICAgIHN0cmluZyBtZW1iZXJOYW1lOworICAgICAgaWYgKG1ldGhvZE1ldGFGb3VuZCAmJiBpIDwgbWV0aG9kTWV0YS5wYXJhbXMubGVuZ3RoKSB7CisgICAgICAgIG1lbWJlcklkID0gdG8hc3RyaW5nKG1ldGhvZE1ldGEucGFyYW1zW2ldLmlkKTsKKyAgICAgICAgbWVtYmVyTmFtZSA9IG1ldGhvZE1ldGEucGFyYW1zW2ldLm5hbWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBtZW1iZXJJZCA9IHRvIXN0cmluZyhpICsgMSk7CisgICAgICAgIG1lbWJlck5hbWUgPSAicGFyYW0iIH4gdG8hc3RyaW5nKGkgKyAxKTsKKyAgICAgIH0KKworICAgICAgLy8gVW5xdWFsISgpIGlzIG5lZWRlZCB0byBnZW5lcmF0ZSBtdXRhYmxlIGZpZWxkcyBmb3IgcmVmIGNvbnN0KCkKKyAgICAgIC8vIHN0cnVjdCBwYXJhbWV0ZXJzLgorICAgICAgbWVtYmVyQ29kZSB+PSAiVW5xdWFsIShQYXJhbWV0ZXJUeXBlVHVwbGUhKEludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSB+CisgICAgICAgICIpWyIgfiB0byFzdHJpbmcoaSkgfiAiXSkiIH4gbWVtYmVyTmFtZSB+ICI7XG4iOworCisgICAgICBmaWVsZE1ldGFDb2RlcyB+PSAiVEZpZWxkTWV0YShgIiB+IG1lbWJlck5hbWUgfiAiYCwgIiB+IG1lbWJlcklkIH4KKyAgICAgICAgIiwgVFJlcS5PUFRfSU5fUkVRX09VVCkiOworICAgIH0KKworICAgIHN0cmluZyBjb2RlID0gInN0cnVjdCBUQXJnc1N0cnVjdCB7XG4iOworICAgIGNvZGUgfj0gbWVtYmVyQ29kZTsKKyAgICB2ZXJzaW9uIChUVmVyYm9zZUNvZGVnZW4pIHsKKyAgICAgIGlmICghbWV0aG9kTWV0YUZvdW5kICYmCisgICAgICAgIFBhcmFtZXRlclR5cGVUdXBsZSEobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpLmxlbmd0aCA+IDApCisgICAgICB7CisgICAgICAgIGNvZGUgfj0gInByYWdtYShtc2csIGBbdGhyaWZ0LmNvZGVnZW4ucHJvY2Vzc29yLlRBcmdzU3RydWN0XSBXYXJuaW5nOiBObyAiIH4KKyAgICAgICAgICAibWV0YSBpbmZvcm1hdGlvbiBmb3IgbWV0aG9kICciIH4gbWV0aG9kTmFtZSB+ICInIGluIHNlcnZpY2UgJyIgfgorICAgICAgICAgIEludGVyZmFjZS5zdHJpbmdvZiB+ICInIGZvdW5kLmApO1xuIjsKKyAgICAgIH0KKyAgICB9CisgICAgaW1tdXRhYmxlIGZpZWxkTWV0YUNvZGUgPQorICAgICAgZmllbGRNZXRhQ29kZXMuZW1wdHkgPyAiIiA6ICJbIiB+IGN0ZmVKb2luKGZpZWxkTWV0YUNvZGVzKSB+ICJdIjsKKyAgICBjb2RlIH49ICJtaXhpbiBUU3RydWN0SGVscGVycyEoIiB+IGZpZWxkTWV0YUNvZGUgIH4gIik7XG4iOworICAgIGNvZGUgfj0gIn1cbiI7CisgICAgcmV0dXJuIGNvZGU7CisgIH0oKSk7Cit9CisKKy8qKgorICogQSBzdHJ1Y3QgcmVwcmVzZW50aW5nIHRoZSByZXN1bHQgb2YgYSBUaHJpZnQgbWV0aG9kIGNhbGwuCisgKgorICogSXQgY29udGFpbnMgYSBmaWVsZCBjYWxsZWQgInN1Y2Nlc3MiIGZvciB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbgorICogKHdpdGggaWQgMCksIGFuZCBhZGRpdGlvbmFsIGZpZWxkcyBmb3IgdGhlIGV4Y2VwdGlvbnMgZGVjbGFyZWQgZm9yIHRoZQorICogbWV0aG9kLCBpZiBhbnkuCisgKgorICogVGhlcmUgc2hvdWxkIHVzdWFsbHkgYmUgbm8gcmVhc29uIHRvIHVzZSB0aGlzIGRpcmVjdGx5IHdpdGhvdXQgdGhlIGhlbHAgb2YKKyAqIFRTZXJ2aWNlUHJvY2Vzc29yLCBidXQgaXQgaXMgZG9jdW1lbnRlZCBwdWJsaWNseSB0byBoZWxwIGRlYnVnZ2luZyBpbiBjYXNlCisgKiBvZiBDVEZFIGVycm9ycy4KKyAqCisgKiBDb25zaWRlciB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisgKiAtLS0KKyAqIGludGVyZmFjZSBGb28geworICogICBpbnQgYmFyKHN0cmluZyBhKTsKKyAqCisgKiAgIGFsaWFzIC5Gb29FeGNlcHRpb24gRm9vRXhjZXB0aW9uOworICoKKyAqICAgZW51bSBtZXRob2RNZXRhID0gWworICogICAgIFRNZXRob2RNZXRhKCJiYXIiLAorICogICAgICAgW1RQYXJhbU1ldGEoImEiLCAxKV0sCisgKiAgICAgICBbVEV4Y2VwdGlvbk1ldGEoImZvb2UiLCAxLCAiRm9vRXhjZXB0aW9uIildCisgKiAgICAgKQorICogICBdOworICogfQorICogYWxpYXMgVFJlc3VsdFN0cnVjdCEoRm9vLCAiYmFyIikgRm9vQmFyUmVzdWx0OworICogLS0tCisgKgorICogVGhlIGRlZmluaXRpb24gb2YgRm9vQmFyUmVzdWx0IGlzIGVxdWl2YWxlbnQgdG86CisgKiAtLS0KKyAqIHN0cnVjdCBGb29CYXJSZXN1bHQgeworICogICBpbnQgc3VjY2VzczsKKyAqICAgRm9vRXhjZXB0aW9uIGZvb2U7CisgKgorICogICBtaXhpbihUU3RydWN0SGVscGVycyEoW1RGaWVsZE1ldGEoInN1Y2Nlc3MiLCAwLCBUUmVxLk9QVElPTkFMKSwKKyAqICAgICBURmllbGRNZXRhKCJmb29lIiwgMSwgVFJlcS5PUFRJT05BTCldKSk7CisgKiB9CisgKiAtLS0KKyAqCisgKiBJZiB0aGUgVFZlcmJvc2VDb2RlZ2VuIHZlcnNpb24gaXMgZGVmaW5lZCwgYSB3YXJuaW5nIG1lc3NhZ2UgaXMgaXNzdWVkIGF0CisgKiBjb21waWxhdGlvbiBpZiBubyBUTWV0aG9kTWV0YSBmb3IgSW50ZXJmYWNlLm1ldGhvZE5hbWUgaXMgZm91bmQuCisgKi8KK3RlbXBsYXRlIFRSZXN1bHRTdHJ1Y3QoSW50ZXJmYWNlLCBzdHJpbmcgbWV0aG9kTmFtZSkgeworICBzdGF0aWMgYXNzZXJ0KGlzKHR5cGVvZihtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkpLAorICAgICJDb3VsZCBub3QgZmluZCBtZXRob2QgJyIgfiBtZXRob2ROYW1lIH4gIicgaW4gJyIgfiBJbnRlcmZhY2Uuc3RyaW5nb2YgfiAiJy4iKTsKKworICBtaXhpbih7CisgICAgc3RyaW5nIGNvZGUgPSAic3RydWN0IFRSZXN1bHRTdHJ1Y3Qge1xuIjsKKworICAgIHN0cmluZ1tdIGZpZWxkTWV0YUNvZGVzOworCisgICAgc3RhdGljIGlmICghaXMoUmV0dXJuVHlwZSEobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpID09IHZvaWQpKSB7CisgICAgICBjb2RlIH49ICJSZXR1cm5UeXBlIShJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUgfiAiKSBzdWNjZXNzO1xuIjsKKyAgICAgIGZpZWxkTWV0YUNvZGVzIH49ICJURmllbGRNZXRhKGBzdWNjZXNzYCwgMCwgVFJlcS5PUFRJT05BTCkiOworICAgIH0KKworICAgIGJvb2wgbWV0aG9kTWV0YUZvdW5kOworICAgIHN0YXRpYyBpZiAoaXModHlwZW9mKEludGVyZmFjZS5tZXRob2RNZXRhKSA6IFRNZXRob2RNZXRhW10pKSB7CisgICAgICBhdXRvIG1ldGEgPSBmaW5kIWBhLm5hbWUgPT0gYmAoSW50ZXJmYWNlLm1ldGhvZE1ldGEsIG1ldGhvZE5hbWUpOworICAgICAgaWYgKCFtZXRhLmVtcHR5KSB7CisgICAgICAgIGZvcmVhY2ggKGU7IG1ldGEuZnJvbnQuZXhjZXB0aW9ucykgeworICAgICAgICAgIGNvZGUgfj0gIkludGVyZmFjZS4iIH4gZS50eXBlIH4gIiAiIH4gZS5uYW1lIH4gIjtcbiI7CisgICAgICAgICAgZmllbGRNZXRhQ29kZXMgfj0gIlRGaWVsZE1ldGEoYCIgfiBlLm5hbWUgfiAiYCwgIiB+IHRvIXN0cmluZyhlLmlkKSB+CisgICAgICAgICAgICAiLCBUUmVxLk9QVElPTkFMKSI7CisgICAgICAgIH0KKyAgICAgICAgbWV0aG9kTWV0YUZvdW5kID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2ZXJzaW9uIChUVmVyYm9zZUNvZGVnZW4pIHsKKyAgICAgIGlmICghbWV0aG9kTWV0YUZvdW5kICYmCisgICAgICAgIFBhcmFtZXRlclR5cGVUdXBsZSEobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpLmxlbmd0aCA+IDApCisgICAgICB7CisgICAgICAgIGNvZGUgfj0gInByYWdtYShtc2csIGBbdGhyaWZ0LmNvZGVnZW4ucHJvY2Vzc29yLlRSZXN1bHRTdHJ1Y3RdIFdhcm5pbmc6IE5vICIgfgorICAgICAgICAgICJtZXRhIGluZm9ybWF0aW9uIGZvciBtZXRob2QgJyIgfiBtZXRob2ROYW1lIH4gIicgaW4gc2VydmljZSAnIiB+CisgICAgICAgICAgSW50ZXJmYWNlLnN0cmluZ29mIH4gIicgZm91bmQuYCk7XG4iOworICAgICAgfQorICAgIH0KKworICAgIGltbXV0YWJsZSBmaWVsZE1ldGFDb2RlID0KKyAgICAgIGZpZWxkTWV0YUNvZGVzLmVtcHR5ID8gIiIgOiAiWyIgfiBjdGZlSm9pbihmaWVsZE1ldGFDb2RlcykgfiAiXSI7CisgICAgY29kZSB+PSAibWl4aW4gVFN0cnVjdEhlbHBlcnMhKCIgfiBmaWVsZE1ldGFDb2RlICB+ICIpO1xuIjsKKyAgICBjb2RlIH49ICJ9XG4iOworICAgIHJldHVybiBjb2RlOworICB9KCkpOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9pbmRleC5kIGIvbGliL2Qvc3JjL3RocmlmdC9pbmRleC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOTE0YjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2luZGV4LmQKQEAgLTAsMCArMSwzMyBAQAorRGRvYworCis8aDI+UGFja2FnZSBvdmVydmlldzwvaDI+CisKKzxkbD4KKyAgPGR0PiQoRF9DT0RFIHRocmlmdC5hc3luYyk8L2R0PgorICA8ZGQ+U3VwcG9ydCBpbmZyYXN0cnVjdHVyZSBmb3IgaGFuZGxpbmcgY2xpZW50LXNpZGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgdXNpbmcgbm9uLWJsb2NraW5nIEkvTyBhbmQgY29yb3V0aW5lcy48L2RkPgorCisgIDxkdD4kKERfQ09ERSB0aHJpZnQuY29kZWdlbik8L2R0PgorICA8ZGQ+CisgICAgPHA+VGVtcGxhdGVzIHVzZWQgZm9yIGdlbmVyYXRpbmcgVGhyaWZ0IGNsaWVudHMvcHJvY2Vzc29ycyBmcm9tIHJlZ3VsYXIgRCBzdHJ1Y3QgYW5kIGludGVyZmFjZSBkZWZpbml0aW9ucy48L3A+CisgICAgPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBTZXZlcmFsIGFydGlmYWN0cyBpbiB0aGVzZSBtb2R1bGVzIGhhdmUgb3B0aW9ucyBmb3Igc3BlY2lmeWluZyB0aGUgZXhhY3QgcHJvdG9jb2wgdHlwZXMgdXNlZC4gSW4gdGhpcyBjYXNlLCB0aGUgYW1vdW50IG9mIHZpcnR1YWwgY2FsbHMgY2FuIGJlIGdyZWF0bHkgcmVkdWNlZCBhbmQgYXMgYSByZXN1bHQsIHRoZSBjb2RlIGFsc28gY2FuIGJlIG9wdGltaXplZCBiZXR0ZXIuIElmIHBlcmZvcm1hbmNlIGlzIG5vdCBhIGNvbmNlcm4gb3IgdGhlIGFjdHVhbCBwcm90b2NvbCB0eXBlIGlzIG5vdCBrbm93biBhdCBjb21waWxlIHRpbWUsIHRoZXNlIHBhcmFtZXRlcnMgY2FuIGp1c3QgYmUgbGVmdCBhdCB0aGVpciBkZWZhdWx0cy4KKyAgICA8L3A+CisgIDwvZGQ+CisKKyAgPGR0PiQoRF9DT0RFIHRocmlmdC5pbnRlcm5hbCk8L2R0PgorICA8ZGQ+SW50ZXJuYWwgaGVscGVyIG1vZHVsZXMgdXNlZCBieSB0aGUgVGhyaWZ0IGxpYnJhcnkuIFRoaXMgcGFja2FnZSBpcyBub3QgcGFydCBvZiB0aGUgcHVibGljIEFQSSwgYW5kIG5vIHN0YWJpbGl0eSBndWFyYW50ZWVzIGFyZSBnaXZlbiB3aGF0c29ldmVyLjwvZGQ+CisKKyAgPGR0PiQoRF9DT0RFIHRocmlmdC5wcm90b2NvbCk8L2R0PgorICA8ZGQ+VGhlIFRocmlmdCBwcm90b2NvbCBpbXBsZW10YXRpb25zIHdoaWNoIHNwZWNpZnkgaG93IHRvIHBhc3MgbWVzc2FnZXMgb3ZlciBhIFRUcmFuc3BvcnQuPC9kZD4KKworICA8ZHQ+JChEX0NPREUgdGhyaWZ0LnNlcnZlcik8L2R0PgorICA8ZGQ+R2VuZXJpYyBUaHJpZnQgc2VydmVyIGltcGxlbWVudGF0aW9ucyBoYW5kbGluZyBjbGllbnRzIG92ZXIgYSBUVHJhbnNwb3J0IGludGVyZmFjZSBhbmQgZm9yd2FyZGluZyByZXF1ZXN0cyB0byBhIFRQcm9jZXNzb3IgKHdoaWNoIGlzIGluIHR1cm4gdXN1YWxseSBwcm92aWRlZCBieSB0aHJpZnQuY29kZWdlbikuPC9kZD4KKworICA8ZHQ+JChEX0NPREUgdGhyaWZ0LnRyYW5zcG9ydCk8L2R0PgorICA8ZGQ+VGhlIFRUcmFuc3BvcnQgZGF0YSBzb3VyY2Uvc2luayBpbnRlcmZhY2UgdXNlZCBpbiB0aGUgVGhyaWZ0IGxpYnJhcnkgYW5kIGl0cyBpbWlwbGVtZW50YXRpb25zLjwvZGQ+CisKKyAgPGR0PiQoRF9DT0RFIHRocmlmdC51dGlsKTwvZHQ+CisgIDxkZD5HZW5lcmFsLXB1cnBvc2UgdXRpbGl0eSBtb2R1bGVzIG5vdCBzcGVjaWZpYyB0byBUaHJpZnQsIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuPC9kZD4KKzwvZGw+CisKK01hY3JvczoKKyAgVElUTEUgPSBUaHJpZnQgRCBTb2Z0d2FyZSBMaWJyYXJ5CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL2FsZ29yaXRobS5kIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9hbGdvcml0aG0uZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTM4YWMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9hbGdvcml0aG0uZApAQCAtMCwwICsxLDU1IEBACisvKioKKyAqIENvbnRhaW5zIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiBzdGQuYWxnb3JpdGhtLnJlbW92ZSB0aGF0IGRvZXNuJ3QgdGFrZSBhbgorICogYWxpYXMgcGFyYW1ldGVyIHRvIGF2b2lkIERNRCBAQEJVRzYzOTVAQC4KKyAqLworbW9kdWxlIHRocmlmdC5pbnRlcm5hbC5hbGdvcml0aG07CisKK2ltcG9ydCBzdGQuYWxnb3JpdGhtIDogbW92ZTsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uOworaW1wb3J0IHN0ZC5mdW5jdGlvbmFsOworaW1wb3J0IHN0ZC5yYW5nZTsKK2ltcG9ydCBzdGQudHJhaXRzOworCitlbnVtIFN3YXBTdHJhdGVneQoreworICAgIHVuc3RhYmxlLAorICAgIHNlbWlzdGFibGUsCisgICAgc3RhYmxlLAorfQorCitSYW5nZSByZW1vdmVFcXVhbChTd2FwU3RyYXRlZ3kgcyA9IFN3YXBTdHJhdGVneS5zdGFibGUsIFJhbmdlLCBFKShSYW5nZSByYW5nZSwgRSBlKQoraWYgKGlzQmlkaXJlY3Rpb25hbFJhbmdlIVJhbmdlKQoreworICAgIGF1dG8gcmVzdWx0ID0gcmFuZ2U7CisgICAgc3RhdGljIGlmIChzICE9IFN3YXBTdHJhdGVneS5zdGFibGUpCisgICAgeworICAgICAgICBmb3IgKDshcmFuZ2UuZW1wdHk7KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocmFuZ2UuZnJvbnQgIWlzIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmFuZ2UucG9wRnJvbnQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtb3ZlKHJhbmdlLmJhY2ssIHJhbmdlLmZyb250KTsKKyAgICAgICAgICAgIHJhbmdlLnBvcEJhY2s7CisgICAgICAgICAgICByZXN1bHQucG9wQmFjazsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhdXRvIHRndCA9IHJhbmdlOworICAgICAgICBmb3IgKDsgIXJhbmdlLmVtcHR5OyByYW5nZS5wb3BGcm9udCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJhbmdlLmZyb250IGlzIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8geWFuayB0aGlzIGd1eQorICAgICAgICAgICAgICAgIHJlc3VsdC5wb3BCYWNrOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8ga2VlcCB0aGlzIGd1eQorICAgICAgICAgICAgbW92ZShyYW5nZS5mcm9udCwgdGd0LmZyb250KTsKKyAgICAgICAgICAgIHRndC5wb3BGcm9udDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9jb2RlZ2VuLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL2NvZGVnZW4uZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWY5ZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9jb2RlZ2VuLmQKQEAgLTAsMCArMSw0NTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbW9kdWxlIHRocmlmdC5pbnRlcm5hbC5jb2RlZ2VuOworCitpbXBvcnQgc3RkLmFsZ29yaXRobSA6IGNhbkZpbmQ7CitpbXBvcnQgc3RkLnRyYWl0cyA6IEludGVyZmFjZXNUdXBsZSwgaXNTb21lRnVuY3Rpb24sIGlzU29tZVN0cmluZzsKK2ltcG9ydCBzdGQudHlwZXR1cGxlIDogc3RhdGljSW5kZXhPZiwgc3RhdGljTWFwLCBOb0R1cGxpY2F0ZXMsIFR5cGVUdXBsZTsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5iYXNlOworCisvKioKKyAqIFJlbW92ZXMgYWxsIHR5cGUgcXVhbGlmaWVycyBmcm9tIFQuCisgKgorICogSW4gY29udHJhc3QgdG8gc3RkLnRyYWl0cy5VbnF1YWwsIEZ1bGx5VW5xdWFsIGFsc28gcmVtb3ZlcyBxdWFsaWZpZXJzIGZyb20KKyAqIGFycmF5IGVsZW1lbnRzIChlLmcuIGltbXV0YWJsZShieXRlW10pIC0+IGJ5dGVbXSwgbm90IGltbXV0YWJsZShieXRlKVtdKSwKKyAqIGV4Y2x1ZGluZyBzdHJpbmdzIChzdHJpbmcgaXNuJ3QgcmVkdWNlZCB0byBjaGFyW10pLgorICovCit0ZW1wbGF0ZSBGdWxseVVucXVhbChUKSB7CisgIHN0YXRpYyBpZiAoaXMoVCBfID09IGNvbnN0KFUpLCBVKSkgeworICAgIGFsaWFzIEZ1bGx5VW5xdWFsIVUgRnVsbHlVbnF1YWw7CisgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKFQgXyA9PSBpbW11dGFibGUoVSksIFUpKSB7CisgICAgYWxpYXMgRnVsbHlVbnF1YWwhVSBGdWxseVVucXVhbDsKKyAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoVCBfID09IHNoYXJlZChVKSwgVSkpIHsKKyAgICBhbGlhcyBGdWxseVVucXVhbCFVIEZ1bGx5VW5xdWFsOworICB9IGVsc2Ugc3RhdGljIGlmIChpcyhUIF8gPT0gVVtdLCBVKSAmJiAhaXNTb21lU3RyaW5nIVQpIHsKKyAgICBhbGlhcyBGdWxseVVucXVhbCEoVSlbXSBGdWxseVVucXVhbDsKKyAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoVCBfID09IFZbS10sIEssIFYpKSB7CisgICAgYWxpYXMgRnVsbHlVbnF1YWwhKFYpW0Z1bGx5VW5xdWFsIUtdIEZ1bGx5VW5xdWFsOworICB9IGVsc2UgeworICAgIGFsaWFzIFQgRnVsbHlVbnF1YWw7CisgIH0KK30KKworLyoqCisgKiB0cnVlIGlmIG51bGwgY2FuIGJlIGFzc2lnbmVkIHRvIHRoZSBwYXNzZWQgdHlwZSwgZmFsc2UgaWYgbm90LgorICovCit0ZW1wbGF0ZSBpc051bGxhYmxlKFQpIHsKKyAgZW51bSBpc051bGxhYmxlID0gX190cmFpdHMoY29tcGlsZXMsIHsgVCB0ID0gbnVsbDsgfSk7Cit9CisKK3RlbXBsYXRlIGlzU3RydWN0KFQpIHsKKyAgZW51bSBpc1N0cnVjdCA9IGlzKFQgPT0gc3RydWN0KTsKK30KKwordGVtcGxhdGUgaXNFeGNlcHRpb24oVCkgeworIGVudW0gaXNFeGNlcHRpb24gPSBpcyhUIDogRXhjZXB0aW9uKTsKK30KKwordGVtcGxhdGUgaXNFbnVtKFQpIHsKKyAgZW51bSBpc0VudW0gPSBpcyhUID09IGVudW0pOworfQorCisvKioKKyAqIEFsaWFzZXMgaXRzZWxmIHRvIFQubmFtZS4KKyAqLwordGVtcGxhdGUgR2V0TWVtYmVyKFQsIHN0cmluZyBuYW1lKSB7CisgIG1peGluKCJhbGlhcyBULiIgfiBuYW1lIH4gIiBHZXRNZW1iZXI7Iik7Cit9CisKKy8qKgorICogQWxpYXNlcyBpdHNlbGYgdG8gdHlwZW9mKHN5bWJvbCkuCisgKi8KK3RlbXBsYXRlIFR5cGVPZihhbGlhcyBzeW1ib2wpIHsKKyAgYWxpYXMgdHlwZW9mKHN5bWJvbCkgVHlwZU9mOworfQorCisvKioKKyAqIEFsaWFzZXMgaXRzZWxmIHRvIHRoZSB0eXBlIG9mIHRoZSBUIG1lbWJlciBjYWxsZWQgbmFtZS4KKyAqLworYWxpYXMgQ29tcG9zZSEoVHlwZU9mLCBHZXRNZW1iZXIpIE1lbWJlclR5cGU7CisKKy8qKgorICogUmV0dXJucyB0aGUgZmllbGQgbWV0YWRhdGEgYXJyYXkgZm9yIFQgaWYgYW55LCBvciBhbiBlbXB0eSBhcnJheSBvdGhlcndpc2UuCisgKi8KK3RlbXBsYXRlIGdldEZpZWxkTWV0YShUKSBpZiAoaXNTdHJ1Y3QhVCB8fCBpc0V4Y2VwdGlvbiFUKSB7CisgIHN0YXRpYyBpZiAoaXModHlwZW9mKFQuZmllbGRNZXRhKSA9PSBURmllbGRNZXRhW10pKSB7CisgICAgZW51bSBnZXRGaWVsZE1ldGEgPSBULmZpZWxkTWV0YTsKKyAgfSBlbHNlIHsKKyAgICBlbnVtIFRGaWVsZE1ldGFbXSBnZXRGaWVsZE1ldGEgPSBbXTsKKyAgfQorfQorCisvKioKKyAqIE1lcmdlcyB0aGUgZmllbGQgbWV0YWRhdGEgYXJyYXkgZm9yIEQgd2l0aCB0aGUgcGFzc2VkIGFycmF5LgorICovCit0ZW1wbGF0ZSBtZXJnZUZpZWxkTWV0YShULCBhbGlhcyBmaWVsZE1ldGFEYXRhID0gY2FzdChURmllbGRNZXRhW10pbnVsbCkgeworICAvLyBOb3RlOiBXZSBkb24ndCB1c2UgZ2V0RmllbGRNZXRhIGhlcmUgdG8gYXZvaWQgYnVnIGlmIGl0IGlzIGluc3RhbnRpYXRlZAorICAvLyBmcm9tIFRJc1NldEZsYWdzLCBzZWUgY29tbWVudCB0aGVyZS4KKyAgc3RhdGljIGlmIChpcyh0eXBlb2YoVC5maWVsZE1ldGEpID09IFRGaWVsZE1ldGFbXSkpIHsKKyAgICBlbnVtIG1lcmdlRmllbGRNZXRhID0gVC5maWVsZE1ldGEgfiBmaWVsZE1ldGFEYXRhOworICB9IGVsc2UgeworICAgIGVudW0gVEZpZWxkTWV0YVtdIG1lcmdlRmllbGRNZXRhID0gZmllbGRNZXRhRGF0YTsKKyAgfQorfQorCisvKioKKyAqIFJldHVybnMgdGhlIGZpZWxkIHJlcXVpcmVtZW50IGxldmVsIGZvciBULm5hbWUuCisgKi8KK3RlbXBsYXRlIG1lbWJlclJlcShULCBzdHJpbmcgbmFtZSwgYWxpYXMgZmllbGRNZXRhRGF0YSA9IGNhc3QoVEZpZWxkTWV0YVtdKW51bGwpIHsKKyAgZW51bSBtZW1iZXJSZXEgPSBtZW1iZXJSZXFJbXBsIShULCBuYW1lLCBmaWVsZE1ldGFEYXRhKS5yZXN1bHQ7Cit9CisKK3ByaXZhdGUgeworICBpbXBvcnQgc3RkLmFsZ29yaXRobSA6IGZpbmQ7CisgIC8vIERNRCBAQEJVR0BAOiBNaXNzaW5nIGltcG9ydCBsZWFkcyB0byBmYWlsaW5nIGJ1aWxkIHdpdGhvdXQgZXJyb3IKKyAgLy8gbWVzc2FnZSBpbiB1bml0dGVzdC9kZWJ1Zy90aHJpZnQvY29kZWdlbi9hc3luY19jbGllbnQuCisgIGltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eSwgZnJvbnQ7CisKKyAgdGVtcGxhdGUgbWVtYmVyUmVxSW1wbChULCBzdHJpbmcgbmFtZSwgYWxpYXMgZmllbGRNZXRhRGF0YSkgeworICAgIGVudW0gbWV0YSA9IGZpbmQhYGEubmFtZSA9PSBiYChtZXJnZUZpZWxkTWV0YSEoVCwgZmllbGRNZXRhRGF0YSksIG5hbWUpOworICAgIHN0YXRpYyBpZiAobWV0YS5lbXB0eSB8fCBtZXRhLmZyb250LnJlcSA9PSBUUmVxLkFVVE8pIHsKKyAgICAgIHN0YXRpYyBpZiAoaXNOdWxsYWJsZSEoTWVtYmVyVHlwZSEoVCwgbmFtZSkpKSB7CisgICAgICAgIGVudW0gcmVzdWx0ID0gVFJlcS5PUFRJT05BTDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVudW0gcmVzdWx0ID0gVFJlcS5SRVFVSVJFRDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZW51bSByZXN1bHQgPSBtZXRhLmZyb250LnJlcTsKKyAgICB9CisgIH0KK30KKworCit0ZW1wbGF0ZSBub3RJZ25vcmVkKFQsIHN0cmluZyBuYW1lLCBhbGlhcyBmaWVsZE1ldGFEYXRhID0gY2FzdChURmllbGRNZXRhW10pbnVsbCkgeworICBlbnVtIG5vdElnbm9yZWQgPSBtZW1iZXJSZXEhKFQsIG5hbWUsIGZpZWxkTWV0YURhdGEpICE9IFRSZXEuSUdOT1JFOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIG1ldGhvZCBtZXRhZGF0YSBhcnJheSBmb3IgVCBpZiBhbnksIG9yIGFuIGVtcHR5IGFycmF5IG90aGVyd2lzZS4KKyAqLwordGVtcGxhdGUgZ2V0TWV0aG9kTWV0YShUKSBpZiAoaXNTZXJ2aWNlIVQpIHsKKyAgc3RhdGljIGlmIChpcyh0eXBlb2YoVC5tZXRob2RNZXRhKSA9PSBUTWV0aG9kTWV0YVtdKSkgeworICAgIGVudW0gZ2V0TWV0aG9kTWV0YSA9IFQubWV0aG9kTWV0YTsKKyAgfSBlbHNlIHsKKyAgICBlbnVtIFRNZXRob2RNZXRhW10gZ2V0TWV0aG9kTWV0YSA9IFtdOworICB9Cit9CisKKworLyoqCisgKiB0cnVlIGlmIFQubmFtZSBpcyBhIG1lbWJlciB2YXJpYWJsZS4gRXhjZXB0aW9ucyBpbmNsdWRlIG1ldGhvZHMsIHN0YXRpYworICogbWVtYmVycywgYXJ0aWZhY3RzIGxpa2UgcGFja2FnZSBhbGlhc2VzLCDigKYKKyAqLwordGVtcGxhdGUgaXNWYWx1ZU1lbWJlcihULCBzdHJpbmcgbmFtZSkgeworICBzdGF0aWMgaWYgKCFpcyhNZW1iZXJUeXBlIShULCBuYW1lKSkpIHsKKyAgICBlbnVtIGlzVmFsdWVNZW1iZXIgPSBmYWxzZTsKKyAgfSBlbHNlIHN0YXRpYyBpZiAoCisgICAgaXMoTWVtYmVyVHlwZSEoVCwgbmFtZSkgPT0gdm9pZCkgfHwKKyAgICBpc1NvbWVGdW5jdGlvbiEoTWVtYmVyVHlwZSEoVCwgbmFtZSkpIHx8CisgICAgX190cmFpdHMoY29tcGlsZXMsIHsgcmV0dXJuIG1peGluKCJULiIgfiBuYW1lKTsgfSgpKQorICApIHsKKyAgICBlbnVtIGlzVmFsdWVNZW1iZXIgPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBlbnVtIGlzVmFsdWVNZW1iZXIgPSB0cnVlOworICB9Cit9CisKKy8qKgorICogUmV0dXJucyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgb2YgVCwgbm90IGluY2x1ZGluZworICogaW5oZXJpdGVkIGZpZWxkcy4gSWYgYSBtZW1iZXIgaXMgbWFya2VkIGFzIFRSZXEuSUdOT1JFLCBpdCBpcyBub3QgaW5jbHVkZWQKKyAqIGFzIHdlbGwuCisgKi8KK3RlbXBsYXRlIEZpZWxkTmFtZXMoVCwgYWxpYXMgZmllbGRNZXRhRGF0YSA9IGNhc3QoVEZpZWxkTWV0YVtdKW51bGwpIHsKKyAgYWxpYXMgU3RhdGljRmlsdGVyISgKKyAgICBBbGwhKAorICAgICAgZG9lc05vdFJlYWRNZW1iZXJzLAorICAgICAgUEFwcGx5IShpc1ZhbHVlTWVtYmVyLCBUKSwKKyAgICAgIFBBcHBseSEobm90SWdub3JlZCwgVCwgUEFwcGx5U2tpcCwgZmllbGRNZXRhRGF0YSkKKyAgICApLAorICAgIF9fdHJhaXRzKGRlcml2ZWRNZW1iZXJzLCBUKQorICApIEZpZWxkTmFtZXM7Cit9CisKKy8qCisgKiB0cnVlIGlmIHRoZSBwYXNzZWQgbWVtYmVyIG5hbWUgaXMgbm90IGEgbWV0aG9kIGdlbmVyYXRlZCBieSB0aGUKKyAqIFRTdHJ1Y3RIZWxwZXJzIHRlbXBsYXRlIHRoYXQgaW4gaXRzIGltcGxlbWVudGF0aW9ucyBxdWVyaWVzIHRoZSBzdHJ1Y3QKKyAqIG1lbWJlcnMuCisgKgorICogS2x1ZGdlIHVzZWQgaW50ZXJuYWxseSB0byBicmVhayBhIGN5Y2xlIGNhdXNlZCBhIERNRCBmb3J3YXJkIHJlZmVyZW5jZQorICogcmVncmVzc2lvbiwgc2VlIFRIUklGVC0yMTMwLgorICovCitlbnVtIGRvZXNOb3RSZWFkTWVtYmVycyhzdHJpbmcgbmFtZSkgPSAhWyJvcEVxdWFscyIsICJ0aHJpZnRPcEVxdWFsc0ltcGwiLAorICAidG9TdHJpbmciLCAidGhyaWZ0VG9TdHJpbmdJbXBsIl0uY2FuRmluZChuYW1lKTsKKwordGVtcGxhdGUgZGVyaXZlZE1lbWJlcnMoVCkgeworICBhbGlhcyBUeXBlVHVwbGUhKF9fdHJhaXRzKGRlcml2ZWRNZW1iZXJzLCBUKSkgZGVyaXZlZE1lbWJlcnM7Cit9CisKK3RlbXBsYXRlIEFsbE1lbWJlck1ldGhvZE5hbWVzKFQpIGlmIChpc1NlcnZpY2UhVCkgeworICBhbGlhcyBOb0R1cGxpY2F0ZXMhKAorICAgIEZpbHRlck1ldGhvZE5hbWVzISgKKyAgICAgIFQsCisgICAgICBzdGF0aWNNYXAhKAorICAgICAgICBkZXJpdmVkTWVtYmVycywKKyAgICAgICAgVHlwZVR1cGxlIShULCBJbnRlcmZhY2VzVHVwbGUhVCkKKyAgICAgICkKKyAgICApCisgICkgQWxsTWVtYmVyTWV0aG9kTmFtZXM7Cit9CisKK3RlbXBsYXRlIEZpbHRlck1ldGhvZE5hbWVzKFQsIE1lbWJlck5hbWVzLi4uKSB7CisgIGFsaWFzIFN0YXRpY0ZpbHRlciEoCisgICAgQ29tcGlsZXNBbmRUcnVlISgKKyAgICAgIENvbXBvc2UhKGlzU29tZUZ1bmN0aW9uLCBUeXBlT2YsIFBBcHBseSEoR2V0TWVtYmVyLCBUKSkKKyAgICApLAorICAgIE1lbWJlck5hbWVzCisgICkgRmlsdGVyTWV0aG9kTmFtZXM7Cit9CisKKy8qKgorICogUmV0dXJucyBhIHR5cGUgdHVwbGUgY29udGFpbmluZyBvbmx5IHRoZSBlbGVtZW50cyBvZiBUIGZvciB3aGljaCB0aGUKKyAqIGVwb255bW91cyB0ZW1wbGF0ZSBwcmVkaWNhdGUgcHJlZCBpcyB0cnVlLgorICoKKyAqIEV4YW1wbGU6CisgKiAtLS0KKyAqIGFsaWFzIFN0YXRpY0ZpbHRlciEoaXNJbnRlZ3JhbCwgaW50LCBzdHJpbmcsIGxvbmcsIGZsb2F0W10pIEZpbHRlcmVkOworICogc3RhdGljIGFzc2VydChpcyhGaWx0ZXJlZCA9PSBUeXBlVHVwbGUhKGludCwgbG9uZykpKTsKKyAqIC0tLQorICovCit0ZW1wbGF0ZSBTdGF0aWNGaWx0ZXIoYWxpYXMgcHJlZCwgVC4uLikgeworICBzdGF0aWMgaWYgKFQubGVuZ3RoID09IDApIHsKKyAgICBhbGlhcyBUeXBlVHVwbGUhKCkgU3RhdGljRmlsdGVyOworICB9IGVsc2Ugc3RhdGljIGlmIChwcmVkIShUWzBdKSkgeworICAgIGFsaWFzIFR5cGVUdXBsZSEoVFswXSwgU3RhdGljRmlsdGVyIShwcmVkLCBUWzEgLi4gJF0pKSBTdGF0aWNGaWx0ZXI7CisgIH0gZWxzZSB7CisgICAgYWxpYXMgU3RhdGljRmlsdGVyIShwcmVkLCBUWzEgLi4gJF0pIFN0YXRpY0ZpbHRlcjsKKyAgfQorfQorCisvKioKKyAqIEJpbmRzIHRoZSBmaXJzdCBuIGFyZ3VtZW50cyBvZiBhIHRlbXBsYXRlIHRvIGEgcGFydGljdWxhciB2YWx1ZSAod2hlcmUgbiBpcworICogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIFBBcHBseSkuCisgKgorICogVGhlIHBhc3NlZCBhcmd1bWVudHMgYXJlIGFsd2F5cyBhcHBsaWVkIHN0YXJ0aW5nIGZyb20gdGhlIGxlZnQuIEhvd2V2ZXIsCisgKiB0aGUgc3BlY2lhbCBQQXBwbHlTa2lwIG1hcmtlciB0ZW1wbGF0ZSBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGFuCisgKiBhcmd1bWVudCBzaG91bGQgYmUgc2tpcHBlZCwgc28gdGhhdCBlLmcuIHRoZSBmaXJzdCBhbmQgdGhpcmQgYXJndW1lbnQKKyAqIHRvIGEgdGVtcGxhdGUgY2FuIGJlIGZpeGVkLCBidXQgdGhlIHNlY29uZCBhbmQgcmVtYWluaW5nIGFyZ3VtZW50cyB3b3VsZAorICogc3RpbGwgYmUgbGVmdCB1bmRlZmluZWQuCisgKgorICogU2tpcHBpbmcgYSBudW1iZXIgb2YgcGFyYW1ldGVycywgYnV0IG5vdCBwcm92aWRpbmcgZW5vdWdoIGFyZ3VtZW50cyB0bworICogYXNzaWduIGFsbCBvZiB0aGVtIGR1cmluZyBpbnN0YW50aWF0aW9uIG9mIHRoZSByZXN1bHRpbmcgdGVtcGxhdGUgaXMgYW4KKyAqIGVycm9yLgorICoKKyAqIEV4YW1wbGU6CisgKiAtLS0KKyAqIHN0cnVjdCBGb28oVCwgVSwgVikge30KKyAqIGFsaWFzIFBBcHBseSEoRm9vLCBpbnQsIGxvbmcpIFBhcnRpYWxGb287CisgKiBzdGF0aWMgYXNzZXJ0KGlzKFBhcnRpYWxGb28hZmxvYXQgPT0gRm9vIShpbnQsIGxvbmcsIGZsb2F0KSkpOworICoKKyAqIGFsaWFzIFBBcHBseSEoVGVzdCwgaW50LCBQQXBwbHlTa2lwLCBmbG9hdCkgU2tpcHBlZFRlc3Q7CisgKiBzdGF0aWMgYXNzZXJ0KGlzKFNraXBwZWRUZXN0IWxvbmcgPT0gVGVzdCEoaW50LCBsb25nLCBmbG9hdCkpKTsKKyAqIC0tLQorICovCit0ZW1wbGF0ZSBQQXBwbHkoYWxpYXMgVGFyZ2V0LCBULi4uKSB7CisgIHRlbXBsYXRlIFBBcHBseShVLi4uKSB7CisgICAgYWxpYXMgVGFyZ2V0IShQQXBwbHlNZXJnZUFyZ3MhKENvbmZpbmVkVHVwbGUhVCwgVSkuUmVzdWx0KSBQQXBwbHk7CisgIH0KK30KKworLy8vIERpdHRvLgordGVtcGxhdGUgUEFwcGx5U2tpcCgpIHt9CisKK3ByaXZhdGUgdGVtcGxhdGUgUEFwcGx5TWVyZ2VBcmdzKGFsaWFzIFByZXNldCwgQXJncy4uLikgeworICBzdGF0aWMgaWYgKFByZXNldC5sZW5ndGggPT0gMCkgeworICAgIGFsaWFzIEFyZ3MgUmVzdWx0OworICB9IGVsc2UgeworICAgIGVudW0gbmV4dFNraXAgPSBzdGF0aWNJbmRleE9mIShQQXBwbHlTa2lwLCBQcmVzZXQuVHVwbGUpOworICAgIHN0YXRpYyBpZiAobmV4dFNraXAgPT0gLTEpIHsKKyAgICAgIGFsaWFzIFR5cGVUdXBsZSEoUHJlc2V0LlR1cGxlLCBBcmdzKSBSZXN1bHQ7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoQXJncy5sZW5ndGggPT0gMCkgeworICAgICAgLy8gSGF2ZSB0byB1c2UgYSBzdGF0aWMgaWYgY2xhdXNlIGluc3RlYWQgb2YgcHV0dGluZyB0aGUgY29uZGl0aW9uCisgICAgICAvLyBkaXJlY3RseSBpbnRvIHRoZSBhc3NlcnQgdG8gYXZvaWQgRE1EIHRyeWluZyB0byBhY2Nlc3MgQXJnc1swXQorICAgICAgLy8gbmV2ZXJ0aGVsZXNzIGJlbG93LgorICAgICAgc3RhdGljIGFzc2VydChmYWxzZSwKKyAgICAgICAgIlBBcmdzU2tpcCBlbmNvdW50ZXJlZCwgYnV0IG5vIGFyZ3VtZW50IGxlZnQgdG8gYmluZC4iKTsKKyAgICB9IGVsc2UgeworICAgICAgYWxpYXMgVHlwZVR1cGxlISgKKyAgICAgICAgUHJlc2V0LlR1cGxlWzAgLi4gbmV4dFNraXBdLAorICAgICAgICBBcmdzWzBdLAorICAgICAgICBQQXBwbHlNZXJnZUFyZ3MhKAorICAgICAgICAgIENvbmZpbmVkVHVwbGUhKFByZXNldC5UdXBsZVtuZXh0U2tpcCArIDEgLi4gJF0pLAorICAgICAgICAgIEFyZ3NbMSAuLiAkXQorICAgICAgICApLlJlc3VsdAorICAgICAgKSBSZXN1bHQ7CisgICAgfQorICB9Cit9CisKK3VuaXR0ZXN0IHsKKyAgc3RydWN0IFRlc3QoVCwgVSwgVikge30KKyAgYWxpYXMgUEFwcGx5IShUZXN0LCBpbnQsIGxvbmcpIFBhcnRpYWxUZXN0OworICBzdGF0aWMgYXNzZXJ0KGlzKFBhcnRpYWxUZXN0IWZsb2F0ID09IFRlc3QhKGludCwgbG9uZywgZmxvYXQpKSk7CisKKyAgYWxpYXMgUEFwcGx5IShUZXN0LCBpbnQsIFBBcHBseVNraXAsIGZsb2F0KSBTa2lwcGVkVGVzdDsKKyAgc3RhdGljIGFzc2VydChpcyhTa2lwcGVkVGVzdCFsb25nID09IFRlc3QhKGludCwgbG9uZywgZmxvYXQpKSk7CisKKyAgYWxpYXMgUEFwcGx5IShUZXN0LCBpbnQsIFBBcHBseVNraXAsIFBBcHBseVNraXApIFR3b1NraXBwZWQ7CisgIHN0YXRpYyBhc3NlcnQoIV9fdHJhaXRzKGNvbXBpbGVzLCBUd29Ta2lwcGVkIWxvbmcpKTsKK30KKworCisvKioKKyAqIENvbXBvc2VzIGEgbnVtYmVyIG9mIHRlbXBsYXRlcy4gVGhlIHJlc3VsdCBpcyBhIHRlbXBsYXRlIGVxdWl2YWxlbnQgdG8KKyAqIGFsbCB0aGUgcGFzc2VkIHRlbXBsYXRlcyBldmFsdWF0ZWQgZnJvbSByaWdodCB0byBsZWZ0LCBha2luIHRvIHRoZQorICogbWF0aGVtYXRpY2FsIGZ1bmN0aW9uIGNvbXBvc2l0aW9uIG5vdGF0aW9uOiBJbnN0YW50aWF0aW5nIENvbXBvc2UhKEEsIEIsIEMpCisgKiBpcyB0aGUgc2FtZSBhcyBpbnN0YW50aWF0aW5nIEEhKEIhKEMhKOKApikpKS4KKyAqCisgKiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvciBjcmVhdGluZyBhIHRlbXBsYXRlIHRvIHVzZSB3aXRoIHN0YXRpY01hcC8KKyAqIFN0YXRpY0ZpbHRlciwgYXMgZGVtb25zdHJhdGVkIGJlbG93LgorICoKKyAqIEV4YW1wbGU6CisgKiAtLS0KKyAqIHRlbXBsYXRlIEFsbE1ldGhvZE5hbWVzKFQpIHsKKyAqICAgYWxpYXMgU3RhdGljRmlsdGVyISgKKyAqICAgICBDb21waWxlc0FuZFRydWUhKAorICogICAgICAgQ29tcG9zZSEoaXNTb21lRnVuY3Rpb24sIFR5cGVPZiwgUEFwcGx5IShHZXRNZW1iZXIsIFQpKQorICogICAgICksCisgKiAgICAgX190cmFpdHMoYWxsTWVtYmVycywgVCkKKyAqICAgKSBBbGxNZXRob2ROYW1lczsKKyAqIH0KKyAqCisgKiBwcmFnbWEobXNnLCBBbGxNZXRob2ROYW1lcyFPYmplY3QpOworICogLS0tCisgKi8KK3RlbXBsYXRlIENvbXBvc2UoVC4uLikgeworICBzdGF0aWMgaWYgKFQubGVuZ3RoID09IDApIHsKKyAgICB0ZW1wbGF0ZSBDb21wb3NlKFUuLi4pIHsKKyAgICAgIGFsaWFzIFUgQ29tcG9zZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGVtcGxhdGUgQ29tcG9zZShVLi4uKSB7CisgICAgICBhbGlhcyBJbnN0YW50aWF0ZSEoVFswXSwgSW5zdGFudGlhdGUhKC5Db21wb3NlIShUWzEgLi4gJF0pLCBVKSkgQ29tcG9zZTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBJbnN0YW50aWF0ZXMgdGhlIGdpdmVuIHRlbXBsYXRlIHdpdGggdGhlIGdpdmVuIGxpc3Qgb2YgcGFyYW1ldGVycy4KKyAqCisgKiBVc2VkIHRvIHdvcmsgYXJvdW5kIHN5bnRhY3RpYyBsaW1pYXRpb25zIG9mIEQgd2l0aCByZWdhcmQgdG8gaW5zdGFudGlhdGluZworICogYSB0ZW1wbGF0ZSBmcm9tIGEgdHlwZSB0dXBsZSAoZS5nLiBUWzBdISguLi4pIGlzIG5vdCB2YWxpZCkgb3IgYSB0ZW1wbGF0ZQorICogcmV0dXJuaW5nIGFub3RoZXIgdGVtcGxhdGUgKGUuZy4gRm9vIShCYXIpIShCYXopIGlzIG5vdCBhbGxvd2VkKS4KKyAqLwordGVtcGxhdGUgSW5zdGFudGlhdGUoYWxpYXMgVGVtcGxhdGUsIFBhcmFtcy4uLikgeworICBhbGlhcyBUZW1wbGF0ZSFQYXJhbXMgSW5zdGFudGlhdGU7Cit9CisKKy8qKgorICogQ29tYmluZXMgc2V2ZXJhbCB0ZW1wbGF0ZSBwcmVkaWNhdGVzIHVzaW5nIGxvZ2ljYWwgQU5ELCBpLmUuIGluc3RhbnRpYXRpbmcKKyAqIEFsbCEoYSwgYiwgYykgd2l0aCBwYXJhbWV0ZXJzIFAgZm9yIHNvbWUgdGVtcGxhdGVzIGEsIGIsIGMgaXMgZXF1aXZhbGVudCB0bworICogYSFQICYmIGIhUCAmJiBjIVAuCisgKgorICogVGhlIHRlbXBsYXRlcyBhcmUgZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodCwgYWJvcnRpbmcgZXZhbHVhdGlvbiBpbiBhCisgKiBzaHVydC1jdXQgbWFubmVyIGlmIGEgZmFsc2UgcmVzdWx0IGlzIGVuY291bnRlcmVkLCBpbiB3aGljaCBjYXNlIHRoZSBsYXR0ZXIKKyAqIGluc3RhbnRpYXRpb25zIGRvIG5vdCBuZWVkIHRvIGNvbXBpbGUuCisgKi8KK3RlbXBsYXRlIEFsbChULi4uKSB7CisgIHN0YXRpYyBpZiAoVC5sZW5ndGggPT0gMCkgeworICAgIHRlbXBsYXRlIEFsbChVLi4uKSB7CisgICAgICBlbnVtIEFsbCA9IHRydWU7CisgICAgfQorICB9IGVsc2UgeworICAgIHRlbXBsYXRlIEFsbChVLi4uKSB7CisgICAgICBzdGF0aWMgaWYgKEluc3RhbnRpYXRlIShUWzBdLCBVKSkgeworICAgICAgICBhbGlhcyBJbnN0YW50aWF0ZSEoLkFsbCEoVFsxIC4uICRdKSwgVSkgQWxsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZW51bSBBbGwgPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyoqCisgKiBDb21iaW5lcyBzZXZlcmFsIHRlbXBsYXRlIHByZWRpY2F0ZXMgdXNpbmcgbG9naWNhbCBPUiwgaS5lLiBpbnN0YW50aWF0aW5nCisgKiBBbnkhKGEsIGIsIGMpIHdpdGggcGFyYW1ldGVycyBQIGZvciBzb21lIHRlbXBsYXRlcyBhLCBiLCBjIGlzIGVxdWl2YWxlbnQgdG8KKyAqIGEhUCB8fCBiIVAgfHwgYyFQLgorICoKKyAqIFRoZSB0ZW1wbGF0ZXMgYXJlIGV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQsIGFib3J0aW5nIGV2YWx1YXRpb24gaW4gYQorICogc2h1cnQtY3V0IG1hbm5lciBpZiBhIHRydWUgcmVzdWx0IGlzIGVuY291bnRlcmVkLCBpbiB3aGljaCBjYXNlIHRoZSBsYXR0ZXIKKyAqIGluc3RhbnRpYXRpb25zIGRvIG5vdCBuZWVkIHRvIGNvbXBpbGUuCisgKi8KK3RlbXBsYXRlIEFueShULi4uKSB7CisgIHN0YXRpYyBpZiAoVC5sZW5ndGggPT0gMCkgeworICAgIHRlbXBsYXRlIEFueShVLi4uKSB7CisgICAgICBlbnVtIEFueSA9IGZhbHNlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0ZW1wbGF0ZSBBbnkoVS4uLikgeworICAgICAgc3RhdGljIGlmIChJbnN0YW50aWF0ZSEoVFswXSwgVSkpIHsKKyAgICAgICAgZW51bSBBbnkgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYWxpYXMgSW5zdGFudGlhdGUhKC5BbnkhKFRbMSAuLiAkXSksIFUpIEFueTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgQ29uZmluZWRUdXBsZShULi4uKSB7CisgIGFsaWFzIFQgVHVwbGU7CisgIGVudW0gbGVuZ3RoID0gVC5sZW5ndGg7Cit9CisKKy8qCisgKiBmb3JlYWNoIChJdGVtOyBJdGVtcykgeworICogICBMaXN0ID0gT3BlcmF0b3IhKEl0ZW0sIExpc3QpOworICogfQorICogd2hlcmUgSXRlbXMgaXMgYSBDb25maW5lZFR1cGxlIGFuZCBMaXN0IGlzIGEgdHlwZSB0dXBsZS4KKyAqLwordGVtcGxhdGUgRm9yQWxsV2l0aExpc3QoYWxpYXMgSXRlbXMsIGFsaWFzIE9wZXJhdG9yLCBMaXN0Li4uKSBpZiAoCisgIGlzKHR5cGVvZihJdGVtcy5sZW5ndGgpIDogc2l6ZV90KQorKXsKKyAgc3RhdGljIGlmIChJdGVtcy5sZW5ndGggPT0gMCkgeworICAgIGFsaWFzIExpc3QgRm9yQWxsV2l0aExpc3Q7CisgIH0gZWxzZSB7CisgICAgYWxpYXMgLkZvckFsbFdpdGhMaXN0ISgKKyAgICAgIENvbmZpbmVkVHVwbGUhKEl0ZW1zLlR1cGxlWzEgLi4gJF0pLAorICAgICAgT3BlcmF0b3IsCisgICAgICBPcGVyYXRvciEoSXRlbXMuVHVwbGVbMF0sIExpc3QpCisgICAgKSBGb3JBbGxXaXRoTGlzdDsKKyAgfQorfQorCisvKioKKyAqIFdyYXBzIHRoZSBwYXNzZWQgdGVtcGxhdGUgcHJlZGljYXRlIHNvIGl0IHJldHVybnMgdHJ1ZSBpZiBpdCBjb21waWxlcyBhbmQKKyAqIGV2YWx1YXRlcyB0byB0cnVlLCBmYWxzZSBpdCBpdCBkb2Vzbid0IGNvbXBpbGUgb3IgZXZhbHVhdGVzIHRvIGZhbHNlLgorICovCit0ZW1wbGF0ZSBDb21waWxlc0FuZFRydWUoYWxpYXMgVCkgeworICB0ZW1wbGF0ZSBDb21waWxlc0FuZFRydWUoVS4uLikgeworICAgIHN0YXRpYyBpZiAoaXModHlwZW9mKFQhVSkgOiBib29sKSkgeworICAgICAgZW51bSBib29sIENvbXBpbGVzQW5kVHJ1ZSA9IFQhVTsKKyAgICB9IGVsc2UgeworICAgICAgZW51bSBib29sIENvbXBpbGVzQW5kVHJ1ZSA9IGZhbHNlOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9jdGZlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL2N0ZmUuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzRkYjAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9jdGZlLmQKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCittb2R1bGUgdGhyaWZ0LmludGVybmFsLmN0ZmU7CisKK2ltcG9ydCBzdGQuY29udiA6IHRvOworaW1wb3J0IHN0ZC50cmFpdHM7CisKKy8qCisgKiBTaW1wbGUgZWFnZXIgam9pbigpIGZvciBzdHJpbmdzLCBzdGQuYWxnb3JpdGhtLmpvaW4gaXNuJ3QgQ1RGRWFibGUgeWV0LgorICovCitzdHJpbmcgY3RmZUpvaW4oc3RyaW5nW10gc3RyaW5ncywgc3RyaW5nIHNlcGFyYXRvciA9ICIsICIpIHsKKyAgc3RyaW5nIHJlc3VsdDsKKyAgaWYgKHN0cmluZ3MubGVuZ3RoID4gMCkgeworICAgIHJlc3VsdCB+PSBzdHJpbmdzWzBdOworICAgIGZvcmVhY2ggKHM7IHN0cmluZ3NbMS4uJF0pIHsKKyAgICAgIHJlc3VsdCB+PSBzZXBhcmF0b3IgfiBzOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKgorICogQSB2ZXJ5IHByaW1pdGl2ZSB0byFzdHJpbmcoKSBpbXBsZW1lbnRhdGlvbiBmb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyB0aGF0CisgKiBpcyBldmFsdWF0YWJsZSBhdCBjb21waWxlIHRpbWUuCisgKgorICogVGhlcmUgaXMgYSB3ZWFsdGggb2YgcHJvYmxlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbGdvcml0aG0gdXNlZCAoZS5nLiA1LjAKKyAqIHByaW50cyBhcyA0Ljk5OeKApiwgaW5jb3JyZWN0IHJvdW5kaW5nLCBldGMuKSwgYnV0IGEgYmV0dGVyIGFsdGVybmF0aXZlIHNob3VsZAorICogYmUgaW5jbHVkZWQgd2l0aCB0aGUgRCBzdGFuZGFyZCBsaWJyYXJ5IGluc3RlYWQgb2YgaW1wbGVtZW50aW5nIGl0IGhlcmUuCisgKi8KK3N0cmluZyBjdGZlVG9TdHJpbmcoVCkoVCB2YWwpIGlmIChpc0Zsb2F0aW5nUG9pbnQhVCkgeworICBpZiAodmFsIGlzIFQubmFuKSByZXR1cm4gIm5hbiI7CisgIGlmICh2YWwgaXMgVC5pbmZpbml0eSkgcmV0dXJuICJpbmYiOworICBpZiAodmFsIGlzIC1ULmluZmluaXR5KSByZXR1cm4gIi1pbmYiOworICBpZiAodmFsIGlzIDAuMCkgcmV0dXJuICIwIjsKKyAgaWYgKHZhbCBpcyAtMC4wKSByZXR1cm4gIi0wIjsKKworICBhdXRvIGIgPSB2YWw7CisKKyAgc3RyaW5nIHJlc3VsdDsKKyAgaWYgKGIgPCAwKSB7CisgICAgcmVzdWx0IH49ICctJzsKKyAgICBiICo9IC0xOworICB9CisKKyAgc2hvcnQgbWFnbml0dWRlOworICB3aGlsZSAoYiA+PSAxMCkgeworICAgICsrbWFnbml0dWRlOworICAgIGIgLz0gMTA7CisgIH0KKyAgd2hpbGUgKGIgPCAxKSB7CisgICAgLS1tYWduaXR1ZGU7CisgICAgYiAqPSAxMDsKKyAgfQorCisgIGZvcmVhY2ggKGk7IDAgLi4gVC5kaWcpIHsKKyAgICBpZiAoaSA9PSAxKSByZXN1bHQgfj0gJy4nOworCisgICAgYXV0byBmaXJzdCA9IGNhc3QodWJ5dGUpYjsKKyAgICByZXN1bHQgfj0gdG8hc3RyaW5nKGZpcnN0KTsKKworICAgIGIgLT0gZmlyc3Q7CisgICAgaW1wb3J0IHN0ZC5tYXRoOworICAgIGlmIChiIDwgcG93KDEwLjAsIGkgLSBULmRpZykpIGJyZWFrOworICAgIGIgKj0gMTA7CisgIH0KKworICBpZiAobWFnbml0dWRlICE9IDApIHJlc3VsdCB+PSAiZSIgfiB0byFzdHJpbmcobWFnbml0dWRlKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordW5pdHRlc3QgeworICBpbXBvcnQgc3RkLmFsZ29yaXRobTsKKyAgc3RhdGljIGFzc2VydChjdGZlVG9TdHJpbmcoZG91YmxlLmluZmluaXR5KSA9PSAiaW5mIik7CisgIHN0YXRpYyBhc3NlcnQoY3RmZVRvU3RyaW5nKC1kb3VibGUuaW5maW5pdHkpID09ICItaW5mIik7CisgIHN0YXRpYyBhc3NlcnQoY3RmZVRvU3RyaW5nKGRvdWJsZS5uYW4pID09ICJuYW4iKTsKKyAgc3RhdGljIGFzc2VydChjdGZlVG9TdHJpbmcoMC4wKSA9PSAiMCIpOworICBzdGF0aWMgYXNzZXJ0KGN0ZmVUb1N0cmluZygtMC4wKSA9PSAiLTAiKTsKKyAgc3RhdGljIGFzc2VydChjdGZlVG9TdHJpbmcoMi41KSA9PSAiMi41Iik7CisgIHN0YXRpYyBhc3NlcnQoY3RmZVRvU3RyaW5nKDMuMTQxNSkuc3RhcnRzV2l0aCgiMy4xNDEiKSk7CisgIHN0YXRpYyBhc3NlcnQoY3RmZVRvU3RyaW5nKDJlLTIwMCkgPT0gIjJlLTIwMCIpOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9lbmRpYW4uZCBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvZW5kaWFuLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFiOTgxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvZW5kaWFuLmQKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogU2ltcGxlIGhlbHBlcnMgZm9yIGhhbmRsaW5nIHR5cGljYWwgYnl0ZSBvcmRlci1yZWxhdGVkIGlzc3Vlcy4KKyAqLworbW9kdWxlIHRocmlmdC5pbnRlcm5hbC5lbmRpYW47CisKK2ltcG9ydCBjb3JlLmJpdG9wIDogYnN3YXA7CitpbXBvcnQgc3RkLnRyYWl0cyA6IGlzSW50ZWdyYWw7CisKK3VuaW9uIEludEJ1ZihUKSB7CisgIHVieXRlW1Quc2l6ZW9mXSBieXRlczsKKyAgVCB2YWx1ZTsKK30KKworVCBieXRlU3dhcChUKShUIHQpIHB1cmUgbm90aHJvdyBAdHJ1c3RlZCBpZiAoaXNJbnRlZ3JhbCFUKSB7CisgIHN0YXRpYyBpZiAoVC5zaXplb2YgPT0gMikgeworICAgIHJldHVybiBjYXN0KFQpKCh0ICYgMHhmZikgPDwgOCkgfCBjYXN0KFQpKCh0ICYgMHhmZjAwKSA+PiA4KTsKKyAgfSBlbHNlIHN0YXRpYyBpZiAoVC5zaXplb2YgPT0gNCkgeworICAgIHJldHVybiBjYXN0KFQpYnN3YXAoY2FzdCh1aW50KXQpOworICB9IGVsc2Ugc3RhdGljIGlmIChULnNpemVvZiA9PSA4KSB7CisgICAgcmV0dXJuIGNhc3QoVClieXRlU3dhcChjYXN0KHVpbnQpKHQgJiAweGZmZmZmZmZmKSkgPDwgMzIgfAorICAgICAgY2FzdChUKWJzd2FwKGNhc3QodWludCkodCA+PiAzMikpOworICB9IGVsc2Ugc3RhdGljIGFzc2VydChmYWxzZSwgIlR5cGUgb2Ygc2l6ZSAiIH4gdG8hc3RyaW5nKFQuc2l6ZW9mKSB+ICIgbm90IHN1cHBvcnRlZC4iKTsKK30KKworVCBkb05vdGhpbmcoVCkoVCB2YWwpIHsgcmV0dXJuIHZhbDsgfQorCit2ZXJzaW9uIChCaWdFbmRpYW4pIHsKKyAgYWxpYXMgZG9Ob3RoaW5nIGhvc3RUb05ldDsKKyAgYWxpYXMgZG9Ob3RoaW5nIG5ldFRvSG9zdDsKKyAgYWxpYXMgYnl0ZVN3YXAgaG9zdFRvTGU7CisgIGFsaWFzIGJ5dGVTd2FwIGxlVG9Ib3N0OworfSBlbHNlIHsKKyAgYWxpYXMgYnl0ZVN3YXAgaG9zdFRvTmV0OworICBhbGlhcyBieXRlU3dhcCBuZXRUb0hvc3Q7CisgIGFsaWFzIGRvTm90aGluZyBob3N0VG9MZTsKKyAgYWxpYXMgZG9Ob3RoaW5nIGxlVG9Ib3N0OworfQorCit1bml0dGVzdCB7CisgIGltcG9ydCBzdGQuZXhjZXB0aW9uOworCisgIEludEJ1ZiFzaG9ydCBzOworICBzLmJ5dGVzID0gWzEsIDJdOworICBzLnZhbHVlID0gYnl0ZVN3YXAocy52YWx1ZSk7CisgIGVuZm9yY2Uocy5ieXRlcyA9PSBbMiwgMV0pOworCisgIEludEJ1ZiFpbnQgaTsKKyAgaS5ieXRlcyA9IFsxLCAyLCAzLCA0XTsKKyAgaS52YWx1ZSA9IGJ5dGVTd2FwKGkudmFsdWUpOworICBlbmZvcmNlKGkuYnl0ZXMgPT0gWzQsIDMsIDIsIDFdKTsKKworICBJbnRCdWYhbG9uZyBsOworICBsLmJ5dGVzID0gWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdOworICBsLnZhbHVlID0gYnl0ZVN3YXAobC52YWx1ZSk7CisgIGVuZm9yY2UobC5ieXRlcyA9PSBbOCwgNywgNiwgNSwgNCwgMywgMiwgMV0pOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9yZXNvdXJjZV9wb29sLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3Jlc291cmNlX3Bvb2wuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDgyMGEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9yZXNvdXJjZV9wb29sLmQKQEAgLTAsMCArMSw0MzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuaW50ZXJuYWwucmVzb3VyY2VfcG9vbDsKKworaW1wb3J0IGNvcmUudGltZSA6IER1cmF0aW9uLCBkdXIsIFRpY2tEdXJhdGlvbjsKK2ltcG9ydCBzdGQuYWxnb3JpdGhtIDogbWluUG9zLCByZWR1Y2UsIHJlbW92ZTsKK2ltcG9ydCBzdGQuYXJyYXkgOiBhcnJheSwgZW1wdHk7CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgc3RkLmNvbnYgOiB0bzsKK2ltcG9ydCBzdGQucmFuZG9tIDogcmFuZG9tQ292ZXIsIHJuZEdlbjsKK2ltcG9ydCBzdGQucmFuZ2UgOiB6aXA7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmFsZ29yaXRobSA6IHJlbW92ZUVxdWFsOworCisvKioKKyAqIEEgcG9vbCBvZiByZXNvdXJjZXMsIHdoaWNoIGNhbiBiZSBpdGVyYXRlZCBvdmVyLCBhbmQgd2hlcmUgcmVzb3VyY2VzIHRoYXQKKyAqIGhhdmUgZmFpbGVkIHRvbyBvZnRlbiBjYW4gYmUgdGVtcG9yYXJpbHkgZGlzYWJsZWQuCisgKgorICogVGhpcyBjbGFzcyBpcyBvYmxpdmlvdXMgdG8gdGhlIGFjdHVhbCByZXNvdXJjZSB0eXBlIG1hbmFnZWQuCisgKi8KK2ZpbmFsIGNsYXNzIFRSZXNvdXJjZVBvb2woUmVzb3VyY2UpIHsKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICByZXNvdXJjZXMgPSBUaGUgaW5pdGlhbCBtZW1iZXJzIG9mIHRoZSBwb29sLgorICAgKi8KKyAgdGhpcyhSZXNvdXJjZVtdIHJlc291cmNlcykgeworICAgIHJlc291cmNlc18gPSByZXNvdXJjZXM7CisgIH0KKworICAvKioKKyAgICogQWRkcyBhIHJlc291cmNlIHRvIHRoZSBwb29sLgorICAgKi8KKyAgdm9pZCBhZGQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICByZXNvdXJjZXNfIH49IHJlc291cmNlOworICB9CisKKyAgLyoqCisgICAqIFJlbW92ZXMgYSByZXNvdXJjZSBmcm9tIHRoZSBwb29sLgorICAgKgorICAgKiBSZXR1cm5zOiBXaGV0aGVyIHRoZSByZXNvdXJjZSBjb3VsZCBiZSBmb3VuZCBpbiB0aGUgcG9vbC4KKyAgICovCisgIGJvb2wgcmVtb3ZlKFJlc291cmNlIHJlc291cmNlKSB7CisgICAgYXV0byBvbGRMZW5ndGggPSByZXNvdXJjZXNfLmxlbmd0aDsKKyAgICByZXNvdXJjZXNfID0gcmVtb3ZlRXF1YWwocmVzb3VyY2VzXywgcmVzb3VyY2UpOworICAgIHJldHVybiByZXNvdXJjZXNfLmxlbmd0aCA8IG9sZExlbmd0aDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIGFuIMK7ZW5yaWNoZWTCqyBpbnB1dCByYW5nZSB0byBpdGVyYXRlIG92ZXIgdGhlIHBvb2wgbWVtYmVycy4KKyAgICovCisgIHN0YXRpYyBzdHJ1Y3QgUmFuZ2UgeworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIHJhbmdlIGlzIGVtcHR5LgorICAgICAqCisgICAgICogVGhpcyBpcyB0aGUgY2FzZSBpZiBhbGwgbWVtYmVycyBvZiB0aGUgcG9vbCBoYXZlIGJlZW4gcG9wcGVkIChvciBza2lwcGVkCisgICAgICogYmVjYXVzZSB0aGV5IHdlcmUgZGlzYWJsZWQpIGFuZCBUUmVzb3VyY2VQb29sLmN5Y2xlIGlzIGZhbHNlLCBvciB0aGVyZQorICAgICAqIGlzIG5vIGVsZW1lbnQgdG8gcmV0dXJuIGluIGN5Y2xlIG1vZGUgYmVjYXVzZSBhbGwgaGF2ZSBiZWVuIHRlbXBvcmFyaWx5CisgICAgICogZGlzYWJsZWQuCisgICAgICovCisgICAgYm9vbCBlbXB0eSgpIEBwcm9wZXJ0eSB7CisgICAgICAvLyBJZiBubyByZXNvdXJjZXMgYXJlIGluIHRoZSBwb29sLCB0aGUgcmFuZ2Ugd2lsbCBuZXZlciBiZWNvbWUgbm9uLWVtcHR5LgorICAgICAgaWYgKHJlc291cmNlc18uZW1wdHkpIHJldHVybiB0cnVlOworCisgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGdvdCB0aGUgbmV4dCByZXNvdXJjZSBpbiB0aGUgY2FjaGUsIGl0IGRvZXNuJ3QgbWF0dGVyCisgICAgICAvLyB3aGV0aGVyIHRoZXJlIGFyZSBtb3JlLgorICAgICAgaWYgKGNhY2hlZF8pIHJldHVybiBmYWxzZTsKKworICAgICAgc2l6ZV90IGV4YW1pbmVDb3VudDsKKyAgICAgIGlmIChwYXJlbnRfLmN5Y2xlKSB7CisgICAgICAgIC8vIFdlIHdhbnQgdG8gY2hlY2sgYWxsIHRoZSByZXNvdXJjZXMsIGJ1dCBub3QgaXRlcmF0ZSBtb3JlIHRoYW4gb25jZQorICAgICAgICAvLyB0byBhdm9pZCBzcGlubmluZyBpbiBhIGxvb3AgaWYgbm90aGluZyBpcyBhdmFpbGFibGUuCisgICAgICAgIGV4YW1pbmVDb3VudCA9IHJlc291cmNlc18ubGVuZ3RoOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2hlbiBub3QgaW4gY3ljbGUgbW9kZSwgd2UganVzdCBpdGVyYXRlIHRoZSBsaXN0IGV4YWN0bHkgb25jZS4gSWYgYWxsCisgICAgICAgIC8vIGl0ZW1zIGhhdmUgYmVlbiBjb25zdW1lZCwgdGhlIGludGVydmFsIGJlbG93IGlzIGVtcHR5LgorICAgICAgICBleGFtaW5lQ291bnQgPSByZXNvdXJjZXNfLmxlbmd0aCAtIG5leHRJbmRleF87CisgICAgICB9CisKKyAgICAgIGZvcmVhY2ggKGk7IDAgLi4gZXhhbWluZUNvdW50KSB7CisgICAgICAgIGF1dG8gciA9IHJlc291cmNlc19bKG5leHRJbmRleF8gKyBpKSAlIHJlc291cmNlc18ubGVuZ3RoXTsKKyAgICAgICAgYXV0byBmaSA9IHIgaW4gcGFyZW50Xy5mYXVsdEluZm9zXzsKKworICAgICAgICBpZiAoZmkgJiYgZmkucmVzZXRUaW1lICE9IGZpLnJlc2V0VGltZS5pbml0KSB7CisgICAgICAgICAgaWYgKGZpLnJlc2V0VGltZSA8IHBhcmVudF8uZ2V0Q3VycmVudFRpY2tfKCkpIHsKKyAgICAgICAgICAgIC8vIFRoZSB0aW1lb3V0IGV4cGlyZWQsIHJlbW92ZSB0aGUgcmVzb3VyY2UgZnJvbSB0aGUgbGlzdCBhbmQgZ28KKyAgICAgICAgICAgIC8vIGFoZWFkIHRyeWluZyBpdC4KKyAgICAgICAgICAgIHBhcmVudF8uZmF1bHRJbmZvc18ucmVtb3ZlKHIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGUgdGltZW91dCBkaWRuJ3QgZXhwaXJlIHlldCwgdHJ5IHRoZSBuZXh0IHJlc291cmNlLgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2FjaGVfID0gcjsKKyAgICAgICAgY2FjaGVkXyA9IHRydWU7CisgICAgICAgIG5leHRJbmRleF8gPSBuZXh0SW5kZXhfICsgaSArIDE7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUsIGFsbCByZXNvdXJjZXMgYXJlIGN1cnJlbnRseSBpbmFjdGl2ZSBvciB0aGUgbm9uLWN5Y2xlCisgICAgICAvLyBwb29sIGhhcyBiZWVuIGV4aGF1c3RlZCwgc28gdGhlcmUgaXMgbm90aGluZyB3ZSBjYW4gZG8uCisgICAgICBuZXh0SW5kZXhfID0gbmV4dEluZGV4XyArIGV4YW1pbmVDb3VudDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGZpcnN0IHJlc291cmNlIGluIHRoZSByYW5nZS4KKyAgICAgKi8KKyAgICBSZXNvdXJjZSBmcm9udCgpIEBwcm9wZXJ0eSB7CisgICAgICBlbmZvcmNlKCFlbXB0eSk7CisgICAgICByZXR1cm4gY2FjaGVfOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIGZpcnN0IHJlc291cmNlIGZyb20gdGhlIHJhbmdlLgorICAgICAqCisgICAgICogVXN1YWxseSwgdGhpcyBpcyBjb21iaW5lZCB3aXRoIGEgY2FsbCB0byBUUmVzb3VyY2VQb29sLnJlY29yZFN1Y2Nlc3MoKQorICAgICAqIG9yIHJlY29yZEZhdWx0KCkuCisgICAgICovCisgICAgdm9pZCBwb3BGcm9udCgpIHsKKyAgICAgIGVuZm9yY2UoIWVtcHR5KTsKKyAgICAgIGNhY2hlZF8gPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJhbmdlIHdpbGwgYmVjb21lIG5vbi1lbXB0eSBhdCBzb21lIHBvaW50IGluIHRoZQorICAgICAqIGZ1dHVyZSwgYW5kIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gd2hlbiB0aGlzIHdpbGwgaGFwcGVuIGFuZAorICAgICAqIHdoYXQgd2lsbCBiZSB0aGUgbmV4dCByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIE1ha2VzIG9ubHkgc2Vuc2UgdG8gY2FsbCBvbiBlbXB0eSByYW5nZXMuCisgICAgICoKKyAgICAgKiBQYXJhbXM6CisgICAgICogICBuZXh0ID0gVGhlIG5leHQgcmVzb3VyY2UgdGhhdCB3aWxsIGJlY29tZSBhdmFpbGFibGUuCisgICAgICogICB3YWl0VGltZSA9IFRoZSBkdXJhdGlvbiB1bnRpbCB0aGF0IHJlc291cmNlIHdpbGwgYmVjb21lIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBib29sIHdpbGxCZWNvbWVOb25lbXB0eShvdXQgUmVzb3VyY2UgbmV4dCwgb3V0IER1cmF0aW9uIHdhaXRUaW1lKSB7CisgICAgICAvLyBJZiBubyByZXNvdXJjZXMgYXJlIGluIHRoZSBwb29sLCB0aGUgcmFuZ2Ugd2lsbCBuZXZlciBiZWNvbWUgbm9uLWVtcHR5LgorICAgICAgaWYgKHJlc291cmNlc18uZW1wdHkpIHJldHVybiBmYWxzZTsKKworICAgICAgLy8gSWYgY3ljbGUgbW9kZSBpcyBub3QgZW5hYmxlZCwgYSByYW5nZSBuZXZlciBiZWNvbWVzIG5vbi1lbXB0eSBhZnRlcgorICAgICAgLy8gYmVpbmcgZW1wdHkgb25jZSwgYmVjYXVzZSBhbGwgdGhlIGVsZW1lbnRzIGhhdmUgYWxyZWFkeSBiZWVuCisgICAgICAvLyB1c2VkL3NraXBwZWQgaW4gb3JkZXIgdG8gYmVjb21lIGVtcHR5LgorICAgICAgaWYgKCFwYXJlbnRfLmN5Y2xlKSByZXR1cm4gZmFsc2U7CisKKyAgICAgIGF1dG8gZmkgPSBwYXJlbnRfLmZhdWx0SW5mb3NfOworICAgICAgYXV0byBuZXh0UGFpciA9IG1pblBvcyEiYVsxXS5yZXNldFRpbWUgPCBiWzFdLnJlc2V0VGltZSIoCisgICAgICAgIHppcChmaS5rZXlzLCBmaS52YWx1ZXMpCisgICAgICApLmZyb250OworCisgICAgICBuZXh0ID0gbmV4dFBhaXJbMF07CisgICAgICB3YWl0VGltZSA9IHRvIUR1cmF0aW9uKG5leHRQYWlyWzFdLnJlc2V0VGltZSAtIHBhcmVudF8uZ2V0Q3VycmVudFRpY2tfKCkpOworCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB0aGlzKFRSZXNvdXJjZVBvb2wgcGFyZW50LCBSZXNvdXJjZVtdIHJlc291cmNlcykgeworICAgICAgcGFyZW50XyA9IHBhcmVudDsKKyAgICAgIHJlc291cmNlc18gPSByZXNvdXJjZXM7CisgICAgfQorCisgICAgVFJlc291cmNlUG9vbCBwYXJlbnRfOworCisgICAgLy8vIEFsbCBhdmFpbGFibGUgcmVzb3VyY2VzLiBXZSBrZWVwIGEgY29weSBvZiBpdCBhcyB0byBub3QgZ2V0IGNvbmZ1c2VkCisgICAgLy8vIHdoZW4gcmVzb3VyY2VzIGFyZSBhZGRlZCB0by9yZW1vdmVkIGZyb20gdGhlIHBhcmVudCBwb29sLgorICAgIFJlc291cmNlW10gcmVzb3VyY2VzXzsKKworICAgIC8vLyBBZnRlciB3ZSBoYXZlIGRldGVybWluZWQgdGhlIG5leHQgZWxlbWVudCBpbiBlbXB0eSgpLCB3ZSBzdG9yZSBpdCBoZXJlLgorICAgIFJlc291cmNlIGNhY2hlXzsKKworICAgIC8vLyBXaGV0aGVyIHRoZXJlIGlzIGN1cnJlbnRseSBzb21ldGhpbmcgaW4gdGhlIGNhY2hlLgorICAgIGJvb2wgY2FjaGVkXzsKKworICAgIC8vLyBUaGUgaW5kZXggdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20gYXQgdGhlIG5leHQgY2FsbCB0byBlbXB0eSgpLgorICAgIHNpemVfdCBuZXh0SW5kZXhfOworICB9CisKKyAgLy8vIERpdHRvCisgIFJhbmdlIG9wU2xpY2UoKSB7CisgICAgYXV0byByZXMgPSByZXNvdXJjZXNfOworICAgIGlmIChwZXJtdXRlKSB7CisgICAgICByZXMgPSBhcnJheShyYW5kb21Db3ZlcihyZXMsIHJuZEdlbikpOworICAgIH0KKyAgICByZXR1cm4gUmFuZ2UodGhpcywgcmVzKTsKKyAgfQorCisgIC8qKgorICAgKiBSZWNvcmRzIGEgc3VjY2VzcyBmb3IgYW4gb3BlcmF0aW9uIG9uIHRoZSBnaXZlbiByZXNvdXJjZSwgY2FuY2VsbGluZyBhCisgICAqIGZhdWx0IHN0cmVhaywgaWYgYW55LgorICAgKi8KKyAgdm9pZCByZWNvcmRTdWNjZXNzKFJlc291cmNlIHJlc291cmNlKSB7CisgICAgaWYgKHJlc291cmNlIGluIGZhdWx0SW5mb3NfKSB7CisgICAgICBmYXVsdEluZm9zXy5yZW1vdmUocmVzb3VyY2UpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZWNvcmRzIGEgZmF1bHQgZm9yIHRoZSBnaXZlbiByZXNvdXJjZS4KKyAgICoKKyAgICogSWYgYSByZXNvdXJjZSBmYWlscyBjb25zZWN1dGl2ZWx5IGZvciBtb3JlIHRoYW4gZmF1bHREaXNhYmxlQ291bnQgdGltZXMsCisgICAqIGl0IGlzIHRlbXBvcmFyaWx5IGRpc2FibGVkIChubyBsb25nZXIgY29uc2lkZXJlZCkgdW50aWwKKyAgICogZmF1bHREaXNhYmxlRHVyYXRpb24gaGFzIHBhc3NlZC4KKyAgICovCisgIHZvaWQgcmVjb3JkRmF1bHQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICBhdXRvIGZpID0gcmVzb3VyY2UgaW4gZmF1bHRJbmZvc187CisKKyAgICBpZiAoIWZpKSB7CisgICAgICBmYXVsdEluZm9zX1tyZXNvdXJjZV0gPSBGYXVsdEluZm8oKTsKKyAgICAgIGZpID0gcmVzb3VyY2UgaW4gZmF1bHRJbmZvc187CisgICAgfQorCisgICAgKytmaS5jb3VudDsKKyAgICBpZiAoZmkuY291bnQgPj0gZmF1bHREaXNhYmxlQ291bnQpIHsKKyAgICAgIC8vIElmIHRoZSByZXNvdXJjZSBoYXMgaGl0IHRoZSBmYXVsdCBjb3VudCBsaW1pdCwgZGlzYWJsZSBpdCBmb3IKKyAgICAgIC8vIHNwZWNpZmllZCBkdXJhdGlvbi4KKyAgICAgIGZpLnJlc2V0VGltZSA9IGdldEN1cnJlbnRUaWNrXygpICsgY2FzdChUaWNrRHVyYXRpb24pZmF1bHREaXNhYmxlRHVyYXRpb247CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gcmFuZG9tbHkgcGVybXV0ZSB0aGUgb3JkZXIgb2YgdGhlIHJlc291cmNlcyBpbiB0aGUgcG9vbCB3aGVuCisgICAqIHRha2luZyBhIHJhbmdlIHVzaW5nIG9wU2xpY2UoKS4KKyAgICoKKyAgICogVGhpcyBjYW4gYmUgdXNlZCBlLmcuIGFzIGEgc2ltcGxlIGZvcm0gb2YgbG9hZCBiYWxhbmNpbmcuCisgICAqLworICBib29sIHBlcm11dGUgPSB0cnVlOworCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIGtlZXAgaXRlcmF0aW5nIG92ZXIgdGhlIHBvb2wgbWVtYmVycyBhZnRlciBhbGwgaGF2ZSBiZWVuCisgICAqIHJldHVybmVkL2hhdmUgZmFpbGVkIG9uY2UuCisgICAqLworICBib29sIGN5Y2xlID0gZmFsc2U7CisKKyAgLyoqCisgICAqIFRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgZmF1bHRzIGFmdGVyIHdoaWNoIGEgcmVzb3VyY2UgaXMgZGlzYWJsZWQgdW50aWwKKyAgICogZmF1bHREaXNhYmxlRHVyYXRpb24gaGFzIHBhc3NlZC4gWmVybyB0byBuZXZlciBkaXNhYmxlIHJlc291cmNlcy4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gemVyby4KKyAgICovCisgIHVzaG9ydCBmYXVsdERpc2FibGVDb3VudCA9IDA7CisKKyAgLyoqCisgICAqIFRoZSBkdXJhdGlvbiBmb3Igd2hpY2ggYSByZXNvdXJjZSBpcyBubyBsb25nZXIgY29uc2lkZXJlZCBhZnRlciBpdCBoYXMKKyAgICogZmFpbGVkIHRvbyBvZnRlbi4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gb25lIHNlY29uZC4KKyAgICovCisgIER1cmF0aW9uIGZhdWx0RGlzYWJsZUR1cmF0aW9uID0gZHVyISJzZWNvbmRzIigxKTsKKworcHJpdmF0ZToKKyAgUmVzb3VyY2VbXSByZXNvdXJjZXNfOworICBGYXVsdEluZm9bUmVzb3VyY2VdIGZhdWx0SW5mb3NfOworCisgIC8vLyBGdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgdGltZXN0YW1wIGZyb20gc29tZSBtb25vdG9uaWMgc3lzdGVtIGNsb2NrLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgb3ZlcnJpZGFibGUgdG8gYmUgYWJsZSB0byB3cml0ZSB0aW1pbmctaW5zZW5zaXRpdmUgdW5pdCB0ZXN0cy4KKyAgLy8vIFRoZSBleHRyYSBpbmRpcmVjdGlvbiBzaG91bGQgbm90IG1hdHRlciBtdWNoIHBlcmZvcm1hbmNlLXdpc2UgY29tcGFyZWQgdG8KKyAgLy8vIHRoZSBhY3R1YWwgc3lzdGVtIGNhbGwsIGFuZCBieSBpdHMgdmVyeSBuYXR1cmUgdGhpc3Nob3VsZCBub3QgYmUgb24gYSBob3QKKyAgLy8vIHBhdGggYW55d2F5LgorICB0eXBlb2YoJlRpY2tEdXJhdGlvbi5jdXJyU3lzdGVtVGljaykgZ2V0Q3VycmVudFRpY2tfID0KKyAgICAmVGlja0R1cmF0aW9uLmN1cnJTeXN0ZW1UaWNrOworfQorCitwcml2YXRlIHsKKyAgc3RydWN0IEZhdWx0SW5mbyB7CisgICAgdXNob3J0IGNvdW50OworICAgIFRpY2tEdXJhdGlvbiByZXNldFRpbWU7CisgIH0KK30KKwordW5pdHRlc3QgeworICBhdXRvIHBvb2wgPSBuZXcgVFJlc291cmNlUG9vbCFPYmplY3QoW10pOworICBlbmZvcmNlKHBvb2xbXS5lbXB0eSk7CisgIE9iamVjdCBkdW1teVJlczsKKyAgRHVyYXRpb24gZHVtbXlEdXI7CisgIGVuZm9yY2UoIXBvb2xbXS53aWxsQmVjb21lTm9uZW1wdHkoZHVtbXlSZXMsIGR1bW15RHVyKSk7Cit9CisKK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHN0ZC5kYXRldGltZTsKKyAgaW1wb3J0IHRocmlmdC5iYXNlOworCisgIGF1dG8gYSA9IG5ldyBPYmplY3Q7CisgIGF1dG8gYiA9IG5ldyBPYmplY3Q7CisgIGF1dG8gYyA9IG5ldyBPYmplY3Q7CisgIGF1dG8gb2JqcyA9IFthLCBiLCBjXTsKKyAgYXV0byBwb29sID0gbmV3IFRSZXNvdXJjZVBvb2whT2JqZWN0KG9ianMpOworICBwb29sLnBlcm11dGUgPSBmYWxzZTsKKworICBzdGF0aWMgRHVyYXRpb24gZmFrZUNsb2NrOworICBwb29sLmdldEN1cnJlbnRUaWNrXyA9ICgpID0+IGNhc3QoVGlja0R1cmF0aW9uKWZha2VDbG9jazsKKworICBPYmplY3QgZHVtbXlSZXMgPSB2b2lkOworICBEdXJhdGlvbiBkdW1teUR1ciA9IHZvaWQ7CisKKyAgeworICAgIGF1dG8gciA9IHBvb2xbXTsKKworICAgIGZvcmVhY2ggKGksIG87IG9ianMpIHsKKyAgICAgIGVuZm9yY2UoIXIuZW1wdHkpOworICAgICAgZW5mb3JjZShyLmZyb250ID09IG8pOworICAgICAgci5wb3BGcm9udCgpOworICAgIH0KKworICAgIGVuZm9yY2Uoci5lbXB0eSk7CisgICAgZW5mb3JjZSghci53aWxsQmVjb21lTm9uZW1wdHkoZHVtbXlSZXMsIGR1bW15RHVyKSk7CisgIH0KKworICB7CisgICAgcG9vbC5mYXVsdERpc2FibGVDb3VudCA9IDI7CisKKyAgICBlbmZvcmNlKHBvb2xbXS5mcm9udCA9PSBhKTsKKyAgICBwb29sLnJlY29yZEZhdWx0KGEpOworICAgIGVuZm9yY2UocG9vbFtdLmZyb250ID09IGEpOworICAgIHBvb2wucmVjb3JkU3VjY2VzcyhhKTsKKyAgICBlbmZvcmNlKHBvb2xbXS5mcm9udCA9PSBhKTsKKyAgICBwb29sLnJlY29yZEZhdWx0KGEpOworICAgIGVuZm9yY2UocG9vbFtdLmZyb250ID09IGEpOworICAgIHBvb2wucmVjb3JkRmF1bHQoYSk7CisKKyAgICBhdXRvIHIgPSBwb29sW107CisgICAgZW5mb3JjZShyLmZyb250ID09IGIpOworICAgIHIucG9wRnJvbnQoKTsKKyAgICBlbmZvcmNlKHIuZnJvbnQgPT0gYyk7CisgICAgci5wb3BGcm9udCgpOworICAgIGVuZm9yY2Uoci5lbXB0eSk7CisgICAgZW5mb3JjZSghci53aWxsQmVjb21lTm9uZW1wdHkoZHVtbXlSZXMsIGR1bW15RHVyKSk7CisKKyAgICBmYWtlQ2xvY2sgKz0gMi5zZWNvbmRzOworICAgIC8vIE5vdCBpbiBjeWNsZSBtb2RlLCBoYXMgdG8gYmUgc3RpbGwgZW1wdHkgYWZ0ZXIgdGhlIHRpbWVvdXRzIGV4cGlyZWQuCisgICAgZW5mb3JjZShyLmVtcHR5KTsKKyAgICBlbmZvcmNlKCFyLndpbGxCZWNvbWVOb25lbXB0eShkdW1teVJlcywgZHVtbXlEdXIpKTsKKworICAgIGZvcmVhY2ggKG87IG9ianMpIHBvb2wucmVjb3JkU3VjY2VzcyhvKTsKKyAgfQorCisgIHsKKyAgICBwb29sLmZhdWx0RGlzYWJsZUNvdW50ID0gMTsKKworICAgIHBvb2wucmVjb3JkRmF1bHQoYSk7CisgICAgcG9vbC5yZWNvcmRGYXVsdChiKTsKKyAgICBwb29sLnJlY29yZEZhdWx0KGMpOworCisgICAgYXV0byByID0gcG9vbFtdOworICAgIGVuZm9yY2Uoci5lbXB0eSk7CisgICAgZW5mb3JjZSghci53aWxsQmVjb21lTm9uZW1wdHkoZHVtbXlSZXMsIGR1bW15RHVyKSk7CisKKyAgICBmb3JlYWNoIChvOyBvYmpzKSBwb29sLnJlY29yZFN1Y2Nlc3Mobyk7CisgIH0KKworICBwb29sLmN5Y2xlID0gdHJ1ZTsKKworICB7CisgICAgYXV0byByID0gcG9vbFtdOworCisgICAgZm9yZWFjaCAobzsgb2JqcyB+IG9ianMpIHsKKyAgICAgIGVuZm9yY2UoIXIuZW1wdHkpOworICAgICAgZW5mb3JjZShyLmZyb250ID09IG8pOworICAgICAgci5wb3BGcm9udCgpOworICAgIH0KKyAgfQorCisgIHsKKyAgICBwb29sLmZhdWx0RGlzYWJsZUNvdW50ID0gMjsKKworICAgIGVuZm9yY2UocG9vbFtdLmZyb250ID09IGEpOworICAgIHBvb2wucmVjb3JkRmF1bHQoYSk7CisgICAgZW5mb3JjZShwb29sW10uZnJvbnQgPT0gYSk7CisgICAgcG9vbC5yZWNvcmRTdWNjZXNzKGEpOworICAgIGVuZm9yY2UocG9vbFtdLmZyb250ID09IGEpOworICAgIHBvb2wucmVjb3JkRmF1bHQoYSk7CisgICAgZW5mb3JjZShwb29sW10uZnJvbnQgPT0gYSk7CisgICAgcG9vbC5yZWNvcmRGYXVsdChhKTsKKworICAgIGF1dG8gciA9IHBvb2xbXTsKKyAgICBlbmZvcmNlKHIuZnJvbnQgPT0gYik7CisgICAgci5wb3BGcm9udCgpOworICAgIGVuZm9yY2Uoci5mcm9udCA9PSBjKTsKKyAgICByLnBvcEZyb250KCk7CisgICAgZW5mb3JjZShyLmZyb250ID09IGIpOworCisgICAgZmFrZUNsb2NrICs9IDIuc2Vjb25kczsKKworICAgIHIucG9wRnJvbnQoKTsKKyAgICBlbmZvcmNlKHIuZnJvbnQgPT0gYyk7CisKKyAgICByLnBvcEZyb250KCk7CisgICAgZW5mb3JjZShyLmZyb250ID09IGEpOworCisgICAgZW5mb3JjZShwb29sW10uZnJvbnQgPT0gYSk7CisKKyAgICBmb3JlYWNoIChvOyBvYmpzKSBwb29sLnJlY29yZFN1Y2Nlc3Mobyk7CisgIH0KKworICB7CisgICAgcG9vbC5mYXVsdERpc2FibGVDb3VudCA9IDE7CisKKyAgICBwb29sLnJlY29yZEZhdWx0KGEpOworICAgIGZha2VDbG9jayArPSAxLm1zZWNzOworICAgIHBvb2wucmVjb3JkRmF1bHQoYik7CisgICAgZmFrZUNsb2NrICs9IDEubXNlY3M7CisgICAgcG9vbC5yZWNvcmRGYXVsdChjKTsKKworICAgIGF1dG8gciA9IHBvb2xbXTsKKyAgICBlbmZvcmNlKHIuZW1wdHkpOworCisgICAgLy8gTWFrZSBzdXJlIHdpbGxCZWNvbWVOb25lbXB0eSBnZXRzIHRoZSBvcmRlciByaWdodC4KKyAgICBlbmZvcmNlKHIud2lsbEJlY29tZU5vbmVtcHR5KGR1bW15UmVzLCBkdW1teUR1cikpOworICAgIGVuZm9yY2UoZHVtbXlSZXMgPT0gYSk7CisgICAgZW5mb3JjZShkdW1teUR1ciA+IER1cmF0aW9uLnplcm8pOworCisgICAgZm9yZWFjaCAobzsgb2JqcykgcG9vbC5yZWNvcmRTdWNjZXNzKG8pOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NvY2tldC5kIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9zb2NrZXQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2EwYTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9zb2NrZXQuZApAQCAtMCwwICsxLDk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogQWJzdHJhY3Rpb25zIG92ZXIgT1MtZGVwZW5kZW50IHNvY2tldCBmdW5jdGlvbmFsaXR5LgorICovCittb2R1bGUgdGhyaWZ0LmludGVybmFsLnNvY2tldDsKKworaW1wb3J0IHN0ZC5jb252IDogdG87CisKKy8vIEZyZWVCU0QgYW5kIE9TIFggcmV0dXJuIC0xIGFuZCBzZXQgRUNPTk5SRVNFVCBpZiBzb2NrZXQgd2FzIGNsb3NlZCBieQorLy8gdGhlIG90aGVyIHNpZGUsIHdlIG5lZWQgdG8gY2hlY2sgZm9yIHRoYXQgYmVmb3JlIHRocm93aW5nIGFuIGV4Y2VwdGlvbi4KK3ZlcnNpb24gKEZyZWVCU0QpIHsKKyAgZW51bSBjb25ucmVzZXRPblBlZXJTaHV0ZG93biA9IHRydWU7Cit9IGVsc2UgdmVyc2lvbiAoT1NYKSB7CisgIGVudW0gY29ubnJlc2V0T25QZWVyU2h1dGRvd24gPSB0cnVlOworfSBlbHNlIHsKKyAgZW51bSBjb25ucmVzZXRPblBlZXJTaHV0ZG93biA9IGZhbHNlOworfQorCit2ZXJzaW9uIChXaW4zMikgeworICBpbXBvcnQgc3RkLmMud2luZG93cy53aW5zb2NrIDogV1NBR2V0TGFzdEVycm9yLCBXU0FFSU5UUiwgV1NBRVdPVUxEQkxPQ0s7CisgIGltcG9ydCBzdGQud2luZG93cy5zeXNlcnJvciA6IHN5c0Vycm9yU3RyaW5nOworCisgIC8vIFRoZXNlIGFyZSB1bmZvcnR1bmF0ZWx5IG5vdCBkZWZpbmVkIGluIHN0ZC5jLndpbmRvd3Mud2luc29jaywgc2VlCisgIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczc0MDY2OC5hc3B4LgorICBlbnVtIFdTQUVDT05OUkVTRVQgPSAxMDA1NDsKKyAgZW51bSBXU0FFTk9UQ09OTiA9IDEwMDU3OworICBlbnVtIFdTQUVUSU1FRE9VVCA9IDEwMDYwOworfSBlbHNlIHsKKyAgaW1wb3J0IGNvcmUuc3RkYy5lcnJubyA6IGVycm5vLCBFQUdBSU4sIEVDT05OUkVTRVQsIEVJTlBST0dSRVNTLCBFSU5UUiwKKyAgICBFTk9UQ09OTiwgRVBJUEU7CisgIGltcG9ydCBjb3JlLnN0ZGMuc3RyaW5nIDogc3RyZXJyb3I7Cit9CisKKy8qCisgKiBDT05ORUNUX0lOUFJPR1JFU1NfRVJSTk86IHNldCBieSBjb25uZWN0KCkgZm9yIG5vbi1ibG9ja2luZyBzb2NrZXRzIGlmIHRoZQorICogICBjb25uZWN0aW9uIGNvdWxkIG5vdCBiZSBpbW1lZGlhdGVseSBlc3RhYmxpc2hlZC4KKyAqIElOVEVSUlVQVEVEX0VSUk5POiBzZXQgd2hlbiBibG9ja2luZyBzeXN0ZW0gY2FsbHMgYXJlIGludGVycnVwdGVkIGJ5CisgKiAgIHNpZ25hbHMgb3Igc2ltaWxhci4KKyAqIFRJTUVPVVRfRVJSTk86IHNldCB3aGVuIGEgc29ja2V0IHRpbWVvdXQgaGFzIGJlZW4gZXhjZWVkZWQuCisgKiBXT1VMRF9CTE9DS19FUlJOTzogc2V0IHdoZW4gc2VuZC9yZWN2IHdvdWxkIGJsb2NrIG9uIG5vbi1ibG9ja2luZyBzb2NrZXRzLgorICoKKyAqIGlzU29jZXRDbG9zZUVycm5vKGVycm5vKTogcmV0dXJucyB0cnVlIGlmIGVycm5vIGluZGljYXRlcyB0aGF0IHRoZSBzb2NrZXQKKyAqICAgaXMgbG9naWNhbGx5IGluIGNsb3NlZCBzdGF0ZSBub3cuCisgKi8KK3ZlcnNpb24gKFdpbjMyKSB7CisgIGFsaWFzIFdTQUdldExhc3RFcnJvciBnZXRTb2NrZXRFcnJubzsKKyAgZW51bSBDT05ORUNUX0lOUFJPR1JFU1NfRVJSTk8gPSBXU0FFV09VTERCTE9DSzsKKyAgZW51bSBJTlRFUlJVUFRFRF9FUlJOTyA9IFdTQUVJTlRSOworICBlbnVtIFRJTUVPVVRfRVJSTk8gPSBXU0FFVElNRURPVVQ7CisgIGVudW0gV09VTERfQkxPQ0tfRVJSTk8gPSBXU0FFV09VTERCTE9DSzsKKworICBib29sIGlzU29ja2V0Q2xvc2VFcnJubyh0eXBlb2YoZ2V0U29ja2V0RXJybm8oKSkgZXJybm8pIHsKKyAgICByZXR1cm4gKGVycm5vID09IFdTQUVDT05OUkVTRVQgfHwgZXJybm8gPT0gV1NBRU5PVENPTk4pOworICB9Cit9IGVsc2UgeworICBhbGlhcyBlcnJubyBnZXRTb2NrZXRFcnJubzsKKyAgZW51bSBDT05ORUNUX0lOUFJPR1JFU1NfRVJSTk8gPSBFSU5QUk9HUkVTUzsKKyAgZW51bSBJTlRFUlJVUFRFRF9FUlJOTyA9IEVJTlRSOworICBlbnVtIFdPVUxEX0JMT0NLX0VSUk5PID0gRUFHQUlOOworCisgIC8vIFRPRE86IFRoZSBDKysgVFNvY2tldCBpbXBsZW1lbnRhdGlvbiBtZW50aW9ucyB0aGF0IEVBR0FJTiBjYW4gYWxzbyBiZQorICAvLyBzZXQgKHVuZG9jdW1lbnRlZGx5KSBpbiBvdXQgb2YgcmVzb3VyY2UgY29uZGl0aW9uczsgaXQgd291bGQgYmUgYSBnb29kCisgIC8vIGlkZWEgdG8gY29udGFjdCB0aGUgb3JpZ2luYWwgYXV0aG9ycyBvZiB0aGUgQysrIGNvZGUgZm9yIGRldGFpbHMgYW5kIGFkYXB0CisgIC8vIHRoZSBjb2RlIGFjY29yZGluZ2x5LgorICBlbnVtIFRJTUVPVVRfRVJSTk8gPSBFQUdBSU47CisKKyAgYm9vbCBpc1NvY2tldENsb3NlRXJybm8odHlwZW9mKGdldFNvY2tldEVycm5vKCkpIGVycm5vKSB7CisgICAgcmV0dXJuIChlcnJubyA9PSBFUElQRSB8fCBlcnJubyA9PSBFQ09OTlJFU0VUIHx8IGVycm5vID09IEVOT1RDT05OKTsKKyAgfQorfQorCitzdHJpbmcgc29ja2V0RXJybm9TdHJpbmcodWludCBlcnJubykgeworICB2ZXJzaW9uIChXaW4zMikgeworICAgIHJldHVybiBzeXNFcnJvclN0cmluZyhlcnJubyk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHRvIXN0cmluZyhzdHJlcnJvcihlcnJubykpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbC5kIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9zc2wuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWY1NGI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9zc2wuZApAQCAtMCwwICsxLDI0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5pbnRlcm5hbC5zc2w7CisKK2ltcG9ydCBjb3JlLm1lbW9yeSA6IEdDOworaW1wb3J0IGNvcmUuc3RkYy5jb25maWc7CitpbXBvcnQgY29yZS5zdGRjLmVycm5vIDogZXJybm87CitpbXBvcnQgY29yZS5zdGRjLnN0cmluZyA6IHN0cmVycm9yOworaW1wb3J0IGRlaW1vcy5vcGVuc3NsLmVycjsKK2ltcG9ydCBkZWltb3Mub3BlbnNzbC5zc2w7CitpbXBvcnQgZGVpbW9zLm9wZW5zc2wueDUwOXYzOworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5LCBhcHBlbmRlcjsKK2ltcG9ydCBzdGQuY29udiA6IHRvOworaW1wb3J0IHN0ZC5zb2NrZXQgOiBBZGRyZXNzOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc3NsOworCisvKioKKyAqIENoZWNrcyBpZiB0aGUgcGVlciBpcyBhdXRob3JpemVkIGFmdGVyIHRoZSBTU0wgaGFuZHNoYWtlIGhhcyBiZWVuCisgKiBjb21wbGV0ZWQgb24gdGhlIGdpdmVuIGNvbm5jZXRpb24gYW5kIHRocm93cyBhbiBUU1NMRXhjZXB0aW9uIGlmIG5vdC4KKyAqCisgKiBQYXJhbXM6CisgKiAgIHNzbCA9IFRoZSBTU0wgY29ubmVjdGlvbiB0byBjaGVjay4KKyAqICAgYWNjZXNzTWFuYWdlciA9IFRoZSBhY2Nlc3MgbWFuYWdlciB0byBjaGVjayB0aGUgcGVlciBhZ2FpbnRzLgorICogICBwZWVyQWRkcmVzcyA9IFRoZSAoSVApIGFkZHJlc3Mgb2YgdGhlIHBlZXIuCisgKiAgIGhvc3ROYW1lID0gVGhlIGhvc3QgbmFtZSBvZiB0aGUgcGVlci4KKyAqLwordm9pZCBhdXRob3JpemUoU1NMKiBzc2wsIFRBY2Nlc3NNYW5hZ2VyIGFjY2Vzc01hbmFnZXIsCisgIEFkZHJlc3MgcGVlckFkZHJlc3MsIGxhenkgc3RyaW5nIGhvc3ROYW1lCispIHsKKyAgYWxpYXMgVEFjY2Vzc01hbmFnZXIuRGVjaXNpb24gRGVjaXNpb247CisKKyAgYXV0byByYyA9IFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChzc2wpOworICBpZiAocmMgIT0gWDUwOV9WX09LKSB7CisgICAgdGhyb3cgbmV3IFRTU0xFeGNlcHRpb24oIlNTTF9nZXRfdmVyaWZ5X3Jlc3VsdCgpOiAiIH4KKyAgICAgIHRvIXN0cmluZyhYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhyYykpKTsKKyAgfQorCisgIGF1dG8gY2VydCA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShzc2wpOworICBpZiAoY2VydCBpcyBudWxsKSB7CisgICAgLy8gQ2VydGlmaWNhdGUgaXMgbm90IHByZXNlbnQuCisgICAgaWYgKFNTTF9nZXRfdmVyaWZ5X21vZGUoc3NsKSAmIFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQpIHsKKyAgICAgIHRocm93IG5ldyBUU1NMRXhjZXB0aW9uKAorICAgICAgICAiQXV0aG9yaXplOiBSZXF1aXJlZCBjZXJ0aWZpY2F0ZSBub3QgcHJlc2VudC4iKTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFuIGFjY2VzcyBtYW5hZ2VyIHNldCwgd2UgZG9uJ3QgaW50ZW5kIHRvIGF1dGhvcml6ZQorICAgIC8vIHRoZSBjbGllbnQsIHNvIGV2ZXJ5dGhpbmcncyBmaW5lLgorICAgIGlmIChhY2Nlc3NNYW5hZ2VyKSB7CisgICAgICB0aHJvdyBuZXcgVFNTTEV4Y2VwdGlvbigKKyAgICAgICAgIkF1dGhvcml6ZTogQ2VydGlmaWNhdGUgcmVxdWlyZWQgZm9yIGF1dGhvcml6YXRpb24uIik7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIGlmIChhY2Nlc3NNYW5hZ2VyIGlzIG51bGwpIHsKKyAgICAvLyBObyBhY2Nlc3MgbWFuYWdlciBzZXQsIGNhbiByZXR1cm4gaW1tZWRpYXRlbHkgYXMgdGhlIGNlcnQgaXMgdmFsaWQKKyAgICAvLyBhbmQgYWxsIHBlZXJzIGFyZSBhdXRob3JpemVkLgorICAgIFg1MDlfZnJlZShjZXJ0KTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBib3RoIGNlcnRpZmljYXRlIGFuZCBhY2Nlc3MgbWFuYWdlciBhcmUgcHJlc2VudAorICBhdXRvIGRlY2lzaW9uID0gYWNjZXNzTWFuYWdlci52ZXJpZnkocGVlckFkZHJlc3MpOworCisgIGlmIChkZWNpc2lvbiAhPSBEZWNpc2lvbi5TS0lQKSB7CisgICAgWDUwOV9mcmVlKGNlcnQpOworICAgIGlmIChkZWNpc2lvbiAhPSBEZWNpc2lvbi5BTExPVykgeworICAgICAgdGhyb3cgbmV3IFRTU0xFeGNlcHRpb24oIkF1dGhvcml6ZTogQWNjZXNzIGRlbmllZCBiYXNlZCBvbiByZW1vdGUgSVAuIik7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIC8vIENoZWNrIHN1YmplY3RBbHROYW1lKHMpLCBpZiBwcmVzZW50LgorICBhdXRvIGFsdGVybmF0aXZlcyA9IGNhc3QoU1RBQ0tfT0YhKEdFTkVSQUxfTkFNRSkqKQorICAgIFg1MDlfZ2V0X2V4dF9kMmkoY2VydCwgTklEX3N1YmplY3RfYWx0X25hbWUsIG51bGwsIG51bGwpOworICBpZiAoYWx0ZXJuYXRpdmVzICE9IG51bGwpIHsKKyAgICBhdXRvIGNvdW50ID0gc2tfR0VORVJBTF9OQU1FX251bShhbHRlcm5hdGl2ZXMpOworICAgIGZvciAoaW50IGkgPSAwOyBkZWNpc2lvbiA9PSBEZWNpc2lvbi5TS0lQICYmIGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBhdXRvIG5hbWUgPSBza19HRU5FUkFMX05BTUVfdmFsdWUoYWx0ZXJuYXRpdmVzLCBpKTsKKyAgICAgIGlmIChuYW1lIGlzIG51bGwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBhdXRvIGRhdGEgPSBBU04xX1NUUklOR19kYXRhKG5hbWUuZC5pYTUpOworICAgICAgYXV0byBsZW5ndGggPSBBU04xX1NUUklOR19sZW5ndGgobmFtZS5kLmlhNSk7CisgICAgICBzd2l0Y2ggKG5hbWUudHlwZSkgeworICAgICAgICBjYXNlIEdFTkVSQUxfTkFNRS5HRU5fRE5TOgorICAgICAgICAgIGRlY2lzaW9uID0gYWNjZXNzTWFuYWdlci52ZXJpZnkoaG9zdE5hbWUsIGNhc3QoY2hhcltdKWRhdGFbMCAuLiBsZW5ndGhdKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHRU5FUkFMX05BTUUuR0VOX0lQQUREOgorICAgICAgICAgIGRlY2lzaW9uID0gYWNjZXNzTWFuYWdlci52ZXJpZnkocGVlckFkZHJlc3MsIGRhdGFbMCAuLiBsZW5ndGhdKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAvLyBEbyBub3RoaW5nLgorICAgICAgfQorICAgIH0KKworICAgIC8vIERNRCBAQEJVR0BAOiBFbXB0eSB0ZW1wbGF0ZSBhcmd1bWVudHMgcGFyZW5zIHNob3VsZCBub3QgYmUgbmVlZGVkLgorICAgIHNrX0dFTkVSQUxfTkFNRV9wb3BfZnJlZSEoKShhbHRlcm5hdGl2ZXMsICZHRU5FUkFMX05BTUVfZnJlZSk7CisgIH0KKworICAvLyBJZiB3ZSBhcmUgYWxyZWR5IGRvbmUsIHJldHVybi4KKyAgaWYgKGRlY2lzaW9uICE9IERlY2lzaW9uLlNLSVApIHsKKyAgICBYNTA5X2ZyZWUoY2VydCk7CisgICAgaWYgKGRlY2lzaW9uICE9IERlY2lzaW9uLkFMTE9XKSB7CisgICAgICB0aHJvdyBuZXcgVFNTTEV4Y2VwdGlvbigiQXV0aG9yaXplOiBBY2Nlc3MgZGVuaWVkLiIpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICAvLyBDaGVjayBjb21tb25OYW1lLgorICBhdXRvIG5hbWUgPSBYNTA5X2dldF9zdWJqZWN0X25hbWUoY2VydCk7CisgIGlmIChuYW1lICFpcyBudWxsKSB7CisgICAgWDUwOV9OQU1FX0VOVFJZKiBlbnRyeTsKKyAgICBjaGFyKiB1dGY4OworICAgIGludCBsYXN0ID0gLTE7CisgICAgd2hpbGUgKGRlY2lzaW9uID09IERlY2lzaW9uLlNLSVApIHsKKyAgICAgIGxhc3QgPSBYNTA5X05BTUVfZ2V0X2luZGV4X2J5X05JRChuYW1lLCBOSURfY29tbW9uTmFtZSwgbGFzdCk7CisgICAgICBpZiAobGFzdCA9PSAtMSkKKyAgICAgICAgYnJlYWs7CisgICAgICBlbnRyeSA9IFg1MDlfTkFNRV9nZXRfZW50cnkobmFtZSwgbGFzdCk7CisgICAgICBpZiAoZW50cnkgaXMgbnVsbCkKKyAgICAgICAgY29udGludWU7CisgICAgICBhdXRvIGNvbW1vbiA9IFg1MDlfTkFNRV9FTlRSWV9nZXRfZGF0YShlbnRyeSk7CisgICAgICBhdXRvIHNpemUgPSBBU04xX1NUUklOR190b19VVEY4KCZ1dGY4LCBjb21tb24pOworICAgICAgZGVjaXNpb24gPSBhY2Nlc3NNYW5hZ2VyLnZlcmlmeShob3N0TmFtZSwgdXRmOFswIC4uIHNpemVdKTsKKyAgICAgIENSWVBUT19mcmVlKHV0ZjgpOworICAgIH0KKyAgfQorICBYNTA5X2ZyZWUoY2VydCk7CisgIGlmIChkZWNpc2lvbiAhPSBEZWNpc2lvbi5BTExPVykgeworICAgIHRocm93IG5ldyBUU1NMRXhjZXB0aW9uKCJBdXRob3JpemU6IENvdWxkIG5vdCBhdXRob3JpemUgcGVlci4iKTsKKyAgfQorfQorCisvKgorICogT3BlblNTTCBlcnJvciBpbmZvcm1hdGlvbiB1c2VkIGZvciBzdG9yaW5nIEQgZXhjZXB0aW9ucyBvbiB0aGUgT3BlblNTTAorICogZXJyb3Igc3RhY2suCisgKi8KK2VudW0gRVJSX0xJQl9EX0VYQ0VQVElPTiA9IEVSUl9MSUJfVVNFUjsKK2VudW0gRVJSX0ZfRF9FWENFUFRJT04gPSAwOyAvLyBmdW5jdGlvbiBpZCAtIHdoYXQgdG8gdXNlIGhlcmU/CitlbnVtIEVSUl9SX0RfRVhDRVBUSU9OID0gMTIzNDsgLy8gOTkgYW5kIGFib3ZlIGFyZSByZXNlcnZlZCBmb3IgYXBwbGljYXRpb25zCitlbnVtIEVSUl9GSUxFX0RfRVhDRVBUSU9OID0gImRfZXhjZXB0aW9uIjsKK2VudW0gRVJSX0xJTkVfRF9FWENFUFRJT04gPSAwOworZW51bSBFUlJfRkxBR1NfRF9FWENFUFRJT04gPSAwOworCisvKioKKyAqIFJldHVybnMgYW4gZXhjZXB0aW9uIGZvciB0aGUgbGFzdC4KKyAqCisgKiBQYXJhbXM6CisgKiAgIGxvY2F0aW9uID0gQW4gb3B0aW9uYWwgImxvY2F0aW9uIiB0byBhZGQgdG8gdGhlIGVycm9yIG1lc3NhZ2UgKHR5cGljYWxseQorICogICAgIHRoZSBsYXN0IFNTTCBBUEkgY2FsbCkuCisgKi8KK0V4Y2VwdGlvbiBnZXRTU0xFeGNlcHRpb24oc3RyaW5nIGxvY2F0aW9uID0gbnVsbCwgc3RyaW5nIGNsaWVudEZpbGUgPSBfX0ZJTEVfXywKKyAgc2l6ZV90IGNsaWVudExpbmUgPSBfX0xJTkVfXworKSB7CisgIC8vIFdlIGNhbiByZXR1cm4gZWl0aGVyIGFuIGV4Y2VwdGlvbiBzYXZlZCBmcm9tIEQgQklPIGNvZGUsIG9yIGEgInRydWUiCisgIC8vIE9wZW5TU0wgZXJyb3IuIEJlY2F1c2UgdGhlcmUgY2FuIHBvc3NpYmx5IGJlIG1vcmUgdGhhbiBvbmUgZXJyb3Igb24gdGhlCisgIC8vIGVycm9yIHN0YWNrLCB3ZSBoYXZlIHRvIGZldGNoIGFsbCBvZiB0aGVtLCBhbmQgcGljayB0aGUgbGFzdCwgaS5lLiBuZXdlc3QKKyAgLy8gb25lLiBXZSBjb25jYXRlbmF0ZSBtdWx0aXBsZSBzdWNjZXNzaXZlIE9wZW5TU0wgZXJyb3IgbWVzc2FnZXMgaW50byBhCisgIC8vIHNpbmdsZSBvbmUsIGJ1dCBhbHdheXMganVzdCByZXR1cm4gdGhlIGxhc3QgRCBleHBjZXRpb24uCisgIHN0cmluZyBtZXNzYWdlOyAvLyBQcm9iYWJseSBiZXR0ZXIgdXNlIGFuIEFwcGVuZGVyIGhlcmUuCisgIGJvb2wgaGFkTWVzc2FnZTsKKyAgRXhjZXB0aW9uIGV4Y2VwdGlvbjsKKworICB2b2lkIGluaXRNZXNzYWdlKCkgeworICAgIG1lc3NhZ2UuZGVzdHJveSgpOworICAgIGhhZE1lc3NhZ2UgPSBmYWxzZTsKKyAgICBpZiAoIWxvY2F0aW9uLmVtcHR5KSB7CisgICAgICBtZXNzYWdlIH49IGxvY2F0aW9uOworICAgICAgbWVzc2FnZSB+PSAiOiAiOworICAgIH0KKyAgfQorICBpbml0TWVzc2FnZSgpOworCisgIGF1dG8gZXJybiA9IGVycm5vOworCisgIGNvbnN0KGNoYXIpKiBmaWxlID0gdm9pZDsKKyAgaW50IGxpbmUgPSB2b2lkOworICBjb25zdChjaGFyKSogZGF0YSA9IHZvaWQ7CisgIGludCBmbGFncyA9IHZvaWQ7CisgIGNfdWxvbmcgY29kZSA9IHZvaWQ7CisgIHdoaWxlICgoY29kZSA9IEVSUl9nZXRfZXJyb3JfbGluZV9kYXRhKCZmaWxlLCAmbGluZSwgJmRhdGEsICZmbGFncykpICE9IDApIHsKKyAgICBpZiAoRVJSX0dFVF9SRUFTT04oY29kZSkgPT0gRVJSX1JfRF9FWENFUFRJT04pIHsKKyAgICAgIGluaXRNZXNzYWdlKCk7CisgICAgICBHQy5yZW1vdmVSb290KGNhc3Qodm9pZCopZGF0YSk7CisgICAgICBleGNlcHRpb24gPSBjYXN0KEV4Y2VwdGlvbilkYXRhOworICAgIH0gZWxzZSB7CisgICAgICBleGNlcHRpb24gPSBudWxsOworCisgICAgICBpZiAoaGFkTWVzc2FnZSkgeworICAgICAgICBtZXNzYWdlIH49ICIsICI7CisgICAgICB9CisKKyAgICAgIGF1dG8gcmVhc29uID0gRVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcoY29kZSk7CisgICAgICBpZiAocmVhc29uKSB7CisgICAgICAgIG1lc3NhZ2Ugfj0gIlNTTCBlcnJvcjogIiB+IHRvIXN0cmluZyhyZWFzb24pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWVzc2FnZSB+PSAiU1NMIGVycm9yICMiIH4gdG8hc3RyaW5nKGNvZGUpOworICAgICAgfQorCisgICAgICBoYWRNZXNzYWdlID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICAvLyBJZiB0aGUgbGFzdCBpdGVtIGZyb20gdGhlIHN0YWNrIHdhcyBhIEQgZXhjZXB0aW9uLCB0aHJvdyBpdC4KKyAgaWYgKGV4Y2VwdGlvbikgcmV0dXJuIGV4Y2VwdGlvbjsKKworICAvLyBXZSBhcmUgZGVhbGluZyB3aXRoIGFuIE9wZW5TU0wgZXJyb3IgdGhhdCBkb2Vzbid0IHJvb3QgaW4gYSBEIGV4Y2VwdGlvbi4KKyAgaWYgKCFoYWRNZXNzYWdlKSB7CisgICAgLy8gSWYgd2UgZGlkbid0IGdldCBhbiBhY3R1YWwgZXJyb3IgZnJvbSB0aGUgc3RhY2sgeWV0LCB0cnkgZXJybm8uCisgICAgc3RyaW5nIGVycm5TdHJpbmc7CisgICAgaWYgKGVycm4gIT0gMCkgeworICAgICAgZXJyblN0cmluZyA9IHRvIXN0cmluZyhzdHJlcnJvcihlcnJuKSk7CisgICAgfQorICAgIGlmIChlcnJuU3RyaW5nLmVtcHR5KSB7CisgICAgICBtZXNzYWdlIH49ICJVbmtub3duIGVycm9yIjsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZSB+PSBlcnJuU3RyaW5nOworICAgIH0KKyAgfQorCisgIG1lc3NhZ2Ugfj0gIi4iOworICByZXR1cm4gbmV3IFRTU0xFeGNlcHRpb24obWVzc2FnZSwgY2xpZW50RmlsZSwgY2xpZW50TGluZSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbF9iaW8uZCBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvc3NsX2Jpby5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlODUwMjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbF9iaW8uZApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFByb3ZpZGVzIGEgU1NMIEJJTyBpbXBsZW1lbnRhdGlvbiB3cmFwcGluZyBhIFRocmlmdCB0cmFuc3BvcnQuCisgKgorICogVGhpcyB3YXksIFNTTCBJL08gY2FuIGJlIHJlbGF5ZWQgb3ZlciBUaHJpZnQgdHJhbnNwb3J0IHdpdGhvdXQgaW50cm9kdWNpbmcKKyAqIGFuIGFkZGl0aW9uYWwgbGF5ZXIgb2YgYnVmZmVyaW5nLCBlc3BlY2lhbGx5IGZvciB0aGUgbm9uLWJsb2NraW5nCisgKiB0cmFuc3BvcnRzLgorICoKKyAqIEZvciB0aGUgVGhyaWZ0IHRyYW5zcG9ydCBpbmNhcm5hdGlvbnMgb2YgdGhlIFNTTCBlbnRpdGllcywgInR0IiBpcyB1c2VkIGFzCisgKiBwcmVmaXggZm9yIGNsYXJpdHkuCisgKi8KK21vZHVsZSB0aHJpZnQuaW50ZXJuYWwuc3NsX2JpbzsKKworaW1wb3J0IGNvcmUuc3RkYy5jb25maWc7CitpbXBvcnQgY29yZS5zdGRjLnN0cmluZyA6IHN0cmxlbjsKK2ltcG9ydCBjb3JlLm1lbW9yeSA6IEdDOworaW1wb3J0IGRlaW1vcy5vcGVuc3NsLmJpbzsKK2ltcG9ydCBkZWltb3Mub3BlbnNzbC5lcnI7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLnNzbDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CisKKy8qKgorICogQ3JlYXRlcyBhbiBTU0wgQklPIG9iamVjdCB3cmFwcGluZyB0aGUgZ2l2ZW4gdHJhbnNwb3J0LgorICoKKyAqIEV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZSB0cmFuc3BvcnQgYXJlIHB1c2hlZCBvbnRvIHRoZSBPcGVuU1NMIGVycm9yIHN0YWNrLAorICogdXNpbmcgdGhlIGxvY2F0aW9uL3JlYXNvbiB2YWx1ZXMgZnJvbSB0aHJpZnQuaW50ZXJuYWwuc3NsLkVSUl8qX0RfRVhDRVBUSU9OLgorICoKKyAqIFRoZSB0cmFuc3BvcnQgaXMgYXNzdW1lZCB0byBiZSByZWFkeSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyB3aGVuIHRoZSBCSU8KKyAqIGZ1bmN0aW9ucyBhcmUgY2FsbGVkLCBpdCBpcyBub3Qgb3BlbmVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBQYXJhbXM6CisgKiAgIHRyYW5zcG9ydCA9IFRoZSB0cmFuc3BvcnQgdG8gd3JhcC4KKyAqICAgY2xvc2VUcmFuc3BvcnQgPSBXaGV0aGVyIHRoZSBjbG9zZSB0aGUgdHJhbnNwb3J0IHdoZW4gdGhlIFNTTCBCSU8gaXMKKyAqICAgICBjbG9zZWQuCisgKi8KK0JJTyogY3JlYXRlVFRyYW5zcG9ydEJJTyhUVHJhbnNwb3J0IHRyYW5zcG9ydCwgYm9vbCBjbG9zZVRyYW5zcG9ydCkgeworICBhdXRvIHJlc3VsdCA9IEJJT19uZXcoY2FzdChCSU9fTUVUSE9EKikmdHRCaW9NZXRob2QpOworICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7CisKKyAgR0MuYWRkUm9vdChjYXN0KHZvaWQqKXRyYW5zcG9ydCk7CisgIEJJT19zZXRfZmQocmVzdWx0LCBjbG9zZVRyYW5zcG9ydCwgY2FzdChjX2xvbmcpY2FzdCh2b2lkKil0cmFuc3BvcnQpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ByaXZhdGUgeworICAvLyBIZWxwZXIgdG8gZ2V0IHRoZSBUaHJpZnQgdHJhbnNwb3J0IGFzc2lnbmVkIHdpdGggdGhlIGdpdmVuIEJJTy4KKyAgVFRyYW5zcG9ydCB0cmFucyhCSU8qIGIpIG5vdGhyb3cgeworICAgIGF1dG8gcmVzdWx0ID0gY2FzdChUVHJhbnNwb3J0KWIucHRyOworICAgIGFzc2VydChyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICB2b2lkIHNldEVycm9yKEV4Y2VwdGlvbiBlKSBub3Rocm93IHsKKyAgICBFUlJfcHV0X2Vycm9yKEVSUl9MSUJfRF9FWENFUFRJT04sIEVSUl9GX0RfRVhDRVBUSU9OLCBFUlJfUl9EX0VYQ0VQVElPTiwKKyAgICAgIEVSUl9GSUxFX0RfRVhDRVBUSU9OLCBFUlJfTElORV9EX0VYQ0VQVElPTik7CisgICAgdHJ5IHsgR0MuYWRkUm9vdChjYXN0KHZvaWQqKWUpOyB9IGNhdGNoIChUaHJvd2FibGUpIHt9CisgICAgRVJSX3NldF9lcnJvcl9kYXRhKGNhc3QoY2hhciopZSwgRVJSX0ZMQUdTX0RfRVhDRVBUSU9OKTsKKyAgfQorCisgIGV4dGVybihDKSBpbnQgdHRXcml0ZShCSU8qIGIsIGNvbnN0KGNoYXIpKiBkYXRhLCBpbnQgbGVuZ3RoKSBub3Rocm93IHsKKyAgICBhc3NlcnQoYik7CisgICAgaWYgKCFkYXRhIHx8IGxlbmd0aCA8PSAwKSByZXR1cm4gMDsKKyAgICB0cnkgeworICAgICAgdHJhbnMoYikud3JpdGUoKGNhc3QodWJ5dGUqKWRhdGEpWzAgLi4gbGVuZ3RoXSk7CisgICAgICByZXR1cm4gbGVuZ3RoOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBzZXRFcnJvcihlKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKworICBleHRlcm4oQykgaW50IHR0UmVhZChCSU8qIGIsIGNoYXIqIGRhdGEsIGludCBsZW5ndGgpIG5vdGhyb3cgeworICAgIGFzc2VydChiKTsKKyAgICBpZiAoIWRhdGEgfHwgbGVuZ3RoIDw9IDApIHJldHVybiAwOworICAgIHRyeSB7CisgICAgICByZXR1cm4gY2FzdChpbnQpdHJhbnMoYikucmVhZCgoY2FzdCh1Ynl0ZSopZGF0YSlbMCAuLiBsZW5ndGhdKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgc2V0RXJyb3IoZSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisKKyAgZXh0ZXJuKEMpIGludCB0dFB1dHMoQklPKiBiLCBjb25zdChjaGFyKSogc3RyKSBub3Rocm93IHsKKyAgICByZXR1cm4gdHRXcml0ZShiLCBzdHIsIGNhc3QoaW50KXN0cmxlbihzdHIpKTsKKyAgfQorCisgIGV4dGVybihDKSBjX2xvbmcgdHRDdHJsKEJJTyogYiwgaW50IGNtZCwgY19sb25nIG51bSwgdm9pZCogcHRyKSBub3Rocm93IHsKKyAgICBhc3NlcnQoYik7CisKKyAgICBzd2l0Y2ggKGNtZCkgeworICAgICAgY2FzZSBCSU9fQ19TRVRfRkQ6CisgICAgICAgIC8vIE5vdGUgdGhhdCBjbG9zZSBmbGFnIGFuZCAiZmQiIGFyZSBhY3R1YWxseSByZXZlcnNlZCBoZXJlIGJlY2F1c2Ugd2UKKyAgICAgICAgLy8gbmVlZCA2NCBiaXQgd2lkdGggZm9yIHRoZSBwb2ludGVyIOKAkyBzaG91bGQgcHJvYmFibHkgZHJvcCBCSU9fc2V0X2ZkCisgICAgICAgIC8vIGFsdG9nZXRoZXIuCisgICAgICAgIHR0RGVzdHJveShiKTsKKyAgICAgICAgYi5wdHIgPSBjYXN0KHZvaWQqKW51bTsKKyAgICAgICAgYi5zaHV0ZG93biA9IGNhc3QoaW50KXB0cjsKKyAgICAgICAgYi5pbml0XyA9IDE7CisgICAgICAgIHJldHVybiAxOworICAgICAgY2FzZSBCSU9fQ19HRVRfRkQ6CisgICAgICAgIGlmICghYi5pbml0XykgcmV0dXJuIC0xOworICAgICAgICAqKGNhc3Qodm9pZCoqKXB0cikgPSBiLnB0cjsKKyAgICAgICAgcmV0dXJuIGNhc3QoY19sb25nKWIucHRyOworICAgICAgY2FzZSBCSU9fQ1RSTF9HRVRfQ0xPU0U6CisgICAgICAgIHJldHVybiBiLnNodXRkb3duOworICAgICAgY2FzZSBCSU9fQ1RSTF9TRVRfQ0xPU0U6CisgICAgICAgIGIuc2h1dGRvd24gPSBjYXN0KGludCludW07CisgICAgICAgIHJldHVybiAxOworICAgICAgY2FzZSBCSU9fQ1RSTF9GTFVTSDoKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICB0cmFucyhiKS5mbHVzaCgpOworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIHNldEVycm9yKGUpOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgY2FzZSBCSU9fQ1RSTF9EVVA6CisgICAgICAgIC8vIFNlZW1zIGxpa2Ugd2UgaGF2ZSBub3RoaW5nIHRvIGRvIG9uIGR1cGxpY2F0aW9uLCBidXQgY291bGRuJ3QgZmluZAorICAgICAgICAvLyBhbnkgZG9jdW1lbnRhdGlvbiBpZiB0aGlzIGFjdHVhbGx5IGV2ZXIgaGFwcGVucyBkdXJpbmcgbm9ybWFsIFNTTAorICAgICAgICAvLyB1c2FnZS4KKyAgICAgICAgcmV0dXJuIDE7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBleHRlcm4oQykgaW50IHR0Q3JlYXRlKEJJTyogYikgbm90aHJvdyB7CisgICAgYXNzZXJ0KGIpOworICAgIGIuaW5pdF8gPSAwOworICAgIGIubnVtID0gMDsgLy8gVXNlci1kZWZpbmVkIG51bWJlciBmaWVsZCwgdW51c2VkIGhlcmUuCisgICAgYi5wdHIgPSBudWxsOworICAgIGIuZmxhZ3MgPSAwOworICAgIHJldHVybiAxOworICB9CisKKyAgZXh0ZXJuKEMpIGludCB0dERlc3Ryb3koQklPKiBiKSBub3Rocm93IHsKKyAgICBpZiAoIWIpIHJldHVybiAwOworCisgICAgaW50IHJjID0gMTsKKyAgICBpZiAoYi5zaHV0ZG93bikgeworICAgICAgaWYgKGIuaW5pdF8pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICB0cmFucyhiKS5jbG9zZSgpOworICAgICAgICAgIEdDLnJlbW92ZVJvb3QoY2FzdCh2b2lkKil0cmFucyhiKSk7CisgICAgICAgICAgYi5wdHIgPSBudWxsOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIHNldEVycm9yKGUpOworICAgICAgICAgIHJjID0gLTE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGIuaW5pdF8gPSAwOworICAgICAgYi5mbGFncyA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworICB9CisKKyAgaW1tdXRhYmxlIEJJT19NRVRIT0QgdHRCaW9NZXRob2QgPSB7CisgICAgQklPX1RZUEVfU09VUkNFX1NJTkssCisgICAgIlRUcmFuc3BvcnQiLAorICAgICZ0dFdyaXRlLAorICAgICZ0dFJlYWQsCisgICAgJnR0UHV0cywKKyAgICBudWxsLCAvLyBnZXRzCisgICAgJnR0Q3RybCwKKyAgICAmdHRDcmVhdGUsCisgICAgJnR0RGVzdHJveSwKKyAgICBudWxsIC8vIGNhbGxiYWNrX2N0cmwKKyAgfTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvdGVzdC9wcm90b2NvbC5kIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC90ZXN0L3Byb3RvY29sLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyNTE1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvdGVzdC9wcm90b2NvbC5kCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LmludGVybmFsLnRlc3QucHJvdG9jb2w7CisKK2ltcG9ydCBzdGQuZXhjZXB0aW9uOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworCit2ZXJzaW9uICh1bml0dGVzdCk6CisKK3ZvaWQgdGVzdENvbnRhaW5lclNpemVMaW1pdChQcm90b2NvbCkoKSBpZiAoaXNUUHJvdG9jb2whUHJvdG9jb2wpIHsKKyAgYXV0byBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgYXV0byBwcm90ID0gbmV3IFByb3RvY29sKGJ1ZmZlcik7CisKKyAgLy8gTWFrZSBzdXJlIHJlYWRpbmcgZmFpbHMgaWYgYSBjb250YWluZXIgbGFyZ2VyIHRoYW4gdGhlIHNpemUgbGltaXQgaXMgcmVhZC4KKyAgcHJvdC5jb250YWluZXJTaXplTGltaXQgPSAzOworCisgIHsKKyAgICBwcm90LndyaXRlTGlzdEJlZ2luKFRMaXN0KFRUeXBlLkkzMiwgNCkpOworICAgIHByb3Qud3JpdGVJMzIoMCk7IC8vIE1ha2Ugc3VyZSBzaXplIGNhbiBiZSByZWFkIGUuZy4gZm9yIEpTT04gcHJvdG9jb2wuCisgICAgcHJvdC5yZXNldCgpOworCisgICAgYXV0byBlID0gY2FzdChUUHJvdG9jb2xFeGNlcHRpb24pY29sbGVjdEV4Y2VwdGlvbihwcm90LnJlYWRMaXN0QmVnaW4oKSk7CisgICAgZW5mb3JjZShlICYmIGUudHlwZSA9PSBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5TSVpFX0xJTUlUKTsKKyAgICBwcm90LnJlc2V0KCk7CisgICAgYnVmZmVyLnJlc2V0KCk7CisgIH0KKworICB7CisgICAgcHJvdC53cml0ZU1hcEJlZ2luKFRNYXAoVFR5cGUuSTMyLCBUVHlwZS5JMzIsIDQpKTsKKyAgICBwcm90LndyaXRlSTMyKDApOyAvLyBNYWtlIHN1cmUgc2l6ZSBjYW4gYmUgcmVhZCBlLmcuIGZvciBKU09OIHByb3RvY29sLgorICAgIHByb3QucmVzZXQoKTsKKworICAgIGF1dG8gZSA9IGNhc3QoVFByb3RvY29sRXhjZXB0aW9uKWNvbGxlY3RFeGNlcHRpb24ocHJvdC5yZWFkTWFwQmVnaW4oKSk7CisgICAgZW5mb3JjZShlICYmIGUudHlwZSA9PSBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5TSVpFX0xJTUlUKTsKKyAgICBwcm90LnJlc2V0KCk7CisgICAgYnVmZmVyLnJlc2V0KCk7CisgIH0KKworICB7CisgICAgcHJvdC53cml0ZVNldEJlZ2luKFRTZXQoVFR5cGUuSTMyLCA0KSk7CisgICAgcHJvdC53cml0ZUkzMigwKTsgLy8gTWFrZSBzdXJlIHNpemUgY2FuIGJlIHJlYWQgZS5nLiBmb3IgSlNPTiBwcm90b2NvbC4KKyAgICBwcm90LnJlc2V0KCk7CisKKyAgICBhdXRvIGUgPSBjYXN0KFRQcm90b2NvbEV4Y2VwdGlvbiljb2xsZWN0RXhjZXB0aW9uKHByb3QucmVhZFNldEJlZ2luKCkpOworICAgIGVuZm9yY2UoZSAmJiBlLnR5cGUgPT0gVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuU0laRV9MSU1JVCk7CisgICAgcHJvdC5yZXNldCgpOworICAgIGJ1ZmZlci5yZXNldCgpOworICB9CisKKyAgLy8gTWFrZSBzdXJlIHJlYWRpbmcgd29ya3MgaWYgdGhlIGNvbnRhaW5lcnMgYXJlIHNtYWxsZXIgdGhhbiB0aGUgbGltaXQgb3IKKyAgLy8gbm8gbGltaXQgaXMgc2V0LgorICBmb3JlYWNoIChsaW1pdDsgWzMsIDAsIC0xXSkgeworICAgIHByb3QuY29udGFpbmVyU2l6ZUxpbWl0ID0gbGltaXQ7CisKKyAgICB7CisgICAgICBwcm90LndyaXRlTGlzdEJlZ2luKFRMaXN0KFRUeXBlLkkzMiwgMikpOworICAgICAgcHJvdC53cml0ZUkzMigwKTsKKyAgICAgIHByb3Qud3JpdGVJMzIoMSk7CisgICAgICBwcm90LndyaXRlTGlzdEVuZCgpOworICAgICAgcHJvdC5yZXNldCgpOworCisgICAgICBhdXRvIGxpc3QgPSBwcm90LnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgIGVuZm9yY2UobGlzdC5lbGVtVHlwZSA9PSBUVHlwZS5JMzIpOworICAgICAgZW5mb3JjZShsaXN0LnNpemUgPT0gMik7CisgICAgICBlbmZvcmNlKHByb3QucmVhZEkzMigpID09IDApOworICAgICAgZW5mb3JjZShwcm90LnJlYWRJMzIoKSA9PSAxKTsKKyAgICAgIHByb3QucmVhZExpc3RFbmQoKTsKKworICAgICAgcHJvdC5yZXNldCgpOworICAgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgfQorCisgICAgeworICAgICAgcHJvdC53cml0ZU1hcEJlZ2luKFRNYXAoVFR5cGUuSTMyLCBUVHlwZS5JMzIsIDIpKTsKKyAgICAgIHByb3Qud3JpdGVJMzIoMCk7CisgICAgICBwcm90LndyaXRlSTMyKDEpOworICAgICAgcHJvdC53cml0ZUkzMigyKTsKKyAgICAgIHByb3Qud3JpdGVJMzIoMyk7CisgICAgICBwcm90LndyaXRlTWFwRW5kKCk7CisgICAgICBwcm90LnJlc2V0KCk7CisKKyAgICAgIGF1dG8gbWFwID0gcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgIGVuZm9yY2UobWFwLmtleVR5cGUgPT0gVFR5cGUuSTMyKTsKKyAgICAgIGVuZm9yY2UobWFwLnZhbHVlVHlwZSA9PSBUVHlwZS5JMzIpOworICAgICAgZW5mb3JjZShtYXAuc2l6ZSA9PSAyKTsKKyAgICAgIGVuZm9yY2UocHJvdC5yZWFkSTMyKCkgPT0gMCk7CisgICAgICBlbmZvcmNlKHByb3QucmVhZEkzMigpID09IDEpOworICAgICAgZW5mb3JjZShwcm90LnJlYWRJMzIoKSA9PSAyKTsKKyAgICAgIGVuZm9yY2UocHJvdC5yZWFkSTMyKCkgPT0gMyk7CisgICAgICBwcm90LnJlYWRNYXBFbmQoKTsKKworICAgICAgcHJvdC5yZXNldCgpOworICAgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgfQorCisgICAgeworICAgICAgcHJvdC53cml0ZVNldEJlZ2luKFRTZXQoVFR5cGUuSTMyLCAyKSk7CisgICAgICBwcm90LndyaXRlSTMyKDApOworICAgICAgcHJvdC53cml0ZUkzMigxKTsKKyAgICAgIHByb3Qud3JpdGVTZXRFbmQoKTsKKyAgICAgIHByb3QucmVzZXQoKTsKKworICAgICAgYXV0byBzZXQgPSBwcm90LnJlYWRTZXRCZWdpbigpOworICAgICAgZW5mb3JjZShzZXQuZWxlbVR5cGUgPT0gVFR5cGUuSTMyKTsKKyAgICAgIGVuZm9yY2Uoc2V0LnNpemUgPT0gMik7CisgICAgICBlbmZvcmNlKHByb3QucmVhZEkzMigpID09IDApOworICAgICAgZW5mb3JjZShwcm90LnJlYWRJMzIoKSA9PSAxKTsKKyAgICAgIHByb3QucmVhZFNldEVuZCgpOworCisgICAgICBwcm90LnJlc2V0KCk7CisgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICB9CisgIH0KK30KKwordm9pZCB0ZXN0U3RyaW5nU2l6ZUxpbWl0KFByb3RvY29sKSgpIGlmIChpc1RQcm90b2NvbCFQcm90b2NvbCkgeworICBhdXRvIGJ1ZmZlciA9IG5ldyBUTWVtb3J5QnVmZmVyOworICBhdXRvIHByb3QgPSBuZXcgUHJvdG9jb2woYnVmZmVyKTsKKworICAvLyBNYWtlIHN1cmUgcmVhZGluZyBmYWlscyBpZiBhIHN0cmluZyBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBsaW1pdCBpcyByZWFkLgorICBwcm90LnN0cmluZ1NpemVMaW1pdCA9IDM7CisKKyAgeworICAgIHByb3Qud3JpdGVTdHJpbmcoImFzZGYiKTsKKyAgICBwcm90LnJlc2V0KCk7CisKKyAgICBhdXRvIGUgPSBjYXN0KFRQcm90b2NvbEV4Y2VwdGlvbiljb2xsZWN0RXhjZXB0aW9uKHByb3QucmVhZFN0cmluZygpKTsKKyAgICBlbmZvcmNlKGUgJiYgZS50eXBlID09IFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLlNJWkVfTElNSVQpOworICAgIHByb3QucmVzZXQoKTsKKyAgICBidWZmZXIucmVzZXQoKTsKKyAgfQorCisgIHsKKyAgICBwcm90LndyaXRlQmluYXJ5KFsxLCAyLCAzLCA0XSk7CisgICAgcHJvdC5yZXNldCgpOworCisgICAgYXV0byBlID0gY2FzdChUUHJvdG9jb2xFeGNlcHRpb24pY29sbGVjdEV4Y2VwdGlvbihwcm90LnJlYWRCaW5hcnkoKSk7CisgICAgZW5mb3JjZShlICYmIGUudHlwZSA9PSBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5TSVpFX0xJTUlUKTsKKyAgICBwcm90LnJlc2V0KCk7CisgICAgYnVmZmVyLnJlc2V0KCk7CisgIH0KKworICAvLyBNYWtlIHN1cmUgcmVhZGluZyB3b3JrcyBpZiB0aGUgY29udGFpbmVycyBhcmUgc21hbGxlciB0aGFuIHRoZSBsaW1pdCBvcgorICAvLyBubyBsaW1pdCBpcyBzZXQuCisgIGZvcmVhY2ggKGxpbWl0OyBbMywgMCwgLTFdKSB7CisgICAgcHJvdC5jb250YWluZXJTaXplTGltaXQgPSBsaW1pdDsKKworICAgIHsKKyAgICAgIHByb3Qud3JpdGVTdHJpbmcoImFzIik7CisgICAgICBwcm90LnJlc2V0KCk7CisKKyAgICAgIGVuZm9yY2UocHJvdC5yZWFkU3RyaW5nKCkgPT0gImFzIik7CisgICAgICBwcm90LnJlc2V0KCk7CisgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICB9CisKKyAgICB7CisgICAgICBwcm90LndyaXRlQmluYXJ5KFsxLCAyXSk7CisgICAgICBwcm90LnJlc2V0KCk7CisKKyAgICAgIGVuZm9yY2UocHJvdC5yZWFkQmluYXJ5KCkgPT0gWzEsIDJdKTsKKyAgICAgIHByb3QucmVzZXQoKTsKKyAgICAgIGJ1ZmZlci5yZXNldCgpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC90ZXN0L3NlcnZlci5kIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC90ZXN0L3NlcnZlci5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNWU4NmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3Rlc3Qvc2VydmVyLmQKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuaW50ZXJuYWwudGVzdC5zZXJ2ZXI7CisKK2ltcG9ydCBjb3JlLnN5bmMuY29uZGl0aW9uOworaW1wb3J0IGNvcmUuc3luYy5tdXRleDsKK2ltcG9ydCBjb3JlLnRocmVhZCA6IFRocmVhZDsKK2ltcG9ydCBzdGQuZGF0ZXRpbWU7CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgc3RkLnR5cGVjb25zIDogV2hpdGVIb2xlOworaW1wb3J0IHN0ZC52YXJpYW50IDogVmFyaWFudDsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5wcm9jZXNzb3I7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5iYXNlOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LnNvY2tldDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOworCit2ZXJzaW9uKHVuaXR0ZXN0KToKKworLyoqCisgKiBUZXN0cyBpZiBzZXJ2aW5nIGlzIHN0b3BwZWQgY29ycmVjdGx5IGlmIHRoZSBjYW5jZWxsYXRpb24gcGFzc2VkIHRvIHNlcnZlKCkKKyAqIGlzIHRyaWdnZXJlZC4KKyAqCisgKiBCZWNhdXNlIHRoZSB0ZXN0cyBhcmUgcnVuIG1hbnkgdGltZXMgaW4gYSBsb29wLCB0aGlzIGlzIGluZGlyZWN0bHkgYWxzbyBhCisgKiB0ZXN0IHdoZXRoZXIgc29ja2V0LCBldGMuIGhhbmRsZXMgYXJlIGNsZWFuZWQgdXAgY29ycmVjdGx5LCBiZWNhdXNlIHRoZQorICogYXBwbGljYXRpb24gd2lsbCBsaWtlbHkgcnVuIG91dCBvZiBoYW5kbGVzIG90aGVyd2lzZS4KKyAqLwordm9pZCB0ZXN0U2VydmVDYW5jZWwoU2VydmVyKSh2b2lkIGRlbGVnYXRlKFNlcnZlcikgc2VydmVyU2V0dXAgPSBudWxsKSBpZiAoCisgIGlzKFNlcnZlciA6IFRTZXJ2ZXIpCispIHsKKyAgYXV0byBwcm9jID0gbmV3IFdoaXRlSG9sZSFUUHJvY2Vzc29yOworICBhdXRvIHRmID0gbmV3IFRUcmFuc3BvcnRGYWN0b3J5OworICBhdXRvIHBmID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkhKCk7CisKKyAgLy8gTmVlZCBhIHNwZWNpYWwgY2FzZSBmb3IgVE5vbmJsb2NraW5nU2VydmVyIHdoaWNoIGRvZXNuJ3QgdXNlCisgIC8vIFRTZXJ2ZXJUcmFuc3BvcnQuCisgIHN0YXRpYyBpZiAoX190cmFpdHMoY29tcGlsZXMsIG5ldyBTZXJ2ZXIocHJvYywgMCwgdGYsIHBmKSkpIHsKKyAgICBhdXRvIHNlcnZlciA9IG5ldyBTZXJ2ZXIocHJvYywgMCwgdGYsIHBmKTsKKyAgfSBlbHNlIHsKKyAgICBhdXRvIHNlcnZlciA9IG5ldyBTZXJ2ZXIocHJvYywgbmV3IFRTZXJ2ZXJTb2NrZXQoMCksIHRmLCBwZik7CisgIH0KKworICAvLyBPbiBXaW5kb3dzLCB3ZSB1c2UgVENQIHNvY2tldHMgdG8gcmVwbGFjZSBzb2NrZXRwYWlyKCkuIFNpbmNlIHRoZXkgc3RheQorICAvLyBpbiBUSU1FX1dBSVQgZm9yIHNvbWUgdGltZSBldmVuIGlmIHRoZXkgYXJlIHByb3Blcmx5IGNsb3NlZCwgd2UgaGF2ZSB0byB1c2UKKyAgLy8gYSBsb3dlciBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBhdm9pZCBydW5uaW5nIG91dCBvZiBwb3J0cy9idWZmZXIgc3BhY2UuCisgIHZlcnNpb24gKFdpbmRvd3MpIHsKKyAgICBlbnVtIElURVJBVElPTlMgPSAxMDA7CisgIH0gZWxzZSB7CisgICAgZW51bSBJVEVSQVRJT05TID0gMTAwMDA7CisgIH0KKworICBpZiAoc2VydmVyU2V0dXApIHNlcnZlclNldHVwKHNlcnZlcik7CisKKyAgYXV0byBzZXJ2aW5nTXV0ZXggPSBuZXcgTXV0ZXg7CisgIGF1dG8gc2VydmluZ0NvbmRpdGlvbiA9IG5ldyBDb25kaXRpb24oc2VydmluZ011dGV4KTsKKyAgYXV0byBkb25lTXV0ZXggPSBuZXcgTXV0ZXg7CisgIGF1dG8gZG9uZUNvbmRpdGlvbiA9IG5ldyBDb25kaXRpb24oZG9uZU11dGV4KTsKKworICBjbGFzcyBDYW5jZWxsaW5nSGFuZGxlciA6IFRTZXJ2ZXJFdmVudEhhbmRsZXIgeworICAgIHZvaWQgcHJlU2VydmUoKSB7CisgICAgICBzeW5jaHJvbml6ZWQgKHNlcnZpbmdNdXRleCkgeworICAgICAgICBzZXJ2aW5nQ29uZGl0aW9uLm5vdGlmeUFsbCgpOworICAgICAgfQorICAgIH0KKyAgICBWYXJpYW50IGNyZWF0ZUNvbnRleHQoVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0KSB7IHJldHVybiBWYXJpYW50LmluaXQ7IH0KKyAgICB2b2lkIGRlbGV0ZUNvbnRleHQoVmFyaWFudCBzZXJ2ZXJDb250ZXh0LCBUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQpIHt9CisgICAgdm9pZCBwcmVQcm9jZXNzKFZhcmlhbnQgc2VydmVyQ29udGV4dCwgVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHt9CisgIH0KKyAgc2VydmVyLmV2ZW50SGFuZGxlciA9IG5ldyBDYW5jZWxsaW5nSGFuZGxlcjsKKworICBmb3JlYWNoIChpOyAwIC4uIElURVJBVElPTlMpIHsKKyAgICBzeW5jaHJvbml6ZWQgKHNlcnZpbmdNdXRleCkgeworICAgICAgYXV0byBjYW5jZWwgPSBuZXcgVENhbmNlbGxhdGlvbk9yaWdpbjsKKyAgICAgIHN5bmNocm9uaXplZCAoZG9uZU11dGV4KSB7CisgICAgICAgIGF1dG8gc2VydmVyVGhyZWFkID0gbmV3IFRocmVhZCh7CisgICAgICAgICAgc2VydmVyLnNlcnZlKGNhbmNlbCk7CisgICAgICAgICAgc3luY2hyb25pemVkIChkb25lTXV0ZXgpIHsKKyAgICAgICAgICAgIGRvbmVDb25kaXRpb24ubm90aWZ5QWxsKCk7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgc2VydmVyVGhyZWFkLmlzRGFlbW9uID0gdHJ1ZTsKKyAgICAgICAgc2VydmVyVGhyZWFkLnN0YXJ0KCk7CisKKyAgICAgICAgc2VydmluZ0NvbmRpdGlvbi53YWl0KCk7CisKKyAgICAgICAgY2FuY2VsLnRyaWdnZXIoKTsKKyAgICAgICAgZW5mb3JjZShkb25lQ29uZGl0aW9uLndhaXQoZHVyISJtc2VjcyIoMyoxMDAwKSkpOworICAgICAgICBzZXJ2ZXJUaHJlYWQuam9pbigpOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC90cmFpdHMuZCBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvdHJhaXRzLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNlMTA4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvdHJhaXRzLmQKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5pbnRlcm5hbC50cmFpdHM7CisKK2ltcG9ydCBzdGQudHJhaXRzOworCisvKioKKyAqIEFkZHMgwrtub3Rocm93wqsgdG8gdGhlIHR5cGUgb2YgdGhlIHBhc3NlZCBmdW5jdGlvbiBwb2ludGVyL2RlbGVnYXRlLCBpZiBpdAorICogaXMgbm90IGFscmVhZHkgcHJlc2VudC4KKyAqCisgKiBUZWNobmljYWxseSwgYXNzdW1lTm90aHJvdyBqdXN0IHBlcmZvcm1zIGEgY2FzdCwgYnV0IHVzaW5nIGl0IGhhcyB0aGUKKyAqIGFkdmFudGFnZSBvZiBiZWluZyBleHBsaWNpdGx5IGFib3V0IHRoZSBvcGVyYXRpb24gdGhhdCBpcyBwZXJmb3JtZWQuCisgKi8KK2F1dG8gYXNzdW1lTm90aHJvdyhUKShUIHQpIGlmIChpc0Z1bmN0aW9uUG9pbnRlciFUIHx8IGlzRGVsZWdhdGUhVCkgeworICBlbnVtIGF0dHJzID0gZnVuY3Rpb25BdHRyaWJ1dGVzIVQgfCBGdW5jdGlvbkF0dHJpYnV0ZS5ub3Rocm93XzsKKyAgcmV0dXJuIGNhc3QoU2V0RnVuY3Rpb25BdHRyaWJ1dGVzIShULCBmdW5jdGlvbkxpbmthZ2UhVCwgYXR0cnMpKSB0OworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9iYXNlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2Jhc2UuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDY0OGIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9iYXNlLmQKQEAgLTAsMCArMSw0NDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBEZWZpbmVzIHRoZSBiYXNpYyBpbnRlcmZhY2UgZm9yIGEgVGhyaWZ0IHByb3RvY29sIGFuZCBhc3NvY2lhdGVkIGV4Y2VwdGlvbgorICogdHlwZXMuCisgKgorICogTW9zdCBwYXJ0cyBvZiB0aGUgcHJvdG9jb2wgQVBJIGFyZSB0eXBpY2FsbHkgbm90IHVzZWQgaW4gY2xpZW50IGNvZGUsIGFzCisgKiB0aGUgYWN0dWFsIHNlcmlhbGl6YXRpb24gY29kZSBpcyBnZW5lcmF0ZWQgYnkgdGhyaWZ0LmNvZGVnZW4uKiDigJMgdGhlIG9ubHkKKyAqIGludGVyZXN0aW5nIHRoaW5nIHVzdWFsbHkgaXMgdGhhdCB0aGVyZSBhcmUgcHJvdG9jb2xzIHdoaWNoIGNhbiBiZSBjcmVhdGVkCisgKiBmcm9tIHRyYW5zcG9ydHMgYW5kIHBhc3NlZCBhcm91bmQuCisgKi8KK21vZHVsZSB0aHJpZnQucHJvdG9jb2wuYmFzZTsKKworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKKworLyoqCisgKiBUaGUgZmllbGQgdHlwZXMgVGhyaWZ0IHByb3RvY29scyBzdXBwb3J0LgorICovCitlbnVtIFRUeXBlIDogYnl0ZSB7CisgIFNUT1AgICA9IDAsIC8vLyBVc2VkIHRvIG1hcmsgdGhlIGVuZCBvZiBhIHNlcXVlbmNlIG9mIGZpZWxkcy4KKyAgVk9JRCAgID0gMSwgLy8vCisgIEJPT0wgICA9IDIsIC8vLworICBCWVRFICAgPSAzLCAvLy8KKyAgRE9VQkxFID0gNCwgLy8vCisgIEkxNiAgICA9IDYsIC8vLworICBJMzIgICAgPSA4LCAvLy8KKyAgSTY0ICAgID0gMTAsIC8vLworICBTVFJJTkcgPSAxMSwgLy8vCisgIFNUUlVDVCA9IDEyLCAvLy8KKyAgTUFQICAgID0gMTMsIC8vLworICBTRVQgICAgPSAxNCwgLy8vCisgIExJU1QgICA9IDE1IC8vLworfQorCisvKioKKyAqIFR5cGVzIG9mIFRocmlmdCBSUEMgbWVzc2FnZXMuCisgKi8KK2VudW0gVE1lc3NhZ2VUeXBlIDogYnl0ZSB7CisgIENBTEwgPSAxLCAvLy8gQ2FsbCBvZiBhIG5vcm1hbCwgdHdvLXdheSBSUEMgbWV0aG9kLgorICBSRVBMWSA9IDIsIC8vLyBSZXBseSB0byBhIG5vcm1hbCBtZXRob2QgY2FsbC4KKyAgRVhDRVBUSU9OID0gMywgLy8vIFJlcGx5IHRvIGEgbWV0aG9kIGNhbGwgaWYgdGFyZ2V0IHJhaXNlZCBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi4KKyAgT05FV0FZID0gNCAvLy8gQ2FsbCBvZiBhIG9uZS13YXkgUlBDIG1ldGhvZCB3aGljaCBpcyBub3QgZm9sbG93ZWQgYnkgYSByZXBseS4KK30KKworLyoqCisgKiBEZXNjcmlwdGlvbnMgb2YgVGhyaWZ0IGVudGl0aWVzLgorICovCitzdHJ1Y3QgVEZpZWxkIHsKKyAgc3RyaW5nIG5hbWU7CisgIFRUeXBlIHR5cGU7CisgIHNob3J0IGlkOworfQorCisvLy8gZGl0dG8KK3N0cnVjdCBUTGlzdCB7CisgIFRUeXBlIGVsZW1UeXBlOworICBzaXplX3Qgc2l6ZTsKK30KKworLy8vIGRpdHRvCitzdHJ1Y3QgVE1hcCB7CisgIFRUeXBlIGtleVR5cGU7CisgIFRUeXBlIHZhbHVlVHlwZTsKKyAgc2l6ZV90IHNpemU7Cit9CisKKy8vLyBkaXR0bworc3RydWN0IFRNZXNzYWdlIHsKKyAgc3RyaW5nIG5hbWU7CisgIFRNZXNzYWdlVHlwZSB0eXBlOworICBpbnQgc2VxaWQ7Cit9CisKKy8vLyBkaXR0bworc3RydWN0IFRTZXQgeworICBUVHlwZSBlbGVtVHlwZTsKKyAgc2l6ZV90IHNpemU7Cit9CisKKy8vLyBkaXR0bworc3RydWN0IFRTdHJ1Y3QgeworICBzdHJpbmcgbmFtZTsKK30KKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIGEgVGhyaWZ0IHByb3RvY29sIGltcGxlbWVudGF0aW9uLiBFc3NlbnRpYWxseSwgaXQgZGVmaW5lcworICogYSB3YXkgb2YgcmVhZGluZyBhbmQgd3JpdGluZyBhbGwgdGhlIGJhc2UgdHlwZXMsIHBsdXMgYSBtZWNoYW5pc20gZm9yCisgKiB3cml0aW5nIG91dCBzdHJ1Y3RzIHdpdGggaW5kZXhlZCBmaWVsZHMuCisgKgorICogVFByb3RvY29sIG9iamVjdHMgc2hvdWxkIG5vdCBiZSBzaGFyZWQgYWNyb3NzIG11bHRpcGxlIGVuY29kaW5nIGNvbnRleHRzLAorICogYXMgdGhleSBtYXkgbmVlZCB0byBtYWludGFpbiBpbnRlcm5hbCBzdGF0ZSBpbiBzb21lIHByb3RvY29scyAoZS5nLiBKU09OKS4KKyAqIE5vdGUgdGhhdCBpcyBpcyBhY2NlcHRhYmxlIGZvciB0aGUgVFByb3RvY29sIG1vZHVsZSB0byBkbyBpdHMgb3duIGludGVybmFsCisgKiBidWZmZXJlZCByZWFkcy93cml0ZXMgdG8gdGhlIHVuZGVybHlpbmcgVFRyYW5zcG9ydCB3aGVyZSBhcHByb3ByaWF0ZSAoaS5lLgorICogd2hlbiBwYXJzaW5nIGFuIGlucHV0IFhNTCBzdHJlYW0sIHJlYWRpbmcgY291bGQgYmUgYmF0Y2hlZCByYXRoZXIgdGhhbgorICogbG9va2luZyBhaGVhZCBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyIGZvciBhIGNsb3NlIHRhZykuCisgKi8KK2ludGVyZmFjZSBUUHJvdG9jb2wgeworICAvLy8gVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHVzZWQgYnkgdGhlIHByb3RvY29sLgorICBUVHJhbnNwb3J0IHRyYW5zcG9ydCgpIEBwcm9wZXJ0eTsKKworICAvKgorICAgKiBXcml0aW5nIG1ldGhvZHMuCisgICAqLworCisgIHZvaWQgd3JpdGVCb29sKGJvb2wgYik7IC8vLworICB2b2lkIHdyaXRlQnl0ZShieXRlIGIpOyAvLy8KKyAgdm9pZCB3cml0ZUkxNihzaG9ydCBpMTYpOyAvLy8KKyAgdm9pZCB3cml0ZUkzMihpbnQgaTMyKTsgLy8vCisgIHZvaWQgd3JpdGVJNjQobG9uZyBpNjQpOyAvLy8KKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKTsgLy8vCisgIHZvaWQgd3JpdGVTdHJpbmcoc3RyaW5nIHN0cik7IC8vLworICB2b2lkIHdyaXRlQmluYXJ5KHVieXRlW10gYnVmKTsgLy8vCisKKyAgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKTsgLy8vCisgIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCk7IC8vLworICB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCB0c3RydWN0KTsgLy8vCisgIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKTsgLy8vCisgIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCk7IC8vLworICB2b2lkIHdyaXRlRmllbGRFbmQoKTsgLy8vCisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKTsgLy8vCisgIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCk7IC8vLworICB2b2lkIHdyaXRlTGlzdEVuZCgpOyAvLy8KKyAgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKTsgLy8vCisgIHZvaWQgd3JpdGVNYXBFbmQoKTsgLy8vCisgIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCk7IC8vLworICB2b2lkIHdyaXRlU2V0RW5kKCk7IC8vLworCisgIC8qCisgICAqIFJlYWRpbmcgbWV0aG9kcy4KKyAgICovCisKKyAgYm9vbCByZWFkQm9vbCgpOyAvLy8KKyAgYnl0ZSByZWFkQnl0ZSgpOyAvLy8KKyAgc2hvcnQgcmVhZEkxNigpOyAvLy8KKyAgaW50IHJlYWRJMzIoKTsgLy8vCisgIGxvbmcgcmVhZEk2NCgpOyAvLy8KKyAgZG91YmxlIHJlYWREb3VibGUoKTsgLy8vCisgIHN0cmluZyByZWFkU3RyaW5nKCk7IC8vLworICB1Ynl0ZVtdIHJlYWRCaW5hcnkoKTsgLy8vCisKKyAgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpOyAvLy8KKyAgdm9pZCByZWFkTWVzc2FnZUVuZCgpOyAvLy8KKyAgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKTsgLy8vCisgIHZvaWQgcmVhZFN0cnVjdEVuZCgpOyAvLy8KKyAgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCk7IC8vLworICB2b2lkIHJlYWRGaWVsZEVuZCgpOyAvLy8KKyAgVExpc3QgcmVhZExpc3RCZWdpbigpOyAvLy8KKyAgdm9pZCByZWFkTGlzdEVuZCgpOyAvLy8KKyAgVE1hcCByZWFkTWFwQmVnaW4oKTsgLy8vCisgIHZvaWQgcmVhZE1hcEVuZCgpOyAvLy8KKyAgVFNldCByZWFkU2V0QmVnaW4oKTsgLy8vCisgIHZvaWQgcmVhZFNldEVuZCgpOyAvLy8KKworICAvKioKKyAgICogUmVzZXQgYW55IGludGVybmFsIHN0YXRlIGJhY2sgdG8gYSBibGFuayBzbGF0ZSwgaWYgdGhlIHByb3RvY29sIGlzCisgICAqIHN0YXRlZnVsLgorICAgKi8KKyAgdm9pZCByZXNldCgpOworfQorCisvKioKKyAqIHRydWUgaWYgVCBpcyBhIFRQcm90b2NvbC4KKyAqLwordGVtcGxhdGUgaXNUUHJvdG9jb2woVCkgeworICBlbnVtIGlzVFByb3RvY29sID0gaXMoVCA6IFRQcm90b2NvbCk7Cit9CisKK3VuaXR0ZXN0IHsKKyAgc3RhdGljIGFzc2VydChpc1RQcm90b2NvbCFUUHJvdG9jb2wpOworICBzdGF0aWMgYXNzZXJ0KCFpc1RQcm90b2NvbCF2b2lkKTsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgcHJvdG9jb2wgb3BlcmF0aW5nIG9uIGEgZ2l2ZW4gdHJhbnNwb3J0LgorICovCitpbnRlcmZhY2UgVFByb3RvY29sRmFjdG9yeSB7CisgIC8vLworICBUUHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucyk7Cit9CisKKy8qKgorICogQSBwcm90b2NvbC1sZXZlbCBleGNlcHRpb24uCisgKi8KK2NsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24geworICAvLy8gVGhlIHBvc3NpYmxlIGV4Y2VwdGlvbiB0eXBlcy4KKyAgZW51bSBUeXBlIHsKKyAgICBVTktOT1dOLCAvLy8KKyAgICBJTlZBTElEX0RBVEEsIC8vLworICAgIE5FR0FUSVZFX1NJWkUsIC8vLworICAgIFNJWkVfTElNSVQsIC8vLworICAgIEJBRF9WRVJTSU9OLCAvLy8KKyAgICBOT1RfSU1QTEVNRU5URUQsIC8vLworICAgIERFUFRIX0xJTUlUIC8vLworICB9CisKKyAgLy8vCisgIHRoaXMoVHlwZSB0eXBlLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fLCBUaHJvd2FibGUgbmV4dCA9IG51bGwpIHsKKyAgICBzdGF0aWMgc3RyaW5nIG1zZ0ZvclR5cGUoVHlwZSB0eXBlKSB7CisgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBUeXBlLlVOS05PV046IHJldHVybiAiVW5rbm93biBwcm90b2NvbCBleGNlcHRpb24iOworICAgICAgICBjYXNlIFR5cGUuSU5WQUxJRF9EQVRBOiByZXR1cm4gIkludmFsaWQgZGF0YSI7CisgICAgICAgIGNhc2UgVHlwZS5ORUdBVElWRV9TSVpFOiByZXR1cm4gIk5lZ2F0aXZlIHNpemUiOworICAgICAgICBjYXNlIFR5cGUuU0laRV9MSU1JVDogcmV0dXJuICJFeGNlZWRlZCBzaXplIGxpbWl0IjsKKyAgICAgICAgY2FzZSBUeXBlLkJBRF9WRVJTSU9OOiByZXR1cm4gIkludmFsaWQgdmVyc2lvbiI7CisgICAgICAgIGNhc2UgVHlwZS5OT1RfSU1QTEVNRU5URUQ6IHJldHVybiAiTm90IGltcGxlbWVudGVkIjsKKyAgICAgICAgY2FzZSBUeXBlLkRFUFRIX0xJTUlUOiByZXR1cm4gIkV4Y2VlZGVkIHNpemUgbGltaXQiOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gIihJbnZhbGlkIGV4Y2VwdGlvbiB0eXBlKSI7CisgICAgICB9CisgICAgfQorICAgIHRoaXMobXNnRm9yVHlwZSh0eXBlKSwgdHlwZSwgZmlsZSwgbGluZSwgbmV4dCk7CisgIH0KKworICAvLy8KKyAgdGhpcyhzdHJpbmcgbXNnLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fLAorICAgIFRocm93YWJsZSBuZXh0ID0gbnVsbCkKKyAgeworICAgIHRoaXMobXNnLCBUeXBlLlVOS05PV04sIGZpbGUsIGxpbmUsIG5leHQpOworICB9CisKKyAgLy8vCisgIHRoaXMoc3RyaW5nIG1zZywgVHlwZSB0eXBlLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fLAorICAgIFRocm93YWJsZSBuZXh0ID0gbnVsbCkKKyAgeworICAgIHN1cGVyKG1zZywgZmlsZSwgbGluZSwgbmV4dCk7CisgICAgdHlwZV8gPSB0eXBlOworICB9CisKKyAgLy8vCisgIFR5cGUgdHlwZSgpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHR5cGVfOworICB9CisKK3Byb3RlY3RlZDoKKyAgVHlwZSB0eXBlXzsKK30KKworLyoqCisgKiBTa2lwcyBhIGZpZWxkIG9mIHRoZSBnaXZlbiB0eXBlIG9uIHRoZSBwcm90b2NvbC4KKyAqCisgKiBUaGUgbWFpbiBwdXJwb3NlIG9mIHNraXAoKSBpcyB0byBhbGxvdyB0cmVhdGluZyBzdHJ1Y3QgYW5kIGNvbnRhaW5lciB0eXBlcywKKyAqICh3aGVyZSBtdWx0aXBsZSBwcmltaXRpdmUgdHlwZXMgaGF2ZSB0byBiZSBza2lwcGVkKSB0aGUgc2FtZSBhcyBzY2FsYXIgdHlwZXMKKyAqIGluIGdlbmVyYXRlZCBjb2RlLgorICovCit2b2lkIHNraXAoUHJvdG9jb2wpKFByb3RvY29sIHByb3QsIFRUeXBlIHR5cGUpIGlmIChpcyhQcm90b2NvbCA6IFRQcm90b2NvbCkpIHsKKyAgZmluYWwgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUVHlwZS5CT09MOgorICAgICAgcHJvdC5yZWFkQm9vbCgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRUeXBlLkJZVEU6CisgICAgICBwcm90LnJlYWRCeXRlKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgcHJvdC5yZWFkSTE2KCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgcHJvdC5yZWFkSTMyKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFR5cGUuSTY0OgorICAgICAgcHJvdC5yZWFkSTY0KCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFR5cGUuRE9VQkxFOgorICAgICAgcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFR5cGUuU1RSSU5HOgorICAgICAgcHJvdC5yZWFkQmluYXJ5KCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFR5cGUuU1RSVUNUOgorICAgICAgcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGF1dG8gZiA9IHByb3QucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgaWYgKGYudHlwZSA9PSBUVHlwZS5TVE9QKSBicmVhazsKKyAgICAgICAgc2tpcChwcm90LCBmLnR5cGUpOworICAgICAgICBwcm90LnJlYWRGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgcHJvdC5yZWFkU3RydWN0RW5kKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFR5cGUuTElTVDoKKyAgICAgIGF1dG8gbCA9IHByb3QucmVhZExpc3RCZWdpbigpOworICAgICAgZm9yZWFjaCAoaTsgMCAuLiBsLnNpemUpIHsKKyAgICAgICAgc2tpcChwcm90LCBsLmVsZW1UeXBlKTsKKyAgICAgIH0KKyAgICAgIHByb3QucmVhZExpc3RFbmQoKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUVHlwZS5NQVA6CisgICAgICBhdXRvIG0gPSBwcm90LnJlYWRNYXBCZWdpbigpOworICAgICAgZm9yZWFjaCAoaTsgMCAuLiBtLnNpemUpIHsKKyAgICAgICAgc2tpcChwcm90LCBtLmtleVR5cGUpOworICAgICAgICBza2lwKHByb3QsIG0udmFsdWVUeXBlKTsKKyAgICAgIH0KKyAgICAgIHByb3QucmVhZE1hcEVuZCgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRUeXBlLlNFVDoKKyAgICAgIGF1dG8gcyA9IHByb3QucmVhZFNldEJlZ2luKCk7CisgICAgICBmb3JlYWNoIChpOyAwIC4uIHMuc2l6ZSkgeworICAgICAgICBza2lwKHByb3QsIHMuZWxlbVR5cGUpOworICAgICAgfQorICAgICAgcHJvdC5yZWFkU2V0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRUeXBlLlNUT1A6IGdvdG8gY2FzZTsKKyAgICBjYXNlIFRUeXBlLlZPSUQ6CisgICAgICBhc3NlcnQoZmFsc2UsICJJbnZhbGlkIGZpZWxkIHR5cGUgcGFzc2VkLiIpOworICB9Cit9CisKKy8qKgorICogQXBwbGljYXRpb24tbGV2ZWwgZXhjZXB0aW9uLgorICoKKyAqIEl0IGlzIHRocm93biBpZiBhbiBSUEMgY2FsbCB3ZW50IHdyb25nIG9uIHRoZSBhcHBsaWNhdGlvbiBsYXllciwgZS5nLiBpZgorICogdGhlIHJlY2VpdmVyIGRvZXMgbm90IGtub3cgdGhlIG1ldGhvZCBuYW1lIHJlcXVlc3RlZCBvciBhIG1ldGhvZCBpbnZva2VkIGJ5CisgKiB0aGUgc2VydmljZSBwcm9jZXNzb3IgdGhyb3dzIGFuIGV4Y2VwdGlvbiBub3QgcGFydCBvZiB0aGUgVGhyaWZ0IEFQSS4KKyAqLworY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIDogVEV4Y2VwdGlvbiB7CisgIC8vLyBUaGUgcG9zc2libGUgZXhjZXB0aW9uIHR5cGVzLgorICBlbnVtIFR5cGUgeworICAgIFVOS05PV04gPSAwLCAvLy8KKyAgICBVTktOT1dOX01FVEhPRCA9IDEsIC8vLworICAgIElOVkFMSURfTUVTU0FHRV9UWVBFID0gMiwgLy8vCisgICAgV1JPTkdfTUVUSE9EX05BTUUgPSAzLCAvLy8KKyAgICBCQURfU0VRVUVOQ0VfSUQgPSA0LCAvLy8KKyAgICBNSVNTSU5HX1JFU1VMVCA9IDUsIC8vLworICAgIElOVEVSTkFMX0VSUk9SID0gNiwgLy8vCisgICAgUFJPVE9DT0xfRVJST1IgPSA3LCAvLy8KKyAgICBJTlZBTElEX1RSQU5TRk9STSA9IDgsIC8vLworICAgIElOVkFMSURfUFJPVE9DT0wgPSA5LCAvLy8KKyAgICBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwIC8vLworICB9CisKKyAgLy8vCisgIHRoaXMoVHlwZSB0eXBlLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fLCBUaHJvd2FibGUgbmV4dCA9IG51bGwpIHsKKyAgICBzdGF0aWMgc3RyaW5nIG1zZ0ZvclR5cGUoVHlwZSB0eXBlKSB7CisgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBUeXBlLlVOS05PV046IHJldHVybiAiVW5rbm93biBhcHBsaWNhdGlvbiBleGNlcHRpb24iOworICAgICAgICBjYXNlIFR5cGUuVU5LTk9XTl9NRVRIT0Q6IHJldHVybiAiVW5rbm93biBtZXRob2QiOworICAgICAgICBjYXNlIFR5cGUuSU5WQUxJRF9NRVNTQUdFX1RZUEU6IHJldHVybiAiSW52YWxpZCBtZXNzYWdlIHR5cGUiOworICAgICAgICBjYXNlIFR5cGUuV1JPTkdfTUVUSE9EX05BTUU6IHJldHVybiAiV3JvbmcgbWV0aG9kIG5hbWUiOworICAgICAgICBjYXNlIFR5cGUuQkFEX1NFUVVFTkNFX0lEOiByZXR1cm4gIkJhZCBzZXF1ZW5jZSBpZGVudGlmaWVyIjsKKyAgICAgICAgY2FzZSBUeXBlLk1JU1NJTkdfUkVTVUxUOiByZXR1cm4gIk1pc3NpbmcgcmVzdWx0IjsKKyAgICAgICAgY2FzZSBUeXBlLklOVEVSTkFMX0VSUk9SOiByZXR1cm4gIkludGVybmFsIGVycm9yIjsKKyAgICAgICAgY2FzZSBUeXBlLlBST1RPQ09MX0VSUk9SOiByZXR1cm4gIlByb3RvY29sIGVycm9yIjsKKyAgICAgICAgY2FzZSBUeXBlLklOVkFMSURfVFJBTlNGT1JNOiByZXR1cm4gIkludmFsaWQgdHJhbnNmb3JtIjsKKyAgICAgICAgY2FzZSBUeXBlLklOVkFMSURfUFJPVE9DT0w6IHJldHVybiAiSW52YWxpZCBwcm90b2NvbCI7CisgICAgICAgIGNhc2UgVHlwZS5VTlNVUFBPUlRFRF9DTElFTlRfVFlQRTogcmV0dXJuICJVbnN1cHBvcnRlZCBjbGllbnQgdHlwZSI7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiAiKEludmFsaWQgZXhjZXB0aW9uIHR5cGUpIjsKKyAgICAgIH0KKyAgICB9CisgICAgdGhpcyhtc2dGb3JUeXBlKHR5cGUpLCB0eXBlLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgfQorCisgIC8vLworICB0aGlzKHN0cmluZyBtc2csIHN0cmluZyBmaWxlID0gX19GSUxFX18sIHNpemVfdCBsaW5lID0gX19MSU5FX18sCisgICAgVGhyb3dhYmxlIG5leHQgPSBudWxsKQorICB7CisgICAgdGhpcyhtc2csIFR5cGUuVU5LTk9XTiwgZmlsZSwgbGluZSwgbmV4dCk7CisgIH0KKworICAvLy8KKyAgdGhpcyhzdHJpbmcgbXNnLCBUeXBlIHR5cGUsIHN0cmluZyBmaWxlID0gX19GSUxFX18sIHNpemVfdCBsaW5lID0gX19MSU5FX18sCisgICAgVGhyb3dhYmxlIG5leHQgPSBudWxsKQorICB7CisgICAgc3VwZXIobXNnLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgICB0eXBlXyA9IHR5cGU7CisgIH0KKworICAvLy8KKyAgVHlwZSB0eXBlKCkgQHByb3BlcnR5IGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZV87CisgIH0KKworICAvLyBUT0RPOiBSZXBsYWNlIGhhbmQtd3JpdHRlbiByZWFkKCkvd3JpdGUoKSB3aXRoIHRocmlmdC5jb2RlZ2VuIHRlbXBsYXRlcy4KKworICAvLy8KKyAgdm9pZCByZWFkKFRQcm90b2NvbCBpcHJvdCkgeworICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBhdXRvIGYgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgaWYgKGYudHlwZSA9PSBUVHlwZS5TVE9QKSBicmVhazsKKworICAgICAgc3dpdGNoIChmLmlkKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICBpZiAoZi50eXBlID09IFRUeXBlLlNUUklORykgeworICAgICAgICAgICAgbXNnID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBza2lwKGlwcm90LCBmLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIGlmIChmLnR5cGUgPT0gVFR5cGUuSTMyKSB7CisgICAgICAgICAgICB0eXBlXyA9IGNhc3QoVHlwZSlpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNraXAoaXByb3QsIGYudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHNraXAoaXByb3QsIGYudHlwZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgfQorCisgIC8vLworICB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgY29uc3QgeworICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCgiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikpOworCisgICAgaWYgKG1zZyAhPSBudWxsKSB7CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oVEZpZWxkKCJtZXNzYWdlIiwgVFR5cGUuU1RSSU5HLCAxKSk7CisgICAgICBvcHJvdC53cml0ZVN0cmluZyhtc2cpOworICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgIH0KKworICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihURmllbGQoInR5cGUiLCBUVHlwZS5JMzIsIDIpKTsKKyAgICBvcHJvdC53cml0ZUkzMih0eXBlXyk7CisgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworCisgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpOworICB9CisKK3ByaXZhdGU6CisgIFR5cGUgdHlwZV87Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeS5kIGIvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9iaW5hcnkuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2Q4ZmU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9iaW5hcnkuZApAQCAtMCwwICsxLDQxNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CisKK2ltcG9ydCBzdGQuYXJyYXkgOiB1bmluaXRpYWxpemVkQXJyYXk7CitpbXBvcnQgc3RkLnR5cGV0dXBsZSA6IGFsbFNhdGlzZnksIFR5cGVUdXBsZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmVuZGlhbjsKKworLyoqCisgKiBUUHJvdG9jb2wgaW1wbGVtZW50YXRpb24gb2YgdGhlIEJpbmFyeSBUaHJpZnQgcHJvdG9jb2wuCisgKi8KK2ZpbmFsIGNsYXNzIFRCaW5hcnlQcm90b2NvbChUcmFuc3BvcnQgPSBUVHJhbnNwb3J0KSBpZiAoCisgIGlzVFRyYW5zcG9ydCFUcmFuc3BvcnQKKykgOiBUUHJvdG9jb2wgeworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgdHJhbnMgPSBUaGUgdHJhbnNwb3J0IHRvIHVzZS4KKyAgICogICBjb250YWluZXJTaXplTGltaXQgPSBJZiBwb3NpdGl2ZSwgdGhlIGNvbnRhaW5lciBzaXplIGlzIGxpbWl0ZWQgdG8gdGhlCisgICAqICAgICBnaXZlbiBudW1iZXIgb2YgaXRlbXMuCisgICAqICAgc3RyaW5nU2l6ZUxpbWl0ID0gSWYgcG9zaXRpdmUsIHRoZSBzdHJpbmcgbGVuZ3RoIGlzIGxpbWl0ZWQgdG8gdGhlCisgICAqICAgICBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuCisgICAqICAgc3RyaWN0UmVhZCA9IElmIGZhbHNlLCBvbGQgcGVlcnMgd2hpY2ggZG8gbm90IGluY2x1ZGUgdGhlIHByb3RvY29sCisgICAqICAgICB2ZXJzaW9uIGFyZSB0b2xlcmF0ZWQuCisgICAqICAgc3RyaWN0V3JpdGUgPSBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHByb3RvY29sIHZlcnNpb24gaW4gdGhlIGhlYWRlci4KKyAgICovCisgIHRoaXMoVHJhbnNwb3J0IHRyYW5zLCBpbnQgY29udGFpbmVyU2l6ZUxpbWl0ID0gMCwgaW50IHN0cmluZ1NpemVMaW1pdCA9IDAsCisgICAgYm9vbCBzdHJpY3RSZWFkID0gZmFsc2UsIGJvb2wgc3RyaWN0V3JpdGUgPSB0cnVlCisgICkgeworICAgIHRyYW5zXyA9IHRyYW5zOworICAgIHRoaXMuY29udGFpbmVyU2l6ZUxpbWl0ID0gY29udGFpbmVyU2l6ZUxpbWl0OworICAgIHRoaXMuc3RyaW5nU2l6ZUxpbWl0ID0gc3RyaW5nU2l6ZUxpbWl0OworICAgIHRoaXMuc3RyaWN0UmVhZCA9IHN0cmljdFJlYWQ7CisgICAgdGhpcy5zdHJpY3RXcml0ZSA9IHN0cmljdFdyaXRlOworICB9CisKKyAgVHJhbnNwb3J0IHRyYW5zcG9ydCgpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHRyYW5zXzsKKyAgfQorCisgIHZvaWQgcmVzZXQoKSB7fQorCisgIC8qKgorICAgKiBJZiBmYWxzZSwgb2xkIHBlZXJzIHdoaWNoIGRvIG5vdCBpbmNsdWRlIHRoZSBwcm90b2NvbCB2ZXJzaW9uIGluIHRoZQorICAgKiBtZXNzYWdlIGhlYWRlciBhcmUgdG9sZXJhdGVkLgorICAgKgorICAgKiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICovCisgIGJvb2wgc3RyaWN0UmVhZDsKKworICAvKioKKyAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBwcm90b2NvbCB2ZXJzaW9uIGluIHRoZSBtZXNzYWdlIGhlYWRlciAob2xkZXIKKyAgICogdmVyc2lvbnMgZGlkbid0KS4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICovCisgIGJvb2wgc3RyaWN0V3JpdGU7CisKKyAgLyoqCisgICAqIElmIHBvc2l0aXZlLCBsaW1pdHMgdGhlIG51bWJlciBvZiBpdGVtcyBvZiBkZXNlcmlhbGl6ZWQgY29udGFpbmVycyB0byB0aGUKKyAgICogZ2l2ZW4gYW1vdW50LgorICAgKgorICAgKiBUaGlzIGlzIHVzZWZ1bCB0byBhdm9pZCBhbGxvY2F0aW5nIGV4Y2Vzc2l2ZSBhbW91bnRzIG9mIG1lbW9yeSB3aGVuIGJyb2tlbgorICAgKiBkYXRhIGlzIHJlY2VpdmVkLiBJZiB0aGUgbGltaXQgaXMgZXhjZWVkZWQsIGEgU0laRV9MSU1JVC10eXBlCisgICAqIFRQcm90b2NvbEV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqCisgICAqIERlZmF1bHRzIHRvIHplcm8gKG5vIGxpbWl0KS4KKyAgICovCisgIGludCBjb250YWluZXJTaXplTGltaXQ7CisKKyAgLyoqCisgICAqIElmIHBvc2l0aXZlLCBsaW1pdHMgdGhlIGxlbmd0aCBvZiBkZXNlcmlhbGl6ZWQgc3RyaW5ncy9iaW5hcnkgZGF0YSB0byB0aGUKKyAgICogZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLgorICAgKgorICAgKiBUaGlzIGlzIHVzZWZ1bCB0byBhdm9pZCBhbGxvY2F0aW5nIGV4Y2Vzc2l2ZSBhbW91bnRzIG9mIG1lbW9yeSB3aGVuIGJyb2tlbgorICAgKiBkYXRhIGlzIHJlY2VpdmVkLiBJZiB0aGUgbGltaXQgaXMgZXhjZWVkZWQsIGEgU0laRV9MSU1JVC10eXBlCisgICAqIFRQcm90b2NvbEV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqCisgICAqIERlZmF1bHRzIHRvIHplcm8gKG5vIGxpbWl0KS4KKyAgICovCisgIGludCBzdHJpbmdTaXplTGltaXQ7CisKKyAgLyoKKyAgICogV3JpdGluZyBtZXRob2RzLgorICAgKi8KKworICB2b2lkIHdyaXRlQm9vbChib29sIGIpIHsKKyAgICB3cml0ZUJ5dGUoYiA/IDEgOiAwKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCeXRlKGJ5dGUgYikgeworICAgIHRyYW5zXy53cml0ZSgoY2FzdCh1Ynl0ZSopJmIpWzAgLi4gMV0pOworICB9CisKKyAgdm9pZCB3cml0ZUkxNihzaG9ydCBpMTYpIHsKKyAgICBzaG9ydCBuZXQgPSBob3N0VG9OZXQoaTE2KTsKKyAgICB0cmFuc18ud3JpdGUoKGNhc3QodWJ5dGUqKSZuZXQpWzAgLi4gMl0pOworICB9CisKKyAgdm9pZCB3cml0ZUkzMihpbnQgaTMyKSB7CisgICAgaW50IG5ldCA9IGhvc3RUb05ldChpMzIpOworICAgIHRyYW5zXy53cml0ZSgoY2FzdCh1Ynl0ZSopJm5ldClbMCAuLiA0XSk7CisgIH0KKworICB2b2lkIHdyaXRlSTY0KGxvbmcgaTY0KSB7CisgICAgbG9uZyBuZXQgPSBob3N0VG9OZXQoaTY0KTsKKyAgICB0cmFuc18ud3JpdGUoKGNhc3QodWJ5dGUqKSZuZXQpWzAgLi4gOF0pOworICB9CisKKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB7CisgICAgc3RhdGljIGFzc2VydChkb3VibGUuc2l6ZW9mID09IHVsb25nLnNpemVvZik7CisgICAgYXV0byBiaXRzID0gaG9zdFRvTmV0KCpjYXN0KHVsb25nKikoJmR1YikpOworICAgIHRyYW5zXy53cml0ZSgoY2FzdCh1Ynl0ZSopJmJpdHMpWzAgLi4gOF0pOworICB9CisKKyAgdm9pZCB3cml0ZVN0cmluZyhzdHJpbmcgc3RyKSB7CisgICAgd3JpdGVCaW5hcnkoY2FzdCh1Ynl0ZVtdKXN0cik7CisgIH0KKworICB2b2lkIHdyaXRlQmluYXJ5KHVieXRlW10gYnVmKSB7CisgICAgYXNzZXJ0KGJ1Zi5sZW5ndGggPD0gaW50Lm1heCk7CisgICAgd3JpdGVJMzIoY2FzdChpbnQpYnVmLmxlbmd0aCk7CisgICAgdHJhbnNfLndyaXRlKGJ1Zik7CisgIH0KKworICB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICBpZiAoc3RyaWN0V3JpdGUpIHsKKyAgICAgIGludCB2ZXJzbiA9IFZFUlNJT05fMSB8IG1lc3NhZ2UudHlwZTsKKyAgICAgIHdyaXRlSTMyKHZlcnNuKTsKKyAgICAgIHdyaXRlU3RyaW5nKG1lc3NhZ2UubmFtZSk7CisgICAgICB3cml0ZUkzMihtZXNzYWdlLnNlcWlkKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVTdHJpbmcobWVzc2FnZS5uYW1lKTsKKyAgICAgIHdyaXRlQnl0ZShtZXNzYWdlLnR5cGUpOworICAgICAgd3JpdGVJMzIobWVzc2FnZS5zZXFpZCk7CisgICAgfQorICB9CisgIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkge30KKworICB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCB0c3RydWN0KSB7fQorICB2b2lkIHdyaXRlU3RydWN0RW5kKCkge30KKworICB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHsKKyAgICB3cml0ZUJ5dGUoZmllbGQudHlwZSk7CisgICAgd3JpdGVJMTYoZmllbGQuaWQpOworICB9CisgIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHsKKyAgICB3cml0ZUJ5dGUoVFR5cGUuU1RPUCk7CisgIH0KKworICB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpIHsKKyAgICBhc3NlcnQobGlzdC5zaXplIDw9IGludC5tYXgpOworICAgIHdyaXRlQnl0ZShsaXN0LmVsZW1UeXBlKTsKKyAgICB3cml0ZUkzMihjYXN0KGludClsaXN0LnNpemUpOworICB9CisgIHZvaWQgd3JpdGVMaXN0RW5kKCkge30KKworICB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHsKKyAgICBhc3NlcnQobWFwLnNpemUgPD0gaW50Lm1heCk7CisgICAgd3JpdGVCeXRlKG1hcC5rZXlUeXBlKTsKKyAgICB3cml0ZUJ5dGUobWFwLnZhbHVlVHlwZSk7CisgICAgd3JpdGVJMzIoY2FzdChpbnQpbWFwLnNpemUpOworICB9CisgIHZvaWQgd3JpdGVNYXBFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCkgeworICAgIGFzc2VydChzZXQuc2l6ZSA8PSBpbnQubWF4KTsKKyAgICB3cml0ZUJ5dGUoc2V0LmVsZW1UeXBlKTsKKyAgICB3cml0ZUkzMihjYXN0KGludClzZXQuc2l6ZSk7CisgIH0KKyAgdm9pZCB3cml0ZVNldEVuZCgpIHt9CisKKworICAvKgorICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAqLworCisgIGJvb2wgcmVhZEJvb2woKSB7CisgICAgcmV0dXJuIHJlYWRCeXRlKCkgIT0gMDsKKyAgfQorCisgIGJ5dGUgcmVhZEJ5dGUoKSB7CisgICAgdWJ5dGVbMV0gYiA9IHZvaWQ7CisgICAgdHJhbnNfLnJlYWRBbGwoYik7CisgICAgcmV0dXJuIGNhc3QoYnl0ZSliWzBdOworICB9CisKKyAgc2hvcnQgcmVhZEkxNigpIHsKKyAgICBJbnRCdWYhc2hvcnQgYiA9IHZvaWQ7CisgICAgdHJhbnNfLnJlYWRBbGwoYi5ieXRlcyk7CisgICAgcmV0dXJuIG5ldFRvSG9zdChiLnZhbHVlKTsKKyAgfQorCisgIGludCByZWFkSTMyKCkgeworICAgIEludEJ1ZiFpbnQgYiA9IHZvaWQ7CisgICAgdHJhbnNfLnJlYWRBbGwoYi5ieXRlcyk7CisgICAgcmV0dXJuIG5ldFRvSG9zdChiLnZhbHVlKTsKKyAgfQorCisgIGxvbmcgcmVhZEk2NCgpIHsKKyAgICBJbnRCdWYhbG9uZyBiID0gdm9pZDsKKyAgICB0cmFuc18ucmVhZEFsbChiLmJ5dGVzKTsKKyAgICByZXR1cm4gbmV0VG9Ib3N0KGIudmFsdWUpOworICB9CisKKyAgZG91YmxlIHJlYWREb3VibGUoKSB7CisgICAgSW50QnVmIWxvbmcgYiA9IHZvaWQ7CisgICAgdHJhbnNfLnJlYWRBbGwoYi5ieXRlcyk7CisgICAgYi52YWx1ZSA9IG5ldFRvSG9zdChiLnZhbHVlKTsKKyAgICByZXR1cm4gKmNhc3QoZG91YmxlKikoJmIudmFsdWUpOworICB9CisKKyAgc3RyaW5nIHJlYWRTdHJpbmcoKSB7CisgICAgcmV0dXJuIGNhc3Qoc3RyaW5nKXJlYWRCaW5hcnkoKTsKKyAgfQorCisgIHVieXRlW10gcmVhZEJpbmFyeSgpIHsKKyAgICByZXR1cm4gcmVhZEJpbmFyeUJvZHkocmVhZFNpemUoc3RyaW5nU2l6ZUxpbWl0KSk7CisgIH0KKworICBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgeworICAgIFRNZXNzYWdlIG1zZyA9IHZvaWQ7CisKKyAgICBpbnQgc2l6ZSA9IHJlYWRJMzIoKTsKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgIGludCB2ZXJzbiA9IHNpemUgJiBWRVJTSU9OX01BU0s7CisgICAgICBpZiAodmVyc24gIT0gVkVSU0lPTl8xKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkJhZCBwcm90b2NvbCB2ZXJzaW9uLiIsCisgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuQkFEX1ZFUlNJT04pOworICAgICAgfQorCisgICAgICBtc2cudHlwZSA9IGNhc3QoVE1lc3NhZ2VUeXBlKShzaXplICYgTUVTU0FHRV9UWVBFX01BU0spOworICAgICAgbXNnLm5hbWUgPSByZWFkU3RyaW5nKCk7CisgICAgICBtc2cuc2VxaWQgPSByZWFkSTMyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChzdHJpY3RSZWFkKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgIlByb3RvY29sIHZlcnNpb24gbWlzc2luZywgb2xkIGNsaWVudD8iLAorICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLkJBRF9WRVJTSU9OKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuTkVHQVRJVkVfU0laRSk7CisgICAgICAgIH0KKyAgICAgICAgbXNnLm5hbWUgPSBjYXN0KHN0cmluZylyZWFkQmluYXJ5Qm9keShzaXplKTsKKyAgICAgICAgbXNnLnR5cGUgPSBjYXN0KFRNZXNzYWdlVHlwZSkocmVhZEJ5dGUoKSk7CisgICAgICAgIG1zZy5zZXFpZCA9IHJlYWRJMzIoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbXNnOworICB9CisgIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB7fQorCisgIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgeworICAgIHJldHVybiBUU3RydWN0KCk7CisgIH0KKyAgdm9pZCByZWFkU3RydWN0RW5kKCkge30KKworICBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSB7CisgICAgVEZpZWxkIGYgPSB2b2lkOworICAgIGYubmFtZSA9IG51bGw7CisgICAgZi50eXBlID0gY2FzdChUVHlwZSlyZWFkQnl0ZSgpOworICAgIGlmIChmLnR5cGUgPT0gVFR5cGUuU1RPUCkgcmV0dXJuIGY7CisgICAgZi5pZCA9IHJlYWRJMTYoKTsKKyAgICByZXR1cm4gZjsKKyAgfQorICB2b2lkIHJlYWRGaWVsZEVuZCgpIHt9CisKKyAgVExpc3QgcmVhZExpc3RCZWdpbigpIHsKKyAgICByZXR1cm4gVExpc3QoY2FzdChUVHlwZSlyZWFkQnl0ZSgpLCByZWFkU2l6ZShjb250YWluZXJTaXplTGltaXQpKTsKKyAgfQorICB2b2lkIHJlYWRMaXN0RW5kKCkge30KKworICBUTWFwIHJlYWRNYXBCZWdpbigpIHsKKyAgICByZXR1cm4gVE1hcChjYXN0KFRUeXBlKXJlYWRCeXRlKCksIGNhc3QoVFR5cGUpcmVhZEJ5dGUoKSwKKyAgICAgIHJlYWRTaXplKGNvbnRhaW5lclNpemVMaW1pdCkpOworICB9CisgIHZvaWQgcmVhZE1hcEVuZCgpIHt9CisKKyAgVFNldCByZWFkU2V0QmVnaW4oKSB7CisgICAgcmV0dXJuIFRTZXQoY2FzdChUVHlwZSlyZWFkQnl0ZSgpLCByZWFkU2l6ZShjb250YWluZXJTaXplTGltaXQpKTsKKyAgfQorICB2b2lkIHJlYWRTZXRFbmQoKSB7fQorCitwcml2YXRlOgorICB1Ynl0ZVtdIHJlYWRCaW5hcnlCb2R5KGludCBzaXplKSB7CisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgYXV0byBidWYgPSB1bmluaXRpYWxpemVkQXJyYXkhKHVieXRlW10pKHNpemUpOworICAgIHRyYW5zXy5yZWFkQWxsKGJ1Zik7CisgICAgcmV0dXJuIGJ1ZjsKKyAgfQorCisgIGludCByZWFkU2l6ZShpbnQgbGltaXQpIHsKKyAgICBhdXRvIHNpemUgPSByZWFkSTMyKCk7CisgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLk5FR0FUSVZFX1NJWkUpOworICAgIH0gZWxzZSBpZiAobGltaXQgPiAwICYmIHNpemUgPiBsaW1pdCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5TSVpFX0xJTUlUKTsKKyAgICB9CisgICAgcmV0dXJuIHNpemU7CisgIH0KKworICBlbnVtIE1FU1NBR0VfVFlQRV9NQVNLID0gMHgwMDAwMDBmZjsKKyAgZW51bSBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwOworICBlbnVtIFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7CisKKyAgVHJhbnNwb3J0IHRyYW5zXzsKK30KKworLyoqCisgKiBUQmluYXJ5UHJvdG9jb2wgY29uc3RydWN0aW9uIGhlbHBlciB0byBhdm9pZCBoYXZpbmcgdG8gZXhwbGljaXRseSBzcGVjaWZ5CisgKiB0aGUgdHJhbnNwb3J0IHR5cGUsIGkuZS4gdG8gYWxsb3cgdGhlIGNvbnN0cnVjdG9yIGJlaW5nIGNhbGxlZCB1c2luZyBJRlRJCisgKiAoc2VlICQoTElOSzIgaHR0cDovL2QucHVyZW1hZ2ljLmNvbS9pc3N1ZXMvc2hvd19idWcuY2dpP2lkPTYwODIsIEQgQnVnemlsbGEKKyAqIGVuaGFuY2VtZW50IHJlcXVldCA2MDgyKSkuCisgKi8KK1RCaW5hcnlQcm90b2NvbCFUcmFuc3BvcnQgdEJpbmFyeVByb3RvY29sKFRyYW5zcG9ydCkoVHJhbnNwb3J0IHRyYW5zLAorICBpbnQgY29udGFpbmVyU2l6ZUxpbWl0ID0gMCwgaW50IHN0cmluZ1NpemVMaW1pdCA9IDAsCisgIGJvb2wgc3RyaWN0UmVhZCA9IGZhbHNlLCBib29sIHN0cmljdFdyaXRlID0gdHJ1ZQorKSBpZiAoaXNUVHJhbnNwb3J0IVRyYW5zcG9ydCkgeworICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCFUcmFuc3BvcnQodHJhbnMsIGNvbnRhaW5lclNpemVMaW1pdCwKKyAgICBzdHJpbmdTaXplTGltaXQsIHN0cmljdFJlYWQsIHN0cmljdFdyaXRlKTsKK30KKwordW5pdHRlc3QgeworICBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKKyAgaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworCisgIC8vIENoZWNrIHRoZSBtZXNzYWdlIGhlYWRlciBmb3JtYXQuCisgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIGF1dG8gYmluYXJ5ID0gdEJpbmFyeVByb3RvY29sKGJ1Zik7CisgIGJpbmFyeS53cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSgiZm9vIiwgVE1lc3NhZ2VUeXBlLkNBTEwsIDApKTsKKworICBhdXRvIGhlYWRlciA9IG5ldyB1Ynl0ZVsxNV07CisgIGJ1Zi5yZWFkQWxsKGhlYWRlcik7CisgIGVuZm9yY2UoaGVhZGVyID09IFsKKyAgICAxMjgsIDEsIDAsIDEsIC8vIFZlcnNpb24gMSwgVE1lc3NhZ2VUeXBlLkNBTEwKKyAgICAwLCAwLCAwLCAzLCAvLyBNZXRob2QgbmFtZSBsZW5ndGgKKyAgICAxMDIsIDExMSwgMTExLCAvLyBNZXRob2QgbmFtZSAoImZvbyIpCisgICAgMCwgMCwgMCwgMCwgLy8gU2VxdWVuY2UgaWQKKyAgXSk7Cit9CisKK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHRocmlmdC5pbnRlcm5hbC50ZXN0LnByb3RvY29sOworICB0ZXN0Q29udGFpbmVyU2l6ZUxpbWl0IShUQmluYXJ5UHJvdG9jb2whKCkpKCk7CisgIHRlc3RTdHJpbmdTaXplTGltaXQhKFRCaW5hcnlQcm90b2NvbCEoKSkoKTsKK30KKworLyoqCisgKiBUUHJvdG9jb2xGYWN0b3J5IGNyZWF0aW5nIGEgVEJpbmFyeVByb3RvY29sIGluc3RhbmNlIGZvciBwYXNzZWQgaW4KKyAqIHRyYW5zcG9ydHMuCisgKgorICogVGhlIG9wdGlvbmFsIFRyYW5zcG9ydHMgdGVtcGxhdGUgdHVwbGUgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkKKyAqIG9uZSBvciBtb3JlIFRUcmFuc3BvcnQgaW1wbGVtZW50YXRpb25zIHRvIHNwZWNpZmljYWxseSBpbnN0YW50aWF0ZQorICogVEJpbmFyeVByb3RvY29sIGZvci4gSWYgdGhlIGFjdHVhbCB0cmFuc3BvcnQgdHlwZXMgZW5jb3VudGVyZWQgYXQKKyAqIHJ1bnRpbWUgbWF0Y2ggb25lIG9mIHRoZSB0cmFuc3BvcnRzIGluIHRoZSBsaXN0LCBhIHNwZWNpYWxpemVkIHByb3RvY29sCisgKiBpbnN0YW5jZSBpcyBjcmVhdGVkLiBPdGhlcndpc2UsIGEgZ2VuZXJpYyBUVHJhbnNwb3J0IHZlcnNpb24gaXMgdXNlZC4KKyAqLworY2xhc3MgVEJpbmFyeVByb3RvY29sRmFjdG9yeShUcmFuc3BvcnRzLi4uKSBpZiAoCisgIGFsbFNhdGlzZnkhKGlzVFRyYW5zcG9ydCwgVHJhbnNwb3J0cykKKykgOiBUUHJvdG9jb2xGYWN0b3J5IHsKKyAgLy8vCisgIHRoaXMgKGludCBjb250YWluZXJTaXplTGltaXQgPSAwLCBpbnQgc3RyaW5nU2l6ZUxpbWl0ID0gMCwKKyAgICBib29sIHN0cmljdFJlYWQgPSBmYWxzZSwgYm9vbCBzdHJpY3RXcml0ZSA9IHRydWUKKyAgKSB7CisgICAgc3RyaWN0UmVhZF8gPSBzdHJpY3RSZWFkOworICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOworICAgIGNvbnRhaW5lclNpemVMaW1pdF8gPSBjb250YWluZXJTaXplTGltaXQ7CisgICAgc3RyaW5nU2l6ZUxpbWl0XyA9IHN0cmluZ1NpemVMaW1pdDsKKyAgfQorCisgIFRQcm90b2NvbCBnZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKSBjb25zdCB7CisgICAgZm9yZWFjaCAoVHJhbnNwb3J0OyBUeXBlVHVwbGUhKFRyYW5zcG9ydHMsIFRUcmFuc3BvcnQpKSB7CisgICAgICBhdXRvIGNvbmNyZXRlVHJhbnMgPSBjYXN0KFRyYW5zcG9ydCl0cmFuczsKKyAgICAgIGlmIChjb25jcmV0ZVRyYW5zKSB7CisgICAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sIVRyYW5zcG9ydChjb25jcmV0ZVRyYW5zLAorICAgICAgICAgIGNvbnRhaW5lclNpemVMaW1pdF8sIHN0cmluZ1NpemVMaW1pdF8sIHN0cmljdFJlYWRfLCBzdHJpY3RXcml0ZV8pOworICAgICAgfQorICAgIH0KKyAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgIlBhc3NlZCBudWxsIHRyYW5zcG9ydCB0byBUQmluYXJ5UHJvdG9jb2xGYWN0b3kuIik7CisgIH0KKworcHJvdGVjdGVkOgorICBib29sIHN0cmljdFJlYWRfOworICBib29sIHN0cmljdFdyaXRlXzsKKyAgaW50IGNvbnRhaW5lclNpemVMaW1pdF87CisgIGludCBzdHJpbmdTaXplTGltaXRfOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9jb21wYWN0LmQgYi9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2NvbXBhY3QuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTU1YzgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9jb21wYWN0LmQKQEAgLTAsMCArMSw2OTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQucHJvdG9jb2wuY29tcGFjdDsKKworaW1wb3J0IHN0ZC5hcnJheSA6IHVuaW5pdGlhbGl6ZWRBcnJheTsKK2ltcG9ydCBzdGQudHlwZXR1cGxlIDogYWxsU2F0aXNmeSwgVHlwZVR1cGxlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuZW5kaWFuOworCisvKioKKyAqIEQgaW1wbGVtZW50YXRpb24gb2YgdGhlIENvbXBhY3QgcHJvdG9jb2wuCisgKgorICogU2VlIFRIUklGVC0xMTAgZm9yIGEgcHJvdG9jb2wgZGVzY3JpcHRpb24uIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24KKyAqIHRoZSBDKysgb25lLgorICovCitmaW5hbCBjbGFzcyBUQ29tcGFjdFByb3RvY29sKFRyYW5zcG9ydCA9IFRUcmFuc3BvcnQpIGlmICgKKyAgaXNUVHJhbnNwb3J0IVRyYW5zcG9ydAorKSA6IFRQcm90b2NvbCB7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgdHJhbnMgPSBUaGUgdHJhbnNwb3J0IHRvIHVzZS4KKyAgICogICBjb250YWluZXJTaXplTGltaXQgPSBJZiBwb3NpdGl2ZSwgdGhlIGNvbnRhaW5lciBzaXplIGlzIGxpbWl0ZWQgdG8gdGhlCisgICAqICAgICBnaXZlbiBudW1iZXIgb2YgaXRlbXMuCisgICAqICAgc3RyaW5nU2l6ZUxpbWl0ID0gSWYgcG9zaXRpdmUsIHRoZSBzdHJpbmcgbGVuZ3RoIGlzIGxpbWl0ZWQgdG8gdGhlCisgICAqICAgICBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuCisgICAqLworICB0aGlzKFRyYW5zcG9ydCB0cmFucywgaW50IGNvbnRhaW5lclNpemVMaW1pdCA9IDAsIGludCBzdHJpbmdTaXplTGltaXQgPSAwKSB7CisgICAgdHJhbnNfID0gdHJhbnM7CisgICAgdGhpcy5jb250YWluZXJTaXplTGltaXQgPSBjb250YWluZXJTaXplTGltaXQ7CisgICAgdGhpcy5zdHJpbmdTaXplTGltaXQgPSBzdHJpbmdTaXplTGltaXQ7CisgIH0KKworICBUcmFuc3BvcnQgdHJhbnNwb3J0KCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gdHJhbnNfOworICB9CisKKyAgdm9pZCByZXNldCgpIHsKKyAgICBsYXN0RmllbGRJZF8gPSAwOworICAgIGZpZWxkSWRTdGFja18gPSBudWxsOworICAgIGJvb2xlYW5GaWVsZF8gPSBURmllbGQuaW5pdDsKKyAgICBoYXNCb29sVmFsdWVfID0gZmFsc2U7CisgIH0KKworICAvKioKKyAgICogSWYgcG9zaXRpdmUsIGxpbWl0cyB0aGUgbnVtYmVyIG9mIGl0ZW1zIG9mIGRlc2VyaWFsaXplZCBjb250YWluZXJzIHRvIHRoZQorICAgKiBnaXZlbiBhbW91bnQuCisgICAqCisgICAqIFRoaXMgaXMgdXNlZnVsIHRvIGF2b2lkIGFsbG9jYXRpbmcgZXhjZXNzaXZlIGFtb3VudHMgb2YgbWVtb3J5IHdoZW4gYnJva2VuCisgICAqIGRhdGEgaXMgcmVjZWl2ZWQuIElmIHRoZSBsaW1pdCBpcyBleGNlZWRlZCwgYSBTSVpFX0xJTUlULXR5cGUKKyAgICogVFByb3RvY29sRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gemVybyAobm8gbGltaXQpLgorICAgKi8KKyAgaW50IGNvbnRhaW5lclNpemVMaW1pdDsKKworICAvKioKKyAgICogSWYgcG9zaXRpdmUsIGxpbWl0cyB0aGUgbGVuZ3RoIG9mIGRlc2VyaWFsaXplZCBzdHJpbmdzL2JpbmFyeSBkYXRhIHRvIHRoZQorICAgKiBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuCisgICAqCisgICAqIFRoaXMgaXMgdXNlZnVsIHRvIGF2b2lkIGFsbG9jYXRpbmcgZXhjZXNzaXZlIGFtb3VudHMgb2YgbWVtb3J5IHdoZW4gYnJva2VuCisgICAqIGRhdGEgaXMgcmVjZWl2ZWQuIElmIHRoZSBsaW1pdCBpcyBleGNlZWRlZCwgYSBTSVpFX0xJTUlULXR5cGUKKyAgICogVFByb3RvY29sRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gemVybyAobm8gbGltaXQpLgorICAgKi8KKyAgaW50IHN0cmluZ1NpemVMaW1pdDsKKworICAvKgorICAgKiBXcml0aW5nIG1ldGhvZHMuCisgICAqLworCisgIHZvaWQgd3JpdGVCb29sKGJvb2wgYikgeworICAgIGlmIChib29sZWFuRmllbGRfLm5hbWUgIWlzIG51bGwpIHsKKyAgICAgIC8vIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZmllbGQgaGVhZGVyIHlldAorICAgICAgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoYm9vbGVhbkZpZWxkXywKKyAgICAgICAgYiA/IENUeXBlLkJPT0xFQU5fVFJVRSA6IENUeXBlLkJPT0xFQU5fRkFMU0UpOworICAgICAgYm9vbGVhbkZpZWxkXy5uYW1lID0gbnVsbDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCB3cml0ZSB0aGUgdmFsdWUKKyAgICAgIHdyaXRlQnl0ZShiID8gQ1R5cGUuQk9PTEVBTl9UUlVFIDogQ1R5cGUuQk9PTEVBTl9GQUxTRSk7CisgICAgfQorICB9CisKKyAgdm9pZCB3cml0ZUJ5dGUoYnl0ZSBiKSB7CisgICAgdHJhbnNfLndyaXRlKChjYXN0KHVieXRlKikmYilbMC4uMV0pOworICB9CisKKyAgdm9pZCB3cml0ZUkxNihzaG9ydCBpMTYpIHsKKyAgICB3cml0ZVZhcmludDMyKGkzMlRvWmlnemFnKGkxNikpOworICB9CisKKyAgdm9pZCB3cml0ZUkzMihpbnQgaTMyKSB7CisgICAgd3JpdGVWYXJpbnQzMihpMzJUb1ppZ3phZyhpMzIpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJNjQobG9uZyBpNjQpIHsKKyAgICB3cml0ZVZhcmludDY0KGk2NFRvWmlnemFnKGk2NCkpOworICB9CisKKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB7CisgICAgdWxvbmcgYml0cyA9IGhvc3RUb0xlKCpjYXN0KHVsb25nKikoJmR1YikpOworICAgIHRyYW5zXy53cml0ZSgoY2FzdCh1Ynl0ZSopJmJpdHMpWzAgLi4gOF0pOworICB9CisKKyAgdm9pZCB3cml0ZVN0cmluZyhzdHJpbmcgc3RyKSB7CisgICAgd3JpdGVCaW5hcnkoY2FzdCh1Ynl0ZVtdKXN0cik7CisgIH0KKworICB2b2lkIHdyaXRlQmluYXJ5KHVieXRlW10gYnVmKSB7CisgICAgYXNzZXJ0KGJ1Zi5sZW5ndGggPD0gaW50Lm1heCk7CisgICAgd3JpdGVWYXJpbnQzMihjYXN0KGludClidWYubGVuZ3RoKTsKKyAgICB0cmFuc18ud3JpdGUoYnVmKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbXNnKSB7CisgICAgd3JpdGVCeXRlKGNhc3QoYnl0ZSlQUk9UT0NPTF9JRCk7CisgICAgd3JpdGVCeXRlKGNhc3QoYnl0ZSkoKFZFUlNJT05fTiAmIFZFUlNJT05fTUFTSykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICgoY2FzdChpbnQpbXNnLnR5cGUgPDwgVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9NQVNLKSkpOworICAgIHdyaXRlVmFyaW50MzIobXNnLnNlcWlkKTsKKyAgICB3cml0ZVN0cmluZyhtc2cubmFtZSk7CisgIH0KKyAgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHRzdHJ1Y3QpIHsKKyAgICBmaWVsZElkU3RhY2tfIH49IGxhc3RGaWVsZElkXzsKKyAgICBsYXN0RmllbGRJZF8gPSAwOworICB9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHsKKyAgICBsYXN0RmllbGRJZF8gPSBmaWVsZElkU3RhY2tfWyQgLSAxXTsKKyAgICBmaWVsZElkU3RhY2tfID0gZmllbGRJZFN0YWNrX1swIC4uICQgLSAxXTsKKyAgICBmaWVsZElkU3RhY2tfLmFzc3VtZVNhZmVBcHBlbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkgeworICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkJPT0wpIHsKKyAgICAgIGJvb2xlYW5GaWVsZF8ubmFtZSA9IGZpZWxkLm5hbWU7CisgICAgICBib29sZWFuRmllbGRfLnR5cGUgPSBmaWVsZC50eXBlOworICAgICAgYm9vbGVhbkZpZWxkXy5pZCA9IGZpZWxkLmlkOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoZmllbGQpOworICAgIH0KKyAgfQorICB2b2lkIHdyaXRlRmllbGRFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7CisgICAgd3JpdGVCeXRlKFRUeXBlLlNUT1ApOworICB9CisKKyAgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB7CisgICAgd3JpdGVDb2xsZWN0aW9uQmVnaW4obGlzdC5lbGVtVHlwZSwgbGlzdC5zaXplKTsKKyAgfQorICB2b2lkIHdyaXRlTGlzdEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKSB7CisgICAgaWYgKG1hcC5zaXplID09IDApIHsKKyAgICAgIHdyaXRlQnl0ZSgwKTsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KG1hcC5zaXplIDw9IGludC5tYXgpOworICAgICAgd3JpdGVWYXJpbnQzMihjYXN0KGludCltYXAuc2l6ZSk7CisgICAgICB3cml0ZUJ5dGUoY2FzdChieXRlKSh0b0NUeXBlKG1hcC5rZXlUeXBlKSA8PCA0IHwgdG9DVHlwZShtYXAudmFsdWVUeXBlKSkpOworICAgIH0KKyAgfQorICB2b2lkIHdyaXRlTWFwRW5kKCkge30KKworICB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpIHsKKyAgICB3cml0ZUNvbGxlY3Rpb25CZWdpbihzZXQuZWxlbVR5cGUsIHNldC5zaXplKTsKKyAgfQorICB2b2lkIHdyaXRlU2V0RW5kKCkge30KKworCisgIC8qCisgICAqIFJlYWRpbmcgbWV0aG9kcy4KKyAgICovCisKKyAgYm9vbCByZWFkQm9vbCgpIHsKKyAgICBpZiAoaGFzQm9vbFZhbHVlXyA9PSB0cnVlKSB7CisgICAgICBoYXNCb29sVmFsdWVfID0gZmFsc2U7CisgICAgICByZXR1cm4gYm9vbFZhbHVlXzsKKyAgICB9CisKKyAgICByZXR1cm4gcmVhZEJ5dGUoKSA9PSBDVHlwZS5CT09MRUFOX1RSVUU7CisgIH0KKworICBieXRlIHJlYWRCeXRlKCkgeworICAgIHVieXRlWzFdIGIgPSB2b2lkOworICAgIHRyYW5zXy5yZWFkQWxsKGIpOworICAgIHJldHVybiBjYXN0KGJ5dGUpYlswXTsKKyAgfQorCisgIHNob3J0IHJlYWRJMTYoKSB7CisgICAgcmV0dXJuIGNhc3Qoc2hvcnQpemlnemFnVG9JMzIocmVhZFZhcmludDMyKCkpOworICB9CisKKyAgaW50IHJlYWRJMzIoKSB7CisgICAgcmV0dXJuIHppZ3phZ1RvSTMyKHJlYWRWYXJpbnQzMigpKTsKKyAgfQorCisgIGxvbmcgcmVhZEk2NCgpIHsKKyAgICByZXR1cm4gemlnemFnVG9JNjQocmVhZFZhcmludDY0KCkpOworICB9CisKKyAgZG91YmxlIHJlYWREb3VibGUoKSB7CisgICAgSW50QnVmIWxvbmcgYiA9IHZvaWQ7CisgICAgdHJhbnNfLnJlYWRBbGwoYi5ieXRlcyk7CisgICAgYi52YWx1ZSA9IGxlVG9Ib3N0KGIudmFsdWUpOworICAgIHJldHVybiAqY2FzdChkb3VibGUqKSgmYi52YWx1ZSk7CisgIH0KKworICBzdHJpbmcgcmVhZFN0cmluZygpIHsKKyAgICByZXR1cm4gY2FzdChzdHJpbmcpcmVhZEJpbmFyeSgpOworICB9CisKKyAgdWJ5dGVbXSByZWFkQmluYXJ5KCkgeworICAgIGF1dG8gc2l6ZSA9IHJlYWRWYXJpbnQzMigpOworICAgIGNoZWNrU2l6ZShzaXplLCBzdHJpbmdTaXplTGltaXQpOworCisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgYXV0byBidWYgPSB1bmluaXRpYWxpemVkQXJyYXkhKHVieXRlW10pKHNpemUpOworICAgIHRyYW5zXy5yZWFkQWxsKGJ1Zik7CisgICAgcmV0dXJuIGJ1ZjsKKyAgfQorCisgIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB7CisgICAgVE1lc3NhZ2UgbXNnID0gdm9pZDsKKworICAgIGF1dG8gcHJvdG9jb2xJZCA9IHJlYWRCeXRlKCk7CisgICAgaWYgKHByb3RvY29sSWQgIT0gY2FzdChieXRlKVBST1RPQ09MX0lEKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJCYWQgcHJvdG9jb2wgaWRlbnRpZmllciIsCisgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLkJBRF9WRVJTSU9OKTsKKyAgICB9CisKKyAgICBhdXRvIHZlcnNpb25BbmRUeXBlID0gcmVhZEJ5dGUoKTsKKyAgICBhdXRvIHZlciA9IHZlcnNpb25BbmRUeXBlICYgVkVSU0lPTl9NQVNLOworICAgIGlmICh2ZXIgIT0gVkVSU0lPTl9OKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJCYWQgcHJvdG9jb2wgdmVyc2lvbiIsCisgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLkJBRF9WRVJTSU9OKTsKKyAgICB9CisKKyAgICBtc2cudHlwZSA9IGNhc3QoVE1lc3NhZ2VUeXBlKSgodmVyc2lvbkFuZFR5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9CSVRTKTsKKyAgICBtc2cuc2VxaWQgPSByZWFkVmFyaW50MzIoKTsKKyAgICBtc2cubmFtZSA9IHJlYWRTdHJpbmcoKTsKKworICAgIHJldHVybiBtc2c7CisgIH0KKyAgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHt9CisKKyAgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB7CisgICAgZmllbGRJZFN0YWNrXyB+PSBsYXN0RmllbGRJZF87CisgICAgbGFzdEZpZWxkSWRfID0gMDsKKyAgICByZXR1cm4gVFN0cnVjdCgpOworICB9CisKKyAgdm9pZCByZWFkU3RydWN0RW5kKCkgeworICAgIGxhc3RGaWVsZElkXyA9IGZpZWxkSWRTdGFja19bJCAtIDFdOworICAgIGZpZWxkSWRTdGFja18gPSBmaWVsZElkU3RhY2tfWzAgLi4gJCAtIDFdOworICB9CisKKyAgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgeworICAgIFRGaWVsZCBmID0gdm9pZDsKKyAgICBmLm5hbWUgPSBudWxsOworCisgICAgYXV0byBiaXRlID0gcmVhZEJ5dGUoKTsKKyAgICBhdXRvIHR5cGUgPSBjYXN0KENUeXBlKShiaXRlICYgMHgwZik7CisKKyAgICBpZiAodHlwZSA9PSBDVHlwZS5TVE9QKSB7CisgICAgICAvLyBTdHJ1Y3Qgc3RvcCBieXRlLCBub3RoaW5nIG1vcmUgdG8gZG8uCisgICAgICBmLmlkID0gMDsKKyAgICAgIGYudHlwZSA9IFRUeXBlLlNUT1A7CisgICAgICByZXR1cm4gZjsKKyAgICB9CisKKyAgICAvLyBNYXNrIG9mZiB0aGUgNCBNU0Igb2YgdGhlIHR5cGUgaGVhZGVyLCB3aGljaCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQKKyAgICAvLyBkZWx0YS4KKyAgICBhdXRvIG1vZGlmaWVyID0gY2FzdChzaG9ydCkoKGJpdGUgJiAweGYwKSA+PiA0KTsKKyAgICBpZiAobW9kaWZpZXIgPiAwKSB7CisgICAgICBmLmlkID0gY2FzdChzaG9ydCkobGFzdEZpZWxkSWRfICsgbW9kaWZpZXIpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBEZWx0YSBlbmNvZGluZyBub3QgdXNlZCwganVzdCByZWFkIHRoZSBpZCBhcyB1c3VhbC4KKyAgICAgIGYuaWQgPSByZWFkSTE2KCk7CisgICAgfQorICAgIGYudHlwZSA9IGdldFRUeXBlKHR5cGUpOworCisgICAgaWYgKHR5cGUgPT0gQ1R5cGUuQk9PTEVBTl9UUlVFIHx8IHR5cGUgPT0gQ1R5cGUuQk9PTEVBTl9GQUxTRSkgeworICAgICAgLy8gRm9yIGJvb2xlYW4gZmllbGRzLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgdHlwZSDigJMga2VlcCBpdCBhcm91bmQKKyAgICAgIC8vIGZvciB0aGUgcmVhZEJvb2woKSBjYWxsLgorICAgICAgaGFzQm9vbFZhbHVlXyA9IHRydWU7CisgICAgICBib29sVmFsdWVfID0gKHR5cGUgPT0gQ1R5cGUuQk9PTEVBTl9UUlVFID8gdHJ1ZSA6IGZhbHNlKTsKKyAgICB9CisKKyAgICBsYXN0RmllbGRJZF8gPSBmLmlkOworICAgIHJldHVybiBmOworICB9CisgIHZvaWQgcmVhZEZpZWxkRW5kKCkge30KKworICBUTGlzdCByZWFkTGlzdEJlZ2luKCkgeworICAgIGF1dG8gc2l6ZUFuZFR5cGUgPSByZWFkQnl0ZSgpOworCisgICAgYXV0byBsc2l6ZSA9IChzaXplQW5kVHlwZSA+PiA0KSAmIDB4ZjsKKyAgICBpZiAobHNpemUgPT0gMHhmKSB7CisgICAgICBsc2l6ZSA9IHJlYWRWYXJpbnQzMigpOworICAgIH0KKyAgICBjaGVja1NpemUobHNpemUsIGNvbnRhaW5lclNpemVMaW1pdCk7CisKKyAgICBUTGlzdCBsID0gdm9pZDsKKyAgICBsLmVsZW1UeXBlID0gZ2V0VFR5cGUoY2FzdChDVHlwZSkoc2l6ZUFuZFR5cGUgJiAweDBmKSk7CisgICAgbC5zaXplID0gY2FzdChzaXplX3QpbHNpemU7CisKKyAgICByZXR1cm4gbDsKKyAgfQorICB2b2lkIHJlYWRMaXN0RW5kKCkge30KKworICBUTWFwIHJlYWRNYXBCZWdpbigpIHsKKyAgICBUTWFwIG0gPSB2b2lkOworCisgICAgYXV0byBzaXplID0gcmVhZFZhcmludDMyKCk7CisgICAgdWJ5dGUga3ZUeXBlOworICAgIGlmIChzaXplICE9IDApIHsKKyAgICAgIGt2VHlwZSA9IHJlYWRCeXRlKCk7CisgICAgfQorICAgIGNoZWNrU2l6ZShzaXplLCBjb250YWluZXJTaXplTGltaXQpOworCisgICAgbS5zaXplID0gc2l6ZTsKKyAgICBtLmtleVR5cGUgPSBnZXRUVHlwZShjYXN0KENUeXBlKShrdlR5cGUgPj4gNCkpOworICAgIG0udmFsdWVUeXBlID0gZ2V0VFR5cGUoY2FzdChDVHlwZSkoa3ZUeXBlICYgMHhmKSk7CisKKyAgICByZXR1cm4gbTsKKyAgfQorICB2b2lkIHJlYWRNYXBFbmQoKSB7fQorCisgIFRTZXQgcmVhZFNldEJlZ2luKCkgeworICAgIGF1dG8gc2l6ZUFuZFR5cGUgPSByZWFkQnl0ZSgpOworCisgICAgYXV0byBsc2l6ZSA9IChzaXplQW5kVHlwZSA+PiA0KSAmIDB4ZjsKKyAgICBpZiAobHNpemUgPT0gMHhmKSB7CisgICAgICBsc2l6ZSA9IHJlYWRWYXJpbnQzMigpOworICAgIH0KKyAgICBjaGVja1NpemUobHNpemUsIGNvbnRhaW5lclNpemVMaW1pdCk7CisKKyAgICBUU2V0IHMgPSB2b2lkOworICAgIHMuZWxlbVR5cGUgPSBnZXRUVHlwZShjYXN0KENUeXBlKShzaXplQW5kVHlwZSAmIDB4ZikpOworICAgIHMuc2l6ZSA9IGNhc3Qoc2l6ZV90KWxzaXplOworCisgICAgcmV0dXJuIHM7CisgIH0KKyAgdm9pZCByZWFkU2V0RW5kKCkge30KKworcHJpdmF0ZToKKyAgdm9pZCB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChURmllbGQgZmllbGQsIGJ5dGUgdHlwZU92ZXJyaWRlID0gLTEpIHsKKyAgICAvLyBJZiB0aGVyZSdzIGEgdHlwZSBvdmVycmlkZSwgdXNlIHRoYXQuCisgICAgYXV0byB0eXBlVG9Xcml0ZSA9ICh0eXBlT3ZlcnJpZGUgPT0gLTEgPyB0b0NUeXBlKGZpZWxkLnR5cGUpIDogdHlwZU92ZXJyaWRlKTsKKworICAgIC8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAorICAgIGlmIChmaWVsZC5pZCA+IGxhc3RGaWVsZElkXyAmJiAoZmllbGQuaWQgLSBsYXN0RmllbGRJZF8pIDw9IDE1KSB7CisgICAgICAvLyB3cml0ZSB0aGVtIHRvZ2V0aGVyCisgICAgICB3cml0ZUJ5dGUoY2FzdChieXRlKSgoZmllbGQuaWQgLSBsYXN0RmllbGRJZF8pIDw8IDQgfCB0eXBlVG9Xcml0ZSkpOworICAgIH0gZWxzZSB7CisgICAgICAvLyB3cml0ZSB0aGVtIHNlcGFyYXRlCisgICAgICB3cml0ZUJ5dGUoY2FzdChieXRlKXR5cGVUb1dyaXRlKTsKKyAgICAgIHdyaXRlSTE2KGZpZWxkLmlkKTsKKyAgICB9CisKKyAgICBsYXN0RmllbGRJZF8gPSBmaWVsZC5pZDsKKyAgfQorCisKKyAgdm9pZCB3cml0ZUNvbGxlY3Rpb25CZWdpbihUVHlwZSBlbGVtVHlwZSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA8PSAxNCkgeworICAgICAgd3JpdGVCeXRlKGNhc3QoYnl0ZSkoc2l6ZSA8PCA0IHwgdG9DVHlwZShlbGVtVHlwZSkpKTsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KHNpemUgPD0gaW50Lm1heCk7CisgICAgICB3cml0ZUJ5dGUoY2FzdChieXRlKSgweGYwIHwgdG9DVHlwZShlbGVtVHlwZSkpKTsKKyAgICAgIHdyaXRlVmFyaW50MzIoY2FzdChpbnQpc2l6ZSk7CisgICAgfQorICB9CisKKyAgdm9pZCB3cml0ZVZhcmludDMyKHVpbnQgbikgeworICAgIHVieXRlWzVdIGJ1ZiA9IHZvaWQ7CisgICAgdWJ5dGUgd3NpemU7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKChuICYgfjB4N0YpID09IDApIHsKKyAgICAgICAgYnVmW3dzaXplKytdID0gY2FzdCh1Ynl0ZSluOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJ1Zlt3c2l6ZSsrXSA9IGNhc3QodWJ5dGUpKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgICAgbiA+Pj0gNzsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0cmFuc18ud3JpdGUoYnVmWzAgLi4gd3NpemVdKTsKKyAgfQorCisgIC8qCisgICAqIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgKi8KKyAgdm9pZCB3cml0ZVZhcmludDY0KHVsb25nIG4pIHsKKyAgICB1Ynl0ZVsxMF0gYnVmID0gdm9pZDsKKyAgICB1Ynl0ZSB3c2l6ZTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoKG4gJiB+MHg3RkwpID09IDApIHsKKyAgICAgICAgYnVmW3dzaXplKytdID0gY2FzdCh1Ynl0ZSluOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJ1Zlt3c2l6ZSsrXSA9IGNhc3QodWJ5dGUpKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgICAgbiA+Pj0gNzsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0cmFuc18ud3JpdGUoYnVmWzAgLi4gd3NpemVdKTsKKyAgfQorCisgIC8qCisgICAqIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAgICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICAgKi8KKyAgdWxvbmcgaTY0VG9aaWd6YWcobG9uZyBsKSB7CisgICAgcmV0dXJuIChsIDw8IDEpIF4gKGwgPj4gNjMpOworICB9CisKKyAgLyoKKyAgICogQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgICAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAgICovCisgIHVpbnQgaTMyVG9aaWd6YWcoaW50IG4pIHsKKyAgICByZXR1cm4gKG4gPDwgMSkgXiAobiA+PiAzMSk7CisgIH0KKworICBDVHlwZSB0b0NUeXBlKFRUeXBlIHR5cGUpIHsKKyAgICBmaW5hbCBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgVFR5cGUuU1RPUDoKKyAgICAgICAgcmV0dXJuIENUeXBlLlNUT1A7CisgICAgICBjYXNlIFRUeXBlLkJPT0w6CisgICAgICAgIHJldHVybiBDVHlwZS5CT09MRUFOX1RSVUU7CisgICAgICBjYXNlIFRUeXBlLkJZVEU6CisgICAgICAgIHJldHVybiBDVHlwZS5CWVRFOworICAgICAgY2FzZSBUVHlwZS5ET1VCTEU6CisgICAgICAgIHJldHVybiBDVHlwZS5ET1VCTEU7CisgICAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgICAgcmV0dXJuIENUeXBlLkkxNjsKKyAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICByZXR1cm4gQ1R5cGUuSTMyOworICAgICAgY2FzZSBUVHlwZS5JNjQ6CisgICAgICAgIHJldHVybiBDVHlwZS5JNjQ7CisgICAgICBjYXNlIFRUeXBlLlNUUklORzoKKyAgICAgICAgcmV0dXJuIENUeXBlLkJJTkFSWTsKKyAgICAgIGNhc2UgVFR5cGUuU1RSVUNUOgorICAgICAgICByZXR1cm4gQ1R5cGUuU1RSVUNUOworICAgICAgY2FzZSBUVHlwZS5NQVA6CisgICAgICAgIHJldHVybiBDVHlwZS5NQVA7CisgICAgICBjYXNlIFRUeXBlLlNFVDoKKyAgICAgICAgcmV0dXJuIENUeXBlLlNFVDsKKyAgICAgIGNhc2UgVFR5cGUuTElTVDoKKyAgICAgICAgcmV0dXJuIENUeXBlLkxJU1Q7CisgICAgICBjYXNlIFRUeXBlLlZPSUQ6CisgICAgICAgIGFzc2VydChmYWxzZSwgIkludmFsaWQgdHlwZSBwYXNzZWQuIik7CisgICAgfQorICB9CisKKyAgaW50IHJlYWRWYXJpbnQzMigpIHsKKyAgICByZXR1cm4gY2FzdChpbnQpcmVhZFZhcmludDY0KCk7CisgIH0KKworICBsb25nIHJlYWRWYXJpbnQ2NCgpIHsKKyAgICB1bG9uZyB2YWw7CisgICAgdWJ5dGUgc2hpZnQ7CisgICAgdWJ5dGVbMTBdIGJ1ZiA9IHZvaWQ7ICAvLyA2NCBiaXRzIC8gKDcgYml0cy9ieXRlKSA9IDEwIGJ5dGVzLgorICAgIGF1dG8gYnVmU2l6ZSA9IGJ1Zi5zaXplb2Y7CisgICAgYXV0byBib3Jyb3dlZCA9IHRyYW5zXy5ib3Jyb3coYnVmLnB0ciwgYnVmU2l6ZSk7CisKKyAgICB1Ynl0ZSByc2l6ZTsKKworICAgIGlmIChib3Jyb3dlZCkgeworICAgICAgLy8gRmFzdCBwYXRoLgorICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgYXV0byBiaXRlID0gYm9ycm93ZWRbcnNpemVdOworICAgICAgICByc2l6ZSsrOworICAgICAgICB2YWwgfD0gY2FzdCh1bG9uZykoYml0ZSAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgICBzaGlmdCArPSA3OworICAgICAgICBpZiAoIShiaXRlICYgMHg4MCkpIHsKKyAgICAgICAgICB0cmFuc18uY29uc3VtZShyc2l6ZSk7CisgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQorICAgICAgICAvLyBIYXZlIHRvIGNoZWNrIGZvciBpbnZhbGlkIGRhdGEgc28gd2UgZG9uJ3QgY3Jhc2guCisgICAgICAgIGlmIChyc2l6ZSA9PSBidWYuc2l6ZW9mKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAiVmFyaWFibGUtbGVuZ3RoIGludCBvdmVyIDEwIGJ5dGVzLiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFNsb3cgcGF0aC4KKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHVieXRlWzFdIGJpdGU7CisgICAgICAgIHRyYW5zXy5yZWFkQWxsKGJpdGUpOworICAgICAgICArK3JzaXplOworCisgICAgICAgIHZhbCB8PSBjYXN0KHVsb25nKShiaXRlWzBdICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgICAgIHNoaWZ0ICs9IDc7CisgICAgICAgIGlmICghKGJpdGVbMF0gJiAweDgwKSkgeworICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgIH0KKworICAgICAgICAvLyBNaWdodCBhcyB3ZWxsIGNoZWNrIGZvciBpbnZhbGlkIGRhdGEgb24gdGhlIHNsb3cgcGF0aCB0b28uCisgICAgICAgIGlmIChyc2l6ZSA+PSBidWYuc2l6ZW9mKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAiVmFyaWFibGUtbGVuZ3RoIGludCBvdmVyIDEwIGJ5dGVzLiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoKKyAgICogQ29udmVydCBmcm9tIHppZ3phZyBpbnQgdG8gaW50LgorICAgKi8KKyAgaW50IHppZ3phZ1RvSTMyKHVpbnQgbikgeworICAgIHJldHVybiAobiA+PiAxKSBeIC0obiAmIDEpOworICB9CisKKyAgLyoKKyAgICogQ29udmVydCBmcm9tIHppZ3phZyBsb25nIHRvIGxvbmcuCisgICAqLworICBsb25nIHppZ3phZ1RvSTY0KHVsb25nIG4pIHsKKyAgICByZXR1cm4gKG4gPj4gMSkgXiAtKG4gJiAxKTsKKyAgfQorCisgIFRUeXBlIGdldFRUeXBlKENUeXBlIHR5cGUpIHsKKyAgICBmaW5hbCBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgQ1R5cGUuU1RPUDoKKyAgICAgICAgcmV0dXJuIFRUeXBlLlNUT1A7CisgICAgICBjYXNlIENUeXBlLkJPT0xFQU5fRkFMU0U6CisgICAgICAgIHJldHVybiBUVHlwZS5CT09MOworICAgICAgY2FzZSBDVHlwZS5CT09MRUFOX1RSVUU6CisgICAgICAgIHJldHVybiBUVHlwZS5CT09MOworICAgICAgY2FzZSBDVHlwZS5CWVRFOgorICAgICAgICByZXR1cm4gVFR5cGUuQllURTsKKyAgICAgIGNhc2UgQ1R5cGUuSTE2OgorICAgICAgICByZXR1cm4gVFR5cGUuSTE2OworICAgICAgY2FzZSBDVHlwZS5JMzI6CisgICAgICAgIHJldHVybiBUVHlwZS5JMzI7CisgICAgICBjYXNlIENUeXBlLkk2NDoKKyAgICAgICAgcmV0dXJuIFRUeXBlLkk2NDsKKyAgICAgIGNhc2UgQ1R5cGUuRE9VQkxFOgorICAgICAgICByZXR1cm4gVFR5cGUuRE9VQkxFOworICAgICAgY2FzZSBDVHlwZS5CSU5BUlk6CisgICAgICAgIHJldHVybiBUVHlwZS5TVFJJTkc7CisgICAgICBjYXNlIENUeXBlLkxJU1Q6CisgICAgICAgIHJldHVybiBUVHlwZS5MSVNUOworICAgICAgY2FzZSBDVHlwZS5TRVQ6CisgICAgICAgIHJldHVybiBUVHlwZS5TRVQ7CisgICAgICBjYXNlIENUeXBlLk1BUDoKKyAgICAgICAgcmV0dXJuIFRUeXBlLk1BUDsKKyAgICAgIGNhc2UgQ1R5cGUuU1RSVUNUOgorICAgICAgICByZXR1cm4gVFR5cGUuU1RSVUNUOworICAgIH0KKyAgfQorCisgIHZvaWQgY2hlY2tTaXplKGludCBzaXplLCBpbnQgbGltaXQpIHsKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuTkVHQVRJVkVfU0laRSk7CisgICAgfSBlbHNlIGlmIChsaW1pdCA+IDAgJiYgc2l6ZSA+IGxpbWl0KSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLlNJWkVfTElNSVQpOworICAgIH0KKyAgfQorCisgIGVudW0gUFJPVE9DT0xfSUQgPSAweDgyOworICBlbnVtIFZFUlNJT05fTiA9IDE7CisgIGVudW0gVkVSU0lPTl9NQVNLID0gMGIwMDAxXzExMTE7CisgIGVudW0gVFlQRV9NQVNLID0gMGIxMTEwXzAwMDA7CisgIGVudW0gVFlQRV9CSVRTID0gMGIwMDAwXzAxMTE7CisgIGVudW0gVFlQRV9TSElGVF9BTU9VTlQgPSA1OworCisgIC8vIFByb2JhYmx5IG5lZWQgdG8gaW1wbGVtZW50IGEgYmV0dGVyIHN0YWNrIGF0IHNvbWUgcG9pbnQuCisgIHNob3J0W10gZmllbGRJZFN0YWNrXzsKKyAgc2hvcnQgbGFzdEZpZWxkSWRfOworCisgIFRGaWVsZCBib29sZWFuRmllbGRfOworCisgIGJvb2wgaGFzQm9vbFZhbHVlXzsKKyAgYm9vbCBib29sVmFsdWVfOworCisgIFRyYW5zcG9ydCB0cmFuc187Cit9CisKKy8qKgorICogVENvbXBhY3RQcm90b2NvbCBjb25zdHJ1Y3Rpb24gaGVscGVyIHRvIGF2b2lkIGhhdmluZyB0byBleHBsaWNpdGx5IHNwZWNpZnkKKyAqIHRoZSB0cmFuc3BvcnQgdHlwZSwgaS5lLiB0byBhbGxvdyB0aGUgY29uc3RydWN0b3IgYmVpbmcgY2FsbGVkIHVzaW5nIElGVEkKKyAqIChzZWUgJChMSU5LMiBodHRwOi8vZC5wdXJlbWFnaWMuY29tL2lzc3Vlcy9zaG93X2J1Zy5jZ2k/aWQ9NjA4MiwgRCBCdWd6aWxsYQorICogZW5oYW5jZW1lbnQgcmVxdWV0IDYwODIpKS4KKyAqLworVENvbXBhY3RQcm90b2NvbCFUcmFuc3BvcnQgdENvbXBhY3RQcm90b2NvbChUcmFuc3BvcnQpKFRyYW5zcG9ydCB0cmFucywKKyAgaW50IGNvbnRhaW5lclNpemVMaW1pdCA9IDAsIGludCBzdHJpbmdTaXplTGltaXQgPSAwCispIGlmIChpc1RUcmFuc3BvcnQhVHJhbnNwb3J0KQoreworICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2whVHJhbnNwb3J0KHRyYW5zLAorICAgIGNvbnRhaW5lclNpemVMaW1pdCwgc3RyaW5nU2l6ZUxpbWl0KTsKK30KKworcHJpdmF0ZSB7CisgIGVudW0gQ1R5cGUgOiB1Ynl0ZSB7CisgICAgU1RPUCA9IDB4MCwKKyAgICBCT09MRUFOX1RSVUUgPSAweDEsCisgICAgQk9PTEVBTl9GQUxTRSA9IDB4MiwKKyAgICBCWVRFID0gMHgzLAorICAgIEkxNiA9IDB4NCwKKyAgICBJMzIgPSAweDUsCisgICAgSTY0ID0gMHg2LAorICAgIERPVUJMRSA9IDB4NywKKyAgICBCSU5BUlkgPSAweDgsCisgICAgTElTVCA9IDB4OSwKKyAgICBTRVQgPSAweGEsCisgICAgTUFQID0gMHhiLAorICAgIFNUUlVDVCA9IDB4YworICB9CisgIHN0YXRpYyBhc3NlcnQoQ1R5cGUubWF4IDw9IDB4ZiwKKyAgICAiQ29tcGFjdCBwcm90b2NvbCB3aXJlIHR5cGUgcmVwcmVzZW50YXRpb24gbXVzdCBmaXQgaW50byA0IGJpdHMuIik7Cit9CisKK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHN0ZC5leGNlcHRpb247CisgIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKKworICAvLyBDaGVjayB0aGUgbWVzc2FnZSBoZWFkZXIgZm9ybWF0LgorICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyOworICBhdXRvIGNvbXBhY3QgPSB0Q29tcGFjdFByb3RvY29sKGJ1Zik7CisgIGNvbXBhY3Qud3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UoImZvbyIsIFRNZXNzYWdlVHlwZS5DQUxMLCAwKSk7CisKKyAgYXV0byBoZWFkZXIgPSBuZXcgdWJ5dGVbN107CisgIGJ1Zi5yZWFkQWxsKGhlYWRlcik7CisgIGVuZm9yY2UoaGVhZGVyID09IFsKKyAgICAxMzAsIC8vIFByb3RvY29sIGlkLgorICAgIDMzLCAvLyBWZXJzaW9uL3R5cGUgYnl0ZS4KKyAgICAwLCAvLyBTZXF1ZW5jZSBpZC4KKyAgICAzLCAxMDIsIDExMSwgMTExIC8vIE1ldGhvZCBuYW1lLgorICBdKTsKK30KKwordW5pdHRlc3QgeworICBpbXBvcnQgdGhyaWZ0LmludGVybmFsLnRlc3QucHJvdG9jb2w7CisgIHRlc3RDb250YWluZXJTaXplTGltaXQhKFRDb21wYWN0UHJvdG9jb2whKCkpKCk7CisgIHRlc3RTdHJpbmdTaXplTGltaXQhKFRDb21wYWN0UHJvdG9jb2whKCkpKCk7Cit9CisKKy8qKgorICogVFByb3RvY29sRmFjdG9yeSBjcmVhdGluZyBhIFRDb21wYWN0UHJvdG9jb2wgaW5zdGFuY2UgZm9yIHBhc3NlZCBpbgorICogdHJhbnNwb3J0cy4KKyAqCisgKiBUaGUgb3B0aW9uYWwgVHJhbnNwb3J0cyB0ZW1wbGF0ZSB0dXBsZSBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeQorICogb25lIG9yIG1vcmUgVFRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMgdG8gc3BlY2lmaWNhbGx5IGluc3RhbnRpYXRlCisgKiBUQ29tcGFjdFByb3RvY29sIGZvci4gSWYgdGhlIGFjdHVhbCB0cmFuc3BvcnQgdHlwZXMgZW5jb3VudGVyZWQgYXQKKyAqIHJ1bnRpbWUgbWF0Y2ggb25lIG9mIHRoZSB0cmFuc3BvcnRzIGluIHRoZSBsaXN0LCBhIHNwZWNpYWxpemVkIHByb3RvY29sCisgKiBpbnN0YW5jZSBpcyBjcmVhdGVkLiBPdGhlcndpc2UsIGEgZ2VuZXJpYyBUVHJhbnNwb3J0IHZlcnNpb24gaXMgdXNlZC4KKyAqLworY2xhc3MgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoVHJhbnNwb3J0cy4uLikgaWYgKAorICBhbGxTYXRpc2Z5IShpc1RUcmFuc3BvcnQsIFRyYW5zcG9ydHMpCispIDogVFByb3RvY29sRmFjdG9yeSB7CisgIC8vLworICB0aGlzKGludCBjb250YWluZXJTaXplTGltaXQgPSAwLCBpbnQgc3RyaW5nU2l6ZUxpbWl0ID0gMCkgeworICAgIGNvbnRhaW5lclNpemVMaW1pdF8gPSAwOworICAgIHN0cmluZ1NpemVMaW1pdF8gPSAwOworICB9CisKKyAgVFByb3RvY29sIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpIGNvbnN0IHsKKyAgICBmb3JlYWNoIChUcmFuc3BvcnQ7IFR5cGVUdXBsZSEoVHJhbnNwb3J0cywgVFRyYW5zcG9ydCkpIHsKKyAgICAgIGF1dG8gY29uY3JldGVUcmFucyA9IGNhc3QoVHJhbnNwb3J0KXRyYW5zOworICAgICAgaWYgKGNvbmNyZXRlVHJhbnMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sIVRyYW5zcG9ydChjb25jcmV0ZVRyYW5zKTsKKyAgICAgIH0KKyAgICB9CisgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICJQYXNzZWQgbnVsbCB0cmFuc3BvcnQgdG8gVENvbXBhY3RQcm90b2NvbEZhY3RvcnkuIik7CisgIH0KKworICBpbnQgY29udGFpbmVyU2l6ZUxpbWl0XzsKKyAgaW50IHN0cmluZ1NpemVMaW1pdF87Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2pzb24uZCBiL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvanNvbi5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YTcxZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2pzb24uZApAQCAtMCwwICsxLDEwMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQucHJvdG9jb2wuanNvbjsKKworaW1wb3J0IHN0ZC5hbGdvcml0aG07CitpbXBvcnQgc3RkLmFycmF5OworaW1wb3J0IHN0ZC5iYXNlNjQ7CitpbXBvcnQgc3RkLmNvbnY7CitpbXBvcnQgc3RkLnJhbmdlOworaW1wb3J0IHN0ZC5zdHJpbmcgOiBmb3JtYXQ7CitpbXBvcnQgc3RkLnRyYWl0cyA6IGlzSW50ZWdyYWw7CitpbXBvcnQgc3RkLnR5cGV0dXBsZSA6IGFsbFNhdGlzZnksIFR5cGVUdXBsZTsKK2ltcG9ydCBzdGQudXRmIDogdG9VVEY4OworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKKworYWxpYXMgQmFzZTY0SW1wbCEoJysnLCAnLycsIEJhc2U2NC5Ob1BhZGRpbmcpIEJhc2U2NE5vUGFkOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgSlNPTiBwcm90b2NvbC4KKyAqLworZmluYWwgY2xhc3MgVEpzb25Qcm90b2NvbChUcmFuc3BvcnQgPSBUVHJhbnNwb3J0KSBpZiAoCisgIGlzVFRyYW5zcG9ydCFUcmFuc3BvcnQKKykgOiBUUHJvdG9jb2wgeworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHRyYW5zID0gVGhlIHRyYW5zcG9ydCB0byB1c2UuCisgICAqICAgY29udGFpbmVyU2l6ZUxpbWl0ID0gSWYgcG9zaXRpdmUsIHRoZSBjb250YWluZXIgc2l6ZSBpcyBsaW1pdGVkIHRvIHRoZQorICAgKiAgICAgZ2l2ZW4gbnVtYmVyIG9mIGl0ZW1zLgorICAgKiAgIHN0cmluZ1NpemVMaW1pdCA9IElmIHBvc2l0aXZlLCB0aGUgc3RyaW5nIGxlbmd0aCBpcyBsaW1pdGVkIHRvIHRoZQorICAgKiAgICAgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLgorICAgKi8KKyAgdGhpcyhUcmFuc3BvcnQgdHJhbnMsIGludCBjb250YWluZXJTaXplTGltaXQgPSAwLCBpbnQgc3RyaW5nU2l6ZUxpbWl0ID0gMCkgeworICAgIHRyYW5zXyA9IHRyYW5zOworICAgIHRoaXMuY29udGFpbmVyU2l6ZUxpbWl0ID0gY29udGFpbmVyU2l6ZUxpbWl0OworICAgIHRoaXMuc3RyaW5nU2l6ZUxpbWl0ID0gc3RyaW5nU2l6ZUxpbWl0OworCisgICAgY29udGV4dF8gPSBuZXcgQ29udGV4dCgpOworICAgIHJlYWRlcl8gPSBuZXcgTG9va2FoZWFkUmVhZGVyKHRyYW5zKTsKKyAgfQorCisgIFRyYW5zcG9ydCB0cmFuc3BvcnQoKSBAcHJvcGVydHkgeworICAgIHJldHVybiB0cmFuc187CisgIH0KKworICB2b2lkIHJlc2V0KCkgeworICAgIGRlc3Ryb3koY29udGV4dFN0YWNrXyk7CisgICAgY29udGV4dF8gPSBuZXcgQ29udGV4dCgpOworICAgIHJlYWRlcl8gPSBuZXcgTG9va2FoZWFkUmVhZGVyKHRyYW5zXyk7CisgIH0KKworICAvKioKKyAgICogSWYgcG9zaXRpdmUsIGxpbWl0cyB0aGUgbnVtYmVyIG9mIGl0ZW1zIG9mIGRlc2VyaWFsaXplZCBjb250YWluZXJzIHRvIHRoZQorICAgKiBnaXZlbiBhbW91bnQuCisgICAqCisgICAqIFRoaXMgaXMgdXNlZnVsIHRvIGF2b2lkIGFsbG9jYXRpbmcgZXhjZXNzaXZlIGFtb3VudHMgb2YgbWVtb3J5IHdoZW4gYnJva2VuCisgICAqIGRhdGEgaXMgcmVjZWl2ZWQuIElmIHRoZSBsaW1pdCBpcyBleGNlZWRlZCwgYSBTSVpFX0xJTUlULXR5cGUKKyAgICogVFByb3RvY29sRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gemVybyAobm8gbGltaXQpLgorICAgKi8KKyAgaW50IGNvbnRhaW5lclNpemVMaW1pdDsKKworICAvKioKKyAgICogSWYgcG9zaXRpdmUsIGxpbWl0cyB0aGUgbGVuZ3RoIG9mIGRlc2VyaWFsaXplZCBzdHJpbmdzL2JpbmFyeSBkYXRhIHRvIHRoZQorICAgKiBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuCisgICAqCisgICAqIFRoaXMgaXMgdXNlZnVsIHRvIGF2b2lkIGFsbG9jYXRpbmcgZXhjZXNzaXZlIGFtb3VudHMgb2YgbWVtb3J5IHdoZW4gYnJva2VuCisgICAqIGRhdGEgaXMgcmVjZWl2ZWQuIElmIHRoZSBsaW1pdCBpcyBleGNlZWRlZCwgYSBTSVpFX0xJTUlULXR5cGUKKyAgICogVFByb3RvY29sRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICoKKyAgICogTm90ZTogRm9yIGJpbmFyeSBkYXRhLCB0aGUgbGltaXQgYXBwbGllcyB0byB0aGUgbGVuZ3RoIG9mIHRoZQorICAgKiBCYXNlNjQtZW5jb2RlZCBzdHJpbmcgZGF0YSwgbm90IHRoZSByZXN1bHRpbmcgYnl0ZSBhcnJheS4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gemVybyAobm8gbGltaXQpLgorICAgKi8KKyAgaW50IHN0cmluZ1NpemVMaW1pdDsKKworICAvKgorICAgKiBXcml0aW5nIG1ldGhvZHMuCisgICAqLworCisgIHZvaWQgd3JpdGVCb29sKGJvb2wgYikgeworICAgIHdyaXRlSnNvbkludGVnZXIoYiA/IDEgOiAwKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCeXRlKGJ5dGUgYikgeworICAgIHdyaXRlSnNvbkludGVnZXIoYik7CisgIH0KKworICB2b2lkIHdyaXRlSTE2KHNob3J0IGkxNikgeworICAgIHdyaXRlSnNvbkludGVnZXIoaTE2KTsKKyAgfQorCisgIHZvaWQgd3JpdGVJMzIoaW50IGkzMikgeworICAgIHdyaXRlSnNvbkludGVnZXIoaTMyKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJNjQobG9uZyBpNjQpIHsKKyAgICB3cml0ZUpzb25JbnRlZ2VyKGk2NCk7CisgIH0KKworICB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkdWIpIHsKKyAgICBjb250ZXh0Xy53cml0ZSh0cmFuc18pOworCisgICAgc3RyaW5nIHZhbHVlOworICAgIGlmIChkdWIgaXMgZG91YmxlLm5hbikgeworICAgICAgdmFsdWUgPSBOQU5fU1RSSU5HOworICAgIH0gZWxzZSBpZiAoZHViIGlzIGRvdWJsZS5pbmZpbml0eSkgeworICAgICAgdmFsdWUgPSBJTkZJTklUWV9TVFJJTkc7CisgICAgfSBlbHNlIGlmIChkdWIgaXMgLWRvdWJsZS5pbmZpbml0eSkgeworICAgICAgdmFsdWUgPSBORUdfSU5GSU5JVFlfU1RSSU5HOworICAgIH0KKworICAgIGJvb2wgZXNjYXBlTnVtID0gdmFsdWUgIWlzIG51bGwgfHwgY29udGV4dF8uZXNjYXBlTnVtOworCisgICAgaWYgKHZhbHVlIGlzIG51bGwpIHsKKyAgICAgIC8qIHByZWNpc2lvbiBpcyAxNyAqLworICAgICAgdmFsdWUgPSBmb3JtYXQoIiUuMTdnIiwgZHViKTsKKyAgICB9CisKKyAgICBpZiAoZXNjYXBlTnVtKSB0cmFuc18ud3JpdGUoU1RSSU5HX0RFTElNSVRFUik7CisgICAgdHJhbnNfLndyaXRlKGNhc3QodWJ5dGVbXSl2YWx1ZSk7CisgICAgaWYgKGVzY2FwZU51bSkgdHJhbnNfLndyaXRlKFNUUklOR19ERUxJTUlURVIpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cmluZyhzdHJpbmcgc3RyKSB7CisgICAgY29udGV4dF8ud3JpdGUodHJhbnNfKTsKKyAgICB0cmFuc18ud3JpdGUoU1RSSU5HX0RFTElNSVRFUik7CisgICAgZm9yZWFjaCAoYzsgc3RyKSB7CisgICAgICB3cml0ZUpzb25DaGFyKGMpOworICAgIH0KKyAgICB0cmFuc18ud3JpdGUoU1RSSU5HX0RFTElNSVRFUik7CisgIH0KKworICB2b2lkIHdyaXRlQmluYXJ5KHVieXRlW10gYnVmKSB7CisgICAgY29udGV4dF8ud3JpdGUodHJhbnNfKTsKKworICAgIHRyYW5zXy53cml0ZShTVFJJTkdfREVMSU1JVEVSKTsKKyAgICB1Ynl0ZVs0XSBiOworICAgIHdoaWxlICghYnVmLmVtcHR5KSB7CisgICAgICBhdXRvIHRvV3JpdGUgPSB0YWtlKGJ1ZiwgMyk7CisgICAgICBCYXNlNjROb1BhZC5lbmNvZGUodG9Xcml0ZSwgYltdKTsKKyAgICAgIHRyYW5zXy53cml0ZShiWzAgLi4gdG9Xcml0ZS5sZW5ndGggKyAxXSk7CisgICAgICBidWYucG9wRnJvbnROKHRvV3JpdGUubGVuZ3RoKTsKKyAgICB9CisgICAgdHJhbnNfLndyaXRlKFNUUklOR19ERUxJTUlURVIpOworICB9CisKKyAgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtc2cpIHsKKyAgICB3cml0ZUpzb25BcnJheUJlZ2luKCk7CisgICAgd3JpdGVKc29uSW50ZWdlcihUSFJJRlRfSlNPTl9WRVJTSU9OKTsKKyAgICB3cml0ZVN0cmluZyhtc2cubmFtZSk7CisgICAgd3JpdGVKc29uSW50ZWdlcihjYXN0KGJ5dGUpbXNnLnR5cGUpOworICAgIHdyaXRlSnNvbkludGVnZXIobXNnLnNlcWlkKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkgeworICAgIHdyaXRlSnNvbkFycmF5RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCB0c3RydWN0KSB7CisgICAgd3JpdGVKc29uT2JqZWN0QmVnaW4oKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKSB7CisgICAgd3JpdGVKc29uT2JqZWN0RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHsKKyAgICB3cml0ZUpzb25JbnRlZ2VyKGZpZWxkLmlkKTsKKyAgICB3cml0ZUpzb25PYmplY3RCZWdpbigpOworICAgIHdyaXRlU3RyaW5nKGdldE5hbWVGcm9tVFR5cGUoZmllbGQudHlwZSkpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkRW5kKCkgeworICAgIHdyaXRlSnNvbk9iamVjdEVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHt9CisKKyAgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB7CisgICAgd3JpdGVKc29uQXJyYXlCZWdpbigpOworICAgIHdyaXRlU3RyaW5nKGdldE5hbWVGcm9tVFR5cGUobGlzdC5lbGVtVHlwZSkpOworICAgIHdyaXRlSnNvbkludGVnZXIobGlzdC5zaXplKTsKKyAgfQorCisgIHZvaWQgd3JpdGVMaXN0RW5kKCkgeworICAgIHdyaXRlSnNvbkFycmF5RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHsKKyAgICB3cml0ZUpzb25BcnJheUJlZ2luKCk7CisgICAgd3JpdGVTdHJpbmcoZ2V0TmFtZUZyb21UVHlwZShtYXAua2V5VHlwZSkpOworICAgIHdyaXRlU3RyaW5nKGdldE5hbWVGcm9tVFR5cGUobWFwLnZhbHVlVHlwZSkpOworICAgIHdyaXRlSnNvbkludGVnZXIobWFwLnNpemUpOworICAgIHdyaXRlSnNvbk9iamVjdEJlZ2luKCk7CisgIH0KKworICB2b2lkIHdyaXRlTWFwRW5kKCkgeworICAgIHdyaXRlSnNvbk9iamVjdEVuZCgpOworICAgIHdyaXRlSnNvbkFycmF5RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpIHsKKyAgICB3cml0ZUpzb25BcnJheUJlZ2luKCk7CisgICAgd3JpdGVTdHJpbmcoZ2V0TmFtZUZyb21UVHlwZShzZXQuZWxlbVR5cGUpKTsKKyAgICB3cml0ZUpzb25JbnRlZ2VyKHNldC5zaXplKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTZXRFbmQoKSB7CisgICAgd3JpdGVKc29uQXJyYXlFbmQoKTsKKyAgfQorCisKKyAgLyoKKyAgICogUmVhZGluZyBtZXRob2RzLgorICAgKi8KKworICBib29sIHJlYWRCb29sKCkgeworICAgIHJldHVybiByZWFkSnNvbkludGVnZXIhYnl0ZSgpID8gdHJ1ZSA6IGZhbHNlOworICB9CisKKyAgYnl0ZSByZWFkQnl0ZSgpIHsKKyAgICByZXR1cm4gcmVhZEpzb25JbnRlZ2VyIWJ5dGUoKTsKKyAgfQorCisgIHNob3J0IHJlYWRJMTYoKSB7CisgICAgcmV0dXJuIHJlYWRKc29uSW50ZWdlciFzaG9ydCgpOworICB9CisKKyAgaW50IHJlYWRJMzIoKSB7CisgICAgcmV0dXJuIHJlYWRKc29uSW50ZWdlciFpbnQoKTsKKyAgfQorCisgIGxvbmcgcmVhZEk2NCgpIHsKKyAgICByZXR1cm4gcmVhZEpzb25JbnRlZ2VyIWxvbmcoKTsKKyAgfQorCisgIGRvdWJsZSByZWFkRG91YmxlKCkgeworICAgIGNvbnRleHRfLnJlYWQocmVhZGVyXyk7CisKKyAgICBpZiAocmVhZGVyXy5wZWVrKCkgPT0gU1RSSU5HX0RFTElNSVRFUikgeworICAgICAgYXV0byBzdHIgPSByZWFkSnNvblN0cmluZyh0cnVlKTsKKyAgICAgIGlmIChzdHIgPT0gTkFOX1NUUklORykgeworICAgICAgICByZXR1cm4gZG91YmxlLm5hbjsKKyAgICAgIH0KKyAgICAgIGlmIChzdHIgPT0gSU5GSU5JVFlfU1RSSU5HKSB7CisgICAgICAgIHJldHVybiBkb3VibGUuaW5maW5pdHk7CisgICAgICB9CisgICAgICBpZiAoc3RyID09IE5FR19JTkZJTklUWV9TVFJJTkcpIHsKKyAgICAgICAgcmV0dXJuIC1kb3VibGUuaW5maW5pdHk7CisgICAgICB9CisKKyAgICAgIGlmICghY29udGV4dF8uZXNjYXBlTnVtKSB7CisgICAgICAgIC8vIFRocm93IGV4Y2VwdGlvbiAtLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluIHRoaXMgY2FzZQorICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIsCisgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVybiB0byFkb3VibGUoc3RyKTsKKyAgICAgIH0gY2F0Y2ggKENvbnZFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKGBFeHBlY3RlZCBudW1lcmljIHZhbHVlOyBnb3QgImAgfiBzdHIgfgorICAgICAgICAgIGAiLmAsIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLklOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKGNvbnRleHRfLmVzY2FwZU51bSkgeworICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgLSB3ZSBzaG91bGQgaGF2ZSBoYWQgYSBxdW90ZSBpZiBlc2NhcGVOdW0gPT0gdHJ1ZQorICAgICAgICByZWFkSnNvblN5bnRheENoYXIoU1RSSU5HX0RFTElNSVRFUik7CisgICAgICB9CisKKyAgICAgIGF1dG8gc3RyID0gcmVhZEpzb25OdW1lcmljQ2hhcnMoKTsKKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVybiB0byFkb3VibGUoc3RyKTsKKyAgICAgIH0gY2F0Y2ggKENvbnZFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKGBFeHBlY3RlZCBudW1lcmljIHZhbHVlOyBnb3QgImAgfiBzdHIgfgorICAgICAgICAgIGAiLmAsIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLklOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RyaW5nIHJlYWRTdHJpbmcoKSB7CisgICAgcmV0dXJuIHJlYWRKc29uU3RyaW5nKGZhbHNlKTsKKyAgfQorCisgIHVieXRlW10gcmVhZEJpbmFyeSgpIHsKKyAgICByZXR1cm4gQmFzZTY0Tm9QYWQuZGVjb2RlKHJlYWRTdHJpbmcoKSk7CisgIH0KKworICBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgeworICAgIFRNZXNzYWdlIG1zZyA9IHZvaWQ7CisKKyAgICByZWFkSnNvbkFycmF5QmVnaW4oKTsKKworICAgIGF1dG8gdmVyID0gcmVhZEpzb25JbnRlZ2VyIXNob3J0KCk7CisgICAgaWYgKHZlciAhPSBUSFJJRlRfSlNPTl9WRVJTSU9OKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iLAorICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5CQURfVkVSU0lPTik7CisgICAgfQorCisgICAgbXNnLm5hbWUgPSByZWFkU3RyaW5nKCk7CisgICAgbXNnLnR5cGUgPSBjYXN0KFRNZXNzYWdlVHlwZSlyZWFkSnNvbkludGVnZXIhYnl0ZSgpOworICAgIG1zZy5zZXFpZCA9IHJlYWRKc29uSW50ZWdlciFzaG9ydCgpOworCisgICAgcmV0dXJuIG1zZzsKKyAgfQorCisgIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB7CisgICAgcmVhZEpzb25BcnJheUVuZCgpOworICB9CisKKyAgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB7CisgICAgcmVhZEpzb25PYmplY3RCZWdpbigpOworICAgIHJldHVybiBUU3RydWN0KCk7CisgIH0KKworICB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB7CisgICAgcmVhZEpzb25PYmplY3RFbmQoKTsKKyAgfQorCisgIFRGaWVsZCByZWFkRmllbGRCZWdpbigpIHsKKyAgICBURmllbGQgZiA9IHZvaWQ7CisgICAgZi5uYW1lID0gbnVsbDsKKworICAgIGF1dG8gY2ggPSByZWFkZXJfLnBlZWsoKTsKKyAgICBpZiAoY2ggPT0gT0JKRUNUX0VORCkgeworICAgICAgZi50eXBlID0gVFR5cGUuU1RPUDsKKyAgICB9IGVsc2UgeworICAgICAgZi5pZCA9IHJlYWRKc29uSW50ZWdlciFzaG9ydCgpOworICAgICAgcmVhZEpzb25PYmplY3RCZWdpbigpOworICAgICAgZi50eXBlID0gZ2V0VFR5cGVGcm9tTmFtZShyZWFkU3RyaW5nKCkpOworICAgIH0KKworICAgIHJldHVybiBmOworICB9CisKKyAgdm9pZCByZWFkRmllbGRFbmQoKSB7CisgICAgcmVhZEpzb25PYmplY3RFbmQoKTsKKyAgfQorCisgIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB7CisgICAgcmVhZEpzb25BcnJheUJlZ2luKCk7CisgICAgYXV0byB0eXBlID0gZ2V0VFR5cGVGcm9tTmFtZShyZWFkU3RyaW5nKCkpOworICAgIGF1dG8gc2l6ZSA9IHJlYWRDb250YWluZXJTaXplKCk7CisgICAgcmV0dXJuIFRMaXN0KHR5cGUsIHNpemUpOworICB9CisKKyAgdm9pZCByZWFkTGlzdEVuZCgpIHsKKyAgICByZWFkSnNvbkFycmF5RW5kKCk7CisgIH0KKworICBUTWFwIHJlYWRNYXBCZWdpbigpIHsKKyAgICByZWFkSnNvbkFycmF5QmVnaW4oKTsKKyAgICBhdXRvIGtleVR5cGUgPSBnZXRUVHlwZUZyb21OYW1lKHJlYWRTdHJpbmcoKSk7CisgICAgYXV0byB2YWx1ZVR5cGUgPSBnZXRUVHlwZUZyb21OYW1lKHJlYWRTdHJpbmcoKSk7CisgICAgYXV0byBzaXplID0gcmVhZENvbnRhaW5lclNpemUoKTsKKyAgICByZWFkSnNvbk9iamVjdEJlZ2luKCk7CisgICAgcmV0dXJuIFRNYXAoa2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplKTsKKyAgfQorCisgIHZvaWQgcmVhZE1hcEVuZCgpIHsKKyAgICByZWFkSnNvbk9iamVjdEVuZCgpOworICAgIHJlYWRKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIFRTZXQgcmVhZFNldEJlZ2luKCkgeworICAgIHJlYWRKc29uQXJyYXlCZWdpbigpOworICAgIGF1dG8gdHlwZSA9IGdldFRUeXBlRnJvbU5hbWUocmVhZFN0cmluZygpKTsKKyAgICBhdXRvIHNpemUgPSByZWFkQ29udGFpbmVyU2l6ZSgpOworICAgIHJldHVybiBUU2V0KHR5cGUsIHNpemUpOworICB9CisKKyAgdm9pZCByZWFkU2V0RW5kKCkgeworICAgIHJlYWRKc29uQXJyYXlFbmQoKTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIHB1c2hDb250ZXh0KENvbnRleHQgYykgeworICAgIGNvbnRleHRTdGFja18gfj0gY29udGV4dF87CisgICAgY29udGV4dF8gPSBjOworICB9CisKKyAgdm9pZCBwb3BDb250ZXh0KCkgeworICAgIGNvbnRleHRfID0gY29udGV4dFN0YWNrXy5iYWNrOworICAgIGNvbnRleHRTdGFja18ucG9wQmFjaygpOworICAgIGNvbnRleHRTdGFja18uYXNzdW1lU2FmZUFwcGVuZCgpOworICB9CisKKyAgLyoKKyAgICogV3JpdGluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgLy8gV3JpdGUgdGhlIGNoYXJhY3RlciBjaCBhcyBhIEpzb24gZXNjYXBlIHNlcXVlbmNlICgiXHUwMHh4IikKKyAgdm9pZCB3cml0ZUpzb25Fc2NhcGVDaGFyKHVieXRlIGNoKSB7CisgICAgdHJhbnNfLndyaXRlKEVTQ0FQRV9QUkVGSVgpOworICAgIHRyYW5zXy53cml0ZShFU0NBUEVfUFJFRklYKTsKKyAgICBhdXRvIG91dENoID0gaGV4Q2hhcihjYXN0KHVieXRlKShjaCA+PiA0KSk7CisgICAgdHJhbnNfLndyaXRlKCgmb3V0Q2gpWzAgLi4gMV0pOworICAgIG91dENoID0gaGV4Q2hhcihjaCk7CisgICAgdHJhbnNfLndyaXRlKCgmb3V0Q2gpWzAgLi4gMV0pOworICB9CisKKyAgLy8gV3JpdGUgdGhlIGNoYXJhY3RlciBjaCBhcyBwYXJ0IG9mIGEgSnNvbiBzdHJpbmcsIGVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlLgorICB2b2lkIHdyaXRlSnNvbkNoYXIodWJ5dGUgY2gpIHsKKyAgICBpZiAoY2ggPj0gMHgzMCkgeworICAgICAgaWYgKGNoID09ICdcXCcpIHsgLy8gT25seSBzcGVjaWFsIGNoYXJhY3RlciA+PSAweDMwIGlzICdcJworICAgICAgICB0cmFuc18ud3JpdGUoQkFDS1NMQVNIKTsKKyAgICAgICAgdHJhbnNfLndyaXRlKEJBQ0tTTEFTSCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0cmFuc18ud3JpdGUoKCZjaClbMCAuLiAxXSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgYXV0byBvdXRDaCA9IGtKc29uQ2hhclRhYmxlW2NoXTsKKyAgICAgIC8vIENoZWNrIGlmIHJlZ3VsYXIgY2hhcmFjdGVyLCBiYWNrc2xhc2ggZXNjYXBlZCwgb3IgSnNvbiBlc2NhcGVkCisgICAgICBpZiAob3V0Q2ggPT0gMSkgeworICAgICAgICB0cmFuc18ud3JpdGUoKCZjaClbMCAuLiAxXSk7CisgICAgICB9IGVsc2UgaWYgKG91dENoID4gMSkgeworICAgICAgICB0cmFuc18ud3JpdGUoQkFDS1NMQVNIKTsKKyAgICAgICAgdHJhbnNfLndyaXRlKCgmb3V0Q2gpWzAgLi4gMV0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgd3JpdGVKc29uRXNjYXBlQ2hhcihjaCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gQ29udmVydCB0aGUgZ2l2ZW4gaW50ZWdlciB0eXBlIHRvIGEgSnNvbiBudW1iZXIsIG9yIGEgc3RyaW5nCisgIC8vIGlmIHRoZSBjb250ZXh0IHJlcXVpcmVzIGl0IChlZzoga2V5IGluIGEgbWFwIHBhaXIpLgorICB2b2lkIHdyaXRlSnNvbkludGVnZXIoVCkoVCBudW0pIGlmIChpc0ludGVncmFsIVQpIHsKKyAgICBjb250ZXh0Xy53cml0ZSh0cmFuc18pOworCisgICAgYXV0byBlc2NhcGVOdW0gPSBjb250ZXh0Xy5lc2NhcGVOdW0oKTsKKyAgICBpZiAoZXNjYXBlTnVtKSB0cmFuc18ud3JpdGUoU1RSSU5HX0RFTElNSVRFUik7CisgICAgdHJhbnNfLndyaXRlKGNhc3QodWJ5dGVbXSl0byFzdHJpbmcobnVtKSk7CisgICAgaWYgKGVzY2FwZU51bSkgdHJhbnNfLndyaXRlKFNUUklOR19ERUxJTUlURVIpOworICB9CisKKyAgdm9pZCB3cml0ZUpzb25PYmplY3RCZWdpbigpIHsKKyAgICBjb250ZXh0Xy53cml0ZSh0cmFuc18pOworICAgIHRyYW5zXy53cml0ZShPQkpFQ1RfQkVHSU4pOworICAgIHB1c2hDb250ZXh0KG5ldyBQYWlyQ29udGV4dCgpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVKc29uT2JqZWN0RW5kKCkgeworICAgIHBvcENvbnRleHQoKTsKKyAgICB0cmFuc18ud3JpdGUoT0JKRUNUX0VORCk7CisgIH0KKworICB2b2lkIHdyaXRlSnNvbkFycmF5QmVnaW4oKSB7CisgICAgY29udGV4dF8ud3JpdGUodHJhbnNfKTsKKyAgICB0cmFuc18ud3JpdGUoQVJSQVlfQkVHSU4pOworICAgIHB1c2hDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVKc29uQXJyYXlFbmQoKSB7CisgICAgcG9wQ29udGV4dCgpOworICAgIHRyYW5zXy53cml0ZShBUlJBWV9FTkQpOworICB9CisKKyAgLyoKKyAgICogUmVhZGluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgaW50IHJlYWRDb250YWluZXJTaXplKCkgeworICAgIGF1dG8gc2l6ZSA9IHJlYWRKc29uSW50ZWdlciFpbnQoKTsKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuTkVHQVRJVkVfU0laRSk7CisgICAgfSBlbHNlIGlmIChjb250YWluZXJTaXplTGltaXQgPiAwICYmIHNpemUgPiBjb250YWluZXJTaXplTGltaXQpIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuU0laRV9MSU1JVCk7CisgICAgfQorICAgIHJldHVybiBzaXplOworICB9CisKKyAgdm9pZCByZWFkSnNvblN5bnRheENoYXIodWJ5dGVbMV0gY2gpIHsKKyAgICByZXR1cm4gcmVhZFN5bnRheENoYXIocmVhZGVyXywgY2gpOworICB9CisKKyAgd2NoYXIgcmVhZEpzb25Fc2NhcGVDaGFyKCkgeworICAgIGF1dG8gYSA9IHJlYWRlcl8ucmVhZCgpOworICAgIGF1dG8gYiA9IHJlYWRlcl8ucmVhZCgpOworICAgIGF1dG8gYyA9IHJlYWRlcl8ucmVhZCgpOworICAgIGF1dG8gZCA9IHJlYWRlcl8ucmVhZCgpOworICAgIHJldHVybiBjYXN0KHVzaG9ydCkoCisgICAgICAgICAgKGhleFZhbChhWzBdKSA8PCAxMikgKyAoaGV4VmFsKGJbMF0pIDw8IDgpICsKKyAgICAgICAgICAoaGV4VmFsKGNbMF0pIDw8IDQpICsgaGV4VmFsKGRbMF0pCisgICAgICAgICk7CisgIH0KKworICBzdHJpbmcgcmVhZEpzb25TdHJpbmcoYm9vbCBza2lwQ29udGV4dCA9IGZhbHNlKSB7CisgICAgaWYgKCFza2lwQ29udGV4dCkgY29udGV4dF8ucmVhZChyZWFkZXJfKTsKKworICAgIHJlYWRKc29uU3ludGF4Q2hhcihTVFJJTkdfREVMSU1JVEVSKTsKKyAgICBhdXRvIGJ1ZmZlciA9IGFwcGVuZGVyIXN0cmluZygpOworCisgICAgd2NoYXJbXSB3Y2hzOworICAgIGludCBieXRlc1JlYWQ7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGF1dG8gY2ggPSByZWFkZXJfLnJlYWQoKTsKKyAgICAgIGlmIChjaCA9PSBTVFJJTkdfREVMSU1JVEVSKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICArK2J5dGVzUmVhZDsKKyAgICAgIGlmIChzdHJpbmdTaXplTGltaXQgPiAwICYmIGJ5dGVzUmVhZCA+IHN0cmluZ1NpemVMaW1pdCkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLlNJWkVfTElNSVQpOworICAgICAgfQorCisgICAgICBpZiAoY2ggPT0gQkFDS1NMQVNIKSB7CisgICAgICAgIGNoID0gcmVhZGVyXy5yZWFkKCk7CisgICAgICAgIGlmIChjaCA9PSBFU0NBUEVfQ0hBUikgeworICAgICAgICAgIGF1dG8gd2NoID0gcmVhZEpzb25Fc2NhcGVDaGFyKCk7CisgICAgICAgICAgaWYgKHdjaCA+PSAweEQ4MDAgJiYgd2NoIDw9IDB4REJGRikgeworICAgICAgICAgICAgd2NocyB+PSB3Y2g7CisgICAgICAgICAgfSBlbHNlIGlmICh3Y2ggPj0gMHhEQzAwICYmIHdjaCA8PSAweERGRkYgJiYgd2Nocy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiTWlzc2luZyBVVEYtMTYgaGlnaCBzdXJyb2dhdGUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9EQVRBKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2NocyB+PSB3Y2g7CisgICAgICAgICAgICBidWZmZXIucHV0KHdjaHMudG9VVEY4KTsKKyAgICAgICAgICAgIHdjaHMgPSBbXTsKKyAgICAgICAgICB9CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXV0byBwb3MgPSBjb3VudFVudGlsKGtFc2NhcGVDaGFyc1tdLCBjaFswXSk7CisgICAgICAgICAgaWYgKHBvcyA9PSAtMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiRXhwZWN0ZWQgY29udHJvbCBjaGFyLCBnb3QgJyIgfgorICAgICAgICAgICAgICBjYXN0KGNoYXIpY2hbMF0gfiAiJy4iLCBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5JTlZBTElEX0RBVEEpOworICAgICAgICAgIH0KKyAgICAgICAgICBjaCA9IGtFc2NhcGVDaGFyVmFsc1twb3NdOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAod2Nocy5sZW5ndGggIT0gMCkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJNaXNzaW5nIFVURi0xNiBsb3cgc3Vycm9nYXRlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICAgIGJ1ZmZlci5wdXQoY2hbMF0pOworICAgIH0KKworICAgIGlmICh3Y2hzLmxlbmd0aCAhPSAwKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJNaXNzaW5nIFVURi0xNiBsb3cgc3Vycm9nYXRlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLklOVkFMSURfREFUQSk7CisgICAgfQorICAgIHJldHVybiBidWZmZXIuZGF0YTsKKyAgfQorCisgIC8vIFJlYWRzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycywgc3RvcHBpbmcgYXQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzIG5vdAorICAvLyBhIHZhbGlkIEpzb24gbnVtZXJpYyBjaGFyYWN0ZXIuCisgIHN0cmluZyByZWFkSnNvbk51bWVyaWNDaGFycygpIHsKKyAgICBzdHJpbmcgc3RyOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBhdXRvIGNoID0gcmVhZGVyXy5wZWVrKCk7CisgICAgICBpZiAoIWlzSnNvbk51bWVyaWMoY2hbMF0pKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcmVhZGVyXy5yZWFkKCk7CisgICAgICBzdHIgfj0gY2g7CisgICAgfQorICAgIHJldHVybiBzdHI7CisgIH0KKworICAvLyBSZWFkcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYW5kIGFzc2VtYmxlcyB0aGVtIGludG8gYSBudW1iZXIsCisgIC8vIHJldHVybmluZyB0aGVtIHZpYSBudW0KKyAgVCByZWFkSnNvbkludGVnZXIoVCkoKSBpZiAoaXNJbnRlZ3JhbCFUKSB7CisgICAgY29udGV4dF8ucmVhZChyZWFkZXJfKTsKKyAgICBpZiAoY29udGV4dF8uZXNjYXBlTnVtKCkpIHsKKyAgICAgIHJlYWRKc29uU3ludGF4Q2hhcihTVFJJTkdfREVMSU1JVEVSKTsKKyAgICB9CisgICAgYXV0byBzdHIgPSByZWFkSnNvbk51bWVyaWNDaGFycygpOworICAgIFQgbnVtOworICAgIHRyeSB7CisgICAgICBudW0gPSB0byFUKHN0cik7CisgICAgfSBjYXRjaCAoQ29udkV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKGBFeHBlY3RlZCBudW1lcmljIHZhbHVlLCBnb3QgImAgfiBzdHIgfiBgIi5gLAorICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5JTlZBTElEX0RBVEEpOworICAgIH0KKyAgICBpZiAoY29udGV4dF8uZXNjYXBlTnVtKCkpIHsKKyAgICAgIHJlYWRKc29uU3ludGF4Q2hhcihTVFJJTkdfREVMSU1JVEVSKTsKKyAgICB9CisgICAgcmV0dXJuIG51bTsKKyAgfQorCisgIHZvaWQgcmVhZEpzb25PYmplY3RCZWdpbigpIHsKKyAgICBjb250ZXh0Xy5yZWFkKHJlYWRlcl8pOworICAgIHJlYWRKc29uU3ludGF4Q2hhcihPQkpFQ1RfQkVHSU4pOworICAgIHB1c2hDb250ZXh0KG5ldyBQYWlyQ29udGV4dCgpKTsKKyAgfQorCisgIHZvaWQgcmVhZEpzb25PYmplY3RFbmQoKSB7CisgICAgcmVhZEpzb25TeW50YXhDaGFyKE9CSkVDVF9FTkQpOworICAgIHBvcENvbnRleHQoKTsKKyAgfQorCisgIHZvaWQgcmVhZEpzb25BcnJheUJlZ2luKCkgeworICAgIGNvbnRleHRfLnJlYWQocmVhZGVyXyk7CisgICAgcmVhZEpzb25TeW50YXhDaGFyKEFSUkFZX0JFR0lOKTsKKyAgICBwdXNoQ29udGV4dChuZXcgTGlzdENvbnRleHQoKSk7CisgIH0KKworICB2b2lkIHJlYWRKc29uQXJyYXlFbmQoKSB7CisgICAgcmVhZEpzb25TeW50YXhDaGFyKEFSUkFZX0VORCk7CisgICAgcG9wQ29udGV4dCgpOworICB9CisKKyAgc3RhdGljIHsKKyAgICBmaW5hbCBjbGFzcyBMb29rYWhlYWRSZWFkZXIgeworICAgICAgdGhpcyhUcmFuc3BvcnQgdHJhbnMpIHsKKyAgICAgICAgdHJhbnNfID0gdHJhbnM7CisgICAgICB9CisKKyAgICAgIHVieXRlWzFdIHJlYWQoKSB7CisgICAgICAgIGlmIChoYXNEYXRhXykgeworICAgICAgICAgIGhhc0RhdGFfID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdHJhbnNfLnJlYWRBbGwoZGF0YV8pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkYXRhXzsKKyAgICAgIH0KKworICAgICAgdWJ5dGVbMV0gcGVlaygpIHsKKyAgICAgICAgaWYgKCFoYXNEYXRhXykgeworICAgICAgICAgIHRyYW5zXy5yZWFkQWxsKGRhdGFfKTsKKyAgICAgICAgICBoYXNEYXRhXyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRhdGFfOworICAgICAgfQorCisgICAgIHByaXZhdGU6CisgICAgICBUcmFuc3BvcnQgdHJhbnNfOworICAgICAgYm9vbCBoYXNEYXRhXzsKKyAgICAgIHVieXRlWzFdIGRhdGFfOworICAgIH0KKworICAgIC8qCisgICAgICogQ2xhc3MgdG8gc2VydmUgYXMgYmFzZSBKc29uIGNvbnRleHQgYW5kIGFzIGJhc2UgY2xhc3MgZm9yIG90aGVyIGNvbnRleHQKKyAgICAgKiBpbXBsZW1lbnRhdGlvbnMKKyAgICAgKi8KKyAgICBjbGFzcyBDb250ZXh0IHsKKyAgICAgIC8qKgorICAgICAgICogV3JpdGUgY29udGV4dCBkYXRhIHRvIHRoZSB0cmFuc3BvcnQuIERlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4KKyAgICAgICAqLworICAgICAgdm9pZCB3cml0ZShUcmFuc3BvcnQgdHJhbnMpIHt9CisKKyAgICAgIC8qKgorICAgICAgICogUmVhZCBjb250ZXh0IGRhdGEgZnJvbSB0aGUgdHJhbnNwb3J0LiBEZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuCisgICAgICAgKi8KKyAgICAgIHZvaWQgcmVhZChMb29rYWhlYWRSZWFkZXIgcmVhZGVyKSB7fQorCisgICAgICAvKioKKyAgICAgICAqIFJldHVybiB0cnVlIGlmIG51bWJlcnMgbmVlZCB0byBiZSBlc2NhcGVkIGFzIHN0cmluZ3MgaW4gdGhpcyBjb250ZXh0LgorICAgICAgICogRGVmYXVsdCBiZWhhdmlvciBpcyB0byByZXR1cm4gZmFsc2UuCisgICAgICAgKi8KKyAgICAgIGJvb2wgZXNjYXBlTnVtKCkgQHByb3BlcnR5IHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIC8vIENvbnRleHQgY2xhc3MgZm9yIG9iamVjdCBtZW1iZXIga2V5LXZhbHVlIHBhaXJzCisgICAgY2xhc3MgUGFpckNvbnRleHQgOiBDb250ZXh0IHsKKyAgICAgIHRoaXMoKSB7CisgICAgICAgIGZpcnN0XyA9IHRydWU7CisgICAgICAgIGNvbG9uXyA9IHRydWU7CisgICAgICB9CisKKyAgICAgIG92ZXJyaWRlIHZvaWQgd3JpdGUoVHJhbnNwb3J0IHRyYW5zKSB7CisgICAgICAgIGlmIChmaXJzdF8pIHsKKyAgICAgICAgICBmaXJzdF8gPSBmYWxzZTsKKyAgICAgICAgICBjb2xvbl8gPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRyYW5zLndyaXRlKGNvbG9uXyA/IFBBSVJfU0VQIDogRUxFTV9TRVApOworICAgICAgICAgIGNvbG9uXyA9ICFjb2xvbl87CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgb3ZlcnJpZGUgdm9pZCByZWFkKExvb2thaGVhZFJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgaWYgKGZpcnN0XykgeworICAgICAgICAgIGZpcnN0XyA9IGZhbHNlOworICAgICAgICAgIGNvbG9uXyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXV0byBjaCA9IChjb2xvbl8gPyBQQUlSX1NFUCA6IEVMRU1fU0VQKTsKKyAgICAgICAgICBjb2xvbl8gPSAhY29sb25fOworICAgICAgICAgIHJldHVybiByZWFkU3ludGF4Q2hhcihyZWFkZXIsIGNoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBOdW1iZXJzIG11c3QgYmUgdHVybmVkIGludG8gc3RyaW5ncyBpZiB0aGV5IGFyZSB0aGUga2V5IHBhcnQgb2YgYSBwYWlyCisgICAgICBvdmVycmlkZSBib29sIGVzY2FwZU51bSgpIEBwcm9wZXJ0eSB7CisgICAgICAgIHJldHVybiBjb2xvbl87CisgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgYm9vbCBmaXJzdF87CisgICAgICBib29sIGNvbG9uXzsKKyAgICB9CisKKyAgICBjbGFzcyBMaXN0Q29udGV4dCA6IENvbnRleHQgeworICAgICAgdGhpcygpIHsKKyAgICAgICAgZmlyc3RfID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgb3ZlcnJpZGUgdm9pZCB3cml0ZShUcmFuc3BvcnQgdHJhbnMpIHsKKyAgICAgICAgaWYgKGZpcnN0XykgeworICAgICAgICAgIGZpcnN0XyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRyYW5zLndyaXRlKEVMRU1fU0VQKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBvdmVycmlkZSB2b2lkIHJlYWQoTG9va2FoZWFkUmVhZGVyIHJlYWRlcikgeworICAgICAgICBpZiAoZmlyc3RfKSB7CisgICAgICAgICAgZmlyc3RfID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVhZFN5bnRheENoYXIocmVhZGVyLCBFTEVNX1NFUCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICBib29sIGZpcnN0XzsKKyAgICB9CisKKyAgICAvLyBSZWFkIDEgY2hhcmFjdGVyIGZyb20gdGhlIHRyYW5zcG9ydCB0cmFucyBhbmQgdmVyaWZ5IHRoYXQgaXQgaXMgdGhlCisgICAgLy8gZXhwZWN0ZWQgY2hhcmFjdGVyIGNoLgorICAgIC8vIFRocm93IGEgcHJvdG9jb2wgZXhjZXB0aW9uIGlmIGl0IGlzIG5vdC4KKyAgICB2b2lkIHJlYWRTeW50YXhDaGFyKExvb2thaGVhZFJlYWRlciByZWFkZXIsIHVieXRlWzFdIGNoKSB7CisgICAgICBhdXRvIGNoMiA9IHJlYWRlci5yZWFkKCk7CisgICAgICBpZiAoY2gyICE9IGNoKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkV4cGVjdGVkICciIH4gY2FzdChjaGFyKWNoWzBdIH4gIicsIGdvdCAnIiB+CisgICAgICAgICAgY2FzdChjaGFyKWNoMlswXSB+ICInLiIsIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLklOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gUHJvYmFibHkgbmVlZCB0byBpbXBsZW1lbnQgYSBiZXR0ZXIgc3RhY2sgYXQgc29tZSBwb2ludC4KKyAgQ29udGV4dFtdIGNvbnRleHRTdGFja187CisgIENvbnRleHQgY29udGV4dF87CisKKyAgVHJhbnNwb3J0IHRyYW5zXzsKKyAgTG9va2FoZWFkUmVhZGVyIHJlYWRlcl87Cit9CisKKy8qKgorICogVEpzb25Qcm90b2NvbCBjb25zdHJ1Y3Rpb24gaGVscGVyIHRvIGF2b2lkIGhhdmluZyB0byBleHBsaWNpdGx5IHNwZWNpZnkKKyAqIHRoZSB0cmFuc3BvcnQgdHlwZSwgaS5lLiB0byBhbGxvdyB0aGUgY29uc3RydWN0b3IgYmVpbmcgY2FsbGVkIHVzaW5nIElGVEkKKyAqIChzZWUgJChMSU5LMiBodHRwOi8vZC5wdXJlbWFnaWMuY29tL2lzc3Vlcy9zaG93X2J1Zy5jZ2k/aWQ9NjA4MiwgRCBCdWd6aWxsYQorICogZW5oYW5jZW1lbnQgcmVxdWV0IDYwODIpKS4KKyAqLworVEpzb25Qcm90b2NvbCFUcmFuc3BvcnQgdEpzb25Qcm90b2NvbChUcmFuc3BvcnQpKFRyYW5zcG9ydCB0cmFucywKKyAgaW50IGNvbnRhaW5lclNpemVMaW1pdCA9IDAsIGludCBzdHJpbmdTaXplTGltaXQgPSAwCispIGlmIChpc1RUcmFuc3BvcnQhVHJhbnNwb3J0KSB7CisgIHJldHVybiBuZXcgVEpzb25Qcm90b2NvbCFUcmFuc3BvcnQodHJhbnMsIGNvbnRhaW5lclNpemVMaW1pdCwgc3RyaW5nU2l6ZUxpbWl0KTsKK30KKwordW5pdHRlc3QgeworICBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKKyAgaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworCisgIC8vIENoZWNrIHRoZSBtZXNzYWdlIGhlYWRlciBmb3JtYXQuCisgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIGF1dG8ganNvbiA9IHRKc29uUHJvdG9jb2woYnVmKTsKKyAganNvbi53cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSgiZm9vIiwgVE1lc3NhZ2VUeXBlLkNBTEwsIDApKTsKKyAganNvbi53cml0ZU1lc3NhZ2VFbmQoKTsKKworICBhdXRvIGhlYWRlciA9IG5ldyB1Ynl0ZVsxM107CisgIGJ1Zi5yZWFkQWxsKGhlYWRlcik7CisgIGVuZm9yY2UoY2FzdChjaGFyW10paGVhZGVyID09IGBbMSwiZm9vIiwxLDBdYCk7Cit9CisKK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHN0ZC5leGNlcHRpb247CisgIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKKworICAvLyBDaGVjayB0aGF0IHNob3J0IGJpbmFyeSBkYXRhIGlzIHJlYWQgY29ycmVjdGx5ICh0aGUgVGhyaWZ0IEpTT04gZm9ybWF0CisgIC8vIGRvZXMgbm90IGluY2x1ZGUgcGFkZGluZyBjaGFycyBpbiB0aGUgQmFzZTY0IGVuY29kZWQgZGF0YSkuCisgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIGF1dG8ganNvbiA9IHRKc29uUHJvdG9jb2woYnVmKTsKKyAganNvbi53cml0ZUJpbmFyeShbMSwgMl0pOworICBqc29uLnJlc2V0KCk7CisgIGVuZm9yY2UoanNvbi5yZWFkQmluYXJ5KCkgPT0gWzEsIDJdKTsKK30KKwordW5pdHRlc3QgeworICBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKKyAgaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworCisgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoY2FzdCh1Ynl0ZVtdKSJcIlxcdTBlMDEgXFx1ZDgzNVxcdWRkM2VcIiIpOworICBhdXRvIGpzb24gPSB0SnNvblByb3RvY29sKGJ1Zik7CisgIGF1dG8gc3RyID0ganNvbi5yZWFkU3RyaW5nKCk7CisgIGVuZm9yY2Uoc3RyID09ICLguIEg8J2UviIpOworfQorCit1bml0dGVzdCB7CisgIC8vIFRocm93biBpZiBsb3cgc3Vycm9nYXRlIGlzIG1pc3NpbmcuCisgIGltcG9ydCBzdGQuZXhjZXB0aW9uOworICBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7CisKKyAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcihjYXN0KHVieXRlW10pIlwiXFx1MGUwMSBcXHVkODM1XCIiKTsKKyAgYXV0byBqc29uID0gdEpzb25Qcm90b2NvbChidWYpOworICBhc3NlcnRUaHJvd24hVFByb3RvY29sRXhjZXB0aW9uKGpzb24ucmVhZFN0cmluZygpKTsKK30KKwordW5pdHRlc3QgeworICAvLyBUaHJvd24gaWYgaGlnaCBzdXJyb2dhdGUgaXMgbWlzc2luZy4KKyAgaW1wb3J0IHN0ZC5leGNlcHRpb247CisgIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKKworICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKGNhc3QodWJ5dGVbXSkiXCJcXHUwZTAxIFxcdWRkM2VcIiIpOworICBhdXRvIGpzb24gPSB0SnNvblByb3RvY29sKGJ1Zik7CisgIGFzc2VydFRocm93biFUUHJvdG9jb2xFeGNlcHRpb24oanNvbi5yZWFkU3RyaW5nKCkpOworfQorCit1bml0dGVzdCB7CisgIGltcG9ydCB0aHJpZnQuaW50ZXJuYWwudGVzdC5wcm90b2NvbDsKKyAgdGVzdENvbnRhaW5lclNpemVMaW1pdCEoVEpzb25Qcm90b2NvbCEoKSkoKTsKKyAgdGVzdFN0cmluZ1NpemVMaW1pdCEoVEpzb25Qcm90b2NvbCEoKSkoKTsKK30KKworLyoqCisgKiBUUHJvdG9jb2xGYWN0b3J5IGNyZWF0aW5nIGEgVEpzb25Qcm90b2NvbCBpbnN0YW5jZSBmb3IgcGFzc2VkIGluCisgKiB0cmFuc3BvcnRzLgorICoKKyAqIFRoZSBvcHRpb25hbCBUcmFuc3BvcnRzIHRlbXBsYXRlIHR1cGxlIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5CisgKiBvbmUgb3IgbW9yZSBUVHJhbnNwb3J0IGltcGxlbWVudGF0aW9ucyB0byBzcGVjaWZpY2FsbHkgaW5zdGFudGlhdGUKKyAqIFRKc29uUHJvdG9jb2wgZm9yLiBJZiB0aGUgYWN0dWFsIHRyYW5zcG9ydCB0eXBlcyBlbmNvdW50ZXJlZCBhdAorICogcnVudGltZSBtYXRjaCBvbmUgb2YgdGhlIHRyYW5zcG9ydHMgaW4gdGhlIGxpc3QsIGEgc3BlY2lhbGl6ZWQgcHJvdG9jb2wKKyAqIGluc3RhbmNlIGlzIGNyZWF0ZWQuIE90aGVyd2lzZSwgYSBnZW5lcmljIFRUcmFuc3BvcnQgdmVyc2lvbiBpcyB1c2VkLgorICovCitjbGFzcyBUSnNvblByb3RvY29sRmFjdG9yeShUcmFuc3BvcnRzLi4uKSBpZiAoCisgIGFsbFNhdGlzZnkhKGlzVFRyYW5zcG9ydCwgVHJhbnNwb3J0cykKKykgOiBUUHJvdG9jb2xGYWN0b3J5IHsKKyAgVFByb3RvY29sIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpIGNvbnN0IHsKKyAgICBmb3JlYWNoIChUcmFuc3BvcnQ7IFR5cGVUdXBsZSEoVHJhbnNwb3J0cywgVFRyYW5zcG9ydCkpIHsKKyAgICAgIGF1dG8gY29uY3JldGVUcmFucyA9IGNhc3QoVHJhbnNwb3J0KXRyYW5zOworICAgICAgaWYgKGNvbmNyZXRlVHJhbnMpIHsKKyAgICAgICAgYXV0byBwID0gbmV3IFRKc29uUHJvdG9jb2whVHJhbnNwb3J0KGNvbmNyZXRlVHJhbnMpOworICAgICAgICByZXR1cm4gcDsKKyAgICAgIH0KKyAgICB9CisgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICJQYXNzZWQgbnVsbCB0cmFuc3BvcnQgdG8gVEpzb25Qcm90b2NvbEZhY3RveS4iKTsKKyAgfQorfQorCitwcml2YXRlIHsKKyAgaW1tdXRhYmxlIHVieXRlWzFdIE9CSkVDVF9CRUdJTiA9ICd7JzsKKyAgaW1tdXRhYmxlIHVieXRlWzFdIE9CSkVDVF9FTkQgPSAnfSc7CisgIGltbXV0YWJsZSB1Ynl0ZVsxXSBBUlJBWV9CRUdJTiA9ICdbJzsKKyAgaW1tdXRhYmxlIHVieXRlWzFdIEFSUkFZX0VORCA9ICddJzsKKyAgaW1tdXRhYmxlIHVieXRlWzFdIE5FV0xJTkUgPSAnXG4nOworICBpbW11dGFibGUgdWJ5dGVbMV0gUEFJUl9TRVAgPSAnOic7CisgIGltbXV0YWJsZSB1Ynl0ZVsxXSBFTEVNX1NFUCA9ICcsJzsKKyAgaW1tdXRhYmxlIHVieXRlWzFdIEJBQ0tTTEFTSCA9ICdcXCc7CisgIGltbXV0YWJsZSB1Ynl0ZVsxXSBTVFJJTkdfREVMSU1JVEVSID0gJyInOworICBpbW11dGFibGUgdWJ5dGVbMV0gWkVST19DSEFSID0gJzAnOworICBpbW11dGFibGUgdWJ5dGVbMV0gRVNDQVBFX0NIQVIgPSAndSc7CisgIGltbXV0YWJsZSB1Ynl0ZVs0XSBFU0NBUEVfUFJFRklYID0gY2FzdCh1Ynl0ZVs0XSlyIlx1MDAiOworCisgIGVudW0gVEhSSUZUX0pTT05fVkVSU0lPTiA9IDE7CisKKyAgaW1tdXRhYmxlIE5BTl9TVFJJTkcgPSAiTmFOIjsKKyAgaW1tdXRhYmxlIElORklOSVRZX1NUUklORyA9ICJJbmZpbml0eSI7CisgIGltbXV0YWJsZSBORUdfSU5GSU5JVFlfU1RSSU5HID0gIi1JbmZpbml0eSI7CisKKyAgc3RyaW5nIGdldE5hbWVGcm9tVFR5cGUoVFR5cGUgdHlwZUlEKSB7CisgICAgZmluYWwgc3dpdGNoICh0eXBlSUQpIHsKKyAgICAgIGNhc2UgVFR5cGUuQk9PTDoKKyAgICAgICAgcmV0dXJuICJ0ZiI7CisgICAgICBjYXNlIFRUeXBlLkJZVEU6CisgICAgICAgIHJldHVybiAiaTgiOworICAgICAgY2FzZSBUVHlwZS5JMTY6CisgICAgICAgIHJldHVybiAiaTE2IjsKKyAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICByZXR1cm4gImkzMiI7CisgICAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgICAgcmV0dXJuICJpNjQiOworICAgICAgY2FzZSBUVHlwZS5ET1VCTEU6CisgICAgICAgIHJldHVybiAiZGJsIjsKKyAgICAgIGNhc2UgVFR5cGUuU1RSSU5HOgorICAgICAgICByZXR1cm4gInN0ciI7CisgICAgICBjYXNlIFRUeXBlLlNUUlVDVDoKKyAgICAgICAgcmV0dXJuICJyZWMiOworICAgICAgY2FzZSBUVHlwZS5NQVA6CisgICAgICAgIHJldHVybiAibWFwIjsKKyAgICAgIGNhc2UgVFR5cGUuTElTVDoKKyAgICAgICAgcmV0dXJuICJsc3QiOworICAgICAgY2FzZSBUVHlwZS5TRVQ6CisgICAgICAgIHJldHVybiAic2V0IjsKKyAgICAgIGNhc2UgVFR5cGUuU1RPUDogZ290byBjYXNlOworICAgICAgY2FzZSBUVHlwZS5WT0lEOgorICAgICAgICBhc3NlcnQoZmFsc2UsICJJbnZhbGlkIHR5cGUgcGFzc2VkLiIpOworICAgIH0KKyAgfQorCisgIFRUeXBlIGdldFRUeXBlRnJvbU5hbWUoc3RyaW5nIG5hbWUpIHsKKyAgICBUVHlwZSByZXN1bHQ7CisgICAgaWYgKG5hbWUubGVuZ3RoID4gMSkgeworICAgICAgc3dpdGNoIChuYW1lWzBdKSB7CisgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkRPVUJMRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgc3dpdGNoIChuYW1lWzFdKSB7CisgICAgICAgICAgICBjYXNlICc4JzoKKyAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuQllURTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcxJzoKKyAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuSTE2OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJzMnOgorICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5JMzI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnNic6CisgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkk2NDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nLgorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnbCc6CisgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuTElTVDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuTUFQOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICByZXN1bHQgPSBUVHlwZS5TVFJVQ1Q7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgIGlmIChuYW1lWzFdID09ICd0JykgeworICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuU1RSSU5HOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChuYW1lWzFdID09ICdlJykgeworICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuU0VUOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuQk9PTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAvLyBEbyBub3RoaW5nLgorICAgICAgfQorICAgIH0KKyAgICBpZiAocmVzdWx0ID09IFRUeXBlLlNUT1ApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIlVucmVjb2duaXplZCB0eXBlIiwKKyAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuTk9UX0lNUExFTUVOVEVEKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8vIFRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBoYW5kbGluZyBmb3IgdGhlIGZpcnN0IDB4MzAgY2hhcmFjdGVycworICAvLyAgMCA6IGVzY2FwZSB1c2luZyAiXHUwMHh4IiBub3RhdGlvbgorICAvLyAgMSA6IGp1c3Qgb3V0cHV0IGluZGV4CisgIC8vIDxvdGhlcj4gOiBlc2NhcGUgdXNpbmcgIlw8b3RoZXI+IiBub3RhdGlvbgorICBpbW11dGFibGUgdWJ5dGVbMHgzMF0ga0pzb25DaGFyVGFibGUgPSBbCisgIC8vICAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICAgQSAgIEIgICBDICAgRCAgIEUgICBGCisgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwnYicsJ3QnLCduJywgIDAsJ2YnLCdyJywgIDAsICAwLCAvLyAwCisgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvLyAxCisgICAgICAxLCAgMSwnIicsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAvLyAyCisgIF07CisKKyAgLy8gVGhpcyBzdHJpbmcncyBjaGFyYWN0ZXJzIG11c3QgbWF0Y2ggdXAgd2l0aCB0aGUgZWxlbWVudHMgaW4ga0VzY2FwZUNoYXJWYWxzLgorICAvLyBJIGRvbid0IGhhdmUgJy8nIG9uIHRoaXMgbGlzdCBldmVuIHRob3VnaCBpdCBhcHBlYXJzIG9uIHd3dy5qc29uLm9yZyAtLQorICAvLyBpdCBpcyBub3QgaW4gdGhlIFJGQworICBpbW11dGFibGUga0VzY2FwZUNoYXJzID0gY2FzdCh1Ynl0ZVs3XSkgYCJcXGJmbnJ0YDsKKworICAvLyBUaGUgZWxlbWVudHMgb2YgdGhpcyBhcnJheSBtdXN0IG1hdGNoIHVwIHdpdGggdGhlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgaW4KKyAgLy8ga0VzY2FwZUNoYXJzCisgIGltbXV0YWJsZSB1Ynl0ZVs3XSBrRXNjYXBlQ2hhclZhbHMgPSBbCisgICAgJyInLCAnXFwnLCAnXGInLCAnXGYnLCAnXG4nLCAnXHInLCAnXHQnLAorICBdOworCisgIC8vIFJldHVybiB0aGUgaW50ZWdlciB2YWx1ZSBvZiBhIGhleCBjaGFyYWN0ZXIgY2guCisgIC8vIFRocm93IGEgcHJvdG9jb2wgZXhjZXB0aW9uIGlmIHRoZSBjaGFyYWN0ZXIgaXMgbm90IFswLTlhLWZdLgorICB1Ynl0ZSBoZXhWYWwodWJ5dGUgY2gpIHsKKyAgICBpZiAoKGNoID49ICcwJykgJiYgKGNoIDw9ICc5JykpIHsKKyAgICAgIHJldHVybiBjYXN0KHVieXRlKShjaCAtICcwJyk7CisgICAgfSBlbHNlIGlmICgoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ2YnKSkgeworICAgICAgcmV0dXJuIGNhc3QodWJ5dGUpKGNoIC0gJ2EnICsgMTApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkV4cGVjdGVkIGhleCB2YWwgKFswLTlhLWZdKSwgZ290ICciIH4KKyAgICAgICAgY2ggfiAiJy4iLCBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5JTlZBTElEX0RBVEEpOworICAgIH0KKyAgfQorCisgIC8vIFJldHVybiB0aGUgaGV4IGNoYXJhY3RlciByZXByZXNlbnRpbmcgdGhlIGludGVnZXIgdmFsLiBUaGUgdmFsdWUgaXMgbWFza2VkCisgIC8vIHRvIG1ha2Ugc3VyZSBpdCBpcyBpbiB0aGUgY29ycmVjdCByYW5nZS4KKyAgdWJ5dGUgaGV4Q2hhcih1Ynl0ZSB2YWwpIHsKKyAgICB2YWwgJj0gMHgwRjsKKyAgICBpZiAodmFsIDwgMTApIHsKKyAgICAgIHJldHVybiBjYXN0KHVieXRlKSh2YWwgKyAnMCcpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gY2FzdCh1Ynl0ZSkodmFsIC0gMTAgKyAnYScpOworICAgIH0KKyAgfQorCisgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgY2ggaXMgaW4gWy0rMC05LkVlXTsgZmFsc2Ugb3RoZXJ3aXNlCisgIGJvb2wgaXNKc29uTnVtZXJpYyh1Ynl0ZSBjaCkgeworICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgIGNhc2UgJysnOgorICAgICAgY2FzZSAnLSc6CisgICAgICBjYXNlICcuJzoKKyAgICAgIGNhc2UgJzAnOgorICAgICAgY2FzZSAnMSc6CisgICAgICBjYXNlICcyJzoKKyAgICAgIGNhc2UgJzMnOgorICAgICAgY2FzZSAnNCc6CisgICAgICBjYXNlICc1JzoKKyAgICAgIGNhc2UgJzYnOgorICAgICAgY2FzZSAnNyc6CisgICAgICBjYXNlICc4JzoKKyAgICAgIGNhc2UgJzknOgorICAgICAgY2FzZSAnRSc6CisgICAgICBjYXNlICdlJzoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL3Byb2Nlc3Nvci5kIGIvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9wcm9jZXNzb3IuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODc0MjFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9wcm9jZXNzb3IuZApAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5wcm90b2NvbC5wcm9jZXNzb3I7CisKKy8vIFVzZSBzZWxlY3RpdmUgaW1wb3J0IG9uY2UgRE1EIEBAQlVHMzE0QEAgaXMgZml4ZWQuCitpbXBvcnQgc3RkLnZhcmlhbnQgLysgOiBWYXJpYW50ICsvOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKKworLyoqCisgKiBBIHByb2Nlc3NvciBpcyBhIGdlbmVyaWMgb2JqZWN0IHdoaWNoIG9wZXJhdGVzIHVwb24gYW4gaW5wdXQgc3RyZWFtIGFuZAorICogd3JpdGVzIHRvIHNvbWUgb3V0cHV0IHN0cmVhbS4KKyAqCisgKiBUaGUgZGVmaW5pdGlvbiBvZiB0aGlzIG9iamVjdCBpcyBsb29zZSwgdGhvdWdoIHRoZSB0eXBpY2FsIGNhc2UgaXMgZm9yIHNvbWUKKyAqIHNvcnQgb2Ygc2VydmVyIHRoYXQgZWl0aGVyIGdlbmVyYXRlcyByZXNwb25zZXMgdG8gYW4gaW5wdXQgc3RyZWFtIG9yCisgKiBmb3J3YXJkcyBkYXRhIGZyb20gb25lIHBpcGUgb250byBhbm90aGVyLgorICoKKyAqIEFuIGltcGxlbWVudGF0aW9uIGNhbiBvcHRpb25hbGx5IGFsbG93IG9uZSBvciBtb3JlIFRQcm9jZXNzb3JFdmVudEhhbmRsZXJzCisgKiB0byBiZSBhdHRhY2hlZCwgcHJvdmlkaW5nIGFuIGludGVyZmFjZSB0byBob29rIGN1c3RvbSBjb2RlIGludG8gdGhlCisgKiBoYW5kbGluZyBwcm9jZXNzLCB3aGljaCBjYW4gYmUgdXNlZCBlLmcuIGZvciBnYXRoZXJpbmcgc3RhdGlzdGljcy4KKyAqLworaW50ZXJmYWNlIFRQcm9jZXNzb3IgeworICAvLy8KKyAgYm9vbCBwcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LAorICAgIFZhcmlhbnQgY29ubmVjdGlvbkNvbnRleHQgPSBWYXJpYW50KCkKKyAgKSBpbiB7CisgICAgYXNzZXJ0KGlwcm90KTsKKyAgICBhc3NlcnQob3Byb3QpOworICB9CisKKyAgLy8vCisgIGZpbmFsIGJvb2wgcHJvY2VzcyhUUHJvdG9jb2wgcHJvdCwgVmFyaWFudCBjb25uZWN0aW9uQ29udGV4dCA9IFZhcmlhbnQoKSkgeworICAgIHJldHVybiBwcm9jZXNzKHByb3QsIHByb3QsIGNvbm5lY3Rpb25Db250ZXh0KTsKKyAgfQorfQorCisvKioKKyAqIEhhbmRsZXMgZXZlbnRzIGZyb20gYSBwcm9jZXNzb3IuCisgKi8KK2ludGVyZmFjZSBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyIHsKKyAgLyoqCisgICAqIENhbGxlZCBiZWZvcmUgY2FsbGluZyBvdGhlciBjYWxsYmFjayBtZXRob2RzLgorICAgKgorICAgKiBFeHBlY3RlZCB0byByZXR1cm4gc29tZSBzb3J0IG9mIMK7Y2FsbCBjb250ZXh0wqssIHdoaWNoIGlzIHBhc3NlZCB0byBhbGwKKyAgICogb3RoZXIgY2FsbGJhY2tzIGZvciB0aGF0IGZ1bmN0aW9uIGludm9jYXRpb24uCisgICAqLworICBWYXJpYW50IGNyZWF0ZUNvbnRleHQoc3RyaW5nIG1ldGhvZE5hbWUsIFZhcmlhbnQgY29ubmVjdGlvbkNvbnRleHQpOworCisgIC8qKgorICAgKiBDYWxsZWQgd2hlbiBoYW5kbGluZyB0aGUgbWV0aG9kIGFzc29jaWF0ZWQgd2l0aCBhIGNvbnRleHQgaGFzIGJlZW4KKyAgICogZmluaXNoZWQg4oCTIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gY2xlYW4gdXAgd29yay4KKyAgICovCisgIHZvaWQgZGVsZXRlQ29udGV4dChWYXJpYW50IGNhbGxDb250ZXh0LCBzdHJpbmcgbWV0aG9kTmFtZSk7CisKKyAgLyoqCisgICAqIENhbGxlZCBiZWZvcmUgcmVhZGluZyBhcmd1bWVudHMuCisgICAqLworICB2b2lkIHByZVJlYWQoVmFyaWFudCBjYWxsQ29udGV4dCwgc3RyaW5nIG1ldGhvZE5hbWUpOworCisgIC8qKgorICAgKiBDYWxsZWQgYmV0d2VlbiByZWFkaW5nIGFyZ3VtZW50cyBhbmQgY2FsbGluZyB0aGUgaGFuZGxlci4KKyAgICovCisgIHZvaWQgcG9zdFJlYWQoVmFyaWFudCBjYWxsQ29udGV4dCwgc3RyaW5nIG1ldGhvZE5hbWUpOworCisgIC8qKgorICAgKiBDYWxsZWQgYmV0d2VlbiBjYWxsaW5nIHRoZSBoYW5kbGVyIGFuZCB3cml0aW5nIHRoZSByZXNwb25zZS4KKyAgICovCisgIHZvaWQgcHJlV3JpdGUoVmFyaWFudCBjYWxsQ29udGV4dCwgc3RyaW5nIG1ldGhvZE5hbWUpOworCisgIC8qKgorICAgKiBDYWxsZWQgYWZ0ZXIgd3JpdGluZyB0aGUgcmVzcG9uc2UuCisgICAqLworICB2b2lkIHBvc3RXcml0ZShWYXJpYW50IGNhbGxDb250ZXh0LCBzdHJpbmcgbWV0aG9kTmFtZSk7CisKKyAgLyoqCisgICAqIENhbGxlZCB3aGVuIGhhbmRsaW5nIGEgb25lLXdheSBmdW5jdGlvbiBjYWxsIGlzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisgICAqLworICB2b2lkIG9uZXdheUNvbXBsZXRlKFZhcmlhbnQgY2FsbENvbnRleHQsIHN0cmluZyBtZXRob2ROYW1lKTsKKworICAvKioKKyAgICogQ2FsbGVkIGlmIHRoZSBoYW5kbGVyIHRocm93cyBhbiB1bmRlY2xhcmVkIGV4Y2VwdGlvbi4KKyAgICovCisgIHZvaWQgaGFuZGxlckVycm9yKFZhcmlhbnQgY2FsbENvbnRleHQsIHN0cmluZyBtZXRob2ROYW1lLCBFeGNlcHRpb24gZSk7Cit9CisKK3N0cnVjdCBUQ29ubmVjdGlvbkluZm8geworICAvLy8gVGhlIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2xzLgorICBUUHJvdG9jb2wgaW5wdXQ7CisgIFRQcm90b2NvbCBvdXRwdXQ7IC8vLyBEaXR0by4KKworICAvLy8gVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHVzZWQgZm9yIHRoZSBjb25uZWN0aW9uCisgIC8vLyBUaGlzIGlzIHRoZSB0cmFuc3BvcnQgdGhhdCB3YXMgcmV0dXJuZWQgYnkgVFNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKSwKKyAgLy8vIGFuZCBpdCBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhlIHRyYW5zcG9ydCBwb2ludGVkIHRvIGJ5IHRoZSBpbnB1dCBhbmQKKyAgLy8vIG91dHB1dCBwcm90b2NvbHMuCisgIFRUcmFuc3BvcnQgdHJhbnNwb3J0OworfQorCitpbnRlcmZhY2UgVFByb2Nlc3NvckZhY3RvcnkgeworICAvKioKKyAgICogR2V0IHRoZSBUUHJvY2Vzc29yIHRvIHVzZSBmb3IgYSBwYXJ0aWN1bGFyIGNvbm5lY3Rpb24uCisgICAqCisgICAqIFRoaXMgbWV0aG9kIGlzIGFsd2F5cyBpbnZva2VkIGluIHRoZSBzYW1lIHRocmVhZCB0aGF0IHRoZSBjb25uZWN0aW9uIHdhcworICAgKiBhY2NlcHRlZCBvbiwgd2hpY2ggaXMgYWx3YXlzIHRoZSBzYW1lIHRocmVhZCBmb3IgYWxsIGN1cnJlbnQgc2VydmVyCisgICAqIGltcGxlbWVudGF0aW9ucy4KKyAgICovCisgIFRQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yKHJlZiBjb25zdChUQ29ubmVjdGlvbkluZm8pIGNvbm5JbmZvKTsKK30KKworLyoqCisgKiBUaGUgZGVmYXVsdCBwcm9jZXNzb3IgZmFjdG9yeSB3aGljaCBhbHdheXMgcmV0dXJucyB0aGUgc2FtZSBpbnN0YW5jZS4KKyAqLworY2xhc3MgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkgOiBUUHJvY2Vzc29yRmFjdG9yeSB7CisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgcHJvY2Vzc29yID0gVGhlIHByb2Nlc3NvciBvYmplY3QgdG8gcmV0dXJuIGZyb20gZ2V0UHJvY2Vzc29yKCkuCisgICAqLworICB0aGlzKFRQcm9jZXNzb3IgcHJvY2Vzc29yKSB7CisgICAgcHJvY2Vzc29yXyA9IHByb2Nlc3NvcjsKKyAgfQorCisgIG92ZXJyaWRlIFRQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yKHJlZiBjb25zdChUQ29ubmVjdGlvbkluZm8pIGNvbm5JbmZvKSB7CisgICAgcmV0dXJuIHByb2Nlc3Nvcl87CisgIH0KKworcHJpdmF0ZToKKyAgVFByb2Nlc3NvciBwcm9jZXNzb3JfOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvYmFzZS5kIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvYmFzZS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyM2IxYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9iYXNlLmQKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuc2VydmVyLmJhc2U7CisKK2ltcG9ydCBzdGQudmFyaWFudCA6IFZhcmlhbnQ7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJpbmFyeTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wucHJvY2Vzc29yOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBhbGwgVGhyaWZ0IHNlcnZlcnMuCisgKgorICogQnkgc2V0dGluZyB0aGUgZXZlbnRIYW5kbGVyIHByb3BlcnR5IHRvIGEgVFNlcnZlckV2ZW50SGFuZGxlcgorICogaW1wbGVtZW50YXRpb24sIGN1c3RvbSBjb2RlIGNhbiBiZSBpbnRlZ3JhdGVkIGludG8gdGhlIHByb2Nlc3NpbmcgcGlwZWxpbmUsCisgKiB3aGljaCBjYW4gYmUgdXNlZCBlLmcuIGZvciBnYXRoZXJpbmcgc3RhdGlzdGljcy4KKyAqLworY2xhc3MgVFNlcnZlciB7CisgIC8qKgorICAgKiBTdGFydHMgc2VydmluZy4KKyAgICoKKyAgICogQmxvY2tzIHVudGlsIHRoZSBzZXJ2ZXIgZmluaXNoZXMsIGkuZS4gYSBzZXJpb3VzIHByb2JsZW0gb2NjdXJyZWQgb3IgdGhlCisgICAqIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGhhcyBiZWVuIHRyaWdnZXJlZC4KKyAgICoKKyAgICogU2VydmVyIGltcGxlbWVudGF0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gaW1wbGVtZW50IGNhbmNlbGxhdGlvbiBpbiBhIGJlc3QtCisgICAqIGVmZm9ydCB3YXkg4oCTIHVzdWFsbHksIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBpbW1lZGlhdGVseSBzdG9wIGFjY2VwdGluZworICAgKiBjb25uZWN0aW9ucyBhbmQgcmV0dXJuIGFmdGVyIGFsbCBjdXJyZW50bHkgYWN0aXZlIGNsaWVudHMgaGF2ZSBiZWVuCisgICAqIHByb2Nlc3NlZCwgYnV0IHRoaXMgbWlnaHQgbm90IGJlIHRoZSBjYXNlIGZvciBldmVyeSBjb25jZWl2YWJsZQorICAgKiBpbXBsZW1lbnRhdGlvbi4KKyAgICovCisgIGFic3RyYWN0IHZvaWQgc2VydmUoVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24gPSBudWxsKTsKKworICAvLy8gVGhlIHNlcnZlciBldmVudCBoYW5kbGVyIHRvIG5vdGlmeS4gTnVsbCBieSBkZWZhdWx0LgorICBUU2VydmVyRXZlbnRIYW5kbGVyIGV2ZW50SGFuZGxlcjsKKworcHJvdGVjdGVkOgorICB0aGlzKAorICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkKKyAgKSB7CisgICAgdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKyAgfQorCisgIHRoaXMoCisgICAgVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5CisgICkgeworICAgIHRoaXMocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOworICB9CisKKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5CisgICkgeworICAgIHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOworICB9CisKKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnkKKyAgKSB7CisgICAgaW1wb3J0IHN0ZC5leGNlcHRpb247CisgICAgaW1wb3J0IHRocmlmdC5iYXNlOworICAgIGVuZm9yY2UoaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgbmV3IFRFeGNlcHRpb24oIklucHV0IHRyYW5zcG9ydCBmYWN0b3J5IG11c3Qgbm90IGJlIG51bGwuIikpOworICAgIGVuZm9yY2Uob3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIG5ldyBURXhjZXB0aW9uKCJPdXRwdXQgdHJhbnNwb3J0IGZhY3RvcnkgbXVzdCBub3QgYmUgbnVsbC4iKSk7CisgICAgZW5mb3JjZShpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIG5ldyBURXhjZXB0aW9uKCJJbnB1dCBwcm90b2NvbCBmYWN0b3J5IG11c3Qgbm90IGJlIG51bGwuIikpOworICAgIGVuZm9yY2Uob3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgbmV3IFRFeGNlcHRpb24oIk91dHB1dCBwcm90b2NvbCBmYWN0b3J5IG11c3Qgbm90IGJlIG51bGwuIikpOworCisgICAgcHJvY2Vzc29yRmFjdG9yeV8gPSBwcm9jZXNzb3JGYWN0b3J5OworICAgIHNlcnZlclRyYW5zcG9ydF8gPSBzZXJ2ZXJUcmFuc3BvcnQ7CisgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5XyA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyA9IG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XyA9IG91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgfQorCisgIFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnlfOworICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydF87CisgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeV87CisgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfOworICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKKyAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOworCitwdWJsaWM6CisKKyAgQHByb3BlcnR5IFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnkoKQorICB7CisgICAgcmV0dXJuIHByb2Nlc3NvckZhY3RvcnlfOworICB9CisKKyAgQHByb3BlcnR5IFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KCkKKyAgeworICAgIHJldHVybiBzZXJ2ZXJUcmFuc3BvcnRfOworICB9CisKKyAgQHByb3BlcnR5IFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSgpCisgIHsKKyAgICByZXR1cm4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5XzsKKyAgfQorCisgIEBwcm9wZXJ0eSBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KCkKKyAgeworICAgIHJldHVybiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XzsKKyAgfQorCisgIEBwcm9wZXJ0eSBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5KCkKKyAgeworICAgIHJldHVybiBpbnB1dFByb3RvY29sRmFjdG9yeV87CisgIH0KKworICBAcHJvcGVydHkgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnkoKQorICB7CisgICAgcmV0dXJuIG91dHB1dFByb3RvY29sRmFjdG9yeV87CisgIH0KK30KKworLyoqCisgKiBIYW5kbGVzIGV2ZW50cyBmcm9tIGEgVFNlcnZlciBjb3JlLgorICovCitpbnRlcmZhY2UgVFNlcnZlckV2ZW50SGFuZGxlciB7CisgIC8qKgorICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBzZXJ2ZXIgc3RhcnRzIGFjY2VwdGluZyBjb25uZWN0aW9ucy4KKyAgICovCisgIHZvaWQgcHJlU2VydmUoKTsKKworICAvKioKKyAgICogQ2FsbGVkIHdoZW4gYSBuZXcgY2xpZW50IGhhcyBjb25uZWN0ZWQgYW5kIHByb2Nlc3NpbmcgaXMgYWJvdXQgdG8gYmVnaW4uCisgICAqLworICBWYXJpYW50IGNyZWF0ZUNvbnRleHQoVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0KTsKKworICAvKioKKyAgICogQ2FsbGVkIHdoZW4gcmVxdWVzdCBoYW5kbGluZyBmb3IgYSBjbGllbnQgaGFzIGJlZW4gZmluaXNoZWQg4oCTIGNhbiBiZSB1c2VkCisgICAqIHRvIHBlcmZvcm0gY2xlYW4gdXAgd29yay4KKyAgICovCisgIHZvaWQgZGVsZXRlQ29udGV4dChWYXJpYW50IHNlcnZlckNvbnRleHQsIFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCk7CisKKyAgLyoqCisgICAqIENhbGxlZCB3aGVuIHRoZSBwcm9jZXNzb3IgZm9yIGEgY2xpZW50IGNhbGwgaXMgYWJvdXQgdG8gYmUgaW52b2tlZC4KKyAgICovCisgIHZvaWQgcHJlUHJvY2VzcyhWYXJpYW50IHNlcnZlckNvbnRleHQsIFRUcmFuc3BvcnQgdHJhbnNwb3J0KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL25vbmJsb2NraW5nLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9ub25ibG9ja2luZy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NjBjMGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9ub25ibG9ja2luZy5kCkBAIC0wLDAgKzEsMTM5NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIEEgbm9uLWJsb2NraW5nIHNlcnZlciBpbXBsZW1lbnRhdGlvbiB0aGF0IG9wZXJhdGVzIGEgc2V0IG9mIEkvTyB0aHJlYWRzIChieQorICogZGVmYXVsdCBvbmx5IG9uZSkgYW5kIGVpdGhlciBkb2VzIHByb2Nlc3Npbmcgwrtpbi1saW5lwqsgb3Igb2ZmLWxvYWRzIGl0IHRvIGEKKyAqIHRhc2sgcG9vbC4KKyAqCisgKiBJdCAqcmVxdWlyZXMqIFRGcmFtZWRUcmFuc3BvcnQgdG8gYmUgdXNlZCBvbiB0aGUgY2xpZW50IHNpZGUsIGFzIGl0IGV4cGVjdHMKKyAqIGEgNCBieXRlIGxlbmd0aCBpbmRpY2F0b3IgYW5kIHdyaXRlcyBvdXQgcmVzcG9uc2VzIHVzaW5nIHRoZSBzYW1lIGZyYW1pbmcuCisgKgorICogQmVjYXVzZSBJL08gaXMgZG9uZSBhc3luY2hyb25vdXMvZXZlbnQgYmFzZWQsIHVuZm9ydHVuYXRlbHkKKyAqIFRTZXJ2ZXJUcmFuc3BvcnQgY2FuJ3QgYmUgdXNlZC4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBDKysgb25lLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgcmVxdWVzdAorICogdGltZW91dHMgYW5kIHRoZSBkcmFpbiB0YXNrIHF1ZXVlIG92ZXJsb2FkIGhhbmRsaW5nIHN0cmF0ZWd5IG5vdCBiZWluZworICogaW1wbGVtZW50ZWQgeWV0LgorICovCisvLyBUaGlzIHJlYWxseSBzaG91bGQgdXNlIGEgRCBub24tYmxvY2tpbmcgSS9PIGxpYnJhcnksIG9uY2Ugb25lIGJlY29tZXMKKy8vIGF2YWlsYWJsZS4KK21vZHVsZSB0aHJpZnQuc2VydmVyLm5vbmJsb2NraW5nOworCitpbXBvcnQgY29yZS5hdG9taWMgOiBhdG9taWNMb2FkLCBhdG9taWNTdG9yZSwgYXRvbWljT3A7CitpbXBvcnQgY29yZS5leGNlcHRpb24gOiBvbk91dE9mTWVtb3J5RXJyb3I7CitpbXBvcnQgY29yZS5tZW1vcnkgOiBHQzsKK2ltcG9ydCBjb3JlLnN5bmMubXV0ZXg7CitpbXBvcnQgY29yZS5zdGRjLnN0ZGxpYiA6IGZyZWUsIHJlYWxsb2M7CitpbXBvcnQgY29yZS50aW1lIDogRHVyYXRpb24sIGR1cjsKK2ltcG9ydCBjb3JlLnRocmVhZCA6IFRocmVhZCwgVGhyZWFkR3JvdXA7CitpbXBvcnQgZGVpbW9zLmV2ZW50Mi5ldmVudDsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eTsKK2ltcG9ydCBzdGQuY29udiA6IGVtcGxhY2UsIHRvOworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHN0ZC5wYXJhbGxlbGlzbSA6IFRhc2tQb29sLCB0YXNrOworaW1wb3J0IHN0ZC5zb2NrZXQgOiBTb2NrZXQsIHNvY2tldFBhaXIsIFNvY2tldEFjY2VwdEV4Y2VwdGlvbiwKKyAgU29ja2V0RXhjZXB0aW9uLCBUY3BTb2NrZXQ7CitpbXBvcnQgc3RkLnZhcmlhbnQgOiBWYXJpYW50OworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5lbmRpYW47CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLnNvY2tldDsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwudHJhaXRzOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLnByb2Nlc3NvcjsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnJhbmdlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKKworLyoqCisgKiBQb3NzaWJsZSBhY3Rpb25zIHRha2VuIG9uIG5ldyBpbmNvbWluZyBjb25uZWN0aW9ucyB3aGVuIHRoZSBzZXJ2ZXIgaXMKKyAqIG92ZXJsb2FkZWQuCisgKi8KK2VudW0gVE92ZXJsb2FkQWN0aW9uIHsKKyAgLy8vIERvIG5vdCB0YWtlIGFueSBzcGVjaWFsIGFjdGlvbnMgd2hpbGUgdGhlIHNlcnZlciBpcyBvdmVybG9hZGVkLCBqdXN0CisgIC8vLyBjb250aW51ZSBhY2NlcHRpbmcgY29ubmVjdGlvbnMuCisgIE5PTkUsCisKKyAgLy8vIEltbWVkaWF0ZWx5IGRyb3AgbmV3IGNvbm5lY3Rpb25zIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGFjY2VwdGVkIGlmIHRoZQorICAvLy8gc2VydmVyIGlzIG92ZXJsb2FkZWQuCisgIENMT1NFX09OX0FDQ0VQVAorfQorCisvLy8KK2NsYXNzIFROb25ibG9ja2luZ1NlcnZlciA6IFRTZXJ2ZXIgeworICAvLy8KKyAgdGhpcyhUUHJvY2Vzc29yIHByb2Nlc3NvciwgdXNob3J0IHBvcnQsIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksIFRhc2tQb29sIHRhc2tQb29sID0gbnVsbAorICApIHsKKyAgICB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksIHRhc2tQb29sKTsKKyAgfQorCisgIC8vLworICB0aGlzKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksIHVzaG9ydCBwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5LAorICAgIFRhc2tQb29sIHRhc2tQb29sID0gbnVsbAorICApIHsKKyAgICB0aGlzKHByb2Nlc3NvckZhY3RvcnksIHBvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgdGFza1Bvb2wpOworICB9CisKKyAgLy8vCisgIHRoaXMoCisgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgdXNob3J0IHBvcnQsCisgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUYXNrUG9vbCB0YXNrUG9vbCA9IG51bGwKKyAgKSB7CisgICAgdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgcG9ydCwKKyAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksIHRhc2tQb29sKTsKKyAgfQorCisgIC8vLworICB0aGlzKAorICAgIFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgdXNob3J0IHBvcnQsCisgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUYXNrUG9vbCB0YXNrUG9vbCA9IG51bGwKKyAgKSB7CisgICAgc3VwZXIocHJvY2Vzc29yRmFjdG9yeSwgbnVsbCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisgICAgcG9ydF8gPSBwb3J0OworCisgICAgdGhpcy50YXNrUG9vbCA9IHRhc2tQb29sOworCisgICAgY29ubmVjdGlvbk11dGV4XyA9IG5ldyBNdXRleDsKKworICAgIGNvbm5lY3Rpb25TdGFja0xpbWl0ID0gREVGQVVMVF9DT05ORUNUSU9OX1NUQUNLX0xJTUlUOworICAgIG1heEFjdGl2ZVByb2Nlc3NvcnMgPSBERUZBVUxUX01BWF9BQ1RJVkVfUFJPQ0VTU09SUzsKKyAgICBtYXhDb25uZWN0aW9ucyA9IERFRkFVTFRfTUFYX0NPTk5FQ1RJT05TOworICAgIG92ZXJsb2FkSHlzdGVyZXNpcyA9IERFRkFVTFRfT1ZFUkxPQURfSFlTVEVSRVNJUzsKKyAgICBvdmVybG9hZEFjdGlvbiA9IERFRkFVTFRfT1ZFUkxPQURfQUNUSU9OOworICAgIHdyaXRlQnVmZmVyRGVmYXVsdFNpemUgPSBERUZBVUxUX1dSSVRFX0JVRkZFUl9ERUZBVUxUX1NJWkU7CisgICAgaWRsZVJlYWRCdWZmZXJMaW1pdCA9IERFRkFVTFRfSURMRV9SRUFEX0JVRkZFUl9MSU1JVDsKKyAgICBpZGxlV3JpdGVCdWZmZXJMaW1pdCA9IERFRkFVTFRfSURMRV9XUklURV9CVUZGRVJfTElNSVQ7CisgICAgcmVzaXplQnVmZmVyRXZlcnlOID0gREVGQVVMVF9SRVNJWkVfQlVGRkVSX0VWRVJZX047CisgICAgbWF4RnJhbWVTaXplID0gREVGQVVMVF9NQVhfRlJBTUVfU0laRTsKKyAgICBudW1JT1RocmVhZHNfID0gREVGQVVMVF9OVU1fSU9fVEhSRUFEUzsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgc2VydmUoVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24gPSBudWxsKSB7CisgICAgaWYgKGNhbmNlbGxhdGlvbiAmJiBjYW5jZWxsYXRpb24udHJpZ2dlcmVkKSByZXR1cm47CisKKyAgICAvLyBJbml0aWFsaXplIHRoZSBsaXN0ZW5pbmcgc29ja2V0LgorICAgIC8vIFRPRE86IFNPX0tFRVBBTElWRSwgVENQX0xPV19NSU5fUlRPLCBldGMuCisgICAgbGlzdGVuU29ja2V0XyA9IG1ha2VTb2NrZXRBbmRMaXN0ZW4ocG9ydF8sIFRTZXJ2ZXJTb2NrZXQuQUNDRVBUX0JBQ0tMT0csCisgICAgICBCSU5EX1JFVFJZX0xJTUlULCBCSU5EX1JFVFJZX0RFTEFZLCAwLCAwLCBpcHY2T25seV8pOworICAgIGxpc3RlblNvY2tldF8uYmxvY2tpbmcgPSBmYWxzZTsKKworICAgIGxvZ0luZm8oIlVzaW5nICVzIEkvTyB0aHJlYWQocykuIiwgbnVtSU9UaHJlYWRzXyk7CisgICAgaWYgKHRhc2tQb29sXykgeworICAgICAgbG9nSW5mbygiVXNpbmcgdGFzayBwb29sIHdpdGggc2l6ZTogJXMuIiwgbnVtSU9UaHJlYWRzXywgdGFza1Bvb2xfLnNpemUpOworICAgIH0KKworICAgIGFzc2VydChudW1JT1RocmVhZHNfID4gMCk7CisgICAgYXNzZXJ0KGlvTG9vcHNfLmVtcHR5KTsKKyAgICBmb3JlYWNoIChpZDsgMCAuLiBudW1JT1RocmVhZHNfKSB7CisgICAgICAvLyBUaGUgSU8gbG9vcCBvbiB0aGUgZmlyc3QgSU8gdGhyZWFkICh0aGlzIHRocmVhZCwgaS5lLiB0aGUgb25lIHNlcnZlKCkKKyAgICAgIC8vIGlzIGNhbGxlZCBmcm9tKSBhbHNvIGFjY2VwdHMgbmV3IGNvbm5lY3Rpb25zLgorICAgICAgYXV0byBsaXN0ZW5Tb2NrZXQgPSAoaWQgPT0gMCA/IGxpc3RlblNvY2tldF8gOiBudWxsKTsKKyAgICAgIGlvTG9vcHNfIH49IG5ldyBJT0xvb3AodGhpcywgbGlzdGVuU29ja2V0KTsKKyAgICB9CisKKyAgICBpZiAoY2FuY2VsbGF0aW9uKSB7CisgICAgICBjYW5jZWxsYXRpb24udHJpZ2dlcmluZy5hZGRDYWxsYmFjayh7CisgICAgICAgIGZvcmVhY2ggKGksIGxvb3A7IGlvTG9vcHNfKSBsb29wLnN0b3AoKTsKKworICAgICAgICAvLyBTdG9wIGFjY2VwdGluZyBuZXcgY29ubmVjdGlvbnMgcmlnaHQgYXdheS4KKyAgICAgICAgbGlzdGVuU29ja2V0Xy5jbG9zZSgpOworICAgICAgICBsaXN0ZW5Tb2NrZXRfID0gbnVsbDsKKyAgICAgIH0pOworICAgIH0KKworICAgIC8vIFN0YXJ0IHRoZSBJTyBoZWxwZXIgdGhyZWFkcyBmb3IgYWxsIGJ1dCB0aGUgZmlyc3QgbG9vcCwgd2hpY2ggd2Ugd2lsbCBydW4KKyAgICAvLyBvdXJzZWx2ZXMuIE5vdGUgdGhhdCB0aGUgdGhyZWFkcyBydW4gZm9yZXZlciwgb25seSB0ZXJtaW5hdGluZyBpZiBzdG9wKCkKKyAgICAvLyBpcyBjYWxsZWQuCisgICAgYXV0byB0aHJlYWRzID0gbmV3IFRocmVhZEdyb3VwKCk7CisgICAgZm9yZWFjaCAobG9vcDsgaW9Mb29wc19bMSAuLiAkXSkgeworICAgICAgYXV0byB0ID0gbmV3IFRocmVhZCgmbG9vcC5ydW4pOworICAgICAgdGhyZWFkcy5hZGQodCk7CisgICAgICB0LnN0YXJ0KCk7CisgICAgfQorCisgICAgaWYgKGV2ZW50SGFuZGxlcikgZXZlbnRIYW5kbGVyLnByZVNlcnZlKCk7CisKKyAgICAvLyBSdW4gdGhlIHByaW1hcnkgKGxpc3RlbmVyKSBJTyB0aHJlYWQgbG9vcCBpbiBvdXIgbWFpbiB0aHJlYWQ7IHRoaXMgd2lsbAorICAgIC8vIGJsb2NrIHVudGlsIHRoZSBzZXJ2ZXIgaXMgc2h1dHRpbmcgZG93bi4KKyAgICBpb0xvb3BzX1swXS5ydW4oKTsKKworICAgIC8vIEVuc3VyZSBhbGwgdGhyZWFkcyBhcmUgZmluaXNoZWQgYmVmb3JlIGxlYXZpbmcgc2VydmUoKS4KKyAgICB0aHJlYWRzLmpvaW5BbGwoKTsKKworICAgIGlvTG9vcHNfID0gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY3VycmVudGx5IGFjdGl2ZSBjb25uZWN0aW9ucywgaS5lLiBvcGVuIHNvY2tldHMuCisgICAqLworICBzaXplX3QgbnVtQ29ubmVjdGlvbnMoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBudW1Db25uZWN0aW9uc187CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbm5lY3Rpb24gb2JqZWN0cyBhbGxvY2F0ZWQsIGJ1dCBub3QgaW4gdXNlLgorICAgKi8KKyAgc2l6ZV90IG51bUlkbGVDb25uZWN0aW9ucygpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIGNvbm5lY3Rpb25TdGFja18ubGVuZ3RoOworICB9CisKKyAgLyoqCisgICAqIFJldHVybiBjb3VudCBvZiBudW1iZXIgb2YgY29ubmVjdGlvbnMgd2hpY2ggYXJlIGN1cnJlbnRseSBwcm9jZXNzaW5nLgorICAgKgorICAgKiBUaGlzIGlzIGRlZmluZWQgYXMgYSBjb25uZWN0aW9uIHdoZXJlIGFsbCBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkLCBhbmQgdGhlCisgICAqIHByb2Nlc3NvciB3YXMgaW52b2tlZCBidXQgaGFzIG5vdCB5ZXQgY29tcGxldGVkLgorICAgKi8KKyAgc2l6ZV90IG51bUFjdGl2ZVByb2Nlc3NvcnMoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBudW1BY3RpdmVQcm9jZXNzb3JzXzsKKyAgfQorCisgIC8vLyBOdW1iZXIgb2YgYmluZCgpIHJldHJpZXMuCisgIGVudW0gQklORF9SRVRSWV9MSU1JVCA9IDA7CisKKyAgLy8vIER1cmF0aW9uIGJldHdlZW4gYmluZCgpIHJldHJpZXMuCisgIGVudW0gQklORF9SRVRSWV9ERUxBWSA9IGR1ciEiaG5zZWNzIigwKTsKKworICAvLy8gV2hldGhlciB0byBsaXN0ZW4gb24gSVB2NiBvbmx5LCBpZiBJUHY2IHN1cHBvcnQgaXMgZGV0ZWN0ZWQKKyAgLy8gKGRlZmF1bHQ6IGZhbHNlKS4KKyAgdm9pZCBpcHY2T25seShib29sIHZhbHVlKSBAcHJvcGVydHkgeworICAgIGlwdjZPbmx5XyA9IHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIFRoZSB0YXNrIHBvb2wgdG8gdXNlIGZvciBwcm9jZXNzaW5nIHJlcXVlc3RzLiBJZiBudWxsLCBubyBhZGRpdGlvbmFsCisgICAqIHRocmVhZHMgYXJlIHVzZWQgYW5kIHJlcXVlc3QgYXJlIHByb2Nlc3NlZCDCu2lubGluZcKrLgorICAgKgorICAgKiBDYW4gc2FmZWx5IGJlIHNldCBldmVuIHdoZW4gdGhlIHNlcnZlciBpcyBhbHJlYWR5IHJ1bm5pbmcuCisgICAqLworICBUYXNrUG9vbCB0YXNrUG9vbCgpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHRhc2tQb29sXzsKKyAgfQorCisgIC8vLyBkaXR0bworICB2b2lkIHRhc2tQb29sKFRhc2tQb29sIHBvb2wpIEBwcm9wZXJ0eSB7CisgICAgdGFza1Bvb2xfID0gcG9vbDsKKyAgfQorCisgIC8qKgorICAgKiBIeXN0ZXJlc2lzIGZvciBvdmVybG9hZCBzdGF0ZS4KKyAgICoKKyAgICogVGhpcyBpcyB0aGUgZnJhY3Rpb24gb2YgdGhlIG92ZXJsb2FkIHZhbHVlIHRoYXQgbmVlZHMgdG8gYmUgcmVhY2hlZAorICAgKiBiZWZvcmUgdGhlIG92ZXJsb2FkIHN0YXRlIGlzIGNsZWFyZWQuIEl0IG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxLAorICAgKiBwcmFjdGljYWwgY2hvaWNlcyBwcm9iYWJseSBsaWUgYmV0d2VlbiAwLjUgYW5kIDAuOS4KKyAgICovCisgIGRvdWJsZSBvdmVybG9hZEh5c3RlcmVzaXMoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBvdmVybG9hZEh5c3RlcmVzaXNfOworICB9CisKKyAgLy8vIERpdHRvCisgIHZvaWQgb3ZlcmxvYWRIeXN0ZXJlc2lzKGRvdWJsZSB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBlbmZvcmNlKDAgPCB2YWx1ZSAmJiB2YWx1ZSA8PSAxLAorICAgICAgIkludmFsaWQgdmFsdWUgZm9yIG92ZXJsb2FkIGh5c3RlcmVzaXM6ICIgfiB0byFzdHJpbmcodmFsdWUpKTsKKyAgICBvdmVybG9hZEh5c3RlcmVzaXNfID0gdmFsdWU7CisgIH0KKworICAvLy8gRGl0dG8KKyAgZW51bSBERUZBVUxUX09WRVJMT0FEX0hZU1RFUkVTSVMgPSAwLjg7CisKKyAgLyoqCisgICAqIFRoZSBhY3Rpb24gd2hpY2ggd2lsbCBiZSB0YWtlbiBvbiBvdmVybG9hZC4KKyAgICovCisgIFRPdmVybG9hZEFjdGlvbiBvdmVybG9hZEFjdGlvbjsKKworICAvLy8gRGl0dG8KKyAgZW51bSBERUZBVUxUX09WRVJMT0FEX0FDVElPTiA9IFRPdmVybG9hZEFjdGlvbi5OT05FOworCisgIC8qKgorICAgKiBUaGUgd3JpdGUgYnVmZmVyIGlzIGluaXRpYWxpemVkIChhbmQgd2hlbiBpZGxlV3JpdGVCdWZmZXJMaW1pdF8gaXMgY2hlY2tlZAorICAgKiBhbmQgZm91bmQgdG8gYmUgZXhjZWVkZWQsIHJlaW5pdGlhbGl6ZWQpIHRvIHRoaXMgc2l6ZS4KKyAgICovCisgIHNpemVfdCB3cml0ZUJ1ZmZlckRlZmF1bHRTaXplOworCisgIC8vLyBEaXR0bworICBlbnVtIHNpemVfdCBERUZBVUxUX1dSSVRFX0JVRkZFUl9ERUZBVUxUX1NJWkUgPSAxMDI0OworCisgIC8qKgorICAgKiBNYXggcmVhZCBidWZmZXIgc2l6ZSBmb3IgYW4gaWRsZSBDb25uZWN0aW9uLiBXaGVuIHdlIHBsYWNlIGFuIGlkbGUKKyAgICogQ29ubmVjdGlvbiBpbnRvIGNvbm5lY3Rpb25TdGFja18gb3Igb24gZXZlcnkgcmVzaXplQnVmZmVyRXZlcnlOXyBjYWxscywKKyAgICogd2Ugd2lsbCBmcmVlIHRoZSBidWZmZXIgKHN1Y2ggdGhhdCBpdCB3aWxsIGJlIHJlaW5pdGlhbGl6ZWQgYnkgdGhlIG5leHQKKyAgICogcmVjZWl2ZWQgZnJhbWUpIGlmIGl0IGhhcyBleGNlZWRlZCB0aGlzIGxpbWl0LiAwIGRpc2FibGVzIHRoaXMgY2hlY2suCisgICAqLworICBzaXplX3QgaWRsZVJlYWRCdWZmZXJMaW1pdDsKKworICAvLy8gRGl0dG8KKyAgZW51bSBzaXplX3QgREVGQVVMVF9JRExFX1JFQURfQlVGRkVSX0xJTUlUID0gMTAyNDsKKworICAvKioKKyAgICogTWF4IHdyaXRlIGJ1ZmZlciBzaXplIGZvciBhbiBpZGxlIGNvbm5lY3Rpb24uICBXaGVuIHdlIHBsYWNlIGFuIGlkbGUKKyAgICogQ29ubmVjdGlvbiBpbnRvIGNvbm5lY3Rpb25TdGFja18gb3Igb24gZXZlcnkgcmVzaXplQnVmZmVyRXZlcnlOXyBjYWxscywKKyAgICogd2UgZW5zdXJlIHRoYXQgaXRzIHdyaXRlIGJ1ZmZlciBpcyA8PSB0byB0aGlzIHNpemU7IG90aGVyd2lzZSB3ZQorICAgKiByZXBsYWNlIGl0IHdpdGggYSBuZXcgb25lIG9mIHdyaXRlQnVmZmVyRGVmYXVsdFNpemVfIGJ5dGVzIHRvIGVuc3VyZSB0aGF0CisgICAqIGlkbGUgY29ubmVjdGlvbnMgZG9uJ3QgaG9nIG1lbW9yeS4gMCBkaXNhYmxlcyB0aGlzIGNoZWNrLgorICAgKi8KKyAgc2l6ZV90IGlkbGVXcml0ZUJ1ZmZlckxpbWl0OworCisgIC8vLyBEaXR0bworICBlbnVtIHNpemVfdCBERUZBVUxUX0lETEVfV1JJVEVfQlVGRkVSX0xJTUlUID0gMTAyNDsKKworICAvKioKKyAgICogRXZlcnkgTiBjYWxscyB3ZSBjaGVjayB0aGUgYnVmZmVyIHNpemUgbGltaXRzIG9uIGEgY29ubmVjdGVkIENvbm5lY3Rpb24uCisgICAqIDAgZGlzYWJsZXMgKGkuZS4gdGhlIGNoZWNrcyBhcmUgb25seSBkb25lIHdoZW4gYSBjb25uZWN0aW9uIGNsb3NlcykuCisgICAqLworICB1aW50IHJlc2l6ZUJ1ZmZlckV2ZXJ5TjsKKworICAvLy8gRGl0dG8KKyAgZW51bSB1aW50IERFRkFVTFRfUkVTSVpFX0JVRkZFUl9FVkVSWV9OID0gNTEyOworCisgIC8vLyBMaW1pdCBmb3IgaG93IG1hbnkgQ29ubmVjdGlvbiBvYmplY3RzIHRvIGNhY2hlLgorICBzaXplX3QgY29ubmVjdGlvblN0YWNrTGltaXQ7CisKKyAgLy8vIERpdHRvCisgIGVudW0gc2l6ZV90IERFRkFVTFRfQ09OTkVDVElPTl9TVEFDS19MSU1JVCA9IDEwMjQ7CisKKyAgLy8vIExpbWl0IGZvciBudW1iZXIgb2Ygb3BlbiBjb25uZWN0aW9ucyBiZWZvcmUgc2VydmVyIGdvZXMgaW50byBvdmVybG9hZAorICAvLy8gc3RhdGUuCisgIHNpemVfdCBtYXhDb25uZWN0aW9uczsKKworICAvLy8gRGl0dG8KKyAgZW51bSBzaXplX3QgREVGQVVMVF9NQVhfQ09OTkVDVElPTlMgPSBpbnQubWF4OworCisgIC8vLyBMaW1pdCBmb3IgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHByb2Nlc3Npbmcgb3Igd2FpdGluZyB0byBwcm9jZXNzCisgIHNpemVfdCBtYXhBY3RpdmVQcm9jZXNzb3JzOworCisgIC8vLyBEaXR0bworICBlbnVtIHNpemVfdCBERUZBVUxUX01BWF9BQ1RJVkVfUFJPQ0VTU09SUyA9IGludC5tYXg7CisKKyAgLy8vIE1heGltdW0gZnJhbWUgc2l6ZSwgaW4gYnl0ZXMuCisgIC8vLworICAvLy8gSWYgYSBjbGllbnQgdHJpZXMgdG8gc2VuZCBhIG1lc3NhZ2UgbGFyZ2VyIHRoYW4gdGhpcyBsaW1pdCwgaXRzCisgIC8vLyBjb25uZWN0aW9uIHdpbGwgYmUgY2xvc2VkLiBUaGlzIGhlbHBzIHRvIGF2b2lkIGFsbG9jYXRpbmcgaHVnZSBidWZmZXJzCisgIC8vLyBvbiBib2dvdXMgaW5wdXQuCisgIHVpbnQgbWF4RnJhbWVTaXplOworCisgIC8vLyBEaXR0bworICBlbnVtIHVpbnQgREVGQVVMVF9NQVhfRlJBTUVfU0laRSA9IDI1NiAqIDEwMjQgKiAxMDI0OworCisKKyAgc2l6ZV90IG51bUlPVGhyZWFkcygpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIG51bUlPVGhyZWFkc187CisgIH0KKworICB2b2lkIG51bUlPVGhyZWFkcyhzaXplX3QgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgZW5mb3JjZSh2YWx1ZSA+PSAxLCBuZXcgVEV4Y2VwdGlvbigiTXVzdCB1c2UgYXQgbGVhc3Qgb25lIEkvTyB0aHJlYWQuIikpOworICAgIG51bUlPVGhyZWFkc18gPSB2YWx1ZTsKKyAgfQorCisgIGVudW0gREVGQVVMVF9OVU1fSU9fVEhSRUFEUyA9IDE7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBDIGNhbGxiYWNrIHdyYXBwZXIgYXJvdW5kIGFjY2VwdENvbm5lY3Rpb25zKCkuIEV4cGVjdHMgdGhlIGN1c3RvbSBhcmd1bWVudAorICAgKiB0byBiZSB0aGUgdGhpcyBwb2ludGVyIG9mIHRoZSBhc3NvY2lhdGVkIHNlcnZlciBpbnN0YW5jZS4KKyAgICovCisgIGV4dGVybihDKSBzdGF0aWMgdm9pZCBhY2NlcHRDb25uZWN0aW9uc0NhbGxiYWNrKGludCBmZCwgc2hvcnQgd2hpY2gsCisgICAgdm9pZCogc2VydmVyVGhpcworICApIHsKKyAgICAoY2FzdChUTm9uYmxvY2tpbmdTZXJ2ZXIpc2VydmVyVGhpcykuYWNjZXB0Q29ubmVjdGlvbnMoZmQsIHdoaWNoKTsKKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgYnkgbGliZXZlbnQgKElPIGxvb3AgMC9zZXJ2ZSgpIHRocmVhZCBvbmx5KSB3aGVuIHNvbWV0aGluZworICAgKiBoYXBwZW5lZCBvbiB0aGUgbGlzdGVuaW5nIHNvY2tldC4KKyAgICovCisgIHZvaWQgYWNjZXB0Q29ubmVjdGlvbnMoaW50IGZkLCBzaG9ydCBldmVudEZsYWdzKSB7CisgICAgaWYgKGF0b21pY0xvYWQoaW9Mb29wc19bMF0uc2h1dHRpbmdEb3duXykpIHJldHVybjsKKworICAgIGFzc2VydCghIWxpc3RlblNvY2tldF8sCisgICAgICAiU2VydmVyIHNob3VsZCBiZSBzaHV0dGluZyBkb3duIGlmIGxpc3RlbiBzb2NrZXQgaXMgbnVsbC4iKTsKKyAgICBhc3NlcnQoZmQgPT0gbGlzdGVuU29ja2V0Xy5oYW5kbGUpOworICAgIGFzc2VydChldmVudEZsYWdzICYgRVZfUkVBRCk7CisKKyAgICAvLyBBY2NlcHQgYXMgbWFueSBuZXcgY2xpZW50cyBhcyBwb3NzaWJsZSwgZXZlbiB0aG91Z2ggbGliZXZlbnQgc2lnbmFsZWQKKyAgICAvLyBvbmx5IG9uZS4gVGhpcyBoZWxwcyB0aGUgbnVtYmVyIG9mIGNhbGxzIGludG8gbGliZXZlbnQgc3BhY2UuCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIC8vIEl0IGlzIGxhbWUgdG8gdXNlIGV4Y2VwdGlvbnMgZm9yIHJlZ3VsYXIgY29udHJvbCBmbG93IChmYWlsaW5nIGlzCisgICAgICAvLyBleGNlcHRlZCBkdWUgdG8gbm9uLWJsb2NraW5nIG1vZGUgb2Ygb3BlcmF0aW9uKSwgYnV0IHRoYXQncyB0aGUKKyAgICAgIC8vIGludGVyZmFjZSBzdGQuc29ja2V0IG9mZmVyc+KApgorICAgICAgU29ja2V0IGNsaWVudFNvY2tldDsKKyAgICAgIHRyeSB7CisgICAgICAgIGNsaWVudFNvY2tldCA9IGxpc3RlblNvY2tldF8uYWNjZXB0KCk7CisgICAgICB9IGNhdGNoIChTb2NrZXRBY2NlcHRFeGNlcHRpb24gZSkgeworICAgICAgICBpZiAoZS5lcnJvckNvZGUgIT0gV09VTERfQkxPQ0tfRVJSTk8pIHsKKyAgICAgICAgICBsb2dFcnJvcigiRXJyb3IgYWNjZXB0aW5nIGNvbm5lY3Rpb246ICVzIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIElmIHRoZSBzZXJ2ZXIgaXMgb3ZlcmxvYWRlZCwgdGhpcyBpcyB0aGUgcG9pbnQgdG8gdGFrZSB0aGUgc3BlY2lmaWVkCisgICAgICAvLyBhY3Rpb24uCisgICAgICBpZiAob3ZlcmxvYWRBY3Rpb24gIT0gVE92ZXJsb2FkQWN0aW9uLk5PTkUgJiYgY2hlY2tPdmVybG9hZGVkKCkpIHsKKyAgICAgICAgbkNvbm5lY3Rpb25zRHJvcHBlZF8rKzsKKyAgICAgICAgblRvdGFsQ29ubmVjdGlvbnNEcm9wcGVkXysrOworICAgICAgICBpZiAob3ZlcmxvYWRBY3Rpb24gPT0gVE92ZXJsb2FkQWN0aW9uLkNMT1NFX09OX0FDQ0VQVCkgeworICAgICAgICAgIGNsaWVudFNvY2tldC5jbG9zZSgpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICBjbGllbnRTb2NrZXQuYmxvY2tpbmcgPSBmYWxzZTsKKyAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGxvZ0Vycm9yKCJDb3VsZG4ndCBzZXQgY2xpZW50IHNvY2tldCB0byBub24tYmxvY2tpbmcgbW9kZTogJXMiLCBlKTsKKyAgICAgICAgY2xpZW50U29ja2V0LmNsb3NlKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgLy8gQ3JlYXRlIGEgbmV3IENvbm5lY3Rpb24gZm9yIHRoaXMgY2xpZW50IHNvY2tldC4KKyAgICAgIENvbm5lY3Rpb24gY29ubiA9IHZvaWQ7CisgICAgICBJT0xvb3AgbG9vcCA9IHZvaWQ7CisgICAgICBib29sIHRoaXNUaHJlYWQgPSB2b2lkOworICAgICAgc3luY2hyb25pemVkIChjb25uZWN0aW9uTXV0ZXhfKSB7CisgICAgICAgIC8vIEFzc2lnbiBhbiBJL08gbG9vcCB0byB0aGUgY29ubmVjdGlvbiAocm91bmQtcm9iaW4pLgorICAgICAgICBhc3NlcnQobmV4dElPTG9vcF8gPj0gMCk7CisgICAgICAgIGFzc2VydChuZXh0SU9Mb29wXyA8IGlvTG9vcHNfLmxlbmd0aCk7CisgICAgICAgIGF1dG8gc2VsZWN0ZWRUaHJlYWRJZHggPSBuZXh0SU9Mb29wXzsKKyAgICAgICAgbmV4dElPTG9vcF8gPSAobmV4dElPTG9vcF8gKyAxKSAlIGlvTG9vcHNfLmxlbmd0aDsKKworICAgICAgICBsb29wID0gaW9Mb29wc19bc2VsZWN0ZWRUaHJlYWRJZHhdOworICAgICAgICB0aGlzVGhyZWFkID0gKHNlbGVjdGVkVGhyZWFkSWR4ID09IDApOworCisgICAgICAgIC8vIENoZWNrIHRoZSBjb25uZWN0aW9uIHN0YWNrIHRvIHNlZSBpZiB3ZSBjYW4gcmUtdXNlIGFuIGV4aXN0aW5nIG9uZS4KKyAgICAgICAgaWYgKGNvbm5lY3Rpb25TdGFja18uZW1wdHkpIHsKKyAgICAgICAgICArK251bUNvbm5lY3Rpb25zXzsKKyAgICAgICAgICBjb25uID0gbmV3IENvbm5lY3Rpb24oY2xpZW50U29ja2V0LCBsb29wKTsKKworICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29ubmVjdGlvbiBkb2VzIG5vdCBnZXQgY29sbGVjdGVkIHdoaWxlIGl0IGlzIGFjdGl2ZSwKKyAgICAgICAgICAvLyBpLmUuIGhvb2tlZCB1cCB3aXRoIGxpYmV2ZW50LgorICAgICAgICAgIEdDLmFkZFJvb3QoY2FzdCh2b2lkKiljb25uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb25uID0gY29ubmVjdGlvblN0YWNrX1skIC0gMV07CisgICAgICAgICAgY29ubmVjdGlvblN0YWNrXyA9IGNvbm5lY3Rpb25TdGFja19bMCAuLiAkIC0gMV07CisgICAgICAgICAgY29ubmVjdGlvblN0YWNrXy5hc3N1bWVTYWZlQXBwZW5kKCk7CisgICAgICAgICAgY29ubi5pbml0KGNsaWVudFNvY2tldCwgbG9vcCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgbG9vcC5hZGRDb25uZWN0aW9uKCk7CisKKyAgICAgIC8vIEVpdGhlciBub3RpZnkgdGhlIGlvVGhyZWFkIHRoYXQgaXMgYXNzaWduZWQgdGhpcyBjb25uZWN0aW9uIHRvCisgICAgICAvLyBzdGFydCBwcm9jZXNzaW5nLCBvciBpZiBpdCBpcyB1cywgd2UnbGwganVzdCBhc2sgdGhpcworICAgICAgLy8gY29ubmVjdGlvbiB0byBkbyBpdHMgaW5pdGlhbCBzdGF0ZSBjaGFuZ2UgaGVyZS4KKyAgICAgIC8vCisgICAgICAvLyAoV2UgbmVlZCB0byBhdm9pZCB3cml0aW5nIHRvIG91ciBvd24gbm90aWZpY2F0aW9uIHBpcGUsIHRvCisgICAgICAvLyBhdm9pZCBwb3NzaWJsZSBkZWFkbG9ja3MgaWYgdGhlIHBpcGUgaXMgZnVsbC4pCisgICAgICBpZiAodGhpc1RocmVhZCkgeworICAgICAgICBjb25uLnRyYW5zaXRpb24oKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxvb3Aubm90aWZ5Q29tcGxldGVkKGNvbm4pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vLyBJbmNyZW1lbnQgdGhlIGNvdW50IG9mIGNvbm5lY3Rpb25zIGN1cnJlbnRseSBwcm9jZXNzaW5nLgorICB2b2lkIGluY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKSB7CisgICAgYXRvbWljT3AhIis9IihudW1BY3RpdmVQcm9jZXNzb3JzXywgMSk7CisgIH0KKworICAvLy8gRGVjcmVtZW50IHRoZSBjb3VudCBvZiBjb25uZWN0aW9ucyBjdXJyZW50bHkgcHJvY2Vzc2luZy4KKyAgdm9pZCBkZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCkgeworICAgIGFzc2VydChudW1BY3RpdmVQcm9jZXNzb3JzXyA+IDApOworICAgIGF0b21pY09wISItPSIobnVtQWN0aXZlUHJvY2Vzc29yc18sIDEpOworICB9CisKKyAgLyoqCisgICAqIERldGVybWluZXMgaWYgdGhlIHNlcnZlciBpcyBjdXJyZW50bHkgb3ZlcmxvYWRlZC4KKyAgICoKKyAgICogSWYgdGhlIG51bWJlciBvZiBvcGVuIGNvbm5lY3Rpb25zIG9yIMK7cHJvY2Vzc2luZ8KrIGNvbm5lY3Rpb25zIGlzIG92ZXIgdGhlCisgICAqIHJlc3BlY3RpdmUgbGltaXQsIHRoZSBzZXJ2ZXIgd2lsbCBlbnRlciBvdmVybG9hZCBoYW5kbGluZyBtb2RlIGFuZCBhCisgICAqIHdhcm5pbmcgd2lsbCBiZSBsb2dnZWQuIElmIGJlbG93IHZhbHVlcyBhcmUgYmVsb3cgdGhlIGh5c3RlcmVzaXMgY3VydmUsCisgICAqIHRoaXMgd2lsbCBjYXVzZSB0aGUgc2VydmVyIHRvIGV4aXQgaXQgYWdhaW4uCisgICAqCisgICAqIFJldHVybnM6IFdoZXRoZXIgdGhlIHNlcnZlciBpcyBjdXJyZW50bHkgb3ZlcmxvYWRlZC4KKyAgICovCisgIGJvb2wgY2hlY2tPdmVybG9hZGVkKCkgeworICAgIGF1dG8gYWN0aXZlQ29ubmVjdGlvbnMgPSBudW1Db25uZWN0aW9uc18gLSBjb25uZWN0aW9uU3RhY2tfLmxlbmd0aDsKKyAgICBpZiAobnVtQWN0aXZlUHJvY2Vzc29yc18gPiBtYXhBY3RpdmVQcm9jZXNzb3JzIHx8CisgICAgICAgIGFjdGl2ZUNvbm5lY3Rpb25zID4gbWF4Q29ubmVjdGlvbnMpIHsKKyAgICAgIGlmICghb3ZlcmxvYWRlZF8pIHsKKyAgICAgICAgbG9nSW5mbygiRW50ZXJpbmcgb3ZlcmxvYWRlZCBzdGF0ZS4iKTsKKyAgICAgICAgb3ZlcmxvYWRlZF8gPSB0cnVlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAob3ZlcmxvYWRlZF8gJiYKKyAgICAgICAgKG51bUFjdGl2ZVByb2Nlc3NvcnNfIDw9IG92ZXJsb2FkSHlzdGVyZXNpc18gKiBtYXhBY3RpdmVQcm9jZXNzb3JzKSAmJgorICAgICAgICAoYWN0aXZlQ29ubmVjdGlvbnMgPD0gb3ZlcmxvYWRIeXN0ZXJlc2lzXyAqIG1heENvbm5lY3Rpb25zKSkKKyAgICAgIHsKKyAgICAgICAgbG9nSW5mbygiRXhpdGluZyBvdmVybG9hZGVkIHN0YXRlLCAlcyBjb25uZWN0aW9uKHMpIGRyb3BwZWQgKCUgdG90YWwpLiIsCisgICAgICAgICAgbkNvbm5lY3Rpb25zRHJvcHBlZF8sIG5Ub3RhbENvbm5lY3Rpb25zRHJvcHBlZF8pOworICAgICAgICBuQ29ubmVjdGlvbnNEcm9wcGVkXyA9IDA7CisgICAgICAgIG92ZXJsb2FkZWRfID0gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG92ZXJsb2FkZWRfOworICB9CisKKyAgLyoqCisgICAqIE1hcmtzIGEgY29ubmVjdGlvbiBhcyBpbmFjdGl2ZSBhbmQgZWl0aGVyIHB1dHMgaXQgYmFjayBpbnRvIHRoZQorICAgKiBjb25uZWN0aW9uIHBvb2wgb3IgbGVhdmVzIGl0IGZvciBnYXJiYWdlIGNvbGxlY3Rpb24uCisgICAqLworICB2b2lkIGRpc3Bvc2VDb25uZWN0aW9uKENvbm5lY3Rpb24gY29ubmVjdGlvbikgeworICAgIHN5bmNocm9uaXplZCAoY29ubmVjdGlvbk11dGV4XykgeworICAgICAgaWYgKCFjb25uZWN0aW9uU3RhY2tMaW1pdCB8fAorICAgICAgICAoY29ubmVjdGlvblN0YWNrXy5sZW5ndGggPCBjb25uZWN0aW9uU3RhY2tMaW1pdCkpCisgICAgICB7CisgICAgICAgIGNvbm5lY3Rpb24uY2hlY2tJZGxlQnVmZmVyTGltaXQoaWRsZVJlYWRCdWZmZXJMaW1pdCwKKyAgICAgICAgICBpZGxlV3JpdGVCdWZmZXJMaW1pdCk7CisgICAgICAgIGNvbm5lY3Rpb25TdGFja18gfj0gY29ubmVjdGlvbjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydChudW1Db25uZWN0aW9uc18gPiAwKTsKKyAgICAgICAgLS1udW1Db25uZWN0aW9uc187CisKKyAgICAgICAgLy8gTGVhdmUgdGhlIGNvbm5lY3Rpb24gb2JqZWN0IGZvciBjb2xsZWN0aW9uIG5vdy4KKyAgICAgICAgR0MucmVtb3ZlUm9vdChjYXN0KHZvaWQqKWNvbm5lY3Rpb24pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vLyBTb2NrZXQgdXNlZCB0byBsaXN0ZW4gZm9yIGNvbm5lY3Rpb25zIGFuZCBhY2NlcHRpbmcgdGhlbS4KKyAgU29ja2V0IGxpc3RlblNvY2tldF87CisKKyAgLy8vIFBvcnQgdG8gbGlzdGVuIG9uLgorICB1c2hvcnQgcG9ydF87CisKKyAgLy8vIFdoZXRoZXIgdG8gbGlzdGVuIG9uIElQdjYgb25seS4KKyAgYm9vbCBpcHY2T25seV87CisKKyAgLy8vIFRoZSB0b3RhbCBudW1iZXIgb2YgY29ubmVjdGlvbnMgZXhpc3RpbmcsIGJvdGggYWN0aXZlIGFuZCBpZGxlLgorICBzaXplX3QgbnVtQ29ubmVjdGlvbnNfOworCisgIC8vLyBUaGUgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHdoaWNoIGFyZSBjdXJyZW50bHkgd2FpdGluZyBmb3IgdGhlIHByb2Nlc3NvcgorICAvLy8gdG8gcmV0dXJuLgorICBzaGFyZWQgc2l6ZV90IG51bUFjdGl2ZVByb2Nlc3NvcnNfOworCisgIC8vLyBIeXN0ZXJlc2lzIGZvciBsZWF2aW5nIG92ZXJsb2FkIHN0YXRlLgorICBkb3VibGUgb3ZlcmxvYWRIeXN0ZXJlc2lzXzsKKworICAvLy8gV2hldGhlciB0aGUgc2VydmVyIGlzIGN1cnJlbnRseSBvdmVybG9hZGVkLgorICBib29sIG92ZXJsb2FkZWRfOworCisgIC8vLyBOdW1iZXIgb2YgY29ubmVjdGlvbnMgZHJvcHBlZCBzaW5jZSB0aGUgc2VydmVyIGVudGVyZWQgdGhlIGN1cnJlbnQKKyAgLy8vIG92ZXJsb2FkZWQgc3RhdGUuCisgIHVpbnQgbkNvbm5lY3Rpb25zRHJvcHBlZF87CisKKyAgLy8vIE51bWJlciBvZiBjb25uZWN0aW9ucyBkcm9wcGVkIGR1ZSB0byBvdmVybG9hZCBzaW5jZSB0aGUgc2VydmVyIHN0YXJ0ZWQuCisgIHVsb25nIG5Ub3RhbENvbm5lY3Rpb25zRHJvcHBlZF87CisKKyAgLy8vIFRoZSB0YXNrIHBvb2wgdXNlZCBmb3IgcHJvY2Vzc2luZyByZXF1ZXN0cy4KKyAgVGFza1Bvb2wgdGFza1Bvb2xfOworCisgIC8vLyBOdW1iZXIgb2YgSU8gdGhyZWFkcyB0aGlzIHNlcnZlciB3aWxsIHVzZSAoPj0gMSkuCisgIHNpemVfdCBudW1JT1RocmVhZHNfOworCisgIC8vLyBUaGUgSU9Mb29wcyBhbW9uZyB3aGljaCBzb2NrZXQgaGFuZGxpbmcgd29yayBpcyBkaXN0cmlidXRlZC4KKyAgSU9Mb29wW10gaW9Mb29wc187CisKKyAgLy8vIFRoZSBpbmRleCBvZiB0aGUgbG9vcCBpbiBpb0xvb3BzXyB3aGljaCB3aWxsIGhhbmRsZSB0aGUgbmV4dCBhY2NlcHRlZAorICAvLy8gY29ubmVjdGlvbi4KKyAgc2l6ZV90IG5leHRJT0xvb3BfOworCisgIC8vLyBBbGwgdGhlIGNvbm5lY3Rpb24gb2JqZWN0cyB3aGljaCBoYXZlIGJlZW4gY3JlYXRlZCBidXQgYXJlIG5vdCBjdXJyZW50bHkKKyAgLy8vIGluIHVzZS4gV2hlbiBhIGNvbm5lY3Rpb24gaXMgY2xvc2VkLCBpdCBpdCBwbGFjZWQgaGVyZSB0byBlbmFibGUgb2JqZWN0CisgIC8vLyAocmVzcC4gYnVmZmVyKSByZXVzZS4KKyAgQ29ubmVjdGlvbltdIGNvbm5lY3Rpb25TdGFja187CisKKyAgLy8vIFRoaXMgbXV0ZXggcHJvdGVjdHMgdGhlIGNvbm5lY3Rpb24gc3RhY2suCisgIE11dGV4IGNvbm5lY3Rpb25NdXRleF87Cit9CisKK3ByaXZhdGUgeworICAvKgorICAgKiBFbmNhcHN1bGF0ZXMgYSBsaWJldmVudCBldmVudCBsb29wLgorICAgKgorICAgKiBUaGUgZGVzaWduIGlzIGEgYml0IG9mIGEgbWVzcywgc2luY2UgdGhlIGZpcnN0IGxvb3AgaXMgYWN0dWFsbHkgcnVuIG9uIHRoZQorICAgKiBzZXJ2ZXIgdGhyZWFkIGl0c2VsZiBhbmQgaXMgc3BlY2lhbCBiZWNhdXNlIGl0IGlzIHRoZSBvbmx5IGluc3RhbmNlIGZvcgorICAgKiB3aGljaCBsaXN0ZW5Tb2NrZXRfIGlzIG5vdCBudWxsLgorICAgKi8KKyAgZmluYWwgY2xhc3MgSU9Mb29wIHsKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGFuZCBzZXQgdXAgdGhlIGV2ZW50IGJhc2UuCisgICAgICoKKyAgICAgKiBJZiBsaXN0ZW5Tb2NrZXQgaXMgbm90IG51bGwsIHRoZSB0aHJlYWQgd2lsbCBhbHNvIGFjY2VwdCBuZXcKKyAgICAgKiBjb25uZWN0aW9ucyBpdHNlbGYuCisgICAgICovCisgICAgdGhpcyhUTm9uYmxvY2tpbmdTZXJ2ZXIgc2VydmVyLCBTb2NrZXQgbGlzdGVuU29ja2V0KSB7CisgICAgICBzZXJ2ZXJfID0gc2VydmVyOworICAgICAgbGlzdGVuU29ja2V0XyA9IGxpc3RlblNvY2tldDsKKyAgICAgIGluaXRNdXRleF8gPSBuZXcgTXV0ZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVucyB0aGUgZXZlbnQgbG9vcDsgb25seSByZXR1cm5zIGFmdGVyIGEgY2FsbCB0byBzdG9wKCkuCisgICAgICovCisgICAgdm9pZCBydW4oKSB7CisgICAgICBhc3NlcnQoIWF0b21pY0xvYWQoaW5pdGlhbGl6ZWRfKSwgIklPTG9vcCBhbHJlYWR5IHJ1bm5pbmc/ISIpOworCisgICAgICBzeW5jaHJvbml6ZWQgKGluaXRNdXRleF8pIHsKKyAgICAgICAgaWYgKGF0b21pY0xvYWQoc2h1dHRpbmdEb3duXykpIHJldHVybjsKKyAgICAgICAgYXRvbWljU3RvcmUoaW5pdGlhbGl6ZWRfLCB0cnVlKTsKKworICAgICAgICBhc3NlcnQoIWV2ZW50QmFzZV8pOworICAgICAgICBldmVudEJhc2VfID0gZXZlbnRfYmFzZV9uZXcoKTsKKworICAgICAgICBpZiAobGlzdGVuU29ja2V0XykgeworICAgICAgICAgIC8vIExvZyB0aGUgbGliZXZlbnQgdmVyc2lvbiBhbmQgYmFja2VuZC4KKyAgICAgICAgICBsb2dJbmZvKCJsaWJldmVudCB2ZXJzaW9uICVzLCB1c2luZyBtZXRob2QgJXMuIiwKKyAgICAgICAgICAgIHRvIXN0cmluZyhldmVudF9nZXRfdmVyc2lvbigpKSwgdG8hc3RyaW5nKGV2ZW50X2Jhc2VfZ2V0X21ldGhvZChldmVudEJhc2VfKSkpOworCisgICAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGV2ZW50IGZvciB0aGUgbGlzdGVuaW5nIHNvY2tldC4KKyAgICAgICAgICBsaXN0ZW5FdmVudF8gPSBldmVudF9uZXcoZXZlbnRCYXNlXywgbGlzdGVuU29ja2V0Xy5oYW5kbGUsCisgICAgICAgICAgICBFVl9SRUFEIHwgRVZfUEVSU0lTVCB8IEVWX0VULAorICAgICAgICAgICAgYXNzdW1lTm90aHJvdygmVE5vbmJsb2NraW5nU2VydmVyLmFjY2VwdENvbm5lY3Rpb25zQ2FsbGJhY2spLAorICAgICAgICAgICAgY2FzdCh2b2lkKilzZXJ2ZXJfKTsKKyAgICAgICAgICBpZiAoZXZlbnRfYWRkKGxpc3RlbkV2ZW50XywgbnVsbCkgPT0gLTEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJldmVudF9hZGQgZm9yIHRoZSBsaXN0ZW5pbmcgc29ja2V0IGV2ZW50IGZhaWxlZC4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhdXRvIHBhaXIgPSBzb2NrZXRQYWlyKCk7CisgICAgICAgIGZvcmVhY2ggKHM7IHBhaXIpIHMuYmxvY2tpbmcgPSBmYWxzZTsKKyAgICAgICAgY29tcGxldGlvblNlbmRTb2NrZXRfID0gcGFpclswXTsKKyAgICAgICAgY29tcGxldGlvblJlY2VpdmVTb2NrZXRfID0gcGFpclsxXTsKKworICAgICAgICAvLyBSZWdpc3RlciBhbiBldmVudCBmb3IgdGhlIHRhc2sgY29tcGxldGlvbiBub3RpZmljYXRpb24gc29ja2V0LgorICAgICAgICBjb21wbGV0aW9uRXZlbnRfID0gZXZlbnRfbmV3KGV2ZW50QmFzZV8sIGNvbXBsZXRpb25SZWNlaXZlU29ja2V0Xy5oYW5kbGUsCisgICAgICAgICAgRVZfUkVBRCB8IEVWX1BFUlNJU1QgfCBFVl9FVCwgYXNzdW1lTm90aHJvdygmY29tcGxldGVkQ2FsbGJhY2spLAorICAgICAgICAgIGNhc3Qodm9pZCopdGhpcyk7CisKKyAgICAgICAgaWYgKGV2ZW50X2FkZChjb21wbGV0aW9uRXZlbnRfLCBudWxsKSA9PSAtMSkgeworICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJldmVudF9hZGQgZm9yIHRoZSBub3RpZmljYXRpb24gc29ja2V0IGZhaWxlZC4iKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBSdW4gbGliZXZlbnQgZW5naW5lLCByZXR1cm5zIG9ubHkgYWZ0ZXIgc3RvcCgpLgorICAgICAgZXZlbnRfYmFzZV9kaXNwYXRjaChldmVudEJhc2VfKTsKKworICAgICAgaWYgKGxpc3RlbkV2ZW50XykgeworICAgICAgICBldmVudF9mcmVlKGxpc3RlbkV2ZW50Xyk7CisgICAgICAgIGxpc3RlbkV2ZW50XyA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGV2ZW50X2ZyZWUoY29tcGxldGlvbkV2ZW50Xyk7CisgICAgICBjb21wbGV0aW9uRXZlbnRfID0gbnVsbDsKKworICAgICAgY29tcGxldGlvblNlbmRTb2NrZXRfLmNsb3NlKCk7CisgICAgICBjb21wbGV0aW9uU2VuZFNvY2tldF8gPSBudWxsOworCisgICAgICBjb21wbGV0aW9uUmVjZWl2ZVNvY2tldF8uY2xvc2UoKTsKKyAgICAgIGNvbXBsZXRpb25SZWNlaXZlU29ja2V0XyA9IG51bGw7CisKKyAgICAgIGV2ZW50X2Jhc2VfZnJlZShldmVudEJhc2VfKTsKKyAgICAgIGV2ZW50QmFzZV8gPSBudWxsOworCisgICAgICBhdG9taWNTdG9yZShzaHV0dGluZ0Rvd25fLCBmYWxzZSk7CisKKyAgICAgIGluaXRpYWxpemVkXyA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBuZXcgY29ubmVjdGlvbiBoYW5kbGVkIGJ5IHRoaXMgbG9vcC4KKyAgICAgKi8KKyAgICB2b2lkIGFkZENvbm5lY3Rpb24oKSB7CisgICAgICArK251bUFjdGl2ZUNvbm5lY3Rpb25zXzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNwb3NlcyBhIGNvbm5lY3Rpb24gb2JqZWN0ICh0eXBpY2FsbHkgYWZ0ZXIgaXQgaGFzIGJlZW4gY2xvc2VkKS4KKyAgICAgKi8KKyAgICB2b2lkIGRpc3Bvc2VDb25uZWN0aW9uKENvbm5lY3Rpb24gY29ubikgeworICAgICAgc2VydmVyXy5kaXNwb3NlQ29ubmVjdGlvbihjb25uKTsKKyAgICAgIGFzc2VydChudW1BY3RpdmVDb25uZWN0aW9uc18gPiAwKTsKKyAgICAgIC0tbnVtQWN0aXZlQ29ubmVjdGlvbnNfOworICAgICAgaWYgKG51bUFjdGl2ZUNvbm5lY3Rpb25zXyA9PSAwKSB7CisgICAgICAgIGlmIChhdG9taWNMb2FkKHNodXR0aW5nRG93bl8pKSB7CisgICAgICAgICAgZXZlbnRfYmFzZV9sb29wYnJlYWsoZXZlbnRCYXNlXyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmllcyB0aGUgZXZlbnQgbG9vcCB0aGF0IHRoZSBjdXJyZW50IHN0ZXAgKGluaXRpYWxpemF0aW9uLAorICAgICAqIHByb2Nlc3Npbmcgb2YgYSByZXF1ZXN0KSBvbiBhIGNlcnRhaW4gY29ubmVjdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHRocmVhZC1zYWZlLCBidXQgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmcm9tIHRoZQorICAgICAqIHRocmVhZCBydW5uaW5nIHRoZSBsb29wIGl0c2VsZi4KKyAgICAgKi8KKyAgICB2b2lkIG5vdGlmeUNvbXBsZXRlZChDb25uZWN0aW9uIGNvbm4pIHsKKyAgICAgIGFzc2VydCghIWNvbXBsZXRpb25TZW5kU29ja2V0Xyk7CisgICAgICBhdXRvIGJ5dGVzU2VudCA9IGNvbXBsZXRpb25TZW5kU29ja2V0Xy5zZW5kKGNhc3QodWJ5dGVbXSkoKCZjb25uKVswIC4uIDFdKSk7CisKKyAgICAgIGlmIChieXRlc1NlbnQgIT0gQ29ubmVjdGlvbi5zaXplb2YpIHsKKyAgICAgICAgbG9nRXJyb3IoIlNlbmRpbmcgY29tcGxldGlvbiBub3RpZmljYXRpb24gZmFpbGVkLCBjb25uZWN0aW9uIHdpbGwgIiB+CisgICAgICAgICAgIm5vdCBiZSBwcm9wZXJseSB0ZXJtaW5hdGVkLiIpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEV4aXRzIHRoZSBldmVudCBsb29wIGFmdGVyIGFsbCBjdXJyZW50bHkgYWN0aXZlIGNvbm5lY3Rpb25zIGhhdmUgYmVlbgorICAgICAqIGNsb3NlZC4KKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdGhyZWFkLXNhZmUuCisgICAgICovCisgICAgdm9pZCBzdG9wKCkgeworICAgICAgLy8gVGhlcmUgaXMgYSBidWcgaW4gZWl0aGVyIGxpYmV2ZW50IG9yIGl0cyBkb2N1bWVudGF0aW9uLCBoYXZpbmcgbm8KKyAgICAgIC8vIGV2ZW50cyByZWdpc3RlcmVkIGRvZXNuJ3QgYWN0dWFsbHkgdGVybWluYXRlIHRoZSBsb29wLCBiZWNhdXNlCisgICAgICAvLyBldmVudF9iYXNlX25ldygpIHJlZ2lzdGVycyBzb21lIGludGVybmFsIG9uZSBieSBjYWxsaW5nCisgICAgICAvLyBldnRocmVhZF9tYWtlX2Jhc2Vfbm90aWZpYWJsZSgpLgorICAgICAgLy8gRHVlIHRvIHRoaXMsIHdlIGNhbid0IHNpbXBseSByZW1vdmUgYWxsIGV2ZW50cyBhbmQgZXhwZWN0IHRoZSBldmVudAorICAgICAgLy8gbG9vcCB0byB0ZXJtaW5hdGUuIEluc3RlYWQsIHdlIHBpbmcgdGhlIGV2ZW50IGxvb3AgdXNpbmcgYSBudWxsCisgICAgICAvLyBjb21wbGV0aW9uIG1lc3NhZ2UuIFRoaXMgd2F5LCB3ZSBtYWtlIHN1cmUgdG8gd2FrZSB1cCB0aGUgbGliZXZlbnQKKyAgICAgIC8vIHRocmVhZCBpZiBpdCBub3QgY3VycmVudGx5IHByb2Nlc3NpbmcgYW55IGNvbm5lY3Rpb25zLiBJdCB3aWxsIGJyZWFrCisgICAgICAvLyBvdXQgb2YgdGhlIGxvb3AgaW4gZGlzcG9zZUNvbm5lY3Rpb24oKSBhZnRlciB0aGUgbGFzdCBhY3RpdmUKKyAgICAgIC8vIGNvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkLgorICAgICAgc3luY2hyb25pemVkIChpbml0TXV0ZXhfKSB7CisgICAgICAgIGF0b21pY1N0b3JlKHNodXR0aW5nRG93bl8sIHRydWUpOworICAgICAgICBpZiAoYXRvbWljTG9hZChpbml0aWFsaXplZF8pKSBub3RpZnlDb21wbGV0ZWQobnVsbCk7CisgICAgICB9CisgICAgfQorCisgIHByaXZhdGU6CisgICAgLyoqCisgICAgICogQyBjYWxsYmFjayB0byBjYWxsIGNvbXBsZXRlZCgpIGZyb20gbGliZXZlbnQuCisgICAgICoKKyAgICAgKiBFeHBlY3RzIHRoZSBjdXN0b20gYXJndW1lbnQgdG8gYmUgdGhlIHRoaXMgcG9pbnRlciBvZiB0aGUgYXNzb2NpYXRlZAorICAgICAqIElPTG9vcCBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBleHRlcm4oQykgc3RhdGljIHZvaWQgY29tcGxldGVkQ2FsbGJhY2soaW50IGZkLCBzaG9ydCB3aGF0LCB2b2lkKiBsb29wVGhpcykgeworICAgICAgYXNzZXJ0KHdoYXQgJiBFVl9SRUFEKTsKKyAgICAgIGF1dG8gbG9vcCA9IGNhc3QoSU9Mb29wKWxvb3BUaGlzOworICAgICAgYXNzZXJ0KGZkID09IGxvb3AuY29tcGxldGlvblJlY2VpdmVTb2NrZXRfLmhhbmRsZSk7CisgICAgICBsb29wLmNvbXBsZXRlZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGZyb20gdGhlIGNvbXBsZXRpb24gcmVjZWl2ZSBzb2NrZXQgYW5kIGFwcHJvcHJpYXRlbHkgdHJhbnNpdGlvbnMKKyAgICAgKiB0aGUgY29ubmVjdGlvbnMgYW5kIHNodXRzIGRvd24gdGhlIGxvb3AgaWYgcmVxdWVzdGVkLgorICAgICAqLworICAgIHZvaWQgY29tcGxldGVkKCkgeworICAgICAgQ29ubmVjdGlvbiBjb25uZWN0aW9uOworICAgICAgcHRyZGlmZl90IGJ5dGVzUmVhZDsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGJ5dGVzUmVhZCA9IGNvbXBsZXRpb25SZWNlaXZlU29ja2V0Xy5yZWNlaXZlKAorICAgICAgICAgIGNhc3QodWJ5dGVbXSkoKCZjb25uZWN0aW9uKVswIC4uIDFdKSk7CisgICAgICAgIGlmIChieXRlc1JlYWQgPCAwKSB7CisgICAgICAgICAgYXV0byBlcnJubyA9IGdldFNvY2tldEVycm5vKCk7CisKKyAgICAgICAgICBpZiAoZXJybm8gIT0gV09VTERfQkxPQ0tfRVJSTk8pIHsKKyAgICAgICAgICAgIGxvZ0Vycm9yKCJSZWFkaW5nIGZyb20gY29tcGxldGlvbiBzb2NrZXQgZmFpbGVkLCBzb21lIGNvbm5lY3Rpb24gIiB+CisgICAgICAgICAgICAgICJ3aWxsIG5ldmVyIGJlIHByb3Blcmx5IHRlcm1pbmF0ZWQ6ICVzIiwgc29ja2V0RXJybm9TdHJpbmcoZXJybm8pKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYnl0ZXNSZWFkICE9IENvbm5lY3Rpb24uc2l6ZW9mKSBicmVhazsKKworICAgICAgICBpZiAoIWNvbm5lY3Rpb24pIHsKKyAgICAgICAgICBhc3NlcnQoYXRvbWljTG9hZChzaHV0dGluZ0Rvd25fKSk7CisgICAgICAgICAgaWYgKG51bUFjdGl2ZUNvbm5lY3Rpb25zXyA9PSAwKSB7CisgICAgICAgICAgICBldmVudF9iYXNlX2xvb3BicmVhayhldmVudEJhc2VfKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjb25uZWN0aW9uLnRyYW5zaXRpb24oKTsKKyAgICAgIH0KKworICAgICAgaWYgKGJ5dGVzUmVhZCA+IDApIHsKKyAgICAgICAgbG9nRXJyb3IoIlVuZXhwZWN0ZWQgcGFydGlhbCByZWFkIGZyb20gY29tcGxldGlvbiBzb2NrZXQgIiB+CisgICAgICAgICAgIiglcyBieXRlcyBpbnN0ZWFkIG9mICVzKS4iLCBieXRlc1JlYWQsIENvbm5lY3Rpb24uc2l6ZW9mKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gYXNzb2NpYXRlZCBzZXJ2ZXIKKyAgICBUTm9uYmxvY2tpbmdTZXJ2ZXIgc2VydmVyXzsKKworICAgIC8vLyBUaGUgbWFuYWdlZCBsaXN0ZW5pbmcgc29ja2V0LCBpZiBhbnkuCisgICAgU29ja2V0IGxpc3RlblNvY2tldF87CisKKyAgICAvLy8gVGhlIGxpYmV2ZW50IGV2ZW50IGJhc2UgZm9yIHRoZSBsb29wLgorICAgIGV2ZW50X2Jhc2UqIGV2ZW50QmFzZV87CisKKyAgICAvLy8gVHJpZ2dlcmVkIG9uIGxpc3RlbiBzb2NrZXQgZXZlbnRzLgorICAgIGV2ZW50KiBsaXN0ZW5FdmVudF87CisKKyAgICAvLy8gVHJpZ2dlcmVkIG9uIGNvbXBsZXRpb24gcmVjZWl2ZSBzb2NrZXQgZXZlbnRzLgorICAgIGV2ZW50KiBjb21wbGV0aW9uRXZlbnRfOworCisgICAgLy8vIFNvY2tldCB1c2VkIHRvIHNlbmQgY29tcGxldGlvbiBub3RpZmljYXRpb24gbWVzc2FnZXMuIFBhaXJlZCB3aXRoCisgICAgLy8vIGNvbXBsZXRpb25SZWNlaXZlU29ja2V0Xy4KKyAgICBTb2NrZXQgY29tcGxldGlvblNlbmRTb2NrZXRfOworCisgICAgLy8vIFNvY2tldCB1c2VkIHRvIHNlbmQgY29tcGxldGlvbiBub3RpZmljYXRpb24gbWVzc2FnZXMuIFBhaXJlZCB3aXRoCisgICAgLy8vIGNvbXBsZXRpb25TZW5kU29ja2V0Xy4KKyAgICBTb2NrZXQgY29tcGxldGlvblJlY2VpdmVTb2NrZXRfOworCisgICAgLy8vIFdoZXRoZXIgdGhlIHNlcnZlciBpcyBjdXJyZW50bHkgc2h1dHRpbmcgZG93biAoaS5lLiB0aGUgY2FuY2VsbGF0aW9uIGhhcworICAgIC8vLyBiZWVuIHRyaWdnZXJlZCwgYnV0IG5vdCBhbGwgY2xpZW50IGNvbm5lY3Rpb25zIGhhdmUgYmVlbiBjbG9zZWQgeWV0KS4KKyAgICBzaGFyZWQgYm9vbCBzaHV0dGluZ0Rvd25fOworCisgICAgLy8vIFRoZSBudW1iZXIgb2YgY3VycmVudGx5IGFjdGl2ZSBjbGllbnQgY29ubmVjdGlvbnMuCisgICAgc2l6ZV90IG51bUFjdGl2ZUNvbm5lY3Rpb25zXzsKKworICAgIC8vLyBHdWFyZHMgbG9vcCBzdGFydHVwIHNvIHRoYXQgdGhlIGxvb3AgY2FuIGJlIHJlbGlhYmx5IHNodXQgZG93biBldmVuIGlmCisgICAgLy8vIGFub3RoZXIgdGhyZWFkIGhhcyBqdXN0IHN0YXJ0ZWQgdG8gZXhlY3V0ZSBydW4oKS4gTG9ja2VkIGR1cmluZworICAgIC8vLyBpbml0aWFsaXphdGlvbiBpbiBydW4oKS4gV2hlbiB1bmxvY2tlZCwgdGhlIGNvbXBsZXRpb24gbWVjaGFuaXNtIGlzCisgICAgLy8vIGV4cGVjdGVkIHRvIGJlIGZ1bGx5IHNldCB1cC4KKyAgICBNdXRleCBpbml0TXV0ZXhfOworICAgIHNoYXJlZCBib29sIGluaXRpYWxpemVkXzsgLy8vIERpdHRvCisgIH0KKworICAvKgorICAgKiBJL08gc3RhdGVzIGEgc29ja2V0IGNhbiBiZSBpbi4KKyAgICovCisgIGVudW0gU29ja2V0U3RhdGUgeworICAgIFJFQ1ZfRlJBTUVfU0laRSwgLy8vIFRoZSBmcmFtZSBzaXplIGlzIHJlY2VpdmVkLgorICAgIFJFQ1YsIC8vLyBUaGUgcGF5bG9hZCBpcyByZWNlaXZlZC4KKyAgICBTRU5EIC8vLyBUaGUgcmVzcG9uc2UgaXMgd3JpdHRlbiBiYWNrIG91dC4KKyAgfQorCisgIC8qCisgICAqIFN0YXRlcyBhIGNvbm5lY3Rpb24gY2FuIGJlIGluLgorICAgKi8KKyAgZW51bSBDb25uZWN0aW9uU3RhdGUgeworICAgIElOSVQsIC8vLyBUaGUgY29ubmVjdGlvbiB3aWxsIGJlIGluaXRpYWxpemVkLgorICAgIFJFQURfRlJBTUVfU0laRSwgLy8vIFRoZSBmb3VyIGZyYW1lIHNpemUgYnl0ZXMgYXJlIGJlaW5nIHJlYWQuCisgICAgUkVBRF9SRVFVRVNULCAvLy8gVGhlIHJlcXVlc3QgcGF5bG9hZCBpdHNlbGYgaXMgYmVpbmcgcmVhZC4KKyAgICBXQUlUX1BST0NFU1NPUiwgLy8vIFRoZSBjb25uZWN0aW9uIHdhaXRzIGZvciB0aGUgcHJvY2Vzc29yIHRvIGZpbmlzaC4KKyAgICBTRU5EX1JFU1VMVCAvLy8gVGhlIHJlc3VsdCBpcyB3cml0dGVuIGJhY2sgb3V0LgorICB9CisKKyAgLyoKKyAgICogQSBjb25uZWN0aW9uIHRoYXQgaXMgaGFuZGxlZCB2aWEgbGliZXZlbnQuCisgICAqCisgICAqIERhdGEgcmVjZWl2ZWQgaXMgYnVmZmVyZWQgdW50aWwgdGhlIHJlcXVlc3QgaXMgY29tcGxldGUgKHJldHVybmluZyBiYWNrIHRvCisgICAqIGxpYmV2ZW50IGlmIG5vdCksIGF0IHdoaWNoIHBvaW50IHRoZSBwcm9jZXNzb3IgaXMgaW52b2tlZC4KKyAgICovCisgIGZpbmFsIGNsYXNzIENvbm5lY3Rpb24geworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBUbyByZXVzZSBhIGNvbm5lY3Rpb24gb2JqZWN0IGxhdGVyIG9uLCB0aGUgaW5pdCgpIGZ1bmN0aW9uIGNhbiBiZSB1c2VkCisgICAgICogdG8gdGhlIHNhbWUgZWZmZWN0IG9uIHRoZSBpbnRlcm5hbCBzdGF0ZS4KKyAgICAgKi8KKyAgICB0aGlzKFNvY2tldCBzb2NrZXQsIElPTG9vcCBsb29wKSB7CisgICAgICAvLyBUaGUgaW5wdXQgYW5kIG91dHB1dCB0cmFuc3BvcnQgb2JqZWN0cyBhcmUgcmV1c2VkIGJldHdlZW4gY2xpZW50cworICAgICAgLy8gY29ubmVjdGlvbnMsIHNvIGluaXRpYWxpemUgdGhlbSBoZXJlIHJhdGhlciB0aGFuIGluIGluaXQoKS4KKyAgICAgIGlucHV0VHJhbnNwb3J0XyA9IG5ldyBUSW5wdXRSYW5nZVRyYW5zcG9ydCEodWJ5dGVbXSkoW10pOworICAgICAgb3V0cHV0VHJhbnNwb3J0XyA9IG5ldyBUTWVtb3J5QnVmZmVyKGxvb3Auc2VydmVyXy53cml0ZUJ1ZmZlckRlZmF1bHRTaXplKTsKKworICAgICAgaW5pdChzb2NrZXQsIGxvb3ApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHRoZSBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogUGFyYW1zOgorICAgICAqICAgc29ja2V0ID0gVGhlIHNvY2tldCB0byB3b3JrIG9uLgorICAgICAqICAgZXZlbnRGbGFncyA9IEFueSBmbGFncyB0byBwYXNzIHRvIGxpYmV2ZW50LgorICAgICAqICAgcyA9IFRoZSBzZXJ2ZXIgdGhpcyBjb25uZWN0aW9uIGlzIHBhcnQgb2YuCisgICAgICovCisgICAgdm9pZCBpbml0KFNvY2tldCBzb2NrZXQsIElPTG9vcCBsb29wKSB7CisgICAgICAvLyBUT0RPOiBUaGlzIGFsbG9jYXRpb24gY291bGQgYmUgYXZvaWRlZC4KKyAgICAgIHNvY2tldF8gPSBuZXcgVFNvY2tldChzb2NrZXQpOworCisgICAgICBsb29wXyA9IGxvb3A7CisgICAgICBzZXJ2ZXJfID0gbG9vcF8uc2VydmVyXzsKKyAgICAgIGNvbm5TdGF0ZV8gPSBDb25uZWN0aW9uU3RhdGUuSU5JVDsKKyAgICAgIGV2ZW50RmxhZ3NfID0gMDsKKworICAgICAgcmVhZEJ1ZmZlclBvc18gPSAwOworICAgICAgcmVhZFdhbnRfID0gMDsKKworICAgICAgd3JpdGVCdWZmZXJfID0gbnVsbDsKKyAgICAgIHdyaXRlQnVmZmVyUG9zXyA9IDA7CisgICAgICBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXyA9IDA7CisKKyAgICAgIHNvY2tldFN0YXRlXyA9IFNvY2tldFN0YXRlLlJFQ1ZfRlJBTUVfU0laRTsKKyAgICAgIGNhbGxzU2luY2VSZXNpemVfID0gMDsKKworICAgICAgZmFjdG9yeUlucHV0VHJhbnNwb3J0XyA9CisgICAgICAgIHNlcnZlcl8uaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChpbnB1dFRyYW5zcG9ydF8pOworICAgICAgZmFjdG9yeU91dHB1dFRyYW5zcG9ydF8gPQorICAgICAgICBzZXJ2ZXJfLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KG91dHB1dFRyYW5zcG9ydF8pOworCisgICAgICBpbnB1dFByb3RvY29sXyA9CisgICAgICAgIHNlcnZlcl8uaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woZmFjdG9yeUlucHV0VHJhbnNwb3J0Xyk7CisgICAgICBvdXRwdXRQcm90b2NvbF8gPQorICAgICAgICBzZXJ2ZXJfLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChmYWN0b3J5T3V0cHV0VHJhbnNwb3J0Xyk7CisKKyAgICAgIGlmIChzZXJ2ZXJfLmV2ZW50SGFuZGxlcikgeworICAgICAgICBjb25uZWN0aW9uQ29udGV4dF8gPQorICAgICAgICAgIHNlcnZlcl8uZXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXyk7CisgICAgICB9CisKKyAgICAgIGF1dG8gaW5mbyA9IFRDb25uZWN0aW9uSW5mbyhpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfLCBzb2NrZXRfKTsKKyAgICAgIHByb2Nlc3Nvcl8gPSBzZXJ2ZXJfLnByb2Nlc3NvckZhY3RvcnkuZ2V0UHJvY2Vzc29yKGluZm8pOworICAgIH0KKworICAgIH50aGlzKCkgeworICAgICAgZnJlZShyZWFkQnVmZmVyXyk7CisgICAgICBpZiAoZXZlbnRfKSB7CisgICAgICAgIGV2ZW50X2ZyZWUoZXZlbnRfKTsKKyAgICAgICAgZXZlbnRfID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBidWZmZXJzIGFnYWluc3QgdGhlIHNpemUgbGltaXRzIGFuZCBzaHJpbmsgdGhlbSBpZiBleGNlZWRlZC4KKyAgICAgKgorICAgICAqIFBhcmFtczoKKyAgICAgKiAgIHJlYWRMaW1pdCA9IFJlYWQgYnVmZmVyIHNpemUgbGltaXQgKGluIGJ5dGVzLCAwIHRvIGlnbm9yZSkuCisgICAgICogICB3cml0ZUxpbWl0ID0gV3JpdGUgYnVmZmVyIHNpemUgbGltaXQgKGluIGJ5dGVzLCAwIHRvIGlnbm9yZSkuCisgICAgICovCisgICAgdm9pZCBjaGVja0lkbGVCdWZmZXJMaW1pdChzaXplX3QgcmVhZExpbWl0LCBzaXplX3Qgd3JpdGVMaW1pdCkgeworICAgICAgaWYgKHJlYWRMaW1pdCA+IDAgJiYgcmVhZEJ1ZmZlclNpemVfID4gcmVhZExpbWl0KSB7CisgICAgICAgIGZyZWUocmVhZEJ1ZmZlcl8pOworICAgICAgICByZWFkQnVmZmVyXyA9IG51bGw7CisgICAgICAgIHJlYWRCdWZmZXJTaXplXyA9IDA7CisgICAgICB9CisKKyAgICAgIGlmICh3cml0ZUxpbWl0ID4gMCAmJiBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXyA+IHdyaXRlTGltaXQpIHsKKyAgICAgICAgLy8ganVzdCBzdGFydCBvdmVyCisgICAgICAgIG91dHB1dFRyYW5zcG9ydF8ucmVzZXQoc2VydmVyXy53cml0ZUJ1ZmZlckRlZmF1bHRTaXplKTsKKyAgICAgICAgbGFyZ2VzdFdyaXRlQnVmZmVyU2l6ZV8gPSAwOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zaXRpb25zIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLgorICAgICAqCisgICAgICogVGhpcyBpcyBjYWxsZWQgZS5nLiB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHJlYWQgY29tcGxldGVseSBvciBhbGwKKyAgICAgKiB0aGUgZGF0YSBoYXMgYmVlbiB3cml0dGVuIGJhY2suCisgICAgICovCisgICAgdm9pZCB0cmFuc2l0aW9uKCkgeworICAgICAgYXNzZXJ0KCEhbG9vcF8pOworICAgICAgYXNzZXJ0KCEhc2VydmVyXyk7CisKKyAgICAgIC8vIFN3aXRjaCB1cG9uIHRoZSBzdGF0ZSB0aGF0IHdlIGFyZSBjdXJyZW50bHkgaW4gYW5kIG1vdmUgdG8gYSBuZXcgc3RhdGUKKyAgICAgIGZpbmFsIHN3aXRjaCAoY29ublN0YXRlXykgeworICAgICAgICBjYXNlIENvbm5lY3Rpb25TdGF0ZS5SRUFEX1JFUVVFU1Q6CisgICAgICAgICAgLy8gV2UgYXJlIGRvbmUgcmVhZGluZyB0aGUgcmVxdWVzdCwgcGFja2FnZSB0aGUgcmVhZCBidWZmZXIgaW50byB0cmFuc3BvcnQKKyAgICAgICAgICAvLyBhbmQgZ2V0IGJhY2sgc29tZSBkYXRhIGZyb20gdGhlIGRpc3BhdGNoIGZ1bmN0aW9uCisgICAgICAgICAgaW5wdXRUcmFuc3BvcnRfLnJlc2V0KHJlYWRCdWZmZXJfWzAgLi4gcmVhZEJ1ZmZlclBvc19dKTsKKyAgICAgICAgICBvdXRwdXRUcmFuc3BvcnRfLnJlc2V0KCk7CisKKyAgICAgICAgICAvLyBQcmVwZW5kIGZvdXIgYnl0ZXMgb2YgYmxhbmsgc3BhY2UgdG8gdGhlIGJ1ZmZlciBzbyB3ZSBjYW4KKyAgICAgICAgICAvLyB3cml0ZSB0aGUgZnJhbWUgc2l6ZSB0aGVyZSBsYXRlci4KKyAgICAgICAgICAvLyBTdHJpY3RseSBzcGVha2luZywgd2Ugd291bGRuJ3QgaGF2ZSB0byB3cml0ZSBhbnl0aGluZywganVzdAorICAgICAgICAgIC8vIGluY3JlbWVudCB0aGUgVE1lbW9yeUJ1ZmZlciB3cml0ZU9mZnNldF8uIFRoaXMgd291bGQgeWllbGQgYSB0aW55CisgICAgICAgICAgLy8gcGVyZm9ybWFuY2UgZ2Fpbi4KKyAgICAgICAgICB1Ynl0ZVs0XSBzcGFjZSA9IHZvaWQ7CisgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0Xy53cml0ZShzcGFjZSk7CisKKyAgICAgICAgICBzZXJ2ZXJfLmluY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKKworICAgICAgICAgIHRhc2tQb29sXyA9IHNlcnZlcl8udGFza1Bvb2w7CisgICAgICAgICAgaWYgKHRhc2tQb29sXykgeworICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHRhc2sgYW5kIGFkZCBpdCB0byB0aGUgdGFzayBwb29sIHF1ZXVlLgorICAgICAgICAgICAgYXV0byBwcm9jZXNzaW5nVGFzayA9IHRhc2shcHJvY2Vzc1JlcXVlc3QodGhpcyk7CisgICAgICAgICAgICBjb25uU3RhdGVfID0gQ29ubmVjdGlvblN0YXRlLldBSVRfUFJPQ0VTU09SOworICAgICAgICAgICAgdGFza1Bvb2xfLnB1dChwcm9jZXNzaW5nVGFzayk7CisKKyAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gcHJvY2VzcyBhbnkgbW9yZSBkYXRhIHdoaWxlIHRoZSB0YXNrIGlzIGFjdGl2ZS4KKyAgICAgICAgICAgIHVucmVnaXN0ZXJFdmVudCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIEp1c3QgcHJvY2VzcyBpdCByaWdodCBub3cgaWYgdGhlcmUgaXMgbm8gdGFzayBwb29sIHNldC4KKyAgICAgICAgICBwcm9jZXNzUmVxdWVzdCh0aGlzKTsKKyAgICAgICAgICBnb3RvIGNhc2U7CisgICAgICAgIGNhc2UgQ29ubmVjdGlvblN0YXRlLldBSVRfUFJPQ0VTU09SOgorICAgICAgICAgIC8vIFdlIGhhdmUgbm93IGZpbmlzaGVkIHByb2Nlc3NpbmcgdGhlIHJlcXVlc3QsIHNldCB0aGUgZnJhbWUgc2l6ZQorICAgICAgICAgIC8vIGZvciB0aGUgb3V0cHV0VHJhbnNwb3J0XyBjb250ZW50cyBhbmQgc2V0IGV2ZXJ5dGhpbmcgdXAgdG8gd3JpdGUKKyAgICAgICAgICAvLyBpdCBvdXQgdmlhIGxpYmV2ZW50LgorICAgICAgICAgIHNlcnZlcl8uZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOworCisgICAgICAgICAgLy8gQWNxdWlyZSB0aGUgZGF0YSB3cml0dGVuIHRvIHRoZSB0cmFuc3BvcnQuCisgICAgICAgICAgLy8gS0xVREdFOiBUbyBhdm9pZCBjb3B5aW5nLCB3ZSBzaW1wbHkgY2FzdCB0aGUgY29uc3QgYXdheSBhbmQKKyAgICAgICAgICAvLyBtb2RpZnkgdGhlIGludGVybmFsIGJ1ZmZlciBvZiB0aGUgVE1lbW9yeUJ1ZmZlciDigJMgd29ya3Mgd2l0aCB0aGUKKyAgICAgICAgICAvLyBjdXJyZW50IGltcGxlbWVudGF0aW9uLCBidXQgaXNuJ3QgZXhhY3RseSBiZWF1dGlmdWwuCisgICAgICAgICAgd3JpdGVCdWZmZXJfID0gY2FzdCh1Ynl0ZVtdKW91dHB1dFRyYW5zcG9ydF8uZ2V0Q29udGVudHMoKTsKKworICAgICAgICAgIGFzc2VydCh3cml0ZUJ1ZmZlcl8ubGVuZ3RoID49IDQsICJUaGUgd3JpdGUgYnVmZmVyIHNob3VsZCBoYXZlICIgfgorICAgICAgICAgICAgImxlYXN0IHRoZSBpbml0aWFsbHkgYWRkZWQgZHVtbXkgbGVuZ3RoIGJ5dGVzLiIpOworICAgICAgICAgIGlmICh3cml0ZUJ1ZmZlcl8ubGVuZ3RoID09IDQpIHsKKyAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IHdhcyBvbmUtd2F5LCBubyByZXNwb25zZSB0byB3cml0ZS4KKyAgICAgICAgICAgIGdvdG8gY2FzZSBDb25uZWN0aW9uU3RhdGUuSU5JVDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBXcml0ZSB0aGUgZnJhbWUgc2l6ZSBpbnRvIHRoZSBmb3VyIGJ5dGVzIHJlc2VydmVkIGZvciBpdC4KKyAgICAgICAgICBhdXRvIHNpemUgPSBob3N0VG9OZXQoY2FzdCh1aW50KSh3cml0ZUJ1ZmZlcl8ubGVuZ3RoIC0gNCkpOworICAgICAgICAgIHdyaXRlQnVmZmVyX1swIC4uIDRdID0gY2FzdCh1Ynl0ZVtdKSgoJnNpemUpWzAgLi4gMV0pOworCisgICAgICAgICAgd3JpdGVCdWZmZXJQb3NfID0gMDsKKyAgICAgICAgICBzb2NrZXRTdGF0ZV8gPSBTb2NrZXRTdGF0ZS5TRU5EOworICAgICAgICAgIGNvbm5TdGF0ZV8gPSBDb25uZWN0aW9uU3RhdGUuU0VORF9SRVNVTFQ7CisgICAgICAgICAgcmVnaXN0ZXJFdmVudChFVl9XUklURSB8IEVWX1BFUlNJU1QpOworCisgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIENvbm5lY3Rpb25TdGF0ZS5TRU5EX1JFU1VMVDoKKyAgICAgICAgICAvLyBUaGUgcmVzdWx0IGhhcyBiZWVuIHNlbnQgYmFjayB0byB0aGUgY2xpZW50LCB3ZSBkb24ndCBuZWVkIHRoZQorICAgICAgICAgIC8vIGJ1ZmZlcnMgYW55bW9yZS4KKyAgICAgICAgICBpZiAod3JpdGVCdWZmZXJfLmxlbmd0aCA+IGxhcmdlc3RXcml0ZUJ1ZmZlclNpemVfKSB7CisgICAgICAgICAgICBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXyA9IHdyaXRlQnVmZmVyXy5sZW5ndGg7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHNlcnZlcl8ucmVzaXplQnVmZmVyRXZlcnlOID4gMCAmJgorICAgICAgICAgICAgICArK2NhbGxzU2luY2VSZXNpemVfID49IHNlcnZlcl8ucmVzaXplQnVmZmVyRXZlcnlOCisgICAgICAgICAgKSB7CisgICAgICAgICAgICBjaGVja0lkbGVCdWZmZXJMaW1pdChzZXJ2ZXJfLmlkbGVSZWFkQnVmZmVyTGltaXQsCisgICAgICAgICAgICAgIHNlcnZlcl8uaWRsZVdyaXRlQnVmZmVyTGltaXQpOworICAgICAgICAgICAgY2FsbHNTaW5jZVJlc2l6ZV8gPSAwOworICAgICAgICAgIH0KKworICAgICAgICAgIGdvdG8gY2FzZTsKKyAgICAgICAgY2FzZSBDb25uZWN0aW9uU3RhdGUuSU5JVDoKKyAgICAgICAgICB3cml0ZUJ1ZmZlcl8gPSBudWxsOworICAgICAgICAgIHdyaXRlQnVmZmVyUG9zXyA9IDA7CisgICAgICAgICAgc29ja2V0U3RhdGVfID0gU29ja2V0U3RhdGUuUkVDVl9GUkFNRV9TSVpFOworICAgICAgICAgIGNvbm5TdGF0ZV8gPSBDb25uZWN0aW9uU3RhdGUuUkVBRF9GUkFNRV9TSVpFOworICAgICAgICAgIHJlYWRCdWZmZXJQb3NfID0gMDsKKyAgICAgICAgICByZWdpc3RlckV2ZW50KEVWX1JFQUQgfCBFVl9QRVJTSVNUKTsKKworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSBDb25uZWN0aW9uU3RhdGUuUkVBRF9GUkFNRV9TSVpFOgorICAgICAgICAgIC8vIFdlIGp1c3QgcmVhZCB0aGUgcmVxdWVzdCBsZW5ndGgsIHNldCB1cCB0aGUgYnVmZmVycyBmb3IgcmVhZGluZworICAgICAgICAgIC8vIHRoZSBwYXlsb2FkLgorICAgICAgICAgIGlmIChyZWFkV2FudF8gPiByZWFkQnVmZmVyU2l6ZV8pIHsKKyAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGJ1ZmZlciBpcyB0b28gc21hbGwsIGV4cG9uZW50aWFsbHkgZ3JvdyB0aGUgYnVmZmVyCisgICAgICAgICAgICAvLyB1bnRpbCBpdCBpcyBiaWcgZW5vdWdoLgorCisgICAgICAgICAgICBpZiAocmVhZEJ1ZmZlclNpemVfID09IDApIHsKKyAgICAgICAgICAgICAgcmVhZEJ1ZmZlclNpemVfID0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXV0byBuZXdTaXplID0gcmVhZEJ1ZmZlclNpemVfOworICAgICAgICAgICAgd2hpbGUgKHJlYWRXYW50XyA+IG5ld1NpemUpIHsKKyAgICAgICAgICAgICAgbmV3U2l6ZSAqPSAyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdXRvIG5ld0J1ZmZlciA9IGNhc3QodWJ5dGUqKXJlYWxsb2MocmVhZEJ1ZmZlcl8sIG5ld1NpemUpOworICAgICAgICAgICAgaWYgKCFuZXdCdWZmZXIpIG9uT3V0T2ZNZW1vcnlFcnJvcigpOworCisgICAgICAgICAgICByZWFkQnVmZmVyXyA9IG5ld0J1ZmZlcjsKKyAgICAgICAgICAgIHJlYWRCdWZmZXJTaXplXyA9IG5ld1NpemU7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmVhZEJ1ZmZlclBvc189IDA7CisKKyAgICAgICAgICBzb2NrZXRTdGF0ZV8gPSBTb2NrZXRTdGF0ZS5SRUNWOworICAgICAgICAgIGNvbm5TdGF0ZV8gPSBDb25uZWN0aW9uU3RhdGUuUkVBRF9SRVFVRVNUOworCisgICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKworICBwcml2YXRlOgorICAgIC8qKgorICAgICAqIEMgY2FsbGJhY2sgdG8gY2FsbCB3b3JrU29ja2V0KCkgZnJvbSBsaWJldmVudC4KKyAgICAgKgorICAgICAqIEV4cGVjdHMgdGhlIGN1c3RvbSBhcmd1bWVudCB0byBiZSB0aGUgdGhpcyBwb2ludGVyIG9mIHRoZSBhc3NvY2lhdGVkCisgICAgICogY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBleHRlcm4oQykgc3RhdGljIHZvaWQgd29ya1NvY2tldENhbGxiYWNrKGludCBmZCwgc2hvcnQgZmxhZ3MsIHZvaWQqIGNvbm5UaGlzKSB7CisgICAgICBhdXRvIGNvbm4gPSBjYXN0KENvbm5lY3Rpb24pY29ublRoaXM7CisgICAgICBhc3NlcnQoZmQgPT0gY29ubi5zb2NrZXRfLnNvY2tldEhhbmRsZSk7CisgICAgICBjb25uLndvcmtTb2NrZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIGJ5IGxpYmV2ZW50IHdoZW4gc29tZXRoaW5nIGhhcHBlbnMgb24gdGhlIHNvY2tldC4KKyAgICAgKi8KKyAgICB2b2lkIHdvcmtTb2NrZXQoKSB7CisgICAgICBmaW5hbCBzd2l0Y2ggKHNvY2tldFN0YXRlXykgeworICAgICAgICBjYXNlIFNvY2tldFN0YXRlLlJFQ1ZfRlJBTUVfU0laRToKKyAgICAgICAgICAvLyBJZiBzb21lIGJ5dGVzIGhhdmUgYWxyZWFkeSBiZWVuIHJlYWQsIHRoZXkgaGF2ZSBiZWVuIGtlcHQgaW4KKyAgICAgICAgICAvLyByZWFkV2FudF8uCisgICAgICAgICAgYXV0byBmcmFtZVNpemUgPSByZWFkV2FudF87CisKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gUmVhZCBmcm9tIHRoZSBzb2NrZXQKKyAgICAgICAgICAgIGF1dG8gYnl0ZXNSZWFkID0gc29ja2V0Xy5yZWFkKAorICAgICAgICAgICAgICAoY2FzdCh1Ynl0ZVtdKSgoJmZyYW1lU2l6ZSlbMCAuLiAxXSkpW3JlYWRCdWZmZXJQb3NfIC4uICRdKTsKKyAgICAgICAgICAgIGlmIChieXRlc1JlYWQgPT0gMCkgeworICAgICAgICAgICAgICAvLyBDb3VsZG4ndCByZWFkIGFueXRoaW5nLCBidXQgd2UgaGF2ZSBiZWVuIG5vdGlmaWVkIOKAkyBjbGllbnQKKyAgICAgICAgICAgICAgLy8gaGFzIGRpc2Nvbm5lY3RlZC4KKyAgICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZWFkQnVmZmVyUG9zXyArPSBieXRlc1JlYWQ7CisgICAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0ZSkgeworICAgICAgICAgICAgbG9nRXJyb3IoIkZhaWxlZCB0byByZWFkIGZyYW1lIHNpemUgZnJvbSBjbGllbnQgY29ubmVjdGlvbjogJXMiLCB0ZSk7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChyZWFkQnVmZmVyUG9zXyA8IGZyYW1lU2l6ZS5zaXplb2YpIHsKKyAgICAgICAgICAgIC8vIEZyYW1lIHNpemUgbm90IGNvbXBsZXRlIHlldCwgc2F2ZSB0aGUgY3VycmVudCBidWZmZXIgaW4KKyAgICAgICAgICAgIC8vIHJlYWRXYW50XyBzbyB0aGF0IHRoZSByZW1haW5pbmcgYnl0ZXMgY2FuIGJlIHJlYWQgbGF0ZXIuCisgICAgICAgICAgICByZWFkV2FudF8gPSBmcmFtZVNpemU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgYXV0byBzaXplID0gbmV0VG9Ib3N0KGZyYW1lU2l6ZSk7CisgICAgICAgICAgaWYgKHNpemUgPiBzZXJ2ZXJfLm1heEZyYW1lU2l6ZSkgeworICAgICAgICAgICAgbG9nRXJyb3IoIkZyYW1lIHNpemUgdG9vIGxhcmdlICglcyA+ICVzKSwgY2xpZW50ICVzIG5vdCB1c2luZyAiIH4KKyAgICAgICAgICAgICAgIlRGcmFtZWRUcmFuc3BvcnQ/Iiwgc2l6ZSwgc2VydmVyXy5tYXhGcmFtZVNpemUsCisgICAgICAgICAgICAgIHNvY2tldF8uZ2V0UGVlckFkZHJlc3MoKS50b0hvc3ROYW1lU3RyaW5nKCkpOworICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgICAgcmVhZFdhbnRfID0gc2l6ZTsKKworICAgICAgICAgIC8vIE5vdyB3ZSBrbm93IHRoZSBmcmFtZSBzaXplLCBzZXQgZXZlcnl0aGluZyB1cCBmb3IgcmVhZGluZyB0aGUKKyAgICAgICAgICAvLyBwYXlsb2FkLgorICAgICAgICAgIHRyYW5zaXRpb24oKTsKKyAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgY2FzZSBTb2NrZXRTdGF0ZS5SRUNWOgorICAgICAgICAgIC8vIElmIHdlIGFscmVhZHkgZ290IGFsbCB0aGUgZGF0YSwgd2Ugc2hvdWxkIGJlIGluIHRoZSBTRU5EIHN0YXRlLgorICAgICAgICAgIGFzc2VydChyZWFkQnVmZmVyUG9zXyA8IHJlYWRXYW50Xyk7CisKKyAgICAgICAgICBzaXplX3QgYnl0ZXNSZWFkOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBSZWFkIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgc29ja2V0LgorICAgICAgICAgICAgYnl0ZXNSZWFkID0gc29ja2V0Xy5yZWFkKHJlYWRCdWZmZXJfW3JlYWRCdWZmZXJQb3NfIC4uIHJlYWRXYW50X10pOworICAgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdGUpIHsKKyAgICAgICAgICAgIGxvZ0Vycm9yKCJGYWlsZWQgdG8gcmVhZCBmcm9tIGNsaWVudCBzb2NrZXQ6ICVzIiwgdGUpOworICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoYnl0ZXNSZWFkID09IDApIHsKKyAgICAgICAgICAgIC8vIFdlIHdlcmUgbm90aWZpZWQsIGJ1dCBubyBieXRlcyBjb3VsZCBiZSByZWFkIC0+IHRoZSBjbGllbnQKKyAgICAgICAgICAgIC8vIGRpc2Nvbm5lY3RlZC4KKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgcmVhZEJ1ZmZlclBvc18gKz0gYnl0ZXNSZWFkOworICAgICAgICAgIGFzc2VydChyZWFkQnVmZmVyUG9zXyA8PSByZWFkV2FudF8pOworCisgICAgICAgICAgaWYgKHJlYWRCdWZmZXJQb3NfID09IHJlYWRXYW50XykgeworICAgICAgICAgICAgLy8gVGhlIHBheWxvYWQgaGFzIGJlZW4gcmVhZCBjb21wbGV0ZWx5LCBtb3ZlIG9uLgorICAgICAgICAgICAgdHJhbnNpdGlvbigpOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSBTb2NrZXRTdGF0ZS5TRU5EOgorICAgICAgICAgIGFzc2VydCh3cml0ZUJ1ZmZlclBvc18gPD0gd3JpdGVCdWZmZXJfLmxlbmd0aCk7CisKKyAgICAgICAgICBpZiAod3JpdGVCdWZmZXJQb3NfID09IHdyaXRlQnVmZmVyXy5sZW5ndGgpIHsKKyAgICAgICAgICAgIC8vIE5vdGhpbmcgbGVmdCB0byBzZW5kIOKAkyB0aGlzIHNob3VsZG4ndCBoYXBwZW4sIGp1c3QgbW92ZSBvbi4KKyAgICAgICAgICAgIGxvZ0luZm8oIldBUk5JTkc6IEluIHNlbmQgc3RhdGUsIGJ1dCBubyBkYXRhIHRvIHNlbmQuXG4iKTsKKyAgICAgICAgICAgIHRyYW5zaXRpb24oKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzaXplX3QgYnl0ZXNTZW50OworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlc1NlbnQgPSBzb2NrZXRfLndyaXRlU29tZSh3cml0ZUJ1ZmZlcl9bd3JpdGVCdWZmZXJQb3NfIC4uICRdKTsKKyAgICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHRlKSB7CisgICAgICAgICAgICBsb2dFcnJvcigiRmFpbGVkIHRvIHdyaXRlIHRvIGNsaWVudCBzb2NrZXQ6ICVzIiwgdGUpOworICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB3cml0ZUJ1ZmZlclBvc18gKz0gYnl0ZXNTZW50OworICAgICAgICAgIGFzc2VydCh3cml0ZUJ1ZmZlclBvc18gPD0gd3JpdGVCdWZmZXJfLmxlbmd0aCk7CisKKyAgICAgICAgICBpZiAod3JpdGVCdWZmZXJQb3NfID09IHdyaXRlQnVmZmVyXy5sZW5ndGgpIHsKKyAgICAgICAgICAgIC8vIFRoZSB3aG9sZSByZXNwb25zZSBoYXMgYmVlbiB3cml0dGVuIG91dCwgd2UgYXJlIGRvbmUuCisgICAgICAgICAgICB0cmFuc2l0aW9uKCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIGxpYmV2ZW50IGV2ZW50IGZvciB3b3JrU29ja2V0KCkgd2l0aCB0aGUgcGFzc2VkIGZsYWdzLAorICAgICAqIHVucmVnaXN0ZXJpbmcgdGhlIHByZXZpb3VzIG9uZSAoaWYgYW55KS4KKyAgICAgKi8KKyAgICB2b2lkIHJlZ2lzdGVyRXZlbnQoc2hvcnQgZXZlbnRGbGFncykgeworICAgICAgaWYgKGV2ZW50RmxhZ3NfID09IGV2ZW50RmxhZ3MpIHsKKyAgICAgICAgLy8gTm90aGluZyB0byBkbyBpZiBmbGFncyBhcmUgdGhlIHNhbWUuCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgLy8gRGVsZXRlIHRoZSBwcmV2aW91c2x5IGV4aXN0aW5nIGV2ZW50LgorICAgICAgdW5yZWdpc3RlckV2ZW50KCk7CisKKyAgICAgIGV2ZW50RmxhZ3NfID0gZXZlbnRGbGFnczsKKworICAgICAgaWYgKGV2ZW50RmxhZ3MgPT0gMCkgcmV0dXJuOworCisgICAgICBpZiAoIWV2ZW50XykgeworICAgICAgICAvLyBJZiB0aGUgZXZlbnQgd2FzIG5vdCBhbHJlYWR5IGFsbG9jYXRlZCwgZG8gaXQgbm93LgorICAgICAgICBldmVudF8gPSBldmVudF9uZXcobG9vcF8uZXZlbnRCYXNlXywgc29ja2V0Xy5zb2NrZXRIYW5kbGUsCisgICAgICAgICAgZXZlbnRGbGFnc18sIGFzc3VtZU5vdGhyb3coJndvcmtTb2NrZXRDYWxsYmFjayksIGNhc3Qodm9pZCopdGhpcyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBldmVudF9hc3NpZ24oZXZlbnRfLCBsb29wXy5ldmVudEJhc2VfLCBzb2NrZXRfLnNvY2tldEhhbmRsZSwKKyAgICAgICAgICBldmVudEZsYWdzXywgYXNzdW1lTm90aHJvdygmd29ya1NvY2tldENhbGxiYWNrKSwgY2FzdCh2b2lkKil0aGlzKTsKKyAgICAgIH0KKworICAgICAgLy8gQWRkIHRoZSBldmVudAorICAgICAgaWYgKGV2ZW50X2FkZChldmVudF8sIG51bGwpID09IC0xKSB7CisgICAgICAgIGxvZ0Vycm9yKCJldmVudF9hZGQoKSBmb3IgY2xpZW50IHNvY2tldCBmYWlsZWQuIik7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5yZWdpc3RlcnMgdGhlIGN1cnJlbnQgbGliZXZlbnQgZXZlbnQsIGlmIGFueS4KKyAgICAgKi8KKyAgICB2b2lkIHVucmVnaXN0ZXJFdmVudCgpIHsKKyAgICAgIGlmIChldmVudF8gJiYgZXZlbnRGbGFnc18gIT0gMCkgeworICAgICAgICBldmVudEZsYWdzXyA9IDA7CisgICAgICAgIGlmIChldmVudF9kZWwoZXZlbnRfKSA9PSAtMSkgeworICAgICAgICAgIGxvZ0Vycm9yKCJldmVudF9kZWwoKSBmb3IgY2xpZW50IHNvY2tldCBmYWlsZWQuIik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoaXMgY29ubmVjdGlvbiBhbmQgcmV0dXJucyBpdCBiYWNrIHRvIHRoZSBzZXJ2ZXIuCisgICAgICovCisgICAgdm9pZCBjbG9zZSgpIHsKKyAgICAgIHVucmVnaXN0ZXJFdmVudCgpOworCisgICAgICBpZiAoc2VydmVyXy5ldmVudEhhbmRsZXIpIHsKKyAgICAgICAgc2VydmVyXy5ldmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dCgKKyAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dF8sIGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8pOworICAgICAgfQorCisgICAgICAvLyBDbG9zZSB0aGUgc29ja2V0CisgICAgICBzb2NrZXRfLmNsb3NlKCk7CisKKyAgICAgIC8vIGNsb3NlIGFueSBmYWN0b3J5IHByb2R1Y2VkIHRyYW5zcG9ydHMuCisgICAgICBmYWN0b3J5SW5wdXRUcmFuc3BvcnRfLmNsb3NlKCk7CisgICAgICBmYWN0b3J5T3V0cHV0VHJhbnNwb3J0Xy5jbG9zZSgpOworCisgICAgICAvLyBUaGlzIGNvbm5lY3Rpb24gb2JqZWN0IGNhbiBub3cgYmUgcmV1c2VkLgorICAgICAgbG9vcF8uZGlzcG9zZUNvbm5lY3Rpb24odGhpcyk7CisgICAgfQorCisgICAgLy8vIFRoZSBzZXJ2ZXIgdGhpcyBjb25uZWN0aW9uIGJlbG9uZ3MgdG8uCisgICAgVE5vbmJsb2NraW5nU2VydmVyIHNlcnZlcl87CisKKyAgICAvLy8gVGhlIHRhc2sgcG9vbCB1c2VkIGZvciB0aGlzIGNvbm5lY3Rpb24uIFRoaXMgaXMgY2FjaGVkIGluc3RlYWQgb2YKKyAgICAvLy8gZGlyZWN0bHkgdXNpbmcgc2VydmVyXy50YXNrUG9vbCB0byBhdm9pZCBjb25mdXNpb24gaWYgaXQgaXMgY2hhbmdlZCBpbgorICAgIC8vLyBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGUgcmVxdWVzdCBpcyBwcm9jZXNzZWQuCisgICAgVGFza1Bvb2wgdGFza1Bvb2xfOworCisgICAgLy8vIFRoZSBJL08gdGhyZWFkIGhhbmRsaW5nIHRoaXMgY29ubmVjdGlvbi4KKyAgICBJT0xvb3AgbG9vcF87CisKKyAgICAvLy8gVGhlIHNvY2tldCBtYW5hZ2VkIGJ5IHRoaXMgY29ubmVjdGlvbi4KKyAgICBUU29ja2V0IHNvY2tldF87CisKKyAgICAvLy8gVGhlIGxpYmV2ZW50IG9iamVjdCB1c2VkIGZvciByZWdpc3RlcmluZyB0aGUgd29ya1NvY2tldENhbGxiYWNrLgorICAgIGV2ZW50KiBldmVudF87CisKKyAgICAvLy8gTGliZXZlbnQgZmxhZ3MKKyAgICBzaG9ydCBldmVudEZsYWdzXzsKKworICAgIC8vLyBTb2NrZXQgbW9kZQorICAgIFNvY2tldFN0YXRlIHNvY2tldFN0YXRlXzsKKworICAgIC8vLyBBcHBsaWNhdGlvbiBzdGF0ZQorICAgIENvbm5lY3Rpb25TdGF0ZSBjb25uU3RhdGVfOworCisgICAgLy8vIFRoZSBzaXplIG9mIHRoZSBmcmFtZSB0byByZWFkLiBJZiBzdGlsbCBpbiBSRUFEX0ZSQU1FX1NJWkUgc3RhdGUsIHNvbWUKKyAgICAvLy8gb2YgdGhlIGJ5dGVzIG1pZ2h0IG5vdCBoYXZlIGJlZW4gd3JpdHRlbiwgYW5kIHRoZSB2YWx1ZSBtaWdodCBzdGlsbCBiZQorICAgIC8vLyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuIEFuIHVpbnQgKG5vdCBhIHNpemVfdCkgYmVjYXVzZSB0aGUgZnJhbWUgc2l6ZSBvbgorICAgIC8vLyB0aGUgd2lyZSBpcyBzcGVjaWZpZWQgYXMgb25lLgorICAgIHVpbnQgcmVhZFdhbnRfOworCisgICAgLy8vIFRoZSBwb3NpdGlvbiBpbiB0aGUgcmVhZCBidWZmZXIsIGkuZS4gdGhlIG51bWJlciBvZiBwYXlsb2FkIGJ5dGVzCisgICAgLy8vIGFscmVhZHkgcmVjZWl2ZWQgZnJvbSB0aGUgc29ja2V0IGluIFJFQURfUkVRVUVTVCBzdGF0ZSwgcmVzcC4gdGhlCisgICAgLy8vIG51bWJlciBvZiBzaXplIGJ5dGVzIGluIFJFQURfRlJBTUVfU0laRSBzdGF0ZS4KKyAgICB1aW50IHJlYWRCdWZmZXJQb3NfOworCisgICAgLy8vIFJlYWQgYnVmZmVyCisgICAgdWJ5dGUqIHJlYWRCdWZmZXJfOworCisgICAgLy8vIFJlYWQgYnVmZmVyIHNpemUKKyAgICBzaXplX3QgcmVhZEJ1ZmZlclNpemVfOworCisgICAgLy8vIFdyaXRlIGJ1ZmZlcgorICAgIHVieXRlW10gd3JpdGVCdWZmZXJfOworCisgICAgLy8vIEhvdyBmYXIgdGhyb3VnaCB3cml0aW5nIGFyZSB3ZT8KKyAgICBzaXplX3Qgd3JpdGVCdWZmZXJQb3NfOworCisgICAgLy8vIExhcmdlc3Qgc2l6ZSBvZiB3cml0ZSBidWZmZXIgc2VlbiBzaW5jZSBidWZmZXIgd2FzIGNvbnN0cnVjdGVkCisgICAgc2l6ZV90IGxhcmdlc3RXcml0ZUJ1ZmZlclNpemVfOworCisgICAgLy8vIE51bWJlciBvZiBjYWxscyBzaW5jZSB0aGUgbGFzdCB0aW1lIGNoZWNrSWRsZUJ1ZmZlckxpbWl0IGhhcyBiZWVuCisgICAgLy8vIGludm9rZWQgKHNlZSBUU2VydmVyLnJlc2l6ZUJ1ZmZlckV2ZXJ5TikuCisgICAgdWludCBjYWxsc1NpbmNlUmVzaXplXzsKKworICAgIC8vLyBCYXNlIHRyYW5zcG9ydHMgdGhlIHByb2Nlc3NvciByZWFkcyBmcm9tL3dyaXRlcyB0by4KKyAgICBUSW5wdXRSYW5nZVRyYW5zcG9ydCEodWJ5dGVbXSkgaW5wdXRUcmFuc3BvcnRfOworICAgIFRNZW1vcnlCdWZmZXIgb3V0cHV0VHJhbnNwb3J0XzsKKworICAgIC8vLyBUaGUgYWN0dWFsIHRyYW5zcG9ydHMgcGFzc2VkIHRvIHRoZSBwcm9jZXNzb3Igb2J0YWluZWQgdmlhIHRoZQorICAgIC8vLyB0cmFuc3BvcnQgZmFjdG9yeS4KKyAgICBUVHJhbnNwb3J0IGZhY3RvcnlJbnB1dFRyYW5zcG9ydF87CisgICAgVFRyYW5zcG9ydCBmYWN0b3J5T3V0cHV0VHJhbnNwb3J0XzsgLy8vIERpdHRvCisKKyAgICAvLy8gSW5wdXQvb3V0cHV0IHByb3RvY29scywgY29ubmVjdGVkIHRvIGZhY3Rvcnl7SW5wdXQsIE91dHB1dH1UcmFuc3BvcnQuCisgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2xfOworICAgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbF87IC8vLyBEaXR0by4KKworICAgIC8vLyBDb25uZWN0aW9uIGNvbnRleHQgb3B0aW9uYWxseSBjcmVhdGVkIGJ5IHRoZSBzZXJ2ZXIgZXZlbnQgaGFuZGxlci4KKyAgICBWYXJpYW50IGNvbm5lY3Rpb25Db250ZXh0XzsKKworICAgIC8vLyBUaGUgcHJvY2Vzc29yIHVzZWQgZm9yIHRoaXMgY29ubmVjdGlvbi4KKyAgICBUUHJvY2Vzc29yIHByb2Nlc3Nvcl87CisgIH0KK30KKworLyoKKyAqIFRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgZnVuY3Rpb24sIHdoaWNoIGludm9rZXMgdGhlIHByb2Nlc3NvciBmb3IgdGhlIHNlcnZlcgorICogZm9yIGFsbCB0aGUgUlBDIG1lc3NhZ2VzIHJlY2VpdmVkIG92ZXIgYSBjb25uZWN0aW9uLgorICoKKyAqIE11c3QgYmUgcHVibGljIGJlY2F1c2UgaXQgaXMgcGFzc2VkIGFzIGFsaWFzIHRvIHN0ZC5wYXJhbGxlbGlzbS50YXNrKCkuCisgKi8KK3ZvaWQgcHJvY2Vzc1JlcXVlc3QoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7CisgIHRyeSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHdpdGggKGNvbm5lY3Rpb24pIHsKKyAgICAgICAgaWYgKHNlcnZlcl8uZXZlbnRIYW5kbGVyKSB7CisgICAgICAgICAgc2VydmVyXy5ldmVudEhhbmRsZXIucHJlUHJvY2Vzcyhjb25uZWN0aW9uQ29udGV4dF8sIHNvY2tldF8pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFwcm9jZXNzb3JfLnByb2Nlc3MoaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXywKKyAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dF8pIHx8ICFpbnB1dFByb3RvY29sXy50cmFuc3BvcnQucGVlaygpCisgICAgICAgICkgeworICAgICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IGZ1bmRhbWVudGFsbHkgd3Jvbmcgb3IgdGhlcmUgaXMgbm90aGluZyBtb3JlIHRvCisgICAgICAgICAgLy8gcHJvY2VzcywgY2xvc2UgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgbG9nRXJyb3IoIkNsaWVudCBkaWVkOiAlcyIsIHR0eCk7CisgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgbG9nRXJyb3IoIlVuY2F1Z2h0IGV4Y2VwdGlvbjogJXMiLCBlKTsKKyAgfQorCisgIGlmIChjb25uZWN0aW9uLnRhc2tQb29sXykgY29ubmVjdGlvbi5sb29wXy5ub3RpZnlDb21wbGV0ZWQoY29ubmVjdGlvbik7Cit9CisKK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHRocmlmdC5pbnRlcm5hbC50ZXN0LnNlcnZlcjsKKworICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlIGluZm8gbG9nIG91dHB1dCBpbiBvcmRlciBub3QgdG8gc3BhbSB0aGUgdGVzdCByZXN1bHRzCisgIC8vIHdpdGggc3RhcnR1cCBpbmZvIG1lc3NhZ2VzLgorICBhdXRvIG9sZEluZm9Mb2dTaW5rID0gZ19pbmZvTG9nU2luazsKKyAgZ19pbmZvTG9nU2luayA9IG51bGw7CisgIHNjb3BlIChleGl0KSBnX2luZm9Mb2dTaW5rID0gb2xkSW5mb0xvZ1Npbms7CisKKyAgLy8gVGVzdCBpbi1saW5lIHByb2Nlc3Npbmcgc2h1dGRvd24gd2l0aCBvbmUgYXMgd2VsbCBhcyBzZXZlcmFsIEkvTyB0aHJlYWRzLgorICB0ZXN0U2VydmVDYW5jZWwhKFROb25ibG9ja2luZ1NlcnZlcikoKTsKKyAgdGVzdFNlcnZlQ2FuY2VsIShUTm9uYmxvY2tpbmdTZXJ2ZXIpKChUTm9uYmxvY2tpbmdTZXJ2ZXIgcykgeworICAgIHMubnVtSU9UaHJlYWRzID0gNDsKKyAgfSk7CisKKyAgLy8gVGVzdCB0YXNrIHBvb2wgcHJvY2Vzc2luZyBzaHV0ZG93biB3aXRoIG9uZSBhcyB3ZWxsIGFzIHNldmVyYWwgSS9PIHRocmVhZHMuCisgIGF1dG8gdHAgPSBuZXcgVGFza1Bvb2woNCk7CisgIHRwLmlzRGFlbW9uID0gdHJ1ZTsKKyAgdGVzdFNlcnZlQ2FuY2VsIShUTm9uYmxvY2tpbmdTZXJ2ZXIpKChUTm9uYmxvY2tpbmdTZXJ2ZXIgcykgeworICAgIHMudGFza1Bvb2wgPSB0cDsKKyAgfSk7CisgIHRlc3RTZXJ2ZUNhbmNlbCEoVE5vbmJsb2NraW5nU2VydmVyKSgoVE5vbmJsb2NraW5nU2VydmVyIHMpIHsKKyAgICBzLnRhc2tQb29sID0gdHA7CisgICAgcy5udW1JT1RocmVhZHMgPSA0OworICB9KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3NpbXBsZS5kIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvc2ltcGxlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFiYTRjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3NpbXBsZS5kCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnNlcnZlci5zaW1wbGU7CisKK2ltcG9ydCBzdGQudmFyaWFudCA6IFZhcmlhbnQ7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLnByb2Nlc3NvcjsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOworCisvKioKKyAqIFRoZSBtb3N0IGJhc2ljIHNlcnZlci4KKyAqCisgKiBJdCBpcyBzaW5nbGUtdGhyZWFkZWQgYW5kIGFmdGVyIGl0IGFjY2VwdHMgYSBjb25uZWN0aW9ucywgaXQgcHJvY2Vzc2VzCisgKiByZXF1ZXN0cyBvbiBpdCB1bnRpbCBpdCBjbG9zZXMsIHRoZW4gd2FpdGluZyBmb3IgdGhlIG5leHQgY29ubmVjdGlvbi4KKyAqCisgKiBJdCBpcyBub3Qgc28gbXVjaCBvZiB1c2UgaW4gcHJvZHVjdGlvbiB0aGFuIGl0IGlzIGZvciB3cml0aW5nIHVuaXR0ZXN0cywgb3IKKyAqIGFzIGFuIGV4YW1wbGUgb24gaG93IHRvIHByb3ZpZGUgYSBjdXN0b20gVFNlcnZlciBpbXBsZW1lbnRhdGlvbi4KKyAqLworY2xhc3MgVFNpbXBsZVNlcnZlciA6IFRTZXJ2ZXIgeworICAvLy8KKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5CisgICkgeworICAgIHN1cGVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOworICB9CisKKyAgLy8vCisgIHRoaXMoCisgICAgVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5CisgICkgeworICAgIHN1cGVyKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKyAgfQorCisgIC8vLworICB0aGlzKAorICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnkKKyAgKSB7CisgICAgc3VwZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOworICB9CisKKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnkKKyAgKSB7CisgICAgc3VwZXIocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LCBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgc2VydmUoVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24gPSBudWxsKSB7CisgICAgc2VydmVyVHJhbnNwb3J0Xy5saXN0ZW4oKTsKKworICAgIGlmIChldmVudEhhbmRsZXIpIGV2ZW50SGFuZGxlci5wcmVTZXJ2ZSgpOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIFRUcmFuc3BvcnQgY2xpZW50OworICAgICAgVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydDsKKyAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0OworICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2w7CisgICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2w7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydF8uYWNjZXB0KGNhbmNlbGxhdGlvbik7CisgICAgICAgIHNjb3BlKGZhaWx1cmUpIGNsaWVudC5jbG9zZSgpOworCisgICAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgc2NvcGUoZmFpbHVyZSkgaW5wdXRUcmFuc3BvcnQuY2xvc2UoKTsKKworICAgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgc2NvcGUoZmFpbHVyZSkgb3V0cHV0VHJhbnNwb3J0LmNsb3NlKCk7CisKKyAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOworICAgICAgfSBjYXRjaCAoVENhbmNlbGxlZEV4Y2VwdGlvbiB0Y3gpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgICBsb2dFcnJvcigiVFNlcnZlclRyYW5zcG9ydCBmYWlsZWQgb24gYWNjZXB0OiAlcyIsIHR0eCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiB0eCkgeworICAgICAgICBsb2dFcnJvcigiQ2F1Z2h0IFRFeGNlcHRpb24gb24gYWNjZXB0OiAlcyIsIHR4KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGF1dG8gaW5mbyA9IFRDb25uZWN0aW9uSW5mbyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgY2xpZW50KTsKKyAgICAgIGF1dG8gcHJvY2Vzc29yID0gcHJvY2Vzc29yRmFjdG9yeV8uZ2V0UHJvY2Vzc29yKGluZm8pOworCisgICAgICBWYXJpYW50IGNvbm5lY3Rpb25Db250ZXh0OworICAgICAgaWYgKGV2ZW50SGFuZGxlcikgeworICAgICAgICBjb25uZWN0aW9uQ29udGV4dCA9CisgICAgICAgICAgZXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgIGlmIChldmVudEhhbmRsZXIpIHsKKyAgICAgICAgICAgIGV2ZW50SGFuZGxlci5wcmVQcm9jZXNzKGNvbm5lY3Rpb25Db250ZXh0LCBjbGllbnQpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghcHJvY2Vzc29yLnByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsCisgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCkgfHwgIWlucHV0UHJvdG9jb2wudHJhbnNwb3J0LnBlZWsoKQorICAgICAgICAgICkgeworICAgICAgICAgICAgLy8gU29tZXRoaW5nIHdlbnQgZnVuZGFtZW50bGx5IHdyb25nIG9yIHRoZXJlIGlzIG5vdGhpbmcgbW9yZSB0bworICAgICAgICAgICAgLy8gcHJvY2VzcywgY2xvc2UgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICAgIGlmICh0dHgudHlwZSgpICE9IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5FTkRfT0ZfRklMRSkgeworICAgICAgICAgIGxvZ0Vycm9yKCJDbGllbnQgZGllZCB1bmV4cGVjdGVkbHk6ICVzIiwgdHR4KTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgbG9nRXJyb3IoIlVuY2F1Z2h0IGV4Y2VwdGlvbjogJXMiLCBlKTsKKyAgICAgIH0KKworICAgICAgaWYgKGV2ZW50SGFuZGxlcikgeworICAgICAgICBldmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwKKyAgICAgICAgICBvdXRwdXRQcm90b2NvbCk7CisgICAgICB9CisKKyAgICAgIHRyeSB7CisgICAgICAgIGlucHV0VHJhbnNwb3J0LmNsb3NlKCk7CisgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgICBsb2dFcnJvcigiSW5wdXQgY2xvc2UgZmFpbGVkOiAlcyIsIHR0eCk7CisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICBvdXRwdXRUcmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICAgIGxvZ0Vycm9yKCJPdXRwdXQgY2xvc2UgZmFpbGVkOiAlcyIsIHR0eCk7CisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICAgIGxvZ0Vycm9yKCJDbGllbnQgY2xvc2UgZmFpbGVkOiAlcyIsIHR0eCk7CisgICAgICB9CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIHNlcnZlclRyYW5zcG9ydF8uY2xvc2UoKTsKKyAgICB9IGNhdGNoIChUU2VydmVyVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZ0Vycm9yKCJTZXJ2ZXIgdHJhbnNwb3J0IGZhaWxlZCB0byBjbG9zZSgpOiAlcyIsIGUpOworICAgIH0KKyAgfQorfQorCit1bml0dGVzdCB7CisgIGltcG9ydCB0aHJpZnQuaW50ZXJuYWwudGVzdC5zZXJ2ZXI7CisgIHRlc3RTZXJ2ZUNhbmNlbCFUU2ltcGxlU2VydmVyKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90YXNrcG9vbC5kIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdGFza3Bvb2wuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzBlNzIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdGFza3Bvb2wuZApAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5zZXJ2ZXIudGFza3Bvb2w7CisKK2ltcG9ydCBjb3JlLnN5bmMuY29uZGl0aW9uOworaW1wb3J0IGNvcmUuc3luYy5tdXRleDsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCBzdGQucGFyYWxsZWxpc207CitpbXBvcnQgc3RkLnZhcmlhbnQgOiBWYXJpYW50OworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5wcm9jZXNzb3I7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5iYXNlOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKKworLyoqCisgKiBBIHNlcnZlciB3aGljaCBkaXNwYXRjaGVzIGNsaWVudCByZXF1ZXN0cyB0byBhIHN0ZC5wYXJhbGxlbGlzbSBUYXNrUG9vbC4KKyAqLworY2xhc3MgVFRhc2tQb29sU2VydmVyIDogVFNlcnZlciB7CisgIC8vLworICB0aGlzKAorICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksCisgICAgVGFza1Bvb2wgdGFza1Bvb2wgPSBudWxsCisgICkgeworICAgIHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgdGFza1Bvb2wpOworICB9CisKKyAgLy8vCisgIHRoaXMoCisgICAgVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5LAorICAgIFRhc2tQb29sIHRhc2tQb29sID0gbnVsbAorICApIHsKKyAgICB0aGlzKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCB0YXNrUG9vbCk7CisgIH0KKworICAvLy8KKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgIFRhc2tQb29sIHRhc2tQb29sID0gbnVsbAorICApIHsKKyAgICB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKyAgfQorCisgIC8vLworICB0aGlzKAorICAgIFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUYXNrUG9vbCB0YXNrUG9vbCA9IG51bGwKKyAgKSB7CisgICAgc3VwZXIocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LCBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKworICAgIGlmICh0YXNrUG9vbCkgeworICAgICAgdGhpcy50YXNrUG9vbCA9IHRhc2tQb29sOworICAgIH0gZWxzZSB7CisgICAgICBhdXRvIHB0cCA9IHN0ZC5wYXJhbGxlbGlzbS50YXNrUG9vbDsKKyAgICAgIGlmIChwdHAuc2l6ZSA+IDApIHsKKyAgICAgICAgdGFza1Bvb2xfID0gcHRwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSWYgdGhlIGdsb2JhbCB0YXNrIHBvb2wgaXMgZW1wdHkgKGRlZmF1bHQgb24gYSBzaW5nbGUtY29yZSBtYWNoaW5lKSwKKyAgICAgICAgLy8gY3JlYXRlIGEgbmV3IG9uZSB3aXRoIGEgc2luZ2xlIHdvcmtlciB0aHJlYWQuIFRoZSByYXRpb25hbGUgZm9yIHRoaXMKKyAgICAgICAgLy8gaXMgdG8gYXZvaWQgdGhhdCBhbiBhcHBsaWNhdGlvbiB3aGljaCB3b3JrZWQgZmluZSB3aXRoIG5vIHRhc2sgcG9vbAorICAgICAgICAvLyBleHBsaWNpdGx5IHNldCBvbiB0aGUgbXVsdGktY29yZSBkZXZlbG9wZXIgYm94ZXMgc3VkZGVubHkgZmFpbHMgb24gYQorICAgICAgICAvLyBzaW5nbGUtY29yZSB1c2VyIG1hY2hpbmUuCisgICAgICAgIHRhc2tQb29sXyA9IG5ldyBUYXNrUG9vbCgxKTsKKyAgICAgICAgdGFza1Bvb2xfLmlzRGFlbW9uID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBvdmVycmlkZSB2b2lkIHNlcnZlKFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uID0gbnVsbCkgeworICAgIHNlcnZlclRyYW5zcG9ydF8ubGlzdGVuKCk7CisKKyAgICBpZiAoZXZlbnRIYW5kbGVyKSBldmVudEhhbmRsZXIucHJlU2VydmUoKTsKKworICAgIGF1dG8gcXVldWVTdGF0ZSA9IFF1ZXVlU3RhdGUoKTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAvLyBDaGVjayBpZiB3ZSBjYW4gc3RpbGwgaGFuZGxlIG1vcmUgY29ubmVjdGlvbnMuCisgICAgICBpZiAobWF4QWN0aXZlQ29ubnMpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChxdWV1ZVN0YXRlLm11dGV4KSB7CisgICAgICAgICAgd2hpbGUgKHF1ZXVlU3RhdGUuYWN0aXZlQ29ubnMgPj0gbWF4QWN0aXZlQ29ubnMpIHsKKyAgICAgICAgICAgIHF1ZXVlU3RhdGUuY29ubkNsb3NlZC53YWl0KCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIFRUcmFuc3BvcnQgY2xpZW50OworICAgICAgVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydDsKKyAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0OworICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2w7CisgICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2w7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydF8uYWNjZXB0KGNhbmNlbGxhdGlvbik7CisgICAgICAgIHNjb3BlKGZhaWx1cmUpIGNsaWVudC5jbG9zZSgpOworCisgICAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgc2NvcGUoZmFpbHVyZSkgaW5wdXRUcmFuc3BvcnQuY2xvc2UoKTsKKworICAgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgc2NvcGUoZmFpbHVyZSkgb3V0cHV0VHJhbnNwb3J0LmNsb3NlKCk7CisKKyAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOworICAgICAgfSBjYXRjaCAoVENhbmNlbGxlZEV4Y2VwdGlvbiB0Y2UpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgICBsb2dFcnJvcigiVFNlcnZlclRyYW5zcG9ydCBmYWlsZWQgb24gYWNjZXB0OiAlcyIsIHR0eCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiB0eCkgeworICAgICAgICBsb2dFcnJvcigiQ2F1Z2h0IFRFeGNlcHRpb24gb24gYWNjZXB0OiAlcyIsIHR4KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGF1dG8gaW5mbyA9IFRDb25uZWN0aW9uSW5mbyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgY2xpZW50KTsKKyAgICAgIGF1dG8gcHJvY2Vzc29yID0gcHJvY2Vzc29yRmFjdG9yeV8uZ2V0UHJvY2Vzc29yKGluZm8pOworCisgICAgICBzeW5jaHJvbml6ZWQgKHF1ZXVlU3RhdGUubXV0ZXgpIHsKKyAgICAgICAgKytxdWV1ZVN0YXRlLmFjdGl2ZUNvbm5zOworICAgICAgfQorICAgICAgdGFza1Bvb2xfLnB1dCh0YXNrIXdvcmtlcihxdWV1ZVN0YXRlLCBjbGllbnQsIGlucHV0UHJvdG9jb2wsCisgICAgICAgIG91dHB1dFByb3RvY29sLCBwcm9jZXNzb3IsIGV2ZW50SGFuZGxlcikpOworICAgIH0KKworICAgIC8vIEZpcnN0LCBzdG9wIGFjY2VwdGluZyBuZXcgY29ubmVjdGlvbnMuCisgICAgdHJ5IHsKKyAgICAgIHNlcnZlclRyYW5zcG9ydF8uY2xvc2UoKTsKKyAgICB9IGNhdGNoIChUU2VydmVyVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZ0Vycm9yKCJTZXJ2ZXIgdHJhbnNwb3J0IGZhaWxlZCB0byBjbG9zZTogJXMiLCBlKTsKKyAgICB9CisKKyAgICAvLyBUaGVuLCB3YWl0IHVudGlsIGFsbCBhY3RpdmUgY29ubmVjdGlvbnMgYXJlIGZpbmlzaGVkLgorICAgIHN5bmNocm9uaXplZCAocXVldWVTdGF0ZS5tdXRleCkgeworICAgICAgd2hpbGUgKHF1ZXVlU3RhdGUuYWN0aXZlQ29ubnMgPiAwKSB7CisgICAgICAgIHF1ZXVlU3RhdGUuY29ubkNsb3NlZC53YWl0KCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIHRhc2sgcG9vbCB0byB1c2UuCisgICAqCisgICAqIEJ5IGRlZmF1bHQsIHRoZSBnbG9iYWwgc3RkLnBhcmFsbGVsaXNtIHRhc2tQb29sIGluc3RhbmNlIGlzIHVzZWQsIHdoaWNoCisgICAqIG1pZ2h0IG5vdCBiZSBhcHByb3ByaWF0ZSBmb3IgbWFueSBhcHBsaWNhdGlvbnMsIGUuZy4gd2hlcmUgdHVuaW5nIHRoZQorICAgKiBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgaXMgZGVzaXJlZC4gKE9uIHNpbmdsZS1jb3JlIHN5c3RlbXMsIGEgcHJpdmF0ZQorICAgKiB0YXNrIHBvb2wgd2l0aCBhIHNpbmdsZSB0aHJlYWQgaXMgdXNlZCBieSBkZWZhdWx0LCBzaW5jZSB0aGUgZ2xvYmFsCisgICAqIHRhc2tQb29sIGluc3RhbmNlIGhhcyBubyB3b3JrZXIgdGhyZWFkcyB0aGVuLikKKyAgICoKKyAgICogTm90ZTogVFRhc2tQb29sU2VydmVyIGV4cGVjdHMgdGhhdCB0YXNrcyBhcmUgbmV2ZXIgZHJvcHBlZCBmcm9tIHRoZSBwb29sLAorICAgKiBlLmcuIGJ5IGNhbGxpbmcgVGFza1Bvb2wuY2xvc2UoKSB3aGlsZSB0aGVyZSBhcmUgc3RpbGwgdGFza3MgaW4gdGhlCisgICAqIHF1ZXVlLiBJZiB0aGlzIGhhcHBlbnMsIHNlcnZlKCkgd2lsbCBuZXZlciByZXR1cm4uCisgICAqLworICB2b2lkIHRhc2tQb29sKFRhc2tQb29sIHBvb2wpIEBwcm9wZXJ0eSB7CisgICAgZW5mb3JjZShwb29sICFpcyBudWxsLCAiQ2Fubm90IHVzZSBhIG51bGwgdGFzayBwb29sLiIpOworICAgIGVuZm9yY2UocG9vbC5zaXplID4gMCwgIkNhbm5vdCB1c2UgYSB0YXNrIHBvb2wgd2l0aCBubyB3b3JrZXIgdGhyZWFkcy4iKTsKKyAgICB0YXNrUG9vbF8gPSBwb29sOworICB9CisKKyAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjbGllbnQgY29ubmVjdGlvbnMgb3BlbiBhdCB0aGUgc2FtZSB0aW1lLiBaZXJvIGZvcgorICAgKiBubyBsaW1pdCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuCisgICAqCisgICAqIElmIHRoaXMgbGltaXQgaXMgcmVhY2hlZCwgbm8gY2xpZW50cyBhcmUgYWNjZXB0KCllZCBmcm9tIHRoZSBzZXJ2ZXIKKyAgICogdHJhbnNwb3J0IGFueSBsb25nZXIgdW50aWwgYW5vdGhlciBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZCBhZ2Fpbi4KKyAgICovCisgIHNpemVfdCBtYXhBY3RpdmVDb25uczsKKworcHJvdGVjdGVkOgorICBUYXNrUG9vbCB0YXNrUG9vbF87Cit9CisKKy8vIENhbm5vdCBiZSBwcml2YXRlIGFzIHdvcmtlciBoYXMgdG8gYmUgcGFzc2VkIGFzIGFsaWFzIHBhcmFtZXRlciB0bworLy8gYW5vdGhlciBtb2R1bGUuCisvLyBwcml2YXRlIHsKKyAgLyoKKyAgICogVGhlIHN0YXRlIG9mIHRoZSDCu2Nvbm5lY3Rpb24gcXVldWXCqywgaS5lLiB1c2VkIGZvciBrZWVwaW5nIHRyYWNrIG9mIGhvdworICAgKiBtYW55IGNsaWVudCBjb25uZWN0aW9ucyBhcmUgY3VycmVudGx5IHByb2Nlc3NlZC4KKyAgICovCisgIHN0cnVjdCBRdWV1ZVN0YXRlIHsKKyAgICAvLy8gUHJvdGVjdHMgdGhlIHF1ZXVlIHN0YXRlLgorICAgIE11dGV4IG11dGV4OworCisgICAgLy8vIFRoZSBudW1iZXIgb2YgYWN0aXZlIGNvbm5lY3Rpb25zIChmcm9tIHRoZSB0aW1lIHRoZXkgYXJlIGFjY2VwdCgpZWQKKyAgICAvLy8gdW50aWwgdGhleSBhcmUgY2xvc2VkIHdoZW4gdGhlIHdvcmtlZCB0YXNrIGZpbmlzaGVzKS4KKyAgICBzaXplX3QgYWN0aXZlQ29ubnM7CisKKyAgICAvLy8gU2lnbmFscyB0aGF0IHRoZSBudW1iZXIgb2YgYWN0aXZlIGNvbm5lY3Rpb25zIGhhcyBiZWVuIGRlY3JlYXNlZCwgaS5lLgorICAgIC8vLyB0aGF0IGEgY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQuCisgICAgQ29uZGl0aW9uIGNvbm5DbG9zZWQ7CisKKyAgICAvLy8gUmV0dXJucyBhbiBpbml0aWFsaXplZCBpbnN0YW5jZS4KKyAgICBzdGF0aWMgUXVldWVTdGF0ZSBvcENhbGwoKSB7CisgICAgICBRdWV1ZVN0YXRlIHE7CisgICAgICBxLm11dGV4ID0gbmV3IE11dGV4OworICAgICAgcS5jb25uQ2xvc2VkID0gbmV3IENvbmRpdGlvbihxLm11dGV4KTsKKyAgICAgIHJldHVybiBxOworICAgIH0KKyAgfQorCisgIHZvaWQgd29ya2VyKHJlZiBRdWV1ZVN0YXRlIHF1ZXVlU3RhdGUsIFRUcmFuc3BvcnQgY2xpZW50LAorICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sLCBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wsCisgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyKQorICB7CisgICAgc2NvcGUgKGV4aXQpIHsKKyAgICAgIHN5bmNocm9uaXplZCAocXVldWVTdGF0ZS5tdXRleCkgeworICAgICAgICBhc3NlcnQocXVldWVTdGF0ZS5hY3RpdmVDb25ucyA+IDApOworICAgICAgICAtLXF1ZXVlU3RhdGUuYWN0aXZlQ29ubnM7CisgICAgICAgIHF1ZXVlU3RhdGUuY29ubkNsb3NlZC5ub3RpZnlBbGwoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBWYXJpYW50IGNvbm5lY3Rpb25Db250ZXh0OworICAgIGlmIChldmVudEhhbmRsZXIpIHsKKyAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0KKyAgICAgICAgZXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworICAgIH0KKworICAgIHRyeSB7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoZXZlbnRIYW5kbGVyKSB7CisgICAgICAgICAgZXZlbnRIYW5kbGVyLnByZVByb2Nlc3MoY29ubmVjdGlvbkNvbnRleHQsIGNsaWVudCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXByb2Nlc3Nvci5wcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLAorICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0KSB8fCAhaW5wdXRQcm90b2NvbC50cmFuc3BvcnQucGVlaygpCisgICAgICAgICkgeworICAgICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IGZ1bmRhbWVudGxseSB3cm9uZyBvciB0aGVyZSBpcyBub3RoaW5nIG1vcmUgdG8KKyAgICAgICAgICAvLyBwcm9jZXNzLCBjbG9zZSB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICBpZiAodHR4LnR5cGUoKSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuRU5EX09GX0ZJTEUpIHsKKyAgICAgICAgbG9nRXJyb3IoIkNsaWVudCBkaWVkIHVuZXhwZWN0ZWRseTogJXMiLCB0dHgpOworICAgICAgfQorICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2dFcnJvcigiVW5jYXVnaHQgZXhjZXB0aW9uOiAlcyIsIGUpOworICAgIH0KKworICAgIGlmIChldmVudEhhbmRsZXIpIHsKKyAgICAgIGV2ZW50SGFuZGxlci5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLAorICAgICAgICBvdXRwdXRQcm90b2NvbCk7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGlucHV0UHJvdG9jb2wudHJhbnNwb3J0LmNsb3NlKCk7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgIGxvZ0Vycm9yKCJJbnB1dCBjbG9zZSBmYWlsZWQ6ICVzIiwgdHR4KTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIG91dHB1dFByb3RvY29sLnRyYW5zcG9ydC5jbG9zZSgpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICBsb2dFcnJvcigiT3V0cHV0IGNsb3NlIGZhaWxlZDogJXMiLCB0dHgpOworICAgIH0KKyAgICB0cnkgeworICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgIGxvZ0Vycm9yKCJDbGllbnQgY2xvc2UgZmFpbGVkOiAlcyIsIHR0eCk7CisgICAgfQorICB9CisvLyB9CisKK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHRocmlmdC5pbnRlcm5hbC50ZXN0LnNlcnZlcjsKKyAgdGVzdFNlcnZlQ2FuY2VsIVRUYXNrUG9vbFNlcnZlcigpOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdGhyZWFkZWQuZCBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RocmVhZGVkLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAwY2M4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RocmVhZGVkLmQKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuc2VydmVyLnRocmVhZGVkOworCitpbXBvcnQgY29yZS50aHJlYWQ7CitpbXBvcnQgc3RkLnZhcmlhbnQgOiBWYXJpYW50OworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5wcm9jZXNzb3I7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5iYXNlOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKKworLyoqCisgKiBBIHNpbXBsZSB0aHJlYWRlZCBzZXJ2ZXIgd2hpY2ggc3Bhd25zIGEgbmV3IHRocmVhZCBwZXIgY29ubmVjdGlvbi4KKyAqLworY2xhc3MgVFRocmVhZGVkU2VydmVyIDogVFNlcnZlciB7CisgIC8vLworICB0aGlzKAorICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkKKyAgKSB7CisgICAgc3VwZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CisgIH0KKworICAvLy8KKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkKKyAgKSB7CisgICAgc3VwZXIocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOworICB9CisKKyAgLy8vCisgIHRoaXMoCisgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeQorICApIHsKKyAgICBzdXBlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisgIH0KKworICAvLy8KKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnkKKyAgKSB7CisgICAgc3VwZXIocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LCBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgc2VydmUoVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24gPSBudWxsKSB7CisgICAgdHJ5IHsKKyAgICAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIgbGlzdGVuaW5nCisgICAgICBzZXJ2ZXJUcmFuc3BvcnRfLmxpc3RlbigpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICBsb2dFcnJvcigibGlzdGVuKCkgZmFpbGVkOiAlcyIsIHR0eCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGV2ZW50SGFuZGxlcikgZXZlbnRIYW5kbGVyLnByZVNlcnZlKCk7CisKKyAgICBhdXRvIHdvcmtlclRocmVhZHMgPSBuZXcgVGhyZWFkR3JvdXAoKTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBUVHJhbnNwb3J0IGNsaWVudDsKKyAgICAgIFRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQ7CisgICAgICBUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydDsKKyAgICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sOworICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sOworCisgICAgICB0cnkgeworICAgICAgICBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnRfLmFjY2VwdChjYW5jZWxsYXRpb24pOworICAgICAgICBzY29wZShmYWlsdXJlKSBjbGllbnQuY2xvc2UoKTsKKworICAgICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICAgIHNjb3BlKGZhaWx1cmUpIGlucHV0VHJhbnNwb3J0LmNsb3NlKCk7CisKKyAgICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICAgIHNjb3BlKGZhaWx1cmUpIG91dHB1dFRyYW5zcG9ydC5jbG9zZSgpOworCisgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOworICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKKyAgICAgIH0gY2F0Y2ggKFRDYW5jZWxsZWRFeGNlcHRpb24gdGNlKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgICAgbG9nRXJyb3IoIlRTZXJ2ZXJUcmFuc3BvcnQgZmFpbGVkIG9uIGFjY2VwdDogJXMiLCB0dHgpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gdHgpIHsKKyAgICAgICAgbG9nRXJyb3IoIkNhdWdodCBURXhjZXB0aW9uIG9uIGFjY2VwdDogJXMiLCB0eCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBhdXRvIGluZm8gPSBUQ29ubmVjdGlvbkluZm8oaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsIGNsaWVudCk7CisgICAgICBhdXRvIHByb2Nlc3NvciA9IHByb2Nlc3NvckZhY3RvcnlfLmdldFByb2Nlc3NvcihpbmZvKTsKKyAgICAgIGF1dG8gd29ya2VyID0gbmV3IFdvcmtlclRocmVhZChjbGllbnQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLAorICAgICAgICBwcm9jZXNzb3IsIGV2ZW50SGFuZGxlcik7CisgICAgICB3b3JrZXJUaHJlYWRzLmFkZCh3b3JrZXIpOworICAgICAgd29ya2VyLnN0YXJ0KCk7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIHNlcnZlclRyYW5zcG9ydF8uY2xvc2UoKTsKKyAgICB9IGNhdGNoIChUU2VydmVyVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZ0Vycm9yKCJTZXJ2ZXIgdHJhbnNwb3J0IGZhaWxlZCB0byBjbG9zZTogJXMiLCBlKTsKKyAgICB9CisgICAgd29ya2VyVGhyZWFkcy5qb2luQWxsKCk7CisgIH0KK30KKworLy8gVGhlIHdvcmtlciB0aHJlYWQgaGFuZGxpbmcgYSBjbGllbnQgY29ubmVjdGlvbi4KK3ByaXZhdGUgY2xhc3MgV29ya2VyVGhyZWFkIDogVGhyZWFkIHsKKyAgdGhpcyhUVHJhbnNwb3J0IGNsaWVudCwgVFByb3RvY29sIGlucHV0UHJvdG9jb2wsIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCwKKyAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlckV2ZW50SGFuZGxlciBldmVudEhhbmRsZXIpCisgIHsKKyAgICBjbGllbnRfID0gY2xpZW50OworICAgIGlucHV0UHJvdG9jb2xfID0gaW5wdXRQcm90b2NvbDsKKyAgICBvdXRwdXRQcm90b2NvbF8gPSBvdXRwdXRQcm90b2NvbDsKKyAgICBwcm9jZXNzb3JfID0gcHJvY2Vzc29yOworICAgIGV2ZW50SGFuZGxlcl8gPSBldmVudEhhbmRsZXI7CisKKyAgICBzdXBlcigmcnVuKTsKKyAgfQorCisgIHZvaWQgcnVuKCkgeworICAgIFZhcmlhbnQgY29ubmVjdGlvbkNvbnRleHQ7CisgICAgaWYgKGV2ZW50SGFuZGxlcl8pIHsKKyAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0KKyAgICAgICAgZXZlbnRIYW5kbGVyXy5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8pOworICAgIH0KKworICAgIHRyeSB7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoZXZlbnRIYW5kbGVyXykgeworICAgICAgICAgIGV2ZW50SGFuZGxlcl8ucHJlUHJvY2Vzcyhjb25uZWN0aW9uQ29udGV4dCwgY2xpZW50Xyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXByb2Nlc3Nvcl8ucHJvY2VzcyhpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfLAorICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0KSB8fCAhaW5wdXRQcm90b2NvbF8udHJhbnNwb3J0LnBlZWsoKQorICAgICAgICApIHsKKyAgICAgICAgICAvLyBTb21ldGhpbmcgd2VudCBmdW5kYW1lbnRsbHkgd3Jvbmcgb3IgdGhlcmUgaXMgbm90aGluZyBtb3JlIHRvCisgICAgICAgICAgLy8gcHJvY2VzcywgY2xvc2UgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgaWYgKHR0eC50eXBlKCkgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkVORF9PRl9GSUxFKSB7CisgICAgICAgIGxvZ0Vycm9yKCJDbGllbnQgZGllZCB1bmV4cGVjdGVkbHk6ICVzIiwgdHR4KTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgbG9nRXJyb3IoIlVuY2F1Z2h0IGV4Y2VwdGlvbjogJXMiLCBlKTsKKyAgICB9CisKKyAgICBpZiAoZXZlbnRIYW5kbGVyXykgeworICAgICAgZXZlbnRIYW5kbGVyXy5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sXywKKyAgICAgICAgb3V0cHV0UHJvdG9jb2xfKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgaW5wdXRQcm90b2NvbF8udHJhbnNwb3J0LmNsb3NlKCk7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgIGxvZ0Vycm9yKCJJbnB1dCBjbG9zZSBmYWlsZWQ6ICVzIiwgdHR4KTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIG91dHB1dFByb3RvY29sXy50cmFuc3BvcnQuY2xvc2UoKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgbG9nRXJyb3IoIk91dHB1dCBjbG9zZSBmYWlsZWQ6ICVzIiwgdHR4KTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIGNsaWVudF8uY2xvc2UoKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgbG9nRXJyb3IoIkNsaWVudCBjbG9zZSBmYWlsZWQ6ICVzIiwgdHR4KTsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgVFRyYW5zcG9ydCBjbGllbnRfOworICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbF87CisgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbF87CisgIFRQcm9jZXNzb3IgcHJvY2Vzc29yXzsKKyAgVFNlcnZlckV2ZW50SGFuZGxlciBldmVudEhhbmRsZXJfOworfQorCit1bml0dGVzdCB7CisgIGltcG9ydCB0aHJpZnQuaW50ZXJuYWwudGVzdC5zZXJ2ZXI7CisgIHRlc3RTZXJ2ZUNhbmNlbCFUVGhyZWFkZWRTZXJ2ZXIoKTsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdHJhbnNwb3J0L2Jhc2UuZCBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RyYW5zcG9ydC9iYXNlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0ZTE2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RyYW5zcG9ydC9iYXNlLmQKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5iYXNlOworCitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKKworLyoqCisgKiBTb21lIGtpbmQgb2YgSS9PIGRldmljZSBlbmFibGluZyBzZXJ2ZXJzIHRvIGxpc3RlbiBmb3IgaW5jb21pbmcgY2xpZW50CisgKiBjb25uZWN0aW9ucyBhbmQgY29tbXVuaWNhdGUgd2l0aCB0aGVtIHZpYSBhIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorICovCitpbnRlcmZhY2UgVFNlcnZlclRyYW5zcG9ydCB7CisgIC8qKgorICAgKiBTdGFydHMgbGlzdGVuaW5nIGZvciBzZXJ2ZXIgY29ubmVjdGlvbnMuCisgICAqCisgICAqIEp1c3QgYXMgc2ltbGlhciBmdW5jdGlvbnMgY29tbW9ubHkgZm91bmQgaW4gc29ja2V0IGxpYnJhcmllcywgdGhpcworICAgKiBmdW5jdGlvbiBkb2VzIG5vdCBibG9jay4KKyAgICoKKyAgICogSWYgdGhlIHNvY2tldCBpcyBhbHJlYWR5IGxpc3RlbmluZywgbm90aGluZyBoYXBwZW5zLgorICAgKgorICAgKiBUaHJvd3M6IFRTZXJ2ZXJUcmFuc3BvcnRFeGNlcHRpb24gaWYgbGlzdGVuaW5nIGZhaWxlZCBvciB0aGUgdHJhbnNwb3J0CisgICAqICAgd2FzIGFscmVhZHkgbGlzdGVuaW5nLgorICAgKi8KKyAgdm9pZCBsaXN0ZW4oKTsKKworICAvKioKKyAgICogQ2xvc2VzIHRoZSBzZXJ2ZXIgdHJhbnNwb3J0LCBjYXVzaW5nIGl0IHRvIHN0b3AgbGlzdGVuaW5nLgorICAgKgorICAgKiBUaHJvd3M6IFRTZXJ2ZXJUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlIHRyYW5zcG9ydCB3YXMgbm90IGxpc3RlbmluZy4KKyAgICovCisgIHZvaWQgY2xvc2UoKTsKKworICAvKioKKyAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzZXJ2ZXIgdHJhbnNwb3J0IGlzIGN1cnJlbnRseSBsaXN0ZW5pbmcuCisgICAqLworICBib29sIGlzTGlzdGVuaW5nKCkgQHByb3BlcnR5OworCisgIC8qKgorICAgKiBBY2NlcHRzIGEgY2xpZW50IGNvbm5lY3Rpb24gYW5kIHJldHVybnMgYW4gb3BlbmVkIFRUcmFuc3BvcnQgZm9yIGl0LAorICAgKiBuZXZlciByZXR1cm5pbmcgbnVsbC4KKyAgICoKKyAgICogQmxvY2tzIHVudGlsIGEgY2xpZW50IGNvbm5lY3Rpb24gaXMgYXZhaWxhYmxlLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgY2FuY2VsbGF0aW9uID0gSWYgdHJpZ2dlcmVkLCByZXF1ZXN0cyB0aGUgY2FsbCB0byBzdG9wIGJsb2NraW5nIGFuZAorICAgKiAgICAgcmV0dXJuIHdpdGggYSBUQ2FuY2VsbGVkRXhjZXB0aW9uLiBJbXBsZW1lbnRhdGlvbnMgYXJlIGZyZWUgdG8KKyAgICogICAgIGlnbm9yZSB0aGlzIGlmIHRoZXkgY2Fubm90IHByb3ZpZGUgYSByZWFzb25hYmxlLgorICAgKgorICAgKiBUaHJvd3M6IFRTZXJ2ZXJUcmFuc3BvcnRFeGNlcHRpb24gaWYgYWNjZXB0aW5nIGZhaWxlZCwKKyAgICogICBUQ2FuY2VsbGVkRXhjZXB0aW9uIGlmIGl0IHdhcyBjYW5jZWxsZWQuCisgICAqLworICBUVHJhbnNwb3J0IGFjY2VwdChUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbiA9IG51bGwpIG91dCAocmVzdWx0KSB7CisgICAgYXNzZXJ0KHJlc3VsdCAhaXMgbnVsbCk7CisgIH0KK30KKworLyoqCisgKiBTZXJ2ZXIgdHJhbnNwb3J0IGV4Y2VwdGlvbi4KKyAqLworY2xhc3MgVFNlcnZlclRyYW5zcG9ydEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24geworICAvKioKKyAgICogRXJyb3IgY29kZXMgZm9yIHRoZSB2YXJpb3VzIHR5cGVzIG9mIGV4Y2VwdGlvbnMuCisgICAqLworICBlbnVtIFR5cGUgeworICAgIC8vLworICAgIFVOS05PV04sCisKKyAgICAvLy8gVGhlIHNlcnZlciBzb2NrZXQgaXMgbm90IGxpc3RlbmluZywgYnV0IGV4Y2VwdGVkIHRvIGJlLgorICAgIE5PVF9MSVNURU5JTkcsCisKKyAgICAvLy8gVGhlIHNlcnZlciBzb2NrZXQgaXMgYWxyZWFkeSBsaXN0ZW5pbmcsIGJ1dCBleHBlY3RlZCBub3QgdG8gYmUuCisgICAgQUxSRUFEWV9MSVNURU5JTkcsCisKKyAgICAvLy8gQW4gb3BlcmF0aW9uIG9uIHRoZSBwcmltYXJ5IHVuZGVybHlpbmcgcmVzb3VyY2UsIGUuZy4gYSBzb2NrZXQgdXNlZAorICAgIC8vLyBmb3IgYWNjZXB0aW5nIGNvbm5lY3Rpb25zLCBmYWlsZWQuCisgICAgUkVTT1VSQ0VfRkFJTEVECisgIH0KKworICAvLy8KKyAgdGhpcyhUeXBlIHR5cGUsIHN0cmluZyBmaWxlID0gX19GSUxFX18sIHNpemVfdCBsaW5lID0gX19MSU5FX18sIFRocm93YWJsZSBuZXh0ID0gbnVsbCkgeworICAgIHRoaXMoZXJyb3JNc2codHlwZSksIHR5cGUsIGZpbGUsIGxpbmUsIG5leHQpOworICB9CisKKyAgLy8vCisgIHRoaXMoc3RyaW5nIG1zZywgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywKKyAgICBUaHJvd2FibGUgbmV4dCA9IG51bGwpCisgIHsKKyAgICB0aGlzKG1zZywgVHlwZS5VTktOT1dOLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgfQorCisgIC8vLworICB0aGlzKHN0cmluZyBtc2csIFR5cGUgdHlwZSwgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywKKyAgICBUaHJvd2FibGUgbmV4dCA9IG51bGwpCisgIHsKKyAgICBzdXBlcihtc2csIGZpbGUsIGxpbmUsIG5leHQpOworICAgIHR5cGVfID0gdHlwZTsKKyAgfQorCisgIC8vLworICBUeXBlIHR5cGUoKSBjb25zdCBub3Rocm93IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHR5cGVfOworICB9CisKK3Byb3RlY3RlZDoKKyAgVHlwZSB0eXBlXzsKKworcHJpdmF0ZToKKyAgc3RyaW5nIGVycm9yTXNnKFR5cGUgdHlwZSkgeworICAgIHN0cmluZyBtc2cgPSAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogIjsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgVHlwZS5VTktOT1dOOiBtc2cgfj0gIlVua25vd24gc2VydmVyIHRyYW5zcG9ydCBleGNlcHRpb24iOyBicmVhazsKKyAgICAgIGNhc2UgVHlwZS5OT1RfTElTVEVOSU5HOiBtc2cgfj0gIlNlcnZlciB0cmFuc3BvcnQgbm90IGxpc3RlbmluZyI7IGJyZWFrOworICAgICAgY2FzZSBUeXBlLkFMUkVBRFlfTElTVEVOSU5HOiBtc2cgfj0gIlNlcnZlciB0cmFuc3BvcnQgYWxyZWFkeSBsaXN0ZW5pbmciOyBicmVhazsKKyAgICAgIGNhc2UgVHlwZS5SRVNPVVJDRV9GQUlMRUQ6IG1zZyB+PSAiQW4gdW5kZXJseWluZyByZXNvdXJjZSBmYWlsZWQiOyBicmVhazsKKyAgICAgIGRlZmF1bHQ6IG1zZyB+PSAiKEludmFsaWQgZXhjZXB0aW9uIHR5cGUpIjsgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBtc2c7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdHJhbnNwb3J0L3NvY2tldC5kIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdHJhbnNwb3J0L3NvY2tldC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NmQ4MGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90cmFuc3BvcnQvc29ja2V0LmQKQEAgLTAsMCArMSwzODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5zb2NrZXQ7CisKK2ltcG9ydCBjb3JlLnRocmVhZCA6IGR1ciwgRHVyYXRpb24sIFRocmVhZDsKK2ltcG9ydCBjb3JlLnN0ZGMuc3RyaW5nIDogc3RyZXJyb3I7CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHk7CitpbXBvcnQgc3RkLmNvbnYgOiB0ZXh0LCB0bzsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCBzdGQuc29ja2V0OworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnV0aWwuYXdhaXRhYmxlOworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKKworcHJpdmF0ZSBhbGlhcyBUU2VydmVyVHJhbnNwb3J0RXhjZXB0aW9uIFNURTsKKworLyoqCisgKiBTZXJ2ZXIgc29ja2V0IGltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJUcmFuc3BvcnQuCisgKgorICogTWFwcyB0byBzdGQuc29ja2V0IGxpc3RlbigpL2FjY2VwdCgpOyBvbmx5IHByb3ZpZGVzIFRDUC9JUCBzb2NrZXRzIChpLmUuIG5vCisgKiBVbml4IHNvY2tldHMpIGZvciBub3csIGJlY2F1c2UgdGhleSBhcmUgbm90IHN1cHBvcnRlZCBpbiBzdGQuc29ja2V0LgorICovCitjbGFzcyBUU2VydmVyU29ja2V0IDogVFNlcnZlclRyYW5zcG9ydCB7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgcG9ydCA9IFRoZSBUQ1AgcG9ydCB0byBsaXN0ZW4gYXQgKGhvc3QgaXMgYWx3YXlzIDAuMC4wLjApLgorICAgKiAgIHNlbmRUaW1lb3V0ID0gVGhlIHNvY2tldCBzZW5kaW5nIHRpbWVvdXQuCisgICAqICAgcmVjdlRpbW91dCA9IFRoZSBzb2NrZXQgcmVjZWl2aW5nIHRpbWVvdXQuCisgICAqLworICB0aGlzKHVzaG9ydCBwb3J0LCBEdXJhdGlvbiBzZW5kVGltZW91dCA9IGR1ciEiaG5zZWNzIigwKSwKKyAgICBEdXJhdGlvbiByZWN2VGltZW91dCA9IGR1ciEiaG5zZWNzIigwKSkKKyAgeworICAgIHBvcnRfID0gcG9ydDsKKyAgICBzZW5kVGltZW91dF8gPSBzZW5kVGltZW91dDsKKyAgICByZWN2VGltZW91dF8gPSByZWN2VGltZW91dDsKKworICAgIGNhbmNlbGxhdGlvbk5vdGlmaWVyXyA9IG5ldyBUU29ja2V0Tm90aWZpZXI7CisKKyAgICBzb2NrZXRTZXRfID0gbmV3IFNvY2tldFNldDsKKyAgfQorCisgIC8vLyBUaGUgcG9ydCB0aGUgc2VydmVyIHNvY2tldCBsaXN0ZW5zIGF0LgorICB1c2hvcnQgcG9ydCgpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHBvcnRfOworICB9CisKKyAgLy8vIFRoZSBzb2NrZXQgc2VuZGluZyB0aW1lb3V0LCB6ZXJvIHRvIGJsb2NrIGluZmluaXRlbHkuCisgIHZvaWQgc2VuZFRpbWVvdXQoRHVyYXRpb24gc2VuZFRpbWVvdXQpIEBwcm9wZXJ0eSB7CisgICAgc2VuZFRpbWVvdXRfID0gc2VuZFRpbWVvdXQ7CisgIH0KKworICAvLy8gVGhlIHNvY2tldCByZWNlaXZpbmcgdGltZW91dCwgemVybyB0byBibG9jayBpbmZpbml0ZWx5LgorICB2b2lkIHJlY3ZUaW1lb3V0KER1cmF0aW9uIHJlY3ZUaW1lb3V0KSBAcHJvcGVydHkgeworICAgIHJlY3ZUaW1lb3V0XyA9IHJlY3ZUaW1lb3V0OworICB9CisKKyAgLy8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBsaXN0ZW5pbmcgcmV0cmllcyBpZiBpdCBmYWlscy4KKyAgdm9pZCByZXRyeUxpbWl0KHVzaG9ydCByZXRyeUxpbWl0KSBAcHJvcGVydHkgeworICAgIHJldHJ5TGltaXRfID0gcmV0cnlMaW1pdDsKKyAgfQorCisgIC8vLyBUaGUgZGVsYXkgYmV0d2VlbiBhIGxpc3RlbmluZyBhdHRlbXB0IGZhaWxpbmcgYW5kIHJldHJ5aW5nIGl0LgorICB2b2lkIHJldHJ5RGVsYXkoRHVyYXRpb24gcmV0cnlEZWxheSkgQHByb3BlcnR5IHsKKyAgICByZXRyeURlbGF5XyA9IHJldHJ5RGVsYXk7CisgIH0KKworICAvLy8gVGhlIHNpemUgb2YgdGhlIFRDUCBzZW5kIGJ1ZmZlciwgaW4gYnl0ZXMuCisgIHZvaWQgdGNwU2VuZEJ1ZmZlcihpbnQgdGNwU2VuZEJ1ZmZlcikgQHByb3BlcnR5IHsKKyAgICB0Y3BTZW5kQnVmZmVyXyA9IHRjcFNlbmRCdWZmZXI7CisgIH0KKworICAvLy8gVGhlIHNpemUgb2YgdGhlIFRDUCByZWNlaXZpbmcgYnVmZmVyLCBpbiBieXRlcy4KKyAgdm9pZCB0Y3BSZWN2QnVmZmVyKGludCB0Y3BSZWN2QnVmZmVyKSBAcHJvcGVydHkgeworICAgIHRjcFJlY3ZCdWZmZXJfID0gdGNwUmVjdkJ1ZmZlcjsKKyAgfQorCisgIC8vLyBXaGV0aGVyIHRvIGxpc3RlbiBvbiBJUHY2IG9ubHksIGlmIElQdjYgc3VwcG9ydCBpcyBkZXRlY3RlZAorICAvLy8gKGRlZmF1bHQ6IGZhbHNlKS4KKyAgdm9pZCBpcHY2T25seShib29sIHZhbHVlKSBAcHJvcGVydHkgeworICAgIGlwdjZPbmx5XyA9IHZhbHVlOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBsaXN0ZW4oKSB7CisgICAgZW5mb3JjZSghaXNMaXN0ZW5pbmcsIG5ldyBTVEUoU1RFLlR5cGUuQUxSRUFEWV9MSVNURU5JTkcpKTsKKworICAgIHNlcnZlclNvY2tldF8gPSBtYWtlU29ja2V0QW5kTGlzdGVuKHBvcnRfLCBBQ0NFUFRfQkFDS0xPRywgcmV0cnlMaW1pdF8sCisgICAgICByZXRyeURlbGF5XywgdGNwU2VuZEJ1ZmZlcl8sIHRjcFJlY3ZCdWZmZXJfLCBpcHY2T25seV8pOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHsKKyAgICBlbmZvcmNlKGlzTGlzdGVuaW5nLCBuZXcgU1RFKFNURS5UeXBlLk5PVF9MSVNURU5JTkcpKTsKKworICAgIHNlcnZlclNvY2tldF8uc2h1dGRvd24oU29ja2V0U2h1dGRvd24uQk9USCk7CisgICAgc2VydmVyU29ja2V0Xy5jbG9zZSgpOworICAgIHNlcnZlclNvY2tldF8gPSBudWxsOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBpc0xpc3RlbmluZygpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHNlcnZlclNvY2tldF8gIWlzIG51bGw7CisgIH0KKworICAvLy8gTnVtYmVyIG9mIGNvbm5lY3Rpb25zIGxpc3RlbigpIGJhY2tsb2dzLgorICBlbnVtIEFDQ0VQVF9CQUNLTE9HID0gMTAyNDsKKworICBvdmVycmlkZSBUVHJhbnNwb3J0IGFjY2VwdChUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbiA9IG51bGwpIHsKKyAgICBlbmZvcmNlKGlzTGlzdGVuaW5nLCBuZXcgU1RFKFNURS5UeXBlLk5PVF9MSVNURU5JTkcpKTsKKworICAgIGlmIChjYW5jZWxsYXRpb24pIGNhbmNlbGxhdGlvbk5vdGlmaWVyXy5hdHRhY2goY2FuY2VsbGF0aW9uLnRyaWdnZXJpbmcpOworICAgIHNjb3BlIChleGl0KSBpZiAoY2FuY2VsbGF0aW9uKSBjYW5jZWxsYXRpb25Ob3RpZmllcl8uZGV0YWNoKCk7CisKKworICAgIC8vIFRvbyBtYW55IEVJTlRScyBpcyBhIGZhdWx0IGNvbmRpdGlvbiBhbmQgd291bGQgbmVlZCB0byBiZSBoYW5kbGVkCisgICAgLy8gbWFudWFsbHkgYnkgb3VyIGNhbGxlciwgYnV0IHdlIGNhbiB0b2xlcmF0ZSBhIGNlcnRhaW4gbnVtYmVyLgorICAgIGVudW0gTUFYX0VJTlRSUyA9IDEwOworICAgIHVpbnQgbnVtRWludHJzOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHNvY2tldFNldF8ucmVzZXQoKTsKKyAgICAgIHNvY2tldFNldF8uYWRkKHNlcnZlclNvY2tldF8pOworICAgICAgc29ja2V0U2V0Xy5hZGQoY2FuY2VsbGF0aW9uTm90aWZpZXJfLnNvY2tldCk7CisKKyAgICAgIGF1dG8gcmV0ID0gU29ja2V0LnNlbGVjdChzb2NrZXRTZXRfLCBudWxsLCBudWxsKTsKKyAgICAgIGVuZm9yY2UocmV0ICE9IDAsIG5ldyBTVEUoIlNvY2tldC5zZWxlY3QoKSByZXR1cm5lZCAwLiIsCisgICAgICAgIFNURS5UeXBlLlJFU09VUkNFX0ZBSUxFRCkpOworCisgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAvLyBTZWxlY3QgaXRzZWxmIGZhaWxlZCwgY2hlY2sgaWYgaXQgd2FzIGp1c3QgZHVlIHRvIGFuIGludGVycnVwdGVkCisgICAgICAgIC8vIHN5c2NhbGwuCisgICAgICAgIGlmIChnZXRTb2NrZXRFcnJubygpID09IElOVEVSUlVQVEVEX0VSUk5PKSB7CisgICAgICAgICAgaWYgKG51bUVpbnRycysrIDwgTUFYX0VJTlRSUykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTVEUoIlNvY2tldC5zZWxlY3QoKSB3YXMgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwgKEVJTlRSKSAiIH4KKyAgICAgICAgICAgICAgIm1vcmUgdGhhbiAiIH4gdG8hc3RyaW5nKE1BWF9FSU5UUlMpIH4gIiB0aW1lcy4iLAorICAgICAgICAgICAgICBTVEUuVHlwZS5SRVNPVVJDRV9GQUlMRUQKKyAgICAgICAgICAgICk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBTVEUoIlVua25vd24gZXJyb3Igb24gU29ja2V0LnNlbGVjdCgpOiAiIH4KKyAgICAgICAgICBzb2NrZXRFcnJub1N0cmluZyhnZXRTb2NrZXRFcnJubygpKSwgU1RFLlR5cGUuUkVTT1VSQ0VfRkFJTEVEKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENoZWNrIGZvciBhIHBpbmcgb24gdGhlIGludGVycnVwdCBzb2NrZXQuCisgICAgICAgIGlmIChzb2NrZXRTZXRfLmlzU2V0KGNhbmNlbGxhdGlvbk5vdGlmaWVyXy5zb2NrZXQpKSB7CisgICAgICAgICAgY2FuY2VsbGF0aW9uLnRocm93SWZUcmlnZ2VyZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGZvciB0aGUgYWN0dWFsIHNlcnZlciBzb2NrZXQgaGF2aW5nIGEgY29ubmVjdGlvbiB3YWl0aW5nLgorICAgICAgICBpZiAoc29ja2V0U2V0Xy5pc1NldChzZXJ2ZXJTb2NrZXRfKSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGF1dG8gY2xpZW50ID0gY3JlYXRlVFNvY2tldChzZXJ2ZXJTb2NrZXRfLmFjY2VwdCgpKTsKKyAgICAgIGNsaWVudC5zZW5kVGltZW91dCA9IHNlbmRUaW1lb3V0XzsKKyAgICAgIGNsaWVudC5yZWN2VGltZW91dCA9IHJlY3ZUaW1lb3V0XzsKKyAgICAgIHJldHVybiBjbGllbnQ7CisgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBTVEUoIlVua25vd24gZXJyb3Igb24gYWNjZXB0aW5nOiAiIH4gdG8hc3RyaW5nKGUpLAorICAgICAgICBTVEUuVHlwZS5SRVNPVVJDRV9GQUlMRUQpOworICAgIH0KKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBBbGxvd3MgZGVyaXZlZCBjbGFzc2VzIHRvIGNyZWF0ZSBhIGRpZmZlcmVudCBUU29ja2V0IHR5cGUuCisgICAqLworICBUU29ja2V0IGNyZWF0ZVRTb2NrZXQoU29ja2V0IHNvY2tldCkgeworICAgIHJldHVybiBuZXcgVFNvY2tldChzb2NrZXQpOworICB9CisKK3ByaXZhdGU6CisgIHVzaG9ydCBwb3J0XzsKKyAgRHVyYXRpb24gc2VuZFRpbWVvdXRfOworICBEdXJhdGlvbiByZWN2VGltZW91dF87CisgIHVzaG9ydCByZXRyeUxpbWl0XzsKKyAgRHVyYXRpb24gcmV0cnlEZWxheV87CisgIHVpbnQgdGNwU2VuZEJ1ZmZlcl87CisgIHVpbnQgdGNwUmVjdkJ1ZmZlcl87CisgIGJvb2wgaXB2Nk9ubHlfOworCisgIFNvY2tldCBzZXJ2ZXJTb2NrZXRfOworICBUU29ja2V0Tm90aWZpZXIgY2FuY2VsbGF0aW9uTm90aWZpZXJfOworCisgIC8vIEtlZXAgc29ja2V0IHNldCBiZXR3ZWVuIGFjY2VwdCgpIGNhbGxzIHRvIGF2b2lkIHJlYWxsb2NhdGluZy4KKyAgU29ja2V0U2V0IHNvY2tldFNldF87Cit9CisKK1NvY2tldCBtYWtlU29ja2V0QW5kTGlzdGVuKHVzaG9ydCBwb3J0LCBpbnQgYmFja2xvZywgdXNob3J0IHJldHJ5TGltaXQsCisgIER1cmF0aW9uIHJldHJ5RGVsYXksIHVpbnQgdGNwU2VuZEJ1ZmZlciA9IDAsIHVpbnQgdGNwUmVjdkJ1ZmZlciA9IDAsCisgIGJvb2wgaXB2Nk9ubHkgPSBmYWxzZQorKSB7CisgIEFkZHJlc3MgbG9jYWxBZGRyOworICB0cnkgeworICAgIC8vIG51bGwgcmVwcmVzZW50cyB0aGUgd2lsZGNhcmQgYWRkcmVzcy4KKyAgICBhdXRvIGFkZHJJbmZvcyA9IGdldEFkZHJlc3NJbmZvKG51bGwsIHRvIXN0cmluZyhwb3J0KSwKKyAgICAgIEFkZHJlc3NJbmZvRmxhZ3MuUEFTU0lWRSwgU29ja2V0VHlwZS5TVFJFQU0sIFByb3RvY29sVHlwZS5UQ1ApOworICAgIGZvcmVhY2ggKGksIGFpOyBhZGRySW5mb3MpIHsKKyAgICAgIC8vIFByZWZlciB0byBiaW5kIHRvIElQdjYgYWRkcmVzc2VzLCBiZWNhdXNlIHRoZW4gSVB2NCBpcyBsaXN0ZW5lZCB0byBhcworICAgICAgLy8gd2VsbCwgYnV0IG5vdCB0aGUgb3RoZXIgd2F5IHJvdW5kLgorICAgICAgaWYgKGFpLmZhbWlseSA9PSBBZGRyZXNzRmFtaWx5LklORVQ2IHx8IGkgPT0gKGFkZHJJbmZvcy5sZW5ndGggLSAxKSkgeworICAgICAgICBsb2NhbEFkZHIgPSBhaS5hZGRyZXNzOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgdGhyb3cgbmV3IFNURSgiQ291bGQgbm90IGRldGVybWluZSBsb2NhbCBhZGRyZXNzIHRvIGxpc3RlbiBvbi4iLAorICAgICAgU1RFLlR5cGUuUkVTT1VSQ0VfRkFJTEVELCBfX0ZJTEVfXywgX19MSU5FX18sIGUpOworICB9CisKKyAgU29ja2V0IHNvY2tldDsKKyAgdHJ5IHsKKyAgICBzb2NrZXQgPSBuZXcgU29ja2V0KGxvY2FsQWRkci5hZGRyZXNzRmFtaWx5LCBTb2NrZXRUeXBlLlNUUkVBTSwKKyAgICAgIFByb3RvY29sVHlwZS5UQ1ApOworICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgeworICAgIHRocm93IG5ldyBTVEUoIkNvdWxkIG5vdCBjcmVhdGUgYWNjZXB0aW5nIHNvY2tldDogIiB+IHRvIXN0cmluZyhlKSwKKyAgICAgIFNURS5UeXBlLlJFU09VUkNFX0ZBSUxFRCk7CisgIH0KKworICB0cnkgeworICAgIHNvY2tldC5zZXRPcHRpb24oU29ja2V0T3B0aW9uTGV2ZWwuSVBWNiwgU29ja2V0T3B0aW9uLklQVjZfVjZPTkxZLCBpcHY2T25seSk7CisgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisgICAgLy8gVGhpcyBpcyBzb21ld2hhdCBleHBlY3RlZCBvbiBvbGRlciBzeXN0ZW1zIChlLmcuIHByZS1WaXN0YSBXaW5kb3dzKSwKKyAgICAvLyB3aGljaCBkbyBub3Qgc3VwcG9ydCB0aGUgSVBWNl9WNk9OTFkgZmxhZyB5ZXQuIFJhY3kgZmxhZyBqdXN0IHRvIGF2b2lkCisgICAgLy8gbG9nIHNwZXcgaW4gdW5pdCB0ZXN0cy4KKyAgICBzaGFyZWQgc3RhdGljIHdhcm5lZCA9IGZhbHNlOworICAgIGlmICghd2FybmVkKSB7CisgICAgICBsb2dFcnJvcigiQ291bGQgbm90IHNldCBJUFY2X1Y2T05MWSBzb2NrZXQgb3B0aW9uOiAlcyIsIGUpOworICAgICAgd2FybmVkID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBhbGlhcyBTb2NrZXRPcHRpb25MZXZlbC5TT0NLRVQgbHZsU29jazsKKworICAvLyBQcmV2ZW50IDIgbWF4aW11bSBzZWdlbWVudCBsaWZldGltZSBkZWxheSBvbiBhY2NlcHQuCisgIHRyeSB7CisgICAgc29ja2V0LnNldE9wdGlvbihsdmxTb2NrLCBTb2NrZXRPcHRpb24uUkVVU0VBRERSLCB0cnVlKTsKKyAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKKyAgICB0aHJvdyBuZXcgU1RFKCJDb3VsZCBub3Qgc2V0IFJFVVNFQUREUiBzb2NrZXQgb3B0aW9uOiAiIH4gdG8hc3RyaW5nKGUpLAorICAgICAgU1RFLlR5cGUuUkVTT1VSQ0VfRkFJTEVEKTsKKyAgfQorCisgIC8vIFNldCBUQ1AgYnVmZmVyIHNpemVzLgorICBpZiAodGNwU2VuZEJ1ZmZlciA+IDApIHsKKyAgICB0cnkgeworICAgICAgc29ja2V0LnNldE9wdGlvbihsdmxTb2NrLCBTb2NrZXRPcHRpb24uU05EQlVGLCB0Y3BTZW5kQnVmZmVyKTsKKyAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFNURSgiQ291bGQgbm90IHNldCBzb2NrZXQgc2VuZCBidWZmZXIgc2l6ZTogIiB+IHRvIXN0cmluZyhlKSwKKyAgICAgICAgU1RFLlR5cGUuUkVTT1VSQ0VfRkFJTEVEKTsKKyAgICB9CisgIH0KKworICBpZiAodGNwUmVjdkJ1ZmZlciA+IDApIHsKKyAgICB0cnkgeworICAgICAgc29ja2V0LnNldE9wdGlvbihsdmxTb2NrLCBTb2NrZXRPcHRpb24uUkNWQlVGLCB0Y3BSZWN2QnVmZmVyKTsKKyAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFNURSgiQ291bGQgbm90IHNldCByZWNlaXZlIHNlbmQgYnVmZmVyIHNpemU6ICIgfiB0byFzdHJpbmcoZSksCisgICAgICAgIFNURS5UeXBlLlJFU09VUkNFX0ZBSUxFRCk7CisgICAgfQorICB9CisKKyAgLy8gVHVybiBsaW5nZXIgb2ZmIHRvIGF2b2lkIGJsb2NraW5nIG9uIHNvY2tldCBjbG9zZS4KKyAgdHJ5IHsKKyAgICBMaW5nZXIgbDsKKyAgICBsLm9uID0gMDsKKyAgICBsLnRpbWUgPSAwOworICAgIHNvY2tldC5zZXRPcHRpb24obHZsU29jaywgU29ja2V0T3B0aW9uLkxJTkdFUiwgbCk7CisgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisgICAgdGhyb3cgbmV3IFNURSgiQ291bGQgbm90IGRpc2FibGUgc29ja2V0IGxpbmdlcjogIiB+IHRvIXN0cmluZyhlKSwKKyAgICAgIFNURS5UeXBlLlJFU09VUkNFX0ZBSUxFRCk7CisgIH0KKworICAvLyBTZXQgVENQX05PREVMQVkuCisgIHRyeSB7CisgICAgc29ja2V0LnNldE9wdGlvbihTb2NrZXRPcHRpb25MZXZlbC5UQ1AsIFNvY2tldE9wdGlvbi5UQ1BfTk9ERUxBWSwgdHJ1ZSk7CisgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisgICAgdGhyb3cgbmV3IFNURSgiQ291bGQgbm90IGRpc2FibGUgTmFnbGUncyBhbGdvcml0aG06ICIgfiB0byFzdHJpbmcoZSksCisgICAgICBTVEUuVHlwZS5SRVNPVVJDRV9GQUlMRUQpOworICB9CisKKyAgdXNob3J0IHJldHJpZXM7CisgIHdoaWxlICh0cnVlKSB7CisgICAgdHJ5IHsKKyAgICAgIHNvY2tldC5iaW5kKGxvY2FsQWRkcik7CisgICAgICBicmVhazsKKyAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24pIHt9CisKKyAgICAvLyBJZiBiaW5kKCkgd29ya2VkLCB3ZSBicmVha2VkIG91dHNpZGUgdGhlIGxvb3AgYWJvdmUuCisgICAgcmV0cmllcysrOworICAgIGlmIChyZXRyaWVzIDwgcmV0cnlMaW1pdCkgeworICAgICAgVGhyZWFkLnNsZWVwKHJldHJ5RGVsYXkpOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgU1RFKHRleHQoIkNvdWxkIG5vdCBiaW5kIHRvIGFkZHJlc3M6ICIsIGxvY2FsQWRkciksCisgICAgICAgIFNURS5UeXBlLlJFU09VUkNFX0ZBSUxFRCk7CisgICAgfQorICB9CisKKyAgc29ja2V0Lmxpc3RlbihiYWNrbG9nKTsKKyAgcmV0dXJuIHNvY2tldDsKK30KKwordW5pdHRlc3QgeworICAvLyBUZXN0IGludGVycnVwdCgpLgorICB7CisgICAgYXV0byBzb2NrID0gbmV3IFRTZXJ2ZXJTb2NrZXQoMCk7CisgICAgc29jay5saXN0ZW4oKTsKKyAgICBzY29wZSAoZXhpdCkgc29jay5jbG9zZSgpOworCisgICAgYXV0byBjYW5jZWxsYXRpb24gPSBuZXcgVENhbmNlbGxhdGlvbk9yaWdpbjsKKworICAgIGF1dG8gaW50VGhyZWFkID0gbmV3IFRocmVhZCh7CisgICAgICAvLyBTbGVlcCBmb3IgYSBiaXQgdW50aWwgdGhlIHNvY2tldCBpcyBhY2NlcHRpbmcuCisgICAgICBUaHJlYWQuc2xlZXAoZHVyISJtc2VjcyIoNTApKTsKKyAgICAgIGNhbmNlbGxhdGlvbi50cmlnZ2VyKCk7CisgICAgfSk7CisgICAgaW50VGhyZWFkLnN0YXJ0KCk7CisKKyAgICBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKKyAgICBhc3NlcnRUaHJvd24hVENhbmNlbGxlZEV4Y2VwdGlvbihzb2NrLmFjY2VwdChjYW5jZWxsYXRpb24pKTsKKyAgfQorCisgIC8vIFRlc3QgcmVjZWl2ZSgpIHRpbWVvdXQgb24gYWNjZXB0ZWQgY2xpZW50IHNvY2tldHMuCisgIHsKKyAgICBpbW11dGFibGUgcG9ydCA9IDExMTIyOworICAgIGF1dG8gdGltZW91dCA9IGR1ciEibXNlY3MiKDUwMCk7CisgICAgYXV0byBzZXJ2ZXJTb2NrID0gbmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCwgdGltZW91dCwgdGltZW91dCk7CisgICAgc2VydmVyU29jay5saXN0ZW4oKTsKKyAgICBzY29wZSAoZXhpdCkgc2VydmVyU29jay5jbG9zZSgpOworCisgICAgYXV0byBjbGllbnRTb2NrID0gbmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHBvcnQpOworICAgIGNsaWVudFNvY2sub3BlbigpOworICAgIHNjb3BlIChleGl0KSBjbGllbnRTb2NrLmNsb3NlKCk7CisKKyAgICBzaGFyZWQgYm9vbCBoYXNUaW1lZE91dDsKKyAgICBhdXRvIHJlY3ZUaHJlYWQgPSBuZXcgVGhyZWFkKHsKKyAgICAgIGF1dG8gc29jayA9IHNlcnZlclNvY2suYWNjZXB0KCk7CisgICAgICB1Ynl0ZVsxXSBkYXRhOworICAgICAgdHJ5IHsKKyAgICAgICAgc29jay5yZWFkKGRhdGEpOworICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGlmIChlLnR5cGUgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLlRJTUVEX09VVCkgeworICAgICAgICAgIGhhc1RpbWVkT3V0ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbXBvcnQgc3RkLnN0ZGlvOworICAgICAgICAgIHN0ZGVyci53cml0ZWxuKGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisgICAgcmVjdlRocmVhZC5pc0RhZW1vbiA9IHRydWU7CisgICAgcmVjdlRocmVhZC5zdGFydCgpOworCisgICAgLy8gV2FpdCBmb3IgdGhlIHRpbWVvdXQsIHdpdGggYSBsaXR0bGUgYml0IG9mIHNwYXJlIHRpbWUuCisgICAgVGhyZWFkLnNsZWVwKHRpbWVvdXQgKyBkdXIhIm1zZWNzIig1MCkpOworICAgIGVuZm9yY2UoaGFzVGltZWRPdXQsCisgICAgICAiQ2xpZW50IHNvY2tldCByZWNlaXZlKCkgYmxvY2tlZCBmb3IgbG9uZ2VyIHRoYW4gcmVjdlRpbWVvdXQuIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RyYW5zcG9ydC9zc2wuZCBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RyYW5zcG9ydC9zc2wuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGQ5ZDIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdHJhbnNwb3J0L3NzbC5kCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5zc2w7CisKK2ltcG9ydCBzdGQuZGF0ZXRpbWUgOiBEdXJhdGlvbjsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCBzdGQuc29ja2V0IDogU29ja2V0OworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LnNvY2tldDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zc2w7CisKKy8qKgorICogQSBzZXJ2ZXIgdHJhbnNwb3J0IGltcGxlbWVudGF0aW9uIHVzaW5nIFNTTC1lbmNyeXB0ZWQgc29ja2V0cy4KKyAqCisgKiBOb3RlOgorICogT24gUG9zaXggc3lzdGVtcyB3aGljaCBkbyBub3QgaGF2ZSB0aGUgQlNELXNwZWNpZmljIFNPX05PU0lHUElQRSBmbGFnLCB5b3UKKyAqIG1pZ2h0IHdhbnQgdG8gaWdub3JlIHRoZSBTSUdQSVBFIHNpZ25hbCwgYXMgT3BlblNTTCBtaWdodCB0cnkgdG8gd3JpdGUgdG8KKyAqIGEgY2xvc2VkIHNvY2tldCBpZiB0aGUgcGVlciBkaXNjb25uZWN0cyBhYnJ1cHRseToKKyAqIC0tLQorICogaW1wb3J0IGNvcmUuc3RkYy5zaWduYWw7CisgKiBpbXBvcnQgY29yZS5zeXMucG9zaXguc2lnbmFsOworICogc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworICogLS0tCisgKgorICogU2VlOiB0aHJpZnQudHJhbnNwb3J0LnNzbC4KKyAqLworY2xhc3MgVFNTTFNlcnZlclNvY2tldCA6IFRTZXJ2ZXJTb2NrZXQgeworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyBUU1NMU2VydmVyU29ja2V0LgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgcG9ydCA9IFRoZSBwb3J0IG9uIHdoaWNoIHRvIGxpc3Rlbi4KKyAgICogICBzc2xDb250ZXh0ID0gVGhlIFRTU0xDb250ZXh0IHRvIHVzZSBmb3IgY3JlYXRpbmcgY2xpZW50CisgICAqICAgICBzb2NrZXRzLiBNdXN0IGJlIGluIHNlcnZlci1zaWRlIG1vZGUuCisgICAqLworICB0aGlzKHVzaG9ydCBwb3J0LCBUU1NMQ29udGV4dCBzc2xDb250ZXh0KSB7CisgICAgc3VwZXIocG9ydCk7CisgICAgc2V0U1NMQ29udGV4dChzc2xDb250ZXh0KTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IFRTU0xTZXJ2ZXJTb2NrZXQuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBwb3J0ID0gVGhlIHBvcnQgb24gd2hpY2ggdG8gbGlzdGVuLgorICAgKiAgIHNlbmRUaW1lb3V0ID0gVGhlIHNlbmQgdGltZW91dCB0byBzZXQgb24gdGhlIGNsaWVudCBzb2NrZXRzLgorICAgKiAgIHJlY3ZUaW1lb3V0ID0gVGhlIHJlY2VpdmUgdGltZW91dCB0byBzZXQgb24gdGhlIGNsaWVudCBzb2NrZXRzLgorICAgKiAgIHNzbENvbnRleHQgPSBUaGUgVFNTTENvbnRleHQgdG8gdXNlIGZvciBjcmVhdGluZyBjbGllbnQKKyAgICogICAgIHNvY2tldHMuIE11c3QgYmUgaW4gc2VydmVyLXNpZGUgbW9kZS4KKyAgICovCisgIHRoaXModXNob3J0IHBvcnQsIER1cmF0aW9uIHNlbmRUaW1lb3V0LCBEdXJhdGlvbiByZWN2VGltZW91dCwKKyAgICBUU1NMQ29udGV4dCBzc2xDb250ZXh0KQorICB7CisgICAgc3VwZXIocG9ydCwgc2VuZFRpbWVvdXQsIHJlY3ZUaW1lb3V0KTsKKyAgICBzZXRTU0xDb250ZXh0KHNzbENvbnRleHQpOworICB9CisKK3Byb3RlY3RlZDoKKyAgb3ZlcnJpZGUgVFNvY2tldCBjcmVhdGVUU29ja2V0KFNvY2tldCBzb2NrZXQpIHsKKyAgICByZXR1cm4gbmV3IFRTU0xTb2NrZXQoc3NsQ29udGV4dF8sIHNvY2tldCk7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBzZXRTU0xDb250ZXh0KFRTU0xDb250ZXh0IHNzbENvbnRleHQpIHsKKyAgICBlbmZvcmNlKHNzbENvbnRleHQuc2VydmVyU2lkZSwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiTmVlZCBzZXJ2ZXItc2lkZSBTU0wgc29ja2V0IGZhY3RvcnkgZm9yIFRTU0xTZXJ2ZXJTb2NrZXQiKSk7CisgICAgc3NsQ29udGV4dF8gPSBzc2xDb250ZXh0OworICB9CisKKyAgVFNTTENvbnRleHQgc3NsQ29udGV4dF87Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3NmE1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2Jhc2UuZApAQCAtMCwwICsxLDM3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC50cmFuc3BvcnQuYmFzZTsKKworaW1wb3J0IGNvcmUuc3RkYy5zdHJpbmcgOiBzdHJlcnJvcjsKK2ltcG9ydCBzdGQuY29udiA6IHRleHQ7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CisKKy8qKgorICogQW4gZW50aXR5IGRhdGEgY2FuIGJlIHJlYWQgZnJvbSBhbmQvb3Igd3JpdHRlbiB0by4KKyAqCisgKiBBIFRUcmFuc3BvcnQgaW1wbGVtZW50YXRpb24gbWF5IGNhcGFibGUgb2YgZWl0aGVyIHJlYWRpbmcgb3Igd3JpdGluZywgYnV0CisgKiBub3QgbmVjZXNzYXJpbHkgYm90aC4KKyAqLworaW50ZXJmYWNlIFRUcmFuc3BvcnQgeworICAvKioKKyAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgorICAgKgorICAgKiBJZiBhIHRyYW5zcG9ydCBpcyBjbG9zZWQsIGl0IGNhbiBiZSBvcGVuZWQgYnkgY2FsbGluZyBvcGVuKCksIGFuZCB2aWNlCisgICAqIHZlcnNhIGZvciBjbG9zZSgpLgorICAgKgorICAgKiBXaGlsZSBhIHRyYW5zcG9ydCBzaG91bGQgYWx3YXlzIGJlIG9wZW4gd2hlbiB0cnlpbmcgdG8gcmVhZC93cml0ZSBkYXRhLAorICAgKiB0aGUgcmVsYXRlZCBmdW5jdGlvbnMgZG8gbm90IG5lY2Vzc2FyaWx5IGZhaWwgd2hlbiBjYWxsZWQgZm9yIGEgY2xvc2VkCisgICAqIHRyYW5zcG9ydC4gU2l0dWF0aW9ucyBsaWtlIHRoaXMgY291bGQgb2NjdXIgZS5nLiB3aXRoIGEgd3JhcHBlcgorICAgKiB0cmFuc3BvcnQgd2hpY2ggYnVmZmVycyBkYXRhIHdoZW4gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGhhcyBhbHJlYWR5CisgICAqIGJlZW4gY2xvc2VkIChwb3NzaWJseSBiZWNhdXNlIHRoZSBjb25uZWN0aW9uIHdhcyBhYnJ1cHRseSBjbG9zZWQpLCBidXQKKyAgICogdGhlcmUgaXMgc3RpbGwgZGF0YSBsZWZ0IHRvIGJlIHJlYWQgaW4gdGhlIGJ1ZmZlcnMuIFRoaXMgY2hvaWNlIGhhcyBiZWVuCisgICAqIG1hZGUgdG8gc2ltcGxpZnkgdHJhbnNwb3J0IGltcGxlbWVudGF0aW9ucywgaW4gdGVybXMgb2YgYm90aCAgY29kZQorICAgKiBjb21wbGV4aXR5IGFuZCBydW50aW1lIG92ZXJoZWFkLgorICAgKi8KKyAgYm9vbCBpc09wZW4oKSBAcHJvcGVydHk7CisKKyAgLyoqCisgICAqIFRlc3RzIHdoZXRoZXIgdGhlcmUgaXMgbW9yZSBkYXRhIHRvIHJlYWQgb3IgaWYgdGhlIHJlbW90ZSBzaWRlIGlzCisgICAqIHN0aWxsIG9wZW4uCisgICAqCisgICAqIEEgdHlwaWNhbCB1c2UgY2FzZSB3b3VsZCBiZSBhIHNlcnZlciBjaGVja2luZyBpZiBpdCBzaG91bGQgcHJvY2VzcworICAgKiBhbm90aGVyIHJlcXVlc3Qgb24gdGhlIHRyYW5zcG9ydC4KKyAgICovCisgIGJvb2wgcGVlaygpOworCisgIC8qKgorICAgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGZvciBjb21tdW5pY2F0aW9ucy4KKyAgICoKKyAgICogSWYgdGhlIHRyYW5zcG9ydCBpcyBhbHJlYWR5IG9wZW4sIG5vdGhpbmcgaGFwcGVucy4KKyAgICoKKyAgICogVGhyb3dzOiBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIG9wZW5pbmcgZmFpbHMuCisgICAqLworICB2b2lkIG9wZW4oKTsKKworICAvKioKKyAgICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQuCisgICAqCisgICAqIElmIHRoZSB0cmFuc3BvcnQgaXMgbm90IG9wZW4sIG5vdGhpbmcgaGFwcGVucy4KKyAgICoKKyAgICogVGhyb3dzOiBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNsb3NpbmcgZmFpbHMuCisgICAqLworICB2b2lkIGNsb3NlKCk7CisKKyAgLyoqCisgICAqIEF0dGVtcHRzIHRvIGZpbGwgdGhlIGdpdmVuIGJ1ZmZlciBieSByZWFkaW5nIGRhdGEuCisgICAqCisgICAqIEZvciBwb3RlbnRpYWxseSBibG9ja2luZyBkYXRhIHNvdXJjZXMgKGUuZy4gc29ja2V0cyksIHJlYWQoKSB3aWxsIG9ubHkKKyAgICogYmxvY2sgaWYgbm8gZGF0YSBpcyBhdmFpbGFibGUgYXQgYWxsLiBJZiB0aGVyZSBpcyBzb21lIGRhdGEgYXZhaWxhYmxlLAorICAgKiBidXQgd2FpdGluZyBmb3IgbmV3IGRhdGEgdG8gYXJyaXZlIHdvdWxkIGJlIHJlcXVpcmVkIHRvIGZpbGwgdGhlIHdob2xlCisgICAqIGJ1ZmZlciwgdGhlIHJlYWRpbHkgYXZhaWxhYmxlIGRhdGEgd2lsbCBiZSBpbW1lZGlhdGVseSByZXR1cm5lZCDigJMgdXNlCisgICAqIHJlYWRBbGwoKSBpZiB5b3Ugd2FudCB0byB3YWl0IHVudGlsIHRoZSB3aG9sZSBidWZmZXIgaXMgZmlsbGVkLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgYnVmID0gU2xpY2UgdG8gdXNlIGFzIGJ1ZmZlci4KKyAgICoKKyAgICogUmV0dXJuczogSG93IG1hbnkgYnl0ZXMgd2VyZSBhY3R1YWxseSByZWFkCisgICAqCisgICAqIFRocm93czogVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAqLworICBzaXplX3QgcmVhZCh1Ynl0ZVtdIGJ1Zik7CisKKyAgLyoqCisgICAqIEZpbGxzIHRoZSBnaXZlbiBidWZmZXIgYnkgcmVhZGluZyBkYXRhIGludG8gaXQsIGZhaWxpbmcgaWYgbm90IGVub3VnaAorICAgKiBkYXRhIGlzIGF2YWlsYWJsZS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGJ1ZiA9IFNsaWNlIHRvIHVzZSBhcyBidWZmZXIuCisgICAqCisgICAqIFRocm93czogVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBpbnN1ZmZpY2llbnQgZGF0YSBpcyBhdmFpbGFibGUgb3IgcmVhZGluZworICAgKiAgIGZhaWxzIGFsdG9nZXRoZXIuCisgICAqLworICB2b2lkIHJlYWRBbGwodWJ5dGVbXSBidWYpOworCisgIC8qKgorICAgKiBNdXN0IGJlIGNhbGxlZCBieSBjbGllbnRzIHdoZW4gcmVhZCBpcyBjb21wbGV0ZWQuCisgICAqCisgICAqIEltcGxlbWVudGF0aW9ucyBjYW4gY2hvb3NlIHRvIHBlcmZvcm0gYSB0cmFuc3BvcnQtc3BlY2lmaWMgYWN0aW9uLCBlLmcuCisgICAqIGxvZ2dpbmcgdGhlIHJlcXVlc3QgdG8gYSBmaWxlLgorICAgKgorICAgKiBSZXR1cm5zOiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaWYgYXZhaWxhYmxlLCAwIG90aGVyd2lzZS4KKyAgICovCisgIHNpemVfdCByZWFkRW5kKCk7CisKKyAgLyoqCisgICAqIFdyaXRlcyB0aGUgcGFzc2VkIHNsaWNlIG9mIGRhdGEuCisgICAqCisgICAqIE5vdGU6IFlvdSBtdXN0IGNhbGwgZmx1c2goKSB0byBlbnN1cmUgdGhlIGRhdGEgaXMgYWN0dWFsbHkgd3JpdHRlbiwKKyAgICogYW5kIGF2YWlsYWJsZSB0byBiZSByZWFkIGJhY2sgaW4gdGhlIGZ1dHVyZS4gIERlc3Ryb3lpbmcgYSBUVHJhbnNwb3J0CisgICAqIG9iamVjdCBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IGZsdXNoIHBlbmRpbmcgZGF0YSDigJMgaWYgeW91IGRlc3Ryb3kgYQorICAgKiBUVHJhbnNwb3J0IG9iamVjdCB3aXRoIHdyaXR0ZW4gYnV0IHVuZmx1c2hlZCBkYXRhLCB0aGF0IGRhdGEgbWF5IGJlCisgICAqIGRpc2NhcmRlZC4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGJ1ZiA9IFNsaWNlIG9mIGRhdGEgdG8gd3JpdGUuCisgICAqCisgICAqIFRocm93czogVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAqLworICB2b2lkIHdyaXRlKGluIHVieXRlW10gYnVmKTsKKworICAvKioKKyAgICogTXVzdCBiZSBjYWxsZWQgYnkgY2xpZW50cyB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlZC4KKyAgICoKKyAgICogSW1wbGVtZW50YXRpb25zIGNhbiBjaG9vc2UgdG8gcGVyZm9ybSBhIHRyYW5zcG9ydC1zcGVjaWZpYyBhY3Rpb24sIGUuZy4KKyAgICogbG9nZ2luZyB0aGUgcmVxdWVzdCB0byBhIGZpbGUuCisgICAqCisgICAqIFJldHVybnM6IFRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpZiBhdmFpbGFibGUsIDAgb3RoZXJ3aXNlLgorICAgKi8KKyAgc2l6ZV90IHdyaXRlRW5kKCk7CisKKyAgLyoqCisgICAqIEZsdXNoZXMgYW55IHBlbmRpbmcgZGF0YSB0byBiZSB3cml0dGVuLgorICAgKgorICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgZGVzdHJ1Y3Rpb24gdG8gZW5zdXJlIHdyaXRlcyBhcmUgYWN0dWFsbHkgY29tcGxldGUsCisgICAqIG90aGVyd2lzZSBwZW5kaW5nIGRhdGEgbWF5IGJlIGRpc2NhcmRlZC4gVHlwaWNhbGx5IHVzZWQgd2l0aCBidWZmZXJlZAorICAgKiB0cmFuc3BvcnQgbWVjaGFuaXNtcy4KKyAgICoKKyAgICogVGhyb3dzOiBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICovCisgIHZvaWQgZmx1c2goKTsKKworICAvKioKKyAgICogQXR0ZW1wdHMgdG8gcmV0dXJuIGEgc2xpY2Ugb2YgPGNvZGU+bGVuPC9jb2RlPiBieXRlcyBvZiBpbmNvbWluZyBkYXRhLAorICAgKiBwb3NzaWJseSBjb3BpZWQgaW50byBidWYsIG5vdCBjb25zdW1pbmcgdGhlbSAoaS5lLjogYSBsYXRlciByZWFkIHdpbGwKKyAgICogcmV0dXJuIHRoZSBzYW1lIGRhdGEpLgorICAgKgorICAgKiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBzdXBwb3J0IHByb3RvY29scyB0aGF0IG5lZWQgdG8gcmVhZCB2YXJpYWJsZS0KKyAgICogbGVuZ3RoIGZpZWxkcy4gVGhleSBjYW4gYXR0ZW1wdCB0byBib3Jyb3cgdGhlIG1heGltdW0gYW1vdW50IG9mIGRhdGEgdGhhdAorICAgKiB0aGV5IHdpbGwgbmVlZCwgdGhlbiA8Y29kZT5jb25zdW1lKCk8L2NvZGU+IHdoYXQgdGhleSBhY3R1YWxseSB1c2UuIFNvbWUKKyAgICogdHJhbnNwb3J0cyB3aWxsIG5vdCBzdXBwb3J0IHRoaXMgbWV0aG9kIGFuZCBvdGhlcnMgd2lsbCBmYWlsIG9jY2FzaW9uYWxseSwKKyAgICogc28gcHJvdG9jb2xzIG11c3QgYmUgcHJlcGFyZWQgdG8gZmFsbCBiYWNrIHRvIDxjb2RlPnJlYWQoKTwvY29kZT4gaWYKKyAgICogYm9ycm93IGZhaWxzLgorICAgKgorICAgKiBUaGUgdHJhbnNwb3J0IG11c3QgYmUgb3BlbiB3aGVuIGNhbGxpbmcgdGhpcy4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGJ1ZiA9IEEgYnVmZmVyIHdoZXJlIHRoZSBkYXRhIGNhbiBiZSBzdG9yZWQgaWYgbmVlZGVkLCBvciBudWxsIHRvCisgICAqICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBjYWxsZXIgaXMgbm90IHN1cHBseWluZyBzdG9yYWdlLCBidXQgd291bGQgbGlrZSBhCisgICAqICAgICBzbGljZSBvZiBhbiBpbnRlcm5hbCBidWZmZXIsIGlmIGF2YWlsYWJsZS4KKyAgICogICBsZW4gPSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJvcnJvdy4KKyAgICoKKyAgICogUmV0dXJuczogSWYgdGhlIGJvcnJvdyBzdWNjZWVkcywgYSBzbGljZSBjb250YWluaW5nIHRoZSBib3Jyb3dlZCBkYXRhLAorICAgKiAgIG51bGwgb3RoZXJ3aXNlLiBUaGUgc2xpY2Ugd2lsbCBiZSBhdCBsZWFzdCBhcyBsb25nIGFzIHJlcXVlc3RlZCwgYnV0CisgICAqICAgbWF5IGJlIGxvbmdlciBpZiB0aGUgcmV0dXJuZWQgc2xpY2UgcG9pbnRzIGludG8gYW4gaW50ZXJuYWwgYnVmZmVyCisgICAqICAgcmF0aGVyIHRoYW4gYnVmLgorICAgKgorICAgKiBUaHJvd3M6IFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgKi8KKyAgY29uc3QodWJ5dGUpW10gYm9ycm93KHVieXRlKiBidWYsIHNpemVfdCBsZW4pIG91dCAocmVzdWx0KSB7CisgICAgLy8gRklYTUU6IENvbW1lbnRlZCBvdXQgYmVjYXVzZSBsZW4gZ2V0cyBjb3JydXB0ZWQgaW4KKyAgICAvLyB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeSBib3Jyb3coKSB1bml0dGVzdC4KKyAgICB2ZXJzaW9uKG5vbmUpIGFzc2VydChyZXN1bHQgaXMgbnVsbCB8fCByZXN1bHQubGVuZ3RoID49IGxlbiwKKyAgICAgICAiQnVmZmVyIHJldHVybmVkIGJ5IGJvcnJvdygpIHRvbyBzaG9ydC4iKTsKKyAgfQorCisgIC8qKgorICAgKiBSZW1vdmUgbGVuIGJ5dGVzIGZyb20gdGhlIHRyYW5zcG9ydC4gVGhpcyBtdXN0IGFsd2F5cyBmb2xsb3cgYSBib3Jyb3cKKyAgICogb2YgYXQgbGVhc3QgbGVuIGJ5dGVzLCBhbmQgc2hvdWxkIGFsd2F5cyBzdWNjZWVkLgorICAgKgorICAgKiBUaGUgdHJhbnNwb3J0IG11c3QgYmUgb3BlbiB3aGVuIGNhbGxpbmcgdGhpcy4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGxlbiA9IE51bWJlciBvZiBieXRlcyB0byBjb25zdW1lLgorICAgKgorICAgKiBUaHJvd3M6IFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgKi8KKyAgdm9pZCBjb25zdW1lKHNpemVfdCBsZW4pOworfQorCisvKioKKyAqIFByb3ZpZGVzIGJhc2ljIGZhbGwtYmFjayBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorICovCitjbGFzcyBUQmFzZVRyYW5zcG9ydCA6IFRUcmFuc3BvcnQgeworICBvdmVycmlkZSBib29sIGlzT3BlbigpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBwZWVrKCkgeworICAgIHJldHVybiBpc09wZW47CisgIH0KKworICBvdmVycmlkZSB2b2lkIG9wZW4oKSB7CisgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNhbm5vdCBvcGVuIFRCYXNlVHJhbnNwb3J0LiIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX0lNUExFTUVOVEVEKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgY2xvc2UoKSB7CisgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNhbm5vdCBjbG9zZSBUQmFzZVRyYW5zcG9ydC4iLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9JTVBMRU1FTlRFRCk7CisgIH0KKworICBvdmVycmlkZSBzaXplX3QgcmVhZCh1Ynl0ZVtdIGJ1ZikgeworICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDYW5ub3QgcmVhZCBmcm9tIGEgVEJhc2VUcmFuc3BvcnQuIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfSU1QTEVNRU5URUQpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCByZWFkQWxsKHVieXRlW10gYnVmKSB7CisgICAgc2l6ZV90IGhhdmU7CisgICAgd2hpbGUgKGhhdmUgPCBidWYubGVuZ3RoKSB7CisgICAgICBzaXplX3QgZ2V0ID0gcmVhZChidWZbaGF2ZS4uJF0pOworICAgICAgaWYgKGdldCA8PSAwKSB7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKHRleHQoIkNvdWxkIG5vdCByZWFkQWxsKCkgIiwgYnVmLmxlbmd0aCwKKyAgICAgICAgICAiIGJ5dGVzIGFzIG5vIG1vcmUgZGF0YSB3YXMgYXZhaWxhYmxlIGFmdGVyICIsIGhhdmUsICIgYnl0ZXMuIiksCisgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkVORF9PRl9GSUxFKTsKKyAgICAgIH0KKyAgICAgIGhhdmUgKz0gZ2V0OworICAgIH0KKyAgfQorCisgIG92ZXJyaWRlIHNpemVfdCByZWFkRW5kKCkgeworICAgIC8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdCwgbm90IG5lZWRlZCBieSBhbGwgaW1wbGVtZW50YXRpb25zLgorICAgIHJldHVybiAwOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCB3cml0ZShpbiB1Ynl0ZVtdIGJ1ZikgeworICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDYW5ub3Qgd3JpdGUgdG8gYSBUQmFzZVRyYW5zcG9ydC4iLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9JTVBMRU1FTlRFRCk7CisgIH0KKworICBvdmVycmlkZSBzaXplX3Qgd3JpdGVFbmQoKSB7CisgICAgLy8gRG8gbm90aGluZyBieSBkZWZhdWx0LCBub3QgbmVlZGVkIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMuCisgICAgcmV0dXJuIDA7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGZsdXNoKCkgeworICAgIC8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdCwgbm90IG5lZWRlZCBieSBhbGwgaW1wbGVtZW50YXRpb25zLgorICB9CisKKyAgb3ZlcnJpZGUgY29uc3QodWJ5dGUpW10gYm9ycm93KHVieXRlKiBidWYsIHNpemVfdCBsZW4pIHsKKyAgICAvLyBib3Jyb3coKSBpcyBhbGxvd2VkIHRvIGZhaWwgYW55d2F5LCBzbyBqdXN0IHJldHVybiBudWxsLgorICAgIHJldHVybiBudWxsOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBjb25zdW1lKHNpemVfdCBsZW4pIHsKKyAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ2Fubm90IGNvbnN1bWUgZnJvbSBhIFRCYXNlVHJhbnNwb3J0LiIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX0lNUExFTUVOVEVEKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHRoaXMoKSB7fQorfQorCisvKioKKyAqIE1ha2VzIGEgVFRyYW5zcG9ydCB3aGljaCB3cmFwcyBhIGdpdmVuIHNvdXJjZSB0cmFuc3BvcnQgaW4gc29tZSB3YXkuCisgKgorICogQSBjb21tb24gdXNlIGNhc2UgaXMgaW5zaWRlIHNlcnZlciBpbXBsZW1lbnRhdGlvbnMsIHdoZXJlIHRoZSByYXcgY2xpZW50CisgKiBjb25uZWN0aW9ucyBhY2NlcHRlZCBmcm9tIGUuZy4gVFNlcnZlclNvY2tldCBuZWVkIHRvIGJlIHdyYXBwZWQgaW50bworICogYnVmZmVyZWQgb3IgY29tcHJlc3NlZCB0cmFuc3BvcnRzLgorICovCitjbGFzcyBUVHJhbnNwb3J0RmFjdG9yeSB7CisgIC8qKgorICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZywganVzdCByZXR1cm5zIHRoZSB0cmFuc3BvcnQgZ2l2ZW4uCisgICAqLworICBUVHJhbnNwb3J0IGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zKSB7CisgICAgcmV0dXJuIHRyYW5zOworICB9Cit9CisKKy8qKgorICogVHJhbnNwb3J0IGZhY3RvcnkgZm9yIHRyYW5zcG9ydHMgd2hpY2ggc2ltcGx5IHdyYXAgYW4gdW5kZXJseWluZyBUVHJhbnNwb3J0CisgKiB3aXRob3V0IHJlcXVpcmluZyBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24uCisgKi8KK2NsYXNzIFRXcmFwcGVyVHJhbnNwb3J0RmFjdG9yeShUKSBpZiAoCisgIGlzKFQgOiBUVHJhbnNwb3J0KSAmJiBfX3RyYWl0cyhjb21waWxlcywgbmV3IFQoVFRyYW5zcG9ydC5pbml0KSkKKykgIDogVFRyYW5zcG9ydEZhY3RvcnkgeworICBvdmVycmlkZSBUIGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zKSB7CisgICAgcmV0dXJuIG5ldyBUKHRyYW5zKTsKKyAgfQorfQorCisvKioKKyAqIFRyYW5zcG9ydC1sZXZlbCBleGNlcHRpb24uCisgKi8KK2NsYXNzIFRUcmFuc3BvcnRFeGNlcHRpb24gOiBURXhjZXB0aW9uIHsKKyAgLyoqCisgICAqIEVycm9yIGNvZGVzIGZvciB0aGUgdmFyaW91cyB0eXBlcyBvZiBleGNlcHRpb25zLgorICAgKi8KKyAgZW51bSBUeXBlIHsKKyAgICBVTktOT1dOLCAvLy8KKyAgICBOT1RfT1BFTiwgLy8vCisgICAgVElNRURfT1VULCAvLy8KKyAgICBFTkRfT0ZfRklMRSwgLy8vCisgICAgSU5URVJSVVBURUQsIC8vLworICAgIEJBRF9BUkdTLCAvLy8KKyAgICBDT1JSVVBURURfREFUQSwgLy8vCisgICAgSU5URVJOQUxfRVJST1IsIC8vLworICAgIE5PVF9JTVBMRU1FTlRFRCAvLy8KKyAgfQorCisgIC8vLworICB0aGlzKFR5cGUgdHlwZSwgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywgVGhyb3dhYmxlIG5leHQgPSBudWxsKSB7CisgICAgc3RhdGljIHN0cmluZyBtc2dGb3JUeXBlKFR5cGUgdHlwZSkgeworICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgVHlwZS5VTktOT1dOOiByZXR1cm4gIlVua25vd24gdHJhbnNwb3J0IGV4Y2VwdGlvbiI7CisgICAgICAgIGNhc2UgVHlwZS5OT1RfT1BFTjogcmV0dXJuICJUcmFuc3BvcnQgbm90IG9wZW4iOworICAgICAgICBjYXNlIFR5cGUuVElNRURfT1VUOiByZXR1cm4gIlRpbWVkIG91dCI7CisgICAgICAgIGNhc2UgVHlwZS5FTkRfT0ZfRklMRTogcmV0dXJuICJFbmQgb2YgZmlsZSI7CisgICAgICAgIGNhc2UgVHlwZS5JTlRFUlJVUFRFRDogcmV0dXJuICJJbnRlcnJ1cHRlZCI7CisgICAgICAgIGNhc2UgVHlwZS5CQURfQVJHUzogcmV0dXJuICJJbnZhbGlkIGFyZ3VtZW50cyI7CisgICAgICAgIGNhc2UgVHlwZS5DT1JSVVBURURfREFUQTogcmV0dXJuICJDb3JydXB0ZWQgRGF0YSI7CisgICAgICAgIGNhc2UgVHlwZS5JTlRFUk5BTF9FUlJPUjogcmV0dXJuICJJbnRlcm5hbCBlcnJvciI7CisgICAgICAgIGNhc2UgVHlwZS5OT1RfSU1QTEVNRU5URUQ6IHJldHVybiAiTm90IGltcGxlbWVudGVkIjsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuICIoSW52YWxpZCBleGNlcHRpb24gdHlwZSkiOworICAgICAgfQorICAgIH0KKyAgICB0aGlzKG1zZ0ZvclR5cGUodHlwZSksIHR5cGUsIGZpbGUsIGxpbmUsIG5leHQpOworICB9CisKKyAgLy8vCisgIHRoaXMoc3RyaW5nIG1zZywgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywKKyAgICBUaHJvd2FibGUgbmV4dCA9IG51bGwpCisgIHsKKyAgICB0aGlzKG1zZywgVHlwZS5VTktOT1dOLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgfQorCisgIC8vLworICB0aGlzKHN0cmluZyBtc2csIFR5cGUgdHlwZSwgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywKKyAgICBUaHJvd2FibGUgbmV4dCA9IG51bGwpCisgIHsKKyAgICBzdXBlcihtc2csIGZpbGUsIGxpbmUsIG5leHQpOworICAgIHR5cGVfID0gdHlwZTsKKyAgfQorCisgIC8vLworICBUeXBlIHR5cGUoKSBjb25zdCBub3Rocm93IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHR5cGVfOworICB9CisKK3Byb3RlY3RlZDoKKyAgVHlwZSB0eXBlXzsKK30KKworLyoqCisgKiBNZXRhLXByb2dyYW1taW5nIGhlbHBlciByZXR1cm5pbmcgd2hldGhlciB0aGUgcGFzc2VkIHR5cGUgaXMgYSBUVHJhbnNwb3J0CisgKiBpbXBsZW1lbnRhdGlvbi4KKyAqLwordGVtcGxhdGUgaXNUVHJhbnNwb3J0KFQpIHsKKyAgZW51bSBpc1RUcmFuc3BvcnQgPSBpcyhUIDogVFRyYW5zcG9ydCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9idWZmZXJlZC5kIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvYnVmZmVyZWQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWJmYmRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvYnVmZmVyZWQuZApAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC50cmFuc3BvcnQuYnVmZmVyZWQ7CisKK2ltcG9ydCBzdGQuYWxnb3JpdGhtIDogbWluOworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5OworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKKworLyoqCisgKiBXcmFwcyBhbm90aGVyIHRyYW5zcG9ydCBhbmQgYnVmZmVycyByZWFkcyBhbmQgd3JpdGVzIHVudGlsIHRoZSBpbnRlcm5hbAorICogYnVmZmVycyBhcmUgZXhoYXVzdGVkLCBhdCB3aGljaCBwb2ludCBuZXcgZGF0YSBpcyBmZXRjaGVkIHJlc3AuIHRoZQorICogYWNjdW11bGF0ZWQgZGF0YSBpcyB3cml0dGVuIG91dCBhdCBvbmNlLgorICovCitmaW5hbCBjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnQgOiBUQmFzZVRyYW5zcG9ydCB7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLCB1c2luZyB0aGUgZGVmYXVsdCBidWZmZXIgc2l6ZXMuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICB0cmFuc3BvcnQgPSBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdG8gd3JhcC4KKyAgICovCisgIHRoaXMoVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICB0aGlzKHRyYW5zcG9ydCwgREVGQVVMVF9CVUZGRVJfU0laRSk7CisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSwgdXNpbmcgdGhlIHNwZWNpZmllZCBidWZmZXIgc2l6ZS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHRyYW5zcG9ydCA9IFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byB3cmFwLgorICAgKiAgIGJ1ZmZlclNpemUgPSBUaGUgc2l6ZSBvZiB0aGUgcmVhZCBhbmQgd3JpdGUgYnVmZmVycyB0byB1c2UsIGluIGJ5dGVzLgorICAgKi8KKyAgdGhpcyhUVHJhbnNwb3J0IHRyYW5zcG9ydCwgc2l6ZV90IGJ1ZmZlclNpemUpIHsKKyAgICB0aGlzKHRyYW5zcG9ydCwgYnVmZmVyU2l6ZSwgYnVmZmVyU2l6ZSk7CisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSwgdXNpbmcgdGhlIHNwZWNpZmllZCBidWZmZXIgc2l6ZS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHRyYW5zcG9ydCA9IFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byB3cmFwLgorICAgKiAgIHJlYWRCdWZmZXJTaXplID0gVGhlIHNpemUgb2YgdGhlIHJlYWQgYnVmZmVyIHRvIHVzZSwgaW4gYnl0ZXMuCisgICAqICAgd3JpdGVCdWZmZXJTaXplID0gVGhlIHNpemUgb2YgdGhlIHdyaXRlIGJ1ZmZlciB0byB1c2UsIGluIGJ5dGVzLgorICAgKi8KKyAgdGhpcyhUVHJhbnNwb3J0IHRyYW5zcG9ydCwgc2l6ZV90IHJlYWRCdWZmZXJTaXplLCBzaXplX3Qgd3JpdGVCdWZmZXJTaXplKSB7CisgICAgdHJhbnNwb3J0XyA9IHRyYW5zcG9ydDsKKyAgICByZWFkQnVmZmVyXyA9IG5ldyB1Ynl0ZVtyZWFkQnVmZmVyU2l6ZV07CisgICAgd3JpdGVCdWZmZXJfID0gbmV3IHVieXRlW3dyaXRlQnVmZmVyU2l6ZV07CisgICAgd3JpdGVBdmFpbF8gPSB3cml0ZUJ1ZmZlcl87CisgIH0KKworICAvLy8gVGhlIGRlZmF1bHQgc2l6ZSBvZiB0aGUgcmVhZC93cml0ZSBidWZmZXJzLCBpbiBieXRlcy4KKyAgZW51bSBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IDUxMjsKKworICBvdmVycmlkZSBib29sIGlzT3BlbigpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHRyYW5zcG9ydF8uaXNPcGVuKCk7CisgIH0KKworICBvdmVycmlkZSBib29sIHBlZWsoKSB7CisgICAgaWYgKHJlYWRBdmFpbF8uZW1wdHkpIHsKKyAgICAgIC8vIElmIHRoZXJlIGlzIG5vdGhpbmcgYXZhaWxhYmxlIHRvIHJlYWQsIHNlZSBpZiB3ZSBjYW4gZ2V0IHNvbWV0aGluZworICAgICAgLy8gZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgICAgICBhdXRvIGJ5dGVzUmVhZCA9IHRyYW5zcG9ydF8ucmVhZChyZWFkQnVmZmVyXyk7CisgICAgICByZWFkQXZhaWxfID0gcmVhZEJ1ZmZlcl9bMCAuLiBieXRlc1JlYWRdOworICAgIH0KKworICAgIHJldHVybiAhcmVhZEF2YWlsXy5lbXB0eTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgb3BlbigpIHsKKyAgICB0cmFuc3BvcnRfLm9wZW4oKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgY2xvc2UoKSB7CisgICAgaWYgKCFpc09wZW4pIHJldHVybjsKKyAgICBmbHVzaCgpOworICAgIHRyYW5zcG9ydF8uY2xvc2UoKTsKKyAgfQorCisgIG92ZXJyaWRlIHNpemVfdCByZWFkKHVieXRlW10gYnVmKSB7CisgICAgaWYgKHJlYWRBdmFpbF8uZW1wdHkpIHsKKyAgICAgIC8vIE5vIGRhdGEgbGVmdCBpbiBvdXIgYnVmZmVyLCBmZXRjaCBzb21lIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorCisgICAgICBpZiAoYnVmLmxlbmd0aCA+IHJlYWRCdWZmZXJfLmxlbmd0aCkgeworICAgICAgICAvLyBJZiB0aGUgYW1vdW50IG9mIGRhdGEgcmVxdWVzdGVkIGlzIGxhcmdlciB0aGFuIG91ciByZWFkaW5nIGJ1ZmZlciwKKyAgICAgICAgLy8gZGlyZWN0bHkgcmVhZCB0byB0aGUgcGFzc2VkIGJ1ZmZlci4gVGhpcyBwcm9iYWJseSBkb2Vzbid0IG9jY3VyIHRvbworICAgICAgICAvLyBvZnRlbiBpbiBwcmFjdGljZSAoYW5kIGV2ZW4gaWYgaXQgZG9lcywgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICAgIC8vIHByb2JhYmx5IGNhbm5vdCBmdWxmaWxsIHRoZSByZXF1ZXN0IGF0IG9uY2UgYW55d2F5KSwgYnV0IGl0IGNhbid0CisgICAgICAgIC8vIGhhcm0gdG8gdHJ54oCmCisgICAgICAgIHJldHVybiB0cmFuc3BvcnRfLnJlYWQoYnVmKTsKKyAgICAgIH0KKworICAgICAgYXV0byBieXRlc1JlYWQgPSB0cmFuc3BvcnRfLnJlYWQocmVhZEJ1ZmZlcl8pOworICAgICAgcmVhZEF2YWlsXyA9IHJlYWRCdWZmZXJfWzAgLi4gYnl0ZXNSZWFkXTsKKyAgICB9CisKKyAgICAvLyBIYW5kIG92ZXIgd2hhdGV2ZXIgd2UgaGF2ZS4KKyAgICBhdXRvIGdpdmUgPSBtaW4ocmVhZEF2YWlsXy5sZW5ndGgsIGJ1Zi5sZW5ndGgpOworICAgIGJ1ZlswIC4uIGdpdmVdID0gcmVhZEF2YWlsX1swIC4uIGdpdmVdOworICAgIHJlYWRBdmFpbF8gPSByZWFkQXZhaWxfW2dpdmUgLi4gJF07CisgICAgcmV0dXJuIGdpdmU7CisgIH0KKworICAvKioKKyAgICogU2hvcnRjdXQgdmVyc2lvbiBvZiByZWFkQWxsLgorICAgKi8KKyAgb3ZlcnJpZGUgdm9pZCByZWFkQWxsKHVieXRlW10gYnVmKSB7CisgICAgaWYgKHJlYWRBdmFpbF8ubGVuZ3RoID49IGJ1Zi5sZW5ndGgpIHsKKyAgICAgIGJ1ZltdID0gcmVhZEF2YWlsX1swIC4uIGJ1Zi5sZW5ndGhdOworICAgICAgcmVhZEF2YWlsXyA9IHJlYWRBdmFpbF9bYnVmLmxlbmd0aCAuLiAkXTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdXBlci5yZWFkQWxsKGJ1Zik7CisgIH0KKworICBvdmVycmlkZSB2b2lkIHdyaXRlKGluIHVieXRlW10gYnVmKSB7CisgICAgaWYgKHdyaXRlQXZhaWxfLmxlbmd0aCA+PSBidWYubGVuZ3RoKSB7CisgICAgICAvLyBJZiB0aGUgZGF0YSBmaXRzIGluIHRoZSBidWZmZXIsIGp1c3Qgc2F2ZSBpdCB0aGVyZS4KKyAgICAgIHdyaXRlQXZhaWxfWzAgLi4gYnVmLmxlbmd0aF0gPSBidWY7CisgICAgICB3cml0ZUF2YWlsXyA9IHdyaXRlQXZhaWxfW2J1Zi5sZW5ndGggLi4gJF07CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gV2UgaGF2ZSB0byBkZWNpZGUgaWYgd2UgY29weSBkYXRhIGZyb20gYnVmIHRvIG91ciBpbnRlcm5hbCBidWZmZXIsIG9yCisgICAgLy8ganVzdCBkaXJlY3RseSB3cml0ZSB0aGVtIG91dC4gVGhlIHNhbWUgY29uc2lkZXJhdGlvbnMgYWJvdXQgYXZvaWRpbmcKKyAgICAvLyBzeXNjYWxscyBhcyBmb3IgQysrIGFwcGx5IGhlcmUuCisgICAgYXV0byBieXRlc0F2YWlsID0gd3JpdGVBdmFpbF8ucHRyIC0gd3JpdGVCdWZmZXJfLnB0cjsKKyAgICBpZiAoKGJ5dGVzQXZhaWwgKyBidWYubGVuZ3RoID49IDIgKiB3cml0ZUJ1ZmZlcl8ubGVuZ3RoKSB8fCAoYnl0ZXNBdmFpbCA9PSAwKSkgeworICAgICAgLy8gV2Ugd291bGQgaW1tZWRpYXRlbHkgbmVlZCB0d28gc3lzY2FsbHMgYW55d2F5IChvciB3ZSBkb24ndCBoYXZlCisgICAgICAvLyBhbnl0aGluZykgaW4gb3VyIGJ1ZmZlciB0byB3cml0ZSwgc28ganVzdCB3cml0ZSBvdXQgYm90aCBidWZmZXJzLgorICAgICAgaWYgKGJ5dGVzQXZhaWwgPiAwKSB7CisgICAgICAgIHRyYW5zcG9ydF8ud3JpdGUod3JpdGVCdWZmZXJfWzAgLi4gYnl0ZXNBdmFpbF0pOworICAgICAgICB3cml0ZUF2YWlsXyA9IHdyaXRlQnVmZmVyXzsKKyAgICAgIH0KKworICAgICAgdHJhbnNwb3J0Xy53cml0ZShidWYpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEZpbGwgdXAgb3VyIGludGVybmFsIGJ1ZmZlciBmb3IgYSB3cml0ZS4KKyAgICB3cml0ZUF2YWlsX1tdID0gYnVmWzAgLi4gd3JpdGVBdmFpbF8ubGVuZ3RoXTsKKyAgICBhdXRvIGxlZnQgPSBidWZbd3JpdGVBdmFpbF8ubGVuZ3RoIC4uICRdOworICAgIHRyYW5zcG9ydF8ud3JpdGUod3JpdGVCdWZmZXJfKTsKKworICAgIC8vIENvcHkgdGhlIHJlc3QgaW50byBvdXIgYnVmZmVyLgorICAgIHdyaXRlQnVmZmVyX1swIC4uIGxlZnQubGVuZ3RoXSA9IGxlZnRbXTsKKyAgICB3cml0ZUF2YWlsXyA9IHdyaXRlQnVmZmVyX1tsZWZ0Lmxlbmd0aCAuLiAkXTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgZmx1c2goKSB7CisgICAgLy8gV3JpdGUgb3V0IGFueSBkYXRhIHdhaXRpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlci4KKyAgICBhdXRvIGJ5dGVzQXZhaWwgPSB3cml0ZUF2YWlsXy5wdHIgLSB3cml0ZUJ1ZmZlcl8ucHRyOworICAgIGlmIChieXRlc0F2YWlsID4gMCkgeworICAgICAgLy8gTm90ZSB0aGF0IHdlIHJlc2V0IHdyaXRlQXZhaWxfIHByaW9yIHRvIGNhbGxpbmcgdGhlIHVuZGVybHlpbmcgcHJvdG9jb2wKKyAgICAgIC8vIHRvIG1ha2Ugc3VyZSB0aGUgYnVmZmVyIGlzIGNsZWFyZWQgZXZlbiBpZiB0aGUgdHJhbnNwb3J0IHRocm93cyBhbgorICAgICAgLy8gZXhjZXB0aW9uLgorICAgICAgd3JpdGVBdmFpbF8gPSB3cml0ZUJ1ZmZlcl87CisgICAgICB0cmFuc3BvcnRfLndyaXRlKHdyaXRlQnVmZmVyX1swIC4uIGJ5dGVzQXZhaWxdKTsKKyAgICB9CisKKyAgICAvLyBGbHVzaCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgICAgdHJhbnNwb3J0Xy5mbHVzaCgpOworICB9CisKKyAgb3ZlcnJpZGUgY29uc3QodWJ5dGUpW10gYm9ycm93KHVieXRlKiBidWYsIHNpemVfdCBsZW4pIHsKKyAgICBpZiAobGVuIDw9IHJlYWRBdmFpbF8ubGVuZ3RoKSB7CisgICAgICByZXR1cm4gcmVhZEF2YWlsXzsKKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGNvbnN1bWUoc2l6ZV90IGxlbikgeworICAgIGVuZm9yY2UobGVuIDw9IHJlYWRCdWZmZXJfLmxlbmd0aCwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiSW52YWxpZCBjb25zdW1lIGxlbmd0aC4iLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQkFEX0FSR1MpKTsKKyAgICByZWFkQXZhaWxfID0gcmVhZEF2YWlsX1tsZW4gLi4gJF07CisgIH0KKworICAvKioKKyAgICogVGhlIHdyYXBwZWQgdHJhbnNwb3J0LgorICAgKi8KKyAgVFRyYW5zcG9ydCB1bmRlcmx5aW5nVHJhbnNwb3J0KCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gdHJhbnNwb3J0XzsKKyAgfQorCitwcml2YXRlOgorICBUVHJhbnNwb3J0IHRyYW5zcG9ydF87CisKKyAgdWJ5dGVbXSByZWFkQnVmZmVyXzsKKyAgdWJ5dGVbXSB3cml0ZUJ1ZmZlcl87CisKKyAgdWJ5dGVbXSByZWFkQXZhaWxfOworICB1Ynl0ZVtdIHdyaXRlQXZhaWxfOworfQorCisvKioKKyAqIFdyYXBzIGdpdmVuIHRyYW5zcG9ydHMgaW50byBUQnVmZmVyZWRUcmFuc3BvcnRzLgorICovCithbGlhcyBUV3JhcHBlclRyYW5zcG9ydEZhY3RvcnkhVEJ1ZmZlcmVkVHJhbnNwb3J0IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk7CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9maWxlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9maWxlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4OGU3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2ZpbGUuZApAQCAtMCwwICsxLDExMDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBUcmFuc3BvcnRzIGZvciByZWFkaW5nIGZyb20vd3JpdGluZyB0byBUaHJpZnQgwrtsb2cgZmlsZXPCqy4KKyAqCisgKiBUaGVzZSB0cmFuc3BvcnRzIGFyZSBub3QgwrtzdHVwaWTCqyBzb3VyY2VzIGFuZCBzaW5rcyBqdXN0IHJlYWRpbmcgYW5kCisgKiB3cml0aW5nIGJ5dGVzIGZyb20gYSBmaWxlIHZlcmJhdGltLCBidXQgb3JnYW5pemUgdGhlIGNvbnRlbnRzIGluIHRoZSBmb3JtCisgKiBvZiBzby1jYWxsZWQgwrtldmVudHPCqywgd2hpY2ggcmVmZXJzIHRvIHRoZSBkYXRhIHdyaXR0ZW4gYmV0d2VlbiB0d28gZmx1c2goKQorICogY2FsbHMuCisgKgorICogQ2h1bmtpbmcgaXMgc3VwcG9ydGVkLCBldmVudHMgYXJlIGd1YXJhbnRlZWQgdG8gbmV2ZXIgc3BhbiBjaHVuayBib3VuZGFyaWVzLgorICogQXMgYSBjb25zZXF1ZW5jZSwgYW4gZXZlbnQgY2FuIG5ldmVyIGJlIGxhcmdlciB0aGFuIHRoZSBjaHVuayBzaXplLiBUaGUKKyAqIGNodW5rIHNpemUgdXNlZCBpcyBub3Qgc2F2ZWQgd2l0aCB0aGUgZmlsZSwgc28gY2FyZSBoYXMgdG8gYmUgdGFrZW4gdG8gbWFrZQorICogc3VyZSB0aGUgc2FtZSBjaHVuayBzaXplIGlzIHVzZWQgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuCisgKi8KK21vZHVsZSB0aHJpZnQudHJhbnNwb3J0LmZpbGU7CisKK2ltcG9ydCBjb3JlLnRocmVhZCA6IFRocmVhZDsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eTsKK2ltcG9ydCBzdGQuYWxnb3JpdGhtIDogbWluLCBtYXg7CitpbXBvcnQgc3RkLmNvbmN1cnJlbmN5OworaW1wb3J0IHN0ZC5jb252IDogdG87CitpbXBvcnQgc3RkLmRhdGV0aW1lIDogZHVyLCBEdXJhdGlvbjsKK2ltcG9ydCBzdGQuZGF0ZXRpbWUuc3RvcHdhdGNoIDogQXV0b1N0YXJ0LCBTdG9wV2F0Y2g7CitpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKK2ltcG9ydCBzdGQuc3RkaW8gOiBGaWxlOworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKKworLy8vIFRoZSBkZWZhdWx0IGNodW5rIHNpemUsIGluIGJ5dGVzLgorZW51bSBERUZBVUxUX0NIVU5LX1NJWkUgPSAxNiAqIDEwMjQgKiAxMDI0OworCisvLy8gVGhlIHR5cGUgdXNlZCB0byByZXByZXNlbnQgZXZlbnQgc2l6ZXMgaW4gdGhlIGZpbGUuCithbGlhcyB1aW50IEV2ZW50U2l6ZTsKKwordmVyc2lvbiAoQmlnRW5kaWFuKSB7CisgIHN0YXRpYyBhc3NlcnQoZmFsc2UsCisgICAgIkxpdHRsZSBlbmRpYW4gYnl0ZSBvcmRlciBpcyBhc3N1bWVkIGluIHRocmlmdC50cmFuc3BvcnQuZmlsZS4iKTsKK30KKworLyoqCisgKiBBIHRyYW5zcG9ydCB1c2VkIHRvIHJlYWQgbG9nIGZpbGVzLiBJdCBjYW4gbmV2ZXIgYmUgd3JpdHRlbiB0bywgY2FsbGluZworICogd3JpdGUoKSB0aHJvd3MuCisgKgorICogQ29udHJhcnkgdG8gdGhlIEMrKyBkZXNpZ24sIGV4cGxpY2l0bHkgb3BlbmluZyB0aGUgdHJhbnNwb3J0L2ZpbGUgYmVmb3JlCisgKiB1c2luZyBpcyBuZWNlc3NhcnkgdG8gYWxsb3cgbWFudWFsbHkgY2xvc2luZyB0aGUgZmlsZSB3aXRob3V0IHJlbHlpbmcgb24gdGhlCisgKiBvYmplY3QgbGlmZXRpbWUuIE90aGVyd2lzZSwgaXQncyBhIHN0cmFpZ2h0IHBvcnQgb2YgdGhlIEMrKyBpbXBsZW1lbnRhdGlvbi4KKyAqLworZmluYWwgY2xhc3MgVEZpbGVSZWFkZXJUcmFuc3BvcnQgOiBUQmFzZVRyYW5zcG9ydCB7CisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IGZpbGUgd3JpdGVyIHRyYW5zcG9ydC4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHBhdGggPSBQYXRoIG9mIHRoZSBmaWxlIHRvIG9wcGVyYXRlIG9uLgorICAgKi8KKyAgdGhpcyhzdHJpbmcgcGF0aCkgeworICAgIHBhdGhfID0gcGF0aDsKKyAgICBjaHVua1NpemVfID0gREVGQVVMVF9DSFVOS19TSVpFOworICAgIHJlYWRCdWZmZXJTaXplXyA9IERFRkFVTFRfUkVBRF9CVUZGRVJfU0laRTsKKyAgICByZWFkVGltZW91dF8gPSBERUZBVUxUX1JFQURfVElNRU9VVDsKKyAgICBjb3JydXB0ZWRFdmVudFNsZWVwRHVyYXRpb25fID0gREVGQVVMVF9DT1JSVVBURURfRVZFTlRfU0xFRVBfRFVSQVRJT047CisgICAgbWF4RXZlbnRTaXplID0gREVGQVVMVF9NQVhfRVZFTlRfU0laRTsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgaXNPcGVuKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gaXNPcGVuXzsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgcGVlaygpIHsKKyAgICBpZiAoIWlzT3BlbikgcmV0dXJuIGZhbHNlOworCisgICAgLy8gSWYgdGhlcmUgaXMgbm8gZXZlbnQgY3VycmVudGx5IHByb2Nlc3NlZCwgdHJ5IGZldGNoaW5nIG9uZSBmcm9tIHRoZQorICAgIC8vIGZpbGUuCisgICAgaWYgKCFjdXJyZW50RXZlbnRfKSB7CisgICAgICBjdXJyZW50RXZlbnRfID0gcmVhZEV2ZW50KCk7CisKKyAgICAgIGlmICghY3VycmVudEV2ZW50XykgeworICAgICAgICAvLyBTdGlsbCBub3RoaW5nIHRoZXJlLCBjb3VsZG4ndCByZWFkIGEgbmV3IGV2ZW50LgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGFueXRoaW5nIHRvIHJlYWQKKyAgICByZXR1cm4gKGN1cnJlbnRFdmVudF8ubGVuZ3RoIC0gY3VycmVudEV2ZW50UG9zXykgPiAwOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBvcGVuKCkgeworICAgIGlmIChpc09wZW4pIHJldHVybjsKKyAgICB0cnkgeworICAgICAgZmlsZV8gPSBGaWxlKHBhdGhfLCAicmIiKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkVycm9yIG9uIG9wZW5pbmcgaW5wdXQgZmlsZS4iLAorICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4sIF9fRklMRV9fLCBfX0xJTkVfXywgZSk7CisgICAgfQorICAgIGlzT3Blbl8gPSB0cnVlOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAoIWlzT3BlbikgcmV0dXJuOworCisgICAgZmlsZV8uY2xvc2UoKTsKKyAgICBpc09wZW5fID0gZmFsc2U7CisgICAgcmVhZFN0YXRlXy5yZXNldEFsbFZhbHVlcygpOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWQodWJ5dGVbXSBidWYpIHsKKyAgICBlbmZvcmNlKGlzT3BlbiwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiQ2Fubm90IHJlYWQgaWYgZmlsZSBpcyBub3Qgb3Blbi4iLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4pKTsKKworICAgIC8vIElmIHRoZXJlIGlzIG5vIGV2ZW50IGN1cnJlbnRseSBwcm9jZXNzZWQsIHRyeSBmZXRjaGluZyBvbmUgZnJvbSB0aGUKKyAgICAvLyBmaWxlLgorICAgIGlmICghY3VycmVudEV2ZW50XykgeworICAgICAgY3VycmVudEV2ZW50XyA9IHJlYWRFdmVudCgpOworCisgICAgICBpZiAoIWN1cnJlbnRFdmVudF8pIHsKKyAgICAgICAgLy8gU3RpbGwgbm90aGluZyB0aGVyZSwgY291bGRuJ3QgcmVhZCBhIG5ldyBldmVudC4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorCisgICAgYXV0byBsZW4gPSBidWYubGVuZ3RoOworICAgIGF1dG8gcmVtYWluaW5nID0gY3VycmVudEV2ZW50Xy5sZW5ndGggLSBjdXJyZW50RXZlbnRQb3NfOworCisgICAgaWYgKHJlbWFpbmluZyA8PSBsZW4pIHsKKyAgICAgIC8vIElmIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIGxlbmd0aCBpcyBhdmFpbGFibGUsIHJlYWQgYXMgbXVjaCBhcworICAgICAgLy8gcG9zc2libGUuCisgICAgICBidWZbMCAuLiByZW1haW5pbmddID0gY3VycmVudEV2ZW50X1tjdXJyZW50RXZlbnRQb3NfIC4uICRdOworICAgICAgY3VycmVudEV2ZW50XyA9IG51bGw7CisgICAgICBjdXJyZW50RXZlbnRQb3NfID0gMDsKKyAgICAgIHJldHVybiByZW1haW5pbmc7CisgICAgfQorCisgICAgLy8gVGhlcmUgd2lsbCBzdGlsbCBiZSBkYXRhIGxlZnQgaW4gdGhlIGJ1ZmZlciBhZnRlciByZWFkaW5nLCBwYXNzIG91dCBsZW4KKyAgICAvLyBieXRlcy4KKyAgICBidWZbXSA9IGN1cnJlbnRFdmVudF9bY3VycmVudEV2ZW50UG9zXyAuLiBjdXJyZW50RXZlbnRQb3NfICsgbGVuXTsKKyAgICBjdXJyZW50RXZlbnRQb3NfICs9IGxlbjsKKyAgICByZXR1cm4gbGVuOworICB9CisKKyAgdWxvbmcgZ2V0TnVtQ2h1bmtzKCkgeworICAgIGVuZm9yY2UoaXNPcGVuLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3QgZ2V0IG51bWJlciBvZiBjaHVua3MgaWYgZmlsZSBub3Qgb3Blbi4iLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisKKyAgICB0cnkgeworICAgICAgYXV0byBmaWxlU2l6ZSA9IGZpbGVfLnNpemUoKTsKKyAgICAgIGlmIChmaWxlU2l6ZSA9PSAwKSB7CisgICAgICAgIC8vIEVtcHR5IGZpbGVzIGhhdmUgbm8gY2h1bmtzLgorICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIHJldHVybiAoKGZpbGVTaXplKS9jaHVua1NpemVfKSArIDE7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJFcnJvciBnZXR0aW5nIGZpbGUgc2l6ZS4iLCBfX0ZJTEVfXywKKyAgICAgICAgX19MSU5FX18sIGUpOworICAgIH0KKyAgfQorCisgIHVsb25nIGdldEN1ckNodW5rKCkgeworICAgIHJldHVybiBvZmZzZXRfIC8gY2h1bmtTaXplXzsKKyAgfQorCisgIHZvaWQgc2Vla1RvQ2h1bmsobG9uZyBjaHVuaykgeworICAgIGVuZm9yY2UoaXNPcGVuLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3QgZ2V0IG51bWJlciBvZiBjaHVua3MgaWYgZmlsZSBub3Qgb3Blbi4iLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisKKyAgICBhdXRvIG51bUNodW5rcyA9IGdldE51bUNodW5rcygpOworCisgICAgaWYgKGNodW5rIDwgMCkgeworICAgICAgLy8gQ291bnQgbmVnYXRpdmUgaW5kaWNlcyBmcm9tIHRoZSBlbmQuCisgICAgICBjaHVuayArPSBudW1DaHVua3M7CisgICAgfQorCisgICAgaWYgKGNodW5rIDwgMCkgeworICAgICAgbG9nRXJyb3IoIkluY29ycmVjdCBjaHVuayBudW1iZXIgZm9yIHJldmVyc2Ugc2Vlaywgc2Vla2luZyB0byAiIH4KKyAgICAgICAiYmVnaW5uaW5nIGluc3RlYWQ6ICVzIiwgY2h1bmspOworICAgICAgY2h1bmsgPSAwOworICAgIH0KKworICAgIGJvb2wgc2Vla1RvRW5kOworICAgIGxvbmcgbWluRW5kT2Zmc2V0OworICAgIGlmIChjaHVuayA+PSBudW1DaHVua3MpIHsKKyAgICAgIGxvZ0Vycm9yKCJUcnlpbmcgdG8gc2VlayB0byBub24tZXhpc3RpbmcgY2h1bmssIHNlZWtpbmcgdG8gIiB+CisgICAgICAgImVuZCBvZiBmaWxlIGluc3RlYWQ6ICVzIiwgY2h1bmspOworICAgICAgc2Vla1RvRW5kID0gdHJ1ZTsKKyAgICAgIGNodW5rID0gbnVtQ2h1bmtzIC0gMTsKKyAgICAgIC8vIHRoaXMgaXMgdGhlIG1pbiBvZmZzZXQgdG8gcHJvY2VzcyBldmVudHMgdGlsbAorICAgICAgbWluRW5kT2Zmc2V0ID0gZmlsZV8uc2l6ZSgpOworICAgIH0KKworICAgIHJlYWRTdGF0ZV8ucmVzZXRBbGxWYWx1ZXMoKTsKKyAgICBjdXJyZW50RXZlbnRfID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBmaWxlXy5zZWVrKGNodW5rICogY2h1bmtTaXplXyk7CisgICAgICBvZmZzZXRfID0gY2h1bmsgKiBjaHVua1NpemVfOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiRXJyb3Igc2Vla2luZyB0byBjaHVuayIsIF9fRklMRV9fLAorICAgICAgICBfX0xJTkVfXywgZSk7CisgICAgfQorCisgICAgaWYgKHNlZWtUb0VuZCkgeworICAgICAgLy8gTmV2ZXIgd2FpdCBvbiB0aGUgZW5kIG9mIHRoZSBmaWxlIGZvciBuZXcgY29udGVudCwgd2UganVzdCB3YW50IHRvCisgICAgICAvLyBmaW5kIHRoZSBsYXN0IG9uZS4KKyAgICAgIGF1dG8gb2xkUmVhZFRpbWVvdXQgPSByZWFkVGltZW91dF87CisgICAgICBzY29wZSAoZXhpdCkgcmVhZFRpbWVvdXRfID0gb2xkUmVhZFRpbWVvdXQ7CisgICAgICByZWFkVGltZW91dF8gPSBkdXIhImhuc2VjcyIoMCk7CisKKyAgICAgIC8vIEtlZXAgb24gcmVhZGluZyB1bnRpIHRoZSBsYXN0IGV2ZW50IGF0IHBvaW50IG9mIHNlZWtUb0NodW5rIGNhbGwuCisgICAgICB3aGlsZSAoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclBvc18pIDwgbWluRW5kT2Zmc2V0KSB7CisgICAgICAgIGlmIChyZWFkRXZlbnQoKSBpcyBudWxsKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2b2lkIHNlZWtUb0VuZCgpIHsKKyAgICBzZWVrVG9DaHVuayhnZXROdW1DaHVua3MoKSk7CisgIH0KKworICAvKioKKyAgICogVGhlIHNpemUgb2YgdGhlIGNodW5rcyB0aGUgZmlsZSBpcyBkaXZpZGVkIGludG8sIGluIGJ5dGVzLgorICAgKi8KKyAgdWxvbmcgY2h1bmtTaXplKCkgQHByb3BlcnR5IGNvbnN0IHsKKyAgICByZXR1cm4gY2h1bmtTaXplXzsKKyAgfQorCisgIC8vLyBkaXR0bworICB2b2lkIGNodW5rU2l6ZSh1bG9uZyB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBlbmZvcmNlKCFpc09wZW4sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCBzZXQgY2h1bmsgc2l6ZSBhZnRlciBURmlsZVJlYWRlclRyYW5zcG9ydCBoYXMgYmVlbiBvcGVuZWQuIikpOworICAgIGVuZm9yY2UodmFsdWUgPiBFdmVudFNpemUuc2l6ZW9mLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ2h1bmtzIG11c3QgIiB+CisgICAgICAiYmUgbGFyZ2UgZW5vdWdoIHRvIGFjY29tbW9kYXRlIGF0IGxlYXN0IGEgc2luZ2xlIGJ5dGUgb2YgcGF5bG9hZCBkYXRhLiIpKTsKKyAgICBjaHVua1NpemVfID0gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogSWYgcG9zaXRpdmUsIHdhaXQgdGhlIHNwZWNpZmllZCBkdXJhdGlvbiBmb3IgbmV3IGRhdGEgd2hlbiBhcnJpdmluZyBhdAorICAgKiBlbmQgb2YgZmlsZS4gSWYgbmVnYXRpdmUsIHdhaXQgZm9yZXZlciAodGFpbGluZyBtb2RlKSwgd2FraW5nIHVwIHRvIGNoZWNrCisgICAqIGluIHRoZSBzcGVjaWZpZWQgaW50ZXJ2YWwuIElmIHplcm8sIGRvIG5vdCB3YWl0IGF0IGFsbC4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gNTAwIG1zLgorICAgKi8KKyAgRHVyYXRpb24gcmVhZFRpbWVvdXQoKSBAcHJvcGVydHkgY29uc3QgeworICAgIHJldHVybiByZWFkVGltZW91dF87CisgIH0KKworICAvLy8gZGl0dG8KKyAgdm9pZCByZWFkVGltZW91dChEdXJhdGlvbiB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICByZWFkVGltZW91dF8gPSB2YWx1ZTsKKyAgfQorCisgIC8vLyBkaXR0bworICBlbnVtIERFRkFVTFRfUkVBRF9USU1FT1VUID0gZHVyISJtc2VjcyIoNTAwKTsKKworICAvKioKKyAgICogUmVhZCBidWZmZXIgc2l6ZSwgaW4gYnl0ZXMuCisgICAqCisgICAqIERlZmF1bHRzIHRvIDEgTWlCLgorICAgKi8KKyAgc2l6ZV90IHJlYWRCdWZmZXJTaXplKCkgQHByb3BlcnR5IGNvbnN0IHsKKyAgICByZXR1cm4gcmVhZEJ1ZmZlclNpemVfOworICB9CisKKyAgLy8vIGRpdHRvCisgIHZvaWQgcmVhZEJ1ZmZlclNpemUoc2l6ZV90IHZhbHVlKSBAcHJvcGVydHkgeworICAgIGlmIChyZWFkQnVmZmVyXykgeworICAgICAgZW5mb3JjZSh2YWx1ZSA8PSByZWFkQnVmZmVyU2l6ZV8sCisgICAgICAgICJDYW5ub3Qgc2hyaW5rIHJlYWQgYnVmZmVyIGFmdGVyIGZpcnN0IHJlYWQuIik7CisgICAgICByZWFkQnVmZmVyXy5sZW5ndGggPSB2YWx1ZTsKKyAgICB9CisgICAgcmVhZEJ1ZmZlclNpemVfID0gdmFsdWU7CisgIH0KKworICAvLy8gZGl0dG8KKyAgZW51bSBERUZBVUxUX1JFQURfQlVGRkVSX1NJWkUgPSAxICogMTAyNCAqIDEwMjQ7CisKKyAgLyoqCisgICAqIEFyYml0cmFyeSBldmVudCBzaXplIGxpbWl0LCBpbiBieXRlcy4gTXVzdCBiZSBzbWFsbGVyIHRoYW4gY2h1bmsgc2l6ZS4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gemVybyAobm8gbGltaXQpLgorICAgKi8KKyAgc2l6ZV90IG1heEV2ZW50U2l6ZSgpIEBwcm9wZXJ0eSBjb25zdCB7CisgICAgcmV0dXJuIG1heEV2ZW50U2l6ZV87CisgIH0KKworICAvLy8gZGl0dG8KKyAgdm9pZCBtYXhFdmVudFNpemUoc2l6ZV90IHZhbHVlKSBAcHJvcGVydHkgeworICAgIGVuZm9yY2UodmFsdWUgPD0gY2h1bmtTaXplXyAtIEV2ZW50U2l6ZS5zaXplb2YsICJFdmVudHMgY2Fubm90IHNwYW4gIiB+CisgICAgICAibXV0aXBsZSBjaHVua3MsIG1heEV2ZW50U2l6ZSBtdXN0IGJlIHNtYWxsZXIgdGhhbiBjaHVuayBzaXplLiIpOworICAgIG1heEV2ZW50U2l6ZV8gPSB2YWx1ZTsKKyAgfQorCisgIC8vLyBkaXR0bworICBlbnVtIERFRkFVTFRfTUFYX0VWRU5UX1NJWkUgPSAwOworCisgIC8qKgorICAgKiBUaGUgaW50ZXJ2YWwgYXQgd2hpY2ggdGhlIHRocmVhZCB3YWtlcyB1cCB0byBjaGVjayBmb3IgdGhlIG5leHQgY2h1bmsKKyAgICogaW4gdGFpbGluZyBtb2RlLgorICAgKgorICAgKiBEZWZhdWx0cyB0byBvbmUgc2Vjb25kLgorICAgKi8KKyAgRHVyYXRpb24gY29ycnVwdGVkRXZlbnRTbGVlcER1cmF0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBjb3JydXB0ZWRFdmVudFNsZWVwRHVyYXRpb25fOworICB9CisKKyAgLy8vIGRpdHRvCisgIHZvaWQgY29ycnVwdGVkRXZlbnRTbGVlcER1cmF0aW9uKER1cmF0aW9uIHZhbHVlKSB7CisgICAgY29ycnVwdGVkRXZlbnRTbGVlcER1cmF0aW9uXyA9IHZhbHVlOworICB9CisKKyAgLy8vIGRpdHRvCisgIGVudW0gREVGQVVMVF9DT1JSVVBURURfRVZFTlRfU0xFRVBfRFVSQVRJT04gPSBkdXIhInNlY29uZHMiKDEpOworCisgIC8qKgorICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29ycnVwdGVkIGV2ZW50cyB0b2xlcmF0ZWQgYmVmb3JlIHRoZSB3aG9sZSBjaHVuaworICAgKiBpcyBza2lwcGVkLgorICAgKgorICAgKiBEZWZhdWx0cyB0byB6ZXJvLgorICAgKi8KKyAgdWludCBtYXhDb3JydXB0ZWRFdmVudHMoKSBAcHJvcGVydHkgY29uc3QgeworICAgIHJldHVybiBtYXhDb3JydXB0ZWRFdmVudHNfOworICB9CisKKyAgLy8vIGRpdHRvCisgIHZvaWQgbWF4Q29ycnVwdGVkRXZlbnRzKHVpbnQgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgbWF4Q29ycnVwdGVkRXZlbnRzXyA9IHZhbHVlOworICB9CisKKyAgLy8vIGRpdHRvCisgIGVudW0gREVGQVVMVF9NQVhfQ09SUlVQVEVEX0VWRU5UUyA9IDA7CisKK3ByaXZhdGU6CisgIHVieXRlW10gcmVhZEV2ZW50KCkgeworICAgIGlmICghcmVhZEJ1ZmZlcl8pIHsKKyAgICAgIHJlYWRCdWZmZXJfID0gbmV3IHVieXRlW3JlYWRCdWZmZXJTaXplX107CisgICAgfQorCisgICAgYm9vbCB0aW1lb3V0RXhwaXJlZDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgLy8gcmVhZCBmcm9tIHRoZSBmaWxlIGlmIHJlYWQgYnVmZmVyIGlzIGV4aGF1c3RlZAorICAgICAgaWYgKHJlYWRTdGF0ZV8uYnVmZmVyUG9zXyA9PSByZWFkU3RhdGVfLmJ1ZmZlckxlbl8pIHsKKyAgICAgICAgLy8gYWR2YW5jZSB0aGUgb2Zmc2V0IHBvaW50ZXIKKyAgICAgICAgb2Zmc2V0XyArPSByZWFkU3RhdGVfLmJ1ZmZlckxlbl87CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAvLyBOZWVkIHRvIGNsZWFyIGVvZiBmbGFnIGJlZm9yZSByZWFkaW5nLCBvdGhlcndpc2UgdGFpbGluZyBhIGZpbGUKKyAgICAgICAgICAvLyBkb2VzIG5vdCB3b3JrLgorICAgICAgICAgIGZpbGVfLmNsZWFyZXJyKCk7CisKKyAgICAgICAgICBhdXRvIHVzZWRCdWYgPSBmaWxlXy5yYXdSZWFkKHJlYWRCdWZmZXJfKTsKKyAgICAgICAgICByZWFkU3RhdGVfLmJ1ZmZlckxlbl8gPSB1c2VkQnVmLmxlbmd0aDsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICByZWFkU3RhdGVfLnJlc2V0QWxsVmFsdWVzKCk7CisgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkVycm9yIHdoaWxlIHJlYWRpbmcgZnJvbSBmaWxlIiwKKyAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgZSk7CisgICAgICAgIH0KKworICAgICAgICByZWFkU3RhdGVfLmJ1ZmZlclBvc18gPSAwOworICAgICAgICByZWFkU3RhdGVfLmxhc3REaXNwYXRjaFBvc18gPSAwOworCisgICAgICAgIGlmIChyZWFkU3RhdGVfLmJ1ZmZlckxlbl8gPT0gMCkgeworICAgICAgICAgIC8vIFJlYWNoZWQgZW5kIG9mIGZpbGUuCisgICAgICAgICAgaWYgKHJlYWRUaW1lb3V0XyA8IGR1ciEiaG5zZWNzIigwKSkgeworICAgICAgICAgICAgLy8gVGFpbGluZyBtb2RlLCBzbGVlcCBmb3IgdGhlIHNwZWNpZmllZCBkdXJhdGlvbiBhbmQgdHJ5IGFnYWluLgorICAgICAgICAgICAgVGhyZWFkLnNsZWVwKC1yZWFkVGltZW91dF8pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfSBlbHNlIGlmIChyZWFkVGltZW91dF8gPT0gZHVyISJobnNlY3MiKDApIHx8IHRpbWVvdXRFeHBpcmVkKSB7CisgICAgICAgICAgICAvLyBFaXRoZXIgbm8gdGltZW91dCBzZXQsIG9yIGl0IGhhcyBhbHJlYWR5IGV4cGlyZWQuCisgICAgICAgICAgICByZWFkU3RhdGVfLnJlc2V0U3RhdGUoMCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVGltZW91dCBtb2RlLCBzbGVlcCBmb3IgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZSBhbmQgcmV0cnkuCisgICAgICAgICAgICBUaHJlYWQuc2xlZXAocmVhZFRpbWVvdXRfKTsKKyAgICAgICAgICAgIHRpbWVvdXRFeHBpcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBBdHRlbXB0IHRvIHJlYWQgYW4gZXZlbnQgZnJvbSB0aGUgYnVmZmVyLgorICAgICAgd2hpbGUgKHJlYWRTdGF0ZV8uYnVmZmVyUG9zXyA8IHJlYWRTdGF0ZV8uYnVmZmVyTGVuXykgeworICAgICAgICBpZiAocmVhZFN0YXRlXy5yZWFkaW5nU2l6ZV8pIHsKKyAgICAgICAgICBpZiAocmVhZFN0YXRlXy5ldmVudFNpemVCdWZmUG9zXyA9PSAwKSB7CisgICAgICAgICAgICBpZiAoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclBvc18pL2NodW5rU2l6ZV8gIT0KKyAgICAgICAgICAgICAgKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQb3NfICsgMykvY2h1bmtTaXplXykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlYWRTdGF0ZV8uYnVmZmVyUG9zXysrOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZfW3JlYWRTdGF0ZV8uZXZlbnRTaXplQnVmZlBvc18rK10gPQorICAgICAgICAgICAgcmVhZEJ1ZmZlcl9bcmVhZFN0YXRlXy5idWZmZXJQb3NfKytdOworCisgICAgICAgICAgaWYgKHJlYWRTdGF0ZV8uZXZlbnRTaXplQnVmZlBvc18gPT0gNCkgeworICAgICAgICAgICAgYXV0byBzaXplID0gKGNhc3QodWludFtdKXJlYWRTdGF0ZV8uZXZlbnRTaXplQnVmZl8pWzBdOworCisgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgIC8vIFRoaXMgaXMgcGFydCBvZiB0aGUgemVybyBwYWRkaW5nIGJldHdlZW4gY2h1bmtzLgorICAgICAgICAgICAgICByZWFkU3RhdGVfLnJlc2V0U3RhdGUocmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQb3NfKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGdvdCBhIHZhbGlkIGV2ZW50CisgICAgICAgICAgICByZWFkU3RhdGVfLnJlYWRpbmdTaXplXyA9IGZhbHNlOworICAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudExlbl8gPSBzaXplOworICAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudFBvc18gPSAwOworCisgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgZXZlbnQgaXMgY29ycnVwdGVkIGFuZCBwZXJmb3JtIHJlY292ZXJ5IGlmIHJlcXVpcmVkCisgICAgICAgICAgICBpZiAoaXNFdmVudENvcnJ1cHRlZCgpKSB7CisgICAgICAgICAgICAgIHBlcmZvcm1SZWNvdmVyeSgpOworICAgICAgICAgICAgICAvLyBzdGFydCBmcm9tIHRoZSB0b3AKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmICghcmVhZFN0YXRlXy5ldmVudF8pIHsKKyAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfID0gbmV3IHVieXRlW3JlYWRTdGF0ZV8uZXZlbnRMZW5fXTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyB0YWtlIGVpdGhlciB0aGUgZW50aXJlIGV2ZW50IG9yIHRoZSByZW1haW5pbmcgYnl0ZXMgaW4gdGhlIGJ1ZmZlcgorICAgICAgICAgIGF1dG8gcmVjbGFpbUJ1ZmZlciA9IG1pbihyZWFkU3RhdGVfLmJ1ZmZlckxlbl8gLSByZWFkU3RhdGVfLmJ1ZmZlclBvc18sCisgICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50TGVuXyAtIHJlYWRTdGF0ZV8uZXZlbnRQb3NfKTsKKworICAgICAgICAgIC8vIGNvcHkgZGF0YSBmcm9tIHJlYWQgYnVmZmVyIGludG8gZXZlbnQgYnVmZmVyCisgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF9bCisgICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50UG9zXyAuLiByZWFkU3RhdGVfLmV2ZW50UG9zXyArIHJlY2xhaW1CdWZmZXIKKyAgICAgICAgICBdID0gcmVhZEJ1ZmZlcl9bCisgICAgICAgICAgICByZWFkU3RhdGVfLmJ1ZmZlclBvc18gLi4gcmVhZFN0YXRlXy5idWZmZXJQb3NfICsgcmVjbGFpbUJ1ZmZlcgorICAgICAgICAgIF07CisKKyAgICAgICAgICAvLyBpbmNyZW1lbnQgcG9zaXRpb24gcHRycworICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRQb3NfICs9IHJlY2xhaW1CdWZmZXI7CisgICAgICAgICAgcmVhZFN0YXRlXy5idWZmZXJQb3NfICs9IHJlY2xhaW1CdWZmZXI7CisKKyAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgZXZlbnQgaGFzIGJlZW4gcmVhZCBpbiBmdWxsCisgICAgICAgICAgaWYgKHJlYWRTdGF0ZV8uZXZlbnRQb3NfID09IHJlYWRTdGF0ZV8uZXZlbnRMZW5fKSB7CisgICAgICAgICAgICAvLyBSZXNldCB0aGUgcmVhZCBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBjb21wbGV0ZWQgZXZlbnQuCisgICAgICAgICAgICBhdXRvIGNvbXBsZXRlRXZlbnQgPSByZWFkU3RhdGVfLmV2ZW50XzsKKyAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfID0gbnVsbDsKKyAgICAgICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRTdGF0ZShyZWFkU3RhdGVfLmJ1ZmZlclBvc18pOworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlRXZlbnQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgYm9vbCBpc0V2ZW50Q29ycnVwdGVkKCkgeworICAgIGlmICgobWF4RXZlbnRTaXplXyA+IDApICYmIChyZWFkU3RhdGVfLmV2ZW50TGVuXyA+IG1heEV2ZW50U2l6ZV8pKSB7CisgICAgICAvLyBFdmVudCBzaXplIGlzIGxhcmdlciB0aGFuIHVzZXItc3BlZmljaWVkIG1heC1ldmVudCBzaXplCisgICAgICBsb2dFcnJvcigiQ29ycnVwdCBldmVudCByZWFkOiBFdmVudCBzaXplICglcykgZ3JlYXRlciB0aGFuIG1heCAiIH4KKyAgICAgICAgImV2ZW50IHNpemUgKCVzKSIsIHJlYWRTdGF0ZV8uZXZlbnRMZW5fLCBtYXhFdmVudFNpemVfKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocmVhZFN0YXRlXy5ldmVudExlbl8gPiBjaHVua1NpemVfKSB7CisgICAgICAvLyBFdmVudCBzaXplIGlzIGxhcmdlciB0aGFuIGNodW5rIHNpemUKKyAgICAgIGxvZ0Vycm9yKCJDb3JydXB0IGV2ZW50IHJlYWQ6IEV2ZW50IHNpemUgKCVzKSBncmVhdGVyIHRoYW4gY2h1bmsgIiB+CisgICAgICAgICJzaXplICglcykiLCByZWFkU3RhdGVfLmV2ZW50TGVuXywgY2h1bmtTaXplXyk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCgob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUG9zXyAtIEV2ZW50U2l6ZS5zaXplb2YpIC8gY2h1bmtTaXplXykgIT0KKyAgICAgICgob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUG9zXyArIHJlYWRTdGF0ZV8uZXZlbnRMZW5fIC0gRXZlbnRTaXplLnNpemVvZikgLyBjaHVua1NpemVfKSkKKyAgICB7CisgICAgICAvLyBTaXplIGluZGljYXRlcyB0aGF0IGV2ZW50IGNyb3NzZXMgY2h1bmsgYm91bmRhcnkKKyAgICAgIGxvZ0Vycm9yKCJSZWFkIGNvcnJ1cHQgZXZlbnQuIEV2ZW50IGNyb3NzZXMgY2h1bmsgYm91bmRhcnkuICIgfgorICAgICAgICAiRXZlbnQgc2l6ZTogJXMuIE9mZnNldDogJXMiLCByZWFkU3RhdGVfLmV2ZW50TGVuXywKKyAgICAgICAgKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclBvc18gKyBFdmVudFNpemUuc2l6ZW9mKQorICAgICAgKTsKKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdm9pZCBwZXJmb3JtUmVjb3ZlcnkoKSB7CisgICAgLy8gcGVyZm9ybSBzb21lIGtpY2thc3MgcmVjb3ZlcnkKKyAgICBhdXRvIGN1ckNodW5rID0gZ2V0Q3VyQ2h1bmsoKTsKKyAgICBpZiAobGFzdEJhZENodW5rXyA9PSBjdXJDaHVuaykgeworICAgICAgbnVtQ29ycnVwdGVkRXZlbnRzSW5DaHVua18rKzsKKyAgICB9IGVsc2UgeworICAgICAgbGFzdEJhZENodW5rXyA9IGN1ckNodW5rOworICAgICAgbnVtQ29ycnVwdGVkRXZlbnRzSW5DaHVua18gPSAxOworICAgIH0KKworICAgIGlmIChudW1Db3JydXB0ZWRFdmVudHNJbkNodW5rXyA8IG1heENvcnJ1cHRlZEV2ZW50c18pIHsKKyAgICAgIC8vIG1heWJlIHRoZXJlIHdhcyBhbiBlcnJvciBpbiByZWFkaW5nIHRoZSBmaWxlIGZyb20gZGlzaworICAgICAgLy8gc2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIGNodW5rIGFuZCB0cnkgYWdhaW4KKyAgICAgIHNlZWtUb0NodW5rKGN1ckNodW5rKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gSnVzdCBza2lwIGFoZWFkIHRvIHRoZSBuZXh0IGNodW5rIGlmIHdlIG5vdCBhbHJlYWR5IGF0IHRoZSBsYXN0IGNodW5rLgorICAgICAgaWYgKGN1ckNodW5rICE9IChnZXROdW1DaHVua3MoKSAtIDEpKSB7CisgICAgICAgIHNlZWtUb0NodW5rKGN1ckNodW5rICsgMSk7CisgICAgICB9IGVsc2UgaWYgKHJlYWRUaW1lb3V0XyA8IGR1ciEiaG5zZWNzIigwKSkgeworICAgICAgICAvLyBXZSBhcmUgaW4gdGFpbGluZyBtb2RlLCB3YWl0IHVudGlsIHRoZXJlIGlzIGVub3VnaCBkYXRhIHRvIHN0YXJ0CisgICAgICAgIC8vIHRoZSBuZXh0IGNodW5rLgorICAgICAgICB3aGlsZShjdXJDaHVuayA9PSAoZ2V0TnVtQ2h1bmtzKCkgLSAxKSkgeworICAgICAgICAgIFRocmVhZC5zbGVlcChjb3JydXB0ZWRFdmVudFNsZWVwRHVyYXRpb25fKTsKKyAgICAgICAgfQorICAgICAgICBzZWVrVG9DaHVuayhjdXJDaHVuayArIDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUHJldHR5IGhvc2VkIGF0IHRoaXMgc3RhZ2UsIHJld2luZCB0aGUgZmlsZSBiYWNrIHRvIHRoZSBsYXN0CisgICAgICAgIC8vIHN1Y2Nlc3NmdWwgcG9pbnQgYW5kIHB1bnQgb24gdGhlIGVycm9yLgorICAgICAgICByZWFkU3RhdGVfLnJlc2V0U3RhdGUocmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQb3NfKTsKKyAgICAgICAgY3VycmVudEV2ZW50XyA9IG51bGw7CisgICAgICAgIGN1cnJlbnRFdmVudFBvc18gPSAwOworCisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJGaWxlIGNvcnJ1cHRlZCBhdCBvZmZzZXQ6ICIgfgorICAgICAgICAgIHRvIXN0cmluZyhvZmZzZXRfICsgcmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQb3NfKSwKKyAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQ09SUlVQVEVEX0RBVEEpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0cmluZyBwYXRoXzsKKyAgRmlsZSBmaWxlXzsKKyAgYm9vbCBpc09wZW5fOworICBsb25nIG9mZnNldF87CisgIHVieXRlW10gY3VycmVudEV2ZW50XzsKKyAgc2l6ZV90IGN1cnJlbnRFdmVudFBvc187CisgIHVsb25nIGNodW5rU2l6ZV87CisgIER1cmF0aW9uIHJlYWRUaW1lb3V0XzsKKyAgc2l6ZV90IG1heEV2ZW50U2l6ZV87CisKKyAgLy8gUmVhZCBidWZmZXIg4oCTIGxhemlseSBhbGxvY2F0ZWQgb24gdGhlIGZpcnN0IHJlYWQoKS4KKyAgdWJ5dGVbXSByZWFkQnVmZmVyXzsKKyAgc2l6ZV90IHJlYWRCdWZmZXJTaXplXzsKKworICBzdGF0aWMgc3RydWN0IFJlYWRTdGF0ZSB7CisgICAgdWJ5dGVbXSBldmVudF87CisgICAgc2l6ZV90IGV2ZW50TGVuXzsKKyAgICBzaXplX3QgZXZlbnRQb3NfOworCisgICAgLy8ga2VlcCB0cmFjayBvZiBldmVudCBzaXplCisgICAgdWJ5dGVbNF0gZXZlbnRTaXplQnVmZl87CisgICAgdWJ5dGUgZXZlbnRTaXplQnVmZlBvc187CisgICAgYm9vbCByZWFkaW5nU2l6ZV8gPSB0cnVlOworCisgICAgLy8gcmVhZCBidWZmZXIgdmFyaWFibGVzCisgICAgc2l6ZV90IGJ1ZmZlclBvc187CisgICAgc2l6ZV90IGJ1ZmZlckxlbl87CisKKyAgICAvLyBsYXN0IHN1Y2Nlc3NmdWwgZGlzcGF0Y2ggcG9pbnQKKyAgICBzaXplX3QgbGFzdERpc3BhdGNoUG9zXzsKKworICAgIHZvaWQgcmVzZXRTdGF0ZShzaXplX3QgbGFzdERpc3BhdGNoUG9zKSB7CisgICAgICByZWFkaW5nU2l6ZV8gPSB0cnVlOworICAgICAgZXZlbnRTaXplQnVmZlBvc18gPSAwOworICAgICAgbGFzdERpc3BhdGNoUG9zXyA9IGxhc3REaXNwYXRjaFBvczsKKyAgICB9CisKKyAgICB2b2lkIHJlc2V0QWxsVmFsdWVzKCkgeworICAgICAgcmVzZXRTdGF0ZSgwKTsKKyAgICAgIGJ1ZmZlclBvc18gPSAwOworICAgICAgYnVmZmVyTGVuXyA9IDA7CisgICAgICBldmVudF8gPSBudWxsOworICAgIH0KKyAgfQorICBSZWFkU3RhdGUgcmVhZFN0YXRlXzsKKworICB1bG9uZyBsYXN0QmFkQ2h1bmtfOworICB1aW50IG1heENvcnJ1cHRlZEV2ZW50c187CisgIHVpbnQgbnVtQ29ycnVwdGVkRXZlbnRzSW5DaHVua187CisgIER1cmF0aW9uIGNvcnJ1cHRlZEV2ZW50U2xlZXBEdXJhdGlvbl87Cit9CisKKy8qKgorICogQSB0cmFuc3BvcnQgdXNlZCB0byB3cml0ZSBsb2cgZmlsZXMuIEl0IGNhbiBuZXZlciBiZSByZWFkIGZyb20sIGNhbGxpbmcKKyAqIHJlYWQoKSB0aHJvd3MuCisgKgorICogQ29udHJhcnkgdG8gdGhlIEMrKyBkZXNpZ24sIGV4cGxpY2l0bHkgb3BlbmluZyB0aGUgdHJhbnNwb3J0L2ZpbGUgYmVmb3JlCisgKiB1c2luZyBpcyBuZWNlc3NhcnkgdG8gYWxsb3cgbWFudWFsbHkgY2xvc2luZyB0aGUgZmlsZSB3aXRob3V0IHJlbHlpbmcgb24gdGhlCisgKiBvYmplY3QgbGlmZXRpbWUuCisgKi8KK2ZpbmFsIGNsYXNzIFRGaWxlV3JpdGVyVHJhbnNwb3J0IDogVEJhc2VUcmFuc3BvcnQgeworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyBmaWxlIHdyaXRlciB0cmFuc3BvcnQuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBwYXRoID0gUGF0aCBvZiB0aGUgZmlsZSB0byBvcHBlcmF0ZSBvbi4KKyAgICovCisgIHRoaXMoc3RyaW5nIHBhdGgpIHsKKyAgICBwYXRoXyA9IHBhdGg7CisKKyAgICBjaHVua1NpemVfID0gREVGQVVMVF9DSFVOS19TSVpFOworICAgIGV2ZW50QnVmZmVyU2l6ZV8gPSBERUZBVUxUX0VWRU5UX0JVRkZFUl9TSVpFOworICAgIGlvRXJyb3JTbGVlcER1cmF0aW9uID0gREVGQVVMVF9JT19FUlJPUl9TTEVFUF9EVVJBVElPTjsKKyAgICBtYXhGbHVzaEJ5dGVzXyA9IERFRkFVTFRfTUFYX0ZMVVNIX0JZVEVTOworICAgIG1heEZsdXNoSW50ZXJ2YWxfID0gREVGQVVMVF9NQVhfRkxVU0hfSU5URVJWQUw7CisgIH0KKworICBvdmVycmlkZSBib29sIGlzT3BlbigpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIGlzT3Blbl87CisgIH0KKworICAvKioKKyAgICogQSBmaWxlIHdyaXRlciB0cmFuc3BvcnQgY2FuIG5ldmVyIGJlIHJlYWQgZnJvbS4KKyAgICovCisgIG92ZXJyaWRlIGJvb2wgcGVlaygpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBvdmVycmlkZSB2b2lkIG9wZW4oKSB7CisgICAgaWYgKGlzT3BlbikgcmV0dXJuOworCisgICAgd3JpdGVyVGhyZWFkXyA9IHNwYXduKAorICAgICAgJndyaXRlclRocmVhZCwKKyAgICAgIHBhdGhfLAorICAgICAgY2h1bmtTaXplXywKKyAgICAgIG1heEZsdXNoQnl0ZXNfLAorICAgICAgbWF4Rmx1c2hJbnRlcnZhbF8sCisgICAgICBpb0Vycm9yU2xlZXBEdXJhdGlvbl8KKyAgICApOworICAgIHNldE1heE1haWxib3hTaXplKHdyaXRlclRocmVhZF8sIGV2ZW50QnVmZmVyU2l6ZV8sIE9uQ3Jvd2RpbmcuYmxvY2spOworICAgIGlzT3Blbl8gPSB0cnVlOworICB9CisKKyAgLyoqCisgICAqIENsb3NlcyB0aGUgdHJhbnNwb3J0LCBpLmUuIHRoZSB1bmRlcmx5aW5nIGZpbGUgYW5kIHRoZSB3cml0ZXIgdGhyZWFkLgorICAgKi8KKyAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAoIWlzT3BlbikgcmV0dXJuOworCisgICAgc2VuZCh3cml0ZXJUaHJlYWRfLCBTaHV0ZG93bk1lc3NhZ2UoKSwgdGhpc1RpZCk7CisgICAgcmVjZWl2ZSgoU2h1dGRvd25NZXNzYWdlIG1zZywgVGlkIHRpZCl7fSk7CisgICAgaXNPcGVuXyA9IGZhbHNlOworICB9CisKKyAgLyoqCisgICAqIEVucXVldWVzIHRoZSBwYXNzZWQgc2xpY2Ugb2YgZGF0YSBmb3Igd3JpdGluZyBhbmQgaW1tZWRpYXRlbHkgcmV0dXJucy4KKyAgICogd3JpdGUoKSBvbmx5IGJsb2NrcyBpZiB0aGUgZXZlbnQgYnVmZmVyIGhhcyBiZWVuIGV4aGF1c3RlZC4KKyAgICoKKyAgICogVGhlIHRyYW5zcG9ydCBtdXN0IGJlIG9wZW4gd2hlbiBjYWxsaW5nIHRoaXMuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBidWYgPSBTbGljZSBvZiBkYXRhIHRvIHdyaXRlLgorICAgKi8KKyAgb3ZlcnJpZGUgdm9pZCB3cml0ZShpbiB1Ynl0ZVtdIGJ1ZikgeworICAgIGVuZm9yY2UoaXNPcGVuLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3Qgd3JpdGUgdG8gbm9uLW9wZW4gZmlsZS4iLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4pKTsKKworICAgIGlmIChidWYuZW1wdHkpIHsKKyAgICAgIGxvZ0Vycm9yKCJDYW5ub3Qgd3JpdGUgZW1wdHkgZXZlbnQsIHNraXBwaW5nLiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gbWF4U2l6ZSA9IGNodW5rU2l6ZSAtIEV2ZW50U2l6ZS5zaXplb2Y7CisgICAgZW5mb3JjZShidWYubGVuZ3RoIDw9IG1heFNpemUsIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCB3cml0ZSBtb3JlIHRoYW4gIiB+IHRvIXN0cmluZyhtYXhTaXplKSB+CisgICAgICAiYnl0ZXMgYXQgb25jZSBkdWUgdG8gY2h1bmsgc2l6ZS4iKSk7CisKKyAgICBzZW5kKHdyaXRlclRocmVhZF8sIGJ1Zi5pZHVwKTsKKyAgfQorCisgIC8qKgorICAgKiBGbHVzaGVzIGFueSBwZW5kaW5nIGRhdGEgdG8gYmUgd3JpdHRlbi4KKyAgICoKKyAgICogVGhlIHRyYW5zcG9ydCBtdXN0IGJlIG9wZW4gd2hlbiBjYWxsaW5nIHRoaXMuCisgICAqCisgICAqIFRocm93czogVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAqLworICBvdmVycmlkZSB2b2lkIGZsdXNoKCkgeworICAgIGVuZm9yY2UoaXNPcGVuLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3QgZmx1c2ggZmlsZSBpZiBub3Qgb3Blbi4iLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4pKTsKKworICAgIHNlbmQod3JpdGVyVGhyZWFkXywgRmx1c2hNZXNzYWdlKCksIHRoaXNUaWQpOworICAgIHJlY2VpdmUoKEZsdXNoTWVzc2FnZSBtc2csIFRpZCB0aWQpe30pOworICB9CisKKyAgLyoqCisgICAqIFRoZSBzaXplIG9mIHRoZSBjaHVua3MgdGhlIGZpbGUgaXMgZGl2aWRlZCBpbnRvLCBpbiBieXRlcy4KKyAgICoKKyAgICogQSBzaW5nbGUgZXZlbnQgKHdyaXRlIGNhbGwpIG5ldmVyIHNwYW5zIG11bHRpcGxlIGNodW5rcyDigJMgdGhpcworICAgKiBlZmZlY3RpdmVseSBsaW1pdHMgdGhlIGV2ZW50IHNpemUgdG8gY2h1bmtTaXplIC0gRXZlbnRTaXplLnNpemVvZi4KKyAgICovCisgIHVsb25nIGNodW5rU2l6ZSgpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIGNodW5rU2l6ZV87CisgIH0KKworICAvLy8gZGl0dG8KKyAgdm9pZCBjaHVua1NpemUodWxvbmcgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgZW5mb3JjZSghaXNPcGVuLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3Qgc2V0IGNodW5rIHNpemUgYWZ0ZXIgVEZpbGVXcml0ZXJUcmFuc3BvcnQgaGFzIGJlZW4gb3BlbmVkLiIpKTsKKyAgICBjaHVua1NpemVfID0gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHdyaXRlKCkgY2FsbHMgYnVmZmVyZWQsIG9yIHplcm8gZm9yIG5vIGxpbWl0LgorICAgKgorICAgKiBJZiB0aGUgYnVmZmVyIGlzIGV4aGF1c3RlZCwgd3JpdGUoKSB3aWxsIGJsb2NrIHVudGlsIHNwYWNlIGJlY29tZXMKKyAgICogYXZhaWxhYmxlLgorICAgKi8KKyAgc2l6ZV90IGV2ZW50QnVmZmVyU2l6ZSgpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIGV2ZW50QnVmZmVyU2l6ZV87CisgIH0KKworICAvLy8gZGl0dG8KKyAgdm9pZCBldmVudEJ1ZmZlclNpemUoc2l6ZV90IHZhbHVlKSBAcHJvcGVydHkgeworICAgIGV2ZW50QnVmZmVyU2l6ZV8gPSB2YWx1ZTsKKyAgICBpZiAoaXNPcGVuKSB7CisgICAgICBzZXRNYXhNYWlsYm94U2l6ZSh3cml0ZXJUaHJlYWRfLCB2YWx1ZSwgT25Dcm93ZGluZy50aHJvd0V4Y2VwdGlvbik7CisgICAgfQorICB9CisKKyAgLy8vIGRpdHRvCisgIGVudW0gREVGQVVMVF9FVkVOVF9CVUZGRVJfU0laRSA9IDEwXzAwMDsKKworICAvKioKKyAgICogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgYnVmZmVyZWQgYmVmb3JlIHdyaXRpbmcgYW5kIGZsdXNoaW5nIHRoZSBmaWxlCisgICAqIHRvIGRpc2suCisgICAqCisgICAqIEN1cnJlbnRseSBjYW5ub3QgYmUgc2V0IGFmdGVyIHRoZSBmaXJzdCBjYWxsIHRvIHdyaXRlKCkuCisgICAqLworICBzaXplX3QgbWF4Rmx1c2hCeXRlcygpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIG1heEZsdXNoQnl0ZXNfOworICB9CisKKyAgLy8vIGRpdHRvCisgIHZvaWQgbWF4Rmx1c2hCeXRlcyhzaXplX3QgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgbWF4Rmx1c2hCeXRlc18gPSB2YWx1ZTsKKyAgICBpZiAoaXNPcGVuKSB7CisgICAgICBzZW5kKHdyaXRlclRocmVhZF8sIEZsdXNoQnl0ZXNNZXNzYWdlKHZhbHVlKSk7CisgICAgfQorICB9CisKKyAgLy8vIGRpdHRvCisgIGVudW0gREVGQVVMVF9NQVhfRkxVU0hfQllURVMgPSAxMDAwICogMTAyNDsKKworICAvKioKKyAgICogTWF4aW11bSBpbnRlcnZhbCBiZXR3ZWVuIGZsdXNoaW5nIHRoZSBmaWxlIHRvIGRpc2suCisgICAqCisgICAqIEN1cnJlbmx0eSBjYW5ub3QgYmUgc2V0IGFmdGVyIHRoZSBmaXJzdCBjYWxsIHRvIHdyaXRlKCkuCisgICAqLworICBEdXJhdGlvbiBtYXhGbHVzaEludGVydmFsKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gbWF4Rmx1c2hJbnRlcnZhbF87CisgIH0KKworICAvLy8gZGl0dG8KKyAgdm9pZCBtYXhGbHVzaEludGVydmFsKER1cmF0aW9uIHZhbHVlKSBAcHJvcGVydHkgeworICAgIG1heEZsdXNoSW50ZXJ2YWxfID0gdmFsdWU7CisgICAgaWYgKGlzT3BlbikgeworICAgICAgc2VuZCh3cml0ZXJUaHJlYWRfLCBGbHVzaEludGVydmFsTWVzc2FnZSh2YWx1ZSkpOworICAgIH0KKyAgfQorCisgIC8vLyBkaXR0bworICBlbnVtIERFRkFVTFRfTUFYX0ZMVVNIX0lOVEVSVkFMID0gZHVyISJzZWNvbmRzIigzKTsKKworICAvKioKKyAgICogV2hlbiB0aGUgd3JpdGVyIHRocmVhZCBlbmNvdW50ZXJlcyBhbiBJL08gZXJyb3IsIGl0IGdvZXMgcGF1c2VzIGZvciBhCisgICAqIHNob3J0IHRpbWUgYmVmb3JlIHRyeWluZyB0byByZW9wZW4gdGhlIG91dHB1dCBmaWxlLiBUaGlzIGNvbnRyb2xzIHRoZQorICAgKiBzbGVlcCBkdXJhdGlvbi4KKyAgICovCisgIER1cmF0aW9uIGlvRXJyb3JTbGVlcER1cmF0aW9uKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gaW9FcnJvclNsZWVwRHVyYXRpb25fOworICB9CisKKyAgLy8vIGRpdHRvCisgIHZvaWQgaW9FcnJvclNsZWVwRHVyYXRpb24oRHVyYXRpb24gdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgaW9FcnJvclNsZWVwRHVyYXRpb25fID0gdmFsdWU7CisgICAgaWYgKGlzT3BlbikgeworICAgICAgc2VuZCh3cml0ZXJUaHJlYWRfLCBGbHVzaEludGVydmFsTWVzc2FnZSh2YWx1ZSkpOworICAgIH0KKyAgfQorCisgIC8vLyBkaXR0bworICBlbnVtIERFRkFVTFRfSU9fRVJST1JfU0xFRVBfRFVSQVRJT04gPSBkdXIhIm1zZWNzIig1MDApOworCitwcml2YXRlOgorICBzdHJpbmcgcGF0aF87CisgIHVsb25nIGNodW5rU2l6ZV87CisgIHNpemVfdCBldmVudEJ1ZmZlclNpemVfOworICBEdXJhdGlvbiBpb0Vycm9yU2xlZXBEdXJhdGlvbl87CisgIHNpemVfdCBtYXhGbHVzaEJ5dGVzXzsKKyAgRHVyYXRpb24gbWF4Rmx1c2hJbnRlcnZhbF87CisgIGJvb2wgaXNPcGVuXzsKKyAgVGlkIHdyaXRlclRocmVhZF87Cit9CisKK3ByaXZhdGUgeworICAvLyBTaWduYWxzIHRoYXQgdGhlIGZpbGUgc2hvdWxkIGJlIGZsdXNoZWQgb24gZGlzay4gU2VudCB0byB0aGUgd3JpdGVyCisgIC8vIHRocmVhZCBhbmQgc2VudCBiYWNrIGFsb25nIHdpdGggdGhlIHRpZCBmb3IgY29uZmlybWF0aW9uLgorICBzdHJ1Y3QgRmx1c2hNZXNzYWdlIHt9CisKKyAgLy8gU2lnbmFscyB0aGF0IHRoZSB3cml0ZXIgdGhyZWFkIHNob3VsZCBjbG9zZSB0aGUgZmlsZSBhbmQgc2h1dCBkb3duLiBTZW50CisgIC8vIHRvIHRoZSB3cml0ZXIgdGhyZWFkIGFuZCBzZW50IGJhY2sgYWxvbmcgd2l0aCB0aGUgdGlkIGZvciBjb25maXJtYXRpb24uCisgIHN0cnVjdCBTaHV0ZG93bk1lc3NhZ2Uge30KKworICBzdHJ1Y3QgRmx1c2hCeXRlc01lc3NhZ2UgeworICAgIHNpemVfdCB2YWx1ZTsKKyAgfQorCisgIHN0cnVjdCBGbHVzaEludGVydmFsTWVzc2FnZSB7CisgICAgRHVyYXRpb24gdmFsdWU7CisgIH0KKworICBzdHJ1Y3QgSW9FcnJvclNsZWVwRHVyYXRpb25NZXNzYWdlIHsKKyAgICBEdXJhdGlvbiB2YWx1ZTsKKyAgfQorCisgIHZvaWQgd3JpdGVyVGhyZWFkKAorICAgIHN0cmluZyBwYXRoLAorICAgIHVsb25nIGNodW5rU2l6ZSwKKyAgICBzaXplX3QgbWF4Rmx1c2hCeXRlcywKKyAgICBEdXJhdGlvbiBtYXhGbHVzaEludGVydmFsLAorICAgIER1cmF0aW9uIGlvRXJyb3JTbGVlcER1cmF0aW9uCisgICkgeworICAgIGJvb2wgZXJyb3JPcGVuaW5nOworICAgIEZpbGUgZmlsZTsKKyAgICB1bG9uZyBvZmZzZXQ7CisgICAgdHJ5IHsKKyAgICAgIC8vIE9wZW4gZmlsZSBpbiBhcHBlbmRpbmcgYW5kIGJpbmFyeSBtb2RlLgorICAgICAgZmlsZSA9IEZpbGUocGF0aCwgImFiIik7CisgICAgICBvZmZzZXQgPSBmaWxlLnRlbGwoKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgbG9nRXJyb3IoIkVycm9yIG9uIG9wZW5pbmcgb3V0cHV0IGZpbGUgaW4gd3JpdGVyIHRocmVhZDogJXMiLCBlKTsKKyAgICAgIGVycm9yT3BlbmluZyA9IHRydWU7CisgICAgfQorCisgICAgYXV0byBmbHVzaFRpbWVyID0gU3RvcFdhdGNoKEF1dG9TdGFydC55ZXMpOworICAgIHNpemVfdCB1bmZsdXNoZWRCeXRlQ291bnQ7CisKKyAgICBUaWQgc2h1dGRvd25SZXF1ZXN0VGlkOworICAgIGJvb2wgc2h1dGRvd25SZXF1ZXN0ZWQ7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmIChzaHV0ZG93blJlcXVlc3RlZCkgYnJlYWs7CisKKyAgICAgIGJvb2wgZm9yY2VGbHVzaDsKKyAgICAgIFRpZCBmbHVzaFJlcXVlc3RUaWQ7CisgICAgICByZWNlaXZlVGltZW91dChtYXgoZHVyISJobnNlY3MiKDApLCBtYXhGbHVzaEludGVydmFsIC0gZmx1c2hUaW1lci5wZWVrKCkpLAorICAgICAgICAoaW1tdXRhYmxlKHVieXRlKVtdIGRhdGEpIHsKKyAgICAgICAgICB3aGlsZSAoZXJyb3JPcGVuaW5nKSB7CisgICAgICAgICAgICBsb2dFcnJvcigiV3JpdGVyIHRocmVhZCBnb2luZyB0byBzbGVlcCBmb3IgJXMgwrVzIGR1ZSB0byBJTyBlcnJvcnMiLAorICAgICAgICAgICAgICBpb0Vycm9yU2xlZXBEdXJhdGlvbi50b3RhbCEidXNlY3MiKTsKKworICAgICAgICAgICAgLy8gU2xlZXAgZm9yIGlvRXJyb3JTbGVlcER1cmF0aW9uLCBiZWluZyByZWFkeSB0byBiZSBpbnRlcnJ1cHRlZAorICAgICAgICAgICAgLy8gYnkgc2h1dGRvd24gcmVxdWVzdHMuCisgICAgICAgICAgICBhdXRvIHRpbWVkT3V0ID0gcmVjZWl2ZVRpbWVvdXQoaW9FcnJvclNsZWVwRHVyYXRpb24sCisgICAgICAgICAgICAgIChTaHV0ZG93bk1lc3NhZ2UgbXNnLCBUaWQgdGlkKXsgc2h1dGRvd25SZXF1ZXN0VGlkID0gdGlkOyB9KTsKKyAgICAgICAgICAgIGlmICghdGltZWRPdXQpIHsKKyAgICAgICAgICAgICAgLy8gV2UgZ290IGEgc2h1dGRvd24gcmVxdWVzdCwganVzdCBkcm9wIGFsbCBldmVudHMgYW5kIGV4aXQgdGhlCisgICAgICAgICAgICAgIC8vIG1haW4gbG9vcCBhcyB0byBub3QgYmxvY2sgYXBwbGljYXRpb24gc2h1dGRvd24gd2l0aCBvdXIgdHJpZXMKKyAgICAgICAgICAgICAgLy8gd2hpY2ggd2UgbXVzdCBhc3N1bWUgdG8gZmFpbC4KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIGZpbGUgPSBGaWxlKHBhdGgsICJhYiIpOworICAgICAgICAgICAgICB1bmZsdXNoZWRCeXRlQ291bnQgPSAwOworICAgICAgICAgICAgICBlcnJvck9wZW5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgbG9nRXJyb3IoIk91dHB1dCBmaWxlICVzIHJlb3BlbmVkIGR1cmluZyB3cml0ZXIgdGhyZWFkIGVycm9yICIgfgorICAgICAgICAgICAgICAgICJyZWNvdmVyeSIsIHBhdGgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgbG9nRXJyb3IoIlVuYWJsZSB0byByZW9wZW4gb3V0cHV0IGZpbGUgJXMgZHVyaW5nIHdyaXRlciAiIH4KKyAgICAgICAgICAgICAgICAidGhyZWFkIGVycm9yIHJlY292ZXJ5IiwgcGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBldmVudCBkb2VzIG5vdCBjcm9zcyB0aGUgY2h1bmsgYm91bmRhcnkgYnkgd3JpdGluZworICAgICAgICAgIC8vIGEgcGFkZGluZyBjb25zaXN0aW5nIG9mIHplcm9lcyBpZiBpdCB3b3VsZC4KKyAgICAgICAgICBhdXRvIGNodW5rMSA9IG9mZnNldCAvIGNodW5rU2l6ZTsKKyAgICAgICAgICBhdXRvIGNodW5rMiA9IChvZmZzZXQgKyBFdmVudFNpemUuc2l6ZW9mICsgZGF0YS5sZW5ndGggLSAxKSAvIGNodW5rU2l6ZTsKKworICAgICAgICAgIGlmIChjaHVuazEgIT0gY2h1bmsyKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBUaGUgQysrIGltcGxlbWVudGF0aW9uIHJlZmV0Y2hlcyB0aGUgb2Zmc2V0IGhlcmUgdG8gwrtrZWVwCisgICAgICAgICAgICAvLyBpbiBzeW5jwqsg4oCTIHdoeSB3b3VsZCB0aGlzIGJlIG5lZWRlZD8KKyAgICAgICAgICAgIGF1dG8gcGFkZGluZyA9IGNhc3Qoc2l6ZV90KQorICAgICAgICAgICAgICAoKCgob2Zmc2V0IC8gY2h1bmtTaXplKSArIDEpICogY2h1bmtTaXplKSAtIG9mZnNldCk7CisgICAgICAgICAgICBhdXRvIHplcm9lcyA9IG5ldyB1Ynl0ZVtwYWRkaW5nXTsKKyAgICAgICAgICAgIGZpbGUucmF3V3JpdGUoemVyb2VzKTsKKyAgICAgICAgICAgIHVuZmx1c2hlZEJ5dGVDb3VudCArPSBwYWRkaW5nOworICAgICAgICAgICAgb2Zmc2V0ICs9IHBhZGRpbmc7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gVE9ETzogMiBzeXNjYWxscyBoZXJlLCBpcyB0aGlzIGEgcHJvYmxlbSBwZXJmb3JtYW5jZS13aXNlPworICAgICAgICAgIC8vIFByb2JhYmx5IGFieXNtYWwgcGVyZm9ybWFuY2Ugb24gV2luZG93cyBkdWUgdG8gcmF3V3JpdGUKKyAgICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICB1aW50IGxlbiA9IGNhc3QodWludClkYXRhLmxlbmd0aDsKKyAgICAgICAgICBmaWxlLnJhd1dyaXRlKGNhc3QodWJ5dGVbXSkoJmxlbilbMC4uMV0pOworICAgICAgICAgIGZpbGUucmF3V3JpdGUoZGF0YSk7CisKKyAgICAgICAgICBhdXRvIGJ5dGVzV3JpdHRlbiA9IEV2ZW50U2l6ZS5zaXplb2YgKyBkYXRhLmxlbmd0aDsKKyAgICAgICAgICB1bmZsdXNoZWRCeXRlQ291bnQgKz0gYnl0ZXNXcml0dGVuOworICAgICAgICAgIG9mZnNldCArPSBieXRlc1dyaXR0ZW47CisgICAgICAgIH0sIChGbHVzaEJ5dGVzTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICBtYXhGbHVzaEJ5dGVzID0gbXNnLnZhbHVlOworICAgICAgICB9LCAoRmx1c2hJbnRlcnZhbE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgbWF4Rmx1c2hJbnRlcnZhbCA9IG1zZy52YWx1ZTsKKyAgICAgICAgfSwgKElvRXJyb3JTbGVlcER1cmF0aW9uTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICBpb0Vycm9yU2xlZXBEdXJhdGlvbiA9IG1zZy52YWx1ZTsKKyAgICAgICAgfSwgKEZsdXNoTWVzc2FnZSBtc2csIFRpZCB0aWQpIHsKKyAgICAgICAgICBmb3JjZUZsdXNoID0gdHJ1ZTsKKyAgICAgICAgICBmbHVzaFJlcXVlc3RUaWQgPSB0aWQ7CisgICAgICAgIH0sIChPd25lclRlcm1pbmF0ZWQgbXNnKSB7CisgICAgICAgICAgc2h1dGRvd25SZXF1ZXN0ZWQgPSB0cnVlOworICAgICAgICB9LCAoU2h1dGRvd25NZXNzYWdlIG1zZywgVGlkIHRpZCkgeworICAgICAgICAgIHNodXRkb3duUmVxdWVzdGVkID0gdHJ1ZTsKKyAgICAgICAgICBzaHV0ZG93blJlcXVlc3RUaWQgPSB0aWQ7CisgICAgICAgIH0KKyAgICAgICk7CisKKyAgICAgIGlmIChlcnJvck9wZW5pbmcpIGNvbnRpbnVlOworCisgICAgICBib29sIGZsdXNoOworICAgICAgaWYgKGZvcmNlRmx1c2ggfHwgc2h1dGRvd25SZXF1ZXN0ZWQgfHwgdW5mbHVzaGVkQnl0ZUNvdW50ID4gbWF4Rmx1c2hCeXRlcykgeworICAgICAgICBmbHVzaCA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGNhc3QoRHVyYXRpb24pZmx1c2hUaW1lci5wZWVrKCkgPiBtYXhGbHVzaEludGVydmFsKSB7CisgICAgICAgIGlmICh1bmZsdXNoZWRCeXRlQ291bnQgPT0gMCkgeworICAgICAgICAgIC8vIElmIHRoZSBmbHVzaCB0aW1lciBpcyBkdWUsIGJ1dCBubyBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4sIGRvbid0CisgICAgICAgICAgLy8gbmVlZGxlc3NseSBmc3luYywgYnV0IGRvIHJlc2V0IHRoZSB0aW1lci4KKyAgICAgICAgICBmbHVzaFRpbWVyLnJlc2V0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZmx1c2ggPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChmbHVzaCkgeworICAgICAgICBmaWxlLmZsdXNoKCk7CisgICAgICAgIGZsdXNoVGltZXIucmVzZXQoKTsKKyAgICAgICAgdW5mbHVzaGVkQnl0ZUNvdW50ID0gMDsKKyAgICAgICAgaWYgKGZvcmNlRmx1c2gpIHNlbmQoZmx1c2hSZXF1ZXN0VGlkLCBGbHVzaE1lc3NhZ2UoKSwgdGhpc1RpZCk7CisgICAgICB9CisgICAgfQorCisgICAgZmlsZS5jbG9zZSgpOworCisgICAgaWYgKHNodXRkb3duUmVxdWVzdFRpZCAhPSBUaWQuaW5pdCkgeworICAgICAgc2VuZChzaHV0ZG93blJlcXVlc3RUaWQsIFNodXRkb3duTWVzc2FnZSgpLCB0aGlzVGlkKTsKKyAgICB9CisgIH0KK30KKwordmVyc2lvbiAodW5pdHRlc3QpIHsKKyAgaW1wb3J0IGNvcmUubWVtb3J5IDogR0M7CisgIGltcG9ydCBzdGQuZmlsZTsKK30KKwordW5pdHRlc3QgeworICB2b2lkIHRyeVJlbW92ZShzdHJpbmcgZmlsZU5hbWUpIHsKKyAgICB0cnkgeworICAgICAgcmVtb3ZlKGZpbGVOYW1lKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24pIHt9CisgIH0KKworICBpbW11dGFibGUgZmlsZU5hbWUgPSAidW5pdHRlc3QuZGF0LnRtcCI7CisgIGVuZm9yY2UoIWV4aXN0cyhmaWxlTmFtZSksICJVbml0IHRlc3Qgb3V0cHV0IGZpbGUgIiB+IGZpbGVOYW1lIH4KKyAgICAiIGFscmVhZHkgZXhpc3RzLiIpOworCisgIC8qCisgICAqIENoZWNrIHRoZSBtb3N0IGJhc2ljIHJlYWRpbmcvd3JpdGluZyBvcGVyYXRpb25zLgorICAgKi8KKyAgeworICAgIHNjb3BlIChleGl0KSB0cnlSZW1vdmUoZmlsZU5hbWUpOworCisgICAgYXV0byB3cml0ZXIgPSBuZXcgVEZpbGVXcml0ZXJUcmFuc3BvcnQoZmlsZU5hbWUpOworICAgIHdyaXRlci5vcGVuKCk7CisgICAgc2NvcGUgKGV4aXQpIHdyaXRlci5jbG9zZSgpOworCisgICAgd3JpdGVyLndyaXRlKFsxLCAyXSk7CisgICAgd3JpdGVyLndyaXRlKFszLCA0XSk7CisgICAgd3JpdGVyLndyaXRlKFs1LCA2LCA3XSk7CisgICAgd3JpdGVyLmZsdXNoKCk7CisKKyAgICBhdXRvIHJlYWRlciA9IG5ldyBURmlsZVJlYWRlclRyYW5zcG9ydChmaWxlTmFtZSk7CisgICAgcmVhZGVyLm9wZW4oKTsKKyAgICBzY29wZSAoZXhpdCkgcmVhZGVyLmNsb3NlKCk7CisKKyAgICBhdXRvIGJ1ZiA9IG5ldyB1Ynl0ZVs3XTsKKyAgICByZWFkZXIucmVhZEFsbChidWYpOworICAgIGVuZm9yY2UoYnVmID09IFsxLCAyLCAzLCA0LCA1LCA2LCA3XSk7CisgIH0KKworICAvKgorICAgKiBDaGVjayB0aGF0IGNodW5raW5nIHdvcmtzIGFzIGV4cGVjdGVkLgorICAgKi8KKyAgeworICAgIHNjb3BlIChleGl0KSB0cnlSZW1vdmUoZmlsZU5hbWUpOworCisgICAgc3RhdGljIGFzc2VydChFdmVudFNpemUuc2l6ZW9mID09IDQpOworICAgIGVudW0gQ0hVTktfU0laRSA9IDEwOworCisgICAgLy8gV3JpdGUgc29tZSBjb250ZW50cyB0byB0aGUgZmlsZS4KKyAgICB7CisgICAgICBhdXRvIHdyaXRlciA9IG5ldyBURmlsZVdyaXRlclRyYW5zcG9ydChmaWxlTmFtZSk7CisgICAgICB3cml0ZXIuY2h1bmtTaXplID0gQ0hVTktfU0laRTsKKyAgICAgIHdyaXRlci5vcGVuKCk7CisgICAgICBzY29wZSAoZXhpdCkgd3JpdGVyLmNsb3NlKCk7CisKKyAgICAgIHdyaXRlci53cml0ZShbMHhkZV0pOworICAgICAgd3JpdGVyLndyaXRlKFsweGFkXSk7CisgICAgICAvLyBDaHVuayBib3VuZGFyeSBoZXJlLgorICAgICAgd3JpdGVyLndyaXRlKFsweGJlXSk7CisgICAgICAvLyBUaGUgbmV4dCB3cml0ZSBkb2Vzbid0IGZpdCBpbiB0aGUgZml2ZSBieXRlcyByZW1haW5pbmcsIHNvIHdlIGV4cGVjdAorICAgICAgLy8gcGFkZGluZyB6ZXJvIGJ5dGVzIHRvIGJlIHdyaXR0ZW4uCisgICAgICB3cml0ZXIud3JpdGUoWzB4ZWYsIDB4MTJdKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgd3JpdGVyLndyaXRlKG5ldyB1Ynl0ZVtDSFVOS19TSVpFXSk7CisgICAgICAgIGVuZm9yY2UoZmFsc2UsICJDb3VsZCB3cml0ZSBldmVudCBub3QgZml0dGluZyBpbiBhIHNpbmdsZSBjaHVuay4iKTsKKyAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkge30KKworICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdGhlIHJhdyBjb250ZW50cyBvZiB0aGUgZmlsZSB0byBzZWUgaWYgY2h1bmsgcGFkZGluZyB3YXMgd3JpdHRlbgorICAgIC8vIGFzIGV4cGVjdGVkLgorICAgIGF1dG8gZmlsZSA9IEZpbGUoZmlsZU5hbWUsICJyIik7CisgICAgZW5mb3JjZShmaWxlLnNpemUgPT0gMjYpOworICAgIGF1dG8gd3JpdHRlbiA9IG5ldyB1Ynl0ZVsyNl07CisgICAgZmlsZS5yYXdSZWFkKHdyaXR0ZW4pOworICAgIGVuZm9yY2Uod3JpdHRlbiA9PSBbCisgICAgICAxLCAwLCAwLCAwLCAweGRlLAorICAgICAgMSwgMCwgMCwgMCwgMHhhZCwKKyAgICAgIDEsIDAsIDAsIDAsIDB4YmUsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMiwgMCwgMCwgMCwgMHhlZiwgMHgxMgorICAgIF0pOworCisgICAgLy8gUmVhZCB0aGUgZGF0YSBiYWNrIGluLCBnZXR0aW5nIGFsbCB0aGUgZXZlbnRzIGF0IG9uY2UuCisgICAgeworICAgICAgYXV0byByZWFkZXIgPSBuZXcgVEZpbGVSZWFkZXJUcmFuc3BvcnQoZmlsZU5hbWUpOworICAgICAgcmVhZGVyLmNodW5rU2l6ZSA9IENIVU5LX1NJWkU7CisgICAgICByZWFkZXIub3BlbigpOworICAgICAgc2NvcGUgKGV4aXQpIHJlYWRlci5jbG9zZSgpOworCisgICAgICBhdXRvIGJ1ZiA9IG5ldyB1Ynl0ZVs1XTsKKyAgICAgIHJlYWRlci5yZWFkQWxsKGJ1Zik7CisgICAgICBlbmZvcmNlKGJ1ZiA9PSBbMHhkZSwgMHhhZCwgMHhiZSwgMHhlZiwgMHgxMl0pOworICAgIH0KKyAgfQorCisgIC8qCisgICAqIE1ha2Ugc3VyZSB0aGF0IGNsb3NlKCkgZXhpdHMgInF1aWNrbHkiLCBpLmUuIHRoYXQgdGhlcmUgaXMgbm8gcHJvYmxlbQorICAgKiB3aXRoIHRoZSB3b3JrZXIgdGhyZWFkIHdha2luZyB1cC4KKyAgICovCisgIHsKKyAgICBpbXBvcnQgc3RkLmNvbnYgOiB0ZXh0OworICAgIGVudW0gTlVNX0lURVJBVElPTlMgPSAxMDAwOworCisgICAgdWludCBudW1PdmVyID0gMDsKKyAgICBmb3JlYWNoIChuOyAwIC4uIE5VTV9JVEVSQVRJT05TKSB7CisgICAgICBzY29wZSAoZXhpdCkgdHJ5UmVtb3ZlKGZpbGVOYW1lKTsKKworICAgICAgYXV0byB0cmFuc3BvcnQgPSBuZXcgVEZpbGVXcml0ZXJUcmFuc3BvcnQoZmlsZU5hbWUpOworICAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKworICAgICAgLy8gV3JpdGUgc29tZXRoaW5nIHNvIHRoYXQgdGhlIHdyaXRlciB0aHJlYWQgZ2V0cyBzdGFydGVkLgorICAgICAgdHJhbnNwb3J0LndyaXRlKGNhc3QodWJ5dGVbXSkiZm9vIik7CisKKyAgICAgIC8vIEV2ZXJ5IG90aGVyIGl0ZXJhdGlvbiwgYWxzbyBjYWxsIGZsdXNoKCksIGp1c3QgaW4gY2FzZSB0aGF0IHBvdGVudGlhbGx5CisgICAgICAvLyBoYXMgYW55IGVmZmVjdCBvbiBob3cgdGhlIHdyaXRlciB0aHJlYWQgd2FrZXMgdXAuCisgICAgICBpZiAobiAmIDB4MSkgeworICAgICAgICB0cmFuc3BvcnQuZmx1c2goKTsKKyAgICAgIH0KKworICAgICAgLy8gVGltZSB0aGUgY2FsbCB0byBjbG9zZSgpLgorICAgICAgYXV0byBzdyA9IFN0b3BXYXRjaChBdXRvU3RhcnQueWVzKTsKKyAgICAgIHRyYW5zcG9ydC5jbG9zZSgpOworICAgICAgc3cuc3RvcCgpOworCisgICAgICAvLyBJZiBhbnkgYXR0ZW1wdCB0YWtlcyBtb3JlIHRoYW4gNTAwbXMsIHRyZWF0IHRoYXQgYXMgYSBmYXRhbCBmYWlsdXJlIHRvCisgICAgICAvLyBhdm9pZCBsb29waW5nIG92ZXIgYSBwb3RlbnRpYWxseSB2ZXJ5IHNsb3cgb3BlcmF0aW9uLgorICAgICAgZW5mb3JjZShzdy5wZWVrKCkudG90YWwhIm1zZWNzIiA8IDE1MDAsCisgICAgICAgIHRleHQoImNsb3NlKCkgdG9vayAiLCBzdy5wZWVrKCkudG90YWwhIm1zZWNzIiwgIm1zLiIpKTsKKworICAgICAgLy8gTm9ybWFsbHksIGl0IHRha2VzIGxlc3MgdGhhbiA1bXMgb24gbXkgZGV2IGJveC4KKyAgICAgIC8vIEhvd2V2ZXIsIGlmIHRoZSBib3ggaXMgaGVhdmlseSBsb2FkZWQsIHNvbWUgb2YgdGhlIHRlc3QgcnVucyBjYW4gdGFrZQorICAgICAgLy8gbG9uZ2VyLiBBZGRpdGlvbmFsbHksIG9uIGEgV2luZG93cyBTZXJ2ZXIgMjAwOCBpbnN0YW5jZSBydW5uaW5nIGluCisgICAgICAvLyBhIFZpcnR1YWxCb3ggVk0sIGl0IGhhcyBiZWVuIG9ic2VydmVkIHRoYXQgYWJvdXQgYSBxdWFydGVyIG9mIHRoZSBydW5zCisgICAgICAvLyB0YWtlcyAoMjE3IMKxIDEpIG1zLCBmb3IgcmVhc29ucyBub3QgeWV0IGtub3duLgorICAgICAgaWYgKHN3LnBlZWsoKS50b3RhbCEibXNlY3MiID4gNTApIHsKKyAgICAgICAgKytudW1PdmVyOworICAgICAgfQorCisgICAgICAvLyBGb3JjZSBnYXJiYWdlIGNvbGxlY3Rpb24gcnVucyBldmVyeSBub3cgYW5kIHRoZW4gdG8gbWFrZSBzdXJlIHdlCisgICAgICAvLyBkb24ndCBydW4gb3V0IG9mIE9TIHRocmVhZCBoYW5kbGVzLgorICAgICAgaWYgKCEobiAlIDEwMCkpIEdDLmNvbGxlY3QoKTsKKyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgZmV3ZXIgdGhhbiBhIHRoaXJkIG9mIHRoZSBydW5zIHRvb2sgbG9uZ2VyIHRoYW4gNW1zLgorICAgIGVuZm9yY2UobnVtT3ZlciA8IE5VTV9JVEVSQVRJT05TIC8gMywKKyAgICAgIHRleHQobnVtT3ZlciwgIiBpdGVyYXRpb25zIHRvb2sgbW9yZSB0aGFuIDEwIG1zLiIpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvZnJhbWVkLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9mcmFtZWQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGVmZmJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvZnJhbWVkLmQKQEAgLTAsMCArMSwzMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbW9kdWxlIHRocmlmdC50cmFuc3BvcnQuZnJhbWVkOworCitpbXBvcnQgY29yZS5iaXRvcCA6IGJzd2FwOworaW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBtaW47CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHk7CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworCisvKioKKyAqIEZyYW1lZCB0cmFuc3BvcnQuCisgKgorICogQWxsIHdyaXRlcyBnbyBpbnRvIGFuIGluLW1lbW9yeSBidWZmZXIgdW50aWwgZmx1c2ggaXMgY2FsbGVkLCBhdCB3aGljaCBwb2ludAorICogdGhlIHRyYW5zcG9ydCB3cml0ZXMgdGhlIGxlbmd0aCBvZiB0aGUgZW50aXJlIGJpbmFyeSBjaHVuayBmb2xsb3dlZCBieSB0aGUKKyAqIGRhdGEgcGF5bG9hZC4gVGhlIHJlY2VpdmVyIG9uIHRoZSBvdGhlciBlbmQgdGhlbiBwZXJmb3JtcyBhIHNpbmdsZQorICogwrtmaXhlZC1sZW5ndGjCqyByZWFkIHRvIGdldCB0aGUgd2hvbGUgbWVzc2FnZSBvZmYgdGhlIHdpcmUuCisgKi8KK2ZpbmFsIGNsYXNzIFRGcmFtZWRUcmFuc3BvcnQgOiBUQmFzZVRyYW5zcG9ydCB7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGZyYW1lZCB0cmFuc3BvcnQuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICB0cmFuc3BvcnQgPSBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdG8gd3JhcC4KKyAgICovCisgIHRoaXMoVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICB0cmFuc3BvcnRfID0gdHJhbnNwb3J0OworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHdyYXBwZWQgdHJhbnNwb3J0LgorICAgKi8KKyAgVFRyYW5zcG9ydCB1bmRlcmx5aW5nVHJhbnNwb3J0KCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gdHJhbnNwb3J0XzsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgaXNPcGVuKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gdHJhbnNwb3J0Xy5pc09wZW47CisgIH0KKworICBvdmVycmlkZSBib29sIHBlZWsoKSB7CisgICAgcmV0dXJuIHJCdWZfLmxlbmd0aCA+IDAgfHwgdHJhbnNwb3J0Xy5wZWVrKCk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIG9wZW4oKSB7CisgICAgdHJhbnNwb3J0Xy5vcGVuKCk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGNsb3NlKCkgeworICAgIGZsdXNoKCk7CisgICAgdHJhbnNwb3J0Xy5jbG9zZSgpOworICB9CisKKyAgLyoqCisgICAqIEF0dGVtcHRzIHRvIHJlYWQgZGF0YSBpbnRvIHRoZSBnaXZlbiBidWZmZXIsIHN0b3BwaW5nIHdoZW4gdGhlIGJ1ZmZlciBpcworICAgKiBleGhhdXN0ZWQgb3IgdGhlIGZyYW1lIGVuZCBpcyByZWFjaGVkLgorICAgKgorICAgKiBUT0RPOiBDb250cmFyeSB0byB0aGUgQysrIGltcGxlbWVudGF0aW9uLCB0aGlzIG5ldmVyIGRvZXMgY3Jvc3MtZnJhbWUKKyAgICogcmVhZHMg4oCTIGlzIHRoZXJlIGFjdHVhbGx5IGEgdmFsaWQgdXNlIGNhc2UgZm9yIHRoYXQ/CisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBidWYgPSBTbGljZSB0byB1c2UgYXMgYnVmZmVyLgorICAgKgorICAgKiBSZXR1cm5zOiBIb3cgbWFueSBieXRlcyB3ZXJlIGFjdHVhbGx5IHJlYWQuCisgICAqCisgICAqIFRocm93czogVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAqLworICBvdmVycmlkZSBzaXplX3QgcmVhZCh1Ynl0ZVtdIGJ1ZikgeworICAgIC8vIElmIHRoZSBidWZmZXIgaXMgZW1wdHksIHJlYWQgYSBuZXcgZnJhbWUgb2ZmIHRoZSB3aXJlLgorICAgIGlmIChyQnVmXy5lbXB0eSkgeworICAgICAgYm9vbCBnb3RGcmFtZSA9IHJlYWRGcmFtZSgpOworICAgICAgaWYgKCFnb3RGcmFtZSkgcmV0dXJuIDA7CisgICAgfQorCisgICAgYXV0byBzaXplID0gbWluKHJCdWZfLmxlbmd0aCwgYnVmLmxlbmd0aCk7CisgICAgYnVmWzAuLnNpemVdID0gckJ1Zl9bMC4uc2l6ZV07CisgICAgckJ1Zl8gPSByQnVmX1tzaXplLi4kXTsKKyAgICByZXR1cm4gc2l6ZTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgd3JpdGUoaW4gdWJ5dGVbXSBidWYpIHsKKyAgICB3QnVmXyB+PSBidWY7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGZsdXNoKCkgeworICAgIGlmICh3QnVmXy5lbXB0eSkgcmV0dXJuOworCisgICAgLy8gUHJvcGVybHkgcmVzZXQgdGhlIHdyaXRlIGJ1ZmZlciBldmVuIHNvbWUgb2YgdGhlIHByb3RvY29sIG9wZXJhdGlvbnMgZ28KKyAgICAvLyB3cm9uZy4KKyAgICBzY29wZSAoZXhpdCkgeworICAgICAgd0J1Zl8ubGVuZ3RoID0gMDsKKyAgICAgIHdCdWZfLmFzc3VtZVNhZmVBcHBlbmQoKTsKKyAgICB9CisKKyAgICBpbnQgbGVuID0gYnN3YXAoY2FzdChpbnQpd0J1Zl8ubGVuZ3RoKTsKKyAgICB0cmFuc3BvcnRfLndyaXRlKGNhc3QodWJ5dGVbXSkoJmxlbilbMC4uMV0pOworICAgIHRyYW5zcG9ydF8ud3JpdGUod0J1Zl8pOworICAgIHRyYW5zcG9ydF8uZmx1c2goKTsKKyAgfQorCisgIG92ZXJyaWRlIGNvbnN0KHVieXRlKVtdIGJvcnJvdyh1Ynl0ZSogYnVmLCBzaXplX3QgbGVuKSB7CisgICAgaWYgKGxlbiA8PSByQnVmXy5sZW5ndGgpIHsKKyAgICAgIHJldHVybiByQnVmXzsKKyAgICB9IGVsc2UgeworICAgICAgLy8gRG9uJ3QgdHJ5IGF0dGVtcHRpbmcgY3Jvc3MtZnJhbWUgYm9ycm93cywgdHJ5aW5nIHRoYXQgZG9lcyBub3QgbWFrZQorICAgICAgLy8gbXVjaCBzZW5zZSBhbnl3YXkuCisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBvdmVycmlkZSB2b2lkIGNvbnN1bWUoc2l6ZV90IGxlbikgeworICAgIGVuZm9yY2UobGVuIDw9IHJCdWZfLmxlbmd0aCwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiSW52YWxpZCBjb25zdW1lIGxlbmd0aCIsIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5CQURfQVJHUykpOworICAgIHJCdWZfID0gckJ1Zl9bbGVuIC4uICRdOworICB9CisKK3ByaXZhdGU6CisgIGJvb2wgcmVhZEZyYW1lKCkgeworICAgIC8vIFJlYWQgdGhlIHNpemUgb2YgdGhlIG5leHQgZnJhbWUuIFdlIGNhbid0IHVzZSByZWFkQWxsKCkgc2luY2UgdGhhdAorICAgIC8vIGFsd2F5cyB0aHJvd3MgYW4gZXhjZXB0aW9uIG9uIEVPRiwgYnV0IHdhbnQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIG9ubHkKKyAgICAvLyBpZiBFT0Ygb2NjdXJzIGFmdGVyIHBhcnRpYWwgc2l6ZSBkYXRhLgorICAgIGludCBzaXplOworICAgIHNpemVfdCBzaXplX3JlYWQ7CisgICAgd2hpbGUgKHNpemVfcmVhZCA8IHNpemUuc2l6ZW9mKSB7CisgICAgICBhdXRvIGRhdGEgPSAoY2FzdCh1Ynl0ZSopJnNpemUpW3NpemVfcmVhZC4uc2l6ZS5zaXplb2ZdOworICAgICAgYXV0byByZWFkID0gdHJhbnNwb3J0Xy5yZWFkKGRhdGEpOworICAgICAgaWYgKHJlYWQgPT0gMCkgeworICAgICAgICBpZiAoc2l6ZV9yZWFkID09IDApIHsKKyAgICAgICAgICAvLyBFT0YgYmVmb3JlIGFueSBkYXRhIHdhcyByZWFkLgorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBFT0YgYWZ0ZXIgYSBwYXJ0aWFsIGZyYW1lIGhlYWRlciDigJMgaWxsZWdhbC4KKyAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICJObyBtb3JlIGRhdGEgdG8gcmVhZCBhZnRlciBwYXJ0aWFsIGZyYW1lIGhlYWRlciIsCisgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuRU5EX09GX0ZJTEUKKyAgICAgICAgICApOworICAgICAgICB9CisgICAgICB9CisgICAgICBzaXplX3JlYWQgKz0gcmVhZDsKKyAgICB9CisKKyAgICBzaXplID0gYnN3YXAoc2l6ZSk7CisgICAgZW5mb3JjZShzaXplID49IDAsIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJGcmFtZSBzaXplIGhhcyBuZWdhdGl2ZSB2YWx1ZSIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQ09SUlVQVEVEX0RBVEEpKTsKKworICAgIC8vIFRPRE86IEJlbmNobWFyayB0aGlzLgorICAgIHJCdWZfLmxlbmd0aCA9IHNpemU7CisgICAgckJ1Zl8uYXNzdW1lU2FmZUFwcGVuZCgpOworCisgICAgdHJhbnNwb3J0Xy5yZWFkQWxsKHJCdWZfKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIFRUcmFuc3BvcnQgdHJhbnNwb3J0XzsKKyAgdWJ5dGVbXSByQnVmXzsKKyAgdWJ5dGVbXSB3QnVmXzsKK30KKworLyoqCisgKiBXcmFwcyBnaXZlbiB0cmFuc3BvcnRzIGludG8gVEZyYW1lZFRyYW5zcG9ydHMuCisgKi8KK2FsaWFzIFRXcmFwcGVyVHJhbnNwb3J0RmFjdG9yeSFURnJhbWVkVHJhbnNwb3J0IFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5OworCit2ZXJzaW9uICh1bml0dGVzdCkgeworICBpbXBvcnQgc3RkLnJhbmRvbSA6IE10MTk5MzcsIHVuaWZvcm07CisgIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKK30KKworLy8gU29tZSBiYXNpYyByYW5kb20gdGVzdGluZywgYWx3YXlzIHN0YXJ0aW5nIHdpdGggdGhlIHNhbWUgc2VlZCBmb3IKKy8vIGRldGVybWluaXN0aWMgdW5pdCB0ZXN0IHJlc3VsdHMg4oCTIG1vcmUgdGVzdHMgaW4gdHJhbnNwb3J0X3Rlc3QuCit1bml0dGVzdCB7CisgIGF1dG8gcmFuZEdlbiA9IE10MTk5MzcoNDIpOworCisgIC8vIDMyIGtpQiBvZiBkYXRhIHRvIHdvcmsgd2l0aC4KKyAgYXV0byBkYXRhID0gbmV3IHVieXRlWzEgPDwgMTVdOworICBmb3JlYWNoIChyZWYgYjsgZGF0YSkgeworICAgIGIgPSB1bmlmb3JtISJbXSIoY2FzdCh1Ynl0ZSkwLCBjYXN0KHVieXRlKTI1NSwgcmFuZEdlbik7CisgIH0KKworICAvLyBHZW5lcmF0ZSBhIGxpc3Qgb2YgY2h1bmsgc2l6ZXMgdG8gc3BsaXQgdGhlIGRhdGEgaW50by4gQSB1bmlmb3JtCisgIC8vIGRpc3RyaWJ1dGlvbiBpcyBub3QgcXVpdGUgcmVhbGlzdGljLCBidXQgc3RkLnJhbmRvbSBkb2Vzbid0IGhhdmUgYW55dGhpbmcKKyAgLy8gZWxzZSB5ZXQuCisgIGVudW0gTUFYX0ZSQU1FX0xFTkdUSCA9IDUxMjsKKyAgYXV0byBjaHVua1NpemVzTGlzdCA9IG5ldyBzaXplX3RbXVsyXTsKKyAgZm9yZWFjaCAocmVmIGNodW5rU2l6ZXM7IGNodW5rU2l6ZXNMaXN0KSB7CisgICAgc2l6ZV90IHN1bTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgYXV0byBjdXJMZW4gPSB1bmlmb3JtKDAsIE1BWF9GUkFNRV9MRU5HVEgsIHJhbmRHZW4pOworICAgICAgc3VtICs9IGN1ckxlbjsKKyAgICAgIGlmIChzdW0gPiBkYXRhLmxlbmd0aCkgYnJlYWs7CisgICAgICBjaHVua1NpemVzIH49IGN1ckxlbjsKKyAgICB9CisgIH0KKyAgY2h1bmtTaXplc0xpc3Qgfj0gW2RhdGEubGVuZ3RoXTsgLy8gQWxzbyB0ZXN0IHdob2xlIGNodW5rIGF0IG9uY2UuCisKKyAgLy8gVGVzdCB3cml0aW5nIGRhdGEuCisgIHsKKyAgICBmb3JlYWNoIChjaHVua1NpemVzOyBjaHVua1NpemVzTGlzdCkgeworICAgICAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgICAgIGF1dG8gZnJhbWVkID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQoYnVmKTsKKworICAgICAgYXV0byByZW1haW5pbmdEYXRhID0gZGF0YTsKKyAgICAgIGZvcmVhY2ggKGNodW5rU2l6ZTsgY2h1bmtTaXplcykgeworICAgICAgICBmcmFtZWQud3JpdGUocmVtYWluaW5nRGF0YVswLi5jaHVua1NpemVdKTsKKyAgICAgICAgcmVtYWluaW5nRGF0YSA9IHJlbWFpbmluZ0RhdGFbY2h1bmtTaXplLi4kXTsKKyAgICAgIH0KKyAgICAgIGZyYW1lZC5mbHVzaCgpOworCisgICAgICBhdXRvIHdyaXR0ZW5EYXRhID0gZGF0YVswLi4oJCAtIHJlbWFpbmluZ0RhdGEubGVuZ3RoKV07CisgICAgICBhdXRvIGFjdHVhbERhdGEgPSBidWYuZ2V0Q29udGVudHMoKTsKKworICAgICAgLy8gQ2hlY2sgZnJhbWUgc2l6ZS4KKyAgICAgIGludCBmcmFtZVNpemUgPSBic3dhcCgoY2FzdChpbnRbXSkoYWN0dWFsRGF0YVswLi5pbnQuc2l6ZW9mXSkpWzBdKTsKKyAgICAgIGVuZm9yY2UoZnJhbWVTaXplID09IHdyaXR0ZW5EYXRhLmxlbmd0aCk7CisKKyAgICAgIC8vIENoZWNrIGFjdHVhbCBkYXRhLgorICAgICAgZW5mb3JjZShhY3R1YWxEYXRhW2ludC5zaXplb2YuLiRdID09IHdyaXR0ZW5EYXRhKTsKKyAgICB9CisgIH0KKworICAvLyBUZXN0IHJlYWRpbmcgZGF0YS4KKyAgeworICAgIGZvcmVhY2ggKGNodW5rU2l6ZXM7IGNodW5rU2l6ZXNMaXN0KSB7CisgICAgICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyOworCisgICAgICBhdXRvIHNpemUgPSBic3dhcChjYXN0KGludClkYXRhLmxlbmd0aCk7CisgICAgICBidWYud3JpdGUoY2FzdCh1Ynl0ZVtdKSgmc2l6ZSlbMC4uMV0pOworICAgICAgYnVmLndyaXRlKGRhdGEpOworCisgICAgICBhdXRvIGZyYW1lZCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KGJ1Zik7CisgICAgICB1Ynl0ZVtdIHJlYWREYXRhOworICAgICAgcmVhZERhdGEucmVzZXJ2ZShkYXRhLmxlbmd0aCk7CisgICAgICBmb3JlYWNoIChjaHVua1NpemU7IGNodW5rU2l6ZXMpIHsKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgd29yayB3aXRoIHJlYWQgYmVjYXVzZSB3ZSBoYXZlIG9uZSBodWdlIGZyYW1lLgorICAgICAgICBhdXRvIG9sZFJlYWRMZW4gPSByZWFkRGF0YS5sZW5ndGg7CisgICAgICAgIHJlYWREYXRhLmxlbmd0aCArPSBjaHVua1NpemU7CisgICAgICAgIGZyYW1lZC5yZWFkKHJlYWREYXRhW29sZFJlYWRMZW4uLiRdKTsKKyAgICAgIH0KKworICAgICAgZW5mb3JjZShyZWFkRGF0YSA9PSBkYXRhWzAuLnJlYWREYXRhLmxlbmd0aF0pOworICAgIH0KKyAgfQorCisgIC8vIFRlc3QgY29tYmluZWQgcmVhZGluZy93cml0aW5nIG9mIG11bHRpcGxlIGZyYW1lcy4KKyAgZm9yZWFjaCAoZmx1c2hQcm9iYWJpbGl0eTsgWzEsIDIsIDQsIDgsIDE2LCAzMl0pIHsKKyAgICBmb3JlYWNoIChjaHVua1NpemVzOyBjaHVua1NpemVzTGlzdCkgeworICAgICAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgICAgIGF1dG8gZnJhbWVkID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQoYnVmKTsKKworICAgICAgc2l6ZV90W10gZnJhbWVTaXplczsKKworICAgICAgLy8gV3JpdGUgdGhlIGRhdGEuCisgICAgICBzaXplX3QgZnJhbWVTaXplOworICAgICAgYXV0byByZW1haW5pbmdEYXRhID0gZGF0YTsKKyAgICAgIGZvcmVhY2ggKGNodW5rU2l6ZTsgY2h1bmtTaXplcykgeworICAgICAgICBmcmFtZWQud3JpdGUocmVtYWluaW5nRGF0YVswLi5jaHVua1NpemVdKTsKKyAgICAgICAgcmVtYWluaW5nRGF0YSA9IHJlbWFpbmluZ0RhdGFbY2h1bmtTaXplLi4kXTsKKworICAgICAgICBmcmFtZVNpemUgKz0gY2h1bmtTaXplOworICAgICAgICBpZiAoZnJhbWVTaXplID4gMCAmJiB1bmlmb3JtKDAsIGZsdXNoUHJvYmFiaWxpdHksIHJhbmRHZW4pID09IDApIHsKKyAgICAgICAgICBmcmFtZVNpemVzIH49IGZyYW1lU2l6ZTsKKyAgICAgICAgICBmcmFtZVNpemUgPSAwOworICAgICAgICAgIGZyYW1lZC5mbHVzaCgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZnJhbWVTaXplID4gMCkgeworICAgICAgICBmcmFtZVNpemVzIH49IGZyYW1lU2l6ZTsKKyAgICAgICAgZnJhbWVTaXplID0gMDsKKyAgICAgICAgZnJhbWVkLmZsdXNoKCk7CisgICAgICB9CisKKyAgICAgIC8vIFJlYWQgaXQgYmFjay4KKyAgICAgIGF1dG8gcmVhZERhdGEgPSBuZXcgdWJ5dGVbZGF0YS5sZW5ndGggLSByZW1haW5pbmdEYXRhLmxlbmd0aF07CisgICAgICBhdXRvIHJlbWFpblRvUmVhZCA9IHJlYWREYXRhOworICAgICAgZm9yZWFjaCAoZlNpemU7IGZyYW1lU2l6ZXMpIHsKKyAgICAgICAgLy8gV2UgYXJlIGV4cGxvaXRpbmcgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIFRGcmFtZWRUcmFuc3BvcnQ6CisgICAgICAgIC8vIFRoZSByZWFkIGJ1ZmZlciBzdGFydHMgZW1wdHkgYW5kIGl0IHdpbGwgbmV2ZXIgcmV0dXJuIG1vcmUgdGhhbiBvbmUKKyAgICAgICAgLy8gZnJhbWUgcGVyIHJlYWQsIHNvIGJ5IGp1c3QgcmVxdWVzdGluZyBhbGwgb2YgdGhlIGRhdGEsIHdlIHNob3VsZAorICAgICAgICAvLyBhbHdheXMgZ2V0IGV4YWN0bHkgb25lIGZyYW1lLgorICAgICAgICBhdXRvIGdvdCA9IGZyYW1lZC5yZWFkKHJlbWFpblRvUmVhZCk7CisgICAgICAgIGVuZm9yY2UoZ290ID09IGZTaXplKTsKKyAgICAgICAgcmVtYWluVG9SZWFkID0gcmVtYWluVG9SZWFkW2ZTaXplLi4kXTsKKyAgICAgIH0KKworICAgICAgZW5mb3JjZShyZW1haW5Ub1JlYWQuZW1wdHkpOworICAgICAgZW5mb3JjZShyZWFkRGF0YSA9PSBkYXRhWzAuLnJlYWREYXRhLmxlbmd0aF0pOworICAgIH0KKyAgfQorfQorCisvLyBUZXN0IGZsdXNoKClpbmcgYW4gZW1wdHkgYnVmZmVyLgordW5pdHRlc3QgeworICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7CisgIGF1dG8gZnJhbWVkID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQoYnVmKTsKKyAgaW1tdXRhYmxlIG91dDEgPSBbMCwgMCwgMCwgMSwgJ2EnXTsKKyAgaW1tdXRhYmxlIG91dDIgPSBbMCwgMCwgMCwgMSwgJ2EnLCAwLCAwLCAwLCAyLCAnYicsICdjJ107CisKKyAgZnJhbWVkLmZsdXNoKCk7CisgIGVuZm9yY2UoYnVmLmdldENvbnRlbnRzKCkgPT0gW10pOworICBmcmFtZWQuZmx1c2goKTsKKyAgZnJhbWVkLmZsdXNoKCk7CisgIGVuZm9yY2UoYnVmLmdldENvbnRlbnRzKCkgPT0gW10pOworICBmcmFtZWQud3JpdGUoY2FzdCh1Ynl0ZVtdKSJhIik7CisgIGVuZm9yY2UoYnVmLmdldENvbnRlbnRzKCkgPT0gW10pOworICBmcmFtZWQuZmx1c2goKTsKKyAgZW5mb3JjZShidWYuZ2V0Q29udGVudHMoKSA9PSBvdXQxKTsKKyAgZnJhbWVkLmZsdXNoKCk7CisgIGZyYW1lZC5mbHVzaCgpOworICBlbmZvcmNlKGJ1Zi5nZXRDb250ZW50cygpID09IG91dDEpOworICBmcmFtZWQud3JpdGUoY2FzdCh1Ynl0ZVtdKSJiYyIpOworICBlbmZvcmNlKGJ1Zi5nZXRDb250ZW50cygpID09IG91dDEpOworICBmcmFtZWQuZmx1c2goKTsKKyAgZW5mb3JjZShidWYuZ2V0Q29udGVudHMoKSA9PSBvdXQyKTsKKyAgZnJhbWVkLmZsdXNoKCk7CisgIGZyYW1lZC5mbHVzaCgpOworICBlbmZvcmNlKGJ1Zi5nZXRDb250ZW50cygpID09IG91dDIpOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvaHR0cC5kIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvaHR0cC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNThkZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9odHRwLmQKQEAgLTAsMCArMSw0NTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBIVFRQIHRyYW5wc29ydCBpbXBsZW1lbnRhdGlvbiwgbW9kZWxsZWQgYWZ0ZXIgdGhlIEMrKyBvbmUuCisgKgorICogVW5mb3J0dW5hdGVseSwgbGliY3VybCBpcyBxdWl0ZSBoZWF2eXdlaWdodCBhbmQgc3VwcG9ydHMgb25seSBjbGllbnQtc2lkZQorICogYXBwbGljYXRpb25zLiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBiYXNpYyBIVFRQLzEuMSBwYXJ0cworICogc3VwcG9ydGluZyBIVFRQIDEwMCBDb250aW51ZSwgY2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZywga2VlcGFsaXZlLCBldGMuCisgKi8KK21vZHVsZSB0aHJpZnQudHJhbnNwb3J0Lmh0dHA7CisKK2ltcG9ydCBzdGQuYWxnb3JpdGhtIDogY2FuRmluZCwgY291bnRVbnRpbCwgZW5kc1dpdGgsIGZpbmRTcGxpdCwgbWluLCBzdGFydHNXaXRoOworaW1wb3J0IHN0ZC5hc2NpaSA6IHRvTG93ZXI7CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHk7CitpbXBvcnQgc3RkLmNvbnYgOiBwYXJzZSwgdG87CitpbXBvcnQgc3RkLmRhdGV0aW1lIDogQ2xvY2ssIFVUQzsKK2ltcG9ydCBzdGQuc3RyaW5nIDogc3RyaXBMZWZ0OworaW1wb3J0IHRocmlmdC5iYXNlIDogVkVSU0lPTjsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQ7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgYm90aCBjbGllbnQtIGFuZCBzZXJ2ZXItc2lkZSBIVFRQIHRyYW5zcG9ydHMuCisgKi8KK2Fic3RyYWN0IGNsYXNzIFRIdHRwVHJhbnNwb3J0IDogVEJhc2VUcmFuc3BvcnQgeworICB0aGlzKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgdHJhbnNwb3J0XyA9IHRyYW5zcG9ydDsKKyAgICByZWFkSGVhZGVyc18gPSB0cnVlOworICAgIGh0dHBCdWZfID0gbmV3IHVieXRlW0hUVFBfQlVGRkVSX1NJWkVdOworICAgIGh0dHBCdWZSZW1haW5pbmdfID0gaHR0cEJ1Zl9bMCAuLiAwXTsKKyAgICByZWFkQnVmZmVyXyA9IG5ldyBUTWVtb3J5QnVmZmVyOworICAgIHdyaXRlQnVmZmVyXyA9IG5ldyBUTWVtb3J5QnVmZmVyOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBpc09wZW4oKSB7CisgICAgcmV0dXJuIHRyYW5zcG9ydF8uaXNPcGVuKCk7CisgIH0KKworICBvdmVycmlkZSBib29sIHBlZWsoKSB7CisgICAgcmV0dXJuIHRyYW5zcG9ydF8ucGVlaygpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBvcGVuKCkgeworICAgIHRyYW5zcG9ydF8ub3BlbigpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHsKKyAgICB0cmFuc3BvcnRfLmNsb3NlKCk7CisgIH0KKworICBvdmVycmlkZSBzaXplX3QgcmVhZCh1Ynl0ZVtdIGJ1ZikgeworICAgIGlmICghcmVhZEJ1ZmZlcl8ucGVlaygpKSB7CisgICAgICByZWFkQnVmZmVyXy5yZXNldCgpOworCisgICAgICBpZiAoIXJlZmlsbCgpKSByZXR1cm4gMDsKKworICAgICAgaWYgKHJlYWRIZWFkZXJzXykgeworICAgICAgICByZWFkSGVhZGVycygpOworICAgICAgfQorCisgICAgICBzaXplX3QgZ290OworICAgICAgaWYgKGNodW5rZWRfKSB7CisgICAgICAgIGdvdCA9IHJlYWRDaHVua2VkKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBnb3QgPSByZWFkQ29udGVudChjb250ZW50TGVuZ3RoXyk7CisgICAgICB9CisgICAgICByZWFkSGVhZGVyc18gPSB0cnVlOworCisgICAgICBpZiAoZ290ID09IDApIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gcmVhZEJ1ZmZlcl8ucmVhZChidWYpOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWRFbmQoKSB7CisgICAgLy8gUmVhZCBhbnkgcGVuZGluZyBjaHVua2VkIGRhdGEgKGZvb3RlcnMgZXRjLikKKyAgICBpZiAoY2h1bmtlZF8pIHsKKyAgICAgIHdoaWxlICghY2h1bmtlZERvbmVfKSB7CisgICAgICAgIHJlYWRDaHVua2VkKCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCB3cml0ZShpbiB1Ynl0ZVtdIGJ1ZikgeworICAgIHdyaXRlQnVmZmVyXy53cml0ZShidWYpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBmbHVzaCgpIHsKKyAgICBhdXRvIGRhdGEgPSB3cml0ZUJ1ZmZlcl8uZ2V0Q29udGVudHMoKTsKKyAgICBzdHJpbmcgaGVhZGVyID0gZ2V0SGVhZGVyKGRhdGEubGVuZ3RoKTsKKworICAgIHRyYW5zcG9ydF8ud3JpdGUoY2FzdChjb25zdCh1Ynl0ZSlbXSkgaGVhZGVyKTsKKyAgICB0cmFuc3BvcnRfLndyaXRlKGRhdGEpOworICAgIHRyYW5zcG9ydF8uZmx1c2goKTsKKworICAgIC8vIFJlc2V0IHRoZSBidWZmZXIgYW5kIGhlYWRlciB2YXJpYWJsZXMuCisgICAgd3JpdGVCdWZmZXJfLnJlc2V0KCk7CisgICAgcmVhZEhlYWRlcnNfID0gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHRvIHJlYWQgSFRUUCByZXF1ZXN0cyBpbnRvLCBpbiBieXRlcy4gV2lsbCBleHBhbmQKKyAgICogYXMgcmVxdWlyZWQuCisgICAqLworICBlbnVtIEhUVFBfQlVGRkVSX1NJWkUgPSAxMDI0OworCitwcm90ZWN0ZWQ6CisgIGFic3RyYWN0IHN0cmluZyBnZXRIZWFkZXIoc2l6ZV90IGRhdGFMZW5ndGgpOworICBhYnN0cmFjdCBib29sIHBhcnNlU3RhdHVzTGluZShjb25zdCh1Ynl0ZSlbXSBzdGF0dXMpOworCisgIHZvaWQgcGFyc2VIZWFkZXIoY29uc3QodWJ5dGUpW10gaGVhZGVyKSB7CisgICAgYXV0byBzcGxpdCA9IGZpbmRTcGxpdChoZWFkZXIsIFsnOiddKTsKKyAgICBpZiAoc3BsaXRbMV0uZW1wdHkpIHsKKyAgICAgIC8vIE5vIGNvbG9uIGZvdW5kLgorICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGNvbXBUb0xvd2VyKHVieXRlIGEsIHVieXRlIGIpIHsKKyAgICAgIHJldHVybiB0b0xvd2VyKGNhc3QoY2hhcilhKSA9PSB0b0xvd2VyKGNhc3QoY2hhciliKTsKKyAgICB9CisKKyAgICBpZiAoc3RhcnRzV2l0aCFjb21wVG9Mb3dlcihzcGxpdFswXSwgY2FzdCh1Ynl0ZVtdKSJ0cmFuc2Zlci1lbmNvZGluZyIpKSB7CisgICAgICBpZiAoZW5kc1dpdGghY29tcFRvTG93ZXIoc3BsaXRbMl0sIGNhc3QodWJ5dGVbXSkiY2h1bmtlZCIpKSB7CisgICAgICAgIGNodW5rZWRfID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGghY29tcFRvTG93ZXIoc3BsaXRbMF0sIGNhc3QodWJ5dGVbXSkiY29udGVudC1sZW5ndGgiKSkgeworICAgICAgY2h1bmtlZF8gPSBmYWxzZTsKKyAgICAgIGF1dG8gbGVuZ3RoU3RyaW5nID0gc3RyaXBMZWZ0KGNhc3QoY29uc3QoY2hhcilbXSlzcGxpdFsyXSk7CisgICAgICBjb250ZW50TGVuZ3RoXyA9IHBhcnNlIXNpemVfdChsZW5ndGhTdHJpbmcpOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICB1Ynl0ZVtdIHJlYWRMaW5lKCkgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBhdXRvIHNwbGl0ID0gZmluZFNwbGl0KGh0dHBCdWZSZW1haW5pbmdfLCBjYXN0KHVieXRlW10pIlxyXG4iKTsKKworICAgICAgaWYgKHNwbGl0WzFdLmVtcHR5KSB7CisgICAgICAgIC8vIE5vIENSTEYgeWV0LCBtb3ZlIHdoYXRldmVyIHdlIGhhdmUgbm93IHRvIGZyb250IGFuZCByZWZpbGwuCisgICAgICAgIGlmIChodHRwQnVmUmVtYWluaW5nXy5lbXB0eSkgeworICAgICAgICAgIGh0dHBCdWZSZW1haW5pbmdfID0gaHR0cEJ1Zl9bMCAuLiAwXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBodHRwQnVmX1swIC4uIGh0dHBCdWZSZW1haW5pbmdfLmxlbmd0aF0gPSBodHRwQnVmUmVtYWluaW5nXzsKKyAgICAgICAgICBodHRwQnVmUmVtYWluaW5nXyA9IGh0dHBCdWZfWzAgLi4gaHR0cEJ1ZlJlbWFpbmluZ18ubGVuZ3RoXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcmVmaWxsKCkpIHsKKyAgICAgICAgICBhdXRvIGJ1ZiA9IGh0dHBCdWZSZW1haW5pbmdfOworICAgICAgICAgIGh0dHBCdWZSZW1haW5pbmdfID0gaHR0cEJ1ZlJlbWFpbmluZ19bJCAtIDEgLi4gJCAtIDFdOworICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFNldCB0aGUgcmVtYWluaW5nIGJ1ZmZlciB0byB0aGUgcGFydCBhZnRlciBcclxuIGFuZCByZXR1cm4gdGhlIHBhcnQKKyAgICAgICAgLy8gKGxpbmUpIGJlZm9yZSBpdC4KKyAgICAgICAgaHR0cEJ1ZlJlbWFpbmluZ18gPSBzcGxpdFsyXTsKKyAgICAgICAgcmV0dXJuIHNwbGl0WzBdOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHZvaWQgcmVhZEhlYWRlcnMoKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBoZWFkZXJzIHN0YXRlIHZhcmlhYmxlcworICAgIGNvbnRlbnRMZW5ndGhfID0gMDsKKyAgICBjaHVua2VkXyA9IGZhbHNlOworICAgIGNodW5rZWREb25lXyA9IGZhbHNlOworICAgIGNodW5rU2l6ZV8gPSAwOworCisgICAgLy8gQ29udHJvbCBzdGF0ZSBmbG93CisgICAgYm9vbCBzdGF0dXNMaW5lID0gdHJ1ZTsKKyAgICBib29sIGZpbmlzaGVkOworCisgICAgLy8gTG9vcCB1bnRpbCBoZWFkZXJzIGFyZSBmaW5pc2hlZAorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBhdXRvIGxpbmUgPSByZWFkTGluZSgpOworCisgICAgICBpZiAobGluZS5sZW5ndGggPT0gMCkgeworICAgICAgICBpZiAoZmluaXNoZWQpIHsKKyAgICAgICAgICByZWFkSGVhZGVyc18gPSBmYWxzZTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gTXVzdCBoYXZlIGJlZW4gYW4gSFRUUCAxMDAsIGtlZXAgZ29pbmcgZm9yIGFub3RoZXIgc3RhdHVzIGxpbmUKKyAgICAgICAgICBzdGF0dXNMaW5lID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHN0YXR1c0xpbmUpIHsKKyAgICAgICAgICBzdGF0dXNMaW5lID0gZmFsc2U7CisgICAgICAgICAgZmluaXNoZWQgPSBwYXJzZVN0YXR1c0xpbmUobGluZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcGFyc2VIZWFkZXIobGluZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzaXplX3QgcmVhZENodW5rZWQoKSB7CisgICAgc2l6ZV90IGxlbmd0aDsKKworICAgIGF1dG8gbGluZSA9IHJlYWRMaW5lKCk7CisgICAgc2l6ZV90IGNodW5rU2l6ZTsKKyAgICB0cnkgeworICAgICAgYXV0byBjaGFyTGluZSA9IGNhc3QoY2hhcltdKWxpbmU7CisgICAgICBjaHVua1NpemUgPSBwYXJzZSFzaXplX3QoY2hhckxpbmUsIDE2KTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkludmFsaWQgY2h1bmsgc2l6ZTogIiB+IHRvIXN0cmluZyhsaW5lKSwKKyAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkNPUlJVUFRFRF9EQVRBKTsKKyAgICB9CisKKyAgICBpZiAoY2h1bmtTaXplID09IDApIHsKKyAgICAgIHJlYWRDaHVua2VkRm9vdGVycygpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBSZWFkIGRhdGEgY29udGVudAorICAgICAgbGVuZ3RoICs9IHJlYWRDb250ZW50KGNodW5rU2l6ZSk7CisgICAgICAvLyBSZWFkIHRyYWlsaW5nIENSTEYgYWZ0ZXIgY29udGVudAorICAgICAgcmVhZExpbmUoKTsKKyAgICB9CisgICAgcmV0dXJuIGxlbmd0aDsKKyAgfQorCisgIHZvaWQgcmVhZENodW5rZWRGb290ZXJzKCkgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBhdXRvIGxpbmUgPSByZWFkTGluZSgpOworICAgICAgaWYgKGxpbmUubGVuZ3RoID09IDApIHsKKyAgICAgICAgY2h1bmtlZERvbmVfID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc2l6ZV90IHJlYWRDb250ZW50KHNpemVfdCBzaXplKSB7CisgICAgYXV0byBuZWVkID0gc2l6ZTsKKyAgICB3aGlsZSAobmVlZCA+IDApIHsKKyAgICAgIGlmIChodHRwQnVmUmVtYWluaW5nXy5sZW5ndGggPT0gMCkgeworICAgICAgICAvLyBXZSBoYXZlIGdpdmVuIGFsbCB0aGUgZGF0YSwgcmVzZXQgcG9zaXRpb24gdG8gaGVhZCBvZiB0aGUgYnVmZmVyLgorICAgICAgICBodHRwQnVmUmVtYWluaW5nXyA9IGh0dHBCdWZfWzAgLi4gMF07CisgICAgICAgIGlmICghcmVmaWxsKCkpIHJldHVybiBzaXplIC0gbmVlZDsKKyAgICAgIH0KKworICAgICAgYXV0byBnaXZlID0gbWluKGh0dHBCdWZSZW1haW5pbmdfLmxlbmd0aCwgbmVlZCk7CisgICAgICByZWFkQnVmZmVyXy53cml0ZShjYXN0KHVieXRlW10paHR0cEJ1ZlJlbWFpbmluZ19bMCAuLiBnaXZlXSk7CisgICAgICBodHRwQnVmUmVtYWluaW5nXyA9IGh0dHBCdWZSZW1haW5pbmdfW2dpdmUgLi4gJF07CisgICAgICBuZWVkIC09IGdpdmU7CisgICAgfQorICAgIHJldHVybiBzaXplOworICB9CisKKyAgYm9vbCByZWZpbGwoKSB7CisgICAgLy8gSXMgdGhlcmUgYSBuaWNlciB3YXkgdG8gZG8gdGhpcz8KKyAgICBhdXRvIGluZGV4QmVnaW4gPSBodHRwQnVmUmVtYWluaW5nXy5wdHIgLSBodHRwQnVmXy5wdHI7CisgICAgYXV0byBpbmRleEVuZCA9IGluZGV4QmVnaW4gKyBodHRwQnVmUmVtYWluaW5nXy5sZW5ndGg7CisKKyAgICBpZiAoaHR0cEJ1Zl8ubGVuZ3RoIC0gaW5kZXhFbmQgPD0gKGh0dHBCdWZfLmxlbmd0aCAvIDQpKSB7CisgICAgICBodHRwQnVmXy5sZW5ndGggKj0gMjsKKyAgICB9CisKKyAgICAvLyBSZWFkIG1vcmUgZGF0YS4KKyAgICBhdXRvIGdvdCA9IHRyYW5zcG9ydF8ucmVhZChjYXN0KHVieXRlW10paHR0cEJ1Zl9baW5kZXhFbmQgLi4gJF0pOworICAgIGlmIChnb3QgPT0gMCkgcmV0dXJuIGZhbHNlOworICAgIGh0dHBCdWZSZW1haW5pbmdfID0gaHR0cEJ1Zl9baW5kZXhCZWdpbiAuLiBpbmRleEVuZCArIGdvdF07CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBUVHJhbnNwb3J0IHRyYW5zcG9ydF87CisKKyAgVE1lbW9yeUJ1ZmZlciB3cml0ZUJ1ZmZlcl87CisgIFRNZW1vcnlCdWZmZXIgcmVhZEJ1ZmZlcl87CisKKyAgYm9vbCByZWFkSGVhZGVyc187CisgIGJvb2wgY2h1bmtlZF87CisgIGJvb2wgY2h1bmtlZERvbmVfOworICBzaXplX3QgY2h1bmtTaXplXzsKKyAgc2l6ZV90IGNvbnRlbnRMZW5ndGhfOworCisgIHVieXRlW10gaHR0cEJ1Zl87CisgIHVieXRlW10gaHR0cEJ1ZlJlbWFpbmluZ187Cit9CisKKy8qKgorICogSFRUUCBjbGllbnQgdHJhbnNwb3J0LgorICovCitmaW5hbCBjbGFzcyBUQ2xpZW50SHR0cFRyYW5zcG9ydCA6IFRIdHRwVHJhbnNwb3J0IHsKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBjbGllbnQgaHR0cCB0cmFuc3BvcnQgb3BlcmF0aW5nIG9uIHRoZSBwYXNzZWQgdW5kZXJseWluZworICAgKiB0cmFuc3BvcnQuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICB0cmFuc3BvcnQgPSBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdXNlZCBmb3IgdGhlIGFjdHVhbCBJL08uCisgICAqICAgaG9zdCA9IFRoZSBIVFRQIGhvc3Qgc3RyaW5nLgorICAgKiAgIHBhdGggPSBUaGUgSFRUUCBwYXRoIHN0cmluZy4KKyAgICovCisgIHRoaXMoVFRyYW5zcG9ydCB0cmFuc3BvcnQsIHN0cmluZyBob3N0LCBzdHJpbmcgcGF0aCkgeworICAgIHN1cGVyKHRyYW5zcG9ydCk7CisgICAgaG9zdF8gPSBob3N0OworICAgIHBhdGhfID0gcGF0aDsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZW5pZW5jZSBvdmVybG9hZCBmb3IgY29uc3RydWN0aW5nIGEgY2xpZW50IEhUVFAgdHJhbnNwb3J0IHVzaW5nIGEKKyAgICogVFNvY2tldCBjb25uZWN0aW5nIHRvIHRoZSBzcGVjaWZpZWQgaG9zdCBhbmQgcG9ydC4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGhvc3QgPSBUaGUgc2VydmVyIHRvIGNvbm5lY3QgdG8sIGFsc28gdXNlZCBhcyBIVFRQIGhvc3Qgc3RyaW5nLgorICAgKiAgIHBvcnQgPSBUaGUgcG9ydCB0byBjb25uZWN0IHRvLgorICAgKiAgIHBhdGggPSBUaGUgSFRUUCBwYXRoIHN0cmluZy4KKyAgICovCisgIHRoaXMoc3RyaW5nIGhvc3QsIHVzaG9ydCBwb3J0LCBzdHJpbmcgcGF0aCkgeworICAgIHRoaXMobmV3IFRTb2NrZXQoaG9zdCwgcG9ydCksIGhvc3QsIHBhdGgpOworICB9CisKK3Byb3RlY3RlZDoKKyAgb3ZlcnJpZGUgc3RyaW5nIGdldEhlYWRlcihzaXplX3QgZGF0YUxlbmd0aCkgeworICAgIHJldHVybiAiUE9TVCAiIH4gcGF0aF8gfiAiIEhUVFAvMS4xXHJcbiIgfgorICAgICAgIkhvc3Q6ICIgfiBob3N0XyB+ICJcclxuIiB+CisgICAgICAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdFxyXG4iIH4KKyAgICAgICJDb250ZW50LUxlbmd0aDogIiB+IHRvIXN0cmluZyhkYXRhTGVuZ3RoKSB+ICJcclxuIiB+CisgICAgICAiQWNjZXB0OiBhcHBsaWNhdGlvbi94LXRocmlmdFxyXG4iIH4KKyAgICAgICJVc2VyLUFnZW50OiBUaHJpZnQvIiB+IFZFUlNJT04gfiAiIChEL1RDbGllbnRIdHRwVHJhbnNwb3J0KVxyXG4iIH4KKyAgICAgICJcclxuIjsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgcGFyc2VTdGF0dXNMaW5lKGNvbnN0KHVieXRlKVtdIHN0YXR1cykgeworICAgIC8vIEhUVFAtVmVyc2lvbiBTUCBTdGF0dXMtQ29kZSBTUCBSZWFzb24tUGhyYXNlIENSTEYKKyAgICBhdXRvIGZpcnN0U3BsaXQgPSBmaW5kU3BsaXQoc3RhdHVzLCBbJyAnXSk7CisgICAgaWYgKGZpcnN0U3BsaXRbMV0uZW1wdHkpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJCYWQgc3RhdHVzOiAiIH4gdG8hc3RyaW5nKHN0YXR1cyksCisgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5DT1JSVVBURURfREFUQSk7CisgICAgfQorCisgICAgYXV0byBjb2RlUmVhc29uID0gZmlyc3RTcGxpdFsyXVtjb3VudFVudGlsISJhICE9IGIiKGZpcnN0U3BsaXRbMl0sICcgJykgLi4gJF07CisgICAgYXV0byBzZWNvbmRTcGxpdCA9IGZpbmRTcGxpdChjb2RlUmVhc29uLCBbJyAnXSk7CisgICAgaWYgKHNlY29uZFNwbGl0WzFdLmVtcHR5KSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQmFkIHN0YXR1czogIiB+IHRvIXN0cmluZyhzdGF0dXMpLAorICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQ09SUlVQVEVEX0RBVEEpOworICAgIH0KKworICAgIGlmIChzZWNvbmRTcGxpdFswXSA9PSAiMjAwIikgeworICAgICAgLy8gSFRUUCAyMDAgPSBPSywgd2UgZ290IHRoZSByZXNwb25zZQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChzZWNvbmRTcGxpdFswXSA9PSAiMTAwIikgeworICAgICAgLy8gSFRUUCAxMDAgPSBjb250aW51ZSwganVzdCBrZWVwIHJlYWRpbmcKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQmFkIHN0YXR1cyAodW5oYW5kbGVkIHN0YXR1cyBjb2RlKTogIiB+CisgICAgICB0byFzdHJpbmcoY2FzdChjb25zdChjaGFyW10pKXN0YXR1cyksIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5DT1JSVVBURURfREFUQSk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RyaW5nIGhvc3RfOworICBzdHJpbmcgcGF0aF87Cit9CisKKy8qKgorICogSFRUUCBzZXJ2ZXIgdHJhbnNwb3J0LgorICovCitmaW5hbCBjbGFzcyBUU2VydmVySHR0cFRyYW5zcG9ydCA6IFRIdHRwVHJhbnNwb3J0IHsKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UuCisgICAqCisgICAqIFBhcmFtOgorICAgKiAgIHRyYW5zcG9ydCA9IFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB1c2VkIGZvciB0aGUgYWN0dWFsIEkvTy4KKyAgICovCisgIHRoaXMoVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICBzdXBlcih0cmFuc3BvcnQpOworICB9CisKK3Byb3RlY3RlZDoKKyAgb3ZlcnJpZGUgc3RyaW5nIGdldEhlYWRlcihzaXplX3QgZGF0YUxlbmd0aCkgeworICAgIHJldHVybiAiSFRUUC8xLjEgMjAwIE9LXHJcbiIgfgorICAgICAgIkRhdGU6ICIgfiBnZXRSRkMxMTIzVGltZSgpIH4gIlxyXG4iIH4KKyAgICAgICJTZXJ2ZXI6IFRocmlmdC8iIH4gVkVSU0lPTiB+ICJcclxuIiB+CisgICAgICAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdFxyXG4iIH4KKyAgICAgICJDb250ZW50LUxlbmd0aDogIiB+IHRvIXN0cmluZyhkYXRhTGVuZ3RoKSB+ICJcclxuIiB+CisgICAgICAiQ29ubmVjdGlvbjogS2VlcC1BbGl2ZVxyXG4iIH4KKyAgICAgICJcclxuIjsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgcGFyc2VTdGF0dXNMaW5lKGNvbnN0KHVieXRlKVtdIHN0YXR1cykgeworICAgIC8vIE1ldGhvZCBTUCBSZXF1ZXN0LVVSSSBTUCBIVFRQLVZlcnNpb24gQ1JMRi4KKyAgICBhdXRvIHNwbGl0ID0gZmluZFNwbGl0KHN0YXR1cywgWycgJ10pOworICAgIGlmIChzcGxpdFsxXS5lbXB0eSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkJhZCBzdGF0dXM6ICIgfiB0byFzdHJpbmcoc3RhdHVzKSwKKyAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkNPUlJVUFRFRF9EQVRBKTsKKyAgICB9CisKKyAgICBhdXRvIHVyaVZlcnNpb24gPSBzcGxpdFsyXVtjb3VudFVudGlsISJhICE9IGIiKHNwbGl0WzJdLCAnICcpIC4uICRdOworICAgIGlmICghY2FuRmluZCh1cmlWZXJzaW9uLCAnICcpKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQmFkIHN0YXR1czogIiB+IHRvIXN0cmluZyhzdGF0dXMpLAorICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQ09SUlVQVEVEX0RBVEEpOworICAgIH0KKworICAgIGlmIChzcGxpdFswXSA9PSAiUE9TVCIpIHsKKyAgICAgIC8vIFBPU1QgbWV0aG9kIG9rLCBsb29raW5nIGZvciBjb250ZW50LgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkJhZCBzdGF0dXMgKHVuc3VwcG9ydGVkIG1ldGhvZCk6ICIgfgorICAgICAgdG8hc3RyaW5nKHN0YXR1cyksIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5DT1JSVVBURURfREFUQSk7CisgIH0KK30KKworLyoqCisgKiBXcmFwcyBhIHRyYW5zcG9ydCBpbnRvIGEgSFRUUCBzZXJ2ZXIgcHJvdG9jb2wuCisgKi8KK2FsaWFzIFRXcmFwcGVyVHJhbnNwb3J0RmFjdG9yeSFUU2VydmVySHR0cFRyYW5zcG9ydCBUU2VydmVySHR0cFRyYW5zcG9ydEZhY3Rvcnk7CisKK3ByaXZhdGUgeworICBpbXBvcnQgc3RkLnN0cmluZyA6IGZvcm1hdDsKKyAgc3RyaW5nIGdldFJGQzExMjNUaW1lKCkgeworICAgIGF1dG8gc3lzVGltZSA9IENsb2NrLmN1cnJUaW1lKFVUQygpKTsKKworICAgIGF1dG8gZGF5TmFtZSA9IGNhcE1lbWJlck5hbWUoc3lzVGltZS5kYXlPZldlZWspOworICAgIGF1dG8gbW9udGhOYW1lID0gY2FwTWVtYmVyTmFtZShzeXNUaW1lLm1vbnRoKTsKKworICAgIHJldHVybiBmb3JtYXQoIiVzLCAlcyAlcyAlcyAlczolczolcyBHTVQiLCBkYXlOYW1lLCBzeXNUaW1lLmRheSwKKyAgICAgIG1vbnRoTmFtZSwgc3lzVGltZS55ZWFyLCBzeXNUaW1lLmhvdXIsIHN5c1RpbWUubWludXRlLCBzeXNUaW1lLnNlY29uZCk7CisgIH0KKworICBpbXBvcnQgc3RkLmFzY2lpIDogdG9VcHBlcjsKKyAgaW1wb3J0IHN0ZC50cmFpdHMgOiBFbnVtTWVtYmVyczsKKyAgc3RyaW5nIGNhcE1lbWJlck5hbWUoVCkoVCB2YWwpIGlmIChpcyhUID09IGVudW0pKSB7CisgICAgZm9yZWFjaCAoaSwgZTsgRW51bU1lbWJlcnMhVCkgeworICAgICAgZW51bSBuYW1lID0gX190cmFpdHMoZGVyaXZlZE1lbWJlcnMsIFQpW2ldOworICAgICAgZW51bSBjYXBOYW1lID0gY2FzdChjaGFyKSB0b1VwcGVyKG5hbWVbMF0pIH4gbmFtZSBbMSAuLiAkXTsKKyAgICAgIGlmICh2YWwgPT0gZSkgeworICAgICAgICByZXR1cm4gY2FwTmFtZTsKKyAgICAgIH0KKyAgICB9CisgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm90IGEgbWVtYmVyIG9mICIgfiBULnN0cmluZ29mIH4gIjogIiB+IHRvIXN0cmluZyh2YWwpKTsKKyAgfQorCisgIHVuaXR0ZXN0IHsKKyAgICBlbnVtIEZvbyB7CisgICAgICBiYXIsCisgICAgICBiQVoKKyAgICB9CisKKyAgICBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKKyAgICBlbmZvcmNlKGNhcE1lbWJlck5hbWUoRm9vLmJhcikgPT0gIkJhciIpOworICAgIGVuZm9yY2UoY2FwTWVtYmVyTmFtZShGb28uYkFaKSA9PSAiQkFaIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L21lbW9yeS5kIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvbWVtb3J5LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmMDgwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L21lbW9yeS5kCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7CisKK2ltcG9ydCBjb3JlLmV4Y2VwdGlvbiA6IG9uT3V0T2ZNZW1vcnlFcnJvcjsKK2ltcG9ydCBjb3JlLnN0ZGMuc3RkbGliIDogZnJlZSwgcmVhbGxvYzsKK2ltcG9ydCBzdGQuYWxnb3JpdGhtIDogbWluOworaW1wb3J0IHN0ZC5jb252IDogdGV4dDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CisKKy8qKgorICogQSB0cmFuc3BvcnQgdGhhdCBzaW1wbHkgcmVhZHMgZnJvbSBhbmQgd3JpdGVzIHRvIGFuIGluLW1lbW9yeSBidWZmZXIuIEV2ZXJ5CisgKiB0aW1lIHlvdSBjYWxsIHdyaXRlIG9uIGl0LCB0aGUgZGF0YSBpcyBzaW1wbHkgcGxhY2VkIGludG8gYSBidWZmZXIsIGFuZAorICogZXZlcnkgdGltZSB5b3UgY2FsbCByZWFkLCBkYXRhIGlzIGNvbnN1bWVkIGZyb20gdGhhdCBidWZmZXIuCisgKgorICogQ3VycmVudGx5LCB0aGUgc3RvcmFnZSBmb3Igd3JpdHRlbiBkYXRhIGlzIG5ldmVyIHJlY2xhaW1lZCwgZXZlbiBpZiB0aGUKKyAqIGJ1ZmZlciBjb250ZW50cyBoYXZlIGFscmVhZHkgYmVlbiByZWFkIG91dCBhZ2Fpbi4KKyAqLworZmluYWwgY2xhc3MgVE1lbW9yeUJ1ZmZlciA6IFRCYXNlVHJhbnNwb3J0IHsKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgbWVtb3J5IHRyYW5zcG9ydCB3aXRoIGFuIGVtcHR5IGludGVybmFsIGJ1ZmZlci4KKyAgICovCisgIHRoaXMoKSB7fQorCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IG1lbW9yeSB0cmFuc3BvcnQgd2l0aCBhbiBlbXB0eSBpbnRlcm5hbCBidWZmZXIsCisgICAqIHJlc2VydmluZyBzcGFjZSBmb3IgY2FwYWNpdHkgYnl0ZXMgaW4gYWR2YW5jZS4KKyAgICoKKyAgICogSWYgdGhlIGFtb3VudCBvZiBkYXRhIHdoaWNoIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgYnVmZmVyIGlzIGFscmVhZHkKKyAgICoga25vd24gb24gY29uc3RydWN0aW9uLCB0aGlzIGNhbiBiZXR0ZXIgcGVyZm9ybWFuY2Ugb3ZlciB0aGUgZGVmYXVsdAorICAgKiBjb25zdHJ1Y3RvciBiZWNhdXNlIHJlYWxsb2NhdGlvbnMgY2FuIGJlIGF2b2lkZWQuCisgICAqCisgICAqIElmIHRoZSBwcmVhbGxvY2F0ZWQgYnVmZmVyIGlzIGV4aGF1c3RlZCwgZGF0YSBjYW4gc3RpbGwgYmUgd3JpdHRlbiB0byB0aGUKKyAgICogdHJhbnNwb3J0LCBidXQgcmVhbGxvY2F0aW9ucyB3aWxsIGhhcHBlbi4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGNhcGFjaXR5ID0gU2l6ZSBvZiB0aGUgaW5pdGlhbGx5IHJlc2VydmVkIGJ1ZmZlciAoaW4gYnl0ZXMpLgorICAgKi8KKyAgdGhpcyhzaXplX3QgY2FwYWNpdHkpIHsKKyAgICByZXNldChjYXBhY2l0eSk7CisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBtZW1vcnkgdHJhbnNwb3J0IGluaXRpYWxseSBjb250YWluaW5nIHRoZSBwYXNzZWQgZGF0YS4KKyAgICoKKyAgICogRm9yIG5vdywgdGhlIHBhc3NlZCBidWZmZXIgaXMgbm90IGludGVsbGlnZW50bHkgdXNlZCwgdGhlIGRhdGEgaXMganVzdAorICAgKiBjb3BpZWQgdG8gdGhlIGludGVybmFsIGJ1ZmZlci4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGJ1ZmZlciA9IEluaXRpYWwgY29udGVudHMgYXZhaWxhYmxlIHRvIGJlIHJlYWQuCisgICAqLworICB0aGlzKGluIHVieXRlW10gY29udGVudHMpIHsKKyAgICBhdXRvIHNpemUgPSBjb250ZW50cy5sZW5ndGg7CisgICAgcmVzZXQoc2l6ZSk7CisgICAgYnVmZmVyX1swIC4uIHNpemVdID0gY29udGVudHNbXTsKKyAgICB3cml0ZU9mZnNldF8gPSBzaXplOworICB9CisKKyAgLyoqCisgICAqIERlc3RydWN0b3IsIGZyZWVzIHRoZSBpbnRlcm5hbGx5IGFsbG9jYXRlZCBidWZmZXIuCisgICAqLworICB+dGhpcygpIHsKKyAgICBmcmVlKGJ1ZmZlcl8pOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgYSByZWFkLW9ubHkgdmlldyBvZiB0aGUgY3VycmVudCBidWZmZXIgY29udGVudHMuCisgICAqCisgICAqIE5vdGU6IEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGUgcmV0dXJuZWQgc2xpY2UgaXMgb25seSB2YWxpZCBmb3IgdGhlCisgICAqIGxpZmUgb2YgdGhpcyBvYmplY3QsIGFuZCBtYXkgYmUgaW52YWxpZGF0ZWQgb24gdGhlIG5leHQgd3JpdGUoKSBjYWxsIGF0CisgICAqIHdpbGwg4oCTIHlvdSBtaWdodCB3YW50IHRvIGltbWVkaWF0ZWx5IC5kdXAgaXQgaWYgeW91IGludGVuZCB0byBrZWVwIGl0CisgICAqIGFyb3VuZC4KKyAgICovCisgIGNvbnN0KHVieXRlKVtdIGdldENvbnRlbnRzKCkgeworICAgIHJldHVybiBidWZmZXJfW3JlYWRPZmZzZXRfIC4uIHdyaXRlT2Zmc2V0X107CisgIH0KKworICAvKioKKyAgICogQSBtZW1vcnkgdHJhbnNwb3J0IGlzIGFsd2F5cyBvcGVuLgorICAgKi8KKyAgb3ZlcnJpZGUgYm9vbCBpc09wZW4oKSBAcHJvcGVydHkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBwZWVrKCkgeworICAgIHJldHVybiB3cml0ZU9mZnNldF8gLSByZWFkT2Zmc2V0XyA+IDA7CisgIH0KKworICAvKioKKyAgICogT3BlbmluZyBpcyBhIG5vLW9wKCkgZm9yIGEgbWVtb3J5IGJ1ZmZlci4KKyAgICovCisgIG92ZXJyaWRlIHZvaWQgb3BlbigpIHt9CisKKyAgLyoqCisgICAqIENsb3NpbmcgaXMgYSBuby1vcCgpIGZvciBhIG1lbW9yeSBidWZmZXIsIGl0IGlzIGFsd2F5cyBvcGVuLgorICAgKi8KKyAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHt9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWQodWJ5dGVbXSBidWYpIHsKKyAgICBhdXRvIHNpemUgPSBtaW4oYnVmLmxlbmd0aCwgd3JpdGVPZmZzZXRfIC0gcmVhZE9mZnNldF8pOworICAgIGJ1ZlswIC4uIHNpemVdID0gYnVmZmVyX1tyZWFkT2Zmc2V0XyAuLiByZWFkT2Zmc2V0XyArIHNpemVdOworICAgIHJlYWRPZmZzZXRfICs9IHNpemU7CisgICAgcmV0dXJuIHNpemU7CisgIH0KKworICAvKioKKyAgICogU2hvcnRjdXQgdmVyc2lvbiBvZiByZWFkQWxsKCkg4oCTIHVzaW5nIHRoaXMgb3ZlciBUQmFzZVRyYW5zcG9ydC5yZWFkQWxsKCkKKyAgICogY2FuIGdpdmUgdXMgYSBuaWNlIHNwZWVkIGluY3JlYXNlIGJlY2F1c2UgZ2l2ZXMgdXMgYSBuaWNlIHNwZWVkIGluY3JlYXNlCisgICAqIGJlY2F1c2UgaXQgaXMgdHlwaWNhbGx5IGEgdmVyeSBob3QgcGF0aCBkdXJpbmcgZGVzZXJpYWxpemF0aW9uLgorICAgKi8KKyAgb3ZlcnJpZGUgdm9pZCByZWFkQWxsKHVieXRlW10gYnVmKSB7CisgICAgYXV0byBhdmFpbGFibGUgPSB3cml0ZU9mZnNldF8gLSByZWFkT2Zmc2V0XzsKKyAgICBpZiAoYnVmLmxlbmd0aCA+IGF2YWlsYWJsZSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24odGV4dCgiQ2Fubm90IHJlYWRBbGwoKSAiLCBidWYubGVuZ3RoLAorICAgICAgICAiIGJ5dGVzIG9mIGRhdGEgYmVjYXVzZSBvbmx5ICIsIGF2YWlsYWJsZSwgIiBieXRlcyBhcmUgYXZhaWxhYmxlLiIpLAorICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuRU5EX09GX0ZJTEUpOworICAgIH0KKworICAgIGJ1ZltdID0gYnVmZmVyX1tyZWFkT2Zmc2V0XyAuLiByZWFkT2Zmc2V0XyArIGJ1Zi5sZW5ndGhdOworICAgIHJlYWRPZmZzZXRfICs9IGJ1Zi5sZW5ndGg7CisgIH0KKworICBvdmVycmlkZSB2b2lkIHdyaXRlKGluIHVieXRlW10gYnVmKSB7CisgICAgYXV0byBuZWVkID0gYnVmLmxlbmd0aDsKKyAgICBpZiAoYnVmZmVyTGVuXyAtIHdyaXRlT2Zmc2V0XyA8IG5lZWQpIHsKKyAgICAgIC8vIEV4cG9uZW50aWFsIGdyb3d0aC4KKyAgICAgIGF1dG8gbmV3TGVuID0gYnVmZmVyTGVuXyArIDE7CisgICAgICB3aGlsZSAobmV3TGVuIC0gd3JpdGVPZmZzZXRfIDwgbmVlZCkgbmV3TGVuICo9IDI7CisgICAgICBjUmVhbGxvYyhidWZmZXJfLCBuZXdMZW4pOworICAgICAgYnVmZmVyTGVuXyA9IG5ld0xlbjsKKyAgICB9CisKKyAgICBidWZmZXJfW3dyaXRlT2Zmc2V0XyAuLiB3cml0ZU9mZnNldF8gKyBuZWVkXSA9IGJ1ZltdOworICAgIHdyaXRlT2Zmc2V0XyArPSBuZWVkOworICB9CisKKyAgb3ZlcnJpZGUgY29uc3QodWJ5dGUpW10gYm9ycm93KHVieXRlKiBidWYsIHNpemVfdCBsZW4pIHsKKyAgICBpZiAobGVuIDw9IHdyaXRlT2Zmc2V0XyAtIHJlYWRPZmZzZXRfKSB7CisgICAgICByZXR1cm4gYnVmZmVyX1tyZWFkT2Zmc2V0XyAuLiB3cml0ZU9mZnNldF9dOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBvdmVycmlkZSB2b2lkIGNvbnN1bWUoc2l6ZV90IGxlbikgeworICAgIHJlYWRPZmZzZXRfICs9IGxlbjsKKyAgfQorCisgIHZvaWQgcmVzZXQoKSB7CisgICAgcmVhZE9mZnNldF8gPSAwOworICAgIHdyaXRlT2Zmc2V0XyA9IDA7CisgIH0KKworICB2b2lkIHJlc2V0KHNpemVfdCBjYXBhY2l0eSkgeworICAgIHJlYWRPZmZzZXRfID0gMDsKKyAgICB3cml0ZU9mZnNldF8gPSAwOworICAgIGlmIChidWZmZXJMZW5fIDwgY2FwYWNpdHkpIHsKKyAgICAgIGNSZWFsbG9jKGJ1ZmZlcl8sIGNhcGFjaXR5KTsKKyAgICAgIGJ1ZmZlckxlbl8gPSBjYXBhY2l0eTsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgdWJ5dGUqIGJ1ZmZlcl87CisgIHNpemVfdCBidWZmZXJMZW5fOworICBzaXplX3QgcmVhZE9mZnNldF87CisgIHNpemVfdCB3cml0ZU9mZnNldF87Cit9CisKK3ByaXZhdGUgeworICB2b2lkIGNSZWFsbG9jKHJlZiB1Ynl0ZSogZGF0YSwgc2l6ZV90IG5ld1NpemUpIHsKKyAgICBhdXRvIHJlc3VsdCA9IHJlYWxsb2MoZGF0YSwgbmV3U2l6ZSk7CisgICAgaWYgKHJlc3VsdCBpcyBudWxsKSBvbk91dE9mTWVtb3J5RXJyb3IoKTsKKyAgICBkYXRhID0gY2FzdCh1Ynl0ZSopcmVzdWx0OworICB9Cit9CisKK3ZlcnNpb24gKHVuaXR0ZXN0KSB7CisgIGltcG9ydCBzdGQuZXhjZXB0aW9uOworfQorCit1bml0dGVzdCB7CisgIGF1dG8gYSA9IG5ldyBUTWVtb3J5QnVmZmVyKDUpOworICBpbW11dGFibGUodWJ5dGVbXSkgdGVzdERhdGEgPSBbMSwgMiwgMywgNF07CisgIGF1dG8gYnVmID0gbmV3IHVieXRlW3Rlc3REYXRhLmxlbmd0aF07CisgIGVuZm9yY2UoYS5pc09wZW4pOworCisgIC8vIGEgc2hvdWxkIGJlIGVtcHR5LgorICBlbmZvcmNlKCFhLnBlZWsoKSk7CisgIGVuZm9yY2UoYS5yZWFkKGJ1ZikgPT0gMCk7CisgIGFzc2VydFRocm93biFUVHJhbnNwb3J0RXhjZXB0aW9uKGEucmVhZEFsbChidWYpKTsKKworICAvLyBXcml0ZSBzb21lIGRhdGEgYW5kIHJlYWQgaXQgYmFjayBhZ2Fpbi4KKyAgYS53cml0ZSh0ZXN0RGF0YSk7CisgIGVuZm9yY2UoYS5wZWVrKCkpOworICBlbmZvcmNlKGEuZ2V0Q29udGVudHMoKSA9PSB0ZXN0RGF0YSk7CisgIGVuZm9yY2UoYS5yZWFkKGJ1ZikgPT0gdGVzdERhdGEubGVuZ3RoKTsKKyAgZW5mb3JjZShidWYgPT0gdGVzdERhdGEpOworCisgIC8vIGEgc2hvdWxkIGJlIGVtcHR5IGFnYWluLgorICBlbmZvcmNlKCFhLnBlZWsoKSk7CisgIGVuZm9yY2UoYS5yZWFkKGJ1ZikgPT0gMCk7CisgIGFzc2VydFRocm93biFUVHJhbnNwb3J0RXhjZXB0aW9uKGEucmVhZEFsbChidWYpKTsKKworICAvLyBUZXN0IHRoZSBjb25zdHJ1Y3RvciB3aGljaCBkaXJlY3RseSBhY2NlcHRzIGluaXRpYWwgZGF0YS4KKyAgYXV0byBiID0gbmV3IFRNZW1vcnlCdWZmZXIodGVzdERhdGEpOworICBlbmZvcmNlKGIuaXNPcGVuKTsKKyAgZW5mb3JjZShiLnBlZWsoKSk7CisgIGVuZm9yY2UoYi5nZXRDb250ZW50cygpID09IHRlc3REYXRhKTsKKworICAvLyBUZXN0IGJvcnJvdygpLgorICBhdXRvIGJvcnJvd2VkID0gYi5ib3Jyb3cobnVsbCwgdGVzdERhdGEubGVuZ3RoKTsKKyAgZW5mb3JjZShib3Jyb3dlZCA9PSB0ZXN0RGF0YSk7CisgIGVuZm9yY2UoYi5wZWVrKCkpOworICBiLmNvbnN1bWUodGVzdERhdGEubGVuZ3RoKTsKKyAgZW5mb3JjZSghYi5wZWVrKCkpOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvcGlwZWQuZCBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3BpcGVkLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZlMTQzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3BpcGVkLmQKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQudHJhbnNwb3J0LnBpcGVkOworCitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworCisvKioKKyAqIFBpcGVzIGRhdGEgcmVxdWVzdCBmcm9tIG9uZSB0cmFuc3BvcnQgdG8gYW5vdGhlciB3aGVuIHJlYWRFbmQoKQorICogb3Igd3JpdGVFbmQoKSBpcyBjYWxsZWQuCisgKgorICogQSB0eXBpY2FsIHVzZSBjYXNlIHdvdWxkIGJlIHRvIGxvZyByZXF1ZXN0cyBvbiBlLmcuIGEgc29ja2V0IHRvCisgKiBkaXNrIChpLiBlLiBwaXBlIHRoZW0gdG8gYSBURmlsZVdyaXRlclRyYW5zcG9ydCkuCisgKgorICogVGhlIGltcGxlbWVudGF0aW9uIGtlZXBzIGFuIGludGVybmFsIGJ1ZmZlciB3aGljaCBleHBhbmRzIHRvCisgKiBob2xkIHRoZSB3aG9sZSBhbW91bnQgb2YgZGF0YSByZWFkL3dyaXR0ZW4gdW50aWwgdGhlIGNvcnJlc3BvbmRpbmcgKkVuZCgpCisgKiBtZXRob2QgaXMgY2FsbGVkLgorICoKKyAqIENvbnRyYXJ5IHRvIHRoZSBDKysgaW1wbGVtZW50YXRpb24sIHRoaXMgZG9lc24ndCBpbnRyb2R1Y2UgeWV0IGFub3RoZXIgbGF5ZXIKKyAqIG9mIGlucHV0L291dHB1dCBidWZmZXJpbmcsIGFsbCBjYWxscyBhcmUgcGFzc2VkIHRvIHRoZSB1bmRlcmx5aW5nIHNvdXJjZQorICogdHJhbnNwb3J0IHZlcmJhdGltLgorICovCitmaW5hbCBjbGFzcyBUUGlwZWRUcmFuc3BvcnQoU291cmNlID0gVFRyYW5zcG9ydCkgaWYgKAorICBpc1RUcmFuc3BvcnQhU291cmNlCispIDogVEJhc2VUcmFuc3BvcnQgeworICAvLy8gVGhlIGRlZmF1bHQgaW5pdGlhbCBidWZmZXIgc2l6ZSBpZiBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQsIGluIGJ5dGVzLgorICBlbnVtIERFRkFVTFRfSU5JVElBTF9CVUZGRVJfU0laRSA9IDUxMjsKKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZS4KKyAgICoKKyAgICogQnkgZGVmYXVsdCwgb25seSByZWFkcyBhcmUgcGlwZWQgKHBpcGVSZWFkcyA9IHRydWUsIHBpcGVXcml0ZXMgPSBmYWxzZSkuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBzcmNUcmFucyA9IFRoZSB0cmFuc3BvcnQgdG8gd2hpY2ggYWxsIHJlcXVlc3RzIGFyZSBmb3J3YXJkZWQuCisgICAqICAgZHN0VHJhbnMgPSBUaGUgdHJhbnNwb3J0IHRoZSByZWFkL3dyaXR0ZW4gZGF0YSBpcyBjb3BpZWQgdG8uCisgICAqICAgaW5pdGlhbEJ1ZmZlclNpemUgPSBUaGUgZGVmYXVsdCBzaXplIG9mIHRoZSByZWFkL3dyaXRlIGJ1ZmZlcnMsIGZvcgorICAgKiAgICAgcGVyZm9ybWFuY2UgdHVuaW5nLgorICAgKi8KKyAgdGhpcyhTb3VyY2Ugc3JjVHJhbnMsIFRUcmFuc3BvcnQgZHN0VHJhbnMsCisgICAgc2l6ZV90IGluaXRpYWxCdWZmZXJTaXplID0gREVGQVVMVF9JTklUSUFMX0JVRkZFUl9TSVpFCisgICkgeworICAgIHNyY1RyYW5zXyA9IHNyY1RyYW5zOworICAgIGRzdFRyYW5zXyA9IGRzdFRyYW5zOworCisgICAgcmVhZEJ1ZmZlcl8gPSBuZXcgVE1lbW9yeUJ1ZmZlcihpbml0aWFsQnVmZmVyU2l6ZSk7CisgICAgd3JpdGVCdWZmZXJfID0gbmV3IFRNZW1vcnlCdWZmZXIoaW5pdGlhbEJ1ZmZlclNpemUpOworCisgICAgcGlwZVJlYWRzXyA9IHRydWU7CisgICAgcGlwZVdyaXRlc18gPSBmYWxzZTsKKyAgfQorCisgIGJvb2wgcGlwZVJlYWRzKCkgQHByb3BlcnR5IGNvbnN0IHsKKyAgICByZXR1cm4gcGlwZVJlYWRzXzsKKyAgfQorCisgIHZvaWQgcGlwZVJlYWRzKGJvb2wgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgcmVhZEJ1ZmZlcl8ucmVzZXQoKTsKKyAgICB9CisgICAgcGlwZVJlYWRzXyA9IHZhbHVlOworICB9CisKKyAgYm9vbCBwaXBlV3JpdGVzKCkgQHByb3BlcnR5IGNvbnN0IHsKKyAgICByZXR1cm4gcGlwZVdyaXRlc187CisgIH0KKworICB2b2lkIHBpcGVXcml0ZXMoYm9vbCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB3cml0ZUJ1ZmZlcl8ucmVzZXQoKTsKKyAgICB9CisgICAgcGlwZVdyaXRlc18gPSB2YWx1ZTsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgaXNPcGVuKCkgeworICAgIHJldHVybiBzcmNUcmFuc18uaXNPcGVuKCk7CisgIH0KKworICBvdmVycmlkZSBib29sIHBlZWsoKSB7CisgICAgcmV0dXJuIHNyY1RyYW5zXy5wZWVrKCk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIG9wZW4oKSB7CisgICAgc3JjVHJhbnNfLm9wZW4oKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgY2xvc2UoKSB7CisgICAgc3JjVHJhbnNfLmNsb3NlKCk7CisgIH0KKworICBvdmVycmlkZSBzaXplX3QgcmVhZCh1Ynl0ZVtdIGJ1ZikgeworICAgIGF1dG8gYnl0ZXNSZWFkID0gc3JjVHJhbnNfLnJlYWQoYnVmKTsKKworICAgIGlmIChwaXBlUmVhZHNfKSB7CisgICAgICByZWFkQnVmZmVyXy53cml0ZShidWZbMCAuLiBieXRlc1JlYWRdKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnl0ZXNSZWFkOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWRFbmQoKSB7CisgICAgaWYgKHBpcGVSZWFkc18pIHsKKyAgICAgIGF1dG8gZGF0YSA9IHJlYWRCdWZmZXJfLmdldENvbnRlbnRzKCk7CisgICAgICBkc3RUcmFuc18ud3JpdGUoZGF0YSk7CisgICAgICBkc3RUcmFuc18uZmx1c2goKTsKKyAgICAgIHJlYWRCdWZmZXJfLnJlc2V0KCk7CisKKyAgICAgIHNyY1RyYW5zXy5yZWFkRW5kKCk7CisKKyAgICAgIC8vIFJldHVybiBkYXRhLmxlbmd0aCBpbnN0ZWFkIG9mIHRoZSByZWFkRW5kKCkgcmVzdWx0IG9mIHRoZSBzb3VyY2UKKyAgICAgIC8vIHRyYW5zcG9ydHMgYmVjYXVzZSBpdCBtaWdodCBub3QgYmUgYXZhaWxhYmxlIGZyb20gaXQuCisgICAgICByZXR1cm4gZGF0YS5sZW5ndGg7CisgICAgfQorCisgICAgcmV0dXJuIHNyY1RyYW5zXy5yZWFkRW5kKCk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIHdyaXRlKGluIHVieXRlW10gYnVmKSB7CisgICAgaWYgKHBpcGVXcml0ZXNfKSB7CisgICAgICB3cml0ZUJ1ZmZlcl8ud3JpdGUoYnVmKTsKKyAgICB9CisKKyAgICBzcmNUcmFuc18ud3JpdGUoYnVmKTsKKyAgfQorCisgIG92ZXJyaWRlIHNpemVfdCB3cml0ZUVuZCgpIHsKKyAgICBpZiAocGlwZVdyaXRlc18pIHsKKyAgICAgIGF1dG8gZGF0YSA9IHdyaXRlQnVmZmVyXy5nZXRDb250ZW50cygpOworICAgICAgZHN0VHJhbnNfLndyaXRlKGRhdGEpOworICAgICAgZHN0VHJhbnNfLmZsdXNoKCk7CisgICAgICB3cml0ZUJ1ZmZlcl8ucmVzZXQoKTsKKworICAgICAgc3JjVHJhbnNfLndyaXRlRW5kKCk7CisKKyAgICAgIC8vIFJldHVybiBkYXRhLmxlbmd0aCBpbnN0ZWFkIG9mIHRoZSByZWFkRW5kKCkgcmVzdWx0IG9mIHRoZSBzb3VyY2UKKyAgICAgIC8vIHRyYW5zcG9ydHMgYmVjYXVzZSBpdCBtaWdodCBub3QgYmUgYXZhaWxhYmxlIGZyb20gaXQuCisgICAgICByZXR1cm4gZGF0YS5sZW5ndGg7CisgICAgfQorCisgICAgcmV0dXJuIHNyY1RyYW5zXy53cml0ZUVuZCgpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBmbHVzaCgpIHsKKyAgICBzcmNUcmFuc18uZmx1c2goKTsKKyAgfQorCitwcml2YXRlOgorICBTb3VyY2Ugc3JjVHJhbnNfOworICBUVHJhbnNwb3J0IGRzdFRyYW5zXzsKKworICBUTWVtb3J5QnVmZmVyIHJlYWRCdWZmZXJfOworICBUTWVtb3J5QnVmZmVyIHdyaXRlQnVmZmVyXzsKKworICBib29sIHBpcGVSZWFkc187CisgIGJvb2wgcGlwZVdyaXRlc187Cit9CisKKy8qKgorICogVFBpcGVkVHJhbnNwb3J0IGNvbnN0cnVjdGlvbiBoZWxwZXIgdG8gYXZvaWQgaGF2aW5nIHRvIGV4cGxpY2l0bHkKKyAqIHNwZWNpZnkgdGhlIHRyYW5zcG9ydCB0eXBlcywgaS5lLiB0byBhbGxvdyB0aGUgY29uc3RydWN0b3IgYmVpbmcgY2FsbGVkCisgKiB1c2luZyBJRlRJIChzZWUgJChETURCVUcgNjA4MiwgRCBCdWd6aWxsYSBlbmhhbmNlbWVudCByZXF1ZXN0IDYwODIpKS4KKyAqLworVFBpcGVkVHJhbnNwb3J0IVNvdXJjZSB0UGlwZWRUcmFuc3BvcnQoU291cmNlKSgKKyAgU291cmNlIHNyY1RyYW5zLCBUVHJhbnNwb3J0IGRzdFRyYW5zCispIGlmIChpc1RUcmFuc3BvcnQhU291cmNlKSB7CisgIHJldHVybiBuZXcgdHlwZW9mKHJldHVybikoc3JjVHJhbnMsIGRzdFRyYW5zKTsKK30KKwordmVyc2lvbiAodW5pdHRlc3QpIHsKKyAgLy8gRE1EIEBAQlVHQEA6IFVGQ1MgZm9yIHN0ZC5hcnJheS5lbXB0eSBkb2Vzbid0IHdvcmsgd2hlbiBpbXBvcnQgaXMgbW92ZWQKKyAgLy8gaW50byB1bml0dGVzdCBibG9jay4KKyAgaW1wb3J0IHN0ZC5hcnJheTsKKyAgaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworfQorCit1bml0dGVzdCB7CisgIGF1dG8gdW5kZXJseWluZyA9IG5ldyBUTWVtb3J5QnVmZmVyOworICBhdXRvIHBpcGVUYXJnZXQgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgYXV0byB0cmFucyA9IHRQaXBlZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCBwaXBlVGFyZ2V0KTsKKworICB1bmRlcmx5aW5nLndyaXRlKGNhc3QodWJ5dGVbXSkiYWJjZCIpOworCisgIHVieXRlWzRdIGJ1ZmZlcjsKKyAgdHJhbnMucmVhZEFsbChidWZmZXJbMCAuLiAyXSk7CisgIGVuZm9yY2UoYnVmZmVyWzAgLi4gMl0gPT0gImFiIik7CisgIGVuZm9yY2UocGlwZVRhcmdldC5nZXRDb250ZW50cygpLmVtcHR5KTsKKworICB0cmFucy5yZWFkRW5kKCk7CisgIGVuZm9yY2UocGlwZVRhcmdldC5nZXRDb250ZW50cygpID09ICJhYiIpOworICBwaXBlVGFyZ2V0LnJlc2V0KCk7CisKKyAgdW5kZXJseWluZy53cml0ZShjYXN0KHVieXRlW10pImVmIik7CisgIHRyYW5zLnJlYWRBbGwoYnVmZmVyWzAgLi4gMl0pOworICBlbmZvcmNlKGJ1ZmZlclswIC4uIDJdID09ICJjZCIpOworICBlbmZvcmNlKHBpcGVUYXJnZXQuZ2V0Q29udGVudHMoKS5lbXB0eSk7CisKKyAgdHJhbnMucmVhZEFsbChidWZmZXJbMCAuLiAyXSk7CisgIGVuZm9yY2UoYnVmZmVyWzAgLi4gMl0gPT0gImVmIik7CisgIGVuZm9yY2UocGlwZVRhcmdldC5nZXRDb250ZW50cygpLmVtcHR5KTsKKworICB0cmFucy5yZWFkRW5kKCk7CisgIGVuZm9yY2UocGlwZVRhcmdldC5nZXRDb250ZW50cygpID09ICJjZGVmIik7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9yYW5nZS5kIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvcmFuZ2UuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjFjZWExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvcmFuZ2UuZApAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFRyYW5zcG9ydHMgd2hpY2ggb3BlcmF0ZSBvbiBnZW5lcmljIEQgcmFuZ2VzLgorICovCittb2R1bGUgdGhyaWZ0LnRyYW5zcG9ydC5yYW5nZTsKKworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5OworaW1wb3J0IHN0ZC5yYW5nZTsKK2ltcG9ydCBzdGQudHJhaXRzIDogVW5xdWFsOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKKworLyoqCisgKiBBZGFwdHMgYW4gdWJ5dGUgaW5wdXQgcmFuZ2UgZm9yIHJlYWRpbmcgdmlhIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KKyAqCisgKiBUaGUgY2FzZSB3aGVyZSBSIGlzIGEgcGxhaW4gdWJ5dGVbXSBpcyByZWFzb25hYmx5IG9wdGltaXplZCwgc28gYSBwb3NzaWJsZQorICogdXNlIGNhc2UgZm9yIFRJbnB1dFJhbmdlVHJhbnNwb3J0IHdvdWxkIGJlIHRvIGRlc2VyaWFsaXplIHNvbWUgZGF0YSBoZWxkIGluCisgKiBhIG1lbW9yeSBidWZmZXIuCisgKi8KK2ZpbmFsIGNsYXNzIFRJbnB1dFJhbmdlVHJhbnNwb3J0KFIpIGlmICgKKyAgaXNJbnB1dFJhbmdlIShVbnF1YWwhUikgJiYgaXMoRWxlbWVudFR5cGUhUiA6IGNvbnN0KHVieXRlKSkKKykgOiBUQmFzZVRyYW5zcG9ydCB7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgZGF0YSA9IFRoZSBpbnB1dCByYW5nZSB0byB1c2UgYXMgZGF0YS4KKyAgICovCisgIHRoaXMoUiBkYXRhKSB7CisgICAgZGF0YV8gPSBkYXRhOworICB9CisKKyAgLyoqCisgICAqIEFuIGlucHV0IHJhbmdlIHRyYW5zcG9ydCBpcyBhbHdheXMgb3Blbi4KKyAgICovCisgIG92ZXJyaWRlIGJvb2wgaXNPcGVuKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgcGVlaygpIHsKKyAgICByZXR1cm4gIWRhdGFfLmVtcHR5OworICB9CisKKyAgLyoqCisgICAqIE9wZW5pbmcgaXMgYSBuby1vcCgpIGZvciBhbiBpbnB1dCByYW5nZSB0cmFuc3BvcnQuCisgICAqLworICBvdmVycmlkZSB2b2lkIG9wZW4oKSB7fQorCisgIC8qKgorICAgKiBDbG9zaW5nIGlzIGEgbm8tb3AoKSBmb3IgYSBtZW1vcnkgYnVmZmVyLgorICAgKi8KKyAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHt9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWQodWJ5dGVbXSBidWYpIHsKKyAgICBhdXRvIGRhdGEgPSBkYXRhXy50YWtlKGJ1Zi5sZW5ndGgpOworICAgIGF1dG8gYnl0ZXMgPSBkYXRhLmxlbmd0aDsKKworICAgIHN0YXRpYyBpZiAoaXModHlwZW9mKFIuaW5pdFsxIC4uIDJdKSA6IGNvbnN0KHVieXRlKVtdKSkgeworICAgICAgLy8gcHV0KCkgaXMgY3VycmVudGx5IHVubmVjZXNzYXJpbHkgc2xvdyBpZiBib3RoIHJhbmdlcyBhcmUgc2xpY2VhYmxlLgorICAgICAgYnVmWzAgLi4gYnl0ZXNdID0gZGF0YVtdOworICAgICAgZGF0YV8gPSBkYXRhX1tieXRlcyAuLiAkXTsKKyAgICB9IGVsc2UgeworICAgICAgYnVmLnB1dChkYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnl0ZXM7CisgIH0KKworICAvKioKKyAgICogU2hvcnRjdXQgdmVyc2lvbiBvZiByZWFkQWxsKCkgZm9yIHNsaWNhYmxlIHJhbmdlcy4KKyAgICoKKyAgICogQmVjYXVzZSByZWFkQWxsKCkgaXMgdHlwaWNhbGx5IGEgdmVyeSBob3QgcGF0aCBkdXJpbmcgZGVzZXJpYWxpemF0aW9uLAorICAgKiB1c2luZyB0aGlzIG92ZXIgVEJhc2VUcmFuc3BvcnQucmVhZEFsbCgpIGdpdmVzIHVzIGEgbmljZSBpbmNyZWFzZSBpbgorICAgKiBzcGVlZCBkdWUgdG8gdGhlIHJlZHVjZWQgYW1vdW50IG9mIGluZGlyZWN0aW9ucy4KKyAgICovCisgIG92ZXJyaWRlIHZvaWQgcmVhZEFsbCh1Ynl0ZVtdIGJ1ZikgeworICAgIHN0YXRpYyBpZiAoaXModHlwZW9mKFIuaW5pdFsxIC4uIDJdKSA6IGNvbnN0KHVieXRlKVtdKSkgeworICAgICAgaWYgKGJ1Zi5sZW5ndGggPD0gZGF0YV8ubGVuZ3RoKSB7CisgICAgICAgIGJ1ZltdID0gZGF0YV9bMCAuLiBidWYubGVuZ3RoXTsKKyAgICAgICAgZGF0YV8gPSBkYXRhX1tidWYubGVuZ3RoIC4uICRdOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgIHN1cGVyLnJlYWRBbGwoYnVmKTsKKyAgfQorCisgIG92ZXJyaWRlIGNvbnN0KHVieXRlKVtdIGJvcnJvdyh1Ynl0ZSogYnVmLCBzaXplX3QgbGVuKSB7CisgICAgc3RhdGljIGlmIChpcyhSIDogY29uc3QodWJ5dGUpW10pKSB7CisgICAgICAvLyBDYW4gb25seSBib3Jyb3cgaWYgb3VyIGRhdGEgdHlwZSBpcyBhY3R1YWxseSBhbiB1Ynl0ZSBhcnJheS4KKyAgICAgIGlmIChsZW4gPD0gZGF0YV8ubGVuZ3RoKSB7CisgICAgICAgIHJldHVybiBkYXRhXzsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGNvbnN1bWUoc2l6ZV90IGxlbikgeworICAgIHN0YXRpYyBpZiAoaXMoUiA6IGNvbnN0KHVieXRlKVtdKSkgeworICAgICAgaWYgKGxlbiA+IGRhdGFfLmxlbmd0aCkgeworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiSW52YWxpZCBjb25zdW1lIGxlbmd0aCIsCisgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkJBRF9BUkdTKTsKKyAgICAgIH0KKyAgICAgIGRhdGFfID0gZGF0YV9bbGVuIC4uICRdOworICAgIH0gZWxzZSB7CisgICAgICBzdXBlci5jb25zdW1lKGxlbik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFNldHMgYSBuZXcgZGF0YSByYW5nZSB0byB1c2UuCisgICAqLworICB2b2lkIHJlc2V0KFIgZGF0YSkgeworICAgIGRhdGFfID0gZGF0YTsKKyAgfQorCitwcml2YXRlOgorICBSIGRhdGFfOworfQorCisvKioKKyAqIFRJbnB1dFJhbmdlVHJhbnNwb3J0IGNvbnN0cnVjdGlvbiBoZWxwZXIgdG8gYXZvaWQgaGF2aW5nIHRvIGV4cGxpY2l0bHkKKyAqIHNwZWNpZnkgdGhlIGFyZ3VtZW50IHR5cGUsIGkuZS4gdG8gYWxsb3cgdGhlIGNvbnN0cnVjdG9yIGJlaW5nIGNhbGxlZCB1c2luZworICogSUZUSSAoc2VlICQoTElOSzIgaHR0cDovL2QucHVyZW1hZ2ljLmNvbS9pc3N1ZXMvc2hvd19idWcuY2dpP2lkPTYwODIsIEQKKyAqIEJ1Z3ppbGxhIGVuaGFuY2VtZW50IHJlcXVldCA2MDgyKSkuCisgKi8KK1RJbnB1dFJhbmdlVHJhbnNwb3J0IVIgdElucHV0UmFuZ2VUcmFuc3BvcnQoUikoUiBkYXRhKSBpZiAoCisgIGlzIChUSW5wdXRSYW5nZVRyYW5zcG9ydCFSKQorKSB7CisgIHJldHVybiBuZXcgVElucHV0UmFuZ2VUcmFuc3BvcnQhUihkYXRhKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3NvY2tldC5kIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvc29ja2V0LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiMzhkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3NvY2tldC5kCkBAIC0wLDAgKzEsNDU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQ7CisKK2ltcG9ydCBjb3JlLnN0ZGMuZXJybm86IEVDT05OUkVTRVQ7CitpbXBvcnQgY29yZS50aHJlYWQgOiBUaHJlYWQ7CitpbXBvcnQgY29yZS50aW1lIDogZHVyLCBEdXJhdGlvbjsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eTsKK2ltcG9ydCBzdGQuY29udiA6IHRleHQsIHRvOworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHN0ZC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5zb2NrZXQ7CisKKy8qKgorICogQ29tbW9uIHBhcnRzIG9mIGEgc29ja2V0IFRUcmFuc3BvcnQgaW1wbGVtZW50YXRpb24sIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZQorICogYWN0dWFsIEkvTyBpcyBwZXJmb3JtZWQgKHN5bmMvYXN5bmMpLgorICovCithYnN0cmFjdCBjbGFzcyBUU29ja2V0QmFzZSA6IFRCYXNlVHJhbnNwb3J0IHsKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yIHRoYXQgdGFrZXMgYW4gYWxyZWFkeSBjcmVhdGVkLCBjb25uZWN0ZWQgKCEpIHNvY2tldC4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHNvY2tldCA9IEFscmVhZHkgY3JlYXRlZCwgY29ubmVjdGVkIHNvY2tldCBvYmplY3QuCisgICAqLworICB0aGlzKFNvY2tldCBzb2NrZXQpIHsKKyAgICBzb2NrZXRfID0gc29ja2V0OworICAgIHNldFNvY2tldE9wdHMoKTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IHVuY29ubmVjdGVkIHNvY2tldCB0aGF0IHdpbGwgY29ubmVjdCB0byB0aGUgZ2l2ZW4gaG9zdAorICAgKiBvbiB0aGUgZ2l2ZW4gcG9ydC4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGhvc3QgPSBSZW1vdGUgaG9zdC4KKyAgICogICBwb3J0ID0gUmVtb3RlIHBvcnQuCisgICAqLworICB0aGlzKHN0cmluZyBob3N0LCB1c2hvcnQgcG9ydCkgeworICAgIGhvc3RfID0gaG9zdDsKKyAgICBwb3J0XyA9IHBvcnQ7CisgIH0KKworICAvKioKKyAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQuCisgICAqLworICBvdmVycmlkZSBib29sIGlzT3BlbigpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHNvY2tldF8gIWlzIG51bGw7CisgIH0KKworICAvKioKKyAgICogV3JpdGVzIGFzIG11Y2ggZGF0YSB0byB0aGUgc29ja2V0IGFzIHRoZXJlIGNhbiBiZSBpbiBhIHNpbmdsZSBPUyBjYWxsLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgYnVmID0gRGF0YSB0byB3cml0ZS4KKyAgICoKKyAgICogUmV0dXJuczogVGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4gTmV2ZXIgbW9yZSB0aGFuIGJ1Zi5sZW5ndGguCisgICAqLworICBhYnN0cmFjdCBzaXplX3Qgd3JpdGVTb21lKGluIHVieXRlW10gYnVmKSBvdXQgKHdyaXR0ZW4pIHsKKyAgICAvLyBETUQgQEBCVUdAQDogRW5hYmxpbmcgdGhpcyBlLmcuIGZhaWxzIHRoZSBjb250cmFjdCBpbiB0aGUKKyAgICAvLyBhc3luY190ZXN0X3NlcnZlciwgYmVjYXVzZSBidWYubGVuZ3RoIGV2YWx1YXRlcyB0byAwIGhlcmUsIGV2ZW4gdGhvdWdoCisgICAgLy8gaW4gdGhlIG1ldGhvZCBib2R5IGl0IGNvcnJlY3RseSBpcyAyNyAoZXF1YWwgdG8gdGhlIHJldHVybiB2YWx1ZSkuCisgICAgdmVyc2lvbiAobm9uZSkgYXNzZXJ0KHdyaXR0ZW4gPD0gYnVmLmxlbmd0aCwgdGV4dCgiSW1wbGVtZW50YXRpb24gd3JvdGUgIiB+CisgICAgICAibW9yZSBkYXRhIHRoYW4gcmVxdWVzdGVkIHRvPyEgKCIsIHdyaXR0ZW4sICIgdnMuICIsIGJ1Zi5sZW5ndGgsICIpIikpOworICB9IGJvZHkgeworICAgIGFzc2VydCgwLCAiRE1EIGJ1Zz8g4oCTIFdoeSB3b3VsZCBjb250cmFjdHMgd29yayBmb3IgaW50ZXJmYWNlcywgYnV0IG5vdCAiIH4KKyAgICAgICJmb3IgYWJzdHJhY3QgbWV0aG9kcz8gIiB+CisgICAgICAiKEVycm9yOiBmdW5jdGlvbiBb4oCmXSBpbiBhbmQgb3V0IGNvbnRyYWN0cyByZXF1aXJlIGZ1bmN0aW9uIGJvZHkiKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBhY3R1YWwgYWRkcmVzcyBvZiB0aGUgcGVlciB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCB0by4KKyAgICoKKyAgICogSW4gY29udHJhc3QsIHRoZSBob3N0IGFuZCBwb3J0IHByb3BlcnRpZXMgY29udGFpbiB0aGUgYWRkcmVzcyB1c2VkIHRvCisgICAqIGVzdGFibGlzaCB0aGUgY29ubmVjdGlvbiwgYW5kIGFyZSBub3QgdXBkYXRlZCBhZnRlciB0aGUgY29ubmVjdGlvbi4KKyAgICoKKyAgICogVGhlIHNvY2tldCBtdXN0IGJlIG9wZW4gd2hlbiBjYWxsaW5nIHRoaXMuCisgICAqLworICBBZGRyZXNzIGdldFBlZXJBZGRyZXNzKCkgeworICAgIGVuZm9yY2UoaXNPcGVuLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ2Fubm90IGdldCBwZWVyIGhvc3QgZm9yICIgfgorICAgICAgImNsb3NlZCBzb2NrZXQuIiwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisKKyAgICBpZiAoIXBlZXJBZGRyZXNzXykgeworICAgICAgcGVlckFkZHJlc3NfID0gc29ja2V0Xy5yZW1vdGVBZGRyZXNzKCk7CisgICAgICBhc3NlcnQocGVlckFkZHJlc3NfKTsKKyAgICB9CisKKyAgICByZXR1cm4gcGVlckFkZHJlc3NfOworICB9CisKKyAgLyoqCisgICAqIFRoZSBob3N0IHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvIG9yIHdpbGwgY29ubmVjdCB0by4gTnVsbCBpZiBhbgorICAgKiBhbHJlYWR5IGNvbm5lY3RlZCBzb2NrZXQgd2FzIHVzZWQgdG8gY29uc3RydWN0IHRoZSBvYmplY3QuCisgICAqLworICBzdHJpbmcgaG9zdCgpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIGhvc3RfOworICB9CisKKyAgLyoqCisgICAqIFRoZSBwb3J0IHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvIG9yIHdpbGwgY29ubmVjdCB0by4gWmVybyBpZiBhbgorICAgKiBhbHJlYWR5IGNvbm5lY3RlZCBzb2NrZXQgd2FzIHVzZWQgdG8gY29uc3RydWN0IHRoZSBvYmplY3QuCisgICAqLworICB1c2hvcnQgcG9ydCgpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHBvcnRfOworICB9CisKKyAgLy8vIFRoZSBzb2NrZXQgc2VuZCB0aW1lb3V0LgorICBEdXJhdGlvbiBzZW5kVGltZW91dCgpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHNlbmRUaW1lb3V0XzsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIHNlbmRUaW1lb3V0KER1cmF0aW9uIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHNlbmRUaW1lb3V0XyA9IHZhbHVlOworICB9CisKKyAgLy8vIFRoZSBzb2NrZXQgcmVjZWl2aW5nIHRpbWVvdXQuIFZhbHVlcyBzbWFsbGVyIHRoYW4gNTAwIG1zIGFyZSBub3QKKyAgLy8vIHN1cHBvcnRlZCBvbiBXaW5kb3dzLgorICBEdXJhdGlvbiByZWN2VGltZW91dCgpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHJlY3ZUaW1lb3V0XzsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIHJlY3ZUaW1lb3V0KER1cmF0aW9uIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHJlY3ZUaW1lb3V0XyA9IHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIE9TIGhhbmRsZSBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuCisgICAqCisgICAqIFNob3VsZCBub3QgdXN1YWxseSBiZSB1c2VkIGRpcmVjdGx5LCBidXQgYWNjZXNzIHRvIGl0IGNhbiBiZSBuZWNlc3NhcnkKKyAgICogdG8gaW50ZXJmYWNlIHdpdGggQyBsaWJyYXJpZXMuCisgICAqLworICB0eXBlb2Yoc29ja2V0Xy5oYW5kbGUoKSkgc29ja2V0SGFuZGxlKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gc29ja2V0Xy5oYW5kbGUoKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBTZXRzIHRoZSBuZWVkZWQgc29ja2V0IG9wdGlvbnMuCisgICAqLworICB2b2lkIHNldFNvY2tldE9wdHMoKSB7CisgICAgdHJ5IHsKKyAgICAgIGFsaWFzIFNvY2tldE9wdGlvbkxldmVsLlNPQ0tFVCBsdmxTb2NrOworICAgICAgTGluZ2VyIGw7CisgICAgICBsLm9uID0gMDsKKyAgICAgIGwudGltZSA9IDA7CisgICAgICBzb2NrZXRfLnNldE9wdGlvbihsdmxTb2NrLCBTb2NrZXRPcHRpb24uTElOR0VSLCBsKTsKKyAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgeworICAgICAgbG9nRXJyb3IoIkNvdWxkIG5vdCBzZXQgc29ja2V0IG9wdGlvbjogJXMiLCBlKTsKKyAgICB9CisKKyAgICAvLyBKdXN0IHRyeSB0byBkaXNhYmxlIE5hZ2xlJ3MgYWxnb3JpdGhtIOKAkyB0aGlzIHdpbGwgZmFpbCBpZiB3ZSBhcmUgcGFzc2VkCisgICAgLy8gaW4gYSBub24tVENQIHNvY2tldCB2aWEgdGhlIFNvY2tldC1hY2NlcHRpbmcgY29uc3RydWN0b3IuCisgICAgdHJ5IHsKKyAgICAgIHNvY2tldF8uc2V0T3B0aW9uKFNvY2tldE9wdGlvbkxldmVsLlRDUCwgU29ja2V0T3B0aW9uLlRDUF9OT0RFTEFZLCB0cnVlKTsKKyAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkge30KKyAgfQorCisgIC8vLyBSZW1vdGUgaG9zdC4KKyAgc3RyaW5nIGhvc3RfOworCisgIC8vLyBSZW1vdGUgcG9ydC4KKyAgdXNob3J0IHBvcnRfOworCisgIC8vLyBUaW1lb3V0IGZvciBzZW5kaW5nLgorICBEdXJhdGlvbiBzZW5kVGltZW91dF87CisKKyAgLy8vIFRpbWVvdXQgZm9yIHJlY2VpdmluZy4KKyAgRHVyYXRpb24gcmVjdlRpbWVvdXRfOworCisgIC8vLyBDYWNoZWQgcGVlciBhZGRyZXNzLgorICBBZGRyZXNzIHBlZXJBZGRyZXNzXzsKKworICAvLy8gQ2FjaGVkIHBlZXIgaG9zdCBuYW1lLgorICBzdHJpbmcgcGVlckhvc3RfOworCisgIC8vLyBDYWNoZWQgcGVlciBwb3J0LgorICB1c2hvcnQgcGVlclBvcnRfOworCisgIC8vLyBXcmFwcGVkIHNvY2tldCBvYmplY3QuCisgIFNvY2tldCBzb2NrZXRfOworfQorCisvKioKKyAqIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCisgKgorICogRHVlIHRvIHRoZSBsaW1pdGF0aW9ucyBvZiBzdGQuc29ja2V0LCBjdXJyZW50bHkgb25seSBUQ1AvSVAgc29ja2V0cyBhcmUKKyAqIHN1cHBvcnRlZCAoaS5lLiBVbml4IGRvbWFpbiBzb2NrZXRzIGFyZSBub3QpLgorICovCitjbGFzcyBUU29ja2V0IDogVFNvY2tldEJhc2UgeworICAvLy8KKyAgdGhpcyhTb2NrZXQgc29ja2V0KSB7CisgICAgc3VwZXIoc29ja2V0KTsKKyAgfQorCisgIC8vLworICB0aGlzKHN0cmluZyBob3N0LCB1c2hvcnQgcG9ydCkgeworICAgIHN1cGVyKGhvc3QsIHBvcnQpOworICB9CisKKyAgLyoqCisgICAqIENvbm5lY3RzIHRoZSBzb2NrZXQuCisgICAqLworICBvdmVycmlkZSB2b2lkIG9wZW4oKSB7CisgICAgaWYgKGlzT3BlbikgcmV0dXJuOworCisgICAgZW5mb3JjZSghaG9zdF8uZW1wdHksIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCBvcGVuIHNvY2tldCB0byBudWxsIGhvc3QuIiwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisgICAgZW5mb3JjZShwb3J0XyAhPSAwLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3Qgb3BlbiBzb2NrZXQgdG8gcG9ydCB6ZXJvLiIsIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTikpOworCisgICAgQWRkcmVzc1tdIGFkZHJzOworICAgIHRyeSB7CisgICAgICBhZGRycyA9IGdldEFkZHJlc3MoaG9zdF8sIHBvcnRfKTsKKyAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCByZXNvbHZlIGdpdmVuIGhvc3Qgc3RyaW5nLiIsCisgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTiwgX19GSUxFX18sIF9fTElORV9fLCBlKTsKKyAgICB9CisKKyAgICBFeGNlcHRpb25bXSBlcnJvcnM7CisgICAgZm9yZWFjaCAoYWRkcjsgYWRkcnMpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHNvY2tldF8gPSBuZXcgVGNwU29ja2V0KGFkZHIuYWRkcmVzc0ZhbWlseSk7CisgICAgICAgIHNldFNvY2tldE9wdHMoKTsKKyAgICAgICAgc29ja2V0Xy5jb25uZWN0KGFkZHIpOworICAgICAgICBicmVhazsKKyAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGVycm9ycyB+PSBlOworICAgICAgfQorICAgIH0KKyAgICBpZiAoZXJyb3JzLmxlbmd0aCA9PSBhZGRycy5sZW5ndGgpIHsKKyAgICAgIHNvY2tldF8gPSBudWxsOworICAgICAgLy8gTmVlZCB0byB0aHJvdyBhIFRUcmFuc3BvcnRFeGNlcHRpb24gdG8gYWJpZGUgdGhlIFRUcmFuc3BvcnQgQVBJLgorICAgICAgaW1wb3J0IHN0ZC5hbGdvcml0aG0sIHN0ZC5yYW5nZTsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICB0ZXh0KCJGYWlsZWQgdG8gY29ubmVjdCB0byAiLCBob3N0XywgIjoiLCBwb3J0XywgIi4iKSwKKyAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOLAorICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sCisgICAgICAgIG5ldyBUQ29tcG91bmRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgdGV4dCgKKyAgICAgICAgICAgICJBbGwgYWRkcmVzc2VzIHRyaWVkIGZhaWxlZCAoIiwKKyAgICAgICAgICAgIGpvaW5lcihtYXAhcXt0ZXh0KGFbMF0sIGA6ICJgLCBhWzFdLm1zZywgYCJgKX0oemlwKGFkZHJzLCBlcnJvcnMpKSwgIiwgIiksCisgICAgICAgICAgICAiKS4iCisgICAgICAgICAgKSwKKyAgICAgICAgICBlcnJvcnMKKyAgICAgICAgKQorICAgICAgKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQ2xvc2VzIHRoZSBzb2NrZXQuCisgICAqLworICBvdmVycmlkZSB2b2lkIGNsb3NlKCkgeworICAgIGlmICghaXNPcGVuKSByZXR1cm47CisKKyAgICBzb2NrZXRfLmNsb3NlKCk7CisgICAgc29ja2V0XyA9IG51bGw7CisgIH0KKworICBvdmVycmlkZSBib29sIHBlZWsoKSB7CisgICAgaWYgKCFpc09wZW4pIHJldHVybiBmYWxzZTsKKworICAgIHVieXRlIGJ1ZjsKKyAgICBhdXRvIHIgPSBzb2NrZXRfLnJlY2VpdmUoKCZidWYpWzAgLi4gMV0sIFNvY2tldEZsYWdzLlBFRUspOworICAgIGlmIChyID09IC0xKSB7CisgICAgICBhdXRvIGxhc3RFcnJubyA9IGdldFNvY2tldEVycm5vKCk7CisgICAgICBzdGF0aWMgaWYgKGNvbm5yZXNldE9uUGVlclNodXRkb3duKSB7CisgICAgICAgIGlmIChsYXN0RXJybm8gPT0gRUNPTk5SRVNFVCkgeworICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUGVla2luZyBpbnRvIHNvY2tldCBmYWlsZWQ6ICIgfgorICAgICAgICBzb2NrZXRFcnJub1N0cmluZyhsYXN0RXJybm8pLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuVU5LTk9XTik7CisgICAgfQorICAgIHJldHVybiAociA+IDApOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWQodWJ5dGVbXSBidWYpIHsKKyAgICBlbmZvcmNlKGlzT3BlbiwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiQ2Fubm90IHJlYWQgaWYgc29ja2V0IGlzIG5vdCBvcGVuLiIsIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTikpOworCisgICAgdHlwZW9mKGdldFNvY2tldEVycm5vKCkpIGxhc3RFcnJubzsKKyAgICB1c2hvcnQgdHJpZXM7CisgICAgd2hpbGUgKHRyaWVzKysgPD0gbWF4UmVjdlJldHJpZXNfKSB7CisgICAgICBhdXRvIHIgPSBzb2NrZXRfLnJlY2VpdmUoY2FzdCh2b2lkW10pYnVmKTsKKworICAgICAgLy8gSWYgcmVjdiB3ZW50IGZpbmUsIGltbWVkaWF0ZWx5IHJldHVybi4KKyAgICAgIGlmIChyID49IDApIHJldHVybiByOworCisgICAgICAvLyBTb21ldGhpbmcgd2VudCB3cm9uZywgZmluZCBvdXQgaG93IHRvIGhhbmRsZSBpdC4KKyAgICAgIGxhc3RFcnJubyA9IGdldFNvY2tldEVycm5vKCk7CisKKyAgICAgIGlmIChsYXN0RXJybm8gPT0gSU5URVJSVVBURURfRVJSTk8pIHsKKyAgICAgICAgLy8gSWYgdGhlIHN5c2NhbGwgd2FzIGludGVycnVwdGVkLCBqdXN0IHRyeSBhZ2Fpbi4KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBpZiAoY29ubnJlc2V0T25QZWVyU2h1dGRvd24pIHsKKyAgICAgICAgLy8gU2VlIHRvcCBjb21tZW50LgorICAgICAgICBpZiAobGFzdEVycm5vID09IEVDT05OUkVTRVQpIHsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBOb3QgYW4gZXJyb3Igd2hpY2ggaXMgaGFuZGxlZCBpbiBhIHNwZWNpYWwgd2F5LCBqdXN0IGxlYXZlIHRoZSBsb29wLgorICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGlzU29ja2V0Q2xvc2VFcnJubyhsYXN0RXJybm8pKSB7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlJlY2VpdmluZyBmYWlsZWQsIGNsb3Npbmcgc29ja2V0OiAiIH4KKyAgICAgICAgc29ja2V0RXJybm9TdHJpbmcobGFzdEVycm5vKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKTsKKyAgICB9IGVsc2UgaWYgKGxhc3RFcnJubyA9PSBUSU1FT1VUX0VSUk5PKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuVElNRURfT1VUKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlJlY2VpdmluZyBmcm9tIHNvY2tldCBmYWlsZWQ6ICIgfgorICAgICAgICBzb2NrZXRFcnJub1N0cmluZyhsYXN0RXJybm8pLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuVU5LTk9XTik7CisgICAgfQorICB9CisKKyAgb3ZlcnJpZGUgdm9pZCB3cml0ZShpbiB1Ynl0ZVtdIGJ1ZikgeworICAgIHNpemVfdCBzZW50OworICAgIHdoaWxlIChzZW50IDwgYnVmLmxlbmd0aCkgeworICAgICAgYXV0byBiID0gd3JpdGVTb21lKGJ1ZltzZW50IC4uICRdKTsKKyAgICAgIGlmIChiID09IDApIHsKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaWYgdGhlIHRpbWVvdXQgc2V0IHdpdGggU09fU05EVElNRU8gZXhwaXJlZC4KKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oInNlbmQoKSB0aW1lb3V0IGV4cGlyZWQuIiwKKyAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuVElNRURfT1VUKTsKKyAgICAgIH0KKyAgICAgIHNlbnQgKz0gYjsKKyAgICB9CisgICAgYXNzZXJ0KHNlbnQgPT0gYnVmLmxlbmd0aCk7CisgIH0KKworICBvdmVycmlkZSBzaXplX3Qgd3JpdGVTb21lKGluIHVieXRlW10gYnVmKSB7CisgICAgZW5mb3JjZShpc09wZW4sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCB3cml0ZSBpZiBmaWxlIGlzIG5vdCBvcGVuLiIsIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTikpOworCisgICAgYXV0byByID0gc29ja2V0Xy5zZW5kKGJ1Zik7CisKKyAgICAvLyBFdmVyeXRoaW5nIHdlbnQgd2VsbCwganVzdCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgorICAgIGlmIChyID4gMCkgcmV0dXJuIHI7CisKKyAgICAvLyBIYW5kbGUgZXJyb3IgY29uZGl0aW9ucy4KKyAgICBpZiAociA8IDApIHsKKyAgICAgIGF1dG8gbGFzdEVycm5vID0gZ2V0U29ja2V0RXJybm8oKTsKKworICAgICAgaWYgKGxhc3RFcnJubyA9PSBXT1VMRF9CTE9DS19FUlJOTykgeworICAgICAgICAvLyBOb3QgYW4gZXhjZXB0aW9uYWwgZXJyb3IgcGVyIHNlIOKAkyBldmVuIHdpdGggYmxvY2tpbmcgc29ja2V0cywKKyAgICAgICAgLy8gRUFHQUlOIGFwcGFyZW50bHkgaXMgcmV0dXJuZWQgc29tZXRpbWVzIG9uIG91dC1vZi1yZXNvdXJjZQorICAgICAgICAvLyBjb25kaXRpb25zIChzZWUgdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiBmb3IgZGV0YWlscykuIEFsc28sIHRoaXMKKyAgICAgICAgLy8gYWxsb3dzIHVzaW5nIFRTb2NrZXQgd2l0aCBub24tYmxvY2tpbmcgc29ja2V0cyBlLmcuIGluCisgICAgICAgIC8vIFROb25ibG9ja2luZ1NlcnZlci4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIGF1dG8gdHlwZSA9IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5VTktOT1dOOworICAgICAgaWYgKGlzU29ja2V0Q2xvc2VFcnJubyhsYXN0RXJybm8pKSB7CisgICAgICAgIHR5cGUgPSBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU47CisgICAgICAgIGNsb3NlKCk7CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJTZW5kaW5nIHRvIHNvY2tldCBmYWlsZWQ6ICIgfgorICAgICAgICBzb2NrZXRFcnJub1N0cmluZyhsYXN0RXJybm8pLCB0eXBlKTsKKyAgICB9CisKKyAgICAvLyBzZW5kKCkgc2hvdWxkIG5ldmVyIHJldHVybiAwLgorICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJTZW5kaW5nIHRvIHNvY2tldCBmYWlsZWQgKDAgYnl0ZXMgd3JpdHRlbikuIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5VTktOT1dOKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgc2VuZFRpbWVvdXQoRHVyYXRpb24gdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgc3VwZXIuc2VuZFRpbWVvdXQodmFsdWUpOworICAgIHNldFRpbWVvdXQoU29ja2V0T3B0aW9uLlNORFRJTUVPLCB2YWx1ZSk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIHJlY3ZUaW1lb3V0KER1cmF0aW9uIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHN1cGVyLnJlY3ZUaW1lb3V0KHZhbHVlKTsKKyAgICBzZXRUaW1lb3V0KFNvY2tldE9wdGlvbi5SQ1ZUSU1FTywgdmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIE1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgZm9yIHJlY2VpdmluZyBmcm9tIHNvY2tldCBvbiByZWFkKCkgaW4gY2FzZSBvZgorICAgKiBFQUdBSU4vRUlOVFIuCisgICAqLworICB1c2hvcnQgbWF4UmVjdlJldHJpZXMoKSBAcHJvcGVydHkgY29uc3QgeworICAgIHJldHVybiBtYXhSZWN2UmV0cmllc187CisgIH0KKworICAvLy8gRGl0dG8KKyAgdm9pZCBtYXhSZWN2UmV0cmllcyh1c2hvcnQgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgbWF4UmVjdlJldHJpZXNfID0gdmFsdWU7CisgIH0KKworICAvLy8gRGl0dG8KKyAgZW51bSBERUZBVUxUX01BWF9SRUNWX1JFVFJJRVMgPSA1OworCitwcm90ZWN0ZWQ6CisgIG92ZXJyaWRlIHZvaWQgc2V0U29ja2V0T3B0cygpIHsKKyAgICBzdXBlci5zZXRTb2NrZXRPcHRzKCk7CisgICAgc2V0VGltZW91dChTb2NrZXRPcHRpb24uU05EVElNRU8sIHNlbmRUaW1lb3V0Xyk7CisgICAgc2V0VGltZW91dChTb2NrZXRPcHRpb24uUkNWVElNRU8sIHJlY3ZUaW1lb3V0Xyk7CisgIH0KKworICB2b2lkIHNldFRpbWVvdXQoU29ja2V0T3B0aW9uIHR5cGUsIER1cmF0aW9uIHZhbHVlKSB7CisgICAgYXNzZXJ0KHR5cGUgPT0gU29ja2V0T3B0aW9uLlNORFRJTUVPIHx8IHR5cGUgPT0gU29ja2V0T3B0aW9uLlJDVlRJTUVPKTsKKyAgICB2ZXJzaW9uIChXaW4zMikgeworICAgICAgaWYgKHZhbHVlID4gZHVyISJobnNlY3MiKDApICYmIHZhbHVlIDwgZHVyISJtc2VjcyIoNTAwKSkgeworICAgICAgICBsb2dFcnJvcigKKyAgICAgICAgICAiU29ja2V0ICVzIHRpbWVvdXQgb2YgJXMgbXMgbWlnaHQgYmUgcmFpc2VkIHRvIDUwMCBtcyBvbiBXaW5kb3dzLiIsCisgICAgICAgICAgKHR5cGUgPT0gU29ja2V0T3B0aW9uLlNORFRJTUVPKSA/ICJzZW5kIiA6ICJyZWNlaXZlIiwKKyAgICAgICAgICB2YWx1ZS50b3RhbCEibXNlY3MiCisgICAgICAgICk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHNvY2tldF8pIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHNvY2tldF8uc2V0T3B0aW9uKFNvY2tldE9wdGlvbkxldmVsLlNPQ0tFVCwgdHlwZSwgdmFsdWUpOworICAgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgdGltZW91dC4iLAorICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5VTktOT1dOLAorICAgICAgICAgIF9fRklMRV9fLAorICAgICAgICAgIF9fTElORV9fLAorICAgICAgICAgIGUKKyAgICAgICAgKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLy8gTWF4aW11bSBudW1iZXIgb2YgcmVjdigpIHJldHJpZXMuCisgIHVzaG9ydCBtYXhSZWN2UmV0cmllc18gID0gREVGQVVMVF9NQVhfUkVDVl9SRVRSSUVTOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvc3NsLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9zc2wuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGNlNDBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvc3NsLmQKQEAgLTAsMCArMSw2OTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBPcGVuU1NMIHNvY2tldCBpbXBsZW1lbnRhdGlvbiwgaW4gbGFyZ2UgcGFydHMgcG9ydGVkIGZyb20gQysrLgorICovCittb2R1bGUgdGhyaWZ0LnRyYW5zcG9ydC5zc2w7CisKK2ltcG9ydCBjb3JlLmV4Y2VwdGlvbiA6IG9uT3V0T2ZNZW1vcnlFcnJvcjsKK2ltcG9ydCBjb3JlLnN0ZGMuZXJybm8gOiBlcnJubywgRUlOVFI7CitpbXBvcnQgY29yZS5zeW5jLm11dGV4IDogTXV0ZXg7CitpbXBvcnQgY29yZS5tZW1vcnkgOiBHQzsKK2ltcG9ydCBjb3JlLnN0ZGMuY29uZmlnOworaW1wb3J0IGNvcmUuc3RkYy5zdGRsaWIgOiBmcmVlLCBtYWxsb2M7CitpbXBvcnQgc3RkLmFzY2lpIDogdG9VcHBlcjsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eSwgZnJvbnQsIHBvcEZyb250OworaW1wb3J0IHN0ZC5jb252IDogZW1wbGFjZSwgdG87CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgc3RkLnNvY2tldCA6IEFkZHJlc3MsIEludGVybmV0QWRkcmVzcywgSW50ZXJuZXQ2QWRkcmVzcywgU29ja2V0OworaW1wb3J0IHN0ZC5zdHJpbmcgOiB0b1N0cmluZ3o7CitpbXBvcnQgZGVpbW9zLm9wZW5zc2wuZXJyOworaW1wb3J0IGRlaW1vcy5vcGVuc3NsLnJhbmQ7CitpbXBvcnQgZGVpbW9zLm9wZW5zc2wuc3NsOworaW1wb3J0IGRlaW1vcy5vcGVuc3NsLng1MDl2MzsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuc3NsOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnNvY2tldDsKKworLyoqCisgKiBTU0wgZW5jcnlwdGVkIHNvY2tldCBpbXBsZW1lbnRhdGlvbiB1c2luZyBPcGVuU1NMLgorICoKKyAqIE5vdGU6CisgKiBPbiBQb3NpeCBzeXN0ZW1zIHdoaWNoIGRvIG5vdCBoYXZlIHRoZSBCU0Qtc3BlY2lmaWMgU09fTk9TSUdQSVBFIGZsYWcsIHlvdQorICogbWlnaHQgd2FudCB0byBpZ25vcmUgdGhlIFNJR1BJUEUgc2lnbmFsLCBhcyBPcGVuU1NMIG1pZ2h0IHRyeSB0byB3cml0ZSB0bworICogYSBjbG9zZWQgc29ja2V0IGlmIHRoZSBwZWVyIGRpc2Nvbm5lY3RzIGFicnVwdGx5OgorICogLS0tCisgKiBpbXBvcnQgY29yZS5zdGRjLnNpZ25hbDsKKyAqIGltcG9ydCBjb3JlLnN5cy5wb3NpeC5zaWduYWw7CisgKiBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisgKiAtLS0KKyAqLworZmluYWwgY2xhc3MgVFNTTFNvY2tldCA6IFRTb2NrZXQgeworICAvKioKKyAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSB0aGF0IHdyYXBzIGFuIGFscmVhZHkgY3JlYXRlZCwgY29ubmVjdGVkICghKSBzb2NrZXQuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBjb250ZXh0ID0gVGhlIFNTTCBzb2NrZXQgY29udGV4dCB0byB1c2UuIEEgcmVmZXJlbmNlIHRvIGl0IGlzIHN0b3JlZCBzbworICAgKiAgICAgdGhhdCBpdCBkb2Vzbid0IGdldCBjbGVhbmVkIHVwIHdoaWxlIHRoZSBzb2NrZXQgaXMgdXNlZC4KKyAgICogICBzb2NrZXQgPSBBbHJlYWR5IGNyZWF0ZWQsIGNvbm5lY3RlZCBzb2NrZXQgb2JqZWN0LgorICAgKi8KKyAgdGhpcyhUU1NMQ29udGV4dCBjb250ZXh0LCBTb2NrZXQgc29ja2V0KSB7CisgICAgc3VwZXIoc29ja2V0KTsKKyAgICBjb250ZXh0XyA9IGNvbnRleHQ7CisgICAgc2VydmVyU2lkZV8gPSBjb250ZXh0LnNlcnZlclNpZGU7CisgICAgYWNjZXNzTWFuYWdlcl8gPSBjb250ZXh0LmFjY2Vzc01hbmFnZXI7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyB1bmNvbm5lY3RlZCBzb2NrZXQgdGhhdCB3aWxsIGNvbm5lY3QgdG8gdGhlIGdpdmVuIGhvc3QKKyAgICogb24gdGhlIGdpdmVuIHBvcnQuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBjb250ZXh0ID0gVGhlIFNTTCBzb2NrZXQgY29udGV4dCB0byB1c2UuIEEgcmVmZXJlbmNlIHRvIGl0IGlzIHN0b3JlZCBzbworICAgICogICAgIHRoYXQgaXQgZG9lc24ndCBnZXQgY2xlYW5lZCB1cCB3aGlsZSB0aGUgc29ja2V0IGlzIHVzZWQuCisgICAqICAgaG9zdCA9IFJlbW90ZSBob3N0LgorICAgKiAgIHBvcnQgPSBSZW1vdGUgcG9ydC4KKyAgICovCisgIHRoaXMoVFNTTENvbnRleHQgY29udGV4dCwgc3RyaW5nIGhvc3QsIHVzaG9ydCBwb3J0KSB7CisgICAgc3VwZXIoaG9zdCwgcG9ydCk7CisgICAgY29udGV4dF8gPSBjb250ZXh0OworICAgIHNlcnZlclNpZGVfID0gY29udGV4dC5zZXJ2ZXJTaWRlOworICAgIGFjY2Vzc01hbmFnZXJfID0gY29udGV4dC5hY2Nlc3NNYW5hZ2VyOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBpc09wZW4oKSBAcHJvcGVydHkgeworICAgIGlmIChzc2xfIGlzIG51bGwgfHwgIXN1cGVyLmlzT3BlbigpKSByZXR1cm4gZmFsc2U7CisKKyAgICBhdXRvIHNodXRkb3duID0gU1NMX2dldF9zaHV0ZG93bihzc2xfKTsKKyAgICBib29sIHNodXRkb3duUmVjZWl2ZWQgPSAoc2h1dGRvd24gJiBTU0xfUkVDRUlWRURfU0hVVERPV04pICE9IDA7CisgICAgYm9vbCBzaHV0ZG93blNlbnQgPSAoc2h1dGRvd24gJiBTU0xfU0VOVF9TSFVURE9XTikgIT0gMDsKKyAgICByZXR1cm4gIShzaHV0ZG93blJlY2VpdmVkICYmIHNodXRkb3duU2VudCk7CisgIH0KKworICBvdmVycmlkZSBib29sIHBlZWsoKSB7CisgICAgaWYgKCFpc09wZW4pIHJldHVybiBmYWxzZTsKKyAgICBjaGVja0hhbmRzaGFrZSgpOworCisgICAgYnl0ZSBidDsKKyAgICBhdXRvIHJjID0gU1NMX3BlZWsoc3NsXywgJmJ0LCBidC5zaXplb2YpOworICAgIGVuZm9yY2UocmMgPj0gMCwgZ2V0U1NMRXhjZXB0aW9uKCJTU0xfcGVlayIpKTsKKworICAgIGlmIChyYyA9PSAwKSB7CisgICAgICBFUlJfY2xlYXJfZXJyb3IoKTsKKyAgICB9CisgICAgcmV0dXJuIChyYyA+IDApOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBvcGVuKCkgeworICAgIGVuZm9yY2UoIXNlcnZlclNpZGVfLCAiQ2Fubm90IG9wZW4gYSBzZXJ2ZXItc2lkZSBTU0wgc29ja2V0LiIpOworICAgIGlmIChpc09wZW4pIHJldHVybjsKKyAgICBzdXBlci5vcGVuKCk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGNsb3NlKCkgeworICAgIGlmICghaXNPcGVuKSByZXR1cm47CisKKyAgICBpZiAoc3NsXyAhaXMgbnVsbCkgeworICAgICAgLy8gVHdvLXN0ZXAgU1NMIHNodXRkb3duLgorICAgICAgYXV0byByYyA9IFNTTF9zaHV0ZG93bihzc2xfKTsKKyAgICAgIGlmIChyYyA9PSAwKSB7CisgICAgICAgIHJjID0gU1NMX3NodXRkb3duKHNzbF8pOworICAgICAgfQorICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAvLyBEbyBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIGhlcmUgYXMgbGVhdmluZyB0aGUgdHJhbnNwb3J0ICJvcGVuIiB3aWxsCisgICAgICAgIC8vIHByb2JhYmx5IHByb2R1Y2Ugb25seSBtb3JlIGVycm9ycywgYW5kIHRoZSBjaGFuY2Ugd2UgY2FuIGRvCisgICAgICAgIC8vIHNvbWV0aGluZyBhYm91dCB0aGUgZXJyb3IgZS5nLiBieSByZXRyeWluZyBpcyB2ZXJ5IGxvdy4KKyAgICAgICAgbG9nRXJyb3IoIkVycm9yIHNodXR0aW5nIGRvd24gU1NMOiAlcyIsIGdldFNTTEV4Y2VwdGlvbigpKTsKKyAgICAgIH0KKworICAgICAgU1NMX2ZyZWUoc3NsXyk7CisgICAgICBzc2xfID0gbnVsbDsKKyAgICAgIEVSUl9yZW1vdmVfc3RhdGUoMCk7CisgICAgfQorICAgIHN1cGVyLmNsb3NlKCk7CisgIH0KKworICBvdmVycmlkZSBzaXplX3QgcmVhZCh1Ynl0ZVtdIGJ1ZikgeworICAgIGNoZWNrSGFuZHNoYWtlKCk7CisKKyAgICBpbnQgYnl0ZXM7CisgICAgZm9yZWFjaCAoXzsgMCAuLiBtYXhSZWN2UmV0cmllcykgeworICAgICAgYnl0ZXMgPSBTU0xfcmVhZChzc2xfLCBidWYucHRyLCBjYXN0KGludClidWYubGVuZ3RoKTsKKyAgICAgIGlmIChieXRlcyA+PSAwKSBicmVhazsKKworICAgICAgYXV0byBlcnJub0NvcHkgPSBlcnJubzsKKyAgICAgIGlmIChTU0xfZ2V0X2Vycm9yKHNzbF8sIGJ5dGVzKSA9PSBTU0xfRVJST1JfU1lTQ0FMTCkgeworICAgICAgICBpZiAoRVJSX2dldF9lcnJvcigpID09IDAgJiYgZXJybm9Db3B5ID09IEVJTlRSKSB7CisgICAgICAgICAgLy8gRklYTUU6IFdpbmRvd3MuCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRocm93IGdldFNTTEV4Y2VwdGlvbigiU1NMX3JlYWQiKTsKKyAgICB9CisgICAgcmV0dXJuIGJ5dGVzOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCB3cml0ZShpbiB1Ynl0ZVtdIGJ1ZikgeworICAgIGNoZWNrSGFuZHNoYWtlKCk7CisKKyAgICAvLyBMb29wIGluIGNhc2UgU1NMX01PREVfRU5BQkxFX1BBUlRJQUxfV1JJVEUgaXMgc2V0IGluIFNTTF9DVFguCisgICAgc2l6ZV90IHdyaXR0ZW4gPSAwOworICAgIHdoaWxlICh3cml0dGVuIDwgYnVmLmxlbmd0aCkgeworICAgICAgYXV0byBieXRlcyA9IFNTTF93cml0ZShzc2xfLCBidWYucHRyICsgd3JpdHRlbiwKKyAgICAgICAgY2FzdChpbnQpKGJ1Zi5sZW5ndGggLSB3cml0dGVuKSk7CisgICAgICBpZiAoYnl0ZXMgPD0gMCkgeworICAgICAgICB0aHJvdyBnZXRTU0xFeGNlcHRpb24oIlNTTF93cml0ZSIpOworICAgICAgfQorICAgICAgd3JpdHRlbiArPSBieXRlczsKKyAgICB9CisgIH0KKworICBvdmVycmlkZSB2b2lkIGZsdXNoKCkgeworICAgIGNoZWNrSGFuZHNoYWtlKCk7CisKKyAgICBhdXRvIGJpbyA9IFNTTF9nZXRfd2Jpbyhzc2xfKTsKKyAgICBlbmZvcmNlKGJpbyAhaXMgbnVsbCwgbmV3IFRTU0xFeGNlcHRpb24oIlNTTF9nZXRfd2JpbyByZXR1cm5lZCBudWxsIikpOworCisgICAgYXV0byByYyA9IEJJT19mbHVzaChiaW8pOworICAgIGVuZm9yY2UocmMgPT0gMSwgZ2V0U1NMRXhjZXB0aW9uKCJCSU9fZmx1c2giKSk7CisgIH0KKworICAvKioKKyAgICogV2hldGhlciB0byB1c2UgY2xpZW50IG9yIHNlcnZlciBzaWRlIFNTTCBoYW5kc2hha2UgcHJvdG9jb2wuCisgICAqLworICBib29sIHNlcnZlclNpZGUoKSBAcHJvcGVydHkgY29uc3QgeworICAgIHJldHVybiBzZXJ2ZXJTaWRlXzsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIHNlcnZlclNpZGUoYm9vbCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBzZXJ2ZXJTaWRlXyA9IHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIFRoZSBhY2Nlc3MgbWFuYWdlciB0byB1c2UuCisgICAqLworICB2b2lkIGFjY2Vzc01hbmFnZXIoVEFjY2Vzc01hbmFnZXIgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgYWNjZXNzTWFuYWdlcl8gPSB2YWx1ZTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIGNoZWNrSGFuZHNoYWtlKCkgeworICAgIGVuZm9yY2Uoc3VwZXIuaXNPcGVuKCksIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisKKyAgICBpZiAoc3NsXyAhaXMgbnVsbCkgcmV0dXJuOworICAgIHNzbF8gPSBjb250ZXh0Xy5jcmVhdGVTU0woKTsKKworICAgIFNTTF9zZXRfZmQoc3NsXywgc29ja2V0SGFuZGxlKTsKKyAgICBpbnQgcmM7CisgICAgaWYgKHNlcnZlclNpZGVfKSB7CisgICAgICByYyA9IFNTTF9hY2NlcHQoc3NsXyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJjID0gU1NMX2Nvbm5lY3Qoc3NsXyk7CisgICAgfQorICAgIGVuZm9yY2UocmMgPiAwLCBnZXRTU0xFeGNlcHRpb24oKSk7CisgICAgYXV0aG9yaXplKHNzbF8sIGFjY2Vzc01hbmFnZXJfLCBnZXRQZWVyQWRkcmVzcygpLAorICAgICAgKHNlcnZlclNpZGVfID8gZ2V0UGVlckFkZHJlc3MoKS50b0hvc3ROYW1lU3RyaW5nKCkgOiBob3N0KSk7CisgIH0KKworICBib29sIHNlcnZlclNpZGVfOworICBTU0wqIHNzbF87CisgIFRTU0xDb250ZXh0IGNvbnRleHRfOworICBUQWNjZXNzTWFuYWdlciBhY2Nlc3NNYW5hZ2VyXzsKK30KKworLyoqCisgKiBSZXByZXNlbnRzIGFuIE9wZW5TU0wgY29udGV4dCB3aXRoIGNlcnRpZmljYXRpb24gc2V0dGluZ3MsIGV0Yy4gYW5kIGhhbmRsZXMKKyAqIGluaXRpYWxpemF0aW9uL3RlYXJkb3duLgorICoKKyAqIE9wZW5TU0wgaXMgaW5pdGlhbGl6ZWQgd2hlbiB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBjcmVhdGVkCisgKiBhbmQgc2h1dCBkb3duIHdoZW4gdGhlIGxhc3Qgb25lIGlzIGRlc3Ryb3llZCAodGhyZWFkLXNhZmUpLgorICovCitjbGFzcyBUU1NMQ29udGV4dCB7CisgIHRoaXMoKSB7CisgICAgaW5pdE11dGV4Xy5sb2NrKCk7CisgICAgc2NvcGUoZXhpdCkgaW5pdE11dGV4Xy51bmxvY2soKTsKKworICAgIGlmIChjb3VudF8gPT0gMCkgeworICAgICAgaW5pdGlhbGl6ZU9wZW5TU0woKTsKKyAgICAgIHJhbmRvbWl6ZSgpOworICAgIH0KKyAgICBjb3VudF8rKzsKKworICAgIHN0YXRpYyBpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDEwMTAwMDBmKSB7IC8vIE9QRU5TU0xfVkVSU0lPTl9BVF9MRUFTVCgxLCAxKSkgeworICAgICAgICBjdHhfID0gU1NMX0NUWF9uZXcoVExTX21ldGhvZCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjdHhfID0gU1NMX0NUWF9uZXcoU1NMdjIzX21ldGhvZCgpKTsKKyAgICAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjdHhfLCBTU0xfT1BfTk9fU1NMdjIpOworICAgIH0KKyAgICBTU0xfQ1RYX3NldF9vcHRpb25zKGN0eF8sIFNTTF9PUF9OT19TU0x2Myk7ICAgLy8gVEhSSUZULTMxNjQKKyAgICBlbmZvcmNlKGN0eF8sIGdldFNTTEV4Y2VwdGlvbigiU1NMX0NUWF9uZXciKSk7CisgICAgU1NMX0NUWF9zZXRfbW9kZShjdHhfLCBTU0xfTU9ERV9BVVRPX1JFVFJZKTsKKyAgfQorCisgIH50aGlzKCkgeworICAgIGluaXRNdXRleF8ubG9jaygpOworICAgIHNjb3BlKGV4aXQpIGluaXRNdXRleF8udW5sb2NrKCk7CisKKyAgICBpZiAoY3R4XyAhaXMgbnVsbCkgeworICAgICAgU1NMX0NUWF9mcmVlKGN0eF8pOworICAgICAgY3R4XyA9IG51bGw7CisgICAgfQorCisgICAgY291bnRfLS07CisgICAgaWYgKGNvdW50XyA9PSAwKSB7CisgICAgICBjbGVhbnVwT3BlblNTTCgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBDaXBoZXJzIHRvIGJlIHVzZWQgaW4gU1NMIGhhbmRzaGFrZSBwcm9jZXNzLgorICAgKgorICAgKiBUaGUgc3RyaW5nIG11c3QgYmUgaW4gdGhlIGNvbG9uLWRlbGltaXRlZCBPcGVuU1NMIG5vdGF0aW9uIGRlc2NyaWJlZCBpbgorICAgKiBjaXBoZXJzKDEpLCBmb3IgZXhhbXBsZTogIkFMTDohQURIOiFMT1c6IUVYUDohTUQ1OkBTVFJFTkdUSCIuCisgICAqLworICB2b2lkIGNpcGhlcnMoc3RyaW5nIGVuYWJsZSkgQHByb3BlcnR5IHsKKyAgICBhdXRvIHJjID0gU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QoY3R4XywgdG9TdHJpbmd6KGVuYWJsZSkpOworCisgICAgZW5mb3JjZShFUlJfcGVla19lcnJvcigpID09IDAsIGdldFNTTEV4Y2VwdGlvbigiU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QiKSk7CisgICAgZW5mb3JjZShyYyA+IDAsIG5ldyBUU1NMRXhjZXB0aW9uKCJOb25lIG9mIHNwZWNpZmllZCBjaXBoZXJzIGFyZSBzdXBwb3J0ZWQiKSk7CisgIH0KKworICAvKioKKyAgICogV2hldGhlciBwZWVyIGlzIHJlcXVpcmVkIHRvIHByZXNlbnQgYSB2YWxpZCBjZXJ0aWZpY2F0ZS4KKyAgICovCisgIHZvaWQgYXV0aGVudGljYXRlKGJvb2wgcmVxdWlyZWQpIEBwcm9wZXJ0eSB7CisgICAgaW50IG1vZGU7CisgICAgaWYgKHJlcXVpcmVkKSB7CisgICAgICBtb2RlID0gU1NMX1ZFUklGWV9QRUVSIHwgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCB8CisgICAgICAgIFNTTF9WRVJJRllfQ0xJRU5UX09OQ0U7CisgICAgfSBlbHNlIHsKKyAgICAgIG1vZGUgPSBTU0xfVkVSSUZZX05PTkU7CisgICAgfQorICAgIFNTTF9DVFhfc2V0X3ZlcmlmeShjdHhfLCBtb2RlLCBudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBMb2FkIHNlcnZlciBjZXJ0aWZpY2F0ZS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHBhdGggPSBQYXRoIHRvIHRoZSBjZXJ0aWZpY2F0ZSBmaWxlLgorICAgKiAgIGZvcm1hdCA9IENlcnRpZmljYXRlIGZpbGUgZm9ybWF0LiBEZWZhdWx0cyB0byBQRU0sIHdoaWNoIGlzIGN1cnJlbnRseQorICAgKiAgICAgdGhlIG9ubHkgb25lIHN1cHBvcnRlZC4KKyAgICovCisgIHZvaWQgbG9hZENlcnRpZmljYXRlKHN0cmluZyBwYXRoLCBzdHJpbmcgZm9ybWF0ID0gIlBFTSIpIHsKKyAgICBlbmZvcmNlKHBhdGggIWlzIG51bGwgJiYgZm9ybWF0ICFpcyBudWxsLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJsb2FkQ2VydGlmaWNhdGVDaGFpbjogZWl0aGVyIDxwYXRoPiBvciA8Zm9ybWF0PiBpcyBudWxsIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5CQURfQVJHUykpOworCisgICAgaWYgKGZvcm1hdCA9PSAiUEVNIikgeworICAgICAgZW5mb3JjZShTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKGN0eF8sIHRvU3RyaW5neihwYXRoKSksCisgICAgICAgIGdldFNTTEV4Y2VwdGlvbigKKyAgICAgICAgICBgQ291bGQgbm90IGxvYWQgU1NMIHNlcnZlciBjZXJ0aWZpY2F0ZSBmcm9tIGZpbGUgImAgfiBwYXRoIH4gYCJgCisgICAgICAgICkKKyAgICAgICk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBUU1NMRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBjZXJ0aWZpY2F0ZSBmb3JtYXQ6ICIgfiBmb3JtYXQpOworICAgIH0KKyAgfQorCisgIC8qCisgICAqIExvYWQgcHJpdmF0ZSBrZXkuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBwYXRoID0gUGF0aCB0byB0aGUgY2VydGlmaWNhdGUgZmlsZS4KKyAgICogICBmb3JtYXQgPSBQcml2YXRlIGtleSBmaWxlIGZvcm1hdC4gRGVmYXVsdHMgdG8gUEVNLCB3aGljaCBpcyBjdXJyZW50bHkKKyAgICogICAgIHRoZSBvbmx5IG9uZSBzdXBwb3J0ZWQuCisgICAqLworICB2b2lkIGxvYWRQcml2YXRlS2V5KHN0cmluZyBwYXRoLCBzdHJpbmcgZm9ybWF0ID0gIlBFTSIpIHsKKyAgICBlbmZvcmNlKHBhdGggIWlzIG51bGwgJiYgZm9ybWF0ICFpcyBudWxsLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJsb2FkUHJpdmF0ZUtleTogZWl0aGVyIDxwYXRoPiBvciA8Zm9ybWF0PiBpcyBOVUxMIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5CQURfQVJHUykpOworCisgICAgaWYgKGZvcm1hdCA9PSAiUEVNIikgeworICAgICAgZW5mb3JjZShTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoY3R4XywgdG9TdHJpbmd6KHBhdGgpLCBTU0xfRklMRVRZUEVfUEVNKSwKKyAgICAgICAgZ2V0U1NMRXhjZXB0aW9uKAorICAgICAgICAgIGBDb3VsZCBub3QgbG9hZCBTU0wgcHJpdmF0ZSBrZXkgZnJvbSBmaWxlICJgIH4gcGF0aCB+IGAiYAorICAgICAgICApCisgICAgICApOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgVFNTTEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgY2VydGlmaWNhdGUgZm9ybWF0OiAiIH4gZm9ybWF0KTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogTG9hZCB0cnVzdGVkIGNlcnRpZmljYXRlcyBmcm9tIHNwZWNpZmllZCBmaWxlIChpbiBQRU0gZm9ybWF0KS4KKyAgICoKKyAgICogUGFyYW1zLgorICAgKiAgIHBhdGggPSBQYXRoIHRvIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHRydXN0ZWQgY2VydGlmaWNhdGVzLgorICAgKi8KKyAgdm9pZCBsb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhzdHJpbmcgcGF0aCkgeworICAgIGVuZm9yY2UocGF0aCAhaXMgbnVsbCwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAibG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXM6IDxwYXRoPiBpcyBOVUxMIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5CQURfQVJHUykpOworCisgICAgZW5mb3JjZShTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjdHhfLCB0b1N0cmluZ3oocGF0aCksIG51bGwpLAorICAgICAgZ2V0U1NMRXhjZXB0aW9uKAorICAgICAgICBgQ291bGQgbm90IGxvYWQgU1NMIHRydXN0ZWQgY2VydGlmaWNhdGUgbGlzdCBmcm9tIGZpbGUgImAgfiBwYXRoIH4gYCJgCisgICAgICApCisgICAgKTsKKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgZHVyaW5nIE9wZW5TU0wgaW5pdGlhbGl6YXRpb24gdG8gc2VlZCB0aGUgT3BlblNTTCBlbnRyb3B5IHBvb2wuCisgICAqCisgICAqIERlZmF1bHRzIHRvIHNpbXBseSBjYWxsaW5nIFJBTkRfcG9sbCgpLCBidXQgaXQgY2FuIGJlIG92ZXJ3cml0dGVuIGlmIGEKKyAgICogZGlmZmVyZW50LCBwZXJoYXBzIG1vcmUgc2VjdXJlIGltcGxlbWVudGF0aW9uIGlzIGRlc2lyZWQuCisgICAqLworICB2b2lkIHJhbmRvbWl6ZSgpIHsKKyAgICBSQU5EX3BvbGwoKTsKKyAgfQorCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIHVzZSBjbGllbnQgb3Igc2VydmVyIHNpZGUgU1NMIGhhbmRzaGFrZSBwcm90b2NvbC4KKyAgICovCisgIGJvb2wgc2VydmVyU2lkZSgpIEBwcm9wZXJ0eSBjb25zdCB7CisgICAgcmV0dXJuIHNlcnZlclNpZGVfOworICB9CisKKyAgLy8vIERpdHRvCisgIHZvaWQgc2VydmVyU2lkZShib29sIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHNlcnZlclNpZGVfID0gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogVGhlIGFjY2VzcyBtYW5hZ2VyIHRvIHVzZS4KKyAgICovCisgIFRBY2Nlc3NNYW5hZ2VyIGFjY2Vzc01hbmFnZXIoKSBAcHJvcGVydHkgeworICAgIGlmICghc2VydmVyU2lkZV8gJiYgIWFjY2Vzc01hbmFnZXJfKSB7CisgICAgICBhY2Nlc3NNYW5hZ2VyXyA9IG5ldyBURGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXI7CisgICAgfQorICAgIHJldHVybiBhY2Nlc3NNYW5hZ2VyXzsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIGFjY2Vzc01hbmFnZXIoVEFjY2Vzc01hbmFnZXIgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgYWNjZXNzTWFuYWdlcl8gPSB2YWx1ZTsKKyAgfQorCisgIFNTTCogY3JlYXRlU1NMKCkgb3V0IChyZXN1bHQpIHsKKyAgICBhc3NlcnQocmVzdWx0KTsKKyAgfSBib2R5IHsKKyAgICBhdXRvIHJlc3VsdCA9IFNTTF9uZXcoY3R4Xyk7CisgICAgZW5mb3JjZShyZXN1bHQsIGdldFNTTEV4Y2VwdGlvbigiU1NMX25ldyIpKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGZvciBjdXN0b20gcGFzc3dvcmQgY2FsbGJhY2suIEl0IG1heSBiZSBjYWxsZWQKKyAgICogbXVsdGlwbGUgdGltZXMgYXQgYW55IHRpbWUgZHVyaW5nIGEgc2Vzc2lvbiBhcyBuZWNlc3NhcnkuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBzaXplID0gTWF4aW11bSBsZW5ndGggb2YgcGFzc3dvcmQsIGluY2x1ZGluZyBudWxsIGJ5dGUuCisgICAqLworICBzdHJpbmcgZ2V0UGFzc3dvcmQoaW50IHNpemUpIG5vdGhyb3cgb3V0KHJlc3VsdCkgeworICAgIGFzc2VydChyZXN1bHQubGVuZ3RoIDwgc2l6ZSk7CisgIH0gYm9keSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgLyoqCisgICAqIE5vdGlmaWVzIE9wZW5TU0wgdG8gdXNlIGdldFBhc3N3b3JkKCkgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBwYXNzd29yZAorICAgKiBjYWxsYmFjayB3aXRoIGdldFBhc3N3b3JkKCkuCisgICAqLworICB2b2lkIG92ZXJyaWRlRGVmYXVsdFBhc3N3b3JkQ2FsbGJhY2soKSB7CisgICAgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2IoY3R4XywgJnBhc3N3b3JkQ2FsbGJhY2spOworICAgIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiX3VzZXJkYXRhKGN0eF8sIGNhc3Qodm9pZCopdGhpcyk7CisgIH0KKworICBTU0xfQ1RYKiBjdHhfOworCitwcml2YXRlOgorICBib29sIHNlcnZlclNpZGVfOworICBUQWNjZXNzTWFuYWdlciBhY2Nlc3NNYW5hZ2VyXzsKKworICBzaGFyZWQgc3RhdGljIHRoaXMoKSB7CisgICAgaW5pdE11dGV4XyA9IG5ldyBNdXRleCgpOworICB9CisKKyAgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZU9wZW5TU0woKSB7CisgICAgaWYgKGluaXRpYWxpemVkXykgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbml0aWFsaXplZF8gPSB0cnVlOworCisgICBzdGF0aWMgaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCAweDEwMTAwMDBmKSB7IC8vIE9QRU5TU0xfVkVSU0lPTl9CRUZPUkUoMSwgMSkpIHsKKyAgICBTU0xfbGlicmFyeV9pbml0KCk7CisgICAgU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncygpOworCisgICAgbXV0ZXhlc18gPSBuZXcgTXV0ZXhbQ1JZUFRPX251bV9sb2NrcygpXTsKKyAgICBmb3JlYWNoIChyZWYgbTsgbXV0ZXhlc18pIHsKKyAgICAgIG0gPSBuZXcgTXV0ZXg7CisgICAgfQorCisgICAgaW1wb3J0IHRocmlmdC5pbnRlcm5hbC50cmFpdHM7CisgICAgLy8gQXMgcGVyIHRoZSBPcGVuU1NMIHRocmVhZHMgbWFucGFnZSwgdGhpcyBpc24ndCBuZWVkZWQgb24gV2luZG93cy4KKyAgICB2ZXJzaW9uIChQb3NpeCkgeworICAgICAgQ1JZUFRPX3NldF9pZF9jYWxsYmFjayhhc3N1bWVOb3Rocm93KCZ0aHJlYWRJZENhbGxiYWNrKSk7CisgICAgfQorICAgIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayhhc3N1bWVOb3Rocm93KCZsb2NraW5nQ2FsbGJhY2spKTsKKyAgICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKGFzc3VtZU5vdGhyb3coJmR5bmxvY2tDcmVhdGVDYWxsYmFjaykpOworICAgIENSWVBUT19zZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrKGFzc3VtZU5vdGhyb3coJmR5bmxvY2tMb2NrQ2FsbGJhY2spKTsKKyAgICBDUllQVE9fc2V0X2R5bmxvY2tfZGVzdHJveV9jYWxsYmFjayhhc3N1bWVOb3Rocm93KCZkeW5sb2NrRGVzdHJveUNhbGxiYWNrKSk7CisgICB9CisgIH0KKworICBzdGF0aWMgdm9pZCBjbGVhbnVwT3BlblNTTCgpIHsKKyAgICBpZiAoIWluaXRpYWxpemVkXykgcmV0dXJuOworCisgICAgaW5pdGlhbGl6ZWRfID0gZmFsc2U7CisgICBzdGF0aWMgaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCAweDEwMTAwMDBmKSB7IC8vIE9QRU5TU0xfVkVSU0lPTl9CRUZPUkUoMSwgMSkpIHsKKyAgICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2sobnVsbCk7CisgICAgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayhudWxsKTsKKyAgICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhudWxsKTsKKyAgICBDUllQVE9fc2V0X2R5bmxvY2tfZGVzdHJveV9jYWxsYmFjayhudWxsKTsKKyAgICBDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSgpOworICAgIEVSUl9mcmVlX3N0cmluZ3MoKTsKKyAgICBFUlJfcmVtb3ZlX3N0YXRlKDApOworICAgfQorICB9CisKKyAgc3RhdGljIGV4dGVybihDKSB7CisgICAgdmVyc2lvbiAoUG9zaXgpIHsKKyAgICAgIGltcG9ydCBjb3JlLnN5cy5wb3NpeC5wdGhyZWFkIDogcHRocmVhZF9zZWxmOworICAgICAgY191bG9uZyB0aHJlYWRJZENhbGxiYWNrKCkgeworICAgICAgICByZXR1cm4gY2FzdChjX3Vsb25nKXB0aHJlYWRfc2VsZigpOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgbG9ja2luZ0NhbGxiYWNrKGludCBtb2RlLCBpbnQgbiwgY29uc3QoY2hhcikqIGZpbGUsIGludCBsaW5lKSB7CisgICAgICBpZiAobW9kZSAmIENSWVBUT19MT0NLKSB7CisgICAgICAgIG11dGV4ZXNfW25dLmxvY2soKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG11dGV4ZXNfW25dLnVubG9jaygpOworICAgICAgfQorICAgIH0KKworICAgIENSWVBUT19keW5sb2NrX3ZhbHVlKiBkeW5sb2NrQ3JlYXRlQ2FsbGJhY2soY29uc3QoY2hhcikqIGZpbGUsIGludCBsaW5lKSB7CisgICAgICBlbnVtIHNpemUgPSAgX190cmFpdHMoY2xhc3NJbnN0YW5jZVNpemUsIE11dGV4KTsKKyAgICAgIGF1dG8gbWVtID0gbWFsbG9jKHNpemUpWzAgLi4gc2l6ZV07CisgICAgICBpZiAoIW1lbSkgb25PdXRPZk1lbW9yeUVycm9yKCk7CisgICAgICBHQy5hZGRSYW5nZShtZW0ucHRyLCBzaXplKTsKKyAgICAgIGF1dG8gbXV0ZXggPSBlbXBsYWNlIU11dGV4KG1lbSk7CisgICAgICByZXR1cm4gY2FzdChDUllQVE9fZHlubG9ja192YWx1ZSopbXV0ZXg7CisgICAgfQorCisgICAgdm9pZCBkeW5sb2NrTG9ja0NhbGxiYWNrKGludCBtb2RlLCBDUllQVE9fZHlubG9ja192YWx1ZSogbCwKKyAgICAgIGNvbnN0KGNoYXIpKiBmaWxlLCBpbnQgbGluZSkKKyAgICB7CisgICAgICBpZiAobCBpcyBudWxsKSByZXR1cm47CisgICAgICBpZiAobW9kZSAmIENSWVBUT19MT0NLKSB7CisgICAgICAgIChjYXN0KE11dGV4KWwpLmxvY2soKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIChjYXN0KE11dGV4KWwpLnVubG9jaygpOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZHlubG9ja0Rlc3Ryb3lDYWxsYmFjayhDUllQVE9fZHlubG9ja192YWx1ZSogbCwKKyAgICAgIGNvbnN0KGNoYXIpKiBmaWxlLCBpbnQgbGluZSkKKyAgICB7CisgICAgICBHQy5yZW1vdmVSYW5nZShsKTsKKyAgICAgIGRlc3Ryb3koY2FzdChNdXRleClsKTsKKyAgICAgIGZyZWUobCk7CisgICAgfQorCisgICAgaW50IHBhc3N3b3JkQ2FsbGJhY2soY2hhciogcGFzc3dvcmQsIGludCBzaXplLCBpbnQsIHZvaWQqIGRhdGEpIG5vdGhyb3cgeworICAgICAgYXV0byBjb250ZXh0ID0gY2FzdChUU1NMQ29udGV4dCkgZGF0YTsKKyAgICAgIGF1dG8gdXNlclBhc3N3b3JkID0gY29udGV4dC5nZXRQYXNzd29yZChzaXplKTsKKyAgICAgIGF1dG8gbGVuID0gdXNlclBhc3N3b3JkLmxlbmd0aDsKKyAgICAgIGlmIChsZW4gPiBzaXplKSB7CisgICAgICAgIGxlbiA9IHNpemU7CisgICAgICB9CisgICAgICBwYXNzd29yZFswIC4uIGxlbl0gPSB1c2VyUGFzc3dvcmRbMCAuLiBsZW5dOyAvLyBUT0RPOiBcMCBoYW5kbGluZyBjb3JyZWN0PworICAgICAgcmV0dXJuIGNhc3QoaW50KWxlbjsKKyAgICB9CisgIH0KKworICBzdGF0aWMgX19nc2hhcmVkIGJvb2wgaW5pdGlhbGl6ZWRfOworICBzdGF0aWMgX19nc2hhcmVkIE11dGV4IGluaXRNdXRleF87CisgIHN0YXRpYyBfX2dzaGFyZWQgTXV0ZXhbXSBtdXRleGVzXzsKKyAgc3RhdGljIF9fZ3NoYXJlZCB1aW50IGNvdW50XzsKK30KKworLyoqCisgKiBEZWNpZGVzIHdoZXRoZXIgYSByZW1vdGUgaG9zdCBpcyBsZWdpdGltYXRlIG9yIG5vdC4KKyAqCisgKiBJdCBpcyB1c3VhbGx5IHNldCBhdCBhIFRTU0xDb250ZXh0LCB3aGljaCB0aGVuIHBhc3NlcyBpdCB0byBhbGwgdGhlIGNyZWF0ZWQKKyAqIFRTU0xTb2NrZXRzLgorICovCitjbGFzcyBUQWNjZXNzTWFuYWdlciB7CisgIC8vLworICBlbnVtIERlY2lzaW9uIHsKKyAgICBERU5ZID0gLTEsIC8vLyBEZW55IGFjY2Vzcy4KKyAgICBTS0lQID0gIDAsIC8vLyBDYW5ub3QgZGVjaWRlLCBtb3ZlIG9uIHRvIG5leHQgY2hlY2sgKGRlbnkgaWYgbGFzdCkuCisgICAgQUxMT1cgPSAxICAvLy8gQWxsb3cgYWNjZXNzLgorICB9CisKKyAgLyoqCisgICAqIERldGVybWluZXMgd2hldGhlciBhIHBlZXIgc2hvdWxkIGJlIGdyYW50ZWQgYWNjZXNzIG9yIG5vdCBiYXNlZCBvbiBpdHMKKyAgICogSVAgYWRkcmVzcy4KKyAgICoKKyAgICogQ2FsbGVkIG9uY2UgYWZ0ZXIgU1NMIGhhbmRzaGFrZSBpcyBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5IGFuZCBiZWZvcmUgcGVlcgorICAgKiBjZXJ0aWZpY2F0ZSBpcyBleGFtaW5lZC4KKyAgICoKKyAgICogSWYgYSB2YWxpZCBkZWNpc2lvbiAoQUxMT1cgb3IgREVOWSkgaXMgcmV0dXJuZWQsIHRoZSBwZWVyIGNlcnRpZmljYXRlCisgICAqIHdpbGwgbm90IGJlIHZlcmlmaWVkLgorICAgKi8KKyAgRGVjaXNpb24gdmVyaWZ5KEFkZHJlc3MgYWRkcmVzcykgeworICAgIHJldHVybiBEZWNpc2lvbi5ERU5ZOworICB9CisKKyAgLyoqCisgICAqIERldGVybWluZXMgd2hldGhlciBhIHBlZXIgc2hvdWxkIGJlIGdyYW50ZWQgYWNjZXNzIG9yIG5vdCBiYXNlZCBvbiBhCisgICAqIG5hbWUgZnJvbSBpdHMgY2VydGlmaWNhdGUuCisgICAqCisgICAqIENhbGxlZCBldmVyeSB0aW1lIGEgRE5TIHN1YmplY3RBbHROYW1lL2NvbW1vbiBuYW1lIGlzIGV4dHJhY3RlZCBmcm9tIHRoZQorICAgKiBwZWVyJ3MgY2VydGlmaWNhdGUuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBob3N0ID0gVGhlIGFjdHVhbCBob3N0IG5hbWUgc3RyaW5nIGZyb20gdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgKiAgIGNlcnRIb3N0ID0gQSBob3N0IG5hbWUgc3RyaW5nIGZyb20gdGhlIGNlcnRpZmljYXRlLgorICAgKi8KKyAgRGVjaXNpb24gdmVyaWZ5KHN0cmluZyBob3N0LCBjb25zdChjaGFyKVtdIGNlcnRIb3N0KSB7CisgICAgcmV0dXJuIERlY2lzaW9uLkRFTlk7CisgIH0KKworICAvKioKKyAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgcGVlciBzaG91bGQgYmUgZ3JhbnRlZCBhY2Nlc3Mgb3Igbm90IGJhc2VkIG9uIGFuIElQCisgICAqIGFkZHJlc3MgZnJvbSBpdHMgY2VydGlmaWNhdGUuCisgICAqCisgICAqIENhbGxlZCBldmVyeSB0aW1lIGFuIElQIHN1YmplY3RBbHROYW1lIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBwZWVyJ3MKKyAgICogY2VydGlmaWNhdGUuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBhZGRyZXNzID0gVGhlIGFjdHVhbCBhZGRyZXNzIGZyb20gdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgKiAgIGNlcnRIb3N0ID0gQSBob3N0IG5hbWUgc3RyaW5nIGZyb20gdGhlIGNlcnRpZmljYXRlLgorICAgKi8KKyAgRGVjaXNpb24gdmVyaWZ5KEFkZHJlc3MgYWRkcmVzcywgdWJ5dGVbXSBjZXJ0QWRkcmVzcykgeworICAgIHJldHVybiBEZWNpc2lvbi5ERU5ZOworICB9Cit9CisKKy8qKgorICogRGVmYXVsdCBhY2Nlc3MgbWFuYWdlciBpbXBsZW1lbnRhdGlvbiwgd2hpY2gganVzdCBjaGVja3MgdGhlIGhvc3QgbmFtZQorICogcmVzcC4gSVAgYWRkcmVzcyBvZiB0aGUgY29ubmVjdGlvbiBhZ2FpbnN0IHRoZSBjZXJ0aWZpY2F0ZS4KKyAqLworY2xhc3MgVERlZmF1bHRDbGllbnRBY2Nlc3NNYW5hZ2VyIDogVEFjY2Vzc01hbmFnZXIgeworICBvdmVycmlkZSBEZWNpc2lvbiB2ZXJpZnkoQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgcmV0dXJuIERlY2lzaW9uLlNLSVA7CisgIH0KKworICBvdmVycmlkZSBEZWNpc2lvbiB2ZXJpZnkoc3RyaW5nIGhvc3QsIGNvbnN0KGNoYXIpW10gY2VydEhvc3QpIHsKKyAgICBpZiAoaG9zdC5lbXB0eSB8fCBjZXJ0SG9zdC5lbXB0eSkgeworICAgICAgcmV0dXJuIERlY2lzaW9uLlNLSVA7CisgICAgfQorICAgIHJldHVybiAobWF0Y2hOYW1lKGhvc3QsIGNlcnRIb3N0KSA/IERlY2lzaW9uLkFMTE9XIDogRGVjaXNpb24uU0tJUCk7CisgIH0KKworICBvdmVycmlkZSBEZWNpc2lvbiB2ZXJpZnkoQWRkcmVzcyBhZGRyZXNzLCB1Ynl0ZVtdIGNlcnRBZGRyZXNzKSB7CisgICAgYm9vbCBtYXRjaDsKKyAgICBpZiAoY2VydEFkZHJlc3MubGVuZ3RoID09IDQpIHsKKyAgICAgIGlmIChhdXRvIGlhID0gY2FzdChJbnRlcm5ldEFkZHJlc3MpYWRkcmVzcykgeworICAgICAgICBtYXRjaCA9ICgoY2FzdCh1Ynl0ZSopaWEuYWRkcigpKVswIC4uIDRdID09IGNlcnRBZGRyZXNzW10pOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoY2VydEFkZHJlc3MubGVuZ3RoID09IDE2KSB7CisgICAgICBpZiAoYXV0byBpYSA9IGNhc3QoSW50ZXJuZXQ2QWRkcmVzcylhZGRyZXNzKSB7CisgICAgICAgIG1hdGNoID0gKGlhLmFkZHIoKSA9PSBjZXJ0QWRkcmVzc1tdKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChtYXRjaCA/IERlY2lzaW9uLkFMTE9XIDogRGVjaXNpb24uU0tJUCk7CisgIH0KK30KKworcHJpdmF0ZSB7CisgIC8qKgorICAgKiBNYXRjaGVzIGEgbmFtZSB3aXRoIGEgcGF0dGVybi4gVGhlIHBhdHRlcm4gbWF5IGluY2x1ZGUgd2lsZGNhcmQuIEEgc2luZ2xlCisgICAqIHdpbGRjYXJkICIqIiBjYW4gbWF0Y2ggdXAgdG8gb25lIGNvbXBvbmVudCBpbiB0aGUgZG9tYWluIG5hbWUuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBob3N0ID0gSG9zdCBuYW1lIHRvIG1hdGNoLCB0eXBpY2FsbHkgdGhlIFNTTCByZW1vdGUgcGVlci4KKyAgICogICBwYXR0ZXJuID0gSG9zdCBuYW1lIHBhdHRlcm4sIHR5cGljYWxseSBmcm9tIHRoZSBTU0wgY2VydGlmaWNhdGUuCisgICAqCisgICAqIFJldHVybnM6IHRydWUgaWYgaG9zdCBtYXRjaGVzIHBhdHRlcm4sIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIGJvb2wgbWF0Y2hOYW1lKGNvbnN0KGNoYXIpW10gaG9zdCwgY29uc3QoY2hhcilbXSBwYXR0ZXJuKSB7CisgICAgd2hpbGUgKCFob3N0LmVtcHR5ICYmICFwYXR0ZXJuLmVtcHR5KSB7CisgICAgICBpZiAodG9VcHBlcihwYXR0ZXJuLmZyb250KSA9PSB0b1VwcGVyKGhvc3QuZnJvbnQpKSB7CisgICAgICAgIGhvc3QucG9wRnJvbnQ7CisgICAgICAgIHBhdHRlcm4ucG9wRnJvbnQ7CisgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4uZnJvbnQgPT0gJyonKSB7CisgICAgICAgIHdoaWxlICghaG9zdC5lbXB0eSAmJiBob3N0LmZyb250ICE9ICcuJykgeworICAgICAgICAgIGhvc3QucG9wRnJvbnQ7CisgICAgICAgIH0KKyAgICAgICAgcGF0dGVybi5wb3BGcm9udDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKGhvc3QuZW1wdHkgJiYgcGF0dGVybi5lbXB0eSk7CisgIH0KKworICB1bml0dGVzdCB7CisgICAgZW5mb3JjZShtYXRjaE5hbWUoInRocmlmdC5hcGFjaGUub3JnIiwgIiouYXBhY2hlLm9yZyIpKTsKKyAgICBlbmZvcmNlKCFtYXRjaE5hbWUoInRocmlmdC5hcGFjaGUub3JnIiwgImFwYWNoZS5vcmciKSk7CisgICAgZW5mb3JjZShtYXRjaE5hbWUoInRocmlmdC5hcGFjaGUub3JnIiwgInRocmlmdC4qLioiKSk7CisgICAgZW5mb3JjZShtYXRjaE5hbWUoIiIsICIiKSk7CisgICAgZW5mb3JjZSghbWF0Y2hOYW1lKCIiLCAiKiIpKTsKKyAgfQorfQorCisvKioKKyAqIFNTTC1sZXZlbCBleGNlcHRpb24uCisgKi8KK2NsYXNzIFRTU0xFeGNlcHRpb24gOiBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgLy8vCisgIHRoaXMoc3RyaW5nIG1zZywgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywKKyAgICBUaHJvd2FibGUgbmV4dCA9IG51bGwpCisgIHsKKyAgICBzdXBlcihtc2csIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5JTlRFUk5BTF9FUlJPUiwgZmlsZSwgbGluZSwgbmV4dCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3psaWIuZCBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3psaWIuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDk2ZjliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvemxpYi5kCkBAIC0wLDAgKzEsNDk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK21vZHVsZSB0aHJpZnQudHJhbnNwb3J0LnpsaWI7CisKK2ltcG9ydCBjb3JlLmJpdG9wIDogYnN3YXA7CitpbXBvcnQgZXRjLmMuemxpYjsKK2ltcG9ydCBzdGQuYWxnb3JpdGhtIDogbWluOworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5OworaW1wb3J0IHN0ZC5jb252IDogdG87CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworCisvKioKKyAqIHpsaWIgdHJhbnNwb3J0LiBDb21wcmVzc2VzIChkZWZsYXRlcykgZGF0YSBiZWZvcmUgd3JpdGluZyBpdCB0byB0aGUKKyAqIHVuZGVybHlpbmcgdHJhbnNwb3J0LCBhbmQgZGVjb21wcmVzc2VzIChpbmZsYXRlcykgaXQgYWZ0ZXIgcmVhZGluZy4KKyAqLworZmluYWwgY2xhc3MgVFpsaWJUcmFuc3BvcnQgOiBUQmFzZVRyYW5zcG9ydCB7CisgIC8vIFRoZXNlIGRlZmF1bHRzIGhhdmUgeWV0IHRvIGJlIG9wdGltaXplZC4KKyAgZW51bSBERUZBVUxUX1VSQlVGX1NJWkUgPSAxMjg7CisgIGVudW0gREVGQVVMVF9DUkJVRl9TSVpFID0gMTAyNDsKKyAgZW51bSBERUZBVUxUX1VXQlVGX1NJWkUgPSAxMjg7CisgIGVudW0gREVGQVVMVF9DV0JVRl9TSVpFID0gMTAyNDsKKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyB6bGliIHRyYW5zcG9ydC4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHRyYW5zcG9ydCA9IFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byB3cmFwLgorICAgKiAgIHVyYnVmU2l6ZSA9IFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgcmVhZGluZyBidWZmZXIsIGluIGJ5dGVzLgorICAgKiAgIGNyYnVmU2l6ZSA9IFRoZSBzaXplIG9mIHRoZSBjb21wcmVzc2VkIHJlYWRpbmcgYnVmZmVyLCBpbiBieXRlcy4KKyAgICogICB1d2J1ZlNpemUgPSBUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIHdyaXRpbmcgYnVmZmVyLCBpbiBieXRlcy4KKyAgICogICBjd2J1ZlNpemUgPSBUaGUgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCB3cml0aW5nIGJ1ZmZlciwgaW4gYnl0ZXMuCisgICAqLworICB0aGlzKAorICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0LAorICAgIHNpemVfdCB1cmJ1ZlNpemUgPSBERUZBVUxUX1VSQlVGX1NJWkUsCisgICAgc2l6ZV90IGNyYnVmU2l6ZSA9IERFRkFVTFRfQ1JCVUZfU0laRSwKKyAgICBzaXplX3QgdXdidWZTaXplID0gREVGQVVMVF9VV0JVRl9TSVpFLAorICAgIHNpemVfdCBjd2J1ZlNpemUgPSBERUZBVUxUX0NXQlVGX1NJWkUKKyAgKSB7CisgICAgdHJhbnNwb3J0XyA9IHRyYW5zcG9ydDsKKworICAgIGVuZm9yY2UodXdidWZTaXplID49IE1JTl9ESVJFQ1RfREVGTEFURV9TSVpFLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJUWkxpYlRyYW5zcG9ydDogdW5jb21wcmVzc2VkIHdyaXRlIGJ1ZmZlciBtdXN0IGJlIGF0IGxlYXN0ICIgfgorICAgICAgdG8hc3RyaW5nKE1JTl9ESVJFQ1RfREVGTEFURV9TSVpFKSB+ICJieXRlcyBpbiBzaXplLiIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQkFEX0FSR1MpKTsKKworICAgIHVyYnVmXyA9IG5ldyB1Ynl0ZVt1cmJ1ZlNpemVdOworICAgIGNyYnVmXyA9IG5ldyB1Ynl0ZVtjcmJ1ZlNpemVdOworICAgIHV3YnVmXyA9IG5ldyB1Ynl0ZVt1d2J1ZlNpemVdOworICAgIGN3YnVmXyA9IG5ldyB1Ynl0ZVtjd2J1ZlNpemVdOworCisgICAgcnN0cmVhbV8gPSBuZXcgel9zdHJlYW07CisgICAgcnN0cmVhbV8ubmV4dF9pbiA9IGNyYnVmXy5wdHI7CisgICAgcnN0cmVhbV8uYXZhaWxfaW4gID0gMDsKKyAgICByc3RyZWFtXy5uZXh0X291dCA9IHVyYnVmXy5wdHI7CisgICAgcnN0cmVhbV8uYXZhaWxfb3V0ID0gdG8hdWludCh1cmJ1Zl8ubGVuZ3RoKTsKKworICAgIHdzdHJlYW1fID0gbmV3IHpfc3RyZWFtOworICAgIHdzdHJlYW1fLm5leHRfaW4gPSB1d2J1Zl8ucHRyOworICAgIHdzdHJlYW1fLmF2YWlsX2luID0gMDsKKyAgICB3c3RyZWFtXy5uZXh0X291dCA9IGN3YnVmXy5wdHI7CisgICAgd3N0cmVhbV8uYXZhaWxfb3V0ID0gdG8hdWludChjcmJ1Zl8ubGVuZ3RoKTsKKworICAgIHpsaWJFbmZvcmNlKGluZmxhdGVJbml0KHJzdHJlYW1fKSwgcnN0cmVhbV8pOworICAgIHNjb3BlIChmYWlsdXJlKSB7CisgICAgICB6bGliTG9nRXJyb3IoaW5mbGF0ZUVuZChyc3RyZWFtXyksIHJzdHJlYW1fKTsKKyAgICB9CisKKyAgICB6bGliRW5mb3JjZShkZWZsYXRlSW5pdCh3c3RyZWFtXywgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKSwgd3N0cmVhbV8pOworICB9CisKKyAgfnRoaXMoKSB7CisgICAgemxpYkxvZ0Vycm9yKGluZmxhdGVFbmQocnN0cmVhbV8pLCByc3RyZWFtXyk7CisKKyAgICBhdXRvIHJlc3VsdCA9IGRlZmxhdGVFbmQod3N0cmVhbV8pOworICAgIC8vIFpfREFUQV9FUlJPUiBtYXkgaW5kaWNhdGUgdW5mbHVzaGVkIGRhdGEsIHNvIGp1c3QgaWdub3JlIGl0LgorICAgIGlmIChyZXN1bHQgIT0gWl9EQVRBX0VSUk9SKSB7CisgICAgICB6bGliTG9nRXJyb3IocmVzdWx0LCB3c3RyZWFtXyk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHdyYXBwZWQgdHJhbnNwb3J0LgorICAgKi8KKyAgVFRyYW5zcG9ydCB1bmRlcmx5aW5nVHJhbnNwb3J0KCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gdHJhbnNwb3J0XzsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgaXNPcGVuKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcmVhZEF2YWlsID4gMCB8fCB0cmFuc3BvcnRfLmlzT3BlbjsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgcGVlaygpIHsKKyAgICByZXR1cm4gcmVhZEF2YWlsID4gMCB8fCB0cmFuc3BvcnRfLnBlZWsoKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgb3BlbigpIHsKKyAgICB0cmFuc3BvcnRfLm9wZW4oKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgY2xvc2UoKSB7CisgICAgdHJhbnNwb3J0Xy5jbG9zZSgpOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWQodWJ5dGVbXSBidWYpIHsKKyAgICAvLyBUaGUgQysrIGltcGxlbWVudGF0aW9uIHN1Z2dlc3RzIHRvIHNraXAgdXJidWYgb24gYmlnIHJlYWRzIGluIGZ1dHVyZQorICAgIC8vIHZlcnNpb25zLCB3ZSB3b3VsZCBiZW5lZml0IGZyb20gaXQgYXMgd2VsbC4KKyAgICBhdXRvIG9yaWdMZW4gPSBidWYubGVuZ3RoOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBhdXRvIGdpdmUgPSBtaW4ocmVhZEF2YWlsLCBidWYubGVuZ3RoKTsKKworICAgICAgLy8gSWYgc3RkLnJhbmdlLnB1dCB3YXMgb3B0aW1pemVkIGZvciBzbGljYWJsZSByYW5nZXMsIGl0IGNvdWxkIGJlIHVzZWQKKyAgICAgIC8vIGhlcmUgYXMgd2VsbC4KKyAgICAgIGJ1ZlswIC4uIGdpdmVdID0gdXJidWZfW3VycG9zXyAuLiB1cnBvc18gKyBnaXZlXTsKKyAgICAgIGJ1ZiA9IGJ1ZltnaXZlIC4uICRdOworICAgICAgdXJwb3NfICs9IGdpdmU7CisKKyAgICAgIGF1dG8gbmVlZCA9IGJ1Zi5sZW5ndGg7CisgICAgICBpZiAobmVlZCA9PSAwKSB7CisgICAgICAgIC8vIFdlIGNvdWxkIG1hbmFnZSB0byBnZXQgdGhlIGFsbCB0aGUgZGF0YSByZXF1ZXN0ZWQuCisgICAgICAgIHJldHVybiBvcmlnTGVuOworICAgICAgfQorCisgICAgICBpZiAoaW5wdXRFbmRlZF8gfHwgKG5lZWQgPCBvcmlnTGVuICYmIHJzdHJlYW1fLmF2YWlsX2luID09IDApKSB7CisgICAgICAgIC8vIFdlIGRpZG4ndCBmaWxsIGJ1ZiBjb21wbGV0ZWx5LCBidXQgdGhlcmUgaXMgbm8gbW9yZSBkYXRhIGF2YWlsYWJsZS4KKyAgICAgICAgcmV0dXJuIG9yaWdMZW4gLSBuZWVkOworICAgICAgfQorCisgICAgICAvLyBSZWZpbGwgb3VyIGJ1ZmZlciBieSByZWFkaW5nIG1vcmUgZGF0YSB0aHJvdWdoIHpsaWIuCisgICAgICByc3RyZWFtXy5uZXh0X291dCA9IHVyYnVmXy5wdHI7CisgICAgICByc3RyZWFtXy5hdmFpbF9vdXQgPSB0byF1aW50KHVyYnVmXy5sZW5ndGgpOworICAgICAgdXJwb3NfID0gMDsKKworICAgICAgaWYgKCFyZWFkRnJvbVpsaWIoKSkgeworICAgICAgICAvLyBDb3VsZG4ndCBnZXQgbW9yZSBkYXRhIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICAgICAgICByZXR1cm4gb3JpZ0xlbiAtIG5lZWQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgb3ZlcnJpZGUgdm9pZCB3cml0ZShpbiB1Ynl0ZVtdIGJ1ZikgeworICAgIGVuZm9yY2UoIW91dHB1dEZpbmlzaGVkXywgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAid3JpdGUoKSBjYWxsZWQgYWZ0ZXIgZmluaXNoKCkiLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQkFEX0FSR1MpKTsKKworICAgIGF1dG8gbGVuID0gYnVmLmxlbmd0aDsKKyAgICBpZiAobGVuID4gTUlOX0RJUkVDVF9ERUZMQVRFX1NJWkUpIHsKKyAgICAgIGZsdXNoVG9abGliKHV3YnVmX1swIC4uIHV3cG9zX10sIFpfTk9fRkxVU0gpOworICAgICAgdXdwb3NfID0gMDsKKyAgICAgIGZsdXNoVG9abGliKGJ1ZiwgWl9OT19GTFVTSCk7CisgICAgfSBlbHNlIGlmIChsZW4gPiAwKSB7CisgICAgICBpZiAodXdidWZfLmxlbmd0aCAtIHV3cG9zXyA8IGxlbikgeworICAgICAgICBmbHVzaFRvWmxpYih1d2J1Zl9bMCAuLiB1d3Bvc19dLCBaX05PX0ZMVVNIKTsKKyAgICAgICAgdXdwb3NfID0gMDsKKyAgICAgIH0KKyAgICAgIHV3YnVmX1t1d3Bvc18gLi4gdXdwb3NfICsgbGVuXSA9IGJ1ZltdOworICAgICAgdXdwb3NfICs9IGxlbjsKKyAgICB9CisgIH0KKworICBvdmVycmlkZSB2b2lkIGZsdXNoKCkgeworICAgIGVuZm9yY2UoIW91dHB1dEZpbmlzaGVkXywgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiZmx1c2goKSBjYWxsZWQgYWZ0ZXIgZmluaXNoKCkiLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQkFEX0FSR1MpKTsKKworICAgIGZsdXNoVG9UcmFuc3BvcnQoWl9TWU5DX0ZMVVNIKTsKKyAgfQorCisgIG92ZXJyaWRlIGNvbnN0KHVieXRlKVtdIGJvcnJvdyh1Ynl0ZSogYnVmLCBzaXplX3QgbGVuKSB7CisgICAgaWYgKGxlbiA8PSByZWFkQXZhaWwpIHsKKyAgICAgIHJldHVybiB1cmJ1Zl9bdXJwb3NfIC4uICRdOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgY29uc3VtZShzaXplX3QgbGVuKSB7CisgICAgZW5mb3JjZShyZWFkQXZhaWwgPj0gbGVuLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJjb25zdW1lKCkgZGlkIG5vdCBmb2xsb3cgYSBib3Jyb3coKS4iLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQkFEX0FSR1MpKTsKKyAgICB1cnBvc18gKz0gbGVuOworICB9CisKKyAgLyoqCisgICAqIEZpbmFsaXplIHRoZSB6bGliIHN0cmVhbS4KKyAgICoKKyAgICogVGhpcyBjYXVzZXMgemxpYiB0byBmbHVzaCBhbnkgcGVuZGluZyB3cml0ZSBkYXRhIGFuZCB3cml0ZSBlbmQtb2Ytc3RyZWFtCisgICAqIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgdGhlIGNoZWNrc3VtLiAgT25jZSBmaW5pc2goKSBoYXMgYmVlbiBjYWxsZWQsIG5vCisgICAqIG5ldyBkYXRhIGNhbiBiZSB3cml0dGVuIHRvIHRoZSBzdHJlYW0uCisgICAqLworICB2b2lkIGZpbmlzaCgpIHsKKyAgICBlbmZvcmNlKCFvdXRwdXRGaW5pc2hlZF8sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgImZsdXNoKCkgY2FsbGVkIG9uIGFscmVhZHkgZmluaXNoZWQgVFpsaWJUcmFuc3BvcnQiLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkJBRF9BUkdTKSk7CisgICAgZmx1c2hUb1RyYW5zcG9ydChaX0ZJTklTSCk7CisgIH0KKworICAvKioKKyAgICogVmVyaWZ5IHRoZSBjaGVja3N1bSBhdCB0aGUgZW5kIG9mIHRoZSB6bGliIHN0cmVhbSAoYnkgZmluaXNoKCkpLgorICAgKgorICAgKiBNYXkgb25seSBiZSBjYWxsZWQgYWZ0ZXIgYWxsIGRhdGEgaGFzIGJlZW4gcmVhZC4KKyAgICoKKyAgICogVGhyb3dzOiBUVHJhbnNwb3J0RXhjZXB0aW9uIHdoZW4gdGhlIGNoZWNrc3VtIGlzIGNvcnJ1cHRlZCBvciB0aGVyZSBpcworICAgKiAgIHN0aWxsIHVucmVhZCBkYXRhIGxlZnQuCisgICAqLworICB2b2lkIHZlcmlmeUNoZWNrc3VtKCkgeworICAgIC8vIElmIHpsaWIgaGFzIGFscmVhZHkgcmVwb3J0ZWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLCB0aGUgY2hlY2tzdW0gaGFzCisgICAgLy8gYmVlbiB2ZXJpZmllZCwgbm8uCisgICAgaWYgKGlucHV0RW5kZWRfKSByZXR1cm47CisKKyAgICBlbmZvcmNlKCFyZWFkQXZhaWwsIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgInZlcmlmeUNoZWNrc3VtKCkgY2FsbGVkIGJlZm9yZSBlbmQgb2YgemxpYiBzdHJlYW0iLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkNPUlJVUFRFRF9EQVRBKSk7CisKKyAgICByc3RyZWFtXy5uZXh0X291dCA9IHVyYnVmXy5wdHI7CisgICAgcnN0cmVhbV8uYXZhaWxfb3V0ID0gdG8hdWludCh1cmJ1Zl8ubGVuZ3RoKTsKKyAgICB1cnBvc18gPSAwOworCisgICAgLy8gcmVhZEZyb21abGliKCkgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNoZWNrc3VtIGlzIGJhZC4KKyAgICBlbmZvcmNlKHJlYWRGcm9tWmxpYigpLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJjaGVja3N1bSBub3QgYXZhaWxhYmxlIHlldCBpbiB2ZXJpZnlDaGVja3N1bSgpIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5DT1JSVVBURURfREFUQSkpOworCisgICAgZW5mb3JjZShpbnB1dEVuZGVkXywgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAidmVyaWZ5Q2hlY2tzdW0oKSBjYWxsZWQgYmVmb3JlIGVuZCBvZiB6bGliIHN0cmVhbSIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQ09SUlVQVEVEX0RBVEEpKTsKKworICAgIC8vIElmIHdlIGdldCBoZXJlLCB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGFuZCB0aHVzIHpsaWIgaGFzCisgICAgLy8gc3VjY2Vzc2Z1bGx5IHZlcmlmaWVkIHRoZSBjaGVja3N1bS4KKyAgfQorCitwcml2YXRlOgorICBzaXplX3QgcmVhZEF2YWlsKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gdXJidWZfLmxlbmd0aCAtIHJzdHJlYW1fLmF2YWlsX291dCAtIHVycG9zXzsKKyAgfQorCisgIGJvb2wgcmVhZEZyb21abGliKCkgeworICAgIGFzc2VydCghaW5wdXRFbmRlZF8pOworCisgICAgaWYgKHJzdHJlYW1fLmF2YWlsX2luID09IDApIHsKKyAgICAgIC8vIHpsaWIgaGFzIHVzZWQgdXAgYWxsIHRoZSBjb21wcmVzc2VkIGRhdGEgd2UgcHJvdmlkZWQgaW4gY3JidWYsIHJlYWQKKyAgICAgIC8vIHNvbWUgbW9yZSBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICAgIGF1dG8gZ290ID0gdHJhbnNwb3J0Xy5yZWFkKGNyYnVmXyk7CisgICAgICBpZiAoZ290ID09IDApIHJldHVybiBmYWxzZTsKKyAgICAgIHJzdHJlYW1fLm5leHRfaW4gPSBjcmJ1Zl8ucHRyOworICAgICAgcnN0cmVhbV8uYXZhaWxfaW4gPSB0byF1aW50KGdvdCk7CisgICAgfQorCisgICAgLy8gV2UgaGF2ZSBzb21lIGNvbXByZXNzZWQgZGF0YSBub3csIHVuY29tcHJlc3MgaXQuCisgICAgYXV0byB6bGliX3Jlc3VsdCA9IGluZmxhdGUocnN0cmVhbV8sIFpfU1lOQ19GTFVTSCk7CisgICAgaWYgKHpsaWJfcmVzdWx0ID09IFpfU1RSRUFNX0VORCkgeworICAgICAgaW5wdXRFbmRlZF8gPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICB6bGliRW5mb3JjZSh6bGliX3Jlc3VsdCwgcnN0cmVhbV8pOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgdm9pZCBmbHVzaFRvVHJhbnNwb3J0KGludCB0eXBlKSAgeworICAgIC8vIENvbXByZXNzIHJlbWFpbmluZyBkYXRhIGluIHV3YnVmXyB0byBjd2J1Zl8uCisgICAgZmx1c2hUb1psaWIodXdidWZfWzAgLi4gdXdwb3NfXSwgdHlwZSk7CisgICAgdXdwb3NfID0gMDsKKworICAgIC8vIFdyaXRlIGFsbCBjb21wcmVzc2VkIGRhdGEgdG8gdGhlIHRyYW5zcG9ydC4KKyAgICB0cmFuc3BvcnRfLndyaXRlKGN3YnVmX1swIC4uICQgLSB3c3RyZWFtXy5hdmFpbF9vdXRdKTsKKyAgICB3c3RyZWFtXy5uZXh0X291dCA9IGN3YnVmXy5wdHI7CisgICAgd3N0cmVhbV8uYXZhaWxfb3V0ID0gdG8hdWludChjd2J1Zl8ubGVuZ3RoKTsKKworICAgIC8vIEZsdXNoIHRoZSB0cmFuc3BvcnQuCisgICAgdHJhbnNwb3J0Xy5mbHVzaCgpOworICB9CisKKyAgdm9pZCBmbHVzaFRvWmxpYihpbiB1Ynl0ZVtdIGJ1ZiwgaW50IHR5cGUpIHsKKyAgICB3c3RyZWFtXy5uZXh0X2luID0gY2FzdCh1Ynl0ZSopYnVmLnB0cjsgLy8gemxpYiBvbmx5IHJlYWRzLCBjYXN0IGlzIHNhZmUuCisgICAgd3N0cmVhbV8uYXZhaWxfaW4gPSB0byF1aW50KGJ1Zi5sZW5ndGgpOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmICh0eXBlID09IFpfTk9fRkxVU0ggJiYgd3N0cmVhbV8uYXZhaWxfaW4gPT0gMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKHdzdHJlYW1fLmF2YWlsX291dCA9PSAwKSB7CisgICAgICAgIC8vIGN3YnVmIGhhcyBiZWVuIGV4aGF1c3RlZCBieSB6bGliLCBmbHVzaCB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgICAgICAgIHRyYW5zcG9ydF8ud3JpdGUoY3didWZfKTsKKyAgICAgICAgd3N0cmVhbV8ubmV4dF9vdXQgPSBjd2J1Zl8ucHRyOworICAgICAgICB3c3RyZWFtXy5hdmFpbF9vdXQgPSB0byF1aW50KGN3YnVmXy5sZW5ndGgpOworICAgICAgfQorCisgICAgICBhdXRvIHpsaWJfcmVzdWx0ID0gZGVmbGF0ZSh3c3RyZWFtXywgdHlwZSk7CisKKyAgICAgIGlmICh0eXBlID09IFpfRklOSVNIICYmIHpsaWJfcmVzdWx0ID09IFpfU1RSRUFNX0VORCkgeworICAgICAgICBhc3NlcnQod3N0cmVhbV8uYXZhaWxfaW4gPT0gMCk7CisgICAgICAgIG91dHB1dEZpbmlzaGVkXyA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICB6bGliRW5mb3JjZSh6bGliX3Jlc3VsdCwgd3N0cmVhbV8pOworCisgICAgICBpZiAoKHR5cGUgPT0gWl9TWU5DX0ZMVVNIIHx8IHR5cGUgPT0gWl9GVUxMX0ZMVVNIKSAmJgorICAgICAgICAgIHdzdHJlYW1fLmF2YWlsX2luID09IDAgJiYgd3N0cmVhbV8uYXZhaWxfb3V0ICE9IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RhdGljIHZvaWQgemxpYkVuZm9yY2UoaW50IHN0YXR1cywgel9zdHJlYW0qIHN0cmVhbSkgeworICAgIGlmIChzdGF0dXMgIT0gWl9PSykgeworICAgICAgdGhyb3cgbmV3IFRabGliRXhjZXB0aW9uKHN0YXR1cywgc3RyZWFtLm1zZyk7CisgICAgfQorICB9CisKKyAgc3RhdGljIHZvaWQgemxpYkxvZ0Vycm9yKGludCBzdGF0dXMsIHpfc3RyZWFtKiBzdHJlYW0pIHsKKyAgICBpZiAoc3RhdHVzICE9IFpfT0spIHsKKyAgICAgIGxvZ0Vycm9yKCJUWmxpYlRyYW5zcG9ydDogemxpYiBmYWlsdXJlIGluIGRlc3RydWN0b3I6ICVzIiwKKyAgICAgICAgVFpsaWJFeGNlcHRpb24uZXJyb3JNZXNzYWdlKHN0YXR1cywgc3RyZWFtLm1zZykpOworICAgIH0KKyAgfQorCisgIC8vIFdyaXRlcyBzbWFsbGVyIHRoYW4gdGhpcyBhcmUgYnVmZmVyZWQgdXAgKGR1ZSB0byB6bGliIGhhbmRsaW5nIG92ZXJoZWFkKS4KKyAgLy8gTGFyZ2VyIChvciBlcXVhbCkgd3JpdGVzIGFyZSBkdW1wZWQgc3RyYWlnaHQgdG8gemxpYi4KKyAgZW51bSBNSU5fRElSRUNUX0RFRkxBVEVfU0laRSA9IDMyOworCisgIFRUcmFuc3BvcnQgdHJhbnNwb3J0XzsKKyAgel9zdHJlYW0qIHJzdHJlYW1fOworICB6X3N0cmVhbSogd3N0cmVhbV87CisKKyAgLy8vIFdoZXRoZXIgemxpYiBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBzdHJlYW0uCisgIGJvb2wgaW5wdXRFbmRlZF87CisKKyAgLy8vIFdoZXRoZXIgdGhlIG91dHB1dCBzdHJlYW0gd2FzIGFscmVhZHkgZmluaXNoKCllZC4KKyAgYm9vbCBvdXRwdXRGaW5pc2hlZF87CisKKyAgLy8vIENvbXByZXNzZWQgaW5wdXQgZGF0YSBidWZmZXIuCisgIHVieXRlW10gY3JidWZfOworCisgIC8vLyBVbmNvbXByZXNzZWQgaW5wdXQgZGF0YSBidWZmZXIuCisgIHVieXRlW10gdXJidWZfOworICBzaXplX3QgdXJwb3NfOworCisgIC8vLyBVbmNvbXByZXNzZWQgb3V0cHV0IGRhdGEgYnVmZmVyICh3aGVyZSBzbWFsbCB3cml0ZXMgYXJlIGFjY3VtdWxhdGVkCisgIC8vLyBiZWZvcmUgaGFuZGluZyBvdmVyIHRvIHpsaWIpLgorICB1Ynl0ZVtdIHV3YnVmXzsKKyAgc2l6ZV90IHV3cG9zXzsKKworICAvLy8gQ29tcHJlc3NlZCBvdXRwdXQgZGF0YSBidWZmZXIgKGZpbGxlZCBieSB6bGliLCB3ZSBmbHVzaCBpdCB0byB0aGUKKyAgLy8vIHVuZGVybHlpbmcgdHJhbnNwb3J0KS4KKyAgdWJ5dGVbXSBjd2J1Zl87Cit9CisKKy8qKgorICogV3JhcHMgZ2l2ZW4gdHJhbnNwb3J0cyBpbnRvIFRabGliVHJhbnNwb3J0cy4KKyAqLworYWxpYXMgVFdyYXBwZXJUcmFuc3BvcnRGYWN0b3J5IVRabGliVHJhbnNwb3J0IFRabGliVHJhbnNwb3J0RmFjdG9yeTsKKworLyoqCisgKiBBbiBJTlRFUk5BTF9FUlJPUi10eXBlIFRUcmFuc3BvcnRFeGNlcHRpb24gb3JpZ2luYXRpbmcgZnJvbSBhbiBlcnJvcgorICogc2lnbmFsZWQgYnkgemxpYi4KKyAqLworY2xhc3MgVFpsaWJFeGNlcHRpb24gOiBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgdGhpcyhpbnQgc3RhdHVzQ29kZSwgY29uc3QoY2hhcikqIG1zZykgeworICAgIHN1cGVyKGVycm9yTWVzc2FnZShzdGF0dXNDb2RlLCBtc2cpLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuSU5URVJOQUxfRVJST1IpOworICAgIHpsaWJTdGF0dXNDb2RlID0gc3RhdHVzQ29kZTsKKyAgICB6bGliTXNnID0gbXNnID8gdG8hc3RyaW5nKG1zZykgOiAiKG51bGwpIjsKKyAgfQorCisgIGludCB6bGliU3RhdHVzQ29kZTsKKyAgc3RyaW5nIHpsaWJNc2c7CisKKyAgc3RhdGljIHN0cmluZyBlcnJvck1lc3NhZ2UoaW50IHN0YXR1c0NvZGUsIGNvbnN0KGNoYXIpKiBtc2cpIHsKKyAgICBzdHJpbmcgcmVzdWx0ID0gInpsaWIgZXJyb3I6ICI7CisKKyAgICBpZiAobXNnKSB7CisgICAgICByZXN1bHQgfj0gdG8hc3RyaW5nKG1zZyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCB+PSAiKG5vIG1lc3NhZ2UpIjsKKyAgICB9CisKKyAgICByZXN1bHQgfj0gIiAoc3RhdHVzIGNvZGUgPSAiIH4gdG8hc3RyaW5nKHN0YXR1c0NvZGUpIH4gIikiOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KKwordmVyc2lvbiAodW5pdHRlc3QpIHsKKyAgaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBjb2xsZWN0RXhjZXB0aW9uOworICBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7Cit9CisKKy8vIE1ha2Ugc3VyZSBiYXNpYyByZWFkaW5nL3dyaXRpbmcgd29ya3MuCit1bml0dGVzdCB7CisgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIGF1dG8gemxpYiA9IG5ldyBUWmxpYlRyYW5zcG9ydChidWYpOworCisgIGltbXV0YWJsZSB1Ynl0ZVtdIGRhdGEgPSBbMSwgMiwgMywgNCwgNV07CisgIHpsaWIud3JpdGUoZGF0YSk7CisgIHpsaWIuZmluaXNoKCk7CisKKyAgYXV0byByZXN1bHQgPSBuZXcgdWJ5dGVbZGF0YS5sZW5ndGhdOworICB6bGliLnJlYWRBbGwocmVzdWx0KTsKKyAgZW5mb3JjZShkYXRhID09IHJlc3VsdCk7CisgIHpsaWIudmVyaWZ5Q2hlY2tzdW0oKTsKK30KKworLy8gTWFrZSBzdXJlIHRoZXJlIGlzIG5vIGRhdGEgaXMgd3JpdHRlbiBpZiB3cml0ZSgpIGlzIG5ldmVyIGNhbGxlZC4KK3VuaXR0ZXN0IHsKKyAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgeworICAgIHNjb3BlIHpsaWIgPSBuZXcgVFpsaWJUcmFuc3BvcnQoYnVmKTsKKyAgfQorICBlbmZvcmNlKGJ1Zi5nZXRDb250ZW50cygpLmxlbmd0aCA9PSAwKTsKK30KKworLy8gTWFrZSBzdXJlIGNhbGxpbmcgd3JpdGUoKS9mbHVzaCgpL2ZpbmlzaCgpIGFnYWluIGFmdGVyIGZpbmlzaCgpIHRocm93cy4KK3VuaXR0ZXN0IHsKKyAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgYXV0byB6bGliID0gbmV3IFRabGliVHJhbnNwb3J0KGJ1Zik7CisKKyAgemxpYi53cml0ZShbMSwgMiwgMywgNCwgNV0pOworICB6bGliLmZpbmlzaCgpOworCisgIGF1dG8gZXggPSBjb2xsZWN0RXhjZXB0aW9uIVRUcmFuc3BvcnRFeGNlcHRpb24oemxpYi53cml0ZShbNl0pKTsKKyAgZW5mb3JjZShleCAmJiBleC50eXBlID09IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5CQURfQVJHUyk7CisKKyAgZXggPSBjb2xsZWN0RXhjZXB0aW9uIVRUcmFuc3BvcnRFeGNlcHRpb24oemxpYi5mbHVzaCgpKTsKKyAgZW5mb3JjZShleCAmJiBleC50eXBlID09IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5CQURfQVJHUyk7CisKKyAgZXggPSBjb2xsZWN0RXhjZXB0aW9uIVRUcmFuc3BvcnRFeGNlcHRpb24oemxpYi5maW5pc2goKSk7CisgIGVuZm9yY2UoZXggJiYgZXgudHlwZSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQkFEX0FSR1MpOworfQorCisvLyBNYWtlIHN1cmUgdmVyaWZ5aW5nIHRoZSBjaGVja3N1bSB3b3JrcyBldmVuIGlmIGl0IHJlcXVpcmVzIHN0YXJ0aW5nIGEgbmV3CisvLyByZWFkaW5nIGJ1ZmZlciBhZnRlciByZWFkaW5nIHRoZSBwYXlsb2FkIGhhcyBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgordW5pdHRlc3QgeworICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyOworICBhdXRvIHpsaWIgPSBuZXcgVFpsaWJUcmFuc3BvcnQoYnVmKTsKKworICBpbW11dGFibGUgdWJ5dGVbXSBkYXRhID0gWzEsIDIsIDMsIDQsIDVdOworICB6bGliLndyaXRlKGRhdGEpOworICB6bGliLmZpbmlzaCgpOworCisgIHpsaWIgPSBuZXcgVFpsaWJUcmFuc3BvcnQoYnVmLCBUWmxpYlRyYW5zcG9ydC5ERUZBVUxUX1VSQlVGX1NJWkUsCisgICAgYnVmLmdldENvbnRlbnRzKCkubGVuZ3RoIC0gMSk7IC8vIFRoZSBsYXN0IGJ5dGUgYmVsb25ncyB0byB0aGUgY2hlY2tzdW0uCisKKyAgYXV0byByZXN1bHQgPSBuZXcgdWJ5dGVbZGF0YS5sZW5ndGhdOworICB6bGliLnJlYWRBbGwocmVzdWx0KTsKKyAgZW5mb3JjZShkYXRhID09IHJlc3VsdCk7CisKKyAgemxpYi52ZXJpZnlDaGVja3N1bSgpOworfQorCisvLyBNYWtlIHN1cmUgdmVyaWZ5Q2hlY2tzdW0oKSB0aHJvd3MgaWYgd2UgbWVzc2VkIHdpdGggdGhlIGNoZWNrc3VtLgordW5pdHRlc3QgeworICBpbXBvcnQgc3RkLnN0ZGlvOworICBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5yYW5nZTsKKworICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyOworICBhdXRvIHpsaWIgPSBuZXcgVFpsaWJUcmFuc3BvcnQoYnVmKTsKKworICBpbW11dGFibGUgdWJ5dGVbXSBkYXRhID0gWzEsIDIsIDMsIDQsIDVdOworICB6bGliLndyaXRlKGRhdGEpOworICB6bGliLmZpbmlzaCgpOworCisgIHZvaWQgdGVzdENvcnJ1cHRlZChjb25zdCh1Ynl0ZSlbXSBjb3JydXB0ZWREYXRhKSB7CisgICAgYXV0byByZWFkZXIgPSBuZXcgVFpsaWJUcmFuc3BvcnQodElucHV0UmFuZ2VUcmFuc3BvcnQoY29ycnVwdGVkRGF0YSkpOworICAgIGF1dG8gcmVzdWx0ID0gbmV3IHVieXRlW2RhdGEubGVuZ3RoXTsKKyAgICB0cnkgeworICAgICAgcmVhZGVyLnJlYWRBbGwocmVzdWx0KTsKKworICAgICAgLy8gSWYgaXQgZG9lcyByZWFkIHdpdGhvdXQgY29tcGxhaW5pbmcsIHRoZSByZXN1bHQgc2hvdWxkIGJlIGNvcnJlY3QuCisgICAgICBlbmZvcmNlKHJlc3VsdCA9PSBkYXRhKTsKKyAgICB9IGNhdGNoIChUWmxpYkV4Y2VwdGlvbiBlKSB7fQorCisgICAgYXV0byBleCA9IGNvbGxlY3RFeGNlcHRpb24hVFRyYW5zcG9ydEV4Y2VwdGlvbihyZWFkZXIudmVyaWZ5Q2hlY2tzdW0oKSk7CisgICAgZW5mb3JjZShleCAmJiBleC50eXBlID09IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5DT1JSVVBURURfREFUQSk7CisgIH0KKworICB0ZXN0Q29ycnVwdGVkKGJ1Zi5nZXRDb250ZW50cygpWzAgLi4gJCAtIDFdKTsKKworICBhdXRvIG1vZGlmaWVkID0gYnVmLmdldENvbnRlbnRzKCkuZHVwOworICArK21vZGlmaWVkWyQgLSAxXTsKKyAgdGVzdENvcnJ1cHRlZChtb2RpZmllZCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3V0aWwvYXdhaXRhYmxlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3V0aWwvYXdhaXRhYmxlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0MzZlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdXRpbC9hd2FpdGFibGUuZApAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC51dGlsLmF3YWl0YWJsZTsKKworaW1wb3J0IGNvcmUuc3luYy5jb25kaXRpb247CitpbXBvcnQgY29yZS5zeW5jLm11dGV4OworaW1wb3J0IGNvcmUudGltZSA6IER1cmF0aW9uOworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHN0ZC5zb2NrZXQvKyA6IFNvY2tldCwgc29ja2V0UGFpcisvOyAvLyBETUQgQEBCVUczMTRAQAoraW1wb3J0IHRocmlmdC5iYXNlOworCisvLyBUbyBhdm9pZCBETUQgQEBCVUc2Mzk1QEAuCitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmFsZ29yaXRobTsKKworLyoqCisgKiBBbiBldmVudCB0aGF0IGNhbiBvY2N1ciBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUgYW5kIHdoaWNoIGNhbiBiZQorICogYXdhaXRlZCwgZWl0aGVyIGJ5IGJsb2NraW5nIHVudGlsIGl0IG9jY3Vycywgb3IgYnkgcmVnaXN0ZXJpbmcgYSBjYWxsYmFjaworICogZGVsZWdhdGUuCisgKi8KK2ludGVyZmFjZSBUQXdhaXRhYmxlIHsKKyAgLyoqCisgICAqIFdhaXRzIHVudGlsIHRoZSBldmVudCBvY2N1cnMuCisgICAqCisgICAqIENhbGxpbmcgd2FpdCgpIGZvciBhbiBldmVudCB0aGF0IGhhcyBhbHJlYWR5IG9jY3VycmVkIGlzIGEgbm8tb3AuCisgICAqLworICB2b2lkIHdhaXQoKTsKKworICAvKioKKyAgICogV2FpdHMgdW50aWwgdGhlIGV2ZW50IG9jY3VycyBvciB0aGUgc3BlY2lmaWVkIHRpbWVvdXQgZXhwaXJlcy4KKyAgICoKKyAgICogQ2FsbGluZyB3YWl0KCkgZm9yIGFuIGV2ZW50IHRoYXQgaGFzIGFscmVhZHkgb2NjdXJyZWQgaXMgYSBuby1vcC4KKyAgICoKKyAgICogUmV0dXJuczogV2hldGhlciB0aGUgZXZlbnQgd2FzIHRyaWdnZXJlZCBiZWZvcmUgdGhlIHRpbWVvdXQgZXhwaXJlZC4KKyAgICovCisgIGJvb2wgd2FpdChEdXJhdGlvbiB0aW1lb3V0KTsKKworICAvKioKKyAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgaWYgdGhlIGV2ZW50IG9jY3Vycy4KKyAgICoKKyAgICogVGhlIGRlbGVnYXRlIHdpbGwgbGlrZWx5IGJlIGludm9rZWQgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQsIGFuZCBpcworICAgKiBleHBlY3RlZCBub3QgdG8gcGVyZm9ybSBleHBlbnNpdmUgd29yayBhcyBpdCB3aWxsIHVzdWFsbHkgYmUgaW52b2tlZAorICAgKiBzeW5jaHJvbm91c2x5IGJ5IHRoZSBub3RpZnlpbmcgdGhyZWFkLiBUaGUgb3JkZXIgaW4gd2hpY2ggcmVnaXN0ZXJlZAorICAgKiBjYWxsYmFja3MgYXJlIGludm9rZWQgaXMgbm90IHNwZWNpZmllZC4KKyAgICoKKyAgICogVGhlIGNhbGxiYWNrIG11c3QgbmV2ZXIgdGhyb3csIGJ1dCBub3Rocm93IHNlbWFudGljcyBhcmUgZGlmZmljdWx0IHRvCisgICAqIGVuZm9yY2UsIHNvIGN1cnJlbnRseSBleGNlcHRpb25zIGFyZSBqdXN0IHN3YWxsb3dlZCBieQorICAgKiBUQXdhaXRhYmxlIGltcGxlbWVudGF0aW9ucy4KKyAgICoKKyAgICogSWYgdGhlIGV2ZW50IGhhcyBhbHJlYWR5IG9jY3VycmVkLCB0aGUgZGVsZWdhdGUgaXMgaW1tZWRpYXRlbHkgZXhlY3V0ZWQKKyAgICogaW4gdGhlIGN1cnJlbnQgdGhyZWFkLgorICAgKi8KKyAgdm9pZCBhZGRDYWxsYmFjayh2b2lkIGRlbGVnYXRlKCkgZGcpOworCisgIC8qKgorICAgKiBSZW1vdmVzIGEgcHJldmlvdXNseSBhZGRlZCBjYWxsYmFjay4KKyAgICoKKyAgICogUmV0dXJuczogV2hldGhlciB0aGUgY2FsbGJhY2sgY291bGQgYmUgZm91bmQgaW4gdGhlIGxpc3QsIGkuZS4gd2hldGhlciBpdAorICAgKiAgIHdhcyBwcmV2aW91c2x5IGFkZGVkLgorICAgKi8KKyAgYm9vbCByZW1vdmVDYWxsYmFjayh2b2lkIGRlbGVnYXRlKCkgZGcpOworfQorCisvKioKKyAqIEEgc2ltcGxlIFRBd2FpdGFibGUgZXZlbnQgdHJpZ2dlcmVkIGJ5IGp1c3QgY2FsbGluZyBhIHRyaWdnZXIoKSBtZXRob2QuCisgKi8KK2NsYXNzIFRPbmVzaG90RXZlbnQgOiBUQXdhaXRhYmxlIHsKKyAgdGhpcygpIHsKKyAgICBtdXRleF8gPSBuZXcgTXV0ZXg7CisgICAgY29uZGl0aW9uXyA9IG5ldyBDb25kaXRpb24obXV0ZXhfKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgd2FpdCgpIHsKKyAgICBzeW5jaHJvbml6ZWQgKG11dGV4XykgeworICAgICAgd2hpbGUgKCF0cmlnZ2VyZWRfKSBjb25kaXRpb25fLndhaXQoKTsKKyAgICB9CisgIH0KKworICBvdmVycmlkZSBib29sIHdhaXQoRHVyYXRpb24gdGltZW91dCkgeworICAgIHN5bmNocm9uaXplZCAobXV0ZXhfKSB7CisgICAgICBpZiAodHJpZ2dlcmVkXykgcmV0dXJuIHRydWU7CisgICAgICBjb25kaXRpb25fLndhaXQodGltZW91dCk7CisgICAgICByZXR1cm4gdHJpZ2dlcmVkXzsKKyAgICB9CisgIH0KKworICBvdmVycmlkZSB2b2lkIGFkZENhbGxiYWNrKHZvaWQgZGVsZWdhdGUoKSBkZykgeworICAgIG11dGV4Xy5sb2NrKCk7CisgICAgc2NvcGUgKGZhaWx1cmUpIG11dGV4Xy51bmxvY2soKTsKKworICAgIGNhbGxiYWNrc18gfj0gZGc7CisKKyAgICBpZiAodHJpZ2dlcmVkXykgeworICAgICAgbXV0ZXhfLnVubG9jaygpOworICAgICAgZGcoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtdXRleF8udW5sb2NrKCk7CisgIH0KKworICBvdmVycmlkZSBib29sIHJlbW92ZUNhbGxiYWNrKHZvaWQgZGVsZWdhdGUoKSBkZykgeworICAgIHN5bmNocm9uaXplZCAobXV0ZXhfKSB7CisgICAgICBhdXRvIG9sZExlbmd0aCA9IGNhbGxiYWNrc18ubGVuZ3RoOworICAgICAgY2FsbGJhY2tzXyA9IHJlbW92ZUVxdWFsKGNhbGxiYWNrc18sIGRnKTsKKyAgICAgIHJldHVybiBjYWxsYmFja3NfLmxlbmd0aCA8IG9sZExlbmd0aDsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogVHJpZ2dlcnMgdGhlIGV2ZW50LgorICAgKgorICAgKiBBbnkgcmVnaXN0ZXJlZCBldmVudCBjYWxsYmFja3MgYXJlIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHkgYmVmb3JlIHRoZQorICAgKiBmdW5jdGlvbiByZXR1cm5zLgorICAgKi8KKyAgdm9pZCB0cmlnZ2VyKCkgeworICAgIHN5bmNocm9uaXplZCAobXV0ZXhfKSB7CisgICAgICBpZiAoIXRyaWdnZXJlZF8pIHsKKyAgICAgICAgdHJpZ2dlcmVkXyA9IHRydWU7CisgICAgICAgIGNvbmRpdGlvbl8ubm90aWZ5QWxsKCk7CisgICAgICAgIGZvcmVhY2ggKGM7IGNhbGxiYWNrc18pIGMoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgYm9vbCB0cmlnZ2VyZWRfOworICBNdXRleCBtdXRleF87CisgIENvbmRpdGlvbiBjb25kaXRpb25fOworICB2b2lkIGRlbGVnYXRlKClbXSBjYWxsYmFja3NfOworfQorCisvKioKKyAqIFRyYW5zbGF0ZXMgVEF3YWl0YWJsZSBldmVudHMgaW50byBkdW1teSBtZXNzYWdlcyBvbiBhIHNvY2tldCB0aGF0IGNhbiBiZQorICogdXNlZCBlLmcuIHRvIHdha2UgdXAgZnJvbSBhIHNlbGVjdCgpIGNhbGwuCisgKi8KK2ZpbmFsIGNsYXNzIFRTb2NrZXROb3RpZmllciB7CisgIHRoaXMoKSB7CisgICAgYXV0byBzb2NrcyA9IHNvY2tldFBhaXIoKTsKKyAgICBmb3JlYWNoIChzOyBzb2Nrcykgcy5ibG9ja2luZyA9IGZhbHNlOworICAgIHNlbmRTb2NrZXRfID0gc29ja3NbMF07CisgICAgcmVjdlNvY2tldF8gPSBzb2Nrc1sxXTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgc29ja2V0IHRoZSBtZXNzYWdlcyB3aWxsIGJlIHNlbnQgdG8uCisgICAqLworICBTb2NrZXQgc29ja2V0KCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcmVjdlNvY2tldF87CisgIH0KKworICAvKioKKyAgICogQXRhdGNoZXMgdGhlIHNvY2tldCBub3RpZmllciB0byB0aGUgc3BlY2lmaWVkIGF3YWl0YWJsZSwgY2F1c2luZyBpdCB0bworICAgKiB3cml0ZSBhIGJ5dGUgdG8gdGhlIG5vdGlmaWNhdGlvbiBzb2NrZXQgd2hlbiB0aGUgYXdhaXRhYmxlIGNhbGxiYWNrcyBhcmUKKyAgICogaW52b2tlZC4KKyAgICoKKyAgICogSWYgdGhlIGV2ZW50IGhhcyBhbHJlYWR5IGJlZW4gdHJpZ2dlcmVkLCB0aGUgZHVtbXkgYnl0ZSBpcyB3cml0dGVuCisgICAqIGltbWVkaWF0ZWx5IHRvIHRoZSBzb2NrZXQuCisgICAqCisgICAqIEEgc29ja2V0IG5vdGlmaWVyIGNhbiBvbmx5IGJlIGF0dGFjaGVkIHRvIGEgc2luZ2xlIGF3YWl0YWJsZSBhdCBhIHRpbWUuCisgICAqCisgICAqIFRocm93czogVEV4Y2VwdGlvbiBpZiB0aGUgc29ja2V0IG5vdGlmaWVyIGlzIGFscmVhZHkgYXR0YWNoZWQuCisgICAqLworICB2b2lkIGF0dGFjaChUQXdhaXRhYmxlIGF3YWl0YWJsZSkgeworICAgIGVuZm9yY2UoIWF3YWl0YWJsZV8sIG5ldyBURXhjZXB0aW9uKCJBbHJlYWR5IGF0dGFjaGVkLiIpKTsKKyAgICBhd2FpdGFibGUuYWRkQ2FsbGJhY2soJm5vdGlmeSk7CisgICAgYXdhaXRhYmxlXyA9IGF3YWl0YWJsZTsKKyAgfQorCisgIC8qKgorICAgKiBEZXRhY2hlcyB0aGUgc29ja2V0IG5vdGlmaWVyIGZyb20gdGhlIGF3YWl0YWJsZSBpdCBpcyBjdXJyZW50bHkgYXR0YWNoZWQKKyAgICogdG8uCisgICAqCisgICAqIFRocm93czogVEV4Y2VwdGlvbiBpZiB0aGUgc29ja2V0IG5vdGlmaWVyIGlzIG5vdCBjdXJyZW50bHkgYXR0YWNoZWQuCisgICAqLworICB2b2lkIGRldGFjaCgpIHsKKyAgICBlbmZvcmNlKGF3YWl0YWJsZV8sIG5ldyBURXhjZXB0aW9uKCJOb3QgYXR0YWNoZWQuIikpOworCisgICAgLy8gU29hayB1cCBhbnkgbm90IGN1cnJlbnRseSByZWFkIG5vdGlmaWNhdGlvbiBieXRlcy4KKyAgICB1Ynl0ZVsxXSBkdW1teSA9IHZvaWQ7CisgICAgd2hpbGUgKHJlY3ZTb2NrZXRfLnJlY2VpdmUoZHVtbXkpICE9IFNvY2tldC5FUlJPUikge30KKworICAgIGF1dG8gY291bGRSZW1vdmUgPSBhd2FpdGFibGVfLnJlbW92ZUNhbGxiYWNrKCZub3RpZnkpOworICAgIGFzc2VydChjb3VsZFJlbW92ZSk7CisgICAgYXdhaXRhYmxlXyA9IG51bGw7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBub3RpZnkoKSB7CisgICAgdWJ5dGVbMV0gemVybzsKKyAgICBzZW5kU29ja2V0Xy5zZW5kKHplcm8pOworICB9CisKKyAgVEF3YWl0YWJsZSBhd2FpdGFibGVfOworICBTb2NrZXQgc2VuZFNvY2tldF87CisgIFNvY2tldCByZWN2U29ja2V0XzsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdXRpbC9jYW5jZWxsYXRpb24uZCBiL2xpYi9kL3NyYy90aHJpZnQvdXRpbC9jYW5jZWxsYXRpb24uZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjU1MjM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC91dGlsL2NhbmNlbGxhdGlvbi5kCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOworCitpbXBvcnQgY29yZS5hdG9taWM7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnV0aWwuYXdhaXRhYmxlOworCisvKioKKyAqIEEgY2FuY2VsbGF0aW9uIHJlcXVlc3QgZm9yIGFzeW5jaHJvbm91cyBvciBibG9ja2luZyBzeW5jaHJvbm91cyBvcGVyYXRpb25zLgorICoKKyAqIEl0IGlzIHBhc3NlZCB0byB0aGUgZW50aXR5IGNyZWF0aW5nIGFuIG9wZXJhdGlvbiwgd2hpY2ggd2lsbCB1c3VhbGx5IG1vbml0b3IKKyAqIGl0IGVpdGhlciBieSBwb2xsaW5nIG9yIGJ5IGFkZGluZyBldmVudCBoYW5kbGVycywgYW5kIGNhbmNlbCB0aGUgb3BlcmF0aW9uCisgKiBpZiBpdCBpcyB0cmlnZ2VyZWQuCisgKgorICogRm9yIHN5bmNocm9ub3VzIG9wZXJhdGlvbnMsIHRoaXMgdXN1YWxseSBtZWFucyBlaXRoZXIgdGhyb3dpbmcgYQorICogVENhbmNlbGxlZEV4Y2VwdGlvbiBvciBpbW1lZGlhdGVseSByZXR1cm5pbmcsIGRlcGVuZGluZyBvbiB3aGV0aGVyCisgKiBjYW5jZWxsYXRpb24gaXMgYW4gZXhwZWN0ZWQgcGFydCBvZiB0aGUgdGFzayBvdXRjb21lIG9yIG5vdC4gRm9yCisgKiBhc3luY2hyb25vdXMgb3BlcmF0aW9ucywgY2FuY2VsbGF0aW9uIHR5cGljYWxseSBlbnRhaWxzIHN0b3BwaW5nIGJhY2tncm91bmQKKyAqIHdvcmsgYW5kIGNhbmNlbGxpbmcgYSByZXN1bHQgZnV0dXJlLCBpZiBub3QgYWxyZWFkeSBjb21wbGV0ZWQuCisgKgorICogQW4gb3BlcmF0aW9uIGFjY2VwdGluZyBhIFRDYW5jZWxsYXRpb24gZG9lcyBub3QgbmVlZCB0byBndWFyYW50ZWUgdGhhdCBpdAorICogd2lsbCBhY3R1YWxseSBiZSBhYmxlIHRvIHJlYWN0IHRvIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdC4KKyAqLworaW50ZXJmYWNlIFRDYW5jZWxsYXRpb24geworICAvKioKKyAgICogV2hldGhlciB0aGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaGFzIGJlZW4gdHJpZ2dlcmVkLgorICAgKi8KKyAgYm9vbCB0cmlnZ2VyZWQoKSBjb25zdCBAcHJvcGVydHk7CisKKyAgLyoqCisgICAqIFRocm93cyBhIFRDYW5jZWxsZWRFeGNlcHRpb24gaWYgdGhlIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGhhcyBhbHJlYWR5IGJlZW4KKyAgICogdHJpZ2dlcmVkLgorICAgKi8KKyAgdm9pZCB0aHJvd0lmVHJpZ2dlcmVkKCkgY29uc3Q7CisKKyAgLyoqCisgICAqIEEgVEF3YWl0YWJsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHdhaXQgZm9yIGNhbmNlbGxhdGlvbiB0cmlnZ2VyaW5nLgorICAgKi8KKyAgVEF3YWl0YWJsZSB0cmlnZ2VyaW5nKCkgQHByb3BlcnR5OworfQorCisvKioKKyAqIFRoZSBvcmlnaW4gb2YgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCwgd2hpY2ggcHJvdmlkZXMgYSB3YXkgdG8gYWN0dWFsbHkKKyAqIHRyaWdnZXIgaXQuCisgKgorICogVGhpcyBkZXNpZ24gYWxsb3dzIG9wZXJhdGlvbnMgdG8gcGFzcyB0aGUgVENhbmNlbGxhdGlvbiBvbiB0byBzdWItdGFza3MsCisgKiB3aGlsZSBtYWtpbmcgc3VyZSB0aGF0IHRoZSBjYW5jZWxsYXRpb24gY2FuIG9ubHkgYmUgdHJpZ2dlcmVkIGJ5IHRoZQorICogwrtvdXRlcm1vc3TCqyBpbnN0YW5jZSB3YWl0aW5nIGZvciB0aGUgcmVzdWx0LgorICovCitmaW5hbCBjbGFzcyBUQ2FuY2VsbGF0aW9uT3JpZ2luIDogVENhbmNlbGxhdGlvbiB7CisgIHRoaXMoKSB7CisgICAgZXZlbnRfID0gbmV3IFRPbmVzaG90RXZlbnQ7CisgIH0KKworICAvKioKKyAgICogVHJpZ2dlcnMgdGhlIGNhbmNlbGxhdGlvbiByZXF1ZXN0LgorICAgKi8KKyAgdm9pZCB0cmlnZ2VyKCkgeworICAgIGF0b21pY1N0b3JlKHRyaWdnZXJlZF8sIHRydWUpOworICAgIGV2ZW50Xy50cmlnZ2VyKCk7CisgIH0KKworICAvK292ZXJyaWRlKy8gYm9vbCB0cmlnZ2VyZWQoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBhdG9taWNMb2FkKHRyaWdnZXJlZF8pOworICB9CisKKyAgLytvdmVycmlkZSsvIHZvaWQgdGhyb3dJZlRyaWdnZXJlZCgpIGNvbnN0IHsKKyAgICBpZiAodHJpZ2dlcmVkKSB0aHJvdyBuZXcgVENhbmNlbGxlZEV4Y2VwdGlvbjsKKyAgfQorCisgIC8rb3ZlcnJpZGUrLyBUQXdhaXRhYmxlIHRyaWdnZXJpbmcoKSBAcHJvcGVydHkgeworICAgIHJldHVybiBldmVudF87CisgIH0KKworcHJpdmF0ZToKKyAgc2hhcmVkIGJvb2wgdHJpZ2dlcmVkXzsKKyAgVE9uZXNob3RFdmVudCBldmVudF87Cit9CisKKy8vLworY2xhc3MgVENhbmNlbGxlZEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24geworICAvLy8KKyAgdGhpcyhzdHJpbmcgbXNnID0gbnVsbCwgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywKKyAgICBUaHJvd2FibGUgbmV4dCA9IG51bGwKKyAgKSB7CisgICAgc3VwZXIobXNnID8gbXNnIDogIlRoZSBvcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkLiIsIGZpbGUsIGxpbmUsIG5leHQpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3V0aWwvZnV0dXJlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3V0aWwvZnV0dXJlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIzMmEwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdXRpbC9mdXR1cmUuZApAQCAtMCwwICsxLDU0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC51dGlsLmZ1dHVyZTsKKworaW1wb3J0IGNvcmUuYXRvbWljOworaW1wb3J0IGNvcmUuc3luYy5jb25kaXRpb247CitpbXBvcnQgY29yZS5zeW5jLm11dGV4OworaW1wb3J0IGNvcmUudGltZSA6IER1cmF0aW9uOworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5LCBmcm9udCwgcG9wRnJvbnQ7CitpbXBvcnQgc3RkLmNvbnYgOiB0bzsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCBzdGQudHJhaXRzIDogQmFzZVR5cGVUdXBsZSwgaXNTb21lRnVuY3Rpb24sIFBhcmFtZXRlclR5cGVUdXBsZSwgUmV0dXJuVHlwZTsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudXRpbC5hd2FpdGFibGU7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOworCisvKioKKyAqIFJlcHJlc2VudHMgYW4gb3BlcmF0aW9uIHdoaWNoIGlzIGV4ZWN1dGVkIGFzeW5jaHJvbm91c2x5IGFuZCB0aGUgcmVzdWx0IG9mCisgKiB3aGljaCB3aWxsIGJlY29tZSBhdmFpbGFibGUgYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLgorICoKKyAqIE9uY2UgYSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gY2FuIGJlIGZldGNoZWQKKyAqIHZpYSB0aGUgZ2V0KCkgZmFtaWx5IG9mIG1ldGhvZHMuIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBjYXNlczogRWl0aGVyIHRoZQorICogb3BlcmF0aW9uIHN1Y2NlZWRlZCwgdGhlbiBpdHMgcmV0dXJuIHZhbHVlIGlzIHJldHVybmVkLCBvciBpdCBmYWlsZWQgYnkKKyAqIHRocm93aW5nLCBpbiB3aGljaCBjYXNlIHRoZSBleGNlcHRpb24gaXMgcmV0aHJvd24sIG9yIGl0IHdhcyBjYW5jZWxsZWQKKyAqIGJlZm9yZSwgdGhlbiBhIFRDYW5jZWxsZWRFeGNlcHRpb24gaXMgdGhyb3duLiBUaGVyZSBtaWdodCBiZSBURnV0dXJlCisgKiBpbXBsZW1lbnRhdGlvbnMgd2hpY2ggbmV2ZXIgcG9zc2libHkgZW50ZXIgdGhlIGNhbmNlbGxlZCBzdGF0ZS4KKyAqCisgKiBBbGwgbWV0aG9kcyBhcmUgdGhyZWFkLXNhZmUsIGJ1dCBrZWVwIGluIG1pbmQgdGhhdCBhbnkgZXhjZXB0aW9uIG9iamVjdCBvcgorICogcmVzdWx0IChpZiBpdCBpcyBhIHJlZmVyZW5jZSB0eXBlLCBvZiBjb3Vyc2UpIGlzIHNoYXJlZCBiZXR3ZWVuIGFsbAorICogZ2V0KCktZmFtaWx5IGludm9jYXRpb25zLgorICovCitpbnRlcmZhY2UgVEZ1dHVyZShSZXN1bHRUeXBlKSB7CisgIC8qKgorICAgKiBUaGUgc3RhdHVzIHRoZSBvcGVyYXRpb24gaXMgY3VycmVudGx5IGluLgorICAgKgorICAgKiBBbiBvcGVyYXRpb24gc3RhcnRzIG91dCBpbiBSVU5OSU5HIHN0YXR1cywgYW5kIGNoYW5nZXMgc3RhdGUgdG8gb25lIG9mIHRoZQorICAgKiBvdGhlcnMgYXQgbW9zdCBvbmNlIGFmdGVyd2FyZHMuCisgICAqLworICBURnV0dXJlU3RhdHVzIHN0YXR1cygpIEBwcm9wZXJ0eTsKKworICAvKioKKyAgICogQSBUQXdhaXRhYmxlIHRyaWdnZXJlZCB3aGVuIHRoZSBvcGVyYXRpb24gbGVhdmVzIHRoZSBSVU5OSU5HIHN0YXR1cy4KKyAgICovCisgIFRBd2FpdGFibGUgY29tcGxldGlvbigpIEBwcm9wZXJ0eTsKKworICAvKioKKyAgICogQ29udmVuaWVuY2Ugc2hvcnRoYW5kIGZvciB3YWl0aW5nIHVudGlsIHRoZSByZXN1bHQgaXMgYXZhaWxhYmxlIGFuZCB0aGVuCisgICAqIGdldCgpaW5nIGl0LgorICAgKgorICAgKiBJZiB0aGUgb3BlcmF0aW9uIGhhcyBhbHJlYWR5IGNvbXBsZXRlZCwgdGhlIHJlc3VsdCBpcyBpbW1lZGlhdGVseQorICAgKiByZXR1cm5lZC4KKyAgICoKKyAgICogVGhlIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBpcyDCu2FsaWFzIHRoaXPCqydkIHRvIHRoZSBpbnRlcmZhY2UsIHNvIHRoYXQKKyAgICogVEZ1dHVyZSBjYW4gYmUgdXNlZCBhcyBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIGEgc2ltcGxlIHZhbHVlIGluCisgICAqIHN5bmNocm9ub3VzIGNvZGUuCisgICAqLworICBmaW5hbCBSZXN1bHRUeXBlIHdhaXRHZXQoKSB7CisgICAgY29tcGxldGlvbi53YWl0KCk7CisgICAgcmV0dXJuIGdldCgpOworICB9CisgIGZpbmFsIEBwcm9wZXJ0eSBhdXRvIHdhaXRHZXRQcm9wZXJ0eSgpIHsgcmV0dXJuIHdhaXRHZXQoKTsgfQorICBhbGlhcyB3YWl0R2V0UHJvcGVydHkgdGhpczsKKworICAvKioKKyAgICogQ29udmVuaWVuY2Ugc2hvcnRoYW5kIGZvciB3YWl0aW5nIHVudGlsIHRoZSByZXN1bHQgaXMgYXZhaWxhYmxlIGFuZCB0aGVuCisgICAqIGdldCgpaW5nIGl0LgorICAgKgorICAgKiBJZiB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcyBpbiB0aW1lLCByZXR1cm5zIGl0cyByZXN1bHQgKHJlc3AuIHRocm93cyBhbgorICAgKiBleGNlcHRpb24gZm9yIHRoZSBmYWlsZWQvY2FuY2VsbGVkIGNhc2VzKS4gSWYgbm90LCB0aHJvd3MgYQorICAgKiBURnV0dXJlRXhjZXB0aW9uLgorICAgKi8KKyAgZmluYWwgUmVzdWx0VHlwZSB3YWl0R2V0KER1cmF0aW9uIHRpbWVvdXQpIHsKKyAgICBlbmZvcmNlKGNvbXBsZXRpb24ud2FpdCh0aW1lb3V0KSwgbmV3IFRGdXR1cmVFeGNlcHRpb24oCisgICAgICAiT3BlcmF0aW9uIGRpZCBub3QgY29tcGxldGUgaW4gdGltZS4iKSk7CisgICAgcmV0dXJuIGdldCgpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorICAgKgorICAgKiBUaHJvd3M6IFRGdXR1cmVFeGNlcHRpb24gaWYgdGhlIG9wZXJhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQsCisgICAqICAgVENhbmNlbGxlZEV4Y2VwdGlvbiBpZiBpdCBpcyBub3QgeWV0IGRvbmU7IHRoZSBzZXQgZXhjZXB0aW9uIGlmIGl0CisgICAqICAgZmFpbGVkLgorICAgKi8KKyAgUmVzdWx0VHlwZSBnZXQoKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgY2FwdHVyZWQgZXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gZmFpbGVkLCBvciBudWxsIG90aGVyd2lzZS4KKyAgICoKKyAgICogVGhyb3dzOiBURnV0dXJlRXhjZXB0aW9uIGlmIG5vdCB5ZXQgZG9uZSwgVENhbmNlbGxlZEV4Y2VwdGlvbiBpZiB0aGUKKyAgICogICBvcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkLgorICAgKi8KKyAgRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpOworfQorCisvKioKKyAqIFRoZSBzdGF0ZXMgdGhlIG9wZXJhdGlvbiBvZmZlcmluZyBhIGZ1dHVyZSBpbnRlcmZhY2UgY2FuIGJlIGluLgorICovCitlbnVtIFRGdXR1cmVTdGF0dXMgOiBieXRlIHsKKyAgUlVOTklORywgLy8vIFRoZSBvcGVyYXRpb24gaXMgc3RpbGwgcnVubmluZy4KKyAgU1VDQ0VFREVELCAvLy8gVGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgd2l0aG91dCB0aHJvd2luZyBhbiBleGNlcHRpb24uCisgIEZBSUxFRCwgLy8vIFRoZSBvcGVyYXRpb24gY29tcGxldGVkIGJ5IHRocm93aW5nIGFuIGV4Y2VwdGlvbi4KKyAgQ0FOQ0VMTEVEIC8vLyBUaGUgb3BlcmF0aW9uIHdhcyBjYW5jZWxsZWQuCit9CisKKy8qKgorICogQSBURnV0dXJlIGNvdmVyaW5nIHRoZSBzaW1wbGUgYnV0IGNvbW1vbiBjYXNlIHdoZXJlIHRoZSByZXN1bHQgaXMgc2ltcGx5CisgKiBzZXQgYnkgYSBjYWxsIHRvIHN1Y2NlZWQoKS9mYWlsKCkuCisgKgorICogQWxsIG1ldGhvZHMgYXJlIHRocmVhZC1zYWZlLCBidXQgdXN1YWxseSwgc3VjY2VlZCgpL2ZhaWwoKSBhcmUgb25seSBjYWxsZWQKKyAqIGZyb20gYSBzaW5nbGUgdGhyZWFkIChkaWZmZXJlbnQgZnJvbSB0aGUgdGhyZWFkKHMpIHdhaXRpbmcgZm9yIHRoZSByZXN1bHQKKyAqIHVzaW5nIHRoZSBURnV0dXJlIGludGVyZmFjZSwgdGhvdWdoKS4KKyAqLworY2xhc3MgVFByb21pc2UoUmVzdWx0VHlwZSkgOiBURnV0dXJlIVJlc3VsdFR5cGUgeworICB0aGlzKCkgeworICAgIHN0YXR1c011dGV4XyA9IG5ldyBNdXRleDsKKyAgICBjb21wbGV0aW9uRXZlbnRfID0gbmV3IFRPbmVzaG90RXZlbnQ7CisgIH0KKworICBvdmVycmlkZSBTIHN0YXR1cygpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIGF0b21pY0xvYWQoc3RhdHVzXyk7CisgIH0KKworICBvdmVycmlkZSBUQXdhaXRhYmxlIGNvbXBsZXRpb24oKSBAcHJvcGVydHkgeworICAgIHJldHVybiBjb21wbGV0aW9uRXZlbnRfOworICB9CisKKyAgb3ZlcnJpZGUgUmVzdWx0VHlwZSBnZXQoKSB7CisgICAgYXV0byBzID0gYXRvbWljTG9hZChzdGF0dXNfKTsKKyAgICBlbmZvcmNlKHMgIT0gUy5SVU5OSU5HLAorICAgICAgbmV3IFRGdXR1cmVFeGNlcHRpb24oIk9wZXJhdGlvbiBub3QgeWV0IGNvbXBsZXRlZC4iKSk7CisKKyAgICBpZiAocyA9PSBTLkNBTkNFTExFRCkgdGhyb3cgbmV3IFRDYW5jZWxsZWRFeGNlcHRpb247CisgICAgaWYgKHMgPT0gUy5GQUlMRUQpIHRocm93IGV4Y2VwdGlvbl87CisKKyAgICBzdGF0aWMgaWYgKCFpcyhSZXN1bHRUeXBlID09IHZvaWQpKSB7CisgICAgICByZXR1cm4gcmVzdWx0XzsKKyAgICB9CisgIH0KKworICBvdmVycmlkZSBFeGNlcHRpb24gZ2V0RXhjZXB0aW9uKCkgeworICAgIGF1dG8gcyA9IGF0b21pY0xvYWQoc3RhdHVzXyk7CisgICAgZW5mb3JjZShzICE9IFMuUlVOTklORywKKyAgICAgIG5ldyBURnV0dXJlRXhjZXB0aW9uKCJPcGVyYXRpb24gbm90IHlldCBjb21wbGV0ZWQuIikpOworCisgICAgaWYgKHMgPT0gUy5DQU5DRUxMRUQpIHRocm93IG5ldyBUQ2FuY2VsbGVkRXhjZXB0aW9uOworICAgIGlmIChzID09IFMuU1VDQ0VFREVEKSByZXR1cm4gbnVsbDsKKworICAgIHJldHVybiBleGNlcHRpb25fOworICB9CisKKyAgc3RhdGljIGlmICghaXMoUmVzdWx0VHlwZSA9PSB2b2lkKSkgeworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLCBtYXJrcyBpdCBhcyBkb25lLCBhbmQgbm90aWZpZXMgYW55CisgICAgICogd2FpdGVycy4KKyAgICAgKgorICAgICAqIElmIHRoZSBvcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkIGJlZm9yZSwgbm90aGluZyBoYXBwZW5zLgorICAgICAqCisgICAgICogVGhyb3dzOiBURnV0dXJlRXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gaXMgYWxyZWFkeSBjb21wbGV0ZWQuCisgICAgICovCisgICAgdm9pZCBzdWNjZWVkKFJlc3VsdFR5cGUgcmVzdWx0KSB7CisgICAgICBzeW5jaHJvbml6ZWQgKHN0YXR1c011dGV4XykgeworICAgICAgICBhdXRvIHMgPSBhdG9taWNMb2FkKHN0YXR1c18pOworICAgICAgICBpZiAocyA9PSBTLkNBTkNFTExFRCkgcmV0dXJuOworCisgICAgICAgIGVuZm9yY2UocyA9PSBTLlJVTk5JTkcsCisgICAgICAgICAgbmV3IFRGdXR1cmVFeGNlcHRpb24oIk9wZXJhdGlvbiBhbHJlYWR5IGNvbXBsZXRlZC4iKSk7CisgICAgICAgIHJlc3VsdF8gPSByZXN1bHQ7CisKKyAgICAgICAgYXRvbWljU3RvcmUoc3RhdHVzXywgUy5TVUNDRUVERUQpOworICAgICAgfQorCisgICAgICBjb21wbGV0aW9uRXZlbnRfLnRyaWdnZXIoKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdm9pZCBzdWNjZWVkKCkgeworICAgICAgc3luY2hyb25pemVkIChzdGF0dXNNdXRleF8pIHsKKyAgICAgICAgYXV0byBzID0gYXRvbWljTG9hZChzdGF0dXNfKTsKKyAgICAgICAgaWYgKHMgPT0gUy5DQU5DRUxMRUQpIHJldHVybjsKKworICAgICAgICBlbmZvcmNlKHMgPT0gUy5SVU5OSU5HLAorICAgICAgICAgIG5ldyBURnV0dXJlRXhjZXB0aW9uKCJPcGVyYXRpb24gYWxyZWFkeSBjb21wbGV0ZWQuIikpOworCisgICAgICAgIGF0b21pY1N0b3JlKHN0YXR1c18sIFMuU1VDQ0VFREVEKTsKKyAgICAgIH0KKworICAgICAgY29tcGxldGlvbkV2ZW50Xy50cmlnZ2VyKCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIE1hcmtzIHRoZSBvcGVyYXRpb24gYXMgZmFpbGVkIHdpdGggdGhlIHNwZWNpZmllZCBleGNlcHRpb24gYW5kIG5vdGlmaWVzCisgICAqIGFueSB3YWl0ZXJzLgorICAgKgorICAgKiBJZiB0aGUgb3BlcmF0aW9uIHdhcyBhbHJlYWR5IGNhbmNlbGxlZCwgbm90aGluZyBoYXBwZW5zLgorICAgKgorICAgKiBUaHJvd3M6IFRGdXR1cmVFeGNlcHRpb24gaWYgdGhlIG9wZXJhdGlvbiBpcyBhbHJlYWR5IGNvbXBsZXRlZC4KKyAgICovCisgIHZvaWQgZmFpbChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgc3luY2hyb25pemVkIChzdGF0dXNNdXRleF8pIHsKKyAgICAgIGF1dG8gc3RhdHVzID0gYXRvbWljTG9hZChzdGF0dXNfKTsKKyAgICAgIGlmIChzdGF0dXMgPT0gUy5DQU5DRUxMRUQpIHJldHVybjsKKworICAgICAgZW5mb3JjZShzdGF0dXMgPT0gUy5SVU5OSU5HLAorICAgICAgICBuZXcgVEZ1dHVyZUV4Y2VwdGlvbigiT3BlcmF0aW9uIGFscmVhZHkgY29tcGxldGVkLiIpKTsKKyAgICAgIGV4Y2VwdGlvbl8gPSBleGNlcHRpb247CisKKyAgICAgIGF0b21pY1N0b3JlKHN0YXR1c18sIFMuRkFJTEVEKTsKKyAgICB9CisKKyAgICBjb21wbGV0aW9uRXZlbnRfLnRyaWdnZXIoKTsKKyAgfQorCisKKyAgLyoqCisgICAqIE1hcmtzIHRoaXMgb3BlcmF0aW9uIGFzIGNvbXBsZXRlZCBhbmQgdGFrZXMgb3ZlciB0aGUgb3V0Y29tZSBvZiBhbm90aGVyCisgICAqIFRGdXR1cmUgb2YgdGhlIHNhbWUgdHlwZS4KKyAgICoKKyAgICogSWYgdGhpcyBvcGVyYXRpb24gd2FzIGFscmVhZHkgY2FuY2VsbGVkLCBub3RoaW5nIGhhcHBlbnMuIElmIHRoZSBvdGhlcgorICAgKiBvcGVyYXRpb24gd2FzIGNhbmNlbGxlZCwgdGhpcyBvcGVyYXRpb24gaXMgbWFya2VkIGFzIGZhaWxlZCB3aXRoIGEKKyAgICogVENhbmNlbGxlZEV4Y2VwdGlvbi4KKyAgICoKKyAgICogVGhyb3dzOiBURnV0dXJlRXhjZXB0aW9uIGlmIHRoZSBwYXNzZWQgaW4gZnV0dXJlIHdhcyBub3QgY29tcGxldGVkIG9yCisgICAqICAgdGhpcyBvcGVyYXRpb24gaXMgYWxyZWFkeSBjb21wbGV0ZWQuCisgICAqLworICB2b2lkIGNvbXBsZXRlKFRGdXR1cmUhUmVzdWx0VHlwZSBmdXR1cmUpIHsKKyAgICBzeW5jaHJvbml6ZWQgKHN0YXR1c011dGV4XykgeworICAgICAgYXV0byBzdGF0dXMgPSBhdG9taWNMb2FkKHN0YXR1c18pOworICAgICAgaWYgKHN0YXR1cyA9PSBTLkNBTkNFTExFRCkgcmV0dXJuOworICAgICAgZW5mb3JjZShzdGF0dXMgPT0gUy5SVU5OSU5HLAorICAgICAgICBuZXcgVEZ1dHVyZUV4Y2VwdGlvbigiT3BlcmF0aW9uIGFscmVhZHkgY29tcGxldGVkLiIpKTsKKworICAgICAgZW5mb3JjZShmdXR1cmUuc3RhdHVzICE9IFMuUlVOTklORywgbmV3IFRGdXR1cmVFeGNlcHRpb24oCisgICAgICAgICJUaGUgcGFzc2VkIFRGdXR1cmUgaXMgbm90IHlldCBjb21wbGV0ZWQuIikpOworCisgICAgICBzdGF0dXMgPSBmdXR1cmUuc3RhdHVzOworICAgICAgaWYgKHN0YXR1cyA9PSBTLkNBTkNFTExFRCkgeworICAgICAgICBzdGF0dXMgPSBTLkZBSUxFRDsKKyAgICAgICAgZXhjZXB0aW9uXyA9IG5ldyBUQ2FuY2VsbGVkRXhjZXB0aW9uOworICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gUy5GQUlMRUQpIHsKKyAgICAgICAgZXhjZXB0aW9uXyA9IGZ1dHVyZS5nZXRFeGNlcHRpb24oKTsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKCFpcyhSZXN1bHRUeXBlID09IHZvaWQpKSB7CisgICAgICAgIHJlc3VsdF8gPSBmdXR1cmUuZ2V0KCk7CisgICAgICB9CisKKyAgICAgIGF0b21pY1N0b3JlKHN0YXR1c18sIHN0YXR1cyk7CisgICAgfQorCisgICAgY29tcGxldGlvbkV2ZW50Xy50cmlnZ2VyKCk7CisgIH0KKworICAvKioKKyAgICogTWFya3MgdGhpcyBvcGVyYXRpb24gYXMgY2FuY2VsbGVkIGFuZCBub3RpZmllcyBhbnkgd2FpdGVycy4KKyAgICoKKyAgICogSWYgdGhlIG9wZXJhdGlvbiBpcyBhbHJlYWR5IGNvbXBsZXRlZCwgbm90aGluZyBoYXBwZW5zLgorICAgKi8KKyAgdm9pZCBjYW5jZWwoKSB7CisgICAgc3luY2hyb25pemVkIChzdGF0dXNNdXRleF8pIHsKKyAgICAgIGF1dG8gc3RhdHVzID0gYXRvbWljTG9hZChzdGF0dXNfKTsKKyAgICAgIGlmIChzdGF0dXMgPT0gUy5SVU5OSU5HKSBhdG9taWNTdG9yZShzdGF0dXNfLCBTLkNBTkNFTExFRCk7CisgICAgfQorCisgICAgY29tcGxldGlvbkV2ZW50Xy50cmlnZ2VyKCk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8gQ29udmVuaWVuY2UgYWxpYXMgYmVjYXVzZSBURnV0dXJlU3RhdHVzIGlzIHViaXF1aXRvdXMgaW4gdGhpcyBjbGFzcy4KKyAgYWxpYXMgVEZ1dHVyZVN0YXR1cyBTOworCisgIC8vIFRoZSBzdGF0dXMgdGhlIHByb21pc2UgaXMgY3VycmVudGx5IGluLgorICBzaGFyZWQgUyBzdGF0dXNfOworCisgIHVuaW9uIHsKKyAgICBzdGF0aWMgaWYgKCFpcyhSZXN1bHRUeXBlID09IHZvaWQpKSB7CisgICAgICAvLyBTZXQgaWYgc3RhdHVzXyBpcyBTVUNDRUVERUQuCisgICAgICBSZXN1bHRUeXBlIHJlc3VsdF87CisgICAgfQorICAgIC8vIFNldCBpZiBzdGF0dXNfIGlzIEZBSUxFRC4KKyAgICBFeGNlcHRpb24gZXhjZXB0aW9uXzsKKyAgfQorCisgIC8vIFByb3RlY3RzIHN0YXR1c18uCisgIC8vIEFzIGZvciByZXN1bHRfIGFuZCBleGNlcHRpb25fOiBUaGV5IGFyZSBvbmx5IHNldCBvbmNlLCB3aGlsZSBzdGF0dXNfIGlzCisgIC8vIHN0aWxsIFJVTk5JTkcsIHNvIGdpdmVuIHRoYXQgdGhlIG9wZXJhdGlvbiBoYXMgYWxyZWFkeSBjb21wbGV0ZWQsIHJlYWRpbmcKKyAgLy8gdGhlbSBpcyBzYWZlIHdpdGhvdXQgaG9sZGluZyBzb21lIGtpbmQgb2YgbG9jay4KKyAgTXV0ZXggc3RhdHVzTXV0ZXhfOworCisgIC8vIFRyaWdnZXJlZCB3aGVuIHRoZSBldmVudCBjb21wbGV0ZXMuCisgIFRPbmVzaG90RXZlbnQgY29tcGxldGlvbkV2ZW50XzsKK30KKworLy8vCitjbGFzcyBURnV0dXJlRXhjZXB0aW9uIDogVEV4Y2VwdGlvbiB7CisgIC8vLworICB0aGlzKHN0cmluZyBtc2cgPSAiIiwgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywKKyAgICBUaHJvd2FibGUgbmV4dCA9IG51bGwpCisgIHsKKyAgICBzdXBlcihtc2csIGZpbGUsIGxpbmUsIG5leHQpOworICB9Cit9CisKKy8qKgorICogQ3JlYXRlcyBhbiBpbnRlcmZhY2UgdGhhdCBpcyBzaW1pbGFyIHRvIGEgZ2l2ZW4gb25lLCBidXQgYWNjZXB0cyBhbgorICogYWRkaXRpb25hbCwgb3B0aW9uYWwgVENhbmNlbGxhdGlvbiBwYXJhbWV0ZXIgZWFjaCBtZXRob2QsIGFuZCByZXR1cm5zCisgKiBURnV0dXJlcyBpbnN0ZWFkIG9mIHBsYWluIHJldHVybiB2YWx1ZXMuCisgKgorICogRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb25zOgorICogLS0tCisgKiBpbnRlcmZhY2UgRm9vIHsKKyAqICAgdm9pZCBiYXIoKTsKKyAqICAgc3RyaW5nIGJheihpbnQgYSk7CisgKiB9CisgKiBhbGlhcyBURnV0dXJlSW50ZXJmYWNlIUZvbyBGdXR1cmVGb287CisgKiAtLS0KKyAqCisgKiBGdXR1cmVGb28gd291bGQgYmUgZXF1aXZhbGVudCB0bzoKKyAqIC0tLQorICogaW50ZXJmYWNlIEZ1dHVyZUZvbyB7CisgKiAgIFRGdXR1cmUhdm9pZCBiYXIoVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24gPSBudWxsKTsKKyAqICAgVEZ1dHVyZSFzdHJpbmcgYmF6KGludCBhLCBUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbiA9IG51bGwpOworICogfQorICogLS0tCisgKi8KK3RlbXBsYXRlIFRGdXR1cmVJbnRlcmZhY2UoSW50ZXJmYWNlKSBpZiAoaXMoSW50ZXJmYWNlIF8gPT0gaW50ZXJmYWNlKSkgeworICBtaXhpbih7CisgICAgc3RyaW5nIGNvZGUgPSAiaW50ZXJmYWNlIFRGdXR1cmVJbnRlcmZhY2UgXG4iOworCisgICAgc3RhdGljIGlmIChpcyhJbnRlcmZhY2UgQmFzZXMgPT0gc3VwZXIpICYmIEJhc2VzLmxlbmd0aCA+IDApIHsKKyAgICAgIGNvZGUgfj0gIjogIjsKKyAgICAgIGZvcmVhY2ggKGk7IDAgLi4gQmFzZXMubGVuZ3RoKSB7CisgICAgICAgIGlmIChpID4gMCkgY29kZSB+PSAiLCAiOworICAgICAgICBjb2RlIH49ICJURnV0dXJlSW50ZXJmYWNlIShCYXNlVHlwZVR1cGxlIUludGVyZmFjZVsiIH4gdG8hc3RyaW5nKGkpIH4gIl0pICI7CisgICAgICB9CisgICAgfQorCisgICAgY29kZSB+PSAie1xuIjsKKworICAgIGZvcmVhY2ggKG1ldGhvZE5hbWU7IF9fdHJhaXRzKGRlcml2ZWRNZW1iZXJzLCBJbnRlcmZhY2UpKSB7CisgICAgICBlbnVtIHFuID0gIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZTsKKyAgICAgIHN0YXRpYyBpZiAoaXNTb21lRnVuY3Rpb24hKG1peGluKHFuKSkpIHsKKyAgICAgICAgY29kZSB+PSAiVEZ1dHVyZSEoUmV0dXJuVHlwZSEoIiB+IHFuIH4gIikpICIgfiBtZXRob2ROYW1lIH4KKyAgICAgICAgICAiKFBhcmFtZXRlclR5cGVUdXBsZSEoIiB+IHFuIH4gIiksIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uID0gbnVsbCk7XG4iOworICAgICAgfQorICAgIH0KKworICAgIGNvZGUgfj0gIn1cbiI7CisgICAgcmV0dXJuIGNvZGU7CisgIH0oKSk7Cit9CisKKy8qKgorICogQW4gaW5wdXQgcmFuZ2UgdGhhdCBhZ2dyZWdhdGVzIHJlc3VsdHMgZnJvbSBtdWx0aXBsZSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucywKKyAqIHJldHVybmluZyB0aGVtIGluIHRoZSBvcmRlciB0aGV5IGFycml2ZS4KKyAqCisgKiBBZGRpdGlvbmFsbHksIGEgdGltZW91dCBjYW4gYmUgc2V0IGFmdGVyIHdoaWNoIHJlc3VsdHMgZnJvbSBub3QgeWV0IGZpbmlzaGVkCisgKiBmdXR1cmVzIHdpbGwgbm8gbG9uZ2VyIGJlIHdhaXRlZCBmb3IsIGUuZy4gdG8gZW5zdXJlIHRoZSB0aW1lIGl0IHRha2VzIHRvCisgKiBpdGVyYXRlIG92ZXIgYSBzZXQgb2YgcmVzdWx0cyBpcyBsaW1pdGVkLgorICovCitmaW5hbCBjbGFzcyBURnV0dXJlQWdncmVnYXRvclJhbmdlKFQpIHsKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBmdXR1cmVzID0gVGhlIHNldCBvZiBmdXR1cmVzIHRvIGNvbGxlY3QgcmVzdWx0cyBmcm9tLgorICAgKiAgIHRpbWVvdXQgPSBJZiBwb3NpdGl2ZSwgbm90IHlldCBmaW5pc2hlZCBmdXR1cmVzIHdpbGwgYmUgY2FuY2VsbGVkIGFuZAorICAgKiAgICAgdGhlaXIgcmVzdWx0cyB3aWxsIG5vdCBiZSB0YWtlbiBpbnRvIGFjY291bnQuCisgICAqLworICB0aGlzKFRGdXR1cmUhVFtdIGZ1dHVyZXMsIFRDYW5jZWxsYXRpb25PcmlnaW4gY2hpbGRDYW5jZWxsYXRpb24sCisgICAgRHVyYXRpb24gdGltZW91dCA9IGR1ciEiaG5zZWNzIigwKQorICApIHsKKyAgICBpZiAodGltZW91dCA+IGR1ciEiaG5zZWNzIigwKSkgeworICAgICAgdGltZW91dFN5c1RpY2tfID0gVGlja0R1cmF0aW9uLmN1cnJTeXN0ZW1UaWNrICsKKyAgICAgICAgVGlja0R1cmF0aW9uLmZyb20hImhuc2VjcyIodGltZW91dC50b3RhbCEiaG5zZWNzIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHRpbWVvdXRTeXNUaWNrXyA9IFRpY2tEdXJhdGlvbigwKTsKKyAgICB9CisKKyAgICBxdWV1ZU11dGV4XyA9IG5ldyBNdXRleDsKKyAgICBxdWV1ZU5vbkVtcHR5Q29uZGl0aW9uXyA9IG5ldyBDb25kaXRpb24ocXVldWVNdXRleF8pOworICAgIGZ1dHVyZXNfID0gZnV0dXJlczsKKyAgICBjaGlsZENhbmNlbGxhdGlvbl8gPSBjaGlsZENhbmNlbGxhdGlvbjsKKworICAgIGZvcmVhY2ggKGZ1dHVyZTsgZnV0dXJlc18pIHsKKyAgICAgIGZ1dHVyZS5jb21wbGV0aW9uLmFkZENhbGxiYWNrKHsKKyAgICAgICAgYXV0byBmID0gZnV0dXJlOworICAgICAgICByZXR1cm4geworICAgICAgICAgIGlmIChmLnN0YXR1cyA9PSBURnV0dXJlU3RhdHVzLkNBTkNFTExFRCkgcmV0dXJuOworICAgICAgICAgIGFzc2VydChmLnN0YXR1cyAhPSBURnV0dXJlU3RhdHVzLlJVTk5JTkcpOworCisgICAgICAgICAgc3luY2hyb25pemVkIChxdWV1ZU11dGV4XykgeworICAgICAgICAgICAgY29tcGxldGVkUXVldWVfIH49IGY7CisKKyAgICAgICAgICAgIGlmIChjb21wbGV0ZWRRdWV1ZV8ubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgICAgcXVldWVOb25FbXB0eUNvbmRpdGlvbl8ubm90aWZ5QWxsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgfSgpKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogV2hldGhlciB0aGUgcmFuZ2UgaXMgZW1wdHkuCisgICAqCisgICAqIFRoaXMgaXMgdGhlIGNhc2UgaWYgdGhlIHJlc3VsdHMgZnJvbSB0aGUgY29tcGxldGVkIGZ1dHVyZXMgbm90IGhhdmluZworICAgKiBmYWlsZWQgaGF2ZSBhbHJlYWR5IGJlZW4gcG9wcGVkIGFuZCBlaXRoZXIgYWxsIGZ1dHVyZSBoYXZlIGJlZW4gZmluaXNoZWQKKyAgICogb3IgdGhlIHRpbWVvdXQgaGFzIGV4cGlyZWQuCisgICAqCisgICAqIFBvdGVudGlhbGx5IGJsb2NrcyB1bnRpbCBhIG5ldyByZXN1bHQgaXMgYXZhaWxhYmxlIG9yIHRoZSB0aW1lb3V0IGhhcworICAgKiBleHBpcmVkLgorICAgKi8KKyAgYm9vbCBlbXB0eSgpIEBwcm9wZXJ0eSB7CisgICAgaWYgKGZpbmlzaGVkXykgcmV0dXJuIHRydWU7CisgICAgaWYgKGJ1ZmZlckZpbGxlZF8pIHJldHVybiBmYWxzZTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBURnV0dXJlIVQgZnV0dXJlOworICAgICAgc3luY2hyb25pemVkIChxdWV1ZU11dGV4XykgeworICAgICAgICAvLyBUaGUgd2hpbGUgbG9vcCBpcyBqdXN0IGJlaW5nIGNhdXRpb3VzIGFib3V0IHNwdXJpb3VzIHdha2V1cHMsIGluCisgICAgICAgIC8vIGNhc2UgdGhleSBzaG91bGQgYmUgcG9zc2libGUuCisgICAgICAgIHdoaWxlIChjb21wbGV0ZWRRdWV1ZV8uZW1wdHkpIHsKKyAgICAgICAgICBhdXRvIHJlbWFpbmluZyA9IHRvIUR1cmF0aW9uKHRpbWVvdXRTeXNUaWNrXyAtCisgICAgICAgICAgICBUaWNrRHVyYXRpb24uY3VyclN5c3RlbVRpY2spOworCisgICAgICAgICAgaWYgKHJlbWFpbmluZyA8PSBkdXIhImhuc2VjcyIoMCkpIHsKKyAgICAgICAgICAgIC8vIE5vIHRpbWUgbGVmdCwgYnV0IHN0aWxsIG5vIGVsZW1lbnQgcmVjZWl2ZWQg4oCTIHdlIGFyZSBlbXB0eSBub3cuCisgICAgICAgICAgICBmaW5pc2hlZF8gPSB0cnVlOworICAgICAgICAgICAgY2hpbGRDYW5jZWxsYXRpb25fLnRyaWdnZXIoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIHF1ZXVlTm9uRW1wdHlDb25kaXRpb25fLndhaXQocmVtYWluaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIGZ1dHVyZSA9IGNvbXBsZXRlZFF1ZXVlXy5mcm9udDsKKyAgICAgICAgY29tcGxldGVkUXVldWVfLnBvcEZyb250KCk7CisgICAgICB9CisKKyAgICAgICsrY29tcGxldGVkQ291bnRfOworICAgICAgaWYgKGNvbXBsZXRlZENvdW50XyA9PSBmdXR1cmVzXy5sZW5ndGgpIHsKKyAgICAgICAgLy8gVGhpcyB3YXMgdGhlIGxhc3QgZnV0dXJlIGluIHRoZSBsaXN0LCB0aGVyZSBpcyBubyBwb3NzaWJpbGl0eQorICAgICAgICAvLyBhbm90aGVyIHJlc3VsdCBjb3VsZCBldmVyIGJlY29tZSBhdmFpbGFibGUuCisgICAgICAgIGZpbmlzaGVkXyA9IHRydWU7CisgICAgICB9CisKKyAgICAgIGlmIChmdXR1cmUuc3RhdHVzID09IFRGdXR1cmVTdGF0dXMuRkFJTEVEKSB7CisgICAgICAgIC8vIFRoaXMgb25lIGZhaWxlZCwgbG9vcCBhZ2FpbiBhbmQgdHJ5IGdldHRpbmcgYW5vdGhlciBpdGVtIGZyb20KKyAgICAgICAgLy8gdGhlIHF1ZXVlLgorICAgICAgICBleGNlcHRpb25zXyB+PSBmdXR1cmUuZ2V0RXhjZXB0aW9uKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHRCdWZmZXJfID0gZnV0dXJlLmdldCgpOworICAgICAgICBidWZmZXJGaWxsZWRfID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IGZyb20gdGhlIHJhbmdlLgorICAgKgorICAgKiBQb3RlbnRpYWxseSBibG9ja3MgdW50aWwgYSBuZXcgcmVzdWx0IGlzIGF2YWlsYWJsZSBvciB0aGUgdGltZW91dCBoYXMKKyAgICogZXhwaXJlZC4KKyAgICoKKyAgICogVGhyb3dzOiBURXhjZXB0aW9uIGlmIHRoZSByYW5nZSBpcyBlbXB0eS4KKyAgICovCisgIFQgZnJvbnQoKSB7CisgICAgZW5mb3JjZSghZW1wdHksIG5ldyBURXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCBnZXQgZnJvbnQgb2YgYW4gZW1wdHkgZnV0dXJlIGFnZ3JlZ2F0b3IgcmFuZ2UuIikpOworICAgIHJldHVybiByZXN1bHRCdWZmZXJfOworICB9CisKKyAgLyoqCisgICAqIFJlbW92ZXMgdGhlIGZpcnN0IGVsZW1lbnQgZnJvbSB0aGUgcmFuZ2UuCisgICAqCisgICAqIFBvdGVudGlhbGx5IGJsb2NrcyB1bnRpbCBhIG5ldyByZXN1bHQgaXMgYXZhaWxhYmxlIG9yIHRoZSB0aW1lb3V0IGhhcworICAgKiBleHBpcmVkLgorICAgKgorICAgKiBUaHJvd3M6IFRFeGNlcHRpb24gaWYgdGhlIHJhbmdlIGlzIGVtcHR5LgorICAgKi8KKyAgdm9pZCBwb3BGcm9udCgpIHsKKyAgICBlbmZvcmNlKCFlbXB0eSwgbmV3IFRFeGNlcHRpb24oCisgICAgICAiQ2Fubm90IHBvcCBmcm9udCBvZiBhbiBlbXB0eSBmdXR1cmUgYWdncmVnYXRvciByYW5nZS4iKSk7CisgICAgYnVmZmVyRmlsbGVkXyA9IGZhbHNlOworICB9CisKKyAgLyoqCisgICAqIFRoZSBudW1iZXIgb2YgZnV0dXJlcyB0aGUgcmVzdWx0IG9mIHdoaWNoIGhhcyBiZWVuIHJldHVybmVkIG9yIHdoaWNoIGhhdmUKKyAgICogZmFpbGVkIHNvIGZhci4KKyAgICovCisgIHNpemVfdCBjb21wbGV0ZWRDb3VudCgpIEBwcm9wZXJ0eSBjb25zdCB7CisgICAgcmV0dXJuIGNvbXBsZXRlZENvdW50XzsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgZXhjZXB0aW9ucyBjb2xsZWN0ZWQgZnJvbSBmYWlsZWQgVEZ1dHVyZXMgc28gZmFyLgorICAgKi8KKyAgRXhjZXB0aW9uW10gZXhjZXB0aW9ucygpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIGV4Y2VwdGlvbnNfOworICB9CisKK3ByaXZhdGU6CisgIFRGdXR1cmUhVFtdIGZ1dHVyZXNfOworICBUQ2FuY2VsbGF0aW9uT3JpZ2luIGNoaWxkQ2FuY2VsbGF0aW9uXzsKKworICAvLyBUaGUgc3lzdGVtIHRpY2sgdGhpcyBvcGVyYXRpb24gd2lsbCB0aW1lIG91dCwgb3IgemVybyBpZiBubyB0aW1lb3V0IGhhcworICAvLyBiZWVuIHNldC4KKyAgVGlja0R1cmF0aW9uIHRpbWVvdXRTeXNUaWNrXzsKKworICBib29sIGZpbmlzaGVkXzsKKworICBib29sIGJ1ZmZlckZpbGxlZF87CisgIFQgcmVzdWx0QnVmZmVyXzsKKworICBFeGNlcHRpb25bXSBleGNlcHRpb25zXzsKKyAgc2l6ZV90IGNvbXBsZXRlZENvdW50XzsKKworICAvLyBUaGUgcXVldWUgb2YgY29tcGxldGVkIGZ1dHVyZXMuIFRoaXMgKGFuZCB0aGUgYXNzb2NpYXRlZCBjb25kaXRpb24pIGFyZQorICAvLyB0aGUgb25seSBwYXJ0cyBvZiB0aGlzIGNsYXNzIHRoYXQgYXJlIGFjY2Vzc2VkIGJ5IG11bHRpcGxlIHRocmVhZHMuCisgIFRGdXR1cmUhVFtdIGNvbXBsZXRlZFF1ZXVlXzsKKyAgTXV0ZXggcXVldWVNdXRleF87CisgIENvbmRpdGlvbiBxdWV1ZU5vbkVtcHR5Q29uZGl0aW9uXzsKK30KKworLyoqCisgKiBURnV0dXJlQWdncmVnYXRvclJhbmdlIGNvbnN0cnVjdGlvbiBoZWxwZXIgdG8gYXZvaWQgaGF2aW5nIHRvIGV4cGxpY2l0bHkKKyAqIHNwZWNpZnkgdGhlIHZhbHVlIHR5cGUsIGkuZS4gdG8gYWxsb3cgdGhlIGNvbnN0cnVjdG9yIGJlaW5nIGNhbGxlZCB1c2luZyBJRlRJCisgKiAoc2VlICQoRE1EQlVHIDYwODIsIEQgQnVnemlsbGEgZW5oYW5jZW1lbnQgcmVxdWV0IDYwODIpKS4KKyAqLworVEZ1dHVyZUFnZ3JlZ2F0b3JSYW5nZSFUIHRGdXR1cmVBZ2dyZWdhdG9yUmFuZ2UoVCkoVEZ1dHVyZSFUW10gZnV0dXJlcywKKyAgVENhbmNlbGxhdGlvbk9yaWdpbiBjaGlsZENhbmNlbGxhdGlvbiwgRHVyYXRpb24gdGltZW91dCA9IGR1ciEiaG5zZWNzIigwKQorKSB7CisgIHJldHVybiBuZXcgVEZ1dHVyZUFnZ3JlZ2F0b3JSYW5nZSFUKGZ1dHVyZXMsIGNoaWxkQ2FuY2VsbGF0aW9uLCB0aW1lb3V0KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdXRpbC9oYXNoc2V0LmQgYi9saWIvZC9zcmMvdGhyaWZ0L3V0aWwvaGFzaHNldC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZTEyMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3V0aWwvaGFzaHNldC5kCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnV0aWwuaGFzaHNldDsKKworaW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBqb2luZXIsIG1hcDsKK2ltcG9ydCBzdGQuY29udiA6IHRvOworaW1wb3J0IHN0ZC50cmFpdHMgOiBpc0ltcGxpY2l0bHlDb252ZXJ0aWJsZSwgUGFyYW1ldGVyVHlwZVR1cGxlOworaW1wb3J0IHN0ZC5yYW5nZSA6IEVsZW1lbnRUeXBlLCBpc0lucHV0UmFuZ2U7CisKK3N0cnVjdCBWb2lkIHt9CisKKy8qKgorICogQSBxdWlja2x5IGhhY2tlZCB0b2dldGhlciBoYXNoIHNldCBpbXBsZW1lbnRhdGlvbiBiYWNrZWQgYnkgYnVpbHQtaW4KKyAqIGFzc29jaWF0aXZlIGFycmF5cyB0byBoYXZlIHNvbWV0aGluZyB0byBjb21waWxlIFRocmlmdCdzIHNldDw+IHRvIHVudGlsCisgKiBzdGQuY29udGFpbmVyIGdhaW5zIHNvbWV0aGluZyBzdWl0YWJsZS4KKyAqLworLy8gTm90ZTogVGhlIGZ1bmt5IHBvaW50ZXIgY2FzdHMgKGkuZS4gKihjYXN0KGltbXV0YWJsZShFKSopJmUpIGluc3RlYWQgb2YKKy8vIGp1c3QgY2FzdChpbW11dGFibGUoRSkpZSkgYXJlIGEgd29ya2Fyb3VuZCBmb3IgTERDIDIgY29tcGF0aWJpbGl0eS4KK2ZpbmFsIGNsYXNzIEhhc2hTZXQoRSkgeworICAvLy8KKyAgdGhpcygpIHt9CisKKyAgLy8vCisgIHRoaXMoRVtdIGVsZW1zLi4uKSB7CisgICAgaW5zZXJ0KGVsZW1zKTsKKyAgfQorCisgIC8vLworICB2b2lkIGluc2VydChTdHVmZikoU3R1ZmYgc3R1ZmYpIGlmIChpc0ltcGxpY2l0bHlDb252ZXJ0aWJsZSEoU3R1ZmYsIEUpKSB7CisgICAgYWFfWyooY2FzdChpbW11dGFibGUoRSkqKSZzdHVmZildID0gVm9pZC5pbml0OworICB9CisKKyAgLy8vCisgIHZvaWQgaW5zZXJ0KFN0dWZmKShTdHVmZiBzdHVmZikgaWYgKAorICAgIGlzSW5wdXRSYW5nZSFTdHVmZiAmJiBpc0ltcGxpY2l0bHlDb252ZXJ0aWJsZSEoRWxlbWVudFR5cGUhU3R1ZmYsIEUpCisgICkgeworICAgIGZvcmVhY2ggKGU7IHN0dWZmKSB7CisgICAgICBhYV9bKihjYXN0KGltbXV0YWJsZShFKSopJmUpXSA9IFZvaWQuaW5pdDsKKyAgICB9CisgIH0KKworICAvLy8KKyAgdm9pZCBvcE9wQXNzaWduKHN0cmluZyBvcCA6ICJ+IiwgU3R1ZmYpKFN0dWZmIHN0dWZmKSB7CisgICAgaW5zZXJ0KHN0dWZmKTsKKyAgfQorCisgIC8vLworICB2b2lkIHJlbW92ZShFIGUpIHsKKyAgICBhYV8ucmVtb3ZlKCooY2FzdChpbW11dGFibGUoRSkqKSZlKSk7CisgIH0KKyAgYWxpYXMgcmVtb3ZlIHJlbW92ZUtleTsKKworICAvLy8KKyAgdm9pZCByZW1vdmVBbGwoKSB7CisgICAgYWFfID0gbnVsbDsKKyAgfQorCisgIC8vLworICBzaXplX3QgbGVuZ3RoKCkgQHByb3BlcnR5IGNvbnN0IHsKKyAgICByZXR1cm4gYWFfLmxlbmd0aDsKKyAgfQorCisgIC8vLworICBzaXplX3QgZW1wdHkoKSBAcHJvcGVydHkgY29uc3QgeworICAgIHJldHVybiAhYWFfLmxlbmd0aDsKKyAgfQorCisgIC8vLworICBib29sIG9wQmluYXJ5UmlnaHQoc3RyaW5nIG9wIDogImluIikoRSBlKSBjb25zdCB7CisgICAgcmV0dXJuIChlIGluIGFhXykgIWlzIG51bGw7CisgIH0KKworICAvLy8KKyAgYXV0byBvcFNsaWNlKCkgY29uc3QgeworICAgIC8vIFRPRE86IEltcGxlbWVudCB1c2luZyBBQSBrZXkgcmFuZ2Ugb25jZSBhdmFpbGFibGUgaW4gcmVsZWFzZSBETUQvZHJ1bnRpbWUKKyAgICAvLyB0byBhdm9pZCBhbGxvY2F0aW9uLgorICAgIHJldHVybiBjYXN0KEVbXSkoYWFfLmtleXMpOworICB9CisKKyAgLy8vCisgIG92ZXJyaWRlIHN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAvLyBPbmx5IHByb3ZpZGUgdG9TdHJpbmcoKSBpZiB0byFzdHJpbmcoKSBpcyBhdmFpbGFibGUgZm9yIEUgKGV4Y2VwdGlvbnMgYXJlCisgICAgLy8gZS5nLiBkZWxlZ2F0ZXMpLgorICAgIHN0YXRpYyBpZiAoaXModHlwZW9mKHRvIXN0cmluZyhFLmluaXQpKSA6IHN0cmluZykpIHsKKyAgICAgIHJldHVybiAieyIgfiB0byFzdHJpbmcoam9pbmVyKG1hcCFgdG8hc3RyaW5nKGEpYChhYV8ua2V5cyksICIsICIpKSB+ICJ9IjsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQ2FzdCB0byB3b3JrIGFyb3VuZCBPYmplY3Qgbm90IGJlaW5nIGNvbnN0LWNvcnJlY3QuCisgICAgICByZXR1cm4gKGNhc3QoKXN1cGVyKS50b1N0cmluZygpOworICAgIH0KKyAgfQorCisgIC8vLworICBvdmVycmlkZSBib29sIG9wRXF1YWxzKE9iamVjdCBvdGhlcikgY29uc3QgeworICAgIGF1dG8gcmhzID0gY2FzdChjb25zdChIYXNoU2V0KSlvdGhlcjsKKyAgICBpZiAocmhzKSB7CisgICAgICByZXR1cm4gYWFfID09IHJocy5hYV87CisgICAgfQorCisgICAgLy8gQ2FzdCB0byB3b3JrIGFyb3VuZCBPYmplY3Qgbm90IGJlaW5nIGNvbnN0LWNvcnJlY3QuCisgICAgcmV0dXJuIChjYXN0KClzdXBlcikub3BFcXVhbHMob3RoZXIpOworICB9CisKK3ByaXZhdGU6CisgIFZvaWRbaW1tdXRhYmxlKEUpXSBhYV87Cit9CisKKy8vLyBEaXR0bworYXV0byBoYXNoU2V0KEUpKEVbXSBlbGVtcy4uLikgeworICByZXR1cm4gbmV3IEhhc2hTZXQhRShlbGVtcyk7Cit9CisKK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHN0ZC5leGNlcHRpb247CisKKyAgYXV0byBhID0gaGFzaFNldCgxLCAyLCAyLCAzKTsKKyAgZW5mb3JjZShhLmxlbmd0aCA9PSAzKTsKKyAgZW5mb3JjZSgyIGluIGEpOworICBlbmZvcmNlKDUgIWluIGEpOworICBlbmZvcmNlKGEudG9TdHJpbmcoKS5sZW5ndGggPT0gOSk7CisgIGEucmVtb3ZlKDIpOworICBlbmZvcmNlKGEubGVuZ3RoID09IDIpOworICBlbmZvcmNlKDIgIWluIGEpOworICBhLnJlbW92ZUFsbCgpOworICBlbmZvcmNlKGEuZW1wdHkpOworICBlbmZvcmNlKGEudG9TdHJpbmcoKSA9PSAie30iKTsKKworICB2b2lkIGRlbGVnYXRlKCkgZGc7CisgIGF1dG8gYiA9IGhhc2hTZXQoZGcpOworICBzdGF0aWMgYXNzZXJ0KF9fdHJhaXRzKGNvbXBpbGVzLCBiLnRvU3RyaW5nKCkpKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvZC90ZXN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNiNmE2ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC90ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTI3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworQVVUT01BS0VfT1BUSU9OUyA9IHNlcmlhbC10ZXN0cworCitCVUlMVF9TT1VSQ0VTID0gdHJ1c3RlZC1jYS1jZXJ0aWZpY2F0ZS5wZW0gc2VydmVyLWNlcnRpZmljYXRlLnBlbQorCisKKyMgVGhyaWZ0IGNvbXBpbGVyIHJ1bGVzCisKK2RlYnVnX3Byb3RvX2dlbiA9ICQoYWRkcHJlZml4IGdlbi1kLywgRGVidWdQcm90b1Rlc3RfdHlwZXMuZCkKKworJChkZWJ1Z19wcm90b19nZW4pOiAkKHRvcF9zcmNkaXIpL3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGQgLW5vd2FybiAkPAorCitzdHJlc3NfdGVzdF9nZW4gPSAkKGFkZHByZWZpeCBnZW4tZC90aHJpZnQvdGVzdC9zdHJlc3MvLCBTZXJ2aWNlLmQgXAorCVN0cmVzc1Rlc3RfdHlwZXMuZCkKKworJChzdHJlc3NfdGVzdF9nZW4pOiAkKHRvcF9zcmNkaXIpL3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gZCAkPAorCit0aHJpZnRfdGVzdF9nZW4gPSAkKGFkZHByZWZpeCBnZW4tZC90aHJpZnQvdGVzdC8sIFNlY29uZFNlcnZpY2UuZCBcCisJVGhyaWZ0VGVzdC5kIFRocmlmdFRlc3RfY29uc3RhbnRzLmQgVGhyaWZ0VGVzdF90eXBlcy5kKQorCiskKHRocmlmdF90ZXN0X2dlbik6ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBkICQ8CisKKworIyBUaGUgYWN0dWFsIHRlc3QgdGFyZ2V0cy4KKyMgVGhlcmUganVzdCBtdXN0IGJlIHNvbWUgd2F5IHRvIHJlYXNzaWduIGEgdmFyaWFibGUgd2l0aG91dCB3YXJuaW5ncyBpbgorIyBBdXRvbWFrZS4uLgordGFyZ2V0c19fID0gYXN5bmNfdGVzdCBjbGllbnRfcG9vbF90ZXN0IHNlcmlhbGl6YXRpb25fYmVuY2htYXJrIFwKKwlzdHJlc3NfdGVzdF9zZXJ2ZXIgdGhyaWZ0X3Rlc3RfY2xpZW50IHRocmlmdF90ZXN0X3NlcnZlciB0cmFuc3BvcnRfdGVzdAorcmFuX3Rlc3RzX18gPSBjbGllbnRfcG9vbF90ZXN0IFwKKwl0cmFuc3BvcnRfdGVzdCBcCisJYXN5bmNfdGVzdF9ydW5uZXIuc2ggXAorCXRocmlmdF90ZXN0X3J1bm5lci5zaAorCitsaWJldmVudF9kZXBlbmRlbnRfdGFyZ2V0cyA9IGFzeW5jX3Rlc3RfY2xpZW50IGNsaWVudF9wb29sX3Rlc3QgXAorCXN0cmVzc190ZXN0X3NlcnZlciB0aHJpZnRfdGVzdF9zZXJ2ZXIKK2xpYmV2ZW50X2RlcGVuZGVudF9yYW5fdGVzdHMgPSBjbGllbnRfcG9vbF90ZXN0IGFzeW5jX3Rlc3RfcnVubmVyLnNoIHRocmlmdF90ZXN0X3J1bm5lci5zaAorCitvcGVuc3NsX2RlcGVuZGVudF90YXJnZXRzID0gYXN5bmNfdGVzdCB0aHJpZnRfdGVzdF9jbGllbnQgdGhyaWZ0X3Rlc3Rfc2VydmVyCitvcGVuc3NsX2RlcGVuZGVudF9yYW5fdGVzdHMgPSBhc3luY190ZXN0X3J1bm5lci5zaCB0aHJpZnRfdGVzdF9ydW5uZXIuc2gKKworZF90ZXN0X2ZsYWdzID0KKworaWYgV0lUSF9EX0VWRU5UX1RFU1RTCitkX3Rlc3RfZmxhZ3MgKz0gJChETURfTElCRVZFTlRfRkxBR1MpIC4uLyQoRF9FVkVOVF9MSUJfTkFNRSkKK3RhcmdldHNfID0gJCh0YXJnZXRzX18pCityYW5fdGVzdHNfID0gJChyYW5fdGVzdHNfXykKK2Vsc2UKK3RhcmdldHNfID0gJChmaWx0ZXItb3V0ICQobGliZXZlbnRfZGVwZW5kZW50X3RhcmdldHMpLCAkKHRhcmdldHNfXykpCityYW5fdGVzdHNfID0gJChmaWx0ZXItb3V0ICQobGliZXZlbnRfZGVwZW5kZW50X3Jhbl90ZXN0cyksICQocmFuX3Rlc3RzX18pKQorZW5kaWYKKworaWYgV0lUSF9EX1NTTF9URVNUUworZF90ZXN0X2ZsYWdzICs9ICQoRE1EX09QRU5TU0xfRkxBR1MpIC4uLyQoRF9TU0xfTElCX05BTUUpCit0YXJnZXRzID0gJCh0YXJnZXRzXykKK3Jhbl90ZXN0cyA9ICQocmFuX3Rlc3RzXykKK2Vsc2UKK3RhcmdldHMgPSAkKGZpbHRlci1vdXQgJChvcGVuc3NsX2RlcGVuZGVudF90YXJnZXRzKSwgJCh0YXJnZXRzXykpCityYW5fdGVzdHMgPSAkKGZpbHRlci1vdXQgJChvcGVuc3NsX2RlcGVuZGVudF9yYW5fdGVzdHMpLCAkKHJhbl90ZXN0c18pKQorZW5kaWYKKworZF90ZXN0X2ZsYWdzICs9IC13IC13aSAtTyAtcmVsZWFzZSAtaW5saW5lIC1JJCh0b3Bfc3JjZGlyKS9saWIvZC9zcmMgLUlnZW4tZCBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYi9kLyQoRF9MSUJfTkFNRSkKKworCithc3luY190ZXN0IGNsaWVudF9wb29sX3Rlc3QgdHJhbnNwb3J0X3Rlc3Q6ICU6ICUuZAorCSQoRE1EKSAkKGRfdGVzdF9mbGFncykgLW9mJEAgJF4KKworc2VyaWFsaXphdGlvbl9iZW5jaG1hcms6ICU6ICUuZCAkKGRlYnVnX3Byb3RvX2dlbikKKwkkKERNRCkgJChkX3Rlc3RfZmxhZ3MpIC1vZiRAICReCisKK3N0cmVzc190ZXN0X3NlcnZlcjogJTogJS5kIHRlc3RfdXRpbHMuZCAkKHN0cmVzc190ZXN0X2dlbikKKwkkKERNRCkgJChkX3Rlc3RfZmxhZ3MpIC1vZiRAICReCisKK3RocmlmdF90ZXN0X2NsaWVudDogJTogJS5kIHRocmlmdF90ZXN0X2NvbW1vbi5kICQodGhyaWZ0X3Rlc3RfZ2VuKQorCSQoRE1EKSAkKGRfdGVzdF9mbGFncykgLW9mJEAgJF4KKwordGhyaWZ0X3Rlc3Rfc2VydmVyOiAlOiAlLmQgdGhyaWZ0X3Rlc3RfY29tbW9uLmQgdGVzdF91dGlscy5kICQodGhyaWZ0X3Rlc3RfZ2VuKQorCSQoRE1EKSAkKGRfdGVzdF9mbGFncykgLW9mJEAgJF4KKworCisjIENlcnRpZmljYXRlIGdlbmVyYXRpb24gdGFyZ2V0cyAoZm9yIHRoZSBTU0wgdGVzdHMpLgorIyBDdXJyZW50bHksIHdlIGp1c3QgYXNzdW1lIHRoYXQgdGhlICJvcGVuc3NsIiB0b29sIGlzIG9uIHRoZSBwYXRoLCBjb3VsZCBiZQorIyByZXBsYWNlZCBieSBhIG1vcmUgZWxhYm9yYXRlIG1lY2hhbmlzbS4KKworc2VydmVyLWNlcnRpZmljYXRlLnBlbTogb3BlbnNzbC50ZXN0LmNuZgorCW9wZW5zc2wgcmVxIC1uZXcgLXg1MDkgLW5vZGVzIC1jb25maWcgb3BlbnNzbC50ZXN0LmNuZiBcCisJCS1vdXQgc2VydmVyLWNlcnRpZmljYXRlLnBlbQorCit0cnVzdGVkLWNhLWNlcnRpZmljYXRlLnBlbTogc2VydmVyLWNlcnRpZmljYXRlLnBlbQorCWNhdCBzZXJ2ZXItY2VydGlmaWNhdGUucGVtID4gJEAKKworY2hlY2stbG9jYWw6ICQodGFyZ2V0cykKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXJmIGdlbi1kICQodGFyZ2V0cykgJChhZGRzdWZmaXggLm8sICQodGFyZ2V0cykpCisKKworIyBUZXN0cyByYW4gYXMgcGFydCBvZiBtYWtlIGNoZWNrLgorCithc3luY190ZXN0X3J1bm5lci5zaDogYXN5bmNfdGVzdCB0cnVzdGVkLWNhLWNlcnRpZmljYXRlLnBlbSBzZXJ2ZXItY2VydGlmaWNhdGUucGVtCit0aHJpZnRfdGVzdF9ydW5uZXIuc2g6IHRocmlmdF90ZXN0X2NsaWVudCB0aHJpZnRfdGVzdF9zZXJ2ZXIgXAorCXRydXN0ZWQtY2EtY2VydGlmaWNhdGUucGVtIHNlcnZlci1jZXJ0aWZpY2F0ZS5wZW0KKworVEVTVFMgPSAkKHJhbl90ZXN0cykKKworcHJlY3Jvc3M6ICQodGFyZ2V0cykKZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdC5kIGIvbGliL2QvdGVzdC9hc3luY190ZXN0LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI3NjVhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdC5kCkBAIC0wLDAgKzEsMzk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIGVuZm9yY2VkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgYXN5bmNfdGVzdDsKKworaW1wb3J0IGNvcmUuYXRvbWljOworaW1wb3J0IGNvcmUuc3luYy5jb25kaXRpb24gOiBDb25kaXRpb247CitpbXBvcnQgY29yZS5zeW5jLm11dGV4IDogTXV0ZXg7CitpbXBvcnQgY29yZS50aHJlYWQgOiBkdXIsIFRocmVhZCwgVGhyZWFkR3JvdXA7CitpbXBvcnQgc3RkLmNvbnYgOiB0ZXh0OworaW1wb3J0IHN0ZC5kYXRldGltZTsKK2ltcG9ydCBzdGQuZ2V0b3B0OworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBjb2xsZWN0RXhjZXB0aW9uLCBlbmZvcmNlOworaW1wb3J0IHN0ZC5wYXJhbGxlbGlzbSA6IFRhc2tQb29sOworaW1wb3J0IHN0ZC5zdGRpbzsKK2ltcG9ydCBzdGQuc3RyaW5nOworaW1wb3J0IHN0ZC52YXJpYW50IDogVmFyaWFudDsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuYXN5bmMuYmFzZTsKK2ltcG9ydCB0aHJpZnQuYXN5bmMubGliZXZlbnQ7CitpbXBvcnQgdGhyaWZ0LmFzeW5jLnNvY2tldDsKK2ltcG9ydCB0aHJpZnQuYXN5bmMuc3NsOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmFzeW5jX2NsaWVudDsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5hc3luY19jbGllbnRfcG9vbDsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5iYXNlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLnByb2Nlc3NvcjsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OworaW1wb3J0IHRocmlmdC5zZXJ2ZXIuYmFzZTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnNpbXBsZTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuc3NsOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJ1ZmZlcmVkOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc3NsOworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKKwordmVyc2lvbiAoUG9zaXgpIHsKKyAgaW1wb3J0IGNvcmUuc3RkYy5zaWduYWw7CisgIGltcG9ydCBjb3JlLnN5cy5wb3NpeC5zaWduYWw7CisKKyAgLy8gRGlzYWJsZSBTSUdQSVBFIGJlY2F1c2UgU1NMIHNlcnZlciB3aWxsIHdyaXRlIHRvIGJyb2tlbiBzb2NrZXQgYWZ0ZXIKKyAgLy8gY2xpZW50IGRpc2Nvbm5lY3RlZCAoc2VlIFRTU0xTb2NrZXQgZG9jcykuCisgIHNoYXJlZCBzdGF0aWMgdGhpcygpIHsKKyAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisgIH0KK30KKworaW50ZXJmYWNlIEFzeW5jVGVzdCB7CisgIHN0cmluZyBlY2hvKHN0cmluZyB2YWx1ZSk7CisgIHN0cmluZyBkZWxheWVkRWNobyhzdHJpbmcgdmFsdWUsIGxvbmcgbWlsbGlzZWNvbmRzKTsKKworICB2b2lkIGZhaWwoc3RyaW5nIHJlYXNvbik7CisgIHZvaWQgZGVsYXllZEZhaWwoc3RyaW5nIHJlYXNvbiwgbG9uZyBtaWxsaXNlY29uZHMpOworCisgIGVudW0gbWV0aG9kTWV0YSA9IFsKKyAgICBUTWV0aG9kTWV0YSgiZmFpbCIsIFtdLCBbVEV4Y2VwdGlvbk1ldGEoImF0ZSIsIDEsICJBc3luY1Rlc3RFeGNlcHRpb24iKV0pLAorICAgIFRNZXRob2RNZXRhKCJkZWxheWVkRmFpbCIsIFtdLCBbVEV4Y2VwdGlvbk1ldGEoImF0ZSIsIDEsICJBc3luY1Rlc3RFeGNlcHRpb24iKV0pCisgIF07CisgIGFsaWFzIC5Bc3luY1Rlc3RFeGNlcHRpb24gQXN5bmNUZXN0RXhjZXB0aW9uOworfQorCitjbGFzcyBBc3luY1Rlc3RFeGNlcHRpb24gOiBURXhjZXB0aW9uIHsKKyAgc3RyaW5nIHJlYXNvbjsKKyAgbWl4aW4gVFN0cnVjdEhlbHBlcnMhKCk7Cit9CisKK3ZvaWQgbWFpbihzdHJpbmdbXSBhcmdzKSB7CisgIHVzaG9ydCBwb3J0ID0gOTA5MDsKKyAgdXNob3J0IG1hbmFnZXJDb3VudCA9IDI7CisgIHVzaG9ydCBzZXJ2ZXJzUGVyTWFuYWdlciA9IDU7CisgIHVzaG9ydCB0aHJlYWRzUGVyU2VydmVyID0gMTA7CisgIHVpbnQgaXRlcmF0aW9ucyA9IDEwOworICBib29sIHNzbDsKKyAgYm9vbCB0cmFjZTsKKworICBnZXRvcHQoYXJncywKKyAgICAiaXRlcmF0aW9ucyIsICZpdGVyYXRpb25zLAorICAgICJtYW5hZ2VycyIsICZtYW5hZ2VyQ291bnQsCisgICAgInBvcnQiLCAmcG9ydCwKKyAgICAic2VydmVycy1wZXItbWFuYWdlciIsICZzZXJ2ZXJzUGVyTWFuYWdlciwKKyAgICAic3NsIiwgJnNzbCwKKyAgICAidGhyZWFkcy1wZXItc2VydmVyIiwgJnRocmVhZHNQZXJTZXJ2ZXIsCisgICAgInRyYWNlIiwgJnRyYWNlLAorICApOworCisgIFRUcmFuc3BvcnRGYWN0b3J5IGNsaWVudFRyYW5zcG9ydEZhY3Rvcnk7CisgIFRTU0xDb250ZXh0IHNlcnZlclNTTENvbnRleHQ7CisgIGlmIChzc2wpIHsKKyAgICBhdXRvIGNsaWVudFNTTENvbnRleHQgPSBuZXcgVFNTTENvbnRleHQoKTsKKyAgICB3aXRoIChjbGllbnRTU0xDb250ZXh0KSB7CisgICAgICBjaXBoZXJzID0gIkFMTDohQURIOiFMT1c6IUVYUDohTUQ1OkBTVFJFTkdUSCI7CisgICAgICBhdXRoZW50aWNhdGUgPSB0cnVlOworICAgICAgbG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoIi4vdHJ1c3RlZC1jYS1jZXJ0aWZpY2F0ZS5wZW0iKTsKKyAgICB9CisgICAgY2xpZW50VHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBUQXN5bmNTU0xTb2NrZXRGYWN0b3J5KGNsaWVudFNTTENvbnRleHQpOworCisgICAgc2VydmVyU1NMQ29udGV4dCA9IG5ldyBUU1NMQ29udGV4dCgpOworICAgIHdpdGggKHNlcnZlclNTTENvbnRleHQpIHsKKyAgICAgIHNlcnZlclNpZGUgPSB0cnVlOworICAgICAgbG9hZENlcnRpZmljYXRlKCIuL3NlcnZlci1jZXJ0aWZpY2F0ZS5wZW0iKTsKKyAgICAgIGxvYWRQcml2YXRlS2V5KCIuL3NlcnZlci1wcml2YXRlLWtleS5wZW0iKTsKKyAgICAgIGNpcGhlcnMgPSAiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgY2xpZW50VHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OworICB9CisKKworICBhdXRvIHNlcnZlckNhbmNlbCA9IG5ldyBUQ2FuY2VsbGF0aW9uT3JpZ2luOworICBzY29wZShleGl0KSB7CisgICAgd3JpdGVsbigiVHJpZ2dlcmluZyBzZXJ2ZXIgc2h1dGRvd24uLi4iKTsKKyAgICBzZXJ2ZXJDYW5jZWwudHJpZ2dlcigpOworICAgIHdyaXRlbG4oImRvbmUuIik7CisgIH0KKworICBhdXRvIG1hbmFnZXJzID0gbmV3IFRMaWJldmVudEFzeW5jTWFuYWdlclttYW5hZ2VyQ291bnRdOworICBzY29wZSAoZXhpdCkgZm9yZWFjaCAocmVmIG07IG1hbmFnZXJzKSBkZXN0cm95KG0pOworCisgIGF1dG8gY2xpZW50c1RocmVhZHMgPSBuZXcgVGhyZWFkR3JvdXA7CisgIGZvcmVhY2ggKG1hbmFnZXJJbmRleCwgcmVmIG1hbmFnZXI7IG1hbmFnZXJzKSB7CisgICAgbWFuYWdlciA9IG5ldyBUTGliZXZlbnRBc3luY01hbmFnZXI7CisgICAgZm9yZWFjaCAoc2VydmVySW5kZXg7IDAgLi4gc2VydmVyc1Blck1hbmFnZXIpIHsKKyAgICAgIGF1dG8gY3VycmVudFBvcnQgPSBjYXN0KHVzaG9ydCkKKyAgICAgICAgKHBvcnQgKyBtYW5hZ2VySW5kZXggKiBzZXJ2ZXJzUGVyTWFuYWdlciArIHNlcnZlckluZGV4KTsKKworICAgICAgLy8gU3RhcnQgdGhlIHNlcnZlciBhbmQgd2FpdCB1bnRpbCBpdCBpcyB1cCBhbmQgcnVubmluZy4KKyAgICAgIGF1dG8gc2VydmluZ011dGV4ID0gbmV3IE11dGV4OworICAgICAgYXV0byBzZXJ2aW5nQ29uZGl0aW9uID0gbmV3IENvbmRpdGlvbihzZXJ2aW5nTXV0ZXgpOworICAgICAgYXV0byBoYW5kbGVyID0gbmV3IFByZVNlcnZlTm90aWZ5SGFuZGxlcihzZXJ2aW5nTXV0ZXgsIHNlcnZpbmdDb25kaXRpb24pOworICAgICAgc3luY2hyb25pemVkIChzZXJ2aW5nTXV0ZXgpIHsKKyAgICAgICAgKG5ldyBTZXJ2ZXJUaHJlYWQhVFNpbXBsZVNlcnZlcihjdXJyZW50UG9ydCwgc2VydmVyU1NMQ29udGV4dCwgdHJhY2UsCisgICAgICAgICAgc2VydmVyQ2FuY2VsLCBoYW5kbGVyKSkuc3RhcnQoKTsKKyAgICAgICAgc2VydmluZ0NvbmRpdGlvbi53YWl0KCk7CisgICAgICB9CisKKyAgICAgIC8vIFdlIG9ubHkgcnVuIHRoZSB0aW1pbmcgdGVzdHMgZm9yIHRoZSBmaXJzdCBzZXJ2ZXIgb24gZWFjaCBhc3luYworICAgICAgLy8gbWFuYWdlciwgc28gdGhhdCB3ZSBkb24ndCBnZXQgc3B1cmlvdXMgdGltaW5nIGVycm9ycyBiZWNhdWUgb2YKKyAgICAgIC8vIG9yZGVyaW5nIGlzc3Vlcy4KKyAgICAgIGF1dG8gcnVuVGltaW5nVGVzdHMgPSAoc2VydmVySW5kZXggPT0gMCk7CisKKyAgICAgIGF1dG8gYyA9IG5ldyBDbGllbnRzVGhyZWFkKG1hbmFnZXIsIGN1cnJlbnRQb3J0LCBjbGllbnRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICB0aHJlYWRzUGVyU2VydmVyLCBpdGVyYXRpb25zLCBydW5UaW1pbmdUZXN0cywgdHJhY2UpOworICAgICAgY2xpZW50c1RocmVhZHMuYWRkKGMpOworICAgICAgYy5zdGFydCgpOworICAgIH0KKyAgfQorICBjbGllbnRzVGhyZWFkcy5qb2luQWxsKCk7Cit9CisKK2NsYXNzIEFzeW5jVGVzdEhhbmRsZXIgOiBBc3luY1Rlc3QgeworICB0aGlzKGJvb2wgdHJhY2UpIHsKKyAgICB0cmFjZV8gPSB0cmFjZTsKKyAgfQorCisgIG92ZXJyaWRlIHN0cmluZyBlY2hvKHN0cmluZyB2YWx1ZSkgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKGBlY2hvKCIlcyIpYCwgdmFsdWUpOworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIG92ZXJyaWRlIHN0cmluZyBkZWxheWVkRWNobyhzdHJpbmcgdmFsdWUsIGxvbmcgbWlsbGlzZWNvbmRzKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmKGBkZWxheWVkRWNobygiJXMiLCAlcyBtcykuLi4gYCwgdmFsdWUsIG1pbGxpc2Vjb25kcyk7CisgICAgVGhyZWFkLnNsZWVwKGR1ciEibXNlY3MiKG1pbGxpc2Vjb25kcykpOworICAgIGlmICh0cmFjZV8pIHdyaXRlbG4oInJldHVybmluZy4iKTsKKworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgZmFpbChzdHJpbmcgcmVhc29uKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oYGZhaWwoIiVzIilgLCByZWFzb24pOworICAgIGF1dG8gYXRlID0gbmV3IEFzeW5jVGVzdEV4Y2VwdGlvbjsKKyAgICBhdGUucmVhc29uID0gcmVhc29uOworICAgIHRocm93IGF0ZTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgZGVsYXllZEZhaWwoc3RyaW5nIHJlYXNvbiwgbG9uZyBtaWxsaXNlY29uZHMpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWYoYGRlbGF5ZWRGYWlsKCIlcyIsICVzIG1zKS4uLiBgLCByZWFzb24sIG1pbGxpc2Vjb25kcyk7CisgICAgVGhyZWFkLnNsZWVwKGR1ciEibXNlY3MiKG1pbGxpc2Vjb25kcykpOworICAgIGlmICh0cmFjZV8pIHdyaXRlbG4oInJldHVybmluZy4iKTsKKworICAgIGF1dG8gYXRlID0gbmV3IEFzeW5jVGVzdEV4Y2VwdGlvbjsKKyAgICBhdGUucmVhc29uID0gcmVhc29uOworICAgIHRocm93IGF0ZTsKKyAgfQorCitwcml2YXRlOgorICBib29sIHRyYWNlXzsKKyAgQXN5bmNUZXN0RXhjZXB0aW9uIGF0ZV87Cit9CisKK2NsYXNzIFByZVNlcnZlTm90aWZ5SGFuZGxlciA6IFRTZXJ2ZXJFdmVudEhhbmRsZXIgeworICB0aGlzKE11dGV4IHNlcnZpbmdNdXRleCwgQ29uZGl0aW9uIHNlcnZpbmdDb25kaXRpb24pIHsKKyAgICBzZXJ2aW5nTXV0ZXhfID0gc2VydmluZ011dGV4OworICAgIHNlcnZpbmdDb25kaXRpb25fID0gc2VydmluZ0NvbmRpdGlvbjsKKyAgfQorCisgIHZvaWQgcHJlU2VydmUoKSB7CisgICAgc3luY2hyb25pemVkIChzZXJ2aW5nTXV0ZXhfKSB7CisgICAgICBzZXJ2aW5nQ29uZGl0aW9uXy5ub3RpZnlBbGwoKTsKKyAgICB9CisgIH0KKyAgVmFyaWFudCBjcmVhdGVDb250ZXh0KFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCkgeyByZXR1cm4gVmFyaWFudC5pbml0OyB9CisgIHZvaWQgZGVsZXRlQ29udGV4dChWYXJpYW50IHNlcnZlckNvbnRleHQsIFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCkge30KKyAgdm9pZCBwcmVQcm9jZXNzKFZhcmlhbnQgc2VydmVyQ29udGV4dCwgVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHt9CisKK3ByaXZhdGU6CisgIE11dGV4IHNlcnZpbmdNdXRleF87CisgIENvbmRpdGlvbiBzZXJ2aW5nQ29uZGl0aW9uXzsKK30KKworY2xhc3MgU2VydmVyVGhyZWFkKFNlcnZlclR5cGUpIDogVGhyZWFkIHsKKyAgdGhpcyh1c2hvcnQgcG9ydCwgVFNTTENvbnRleHQgc3NsQ29udGV4dCwgYm9vbCB0cmFjZSwKKyAgICBUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbiwgVFNlcnZlckV2ZW50SGFuZGxlciBldmVudEhhbmRsZXIKKyAgKSB7CisgICAgcG9ydF8gPSBwb3J0OworICAgIHNzbENvbnRleHRfID0gc3NsQ29udGV4dDsKKyAgICB0cmFjZV8gPSB0cmFjZTsKKyAgICBjYW5jZWxsYXRpb25fID0gY2FuY2VsbGF0aW9uOworICAgIGV2ZW50SGFuZGxlcl8gPSBldmVudEhhbmRsZXI7CisKKyAgICBzdXBlcigmcnVuKTsKKyAgfQorCisgIHZvaWQgcnVuKCkgeworICAgIFRTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0OworICAgIGlmIChzc2xDb250ZXh0XykgeworICAgICAgc2VydmVyU29ja2V0ID0gbmV3IFRTU0xTZXJ2ZXJTb2NrZXQocG9ydF8sIHNzbENvbnRleHRfKTsKKyAgICB9IGVsc2UgeworICAgICAgc2VydmVyU29ja2V0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQocG9ydF8pOworICAgIH0KKyAgICBhdXRvIHRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTsKKyAgICBhdXRvIHByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ISgpOworICAgIGF1dG8gcHJvY2Vzc29yID0gbmV3IFRTZXJ2aWNlUHJvY2Vzc29yIUFzeW5jVGVzdChuZXcgQXN5bmNUZXN0SGFuZGxlcih0cmFjZV8pKTsKKworICAgIGF1dG8gc2VydmVyID0gbmV3IFNlcnZlclR5cGUocHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBwcm90b2NvbEZhY3RvcnkpOworICAgIHNlcnZlci5ldmVudEhhbmRsZXIgPSBldmVudEhhbmRsZXJfOworCisgICAgd3JpdGVmbG4oIlN0YXJ0aW5nIHNlcnZlciBvbiBwb3J0ICVzLi4uIiwgcG9ydF8pOworICAgIHNlcnZlci5zZXJ2ZShjYW5jZWxsYXRpb25fKTsKKyAgICB3cml0ZWZsbigiU2VydmVyIHRocmVhZCBvbiBwb3J0ICVzIGRvbmUuIiwgcG9ydF8pOworICB9CisKK3ByaXZhdGU6CisgIHVzaG9ydCBwb3J0XzsKKyAgYm9vbCB0cmFjZV87CisgIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uXzsKKyAgVFNTTENvbnRleHQgc3NsQ29udGV4dF87CisgIFRTZXJ2ZXJFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyXzsKK30KKworY2xhc3MgQ2xpZW50c1RocmVhZCA6IFRocmVhZCB7CisgIHRoaXMoVEFzeW5jU29ja2V0TWFuYWdlciBtYW5hZ2VyLCB1c2hvcnQgcG9ydCwgVFRyYW5zcG9ydEZhY3RvcnkgdGYsCisgICAgdXNob3J0IHRocmVhZHMsIHVpbnQgaXRlcmF0aW9ucywgYm9vbCBydW5UaW1pbmdUZXN0cywgYm9vbCB0cmFjZQorICApIHsKKyAgICBtYW5hZ2VyXyA9IG1hbmFnZXI7CisgICAgcG9ydF8gPSBwb3J0OworICAgIHRyYW5zcG9ydEZhY3RvcnlfID0gdGY7CisgICAgdGhyZWFkc18gPSB0aHJlYWRzOworICAgIGl0ZXJhdGlvbnNfID0gaXRlcmF0aW9uczsKKyAgICBydW5UaW1pbmdUZXN0c18gPSBydW5UaW1pbmdUZXN0czsKKyAgICB0cmFjZV8gPSB0cmFjZTsKKyAgICBzdXBlcigmcnVuKTsKKyAgfQorCisgIHZvaWQgcnVuKCkgeworICAgIGF1dG8gdHJhbnNwb3J0ID0gbmV3IFRBc3luY1NvY2tldChtYW5hZ2VyXywgImxvY2FsaG9zdCIsIHBvcnRfKTsKKworICAgIHsKKyAgICAgIGF1dG8gY2xpZW50ID0gbmV3IFRBc3luY0NsaWVudCFBc3luY1Rlc3QoCisgICAgICAgIHRyYW5zcG9ydCwKKyAgICAgICAgdHJhbnNwb3J0RmFjdG9yeV8sCisgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ISgpCisgICAgICApOworICAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgIGF1dG8gY2xpZW50VGhyZWFkcyA9IG5ldyBUaHJlYWRHcm91cDsKKyAgICAgIGZvcmVhY2ggKGNsaWVudElkOyAwIC4uIHRocmVhZHNfKSB7CisgICAgICAgIGNsaWVudFRocmVhZHMuY3JlYXRlKHsKKyAgICAgICAgICBhdXRvIGMgPSBjbGllbnRJZDsKKyAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgZm9yZWFjaCAoaTsgMCAuLiBpdGVyYXRpb25zXykgeworICAgICAgICAgICAgICBpbW11dGFibGUgaWQgPSB0ZXh0KHBvcnRfLCAiOiIsIGMsICI6IiwgaSk7CisKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKGBDYWxsaW5nIGVjaG8oIiVzIikuLi4gYCwgaWQpOworICAgICAgICAgICAgICAgIGF1dG8gYSA9IGNsaWVudC5lY2hvKGlkKTsKKyAgICAgICAgICAgICAgICBlbmZvcmNlKGEgPT0gaWQpOworICAgICAgICAgICAgICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKGBlY2hvKCIlcyIpIGRvbmUuYCwgaWQpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKGBDYWxsaW5nIGZhaWwoIiVzIikuLi4gYCwgaWQpOworICAgICAgICAgICAgICAgIGF1dG8gYSA9IGNhc3QoQXN5bmNUZXN0RXhjZXB0aW9uKWNvbGxlY3RFeGNlcHRpb24oY2xpZW50LmZhaWwoaWQpLndhaXRHZXQoKSk7CisgICAgICAgICAgICAgICAgZW5mb3JjZShhICYmIGEucmVhc29uID09IGlkKTsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2VfKSB3cml0ZWZsbihgZmFpbCgiJXMiKSBkb25lLmAsIGlkKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH07CisgICAgICAgIH0oKSk7CisgICAgICB9CisgICAgICBjbGllbnRUaHJlYWRzLmpvaW5BbGwoKTsKKyAgICAgIHRyYW5zcG9ydC5jbG9zZSgpOworICAgIH0KKworICAgIGlmIChydW5UaW1pbmdUZXN0c18pIHsKKyAgICAgIGF1dG8gY2xpZW50ID0gbmV3IFRBc3luY0NsaWVudCFBc3luY1Rlc3QoCisgICAgICAgIHRyYW5zcG9ydCwKKyAgICAgICAgdHJhbnNwb3J0RmFjdG9yeV8sCisgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IVRCdWZmZXJlZFRyYW5zcG9ydAorICAgICAgKTsKKworICAgICAgLy8gVGVtcG9yYXJpbHkgcmVkaXJlY3QgZXJyb3IgbG9ncyB0byBzdGRvdXQsIGFzIFNTTCBlcnJvcnMgb24gdGhlIHNlcnZlcgorICAgICAgLy8gc2lkZSBhcmUgZXhwZWN0ZWQgd2hlbiB0aGUgY2xpZW50IHRlcm1pbmF0ZXMgYWJ1cnB0bHkgKGFzIGlzIHRoZSBjYXNlCisgICAgICAvLyBpbiB0aGUgdGltZW91dCB0ZXN0KS4KKyAgICAgIGF1dG8gb2xkRXJyb3JMb2dTaW5rID0gZ19lcnJvckxvZ1Npbms7CisgICAgICBnX2Vycm9yTG9nU2luayA9IGdfaW5mb0xvZ1Npbms7CisgICAgICBzY29wZSAoZXhpdCkgZ19lcnJvckxvZ1NpbmsgPSBvbGRFcnJvckxvZ1Npbms7CisKKyAgICAgIGZvcmVhY2ggKGk7IDAgLi4gaXRlcmF0aW9uc18pIHsKKyAgICAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKworICAgICAgICBpbW11dGFibGUgaWQgPSB0ZXh0KHBvcnRfLCAiOiIsIGkpOworCisgICAgICAgIHsKKyAgICAgICAgICBpZiAodHJhY2VfKSB3cml0ZWZsbihgQ2FsbGluZyBkZWxheWVkRWNobygiJXMiLCAxMDAgbXMpLi4uYCwgaWQpOworICAgICAgICAgIGF1dG8gYSA9IGNsaWVudC5kZWxheWVkRWNobyhpZCwgMTAwKTsKKyAgICAgICAgICBlbmZvcmNlKCFhLmNvbXBsZXRpb24ud2FpdChkdXIhInVzZWNzIigxKSksCisgICAgICAgICAgICB0ZXh0KCJ3YWl0KCkgc3VjY2VlZGVkIGVhcmx5ICgiLCBhLmdldCgpLCAiLCAiLCBpZCwgIikuIikpOworICAgICAgICAgIGVuZm9yY2UoIWEuY29tcGxldGlvbi53YWl0KGR1ciEidXNlY3MiKDEpKSwKKyAgICAgICAgICAgIHRleHQoIndhaXQoKSBzdWNjZWVkZWQgZWFybHkgKCIsIGEuZ2V0KCksICIsICIsIGlkLCAiKS4iKSk7CisgICAgICAgICAgZW5mb3JjZShhLmNvbXBsZXRpb24ud2FpdChkdXIhIm1zZWNzIigyMDApKSwKKyAgICAgICAgICAgIHRleHQoIndhaXQoKSBkaWRuJ3Qgc3VjY2VlZCBhcyBleHBlY3RlZCAoIiwgaWQsICIpLiIpKTsKKyAgICAgICAgICBlbmZvcmNlKGEuZ2V0KCkgPT0gaWQpOworICAgICAgICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKGAuLi4gZGVsYXllZEVjaG8oIiVzIikgZG9uZS5gLCBpZCk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oYENhbGxpbmcgZGVsYXllZEZhaWwoIiVzIiwgMTAwIG1zKS4uLiBgLCBpZCk7CisgICAgICAgICAgYXV0byBhID0gY2xpZW50LmRlbGF5ZWRGYWlsKGlkLCAxMDApOworICAgICAgICAgIGVuZm9yY2UoIWEuY29tcGxldGlvbi53YWl0KGR1ciEidXNlY3MiKDEpKSwKKyAgICAgICAgICAgIHRleHQoIndhaXQoKSBzdWNjZWVkZWQgZWFybHkgKCIsIGlkLCAiLCAiLCBjb2xsZWN0RXhjZXB0aW9uKGEuZ2V0KCkpLCAiKS4iKSk7CisgICAgICAgICAgZW5mb3JjZSghYS5jb21wbGV0aW9uLndhaXQoZHVyISJ1c2VjcyIoMSkpLAorICAgICAgICAgICAgdGV4dCgid2FpdCgpIHN1Y2NlZWRlZCBlYXJseSAoIiwgaWQsICIsICIsIGNvbGxlY3RFeGNlcHRpb24oYS5nZXQoKSksICIpLiIpKTsKKyAgICAgICAgICBlbmZvcmNlKGEuY29tcGxldGlvbi53YWl0KGR1ciEibXNlY3MiKDIwMCkpLAorICAgICAgICAgICAgdGV4dCgid2FpdCgpIGRpZG4ndCBzdWNjZWVkIGFzIGV4cGVjdGVkICgiLCBpZCwgIikuIikpOworICAgICAgICAgIGF1dG8gZSA9IGNhc3QoQXN5bmNUZXN0RXhjZXB0aW9uKWNvbGxlY3RFeGNlcHRpb24oYS5nZXQoKSk7CisgICAgICAgICAgZW5mb3JjZShlICYmIGUucmVhc29uID09IGlkKTsKKyAgICAgICAgICBpZiAodHJhY2VfKSB3cml0ZWZsbihgLi4uIGRlbGF5ZWRGYWlsKCIlcyIpIGRvbmUuYCwgaWQpOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgIHRyYW5zcG9ydC5yZWN2VGltZW91dCA9IGR1ciEibXNlY3MiKDUwKTsKKworICAgICAgICAgIGlmICh0cmFjZV8pIHdyaXRlKGBDYWxsaW5nIGRlbGF5ZWRFY2hvKCJzb2NrZXRUaW1lb3V0IiwgMTAwIG1zKS4uLiBgKTsKKyAgICAgICAgICBhdXRvIGEgPSBjbGllbnQuZGVsYXllZEVjaG8oInNvY2tldFRpbWVvdXQiLCAxMDApOworICAgICAgICAgIGF1dG8gZSA9IGNhc3QoVFRyYW5zcG9ydEV4Y2VwdGlvbiljb2xsZWN0RXhjZXB0aW9uKGEud2FpdEdldCgpKTsKKyAgICAgICAgICBlbmZvcmNlKGUsIHRleHQoIk9wZXJhdGlvbiBkaWRuJ3QgZmFpbCBhcyBleHBlY3RlZCAoIiwgaWQsICIpLiIpKTsKKyAgICAgICAgICBlbmZvcmNlKGUudHlwZSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuVElNRURfT1VULAorICAgICAgICAgICAgdGV4dCgiV3JvbmcgdGltZW91dCBleGNlcHRpb24gdHlwZSAoIiwgaWQsICIpOiAiLCBlKSk7CisgICAgICAgICAgaWYgKHRyYWNlXykgd3JpdGVsbihgdGltZWQgb3V0IGFzIGV4cGVjdGVkLmApOworCisgICAgICAgICAgLy8gV2FpdCB1bnRpbCB0aGUgc2VydmVyIHRocmVhZCByZXNldCBiZWZvcmUgdGhlIG5leHQgaXRlcmF0aW9uLgorICAgICAgICAgIFRocmVhZC5zbGVlcChkdXIhIm1zZWNzIig1MCkpOworICAgICAgICAgIHRyYW5zcG9ydC5yZWN2VGltZW91dCA9IGR1ciEiaG5zZWNzIigwKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyYW5zcG9ydC5jbG9zZSgpOworICAgICAgfQorICAgIH0KKworICAgIHdyaXRlZmxuKCJDbGllbnRzIHRocmVhZCBmb3IgcG9ydCAlcyBkb25lLiIsIHBvcnRfKTsKKyAgfQorCisgIFRBc3luY1NvY2tldE1hbmFnZXIgbWFuYWdlcl87CisgIHVzaG9ydCBwb3J0XzsKKyAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeV87CisgIHVzaG9ydCB0aHJlYWRzXzsKKyAgdWludCBpdGVyYXRpb25zXzsKKyAgYm9vbCBydW5UaW1pbmdUZXN0c187CisgIGJvb2wgdHJhY2VfOworfQpkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC9hc3luY190ZXN0X3J1bm5lci5zaCBiL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdF9ydW5uZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2Q1MDdlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdF9ydW5uZXIuc2gKQEAgLTAsMCArMSwyOCBAQAorIyEvYmluL2Jhc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0NVUj0iJChjZCAiJChkaXJuYW1lICIke0JBU0hfU09VUkNFWzBdfSIpIiAmJiBwd2QpIgorCisjIFJ1bnMgdGhlIGFzeW5jIHRlc3QgaW4gYm90aCBTU0wgYW5kIG5vbi1TU0wgbW9kZS4KKyR7Q1VSfS9hc3luY190ZXN0ID4gL2Rldi9udWxsIHx8IGV4aXQgMQorZWNobyAiTm9uLVNTTCB0ZXN0cyBkb25lLiIKKyR7Q1VSfS9hc3luY190ZXN0IC0tc3NsID4gL2Rldi9udWxsIHx8IGV4aXQgMQorZWNobyAiU1NMIHRlc3RzIGRvbmUuIgpkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC9jbGllbnRfcG9vbF90ZXN0LmQgYi9saWIvZC90ZXN0L2NsaWVudF9wb29sX3Rlc3QuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjRjOTdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvdGVzdC9jbGllbnRfcG9vbF90ZXN0LmQKQEAgLTAsMCArMSw0NDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSBjbGllbnRfcG9vbF90ZXN0OworCitpbXBvcnQgY29yZS5zeW5jLnNlbWFwaG9yZSA6IFNlbWFwaG9yZTsKK2ltcG9ydCBjb3JlLnRpbWUgOiBEdXJhdGlvbiwgZHVyOworaW1wb3J0IGNvcmUudGhyZWFkIDogVGhyZWFkOworaW1wb3J0IHN0ZC5hbGdvcml0aG07CitpbXBvcnQgc3RkLmFycmF5OworaW1wb3J0IHN0ZC5jb252OworaW1wb3J0IHN0ZC5leGNlcHRpb247CitpbXBvcnQgc3RkLmdldG9wdDsKK2ltcG9ydCBzdGQucmFuZ2U7CitpbXBvcnQgc3RkLnN0ZGlvOworaW1wb3J0IHN0ZC50eXBlY29uczsKK2ltcG9ydCBzdGQudmFyaWFudCA6IFZhcmlhbnQ7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmFzeW5jLmxpYmV2ZW50OworaW1wb3J0IHRocmlmdC5hc3luYy5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uYmFzZTsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5hc3luY19jbGllbnQ7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uYXN5bmNfY2xpZW50X3Bvb2w7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uY2xpZW50OworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmNsaWVudF9wb29sOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLnByb2Nlc3NvcjsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OworaW1wb3J0IHRocmlmdC5zZXJ2ZXIuYmFzZTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnNpbXBsZTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYnVmZmVyZWQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOworaW1wb3J0IHRocmlmdC51dGlsLmZ1dHVyZTsKKworLy8gV2UgdXNlIHRoaXMgYXMgb3VyIFJQQy1sYXllciBleGNlcHRpb24gaGVyZSB0byBtYWtlIHN1cmUgc29ja2V0L+KApiBwcm9ibGVtcworLy8gKHRoYXQgd291bGQgdXN1YWxseSBjb25zaWRlcmVkIHRvIGJlIFJQQyBsYXllciBmYXVsdHMpIGNhdXNlIHRoZSB0ZXN0cyB0bworLy8gZmFpbCwgZXZlbiB0aG91Z2ggd2UgYXJlIHRlc3RpbmcgdGhlIFJQQyBleGNlcHRpb24gaGFuZGxpbmcuCitjbGFzcyBUZXN0U2VydmljZUV4Y2VwdGlvbiA6IFRFeGNlcHRpb24geworICBpbnQgcG9ydDsKK30KKworaW50ZXJmYWNlIFRlc3RTZXJ2aWNlIHsKKyAgaW50IGdldFBvcnQoKTsKKyAgYWxpYXMgLlRlc3RTZXJ2aWNlRXhjZXB0aW9uIFRlc3RTZXJ2aWNlRXhjZXB0aW9uOworICBlbnVtIG1ldGhvZE1ldGEgPSBbVE1ldGhvZE1ldGEoImdldFBvcnQiLCBbXSwKKyAgICBbVEV4Y2VwdGlvbk1ldGEoImEiLCAxLCAiVGVzdFNlcnZpY2VFeGNlcHRpb24iKV0pXTsKK30KKworLy8gVXNlIHNvbWUgZGVyaXZlZCBzZXJ2aWNlLCBqdXN0IHRvIGNoZWNrIHRoYXQgdGhlIHBvb2xzIGhhbmRsZSBpbmhlcml0YW5jZQorLy8gY29ycmVjdGx5LgoraW50ZXJmYWNlIEV4VGVzdFNlcnZpY2UgOiBUZXN0U2VydmljZSB7CisgIGludFtdIGdldFBvcnRJbkFycmF5KCk7CisgIGVudW0gbWV0aG9kTWV0YSA9IFtUTWV0aG9kTWV0YSgiZ2V0UG9ydEluQXJyYXkiLCBbXSwKKyAgICBbVEV4Y2VwdGlvbk1ldGEoImEiLCAxLCAiVGVzdFNlcnZpY2VFeGNlcHRpb24iKV0pXTsKK30KKworY2xhc3MgRXhUZXN0SGFuZGxlciA6IEV4VGVzdFNlcnZpY2UgeworICB0aGlzKHVzaG9ydCBwb3J0LCBEdXJhdGlvbiBkZWxheSwgYm9vbCBmYWlsaW5nLCBib29sIHRyYWNlKSB7CisgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICB0aGlzLmRlbGF5ID0gZGVsYXk7CisgICAgdGhpcy5mYWlsaW5nID0gZmFpbGluZzsKKyAgICB0aGlzLnRyYWNlID0gdHJhY2U7CisgIH0KKworICBvdmVycmlkZSBpbnQgZ2V0UG9ydCgpIHsKKyAgICBpZiAodHJhY2UpIHsKKyAgICAgIHN0ZGVyci53cml0ZWZsbigiZ2V0UG9ydCgpIGNhbGxlZCBvbiAlcyAoZGVsYXk6ICVzLCBmYWlsaW5nOiAlcykiLCBwb3J0LAorICAgICAgICBkZWxheSwgZmFpbGluZyk7CisgICAgfQorICAgIHNsZWVwKCk7CisgICAgZmFpbElmRW5hYmxlZCgpOworICAgIHJldHVybiBwb3J0OworICB9CisKKyAgb3ZlcnJpZGUgaW50W10gZ2V0UG9ydEluQXJyYXkoKSB7CisgICAgcmV0dXJuIFtnZXRQb3J0KCldOworICB9CisKKyAgdXNob3J0IHBvcnQ7CisgIER1cmF0aW9uIGRlbGF5OworICBib29sIGZhaWxpbmc7CisgIGJvb2wgdHJhY2U7CisKK3ByaXZhdGU6CisgIHZvaWQgc2xlZXAoKSB7CisgICAgaWYgKGRlbGF5ID4gZHVyISJobnNlY3MiKDApKSBUaHJlYWQuc2xlZXAoZGVsYXkpOworICB9CisKKyAgdm9pZCBmYWlsSWZFbmFibGVkKCkgeworICAgIGlmICghZmFpbGluZykgcmV0dXJuOworCisgICAgYXV0byBlID0gbmV3IFRlc3RTZXJ2aWNlRXhjZXB0aW9uOworICAgIGUucG9ydCA9IHBvcnQ7CisgICAgdGhyb3cgZTsKKyAgfQorfQorCitjbGFzcyBTZXJ2ZXJQcmVTZXJ2ZUhhbmRsZXIgOiBUU2VydmVyRXZlbnRIYW5kbGVyIHsKKyAgdGhpcyhTZW1hcGhvcmUgc2VtKSB7CisgICAgc2VtXyA9IHNlbTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgcHJlU2VydmUoKSB7CisgICAgc2VtXy5ub3RpZnkoKTsKKyAgfQorCisgIFZhcmlhbnQgY3JlYXRlQ29udGV4dChUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQpIHsgcmV0dXJuIFZhcmlhbnQuaW5pdDsgfQorICB2b2lkIGRlbGV0ZUNvbnRleHQoVmFyaWFudCBzZXJ2ZXJDb250ZXh0LCBUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQpIHt9CisgIHZvaWQgcHJlUHJvY2VzcyhWYXJpYW50IHNlcnZlckNvbnRleHQsIFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7fQorCitwcml2YXRlOgorICBTZW1hcGhvcmUgc2VtXzsKK30KKworY2xhc3MgU2VydmVyVGhyZWFkIDogVGhyZWFkIHsKKyAgdGhpcyhFeFRlc3RIYW5kbGVyIGhhbmRsZXIsIFNlcnZlclByZVNlcnZlSGFuZGxlciBzZXJ2ZXJIYW5kbGVyLCBUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbikgeworICAgIHN1cGVyKCZydW4pOworICAgIGhhbmRsZXJfID0gaGFuZGxlcjsKKyAgICBjYW5jZWxsYXRpb25fID0gY2FuY2VsbGF0aW9uOworICAgIHNlcnZlckhhbmRsZXJfID0gc2VydmVySGFuZGxlcjsKKyAgfQorcHJpdmF0ZToKKyAgdm9pZCBydW4oKSB7CisgICAgdHJ5IHsKKyAgICAgIGF1dG8gcHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkhKCk7CisgICAgICBhdXRvIHByb2Nlc3NvciA9IG5ldyBUU2VydmljZVByb2Nlc3NvciFFeFRlc3RTZXJ2aWNlKGhhbmRsZXJfKTsKKyAgICAgIGF1dG8gc2VydmVyVHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoaGFuZGxlcl8ucG9ydCk7CisgICAgICBzZXJ2ZXJUcmFuc3BvcnQucmVjdlRpbWVvdXQgPSBkdXIhInNlY29uZHMiKDMpOworICAgICAgYXV0byB0cmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk7CisKKyAgICAgIGF1dG8gc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CisgICAgICBzZXJ2ZXIuZXZlbnRIYW5kbGVyID0gc2VydmVySGFuZGxlcl87CisgICAgICBzZXJ2ZXIuc2VydmUoY2FuY2VsbGF0aW9uXyk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHdyaXRlZmxuKCJTZXJ2ZXIgdGhyZWFkIG9uIHBvcnQgJXMgZmFpbGVkOiAlcyIsIGhhbmRsZXJfLnBvcnQsIGUpOworICAgIH0KKyAgfQorCisgIEV4VGVzdEhhbmRsZXIgaGFuZGxlcl87CisgIFNlcnZlclByZVNlcnZlSGFuZGxlciBzZXJ2ZXJIYW5kbGVyXzsKKyAgVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb25fOworfQorCit2b2lkIG1haW4oc3RyaW5nW10gYXJncykgeworICBib29sIHRyYWNlOworICB1c2hvcnQgcG9ydCA9IDkwOTA7CisgIGdldG9wdChhcmdzLCAicG9ydCIsICZwb3J0LCAidHJhY2UiLCAmdHJhY2UpOworCisgIGF1dG8gc2VydmVyQ2FuY2VsbGF0aW9uID0gbmV3IFRDYW5jZWxsYXRpb25PcmlnaW47CisgIHNjb3BlIChleGl0KSBzZXJ2ZXJDYW5jZWxsYXRpb24udHJpZ2dlcigpOworCisgIGltbXV0YWJsZSBwb3J0cyA9IGNhc3QoaW1tdXRhYmxlKWFycmF5KG1hcCEiY2FzdCh1c2hvcnQpYSIoaW90YShwb3J0LCBwb3J0ICsgNikpKTsKKworICAvLyBzZW1hcGhvcmUgdGhhdCB3aWxsIGJlIGluY3JlbWVudGVkIHdoZW5ldmVyIGVhY2ggc2VydmVyIHRocmVhZCBoYXMgYm91bmQgYW5kIHN0YXJ0ZWQgbGlzdGVuaW5nCisgIFNlbWFwaG9yZSBzZW0gPSBuZXcgU2VtYXBob3JlKDApOworCit2ZXJzaW9uIChub25lKSB7CisgIC8vIENhbm5vdCB1c2UgdGhpcyBkdWUgdG8gbXVsdGlwbGUgRE1EIEBAQlVHQEBzOgorICAvLyAxLiDCu2Z1bmN0aW9uIEQgbWFpbiBpcyBhIG5lc3RlZCBmdW5jdGlvbiBhbmQgY2Fubm90IGJlIGFjY2Vzc2VkIGZyb20gYXJyYXnCqworICAvLyAgICB3aGVuIGNhbGxpbmcgYXJyYXkoKSBvbiB0aGUgcmVzdWx0IG9mIHRoZSBvdXRlciBtYXAoKSDigJMgd291bGQgaGF2ZSB0bworICAvLyAgICBtYW51YWxseSBkbyB0aGUgZWFnZXIgZXZhbHVhdGlvbi9hcnJheSBjb252ZXJzaW9uLgorICAvLyAyLiDCu1ppcC5vcFNsaWNlIGNhbm5vdCBnZXQgZnJhbWUgcG9pbnRlciB0byBtYXDCqyBmb3IgdGhlIGRlbGF5IGFyZ3VtZW50LAorICAvLyAgICBjYW4gYmUgd29ya2VkIGFyb3VuZCBieSBjYWxsaW5nIGFycmF5KCkgb24gdGhlIG1hcCByZXN1bHQgZmlyc3QuCisgIC8vIDMuIEV2ZW4gd2hlbiB1c2luZyB0aGUgd29ya2Fyb3VuZHMgZm9yIHRoZSBsYXN0IHR3byBwb2ludHMsIHRoZSBETUQtYnVpbHQKKyAgLy8gICAgZXhlY3V0YWJsZSBjcmFzaGVzIHdoZW4gYnVpbGRpbmcgd2l0aG91dCAoc2ljISkgaW5saW5pbmcgZW5hYmxlZCwKKyAgLy8gICAgdGhlIGJhY2t0cmFjZSBwb2ludHMgaW50byB0aGUgZmlyc3QgZGVsZWdhdGUgbGl0ZXJhbC4KKyAgYXV0byBoYW5kbGVycyA9IGFycmF5KG1hcCEoKGFyZ3MpeworICAgIHJldHVybiBuZXcgRXhUZXN0SGFuZGxlcihhcmdzLl8wLCBhcmdzLl8xLCBhcmdzLl8yLCB0cmFjZSk7CisgIH0pKHppcCgKKyAgICBwb3J0cywKKyAgICBtYXAhKChhKXsgcmV0dXJuIGR1ciFgbXNlY3NgKGEpOyB9KShbMSwgMTAsIDEwMCwgMSwgMTAsIDEwMF0pLAorICAgIFtmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlXQorICApKSk7Cit9IGVsc2UgeworICBhdXRvIGhhbmRsZXJzID0gWworICAgIG5ldyBFeFRlc3RIYW5kbGVyKGNhc3QodXNob3J0KShwb3J0ICsgMCksIGR1ciEibXNlY3MiKDEpLCBmYWxzZSwgdHJhY2UpLAorICAgIG5ldyBFeFRlc3RIYW5kbGVyKGNhc3QodXNob3J0KShwb3J0ICsgMSksIGR1ciEibXNlY3MiKDEwKSwgZmFsc2UsIHRyYWNlKSwKKyAgICBuZXcgRXhUZXN0SGFuZGxlcihjYXN0KHVzaG9ydCkocG9ydCArIDIpLCBkdXIhIm1zZWNzIigxMDApLCBmYWxzZSwgdHJhY2UpLAorICAgIG5ldyBFeFRlc3RIYW5kbGVyKGNhc3QodXNob3J0KShwb3J0ICsgMyksIGR1ciEibXNlY3MiKDEpLCB0cnVlLCB0cmFjZSksCisgICAgbmV3IEV4VGVzdEhhbmRsZXIoY2FzdCh1c2hvcnQpKHBvcnQgKyA0KSwgZHVyISJtc2VjcyIoMTApLCB0cnVlLCB0cmFjZSksCisgICAgbmV3IEV4VGVzdEhhbmRsZXIoY2FzdCh1c2hvcnQpKHBvcnQgKyA1KSwgZHVyISJtc2VjcyIoMTAwKSwgdHJ1ZSwgdHJhY2UpCisgIF07Cit9CisKKyAgLy8gRmlyZSB1cCB0aGUgc2VydmVyIHRocmVhZHMuCisgIGZvcmVhY2ggKGg7IGhhbmRsZXJzKSAobmV3IFNlcnZlclRocmVhZChoLCBuZXcgU2VydmVyUHJlU2VydmVIYW5kbGVyKHNlbSksIHNlcnZlckNhbmNlbGxhdGlvbikpLnN0YXJ0KCk7CisKKyAgLy8gd2FpdCB1bnRpbCBhbGwgdGhlIGhhbmRsZXJzIHNpZ25hbCB0aGF0IHRoZXkncmUgcmVhZHkgdG8gc2VydmUKKyAgZm9yZWFjaCAoaDsgaGFuZGxlcnMpIChzZW0ud2FpdChkdXIhYHNlY29uZHNgKDEpKSk7CisKKyAgc3luY0NsaWVudFBvb2xUZXN0KHBvcnRzLCBoYW5kbGVycyk7CisgIGFzeW5jQ2xpZW50UG9vbFRlc3QocG9ydHMsIGhhbmRsZXJzKTsKKyAgYXN5bmNGYXN0ZXN0Q2xpZW50UG9vbFRlc3QocG9ydHMsIGhhbmRsZXJzKTsKKyAgYXN5bmNBZ2dyZWdhdG9yVGVzdChwb3J0cywgaGFuZGxlcnMpOworfQorCisKK3ZvaWQgc3luY0NsaWVudFBvb2xUZXN0KGNvbnN0KHVzaG9ydClbXSBwb3J0cywgRXhUZXN0SGFuZGxlcltdIGhhbmRsZXJzKSB7CisgIGF1dG8gY2xpZW50cyA9IGFycmF5KG1hcCEoKGEpeworICAgIHJldHVybiBjYXN0KFRDbGllbnRCYXNlIUV4VGVzdFNlcnZpY2UpdENsaWVudCFFeFRlc3RTZXJ2aWNlKAorICAgICAgdEJpbmFyeVByb3RvY29sKG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBhKSkKKyAgICApOworICB9KShwb3J0cykpOworCisgIHNjb3BlKGV4aXQpIGZvcmVhY2ggKGM7IGNsaWVudHMpIGMub3V0cHV0UHJvdG9jb2wudHJhbnNwb3J0LmNsb3NlKCk7CisKKyAgLy8gVHJ5IHRoZSBjYXNlIHdoZXJlIHRoZSBmaXJzdCBjbGllbnQgc3VjY2VlZHMuCisgIHsKKyAgICBlbmZvcmNlKG1ha2VQb29sKGNsaWVudHMpLmdldFBvcnQoKSA9PSBwb3J0c1swXSk7CisgIH0KKworICAvLyBUcnkgdGhlIGNhc2Ugd2hlcmUgYWxsIGNsaWVudHMgZmFpbC4KKyAgeworICAgIGF1dG8gcG9vbCA9IG1ha2VQb29sKGNsaWVudHNbMyAuLiAkXSk7CisgICAgYXV0byBlID0gY2FzdChUQ29tcG91bmRPcGVyYXRpb25FeGNlcHRpb24pY29sbGVjdEV4Y2VwdGlvbihwb29sLmdldFBvcnQoKSk7CisgICAgZW5mb3JjZShlKTsKKyAgICBlbmZvcmNlKGVxdWFsKG1hcCEiYS5wb3J0IihjYXN0KFRlc3RTZXJ2aWNlRXhjZXB0aW9uW10pZS5leGNlcHRpb25zKSwKKyAgICAgIHBvcnRzWzMgLi4gJF0pKTsKKyAgfQorCisgIC8vIFRyeSB0aGUgY2FzZSB3aGVyZSB0aGUgZmlyc3QgY2xpZW50cyBmYWlsLCBidXQgYSBsYXRlciBvbmUgc3VjY2VlZHMuCisgIHsKKyAgICBhdXRvIHBvb2wgPSBtYWtlUG9vbChjbGllbnRzWzMgLi4gJF0gfiBjbGllbnRzWzAgLi4gM10pOworICAgIGVuZm9yY2UocG9vbC5nZXRQb3J0SW5BcnJheSgpID09IFtwb3J0c1swXV0pOworICB9CisKKyAgLy8gTWFrZSBzdXJlIGEgY2xpZW50IGlzIHByb3Blcmx5IGRlYWN0aXZhdGVkIHdoZW4gaXQgaGFzIGZhaWxlZCB0b28gb2Z0ZW4uCisgIHsKKyAgICBhdXRvIHBvb2wgPSBtYWtlUG9vbChjbGllbnRzKTsKKyAgICBwb29sLmZhdWx0RGlzYWJsZUNvdW50ID0gMTsKKyAgICBwb29sLmZhdWx0RGlzYWJsZUR1cmF0aW9uID0gZHVyISJtc2VjcyIoNTApOworCisgICAgaGFuZGxlcnNbMF0uZmFpbGluZyA9IHRydWU7CisgICAgZW5mb3JjZShwb29sLmdldFBvcnQoKSA9PSBwb3J0c1sxXSk7CisKKyAgICBoYW5kbGVyc1swXS5mYWlsaW5nID0gZmFsc2U7CisgICAgZW5mb3JjZShwb29sLmdldFBvcnQoKSA9PSBwb3J0c1sxXSk7CisKKyAgICBUaHJlYWQuc2xlZXAoZHVyISJtc2VjcyIoNTApKTsKKyAgICBlbmZvcmNlKHBvb2wuZ2V0UG9ydCgpID09IHBvcnRzWzBdKTsKKyAgfQorfQorCithdXRvIG1ha2VQb29sKFRDbGllbnRCYXNlIUV4VGVzdFNlcnZpY2VbXSBjbGllbnRzKSB7CisgIGF1dG8gcCA9IHRDbGllbnRQb29sKGNsaWVudHMpOworICBwLnBlcm11dGVDbGllbnRzID0gZmFsc2U7CisgIHAucnBjRmF1bHRGaWx0ZXIgPSAoRXhjZXB0aW9uIGUpIHsKKyAgICByZXR1cm4gKGNhc3QoVGVzdFNlcnZpY2VFeGNlcHRpb24pZSAhaXMgbnVsbCk7CisgIH07CisgIHJldHVybiBwOworfQorCisKK3ZvaWQgYXN5bmNDbGllbnRQb29sVGVzdChjb25zdCh1c2hvcnQpW10gcG9ydHMsIEV4VGVzdEhhbmRsZXJbXSBoYW5kbGVycykgeworICBhdXRvIG1hbmFnZXIgPSBuZXcgVExpYmV2ZW50QXN5bmNNYW5hZ2VyOworICBzY29wZSAoZXhpdCkgbWFuYWdlci5zdG9wKGR1ciEiaG5zZWNzIigwKSk7CisKKyAgYXV0byBjbGllbnRzID0gbWFrZUFzeW5jQ2xpZW50cyhtYW5hZ2VyLCBwb3J0cyk7CisgIHNjb3BlKGV4aXQpIGZvcmVhY2ggKGM7IGNsaWVudHMpIGMudHJhbnNwb3J0LmNsb3NlKCk7CisKKyAgLy8gVHJ5IHRoZSBjYXNlIHdoZXJlIHRoZSBmaXJzdCBjbGllbnQgc3VjY2VlZHMuCisgIHsKKyAgICBlbmZvcmNlKG1ha2VBc3luY1Bvb2woY2xpZW50cykuZ2V0UG9ydCgpID09IHBvcnRzWzBdKTsKKyAgfQorCisgIC8vIFRyeSB0aGUgY2FzZSB3aGVyZSBhbGwgY2xpZW50cyBmYWlsLgorICB7CisgICAgYXV0byBwb29sID0gbWFrZUFzeW5jUG9vbChjbGllbnRzWzMgLi4gJF0pOworICAgIGF1dG8gZSA9IGNhc3QoVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uKWNvbGxlY3RFeGNlcHRpb24ocG9vbC5nZXRQb3J0KCkud2FpdEdldCgpKTsKKyAgICBlbmZvcmNlKGUpOworICAgIGVuZm9yY2UoZXF1YWwobWFwISJhLnBvcnQiKGNhc3QoVGVzdFNlcnZpY2VFeGNlcHRpb25bXSllLmV4Y2VwdGlvbnMpLAorICAgICAgcG9ydHNbMyAuLiAkXSkpOworICB9CisKKyAgLy8gVHJ5IHRoZSBjYXNlIHdoZXJlIHRoZSBmaXJzdCBjbGllbnRzIGZhaWwsIGJ1dCBhIGxhdGVyIG9uZSBzdWNjZWVkcy4KKyAgeworICAgIGF1dG8gcG9vbCA9IG1ha2VBc3luY1Bvb2woY2xpZW50c1szIC4uICRdIH4gY2xpZW50c1swIC4uIDNdKTsKKyAgICBlbmZvcmNlKHBvb2wuZ2V0UG9ydEluQXJyYXkoKSA9PSBbcG9ydHNbMF1dKTsKKyAgfQorCisgIC8vIE1ha2Ugc3VyZSBhIGNsaWVudCBpcyBwcm9wZXJseSBkZWFjdGl2YXRlZCB3aGVuIGl0IGhhcyBmYWlsZWQgdG9vIG9mdGVuLgorICB7CisgICAgYXV0byBwb29sID0gbWFrZUFzeW5jUG9vbChjbGllbnRzKTsKKyAgICBwb29sLmZhdWx0RGlzYWJsZUNvdW50ID0gMTsKKyAgICBwb29sLmZhdWx0RGlzYWJsZUR1cmF0aW9uID0gZHVyISJtc2VjcyIoNTApOworCisgICAgaGFuZGxlcnNbMF0uZmFpbGluZyA9IHRydWU7CisgICAgZW5mb3JjZShwb29sLmdldFBvcnQoKSA9PSBwb3J0c1sxXSk7CisKKyAgICBoYW5kbGVyc1swXS5mYWlsaW5nID0gZmFsc2U7CisgICAgZW5mb3JjZShwb29sLmdldFBvcnQoKSA9PSBwb3J0c1sxXSk7CisKKyAgICBUaHJlYWQuc2xlZXAoZHVyISJtc2VjcyIoNTApKTsKKyAgICBlbmZvcmNlKHBvb2wuZ2V0UG9ydCgpID09IHBvcnRzWzBdKTsKKyAgfQorfQorCithdXRvIG1ha2VBc3luY1Bvb2woVEFzeW5jQ2xpZW50QmFzZSFFeFRlc3RTZXJ2aWNlW10gY2xpZW50cykgeworICBhdXRvIHAgPSB0QXN5bmNDbGllbnRQb29sKGNsaWVudHMpOworICBwLnBlcm11dGVDbGllbnRzID0gZmFsc2U7CisgIHAucnBjRmF1bHRGaWx0ZXIgPSAoRXhjZXB0aW9uIGUpIHsKKyAgICByZXR1cm4gKGNhc3QoVGVzdFNlcnZpY2VFeGNlcHRpb24pZSAhaXMgbnVsbCk7CisgIH07CisgIHJldHVybiBwOworfQorCithdXRvIG1ha2VBc3luY0NsaWVudHMoVExpYmV2ZW50QXN5bmNNYW5hZ2VyIG1hbmFnZXIsIGluIHVzaG9ydFtdIHBvcnRzKSB7CisgIC8vIERNRCBAQEJVR0BAIHdvcmthcm91bmQ6IFVzaW5nIGFycmF5IG9uIHRoZSBsYXp5SGFuZGxlcnMgbWFwIHJlc3VsdCBsZWFkcworICAvLyB0byDCu2Z1bmN0aW9uIEQgbWFpbiBpcyBhIG5lc3RlZCBmdW5jdGlvbiBhbmQgY2Fubm90IGJlIGFjY2Vzc2VkIGZyb20gYXJyYXnCqy4KKyAgLy8gVGh1cywgd2UgbWFudWFsbHkgZG8gdGhlIGFycmF5IGNvbnZlcnNpb24uCisgIGF1dG8gbGF6eUNsaWVudHMgPSBtYXAhKChhKXsKKyAgICByZXR1cm4gbmV3IFRBc3luY0NsaWVudCFFeFRlc3RTZXJ2aWNlKAorICAgICAgbmV3IFRBc3luY1NvY2tldChtYW5hZ2VyLCAiMTI3LjAuMC4xIiwgYSksCisgICAgICBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IShUQnVmZmVyZWRUcmFuc3BvcnQpCisgICAgKTsKKyAgfSkocG9ydHMpOworICBUQXN5bmNDbGllbnRCYXNlIUV4VGVzdFNlcnZpY2VbXSBjbGllbnRzOworICBmb3JlYWNoIChjOyBsYXp5Q2xpZW50cykgY2xpZW50cyB+PSBjOworICByZXR1cm4gY2xpZW50czsKK30KKworCit2b2lkIGFzeW5jRmFzdGVzdENsaWVudFBvb2xUZXN0KGNvbnN0KHVzaG9ydClbXSBwb3J0cywgRXhUZXN0SGFuZGxlcltdIGhhbmRsZXJzKSB7CisgIGF1dG8gbWFuYWdlciA9IG5ldyBUTGliZXZlbnRBc3luY01hbmFnZXI7CisgIHNjb3BlIChleGl0KSBtYW5hZ2VyLnN0b3AoZHVyISJobnNlY3MiKDApKTsKKworICBhdXRvIGNsaWVudHMgPSBtYWtlQXN5bmNDbGllbnRzKG1hbmFnZXIsIHBvcnRzKTsKKyAgc2NvcGUoZXhpdCkgZm9yZWFjaCAoYzsgY2xpZW50cykgYy50cmFuc3BvcnQuY2xvc2UoKTsKKworICAvLyBNYWtlIHN1cmUgdGhlIGZhc3Rlc3QgY2xpZW50IHdpbnMsIGV2ZW4gaWYgdGhleSBhcmUgY2FsbGVkIGluIHNvbWUgb3RoZXIKKyAgLy8gb3JkZXIuCisgIHsKKyAgICBhdXRvIHJlc3VsdCA9IG1ha2VBc3luY0Zhc3Rlc3RQb29sKGFycmF5KHJldHJvKGNsaWVudHMpKSkuZ2V0UG9ydCgpLndhaXRHZXQoKTsKKyAgICBlbmZvcmNlKHJlc3VsdCA9PSBwb3J0c1swXSk7CisgIH0KKworICAvLyBUcnkgdGhlIGNhc2Ugd2hlcmUgYWxsIGNsaWVudHMgZmFpbC4KKyAgeworICAgIGF1dG8gcG9vbCA9IG1ha2VBc3luY0Zhc3Rlc3RQb29sKGNsaWVudHNbMyAuLiAkXSk7CisgICAgYXV0byBlID0gY2FzdChUQ29tcG91bmRPcGVyYXRpb25FeGNlcHRpb24pY29sbGVjdEV4Y2VwdGlvbihwb29sLmdldFBvcnQoKS53YWl0R2V0KCkpOworICAgIGVuZm9yY2UoZSk7CisgICAgZW5mb3JjZShlcXVhbChtYXAhImEucG9ydCIoY2FzdChUZXN0U2VydmljZUV4Y2VwdGlvbltdKWUuZXhjZXB0aW9ucyksCisgICAgICBwb3J0c1szIC4uICRdKSk7CisgIH0KKworICAvLyBUcnkgdGhlIGNhc2Ugd2hlcmUgdGhlIGZpcnN0IGNsaWVudHMgZmFpbCwgYnV0IGEgbGF0ZXIgb25lIHN1Y2NlZWRzLgorICB7CisgICAgYXV0byBwb29sID0gbWFrZUFzeW5jRmFzdGVzdFBvb2woY2xpZW50c1sxIC4uICRdKTsKKyAgICBlbmZvcmNlKHBvb2wuZ2V0UG9ydEluQXJyYXkoKSA9PSBbcG9ydHNbMV1dKTsKKyAgfQorfQorCithdXRvIG1ha2VBc3luY0Zhc3Rlc3RQb29sKFRBc3luY0NsaWVudEJhc2UhRXhUZXN0U2VydmljZVtdIGNsaWVudHMpIHsKKyAgYXV0byBwID0gdEFzeW5jRmFzdGVzdENsaWVudFBvb2woY2xpZW50cyk7CisgIHAucnBjRmF1bHRGaWx0ZXIgPSAoRXhjZXB0aW9uIGUpIHsKKyAgICByZXR1cm4gKGNhc3QoVGVzdFNlcnZpY2VFeGNlcHRpb24pZSAhaXMgbnVsbCk7CisgIH07CisgIHJldHVybiBwOworfQorCisKK3ZvaWQgYXN5bmNBZ2dyZWdhdG9yVGVzdChjb25zdCh1c2hvcnQpW10gcG9ydHMsIEV4VGVzdEhhbmRsZXJbXSBoYW5kbGVycykgeworICBhdXRvIG1hbmFnZXIgPSBuZXcgVExpYmV2ZW50QXN5bmNNYW5hZ2VyOworICBzY29wZSAoZXhpdCkgbWFuYWdlci5zdG9wKGR1ciEiaG5zZWNzIigwKSk7CisKKyAgYXV0byBjbGllbnRzID0gbWFrZUFzeW5jQ2xpZW50cyhtYW5hZ2VyLCBwb3J0cyk7CisgIHNjb3BlKGV4aXQpIGZvcmVhY2ggKGM7IGNsaWVudHMpIGMudHJhbnNwb3J0LmNsb3NlKCk7CisKKyAgYXV0byBhZ2dyZWdhdG9yID0gdEFzeW5jQWdncmVnYXRvcigKKyAgICBjYXN0KFRBc3luY0NsaWVudEJhc2UhRXhUZXN0U2VydmljZVtdKWNsaWVudHMpOworCisgIC8vIFRlc3QgYWdncmVnYXRvciByYW5nZSBpbnRlcmZhY2UuCisgIHsKKyAgICBhdXRvIHJhbmdlID0gYWdncmVnYXRvci5nZXRQb3J0KCkucmFuZ2UoZHVyISJtc2VjcyIoNTApKTsKKyAgICBlbmZvcmNlKGVxdWFsKHJhbmdlLCBwb3J0c1swIC4uIDJdW10pKTsKKyAgICBlbmZvcmNlKGVxdWFsKG1hcCEiYS5wb3J0IihjYXN0KFRlc3RTZXJ2aWNlRXhjZXB0aW9uW10pcmFuZ2UuZXhjZXB0aW9ucyksCisgICAgICBwb3J0c1szIC4uICQgLSAxXSkpOworICAgIGVuZm9yY2UocmFuZ2UuY29tcGxldGVkQ291bnQgPT0gNCk7CisgIH0KKworICAvLyBUZXN0IGRlZmF1bHQgYWNjdW11bGF0b3IgZm9yIHNjYWxhcnMuCisgIHsKKyAgICBhdXRvIGZ1bGxSZXN1bHQgPSBhZ2dyZWdhdG9yLmdldFBvcnQoKS5hY2N1bXVsYXRlKCk7CisgICAgZW5mb3JjZShmdWxsUmVzdWx0LndhaXRHZXQoKSA9PSBwb3J0c1swIC4uIDNdKTsKKworICAgIGF1dG8gcGFydGlhbFJlc3VsdCA9IGFnZ3JlZ2F0b3IuZ2V0UG9ydCgpLmFjY3VtdWxhdGUoKTsKKyAgICBUaHJlYWQuc2xlZXAoZHVyISJtc2VjcyIoMjApKTsKKyAgICBlbmZvcmNlKHBhcnRpYWxSZXN1bHQuZmluaXNoR2V0KCkgPT0gcG9ydHNbMCAuLiAyXSk7CisKKyAgfQorCisgIC8vIFRlc3QgZGVmYXVsdCBhY2N1bXVsYXRvciBmb3IgYXJyYXlzLgorICB7CisgICAgYXV0byBmdWxsUmVzdWx0ID0gYWdncmVnYXRvci5nZXRQb3J0SW5BcnJheSgpLmFjY3VtdWxhdGUoKTsKKyAgICBlbmZvcmNlKGZ1bGxSZXN1bHQud2FpdEdldCgpID09IHBvcnRzWzAgLi4gM10pOworCisgICAgYXV0byBwYXJ0aWFsUmVzdWx0ID0gYWdncmVnYXRvci5nZXRQb3J0SW5BcnJheSgpLmFjY3VtdWxhdGUoKTsKKyAgICBUaHJlYWQuc2xlZXAoZHVyISJtc2VjcyIoMjApKTsKKyAgICBlbmZvcmNlKHBhcnRpYWxSZXN1bHQuZmluaXNoR2V0KCkgPT0gcG9ydHNbMCAuLiAyXSk7CisgIH0KKworICAvLyBUZXN0IGN1c3RvbSBhY2N1bXVsYXRvci4KKyAgeworICAgIGF1dG8gZnVsbFJlc3VsdCA9IGFnZ3JlZ2F0b3IuZ2V0UG9ydCgpLmFjY3VtdWxhdGUhKGZ1bmN0aW9uKGludFtdIHJlc3VsdHMpeworICAgICAgcmV0dXJuIHJlZHVjZSEiYSArIGIiKHJlc3VsdHMpOworICAgIH0pKCk7CisgICAgZW5mb3JjZShmdWxsUmVzdWx0LndhaXRHZXQoKSA9PSBwb3J0c1swXSArIHBvcnRzWzFdICsgcG9ydHNbMl0pOworCisgICAgYXV0byBwYXJ0aWFsUmVzdWx0ID0gYWdncmVnYXRvci5nZXRQb3J0KCkuYWNjdW11bGF0ZSEoCisgICAgICBmdW5jdGlvbihpbnRbXSByZXN1bHRzLCBFeGNlcHRpb25bXSBleGNlcHRpb25zKSB7CisgICAgICAgIC8vIFJldHVybiBhIHR1cGxlIG9mIHRoZSBwYXJhbWV0ZXJzIHNvIHdlIGNhbiBjaGVjayB0aGVtIG91dHNpZGUgb2YKKyAgICAgICAgLy8gdGhpcyBmdW5jdGlvbiAodG8gdmVyaWZ5IHRoZSB2YWx1ZXMsIHdlIG5lZWQgYWNjZXNzIHRvIMK7cG9ydHPCqywgYnV0CisgICAgICAgIC8vIGR1ZSB0byBETUQgQEBCVUc1NzEwQEAsIHdlIGNhbid0IHVzZSBhIGRlbGVnYXRlIGxpdGVyYWwpLmYKKyAgICAgICAgcmV0dXJuIHR1cGxlKHJlc3VsdHMsIGV4Y2VwdGlvbnMpOworICAgICAgfQorICAgICkoKTsKKyAgICBUaHJlYWQuc2xlZXAoZHVyISJtc2VjcyIoMjApKTsKKyAgICBhdXRvIHJlc3VsdFR1cGxlID0gcGFydGlhbFJlc3VsdC5maW5pc2hHZXQoKTsKKyAgICBlbmZvcmNlKHJlc3VsdFR1cGxlWzBdID09IHBvcnRzWzAgLi4gMl0pOworICAgIGVuZm9yY2UoZXF1YWwobWFwISJhLnBvcnQiKGNhc3QoVGVzdFNlcnZpY2VFeGNlcHRpb25bXSlyZXN1bHRUdXBsZVsxXSksCisgICAgICBwb3J0c1szIC4uICQgLSAxXSkpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L29wZW5zc2wudGVzdC5jbmYgYi9saWIvZC90ZXN0L29wZW5zc2wudGVzdC5jbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFkYTMwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3Rlc3Qvb3BlbnNzbC50ZXN0LmNuZgpAQCAtMCwwICsxLDE0IEBACitbIHJlcSBdCitkZWZhdWx0X2JpdHMgPSAyMDQ4CitkZWZhdWx0X2tleWZpbGUgPSBzZXJ2ZXItcHJpdmF0ZS1rZXkucGVtCitkaXN0aW5ndWlzaGVkX25hbWUgPSByZXFfZGlzdGluZ3Vpc2hlZF9uYW1lCit4NTA5X2V4dGVuc2lvbnMgPSB2M19jYQorcHJvbXB0ID0gbm8KKworWyByZXFfZGlzdGluZ3Vpc2hlZF9uYW1lIF0KK0NOID0gbG9jYWxob3N0CisKK1sgdjNfY2EgXQorIyBBZGQgOjoxIHRvIHRoZSBsaXN0IG9mIGFsbG93ZWQgSVBzIHNvIHdlIGNhbiB1c2UgOjoxIHRvIGV4cGxpY2l0bHkgY29ubmVjdAorIyB0byBsb2NhbGhvc3QgdmlhIElQdjYuCitzdWJqZWN0QWx0TmFtZSA9IElQOjo6MQpkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC9zZXJpYWxpemF0aW9uX2JlbmNobWFyay5kIGIvbGliL2QvdGVzdC9zZXJpYWxpemF0aW9uX2JlbmNobWFyay5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZDA0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC90ZXN0L3NlcmlhbGl6YXRpb25fYmVuY2htYXJrLmQKQEAgLTAsMCArMSw3MCBAQAorLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWluaSBzZXJpYWxpemF0aW9uIGJlbmNobWFyayBhbHNvIGF2YWlsYWJsZSBmb3IKKyAqIEMrKyBhbmQgSmF2YS4KKyAqCisgKiBGb3IgbWVhbmluZ2Z1bCByZXN1bHRzLCB5b3UgbWlnaHQgd2FudCB0byBtYWtlIHN1cmUgdGhhdAorICogdGhlIFRocmlmdCBsaWJyYXJ5IGlzIGNvbXBpbGVkIHdpdGggcmVsZWFzZSBidWlsZCBmbGFncywKKyAqIGUuZy4gYnkgaW5jbHVkaW5nIHRoZSBzb3VyY2UgZmlsZXMgd2l0aCB0aGUgYnVpbGQgaW5zdGVhZAorICogb2YgbGlua2luZyBsaWJ0aHJpZnRkOgorICoKKyAgIGRtZCAtdyAtTyAtcmVsZWFzZSAtaW5saW5lIC1JLi4vc3JjIC1JZ2VuLWQgLW9mc2VyaWFsaXphdGlvbl9iZW5jaG1hcmsgXAorICAgJChmaW5kIC4uL3NyYy90aHJpZnQgLW5hbWUgJyouZCcgLW5vdCAtbmFtZSBpbmRleC5kKSBcCisgICBnZW4tZC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5kIHNlcmlhbGl6YXRpb25fYmVuY2htYXJrLmQKKyAqLworbW9kdWxlIHNlcmlhbGl6YXRpb25fYmVuY2htYXJrOworCitpbXBvcnQgc3RkLmRhdGV0aW1lLnN0b3B3YXRjaCA6IEF1dG9TdGFydCwgU3RvcFdhdGNoOworaW1wb3J0IHN0ZC5tYXRoIDogUEk7CitpbXBvcnQgc3RkLnN0ZGlvOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5yYW5nZTsKK2ltcG9ydCBEZWJ1Z1Byb3RvVGVzdF90eXBlczsKKwordm9pZCBtYWluKCkgeworICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyOworICBlbnVtIElURVJBVElPTlMgPSAxMF8wMDBfMDAwOworCisgIHsKKyAgICBhdXRvIG9vZSA9IE9uZU9mRWFjaCgpOworICAgIG9vZS5pbV90cnVlICAgPSB0cnVlOworICAgIG9vZS5pbV9mYWxzZSAgPSBmYWxzZTsKKyAgICBvb2UuYV9iaXRlICAgID0gMHg3ZjsKKyAgICBvb2UuaW50ZWdlcjE2ID0gMjdfMDAwOworICAgIG9vZS5pbnRlZ2VyMzIgPSAxIDw8IDI0OworICAgIG9vZS5pbnRlZ2VyNjQgPSA2XzAwMF8wMDBfMDAwOworICAgIG9vZS5kb3VibGVfcHJlY2lzaW9uID0gUEk7CisgICAgb29lLnNvbWVfY2hhcmFjdGVycyA9ICJKU09OIFRISVMhIFwiXDEiOworICAgIG9vZS56b21nX3VuaWNvZGUgPSAiXHhkN1xuXGFcdCI7CisgICAgb29lLmJhc2U2NCA9ICJcMVwyXDNcMjU1IjsKKworICAgIGF1dG8gcHJvdCA9IHRCaW5hcnlQcm90b2NvbChidWYpOworICAgIGF1dG8gc3cgPSBTdG9wV2F0Y2goQXV0b1N0YXJ0Lnllcyk7CisgICAgZm9yZWFjaCAoaTsgMCAuLiBJVEVSQVRJT05TKSB7CisgICAgICBidWYucmVzZXQoMTIwKTsKKyAgICAgIG9vZS53cml0ZShwcm90KTsKKyAgICB9CisgICAgc3cuc3RvcCgpOworCisgICAgYXV0byBtc2VjcyA9IHN3LnBlZWsoKS50b3RhbCEibXNlY3MiOworICAgIHdyaXRlZmxuKCJXcml0ZTogJXMgbXMgKCVzIGtIeikiLCBtc2VjcywgSVRFUkFUSU9OUyAvIG1zZWNzKTsKKyAgfQorCisgIGF1dG8gZGF0YSA9IGJ1Zi5nZXRDb250ZW50cygpLmR1cDsKKworICB7CisgICAgYXV0byByZWFkQnVmID0gdElucHV0UmFuZ2VUcmFuc3BvcnQoZGF0YSk7CisgICAgYXV0byBwcm90ID0gdEJpbmFyeVByb3RvY29sKHJlYWRCdWYpOworICAgIGF1dG8gb29lID0gT25lT2ZFYWNoKCk7CisKKyAgICBhdXRvIHN3ID0gU3RvcFdhdGNoKEF1dG9TdGFydC55ZXMpOworICAgIGZvcmVhY2ggKGk7IDAgLi4gSVRFUkFUSU9OUykgeworICAgICAgcmVhZEJ1Zi5yZXNldChkYXRhKTsKKyAgICAgIG9vZS5yZWFkKHByb3QpOworICAgIH0KKyAgICBzdy5zdG9wKCk7CisKKyAgICBhdXRvIG1zZWNzID0gc3cucGVlaygpLnRvdGFsISJtc2VjcyI7CisgICAgd3JpdGVmbG4oIiBSZWFkOiAlcyBtcyAoJXMga0h6KSIsIG1zZWNzLCBJVEVSQVRJT05TIC8gbXNlY3MpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L3N0cmVzc190ZXN0X3NlcnZlci5kIGIvbGliL2QvdGVzdC9zdHJlc3NfdGVzdF9zZXJ2ZXIuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGRhMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvdGVzdC9zdHJlc3NfdGVzdF9zZXJ2ZXIuZApAQCAtMCwwICsxLDgxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgc3RyZXNzX3Rlc3Rfc2VydmVyOworCitpbXBvcnQgc3RkLmdldG9wdDsKK2ltcG9ydCBzdGQucGFyYWxsZWxpc20gOiB0b3RhbENQVXM7CitpbXBvcnQgc3RkLnN0ZGlvOworaW1wb3J0IHN0ZC50eXBldHVwbGU7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4ucHJvY2Vzc29yOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5iYXNlOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LnNvY2tldDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJ1ZmZlcmVkOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC51dGlsLmhhc2hzZXQ7CitpbXBvcnQgdGVzdF91dGlsczsKKworaW1wb3J0IHRocmlmdC50ZXN0LnN0cmVzcy5TZXJ2aWNlOworCitjbGFzcyBTZXJ2aWNlSGFuZGxlciA6IFNlcnZpY2UgeworICB2b2lkIGVjaG9Wb2lkKCkgeyByZXR1cm47IH0KKyAgYnl0ZSBlY2hvQnl0ZShieXRlIGFyZykgeyByZXR1cm4gYXJnOyB9CisgIGludCBlY2hvSTMyKGludCBhcmcpIHsgcmV0dXJuIGFyZzsgfQorICBsb25nIGVjaG9JNjQobG9uZyBhcmcpIHsgcmV0dXJuIGFyZzsgfQorICBieXRlW10gZWNob0xpc3QoYnl0ZVtdIGFyZykgeyByZXR1cm4gYXJnOyB9CisgIEhhc2hTZXQhYnl0ZSBlY2hvU2V0KEhhc2hTZXQhYnl0ZSBhcmcpIHsgcmV0dXJuIGFyZzsgfQorICBieXRlW2J5dGVdIGVjaG9NYXAoYnl0ZVtieXRlXSBhcmcpIHsgcmV0dXJuIGFyZzsgfQorCisgIHN0cmluZyBlY2hvU3RyaW5nKHN0cmluZyBhcmcpIHsKKyAgICBpZiAoYXJnICE9ICJoZWxsbyIpIHsKKyAgICAgIHN0ZGVyci53cml0ZWZsbihgV3Jvbmcgc3RyaW5nIHJlY2VpdmVkOiAlcyBpbnN0ZWFkIG9mICJoZWxsbyJgLCBhcmcpOworICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiV3Jvbmcgc3RyaW5nIHJlY2VpdmVkLiIpOworICAgIH0KKyAgICByZXR1cm4gYXJnOworICB9Cit9CisKK3ZvaWQgbWFpbihzdHJpbmdbXSBhcmdzKSB7CisgIHVzaG9ydCBwb3J0ID0gOTA5MTsKKyAgYXV0byBzZXJ2ZXJUeXBlID0gU2VydmVyVHlwZS50aHJlYWRlZDsKKyAgVHJhbnNwb3J0VHlwZSB0cmFuc3BvcnRUeXBlOworICBzaXplX3QgbnVtSU9UaHJlYWRzID0gMTsKKyAgc2l6ZV90IHRhc2tQb29sU2l6ZSA9IHRvdGFsQ1BVczsKKworICBnZXRvcHQoYXJncywgInBvcnQiLCAmcG9ydCwgInNlcnZlci10eXBlIiwgJnNlcnZlclR5cGUsCisgICAgInRyYW5zcG9ydC10eXBlIiwgJnRyYW5zcG9ydFR5cGUsICJ0YXNrLXBvb2wtc2l6ZSIsICZ0YXNrUG9vbFNpemUsCisgICAgIm51bS1pby10aHJlYWRzIiwgJm51bUlPVGhyZWFkcyk7CisKKyAgYWxpYXMgVHlwZVR1cGxlIShUQnVmZmVyZWRUcmFuc3BvcnQsIFRNZW1vcnlCdWZmZXIpIEF2YWlsYWJsZVRyYW5zcG9ydHM7CisKKyAgYXV0byBwcm9jZXNzb3IgPSBuZXcgVFNlcnZpY2VQcm9jZXNzb3IhKFNlcnZpY2UsCisgICAgc3RhdGljTWFwIShUQmluYXJ5UHJvdG9jb2wsIEF2YWlsYWJsZVRyYW5zcG9ydHMpKShuZXcgU2VydmljZUhhbmRsZXIoKSk7CisgIGF1dG8gc2VydmVyU29ja2V0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCk7CisgIGF1dG8gdHJhbnNwb3J0RmFjdG9yeSA9IGNyZWF0ZVRyYW5zcG9ydEZhY3RvcnkodHJhbnNwb3J0VHlwZSk7CisgIGF1dG8gcHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkhQXZhaWxhYmxlVHJhbnNwb3J0czsKKworICBhdXRvIHNlcnZlciA9IGNyZWF0ZVNlcnZlcihzZXJ2ZXJUeXBlLCB0YXNrUG9vbFNpemUsIG51bUlPVGhyZWFkcywKKyAgICBwcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKworICB3cml0ZWZsbigiU3RhcnRpbmcgJXMgJXMgU3RyZXNzVGVzdCBzZXJ2ZXIgb24gcG9ydCAlcy4uLiIsIHRyYW5zcG9ydFR5cGUsCisgICAgc2VydmVyVHlwZSwgcG9ydCk7CisgIHNlcnZlci5zZXJ2ZSgpOworICB3cml0ZWxuKCJkb25lLiIpOworfQpkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC90ZXN0X3V0aWxzLmQgYi9saWIvZC90ZXN0L3Rlc3RfdXRpbHMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzQxMDBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvdGVzdC90ZXN0X3V0aWxzLmQKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFZhcmlvdXMgaGVscGVycyB1c2VkIGJ5IG1vcmUgdGhhbiBhIHNpbmdsZSB0ZXN0LgorICovCittb2R1bGUgdGVzdF91dGlsczsKKworaW1wb3J0IHN0ZC5wYXJhbGxlbGlzbSA6IFRhc2tQb29sOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5wcm9jZXNzb3I7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5iYXNlOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIubm9uYmxvY2tpbmc7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5zaW1wbGU7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50YXNrcG9vbDsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnRocmVhZGVkOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LnNvY2tldDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5idWZmZXJlZDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmZyYW1lZDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lmh0dHA7CisKKy8vIFRoaXMgaXMgYSBsaWtlbHkgdmljdGltIG9mIEBAQlVHNDc0NEBAIHdoZW4gdXNlZCB3aXRoIGNvbW1hbmQgYXJndW1lbnQKKy8vIHBhcnNpbmcuCitlbnVtIFNlcnZlclR5cGUgeworICBzaW1wbGUsCisgIG5vbmJsb2NraW5nLAorICBwb29sZWROb25ibG9ja2luZywKKyAgdGFza3Bvb2wsCisgIHRocmVhZGVkCit9CisKK1RTZXJ2ZXIgY3JlYXRlU2VydmVyKFNlcnZlclR5cGUgdHlwZSwgc2l6ZV90IHRhc2tQb29sU2l6ZSwgc2l6ZV90IG51bUlPVGhyZWFkcywKKyAgVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJTb2NrZXQgc2VydmVyVHJhbnNwb3J0LAorICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKK3sKKyAgZmluYWwgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBTZXJ2ZXJUeXBlLnNpbXBsZToKKyAgICAgIHJldHVybiBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKyAgICBjYXNlIFNlcnZlclR5cGUubm9uYmxvY2tpbmc6CisgICAgICBhdXRvIG5iID0gbmV3IFROb25ibG9ja2luZ1NlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydC5wb3J0LAorICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOworICAgICAgbmIubnVtSU9UaHJlYWRzID0gbnVtSU9UaHJlYWRzOworICAgICAgcmV0dXJuIG5iOworICAgIGNhc2UgU2VydmVyVHlwZS5wb29sZWROb25ibG9ja2luZzoKKyAgICAgIGF1dG8gbmIgPSBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LnBvcnQsCisgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgbmV3IFRhc2tQb29sKHRhc2tQb29sU2l6ZSkpOworICAgICAgbmIubnVtSU9UaHJlYWRzID0gbnVtSU9UaHJlYWRzOworICAgICAgcmV0dXJuIG5iOworICAgIGNhc2UgU2VydmVyVHlwZS50YXNrcG9vbDoKKyAgICAgIGF1dG8gdHBzID0gbmV3IFRUYXNrUG9vbFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKyAgICAgIHRwcy50YXNrUG9vbCA9IG5ldyBUYXNrUG9vbCh0YXNrUG9vbFNpemUpOworICAgICAgcmV0dXJuIHRwczsKKyAgICBjYXNlIFNlcnZlclR5cGUudGhyZWFkZWQ6CisgICAgICByZXR1cm4gbmV3IFRUaHJlYWRlZFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKyAgfQorfQorCitlbnVtIFRyYW5zcG9ydFR5cGUgeworICBidWZmZXJlZCwKKyAgZnJhbWVkLAorICBodHRwLAorICByYXcKK30KKworVFRyYW5zcG9ydEZhY3RvcnkgY3JlYXRlVHJhbnNwb3J0RmFjdG9yeShUcmFuc3BvcnRUeXBlIHR5cGUpIHsKKyAgZmluYWwgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUcmFuc3BvcnRUeXBlLmJ1ZmZlcmVkOgorICAgICAgcmV0dXJuIG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OworICAgIGNhc2UgVHJhbnNwb3J0VHlwZS5mcmFtZWQ6CisgICAgICByZXR1cm4gbmV3IFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5OworICAgIGNhc2UgVHJhbnNwb3J0VHlwZS5odHRwOgorICAgICAgcmV0dXJuIG5ldyBUU2VydmVySHR0cFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgY2FzZSBUcmFuc3BvcnRUeXBlLnJhdzoKKyAgICAgIHJldHVybiBuZXcgVFRyYW5zcG9ydEZhY3Rvcnk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfY2xpZW50LmQgYi9saWIvZC90ZXN0L3RocmlmdF90ZXN0X2NsaWVudC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NDE5ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC90ZXN0L3RocmlmdF90ZXN0X2NsaWVudC5kCkBAIC0wLDAgKzEsMzg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0X3Rlc3RfY2xpZW50OworCitpbXBvcnQgc3RkLmNvbnY7CitpbXBvcnQgc3RkLmRhdGV0aW1lOworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHN0ZC5nZXRvcHQ7CitpbXBvcnQgc3RkLnN0ZGlvOworaW1wb3J0IHN0ZC5zdHJpbmc7CitpbXBvcnQgc3RkLnRyYWl0czsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5jbGllbnQ7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJpbmFyeTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuY29tcGFjdDsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuanNvbjsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5idWZmZXJlZDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmZyYW1lZDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lmh0dHA7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zc2w7CitpbXBvcnQgdGhyaWZ0LnV0aWwuaGFzaHNldDsKKworaW1wb3J0IHRocmlmdF90ZXN0X2NvbW1vbjsKK2ltcG9ydCB0aHJpZnQudGVzdC5UaHJpZnRUZXN0OworaW1wb3J0IHRocmlmdC50ZXN0LlRocmlmdFRlc3RfdHlwZXM7CisKK2VudW0gVHJhbnNwb3J0VHlwZSB7CisgIGJ1ZmZlcmVkLAorICBmcmFtZWQsCisgIGh0dHAsCisgIHJhdworfQorCitUUHJvdG9jb2wgY3JlYXRlUHJvdG9jb2woVCkoVCB0cmFucywgUHJvdG9jb2xUeXBlIHR5cGUpIHsKKyAgZmluYWwgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBQcm90b2NvbFR5cGUuYmluYXJ5OgorICAgICAgcmV0dXJuIHRCaW5hcnlQcm90b2NvbCh0cmFucyk7CisgICAgY2FzZSBQcm90b2NvbFR5cGUuY29tcGFjdDoKKyAgICAgIHJldHVybiB0Q29tcGFjdFByb3RvY29sKHRyYW5zKTsKKyAgICBjYXNlIFByb3RvY29sVHlwZS5qc29uOgorICAgICAgcmV0dXJuIHRKc29uUHJvdG9jb2wodHJhbnMpOworICB9Cit9CisKK3ZvaWQgbWFpbihzdHJpbmdbXSBhcmdzKSB7CisgIHN0cmluZyBob3N0ID0gImxvY2FsaG9zdCI7CisgIHVzaG9ydCBwb3J0ID0gOTA5MDsKKyAgdWludCBudW1UZXN0cyA9IDE7CisgIGJvb2wgc3NsOworICBQcm90b2NvbFR5cGUgcHJvdG9jb2xUeXBlOworICBUcmFuc3BvcnRUeXBlIHRyYW5zcG9ydFR5cGU7CisgIGJvb2wgdHJhY2U7CisKKyAgZ2V0b3B0KGFyZ3MsCisgICAgIm51bVRlc3RzfG4iLCAmbnVtVGVzdHMsCisgICAgInByb3RvY29sIiwgJnByb3RvY29sVHlwZSwKKyAgICAic3NsIiwgJnNzbCwKKyAgICAidHJhbnNwb3J0IiwgJnRyYW5zcG9ydFR5cGUsCisgICAgInRyYWNlIiwgJnRyYWNlLAorICAgICJwb3J0IiwgJnBvcnQsCisgICAgImhvc3QiLCAoc3RyaW5nIF8sIHN0cmluZyB2YWx1ZSkgeworICAgICAgYXV0byBwYXJ0cyA9IHNwbGl0KHZhbHVlLCAiOiIpOworICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHsKKyAgICAgICAgLy8gSVB2NiBhZGRyZXNzZXMgY2FuIGNvbnRhaW4gY29sb25zLCBzbyB0YWtlIHRoZSBsYXN0IHBhcnQgZm9yIHRoZQorICAgICAgICAvLyBwb3J0LgorICAgICAgICBob3N0ID0gam9pbihwYXJ0c1swIC4uICQgLSAxXSwgIjoiKTsKKyAgICAgICAgcG9ydCA9IHRvIXVzaG9ydChwYXJ0c1skIC0gMV0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaG9zdCA9IHZhbHVlOworICAgICAgfQorICAgIH0KKyAgKTsKKyAgcG9ydCA9IHRvIXVzaG9ydChwb3J0KTsKKworICBUU29ja2V0IHNvY2tldDsKKyAgaWYgKHNzbCkgeworICAgIGF1dG8gc3NsQ29udGV4dCA9IG5ldyBUU1NMQ29udGV4dCgpOworICAgIHNzbENvbnRleHQuY2lwaGVycyA9ICJBTEw6IUFESDohTE9XOiFFWFA6IU1ENTpAU1RSRU5HVEgiOworICAgIHNzbENvbnRleHQuYXV0aGVudGljYXRlID0gdHJ1ZTsKKyAgICBzc2xDb250ZXh0LmxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKCIuLi8uLi8uLi90ZXN0L2tleXMvQ0EucGVtIik7CisgICAgc29ja2V0ID0gbmV3IFRTU0xTb2NrZXQoc3NsQ29udGV4dCwgaG9zdCwgcG9ydCk7CisgIH0gZWxzZSB7CisgICAgc29ja2V0ID0gbmV3IFRTb2NrZXQoaG9zdCwgcG9ydCk7CisgIH0KKworICBUUHJvdG9jb2wgcHJvdG9jb2w7CisgIGZpbmFsIHN3aXRjaCAodHJhbnNwb3J0VHlwZSkgeworICAgIGNhc2UgVHJhbnNwb3J0VHlwZS5idWZmZXJlZDoKKyAgICAgIHByb3RvY29sID0gY3JlYXRlUHJvdG9jb2wobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpLCBwcm90b2NvbFR5cGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUcmFuc3BvcnRUeXBlLmZyYW1lZDoKKyAgICAgIHByb3RvY29sID0gY3JlYXRlUHJvdG9jb2wobmV3IFRGcmFtZWRUcmFuc3BvcnQoc29ja2V0KSwgcHJvdG9jb2xUeXBlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHJhbnNwb3J0VHlwZS5odHRwOgorICAgICAgcHJvdG9jb2wgPSBjcmVhdGVQcm90b2NvbCgKKyAgICAgICAgbmV3IFRDbGllbnRIdHRwVHJhbnNwb3J0KHNvY2tldCwgaG9zdCwgIi9zZXJ2aWNlIiksIHByb3RvY29sVHlwZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRyYW5zcG9ydFR5cGUucmF3OgorICAgICAgcHJvdG9jb2wgPSBjcmVhdGVQcm90b2NvbChzb2NrZXQsIHByb3RvY29sVHlwZSk7CisgICAgICBicmVhazsKKyAgfQorCisgIGF1dG8gY2xpZW50ID0gdENsaWVudCFUaHJpZnRUZXN0KHByb3RvY29sKTsKKworICB1bG9uZyB0aW1lX21pbjsKKyAgdWxvbmcgdGltZV9tYXg7CisgIHVsb25nIHRpbWVfdG90OworCisgIFN0b3BXYXRjaCBzdzsKKyAgZm9yZWFjaCh0ZXN0OyAwIC4uIG51bVRlc3RzKSB7CisgICAgc3cuc3RhcnQoKTsKKworICAgIHByb3RvY29sLnRyYW5zcG9ydC5vcGVuKCk7CisKKyAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCJUZXN0ICMlcywgY29ubmVjdCAlczolcyIsIHRlc3QgKyAxLCBob3N0LCBwb3J0KTsKKworICAgIGlmICh0cmFjZSkgd3JpdGUoInRlc3RWb2lkKCkiKTsKKyAgICBjbGllbnQudGVzdFZvaWQoKTsKKyAgICBpZiAodHJhY2UpIHdyaXRlbG4oIiA9IHZvaWQiKTsKKworICAgIGlmICh0cmFjZSkgd3JpdGUoInRlc3RTdHJpbmcoXCJUZXN0XCIpIik7CisgICAgc3RyaW5nIHMgPSBjbGllbnQudGVzdFN0cmluZygiVGVzdCIpOworICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9IFwiJXNcIiIsIHMpOworICAgIGVuZm9yY2UocyA9PSAiVGVzdCIpOworCisgICAgaWYgKHRyYWNlKSB3cml0ZSgidGVzdEJ5dGUoMSkiKTsKKyAgICBieXRlIHU4ID0gY2xpZW50LnRlc3RCeXRlKDEpOworICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9ICVzIiwgdTgpOworICAgIGVuZm9yY2UodTggPT0gMSk7CisKKyAgICBpZiAodHJhY2UpIHdyaXRlKCJ0ZXN0STMyKC0xKSIpOworICAgIGludCBpMzIgPSBjbGllbnQudGVzdEkzMigtMSk7CisgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0gJXMiLCBpMzIpOworICAgIGVuZm9yY2UoaTMyID09IC0xKTsKKworICAgIGlmICh0cmFjZSkgd3JpdGUoInRlc3RJNjQoLTM0MzU5NzM4MzY4KSIpOworICAgIGxvbmcgaTY0ID0gY2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4TCk7CisgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0gJXMiLCBpNjQpOworICAgIGVuZm9yY2UoaTY0ID09IC0zNDM1OTczODM2OEwpOworCisgICAgaWYgKHRyYWNlKSB3cml0ZSgidGVzdERvdWJsZSgtNS4yMDk4NTIzKSIpOworICAgIGRvdWJsZSBkdWIgPSBjbGllbnQudGVzdERvdWJsZSgtNS4yMDk4NTIzKTsKKyAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSAlcyIsIGR1Yik7CisgICAgZW5mb3JjZShkdWIgPT0gLTUuMjA5ODUyMyk7CisKKwkvLyBUT0RPOiBhZGQgdGVzdEJpbmFyeSgpIGNhbGwKKwkKKyAgICBYdHJ1Y3Qgb3V0MTsKKyAgICBvdXQxLnN0cmluZ190aGluZyA9ICJaZXJvIjsKKyAgICBvdXQxLmJ5dGVfdGhpbmcgPSAxOworICAgIG91dDEuaTMyX3RoaW5nID0gLTM7CisgICAgb3V0MS5pNjRfdGhpbmcgPSAtNTsKKyAgICBpZiAodHJhY2UpIHdyaXRlZigidGVzdFN0cnVjdCglcykiLCBvdXQxKTsKKyAgICBhdXRvIGluMSA9IGNsaWVudC50ZXN0U3RydWN0KG91dDEpOworICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9ICVzIiwgaW4xKTsKKyAgICBlbmZvcmNlKGluMSA9PSBvdXQxKTsKKworICAgIGlmICh0cmFjZSkgd3JpdGUoInRlc3ROZXN0KHsxLCB7XCJaZXJvXCIsIDEsIC0zLCAtNX0pLCA1fSIpOworICAgIFh0cnVjdDIgb3V0MjsKKyAgICBvdXQyLmJ5dGVfdGhpbmcgPSAxOworICAgIG91dDIuc3RydWN0X3RoaW5nID0gb3V0MTsKKyAgICBvdXQyLmkzMl90aGluZyA9IDU7CisgICAgYXV0byBpbjIgPSBjbGllbnQudGVzdE5lc3Qob3V0Mik7CisgICAgaW4xID0gaW4yLnN0cnVjdF90aGluZzsKKyAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSB7JXMsIHtcIiVzXCIsICVzLCAlcywgJXN9LCAlc30iLCBpbjIuYnl0ZV90aGluZywKKyAgICAgIGluMS5zdHJpbmdfdGhpbmcsIGluMS5ieXRlX3RoaW5nLCBpbjEuaTMyX3RoaW5nLCBpbjEuaTY0X3RoaW5nLAorICAgICAgaW4yLmkzMl90aGluZyk7CisgICAgZW5mb3JjZShpbjIgPT0gb3V0Mik7CisKKyAgICBpbnRbaW50XSBtYXBvdXQ7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICAgIG1hcG91dFtpXSA9IGkgLSAxMDsKKyAgICB9CisgICAgaWYgKHRyYWNlKSB3cml0ZWYoInRlc3RNYXAoeyVzfSkiLCBtYXBvdXQpOworICAgIGF1dG8gbWFwaW4gPSBjbGllbnQudGVzdE1hcChtYXBvdXQpOworICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9IHslc30iLCBtYXBpbik7CisgICAgZW5mb3JjZShtYXBpbiA9PSBtYXBvdXQpOworCisgICAgYXV0byBzZXRvdXQgPSBuZXcgSGFzaFNldCFpbnQ7CisgICAgZm9yIChpbnQgaSA9IC0yOyBpIDwgMzsgKytpKSB7CisgICAgICBzZXRvdXQgfj0gaTsKKyAgICB9CisgICAgaWYgKHRyYWNlKSB3cml0ZWYoInRlc3RTZXQoJXMpIiwgc2V0b3V0KTsKKyAgICBhdXRvIHNldGluID0gY2xpZW50LnRlc3RTZXQoc2V0b3V0KTsKKyAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSAlcyIsIHNldGluKTsKKyAgICBlbmZvcmNlKHNldGluID09IHNldG91dCk7CisKKyAgICBpbnRbXSBsaXN0b3V0OworICAgIGZvciAoaW50IGkgPSAtMjsgaSA8IDM7ICsraSkgeworICAgICAgbGlzdG91dCB+PSBpOworICAgIH0KKyAgICBpZiAodHJhY2UpIHdyaXRlZigidGVzdExpc3QoJXMpIiwgbGlzdG91dCk7CisgICAgYXV0byBsaXN0aW4gPSBjbGllbnQudGVzdExpc3QobGlzdG91dCk7CisgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0gJXMiLCBsaXN0aW4pOworICAgIGVuZm9yY2UobGlzdGluID09IGxpc3RvdXQpOworCisgICAgeworICAgICAgaWYgKHRyYWNlKSB3cml0ZSgidGVzdEVudW0oT05FKSIpOworICAgICAgYXV0byByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5PTkUpOworICAgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0gJXMiLCByZXQpOworICAgICAgZW5mb3JjZShyZXQgPT0gTnVtYmVyei5PTkUpOworCisgICAgICBpZiAodHJhY2UpIHdyaXRlKCJ0ZXN0RW51bShUV08pIik7CisgICAgICByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5UV08pOworICAgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0gJXMiLCByZXQpOworICAgICAgZW5mb3JjZShyZXQgPT0gTnVtYmVyei5UV08pOworCisgICAgICBpZiAodHJhY2UpIHdyaXRlKCJ0ZXN0RW51bShUSFJFRSkiKTsKKyAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LlRIUkVFKTsKKyAgICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9ICVzIiwgcmV0KTsKKyAgICAgIGVuZm9yY2UocmV0ID09IE51bWJlcnouVEhSRUUpOworCisgICAgICBpZiAodHJhY2UpIHdyaXRlKCJ0ZXN0RW51bShGSVZFKSIpOworICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouRklWRSk7CisgICAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSAlcyIsIHJldCk7CisgICAgICBlbmZvcmNlKHJldCA9PSBOdW1iZXJ6LkZJVkUpOworCisgICAgICBpZiAodHJhY2UpIHdyaXRlKCJ0ZXN0RW51bShFSUdIVCkiKTsKKyAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LkVJR0hUKTsKKyAgICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9ICVzIiwgcmV0KTsKKyAgICAgIGVuZm9yY2UocmV0ID09IE51bWJlcnouRUlHSFQpOworICAgIH0KKworICAgIGlmICh0cmFjZSkgd3JpdGUoInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiKTsKKyAgICBVc2VySWQgdWlkID0gY2xpZW50LnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyM0wpOworICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9ICVzIiwgdWlkKTsKKyAgICBlbmZvcmNlKHVpZCA9PSAzMDk4NTgyMzUwODI1MjNMKTsKKworICAgIGlmICh0cmFjZSkgd3JpdGUoInRlc3RNYXBNYXAoMSkiKTsKKyAgICBhdXRvIG1tID0gY2xpZW50LnRlc3RNYXBNYXAoMSk7CisgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0geyVzfSIsIG1tKTsKKyAgICAvLyBTaW1wbHkgZG9pbmcgPT0gZG9lc24ndCBzZWVtIHRvIHdvcmsgZm9yIG5lc3RlZCBBQXMuCisgICAgZm9yZWFjaCAoa2V5LCB2YWx1ZTsgbW0pIHsKKyAgICAgIGVuZm9yY2UodGVzdE1hcE1hcFJldHVybltrZXldID09IHZhbHVlKTsKKyAgICB9CisgICAgZm9yZWFjaCAoa2V5LCB2YWx1ZTsgdGVzdE1hcE1hcFJldHVybikgeworICAgICAgZW5mb3JjZShtbVtrZXldID09IHZhbHVlKTsKKyAgICB9CisKKyAgICBJbnNhbml0eSBpbnNhbmU7CisgICAgaW5zYW5lLnVzZXJNYXBbTnVtYmVyei5GSVZFXSA9IDUwMDA7CisgICAgWHRydWN0IHRydWNrOworICAgIHRydWNrLnN0cmluZ190aGluZyA9ICJUcnVjayI7CisgICAgdHJ1Y2suYnl0ZV90aGluZyA9IDg7CisgICAgdHJ1Y2suaTMyX3RoaW5nID0gODsKKyAgICB0cnVjay5pNjRfdGhpbmcgPSA4OworICAgIGluc2FuZS54dHJ1Y3RzIH49IHRydWNrOworICAgIGlmICh0cmFjZSkgd3JpdGUoInRlc3RJbnNhbml0eSgpIik7CisgICAgYXV0byB3aG9hID0gY2xpZW50LnRlc3RJbnNhbml0eShpbnNhbmUpOworICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9ICVzIiwgd2hvYSk7CisKKyAgICAvLyBDb21tZW50ZWQgZm9yIG5vdywgdGhpcyBpcyBjdW1iZXJzb21lIHRvIHdyaXRlIHdpdGhvdXQgb3BFcXVhbCBnZXR0aW5nCisgICAgLy8gY2FsbGVkIG9uIEFBIGNvbXBhcmlzb24uCisgICAgLy8gZW5mb3JjZSh3aG9hID09IHRlc3RJbnNhbml0eVJldHVybik7CisKKyAgICB7CisgICAgICB0cnkgeworICAgICAgICBpZiAodHJhY2UpIHdyaXRlKCJjbGllbnQudGVzdEV4Y2VwdGlvbihcIlhjZXB0aW9uXCIpID0+Iik7CisgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpOworICAgICAgICBpZiAodHJhY2UpIHdyaXRlbG4oIiAgdm9pZFxuRkFJTFVSRSIpOworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ0ZXN0RXhjZXB0aW9uIGZhaWxlZC4iKTsKKyAgICAgIH0gY2F0Y2ggKFhjZXB0aW9uIGUpIHsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiICB7JXMsIFwiJXNcIn0iLCBlLmVycm9yQ29kZSwgZS5tZXNzYWdlKTsKKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZSgiY2xpZW50LnRlc3RFeGNlcHRpb24oXCJURXhjZXB0aW9uXCIpID0+Iik7CisgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpOworICAgICAgICBpZiAodHJhY2UpIHdyaXRlbG4oIiAgdm9pZFxuRkFJTFVSRSIpOworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ0ZXN0RXhjZXB0aW9uIGZhaWxlZC4iKTsKKyAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgeworICAgICAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgIHslc30iLCBlLm1zZyk7CisgICAgICB9CisKKyAgICAgIHRyeSB7CisgICAgICAgIGlmICh0cmFjZSkgd3JpdGUoImNsaWVudC50ZXN0RXhjZXB0aW9uKFwic3VjY2Vzc1wiKSA9PiIpOworICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigic3VjY2VzcyIpOworICAgICAgICBpZiAodHJhY2UpIHdyaXRlbG4oIiAgdm9pZCIpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWxuKCIgIGV4Y2VwdGlvblxuRkFJTFVSRSIpOworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ0ZXN0RXhjZXB0aW9uIGZhaWxlZC4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICB0cnkgeworICAgICAgICBpZiAodHJhY2UpIHdyaXRlKCJjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb25cIiwgXCJ0ZXN0IDFcIikgPT4iKTsKKyAgICAgICAgYXV0byByZXN1bHQgPSBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbiIsICJ0ZXN0IDEiKTsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWxuKCIgIHJlc3VsdFxuRkFJTFVSRSIpOworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ0ZXN0TXVsdGlFeGNlcHRpb24gZmFpbGVkLiIpOworICAgICAgfSBjYXRjaCAoWGNlcHRpb24gZSkgeworICAgICAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgIHslcywgXCIlc1wifSIsIGUuZXJyb3JDb2RlLCBlLm1lc3NhZ2UpOworICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICBpZiAodHJhY2UpIHdyaXRlKCJjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb24yXCIsIFwidGVzdCAyXCIpID0+Iik7CisgICAgICAgIGF1dG8gcmVzdWx0ID0gY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbigiWGNlcHRpb24yIiwgInRlc3QgMiIpOworICAgICAgICBpZiAodHJhY2UpIHdyaXRlbG4oIiAgcmVzdWx0XG5GQUlMVVJFIik7CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInRlc3RNdWx0aUV4Y2VwdGlvbiBmYWlsZWQuIik7CisgICAgICB9IGNhdGNoIChYY2VwdGlvbjIgZSkgeworICAgICAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgIHslcywge1wiJXNcIn19IiwKKyAgICAgICAgICBlLmVycm9yQ29kZSwgZS5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nKTsKKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWYoImNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJzdWNjZXNzXCIsIFwidGVzdCAzXCIpID0+Iik7CisgICAgICAgIGF1dG8gcmVzdWx0ID0gY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbigic3VjY2VzcyIsICJ0ZXN0IDMiKTsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiICB7e1wiJXNcIn19IiwgcmVzdWx0LnN0cmluZ190aGluZyk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICBpZiAodHJhY2UpIHdyaXRlbG4oIiAgZXhjZXB0aW9uXG5GQUlMVVJFIik7CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInRlc3RNdWx0aUV4Y2VwdGlvbiBmYWlsZWQuIik7CisgICAgICB9CisgICAgfQorCisgICAgLy8gRG8gbm90IHJ1biBvbmV3YXkgdGVzdCB3aGVuIGRvaW5nIG11bHRpcGxlIGl0ZXJhdGlvbnMsIGFzIGl0IGJsb2NrcyB0aGUKKyAgICAvLyBzZXJ2ZXIgZm9yIHRocmVlIHNlY29uZHMuCisgICAgaWYgKG51bVRlc3RzID09IDEpIHsKKyAgICAgIGlmICh0cmFjZSkgd3JpdGVmKCJjbGllbnQudGVzdE9uZXdheSgzKSA9PiIpOworICAgICAgYXV0byBvbmV3YXlXYXRjaCA9IFN0b3BXYXRjaChBdXRvU3RhcnQueWVzKTsKKyAgICAgIGNsaWVudC50ZXN0T25ld2F5KDMpOworICAgICAgb25ld2F5V2F0Y2guc3RvcCgpOworICAgICAgaWYgKG9uZXdheVdhdGNoLnBlZWsoKS5tc2VjcyA+IDIwMCkgeworICAgICAgICBpZiAodHJhY2UpIHsKKyAgICAgICAgICB3cml0ZWZsbigiICBGQUlMVVJFIC0gdG9vayAlcyBtcyIsIG9uZXdheVdhdGNoLnBlZWsoKS51c2VjcyAvIDEwMDAuMCk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidGVzdE9uZXdheSBmYWlsZWQuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAodHJhY2UpIHsKKyAgICAgICAgICB3cml0ZWZsbigiICBzdWNjZXNzIC0gdG9vayAlcyBtcyIsIG9uZXdheVdhdGNoLnBlZWsoKS51c2VjcyAvIDEwMDAuMCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gUmVkbyBhIHNpbXBsZSB0ZXN0IGFmdGVyIHRoZSBvbmV3YXkgdG8gbWFrZSBzdXJlIHdlIGFyZW4ndCAib2ZmIGJ5CisgICAgICAvLyBvbmUiLCB3aGljaCB3b3VsZCBiZSB0aGUgY2FzZSBpZiB0aGUgc2VydmVyIHRyZWF0ZWQgb25ld2F5IG1ldGhvZHMKKyAgICAgIC8vIGxpa2Ugbm9ybWFsIG9uZXMuCisgICAgICBpZiAodHJhY2UpIHdyaXRlKCJyZS10ZXN0IHRlc3RJMzIoLTEpIik7CisgICAgICBpMzIgPSBjbGllbnQudGVzdEkzMigtMSk7CisgICAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSAlcyIsIGkzMik7CisgICAgfQorCisgICAgLy8gVGltZSBtZXRlcmluZy4KKyAgICBzdy5zdG9wKCk7CisKKyAgICBpbW11dGFibGUgdG90ID0gc3cucGVlaygpLnVzZWNzOworICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIlRvdGFsIHRpbWU6ICVzIHVzXG4iLCB0b3QpOworCisgICAgdGltZV90b3QgKz0gdG90OworICAgIGlmICh0aW1lX21pbiA9PSAwIHx8IHRvdCA8IHRpbWVfbWluKSB7CisgICAgICB0aW1lX21pbiA9IHRvdDsKKyAgICB9CisgICAgaWYgKHRvdCA+IHRpbWVfbWF4KSB7CisgICAgICB0aW1lX21heCA9IHRvdDsKKyAgICB9CisgICAgcHJvdG9jb2wudHJhbnNwb3J0LmNsb3NlKCk7CisKKyAgICBzdy5yZXNldCgpOworICB9CisKKyAgd3JpdGVsbigiQWxsIHRlc3RzIGRvbmUuIik7CisKKyAgaWYgKG51bVRlc3RzID4gMSkgeworICAgIGF1dG8gdGltZV9hdmcgPSB0aW1lX3RvdCAvIG51bVRlc3RzOworICAgIHdyaXRlZmxuKCJNaW4gdGltZTogJXMgdXMiLCB0aW1lX21pbik7CisgICAgd3JpdGVmbG4oIk1heCB0aW1lOiAlcyB1cyIsIHRpbWVfbWF4KTsKKyAgICB3cml0ZWZsbigiQXZnIHRpbWU6ICVzIHVzIiwgdGltZV9hdmcpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L3RocmlmdF90ZXN0X2NvbW1vbi5kIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9jb21tb24uZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2E1Njg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9jb21tb24uZApAQCAtMCwwICsxLDkyIEBACittb2R1bGUgdGhyaWZ0X3Rlc3RfY29tbW9uOworCitpbXBvcnQgc3RkLnN0ZGlvOworaW1wb3J0IHRocmlmdC50ZXN0LlRocmlmdFRlc3RfdHlwZXM7CisKK2VudW0gUHJvdG9jb2xUeXBlIHsKKyAgYmluYXJ5LAorICBjb21wYWN0LAorICBqc29uCit9CisKK3ZvaWQgd3JpdGVJbnNhbml0eVJldHVybihpbiBJbnNhbml0eVtOdW1iZXJ6XVtVc2VySWRdIGluc2FuZSkgeworICB3cml0ZSgieyIpOworICBmb3JlYWNoKGtleTEsIHZhbHVlMTsgaW5zYW5lKSB7CisgICAgd3JpdGVmKCIlcyA9PiB7Iiwga2V5MSk7CisgICAgZm9yZWFjaChrZXkyLCB2YWx1ZTI7IHZhbHVlMSkgeworICAgICAgd3JpdGVmKCIlcyA9PiB7Iiwga2V5Mik7CisgICAgICB3cml0ZSgieyIpOworICAgICAgZm9yZWFjaChrZXkzLCB2YWx1ZTM7IHZhbHVlMi51c2VyTWFwKSB7CisgICAgICAgIHdyaXRlZigiJXMgPT4gJXMsICIsIGtleTMsIHZhbHVlMyk7CisgICAgICB9CisgICAgICB3cml0ZSgifSwgIik7CisKKyAgICAgIHdyaXRlKCJ7Iik7CisgICAgICBmb3JlYWNoICh4OyB2YWx1ZTIueHRydWN0cykgeworICAgICAgICB3cml0ZWYoIntcIiVzXCIsICVzLCAlcywgJXN9LCAiLAorICAgICAgICAgIHguc3RyaW5nX3RoaW5nLCB4LmJ5dGVfdGhpbmcsIHguaTMyX3RoaW5nLCB4Lmk2NF90aGluZyk7CisgICAgICB9CisgICAgICB3cml0ZSgifSIpOworCisgICAgICB3cml0ZSgifSwgIik7CisgICAgfQorICAgIHdyaXRlKCJ9LCAiKTsKKyAgfQorICB3cml0ZSgifSIpOworfQorCitJbnNhbml0eVtOdW1iZXJ6XVtVc2VySWRdIHRlc3RJbnNhbml0eVJldHVybjsKK2ludFtpbnRdW2ludF0gdGVzdE1hcE1hcFJldHVybjsKKworc3RhdGljIHRoaXMoKSB7CisgIHRlc3RJbnNhbml0eVJldHVybiA9IHsKKyAgICBJbnNhbml0eVtOdW1iZXJ6XVtVc2VySWRdIGluc2FuZTsKKworICAgIFh0cnVjdCBoZWxsbzsKKyAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKKyAgICBoZWxsby5ieXRlX3RoaW5nID0gMjsKKyAgICBoZWxsby5pMzJfdGhpbmcgPSAyOworICAgIGhlbGxvLmk2NF90aGluZyA9IDI7CisKKyAgICBYdHJ1Y3QgZ29vZGJ5ZTsKKyAgICBnb29kYnllLnN0cmluZ190aGluZyA9ICJHb29kYnllNCI7CisgICAgZ29vZGJ5ZS5ieXRlX3RoaW5nID0gNDsKKyAgICBnb29kYnllLmkzMl90aGluZyA9IDQ7CisgICAgZ29vZGJ5ZS5pNjRfdGhpbmcgPSA0OworCisgICAgSW5zYW5pdHkgY3Jhenk7CisgICAgY3JhenkudXNlck1hcFtOdW1iZXJ6LkVJR0hUXSA9IDg7CisgICAgY3JhenkueHRydWN0cyB+PSBnb29kYnllOworCisgICAgSW5zYW5pdHkgbG9vbmV5OworICAgIC8vIFRoZSBDKysgVGVzdFNlcnZlciBhbHNvIGFzc2lnbnMgdGhlc2UgdG8gY3JhenksIGJ1dCB0aGF0IGlzIHByb2JhYmx5CisgICAgLy8gYW4gb3ZlcnNpZ2h0LgorICAgIGxvb25leS51c2VyTWFwW051bWJlcnouRklWRV0gPSA1OworICAgIGxvb25leS54dHJ1Y3RzIH49IGhlbGxvOworCisgICAgSW5zYW5pdHlbTnVtYmVyel0gZmlyc3RfbWFwOworICAgIGZpcnN0X21hcFtOdW1iZXJ6LlRXT10gPSBjcmF6eTsKKyAgICBmaXJzdF9tYXBbTnVtYmVyei5USFJFRV0gPSBjcmF6eTsKKyAgICBpbnNhbmVbMV0gPSBmaXJzdF9tYXA7CisKKyAgICBJbnNhbml0eVtOdW1iZXJ6XSBzZWNvbmRfbWFwOworICAgIHNlY29uZF9tYXBbTnVtYmVyei5TSVhdID0gbG9vbmV5OworICAgIGluc2FuZVsyXSA9IHNlY29uZF9tYXA7CisgICAgcmV0dXJuIGluc2FuZTsKKyAgfSgpOworCisgIHRlc3RNYXBNYXBSZXR1cm4gPSB7CisgICAgaW50W2ludF0gcG9zOworICAgIGludFtpbnRdIG5lZzsKKworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNTsgaSsrKSB7CisgICAgICBwb3NbaV0gPSBpOworICAgICAgbmVnWy1pXSA9IC1pOworICAgIH0KKworICAgIGludFtpbnRdW2ludF0gcmVzdWx0OworICAgIHJlc3VsdFs0XSA9IHBvczsKKyAgICByZXN1bHRbLTRdID0gbmVnOworICAgIHJldHVybiByZXN1bHQ7CisgIH0oKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfcnVubmVyLnNoIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9ydW5uZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTFiZmU5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfcnVubmVyLnNoCkBAIC0wLDAgKzEsOTMgQEAKKyMhL2Jpbi9iYXNoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIFJ1bnMgdGhlIEQgVGhyaWZ0VGVzdCBjbGllbnQgYW5kIHNlcnZlcnMgZm9yIGFsbCBjb21iaW5hdGlvbnMgb2YgdHJhbnNwb3J0LAorIyBwcm90b2NvbCwgU1NMLW1vZGUgYW5kIHNlcnZlciB0eXBlLgorIyBQYXNzIC1rIHRvIGtlZXAgZ29pbmcgYWZ0ZXIgZmFpbGVkIHRlc3RzLgorCitDVVI9IiQoY2QgIiQoZGlybmFtZSAiJHtCQVNIX1NPVVJDRVswXX0iKSIgJiYgcHdkKSIKKworcHJvdG9jb2xzPSJiaW5hcnkgY29tcGFjdCBqc29uIgorIyBUT0RPOiBmaXggYW5kIGVuYWJsZSBodHRwCisjIHRyYW5zcG9ydHM9ImJ1ZmZlcmVkIGZyYW1lZCByYXcgaHR0cCIKK3RyYW5zcG9ydHM9ImJ1ZmZlcmVkIGZyYW1lZCByYXciCitzZXJ2ZXJzPSJzaW1wbGUgdGFza3Bvb2wgdGhyZWFkZWQiCitmcmFtZWRfb25seV9zZXJ2ZXJzPSJub25ibG9ja2luZyBwb29sZWROb25ibG9ja2luZyIKKworIyBEb24ndCBsZWF2ZSBhbnkgc2VydmVyIGluc3RhbmNlcyBiZWhpbmQgd2hlbiBpbnRlcnJ1cHRlZCAoZS5nLiBieSBDdHJsK0MpCisjIG9yIHRlcm1pbmF0ZWQuCit0cmFwICJraWxsICQoam9icyAtcCkgMj4vZGV2L251bGwiIElOVCBURVJNCisKK2ZvciBwcm90b2NvbCBpbiAkcHJvdG9jb2xzOyBkbworICBmb3Igc3NsIGluICIiICIgLS1zc2wiOyBkbworICAgIGZvciB0cmFuc3BvcnQgaW4gJHRyYW5zcG9ydHM7IGRvCisgICAgICBmb3Igc2VydmVyIGluICRzZXJ2ZXJzICRmcmFtZWRfb25seV9zZXJ2ZXJzOyBkbworICAgICAgICBjYXNlICRmcmFtZWRfb25seV9zZXJ2ZXJzIGluCisgICAgICAgICAgKiRzZXJ2ZXIqKSBpZiBbICR0cmFuc3BvcnQgIT0gImZyYW1lZCIgXSB8fCBbICRzc2wgIT0gIiIgXTsgdGhlbiBjb250aW51ZTsgZmk7OworICAgICAgICBlc2FjCisKKyAgICAgICAgYXJncz0iLS10cmFuc3BvcnQ9JHRyYW5zcG9ydCAtLXByb3RvY29sPSRwcm90b2NvbCRzc2wiCisgICAgICAgICR7Q1VSfS90aHJpZnRfdGVzdF9zZXJ2ZXIgJGFyZ3MgLS1zZXJ2ZXItdHlwZT0kc2VydmVyID4gL2Rldi9udWxsICYKKyAgICAgICAgc2VydmVyX3BpZD0kIQorCisgICAgICAgICMgR2l2ZSB0aGUgc2VydmVyIHNvbWUgdGltZSB0byBnZXQgdXAgYW5kIGNoZWNrIGlmIGl0IHJ1bnMgKHllcywgdGhpcworICAgICAgICAjIGlzIGEgaHVnZSBrbHVkZ2UsIHNob3VsZCBhZGQgYSBjb25uZWN0IHRpbWVvdXQgdG8gdGVzdCBjbGllbnQpLgorICAgICAgICBjbGllbnRfcmM9LTEKKyAgICAgICAgaWYgWyAiJHNlcnZlciIgPSAidGFza3Bvb2wiIF07IHRoZW4KKyAgICAgICAgICBzbGVlcCAwLjUKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNsZWVwIDAuMDIKKyAgICAgICAgZmkKKyAgICAgICAga2lsbCAtMCAkc2VydmVyX3BpZCAyPi9kZXYvbnVsbAorICAgICAgICBpZiBbICQ/IC1lcSAwIF07IHRoZW4KKyAgICAgICAgICAke0NVUn0vdGhyaWZ0X3Rlc3RfY2xpZW50ICRhcmdzIC0tbnVtVGVzdHM9MTAgPiAvZGV2L251bGwKKyAgICAgICAgICBjbGllbnRfcmM9JD8KKworICAgICAgICAgICMgVGVtcG9yYXJpbHkgcmVkaXJlY3Qgc3RkZXJyIHRvIG51bGwgdG8gYXZvaWQgam9iIGNvbnRyb2wgbWVzc2FnZXMsCisgICAgICAgICAgIyByZXN0b3JlIGl0IGFmdGVyd2FyZHMuCisgICAgICAgICAgZXhlYyAzPiYyCisgICAgICAgICAgZXhlYyAyPi9kZXYvbnVsbAorICAgICAgICAgIGtpbGwgJHNlcnZlcl9waWQKKyAgICAgICAgICBleGVjIDM+JjIKKyAgICAgICAgZmkKKworICAgICAgICAjIEdldCB0aGUgc2VydmVyIGV4aXQgY29kZSAod2FpdCBzaG91bGQgaW1tZWRpYXRlbHkgcmV0dXJuKS4KKyAgICAgICAgd2FpdCAkc2VydmVyX3BpZAorICAgICAgICBzZXJ2ZXJfcmM9JD8KKworICAgICAgICBpZiBbICRjbGllbnRfcmMgLW5lIDAgLW8gJHNlcnZlcl9yYyAtZXEgMSBdOyB0aGVuCisgICAgICAgICAgZWNobyAtZSAiXG5UZXN0cyBmYWlsZWQgZm9yOiAkYXJncyAtLXNlcnZlci10eXBlPSRzZXJ2ZXIiCisgICAgICAgICAgZmFpbGVkPSJ0cnVlIgorICAgICAgICAgIGlmIFsgIiQxIiAhPSAiLWsiIF07IHRoZW4KKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgIGZpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgZWNobyAtbiAiLiIKKyAgICAgICAgZmkKKyAgICAgIGRvbmUKKyAgICBkb25lCisgIGRvbmUKK2RvbmUKKworZWNobworaWYgWyAteiAiJGZhaWxlZCIgXTsgdGhlbgorICBlY2hvICJBbGwgdGVzdHMgcGFzc2VkLiIKK2ZpCmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L3RocmlmdF90ZXN0X3NlcnZlci5kIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9zZXJ2ZXIuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTgyMjUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9zZXJ2ZXIuZApAQCAtMCwwICsxLDMzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCittb2R1bGUgdGhyaWZ0X3Rlc3Rfc2VydmVyOworCitpbXBvcnQgY29yZS5zdGRjLmVycm5vIDogZXJybm87CitpbXBvcnQgY29yZS5zdGRjLnNpZ25hbCA6IHNpZ25hbCwgc2lnZm5fdCwgU0lHSU5ULCBTSUdfREZMLCBTSUdfRVJSOworaW1wb3J0IGNvcmUudGhyZWFkIDogZHVyLCBUaHJlYWQ7CitpbXBvcnQgc3RkLmFsZ29yaXRobTsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCBzdGQuZ2V0b3B0OworaW1wb3J0IHN0ZC5wYXJhbGxlbGlzbSA6IHRvdGFsQ1BVczsKK2ltcG9ydCBzdGQuc3RyaW5nOworaW1wb3J0IHN0ZC5zdGRpbzsKK2ltcG9ydCBzdGQudHlwZXR1cGxlIDogVHlwZVR1cGxlLCBzdGF0aWNNYXA7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4ucHJvY2Vzc29yOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmNvbXBhY3Q7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmpzb247CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5iYXNlOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LnNvY2tldDsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5zc2w7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYnVmZmVyZWQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5mcmFtZWQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5odHRwOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc3NsOworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKK2ltcG9ydCB0aHJpZnQudXRpbC5oYXNoc2V0OworaW1wb3J0IHRlc3RfdXRpbHM7CisKK2ltcG9ydCB0aHJpZnRfdGVzdF9jb21tb247CitpbXBvcnQgdGhyaWZ0LnRlc3QuVGhyaWZ0VGVzdF90eXBlczsKK2ltcG9ydCB0aHJpZnQudGVzdC5UaHJpZnRUZXN0OworCitjbGFzcyBUZXN0SGFuZGxlciA6IFRocmlmdFRlc3QgeworICB0aGlzKGJvb2wgdHJhY2UpIHsKKyAgICB0cmFjZV8gPSB0cmFjZTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgdGVzdFZvaWQoKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVsbigidGVzdFZvaWQoKSIpOworICB9CisKKyAgb3ZlcnJpZGUgc3RyaW5nIHRlc3RTdHJpbmcoc3RyaW5nIHRoaW5nKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RTdHJpbmcoXCIlc1wiKSIsIHRoaW5nKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBieXRlIHRlc3RCeXRlKGJ5dGUgdGhpbmcpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdEJ5dGUoJXMpIiwgdGhpbmcpOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCisgIG92ZXJyaWRlIGludCB0ZXN0STMyKGludCB0aGluZykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0STMyKCVzKSIsIHRoaW5nKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBsb25nIHRlc3RJNjQobG9uZyB0aGluZykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0STY0KCVzKSIsIHRoaW5nKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBkb3VibGUgdGVzdERvdWJsZShkb3VibGUgdGhpbmcpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdERvdWJsZSglcykiLCB0aGluZyk7CisgICAgcmV0dXJuIHRoaW5nOworICB9CisKKyAgb3ZlcnJpZGUgc3RyaW5nIHRlc3RCaW5hcnkoc3RyaW5nIHRoaW5nKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RCaW5hcnkoXCIlc1wiKSIsIHRoaW5nKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBib29sIHRlc3RCb29sKGJvb2wgdGhpbmcpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdEJvb2woXCIlc1wiKSIsIHRoaW5nKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBYdHJ1Y3QgdGVzdFN0cnVjdChyZWYgY29uc3QoWHRydWN0KSB0aGluZykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0U3RydWN0KHtcIiVzXCIsICVzLCAlcywgJXN9KSIsCisgICAgICB0aGluZy5zdHJpbmdfdGhpbmcsIHRoaW5nLmJ5dGVfdGhpbmcsIHRoaW5nLmkzMl90aGluZywgdGhpbmcuaTY0X3RoaW5nKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBYdHJ1Y3QyIHRlc3ROZXN0KHJlZiBjb25zdChYdHJ1Y3QyKSBuZXN0KSB7CisgICAgYXV0byB0aGluZyA9IG5lc3Quc3RydWN0X3RoaW5nOworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0TmVzdCh7JXMsIHtcIiVzXCIsICVzLCAlcywgJXN9LCAlc30pIiwKKyAgICAgIG5lc3QuYnl0ZV90aGluZywgdGhpbmcuc3RyaW5nX3RoaW5nLCB0aGluZy5ieXRlX3RoaW5nLCB0aGluZy5pMzJfdGhpbmcsCisgICAgICB0aGluZy5pNjRfdGhpbmcsIG5lc3QuaTMyX3RoaW5nKTsKKyAgICByZXR1cm4gbmVzdDsKKyAgfQorCisgIG92ZXJyaWRlIGludFtpbnRdIHRlc3RNYXAoaW50W2ludF0gdGhpbmcpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdE1hcCh7JXN9KSIsIHRoaW5nKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBIYXNoU2V0IWludCB0ZXN0U2V0KEhhc2hTZXQhaW50IHRoaW5nKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RTZXQoeyVzfSkiLAorICAgICAgam9pbihtYXAhYHRvIXN0cmluZyhhKWAodGhpbmdbXSksICIsICIpKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBpbnRbXSB0ZXN0TGlzdChpbnRbXSB0aGluZykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0TGlzdCglcykiLCB0aGluZyk7CisgICAgcmV0dXJuIHRoaW5nOworICB9CisKKyAgb3ZlcnJpZGUgTnVtYmVyeiB0ZXN0RW51bShOdW1iZXJ6IHRoaW5nKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RFbnVtKCVzKSIsIHRoaW5nKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBVc2VySWQgdGVzdFR5cGVkZWYoVXNlcklkIHRoaW5nKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RUeXBlZGVmKCVzKSIsIHRoaW5nKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBzdHJpbmdbc3RyaW5nXSB0ZXN0U3RyaW5nTWFwKHN0cmluZ1tzdHJpbmddIHRoaW5nKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RTdHJpbmdNYXAoJXMpIiwgdGhpbmcpOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCisgIG92ZXJyaWRlIGludFtpbnRdW2ludF0gdGVzdE1hcE1hcChpbnQgaGVsbG8pIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdE1hcE1hcCglcykiLCBoZWxsbyk7CisgICAgcmV0dXJuIHRlc3RNYXBNYXBSZXR1cm47CisgIH0KKworICBvdmVycmlkZSBJbnNhbml0eVtOdW1iZXJ6XVtVc2VySWRdIHRlc3RJbnNhbml0eShyZWYgY29uc3QoSW5zYW5pdHkpIGFyZ3VtZW50KSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVsbigidGVzdEluc2FuaXR5KCkiKTsKKyAgICBJbnNhbml0eVtOdW1iZXJ6XVtVc2VySWRdIHJldDsKKyAgICBJbnNhbml0eVtOdW1iZXJ6XSBtMTsKKyAgICBJbnNhbml0eVtOdW1iZXJ6XSBtMjsKKyAgICBJbnNhbml0eSB0bXA7CisgICAgdG1wID0gY2FzdChJbnNhbml0eSlhcmd1bWVudDsKKyAgICBtMVtOdW1iZXJ6LlRXT10gPSB0bXA7CisgICAgbTFbTnVtYmVyei5USFJFRV0gPSB0bXA7CisgICAgbTJbTnVtYmVyei5TSVhdID0gSW5zYW5pdHkoKTsKKyAgICByZXRbMV0gPSBtMTsKKyAgICByZXRbMl0gPSBtMjsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgb3ZlcnJpZGUgWHRydWN0IHRlc3RNdWx0aShieXRlIGFyZzAsIGludCBhcmcxLCBsb25nIGFyZzIsIHN0cmluZ1tzaG9ydF0gYXJnMywKKyAgICBOdW1iZXJ6IGFyZzQsIFVzZXJJZCBhcmc1KQorICB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVsbigidGVzdE11bHRpKCkiKTsKKyAgICByZXR1cm4gWHRydWN0KCJIZWxsbzIiLCBhcmcwLCBhcmcxLCBhcmcyKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgdGVzdEV4Y2VwdGlvbihzdHJpbmcgYXJnKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RFeGNlcHRpb24oJXMpIiwgYXJnKTsKKyAgICBpZiAoYXJnID09ICJYY2VwdGlvbiIpIHsKKyAgICAgIGF1dG8gZSA9IG5ldyBYY2VwdGlvbigpOworICAgICAgZS5lcnJvckNvZGUgPSAxMDAxOworICAgICAgZS5tZXNzYWdlID0gYXJnOworICAgICAgdGhyb3cgZTsKKyAgICB9IGVsc2UgaWYgKGFyZyA9PSAiVEV4Y2VwdGlvbiIpIHsKKyAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCk7CisgICAgfSBlbHNlIGlmIChhcmcgPT0gIkFwcGxpY2F0aW9uRXhjZXB0aW9uIikgeworICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oKTsKKyAgICB9CisgIH0KKworICBvdmVycmlkZSBYdHJ1Y3QgdGVzdE11bHRpRXhjZXB0aW9uKHN0cmluZyBhcmcwLCBzdHJpbmcgYXJnMSkgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0TXVsdGlFeGNlcHRpb24oJXMsICVzKSIsIGFyZzAsIGFyZzEpOworCisgICAgaWYgKGFyZzAgPT0gIlhjZXB0aW9uIikgeworICAgICAgYXV0byBlID0gbmV3IFhjZXB0aW9uKCk7CisgICAgICBlLmVycm9yQ29kZSA9IDEwMDE7CisgICAgICBlLm1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiI7CisgICAgICB0aHJvdyBlOworICAgIH0gZWxzZSBpZiAoYXJnMCA9PSAiWGNlcHRpb24yIikgeworICAgICAgYXV0byBlID0gbmV3IFhjZXB0aW9uMigpOworICAgICAgZS5lcnJvckNvZGUgPSAyMDAyOworICAgICAgZS5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIjsKKyAgICAgIHRocm93IGU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBYdHJ1Y3QoYXJnMSk7CisgICAgfQorICB9CisKKyAgb3ZlcnJpZGUgdm9pZCB0ZXN0T25ld2F5KGludCBzbGVlcEZvcikgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0T25ld2F5KCVzKTogU2xlZXBpbmcuLi4iLCBzbGVlcEZvcik7CisgICAgVGhyZWFkLnNsZWVwKGR1ciEic2Vjb25kcyIoc2xlZXBGb3IpKTsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdE9uZXdheSglcyk6IGRvbmUgc2xlZXBpbmchIiwgc2xlZXBGb3IpOworICB9CisKK3ByaXZhdGU6CisgIGJvb2wgdHJhY2VfOworfQorCitzaGFyZWQoYm9vbCkgZ1NodXRkb3duID0gZmFsc2U7CisKK25vdGhyb3cgQG5vZ2MgZXh0ZXJuKEMpIHZvaWQgaGFuZGxlU2lnbmFsKGludCBzaWcpIHsKKyAgZ1NodXRkb3duID0gdHJ1ZTsKK30KKworLy8gUnVucyBhIHRocmVhZCB0aGF0IHdhaXRzIGZvciBzaHV0ZG93biB0byBiZQorLy8gc2lnbmFsZWQgYW5kIHRoZW4gdHJpZ2dlcnMgY2FuY2VsbGF0aW9uLAorLy8gY2F1c2luZyB0aGUgc2VydmVyIHRvIHN0b3AuICBXaGlsZSB3ZSBjb3VsZAorLy8gdXNlIGEgc2lnbmFsZmQgZm9yIHRoaXMgcHVycG9zZSwgd2UgYXJlIGluc3RlYWQKKy8vIG9wdGluZyBmb3IgYSBidXN5IHdhaXRpbmcgc2NoZW1lIGZvciBtYXhpbXVtCisvLyBwb3J0YWJpbGl0eSBzaW5jZSBzaWduYWxmZCBpcyBhIGxpbnV4IHRoaW5nLgorCitjbGFzcyBTaHV0ZG93blRocmVhZCA6IFRocmVhZCB7CisgIHRoaXMoVENhbmNlbGxhdGlvbk9yaWdpbiBjYW5jZWxsYXRpb24pIHsKKyAgICBjYW5jZWxsYXRpb25fID0gY2FuY2VsbGF0aW9uOworICAgIHN1cGVyKCZydW4pOworICB9CisgIAorcHJpdmF0ZToKKyAgdm9pZCBydW4oKSB7CisgICAgd2hpbGUgKCFnU2h1dGRvd24pIHsKKyAgICAgIFRocmVhZC5zbGVlcChkdXIhKCJtc2VjcyIpKDI1KSk7CisgICAgfQorICAgIGNhbmNlbGxhdGlvbl8udHJpZ2dlcigpOworICB9CisgIAorICBUQ2FuY2VsbGF0aW9uT3JpZ2luIGNhbmNlbGxhdGlvbl87Cit9CisKK3ZvaWQgbWFpbihzdHJpbmdbXSBhcmdzKSB7CisgIHVzaG9ydCBwb3J0ID0gOTA5MDsKKyAgU2VydmVyVHlwZSBzZXJ2ZXJUeXBlOworICBQcm90b2NvbFR5cGUgcHJvdG9jb2xUeXBlOworICBzaXplX3QgbnVtSU9UaHJlYWRzID0gMTsKKyAgVHJhbnNwb3J0VHlwZSB0cmFuc3BvcnRUeXBlOworICBib29sIHNzbCA9IGZhbHNlOworICBib29sIHRyYWNlID0gdHJ1ZTsKKyAgc2l6ZV90IHRhc2tQb29sU2l6ZSA9IHRvdGFsQ1BVczsKKworICBnZXRvcHQoYXJncywgInBvcnQiLCAmcG9ydCwgInByb3RvY29sIiwgJnByb3RvY29sVHlwZSwgInNlcnZlci10eXBlIiwKKyAgICAmc2VydmVyVHlwZSwgInNzbCIsICZzc2wsICJudW0taW8tdGhyZWFkcyIsICZudW1JT1RocmVhZHMsCisgICAgInRhc2stcG9vbC1zaXplIiwgJnRhc2tQb29sU2l6ZSwgInRyYWNlIiwgJnRyYWNlLAorICAgICJ0cmFuc3BvcnQiLCAmdHJhbnNwb3J0VHlwZSk7CisKKyAgaWYgKHNlcnZlclR5cGUgPT0gU2VydmVyVHlwZS5ub25ibG9ja2luZyB8fAorICAgIHNlcnZlclR5cGUgPT0gU2VydmVyVHlwZS5wb29sZWROb25ibG9ja2luZworICApIHsKKyAgICBlbmZvcmNlKHRyYW5zcG9ydFR5cGUgPT0gVHJhbnNwb3J0VHlwZS5mcmFtZWQsCisgICAgICAiTmVlZCB0byB1c2UgZnJhbWVkIHRyYW5zcG9ydCB3aXRoIG5vbi1ibG9ja2luZyBzZXJ2ZXIuIik7CisgICAgZW5mb3JjZSghc3NsLCAiVGhlIG5vbi1ibG9ja2luZyBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBTU0wgeWV0LiIpOworCisgICAgLy8gRG9uJ3Qgd3JhcCB0aGUgY29udGVudHMgaW50byBhbm90aGVyIGxheWVyIG9mIGZyYW1pbmcuCisgICAgdHJhbnNwb3J0VHlwZSA9IFRyYW5zcG9ydFR5cGUucmF3OworICB9CisKKyAgdmVyc2lvbiAoVGhyaWZ0VGVzdFRlbXBsYXRlcykgeworICAgIC8vIE9ubHkgZXhlcmNpc2UgdGhlIHNwZWNpYWxpemVkIHRlbXBsYXRlIGNvZGUgcGF0aHMgaWYgZXhwbGljaXRseSBlbmFibGVkCisgICAgLy8gdG8gcmVkdWNlIG1lbW9yeSBjb25zdW1wdGlvbiBvbiByZWd1bGFyIHRlc3Qgc3VpdGUgcnVucyDigJMgdGhlcmUgc2hvdWxkCisgICAgLy8gbm90IGJlIG11Y2ggdGhhdCBjYW4gZ28gd3Jvbmcgd2l0aCB0aGF0IHNwZWNpZmljYWxseSBhbnl3YXkuCisgICAgYWxpYXMgVHlwZVR1cGxlIShUQnVmZmVyZWRUcmFuc3BvcnQsIFRGcmFtZWRUcmFuc3BvcnQsIFRTZXJ2ZXJIdHRwVHJhbnNwb3J0KQorICAgICAgQXZhaWxhYmxlVHJhbnNwb3J0czsKKyAgICBhbGlhcyBUeXBlVHVwbGUhKAorICAgICAgc3RhdGljTWFwIShUQmluYXJ5UHJvdG9jb2wsIEF2YWlsYWJsZVRyYW5zcG9ydHMpLAorICAgICAgc3RhdGljTWFwIShUQ29tcGFjdFByb3RvY29sLCBBdmFpbGFibGVUcmFuc3BvcnRzKQorICAgICkgQXZhaWxhYmxlUHJvdG9jb2xzOworICB9IGVsc2UgeworICAgIGFsaWFzIFR5cGVUdXBsZSEoKSBBdmFpbGFibGVUcmFuc3BvcnRzOworICAgIGFsaWFzIFR5cGVUdXBsZSEoKSBBdmFpbGFibGVQcm90b2NvbHM7CisgIH0KKworICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeTsKKyAgZmluYWwgc3dpdGNoIChwcm90b2NvbFR5cGUpIHsKKyAgICBjYXNlIFByb3RvY29sVHlwZS5iaW5hcnk6CisgICAgICBwcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSFBdmFpbGFibGVUcmFuc3BvcnRzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQcm90b2NvbFR5cGUuY29tcGFjdDoKKyAgICAgIHByb3RvY29sRmFjdG9yeSA9IG5ldyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSFBdmFpbGFibGVUcmFuc3BvcnRzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQcm90b2NvbFR5cGUuanNvbjoKKyAgICAgIHByb3RvY29sRmFjdG9yeSA9IG5ldyBUSnNvblByb3RvY29sRmFjdG9yeSFBdmFpbGFibGVUcmFuc3BvcnRzOworICAgICAgYnJlYWs7CisgIH0KKworICBhdXRvIHByb2Nlc3NvciA9IG5ldyBUU2VydmljZVByb2Nlc3NvciEoVGhyaWZ0VGVzdCwgQXZhaWxhYmxlUHJvdG9jb2xzKSgKKyAgICBuZXcgVGVzdEhhbmRsZXIodHJhY2UpKTsKKworICBUU2VydmVyU29ja2V0IHNlcnZlclNvY2tldDsKKyAgaWYgKHNzbCkgeworICAgIGF1dG8gc3NsQ29udGV4dCA9IG5ldyBUU1NMQ29udGV4dCgpOworICAgIHNzbENvbnRleHQuc2VydmVyU2lkZSA9IHRydWU7CisgICAgc3NsQ29udGV4dC5sb2FkQ2VydGlmaWNhdGUoIi4uLy4uLy4uL3Rlc3Qva2V5cy9zZXJ2ZXIuY3J0Iik7CisgICAgc3NsQ29udGV4dC5sb2FkUHJpdmF0ZUtleSgiLi4vLi4vLi4vdGVzdC9rZXlzL3NlcnZlci5rZXkiKTsKKyAgICBzc2xDb250ZXh0LmNpcGhlcnMgPSAiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIjsKKyAgICBzZXJ2ZXJTb2NrZXQgPSBuZXcgVFNTTFNlcnZlclNvY2tldChwb3J0LCBzc2xDb250ZXh0KTsKKyAgfSBlbHNlIHsKKyAgICBzZXJ2ZXJTb2NrZXQgPSBuZXcgVFNlcnZlclNvY2tldChwb3J0KTsKKyAgfQorCisgIGF1dG8gdHJhbnNwb3J0RmFjdG9yeSA9IGNyZWF0ZVRyYW5zcG9ydEZhY3RvcnkodHJhbnNwb3J0VHlwZSk7CisKKyAgYXV0byBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoc2VydmVyVHlwZSwgbnVtSU9UaHJlYWRzLCB0YXNrUG9vbFNpemUsCisgICAgcHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CisKKyAgLy8gU2V0IHVwIFNJR0lOVCBzaWduYWwgaGFuZGxpbmcKKyAgc2lnZm5fdCBvbGRIYW5kbGVyID0gc2lnbmFsKFNJR0lOVCwgJmhhbmRsZVNpZ25hbCk7CisgIGVuZm9yY2Uob2xkSGFuZGxlciAhPSBTSUdfRVJSLAorICAgICJDb3VsZCBub3QgcmVwbGFjZSB0aGUgU0lHSU5UIHNpZ25hbCBoYW5kbGVyOiBlcnJubyB7MH0iLmZvcm1hdChlcnJubygpKSk7CisgIAorICAvLyBTZXQgdXAgYSBzZXJ2ZXIgY2FuY2VsbGF0aW9uIHRyaWdnZXIKKyAgYXV0byBjYW5jZWwgPSBuZXcgVENhbmNlbGxhdGlvbk9yaWdpbigpOworCisgIC8vIFNldCB1cCBhIGxpc3RlbmVyIGZvciB0aGUgc2h1dGRvd24gY29uZGl0aW9uIC0gdGhpcyB3aWxsCisgIC8vIHdha2UgdXAgd2hlbiB0aGUgc2lnbmFsIG9jY3VycyBhbmQgdHJpZ2dlciBjYW5jZWxsYXRpb24uCisgIGF1dG8gc2h1dGRvd24gPSBuZXcgU2h1dGRvd25UaHJlYWQoY2FuY2VsKTsKKyAgc2h1dGRvd24uc3RhcnQoKTsKKyAgCisgIC8vIFNlcnZlIGZyb20gdGhpcyB0aHJlYWQ7IHRoZSBzaWduYWwgd2lsbCBzdG9wIHRoZSBzZXJ2ZXIKKyAgLy8gYW5kIGNvbnRyb2wgd2lsbCByZXR1cm4gaGVyZQorICB3cml0ZWZsbigiU3RhcnRpbmcgJXMvJXMgJXMgVGhyaWZ0VGVzdCBzZXJ2ZXIgJXNvbiBwb3J0ICVzLi4uIiwgcHJvdG9jb2xUeXBlLAorICAgIHRyYW5zcG9ydFR5cGUsIHNlcnZlclR5cGUsIHNzbCA/ICIodXNpbmcgU1NMKSAiOiAiIiwgcG9ydCk7CisgIHNlcnZlci5zZXJ2ZShjYW5jZWwpOworICBzaHV0ZG93bi5qb2luKCk7CisgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworICAgIAorICB3cml0ZWxuKCJkb25lLiIpOworfQpkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC90cmFuc3BvcnRfdGVzdC5kIGIvbGliL2QvdGVzdC90cmFuc3BvcnRfdGVzdC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyM2UwM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC90ZXN0L3RyYW5zcG9ydF90ZXN0LmQKQEAgLTAsMCArMSw4MDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBFeGVyY2lzZXMgdmFyaW91cyB0cmFuc3BvcnRzLCBjb21iaW5lZCB3aXRoIHRoZSBidWZmZXJlZC9mcmFtZWQgd3JhcHBlcnMuCisgKgorICogT3JpZ2luYWxseSBwb3J0ZWQgZnJvbSB0aGUgQysrIHZlcnNpb24sIHdpdGggV2luZG93cyBzdXBwb3J0IGNvZGUgYWRkZWQuCisgKi8KK21vZHVsZSB0cmFuc3BvcnRfdGVzdDsKKworaW1wb3J0IGNvcmUuYXRvbWljOworaW1wb3J0IGNvcmUudGltZSA6IER1cmF0aW9uOworaW1wb3J0IGNvcmUudGhyZWFkIDogVGhyZWFkOworaW1wb3J0IHN0ZC5jb252IDogdG87CitpbXBvcnQgc3RkLmRhdGV0aW1lOworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworc3RhdGljIGltcG9ydCBzdGQuZmlsZTsKK2ltcG9ydCBzdGQuZ2V0b3B0OworaW1wb3J0IHN0ZC5yYW5kb20gOiBybmRHZW4sIHVuaWZvcm0sIHVucHJlZGljdGFibGVTZWVkOworaW1wb3J0IHN0ZC5zb2NrZXQ7CitpbXBvcnQgc3RkLnN0ZGlvOworaW1wb3J0IHN0ZC5zdHJpbmc7CitpbXBvcnQgc3RkLnR5cGV0dXBsZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5idWZmZXJlZDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmZyYW1lZDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmZpbGU7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5odHRwOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuemxpYjsKKworLyoKKyAqIFNpemUgZ2VuZXJhdGlvbiBoZWxwZXJzIOKAkyB1c2VkIHRvIGJlIGFibGUgdG8gcnVuIHRoZSBzYW1lIHRlc3RpbmcgY29kZQorICogd2l0aCBib3RoIGNvbnN0YW50IGFuZCByYW5kb20gdG90YWwvY2h1bmsgc2l6ZXMuCisgKi8KKworaW50ZXJmYWNlIFNpemVHZW5lcmF0b3IgeworICBzaXplX3QgbmV4dFNpemUoKTsKKyAgc3RyaW5nIHRvU3RyaW5nKCk7Cit9CisKK2NsYXNzIENvbnN0YW50U2l6ZUdlbmVyYXRvciA6IFNpemVHZW5lcmF0b3IgeworICB0aGlzKHNpemVfdCB2YWx1ZSkgeworICAgIHZhbHVlXyA9IHZhbHVlOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IG5leHRTaXplKCkgeworICAgIHJldHVybiB2YWx1ZV87CisgIH0KKworICBvdmVycmlkZSBzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIHRvIXN0cmluZyh2YWx1ZV8pOworICB9CisKK3ByaXZhdGU6CisgIHNpemVfdCB2YWx1ZV87Cit9CisKK2NsYXNzIFJhbmRvbVNpemVHZW5lcmF0b3IgOiBTaXplR2VuZXJhdG9yIHsKKyAgdGhpcyhzaXplX3QgbWluLCBzaXplX3QgbWF4KSB7CisgICAgbWluXyA9IG1pbjsKKyAgICBtYXhfID0gbWF4OworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IG5leHRTaXplKCkgeworICAgIHJldHVybiB1bmlmb3JtISJbXSIobWluXywgbWF4Xyk7CisgIH0KKworICBvdmVycmlkZSBzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIGZvcm1hdCgicmFuZCglcywgJXMpIiwgbWluXywgbWF4Xyk7CisgIH0KKworICBzaXplX3QgbWluKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gbWluXzsKKyAgfQorCisgIHNpemVfdCBtYXgoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBtYXhfOworICB9CisKK3ByaXZhdGU6CisgIHNpemVfdCBtaW5fOworICBzaXplX3QgbWF4XzsKK30KKworCisvKgorICogQ2xhc3NlcyB0byBzZXQgdXAgY291cGxlZCB0cmFuc3BvcnRzCisgKi8KKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdG8gcmVwcmVzZW50IGEgY291cGxlZCBwYWlyIG9mIHRyYW5zcG9ydHMuCisgKgorICogRGF0YSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgdHJhbnNwb3J0IGNhbiBiZSByZWFkIGZyb20gdGhlIGlucHV0IHRyYW5zcG9ydC4KKyAqCisgKiBUaGlzIGlzIHVzZWQgYXMgdGhlIGJhc2UgY2xhc3MgZm9yIHRoZSB2YXJpb3VzIGNvdXBsZWQgdHJhbnNwb3J0CisgKiBpbXBsZW1lbnRhdGlvbnMuIEl0IHNob3VsZG4ndCBiZSB1c2VkIGRpcmVjdGx5LgorICovCitjbGFzcyBDb3VwbGVkVHJhbnNwb3J0cyhUcmFuc3BvcnQpIGlmIChpc1RUcmFuc3BvcnQhVHJhbnNwb3J0KSB7CisgIFRyYW5zcG9ydCBpbnB1dDsKKyAgVHJhbnNwb3J0IG91dHB1dDsKK30KKwordGVtcGxhdGUgaXNDb3VwbGVkVHJhbnNwb3J0cyhUKSB7CisgIHN0YXRpYyBpZiAoaXMoVCBfIDogQ291cGxlZFRyYW5zcG9ydHMhVSwgVSkpIHsKKyAgICBlbnVtIGlzQ291cGxlZFRyYW5zcG9ydHMgPSB0cnVlOworICB9IGVsc2UgeworICAgIGVudW0gaXNDb3VwbGVkVHJhbnNwb3J0cyA9IGZhbHNlOworICB9Cit9CisKKy8qKgorICogSGVscGVyIHRlbXBsYXRlIGNsYXNzIGZvciBjcmVhdGluZyBjb3VwbGVkIHRyYW5zcG9ydHMgdGhhdCB3cmFwCisgKiBhbm90aGVyIHRyYW5zcG9ydC4KKyAqLworY2xhc3MgQ291cGxlZFdyYXBwZXJUcmFuc3BvcnRzKFdyYXBwZXJUcmFuc3BvcnQsIElubmVyQ291cGxlZFRyYW5zcG9ydHMpIGlmICgKKyAgaXNUVHJhbnNwb3J0IVdyYXBwZXJUcmFuc3BvcnQgJiYgaXNDb3VwbGVkVHJhbnNwb3J0cyFJbm5lckNvdXBsZWRUcmFuc3BvcnRzCispIDogQ291cGxlZFRyYW5zcG9ydHMhV3JhcHBlclRyYW5zcG9ydCB7CisgIHRoaXMoKSB7CisgICAgaW5uZXJfID0gbmV3IElubmVyQ291cGxlZFRyYW5zcG9ydHMoKTsKKyAgICBpZiAoaW5uZXJfLmlucHV0KSB7CisgICAgICBpbnB1dCA9IG5ldyBXcmFwcGVyVHJhbnNwb3J0KGlubmVyXy5pbnB1dCk7CisgICAgfQorICAgIGlmIChpbm5lcl8ub3V0cHV0KSB7CisgICAgICBvdXRwdXQgPSBuZXcgV3JhcHBlclRyYW5zcG9ydChpbm5lcl8ub3V0cHV0KTsKKyAgICB9CisgIH0KKworICB+dGhpcygpIHsKKyAgICBkZXN0cm95KGlubmVyXyk7CisgIH0KKworcHJpdmF0ZToKKyAgSW5uZXJDb3VwbGVkVHJhbnNwb3J0cyBpbm5lcl87Cit9CisKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuY29kZWdlbiA6IFBBcHBseTsKK2FsaWFzIFBBcHBseSEoQ291cGxlZFdyYXBwZXJUcmFuc3BvcnRzLCBUQnVmZmVyZWRUcmFuc3BvcnQpIENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHM7CithbGlhcyBQQXBwbHkhKENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0cywgVEZyYW1lZFRyYW5zcG9ydCkgQ291cGxlZEZyYW1lZFRyYW5zcG9ydHM7CithbGlhcyBQQXBwbHkhKENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0cywgVFpsaWJUcmFuc3BvcnQpIENvdXBsZWRabGliVHJhbnNwb3J0czsKKworLyoqCisgKiBDb3VwbGVkIFRNZW1vcnlCdWZmZXJzLgorICovCitjbGFzcyBDb3VwbGVkTWVtb3J5QnVmZmVycyA6IENvdXBsZWRUcmFuc3BvcnRzIVRNZW1vcnlCdWZmZXIgeworICB0aGlzKCkgeworICAgIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyOworICAgIGlucHV0ID0gYnVmOworICAgIG91dHB1dCA9IGJ1ZjsKKyAgfQorCisgIFRNZW1vcnlCdWZmZXIgYnVmOworfQorCisvKioKKyAqIENvdXBsZWQgVFNvY2tldHMuCisgKi8KK2NsYXNzIENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzIDogQ291cGxlZFRyYW5zcG9ydHMhVFNvY2tldCB7CisgIHRoaXMoKSB7CisgICAgYXV0byBzb2NrZXRzID0gc29ja2V0UGFpcigpOworICAgIGlucHV0ID0gbmV3IFRTb2NrZXQoc29ja2V0c1swXSk7CisgICAgb3V0cHV0ID0gbmV3IFRTb2NrZXQoc29ja2V0c1sxXSk7CisgIH0KKworICB+dGhpcygpIHsKKyAgICBpbnB1dC5jbG9zZSgpOworICAgIG91dHB1dC5jbG9zZSgpOworICB9Cit9CisKKy8qKgorICogQ291cGxlZCBURmlsZVRyYW5zcG9ydHMKKyAqLworY2xhc3MgQ291cGxlZEZpbGVUcmFuc3BvcnRzIDogQ291cGxlZFRyYW5zcG9ydHMhVFRyYW5zcG9ydCB7CisgIHRoaXMoKSB7CisgICAgLy8gV2UgYWN0dWFsbHkgbmVlZCB0aGUgZmlsZSBuYW1lIG9mIHRoZSB0ZW1wIGZpbGUgaGVyZSwgc28gd2UgY2FuJ3QganVzdAorICAgIC8vIHVzZSB0aGUgdXN1YWwgdGVtcGZpbGUgZmFjaWxpdGllcy4KKyAgICBkbyB7CisgICAgICBmaWxlTmFtZV8gPSB0bXBEaXIgfiAiL3RocmlmdC50cmFuc3BvcnRfdGVzdC4iIH4gdG8hc3RyaW5nKHJuZEdlbigpLmZyb250KTsKKyAgICAgIHJuZEdlbigpLnBvcEZyb250KCk7CisgICAgfSB3aGlsZSAoc3RkLmZpbGUuZXhpc3RzKGZpbGVOYW1lXykpOworCisgICAgd3JpdGVmbG4oIlVzaW5nIHRlbXAgZmlsZTogJXMiLCBmaWxlTmFtZV8pOworCisgICAgYXV0byB3cml0ZXIgPSBuZXcgVEZpbGVXcml0ZXJUcmFuc3BvcnQoZmlsZU5hbWVfKTsKKyAgICB3cml0ZXIub3BlbigpOworICAgIG91dHB1dCA9IHdyaXRlcjsKKworICAgIC8vIFdhaXQgdW50aWwgdGhlIGZpbGUgaGFzIGJlZW4gY3JlYXRlZC4KKyAgICB3cml0ZXIuZmx1c2goKTsKKworICAgIGF1dG8gcmVhZGVyID0gbmV3IFRGaWxlUmVhZGVyVHJhbnNwb3J0KGZpbGVOYW1lXyk7CisgICAgcmVhZGVyLm9wZW4oKTsKKyAgICByZWFkZXIucmVhZFRpbWVvdXQoZHVyISJtc2VjcyIoLTEpKTsKKyAgICBpbnB1dCA9IHJlYWRlcjsKKyAgfQorCisgIH50aGlzKCkgeworICAgIGlucHV0LmNsb3NlKCk7CisgICAgb3V0cHV0LmNsb3NlKCk7CisgICAgc3RkLmZpbGUucmVtb3ZlKGZpbGVOYW1lXyk7CisgIH0KKworICBzdGF0aWMgc3RyaW5nIHRtcERpcjsKKworcHJpdmF0ZToKKyAgc3RyaW5nIGZpbGVOYW1lXzsKK30KKworCisvKgorICogVGVzdCBmdW5jdGlvbnMKKyAqLworCisvKioKKyAqIFRlc3QgaW50ZXJsZWF2ZWQgd3JpdGUgYW5kIHJlYWQgY2FsbHMuCisgKgorICogR2VuZXJhdGVzIGEgYnVmZmVyIHRvdGFsU2l6ZSBieXRlcyBsb25nLCB0aGVuIHdyaXRlcyBpdCB0byB0aGUgdHJhbnNwb3J0LAorICogYW5kIHZlcmlmaWVzIHRoZSB3cml0dGVuIGRhdGEgY2FuIGJlIHJlYWQgYmFjayBjb3JyZWN0bHkuCisgKgorICogTW9kZSBvZiBvcGVyYXRpb246CisgKiAtIGNhbGwgd0NodW5rR2VuZXJhdG9yIHRvIGZpZ3VyZSBvdXQgaG93IGxhcmdlIG9mIGEgY2h1bmsgdG8gd3JpdGUKKyAqICAgLSBjYWxsIHdTaXplR2VuZXJhdG9yIHRvIGdldCB0aGUgc2l6ZSBmb3IgaW5kaXZpZHVhbCB3cml0ZSgpIGNhbGxzLAorICogICAgIGFuZCBkbyB0aGlzIHJlcGVhdGVkbHkgdW50aWwgdGhlIGVudGlyZSBjaHVuayBpcyB3cml0dGVuLgorICogLSBjYWxsIHJDaHVua0dlbmVyYXRvciB0byBmaWd1cmUgb3V0IGhvdyBsYXJnZSBvZiBhIGNodW5rIHRvIHJlYWQKKyAqICAgLSBjYWxsIHJTaXplR2VuZXJhdG9yIHRvIGdldCB0aGUgc2l6ZSBmb3IgaW5kaXZpZHVhbCByZWFkKCkgY2FsbHMsCisgKiAgICAgYW5kIGRvIHRoaXMgcmVwZWF0ZWRseSB1bnRpbCB0aGUgZW50aXJlIGNodW5rIGlzIHJlYWQuCisgKiAtIHJlcGVhdCB1bnRpbCB0aGUgZnVsbCBidWZmZXIgaXMgd3JpdHRlbiBhbmQgcmVhZCBiYWNrLAorICogICB0aGVuIGNvbXBhcmUgdGhlIGRhdGEgcmVhZCBiYWNrIGFnYWluc3QgdGhlIG9yaWdpbmFsIGJ1ZmZlcgorICoKKyAqCisgKiAtIElmIGFueSBvZiB0aGUgc2l6ZSBnZW5lcmF0b3JzIHJldHVybiAwLCB0aGlzIG1lYW5zIHRvIHVzZSB0aGUgbWF4aW11bQorICogICBwb3NzaWJsZSBzaXplLgorICoKKyAqIC0gSWYgbWF4T3V0c3RhbmRpbmcgaXMgbm9uLXplcm8sIHdyaXRlIGNodW5rIHNpemVzIHdpbGwgYmUgY2hvc2VuIHN1Y2ggdGhhdAorICogICB0aGVyZSBhcmUgbmV2ZXIgbW9yZSB0aGFuIG1heE91dHN0YW5kaW5nIGJ5dGVzIHdhaXRpbmcgdG8gYmUgcmVhZCBiYWNrLgorICovCit2b2lkIHRlc3RSZWFkV3JpdGUoQ291cGxlZFRyYW5zcG9ydHMpKAorICBzaXplX3QgdG90YWxTaXplLAorICBTaXplR2VuZXJhdG9yIHdTaXplR2VuZXJhdG9yLAorICBTaXplR2VuZXJhdG9yIHJTaXplR2VuZXJhdG9yLAorICBTaXplR2VuZXJhdG9yIHdDaHVua0dlbmVyYXRvciwKKyAgU2l6ZUdlbmVyYXRvciByQ2h1bmtHZW5lcmF0b3IsCisgIHNpemVfdCBtYXhPdXRzdGFuZGluZworKSBpZiAoCisgIGlzQ291cGxlZFRyYW5zcG9ydHMhQ291cGxlZFRyYW5zcG9ydHMKKykgeworICBzY29wZSB0cmFuc3BvcnRzID0gbmV3IENvdXBsZWRUcmFuc3BvcnRzOworICBhc3NlcnQodHJhbnNwb3J0cy5pbnB1dCk7CisgIGFzc2VydCh0cmFuc3BvcnRzLm91dHB1dCk7CisKKyAgYXV0byB3YnVmID0gbmV3IHVieXRlW3RvdGFsU2l6ZV07CisgIGF1dG8gcmJ1ZiA9IG5ldyB1Ynl0ZVt0b3RhbFNpemVdOworCisgIC8vIFN0b3JlIHNvbWUgZGF0YSBpbiB3YnVmLgorICBmb3JlYWNoIChpLCByZWYgYjsgd2J1ZikgeworICAgIGIgPSBpICYgMHhmZjsKKyAgfQorCisgIHNpemVfdCB0b3RhbFdyaXR0ZW47CisgIHNpemVfdCB0b3RhbFJlYWQ7CisgIHdoaWxlICh0b3RhbFJlYWQgPCB0b3RhbFNpemUpIHsKKyAgICAvLyBEZXRlcm1pbmUgaG93IGxhcmdlIGEgY2h1bmsgb2YgZGF0YSB0byB3cml0ZS4KKyAgICBhdXRvIHdDaHVua1NpemUgPSB3Q2h1bmtHZW5lcmF0b3IubmV4dFNpemUoKTsKKyAgICBpZiAod0NodW5rU2l6ZSA9PSAwIHx8IHdDaHVua1NpemUgPiB0b3RhbFNpemUgLSB0b3RhbFdyaXR0ZW4pIHsKKyAgICAgIHdDaHVua1NpemUgPSB0b3RhbFNpemUgLSB0b3RhbFdyaXR0ZW47CisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlICh0b3RhbFdyaXR0ZW4gLSB0b3RhbFJlYWQpICsgd0NodW5rU2l6ZSBpcyBsZXNzIHRoYW4KKyAgICAvLyBtYXhPdXRzdGFuZGluZy4KKyAgICBpZiAobWF4T3V0c3RhbmRpbmcgPiAwICYmCisgICAgICAgIHdDaHVua1NpemUgPiBtYXhPdXRzdGFuZGluZyAtICh0b3RhbFdyaXR0ZW4gLSB0b3RhbFJlYWQpKSB7CisgICAgICB3Q2h1bmtTaXplID0gbWF4T3V0c3RhbmRpbmcgLSAodG90YWxXcml0dGVuIC0gdG90YWxSZWFkKTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0aGUgY2h1bmsuCisgICAgc2l6ZV90IGNodW5rV3JpdHRlbiA9IDA7CisgICAgd2hpbGUgKGNodW5rV3JpdHRlbiA8IHdDaHVua1NpemUpIHsKKyAgICAgIGF1dG8gd3JpdGVTaXplID0gd1NpemVHZW5lcmF0b3IubmV4dFNpemUoKTsKKyAgICAgIGlmICh3cml0ZVNpemUgPT0gMCB8fCB3cml0ZVNpemUgPiB3Q2h1bmtTaXplIC0gY2h1bmtXcml0dGVuKSB7CisgICAgICAgIHdyaXRlU2l6ZSA9IHdDaHVua1NpemUgLSBjaHVua1dyaXR0ZW47CisgICAgICB9CisKKyAgICAgIHRyYW5zcG9ydHMub3V0cHV0LndyaXRlKHdidWZbdG90YWxXcml0dGVuIC4uIHRvdGFsV3JpdHRlbiArIHdyaXRlU2l6ZV0pOworICAgICAgY2h1bmtXcml0dGVuICs9IHdyaXRlU2l6ZTsKKyAgICAgIHRvdGFsV3JpdHRlbiArPSB3cml0ZVNpemU7CisgICAgfQorCisgICAgLy8gRmx1c2ggdGhlIGRhdGEsIHNvIGl0IHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSByZWFkIHRyYW5zcG9ydAorICAgIC8vIERvbid0IGZsdXNoIGlmIHdDaHVua1NpemUgaXMgMC4gKFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGlmCisgICAgLy8gdG90YWxXcml0dGVuID09IHRvdGFsU2l6ZSBhbHJlYWR5LCBhbmQgd2UncmUgb25seSByZWFkaW5nIG5vdy4pCisgICAgaWYgKHdDaHVua1NpemUgPiAwKSB7CisgICAgICB0cmFuc3BvcnRzLm91dHB1dC5mbHVzaCgpOworICAgIH0KKworICAgIC8vIERldGVybWluZSBob3cgbGFyZ2UgYSBjaHVuayBvZiBkYXRhIHRvIHJlYWQgYmFjay4KKyAgICBhdXRvIHJDaHVua1NpemUgPSByQ2h1bmtHZW5lcmF0b3IubmV4dFNpemUoKTsKKyAgICBpZiAockNodW5rU2l6ZSA9PSAwIHx8IHJDaHVua1NpemUgPiB0b3RhbFdyaXR0ZW4gLSB0b3RhbFJlYWQpIHsKKyAgICAgIHJDaHVua1NpemUgPSB0b3RhbFdyaXR0ZW4gLSB0b3RhbFJlYWQ7CisgICAgfQorCisgICAgLy8gUmVhZCB0aGUgY2h1bmsuCisgICAgc2l6ZV90IGNodW5rUmVhZDsKKyAgICB3aGlsZSAoY2h1bmtSZWFkIDwgckNodW5rU2l6ZSkgeworICAgICAgYXV0byByZWFkU2l6ZSA9IHJTaXplR2VuZXJhdG9yLm5leHRTaXplKCk7CisgICAgICBpZiAocmVhZFNpemUgPT0gMCB8fCByZWFkU2l6ZSA+IHJDaHVua1NpemUgLSBjaHVua1JlYWQpIHsKKyAgICAgICAgcmVhZFNpemUgPSByQ2h1bmtTaXplIC0gY2h1bmtSZWFkOworICAgICAgfQorCisgICAgICBzaXplX3QgYnl0ZXNSZWFkOworICAgICAgdHJ5IHsKKyAgICAgICAgYnl0ZXNSZWFkID0gdHJhbnNwb3J0cy5pbnB1dC5yZWFkKAorICAgICAgICAgIHJidWZbdG90YWxSZWFkIC4uIHRvdGFsUmVhZCArIHJlYWRTaXplXSk7CisgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihmb3JtYXQoYHJlYWQocG9zID0gJXMsIHNpemUgPSAlcykgdGhyZXcgYCB+CisgICAgICAgICAgYGV4Y2VwdGlvbiAiJXMiOyB3cml0dGVuIHNvIGZhcjogJXMvJXMgYnl0ZXNgLCB0b3RhbFJlYWQsIHJlYWRTaXplLAorICAgICAgICAgIGUubXNnLCB0b3RhbFdyaXR0ZW4sIHRvdGFsU2l6ZSkpOworICAgICAgfQorCisgICAgICBlbmZvcmNlKGJ5dGVzUmVhZCA+IDAsIGZvcm1hdChgcmVhZChwb3MgPSAlcywgc2l6ZSA9ICVzKSByZXR1cm5lZCAlczsgYCB+CisgICAgICAgIGB3cml0dGVuIHNvIGZhcjogJXMvJXMgYnl0ZXNgLCB0b3RhbFJlYWQsIHJlYWRTaXplLCBieXRlc1JlYWQsCisgICAgICAgIHRvdGFsV3JpdHRlbiwgdG90YWxTaXplKSk7CisKKyAgICAgIGNodW5rUmVhZCArPSBieXRlc1JlYWQ7CisgICAgICB0b3RhbFJlYWQgKz0gYnl0ZXNSZWFkOworICAgIH0KKyAgfQorCisgIC8vIG1ha2Ugc3VyZSB0aGUgZGF0YSByZWFkIGJhY2sgaXMgaWRlbnRpY2FsIHRvIHRoZSBkYXRhIHdyaXR0ZW4KKyAgaWYgKHJidWYgIT0gd2J1ZikgeworICAgIHN0ZGVyci53cml0ZWZsbigiJXMgdnMuICVzIiwgd2J1ZlskIC0gNCAuLiAkXSwgcmJ1ZlskIC0gNCAuLiAkXSk7CisgICAgc3RkZXJyLndyaXRlZmxuKCJyYnVmOiAlcyB2cy4gd2J1ZjogJXMiLCByYnVmLmxlbmd0aCwgd2J1Zi5sZW5ndGgpOworICB9CisgIGVuZm9yY2UocmJ1ZiA9PSB3YnVmKTsKK30KKwordm9pZCB0ZXN0UmVhZFBhcnRBdmFpbGFibGUoQ291cGxlZFRyYW5zcG9ydHMpKCkgaWYgKAorICBpc0NvdXBsZWRUcmFuc3BvcnRzIUNvdXBsZWRUcmFuc3BvcnRzCispIHsKKyAgc2NvcGUgdHJhbnNwb3J0cyA9IG5ldyBDb3VwbGVkVHJhbnNwb3J0czsKKyAgYXNzZXJ0KHRyYW5zcG9ydHMuaW5wdXQpOworICBhc3NlcnQodHJhbnNwb3J0cy5vdXRwdXQpOworCisgIHVieXRlWzEwXSB3cml0ZUJ1ZiA9ICdhJzsKKyAgdWJ5dGVbMTBdIHJlYWRCdWY7CisKKyAgLy8gQXR0ZW1waW5nIHRvIHJlYWQgMTAgYnl0ZXMgd2hlbiBvbmx5IDkgYXJlIGF2YWlsYWJsZSBzaG91bGQgcmV0dXJuIDkKKyAgLy8gaW1tZWRpYXRlbHkuCisgIHRyYW5zcG9ydHMub3V0cHV0LndyaXRlKHdyaXRlQnVmWzAgLi4gOV0pOworICB0cmFuc3BvcnRzLm91dHB1dC5mbHVzaCgpOworCisgIGF1dG8gdCA9IFRyaWdnZXIoZHVyISJzZWNvbmRzIigzKSwgdHJhbnNwb3J0cy5vdXRwdXQsIDEpOworICBhdXRvIGJ5dGVzUmVhZCA9IHRyYW5zcG9ydHMuaW5wdXQucmVhZChyZWFkQnVmKTsKKyAgZW5mb3JjZSh0LmZpcmVkID09IDApOworICBlbmZvcmNlKGJ5dGVzUmVhZCA9PSA5KTsKK30KKwordm9pZCB0ZXN0UmVhZFBhcnRpYWxNaWRmcmFtZShDb3VwbGVkVHJhbnNwb3J0cykoKSBpZiAoCisgIGlzQ291cGxlZFRyYW5zcG9ydHMhQ291cGxlZFRyYW5zcG9ydHMKKykgeworICBzY29wZSB0cmFuc3BvcnRzID0gbmV3IENvdXBsZWRUcmFuc3BvcnRzOworICBhc3NlcnQodHJhbnNwb3J0cy5pbnB1dCk7CisgIGFzc2VydCh0cmFuc3BvcnRzLm91dHB1dCk7CisKKyAgdWJ5dGVbMTNdIHdyaXRlQnVmID0gJ2EnOworICB1Ynl0ZVsxNF0gcmVhZEJ1ZjsKKworICAvLyBBdHRlbXB0IHRvIHJlYWQgMTAgYnl0ZXMsIHdoZW4gb25seSA5IGFyZSBhdmFpbGFibGUsIGJ1dCBhZnRlciB3ZSBoYXZlCisgIC8vIGFscmVhZHkgcmVhZCBwYXJ0IG9mIHRoZSBkYXRhIHRoYXQgaXMgYXZhaWxhYmxlLiAgVGhpcyBleGVyY2lzZXMgYQorICAvLyBkaWZmZXJlbnQgY29kZSBwYXRoIGZvciBzZXZlcmFsIG9mIHRoZSB0cmFuc3BvcnRzLgorICAvLworICAvLyBGb3IgdHJhbnNwb3J0cyB0aGF0IGFkZCB0aGVpciBvd24gZnJhbWluZyAoZS5nLiwgVEZyYW1lZFRyYW5zcG9ydCBhbmQKKyAgLy8gVEZpbGVUcmFuc3BvcnQpLCB0aGUgdHdvIGZsdXNoIGNhbGxzIGJyZWFrIHVwIHRoZSBkYXRhIGluIHRvIGEgMTAgYnl0ZQorICAvLyBmcmFtZSBhbmQgYSAzIGJ5dGUgZnJhbWUuICBUaGUgZmlyc3QgcmVhZCB0aGVuIHB1dHMgdXMgcGFydHdheSB0aHJvdWdoIHRoZQorICAvLyBmaXJzdCBmcmFtZSwgYW5kIHRoZW4gd2UgYXR0ZW1wdCB0byByZWFkIHBhc3QgdGhlIGVuZCBvZiB0aGF0IGZyYW1lLCBhbmQKKyAgLy8gdGhyb3VnaCB0aGUgbmV4dCBmcmFtZSwgdG9vLgorICAvLworICAvLyBGb3IgYnVmZmVyZWQgdHJhbnNwb3J0cyB0aGF0IHBlcmZvcm0gcmVhZC1haGVhZCAoZS5nLiwKKyAgLy8gVEJ1ZmZlcmVkVHJhbnNwb3J0KSwgdGhlIHJlYWQtYWhlYWQgd2lsbCBtb3N0IGxpa2VseSBzZWUgYWxsIDEzIGJ5dGVzCisgIC8vIHdyaXR0ZW4gb24gdGhlIGZpcnN0IHJlYWQuICBUaGUgbmV4dCByZWFkIHdpbGwgdGhlbiBhdHRlbXB0IHRvIHJlYWQgcGFzdAorICAvLyB0aGUgZW5kIG9mIHRoZSByZWFkLWFoZWFkIGJ1ZmZlci4KKyAgLy8KKyAgLy8gRmx1c2ggMTAgYnl0ZXMsIHRoZW4gMyBieXRlcy4gIFRoaXMgY3JlYXRlcyAyIHNlcGFyYXRlIGZyYW1lcyBmb3IKKyAgLy8gdHJhbnNwb3J0cyB0aGF0IHRyYWNrIGZyYW1pbmcgaW50ZXJuYWxseS4KKyAgdHJhbnNwb3J0cy5vdXRwdXQud3JpdGUod3JpdGVCdWZbMCAuLiAxMF0pOworICB0cmFuc3BvcnRzLm91dHB1dC5mbHVzaCgpOworICB0cmFuc3BvcnRzLm91dHB1dC53cml0ZSh3cml0ZUJ1ZlsxMCAuLiAxM10pOworICB0cmFuc3BvcnRzLm91dHB1dC5mbHVzaCgpOworCisgIC8vIE5vdyByZWFkIDQgYnl0ZXMsIHNvIHRoYXQgd2UgYXJlIHBhcnR3YXkgdGhyb3VnaCB0aGUgd3JpdHRlbiBkYXRhLgorICBhdXRvIGJ5dGVzUmVhZCA9IHRyYW5zcG9ydHMuaW5wdXQucmVhZChyZWFkQnVmWzAgLi4gNF0pOworICBlbmZvcmNlKGJ5dGVzUmVhZCA9PSA0KTsKKworICAvLyBOb3cgYXR0ZW1wdCB0byByZWFkIDEwIGJ5dGVzLiAgT25seSA5IG1vcmUgYXJlIGF2YWlsYWJsZS4KKyAgLy8KKyAgLy8gV2Ugc2hvdWxkIGJlIGFibGUgdG8gZ2V0IGFsbCA5IGJ5dGVzLCBidXQgaXQgbWlnaHQgdGFrZSBtdWx0aXBsZSByZWFkCisgIC8vIGNhbGxzLCBzaW5jZSBpdCBpcyB2YWxpZCBmb3IgcmVhZCgpIHRvIHJldHVybiBmZXdlciBieXRlcyB0aGFuIHJlcXVlc3RlZC4KKyAgLy8gKE1vc3QgdHJhbnNwb3J0cyBkbyBpbW1lZGlhdGVseSByZXR1cm4gOSBieXRlcywgYnV0IHRoZSBmcmFtaW5nIHRyYW5zcG9ydHMKKyAgLy8gdGVuZCB0byBvbmx5IHJldHVybiB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGZyYW1lLCB3aGljaCBpcyA2IGJ5dGVzIGluCisgIC8vIHRoaXMgY2FzZS4pCisgIHNpemVfdCB0b3RhbFJlYWQgPSAwOworICB3aGlsZSAodG90YWxSZWFkIDwgOSkgeworICAgIGF1dG8gdCA9IFRyaWdnZXIoZHVyISJzZWNvbmRzIigzKSwgdHJhbnNwb3J0cy5vdXRwdXQsIDEpOworICAgIGJ5dGVzUmVhZCA9IHRyYW5zcG9ydHMuaW5wdXQucmVhZChyZWFkQnVmWzQgKyB0b3RhbFJlYWQgLi4gMTRdKTsKKyAgICBlbmZvcmNlKHQuZmlyZWQgPT0gMCk7CisgICAgZW5mb3JjZShieXRlc1JlYWQgPiAwKTsKKyAgICB0b3RhbFJlYWQgKz0gYnl0ZXNSZWFkOworICAgIGVuZm9yY2UodG90YWxSZWFkIDw9IDkpOworICB9CisKKyAgZW5mb3JjZSh0b3RhbFJlYWQgPT0gOSk7Cit9CisKK3ZvaWQgdGVzdEJvcnJvd1BhcnRBdmFpbGFibGUoQ291cGxlZFRyYW5zcG9ydHMpKCkgaWYgKAorICBpc0NvdXBsZWRUcmFuc3BvcnRzIUNvdXBsZWRUcmFuc3BvcnRzCispIHsKKyAgc2NvcGUgdHJhbnNwb3J0cyA9IG5ldyBDb3VwbGVkVHJhbnNwb3J0czsKKyAgYXNzZXJ0KHRyYW5zcG9ydHMuaW5wdXQpOworICBhc3NlcnQodHJhbnNwb3J0cy5vdXRwdXQpOworCisgIHVieXRlWzldIHdyaXRlQnVmID0gJ2EnOworICB1Ynl0ZVsxMF0gcmVhZEJ1ZjsKKworICAvLyBBdHRlbXBpbmcgdG8gYm9ycm93IDEwIGJ5dGVzIHdoZW4gb25seSA5IGFyZSBhdmFpbGFibGUgc2hvdWxkIHJldHVybiBOVUxMCisgIC8vIGltbWVkaWF0ZWx5LgorICB0cmFuc3BvcnRzLm91dHB1dC53cml0ZSh3cml0ZUJ1Zik7CisgIHRyYW5zcG9ydHMub3V0cHV0LmZsdXNoKCk7CisKKyAgYXV0byB0ID0gVHJpZ2dlcihkdXIhInNlY29uZHMiKDMpLCB0cmFuc3BvcnRzLm91dHB1dCwgMSk7CisgIGF1dG8gYm9ycm93TGVuID0gcmVhZEJ1Zi5sZW5ndGg7CisgIGF1dG8gYm9ycm93ZWRCdWYgPSB0cmFuc3BvcnRzLmlucHV0LmJvcnJvdyhyZWFkQnVmLnB0ciwgYm9ycm93TGVuKTsKKyAgZW5mb3JjZSh0LmZpcmVkID09IDApOworICBlbmZvcmNlKGJvcnJvd2VkQnVmIGlzIG51bGwpOworfQorCit2b2lkIHRlc3RSZWFkTm9uZUF2YWlsYWJsZShDb3VwbGVkVHJhbnNwb3J0cykoKSBpZiAoCisgIGlzQ291cGxlZFRyYW5zcG9ydHMhQ291cGxlZFRyYW5zcG9ydHMKKykgeworICBzY29wZSB0cmFuc3BvcnRzID0gbmV3IENvdXBsZWRUcmFuc3BvcnRzOworICBhc3NlcnQodHJhbnNwb3J0cy5pbnB1dCk7CisgIGFzc2VydCh0cmFuc3BvcnRzLm91dHB1dCk7CisKKyAgLy8gQXR0ZW1wdGluZyB0byByZWFkIHdoZW4gbm8gZGF0YSBpcyBhdmFpbGFibGUgc2hvdWxkIGVpdGhlciBibG9jayB1bnRpbAorICAvLyBzb21lIGRhdGEgaXMgYXZhaWxhYmxlLCBvciBmYWlsIGltbWVkaWF0ZWx5LiAgKGUuZy4sIFRTb2NrZXQgYmxvY2tzLAorICAvLyBUTWVtb3J5QnVmZmVyIGp1c3QgZmFpbHMuKQorICAvLworICAvLyBJZiB0aGUgdHJhbnNwb3J0IGJsb2NrcywgaXQgc2hvdWxkIHN1Y2NlZWQgb25jZSBzb21lIGRhdGEgaXMgYXZhaWxhYmxlLAorICAvLyBldmVuIGlmIGxlc3MgdGhhbiB0aGUgYW1vdW50IHJlcXVlc3RlZCBiZWNvbWVzIGF2YWlsYWJsZS4KKyAgdWJ5dGVbMTBdIHJlYWRCdWY7CisKKyAgYXV0byB0ID0gVHJpZ2dlcihkdXIhInNlY29uZHMiKDEpLCB0cmFuc3BvcnRzLm91dHB1dCwgMik7CisgIHQuYWRkKGR1ciEic2Vjb25kcyIoMSksIHRyYW5zcG9ydHMub3V0cHV0LCA4KTsKKworICBhdXRvIGJ5dGVzUmVhZCA9IHRyYW5zcG9ydHMuaW5wdXQucmVhZChyZWFkQnVmKTsKKyAgaWYgKGJ5dGVzUmVhZCA9PSAwKSB7CisgICAgZW5mb3JjZSh0LmZpcmVkID09IDApOworICB9IGVsc2UgeworICAgIGVuZm9yY2UodC5maXJlZCA9PSAxKTsKKyAgICBlbmZvcmNlKGJ5dGVzUmVhZCA9PSAyKTsKKyAgfQorfQorCit2b2lkIHRlc3RCb3Jyb3dOb25lQXZhaWxhYmxlKENvdXBsZWRUcmFuc3BvcnRzKSgpIGlmICgKKyAgaXNDb3VwbGVkVHJhbnNwb3J0cyFDb3VwbGVkVHJhbnNwb3J0cworKSB7CisgIHNjb3BlIHRyYW5zcG9ydHMgPSBuZXcgQ291cGxlZFRyYW5zcG9ydHM7CisgIGFzc2VydCh0cmFuc3BvcnRzLmlucHV0KTsKKyAgYXNzZXJ0KHRyYW5zcG9ydHMub3V0cHV0KTsKKworICB1Ynl0ZVsxNl0gd3JpdGVCdWYgPSAnYSc7CisKKyAgLy8gQXR0ZW1wdGluZyB0byBib3Jyb3cgd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZSBzaG91bGQgZmFpbCBpbW1lZGlhdGVseQorICBhdXRvIHQgPSBUcmlnZ2VyKGR1ciEic2Vjb25kcyIoMSksIHRyYW5zcG9ydHMub3V0cHV0LCAxMCk7CisKKyAgYXV0byBib3Jyb3dMZW4gPSAxMDsKKyAgYXV0byBib3Jyb3dlZEJ1ZiA9IHRyYW5zcG9ydHMuaW5wdXQuYm9ycm93KG51bGwsIGJvcnJvd0xlbik7CisgIGVuZm9yY2UoYm9ycm93ZWRCdWYgaXMgbnVsbCk7CisgIGVuZm9yY2UodC5maXJlZCA9PSAwKTsKK30KKworCit2b2lkIGRvUndUZXN0KENvdXBsZWRUcmFuc3BvcnRzKSgKKyAgc2l6ZV90IHRvdGFsU2l6ZSwKKyAgU2l6ZUdlbmVyYXRvciB3U2l6ZUdlbiwKKyAgU2l6ZUdlbmVyYXRvciByU2l6ZUdlbiwKKyAgU2l6ZUdlbmVyYXRvciB3Q2h1bmtTaXplR2VuID0gbmV3IENvbnN0YW50U2l6ZUdlbmVyYXRvcigwKSwKKyAgU2l6ZUdlbmVyYXRvciByQ2h1bmtTaXplR2VuID0gbmV3IENvbnN0YW50U2l6ZUdlbmVyYXRvcigwKSwKKyAgc2l6ZV90IG1heE91dHN0YW5kaW5nID0gMAorKSBpZiAoCisgIGlzQ291cGxlZFRyYW5zcG9ydHMhQ291cGxlZFRyYW5zcG9ydHMKKykgeworICB0b3RhbFNpemUgPSBjYXN0KHNpemVfdCkodG90YWxTaXplICogZ19zaXplTXVsdGlwbGllcik7CisKKyAgc2NvcGUoZmFpbHVyZSkgeworICAgIHdyaXRlZmxuKCJUZXN0IGZhaWxlZCBmb3IgJXM6IHRlc3RSZWFkV3JpdGUoJXMsICVzLCAlcywgJXMsICVzLCAlcykiLAorICAgICAgQ291cGxlZFRyYW5zcG9ydHMuc3RyaW5nb2YsIHRvdGFsU2l6ZSwgd1NpemVHZW4sIHJTaXplR2VuLAorICAgICAgd0NodW5rU2l6ZUdlbiwgckNodW5rU2l6ZUdlbiwgbWF4T3V0c3RhbmRpbmcpOworICB9CisKKyAgdGVzdFJlYWRXcml0ZSFDb3VwbGVkVHJhbnNwb3J0cyh0b3RhbFNpemUsIHdTaXplR2VuLCByU2l6ZUdlbiwKKyAgICB3Q2h1bmtTaXplR2VuLCByQ2h1bmtTaXplR2VuLCBtYXhPdXRzdGFuZGluZyk7Cit9CisKK3ZvaWQgZG9CbG9ja2luZ1Rlc3QoQ291cGxlZFRyYW5zcG9ydHMpKCkgaWYgKAorICBpc0NvdXBsZWRUcmFuc3BvcnRzIUNvdXBsZWRUcmFuc3BvcnRzCispIHsKKyAgdm9pZCB3cml0ZUZhaWx1cmUoc3RyaW5nIG5hbWUpIHsKKyAgICB3cml0ZWZsbigiVGVzdCBmYWlsZWQgZm9yICVzOiAlcygpIiwgQ291cGxlZFRyYW5zcG9ydHMuc3RyaW5nb2YsIG5hbWUpOworICB9CisKKyAgeworICAgIHNjb3BlKGZhaWx1cmUpIHdyaXRlRmFpbHVyZSgidGVzdFJlYWRQYXJ0QXZhaWxhYmxlIik7CisgICAgdGVzdFJlYWRQYXJ0QXZhaWxhYmxlIUNvdXBsZWRUcmFuc3BvcnRzKCk7CisgIH0KKworICB7CisgICAgc2NvcGUoZmFpbHVyZSkgd3JpdGVGYWlsdXJlKCJ0ZXN0UmVhZFBhcnRpYWxNaWRmcmFtZSIpOworICAgIHRlc3RSZWFkUGFydGlhbE1pZGZyYW1lIUNvdXBsZWRUcmFuc3BvcnRzKCk7CisgIH0KKworICB7CisgICAgc2NvcGUoZmFpbHVyZSkgd3JpdGVGYWlsdXJlKCJ0ZXN0UmVhZE5vbmVBdmFsaWFibGUiKTsKKyAgICB0ZXN0UmVhZE5vbmVBdmFpbGFibGUhQ291cGxlZFRyYW5zcG9ydHMoKTsKKyAgfQorCisgIHsKKyAgICBzY29wZShmYWlsdXJlKSB3cml0ZUZhaWx1cmUoInRlc3RCb3Jyb3dQYXJ0QXZhaWxhYmxlIik7CisgICAgdGVzdEJvcnJvd1BhcnRBdmFpbGFibGUhQ291cGxlZFRyYW5zcG9ydHMoKTsKKyAgfQorCisgIHsKKyAgICBzY29wZShmYWlsdXJlKSB3cml0ZUZhaWx1cmUoInRlc3RCb3Jyb3dOb25lQXZhaWxhYmxlIik7CisgICAgdGVzdEJvcnJvd05vbmVBdmFpbGFibGUhQ291cGxlZFRyYW5zcG9ydHMoKTsKKyAgfQorfQorCitTaXplR2VuZXJhdG9yIGdldEdlbmVyYXRvcihUKShUIHQpIHsKKyAgc3RhdGljIGlmIChpcyhUIDogU2l6ZUdlbmVyYXRvcikpIHsKKyAgICByZXR1cm4gdDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbmV3IENvbnN0YW50U2l6ZUdlbmVyYXRvcih0KTsKKyAgfQorfQorCit0ZW1wbGF0ZSBXcmFwcGVkVHJhbnNwb3J0cyhUKSBpZiAoaXNDb3VwbGVkVHJhbnNwb3J0cyFUKSB7CisgIGFsaWFzIFR5cGVUdXBsZSEoCisgICAgVCwKKyAgICBDb3VwbGVkQnVmZmVyZWRUcmFuc3BvcnRzIVQsCisgICAgQ291cGxlZEZyYW1lZFRyYW5zcG9ydHMhVCwKKyAgICBDb3VwbGVkWmxpYlRyYW5zcG9ydHMhVAorICApIFdyYXBwZWRUcmFuc3BvcnRzOworfQorCit2b2lkIHRlc3RSdyhDLCBSLCBTKSgKKyAgc2l6ZV90IHRvdGFsU2l6ZSwKKyAgUiB3U2l6ZSwKKyAgUyByU2l6ZQorKSBpZiAoCisgIGlzQ291cGxlZFRyYW5zcG9ydHMhQyAmJiBpcyh0eXBlb2YoZ2V0R2VuZXJhdG9yKHdTaXplKSkpICYmCisgIGlzKHR5cGVvZihnZXRHZW5lcmF0b3IoclNpemUpKSkKKykgeworICB0ZXN0UnchQyh0b3RhbFNpemUsIHdTaXplLCByU2l6ZSwgMCwgMCwgMCk7Cit9CisKK3ZvaWQgdGVzdFJ3KEMsIFIsIFMsIFQsIFUpKAorICBzaXplX3QgdG90YWxTaXplLAorICBSIHdTaXplLAorICBTIHJTaXplLAorICBUIHdDaHVua1NpemUsCisgIFUgckNodW5rU2l6ZSwKKyAgc2l6ZV90IG1heE91dHN0YW5kaW5nID0gMAorKSBpZiAoCisgIGlzQ291cGxlZFRyYW5zcG9ydHMhQyAmJiBpcyh0eXBlb2YoZ2V0R2VuZXJhdG9yKHdTaXplKSkpICYmCisgIGlzKHR5cGVvZihnZXRHZW5lcmF0b3IoclNpemUpKSkgJiYgaXModHlwZW9mKGdldEdlbmVyYXRvcih3Q2h1bmtTaXplKSkpICYmCisgIGlzKHR5cGVvZihnZXRHZW5lcmF0b3IockNodW5rU2l6ZSkpKQorKSB7CisgIGZvcmVhY2ggKFQ7IFdyYXBwZWRUcmFuc3BvcnRzIUMpIHsKKyAgICBkb1J3VGVzdCFUKAorICAgICAgdG90YWxTaXplLAorICAgICAgZ2V0R2VuZXJhdG9yKHdTaXplKSwKKyAgICAgIGdldEdlbmVyYXRvcihyU2l6ZSksCisgICAgICBnZXRHZW5lcmF0b3Iod0NodW5rU2l6ZSksCisgICAgICBnZXRHZW5lcmF0b3IockNodW5rU2l6ZSksCisgICAgICBtYXhPdXRzdGFuZGluZworICAgICk7CisgIH0KK30KKwordm9pZCB0ZXN0QmxvY2tpbmcoQykoKSBpZiAoaXNDb3VwbGVkVHJhbnNwb3J0cyFDKSB7CisgIGZvcmVhY2ggKFQ7IFdyYXBwZWRUcmFuc3BvcnRzIUMpIHsKKyAgICBkb0Jsb2NraW5nVGVzdCFUKCk7CisgIH0KK30KKworLy8gQSBxdWljayBoYWNrLCBmb3IgdGhlIHNha2Ugb2YgYnJldml0eeKApgorZmxvYXQgZ19zaXplTXVsdGlwbGllciA9IDE7CisKK3ZlcnNpb24gKFBvc2l4KSB7CisgIGltbXV0YWJsZSBkZWZhdWx0VGVtcERpciA9ICIvdG1wIjsKK30gZWxzZSB2ZXJzaW9uIChXaW5kb3dzKSB7CisgIGltcG9ydCBjb3JlLnN5cy53aW5kb3dzLndpbmRvd3M7CisgIGV4dGVybihXaW5kb3dzKSBEV09SRCBHZXRUZW1wUGF0aEEoRFdPUkQgbkJ1ZmZlckxlbmd0aCwgTFBUU1RSIGxwQnVmZmVyKTsKKworICBzdHJpbmcgZGVmYXVsdFRlbXBEaXIoKSBAcHJvcGVydHkgeworICAgIGNoYXJbTUFYX1BBVEggKyAxXSBkaXI7CisgICAgZW5mb3JjZShHZXRUZW1wUGF0aEEoZGlyLmxlbmd0aCwgZGlyLnB0cikpOworICAgIHJldHVybiB0byFzdHJpbmcoZGlyLnB0cilbMCAuLiAkIC0gMV07CisgIH0KK30gZWxzZSBzdGF0aWMgYXNzZXJ0KGZhbHNlKTsKKwordm9pZCBtYWluKHN0cmluZ1tdIGFyZ3MpIHsKKyAgaW50IHNlZWQgPSB1bnByZWRpY3RhYmxlU2VlZCgpOworICBzdHJpbmcgdG1wRGlyID0gZGVmYXVsdFRlbXBEaXI7CisKKyAgZ2V0b3B0KGFyZ3MsICJzZWVkIiwgJnNlZWQsICJzaXplLW11bHRpcGxpZXIiLCAmZ19zaXplTXVsdGlwbGllciwKKyAgICAidG1wLWRpciIsICZ0bXBEaXIpOworICBlbmZvcmNlKGdfc2l6ZU11bHRpcGxpZXIgPj0gMCwgIlNpemUgbXVsdGlwbGllciBtdXN0IG5vdCBiZSBuZWdhdGl2ZS4iKTsKKworICB3cml0ZWZsbigiVXNpbmcgc2VlZDogJXMiLCBzZWVkKTsKKyAgcm5kR2VuKCkuc2VlZChzZWVkKTsKKyAgQ291cGxlZEZpbGVUcmFuc3BvcnRzLnRtcERpciA9IHRtcERpcjsKKworICBhdXRvIHJhbmQ0ayA9IG5ldyBSYW5kb21TaXplR2VuZXJhdG9yKDEsIDQwOTYpOworCisgIC8qCisgICAqIFdlIGRvIHRoZSBiYXNpY2FsbHkgdGhlIHNhbWUgc2V0IG9mIHRlc3RzIGZvciBlYWNoIHRyYW5zcG9ydCB0eXBlLAorICAgKiBhbHRob3VnaCB3ZSB0d2VhayB0aGUgcGFyYW1ldGVycyBpbiBzb21lIHBsYWNlcy4KKyAgICovCisKKyAgLy8gVE1lbW9yeUJ1ZmZlciB0ZXN0cworICB0ZXN0UnchQ291cGxlZE1lbW9yeUJ1ZmZlcnMoMTAyNCAqIDEwMjQsIDAsIDApOworICB0ZXN0UnchQ291cGxlZE1lbW9yeUJ1ZmZlcnMoMTAyNCAqIDI1NiwgcmFuZDRrLCByYW5kNGspOworICB0ZXN0UnchQ291cGxlZE1lbW9yeUJ1ZmZlcnMoMTAyNCAqIDI1NiwgMTY3LCAxNjMpOworICB0ZXN0UnchQ291cGxlZE1lbW9yeUJ1ZmZlcnMoMTAyNCAqIDE2LCAxLCAxKTsKKworICB0ZXN0UnchQ291cGxlZE1lbW9yeUJ1ZmZlcnMoMTAyNCAqIDI1NiwgMCwgMCwgcmFuZDRrLCByYW5kNGspOworICB0ZXN0UnchQ291cGxlZE1lbW9yeUJ1ZmZlcnMoMTAyNCAqIDI1NiwgcmFuZDRrLCByYW5kNGssIHJhbmQ0aywgcmFuZDRrKTsKKyAgdGVzdFJ3IUNvdXBsZWRNZW1vcnlCdWZmZXJzKDEwMjQgKiAyNTYsIDE2NywgMTYzLCByYW5kNGssIHJhbmQ0ayk7CisgIHRlc3RSdyFDb3VwbGVkTWVtb3J5QnVmZmVycygxMDI0ICogMTYsIDEsIDEsIHJhbmQ0aywgcmFuZDRrKTsKKworICB0ZXN0QmxvY2tpbmchQ291cGxlZE1lbW9yeUJ1ZmZlcnMoKTsKKworICAvLyBUU29ja2V0IHRlc3RzCisgIGVudW0gc29ja2V0TWF4T3V0c3RhbmRpbmcgPSA0MDk2OworICB0ZXN0UnchQ291cGxlZFNvY2tldFRyYW5zcG9ydHMoMTAyNCAqIDEwMjQsIDAsIDAsCisgICAgICAgICAgMCwgMCwgc29ja2V0TWF4T3V0c3RhbmRpbmcpOworICB0ZXN0UnchQ291cGxlZFNvY2tldFRyYW5zcG9ydHMoMTAyNCAqIDI1NiwgcmFuZDRrLCByYW5kNGssCisgICAgICAgICAgMCwgMCwgc29ja2V0TWF4T3V0c3RhbmRpbmcpOworICB0ZXN0UnchQ291cGxlZFNvY2tldFRyYW5zcG9ydHMoMTAyNCAqIDI1NiwgMTY3LCAxNjMsCisgICAgICAgICAgMCwgMCwgc29ja2V0TWF4T3V0c3RhbmRpbmcpOworICAvLyBEb2guICBBcHBhcmVudGx5IHdyaXRpbmcgdG8gYSBzb2NrZXQgaGFzIHNvbWUgYWRkaXRpb25hbCBvdmVyaGVhZCBmb3IKKyAgLy8gZWFjaCBzZW5kKCkgY2FsbC4gIElmIHdlIGhhdmUgbW9yZSB0aGFuIH40MDAgb3V0c3RhbmRpbmcgMS1ieXRlIHdyaXRlCisgIC8vIHJlcXVlc3RzLCBhZGRpdGlvbmFsIHNlbmQoKSBjYWxscyBzdGFydCBibG9ja2luZy4KKyAgdGVzdFJ3IUNvdXBsZWRTb2NrZXRUcmFuc3BvcnRzKDEwMjQgKiAxNiwgMSwgMSwKKyAgICAgICAgICAwLCAwLCAyNTApOworICB0ZXN0UnchQ291cGxlZFNvY2tldFRyYW5zcG9ydHMoMTAyNCAqIDI1NiwgMCwgMCwKKyAgICAgICAgICByYW5kNGssIHJhbmQ0aywgc29ja2V0TWF4T3V0c3RhbmRpbmcpOworICB0ZXN0UnchQ291cGxlZFNvY2tldFRyYW5zcG9ydHMoMTAyNCAqIDI1NiwgcmFuZDRrLCByYW5kNGssCisgICAgICAgICAgcmFuZDRrLCByYW5kNGssIHNvY2tldE1heE91dHN0YW5kaW5nKTsKKyAgdGVzdFJ3IUNvdXBsZWRTb2NrZXRUcmFuc3BvcnRzKDEwMjQgKiAyNTYsIDE2NywgMTYzLAorICAgICAgICAgIHJhbmQ0aywgcmFuZDRrLCBzb2NrZXRNYXhPdXRzdGFuZGluZyk7CisgIHRlc3RSdyFDb3VwbGVkU29ja2V0VHJhbnNwb3J0cygxMDI0ICogMTYsIDEsIDEsCisgICAgICAgICAgcmFuZDRrLCByYW5kNGssIDI1MCk7CisKKyAgdGVzdEJsb2NraW5nIUNvdXBsZWRTb2NrZXRUcmFuc3BvcnRzKCk7CisKKyAgLy8gRmlsZSB0cmFuc3BvcnQgdGVzdHMuCisKKyAgLy8gQ2Fubm90IHdyaXRlIG1vcmUgdGhhbiB0aGUgZnJhbWUgc2l6ZSBhdCBvbmNlLgorICBlbnVtIG1heFdyaXRlQXRPbmNlID0gMTAyNCAqIDEwMjQgKiAxNiAtIDQ7CisKKyAgdGVzdFJ3IUNvdXBsZWRGaWxlVHJhbnNwb3J0cygxMDI0ICogMTAyNCwgbWF4V3JpdGVBdE9uY2UsIDApOworICB0ZXN0UnchQ291cGxlZEZpbGVUcmFuc3BvcnRzKDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrKTsKKyAgdGVzdFJ3IUNvdXBsZWRGaWxlVHJhbnNwb3J0cygxMDI0ICogMjU2LCAxNjcsIDE2Myk7CisgIHRlc3RSdyFDb3VwbGVkRmlsZVRyYW5zcG9ydHMoMTAyNCAqIDE2LCAxLCAxKTsKKworICB0ZXN0UnchQ291cGxlZEZpbGVUcmFuc3BvcnRzKDEwMjQgKiAyNTYsIDAsIDAsIHJhbmQ0aywgcmFuZDRrKTsKKyAgdGVzdFJ3IUNvdXBsZWRGaWxlVHJhbnNwb3J0cygxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOworICB0ZXN0UnchQ291cGxlZEZpbGVUcmFuc3BvcnRzKDEwMjQgKiAyNTYsIDE2NywgMTYzLCByYW5kNGssIHJhbmQ0ayk7CisgIHRlc3RSdyFDb3VwbGVkRmlsZVRyYW5zcG9ydHMoMTAyNCAqIDE2LCAxLCAxLCByYW5kNGssIHJhbmQ0ayk7CisKKyAgdGVzdEJsb2NraW5nIUNvdXBsZWRGaWxlVHJhbnNwb3J0cygpOworfQorCisKKy8qCisgKiBUaW1lciBoYW5kbGluZyBjb2RlIGZvciB1c2UgaW4gdGVzdHMgdGhhdCBjaGVjayB0aGUgdHJhbnNwb3J0IGJsb2NraW5nCisgKiBzZW1hbnRpY3MuCisgKgorICogVGhlIGltcGxlbWVudGF0aW9uIGhhcyBiZWVuIGhhY2tlZCB0b2dldGhlciBpbiBhIGh1cnJ5IGFuZCB3YXN0ZXMgYSBsb3Qgb2YKKyAqIHRocmVhZHMsIGJ1dCBzcGVlZCBzaG91bGQgbm90IGJlIHRoZSBjb25jZXJuIGhlcmUuCisgKi8KKworc3RydWN0IFRyaWdnZXIgeworICB0aGlzKER1cmF0aW9uIHRpbWVvdXQsIFRUcmFuc3BvcnQgdHJhbnNwb3J0LCBzaXplX3Qgd3JpdGVMZW5ndGgpIHsKKyAgICBtdXRleF8gPSBuZXcgTXV0ZXg7CisgICAgY2FuY2VsQ29uZGl0aW9uXyA9IG5ldyBDb25kaXRpb24obXV0ZXhfKTsKKyAgICBpbmZvXyA9IG5ldyBJbmZvKHRpbWVvdXQsIHRyYW5zcG9ydCwgd3JpdGVMZW5ndGgpOworICAgIHN0YXJ0VGhyZWFkKCk7CisgIH0KKworICB+dGhpcygpIHsKKyAgICBzeW5jaHJvbml6ZWQgKG11dGV4XykgeworICAgICAgaW5mb18gPSBudWxsOworICAgICAgY2FuY2VsQ29uZGl0aW9uXy5ub3RpZnlBbGwoKTsKKyAgICB9CisgICAgaWYgKHRocmVhZF8pIHRocmVhZF8uam9pbigpOworICB9CisKKyAgQGRpc2FibGUgdGhpcyh0aGlzKSB7IGFzc2VydCgwKTsgfQorCisgIHZvaWQgYWRkKER1cmF0aW9uIHRpbWVvdXQsIFRUcmFuc3BvcnQgdHJhbnNwb3J0LCBzaXplX3Qgd3JpdGVMZW5ndGgpIHsKKyAgICBzeW5jaHJvbml6ZWQgKG11dGV4XykgeworICAgICAgYXV0byBpbmZvID0gbmV3IEluZm8odGltZW91dCwgdHJhbnNwb3J0LCB3cml0ZUxlbmd0aCk7CisgICAgICBpZiAoaW5mb18pIHsKKyAgICAgICAgYXV0byBwcmV2ID0gaW5mb187CisgICAgICAgIHdoaWxlIChwcmV2Lm5leHQpIHByZXYgPSBwcmV2Lm5leHQ7CisgICAgICAgIHByZXYubmV4dCA9IGluZm87CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmZvXyA9IGluZm87CisgICAgICAgIHN0YXJ0VGhyZWFkKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgQHByb3BlcnR5IHNob3J0IGZpcmVkKCkgeworICAgIHJldHVybiBhdG9taWNMb2FkKGZpcmVkXyk7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCB0aW1lclRocmVhZCgpIHsKKyAgICAvLyBLTFVER0U6IE1ha2Ugc3VyZSB0aGUgc3RkLmNvbmN1cnJlbmN5IG1ib3ggaXMgaW5pdGlhbGl6ZWQgb24gdGhlIHRpbWVyCisgICAgLy8gdGhyZWFkIHRvIGJlIGFibGUgdG8gdW5ibG9jayB0aGUgZmlsZSB0cmFuc3BvcnQuCisgICAgaW1wb3J0IHN0ZC5jb25jdXJyZW5jeTsKKyAgICB0aGlzVGlkOworCisgICAgc3luY2hyb25pemVkIChtdXRleF8pIHsKKyAgICAgIHdoaWxlIChpbmZvXykgeworICAgICAgICBhdXRvIGNhbmNlbGxlZCA9IGNhbmNlbENvbmRpdGlvbl8ud2FpdChpbmZvXy50aW1lb3V0KTsKKyAgICAgICAgaWYgKGNhbmNlbGxlZCkgeworICAgICAgICAgIGluZm9fID0gbnVsbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGF0b21pY09wISIrPSIoZmlyZWRfLCAxKTsKKworICAgICAgICAvLyBXcml0ZSBzb21lIGRhdGEgdG8gdGhlIHRyYW5zcG9ydCB0byB1bmJsb2NrIGl0LgorICAgICAgICBhdXRvIGJ1ZiA9IG5ldyB1Ynl0ZVtpbmZvXy53cml0ZUxlbmd0aF07CisgICAgICAgIGJ1ZltdID0gJ2InOworICAgICAgICBpbmZvXy50cmFuc3BvcnQud3JpdGUoYnVmKTsKKyAgICAgICAgaW5mb18udHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgICAgaW5mb18gPSBpbmZvXy5uZXh0OworICAgICAgfQorICAgIH0KKworICAgIHRocmVhZF8gPSBudWxsOworICB9CisKKyAgdm9pZCBzdGFydFRocmVhZCgpIHsKKyAgICB0aHJlYWRfID0gbmV3IFRocmVhZCgmdGltZXJUaHJlYWQpOworICAgIHRocmVhZF8uc3RhcnQoKTsKKyAgfQorCisgIHN0cnVjdCBJbmZvIHsKKyAgICB0aGlzKER1cmF0aW9uIHRpbWVvdXQsIFRUcmFuc3BvcnQgdHJhbnNwb3J0LCBzaXplX3Qgd3JpdGVMZW5ndGgpIHsKKyAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7CisgICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICAgIHRoaXMud3JpdGVMZW5ndGggPSB3cml0ZUxlbmd0aDsKKyAgICB9CisKKyAgICBEdXJhdGlvbiB0aW1lb3V0OworICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0OworICAgIHNpemVfdCB3cml0ZUxlbmd0aDsKKyAgICBJbmZvKiBuZXh0OworICB9CisKKyAgSW5mbyogaW5mb187CisgIFRocmVhZCB0aHJlYWRfOworICBzaGFyZWQgc2hvcnQgZmlyZWRfOworCisgIGltcG9ydCBjb3JlLnN5bmMubXV0ZXg7CisgIE11dGV4IG11dGV4XzsKKyAgaW1wb3J0IGNvcmUuc3luYy5jb25kaXRpb247CisgIENvbmRpdGlvbiBjYW5jZWxDb25kaXRpb25fOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvLmFuYWx5c2lzX29wdGlvbnMgYi9saWIvZGFydC8uYW5hbHlzaXNfb3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvLmFuYWx5c2lzX29wdGlvbnMKQEAgLTAsMCArMSwyIEBACithbmFseXplcjoKKyAgc3Ryb25nLW1vZGU6IHRydWUKZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L0xJQ0VOU0UgYi9saWIvZGFydC9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYWNiNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9MSUNFTlNFCkBAIC0wLDAgKzEsMTYgQEAKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L01ha2VmaWxlLmFtIGIvbGliL2RhcnQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2ZGRjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCithbGwtbG9jYWw6CisJJChEQVJUUFVCKSBnZXQKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgLnB1YgorCWZpbmQgLiAtdHlwZSBkIC1uYW1lICJwYWNrYWdlcyIgfCB4YXJncyAkKFJNKSAtcgorCWZpbmQgLiAtdHlwZSBmIC1uYW1lICIucGFja2FnZXMiIHwgeGFyZ3MgJChSTSkKKwlmaW5kIC4gLXR5cGUgZiAtbmFtZSAicHVic3BlYy5sb2NrIiB8IHhhcmdzICQoUk0pCisKK2NoZWNrLWxvY2FsOiBhbGwKKworRVhUUkFfRElTVCA9IFwKKwkuYW5hbHlzaXNfb3B0aW9ucworCmRpZmYgLS1naXQgYS9saWIvZGFydC9SRUFETUUubWQgYi9saWIvZGFydC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJlMTY4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L1JFQURNRS5tZApAQCAtMCwwICsxLDI2IEBACitUaHJpZnQgRGFydCBMaWJyYXJ5CisKK0xpY2Vuc2UKKz09PT09PT0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKK1VzaW5nIFRocmlmdCB3aXRoIERhcnQKKz09PT09PT09PT09PT09PT09PT09CisKK0RhcnQgMS4xMi4wIG9yIG5ld2VyIGlzIHJlcXVpcmVkCmRpZmYgLS1naXQgYS9saWIvZGFydC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2RhcnQvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmY2MDAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxLDYgQEAKKyMgRGFydCBDb2RpbmcgU3RhbmRhcmRzCisKKyMjIyBQbGVhc2UgZm9sbG93OgorICogW1RocmlmdCBHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKKyAqIFtVc2UgZGFydGZtdF0oaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL3Rvb2xzL2RhcnRmbXQvKSBhbmQgZm9sbG93IHRoZSAKKyAgIFtEYXJ0IFN0eWxlIEd1aWRlXShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvYXJ0aWNsZXMvc3R5bGUtZ3VpZGUvKQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9icm93c2VyL3Rfd2ViX3NvY2tldC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9icm93c2VyL3Rfd2ViX3NvY2tldC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NjkzYjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL2Jyb3dzZXIvdF93ZWJfc29ja2V0LmRhcnQKQEAgLTAsMCArMSwxMzAgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC5zcmMuYnJvd3NlcjsKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IEJBU0U2NDsKK2ltcG9ydCAnZGFydDpodG1sJyBzaG93IENsb3NlRXZlbnQ7CitpbXBvcnQgJ2RhcnQ6aHRtbCcgc2hvdyBFdmVudDsKK2ltcG9ydCAnZGFydDpodG1sJyBzaG93IE1lc3NhZ2VFdmVudDsKK2ltcG9ydCAnZGFydDpodG1sJyBzaG93IFdlYlNvY2tldDsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CisKKy8vLyBBIFtUU29ja2V0XSBiYWNrZWQgYnkgYSBbV2ViU29ja2V0XSBmcm9tIGRhcnQ6aHRtbAorY2xhc3MgVFdlYlNvY2tldCBpbXBsZW1lbnRzIFRTb2NrZXQgeworICBmaW5hbCBVcmkgdXJsOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8VFNvY2tldFN0YXRlPiBfb25TdGF0ZUNvbnRyb2xsZXI7CisgIFN0cmVhbTxUU29ja2V0U3RhdGU+IGdldCBvblN0YXRlID0+IF9vblN0YXRlQ29udHJvbGxlci5zdHJlYW07CisKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxPYmplY3Q+IF9vbkVycm9yQ29udHJvbGxlcjsKKyAgU3RyZWFtPE9iamVjdD4gZ2V0IG9uRXJyb3IgPT4gX29uRXJyb3JDb250cm9sbGVyLnN0cmVhbTsKKworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPFVpbnQ4TGlzdD4gX29uTWVzc2FnZUNvbnRyb2xsZXI7CisgIFN0cmVhbTxVaW50OExpc3Q+IGdldCBvbk1lc3NhZ2UgPT4gX29uTWVzc2FnZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIGZpbmFsIExpc3Q8VWludDhMaXN0PiBfcmVxdWVzdHMgPSBbXTsKKworICBUV2ViU29ja2V0KHRoaXMudXJsKQorICAgICAgOiBfb25TdGF0ZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSwKKyAgICAgICAgX29uRXJyb3JDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCksCisgICAgICAgIF9vbk1lc3NhZ2VDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCkgeworICAgIGlmICh1cmwgPT0gbnVsbCB8fCAhdXJsLmhhc0F1dGhvcml0eSB8fCAhdXJsLmhhc1BvcnQpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdJbnZhbGlkIHVybCcpOworICAgIH0KKyAgfQorCisgIFdlYlNvY2tldCBfc29ja2V0OworCisgIGJvb2wgZ2V0IGlzT3BlbiA9PiBfc29ja2V0ICE9IG51bGwgJiYgX3NvY2tldC5yZWFkeVN0YXRlID09IFdlYlNvY2tldC5PUEVOOworCisgIGJvb2wgZ2V0IGlzQ2xvc2VkID0+CisgICAgICBfc29ja2V0ID09IG51bGwgfHwgX3NvY2tldC5yZWFkeVN0YXRlID09IFdlYlNvY2tldC5DTE9TRUQ7CisKKyAgRnV0dXJlIG9wZW4oKSB7CisgICAgaWYgKCFpc0Nsb3NlZCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcigKKyAgICAgICAgICBUVHJhbnNwb3J0RXJyb3JUeXBlLkFMUkVBRFlfT1BFTiwgJ1NvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCcpOworICAgIH0KKworICAgIF9zb2NrZXQgPSBuZXcgV2ViU29ja2V0KHVybC50b1N0cmluZygpKTsKKyAgICBfc29ja2V0Lm9uRXJyb3IubGlzdGVuKF9vbkVycm9yKTsKKyAgICBfc29ja2V0Lm9uT3Blbi5saXN0ZW4oX29uT3Blbik7CisgICAgX3NvY2tldC5vbkNsb3NlLmxpc3Rlbihfb25DbG9zZSk7CisgICAgX3NvY2tldC5vbk1lc3NhZ2UubGlzdGVuKF9vbk1lc3NhZ2UpOworCisgICAgcmV0dXJuIF9zb2NrZXQub25PcGVuLmZpcnN0OworICB9CisKKyAgRnV0dXJlIGNsb3NlKCkgeworICAgIGlmIChfc29ja2V0ICE9IG51bGwpIHsKKyAgICAgIF9zb2NrZXQuY2xvc2UoKTsKKyAgICAgIHJldHVybiBfc29ja2V0Lm9uQ2xvc2UuZmlyc3Q7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKCk7CisgICAgfQorICB9CisKKyAgdm9pZCBzZW5kKFVpbnQ4TGlzdCBkYXRhKSB7CisgICAgX3JlcXVlc3RzLmFkZChkYXRhKTsKKyAgICBfc2VuZFJlcXVlc3RzKCk7CisgIH0KKworICB2b2lkIF9zZW5kUmVxdWVzdHMoKSB7CisgICAgd2hpbGUgKGlzT3BlbiAmJiBfcmVxdWVzdHMuaXNOb3RFbXB0eSkgeworICAgICAgVWludDhMaXN0IGRhdGEgPSBfcmVxdWVzdHMucmVtb3ZlQXQoMCk7CisgICAgICBfc29ja2V0LnNlbmRTdHJpbmcoQkFTRTY0LmVuY29kZShkYXRhKSk7CisgICAgfQorICB9CisKKyAgdm9pZCBfb25PcGVuKEV2ZW50IGV2ZW50KSB7CisgICAgX29uU3RhdGVDb250cm9sbGVyLmFkZChUU29ja2V0U3RhdGUuT1BFTik7CisgICAgX3NlbmRSZXF1ZXN0cygpOworICB9CisKKyAgdm9pZCBfb25DbG9zZShDbG9zZUV2ZW50IGV2ZW50KSB7CisgICAgX3NvY2tldCA9IG51bGw7CisKKyAgICBpZiAoX3JlcXVlc3RzLmlzTm90RW1wdHkpIHsKKyAgICAgIF9vbkVycm9yQ29udHJvbGxlcgorICAgICAgICAgIC5hZGQobmV3IFN0YXRlRXJyb3IoJ1NvY2tldCB3YXMgY2xvc2VkIHdpdGggcGVuZGluZyByZXF1ZXN0cycpKTsKKyAgICB9CisgICAgX3JlcXVlc3RzLmNsZWFyKCk7CisKKyAgICBfb25TdGF0ZUNvbnRyb2xsZXIuYWRkKFRTb2NrZXRTdGF0ZS5DTE9TRUQpOworICB9CisKKyAgdm9pZCBfb25NZXNzYWdlKE1lc3NhZ2VFdmVudCBtZXNzYWdlKSB7CisgICAgdHJ5IHsKKyAgICAgIFVpbnQ4TGlzdCBkYXRhID0KKyAgICAgICAgICBuZXcgVWludDhMaXN0LmZyb21MaXN0KEJBU0U2NC5kZWNvZGUobWVzc2FnZS5kYXRhKSk7CisgICAgICBfb25NZXNzYWdlQ29udHJvbGxlci5hZGQoZGF0YSk7CisgICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKF8pIHsKKyAgICAgIHZhciBlcnJvciA9IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLAorICAgICAgICAgICJFeHBlY3RlZCBhIEJhc2UgNjQgZW5jb2RlZCBzdHJpbmcuIik7CisgICAgICBfb25FcnJvckNvbnRyb2xsZXIuYWRkKGVycm9yKTsKKyAgICB9CisgIH0KKworICB2b2lkIF9vbkVycm9yKEV2ZW50IGV2ZW50KSB7CisgICAgY2xvc2UoKTsKKyAgICBfb25FcnJvckNvbnRyb2xsZXIuYWRkKGV2ZW50LnRvU3RyaW5nKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL2NvbnNvbGUvdF90Y3Bfc29ja2V0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL2NvbnNvbGUvdF90Y3Bfc29ja2V0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcxNDgwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvY29uc29sZS90X3RjcF9zb2NrZXQuZGFydApAQCAtMCwwICsxLDgxIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQuc3JjLmNvbnNvbGUudF90Y3Bfc29ja2V0OworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmlvJzsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CisKKy8vLyBBIFtUU29ja2V0XSBiYWNrZWQgYnkgYSBbU29ja2V0XSBmcm9tIGRhcnQ6aW8KK2NsYXNzIFRUY3BTb2NrZXQgaW1wbGVtZW50cyBUU29ja2V0IHsKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxUU29ja2V0U3RhdGU+IF9vblN0YXRlQ29udHJvbGxlcjsKKyAgU3RyZWFtPFRTb2NrZXRTdGF0ZT4gZ2V0IG9uU3RhdGUgPT4gX29uU3RhdGVDb250cm9sbGVyLnN0cmVhbTsKKworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPE9iamVjdD4gX29uRXJyb3JDb250cm9sbGVyOworICBTdHJlYW08T2JqZWN0PiBnZXQgb25FcnJvciA9PiBfb25FcnJvckNvbnRyb2xsZXIuc3RyZWFtOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8VWludDhMaXN0PiBfb25NZXNzYWdlQ29udHJvbGxlcjsKKyAgU3RyZWFtPFVpbnQ4TGlzdD4gZ2V0IG9uTWVzc2FnZSA9PiBfb25NZXNzYWdlQ29udHJvbGxlci5zdHJlYW07CisKKyAgVFRjcFNvY2tldChTb2NrZXQgc29ja2V0KQorICAgICAgOiBfb25TdGF0ZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSwKKyAgICAgICAgX29uRXJyb3JDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCksCisgICAgICAgIF9vbk1lc3NhZ2VDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCkgeworICAgIGlmIChzb2NrZXQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgnc29ja2V0Jyk7CisgICAgfQorCisgICAgX3NvY2tldCA9IHNvY2tldDsKKyAgICBfc29ja2V0Lmxpc3Rlbihfb25NZXNzYWdlLCBvbkVycm9yOiBfb25FcnJvciwgb25Eb25lOiBjbG9zZSk7CisgIH0KKworICBTb2NrZXQgX3NvY2tldDsKKworICBib29sIGdldCBpc09wZW4gPT4gX3NvY2tldCAhPSBudWxsOworCisgIGJvb2wgZ2V0IGlzQ2xvc2VkID0+IF9zb2NrZXQgPT0gbnVsbDsKKworICBGdXR1cmUgb3BlbigpIGFzeW5jIHsKKyAgICBfb25TdGF0ZUNvbnRyb2xsZXIuYWRkKFRTb2NrZXRTdGF0ZS5PUEVOKTsKKyAgfQorCisgIEZ1dHVyZSBjbG9zZSgpIGFzeW5jIHsKKyAgICBpZiAoX3NvY2tldCAhPSBudWxsKSB7CisgICAgICBhd2FpdCBfc29ja2V0LmNsb3NlKCk7CisgICAgICBfc29ja2V0ID0gbnVsbDsKKyAgICB9CisKKyAgICBfb25TdGF0ZUNvbnRyb2xsZXIuYWRkKFRTb2NrZXRTdGF0ZS5DTE9TRUQpOworICB9CisKKyAgdm9pZCBzZW5kKFVpbnQ4TGlzdCBkYXRhKSB7CisgICAgX3NvY2tldC5hZGQoZGF0YSk7CisgIH0KKworICB2b2lkIF9vbk1lc3NhZ2UoTGlzdDxpbnQ+IG1lc3NhZ2UpIHsKKyAgICBVaW50OExpc3QgZGF0YSA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QobWVzc2FnZSk7CisgICAgX29uTWVzc2FnZUNvbnRyb2xsZXIuYWRkKGRhdGEpOworICB9CisKKyAgdm9pZCBfb25FcnJvcihPYmplY3QgZXJyb3IpIHsKKyAgICBjbG9zZSgpOworICAgIF9vbkVycm9yQ29udHJvbGxlci5hZGQoJyRlcnJvcicpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL2NvbnNvbGUvdF93ZWJfc29ja2V0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL2NvbnNvbGUvdF93ZWJfc29ja2V0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkNzI4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvY29uc29sZS90X3dlYl9zb2NrZXQuZGFydApAQCAtMCwwICsxLDg5IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQuc3JjLmNvbnNvbGUudF93ZWJfc29ja2V0OworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgQkFTRTY0OworaW1wb3J0ICdkYXJ0OmlvJzsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CisKKy8vLyBBIFtUU29ja2V0XSBiYWNrZWQgYnkgYSBbV2ViU29ja2V0XSBmcm9tIGRhcnQ6aW8KK2NsYXNzIFRXZWJTb2NrZXQgaW1wbGVtZW50cyBUU29ja2V0IHsKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxUU29ja2V0U3RhdGU+IF9vblN0YXRlQ29udHJvbGxlcjsKKyAgU3RyZWFtPFRTb2NrZXRTdGF0ZT4gZ2V0IG9uU3RhdGUgPT4gX29uU3RhdGVDb250cm9sbGVyLnN0cmVhbTsKKworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPE9iamVjdD4gX29uRXJyb3JDb250cm9sbGVyOworICBTdHJlYW08T2JqZWN0PiBnZXQgb25FcnJvciA9PiBfb25FcnJvckNvbnRyb2xsZXIuc3RyZWFtOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8VWludDhMaXN0PiBfb25NZXNzYWdlQ29udHJvbGxlcjsKKyAgU3RyZWFtPFVpbnQ4TGlzdD4gZ2V0IG9uTWVzc2FnZSA9PiBfb25NZXNzYWdlQ29udHJvbGxlci5zdHJlYW07CisKKyAgVFdlYlNvY2tldChXZWJTb2NrZXQgc29ja2V0KQorICAgICAgOiBfb25TdGF0ZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSwKKyAgICAgICAgX29uRXJyb3JDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCksCisgICAgICAgIF9vbk1lc3NhZ2VDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCkgeworICAgIGlmIChzb2NrZXQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgnc29ja2V0Jyk7CisgICAgfQorCisgICAgX3NvY2tldCA9IHNvY2tldDsKKyAgICBfc29ja2V0Lmxpc3Rlbihfb25NZXNzYWdlLCBvbkVycm9yOiBfb25FcnJvciwgb25Eb25lOiBjbG9zZSk7CisgIH0KKworICBXZWJTb2NrZXQgX3NvY2tldDsKKworICBib29sIGdldCBpc09wZW4gPT4gX3NvY2tldCAhPSBudWxsOworCisgIGJvb2wgZ2V0IGlzQ2xvc2VkID0+IF9zb2NrZXQgPT0gbnVsbDsKKworICBGdXR1cmUgb3BlbigpIGFzeW5jIHsKKyAgICBfb25TdGF0ZUNvbnRyb2xsZXIuYWRkKFRTb2NrZXRTdGF0ZS5PUEVOKTsKKyAgfQorCisgIEZ1dHVyZSBjbG9zZSgpIGFzeW5jIHsKKyAgICBpZiAoX3NvY2tldCAhPSBudWxsKSB7CisgICAgICBhd2FpdCBfc29ja2V0LmNsb3NlKCk7CisgICAgICBfc29ja2V0ID0gbnVsbDsKKyAgICB9CisKKyAgICBfb25TdGF0ZUNvbnRyb2xsZXIuYWRkKFRTb2NrZXRTdGF0ZS5DTE9TRUQpOworICB9CisKKyAgdm9pZCBzZW5kKFVpbnQ4TGlzdCBkYXRhKSB7CisgICAgX3NvY2tldC5hZGQoQkFTRTY0LmVuY29kZShkYXRhKSk7CisgIH0KKworICB2b2lkIF9vbk1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICB0cnkgeworICAgICAgVWludDhMaXN0IGRhdGEgPQorICAgICAgICAgIG5ldyBVaW50OExpc3QuZnJvbUxpc3QoQkFTRTY0LmRlY29kZShtZXNzYWdlKSk7CisgICAgICBfb25NZXNzYWdlQ29udHJvbGxlci5hZGQoZGF0YSk7CisgICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKF8pIHsKKyAgICAgIHZhciBlcnJvciA9IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLAorICAgICAgICAgICJFeHBlY3RlZCBhIEJhc2UgNjQgZW5jb2RlZCBzdHJpbmcuIik7CisgICAgICBfb25FcnJvckNvbnRyb2xsZXIuYWRkKGVycm9yKTsKKyAgICB9CisgIH0KKworICB2b2lkIF9vbkVycm9yKE9iamVjdCBlcnJvcikgeworICAgIGNsb3NlKCk7CisgICAgX29uRXJyb3JDb250cm9sbGVyLmFkZCgnJGVycm9yJyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9iaW5hcnlfcHJvdG9jb2wuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9iaW5hcnlfcHJvdG9jb2wuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzg1ZDgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2JpbmFyeV9wcm90b2NvbC5kYXJ0CkBAIC0wLDAgKzEsMjgxIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5PFRCaW5hcnlQcm90b2NvbD4geworICBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KHt0aGlzLnN0cmljdFJlYWQ6IGZhbHNlLCB0aGlzLnN0cmljdFdyaXRlOiB0cnVlfSk7CisKKyAgZmluYWwgYm9vbCBzdHJpY3RSZWFkOworICBmaW5hbCBib29sIHN0cmljdFdyaXRlOworCisgIFRCaW5hcnlQcm90b2NvbCBnZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCwKKyAgICAgICAgc3RyaWN0UmVhZDogc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGU6IHN0cmljdFdyaXRlKTsKKyAgfQorfQorCisvLy8gQmluYXJ5IHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciBUaHJpZnQuCisvLy8KKy8vLyBBZGFwdGVkIGZyb20gdGhlIEMjIHZlcnNpb24uCitjbGFzcyBUQmluYXJ5UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgeworICBzdGF0aWMgY29uc3QgaW50IFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDA7CisgIHN0YXRpYyBjb25zdCBpbnQgVkVSU0lPTl8xID0gMHg4MDAxMDAwMDsKKworICBzdGF0aWMgY29uc3QgVXRmOENvZGVjIF91dGY4Q29kZWMgPSBjb25zdCBVdGY4Q29kZWMoKTsKKworICBmaW5hbCBib29sIHN0cmljdFJlYWQ7CisgIGZpbmFsIGJvb2wgc3RyaWN0V3JpdGU7CisKKyAgVEJpbmFyeVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0LAorICAgICAge3RoaXMuc3RyaWN0UmVhZDogZmFsc2UsIHRoaXMuc3RyaWN0V3JpdGU6IHRydWV9KQorICAgICAgOiBzdXBlcih0cmFuc3BvcnQpOworCisgIC8vLyB3cml0ZQorICB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICBpZiAoc3RyaWN0V3JpdGUpIHsKKyAgICAgIGludCB2ZXJzaW9uID0gVkVSU0lPTl8xIHwgbWVzc2FnZS50eXBlOworICAgICAgd3JpdGVJMzIodmVyc2lvbik7CisgICAgICB3cml0ZVN0cmluZyhtZXNzYWdlLm5hbWUpOworICAgICAgd3JpdGVJMzIobWVzc2FnZS5zZXFpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlU3RyaW5nKG1lc3NhZ2UubmFtZSk7CisgICAgICB3cml0ZUJ5dGUobWVzc2FnZS50eXBlKTsKKyAgICAgIHdyaXRlSTMyKG1lc3NhZ2Uuc2VxaWQpOworICAgIH0KKyAgfQorCisgIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkge30KKworICB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpIHt9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB7CisgICAgd3JpdGVCeXRlKGZpZWxkLnR5cGUpOworICAgIHdyaXRlSTE2KGZpZWxkLmlkKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHsKKyAgICB3cml0ZUJ5dGUoVFR5cGUuU1RPUCk7CisgIH0KKworICB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHsKKyAgICB3cml0ZUJ5dGUobWFwLmtleVR5cGUpOworICAgIHdyaXRlQnl0ZShtYXAudmFsdWVUeXBlKTsKKyAgICB3cml0ZUkzMihtYXAubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNYXBFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgeworICAgIHdyaXRlQnl0ZShsaXN0LmVsZW1lbnRUeXBlKTsKKyAgICB3cml0ZUkzMihsaXN0Lmxlbmd0aCk7CisgIH0KKworICB2b2lkIHdyaXRlTGlzdEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KSB7CisgICAgd3JpdGVCeXRlKHNldC5lbGVtZW50VHlwZSk7CisgICAgd3JpdGVJMzIoc2V0Lmxlbmd0aCk7CisgIH0KKworICB2b2lkIHdyaXRlU2V0RW5kKCkge30KKworICB2b2lkIHdyaXRlQm9vbChib29sIGIpIHsKKyAgICBpZiAoYiA9PSBudWxsKSBiID0gZmFsc2U7CisgICAgd3JpdGVCeXRlKGIgPyAxIDogMCk7CisgIH0KKworICBmaW5hbCBCeXRlRGF0YSBfYnl0ZU91dCA9IG5ldyBCeXRlRGF0YSgxKTsKKyAgdm9pZCB3cml0ZUJ5dGUoaW50IGJ5dGUpIHsKKyAgICBpZiAoYnl0ZSA9PSBudWxsKSBieXRlID0gMDsKKyAgICBfYnl0ZU91dC5zZXRVaW50OCgwLCBieXRlKTsKKyAgICB0cmFuc3BvcnQud3JpdGUoX2J5dGVPdXQuYnVmZmVyLmFzVWludDhMaXN0KCksIDAsIDEpOworICB9CisKKyAgZmluYWwgQnl0ZURhdGEgX2kxNk91dCA9IG5ldyBCeXRlRGF0YSgyKTsKKyAgdm9pZCB3cml0ZUkxNihpbnQgaTE2KSB7CisgICAgaWYgKGkxNiA9PSBudWxsKSBpMTYgPSAwOworICAgIF9pMTZPdXQuc2V0SW50MTYoMCwgaTE2KTsKKyAgICB0cmFuc3BvcnQud3JpdGUoX2kxNk91dC5idWZmZXIuYXNVaW50OExpc3QoKSwgMCwgMik7CisgIH0KKworICBmaW5hbCBCeXRlRGF0YSBfaTMyT3V0ID0gbmV3IEJ5dGVEYXRhKDQpOworICB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHsKKyAgICBpZiAoaTMyID09IG51bGwpIGkzMiA9IDA7CisgICAgX2kzMk91dC5zZXRJbnQzMigwLCBpMzIpOworICAgIHRyYW5zcG9ydC53cml0ZShfaTMyT3V0LmJ1ZmZlci5hc1VpbnQ4TGlzdCgpLCAwLCA0KTsKKyAgfQorCisgIGZpbmFsIFVpbnQ4TGlzdCBfaTY0T3V0ID0gbmV3IFVpbnQ4TGlzdCg4KTsKKyAgdm9pZCB3cml0ZUk2NChpbnQgaTY0KSB7CisgICAgaWYgKGk2NCA9PSBudWxsKSBpNjQgPSAwOworICAgIHZhciBpID0gbmV3IEludDY0KGk2NCk7CisgICAgdmFyIGJ0cyA9IGkudG9CeXRlcygpOworICAgIGZvciAodmFyIGogPSAwOyBqIDwgODsgaisrKSB7CisgICAgICBfaTY0T3V0W2pdID0gYnRzWzggLSBqIC0gMV07CisgICAgfQorICAgIHRyYW5zcG9ydC53cml0ZShfaTY0T3V0LCAwLCA4KTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHMpIHsKKyAgICB2YXIgYnl0ZXMgPSBzICE9IG51bGwgPyBfdXRmOENvZGVjLmVuY29kZShzKSA6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoW10pOworICAgIHdyaXRlSTMyKGJ5dGVzLmxlbmd0aCk7CisgICAgdHJhbnNwb3J0LndyaXRlKGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOworICB9CisKKyAgZmluYWwgQnl0ZURhdGEgX2RvdWJsZU91dCA9IG5ldyBCeXRlRGF0YSg4KTsKKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZCkgeworICAgIGlmIChkID09IG51bGwpIGQgPSAwLjA7CisgICAgX2RvdWJsZU91dC5zZXRGbG9hdDY0KDAsIGQpOworICAgIHRyYW5zcG9ydC53cml0ZShfZG91YmxlT3V0LmJ1ZmZlci5hc1VpbnQ4TGlzdCgpLCAwLCA4KTsKKyAgfQorCisgIHZvaWQgd3JpdGVCaW5hcnkoVWludDhMaXN0IGJ5dGVzKSB7CisgICAgdmFyIGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDsKKyAgICB3cml0ZUkzMihsZW5ndGgpOworICAgIHRyYW5zcG9ydC53cml0ZShieXRlcywgMCwgbGVuZ3RoKTsKKyAgfQorCisgIC8vLyByZWFkCisgIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB7CisgICAgU3RyaW5nIG5hbWU7CisgICAgaW50IHR5cGU7CisgICAgaW50IHNlcWlkOworCisgICAgaW50IHNpemUgPSByZWFkSTMyKCk7CisgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICBpbnQgdmVyc2lvbiA9IHNpemUgJiBWRVJTSU9OX01BU0s7CisgICAgICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OXzEpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICJCYWQgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luOiAkdmVyc2lvbiIpOworICAgICAgfQorICAgICAgdHlwZSA9IHNpemUgJiAweDAwMDAwMGZmOworICAgICAgbmFtZSA9IHJlYWRTdHJpbmcoKTsKKyAgICAgIHNlcWlkID0gcmVhZEkzMigpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoc3RyaWN0UmVhZCkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgIk1pc3NpbmcgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luIik7CisgICAgICB9CisgICAgICBuYW1lID0gX3JlYWRTdHJpbmcoc2l6ZSk7CisgICAgICB0eXBlID0gcmVhZEJ5dGUoKTsKKyAgICAgIHNlcWlkID0gcmVhZEkzMigpOworICAgIH0KKyAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG5hbWUsIHR5cGUsIHNlcWlkKTsKKyAgfQorCisgIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB7fQorCisgIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgeworICAgIHJldHVybiBuZXcgVFN0cnVjdCgpOworICB9CisKKyAgdm9pZCByZWFkU3RydWN0RW5kKCkge30KKworICBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSB7CisgICAgU3RyaW5nIG5hbWUgPSAiIjsKKyAgICBpbnQgdHlwZSA9IHJlYWRCeXRlKCk7CisgICAgaW50IGlkID0gdHlwZSAhPSBUVHlwZS5TVE9QID8gcmVhZEkxNigpIDogMDsKKworICAgIHJldHVybiBuZXcgVEZpZWxkKG5hbWUsIHR5cGUsIGlkKTsKKyAgfQorCisgIHZvaWQgcmVhZEZpZWxkRW5kKCkge30KKworICBUTWFwIHJlYWRNYXBCZWdpbigpIHsKKyAgICBpbnQga2V5VHlwZSA9IHJlYWRCeXRlKCk7CisgICAgaW50IHZhbHVlVHlwZSA9IHJlYWRCeXRlKCk7CisgICAgaW50IGxlbmd0aCA9IHJlYWRJMzIoKTsKKworICAgIHJldHVybiBuZXcgVE1hcChrZXlUeXBlLCB2YWx1ZVR5cGUsIGxlbmd0aCk7CisgIH0KKworICB2b2lkIHJlYWRNYXBFbmQoKSB7fQorCisgIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB7CisgICAgaW50IGVsZW1lbnRUeXBlID0gcmVhZEJ5dGUoKTsKKyAgICBpbnQgbGVuZ3RoID0gcmVhZEkzMigpOworCisgICAgcmV0dXJuIG5ldyBUTGlzdChlbGVtZW50VHlwZSwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgcmVhZExpc3RFbmQoKSB7fQorCisgIFRTZXQgcmVhZFNldEJlZ2luKCkgeworICAgIGludCBlbGVtZW50VHlwZSA9IHJlYWRCeXRlKCk7CisgICAgaW50IGxlbmd0aCA9IHJlYWRJMzIoKTsKKworICAgIHJldHVybiBuZXcgVFNldChlbGVtZW50VHlwZSwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgcmVhZFNldEVuZCgpIHt9CisKKyAgYm9vbCByZWFkQm9vbCgpID0+IHJlYWRCeXRlKCkgPT0gMTsKKworICBmaW5hbCBVaW50OExpc3QgX2J5dGVJbiA9IG5ldyBVaW50OExpc3QoMSk7CisgIGludCByZWFkQnl0ZSgpIHsKKyAgICB0cmFuc3BvcnQucmVhZEFsbChfYnl0ZUluLCAwLCAxKTsKKyAgICByZXR1cm4gX2J5dGVJbi5idWZmZXIuYXNCeXRlRGF0YSgpLmdldFVpbnQ4KDApOworICB9CisKKyAgZmluYWwgVWludDhMaXN0IF9pMTZJbiA9IG5ldyBVaW50OExpc3QoMik7CisgIGludCByZWFkSTE2KCkgeworICAgIHRyYW5zcG9ydC5yZWFkQWxsKF9pMTZJbiwgMCwgMik7CisgICAgcmV0dXJuIF9pMTZJbi5idWZmZXIuYXNCeXRlRGF0YSgpLmdldEludDE2KDApOworICB9CisKKyAgZmluYWwgVWludDhMaXN0IF9pMzJJbiA9IG5ldyBVaW50OExpc3QoNCk7CisgIGludCByZWFkSTMyKCkgeworICAgIHRyYW5zcG9ydC5yZWFkQWxsKF9pMzJJbiwgMCwgNCk7CisgICAgcmV0dXJuIF9pMzJJbi5idWZmZXIuYXNCeXRlRGF0YSgpLmdldEludDMyKDApOworICB9CisKKyAgZmluYWwgVWludDhMaXN0IF9pNjRJbiA9IG5ldyBVaW50OExpc3QoOCk7CisgIGludCByZWFkSTY0KCkgeworICAgIHRyYW5zcG9ydC5yZWFkQWxsKF9pNjRJbiwgMCwgOCk7CisgICAgdmFyIGkgPSBuZXcgSW50NjQuZnJvbUJ5dGVzQmlnRW5kaWFuKF9pNjRJbik7CisgICAgcmV0dXJuIGkudG9JbnQoKTsKKyAgfQorCisgIGZpbmFsIFVpbnQ4TGlzdCBfZG91YmxlSW4gPSBuZXcgVWludDhMaXN0KDgpOworICBkb3VibGUgcmVhZERvdWJsZSgpIHsKKyAgICB0cmFuc3BvcnQucmVhZEFsbChfZG91YmxlSW4sIDAsIDgpOworICAgIHJldHVybiBfZG91YmxlSW4uYnVmZmVyLmFzQnl0ZURhdGEoKS5nZXRGbG9hdDY0KDApOworICB9CisKKyAgU3RyaW5nIHJlYWRTdHJpbmcoKSB7CisgICAgaW50IHNpemUgPSByZWFkSTMyKCk7CisgICAgcmV0dXJuIF9yZWFkU3RyaW5nKHNpemUpOworICB9CisKKyAgU3RyaW5nIF9yZWFkU3RyaW5nKGludCBzaXplKSB7CisgICAgVWludDhMaXN0IHN0cmluZ0luID0gbmV3IFVpbnQ4TGlzdChzaXplKTsKKyAgICB0cmFuc3BvcnQucmVhZEFsbChzdHJpbmdJbiwgMCwgc2l6ZSk7CisgICAgcmV0dXJuIF91dGY4Q29kZWMuZGVjb2RlKHN0cmluZ0luKTsKKyAgfQorCisgIFVpbnQ4TGlzdCByZWFkQmluYXJ5KCkgeworICAgIGludCBsZW5ndGggPSByZWFkSTMyKCk7CisgICAgVWludDhMaXN0IGJpbmFyeUluID0gbmV3IFVpbnQ4TGlzdChsZW5ndGgpOworICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJpbmFyeUluLCAwLCBsZW5ndGgpOworICAgIHJldHVybiBiaW5hcnlJbjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2NvbXBhY3RfcHJvdG9jb2wuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9jb21wYWN0X3Byb3RvY29sLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJkNzY0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9jb21wYWN0X3Byb3RvY29sLmRhcnQKQEAgLTAsMCArMSw0NzAgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5PFRDb21wYWN0UHJvdG9jb2w+IHsKKyAgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKTsKKworICBUQ29tcGFjdFByb3RvY29sIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zcG9ydCk7CisgIH0KK30KKworLy8vIENvbXBhY3QgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIFRocmlmdC4KKy8vLworLy8vIFVzZSBvZiBmaXhudW0gbGlicmFyeSBpcyByZXF1aXJlZCBkdWUgdG8gYnVncyBsaWtlCisvLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzE1MzYxCisvLy8KKy8vLyBBZGFwdGVkIGZyb20gdGhlIEphdmEgdmVyc2lvbi4KK2NsYXNzIFRDb21wYWN0UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgeworICBzdGF0aWMgY29uc3QgaW50IFBST1RPQ09MX0lEID0gMHg4MjsKKyAgc3RhdGljIGNvbnN0IGludCBWRVJTSU9OID0gMTsKKyAgc3RhdGljIGNvbnN0IGludCBWRVJTSU9OX01BU0sgPSAweDFmOworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfTUFTSyA9IDB4RTA7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9CSVRTID0gMHgwNzsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX1NISUZUX0FNT1VOVCA9IDU7CisgIHN0YXRpYyBmaW5hbCBURmllbGQgVFNUT1AgPSBuZXcgVEZpZWxkKCIiLCBUVHlwZS5TVE9QLCAwKTsKKworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfQk9PTEVBTl9UUlVFID0gMHgwMTsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX0JPT0xFQU5fRkFMU0UgPSAweDAyOworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfQllURSA9IDB4MDM7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9JMTYgPSAweDA0OworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfSTMyID0gMHgwNTsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX0k2NCA9IDB4MDY7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9ET1VCTEUgPSAweDA3OworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfQklOQVJZID0gMHgwODsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX0xJU1QgPSAweDA5OworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfU0VUID0gMHgwQTsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX01BUCA9IDB4MEI7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9TVFJVQ1QgPSAweDBDOworCisgIHN0YXRpYyBmaW5hbCBMaXN0PGludD4gX3R5cGVNYXAgPSBuZXcgTGlzdC51bm1vZGlmaWFibGUobmV3IExpc3QoMTYpCisgICAgLi5bVFR5cGUuU1RPUF0gPSBUVHlwZS5TVE9QCisgICAgLi5bVFR5cGUuQk9PTF0gPSBUWVBFX0JPT0xFQU5fVFJVRQorICAgIC4uW1RUeXBlLkJZVEVdID0gVFlQRV9CWVRFCisgICAgLi5bVFR5cGUuSTE2XSA9IFRZUEVfSTE2CisgICAgLi5bVFR5cGUuSTMyXSA9IFRZUEVfSTMyCisgICAgLi5bVFR5cGUuSTY0XSA9IFRZUEVfSTY0CisgICAgLi5bVFR5cGUuRE9VQkxFXSA9IFRZUEVfRE9VQkxFCisgICAgLi5bVFR5cGUuU1RSSU5HXSA9IFRZUEVfQklOQVJZCisgICAgLi5bVFR5cGUuTElTVF0gPSBUWVBFX0xJU1QKKyAgICAuLltUVHlwZS5TRVRdID0gVFlQRV9TRVQKKyAgICAuLltUVHlwZS5NQVBdID0gVFlQRV9NQVAKKyAgICAuLltUVHlwZS5TVFJVQ1RdID0gVFlQRV9TVFJVQ1QpOworCisgIHN0YXRpYyBjb25zdCBVdGY4Q29kZWMgX3V0ZjhDb2RlYyA9IGNvbnN0IFV0ZjhDb2RlYygpOworCisgIC8vIFByZXRlbmQgdGhpcyBpcyBhIHN0YWNrCisgIERvdWJsZUxpbmtlZFF1ZXVlPGludD4gX2xhc3RGaWVsZCA9IG5ldyBEb3VibGVMaW5rZWRRdWV1ZTxpbnQ+KCk7CisgIGludCBfbGFzdEZpZWxkSWQgPSAwOworCisgIFRGaWVsZCBfYm9vbGVhbkZpZWxkID0gbnVsbDsKKyAgYm9vbCBfYm9vbFZhbHVlID0gbnVsbDsKKworICBmaW5hbCBVaW50OExpc3QgdGVtcExpc3QgPSBuZXcgVWludDhMaXN0KDEwKTsKKyAgZmluYWwgQnl0ZURhdGEgdGVtcEJEID0gbmV3IEJ5dGVEYXRhKDEwKTsKKworICBUQ29tcGFjdFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSA6IHN1cGVyKHRyYW5zcG9ydCk7CisKKyAgLy8vIFdyaXRlCisgIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgeworICAgIHdyaXRlQnl0ZShQUk9UT0NPTF9JRCk7CisgICAgd3JpdGVCeXRlKChWRVJTSU9OICYgVkVSU0lPTl9NQVNLKSB8CisgICAgICAgICgobWVzc2FnZS50eXBlIDw8IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfTUFTSykpOworICAgIF93cml0ZVZhckludDMyKG5ldyBJbnQzMihtZXNzYWdlLnNlcWlkKSk7CisgICAgd3JpdGVTdHJpbmcobWVzc2FnZS5uYW1lKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkge30KKworICB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpIHsKKyAgICBfbGFzdEZpZWxkLmFkZExhc3QoX2xhc3RGaWVsZElkKTsKKyAgICBfbGFzdEZpZWxkSWQgPSAwOworICB9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHsKKyAgICBfbGFzdEZpZWxkSWQgPSBfbGFzdEZpZWxkLnJlbW92ZUxhc3QoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkgeworICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkJPT0wpIHsKKyAgICAgIF9ib29sZWFuRmllbGQgPSBmaWVsZDsKKyAgICB9IGVsc2UgeworICAgICAgX3dyaXRlRmllbGRCZWdpbihmaWVsZCwgLTEpOworICAgIH0KKyAgfQorCisgIHZvaWQgX3dyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQsIGludCB0eXBlT3ZlcnJpZGUpIHsKKyAgICBpbnQgdHlwZVRvV3JpdGUgPQorICAgICAgICB0eXBlT3ZlcnJpZGUgPT0gLTEgPyBfZ2V0Q29tcGFjdFR5cGUoZmllbGQudHlwZSkgOiB0eXBlT3ZlcnJpZGU7CisKKyAgICBpZiAoZmllbGQuaWQgPiBfbGFzdEZpZWxkSWQgJiYgZmllbGQuaWQgLSBfbGFzdEZpZWxkSWQgPD0gMTUpIHsKKyAgICAgIHdyaXRlQnl0ZSgoZmllbGQuaWQgLSBfbGFzdEZpZWxkSWQpIDw8IDQgfCB0eXBlVG9Xcml0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlQnl0ZSh0eXBlVG9Xcml0ZSk7CisgICAgICB3cml0ZUkxNihmaWVsZC5pZCk7CisgICAgfQorCisgICAgX2xhc3RGaWVsZElkID0gZmllbGQuaWQ7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7CisgICAgd3JpdGVCeXRlKFRUeXBlLlNUT1ApOworICB9CisKKyAgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKSB7CisgICAgaWYgKG1hcC5sZW5ndGggPT0gMCkgeworICAgICAgd3JpdGVCeXRlKDApOworICAgIH0gZWxzZSB7CisgICAgICBfd3JpdGVWYXJJbnQzMihuZXcgSW50MzIobWFwLmxlbmd0aCkpOworICAgICAgd3JpdGVCeXRlKAorICAgICAgICAgIF9nZXRDb21wYWN0VHlwZShtYXAua2V5VHlwZSkgPDwgNCB8IF9nZXRDb21wYWN0VHlwZShtYXAudmFsdWVUeXBlKSk7CisgICAgfQorICB9CisKKyAgdm9pZCB3cml0ZU1hcEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB7CisgICAgX3dyaXRlQ29sbGVjdGlvbkJlZ2luKGxpc3QuZWxlbWVudFR5cGUsIGxpc3QubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVMaXN0RW5kKCkge30KKworICB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpIHsKKyAgICBfd3JpdGVDb2xsZWN0aW9uQmVnaW4oc2V0LmVsZW1lbnRUeXBlLCBzZXQubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTZXRFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVCb29sKGJvb2wgYikgeworICAgIGlmIChiID09IG51bGwpIGIgPSBmYWxzZTsKKyAgICBpZiAoX2Jvb2xlYW5GaWVsZCAhPSBudWxsKSB7CisgICAgICBfd3JpdGVGaWVsZEJlZ2luKAorICAgICAgICAgIF9ib29sZWFuRmllbGQsIGIgPyBUWVBFX0JPT0xFQU5fVFJVRSA6IFRZUEVfQk9PTEVBTl9GQUxTRSk7CisgICAgICBfYm9vbGVhbkZpZWxkID0gbnVsbDsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVCeXRlKGIgPyBUWVBFX0JPT0xFQU5fVFJVRSA6IFRZUEVfQk9PTEVBTl9GQUxTRSk7CisgICAgfQorICB9CisKKyAgdm9pZCB3cml0ZUJ5dGUoaW50IGIpIHsKKyAgICBpZiAoYiA9PSBudWxsKSBiID0gMDsKKyAgICB0ZW1wTGlzdFswXSA9IGI7CisgICAgdHJhbnNwb3J0LndyaXRlKHRlbXBMaXN0LCAwLCAxKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJMTYoaW50IGkxNikgeworICAgIGlmIChpMTYgPT0gbnVsbCkgaTE2ID0gMDsKKyAgICBfd3JpdGVWYXJJbnQzMihfaW50MzJUb1ppZ1phZyhuZXcgSW50MzIoaTE2KSkpOworICB9CisKKyAgdm9pZCB3cml0ZUkzMihpbnQgaTMyKSB7CisgICAgaWYgKGkzMiA9PSBudWxsKSBpMzIgPSAwOworICAgIF93cml0ZVZhckludDMyKF9pbnQzMlRvWmlnWmFnKG5ldyBJbnQzMihpMzIpKSk7CisgIH0KKworICB2b2lkIHdyaXRlSTY0KGludCBpNjQpIHsKKyAgICBpZiAoaTY0ID09IG51bGwpIGk2NCA9IDA7CisgICAgX3dyaXRlVmFySW50NjQoX2ludDY0VG9aaWdaYWcobmV3IEludDY0KGk2NCkpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGQpIHsKKyAgICBpZiAoZCA9PSBudWxsKSBkID0gMC4wOworICAgIHRlbXBCRC5zZXRGbG9hdDY0KDAsIGQsIEVuZGlhbm5lc3MuTElUVExFX0VORElBTik7CisgICAgdHJhbnNwb3J0LndyaXRlKHRlbXBCRC5idWZmZXIuYXNVaW50OExpc3QoKSwgMCwgOCk7CisgIH0KKworICB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpIHsKKyAgICBVaW50OExpc3QgYnl0ZXMgPQorICAgICAgICBzdHIgIT0gbnVsbCA/IF91dGY4Q29kZWMuZW5jb2RlKHN0cikgOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KFtdKTsKKyAgICB3cml0ZUJpbmFyeShieXRlcyk7CisgIH0KKworICB2b2lkIHdyaXRlQmluYXJ5KFVpbnQ4TGlzdCBieXRlcykgeworICAgIF93cml0ZVZhckludDMyKG5ldyBJbnQzMihieXRlcy5sZW5ndGgpKTsKKyAgICB0cmFuc3BvcnQud3JpdGUoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7CisgIH0KKworICB2b2lkIF93cml0ZVZhckludDMyKEludDMyIG4pIHsKKyAgICBpbnQgaWR4ID0gMDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKChuICYgfjB4N0YpID09IDApIHsKKyAgICAgICAgdGVtcExpc3RbaWR4KytdID0gKG4gJiAweEZGKS50b0ludCgpOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRlbXBMaXN0W2lkeCsrXSA9ICgoKG4gJiAweDdGKSB8IDB4ODApICYgMHhGRikudG9JbnQoKTsKKyAgICAgICAgbiA9IG4uc2hpZnRSaWdodFVuc2lnbmVkKDcpOworICAgICAgfQorICAgIH0KKyAgICB0cmFuc3BvcnQud3JpdGUodGVtcExpc3QsIDAsIGlkeCk7CisgIH0KKworICB2b2lkIF93cml0ZVZhckludDY0KEludDY0IG4pIHsKKyAgICBpbnQgaWR4ID0gMDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKChuICYgfjB4N0YpID09IDApIHsKKyAgICAgICAgdGVtcExpc3RbaWR4KytdID0gKG4gJiAweEZGKS50b0ludCgpOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRlbXBMaXN0W2lkeCsrXSA9ICgoKG4gJiAweDdGKSB8IDB4ODApICYgMHhGRikudG9JbnQoKTsKKyAgICAgICAgbiA9IG4uc2hpZnRSaWdodFVuc2lnbmVkKDcpOworICAgICAgfQorICAgIH0KKyAgICB0cmFuc3BvcnQud3JpdGUodGVtcExpc3QsIDAsIGlkeCk7CisgIH0KKworICB2b2lkIF93cml0ZUNvbGxlY3Rpb25CZWdpbihpbnQgZWxlbVR5cGUsIGludCBsZW5ndGgpIHsKKyAgICBpZiAobGVuZ3RoIDw9IDE0KSB7CisgICAgICB3cml0ZUJ5dGUobGVuZ3RoIDw8IDQgfCBfZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVCeXRlKDB4RjAgfCBfZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgICAgIF93cml0ZVZhckludDMyKG5ldyBJbnQzMihsZW5ndGgpKTsKKyAgICB9CisgIH0KKworICBJbnQzMiBfaW50MzJUb1ppZ1phZyhJbnQzMiBuKSB7CisgICAgcmV0dXJuIChuIDw8IDEpIF4gKG4gPj4gMzEpOworICB9CisKKyAgSW50NjQgX2ludDY0VG9aaWdaYWcoSW50NjQgbikgeworICAgIHJldHVybiAobiA8PCAxKSBeIChuID4+IDYzKTsKKyAgfQorCisgIC8vLyBSZWFkCisgIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB7CisgICAgaW50IHByb3RvY29sSWQgPSByZWFkQnl0ZSgpOworICAgIGlmIChwcm90b2NvbElkICE9IFBST1RPQ09MX0lEKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLkJBRF9WRVJTSU9OLAorICAgICAgICAgICdFeHBlY3RlZCBwcm90b2NvbCBpZCAkUFJPVE9DT0xfSUQgYnV0IGdvdCAkcHJvdG9jb2xJZCcpOworICAgIH0KKyAgICBpbnQgdmVyc2lvbkFuZFR5cGUgPSByZWFkQnl0ZSgpOworICAgIGludCB2ZXJzaW9uID0gdmVyc2lvbkFuZFR5cGUgJiBWRVJTSU9OX01BU0s7CisgICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTikgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5CQURfVkVSU0lPTiwKKyAgICAgICAgICAnRXhwZWN0ZWQgdmVyc2lvbiAkVkVSU0lPTiBidXQgZ290ICR2ZXJzaW9uJyk7CisgICAgfQorICAgIGludCB0eXBlID0gKHZlcnNpb25BbmRUeXBlID4+IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfQklUUzsKKyAgICBpbnQgc2VxSWQgPSBfcmVhZFZhckludDMyKCkudG9JbnQoKTsKKyAgICBTdHJpbmcgbWVzc2FnZU5hbWUgPSByZWFkU3RyaW5nKCk7CisgICAgcmV0dXJuIG5ldyBUTWVzc2FnZShtZXNzYWdlTmFtZSwgdHlwZSwgc2VxSWQpOworICB9CisKKyAgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHt9CisKKyAgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB7CisgICAgX2xhc3RGaWVsZC5hZGRMYXN0KF9sYXN0RmllbGRJZCk7CisgICAgX2xhc3RGaWVsZElkID0gMDsKKyAgICAvLyBUT0RPIG1ha2UgdGhpcyBhIGNvbnN0YW50PworICAgIHJldHVybiBuZXcgVFN0cnVjdCgpOworICB9CisKKyAgdm9pZCByZWFkU3RydWN0RW5kKCkgeworICAgIF9sYXN0RmllbGRJZCA9IF9sYXN0RmllbGQucmVtb3ZlTGFzdCgpOworICB9CisKKyAgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgeworICAgIGludCB0eXBlID0gcmVhZEJ5dGUoKTsKKyAgICBpZiAodHlwZSA9PSBUVHlwZS5TVE9QKSB7CisgICAgICByZXR1cm4gVFNUT1A7CisgICAgfQorCisgICAgaW50IGZpZWxkSWQ7CisgICAgaW50IG1vZGlmaWVyID0gKHR5cGUgJiAweEYwKSA+PiA0OworICAgIGlmIChtb2RpZmllciA9PSAwKSB7CisgICAgICBmaWVsZElkID0gcmVhZEkxNigpOworICAgIH0gZWxzZSB7CisgICAgICBmaWVsZElkID0gX2xhc3RGaWVsZElkICsgbW9kaWZpZXI7CisgICAgfQorCisgICAgVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgnJywgX2dldFRUeXBlKHR5cGUgJiAweDBGKSwgZmllbGRJZCk7CisgICAgaWYgKF9pc0Jvb2xUeXBlKHR5cGUpKSB7CisgICAgICBfYm9vbFZhbHVlID0gKHR5cGUgJiAweDBGKSA9PSBUWVBFX0JPT0xFQU5fVFJVRTsKKyAgICB9CisKKyAgICBfbGFzdEZpZWxkSWQgPSBmaWVsZC5pZDsKKyAgICByZXR1cm4gZmllbGQ7CisgIH0KKworICB2b2lkIHJlYWRGaWVsZEVuZCgpIHt9CisKKyAgVE1hcCByZWFkTWFwQmVnaW4oKSB7CisgICAgaW50IGxlbmd0aCA9IF9yZWFkVmFySW50MzIoKS50b0ludCgpOworICAgIF9jaGVja05lZ1JlYWRMZW5ndGgobGVuZ3RoKTsKKworICAgIGludCBrZXlBbmRWYWx1ZVR5cGUgPSBsZW5ndGggPT0gMCA/IDAgOiByZWFkQnl0ZSgpOworICAgIGludCBrZXlUeXBlID0gX2dldFRUeXBlKGtleUFuZFZhbHVlVHlwZSA+PiA0KTsKKyAgICBpbnQgdmFsdWVUeXBlID0gX2dldFRUeXBlKGtleUFuZFZhbHVlVHlwZSAmIDB4MEYpOworICAgIHJldHVybiBuZXcgVE1hcChrZXlUeXBlLCB2YWx1ZVR5cGUsIGxlbmd0aCk7CisgIH0KKworICB2b2lkIHJlYWRNYXBFbmQoKSB7fQorCisgIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB7CisgICAgaW50IGxlbmd0aEFuZFR5cGUgPSByZWFkQnl0ZSgpOworICAgIGludCBsZW5ndGggPSAobGVuZ3RoQW5kVHlwZSA+PiA0KSAmIDB4MEY7CisgICAgaWYgKGxlbmd0aCA9PSAxNSkgeworICAgICAgbGVuZ3RoID0gX3JlYWRWYXJJbnQzMigpLnRvSW50KCk7CisgICAgfQorICAgIF9jaGVja05lZ1JlYWRMZW5ndGgobGVuZ3RoKTsKKyAgICBpbnQgdHlwZSA9IF9nZXRUVHlwZShsZW5ndGhBbmRUeXBlKTsKKyAgICByZXR1cm4gbmV3IFRMaXN0KHR5cGUsIGxlbmd0aCk7CisgIH0KKworICB2b2lkIHJlYWRMaXN0RW5kKCkge30KKworICBUU2V0IHJlYWRTZXRCZWdpbigpIHsKKyAgICBUTGlzdCB0bGlzdCA9IHJlYWRMaXN0QmVnaW4oKTsKKyAgICByZXR1cm4gbmV3IFRTZXQodGxpc3QuZWxlbWVudFR5cGUsIHRsaXN0Lmxlbmd0aCk7CisgIH0KKworICB2b2lkIHJlYWRTZXRFbmQoKSB7fQorCisgIGJvb2wgcmVhZEJvb2woKSB7CisgICAgaWYgKF9ib29sVmFsdWUgIT0gbnVsbCkgeworICAgICAgYm9vbCByZXN1bHQgPSBfYm9vbFZhbHVlOworICAgICAgX2Jvb2xWYWx1ZSA9IG51bGw7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gcmVhZEJ5dGUoKSA9PSBUWVBFX0JPT0xFQU5fVFJVRTsKKyAgfQorCisgIGludCByZWFkQnl0ZSgpIHsKKyAgICB0cmFuc3BvcnQucmVhZEFsbCh0ZW1wTGlzdCwgMCwgMSk7CisgICAgcmV0dXJuIHRlbXBMaXN0LmJ1ZmZlci5hc0J5dGVEYXRhKCkuZ2V0VWludDgoMCk7CisgIH0KKworICBpbnQgcmVhZEkxNigpIHsKKyAgICByZXR1cm4gX3ppZ3phZ1RvSW50MzIoX3JlYWRWYXJJbnQzMigpKS50b0ludCgpOworICB9CisKKyAgaW50IHJlYWRJMzIoKSB7CisgICAgcmV0dXJuIF96aWd6YWdUb0ludDMyKF9yZWFkVmFySW50MzIoKSkudG9JbnQoKTsKKyAgfQorCisgIGludCByZWFkSTY0KCkgeworICAgIHJldHVybiBfemlnemFnVG9JbnQ2NChfcmVhZFZhckludDY0KCkpLnRvSW50KCk7CisgIH0KKworICBkb3VibGUgcmVhZERvdWJsZSgpIHsKKyAgICB0cmFuc3BvcnQucmVhZEFsbCh0ZW1wTGlzdCwgMCwgOCk7CisgICAgcmV0dXJuIHRlbXBMaXN0LmJ1ZmZlci5hc0J5dGVEYXRhKCkuZ2V0RmxvYXQ2NCgwLCBFbmRpYW5uZXNzLkxJVFRMRV9FTkRJQU4pOworICB9CisKKyAgU3RyaW5nIHJlYWRTdHJpbmcoKSB7CisgICAgaW50IGxlbmd0aCA9IF9yZWFkVmFySW50MzIoKS50b0ludCgpOworICAgIF9jaGVja05lZ1JlYWRMZW5ndGgobGVuZ3RoKTsKKworICAgIC8vIFRPRE8gbG9vayBhdCB1c2luZyB0ZW1wIGZvciBzbWFsbCBzdHJpbmdzPworICAgIFVpbnQ4TGlzdCBidWZmID0gbmV3IFVpbnQ4TGlzdChsZW5ndGgpOworICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmYsIDAsIGxlbmd0aCk7CisgICAgcmV0dXJuIF91dGY4Q29kZWMuZGVjb2RlKGJ1ZmYpOworICB9CisKKyAgVWludDhMaXN0IHJlYWRCaW5hcnkoKSB7CisgICAgaW50IGxlbmd0aCA9IF9yZWFkVmFySW50MzIoKS50b0ludCgpOworICAgIF9jaGVja05lZ1JlYWRMZW5ndGgobGVuZ3RoKTsKKworICAgIFVpbnQ4TGlzdCBidWZmID0gbmV3IFVpbnQ4TGlzdChsZW5ndGgpOworICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmYsIDAsIGxlbmd0aCk7CisgICAgcmV0dXJuIGJ1ZmY7CisgIH0KKworICBJbnQzMiBfcmVhZFZhckludDMyKCkgeworICAgIEludDMyIHJlc3VsdCA9IEludDMyLlpFUk87CisgICAgaW50IHNoaWZ0ID0gMDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgSW50MzIgYiA9IG5ldyBJbnQzMihyZWFkQnl0ZSgpKTsKKyAgICAgIHJlc3VsdCB8PSAoYiAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgaWYgKChiICYgMHg4MCkgIT0gMHg4MCkgYnJlYWs7CisgICAgICBzaGlmdCArPSA3OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgSW50NjQgX3JlYWRWYXJJbnQ2NCgpIHsKKyAgICBJbnQ2NCByZXN1bHQgPSBJbnQ2NC5aRVJPOworICAgIGludCBzaGlmdCA9IDA7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIEludDY0IGIgPSBuZXcgSW50NjQocmVhZEJ5dGUoKSk7CisgICAgICByZXN1bHQgfD0gKGIgJiAweDdmKSA8PCBzaGlmdDsKKyAgICAgIGlmICgoYiAmIDB4ODApICE9IDB4ODApIGJyZWFrOworICAgICAgc2hpZnQgKz0gNzsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIEludDMyIF96aWd6YWdUb0ludDMyKEludDMyIG4pIHsKKyAgICByZXR1cm4gKG4uc2hpZnRSaWdodFVuc2lnbmVkKDEpKSBeIC0obiAmIDEpOworICB9CisKKyAgSW50NjQgX3ppZ3phZ1RvSW50NjQoSW50NjQgbikgeworICAgIHJldHVybiAobi5zaGlmdFJpZ2h0VW5zaWduZWQoMSkpIF4gLShuICYgMSk7CisgIH0KKworICB2b2lkIF9jaGVja05lZ1JlYWRMZW5ndGgoaW50IGxlbmd0aCkgeworICAgIGlmIChsZW5ndGggPCAwKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLk5FR0FUSVZFX1NJWkUsICdOZWdhdGl2ZSBsZW5ndGg6ICRsZW5ndGgnKTsKKyAgICB9CisgIH0KKworICBpbnQgX2dldENvbXBhY3RUeXBlKGludCB0dHlwZSkgeworICAgIHJldHVybiBfdHlwZU1hcFt0dHlwZV07CisgIH0KKworICBpbnQgX2dldFRUeXBlKGludCB0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlICYgMHgwRikgeworICAgICAgY2FzZSBUVHlwZS5TVE9QOgorICAgICAgICByZXR1cm4gVFR5cGUuU1RPUDsKKyAgICAgIGNhc2UgVFlQRV9CT09MRUFOX0ZBTFNFOgorICAgICAgY2FzZSBUWVBFX0JPT0xFQU5fVFJVRToKKyAgICAgICAgcmV0dXJuIFRUeXBlLkJPT0w7CisgICAgICBjYXNlIFRZUEVfQllURToKKyAgICAgICAgcmV0dXJuIFRUeXBlLkJZVEU7CisgICAgICBjYXNlIFRZUEVfSTE2OgorICAgICAgICByZXR1cm4gVFR5cGUuSTE2OworICAgICAgY2FzZSBUWVBFX0kzMjoKKyAgICAgICAgcmV0dXJuIFRUeXBlLkkzMjsKKyAgICAgIGNhc2UgVFlQRV9JNjQ6CisgICAgICAgIHJldHVybiBUVHlwZS5JNjQ7CisgICAgICBjYXNlIFRZUEVfRE9VQkxFOgorICAgICAgICByZXR1cm4gVFR5cGUuRE9VQkxFOworICAgICAgY2FzZSBUWVBFX0JJTkFSWToKKyAgICAgICAgcmV0dXJuIFRUeXBlLlNUUklORzsKKyAgICAgIGNhc2UgVFlQRV9MSVNUOgorICAgICAgICByZXR1cm4gVFR5cGUuTElTVDsKKyAgICAgIGNhc2UgVFlQRV9TRVQ6CisgICAgICAgIHJldHVybiBUVHlwZS5TRVQ7CisgICAgICBjYXNlIFRZUEVfTUFQOgorICAgICAgICByZXR1cm4gVFR5cGUuTUFQOworICAgICAgY2FzZSBUWVBFX1NUUlVDVDoKKyAgICAgICAgcmV0dXJuIFRUeXBlLlNUUlVDVDsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcigKKyAgICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsICJVbmtub3duIHR5cGU6ICR7dHlwZSAmIDB4MEZ9Iik7CisgICAgfQorICB9CisKKyAgYm9vbCBfaXNCb29sVHlwZShpbnQgYikgeworICAgIGludCBsb3dlck5pYmJsZSA9IGIgJiAweDBGOworICAgIHJldHVybiBsb3dlck5pYmJsZSA9PSBUWVBFX0JPT0xFQU5fVFJVRSB8fAorICAgICAgICBsb3dlck5pYmJsZSA9PSBUWVBFX0JPT0xFQU5fRkFMU0U7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9maWVsZC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2ZpZWxkLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0YjRlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9maWVsZC5kYXJ0CkBAIC0wLDAgKzEsMjYgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVEZpZWxkIHsKKyAgZmluYWwgU3RyaW5nIG5hbWU7CisgIGZpbmFsIGludCB0eXBlOworICBmaW5hbCBpbnQgaWQ7CisKKyAgVEZpZWxkKHRoaXMubmFtZSwgdGhpcy50eXBlLCB0aGlzLmlkKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9qc29uX3Byb3RvY29sLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfanNvbl9wcm90b2NvbC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYmI3YzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfanNvbl9wcm90b2NvbC5kYXJ0CkBAIC0wLDAgKzEsNzg0IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRKc29uUHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeTxUSnNvblByb3RvY29sPiB7CisgIFRKc29uUHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICByZXR1cm4gbmV3IFRKc29uUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgfQorfQorCisvLy8gSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgVGhyaWZ0LgorLy8vCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBDIyB2ZXJzaW9uLgorY2xhc3MgVEpzb25Qcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbCB7CisgIHN0YXRpYyBjb25zdCBpbnQgVkVSU0lPTl8xID0gMTsKKworICBzdGF0aWMgY29uc3QgVXRmOENvZGVjIHV0ZjhDb2RlYyA9IGNvbnN0IFV0ZjhDb2RlYygpOworCisgIF9CYXNlQ29udGV4dCBfY29udGV4dDsKKyAgX0Jhc2VDb250ZXh0IF9yb290Q29udGV4dDsKKyAgX0xvb2thaGVhZFJlYWRlciBfcmVhZGVyOworCisgIGZpbmFsIExpc3Q8X0Jhc2VDb250ZXh0PiBfY29udGV4dFN0YWNrID0gW107CisgIGZpbmFsIFVpbnQ4TGlzdCBfdGVtcEJ1ZmZlciA9IG5ldyBVaW50OExpc3QoNCk7CisKKyAgVEpzb25Qcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgOiBzdXBlcih0cmFuc3BvcnQpIHsKKyAgICBfcm9vdENvbnRleHQgPSBuZXcgX0Jhc2VDb250ZXh0KHRoaXMpOworICAgIF9yZWFkZXIgPSBuZXcgX0xvb2thaGVhZFJlYWRlcih0aGlzKTsKKyAgICBfcmVzZXRDb250ZXh0KCk7CisgIH0KKworICB2b2lkIF9wdXNoQ29udGV4dChfQmFzZUNvbnRleHQgYykgeworICAgIF9jb250ZXh0U3RhY2suYWRkKGMpOworICAgIF9jb250ZXh0ID0gYzsKKyAgfQorCisgIHZvaWQgX3BvcENvbnRleHQoKSB7CisgICAgX2NvbnRleHRTdGFjay5yZW1vdmVMYXN0KCk7CisgICAgX2NvbnRleHQgPSBfY29udGV4dFN0YWNrLmlzRW1wdHkgPyBfcm9vdENvbnRleHQgOiBfY29udGV4dFN0YWNrLmxhc3Q7CisgIH0KKworICB2b2lkIF9yZXNldENvbnRleHQoKSB7CisgICAgX2NvbnRleHRTdGFjay5jbGVhcigpOworICAgIF9jb250ZXh0ID0gX3Jvb3RDb250ZXh0OworICB9CisKKyAgLy8vIFJlYWQgYSBieXRlIHRoYXQgbXVzdCBtYXRjaCBbY2hhcl07IG90aGVyd2lzZSB0aHJvdyBhIFtUUHJvdG9jb2xFcnJvcl0uCisgIHZvaWQgX3JlYWRKc29uU3ludGF4Q2hhcihpbnQgY2hhckJ5dGUpIHsKKyAgICBpbnQgYnl0ZSA9IF9yZWFkZXIucmVhZCgpOworICAgIGlmIChieXRlICE9IGNoYXJCeXRlKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwKKyAgICAgICAgICAiRXhwZWN0ZWQgY2hhcmFjdGVyICR7bmV3IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckJ5dGUpfSBidXQgZm91bmQ6ICR7bmV3IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZSl9Iik7CisgICAgfQorICB9CisKKyAgaW50IF9oZXhWYWwoaW50IGJ5dGUpIHsKKyAgICBpZiAoYnl0ZSA+PSBfQ29uc3RhbnRzLkhFWF8wX0JZVEVTWzBdICYmCisgICAgICAgIGJ5dGUgPD0gX0NvbnN0YW50cy5IRVhfOV9CWVRFU1swXSkgeworICAgICAgcmV0dXJuIGJ5dGUgLSBfQ29uc3RhbnRzLkhFWF8wX0JZVEVTWzBdOworICAgIH0gZWxzZSBpZiAoYnl0ZSA+PSBfQ29uc3RhbnRzLkhFWF9BX0JZVEVTWzBdICYmCisgICAgICAgIGJ5dGUgPD0gX0NvbnN0YW50cy5IRVhfRl9CWVRFU1swXSkgeworICAgICAgYnl0ZSArPSAxMDsKKyAgICAgIHJldHVybiBieXRlIC0gX0NvbnN0YW50cy5IRVhfQV9CWVRFU1swXTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBoZXggY2hhcmFjdGVyIik7CisgICAgfQorICB9CisKKyAgaW50IF9oZXhDaGFyKGludCBieXRlKSA9PiBieXRlLnRvUmFkaXhTdHJpbmcoMTYpLmNvZGVVbml0QXQoMCk7CisKKyAgLy8vIHdyaXRlCisKKyAgLy8vIFdyaXRlIHRoZSBbYnl0ZXNdIGFzIEpTT04gY2hhcmFjdGVycywgZXNjYXBpbmcgYXMgbmVlZGVkLgorICB2b2lkIF93cml0ZUpzb25TdHJpbmcoVWludDhMaXN0IGJ5dGVzKSB7CisgICAgX2NvbnRleHQud3JpdGUoKTsKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisKKyAgICBpbnQgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgIGludCBieXRlID0gYnl0ZXNbaV07CisgICAgICBpZiAoKGJ5dGUgJiAweDAwRkYpID49IDB4MzApIHsKKyAgICAgICAgaWYgKGJ5dGUgPT0gX0NvbnN0YW50cy5CQUNLU0xBU0hfQllURVNbMF0pIHsKKyAgICAgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5CQUNLU0xBU0hfQllURVMpOworICAgICAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLkJBQ0tTTEFTSF9CWVRFUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdHJhbnNwb3J0LndyaXRlKGJ5dGVzLCBpLCAxKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgX3RlbXBCdWZmZXJbMF0gPSBfQ29uc3RhbnRzLkpTT05fQ0hBUl9UQUJMRVtieXRlXTsKKyAgICAgICAgaWYgKF90ZW1wQnVmZmVyWzBdID09IDEpIHsKKyAgICAgICAgICB0cmFuc3BvcnQud3JpdGUoYnl0ZXMsIGksIDEpOworICAgICAgICB9IGVsc2UgaWYgKF90ZW1wQnVmZmVyWzBdID4gMSkgeworICAgICAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLkJBQ0tTTEFTSF9CWVRFUyk7CisgICAgICAgICAgdHJhbnNwb3J0LndyaXRlKF90ZW1wQnVmZmVyLCAwLCAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5FU0NTRVFfQllURVMpOworICAgICAgICAgIF90ZW1wQnVmZmVyWzBdID0gX2hleENoYXIoYnl0ZSA+PiA0KTsKKyAgICAgICAgICBfdGVtcEJ1ZmZlclsxXSA9IF9oZXhDaGFyKGJ5dGUpOworICAgICAgICAgIHRyYW5zcG9ydC53cml0ZShfdGVtcEJ1ZmZlciwgMCwgMik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisgIH0KKworICB2b2lkIF93cml0ZUpzb25JbnRlZ2VyKGludCBpKSB7CisgICAgaWYgKGkgPT0gbnVsbCkgaSA9IDA7CisKKyAgICBfY29udGV4dC53cml0ZSgpOworICAgIFN0cmluZyBzdHIgPSBpLnRvU3RyaW5nKCk7CisKKyAgICBpZiAoX2NvbnRleHQuZXNjYXBlTnVtYmVycykgeworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUVVPVEVfQllURVMpOworICAgIH0KKyAgICB0cmFuc3BvcnQud3JpdGVBbGwodXRmOENvZGVjLmVuY29kZShzdHIpKTsKKyAgICBpZiAoX2NvbnRleHQuZXNjYXBlTnVtYmVycykgeworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUVVPVEVfQllURVMpOworICAgIH0KKyAgfQorCisgIHZvaWQgX3dyaXRlSnNvbkRvdWJsZShkb3VibGUgZCkgeworICAgIGlmIChkID09IG51bGwpIGQgPSAwLjA7CisKKyAgICBfY29udGV4dC53cml0ZSgpOworICAgIFN0cmluZyBzdHIgPSBkLnRvU3RyaW5nKCk7CisgICAgYm9vbCBlc2NhcGVOdW1iZXJzID0gZC5pc05hTiB8fCBkLmlzSW5maW5pdGUgfHwgX2NvbnRleHQuZXNjYXBlTnVtYmVyczsKKworICAgIGlmIChlc2NhcGVOdW1iZXJzKSB7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisgICAgfQorICAgIHRyYW5zcG9ydC53cml0ZUFsbCh1dGY4Q29kZWMuZW5jb2RlKHN0cikpOworICAgIGlmIChlc2NhcGVOdW1iZXJzKSB7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisgICAgfQorICB9CisKKyAgdm9pZCBfd3JpdGVKc29uQmFzZTY0KFVpbnQ4TGlzdCBieXRlcykgeworICAgIF9jb250ZXh0LndyaXRlKCk7CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUVVPVEVfQllURVMpOworCisgICAgU3RyaW5nIGJhc2U2NCA9IEJBU0U2NC5lbmNvZGUoYnl0ZXMpOworICAgIHRyYW5zcG9ydC53cml0ZUFsbCh1dGY4Q29kZWMuZW5jb2RlKGJhc2U2NCkpOworCisgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUVVPVEVfQllURVMpOworICB9CisKKyAgdm9pZCBfd3JpdGVKc29uT2JqZWN0U3RhcnQoKSB7CisgICAgX2NvbnRleHQud3JpdGUoKTsKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5MQlJBQ0VfQllURVMpOworICAgIF9wdXNoQ29udGV4dChuZXcgX1BhaXJDb250ZXh0KHRoaXMpKTsKKyAgfQorCisgIHZvaWQgX3dyaXRlSnNvbk9iamVjdEVuZCgpIHsKKyAgICBfcG9wQ29udGV4dCgpOworICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLlJCUkFDRV9CWVRFUyk7CisgIH0KKworICB2b2lkIF93cml0ZUpzb25BcnJheVN0YXJ0KCkgeworICAgIF9jb250ZXh0LndyaXRlKCk7CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuTEJSQUNLRVRfQllURVMpOworICAgIF9wdXNoQ29udGV4dChuZXcgX0xpc3RDb250ZXh0KHRoaXMpKTsKKyAgfQorCisgIHZvaWQgX3dyaXRlSnNvbkFycmF5RW5kKCkgeworICAgIF9wb3BDb250ZXh0KCk7CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUkJSQUNLRVRfQllURVMpOworICB9CisKKyAgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgX3Jlc2V0Q29udGV4dCgpOworCisgICAgX3dyaXRlSnNvbkFycmF5U3RhcnQoKTsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihWRVJTSU9OXzEpOworCisgICAgX3dyaXRlSnNvblN0cmluZyh1dGY4Q29kZWMuZW5jb2RlKG1lc3NhZ2UubmFtZSkpOworICAgIF93cml0ZUpzb25JbnRlZ2VyKG1lc3NhZ2UudHlwZSk7CisgICAgX3dyaXRlSnNvbkludGVnZXIobWVzc2FnZS5zZXFpZCk7CisgIH0KKworICB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHsKKyAgICBfd3JpdGVKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgeworICAgIF93cml0ZUpzb25PYmplY3RTdGFydCgpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHsKKyAgICBfd3JpdGVKc29uT2JqZWN0RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihmaWVsZC5pZCk7CisgICAgX3dyaXRlSnNvbk9iamVjdFN0YXJ0KCk7CisgICAgX3dyaXRlSnNvblN0cmluZyhfQ29uc3RhbnRzLmdldFR5cGVOYW1lQnl0ZXNGb3JUeXBlSWQoZmllbGQudHlwZSkpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkRW5kKCkgeworICAgIF93cml0ZUpzb25PYmplY3RFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7fQorCisgIHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIG1hcCkgeworICAgIF93cml0ZUpzb25BcnJheVN0YXJ0KCk7CisgICAgX3dyaXRlSnNvblN0cmluZyhfQ29uc3RhbnRzLmdldFR5cGVOYW1lQnl0ZXNGb3JUeXBlSWQobWFwLmtleVR5cGUpKTsKKyAgICBfd3JpdGVKc29uU3RyaW5nKF9Db25zdGFudHMuZ2V0VHlwZU5hbWVCeXRlc0ZvclR5cGVJZChtYXAudmFsdWVUeXBlKSk7CisgICAgX3dyaXRlSnNvbkludGVnZXIobWFwLmxlbmd0aCk7CisgICAgX3dyaXRlSnNvbk9iamVjdFN0YXJ0KCk7CisgIH0KKworICB2b2lkIHdyaXRlTWFwRW5kKCkgeworICAgIF93cml0ZUpzb25PYmplY3RFbmQoKTsKKyAgICBfd3JpdGVKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgeworICAgIF93cml0ZUpzb25BcnJheVN0YXJ0KCk7CisgICAgX3dyaXRlSnNvblN0cmluZyhfQ29uc3RhbnRzLmdldFR5cGVOYW1lQnl0ZXNGb3JUeXBlSWQobGlzdC5lbGVtZW50VHlwZSkpOworICAgIF93cml0ZUpzb25JbnRlZ2VyKGxpc3QubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVMaXN0RW5kKCkgeworICAgIF93cml0ZUpzb25BcnJheUVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KSB7CisgICAgX3dyaXRlSnNvbkFycmF5U3RhcnQoKTsKKyAgICBfd3JpdGVKc29uU3RyaW5nKF9Db25zdGFudHMuZ2V0VHlwZU5hbWVCeXRlc0ZvclR5cGVJZChzZXQuZWxlbWVudFR5cGUpKTsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihzZXQubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTZXRFbmQoKSB7CisgICAgX3dyaXRlSnNvbkFycmF5RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlQm9vbChib29sIGIpIHsKKyAgICBpZiAoYiA9PSBudWxsKSBiID0gZmFsc2U7CisgICAgX3dyaXRlSnNvbkludGVnZXIoYiA/IDEgOiAwKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCeXRlKGludCBiKSB7CisgICAgX3dyaXRlSnNvbkludGVnZXIoYik7CisgIH0KKworICB2b2lkIHdyaXRlSTE2KGludCBpMTYpIHsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihpMTYpOworICB9CisKKyAgdm9pZCB3cml0ZUkzMihpbnQgaTMyKSB7CisgICAgX3dyaXRlSnNvbkludGVnZXIoaTMyKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJNjQoaW50IGk2NCkgeworICAgIF93cml0ZUpzb25JbnRlZ2VyKGk2NCk7CisgIH0KKworICB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkKSB7CisgICAgX3dyaXRlSnNvbkRvdWJsZShkKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHMpIHsKKyAgICB2YXIgYnl0ZXMgPSBzICE9IG51bGwgPyB1dGY4Q29kZWMuZW5jb2RlKHMpIDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChbXSk7CisgICAgX3dyaXRlSnNvblN0cmluZyhieXRlcyk7CisgIH0KKworICB2b2lkIHdyaXRlQmluYXJ5KFVpbnQ4TGlzdCBieXRlcykgeworICAgIF93cml0ZUpzb25CYXNlNjQoYnl0ZXMpOworICB9CisKKyAgYm9vbCBfaXNIaWdoU3Vycm9nYXRlKGludCBiKSA9PiBiID49IDB4RDgwMCAmJiBiIDw9IDB4REJGRjsKKworICBib29sIF9pc0xvd1N1cnJvZ2F0ZShpbnQgYikgPT4gYiA+PSAweERDMDAgJiYgYiA8PSAweERGRkY7CisKKyAgLy8vIHJlYWQKKworICBVaW50OExpc3QgX3JlYWRKc29uU3RyaW5nKHtib29sIHNraXBDb250ZXh0OiBmYWxzZX0pIHsKKyAgICBMaXN0PGludD4gYnl0ZXMgPSBbXTsKKyAgICBMaXN0PGludD4gY29kZXVuaXRzID0gW107CisKKyAgICBpZiAoIXNraXBDb250ZXh0KSB7CisgICAgICBfY29udGV4dC5yZWFkKCk7CisgICAgfQorCisgICAgX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLlFVT1RFX0JZVEVTWzBdKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaW50IGJ5dGUgPSBfcmVhZGVyLnJlYWQoKTsKKyAgICAgIGlmIChieXRlID09IF9Db25zdGFudHMuUVVPVEVfQllURVNbMF0pIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIGVzY2FwZWQ/CisgICAgICBpZiAoYnl0ZSAhPSBfQ29uc3RhbnRzLkVTQ1NFUV9CWVRFU1swXSkgeworICAgICAgICBieXRlcy5hZGQoYnl0ZSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBieXRlID0gX3JlYWRlci5yZWFkKCk7CisKKyAgICAgIC8vIGRpc3Rpbmd1aXNoIGJldHdlZW4gXHVYWFhYIGFuZCBjb250cm9sIGNoYXJzIGxpa2UgXG4KKyAgICAgIGlmIChieXRlICE9IF9Db25zdGFudHMuRVNDU0VRX0JZVEVTWzFdKSB7CisgICAgICAgIFN0cmluZyBjaGFyID0gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZSk7CisgICAgICAgIGludCBvZmZzZXQgPSBfQ29uc3RhbnRzLkVTQ0FQRV9DSEFSUy5pbmRleE9mKGNoYXIpOworICAgICAgICBpZiAob2Zmc2V0ID09IC0xKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgICAgICBUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgY29udHJvbCBjaGFyIik7CisgICAgICAgIH0KKyAgICAgICAgYnl0ZSA9IF9Db25zdGFudHMuRVNDQVBFX0NIQVJfVkFMUy5jb2RlVW5pdEF0KG9mZnNldCk7CisgICAgICAgIGJ5dGVzLmFkZChieXRlKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIGl0J3MgXHVYWFhYCisgICAgICB0cmFuc3BvcnQucmVhZEFsbChfdGVtcEJ1ZmZlciwgMCwgNCk7CisgICAgICBieXRlID0gKF9oZXhWYWwoX3RlbXBCdWZmZXJbMF0pIDw8IDEyKQorICAgICAgICArIChfaGV4VmFsKF90ZW1wQnVmZmVyWzFdKSA8PCA4KQorICAgICAgICArIChfaGV4VmFsKF90ZW1wQnVmZmVyWzJdKSA8PCA0KQorICAgICAgICArIF9oZXhWYWwoX3RlbXBCdWZmZXJbM10pOworICAgICAgaWYgKF9pc0hpZ2hTdXJyb2dhdGUoYnl0ZSkpIHsKKyAgICAgICAgaWYgKGNvZGV1bml0cy5pc05vdEVtcHR5KSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgICAgICBUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSIpOworICAgICAgICB9CisgICAgICAgIGNvZGV1bml0cy5hZGQoYnl0ZSk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChfaXNMb3dTdXJyb2dhdGUoYnl0ZSkpIHsKKyAgICAgICAgaWYgKGNvZGV1bml0cy5pc0VtcHR5KSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgICAgICBUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgaGlnaCBzdXJyb2dhdGUiKTsKKyAgICAgICAgfQorICAgICAgICBjb2RldW5pdHMuYWRkKGJ5dGUpOworICAgICAgICBieXRlcy5hZGRBbGwodXRmOENvZGVjLmVuY29kZShuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoY29kZXVuaXRzKSkpOworICAgICAgICBjb2RldW5pdHMuY2xlYXIoKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBieXRlcy5hZGRBbGwodXRmOENvZGVjLmVuY29kZShuZXcgU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKSkpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChjb2RldW5pdHMuaXNOb3RFbXB0eSkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIik7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBVaW50OExpc3QuZnJvbUxpc3QoYnl0ZXMpOworICB9CisKKyAgU3RyaW5nIF9yZWFkSnNvbk51bWVyaWNDaGFycygpIHsKKyAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoIV9Db25zdGFudHMuaXNKc29uTnVtZXJpYyhfcmVhZGVyLnBlZWsoKSkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBidWZmZXIud3JpdGUobmV3IFN0cmluZy5mcm9tQ2hhckNvZGUoX3JlYWRlci5yZWFkKCkpKTsKKyAgICB9CisgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICB9CisKKyAgaW50IF9yZWFkSnNvbkludGVnZXIoKSB7CisgICAgX2NvbnRleHQucmVhZCgpOworCisgICAgaWYgKF9jb250ZXh0LmVzY2FwZU51bWJlcnMpIHsKKyAgICAgIF9yZWFkSnNvblN5bnRheENoYXIoX0NvbnN0YW50cy5RVU9URV9CWVRFU1swXSk7CisgICAgfQorICAgIFN0cmluZyBzdHIgPSBfcmVhZEpzb25OdW1lcmljQ2hhcnMoKTsKKyAgICBpZiAoX2NvbnRleHQuZXNjYXBlTnVtYmVycykgeworICAgICAgX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLlFVT1RFX0JZVEVTWzBdKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGludC5wYXJzZShzdHIpOworICAgIH0gb24gRm9ybWF0RXhjZXB0aW9uIGNhdGNoIChfKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwKKyAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpOworICAgIH0KKyAgfQorCisgIGRvdWJsZSBfcmVhZEpzb25Eb3VibGUoKSB7CisgICAgX2NvbnRleHQucmVhZCgpOworCisgICAgaWYgKF9yZWFkZXIucGVlaygpID09IF9Db25zdGFudHMuUVVPVEVfQllURVNbMF0pIHsKKyAgICAgIFVpbnQ4TGlzdCBieXRlcyA9IF9yZWFkSnNvblN0cmluZyhza2lwQ29udGV4dDogdHJ1ZSk7CisgICAgICBkb3VibGUgZCA9IGRvdWJsZS5wYXJzZSh1dGY4Q29kZWMuZGVjb2RlKGJ5dGVzKSwgKF8pIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpOworICAgICAgfSk7CisgICAgICBpZiAoIV9jb250ZXh0LmVzY2FwZU51bWJlcnMgJiYgIWQuaXNOYU4gJiYgIWQuaXNJbmZpbml0ZSkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpOworICAgICAgfQorICAgICAgcmV0dXJuIGQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChfY29udGV4dC5lc2NhcGVOdW1iZXJzKSB7CisgICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyAtIHdlIHNob3VsZCBoYXZlIGhhZCBhIHF1b3RlIGlmIGVzY2FwZU51bWJlcnMgPT0gdHJ1ZQorICAgICAgICBfcmVhZEpzb25TeW50YXhDaGFyKF9Db25zdGFudHMuUVVPVEVfQllURVNbMF0pOworICAgICAgfQorICAgICAgcmV0dXJuIGRvdWJsZS5wYXJzZShfcmVhZEpzb25OdW1lcmljQ2hhcnMoKSwgKF8pIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpOworICAgICAgfSk7CisgICAgfQorICB9CisKKyAgVWludDhMaXN0IF9yZWFkSnNvbkJhc2U2NCgpIHsKKyAgICAvLyBjb252ZXJ0IFVURi04IGJ5dGVzIG9mIGEgQmFzZSA2NCBlbmNvZGVkIHN0cmluZyB0byBiaW5hcnkgYnl0ZXMKKyAgICBVaW50OExpc3QgYmFzZTY0Qnl0ZXMgPSBfcmVhZEpzb25TdHJpbmcoKTsKKyAgICBTdHJpbmcgYmFzZTY0ID0gdXRmOENvZGVjLmRlY29kZShiYXNlNjRCeXRlcyk7CisKKyAgICByZXR1cm4gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChCQVNFNjQuZGVjb2RlKGJhc2U2NCkpOworICB9CisKKyAgdm9pZCBfcmVhZEpzb25PYmplY3RTdGFydCgpIHsKKyAgICBfY29udGV4dC5yZWFkKCk7CisgICAgX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLkxCUkFDRV9CWVRFU1swXSk7CisgICAgX3B1c2hDb250ZXh0KG5ldyBfUGFpckNvbnRleHQodGhpcykpOworICB9CisKKyAgdm9pZCBfcmVhZEpzb25PYmplY3RFbmQoKSB7CisgICAgX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLlJCUkFDRV9CWVRFU1swXSk7CisgICAgX3BvcENvbnRleHQoKTsKKyAgfQorCisgIHZvaWQgX3JlYWRKc29uQXJyYXlTdGFydCgpIHsKKyAgICBfY29udGV4dC5yZWFkKCk7CisgICAgX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLkxCUkFDS0VUX0JZVEVTWzBdKTsKKyAgICBfcHVzaENvbnRleHQobmV3IF9MaXN0Q29udGV4dCh0aGlzKSk7CisgIH0KKworICB2b2lkIF9yZWFkSnNvbkFycmF5RW5kKCkgeworICAgIF9yZWFkSnNvblN5bnRheENoYXIoX0NvbnN0YW50cy5SQlJBQ0tFVF9CWVRFU1swXSk7CisgICAgX3BvcENvbnRleHQoKTsKKyAgfQorCisgIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB7CisgICAgX3Jlc2V0Q29udGV4dCgpOworCisgICAgX3JlYWRKc29uQXJyYXlTdGFydCgpOworICAgIGlmIChfcmVhZEpzb25JbnRlZ2VyKCkgIT0gVkVSU0lPTl8xKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLkJBRF9WRVJTSU9OLCAiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uIik7CisgICAgfQorCisgICAgVWludDhMaXN0IGJ1ZmZlciA9IF9yZWFkSnNvblN0cmluZygpOworICAgIFN0cmluZyBuYW1lID0gdXRmOENvZGVjLmRlY29kZShidWZmZXIpOworICAgIGludCB0eXBlID0gX3JlYWRKc29uSW50ZWdlcigpOworICAgIGludCBzZXFpZCA9IF9yZWFkSnNvbkludGVnZXIoKTsKKworICAgIHJldHVybiBuZXcgVE1lc3NhZ2UobmFtZSwgdHlwZSwgc2VxaWQpOworICB9CisKKyAgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHsKKyAgICBfcmVhZEpzb25BcnJheUVuZCgpOworICB9CisKKyAgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB7CisgICAgX3JlYWRKc29uT2JqZWN0U3RhcnQoKTsKKyAgICByZXR1cm4gbmV3IFRTdHJ1Y3QoKTsKKyAgfQorCisgIHZvaWQgcmVhZFN0cnVjdEVuZCgpIHsKKyAgICBfcmVhZEpzb25PYmplY3RFbmQoKTsKKyAgfQorCisgIFRGaWVsZCByZWFkRmllbGRCZWdpbigpIHsKKyAgICBTdHJpbmcgbmFtZSA9ICIiOworICAgIGludCB0eXBlID0gVFR5cGUuU1RPUDsKKyAgICBpbnQgaWQgPSAwOworCisgICAgaWYgKF9yZWFkZXIucGVlaygpICE9IF9Db25zdGFudHMuUkJSQUNFX0JZVEVTWzBdKSB7CisgICAgICBpZCA9IF9yZWFkSnNvbkludGVnZXIoKTsKKyAgICAgIF9yZWFkSnNvbk9iamVjdFN0YXJ0KCk7CisgICAgICB0eXBlID0gX0NvbnN0YW50cy5nZXRUeXBlSWRGb3JUeXBlTmFtZShfcmVhZEpzb25TdHJpbmcoKSk7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBURmllbGQobmFtZSwgdHlwZSwgaWQpOworICB9CisKKyAgdm9pZCByZWFkRmllbGRFbmQoKSB7CisgICAgX3JlYWRKc29uT2JqZWN0RW5kKCk7CisgIH0KKworICBUTWFwIHJlYWRNYXBCZWdpbigpIHsKKyAgICBfcmVhZEpzb25BcnJheVN0YXJ0KCk7CisgICAgaW50IGtleVR5cGUgPSBfQ29uc3RhbnRzLmdldFR5cGVJZEZvclR5cGVOYW1lKF9yZWFkSnNvblN0cmluZygpKTsKKyAgICBpbnQgdmFsdWVUeXBlID0gX0NvbnN0YW50cy5nZXRUeXBlSWRGb3JUeXBlTmFtZShfcmVhZEpzb25TdHJpbmcoKSk7CisgICAgaW50IGxlbmd0aCA9IF9yZWFkSnNvbkludGVnZXIoKTsKKyAgICBfcmVhZEpzb25PYmplY3RTdGFydCgpOworCisgICAgcmV0dXJuIG5ldyBUTWFwKGtleVR5cGUsIHZhbHVlVHlwZSwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgcmVhZE1hcEVuZCgpIHsKKyAgICBfcmVhZEpzb25PYmplY3RFbmQoKTsKKyAgICBfcmVhZEpzb25BcnJheUVuZCgpOworICB9CisKKyAgVExpc3QgcmVhZExpc3RCZWdpbigpIHsKKyAgICBfcmVhZEpzb25BcnJheVN0YXJ0KCk7CisgICAgaW50IGVsZW1lbnRUeXBlID0gX0NvbnN0YW50cy5nZXRUeXBlSWRGb3JUeXBlTmFtZShfcmVhZEpzb25TdHJpbmcoKSk7CisgICAgaW50IGxlbmd0aCA9IF9yZWFkSnNvbkludGVnZXIoKTsKKworICAgIHJldHVybiBuZXcgVExpc3QoZWxlbWVudFR5cGUsIGxlbmd0aCk7CisgIH0KKworICB2b2lkIHJlYWRMaXN0RW5kKCkgeworICAgIF9yZWFkSnNvbkFycmF5RW5kKCk7CisgIH0KKworICBUU2V0IHJlYWRTZXRCZWdpbigpIHsKKyAgICBfcmVhZEpzb25BcnJheVN0YXJ0KCk7CisgICAgaW50IGVsZW1lbnRUeXBlID0gX0NvbnN0YW50cy5nZXRUeXBlSWRGb3JUeXBlTmFtZShfcmVhZEpzb25TdHJpbmcoKSk7CisgICAgaW50IGxlbmd0aCA9IF9yZWFkSnNvbkludGVnZXIoKTsKKworICAgIHJldHVybiBuZXcgVFNldChlbGVtZW50VHlwZSwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgcmVhZFNldEVuZCgpIHsKKyAgICBfcmVhZEpzb25BcnJheUVuZCgpOworICB9CisKKyAgYm9vbCByZWFkQm9vbCgpIHsKKyAgICByZXR1cm4gX3JlYWRKc29uSW50ZWdlcigpID09IDAgPyBmYWxzZSA6IHRydWU7CisgIH0KKworICBpbnQgcmVhZEJ5dGUoKSB7CisgICAgcmV0dXJuIF9yZWFkSnNvbkludGVnZXIoKTsKKyAgfQorCisgIGludCByZWFkSTE2KCkgeworICAgIHJldHVybiBfcmVhZEpzb25JbnRlZ2VyKCk7CisgIH0KKworICBpbnQgcmVhZEkzMigpIHsKKyAgICByZXR1cm4gX3JlYWRKc29uSW50ZWdlcigpOworICB9CisKKyAgaW50IHJlYWRJNjQoKSB7CisgICAgcmV0dXJuIF9yZWFkSnNvbkludGVnZXIoKTsKKyAgfQorCisgIGRvdWJsZSByZWFkRG91YmxlKCkgeworICAgIHJldHVybiBfcmVhZEpzb25Eb3VibGUoKTsKKyAgfQorCisgIFN0cmluZyByZWFkU3RyaW5nKCkgeworICAgIHJldHVybiB1dGY4Q29kZWMuZGVjb2RlKF9yZWFkSnNvblN0cmluZygpKTsKKyAgfQorCisgIFVpbnQ4TGlzdCByZWFkQmluYXJ5KCkgeworICAgIHJldHVybiBuZXcgVWludDhMaXN0LmZyb21MaXN0KF9yZWFkSnNvbkJhc2U2NCgpKTsKKyAgfQorfQorCitjbGFzcyBfQ29uc3RhbnRzIHsKKyAgc3RhdGljIGNvbnN0IHV0Zjhjb2RlYyA9IGNvbnN0IFV0ZjhDb2RlYygpOworCisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgSEVYXzBfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCcwJy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IEhFWF85X0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgnOScuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBIRVhfQV9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJ2EnLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgSEVYX0ZfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCdmJy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IENPTU1BX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgnLCcuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBDT0xPTl9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJzonLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgTEJSQUNFX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgneycuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBSQlJBQ0VfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCd9Jy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IExCUkFDS0VUX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgnWycuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBSQlJBQ0tFVF9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJ10nLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgUVVPVEVfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCciJy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IEJBQ0tTTEFTSF9CWVRFUyA9CisgICAgICBuZXcgVWludDhMaXN0LmZyb21MaXN0KHInXCcuY29kZVVuaXRzKTsKKworICBzdGF0aWMgZmluYWwgRVNDU0VRX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChyJ1x1MDAnLmNvZGVVbml0cyk7CisKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBKU09OX0NIQVJfVEFCTEUgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KFsKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyA4IGJ5dGVzCisgICAgJ2InLmNvZGVVbml0QXQoMCksICd0Jy5jb2RlVW5pdEF0KDApLCAnbicuY29kZVVuaXRBdCgwKSwgMCwgLy8gNCBieXRlcworICAgICdmJy5jb2RlVW5pdEF0KDApLCAncicuY29kZVVuaXRBdCgwKSwgMCwgMCwgLy8gNCBieXRlcworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDggYnl0ZXMKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyA4IGJ5dGVzCisgICAgMSwgMSwgJyInLmNvZGVVbml0QXQoMCksIDEsIDEsIDEsIDEsIDEsIC8vIDggYnl0ZXMKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxIC8vIDggYnl0ZXMKKyAgXSk7CisKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBFU0NBUEVfQ0hBUlMgPSByJyJcL2JmbnJ0JzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBFU0NBUEVfQ0hBUl9WQUxTID0gJyJcXC9cYlxmXG5cclx0JzsKKworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfQk9PTCA9ICd0Zic7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9CWVRFID0gJ2k4JzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX0kxNiA9ICdpMTYnOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfSTMyID0gJ2kzMic7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9JNjQgPSAnaTY0JzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX0RPVUJMRSA9ICdkYmwnOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfU1RSVUNUID0gJ3JlYyc7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9TVFJJTkcgPSAnc3RyJzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX01BUCA9ICdtYXAnOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfTElTVCA9ICdsc3QnOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfU0VUID0gJ3NldCc7CisKKyAgc3RhdGljIGZpbmFsIE1hcDxpbnQsIFVpbnQ4TGlzdD4gX1RZUEVfSURfVE9fTkFNRV9CWVRFUyA9CisgICAgICBuZXcgTWFwLnVubW9kaWZpYWJsZSh7CisgICAgVFR5cGUuQk9PTDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX0JPT0wuY29kZVVuaXRzKSwKKyAgICBUVHlwZS5CWVRFOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KE5BTUVfQllURS5jb2RlVW5pdHMpLAorICAgIFRUeXBlLkkxNjogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX0kxNi5jb2RlVW5pdHMpLAorICAgIFRUeXBlLkkzMjogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX0kzMi5jb2RlVW5pdHMpLAorICAgIFRUeXBlLkk2NDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX0k2NC5jb2RlVW5pdHMpLAorICAgIFRUeXBlLkRPVUJMRTogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX0RPVUJMRS5jb2RlVW5pdHMpLAorICAgIFRUeXBlLlNUUklORzogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX1NUUklORy5jb2RlVW5pdHMpLAorICAgIFRUeXBlLlNUUlVDVDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX1NUUlVDVC5jb2RlVW5pdHMpLAorICAgIFRUeXBlLk1BUDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX01BUC5jb2RlVW5pdHMpLAorICAgIFRUeXBlLlNFVDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX1NFVC5jb2RlVW5pdHMpLAorICAgIFRUeXBlLkxJU1Q6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoTkFNRV9MSVNULmNvZGVVbml0cykKKyAgfSk7CisKKyAgc3RhdGljIFVpbnQ4TGlzdCBnZXRUeXBlTmFtZUJ5dGVzRm9yVHlwZUlkKGludCB0eXBlSWQpIHsKKyAgICBpZiAoIV9UWVBFX0lEX1RPX05BTUVfQllURVMuY29udGFpbnNLZXkodHlwZUlkKSkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5OT1RfSU1QTEVNRU5URUQsICJVbnJlY29nbml6ZWQgdHlwZSIpOworICAgIH0KKworICAgIHJldHVybiBfVFlQRV9JRF9UT19OQU1FX0JZVEVTW3R5cGVJZF07CisgIH0KKworICBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgaW50PiBfTkFNRV9UT19UWVBFX0lEID0gbmV3IE1hcC51bm1vZGlmaWFibGUoeworICAgIE5BTUVfQk9PTDogVFR5cGUuQk9PTCwKKyAgICBOQU1FX0JZVEU6IFRUeXBlLkJZVEUsCisgICAgTkFNRV9JMTY6IFRUeXBlLkkxNiwKKyAgICBOQU1FX0kzMjogVFR5cGUuSTMyLAorICAgIE5BTUVfSTY0OiBUVHlwZS5JNjQsCisgICAgTkFNRV9ET1VCTEU6IFRUeXBlLkRPVUJMRSwKKyAgICBOQU1FX1NUUklORzogVFR5cGUuU1RSSU5HLAorICAgIE5BTUVfU1RSVUNUOiBUVHlwZS5TVFJVQ1QsCisgICAgTkFNRV9NQVA6IFRUeXBlLk1BUCwKKyAgICBOQU1FX1NFVDogVFR5cGUuU0VULAorICAgIE5BTUVfTElTVDogVFR5cGUuTElTVAorICB9KTsKKworICBzdGF0aWMgaW50IGdldFR5cGVJZEZvclR5cGVOYW1lKFVpbnQ4TGlzdCBieXRlcykgeworICAgIFN0cmluZyBuYW1lID0gdXRmOGNvZGVjLmRlY29kZShieXRlcyk7CisgICAgaWYgKCFfTkFNRV9UT19UWVBFX0lELmNvbnRhaW5zS2V5KG5hbWUpKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLk5PVF9JTVBMRU1FTlRFRCwgIlVucmVjb2duaXplZCB0eXBlIik7CisgICAgfQorCisgICAgcmV0dXJuIF9OQU1FX1RPX1RZUEVfSURbbmFtZV07CisgIH0KKworICBzdGF0aWMgZmluYWwgU2V0PGludD4gX0pTT05fTlVNRVJJQ1MgPSBuZXcgU2V0LmZyb20oWworICAgICcrJy5jb2RlVW5pdEF0KDApLAorICAgICctJy5jb2RlVW5pdEF0KDApLAorICAgICcuJy5jb2RlVW5pdEF0KDApLAorICAgICcwJy5jb2RlVW5pdEF0KDApLAorICAgICcxJy5jb2RlVW5pdEF0KDApLAorICAgICcyJy5jb2RlVW5pdEF0KDApLAorICAgICczJy5jb2RlVW5pdEF0KDApLAorICAgICc0Jy5jb2RlVW5pdEF0KDApLAorICAgICc1Jy5jb2RlVW5pdEF0KDApLAorICAgICc2Jy5jb2RlVW5pdEF0KDApLAorICAgICc3Jy5jb2RlVW5pdEF0KDApLAorICAgICc4Jy5jb2RlVW5pdEF0KDApLAorICAgICc5Jy5jb2RlVW5pdEF0KDApLAorICAgICdFJy5jb2RlVW5pdEF0KDApLAorICAgICdlJy5jb2RlVW5pdEF0KDApCisgIF0pOworCisgIHN0YXRpYyBib29sIGlzSnNvbk51bWVyaWMoaW50IGJ5dGUpIHsKKyAgICByZXR1cm4gX0pTT05fTlVNRVJJQ1MuY29udGFpbnMoYnl0ZSk7CisgIH0KK30KKworY2xhc3MgX0xvb2thaGVhZFJlYWRlciB7CisgIGZpbmFsIFRKc29uUHJvdG9jb2wgcHJvdG9jb2w7CisKKyAgX0xvb2thaGVhZFJlYWRlcih0aGlzLnByb3RvY29sKTsKKworICBib29sIF9oYXNEYXRhID0gZmFsc2U7CisgIGZpbmFsIFVpbnQ4TGlzdCBfZGF0YSA9IG5ldyBVaW50OExpc3QoMSk7CisKKyAgaW50IHJlYWQoKSB7CisgICAgaWYgKF9oYXNEYXRhKSB7CisgICAgICBfaGFzRGF0YSA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBwcm90b2NvbC50cmFuc3BvcnQucmVhZEFsbChfZGF0YSwgMCwgMSk7CisgICAgfQorCisgICAgcmV0dXJuIF9kYXRhWzBdOworICB9CisKKyAgaW50IHBlZWsoKSB7CisgICAgaWYgKCFfaGFzRGF0YSkgeworICAgICAgcHJvdG9jb2wudHJhbnNwb3J0LnJlYWRBbGwoX2RhdGEsIDAsIDEpOworICAgIH0KKyAgICBfaGFzRGF0YSA9IHRydWU7CisKKyAgICByZXR1cm4gX2RhdGFbMF07CisgIH0KK30KKworY2xhc3MgX0Jhc2VDb250ZXh0IHsKKyAgZmluYWwgVEpzb25Qcm90b2NvbCBwcm90b2NvbDsKKworICBfQmFzZUNvbnRleHQodGhpcy5wcm90b2NvbCk7CisKKyAgdm9pZCB3cml0ZSgpIHt9CisKKyAgdm9pZCByZWFkKCkge30KKworICBib29sIGdldCBlc2NhcGVOdW1iZXJzID0+IGZhbHNlOworCisgIFN0cmluZyB0b1N0cmluZygpID0+ICdCYXNlQ29udGV4dCc7Cit9CisKK2NsYXNzIF9MaXN0Q29udGV4dCBleHRlbmRzIF9CYXNlQ29udGV4dCB7CisgIF9MaXN0Q29udGV4dChUSnNvblByb3RvY29sIHByb3RvY29sKSA6IHN1cGVyKHByb3RvY29sKTsKKworICBib29sIF9maXJzdCA9IHRydWU7CisKKyAgdm9pZCB3cml0ZSgpIHsKKyAgICBpZiAoX2ZpcnN0KSB7CisgICAgICBfZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcHJvdG9jb2wudHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuQ09NTUFfQllURVMpOworICAgIH0KKyAgfQorCisgIHZvaWQgcmVhZCgpIHsKKyAgICBpZiAoX2ZpcnN0KSB7CisgICAgICBfZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcHJvdG9jb2wuX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLkNPTU1BX0JZVEVTWzBdKTsKKyAgICB9CisgIH0KKworICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnTGlzdENvbnRleHQnOworfQorCitjbGFzcyBfUGFpckNvbnRleHQgZXh0ZW5kcyBfQmFzZUNvbnRleHQgeworICBfUGFpckNvbnRleHQoVEpzb25Qcm90b2NvbCBwcm90b2NvbCkgOiBzdXBlcihwcm90b2NvbCk7CisKKyAgYm9vbCBfZmlyc3QgPSB0cnVlOworICBib29sIF9jb2xvbiA9IHRydWU7CisKKyAgVWludDhMaXN0IGdldCBzeW1ib2xCeXRlcyA9PgorICAgICAgX2NvbG9uID8gX0NvbnN0YW50cy5DT0xPTl9CWVRFUyA6IF9Db25zdGFudHMuQ09NTUFfQllURVM7CisKKyAgdm9pZCB3cml0ZSgpIHsKKyAgICBpZiAoX2ZpcnN0KSB7CisgICAgICBfZmlyc3QgPSBmYWxzZTsKKyAgICAgIF9jb2xvbiA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb3RvY29sLnRyYW5zcG9ydC53cml0ZUFsbChzeW1ib2xCeXRlcyk7CisgICAgICBfY29sb24gPSAhX2NvbG9uOworICAgIH0KKyAgfQorCisgIHZvaWQgcmVhZCgpIHsKKyAgICBpZiAoX2ZpcnN0KSB7CisgICAgICBfZmlyc3QgPSBmYWxzZTsKKyAgICAgIF9jb2xvbiA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb3RvY29sLl9yZWFkSnNvblN5bnRheENoYXIoc3ltYm9sQnl0ZXNbMF0pOworICAgICAgX2NvbG9uID0gIV9jb2xvbjsKKyAgICB9CisgIH0KKworICBib29sIGdldCBlc2NhcGVOdW1iZXJzID0+IF9jb2xvbjsKKworICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnUGFpckNvbnRleHQnOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2xpc3QuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9saXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmNDY3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9saXN0LmRhcnQKQEAgLTAsMCArMSwyNSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUTGlzdCB7CisgIGZpbmFsIGludCBlbGVtZW50VHlwZTsKKyAgZmluYWwgaW50IGxlbmd0aDsKKworICBUTGlzdCh0aGlzLmVsZW1lbnRUeXBlLCB0aGlzLmxlbmd0aCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbWFwLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbWFwLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZkZjY4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9tYXAuZGFydApAQCAtMCwwICsxLDI2IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRNYXAgeworICBmaW5hbCBpbnQga2V5VHlwZTsKKyAgZmluYWwgaW50IHZhbHVlVHlwZTsKKyAgZmluYWwgaW50IGxlbmd0aDsKKworICBUTWFwKHRoaXMua2V5VHlwZSwgdGhpcy52YWx1ZVR5cGUsIHRoaXMubGVuZ3RoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9tZXNzYWdlLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbWVzc2FnZS5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjN2I4ODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbWVzc2FnZS5kYXJ0CkBAIC0wLDAgKzEsMzUgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVE1lc3NhZ2VUeXBlIHsKKyAgc3RhdGljIGNvbnN0IGludCBDQUxMID0gMTsKKyAgc3RhdGljIGNvbnN0IGludCBSRVBMWSA9IDI7CisgIHN0YXRpYyBjb25zdCBpbnQgRVhDRVBUSU9OID0gMzsKKyAgc3RhdGljIGNvbnN0IGludCBPTkVXQVkgPSA0OworfQorCitjbGFzcyBUTWVzc2FnZSB7CisgIGZpbmFsIFN0cmluZyBuYW1lOworICBmaW5hbCBpbnQgdHlwZTsKKyAgZmluYWwgaW50IHNlcWlkOworCisgIFRNZXNzYWdlKHRoaXMubmFtZSwgdGhpcy50eXBlLCB0aGlzLnNlcWlkKTsKKworICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiPFRNZXNzYWdlIG5hbWU6ICckbmFtZScgdHlwZTogJHR5cGUgc2VxaWQ6ICRzZXFpZD4iOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X211bHRpcGxleGVkX3Byb3RvY29sLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzhhNmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X211bHRpcGxleGVkX3Byb3RvY29sLmRhcnQKQEAgLTAsMCArMSw0MyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBDIyB2ZXJzaW9uLgorY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2xEZWNvcmF0b3IgeworICBzdGF0aWMgY29uc3QgU0VQQVJBVE9SID0gJzonOworCisgIGZpbmFsIFN0cmluZyBfc2VydmljZU5hbWU7CisKKyAgVE11bHRpcGxleGVkUHJvdG9jb2woVFByb3RvY29sIHByb3RvY29sLCBTdHJpbmcgc2VydmljZU5hbWUpCisgICAgICA6IF9zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lLAorICAgICAgICBzdXBlcihwcm90b2NvbCkgeworICAgIGlmIChzZXJ2aWNlTmFtZSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJzZXJ2aWNlTmFtZSIpOworICAgIH0KKyAgfQorCisgIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgeworICAgIGlmIChtZXNzYWdlLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkNBTEwgfHwKKyAgICAgICAgbWVzc2FnZS50eXBlID09IFRNZXNzYWdlVHlwZS5PTkVXQVkpIHsKKyAgICAgIFN0cmluZyBuYW1lID0gX3NlcnZpY2VOYW1lICsgU0VQQVJBVE9SICsgbWVzc2FnZS5uYW1lOworICAgICAgbWVzc2FnZSA9IG5ldyBUTWVzc2FnZShuYW1lLCBtZXNzYWdlLnR5cGUsIG1lc3NhZ2Uuc2VxaWQpOworICAgIH0KKworICAgIHN1cGVyLndyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2UpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2wuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OWMwMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2wuZGFydApAQCAtMCwwICsxLDk1IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2Fic3RyYWN0IGNsYXNzIFRQcm90b2NvbCB7CisgIGZpbmFsIFRUcmFuc3BvcnQgdHJhbnNwb3J0OworCisgIFRQcm90b2NvbCh0aGlzLnRyYW5zcG9ydCk7CisKKyAgLy8vIFdyaXRlCisgIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSk7CisgIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWN0KTsKKyAgdm9pZCB3cml0ZVN0cnVjdEVuZCgpOworCisgIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCk7CisgIHZvaWQgd3JpdGVGaWVsZEVuZCgpOworICB2b2lkIHdyaXRlRmllbGRTdG9wKCk7CisKKyAgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKTsKKyAgdm9pZCB3cml0ZU1hcEVuZCgpOworCisgIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCk7CisgIHZvaWQgd3JpdGVMaXN0RW5kKCk7CisKKyAgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KTsKKyAgdm9pZCB3cml0ZVNldEVuZCgpOworCisgIHZvaWQgd3JpdGVCb29sKGJvb2wgYik7CisKKyAgdm9pZCB3cml0ZUJ5dGUoaW50IGIpOworCisgIHZvaWQgd3JpdGVJMTYoaW50IGkxNik7CisKKyAgdm9pZCB3cml0ZUkzMihpbnQgaTMyKTsKKworICB2b2lkIHdyaXRlSTY0KGludCBpNjQpOworCisgIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGQpOworCisgIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cik7CisKKyAgdm9pZCB3cml0ZUJpbmFyeShVaW50OExpc3QgYnl0ZXMpOworCisgIC8vLyBSZWFkCisgIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgdm9pZCByZWFkTWVzc2FnZUVuZCgpOworCisgIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCk7CisgIHZvaWQgcmVhZFN0cnVjdEVuZCgpOworCisgIFRGaWVsZCByZWFkRmllbGRCZWdpbigpOworICB2b2lkIHJlYWRGaWVsZEVuZCgpOworCisgIFRNYXAgcmVhZE1hcEJlZ2luKCk7CisgIHZvaWQgcmVhZE1hcEVuZCgpOworCisgIFRMaXN0IHJlYWRMaXN0QmVnaW4oKTsKKyAgdm9pZCByZWFkTGlzdEVuZCgpOworCisgIFRTZXQgcmVhZFNldEJlZ2luKCk7CisgIHZvaWQgcmVhZFNldEVuZCgpOworCisgIGJvb2wgcmVhZEJvb2woKTsKKworICBpbnQgcmVhZEJ5dGUoKTsKKworICBpbnQgcmVhZEkxNigpOworCisgIGludCByZWFkSTMyKCk7CisKKyAgaW50IHJlYWRJNjQoKTsKKworICBkb3VibGUgcmVhZERvdWJsZSgpOworCisgIFN0cmluZyByZWFkU3RyaW5nKCk7CisKKyAgVWludDhMaXN0IHJlYWRCaW5hcnkoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9kZWNvcmF0b3IuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9kZWNvcmF0b3IuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2QwMmY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2RlY29yYXRvci5kYXJ0CkBAIC0wLDAgKzEsMTUwIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKKy8vLyBGb3J3YXJkIGFsbCBvcGVyYXRpb25zIHRvIHRoZSB3cmFwcGVkIHByb3RvY29sLiAgVXNlZCBhcyBhIGJhc2UgY2xhc3MuCisvLy8KKy8vLyBBZGFwdGVkIGZyb20gdGhlIEMjIHZlcnNpb24uCitjbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3IgZXh0ZW5kcyBUUHJvdG9jb2wgeworICBmaW5hbCBUUHJvdG9jb2wgX3Byb3RvY29sOworCisgIFRQcm90b2NvbERlY29yYXRvcihUUHJvdG9jb2wgcHJvdG9jb2wpCisgICAgICA6IF9wcm90b2NvbCA9IHByb3RvY29sLAorICAgICAgICBzdXBlcihwcm90b2NvbC50cmFuc3BvcnQpOworCisgIC8vLyBXcml0ZQorCisgIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgeworICAgIF9wcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihtZXNzYWdlKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkgeworICAgIF9wcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgeworICAgIF9wcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKHN0cnVjdCk7CisgIH0KKworICB2b2lkIHdyaXRlU3RydWN0RW5kKCkgeworICAgIF9wcm90b2NvbC53cml0ZVN0cnVjdEVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB7CisgICAgX3Byb3RvY29sLndyaXRlRmllbGRCZWdpbihmaWVsZCk7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRFbmQoKSB7CisgICAgX3Byb3RvY29sLndyaXRlRmllbGRFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7CisgICAgX3Byb3RvY29sLndyaXRlRmllbGRTdG9wKCk7CisgIH0KKworICB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHsKKyAgICBfcHJvdG9jb2wud3JpdGVNYXBCZWdpbihtYXApOworICB9CisKKyAgdm9pZCB3cml0ZU1hcEVuZCgpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVNYXBFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgeworICAgIF9wcm90b2NvbC53cml0ZUxpc3RCZWdpbihsaXN0KTsKKyAgfQorCisgIHZvaWQgd3JpdGVMaXN0RW5kKCkgeworICAgIF9wcm90b2NvbC53cml0ZUxpc3RFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCkgeworICAgIF9wcm90b2NvbC53cml0ZVNldEJlZ2luKHNldCk7CisgIH0KKworICB2b2lkIHdyaXRlU2V0RW5kKCkgeworICAgIF9wcm90b2NvbC53cml0ZVNldEVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZUJvb2woYm9vbCBiKSB7CisgICAgX3Byb3RvY29sLndyaXRlQm9vbChiKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCeXRlKGludCBiKSB7CisgICAgX3Byb3RvY29sLndyaXRlQnl0ZShiKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJMTYoaW50IGkxNikgeworICAgIF9wcm90b2NvbC53cml0ZUkxNihpMTYpOworICB9CisKKyAgdm9pZCB3cml0ZUkzMihpbnQgaTMyKSB7CisgICAgX3Byb3RvY29sLndyaXRlSTMyKGkzMik7CisgIH0KKworICB2b2lkIHdyaXRlSTY0KGludCBpNjQpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVJNjQoaTY0KTsKKyAgfQorCisgIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGQpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVEb3VibGUoZCk7CisgIH0KKworICB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVTdHJpbmcoc3RyKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCaW5hcnkoVWludDhMaXN0IGJ5dGVzKSB7CisgICAgX3Byb3RvY29sLndyaXRlQmluYXJ5KGJ5dGVzKTsKKyAgfQorCisgIC8vLyBSZWFkCisgIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSA9PiBfcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICB2b2lkIHJlYWRNZXNzYWdlRW5kKCkgPT4gX3Byb3RvY29sLnJlYWRNZXNzYWdlRW5kKCk7CisKKyAgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSA9PiBfcHJvdG9jb2wucmVhZFN0cnVjdEJlZ2luKCk7CisgIHZvaWQgcmVhZFN0cnVjdEVuZCgpID0+IF9wcm90b2NvbC5yZWFkU3RydWN0RW5kKCk7CisKKyAgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgPT4gX3Byb3RvY29sLnJlYWRGaWVsZEJlZ2luKCk7CisgIHZvaWQgcmVhZEZpZWxkRW5kKCkgPT4gX3Byb3RvY29sLnJlYWRGaWVsZEVuZCgpOworCisgIFRNYXAgcmVhZE1hcEJlZ2luKCkgPT4gX3Byb3RvY29sLnJlYWRNYXBCZWdpbigpOworICB2b2lkIHJlYWRNYXBFbmQoKSA9PiBfcHJvdG9jb2wucmVhZE1hcEVuZCgpOworCisgIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSA9PiBfcHJvdG9jb2wucmVhZExpc3RCZWdpbigpOworICB2b2lkIHJlYWRMaXN0RW5kKCkgPT4gX3Byb3RvY29sLnJlYWRMaXN0RW5kKCk7CisKKyAgVFNldCByZWFkU2V0QmVnaW4oKSA9PiBfcHJvdG9jb2wucmVhZFNldEJlZ2luKCk7CisgIHZvaWQgcmVhZFNldEVuZCgpID0+IF9wcm90b2NvbC5yZWFkU2V0RW5kKCk7CisKKyAgYm9vbCByZWFkQm9vbCgpID0+IF9wcm90b2NvbC5yZWFkQm9vbCgpOworCisgIGludCByZWFkQnl0ZSgpID0+IF9wcm90b2NvbC5yZWFkQnl0ZSgpOworCisgIGludCByZWFkSTE2KCkgPT4gX3Byb3RvY29sLnJlYWRJMTYoKTsKKworICBpbnQgcmVhZEkzMigpID0+IF9wcm90b2NvbC5yZWFkSTMyKCk7CisKKyAgaW50IHJlYWRJNjQoKSA9PiBfcHJvdG9jb2wucmVhZEk2NCgpOworCisgIGRvdWJsZSByZWFkRG91YmxlKCkgPT4gX3Byb3RvY29sLnJlYWREb3VibGUoKTsKKworICBTdHJpbmcgcmVhZFN0cmluZygpID0+IF9wcm90b2NvbC5yZWFkU3RyaW5nKCk7CisKKyAgVWludDhMaXN0IHJlYWRCaW5hcnkoKSA9PiBfcHJvdG9jb2wucmVhZEJpbmFyeSgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2Vycm9yLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZXJyb3IuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTZiYWViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2Vycm9yLmRhcnQKQEAgLTAsMCArMSwzMyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUUHJvdG9jb2xFcnJvclR5cGUgeworICBzdGF0aWMgY29uc3QgaW50IFVOS05PV04gPSAwOworICBzdGF0aWMgY29uc3QgaW50IElOVkFMSURfREFUQSA9IDE7CisgIHN0YXRpYyBjb25zdCBpbnQgTkVHQVRJVkVfU0laRSA9IDI7CisgIHN0YXRpYyBjb25zdCBpbnQgU0laRV9MSU1JVCA9IDM7CisgIHN0YXRpYyBjb25zdCBpbnQgQkFEX1ZFUlNJT04gPSA0OworICBzdGF0aWMgY29uc3QgaW50IE5PVF9JTVBMRU1FTlRFRCA9IDU7CisgIHN0YXRpYyBjb25zdCBpbnQgREVQVEhfTElNSVQgPSA2OworfQorCitjbGFzcyBUUHJvdG9jb2xFcnJvciBleHRlbmRzIFRFcnJvciB7CisgIFRQcm90b2NvbEVycm9yKFtpbnQgdHlwZSA9IFRQcm90b2NvbEVycm9yVHlwZS5VTktOT1dOLCBTdHJpbmcgbWVzc2FnZSA9ICIiXSkKKyAgICAgIDogc3VwZXIodHlwZSwgbWVzc2FnZSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZmFjdG9yeS5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2ZhY3RvcnkuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjJjNmNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2ZhY3RvcnkuZGFydApAQCAtMCwwICsxLDIyIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2Fic3RyYWN0IGNsYXNzIFRQcm90b2NvbEZhY3Rvcnk8VCBleHRlbmRzIFRQcm90b2NvbD4geworICBUIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF91dGlsLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfdXRpbC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMjAwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfdXRpbC5kYXJ0CkBAIC0wLDAgKzEsMTA3IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRQcm90b2NvbFV0aWwgeworICAvLyBlcXVhbCB0byBKYXZhU2NyaXB0IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLCAyXjUzIC0gMQorICBzdGF0aWMgY29uc3QgaW50IGRlZmF1bHRSZWN1cnNpb25MaW1pdCA9IDkwMDcxOTkyNTQ3NDA5OTE7CisKKyAgc3RhdGljIGludCBtYXhSZWN1cnNpb25MaW1pdCA9IGRlZmF1bHRSZWN1cnNpb25MaW1pdDsKKworICBzdGF0aWMgc2tpcChUUHJvdG9jb2wgcHJvdCwgaW50IHR5cGUpIHsKKyAgICBfc2tpcChwcm90LCB0eXBlLCBtYXhSZWN1cnNpb25MaW1pdCk7CisgIH0KKworICBzdGF0aWMgX3NraXAoVFByb3RvY29sIHByb3QsIGludCB0eXBlLCBpbnQgcmVjdXJzaW9uTGltaXQpIHsKKyAgICBpZiAocmVjdXJzaW9uTGltaXQgPD0gMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5ERVBUSF9MSU1JVCwgIkRlcHRoIGxpbWl0IGV4Y2VlZGVkIik7CisgICAgfQorCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIFRUeXBlLkJPT0w6CisgICAgICAgIHByb3QucmVhZEJvb2woKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFR5cGUuQllURToKKyAgICAgICAgcHJvdC5yZWFkQnl0ZSgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5JMTY6CisgICAgICAgIHByb3QucmVhZEkxNigpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5JMzI6CisgICAgICAgIHByb3QucmVhZEkzMigpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5JNjQ6CisgICAgICAgIHByb3QucmVhZEk2NCgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5ET1VCTEU6CisgICAgICAgIHByb3QucmVhZERvdWJsZSgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5TVFJJTkc6CisgICAgICAgIHByb3QucmVhZEJpbmFyeSgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgIHByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgVEZpZWxkIGZpZWxkID0gcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBfc2tpcChwcm90LCBmaWVsZC50eXBlLCByZWN1cnNpb25MaW1pdCAtIDEpOworICAgICAgICAgIHByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgcHJvdC5yZWFkU3RydWN0RW5kKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRUeXBlLk1BUDoKKyAgICAgICAgVE1hcCBtYXAgPSBwcm90LnJlYWRNYXBCZWdpbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcC5sZW5ndGg7IGkrKykgeworICAgICAgICAgIF9za2lwKHByb3QsIG1hcC5rZXlUeXBlLCByZWN1cnNpb25MaW1pdCAtIDEpOworICAgICAgICAgIF9za2lwKHByb3QsIG1hcC52YWx1ZVR5cGUsIHJlY3Vyc2lvbkxpbWl0IC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgcHJvdC5yZWFkTWFwRW5kKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRUeXBlLlNFVDoKKyAgICAgICAgVFNldCBzZXQgPSBwcm90LnJlYWRTZXRCZWdpbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykgeworICAgICAgICAgIF9za2lwKHByb3QsIHNldC5lbGVtZW50VHlwZSwgcmVjdXJzaW9uTGltaXQgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBwcm90LnJlYWRTZXRFbmQoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFR5cGUuTElTVDoKKyAgICAgICAgVExpc3QgbGlzdCA9IHByb3QucmVhZExpc3RCZWdpbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBfc2tpcChwcm90LCBsaXN0LmVsZW1lbnRUeXBlLCByZWN1cnNpb25MaW1pdCAtIDEpOworICAgICAgICB9CisgICAgICAgIHByb3QucmVhZExpc3RFbmQoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3NldC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3NldC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNDI1MzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3Rfc2V0LmRhcnQKQEAgLTAsMCArMSwyNSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUU2V0IHsKKyAgZmluYWwgaW50IGVsZW1lbnRUeXBlOworICBmaW5hbCBpbnQgbGVuZ3RoOworCisgIFRTZXQodGhpcy5lbGVtZW50VHlwZSwgdGhpcy5sZW5ndGgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3N0cnVjdC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3N0cnVjdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMDNmNjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3Rfc3RydWN0LmRhcnQKQEAgLTAsMCArMSwyNCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUU3RydWN0IHsKKyAgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgVFN0cnVjdChbdGhpcy5uYW1lID0gIiJdKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF90eXBlLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfdHlwZS5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MTlkOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfdHlwZS5kYXJ0CkBAIC0wLDAgKzEsMzQgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVFR5cGUgeworICBzdGF0aWMgY29uc3QgaW50IFNUT1AgPSAwOworICBzdGF0aWMgY29uc3QgaW50IFZPSUQgPSAxOworICBzdGF0aWMgY29uc3QgaW50IEJPT0wgPSAyOworICBzdGF0aWMgY29uc3QgaW50IEJZVEUgPSAzOworICBzdGF0aWMgY29uc3QgaW50IERPVUJMRSA9IDQ7CisgIHN0YXRpYyBjb25zdCBpbnQgSTE2ID0gNjsKKyAgc3RhdGljIGNvbnN0IGludCBJMzIgPSA4OworICBzdGF0aWMgY29uc3QgaW50IEk2NCA9IDEwOworICBzdGF0aWMgY29uc3QgaW50IFNUUklORyA9IDExOworICBzdGF0aWMgY29uc3QgaW50IFNUUlVDVCA9IDEyOworICBzdGF0aWMgY29uc3QgaW50IE1BUCA9IDEzOworICBzdGF0aWMgY29uc3QgaW50IFNFVCA9IDE0OworICBzdGF0aWMgY29uc3QgaW50IExJU1QgPSAxNTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvc2VyaWFsaXplci90X2Rlc2VyaWFsaXplci5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9zZXJpYWxpemVyL3RfZGVzZXJpYWxpemVyLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQxZDEzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvc2VyaWFsaXplci90X2Rlc2VyaWFsaXplci5kYXJ0CkBAIC0wLDAgKzEsNTAgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVERlc2VyaWFsaXplciB7CisgIGZpbmFsIG1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoJ0Rlc2VyaWFsaXplcicsIFRNZXNzYWdlVHlwZS5PTkVXQVksIDEpOworICBUQnVmZmVyZWRUcmFuc3BvcnQgdHJhbnNwb3J0OworICBUUHJvdG9jb2wgcHJvdG9jb2w7CisKKyAgVERlc2VyaWFsaXplcih7VFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3Rvcnl9KSB7CisgICAgdGhpcy50cmFuc3BvcnQgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCk7CisgICAgCisgICAgaWYgKHByb3RvY29sRmFjdG9yeSA9PSBudWxsKSB7CisgICAgICAgIHByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCk7CisgICAgfQorICAgIAorICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wodGhpcy50cmFuc3BvcnQpOworICB9CisKKyAgdm9pZCByZWFkKFRCYXNlIGJhc2UsIFVpbnQ4TGlzdCBkYXRhKSB7CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKGRhdGEpOworICAgIAorICAgIHRyYW5zcG9ydC5mbHVzaCgpOworICAgIAorICAgIGJhc2UucmVhZChwcm90b2NvbCk7CisgIH0KKworICB2b2lkIHJlYWRTdHJpbmcoVEJhc2UgYmFzZSwgU3RyaW5nIGRhdGEpIHsKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoQkFTRTY0LmRlY29kZShkYXRhKSk7CisgICAgCisgICAgdHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICBiYXNlLnJlYWQocHJvdG9jb2wpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3NlcmlhbGl6ZXIvdF9zZXJpYWxpemVyLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3NlcmlhbGl6ZXIvdF9zZXJpYWxpemVyLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBkZGI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvc2VyaWFsaXplci90X3NlcmlhbGl6ZXIuZGFydApAQCAtMCwwICsxLDQ4IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRTZXJpYWxpemVyIHsKKyAgZmluYWwgbWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgnU2VyaWFsaXplcicsIFRNZXNzYWdlVHlwZS5PTkVXQVksIDEpOworICBUQnVmZmVyZWRUcmFuc3BvcnQgdHJhbnNwb3J0OworICBUUHJvdG9jb2wgcHJvdG9jb2w7CisKKyAgVFNlcmlhbGl6ZXIoe1RQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5fSkgeworICAgIHRoaXMudHJhbnNwb3J0ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgpOworICAgIAorICAgIGlmIChwcm90b2NvbEZhY3RvcnkgPT0gbnVsbCkgeworICAgICAgcHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKTsKKyAgICB9CisKKyAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKHRoaXMudHJhbnNwb3J0KTsKKyAgfQorCisgIFVpbnQ4TGlzdCB3cml0ZShUQmFzZSBiYXNlKSB7CisgICAgYmFzZS53cml0ZShwcm90b2NvbCk7CisgICAgCisgICAgcmV0dXJuIHRyYW5zcG9ydC5jb25zdW1lV3JpdGVCdWZmZXIoKTsKKyAgfQorCisgIFN0cmluZyB3cml0ZVN0cmluZyhUQmFzZSBiYXNlKSB7CisgICAgYmFzZS53cml0ZShwcm90b2NvbCk7CisgICAgCisgICAgVWludDhMaXN0IGJ5dGVzID0gdHJhbnNwb3J0LmNvbnN1bWVXcml0ZUJ1ZmZlcigpOworICAgIAorICAgIHJldHVybiBCQVNFNjQuZW5jb2RlKGJ5dGVzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90X2FwcGxpY2F0aW9uX2Vycm9yLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RfYXBwbGljYXRpb25fZXJyb3IuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjhhYmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90X2FwcGxpY2F0aW9uX2Vycm9yLmRhcnQKQEAgLTAsMCArMSwxMDQgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVEFwcGxpY2F0aW9uRXJyb3JUeXBlIHsKKyAgc3RhdGljIGNvbnN0IGludCBVTktOT1dOID0gMDsKKyAgc3RhdGljIGNvbnN0IGludCBVTktOT1dOX01FVEhPRCA9IDE7CisgIHN0YXRpYyBjb25zdCBpbnQgSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyOworICBzdGF0aWMgY29uc3QgaW50IFdST05HX01FVEhPRF9OQU1FID0gMzsKKyAgc3RhdGljIGNvbnN0IGludCBCQURfU0VRVUVOQ0VfSUQgPSA0OworICBzdGF0aWMgY29uc3QgaW50IE1JU1NJTkdfUkVTVUxUID0gNTsKKyAgc3RhdGljIGNvbnN0IGludCBJTlRFUk5BTF9FUlJPUiA9IDY7CisgIHN0YXRpYyBjb25zdCBpbnQgUFJPVE9DT0xfRVJST1IgPSA3OworICBzdGF0aWMgY29uc3QgaW50IElOVkFMSURfVFJBTlNGT1JNID0gODsKKyAgc3RhdGljIGNvbnN0IGludCBJTlZBTElEX1BST1RPQ09MID0gOTsKKyAgc3RhdGljIGNvbnN0IGludCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwOworfQorCitjbGFzcyBUQXBwbGljYXRpb25FcnJvciBleHRlbmRzIFRFcnJvciB7CisgIHN0YXRpYyBmaW5hbCBUU3RydWN0IF9zdHJ1Y3QgPSBuZXcgVFN0cnVjdCgiVEFwcGxpY2F0aW9uRXJyb3IiKTsKKyAgc3RhdGljIGNvbnN0IGludCBNRVNTQUdFID0gMTsKKyAgc3RhdGljIGZpbmFsIFRGaWVsZCBfbWVzc2FnZUZpZWxkID0KKyAgICAgIG5ldyBURmllbGQoIm1lc3NhZ2UiLCBUVHlwZS5TVFJJTkcsIE1FU1NBR0UpOworICBzdGF0aWMgY29uc3QgaW50IFRZUEUgPSAyOworICBzdGF0aWMgZmluYWwgVEZpZWxkIF90eXBlRmllbGQgPSBuZXcgVEZpZWxkKCJ0eXBlIiwgVFR5cGUuSTMyLCBUWVBFKTsKKworICBUQXBwbGljYXRpb25FcnJvcigKKyAgICAgIFtpbnQgdHlwZSA9IFRBcHBsaWNhdGlvbkVycm9yVHlwZS5VTktOT1dOLCBTdHJpbmcgbWVzc2FnZSA9ICIiXSkKKyAgICAgIDogc3VwZXIodHlwZSwgbWVzc2FnZSk7CisKKyAgc3RhdGljIFRBcHBsaWNhdGlvbkVycm9yIHJlYWQoVFByb3RvY29sIGlwcm90KSB7CisgICAgVEZpZWxkIGZpZWxkOworCisgICAgU3RyaW5nIG1lc3NhZ2UgPSBudWxsOworICAgIGludCB0eXBlID0gVEFwcGxpY2F0aW9uRXJyb3JUeXBlLlVOS05PV047CisKKyAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworCisgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBzd2l0Y2ggKGZpZWxkLmlkKSB7CisgICAgICAgIGNhc2UgTUVTU0FHRToKKyAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVFJJTkcpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVFlQRToKKyAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5JMzIpIHsKKyAgICAgICAgICAgIHR5cGUgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOworICAgIH0KKyAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCk7CisKKyAgICByZXR1cm4gbmV3IFRBcHBsaWNhdGlvbkVycm9yKHR5cGUsIG1lc3NhZ2UpOworICB9CisKKyAgd3JpdGUoVFByb3RvY29sIG9wcm90KSB7CisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihfc3RydWN0KTsKKworICAgIGlmIChtZXNzYWdlICE9IG51bGwgJiYgIW1lc3NhZ2UuaXNFbXB0eSkgeworICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKF9tZXNzYWdlRmllbGQpOworICAgICAgb3Byb3Qud3JpdGVTdHJpbmcobWVzc2FnZSk7CisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKF90eXBlRmllbGQpOworICAgIG9wcm90LndyaXRlSTMyKHR5cGUpOworICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKworICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCk7CisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90X2Jhc2UuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdF9iYXNlLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU1NzFiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdF9iYXNlLmRhcnQKQEAgLTAsMCArMSwzNyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCithYnN0cmFjdCBjbGFzcyBUQmFzZSB7CisgIC8vLyBSZWFkcyB0aGUgVE9iamVjdCBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbC4KKyAgdm9pZCByZWFkKFRQcm90b2NvbCBpcHJvdCk7CisKKyAgLy8vIFdyaXRlcyB0aGUgb2JqZWN0cyBvdXQgdG8gdGhlIFtvcHJvdF0gcHJvdG9jb2wuCisgIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KTsKKworICAvLy8gQ2hlY2sgaWYgYSBmaWVsZCBpcyBjdXJyZW50bHkgc2V0IG9yIHVuc2V0LCB1c2luZyB0aGUgW2ZpZWxkSWRdLgorICBib29sIGlzU2V0KGludCBmaWVsZElkKTsKKworICAvLy8gR2V0IGEgZmllbGQncyB2YWx1ZSBieSBbZmllbGRJZF0uIFByaW1pdGl2ZSB0eXBlcyB3aWxsIGJlIHdyYXBwZWQgaW4gdGhlCisgIC8vLyBhcHByb3ByaWF0ZSAiYm94ZWQiIHR5cGVzLgorICBnZXRGaWVsZFZhbHVlKGludCBmaWVsZElkKTsKKworICAvLy8gU2V0IGEgZmllbGQncyB2YWx1ZSBieSBbZmllbGRJZF0uIFByaW1pdGl2ZSB0eXBlcyBtdXN0IGJlICJib3hlZCIgaW4gdGhlCisgIC8vLyBhcHByb3ByaWF0ZSBvYmplY3Qgd3JhcHBlciB0eXBlLgorICBzZXRGaWVsZFZhbHVlKGludCBmaWVsZElkLCBPYmplY3QgdmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90X2Vycm9yLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RfZXJyb3IuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2FiNzMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90X2Vycm9yLmRhcnQKQEAgLTAsMCArMSwyNyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBURXJyb3IgZXh0ZW5kcyBFcnJvciB7CisgIGZpbmFsIFN0cmluZyBtZXNzYWdlOworICBmaW5hbCBpbnQgdHlwZTsKKworICBURXJyb3IodGhpcy50eXBlLCB0aGlzLm1lc3NhZ2UpOworCisgIFN0cmluZyB0b1N0cmluZygpID0+ICI8VEVycm9yIHR5cGU6ICR0eXBlIG1lc3NhZ2U6ICckbWVzc2FnZSc+IjsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdF9wcm9jZXNzb3IuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdF9wcm9jZXNzb3IuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2YyMGZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90X3Byb2Nlc3Nvci5kYXJ0CkBAIC0wLDAgKzEsMjQgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworLy8vIEEgcHJvY2Vzc29yIGlzIGEgZ2VuZXJpYyBvYmplY3Qgd2hpY2ggb3BlcmF0ZXMgdXBvbiBhbiBpbnB1dCBzdHJlYW0gYW5kCisvLy8gd3JpdGVzIHRvIHNvbWUgb3V0cHV0IHN0cmVhbS4KK2Fic3RyYWN0IGNsYXNzIFRQcm9jZXNzb3IgeworICBib29sIHByb2Nlc3MoVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfYnVmZmVyZWRfdHJhbnNwb3J0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2J1ZmZlcmVkX3RyYW5zcG9ydC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3M2EzMGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2J1ZmZlcmVkX3RyYW5zcG9ydC5kYXJ0CkBAIC0wLDAgKzEsOTggQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworLy8vIEJ1ZmZlcmVkIGltcGxlbWVudGF0aW9uIG9mIFtUVHJhbnNwb3J0XS4KK2NsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgeworICBmaW5hbCBMaXN0PGludD4gX3dyaXRlQnVmZmVyID0gW107CisgIEl0ZXJhdG9yPGludD4gX3JlYWRJdGVyYXRvcjsKKworICBVaW50OExpc3QgY29uc3VtZVdyaXRlQnVmZmVyKCkgeworICAgIFVpbnQ4TGlzdCBidWZmZXIgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KF93cml0ZUJ1ZmZlcik7CisgICAgX3dyaXRlQnVmZmVyLmNsZWFyKCk7CisgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgfQorCisgIHZvaWQgX3NldFJlYWRCdWZmZXIoVWludDhMaXN0IHJlYWRCdWZmZXIpIHsKKyAgICBfcmVhZEl0ZXJhdG9yID0gcmVhZEJ1ZmZlciAhPSBudWxsID8gcmVhZEJ1ZmZlci5pdGVyYXRvciA6IG51bGw7CisgIH0KKworICB2b2lkIF9yZXNldCh7Ym9vbCBpc09wZW46IGZhbHNlfSkgeworICAgIF9pc09wZW4gPSBpc09wZW47CisgICAgX3dyaXRlQnVmZmVyLmNsZWFyKCk7CisgICAgX3JlYWRJdGVyYXRvciA9IG51bGw7CisgIH0KKworICBib29sIGdldCBoYXNSZWFkRGF0YSA9PiBfcmVhZEl0ZXJhdG9yICE9IG51bGw7CisKKyAgYm9vbCBfaXNPcGVuOworICBib29sIGdldCBpc09wZW4gPT4gX2lzT3BlbjsKKworICBGdXR1cmUgb3BlbigpIGFzeW5jIHsKKyAgICBfcmVzZXQoaXNPcGVuOiB0cnVlKTsKKyAgfQorCisgIEZ1dHVyZSBjbG9zZSgpIGFzeW5jIHsKKyAgICBfcmVzZXQoaXNPcGVuOiBmYWxzZSk7CisgIH0KKworICBpbnQgcmVhZChVaW50OExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJidWZmZXIiKTsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID4gYnVmZmVyLmxlbmd0aCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIlRoZSByYW5nZSBleGNlZWRzIHRoZSBidWZmZXIgbGVuZ3RoIik7CisgICAgfQorCisgICAgaWYgKF9yZWFkSXRlcmF0b3IgPT0gbnVsbCB8fCBsZW5ndGggPD0gMCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaW50IGkgPSAwOworICAgIHdoaWxlIChpIDwgbGVuZ3RoICYmIF9yZWFkSXRlcmF0b3IubW92ZU5leHQoKSkgeworICAgICAgYnVmZmVyW29mZnNldCArIGldID0gX3JlYWRJdGVyYXRvci5jdXJyZW50OworICAgICAgaSsrOworICAgIH0KKworICAgIC8vIGNsZWFudXAgaXRlcmF0b3Igd2hlbiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQKKyAgICBpZiAoX3JlYWRJdGVyYXRvci5jdXJyZW50ID09IG51bGwpIHsKKyAgICAgIF9yZWFkSXRlcmF0b3IgPSBudWxsOworICAgIH0KKworICAgIHJldHVybiBpOworICB9CisKKyAgdm9pZCB3cml0ZShVaW50OExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJidWZmZXIiKTsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID4gYnVmZmVyLmxlbmd0aCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIlRoZSByYW5nZSBleGNlZWRzIHRoZSBidWZmZXIgbGVuZ3RoIik7CisgICAgfQorCisgICAgX3dyaXRlQnVmZmVyLmFkZEFsbChidWZmZXIuc3VibGlzdChvZmZzZXQsIG9mZnNldCArIGxlbmd0aCkpOworICB9CisKKyAgRnV0dXJlIGZsdXNoKCkgeworICAgIF9yZWFkSXRlcmF0b3IgPSBjb25zdW1lV3JpdGVCdWZmZXIoKS5pdGVyYXRvcjsKKworICAgIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfZnJhbWVkX3RyYW5zcG9ydC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9mcmFtZWRfdHJhbnNwb3J0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVmMDNmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfZnJhbWVkX3RyYW5zcG9ydC5kYXJ0CkBAIC0wLDAgKzEsMTY5IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKKy8vLyBGcmFtZWQgW1RUcmFuc3BvcnRdLgorLy8vCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBKYXZhIEZyYW1lZCB0cmFuc3BvcnQuCitjbGFzcyBURnJhbWVkVHJhbnNwb3J0IGV4dGVuZHMgVEJ1ZmZlcmVkVHJhbnNwb3J0IHsKKyAgc3RhdGljIGNvbnN0IGludCBoZWFkZXJCeXRlQ291bnQgPSA0OworCisgIGZpbmFsIFRUcmFuc3BvcnQgX3RyYW5zcG9ydDsKKworICBmaW5hbCBVaW50OExpc3QgX2hlYWRlckJ5dGVzID0gbmV3IFVpbnQ4TGlzdChoZWFkZXJCeXRlQ291bnQpOworICBpbnQgX3JlY2VpdmVkSGVhZGVyQnl0ZXMgPSAwOworCisgIGludCBfYm9keVNpemUgPSAwOworICBVaW50OExpc3QgX2JvZHkgPSBudWxsOworICBpbnQgX3JlY2VpdmVkQm9keUJ5dGVzID0gMDsKKworICBDb21wbGV0ZXI8VWludDhMaXN0PiBfZnJhbWVDb21wbGV0ZXIgPSBudWxsOworCisgIFRGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQpIDogX3RyYW5zcG9ydCA9IHRyYW5zcG9ydCB7CisgICAgaWYgKHRyYW5zcG9ydCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJ0cmFuc3BvcnQiKTsKKyAgICB9CisgIH0KKworICBib29sIGdldCBpc09wZW4gPT4gX3RyYW5zcG9ydC5pc09wZW47CisKKyAgRnV0dXJlIG9wZW4oKSB7CisgICAgX3Jlc2V0KGlzT3BlbjogdHJ1ZSk7CisgICAgcmV0dXJuIF90cmFuc3BvcnQub3BlbigpOworICB9CisKKyAgRnV0dXJlIGNsb3NlKCkgeworICAgIF9yZXNldChpc09wZW46IGZhbHNlKTsKKyAgICByZXR1cm4gX3RyYW5zcG9ydC5jbG9zZSgpOworICB9CisKKyAgaW50IHJlYWQoVWludDhMaXN0IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIGlmIChoYXNSZWFkRGF0YSkgeworICAgICAgaW50IGdvdCA9IHN1cGVyLnJlYWQoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICBpZiAoZ290ID4gMCkgcmV0dXJuIGdvdDsKKyAgICB9CisKKyAgICAvLyBJTVBPUlRBTlQ6IGJ5IHRoZSB0aW1lIHlvdSd2ZSBnb3QgaGVyZSwKKyAgICAvLyBhbiBlbnRpcmUgZnJhbWUgaXMgYXZhaWxhYmxlIGZvciByZWFkaW5nCisKKyAgICByZXR1cm4gc3VwZXIucmVhZChidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgX3JlYWRGcmFtZSgpIHsKKyAgICBpZiAoX2JvZHkgPT0gbnVsbCkgeworICAgICAgYm9vbCBnb3RGdWxsSGVhZGVyID0gX3JlYWRGcmFtZUhlYWRlcigpOworICAgICAgaWYgKCFnb3RGdWxsSGVhZGVyKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBfcmVhZEZyYW1lQm9keSgpOworICB9CisKKyAgYm9vbCBfcmVhZEZyYW1lSGVhZGVyKCkgeworICAgIHZhciByZW1haW5pbmdIZWFkZXJCeXRlcyA9IGhlYWRlckJ5dGVDb3VudCAtIF9yZWNlaXZlZEhlYWRlckJ5dGVzOworCisgICAgaW50IGdvdCA9IF90cmFuc3BvcnQucmVhZChfaGVhZGVyQnl0ZXMsIF9yZWNlaXZlZEhlYWRlckJ5dGVzLCByZW1haW5pbmdIZWFkZXJCeXRlcyk7CisgICAgaWYgKGdvdCA8IDApIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXJyb3IoCisgICAgICAgICAgVFRyYW5zcG9ydEVycm9yVHlwZS5VTktOT1dOLCAiU29ja2V0IGNsb3NlZCBkdXJpbmcgZnJhbWUgaGVhZGVyIHJlYWQiKTsKKyAgICB9CisKKyAgICBfcmVjZWl2ZWRIZWFkZXJCeXRlcyArPSBnb3Q7CisKKyAgICBpZiAoX3JlY2VpdmVkSGVhZGVyQnl0ZXMgPT0gaGVhZGVyQnl0ZUNvdW50KSB7CisgICAgICBpbnQgc2l6ZSA9IF9oZWFkZXJCeXRlcy5idWZmZXIuYXNCeXRlRGF0YSgpLmdldFVpbnQzMigwKTsKKworICAgICAgX3JlY2VpdmVkSGVhZGVyQnl0ZXMgPSAwOworCisgICAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcigKKyAgICAgICAgICAgIFRUcmFuc3BvcnRFcnJvclR5cGUuVU5LTk9XTiwgIlJlYWQgYSBuZWdhdGl2ZSBmcmFtZSBzaXplOiAkc2l6ZSIpOworICAgICAgfQorCisgICAgICBfYm9keVNpemUgPSBzaXplOworICAgICAgX2JvZHkgPSBuZXcgVWludDhMaXN0KF9ib2R5U2l6ZSk7CisgICAgICBfcmVjZWl2ZWRCb2R5Qnl0ZXMgPSAwOworCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgX3JlZ2lzdGVyRm9yUmVhZGFibGVCeXRlcygpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHZvaWQgX3JlYWRGcmFtZUJvZHkoKSB7CisgICAgdmFyIHJlbWFpbmluZ0JvZHlCeXRlcyA9IF9ib2R5U2l6ZSAtIF9yZWNlaXZlZEJvZHlCeXRlczsKKworICAgIGludCBnb3QgPSBfdHJhbnNwb3J0LnJlYWQoX2JvZHksIF9yZWNlaXZlZEJvZHlCeXRlcywgcmVtYWluaW5nQm9keUJ5dGVzKTsKKyAgICBpZiAoZ290IDwgMCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcigKKyAgICAgICAgICBUVHJhbnNwb3J0RXJyb3JUeXBlLlVOS05PV04sICJTb2NrZXQgY2xvc2VkIGR1cmluZyBmcmFtZSBib2R5IHJlYWQiKTsKKyAgICB9CisKKyAgICBfcmVjZWl2ZWRCb2R5Qnl0ZXMgKz0gZ290OworCisgICAgaWYgKF9yZWNlaXZlZEJvZHlCeXRlcyA9PSBfYm9keVNpemUpIHsKKyAgICAgIHZhciBib2R5ID0gX2JvZHk7CisKKyAgICAgIF9ib2R5U2l6ZSA9IDA7CisgICAgICBfYm9keSA9IG51bGw7CisgICAgICBfcmVjZWl2ZWRCb2R5Qnl0ZXMgPSAwOworCisgICAgICBfc2V0UmVhZEJ1ZmZlcihib2R5KTsKKworICAgICAgdmFyIGNvbXBsZXRlciA9IF9mcmFtZUNvbXBsZXRlcjsKKyAgICAgIF9mcmFtZUNvbXBsZXRlciA9IG51bGw7CisgICAgICBjb21wbGV0ZXIuY29tcGxldGUobmV3IFVpbnQ4TGlzdCgwKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIF9yZWdpc3RlckZvclJlYWRhYmxlQnl0ZXMoKTsKKyAgICB9CisgIH0KKworICBGdXR1cmUgZmx1c2goKSB7CisgICAgaWYgKF9mcmFtZUNvbXBsZXRlciA9PSBudWxsKSB7CisgICAgICBVaW50OExpc3QgYnVmZmVyID0gY29uc3VtZVdyaXRlQnVmZmVyKCk7CisgICAgICBpbnQgbGVuZ3RoID0gYnVmZmVyLmxlbmd0aDsKKworICAgICAgX2hlYWRlckJ5dGVzLmJ1ZmZlci5hc0J5dGVEYXRhKCkuc2V0VWludDMyKDAsIGxlbmd0aCk7CisgICAgICBfdHJhbnNwb3J0LndyaXRlKF9oZWFkZXJCeXRlcywgMCwgaGVhZGVyQnl0ZUNvdW50KTsKKyAgICAgIF90cmFuc3BvcnQud3JpdGUoYnVmZmVyLCAwLCBsZW5ndGgpOworCisgICAgICBfZnJhbWVDb21wbGV0ZXIgID0gbmV3IENvbXBsZXRlcjxVaW50OExpc3Q+KCk7CisgICAgICBfcmVnaXN0ZXJGb3JSZWFkYWJsZUJ5dGVzKCk7CisgICAgfQorCisgICAgcmV0dXJuIF9mcmFtZUNvbXBsZXRlci5mdXR1cmU7CisgIH0KKworICB2b2lkIF9yZWdpc3RlckZvclJlYWRhYmxlQnl0ZXMoKSB7CisgICAgX3RyYW5zcG9ydC5mbHVzaCgpLnRoZW4oKF8pIHsKKyAgICAgIF9yZWFkRnJhbWUoKTsKKyAgICB9KS5jYXRjaEVycm9yKChlKSB7CisgICAgICB2YXIgY29tcGxldGVyID0gX2ZyYW1lQ29tcGxldGVyOworCisgICAgICBfcmVjZWl2ZWRIZWFkZXJCeXRlcyA9IDA7CisgICAgICBfYm9keVNpemUgPSAwOworICAgICAgX2JvZHkgPSBudWxsOworICAgICAgX3JlY2VpdmVkQm9keUJ5dGVzID0gMDsKKyAgICAgIF9mcmFtZUNvbXBsZXRlciA9IG51bGw7CisKKyAgICAgIGNvbXBsZXRlci5jb21wbGV0ZUVycm9yKGUpOworICAgIH0pOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2h0dHBfdHJhbnNwb3J0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2h0dHBfdHJhbnNwb3J0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3OGU5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfaHR0cF90cmFuc3BvcnQuZGFydApAQCAtMCwwICsxLDEwMCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCisvLy8gSFRUUCBpbXBsZW1lbnRhdGlvbiBvZiBbVFRyYW5zcG9ydF0uCisvLy8KKy8vLyBGb3IgZXhhbXBsZToKKy8vLworLy8vICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRIdHRwQ2xpZW50VHJhbnNwb3J0KG5ldyBCcm93c2VyQ2xpZW50KCksCisvLy8gICAgICAgICBuZXcgVEh0dHBDb25maWcodXJsLCB7J1gtTXktQ3VzdG9tLUhlYWRlcic6ICdteSB2YWx1ZSd9KSk7CisvLy8gICAgIHZhciBwcm90b2NvbCA9IG5ldyBUSnNvblByb3RvY29sKHRyYW5zcG9ydCk7CisvLy8gICAgIHZhciBjbGllbnQgPSBuZXcgTXlUaHJpZnRTZXJ2aWNlQ2xpZW50KHByb3RvY29sKTsKKy8vLyAgICAgdmFyIHJlc3VsdCA9IGNsaWVudC5teU1ldGhvZCgpOworLy8vCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBKUyBYSFIgSFRUUCB0cmFuc3BvcnQuCitjbGFzcyBUSHR0cENsaWVudFRyYW5zcG9ydCBleHRlbmRzIFRCdWZmZXJlZFRyYW5zcG9ydCB7CisgIGZpbmFsIENsaWVudCBodHRwQ2xpZW50OworICBmaW5hbCBUSHR0cENvbmZpZyBjb25maWc7CisKKyAgVEh0dHBDbGllbnRUcmFuc3BvcnQodGhpcy5odHRwQ2xpZW50LCB0aGlzLmNvbmZpZykgeworICAgIGlmIChodHRwQ2xpZW50ID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoImh0dHBDbGllbnQiKTsKKyAgICB9CisgIH0KKworICBGdXR1cmUgY2xvc2UoKSBhc3luYyB7CisgICAgX3Jlc2V0KGlzT3BlbjogZmFsc2UpOworICAgIGh0dHBDbGllbnQuY2xvc2UoKTsKKyAgfQorCisgIEZ1dHVyZSBmbHVzaCgpIHsKKyAgICB2YXIgcmVxdWVzdEJvZHkgPSBCQVNFNjQuZW5jb2RlKGNvbnN1bWVXcml0ZUJ1ZmZlcigpKTsKKworICAgIC8vIFVzZSBhIHN5bmMgY29tcGxldGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBidWZmZXIgY2FuIGJlIHJlYWQgaW1tZWRpYXRlbHkKKyAgICAvLyBhZnRlciB0aGUgcmVhZCBidWZmZXIgaXMgc2V0LCBhbmQgYXZvaWQgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSBhbm90aGVyCisgICAgLy8gcmVzcG9uc2UgY291bGQgb3ZlcndyaXRlIHRoZSByZWFkIGJ1ZmZlci4KKyAgICB2YXIgY29tcGxldGVyID0gbmV3IENvbXBsZXRlci5zeW5jKCk7CisKKyAgICBodHRwQ2xpZW50CisgICAgICAgIC5wb3N0KGNvbmZpZy51cmwsIGhlYWRlcnM6IGNvbmZpZy5oZWFkZXJzLCBib2R5OiByZXF1ZXN0Qm9keSkKKyAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSB7CisgICAgICBVaW50OExpc3QgZGF0YTsKKyAgICAgIHRyeSB7CisgICAgICAgIGRhdGEgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KAorICAgICAgICAgICAgQkFTRTY0LmRlY29kZShyZXNwb25zZS5ib2R5KSk7CisgICAgICB9IG9uIEZvcm1hdEV4Y2VwdGlvbiBjYXRjaCAoXykgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICJFeHBlY3RlZCBhIEJhc2UgNjQgZW5jb2RlZCBzdHJpbmcuIik7CisgICAgICB9CisKKyAgICAgIF9zZXRSZWFkQnVmZmVyKGRhdGEpOworICAgICAgY29tcGxldGVyLmNvbXBsZXRlKCk7CisgICAgfSk7CisKKyAgICByZXR1cm4gY29tcGxldGVyLmZ1dHVyZTsKKyAgfQorfQorCitjbGFzcyBUSHR0cENvbmZpZyB7CisgIGZpbmFsIFVyaSB1cmw7CisKKyAgTWFwPFN0cmluZywgU3RyaW5nPiBfaGVhZGVyczsKKyAgTWFwPFN0cmluZywgU3RyaW5nPiBnZXQgaGVhZGVycyA9PiBfaGVhZGVyczsKKworICBUSHR0cENvbmZpZyh0aGlzLnVybCwgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzKSB7CisgICAgaWYgKHVybCA9PSBudWxsIHx8ICF1cmwuaGFzQXV0aG9yaXR5KSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiSW52YWxpZCB1cmwiKTsKKyAgICB9CisKKyAgICBfaW5pdEhlYWRlcnMoaGVhZGVycyk7CisgIH0KKworICB2b2lkIF9pbml0SGVhZGVycyhNYXA8U3RyaW5nLCBTdHJpbmc+IGluaXRpYWwpIHsKKyAgICB2YXIgaCA9IHt9OworCisgICAgaWYgKGluaXRpYWwgIT0gbnVsbCkgeworICAgICAgaC5hZGRBbGwoaW5pdGlhbCk7CisgICAgfQorCisgICAgaFsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veC10aHJpZnQnOworICAgIGhbJ0FjY2VwdCddID0gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JzsKKworICAgIF9oZWFkZXJzID0gbmV3IE1hcC51bm1vZGlmaWFibGUoaCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfbWVzc2FnZV9yZWFkZXIuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfbWVzc2FnZV9yZWFkZXIuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2EwNzA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9tZXNzYWdlX3JlYWRlci5kYXJ0CkBAIC0wLDAgKzEsOTkgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworLy8vIFtUTWVzc2FnZVJlYWRlcl0gZXh0cmFjdHMgYSBbVE1lc3NhZ2VdIGZyb20gYnl0ZXMuICBUaGlzIGlzIHVzZWQgdG8gYWxsb3cgYQorLy8vIHRyYW5zcG9ydCB0byBpbnNwZWN0IHRoZSBtZXNzYWdlIHNlcWlkIGFuZCBtYXAgcmVzcG9uc2VzIHRvIHJlcXVlc3RzLgorY2xhc3MgVE1lc3NhZ2VSZWFkZXIgeworICBmaW5hbCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeTsKKworICBmaW5hbCBpbnQgYnl0ZU9mZnNldDsKKyAgZmluYWwgX1RNZXNzYWdlUmVhZGVyVHJhbnNwb3J0IF90cmFuc3BvcnQ7CisKKyAgLy8vIENvbnN0cnVjdCBhIFtNZXNzYWdlUmVhZGVyXS4gIFRoZSBvcHRpb25hbCBbYnl0ZU9mZnNldF0gc3BlY2lmaWVzIHRoZQorICAvLy8gbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAgYmVmb3JlIHJlYWRpbmcgdGhlIFtUTWVzc2FnZV0uCisgIFRNZXNzYWdlUmVhZGVyKHRoaXMucHJvdG9jb2xGYWN0b3J5LCB7aW50IGJ5dGVPZmZzZXQ6IDB9KQorICAgICAgOiBfdHJhbnNwb3J0ID0gbmV3IF9UTWVzc2FnZVJlYWRlclRyYW5zcG9ydCgpLAorICAgICAgICB0aGlzLmJ5dGVPZmZzZXQgPSBieXRlT2Zmc2V0OworCisgIFRNZXNzYWdlIHJlYWRNZXNzYWdlKFVpbnQ4TGlzdCBieXRlcykgeworICAgIF90cmFuc3BvcnQucmVzZXQoYnl0ZXMsIGJ5dGVPZmZzZXQpOworICAgIFRQcm90b2NvbCBwcm90b2NvbCA9IHByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChfdHJhbnNwb3J0KTsKKyAgICBUTWVzc2FnZSBtZXNzYWdlID0gcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgIF90cmFuc3BvcnQucmVzZXQobnVsbCk7CisKKyAgICByZXR1cm4gbWVzc2FnZTsKKyAgfQorfQorCisvLy8gQW4gaW50ZXJuYWwgY2xhc3MgdXNlZCB0byBzdXBwb3J0IFtUTWVzc2FnZVJlYWRlcl0uCitjbGFzcyBfVE1lc3NhZ2VSZWFkZXJUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKKyAgX1RNZXNzYWdlUmVhZGVyVHJhbnNwb3J0KCk7CisKKyAgSXRlcmF0b3I8aW50PiBfcmVhZEl0ZXJhdG9yOworCisgIHZvaWQgcmVzZXQoVWludDhMaXN0IGJ5dGVzLCBbaW50IG9mZnNldCA9IDBdKSB7CisgICAgaWYgKGJ5dGVzID09IG51bGwpIHsKKyAgICAgIF9yZWFkSXRlcmF0b3IgPSBudWxsOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChvZmZzZXQgPiBieXRlcy5sZW5ndGgpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJUaGUgb2Zmc2V0IGV4Y2VlZHMgdGhlIGJ5dGVzIGxlbmd0aCIpOworICAgIH0KKworICAgIF9yZWFkSXRlcmF0b3IgPSBieXRlcy5pdGVyYXRvcjsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2Zmc2V0OyBpKyspIHsKKyAgICAgIF9yZWFkSXRlcmF0b3IubW92ZU5leHQoKTsKKyAgICB9CisgIH0KKworICBnZXQgaXNPcGVuID0+IHRydWU7CisKKyAgRnV0dXJlIG9wZW4oKSA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5zdXBwb3J0ZWQgaW4gTWVzc2FnZVJlYWRlciIpOworCisgIEZ1dHVyZSBjbG9zZSgpID0+IHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbnN1cHBvcnRlZCBpbiBNZXNzYWdlUmVhZGVyIik7CisKKyAgaW50IHJlYWQoVWludDhMaXN0IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIGlmIChidWZmZXIgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgiYnVmZmVyIik7CisgICAgfQorCisgICAgaWYgKG9mZnNldCArIGxlbmd0aCA+IGJ1ZmZlci5sZW5ndGgpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJUaGUgcmFuZ2UgZXhjZWVkcyB0aGUgYnVmZmVyIGxlbmd0aCIpOworICAgIH0KKworICAgIGlmIChfcmVhZEl0ZXJhdG9yID09IG51bGwgfHwgbGVuZ3RoIDw9IDApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGludCBpID0gMDsKKyAgICB3aGlsZSAoaSA8IGxlbmd0aCAmJiBfcmVhZEl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKKyAgICAgIGJ1ZmZlcltvZmZzZXQgKyBpXSA9IF9yZWFkSXRlcmF0b3IuY3VycmVudDsKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgICByZXR1cm4gaTsKKyAgfQorCisgIHZvaWQgd3JpdGUoVWludDhMaXN0IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgPT4KKyAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbnN1cHBvcnRlZCBpbiBNZXNzYWdlUmVhZGVyIik7CisKKyAgRnV0dXJlIGZsdXNoKCkgPT4gdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuc3VwcG9ydGVkIGluIE1lc3NhZ2VSZWFkZXIiKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3Rfc29ja2V0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3NvY2tldC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZWI2YjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3NvY2tldC5kYXJ0CkBAIC0wLDAgKzEsMzggQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworZW51bSBUU29ja2V0U3RhdGUgeyBDTE9TRUQsIE9QRU4gfQorCithYnN0cmFjdCBjbGFzcyBUU29ja2V0IHsKKyAgU3RyZWFtPFRTb2NrZXRTdGF0ZT4gZ2V0IG9uU3RhdGU7CisKKyAgU3RyZWFtPE9iamVjdD4gZ2V0IG9uRXJyb3I7CisKKyAgU3RyZWFtPFVpbnQ4TGlzdD4gZ2V0IG9uTWVzc2FnZTsKKworICBib29sIGdldCBpc09wZW47CisKKyAgYm9vbCBnZXQgaXNDbG9zZWQ7CisKKyAgRnV0dXJlIG9wZW4oKTsKKworICBGdXR1cmUgY2xvc2UoKTsKKworICB2b2lkIHNlbmQoVWludDhMaXN0IGRhdGEpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9zb2NrZXRfdHJhbnNwb3J0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3NvY2tldF90cmFuc3BvcnQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDEzNzRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9zb2NrZXRfdHJhbnNwb3J0LmRhcnQKQEAgLTAsMCArMSwxNzcgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworLy8vIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBbVFRyYW5zcG9ydF0uCisvLy8KKy8vLyBGb3IgZXhhbXBsZToKKy8vLworLy8vICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRDbGllbnRTb2NrZXRUcmFuc3BvcnQobmV3IFRXZWJTb2NrZXQodXJsKSk7CisvLy8gICAgIHZhciBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKy8vLyAgICAgdmFyIGNsaWVudCA9IG5ldyBNeVRocmlmdFNlcnZpY2VDbGllbnQocHJvdG9jb2wpOworLy8vICAgICB2YXIgcmVzdWx0ID0gY2xpZW50Lm15TWV0aG9kKCk7CisvLy8KKy8vLyBBZGFwdGVkIGZyb20gdGhlIEpTIFdlYlNvY2tldCB0cmFuc3BvcnQuCithYnN0cmFjdCBjbGFzcyBUU29ja2V0VHJhbnNwb3J0IGV4dGVuZHMgVEJ1ZmZlcmVkVHJhbnNwb3J0IHsKKyAgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IG5ldyBMb2dnZXIoJ3RocmlmdC5UU29ja2V0VHJhbnNwb3J0Jyk7CisKKyAgZmluYWwgVFNvY2tldCBzb2NrZXQ7CisKKyAgLy8vIEEgdHJhbnNwb3J0IHVzaW5nIHRoZSBwcm92aWRlZCBbc29ja2V0XS4KKyAgVFNvY2tldFRyYW5zcG9ydCh0aGlzLnNvY2tldCkgeworICAgIGlmIChzb2NrZXQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgnc29ja2V0Jyk7CisgICAgfQorCisgICAgc29ja2V0Lm9uRXJyb3IubGlzdGVuKChlKSA9PiBsb2dnZXIud2FybmluZyhlKSk7CisgICAgc29ja2V0Lm9uTWVzc2FnZS5saXN0ZW4oaGFuZGxlSW5jb21pbmdNZXNzYWdlKTsKKyAgfQorCisgIGJvb2wgZ2V0IGlzT3BlbiA9PiBzb2NrZXQuaXNPcGVuOworCisgIEZ1dHVyZSBvcGVuKCkgeworICAgIF9yZXNldChpc09wZW46IHRydWUpOworICAgIHJldHVybiBzb2NrZXQub3BlbigpOworICB9CisKKyAgRnV0dXJlIGNsb3NlKCkgeworICAgIF9yZXNldChpc09wZW46IGZhbHNlKTsKKyAgICByZXR1cm4gc29ja2V0LmNsb3NlKCk7CisgIH0KKworICAvLy8gTWFrZSBhbiBpbmNvbWluZyBtZXNzYWdlIGF2YWlsYWJsZSB0byByZWFkIGZyb20gdGhlIHRyYW5zcG9ydC4KKyAgdm9pZCBoYW5kbGVJbmNvbWluZ01lc3NhZ2UoVWludDhMaXN0IG1lc3NhZ2VCeXRlcykgeworICAgIF9zZXRSZWFkQnVmZmVyKG1lc3NhZ2VCeXRlcyk7CisgIH0KK30KKworLy8vIFtUQ2xpZW50U29ja2V0VHJhbnNwb3J0XSBpcyBhIGJhc2ljIGNsaWVudCBzb2NrZXQgdHJhbnNwb3J0LiAgSXQgc2VuZHMKKy8vLyBvdXRnb2luZyBtZXNzYWdlcyBhbmQgZXhwZWN0cyBhIHJlc3BvbnNlLgorLy8vCisvLy8gTk9URTogVGhpcyB0cmFuc3BvcnQgZXhwZWN0cyBhIHNpbmdsZSB0aHJlYWRlZCBzZXJ2ZXIsIGFzIGl0IHdpbGwgcHJvY2VzcworLy8vIHJlc3BvbnNlcyBpbiBGSUZPIG9yZGVyLgorY2xhc3MgVENsaWVudFNvY2tldFRyYW5zcG9ydCBleHRlbmRzIFRTb2NrZXRUcmFuc3BvcnQgeworICBmaW5hbCBMaXN0PENvbXBsZXRlcjxVaW50OExpc3Q+PiBfY29tcGxldGVycyA9IFtdOworCisgIFRDbGllbnRTb2NrZXRUcmFuc3BvcnQoVFNvY2tldCBzb2NrZXQpIDogc3VwZXIoc29ja2V0KTsKKworICBGdXR1cmUgZmx1c2goKSB7CisgICAgVWludDhMaXN0IGJ5dGVzID0gY29uc3VtZVdyaXRlQnVmZmVyKCk7CisKKyAgICAvLyBVc2UgYSBzeW5jIGNvbXBsZXRlciB0byBlbnN1cmUgdGhhdCB0aGUgYnVmZmVyIGNhbiBiZSByZWFkIGltbWVkaWF0ZWx5CisgICAgLy8gYWZ0ZXIgdGhlIHJlYWQgYnVmZmVyIGlzIHNldCwgYW5kIGF2b2lkIGEgcmFjZSBjb25kaXRpb24gd2hlcmUgYW5vdGhlcgorICAgIC8vIHJlc3BvbnNlIGNvdWxkIG92ZXJ3cml0ZSB0aGUgcmVhZCBidWZmZXIuCisgICAgdmFyIGNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXI8VWludDhMaXN0Pi5zeW5jKCk7CisgICAgX2NvbXBsZXRlcnMuYWRkKGNvbXBsZXRlcik7CisKKyAgICBpZiAoYnl0ZXMubGVuZ3RoSW5CeXRlcyA+IDApIHsKKyAgICAgIHNvY2tldC5zZW5kKGJ5dGVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gY29tcGxldGVyLmZ1dHVyZTsKKyAgfQorCisgIHZvaWQgaGFuZGxlSW5jb21pbmdNZXNzYWdlKFVpbnQ4TGlzdCBtZXNzYWdlQnl0ZXMpIHsKKyAgICBzdXBlci5oYW5kbGVJbmNvbWluZ01lc3NhZ2UobWVzc2FnZUJ5dGVzKTsKKworICAgIGlmIChfY29tcGxldGVycy5pc05vdEVtcHR5KSB7CisgICAgICB2YXIgY29tcGxldGVyID0gX2NvbXBsZXRlcnMucmVtb3ZlQXQoMCk7CisgICAgICBjb21wbGV0ZXIuY29tcGxldGUoKTsKKyAgICB9CisgIH0KK30KKworLy8vIFtUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnRdIHNlbmRzIG91dGdvaW5nIG1lc3NhZ2VzIGFuZCBleHBlY3RzIGFuCisvLy8gYXN5bmNocm9ub3VzIHJlc3BvbnNlLgorLy8vCisvLy8gTk9URTogVGhpcyB0cmFuc3BvcnQgdXNlcyBhIFtNZXNzYWdlUmVhZGVyXSB0byByZWFkIGEgW1RNZXNzYWdlXSB3aGVuIGFuCisvLy8gaW5jb21pbmcgbWVzc2FnZSBhcnJpdmVzIHRvIGNvcnJlbGF0ZSBhIHJlc3BvbnNlIHRvIGEgcmVxdWVzdCwgdXNpbmcgdGhlCisvLy8gc2VxaWQuCitjbGFzcyBUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQgZXh0ZW5kcyBUU29ja2V0VHJhbnNwb3J0IHsKKyAgc3RhdGljIGNvbnN0IGRlZmF1bHRUaW1lb3V0ID0gY29uc3QgRHVyYXRpb24oc2Vjb25kczogMzApOworCisgIGZpbmFsIE1hcDxpbnQsIENvbXBsZXRlcjxVaW50OExpc3Q+PiBfY29tcGxldGVycyA9IHt9OworCisgIGZpbmFsIFRNZXNzYWdlUmVhZGVyIG1lc3NhZ2VSZWFkZXI7CisKKyAgZmluYWwgRHVyYXRpb24gcmVzcG9uc2VUaW1lb3V0OworCisgIFRBc3luY0NsaWVudFNvY2tldFRyYW5zcG9ydChUU29ja2V0IHNvY2tldCwgVE1lc3NhZ2VSZWFkZXIgbWVzc2FnZVJlYWRlciwKKyAgICAgIHtEdXJhdGlvbiByZXNwb25zZVRpbWVvdXQ6IGRlZmF1bHRUaW1lb3V0fSkKKyAgICAgIDogdGhpcy5tZXNzYWdlUmVhZGVyID0gbWVzc2FnZVJlYWRlciwKKyAgICAgICAgdGhpcy5yZXNwb25zZVRpbWVvdXQgPSByZXNwb25zZVRpbWVvdXQsCisgICAgICAgIHN1cGVyKHNvY2tldCk7CisKKyAgRnV0dXJlIGZsdXNoKCkgeworICAgIFVpbnQ4TGlzdCBieXRlcyA9IGNvbnN1bWVXcml0ZUJ1ZmZlcigpOworICAgIFRNZXNzYWdlIG1lc3NhZ2UgPSBtZXNzYWdlUmVhZGVyLnJlYWRNZXNzYWdlKGJ5dGVzKTsKKyAgICBpbnQgc2VxaWQgPSBtZXNzYWdlLnNlcWlkOworCisgICAgLy8gVXNlIGEgc3luYyBjb21wbGV0ZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGJ1ZmZlciBjYW4gYmUgcmVhZCBpbW1lZGlhdGVseQorICAgIC8vIGFmdGVyIHRoZSByZWFkIGJ1ZmZlciBpcyBzZXQsIGFuZCBhdm9pZCBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIGFub3RoZXIKKyAgICAvLyByZXNwb25zZSBjb3VsZCBvdmVyd3JpdGUgdGhlIHJlYWQgYnVmZmVyLgorICAgIHZhciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPFVpbnQ4TGlzdD4uc3luYygpOworICAgIF9jb21wbGV0ZXJzW3NlcWlkXSA9IGNvbXBsZXRlcjsKKworICAgIGlmIChyZXNwb25zZVRpbWVvdXQgIT0gbnVsbCkgeworICAgICAgbmV3IEZ1dHVyZS5kZWxheWVkKHJlc3BvbnNlVGltZW91dCwgKCkgeworICAgICAgICB2YXIgY29tcGxldGVyID0gX2NvbXBsZXRlcnMucmVtb3ZlKHNlcWlkKTsKKyAgICAgICAgaWYgKGNvbXBsZXRlciAhPSBudWxsKSB7CisgICAgICAgICAgY29tcGxldGVyLmNvbXBsZXRlRXJyb3IoCisgICAgICAgICAgICAgIG5ldyBUaW1lb3V0RXhjZXB0aW9uKCJSZXNwb25zZSB0aW1lZCBvdXQuIiwgcmVzcG9uc2VUaW1lb3V0KSk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0KKworICAgIHNvY2tldC5zZW5kKGJ5dGVzKTsKKworICAgIHJldHVybiBjb21wbGV0ZXIuZnV0dXJlOworICB9CisKKyAgdm9pZCBoYW5kbGVJbmNvbWluZ01lc3NhZ2UoVWludDhMaXN0IG1lc3NhZ2VCeXRlcykgeworICAgIHN1cGVyLmhhbmRsZUluY29taW5nTWVzc2FnZShtZXNzYWdlQnl0ZXMpOworCisgICAgVE1lc3NhZ2UgbWVzc2FnZSA9IG1lc3NhZ2VSZWFkZXIucmVhZE1lc3NhZ2UobWVzc2FnZUJ5dGVzKTsKKyAgICB2YXIgY29tcGxldGVyID0gX2NvbXBsZXRlcnMucmVtb3ZlKG1lc3NhZ2Uuc2VxaWQpOworICAgIGlmIChjb21wbGV0ZXIgIT0gbnVsbCkgeworICAgICAgY29tcGxldGVyLmNvbXBsZXRlKCk7CisgICAgfQorICB9Cit9CisKKy8vLyBbVFNlcnZlclNvY2tldFRyYW5zcG9ydF0gbGlzdGVucyBmb3IgaW5jb21pbmcgbWVzc2FnZXMuICBXaGVuIGl0IHNlbmRzIGEKKy8vLyByZXNwb25zZSwgaXQgZG9lcyBub3QgZXhwZWN0IGFuIGFja25vd2xlZGdlbWVudC4KK2NsYXNzIFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQgZXh0ZW5kcyBUU29ja2V0VHJhbnNwb3J0IHsKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlciBfb25JbmNvbWluZ01lc3NhZ2VDb250cm9sbGVyOworICBTdHJlYW0gZ2V0IG9uSW5jb21pbmdNZXNzYWdlID0+IF9vbkluY29taW5nTWVzc2FnZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoVFNvY2tldCBzb2NrZXQpCisgICAgICA6IF9vbkluY29taW5nTWVzc2FnZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSwKKyAgICAgICAgc3VwZXIoc29ja2V0KTsKKworICBGdXR1cmUgZmx1c2goKSBhc3luYyB7CisgICAgVWludDhMaXN0IG1lc3NhZ2UgPSBjb25zdW1lV3JpdGVCdWZmZXIoKTsKKyAgICBzb2NrZXQuc2VuZChtZXNzYWdlKTsKKyAgfQorCisgIHZvaWQgaGFuZGxlSW5jb21pbmdNZXNzYWdlKFVpbnQ4TGlzdCBtZXNzYWdlQnl0ZXMpIHsKKyAgICBzdXBlci5oYW5kbGVJbmNvbWluZ01lc3NhZ2UobWVzc2FnZUJ5dGVzKTsKKworICAgIF9vbkluY29taW5nTWVzc2FnZUNvbnRyb2xsZXIuYWRkKG51bGwpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjNkNWViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnQuZGFydApAQCAtMCwwICsxLDcwIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2Fic3RyYWN0IGNsYXNzIFRUcmFuc3BvcnQgeworICAvLy8gUXVlcmllcyB3aGV0aGVyIHRoZSB0cmFuc3BvcnQgaXMgb3Blbi4KKyAgLy8vIFJldHVybnMgW3RydWVdIGlmIHRoZSB0cmFuc3BvcnQgaXMgb3Blbi4KKyAgYm9vbCBnZXQgaXNPcGVuOworCisgIC8vLyBPcGVucyB0aGUgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcuCisgIC8vLyBUaHJvd3MgW1RUcmFuc3BvcnRFcnJvcl0gaWYgdGhlIHRyYW5zcG9ydCBjb3VsZCBub3QgYmUgb3BlbmVkLgorICBGdXR1cmUgb3BlbigpOworCisgIC8vLyBDbG9zZXMgdGhlIHRyYW5zcG9ydC4KKyAgRnV0dXJlIGNsb3NlKCk7CisKKyAgLy8vIFJlYWRzIHVwIHRvIFtsZW5ndGhdIGJ5dGVzIGludG8gW2J1ZmZlcl0sIHN0YXJ0aW5nIGF0IFtvZmZzZXRdLgorICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQuCisgIC8vLyBUaHJvd3MgW1RUcmFuc3BvcnRFcnJvcl0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgZGF0YQorICBpbnQgcmVhZChVaW50OExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKKworICAvLy8gR3VhcmFudGVlcyB0aGF0IGFsbCBvZiBbbGVuZ3RoXSBieXRlcyBhcmUgYWN0dWFsbHkgcmVhZCBvZmYgdGhlIHRyYW5zcG9ydC4KKyAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLCB3aGljaCBtdXN0IGJlIGVxdWFsIHRvCisgIC8vLyBbbGVuZ3RoXS4KKyAgLy8vIFRocm93cyBbVFRyYW5zcG9ydEVycm9yXSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBkYXRhCisgIGludCByZWFkQWxsKFVpbnQ4TGlzdCBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICBpbnQgZ290ID0gMDsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICB3aGlsZSAoZ290IDwgbGVuZ3RoKSB7CisgICAgICByZXQgPSByZWFkKGJ1ZmZlciwgb2Zmc2V0ICsgZ290LCBsZW5ndGggLSBnb3QpOworICAgICAgaWYgKHJldCA8PSAwKSB7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXJyb3IoCisgICAgICAgICAgICBUVHJhbnNwb3J0RXJyb3JUeXBlLlVOS05PV04sCisgICAgICAgICAgICAiQ2Fubm90IHJlYWQuIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQuIFRyaWVkIHRvIHJlYWQgJGxlbmd0aCAiCisgICAgICAgICAgICAiYnl0ZXMsIGJ1dCBvbmx5IGdvdCAkZ290IGJ5dGVzLiIpOworICAgICAgfQorICAgICAgZ290ICs9IHJldDsKKyAgICB9CisgICAgcmV0dXJuIGdvdDsKKyAgfQorCisgIC8vLyBXcml0ZXMgdXAgdG8gW2xlbl0gYnl0ZXMgZnJvbSB0aGUgYnVmZmVyLgorICAvLy8gVGhyb3dzIFtUVHJhbnNwb3J0RXJyb3JdIGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3cml0aW5nIGRhdGEKKyAgdm9pZCB3cml0ZShVaW50OExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKKworICAvLy8gV3JpdGVzIHRoZSBbYnl0ZXNdIHRvIHRoZSBvdXRwdXQuCisgIC8vLyBUaHJvd3MgW1RUcmFuc3BvcnRFcnJvcl0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcgZGF0YQorICB2b2lkIHdyaXRlQWxsKFVpbnQ4TGlzdCBidWZmZXIpIHsKKyAgICB3cml0ZShidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpOworICB9CisKKyAgLy8vIEZsdXNoIGFueSBwZW5kaW5nIGRhdGEgb3V0IG9mIGEgdHJhbnNwb3J0IGJ1ZmZlci4KKyAgLy8vIFRocm93cyBbVFRyYW5zcG9ydEVycm9yXSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd3JpdGluZyBvdXQgZGF0YS4KKyAgRnV0dXJlIGZsdXNoKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydF9lcnJvci5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnRfZXJyb3IuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzUwOGUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnRfZXJyb3IuZGFydApAQCAtMCwwICsxLDMxIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRUcmFuc3BvcnRFcnJvclR5cGUgeworICBzdGF0aWMgY29uc3QgaW50IFVOS05PV04gPSAwOworICBzdGF0aWMgY29uc3QgaW50IE5PVF9PUEVOID0gMTsKKyAgc3RhdGljIGNvbnN0IGludCBBTFJFQURZX09QRU4gPSAyOworICBzdGF0aWMgY29uc3QgaW50IFRJTUVEX09VVCA9IDM7CisgIHN0YXRpYyBjb25zdCBpbnQgRU5EX09GX0ZJTEUgPSA0OworfQorCitjbGFzcyBUVHJhbnNwb3J0RXJyb3IgZXh0ZW5kcyBURXJyb3IgeworICBUVHJhbnNwb3J0RXJyb3IoW2ludCB0eXBlID0gVFRyYW5zcG9ydEVycm9yVHlwZS5VTktOT1dOLCBTdHJpbmcgbWVzc2FnZSA9ICIiXSkKKyAgICAgIDogc3VwZXIodHlwZSwgbWVzc2FnZSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydF9mYWN0b3J5LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydF9mYWN0b3J5LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExMDQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X2ZhY3RvcnkuZGFydApAQCAtMCwwICsxLDI3IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKKy8vLyBGYWN0b3J5IGNsYXNzIHVzZWQgdG8gY3JlYXRlIHdyYXBwZWQgaW5zdGFuY2Ugb2YgYSBbVFRyYW5zcG9ydF0uIFRoaXMgaXMKKy8vLyB1c2VkIHByaW1hcmlseSBpbiBzZXJ2ZXJzLgorLy8vCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBKYXZhIHZlcnNpb24uCitjbGFzcyBUVHJhbnNwb3J0RmFjdG9yeSB7CisgIEZ1dHVyZTxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQpID0+CisgICAgICBuZXcgRnV0dXJlLnZhbHVlKHRyYW5zcG9ydCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvdGhyaWZ0LmRhcnQgYi9saWIvZGFydC9saWIvdGhyaWZ0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q5YmIwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi90aHJpZnQuZGFydApAQCAtMCwwICsxLDY0IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQ7CisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBVdGY4Q29kZWMsIEJBU0U2NDsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IEJ5dGVEYXRhOworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgRW5kaWFubmVzczsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOmZpeG51bS9maXhudW0uZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6aHR0cC9odHRwLmRhcnQnIHNob3cgQ2xpZW50OworaW1wb3J0ICdwYWNrYWdlOmxvZ2dpbmcvbG9nZ2luZy5kYXJ0JzsKKworcGFydCAnc3JjL3RfYXBwbGljYXRpb25fZXJyb3IuZGFydCc7CitwYXJ0ICdzcmMvdF9iYXNlLmRhcnQnOworcGFydCAnc3JjL3RfZXJyb3IuZGFydCc7CitwYXJ0ICdzcmMvdF9wcm9jZXNzb3IuZGFydCc7CisKK3BhcnQgJ3NyYy9wcm90b2NvbC90X2JpbmFyeV9wcm90b2NvbC5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X2NvbXBhY3RfcHJvdG9jb2wuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9maWVsZC5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X2pzb25fcHJvdG9jb2wuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9saXN0LmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfbWFwLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfbWVzc2FnZS5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X211bHRpcGxleGVkX3Byb3RvY29sLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfcHJvdG9jb2wuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9kZWNvcmF0b3IuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9lcnJvci5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2ZhY3RvcnkuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9wcm90b2NvbF91dGlsLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3Rfc2V0LmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3Rfc3RydWN0LmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfdHlwZS5kYXJ0JzsKKworcGFydCAnc3JjL3NlcmlhbGl6ZXIvdF9kZXNlcmlhbGl6ZXIuZGFydCc7CitwYXJ0ICdzcmMvc2VyaWFsaXplci90X3NlcmlhbGl6ZXIuZGFydCc7CisKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF9idWZmZXJlZF90cmFuc3BvcnQuZGFydCc7CitwYXJ0ICdzcmMvdHJhbnNwb3J0L3RfZnJhbWVkX3RyYW5zcG9ydC5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF9odHRwX3RyYW5zcG9ydC5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF9tZXNzYWdlX3JlYWRlci5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF9zb2NrZXQuZGFydCc7CitwYXJ0ICdzcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0LmRhcnQnOworcGFydCAnc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydF9lcnJvci5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnRfZmFjdG9yeS5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF9zb2NrZXRfdHJhbnNwb3J0LmRhcnQnOwpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3RocmlmdF9icm93c2VyLmRhcnQgYi9saWIvZGFydC9saWIvdGhyaWZ0X2Jyb3dzZXIuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWJjMjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3RocmlmdF9icm93c2VyLmRhcnQKQEAgLTAsMCArMSwyMiBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0X2Jyb3dzZXI7CisKKy8vLyBDbGFzc2VzIHRoYXQgYXJlIG9ubHkgc3VwcG9ydGVkIGluIGJyb3dzZXIgYXBwbGljYXRpb25zIGdvIGhlcmUKKworZXhwb3J0ICdzcmMvYnJvd3Nlci90X3dlYl9zb2NrZXQuZGFydCcgc2hvdyBUV2ViU29ja2V0OwpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3RocmlmdF9jb25zb2xlLmRhcnQgYi9saWIvZGFydC9saWIvdGhyaWZ0X2NvbnNvbGUuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGE4M2QxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3RocmlmdF9jb25zb2xlLmRhcnQKQEAgLTAsMCArMSwyMyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0X2NvbnNvbGU7CisKKy8vLyBDbGFzc2VzIHRoYXQgYXJlIG9ubHkgc3VwcG9ydGVkIGluIGNvbnNvbGUgYXBwbGljYXRpb25zIGdvIGhlcmUKKworZXhwb3J0ICdzcmMvY29uc29sZS90X3RjcF9zb2NrZXQuZGFydCcgc2hvdyBUVGNwU29ja2V0OworZXhwb3J0ICdzcmMvY29uc29sZS90X3dlYl9zb2NrZXQuZGFydCcgc2hvdyBUV2ViU29ja2V0OwpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvcHVic3BlYy55YW1sIGIvbGliL2RhcnQvcHVic3BlYy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYzRhMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9wdWJzcGVjLnlhbWwKQEAgLTAsMCArMSw0MyBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lOiB0aHJpZnQKK3ZlcnNpb246IDEuMC4wCitkZXNjcmlwdGlvbjogPgorICBBIERhcnQgbGlicmFyeSBmb3IgQXBhY2hlIFRocmlmdAorYXV0aG9yOiBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK2hvbWVwYWdlOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKK2RvY3VtZW50YXRpb246IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworCitlbnZpcm9ubWVudDoKKyAgc2RrOiAiPj0xLjEzLjAgPDIuMC4wIgorCitkZXBlbmRlbmNpZXM6CisgIGZpeG51bTogXjAuMTAuMgorICBodHRwOiBeMC4xMS4zCisgIGxvZ2dpbmc6IF4wLjExLjAKKworZGV2X2RlcGVuZGVuY2llczoKKyAgIyB0ZXN0CisgIG1vY2tpdG86IF4xLjAuMAorICB0ZXN0OiBeMC4xMi4wCisKKyAgIyBkYXJ0X2RldiAtIGh0dHBzOi8vZ2l0aHViLmNvbS9Xb3JraXZhL2RhcnRfZGV2CisgIGRhcnRfZGV2OiBeMS41LjAKKyAgY292ZXJhZ2U6IF4wLjcuMworICBkYXJ0X3N0eWxlOiAiPj0wLjIuNCA8MC4zLjAiCisgIGRhcnRkb2M6IF4wLjkuMApkaWZmIC0tZ2l0IGEvbGliL2RhcnQvdGVzdC9wcm90b2NvbC90X3Byb3RvY29sX3Rlc3QuZGFydCBiL2xpYi9kYXJ0L3Rlc3QvcHJvdG9jb2wvdF9wcm90b2NvbF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2Y2RlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rlc3QvcHJvdG9jb2wvdF9wcm90b2NvbF90ZXN0LmRhcnQKQEAgLTAsMCArMSw0MDYgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0LnRlc3QudHJhbnNwb3J0LnRfanNvbl9wcm90b2NvbF90ZXN0OworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgVVRGODsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCit2b2lkIG1haW4oKSB7CisgIGZpbmFsIG1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoJ215IG1lc3NhZ2UnLCBUTWVzc2FnZVR5cGUuT05FV0FZLCAxMjMpOworCisgIFRQcm90b2NvbCBwcm90b2NvbDsKKworICBQcmltaXRpdmUgZ2V0UHJpbWl0aXZlKGludCB0VHlwZSkgeworICAgIHN3aXRjaCAodFR5cGUpIHsKKyAgICAgIGNhc2UgVFR5cGUuQk9PTDoKKyAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmUocHJvdG9jb2wucmVhZEJvb2wsIHByb3RvY29sLndyaXRlQm9vbCwgZmFsc2UpOworCisgICAgICBjYXNlIFRUeXBlLkJZVEU6CisgICAgICAgIHJldHVybiBuZXcgUHJpbWl0aXZlKHByb3RvY29sLnJlYWRCeXRlLCBwcm90b2NvbC53cml0ZUJ5dGUsIDApOworCisgICAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmUocHJvdG9jb2wucmVhZEkxNiwgcHJvdG9jb2wud3JpdGVJMTYsIDApOworCisgICAgICBjYXNlIFRUeXBlLkkzMjoKKyAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmUocHJvdG9jb2wucmVhZEkzMiwgcHJvdG9jb2wud3JpdGVJMzIsIDApOworCisgICAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmUocHJvdG9jb2wucmVhZEk2NCwgcHJvdG9jb2wud3JpdGVJNjQsIDApOworCisgICAgICBjYXNlIFRUeXBlLkRPVUJMRToKKyAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmUocHJvdG9jb2wucmVhZERvdWJsZSwgcHJvdG9jb2wud3JpdGVEb3VibGUsIDApOworCisgICAgICBjYXNlIFRUeXBlLlNUUklORzoKKyAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmUocHJvdG9jb2wucmVhZFN0cmluZywgcHJvdG9jb2wud3JpdGVTdHJpbmcsICcnKTsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuc3VwcG9ydGVkIFRUeXBlICR0VHlwZSIpOworICAgIH0KKyAgfQorCisgIEZ1dHVyZSBwcmltaXRpdmVUZXN0KFByaW1pdGl2ZSBwcmltaXRpdmUsIGlucHV0KSBhc3luYyB7CisgICAgcHJpbWl0aXZlLndyaXRlKGlucHV0KTsKKyAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgIHZhciBvdXRwdXQgPSBwcmltaXRpdmUucmVhZCgpOworCisgICAgZXhwZWN0KG91dHB1dCwgaW5wdXQpOworICB9CisKKyAgRnV0dXJlIHByaW1pdGl2ZU51bGxUZXN0KFByaW1pdGl2ZSBwcmltaXRpdmUpIGFzeW5jIHsKKyAgICBwcmltaXRpdmUud3JpdGUobnVsbCk7CisgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICB2YXIgb3V0cHV0ID0gcHJpbWl0aXZlLnJlYWQoKTsKKworICAgIGV4cGVjdChvdXRwdXQsIHByaW1pdGl2ZS5kZWZhdWx0VmFsdWUpOworICB9CisKKyAgdmFyIHNoYXJlZFRlc3RzID0gKCkgeworICAgIHRlc3QoJ1Rlc3QgbWVzc2FnZScsICgpIGFzeW5jIHsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgdmFyIHN1YmplY3QgPSBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisKKyAgICAgIGV4cGVjdChzdWJqZWN0Lm5hbWUsIG1lc3NhZ2UubmFtZSk7CisgICAgICBleHBlY3Qoc3ViamVjdC50eXBlLCBtZXNzYWdlLnR5cGUpOworICAgICAgZXhwZWN0KHN1YmplY3Quc2VxaWQsIG1lc3NhZ2Uuc2VxaWQpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBzdHJ1Y3QnLCAoKSBhc3luYyB7CisgICAgICB2YXIgaW5wdXQgPSBuZXcgVFN0cnVjdCgpOworCisgICAgICBwcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKGlucHV0KTsKKyAgICAgIHByb3RvY29sLndyaXRlU3RydWN0RW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIHZhciBvdXRwdXQgPSBwcm90b2NvbC5yZWFkU3RydWN0QmVnaW4oKTsKKworICAgICAgLy8gbmFtZSBpcyBub3Qgc2VyaWFsaXplZCwgc2VlIEMjIHZlcnNpb24gZm9yIHJlZmVyZW5jZQorICAgICAgZXhwZWN0KG91dHB1dCwgaXNOb3ROdWxsKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgZmllbGQnLCAoKSBhc3luYyB7CisgICAgICB2YXIgaW5wdXQgPSBuZXcgVEZpZWxkKCdteSBmaWVsZCcsIFRUeXBlLk1BUCwgMTIzKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVGaWVsZEJlZ2luKGlucHV0KTsKKyAgICAgIHByb3RvY29sLndyaXRlRmllbGRFbmQoKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgdmFyIG91dHB1dCA9IHByb3RvY29sLnJlYWRGaWVsZEJlZ2luKCk7CisKKyAgICAgIC8vIG5hbWUgaXMgbm90IHNlcmlhbGl6ZWQsIHNlZSBDIyB2ZXJzaW9uIGZvciByZWZlcmVuY2UKKyAgICAgIGV4cGVjdChvdXRwdXQudHlwZSwgaW5wdXQudHlwZSk7CisgICAgICBleHBlY3Qob3V0cHV0LmlkLCBpbnB1dC5pZCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IG1hcCcsICgpIGFzeW5jIHsKKyAgICAgIHZhciBpbnB1dCA9IG5ldyBUTWFwKFRUeXBlLlNUUklORywgVFR5cGUuU1RSVUNULCAxMjMpOworCisgICAgICBwcm90b2NvbC53cml0ZU1hcEJlZ2luKGlucHV0KTsKKyAgICAgIHByb3RvY29sLndyaXRlTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIHZhciBvdXRwdXQgPSBwcm90b2NvbC5yZWFkTWFwQmVnaW4oKTsKKworICAgICAgZXhwZWN0KG91dHB1dC5rZXlUeXBlLCBpbnB1dC5rZXlUeXBlKTsKKyAgICAgIGV4cGVjdChvdXRwdXQudmFsdWVUeXBlLCBpbnB1dC52YWx1ZVR5cGUpOworICAgICAgZXhwZWN0KG91dHB1dC5sZW5ndGgsIGlucHV0Lmxlbmd0aCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGxpc3QnLCAoKSBhc3luYyB7CisgICAgICB2YXIgaW5wdXQgPSBuZXcgVExpc3QoVFR5cGUuU1RSSU5HLCAxMjMpOworCisgICAgICBwcm90b2NvbC53cml0ZUxpc3RCZWdpbihpbnB1dCk7CisgICAgICBwcm90b2NvbC53cml0ZUxpc3RFbmQoKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgdmFyIG91dHB1dCA9IHByb3RvY29sLnJlYWRMaXN0QmVnaW4oKTsKKworICAgICAgZXhwZWN0KG91dHB1dC5lbGVtZW50VHlwZSwgaW5wdXQuZWxlbWVudFR5cGUpOworICAgICAgZXhwZWN0KG91dHB1dC5sZW5ndGgsIGlucHV0Lmxlbmd0aCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHNldCcsICgpIGFzeW5jIHsKKyAgICAgIHZhciBpbnB1dCA9IG5ldyBUU2V0KFRUeXBlLlNUUklORywgMTIzKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVTZXRCZWdpbihpbnB1dCk7CisgICAgICBwcm90b2NvbC53cml0ZVNldEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICB2YXIgb3V0cHV0ID0gcHJvdG9jb2wucmVhZExpc3RCZWdpbigpOworCisgICAgICBleHBlY3Qob3V0cHV0LmVsZW1lbnRUeXBlLCBpbnB1dC5lbGVtZW50VHlwZSk7CisgICAgICBleHBlY3Qob3V0cHV0Lmxlbmd0aCwgaW5wdXQubGVuZ3RoKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgYm9vbCcsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZVRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkJPT0wpLCB0cnVlKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgYm9vbCBudWxsJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlTnVsbFRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkJPT0wpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgYnl0ZScsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZVRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkJZVEUpLCA2NCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGJ5dGUgbnVsbCcsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZU51bGxUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5CWVRFKSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IEkxNicsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZVRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkkxNiksIDMyNzY3KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgSTE2IG51bGwnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVOdWxsVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuSTE2KSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IEkzMicsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZVRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkkzMiksIDIxNDc0ODM2NDcpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBJMzIgbnVsbCcsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZU51bGxUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5JMzIpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgSTY0JywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuSTY0KSwgOTIyMzM3MjAzNjg1NDc3NTgwNyk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IEk2NCBudWxsJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlTnVsbFRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkk2NCkpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBkb3VibGUnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5ET1VCTEUpLCAzLjE0MTU5MjYpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBkb3VibGUgbnVsbCcsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZU51bGxUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5ET1VCTEUpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3Qgc3RyaW5nJywgKCkgYXN5bmMgeworICAgICAgdmFyIGlucHV0ID0gJ1RoZXJlIGFyZSBvbmx5IHR3byBoYXJkIHRoaW5ncyBpbiBjb21wdXRlciBzY2llbmNlOiAnCisgICAgICAgICAgJ2NhY2hlIGludmFsaWRhdGlvbiwgbmFtaW5nIHRoaW5ncywgYW5kIG9mZi1ieS1vbmUgZXJyb3JzLic7CisgICAgICBhd2FpdCBwcmltaXRpdmVUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5TVFJJTkcpLCBpbnB1dCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHN0cmluZyBudWxsJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlTnVsbFRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLlNUUklORykpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBiaW5hcnknLCAoKSBhc3luYyB7CisgICAgICB2YXIgaW5wdXQgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KG5ldyBMaXN0LmZpbGxlZCgxMDAsIDEyMykpOworCisgICAgICBwcm90b2NvbC53cml0ZUJpbmFyeShpbnB1dCk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIHZhciBvdXRwdXQgPSBwcm90b2NvbC5yZWFkQmluYXJ5KCk7CisKKyAgICAgIGV4cGVjdChvdXRwdXQubGVuZ3RoLCBpbnB1dC5sZW5ndGgpOworICAgICAgZXhwZWN0KG91dHB1dC5ldmVyeSgoaSkgPT4gaSA9PSAxMjMpLCBpc1RydWUpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBjb21wbGV4IHN0cnVjdCcsICgpIGFzeW5jIHsKKyAgICAgIC8vIHsxOiB7MTA6IDIwfSwgMjogezMwOiA0MH19CisgICAgICBwcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKG5ldyBUU3RydWN0KCkpOworICAgICAgcHJvdG9jb2wud3JpdGVGaWVsZEJlZ2luKG5ldyBURmllbGQoJ3N1Y2Nlc3MnLCBUVHlwZS5NQVAsIDApKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWFwQmVnaW4obmV3IFRNYXAoVFR5cGUuSTMyLCBUVHlwZS5NQVAsIDIpKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMSk7IC8vIGtleQorICAgICAgcHJvdG9jb2wud3JpdGVNYXBCZWdpbihuZXcgVE1hcChUVHlwZS5JMzIsIFRUeXBlLkkzMiwgMSkpOworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMTApOyAvLyBrZXkKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDIwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLndyaXRlTWFwRW5kKCk7CisKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDIpOyAvLyBrZXkKKyAgICAgIHByb3RvY29sLndyaXRlTWFwQmVnaW4obmV3IFRNYXAoVFR5cGUuSTMyLCBUVHlwZS5JMzIsIDEpKTsKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDMwKTsgLy8ga2V5CisgICAgICBwcm90b2NvbC53cml0ZUkzMig0MCk7IC8vIHZhbHVlCisgICAgICBwcm90b2NvbC53cml0ZU1hcEVuZCgpOworCisgICAgICBwcm90b2NvbC53cml0ZU1hcEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVGaWVsZEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgIHByb3RvY29sLndyaXRlU3RydWN0RW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIHByb3RvY29sLnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRGaWVsZEJlZ2luKCkudHlwZSwgVFR5cGUuTUFQKTsKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTWFwQmVnaW4oKS5sZW5ndGgsIDIpOworCisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCAxKTsgLy8ga2V5CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZE1hcEJlZ2luKCkubGVuZ3RoLCAxKTsKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDEwKTsgLy8ga2V5CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCAyMCk7IC8vIHZhbHVlCisgICAgICBwcm90b2NvbC5yZWFkTWFwRW5kKCk7CisKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDIpOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTWFwQmVnaW4oKS5sZW5ndGgsIDEpOworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgMzApOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDQwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLnJlYWRNYXBFbmQoKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1hcEVuZCgpOworICAgICAgcHJvdG9jb2wucmVhZEZpZWxkRW5kKCk7CisgICAgICBwcm90b2NvbC5yZWFkU3RydWN0RW5kKCk7CisgICAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBuZXN0ZWQgbWFwcyBhbmQgbGlzdHMnLCAoKSBhc3luYyB7CisgICAgICAvLyB7MTogW3sxMDogMjB9XSwgMjogW3szMDogNDB9XX0KKyAgICAgIHByb3RvY29sLndyaXRlTWFwQmVnaW4obmV3IFRNYXAoVFR5cGUuSTMyLCBUVHlwZS5MSVNULCAyKSk7CisKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDEpOyAvLyBrZXkKKyAgICAgIHByb3RvY29sLndyaXRlTGlzdEJlZ2luKG5ldyBUTGlzdChUVHlwZS5NQVAsIDEpKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWFwQmVnaW4obmV3IFRNYXAoVFR5cGUuSTMyLCBUVHlwZS5JMzIsIDEpKTsKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDEwKTsgLy8ga2V5CisgICAgICBwcm90b2NvbC53cml0ZUkzMigyMCk7IC8vIHZhbHVlCisgICAgICBwcm90b2NvbC53cml0ZU1hcEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVMaXN0RW5kKCk7CisKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDIpOyAvLyBrZXkKKyAgICAgIHByb3RvY29sLndyaXRlTGlzdEJlZ2luKG5ldyBUTGlzdChUVHlwZS5NQVAsIDEpKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWFwQmVnaW4obmV3IFRNYXAoVFR5cGUuSTMyLCBUVHlwZS5JMzIsIDEpKTsKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDMwKTsgLy8ga2V5CisgICAgICBwcm90b2NvbC53cml0ZUkzMig0MCk7IC8vIHZhbHVlCisgICAgICBwcm90b2NvbC53cml0ZU1hcEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVMaXN0RW5kKCk7CisKKyAgICAgIHByb3RvY29sLndyaXRlTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTWFwQmVnaW4oKS5sZW5ndGgsIDIpOworCisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCAxKTsgLy8ga2V5CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZExpc3RCZWdpbigpLmxlbmd0aCwgMSk7CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZE1hcEJlZ2luKCkubGVuZ3RoLCAxKTsKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDEwKTsgLy8ga2V5CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCAyMCk7IC8vIHZhbHVlCisgICAgICBwcm90b2NvbC5yZWFkTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC5yZWFkTGlzdEVuZCgpOworCisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCAyKTsgLy8ga2V5CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZExpc3RCZWdpbigpLmxlbmd0aCwgMSk7CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZE1hcEJlZ2luKCkubGVuZ3RoLCAxKTsKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDMwKTsgLy8ga2V5CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCA0MCk7IC8vIHZhbHVlCisgICAgICBwcm90b2NvbC5yZWFkTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC5yZWFkTGlzdEVuZCgpOworCisgICAgICBwcm90b2NvbC5yZWFkTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpOworICAgIH0pOworICB9OworCisgIGdyb3VwKCdKU09OJywgKCkgeworICAgIHNldFVwKCgpIHsKKyAgICAgIHByb3RvY29sID0gbmV3IFRKc29uUHJvdG9jb2wobmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgpKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2UpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBlc2NhcGVkIHVuaWNvZGUnLCAoKSBhc3luYyB7CisgICAgICAvKgorICAgICAgICAgS09SX0tBSQorICAgICAgICAgICBVVEYtODogIDB4RTAgMHhCOCAweDgxCisgICAgICAgICAgIFVURi0xNjogMHgwRTAxCisgICAgICAgICBHIGNsZWY6CisgICAgICAgICAgIFVURi04OiAgMHhGMCAweDlEIDB4ODQgMHg5RQorICAgICAgICAgICBVVEYtMTY6IDB4RDgzNCAweEREMUUKKyAgICAgICAqLworICAgICAgdmFyIGJ1ZmZlciA9IFVURjguZW5jb2RlKHInIlx1MDAwMVx1MGUwMSBcdWQ4MzRcdWRkMWUiJyk7CisgICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgpOworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKGJ1ZmZlcik7CisKKyAgICAgIHZhciBwcm90b2NvbCA9IG5ldyBUSnNvblByb3RvY29sKHRyYW5zcG9ydCk7CisKKyAgICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICB2YXIgc3ViamVjdCA9IHByb3RvY29sLnJlYWRTdHJpbmcoKTsKKyAgICAgIGV4cGVjdChzdWJqZWN0LAorICAgICAgICAgIFVURjguZGVjb2RlKFsweDAxLCAweEUwLCAweEI4LCAweDgxLCAweDIwLCAweEYwLCAweDlELCAweDg0LCAweDlFXSkpOworICAgIH0pOworCisgICAgZ3JvdXAoJ3NoYXJlZCB0ZXN0cycsIHNoYXJlZFRlc3RzKTsKKyAgfSk7CisKKyAgZ3JvdXAoJ2JpbmFyeScsICgpIHsKKyAgICBzZXRVcCgoKSB7CisgICAgICBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wobmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgpKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2UpOworICAgIH0pOworCisgICAgZ3JvdXAoJ3NoYXJlZCB0ZXN0cycsIHNoYXJlZFRlc3RzKTsKKyAgfSk7CisKKyAgZ3JvdXAoJ2NvbXBhY3QnLCAoKSB7CisgICAgc2V0VXAoKCkgeworICAgICAgcHJvdG9jb2wgPSBuZXcgVENvbXBhY3RQcm90b2NvbChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCkpOworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4obWVzc2FnZSk7CisgICAgfSk7CisKKyAgICBncm91cCgnc2hhcmVkIHRlc3RzJywgc2hhcmVkVGVzdHMpOworICB9KTsKK30KKworY2xhc3MgUHJpbWl0aXZlIHsKKyAgZmluYWwgRnVuY3Rpb24gcmVhZDsKKyAgZmluYWwgRnVuY3Rpb24gd3JpdGU7CisgIGZpbmFsIGRlZmF1bHRWYWx1ZTsKKworICBQcmltaXRpdmUodGhpcy5yZWFkLCB0aGlzLndyaXRlLCB0aGlzLmRlZmF1bHRWYWx1ZSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC90ZXN0L3NlcmlhbGl6ZXIvc2VyaWFsaXplcl90ZXN0LmRhcnQgYi9saWIvZGFydC90ZXN0L3NlcmlhbGl6ZXIvc2VyaWFsaXplcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3NjUwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rlc3Qvc2VyaWFsaXplci9zZXJpYWxpemVyX3Rlc3QuZGFydApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitsaWJyYXJ5IHRocmlmdC50ZXN0LnNlcmlhbGl6ZXIuc2VyaWFsaXplcl90ZXN0OworCitpbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CitpbXBvcnQgJ3NlcmlhbGl6ZXJfdGVzdF9kYXRhLmRhcnQnOworCit2b2lkIG1haW4oKSB7CisgIHZhciBzZXJpYWxpemVyID0gKCkgeworICAgIFREZXNlcmlhbGl6ZXIgZGVzZXJpYWxpemVyOworICAgIFRTZXJpYWxpemVyIHNlcmlhbGl6ZXI7CisgICAgVGVzdFRPYmplY3QgdGVzdFRPYmplY3Q7CisKKyAgICBzZXRVcCgoKSB7CisgICAgICBzZXJpYWxpemVyID0gbmV3IFRTZXJpYWxpemVyKCk7CisgICAgICBkZXNlcmlhbGl6ZXIgPSBuZXcgVERlc2VyaWFsaXplcigpOworICAgICAgCisgICAgICB0ZXN0VE9iamVjdCA9IG5ldyBUZXN0VE9iamVjdCgpOworICAgICAgdGVzdFRPYmplY3QuYiA9IHRydWU7CisgICAgICB0ZXN0VE9iamVjdC5zID0gIlRFU1QiOworICAgICAgdGVzdFRPYmplY3QuZCA9IDE1LjI1OworICAgICAgdGVzdFRPYmplY3QuaSA9IDEwOworICAgICAgCisgICAgICB2YXIgdGVzdExpc3QgPSBuZXcgTGlzdDxTdHJpbmc+KCk7CisgICAgICB0ZXN0TGlzdC5hZGQoIlRFU1QgMSIpOworICAgICAgdGVzdExpc3QuYWRkKCJURVNUIDIiKTsKKyAgICAgIAorICAgICAgdGVzdFRPYmplY3QubCA9IHRlc3RMaXN0OworICAgIH0pOworICAgIAorICAgIGFzc2VydE5ld09iamVjdEVxdWFsc1RPYmplY3QoVGVzdFRPYmplY3QgbmV3T2JqZWN0KSB7CisgICAgICBleHBlY3QobmV3T2JqZWN0LmwsIGVxdWFscyh0ZXN0VE9iamVjdC5sKSk7CisgICAgICBleHBlY3QobmV3T2JqZWN0LmIsIGVxdWFscyh0ZXN0VE9iamVjdC5iKSk7CisgICAgICBleHBlY3QobmV3T2JqZWN0LmksIGVxdWFscyh0ZXN0VE9iamVjdC5pKSk7CisgICAgICBleHBlY3QobmV3T2JqZWN0LmQsIGVxdWFscyh0ZXN0VE9iamVjdC5kKSk7CisgICAgICBleHBlY3QobmV3T2JqZWN0LnMsIGVxdWFscyh0ZXN0VE9iamVjdC5zKSk7CisgICAgfQorICAgIAorICAgIHJ1bldyaXRlU3RyaW5nVGVzdCgpIHsKKyAgICAgIHZhciBzID0gc2VyaWFsaXplci53cml0ZVN0cmluZyh0ZXN0VE9iamVjdCk7CisKKyAgICAgIHZhciBuZXdPYmplY3QgPSBuZXcgVGVzdFRPYmplY3QoKTsKKyAgICAgIGRlc2VyaWFsaXplci5yZWFkU3RyaW5nKG5ld09iamVjdCwgcyk7CisKKyAgICAgIGFzc2VydE5ld09iamVjdEVxdWFsc1RPYmplY3QobmV3T2JqZWN0KTsKKyAgICB9OworCisgICAgcnVuV3JpdGVUZXN0KCkgeworICAgICAgdmFyIHMgPSBzZXJpYWxpemVyLndyaXRlKHRlc3RUT2JqZWN0KTsKKworICAgICAgdmFyIG5ld09iamVjdCA9IG5ldyBUZXN0VE9iamVjdCgpOworICAgICAgZGVzZXJpYWxpemVyLnJlYWQobmV3T2JqZWN0LCBzKTsKKworICAgICAgYXNzZXJ0TmV3T2JqZWN0RXF1YWxzVE9iamVjdChuZXdPYmplY3QpOworICAgIH07CisKKyAgICB0ZXN0KCdKU09OIFByb3RvY29sIFN0cmluZycsICgpIHsKKyAgICAgIHNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVEpzb25Qcm90b2NvbChzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisgICAgICBkZXNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVEpzb25Qcm90b2NvbChkZXNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKyAgICAgIAorICAgICAgcnVuV3JpdGVTdHJpbmdUZXN0KCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdKU09OIFByb3RvY29sJywgKCkgeworICAgICAgc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUSnNvblByb3RvY29sKHNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKyAgICAgIGRlc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUSnNvblByb3RvY29sKGRlc2VyaWFsaXplci50cmFuc3BvcnQpOworCisgICAgICBydW5Xcml0ZVRlc3QoKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ0JpbmFyeSBQcm90b2NvbCBTdHJpbmcnLCAoKSB7CisgICAgICBzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbChzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisgICAgICBkZXNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKGRlc2VyaWFsaXplci50cmFuc3BvcnQpOworCisgICAgICBydW5Xcml0ZVN0cmluZ1Rlc3QoKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ0JpbmFyeSBQcm90b2NvbCcsICgpIHsKKyAgICAgIHNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKyAgICAgIGRlc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woZGVzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisKKyAgICAgIHJ1bldyaXRlVGVzdCgpOworICAgIH0pOworCisgICAgdGVzdCgnQ29tcGFjdCBQcm90b2NvbCBTdHJpbmcnLCAoKSB7CisgICAgICBzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRDb21wYWN0UHJvdG9jb2woc2VyaWFsaXplci50cmFuc3BvcnQpOworICAgICAgZGVzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRDb21wYWN0UHJvdG9jb2woZGVzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisKKyAgICAgIHJ1bldyaXRlU3RyaW5nVGVzdCgpOworICAgIH0pOworCisgICAgdGVzdCgnQ29tcGFjdCBQcm90b2NvbCcsICgpIHsKKyAgICAgIHNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVENvbXBhY3RQcm90b2NvbChzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisgICAgICBkZXNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVENvbXBhY3RQcm90b2NvbChkZXNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKworICAgICAgcnVuV3JpdGVUZXN0KCk7CisgICAgfSk7CisgIH07CisKKyAgZ3JvdXAoJ1NlcmlhbGl6ZXInLCBzZXJpYWxpemVyKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3Rlc3Qvc2VyaWFsaXplci9zZXJpYWxpemVyX3Rlc3RfZGF0YS5kYXJ0IGIvbGliL2RhcnQvdGVzdC9zZXJpYWxpemVyL3NlcmlhbGl6ZXJfdGVzdF9kYXRhLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU4NmYwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rlc3Qvc2VyaWFsaXplci9zZXJpYWxpemVyX3Rlc3RfZGF0YS5kYXJ0CkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2xpYnJhcnkgdGhyaWZ0LnRlc3Quc2VyaWFsaXplci5zZXJpYWxpemVyX3Rlc3Q7CisKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCisvLy8gVGVzdFRPYmplY3QgaXMgYSBzaW1wbGUgdGVzdCBzdHJ1Y3QKK2NsYXNzIFRlc3RUT2JqZWN0IGltcGxlbWVudHMgVEJhc2UgeworICBzdGF0aWMgZmluYWwgVFN0cnVjdCBfU1RSVUNUX0RFU0MgPSBuZXcgVFN0cnVjdCgiVGVzdFRPYmplY3QiKTsKKyAgc3RhdGljIGZpbmFsIFRGaWVsZCBfSV9GSUVMRF9ERVNDID0gbmV3IFRGaWVsZCgiaSIsIFRUeXBlLkkzMiwgMSk7CisgIHN0YXRpYyBmaW5hbCBURmllbGQgX0RfRklFTERfREVTQyA9IG5ldyBURmllbGQoImQiLCBUVHlwZS5ET1VCTEUsIDIpOworICBzdGF0aWMgZmluYWwgVEZpZWxkIF9TX0ZJRUxEX0RFU0MgPSBuZXcgVEZpZWxkKCJzIiwgVFR5cGUuU1RSSU5HLCAzKTsKKyAgc3RhdGljIGZpbmFsIFRGaWVsZCBfTF9GSUVMRF9ERVNDID0gbmV3IFRGaWVsZCgibCIsIFRUeXBlLkxJU1QsIDQpOworICBzdGF0aWMgZmluYWwgVEZpZWxkIF9CX0ZJRUxEX0RFU0MgPSBuZXcgVEZpZWxkKCJiIiwgVFR5cGUuQk9PTCwgNSk7CisKKyAgaW50IF9pOworICBzdGF0aWMgY29uc3QgaW50IEkgPSAxOworICBkb3VibGUgX2Q7CisgIHN0YXRpYyBjb25zdCBpbnQgRCA9IDI7CisgIFN0cmluZyBfczsKKyAgc3RhdGljIGNvbnN0IGludCBTID0gMzsKKyAgTGlzdDxTdHJpbmc+IF9sOworICBzdGF0aWMgY29uc3QgaW50IEwgPSA0OworICBib29sIF9iOworICBzdGF0aWMgY29uc3QgaW50IEIgPSA1OworCisgIGJvb2wgX19pc3NldF9pID0gZmFsc2U7CisgIGJvb2wgX19pc3NldF9kID0gZmFsc2U7CisgIGJvb2wgX19pc3NldF9iID0gZmFsc2U7CisKKyAgVGVzdFRPYmplY3QoKSB7CisgIH0KKworICAvLyBpCisgIGludCBnZXQgaSA9PiB0aGlzLl9pOworCisgIHNldCBpKGludCBpKSB7CisgICAgdGhpcy5faSA9IGk7CisgICAgdGhpcy5fX2lzc2V0X2kgPSB0cnVlOworICB9CisKKyAgYm9vbCBpc1NldEkoKSA9PiB0aGlzLl9faXNzZXRfaTsKKworICB1bnNldEkoKSB7CisgICAgdGhpcy5fX2lzc2V0X2kgPSBmYWxzZTsKKyAgfQorCisgIC8vIGQKKyAgZG91YmxlIGdldCBkID0+IHRoaXMuX2Q7CisKKyAgc2V0IGQoZG91YmxlIGQpIHsKKyAgICB0aGlzLl9kID0gZDsKKyAgICB0aGlzLl9faXNzZXRfZCA9IHRydWU7CisgIH0KKworICBib29sIGlzU2V0RCgpID0+IHRoaXMuX19pc3NldF9kOworCisgIHVuc2V0RCgpIHsKKyAgICB0aGlzLl9faXNzZXRfZCA9IGZhbHNlOworICB9CisKKyAgLy8gcworICBTdHJpbmcgZ2V0IHMgPT4gdGhpcy5fczsKKworICBzZXQgcyhTdHJpbmcgcykgeworICAgIHRoaXMuX3MgPSBzOworICB9CisKKyAgYm9vbCBpc1NldFMoKSA9PiB0aGlzLnMgIT0gbnVsbDsKKworICB1bnNldFMoKSB7CisgICAgdGhpcy5zID0gbnVsbDsKKyAgfQorCisgIC8vIGwKKyAgTGlzdDxTdHJpbmc+IGdldCBsID0+IHRoaXMuX2w7CisKKyAgc2V0IGwoTGlzdDxTdHJpbmc+IGwpIHsKKyAgICB0aGlzLl9sID0gbDsKKyAgfQorCisgIGJvb2wgaXNTZXRMKCkgPT4gdGhpcy5sICE9IG51bGw7CisKKyAgdW5zZXRMKCkgeworICAgIHRoaXMubCA9IG51bGw7CisgIH0KKworICAvLyBiCisgIGJvb2wgZ2V0IGIgPT4gdGhpcy5fYjsKKworICBzZXQgYihib29sIGIpIHsKKyAgICB0aGlzLl9iID0gYjsKKyAgICB0aGlzLl9faXNzZXRfYiA9IHRydWU7CisgIH0KKworICBib29sIGlzU2V0QigpID0+IHRoaXMuX19pc3NldF9iOworCisgIHVuc2V0QigpIHsKKyAgICB0aGlzLl9faXNzZXRfYiA9IGZhbHNlOworICB9CisKKyAgZ2V0RmllbGRWYWx1ZShpbnQgZmllbGRJRCkgeworICAgIHN3aXRjaCAoZmllbGRJRCkgeworICAgICAgY2FzZSBJOgorICAgICAgICByZXR1cm4gdGhpcy5pOworICAgICAgY2FzZSBEOgorICAgICAgICByZXR1cm4gdGhpcy5kOworICAgICAgY2FzZSBTOgorICAgICAgICByZXR1cm4gdGhpcy5zOworICAgICAgY2FzZSBMOgorICAgICAgICByZXR1cm4gdGhpcy5sOworICAgICAgY2FzZSBCOgorICAgICAgICByZXR1cm4gdGhpcy5iOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkZpZWxkICRmaWVsZElEIGRvZXNuJ3QgZXhpc3QhIik7CisgICAgfQorICB9CisKKyAgc2V0RmllbGRWYWx1ZShpbnQgZmllbGRJRCwgT2JqZWN0IHZhbHVlKSB7CisgICAgc3dpdGNoIChmaWVsZElEKSB7CisgICAgICBjYXNlIEk6CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgdW5zZXRJKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5pID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRDoKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICB1bnNldEQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLmQgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTOgorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIHVuc2V0UygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMucyA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEw6CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgdW5zZXRMKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5sID0gdmFsdWUgYXMgTGlzdDxTdHJpbmc+OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEI6CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgdW5zZXRCKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5iID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJGaWVsZCAkZmllbGRJRCBkb2Vzbid0IGV4aXN0ISIpOworICAgIH0KKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlCisgIGJvb2wgaXNTZXQoaW50IGZpZWxkSUQpIHsKKyAgICBzd2l0Y2ggKGZpZWxkSUQpIHsKKyAgICAgIGNhc2UgSToKKyAgICAgICAgcmV0dXJuIGlzU2V0SSgpOworICAgICAgY2FzZSBEOgorICAgICAgICByZXR1cm4gaXNTZXREKCk7CisgICAgICBjYXNlIFM6CisgICAgICAgIHJldHVybiBpc1NldFMoKTsKKyAgICAgIGNhc2UgTDoKKyAgICAgICAgcmV0dXJuIGlzU2V0TCgpOworICAgICAgY2FzZSBCOgorICAgICAgICByZXR1cm4gaXNTZXRCKCk7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiRmllbGQgJGZpZWxkSUQgZG9lc24ndCBleGlzdCEiKTsKKyAgICB9CisgIH0KKworICByZWFkKFRQcm90b2NvbCBpcHJvdCkgeworICAgIFRGaWVsZCBmaWVsZDsKKyAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RPUCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoZmllbGQuaWQpIHsKKyAgICAgICAgY2FzZSBJOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkkzMikgeworICAgICAgICAgICAgdGhpcy5pID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgICAgdGhpcy5fX2lzc2V0X2kgPSB0cnVlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkRPVUJMRSkgeworICAgICAgICAgICAgdGhpcy5kID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICAgICAgdGhpcy5fX2lzc2V0X2QgPSB0cnVlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUUklORykgeworICAgICAgICAgICAgdGhpcy5zID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkxJU1QpIHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgVExpc3QgX2xpc3Q3NCA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgdGhpcy5sID0gbmV3IExpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgICBmb3IgKGludCBfaTc1ID0gMDsgX2k3NSA8IF9saXN0NzQubGVuZ3RoOyArK19pNzUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2VsZW03NjsKKyAgICAgICAgICAgICAgICBfZWxlbTc2ID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgIHRoaXMubC5hZGQoX2VsZW03Nik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaXByb3QucmVhZExpc3RFbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQjoKKyAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5CT09MKSB7CisgICAgICAgICAgICB0aGlzLmIgPSBpcHJvdC5yZWFkQm9vbCgpOworICAgICAgICAgICAgdGhpcy5fX2lzc2V0X2IgPSB0cnVlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgfQorICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgIC8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUsIHdoaWNoIGNhbid0IGJlIGNoZWNrZWQgaW4gdGhlIHZhbGlkYXRlIG1ldGhvZAorICAgIHZhbGlkYXRlKCk7CisgIH0KKworICB3cml0ZShUUHJvdG9jb2wgb3Byb3QpIHsKKyAgICB2YWxpZGF0ZSgpOworCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihfU1RSVUNUX0RFU0MpOworICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihfSV9GSUVMRF9ERVNDKTsKKyAgICBvcHJvdC53cml0ZUkzMih0aGlzLmkpOworICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oX0RfRklFTERfREVTQyk7CisgICAgb3Byb3Qud3JpdGVEb3VibGUodGhpcy5kKTsKKyAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgaWYgKHRoaXMucyAhPSBudWxsKSB7CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oX1NfRklFTERfREVTQyk7CisgICAgICBvcHJvdC53cml0ZVN0cmluZyh0aGlzLnMpOworICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgIH0KKyAgICBpZiAodGhpcy5sICE9IG51bGwpIHsKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihfTF9GSUVMRF9ERVNDKTsKKyAgICAgIHsKKyAgICAgICAgb3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KFRUeXBlLlNUUklORywgdGhpcy5sLmxlbmd0aCkpOworICAgICAgICBmb3IgKHZhciBlbGVtNzcgaW4gdGhpcy5sKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoZWxlbTc3KTsKKyAgICAgICAgfQorICAgICAgICBvcHJvdC53cml0ZUxpc3RFbmQoKTsKKyAgICAgIH0KKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKF9CX0ZJRUxEX0RFU0MpOworICAgIG9wcm90LndyaXRlQm9vbCh0aGlzLmIpOworICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOworICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgIH0KKworICBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgU3RyaW5nQnVmZmVyIHJldCA9IG5ldyBTdHJpbmdCdWZmZXIoIlRlc3RUT2JqZWN0KCIpOworCisgICAgcmV0LndyaXRlKCJpOiIpOworICAgIHJldC53cml0ZSh0aGlzLmkpOworCisgICAgcmV0LndyaXRlKCIsICIpOworICAgIHJldC53cml0ZSgiZDoiKTsKKyAgICByZXQud3JpdGUodGhpcy5kKTsKKworICAgIHJldC53cml0ZSgiLCAiKTsKKyAgICByZXQud3JpdGUoInM6Iik7CisgICAgaWYgKHRoaXMucyA9PSBudWxsKSB7CisgICAgICByZXQud3JpdGUoIm51bGwiKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0LndyaXRlKHRoaXMucyk7CisgICAgfQorCisgICAgcmV0LndyaXRlKCIsICIpOworICAgIHJldC53cml0ZSgibDoiKTsKKyAgICBpZiAodGhpcy5sID09IG51bGwpIHsKKyAgICAgIHJldC53cml0ZSgibnVsbCIpOworICAgIH0gZWxzZSB7CisgICAgICByZXQud3JpdGUodGhpcy5sKTsKKyAgICB9CisKKyAgICByZXQud3JpdGUoIiwgIik7CisgICAgcmV0LndyaXRlKCJiOiIpOworICAgIHJldC53cml0ZSh0aGlzLmIpOworCisgICAgcmV0LndyaXRlKCIpIik7CisKKyAgICByZXR1cm4gcmV0LnRvU3RyaW5nKCk7CisgIH0KKworICB2YWxpZGF0ZSgpIHsKKyAgICAvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzCisgICAgLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvdGVzdC90X2FwcGxpY2F0aW9uX2Vycm9yX3Rlc3QuZGFydCBiL2xpYi9kYXJ0L3Rlc3QvdF9hcHBsaWNhdGlvbl9lcnJvcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTExZDhkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rlc3QvdF9hcHBsaWNhdGlvbl9lcnJvcl90ZXN0LmRhcnQKQEAgLTAsMCArMSw0NiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQudGVzdC50X2FwcGxpY2F0aW9uX2Vycm9yX3Rlc3Q7CisKK2ltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKKwordm9pZCBtYWluKCkgeworICBUUHJvdG9jb2wgcHJvdG9jb2w7CisKKyAgc2V0VXAoKCkgeworICAgIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCkpOworICB9KTsKKworICB0ZXN0KCdXcml0ZSBhbmQgcmVhZCBhbiBhcHBsaWNhdGlvbiBlcnJvcicsICgpIHsKKyAgICB2YXIgZXhwZWN0ZWRUeXBlID0gVEFwcGxpY2F0aW9uRXJyb3JUeXBlLklOVEVSTkFMX0VSUk9SOworICAgIHZhciBleHBlY3RlZE1lc3NhZ2UgPSAndGVzdCBlcnJvciBtZXNzYWdlJzsKKworICAgIFRBcHBsaWNhdGlvbkVycm9yIGVycm9yID0KKyAgICAgICAgbmV3IFRBcHBsaWNhdGlvbkVycm9yKGV4cGVjdGVkVHlwZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKyAgICBlcnJvci53cml0ZShwcm90b2NvbCk7CisKKyAgICBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgIFRBcHBsaWNhdGlvbkVycm9yIHN1YmplY3QgPSBUQXBwbGljYXRpb25FcnJvci5yZWFkKHByb3RvY29sKTsKKworICAgIGV4cGVjdChzdWJqZWN0LCBpc05vdE51bGwpOworICAgIGV4cGVjdChzdWJqZWN0LnR5cGUsIGV4cGVjdGVkVHlwZSk7CisgICAgZXhwZWN0KHN1YmplY3QubWVzc2FnZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKyAgfSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X2ZyYW1lZF90cmFuc3BvcnRfdGVzdC5kYXJ0IGIvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9mcmFtZWRfdHJhbnNwb3J0X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDcyZTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9mcmFtZWRfdHJhbnNwb3J0X3Rlc3QuZGFydApAQCAtMCwwICsxLDE3NSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQudGVzdC50cmFuc3BvcnQudF9mcmFtZWRfdHJhbnNwb3J0X3Rlc3Q7CisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCc7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7CisKK2ltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKKwordm9pZCBtYWluKCkgeworICBncm91cCgnVEZyYW1lZFRyYW5zcG9ydCBwYXJ0aWFsIHJlYWRzJywgKCkgeworICAgIGZpbmFsIGZsdXNoQXdhaXREdXJhdGlvbiA9IG5ldyBEdXJhdGlvbihzZWNvbmRzOiAxMCk7CisKKyAgICBGYWtlUmVhZE9ubHlTb2NrZXQgc29ja2V0OworICAgIFRTb2NrZXRUcmFuc3BvcnQgc29ja2V0VHJhbnNwb3J0OworICAgIFRGcmFtZWRUcmFuc3BvcnQgdHJhbnNwb3J0OworICAgIHZhciBtZXNzYWdlQXZhaWxhYmxlOworCisgICAgc2V0VXAoKCkgeworICAgICAgc29ja2V0ID0gbmV3IEZha2VSZWFkT25seVNvY2tldCgpOworICAgICAgc29ja2V0VHJhbnNwb3J0ID0gbmV3IFRDbGllbnRTb2NrZXRUcmFuc3BvcnQoc29ja2V0KTsKKyAgICAgIHRyYW5zcG9ydCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHNvY2tldFRyYW5zcG9ydCk7CisgICAgICBtZXNzYWdlQXZhaWxhYmxlID0gZmFsc2U7CisgICAgfSk7CisKKyAgICBleHBlY3ROb1JlYWRhYmxlQnl0ZXMoKSB7CisgICAgICB2YXIgcmVhZEJ1ZmZlciA9IG5ldyBVaW50OExpc3QoMTI4KTsKKyAgICAgIHZhciByZWFkQnl0ZXMgPSB0cmFuc3BvcnQucmVhZChyZWFkQnVmZmVyLCAwLCByZWFkQnVmZmVyLmxlbmd0aEluQnl0ZXMpOworICAgICAgZXhwZWN0KHJlYWRCeXRlcywgMCk7CisgICAgICBleHBlY3QobWVzc2FnZUF2YWlsYWJsZSwgZmFsc2UpOworICAgIH0KKworICAgIHRlc3QoJ1Rlc3QgdHJhbnNwb3J0IHJlYWRzIG1lc3NhZ2VzIHdoZXJlIGhlYWRlciBhbmQgYm9keSBhcmUgc2VudCBzZXBhcmF0ZWx5JywgKCkgYXN5bmMgeworICAgICAgLy8gYnVmZmVyIGludG8gd2hpY2ggd2UnbGwgcmVhZAorICAgICAgdmFyIHJlYWRCdWZmZXIgPSBuZXcgVWludDhMaXN0KDEwKTsKKyAgICAgIHZhciByZWFkQnl0ZXM7CisKKyAgICAgIC8vIHJlZ2lzdGVycyBmb3IgcmVhZGFibGUgYnl0ZXMKKyAgICAgIHZhciBmbHVzaEZ1dHVyZSA9IHRyYW5zcG9ydC5mbHVzaCgpLnRpbWVvdXQoZmx1c2hBd2FpdER1cmF0aW9uKTsKKyAgICAgIGZsdXNoRnV0dXJlLnRoZW4oKF8pIHsKKyAgICAgICAgbWVzc2FnZUF2YWlsYWJsZSA9IHRydWU7CisgICAgICB9KTsKKworICAgICAgLy8gd3JpdGUgaGVhZGVyIGJ5dGVzCisgICAgICBzb2NrZXQubWVzc2FnZUNvbnRyb2xsZXIuYWRkKG5ldyBVaW50OExpc3QuZnJvbUxpc3QoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDZdKSk7CisKKyAgICAgIC8vIHlvdSBzaG91bGRuJ3QgYmUgYWJsZSB0byBnZXQgYW55IGJ5dGVzIGZyb20gdGhlIHJlYWQsCisgICAgICAvLyBiZWNhdXNlIHRoZSBoZWFkZXIgaGFzIGJlZW4gY29uc3VtZWQgaW50ZXJuYWxseQorICAgICAgZXhwZWN0Tm9SZWFkYWJsZUJ5dGVzKCk7CisKKyAgICAgIC8vIHdyaXRlIGZpcnN0IGJhdGNoIG9mIGJvZHkKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChVVEY4LmVuY29kZSgiSGUiKSkpOworCisgICAgICAvLyB5b3Ugc2hvdWxkbid0IGJlIGFibGUgdG8gZ2V0IGFueSBieXRlcyBmcm9tIHRoZSByZWFkLAorICAgICAgLy8gYmVjYXVzZSB0aGUgZnJhbWUgaGFzIGJlZW4gY29uc3VtZWQgaW50ZXJuYWxseQorICAgICAgZXhwZWN0Tm9SZWFkYWJsZUJ5dGVzKCk7CisKKyAgICAgIC8vIHdyaXRlIHNlY29uZCBiYXRjaCBvZiBib2R5CisgICAgICBzb2NrZXQubWVzc2FnZUNvbnRyb2xsZXIuYWRkKG5ldyBVaW50OExpc3QuZnJvbUxpc3QoVVRGOC5lbmNvZGUoImxsbyEiKSkpOworCisgICAgICAvLyBoYXZlIHRvIHdhaXQgZm9yIHRoZSBmbHVzaCB0byBjb21wbGV0ZSwKKyAgICAgIC8vIGJlY2F1c2UgaXQncyBvbmx5IHRoZW4gdGhhdCB0aGUgZnJhbWUgaXMgYXZhaWxhYmxlIGZvciByZWFkaW5nCisgICAgICBhd2FpdCBmbHVzaEZ1dHVyZTsKKyAgICAgIGV4cGVjdChtZXNzYWdlQXZhaWxhYmxlLCB0cnVlKTsKKworICAgICAgLy8gYXQgdGhpcyBwb2ludCB0aGUgZnJhbWUgaXMgY29tcGxldGUsIHNvIHdlIGV4cGVjdCB0aGUgcmVhZCB0byBjb21wbGV0ZQorICAgICAgcmVhZEJ5dGVzID0gdHJhbnNwb3J0LnJlYWQocmVhZEJ1ZmZlciwgMCwgcmVhZEJ1ZmZlci5sZW5ndGhJbkJ5dGVzKTsKKyAgICAgIGV4cGVjdChyZWFkQnl0ZXMsIDYpOworICAgICAgZXhwZWN0KHJlYWRCdWZmZXIuc3VibGlzdCgwLCA2KSwgVVRGOC5lbmNvZGUoIkhlbGxvISIpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgdHJhbnNwb3J0IHJlYWRzIG1lc3NhZ2VzIHdoZXJlIGhlYWRlciBpcyBzZW50IGluIHBpZWNlcyAnCisgICAgICAgICAnYW5kIGJvZHkgaXMgYWxzbyBzZW50IGluIHBpZWNlcycsICgpIGFzeW5jIHsKKyAgICAgIC8vIGJ1ZmZlciBpbnRvIHdoaWNoIHdlJ2xsIHJlYWQKKyAgICAgIHZhciByZWFkQnVmZmVyID0gbmV3IFVpbnQ4TGlzdCgxMCk7CisgICAgICB2YXIgcmVhZEJ5dGVzOworCisgICAgICAvLyByZWdpc3RlcnMgZm9yIHJlYWRhYmxlIGJ5dGVzCisgICAgICB2YXIgZmx1c2hGdXR1cmUgPSB0cmFuc3BvcnQuZmx1c2goKS50aW1lb3V0KGZsdXNoQXdhaXREdXJhdGlvbik7CisgICAgICBmbHVzaEZ1dHVyZS50aGVuKChfKSB7CisgICAgICAgIG1lc3NhZ2VBdmFpbGFibGUgPSB0cnVlOworICAgICAgfSk7CisKKyAgICAgIC8vIHdyaXRlIGZpcnN0IHBhcnQgb2YgaGVhZGVyIGJ5dGVzCisgICAgICBzb2NrZXQubWVzc2FnZUNvbnRyb2xsZXIuYWRkKG5ldyBVaW50OExpc3QuZnJvbUxpc3QoWzB4MDAsIDB4MDBdKSk7CisKKyAgICAgIC8vIHlvdSBzaG91bGRuJ3QgYmUgYWJsZSB0byBnZXQgYW55IGJ5dGVzIGZyb20gdGhlIHJlYWQKKyAgICAgIGV4cGVjdE5vUmVhZGFibGVCeXRlcygpOworCisgICAgICAvLyB3cml0ZSBzZWNvbmQgcGFydCBvZiBoZWFkZXIgYnl0ZXMKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChbMHgwMCwgMHgwM10pKTsKKworICAgICAgLy8geW91IHNob3VsZG4ndCBiZSBhYmxlIHRvIGdldCBhbnkgYnl0ZXMgZnJvbSB0aGUgcmVhZCBhZ2FpbgorICAgICAgLy8gYmVjYXVzZSBvbmx5IHRoZSBoZWFkZXIgd2FzIHJlYWQsIGFuZCB0aGVyZSdzIG5vIGZyYW1lIGJvZHkKKyAgICAgIHJlYWRCeXRlcyA9IGV4cGVjdE5vUmVhZGFibGVCeXRlcygpOworCisgICAgICAvLyB3cml0ZSBmaXJzdCBiYXRjaCBvZiBib2R5CisgICAgICBzb2NrZXQubWVzc2FnZUNvbnRyb2xsZXIuYWRkKG5ldyBVaW50OExpc3QuZnJvbUxpc3QoVVRGOC5lbmNvZGUoIkgiKSkpOworCisgICAgICAvLyB5b3Ugc2hvdWxkbid0IGJlIGFibGUgdG8gZ2V0IGFueSBieXRlcyBmcm9tIHRoZSByZWFkLAorICAgICAgLy8gYmVjYXVzZSB0aGUgZnJhbWUgaGFzIGJlZW4gY29uc3VtZWQgaW50ZXJuYWxseQorICAgICAgZXhwZWN0Tm9SZWFkYWJsZUJ5dGVzKCk7CisKKyAgICAgIC8vIHdyaXRlIHNlY29uZCBiYXRjaCBvZiBib2R5CisgICAgICBzb2NrZXQubWVzc2FnZUNvbnRyb2xsZXIuYWRkKG5ldyBVaW50OExpc3QuZnJvbUxpc3QoVVRGOC5lbmNvZGUoImkhIikpKTsKKworICAgICAgLy8gaGF2ZSB0byB3YWl0IGZvciB0aGUgZmx1c2ggdG8gY29tcGxldGUsCisgICAgICAvLyBiZWNhdXNlIGl0J3Mgb25seSB0aGVuIHRoYXQgdGhlIGZyYW1lIGlzIGF2YWlsYWJsZSBmb3IgcmVhZGluZworICAgICAgYXdhaXQgZmx1c2hGdXR1cmU7CisgICAgICBleHBlY3QobWVzc2FnZUF2YWlsYWJsZSwgdHJ1ZSk7CisKKyAgICAgIC8vIGF0IHRoaXMgcG9pbnQgdGhlIGZyYW1lIGlzIGNvbXBsZXRlLCBzbyB3ZSBleHBlY3QgdGhlIHJlYWQgdG8gY29tcGxldGUKKyAgICAgIHJlYWRCeXRlcyA9IHRyYW5zcG9ydC5yZWFkKHJlYWRCdWZmZXIsIDAsIHJlYWRCdWZmZXIubGVuZ3RoSW5CeXRlcyk7CisgICAgICBleHBlY3QocmVhZEJ5dGVzLCAzKTsKKyAgICAgIGV4cGVjdChyZWFkQnVmZmVyLnN1Ymxpc3QoMCwgMyksIFVURjguZW5jb2RlKCJIaSEiKSk7CisgICAgfSk7CisgIH0pOworfQorCisKKworY2xhc3MgRmFrZVJlYWRPbmx5U29ja2V0IGV4dGVuZHMgVFNvY2tldCB7CisKKyAgU3RyZWFtQ29udHJvbGxlcjxVaW50OExpc3Q+IG1lc3NhZ2VDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8VWludDhMaXN0PihzeW5jOiB0cnVlKTsKKyAgU3RyZWFtQ29udHJvbGxlcjxPYmplY3Q+IGVycm9yQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyPE9iamVjdD4oKTsKKyAgU3RyZWFtQ29udHJvbGxlcjxUU29ja2V0U3RhdGU+IHN0YXRlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyPFRTb2NrZXRTdGF0ZT4oKTsKKworICBAb3ZlcnJpZGUKKyAgRnV0dXJlIGNsb3NlKCkgeworICAgIC8vIG5vb3AKKyAgfQorCisgIEBvdmVycmlkZQorICBib29sIGdldCBpc0Nsb3NlZCA9PiBmYWxzZTsKKworICBAb3ZlcnJpZGUKKyAgYm9vbCBnZXQgaXNPcGVuID0+IHRydWU7CisKKyAgQG92ZXJyaWRlCisgIFN0cmVhbTxPYmplY3Q+IGdldCBvbkVycm9yID0+IGVycm9yQ29udHJvbGxlci5zdHJlYW07CisKKyAgQG92ZXJyaWRlCisgIFN0cmVhbTxVaW50OExpc3Q+IGdldCBvbk1lc3NhZ2UgPT4gbWVzc2FnZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIEBvdmVycmlkZQorICBTdHJlYW08VFNvY2tldFN0YXRlPiBnZXQgb25TdGF0ZSA9PiBzdGF0ZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIEBvdmVycmlkZQorICBGdXR1cmUgb3BlbigpIHsKKyAgICAvLyBub29wCisgIH0KKworICBAb3ZlcnJpZGUKKyAgdm9pZCBzZW5kKFVpbnQ4TGlzdCBkYXRhKSB7CisgICAgLy8gbm9vcAorICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3RfaHR0cF90cmFuc3BvcnRfdGVzdC5kYXJ0IGIvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9odHRwX3RyYW5zcG9ydF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZmM2QwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3RfaHR0cF90cmFuc3BvcnRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTY0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC50ZXN0LnRyYW5zcG9ydC50X3NvY2tldF90cmFuc3BvcnRfdGVzdDsKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IEVuY29kaW5nOworaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgVXRmOENvZGVjLCBCQVNFNjQ7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7CisKK2ltcG9ydCAncGFja2FnZTpodHRwL2h0dHAuZGFydCcgc2hvdyBCYXNlUmVxdWVzdDsKK2ltcG9ydCAncGFja2FnZTpodHRwL2h0dHAuZGFydCcgc2hvdyBDbGllbnQ7CitpbXBvcnQgJ3BhY2thZ2U6aHR0cC9odHRwLmRhcnQnIHNob3cgUmVzcG9uc2U7CitpbXBvcnQgJ3BhY2thZ2U6aHR0cC9odHRwLmRhcnQnIHNob3cgU3RyZWFtZWRSZXNwb25zZTsKK2ltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKKwordm9pZCBtYWluKCkgeworICBjb25zdCB1dGY4Q29kZWMgPSBjb25zdCBVdGY4Q29kZWMoKTsKKworICBncm91cCgnVEh0dHBDbGllbnRUcmFuc3BvcnQnLCAoKSB7CisgICAgRmFrZUh0dHBDbGllbnQgY2xpZW50OworICAgIFRIdHRwQ2xpZW50VHJhbnNwb3J0IHRyYW5zcG9ydDsKKworICAgIHNldFVwKCgpIHsKKyAgICAgIGNsaWVudCA9IG5ldyBGYWtlSHR0cENsaWVudChzeW5jOiBmYWxzZSk7CisgICAgICB2YXIgY29uZmlnID0gbmV3IFRIdHRwQ29uZmlnKFVyaS5wYXJzZSgnaHR0cDovL2xvY2FsaG9zdCcpLCB7fSk7CisgICAgICB0cmFuc3BvcnQgPSBuZXcgVEh0dHBDbGllbnRUcmFuc3BvcnQoY2xpZW50LCBjb25maWcpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCB0cmFuc3BvcnQgc2VuZHMgYm9keScsICgpIGFzeW5jIHsKKyAgICAgIHZhciBleHBlY3RlZFRleHQgPSAnbXkgcmVxdWVzdCc7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwodXRmOENvZGVjLmVuY29kZShleHBlY3RlZFRleHQpKTsKKworICAgICAgZXhwZWN0KGNsaWVudC5wb3N0UmVxdWVzdCwgaXNFbXB0eSk7CisKKyAgICAgIGF3YWl0IHRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICBleHBlY3QoY2xpZW50LnBvc3RSZXF1ZXN0LCBpc05vdEVtcHR5KTsKKworICAgICAgdmFyIHJlcXVlc3RUZXh0ID0KKyAgICAgICAgICB1dGY4Q29kZWMuZGVjb2RlKEJBU0U2NC5kZWNvZGUoY2xpZW50LnBvc3RSZXF1ZXN0KSk7CisgICAgICBleHBlY3QocmVxdWVzdFRleHQsIGV4cGVjdGVkVGV4dCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHRyYW5zcG9ydCByZWNlaXZlcyByZXNwb25zZScsICgpIGFzeW5jIHsKKyAgICAgIHZhciBleHBlY3RlZFRleHQgPSAnbXkgcmVzcG9uc2UnOworICAgICAgdmFyIGV4cGVjdGVkQnl0ZXMgPSB1dGY4Q29kZWMuZW5jb2RlKGV4cGVjdGVkVGV4dCk7CisgICAgICBjbGllbnQucG9zdFJlc3BvbnNlID0gQkFTRTY0LmVuY29kZShleHBlY3RlZEJ5dGVzKTsKKworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKHV0ZjhDb2RlYy5lbmNvZGUoJ215IHJlcXVlc3QnKSk7CisgICAgICBleHBlY3QodHJhbnNwb3J0Lmhhc1JlYWREYXRhLCBpc0ZhbHNlKTsKKworICAgICAgYXdhaXQgdHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIGV4cGVjdCh0cmFuc3BvcnQuaGFzUmVhZERhdGEsIGlzVHJ1ZSk7CisKKyAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KGV4cGVjdGVkQnl0ZXMubGVuZ3RoKTsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmZlciwgMCwgZXhwZWN0ZWRCeXRlcy5sZW5ndGgpOworCisgICAgICB2YXIgYnVmZmVyVGV4dCA9IHV0ZjhDb2RlYy5kZWNvZGUoYnVmZmVyKTsKKyAgICAgIGV4cGVjdChidWZmZXJUZXh0LCBleHBlY3RlZFRleHQpOworICAgIH0pOworICB9KTsKKworICBncm91cCgnVEh0dHBDbGllbnRUcmFuc3BvcnQgd2l0aCBtdWx0aXBsZSBtZXNzYWdlcycsICgpIHsKKyAgICBGYWtlSHR0cENsaWVudCBjbGllbnQ7CisgICAgVEh0dHBDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0OworCisgICAgc2V0VXAoKCkgeworICAgICAgY2xpZW50ID0gbmV3IEZha2VIdHRwQ2xpZW50KHN5bmM6IHRydWUpOworICAgICAgdmFyIGNvbmZpZyA9IG5ldyBUSHR0cENvbmZpZyhVcmkucGFyc2UoJ2h0dHA6Ly9sb2NhbGhvc3QnKSwge30pOworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRIdHRwQ2xpZW50VHJhbnNwb3J0KGNsaWVudCwgY29uZmlnKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgcmVhZCBjb3JyZWN0IGJ1ZmZlciBhZnRlciBmbHVzaCcsICgpIGFzeW5jIHsKKyAgICAgIFN0cmluZyBidWZmZXJUZXh0OworICAgICAgdmFyIGV4cGVjdGVkVGV4dCA9ICdyZXNwb25zZSAxJzsKKyAgICAgIHZhciBleHBlY3RlZEJ5dGVzID0gdXRmOENvZGVjLmVuY29kZShleHBlY3RlZFRleHQpOworCisgICAgICAvLyBwcmVwYXJlIGEgcmVzcG9uc2UKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbCh1dGY4Q29kZWMuZW5jb2RlKCdyZXF1ZXN0IDEnKSk7CisgICAgICBjbGllbnQucG9zdFJlc3BvbnNlID0gQkFTRTY0LmVuY29kZShleHBlY3RlZEJ5dGVzKTsKKworICAgICAgRnV0dXJlIHJlc3BvbnNlUmVhZHkgPSB0cmFuc3BvcnQuZmx1c2goKS50aGVuKChfKSB7CisgICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KGV4cGVjdGVkQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgdHJhbnNwb3J0LnJlYWRBbGwoYnVmZmVyLCAwLCBleHBlY3RlZEJ5dGVzLmxlbmd0aCk7CisgICAgICAgIGJ1ZmZlclRleHQgPSB1dGY4Q29kZWMuZGVjb2RlKGJ1ZmZlcik7CisgICAgICB9KTsKKworICAgICAgLy8gcHJlcGFyZSBhIHNlY29uZCByZXNwb25zZQorICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKHV0ZjhDb2RlYy5lbmNvZGUoJ3JlcXVlc3QgMicpKTsKKyAgICAgIHZhciByZXNwb25zZTJCeXRlcyA9IHV0ZjhDb2RlYy5lbmNvZGUoJ3Jlc3BvbnNlIDInKTsKKyAgICAgIGNsaWVudC5wb3N0UmVzcG9uc2UgPSBCQVNFNjQuZW5jb2RlKHJlc3BvbnNlMkJ5dGVzKTsKKyAgICAgIGF3YWl0IHRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICBhd2FpdCByZXNwb25zZVJlYWR5OworICAgICAgZXhwZWN0KGJ1ZmZlclRleHQsIGV4cGVjdGVkVGV4dCk7CisgICAgfSk7CisgIH0pOworfQorCitjbGFzcyBGYWtlSHR0cENsaWVudCBpbXBsZW1lbnRzIENsaWVudCB7CisgIFN0cmluZyBwb3N0UmVzcG9uc2UgPSAnJzsKKyAgU3RyaW5nIHBvc3RSZXF1ZXN0ID0gJyc7CisKKyAgZmluYWwgYm9vbCBzeW5jOworCisgIEZha2VIdHRwQ2xpZW50KHt0aGlzLnN5bmM6IGZhbHNlfSk7CisKKyAgRnV0dXJlPFJlc3BvbnNlPiBwb3N0KHVybCwKKyAgICAgIHtNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMsIGJvZHksIEVuY29kaW5nIGVuY29kaW5nfSkgeworICAgIHBvc3RSZXF1ZXN0ID0gYm9keTsKKyAgICB2YXIgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UocG9zdFJlc3BvbnNlLCAyMDApOworCisgICAgaWYgKHN5bmMpIHsKKyAgICAgIHJldHVybiBuZXcgRnV0dXJlLnN5bmMoKCkgPT4gcmVzcG9uc2UpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZShyZXNwb25zZSk7CisgICAgfQorICB9CisKKyAgRnV0dXJlPFJlc3BvbnNlPiBoZWFkKHVybCwge01hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc30pID0+CisgICAgICB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7CisKKyAgRnV0dXJlPFJlc3BvbnNlPiBnZXQodXJsLCB7TWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzfSkgPT4KKyAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKKworICBGdXR1cmU8UmVzcG9uc2U+IHB1dCh1cmwsCisgICAgICAgICAge01hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycywgYm9keSwgRW5jb2RpbmcgZW5jb2Rpbmd9KSA9PgorICAgICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworCisgIEZ1dHVyZTxSZXNwb25zZT4gcGF0Y2godXJsLAorICAgICAgICAgIHtNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMsIGJvZHksIEVuY29kaW5nIGVuY29kaW5nfSkgPT4KKyAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKKworICBGdXR1cmU8UmVzcG9uc2U+IGRlbGV0ZSh1cmwsIHtNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnN9KSA9PgorICAgICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworCisgIEZ1dHVyZTxTdHJpbmc+IHJlYWQodXJsLCB7TWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzfSkgPT4KKyAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKKworICBGdXR1cmU8VWludDhMaXN0PiByZWFkQnl0ZXModXJsLCB7TWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzfSkgPT4KKyAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKKworICBGdXR1cmU8U3RyZWFtZWRSZXNwb25zZT4gc2VuZChCYXNlUmVxdWVzdCByZXF1ZXN0KSA9PgorICAgICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworCisgIHZvaWQgY2xvc2UoKSA9PiB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X3NvY2tldF90cmFuc3BvcnRfdGVzdC5kYXJ0IGIvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9zb2NrZXRfdHJhbnNwb3J0X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjlhYjE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9zb2NrZXRfdHJhbnNwb3J0X3Rlc3QuZGFydApAQCAtMCwwICsxLDMxMSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQudGVzdC50cmFuc3BvcnQudF9zb2NrZXRfdHJhbnNwb3J0X3Rlc3Q7CisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBVdGY4Q29kZWMsIEJBU0U2NDsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOm1vY2tpdG8vbW9ja2l0by5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKKwordm9pZCBtYWluKCkgeworICBjb25zdCB1dGY4Q29kZWMgPSBjb25zdCBVdGY4Q29kZWMoKTsKKworICBmaW5hbCByZXF1ZXN0VGV4dCA9ICdteSB0ZXN0IHJlcXVlc3QnOworICBmaW5hbCByZXF1ZXN0Qnl0ZXMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KHV0ZjhDb2RlYy5lbmNvZGUocmVxdWVzdFRleHQpKTsKKyAgZmluYWwgcmVxdWVzdEJhc2U2NCA9IEJBU0U2NC5lbmNvZGUocmVxdWVzdEJ5dGVzKTsKKworICBmaW5hbCByZXNwb25zZVRleHQgPSAncmVzcG9uc2UgMSc7CisgIGZpbmFsIHJlc3BvbnNlQnl0ZXMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KHV0ZjhDb2RlYy5lbmNvZGUocmVzcG9uc2VUZXh0KSk7CisgIGZpbmFsIHJlc3BvbnNlQmFzZTY0ID0gQkFTRTY0LmVuY29kZShyZXNwb25zZUJ5dGVzKTsKKworICBmaW5hbCBmcmFtZWRSZXNwb25zZUJhc2U2NCA9CisgICAgICBCQVNFNjQuZW5jb2RlKF9nZXRGcmFtZWRSZXNwb25zZShyZXNwb25zZUJ5dGVzKSk7CisKKyAgZ3JvdXAoJ1RDbGllbnRTb2NrZXRUcmFuc3BvcnQnLCAoKSB7CisgICAgRmFrZVNvY2tldCBzb2NrZXQ7CisgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisKKyAgICBzZXRVcCgoKSBhc3luYyB7CisgICAgICBzb2NrZXQgPSBuZXcgRmFrZVNvY2tldChzeW5jOiBmYWxzZSk7CisgICAgICBhd2FpdCBzb2NrZXQub3BlbigpOworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRDbGllbnRTb2NrZXRUcmFuc3BvcnQoc29ja2V0KTsKKyAgICAgIGF3YWl0IHRyYW5zcG9ydC5vcGVuKCk7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwocmVxdWVzdEJ5dGVzKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgY2xpZW50IHNlbmRpbmcgZGF0YSBvdmVyIHRyYW5zcG9ydCcsICgpIGFzeW5jIHsKKyAgICAgIGV4cGVjdChzb2NrZXQuc2VuZFBheWxvYWQsIGlzTnVsbCk7CisKKyAgICAgIEZ1dHVyZSByZXNwb25zZVJlYWR5ID0gdHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIC8vIGFsbG93IG1pY3JvdGFzayBldmVudHMgdG8gZmluaXNoCisgICAgICBhd2FpdCBuZXcgRnV0dXJlLnZhbHVlKCk7CisKKyAgICAgIGV4cGVjdChzb2NrZXQuc2VuZFBheWxvYWQsIGlzTm90TnVsbCk7CisgICAgICBleHBlY3Qoc29ja2V0LnNlbmRQYXlsb2FkLCByZXF1ZXN0Qnl0ZXMpOworCisgICAgICAvLyBzaW11bGF0ZSBhIHJlc3BvbnNlCisgICAgICBzb2NrZXQucmVjZWl2ZUZha2VNZXNzYWdlKHJlc3BvbnNlQmFzZTY0KTsKKworICAgICAgYXdhaXQgcmVzcG9uc2VSZWFkeTsKKyAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KHJlc3BvbnNlQnl0ZXMubGVuZ3RoKTsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmZlciwgMCwgcmVzcG9uc2VCeXRlcy5sZW5ndGgpOworICAgICAgdmFyIGJ1ZmZlclRleHQgPSB1dGY4Q29kZWMuZGVjb2RlKGJ1ZmZlcik7CisKKyAgICAgIGV4cGVjdChidWZmZXJUZXh0LCByZXNwb25zZVRleHQpOworICAgIH0pOworICB9LCB0aW1lb3V0OiBuZXcgVGltZW91dChuZXcgRHVyYXRpb24oc2Vjb25kczogMSkpKTsKKworICBncm91cCgnVENsaWVudFNvY2tldFRyYW5zcG9ydCB3aXRoIEZyYW1lZFRyYW5zcG9ydCcsICgpIHsKKyAgICBGYWtlU29ja2V0IHNvY2tldDsKKyAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKworICAgIHNldFVwKCgpIGFzeW5jIHsKKyAgICAgIHNvY2tldCA9IG5ldyBGYWtlU29ja2V0KHN5bmM6IHRydWUpOworICAgICAgYXdhaXQgc29ja2V0Lm9wZW4oKTsKKworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQobmV3IFRDbGllbnRTb2NrZXRUcmFuc3BvcnQoc29ja2V0KSk7CisgICAgICBhd2FpdCB0cmFuc3BvcnQub3BlbigpOworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKHJlcXVlc3RCeXRlcyk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGNsaWVudCBzZW5kaW5nIGRhdGEgb3ZlciBmcmFtZWQgdHJhbnNwb3J0JywgKCkgYXN5bmMgeworICAgICAgU3RyaW5nIGJ1ZmZlclRleHQ7CisKKyAgICAgIEZ1dHVyZSByZXNwb25zZVJlYWR5ID0gdHJhbnNwb3J0LmZsdXNoKCkudGhlbigoXykgeworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChyZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisgICAgICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmZlciwgMCwgcmVzcG9uc2VCeXRlcy5sZW5ndGgpOworICAgICAgICBidWZmZXJUZXh0ID0gdXRmOENvZGVjLmRlY29kZShidWZmZXIpOworICAgICAgfSk7CisKKyAgICAgIC8vIHNpbXVsYXRlIGEgcmVzcG9uc2UKKyAgICAgIHNvY2tldC5yZWNlaXZlRmFrZU1lc3NhZ2UoZnJhbWVkUmVzcG9uc2VCYXNlNjQpOworCisgICAgICBhd2FpdCByZXNwb25zZVJlYWR5OworICAgICAgZXhwZWN0KGJ1ZmZlclRleHQsIHJlc3BvbnNlVGV4dCk7CisgICAgfSk7CisgIH0sIHRpbWVvdXQ6IG5ldyBUaW1lb3V0KG5ldyBEdXJhdGlvbihzZWNvbmRzOiAxKSkpOworCisgIGdyb3VwKCdUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQnLCAoKSB7CisgICAgRmFrZVNvY2tldCBzb2NrZXQ7CisgICAgRmFrZVByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3Rvcnk7CisgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisKKyAgICBzZXRVcCgoKSBhc3luYyB7CisgICAgICBzb2NrZXQgPSBuZXcgRmFrZVNvY2tldChzeW5jOiB0cnVlKTsKKyAgICAgIGF3YWl0IHNvY2tldC5vcGVuKCk7CisKKyAgICAgIHByb3RvY29sRmFjdG9yeSA9IG5ldyBGYWtlUHJvdG9jb2xGYWN0b3J5KCk7CisgICAgICBwcm90b2NvbEZhY3RvcnkubWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgnZm9vJywgVE1lc3NhZ2VUeXBlLkNBTEwsIDEyMyk7CisgICAgICB0cmFuc3BvcnQgPSBuZXcgVEFzeW5jQ2xpZW50U29ja2V0VHJhbnNwb3J0KAorICAgICAgICAgIHNvY2tldCwgbmV3IFRNZXNzYWdlUmVhZGVyKHByb3RvY29sRmFjdG9yeSksCisgICAgICAgICAgcmVzcG9uc2VUaW1lb3V0OiBEdXJhdGlvbi5aRVJPKTsKKyAgICAgIGF3YWl0IHRyYW5zcG9ydC5vcGVuKCk7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwocmVxdWVzdEJ5dGVzKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgcmVzcG9uc2UgY29ycmVsYXRlcyB0byBjb3JyZWN0IHJlcXVlc3QnLCAoKSBhc3luYyB7CisgICAgICBTdHJpbmcgYnVmZmVyVGV4dDsKKworICAgICAgRnV0dXJlIHJlc3BvbnNlUmVhZHkgPSB0cmFuc3BvcnQuZmx1c2goKS50aGVuKChfKSB7CisgICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KHJlc3BvbnNlQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgdHJhbnNwb3J0LnJlYWRBbGwoYnVmZmVyLCAwLCByZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisgICAgICAgIGJ1ZmZlclRleHQgPSB1dGY4Q29kZWMuZGVjb2RlKGJ1ZmZlcik7CisgICAgICB9KTsKKworICAgICAgLy8gc2ltdWxhdGUgYSByZXNwb25zZQorICAgICAgcHJvdG9jb2xGYWN0b3J5Lm1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoJ2ZvbycsIFRNZXNzYWdlVHlwZS5SRVBMWSwgMTIzKTsKKyAgICAgIHNvY2tldC5yZWNlaXZlRmFrZU1lc3NhZ2UocmVzcG9uc2VCYXNlNjQpOworCisgICAgICAvLyBzaW11bGF0ZSBhIHNlY29uZCByZXNwb25zZQorICAgICAgdmFyIHJlc3BvbnNlMlRleHQgPSAncmVzcG9uc2UgMic7CisgICAgICB2YXIgcmVzcG9uc2UyQnl0ZXMgPQorICAgICAgICAgIG5ldyBVaW50OExpc3QuZnJvbUxpc3QodXRmOENvZGVjLmVuY29kZShyZXNwb25zZTJUZXh0KSk7CisgICAgICB2YXIgcmVzcG9uc2UyQmFzZTY0ID0gQkFTRTY0LmVuY29kZShyZXNwb25zZTJCeXRlcyk7CisgICAgICBwcm90b2NvbEZhY3RvcnkubWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgnZm9vMicsIFRNZXNzYWdlVHlwZS5SRVBMWSwgMTI0KTsKKyAgICAgIHNvY2tldC5yZWNlaXZlRmFrZU1lc3NhZ2UocmVzcG9uc2UyQmFzZTY0KTsKKworICAgICAgYXdhaXQgcmVzcG9uc2VSZWFkeTsKKyAgICAgIGV4cGVjdChidWZmZXJUZXh0LCByZXNwb25zZVRleHQpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCByZXNwb25zZSB0aW1lb3V0JywgKCkgYXN5bmMgeworICAgICAgRnV0dXJlIHJlc3BvbnNlUmVhZHkgPSB0cmFuc3BvcnQuZmx1c2goKTsKKyAgICAgIGV4cGVjdChyZXNwb25zZVJlYWR5LCB0aHJvd3NBKG5ldyBpc0luc3RhbmNlT2Y8VGltZW91dEV4Y2VwdGlvbj4oKSkpOworICAgIH0pOworICB9LCB0aW1lb3V0OiBuZXcgVGltZW91dChuZXcgRHVyYXRpb24oc2Vjb25kczogMSkpKTsKKworICBncm91cCgnVEFzeW5jQ2xpZW50U29ja2V0VHJhbnNwb3J0IHdpdGggVEZyYW1lZFRyYW5zcG9ydCcsICgpIHsKKyAgICBGYWtlU29ja2V0IHNvY2tldDsKKyAgICBGYWtlUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKworICAgIHNldFVwKCgpIGFzeW5jIHsKKyAgICAgIHNvY2tldCA9IG5ldyBGYWtlU29ja2V0KHN5bmM6IHRydWUpOworICAgICAgYXdhaXQgc29ja2V0Lm9wZW4oKTsKKworICAgICAgcHJvdG9jb2xGYWN0b3J5ID0gbmV3IEZha2VQcm90b2NvbEZhY3RvcnkoKTsKKyAgICAgIHByb3RvY29sRmFjdG9yeS5tZXNzYWdlID0gbmV3IFRNZXNzYWdlKCdmb28nLCBUTWVzc2FnZVR5cGUuQ0FMTCwgMTIzKTsKKyAgICAgIHZhciBtZXNzYWdlUmVhZGVyID0gbmV3IFRNZXNzYWdlUmVhZGVyKHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICBieXRlT2Zmc2V0OiBURnJhbWVkVHJhbnNwb3J0LmhlYWRlckJ5dGVDb3VudCk7CisKKyAgICAgIHRyYW5zcG9ydCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KG5ldyBUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQoCisgICAgICAgICAgc29ja2V0LCBtZXNzYWdlUmVhZGVyLAorICAgICAgICAgIHJlc3BvbnNlVGltZW91dDogRHVyYXRpb24uWkVSTykpOworICAgICAgYXdhaXQgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChyZXF1ZXN0Qnl0ZXMpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBhc3luYyBjbGllbnQgc2VuZGluZyBkYXRhIG92ZXIgZnJhbWVkIHRyYW5zcG9ydCcsICgpIGFzeW5jIHsKKyAgICAgIFN0cmluZyBidWZmZXJUZXh0OworCisgICAgICBGdXR1cmUgcmVzcG9uc2VSZWFkeSA9IHRyYW5zcG9ydC5mbHVzaCgpLnRoZW4oKF8pIHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OExpc3QocmVzcG9uc2VCeXRlcy5sZW5ndGgpOworICAgICAgICB0cmFuc3BvcnQucmVhZEFsbChidWZmZXIsIDAsIHJlc3BvbnNlQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgYnVmZmVyVGV4dCA9IHV0ZjhDb2RlYy5kZWNvZGUoYnVmZmVyKTsKKyAgICAgIH0pOworCisgICAgICAvLyBzaW11bGF0ZSBhIHJlc3BvbnNlCisgICAgICBwcm90b2NvbEZhY3RvcnkubWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgnZm9vJywgVE1lc3NhZ2VUeXBlLlJFUExZLCAxMjMpOworICAgICAgc29ja2V0LnJlY2VpdmVGYWtlTWVzc2FnZShmcmFtZWRSZXNwb25zZUJhc2U2NCk7CisKKyAgICAgIGF3YWl0IHJlc3BvbnNlUmVhZHk7CisgICAgICBleHBlY3QoYnVmZmVyVGV4dCwgcmVzcG9uc2VUZXh0KTsKKyAgICB9KTsKKyAgfSwgdGltZW91dDogbmV3IFRpbWVvdXQobmV3IER1cmF0aW9uKHNlY29uZHM6IDEpKSk7CisKKyAgZ3JvdXAoJ1RTZXJ2ZXJUcmFuc3BvcnQnLCAoKSB7CisgICAgdGVzdCgnVGVzdCBzZXJ2ZXIgdHJhbnNwb3J0IGxpc3RlbnMgdG8gc29ja2V0JywgKCkgYXN5bmMgeworICAgICAgdmFyIHNvY2tldCA9IG5ldyBGYWtlU29ja2V0KCk7CisgICAgICBhd2FpdCBzb2NrZXQub3BlbigpOworICAgICAgZXhwZWN0KHNvY2tldC5pc09wZW4sIGlzVHJ1ZSk7CisKKyAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldFRyYW5zcG9ydChzb2NrZXQpOworICAgICAgZXhwZWN0KHRyYW5zcG9ydC5oYXNSZWFkRGF0YSwgaXNGYWxzZSk7CisKKyAgICAgIHNvY2tldC5yZWNlaXZlRmFrZU1lc3NhZ2UocmVxdWVzdEJhc2U2NCk7CisKKyAgICAgIC8vIGFsbG93IG1pY3JvdGFzayBldmVudHMgdG8gZmluaXNoCisgICAgICBhd2FpdCBuZXcgRnV0dXJlLnZhbHVlKCk7CisKKyAgICAgIGV4cGVjdCh0cmFuc3BvcnQuaGFzUmVhZERhdGEsIGlzVHJ1ZSk7CisKKyAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KHJlcXVlc3RCeXRlcy5sZW5ndGgpOworICAgICAgdHJhbnNwb3J0LnJlYWRBbGwoYnVmZmVyLCAwLCByZXF1ZXN0Qnl0ZXMubGVuZ3RoKTsKKworICAgICAgdmFyIGJ1ZmZlclRleHQgPSB1dGY4Q29kZWMuZGVjb2RlKGJ1ZmZlcik7CisgICAgICBleHBlY3QoYnVmZmVyVGV4dCwgcmVxdWVzdFRleHQpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBzZXJ2ZXIgc2VuZGluZyBkYXRhIG92ZXIgdHJhbnNwb3J0JywgKCkgYXN5bmMgeworICAgICAgdmFyIHNvY2tldCA9IG5ldyBGYWtlU29ja2V0KCk7CisgICAgICBhd2FpdCBzb2NrZXQub3BlbigpOworCisgICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoc29ja2V0KTsKKworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKHJlc3BvbnNlQnl0ZXMpOworICAgICAgZXhwZWN0KHNvY2tldC5zZW5kUGF5bG9hZCwgaXNOdWxsKTsKKworICAgICAgdHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIC8vIGFsbG93IG1pY3JvdGFzayBldmVudHMgdG8gZmluaXNoCisgICAgICBhd2FpdCBuZXcgRnV0dXJlLnZhbHVlKCk7CisKKyAgICAgIGV4cGVjdChzb2NrZXQuc2VuZFBheWxvYWQsIGlzTm90TnVsbCk7CisgICAgICBleHBlY3Qoc29ja2V0LnNlbmRQYXlsb2FkLCByZXNwb25zZUJ5dGVzKTsKKyAgICB9KTsKKyAgfSwgdGltZW91dDogbmV3IFRpbWVvdXQobmV3IER1cmF0aW9uKHNlY29uZHM6IDEpKSk7Cit9CisKK2NsYXNzIEZha2VTb2NrZXQgZXh0ZW5kcyBUU29ja2V0IHsKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxUU29ja2V0U3RhdGU+IF9vblN0YXRlQ29udHJvbGxlcjsKKyAgU3RyZWFtPFRTb2NrZXRTdGF0ZT4gZ2V0IG9uU3RhdGUgPT4gX29uU3RhdGVDb250cm9sbGVyLnN0cmVhbTsKKworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPE9iamVjdD4gX29uRXJyb3JDb250cm9sbGVyOworICBTdHJlYW08T2JqZWN0PiBnZXQgb25FcnJvciA9PiBfb25FcnJvckNvbnRyb2xsZXIuc3RyZWFtOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8VWludDhMaXN0PiBfb25NZXNzYWdlQ29udHJvbGxlcjsKKyAgU3RyZWFtPFVpbnQ4TGlzdD4gZ2V0IG9uTWVzc2FnZSA9PiBfb25NZXNzYWdlQ29udHJvbGxlci5zdHJlYW07CisKKyAgRmFrZVNvY2tldCh7Ym9vbCBzeW5jOiBmYWxzZX0pCisgICAgICA6IF9vblN0YXRlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdChzeW5jOiBzeW5jKSwKKyAgICAgICAgX29uRXJyb3JDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KHN5bmM6IHN5bmMpLAorICAgICAgICBfb25NZXNzYWdlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdChzeW5jOiBzeW5jKTsKKworICBib29sIF9pc09wZW47CisKKyAgYm9vbCBnZXQgaXNPcGVuID0+IF9pc09wZW47CisKKyAgYm9vbCBnZXQgaXNDbG9zZWQgPT4gIWlzT3BlbjsKKworICBGdXR1cmUgb3BlbigpIGFzeW5jIHsKKyAgICBfaXNPcGVuID0gdHJ1ZTsKKyAgICBfb25TdGF0ZUNvbnRyb2xsZXIuYWRkKFRTb2NrZXRTdGF0ZS5PUEVOKTsKKyAgfQorCisgIEZ1dHVyZSBjbG9zZSgpIGFzeW5jIHsKKyAgICBfaXNPcGVuID0gZmFsc2U7CisgICAgX29uU3RhdGVDb250cm9sbGVyLmFkZChUU29ja2V0U3RhdGUuQ0xPU0VEKTsKKyAgfQorCisgIFVpbnQ4TGlzdCBfc2VuZFBheWxvYWQ7CisgIFVpbnQ4TGlzdCBnZXQgc2VuZFBheWxvYWQgPT4gX3NlbmRQYXlsb2FkOworCisgIHZvaWQgc2VuZChVaW50OExpc3QgZGF0YSkgeworICAgIGlmICghaXNPcGVuKSB0aHJvdyBuZXcgU3RhdGVFcnJvcignVGhlIHNvY2tldCBpcyBub3Qgb3BlbicpOworCisgICAgX3NlbmRQYXlsb2FkID0gZGF0YTsKKyAgfQorCisgIHZvaWQgcmVjZWl2ZUZha2VNZXNzYWdlKFN0cmluZyBiYXNlNjQpIHsKKyAgICBpZiAoIWlzT3BlbikgdGhyb3cgbmV3IFN0YXRlRXJyb3IoJ1RoZSBzb2NrZXQgaXMgbm90IG9wZW4nKTsKKworICAgIHZhciBtZXNzYWdlID0KKyAgICAgICAgbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChCQVNFNjQuZGVjb2RlKGJhc2U2NCkpOworICAgIF9vbk1lc3NhZ2VDb250cm9sbGVyLmFkZChtZXNzYWdlKTsKKyAgfQorfQorCitjbGFzcyBGYWtlUHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7CisgIEZha2VQcm90b2NvbEZhY3RvcnkoKTsKKworICBUTWVzc2FnZSBtZXNzYWdlOworCisgIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSA9PiBuZXcgRmFrZVByb3RvY29sKG1lc3NhZ2UpOworfQorCitjbGFzcyBGYWtlUHJvdG9jb2wgZXh0ZW5kcyBNb2NrIGltcGxlbWVudHMgVFByb3RvY29sIHsKKyAgRmFrZVByb3RvY29sKHRoaXMuX21lc3NhZ2UpOworCisgIFRNZXNzYWdlIF9tZXNzYWdlOworCisgIHJlYWRNZXNzYWdlQmVnaW4oKSA9PiBfbWVzc2FnZTsKK30KKworVWludDhMaXN0IF9nZXRGcmFtZWRSZXNwb25zZShVaW50OExpc3QgcmVzcG9uc2VCeXRlcykgeworICB2YXIgYnl0ZU9mZnNldCA9IFRGcmFtZWRUcmFuc3BvcnQuaGVhZGVyQnl0ZUNvdW50OworICB2YXIgcmVzcG9uc2UgPSBuZXcgVWludDhMaXN0KGJ5dGVPZmZzZXQgKyByZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisKKyAgcmVzcG9uc2UuYnVmZmVyLmFzQnl0ZURhdGEoKS5zZXRJbnQzMigwLCByZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisgIHJlc3BvbnNlLnNldEFsbChieXRlT2Zmc2V0LCByZXNwb25zZUJ5dGVzKTsKKworICByZXR1cm4gcmVzcG9uc2U7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X3RyYW5zcG9ydF90ZXN0LmRhcnQgYi9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X3RyYW5zcG9ydF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiMzgxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X3Rlc3QuZGFydApAQCAtMCwwICsxLDQxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC50ZXN0LnRyYW5zcG9ydC50X3NvY2tldF90cmFuc3BvcnRfdGVzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCisvLy8gQ29tbW9uIHRyYW5zcG9ydCB0ZXN0cwordm9pZCBtYWluKCkgeworICBncm91cCgnVFRyYW5zcG9ydEZhY3RvcnknLCAoKSB7CisgICAgdGVzdCgndHJhbnNwb3J0IGlzIHJldHVybmVkIGZyb20gYmFzZSBmYWN0b3J5JywgKCkgYXN5bmMgeworICAgICAgVFRyYW5zcG9ydCByZXN1bHQ7CisgICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG51bGw7CisKKyAgICAgIHZhciBmYWN0b3J5ID0gbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCk7CisKKyAgICAgIHJlc3VsdCA9IGF3YWl0IGZhY3RvcnkuZ2V0VHJhbnNwb3J0KHRyYW5zcG9ydCk7CisgICAgICBleHBlY3QocmVzdWx0LCBpc051bGwpOworCisgICAgICB0cmFuc3BvcnQgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCk7CisgICAgICByZXN1bHQgPSBhd2FpdCBmYWN0b3J5LmdldFRyYW5zcG9ydCh0cmFuc3BvcnQpOworCisgICAgICBleHBlY3QocmVzdWx0LCB0cmFuc3BvcnQpOworICAgIH0pOworICB9KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3Rvb2wvZGV2LmRhcnQgYi9saWIvZGFydC90b29sL2Rldi5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZjhiOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC90b29sL2Rldi5kYXJ0CkBAIC0wLDAgKzEsMzMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdG9vbC5kZXY7CisKK2ltcG9ydCAncGFja2FnZTpkYXJ0X2Rldi9kYXJ0X2Rldi5kYXJ0JyBzaG93IGRldiwgY29uZmlnOworCittYWluKExpc3Q8U3RyaW5nPiBhcmdzKSBhc3luYyB7CisgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Xb3JraXZhL2RhcnRfZGV2CisKKyAgdmFyIGRpcmVjdG9yaWVzID0gWydsaWIvJywgJ3Rlc3QvJywgJ3Rvb2wvJ107CisgIGNvbmZpZy5hbmFseXplLmVudHJ5UG9pbnRzID0gZGlyZWN0b3JpZXM7CisgIGNvbmZpZy5mb3JtYXQuZGlyZWN0b3JpZXMgPSBkaXJlY3RvcmllczsKKyAgY29uZmlnLmNvcHlMaWNlbnNlCisgICAgLi5saWNlbnNlUGF0aCA9ICdMSUNFTlNFX0hFQURFUicKKyAgICAuLmRpcmVjdG9yaWVzID0gZGlyZWN0b3JpZXM7CisKKyAgYXdhaXQgZGV2KGFyZ3MpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9EZWxwaGlUaHJpZnQuZ3JvdXBwcm9qIGIvbGliL2RlbHBoaS9EZWxwaGlUaHJpZnQuZ3JvdXBwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNzJlNDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL0RlbHBoaVRocmlmdC5ncm91cHByb2oKQEAgLTAsMCArMSwxNTYgQEAKK++7vwk8UHJvamVjdCB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKwkJPFByb3BlcnR5R3JvdXA+CisJCQk8UHJvamVjdEd1aWQ+ezZCRDMyN0E1LTc2ODgtNDI2My1CNkE4LUIxNTIwN0NGNEVDNX08L1Byb2plY3RHdWlkPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxJdGVtR3JvdXA+CisJCQk8UHJvamVjdHMgSW5jbHVkZT0idGVzdFxjbGllbnQuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XHNlcnZlci5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQkJPFByb2plY3RzIEluY2x1ZGU9InRlc3RcbXVsdGlwbGV4ZWRcTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmRwcm9qIj4KKwkJCQk8RGVwZW5kZW5jaWVzLz4KKwkJCTwvUHJvamVjdHM+CisJCQk8UHJvamVjdHMgSW5jbHVkZT0idGVzdFxtdWx0aXBsZXhlZFxNdWx0aXBsZXguVGVzdC5TZXJ2ZXIuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XHNlcmlhbGl6ZXJcVGVzdFNlcmlhbGl6ZXIuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XHNraXBcc2tpcHRlc3RfdmVyc2lvbjEuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XHNraXBcc2tpcHRlc3RfdmVyc2lvbjIuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XHR5cGVyZWdpc3RyeVxUZXN0VHlwZVJlZ2lzdHJ5LmRwcm9qIj4KKwkJCQk8RGVwZW5kZW5jaWVzLz4KKwkJCTwvUHJvamVjdHM+CisJCQk8UHJvamVjdHMgSW5jbHVkZT0iLi5cLi5cdHV0b3JpYWxcZGVscGhpXERlbHBoaVNlcnZlclxEZWxwaGlTZXJ2ZXIuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSIuLlwuLlx0dXRvcmlhbFxkZWxwaGlcRGVscGhpQ2xpZW50XERlbHBoaUNsaWVudC5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQkJPFByb2plY3RzIEluY2x1ZGU9InRlc3Rca2V5d29yZHNcUmVzZXJ2ZWRLZXl3b3Jkcy5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQk8L0l0ZW1Hcm91cD4KKwkJPFByb2plY3RFeHRlbnNpb25zPgorCQkJPEJvcmxhbmQuUGVyc29uYWxpdHk+RGVmYXVsdC5QZXJzb25hbGl0eS4xMjwvQm9ybGFuZC5QZXJzb25hbGl0eT4KKwkJCTxCb3JsYW5kLlByb2plY3RUeXBlLz4KKwkJCTxCb3JsYW5kUHJvamVjdD4KKwkJCQk8RGVmYXVsdC5QZXJzb25hbGl0eS8+CisJCQk8L0JvcmxhbmRQcm9qZWN0PgorCQk8L1Byb2plY3RFeHRlbnNpb25zPgorCQk8VGFyZ2V0IE5hbWU9ImNsaWVudCI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxjbGllbnQuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iY2xpZW50OkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XGNsaWVudC5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iY2xpZW50Ok1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcY2xpZW50LmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9InNlcnZlciI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxzZXJ2ZXIuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2VydmVyOkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNlcnZlci5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2VydmVyOk1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2VydmVyLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9Ik11bHRpcGxleF9UZXN0X0NsaWVudCI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxtdWx0aXBsZXhlZFxNdWx0aXBsZXguVGVzdC5DbGllbnQuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTXVsdGlwbGV4X1Rlc3RfQ2xpZW50OkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XG11bHRpcGxleGVkXE11bHRpcGxleC5UZXN0LkNsaWVudC5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTXVsdGlwbGV4X1Rlc3RfQ2xpZW50Ok1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcbXVsdGlwbGV4ZWRcTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9Ik11bHRpcGxleF9UZXN0X1NlcnZlciI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxtdWx0aXBsZXhlZFxNdWx0aXBsZXguVGVzdC5TZXJ2ZXIuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTXVsdGlwbGV4X1Rlc3RfU2VydmVyOkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XG11bHRpcGxleGVkXE11bHRpcGxleC5UZXN0LlNlcnZlci5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTXVsdGlwbGV4X1Rlc3RfU2VydmVyOk1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcbXVsdGlwbGV4ZWRcTXVsdGlwbGV4LlRlc3QuU2VydmVyLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IlRlc3RTZXJpYWxpemVyIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNlcmlhbGl6ZXJcVGVzdFNlcmlhbGl6ZXIuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iVGVzdFNlcmlhbGl6ZXI6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2VyaWFsaXplclxUZXN0U2VyaWFsaXplci5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iVGVzdFNlcmlhbGl6ZXI6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxzZXJpYWxpemVyXFRlc3RTZXJpYWxpemVyLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9InNraXB0ZXN0X3ZlcnNpb24xIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNraXBcc2tpcHRlc3RfdmVyc2lvbjEuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2tpcHRlc3RfdmVyc2lvbjE6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2tpcFxza2lwdGVzdF92ZXJzaW9uMS5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2tpcHRlc3RfdmVyc2lvbjE6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxza2lwXHNraXB0ZXN0X3ZlcnNpb24xLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9InNraXB0ZXN0X3ZlcnNpb24yIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNraXBcc2tpcHRlc3RfdmVyc2lvbjIuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2tpcHRlc3RfdmVyc2lvbjI6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2tpcFxza2lwdGVzdF92ZXJzaW9uMi5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2tpcHRlc3RfdmVyc2lvbjI6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxza2lwXHNraXB0ZXN0X3ZlcnNpb24yLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IlRlc3RUeXBlUmVnaXN0cnkiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcdHlwZXJlZ2lzdHJ5XFRlc3RUeXBlUmVnaXN0cnkuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iVGVzdFR5cGVSZWdpc3RyeTpDbGVhbiI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFx0eXBlcmVnaXN0cnlcVGVzdFR5cGVSZWdpc3RyeS5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iVGVzdFR5cGVSZWdpc3RyeTpNYWtlIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHR5cGVyZWdpc3RyeVxUZXN0VHlwZVJlZ2lzdHJ5LmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IkRlbHBoaVNlcnZlciI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0iLi5cLi5cdHV0b3JpYWxcZGVscGhpXERlbHBoaVNlcnZlclxEZWxwaGlTZXJ2ZXIuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iRGVscGhpU2VydmVyOkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSIuLlwuLlx0dXRvcmlhbFxkZWxwaGlcRGVscGhpU2VydmVyXERlbHBoaVNlcnZlci5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iRGVscGhpU2VydmVyOk1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9Ii4uXC4uXHR1dG9yaWFsXGRlbHBoaVxEZWxwaGlTZXJ2ZXJcRGVscGhpU2VydmVyLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IkRlbHBoaUNsaWVudCI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0iLi5cLi5cdHV0b3JpYWxcZGVscGhpXERlbHBoaUNsaWVudFxEZWxwaGlDbGllbnQuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iRGVscGhpQ2xpZW50OkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSIuLlwuLlx0dXRvcmlhbFxkZWxwaGlcRGVscGhpQ2xpZW50XERlbHBoaUNsaWVudC5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iRGVscGhpQ2xpZW50Ok1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9Ii4uXC4uXHR1dG9yaWFsXGRlbHBoaVxEZWxwaGlDbGllbnRcRGVscGhpQ2xpZW50LmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IlJlc2VydmVkS2V5d29yZHMiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rca2V5d29yZHNcUmVzZXJ2ZWRLZXl3b3Jkcy5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJSZXNlcnZlZEtleXdvcmRzOkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XGtleXdvcmRzXFJlc2VydmVkS2V5d29yZHMuZHByb2oiIFRhcmdldHM9IkNsZWFuIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IlJlc2VydmVkS2V5d29yZHM6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxrZXl3b3Jkc1xSZXNlcnZlZEtleXdvcmRzLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IkJ1aWxkIj4KKwkJCTxDYWxsVGFyZ2V0IFRhcmdldHM9ImNsaWVudDtzZXJ2ZXI7TXVsdGlwbGV4X1Rlc3RfQ2xpZW50O011bHRpcGxleF9UZXN0X1NlcnZlcjtUZXN0U2VyaWFsaXplcjtza2lwdGVzdF92ZXJzaW9uMTtza2lwdGVzdF92ZXJzaW9uMjtUZXN0VHlwZVJlZ2lzdHJ5O0RlbHBoaVNlcnZlcjtEZWxwaGlDbGllbnQ7UmVzZXJ2ZWRLZXl3b3JkcyIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJDbGVhbiI+CisJCQk8Q2FsbFRhcmdldCBUYXJnZXRzPSJjbGllbnQ6Q2xlYW47c2VydmVyOkNsZWFuO011bHRpcGxleF9UZXN0X0NsaWVudDpDbGVhbjtNdWx0aXBsZXhfVGVzdF9TZXJ2ZXI6Q2xlYW47VGVzdFNlcmlhbGl6ZXI6Q2xlYW47c2tpcHRlc3RfdmVyc2lvbjE6Q2xlYW47c2tpcHRlc3RfdmVyc2lvbjI6Q2xlYW47VGVzdFR5cGVSZWdpc3RyeTpDbGVhbjtEZWxwaGlTZXJ2ZXI6Q2xlYW47RGVscGhpQ2xpZW50OkNsZWFuO1Jlc2VydmVkS2V5d29yZHM6Q2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTWFrZSI+CisJCQk8Q2FsbFRhcmdldCBUYXJnZXRzPSJjbGllbnQ6TWFrZTtzZXJ2ZXI6TWFrZTtNdWx0aXBsZXhfVGVzdF9DbGllbnQ6TWFrZTtNdWx0aXBsZXhfVGVzdF9TZXJ2ZXI6TWFrZTtUZXN0U2VyaWFsaXplcjpNYWtlO3NraXB0ZXN0X3ZlcnNpb24xOk1ha2U7c2tpcHRlc3RfdmVyc2lvbjI6TWFrZTtUZXN0VHlwZVJlZ2lzdHJ5Ok1ha2U7RGVscGhpU2VydmVyOk1ha2U7RGVscGhpQ2xpZW50Ok1ha2U7UmVzZXJ2ZWRLZXl3b3JkczpNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEJEUylcQmluXENvZGVHZWFyLkdyb3VwLlRhcmdldHMnKSIgUHJvamVjdD0iJChCRFMpXEJpblxDb2RlR2Vhci5Hcm91cC5UYXJnZXRzIi8+CisJPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9SRUFETUUubWQgYi9saWIvZGVscGhpL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTc5OWQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9SRUFETUUubWQKQEAgLTAsMCArMSwzMCBAQAorVGhyaWZ0IERlbHBoaSBTb2Z0d2FyZSBMaWJyYXJ5CisKK0xpY2Vuc2UKKz09PT09PT0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKK1VzaW5nIFRocmlmdCB3aXRoIERlbHBoaQorPT09PT09PT09PT09PT09PT09PT0KKworVGhlIFRocmlmdCBEZWxwaGkgTGlicmFyeSByZXF1aXJlcyBhdCBsZWFzdCBEZWxwaGkgMjAxMC4KKworQmVjYXVzZSB0aGUgTGlicmFyeSBoZWF2aWx5IHJlbGllcyBvbiBnZW5lcmljcywgdXNpbmcgaXQKK3dpdGggZWFybGllciB2ZXJzaW9ucyAoc3VjaCBhcyBEZWxwaGkgNykgd2lsbCAqbm90KiB3b3JrLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvZGVscGhpL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Db2xsZWN0aW9ucy5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuQ29sbGVjdGlvbnMucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMjA2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuQ29sbGVjdGlvbnMucGFzCkBAIC0wLDAgKzEsNjE5IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGhyaWZ0LkNvbGxlY3Rpb25zOworCitpbnRlcmZhY2UKKwordXNlcworICBHZW5lcmljcy5Db2xsZWN0aW9ucywgR2VuZXJpY3MuRGVmYXVsdHMsIFRocmlmdC5VdGlsczsKKwordHlwZQorCit7JElGIENvbXBpbGVyVmVyc2lvbiA8IDIxLjB9CisgIFRBcnJheTxUPiA9IGFycmF5IG9mIFQ7Cit7JElGRU5EfQorCisgIElUaHJpZnRDb250YWluZXIgPSBpbnRlcmZhY2UKKyAgICBbJ3s5M0RFRjVBMC1EMTYyLTQ2MUEtQUIyMi01QjRFRTA3MzQwNTB9J10KKyAgICBmdW5jdGlvbiBUb1N0cmluZzogc3RyaW5nOworICBlbmQ7CisKKyAgSVRocmlmdERpY3Rpb25hcnk8VEtleSxUVmFsdWU+ID0gaW50ZXJmYWNlKElUaHJpZnRDb250YWluZXIpCisgICAgWyd7MjVFREQ1MDYtRjlEMS00MDA4LUE0MEYtNTk0MDM2NEI3RTQ2fSddCisgICAgZnVuY3Rpb24gR2V0RW51bWVyYXRvcjogVEVudW1lcmF0b3I8VFBhaXI8VEtleSxUVmFsdWU+PjsKKworICAgIGZ1bmN0aW9uIEdldEtleXM6IFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5US2V5Q29sbGVjdGlvbjsKKyAgICBmdW5jdGlvbiBHZXRWYWx1ZXM6IFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5UVmFsdWVDb2xsZWN0aW9uOworICAgIGZ1bmN0aW9uIEdldEl0ZW0oY29uc3QgS2V5OiBUS2V5KTogVFZhbHVlOworICAgIHByb2NlZHVyZSBTZXRJdGVtKGNvbnN0IEtleTogVEtleTsgY29uc3QgVmFsdWU6IFRWYWx1ZSk7CisgICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7CisKKyAgICBwcm9jZWR1cmUgQWRkKGNvbnN0IEtleTogVEtleTsgY29uc3QgVmFsdWU6IFRWYWx1ZSk7CisgICAgcHJvY2VkdXJlIFJlbW92ZShjb25zdCBLZXk6IFRLZXkpOworeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KKyAgICBmdW5jdGlvbiBFeHRyYWN0UGFpcihjb25zdCBLZXk6IFRLZXkpOiBUUGFpcjxUS2V5LFRWYWx1ZT47Cit7JElGRU5EfQorICAgIHByb2NlZHVyZSBDbGVhcjsKKyAgICBwcm9jZWR1cmUgVHJpbUV4Y2VzczsKKyAgICBmdW5jdGlvbiBUcnlHZXRWYWx1ZShjb25zdCBLZXk6IFRLZXk7IG91dCBWYWx1ZTogVFZhbHVlKTogQm9vbGVhbjsKKyAgICBwcm9jZWR1cmUgQWRkT3JTZXRWYWx1ZShjb25zdCBLZXk6IFRLZXk7IGNvbnN0IFZhbHVlOiBUVmFsdWUpOworICAgIGZ1bmN0aW9uIENvbnRhaW5zS2V5KGNvbnN0IEtleTogVEtleSk6IEJvb2xlYW47CisgICAgZnVuY3Rpb24gQ29udGFpbnNWYWx1ZShjb25zdCBWYWx1ZTogVFZhbHVlKTogQm9vbGVhbjsKKyAgICBmdW5jdGlvbiBUb0FycmF5OiBUQXJyYXk8VFBhaXI8VEtleSxUVmFsdWU+PjsKKworICAgIHByb3BlcnR5IEl0ZW1zW2NvbnN0IEtleTogVEtleV06IFRWYWx1ZSByZWFkIEdldEl0ZW0gd3JpdGUgU2V0SXRlbTsgZGVmYXVsdDsKKyAgICBwcm9wZXJ0eSBDb3VudDogSW50ZWdlciByZWFkIEdldENvdW50OworICAgIHByb3BlcnR5IEtleXM6IFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5US2V5Q29sbGVjdGlvbiByZWFkIEdldEtleXM7CisgICAgcHJvcGVydHkgVmFsdWVzOiBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uVFZhbHVlQ29sbGVjdGlvbiByZWFkIEdldFZhbHVlczsKKyAgZW5kOworCisgIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LFRWYWx1ZT4gPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElUaHJpZnREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPikKKyAgcHJpdmF0ZQorICAgIEZEaWN0aW9uYWx5IDogVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+OworICBwcm90ZWN0ZWQKKyAgICBmdW5jdGlvbiBHZXRFbnVtZXJhdG9yOiBURW51bWVyYXRvcjxUUGFpcjxUS2V5LFRWYWx1ZT4+OworCisgICAgZnVuY3Rpb24gR2V0S2V5czogVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LlRLZXlDb2xsZWN0aW9uOworICAgIGZ1bmN0aW9uIEdldFZhbHVlczogVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LlRWYWx1ZUNvbGxlY3Rpb247CisgICAgZnVuY3Rpb24gR2V0SXRlbShjb25zdCBLZXk6IFRLZXkpOiBUVmFsdWU7CisgICAgcHJvY2VkdXJlIFNldEl0ZW0oY29uc3QgS2V5OiBUS2V5OyBjb25zdCBWYWx1ZTogVFZhbHVlKTsKKyAgICBmdW5jdGlvbiBHZXRDb3VudDogSW50ZWdlcjsKKworICAgIHByb2NlZHVyZSBBZGQoY29uc3QgS2V5OiBUS2V5OyBjb25zdCBWYWx1ZTogVFZhbHVlKTsKKyAgICBwcm9jZWR1cmUgUmVtb3ZlKGNvbnN0IEtleTogVEtleSk7Cit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQorICAgIGZ1bmN0aW9uIEV4dHJhY3RQYWlyKGNvbnN0IEtleTogVEtleSk6IFRQYWlyPFRLZXksVFZhbHVlPjsKK3skSUZFTkR9CisgICAgcHJvY2VkdXJlIENsZWFyOworICAgIHByb2NlZHVyZSBUcmltRXhjZXNzOworICAgIGZ1bmN0aW9uIFRyeUdldFZhbHVlKGNvbnN0IEtleTogVEtleTsgb3V0IFZhbHVlOiBUVmFsdWUpOiBCb29sZWFuOworICAgIHByb2NlZHVyZSBBZGRPclNldFZhbHVlKGNvbnN0IEtleTogVEtleTsgY29uc3QgVmFsdWU6IFRWYWx1ZSk7CisgICAgZnVuY3Rpb24gQ29udGFpbnNLZXkoY29uc3QgS2V5OiBUS2V5KTogQm9vbGVhbjsKKyAgICBmdW5jdGlvbiBDb250YWluc1ZhbHVlKGNvbnN0IFZhbHVlOiBUVmFsdWUpOiBCb29sZWFuOworICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRBcnJheTxUUGFpcjxUS2V5LFRWYWx1ZT4+OworICAgIHByb3BlcnR5IEl0ZW1zW2NvbnN0IEtleTogVEtleV06IFRWYWx1ZSByZWFkIEdldEl0ZW0gd3JpdGUgU2V0SXRlbTsgZGVmYXVsdDsKKyAgICBwcm9wZXJ0eSBDb3VudDogSW50ZWdlciByZWFkIEdldENvdW50OworICAgIHByb3BlcnR5IEtleXM6IFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5US2V5Q29sbGVjdGlvbiByZWFkIEdldEtleXM7CisgICAgcHJvcGVydHkgVmFsdWVzOiBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uVFZhbHVlQ29sbGVjdGlvbiByZWFkIEdldFZhbHVlczsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFDYXBhY2l0eTogSW50ZWdlciA9IDApOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgIGVuZDsKKworICBJVGhyaWZ0TGlzdDxUPiA9IGludGVyZmFjZShJVGhyaWZ0Q29udGFpbmVyKQorICAgIFsnezI5QkVFRTMxLTlDQjQtNDAxQi1BQTA0LTUxNDhBNzVGNDczQn0nXQorICAgIGZ1bmN0aW9uIEdldEVudW1lcmF0b3I6IFRFbnVtZXJhdG9yPFQ+OworICAgIGZ1bmN0aW9uIEdldENhcGFjaXR5OiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRDYXBhY2l0eShWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldENvdW50KFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRJdGVtKEluZGV4OiBJbnRlZ2VyKTogVDsKKyAgICBwcm9jZWR1cmUgU2V0SXRlbShJbmRleDogSW50ZWdlcjsgY29uc3QgVmFsdWU6IFQpOworICAgIGZ1bmN0aW9uIEFkZChjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIEFkZFJhbmdlKGNvbnN0IFZhbHVlczogYXJyYXkgb2YgVCk7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBBZGRSYW5nZShjb25zdCBDb2xsZWN0aW9uOiBJRW51bWVyYWJsZTxUPik7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBBZGRSYW5nZShDb2xsZWN0aW9uOiBURW51bWVyYWJsZTxUPik7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBJbnNlcnQoSW5kZXg6IEludGVnZXI7IGNvbnN0IFZhbHVlOiBUKTsKKyAgICBwcm9jZWR1cmUgSW5zZXJ0UmFuZ2UoSW5kZXg6IEludGVnZXI7IGNvbnN0IFZhbHVlczogYXJyYXkgb2YgVCk7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBJbnNlcnRSYW5nZShJbmRleDogSW50ZWdlcjsgY29uc3QgQ29sbGVjdGlvbjogSUVudW1lcmFibGU8VD4pOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgSW5zZXJ0UmFuZ2UoSW5kZXg6IEludGVnZXI7IGNvbnN0IENvbGxlY3Rpb246IFRFbnVtZXJhYmxlPFQ+KTsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gUmVtb3ZlKGNvbnN0IFZhbHVlOiBUKTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgRGVsZXRlKEluZGV4OiBJbnRlZ2VyKTsKKyAgICBwcm9jZWR1cmUgRGVsZXRlUmFuZ2UoQUluZGV4LCBBQ291bnQ6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEV4dHJhY3QoY29uc3QgVmFsdWU6IFQpOiBUOworeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KKyAgICBwcm9jZWR1cmUgRXhjaGFuZ2UoSW5kZXgxLCBJbmRleDI6IEludGVnZXIpOworICAgIHByb2NlZHVyZSBNb3ZlKEN1ckluZGV4LCBOZXdJbmRleDogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gRmlyc3Q6IFQ7CisgICAgZnVuY3Rpb24gTGFzdDogVDsKK3skSUZFTkR9CisgICAgcHJvY2VkdXJlIENsZWFyOworICAgIGZ1bmN0aW9uIENvbnRhaW5zKGNvbnN0IFZhbHVlOiBUKTogQm9vbGVhbjsKKyAgICBmdW5jdGlvbiBJbmRleE9mKGNvbnN0IFZhbHVlOiBUKTogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiBMYXN0SW5kZXhPZihjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFJldmVyc2U7CisgICAgcHJvY2VkdXJlIFNvcnQ7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBTb3J0KGNvbnN0IEFDb21wYXJlcjogSUNvbXBhcmVyPFQ+KTsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gQmluYXJ5U2VhcmNoKGNvbnN0IEl0ZW06IFQ7IG91dCBJbmRleDogSW50ZWdlcik6IEJvb2xlYW47IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIEJpbmFyeVNlYXJjaChjb25zdCBJdGVtOiBUOyBvdXQgSW5kZXg6IEludGVnZXI7IGNvbnN0IEFDb21wYXJlcjogSUNvbXBhcmVyPFQ+KTogQm9vbGVhbjsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFRyaW1FeGNlc3M7CisgICAgZnVuY3Rpb24gVG9BcnJheTogVEFycmF5PFQ+OworICAgIHByb3BlcnR5IENhcGFjaXR5OiBJbnRlZ2VyIHJlYWQgR2V0Q2FwYWNpdHkgd3JpdGUgU2V0Q2FwYWNpdHk7CisgICAgcHJvcGVydHkgQ291bnQ6IEludGVnZXIgcmVhZCBHZXRDb3VudCB3cml0ZSBTZXRDb3VudDsKKyAgICBwcm9wZXJ0eSBJdGVtc1tJbmRleDogSW50ZWdlcl06IFQgcmVhZCBHZXRJdGVtIHdyaXRlIFNldEl0ZW07IGRlZmF1bHQ7CisgIGVuZDsKKworICBUVGhyaWZ0TGlzdEltcGw8VD4gPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElUaHJpZnRMaXN0PFQ+KQorICBwcml2YXRlCisgICAgRkxpc3QgOiBUTGlzdDxUPjsKKyAgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gR2V0RW51bWVyYXRvcjogVEVudW1lcmF0b3I8VD47CisgICAgZnVuY3Rpb24gR2V0Q2FwYWNpdHk6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldENhcGFjaXR5KFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRDb3VudDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0Q291bnQoVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldEl0ZW0oSW5kZXg6IEludGVnZXIpOiBUOworICAgIHByb2NlZHVyZSBTZXRJdGVtKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBWYWx1ZTogVCk7CisgICAgZnVuY3Rpb24gQWRkKGNvbnN0IFZhbHVlOiBUKTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgQWRkUmFuZ2UoY29uc3QgVmFsdWVzOiBhcnJheSBvZiBUKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEFkZFJhbmdlKGNvbnN0IENvbGxlY3Rpb246IElFbnVtZXJhYmxlPFQ+KTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEFkZFJhbmdlKENvbGxlY3Rpb246IFRFbnVtZXJhYmxlPFQ+KTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEluc2VydChJbmRleDogSW50ZWdlcjsgY29uc3QgVmFsdWU6IFQpOworICAgIHByb2NlZHVyZSBJbnNlcnRSYW5nZShJbmRleDogSW50ZWdlcjsgY29uc3QgVmFsdWVzOiBhcnJheSBvZiBUKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEluc2VydFJhbmdlKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBDb2xsZWN0aW9uOiBJRW51bWVyYWJsZTxUPik7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBJbnNlcnRSYW5nZShJbmRleDogSW50ZWdlcjsgY29uc3QgQ29sbGVjdGlvbjogVEVudW1lcmFibGU8VD4pOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBSZW1vdmUoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBEZWxldGUoSW5kZXg6IEludGVnZXIpOworICAgIHByb2NlZHVyZSBEZWxldGVSYW5nZShBSW5kZXgsIEFDb3VudDogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gRXh0cmFjdChjb25zdCBWYWx1ZTogVCk6IFQ7Cit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQorICAgIHByb2NlZHVyZSBFeGNoYW5nZShJbmRleDEsIEluZGV4MjogSW50ZWdlcik7CisgICAgcHJvY2VkdXJlIE1vdmUoQ3VySW5kZXgsIE5ld0luZGV4OiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBGaXJzdDogVDsKKyAgICBmdW5jdGlvbiBMYXN0OiBUOworeyRJRkVORH0KKyAgICBwcm9jZWR1cmUgQ2xlYXI7CisgICAgZnVuY3Rpb24gQ29udGFpbnMoY29uc3QgVmFsdWU6IFQpOiBCb29sZWFuOworICAgIGZ1bmN0aW9uIEluZGV4T2YoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uIExhc3RJbmRleE9mKGNvbnN0IFZhbHVlOiBUKTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgUmV2ZXJzZTsKKyAgICBwcm9jZWR1cmUgU29ydDsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFNvcnQoY29uc3QgQUNvbXBhcmVyOiBJQ29tcGFyZXI8VD4pOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBCaW5hcnlTZWFyY2goY29uc3QgSXRlbTogVDsgb3V0IEluZGV4OiBJbnRlZ2VyKTogQm9vbGVhbjsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gQmluYXJ5U2VhcmNoKGNvbnN0IEl0ZW06IFQ7IG91dCBJbmRleDogSW50ZWdlcjsgY29uc3QgQUNvbXBhcmVyOiBJQ29tcGFyZXI8VD4pOiBCb29sZWFuOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgVHJpbUV4Y2VzczsKKyAgICBmdW5jdGlvbiBUb0FycmF5OiBUQXJyYXk8VD47CisgICAgcHJvcGVydHkgQ2FwYWNpdHk6IEludGVnZXIgcmVhZCBHZXRDYXBhY2l0eSB3cml0ZSBTZXRDYXBhY2l0eTsKKyAgICBwcm9wZXJ0eSBDb3VudDogSW50ZWdlciByZWFkIEdldENvdW50IHdyaXRlIFNldENvdW50OworICAgIHByb3BlcnR5IEl0ZW1zW0luZGV4OiBJbnRlZ2VyXTogVCByZWFkIEdldEl0ZW0gd3JpdGUgU2V0SXRlbTsgZGVmYXVsdDsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgIGVuZDsKKworICBJSGFzaFNldDxUVmFsdWU+ID0gaW50ZXJmYWNlKElUaHJpZnRDb250YWluZXIpCisgICAgWyd7MDkyM0EzQjUtRDRENC00OEE4LTkxQUQtNDAyMzhFMkVBRDY2fSddCisgICAgZnVuY3Rpb24gR2V0RW51bWVyYXRvcjogVEVudW1lcmF0b3I8VFZhbHVlPjsKKyAgICBmdW5jdGlvbiBHZXRJc1JlYWRPbmx5OiBCb29sZWFuOworICAgIGZ1bmN0aW9uIEdldENvdW50OiBJbnRlZ2VyOworICAgIHByb3BlcnR5IENvdW50OiBJbnRlZ2VyIHJlYWQgR2V0Q291bnQ7CisgICAgcHJvcGVydHkgSXNSZWFkT25seTogQm9vbGVhbiByZWFkIEdldElzUmVhZE9ubHk7CisgICAgcHJvY2VkdXJlIEFkZCggY29uc3QgaXRlbTogVFZhbHVlKTsKKyAgICBwcm9jZWR1cmUgQ2xlYXI7CisgICAgZnVuY3Rpb24gQ29udGFpbnMoIGNvbnN0IGl0ZW06IFRWYWx1ZSk6IEJvb2xlYW47CisgICAgcHJvY2VkdXJlIENvcHlUbyh2YXIgQTogVEFycmF5PFRWYWx1ZT47IGFycmF5SW5kZXg6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIFJlbW92ZSggY29uc3QgaXRlbTogVFZhbHVlICk6IEJvb2xlYW47CisgIGVuZDsKKworICBUSGFzaFNldEltcGw8VFZhbHVlPiA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSUhhc2hTZXQ8VFZhbHVlPikKKyAgcHJpdmF0ZQorICAgIEZEaWN0aW9uYXJ5IDogSVRocmlmdERpY3Rpb25hcnk8VFZhbHVlLEludGVnZXI+OworICAgIEZJc1JlYWRPbmx5OiBCb29sZWFuOworICBwcm90ZWN0ZWQKKyAgICBmdW5jdGlvbiBHZXRFbnVtZXJhdG9yOiBURW51bWVyYXRvcjxUVmFsdWU+OworICAgIGZ1bmN0aW9uIEdldElzUmVhZE9ubHk6IEJvb2xlYW47CisgICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7CisgICAgcHJvcGVydHkgQ291bnQ6IEludGVnZXIgcmVhZCBHZXRDb3VudDsKKyAgICBwcm9wZXJ0eSBJc1JlYWRPbmx5OiBCb29sZWFuIHJlYWQgRklzUmVhZE9ubHk7CisgICAgcHJvY2VkdXJlIEFkZCggY29uc3QgaXRlbTogVFZhbHVlKTsKKyAgICBwcm9jZWR1cmUgQ2xlYXI7CisgICAgZnVuY3Rpb24gQ29udGFpbnMoIGNvbnN0IGl0ZW06IFRWYWx1ZSk6IEJvb2xlYW47CisgICAgcHJvY2VkdXJlIENvcHlUbyh2YXIgQTogVEFycmF5PFRWYWx1ZT47IGFycmF5SW5kZXg6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIFJlbW92ZSggY29uc3QgaXRlbTogVFZhbHVlICk6IEJvb2xlYW47CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgZW5kOworCitpbXBsZW1lbnRhdGlvbgorCit7IFRIYXNoU2V0SW1wbDxUVmFsdWU+IH0KKworcHJvY2VkdXJlIFRIYXNoU2V0SW1wbDxUVmFsdWU+LkFkZCggY29uc3QgaXRlbTogVFZhbHVlKTsKK2JlZ2luCisgIGlmIG5vdCBGRGljdGlvbmFyeS5Db250YWluc0tleShpdGVtKSB0aGVuCisgIGJlZ2luCisgICAgRkRpY3Rpb25hcnkuQWRkKCBpdGVtLCAwKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVEhhc2hTZXRJbXBsPFRWYWx1ZT4uQ2xlYXI7CitiZWdpbgorICBGRGljdGlvbmFyeS5DbGVhcjsKK2VuZDsKKworZnVuY3Rpb24gVEhhc2hTZXRJbXBsPFRWYWx1ZT4uQ29udGFpbnMoIGNvbnN0IGl0ZW06IFRWYWx1ZSk6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gRkRpY3Rpb25hcnkuQ29udGFpbnNLZXkoaXRlbSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUSGFzaFNldEltcGw8VFZhbHVlPi5Db3B5VG8odmFyIEE6IFRBcnJheTxUVmFsdWU+OyBhcnJheUluZGV4OiBJbnRlZ2VyKTsKK3ZhcgorICBpIDogSW50ZWdlcjsKKyAgRW51bWxhdG9yIDogVEVudW1lcmF0b3I8VFZhbHVlPjsKK2JlZ2luCisgIEVudW1sYXRvciA6PSBHZXRFbnVtZXJhdG9yOworICB3aGlsZSBFbnVtbGF0b3IuTW92ZU5leHQgZG8KKyAgYmVnaW4KKyAgICBBW2FycmF5SW5kZXhdIDo9IEVudW1sYXRvci5DdXJyZW50OworICAgIEluYyhhcnJheUluZGV4KTsKKyAgZW5kOworZW5kOworCitjb25zdHJ1Y3RvciBUSGFzaFNldEltcGw8VFZhbHVlPi5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQ7CisgIEZEaWN0aW9uYXJ5IDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUVmFsdWUsSW50ZWdlcj4uQ3JlYXRlOworZW5kOworCitmdW5jdGlvbiBUSGFzaFNldEltcGw8VFZhbHVlPi5HZXRDb3VudDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGRGljdGlvbmFyeS5Db3VudDsKK2VuZDsKKworZnVuY3Rpb24gVEhhc2hTZXRJbXBsPFRWYWx1ZT4uR2V0RW51bWVyYXRvcjogVEVudW1lcmF0b3I8VFZhbHVlPjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGRGljdGlvbmFyeS5LZXlzLkdldEVudW1lcmF0b3I7CitlbmQ7CisKK2Z1bmN0aW9uIFRIYXNoU2V0SW1wbDxUVmFsdWU+LkdldElzUmVhZE9ubHk6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gRklzUmVhZE9ubHk7CitlbmQ7CisKK2Z1bmN0aW9uIFRIYXNoU2V0SW1wbDxUVmFsdWU+LlJlbW92ZSggY29uc3QgaXRlbTogVFZhbHVlKTogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGYWxzZTsKKyAgaWYgRkRpY3Rpb25hcnkuQ29udGFpbnNLZXkoIGl0ZW0gKSB0aGVuCisgIGJlZ2luCisgICAgRkRpY3Rpb25hcnkuUmVtb3ZlKCBpdGVtICk7CisgICAgUmVzdWx0IDo9IG5vdCBGRGljdGlvbmFyeS5Db250YWluc0tleSggaXRlbSApOworICBlbmQ7CitlbmQ7CisKK3sgVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4gfQorCitwcm9jZWR1cmUgVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uQWRkKGNvbnN0IEtleTogVEtleTsKKyAgY29uc3QgVmFsdWU6IFRWYWx1ZSk7CitiZWdpbgorICBGRGljdGlvbmFseS5BZGQoIEtleSwgVmFsdWUpOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uQWRkT3JTZXRWYWx1ZShjb25zdCBLZXk6IFRLZXk7CisgIGNvbnN0IFZhbHVlOiBUVmFsdWUpOworYmVnaW4KKyAgRkRpY3Rpb25hbHkuQWRkT3JTZXRWYWx1ZSggS2V5LCBWYWx1ZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5DbGVhcjsKK2JlZ2luCisgIEZEaWN0aW9uYWx5LkNsZWFyOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5Db250YWluc0tleSgKKyAgY29uc3QgS2V5OiBUS2V5KTogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGRGljdGlvbmFseS5Db250YWluc0tleSggS2V5ICk7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkNvbnRhaW5zVmFsdWUoCisgIGNvbnN0IFZhbHVlOiBUVmFsdWUpOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYWx5LkNvbnRhaW5zVmFsdWUoIFZhbHVlICk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkNyZWF0ZShBQ2FwYWNpdHk6IEludGVnZXIpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRkRpY3Rpb25hbHkgOj0gVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LkNyZWF0ZSggQUNhcGFjaXR5ICk7CitlbmQ7CisKK2Rlc3RydWN0b3IgVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uRGVzdHJveTsKK2JlZ2luCisgIEZEaWN0aW9uYWx5LkZyZWU7CisgIGluaGVyaXRlZDsKK2VuZDsKKworeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KK2Z1bmN0aW9uIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkV4dHJhY3RQYWlyKCBjb25zdCBLZXk6IFRLZXkpOiBUUGFpcjxUS2V5LCBUVmFsdWU+OworYmVnaW4KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYWx5LkV4dHJhY3RQYWlyKCBLZXkpOworZW5kOworeyRJRkVORH0KKworZnVuY3Rpb24gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uR2V0Q291bnQ6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkRpY3Rpb25hbHkuQ291bnQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkdldEVudW1lcmF0b3I6IFRFbnVtZXJhdG9yPFRQYWlyPFRLZXksIFRWYWx1ZT4+OworYmVnaW4KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYWx5LkdldEVudW1lcmF0b3I7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkdldEl0ZW0oY29uc3QgS2V5OiBUS2V5KTogVFZhbHVlOworYmVnaW4KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYWx5Lkl0ZW1zW0tleV07CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkdldEtleXM6IFREaWN0aW9uYXJ5PFRLZXksIFRWYWx1ZT4uVEtleUNvbGxlY3Rpb247CitiZWdpbgorICBSZXN1bHQgOj0gRkRpY3Rpb25hbHkuS2V5czsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uR2V0VmFsdWVzOiBURGljdGlvbmFyeTxUS2V5LCBUVmFsdWU+LlRWYWx1ZUNvbGxlY3Rpb247CitiZWdpbgorICBSZXN1bHQgOj0gRkRpY3Rpb25hbHkuVmFsdWVzOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uUmVtb3ZlKGNvbnN0IEtleTogVEtleSk7CitiZWdpbgorICBGRGljdGlvbmFseS5SZW1vdmUoIEtleSApOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uU2V0SXRlbShjb25zdCBLZXk6IFRLZXk7CisgIGNvbnN0IFZhbHVlOiBUVmFsdWUpOworYmVnaW4KKyAgRkRpY3Rpb25hbHkuQWRkT3JTZXRWYWx1ZSggS2V5LCBWYWx1ZSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LlRvQXJyYXk6IFRBcnJheTxUUGFpcjxUS2V5LCBUVmFsdWU+PjsKK3skSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjIuMH0KK3ZhcgorICB4IDogVFBhaXI8VEtleSwgVFZhbHVlPjsKKyAgaSA6IEludGVnZXI7Cit7JElGRU5EfQorYmVnaW4KK3skSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjIuMH0KKyAgU2V0TGVuZ3RoKFJlc3VsdCwgQ291bnQpOworICBpIDo9IDA7CisgIGZvciB4IGluIEZEaWN0aW9uYWx5IGRvCisgIGJlZ2luCisgICAgUmVzdWx0W2ldIDo9IHg7CisgICAgSW5jKCBpICk7CisgIGVuZDsKK3skRUxTRX0KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYWx5LlRvQXJyYXk7Cit7JElGRU5EfQorZW5kOworCitwcm9jZWR1cmUgVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uVHJpbUV4Y2VzczsKK2JlZ2luCisgIEZEaWN0aW9uYWx5LlRyaW1FeGNlc3M7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LlRyeUdldFZhbHVlKGNvbnN0IEtleTogVEtleTsKKyAgb3V0IFZhbHVlOiBUVmFsdWUpOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYWx5LlRyeUdldFZhbHVlKCBLZXksIFZhbHVlKTsKK2VuZDsKKworeyBUVGhyaWZ0TGlzdEltcGw8VD4gfQorCitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uQWRkKGNvbnN0IFZhbHVlOiBUKTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTGlzdC5BZGQoIFZhbHVlICk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uQWRkUmFuZ2UoQ29sbGVjdGlvbjogVEVudW1lcmFibGU8VD4pOworYmVnaW4KKyAgRkxpc3QuQWRkUmFuZ2UoIENvbGxlY3Rpb24gKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5BZGRSYW5nZShjb25zdCBDb2xsZWN0aW9uOiBJRW51bWVyYWJsZTxUPik7CitiZWdpbgorICBGTGlzdC5BZGRSYW5nZSggQ29sbGVjdGlvbiApOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LkFkZFJhbmdlKGNvbnN0IFZhbHVlczogYXJyYXkgb2YgVCk7CitiZWdpbgorICBGTGlzdC5BZGRSYW5nZSggVmFsdWVzICk7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5CaW5hcnlTZWFyY2goY29uc3QgSXRlbTogVDsKKyAgb3V0IEluZGV4OiBJbnRlZ2VyKTogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTGlzdC5CaW5hcnlTZWFyY2goIEl0ZW0sIEluZGV4KTsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LkJpbmFyeVNlYXJjaChjb25zdCBJdGVtOiBUOyBvdXQgSW5kZXg6IEludGVnZXI7CisgIGNvbnN0IEFDb21wYXJlcjogSUNvbXBhcmVyPFQ+KTogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTGlzdC5CaW5hcnlTZWFyY2goIEl0ZW0sIEluZGV4LCBBQ29tcGFyZXIpOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LkNsZWFyOworYmVnaW4KKyAgRkxpc3QuQ2xlYXI7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5Db250YWlucyhjb25zdCBWYWx1ZTogVCk6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gRkxpc3QuQ29udGFpbnMoIFZhbHVlICk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRUaHJpZnRMaXN0SW1wbDxUPi5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQ7CisgIEZMaXN0IDo9IFRMaXN0PFQ+LkNyZWF0ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5EZWxldGUoSW5kZXg6IEludGVnZXIpOworYmVnaW4KKyAgRkxpc3QuRGVsZXRlKCBJbmRleCApCitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uRGVsZXRlUmFuZ2UoQUluZGV4LCBBQ291bnQ6IEludGVnZXIpOworYmVnaW4KKyAgRkxpc3QuRGVsZXRlUmFuZ2UoIEFJbmRleCwgQUNvdW50KQorZW5kOworCitkZXN0cnVjdG9yIFRUaHJpZnRMaXN0SW1wbDxUPi5EZXN0cm95OworYmVnaW4KKyAgRkxpc3QuRnJlZTsKKyAgaW5oZXJpdGVkOworZW5kOworCit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQorcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5FeGNoYW5nZShJbmRleDEsIEluZGV4MjogSW50ZWdlcik7CitiZWdpbgorICBGTGlzdC5FeGNoYW5nZSggSW5kZXgxLCBJbmRleDIgKQorZW5kOworeyRJRkVORH0KKworZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LkV4dHJhY3QoY29uc3QgVmFsdWU6IFQpOiBUOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0LkV4dHJhY3QoIFZhbHVlICkKK2VuZDsKKworeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5GaXJzdDogVDsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTGlzdC5GaXJzdDsKK2VuZDsKK3skSUZFTkR9CisKK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5HZXRDYXBhY2l0eTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTGlzdC5DYXBhY2l0eTsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LkdldENvdW50OiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0LkNvdW50OworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uR2V0RW51bWVyYXRvcjogVEVudW1lcmF0b3I8VD47CitiZWdpbgorICBSZXN1bHQgOj0gRkxpc3QuR2V0RW51bWVyYXRvcjsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LkdldEl0ZW0oSW5kZXg6IEludGVnZXIpOiBUOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0W0luZGV4XTsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LkluZGV4T2YoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0LkluZGV4T2YoIFZhbHVlICk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uSW5zZXJ0KEluZGV4OiBJbnRlZ2VyOyBjb25zdCBWYWx1ZTogVCk7CitiZWdpbgorICBGTGlzdC5JbnNlcnQoIEluZGV4LCBWYWx1ZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uSW5zZXJ0UmFuZ2UoSW5kZXg6IEludGVnZXI7CisgIGNvbnN0IENvbGxlY3Rpb246IFRFbnVtZXJhYmxlPFQ+KTsKK2JlZ2luCisgIEZMaXN0Lkluc2VydFJhbmdlKCBJbmRleCwgQ29sbGVjdGlvbiApOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+Lkluc2VydFJhbmdlKEluZGV4OiBJbnRlZ2VyOworICBjb25zdCBWYWx1ZXM6IGFycmF5IG9mIFQpOworYmVnaW4KKyAgRkxpc3QuSW5zZXJ0UmFuZ2UoIEluZGV4LCBWYWx1ZXMpOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+Lkluc2VydFJhbmdlKEluZGV4OiBJbnRlZ2VyOworICBjb25zdCBDb2xsZWN0aW9uOiBJRW51bWVyYWJsZTxUPik7CitiZWdpbgorICBGTGlzdC5JbnNlcnRSYW5nZSggSW5kZXgsIENvbGxlY3Rpb24gKTsKK2VuZDsKKworeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5MYXN0OiBUOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0Lkxhc3Q7CitlbmQ7Cit7JElGRU5EfQorCitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uTGFzdEluZGV4T2YoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0Lkxhc3RJbmRleE9mKCBWYWx1ZSApOworZW5kOworCit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQorcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5Nb3ZlKEN1ckluZGV4LCBOZXdJbmRleDogSW50ZWdlcik7CitiZWdpbgorICBGTGlzdC5Nb3ZlKCBDdXJJbmRleCwgIE5ld0luZGV4KTsKK2VuZDsKK3skSUZFTkR9CisKK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5SZW1vdmUoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0LlJlbW92ZSggVmFsdWUgKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5SZXZlcnNlOworYmVnaW4KKyAgRkxpc3QuUmV2ZXJzZTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5TZXRDYXBhY2l0eShWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGTGlzdC5DYXBhY2l0eSA6PSBWYWx1ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5TZXRDb3VudChWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGTGlzdC5Db3VudCA6PSBWYWx1ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5TZXRJdGVtKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBWYWx1ZTogVCk7CitiZWdpbgorICBGTGlzdFtJbmRleF0gOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uU29ydDsKK2JlZ2luCisgIEZMaXN0LlNvcnQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uU29ydChjb25zdCBBQ29tcGFyZXI6IElDb21wYXJlcjxUPik7CitiZWdpbgorICBGTGlzdC5Tb3J0OworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uVG9BcnJheTogVEFycmF5PFQ+OworeyRJRiBDb21waWxlclZlcnNpb24gPCAyMi4wfQordmFyCisgIHggOiBUOworICBpIDogSW50ZWdlcjsKK3skSUZFTkR9CitiZWdpbgoreyRJRiBDb21waWxlclZlcnNpb24gPCAyMi4wfQorICBTZXRMZW5ndGgoUmVzdWx0LCBDb3VudCk7CisgIGkgOj0gMDsKKyAgZm9yIHggaW4gRkxpc3QgZG8KKyAgYmVnaW4KKyAgICBSZXN1bHRbaV0gOj0geDsKKyAgICBJbmMoIGkgKTsKKyAgZW5kOworeyRFTFNFfQorICBSZXN1bHQgOj0gRkxpc3QuVG9BcnJheTsKK3skSUZFTkR9CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uVHJpbUV4Y2VzczsKK2JlZ2luCisgIEZMaXN0LlRyaW1FeGNlc3M7CitlbmQ7CisKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5EZWZpbmVzLmluYyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5EZWZpbmVzLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTljY2FlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkRlZmluZXMuaW5jCkBAIC0wLDAgKzEsNTAgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworCisvLyBHb29kIGxpc3RzIG9mIERlbHBoaSB2ZXJzaW9uIG51bWJlcnMKKy8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9qZWN0LWplZGkvamVkaS9ibG9iL21hc3Rlci9qZWRpLmluYworLy8gaHR0cDovL2RvY3dpa2kuZW1iYXJjYWRlcm8uY29tL1JBRFN0dWRpby9TZWF0dGxlL2VuL0NvbXBpbGVyX1ZlcnNpb25zCisKKworLy8gc3RhcnQgd2l0aCBtb3N0IGJhY2t3YXJkcyBjb21wYXRpYmxlIGRlZmF1bHRzCisKK3skREVGSU5FIE9MRF9VTklUX05BTUVTfQoreyRERUZJTkUgT0xEX1NPQ0tFVFN9ICAgICAgLy8gVE9ETzogYWRkIHNvY2tldCBzdXBwb3J0IGZvciBDb21waWxlclZlcnNpb24gPj0gMjguMAoreyRVTkRFRiBIQVZFX0NMQVNTX0NUT1J9CisKKworLy8gZW5hYmxlIGZlYXR1cmVzIGFzIHRoZXkgYXJlIGF2YWlsYWJsZQorCit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfSAgIC8vIERlbHBoaSAyMDEwCisgIHskREVGSU5FIEhBVkVfQ0xBU1NfQ1RPUn0KK3skSUZFTkR9CisKK3skSUYgQ29tcGlsZXJWZXJzaW9uID49IDIzLjB9ICAgLy8gRGVscGhpIFhFMgorICB7JFVOREVGIE9MRF9VTklUX05BTUVTfQoreyRJRkVORH0KKworeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjguMH0gICAvLyBEZWxwaGkgWEU3CisgIHskVU5ERUYgT0xEX1NPQ0tFVFN9Cit7JElGRU5EfQorCisKKy8vIEVPRgorCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5FeGNlcHRpb24ucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkV4Y2VwdGlvbi5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxNWMzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5FeGNlcHRpb24ucGFzCkBAIC0wLDAgKzEsNjIgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworeyRTQ09QRURFTlVNUyBPTn0KKwordW5pdCBUaHJpZnQuRXhjZXB0aW9uOworCitpbnRlcmZhY2UKKwordXNlcworICBDbGFzc2VzLCBTeXNVdGlsczsKKwordHlwZQorICAvLyBiYXNlIGNsYXNzIGZvciBhbGwgVGhyaWZ0IGV4Y2VwdGlvbnMKKyAgVEV4Y2VwdGlvbiA9IGNsYXNzKCBTeXNVdGlscy5FeGNlcHRpb24pCisgIHB1YmxpYworICAgIGZ1bmN0aW9uIE1lc3NhZ2UgOiBzdHJpbmc7ICAgICAgICAvLyBoaWRlIGluaGVyaXRlZCBwcm9wZXJ0eTogYWxsb3cgcmVhZCwgYnV0IHByZXZlbnQgYWNjaWRlbnRhbCB3cml0ZXMKKyAgICBwcm9jZWR1cmUgVXBkYXRlTWVzc2FnZVByb3BlcnR5OyAgLy8gdXBkYXRlIGluaGVyaXRlZCBtZXNzYWdlIHByb3BlcnR5IHdpdGggdG9TdHJpbmcoKQorICBlbmQ7CisKKworCisKK2ltcGxlbWVudGF0aW9uCisKK3sgVEV4Y2VwdGlvbiB9CisKK2Z1bmN0aW9uIFRFeGNlcHRpb24uTWVzc2FnZTsKKy8vIGFsbG93IHJlYWQgKGV4Y2VwdGlvbiBzdW1tYXJ5KSwgYnV0IHByZXZlbnQgYWNjaWRlbnRhbCB3cml0ZXMKKy8vIHJlYWQgd2lsbCByZXR1cm4gdGhlIGV4Y2VwdGlvbiBzdW1tYXJ5CitiZWdpbgorICByZXN1bHQgOj0gU2VsZi5Ub1N0cmluZzsKK2VuZDsKKworcHJvY2VkdXJlIFRFeGNlcHRpb24uVXBkYXRlTWVzc2FnZVByb3BlcnR5OworLy8gVXBkYXRlIHRoZSBpbmhlcml0ZWQgTWVzc2FnZSBwcm9wZXJ0eSB0byBiZXR0ZXIgY29uZm9ybSB0byBzdGFuZGFyZCBiZWhhdmlvdXIuCisvLyBOaWNlIGJlbmVmaXQ6IFRoZSBJREUgaXMgbm93IGFibGUgdG8gc2hvdyB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgYWdhaW4uCitiZWdpbgorICBpbmhlcml0ZWQgTWVzc2FnZSA6PSBTZWxmLlRvU3RyaW5nOyAgLy8gcHJvZHVjZXMgYSBzdW1tYXJ5IHRleHQKK2VuZDsKKworCisKKworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleC5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleC5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNmMjNkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4LnBhcwpAQCAtMCwwICsxLDIzMSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4OworCisKK2ludGVyZmFjZQorCit1c2VzCisgIFN5c1V0aWxzLAorICBHZW5lcmljcy5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0LAorICBUaHJpZnQuUHJvdG9jb2wsCisgIFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXg7CisKK3sgVE11bHRpcGxleGVkUHJvY2Vzc29yIGlzIGEgVFByb2Nlc3NvciBhbGxvd2luZyBhIHNpbmdsZSBUU2VydmVyIHRvIHByb3ZpZGUgbXVsdGlwbGUgc2VydmljZXMuCisgIFRvIGRvIHNvLCB5b3UgaW5zdGFudGlhdGUgdGhlIHByb2Nlc3NvciBhbmQgdGhlbiByZWdpc3RlciBhZGRpdGlvbmFsIHByb2Nlc3NvcnMgd2l0aCBpdCwKKyAgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgorCisKKyAgICAgVE11bHRpcGxleGVkUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKKworICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgICAgICAgICAiQ2FsY3VsYXRvciIsCisgICAgICAgICBuZXcgQ2FsY3VsYXRvci5Qcm9jZXNzb3IobmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpKTsKKworICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgICAgICAgICAiV2VhdGhlclJlcG9ydCIsCisgICAgICAgICBuZXcgV2VhdGhlclJlcG9ydC5Qcm9jZXNzb3IobmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKTsKKworICAgICBUU2VydmVyVHJhbnNwb3J0IHQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsKKyAgICAgVFNpbXBsZVNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHQpOworCisgICAgIHNlcnZlci5zZXJ2ZSgpOworfQorCisKK3R5cGUKKyAgSU11bHRpcGxleGVkUHJvY2Vzc29yID0gaW50ZXJmYWNlKCBJUHJvY2Vzc29yKQorICAgIFsnezgwN0Y5RDE5LTZDRjQtNDc4OS04NDBFLTkzRTg3QTEyRUI2M30nXQorICAgIC8vIFJlZ2lzdGVyIGEgc2VydmljZSB3aXRoIHRoaXMgVE11bHRpcGxleGVkUHJvY2Vzc29yLiAgVGhpcyBhbGxvd3MgdXMKKyAgICAvLyB0byBicm9rZXIgcmVxdWVzdHMgdG8gaW5kaXZpZHVhbCBzZXJ2aWNlcyBieSB1c2luZyB0aGUgc2VydmljZSBuYW1lCisgICAgLy8gdG8gc2VsZWN0IHRoZW0gYXQgcmVxdWVzdCB0aW1lLgorICAgIHByb2NlZHVyZSBSZWdpc3RlclByb2Nlc3NvciggY29uc3Qgc2VydmljZU5hbWUgOiBTdHJpbmc7IGNvbnN0IHByb2Nlc3NvciA6IElQcm9jZXNzb3I7IGNvbnN0IGFzRGVmYXVsdCA6IEJvb2xlYW4gPSBGQUxTRSk7CisgIGVuZDsKKworCisgIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElNdWx0aXBsZXhlZFByb2Nlc3NvciwgSVByb2Nlc3NvcikKKyAgcHJpdmF0ZSB0eXBlCisgICAgLy8gT3VyIGdvYWwgd2FzIHRvIHdvcmsgd2l0aCBhbnkgcHJvdG9jb2wuICBJbiBvcmRlciB0byBkbyB0aGF0LCB3ZSBuZWVkZWQKKyAgICAvLyB0byBhbGxvdyB0aGVtIHRvIGNhbGwgcmVhZE1lc3NhZ2VCZWdpbigpIGFuZCBnZXQgYSBUTWVzc2FnZSBpbiBleGFjdGx5CisgICAgLy8gdGhlIHN0YW5kYXJkIGZvcm1hdCwgd2l0aG91dCB0aGUgc2VydmljZSBuYW1lIHByZXBlbmRlZCB0byBUTWVzc2FnZS5uYW1lLgorICAgIFRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgPSBjbGFzcyggVFByb3RvY29sRGVjb3JhdG9yKQorICAgIHByaXZhdGUKKyAgICAgIEZNZXNzYWdlQmVnaW4gOiBUVGhyaWZ0TWVzc2FnZTsKKyAgICBwdWJsaWMKKyAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgcHJvdG9jb2wgOiBJUHJvdG9jb2w7IGNvbnN0IGFNc2dCZWdpbiA6IFRUaHJpZnRNZXNzYWdlKTsKKyAgICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOyBvdmVycmlkZTsKKyAgICBlbmQ7CisKKyAgcHJpdmF0ZQorICAgIEZTZXJ2aWNlUHJvY2Vzc29yTWFwIDogVERpY3Rpb25hcnk8U3RyaW5nLCBJUHJvY2Vzc29yPjsKKyAgICBGRGVmYXVsdFByb2Nlc3NvciA6IElQcm9jZXNzb3I7CisKKyAgICBwcm9jZWR1cmUgRXJyb3IoIGNvbnN0IG9wcm90IDogSVByb3RvY29sOyBjb25zdCBtc2cgOiBUVGhyaWZ0TWVzc2FnZTsKKyAgICAgICAgICAgICAgICAgICAgIGV4dHlwZSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkQ2xhc3M7IGNvbnN0IGV0eHQgOiBzdHJpbmcpOworCisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKworICAgIC8vIFJlZ2lzdGVyIGEgc2VydmljZSB3aXRoIHRoaXMgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC4gIFRoaXMgYWxsb3dzIHVzCisgICAgLy8gdG8gYnJva2VyIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UgbmFtZQorICAgIC8vIHRvIHNlbGVjdCB0aGVtIGF0IHJlcXVlc3QgdGltZS4KKyAgICBwcm9jZWR1cmUgUmVnaXN0ZXJQcm9jZXNzb3IoIGNvbnN0IHNlcnZpY2VOYW1lIDogU3RyaW5nOyBjb25zdCBwcm9jZXNzb3IgOiBJUHJvY2Vzc29yOyBjb25zdCBhc0RlZmF1bHQgOiBCb29sZWFuID0gRkFMU0UpOworCisgICAgeyBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHByb2Nlc3MgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKyAgICAgIC0gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXNzYWdlLgorICAgICAgLSBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgbWVzc2FnZS4KKyAgICAgIC0gVXNpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byBsb2NhdGUgdGhlIGFwcHJvcHJpYXRlIHByb2Nlc3Nvci4KKyAgICAgIC0gRGlzcGF0Y2ggdG8gdGhlIHByb2Nlc3Nvciwgd2l0aCBhIGRlY29yYXRlZCBpbnN0YW5jZSBvZiBUUHJvdG9jb2wKKyAgICAgICAgdGhhdCBhbGxvd3MgcmVhZE1lc3NhZ2VCZWdpbigpIHRvIHJldHVybiB0aGUgb3JpZ2luYWwgVE1lc3NhZ2UuCisKKyAgICAgIEFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIG1lc3NhZ2UgdHlwZSBpcyBub3QgQ0FMTCBvciBPTkVXQVkKKyAgICAgIG9yIGlmIHRoZSBzZXJ2aWNlIGlzIHVua25vd24gKG9yIG5vdCBwcm9wZXJseSByZWdpc3RlcmVkKS4KKyAgICB9CisgICAgZnVuY3Rpb24gUHJvY2VzcyggY29uc3QgaXByb3QsIG9wcm90OiBJUHJvdG9jb2w7IGNvbnN0IGV2ZW50cyA6IElQcm9jZXNzb3JFdmVudHMgPSBuaWwpOiBCb29sZWFuOworICBlbmQ7CisKKworaW1wbGVtZW50YXRpb24KKworY29uc3RydWN0b3IgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5UU3RvcmVkTWVzc2FnZVByb3RvY29sLkNyZWF0ZSggY29uc3QgcHJvdG9jb2wgOiBJUHJvdG9jb2w7IGNvbnN0IGFNc2dCZWdpbiA6IFRUaHJpZnRNZXNzYWdlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoIHByb3RvY29sKTsKKyAgRk1lc3NhZ2VCZWdpbiA6PSBhTXNnQmVnaW47CitlbmQ7CisKKworZnVuY3Rpb24gVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5UU3RvcmVkTWVzc2FnZVByb3RvY29sLlJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOworYmVnaW4KKyAgcmVzdWx0IDo9IEZNZXNzYWdlQmVnaW47CitlbmQ7CisKKworY29uc3RydWN0b3IgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU2VydmljZVByb2Nlc3Nvck1hcCA6PSBURGljdGlvbmFyeTxzdHJpbmcsSVByb2Nlc3Nvcj4uQ3JlYXRlOworZW5kOworCisKK2Rlc3RydWN0b3IgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgRnJlZUFuZE5pbCggRlNlcnZpY2VQcm9jZXNzb3JNYXApOworICBmaW5hbGx5CisgICAgaW5oZXJpdGVkIERlc3Ryb3k7CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5SZWdpc3RlclByb2Nlc3NvciggY29uc3Qgc2VydmljZU5hbWUgOiBTdHJpbmc7IGNvbnN0IHByb2Nlc3NvciA6IElQcm9jZXNzb3I7IGNvbnN0IGFzRGVmYXVsdCA6IEJvb2xlYW4pOworYmVnaW4KKyAgRlNlcnZpY2VQcm9jZXNzb3JNYXAuQWRkKCBzZXJ2aWNlTmFtZSwgcHJvY2Vzc29yKTsKKworICBpZiBhc0RlZmF1bHQgdGhlbiBiZWdpbgorICAgIGlmIEZEZWZhdWx0UHJvY2Vzc29yID0gbmlsCisgICAgdGhlbiBGRGVmYXVsdFByb2Nlc3NvciA6PSBwcm9jZXNzb3IKKyAgICBlbHNlIHJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludGVybmFsRXJyb3IuQ3JlYXRlKCdPbmx5IG9uZSBkZWZhdWx0IHNlcnZpY2UgYWxsb3dlZCcpOworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuRXJyb3IoIGNvbnN0IG9wcm90IDogSVByb3RvY29sOyBjb25zdCBtc2cgOiBUVGhyaWZ0TWVzc2FnZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHR5cGUgOiBUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZENsYXNzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV0eHQgOiBzdHJpbmcpOwordmFyIGFwcGV4ICA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKKyAgICBuZXdNc2cgOiBUVGhyaWZ0TWVzc2FnZTsKK2JlZ2luCisgIGFwcGV4IDo9IGV4dHlwZS5DcmVhdGUoZXR4dCk7CisgIHRyeQorICAgIEluaXQoIG5ld01zZywgbXNnLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1zZy5TZXFJRCk7CisKKyAgICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXdNc2cpOworICAgIGFwcGV4LldyaXRlKG9wcm90KTsKKyAgICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsKKyAgICBvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsKKworICBmaW5hbGx5CisgICAgYXBwZXguRnJlZTsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuUHJvY2Vzcyhjb25zdCBpcHJvdCwgb3Byb3QgOiBJUHJvdG9jb2w7IGNvbnN0IGV2ZW50cyA6IElQcm9jZXNzb3JFdmVudHMgPSBuaWwpOiBCb29sZWFuOwordmFyIG1zZywgbmV3TXNnIDogVFRocmlmdE1lc3NhZ2U7CisgICAgaWR4ICAgICAgICAgOiBJbnRlZ2VyOworICAgIHNTZXJ2aWNlICAgIDogc3RyaW5nOworICAgIHByb2Nlc3NvciAgIDogSVByb2Nlc3NvcjsKKyAgICBwcm90b2NvbCAgICA6IElQcm90b2NvbDsKK2NvbnN0CisgIEVSUk9SX0lOVkFMSURfTVNHVFlQRSAgID0gJ01lc3NhZ2UgbXVzdCBiZSAiY2FsbCIgb3IgIm9uZXdheSInOworICBFUlJPUl9JTkNPTVBBVElCTEVfUFJPVCA9ICdObyBzZXJ2aWNlIG5hbWUgZm91bmQgaW4gIiVzIi4gQ2xpZW50IGlzIGV4cGVjdGVkIHRvIHVzZSBUTXVsdGlwbGV4UHJvdG9jb2wuJzsKKyAgRVJST1JfVU5LTk9XTl9TRVJWSUNFICAgPSAnU2VydmljZSAiJXMiIGlzIG5vdCByZWdpc3RlcmVkIHdpdGggTXVsdGlwbGV4ZWRQcm9jZXNzb3InOworYmVnaW4KKyAgLy8gVXNlIHRoZSBhY3R1YWwgdW5kZXJseWluZyBwcm90b2NvbCAoZS5nLiBUQmluYXJ5UHJvdG9jb2wpIHRvIHJlYWQgdGhlIG1lc3NhZ2UgaGVhZGVyLgorICAvLyBUaGlzIHB1bGxzIHRoZSBtZXNzYWdlICJvZmYgdGhlIHdpcmUiLCB3aGljaCB3ZSdsbCBkZWFsIHdpdGggYXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZC4KKyAgbXNnIDo9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgaWYgbm90IChtc2cuVHlwZV8gaW4gW1RNZXNzYWdlVHlwZS5DYWxsLCBUTWVzc2FnZVR5cGUuT25ld2F5XSkgdGhlbiBiZWdpbgorICAgIEVycm9yKCBvcHJvdCwgbXNnLAorICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkTWVzc2FnZVR5cGUsCisgICAgICAgICAgIEVSUk9SX0lOVkFMSURfTVNHVFlQRSk7CisgICAgRXhpdCggRkFMU0UpOworICBlbmQ7CisKKyAgLy8gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lCisgIC8vIHVzZSBGRGVmYXVsdFByb2Nlc3NvciBhcyBmYWxsYmFjayBpZiB0aGVyZSBpcyBubyBzZXBhcmF0b3IKKyAgaWR4IDo9IFBvcyggVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SLCBtc2cuTmFtZSk7CisgIGlmIGlkeCA+IDAgdGhlbiBiZWdpbgorCisgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgY29uc3VtZWQgYnkgYW55IFRQcm90b2NvbAorICAgIHNTZXJ2aWNlIDo9IENvcHkoIG1zZy5OYW1lLCAxLCBpZHgtMSk7CisgICAgaWYgbm90IEZTZXJ2aWNlUHJvY2Vzc29yTWFwLlRyeUdldFZhbHVlKCBzU2VydmljZSwgcHJvY2Vzc29yKQorICAgIHRoZW4gYmVnaW4KKyAgICAgIEVycm9yKCBvcHJvdCwgbXNnLAorICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludGVybmFsRXJyb3IsCisgICAgICAgICAgICAgRm9ybWF0KEVSUk9SX1VOS05PV05fU0VSVklDRSxbc1NlcnZpY2VdKSk7CisgICAgICBFeGl0KCBGQUxTRSk7CisgICAgZW5kOworCisgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCByZW1vdmluZyB0aGUgc2VydmljZSBuYW1lCisgICAgSW5jKCBpZHgsIExlbmd0aChUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IpKTsKKyAgICBJbml0KCBuZXdNc2csIENvcHkoIG1zZy5OYW1lLCBpZHgsIE1BWElOVCksIG1zZy5UeXBlXywgbXNnLlNlcUlEKTsKKworICBlbmQKKyAgZWxzZSBpZiBGRGVmYXVsdFByb2Nlc3NvciA8PiBuaWwgdGhlbiBiZWdpbgorICAgIHByb2Nlc3NvciA6PSBGRGVmYXVsdFByb2Nlc3NvcjsKKyAgICBuZXdNc2cgICAgOj0gbXNnOyAgLy8gbm8gbmVlZCB0byBjaGFuZ2UKKworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIEVycm9yKCBvcHJvdCwgbXNnLAorICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkUHJvdG9jb2wsCisgICAgICAgICAgIEZvcm1hdChFUlJPUl9JTkNPTVBBVElCTEVfUFJPVCxbbXNnLk5hbWVdKSk7CisgICAgRXhpdCggRkFMU0UpOworICBlbmQ7CisKKyAgLy8gRGlzcGF0Y2ggcHJvY2Vzc2luZyB0byB0aGUgc3RvcmVkIHByb2Nlc3NvcgorICBwcm90b2NvbCA6PSBUU3RvcmVkTWVzc2FnZVByb3RvY29sLkNyZWF0ZSggaXByb3QsIG5ld01zZyk7CisgIHJlc3VsdCAgIDo9IHByb2Nlc3Nvci5wcm9jZXNzKCBwcm90b2NvbCwgb3Byb3QsIGV2ZW50cyk7CitlbmQ7CisKKworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMWIzZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuQ29tcGFjdC5wYXMKQEAgLTAsMCArMSwxMTE3IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3skU0NPUEVERU5VTVMgT059CisKK3VuaXQgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3Q7CisKK2ludGVyZmFjZQorCit1c2VzCisgIENsYXNzZXMsCisgIFN5c1V0aWxzLAorICBNYXRoLAorICBHZW5lcmljcy5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0LlRyYW5zcG9ydCwKKyAgVGhyaWZ0LlByb3RvY29sLAorICBUaHJpZnQuVXRpbHM7CisKK3R5cGUKKyAgSUNvbXBhY3RQcm90b2NvbCA9IGludGVyZmFjZSggSVByb3RvY29sKQorICAgIFsne0MwMTkyN0VDLTAyMUEtNDVGNy05M0IxLTIzRDZBNTQyMEVERH0nXQorICBlbmQ7CisKKyAgLy8gQ29tcGFjdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgorICAvLyBBZGFwdGVkIGZyb20gdGhlIEMjIHZlcnNpb24uCisgIFRDb21wYWN0UHJvdG9jb2xJbXBsID0gY2xhc3MoIFRQcm90b2NvbEltcGwsIElDb21wYWN0UHJvdG9jb2wpCisgIHB1YmxpYworICAgIHR5cGUKKyAgICAgIFRGYWN0b3J5ID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJUHJvdG9jb2xGYWN0b3J5KQorICAgICAgcHVibGljCisgICAgICAgIGZ1bmN0aW9uIEdldFByb3RvY29sKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydCk6IElQcm90b2NvbDsKKyAgICAgIGVuZDsKKworICBwcml2YXRlIGNvbnN0CisKKyAgICB7IFRPRE8KKyAgICBzdGF0aWMgVFN0cnVjdCBBTk9OWU1PVVNfU1RSVUNUID0gbmV3IFRTdHJ1Y3QoIiIpOworICAgIHN0YXRpYyBURmllbGQgVFNUT1AgPSBuZXcgVEZpZWxkKCIiLCBUVHlwZS5TdG9wLCAoc2hvcnQpMCk7CisgICAgfQorCisgICAgUFJPVE9DT0xfSUQgICAgICAgPSBCeXRlKCAkODIpOworICAgIFZFUlNJT04gICAgICAgICAgID0gQnl0ZSggMSk7CisgICAgVkVSU0lPTl9NQVNLICAgICAgPSBCeXRlKCAkMUYpOyAvLyAwMDAxIDExMTEKKyAgICBUWVBFX01BU0sgICAgICAgICA9IEJ5dGUoICRFMCk7IC8vIDExMTAgMDAwMAorICAgIFRZUEVfQklUUyAgICAgICAgID0gQnl0ZSggJDA3KTsgLy8gMDAwMCAwMTExCisgICAgVFlQRV9TSElGVF9BTU9VTlQgPSBCeXRlKCA1KTsKKworICBwcml2YXRlIHR5cGUKKyAgICAvLyBBbGwgb2YgdGhlIG9uLXdpcmUgdHlwZSBjb2Rlcy4KKyAgICBUeXBlcyA9ICgKKyAgICAgIFNUT1AgICAgICAgICAgPSAkMDAsCisgICAgICBCT09MRUFOX1RSVUUgID0gJDAxLAorICAgICAgQk9PTEVBTl9GQUxTRSA9ICQwMiwKKyAgICAgIEJZVEVfICAgICAgICAgPSAkMDMsCisgICAgICBJMTYgICAgICAgICAgID0gJDA0LAorICAgICAgSTMyICAgICAgICAgICA9ICQwNSwKKyAgICAgIEk2NCAgICAgICAgICAgPSAkMDYsCisgICAgICBET1VCTEVfICAgICAgID0gJDA3LAorICAgICAgQklOQVJZICAgICAgICA9ICQwOCwKKyAgICAgIExJU1QgICAgICAgICAgPSAkMDksCisgICAgICBTRVRfICAgICAgICAgID0gJDBBLAorICAgICAgTUFQICAgICAgICAgICA9ICQwQiwKKyAgICAgIFNUUlVDVCAgICAgICAgPSAkMEMKKyAgICApOworCisgIHByaXZhdGUgY29uc3QKKyAgICB0dHlwZVRvQ29tcGFjdFR5cGUgOiBhcnJheVtUVHlwZV0gb2YgVHlwZXMgPSAoCisgICAgICBUeXBlcy5TVE9QLCAgICAgICAgICAgLy8gU3RvcCAgICA9IDAsCisgICAgICBUeXBlcygtMSksICAgICAgICAgICAgLy8gVm9pZCAgICA9IDEsCisgICAgICBUeXBlcy5CT09MRUFOX1RSVUUsICAgLy8gQm9vbF8gICA9IDIsCisgICAgICBUeXBlcy5CWVRFXywgICAgICAgICAgLy8gQnl0ZV8gICA9IDMsCisgICAgICBUeXBlcy5ET1VCTEVfLCAgICAgICAgLy8gRG91YmxlXyA9IDQsCisgICAgICBUeXBlcygtNSksICAgICAgICAgICAgLy8gdW51c2VkCisgICAgICBUeXBlcy5JMTYsICAgICAgICAgICAgLy8gSTE2ICAgICA9IDYsCisgICAgICBUeXBlcygtNyksICAgICAgICAgICAgLy8gdW51c2VkCisgICAgICBUeXBlcy5JMzIsICAgICAgICAgICAgLy8gSTMyICAgICA9IDgsCisgICAgICBUeXBlcygtOSksICAgICAgICAgICAgLy8gdW51c2VkCisgICAgICBUeXBlcy5JNjQsICAgICAgICAgICAgLy8gSTY0ICAgICA9IDEwLAorICAgICAgVHlwZXMuQklOQVJZLCAgICAgICAgIC8vIFN0cmluZ18gPSAxMSwKKyAgICAgIFR5cGVzLlNUUlVDVCwgICAgICAgICAvLyBTdHJ1Y3QgID0gMTIsCisgICAgICBUeXBlcy5NQVAsICAgICAgICAgICAgLy8gTWFwICAgICA9IDEzLAorICAgICAgVHlwZXMuU0VUXywgICAgICAgICAgIC8vIFNldF8gICAgPSAxNCwKKyAgICAgIFR5cGVzLkxJU1QgICAgICAgICAgICAvLyBMaXN0ICAgID0gMTUsCisgICAgKTsKKworICAgIHRjb21wYWN0VHlwZVRvVHlwZSA6IGFycmF5W1R5cGVzXSBvZiBUVHlwZSA9ICgKKyAgICAgIFRUeXBlLlN0b3AsICAgICAgIC8vIFNUT1AKKyAgICAgIFRUeXBlLkJvb2xfLCAgICAgIC8vIEJPT0xFQU5fVFJVRQorICAgICAgVFR5cGUuQm9vbF8sICAgICAgLy8gQk9PTEVBTl9GQUxTRQorICAgICAgVFR5cGUuQnl0ZV8sICAgICAgLy8gQllURV8KKyAgICAgIFRUeXBlLkkxNiwgICAgICAgIC8vIEkxNgorICAgICAgVFR5cGUuSTMyLCAgICAgICAgLy8gSTMyCisgICAgICBUVHlwZS5JNjQsICAgICAgICAvLyBJNjQKKyAgICAgIFRUeXBlLkRvdWJsZV8sICAgIC8vIERPVUJMRV8KKyAgICAgIFRUeXBlLlN0cmluZ18sICAgIC8vIEJJTkFSWQorICAgICAgVFR5cGUuTGlzdCwgICAgICAgLy8gTElTVAorICAgICAgVFR5cGUuU2V0XywgICAgICAgLy8gU0VUXworICAgICAgVFR5cGUuTWFwLCAgICAgICAgLy8gTUFQCisgICAgICBUVHlwZS5TdHJ1Y3QgICAgICAvLyBTVFJVQ1QKKyAgICApOworCisgIHByaXZhdGUKKyAgICAvLyBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAorICAgIC8vIHNvIHdlIGNhbiBkbyB0aGUgZGVsdGEgc3R1ZmYuCisgICAgbGFzdEZpZWxkXyA6IFRTdGFjazxJbnRlZ2VyPjsKKyAgICBsYXN0RmllbGRJZF8gOiBJbnRlZ2VyOworCisgICAgLy8gSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUgc28gaXQgY2FuCisgICAgLy8gaGF2ZSB0aGUgdmFsdWUgaW5jb3Jwb3JhdGVkLgorICAgIHByaXZhdGUgYm9vbGVhbkZpZWxkXyA6IFRUaHJpZnRGaWVsZDsKKworICAgIC8vIElmIHdlIFJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZSB0aGUgYm9vbGVhbgorICAgIC8vIHZhbHVlIGhlcmUgc28gdGhhdCBSZWFkQm9vbCBjYW4gdXNlIGl0LgorICAgIHByaXZhdGUgIGJvb2xWYWx1ZV8gIDogKCB1bnVzZWQsIGJvb2xfdHJ1ZSwgYm9vbF9mYWxzZSk7CisKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IHRyYW5zIDogSVRyYW5zcG9ydCk7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyAgb3ZlcnJpZGU7CisKKyAgICBwcm9jZWR1cmUgUmVzZXQ7CisKKyAgcHJpdmF0ZQorICAgIHByb2NlZHVyZSBXcml0ZUJ5dGVEaXJlY3QoIGNvbnN0IGIgOiBCeXRlKTsgIG92ZXJsb2FkOworCisgICAgLy8gV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCisgICAgcHJvY2VkdXJlIFdyaXRlQnl0ZURpcmVjdCggY29uc3QgbiA6IEludGVnZXIpOyAgb3ZlcmxvYWQ7CisKKyAgICAvLyBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgIC8vIFRPRE86IG1ha2UgYSBwZXJtYW5lbnQgYnVmZmVyIGxpa2UgV3JpdGVWYXJpbnQ2ND8KKyAgICBwcm9jZWR1cmUgV3JpdGVWYXJpbnQzMiggbiA6IENhcmRpbmFsKTsKKworICBwcml2YXRlCisgICAgLy8gVGhlIHdvcmtob3JzZSBvZiBXcml0ZUZpZWxkQmVnaW4uIEl0IGhhcyB0aGUgb3B0aW9uIG9mIGRvaW5nIGEgJ3R5cGUgb3ZlcnJpZGUnCisgICAgLy8gb2YgdGhlIHR5cGUgaGVhZGVyLiBUaGlzIGlzIHVzZWQgc3BlY2lmaWNhbGx5IGluIHRoZSBib29sZWFuIGZpZWxkIGNhc2UuCisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbkludGVybmFsKCBjb25zdCBmaWVsZCA6IFRUaHJpZnRGaWVsZDsgdHlwZU92ZXJyaWRlIDogQnl0ZSk7CisKKyAgcHVibGljCisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0RW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkU3RvcDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RFbmQoKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0RW5kKCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUkxNiggaTE2OiBTbWFsbEludCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUkzMiggaTMyOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlSTY0KCBjb25zdCBpNjQ6IEludDY0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRG91YmxlKCBjb25zdCBkdWI6IERvdWJsZSk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsgb3ZlcmxvYWQ7IG92ZXJyaWRlOworCisgIHByaXZhdGUKKyAgICBjbGFzcyBmdW5jdGlvbiAgRG91YmxlVG9JbnQ2NEJpdHMoIGNvbnN0IGRiIDogRG91YmxlKSA6IEludDY0OworICAgIGNsYXNzIGZ1bmN0aW9uICBJbnQ2NEJpdHNUb0RvdWJsZSggY29uc3QgaTY0IDogSW50NjQpIDogRG91YmxlOworCisgICAgLy8gQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorICAgIC8vIHRoZSB3aXJlIGRpZmZlciBvbmx5IGJ5IHRoZSB0eXBlIGluZGljYXRvci4KKyAgICBwcm9jZWR1cmUgV3JpdGVDb2xsZWN0aW9uQmVnaW4oIGNvbnN0IGVsZW1UeXBlIDogVFR5cGU7IHNpemUgOiBJbnRlZ2VyKTsKKworICAgIHByb2NlZHVyZSBXcml0ZVZhcmludDY0KCBuIDogVUludDY0KTsKKworICAgIC8vIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAgICAvLyByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgICAgY2xhc3MgZnVuY3Rpb24gIGxvbmdUb1ppZ3phZyggY29uc3QgbiA6IEludDY0KSA6IFVJbnQ2NDsKKworICAgIC8vIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICAgIC8vIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAgICBjbGFzcyBmdW5jdGlvbiBpbnRUb1ppZ1phZyggY29uc3QgbiA6IEludGVnZXIpIDogQ2FyZGluYWw7CisKKyAgICAvL0NvbnZlcnQgYSBJbnQ2NCBpbnRvIGxpdHRsZS1lbmRpYW4gYnl0ZXMgaW4gYnVmIHN0YXJ0aW5nIGF0IG9mZiBhbmQgZ29pbmcgdW50aWwgb2ZmKzcuCisgICAgY2xhc3MgcHJvY2VkdXJlIGZpeGVkTG9uZ1RvQnl0ZXMoIGNvbnN0IG4gOiBJbnQ2NDsgdmFyIGJ1ZiA6IFRCeXRlcyk7CisKKyAgcHVibGljCisgICAgZnVuY3Rpb24gIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZE1lc3NhZ2VFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRTdHJ1Y3RFbmQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZEZpZWxkRW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkTWFwRW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRMaXN0RW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkQm9vbDogQm9vbGVhbjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRCeXRlOiBTaG9ydEludDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRJMTY6IFNtYWxsSW50OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZEkzMjogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRJNjQ6IEludDY0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZERvdWJsZTpEb3VibGU7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkQmluYXJ5OiBUQnl0ZXM7IG92ZXJsb2FkOyBvdmVycmlkZTsKKworICBwcml2YXRlCisgICAgLy8gSW50ZXJuYWwgUmVhZGluZyBtZXRob2RzCisKKyAgICAvLyBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAgICAvLyBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDUgYnl0ZXMuCisgICAgZnVuY3Rpb24gUmVhZFZhcmludDMyIDogQ2FyZGluYWw7CisKKyAgICAvLyBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgcHJvcGVyIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAgLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byAxMCBieXRlcy4KKyAgICBmdW5jdGlvbiBSZWFkVmFyaW50NjQgOiBVSW50NjQ7CisKKworICAgIC8vIGVuY29kaW5nIGhlbHBlcnMKKworICAgIC8vIENvbnZlcnQgZnJvbSB6aWd6YWcgSW50ZWdlciB0byBJbnRlZ2VyLgorICAgIGNsYXNzIGZ1bmN0aW9uIHppZ3phZ1RvSW50KCBjb25zdCBuIDogQ2FyZGluYWwgKSA6IEludGVnZXI7CisKKyAgICAvLyBDb252ZXJ0IGZyb20gemlnemFnIEludDY0IHRvIEludDY0LgorICAgIGNsYXNzIGZ1bmN0aW9uIHppZ3phZ1RvTG9uZyggY29uc3QgbiA6IFVJbnQ2NCkgOiBJbnQ2NDsKKworICAgIC8vIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBJbnQ2NCBsaXRlcmFscywKKyAgICAvLyBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBJbnRlZ2VyIGxlZnQgNTYgYml0cywKKyAgICAvLyB5b3UganVzdCBnZXQgYSBtZXNzZWQgdXAgSW50ZWdlci4KKyAgICBjbGFzcyBmdW5jdGlvbiBieXRlc1RvTG9uZyggY29uc3QgYnl0ZXMgOiBUQnl0ZXMpIDogSW50NjQ7CisKKyAgICAvLyB0eXBlIHRlc3RpbmcgYW5kIGNvbnZlcnRpbmcKKyAgICBjbGFzcyBmdW5jdGlvbiBpc0Jvb2xUeXBlKCBjb25zdCBiIDogYnl0ZSkgOiBCb29sZWFuOworCisgICAgLy8gR2l2ZW4gYSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nIFRUeXBlIHZhbHVlLgorICAgIGNsYXNzIGZ1bmN0aW9uIGdldFRUeXBlKCBjb25zdCB0eXBlXyA6IGJ5dGUpIDogVFR5cGU7CisKKyAgICAvLyBHaXZlbiBhIFRUeXBlIHZhbHVlLCBmaW5kIHRoZSBhcHByb3ByaWF0ZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LgorICAgIGNsYXNzIGZ1bmN0aW9uIGdldENvbXBhY3RUeXBlKCBjb25zdCB0dHlwZSA6IFRUeXBlKSA6IEJ5dGU7CisgIGVuZDsKKworCitpbXBsZW1lbnRhdGlvbgorCisKKworLy8tLS0gVENvbXBhY3RQcm90b2NvbEltcGwuVEZhY3RvcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkdldFByb3RvY29sKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydCk6IElQcm90b2NvbDsKK2JlZ2luCisgIHJlc3VsdCA6PSBUQ29tcGFjdFByb3RvY29sSW1wbC5DcmVhdGUoIHRyYW5zKTsKK2VuZDsKKworCisvLy0tLSBUQ29tcGFjdFByb3RvY29sSW1wbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworY29uc3RydWN0b3IgVENvbXBhY3RQcm90b2NvbEltcGwuQ3JlYXRlKGNvbnN0IHRyYW5zOiBJVHJhbnNwb3J0KTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoIHRyYW5zKTsKKworICBsYXN0RmllbGRJZF8gOj0gMDsKKyAgbGFzdEZpZWxkXyA6PSBUU3RhY2s8SW50ZWdlcj4uQ3JlYXRlOworCisgIEluaXQoIGJvb2xlYW5GaWVsZF8sICcnLCBUVHlwZS5TdG9wLCAwKTsKKyAgYm9vbFZhbHVlXyA6PSB1bnVzZWQ7CitlbmQ7CisKKworZGVzdHJ1Y3RvciBUQ29tcGFjdFByb3RvY29sSW1wbC5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgRnJlZUFuZE5pbCggbGFzdEZpZWxkXyk7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCisKKworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlc2V0OworYmVnaW4KKyAgbGFzdEZpZWxkXy5DbGVhcigpOworICBsYXN0RmllbGRJZF8gOj0gMDsKKyAgSW5pdCggYm9vbGVhbkZpZWxkXywgJycsIFRUeXBlLlN0b3AsIDApOworICBib29sVmFsdWVfIDo9IHVudXNlZDsKK2VuZDsKKworCisvLyBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KKy8vIFVzZWQgaW50ZXJuYWxseSBieSBvdGhlciB3cml0aW5nIG1ldGhvZHMgdGhhdCBrbm93IHRoZXkgbmVlZCB0byBXcml0ZSBhIGJ5dGUuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVCeXRlRGlyZWN0KCBjb25zdCBiIDogQnl0ZSk7CitiZWdpbgorICBUcmFuc3BvcnQuV3JpdGUoIEBiLCBTaXplT2YoYikpOworZW5kOworCisKKy8vIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlQnl0ZURpcmVjdCggY29uc3QgbiA6IEludGVnZXIpOworYmVnaW4KKyAgV3JpdGVCeXRlRGlyZWN0KCBCeXRlKG4pKTsKK2VuZDsKKworCisvLyBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlVmFyaW50MzIoIG4gOiBDYXJkaW5hbCk7Cit2YXIgaTMyYnVmIDogVEJ5dGVzOworICAgIGlkeCA6IEludGVnZXI7CitiZWdpbgorICBTZXRMZW5ndGgoIGkzMmJ1ZiwgNSk7CisgIGlkeCA6PSAwOworICB3aGlsZSBUUlVFIGRvIGJlZ2luCisgICAgQVNTRVJUKCBpZHggPCBMZW5ndGgoaTMyYnVmKSk7CisKKyAgICAvLyBsYXN0IHBhcnQ/CisgICAgaWYgKChuIGFuZCBub3QgJDdGKSA9IDApIHRoZW4gYmVnaW4KKyAgICAgIGkzMmJ1ZltpZHhdIDo9IEJ5dGUobik7CisgICAgICBJbmMoaWR4KTsKKyAgICAgIEJyZWFrOworICAgIGVuZDsKKworICAgIGkzMmJ1ZltpZHhdIDo9IEJ5dGUoKG4gYW5kICQ3Rikgb3IgJDgwKTsKKyAgICBJbmMoaWR4KTsKKyAgICBuIDo9IG4gc2hyIDc7CisgIGVuZDsKKworICBUcmFuc3BvcnQuV3JpdGUoIGkzMmJ1ZiwgMCwgaWR4KTsKK2VuZDsKKworCisvLyBXcml0ZSBhIG1lc3NhZ2UgaGVhZGVyIHRvIHRoZSB3aXJlLiBDb21wYWN0IFByb3RvY29sIG1lc3NhZ2VzIGNvbnRhaW4gdGhlCisvLyBwcm90b2NvbCB2ZXJzaW9uIHNvIHdlIGNhbiBtaWdyYXRlIGZvcndhcmRzIGluIHRoZSBmdXR1cmUgaWYgbmVlZCBiZS4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7Cit2YXIgdmVyc2lvbkFuZFR5cGUgOiBCeXRlOworYmVnaW4KKyAgUmVzZXQ7CisKKyAgdmVyc2lvbkFuZFR5cGUgOj0gQnl0ZSggVkVSU0lPTiBhbmQgVkVSU0lPTl9NQVNLKQorICAgICAgICAgICAgICAgICBvciBCeXRlKCAoQ2FyZGluYWwobXNnLlR5cGVfKSBzaGwgVFlQRV9TSElGVF9BTU9VTlQpIGFuZCBUWVBFX01BU0spOworCisgIFdyaXRlQnl0ZURpcmVjdCggUFJPVE9DT0xfSUQpOworICBXcml0ZUJ5dGVEaXJlY3QoIHZlcnNpb25BbmRUeXBlKTsKKyAgV3JpdGVWYXJpbnQzMiggQ2FyZGluYWwobXNnLlNlcUlEKSk7CisgIFdyaXRlU3RyaW5nKCBtc2cuTmFtZSk7CitlbmQ7CisKKworLy8gV3JpdGUgYSBzdHJ1Y3QgYmVnaW4uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZSBpdCBhcyBhbgorLy8gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGdldCB0aGUKKy8vIGZpZWxkIGlkIGRlbHRhcyBjb3JyZWN0LgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsKK2JlZ2luCisgIGxhc3RGaWVsZF8uUHVzaChsYXN0RmllbGRJZF8pOworICBsYXN0RmllbGRJZF8gOj0gMDsKK2VuZDsKKworCisvLyBXcml0ZSBhIHN0cnVjdCBlbmQuIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZSB0aGlzIGFzIGFuCisvLyBvcHBvcnR1bml0eSB0byBwb3AgdGhlIGxhc3QgZmllbGQgZnJvbSB0aGUgY3VycmVudCBzdHJ1Y3Qgb2ZmIG9mIHRoZSBmaWVsZCBzdGFjay4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZVN0cnVjdEVuZDsKK2JlZ2luCisgIGxhc3RGaWVsZElkXyA6PSBsYXN0RmllbGRfLlBvcCgpOworZW5kOworCisKKy8vIFdyaXRlIGEgZmllbGQgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIGZpZWxkIGlkIGFuZCBmaWVsZCB0eXBlLiBJZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQorLy8gY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICg8IDE1KSwgdGhlbiB0aGUgZmllbGQgaWQgd2lsbCBiZSBlbmNvZGVkIGluCisvLyB0aGUgNCBNU0IgYXMgYSBkZWx0YS4gT3RoZXJ3aXNlLCB0aGUgZmllbGQgaWQgd2lsbCBmb2xsb3cgdGhlIHR5cGUgaGVhZGVyIGFzIGEgemlnemFnIHZhcmludC4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOworYmVnaW4KKyAgY2FzZSBmaWVsZC5UeXBlXyBvZgorICAgIFRUeXBlLkJvb2xfIDogYm9vbGVhbkZpZWxkXyA6PSBmaWVsZDsgLy8gd2Ugd2FudCB0byBwb3NzaWJseSBpbmNsdWRlIHRoZSB2YWx1ZSwgc28gd2UnbGwgd2FpdC4KKyAgZWxzZQorICAgIFdyaXRlRmllbGRCZWdpbkludGVybmFsKGZpZWxkLCAkRkYpOworICBlbmQ7CitlbmQ7CisKKworLy8gVGhlIHdvcmtob3JzZSBvZiBXcml0ZUZpZWxkQmVnaW4uIEl0IGhhcyB0aGUgb3B0aW9uIG9mIGRvaW5nIGEgJ3R5cGUgb3ZlcnJpZGUnCisvLyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlIGJvb2xlYW4gZmllbGQgY2FzZS4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW5JbnRlcm5hbCggY29uc3QgZmllbGQgOiBUVGhyaWZ0RmllbGQ7IHR5cGVPdmVycmlkZSA6IEJ5dGUpOwordmFyIHR5cGVUb1dyaXRlIDogQnl0ZTsKK2JlZ2luCisgIC8vIGlmIHRoZXJlJ3MgYSB0eXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4KKyAgaWYgdHlwZU92ZXJyaWRlID0gJEZGCisgIHRoZW4gdHlwZVRvV3JpdGUgOj0gZ2V0Q29tcGFjdFR5cGUoIGZpZWxkLlR5cGVfKQorICBlbHNlIHR5cGVUb1dyaXRlIDo9IHR5cGVPdmVycmlkZTsKKworICAvLyBjaGVjayBpZiB3ZSBjYW4gdXNlIGRlbHRhIGVuY29kaW5nIGZvciB0aGUgZmllbGQgaWQKKyAgaWYgKGZpZWxkLklEID4gbGFzdEZpZWxkSWRfKSBhbmQgKChmaWVsZC5JRCAtIGxhc3RGaWVsZElkXykgPD0gMTUpCisgIHRoZW4gYmVnaW4KKyAgICAvLyBXcml0ZSB0aGVtIHRvZ2V0aGVyCisgICAgV3JpdGVCeXRlRGlyZWN0KCAoKGZpZWxkLklEIC0gbGFzdEZpZWxkSWRfKSBzaGwgNCkgb3IgdHlwZVRvV3JpdGUpOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIC8vIFdyaXRlIHRoZW0gc2VwYXJhdGUKKyAgICBXcml0ZUJ5dGVEaXJlY3QoIHR5cGVUb1dyaXRlKTsKKyAgICBXcml0ZUkxNiggZmllbGQuSUQpOworICBlbmQ7CisKKyAgbGFzdEZpZWxkSWRfIDo9IGZpZWxkLklEOworZW5kOworCisKKy8vIFdyaXRlIHRoZSBTVE9QIHN5bWJvbCBzbyB3ZSBrbm93IHRoZXJlIGFyZSBubyBtb3JlIGZpZWxkcyBpbiB0aGlzIHN0cnVjdC4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUZpZWxkU3RvcDsKK2JlZ2luCisgIFdyaXRlQnl0ZURpcmVjdCggQnl0ZSggVHlwZXMuU1RPUCkpOworZW5kOworCisKKy8vIFdyaXRlIGEgbWFwIGhlYWRlci4gSWYgdGhlIG1hcCBpcyBlbXB0eSwgb21pdCB0aGUga2V5IGFuZCB2YWx1ZSB0eXBlCisvLyBoZWFkZXJzLCBhcyB3ZSBkb24ndCBuZWVkIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHNraXAgaXQuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsKK3ZhciBrZXksIHZhbCA6IEJ5dGU7CitiZWdpbgorICBpZiAobWFwLkNvdW50ID0gMCkKKyAgdGhlbiBXcml0ZUJ5dGVEaXJlY3QoIDApCisgIGVsc2UgYmVnaW4KKyAgICBXcml0ZVZhcmludDMyKCBDYXJkaW5hbCggbWFwLkNvdW50KSk7CisgICAga2V5IDo9IGdldENvbXBhY3RUeXBlKG1hcC5LZXlUeXBlKTsKKyAgICB2YWwgOj0gZ2V0Q29tcGFjdFR5cGUobWFwLlZhbHVlVHlwZSk7CisgICAgV3JpdGVCeXRlRGlyZWN0KCAoa2V5IHNobCA0KSBvciB2YWwpOworICBlbmQ7CitlbmQ7CisKKworLy8gV3JpdGUgYSBsaXN0IGhlYWRlci4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOworYmVnaW4KKyAgV3JpdGVDb2xsZWN0aW9uQmVnaW4oIGxpc3QuRWxlbWVudFR5cGUsIGxpc3QuQ291bnQpOworZW5kOworCisKKy8vIFdyaXRlIGEgc2V0IGhlYWRlci4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0ICk7CitiZWdpbgorICBXcml0ZUNvbGxlY3Rpb25CZWdpbiggc2V0Xy5FbGVtZW50VHlwZSwgc2V0Xy5Db3VudCk7CitlbmQ7CisKKworLy8gV3JpdGUgYSBib29sZWFuIHZhbHVlLiBQb3RlbnRpYWxseSwgdGhpcyBjb3VsZCBiZSBhIGJvb2xlYW4gZmllbGQsIGluCisvLyB3aGljaCBjYXNlIHRoZSBmaWVsZCBoZWFkZXIgaW5mbyBpc24ndCB3cml0dGVuIHlldC4gSWYgc28sIGRlY2lkZSB3aGF0IHRoZQorLy8gcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiBXcml0ZSB0aGUgZmllbGQgaGVhZGVyLgorLy8gT3RoZXJ3aXNlLCBXcml0ZSBhIHNpbmdsZSBieXRlLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlQm9vbCggYjogQm9vbGVhbik7Cit2YXIgYnQgOiBUeXBlczsKK2JlZ2luCisgIGlmIGIKKyAgdGhlbiBidCA6PSBUeXBlcy5CT09MRUFOX1RSVUUKKyAgZWxzZSBidCA6PSBUeXBlcy5CT09MRUFOX0ZBTFNFOworCisgIGlmIGJvb2xlYW5GaWVsZF8uVHlwZV8gPSBUVHlwZS5Cb29sXyB0aGVuIGJlZ2luCisgICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0CisgICAgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoIGJvb2xlYW5GaWVsZF8sIEJ5dGUoYnQpKTsKKyAgICBib29sZWFuRmllbGRfLlR5cGVfIDo9IFRUeXBlLlN0b3A7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCBXcml0ZSB0aGUgdmFsdWUuCisgICAgV3JpdGVCeXRlRGlyZWN0KCBCeXRlKGJ0KSk7CisgIGVuZDsKK2VuZDsKKworCisvLyBXcml0ZSBhIGJ5dGUuIE5vdGhpbmcgdG8gc2VlIGhlcmUhCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7CitiZWdpbgorICBXcml0ZUJ5dGVEaXJlY3QoIEJ5dGUoYikpOworZW5kOworCisKKy8vIFdyaXRlIGFuIEkxNiBhcyBhIHppZ3phZyB2YXJpbnQuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVJMTYoIGkxNjogU21hbGxJbnQpOworYmVnaW4KKyAgV3JpdGVWYXJpbnQzMiggaW50VG9aaWdaYWcoIGkxNikpOworZW5kOworCisKKy8vIFdyaXRlIGFuIGkzMiBhcyBhIHppZ3phZyB2YXJpbnQuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVJMzIoIGkzMjogSW50ZWdlcik7CitiZWdpbgorICBXcml0ZVZhcmludDMyKCBpbnRUb1ppZ1phZyggaTMyKSk7CitlbmQ7CisKKworLy8gV3JpdGUgYW4gaTY0IGFzIGEgemlnemFnIHZhcmludC4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUk2NCggY29uc3QgaTY0OiBJbnQ2NCk7CitiZWdpbgorICBXcml0ZVZhcmludDY0KCBsb25nVG9aaWd6YWcoIGk2NCkpOworZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLkRvdWJsZVRvSW50NjRCaXRzKCBjb25zdCBkYiA6IERvdWJsZSkgOiBJbnQ2NDsKK2JlZ2luCisgIEFTU0VSVCggU2l6ZU9mKGRiKSA9IFNpemVPZihyZXN1bHQpKTsKKyAgTW92ZSggZGIsIHJlc3VsdCwgU2l6ZU9mKHJlc3VsdCkpOworZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLkludDY0Qml0c1RvRG91YmxlKCBjb25zdCBpNjQgOiBJbnQ2NCkgOiBEb3VibGU7CitiZWdpbgorICBBU1NFUlQoIFNpemVPZihpNjQpID0gU2l6ZU9mKHJlc3VsdCkpOworICBNb3ZlKCBpNjQsIHJlc3VsdCwgU2l6ZU9mKHJlc3VsdCkpOworZW5kOworCisKKy8vIFdyaXRlIGEgZG91YmxlIHRvIHRoZSB3aXJlIGFzIDggYnl0ZXMuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVEb3VibGUoIGNvbnN0IGR1YjogRG91YmxlKTsKK3ZhciBkYXRhIDogVEJ5dGVzOworYmVnaW4KKyAgZml4ZWRMb25nVG9CeXRlcyggRG91YmxlVG9JbnQ2NEJpdHMoZHViKSwgZGF0YSk7CisgIFRyYW5zcG9ydC5Xcml0ZSggZGF0YSk7CitlbmQ7CisKKworLy8gV3JpdGUgYSBieXRlIGFycmF5LCB1c2luZyBhIHZhcmludCBmb3IgdGhlIHNpemUuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7CitiZWdpbgorICBXcml0ZVZhcmludDMyKCBDYXJkaW5hbChMZW5ndGgoYikpKTsKKyAgVHJhbnNwb3J0LldyaXRlKCBiKTsKK2VuZDsKKworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlTWVzc2FnZUVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVNYXBFbmQ7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKKworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlTGlzdEVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVTZXRFbmQ7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKKworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlRmllbGRFbmQ7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKKworLy8gQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorLy8gdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIHR5cGUgaW5kaWNhdG9yLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlQ29sbGVjdGlvbkJlZ2luKCBjb25zdCBlbGVtVHlwZSA6IFRUeXBlOyBzaXplIDogSW50ZWdlcik7CitiZWdpbgorICBpZiBzaXplIDw9IDE0CisgIHRoZW4gV3JpdGVCeXRlRGlyZWN0KCAoc2l6ZSBzaGwgNCkgb3IgZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKQorICBlbHNlIGJlZ2luCisgICAgV3JpdGVCeXRlRGlyZWN0KCAkRjAgb3IgZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgICBXcml0ZVZhcmludDMyKCBDYXJkaW5hbChzaXplKSk7CisgIGVuZDsKK2VuZDsKKworCisvLyBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZVZhcmludDY0KCBuIDogVUludDY0KTsKK3ZhciB2YXJpbnQ2NG91dCA6IFRCeXRlczsKKyAgICBpZHggOiBJbnRlZ2VyOworYmVnaW4KKyAgU2V0TGVuZ3RoKCB2YXJpbnQ2NG91dCwgMTApOworICBpZHggOj0gMDsKKyAgd2hpbGUgVFJVRSBkbyBiZWdpbgorICAgIEFTU0VSVCggaWR4IDwgTGVuZ3RoKHZhcmludDY0b3V0KSk7CisKKyAgICAvLyBsYXN0IG9uZT8KKyAgICBpZiAobiBhbmQgbm90IFVJbnQ2NCgkN0YpKSA9IDAgdGhlbiBiZWdpbgorICAgICAgdmFyaW50NjRvdXRbaWR4XSA6PSBCeXRlKG4pOworICAgICAgSW5jKGlkeCk7CisgICAgICBCcmVhazsKKyAgICBlbmQ7CisKKyAgICB2YXJpbnQ2NG91dFtpZHhdIDo9IEJ5dGUoKG4gYW5kICQ3Rikgb3IgJDgwKTsKKyAgICBJbmMoaWR4KTsKKyAgICBuIDo9IG4gc2hyIDc7CisgIGVuZDsKKworICBUcmFuc3BvcnQuV3JpdGUoIHZhcmludDY0b3V0LCAwLCBpZHgpOworZW5kOworCisKKy8vIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIEludDY0LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisvLyByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCitjbGFzcyBmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5sb25nVG9aaWd6YWcoIGNvbnN0IG4gOiBJbnQ2NCkgOiBVSW50NjQ7CitiZWdpbgorICAvLyB0aGVyZSBpcyBubyBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0IGluIERlbHBoaQorICBpZiBuID49IDAKKyAgdGhlbiByZXN1bHQgOj0gVUludDY0KG4gc2hsIDEpCisgIGVsc2UgcmVzdWx0IDo9IFVJbnQ2NChuIHNobCAxKSB4b3IgJEZGRkZGRkZGRkZGRkZGRkY7CitlbmQ7CisKKworLy8gQ29udmVydCBuIGludG8gYSB6aWd6YWcgSW50ZWdlci4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorLy8gcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorY2xhc3MgZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuaW50VG9aaWdaYWcoIGNvbnN0IG4gOiBJbnRlZ2VyKSA6IENhcmRpbmFsOworYmVnaW4KKyAgLy8gdGhlcmUgaXMgbm8gYXJpdGhtZXRpYyByaWdodCBzaGlmdCBpbiBEZWxwaGkKKyAgaWYgbiA+PSAwCisgIHRoZW4gcmVzdWx0IDo9IENhcmRpbmFsKG4gc2hsIDEpCisgIGVsc2UgcmVzdWx0IDo9IENhcmRpbmFsKG4gc2hsIDEpIHhvciAkRkZGRkZGRkY7CitlbmQ7CisKKworLy8gQ29udmVydCBhIEludDY0IGludG8gOCBsaXR0bGUtZW5kaWFuIGJ5dGVzIGluIGJ1ZgorY2xhc3MgcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLmZpeGVkTG9uZ1RvQnl0ZXMoIGNvbnN0IG4gOiBJbnQ2NDsgdmFyIGJ1ZiA6IFRCeXRlcyk7CitiZWdpbgorICBTZXRMZW5ndGgoIGJ1ZiwgOCk7CisgIGJ1ZlswXSA6PSBCeXRlKCBuICAgICAgICAgYW5kICRGRik7CisgIGJ1ZlsxXSA6PSBCeXRlKChuIHNociA4KSAgYW5kICRGRik7CisgIGJ1ZlsyXSA6PSBCeXRlKChuIHNociAxNikgYW5kICRGRik7CisgIGJ1ZlszXSA6PSBCeXRlKChuIHNociAyNCkgYW5kICRGRik7CisgIGJ1Zls0XSA6PSBCeXRlKChuIHNociAzMikgYW5kICRGRik7CisgIGJ1Zls1XSA6PSBCeXRlKChuIHNociA0MCkgYW5kICRGRik7CisgIGJ1Zls2XSA6PSBCeXRlKChuIHNociA0OCkgYW5kICRGRik7CisgIGJ1Zls3XSA6PSBCeXRlKChuIHNociA1NikgYW5kICRGRik7CitlbmQ7CisKKworCisvLyBSZWFkIGEgbWVzc2FnZSBoZWFkZXIuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTWVzc2FnZUJlZ2luIDogVFRocmlmdE1lc3NhZ2U7Cit2YXIgcHJvdG9jb2xJZCwgdmVyc2lvbkFuZFR5cGUsIHZlcnNpb24sIHR5cGVfIDogQnl0ZTsKKyAgICBzZXFpZCA6IEludGVnZXI7CisgICAgbXNnTm0gOiBTdHJpbmc7CitiZWdpbgorICBSZXNldDsKKworICBwcm90b2NvbElkIDo9IEJ5dGUoIFJlYWRCeXRlKTsKKyAgaWYgKHByb3RvY29sSWQgPD4gUFJPVE9DT0xfSUQpCisgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uQmFkVmVyc2lvbi5DcmVhdGUoICdFeHBlY3RlZCBwcm90b2NvbCBpZCAnICsgSW50VG9IZXgoUFJPVE9DT0xfSUQsMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyBidXQgZ290ICcgKyBJbnRUb0hleChwcm90b2NvbElkLDIpKTsKKworICB2ZXJzaW9uQW5kVHlwZSA6PSBCeXRlKCBSZWFkQnl0ZSk7CisgIHZlcnNpb24gICAgICAgIDo9IEJ5dGUoIHZlcnNpb25BbmRUeXBlIGFuZCBWRVJTSU9OX01BU0spOworICBpZiAodmVyc2lvbiA8PiBWRVJTSU9OKQorICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkJhZFZlcnNpb24uQ3JlYXRlKCAnRXhwZWN0ZWQgdmVyc2lvbiAnICtJbnRUb1N0cihWRVJTSU9OKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnIGJ1dCBnb3QgJyArIEludFRvU3RyKHZlcnNpb24pKTsKKworICB0eXBlXyA6PSBCeXRlKCAodmVyc2lvbkFuZFR5cGUgc2hyIFRZUEVfU0hJRlRfQU1PVU5UKSBhbmQgVFlQRV9CSVRTKTsKKyAgc2VxaWQgOj0gSW50ZWdlciggUmVhZFZhcmludDMyKTsKKyAgbXNnTm0gOj0gUmVhZFN0cmluZzsKKyAgSW5pdCggcmVzdWx0LCBtc2dObSwgVE1lc3NhZ2VUeXBlKHR5cGVfKSwgc2VxaWQpOworZW5kOworCisKKy8vIFJlYWQgYSBzdHJ1Y3QgYmVnaW4uIFRoZXJlJ3Mgbm90aGluZyBvbiB0aGUgd2lyZSBmb3IgdGhpcywgYnV0IGl0IGlzIG91cgorLy8gb3Bwb3J0dW5pdHkgdG8gcHVzaCBhIG5ldyBzdHJ1Y3QgYmVnaW4gbWFya2VyIG9udG8gdGhlIGZpZWxkIHN0YWNrLgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OworYmVnaW4KKyAgbGFzdEZpZWxkXy5QdXNoKCBsYXN0RmllbGRJZF8pOworICBsYXN0RmllbGRJZF8gOj0gMDsKKyAgSW5pdCggcmVzdWx0KTsKK2VuZDsKKworCisvLyBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvcgorLy8gdGhpcyBzdHJ1Y3QgZnJvbSB0aGUgZmllbGQgc3RhY2suCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFN0cnVjdEVuZDsKK2JlZ2luCisgIC8vIGNvbnN1bWUgdGhlIGxhc3QgZmllbGQgd2UgUmVhZCBvZmYgdGhlIHdpcmUuCisgIGxhc3RGaWVsZElkXyA6PSBsYXN0RmllbGRfLlBvcCgpOworZW5kOworCisKKy8vIFJlYWQgYSBmaWVsZCBoZWFkZXIgb2ZmIHRoZSB3aXJlLgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsKK3ZhciB0eXBlXyA6IEJ5dGU7CisgICAgZmllbGRJZCwgbW9kaWZpZXIgOiBTaG9ydEludDsKK2JlZ2luCisgIHR5cGVfIDo9IEJ5dGUoIFJlYWRCeXRlKTsKKworICAvLyBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIuCisgIGlmIHR5cGVfID0gQnl0ZShUeXBlcy5TVE9QKSB0aGVuIGJlZ2luCisgICAgSW5pdCggcmVzdWx0LCAnJywgVFR5cGUuU3RvcCwgMCk7CisgICAgRXhpdDsKKyAgZW5kOworCisgIC8vIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KKyAgbW9kaWZpZXIgOj0gU2hvcnRJbnQoICh0eXBlXyBhbmQgJEYwKSBzaHIgNCk7CisgIGlmIChtb2RpZmllciA9IDApCisgIHRoZW4gZmllbGRJZCA6PSBSZWFkSTE2ICAgIC8vIG5vdCBhIGRlbHRhLiBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZC4KKyAgZWxzZSBmaWVsZElkIDo9IFNob3J0SW50KCBsYXN0RmllbGRJZF8gKyBtb2RpZmllcik7IC8vIGFkZCB0aGUgZGVsdGEgdG8gdGhlIGxhc3QgUmVhZCBmaWVsZCBpZC4KKworICBJbml0KCByZXN1bHQsICcnLCBnZXRUVHlwZShCeXRlKHR5cGVfIGFuZCAkMEYpKSwgZmllbGRJZCk7CisKKyAgLy8gaWYgdGhpcyBoYXBwZW5zIHRvIGJlIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIGlzIGVuY29kZWQgaW4gdGhlIHR5cGUKKyAgIC8vIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlLgorICBpZiBpc0Jvb2xUeXBlKHR5cGVfKSB0aGVuIGJlZ2luCisgICAgaWYgQnl0ZSh0eXBlXyBhbmQgJDBGKSA9IEJ5dGUoVHlwZXMuQk9PTEVBTl9UUlVFKQorICAgIHRoZW4gYm9vbFZhbHVlXyA6PSBib29sX3RydWUKKyAgICBlbHNlIGJvb2xWYWx1ZV8gOj0gYm9vbF9mYWxzZTsKKyAgZW5kOworCisgIC8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLgorICBsYXN0RmllbGRJZF8gOj0gcmVzdWx0LklEOworZW5kOworCisKKy8vIFJlYWQgYSBtYXAgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNpemUgaXMgemVybywgc2tpcCBSZWFkaW5nIHRoZSBrZXkKKy8vIGFuZCB2YWx1ZSB0eXBlLiBUaGlzIG1lYW5zIHRoYXQgMC1sZW5ndGggbWFwcyB3aWxsIHlpZWxkIFRNYXBzIHdpdGhvdXQgdGhlCisvLyAiY29ycmVjdCIgdHlwZXMuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7Cit2YXIgc2l6ZSA6IEludGVnZXI7CisgICAga2V5QW5kVmFsdWVUeXBlIDogQnl0ZTsKKyAgICBrZXksIHZhbCA6IFRUeXBlOworYmVnaW4KKyAgc2l6ZSA6PSBJbnRlZ2VyKCBSZWFkVmFyaW50MzIpOworICBpZiBzaXplID0gMAorICB0aGVuIGtleUFuZFZhbHVlVHlwZSA6PSAwCisgIGVsc2Uga2V5QW5kVmFsdWVUeXBlIDo9IEJ5dGUoIFJlYWRCeXRlKTsKKworICBrZXkgOj0gZ2V0VFR5cGUoIEJ5dGUoIGtleUFuZFZhbHVlVHlwZSBzaHIgNCkpOworICB2YWwgOj0gZ2V0VFR5cGUoIEJ5dGUoIGtleUFuZFZhbHVlVHlwZSBhbmQgJEYpKTsKKyAgSW5pdCggcmVzdWx0LCBrZXksIHZhbCwgc2l6ZSk7CisgIEFTU0VSVCggKHJlc3VsdC5LZXlUeXBlID0ga2V5KSBhbmQgKHJlc3VsdC5WYWx1ZVR5cGUgPSB2YWwpKTsKK2VuZDsKKworCisvLyBSZWFkIGEgbGlzdCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgbGlzdCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKKy8vIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIGxpc3QsIHRoZSA0IE1TQgorLy8gb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAkRiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisvLyB0cnVlIHNpemUuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsKK3ZhciBzaXplX2FuZF90eXBlIDogQnl0ZTsKKyAgICBzaXplIDogSW50ZWdlcjsKKyAgICB0eXBlXyA6IFRUeXBlOworYmVnaW4KKyAgc2l6ZV9hbmRfdHlwZSA6PSBCeXRlKCBSZWFkQnl0ZSk7CisKKyAgc2l6ZSA6PSAoc2l6ZV9hbmRfdHlwZSBzaHIgNCkgYW5kICQwRjsKKyAgaWYgKHNpemUgPSAxNSkKKyAgdGhlbiBzaXplIDo9IEludGVnZXIoIFJlYWRWYXJpbnQzMik7CisKKyAgdHlwZV8gOj0gZ2V0VFR5cGUoIHNpemVfYW5kX3R5cGUpOworICBJbml0KCByZXN1bHQsIHR5cGVfLCBzaXplKTsKK2VuZDsKKworCisvLyBSZWFkIGEgc2V0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzZXQgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisvLyBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBzZXQsIHRoZSA0IE1TQgorLy8gb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAkRiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisvLyB0cnVlIHNpemUuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7Cit2YXIgc2l6ZV9hbmRfdHlwZSA6IEJ5dGU7CisgICAgc2l6ZSA6IEludGVnZXI7CisgICAgdHlwZV8gOiBUVHlwZTsKK2JlZ2luCisgIHNpemVfYW5kX3R5cGUgOj0gQnl0ZSggUmVhZEJ5dGUpOworCisgIHNpemUgOj0gKHNpemVfYW5kX3R5cGUgc2hyIDQpIGFuZCAkMEY7CisgIGlmIChzaXplID0gMTUpCisgIHRoZW4gc2l6ZSA6PSBJbnRlZ2VyKCBSZWFkVmFyaW50MzIpOworCisgIHR5cGVfIDo9IGdldFRUeXBlKCBzaXplX2FuZF90eXBlKTsKKyAgSW5pdCggcmVzdWx0LCB0eXBlXywgc2l6ZSk7CitlbmQ7CisKKworLy8gUmVhZCBhIGJvb2xlYW4gb2ZmIHRoZSB3aXJlLiBJZiB0aGlzIGlzIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIHNob3VsZAorLy8gYWxyZWFkeSBoYXZlIGJlZW4gUmVhZCBkdXJpbmcgUmVhZEZpZWxkQmVnaW4sIHNvIHdlJ2xsIGp1c3QgY29uc3VtZSB0aGUKKy8vIHByZS1zdG9yZWQgdmFsdWUuIE90aGVyd2lzZSwgUmVhZCBhIGJ5dGUuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkQm9vbDogQm9vbGVhbjsKK2JlZ2luCisgIGlmIGJvb2xWYWx1ZV8gPD4gdW51c2VkIHRoZW4gYmVnaW4KKyAgICByZXN1bHQgOj0gKGJvb2xWYWx1ZV8gPSBib29sX3RydWUpOworICAgIGJvb2xWYWx1ZV8gOj0gdW51c2VkOworICAgIEV4aXQ7CisgIGVuZDsKKworICByZXN1bHQgOj0gKEJ5dGUoUmVhZEJ5dGUpID0gQnl0ZShUeXBlcy5CT09MRUFOX1RSVUUpKTsKK2VuZDsKKworCisvLyBSZWFkIGEgc2luZ2xlIGJ5dGUgb2ZmIHRoZSB3aXJlLiBOb3RoaW5nIGludGVyZXN0aW5nIGhlcmUuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkQnl0ZTogU2hvcnRJbnQ7CitiZWdpbgorICBUcmFuc3BvcnQuUmVhZEFsbCggQHJlc3VsdCwgU2l6ZU9mKHJlc3VsdCksIDAsIDEpOworZW5kOworCisKKy8vIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZEkxNjogU21hbGxJbnQ7CitiZWdpbgorICByZXN1bHQgOj0gU21hbGxJbnQoIHppZ3phZ1RvSW50KCBSZWFkVmFyaW50MzIpKTsKK2VuZDsKKworCisvLyBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRJMzI6IEludGVnZXI7CitiZWdpbgorICByZXN1bHQgOj0gemlnemFnVG9JbnQoIFJlYWRWYXJpbnQzMik7CitlbmQ7CisKKworLy8gUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkSTY0OiBJbnQ2NDsKK2JlZ2luCisgIHJlc3VsdCA6PSB6aWd6YWdUb0xvbmcoIFJlYWRWYXJpbnQ2NCk7CitlbmQ7CisKKworLy8gTm8gbWFnaWMgaGVyZSAtIGp1c3QgUmVhZCBhIGRvdWJsZSBvZmYgdGhlIHdpcmUuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkRG91YmxlOkRvdWJsZTsKK3ZhciBsb25nQml0cyA6IFRCeXRlczsKK2JlZ2luCisgIFNldExlbmd0aCggbG9uZ0JpdHMsIDgpOworICBUcmFuc3BvcnQuUmVhZEFsbCggbG9uZ0JpdHMsIDAsIDgpOworICByZXN1bHQgOj0gSW50NjRCaXRzVG9Eb3VibGUoIGJ5dGVzVG9Mb25nKCBsb25nQml0cykpOworZW5kOworCisKKy8vIFJlYWQgYSBieXRlW10gZnJvbSB0aGUgd2lyZS4KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRCaW5hcnk6IFRCeXRlczsKK3ZhciBsZW5ndGggOiBJbnRlZ2VyOworYmVnaW4KKyAgbGVuZ3RoIDo9IEludGVnZXIoIFJlYWRWYXJpbnQzMik7CisgIFNldExlbmd0aCggcmVzdWx0LCBsZW5ndGgpOworICBpZiAobGVuZ3RoID4gMCkKKyAgdGhlbiBUcmFuc3BvcnQuUmVhZEFsbCggcmVzdWx0LCAwLCBsZW5ndGgpOworZW5kOworCisKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTWVzc2FnZUVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZEZpZWxkRW5kOworYmVnaW4KKyAgLy8gbm90aGluZyB0byBkbworZW5kOworCisKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTWFwRW5kOworYmVnaW4KKyAgLy8gbm90aGluZyB0byBkbworZW5kOworCisKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTGlzdEVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFNldEVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCisKKy8vIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byA1IGJ5dGVzLgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFZhcmludDMyIDogQ2FyZGluYWw7Cit2YXIgc2hpZnQgOiBJbnRlZ2VyOworICAgIGIgOiBCeXRlOworYmVnaW4KKyAgcmVzdWx0IDo9IDA7CisgIHNoaWZ0ICA6PSAwOworICB3aGlsZSBUUlVFIGRvIGJlZ2luCisgICAgYiA6PSBCeXRlKCBSZWFkQnl0ZSk7CisgICAgcmVzdWx0IDo9IHJlc3VsdCBvciAoQ2FyZGluYWwoYiBhbmQgJDdGKSBzaGwgc2hpZnQpOworICAgIGlmICgoYiBhbmQgJDgwKSA8PiAkODApCisgICAgdGhlbiBCcmVhazsKKyAgICBJbmMoIHNoaWZ0LCA3KTsKKyAgZW5kOworZW5kOworCisKKy8vIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSBwcm9wZXIgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKy8vIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIFJlYWQgdXAgdG8gMTAgYnl0ZXMuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkVmFyaW50NjQgOiBVSW50NjQ7Cit2YXIgc2hpZnQgOiBJbnRlZ2VyOworICAgIGIgOiBCeXRlOworYmVnaW4KKyAgcmVzdWx0IDo9IDA7CisgIHNoaWZ0ICA6PSAwOworICB3aGlsZSBUUlVFIGRvIGJlZ2luCisgICAgYiA6PSBCeXRlKCBSZWFkQnl0ZSk7CisgICAgcmVzdWx0IDo9IHJlc3VsdCBvciAoVUludDY0KGIgYW5kICQ3Rikgc2hsIHNoaWZ0KTsKKyAgICBpZiAoKGIgYW5kICQ4MCkgPD4gJDgwKQorICAgIHRoZW4gQnJlYWs7CisgICAgSW5jKCBzaGlmdCwgNyk7CisgIGVuZDsKK2VuZDsKKworCisvLyBDb252ZXJ0IGZyb20gemlnemFnIEludGVnZXIgdG8gSW50ZWdlci4KK2NsYXNzIGZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KCBjb25zdCBuIDogQ2FyZGluYWwgKSA6IEludGVnZXI7CitiZWdpbgorICByZXN1bHQgOj0gSW50ZWdlcihuIHNociAxKSB4b3IgKC1JbnRlZ2VyKG4gYW5kIDEpKTsKK2VuZDsKKworCisvLyBDb252ZXJ0IGZyb20gemlnemFnIEludDY0IHRvIEludDY0LgorY2xhc3MgZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuemlnemFnVG9Mb25nKCBjb25zdCBuIDogVUludDY0KSA6IEludDY0OworYmVnaW4KKyAgcmVzdWx0IDo9IEludDY0KG4gc2hyIDEpIHhvciAoLUludDY0KG4gYW5kIDEpKTsKK2VuZDsKKworCisvLyBOb3RlIHRoYXQgaXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgbWFzayBieXRlcyBhcmUgSW50NjQgbGl0ZXJhbHMsCisvLyBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBJbnRlZ2VyIGxlZnQgNTYgYml0cywKKy8vIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBJbnRlZ2VyLgorY2xhc3MgZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuYnl0ZXNUb0xvbmcoIGNvbnN0IGJ5dGVzIDogVEJ5dGVzKSA6IEludDY0OworYmVnaW4KKyAgQVNTRVJUKCBMZW5ndGgoYnl0ZXMpID49IDgpOworICByZXN1bHQgOj0gKEludDY0KGJ5dGVzWzddIGFuZCAkRkYpIHNobCA1Nikgb3IKKyAgICAgICAgICAgIChJbnQ2NChieXRlc1s2XSBhbmQgJEZGKSBzaGwgNDgpIG9yCisgICAgICAgICAgICAoSW50NjQoYnl0ZXNbNV0gYW5kICRGRikgc2hsIDQwKSBvcgorICAgICAgICAgICAgKEludDY0KGJ5dGVzWzRdIGFuZCAkRkYpIHNobCAzMikgb3IKKyAgICAgICAgICAgIChJbnQ2NChieXRlc1szXSBhbmQgJEZGKSBzaGwgMjQpIG9yCisgICAgICAgICAgICAoSW50NjQoYnl0ZXNbMl0gYW5kICRGRikgc2hsIDE2KSBvcgorICAgICAgICAgICAgKEludDY0KGJ5dGVzWzFdIGFuZCAkRkYpIHNobCAgOCkgb3IKKyAgICAgICAgICAgIChJbnQ2NChieXRlc1swXSBhbmQgJEZGKSk7CitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuaXNCb29sVHlwZSggY29uc3QgYiA6IGJ5dGUpIDogQm9vbGVhbjsKK3ZhciBsb3dlck5pYmJsZSA6IEJ5dGU7CitiZWdpbgorICBsb3dlck5pYmJsZSA6PSBiIGFuZCAkMGY7CisgIHJlc3VsdCA6PSAoVHlwZXMobG93ZXJOaWJibGUpIGluIFtUeXBlcy5CT09MRUFOX1RSVUUsIFR5cGVzLkJPT0xFQU5fRkFMU0VdKTsKK2VuZDsKKworCisvLyBHaXZlbiBhIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQsIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgVFR5cGUgdmFsdWUuCitjbGFzcyBmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5nZXRUVHlwZSggY29uc3QgdHlwZV8gOiBieXRlKSA6IFRUeXBlOwordmFyIHRjdCA6IFR5cGVzOworYmVnaW4KKyAgdGN0IDo9IFR5cGVzKCB0eXBlXyBhbmQgJDBGKTsKKyAgaWYgdGN0IGluIFtMb3coVHlwZXMpLi5IaWdoKFR5cGVzKV0KKyAgdGhlbiByZXN1bHQgOj0gdGNvbXBhY3RUeXBlVG9UeXBlW3RjdF0KKyAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ2RvbicndCBrbm93IHdoYXQgdHlwZTogJytJbnRUb1N0cihPcmQodGN0KSkpOworZW5kOworCisKKy8vIEdpdmVuIGEgVFR5cGUgdmFsdWUsIGZpbmQgdGhlIGFwcHJvcHJpYXRlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQuCitjbGFzcyBmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5nZXRDb21wYWN0VHlwZSggY29uc3QgdHR5cGUgOiBUVHlwZSkgOiBCeXRlOworYmVnaW4KKyAgaWYgdHR5cGUgaW4gVkFMSURfVFRZUEVTCisgIHRoZW4gcmVzdWx0IDo9IEJ5dGUoIHR0eXBlVG9Db21wYWN0VHlwZVt0dHlwZV0pCisgIGVsc2UgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdkb24nJ3Qga25vdyB3aGF0IHR5cGU6ICcrSW50VG9TdHIoT3JkKHR0eXBlKSkpOworZW5kOworCisKKy8vLS0tIHVuaXQgdGVzdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit7JElGREVGIERlYnVnfQorcHJvY2VkdXJlIFRlc3REb3VibGVUb0ludDY0Qml0czsKKworICBwcm9jZWR1cmUgVGVzdFBhaXIoIGNvbnN0IGEgOiBEb3VibGU7IGNvbnN0IGIgOiBJbnQ2NCk7CisgIGJlZ2luCisgICAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC5Eb3VibGVUb0ludDY0Qml0cyhhKSA9IGIpOworICAgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuSW50NjRCaXRzVG9Eb3VibGUoYikgPSBhKTsKKyAgZW5kOworCitiZWdpbgorICBUZXN0UGFpciggMS4wMDAwMDAwMDAwMDAwMDAwRSswMDAsICBJbnQ2NCgkM0ZGMDAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggMS41MDAwMDAwMDAwMDAwMDAwRSswMDEsICBJbnQ2NCgkNDAyRTAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggMi41NTAwMDAwMDAwMDAwMDAwRSswMDIsICBJbnQ2NCgkNDA2RkUwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggNC4yOTQ5NjcyOTUwMDAwMDAwRSswMDksICBJbnQ2NCgkNDFFRkZGRkZGRkUwMDAwMCkpOworICBUZXN0UGFpciggMy45MDYyNTAwMDAwMDAwMDAwRS0wMDMsICBJbnQ2NCgkM0Y3MDAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggMi4zMjgzMDY0MzY1Mzg2OTYzRS0wMTAsICBJbnQ2NCgkM0RGMDAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjMwMDAwRS0zMDAsICBJbnQ2NCgkMDFBQTc0RkUxQzFFN0U0NSkpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTAwRS0xNTAsICBJbnQ2NCgkMjBEMDJBMzY1ODZEQjRCQikpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY1RSswMDAsICBJbnQ2NCgkM0ZGM0MwQ0E0MjhDNTlGQSkpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY3RSswMDAsICBJbnQ2NCgkM0ZGM0MwQ0E0MjhDNTlGQikpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY5RSswMDAsICBJbnQ2NCgkM0ZGM0MwQ0E0MjhDNTlGQykpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY5RSsxNTAsICBJbnQ2NCgkNUYxODIzNDRDRDNDREY5RikpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY5RSszMDAsICBJbnQ2NCgkN0UzRDdFRThCQ0JCRDM1MikpOworICBUZXN0UGFpciggLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCBJbnQ2NCgkRkZFRkZGRkZGRkZGRkZGRikpOworICBUZXN0UGFpciggMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsICBJbnQ2NCgkN0ZFRkZGRkZGRkZGRkZGRikpOworICBUZXN0UGFpciggNC45NDA2NTY0NTg0MTI0NjU0RS0zMjQsICBJbnQ2NCgkMDAwMDAwMDAwMDAwMDAwMSkpOworICBUZXN0UGFpciggMC4wMDAwMDAwMDAwMDAwMDAwRSswMDAsICBJbnQ2NCgkMDAwMDAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggNC45NDA2NTY0NTg0MTI0N0UtMzI0LCAgICBJbnQ2NCgkMDAwMDAwMDAwMDAwMDAwMSkpOworICBUZXN0UGFpciggMy4yMzc4NTkyMTAwMjA2MDkyRS0zMTksICBJbnQ2NCgkMDAwMDAwMDAwMDAwRkZGRikpOworICBUZXN0UGFpciggMS4zOTA2NzExNjE1NjY5OTU5RS0zMDksICBJbnQ2NCgkMDAwMEZGRkZGRkZGRkZGRikpOworICBUZXN0UGFpciggTmVnSW5maW5pdHksICAgICAgICAgICAgICBJbnQ2NCgkRkZGMDAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggSW5maW5pdHksICAgICAgICAgICAgICAgICBJbnQ2NCgkN0ZGMDAwMDAwMDAwMDAwMCkpOworCisgIC8vIE5hTiBpcyBzcGVjaWFsCisgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuRG91YmxlVG9JbnQ2NEJpdHMoIE5hTikgPSBJbnQ2NCgkRkZGODAwMDAwMDAwMDAwMCkpOworICBBU1NFUlQoIElzTmFuKCBUQ29tcGFjdFByb3RvY29sSW1wbC5JbnQ2NEJpdHNUb0RvdWJsZSggSW50NjQoJEZGRjgwMDAwMDAwMDAwMDApKSkpOworZW5kOworeyRFTkRJRn0KKworCit7JElGREVGIERlYnVnfQorcHJvY2VkdXJlIFRlc3RaaWdaYWc7CisKKyAgcHJvY2VkdXJlIFRlc3QzMiggY29uc3QgdGVzdCA6IEludGVnZXIpOworICB2YXIgenogOiBDYXJkaW5hbDsKKyAgYmVnaW4KKyAgICB6eiA6PSBUQ29tcGFjdFByb3RvY29sSW1wbC5pbnRUb1ppZ1phZyh0ZXN0KTsKKyAgICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KHp6KSA9IHRlc3QsIEludFRvU3RyKHRlc3QpKTsKKyAgZW5kOworCisgIHByb2NlZHVyZSBUZXN0NjQoIGNvbnN0IHRlc3QgOiBJbnQ2NCk7CisgIHZhciB6eiA6IFVJbnQ2NDsKKyAgYmVnaW4KKyAgICB6eiA6PSBUQ29tcGFjdFByb3RvY29sSW1wbC5sb25nVG9aaWd6YWcodGVzdCk7CisgICAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC56aWd6YWdUb0xvbmcoenopID0gdGVzdCwgSW50VG9TdHIodGVzdCkpOworICBlbmQ7CisKK3ZhciBpIDogSW50ZWdlcjsKK2JlZ2luCisgIC8vIHByb3RvYnVmIHRlc3RjYXNlcworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLmludFRvWmlnWmFnKDApICA9IDAsICdwYiAjMSB0byBaaWdaYWcnKTsKKyAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC5pbnRUb1ppZ1phZygtMSkgPSAxLCAncGIgIzIgdG8gWmlnWmFnJyk7CisgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuaW50VG9aaWdaYWcoMSkgID0gMiwgJ3BiICMzIHRvIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLmludFRvWmlnWmFnKC0yKSA9IDMsICdwYiAjNCB0byBaaWdaYWcnKTsKKyAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC5pbnRUb1ppZ1phZygrMjE0NzQ4MzY0NykgPSA0Mjk0OTY3Mjk0LCAncGIgIzUgdG8gWmlnWmFnJyk7CisgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuaW50VG9aaWdaYWcoLTIxNDc0ODM2NDgpID0gNDI5NDk2NzI5NSwgJ3BiICM2IHRvIFppZ1phZycpOworCisgIC8vIHByb3RvYnVmIHRlc3RjYXNlcworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDApICA9IDAsICdwYiAjMSBmcm9tIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDEpID0gLTEsICdwYiAjMiBmcm9tIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDIpICA9IDEsICdwYiAjMyBmcm9tIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDMpID0gLTIsICdwYiAjNCBmcm9tIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDQyOTQ5NjcyOTQpID0gKzIxNDc0ODM2NDcsICdwYiAjNSBmcm9tIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDQyOTQ5NjcyOTUpID0gLTIxNDc0ODM2NDgsICdwYiAjNiBmcm9tIFppZ1phZycpOworCisgIC8vIGJhY2sgYW5kIGZvcnRoIDMyCisgIFRlc3QzMiggMCk7CisgIGZvciBpIDo9IDAgdG8gMzAgZG8gYmVnaW4KKyAgICBUZXN0MzIoICsoSW50ZWdlcigxKSBzaGwgaSkpOworICAgIFRlc3QzMiggLShJbnRlZ2VyKDEpIHNobCBpKSk7CisgIGVuZDsKKyAgVGVzdDMyKCBJbnRlZ2VyKCQ3RkZGRkZGRikpOworICBUZXN0MzIoIEludGVnZXIoJDgwMDAwMDAwKSk7CisKKyAgLy8gYmFjayBhbmQgZm9ydGggNjQKKyAgVGVzdDY0KCAwKTsKKyAgZm9yIGkgOj0gMCB0byA2MiBkbyBiZWdpbgorICAgIFRlc3Q2NCggKyhJbnQ2NCgxKSBzaGwgaSkpOworICAgIFRlc3Q2NCggLShJbnQ2NCgxKSBzaGwgaSkpOworICBlbmQ7CisgIFRlc3Q2NCggSW50NjQoJDdGRkZGRkZGRkZGRkZGRkYpKTsKKyAgVGVzdDY0KCBJbnQ2NCgkODAwMDAwMDAwMDAwMDAwMCkpOworZW5kOworeyRFTkRJRn0KKworCit7JElGREVGIERlYnVnfQorcHJvY2VkdXJlIFRlc3RMb25nQnl0ZXM7CisKKyAgcHJvY2VkdXJlIFRlc3QoIGNvbnN0IHRlc3QgOiBJbnQ2NCk7CisgIHZhciBidWYgOiBUQnl0ZXM7CisgIGJlZ2luCisgICAgVENvbXBhY3RQcm90b2NvbEltcGwuZml4ZWRMb25nVG9CeXRlcyggdGVzdCwgYnVmKTsKKyAgICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLmJ5dGVzVG9Mb25nKCBidWYpID0gdGVzdCwgSW50VG9TdHIodGVzdCkpOworICBlbmQ7CisKK3ZhciBpIDogSW50ZWdlcjsKK2JlZ2luCisgIFRlc3QoIDApOworICBmb3IgaSA6PSAwIHRvIDYyIGRvIGJlZ2luCisgICAgVGVzdCggKyhJbnQ2NCgxKSBzaGwgaSkpOworICAgIFRlc3QoIC0oSW50NjQoMSkgc2hsIGkpKTsKKyAgZW5kOworICBUZXN0KCBJbnQ2NCgkN0ZGRkZGRkZGRkZGRkZGRikpOworICBUZXN0KCBJbnQ2NCgkODAwMDAwMDAwMDAwMDAwMCkpOworZW5kOworeyRFTkRJRn0KKworCit7JElGREVGIERlYnVnfQorcHJvY2VkdXJlIFVuaXRUZXN0OwordmFyIHcgOiBXT1JEOworY29uc3QgRlBVX0NXX0RFTk9STUFMSVpFRCA9ICQwMDAyOworYmVnaW4KKyAgdyA6PSBHZXQ4MDg3Q1c7CisgIHRyeQorICAgIFNldDgwODdDVyggdyBvciBGUFVfQ1dfREVOT1JNQUxJWkVEKTsKKworICAgIFRlc3REb3VibGVUb0ludDY0Qml0czsKKyAgICBUZXN0WmlnWmFnOworICAgIFRlc3RMb25nQnl0ZXM7CisKKyAgZmluYWxseQorICAgIFNldDgwODdDVyggdyk7CisgIGVuZDsKK2VuZDsKK3skRU5ESUZ9CisKKworaW5pdGlhbGl6YXRpb24KKyAgeyRJRkRFRiBEZWJ1Z30KKyAgVW5pdFRlc3Q7CisgIHskRU5ESUZ9CisKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNjAwYWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMKQEAgLTAsMCArMSwxMjM3IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3skU0NPUEVERU5VTVMgT059CisKK3VuaXQgVGhyaWZ0LlByb3RvY29sLkpTT047CisKK2ludGVyZmFjZQorCit1c2VzCisgIENoYXJhY3RlciwKKyAgQ2xhc3NlcywKKyAgU3lzVXRpbHMsCisgIE1hdGgsCisgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAorICBUaHJpZnQuVHJhbnNwb3J0LAorICBUaHJpZnQuUHJvdG9jb2wsCisgIFRocmlmdC5VdGlsczsKKwordHlwZQorICBJSlNPTlByb3RvY29sID0gaW50ZXJmYWNlKCBJUHJvdG9jb2wpCisgICAgWyd7RjBEQUZEQkQtNjkyQS00QjcxLTk3MzYtRjVENDg1QTIxNzhGfSddCisgICAgLy8gUmVhZCBhIGJ5dGUgdGhhdCBtdXN0IG1hdGNoIGI7IG90aGVyd2lzZSBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgIHByb2NlZHVyZSBSZWFkSlNPTlN5bnRheENoYXIoIGIgOiBCeXRlKTsKKyAgZW5kOworCisgIC8vIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKyAgLy8gVGhpcyBpcyBhIGZ1bGwtZmVhdHVyZWQgcHJvdG9jb2wgc3VwcG9ydGluZyBXcml0ZSBhbmQgUmVhZC4KKyAgLy8gUGxlYXNlIHNlZSB0aGUgQysrIGNsYXNzIGhlYWRlciBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvdG9jb2wncyB3aXJlIGZvcm1hdC4KKyAgLy8gQWRhcHRlZCBmcm9tIHRoZSBDIyB2ZXJzaW9uLgorICBUSlNPTlByb3RvY29sSW1wbCA9IGNsYXNzKCBUUHJvdG9jb2xJbXBsLCBJSlNPTlByb3RvY29sKQorICBwdWJsaWMKKyAgICB0eXBlCisgICAgICBURmFjdG9yeSA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVByb3RvY29sRmFjdG9yeSkKKyAgICAgIHB1YmxpYworICAgICAgICBmdW5jdGlvbiBHZXRQcm90b2NvbCggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQpOiBJUHJvdG9jb2w7CisgICAgICBlbmQ7CisKKyAgcHJpdmF0ZQorICAgIGNsYXNzIGZ1bmN0aW9uIEdldFR5cGVOYW1lRm9yVHlwZUlEKHR5cGVJRCA6IFRUeXBlKSA6IHN0cmluZzsKKyAgICBjbGFzcyBmdW5jdGlvbiBHZXRUeXBlSURGb3JUeXBlTmFtZSggY29uc3QgbmFtZSA6IHN0cmluZykgOiBUVHlwZTsKKworICBwcm90ZWN0ZWQKKyAgICB0eXBlCisgICAgICAvLyBCYXNlIGNsYXNzIGZvciB0cmFja2luZyBKU09OIGNvbnRleHRzIHRoYXQgbWF5IHJlcXVpcmUKKyAgICAgIC8vIGluc2VydGluZy9SZWFkaW5nIGFkZGl0aW9uYWwgSlNPTiBzeW50YXggY2hhcmFjdGVycy4KKyAgICAgIC8vIFRoaXMgYmFzZSBjb250ZXh0IGRvZXMgbm90aGluZy4KKyAgICAgIFRKU09OQmFzZUNvbnRleHQgPSBjbGFzcworICAgICAgcHJvdGVjdGVkCisgICAgICAgIEZQcm90byA6IFBvaW50ZXI7ICAvLyB3ZWFrIElKU09OUHJvdG9jb2w7CisgICAgICBwdWJsaWMKKyAgICAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhUHJvdG8gOiBJSlNPTlByb3RvY29sKTsKKyAgICAgICAgcHJvY2VkdXJlIFdyaXRlOyAgdmlydHVhbDsKKyAgICAgICAgcHJvY2VkdXJlIFJlYWQ7ICB2aXJ0dWFsOworICAgICAgICBmdW5jdGlvbiBFc2NhcGVOdW1iZXJzIDogQm9vbGVhbjsgIHZpcnR1YWw7CisgICAgICBlbmQ7CisKKyAgICAgIC8vIENvbnRleHQgZm9yIEpTT04gbGlzdHMuCisgICAgICAvLyBXaWxsIGluc2VydC9SZWFkIGNvbW1hcyBiZWZvcmUgZWFjaCBpdGVtIGV4Y2VwdCBmb3IgdGhlIGZpcnN0IG9uZS4KKyAgICAgIFRKU09OTGlzdENvbnRleHQgPSBjbGFzcyggVEpTT05CYXNlQ29udGV4dCkKKyAgICAgIHByaXZhdGUKKyAgICAgICAgRkZpcnN0IDogQm9vbGVhbjsKKyAgICAgIHB1YmxpYworICAgICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFQcm90byA6IElKU09OUHJvdG9jb2wpOworICAgICAgICBwcm9jZWR1cmUgV3JpdGU7ICBvdmVycmlkZTsKKyAgICAgICAgcHJvY2VkdXJlIFJlYWQ7ICBvdmVycmlkZTsKKyAgICAgIGVuZDsKKworICAgICAgLy8gQ29udGV4dCBmb3IgSlNPTiByZWNvcmRzLiBXaWxsIGluc2VydC9SZWFkIGNvbG9ucyBiZWZvcmUgdGhlIHZhbHVlIHBvcnRpb24gb2YgZWFjaCByZWNvcmQKKyAgICAgIC8vIHBhaXIsIGFuZCBjb21tYXMgYmVmb3JlIGVhY2gga2V5IGV4Y2VwdCB0aGUgZmlyc3QuIEluIGFkZGl0aW9uLCB3aWxsIGluZGljYXRlIHRoYXQgbnVtYmVycworICAgICAgLy8gaW4gdGhlIGtleSBwb3NpdGlvbiBuZWVkIHRvIGJlIGVzY2FwZWQgaW4gcXVvdGVzIChzaW5jZSBKU09OIGtleXMgbXVzdCBiZSBzdHJpbmdzKS4KKyAgICAgIFRKU09OUGFpckNvbnRleHQgPSBjbGFzcyggVEpTT05CYXNlQ29udGV4dCkKKyAgICAgIHByaXZhdGUKKyAgICAgICAgRkZpcnN0LCBGQ29sb24gOiBCb29sZWFuOworICAgICAgcHVibGljCisgICAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVByb3RvIDogSUpTT05Qcm90b2NvbCk7CisgICAgICAgIHByb2NlZHVyZSBXcml0ZTsgIG92ZXJyaWRlOworICAgICAgICBwcm9jZWR1cmUgUmVhZDsgIG92ZXJyaWRlOworICAgICAgICBmdW5jdGlvbiBFc2NhcGVOdW1iZXJzIDogQm9vbGVhbjsgIG92ZXJyaWRlOworICAgICAgZW5kOworCisgICAgICAvLyBIb2xkcyB1cCB0byBvbmUgYnl0ZSBmcm9tIHRoZSB0cmFuc3BvcnQKKyAgICAgIFRMb29rYWhlYWRSZWFkZXIgPSBjbGFzcworICAgICAgcHJvdGVjdGVkCisgICAgICAgIEZQcm90byA6IFBvaW50ZXI7ICAvLyB3ZWFrIElKU09OUHJvdG9jb2w7CisgICAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVByb3RvIDogSUpTT05Qcm90b2NvbCk7CisKKyAgICAgIHByaXZhdGUKKyAgICAgICAgRkhhc0RhdGEgOiBCb29sZWFuOworICAgICAgICBGRGF0YSAgICA6IEJ5dGU7CisKKyAgICAgIHB1YmxpYworICAgICAgICAvLyBSZXR1cm4gYW5kIGNvbnN1bWUgdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkLCBlaXRoZXIgdGFraW5nIGl0IGZyb20gdGhlCisgICAgICAgIC8vIGRhdGEgYnVmZmVyIGlmIHByZXNlbnQgb3IgZ2V0dGluZyBpdCBmcm9tIHRoZSB0cmFuc3BvcnQgb3RoZXJ3aXNlLgorICAgICAgICBmdW5jdGlvbiBSZWFkIDogQnl0ZTsKKworICAgICAgICAvLyBSZXR1cm4gdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkIHdpdGhvdXQgY29uc3VtaW5nLCBmaWxsaW5nIHRoZSBkYXRhCisgICAgICAgIC8vIGJ1ZmZlciBpZiBpdCBoYXMgbm90IGJlZW4gZmlsbGVkIGFsUmVhZHkuCisgICAgICAgIGZ1bmN0aW9uIFBlZWsgOiBCeXRlOworICAgICAgZW5kOworCisgIHByb3RlY3RlZAorICAgIC8vIFN0YWNrIG9mIG5lc3RlZCBjb250ZXh0cyB0aGF0IHdlIG1heSBiZSBpbgorICAgIEZDb250ZXh0U3RhY2sgOiBUU3RhY2s8VEpTT05CYXNlQ29udGV4dD47CisKKyAgICAvLyBDdXJyZW50IGNvbnRleHQgdGhhdCB3ZSBhcmUgaW4KKyAgICBGQ29udGV4dCA6IFRKU09OQmFzZUNvbnRleHQ7CisKKyAgICAvLyBSZWFkZXIgdGhhdCBtYW5hZ2VzIGEgMS1ieXRlIGJ1ZmZlcgorICAgIEZSZWFkZXIgOiBUTG9va2FoZWFkUmVhZGVyOworCisgICAgLy8gUHVzaC9wb3AgYSBuZXcgSlNPTiBjb250ZXh0IG9udG8vZnJvbSB0aGUgc3RhY2suCisgICAgcHJvY2VkdXJlIFJlc2V0Q29udGV4dFN0YWNrOworICAgIHByb2NlZHVyZSBQdXNoQ29udGV4dCggY29uc3QgYUN0eCA6IFRKU09OQmFzZUNvbnRleHQpOworICAgIHByb2NlZHVyZSBQb3BDb250ZXh0OworCisgIHB1YmxpYworICAgIC8vIFRKU09OUHJvdG9jb2xJbXBsIENvbnN0cnVjdG9yCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhVHJhbnMgOiBJVHJhbnNwb3J0KTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICAgb3ZlcnJpZGU7CisKKyAgcHJvdGVjdGVkCisgICAgLy8gSUpTT05Qcm90b2NvbAorICAgIC8vIFJlYWQgYSBieXRlIHRoYXQgbXVzdCBtYXRjaCBiOyBvdGhlcndpc2UgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICBwcm9jZWR1cmUgUmVhZEpTT05TeW50YXhDaGFyKCBiIDogQnl0ZSk7CisKKyAgcHJpdmF0ZQorICAgIC8vIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggY2hhciAoJzAnLSc5JyBvciAnYSctJ2YnKSBpbnRvIGl0cyBjb3JyZXNwb25kaW5nIGhleCB2YWx1ZQorICAgIGNsYXNzIGZ1bmN0aW9uIEhleFZhbCggY2ggOiBCeXRlKSA6IEJ5dGU7CisKKyAgICAvLyBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IHZhbHVlIHRvIGl0cyBjb3JyZXNwb25kaW5nIGhleCBjaGFyYWN0ZXIKKyAgICBjbGFzcyBmdW5jdGlvbiBIZXhDaGFyKCB2YWwgOiBCeXRlKSA6IEJ5dGU7CisKKyAgICAvLyBXcml0ZSB0aGUgYnl0ZXMgaW4gYXJyYXkgYnVmIGFzIGEgSlNPTiBjaGFyYWN0ZXJzLCBlc2NhcGluZyBhcyBuZWVkZWQKKyAgICBwcm9jZWR1cmUgV3JpdGVKU09OU3RyaW5nKCBjb25zdCBiIDogVEJ5dGVzKTsgIG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBXcml0ZUpTT05TdHJpbmcoIGNvbnN0IHN0ciA6IHN0cmluZyk7ICBvdmVybG9hZDsKKworICAgIC8vIFdyaXRlIG91dCBudW1iZXIgYXMgYSBKU09OIHZhbHVlLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcyBzbywgaXQgd2lsbCBiZQorICAgIC8vIHdyYXBwZWQgaW4gcXVvdGVzIHRvIG91dHB1dCBhcyBhIEpTT04gc3RyaW5nLgorICAgIHByb2NlZHVyZSBXcml0ZUpTT05JbnRlZ2VyKCBjb25zdCBudW0gOiBJbnQ2NCk7CisKKyAgICAvLyBXcml0ZSBvdXQgYSBkb3VibGUgYXMgYSBKU09OIHZhbHVlLiBJZiBpdCBpcyBOYU4gb3IgaW5maW5pdHkgb3IgaWYgdGhlCisgICAgLy8gY29udGV4dCBkaWN0YXRlcyBlc2NhcGluZywgV3JpdGUgb3V0IGFzIEpTT04gc3RyaW5nLgorICAgIHByb2NlZHVyZSBXcml0ZUpTT05Eb3VibGUoIGNvbnN0IG51bSA6IERvdWJsZSk7CisKKyAgICAvLyBXcml0ZSBvdXQgY29udGVudHMgb2YgYnl0ZSBhcnJheSBiIGFzIGEgSlNPTiBzdHJpbmcgd2l0aCBiYXNlLTY0IGVuY29kZWQgZGF0YQorICAgIHByb2NlZHVyZSBXcml0ZUpTT05CYXNlNjQoIGNvbnN0IGIgOiBUQnl0ZXMpOworCisgICAgcHJvY2VkdXJlIFdyaXRlSlNPTk9iamVjdFN0YXJ0OworICAgIHByb2NlZHVyZSBXcml0ZUpTT05PYmplY3RFbmQ7CisgICAgcHJvY2VkdXJlIFdyaXRlSlNPTkFycmF5U3RhcnQ7CisgICAgcHJvY2VkdXJlIFdyaXRlSlNPTkFycmF5RW5kOworCisgIHB1YmxpYworICAgIC8vIElQcm90b2NvbAorICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgYU1zZyA6IFRUaHJpZnRNZXNzYWdlKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0RW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkU3RvcDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RFbmQoKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0RW5kKCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUkxNiggaTE2OiBTbWFsbEludCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUkzMiggaTMyOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlSTY0KCBjb25zdCBpNjQ6IEludDY0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRG91YmxlKCBjb25zdCBkOiBEb3VibGUpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJpbmcoIGNvbnN0IHM6IHN0cmluZyApOyAgIG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsgb3ZlcnJpZGU7CisgICAgLy8KKyAgICBmdW5jdGlvbiBSZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRNZXNzYWdlRW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRTdHJ1Y3RFbmQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkRmllbGRFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZE1hcEVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRMaXN0RW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRTZXRFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEJvb2w6IEJvb2xlYW47IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRCeXRlOiBTaG9ydEludDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEkxNjogU21hbGxJbnQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRJMzI6IEludGVnZXI7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRJNjQ6IEludDY0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkRG91YmxlOkRvdWJsZTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZFN0cmluZyA6IHN0cmluZzsgIG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRCaW5hcnk6IFRCeXRlczsgb3ZlcnJpZGU7CisKKworICBwcml2YXRlCisgICAgLy8gUmVhZGluZyBtZXRob2RzLgorCisgICAgLy8gUmVhZCBpbiBhIEpTT04gc3RyaW5nLCB1bmVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlLgorICAgIC8vIFNraXAgUmVhZGluZyBmcm9tIHRoZSBjb250ZXh0IGlmIHNraXBDb250ZXh0IGlzIHRydWUuCisgICAgZnVuY3Rpb24gUmVhZEpTT05TdHJpbmcoIHNraXBDb250ZXh0IDogQm9vbGVhbikgOiBUQnl0ZXM7CisKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnl0ZSBjb3VsZCBiZSBhIHZhbGlkIHBhcnQgb2YgYSBKU09OIG51bWJlci4KKyAgICBmdW5jdGlvbiBJc0pTT05OdW1lcmljKCBiIDogQnl0ZSkgOiBCb29sZWFuOworCisgICAgLy8gUmVhZCBpbiBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgYWxsIHZhbGlkIGluIEpTT04gbnVtYmVycy4gRG9lcworICAgIC8vIG5vdCBkbyBhIGNvbXBsZXRlIHJlZ2V4IGNoZWNrIHRvIHZhbGlkYXRlIHRoYXQgdGhpcyBpcyBhY3R1YWxseSBhIG51bWJlci4KKyAgICBmdW5jdGlvbiBSZWFkSlNPTk51bWVyaWNDaGFycyA6IFN0cmluZzsKKworICAgIC8vIFJlYWQgaW4gYSBKU09OIG51bWJlci4gSWYgdGhlIGNvbnRleHQgZGljdGF0ZXMsIFJlYWQgaW4gZW5jbG9zaW5nIHF1b3Rlcy4KKyAgICBmdW5jdGlvbiBSZWFkSlNPTkludGVnZXIgOiBJbnQ2NDsKKworICAgIC8vIFJlYWQgaW4gYSBKU09OIGRvdWJsZSB2YWx1ZS4gVGhyb3cgaWYgdGhlIHZhbHVlIGlzIG5vdCB3cmFwcGVkIGluIHF1b3RlcworICAgIC8vIHdoZW4gZXhwZWN0ZWQgb3IgaWYgd3JhcHBlZCBpbiBxdW90ZXMgd2hlbiBub3QgZXhwZWN0ZWQuCisgICAgZnVuY3Rpb24gUmVhZEpTT05Eb3VibGUgOiBEb3VibGU7CisKKyAgICAvLyBSZWFkIGluIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBiYXNlLTY0IGVuY29kZWQgZGF0YSBhbmQgZGVjb2RlIGl0LgorICAgIGZ1bmN0aW9uIFJlYWRKU09OQmFzZTY0IDogVEJ5dGVzOworCisgICAgcHJvY2VkdXJlIFJlYWRKU09OT2JqZWN0U3RhcnQ7CisgICAgcHJvY2VkdXJlIFJlYWRKU09OT2JqZWN0RW5kOworICAgIHByb2NlZHVyZSBSZWFkSlNPTkFycmF5U3RhcnQ7CisgICAgcHJvY2VkdXJlIFJlYWRKU09OQXJyYXlFbmQ7CisgIGVuZDsKKworCitpbXBsZW1lbnRhdGlvbgorCit2YXIKKyAgQ09NTUEgICAgIDogVEJ5dGVzOworICBDT0xPTiAgICAgOiBUQnl0ZXM7CisgIExCUkFDRSAgICA6IFRCeXRlczsKKyAgUkJSQUNFICAgIDogVEJ5dGVzOworICBMQlJBQ0tFVCAgOiBUQnl0ZXM7CisgIFJCUkFDS0VUICA6IFRCeXRlczsKKyAgUVVPVEUgICAgIDogVEJ5dGVzOworICBCQUNLU0xBU0ggOiBUQnl0ZXM7CisgIEVTQ1NFUSAgICA6IFRCeXRlczsKKworY29uc3QKKyAgVkVSU0lPTiA9IDE7CisgIEpTT05fQ0hBUl9UQUJMRSA6IGFycmF5WzAuLiQyRl0gb2YgQnl0ZQorICAgICAgICAgICAgICAgICAgPSAoMCwwLDAsMCwgMCwwLDAsMCwgQnl0ZSgnYicpLEJ5dGUoJ3QnKSxCeXRlKCduJyksMCwgQnl0ZSgnZicpLEJ5dGUoJ3InKSwwLDAsCisgICAgICAgICAgICAgICAgICAgICAwLDAsMCwwLCAwLDAsMCwwLCAwLDAsMCwwLCAgMCwwLDAsMCwKKyAgICAgICAgICAgICAgICAgICAgIDEsMSxCeXRlKCciJyksMSwgIDEsMSwxLDEsIDEsMSwxLDEsIDEsMSwxLDEpOworCisgIEVTQ0FQRV9DSEFSUyAgICAgPSAnIlwvYnRuZnInOworICBFU0NBUEVfQ0hBUl9WQUxTID0gJyJcLycjOCM5IzEwIzEyIzEzOworCisgIERFRl9TVFJJTkdfU0laRSA9IDE2OworCisgIE5BTUVfQk9PTCAgID0gJ3RmJzsKKyAgTkFNRV9CWVRFICAgPSAnaTgnOworICBOQU1FX0kxNiAgICA9ICdpMTYnOworICBOQU1FX0kzMiAgICA9ICdpMzInOworICBOQU1FX0k2NCAgICA9ICdpNjQnOworICBOQU1FX0RPVUJMRSA9ICdkYmwnOworICBOQU1FX1NUUlVDVCA9ICdyZWMnOworICBOQU1FX1NUUklORyA9ICdzdHInOworICBOQU1FX01BUCAgICA9ICdtYXAnOworICBOQU1FX0xJU1QgICA9ICdsc3QnOworICBOQU1FX1NFVCAgICA9ICdzZXQnOworCisgIElOVkFSSUFOVF9DVUxUVVJFIDogVEZvcm1hdFNldHRpbmdzCisgICAgICAgICAgICAgICAgICAgID0gKCBUaG91c2FuZFNlcGFyYXRvcjogJywnOworICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbFNlcGFyYXRvcjogJy4nKTsKKworCisKKy8vLS0tIFRKU09OUHJvdG9jb2xJbXBsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5URmFjdG9yeS5HZXRQcm90b2NvbCggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQpOiBJUHJvdG9jb2w7CitiZWdpbgorICByZXN1bHQgOj0gVEpTT05Qcm90b2NvbEltcGwuQ3JlYXRlKHRyYW5zKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuR2V0VHlwZU5hbWVGb3JUeXBlSUQodHlwZUlEIDogVFR5cGUpIDogc3RyaW5nOworYmVnaW4KKyAgY2FzZSB0eXBlSUQgb2YKKyAgICBUVHlwZS5Cb29sXzogICAgcmVzdWx0IDo9IE5BTUVfQk9PTDsKKyAgICBUVHlwZS5CeXRlXzogICAgcmVzdWx0IDo9IE5BTUVfQllURTsKKyAgICBUVHlwZS5JMTY6ICAgICAgcmVzdWx0IDo9IE5BTUVfSTE2OworICAgIFRUeXBlLkkzMjogICAgICByZXN1bHQgOj0gTkFNRV9JMzI7CisgICAgVFR5cGUuSTY0OiAgICAgIHJlc3VsdCA6PSBOQU1FX0k2NDsKKyAgICBUVHlwZS5Eb3VibGVfOiAgcmVzdWx0IDo9IE5BTUVfRE9VQkxFOworICAgIFRUeXBlLlN0cmluZ186ICByZXN1bHQgOj0gTkFNRV9TVFJJTkc7CisgICAgVFR5cGUuU3RydWN0OiAgIHJlc3VsdCA6PSBOQU1FX1NUUlVDVDsKKyAgICBUVHlwZS5NYXA6ICAgICAgcmVzdWx0IDo9IE5BTUVfTUFQOworICAgIFRUeXBlLlNldF86ICAgICByZXN1bHQgOj0gTkFNRV9TRVQ7CisgICAgVFR5cGUuTGlzdDogICAgIHJlc3VsdCA6PSBOQU1FX0xJU1Q7CisgIGVsc2UKKyAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25Ob3RJbXBsZW1lbnRlZC5DcmVhdGUoJ1VucmVjb2duaXplZCB0eXBlICgnK0ludFRvU3RyKE9yZCh0eXBlSUQpKSsnKScpOworICBlbmQ7CitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuR2V0VHlwZUlERm9yVHlwZU5hbWUoIGNvbnN0IG5hbWUgOiBzdHJpbmcpIDogVFR5cGU7CitiZWdpbgorICBpZiAgICAgIG5hbWUgPSBOQU1FX0JPT0wgICB0aGVuIHJlc3VsdCA6PSBUVHlwZS5Cb29sXworICBlbHNlIGlmIG5hbWUgPSBOQU1FX0JZVEUgICB0aGVuIHJlc3VsdCA6PSBUVHlwZS5CeXRlXworICBlbHNlIGlmIG5hbWUgPSBOQU1FX0kxNiAgICB0aGVuIHJlc3VsdCA6PSBUVHlwZS5JMTYKKyAgZWxzZSBpZiBuYW1lID0gTkFNRV9JMzIgICAgdGhlbiByZXN1bHQgOj0gVFR5cGUuSTMyCisgIGVsc2UgaWYgbmFtZSA9IE5BTUVfSTY0ICAgIHRoZW4gcmVzdWx0IDo9IFRUeXBlLkk2NAorICBlbHNlIGlmIG5hbWUgPSBOQU1FX0RPVUJMRSB0aGVuIHJlc3VsdCA6PSBUVHlwZS5Eb3VibGVfCisgIGVsc2UgaWYgbmFtZSA9IE5BTUVfU1RSVUNUIHRoZW4gcmVzdWx0IDo9IFRUeXBlLlN0cnVjdAorICBlbHNlIGlmIG5hbWUgPSBOQU1FX1NUUklORyB0aGVuIHJlc3VsdCA6PSBUVHlwZS5TdHJpbmdfCisgIGVsc2UgaWYgbmFtZSA9IE5BTUVfTUFQICAgIHRoZW4gcmVzdWx0IDo9IFRUeXBlLk1hcAorICBlbHNlIGlmIG5hbWUgPSBOQU1FX0xJU1QgICB0aGVuIHJlc3VsdCA6PSBUVHlwZS5MaXN0CisgIGVsc2UgaWYgbmFtZSA9IE5BTUVfU0VUICAgIHRoZW4gcmVzdWx0IDo9IFRUeXBlLlNldF8KKyAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25Ob3RJbXBsZW1lbnRlZC5DcmVhdGUoJ1VucmVjb2duaXplZCB0eXBlICgnK25hbWUrJyknKTsKK2VuZDsKKworCitjb25zdHJ1Y3RvciBUSlNPTlByb3RvY29sSW1wbC5USlNPTkJhc2VDb250ZXh0LkNyZWF0ZSggY29uc3QgYVByb3RvIDogSUpTT05Qcm90b2NvbCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGUHJvdG8gOj0gUG9pbnRlcihhUHJvdG8pOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5USlNPTkJhc2VDb250ZXh0LldyaXRlOworYmVnaW4KKyAgLy8gbm90aGluZworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5USlNPTkJhc2VDb250ZXh0LlJlYWQ7CitiZWdpbgorICAvLyBub3RoaW5nCitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuVEpTT05CYXNlQ29udGV4dC5Fc2NhcGVOdW1iZXJzIDogQm9vbGVhbjsKK2JlZ2luCisgIHJlc3VsdCA6PSBGQUxTRTsKK2VuZDsKKworCitjb25zdHJ1Y3RvciBUSlNPTlByb3RvY29sSW1wbC5USlNPTkxpc3RDb250ZXh0LkNyZWF0ZSggY29uc3QgYVByb3RvIDogSUpTT05Qcm90b2NvbCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKCBhUHJvdG8pOworICBGRmlyc3QgOj0gVFJVRTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuVEpTT05MaXN0Q29udGV4dC5Xcml0ZTsKK2JlZ2luCisgIGlmIEZGaXJzdAorICB0aGVuIEZGaXJzdCA6PSBGQUxTRQorICBlbHNlIElKU09OUHJvdG9jb2woRlByb3RvKS5UcmFuc3BvcnQuV3JpdGUoIENPTU1BKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuVEpTT05MaXN0Q29udGV4dC5SZWFkOworYmVnaW4KKyAgaWYgRkZpcnN0CisgIHRoZW4gRkZpcnN0IDo9IEZBTFNFCisgIGVsc2UgSUpTT05Qcm90b2NvbChGUHJvdG8pLlJlYWRKU09OU3ludGF4Q2hhciggQ09NTUFbMF0pOworZW5kOworCisKK2NvbnN0cnVjdG9yIFRKU09OUHJvdG9jb2xJbXBsLlRKU09OUGFpckNvbnRleHQuQ3JlYXRlKCBjb25zdCBhUHJvdG8gOiBJSlNPTlByb3RvY29sKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoIGFQcm90byk7CisgIEZGaXJzdCA6PSBUUlVFOworICBGQ29sb24gOj0gVFJVRTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuVEpTT05QYWlyQ29udGV4dC5Xcml0ZTsKK2JlZ2luCisgIGlmIEZGaXJzdCB0aGVuIGJlZ2luCisgICAgRkZpcnN0IDo9IEZBTFNFOworICAgIEZDb2xvbiA6PSBUUlVFOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIGlmIEZDb2xvbgorICAgIHRoZW4gSUpTT05Qcm90b2NvbChGUHJvdG8pLlRyYW5zcG9ydC5Xcml0ZSggQ09MT04pCisgICAgZWxzZSBJSlNPTlByb3RvY29sKEZQcm90bykuVHJhbnNwb3J0LldyaXRlKCBDT01NQSk7CisgICAgRkNvbG9uIDo9IG5vdCBGQ29sb247CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuVEpTT05QYWlyQ29udGV4dC5SZWFkOworYmVnaW4KKyAgaWYgRkZpcnN0IHRoZW4gYmVnaW4KKyAgICBGRmlyc3QgOj0gRkFMU0U7CisgICAgRkNvbG9uIDo9IFRSVUU7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgaWYgRkNvbG9uCisgICAgdGhlbiBJSlNPTlByb3RvY29sKEZQcm90bykuUmVhZEpTT05TeW50YXhDaGFyKCBDT0xPTlswXSkKKyAgICBlbHNlIElKU09OUHJvdG9jb2woRlByb3RvKS5SZWFkSlNPTlN5bnRheENoYXIoIENPTU1BWzBdKTsKKyAgICBGQ29sb24gOj0gbm90IEZDb2xvbjsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlRKU09OUGFpckNvbnRleHQuRXNjYXBlTnVtYmVycyA6IEJvb2xlYW47CitiZWdpbgorICByZXN1bHQgOj0gRkNvbG9uOworZW5kOworCisKK2NvbnN0cnVjdG9yIFRKU09OUHJvdG9jb2xJbXBsLlRMb29rYWhlYWRSZWFkZXIuQ3JlYXRlKCBjb25zdCBhUHJvdG8gOiBJSlNPTlByb3RvY29sKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZQcm90byAgIDo9IFBvaW50ZXIoYVByb3RvKTsKKyAgRkhhc0RhdGEgOj0gRkFMU0U7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuVExvb2thaGVhZFJlYWRlci5SZWFkIDogQnl0ZTsKK2JlZ2luCisgIGlmIEZIYXNEYXRhCisgIHRoZW4gRkhhc0RhdGEgOj0gRkFMU0UKKyAgZWxzZSBiZWdpbgorICAgIElKU09OUHJvdG9jb2woRlByb3RvKS5UcmFuc3BvcnQuUmVhZEFsbCggQEZEYXRhLCBTaXplT2YoRkRhdGEpLCAwLCAxKTsKKyAgZW5kOworICByZXN1bHQgOj0gRkRhdGE7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuVExvb2thaGVhZFJlYWRlci5QZWVrIDogQnl0ZTsKK2JlZ2luCisgIGlmIG5vdCBGSGFzRGF0YSB0aGVuIGJlZ2luCisgICAgSUpTT05Qcm90b2NvbChGUHJvdG8pLlRyYW5zcG9ydC5SZWFkQWxsKCBARkRhdGEsIFNpemVPZihGRGF0YSksIDAsIDEpOworICAgIEZIYXNEYXRhIDo9IFRSVUU7CisgIGVuZDsKKyAgcmVzdWx0IDo9IEZEYXRhOworZW5kOworCisKK2NvbnN0cnVjdG9yIFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSggY29uc3QgYVRyYW5zIDogSVRyYW5zcG9ydCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKCBhVHJhbnMpOworCisgIC8vIFN0YWNrIG9mIG5lc3RlZCBjb250ZXh0cyB0aGF0IHdlIG1heSBiZSBpbgorICBGQ29udGV4dFN0YWNrIDo9IFRTdGFjazxUSlNPTkJhc2VDb250ZXh0Pi5DcmVhdGU7CisKKyAgRkNvbnRleHQgOj0gVEpTT05CYXNlQ29udGV4dC5DcmVhdGUoIFNlbGYpOworICBGUmVhZGVyICA6PSBUTG9va2FoZWFkUmVhZGVyLkNyZWF0ZSggU2VsZik7CitlbmQ7CisKKworZGVzdHJ1Y3RvciBUSlNPTlByb3RvY29sSW1wbC5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgUmVzZXRDb250ZXh0U3RhY2s7ICAvLyBmcmVlIGFueSBjb250ZW50cworICAgIEZyZWVBbmROaWwoIEZSZWFkZXIpOworICAgIEZyZWVBbmROaWwoIEZDb250ZXh0KTsKKyAgICBGcmVlQW5kTmlsKCBGQ29udGV4dFN0YWNrKTsKKyAgZmluYWxseQorICAgIGluaGVyaXRlZCBEZXN0cm95OworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLlJlc2V0Q29udGV4dFN0YWNrOworYmVnaW4KKyAgd2hpbGUgRkNvbnRleHRTdGFjay5Db3VudCA+IDAKKyAgZG8gUG9wQ29udGV4dDsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuUHVzaENvbnRleHQoIGNvbnN0IGFDdHggOiBUSlNPTkJhc2VDb250ZXh0KTsKK2JlZ2luCisgIEZDb250ZXh0U3RhY2suUHVzaCggRkNvbnRleHQpOworICBGQ29udGV4dCA6PSBhQ3R4OworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Qb3BDb250ZXh0OworYmVnaW4KKyAgRnJlZUFuZE5pbChGQ29udGV4dCk7CisgIEZDb250ZXh0IDo9IEZDb250ZXh0U3RhY2suUG9wOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5SZWFkSlNPTlN5bnRheENoYXIoIGIgOiBCeXRlKTsKK3ZhciBjaCA6IEJ5dGU7CitiZWdpbgorICBjaCA6PSBGUmVhZGVyLlJlYWQ7CisgIGlmIChjaCA8PiBiKQorICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnVW5leHBlY3RlZCBjaGFyYWN0ZXIgKCcrQ2hhcihjaCkrJyknKTsKK2VuZDsKKworCitjbGFzcyBmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5IZXhWYWwoIGNoIDogQnl0ZSkgOiBCeXRlOwordmFyIGkgOiBJbnRlZ2VyOworYmVnaW4KKyAgaSA6PSBTdHJUb0ludERlZiggJyQwJytDaGFyKGNoKSwgLTEpOworICBpZiAoMCA8PSBpKSBhbmQgKGkgPCAkMTApCisgIHRoZW4gcmVzdWx0IDo9IGkKKyAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ0V4cGVjdGVkIGhleCBjaGFyYWN0ZXIgKCcrQ2hhcihjaCkrJyknKTsKK2VuZDsKKworCitjbGFzcyBmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5IZXhDaGFyKCB2YWwgOiBCeXRlKSA6IEJ5dGU7Citjb25zdCBIRVhDSEFSUyA9ICcwMTIzNDU2Nzg5QUJDREVGJzsKK2JlZ2luCisgIHJlc3VsdCA6PSBCeXRlKCBQQ2hhcihIRVhDSEFSUylbdmFsIGFuZCAkMEZdKTsKKyAgQVNTRVJUKCBQb3MoIENoYXIocmVzdWx0KSwgSEVYQ0hBUlMpID4gMCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlSlNPTlN0cmluZyggY29uc3Qgc3RyIDogc3RyaW5nKTsKK2JlZ2luCisgIFdyaXRlSlNPTlN0cmluZyggU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoIHN0cikpOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUpTT05TdHJpbmcoIGNvbnN0IGIgOiBUQnl0ZXMpOwordmFyIGkgOiBJbnRlZ2VyOworICAgIHRtcCA6IFRCeXRlczsKK2JlZ2luCisgIEZDb250ZXh0LldyaXRlOworICBUcmFuc3BvcnQuV3JpdGUoIFFVT1RFKTsKKyAgZm9yIGkgOj0gMCB0byBMZW5ndGgoYiktMSBkbyBiZWdpbgorCisgICAgaWYgKGJbaV0gYW5kICQwMEZGKSA+PSAkMzAgdGhlbiBiZWdpbgorCisgICAgICBpZiAoYltpXSA9IEJBQ0tTTEFTSFswXSkgdGhlbiBiZWdpbgorICAgICAgICBUcmFuc3BvcnQuV3JpdGUoIEJBQ0tTTEFTSCk7CisgICAgICAgIFRyYW5zcG9ydC5Xcml0ZSggQkFDS1NMQVNIKTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBiZWdpbgorICAgICAgICBUcmFuc3BvcnQuV3JpdGUoIGIsIGksIDEpOworICAgICAgZW5kOworCisgICAgZW5kCisgICAgZWxzZSBiZWdpbgorICAgICAgU2V0TGVuZ3RoKCB0bXAsIDIpOworICAgICAgdG1wWzBdIDo9IEpTT05fQ0hBUl9UQUJMRVtiW2ldXTsKKyAgICAgIGlmICh0bXBbMF0gPSAxKSB0aGVuIGJlZ2luCisgICAgICAgIFRyYW5zcG9ydC5Xcml0ZSggYiwgaSwgMSkKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiAodG1wWzBdID4gMSkgdGhlbiBiZWdpbgorICAgICAgICBUcmFuc3BvcnQuV3JpdGUoIEJBQ0tTTEFTSCk7CisgICAgICAgIFRyYW5zcG9ydC5Xcml0ZSggdG1wLCAwLCAxKTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBiZWdpbgorICAgICAgICBUcmFuc3BvcnQuV3JpdGUoIEVTQ1NFUSk7CisgICAgICAgIHRtcFswXSA6PSBIZXhDaGFyKCBiW2ldIGRpdiAkMTApOworICAgICAgICB0bXBbMV0gOj0gSGV4Q2hhciggYltpXSk7CisgICAgICAgIFRyYW5zcG9ydC5Xcml0ZSggdG1wLCAwLCAyKTsKKyAgICAgIGVuZDsKKyAgICBlbmQ7CisgIGVuZDsKKyAgVHJhbnNwb3J0LldyaXRlKCBRVU9URSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlSlNPTkludGVnZXIoIGNvbnN0IG51bSA6IEludDY0KTsKK3ZhciBzdHIgOiBTdHJpbmc7CisgICAgZXNjYXBlTnVtIDogQm9vbGVhbjsKK2JlZ2luCisgIEZDb250ZXh0LldyaXRlOworICBzdHIgOj0gSW50VG9TdHIobnVtKTsKKworICBlc2NhcGVOdW0gOj0gRkNvbnRleHQuRXNjYXBlTnVtYmVyczsKKyAgaWYgZXNjYXBlTnVtCisgIHRoZW4gVHJhbnNwb3J0LldyaXRlKCBRVU9URSk7CisKKyAgVHJhbnNwb3J0LldyaXRlKCBTeXNVdGlscy5URW5jb2RpbmcuVVRGOC5HZXRCeXRlcyggc3RyKSk7CisKKyAgaWYgZXNjYXBlTnVtCisgIHRoZW4gVHJhbnNwb3J0LldyaXRlKCBRVU9URSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlSlNPTkRvdWJsZSggY29uc3QgbnVtIDogRG91YmxlKTsKK3ZhciBzdHIgOiBzdHJpbmc7CisgICAgc3BlY2lhbCA6IEJvb2xlYW47CisgICAgZXNjYXBlTnVtIDogQm9vbGVhbjsKK2JlZ2luCisgIEZDb250ZXh0LldyaXRlOworCisgIHN0ciA6PSBGbG9hdFRvU3RyKCBudW0sIElOVkFSSUFOVF9DVUxUVVJFKTsKKyAgc3BlY2lhbCA6PSBGQUxTRTsKKworICBjYXNlIFVwQ2FzZShzdHJbMV0pIG9mCisgICAgJ04nIDogc3BlY2lhbCA6PSBUUlVFOyAgLy8gTmFOCisgICAgJ0knIDogc3BlY2lhbCA6PSBUUlVFOyAgLy8gSW5maW5pdHkKKyAgICAnLScgOiBzcGVjaWFsIDo9IChVcENhc2Uoc3RyWzJdKSA9ICdJJyk7IC8vIC1JbmZpbml0eQorICBlbmQ7CisKKyAgZXNjYXBlTnVtIDo9IHNwZWNpYWwgb3IgRkNvbnRleHQuRXNjYXBlTnVtYmVyczsKKworCisgIGlmIGVzY2FwZU51bQorICB0aGVuIFRyYW5zcG9ydC5Xcml0ZSggUVVPVEUpOworCisgIFRyYW5zcG9ydC5Xcml0ZSggU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoIHN0cikpOworCisgIGlmIGVzY2FwZU51bQorICB0aGVuIFRyYW5zcG9ydC5Xcml0ZSggUVVPVEUpOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUpTT05CYXNlNjQoIGNvbnN0IGIgOiBUQnl0ZXMpOwordmFyIGxlbiwgb2ZmLCBjbnQgOiBJbnRlZ2VyOworICAgIHRtcEJ1ZiA6IFRCeXRlczsKK2JlZ2luCisgIEZDb250ZXh0LldyaXRlOworICBUcmFuc3BvcnQuV3JpdGUoIFFVT1RFKTsKKworICBsZW4gOj0gTGVuZ3RoKGIpOworICBvZmYgOj0gMDsKKyAgU2V0TGVuZ3RoKCB0bXBCdWYsIDQpOworCisgIHdoaWxlIGxlbiA+PSAzIGRvIGJlZ2luCisgICAgLy8gRW5jb2RlIDMgYnl0ZXMgYXQgYSB0aW1lCisgICAgQmFzZTY0VXRpbHMuRW5jb2RlKCBiLCBvZmYsIDMsIHRtcEJ1ZiwgMCk7CisgICAgVHJhbnNwb3J0LldyaXRlKCB0bXBCdWYsIDAsIDQpOworICAgIEluYyggb2ZmLCAzKTsKKyAgICBEZWMoIGxlbiwgMyk7CisgIGVuZDsKKworICAvLyBFbmNvZGUgcmVtYWluZGVyLCBpZiBhbnkKKyAgaWYgbGVuID4gMCB0aGVuIGJlZ2luCisgICAgY250IDo9IEJhc2U2NFV0aWxzLkVuY29kZSggYiwgb2ZmLCBsZW4sIHRtcEJ1ZiwgMCk7CisgICAgVHJhbnNwb3J0LldyaXRlKCB0bXBCdWYsIDAsIGNudCk7CisgIGVuZDsKKworICBUcmFuc3BvcnQuV3JpdGUoIFFVT1RFKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVKU09OT2JqZWN0U3RhcnQ7CitiZWdpbgorICBGQ29udGV4dC5Xcml0ZTsKKyAgVHJhbnNwb3J0LldyaXRlKCBMQlJBQ0UpOworICBQdXNoQ29udGV4dCggVEpTT05QYWlyQ29udGV4dC5DcmVhdGUoIFNlbGYpKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVKU09OT2JqZWN0RW5kOworYmVnaW4KKyAgUG9wQ29udGV4dDsKKyAgVHJhbnNwb3J0LldyaXRlKCBSQlJBQ0UpOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUpTT05BcnJheVN0YXJ0OworYmVnaW4KKyAgRkNvbnRleHQuV3JpdGU7CisgIFRyYW5zcG9ydC5Xcml0ZSggTEJSQUNLRVQpOworICBQdXNoQ29udGV4dCggVEpTT05MaXN0Q29udGV4dC5DcmVhdGUoIFNlbGYpKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVKU09OQXJyYXlFbmQ7CitiZWdpbgorICBQb3BDb250ZXh0OworICBUcmFuc3BvcnQuV3JpdGUoIFJCUkFDS0VUKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IGFNc2cgOiBUVGhyaWZ0TWVzc2FnZSk7CitiZWdpbgorICBSZXNldENvbnRleHRTdGFjazsgIC8vIFRIUklGVC0xNDczCisKKyAgV3JpdGVKU09OQXJyYXlTdGFydDsKKyAgV3JpdGVKU09OSW50ZWdlcihWRVJTSU9OKTsKKworICBXcml0ZUpTT05TdHJpbmcoIFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKCBhTXNnLk5hbWUpKTsKKworICBXcml0ZUpTT05JbnRlZ2VyKCBMb25nSW50KCBhTXNnLlR5cGVfKSk7CisgIFdyaXRlSlNPTkludGVnZXIoIGFNc2cuU2VxSUQpOworZW5kOworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVNZXNzYWdlRW5kOworYmVnaW4KKyAgV3JpdGVKU09OQXJyYXlFbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsKK2JlZ2luCisgIFdyaXRlSlNPTk9iamVjdFN0YXJ0OworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZVN0cnVjdEVuZDsKK2JlZ2luCisgIFdyaXRlSlNPTk9iamVjdEVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZCA6IFRUaHJpZnRGaWVsZCk7CitiZWdpbgorICBXcml0ZUpTT05JbnRlZ2VyKGZpZWxkLklEKTsKKyAgV3JpdGVKU09OT2JqZWN0U3RhcnQ7CisgIFdyaXRlSlNPTlN0cmluZyggR2V0VHlwZU5hbWVGb3JUeXBlSUQoZmllbGQuVHlwZV8pKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVGaWVsZEVuZDsKK2JlZ2luCisgIFdyaXRlSlNPTk9iamVjdEVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVGaWVsZFN0b3A7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOworYmVnaW4KKyAgV3JpdGVKU09OQXJyYXlTdGFydDsKKyAgV3JpdGVKU09OU3RyaW5nKCBHZXRUeXBlTmFtZUZvclR5cGVJRCggbWFwLktleVR5cGUpKTsKKyAgV3JpdGVKU09OU3RyaW5nKCBHZXRUeXBlTmFtZUZvclR5cGVJRCggbWFwLlZhbHVlVHlwZSkpOworICBXcml0ZUpTT05JbnRlZ2VyKCBtYXAuQ291bnQpOworICBXcml0ZUpTT05PYmplY3RTdGFydDsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVNYXBFbmQ7CitiZWdpbgorICBXcml0ZUpTT05PYmplY3RFbmQ7CisgIFdyaXRlSlNPTkFycmF5RW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOworYmVnaW4KKyAgV3JpdGVKU09OQXJyYXlTdGFydDsKKyAgV3JpdGVKU09OU3RyaW5nKCBHZXRUeXBlTmFtZUZvclR5cGVJRCggbGlzdC5FbGVtZW50VHlwZSkpOworICBXcml0ZUpTT05JbnRlZ2VyKGxpc3QuQ291bnQpOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUxpc3RFbmQ7CitiZWdpbgorICBXcml0ZUpTT05BcnJheUVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCk7CitiZWdpbgorICBXcml0ZUpTT05BcnJheVN0YXJ0OworICBXcml0ZUpTT05TdHJpbmcoIEdldFR5cGVOYW1lRm9yVHlwZUlEKCBzZXRfLkVsZW1lbnRUeXBlKSk7CisgIFdyaXRlSlNPTkludGVnZXIoIHNldF8uQ291bnQpOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZVNldEVuZDsKK2JlZ2luCisgIFdyaXRlSlNPTkFycmF5RW5kOworZW5kOworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVCb29sKCBiOiBCb29sZWFuKTsKK2JlZ2luCisgIGlmIGIKKyAgdGhlbiBXcml0ZUpTT05JbnRlZ2VyKCAxKQorICBlbHNlIFdyaXRlSlNPTkludGVnZXIoIDApOworZW5kOworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7CitiZWdpbgorICBXcml0ZUpTT05JbnRlZ2VyKCBiKTsKK2VuZDsKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlSTE2KCBpMTY6IFNtYWxsSW50KTsKK2JlZ2luCisgIFdyaXRlSlNPTkludGVnZXIoIGkxNik7CitlbmQ7CisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUkzMiggaTMyOiBJbnRlZ2VyKTsKK2JlZ2luCisgIFdyaXRlSlNPTkludGVnZXIoIGkzMik7CitlbmQ7CisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUk2NCggY29uc3QgaTY0OiBJbnQ2NCk7CitiZWdpbgorICBXcml0ZUpTT05JbnRlZ2VyKGk2NCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZURvdWJsZSggY29uc3QgZDogRG91YmxlKTsKK2JlZ2luCisgIFdyaXRlSlNPTkRvdWJsZSggZCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZVN0cmluZyggY29uc3Qgczogc3RyaW5nICk7CitiZWdpbgorICBXcml0ZUpTT05TdHJpbmcoIFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKCBzKSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsKK2JlZ2luCisgIFdyaXRlSlNPTkJhc2U2NCggYik7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEpTT05TdHJpbmcoIHNraXBDb250ZXh0IDogQm9vbGVhbikgOiBUQnl0ZXM7Cit2YXIgYnVmZmVyIDogVE1lbW9yeVN0cmVhbTsKKyAgICBjaCAgOiBCeXRlOworICAgIHdjaCA6IFdvcmQ7CisgICAgaGlnaFN1cm9nYXRlOiBDaGFyOworICAgIHN1cnJvZ2F0ZVBhaXJzOiBBcnJheVswLi4xXSBvZiBDaGFyOworICAgIG9mZiA6IEludGVnZXI7CisgICAgdG1wIDogVEJ5dGVzOworYmVnaW4KKyAgaGlnaFN1cm9nYXRlIDo9ICMwOworICBidWZmZXIgOj0gVE1lbW9yeVN0cmVhbS5DcmVhdGU7CisgIHRyeQorICAgIGlmIG5vdCBza2lwQ29udGV4dAorICAgIHRoZW4gRkNvbnRleHQuUmVhZDsKKworICAgIFJlYWRKU09OU3ludGF4Q2hhciggUVVPVEVbMF0pOworCisgICAgd2hpbGUgVFJVRSBkbyBiZWdpbgorICAgICAgY2ggOj0gRlJlYWRlci5SZWFkOworCisgICAgICBpZiAoY2ggPSBRVU9URVswXSkKKyAgICAgIHRoZW4gQnJlYWs7CisKKyAgICAgIC8vIGNoZWNrIGZvciBlc2NhcGVzCisgICAgICBpZiAoY2ggPD4gRVNDU0VRWzBdKSB0aGVuIGJlZ2luCisgICAgICAgIGJ1ZmZlci5Xcml0ZSggY2gsIDEpOworICAgICAgICBDb250aW51ZTsKKyAgICAgIGVuZDsKKworICAgICAgLy8gZGlzdHVpbmd1aXNoIGJldHdlZW4gXHVOTk5OIGFuZCBcPworICAgICAgY2ggOj0gRlJlYWRlci5SZWFkOworICAgICAgaWYgKGNoIDw+IEVTQ1NFUVsxXSkKKyAgICAgIHRoZW4gYmVnaW4KKyAgICAgICAgb2ZmIDo9IFBvcyggQ2hhcihjaCksIEVTQ0FQRV9DSEFSUyk7CisgICAgICAgIGlmIG9mZiA8IDEKKyAgICAgICAgdGhlbiByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ0V4cGVjdGVkIGNvbnRyb2wgY2hhcicpOworICAgICAgICBjaCA6PSBCeXRlKCBFU0NBUEVfQ0hBUl9WQUxTW29mZl0pOworICAgICAgICBidWZmZXIuV3JpdGUoIGNoLCAxKTsKKyAgICAgICAgQ29udGludWU7CisgICAgICBlbmQ7CisKKyAgICAgIC8vIGl0IGlzIFx1WFhYWAorICAgICAgU2V0TGVuZ3RoKCB0bXAsIDQpOworICAgICAgVHJhbnNwb3J0LlJlYWRBbGwoIHRtcCwgMCwgNCk7CisgICAgICB3Y2ggOj0gKEhleFZhbCh0bXBbMF0pIHNobCAxMikKKyAgICAgICAgICAgKyAoSGV4VmFsKHRtcFsxXSkgc2hsIDgpCisgICAgICAgICAgICsgKEhleFZhbCh0bXBbMl0pIHNobCA0KQorICAgICAgICAgICArICBIZXhWYWwodG1wWzNdKTsKKworICAgICAgLy8gd2UgbmVlZCB0byBtYWtlIFVURjggYnl0ZXMgZnJvbSBpdCwgdG8gYmUgZGVjb2RlZCBsYXRlcgorICAgICAgaWYgQ2hhclV0aWxzLklzSGlnaFN1cnJvZ2F0ZShjaGFyKHdjaCkpIHRoZW4gYmVnaW4KKyAgICAgICAgaWYgaGlnaFN1cm9nYXRlIDw+ICMwCisgICAgICAgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXInKTsKKyAgICAgICAgaGlnaFN1cm9nYXRlIDo9IGNoYXIod2NoKTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBDaGFyVXRpbHMuSXNMb3dTdXJyb2dhdGUoY2hhcih3Y2gpKSB0aGVuIGJlZ2luCisgICAgICAgIGlmIGhpZ2hTdXJvZ2F0ZSA9ICMwCisgICAgICAgIHRoZW4gVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdFeHBlY3RlZCBoaWdoIHN1cnJvZ2F0ZSBjaGFyJyk7CisgICAgICAgIHN1cnJvZ2F0ZVBhaXJzWzBdIDo9IGhpZ2hTdXJvZ2F0ZTsKKyAgICAgICAgc3Vycm9nYXRlUGFpcnNbMV0gOj0gY2hhcih3Y2gpOworICAgICAgICB0bXAgOj0gVEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoc3Vycm9nYXRlUGFpcnMpOworICAgICAgICBidWZmZXIuV3JpdGUoIHRtcFswXSwgTGVuZ3RoKHRtcCkpOworICAgICAgICBoaWdoU3Vyb2dhdGUgOj0gIzA7CisgICAgICBlbmQKKyAgICAgIGVsc2UgYmVnaW4KKyAgICAgICAgdG1wIDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKENoYXIod2NoKSk7CisgICAgICAgIGJ1ZmZlci5Xcml0ZSggdG1wWzBdLCBMZW5ndGgodG1wKSk7CisgICAgICBlbmQ7CisgICAgZW5kOworCisgICAgaWYgaGlnaFN1cm9nYXRlIDw+ICMwCisgICAgdGhlbiByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ0V4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhcicpOworCisgICAgU2V0TGVuZ3RoKCByZXN1bHQsIGJ1ZmZlci5TaXplKTsKKyAgICBpZiBidWZmZXIuU2l6ZSA+IDAgdGhlbiBNb3ZlKCBidWZmZXIuTWVtb3J5XiwgcmVzdWx0WzBdLCBMZW5ndGgocmVzdWx0KSk7CisKKyAgZmluYWxseQorICAgIGJ1ZmZlci5GcmVlOworICBlbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuSXNKU09OTnVtZXJpYyggYiA6IEJ5dGUpIDogQm9vbGVhbjsKK2NvbnN0IE5VTUNIQVJTID0gWycrJywnLScsJy4nLCcwJywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnRScsJ2UnXTsKK2JlZ2luCisgIHJlc3VsdCA6PSBDaGFySW5TZXQoIENoYXIoYiksIE5VTUNIQVJTKTsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkSlNPTk51bWVyaWNDaGFycyA6IHN0cmluZzsKK3ZhciBzdHJibGQgOiBUVGhyaWZ0U3RyaW5nQnVpbGRlcjsKKyAgICBjaCA6IEJ5dGU7CitiZWdpbgorICBzdHJibGQgOj0gVFRocmlmdFN0cmluZ0J1aWxkZXIuQ3JlYXRlOworICB0cnkKKyAgICB3aGlsZSBUUlVFIGRvIGJlZ2luCisgICAgICBjaCA6PSBGUmVhZGVyLlBlZWs7CisgICAgICBpZiBJc0pTT05OdW1lcmljKGNoKQorICAgICAgdGhlbiBzdHJibGQuQXBwZW5kKCBDaGFyKEZSZWFkZXIuUmVhZCkpCisgICAgICBlbHNlIEJyZWFrOworICAgIGVuZDsKKyAgICByZXN1bHQgOj0gc3RyYmxkLlRvU3RyaW5nOworCisgIGZpbmFsbHkKKyAgICBzdHJibGQuRnJlZTsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRKU09OSW50ZWdlciA6IEludDY0OwordmFyIHN0ciA6IHN0cmluZzsKK2JlZ2luCisgIEZDb250ZXh0LlJlYWQ7CisgIGlmIEZDb250ZXh0LkVzY2FwZU51bWJlcnMKKyAgdGhlbiBSZWFkSlNPTlN5bnRheENoYXIoIFFVT1RFWzBdKTsKKworICBzdHIgOj0gUmVhZEpTT05OdW1lcmljQ2hhcnM7CisKKyAgaWYgRkNvbnRleHQuRXNjYXBlTnVtYmVycworICB0aGVuIFJlYWRKU09OU3ludGF4Q2hhciggUVVPVEVbMF0pOworCisgIHRyeQorICAgIHJlc3VsdCA6PSBTdHJUb0ludDY0KHN0cik7CisgIGV4Y2VwdAorICAgIG9uIGU6RXhjZXB0aW9uIGRvIGJlZ2luCisgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ0JhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEgKCcrc3RyKycpICgnK2UuTWVzc2FnZSsnKScpOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRKU09ORG91YmxlIDogRG91YmxlOwordmFyIGR1YiA6IERvdWJsZTsKKyAgICBzdHIgOiBzdHJpbmc7CitiZWdpbgorICBGQ29udGV4dC5SZWFkOworCisgIGlmIEZSZWFkZXIuUGVlayA9IFFVT1RFWzBdCisgIHRoZW4gYmVnaW4KKyAgICBzdHIgOj0gU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkSlNPTlN0cmluZyggVFJVRSkpOworICAgIGR1YiA6PSBTdHJUb0Zsb2F0KCBzdHIsIElOVkFSSUFOVF9DVUxUVVJFKTsKKworICAgIGlmIG5vdCBGQ29udGV4dC5Fc2NhcGVOdW1iZXJzKCkKKyAgICBhbmQgbm90IE1hdGguSXNOYU4oZHViKQorICAgIGFuZCBub3QgTWF0aC5Jc0luZmluaXRlKGR1YikKKyAgICB0aGVuIGJlZ2luCisgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiAgU2VsZiBjYXNlCisgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ051bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkJyk7CisgICAgZW5kOworICAgIHJlc3VsdCA6PSBkdWI7CisgICAgRXhpdDsKKyAgZW5kOworCisgIC8vIHdpbGwgdGhyb3cgLSB3ZSBzaG91bGQgaGF2ZSBoYWQgYSBxdW90ZSBpZiBlc2NhcGVOdW0gPT0gdHJ1ZQorICBpZiBGQ29udGV4dC5Fc2NhcGVOdW1iZXJzCisgIHRoZW4gUmVhZEpTT05TeW50YXhDaGFyKCBRVU9URVswXSk7CisKKyAgdHJ5CisgICAgc3RyIDo9IFJlYWRKU09OTnVtZXJpY0NoYXJzOworICAgIHJlc3VsdCA6PSBTdHJUb0Zsb2F0KCBzdHIsIElOVkFSSUFOVF9DVUxUVVJFKTsKKyAgZXhjZXB0CisgICAgb24gZTpFeGNlcHRpb24KKyAgICBkbyByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ0JhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEgKCcrc3RyKycpICgnK2UuTWVzc2FnZSsnKScpOworICBlbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEpTT05CYXNlNjQgOiBUQnl0ZXM7Cit2YXIgYiA6IFRCeXRlczsKKyAgICBsZW4sIG9mZiwgc2l6ZSA6IEludGVnZXI7CitiZWdpbgorICBiIDo9IFJlYWRKU09OU3RyaW5nKGZhbHNlKTsKKworICBsZW4gOj0gTGVuZ3RoKGIpOworICBvZmYgOj0gMDsKKyAgc2l6ZSA6PSAwOworCisgIC8vIHJlZHVjZSBsZW4gdG8gaWdub3JlIGZpbGwgYnl0ZXMKKyAgRGVjKGxlbik7CisgIHdoaWxlIChsZW4gPj0gMCkgYW5kIChiW2xlbl0gPSBCeXRlKCc9JykpIGRvIERlYyhsZW4pOworICBJbmMobGVuKTsKKworICAvLyByZWFkICYgZGVjb2RlIGZ1bGwgYnl0ZSB0cmlwbGV0cyA9IDQgc291cmNlIGJ5dGVzCisgIHdoaWxlIChsZW4gPj0gNCkgZG8gYmVnaW4KKyAgICAvLyBEZWNvZGUgNCBieXRlcyBhdCBhIHRpbWUKKyAgICBJbmMoIHNpemUsIEJhc2U2NFV0aWxzLkRlY29kZSggYiwgb2ZmLCA0LCBiLCBzaXplKSk7IC8vIGRlY29kZWQgaW4gcGxhY2UKKyAgICBJbmMoIG9mZiwgNCk7CisgICAgRGVjKCBsZW4sIDQpOworICBlbmQ7CisKKyAgLy8gRG9uJ3QgZGVjb2RlIGlmIHdlIGhpdCB0aGUgZW5kIG9yIGdvdCBhIHNpbmdsZSBsZWZ0b3ZlciBieXRlIChpbnZhbGlkCisgIC8vIGJhc2U2NCBidXQgbGVnYWwgZm9yIHNraXAgb2YgcmVndWxhciBzdHJpbmcgdHlwZSkKKyAgaWYgbGVuID4gMSB0aGVuIGJlZ2luCisgICAgLy8gRGVjb2RlIHJlbWFpbmRlcgorICAgIEluYyggc2l6ZSwgQmFzZTY0VXRpbHMuRGVjb2RlKCBiLCBvZmYsIGxlbiwgYiwgc2l6ZSkpOyAvLyBkZWNvZGVkIGluIHBsYWNlCisgIGVuZDsKKworICAvLyByZXNpemUgdG8gZmluYWwgc2l6ZSBhbmQgcmV0dXJuIHRoZSBkYXRhCisgIFNldExlbmd0aCggYiwgc2l6ZSk7CisgIHJlc3VsdCA6PSBiOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5SZWFkSlNPTk9iamVjdFN0YXJ0OworYmVnaW4KKyAgRkNvbnRleHQuUmVhZDsKKyAgUmVhZEpTT05TeW50YXhDaGFyKCBMQlJBQ0VbMF0pOworICBQdXNoQ29udGV4dCggVEpTT05QYWlyQ29udGV4dC5DcmVhdGUoIFNlbGYpKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuUmVhZEpTT05PYmplY3RFbmQ7CitiZWdpbgorICBSZWFkSlNPTlN5bnRheENoYXIoIFJCUkFDRVswXSk7CisgIFBvcENvbnRleHQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRKU09OQXJyYXlTdGFydDsKK2JlZ2luCisgIEZDb250ZXh0LlJlYWQ7CisgIFJlYWRKU09OU3ludGF4Q2hhciggTEJSQUNLRVRbMF0pOworICBQdXNoQ29udGV4dCggVEpTT05MaXN0Q29udGV4dC5DcmVhdGUoIFNlbGYpKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuUmVhZEpTT05BcnJheUVuZDsKK2JlZ2luCisgIFJlYWRKU09OU3ludGF4Q2hhciggUkJSQUNLRVRbMF0pOworICBQb3BDb250ZXh0OworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOworYmVnaW4KKyAgUmVzZXRDb250ZXh0U3RhY2s7ICAvLyBUSFJJRlQtMTQ3MworCisgIEluaXQoIHJlc3VsdCk7CisgIFJlYWRKU09OQXJyYXlTdGFydDsKKworICBpZiBSZWFkSlNPTkludGVnZXIgPD4gVkVSU0lPTgorICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkJhZFZlcnNpb24uQ3JlYXRlKCdNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4nKTsKKworICByZXN1bHQuTmFtZSAgOj0gU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkSlNPTlN0cmluZyggRkFMU0UpKTsKKyAgcmVzdWx0LlR5cGVfIDo9IFRNZXNzYWdlVHlwZSggUmVhZEpTT05JbnRlZ2VyKTsKKyAgcmVzdWx0LlNlcUlEIDo9IFJlYWRKU09OSW50ZWdlcjsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuUmVhZE1lc3NhZ2VFbmQ7CitiZWdpbgorICBSZWFkSlNPTkFycmF5RW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRTdHJ1Y3RCZWdpbiA6IFRUaHJpZnRTdHJ1Y3QgOworYmVnaW4KKyAgUmVhZEpTT05PYmplY3RTdGFydDsKKyAgSW5pdCggcmVzdWx0KTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuUmVhZFN0cnVjdEVuZDsKK2JlZ2luCisgIFJlYWRKU09OT2JqZWN0RW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRGaWVsZEJlZ2luIDogVFRocmlmdEZpZWxkOwordmFyIGNoIDogQnl0ZTsKKyAgICBzdHIgOiBzdHJpbmc7CitiZWdpbgorICBJbml0KCByZXN1bHQpOworICBjaCA6PSBGUmVhZGVyLlBlZWs7CisgIGlmIGNoID0gUkJSQUNFWzBdCisgIHRoZW4gcmVzdWx0LlR5cGVfIDo9IFRUeXBlLlN0b3AKKyAgZWxzZSBiZWdpbgorICAgIHJlc3VsdC5JRCA6PSBSZWFkSlNPTkludGVnZXI7CisgICAgUmVhZEpTT05PYmplY3RTdGFydDsKKworICAgIHN0ciA6PSBTeXNVdGlscy5URW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoIFJlYWRKU09OU3RyaW5nKCBGQUxTRSkpOworICAgIHJlc3VsdC5UeXBlXyA6PSBHZXRUeXBlSURGb3JUeXBlTmFtZSggc3RyKTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5SZWFkRmllbGRFbmQ7CitiZWdpbgorICBSZWFkSlNPTk9iamVjdEVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkTWFwQmVnaW4gOiBUVGhyaWZ0TWFwOwordmFyIHN0ciA6IHN0cmluZzsKK2JlZ2luCisgIEluaXQoIHJlc3VsdCk7CisgIFJlYWRKU09OQXJyYXlTdGFydDsKKworICBzdHIgOj0gU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkSlNPTlN0cmluZyhGQUxTRSkpOworICByZXN1bHQuS2V5VHlwZSA6PSBHZXRUeXBlSURGb3JUeXBlTmFtZSggc3RyKTsKKworICBzdHIgOj0gU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkSlNPTlN0cmluZyhGQUxTRSkpOworICByZXN1bHQuVmFsdWVUeXBlIDo9IEdldFR5cGVJREZvclR5cGVOYW1lKCBzdHIpOworCisgIHJlc3VsdC5Db3VudCA6PSBSZWFkSlNPTkludGVnZXI7CisgIFJlYWRKU09OT2JqZWN0U3RhcnQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRNYXBFbmQ7CitiZWdpbgorICBSZWFkSlNPTk9iamVjdEVuZDsKKyAgUmVhZEpTT05BcnJheUVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkTGlzdEJlZ2luIDogVFRocmlmdExpc3Q7Cit2YXIgc3RyIDogc3RyaW5nOworYmVnaW4KKyAgSW5pdCggcmVzdWx0KTsKKyAgUmVhZEpTT05BcnJheVN0YXJ0OworCisgIHN0ciA6PSBTeXNVdGlscy5URW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoIFJlYWRKU09OU3RyaW5nKEZBTFNFKSk7CisgIHJlc3VsdC5FbGVtZW50VHlwZSA6PSBHZXRUeXBlSURGb3JUeXBlTmFtZSggc3RyKTsKKyAgcmVzdWx0LkNvdW50IDo9IFJlYWRKU09OSW50ZWdlcjsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuUmVhZExpc3RFbmQ7CitiZWdpbgorICBSZWFkSlNPTkFycmF5RW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRTZXRCZWdpbiA6IFRUaHJpZnRTZXQ7Cit2YXIgc3RyIDogc3RyaW5nOworYmVnaW4KKyAgSW5pdCggcmVzdWx0KTsKKyAgUmVhZEpTT05BcnJheVN0YXJ0OworCisgIHN0ciA6PSBTeXNVdGlscy5URW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoIFJlYWRKU09OU3RyaW5nKEZBTFNFKSk7CisgIHJlc3VsdC5FbGVtZW50VHlwZSA6PSBHZXRUeXBlSURGb3JUeXBlTmFtZSggc3RyKTsKKyAgcmVzdWx0LkNvdW50IDo9IFJlYWRKU09OSW50ZWdlcjsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuUmVhZFNldEVuZDsKK2JlZ2luCisgIFJlYWRKU09OQXJyYXlFbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEJvb2wgOiBCb29sZWFuOworYmVnaW4KKyAgcmVzdWx0IDo9IChSZWFkSlNPTkludGVnZXIgPD4gMCk7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEJ5dGUgOiBTaG9ydEludDsKK2JlZ2luCisgIHJlc3VsdCA6PSBSZWFkSlNPTkludGVnZXI7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEkxNiA6IFNtYWxsSW50OworYmVnaW4KKyAgcmVzdWx0IDo9IFJlYWRKU09OSW50ZWdlcjsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkSTMyIDogTG9uZ0ludDsKK2JlZ2luCisgIHJlc3VsdCA6PSBSZWFkSlNPTkludGVnZXI7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEk2NCA6IEludDY0OworYmVnaW4KKyAgcmVzdWx0IDo9IFJlYWRKU09OSW50ZWdlcjsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkRG91YmxlIDogRG91YmxlOworYmVnaW4KKyAgcmVzdWx0IDo9IFJlYWRKU09ORG91YmxlOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRTdHJpbmcgOiBzdHJpbmc7CitiZWdpbgorICByZXN1bHQgOj0gU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkSlNPTlN0cmluZyggRkFMU0UpKTsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkQmluYXJ5IDogVEJ5dGVzOworYmVnaW4KKyAgcmVzdWx0IDo9IFJlYWRKU09OQmFzZTY0OworZW5kOworCisKKy8vLS0tIGluaXQgY29kZSAtLS0KKworcHJvY2VkdXJlIEluaXRCeXRlcyggdmFyIGIgOiBUQnl0ZXM7IGFEYXRhIDogYXJyYXkgb2YgQnl0ZSk7CitiZWdpbgorICBTZXRMZW5ndGgoIGIsIExlbmd0aChhRGF0YSkpOworICBNb3ZlKCBhRGF0YSwgYlswXSwgTGVuZ3RoKGIpKTsKK2VuZDsKKworaW5pdGlhbGl6YXRpb24KKyAgSW5pdEJ5dGVzKCBDT01NQSwgICAgIFtCeXRlKCcsJyldKTsKKyAgSW5pdEJ5dGVzKCBDT0xPTiwgICAgIFtCeXRlKCc6JyldKTsKKyAgSW5pdEJ5dGVzKCBMQlJBQ0UsICAgIFtCeXRlKCd7JyldKTsKKyAgSW5pdEJ5dGVzKCBSQlJBQ0UsICAgIFtCeXRlKCd9JyldKTsKKyAgSW5pdEJ5dGVzKCBMQlJBQ0tFVCwgIFtCeXRlKCdbJyldKTsKKyAgSW5pdEJ5dGVzKCBSQlJBQ0tFVCwgIFtCeXRlKCddJyldKTsKKyAgSW5pdEJ5dGVzKCBRVU9URSwgICAgIFtCeXRlKCciJyldKTsKKyAgSW5pdEJ5dGVzKCBCQUNLU0xBU0gsIFtCeXRlKCdcJyldKTsKKyAgSW5pdEJ5dGVzKCBFU0NTRVEsICAgIFtCeXRlKCdcJyksQnl0ZSgndScpLEJ5dGUoJzAnKSxCeXRlKCcwJyldKTsKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXgucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleC5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhMzgzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXgucGFzCkBAIC0wLDAgKzEsMTA3IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleDsKKworaW50ZXJmYWNlCisKK3VzZXMgVGhyaWZ0LlByb3RvY29sOworCit7IFRNdWx0aXBsZXhlZFByb3RvY29sIGlzIGEgcHJvdG9jb2wtaW5kZXBlbmRlbnQgY29uY3JldGUgZGVjb3JhdG9yCisgIHRoYXQgYWxsb3dzIGEgVGhyaWZ0IGNsaWVudCB0byBjb21tdW5pY2F0ZSB3aXRoIGEgbXVsdGlwbGV4aW5nIFRocmlmdCBzZXJ2ZXIsCisgIGJ5IHByZXBlbmRpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSBkdXJpbmcgZnVuY3Rpb24gY2FsbHMuCisKKyAgTk9URTogVEhJUyBJUyBOT1QgVVNFRCBCWSBTRVJWRVJTLgorICBPbiB0aGUgc2VydmVyLCB1c2UgVE11bHRpcGxleGVkUHJvY2Vzc29yIHRvIGhhbmRsZSByZXF1ZXN0cyBmcm9tIGEgbXVsdGlwbGV4aW5nIGNsaWVudC4KKworICBUaGlzIGV4YW1wbGUgdXNlcyBhIHNpbmdsZSBzb2NrZXQgdHJhbnNwb3J0IHRvIGludm9rZSB0d28gc2VydmljZXM6CisKKyAgICAgIFRTb2NrZXQgdHJhbnNwb3J0ID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOworICAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKworICAgICAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworCisgICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIkNhbGN1bGF0b3IiKTsKKyAgICAgIENhbGN1bGF0b3IuQ2xpZW50IHNlcnZpY2UgPSBuZXcgQ2FsY3VsYXRvci5DbGllbnQobXApOworCisgICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcDIgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJXZWF0aGVyUmVwb3J0Iik7CisgICAgICBXZWF0aGVyUmVwb3J0LkNsaWVudCBzZXJ2aWNlMiA9IG5ldyBXZWF0aGVyUmVwb3J0LkNsaWVudChtcDIpOworCisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZS5hZGQoMiwyKSk7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZTIuZ2V0VGVtcGVyYXR1cmUoKSk7CisKK30KKwordHlwZQorICBUTXVsdGlwbGV4ZWRQcm90b2NvbCA9IGNsYXNzKCBUUHJvdG9jb2xEZWNvcmF0b3IpCisgIHB1YmxpYyBjb25zdAorICAgIHsgIFVzZWQgdG8gZGVsaW1pdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIGZ1bmN0aW9uIG5hbWUgfQorICAgIFNFUEFSQVRPUiA9ICc6JzsKKworICBwcml2YXRlCisgICAgIEZTZXJ2aWNlTmFtZSA6IFN0cmluZzsKKworICBwdWJsaWMKKyAgICB7IFdyYXAgdGhlIHNwZWNpZmllZCBwcm90b2NvbCwgYWxsb3dpbmcgaXQgdG8gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGEgbXVsdGlwbGV4aW5nIHNlcnZlci4KKyAgICAgIFRoZSBzZXJ2aWNlTmFtZSBpcyByZXF1aXJlZCBhcyBpdCBpcyBwcmVwZW5kZWQgdG8gdGhlIG1lc3NhZ2UgaGVhZGVyIHNvIHRoYXQgdGhlIG11bHRpcGxleGluZworICAgICAgc2VydmVyIGNhbiBicm9rZXIgdGhlIGZ1bmN0aW9uIGNhbGwgdG8gdGhlIHByb3BlciBzZXJ2aWNlLgorCisgICAgICBBcmdzOgorICAgICAgICBwcm90b2NvbCAuLi4uLi4uIFlvdXIgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBvZiBjaG9pY2UsIGUuZy4gVEJpbmFyeVByb3RvY29sLgorICAgICAgICBzZXJ2aWNlTmFtZSAuLi4uIFRoZSBzZXJ2aWNlIG5hbWUgb2YgdGhlIHNlcnZpY2UgY29tbXVuaWNhdGluZyB2aWEgdGhpcyBwcm90b2NvbC4KKyAgICB9CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhUHJvdG9jb2wgOiBJUHJvdG9jb2w7IGNvbnN0IGFTZXJ2aWNlTmFtZSA6IHN0cmluZyk7CisKKyAgICB7IFByZXBlbmRzIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUsIHNlcGFyYXRlZCBieSBTRVBBUkFUT1IuCisgICAgICBBcmdzOiBUaGUgb3JpZ2luYWwgbWVzc2FnZS4KKyAgICB9CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsgb3ZlcnJpZGU7CisgIGVuZDsKKworCitpbXBsZW1lbnRhdGlvbgorCisKK2NvbnN0cnVjdG9yIFRNdWx0aXBsZXhlZFByb3RvY29sLkNyZWF0ZShjb25zdCBhUHJvdG9jb2w6IElQcm90b2NvbDsgY29uc3QgYVNlcnZpY2VOYW1lOiBzdHJpbmcpOworYmVnaW4KKyAgQVNTRVJUKCBhU2VydmljZU5hbWUgPD4gJycpOworICBpbmhlcml0ZWQgQ3JlYXRlKGFQcm90b2NvbCk7CisgIEZTZXJ2aWNlTmFtZSA6PSBhU2VydmljZU5hbWU7CitlbmQ7CisKKworcHJvY2VkdXJlIFRNdWx0aXBsZXhlZFByb3RvY29sLldyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsKKy8vIFByZXBlbmRzIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUsIHNlcGFyYXRlZCBieSBUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IuCit2YXIgbmV3TXNnIDogVFRocmlmdE1lc3NhZ2U7CitiZWdpbgorICBjYXNlIG1zZy5UeXBlXyBvZgorICAgIFRNZXNzYWdlVHlwZS5DYWxsLAorICAgIFRNZXNzYWdlVHlwZS5PbmV3YXkgOiBiZWdpbgorICAgICAgSW5pdCggbmV3TXNnLCBGU2VydmljZU5hbWUgKyBTRVBBUkFUT1IgKyBtc2cuTmFtZSwgbXNnLlR5cGVfLCBtc2cuU2VxSUQpOworICAgICAgaW5oZXJpdGVkIFdyaXRlTWVzc2FnZUJlZ2luKCBuZXdNc2cpOworICAgIGVuZDsKKworICBlbHNlCisgICAgaW5oZXJpdGVkIFdyaXRlTWVzc2FnZUJlZ2luKCBtc2cpOworICBlbmQ7CitlbmQ7CisKKworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjUwOWNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLnBhcwpAQCAtMCwwICsxLDEzODkgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworeyRTQ09QRURFTlVNUyBPTn0KKwordW5pdCBUaHJpZnQuUHJvdG9jb2w7CisKK2ludGVyZmFjZQorCit1c2VzCisgIENsYXNzZXMsCisgIFN5c1V0aWxzLAorICBDb250bnJzLAorICBUaHJpZnQuRXhjZXB0aW9uLAorICBUaHJpZnQuU3RyZWFtLAorICBUaHJpZnQuQ29sbGVjdGlvbnMsCisgIFRocmlmdC5UcmFuc3BvcnQ7CisKK3R5cGUKKworICBUVHlwZSA9ICgKKyAgICBTdG9wID0gMCwKKyAgICBWb2lkID0gMSwKKyAgICBCb29sXyA9IDIsCisgICAgQnl0ZV8gPSAzLAorICAgIERvdWJsZV8gPSA0LAorICAgIEkxNiA9IDYsCisgICAgSTMyID0gOCwKKyAgICBJNjQgPSAxMCwKKyAgICBTdHJpbmdfID0gMTEsCisgICAgU3RydWN0ID0gMTIsCisgICAgTWFwID0gMTMsCisgICAgU2V0XyA9IDE0LAorICAgIExpc3QgPSAxNQorICApOworCisgIFRNZXNzYWdlVHlwZSA9ICgKKyAgICBDYWxsID0gMSwKKyAgICBSZXBseSA9IDIsCisgICAgRXhjZXB0aW9uID0gMywKKyAgICBPbmV3YXkgPSA0CisgICk7CisKK2NvbnN0CisgIFZBTElEX1RUWVBFUyA9IFsKKyAgICBUVHlwZS5TdG9wLCBUVHlwZS5Wb2lkLAorICAgIFRUeXBlLkJvb2xfLCBUVHlwZS5CeXRlXywgVFR5cGUuRG91YmxlXywgVFR5cGUuSTE2LCBUVHlwZS5JMzIsIFRUeXBlLkk2NCwgVFR5cGUuU3RyaW5nXywKKyAgICBUVHlwZS5TdHJ1Y3QsIFRUeXBlLk1hcCwgVFR5cGUuU2V0XywgVFR5cGUuTGlzdAorICBdOworCisgIFZBTElEX01FU1NBR0VUWVBFUyA9IFtMb3coVE1lc3NhZ2VUeXBlKS4uSGlnaChUTWVzc2FnZVR5cGUpXTsKKworY29uc3QKKyAgREVGQVVMVF9SRUNVUlNJT05fTElNSVQgPSA2NDsKKwordHlwZQorICBJUHJvdG9jb2wgPSBpbnRlcmZhY2U7CisKKyAgVFRocmlmdE1lc3NhZ2UgPSByZWNvcmQKKyAgICBOYW1lOiBzdHJpbmc7CisgICAgVHlwZV86IFRNZXNzYWdlVHlwZTsKKyAgICBTZXFJRDogSW50ZWdlcjsKKyAgZW5kOworCisgIFRUaHJpZnRTdHJ1Y3QgPSByZWNvcmQKKyAgICBOYW1lOiBzdHJpbmc7CisgIGVuZDsKKworICBUVGhyaWZ0RmllbGQgPSByZWNvcmQKKyAgICBOYW1lOiBzdHJpbmc7CisgICAgVHlwZV86IFRUeXBlOworICAgIElkOiBTbWFsbEludDsKKyAgZW5kOworCisgIFRUaHJpZnRMaXN0ID0gcmVjb3JkCisgICAgRWxlbWVudFR5cGU6IFRUeXBlOworICAgIENvdW50OiBJbnRlZ2VyOworICBlbmQ7CisKKyAgVFRocmlmdE1hcCA9IHJlY29yZAorICAgIEtleVR5cGU6IFRUeXBlOworICAgIFZhbHVlVHlwZTogVFR5cGU7CisgICAgQ291bnQ6IEludGVnZXI7CisgIGVuZDsKKworICBUVGhyaWZ0U2V0ID0gcmVjb3JkCisgICAgRWxlbWVudFR5cGU6IFRUeXBlOworICAgIENvdW50OiBJbnRlZ2VyOworICBlbmQ7CisKKworCisgIElQcm90b2NvbEZhY3RvcnkgPSBpbnRlcmZhY2UKKyAgICBbJ3s3Q0Q2NEExMC00RTlGLTRFOTktOTNCRi03MDhBMzFGNEE2N0J9J10KKyAgICBmdW5jdGlvbiBHZXRQcm90b2NvbCggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQpOiBJUHJvdG9jb2w7CisgIGVuZDsKKworICBUVGhyaWZ0U3RyaW5nQnVpbGRlciA9IGNsYXNzKCBUU3RyaW5nQnVpbGRlcikKKyAgcHVibGljCisgICAgZnVuY3Rpb24gQXBwZW5kKGNvbnN0IFZhbHVlOiBUQnl0ZXMpOiBUU3RyaW5nQnVpbGRlcjsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gQXBwZW5kKGNvbnN0IFZhbHVlOiBJVGhyaWZ0Q29udGFpbmVyKTogVFN0cmluZ0J1aWxkZXI7IG92ZXJsb2FkOworICBlbmQ7CisKKyAgVFByb3RvY29sRXhjZXB0aW9uID0gY2xhc3MoIFRFeGNlcHRpb24pCisgIHB1YmxpYworICAgIGNvbnN0IC8vIFRPRE8oamVuc2cpOiBjaGFuZ2UgaW50byBlbnVtCisgICAgICBVTktOT1dOID0gMDsKKyAgICAgIElOVkFMSURfREFUQSA9IDE7CisgICAgICBORUdBVElWRV9TSVpFID0gMjsKKyAgICAgIFNJWkVfTElNSVQgPSAzOworICAgICAgQkFEX1ZFUlNJT04gPSA0OworICAgICAgTk9UX0lNUExFTUVOVEVEID0gNTsKKyAgICAgIERFUFRIX0xJTUlUID0gNjsKKyAgcHJvdGVjdGVkCisgICAgY29uc3RydWN0b3IgSGlkZGVuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKKyAgcHVibGljCisgICAgLy8gcHVycG9zZWZ1bGx5IGhpZGUgaW5oZXJpdGVkIGNvbnN0cnVjdG9yCisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTogVFByb3RvY29sRXhjZXB0aW9uOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRQcm90b2NvbEV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZTogVFByb3RvY29sRXhjZXB0aW9uOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRQcm90b2NvbEV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZSggdHlwZV86IEludGVnZXIpOiBUUHJvdG9jb2xFeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFByb3RvY29sRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKCB0eXBlXzogSW50ZWdlcjsgY29uc3QgbXNnOiBzdHJpbmcpOiBUUHJvdG9jb2xFeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFByb3RvY29sRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgIGVuZDsKKworICAvLyBOZWVkZWQgdG8gcmVtb3ZlIGRlcHJlY2F0aW9uIHdhcm5pbmcKKyAgVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQgPSBjbGFzcyBhYnN0cmFjdCAoVFByb3RvY29sRXhjZXB0aW9uKQorICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOworICBlbmQ7CisKKyAgVFByb3RvY29sRXhjZXB0aW9uVW5rbm93biA9IGNsYXNzIChUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFByb3RvY29sRXhjZXB0aW9uTmVnYXRpdmVTaXplID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFByb3RvY29sRXhjZXB0aW9uU2l6ZUxpbWl0ID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFByb3RvY29sRXhjZXB0aW9uQmFkVmVyc2lvbiA9IGNsYXNzIChUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRQcm90b2NvbEV4Y2VwdGlvbk5vdEltcGxlbWVudGVkID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFByb3RvY29sRXhjZXB0aW9uRGVwdGhMaW1pdCA9IGNsYXNzIChUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZCk7CisKKworICBUUHJvdG9jb2xVdGlsID0gY2xhc3MKKyAgcHVibGljCisgICAgY2xhc3MgcHJvY2VkdXJlIFNraXAoIHByb3Q6IElQcm90b2NvbDsgdHlwZV86IFRUeXBlKTsKKyAgZW5kOworCisgIElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXIgPSBpbnRlcmZhY2UKKyAgICBbJ3syOUNBMDMzRi1CQjU2LTQ5QjEtOUVFMy0zMUIxRTgyRkM3QTV9J10KKyAgICAvLyBubyBtZW1iZXJzIHlldAorICBlbmQ7CisKKyAgVFByb3RvY29sUmVjdXJzaW9uVHJhY2tlckltcGwgPSBjbGFzcyBhYnN0cmFjdCggVEludGVyZmFjZWRPYmplY3QsIElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXIpCisgIHByb3RlY3RlZAorICAgIEZQcm90b2NvbCA6IElQcm90b2NvbDsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBwcm90IDogSVByb3RvY29sKTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworICBlbmQ7CisKKyAgSVByb3RvY29sID0gaW50ZXJmYWNlCisgICAgWyd7NjAyQTdGRkItMEQ5RS00Q0Q4LThEN0YtRTUwNzY2NjA1ODhBfSddCisgICAgZnVuY3Rpb24gR2V0VHJhbnNwb3J0OiBJVHJhbnNwb3J0OworICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUVuZDsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOworICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEVuZDsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEVuZDsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZFN0b3A7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwRW5kOworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RFbmQoKTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOworICAgIHByb2NlZHVyZSBXcml0ZVNldEVuZCgpOworICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOworICAgIHByb2NlZHVyZSBXcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsKKyAgICBwcm9jZWR1cmUgV3JpdGVJMTYoIGkxNjogU21hbGxJbnQpOworICAgIHByb2NlZHVyZSBXcml0ZUkzMiggaTMyOiBJbnRlZ2VyKTsKKyAgICBwcm9jZWR1cmUgV3JpdGVJNjQoIGNvbnN0IGk2NDogSW50NjQpOworICAgIHByb2NlZHVyZSBXcml0ZURvdWJsZSggY29uc3QgZDogRG91YmxlKTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJpbmcoIGNvbnN0IHM6IHN0cmluZyApOworICAgIHByb2NlZHVyZSBXcml0ZUFuc2lTdHJpbmcoIGNvbnN0IHM6IEFuc2lTdHJpbmcpOworICAgIHByb2NlZHVyZSBXcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsKKworICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOworICAgIHByb2NlZHVyZSBSZWFkTWVzc2FnZUVuZCgpOworICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsKKyAgICBwcm9jZWR1cmUgUmVhZFN0cnVjdEVuZDsKKyAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOworICAgIHByb2NlZHVyZSBSZWFkRmllbGRFbmQoKTsKKyAgICBmdW5jdGlvbiBSZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7CisgICAgcHJvY2VkdXJlIFJlYWRNYXBFbmQoKTsKKyAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsKKyAgICBwcm9jZWR1cmUgUmVhZExpc3RFbmQoKTsKKyAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7CisgICAgcHJvY2VkdXJlIFJlYWRTZXRFbmQoKTsKKyAgICBmdW5jdGlvbiBSZWFkQm9vbDogQm9vbGVhbjsKKyAgICBmdW5jdGlvbiBSZWFkQnl0ZTogU2hvcnRJbnQ7CisgICAgZnVuY3Rpb24gUmVhZEkxNjogU21hbGxJbnQ7CisgICAgZnVuY3Rpb24gUmVhZEkzMjogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiBSZWFkSTY0OiBJbnQ2NDsKKyAgICBmdW5jdGlvbiBSZWFkRG91YmxlOkRvdWJsZTsKKyAgICBmdW5jdGlvbiBSZWFkQmluYXJ5OiBUQnl0ZXM7CisgICAgZnVuY3Rpb24gUmVhZFN0cmluZzogc3RyaW5nOworICAgIGZ1bmN0aW9uIFJlYWRBbnNpU3RyaW5nOiBBbnNpU3RyaW5nOworCisgICAgcHJvY2VkdXJlIFNldFJlY3Vyc2lvbkxpbWl0KCB2YWx1ZSA6IEludGVnZXIpOworICAgIGZ1bmN0aW9uICBHZXRSZWN1cnNpb25MaW1pdCA6IEludGVnZXI7CisgICAgZnVuY3Rpb24gIE5leHRSZWN1cnNpb25MZXZlbCA6IElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXI7CisgICAgcHJvY2VkdXJlIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoOworICAgIHByb2NlZHVyZSBEZWNyZW1lbnRSZWN1cnNpb25EZXB0aDsKKworICAgIHByb3BlcnR5IFRyYW5zcG9ydDogSVRyYW5zcG9ydCByZWFkIEdldFRyYW5zcG9ydDsKKyAgICBwcm9wZXJ0eSBSZWN1cnNpb25MaW1pdCA6IEludGVnZXIgcmVhZCBHZXRSZWN1cnNpb25MaW1pdCB3cml0ZSBTZXRSZWN1cnNpb25MaW1pdDsKKyAgZW5kOworCisgIFRQcm90b2NvbEltcGwgPSBjbGFzcyBhYnN0cmFjdCggVEludGVyZmFjZWRPYmplY3QsIElQcm90b2NvbCkKKyAgcHJvdGVjdGVkCisgICAgRlRyYW5zIDogSVRyYW5zcG9ydDsKKyAgICBGUmVjdXJzaW9uTGltaXQgOiBJbnRlZ2VyOworICAgIEZSZWN1cnNpb25EZXB0aCA6IEludGVnZXI7CisKKyAgICBwcm9jZWR1cmUgU2V0UmVjdXJzaW9uTGltaXQoIHZhbHVlIDogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gIEdldFJlY3Vyc2lvbkxpbWl0IDogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiAgTmV4dFJlY3Vyc2lvbkxldmVsIDogSVByb3RvY29sUmVjdXJzaW9uVHJhY2tlcjsKKyAgICBwcm9jZWR1cmUgSW5jcmVtZW50UmVjdXJzaW9uRGVwdGg7CisgICAgcHJvY2VkdXJlIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoOworCisgICAgZnVuY3Rpb24gR2V0VHJhbnNwb3J0OiBJVHJhbnNwb3J0OworICBwdWJsaWMKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlRW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RFbmQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEVuZDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRTdG9wOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwRW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEVuZCgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlQm9vbCggYjogQm9vbGVhbik7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlSTE2KCBpMTY6IFNtYWxsSW50KTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlSTMyKCBpMzI6IEludGVnZXIpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVJNjQoIGNvbnN0IGk2NDogSW50NjQpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVEb3VibGUoIGNvbnN0IGQ6IERvdWJsZSk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZVN0cmluZyggY29uc3Qgczogc3RyaW5nICk7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFdyaXRlQW5zaVN0cmluZyggY29uc3QgczogQW5zaVN0cmluZyk7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFdyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKworICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgUmVhZE1lc3NhZ2VFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgUmVhZFN0cnVjdEVuZDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFJlYWRGaWVsZEVuZCgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBSZWFkTWFwRW5kKCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgUmVhZExpc3RFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZFNldEJlZ2luOiBUVGhyaWZ0U2V0OyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgUmVhZFNldEVuZCgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkQm9vbDogQm9vbGVhbjsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZEJ5dGU6IFNob3J0SW50OyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkSTE2OiBTbWFsbEludDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZEkzMjogSW50ZWdlcjsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZEk2NDogSW50NjQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWREb3VibGU6RG91YmxlOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkQmluYXJ5OiBUQnl0ZXM7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRTdHJpbmc6IHN0cmluZzsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBSZWFkQW5zaVN0cmluZzogQW5zaVN0cmluZzsgdmlydHVhbDsKKworICAgIHByb3BlcnR5IFRyYW5zcG9ydDogSVRyYW5zcG9ydCByZWFkIEdldFRyYW5zcG9ydDsKKworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggdHJhbnM6IElUcmFuc3BvcnQgKTsKKyAgZW5kOworCisgIElCYXNlID0gaW50ZXJmYWNlCisgICAgWyd7MDhEOUJBQTgtNUVBQS00MTBGLUI1MEItQUMyRTZFNUU0MTU1fSddCisgICAgZnVuY3Rpb24gVG9TdHJpbmc6IHN0cmluZzsKKyAgICBwcm9jZWR1cmUgUmVhZCggY29uc3QgaXByb3Q6IElQcm90b2NvbCk7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTsKKyAgZW5kOworCisKKyAgVEJpbmFyeVByb3RvY29sSW1wbCA9IGNsYXNzKCBUUHJvdG9jb2xJbXBsICkKKyAgcHJvdGVjdGVkCisgICAgY29uc3QKKyAgICAgIFZFUlNJT05fTUFTSyA6IENhcmRpbmFsID0gJGZmZmYwMDAwOworICAgICAgVkVSU0lPTl8xIDogQ2FyZGluYWwgPSAkODAwMTAwMDA7CisgIHByb3RlY3RlZAorICAgIEZTdHJpY3RSZWFkIDogQm9vbGVhbjsKKyAgICBGU3RyaWN0V3JpdGUgOiBCb29sZWFuOworCisgIHByaXZhdGUKKyAgICBmdW5jdGlvbiBSZWFkQWxsKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIgKTogSW50ZWdlcjsgIGlubGluZTsKKyAgICBmdW5jdGlvbiBSZWFkU3RyaW5nQm9keSggc2l6ZTogSW50ZWdlcik6IHN0cmluZzsKKworICBwdWJsaWMKKworICAgIHR5cGUKKyAgICAgIFRGYWN0b3J5ID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJUHJvdG9jb2xGYWN0b3J5KQorICAgICAgcHJvdGVjdGVkCisgICAgICAgIEZTdHJpY3RSZWFkIDogQm9vbGVhbjsKKyAgICAgICAgRlN0cmljdFdyaXRlIDogQm9vbGVhbjsKKyAgICAgIHB1YmxpYworICAgICAgICBmdW5jdGlvbiBHZXRQcm90b2NvbCggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQpOiBJUHJvdG9jb2w7CisgICAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggQVN0cmljdFJlYWQsIEFTdHJpY3RXcml0ZTogQm9vbGVhbiApOyBvdmVybG9hZDsKKyAgICAgICAgY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsKKyAgICAgIGVuZDsKKworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQpOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IHRyYW5zOiBJVHJhbnNwb3J0OyBzdHJpY3RSZWFkOiBCb29sZWFuOyBzdHJpY3RXcml0ZTogQm9vbGVhbik7IG92ZXJsb2FkOworCisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0RW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkU3RvcDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RFbmQoKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0RW5kKCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUkxNiggaTE2OiBTbWFsbEludCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUkzMiggaTMyOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlSTY0KCBjb25zdCBpNjQ6IEludDY0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRG91YmxlKCBjb25zdCBkOiBEb3VibGUpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7IG92ZXJyaWRlOworCisgICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkTWVzc2FnZUVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkU3RydWN0QmVnaW46IFRUaHJpZnRTdHJ1Y3Q7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkU3RydWN0RW5kOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZEZpZWxkRW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRNYXBFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkTGlzdEVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRCb29sOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkQnl0ZTogU2hvcnRJbnQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRJMTY6IFNtYWxsSW50OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkSTMyOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkSTY0OiBJbnQ2NDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZERvdWJsZTpEb3VibGU7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRCaW5hcnk6IFRCeXRlczsgb3ZlcnJpZGU7CisKKyAgZW5kOworCisKKyAgeyBUUHJvdG9jb2xEZWNvcmF0b3IgZm9yd2FyZHMgYWxsIHJlcXVlc3RzIHRvIGFuIGVuY2xvc2VkIFRQcm90b2NvbCBpbnN0YW5jZSwKKyAgICBwcm92aWRpbmcgYSB3YXkgdG8gYXV0aG9yIGNvbmNpc2UgY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuIFRoZSBkZWNvcmF0b3IKKyAgICBkb2VzIG5vdCAoYW5kIHNob3VsZCBub3QpIG1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIHRoZSBlbmNsb3NlZCBUUHJvdG9jb2wKKworICAgIFNlZSBwLjE3NSBvZiBEZXNpZ24gUGF0dGVybnMgKGJ5IEdhbW1hIGV0IGFsLikKKyAgfQorICBUUHJvdG9jb2xEZWNvcmF0b3IgPSBjbGFzcyggVFByb3RvY29sSW1wbCkKKyAgcHJpdmF0ZQorICAgIEZXcmFwcGVkUHJvdG9jb2wgOiBJUHJvdG9jb2w7CisKKyAgcHVibGljCisgICAgLy8gRW5jbG9zZXMgdGhlIHNwZWNpZmllZCBwcm90b2NvbC4KKyAgICAvLyBBbGwgb3BlcmF0aW9ucyB3aWxsIGJlIGZvcndhcmQgdG8gdGhlIGdpdmVuIHByb3RvY29sLiAgTXVzdCBiZSBub24tbnVsbC4KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFQcm90b2NvbCA6IElQcm90b2NvbCk7CisKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlRW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRTdG9wOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwRW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEVuZCgpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRFbmQoKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlQm9vbCggYjogQm9vbGVhbik7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlSTE2KCBpMTY6IFNtYWxsSW50KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlSTMyKCBpMzI6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVJNjQoIGNvbnN0IGk2NDogSW50NjQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVEb3VibGUoIGNvbnN0IGQ6IERvdWJsZSk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVN0cmluZyggY29uc3Qgczogc3RyaW5nICk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUFuc2lTdHJpbmcoIGNvbnN0IHM6IEFuc2lTdHJpbmcpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7IG92ZXJyaWRlOworCisgICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkTWVzc2FnZUVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkU3RydWN0QmVnaW46IFRUaHJpZnRTdHJ1Y3Q7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkU3RydWN0RW5kOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZEZpZWxkRW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRNYXBFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkTGlzdEVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRCb29sOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkQnl0ZTogU2hvcnRJbnQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRJMTY6IFNtYWxsSW50OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkSTMyOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkSTY0OiBJbnQ2NDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZERvdWJsZTpEb3VibGU7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRCaW5hcnk6IFRCeXRlczsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZFN0cmluZzogc3RyaW5nOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkQW5zaVN0cmluZzogQW5zaVN0cmluZzsgb3ZlcnJpZGU7CisgIGVuZDsKKworCit0eXBlCisgIElSZXF1ZXN0RXZlbnRzID0gaW50ZXJmYWNlCisgICAgWyd7RjkyNkEyNkEtNUIwMC00NTYwLTg2RkEtMkNBRTNCQTczREFGfSddCisgICAgLy8gQ2FsbGVkIGJlZm9yZSByZWFkaW5nIGFyZ3VtZW50cy4KKyAgICBwcm9jZWR1cmUgUHJlUmVhZDsKKyAgICAvLyBDYWxsZWQgYmV0d2VlbiByZWFkaW5nIGFyZ3VtZW50cyBhbmQgY2FsbGluZyB0aGUgaGFuZGxlci4KKyAgICBwcm9jZWR1cmUgUG9zdFJlYWQ7CisgICAgLy8gQ2FsbGVkIGJldHdlZW4gY2FsbGluZyB0aGUgaGFuZGxlciBhbmQgd3JpdGluZyB0aGUgcmVzcG9uc2UuCisgICAgcHJvY2VkdXJlIFByZVdyaXRlOworICAgIC8vIENhbGxlZCBhZnRlciB3cml0aW5nIHRoZSByZXNwb25zZS4KKyAgICBwcm9jZWR1cmUgUG9zdFdyaXRlOworICAgIC8vIENhbGxlZCB3aGVuIGFuIG9uZXdheSAoYXN5bmMpIGZ1bmN0aW9uIGNhbGwgY29tcGxldGVzIHN1Y2Nlc3NmdWxseS4KKyAgICBwcm9jZWR1cmUgT25ld2F5Q29tcGxldGU7CisgICAgLy8gQ2FsbGVkIGlmIHRoZSBoYW5kbGVyIHRocm93cyBhbiB1bmRlY2xhcmVkIGV4Y2VwdGlvbi4KKyAgICBwcm9jZWR1cmUgVW5oYW5kbGVkRXJyb3IoIGNvbnN0IGUgOiBFeGNlcHRpb24pOworICAgIC8vIENhbGxlZCB3aGVuIGEgY2xpZW50IGhhcyBmaW5pc2hlZCByZXF1ZXN0LWhhbmRsaW5nIHRvIGNsZWFuIHVwCisgICAgcHJvY2VkdXJlIENsZWFudXBDb250ZXh0OworICBlbmQ7CisKKworICBJUHJvY2Vzc29yRXZlbnRzID0gaW50ZXJmYWNlCisgICAgWyd7QTg2NjExMTktNjU3Qy00NDdELTkzQzUtNTEyRTM2MTYyQTQ1fSddCisgICAgLy8gQ2FsbGVkIHdoZW4gYSBjbGllbnQgaXMgYWJvdXQgdG8gY2FsbCB0aGUgcHJvY2Vzc29yLgorICAgIHByb2NlZHVyZSBQcm9jZXNzaW5nKCBjb25zdCB0cmFuc3BvcnQgOiBJVHJhbnNwb3J0KTsKKyAgICAvLyBDYWxsZWQgb24gYW55IHNlcnZpY2UgZnVuY3Rpb24gaW52b2NhdGlvbgorICAgIGZ1bmN0aW9uICBDcmVhdGVSZXF1ZXN0Q29udGV4dCggY29uc3QgYUZ1bmN0aW9uTmFtZSA6IHN0cmluZykgOiBJUmVxdWVzdEV2ZW50czsKKyAgICAvLyBDYWxsZWQgd2hlbiBhIGNsaWVudCBoYXMgZmluaXNoZWQgcmVxdWVzdC1oYW5kbGluZyB0byBjbGVhbiB1cAorICAgIHByb2NlZHVyZSBDbGVhbnVwQ29udGV4dDsKKyAgZW5kOworCisKKyAgSVByb2Nlc3NvciA9IGludGVyZmFjZQorICAgIFsnezdCQUU5MkE1LTQ2REEtNEYxMy1CNkVBLTBFQUJFMjMzRUU1Rn0nXQorICAgIGZ1bmN0aW9uIFByb2Nlc3MoIGNvbnN0IGlwcm90IDpJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2w7IGNvbnN0IGV2ZW50cyA6IElQcm9jZXNzb3JFdmVudHMgPSBuaWwpOiBCb29sZWFuOworICBlbmQ7CisKKworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0TWVzc2FnZTsgY29uc3QgQU5hbWU6IHN0cmluZyA9ICcnOyBjb25zdCBBTWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZSA9IExvdyhUTWVzc2FnZVR5cGUpOyBjb25zdCBBU2VxSUQ6IEludGVnZXIgPSAwKTsgIG92ZXJsb2FkOyAgaW5saW5lOworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0U3RydWN0OyAgY29uc3QgQU5hbWU6IHN0cmluZyA9ICcnKTsgIG92ZXJsb2FkOyAgaW5saW5lOworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0RmllbGQ7ICAgY29uc3QgQU5hbWU6IHN0cmluZyA9ICcnOyBjb25zdCBBVHlwZTogVFR5cGUgPSBMb3coVFR5cGUpOyBjb25zdCBBSUQ6IFNtYWxsSW50ID0gMCk7ICBvdmVybG9hZDsgIGlubGluZTsKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdE1hcDsgICAgIGNvbnN0IEFLZXlUeXBlOiBUVHlwZSA9IExvdyhUVHlwZSk7IGNvbnN0IEFWYWx1ZVR5cGU6IFRUeXBlID0gTG93KFRUeXBlKTsgY29uc3QgQUNvdW50OiBJbnRlZ2VyID0gMCk7IG92ZXJsb2FkOyAgaW5saW5lOworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0U2V0OyAgICAgY29uc3QgQUVsZW1lbnRUeXBlOiBUVHlwZSA9IExvdyhUVHlwZSk7IGNvbnN0IEFDb3VudDogSW50ZWdlciA9IDApOyBvdmVybG9hZDsgIGlubGluZTsKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdExpc3Q7ICAgIGNvbnN0IEFFbGVtZW50VHlwZTogVFR5cGUgPSBMb3coVFR5cGUpOyBjb25zdCBBQ291bnQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7ICBpbmxpbmU7CisKKworaW1wbGVtZW50YXRpb24KKworZnVuY3Rpb24gQ29udmVydEludDY0VG9Eb3VibGUoIGNvbnN0IG46IEludDY0KTogRG91YmxlOworYmVnaW4KKyAgQVNTRVJUKCBTaXplT2YobikgPSBTaXplT2YoUmVzdWx0KSk7CisgIFN5c3RlbS5Nb3ZlKCBuLCBSZXN1bHQsIFNpemVPZihSZXN1bHQpKTsKK2VuZDsKKworZnVuY3Rpb24gQ29udmVydERvdWJsZVRvSW50NjQoIGNvbnN0IGQ6IERvdWJsZSk6IEludDY0OworYmVnaW4KKyAgQVNTRVJUKCBTaXplT2YoZCkgPSBTaXplT2YoUmVzdWx0KSk7CisgIFN5c3RlbS5Nb3ZlKCBkLCBSZXN1bHQsIFNpemVPZihSZXN1bHQpKTsKK2VuZDsKKworCisKK3sgVFByb3RvY29sUmVjdXJzaW9uVHJhY2tlckltcGwgfQorCitjb25zdHJ1Y3RvciBUUHJvdG9jb2xSZWN1cnNpb25UcmFja2VySW1wbC5DcmVhdGUoIHByb3QgOiBJUHJvdG9jb2wpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKworICAvLyBzdG9yaW5nIHRoZSBwb2ludGVyICphZnRlciogdGhlIChzdWNjZXNzZnVsKSBpbmNyZW1lbnQgaXMgaW1wb3J0YW50IGhlcmUKKyAgcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aDsKKyAgRlByb3RvY29sIDo9IHByb3Q7CitlbmQ7CisKK2Rlc3RydWN0b3IgVFByb3RvY29sUmVjdXJzaW9uVHJhY2tlckltcGwuRGVzdHJveTsKK2JlZ2luCisgIHRyeQorICAgIC8vIHdlIGhhdmUgdG8gcmVsZWFzZSB0aGUgcmVmZXJlbmNlIGlmZiB0aGUgcG9pbnRlciBoYXMgYmVlbiBzdG9yZWQKKyAgICBpZiBGUHJvdG9jb2wgPD4gbmlsIHRoZW4gYmVnaW4KKyAgICAgIEZQcm90b2NvbC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aDsKKyAgICAgIEZQcm90b2NvbCA6PSBuaWw7CisgICAgZW5kOworICBmaW5hbGx5CisgICAgaW5oZXJpdGVkIERlc3Ryb3k7CisgIGVuZDsKK2VuZDsKKworeyBUUHJvdG9jb2xJbXBsIH0KKworY29uc3RydWN0b3IgVFByb3RvY29sSW1wbC5DcmVhdGUodHJhbnM6IElUcmFuc3BvcnQpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlRyYW5zIDo9IHRyYW5zOworICBGUmVjdXJzaW9uTGltaXQgOj0gREVGQVVMVF9SRUNVUlNJT05fTElNSVQ7CisgIEZSZWN1cnNpb25EZXB0aCA6PSAwOworZW5kOworCitwcm9jZWR1cmUgVFByb3RvY29sSW1wbC5TZXRSZWN1cnNpb25MaW1pdCggdmFsdWUgOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZSZWN1cnNpb25MaW1pdCA6PSB2YWx1ZTsKK2VuZDsKKworZnVuY3Rpb24gVFByb3RvY29sSW1wbC5HZXRSZWN1cnNpb25MaW1pdCA6IEludGVnZXI7CitiZWdpbgorICByZXN1bHQgOj0gRlJlY3Vyc2lvbkxpbWl0OworZW5kOworCitmdW5jdGlvbiBUUHJvdG9jb2xJbXBsLk5leHRSZWN1cnNpb25MZXZlbCA6IElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXI7CitiZWdpbgorICByZXN1bHQgOj0gVFByb3RvY29sUmVjdXJzaW9uVHJhY2tlckltcGwuQ3JlYXRlKFNlbGYpOworZW5kOworCitwcm9jZWR1cmUgVFByb3RvY29sSW1wbC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aDsKK2JlZ2luCisgIGlmIEZSZWN1cnNpb25EZXB0aCA8IEZSZWN1cnNpb25MaW1pdAorICB0aGVuIEluYyhGUmVjdXJzaW9uRGVwdGgpCisgIGVsc2UgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uRGVwdGhMaW1pdC5DcmVhdGUoJ0RlcHRoIGxpbWl0IGV4Y2VlZGVkJyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUUHJvdG9jb2xJbXBsLkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoOworYmVnaW4KKyAgRGVjKEZSZWN1cnNpb25EZXB0aCkKK2VuZDsKKworZnVuY3Rpb24gVFByb3RvY29sSW1wbC5HZXRUcmFuc3BvcnQ6IElUcmFuc3BvcnQ7CitiZWdpbgorICBSZXN1bHQgOj0gRlRyYW5zOworZW5kOworCitmdW5jdGlvbiBUUHJvdG9jb2xJbXBsLlJlYWRBbnNpU3RyaW5nOiBBbnNpU3RyaW5nOwordmFyCisgIGIgOiBUQnl0ZXM7CisgIGxlbiA6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gJyc7CisgIGIgOj0gUmVhZEJpbmFyeTsKKyAgbGVuIDo9IExlbmd0aCggYiApOworICBpZiBsZW4gPiAwIHRoZW4KKyAgYmVnaW4KKyAgICBTZXRMZW5ndGgoIFJlc3VsdCwgbGVuKTsKKyAgICBTeXN0ZW0uTW92ZSggYlswXSwgUG9pbnRlcihSZXN1bHQpXiwgbGVuICk7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVFByb3RvY29sSW1wbC5SZWFkU3RyaW5nOiBzdHJpbmc7CitiZWdpbgorICBSZXN1bHQgOj0gVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkQmluYXJ5ICk7CitlbmQ7CisKK3Byb2NlZHVyZSBUUHJvdG9jb2xJbXBsLldyaXRlQW5zaVN0cmluZyhjb25zdCBzOiBBbnNpU3RyaW5nKTsKK3ZhcgorICBiIDogVEJ5dGVzOworICBsZW4gOiBJbnRlZ2VyOworYmVnaW4KKyAgbGVuIDo9IExlbmd0aChzKTsKKyAgU2V0TGVuZ3RoKCBiLCBsZW4pOworICBpZiBsZW4gPiAwIHRoZW4KKyAgYmVnaW4KKyAgICBTeXN0ZW0uTW92ZSggUG9pbnRlcihzKV4sIGJbMF0sIGxlbiApOworICBlbmQ7CisgIFdyaXRlQmluYXJ5KCBiICk7CitlbmQ7CisKK3Byb2NlZHVyZSBUUHJvdG9jb2xJbXBsLldyaXRlU3RyaW5nKGNvbnN0IHM6IHN0cmluZyk7Cit2YXIKKyAgYiA6IFRCeXRlczsKK2JlZ2luCisgIGIgOj0gVEVuY29kaW5nLlVURjguR2V0Qnl0ZXMocyk7CisgIFdyaXRlQmluYXJ5KCBiICk7CitlbmQ7CisKK3sgVFByb3RvY29sVXRpbCB9CisKK2NsYXNzIHByb2NlZHVyZSBUUHJvdG9jb2xVdGlsLlNraXAoIHByb3Q6IElQcm90b2NvbDsgdHlwZV86IFRUeXBlKTsKK3ZhciBmaWVsZCA6IFRUaHJpZnRGaWVsZDsKKyAgICBtYXAgICA6IFRUaHJpZnRNYXA7CisgICAgc2V0XyAgOiBUVGhyaWZ0U2V0OworICAgIGxpc3QgIDogVFRocmlmdExpc3Q7CisgICAgaSAgICAgOiBJbnRlZ2VyOworICAgIHRyYWNrZXIgOiBJUHJvdG9jb2xSZWN1cnNpb25UcmFja2VyOworYmVnaW4KKyAgdHJhY2tlciA6PSBwcm90Lk5leHRSZWN1cnNpb25MZXZlbDsKKyAgY2FzZSB0eXBlXyBvZgorICAgIC8vIHNpbXBsZSB0eXBlcworICAgIFRUeXBlLkJvb2xfICAgOiAgcHJvdC5SZWFkQm9vbCgpOworICAgIFRUeXBlLkJ5dGVfICAgOiAgcHJvdC5SZWFkQnl0ZSgpOworICAgIFRUeXBlLkkxNiAgICAgOiAgcHJvdC5SZWFkSTE2KCk7CisgICAgVFR5cGUuSTMyICAgICA6ICBwcm90LlJlYWRJMzIoKTsKKyAgICBUVHlwZS5JNjQgICAgIDogIHByb3QuUmVhZEk2NCgpOworICAgIFRUeXBlLkRvdWJsZV8gOiAgcHJvdC5SZWFkRG91YmxlKCk7CisgICAgVFR5cGUuU3RyaW5nXyA6ICBwcm90LlJlYWRCaW5hcnkoKTsvLyBEb24ndCB0cnkgdG8gZGVjb2RlIHRoZSBzdHJpbmcsIGp1c3Qgc2tpcCBpdC4KKworICAgIC8vIHN0cnVjdHVyZWQgdHlwZXMKKyAgICBUVHlwZS5TdHJ1Y3QgOiAgYmVnaW4KKyAgICAgIHByb3QuUmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICB3aGlsZSBUUlVFIGRvIGJlZ2luCisgICAgICAgIGZpZWxkIDo9IHByb3QuUmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgaWYgKGZpZWxkLlR5cGVfID0gVFR5cGUuU3RvcCkgdGhlbiBCcmVhazsKKyAgICAgICAgU2tpcChwcm90LCBmaWVsZC5UeXBlXyk7CisgICAgICAgIHByb3QuUmVhZEZpZWxkRW5kKCk7CisgICAgICBlbmQ7CisgICAgICBwcm90LlJlYWRTdHJ1Y3RFbmQoKTsKKyAgICBlbmQ7CisKKyAgICBUVHlwZS5NYXAgOiAgYmVnaW4KKyAgICAgIG1hcCA6PSBwcm90LlJlYWRNYXBCZWdpbigpOworICAgICAgZm9yIGkgOj0gMCB0byBtYXAuQ291bnQtMSBkbyBiZWdpbgorICAgICAgICBTa2lwKHByb3QsIG1hcC5LZXlUeXBlKTsKKyAgICAgICAgU2tpcChwcm90LCBtYXAuVmFsdWVUeXBlKTsKKyAgICAgIGVuZDsKKyAgICAgIHByb3QuUmVhZE1hcEVuZCgpOworICAgIGVuZDsKKworICAgIFRUeXBlLlNldF8gOiAgYmVnaW4KKyAgICAgIHNldF8gOj0gcHJvdC5SZWFkU2V0QmVnaW4oKTsKKyAgICAgIGZvciBpIDo9IDAgdG8gc2V0Xy5Db3VudC0xCisgICAgICBkbyBTa2lwKCBwcm90LCBzZXRfLkVsZW1lbnRUeXBlKTsKKyAgICAgIHByb3QuUmVhZFNldEVuZCgpOworICAgIGVuZDsKKworICAgIFRUeXBlLkxpc3QgOiAgYmVnaW4KKyAgICAgIGxpc3QgOj0gcHJvdC5SZWFkTGlzdEJlZ2luKCk7CisgICAgICBmb3IgaSA6PSAwIHRvIGxpc3QuQ291bnQtMQorICAgICAgZG8gU2tpcCggcHJvdCwgbGlzdC5FbGVtZW50VHlwZSk7CisgICAgICBwcm90LlJlYWRMaXN0RW5kKCk7CisgICAgZW5kOworCisgIGVsc2UKKyAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ1VuZXhwZWN0ZWQgdHlwZSAnK0ludFRvU3RyKE9yZCh0eXBlXykpKTsKKyAgZW5kOworZW5kOworCisKK3sgVEJpbmFyeVByb3RvY29sSW1wbCB9CisKK2NvbnN0cnVjdG9yIFRCaW5hcnlQcm90b2NvbEltcGwuQ3JlYXRlKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydCk7CitiZWdpbgorICAvL25vIGluaGVyaXRlZAorICBDcmVhdGUoIHRyYW5zLCBGYWxzZSwgVHJ1ZSk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRCaW5hcnlQcm90b2NvbEltcGwuQ3JlYXRlKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydDsgc3RyaWN0UmVhZCwKKyAgc3RyaWN0V3JpdGU6IEJvb2xlYW4pOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZSggdHJhbnMgKTsKKyAgRlN0cmljdFJlYWQgOj0gc3RyaWN0UmVhZDsKKyAgRlN0cmljdFdyaXRlIDo9IHN0cmljdFdyaXRlOworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRBbGwoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlciApOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZUcmFucy5SZWFkQWxsKCBwQnVmLCBidWZsZW4sIG9mZiwgbGVuICk7CitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEJpbmFyeTogVEJ5dGVzOwordmFyCisgIHNpemUgOiBJbnRlZ2VyOworICBidWYgOiBUQnl0ZXM7CitiZWdpbgorICBzaXplIDo9IFJlYWRJMzI7CisgIFNldExlbmd0aCggYnVmLCBzaXplICk7CisgIEZUcmFucy5SZWFkQWxsKCBidWYsIDAsIHNpemUpOworICBSZXN1bHQgOj0gYnVmOworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRCb29sOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IChSZWFkQnl0ZSA9IDEpOworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRCeXRlOiBTaG9ydEludDsKK2JlZ2luCisgIFJlYWRBbGwoIEByZXN1bHQsIFNpemVPZihyZXN1bHQpLCAwLCAxKTsKK2VuZDsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkRG91YmxlOiBEb3VibGU7CitiZWdpbgorICBSZXN1bHQgOj0gQ29udmVydEludDY0VG9Eb3VibGUoIFJlYWRJNjQgKQorZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7CitiZWdpbgorICBJbml0KCByZXN1bHQsICcnLCBUVHlwZSggUmVhZEJ5dGUpLCAwKTsKKyAgaWYgKCByZXN1bHQuVHlwZV8gPD4gVFR5cGUuU3RvcCApIHRoZW4gYmVnaW4KKyAgICByZXN1bHQuSWQgOj0gUmVhZEkxNjsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkRmllbGRFbmQ7CitiZWdpbgorCitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEkxNjogU21hbGxJbnQ7Cit2YXIgaTE2aW4gOiBwYWNrZWQgYXJyYXlbMC4uMV0gb2YgQnl0ZTsKK2JlZ2luCisgIFJlYWRBbGwoIEBpMTZpbiwgU2l6ZW9mKGkxNmluKSwgMCwgMik7CisgIFJlc3VsdCA6PSBTbWFsbEludCgoKGkxNmluWzBdIGFuZCAkRkYpIHNobCA4KSBvciAoaTE2aW5bMV0gYW5kICRGRikpOworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRJMzI6IEludGVnZXI7Cit2YXIgaTMyaW4gOiBwYWNrZWQgYXJyYXlbMC4uM10gb2YgQnl0ZTsKK2JlZ2luCisgIFJlYWRBbGwoIEBpMzJpbiwgU2l6ZU9mKGkzMmluKSwgMCwgNCk7CisKKyAgUmVzdWx0IDo9IEludGVnZXIoCisgICAgKChpMzJpblswXSBhbmQgJEZGKSBzaGwgMjQpIG9yCisgICAgKChpMzJpblsxXSBhbmQgJEZGKSBzaGwgMTYpIG9yCisgICAgKChpMzJpblsyXSBhbmQgJEZGKSBzaGwgOCkgb3IKKyAgICAgKGkzMmluWzNdIGFuZCAkRkYpKTsKKworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRJNjQ6IEludDY0OwordmFyIGk2NGluIDogcGFja2VkIGFycmF5WzAuLjddIG9mIEJ5dGU7CitiZWdpbgorICBSZWFkQWxsKCBAaTY0aW4sIFNpemVPZihpNjRpbiksIDAsIDgpOworICBSZXN1bHQgOj0KKyAgICAoSW50NjQoIGk2NGluWzBdIGFuZCAkRkYpIHNobCA1Nikgb3IKKyAgICAoSW50NjQoIGk2NGluWzFdIGFuZCAkRkYpIHNobCA0OCkgb3IKKyAgICAoSW50NjQoIGk2NGluWzJdIGFuZCAkRkYpIHNobCA0MCkgb3IKKyAgICAoSW50NjQoIGk2NGluWzNdIGFuZCAkRkYpIHNobCAzMikgb3IKKyAgICAoSW50NjQoIGk2NGluWzRdIGFuZCAkRkYpIHNobCAyNCkgb3IKKyAgICAoSW50NjQoIGk2NGluWzVdIGFuZCAkRkYpIHNobCAxNikgb3IKKyAgICAoSW50NjQoIGk2NGluWzZdIGFuZCAkRkYpIHNobCA4KSBvcgorICAgIChJbnQ2NCggaTY0aW5bN10gYW5kICRGRikpOworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OworYmVnaW4KKyAgcmVzdWx0LkVsZW1lbnRUeXBlIDo9IFRUeXBlKFJlYWRCeXRlKTsKKyAgcmVzdWx0LkNvdW50ICAgICAgIDo9IFJlYWRJMzI7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRMaXN0RW5kOworYmVnaW4KKworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsKK2JlZ2luCisgIHJlc3VsdC5LZXlUeXBlICAgOj0gVFR5cGUoUmVhZEJ5dGUpOworICByZXN1bHQuVmFsdWVUeXBlIDo9IFRUeXBlKFJlYWRCeXRlKTsKKyAgcmVzdWx0LkNvdW50ICAgICA6PSBSZWFkSTMyOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkTWFwRW5kOworYmVnaW4KKworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOwordmFyCisgIHNpemUgOiBJbnRlZ2VyOworICB2ZXJzaW9uIDogSW50ZWdlcjsKK2JlZ2luCisgIEluaXQoIHJlc3VsdCk7CisgIHNpemUgOj0gUmVhZEkzMjsKKyAgaWYgKHNpemUgPCAwKSB0aGVuIGJlZ2luCisgICAgdmVyc2lvbiA6PSBzaXplIGFuZCBJbnRlZ2VyKCBWRVJTSU9OX01BU0spOworICAgIGlmICggdmVyc2lvbiA8PiBJbnRlZ2VyKCBWRVJTSU9OXzEpKSB0aGVuIGJlZ2luCisgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25CYWRWZXJzaW9uLkNyZWF0ZSgnQmFkIHZlcnNpb24gaW4gUmVhZE1lc3NhZ2VCZWdpbjogJyArIEludFRvU3RyKHZlcnNpb24pICk7CisgICAgZW5kOworICAgIHJlc3VsdC5UeXBlXyA6PSBUTWVzc2FnZVR5cGUoIHNpemUgYW5kICQwMDAwMDBmZik7CisgICAgcmVzdWx0Lk5hbWUgOj0gUmVhZFN0cmluZzsKKyAgICByZXN1bHQuU2VxSUQgOj0gUmVhZEkzMjsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBpZiBGU3RyaWN0UmVhZCB0aGVuIGJlZ2luCisgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25CYWRWZXJzaW9uLkNyZWF0ZSgnTWlzc2luZyB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW4sIG9sZCBjbGllbnQ/JyApOworICAgIGVuZDsKKyAgICByZXN1bHQuTmFtZSA6PSBSZWFkU3RyaW5nQm9keSggc2l6ZSApOworICAgIHJlc3VsdC5UeXBlXyA6PSBUTWVzc2FnZVR5cGUoIFJlYWRCeXRlICk7CisgICAgcmVzdWx0LlNlcUlEIDo9IFJlYWRJMzI7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZE1lc3NhZ2VFbmQ7CitiZWdpbgorICBpbmhlcml0ZWQ7CisKK2VuZDsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7CitiZWdpbgorICByZXN1bHQuRWxlbWVudFR5cGUgOj0gVFR5cGUoUmVhZEJ5dGUpOworICByZXN1bHQuQ291bnQgICAgICAgOj0gUmVhZEkzMjsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZFNldEVuZDsKK2JlZ2luCisKK2VuZDsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkU3RyaW5nQm9keSggc2l6ZTogSW50ZWdlcik6IHN0cmluZzsKK3ZhcgorICBidWYgOiBUQnl0ZXM7CitiZWdpbgorICBTZXRMZW5ndGgoIGJ1Ziwgc2l6ZSApOworICBGVHJhbnMuUmVhZEFsbCggYnVmLCAwLCBzaXplICk7CisgIFJlc3VsdCA6PSBURW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoIGJ1Zik7CitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OworYmVnaW4KKyAgSW5pdCggUmVzdWx0KTsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZFN0cnVjdEVuZDsKK2JlZ2luCisgIGluaGVyaXRlZDsKKworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsKK3ZhciBpTGVuIDogSW50ZWdlcjsKK2JlZ2luCisgIGlMZW4gOj0gTGVuZ3RoKGIpOworICBXcml0ZUkzMiggaUxlbik7CisgIGlmIGlMZW4gPiAwIHRoZW4gRlRyYW5zLldyaXRlKGIsIDAsIGlMZW4pOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUJvb2woYjogQm9vbGVhbik7CitiZWdpbgorICBpZiBiIHRoZW4gYmVnaW4KKyAgICBXcml0ZUJ5dGUoIDEgKTsKKyAgZW5kIGVsc2UgYmVnaW4KKyAgICBXcml0ZUJ5dGUoIDAgKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUJ5dGUoYjogU2hvcnRJbnQpOworYmVnaW4KKyAgRlRyYW5zLldyaXRlKCBAYiwgMCwgMSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlRG91YmxlKCBjb25zdCBkOiBEb3VibGUpOworYmVnaW4KKyAgV3JpdGVJNjQoQ29udmVydERvdWJsZVRvSW50NjQoZCkpOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOworYmVnaW4KKyAgV3JpdGVCeXRlKFNob3J0SW50KGZpZWxkLlR5cGVfKSk7CisgIFdyaXRlSTE2KGZpZWxkLklEKTsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVGaWVsZEVuZDsKK2JlZ2luCisKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVGaWVsZFN0b3A7CitiZWdpbgorICBXcml0ZUJ5dGUoU2hvcnRJbnQoVFR5cGUuU3RvcCkpOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUkxNihpMTY6IFNtYWxsSW50KTsKK3ZhciBpMTZvdXQgOiBwYWNrZWQgYXJyYXlbMC4uMV0gb2YgQnl0ZTsKK2JlZ2luCisgIGkxNm91dFswXSA6PSBCeXRlKCRGRiBhbmQgKGkxNiBzaHIgOCkpOworICBpMTZvdXRbMV0gOj0gQnl0ZSgkRkYgYW5kIGkxNik7CisgIEZUcmFucy5Xcml0ZSggQGkxNm91dCwgMCwgMik7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlSTMyKGkzMjogSW50ZWdlcik7Cit2YXIgaTMyb3V0IDogcGFja2VkIGFycmF5WzAuLjNdIG9mIEJ5dGU7CitiZWdpbgorICBpMzJvdXRbMF0gOj0gQnl0ZSgkRkYgYW5kIChpMzIgc2hyIDI0KSk7CisgIGkzMm91dFsxXSA6PSBCeXRlKCRGRiBhbmQgKGkzMiBzaHIgMTYpKTsKKyAgaTMyb3V0WzJdIDo9IEJ5dGUoJEZGIGFuZCAoaTMyIHNociA4KSk7CisgIGkzMm91dFszXSA6PSBCeXRlKCRGRiBhbmQgaTMyKTsKKyAgRlRyYW5zLldyaXRlKCBAaTMyb3V0LCAwLCA0KTsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVJNjQoIGNvbnN0IGk2NDogSW50NjQpOwordmFyIGk2NG91dCA6IHBhY2tlZCBhcnJheVswLi43XSBvZiBCeXRlOworYmVnaW4KKyAgaTY0b3V0WzBdIDo9IEJ5dGUoJEZGIGFuZCAoaTY0IHNociA1NikpOworICBpNjRvdXRbMV0gOj0gQnl0ZSgkRkYgYW5kIChpNjQgc2hyIDQ4KSk7CisgIGk2NG91dFsyXSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgNDApKTsKKyAgaTY0b3V0WzNdIDo9IEJ5dGUoJEZGIGFuZCAoaTY0IHNociAzMikpOworICBpNjRvdXRbNF0gOj0gQnl0ZSgkRkYgYW5kIChpNjQgc2hyIDI0KSk7CisgIGk2NG91dFs1XSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgMTYpKTsKKyAgaTY0b3V0WzZdIDo9IEJ5dGUoJEZGIGFuZCAoaTY0IHNociA4KSk7CisgIGk2NG91dFs3XSA6PSBCeXRlKCRGRiBhbmQgaTY0KTsKKyAgRlRyYW5zLldyaXRlKCBAaTY0b3V0LCAwLCA4KTsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsKK2JlZ2luCisgIFdyaXRlQnl0ZShTaG9ydEludChsaXN0LkVsZW1lbnRUeXBlKSk7CisgIFdyaXRlSTMyKGxpc3QuQ291bnQpOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUxpc3RFbmQ7CitiZWdpbgorCitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7CitiZWdpbgorICBXcml0ZUJ5dGUoU2hvcnRJbnQobWFwLktleVR5cGUpKTsKKyAgV3JpdGVCeXRlKFNob3J0SW50KG1hcC5WYWx1ZVR5cGUpKTsKKyAgV3JpdGVJMzIobWFwLkNvdW50KTsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVNYXBFbmQ7CitiZWdpbgorCitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsKK3ZhcgorICB2ZXJzaW9uIDogQ2FyZGluYWw7CitiZWdpbgorICBpZiBGU3RyaWN0V3JpdGUgdGhlbgorICBiZWdpbgorICAgIHZlcnNpb24gOj0gVkVSU0lPTl8xIG9yIENhcmRpbmFsKCBtc2cuVHlwZV8pOworICAgIFdyaXRlSTMyKCBJbnRlZ2VyKCB2ZXJzaW9uKSApOworICAgIFdyaXRlU3RyaW5nKCBtc2cuTmFtZSk7CisgICAgV3JpdGVJMzIoIG1zZy5TZXFJRCk7CisgIGVuZCBlbHNlCisgIGJlZ2luCisgICAgV3JpdGVTdHJpbmcoIG1zZy5OYW1lKTsKKyAgICBXcml0ZUJ5dGUoU2hvcnRJbnQoIG1zZy5UeXBlXykpOworICAgIFdyaXRlSTMyKCBtc2cuU2VxSUQpOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlTWVzc2FnZUVuZDsKK2JlZ2luCisKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCk7CitiZWdpbgorICBXcml0ZUJ5dGUoU2hvcnRJbnQoc2V0Xy5FbGVtZW50VHlwZSkpOworICBXcml0ZUkzMihzZXRfLkNvdW50KTsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVTZXRFbmQ7CitiZWdpbgorCitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsKK2JlZ2luCisKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVTdHJ1Y3RFbmQ7CitiZWdpbgorCitlbmQ7CisKK3sgVFByb3RvY29sRXhjZXB0aW9uIH0KKworY29uc3RydWN0b3IgVFByb3RvY29sRXhjZXB0aW9uLkhpZGRlbkNyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKE1zZyk7CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOiBUUHJvdG9jb2xFeGNlcHRpb247CitiZWdpbgorICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoTXNnKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZTogVFByb3RvY29sRXhjZXB0aW9uOworYmVnaW4KKyAgUmVzdWx0IDo9IFRQcm90b2NvbEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCcnKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSh0eXBlXzogSW50ZWdlcik6IFRQcm90b2NvbEV4Y2VwdGlvbjsKK2JlZ2luCit7JFdBUk4gU1lNQk9MX0RFUFJFQ0FURUQgT0ZGfQorICBSZXN1bHQgOj0gQ3JlYXRlKHR5cGVfLCAnJyk7Cit7JFdBUk4gU1lNQk9MX0RFUFJFQ0FURUQgREVGQVVMVH0KK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSh0eXBlXzogSW50ZWdlcjsgY29uc3QgbXNnOiBzdHJpbmcpOiBUUHJvdG9jb2xFeGNlcHRpb247CitiZWdpbgorICBjYXNlIHR5cGVfIG9mCisgICAgSU5WQUxJRF9EQVRBOiAgICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKG1zZyk7CisgICAgTkVHQVRJVkVfU0laRTogICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uTmVnYXRpdmVTaXplLkNyZWF0ZShtc2cpOworICAgIFNJWkVfTElNSVQ6ICAgICAgUmVzdWx0IDo9IFRQcm90b2NvbEV4Y2VwdGlvblNpemVMaW1pdC5DcmVhdGUobXNnKTsKKyAgICBCQURfVkVSU0lPTjogICAgIFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25CYWRWZXJzaW9uLkNyZWF0ZShtc2cpOworICAgIE5PVF9JTVBMRU1FTlRFRDogUmVzdWx0IDo9IFRQcm90b2NvbEV4Y2VwdGlvbk5vdEltcGxlbWVudGVkLkNyZWF0ZShtc2cpOworICAgIERFUFRIX0xJTUlUOiAgICAgUmVzdWx0IDo9IFRQcm90b2NvbEV4Y2VwdGlvbkRlcHRoTGltaXQuQ3JlYXRlKG1zZyk7CisgIGVsc2UKKyAgICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uVW5rbm93bi5DcmVhdGUobXNnKTsKKyAgZW5kOworZW5kOworCit7IFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkIH0KKworY29uc3RydWN0b3IgVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKK2JlZ2luCisgIGluaGVyaXRlZCBIaWRkZW5DcmVhdGUoTXNnKTsKK2VuZDsKKworeyBUVGhyaWZ0U3RyaW5nQnVpbGRlciB9CisKK2Z1bmN0aW9uIFRUaHJpZnRTdHJpbmdCdWlsZGVyLkFwcGVuZChjb25zdCBWYWx1ZTogVEJ5dGVzKTogVFN0cmluZ0J1aWxkZXI7CitiZWdpbgorICBSZXN1bHQgOj0gQXBwZW5kKCBzdHJpbmcoIFJhd0J5dGVTdHJpbmcoVmFsdWUpKSApOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0U3RyaW5nQnVpbGRlci5BcHBlbmQoCisgIGNvbnN0IFZhbHVlOiBJVGhyaWZ0Q29udGFpbmVyKTogVFN0cmluZ0J1aWxkZXI7CitiZWdpbgorICBSZXN1bHQgOj0gQXBwZW5kKCBWYWx1ZS5Ub1N0cmluZyApOworZW5kOworCit7IFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkgfQorCitjb25zdHJ1Y3RvciBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZShBU3RyaWN0UmVhZCwgQVN0cmljdFdyaXRlOiBCb29sZWFuKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZTdHJpY3RSZWFkIDo9IEFTdHJpY3RSZWFkOworICBGU3RyaWN0V3JpdGUgOj0gQVN0cmljdFdyaXRlOworZW5kOworCitjb25zdHJ1Y3RvciBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZTsKK2JlZ2luCisgIC8vbm8gaW5oZXJpdGVkOworICBDcmVhdGUoIEZhbHNlLCBUcnVlICkKK2VuZDsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5HZXRQcm90b2NvbCggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQpOiBJUHJvdG9jb2w7CitiZWdpbgorICBSZXN1bHQgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5DcmVhdGUoIHRyYW5zLCBGU3RyaWN0UmVhZCwgRlN0cmljdFdyaXRlKTsKK2VuZDsKKworCit7IFRQcm90b2NvbERlY29yYXRvciB9CisKK2NvbnN0cnVjdG9yIFRQcm90b2NvbERlY29yYXRvci5DcmVhdGUoIGNvbnN0IGFQcm90b2NvbCA6IElQcm90b2NvbCk7CitiZWdpbgorICBBU1NFUlQoIGFQcm90b2NvbCA8PiBuaWwpOworICBpbmhlcml0ZWQgQ3JlYXRlKCBhUHJvdG9jb2wuVHJhbnNwb3J0KTsKKyAgRldyYXBwZWRQcm90b2NvbCA6PSBhUHJvdG9jb2w7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlTWVzc2FnZUJlZ2luKCBtc2cpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVNZXNzYWdlRW5kOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZU1lc3NhZ2VFbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlU3RydWN0QmVnaW4oIHN0cnVjKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlU3RydWN0RW5kOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZVN0cnVjdEVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlRmllbGRCZWdpbiggZmllbGQpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVGaWVsZEVuZDsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZEVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlRmllbGRTdG9wOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUZpZWxkU3RvcDsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlTWFwQmVnaW4oIG1hcCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZU1hcEVuZDsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVNYXBFbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUxpc3RCZWdpbiggbGlzdCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUxpc3RFbmQoKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVMaXN0RW5kKCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0ICk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlU2V0QmVnaW4oIHNldF8pOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVTZXRFbmQoKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVTZXRFbmQoKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlQm9vbCggYjogQm9vbGVhbik7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlQm9vbCggYik7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVCeXRlKCBiKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlSTE2KCBpMTY6IFNtYWxsSW50KTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVJMTYoIGkxNik7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUkzMiggaTMyOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVJMzIoIGkzMik7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUk2NCggY29uc3QgaTY0OiBJbnQ2NCk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlSTY0KCBpNjQpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVEb3VibGUoIGNvbnN0IGQ6IERvdWJsZSk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlRG91YmxlKCBkKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlU3RyaW5nKCBjb25zdCBzOiBzdHJpbmcgKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJpbmcoIHMpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVBbnNpU3RyaW5nKCBjb25zdCBzOiBBbnNpU3RyaW5nKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVBbnNpU3RyaW5nKCBzKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUJpbmFyeSggYik7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZE1lc3NhZ2VCZWdpbjsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLlJlYWRNZXNzYWdlRW5kKCk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLlJlYWRNZXNzYWdlRW5kKCk7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRTdHJ1Y3RCZWdpbjsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLlJlYWRTdHJ1Y3RFbmQ7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLlJlYWRTdHJ1Y3RFbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkRmllbGRCZWdpbjsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLlJlYWRGaWVsZEVuZCgpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5SZWFkRmllbGRFbmQoKTsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZE1hcEJlZ2luOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZE1hcEVuZCgpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5SZWFkTWFwRW5kKCk7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZExpc3RCZWdpbjsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLlJlYWRMaXN0RW5kKCk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLlJlYWRMaXN0RW5kKCk7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRTZXRCZWdpbjsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLlJlYWRTZXRFbmQoKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuUmVhZFNldEVuZCgpOworZW5kOworCisKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkQm9vbDogQm9vbGVhbjsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRCb29sOworZW5kOworCisKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkQnl0ZTogU2hvcnRJbnQ7CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkQnl0ZTsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZEkxNjogU21hbGxJbnQ7CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkSTE2OworZW5kOworCisKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkSTMyOiBJbnRlZ2VyOworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZEkzMjsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZEk2NDogSW50NjQ7CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkSTY0OworZW5kOworCisKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkRG91YmxlOkRvdWJsZTsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWREb3VibGU7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRCaW5hcnk6IFRCeXRlczsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRCaW5hcnk7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRTdHJpbmc6IHN0cmluZzsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRTdHJpbmc7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRBbnNpU3RyaW5nOiBBbnNpU3RyaW5nOworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZEFuc2lTdHJpbmc7CitlbmQ7CisKKworeyBJbml0IGhlbHBlciBmdW5jdGlvbnMgfQorCitwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRNZXNzYWdlOyBjb25zdCBBTmFtZTogc3RyaW5nOyBjb25zdCBBTWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZTsgY29uc3QgQVNlcUlEOiBJbnRlZ2VyKTsKK2JlZ2luCisgIHJlYy5OYW1lIDo9IEFOYW1lOworICByZWMuVHlwZV8gOj0gQU1lc3NhZ2VUeXBlOworICByZWMuU2VxSUQgOj0gQVNlcUlEOworZW5kOworCisKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdFN0cnVjdDsgY29uc3QgQU5hbWU6IHN0cmluZyA9ICcnKTsKK2JlZ2luCisgIHJlYy5OYW1lIDo9IEFOYW1lOworZW5kOworCisKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdEZpZWxkOyBjb25zdCBBTmFtZTogc3RyaW5nOyBjb25zdCBBVHlwZTogVFR5cGU7IGNvbnN0IEFJRDogU21hbGxJbnQpOworYmVnaW4KKyAgcmVjLk5hbWUgOj0gQU5hbWU7CisgIHJlYy5UeXBlXyA6PSBBVHlwZTsKKyAgcmVjLklkIDo9IEFJZDsKK2VuZDsKKworCitwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRNYXA7IGNvbnN0IEFLZXlUeXBlLCBBVmFsdWVUeXBlOiBUVHlwZTsgY29uc3QgQUNvdW50OiBJbnRlZ2VyKTsKK2JlZ2luCisgIHJlYy5WYWx1ZVR5cGUgOj0gQVZhbHVlVHlwZTsKKyAgcmVjLktleVR5cGUgOj0gQUtleVR5cGU7CisgIHJlYy5Db3VudCA6PSBBQ291bnQ7CitlbmQ7CisKKworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0U2V0OyBjb25zdCBBRWxlbWVudFR5cGU6IFRUeXBlOyBjb25zdCBBQ291bnQ6IEludGVnZXIpOworYmVnaW4KKyAgcmVjLkNvdW50IDo9IEFDb3VudDsKKyAgcmVjLkVsZW1lbnRUeXBlIDo9IEFFbGVtZW50VHlwZTsKK2VuZDsKKworCitwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRMaXN0OyBjb25zdCBBRWxlbWVudFR5cGU6IFRUeXBlOyBjb25zdCBBQ291bnQ6IEludGVnZXIpOworYmVnaW4KKyAgcmVjLkNvdW50IDo9IEFDb3VudDsKKyAgcmVjLkVsZW1lbnRUeXBlIDo9IEFFbGVtZW50VHlwZTsKK2VuZDsKKworCisKKworCitlbmQuCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TZXJpYWxpemVyLnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TZXJpYWxpemVyLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjI5MDVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNlcmlhbGl6ZXIucGFzCkBAIC0wLDAgKzEsMjMwIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCit1bml0IFRocmlmdC5TZXJpYWxpemVyOworCit7JEkgVGhyaWZ0LkRlZmluZXMuaW5jfQorCitpbnRlcmZhY2UKKwordXNlcworICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICBDbGFzc2VzLCBXaW5kb3dzLCBTeXNVdGlscywKKyAgeyRFTFNFfQorICBTeXN0ZW0uQ2xhc3NlcywgV2luYXBpLldpbmRvd3MsIFN5c3RlbS5TeXNVdGlscywKKyAgeyRFTkRJRn0KKyAgVGhyaWZ0LlByb3RvY29sLAorICBUaHJpZnQuVHJhbnNwb3J0LAorICBUaHJpZnQuU3RyZWFtOworCisKK3R5cGUKKyAgLy8gR2VuZXJpYyB1dGlsaXR5IGZvciBlYXNpbHkgc2VyaWFsaXppbmcgb2JqZWN0cyBpbnRvIGEgYnl0ZSBhcnJheSBvciBTdHJlYW0uCisgIFRTZXJpYWxpemVyID0gY2xhc3MKKyAgcHJpdmF0ZQorICAgIEZTdHJlYW0gICAgOiBUTWVtb3J5U3RyZWFtOworICAgIEZUcmFuc3BvcnQgOiBJVHJhbnNwb3J0OworICAgIEZQcm90b2NvbCAgOiBJUHJvdG9jb2w7CisKKyAgcHVibGljCisgICAgLy8gQ3JlYXRlIGEgbmV3IFRTZXJpYWxpemVyIHRoYXQgdXNlcyB0aGUgVEJpbmFyeVByb3RvY29sIGJ5IGRlZmF1bHQuCisgICAgY29uc3RydWN0b3IgQ3JlYXRlOyAgb3ZlcmxvYWQ7CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgVFNlcmlhbGl6ZXIuCisgICAgLy8gSXQgd2lsbCB1c2UgdGhlIFRQcm90b2NvbCBzcGVjaWZpZWQgYnkgdGhlIGZhY3RvcnkgdGhhdCBpcyBwYXNzZWQgaW4uCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBmYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeSk7ICBvdmVybG9hZDsKKworICAgIC8vIERUT1IKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgVGhyaWZ0IG9iamVjdC4KKyAgICBmdW5jdGlvbiAgU2VyaWFsaXplKCBjb25zdCBpbnB1dCA6IElCYXNlKSA6IFRCeXRlczsgIG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBTZXJpYWxpemUoIGNvbnN0IGlucHV0IDogSUJhc2U7IGNvbnN0IGFTdG0gOiBUU3RyZWFtKTsgIG92ZXJsb2FkOworICBlbmQ7CisKKworICAvLyBHZW5lcmljIHV0aWxpdHkgZm9yIGVhc2lseSBkZXNlcmlhbGl6aW5nIG9iamVjdHMgZnJvbSBieXRlIGFycmF5IG9yIFN0cmVhbS4KKyAgVERlc2VyaWFsaXplciA9IGNsYXNzCisgIHByaXZhdGUKKyAgICBGU3RyZWFtICAgIDogVE1lbW9yeVN0cmVhbTsKKyAgICBGVHJhbnNwb3J0IDogSVRyYW5zcG9ydDsKKyAgICBGUHJvdG9jb2wgIDogSVByb3RvY29sOworCisgIHB1YmxpYworICAgIC8vIENyZWF0ZSBhIG5ldyBURGVzZXJpYWxpemVyIHRoYXQgdXNlcyB0aGUgVEJpbmFyeVByb3RvY29sIGJ5IGRlZmF1bHQuCisgICAgY29uc3RydWN0b3IgQ3JlYXRlOyAgb3ZlcmxvYWQ7CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgVERlc2VyaWFsaXplci4KKyAgICAvLyBJdCB3aWxsIHVzZSB0aGUgVFByb3RvY29sIHNwZWNpZmllZCBieSB0aGUgZmFjdG9yeSB0aGF0IGlzIHBhc3NlZCBpbi4KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5KTsgIG92ZXJsb2FkOworCisgICAgLy8gRFRPUgorICAgIGRlc3RydWN0b3IgRGVzdHJveTsgIG92ZXJyaWRlOworCisgICAgLy8gRGVzZXJpYWxpemUgdGhlIFRocmlmdCBvYmplY3QgZGF0YS4KKyAgICBwcm9jZWR1cmUgRGVzZXJpYWxpemUoIGNvbnN0IGlucHV0IDogVEJ5dGVzOyBjb25zdCB0YXJnZXQgOiBJQmFzZSk7ICBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgRGVzZXJpYWxpemUoIGNvbnN0IGlucHV0IDogVFN0cmVhbTsgY29uc3QgdGFyZ2V0IDogSUJhc2UpOyAgb3ZlcmxvYWQ7CisgIGVuZDsKKworCisKK2ltcGxlbWVudGF0aW9uCisKKworeyBUU2VyaWFsaXplciB9CisKKworY29uc3RydWN0b3IgVFNlcmlhbGl6ZXIuQ3JlYXRlKCk7CisvLyBDcmVhdGUgYSBuZXcgVFNlcmlhbGl6ZXIgdGhhdCB1c2VzIHRoZSBUQmluYXJ5UHJvdG9jb2wgYnkgZGVmYXVsdC4KK2JlZ2luCisgIC8vbm8gaW5oZXJpdGVkOworICBDcmVhdGUoIFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlKTsKK2VuZDsKKworCitjb25zdHJ1Y3RvciBUU2VyaWFsaXplci5DcmVhdGUoIGNvbnN0IGZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5KTsKKy8vIENyZWF0ZSBhIG5ldyBUU2VyaWFsaXplci4KKy8vIEl0IHdpbGwgdXNlIHRoZSBUUHJvdG9jb2wgc3BlY2lmaWVkIGJ5IHRoZSBmYWN0b3J5IHRoYXQgaXMgcGFzc2VkIGluLgordmFyIGFkYXB0ZXIgOiBJVGhyaWZ0U3RyZWFtOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlN0cmVhbSAgICA6PSBUTWVtb3J5U3RyZWFtLkNyZWF0ZTsKKyAgYWRhcHRlciAgICA6PSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIEZTdHJlYW0sIEZBTFNFKTsKKyAgRlRyYW5zcG9ydCA6PSBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DcmVhdGUoIG5pbCwgYWRhcHRlcik7CisgIEZQcm90b2NvbCAgOj0gZmFjdG9yeS5HZXRQcm90b2NvbCggRlRyYW5zcG9ydCk7CitlbmQ7CisKKworZGVzdHJ1Y3RvciBUU2VyaWFsaXplci5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgRlByb3RvY29sICA6PSBuaWw7CisgICAgRlRyYW5zcG9ydCA6PSBuaWw7CisgICAgRnJlZUFuZE5pbCggRlN0cmVhbSk7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRTZXJpYWxpemVyLlNlcmlhbGl6ZSggY29uc3QgaW5wdXQgOiBJQmFzZSkgOiBUQnl0ZXM7CisvLyBTZXJpYWxpemUgdGhlIFRocmlmdCBvYmplY3QgaW50byBhIGJ5dGUgYXJyYXkuIFRoZSBwcm9jZXNzIGlzIHNpbXBsZSwKKy8vIGp1c3QgY2xlYXIgdGhlIGJ5dGUgYXJyYXkgb3V0cHV0LCB3cml0ZSB0aGUgb2JqZWN0IGludG8gaXQsIGFuZCBncmFiIHRoZQorLy8gcmF3IGJ5dGVzLgordmFyIGlCeXRlcyA6IEludDY0OworYmVnaW4KKyAgdHJ5CisgICAgRlN0cmVhbS5TaXplIDo9IDA7CisgICAgaW5wdXQuV3JpdGUoIEZQcm90b2NvbCk7CisgICAgU2V0TGVuZ3RoKCByZXN1bHQsIEZTdHJlYW0uU2l6ZSk7CisgICAgaUJ5dGVzIDo9IExlbmd0aChyZXN1bHQpOworICAgIGlmIGlCeXRlcyA+IDAKKyAgICB0aGVuIE1vdmUoIEZTdHJlYW0uTWVtb3J5XiwgcmVzdWx0WzBdLCBpQnl0ZXMpOworICBmaW5hbGx5CisgICAgRlN0cmVhbS5TaXplIDo9IDA7ICAvLyBmcmVlIGFueSBhbGxvY2F0ZWQgbWVtb3J5CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVFNlcmlhbGl6ZXIuU2VyaWFsaXplKCBjb25zdCBpbnB1dCA6IElCYXNlOyBjb25zdCBhU3RtIDogVFN0cmVhbSk7CisvLyBTZXJpYWxpemUgdGhlIFRocmlmdCBvYmplY3QgaW50byBhIGJ5dGUgYXJyYXkuIFRoZSBwcm9jZXNzIGlzIHNpbXBsZSwKKy8vIGp1c3QgY2xlYXIgdGhlIGJ5dGUgYXJyYXkgb3V0cHV0LCB3cml0ZSB0aGUgb2JqZWN0IGludG8gaXQsIGFuZCBncmFiIHRoZQorLy8gcmF3IGJ5dGVzLgorY29uc3QgQ09QWV9FTlRJUkVfU1RSRUFNID0gMDsKK2JlZ2luCisgIHRyeQorICAgIEZTdHJlYW0uU2l6ZSA6PSAwOworICAgIGlucHV0LldyaXRlKCBGUHJvdG9jb2wpOworICAgIGFTdG0uQ29weUZyb20oIEZTdHJlYW0sIENPUFlfRU5USVJFX1NUUkVBTSk7CisgIGZpbmFsbHkKKyAgICBGU3RyZWFtLlNpemUgOj0gMDsgIC8vIGZyZWUgYW55IGFsbG9jYXRlZCBtZW1vcnkKKyAgZW5kOworZW5kOworCisKK3sgVERlc2VyaWFsaXplciB9CisKKworY29uc3RydWN0b3IgVERlc2VyaWFsaXplci5DcmVhdGUoKTsKKy8vIENyZWF0ZSBhIG5ldyBURGVzZXJpYWxpemVyIHRoYXQgdXNlcyB0aGUgVEJpbmFyeVByb3RvY29sIGJ5IGRlZmF1bHQuCitiZWdpbgorICAvL25vIGluaGVyaXRlZDsKKyAgQ3JlYXRlKCBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZSk7CitlbmQ7CisKKworY29uc3RydWN0b3IgVERlc2VyaWFsaXplci5DcmVhdGUoIGNvbnN0IGZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5KTsKKy8vIENyZWF0ZSBhIG5ldyBURGVzZXJpYWxpemVyLgorLy8gSXQgd2lsbCB1c2UgdGhlIFRQcm90b2NvbCBzcGVjaWZpZWQgYnkgdGhlIGZhY3RvcnkgdGhhdCBpcyBwYXNzZWQgaW4uCit2YXIgYWRhcHRlciA6IElUaHJpZnRTdHJlYW07CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU3RyZWFtICAgIDo9IFRNZW1vcnlTdHJlYW0uQ3JlYXRlOworICBhZGFwdGVyICAgIDo9IFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggRlN0cmVhbSwgRkFMU0UpOworICBGVHJhbnNwb3J0IDo9IFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNyZWF0ZSggYWRhcHRlciwgbmlsKTsKKyAgRlByb3RvY29sICA6PSBmYWN0b3J5LkdldFByb3RvY29sKCBGVHJhbnNwb3J0KTsKK2VuZDsKKworCitkZXN0cnVjdG9yIFREZXNlcmlhbGl6ZXIuRGVzdHJveTsKK2JlZ2luCisgIHRyeQorICAgIEZQcm90b2NvbCAgOj0gbmlsOworICAgIEZUcmFuc3BvcnQgOj0gbmlsOworICAgIEZyZWVBbmROaWwoIEZTdHJlYW0pOworICBmaW5hbGx5CisgICAgaW5oZXJpdGVkIERlc3Ryb3k7CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVERlc2VyaWFsaXplci5EZXNlcmlhbGl6ZSggY29uc3QgaW5wdXQgOiBUQnl0ZXM7IGNvbnN0IHRhcmdldCA6IElCYXNlKTsKKy8vIERlc2VyaWFsaXplIHRoZSBUaHJpZnQgb2JqZWN0IGRhdGEgZnJvbSB0aGUgYnl0ZSBhcnJheS4KK3ZhciBpQnl0ZXMgOiBJbnQ2NDsKK2JlZ2luCisgIHRyeQorICAgIGlCeXRlcyA6PSBMZW5ndGgoaW5wdXQpOworICAgIEZTdHJlYW0uU2l6ZSA6PSBpQnl0ZXM7CisgICAgaWYgaUJ5dGVzID4gMAorICAgIHRoZW4gTW92ZSggaW5wdXRbMF0sIEZTdHJlYW0uTWVtb3J5XiwgaUJ5dGVzKTsKKworICAgIHRhcmdldC5SZWFkKCBGUHJvdG9jb2wpOworICBmaW5hbGx5CisgICAgRlN0cmVhbS5TaXplIDo9IDA7ICAvLyBmcmVlIGFueSBhbGxvY2F0ZWQgbWVtb3J5CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVERlc2VyaWFsaXplci5EZXNlcmlhbGl6ZSggY29uc3QgaW5wdXQgOiBUU3RyZWFtOyBjb25zdCB0YXJnZXQgOiBJQmFzZSk7CisvLyBEZXNlcmlhbGl6ZSB0aGUgVGhyaWZ0IG9iamVjdCBkYXRhIGZyb20gdGhlIGJ5dGUgYXJyYXkuCitjb25zdCBDT1BZX0VOVElSRV9TVFJFQU0gPSAwOwordmFyIGJlZm9yZSA6IEludDY0OworYmVnaW4KKyAgdHJ5CisgICAgYmVmb3JlIDo9IEZTdHJlYW0uUG9zaXRpb247CisgICAgRlN0cmVhbS5Db3B5RnJvbSggaW5wdXQsIENPUFlfRU5USVJFX1NUUkVBTSk7CisgICAgRlN0cmVhbS5Qb3NpdGlvbiA6PSBiZWZvcmU7CisgICAgdGFyZ2V0LlJlYWQoIEZQcm90b2NvbCk7CisgIGZpbmFsbHkKKyAgICBGU3RyZWFtLlNpemUgOj0gMDsgIC8vIGZyZWUgYW55IGFsbG9jYXRlZCBtZW1vcnkKKyAgZW5kOworZW5kOworCisKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNlcnZlci5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuU2VydmVyLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2M1NzYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNlcnZlci5wYXMKQEAgLTAsMCArMSw0MjMgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworIHVuaXQgVGhyaWZ0LlNlcnZlcjsKKworeyRJIFRocmlmdC5EZWZpbmVzLmluY30KK3skSS19ICAvLyBwcmV2ZW50IGFubm95aW5nIGVycm9ycyB3aXRoIGRlZmF1bHQgbG9nIGRlbGVnYXRlIGFuZCBubyBjb25zb2xlCisKK2ludGVyZmFjZQorCit1c2VzCisgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgIFdpbmRvd3MsIFN5c1V0aWxzLAorICB7JEVMU0V9CisgIFdpbmFwaS5XaW5kb3dzLCBTeXN0ZW0uU3lzVXRpbHMsCisgIHskRU5ESUZ9CisgIFRocmlmdCwKKyAgVGhyaWZ0LlByb3RvY29sLAorICBUaHJpZnQuVHJhbnNwb3J0OworCit0eXBlCisgIElTZXJ2ZXJFdmVudHMgPSBpbnRlcmZhY2UKKyAgICBbJ3s5RTJBOTlDNS1FRTg1LTQwQjItOUE1Mi0yRDE3MjJCMTgxNzZ9J10KKyAgICAvLyBDYWxsZWQgYmVmb3JlIHRoZSBzZXJ2ZXIgYmVnaW5zLgorICAgIHByb2NlZHVyZSBQcmVTZXJ2ZTsKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgc2VydmVyIHRyYW5zcG9ydCBpcyByZWFkeSB0byBhY2NlcHQgcmVxdWVzdHMKKyAgICBwcm9jZWR1cmUgUHJlQWNjZXB0OworICAgIC8vIENhbGxlZCB3aGVuIGEgbmV3IGNsaWVudCBoYXMgY29ubmVjdGVkIGFuZCB0aGUgc2VydmVyIGlzIGFib3V0IHRvIGJlaW5nIHByb2Nlc3NpbmcuCisgICAgZnVuY3Rpb24gIENyZWF0ZVByb2Nlc3NpbmdDb250ZXh0KCBjb25zdCBpbnB1dCwgb3V0cHV0IDogSVByb3RvY29sKSA6IElQcm9jZXNzb3JFdmVudHM7CisgIGVuZDsKKworCisgIElTZXJ2ZXIgPSBpbnRlcmZhY2UKKyAgICBbJ3tBREM0NkYyRC04MTk5LTREMUMtOTZEMi04N0ZENTQzNTE3MjN9J10KKyAgICBwcm9jZWR1cmUgU2VydmU7CisgICAgcHJvY2VkdXJlIFN0b3A7CisKKyAgICBmdW5jdGlvbiBHZXRTZXJ2ZXJFdmVudHMgOiBJU2VydmVyRXZlbnRzOworICAgIHByb2NlZHVyZSBTZXRTZXJ2ZXJFdmVudHMoIGNvbnN0IHZhbHVlIDogSVNlcnZlckV2ZW50cyk7CisKKyAgICBwcm9wZXJ0eSBTZXJ2ZXJFdmVudHMgOiBJU2VydmVyRXZlbnRzIHJlYWQgR2V0U2VydmVyRXZlbnRzIHdyaXRlIFNldFNlcnZlckV2ZW50czsKKyAgZW5kOworCisgIFRTZXJ2ZXJJbXBsID0gY2xhc3MgYWJzdHJhY3QoIFRJbnRlcmZhY2VkT2JqZWN0LCBJU2VydmVyICkKKyAgcHVibGljCisgICAgdHlwZQorICAgICAgVExvZ0RlbGVnYXRlID0gcmVmZXJlbmNlIHRvIHByb2NlZHVyZSggY29uc3Qgc3RyOiBzdHJpbmcpOworICBwcm90ZWN0ZWQKKyAgICBGUHJvY2Vzc29yIDogSVByb2Nlc3NvcjsKKyAgICBGU2VydmVyVHJhbnNwb3J0IDogSVNlcnZlclRyYW5zcG9ydDsKKyAgICBGSW5wdXRUcmFuc3BvcnRGYWN0b3J5IDogSVRyYW5zcG9ydEZhY3Rvcnk7CisgICAgRk91dHB1dFRyYW5zcG9ydEZhY3RvcnkgOiBJVHJhbnNwb3J0RmFjdG9yeTsKKyAgICBGSW5wdXRQcm90b2NvbEZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5OworICAgIEZPdXRwdXRQcm90b2NvbEZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5OworICAgIEZMb2dEZWxlZ2F0ZSA6IFRMb2dEZWxlZ2F0ZTsKKyAgICBGU2VydmVyRXZlbnRzIDogSVNlcnZlckV2ZW50czsKKworICAgIGNsYXNzIHByb2NlZHVyZSBEZWZhdWx0TG9nRGVsZWdhdGUoIGNvbnN0IHN0cjogc3RyaW5nKTsKKworICAgIGZ1bmN0aW9uIEdldFNlcnZlckV2ZW50cyA6IElTZXJ2ZXJFdmVudHM7CisgICAgcHJvY2VkdXJlIFNldFNlcnZlckV2ZW50cyggY29uc3QgdmFsdWUgOiBJU2VydmVyRXZlbnRzKTsKKworICAgIHByb2NlZHVyZSBTZXJ2ZTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFN0b3A7IHZpcnR1YWw7IGFic3RyYWN0OworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoCisgICAgICBjb25zdCBBUHJvY2Vzc29yIDpJUHJvY2Vzc29yOworICAgICAgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydDsKKyAgICAgIGNvbnN0IEFJbnB1dFRyYW5zcG9ydEZhY3RvcnkgOiBJVHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgIGNvbnN0IEFPdXRwdXRUcmFuc3BvcnRGYWN0b3J5IDogSVRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICBjb25zdCBBSW5wdXRQcm90b2NvbEZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5OworICAgICAgY29uc3QgQU91dHB1dFByb3RvY29sRmFjdG9yeSA6IElQcm90b2NvbEZhY3Rvcnk7CisgICAgICBjb25zdCBBTG9nRGVsZWdhdGUgOiBUTG9nRGVsZWdhdGUKKyAgICAgICk7IG92ZXJsb2FkOworCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKAorICAgICAgY29uc3QgQVByb2Nlc3NvciA6SVByb2Nlc3NvcjsKKyAgICAgIGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQKKyAgICAgICk7IG92ZXJsb2FkOworCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKAorICAgICAgY29uc3QgQVByb2Nlc3NvciA6SVByb2Nlc3NvcjsKKyAgICAgIGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICBjb25zdCBBTG9nRGVsZWdhdGU6IFRMb2dEZWxlZ2F0ZQorICAgICAgKTsgb3ZlcmxvYWQ7CisKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoCisgICAgICBjb25zdCBBUHJvY2Vzc29yIDpJUHJvY2Vzc29yOworICAgICAgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydDsKKyAgICAgIGNvbnN0IEFUcmFuc3BvcnRGYWN0b3J5IDogSVRyYW5zcG9ydEZhY3RvcnkKKyAgICAgICk7IG92ZXJsb2FkOworCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKAorICAgICAgY29uc3QgQVByb2Nlc3NvciA6SVByb2Nlc3NvcjsKKyAgICAgIGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICBjb25zdCBBVHJhbnNwb3J0RmFjdG9yeSA6IElUcmFuc3BvcnRGYWN0b3J5OworICAgICAgY29uc3QgQVByb3RvY29sRmFjdG9yeSA6IElQcm90b2NvbEZhY3RvcnkKKyAgICAgICk7IG92ZXJsb2FkOworICBlbmQ7CisKKyAgVFNpbXBsZVNlcnZlciA9IGNsYXNzKCBUU2VydmVySW1wbCkKKyAgcHJpdmF0ZQorICAgIEZTdG9wIDogQm9vbGVhbjsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBUHJvY2Vzc29yOiBJUHJvY2Vzc29yOyBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0KTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBUHJvY2Vzc29yOiBJUHJvY2Vzc29yOyBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0OworICAgICAgQUxvZ0RlbDogVFNlcnZlckltcGwuVExvZ0RlbGVnYXRlKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBUHJvY2Vzc29yOiBJUHJvY2Vzc29yOyBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0OworICAgICAgY29uc3QgQVRyYW5zcG9ydEZhY3Rvcnk6IElUcmFuc3BvcnRGYWN0b3J5KTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBUHJvY2Vzc29yOiBJUHJvY2Vzc29yOyBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0OworICAgICAgY29uc3QgQVRyYW5zcG9ydEZhY3Rvcnk6IElUcmFuc3BvcnRGYWN0b3J5OyBjb25zdCBBUHJvdG9jb2xGYWN0b3J5OiBJUHJvdG9jb2xGYWN0b3J5KTsgb3ZlcmxvYWQ7CisKKyAgICBwcm9jZWR1cmUgU2VydmU7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBTdG9wOyBvdmVycmlkZTsKKyAgZW5kOworCisKK2ltcGxlbWVudGF0aW9uCisKK3sgVFNlcnZlckltcGwgfQorCitjb25zdHJ1Y3RvciBUU2VydmVySW1wbC5DcmVhdGUoIGNvbnN0IEFQcm9jZXNzb3I6IElQcm9jZXNzb3I7CisgIGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQ7IGNvbnN0IEFMb2dEZWxlZ2F0ZTogVExvZ0RlbGVnYXRlKTsKK3ZhcgorICBJbnB1dEZhY3RvcnksIE91dHB1dEZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5OworICBJbnB1dFRyYW5zRmFjdG9yeSwgT3V0cHV0VHJhbnNGYWN0b3J5IDogSVRyYW5zcG9ydEZhY3Rvcnk7CisKK2JlZ2luCisgIElucHV0RmFjdG9yeSA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZTsKKyAgT3V0cHV0RmFjdG9yeSA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZTsKKyAgSW5wdXRUcmFuc0ZhY3RvcnkgOj0gVFRyYW5zcG9ydEZhY3RvcnlJbXBsLkNyZWF0ZTsKKyAgT3V0cHV0VHJhbnNGYWN0b3J5IDo9IFRUcmFuc3BvcnRGYWN0b3J5SW1wbC5DcmVhdGU7CisKKyAgLy9ubyBpbmhlcml0ZWQ7CisgIENyZWF0ZSgKKyAgICBBUHJvY2Vzc29yLAorICAgIEFTZXJ2ZXJUcmFuc3BvcnQsCisgICAgSW5wdXRUcmFuc0ZhY3RvcnksCisgICAgT3V0cHV0VHJhbnNGYWN0b3J5LAorICAgIElucHV0RmFjdG9yeSwKKyAgICBPdXRwdXRGYWN0b3J5LAorICAgIEFMb2dEZWxlZ2F0ZQorICApOworZW5kOworCitjb25zdHJ1Y3RvciBUU2VydmVySW1wbC5DcmVhdGUoY29uc3QgQVByb2Nlc3NvcjogSVByb2Nlc3NvcjsKKyAgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydCk7Cit2YXIKKyAgSW5wdXRGYWN0b3J5LCBPdXRwdXRGYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeTsKKyAgSW5wdXRUcmFuc0ZhY3RvcnksIE91dHB1dFRyYW5zRmFjdG9yeSA6IElUcmFuc3BvcnRGYWN0b3J5OworCitiZWdpbgorICBJbnB1dEZhY3RvcnkgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGU7CisgIE91dHB1dEZhY3RvcnkgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGU7CisgIElucHV0VHJhbnNGYWN0b3J5IDo9IFRUcmFuc3BvcnRGYWN0b3J5SW1wbC5DcmVhdGU7CisgIE91dHB1dFRyYW5zRmFjdG9yeSA6PSBUVHJhbnNwb3J0RmFjdG9yeUltcGwuQ3JlYXRlOworCisgIC8vbm8gaW5oZXJpdGVkOworICBDcmVhdGUoCisgICAgQVByb2Nlc3NvciwKKyAgICBBU2VydmVyVHJhbnNwb3J0LAorICAgIElucHV0VHJhbnNGYWN0b3J5LAorICAgIE91dHB1dFRyYW5zRmFjdG9yeSwKKyAgICBJbnB1dEZhY3RvcnksCisgICAgT3V0cHV0RmFjdG9yeSwKKyAgICBEZWZhdWx0TG9nRGVsZWdhdGUKKyAgKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFNlcnZlckltcGwuQ3JlYXRlKGNvbnN0IEFQcm9jZXNzb3I6IElQcm9jZXNzb3I7CisgIGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQ7IGNvbnN0IEFUcmFuc3BvcnRGYWN0b3J5OiBJVHJhbnNwb3J0RmFjdG9yeSk7Cit2YXIKKyAgSW5wdXRQcm90b2NvbEZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5OworICBPdXRwdXRQcm90b2NvbEZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5OworYmVnaW4KKyAgSW5wdXRQcm90b2NvbEZhY3RvcnkgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGU7CisgIE91dHB1dFByb3RvY29sRmFjdG9yeSA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZTsKKworICAvL25vIGluaGVyaXRlZDsKKyAgQ3JlYXRlKCBBUHJvY2Vzc29yLCBBU2VydmVyVHJhbnNwb3J0LCBBVHJhbnNwb3J0RmFjdG9yeSwgQVRyYW5zcG9ydEZhY3RvcnksCisgICAgSW5wdXRQcm90b2NvbEZhY3RvcnksIE91dHB1dFByb3RvY29sRmFjdG9yeSwgRGVmYXVsdExvZ0RlbGVnYXRlKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFNlcnZlckltcGwuQ3JlYXRlKGNvbnN0IEFQcm9jZXNzb3I6IElQcm9jZXNzb3I7CisgIGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQ7CisgIGNvbnN0IEFJbnB1dFRyYW5zcG9ydEZhY3RvcnksIEFPdXRwdXRUcmFuc3BvcnRGYWN0b3J5OiBJVHJhbnNwb3J0RmFjdG9yeTsKKyAgY29uc3QgQUlucHV0UHJvdG9jb2xGYWN0b3J5LCBBT3V0cHV0UHJvdG9jb2xGYWN0b3J5OiBJUHJvdG9jb2xGYWN0b3J5OworICBjb25zdCBBTG9nRGVsZWdhdGUgOiBUTG9nRGVsZWdhdGUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlByb2Nlc3NvciA6PSBBUHJvY2Vzc29yOworICBGU2VydmVyVHJhbnNwb3J0IDo9IEFTZXJ2ZXJUcmFuc3BvcnQ7CisgIEZJbnB1dFRyYW5zcG9ydEZhY3RvcnkgOj0gQUlucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgRk91dHB1dFRyYW5zcG9ydEZhY3RvcnkgOj0gQU91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgIEZJbnB1dFByb3RvY29sRmFjdG9yeSA6PSBBSW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgIEZPdXRwdXRQcm90b2NvbEZhY3RvcnkgOj0gQU91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgRkxvZ0RlbGVnYXRlIDo9IEFMb2dEZWxlZ2F0ZTsKK2VuZDsKKworY2xhc3MgcHJvY2VkdXJlIFRTZXJ2ZXJJbXBsLkRlZmF1bHRMb2dEZWxlZ2F0ZSggY29uc3Qgc3RyOiBzdHJpbmcpOworYmVnaW4KKyAgdHJ5CisgICAgV3JpdGVsbiggc3RyKTsKKyAgICBpZiBJb1Jlc3VsdCA8PiAwIHRoZW4gT3V0cHV0RGVidWdTdHJpbmcoUENoYXIoc3RyKSk7CisgIGV4Y2VwdAorICAgIE91dHB1dERlYnVnU3RyaW5nKFBDaGFyKHN0cikpOworICBlbmQ7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTZXJ2ZXJJbXBsLkNyZWF0ZSggY29uc3QgQVByb2Nlc3NvcjogSVByb2Nlc3NvcjsKKyAgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydDsgY29uc3QgQVRyYW5zcG9ydEZhY3Rvcnk6IElUcmFuc3BvcnRGYWN0b3J5OworICBjb25zdCBBUHJvdG9jb2xGYWN0b3J5OiBJUHJvdG9jb2xGYWN0b3J5KTsKK2JlZ2luCisgIC8vbm8gaW5oZXJpdGVkOworICBDcmVhdGUoIEFQcm9jZXNzb3IsIEFTZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgQVRyYW5zcG9ydEZhY3RvcnksIEFUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgIEFQcm90b2NvbEZhY3RvcnksIEFQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKTsKK2VuZDsKKworCitmdW5jdGlvbiBUU2VydmVySW1wbC5HZXRTZXJ2ZXJFdmVudHMgOiBJU2VydmVyRXZlbnRzOworYmVnaW4KKyAgcmVzdWx0IDo9IEZTZXJ2ZXJFdmVudHM7CitlbmQ7CisKKworcHJvY2VkdXJlIFRTZXJ2ZXJJbXBsLlNldFNlcnZlckV2ZW50cyggY29uc3QgdmFsdWUgOiBJU2VydmVyRXZlbnRzKTsKK2JlZ2luCisgIC8vIGlmIHlvdSBuZWVkIG1vcmUgdGhhbiBvbmUsIHByb3ZpZGUgYSBzcGVjaWFsaXplZCBJU2VydmVyRXZlbnRzIGltcGxlbWVudGF0aW9uCisgIEZTZXJ2ZXJFdmVudHMgOj0gdmFsdWU7CitlbmQ7CisKKworeyBUU2ltcGxlU2VydmVyIH0KKworY29uc3RydWN0b3IgVFNpbXBsZVNlcnZlci5DcmVhdGUoIGNvbnN0IEFQcm9jZXNzb3I6IElQcm9jZXNzb3I7CisgIGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQpOwordmFyCisgIElucHV0UHJvdG9jb2xGYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeTsKKyAgT3V0cHV0UHJvdG9jb2xGYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeTsKKyAgSW5wdXRUcmFuc3BvcnRGYWN0b3J5IDogSVRyYW5zcG9ydEZhY3Rvcnk7CisgIE91dHB1dFRyYW5zcG9ydEZhY3RvcnkgOiBJVHJhbnNwb3J0RmFjdG9yeTsKK2JlZ2luCisgIElucHV0UHJvdG9jb2xGYWN0b3J5IDo9IFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlOworICBPdXRwdXRQcm90b2NvbEZhY3RvcnkgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGU7CisgIElucHV0VHJhbnNwb3J0RmFjdG9yeSA6PSBUVHJhbnNwb3J0RmFjdG9yeUltcGwuQ3JlYXRlOworICBPdXRwdXRUcmFuc3BvcnRGYWN0b3J5IDo9IFRUcmFuc3BvcnRGYWN0b3J5SW1wbC5DcmVhdGU7CisKKyAgaW5oZXJpdGVkIENyZWF0ZSggQVByb2Nlc3NvciwgQVNlcnZlclRyYW5zcG9ydCwgSW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIE91dHB1dFRyYW5zcG9ydEZhY3RvcnksIElucHV0UHJvdG9jb2xGYWN0b3J5LCBPdXRwdXRQcm90b2NvbEZhY3RvcnksIERlZmF1bHRMb2dEZWxlZ2F0ZSk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTaW1wbGVTZXJ2ZXIuQ3JlYXRlKCBjb25zdCBBUHJvY2Vzc29yOiBJUHJvY2Vzc29yOworICBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0OyBBTG9nRGVsOiBUU2VydmVySW1wbC5UTG9nRGVsZWdhdGUpOwordmFyCisgIElucHV0UHJvdG9jb2xGYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeTsKKyAgT3V0cHV0UHJvdG9jb2xGYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeTsKKyAgSW5wdXRUcmFuc3BvcnRGYWN0b3J5IDogSVRyYW5zcG9ydEZhY3Rvcnk7CisgIE91dHB1dFRyYW5zcG9ydEZhY3RvcnkgOiBJVHJhbnNwb3J0RmFjdG9yeTsKK2JlZ2luCisgIElucHV0UHJvdG9jb2xGYWN0b3J5IDo9IFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlOworICBPdXRwdXRQcm90b2NvbEZhY3RvcnkgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGU7CisgIElucHV0VHJhbnNwb3J0RmFjdG9yeSA6PSBUVHJhbnNwb3J0RmFjdG9yeUltcGwuQ3JlYXRlOworICBPdXRwdXRUcmFuc3BvcnRGYWN0b3J5IDo9IFRUcmFuc3BvcnRGYWN0b3J5SW1wbC5DcmVhdGU7CisKKyAgaW5oZXJpdGVkIENyZWF0ZSggQVByb2Nlc3NvciwgQVNlcnZlclRyYW5zcG9ydCwgSW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIE91dHB1dFRyYW5zcG9ydEZhY3RvcnksIElucHV0UHJvdG9jb2xGYWN0b3J5LCBPdXRwdXRQcm90b2NvbEZhY3RvcnksIEFMb2dEZWwpOworZW5kOworCitjb25zdHJ1Y3RvciBUU2ltcGxlU2VydmVyLkNyZWF0ZSggY29uc3QgQVByb2Nlc3NvcjogSVByb2Nlc3NvcjsKKyAgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydDsgY29uc3QgQVRyYW5zcG9ydEZhY3Rvcnk6IElUcmFuc3BvcnRGYWN0b3J5KTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoIEFQcm9jZXNzb3IsIEFTZXJ2ZXJUcmFuc3BvcnQsIEFUcmFuc3BvcnRGYWN0b3J5LAorICAgIEFUcmFuc3BvcnRGYWN0b3J5LCBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZSwgVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGUsIERlZmF1bHRMb2dEZWxlZ2F0ZSk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTaW1wbGVTZXJ2ZXIuQ3JlYXRlKCBjb25zdCBBUHJvY2Vzc29yOiBJUHJvY2Vzc29yOworICBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0OyBjb25zdCBBVHJhbnNwb3J0RmFjdG9yeTogSVRyYW5zcG9ydEZhY3Rvcnk7CisgIGNvbnN0IEFQcm90b2NvbEZhY3Rvcnk6IElQcm90b2NvbEZhY3RvcnkpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZSggQVByb2Nlc3NvciwgQVNlcnZlclRyYW5zcG9ydCwgQVRyYW5zcG9ydEZhY3RvcnksCisgICAgQVRyYW5zcG9ydEZhY3RvcnksIEFQcm90b2NvbEZhY3RvcnksIEFQcm90b2NvbEZhY3RvcnksIERlZmF1bHRMb2dEZWxlZ2F0ZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2ltcGxlU2VydmVyLlNlcnZlOwordmFyCisgIGNsaWVudCA6IElUcmFuc3BvcnQ7CisgIElucHV0VHJhbnNwb3J0IDogSVRyYW5zcG9ydDsKKyAgT3V0cHV0VHJhbnNwb3J0IDogSVRyYW5zcG9ydDsKKyAgSW5wdXRQcm90b2NvbCA6IElQcm90b2NvbDsKKyAgT3V0cHV0UHJvdG9jb2wgOiBJUHJvdG9jb2w7CisgIGNvbnRleHQgOiBJUHJvY2Vzc29yRXZlbnRzOworYmVnaW4KKyAgdHJ5CisgICAgRlNlcnZlclRyYW5zcG9ydC5MaXN0ZW47CisgIGV4Y2VwdAorICAgIG9uIEU6IEV4Y2VwdGlvbiBkbworICAgIGJlZ2luCisgICAgICBGTG9nRGVsZWdhdGUoIEUuVG9TdHJpbmcpOworICAgIGVuZDsKKyAgZW5kOworCisgIGlmIEZTZXJ2ZXJFdmVudHMgPD4gbmlsCisgIHRoZW4gRlNlcnZlckV2ZW50cy5QcmVTZXJ2ZTsKKworICBjbGllbnQgOj0gbmlsOworICB3aGlsZSAobm90IEZTdG9wKSBkbworICBiZWdpbgorICAgIHRyeQorICAgICAgLy8gY2xlYW4gdXAgYW55IG9sZCBpbnN0YW5jZXMgYmVmb3JlIHdhaXRpbmcgZm9yIGNsaWVudHMKKyAgICAgIElucHV0VHJhbnNwb3J0IDo9IG5pbDsKKyAgICAgIE91dHB1dFRyYW5zcG9ydCA6PSBuaWw7CisgICAgICBJbnB1dFByb3RvY29sIDo9IG5pbDsKKyAgICAgIE91dHB1dFByb3RvY29sIDo9IG5pbDsKKworICAgICAgLy8gY2xvc2UgYW55IG9sZCBjb25uZWN0aW9ucyBiZWZvcmUgYmVmb3JlIHdhaXRpbmcgZm9yIG5ldyBjbGllbnRzCisgICAgICBpZiBjbGllbnQgPD4gbmlsIHRoZW4gdHJ5CisgICAgICAgIHRyeQorICAgICAgICAgIGNsaWVudC5DbG9zZTsKKyAgICAgICAgZmluYWxseQorICAgICAgICAgIGNsaWVudCA6PSBuaWw7CisgICAgICAgIGVuZDsKKyAgICAgIGV4Y2VwdAorICAgICAgICAvLyBjYXRjaCBhbGwsIHdlIGNhbid0IGRvIG11Y2ggYWJvdXQgaXQgYXQgdGhpcyBwb2ludAorICAgICAgZW5kOworCisgICAgICBjbGllbnQgOj0gRlNlcnZlclRyYW5zcG9ydC5BY2NlcHQoIHByb2NlZHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIEZTZXJ2ZXJFdmVudHMgPD4gbmlsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBGU2VydmVyRXZlbnRzLlByZUFjY2VwdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kKTsKKworICAgICAgaWYgY2xpZW50ID0gbmlsIHRoZW4gYmVnaW4KKyAgICAgICAgaWYgRlN0b3AKKyAgICAgICAgdGhlbiBBYm9ydCAgLy8gc2lsZW50IGV4Y2VwdGlvbgorICAgICAgICBlbHNlIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgnU2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpIG1heSBub3QgcmV0dXJuIE5VTEwnKTsKKyAgICAgIGVuZDsKKworICAgICAgRkxvZ0RlbGVnYXRlKCAnQ2xpZW50IENvbm5lY3RlZCEnKTsKKworICAgICAgSW5wdXRUcmFuc3BvcnQgOj0gRklucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoIGNsaWVudCApOworICAgICAgT3V0cHV0VHJhbnNwb3J0IDo9IEZPdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydCggY2xpZW50ICk7CisgICAgICBJbnB1dFByb3RvY29sIDo9IEZJbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCggSW5wdXRUcmFuc3BvcnQgKTsKKyAgICAgIE91dHB1dFByb3RvY29sIDo9IEZPdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woIE91dHB1dFRyYW5zcG9ydCApOworCisgICAgICBpZiBGU2VydmVyRXZlbnRzIDw+IG5pbAorICAgICAgdGhlbiBjb250ZXh0IDo9IEZTZXJ2ZXJFdmVudHMuQ3JlYXRlUHJvY2Vzc2luZ0NvbnRleHQoIElucHV0UHJvdG9jb2wsIE91dHB1dFByb3RvY29sKQorICAgICAgZWxzZSBjb250ZXh0IDo9IG5pbDsKKworICAgICAgd2hpbGUgbm90IEZTdG9wIGRvIGJlZ2luCisgICAgICAgIGlmIGNvbnRleHQgPD4gbmlsCisgICAgICAgIHRoZW4gY29udGV4dC5Qcm9jZXNzaW5nKCBjbGllbnQpOworICAgICAgICBpZiBub3QgRlByb2Nlc3Nvci5Qcm9jZXNzKCBJbnB1dFByb3RvY29sLCBPdXRwdXRQcm90b2NvbCwgY29udGV4dCkKKyAgICAgICAgdGhlbiBCcmVhazsKKyAgICAgIGVuZDsKKworICAgIGV4Y2VwdAorICAgICAgb24gRTogVFRyYW5zcG9ydEV4Y2VwdGlvbiBkbworICAgICAgYmVnaW4KKyAgICAgICAgaWYgRlN0b3AKKyAgICAgICAgdGhlbiBGTG9nRGVsZWdhdGUoJ1RTaW1wbGVTZXJ2ZXIgd2FzIHNodXR0aW5nIGRvd24sIGNhdWdodCAnICsgRS5Ub1N0cmluZykKKyAgICAgICAgZWxzZSBGTG9nRGVsZWdhdGUoIEUuVG9TdHJpbmcpOworICAgICAgZW5kOworICAgICAgb24gRTogRXhjZXB0aW9uIGRvCisgICAgICBiZWdpbgorICAgICAgICBGTG9nRGVsZWdhdGUoIEUuVG9TdHJpbmcpOworICAgICAgZW5kOworICAgIGVuZDsKKworICAgIGlmIGNvbnRleHQgPD4gbmlsCisgICAgdGhlbiBiZWdpbgorICAgICAgY29udGV4dC5DbGVhbnVwQ29udGV4dDsKKyAgICAgIGNvbnRleHQgOj0gbmlsOworICAgIGVuZDsKKworICAgIGlmIElucHV0VHJhbnNwb3J0IDw+IG5pbCB0aGVuCisgICAgYmVnaW4KKyAgICAgIElucHV0VHJhbnNwb3J0LkNsb3NlOworICAgIGVuZDsKKyAgICBpZiBPdXRwdXRUcmFuc3BvcnQgPD4gbmlsIHRoZW4KKyAgICBiZWdpbgorICAgICAgT3V0cHV0VHJhbnNwb3J0LkNsb3NlOworICAgIGVuZDsKKyAgZW5kOworCisgIGlmIEZTdG9wIHRoZW4KKyAgYmVnaW4KKyAgICB0cnkKKyAgICAgIEZTZXJ2ZXJUcmFuc3BvcnQuQ2xvc2U7CisgICAgZXhjZXB0CisgICAgICBvbiBFOiBUVHJhbnNwb3J0RXhjZXB0aW9uIGRvCisgICAgICBiZWdpbgorICAgICAgICBGTG9nRGVsZWdhdGUoJ1RTZXJ2ZXJUcmFucG9ydCBmYWlsZWQgb24gY2xvc2U6ICcgKyBFLk1lc3NhZ2UpOworICAgICAgZW5kOworICAgIGVuZDsKKyAgICBGU3RvcCA6PSBGYWxzZTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVFNpbXBsZVNlcnZlci5TdG9wOworYmVnaW4KKyAgRlN0b3AgOj0gVHJ1ZTsKKyAgRlNlcnZlclRyYW5zcG9ydC5DbG9zZTsKK2VuZDsKKworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNvY2tldC5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuU29ja2V0LnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGNhYjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNvY2tldC5wYXMKQEAgLTAsMCArMSwxNjE3IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGhyaWZ0LlNvY2tldDsKKworeyRJIFRocmlmdC5EZWZpbmVzLmluY30KK3skSS19ICAvLyBwcmV2ZW50IGFubm95aW5nIGVycm9ycyB3aXRoIGRlZmF1bHQgbG9nIGRlbGVnYXRlIGFuZCBubyBjb25zb2xlCisKK2ludGVyZmFjZQoreyRJRk5ERUYgT0xEX1NPQ0tFVFN9IC8vIG5vdCBmb3IgT0xEX1NPQ0tFVFMKKwordXNlcworICBXaW5hcGkuV2luZG93cywgV2luYXBpLldpbnNvY2syOworCitjb25zdAorICBBSV9QQVNTSVZFICAgICAgICAgICAgICAgID0gJDAwMDAwMDAxOyAgLy8gU29ja2V0IGFkZHJlc3Mgd2lsbCBiZSB1c2VkIGluIGJpbmQoKSBjYWxsCisgIEFJX0NBTk9OTkFNRSAgICAgICAgICAgICAgPSAkMDAwMDAwMDI7ICAvLyBSZXR1cm4gY2Fub25pY2FsIG5hbWUgaW4gZmlyc3QgYWlfY2Fub25uYW1lCisgIEFJX05VTUVSSUNIT1NUICAgICAgICAgICAgPSAkMDAwMDAwMDQ7ICAvLyBOb2RlbmFtZSBtdXN0IGJlIGEgbnVtZXJpYyBhZGRyZXNzIHN0cmluZworICBBSV9OVU1FUklDU0VSViAgICAgICAgICAgID0gJDAwMDAwMDA4OyAgLy8gU2VydmljZW5hbWUgbXVzdCBiZSBhIG51bWVyaWMgcG9ydCBudW1iZXIKKworICBBSV9BTEwgICAgICAgICAgICAgICAgICAgID0gJDAwMDAwMTAwOyAgLy8gUXVlcnkgYm90aCBJUDYgYW5kIElQNCB3aXRoIEFJX1Y0TUFQUEVECisgIEFJX0FERFJDT05GSUcgICAgICAgICAgICAgPSAkMDAwMDA0MDA7ICAvLyBSZXNvbHV0aW9uIG9ubHkgaWYgZ2xvYmFsIGFkZHJlc3MgY29uZmlndXJlZAorICBBSV9WNE1BUFBFRCAgICAgICAgICAgICAgID0gJDAwMDAwODAwOyAgLy8gT24gdjYgZmFpbHVyZSwgcXVlcnkgdjQgYW5kIGNvbnZlcnQgdG8gVjRNQVBQRUQgZm9ybWF0CisKKyAgQUlfTk9OX0FVVEhPUklUQVRJVkUgICAgICA9ICQwMDAwNDAwMDsgIC8vIExVUF9OT05fQVVUSE9SSVRBVElWRQorICBBSV9TRUNVUkUgICAgICAgICAgICAgICAgID0gJDAwMDA4MDAwOyAgLy8gTFVQX1NFQ1VSRQorICBBSV9SRVRVUk5fUFJFRkVSUkVEX05BTUVTID0gJDAwMDEwMDAwOyAgLy8gTFVQX1JFVFVSTl9QUkVGRVJSRURfTkFNRVMKKworICBBSV9GUUROICAgICAgICAgICAgICAgICAgID0gJDAwMDIwMDAwOyAgLy8gUmV0dXJuIHRoZSBGUUROIGluIGFpX2Nhbm9ubmFtZQorICBBSV9GSUxFU0VSVkVSICAgICAgICAgICAgID0gJDAwMDQwMDAwOyAgLy8gUmVzb2x2aW5nIGZpbGVzZXJ2ZXIgbmFtZSByZXNvbHV0aW9uCisKK3R5cGUKKyAgUEFkZHJJbmZvQSA9IF5UQWRkckluZm9BOworICBUQWRkckluZm9BID0gcmVjb3JkCisgICAgYWlfZmxhZ3M6IEludGVnZXI7CisgICAgYWlfZmFtaWx5OiBJbnRlZ2VyOworICAgIGFpX3NvY2t0eXBlOiBJbnRlZ2VyOworICAgIGFpX3Byb3RvY29sOiBJbnRlZ2VyOworICAgIGFpX2FkZHJsZW46IE5hdGl2ZVVJbnQ7CisgICAgYWlfY2Fub25uYW1lOiBQQW5zaUNoYXI7CisgICAgYWlfYWRkcjogUFNvY2tBZGRyOworICAgIGFpX25leHQ6IFBBZGRySW5mb0E7CisgIGVuZDsKKworICBQQWRkckluZm9XID0gXlRBZGRySW5mb1c7CisgIFRBZGRySW5mb1cgPSByZWNvcmQKKyAgICBhaV9mbGFnczogSW50ZWdlcjsKKyAgICBhaV9mYW1pbHk6IEludGVnZXI7CisgICAgYWlfc29ja3R5cGU6IEludGVnZXI7CisgICAgYWlfcHJvdG9jb2w6IEludGVnZXI7CisgICAgYWlfYWRkcmxlbjogTmF0aXZlVUludDsKKyAgICBhaV9jYW5vbm5hbWU6IFBDaGFyOworICAgIGFpX2FkZHI6IFBTb2NrQWRkcjsKKyAgICBhaV9uZXh0OiBQQWRkckluZm9XOworICBlbmQ7CisKKyAgVEFkZHJlc3NGYW1pbHkgPSBVU0hPUlQ7CisKKyAgVEluNkFkZHIgPSByZWNvcmQKKyAgY2FzZSBJbnRlZ2VyIG9mCisgICAgMDogKF9CeXRlOiBhcnJheVswLi4xNV0gb2YgVUNIQVIpOworICAgIDE6IChfV29yZDogYXJyYXlbMC4uN10gb2YgVVNIT1JUKTsKKyAgZW5kOworCisgIFRTY29wZUlkID0gcmVjb3JkCisgIHB1YmxpYworICAgIFZhbHVlOiBVTE9ORzsKKyAgcHJpdmF0ZQorICAgIGZ1bmN0aW9uIEdldEJpdEZpZWxkKExvYzogSW50ZWdlcik6IEludGVnZXI7IGlubGluZTsKKyAgICBwcm9jZWR1cmUgU2V0Qml0RmllbGQoTG9jOiBJbnRlZ2VyOyBjb25zdCBhVmFsdWU6IEludGVnZXIpOyBpbmxpbmU7CisgIHB1YmxpYworICAgIHByb3BlcnR5IFpvbmU6IEludGVnZXIgaW5kZXggJDAwMjggcmVhZCBHZXRCaXRGaWVsZCB3cml0ZSBTZXRCaXRGaWVsZDsKKyAgICBwcm9wZXJ0eSBMZXZlbDogSW50ZWdlciBpbmRleCAkMjgwNCByZWFkIEdldEJpdEZpZWxkIHdyaXRlIFNldEJpdEZpZWxkOworICBlbmQ7CisKKyAgVFNvY2tBZGRySW42ID0gcmVjb3JkCisgICAgc2luNl9mYW1pbHk6IFRBZGRyZXNzRmFtaWx5OworICAgIHNpbjZfcG9ydDogVVNIT1JUOworICAgIHNpbjZfZmxvd2luZm86IFVMT05HOworICAgIHNpbjZfYWRkcjogVEluNkFkZHI7CisgIGNhc2UgSW50ZWdlciBvZgorICAgIDA6IChzaW42X3Njb3BlX2lkOiBVTE9ORyk7CisgICAgMTogKHNpbjZfc2NvcGVfc3RydWN0OiBUU2NvcGVJZCk7CisgIGVuZDsKKyAgUFNvY2tBZGRySW42ID0gXlRTb2NrQWRkckluNjsKKworY29uc3QKKyAgTklfTk9GUUROICAgICAgPSAkMDE7ICAvLyBPbmx5IHJldHVybiBub2RlbmFtZSBwb3J0aW9uIGZvciBsb2NhbCBob3N0cworICBOSV9OVU1FUklDSE9TVCA9ICQwMjsgIC8vIFJldHVybiBudW1lcmljIGZvcm0gb2YgdGhlIGhvc3QncyBhZGRyZXNzCisgIE5JX05BTUVSRVFEICAgID0gJDA0OyAgLy8gRXJyb3IgaWYgdGhlIGhvc3QncyBuYW1lIG5vdCBpbiBETlMKKyAgTklfTlVNRVJJQ1NFUlYgPSAkMDg7ICAvLyBSZXR1cm4gbnVtZXJpYyBmb3JtIG9mIHRoZSBzZXJ2aWNlIChwb3J0ICMpCisgIE5JX0RHUkFNICAgICAgID0gJDEwOyAgLy8gU2VydmljZSBpcyBhIGRhdGFncmFtIHNlcnZpY2UKKworICBOSV9NQVhIT1NUICAgICA9IDEwMjU7ICAvLyBNYXggc2l6ZSBvZiBhIGZ1bGx5LXF1YWxpZmllZCBkb21haW4gbmFtZQorICBOSV9NQVhTRVJWICAgICA9IDMyOyAgICAvLyBNYXggc2l6ZSBvZiBhIHNlcnZpY2UgbmFtZQorCitmdW5jdGlvbiBnZXRhZGRyaW5mbyhwTm9kZU5hbWUsIHBTZXJ2aWNlTmFtZTogUEFuc2lDaGFyOyBjb25zdCBwSGludHM6IFRBZGRySW5mb0E7IHZhciBwcFJlc3VsdDogUEFkZHJJbmZvQSk6IEludGVnZXI7IHN0ZGNhbGw7CitmdW5jdGlvbiBHZXRBZGRySW5mb1cocE5vZGVOYW1lLCBwU2VydmljZU5hbWU6IFBXaWRlQ2hhcjsgY29uc3QgcEhpbnRzOiBUQWRkckluZm9XOyB2YXIgcHBSZXN1bHQ6IFBBZGRySW5mb1cpOiBJbnRlZ2VyOyBzdGRjYWxsOworcHJvY2VkdXJlIGZyZWVhZGRyaW5mbyhwQWRkckluZm86IFBBZGRySW5mb0EpOyBzdGRjYWxsOworcHJvY2VkdXJlIEZyZWVBZGRySW5mb1cocEFkZHJJbmZvOiBQQWRkckluZm9XKTsgc3RkY2FsbDsKK2Z1bmN0aW9uIGdldG5hbWVpbmZvKGNvbnN0IHBTb2NrYWRkcjogVFNvY2tBZGRyOyBTb2NrYWRkckxlbmd0aDogSW50ZWdlcjsgcE5vZGVCdWZmZXI6IFBBbnNpQ2hhcjsgTm9kZUJ1ZmZlclNpemU6IERXT1JEOyBwU2VydmljZUJ1ZmZlcjogUEFuc2lDaGFyOworICBTZXJ2aWNlQnVmZmVyU2l6ZTogRFdPUkQ7IEZsYWdzOiBJbnRlZ2VyKTogSW50ZWdlcjsgc3RkY2FsbDsKK2Z1bmN0aW9uIEdldE5hbWVJbmZvVyhjb25zdCBwU29ja2FkZHI6IFRTb2NrQWRkcjsgU29ja2FkZHJMZW5ndGg6IEludGVnZXI7IHBOb2RlQnVmZmVyOiBQV2lkZUNoYXI7IE5vZGVCdWZmZXJTaXplOiBEV09SRDsgcFNlcnZpY2VCdWZmZXI6IFBXaWRlQ2hhcjsKKyAgU2VydmljZUJ1ZmZlclNpemU6IERXT1JEOyBGbGFnczogSW50ZWdlcik6IEludGVnZXI7IHN0ZGNhbGw7CisKK3R5cGUKKyAgVFNtYXJ0UG9pbnRlckRlc3Ryb3llcjxUPiA9IHJlZmVyZW5jZSB0byBwcm9jZWR1cmUoVmFsdWU6IFQpOworCisgIElTbWFydFBvaW50ZXI8VD4gPSByZWZlcmVuY2UgdG8gZnVuY3Rpb246IFQ7CisKKyAgVFNtYXJ0UG9pbnRlcjxUPiA9IGNsYXNzKFRJbnRlcmZhY2VkT2JqZWN0LCBJU21hcnRQb2ludGVyPFQ+KQorICBwcml2YXRlCisgICAgRlZhbHVlOiBUOworICAgIEZEZXN0cm95ZXI6IFRTbWFydFBvaW50ZXJEZXN0cm95ZXI8VD47CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBVmFsdWU6IFQ7IEFEZXN0cm95ZXI6IFRTbWFydFBvaW50ZXJEZXN0cm95ZXI8VD4pOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gSW52b2tlOiBUOworICBlbmQ7CisKKyAgVEJhc2VTb2NrZXQgPSBjbGFzcyBhYnN0cmFjdAorICBwdWJsaWMgdHlwZQorICAgIFRMb2dEZWxlZ2F0ZSA9IHJlZmVyZW5jZSB0byBwcm9jZWR1cmUoIGNvbnN0IHN0cjogc3RyaW5nKTsKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGUG9ydDogSW50ZWdlcjsKKyAgICBGU29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsKKyAgICBGU2VuZFRpbWVvdXQsCisgICAgRlJlY3ZUaW1lb3V0OiBMb25nd29yZDsKKyAgICBGS2VlcEFsaXZlOiBCb29sZWFuOworICAgIEZMb2dEZWxlZ2F0ZTogVExvZ0RlbGVnYXRlOworICAgIGNsYXNzIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgICBjbGFzcyBkZXN0cnVjdG9yIERlc3Ryb3k7CisgICAgY2xhc3MgcHJvY2VkdXJlIERlZmF1bHRMb2dEZWxlZ2F0ZShjb25zdCBTdHI6IHN0cmluZyk7CisgIHByb3RlY3RlZCB0eXBlCisgICAgSUdldEFkZHJJbmZvV3JhcHBlciA9IGludGVyZmFjZQorICAgICAgZnVuY3Rpb24gSW5pdDogSW50ZWdlcjsKKyAgICAgIGZ1bmN0aW9uIEdldFJlczogUEFkZHJJbmZvVzsKKyAgICAgIHByb3BlcnR5IFJlczogUEFkZHJJbmZvVyByZWFkIEdldFJlczsKKyAgICBlbmQ7CisgICAgVEdldEFkZHJJbmZvV3JhcHBlciA9IGNsYXNzKFRJbnRlcmZhY2VkT2JqZWN0LCBJR2V0QWRkckluZm9XcmFwcGVyKQorICAgIHN0cmljdCBwcml2YXRlCisgICAgICBGTm9kZTogc3RyaW5nOworICAgICAgRlNlcnZpY2U6IHN0cmluZzsKKyAgICAgIEZIaW50cywKKyAgICAgIEZSZXM6IFBBZGRySW5mb1c7CisgICAgcHVibGljCisgICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQU5vZGUsIEFTZXJ2aWNlOiBzdHJpbmc7IEFIaW50czogUEFkZHJJbmZvVyk7CisgICAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworICAgICAgZnVuY3Rpb24gSW5pdDogSW50ZWdlcjsKKyAgICAgIGZ1bmN0aW9uIEdldFJlczogUEFkZHJJbmZvVzsKKyAgICAgIHByb3BlcnR5IFJlczogUEFkZHJJbmZvVyByZWFkIEdldFJlczsKKyAgICBlbmQ7CisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgQ29tbW9uSW5pdDsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBDcmVhdGVTb2NrZXQoQUFkZHJlc3M6IHN0cmluZzsgQVBvcnQ6IEludGVnZXIpOiBJR2V0QWRkckluZm9XcmFwcGVyOworICAgIHByb2NlZHVyZSBTZXRSZWN2VGltZW91dChBUmVjdlRpbWVvdXQ6IExvbmd3b3JkKTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgU2V0U2VuZFRpbWVvdXQoQVNlbmRUaW1lb3V0OiBMb25nd29yZCk7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFNldEtlZXBBbGl2ZShBS2VlcEFsaXZlOiBCb29sZWFuKTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgU2V0U29ja2V0KEFTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0KTsKKyAgICBwcm9wZXJ0eSBMb2dEZWxlZ2F0ZTogVExvZ0RlbGVnYXRlIHJlYWQgRkxvZ0RlbGVnYXRlOworICBwdWJsaWMKKyAgICAvLworICAgIC8vIENvbnN0cnVjdHMgYSBuZXcgc29ja2V0LiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBhY3R1YWxseSBjb25uZWN0IHRoZQorICAgIC8vIHNvY2tldC4KKyAgICAvLworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBTG9nRGVsZWdhdGU6IFRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBUG9ydDogSW50ZWdlcjsgQUxvZ0RlbGVnYXRlOiBUTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKworICAgIC8vCisgICAgLy8gRGVzdHJveXMgdGhlIHNvY2tldCBvYmplY3QsIGNsb3NpbmcgaXQgaWYgbmVjZXNzYXJ5LgorICAgIC8vCisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKworICAgIC8vCisgICAgLy8gU2h1dHMgZG93biBjb21tdW5pY2F0aW9ucyBvbiB0aGUgc29ja2V0CisgICAgLy8KKyAgICBwcm9jZWR1cmUgQ2xvc2U7IHZpcnR1YWw7CisKKyAgICAvLyBUaGUgcG9ydCB0aGF0IHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCisgICAgcHJvcGVydHkgUG9ydDogSW50ZWdlciByZWFkIEZQb3J0IHdyaXRlIEZQb3J0OworCisgICAgLy8gVGhlIHJlY2VpdmUgdGltZW91dAorICAgIHByb3BlcnR5IFJlY3ZUaW1lb3V0OiBMb25nd29yZCByZWFkIEZSZWN2VGltZW91dCB3cml0ZSBTZXRSZWN2VGltZW91dDsKKworICAgIC8vIFRoZSBzZW5kIHRpbWVvdXQKKyAgICBwcm9wZXJ0eSBTZW5kVGltZW91dDogTG9uZ3dvcmQgcmVhZCBGU2VuZFRpbWVvdXQgd3JpdGUgU2V0U2VuZFRpbWVvdXQ7CisKKyAgICAvLyBTZXQgU09fS0VFUEFMSVZFCisgICAgcHJvcGVydHkgS2VlcEFsaXZlOiBCb29sZWFuIHJlYWQgRktlZXBBbGl2ZSB3cml0ZSBTZXRLZWVwQWxpdmU7CisKKyAgICAvLyBUaGUgdW5kZXJseWluZyBzb2NrZXQgZGVzY3JpcHRvcgorICAgIHByb3BlcnR5IFNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQgcmVhZCBGU29ja2V0IHdyaXRlIFNldFNvY2tldDsKKyAgZW5kOworCisgIFRTb2NrZXQgPSBjbGFzcyhUQmFzZVNvY2tldCkKKyAgc3RyaWN0IHByaXZhdGUgdHlwZQorICAgIFRDYWNoZWRQZWVyQWRkciA9IHJlY29yZAorICAgIGNhc2UgSW50ZWdlciBvZgorICAgICAgMDogKGlwdjQ6IFRTb2NrQWRkckluKTsKKyAgICAgIDE6IChpcHY2OiBUU29ja0FkZHJJbjYpOworICAgIGVuZDsKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGSG9zdDogc3RyaW5nOworICAgIEZQZWVySG9zdDogc3RyaW5nOworICAgIEZQZWVyQWRkcmVzczogc3RyaW5nOworICAgIEZQZWVyUG9ydDogSW50ZWdlcjsKKyAgICBGSW50ZXJydXB0TGlzdGVuZXI6IElTbWFydFBvaW50ZXI8V2luYXBpLldpbnNvY2syLlRTb2NrZXQ+OworICAgIEZDb25uVGltZW91dDogTG9uZ3dvcmQ7CisgICAgRkxpbmdlck9uOiBCb29sZWFuOworICAgIEZMaW5nZXJWYWw6IEludGVnZXI7CisgICAgRk5vRGVsYXk6IEJvb2xlYW47CisgICAgRk1heFJlY3ZSZXRyaWVzOiBMb25nd29yZDsKKyAgICBGQ2FjaGVkUGVlckFkZHI6IFRDYWNoZWRQZWVyQWRkcjsKKyAgICBwcm9jZWR1cmUgSW5pdFBlZXJJbmZvOworICAgIHByb2NlZHVyZSBPcGVuQ29ubmVjdGlvbihSZXM6IFRCYXNlU29ja2V0LklHZXRBZGRySW5mb1dyYXBwZXIpOworICAgIHByb2NlZHVyZSBMb2NhbE9wZW47CisgICAgcHJvY2VkdXJlIFNldEdlbmVyaWNUaW1lb3V0KFM6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OyBUaW1lb3V0OiBMb25nd29yZDsgT3B0TmFtZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOworICAgIHByb2NlZHVyZSBTZXROb0RlbGF5KEFOb0RlbGF5OiBCb29sZWFuKTsKKyAgICBmdW5jdGlvbiBHZXRTb2NrZXRJbmZvOiBzdHJpbmc7CisgICAgZnVuY3Rpb24gR2V0UGVlckhvc3Q6IHN0cmluZzsKKyAgICBmdW5jdGlvbiBHZXRQZWVyQWRkcmVzczogc3RyaW5nOworICAgIGZ1bmN0aW9uIEdldFBlZXJQb3J0OiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uIEdldE9yaWdpbjogc3RyaW5nOworICBzdHJpY3QgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIENvbW1vbkluaXQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBTZXRSZWN2VGltZW91dChBUmVjdlRpbWVvdXQ6IExvbmd3b3JkKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFNldFNlbmRUaW1lb3V0KEFTZW5kVGltZW91dDogTG9uZ3dvcmQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgU2V0S2VlcEFsaXZlKEFLZWVwQWxpdmU6IEJvb2xlYW4pOyBvdmVycmlkZTsKKyAgcHVibGljCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3RzIGEgbmV3IHNvY2tldC4gTm90ZSB0aGF0IHRoaXMgZG9lcyBOT1QgYWN0dWFsbHkgY29ubmVjdCB0aGUKKyAgICAvLyBzb2NrZXQuCisgICAgLy8KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKworICAgIC8vCisgICAgLy8gQ29uc3RydWN0cyBhIG5ldyBzb2NrZXQuIE5vdGUgdGhhdCB0aGlzIGRvZXMgTk9UIGFjdHVhbGx5IGNvbm5lY3QgdGhlCisgICAgLy8gc29ja2V0LgorICAgIC8vCisgICAgLy8gQHBhcmFtIGhvc3QgQW4gSVAgYWRkcmVzcyBvciBob3N0bmFtZSB0byBjb25uZWN0IHRvCisgICAgLy8gQHBhcmFtIHBvcnQgVGhlIHBvcnQgdG8gY29ubmVjdCBvbgorICAgIC8vCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFIb3N0OiBzdHJpbmc7IEFQb3J0OiBJbnRlZ2VyOyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3RvciB0byBjcmVhdGUgc29ja2V0IGZyb20gc29ja2V0IGRlc2NyaXB0b3IuCisgICAgLy8KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQVNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlID0gbmlsKTsgb3ZlcmxvYWQ7CisKKyAgICAvLworICAgIC8vIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBzb2NrZXQgZnJvbSBzb2NrZXQgZGVzY3JpcHRvciB0aGF0CisgICAgLy8gY2FuIGJlIGludGVycnVwdGVkIHNhZmVseS4KKyAgICAvLworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBU29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsgQUludGVycnVwdExpc3RlbmVyOiBJU21hcnRQb2ludGVyPFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0PjsKKyAgICAgIEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlID0gbmlsKTsgb3ZlcmxvYWQ7CisKKyAgICAvLworICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBzb2NrZXQKKyAgICAvLworICAgIC8vIEB0aHJvd3MgRVRyYW5zcG9ydGF0aW9uRXhjZXB0aW9uIElmIHRoZSBzb2NrZXQgY291bGQgbm90IGNvbm5lY3QKKyAgICAvLworICAgIHByb2NlZHVyZSBPcGVuOworCisgICAgLy8KKyAgICAvLyBTaHV0cyBkb3duIGNvbW11bmljYXRpb25zIG9uIHRoZSBzb2NrZXQKKyAgICAvLworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisKKyAgICAvLworICAgIC8vIFJlYWRzIGZyb20gdGhlIHVuZGVybHlpbmcgc29ja2V0LgorICAgIC8vIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciAwIGluZGljYXRlcyBFT0YKKyAgICAvLyBcdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gb2YgdHlwZXM6CisgICAgLy8gICAgICAgICAgSW50ZXJydXB0ZWQgbWVhbnMgdGhlIHNvY2tldCB3YXMgaW50ZXJydXB0ZWQKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICBvdXQgb2YgYSBibG9ja2luZyBjYWxsCisgICAgLy8gICAgICAgICAgTm90T3BlbiBtZWFucyB0aGUgc29ja2V0IGhhcyBiZWVuIGNsb3NlZAorICAgIC8vICAgICAgICAgIFRpbWVkT3V0IG1lYW5zIHRoZSByZWNlaXZlIHRpbWVvdXQgZXhwaXJlZAorICAgIC8vICAgICAgICAgIFVua25vd24gbWVhbnMgc29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFwcGVuZWQKKyAgICAvLworICAgIGZ1bmN0aW9uIFJlYWQodmFyIEJ1ZjsgTGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKKworICAgIC8vCisgICAgLy8gV3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4gIExvb3BzIHVudGlsIGRvbmUgb3IgZmFpbC4KKyAgICAvLworICAgIHByb2NlZHVyZSBXcml0ZShjb25zdCBCdWY7IExlbjogSW50ZWdlcik7CisKKyAgICAvLworICAgIC8vIFdyaXRlcyB0byB0aGUgdW5kZXJseWluZyBzb2NrZXQuICBEb2VzIHNpbmdsZSBzZW5kKCkgYW5kIHJldHVybnMgcmVzdWx0LgorICAgIC8vCisgICAgZnVuY3Rpb24gV3JpdGVQYXJ0aWFsKGNvbnN0IEJ1ZjsgTGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKKworICAgIC8vCisgICAgLy8gUmV0dXJucyBhIGNhY2hlZCBjb3B5IG9mIHRoZSBwZWVyIGFkZHJlc3MuCisgICAgLy8KKyAgICBmdW5jdGlvbiBHZXRDYWNoZWRBZGRyZXNzKG91dCBMZW46IEludGVnZXIpOiBQU29ja0FkZHI7CisKKyAgICAvLworICAgIC8vIFNldCBhIGNhY2hlIG9mIHRoZSBwZWVyIGFkZHJlc3MgKHVzZWQgd2hlbiB0cml2aWFsbHkgYXZhaWxhYmxlOiBlLmcuCisgICAgLy8gYWNjZXB0KCkgb3IgY29ubmVjdCgpKS4gT25seSBjYWNoZXMgSVBWNCBhbmQgSVBWNjsgdW5zZXQgZm9yIG90aGVycy4KKyAgICAvLworICAgIHByb2NlZHVyZSBTZXRDYWNoZWRBZGRyZXNzKGNvbnN0IEFkZHI6IFRTb2NrQWRkcjsgTGVuOiBJbnRlZ2VyKTsKKworICAgIC8vCisgICAgLy8gQ29udHJvbHMgd2hldGhlciB0aGUgbGluZ2VyIG9wdGlvbiBpcyBzZXQgb24gdGhlIHNvY2tldC4KKyAgICAvLworICAgIC8vIEBwYXJhbSBvbiAgICAgIFdoZXRoZXIgU09fTElOR0VSIGlzIG9uCisgICAgLy8gQHBhcmFtIGxpbmdlciAgSWYgbGluZ2VyIGlzIGFjdGl2ZSwgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIGxpbmdlciBmb3IKKyAgICAvLworICAgIHByb2NlZHVyZSBTZXRMaW5nZXIoTGluZ2VyT246IEJvb2xlYW47IExpbmdlclZhbDogSW50ZWdlcik7CisKKyAgICAvLworICAgIC8vIENhbGxzIHNlbGVjdCgpIG9uIHRoZSBzb2NrZXQgdG8gc2VlIGlmIHRoZXJlIGlzIG1vcmUgZGF0YSBhdmFpbGFibGUuCisgICAgLy8KKyAgICBmdW5jdGlvbiBQZWVrOiBCb29sZWFuOworCisgICAgLy8gV2hldGhlciB0aGUgc29ja2V0IGlzIGFsaXZlCisgICAgcHJvcGVydHkgSXNPcGVuOiBCb29sZWFuIHJlYWQgR2V0SXNPcGVuOworCisgICAgLy8gVGhlIGhvc3QgdGhhdCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCB0bworICAgIHByb3BlcnR5IEhvc3Q6IHN0cmluZyByZWFkIEZIb3N0IHdyaXRlIEZIb3N0OworCisgICAgLy8gV2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSBOYWdsZSdzIGFsZ29yaXRobQorICAgIHByb3BlcnR5IE5vRGVsYXk6IEJvb2xlYW4gcmVhZCBGTm9EZWxheSB3cml0ZSBTZXROb0RlbGF5OworCisgICAgLy8gQ29ubmVjdCB0aW1lb3V0CisgICAgcHJvcGVydHkgQ29ublRpbWVvdXQ6IExvbmd3b3JkIHJlYWQgRkNvbm5UaW1lb3V0IHdyaXRlIEZDb25uVGltZW91dDsKKworICAgIC8vIFRoZSBtYXggbnVtYmVyIG9mIHJlY3YgcmV0cmllcyBpbiB0aGUgY2FzZSBvZiBhIFdTQUVXT1VMREJMT0NLCisgICAgcHJvcGVydHkgTWF4UmVjdlJldHJpZXM6IExvbmd3b3JkIHJlYWQgRk1heFJlY3ZSZXRyaWVzIHdyaXRlIEZNYXhSZWN2UmV0cmllczsKKworICAgIC8vIFNvY2tldCBpbmZvcm1hdGlvbiBmb3JtYXR0ZWQgYXMgYSBzdHJpbmcgPEhvc3Q6IHggUG9ydDogeD4KKyAgICBwcm9wZXJ0eSBTb2NrZXRJbmZvOiBzdHJpbmcgcmVhZCBHZXRTb2NrZXRJbmZvOworCisgICAgLy8gVGhlIEROUyBuYW1lIG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkCisgICAgcHJvcGVydHkgUGVlckhvc3Q6IHN0cmluZyByZWFkIEdldFBlZXJIb3N0OworCisgICAgLy8gVGhlIGFkZHJlc3Mgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQKKyAgICBwcm9wZXJ0eSBQZWVyQWRkcmVzczogc3RyaW5nIHJlYWQgR2V0UGVlckFkZHJlc3M7CisKKyAgICAvLyBUaGUgcG9ydCBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZAorICAgIHByb3BlcnR5IFBlZXJQb3J0OiBJbnRlZ2VyIHJlYWQgR2V0UGVlclBvcnQ7CisKKyAgICAvLyBUaGUgb3JpZ2luIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCisgICAgcHJvcGVydHkgT3JpZ2luOiBzdHJpbmcgcmVhZCBHZXRPcmlnaW47CisgIGVuZDsKKworICBUU2VydmVyU29ja2V0RnVuYyA9IHJlZmVyZW5jZSB0byBwcm9jZWR1cmUoc29jazogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOworCisgIFRTZXJ2ZXJTb2NrZXQgPSBjbGFzcyhUQmFzZVNvY2tldCkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGQWRkcmVzczogc3RyaW5nOworICAgIEZBY2NlcHRCYWNrbG9nLAorICAgIEZSZXRyeUxpbWl0LAorICAgIEZSZXRyeURlbGF5LAorICAgIEZUY3BTZW5kQnVmZmVyLAorICAgIEZUY3BSZWN2QnVmZmVyOiBJbnRlZ2VyOworICAgIEZBY2NlcHRUaW1lb3V0OiBMb25nd29yZDsKKyAgICBGTGlzdGVuaW5nLAorICAgIEZJbnRlcnJ1cHRhYmxlQ2hpbGRyZW46IEJvb2xlYW47CisgICAgRkludGVycnVwdFNvY2tXcml0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3RpZmllZCBvbiBJbnRlcnJ1cHQoKQorICAgIEZJbnRlcnJ1cHRTb2NrUmVhZGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdXNlZCBpbiBzZWxlY3Qgd2l0aCBGU29ja2V0IGZvciBpbnRlcnJ1cHRhYmlsaXR5CisgICAgRkNoaWxkSW50ZXJydXB0U29ja1dyaXRlcjogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7ICAgICAgICAgICAgICAgICAvLyBpcyBub3RpZmllZCBvbiBJbnRlcnJ1cHRDaGlsZHJlbigpCisgICAgRkNoaWxkSW50ZXJydXB0U29ja1JlYWRlcjogSVNtYXJ0UG9pbnRlcjxXaW5hcGkuV2luc29jazIuVFNvY2tldD47ICAvLyBpZiBGbnRlcnJ1cHRhYmxlQ2hpbGRyZW4gdGhpcyBpcyBzaGFyZWQgd2l0aCBjaGlsZCBUU29ja2V0cworICAgIEZMaXN0ZW5DYWxsYmFjaywKKyAgICBGQWNjZXB0Q2FsbGJhY2s6IFRTZXJ2ZXJTb2NrZXRGdW5jOworICAgIGZ1bmN0aW9uIENyZWF0ZVNvY2tldE9iaihDbGllbnQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0KTogVFNvY2tldDsKKyAgICBwcm9jZWR1cmUgTm90aWZ5KE5vdGlmeVNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOworICAgIHByb2NlZHVyZSBTZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oQVZhbHVlOiBCb29sZWFuKTsKKyAgc3RyaWN0IHByb3RlY3RlZAorICAgIHByb2NlZHVyZSBDb21tb25Jbml0OyBvdmVycmlkZTsKKyAgcHVibGljIGNvbnN0CisgICAgREVGQVVMVF9CQUNLTE9HID0gMTAyNDsKKyAgcHVibGljCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3Rvci4KKyAgICAvLworICAgIC8vIEBwYXJhbSBwb3J0ICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICAvLworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBUG9ydDogSW50ZWdlcjsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKworICAgIC8vCisgICAgLy8gQ29uc3RydWN0b3IuCisgICAgLy8KKyAgICAvLyBAcGFyYW0gcG9ydCAgICAgICAgUG9ydCBudW1iZXIgdG8gYmluZCB0bworICAgIC8vIEBwYXJhbSBzZW5kVGltZW91dCBTb2NrZXQgc2VuZCB0aW1lb3V0CisgICAgLy8gQHBhcmFtIHJlY3ZUaW1lb3V0IFNvY2tldCByZWNlaXZlIHRpbWVvdXQKKyAgICAvLworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBUG9ydDogSW50ZWdlcjsgQVNlbmRUaW1lb3V0LCBBUmVjdlRpbWVvdXQ6IExvbmd3b3JkOyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3Rvci4KKyAgICAvLworICAgIC8vIEBwYXJhbSBhZGRyZXNzIEFkZHJlc3MgdG8gYmluZCB0bworICAgIC8vIEBwYXJhbSBwb3J0ICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICAvLworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBQWRkcmVzczogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKworICAgIHByb2NlZHVyZSBMaXN0ZW47CisgICAgZnVuY3Rpb24gQWNjZXB0OiBUU29ja2V0OworICAgIHByb2NlZHVyZSBJbnRlcnJ1cHQ7CisgICAgcHJvY2VkdXJlIEludGVycnVwdENoaWxkcmVuOworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisKKyAgICBwcm9wZXJ0eSBBY2NlcHRCYWNrbG9nOiBJbnRlZ2VyIHJlYWQgRkFjY2VwdEJhY2tsb2cgd3JpdGUgRkFjY2VwdEJhY2tsb2c7CisgICAgcHJvcGVydHkgQWNjZXB0VGltZW91dDogTG9uZ3dvcmQgcmVhZCBGQWNjZXB0VGltZW91dCB3cml0ZSBGQWNjZXB0VGltZW91dDsKKyAgICBwcm9wZXJ0eSBSZXRyeUxpbWl0OiBJbnRlZ2VyIHJlYWQgRlJldHJ5TGltaXQgd3JpdGUgRlJldHJ5TGltaXQ7CisgICAgcHJvcGVydHkgUmV0cnlEZWxheTogSW50ZWdlciByZWFkIEZSZXRyeURlbGF5IHdyaXRlIEZSZXRyeURlbGF5OworICAgIHByb3BlcnR5IFRjcFNlbmRCdWZmZXI6IEludGVnZXIgcmVhZCBGVGNwU2VuZEJ1ZmZlciB3cml0ZSBGVGNwU2VuZEJ1ZmZlcjsKKyAgICBwcm9wZXJ0eSBUY3BSZWN2QnVmZmVyOiBJbnRlZ2VyIHJlYWQgRlRjcFJlY3ZCdWZmZXIgd3JpdGUgRlRjcFJlY3ZCdWZmZXI7CisKKyAgICAvLyBXaGVuIGVuYWJsZWQgKHRoZSBkZWZhdWx0KSwgbmV3IGNoaWxkcmVuIFRTb2NrZXRzIHdpbGwgYmUgY29uc3RydWN0ZWQgc28KKyAgICAvLyB0aGV5IGNhbiBiZSBpbnRlcnJ1cHRlZCBieSBUU2VydmVyVHJhbnNwb3J0LkludGVycnVwdENoaWxkcmVuKCkuCisgICAgLy8gVGhpcyBpcyBtb3JlIGV4cGVuc2l2ZSBpbiB0ZXJtcyBvZiBzeXN0ZW0gY2FsbHMgKHBvbGwgKyByZWN2KSBob3dldmVyCisgICAgLy8gZW5zdXJlcyBhIGNvbm5lY3RlZCBjbGllbnQgY2Fubm90IGludGVyZmVyZSB3aXRoIFRTZXJ2ZXIuU3RvcCgpLgorICAgIC8vCisgICAgLy8gV2hlbiBkaXNhYmxlZCwgVFNvY2tldCBjaGlsZHJlbiBkbyBub3QgaW5jdXIgYW4gYWRkaXRpb25hbCBwb2xsKCkgY2FsbC4KKyAgICAvLyBTZXJ2ZXItc2lkZSByZWFkcyBhcmUgbW9yZSBlZmZpY2llbnQsIGhvd2V2ZXIgYSBjbGllbnQgY2FuIGludGVyZmVyZSB3aXRoCisgICAgLy8gdGhlIHNlcnZlcidzIGFiaWxpdHkgdG8gc2h1dGRvd24gcHJvcGVybHkgYnkgc3RheWluZyBjb25uZWN0ZWQuCisgICAgLy8KKyAgICAvLyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgbGlzdGVuKCk7IG1vZGUgY2Fubm90IGJlIHN3aXRjaGVkIGFmdGVyIHRoYXQuCisgICAgLy8gXHRocm93cyBFUHJvcGVydHlFcnJvciBpZiBsaXN0ZW4oKSBoYXMgYmVlbiBjYWxsZWQKKyAgICBwcm9wZXJ0eSBJbnRlcnJ1cHRhYmxlQ2hpbGRyZW46IEJvb2xlYW4gcmVhZCBGSW50ZXJydXB0YWJsZUNoaWxkcmVuIHdyaXRlIFNldEludGVycnVwdGFibGVDaGlsZHJlbjsKKworICAgIC8vIGxpc3RlbkNhbGxiYWNrIGdldHMgY2FsbGVkIGp1c3QgYmVmb3JlIGxpc3RlbiwgYW5kIGFmdGVyIGFsbCBUaHJpZnQKKyAgICAvLyBzZXRzb2Nrb3B0IGNhbGxzIGhhdmUgYmVlbiBtYWRlLiAgSWYgeW91IGhhdmUgY3VzdG9tIHNldHNvY2tvcHQKKyAgICAvLyB0aGluZ3MgdGhhdCBuZWVkIHRvIGhhcHBlbiBvbiB0aGUgbGlzdGVuaW5nIHNvY2tldCwgdGhpcyBpcyB0aGUgcGxhY2UgdG8gZG8gaXQuCisgICAgcHJvcGVydHkgTGlzdGVuQ2FsbGJhY2s6IFRTZXJ2ZXJTb2NrZXRGdW5jIHJlYWQgRkxpc3RlbkNhbGxiYWNrIHdyaXRlIEZMaXN0ZW5DYWxsYmFjazsKKworICAgIC8vIGFjY2VwdENhbGxiYWNrIGdldHMgY2FsbGVkIGFmdGVyIGVhY2ggYWNjZXB0IGNhbGwsIG9uIHRoZSBuZXdseSBjcmVhdGVkIHNvY2tldC4KKyAgICAvLyBJdCBpcyBjYWxsZWQgYWZ0ZXIgYWxsIFRocmlmdCBzZXRzb2Nrb3B0IGNhbGxzIGhhdmUgYmVlbiBtYWRlLiAgSWYgeW91IGhhdmUKKyAgICAvLyBjdXN0b20gc2V0c29ja29wdCB0aGluZ3MgdGhhdCBuZWVkIHRvIGhhcHBlbiBvbiB0aGUgYWNjZXB0ZWQKKyAgICAvLyBzb2NrZXQsIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGRvIGl0LgorICAgIHByb3BlcnR5IEFjY2VwdENhbGxiYWNrOiBUU2VydmVyU29ja2V0RnVuYyByZWFkIEZBY2NlcHRDYWxsYmFjayB3cml0ZSBGQWNjZXB0Q2FsbGJhY2s7CisgIGVuZDsKKworeyRFTkRJRn0gLy8gbm90IGZvciBPTERfU09DS0VUUworaW1wbGVtZW50YXRpb24KK3skSUZOREVGIE9MRF9TT0NLRVRTfSAvLyBub3QgZm9yIE9MRF9TT0NLRVRTCisKK3VzZXMKKyAgU3lzdGVtLlN5c1V0aWxzLCBTeXN0ZW0uTWF0aCwgU3lzdGVtLkRhdGVVdGlscywgVGhyaWZ0LlRyYW5zcG9ydDsKKworY29uc3RydWN0b3IgVEJhc2VTb2NrZXQuVEdldEFkZHJJbmZvV3JhcHBlci5DcmVhdGUoQU5vZGUsIEFTZXJ2aWNlOiBzdHJpbmc7IEFIaW50czogUEFkZHJJbmZvVyk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGTm9kZSA6PSBBTm9kZTsKKyAgRlNlcnZpY2UgOj0gQVNlcnZpY2U7CisgIEZIaW50cyA6PSBBSGludHM7CisgIEZSZXMgOj0gbmlsOworZW5kOworCitkZXN0cnVjdG9yIFRCYXNlU29ja2V0LlRHZXRBZGRySW5mb1dyYXBwZXIuRGVzdHJveTsKK2JlZ2luCisgIGlmIEFzc2lnbmVkKEZSZXMpIHRoZW4KKyAgICBGcmVlQWRkckluZm9XKEZSZXMpOworICBpbmhlcml0ZWQgRGVzdHJveTsKK2VuZDsKKworZnVuY3Rpb24gVEJhc2VTb2NrZXQuVEdldEFkZHJJbmZvV3JhcHBlci5Jbml0OiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgRlJlcyA9IG5pbCB0aGVuCisgICAgRXhpdChHZXRBZGRySW5mb1coQEZOb2RlWzFdLCBARlNlcnZpY2VbMV0sIEZIaW50c14sIEZSZXMpKTsKKyAgUmVzdWx0IDo9IDA7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlU29ja2V0LlRHZXRBZGRySW5mb1dyYXBwZXIuR2V0UmVzOiBQQWRkckluZm9XOworYmVnaW4KKyAgUmVzdWx0IDo9IEZSZXM7CitlbmQ7CisKK3Byb2NlZHVyZSBEZXN0cm95ZXJPZkZpbmVTb2NrZXRzKHNzb2NrOiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk7CitiZWdpbgorICBjbG9zZXNvY2tldChzc29jayk7CitlbmQ7CisKK2Z1bmN0aW9uIFRTY29wZUlkLkdldEJpdEZpZWxkKExvYzogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gKFZhbHVlIHNociAoTG9jIHNociA4KSkgYW5kICgoMSBzaGwgKExvYyBhbmQgJEZGKSkgLSAxKTsKK2VuZDsKKworcHJvY2VkdXJlIFRTY29wZUlkLlNldEJpdEZpZWxkKExvYzogSW50ZWdlcjsgY29uc3QgYVZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIFZhbHVlIDo9IChWYWx1ZSBhbmQgVUxPTkcoKG5vdCAoKDEgc2hsIChMb2MgYW5kICRGRikpIC0gMSkpKSkgb3IgVUxPTkcoYVZhbHVlIHNobCAoTG9jIHNociA4KSk7CitlbmQ7CisKK2Z1bmN0aW9uIGdldGFkZHJpbmZvOyBleHRlcm5hbCAnd3MyXzMyLmRsbCcgbmFtZSAnZ2V0YWRkcmluZm8nOworZnVuY3Rpb24gR2V0QWRkckluZm9XOyBleHRlcm5hbCAnd3MyXzMyLmRsbCcgbmFtZSAnR2V0QWRkckluZm9XJzsKK3Byb2NlZHVyZSBmcmVlYWRkcmluZm87IGV4dGVybmFsICd3czJfMzIuZGxsJyBuYW1lICdmcmVlYWRkcmluZm8nOworcHJvY2VkdXJlIEZyZWVBZGRySW5mb1c7IGV4dGVybmFsICd3czJfMzIuZGxsJyBuYW1lICdGcmVlQWRkckluZm9XJzsKK2Z1bmN0aW9uIGdldG5hbWVpbmZvOyBleHRlcm5hbCAnd3MyXzMyLmRsbCcgbmFtZSAnZ2V0bmFtZWluZm8nOworZnVuY3Rpb24gR2V0TmFtZUluZm9XOyBleHRlcm5hbCAnd3MyXzMyLmRsbCcgbmFtZSAnR2V0TmFtZUluZm9XJzsKKworY29uc3RydWN0b3IgVFNtYXJ0UG9pbnRlcjxUPi5DcmVhdGUoQVZhbHVlOiBUOyBBRGVzdHJveWVyOiBUU21hcnRQb2ludGVyRGVzdHJveWVyPFQ+KTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZWYWx1ZSA6PSBBVmFsdWU7CisgIEZEZXN0cm95ZXIgOj0gQURlc3Ryb3llcjsKK2VuZDsKKworZGVzdHJ1Y3RvciBUU21hcnRQb2ludGVyPFQ+LkRlc3Ryb3k7CitiZWdpbgorICBpZiBBc3NpZ25lZChGRGVzdHJveWVyKSB0aGVuIEZEZXN0cm95ZXIoRlZhbHVlKTsKKyAgaW5oZXJpdGVkIERlc3Ryb3k7CitlbmQ7CisKK2Z1bmN0aW9uIFRTbWFydFBvaW50ZXI8VD4uSW52b2tlOiBUOworYmVnaW4KKyAgUmVzdWx0IDo9IEZWYWx1ZTsKK2VuZDsKKworY2xhc3MgY29uc3RydWN0b3IgVEJhc2VTb2NrZXQuQ3JlYXRlOwordmFyCisgIFZlcnNpb246IFdPUkQ7CisgIERhdGE6IFdTQURhdGE7CisgIEVycm9yOiBJbnRlZ2VyOworYmVnaW4KKyAgVmVyc2lvbiA6PSAkMDIwMjsKKyAgRmlsbENoYXIoRGF0YSwgU2l6ZU9mKERhdGEpLCAwKTsKKyAgRXJyb3IgOj0gV1NBU3RhcnR1cChWZXJzaW9uLCBEYXRhKTsKKyAgaWYgRXJyb3IgPD4gMCB0aGVuCisgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnRmFpbGVkIHRvIGluaXRpYWxpemUgV2luc29jay4nKTsKK2VuZDsKKworY2xhc3MgZGVzdHJ1Y3RvciBUQmFzZVNvY2tldC5EZXN0cm95OworYmVnaW4KKyAgV1NBQ2xlYW51cDsKK2VuZDsKKworY2xhc3MgcHJvY2VkdXJlIFRCYXNlU29ja2V0LkRlZmF1bHRMb2dEZWxlZ2F0ZShjb25zdCBTdHI6IHN0cmluZyk7Cit2YXIKKyAgT3V0U3RyOiBzdHJpbmc7CitiZWdpbgorICBPdXRTdHIgOj0gRm9ybWF0KCdUaHJpZnQ6ICVzICVzJywgW0RhdGVUaW1lVG9TdHIoTm93LCBURm9ybWF0U2V0dGluZ3MuQ3JlYXRlKSwgU3RyXSk7CisgIHRyeQorICAgIFdyaXRlbG4oT3V0U3RyKTsKKyAgICBpZiBJb1Jlc3VsdCA8PiAwIHRoZW4gT3V0cHV0RGVidWdTdHJpbmcoUENoYXIoT3V0U3RyKSk7CisgIGV4Y2VwdAorICAgIE91dHB1dERlYnVnU3RyaW5nKFBDaGFyKE91dFN0cikpOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVNvY2tldC5Db21tb25Jbml0OworYmVnaW4KKyAgRlNvY2tldCA6PSBJTlZBTElEX1NPQ0tFVDsKKyAgRlBvcnQgOj0gMDsKKyAgRlNlbmRUaW1lb3V0IDo9IDA7CisgIEZSZWN2VGltZW91dCA6PSAwOworICBGS2VlcEFsaXZlIDo9IEZhbHNlOworICBGTG9nRGVsZWdhdGUgOj0gRGVmYXVsdExvZ0RlbGVnYXRlOworZW5kOworCitmdW5jdGlvbiBUQmFzZVNvY2tldC5DcmVhdGVTb2NrZXQoQUFkZHJlc3M6IHN0cmluZzsgQVBvcnQ6IEludGVnZXIpOiBJR2V0QWRkckluZm9XcmFwcGVyOwordmFyCisgIEhpbnRzOiBUQWRkckluZm9XOworICBSZXM6IFBBZGRySW5mb1c7CisgIFRoZVBvcnQ6IGFycmF5WzAuLjVdIG9mIENoYXI7CisgIEVycm9yOiBJbnRlZ2VyOworYmVnaW4KKyAgRmlsbENoYXIoSGludHMsIFNpemVPZihIaW50cyksIDApOworICBIaW50cy5haV9mYW1pbHkgOj0gUEZfVU5TUEVDOworICBIaW50cy5haV9zb2NrdHlwZSA6PSBTT0NLX1NUUkVBTTsKKyAgSGludHMuYWlfZmxhZ3MgOj0gQUlfUEFTU0lWRSBvciBBSV9BRERSQ09ORklHOworICBTdHJGbXQoVGhlUG9ydCwgJyVkJywgW0ZQb3J0XSk7CisKKyAgUmVzdWx0IDo9IFRHZXRBZGRySW5mb1dyYXBwZXIuQ3JlYXRlKEFBZGRyZXNzLCBUaGVQb3J0LCBASGludHMpOworICBFcnJvciA6PSBSZXN1bHQuSW5pdDsKKyAgaWYgRXJyb3IgPD4gMCB0aGVuIGJlZ2luCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdHZXRBZGRySW5mb1cgJWQ6ICVzJywgW0Vycm9yLCBTeXNFcnJvck1lc3NhZ2UoRXJyb3IpXSkpOworICAgIENsb3NlOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ291bGQgbm90IHJlc29sdmUgaG9zdCBmb3Igc2VydmVyIHNvY2tldC4nKTsKKyAgZW5kOworCisgIC8vIFBpY2sgdGhlIGlwdjYgYWRkcmVzcyBmaXJzdCBzaW5jZSBpcHY0IGFkZHJlc3NlcyBjYW4gYmUgbWFwcGVkCisgIC8vIGludG8gaXB2NiBzcGFjZS4KKyAgUmVzIDo9IFJlc3VsdC5SZXM7CisgIHdoaWxlIEFzc2lnbmVkKFJlcykgZG8gYmVnaW4KKyAgICBpZiAoUmVzXi5haV9mYW1pbHkgPSBBRl9JTkVUNikgb3IgKG5vdCBBc3NpZ25lZChSZXNeLmFpX25leHQpKSB0aGVuCisgICAgICBCcmVhazsKKyAgICBSZXMgOj0gUmVzXi5haV9uZXh0OworICBlbmQ7CisKKyAgRlNvY2tldCA6PSBXaW5hcGkuV2luc29jazIuc29ja2V0KFJlc14uYWlfZmFtaWx5LCBSZXNeLmFpX3NvY2t0eXBlLCBSZXNeLmFpX3Byb3RvY29sKTsKKyAgaWYgRlNvY2tldCA9IElOVkFMSURfU09DS0VUIHRoZW4gYmVnaW4KKyAgICBFcnJvciA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUQmFzZVNvY2tldC5DcmVhdGVTb2NrZXQoKSBzb2NrZXQoKSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJyb3IpXSkpOworICAgIENsb3NlOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ3NvY2tldCgpOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJyb3IpXSkpOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVNvY2tldC5TZXRSZWN2VGltZW91dChBUmVjdlRpbWVvdXQ6IExvbmd3b3JkKTsKK2JlZ2luCisgIEZSZWN2VGltZW91dCA6PSBBUmVjdlRpbWVvdXQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVNvY2tldC5TZXRTZW5kVGltZW91dChBU2VuZFRpbWVvdXQ6IExvbmd3b3JkKTsKK2JlZ2luCisgIEZTZW5kVGltZW91dCA6PSBBU2VuZFRpbWVvdXQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVNvY2tldC5TZXRLZWVwQWxpdmUoQUtlZXBBbGl2ZTogQm9vbGVhbik7CitiZWdpbgorICBGS2VlcEFsaXZlIDo9IEFLZWVwQWxpdmU7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVNvY2tldC5TZXRTb2NrZXQoQVNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOworYmVnaW4KKyAgaWYgRlNvY2tldCA8PiBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgQ2xvc2U7CisgIEZTb2NrZXQgOj0gQVNvY2tldDsKK2VuZDsKKworY29uc3RydWN0b3IgVEJhc2VTb2NrZXQuQ3JlYXRlKEFMb2dEZWxlZ2F0ZTogVExvZ0RlbGVnYXRlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIENvbW1vbkluaXQ7CisgIGlmIEFzc2lnbmVkKEFMb2dEZWxlZ2F0ZSkgdGhlbiBGTG9nRGVsZWdhdGUgOj0gQUxvZ0RlbGVnYXRlOworZW5kOworCitjb25zdHJ1Y3RvciBUQmFzZVNvY2tldC5DcmVhdGUoQVBvcnQ6IEludGVnZXI7IEFMb2dEZWxlZ2F0ZTogVExvZ0RlbGVnYXRlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIENvbW1vbkluaXQ7CisgIEZQb3J0IDo9IEFQb3J0OworICBpZiBBc3NpZ25lZChBTG9nRGVsZWdhdGUpIHRoZW4gRkxvZ0RlbGVnYXRlIDo9IEFMb2dEZWxlZ2F0ZTsKK2VuZDsKKworZGVzdHJ1Y3RvciBUQmFzZVNvY2tldC5EZXN0cm95OworYmVnaW4KKyAgQ2xvc2U7CisgIGluaGVyaXRlZCBEZXN0cm95OworZW5kOworCitwcm9jZWR1cmUgVEJhc2VTb2NrZXQuQ2xvc2U7CitiZWdpbgorICBpZiBGU29ja2V0IDw+IElOVkFMSURfU09DS0VUIHRoZW4gYmVnaW4KKyAgICBzaHV0ZG93bihGU29ja2V0LCBTRF9CT1RIKTsKKyAgICBjbG9zZXNvY2tldChGU29ja2V0KTsKKyAgZW5kOworICBGU29ja2V0IDo9IElOVkFMSURfU09DS0VUOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5Jbml0UGVlckluZm87CitiZWdpbgorICBGQ2FjaGVkUGVlckFkZHIuaXB2NC5zaW5fZmFtaWx5IDo9IEFGX1VOU1BFQzsKKyAgRlBlZXJIb3N0IDo9ICcnOworICBGUGVlckFkZHJlc3MgOj0gJyc7CisgIEZQZWVyUG9ydCA6PSAwOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5Db21tb25Jbml0OworYmVnaW4KKyAgaW5oZXJpdGVkIENvbW1vbkluaXQ7CisgIEZIb3N0IDo9ICcnOworICBGSW50ZXJydXB0TGlzdGVuZXIgOj0gbmlsOworICBGQ29ublRpbWVvdXQgOj0gMDsKKyAgRkxpbmdlck9uIDo9IFRydWU7CisgIEZMaW5nZXJWYWwgOj0gMDsKKyAgRk5vRGVsYXkgOj0gVHJ1ZTsKKyAgRk1heFJlY3ZSZXRyaWVzIDo9IDU7CisgIEluaXRQZWVySW5mbzsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuT3BlbkNvbm5lY3Rpb24oUmVzOiBUQmFzZVNvY2tldC5JR2V0QWRkckluZm9XcmFwcGVyKTsKK2xhYmVsCisgIERvbmU7Cit2YXIKKyAgRXJybm9Db3B5OiBJbnRlZ2VyOworICBSZXQsCisgIFJldDI6IEludGVnZXI7CisgIEZkczogVEZkU2V0OworICBUVmFsOiBUVGltZVZhbDsKKyAgUFRWYWw6IFBUaW1lVmFsOworICBWYWwsCisgIExvbjogSW50ZWdlcjsKKyAgT25lLAorICBaZXJvOiBDYXJkaW5hbDsKK2JlZ2luCisgIGlmIFNlbmRUaW1lb3V0ID4gMCB0aGVuIFNldFNlbmRUaW1lb3V0KFNlbmRUaW1lb3V0KTsKKyAgaWYgUmVjdlRpbWVvdXQgPiAwIHRoZW4gU2V0UmVjdlRpbWVvdXQoUmVjdlRpbWVvdXQpOworICBpZiBLZWVwQWxpdmUgdGhlbiBTZXRLZWVwQWxpdmUoS2VlcEFsaXZlKTsKKyAgU2V0TGluZ2VyKEZMaW5nZXJPbiwgRkxpbmdlclZhbCk7CisgIFNldE5vRGVsYXkoRk5vRGVsYXkpOworCisgIC8vIFNldCB0aGUgc29ja2V0IHRvIGJlIG5vbiBibG9ja2luZyBmb3IgY29ubmVjdCBpZiBhIHRpbWVvdXQgZXhpc3RzCisgIFplcm8gOj0gMDsKKyAgaWYgRkNvbm5UaW1lb3V0ID4gMCB0aGVuIGJlZ2luCisgICAgT25lIDo9IDE7CisgICAgaWYgaW9jdGxzb2NrZXQoU29ja2V0LCBJbnRlZ2VyKEZJT05CSU8pLCBPbmUpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuT3BlbkNvbm5lY3Rpb24oKSBpb2N0bHNvY2tldCgpICVzICVzJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnaW9jdGxzb2NrZXQoKSBmYWlsZWQ6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIGVuZDsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBpZiBpb2N0bHNvY2tldChTb2NrZXQsIEludGVnZXIoRklPTkJJTyksIFplcm8pID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuT3BlbkNvbm5lY3Rpb24oKSBpb2N0bHNvY2tldCgpICVzICVzJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnaW9jdGxzb2NrZXQoKSBmYWlsZWQ6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIGVuZDsKKyAgZW5kOworCisgIFJldCA6PSBjb25uZWN0KFNvY2tldCwgUmVzLlJlc14uYWlfYWRkcl4sIFJlcy5SZXNeLmFpX2FkZHJsZW4pOworICBpZiBSZXQgPSAwIHRoZW4gZ290byBEb25lOworCisgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgIGlmIChFcnJub0NvcHkgPD4gV1NBRUlOUFJPR1JFU1MpIGFuZCAoRXJybm9Db3B5IDw+IFdTQUVXT1VMREJMT0NLKSB0aGVuIGJlZ2luCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0Lk9wZW5Db25uZWN0aW9uKCkgY29ubmVjdCgpICcsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdjb25uZWN0KCkgZmFpbGVkOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIEZEX1pFUk8oRmRzKTsKKyAgX0ZEX1NFVChTb2NrZXQsIEZkcyk7CisgIGlmIEZDb25uVGltZW91dCA+IDAgdGhlbiBiZWdpbgorICAgIFRWYWwudHZfc2VjIDo9IEZDb25uVGltZW91dCBkaXYgMTAwMDsKKyAgICBUVmFsLnR2X3VzZWMgOj0gKEZDb25uVGltZW91dCBtb2QgMTAwMCkgKiAxMDAwOworICAgIFBUVmFsIDo9IEBUVmFsOworICBlbmQKKyAgZWxzZQorICAgIFBUVmFsIDo9IG5pbDsKKyAgUmV0IDo9IHNlbGVjdCgxLCBuaWwsIEBGZHMsIG5pbCwgUFRWYWwpOworCisgIGlmIFJldCA+IDAgdGhlbiBiZWdpbgorICAgIC8vIEVuc3VyZSB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCBhbmQgdGhhdCB0aGVyZSBhcmUgbm8gZXJyb3JzIHNldAorICAgIExvbiA6PSBTaXplT2YoVmFsKTsKKyAgICBSZXQyIDo9IGdldHNvY2tvcHQoU29ja2V0LCBTT0xfU09DS0VULCBTT19FUlJPUiwgQFZhbCwgTG9uKTsKKyAgICBpZiBSZXQyID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuT3BlbkNvbm5lY3Rpb24oKSBnZXRzb2Nrb3B0KCkgJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnZ2V0c29ja29wdCgpOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICBlbmQ7CisgICAgLy8gbm8gZXJyb3JzIG9uIHNvY2tldCwgZ28gdG8gdG93bgorICAgIGlmIFZhbCA9IDAgdGhlbiBnb3RvIERvbmU7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0Lk9wZW5Db25uZWN0aW9uKCkgZXJyb3Igb24gc29ja2V0IChhZnRlciBzZWxlY3QoKSkgJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ3NvY2tldCBPcGVuQ29ubmVjdGlvbigpIGVycm9yOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoVmFsKV0pKTsKKyAgZW5kCisgIGVsc2UgaWYgUmV0ID0gMCB0aGVuIGJlZ2luCisgICAgLy8gc29ja2V0IHRpbWVkIG91dAorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5PcGVuQ29ubmVjdGlvbigpIHRpbWVkIG91dCAnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdPcGVuQ29ubmVjdGlvbigpIHRpbWVkIG91dCcpOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIC8vIGVycm9yIG9uIHNlbGVjdCgpCisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuT3BlbkNvbm5lY3Rpb24oKSBzZWxlY3QoKSAnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnc2VsZWN0KCkgZmFpbGVkOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCitEb25lOgorICAvLyBTZXQgc29ja2V0IGJhY2sgdG8gbm9ybWFsIG1vZGUgKGJsb2NraW5nKQorICBpb2N0bHNvY2tldChTb2NrZXQsIEludGVnZXIoRklPTkJJTyksIFplcm8pOworICBTZXRDYWNoZWRBZGRyZXNzKFJlcy5SZXNeLmFpX2FkZHJeLCBSZXMuUmVzXi5haV9hZGRybGVuKTsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuTG9jYWxPcGVuOwordmFyCisgIFJlczogVEJhc2VTb2NrZXQuSUdldEFkZHJJbmZvV3JhcHBlcjsKK2JlZ2luCisgIGlmIElzT3BlbiB0aGVuIEV4aXQ7CisKKyAgLy8gVmFsaWRhdGUgcG9ydCBudW1iZXIKKyAgaWYgKFBvcnQgPCAwKSBvciAoUG9ydCA+ICRGRkZGKSB0aGVuCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbkJhZEFyZ3MuQ3JlYXRlKCdTcGVjaWZpZWQgcG9ydCBpcyBpbnZhbGlkJyk7CisKKyAgUmVzIDo9IENyZWF0ZVNvY2tldChIb3N0LCBQb3J0KTsKKworICBPcGVuQ29ubmVjdGlvbihSZXMpOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5TZXRHZW5lcmljVGltZW91dChTOiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsgVGltZW91dDogTG9uZ3dvcmQ7IE9wdE5hbWU6IEludGVnZXIpOwordmFyCisgIFRpbWU6IERXT1JEOworYmVnaW4KKyAgaWYgUyA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICBFeGl0OworCisgIFRpbWUgOj0gVGltZW91dDsKKworICBpZiBzZXRzb2Nrb3B0KFMsIFNPTF9TT0NLRVQsIE9wdE5hbWUsIEBUaW1lLCBTaXplT2YoVGltZSkpID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1NldEdlbmVyaWNUaW1lb3V0KCkgc2V0c29ja29wdCgpICVzJywgW1N5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpOworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LkdldElzT3BlbjogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBTb2NrZXQgPD4gSU5WQUxJRF9TT0NLRVQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LlNldE5vRGVsYXkoQU5vRGVsYXk6IEJvb2xlYW4pOwordmFyCisgIFY6IEludGVnZXI7CitiZWdpbgorICBGTm9EZWxheSA6PSBBTm9EZWxheTsKKyAgaWYgU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIEV4aXQ7CisKKyAgViA6PSBJZlRoZW4oRk5vRGVsYXksIDEsIDApOworICBpZiBzZXRzb2Nrb3B0KFNvY2tldCwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCBAViwgU2l6ZU9mKFYpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0LlNldE5vRGVsYXkoKSBzZXRzb2Nrb3B0KCkgJXMgJXMnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuR2V0U29ja2V0SW5mbzogc3RyaW5nOworYmVnaW4KKyAgaWYgKEZIb3N0ID0gJycpIG9yIChQb3J0ID0gMCkgdGhlbgorICAgIFJlc3VsdCA6PSAnPEhvc3Q6ICcgKyBHZXRQZWVyQWRkcmVzcyArICcgUG9ydDogJyArIEdldFBlZXJQb3J0LlRvU3RyaW5nICsgJz4nCisgIGVsc2UKKyAgICBSZXN1bHQgOj0gJzxIb3N0OiAnICsgRkhvc3QgKyAnIFBvcnQ6ICcgKyBQb3J0LlRvU3RyaW5nICsgJz4nOworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LkdldFBlZXJIb3N0OiBzdHJpbmc7Cit2YXIKKyAgQWRkcjogVFNvY2tBZGRyU3RvcmFnZTsKKyAgQWRkclB0cjogUFNvY2tBZGRyOworICBBZGRyTGVuOiBJbnRlZ2VyOworICBDbGllbnRIb3N0OiBhcnJheVswLi5OSV9NQVhIT1NULTFdIG9mIENoYXI7CisgIENsaWVudFNlcnZpY2U6IGFycmF5WzAuLk5JX01BWFNFUlYtMV0gb2YgQ2hhcjsKK2JlZ2luCisgIGlmIEZQZWVySG9zdCA9ICcnIHRoZW4gYmVnaW4KKyAgICBpZiBTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgICBFeGl0KEZQZWVySG9zdCk7CisKKyAgICBBZGRyUHRyIDo9IEdldENhY2hlZEFkZHJlc3MoQWRkckxlbik7CisgICAgaWYgQWRkclB0ciA9IG5pbCB0aGVuIGJlZ2luCisgICAgICBBZGRyTGVuIDo9IFNpemVPZihBZGRyKTsKKyAgICAgIGlmIGdldHBlZXJuYW1lKFNvY2tldCwgUFNvY2tBZGRyKEBBZGRyKV4sIEFkZHJMZW4pIDw+IDAgdGhlbgorICAgICAgICBFeGl0KEZQZWVySG9zdCk7CisgICAgICBBZGRyUHRyIDo9IFBTb2NrQWRkcihAQWRkcik7CisgICAgICBTZXRDYWNoZWRBZGRyZXNzKEFkZHJQdHJeLCBBZGRyTGVuKTsKKyAgICBlbmQ7CisKKyAgICBHZXROYW1lSW5mb1coQWRkclB0cl4sIEFkZHJMZW4sIENsaWVudEhvc3QsIE5JX01BWEhPU1QsIENsaWVudFNlcnZpY2UsIE5JX01BWFNFUlYsIDApOworICAgIEZQZWVySG9zdCA6PSBDbGllbnRIb3N0OworICBlbmQ7CisgIFJlc3VsdCA6PSBGUGVlckhvc3Q7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuR2V0UGVlckFkZHJlc3M6IHN0cmluZzsKK3ZhcgorICBBZGRyOiBUU29ja0FkZHJTdG9yYWdlOworICBBZGRyUHRyOiBQU29ja0FkZHI7CisgIEFkZHJMZW46IEludGVnZXI7CisgIENsaWVudEhvc3Q6IGFycmF5WzAuLk5JX01BWEhPU1QtMV0gb2YgQ2hhcjsKKyAgQ2xpZW50U2VydmljZTogYXJyYXlbMC4uTklfTUFYU0VSVi0xXSBvZiBDaGFyOworYmVnaW4KKyAgaWYgRlBlZXJBZGRyZXNzID0gJycgdGhlbiBiZWdpbgorICAgIGlmIFNvY2tldCA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICAgIEV4aXQoRlBlZXJBZGRyZXNzKTsKKworICAgIEFkZHJQdHIgOj0gR2V0Q2FjaGVkQWRkcmVzcyhBZGRyTGVuKTsKKyAgICBpZiBBZGRyUHRyID0gbmlsIHRoZW4gYmVnaW4KKyAgICAgIEFkZHJMZW4gOj0gU2l6ZU9mKEFkZHIpOworICAgICAgaWYgZ2V0cGVlcm5hbWUoU29ja2V0LCBQU29ja0FkZHIoQEFkZHIpXiwgQWRkckxlbikgPD4gMCB0aGVuCisgICAgICAgIEV4aXQoRlBlZXJIb3N0KTsKKyAgICAgIEFkZHJQdHIgOj0gUFNvY2tBZGRyKEBBZGRyKTsKKyAgICAgIFNldENhY2hlZEFkZHJlc3MoQWRkclB0cl4sIEFkZHJMZW4pOworICAgIGVuZDsKKworICAgIEdldE5hbWVJbmZvVyhBZGRyUHRyXiwgQWRkckxlbiwgQ2xpZW50SG9zdCwgTklfTUFYSE9TVCwgQ2xpZW50U2VydmljZSwgTklfTUFYU0VSViwgTklfTlVNRVJJQ0hPU1Qgb3IgTklfTlVNRVJJQ1NFUlYpOworICAgIEZQZWVyQWRkcmVzcyA6PSBDbGllbnRIb3N0OworICAgIFRyeVN0clRvSW50KENsaWVudFNlcnZpY2UsIEZQZWVyUG9ydCk7CisgIGVuZDsKKyAgUmVzdWx0IDo9IEZQZWVyQWRkcmVzcworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LkdldFBlZXJQb3J0OiBJbnRlZ2VyOworYmVnaW4KKyAgR2V0UGVlckFkZHJlc3M7CisgIFJlc3VsdCA6PSBGUGVlclBvcnQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuR2V0T3JpZ2luOiBzdHJpbmc7CitiZWdpbgorICBSZXN1bHQgOj0gR2V0UGVlckhvc3QgKyAnOicgKyBHZXRQZWVyUG9ydC5Ub1N0cmluZzsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuU2V0UmVjdlRpbWVvdXQoQVJlY3ZUaW1lb3V0OiBMb25nd29yZCk7CitiZWdpbgorICBpbmhlcml0ZWQgU2V0UmVjdlRpbWVvdXQoQVJlY3ZUaW1lb3V0KTsKKyAgU2V0R2VuZXJpY1RpbWVvdXQoU29ja2V0LCBBUmVjdlRpbWVvdXQsIFNPX1JDVlRJTUVPKTsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuU2V0U2VuZFRpbWVvdXQoQVNlbmRUaW1lb3V0OiBMb25nd29yZCk7CitiZWdpbgorICBpbmhlcml0ZWQgU2V0U2VuZFRpbWVvdXQoQVNlbmRUaW1lb3V0KTsKKyAgU2V0R2VuZXJpY1RpbWVvdXQoU29ja2V0LCBBU2VuZFRpbWVvdXQsIFNPX1NORFRJTUVPKTsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuU2V0S2VlcEFsaXZlKEFLZWVwQWxpdmU6IEJvb2xlYW4pOwordmFyCisgIFZhbHVlOiBJbnRlZ2VyOworYmVnaW4KKyAgaW5oZXJpdGVkIFNldEtlZXBBbGl2ZShBS2VlcEFsaXZlKTsKKworICBWYWx1ZSA6PSBJZlRoZW4oS2VlcEFsaXZlLCAxLCAwKTsKKyAgaWYgc2V0c29ja29wdChTb2NrZXQsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgQFZhbHVlLCBTaXplT2YoVmFsdWUpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0LlNldEtlZXBBbGl2ZSgpIHNldHNvY2tvcHQoKSAlcyAlcycsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFNvY2tldC5DcmVhdGUoQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOworYmVnaW4KKyAgLy8gTm90IG5lZWRlZCwgYnV0IGp1c3QgYSBwbGFjZWhvbGRlcgorICBpbmhlcml0ZWQgQ3JlYXRlKEFMb2dEZWxlZ2F0ZSk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTb2NrZXQuQ3JlYXRlKEFIb3N0OiBzdHJpbmc7IEFQb3J0OiBJbnRlZ2VyOyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKEFQb3J0LCBBTG9nRGVsZWdhdGUpOworICBGSG9zdCA6PSBBSG9zdDsKK2VuZDsKKworY29uc3RydWN0b3IgVFNvY2tldC5DcmVhdGUoQVNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoQUxvZ0RlbGVnYXRlKTsKKyAgU29ja2V0IDo9IEFTb2NrZXQ7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTb2NrZXQuQ3JlYXRlKEFTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OyBBSW50ZXJydXB0TGlzdGVuZXI6IElTbWFydFBvaW50ZXI8V2luYXBpLldpbnNvY2syLlRTb2NrZXQ+OworICBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKEFMb2dEZWxlZ2F0ZSk7CisgIFNvY2tldCA6PSBBU29ja2V0OworICBGSW50ZXJydXB0TGlzdGVuZXIgOj0gQUludGVycnVwdExpc3RlbmVyOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5PcGVuOworYmVnaW4KKyAgaWYgSXNPcGVuIHRoZW4gRXhpdDsKKyAgTG9jYWxPcGVuOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5DbG9zZTsKK2JlZ2luCisgIGluaGVyaXRlZCBDbG9zZTsKKyAgSW5pdFBlZXJJbmZvOworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LlJlYWQodmFyIEJ1ZjsgTGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2xhYmVsCisgIFRyeUFnYWluOwordmFyCisgIFJldHJpZXM6IExvbmd3b3JkOworICBFQWdhaW5UaHJlc2hvbGQsCisgIFJlYWRFbGFwc2VkOiBVSW50NjQ7CisgIFN0YXJ0OiBURGF0ZVRpbWU7CisgIEdvdDogSW50ZWdlcjsKKyAgRmRzOiBURmRTZXQ7CisgIEVycm5vQ29weTogSW50ZWdlcjsKKyAgVFZhbDogVFRpbWVWYWw7CisgIFBUVmFsOiBQVGltZVZhbDsKKyAgUmV0OiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2FsbGVkIHJlYWQgb24gbm9uLW9wZW4gc29ja2V0Jyk7CisKKyAgUmV0cmllcyA6PSAwOworCisgIC8vIFRIUklGVF9FQUdBSU4gY2FuIGJlIHNpZ25hbGxlZCBib3RoIHdoZW4gYSB0aW1lb3V0IGhhcyBvY2N1cnJlZCBhbmQgd2hlbgorICAvLyB0aGUgc3lzdGVtIGlzIG91dCBvZiByZXNvdXJjZXMgKGFuIGF3ZXNvbWUgdW5kb2N1bWVudGVkIGZlYXR1cmUpLgorICAvLyBUaGUgZm9sbG93aW5nIGlzIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIHRpbWUgaW50ZXJ2YWwgdW5kZXIgd2hpY2gKKyAgLy8gVEhSSUZUX0VBR0FJTiBpcyB0YWtlbiB0byBpbmRpY2F0ZSBhbiBvdXQgb2YgcmVzb3VyY2VzIGVycm9yLgorICBFQWdhaW5UaHJlc2hvbGQgOj0gMDsKKyAgaWYgUmVjdlRpbWVvdXQgPD4gMCB0aGVuCisgICAgLy8gaWYgYSByZWFkVGltZW91dCBpcyBzcGVjaWZpZWQgYWxvbmcgd2l0aCBhIG1heCBudW1iZXIgb2YgcmVjdiByZXRyaWVzLCB0aGVuCisgICAgLy8gdGhlIHRocmVzaG9sZCB3aWxsIGVuc3VyZSB0aGF0IHRoZSByZWFkIHRpbWVvdXQgaXMgbm90IGV4Y2VlZGVkIGV2ZW4gaW4gdGhlCisgICAgLy8gY2FzZSBvZiByZXNvdXJjZSBlcnJvcnMKKyAgICBFQWdhaW5UaHJlc2hvbGQgOj0gUmVjdlRpbWVvdXQgZGl2IElmVGhlbihGTWF4UmVjdlJldHJpZXMgPiAwLCBGTWF4UmVjdlJldHJpZXMsIDIpOworCitUcnlBZ2FpbjoKKyAgLy8gUmVhZCBmcm9tIHRoZSBzb2NrZXQKKyAgaWYgUmVjdlRpbWVvdXQgPiAwIHRoZW4KKyAgICBTdGFydCA6PSBOb3cKKyAgZWxzZQorICAgIC8vIGlmIHRoZXJlIGlzIG5vIHJlYWQgdGltZW91dCB3ZSBkb24ndCBuZWVkIHRoZSBUT0QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKKyAgICAvLyBhbiBUSFJJRlRfRUFHQUlOIGlzIGR1ZSB0byBhIHRpbWVvdXQgb3IgYW4gb3V0LW9mLXJlc291cmNlIGNvbmRpdGlvbi4KKyAgICBTdGFydCA6PSAwOworCisgIGlmIEFzc2lnbmVkKEZJbnRlcnJ1cHRMaXN0ZW5lcikgdGhlbiBiZWdpbgorICAgIEZEX1pFUk8oRmRzKTsKKyAgICBfRkRfU0VUKFNvY2tldCwgRmRzKTsKKyAgICBfRkRfU0VUKEZJbnRlcnJ1cHRMaXN0ZW5lciwgRmRzKTsKKyAgICBpZiBSZWN2VGltZW91dCA+IDAgdGhlbiBiZWdpbgorICAgICAgVFZhbC50dl9zZWMgOj0gUmVjdlRpbWVvdXQgZGl2IDEwMDA7CisgICAgICBUVmFsLnR2X3VzZWMgOj0gKFJlY3ZUaW1lb3V0IG1vZCAxMDAwKSAqIDEwMDA7CisgICAgICBQVFZhbCA6PSBAVFZhbDsKKyAgICBlbmQKKyAgICBlbHNlCisgICAgICBQVFZhbCA6PSBuaWw7CisKKyAgICBSZXQgOj0gc2VsZWN0KDIsIEBGZHMsIG5pbCwgbmlsLCBQVFZhbCk7CisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBpZiBSZXQgPCAwIHRoZW4gYmVnaW4KKyAgICAgIC8vIGVycm9yIGNhc2VzCisgICAgICBpZiAoRXJybm9Db3B5ID0gV1NBRUlOVFIpIGFuZCAoUmV0cmllcyA8IEZNYXhSZWN2UmV0cmllcykgdGhlbiBiZWdpbgorICAgICAgICBJbmMoUmV0cmllcyk7CisgICAgICAgIGdvdG8gVHJ5QWdhaW47CisgICAgICBlbmQ7CisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuUmVhZCgpIHNlbGVjdCgpICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEZvcm1hdCgnVW5rbm93bjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgZW5kCisgICAgZWxzZSBpZiBSZXQgPiAwIHRoZW4gYmVnaW4KKyAgICAgIC8vIENoZWNrIHRoZSBpbnRlcnJ1cHRMaXN0ZW5lcgorICAgICAgaWYgRkRfSVNTRVQoRkludGVycnVwdExpc3RlbmVyLCBGZHMpIHRoZW4KKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbkludGVycnVwdGVkLkNyZWF0ZSgnSW50ZXJydXB0ZWQnKTsKKyAgICBlbmQKKyAgICBlbHNlIC8vIFJldCA9IDAKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoJ1dTQUVXT1VMREJMT0NLICh0aW1lZCBvdXQpJyk7CisKKyAgICAvLyBmYWxsaW5nIHRocm91Z2ggbWVhbnMgdGhlcmUgaXMgc29tZXRoaW5nIHRvIHJlY3YgYW5kIGl0IGNhbm5vdCBibG9jaworICBlbmQ7CisKKyAgR290IDo9IHJlY3YoU29ja2V0LCBCdWYsIExlbiwgMCk7CisgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgIC8vIENoZWNrIGZvciBlcnJvciBvbiByZWFkCisgIGlmIEdvdCA8IDAgdGhlbiBiZWdpbgorICAgIGlmIEVycm5vQ29weSA9IFdTQUVXT1VMREJMT0NLIHRoZW4gYmVnaW4KKyAgICAgIC8vIGlmIG5vIHRpbWVvdXQgd2UgY2FuIGFzc3VtZSB0aGF0IHJlc291cmNlIGV4aGF1c3Rpb24gaGFzIG9jY3VycmVkLgorICAgICAgaWYgUmVjdlRpbWVvdXQgPSAwIHRoZW4KKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgnV1NBRVdPVUxEQkxPQ0sgKHVuYXZhaWxhYmxlIHJlc291cmNlcyknKTsKKyAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGxhY2sgb2YgcmVzb3VyY2VzIG9yIHRpbWVvdXQgY2FzZQorICAgICAgUmVhZEVsYXBzZWQgOj0gTWlsbGlTZWNvbmRzQmV0d2VlbihOb3csIFN0YXJ0KTsKKyAgICAgIGlmIChFQWdhaW5UaHJlc2hvbGQgPSAwKSBvciAoUmVhZEVsYXBzZWQgPCBFQWdhaW5UaHJlc2hvbGQpIHRoZW4gYmVnaW4KKyAgICAgICAgaWYgUmV0cmllcyA8IEZNYXhSZWN2UmV0cmllcyB0aGVuIGJlZ2luCisgICAgICAgICAgSW5jKFJldHJpZXMpOworICAgICAgICAgIFNsZWVwKDEpOworICAgICAgICAgIGdvdG8gVHJ5QWdhaW47CisgICAgICAgIGVuZAorICAgICAgICBlbHNlCisgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgnV1NBRVdPVUxEQkxPQ0sgKHVuYXZhaWxhYmxlIHJlc291cmNlcyknKTsKKyAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICAvLyBpbmZlciB0aGF0IHRpbWVvdXQgaGFzIGJlZW4gaGl0CisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoJ1dTQUVXT1VMREJMT0NLICh0aW1lZCBvdXQpJyk7CisgICAgZW5kOworCisgICAgLy8gSWYgaW50ZXJydXB0ZWQsIHRyeSBhZ2FpbgorICAgIGlmIChFcnJub0NvcHkgPSBXU0FFSU5UUikgYW5kIChSZXRyaWVzIDwgRk1heFJlY3ZSZXRyaWVzKSB0aGVuIGJlZ2luCisgICAgICBJbmMoUmV0cmllcyk7CisgICAgICBnb3RvIFRyeUFnYWluOworICAgIGVuZDsKKworICAgIGlmIEVycm5vQ29weSA9IFdTQUVDT05OUkVTRVQgdGhlbgorICAgICAgRXhpdCgwKTsKKworICAgIC8vIFRoaXMgaXNoIGlzbid0IG9wZW4KKyAgICBpZiBFcnJub0NvcHkgPSBXU0FFTk9UQ09OTiB0aGVuCisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1dTQUVOT1RDT05OJyk7CisKKyAgICAvLyBUaW1lZCBvdXQhCisgICAgaWYgRXJybm9Db3B5ID0gV1NBRVRJTUVET1VUIHRoZW4KKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnV1NBRVRJTUVET1VUJyk7CisKKyAgICAvLyBOb3cgaXQncyBub3QgYSB0cnkgYWdhaW4gY2FzZSwgYnV0IGEgcmVhbCBwcm9iYmxlegorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5SZWFkKCkgcmVjdigpICVzICVzJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworCisgICAgLy8gU29tZSBvdGhlciBlcnJvciwgd2hhdGV2egorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShGb3JtYXQoJ1Vua25vd246ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgUmVzdWx0IDo9IEdvdDsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuV3JpdGUoY29uc3QgQnVmOyBMZW46IEludGVnZXIpOwordmFyCisgIFNlbnQsIEI6IEludGVnZXI7CitiZWdpbgorICBTZW50IDo9IDA7CisgIHdoaWxlIFNlbnQgPCBMZW4gZG8gYmVnaW4KKyAgICBCIDo9IFdyaXRlUGFydGlhbCgoUEJ5dGUoQEJ1ZikgKyBTZW50KV4sIExlbiAtIFNlbnQpOworICAgIGlmIEIgPSAwIHRoZW4KKyAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHRoZSB0aW1lb3V0IHNldCB3aXRoIFNPX1NORFRJTUVPIGV4cGlyZWQuCisgICAgICAvLyBSYWlzZSBhbiBleGNlcHRpb24uCisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCdzZW5kIHRpbWVvdXQgZXhwaXJlZCcpOworICAgIEluYyhTZW50LCBCKTsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LldyaXRlUGFydGlhbChjb25zdCBCdWY7IExlbjogSW50ZWdlcik6IEludGVnZXI7Cit2YXIKKyAgQjogSW50ZWdlcjsKKyAgRXJybm9Db3B5OiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2FsbGVkIHdyaXRlIG9uIG5vbi1vcGVuIHNvY2tldCcpOworCisgIEIgOj0gc2VuZChTb2NrZXQsIEJ1ZiwgTGVuLCAwKTsKKworICBpZiBCIDwgMCB0aGVuIGJlZ2luCisgICAgLy8gRmFpbCBvbiBhIHNlbmQgZXJyb3IKKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIGlmIEVycm5vQ29weSA9IFdTQUVXT1VMREJMT0NLIHRoZW4KKyAgICAgIEV4aXQoMCk7CisKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuV3JpdGVQYXJ0aWFsKCkgc2VuZCgpICVzICVzJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworCisgICAgaWYgKEVycm5vQ29weSA9IFdTQUVDT05OUkVTRVQpIG9yIChFcnJub0NvcHkgPSBXU0FFTk9UQ09OTikgdGhlbiBiZWdpbgorICAgICAgQ2xvc2U7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCd3cml0ZSgpIHNlbmQoKTogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgZW5kOworCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEZvcm1hdCgnd3JpdGUoKSBzZW5kKCk6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgLy8gRmFpbCBvbiBibG9ja2VkIHNlbmQKKyAgaWYgQiA9IDAgdGhlbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnU29ja2V0IHNlbmQgcmV0dXJuZWQgMC4nKTsKKworICBSZXN1bHQgOj0gQjsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5HZXRDYWNoZWRBZGRyZXNzKG91dCBMZW46IEludGVnZXIpOiBQU29ja0FkZHI7CitiZWdpbgorICBjYXNlIEZDYWNoZWRQZWVyQWRkci5pcHY0LnNpbl9mYW1pbHkgb2YKKyAgICBBRl9JTkVUOiBiZWdpbgorICAgICAgTGVuIDo9IFNpemVPZihUU29ja0FkZHJJbik7CisgICAgICBSZXN1bHQgOj0gUFNvY2tBZGRyKEBGQ2FjaGVkUGVlckFkZHIuaXB2NCk7CisgICAgZW5kOworICAgIEFGX0lORVQ2OiBiZWdpbgorICAgICAgTGVuIDo9IFNpemVPZihUU29ja0FkZHJJbjYpOworICAgICAgUmVzdWx0IDo9IFBTb2NrQWRkcihARkNhY2hlZFBlZXJBZGRyLmlwdjYpOworICAgIGVuZDsKKyAgZWxzZQorICAgIExlbiA6PSAwOworICAgIFJlc3VsdCA6PSBuaWw7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuU2V0Q2FjaGVkQWRkcmVzcyhjb25zdCBBZGRyOiBUU29ja0FkZHI7IExlbjogSW50ZWdlcik7CitiZWdpbgorICBjYXNlIEFkZHIuc2FfZmFtaWx5IG9mCisgICAgQUZfSU5FVDogaWYgTGVuID0gU2l6ZU9mKFRTb2NrQWRkckluKSB0aGVuIEZDYWNoZWRQZWVyQWRkci5pcHY0IDo9IFBTb2NrQWRkckluKEBBZGRyKV47CisgICAgQUZfSU5FVDY6IGlmIExlbiA9IFNpemVPZihUU29ja0FkZHJJbjYpIHRoZW4gRkNhY2hlZFBlZXJBZGRyLmlwdjYgOj0gUFNvY2tBZGRySW42KEBBZGRyKV47CisgIGVuZDsKKyAgRlBlZXJBZGRyZXNzIDo9ICcnOworICBGUGVlckhvc3QgOj0gJyc7CisgIEZQZWVyUG9ydCA6PSAwOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5TZXRMaW5nZXIoTGluZ2VyT246IEJvb2xlYW47IExpbmdlclZhbDogSW50ZWdlcik7Cit2YXIKKyAgTDogVExpbmdlcjsKK2JlZ2luCisgIEZMaW5nZXJPbiA6PSBMaW5nZXJPbjsKKyAgRkxpbmdlclZhbCA6PSBMaW5nZXJWYWw7CisgIGlmIFNvY2tldCA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICBFeGl0OworCisgIEwubF9vbm9mZiA6PSBJZlRoZW4oRkxpbmdlck9uLCAxLCAwKTsKKyAgTC5sX2xpbmdlciA6PSBMaW5nZXJWYWw7CisKKyAgaWYgc2V0c29ja29wdChTb2NrZXQsIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgQEwsIFNpemVPZihMKSkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5TZXRMaW5nZXIoKSBzZXRzb2Nrb3B0KCkgJXMgJXMnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuUGVlazogQm9vbGVhbjsKK3ZhcgorICBSZXRyaWVzOiBMb25nd29yZDsKKyAgRmRzOiBURmRTZXQ7CisgIFRWYWw6IFRUaW1lVmFsOworICBQVFZhbDogUFRpbWVWYWw7CisgIFJldDogSW50ZWdlcjsKKyAgRXJybm9Db3B5OiBJbnRlZ2VyOworICBCdWY6IEJ5dGU7CitiZWdpbgorICBpZiBub3QgSXNPcGVuIHRoZW4gRXhpdChGYWxzZSk7CisKKyAgaWYgQXNzaWduZWQoRkludGVycnVwdExpc3RlbmVyKSB0aGVuIGJlZ2luCisgICAgUmV0cmllcyA6PSAwOworICAgIHdoaWxlIHRydWUgZG8gYmVnaW4KKyAgICAgIEZEX1pFUk8oRmRzKTsKKyAgICAgIF9GRF9TRVQoU29ja2V0LCBGZHMpOworICAgICAgX0ZEX1NFVChGSW50ZXJydXB0TGlzdGVuZXIsIEZkcyk7CisgICAgICBpZiBSZWN2VGltZW91dCA+IDAgdGhlbiBiZWdpbgorICAgICAgICBUVmFsLnR2X3NlYyA6PSBSZWN2VGltZW91dCBkaXYgMTAwMDsKKyAgICAgICAgVFZhbC50dl91c2VjIDo9IChSZWN2VGltZW91dCBtb2QgMTAwMCkgKiAxMDAwOworICAgICAgICBQVFZhbCA6PSBAVFZhbDsKKyAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICBQVFZhbCA6PSBuaWw7CisKKyAgICAgIFJldCA6PSBzZWxlY3QoMiwgQEZkcywgbmlsLCBuaWwsIFBUVmFsKTsKKyAgICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgICBpZiBSZXQgPCAwIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gZXJyb3IgY2FzZXMKKyAgICAgICAgaWYgKEVycm5vQ29weSA9IFdTQUVJTlRSKSBhbmQgKFJldHJpZXMgPCBGTWF4UmVjdlJldHJpZXMpIHRoZW4gYmVnaW4KKyAgICAgICAgICBJbmMoUmV0cmllcyk7CisgICAgICAgICAgQ29udGludWU7CisgICAgICAgIGVuZDsKKyAgICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0LlBlZWsoKSBzZWxlY3QoKSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEZvcm1hdCgnVW5rbm93bjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgUmV0ID4gMCB0aGVuIGJlZ2luCisgICAgICAgIC8vIENoZWNrIHRoZSBpbnRlcnJ1cHRMaXN0ZW5lcgorICAgICAgICBpZiBGRF9JU1NFVChGSW50ZXJydXB0TGlzdGVuZXIsIEZkcykgdGhlbgorICAgICAgICAgIEV4aXQoRmFsc2UpOworICAgICAgICAvLyBUaGVyZSBtdXN0IGJlIGRhdGEgb3IgYSBkaXNjb25uZWN0aW9uLCBmYWxsIHRocm91Z2ggdG8gdGhlIFBFRUsKKyAgICAgICAgQnJlYWs7CisgICAgICBlbmQKKyAgICAgIGVsc2UKKyAgICAgICAgLy8gdGltZW91dAorICAgICAgICBFeGl0KEZhbHNlKTsKKyAgICBlbmQ7CisgIGVuZDsKKworICAvLyBDaGVjayB0byBzZWUgaWYgZGF0YSBpcyBhdmFpbGFibGUgb3IgaWYgdGhlIHJlbW90ZSBzaWRlIGNsb3NlZAorICBSZXQgOj0gcmVjdihTb2NrZXQsIEJ1ZiwgMSwgTVNHX1BFRUspOworICBpZiBSZXQgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgaWYgRXJybm9Db3B5ID0gV1NBRUNPTk5SRVNFVCB0aGVuIGJlZ2luCisgICAgICBDbG9zZTsKKyAgICAgIEV4aXQoRmFsc2UpOworICAgIGVuZDsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuUGVlaygpIHJlY3YoKSAlcyAlcycsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRm9ybWF0KCdyZWN2KCk6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisgIFJlc3VsdCA6PSBSZXQgPiAwOworZW5kOworCitmdW5jdGlvbiBUU2VydmVyU29ja2V0LkNyZWF0ZVNvY2tldE9iaihDbGllbnQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0KTogVFNvY2tldDsKK2JlZ2luCisgIGlmIEZJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4gdGhlbgorICAgIFJlc3VsdCA6PSBUU29ja2V0LkNyZWF0ZShDbGllbnQsIEZDaGlsZEludGVycnVwdFNvY2tSZWFkZXIpCisgIGVsc2UKKyAgICBSZXN1bHQgOj0gVFNvY2tldC5DcmVhdGUoQ2xpZW50KTsKK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXQuTm90aWZ5KE5vdGlmeVNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOwordmFyCisgIEJ5dDogQnl0ZTsKK2JlZ2luCisgIGlmIE5vdGlmeVNvY2tldCA8PiBJTlZBTElEX1NPQ0tFVCB0aGVuIGJlZ2luCisgICAgQnl0IDo9IDA7CisgICAgaWYgc2VuZChOb3RpZnlTb2NrZXQsIEJ5dCwgU2l6ZU9mKEJ5dCksIDApID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5Ob3RpZnkoKSBzZW5kKCkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXQuU2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKEFWYWx1ZTogQm9vbGVhbik7CitiZWdpbgorICBpZiBGTGlzdGVuaW5nIHRoZW4KKyAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4gY2Fubm90IGJlIHNldCBhZnRlciBsaXN0ZW4oKScpOworICBGSW50ZXJydXB0YWJsZUNoaWxkcmVuIDo9IEFWYWx1ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXQuQ29tbW9uSW5pdDsKK2JlZ2luCisgIGluaGVyaXRlZCBDb21tb25Jbml0OworICBGSW50ZXJydXB0YWJsZUNoaWxkcmVuIDo9IFRydWU7CisgIEZBY2NlcHRCYWNrbG9nIDo9IERFRkFVTFRfQkFDS0xPRzsKKyAgRkFjY2VwdFRpbWVvdXQgOj0gMDsKKyAgRlJldHJ5TGltaXQgOj0gMDsKKyAgRlJldHJ5RGVsYXkgOj0gMDsKKyAgRlRjcFNlbmRCdWZmZXIgOj0gMDsKKyAgRlRjcFJlY3ZCdWZmZXIgOj0gMDsKKyAgRkxpc3RlbmluZyA6PSBGYWxzZTsKKyAgRkludGVycnVwdFNvY2tXcml0ZXIgOj0gSU5WQUxJRF9TT0NLRVQ7CisgIEZJbnRlcnJ1cHRTb2NrUmVhZGVyIDo9IElOVkFMSURfU09DS0VUOworICBGQ2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyIDo9IElOVkFMSURfU09DS0VUOworZW5kOworCitjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0LkNyZWF0ZShBUG9ydDogSW50ZWdlcjsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOworYmVnaW4KKyAgLy8gVW5uZWNlc3NhcnksIGJ1dCBoZXJlIGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzCisgIGluaGVyaXRlZCBDcmVhdGUoQVBvcnQsIEFMb2dEZWxlZ2F0ZSk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTZXJ2ZXJTb2NrZXQuQ3JlYXRlKEFQb3J0OiBJbnRlZ2VyOyBBU2VuZFRpbWVvdXQsIEFSZWN2VGltZW91dDogTG9uZ3dvcmQ7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoQVBvcnQsIEFMb2dEZWxlZ2F0ZSk7CisgIFNlbmRUaW1lb3V0IDo9IEFTZW5kVGltZW91dDsKKyAgUmVjdlRpbWVvdXQgOj0gQVJlY3ZUaW1lb3V0OworZW5kOworCitjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0LkNyZWF0ZShBQWRkcmVzczogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShBUG9ydCwgQUxvZ0RlbGVnYXRlKTsKKyAgRkFkZHJlc3MgOj0gQUFkZHJlc3M7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2VydmVyU29ja2V0Lkxpc3RlbjsKKworICBmdW5jdGlvbiBDcmVhdGVTb2NrZXRQYWlyKHZhciBSZWFkZXIsIFdyaXRlcjogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOiBJbnRlZ2VyOworICBsYWJlbAorICAgIEVycm9yOworICB0eXBlCisgICAgVFNBVW5pb24gPSByZWNvcmQKKyAgICBjYXNlIEludGVnZXIgb2YKKyAgICAgIDA6IChpbmFkZHI6IFRTb2NrQWRkckluKTsKKyAgICAgIDE6IChhZGRyOiBUU29ja0FkZHIpOworICAgIGVuZDsKKyAgdmFyCisgICAgYTogVFNBVW5pb247CisgICAgbGlzdGVuZXI6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OworICAgIGU6IEludGVnZXI7CisgICAgYWRkcmxlbjogSW50ZWdlcjsKKyAgICBmbGFnczogRFdPUkQ7CisgICAgcmV1c2U6IEludGVnZXI7CisgIGJlZ2luCisgICAgYWRkcmxlbiA6PSBTaXplT2YoYS5pbmFkZHIpOworICAgIGZsYWdzIDo9IDA7CisgICAgcmV1c2UgOj0gMTsKKworICAgIGxpc3RlbmVyIDo9IFdpbmFwaS5XaW5zb2NrMi5zb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKKyAgICBpZiBsaXN0ZW5lciA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICAgIEV4aXQoU09DS0VUX0VSUk9SKTsKKworICAgIEZpbGxDaGFyKGEsIFNpemVPZihhKSwgMCk7CisgICAgYS5pbmFkZHIuc2luX2ZhbWlseSA6PSBBRl9JTkVUOworICAgIGEuaW5hZGRyLnNpbl9hZGRyLnNfYWRkciA6PSBodG9ubChJTkFERFJfTE9PUEJBQ0spOworICAgIGEuaW5hZGRyLnNpbl9wb3J0IDo9IDA7CisgICAgUmVhZGVyIDo9IElOVkFMSURfU09DS0VUOworICAgIFdyaXRlciA6PSBJTlZBTElEX1NPQ0tFVDsKKworICAgIC8vIGlnbm9yZSBlcnJvcnMgY29taW5nIG91dCBvZiB0aGlzIHNldHNvY2tvcHQuICBUaGlzIGlzIGJlY2F1c2UKKyAgICAvLyBTT19FWENMVVNJVkVBRERSVVNFIHJlcXVpcmVzIGFkbWluIHByaXZpbGVnZXMgb24gV2luWFAsIGJ1dCB3ZSBkb24ndAorICAgIC8vIHdhbnQgdG8gZm9yY2Ugc29ja2V0IHBhaXJzIHRvIGJlIGFuIGFkbWluLgorICAgIHNldHNvY2tvcHQobGlzdGVuZXIsIFNPTF9TT0NLRVQsIEludGVnZXIoU09fRVhDTFVTSVZFQUREUlVTRSksIEByZXVzZSwgU2l6ZU9mKHJldXNlKSk7CisgICAgaWYgYmluZChsaXN0ZW5lciwgYS5hZGRyLCBTaXplT2YoYS5pbmFkZHIpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgICBnb3RvIEVycm9yOworCisgICAgaWYgZ2V0c29ja25hbWUobGlzdGVuZXIsIGEuYWRkciwgYWRkcmxlbikgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgICAgZ290byBFcnJvcjsKKworICAgIGlmIFdpbmFwaS5XaW5zb2NrMi5saXN0ZW4obGlzdGVuZXIsIDEpID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICAgIGdvdG8gRXJyb3I7CisKKyAgICBSZWFkZXIgOj0gV1NBU29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwLCBuaWwsIDAsIGZsYWdzKTsKKyAgICBpZiBSZWFkZXIgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgICBnb3RvIEVycm9yOworCisgICAgaWYgY29ubmVjdChSZWFkZXIsIGEuYWRkciwgU2l6ZU9mKGEuaW5hZGRyKSkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgICAgZ290byBFcnJvcjsKKworICAgIFdyaXRlciA6PSBXaW5hcGkuV2luc29jazIuYWNjZXB0KGxpc3RlbmVyLCBuaWwsIG5pbCk7CisgICAgaWYgV3JpdGVyID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgICAgZ290byBFcnJvcjsKKworICAgIGNsb3Nlc29ja2V0KGxpc3RlbmVyKTsKKyAgICBFeGl0KDApOworCisgIEVycm9yOgorICAgIGUgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIGNsb3Nlc29ja2V0KGxpc3RlbmVyKTsKKyAgICBjbG9zZXNvY2tldChSZWFkZXIpOworICAgIGNsb3Nlc29ja2V0KFdyaXRlcik7CisgICAgV1NBU2V0TGFzdEVycm9yKGUpOworICAgIFJlc3VsdCA6PSBTT0NLRVRfRVJST1I7CisgIGVuZDsKKwordmFyCisgIFRlbXBJbnRSZWFkZXIsCisgIFRlbXBJbnRXcml0ZXI6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OworICBPbmU6IENhcmRpbmFsOworICBFcnJub0NvcHk6IEludGVnZXI7CisgIExpbmc6IFRMaW5nZXI7CisgIFJldHJpZXM6IEludGVnZXI7CisgIEFkZHJJbmZvOiBJR2V0QWRkckluZm9XcmFwcGVyOworICBTQTogVFNvY2tBZGRyU3RvcmFnZTsKKyAgTGVuOiBJbnRlZ2VyOworYmVnaW4KKyAgLy8gQ3JlYXRlIHRoZSBzb2NrZXQgcGFpciB1c2VkIHRvIGludGVycnVwdAorICBpZiBDcmVhdGVTb2NrZXRQYWlyKFRlbXBJbnRSZWFkZXIsIFRlbXBJbnRXcml0ZXIpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgQ3JlYXRlU29ja2V0UGFpcigpIEludGVycnVwdCAlcycsIFtTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKKyAgICBGSW50ZXJydXB0U29ja1JlYWRlciA6PSBJTlZBTElEX1NPQ0tFVDsKKyAgICBGSW50ZXJydXB0U29ja1dyaXRlciA6PSBJTlZBTElEX1NPQ0tFVDsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBGSW50ZXJydXB0U29ja1JlYWRlciA6PSBUZW1wSW50UmVhZGVyOworICAgIEZJbnRlcnJ1cHRTb2NrV3JpdGVyIDo9IFRlbXBJbnRXcml0ZXI7CisgIGVuZDsKKworICAvLyBDcmVhdGUgdGhlIHNvY2tldCBwYWlyIHVzZWQgdG8gaW50ZXJydXB0IGFsbCBjbGllbnRzCisgIGlmIENyZWF0ZVNvY2tldFBhaXIoVGVtcEludFJlYWRlciwgVGVtcEludFdyaXRlcikgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBDcmVhdGVTb2NrZXRQYWlyKCkgQ2hpbGRJbnRlcnJ1cHQgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CisgICAgRkNoaWxkSW50ZXJydXB0U29ja1JlYWRlciA6PSBUU21hcnRQb2ludGVyPFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0Pi5DcmVhdGUoSU5WQUxJRF9TT0NLRVQsIG5pbCk7CisgICAgRkNoaWxkSW50ZXJydXB0U29ja1dyaXRlciA6PSBJTlZBTElEX1NPQ0tFVDsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBGQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyIDo9IFRTbWFydFBvaW50ZXI8V2luYXBpLldpbnNvY2syLlRTb2NrZXQ+LkNyZWF0ZShUZW1wSW50UmVhZGVyLCBEZXN0cm95ZXJPZkZpbmVTb2NrZXRzKTsKKyAgICBGQ2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyIDo9IFRlbXBJbnRXcml0ZXI7CisgIGVuZDsKKworICBpZiAoUG9ydCA8IDApIG9yIChQb3J0ID4gJEZGRkYpIHRoZW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uQmFkQXJncy5DcmVhdGUoJ1NwZWNpZmllZCBwb3J0IGlzIGludmFsaWQnKTsKKworICBBZGRySW5mbyA6PSBDcmVhdGVTb2NrZXQoRkFkZHJlc3MsIFBvcnQpOworCisgIC8vIFNldCBTT19FWENMVVNJVkVBRERSVVNFIHRvIHByZXZlbnQgMk1TTCBkZWxheSBvbiBhY2NlcHQKKyAgT25lIDo9IDE7CisgIHNldHNvY2tvcHQoU29ja2V0LCBTT0xfU09DS0VULCBJbnRlZ2VyKFNPX0VYQ0xVU0lWRUFERFJVU0UpLCBAb25lLCBTaXplT2YoT25lKSk7CisgIC8vIGlnbm9yZSBlcnJvcnMgY29taW5nIG91dCBvZiB0aGlzIHNldHNvY2tvcHQgb24gV2luZG93cy4gIFRoaXMgaXMgYmVjYXVzZQorICAvLyBTT19FWENMVVNJVkVBRERSVVNFIHJlcXVpcmVzIGFkbWluIHByaXZpbGVnZXMgb24gV2luWFAsIGJ1dCB3ZSBkb24ndAorICAvLyB3YW50IHRvIGZvcmNlIHNlcnZlcnMgdG8gYmUgYW4gYWRtaW4uCisKKyAgLy8gU2V0IFRDUCBidWZmZXIgc2l6ZXMKKyAgaWYgRlRjcFNlbmRCdWZmZXIgPiAwIHRoZW4gYmVnaW4KKyAgICBpZiBzZXRzb2Nrb3B0KFNvY2tldCwgU09MX1NPQ0tFVCwgU09fU05EQlVGLCBARlRjcFNlbmRCdWZmZXIsIFNpemVPZihGVGNwU2VuZEJ1ZmZlcikpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1NOREJVRiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ0NvdWxkIG5vdCBzZXQgU09fU05EQlVGOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICBlbmQ7CisgIGVuZDsKKworICBpZiBGVGNwUmVjdkJ1ZmZlciA+IDAgdGhlbiBiZWdpbgorICAgIGlmIHNldHNvY2tvcHQoU29ja2V0LCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsIEBGVGNwUmVjdkJ1ZmZlciwgU2l6ZU9mKEZUY3BSZWN2QnVmZmVyKSkgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fUkNWQlVGICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnQ291bGQgbm90IHNldCBTT19SQ1ZCVUY6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIGVuZDsKKyAgZW5kOworCisgIC8vIFR1cm4gbGluZ2VyIG9mZiwgZG9uJ3Qgd2FudCB0byBibG9jayBvbiBjYWxscyB0byBjbG9zZQorICBMaW5nLmxfb25vZmYgOj0gMDsKKyAgTGluZy5sX2xpbmdlciA6PSAwOworICBpZiBzZXRzb2Nrb3B0KFNvY2tldCwgU09MX1NPQ0tFVCwgU09fTElOR0VSLCBATGluZywgU2l6ZU9mKExpbmcpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX0xJTkdFUiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdDb3VsZCBub3Qgc2V0IFNPX0xJTkdFUjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworICAvLyBUQ1AgTm9kZWxheSwgc3BlZWQgb3ZlciBiYW5kd2lkdGgKKyAgaWYgc2V0c29ja29wdChTb2NrZXQsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgQE9uZSwgU2l6ZU9mKE9uZSkpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgVENQX05PREVMQVkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnQ291bGQgbm90IHNldCBUQ1BfTk9ERUxBWTogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworICAvLyBTZXQgTk9OQkxPQ0sgb24gdGhlIGFjY2VwdCBzb2NrZXQKKyAgaWYgaW9jdGxzb2NrZXQoU29ja2V0LCBJbnRlZ2VyKEZJT05CSU8pLCBPbmUpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBpb2N0bHNvY2tldCgpIEZJT05CSU8gJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnaW9jdGxzb2NrZXQoKSBGSU9OQklPOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIC8vIHByZXBhcmUgdGhlIHBvcnQgaW5mb3JtYXRpb24KKyAgLy8gd2UgbWF5IHdhbnQgdG8gdHJ5IHRvIGJpbmQgbW9yZSB0aGFuIG9uY2UsIHNpbmNlIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyBkb2Vzbid0CisgIC8vIGFsd2F5cyBzZWVtIHRvIHdvcmsuIFRoZSBjbGllbnQgY2FuIGNvbmZpZ3VyZSB0aGUgcmV0cnkgdmFyaWFibGVzLgorICBSZXRyaWVzIDo9IDA7CisgIHdoaWxlIFRydWUgZG8gYmVnaW4KKyAgICBpZiBiaW5kKFNvY2tldCwgQWRkckluZm8uUmVzXi5haV9hZGRyXiwgQWRkckluZm8uUmVzXi5haV9hZGRybGVuKSA9IDAgdGhlbgorICAgICAgQnJlYWs7CisgICAgSW5jKFJldHJpZXMpOworICAgIGlmIFJldHJpZXMgPiBGUmV0cnlMaW1pdCB0aGVuCisgICAgICBCcmVhazsKKyAgICBTbGVlcChGUmV0cnlEZWxheSAqIDEwMDApOworICBlbmQ7CisKKyAgLy8gcmV0cmlldmUgYmluZCBpbmZvCisgIGlmIChQb3J0ID0gMCkgYW5kIChSZXRyaWVzIDwgRlJldHJ5TGltaXQpIHRoZW4gYmVnaW4KKyAgICBMZW4gOj0gU2l6ZU9mKFNBKTsKKyAgICBGaWxsQ2hhcihTQSwgTGVuLCAwKTsKKyAgICBpZiBnZXRzb2NrbmFtZShTb2NrZXQsIFBTb2NrQWRkcihAU0EpXiwgTGVuKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgZ2V0c29ja25hbWUoKSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKQorICAgIGVsc2UgYmVnaW4KKyAgICAgIGlmIFNBLnNzX2ZhbWlseSA9IEFGX0lORVQ2IHRoZW4KKyAgICAgICAgUG9ydCA6PSBudG9ocyhQU29ja0FkZHJJbjYoQFNBKV4uc2luNl9wb3J0KQorICAgICAgZWxzZQorICAgICAgICBQb3J0IDo9IG50b2hzKFBTb2NrQWRkckluKEBTQSleLnNpbl9wb3J0KTsKKyAgICBlbmQ7CisgIGVuZDsKKworICAvLyB0aHJvdyBhbiBlcnJvciBpZiB3ZSBmYWlsZWQgdG8gYmluZCBwcm9wZXJseQorICBpZiAoUmV0cmllcyA+IEZSZXRyeUxpbWl0KSB0aGVuIGJlZ2luCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIEJJTkQgJWQnLCBbUG9ydF0pKTsKKyAgICBDbG9zZTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdDb3VsZCBub3QgYmluZDogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CisgIGVuZDsKKworICBpZiBBc3NpZ25lZChGTGlzdGVuQ2FsbGJhY2spIHRoZW4KKyAgICBGTGlzdGVuQ2FsbGJhY2soU29ja2V0KTsKKworICAvLyBDYWxsIGxpc3RlbgorICBpZiBXaW5hcGkuV2luc29jazIubGlzdGVuKFNvY2tldCwgRkFjY2VwdEJhY2tsb2cpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBsaXN0ZW4oKSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdDb3VsZCBub3QgbGlzdGVuOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIC8vIFRoZSBzb2NrZXQgaXMgbm93IGxpc3RlbmluZyEKK2VuZDsKKworZnVuY3Rpb24gVFNlcnZlclNvY2tldC5BY2NlcHQ6IFRTb2NrZXQ7Cit2YXIKKyAgRmRzOiBURmRTZXQ7CisgIE1heEVJbnRlcnMsCisgIE51bUVJbnRlcnM6IEludGVnZXI7CisgIFRWYWw6IFRUaW1lVmFsOworICBQVFZhbDogUFRpbWVWYWw7CisgIEVycm5vQ29weTogSW50ZWdlcjsKKyAgQnVmOiBCeXRlOworICBDbGllbnRBZGRyZXNzOiBUU29ja0FkZHJTdG9yYWdlOworICBTaXplOiBJbnRlZ2VyOworICBDbGllbnRTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OworICBaZXJvOiBDYXJkaW5hbDsKKyAgQ2xpZW50OiBUU29ja2V0OworICBSZXQ6IEludGVnZXI7CitiZWdpbgorICBNYXhFSW50ZXJzIDo9IDU7CisgIE51bUVJbnRlcnMgOj0gMDsKKworICB3aGlsZSBUcnVlIGRvIGJlZ2luCisgICAgRkRfWkVSTyhGZHMpOworICAgIF9GRF9TRVQoU29ja2V0LCBGZHMpOworICAgIF9GRF9TRVQoRkludGVycnVwdFNvY2tSZWFkZXIsIEZkcyk7CisgICAgaWYgRkFjY2VwdFRpbWVvdXQgPiAwIHRoZW4gYmVnaW4KKyAgICAgIFRWYWwudHZfc2VjIDo9IEZBY2NlcHRUaW1lb3V0IGRpdiAxMDAwOworICAgICAgVFZhbC50dl91c2VjIDo9IChGQWNjZXB0VGltZW91dCBtb2QgMTAwMCkgKiAxMDAwOworICAgICAgUFRWYWwgOj0gQFRWYWw7CisgICAgZW5kCisgICAgZWxzZQorICAgICAgUFRWYWwgOj0gbmlsOworCisgICAgLy8gVE9ETzogaWYgV1NBRUlOVFIgaXMgcmVjZWl2ZWQsIHdlJ2xsIHJlc3RhcnQgdGhlIHRpbWVvdXQuCisgICAgLy8gVG8gYmUgYWNjdXJhdGUsIHdlIG5lZWQgdG8gZml4IHRoaXMgaW4gdGhlIGZ1dHVyZS4KKyAgICBSZXQgOj0gc2VsZWN0KDIsIEBGZHMsIG5pbCwgbmlsLCBQVFZhbCk7CisKKyAgICBpZiBSZXQgPCAwIHRoZW4gYmVnaW4KKyAgICAgIC8vIGVycm9yIGNhc2VzCisgICAgICBpZiAoV1NBR2V0TGFzdEVycm9yID0gV1NBRUlOVFIpIGFuZCAoTnVtRUludGVycyA8IE1heEVJbnRlcnMpIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gVEhSSUZUX0VJTlRSIG5lZWRzIHRvIGJlIGhhbmRsZWQgbWFudWFsbHkgYW5kIHdlIGNhbiB0b2xlcmF0ZQorICAgICAgICAvLyBhIGNlcnRhaW4gbnVtYmVyCisgICAgICAgIEluYyhOdW1FSW50ZXJzKTsKKyAgICAgICAgQ29udGludWU7CisgICAgICBlbmQ7CisgICAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0LkFjY2VwdCgpIHNlbGVjdCgpICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEZvcm1hdCgnVW5rbm93bjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgZW5kCisgICAgZWxzZSBpZiBSZXQgPiAwIHRoZW4gYmVnaW4KKyAgICAgIC8vIENoZWNrIGZvciBhbiBpbnRlcnJ1cHQgc2lnbmFsCisgICAgICBpZiAoRkludGVycnVwdFNvY2tSZWFkZXIgPD4gSU5WQUxJRF9TT0NLRVQpIGFuZCBGRF9JU1NFVChGSW50ZXJydXB0U29ja1JlYWRlciwgRmRzKSB0aGVuIGJlZ2luCisgICAgICAgIGlmIHJlY3YoRkludGVycnVwdFNvY2tSZWFkZXIsIEJ1ZiwgU2l6ZU9mKEJ1ZiksIDApID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICAgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuQWNjZXB0KCkgcmVjdigpIGludGVycnVwdCAlcycsIFtTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbkludGVycnVwdGVkLkNyZWF0ZSgnaW50ZXJydXB0ZWQnKTsKKyAgICAgIGVuZDsKKworICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBhY3R1YWwgc2VydmVyIHNvY2tldCBiZWluZyByZWFkeQorICAgICAgaWYgRkRfSVNTRVQoU29ja2V0LCBGZHMpIHRoZW4KKyAgICAgICAgQnJlYWs7CisgICAgZW5kCisgICAgZWxzZSBiZWdpbgorICAgICAgTG9nRGVsZWdhdGUoJ1RTZXJ2ZXJTb2NrZXQuQWNjZXB0KCkgc2VsZWN0KCkgMCcpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCd1bmtub3duIGVycm9yJyk7CisgICAgZW5kOworICBlbmQ7CisKKyAgU2l6ZSA6PSBTaXplT2YoQ2xpZW50QWRkcmVzcyk7CisgIENsaWVudFNvY2tldCA6PSBXaW5hcGkuV2luc29jazIuYWNjZXB0KFNvY2tldCwgQENsaWVudEFkZHJlc3MsIEBTaXplKTsKKyAgaWYgQ2xpZW50U29ja2V0ID0gSU5WQUxJRF9TT0NLRVQgdGhlbiBiZWdpbgorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0LkFjY2VwdCgpIGFjY2VwdCgpICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShGb3JtYXQoJ2FjY2VwdCgpOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIC8vIE1ha2Ugc3VyZSBjbGllbnQgc29ja2V0IGlzIGJsb2NraW5nCisgIFplcm8gOj0gMDsKKyAgaWYgaW9jdGxzb2NrZXQoQ2xpZW50U29ja2V0LCBJbnRlZ2VyKEZJT05CSU8pLCBaZXJvKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBjbG9zZXNvY2tldChDbGllbnRTb2NrZXQpOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5BY2NlcHQoKSBpb2N0bHNvY2tldCgpIEZJT05CSU8gJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEZvcm1hdCgnaW9jdGxzb2NrZXQoKTogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworICBDbGllbnQgOj0gQ3JlYXRlU29ja2V0T2JqKENsaWVudFNvY2tldCk7CisgIGlmIFNlbmRUaW1lb3V0ID4gMCB0aGVuCisgICAgQ2xpZW50LlNlbmRUaW1lb3V0IDo9IFNlbmRUaW1lb3V0OworICBpZiBSZWN2VGltZW91dCA+IDAgdGhlbgorICAgIENsaWVudC5SZWN2VGltZW91dCA6PSBSZWN2VGltZW91dDsKKyAgaWYgS2VlcEFsaXZlIHRoZW4KKyAgICBDbGllbnQuS2VlcEFsaXZlIDo9IEtlZXBBbGl2ZTsKKyAgQ2xpZW50LlNldENhY2hlZEFkZHJlc3MoUFNvY2tBZGRyKEBDbGllbnRBZGRyZXNzKV4sIFNpemUpOworCisgIGlmIEFzc2lnbmVkKEZBY2NlcHRDYWxsYmFjaykgdGhlbgorICAgIEZBY2NlcHRDYWxsYmFjayhDbGllbnRTb2NrZXQpOworCisgIFJlc3VsdCA6PSBDbGllbnQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2VydmVyU29ja2V0LkludGVycnVwdDsKK2JlZ2luCisgIE5vdGlmeShGSW50ZXJydXB0U29ja1dyaXRlcik7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2VydmVyU29ja2V0LkludGVycnVwdENoaWxkcmVuOworYmVnaW4KKyAgTm90aWZ5KEZDaGlsZEludGVycnVwdFNvY2tXcml0ZXIpOworZW5kOworCitwcm9jZWR1cmUgVFNlcnZlclNvY2tldC5DbG9zZTsKK2JlZ2luCisgIGluaGVyaXRlZCBDbG9zZTsKKyAgaWYgRkludGVycnVwdFNvY2tXcml0ZXIgPD4gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIGNsb3Nlc29ja2V0KEZJbnRlcnJ1cHRTb2NrV3JpdGVyKTsKKyAgaWYgRkludGVycnVwdFNvY2tSZWFkZXIgPD4gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIGNsb3Nlc29ja2V0KEZJbnRlcnJ1cHRTb2NrUmVhZGVyKTsKKyAgaWYgRkNoaWxkSW50ZXJydXB0U29ja1dyaXRlciA8PiBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgY2xvc2Vzb2NrZXQoRkNoaWxkSW50ZXJydXB0U29ja1dyaXRlcik7CisgIEZDaGlsZEludGVycnVwdFNvY2tSZWFkZXIgOj0gVFNtYXJ0UG9pbnRlcjxXaW5hcGkuV2luc29jazIuVFNvY2tldD4uQ3JlYXRlKElOVkFMSURfU09DS0VULCBuaWwpOworICBGTGlzdGVuaW5nIDo9IEZhbHNlOworZW5kOworCit7JEVORElGfSAvLyBub3QgZm9yIE9MRF9TT0NLRVRTCitlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuU3RyZWFtLnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TdHJlYW0ucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMDhjNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuU3RyZWFtLnBhcwpAQCAtMCwwICsxLDMxOSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRocmlmdC5TdHJlYW07CisKK3skSSBUaHJpZnQuRGVmaW5lcy5pbmN9CisKK2ludGVyZmFjZQorCit1c2VzCisgIENsYXNzZXMsCisgIFN5c1V0aWxzLAorICBTeXNDb25zdCwKKyAgUlRMQ29uc3RzLAorICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICBBY3RpdmVYLAorICB7JEVMU0V9CisgIFdpbmFwaS5BY3RpdmVYLAorICB7JEVORElGfQorICBUaHJpZnQuVXRpbHM7CisKK3R5cGUKKworICBJVGhyaWZ0U3RyZWFtID0gaW50ZXJmYWNlCisgICAgWyd7MkE3N0Q5MTYtNzQ0Ni00NkMxLTg1NDUtMEFFQzAwMDhEQkNBfSddCisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7ICBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgIG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIFJlYWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7ICBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7ICBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgT3BlbjsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7CisgICAgcHJvY2VkdXJlIEZsdXNoOworICAgIGZ1bmN0aW9uIElzT3BlbjogQm9vbGVhbjsKKyAgICBmdW5jdGlvbiBUb0FycmF5OiBUQnl0ZXM7CisgIGVuZDsKKworICBUVGhyaWZ0U3RyZWFtSW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVRocmlmdFN0cmVhbSkKKyAgcHJpdmF0ZQorICAgIHByb2NlZHVyZSBDaGVja1NpemVBbmRPZmZzZXQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgIG92ZXJsb2FkOworICBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7IGlubGluZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgIG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIFJlYWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOyBpbmxpbmU7CisgICAgZnVuY3Rpb24gUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgT3BlbjsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIENsb3NlOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgRmx1c2g7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIElzT3BlbjogQm9vbGVhbjsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gVG9BcnJheTogVEJ5dGVzOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgZW5kOworCisgIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpID0gY2xhc3MoIFRUaHJpZnRTdHJlYW1JbXBsICkKKyAgcHJpdmF0ZQorICAgIEZTdHJlYW0gOiBUU3RyZWFtOworICAgIEZPd25zU3RyZWFtIDogQm9vbGVhbjsKKyAgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRCeXRlczsgb3ZlcnJpZGU7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVN0cmVhbTogVFN0cmVhbTsgQU93bnNTdHJlYW0gOiBCb29sZWFuKTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworICBlbmQ7CisKKyAgVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00gPSBjbGFzcyggVFRocmlmdFN0cmVhbUltcGwpCisgIHByaXZhdGUKKyAgICBGU3RyZWFtIDogSVN0cmVhbTsKKyAgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRCeXRlczsgb3ZlcnJpZGU7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVN0cmVhbTogSVN0cmVhbSk7CisgIGVuZDsKKworaW1wbGVtZW50YXRpb24KKworeyBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTSB9CisKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5DbG9zZTsKK2JlZ2luCisgIEZTdHJlYW0gOj0gbmlsOworZW5kOworCitjb25zdHJ1Y3RvciBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5DcmVhdGUoIGNvbnN0IEFTdHJlYW06IElTdHJlYW0pOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlN0cmVhbSA6PSBBU3RyZWFtOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00uRmx1c2g7CitiZWdpbgorICBpZiBJc09wZW4gdGhlbiBiZWdpbgorICAgIGlmIEZTdHJlYW0gPD4gbmlsIHRoZW4gYmVnaW4KKyAgICAgIEZTdHJlYW0uQ29tbWl0KCBTVEdDX0RFRkFVTFQgKTsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00uSXNPcGVuOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZTdHJlYW0gPD4gbmlsOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00uT3BlbjsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00uUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOwordmFyIHBUbXAgOiBQQnl0ZTsKK2JlZ2luCisgIGluaGVyaXRlZDsKKworICBpZiBjb3VudCA+PSBidWZsZW4tb2Zmc2V0CisgIHRoZW4gY291bnQgOj0gYnVmbGVuLW9mZnNldDsKKworICBSZXN1bHQgOj0gMDsKKyAgaWYgRlN0cmVhbSA8PiBuaWwgdGhlbiBiZWdpbgorICAgIGlmIGNvdW50ID4gMCB0aGVuIGJlZ2luCisgICAgICBwVG1wIDo9IHBCdWY7CisgICAgICBJbmMoIHBUbXAsIG9mZnNldCk7CisgICAgICBGU3RyZWFtLlJlYWQoIHBUbXAsIGNvdW50LCBAUmVzdWx0KTsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00uVG9BcnJheTogVEJ5dGVzOwordmFyCisgIHN0YXRzdGc6IFRTdGF0U3RnOworICBsZW4gOiBJbnRlZ2VyOworICBOZXdQb3MgOiB7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyOS4wfSBVSW50NjQgeyRFTFNFfSBJbnQ2NCAgeyRJRkVORH07CisgIGNiUmVhZCA6IEludGVnZXI7CitiZWdpbgorICBGaWxsQ2hhciggc3RhdHN0ZywgU2l6ZU9mKCBzdGF0c3RnKSwgMCk7CisgIGxlbiA6PSAwOworICBpZiBJc09wZW4gdGhlbiBiZWdpbgorICAgIGlmIFN1Y2NlZWRlZCggRlN0cmVhbS5TdGF0KCBzdGF0c3RnLCBTVEFURkxBR19OT05BTUUgKSkgdGhlbiBiZWdpbgorICAgICAgbGVuIDo9IHN0YXRzdGcuY2JTaXplOworICAgIGVuZDsKKyAgZW5kOworCisgIFNldExlbmd0aCggUmVzdWx0LCBsZW4gKTsKKworICBpZiBsZW4gPiAwIHRoZW4gYmVnaW4KKyAgICBpZiBTdWNjZWVkZWQoIEZTdHJlYW0uU2VlayggMCwgU1RSRUFNX1NFRUtfU0VULCBOZXdQb3MpICkgdGhlbiBiZWdpbgorICAgICAgRlN0cmVhbS5SZWFkKCBAUmVzdWx0WzBdLCBsZW4sIEBjYlJlYWQpOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00uV3JpdGUoIGNvbnN0IHBCdWY6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOwordmFyIG5Xcml0dGVuIDogSW50ZWdlcjsKKyAgICBwVG1wIDogUEJ5dGU7CitiZWdpbgorICBpbmhlcml0ZWQ7CisgIGlmIElzT3BlbiB0aGVuIGJlZ2luCisgICAgaWYgY291bnQgPiAwIHRoZW4gYmVnaW4KKyAgICAgIHBUbXAgOj0gcEJ1ZjsKKyAgICAgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgICAgIEZTdHJlYW0uV3JpdGUoIHBUbXAsIGNvdW50LCBAbldyaXR0ZW4pOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCit7IFRUaHJpZnRTdHJlYW1JbXBsIH0KKworcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1JbXBsLkNoZWNrU2l6ZUFuZE9mZnNldCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOworYmVnaW4KKyAgaWYgY291bnQgPiAwIHRoZW4gYmVnaW4KKyAgICBpZiAob2Zmc2V0IDwgMCkgb3IgKCBvZmZzZXQgPj0gYnVmbGVuKSB0aGVuIGJlZ2luCisgICAgICByYWlzZSBFUmFuZ2VFcnJvci5DcmVhdGUoIFNCaXRzSW5kZXhFcnJvciApOworICAgIGVuZDsKKyAgICBpZiBjb3VudCA+IGJ1ZmxlbiB0aGVuIGJlZ2luCisgICAgICByYWlzZSBFUmFuZ2VFcnJvci5DcmVhdGUoIFNCaXRzSW5kZXhFcnJvciApOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0U3RyZWFtSW1wbC5SZWFkKHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBpZiBMZW5ndGgoYnVmZmVyKSA+IDAKKyAgdGhlbiBSZXN1bHQgOj0gUmVhZCggQGJ1ZmZlclswXSwgTGVuZ3RoKGJ1ZmZlciksIG9mZnNldCwgY291bnQpCisgIGVsc2UgUmVzdWx0IDo9IDA7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRTdHJlYW1JbXBsLlJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSAwOworICBDaGVja1NpemVBbmRPZmZzZXQoIHBCdWYsIGJ1Zmxlbiwgb2Zmc2V0LCBjb3VudCApOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUltcGwuV3JpdGUoY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOworYmVnaW4KKyAgaWYgTGVuZ3RoKGJ1ZmZlcikgPiAwCisgIHRoZW4gV3JpdGUoIEBidWZmZXJbMF0sIG9mZnNldCwgY291bnQpOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUltcGwuV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKK2JlZ2luCisgIENoZWNrU2l6ZUFuZE9mZnNldCggcEJ1Ziwgb2Zmc2V0K2NvdW50LCBvZmZzZXQsIGNvdW50KTsKK2VuZDsKKworeyBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaSB9CisKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DbG9zZTsKK2JlZ2luCisgIEZTdHJlYW0uRnJlZTsKKyAgRlN0cmVhbSA6PSBuaWw7CisgIEZPd25zU3RyZWFtIDo9IEZhbHNlOworZW5kOworCitjb25zdHJ1Y3RvciBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIGNvbnN0IEFTdHJlYW06IFRTdHJlYW07IEFPd25zU3RyZWFtOiBCb29sZWFuKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZTdHJlYW0gOj0gQVN0cmVhbTsKKyAgRk93bnNTdHJlYW0gOj0gQU93bnNTdHJlYW07CitlbmQ7CisKK2Rlc3RydWN0b3IgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuRGVzdHJveTsKK2JlZ2luCisgIGlmIEZPd25zU3RyZWFtIAorICB0aGVuIENsb3NlOworICAKKyAgaW5oZXJpdGVkOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuRmx1c2g7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLklzT3BlbjogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGU3RyZWFtIDw+IG5pbDsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLk9wZW47CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLlJlYWQoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOwordmFyIHBUbXAgOiBQQnl0ZTsKK2JlZ2luCisgIGluaGVyaXRlZDsKKworICBpZiBjb3VudCA+PSBidWZsZW4tb2Zmc2V0CisgIHRoZW4gY291bnQgOj0gYnVmbGVuLW9mZnNldDsKKworICBpZiBjb3VudCA+IDAgdGhlbiBiZWdpbgorICAgIHBUbXAgOj0gcEJ1ZjsKKyAgICBJbmMoIHBUbXAsIG9mZnNldCk7CisgICAgUmVzdWx0IDo9IEZTdHJlYW0uUmVhZCggcFRtcF4sIGNvdW50KQorICBlbmQKKyAgZWxzZSBSZXN1bHQgOj0gMDsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuVG9BcnJheTogVEJ5dGVzOwordmFyCisgIE9yZ1BvcyA6IEludGVnZXI7CisgIGxlbiA6IEludGVnZXI7CitiZWdpbgorICBsZW4gOj0gMDsKKyAgaWYgRlN0cmVhbSA8PiBuaWwgdGhlbgorICBiZWdpbgorICAgIGxlbiA6PSBGU3RyZWFtLlNpemU7CisgIGVuZDsKKworICBTZXRMZW5ndGgoIFJlc3VsdCwgbGVuICk7CisKKyAgaWYgbGVuID4gMCB0aGVuCisgIGJlZ2luCisgICAgT3JnUG9zIDo9IEZTdHJlYW0uUG9zaXRpb247CisgICAgdHJ5CisgICAgICBGU3RyZWFtLlBvc2l0aW9uIDo9IDA7CisgICAgICBGU3RyZWFtLlJlYWRCdWZmZXIoIFBvaW50ZXIoQFJlc3VsdFswXSleLCBsZW4gKTsKKyAgICBmaW5hbGx5CisgICAgICBGU3RyZWFtLlBvc2l0aW9uIDo9IE9yZ1BvczsKKyAgICBlbmQ7CisgIGVuZAorZW5kOworCitwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuV3JpdGUoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOwordmFyIHBUbXAgOiBQQnl0ZTsKK2JlZ2luCisgIGluaGVyaXRlZDsKKyAgaWYgY291bnQgPiAwIHRoZW4gYmVnaW4KKyAgICBwVG1wIDo9IHBCdWY7CisgICAgSW5jKCBwVG1wLCBvZmZzZXQpOworICAgIEZTdHJlYW0uV3JpdGUoIHBUbXBeLCBjb3VudCkKKyAgZW5kOworZW5kOworCitlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5UcmFuc3BvcnQuUGlwZXMucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YTM0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcwpAQCAtMCwwICsxLDEwNDQgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKK3VuaXQgVGhyaWZ0LlRyYW5zcG9ydC5QaXBlczsKKworeyRXQVJOIFNZTUJPTF9QTEFURk9STSBPRkZ9Cit7JEkgVGhyaWZ0LkRlZmluZXMuaW5jfQorCitpbnRlcmZhY2UKKwordXNlcworICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICBXaW5kb3dzLCBTeXNVdGlscywgTWF0aCwgQWNjQ3RybCwgQWNsQVBJLCBTeW5jT2JqcywKKyAgeyRFTFNFfQorICBXaW5hcGkuV2luZG93cywgU3lzdGVtLlN5c1V0aWxzLCBTeXN0ZW0uTWF0aCwgV2luYXBpLkFjY0N0cmwsIFdpbmFwaS5BY2xBUEksIFN5c3RlbS5TeW5jT2JqcywKKyAgeyRFTkRJRn0KKyAgVGhyaWZ0LlRyYW5zcG9ydCwKKyAgVGhyaWZ0LlV0aWxzLAorICBUaHJpZnQuU3RyZWFtOworCitjb25zdAorICBERUZBVUxUX1RIUklGVF9QSVBFX09QRU5fVElNRU9VVCA9IDEwOyAgLy8gZGVmYXVsdDogZmFpbCBmYXN0IG9uIG9wZW4KKworCit0eXBlCisgIC8vLS0tIFBpcGUgU3RyZWFtcyAtLS0KKworCisgIFRQaXBlU3RyZWFtQmFzZSA9IGNsYXNzKCBUVGhyaWZ0U3RyZWFtSW1wbCkKKyAgc3RyaWN0IHByb3RlY3RlZAorICAgIEZQaXBlICAgIDogVEhhbmRsZTsKKyAgICBGVGltZW91dCA6IERXT1JEOworICAgIEZPcGVuVGltZU91dCA6IERXT1JEOyAgLy8gc2VwYXJhdGUgdmFsdWUgdG8gYWxsb3cgZm9yIGZhaWwtZmFzdC1vbi1vcGVuIHNjZW5hcmlvcworICAgIEZPdmVybGFwcGVkIDogQm9vbGVhbjsKKworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldCwgY291bnQgOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgLy9wcm9jZWR1cmUgT3Blbjsgb3ZlcnJpZGU7IC0gc2VlIGRlcml2ZWQgY2xhc3NlcworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKKworICAgIGZ1bmN0aW9uICBSZWFkRGlyZWN0KCAgICAgY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyAgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gIFJlYWRPdmVybGFwcGVkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7ICBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgV3JpdGVEaXJlY3QoICAgICBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7ICBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgV3JpdGVPdmVybGFwcGVkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7ICBvdmVybG9hZDsKKworICAgIGZ1bmN0aW9uIElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gVG9BcnJheTogVEJ5dGVzOyBvdmVycmlkZTsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBhRW5hYmxlT3ZlcmxhcHBlZCA6IEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFPcGVuVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfUElQRV9PUEVOX1RJTUVPVVQpOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgIG92ZXJyaWRlOworICBlbmQ7CisKKworICBUTmFtZWRQaXBlU3RyZWFtSW1wbCA9IGNsYXNzIHNlYWxlZCggVFBpcGVTdHJlYW1CYXNlKQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZQaXBlTmFtZSAgOiBzdHJpbmc7CisgICAgRlNoYXJlTW9kZSA6IERXT1JEOworICAgIEZTZWN1cml0eUF0dHJpYnMgOiBQU2VjdXJpdHlBdHRyaWJ1dGVzOworCisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgT3Blbjsgb3ZlcnJpZGU7CisKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhUGlwZU5hbWUgOiBzdHJpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhRW5hYmxlT3ZlcmxhcHBlZCA6IEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhU2hhcmVNb2RlOiBEV09SRCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhU2VjdXJpdHlBdHRyaWJ1dGVzOiBQU2VjdXJpdHlBdHRyaWJ1dGVzID0gbmlsOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhT3BlblRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1BJUEVfT1BFTl9USU1FT1VUKTsgIG92ZXJsb2FkOworICBlbmQ7CisKKworICBUSGFuZGxlUGlwZVN0cmVhbUltcGwgPSBjbGFzcyBzZWFsZWQoIFRQaXBlU3RyZWFtQmFzZSkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGU3JjSGFuZGxlIDogVEhhbmRsZTsKKworICBzdHJpY3QgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOworCisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVBpcGVIYW5kbGUgOiBUSGFuZGxlOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYU93bnNIYW5kbGUsIGFFbmFibGVPdmVybGFwcGVkIDogQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUKTsgIG92ZXJsb2FkOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgIG92ZXJyaWRlOworICBlbmQ7CisKKworICAvLy0tLSBQaXBlIFRyYW5zcG9ydHMgLS0tCisKKworICBJUGlwZVRyYW5zcG9ydCA9IGludGVyZmFjZSggSVN0cmVhbVRyYW5zcG9ydCkKKyAgICBbJ3s1RTA1Q0M4NS00MzRGLTQyOEYtQkZCMi04NTZBMTY4QjU1NTh9J10KKyAgZW5kOworCisKKyAgVFBpcGVUcmFuc3BvcnRCYXNlID0gY2xhc3MoIFRTdHJlYW1UcmFuc3BvcnRJbXBsLCBJUGlwZVRyYW5zcG9ydCkKKyAgcHVibGljCisgICAgLy8gSVRyYW5zcG9ydAorICAgIGZ1bmN0aW9uICBHZXRJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBPcGVuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworICBlbmQ7CisKKworICBUTmFtZWRQaXBlVHJhbnNwb3J0Q2xpZW50RW5kSW1wbCA9IGNsYXNzKCBUUGlwZVRyYW5zcG9ydEJhc2UpCisgIHB1YmxpYworICAgIC8vIE5hbWVkIHBpcGUgY29uc3RydWN0b3JzCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBhUGlwZSA6IFRIYW5kbGU7IGFPd25zSGFuZGxlIDogQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQpOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFQaXBlTmFtZSA6IHN0cmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTaGFyZU1vZGU6IERXT1JEID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTZWN1cml0eUF0dHJpYnV0ZXM6IFBTZWN1cml0eUF0dHJpYnV0ZXMgPSBuaWw7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFPcGVuVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfUElQRV9PUEVOX1RJTUVPVVQpOyAgb3ZlcmxvYWQ7CisgIGVuZDsKKworCisgIFROYW1lZFBpcGVUcmFuc3BvcnRTZXJ2ZXJFbmRJbXBsID0gY2xhc3MoIFROYW1lZFBpcGVUcmFuc3BvcnRDbGllbnRFbmRJbXBsKQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZIYW5kbGUgOiBUSGFuZGxlOworICBwdWJsaWMKKyAgICAvLyBJVHJhbnNwb3J0CisgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGFQaXBlIDogVEhhbmRsZTsgYU93bnNIYW5kbGUgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQpOyByZWludHJvZHVjZTsKKyAgZW5kOworCisKKyAgVEFub255bW91c1BpcGVUcmFuc3BvcnRJbXBsID0gY2xhc3MoIFRQaXBlVHJhbnNwb3J0QmFzZSkKKyAgcHVibGljCisgICAgLy8gQW5vbnltb3VzIHBpcGUgY29uc3RydWN0b3IKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgYVBpcGVSZWFkLCBhUGlwZVdyaXRlIDogVEhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgYU93bnNIYW5kbGVzIDogQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQpOyBvdmVybG9hZDsKKyAgZW5kOworCisKKyAgLy8tLS0gU2VydmVyIFRyYW5zcG9ydHMgLS0tCisKKworICBJQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydCA9IGludGVyZmFjZSggSVNlcnZlclRyYW5zcG9ydCkKKyAgICBbJ3s3QUVFNjc5My00N0I5LTRFNDktOTgxQS1DMzlFOTEwOEU5QUR9J10KKyAgICAvLyBTZXJ2ZXIgc2lkZSBhbm9ueW1vdXMgcGlwZSBlbmRzCisgICAgZnVuY3Rpb24gUmVhZEhhbmRsZSA6IFRIYW5kbGU7CisgICAgZnVuY3Rpb24gV3JpdGVIYW5kbGUgOiBUSGFuZGxlOworICAgIC8vIENsaWVudCBzaWRlIGFub255bW91cyBwaXBlIGVuZHMKKyAgICBmdW5jdGlvbiBDbGllbnRBbm9uUmVhZCA6IFRIYW5kbGU7CisgICAgZnVuY3Rpb24gQ2xpZW50QW5vbldyaXRlICA6IFRIYW5kbGU7CisgIGVuZDsKKworCisgIElOYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQgPSBpbnRlcmZhY2UoIElTZXJ2ZXJUcmFuc3BvcnQpCisgICAgWyd7OURGOUVFNDgtRDA2NS00MEFGLThGNjctRDMzMDM3RDNEOTYwfSddCisgICAgZnVuY3Rpb24gSGFuZGxlIDogVEhhbmRsZTsKKyAgZW5kOworCisKKyAgVFBpcGVTZXJ2ZXJUcmFuc3BvcnRCYXNlID0gY2xhc3MoIFRTZXJ2ZXJUcmFuc3BvcnRJbXBsKQorICBzdHJpY3QgcHJvdGVjdGVkCisgICAgRlN0b3BTZXJ2ZXIgOiBURXZlbnQ7CisgICAgcHJvY2VkdXJlIEludGVybmFsQ2xvc2U7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFF1ZXJ5U3RvcFNlcnZlciA6IEJvb2xlYW47CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgTGlzdGVuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworICBlbmQ7CisKKworICBUQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydEltcGwgPSBjbGFzcyggVFBpcGVTZXJ2ZXJUcmFuc3BvcnRCYXNlLCBJQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydCkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGQnVmU2l6ZSAgICAgIDogRFdPUkQ7CisKKyAgICAvLyBTZXJ2ZXIgc2lkZSBhbm9ueW1vdXMgcGlwZSBoYW5kbGVzCisgICAgRlJlYWRIYW5kbGUsCisgICAgRldyaXRlSGFuZGxlIDogVEhhbmRsZTsKKworICAgIC8vQ2xpZW50IHNpZGUgYW5vbnltb3VzIHBpcGUgaGFuZGxlcworICAgIEZDbGllbnRBbm9uUmVhZCwKKyAgICBGQ2xpZW50QW5vbldyaXRlICA6IFRIYW5kbGU7CisKKyAgICBGVGltZU91dDogRFdPUkQ7CisgIHByb3RlY3RlZAorICAgIGZ1bmN0aW9uIEFjY2VwdChjb25zdCBmbkFjY2VwdGluZzogVFByb2MpOiBJVHJhbnNwb3J0OyBvdmVycmlkZTsKKworICAgIGZ1bmN0aW9uIENyZWF0ZUFub25QaXBlIDogQm9vbGVhbjsKKworICAgIC8vIElBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0CisgICAgZnVuY3Rpb24gUmVhZEhhbmRsZSA6IFRIYW5kbGU7CisgICAgZnVuY3Rpb24gV3JpdGVIYW5kbGUgOiBUSGFuZGxlOworICAgIGZ1bmN0aW9uIENsaWVudEFub25SZWFkIDogVEhhbmRsZTsKKyAgICBmdW5jdGlvbiBDbGllbnRBbm9uV3JpdGUgIDogVEhhbmRsZTsKKworICAgIHByb2NlZHVyZSBJbnRlcm5hbENsb3NlOyBvdmVycmlkZTsKKworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoYUJ1ZnNpemUgOiBDYXJkaW5hbCA9IDQwOTY7IGFUaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUKTsKKyAgZW5kOworCisKKyAgVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydEltcGwgPSBjbGFzcyggVFBpcGVTZXJ2ZXJUcmFuc3BvcnRCYXNlLCBJTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0KQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZQaXBlTmFtZSAgICAgOiBzdHJpbmc7CisgICAgRk1heENvbm5zICAgICA6IERXT1JEOworICAgIEZCdWZTaXplICAgICAgOiBEV09SRDsKKyAgICBGVGltZW91dCAgICAgIDogRFdPUkQ7CisgICAgRkhhbmRsZSAgICAgICA6IFRIYW5kbGU7CisgICAgRkNvbm5lY3RlZCAgICA6IEJvb2xlYW47CisKKworICBzdHJpY3QgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gQWNjZXB0KGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYyk6IElUcmFuc3BvcnQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIENyZWF0ZU5hbWVkUGlwZSA6IFRIYW5kbGU7CisgICAgZnVuY3Rpb24gQ3JlYXRlVHJhbnNwb3J0SW5zdGFuY2UgOiBJVHJhbnNwb3J0OworCisgICAgLy8gSU5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydAorICAgIGZ1bmN0aW9uIEhhbmRsZSA6IFRIYW5kbGU7CisgICAgcHJvY2VkdXJlIEludGVybmFsQ2xvc2U7IG92ZXJyaWRlOworCisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggYVBpcGVuYW1lIDogc3RyaW5nOyBhQnVmc2l6ZSA6IENhcmRpbmFsID0gNDA5NjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFNYXhDb25ucyA6IENhcmRpbmFsID0gUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTOworICAgICAgICAgICAgICAgICAgICAgICAgYVRpbWVPdXQgOiBDYXJkaW5hbCA9IElORklOSVRFKTsKKyAgZW5kOworCisKK2ltcGxlbWVudGF0aW9uCisKKworcHJvY2VkdXJlIENsb3NlUGlwZUhhbmRsZSggdmFyIGhQaXBlIDogVEhhbmRsZSk7CitiZWdpbgorICBpZiBoUGlwZSA8PiBJTlZBTElEX0hBTkRMRV9WQUxVRQorICB0aGVuIHRyeQorICAgIENsb3NlSGFuZGxlKCBoUGlwZSk7CisgIGZpbmFsbHkKKyAgICBoUGlwZSA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIER1cGxpY2F0ZVBpcGVIYW5kbGUoIGNvbnN0IGhTb3VyY2UgOiBUSGFuZGxlKSA6IFRIYW5kbGU7CitiZWdpbgorICBpZiBub3QgRHVwbGljYXRlSGFuZGxlKCBHZXRDdXJyZW50UHJvY2VzcywgaFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q3VycmVudFByb2Nlc3MsIEByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIEZBTFNFLCBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdEdXBsaWNhdGVIYW5kbGU6ICcrU3lzRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcikpOworZW5kOworCisKKworeyBUUGlwZVN0cmVhbUJhc2UgfQorCisKK2NvbnN0cnVjdG9yIFRQaXBlU3RyZWFtQmFzZS5DcmVhdGUoIGFFbmFibGVPdmVybGFwcGVkIDogQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0LCBhT3BlblRpbWVPdXQgOiBEV09SRCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBBU1NFUlQoIGFUaW1lb3V0ID4gMCk7ICAvLyBhT3BlblRpbWVvdXQgbWF5IGJlIDAKKyAgRlBpcGUgICAgICAgIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOworICBGVGltZW91dCAgICAgOj0gYVRpbWVPdXQ7CisgIEZPcGVuVGltZU91dCA6PSBhT3BlblRpbWVPdXQ7CisgIEZPdmVybGFwcGVkICA6PSBhRW5hYmxlT3ZlcmxhcHBlZDsKK2VuZDsKKworCitkZXN0cnVjdG9yIFRQaXBlU3RyZWFtQmFzZS5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgQ2xvc2U7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUUGlwZVN0cmVhbUJhc2UuQ2xvc2U7CitiZWdpbgorICBDbG9zZVBpcGVIYW5kbGUoIEZQaXBlKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFBpcGVTdHJlYW1CYXNlLkZsdXNoOworYmVnaW4KKyAgRmx1c2hGaWxlQnVmZmVycyggRlBpcGUpOworZW5kOworCisKK2Z1bmN0aW9uIFRQaXBlU3RyZWFtQmFzZS5Jc09wZW46IEJvb2xlYW47CitiZWdpbgorICByZXN1bHQgOj0gKEZQaXBlIDw+IElOVkFMSURfSEFORExFX1ZBTFVFKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFBpcGVTdHJlYW1CYXNlLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0LCBjb3VudCA6IEludGVnZXIpOworYmVnaW4KKyAgaWYgRk92ZXJsYXBwZWQKKyAgdGhlbiBXcml0ZU92ZXJsYXBwZWQoIHBCdWYsIG9mZnNldCwgY291bnQpCisgIGVsc2UgV3JpdGVEaXJlY3QoIHBCdWYsIG9mZnNldCwgY291bnQpOworZW5kOworCisKK2Z1bmN0aW9uIFRQaXBlU3RyZWFtQmFzZS5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBpZiBGT3ZlcmxhcHBlZAorICB0aGVuIHJlc3VsdCA6PSBSZWFkT3ZlcmxhcHBlZCggcEJ1ZiwgYnVmbGVuLCBvZmZzZXQsIGNvdW50KQorICBlbHNlIHJlc3VsdCA6PSBSZWFkRGlyZWN0KCBwQnVmLCBidWZsZW4sIG9mZnNldCwgY291bnQpOworZW5kOworCisKK3Byb2NlZHVyZSBUUGlwZVN0cmVhbUJhc2UuV3JpdGVEaXJlY3QoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKK3ZhciBjYldyaXR0ZW4sIG5CeXRlcyA6IERXT1JEOworICAgIHBEYXRhIDogUEJ5dGU7CitiZWdpbgorICBpZiBub3QgSXNPcGVuCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYWxsZWQgd3JpdGUgb24gbm9uLW9wZW4gcGlwZScpOworCisgIC8vIGlmIG5lY2Vzc2FyeSwgc2VuZCB0aGUgZGF0YSBpbiBjaHVua3MKKyAgLy8gdGhlcmUncyBhIHN5c3RlbSBsaW1pdCBhcm91bmQgMHgxMDAwMCBieXRlcyB0aGF0IHdlIGhpdCBvdGhlcndpc2UKKyAgLy8gTVNETjogIlBpcGUgd3JpdGUgb3BlcmF0aW9ucyBhY3Jvc3MgYSBuZXR3b3JrIGFyZSBsaW1pdGVkIHRvIDY1LDUzNSBieXRlcyBwZXIgd3JpdGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBwaXBlcywgc2VlIHRoZSBSZW1hcmtzIHNlY3Rpb24uIgorICBuQnl0ZXMgOj0gTWluKCAxNSo0MDk2LCBjb3VudCk7IC8vIDE2IHdvdWxkIGV4Y2VlZCB0aGUgbGltaXQKKyAgcERhdGEgIDo9IHBCdWY7CisgIEluYyggcERhdGEsIG9mZnNldCk7CisgIHdoaWxlIG5CeXRlcyA+IDAgZG8gYmVnaW4KKyAgICBpZiBub3QgV3JpdGVGaWxlKCBGUGlwZSwgcERhdGFeLCBuQnl0ZXMsIGNiV3JpdHRlbiwgbmlsKQorICAgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdXcml0ZSB0byBwaXBlIGZhaWxlZCcpOworCisgICAgSW5jKCBwRGF0YSwgY2JXcml0dGVuKTsKKyAgICBEZWMoIGNvdW50LCBjYldyaXR0ZW4pOworICAgIG5CeXRlcyA6PSBNaW4oIG5CeXRlcywgY291bnQpOworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQaXBlU3RyZWFtQmFzZS5Xcml0ZU92ZXJsYXBwZWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKK3ZhciBjYldyaXR0ZW4sIGR3V2FpdCwgZHdFcnJvciwgbkJ5dGVzIDogRFdPUkQ7CisgICAgb3ZlcmxhcHBlZCA6IElPdmVybGFwcGVkSGVscGVyOworICAgIHBEYXRhIDogUEJ5dGU7CitiZWdpbgorICBpZiBub3QgSXNPcGVuCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYWxsZWQgd3JpdGUgb24gbm9uLW9wZW4gcGlwZScpOworCisgIC8vIGlmIG5lY2Vzc2FyeSwgc2VuZCB0aGUgZGF0YSBpbiBjaHVua3MKKyAgLy8gdGhlcmUncyBhIHN5c3RlbSBsaW1pdCBhcm91bmQgMHgxMDAwMCBieXRlcyB0aGF0IHdlIGhpdCBvdGhlcndpc2UKKyAgLy8gTVNETjogIlBpcGUgd3JpdGUgb3BlcmF0aW9ucyBhY3Jvc3MgYSBuZXR3b3JrIGFyZSBsaW1pdGVkIHRvIDY1LDUzNSBieXRlcyBwZXIgd3JpdGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBwaXBlcywgc2VlIHRoZSBSZW1hcmtzIHNlY3Rpb24uIgorICBuQnl0ZXMgOj0gTWluKCAxNSo0MDk2LCBjb3VudCk7IC8vIDE2IHdvdWxkIGV4Y2VlZCB0aGUgbGltaXQKKyAgcERhdGEgIDo9IHBCdWY7CisgIEluYyggcERhdGEsIG9mZnNldCk7CisgIHdoaWxlIG5CeXRlcyA+IDAgZG8gYmVnaW4KKyAgICBvdmVybGFwcGVkIDo9IFRPdmVybGFwcGVkSGVscGVySW1wbC5DcmVhdGU7CisgICAgaWYgbm90IFdyaXRlRmlsZSggRlBpcGUsIHBEYXRhXiwgbkJ5dGVzLCBjYldyaXR0ZW4sIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZFB0cikKKyAgICB0aGVuIGJlZ2luCisgICAgICBkd0Vycm9yIDo9IEdldExhc3RFcnJvcjsKKyAgICAgIGNhc2UgZHdFcnJvciBvZgorICAgICAgICBFUlJPUl9JT19QRU5ESU5HIDogYmVnaW4KKyAgICAgICAgICBkd1dhaXQgOj0gb3ZlcmxhcHBlZC5XYWl0Rm9yKEZUaW1lb3V0KTsKKworICAgICAgICAgIGlmIChkd1dhaXQgPSBXQUlUX1RJTUVPVVQpIHRoZW4gYmVnaW4KKyAgICAgICAgICAgIENhbmNlbElvKCBGUGlwZSk7ICAvLyBwcmV2ZW50cyBwb3NzaWJsZSBBViBvbiBpbnZhbGlkIG92ZXJsYXBwZWQgcHRyCisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCdQaXBlIHdyaXRlIHRpbWVkIG91dCcpOworICAgICAgICAgIGVuZDsKKworICAgICAgICAgIGlmIChkd1dhaXQgPD4gV0FJVF9PQkpFQ1RfMCkKKyAgICAgICAgICBvciBub3QgR2V0T3ZlcmxhcHBlZFJlc3VsdCggRlBpcGUsIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZCwgY2JXcml0dGVuLCBUUlVFKQorICAgICAgICAgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCdQaXBlIHdyaXRlIGVycm9yJyk7CisgICAgICAgIGVuZDsKKworICAgICAgZWxzZQorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoU3lzRXJyb3JNZXNzYWdlKGR3RXJyb3IpKTsKKyAgICAgIGVuZDsKKyAgICBlbmQ7CisKKyAgICBBU1NFUlQoIERXT1JEKG5CeXRlcykgPSBjYldyaXR0ZW4pOworCisgICAgSW5jKCBwRGF0YSwgY2JXcml0dGVuKTsKKyAgICBEZWMoIGNvdW50LCBjYldyaXR0ZW4pOworICAgIG5CeXRlcyA6PSBNaW4oIG5CeXRlcywgY291bnQpOworICBlbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVFBpcGVTdHJlYW1CYXNlLlJlYWREaXJlY3QoICAgICBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Cit2YXIgY2JSZWFkLCBkd0VyciwgblJlbWFpbmluZyAgOiBEV09SRDsKKyAgICBieXRlcywgcmV0cmllcyAgOiBMb25nSW50OworICAgIGJPayAgICAgOiBCb29sZWFuOworICAgIHBEYXRhICAgOiBQQnl0ZTsKK2NvbnN0IElOVEVSVkFMID0gMTA7ICAvLyBtcworYmVnaW4KKyAgaWYgbm90IElzT3BlbgorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2FsbGVkIHJlYWQgb24gbm9uLW9wZW4gcGlwZScpOworCisgIC8vIE1TRE46IEhhbmRsZSBjYW4gYmUgYSBoYW5kbGUgdG8gYSBuYW1lZCBwaXBlIGluc3RhbmNlLAorICAvLyBvciBpdCBjYW4gYmUgYSBoYW5kbGUgdG8gdGhlIHJlYWQgZW5kIG9mIGFuIGFub255bW91cyBwaXBlLAorICAvLyBUaGUgaGFuZGxlIG11c3QgaGF2ZSBHRU5FUklDX1JFQUQgYWNjZXNzIHRvIHRoZSBwaXBlLgorICBpZiBGVGltZU91dCA8PiBJTkZJTklURSB0aGVuIGJlZ2luCisgICAgcmV0cmllcyA6PSBNYXgoIDEsIFJvdW5kKCAxLjAgKiBGVGltZU91dCAvIElOVEVSVkFMKSk7CisgICAgd2hpbGUgVFJVRSBkbyBiZWdpbgorICAgICAgaWYgbm90IFBlZWtOYW1lZFBpcGUoIEZQaXBlLCBuaWwsIDAsIG5pbCwgQGJ5dGVzLCBuaWwpIHRoZW4gYmVnaW4KKyAgICAgICAgZHdFcnIgOj0gR2V0TGFzdEVycm9yOworICAgICAgICBpZiAoZHdFcnIgPSBFUlJPUl9JTlZBTElEX0hBTkRMRSkKKyAgICAgICAgb3IgKGR3RXJyID0gRVJST1JfQlJPS0VOX1BJUEUpCisgICAgICAgIG9yIChkd0VyciA9IEVSUk9SX1BJUEVfTk9UX0NPTk5FQ1RFRCkKKyAgICAgICAgdGhlbiBiZWdpbgorICAgICAgICAgIHJlc3VsdCA6PSAwOyAgLy8gb3RoZXIgc2lkZSBjbG9zZWQgdGhlIHBpcGUKKyAgICAgICAgICBFeGl0OworICAgICAgICBlbmQ7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgYnl0ZXMgPiAwIHRoZW4gYmVnaW4KKyAgICAgICAgQnJlYWs7ICAvLyB0aGVyZSBhcmUgZGF0YQorICAgICAgZW5kOworCisgICAgICBEZWMoIHJldHJpZXMpOworICAgICAgaWYgcmV0cmllcyA+IDAKKyAgICAgIHRoZW4gU2xlZXAoIElOVEVSVkFMKQorICAgICAgZWxzZSByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCdQaXBlIHJlYWQgdGltZWQgb3V0Jyk7CisgICAgZW5kOworICBlbmQ7CisKKyAgcmVzdWx0IDo9IDA7CisgIG5SZW1haW5pbmcgOj0gY291bnQ7CisgIHBEYXRhIDo9IHBCdWY7CisgIEluYyggcERhdGEsIG9mZnNldCk7CisgIHdoaWxlIG5SZW1haW5pbmcgPiAwIGRvIGJlZ2luCisgICAgLy8gcmVhZCB0aGUgZGF0YSAob3IgYmxvY2sgSU5GSU5JVEUtbHkpCisgICAgYk9rIDo9IFJlYWRGaWxlKCBGUGlwZSwgcERhdGFeLCBuUmVtYWluaW5nLCBjYlJlYWQsIG5pbCk7CisgICAgaWYgKG5vdCBiT2spIGFuZCAoR2V0TGFzdEVycm9yKCkgPD4gRVJST1JfTU9SRV9EQVRBKQorICAgIHRoZW4gQnJlYWs7IC8vIE5vIG1vcmUgZGF0YSwgcG9zc2libHkgYmVjYXVzZSBjbGllbnQgZGlzY29ubmVjdGVkLgorCisgICAgRGVjKCBuUmVtYWluaW5nLCBjYlJlYWQpOworICAgIEluYyggcERhdGEsIGNiUmVhZCk7CisgICAgSW5jKCByZXN1bHQsIGNiUmVhZCk7CisgIGVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUUGlwZVN0cmVhbUJhc2UuUmVhZE92ZXJsYXBwZWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKK3ZhciBjYlJlYWQsIGR3V2FpdCwgZHdFcnJvciwgblJlbWFpbmluZyA6IERXT1JEOworICAgIGJPayAgICAgOiBCb29sZWFuOworICAgIG92ZXJsYXBwZWQgOiBJT3ZlcmxhcHBlZEhlbHBlcjsKKyAgICBwRGF0YSAgIDogUEJ5dGU7CitiZWdpbgorICBpZiBub3QgSXNPcGVuCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYWxsZWQgcmVhZCBvbiBub24tb3BlbiBwaXBlJyk7CisKKyAgcmVzdWx0IDo9IDA7CisgIG5SZW1haW5pbmcgOj0gY291bnQ7CisgIHBEYXRhIDo9IHBCdWY7CisgIEluYyggcERhdGEsIG9mZnNldCk7CisgIHdoaWxlIG5SZW1haW5pbmcgPiAwIGRvIGJlZ2luCisgICAgb3ZlcmxhcHBlZCA6PSBUT3ZlcmxhcHBlZEhlbHBlckltcGwuQ3JlYXRlOworCisgICAgIC8vIHJlYWQgdGhlIGRhdGEKKyAgICBiT2sgOj0gUmVhZEZpbGUoIEZQaXBlLCBwRGF0YV4sIG5SZW1haW5pbmcsIGNiUmVhZCwgb3ZlcmxhcHBlZC5PdmVybGFwcGVkUHRyKTsKKyAgICBpZiBub3QgYk9rIHRoZW4gYmVnaW4KKyAgICAgIGR3RXJyb3IgOj0gR2V0TGFzdEVycm9yOworICAgICAgY2FzZSBkd0Vycm9yIG9mCisgICAgICAgIEVSUk9SX0lPX1BFTkRJTkcgOiBiZWdpbgorICAgICAgICAgIGR3V2FpdCA6PSBvdmVybGFwcGVkLldhaXRGb3IoRlRpbWVvdXQpOworCisgICAgICAgICAgaWYgKGR3V2FpdCA9IFdBSVRfVElNRU9VVCkgdGhlbiBiZWdpbgorICAgICAgICAgICAgQ2FuY2VsSW8oIEZQaXBlKTsgIC8vIHByZXZlbnRzIHBvc3NpYmxlIEFWIG9uIGludmFsaWQgb3ZlcmxhcHBlZCBwdHIKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoJ1BpcGUgcmVhZCB0aW1lZCBvdXQnKTsKKyAgICAgICAgICBlbmQ7CisKKyAgICAgICAgICBpZiAoZHdXYWl0IDw+IFdBSVRfT0JKRUNUXzApCisgICAgICAgICAgb3Igbm90IEdldE92ZXJsYXBwZWRSZXN1bHQoIEZQaXBlLCBvdmVybGFwcGVkLk92ZXJsYXBwZWQsIGNiUmVhZCwgVFJVRSkKKyAgICAgICAgICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgnUGlwZSByZWFkIGVycm9yJyk7CisgICAgICAgIGVuZDsKKworICAgICAgZWxzZQorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoU3lzRXJyb3JNZXNzYWdlKGR3RXJyb3IpKTsKKyAgICAgIGVuZDsKKyAgICBlbmQ7CisKKyAgICBBU1NFUlQoIGNiUmVhZCA+IDApOyAgLy8gc2VlIFRUcmFuc3BvcnRJbXBsLlJlYWRBbGwoKQorICAgIEFTU0VSVCggY2JSZWFkIDw9IERXT1JEKG5SZW1haW5pbmcpKTsKKyAgICBEZWMoIG5SZW1haW5pbmcsIGNiUmVhZCk7CisgICAgSW5jKCBwRGF0YSwgY2JSZWFkKTsKKyAgICBJbmMoIHJlc3VsdCwgY2JSZWFkKTsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRQaXBlU3RyZWFtQmFzZS5Ub0FycmF5OiBUQnl0ZXM7Cit2YXIgYnl0ZXMgOiBMb25nSW50OworYmVnaW4KKyAgU2V0TGVuZ3RoKCByZXN1bHQsIDApOworICBieXRlcyA6PSAwOworCisgIGlmICBJc09wZW4KKyAgYW5kIFBlZWtOYW1lZFBpcGUoIEZQaXBlLCBuaWwsIDAsIG5pbCwgQGJ5dGVzLCBuaWwpCisgIGFuZCAoYnl0ZXMgPiAwKQorICB0aGVuIGJlZ2luCisgICAgU2V0TGVuZ3RoKCByZXN1bHQsIGJ5dGVzKTsKKyAgICBSZWFkKCByZXN1bHQsIDAsIGJ5dGVzKTsKKyAgZW5kOworZW5kOworCisKK3sgVE5hbWVkUGlwZVN0cmVhbUltcGwgfQorCisKK2NvbnN0cnVjdG9yIFROYW1lZFBpcGVTdHJlYW1JbXBsLkNyZWF0ZSggY29uc3QgYVBpcGVOYW1lIDogc3RyaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhRW5hYmxlT3ZlcmxhcHBlZCA6IEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTaGFyZU1vZGU6IERXT1JEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhU2VjdXJpdHlBdHRyaWJ1dGVzOiBQU2VjdXJpdHlBdHRyaWJ1dGVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCwgYU9wZW5UaW1lT3V0IDogRFdPUkQpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZSggYUVuYWJsZU92ZXJsYXBwZWQsIGFUaW1lb3V0LCBhT3BlblRpbWVPdXQpOworCisgIEZQaXBlTmFtZSAgICAgICAgOj0gYVBpcGVOYW1lOworICBGU2hhcmVNb2RlICAgICAgIDo9IGFTaGFyZU1vZGU7CisgIEZTZWN1cml0eUF0dHJpYnMgOj0gYVNlY3VyaXR5QXR0cmlidXRlczsKKworICBpZiBDb3B5KEZQaXBlTmFtZSwxLDIpIDw+ICdcXCcKKyAgdGhlbiBGUGlwZU5hbWUgOj0gJ1xcLlxwaXBlXCcgKyBGUGlwZU5hbWU7ICAvLyBhc3N1bWUgbG9jYWxob3N0CitlbmQ7CisKKworcHJvY2VkdXJlIFROYW1lZFBpcGVTdHJlYW1JbXBsLk9wZW47Cit2YXIgaFBpcGUgICAgOiBUSGFuZGxlOworICAgIHJldHJpZXMsIHRpbWVvdXQsIGR3RXJyIDogRFdPUkQ7Citjb25zdCBJTlRFUlZBTCA9IDEwOyAvLyBtcworYmVnaW4KKyAgaWYgSXNPcGVuIHRoZW4gRXhpdDsKKworICByZXRyaWVzIDo9IE1heCggMSwgUm91bmQoIDEuMCAqIEZPcGVuVGltZU91dCAvIElOVEVSVkFMKSk7CisgIHRpbWVvdXQgOj0gRk9wZW5UaW1lT3V0OworCisgIC8vIGlmIHRoZSBzZXJ2ZXIgaGFzbid0IGdvdHRlbiB0byB0aGUgcG9pbnQgd2hlcmUgdGhlIHBpcGUgaGFzIGJlZW4gY3JlYXRlZCwgYXQgbGVhc3Qgd2FpdCB0aGUgdGltZW91dAorICAvLyBBY2NvcmRpbmcgdG8gTVNETiwgaWYgbm8gaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWZpZWQgbmFtZWQgcGlwZSBleGlzdCwgdGhlIFdhaXROYW1lZFBpcGUgZnVuY3Rpb24KKyAgLy8gcmV0dXJucyBJTU1FRElBVEVMWSwgcmVnYXJkbGVzcyBvZiB0aGUgdGltZS1vdXQgdmFsdWUuCisgIC8vIEFsd2F5cyB1c2UgSU5URVJWQUwsIHNpbmNlIFdhaXROYW1lZFBpcGUoMCkgZGVmYXVsdHMgdG8gc29tZSBvdGhlciB2YWx1ZQorICB3aGlsZSBub3QgV2FpdE5hbWVkUGlwZSggUENoYXIoRlBpcGVOYW1lKSwgSU5URVJWQUwpIGRvIGJlZ2luCisgICAgZHdFcnIgOj0gR2V0TGFzdEVycm9yOworICAgIGlmIGR3RXJyIDw+IEVSUk9SX0ZJTEVfTk9UX0ZPVU5ECisgICAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1VuYWJsZSB0byBvcGVuIHBpcGUsICcrU3lzRXJyb3JNZXNzYWdlKGR3RXJyKSk7CisKKyAgICBpZiB0aW1lb3V0IDw+IElORklOSVRFIHRoZW4gYmVnaW4KKyAgICAgIGlmIChyZXRyaWVzID4gMCkKKyAgICAgIHRoZW4gRGVjKHJldHJpZXMpCisgICAgICBlbHNlIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnVW5hYmxlIHRvIG9wZW4gcGlwZSwgdGltZWQgb3V0Jyk7CisgICAgZW5kOworCisgICAgU2xlZXAoSU5URVJWQUwpCisgIGVuZDsKKworICAvLyBvcGVuIHRoYXQgdGhpbmd5CisgIGhQaXBlIDo9IENyZWF0ZUZpbGUoIFBDaGFyKCBGUGlwZU5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICBHRU5FUklDX1JFQUQgb3IgR0VORVJJQ19XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlNoYXJlTW9kZSwgICAgICAgIC8vIHNoYXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgRlNlY3VyaXR5QXR0cmlicywgIC8vIHNlY3VyaXR5IGF0dHJpYnV0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgT1BFTl9FWElTVElORywgICAgIC8vIG9wZW5zIGV4aXN0aW5nIHBpcGUKKyAgICAgICAgICAgICAgICAgICAgICAgRklMRV9GTEFHX09WRVJMQVBQRUQgb3IgRklMRV9GTEFHX1dSSVRFX1RIUk9VR0gsIC8vIGFzeW5jK2Zhc3QsIHBsZWFzZQorICAgICAgICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgLy8gbm8gdGVtcGxhdGUgZmlsZQorCisgIGlmIGhQaXBlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUUKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1VuYWJsZSB0byBvcGVuIHBpcGUsICcrU3lzRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcikpOworCisgIC8vIGV2ZXJ5dGhpbmcgZmluZQorICBGUGlwZSA6PSBoUGlwZTsKK2VuZDsKKworCit7IFRIYW5kbGVQaXBlU3RyZWFtSW1wbCB9CisKKworY29uc3RydWN0b3IgVEhhbmRsZVBpcGVTdHJlYW1JbXBsLkNyZWF0ZSggY29uc3QgYVBpcGVIYW5kbGUgOiBUSGFuZGxlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYU93bnNIYW5kbGUsIGFFbmFibGVPdmVybGFwcGVkIDogQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZSggYUVuYWJsZU92ZXJsYXBwZWQsIGFUaW1lT3V0KTsKKworICBpZiBhT3duc0hhbmRsZQorICB0aGVuIEZTcmNIYW5kbGUgOj0gYVBpcGVIYW5kbGUKKyAgZWxzZSBGU3JjSGFuZGxlIDo9IER1cGxpY2F0ZVBpcGVIYW5kbGUoIGFQaXBlSGFuZGxlKTsKKworICBPcGVuOworZW5kOworCisKK2Rlc3RydWN0b3IgVEhhbmRsZVBpcGVTdHJlYW1JbXBsLkRlc3Ryb3k7CitiZWdpbgorICB0cnkKKyAgICBDbG9zZVBpcGVIYW5kbGUoIEZTcmNIYW5kbGUpOworICBmaW5hbGx5CisgICAgaW5oZXJpdGVkIERlc3Ryb3k7CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVEhhbmRsZVBpcGVTdHJlYW1JbXBsLk9wZW47CitiZWdpbgorICBpZiBub3QgSXNPcGVuCisgIHRoZW4gRlBpcGUgOj0gRHVwbGljYXRlUGlwZUhhbmRsZSggRlNyY0hhbmRsZSk7CitlbmQ7CisKKworeyBUUGlwZVRyYW5zcG9ydEJhc2UgfQorCisKK2Z1bmN0aW9uIFRQaXBlVHJhbnNwb3J0QmFzZS5HZXRJc09wZW46IEJvb2xlYW47CitiZWdpbgorICByZXN1bHQgOj0gKEZJbnB1dFN0cmVhbSA8PiBuaWwpICBhbmQgKEZJbnB1dFN0cmVhbS5Jc09wZW4pCisgICAgICAgIGFuZCAoRk91dHB1dFN0cmVhbSA8PiBuaWwpIGFuZCAoRk91dHB1dFN0cmVhbS5Jc09wZW4pOworZW5kOworCisKK3Byb2NlZHVyZSBUUGlwZVRyYW5zcG9ydEJhc2UuT3BlbjsKK2JlZ2luCisgIEZJbnB1dFN0cmVhbS5PcGVuOworICBGT3V0cHV0U3RyZWFtLk9wZW47CitlbmQ7CisKKworcHJvY2VkdXJlIFRQaXBlVHJhbnNwb3J0QmFzZS5DbG9zZTsKK2JlZ2luCisgIEZJbnB1dFN0cmVhbS5DbG9zZTsKKyAgRk91dHB1dFN0cmVhbS5DbG9zZTsKK2VuZDsKKworCit7IFROYW1lZFBpcGVUcmFuc3BvcnRDbGllbnRFbmRJbXBsIH0KKworCitjb25zdHJ1Y3RvciBUTmFtZWRQaXBlVHJhbnNwb3J0Q2xpZW50RW5kSW1wbC5DcmVhdGUoIGNvbnN0IGFQaXBlTmFtZSA6IHN0cmluZzsgY29uc3QgYVNoYXJlTW9kZTogRFdPUkQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTZWN1cml0eUF0dHJpYnV0ZXM6IFBTZWN1cml0eUF0dHJpYnV0ZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0LCBhT3BlblRpbWVPdXQgOiBEV09SRCk7CisvLyBOYW1lZCBwaXBlIGNvbnN0cnVjdG9yCitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKCBuaWwsIG5pbCk7CisgIEZJbnB1dFN0cmVhbSAgOj0gVE5hbWVkUGlwZVN0cmVhbUltcGwuQ3JlYXRlKCBhUGlwZU5hbWUsIFRSVUUsIGFTaGFyZU1vZGUsIGFTZWN1cml0eUF0dHJpYnV0ZXMsIGFUaW1lT3V0LCBhT3BlblRpbWVPdXQpOworICBGT3V0cHV0U3RyZWFtIDo9IEZJbnB1dFN0cmVhbTsgIC8vIHRydWUgZm9yIG5hbWVkIHBpcGVzCitlbmQ7CisKKworY29uc3RydWN0b3IgVE5hbWVkUGlwZVRyYW5zcG9ydENsaWVudEVuZEltcGwuQ3JlYXRlKCBhUGlwZSA6IFRIYW5kbGU7IGFPd25zSGFuZGxlIDogQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCk7CisvLyBOYW1lZCBwaXBlIGNvbnN0cnVjdG9yCitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKCBuaWwsIG5pbCk7CisgIEZJbnB1dFN0cmVhbSAgOj0gVEhhbmRsZVBpcGVTdHJlYW1JbXBsLkNyZWF0ZSggYVBpcGUsIFRSVUUsIGFPd25zSGFuZGxlLCBhVGltZU91dCk7CisgIEZPdXRwdXRTdHJlYW0gOj0gRklucHV0U3RyZWFtOyAgLy8gdHJ1ZSBmb3IgbmFtZWQgcGlwZXMKK2VuZDsKKworCit7IFROYW1lZFBpcGVUcmFuc3BvcnRTZXJ2ZXJFbmRJbXBsIH0KKworCitjb25zdHJ1Y3RvciBUTmFtZWRQaXBlVHJhbnNwb3J0U2VydmVyRW5kSW1wbC5DcmVhdGUoIGFQaXBlIDogVEhhbmRsZTsgYU93bnNIYW5kbGUgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEKTsKKy8vIE5hbWVkIHBpcGUgY29uc3RydWN0b3IKK2JlZ2luCisgIEZIYW5kbGUgOj0gRHVwbGljYXRlUGlwZUhhbmRsZSggYVBpcGUpOworICBpbmhlcml0ZWQgQ3JlYXRlKCBhUGlwZSwgYU93bnNIYW5kbGUsIGFUaW1lT3V0KTsKK2VuZDsKKworCitwcm9jZWR1cmUgVE5hbWVkUGlwZVRyYW5zcG9ydFNlcnZlckVuZEltcGwuQ2xvc2U7CitiZWdpbgorICBGbHVzaEZpbGVCdWZmZXJzKCBGSGFuZGxlKTsKKyAgRGlzY29ubmVjdE5hbWVkUGlwZSggRkhhbmRsZSk7ICAvLyBmb3JjZSBjbGllbnQgb2ZmIHRoZSBwaXBlCisgIENsb3NlUGlwZUhhbmRsZSggRkhhbmRsZSk7CisKKyAgaW5oZXJpdGVkIENsb3NlOworZW5kOworCisKK3sgVEFub255bW91c1BpcGVUcmFuc3BvcnRJbXBsIH0KKworCitjb25zdHJ1Y3RvciBUQW5vbnltb3VzUGlwZVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBjb25zdCBhUGlwZVJlYWQsIGFQaXBlV3JpdGUgOiBUSGFuZGxlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYU93bnNIYW5kbGVzIDogQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUKTsKKy8vIEFub255bW91cyBwaXBlIGNvbnN0cnVjdG9yCitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKCBuaWwsIG5pbCk7CisgIC8vIG92ZXJsYXBwZWQgaXMgbm90IHN1cHBvcnRlZCB3aXRoIEFub25QaXBlcywgc2VlIE1TRE4KKyAgRklucHV0U3RyZWFtICA6PSBUSGFuZGxlUGlwZVN0cmVhbUltcGwuQ3JlYXRlKCBhUGlwZVJlYWQsIGFPd25zSGFuZGxlcywgRkFMU0UsIGFUaW1lT3V0KTsKKyAgRk91dHB1dFN0cmVhbSA6PSBUSGFuZGxlUGlwZVN0cmVhbUltcGwuQ3JlYXRlKCBhUGlwZVdyaXRlLCBhT3duc0hhbmRsZXMsIEZBTFNFLCBhVGltZU91dCk7CitlbmQ7CisKKworeyBUUGlwZVNlcnZlclRyYW5zcG9ydEJhc2UgfQorCisKK2NvbnN0cnVjdG9yIFRQaXBlU2VydmVyVHJhbnNwb3J0QmFzZS5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU3RvcFNlcnZlciA6PSBURXZlbnQuQ3JlYXRlKG5pbCxUUlVFLEZBTFNFLCcnKTsgIC8vIG1hbnVhbCByZXNldAorZW5kOworCisKK2Rlc3RydWN0b3IgVFBpcGVTZXJ2ZXJUcmFuc3BvcnRCYXNlLkRlc3Ryb3k7CitiZWdpbgorICB0cnkKKyAgICBGcmVlQW5kTmlsKCBGU3RvcFNlcnZlcik7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRQaXBlU2VydmVyVHJhbnNwb3J0QmFzZS5RdWVyeVN0b3BTZXJ2ZXIgOiBCb29sZWFuOworYmVnaW4KKyAgcmVzdWx0IDo9IChGU3RvcFNlcnZlciA9IG5pbCkKKyAgICAgICAgIG9yIChGU3RvcFNlcnZlci5XYWl0Rm9yKDApIDw+IHdyVGltZW91dCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQaXBlU2VydmVyVHJhbnNwb3J0QmFzZS5MaXN0ZW47CitiZWdpbgorICBGU3RvcFNlcnZlci5SZXNldEV2ZW50OworZW5kOworCisKK3Byb2NlZHVyZSBUUGlwZVNlcnZlclRyYW5zcG9ydEJhc2UuQ2xvc2U7CitiZWdpbgorICBGU3RvcFNlcnZlci5TZXRFdmVudDsKKyAgSW50ZXJuYWxDbG9zZTsKK2VuZDsKKworCit7IFRBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0SW1wbCB9CisKKworY29uc3RydWN0b3IgVEFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkNyZWF0ZShhQnVmc2l6ZSA6IENhcmRpbmFsOyBhVGltZU91dCA6IERXT1JEKTsKKy8vIEFub255bW91cyBwaXBlIENUT1IKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZCdWZzaXplICA6PSBhQnVmU2l6ZTsKKyAgRlJlYWRIYW5kbGUgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgIEZXcml0ZUhhbmRsZSA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgRkNsaWVudEFub25SZWFkIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOworICBGQ2xpZW50QW5vbldyaXRlIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOworICBGVGltZU91dCA6PSBhVGltZU91dDsKKworICAvLyBUaGUgYW5vbnltb3VzIHBpcGUgbmVlZHMgdG8gYmUgY3JlYXRlZCBmaXJzdCBzbyB0aGF0IHRoZSBzZXJ2ZXIgY2FuCisgIC8vIHBhc3MgdGhlIGhhbmRsZXMgb24gdG8gdGhlIGNsaWVudCBiZWZvcmUgdGhlIHNlcnZlIChhY2NlcHRJbXBsKQorICAvLyBibG9ja2luZyBjYWxsLgorICBpZiBub3QgQ3JlYXRlQW5vblBpcGUKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoQ2xhc3NOYW1lKycuQ3JlYXRlKCkgZmFpbGVkJyk7CitlbmQ7CisKKworZnVuY3Rpb24gVEFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkFjY2VwdChjb25zdCBmbkFjY2VwdGluZzogVFByb2MpOiBJVHJhbnNwb3J0OwordmFyIGJ1ZiAgICA6IEJ5dGU7CisgICAgYnIgICAgIDogRFdPUkQ7CitiZWdpbgorICBpZiBBc3NpZ25lZChmbkFjY2VwdGluZykKKyAgdGhlbiBmbkFjY2VwdGluZygpOworCisgIC8vIFRoaXMgMC1ieXRlIHJlYWQgc2VydmVzIG1lcmVseSBhcyBhIGJsb2NraW5nIGNhbGwuCisgIGlmIG5vdCBSZWFkRmlsZSggRlJlYWRIYW5kbGUsIGJ1ZiwgMCwgYnIsIG5pbCkKKyAgYW5kIChHZXRMYXN0RXJyb3IoKSA8PiBFUlJPUl9NT1JFX0RBVEEpCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdUU2VydmVyUGlwZSB1bmFibGUgdG8gaW5pdGlhdGUgcGlwZSBjb21tdW5pY2F0aW9uJyk7CisKKyAgLy8gY3JlYXRlIHRoZSB0cmFuc3BvcnQgaW1wbAorICByZXN1bHQgOj0gVEFub255bW91c1BpcGVUcmFuc3BvcnRJbXBsLkNyZWF0ZSggRlJlYWRIYW5kbGUsIEZXcml0ZUhhbmRsZSwgRkFMU0UsIEZUaW1lT3V0KTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkludGVybmFsQ2xvc2U7CitiZWdpbgorICBDbG9zZVBpcGVIYW5kbGUoIEZSZWFkSGFuZGxlKTsKKyAgQ2xvc2VQaXBlSGFuZGxlKCBGV3JpdGVIYW5kbGUpOworICBDbG9zZVBpcGVIYW5kbGUoIEZDbGllbnRBbm9uUmVhZCk7CisgIENsb3NlUGlwZUhhbmRsZSggRkNsaWVudEFub25Xcml0ZSk7CitlbmQ7CisKKworZnVuY3Rpb24gVEFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLlJlYWRIYW5kbGUgOiBUSGFuZGxlOworYmVnaW4KKyAgcmVzdWx0IDo9IEZSZWFkSGFuZGxlOworZW5kOworCisKK2Z1bmN0aW9uIFRBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5Xcml0ZUhhbmRsZSA6IFRIYW5kbGU7CitiZWdpbgorICByZXN1bHQgOj0gRldyaXRlSGFuZGxlOworZW5kOworCisKK2Z1bmN0aW9uIFRBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5DbGllbnRBbm9uUmVhZCA6IFRIYW5kbGU7CitiZWdpbgorICByZXN1bHQgOj0gRkNsaWVudEFub25SZWFkOworZW5kOworCisKK2Z1bmN0aW9uIFRBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5DbGllbnRBbm9uV3JpdGUgIDogVEhhbmRsZTsKK2JlZ2luCisgIHJlc3VsdCA6PSBGQ2xpZW50QW5vbldyaXRlOworZW5kOworCisKK2Z1bmN0aW9uIFRBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5DcmVhdGVBbm9uUGlwZSA6IEJvb2xlYW47Cit2YXIgc2QgICAgICAgICAgIDogUFNFQ1VSSVRZX0RFU0NSSVBUT1I7CisgICAgc2EgICAgICAgICAgIDogU0VDVVJJVFlfQVRUUklCVVRFUzsgLy9UU2VjdXJpdHlBdHRyaWJ1dGVzOworICAgIGhDQVIsIGhQaXBlVywgaENBVywgaFBpcGUgOiBUSGFuZGxlOworYmVnaW4KKyAgc2QgOj0gUFNFQ1VSSVRZX0RFU0NSSVBUT1IoIExvY2FsQWxsb2MoIExQVFIsU0VDVVJJVFlfREVTQ1JJUFRPUl9NSU5fTEVOR1RIKSk7CisgIHRyeQorICAgIFdpbjMyQ2hlY2soIEluaXRpYWxpemVTZWN1cml0eURlc2NyaXB0b3IoIHNkLCBTRUNVUklUWV9ERVNDUklQVE9SX1JFVklTSU9OKSk7CisgICAgV2luMzJDaGVjayggU2V0U2VjdXJpdHlEZXNjcmlwdG9yRGFjbCggc2QsIFRSVUUsIG5pbCwgRkFMU0UpKTsKKworICAgIHNhLm5MZW5ndGggOj0gc2l6ZW9mKCBzYSk7CisgICAgc2EubHBTZWN1cml0eURlc2NyaXB0b3IgOj0gc2Q7CisgICAgc2EuYkluaGVyaXRIYW5kbGUgICAgICAgOj0gVFJVRTsgLy9hbGxvdyBwYXNzaW5nIGhhbmRsZSB0byBjaGlsZAorCisgICAgUmVzdWx0IDo9IENyZWF0ZVBpcGUoIGhDQVIsIGhQaXBlVywgQHNhLCBGQnVmU2l6ZSk7IC8vY3JlYXRlIHN0ZGluIHBpcGUKKyAgICBpZiBub3QgUmVzdWx0IHRoZW4gYmVnaW4gICAvL2NyZWF0ZSBzdGRpbiBwaXBlCisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1RTZXJ2ZXJQaXBlIENyZWF0ZVBpcGUgKGFub24pIGZhaWxlZCwgJytTeXNFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKSk7CisgICAgICBFeGl0OworICAgIGVuZDsKKworICAgIFJlc3VsdCA6PSBDcmVhdGVQaXBlKCBoUGlwZSwgaENBVywgQHNhLCBGQnVmU2l6ZSk7IC8vY3JlYXRlIHN0ZG91dCBwaXBlCisgICAgaWYgbm90IFJlc3VsdCB0aGVuIGJlZ2luICAvL2NyZWF0ZSBzdGRvdXQgcGlwZQorICAgICAgQ2xvc2VIYW5kbGUoIGhDQVIpOworICAgICAgQ2xvc2VIYW5kbGUoIGhQaXBlVyk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1RTZXJ2ZXJQaXBlIENyZWF0ZVBpcGUgKGFub24pIGZhaWxlZCwgJytTeXNFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKSk7CisgICAgICBFeGl0OworICAgIGVuZDsKKworICAgIEZDbGllbnRBbm9uUmVhZCAgOj0gaENBUjsKKyAgICBGQ2xpZW50QW5vbldyaXRlIDo9IGhDQVc7CisgICAgRlJlYWRIYW5kbGUgICAgICA6PSBoUGlwZTsKKyAgICBGV3JpdGVIYW5kbGUgICAgIDo9IGhQaXBlVzsKKyAgZmluYWxseQorICAgIGlmIHNkIDw+IG5pbCB0aGVuIExvY2FsRnJlZSggQ2FyZGluYWwoc2QpKTsKKyAgZW5kOworZW5kOworCisKK3sgVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydEltcGwgfQorCisKK2NvbnN0cnVjdG9yIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkNyZWF0ZSggYVBpcGVuYW1lIDogc3RyaW5nOyBhQnVmc2l6ZSwgYU1heENvbm5zLCBhVGltZU91dCA6IENhcmRpbmFsKTsKKy8vIE5hbWVkIFBpcGUgQ1RPUgorYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgQVNTRVJUKCBhVGltZW91dCA+IDApOworICBGUGlwZU5hbWUgIDo9IGFQaXBlbmFtZTsKKyAgRkJ1ZnNpemUgICA6PSBhQnVmU2l6ZTsKKyAgRk1heENvbm5zICA6PSBNYXgoIDEsIE1pbiggUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTLCBhTWF4Q29ubnMpKTsKKyAgRkhhbmRsZSAgICA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgRlRpbWVvdXQgICA6PSBhVGltZU91dDsKKyAgRkNvbm5lY3RlZCA6PSBGQUxTRTsKKworICBpZiBDb3B5KEZQaXBlTmFtZSwxLDIpIDw+ICdcXCcKKyAgdGhlbiBGUGlwZU5hbWUgOj0gJ1xcLlxwaXBlXCcgKyBGUGlwZU5hbWU7ICAvLyBhc3N1bWUgbG9jYWxob3N0CitlbmQ7CisKKworZnVuY3Rpb24gVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuQWNjZXB0KGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYyk6IElUcmFuc3BvcnQ7Cit2YXIgZHdFcnJvciwgZHdXYWl0LCBkd0R1bW15IDogRFdPUkQ7CisgICAgb3ZlcmxhcHBlZCA6IElPdmVybGFwcGVkSGVscGVyOworICAgIGhhbmRsZXMgOiBhcnJheVswLi4xXSBvZiBUSGFuZGxlOworYmVnaW4KKyAgb3ZlcmxhcHBlZCA6PSBUT3ZlcmxhcHBlZEhlbHBlckltcGwuQ3JlYXRlOworCisgIEFTU0VSVCggbm90IEZDb25uZWN0ZWQpOworICBDcmVhdGVOYW1lZFBpcGU7CisgIHdoaWxlIG5vdCBGQ29ubmVjdGVkIGRvIGJlZ2luCisKKyAgICBpZiBRdWVyeVN0b3BTZXJ2ZXIgdGhlbiBiZWdpbgorICAgICAgSW50ZXJuYWxDbG9zZTsKKyAgICAgIEFib3J0OworICAgIGVuZDsKKworICAgIGlmIEFzc2lnbmVkKGZuQWNjZXB0aW5nKQorICAgIHRoZW4gZm5BY2NlcHRpbmcoKTsKKworICAgIC8vIFdhaXQgZm9yIHRoZSBjbGllbnQgdG8gY29ubmVjdDsgaWYgaXQgc3VjY2VlZHMsIHRoZQorICAgIC8vIGZ1bmN0aW9uIHJldHVybnMgYSBub256ZXJvIHZhbHVlLiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucworICAgIC8vIHplcm8sIEdldExhc3RFcnJvciBzaG91bGQgcmV0dXJuIEVSUk9SX1BJUEVfQ09OTkVDVEVELgorICAgIGlmIENvbm5lY3ROYW1lZFBpcGUoIEhhbmRsZSwgb3ZlcmxhcHBlZC5PdmVybGFwcGVkUHRyKSB0aGVuIGJlZ2luCisgICAgICBGQ29ubmVjdGVkIDo9IFRSVUU7CisgICAgICBCcmVhazsKKyAgICBlbmQ7CisKKyAgICAvLyBDb25uZWN0TmFtZWRQaXBlKCkgcmV0dXJucyBGQUxTRSBmb3IgT3ZlcmxhcHBlZElPLCBldmVuIGlmIGNvbm5lY3RlZC4KKyAgICAvLyBXZSBoYXZlIHRvIGNoZWNrIEdldExhc3RFcnJvcigpIGV4cGxpY2l0bHkgdG8gZmluZCBvdXQKKyAgICBkd0Vycm9yIDo9IEdldExhc3RFcnJvcjsKKyAgICBjYXNlIGR3RXJyb3Igb2YKKyAgICAgIEVSUk9SX1BJUEVfQ09OTkVDVEVEIDogYmVnaW4KKyAgICAgICAgRkNvbm5lY3RlZCA6PSBub3QgUXVlcnlTdG9wU2VydmVyOyAgLy8gc3BlY2lhbCBjYXNlOiBwaXBlIGltbWVkaWF0ZWx5IGNvbm5lY3RlZAorICAgICAgZW5kOworCisgICAgICBFUlJPUl9JT19QRU5ESU5HIDogYmVnaW4KKyAgICAgICAgaGFuZGxlc1swXSA6PSBvdmVybGFwcGVkLldhaXRIYW5kbGU7CisgICAgICAgIGhhbmRsZXNbMV0gOj0gRlN0b3BTZXJ2ZXIuSGFuZGxlOworICAgICAgICBkd1dhaXQgOj0gV2FpdEZvck11bHRpcGxlT2JqZWN0cyggMiwgQGhhbmRsZXMsIEZBTFNFLCBGVGltZW91dCk7CisgICAgICAgIEZDb25uZWN0ZWQgOj0gKGR3V2FpdCA9IFdBSVRfT0JKRUNUXzApCisgICAgICAgICAgICAgICAgICBhbmQgR2V0T3ZlcmxhcHBlZFJlc3VsdCggSGFuZGxlLCBvdmVybGFwcGVkLk92ZXJsYXBwZWQsIGR3RHVtbXksIFRSVUUpCisgICAgICAgICAgICAgICAgICBhbmQgbm90IFF1ZXJ5U3RvcFNlcnZlcjsKKyAgICAgIGVuZDsKKworICAgIGVsc2UKKyAgICAgIEludGVybmFsQ2xvc2U7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0NsaWVudCBjb25uZWN0aW9uIGZhaWxlZCcpOworICAgIGVuZDsKKyAgZW5kOworCisgIC8vIGNyZWF0ZSB0aGUgdHJhbnNwb3J0IGltcGwKKyAgcmVzdWx0IDo9IENyZWF0ZVRyYW5zcG9ydEluc3RhbmNlOworZW5kOworCisKK2Z1bmN0aW9uIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkNyZWF0ZVRyYW5zcG9ydEluc3RhbmNlIDogSVRyYW5zcG9ydDsKKy8vIGNyZWF0ZSB0aGUgdHJhbnNwb3J0IGltcGwKK3ZhciBoUGlwZSA6IFRIYW5kbGU7CitiZWdpbgorICBoUGlwZSA6PSBUSGFuZGxlKCBJbnRlcmxvY2tlZEV4Y2hhbmdlUG9pbnRlciggUG9pbnRlcihGSGFuZGxlKSwgUG9pbnRlcihJTlZBTElEX0hBTkRMRV9WQUxVRSkpKTsKKyAgdHJ5CisgICAgRkNvbm5lY3RlZCA6PSBGQUxTRTsKKyAgICByZXN1bHQgOj0gVE5hbWVkUGlwZVRyYW5zcG9ydFNlcnZlckVuZEltcGwuQ3JlYXRlKCBoUGlwZSwgVFJVRSwgRlRpbWVvdXQpOworICBleGNlcHQKKyAgICBDbG9zZVBpcGVIYW5kbGUoaFBpcGUpOworICAgIHJhaXNlOworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkludGVybmFsQ2xvc2U7Cit2YXIgaFBpcGUgOiBUSGFuZGxlOworYmVnaW4KKyAgaFBpcGUgOj0gVEhhbmRsZSggSW50ZXJsb2NrZWRFeGNoYW5nZVBvaW50ZXIoIFBvaW50ZXIoRkhhbmRsZSksIFBvaW50ZXIoSU5WQUxJRF9IQU5ETEVfVkFMVUUpKSk7CisgIGlmIGhQaXBlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUUgdGhlbiBFeGl0OworCisgIHRyeQorICAgIGlmIEZDb25uZWN0ZWQKKyAgICB0aGVuIEZsdXNoRmlsZUJ1ZmZlcnMoIGhQaXBlKQorICAgIGVsc2UgQ2FuY2VsSW8oIGhQaXBlKTsKKyAgICBEaXNjb25uZWN0TmFtZWRQaXBlKCBoUGlwZSk7CisgIGZpbmFsbHkKKyAgICBDbG9zZVBpcGVIYW5kbGUoIGhQaXBlKTsKKyAgICBGQ29ubmVjdGVkIDo9IEZBTFNFOworICBlbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuSGFuZGxlIDogVEhhbmRsZTsKK2JlZ2luCisgIHskSUZERUYgV0lONjR9CisgIHJlc3VsdCA6PSBUSGFuZGxlKCBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQoIEludDY0KEZIYW5kbGUpLCAwKSk7CisgIHskRUxTRX0KKyAgcmVzdWx0IDo9IFRIYW5kbGUoIEludGVybG9ja2VkRXhjaGFuZ2VBZGQoIEludGVnZXIoRkhhbmRsZSksIDApKTsKKyAgeyRFTkRJRn0KK2VuZDsKKworCitmdW5jdGlvbiBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5DcmVhdGVOYW1lZFBpcGUgOiBUSGFuZGxlOwordmFyIFNJREF1dGhXb3JsZCA6IFNJRF9JREVOVElGSUVSX0FVVEhPUklUWSA7CisgICAgZXZlcnlvbmVfc2lkIDogUFNJRDsKKyAgICBlYSAgICAgICAgICAgOiBFWFBMSUNJVF9BQ0NFU1M7CisgICAgYWNsICAgICAgICAgIDogUEFDTDsKKyAgICBzZCAgICAgICAgICAgOiBQU0VDVVJJVFlfREVTQ1JJUFRPUjsKKyAgICBzYSAgICAgICAgICAgOiBTRUNVUklUWV9BVFRSSUJVVEVTOworY29uc3QKKyAgU0VDVVJJVFlfV09STERfU0lEX0FVVEhPUklUWSAgOiBUU0lESWRlbnRpZmllckF1dGhvcml0eSA9IChWYWx1ZSA6ICgwLDAsMCwwLDAsMSkpOworICBTRUNVUklUWV9XT1JMRF9SSUQgPSAkMDAwMDAwMDA7CitiZWdpbgorICBzZCA6PSBuaWw7CisgIGV2ZXJ5b25lX3NpZCA6PSBuaWw7CisgIHRyeQorICAgIEFTU0VSVCggKEZIYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgYW5kIG5vdCBGQ29ubmVjdGVkKTsKKworICAgIC8vIFdpbmRvd3MgLSBzZXQgc2VjdXJpdHkgdG8gYWxsb3cgbm9uLWVsZXZhdGVkIGFwcHMKKyAgICAvLyB0byBhY2Nlc3MgcGlwZXMgY3JlYXRlZCBieSBlbGV2YXRlZCBhcHBzLgorICAgIFNJREF1dGhXb3JsZCA6PSBTRUNVUklUWV9XT1JMRF9TSURfQVVUSE9SSVRZOworICAgIEFsbG9jYXRlQW5kSW5pdGlhbGl6ZVNpZCggU0lEQXV0aFdvcmxkLCAxLCBTRUNVUklUWV9XT1JMRF9SSUQsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGV2ZXJ5b25lX3NpZCk7CisKKyAgICBaZXJvTWVtb3J5KCBAZWEsIFNpemVPZihlYSkpOworICAgIGVhLmdyZkFjY2Vzc1Blcm1pc3Npb25zIDo9IEdFTkVSSUNfQUxMOyAvL1NQRUNJRklDX1JJR0hUU19BTEwgb3IgU1RBTkRBUkRfUklHSFRTX0FMTDsKKyAgICBlYS5ncmZBY2Nlc3NNb2RlICAgICAgICA6PSBTRVRfQUNDRVNTOworICAgIGVhLmdyZkluaGVyaXRhbmNlICAgICAgIDo9IE5PX0lOSEVSSVRBTkNFOworICAgIGVhLlRydXN0ZWUuVHJ1c3RlZUZvcm0gIDo9IFRSVVNURUVfSVNfU0lEOworICAgIGVhLlRydXN0ZWUuVHJ1c3RlZVR5cGUgIDo9IFRSVVNURUVfSVNfV0VMTF9LTk9XTl9HUk9VUDsKKyAgICBlYS5UcnVzdGVlLnB0c3RyTmFtZSAgICA6PSBQQ2hhcihldmVyeW9uZV9zaWQpOworCisgICAgYWNsIDo9IG5pbDsKKyAgICBTZXRFbnRyaWVzSW5BY2woIDEsIEBlYSwgbmlsLCBhY2wpOworCisgICAgc2QgOj0gUFNFQ1VSSVRZX0RFU0NSSVBUT1IoIExvY2FsQWxsb2MoIExQVFIsU0VDVVJJVFlfREVTQ1JJUFRPUl9NSU5fTEVOR1RIKSk7CisgICAgV2luMzJDaGVjayggSW5pdGlhbGl6ZVNlY3VyaXR5RGVzY3JpcHRvciggc2QsIFNFQ1VSSVRZX0RFU0NSSVBUT1JfUkVWSVNJT04pKTsKKyAgICBXaW4zMkNoZWNrKCBTZXRTZWN1cml0eURlc2NyaXB0b3JEYWNsKCBzZCwgVFJVRSwgYWNsLCBGQUxTRSkpOworCisgICAgc2Eubkxlbmd0aCA6PSBTaXplT2Yoc2EpOworICAgIHNhLmxwU2VjdXJpdHlEZXNjcmlwdG9yIDo9IHNkOworICAgIHNhLmJJbmhlcml0SGFuZGxlICAgICAgIDo9IEZBTFNFOworCisgICAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBuYW1lZCBwaXBlCisgICAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgICByZXN1bHQgOj0gV2luZG93cy5DcmVhdGVOYW1lZFBpcGUoCisgICAgeyRFTFNFfQorICAgIHJlc3VsdCA6PSBXaW5hcGkuV2luZG93cy5DcmVhdGVOYW1lZFBpcGUoCisgICAgeyRFTkRJRn0KKyAgICAgICAgUENoYXIoIEZQaXBlTmFtZSksICAgICAgICAvLyBwaXBlIG5hbWUKKyAgICAgICAgUElQRV9BQ0NFU1NfRFVQTEVYIG9yICAgICAvLyByZWFkL3dyaXRlIGFjY2VzcworICAgICAgICBGSUxFX0ZMQUdfT1ZFUkxBUFBFRCwgICAgIC8vIGFzeW5jIG1vZGUKKyAgICAgICAgUElQRV9UWVBFX0JZVEUgb3IgICAgICAgICAvLyBieXRlIHR5cGUgcGlwZQorICAgICAgICBQSVBFX1JFQURNT0RFX0JZVEUsICAgICAgIC8vIGJ5dGUgcmVhZCBtb2RlCisgICAgICAgIEZNYXhDb25ucywgICAgICAgICAgICAgICAgLy8gbWF4LiBpbnN0YW5jZXMKKyAgICAgICAgRkJ1ZlNpemUsICAgICAgICAgICAgICAgICAvLyBvdXRwdXQgYnVmZmVyIHNpemUKKyAgICAgICAgRkJ1ZlNpemUsICAgICAgICAgICAgICAgICAvLyBpbnB1dCBidWZmZXIgc2l6ZQorICAgICAgICBGVGltZW91dCwgICAgICAgICAgICAgICAgIC8vIHRpbWUtb3V0LCBzZWUgTVNETgorICAgICAgICBAc2EgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgc2VjdXJpdHkgYXR0cmlidXRlCisgICAgKTsKKworICAgIGlmKCByZXN1bHQgPD4gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgdGhlbiBJbnRlcmxvY2tlZEV4Y2hhbmdlUG9pbnRlciggUG9pbnRlcihGSGFuZGxlKSwgUG9pbnRlcihyZXN1bHQpKQorICAgIGVsc2UgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDcmVhdGVOYW1lZFBpcGUoKSBmYWlsZWQgJyArIEludFRvU3RyKEdldExhc3RFcnJvcikpOworCisgIGZpbmFsbHkKKyAgICBpZiBzZCA8PiBuaWwgdGhlbiBMb2NhbEZyZWUoIENhcmRpbmFsKCBzZCkpOworICAgIGlmIGFjbCA8PiBuaWwgdGhlbiBMb2NhbEZyZWUoIENhcmRpbmFsKCBhY2wpKTsKKyAgICBpZiBldmVyeW9uZV9zaWQgPD4gbmlsIHRoZW4gRnJlZVNpZChldmVyeW9uZV9zaWQpOworICBlbmQ7CitlbmQ7CisKKworCitlbmQuCisKKworCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHJhbnNwb3J0LnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5UcmFuc3BvcnQucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZDlhYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHJhbnNwb3J0LnBhcwpAQCAtMCwwICsxLDE3MTUgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKK3VuaXQgVGhyaWZ0LlRyYW5zcG9ydDsKKworeyRJIFRocmlmdC5EZWZpbmVzLmluY30KK3skU0NPUEVERU5VTVMgT059CisKK2ludGVyZmFjZQorCit1c2VzCisgIENsYXNzZXMsCisgIFN5c1V0aWxzLAorICBNYXRoLAorICBHZW5lcmljcy5Db2xsZWN0aW9ucywKKyAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgICBBY3RpdmVYLCBtc3htbCwgV2luU29jaywgU29ja2V0cywKKyAgeyRFTFNFfQorICAgIFdpbmFwaS5BY3RpdmVYLCBXaW5hcGkubXN4bWwsIFdpbmFwaS5XaW5Tb2NrLAorICAgIHskSUZERUYgT0xEX1NPQ0tFVFN9CisgICAgICBXZWIuV2luLlNvY2tldHMsCisgICAgeyRFTFNFfQorICAgICAgVGhyaWZ0LlNvY2tldCwKKyAgICB7JEVORElGfQorICB7JEVORElGfQorICBUaHJpZnQuQ29sbGVjdGlvbnMsCisgIFRocmlmdC5FeGNlcHRpb24sCisgIFRocmlmdC5VdGlscywKKyAgVGhyaWZ0LlN0cmVhbTsKKwordHlwZQorICBJVHJhbnNwb3J0ID0gaW50ZXJmYWNlCisgICAgWyd7REI4NDk2MUUtOEJCMy00NTMyLTk5RTEtQThDN0FDMjMwMEY3fSddCisgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOworICAgIHByb3BlcnR5IElzT3BlbjogQm9vbGVhbiByZWFkIEdldElzT3BlbjsKKyAgICBmdW5jdGlvbiBQZWVrOiBCb29sZWFuOworICAgIHByb2NlZHVyZSBPcGVuOworICAgIHByb2NlZHVyZSBDbG9zZTsKKyAgICBmdW5jdGlvbiBSZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBSZWFkKGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIFJlYWRBbGwodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIFJlYWRBbGwoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlcyk7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgbGVuIDogSW50ZWdlcik7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBGbHVzaDsKKyAgZW5kOworCisgIFRUcmFuc3BvcnRJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJVHJhbnNwb3J0KQorICBwcm90ZWN0ZWQKKyAgICBmdW5jdGlvbiBHZXRJc09wZW46IEJvb2xlYW47IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb3BlcnR5IElzT3BlbjogQm9vbGVhbiByZWFkIEdldElzT3BlbjsKKyAgICBmdW5jdGlvbiBQZWVrOiBCb29sZWFuOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBPcGVuKCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBDbG9zZSgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsgaW5saW5lOworICAgIGZ1bmN0aW9uIFJlYWQoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRBbGwodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7ICBvdmVybG9hZDsgaW5saW5lOworICAgIGZ1bmN0aW9uIFJlYWRBbGwoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlcyk7IG92ZXJsb2FkOyBpbmxpbmU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOyBvdmVybG9hZDsgaW5saW5lOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGxlbiA6IEludGVnZXIpOyBvdmVybG9hZDsgaW5saW5lOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7IG92ZXJsb2FkOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgRmx1c2g7IHZpcnR1YWw7CisgIGVuZDsKKworICBUVHJhbnNwb3J0RXhjZXB0aW9uID0gY2xhc3MoIFRFeGNlcHRpb24pCisgIHB1YmxpYworICAgIHR5cGUKKyAgICAgIFRFeGNlcHRpb25UeXBlID0gKAorICAgICAgICBVbmtub3duLAorICAgICAgICBOb3RPcGVuLAorICAgICAgICBBbHJlYWR5T3BlbiwKKyAgICAgICAgVGltZWRPdXQsCisgICAgICAgIEVuZE9mRmlsZSwKKyAgICAgICAgQmFkQXJncywKKyAgICAgICAgSW50ZXJydXB0ZWQKKyAgICAgICk7CisgIHByaXZhdGUKKyAgICBmdW5jdGlvbiBHZXRUeXBlOiBURXhjZXB0aW9uVHlwZTsKKyAgcHJvdGVjdGVkCisgICAgY29uc3RydWN0b3IgSGlkZGVuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKKyAgcHVibGljCisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGUpOiBUVHJhbnNwb3J0RXhjZXB0aW9uOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRUcmFuc3BvcnRFeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoIGNvbnN0IG1zZzogc3RyaW5nKTogVFRyYW5zcG9ydEV4Y2VwdGlvbjsgcmVpbnRyb2R1Y2U7IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZSggQVR5cGU6IFRFeGNlcHRpb25UeXBlOyBjb25zdCBtc2c6IHN0cmluZyk6IFRUcmFuc3BvcnRFeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIHByb3BlcnR5IFR5cGVfOiBURXhjZXB0aW9uVHlwZSByZWFkIEdldFR5cGU7CisgIGVuZDsKKworICAvLyBOZWVkZWQgdG8gcmVtb3ZlIGRlcHJlY2F0aW9uIHdhcm5pbmcKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkID0gY2xhc3MgYWJzdHJhY3QgKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CisgIGVuZDsKKworICBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93biA9IGNsYXNzIChUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3BlbiA9IGNsYXNzIChUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUVHJhbnNwb3J0RXhjZXB0aW9uQWxyZWFkeU9wZW4gPSBjbGFzcyAoVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0ID0gY2xhc3MgKFRUcmFuc3BvcnRFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRUcmFuc3BvcnRFeGNlcHRpb25FbmRPZkZpbGUgPSBjbGFzcyAoVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbkJhZEFyZ3MgPSBjbGFzcyAoVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbkludGVycnVwdGVkID0gY2xhc3MgKFRUcmFuc3BvcnRFeGNlcHRpb25TcGVjaWFsaXplZCk7CisKKyAgSUhUVFBDbGllbnQgPSBpbnRlcmZhY2UoIElUcmFuc3BvcnQgKQorICAgIFsne0JBMTQyRDEyLThBRTYtNEI1MC05RTMzLTZCNzg0M0IyMUQ3M30nXQorICAgIHByb2NlZHVyZSBTZXREbnNSZXNvbHZlVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0RG5zUmVzb2x2ZVRpbWVvdXQ6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldENvbm5lY3Rpb25UaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRDb25uZWN0aW9uVGltZW91dDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0U2VuZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFNlbmRUaW1lb3V0OiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRSZWFkVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0UmVhZFRpbWVvdXQ6IEludGVnZXI7CisgICAgZnVuY3Rpb24gR2V0Q3VzdG9tSGVhZGVyczogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz47CisgICAgcHJvY2VkdXJlIFNlbmRSZXF1ZXN0OworCisgICAgcHJvcGVydHkgRG5zUmVzb2x2ZVRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXREbnNSZXNvbHZlVGltZW91dCB3cml0ZSBTZXREbnNSZXNvbHZlVGltZW91dDsKKyAgICBwcm9wZXJ0eSBDb25uZWN0aW9uVGltZW91dDogSW50ZWdlciByZWFkIEdldENvbm5lY3Rpb25UaW1lb3V0IHdyaXRlIFNldENvbm5lY3Rpb25UaW1lb3V0OworICAgIHByb3BlcnR5IFNlbmRUaW1lb3V0OiBJbnRlZ2VyIHJlYWQgR2V0U2VuZFRpbWVvdXQgd3JpdGUgU2V0U2VuZFRpbWVvdXQ7CisgICAgcHJvcGVydHkgUmVhZFRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXRSZWFkVGltZW91dCB3cml0ZSBTZXRSZWFkVGltZW91dDsKKyAgICBwcm9wZXJ0eSBDdXN0b21IZWFkZXJzOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPiByZWFkIEdldEN1c3RvbUhlYWRlcnM7CisgIGVuZDsKKworICBUSFRUUENsaWVudEltcGwgPSBjbGFzcyggVFRyYW5zcG9ydEltcGwsIElIVFRQQ2xpZW50KQorICBwcml2YXRlCisgICAgRlVyaSA6IHN0cmluZzsKKyAgICBGSW5wdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOworICAgIEZPdXRwdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOworICAgIEZEbnNSZXNvbHZlVGltZW91dCA6IEludGVnZXI7CisgICAgRkNvbm5lY3Rpb25UaW1lb3V0IDogSW50ZWdlcjsKKyAgICBGU2VuZFRpbWVvdXQgOiBJbnRlZ2VyOworICAgIEZSZWFkVGltZW91dCA6IEludGVnZXI7CisgICAgRkN1c3RvbUhlYWRlcnMgOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPjsKKworICAgIGZ1bmN0aW9uIENyZWF0ZVJlcXVlc3Q6IElYTUxIVFRQUmVxdWVzdDsKKyAgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgT3BlbigpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2UoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CisKKyAgICBwcm9jZWR1cmUgU2V0RG5zUmVzb2x2ZVRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldERuc1Jlc29sdmVUaW1lb3V0OiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRDb25uZWN0aW9uVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0Q29ubmVjdGlvblRpbWVvdXQ6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldFNlbmRUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRTZW5kVGltZW91dDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0UmVhZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFJlYWRUaW1lb3V0OiBJbnRlZ2VyOworCisgICAgZnVuY3Rpb24gR2V0Q3VzdG9tSGVhZGVyczogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz47CisgICAgcHJvY2VkdXJlIFNlbmRSZXF1ZXN0OworICAgIHByb3BlcnR5IERuc1Jlc29sdmVUaW1lb3V0OiBJbnRlZ2VyIHJlYWQgR2V0RG5zUmVzb2x2ZVRpbWVvdXQgd3JpdGUgU2V0RG5zUmVzb2x2ZVRpbWVvdXQ7CisgICAgcHJvcGVydHkgQ29ubmVjdGlvblRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXRDb25uZWN0aW9uVGltZW91dCB3cml0ZSBTZXRDb25uZWN0aW9uVGltZW91dDsKKyAgICBwcm9wZXJ0eSBTZW5kVGltZW91dDogSW50ZWdlciByZWFkIEdldFNlbmRUaW1lb3V0IHdyaXRlIFNldFNlbmRUaW1lb3V0OworICAgIHByb3BlcnR5IFJlYWRUaW1lb3V0OiBJbnRlZ2VyIHJlYWQgR2V0UmVhZFRpbWVvdXQgd3JpdGUgU2V0UmVhZFRpbWVvdXQ7CisgICAgcHJvcGVydHkgQ3VzdG9tSGVhZGVyczogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz4gcmVhZCBHZXRDdXN0b21IZWFkZXJzOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFVcmk6IHN0cmluZyk7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKyAgZW5kOworCisgIElTZXJ2ZXJUcmFuc3BvcnQgPSBpbnRlcmZhY2UKKyAgICBbJ3tDNDNCODdFRC02OUVBLTQ3QzQtQjc3Qy0xNUUyODgyNTI5MDB9J10KKyAgICBwcm9jZWR1cmUgTGlzdGVuOworICAgIHByb2NlZHVyZSBDbG9zZTsKKyAgICBmdW5jdGlvbiBBY2NlcHQoIGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYyk6IElUcmFuc3BvcnQ7CisgIGVuZDsKKworICBUU2VydmVyVHJhbnNwb3J0SW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVNlcnZlclRyYW5zcG9ydCkKKyAgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIExpc3RlbjsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIENsb3NlOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBBY2NlcHQoIGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYyk6IElUcmFuc3BvcnQ7ICB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgZW5kOworCisgIElUcmFuc3BvcnRGYWN0b3J5ID0gaW50ZXJmYWNlCisgICAgWyd7REQ4MDk0NDYtMDAwRi00OUUxLTlCRkYtRTBEMERDNzZBOUQ3fSddCisgICAgZnVuY3Rpb24gR2V0VHJhbnNwb3J0KCBjb25zdCBBVHJhbnM6IElUcmFuc3BvcnQpOiBJVHJhbnNwb3J0OworICBlbmQ7CisKKyAgVFRyYW5zcG9ydEZhY3RvcnlJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJVHJhbnNwb3J0RmFjdG9yeSkKKyAgICBmdW5jdGlvbiBHZXRUcmFuc3BvcnQoIGNvbnN0IEFUcmFuczogSVRyYW5zcG9ydCk6IElUcmFuc3BvcnQ7IHZpcnR1YWw7CisgIGVuZDsKKworICBUVGNwU29ja2V0U3RyZWFtSW1wbCA9IGNsYXNzKCBUVGhyaWZ0U3RyZWFtSW1wbCApCit7JElGREVGIE9MRF9TT0NLRVRTfQorICBwcml2YXRlIHR5cGUKKyAgICBUV2FpdEZvckRhdGEgPSAoIHdmZF9IYXZlRGF0YSwgd2ZkX1RpbWVvdXQsIHdmZF9FcnJvcik7CisgIHByaXZhdGUKKyAgICBGVGNwQ2xpZW50IDogVEN1c3RvbUlwQ2xpZW50OworICAgIEZUaW1lb3V0IDogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiBTZWxlY3QoIFJlYWRSZWFkeSwgV3JpdGVSZWFkeSwgRXhjZXB0RmxhZzogUEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICBUaW1lT3V0OiBJbnRlZ2VyOyB2YXIgd3NhRXJyb3IgOiBJbnRlZ2VyKTogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiBXYWl0Rm9yRGF0YSggVGltZU91dCA6IEludGVnZXI7IHBCdWYgOiBQb2ludGVyOyBEZXNpcmVkQnl0ZXM6IEludGVnZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3c2FFcnJvciwgYnl0ZXNSZWFkeSA6IEludGVnZXIpOiBUV2FpdEZvckRhdGE7Cit7JEVMU0V9CisgICAgRlRjcENsaWVudDogVFNvY2tldDsKKyAgcHJvdGVjdGVkIGNvbnN0CisgICAgU0xFRVBfVElNRSA9IDIwMDsKK3skRU5ESUZ9CisgIHByb3RlY3RlZAorICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBPcGVuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CisKKyAgICBmdW5jdGlvbiBJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRCeXRlczsgb3ZlcnJpZGU7CisgIHB1YmxpYworeyRJRkRFRiBPTERfU09DS0VUU30KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFUY3BDbGllbnQ6IFRDdXN0b21JcENsaWVudDsgY29uc3QgYVRpbWVvdXQgOiBJbnRlZ2VyID0gMCk7Cit7JEVMU0V9CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBVGNwQ2xpZW50OiBUU29ja2V0OyBjb25zdCBhVGltZW91dCA6IExvbmd3b3JkID0gMCk7Cit7JEVORElGfQorICBlbmQ7CisKKyAgSVN0cmVhbVRyYW5zcG9ydCA9IGludGVyZmFjZSggSVRyYW5zcG9ydCApCisgICAgWyd7QTg0NzlCNDctMkEzRS00NDIxLUE5QTAtRDVBOUVEQ0M2MzRBfSddCisgICAgZnVuY3Rpb24gR2V0SW5wdXRTdHJlYW06IElUaHJpZnRTdHJlYW07CisgICAgZnVuY3Rpb24gR2V0T3V0cHV0U3RyZWFtOiBJVGhyaWZ0U3RyZWFtOworICAgIHByb3BlcnR5IElucHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbSByZWFkIEdldElucHV0U3RyZWFtOworICAgIHByb3BlcnR5IE91dHB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW0gcmVhZCBHZXRPdXRwdXRTdHJlYW07CisgIGVuZDsKKworICBUU3RyZWFtVHJhbnNwb3J0SW1wbCA9IGNsYXNzKCBUVHJhbnNwb3J0SW1wbCwgSVN0cmVhbVRyYW5zcG9ydCkKKyAgcHJvdGVjdGVkCisgICAgRklucHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbTsKKyAgICBGT3V0cHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbTsKKyAgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKKworICAgIGZ1bmN0aW9uIEdldElucHV0U3RyZWFtOiBJVGhyaWZ0U3RyZWFtOworICAgIGZ1bmN0aW9uIEdldE91dHB1dFN0cmVhbTogSVRocmlmdFN0cmVhbTsKKyAgcHVibGljCisgICAgcHJvcGVydHkgSW5wdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtIHJlYWQgR2V0SW5wdXRTdHJlYW07CisgICAgcHJvcGVydHkgT3V0cHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbSByZWFkIEdldE91dHB1dFN0cmVhbTsKKworICAgIHByb2NlZHVyZSBPcGVuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQUlucHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbTsgY29uc3QgQU91dHB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW0pOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgIGVuZDsKKworICBUQnVmZmVyZWRTdHJlYW1JbXBsID0gY2xhc3MoIFRUaHJpZnRTdHJlYW1JbXBsKQorICBwcml2YXRlCisgICAgRlN0cmVhbSA6IElUaHJpZnRTdHJlYW07CisgICAgRkJ1ZlNpemUgOiBJbnRlZ2VyOworICAgIEZSZWFkQnVmZmVyIDogVE1lbW9yeVN0cmVhbTsKKyAgICBGV3JpdGVCdWZmZXIgOiBUTWVtb3J5U3RyZWFtOworICBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgT3BlbjsgIG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRCeXRlczsgb3ZlcnJpZGU7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVN0cmVhbTogSVRocmlmdFN0cmVhbTsgQUJ1ZlNpemU6IEludGVnZXIpOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgIGVuZDsKKworICBUU2VydmVyU29ja2V0SW1wbCA9IGNsYXNzKCBUU2VydmVyVHJhbnNwb3J0SW1wbCkKKyAgcHJpdmF0ZQoreyRJRkRFRiBPTERfU09DS0VUU30KKyAgICBGU2VydmVyIDogVFRjcFNlcnZlcjsKKyAgICBGUG9ydCA6IEludGVnZXI7CisgICAgRkNsaWVudFRpbWVvdXQgOiBJbnRlZ2VyOworeyRFTFNFfQorICAgIEZTZXJ2ZXI6IFRTZXJ2ZXJTb2NrZXQ7Cit7JEVORElGfQorICAgIEZVc2VCdWZmZXJlZFNvY2tldCA6IEJvb2xlYW47CisgICAgRk93bnNTZXJ2ZXIgOiBCb29sZWFuOworICBwcm90ZWN0ZWQKKyAgICBmdW5jdGlvbiBBY2NlcHQoIGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYykgOiBJVHJhbnNwb3J0OyBvdmVycmlkZTsKKyAgcHVibGljCit7JElGREVGIE9MRF9TT0NLRVRTfQorICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVNlcnZlcjogVFRjcFNlcnZlcjsgQUNsaWVudFRpbWVvdXQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBUG9ydDogSW50ZWdlcjsgQUNsaWVudFRpbWVvdXQ6IEludGVnZXIgPSAwOyBBVXNlQnVmZmVyZWRTb2NrZXRzOiBCb29sZWFuID0gRkFMU0UpOyBvdmVybG9hZDsKK3skRUxTRX0KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFTZXJ2ZXI6IFRTZXJ2ZXJTb2NrZXQ7IEFDbGllbnRUaW1lb3V0OiBMb25nd29yZCA9IDApOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFQb3J0OiBJbnRlZ2VyOyBBQ2xpZW50VGltZW91dDogTG9uZ3dvcmQgPSAwOyBBVXNlQnVmZmVyZWRTb2NrZXRzOiBCb29sZWFuID0gRkFMU0UpOyBvdmVybG9hZDsKK3skRU5ESUZ9CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgTGlzdGVuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworICBlbmQ7CisKKyAgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbCA9IGNsYXNzKCBUVHJhbnNwb3J0SW1wbCApCisgIHByaXZhdGUKKyAgICBGSW5wdXRCdWZmZXIgOiBJVGhyaWZ0U3RyZWFtOworICAgIEZPdXRwdXRCdWZmZXIgOiBJVGhyaWZ0U3RyZWFtOworICAgIEZUcmFuc3BvcnQgOiBJU3RyZWFtVHJhbnNwb3J0OworICAgIEZCdWZTaXplIDogSW50ZWdlcjsKKworICAgIHByb2NlZHVyZSBJbml0QnVmZmVyczsKKyAgICBmdW5jdGlvbiBHZXRVbmRlcmx5aW5nVHJhbnNwb3J0OiBJVHJhbnNwb3J0OworICBwcm90ZWN0ZWQKKyAgICBmdW5jdGlvbiBHZXRJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CisgIHB1YmxpYworICAgIHByb2NlZHVyZSBPcGVuKCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBDbG9zZSgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBVHJhbnNwb3J0IDogSVN0cmVhbVRyYW5zcG9ydCApOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFUcmFuc3BvcnQgOiBJU3RyZWFtVHJhbnNwb3J0OyBBQnVmU2l6ZTogSW50ZWdlcik7IG92ZXJsb2FkOworICAgIHByb3BlcnR5IFVuZGVybHlpbmdUcmFuc3BvcnQ6IElUcmFuc3BvcnQgcmVhZCBHZXRVbmRlcmx5aW5nVHJhbnNwb3J0OworICAgIHByb3BlcnR5IElzT3BlbjogQm9vbGVhbiByZWFkIEdldElzT3BlbjsKKyAgZW5kOworCisgIFRTb2NrZXRJbXBsID0gY2xhc3MoVFN0cmVhbVRyYW5zcG9ydEltcGwpCisgIHByaXZhdGUKK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgICAgRkNsaWVudCA6IFRDdXN0b21JcENsaWVudDsKK3skRUxTRX0KKyAgICBGQ2xpZW50OiBUU29ja2V0OworeyRFTkRJRn0KKyAgICBGT3duc0NsaWVudCA6IEJvb2xlYW47CisgICAgRkhvc3QgOiBzdHJpbmc7CisgICAgRlBvcnQgOiBJbnRlZ2VyOworeyRJRkRFRiBPTERfU09DS0VUU30KKyAgICBGVGltZW91dCA6IEludGVnZXI7Cit7JEVMU0V9CisgICAgRlRpbWVvdXQgOiBMb25nd29yZDsKK3skRU5ESUZ9CisKKyAgICBwcm9jZWR1cmUgSW5pdFNvY2tldDsKKyAgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgcHVibGljCisgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOworeyRJRkRFRiBPTERfU09DS0VUU30KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFDbGllbnQgOiBUQ3VzdG9tSXBDbGllbnQ7IGFPd25zQ2xpZW50IDogQm9vbGVhbjsgQVRpbWVvdXQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBSG9zdDogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQVRpbWVvdXQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7Cit7JEVMU0V9CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFDbGllbnQ6IFRTb2NrZXQ7IGFPd25zQ2xpZW50OiBCb29sZWFuKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBSG9zdDogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQVRpbWVvdXQ6IExvbmd3b3JkID0gMCk7IG92ZXJsb2FkOworeyRFTkRJRn0KKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7Cit7JElGREVGIE9MRF9TT0NLRVRTfQorICAgIHByb3BlcnR5IFRjcENsaWVudDogVEN1c3RvbUlwQ2xpZW50IHJlYWQgRkNsaWVudDsKK3skRUxTRX0KKyAgICBwcm9wZXJ0eSBUY3BDbGllbnQ6IFRTb2NrZXQgcmVhZCBGQ2xpZW50OworeyRFTkRJRn0KKyAgICBwcm9wZXJ0eSBIb3N0IDogc3RyaW5nIHJlYWQgRkhvc3Q7CisgICAgcHJvcGVydHkgUG9ydDogSW50ZWdlciByZWFkIEZQb3J0OworICBlbmQ7CisKKyAgVEZyYW1lZFRyYW5zcG9ydEltcGwgPSBjbGFzcyggVFRyYW5zcG9ydEltcGwpCisgIHByaXZhdGUgY29uc3QKKyAgICBGSGVhZGVyU2l6ZSA6IEludGVnZXIgPSA0OworICBwcml2YXRlIGNsYXNzIHZhcgorICAgIEZIZWFkZXJfRHVtbXkgOiBhcnJheSBvZiBCeXRlOworICBwcm90ZWN0ZWQKKyAgICBGVHJhbnNwb3J0IDogSVRyYW5zcG9ydDsKKyAgICBGV3JpdGVCdWZmZXIgOiBUTWVtb3J5U3RyZWFtOworICAgIEZSZWFkQnVmZmVyIDogVE1lbW9yeVN0cmVhbTsKKworICAgIHByb2NlZHVyZSBJbml0V3JpdGVCdWZmZXI7CisgICAgcHJvY2VkdXJlIFJlYWRGcmFtZTsKKyAgcHVibGljCisgICAgdHlwZQorICAgICAgVEZhY3RvcnkgPSBjbGFzcyggVFRyYW5zcG9ydEZhY3RvcnlJbXBsICkKKyAgICAgIHB1YmxpYworICAgICAgICBmdW5jdGlvbiBHZXRUcmFuc3BvcnQoIGNvbnN0IEFUcmFuczogSVRyYW5zcG9ydCk6IElUcmFuc3BvcnQ7IG92ZXJyaWRlOworICAgICAgZW5kOworCisgICAgeyRJRkRFRiBIQVZFX0NMQVNTX0NUT1J9CisgICAgY2xhc3MgY29uc3RydWN0b3IgQ3JlYXRlOworICAgIHskRU5ESUZ9CisKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVRyYW5zOiBJVHJhbnNwb3J0KTsgb3ZlcmxvYWQ7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKworICAgIHByb2NlZHVyZSBPcGVuKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIEdldElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7CisKKyAgICBwcm9jZWR1cmUgQ2xvc2UoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CisgIGVuZDsKKworeyRJRk5ERUYgSEFWRV9DTEFTU19DVE9SfQorcHJvY2VkdXJlIFRGcmFtZWRUcmFuc3BvcnRJbXBsX0luaXRpYWxpemU7Cit7JEVORElGfQorCitjb25zdAorICBERUZBVUxUX1RIUklGVF9USU1FT1VUID0gNSAqIDEwMDA7IC8vIG1zCisKKworaW1wbGVtZW50YXRpb24KKworeyBUVHJhbnNwb3J0SW1wbCB9CisKK3Byb2NlZHVyZSBUVHJhbnNwb3J0SW1wbC5GbHVzaDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworZnVuY3Rpb24gVFRyYW5zcG9ydEltcGwuUGVlazogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBJc09wZW47CitlbmQ7CisKK2Z1bmN0aW9uIFRUcmFuc3BvcnRJbXBsLlJlYWQodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBpZiBMZW5ndGgoYnVmKSA+IDAKKyAgdGhlbiByZXN1bHQgOj0gUmVhZCggQGJ1ZlswXSwgTGVuZ3RoKGJ1ZiksIG9mZiwgbGVuKQorICBlbHNlIHJlc3VsdCA6PSAwOworZW5kOworCitmdW5jdGlvbiBUVHJhbnNwb3J0SW1wbC5SZWFkQWxsKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgTGVuZ3RoKGJ1ZikgPiAwCisgIHRoZW4gcmVzdWx0IDo9IFJlYWRBbGwoIEBidWZbMF0sIExlbmd0aChidWYpLCBvZmYsIGxlbikKKyAgZWxzZSByZXN1bHQgOj0gMDsKK2VuZDsKKworcHJvY2VkdXJlIFRUcmFuc3BvcnRJbXBsLldyaXRlKCBjb25zdCBidWY6IFRCeXRlcyk7CitiZWdpbgorICBpZiBMZW5ndGgoYnVmKSA+IDAKKyAgdGhlbiBXcml0ZSggQGJ1ZlswXSwgMCwgTGVuZ3RoKGJ1ZikpOworZW5kOworCitwcm9jZWR1cmUgVFRyYW5zcG9ydEltcGwuV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik7CitiZWdpbgorICBpZiBMZW5ndGgoYnVmKSA+IDAKKyAgdGhlbiBXcml0ZSggQGJ1ZlswXSwgb2ZmLCBsZW4pOworZW5kOworCitmdW5jdGlvbiBUVHJhbnNwb3J0SW1wbC5SZWFkQWxsKGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7Cit2YXIgcmV0IDogSW50ZWdlcjsKK2JlZ2luCisgIHJlc3VsdCA6PSAwOworICB3aGlsZSByZXN1bHQgPCBsZW4gZG8gYmVnaW4KKyAgICByZXQgOj0gUmVhZCggcEJ1ZiwgYnVmbGVuLCBvZmYgKyByZXN1bHQsIGxlbiAtIHJlc3VsdCk7CisgICAgaWYgcmV0ID4gMAorICAgIHRoZW4gSW5jKCByZXN1bHQsIHJldCkKKyAgICBlbHNlIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSggJ0Nhbm5vdCByZWFkLCBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkJyApOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUVHJhbnNwb3J0SW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGxlbiA6IEludGVnZXIpOworYmVnaW4KKyAgU2VsZi5Xcml0ZSggcEJ1ZiwgMCwgbGVuKTsKK2VuZDsKKworeyBUSFRUUENsaWVudEltcGwgfQorCitjb25zdHJ1Y3RvciBUSFRUUENsaWVudEltcGwuQ3JlYXRlKGNvbnN0IEFVcmk6IHN0cmluZyk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGVXJpIDo9IEFVcmk7CisKKyAgLy8gZGVmYXVsdHMgYWNjb3JkaW5nIHRvIE1TRE4KKyAgRkRuc1Jlc29sdmVUaW1lb3V0IDo9IDA7IC8vIG5vIHRpbWVvdXQKKyAgRkNvbm5lY3Rpb25UaW1lb3V0IDo9IDYwICogMTAwMDsKKyAgRlNlbmRUaW1lb3V0ICAgICAgIDo9IDMwICogMTAwMDsKKyAgRlJlYWRUaW1lb3V0ICAgICAgIDo9IDMwICogMTAwMDsKKworICBGQ3VzdG9tSGVhZGVycyA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8c3RyaW5nLHN0cmluZz4uQ3JlYXRlOworICBGT3V0cHV0U3RyZWFtIDo9IFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggVE1lbW9yeVN0cmVhbS5DcmVhdGUsIFRydWUpOworZW5kOworCitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuQ3JlYXRlUmVxdWVzdDogSVhNTEhUVFBSZXF1ZXN0OwordmFyCisgIHBhaXIgOiBUUGFpcjxzdHJpbmcsc3RyaW5nPjsKKyAgc3J2SHR0cCA6IElTZXJ2ZXJYTUxIVFRQUmVxdWVzdDsKK2JlZ2luCisgIHskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9CisgIFJlc3VsdCA6PSBDb1NlcnZlclhNTEhUVFAuQ3JlYXRlOworICB7JEVMU0V9CisgIFJlc3VsdCA6PSBDb1hNTEhUVFBSZXF1ZXN0LkNyZWF0ZTsKKyAgeyRJRkVORH0KKworICAvLyBzZXR0aW5nIGEgdGltZW91dCB2YWx1ZSB0byAwICh6ZXJvKSBtZWFucyAibm8gdGltZW91dCIgZm9yIHRoYXQgc2V0dGluZworICBpZiBTdXBwb3J0cyggcmVzdWx0LCBJU2VydmVyWE1MSFRUUFJlcXVlc3QsIHNydkh0dHApCisgIHRoZW4gc3J2SHR0cC5zZXRUaW1lb3V0cyggRG5zUmVzb2x2ZVRpbWVvdXQsIENvbm5lY3Rpb25UaW1lb3V0LCBTZW5kVGltZW91dCwgUmVhZFRpbWVvdXQpOworCisgIFJlc3VsdC5vcGVuKCdQT1NUJywgRlVyaSwgRmFsc2UsICcnLCAnJyk7CisgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCAnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0Jyk7CisgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCAnQWNjZXB0JywgJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0Jyk7CisgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCAnVXNlci1BZ2VudCcsICdEZWxwaGkvSUhUVFBDbGllbnQnKTsKKworICBmb3IgcGFpciBpbiBGQ3VzdG9tSGVhZGVycyBkbyBiZWdpbgorICAgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCBwYWlyLktleSwgcGFpci5WYWx1ZSApOworICBlbmQ7CitlbmQ7CisKK2Rlc3RydWN0b3IgVEhUVFBDbGllbnRJbXBsLkRlc3Ryb3k7CitiZWdpbgorICBDbG9zZTsKKyAgaW5oZXJpdGVkOworZW5kOworCitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuR2V0RG5zUmVzb2x2ZVRpbWVvdXQ6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkRuc1Jlc29sdmVUaW1lb3V0OworZW5kOworCitwcm9jZWR1cmUgVEhUVFBDbGllbnRJbXBsLlNldERuc1Jlc29sdmVUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZEbnNSZXNvbHZlVGltZW91dCA6PSBWYWx1ZTsKK2VuZDsKKworZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLkdldENvbm5lY3Rpb25UaW1lb3V0OiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZDb25uZWN0aW9uVGltZW91dDsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5TZXRDb25uZWN0aW9uVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGQ29ubmVjdGlvblRpbWVvdXQgOj0gVmFsdWU7CitlbmQ7CisKK2Z1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5HZXRTZW5kVGltZW91dDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGU2VuZFRpbWVvdXQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUSFRUUENsaWVudEltcGwuU2V0U2VuZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRlNlbmRUaW1lb3V0IDo9IFZhbHVlOworZW5kOworCitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuR2V0UmVhZFRpbWVvdXQ6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRlJlYWRUaW1lb3V0OworZW5kOworCitwcm9jZWR1cmUgVEhUVFBDbGllbnRJbXBsLlNldFJlYWRUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZSZWFkVGltZW91dCA6PSBWYWx1ZTsKK2VuZDsKKworZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLkdldEN1c3RvbUhlYWRlcnM6IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZyxzdHJpbmc+OworYmVnaW4KKyAgUmVzdWx0IDo9IEZDdXN0b21IZWFkZXJzOworZW5kOworCitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuR2V0SXNPcGVuOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IFRydWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUSFRUUENsaWVudEltcGwuT3BlbjsKK2JlZ2luCisgIEZPdXRwdXRTdHJlYW0gOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBUTWVtb3J5U3RyZWFtLkNyZWF0ZSwgVHJ1ZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUSFRUUENsaWVudEltcGwuQ2xvc2U7CitiZWdpbgorICBGSW5wdXRTdHJlYW0gOj0gbmlsOworICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5GbHVzaDsKK2JlZ2luCisgIHRyeQorICAgIFNlbmRSZXF1ZXN0OworICBmaW5hbGx5CisgICAgRk91dHB1dFN0cmVhbSA6PSBuaWw7CisgICAgRk91dHB1dFN0cmVhbSA6PSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIFRNZW1vcnlTdHJlYW0uQ3JlYXRlLCBUcnVlKTsKKyAgICBBU1NFUlQoIEZPdXRwdXRTdHJlYW0gPD4gbmlsKTsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIGlmIEZJbnB1dFN0cmVhbSA9IG5pbCB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdObyByZXF1ZXN0IGhhcyBiZWVuIHNlbnQnKTsKKyAgZW5kOworCisgIHRyeQorICAgIFJlc3VsdCA6PSBGSW5wdXRTdHJlYW0uUmVhZCggcEJ1ZiwgYnVmbGVuLCBvZmYsIGxlbikKKyAgZXhjZXB0CisgICAgb24gRTogRXhjZXB0aW9uCisgICAgZG8gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEUuTWVzc2FnZSk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5TZW5kUmVxdWVzdDsKK3ZhcgorICB4bWxodHRwIDogSVhNTEhUVFBSZXF1ZXN0OworICBtcyA6IFRNZW1vcnlTdHJlYW07CisgIGEgOiBUQnl0ZXM7CisgIGxlbiA6IEludGVnZXI7CitiZWdpbgorICB4bWxodHRwIDo9IENyZWF0ZVJlcXVlc3Q7CisKKyAgbXMgOj0gVE1lbW9yeVN0cmVhbS5DcmVhdGU7CisgIHRyeQorICAgIGEgOj0gRk91dHB1dFN0cmVhbS5Ub0FycmF5OworICAgIGxlbiA6PSBMZW5ndGgoYSk7CisgICAgaWYgbGVuID4gMCB0aGVuIGJlZ2luCisgICAgICBtcy5Xcml0ZUJ1ZmZlciggUG9pbnRlcihAYVswXSleLCBsZW4pOworICAgIGVuZDsKKyAgICBtcy5Qb3NpdGlvbiA6PSAwOworICAgIHhtbGh0dHAuc2VuZCggSVVua25vd24oIFRTdHJlYW1BZGFwdGVyLkNyZWF0ZSggbXMsIHNvUmVmZXJlbmNlICkpKTsKKyAgICBGSW5wdXRTdHJlYW0gOj0gbmlsOworICAgIEZJbnB1dFN0cmVhbSA6PSBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5DcmVhdGUoIElVbmtub3duKCB4bWxodHRwLnJlc3BvbnNlU3RyZWFtKSBhcyBJU3RyZWFtKTsKKyAgZmluYWxseQorICAgIG1zLkZyZWU7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7CitiZWdpbgorICBGT3V0cHV0U3RyZWFtLldyaXRlKCBwQnVmLCBvZmYsIGxlbik7CitlbmQ7CisKK3sgVFRyYW5zcG9ydEV4Y2VwdGlvbiB9CisKK2Z1bmN0aW9uIFRUcmFuc3BvcnRFeGNlcHRpb24uR2V0VHlwZTogVEV4Y2VwdGlvblR5cGU7CitiZWdpbgorICBpZiBTZWxmIGlzIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLk5vdE9wZW4KKyAgZWxzZSBpZiBTZWxmIGlzIFRUcmFuc3BvcnRFeGNlcHRpb25BbHJlYWR5T3BlbiB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbgorICBlbHNlIGlmIFNlbGYgaXMgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0IHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLlRpbWVkT3V0CisgIGVsc2UgaWYgU2VsZiBpcyBUVHJhbnNwb3J0RXhjZXB0aW9uRW5kT2ZGaWxlIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkVuZE9mRmlsZQorICBlbHNlIGlmIFNlbGYgaXMgVFRyYW5zcG9ydEV4Y2VwdGlvbkJhZEFyZ3MgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuQmFkQXJncworICBlbHNlIGlmIFNlbGYgaXMgVFRyYW5zcG9ydEV4Y2VwdGlvbkludGVycnVwdGVkIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkludGVycnVwdGVkCisgIGVsc2UgUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLlVua25vd247CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRUcmFuc3BvcnRFeGNlcHRpb24uSGlkZGVuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoTXNnKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoQVR5cGU6IFRFeGNlcHRpb25UeXBlKTogVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK2JlZ2luCisgIC8vbm8gaW5oZXJpdGVkOworeyRXQVJOIFNZTUJPTF9ERVBSRUNBVEVEIE9GRn0KKyAgUmVzdWx0IDo9IENyZWF0ZShBVHlwZSwgJycpCit7JFdBUk4gU1lNQk9MX0RFUFJFQ0FURUQgREVGQVVMVH0KK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoQVR5cGU6IFRFeGNlcHRpb25UeXBlOworICBjb25zdCBtc2c6IHN0cmluZyk6IFRUcmFuc3BvcnRFeGNlcHRpb247CitiZWdpbgorICBjYXNlIEFUeXBlIG9mCisgICAgVEV4Y2VwdGlvblR5cGUuTm90T3BlbjogICAgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbjogUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25BbHJlYWR5T3Blbi5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5UaW1lZE91dDogICAgUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5FbmRPZkZpbGU6ICAgUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25FbmRPZkZpbGUuQ3JlYXRlKG1zZyk7CisgICAgVEV4Y2VwdGlvblR5cGUuQmFkQXJnczogICAgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uQmFkQXJncy5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZDogUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25JbnRlcnJ1cHRlZC5DcmVhdGUobXNnKTsKKyAgZWxzZQorICAgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUobXNnKTsKKyAgZW5kOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZShjb25zdCBtc2c6IHN0cmluZyk6IFRUcmFuc3BvcnRFeGNlcHRpb247CitiZWdpbgorICBSZXN1bHQgOj0gVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKE1zZyk7CitlbmQ7CisKK3sgVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkIH0KKworY29uc3RydWN0b3IgVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkLkNyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CitiZWdpbgorICBpbmhlcml0ZWQgSGlkZGVuQ3JlYXRlKE1zZyk7CitlbmQ7CisKK3sgVFRyYW5zcG9ydEZhY3RvcnlJbXBsIH0KKworZnVuY3Rpb24gVFRyYW5zcG9ydEZhY3RvcnlJbXBsLkdldFRyYW5zcG9ydCggY29uc3QgQVRyYW5zOiBJVHJhbnNwb3J0KTogSVRyYW5zcG9ydDsKK2JlZ2luCisgIFJlc3VsdCA6PSBBVHJhbnM7CitlbmQ7CisKK3sgVFNlcnZlclNvY2tldCB9CisKK3skSUZERUYgT0xEX1NPQ0tFVFN9Citjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5DcmVhdGUoIGNvbnN0IEFTZXJ2ZXI6IFRUY3BTZXJ2ZXI7IEFDbGllbnRUaW1lb3V0OiBJbnRlZ2VyKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZTZXJ2ZXIgOj0gQVNlcnZlcjsKKyAgRkNsaWVudFRpbWVvdXQgOj0gQUNsaWVudFRpbWVvdXQ7CitlbmQ7Cit7JEVMU0V9Citjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5DcmVhdGUoIGNvbnN0IEFTZXJ2ZXI6IFRTZXJ2ZXJTb2NrZXQ7IEFDbGllbnRUaW1lb3V0OiBMb25nd29yZCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU2VydmVyIDo9IEFTZXJ2ZXI7CisgIEZTZXJ2ZXIuUmVjdlRpbWVvdXQgOj0gQUNsaWVudFRpbWVvdXQ7CisgIEZTZXJ2ZXIuU2VuZFRpbWVvdXQgOj0gQUNsaWVudFRpbWVvdXQ7CitlbmQ7Cit7JEVORElGfQorCit7JElGREVGIE9MRF9TT0NLRVRTfQorY29uc3RydWN0b3IgVFNlcnZlclNvY2tldEltcGwuQ3JlYXRlKEFQb3J0LCBBQ2xpZW50VGltZW91dDogSW50ZWdlcjsgQVVzZUJ1ZmZlcmVkU29ja2V0czogQm9vbGVhbik7Cit7JEVMU0V9Citjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5DcmVhdGUoQVBvcnQ6IEludGVnZXI7IEFDbGllbnRUaW1lb3V0OiBMb25nd29yZDsgQVVzZUJ1ZmZlcmVkU29ja2V0czogQm9vbGVhbik7Cit7JEVORElGfQorYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgIEZQb3J0IDo9IEFQb3J0OworICBGQ2xpZW50VGltZW91dCA6PSBBQ2xpZW50VGltZW91dDsKKyAgRlNlcnZlciA6PSBUVGNwU2VydmVyLkNyZWF0ZSggbmlsICk7CisgIEZTZXJ2ZXIuQmxvY2tNb2RlIDo9IGJtQmxvY2tpbmc7CisgIHskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9CisgIEZTZXJ2ZXIuTG9jYWxQb3J0IDo9IEFuc2lTdHJpbmcoIEludFRvU3RyKCBGUG9ydCkpOworICB7JEVMU0V9CisgIEZTZXJ2ZXIuTG9jYWxQb3J0IDo9IEludFRvU3RyKCBGUG9ydCk7CisgIHskSUZFTkR9Cit7JEVMU0V9CisgIEZTZXJ2ZXIgOj0gVFNlcnZlclNvY2tldC5DcmVhdGUoQVBvcnQsIEFDbGllbnRUaW1lb3V0LCBBQ2xpZW50VGltZW91dCk7Cit7JEVORElGfQorICBGVXNlQnVmZmVyZWRTb2NrZXQgOj0gQVVzZUJ1ZmZlcmVkU29ja2V0czsKKyAgRk93bnNTZXJ2ZXIgOj0gVHJ1ZTsKK2VuZDsKKworZGVzdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5EZXN0cm95OworYmVnaW4KKyAgaWYgRk93bnNTZXJ2ZXIgdGhlbiBiZWdpbgorICAgIEZTZXJ2ZXIuRnJlZTsKKyAgICBGU2VydmVyIDo9IG5pbDsKKyAgZW5kOworICBpbmhlcml0ZWQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRTZXJ2ZXJTb2NrZXRJbXBsLkFjY2VwdCggY29uc3QgZm5BY2NlcHRpbmc6IFRQcm9jKTogSVRyYW5zcG9ydDsKK3ZhcgoreyRJRkRFRiBPTERfU09DS0VUU30KKyAgY2xpZW50IDogVEN1c3RvbUlwQ2xpZW50OworeyRFTFNFfQorICBjbGllbnQ6IFRTb2NrZXQ7Cit7JEVORElGfQorICB0cmFucyAgOiBJU3RyZWFtVHJhbnNwb3J0OworYmVnaW4KKyAgaWYgRlNlcnZlciA9IG5pbCB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdObyB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQuJyk7CisgIGVuZDsKKworeyRJRkRFRiBPTERfU09DS0VUU30KKyAgY2xpZW50IDo9IG5pbDsKKyAgdHJ5CisgICAgY2xpZW50IDo9IFRDdXN0b21JcENsaWVudC5DcmVhdGUobmlsKTsKKworICAgIGlmIEFzc2lnbmVkKGZuQWNjZXB0aW5nKQorICAgIHRoZW4gZm5BY2NlcHRpbmcoKTsKKworICAgIGlmIG5vdCBGU2VydmVyLkFjY2VwdCggY2xpZW50KSB0aGVuIGJlZ2luCisgICAgICBjbGllbnQuRnJlZTsKKyAgICAgIFJlc3VsdCA6PSBuaWw7CisgICAgICBFeGl0OworICAgIGVuZDsKKworICAgIGlmIGNsaWVudCA9IG5pbCB0aGVuIGJlZ2luCisgICAgICBSZXN1bHQgOj0gbmlsOworICAgICAgRXhpdDsKKyAgICBlbmQ7CisKKyAgICB0cmFucyA6PSBUU29ja2V0SW1wbC5DcmVhdGUoIGNsaWVudCwgVFJVRSwgRkNsaWVudFRpbWVvdXQpOworICAgIGNsaWVudCA6PSBuaWw7ICAvLyB0cmFucyBvd25zIGl0IG5vdworCisgICAgaWYgRlVzZUJ1ZmZlcmVkU29ja2V0CisgICAgdGhlbiByZXN1bHQgOj0gVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5DcmVhdGUoIHRyYW5zKQorICAgIGVsc2UgcmVzdWx0IDo9IHRyYW5zOworCisgIGV4Y2VwdAorICAgIG9uIEU6IEV4Y2VwdGlvbiBkbyBiZWdpbgorICAgICAgY2xpZW50LkZyZWU7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRS5Ub1N0cmluZyk7CisgICAgZW5kOworICBlbmQ7Cit7JEVMU0V9CisgIGlmIEFzc2lnbmVkKGZuQWNjZXB0aW5nKSB0aGVuCisgICAgZm5BY2NlcHRpbmcoKTsKKworICBjbGllbnQgOj0gRlNlcnZlci5BY2NlcHQ7CisgIHRyeQorICAgIHRyYW5zIDo9IFRTb2NrZXRJbXBsLkNyZWF0ZShjbGllbnQsIFRydWUpOworICAgIGNsaWVudCA6PSBuaWw7CisKKyAgICBpZiBGVXNlQnVmZmVyZWRTb2NrZXQgdGhlbgorICAgICAgUmVzdWx0IDo9IFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ3JlYXRlKHRyYW5zKQorICAgIGVsc2UKKyAgICAgIFJlc3VsdCA6PSB0cmFuczsKKyAgZXhjZXB0CisgICAgY2xpZW50LkZyZWU7CisgICAgcmFpc2U7CisgIGVuZDsKK3skRU5ESUZ9CitlbmQ7CisKK3Byb2NlZHVyZSBUU2VydmVyU29ja2V0SW1wbC5MaXN0ZW47CitiZWdpbgorICBpZiBGU2VydmVyIDw+IG5pbCB0aGVuCisgIGJlZ2luCit7JElGREVGIE9MRF9TT0NLRVRTfQorICAgIHRyeQorICAgICAgRlNlcnZlci5BY3RpdmUgOj0gVHJ1ZTsKKyAgICBleGNlcHQKKyAgICAgIG9uIEU6IEV4Y2VwdGlvbgorICAgICAgZG8gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCdDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICcgKyBFLk1lc3NhZ2UpOworICAgIGVuZDsKK3skRUxTRX0KKyAgICBGU2VydmVyLkxpc3RlbjsKK3skRU5ESUZ9CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXRJbXBsLkNsb3NlOworYmVnaW4KKyAgaWYgRlNlcnZlciA8PiBuaWwgdGhlbgoreyRJRkRFRiBPTERfU09DS0VUU30KKyAgICB0cnkKKyAgICAgIEZTZXJ2ZXIuQWN0aXZlIDo9IEZhbHNlOworICAgIGV4Y2VwdAorICAgICAgb24gRTogRXhjZXB0aW9uCisgICAgICBkbyByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJ0Vycm9yIG9uIGNsb3Npbmcgc29ja2V0IDogJyArIEUuTWVzc2FnZSk7CisgICAgZW5kOworeyRFTFNFfQorICAgIEZTZXJ2ZXIuQ2xvc2U7Cit7JEVORElGfQorZW5kOworCit7IFRTb2NrZXQgfQorCit7JElGREVGIE9MRF9TT0NLRVRTfQorY29uc3RydWN0b3IgVFNvY2tldEltcGwuQ3JlYXRlKCBjb25zdCBBQ2xpZW50IDogVEN1c3RvbUlwQ2xpZW50OyBhT3duc0NsaWVudCA6IEJvb2xlYW47IEFUaW1lb3V0OiBJbnRlZ2VyID0gMCk7Cit2YXIgc3RyZWFtIDogSVRocmlmdFN0cmVhbTsKK2JlZ2luCisgIEZDbGllbnQgOj0gQUNsaWVudDsKKyAgRlRpbWVvdXQgOj0gQVRpbWVvdXQ7CisgIEZPd25zQ2xpZW50IDo9IGFPd25zQ2xpZW50OworICBzdHJlYW0gOj0gVFRjcFNvY2tldFN0cmVhbUltcGwuQ3JlYXRlKCBGQ2xpZW50LCBGVGltZW91dCk7CisgIGluaGVyaXRlZCBDcmVhdGUoIHN0cmVhbSwgc3RyZWFtKTsKK2VuZDsKK3skRUxTRX0KK2NvbnN0cnVjdG9yIFRTb2NrZXRJbXBsLkNyZWF0ZShjb25zdCBBQ2xpZW50OiBUU29ja2V0OyBhT3duc0NsaWVudDogQm9vbGVhbik7Cit2YXIgc3RyZWFtIDogSVRocmlmdFN0cmVhbTsKK2JlZ2luCisgIEZDbGllbnQgOj0gQUNsaWVudDsKKyAgRlRpbWVvdXQgOj0gQUNsaWVudC5SZWN2VGltZW91dDsKKyAgRk93bnNDbGllbnQgOj0gYU93bnNDbGllbnQ7CisgIHN0cmVhbSA6PSBUVGNwU29ja2V0U3RyZWFtSW1wbC5DcmVhdGUoRkNsaWVudCwgRlRpbWVvdXQpOworICBpbmhlcml0ZWQgQ3JlYXRlKHN0cmVhbSwgc3RyZWFtKTsKK2VuZDsKK3skRU5ESUZ9CisKK3skSUZERUYgT0xEX1NPQ0tFVFN9Citjb25zdHJ1Y3RvciBUU29ja2V0SW1wbC5DcmVhdGUoY29uc3QgQUhvc3Q6IHN0cmluZzsgQVBvcnQsIEFUaW1lb3V0OiBJbnRlZ2VyKTsKK3skRUxTRX0KK2NvbnN0cnVjdG9yIFRTb2NrZXRJbXBsLkNyZWF0ZShjb25zdCBBSG9zdDogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQVRpbWVvdXQ6IExvbmd3b3JkKTsKK3skRU5ESUZ9CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKG5pbCxuaWwpOworICBGSG9zdCA6PSBBSG9zdDsKKyAgRlBvcnQgOj0gQVBvcnQ7CisgIEZUaW1lb3V0IDo9IEFUaW1lb3V0OworICBJbml0U29ja2V0OworZW5kOworCitkZXN0cnVjdG9yIFRTb2NrZXRJbXBsLkRlc3Ryb3k7CitiZWdpbgorICBpZiBGT3duc0NsaWVudAorICB0aGVuIEZyZWVBbmROaWwoIEZDbGllbnQpOworICBpbmhlcml0ZWQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0SW1wbC5DbG9zZTsKK2JlZ2luCisgIGluaGVyaXRlZCBDbG9zZTsKKworICBGSW5wdXRTdHJlYW0gOj0gbmlsOworICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKKworICBpZiBGT3duc0NsaWVudAorICB0aGVuIEZyZWVBbmROaWwoIEZDbGllbnQpCisgIGVsc2UgRkNsaWVudCA6PSBuaWw7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXRJbXBsLkdldElzT3BlbjogQm9vbGVhbjsKK2JlZ2luCit7JElGREVGIE9MRF9TT0NLRVRTfQorICBSZXN1bHQgOj0gKEZDbGllbnQgPD4gbmlsKSBhbmQgRkNsaWVudC5Db25uZWN0ZWQ7Cit7JEVMU0V9CisgIFJlc3VsdCA6PSAoRkNsaWVudCA8PiBuaWwpIGFuZCBGQ2xpZW50LklzT3BlbgoreyRFTkRJRn0KK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXRJbXBsLkluaXRTb2NrZXQ7Cit2YXIKKyAgc3RyZWFtIDogSVRocmlmdFN0cmVhbTsKK2JlZ2luCisgIGlmIEZPd25zQ2xpZW50CisgIHRoZW4gRnJlZUFuZE5pbCggRkNsaWVudCkKKyAgZWxzZSBGQ2xpZW50IDo9IG5pbDsKKworeyRJRkRFRiBPTERfU09DS0VUU30KKyAgRkNsaWVudCA6PSBUVGNwQ2xpZW50LkNyZWF0ZSggbmlsKTsKK3skRUxTRX0KKyAgRkNsaWVudCA6PSBUU29ja2V0LkNyZWF0ZShGSG9zdCwgRlBvcnQpOworeyRFTkRJRn0KKyAgRk93bnNDbGllbnQgOj0gVHJ1ZTsKKworICBzdHJlYW0gOj0gVFRjcFNvY2tldFN0cmVhbUltcGwuQ3JlYXRlKCBGQ2xpZW50LCBGVGltZW91dCk7CisgIEZJbnB1dFN0cmVhbSA6PSBzdHJlYW07CisgIEZPdXRwdXRTdHJlYW0gOj0gc3RyZWFtOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldEltcGwuT3BlbjsKK2JlZ2luCisgIGlmIElzT3BlbiB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbkFscmVhZHlPcGVuLkNyZWF0ZSgnU29ja2V0IGFscmVhZHkgY29ubmVjdGVkJyk7CisgIGVuZDsKKworICBpZiBGSG9zdCA9ICcnIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0Nhbm5vdCBvcGVuIG51bGwgaG9zdCcpOworICBlbmQ7CisKKyAgaWYgUG9ydCA8PSAwIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0Nhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCcpOworICBlbmQ7CisKKyAgaWYgRkNsaWVudCA9IG5pbAorICB0aGVuIEluaXRTb2NrZXQ7CisKK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgIEZDbGllbnQuUmVtb3RlSG9zdCA6PSBUU29ja2V0SG9zdCggSG9zdCk7CisgIEZDbGllbnQuUmVtb3RlUG9ydCA6PSBUU29ja2V0UG9ydCggSW50VG9TdHIoIFBvcnQpKTsKKyAgRkNsaWVudC5Db25uZWN0OworeyRFTFNFfQorICBGQ2xpZW50Lk9wZW47Cit7JEVORElGfQorCisgIEZJbnB1dFN0cmVhbSA6PSBUVGNwU29ja2V0U3RyZWFtSW1wbC5DcmVhdGUoIEZDbGllbnQsIEZUaW1lb3V0KTsKKyAgRk91dHB1dFN0cmVhbSA6PSBGSW5wdXRTdHJlYW07CitlbmQ7CisKK3sgVEJ1ZmZlcmVkU3RyZWFtIH0KKworcHJvY2VkdXJlIFRCdWZmZXJlZFN0cmVhbUltcGwuQ2xvc2U7CitiZWdpbgorICBGbHVzaDsKKyAgRlN0cmVhbSA6PSBuaWw7CisKKyAgRlJlYWRCdWZmZXIuRnJlZTsKKyAgRlJlYWRCdWZmZXIgOj0gbmlsOworCisgIEZXcml0ZUJ1ZmZlci5GcmVlOworICBGV3JpdGVCdWZmZXIgOj0gbmlsOworZW5kOworCitjb25zdHJ1Y3RvciBUQnVmZmVyZWRTdHJlYW1JbXBsLkNyZWF0ZSggY29uc3QgQVN0cmVhbTogSVRocmlmdFN0cmVhbTsgQUJ1ZlNpemU6IEludGVnZXIpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlN0cmVhbSA6PSBBU3RyZWFtOworICBGQnVmU2l6ZSA6PSBBQnVmU2l6ZTsKKyAgRlJlYWRCdWZmZXIgOj0gVE1lbW9yeVN0cmVhbS5DcmVhdGU7CisgIEZXcml0ZUJ1ZmZlciA6PSBUTWVtb3J5U3RyZWFtLkNyZWF0ZTsKK2VuZDsKKworZGVzdHJ1Y3RvciBUQnVmZmVyZWRTdHJlYW1JbXBsLkRlc3Ryb3k7CitiZWdpbgorICBDbG9zZTsKKyAgaW5oZXJpdGVkOworZW5kOworCitwcm9jZWR1cmUgVEJ1ZmZlcmVkU3RyZWFtSW1wbC5GbHVzaDsKK3ZhcgorICBidWYgOiBUQnl0ZXM7CisgIGxlbiA6IEludGVnZXI7CitiZWdpbgorICBpZiBJc09wZW4gdGhlbiBiZWdpbgorICAgIGxlbiA6PSBGV3JpdGVCdWZmZXIuU2l6ZTsKKyAgICBpZiBsZW4gPiAwIHRoZW4gYmVnaW4KKyAgICAgIFNldExlbmd0aCggYnVmLCBsZW4gKTsKKyAgICAgIEZXcml0ZUJ1ZmZlci5Qb3NpdGlvbiA6PSAwOworICAgICAgRldyaXRlQnVmZmVyLlJlYWQoIFBvaW50ZXIoQGJ1ZlswXSleLCBsZW4gKTsKKyAgICAgIEZTdHJlYW0uV3JpdGUoIGJ1ZiwgMCwgbGVuICk7CisgICAgZW5kOworICAgIEZXcml0ZUJ1ZmZlci5DbGVhcjsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUQnVmZmVyZWRTdHJlYW1JbXBsLklzT3BlbjogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSAoRldyaXRlQnVmZmVyIDw+IG5pbCkKKyAgICAgICAgYW5kIChGUmVhZEJ1ZmZlciA8PiBuaWwpCisgICAgICAgIGFuZCAoRlN0cmVhbSA8PiBuaWwpCisgICAgICAgIGFuZCBGU3RyZWFtLklzT3BlbjsKK2VuZDsKKworcHJvY2VkdXJlIFRCdWZmZXJlZFN0cmVhbUltcGwuT3BlbjsKK2JlZ2luCisgIEZTdHJlYW0uT3BlbjsKK2VuZDsKKworZnVuY3Rpb24gVEJ1ZmZlcmVkU3RyZWFtSW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Cit2YXIKKyAgblJlYWQgOiBJbnRlZ2VyOworICB0ZW1wYnVmIDogVEJ5dGVzOworICBwVG1wIDogUEJ5dGU7CitiZWdpbgorICBpbmhlcml0ZWQ7CisgIFJlc3VsdCA6PSAwOworCisgIGlmIElzT3BlbiB0aGVuIGJlZ2luCisgICAgd2hpbGUgY291bnQgPiAwIGRvIGJlZ2luCisKKyAgICAgIGlmIEZSZWFkQnVmZmVyLlBvc2l0aW9uID49IEZSZWFkQnVmZmVyLlNpemUgdGhlbiBiZWdpbgorICAgICAgICBGUmVhZEJ1ZmZlci5DbGVhcjsKKyAgICAgICAgU2V0TGVuZ3RoKCB0ZW1wYnVmLCBGQnVmU2l6ZSk7CisgICAgICAgIG5SZWFkIDo9IEZTdHJlYW0uUmVhZCggdGVtcGJ1ZiwgMCwgRkJ1ZlNpemUgKTsKKyAgICAgICAgaWYgblJlYWQgPSAwIHRoZW4gQnJlYWs7IC8vIGF2b2lkIGluZmluaXRlIGxvb3AKKworICAgICAgICBGUmVhZEJ1ZmZlci5Xcml0ZUJ1ZmZlciggUG9pbnRlcihAdGVtcGJ1ZlswXSleLCBuUmVhZCApOworICAgICAgICBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiA6PSAwOworICAgICAgZW5kOworCisgICAgICBpZiBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiA8IEZSZWFkQnVmZmVyLlNpemUgdGhlbiBiZWdpbgorICAgICAgICBuUmVhZCA6PSBNaW4oIEZSZWFkQnVmZmVyLlNpemUgLSBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiwgY291bnQpOworICAgICAgICBwVG1wICA6PSBwQnVmOworICAgICAgICBJbmMoIHBUbXAsIG9mZnNldCk7CisgICAgICAgIEluYyggUmVzdWx0LCBGUmVhZEJ1ZmZlci5SZWFkKCBwVG1wXiwgblJlYWQpKTsKKyAgICAgICAgRGVjKCBjb3VudCwgblJlYWQpOworICAgICAgICBJbmMoIG9mZnNldCwgblJlYWQpOworICAgICAgZW5kOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUQnVmZmVyZWRTdHJlYW1JbXBsLlRvQXJyYXk6IFRCeXRlczsKK3ZhciBsZW4gOiBJbnRlZ2VyOworYmVnaW4KKyAgbGVuIDo9IDA7CisKKyAgaWYgSXNPcGVuIHRoZW4gYmVnaW4KKyAgICBsZW4gOj0gRlJlYWRCdWZmZXIuU2l6ZTsKKyAgZW5kOworCisgIFNldExlbmd0aCggUmVzdWx0LCBsZW4pOworCisgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgorICAgIEZSZWFkQnVmZmVyLlBvc2l0aW9uIDo9IDA7CisgICAgRlJlYWRCdWZmZXIuUmVhZCggUG9pbnRlcihAUmVzdWx0WzBdKV4sIGxlbiApOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQnVmZmVyZWRTdHJlYW1JbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7Cit2YXIgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworICBpZiBjb3VudCA+IDAgdGhlbiBiZWdpbgorICAgIGlmIElzT3BlbiB0aGVuIGJlZ2luCisgICAgICBwVG1wIDo9IHBCdWY7CisgICAgICBJbmMoIHBUbXAsIG9mZnNldCk7CisgICAgICBGV3JpdGVCdWZmZXIuV3JpdGUoIHBUbXBeLCBjb3VudCApOworICAgICAgaWYgRldyaXRlQnVmZmVyLlNpemUgPiBGQnVmU2l6ZSB0aGVuIGJlZ2luCisgICAgICAgIEZsdXNoOworICAgICAgZW5kOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCit7IFRTdHJlYW1UcmFuc3BvcnRJbXBsIH0KKworY29uc3RydWN0b3IgVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBjb25zdCBBSW5wdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOyBjb25zdCBBT3V0cHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGSW5wdXRTdHJlYW0gOj0gQUlucHV0U3RyZWFtOworICBGT3V0cHV0U3RyZWFtIDo9IEFPdXRwdXRTdHJlYW07CitlbmQ7CisKK2Rlc3RydWN0b3IgVFN0cmVhbVRyYW5zcG9ydEltcGwuRGVzdHJveTsKK2JlZ2luCisgIEZJbnB1dFN0cmVhbSA6PSBuaWw7CisgIEZPdXRwdXRTdHJlYW0gOj0gbmlsOworICBpbmhlcml0ZWQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DbG9zZTsKK2JlZ2luCisgIEZJbnB1dFN0cmVhbSA6PSBuaWw7CisgIEZPdXRwdXRTdHJlYW0gOj0gbmlsOworZW5kOworCitwcm9jZWR1cmUgVFN0cmVhbVRyYW5zcG9ydEltcGwuRmx1c2g7CitiZWdpbgorICBpZiBGT3V0cHV0U3RyZWFtID0gbmlsIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0Nhbm5vdCBmbHVzaCBudWxsIG91dHB1dHN0cmVhbScgKTsKKyAgZW5kOworCisgIEZPdXRwdXRTdHJlYW0uRmx1c2g7CitlbmQ7CisKK2Z1bmN0aW9uIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkdldElucHV0U3RyZWFtOiBJVGhyaWZ0U3RyZWFtOworYmVnaW4KKyAgUmVzdWx0IDo9IEZJbnB1dFN0cmVhbTsKK2VuZDsKKworZnVuY3Rpb24gVFN0cmVhbVRyYW5zcG9ydEltcGwuR2V0SXNPcGVuOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IFRydWU7CitlbmQ7CisKK2Z1bmN0aW9uIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkdldE91dHB1dFN0cmVhbTogSVRocmlmdFN0cmVhbTsKK2JlZ2luCisgIFJlc3VsdCA6PSBGT3V0cHV0U3RyZWFtOworZW5kOworCitwcm9jZWR1cmUgVFN0cmVhbVRyYW5zcG9ydEltcGwuT3BlbjsKK2JlZ2luCisKK2VuZDsKKworZnVuY3Rpb24gVFN0cmVhbVRyYW5zcG9ydEltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIGlmIEZJbnB1dFN0cmVhbSA9IG5pbCB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYW5ub3QgcmVhZCBmcm9tIG51bGwgaW5wdXRzdHJlYW0nICk7CisgIGVuZDsKKworICBSZXN1bHQgOj0gRklucHV0U3RyZWFtLlJlYWQoIHBCdWYsYnVmbGVuLCBvZmYsIGxlbiApOworZW5kOworCitwcm9jZWR1cmUgVFN0cmVhbVRyYW5zcG9ydEltcGwuV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOworYmVnaW4KKyAgaWYgRk91dHB1dFN0cmVhbSA9IG5pbCB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYW5ub3Qgd3JpdGUgdG8gbnVsbCBvdXRwdXRzdHJlYW0nICk7CisgIGVuZDsKKworICBGT3V0cHV0U3RyZWFtLldyaXRlKCBwQnVmLCBvZmYsIGxlbiApOworZW5kOworCit7IFRCdWZmZXJlZFRyYW5zcG9ydEltcGwgfQorCitjb25zdHJ1Y3RvciBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZSggY29uc3QgQVRyYW5zcG9ydDogSVN0cmVhbVRyYW5zcG9ydCk7CitiZWdpbgorICAvL25vIGluaGVyaXRlZDsKKyAgQ3JlYXRlKCBBVHJhbnNwb3J0LCAxMDI0ICk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBjb25zdCBBVHJhbnNwb3J0OiBJU3RyZWFtVHJhbnNwb3J0OyAgQUJ1ZlNpemU6IEludGVnZXIpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlRyYW5zcG9ydCA6PSBBVHJhbnNwb3J0OworICBGQnVmU2l6ZSA6PSBBQnVmU2l6ZTsKKyAgSW5pdEJ1ZmZlcnM7CitlbmQ7CisKK3Byb2NlZHVyZSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkNsb3NlOworYmVnaW4KKyAgRlRyYW5zcG9ydC5DbG9zZTsKKyAgRklucHV0QnVmZmVyIDo9IG5pbDsKKyAgRk91dHB1dEJ1ZmZlciA6PSBuaWw7ICAKK2VuZDsKKworcHJvY2VkdXJlIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuRmx1c2g7CitiZWdpbgorICBpZiBGT3V0cHV0QnVmZmVyIDw+IG5pbCB0aGVuIGJlZ2luCisgICAgRk91dHB1dEJ1ZmZlci5GbHVzaDsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkdldElzT3BlbjogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGVHJhbnNwb3J0LklzT3BlbjsKK2VuZDsKKworZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5HZXRVbmRlcmx5aW5nVHJhbnNwb3J0OiBJVHJhbnNwb3J0OworYmVnaW4KKyAgUmVzdWx0IDo9IEZUcmFuc3BvcnQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkluaXRCdWZmZXJzOworYmVnaW4KKyAgaWYgRlRyYW5zcG9ydC5JbnB1dFN0cmVhbSA8PiBuaWwgdGhlbiBiZWdpbgorICAgIEZJbnB1dEJ1ZmZlciA6PSBUQnVmZmVyZWRTdHJlYW1JbXBsLkNyZWF0ZSggRlRyYW5zcG9ydC5JbnB1dFN0cmVhbSwgRkJ1ZlNpemUgKTsKKyAgZW5kOworICBpZiBGVHJhbnNwb3J0Lk91dHB1dFN0cmVhbSA8PiBuaWwgdGhlbiBiZWdpbgorICAgIEZPdXRwdXRCdWZmZXIgOj0gVEJ1ZmZlcmVkU3RyZWFtSW1wbC5DcmVhdGUoIEZUcmFuc3BvcnQuT3V0cHV0U3RyZWFtLCBGQnVmU2l6ZSApOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLk9wZW47CitiZWdpbgorICBGVHJhbnNwb3J0Lk9wZW47CisgIEluaXRCdWZmZXJzOyAgLy8gd2UgbmVlZCB0byBnZXQgdGhlIGJ1ZmZlcnMgdG8gbWF0Y2ggRlRyYW5zcG9ydCBzdWJzdHJlYW1zIGFnYWluCitlbmQ7CisKK2Z1bmN0aW9uIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSAwOworICBpZiBGSW5wdXRCdWZmZXIgPD4gbmlsIHRoZW4gYmVnaW4KKyAgICBSZXN1bHQgOj0gRklucHV0QnVmZmVyLlJlYWQoIHBCdWYsYnVmbGVuLCBvZmYsIGxlbiApOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsKK2JlZ2luCisgIGlmIEZPdXRwdXRCdWZmZXIgPD4gbmlsIHRoZW4gYmVnaW4KKyAgICBGT3V0cHV0QnVmZmVyLldyaXRlKCBwQnVmLCBvZmYsIGxlbiApOworICBlbmQ7CitlbmQ7CisKK3sgVEZyYW1lZFRyYW5zcG9ydEltcGwgfQorCit7JElGREVGIEhBVkVfQ0xBU1NfQ1RPUn0KK2NsYXNzIGNvbnN0cnVjdG9yIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZTsKK2JlZ2luCisgIFNldExlbmd0aCggRkhlYWRlcl9EdW1teSwgRkhlYWRlclNpemUpOworICBGaWxsQ2hhciggRkhlYWRlcl9EdW1teVswXSwgTGVuZ3RoKCBGSGVhZGVyX0R1bW15KSAqIFNpemVPZiggQnl0ZSApLCAwKTsKK2VuZDsKK3skRUxTRX0KK3Byb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbF9Jbml0aWFsaXplOworYmVnaW4KKyAgU2V0TGVuZ3RoKCBURnJhbWVkVHJhbnNwb3J0SW1wbC5GSGVhZGVyX0R1bW15LCBURnJhbWVkVHJhbnNwb3J0SW1wbC5GSGVhZGVyU2l6ZSk7CisgIEZpbGxDaGFyKCBURnJhbWVkVHJhbnNwb3J0SW1wbC5GSGVhZGVyX0R1bW15WzBdLAorICAgIExlbmd0aCggVEZyYW1lZFRyYW5zcG9ydEltcGwuRkhlYWRlcl9EdW1teSkgKiBTaXplT2YoIEJ5dGUgKSwgMCk7CitlbmQ7Cit7JEVORElGfQorCitjb25zdHJ1Y3RvciBURnJhbWVkVHJhbnNwb3J0SW1wbC5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBJbml0V3JpdGVCdWZmZXI7CitlbmQ7CisKK3Byb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbC5DbG9zZTsKK2JlZ2luCisgIEZUcmFuc3BvcnQuQ2xvc2U7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZSggY29uc3QgQVRyYW5zOiBJVHJhbnNwb3J0KTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEluaXRXcml0ZUJ1ZmZlcjsKKyAgRlRyYW5zcG9ydCA6PSBBVHJhbnM7CitlbmQ7CisKK2Rlc3RydWN0b3IgVEZyYW1lZFRyYW5zcG9ydEltcGwuRGVzdHJveTsKK2JlZ2luCisgIEZXcml0ZUJ1ZmZlci5GcmVlOworICBGUmVhZEJ1ZmZlci5GcmVlOworICBpbmhlcml0ZWQ7CitlbmQ7CisKK3Byb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbC5GbHVzaDsKK3ZhcgorICBidWYgOiBUQnl0ZXM7CisgIGxlbiA6IEludGVnZXI7CisgIGRhdGFfbGVuIDogSW50ZWdlcjsKKworYmVnaW4KKyAgbGVuIDo9IEZXcml0ZUJ1ZmZlci5TaXplOworICBTZXRMZW5ndGgoIGJ1ZiwgbGVuKTsKKyAgaWYgbGVuID4gMCB0aGVuIGJlZ2luCisgICAgU3lzdGVtLk1vdmUoIEZXcml0ZUJ1ZmZlci5NZW1vcnleLCBidWZbMF0sIGxlbiApOworICBlbmQ7CisKKyAgZGF0YV9sZW4gOj0gbGVuIC0gRkhlYWRlclNpemU7CisgIGlmIChkYXRhX2xlbiA8IDApIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJ1RGcmFtZWRUcmFuc3BvcnQuRmx1c2g6IGRhdGFfbGVuIDwgMCcgKTsKKyAgZW5kOworCisgIEluaXRXcml0ZUJ1ZmZlcjsKKworICBidWZbMF0gOj0gQnl0ZSgkRkYgYW5kIChkYXRhX2xlbiBzaHIgMjQpKTsKKyAgYnVmWzFdIDo9IEJ5dGUoJEZGIGFuZCAoZGF0YV9sZW4gc2hyIDE2KSk7CisgIGJ1ZlsyXSA6PSBCeXRlKCRGRiBhbmQgKGRhdGFfbGVuIHNociA4KSk7CisgIGJ1ZlszXSA6PSBCeXRlKCRGRiBhbmQgZGF0YV9sZW4pOworCisgIEZUcmFuc3BvcnQuV3JpdGUoIGJ1ZiwgMCwgbGVuICk7CisgIEZUcmFuc3BvcnQuRmx1c2g7CitlbmQ7CisKK2Z1bmN0aW9uIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkdldElzT3BlbjogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGVHJhbnNwb3J0LklzT3BlbjsKK2VuZDsKKwordHlwZQorICBUQWNjZXNzTWVtb3J5U3RyZWFtID0gY2xhc3MoVE1lbW9yeVN0cmVhbSkKKyAgZW5kOworCitwcm9jZWR1cmUgVEZyYW1lZFRyYW5zcG9ydEltcGwuSW5pdFdyaXRlQnVmZmVyOworYmVnaW4KKyAgRldyaXRlQnVmZmVyLkZyZWU7CisgIEZXcml0ZUJ1ZmZlciA6PSBUTWVtb3J5U3RyZWFtLkNyZWF0ZTsKKyAgVEFjY2Vzc01lbW9yeVN0cmVhbShGV3JpdGVCdWZmZXIpLkNhcGFjaXR5IDo9IDEwMjQ7CisgIEZXcml0ZUJ1ZmZlci5Xcml0ZSggUG9pbnRlcihARkhlYWRlcl9EdW1teVswXSleLCBGSGVhZGVyU2l6ZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbC5PcGVuOworYmVnaW4KKyAgRlRyYW5zcG9ydC5PcGVuOworZW5kOworCitmdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0SW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOwordmFyIHBUbXAgOiBQQnl0ZTsKK2JlZ2luCisgIGlmIGxlbiA+IChidWZsZW4tb2ZmKQorICB0aGVuIGxlbiA6PSBidWZsZW4tb2ZmOworCisgIHBUbXAgOj0gcEJ1ZjsKKyAgSW5jKCBwVG1wLCBvZmYpOworCisgIGlmIChGUmVhZEJ1ZmZlciA8PiBuaWwpIGFuZCAobGVuID4gMCkgdGhlbiBiZWdpbgorICAgIHJlc3VsdCA6PSBGUmVhZEJ1ZmZlci5SZWFkKCBwVG1wXiwgbGVuKTsKKyAgICBpZiByZXN1bHQgPiAwIHRoZW4gYmVnaW4KKyAgICAgIEV4aXQ7CisgICAgZW5kOworICBlbmQ7CisKKyAgUmVhZEZyYW1lOworICBpZiBsZW4gPiAwCisgIHRoZW4gUmVzdWx0IDo9IEZSZWFkQnVmZmVyLlJlYWQoIHBUbXBeLCBsZW4pCisgIGVsc2UgUmVzdWx0IDo9IDA7CitlbmQ7CisKK3Byb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbC5SZWFkRnJhbWU7Cit2YXIKKyAgaTMycmQgOiBUQnl0ZXM7CisgIHNpemUgOiBJbnRlZ2VyOworICBidWZmIDogVEJ5dGVzOworYmVnaW4KKyAgU2V0TGVuZ3RoKCBpMzJyZCwgRkhlYWRlclNpemUgKTsKKyAgRlRyYW5zcG9ydC5SZWFkQWxsKCBpMzJyZCwgMCwgRkhlYWRlclNpemUpOworICBzaXplIDo9CisgICAgKChpMzJyZFswXSBhbmQgJEZGKSBzaGwgMjQpIG9yCisgICAgKChpMzJyZFsxXSBhbmQgJEZGKSBzaGwgMTYpIG9yCisgICAgKChpMzJyZFsyXSBhbmQgJEZGKSBzaGwgOCkgb3IKKyAgICAgKGkzMnJkWzNdIGFuZCAkRkYpOworICBTZXRMZW5ndGgoIGJ1ZmYsIHNpemUgKTsKKyAgRlRyYW5zcG9ydC5SZWFkQWxsKCBidWZmLCAwLCBzaXplICk7CisgIEZSZWFkQnVmZmVyLkZyZWU7CisgIEZSZWFkQnVmZmVyIDo9IFRNZW1vcnlTdHJlYW0uQ3JlYXRlOworICBpZiBMZW5ndGgoYnVmZikgPiAwCisgIHRoZW4gRlJlYWRCdWZmZXIuV3JpdGUoIFBvaW50ZXIoQGJ1ZmZbMF0pXiwgc2l6ZSApOworICBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiA6PSAwOworZW5kOworCitwcm9jZWR1cmUgVEZyYW1lZFRyYW5zcG9ydEltcGwuV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOwordmFyIHBUbXAgOiBQQnl0ZTsKK2JlZ2luCisgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgorICAgIHBUbXAgOj0gcEJ1ZjsKKyAgICBJbmMoIHBUbXAsIG9mZik7CisKKyAgICBGV3JpdGVCdWZmZXIuV3JpdGUoIHBUbXBeLCBsZW4gKTsKKyAgZW5kOworZW5kOworCit7IFRGcmFtZWRUcmFuc3BvcnQuVEZhY3RvcnkgfQorCitmdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0SW1wbC5URmFjdG9yeS5HZXRUcmFuc3BvcnQoIGNvbnN0IEFUcmFuczogSVRyYW5zcG9ydCk6IElUcmFuc3BvcnQ7CitiZWdpbgorICBSZXN1bHQgOj0gVEZyYW1lZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBBVHJhbnMgKTsKK2VuZDsKKworeyBUVGNwU29ja2V0U3RyZWFtSW1wbCB9CisKK3Byb2NlZHVyZSBUVGNwU29ja2V0U3RyZWFtSW1wbC5DbG9zZTsKK2JlZ2luCisgIEZUY3BDbGllbnQuQ2xvc2U7CitlbmQ7CisKK3skSUZERUYgT0xEX1NPQ0tFVFN9Citjb25zdHJ1Y3RvciBUVGNwU29ja2V0U3RyZWFtSW1wbC5DcmVhdGUoIGNvbnN0IEFUY3BDbGllbnQ6IFRDdXN0b21JcENsaWVudDsgY29uc3QgYVRpbWVvdXQgOiBJbnRlZ2VyKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZUY3BDbGllbnQgOj0gQVRjcENsaWVudDsKKyAgRlRpbWVvdXQgOj0gYVRpbWVvdXQ7CitlbmQ7Cit7JEVMU0V9Citjb25zdHJ1Y3RvciBUVGNwU29ja2V0U3RyZWFtSW1wbC5DcmVhdGUoIGNvbnN0IEFUY3BDbGllbnQ6IFRTb2NrZXQ7IGNvbnN0IGFUaW1lb3V0IDogTG9uZ3dvcmQpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlRjcENsaWVudCA6PSBBVGNwQ2xpZW50OworICBpZiBhVGltZW91dCA9IDAgdGhlbgorICAgIEZUY3BDbGllbnQuUmVjdlRpbWVvdXQgOj0gU0xFRVBfVElNRQorICBlbHNlCisgICAgRlRjcENsaWVudC5SZWN2VGltZW91dCA6PSBhVGltZW91dDsKKyAgRlRjcENsaWVudC5TZW5kVGltZW91dCA6PSBhVGltZW91dDsKK2VuZDsKK3skRU5ESUZ9CisKK3Byb2NlZHVyZSBUVGNwU29ja2V0U3RyZWFtSW1wbC5GbHVzaDsKK2JlZ2luCisKK2VuZDsKKworZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuSXNPcGVuOiBCb29sZWFuOworYmVnaW4KK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgIFJlc3VsdCA6PSBGVGNwQ2xpZW50LkFjdGl2ZTsKK3skRUxTRX0KKyAgUmVzdWx0IDo9IEZUY3BDbGllbnQuSXNPcGVuOworeyRFTkRJRn0KK2VuZDsKKworcHJvY2VkdXJlIFRUY3BTb2NrZXRTdHJlYW1JbXBsLk9wZW47CitiZWdpbgorICBGVGNwQ2xpZW50Lk9wZW47CitlbmQ7CisKKworeyRJRkRFRiBPTERfU09DS0VUU30KK2Z1bmN0aW9uIFRUY3BTb2NrZXRTdHJlYW1JbXBsLlNlbGVjdCggUmVhZFJlYWR5LCBXcml0ZVJlYWR5LCBFeGNlcHRGbGFnOiBQQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZU91dDogSW50ZWdlcjsgdmFyIHdzYUVycm9yIDogSW50ZWdlcik6IEludGVnZXI7Cit2YXIKKyAgUmVhZEZkczogVEZEc2V0OworICBSZWFkRmRzcHRyOiBQRkRzZXQ7CisgIFdyaXRlRmRzOiBURkRzZXQ7CisgIFdyaXRlRmRzcHRyOiBQRkRzZXQ7CisgIEV4Y2VwdEZkczogVEZEc2V0OworICBFeGNlcHRGZHNwdHI6IFBGRHNldDsKKyAgdHY6IHRpbWV2YWw7CisgIFRpbWVwdHI6IFBUaW1ldmFsOworICBzb2NrZXQgOiBUU29ja2V0OworYmVnaW4KKyAgaWYgbm90IEZUY3BDbGllbnQuQWN0aXZlIHRoZW4gYmVnaW4KKyAgICB3c2FFcnJvciA6PSBXU0FFSU5WQUw7CisgICAgRXhpdCggU09DS0VUX0VSUk9SKTsKKyAgZW5kOworCisgIHNvY2tldCA6PSBGVGNwQ2xpZW50LkhhbmRsZTsKKworICBpZiBBc3NpZ25lZChSZWFkUmVhZHkpIHRoZW4gYmVnaW4KKyAgICBSZWFkRmRzcHRyIDo9IEBSZWFkRmRzOworICAgIEZEX1pFUk8oUmVhZEZkcyk7CisgICAgRkRfU0VUKHNvY2tldCwgUmVhZEZkcyk7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgUmVhZEZkc3B0ciA6PSBuaWw7CisgIGVuZDsKKworICBpZiBBc3NpZ25lZChXcml0ZVJlYWR5KSB0aGVuIGJlZ2luCisgICAgV3JpdGVGZHNwdHIgOj0gQFdyaXRlRmRzOworICAgIEZEX1pFUk8oV3JpdGVGZHMpOworICAgIEZEX1NFVChzb2NrZXQsIFdyaXRlRmRzKTsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBXcml0ZUZkc3B0ciA6PSBuaWw7CisgIGVuZDsKKworICBpZiBBc3NpZ25lZChFeGNlcHRGbGFnKSB0aGVuIGJlZ2luCisgICAgRXhjZXB0RmRzcHRyIDo9IEBFeGNlcHRGZHM7CisgICAgRkRfWkVSTyhFeGNlcHRGZHMpOworICAgIEZEX1NFVChzb2NrZXQsIEV4Y2VwdEZkcyk7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgRXhjZXB0RmRzcHRyIDo9IG5pbDsKKyAgZW5kOworCisgIGlmIFRpbWVPdXQgPj0gMCB0aGVuIGJlZ2luCisgICAgdHYudHZfc2VjIDo9IFRpbWVPdXQgZGl2IDEwMDA7CisgICAgdHYudHZfdXNlYyA6PSAgMTAwMCAqIChUaW1lT3V0IG1vZCAxMDAwKTsKKyAgICBUaW1lcHRyIDo9IEB0djsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBUaW1lcHRyIDo9IG5pbDsgIC8vIHdhaXQgZm9yZXZlcgorICBlbmQ7CisKKyAgd3NhRXJyb3IgOj0gMDsKKyAgdHJ5CisgICAgeyRJRkRFRiBNU1dJTkRPV1N9CisgICAgICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICAgICAgcmVzdWx0IDo9IFdpblNvY2suc2VsZWN0KCAgICAgICAgc29ja2V0ICsgMSwgUmVhZEZkc3B0ciwgV3JpdGVGZHNwdHIsIEV4Y2VwdEZkc3B0ciwgVGltZXB0cik7CisgICAgICB7JEVMU0V9CisgICAgICByZXN1bHQgOj0gV2luYXBpLldpblNvY2suc2VsZWN0KCBzb2NrZXQgKyAxLCBSZWFkRmRzcHRyLCBXcml0ZUZkc3B0ciwgRXhjZXB0RmRzcHRyLCBUaW1lcHRyKTsKKyAgICAgIHskRU5ESUZ9CisgICAgeyRFTkRJRn0KKyAgICB7JElGREVGIExJTlVYfQorICAgICAgcmVzdWx0IDo9IExpYmMuc2VsZWN0KCAgICAgICAgICAgc29ja2V0ICsgMSwgUmVhZEZkc3B0ciwgV3JpdGVGZHNwdHIsIEV4Y2VwdEZkc3B0ciwgVGltZXB0cik7CisgICAgeyRFTkRJRn0KKwkKKyAgICBpZiByZXN1bHQgPSBTT0NLRVRfRVJST1IKKyAgICB0aGVuIHdzYUVycm9yIDo9IFdTQUdldExhc3RFcnJvcjsKKworICBleGNlcHQKKyAgICByZXN1bHQgOj0gU09DS0VUX0VSUk9SOworICBlbmQ7CisKKyAgaWYgQXNzaWduZWQoUmVhZFJlYWR5KSB0aGVuCisgICBSZWFkUmVhZHleIDo9IEZEX0lTU0VUKHNvY2tldCwgUmVhZEZkcyk7CisgICAKKyAgaWYgQXNzaWduZWQoV3JpdGVSZWFkeSkgdGhlbgorICAgIFdyaXRlUmVhZHleIDo9IEZEX0lTU0VUKHNvY2tldCwgV3JpdGVGZHMpOworICAKKyAgaWYgQXNzaWduZWQoRXhjZXB0RmxhZykgdGhlbgorICAgIEV4Y2VwdEZsYWdeIDo9IEZEX0lTU0VUKHNvY2tldCwgRXhjZXB0RmRzKTsKK2VuZDsKK3skRU5ESUZ9CisKK3skSUZERUYgT0xEX1NPQ0tFVFN9CitmdW5jdGlvbiBUVGNwU29ja2V0U3RyZWFtSW1wbC5XYWl0Rm9yRGF0YSggVGltZU91dCA6IEludGVnZXI7IHBCdWYgOiBQb2ludGVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2lyZWRCeXRlcyA6IEludGVnZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdzYUVycm9yLCBieXRlc1JlYWR5IDogSW50ZWdlcik6IFRXYWl0Rm9yRGF0YTsKK3ZhciBiQ2FuUmVhZCwgYkVycm9yIDogQm9vbGVhbjsKKyAgICByZXR2YWwgOiBJbnRlZ2VyOworY29uc3QgCisgIE1TR19QRUVLID0geyRJRkRFRiBPTERfVU5JVF9OQU1FU30gV2luU29jay5NU0dfUEVFSyAgeyRFTFNFfSBXaW5hcGkuV2luU29jay5NU0dfUEVFSyAgeyRFTkRJRn07CitiZWdpbgorICBieXRlc1JlYWR5IDo9IDA7CisKKyAgLy8gVGhlIHNlbGVjdCBmdW5jdGlvbiByZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2Ygc29ja2V0IGhhbmRsZXMgdGhhdCBhcmUgcmVhZHkKKyAgLy8gYW5kIGNvbnRhaW5lZCBpbiB0aGUgZmRfc2V0IHN0cnVjdHVyZXMsIHplcm8gaWYgdGhlIHRpbWUgbGltaXQgZXhwaXJlZCwKKyAgLy8gb3IgU09DS0VUX0VSUk9SIGlmIGFuIGVycm9yIG9jY3VycmVkLiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIFNPQ0tFVF9FUlJPUiwKKyAgLy8gV1NBR2V0TGFzdEVycm9yIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGEgc3BlY2lmaWMgZXJyb3IgY29kZS4KKyAgcmV0dmFsIDo9IFNlbGYuU2VsZWN0KCBAYkNhblJlYWQsIG5pbCwgQGJFcnJvciwgVGltZU91dCwgd3NhRXJyb3IpOworICBpZiByZXR2YWwgPSBTT0NLRVRfRVJST1IKKyAgdGhlbiBFeGl0KCBUV2FpdEZvckRhdGEud2ZkX0Vycm9yKTsKKyAgaWYgKHJldHZhbCA9IDApIG9yIG5vdCBiQ2FuUmVhZAorICB0aGVuIEV4aXQoIFRXYWl0Rm9yRGF0YS53ZmRfVGltZW91dCk7CisKKyAgLy8gcmVjdigpIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCwgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgIC8vIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSAwIHdoZW4gdGhlIHBlZXIgaGFzIHBlcmZvcm1lZCBhbiBvcmRlcmx5IHNodXRkb3duLgorICAKKyAgcmV0dmFsIDo9IHJlY3YoIEZUY3BDbGllbnQuSGFuZGxlLCBwQnVmXiwgRGVzaXJlZEJ5dGVzLCBNU0dfUEVFSyk7CisgIGlmIHJldHZhbCA8PSAwCisgIHRoZW4gRXhpdCggVFdhaXRGb3JEYXRhLndmZF9FcnJvcik7CisKKyAgLy8gYXQgbGVhc3Qgd2UgaGF2ZSBzb21lIGRhdGEKKyAgYnl0ZXNSZWFkeSA6PSBNaW4oIHJldHZhbCwgRGVzaXJlZEJ5dGVzKTsKKyAgcmVzdWx0IDo9IFRXYWl0Rm9yRGF0YS53ZmRfSGF2ZURhdGE7CitlbmQ7Cit7JEVORElGfQorCit7JElGREVGIE9MRF9TT0NLRVRTfQorZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworLy8gb2xkIHNvY2tldHMgdmVyc2lvbgordmFyIHdmZCA6IFRXYWl0Rm9yRGF0YTsKKyAgICB3c2FFcnJvciwKKyAgICBtc2VjcyA6IEludGVnZXI7CisgICAgbkJ5dGVzIDogSW50ZWdlcjsKKyAgICBwVG1wIDogUEJ5dGU7CitiZWdpbgorICBpbmhlcml0ZWQ7CisKKyAgaWYgRlRpbWVvdXQgPiAwCisgIHRoZW4gbXNlY3MgOj0gRlRpbWVvdXQKKyAgZWxzZSBtc2VjcyA6PSBERUZBVUxUX1RIUklGVF9USU1FT1VUOworCisgIHJlc3VsdCA6PSAwOworICBwVG1wICAgOj0gcEJ1ZjsKKyAgSW5jKCBwVG1wLCBvZmZzZXQpOworICB3aGlsZSBjb3VudCA+IDAgZG8gYmVnaW4KKworICAgIHdoaWxlIFRSVUUgZG8gYmVnaW4KKyAgICAgIHdmZCA6PSBXYWl0Rm9yRGF0YSggbXNlY3MsIHBUbXAsIGNvdW50LCB3c2FFcnJvciwgbkJ5dGVzKTsKKyAgICAgIGNhc2Ugd2ZkIG9mCisgICAgICAgIFRXYWl0Rm9yRGF0YS53ZmRfRXJyb3IgICAgOiAgRXhpdDsKKyAgICAgICAgVFdhaXRGb3JEYXRhLndmZF9IYXZlRGF0YSA6ICBCcmVhazsKKyAgICAgICAgVFdhaXRGb3JEYXRhLndmZF9UaW1lb3V0ICA6ICBiZWdpbgorICAgICAgICAgIGlmIChGVGltZW91dCA9IDApCisgICAgICAgICAgdGhlbiBFeGl0CisgICAgICAgICAgZWxzZSBiZWdpbgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZShTeXNFcnJvck1lc3NhZ2UoQ2FyZGluYWwod3NhRXJyb3IpKSk7CisKKyAgICAgICAgICBlbmQ7CisgICAgICAgIGVuZDsKKyAgICAgIGVsc2UKKyAgICAgICAgQVNTRVJUKCBGQUxTRSk7CisgICAgICBlbmQ7CisgICAgZW5kOworCisgICAgLy8gcmVkdWNlIHRoZSB0aW1lb3V0IG9uY2Ugd2UgZ290IGRhdGEKKyAgICBpZiBGVGltZW91dCA+IDAKKyAgICB0aGVuIG1zZWNzIDo9IEZUaW1lb3V0IGRpdiAxMAorICAgIGVsc2UgbXNlY3MgOj0gREVGQVVMVF9USFJJRlRfVElNRU9VVCBkaXYgMTA7CisgICAgbXNlY3MgOj0gTWF4KCBtc2VjcywgMjAwKTsKKworICAgIEFTU0VSVCggbkJ5dGVzIDw9IGNvdW50KTsKKyAgICBuQnl0ZXMgOj0gRlRjcENsaWVudC5SZWNlaXZlQnVmKCBwVG1wXiwgbkJ5dGVzKTsKKyAgICBJbmMoIHBUbXAsIG5CeXRlcyk7CisgICAgRGVjKCBjb3VudCwgbkJ5dGVzKTsKKyAgICBJbmMoIHJlc3VsdCwgbkJ5dGVzKTsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUVGNwU29ja2V0U3RyZWFtSW1wbC5Ub0FycmF5OiBUQnl0ZXM7CisvLyBvbGQgc29ja2V0cyB2ZXJzaW9uCit2YXIgbGVuIDogSW50ZWdlcjsKK2JlZ2luCisgIGxlbiA6PSAwOworICBpZiBJc09wZW4gdGhlbiBiZWdpbgorICAgIGxlbiA6PSBGVGNwQ2xpZW50LkJ5dGVzUmVjZWl2ZWQ7CisgIGVuZDsKKworICBTZXRMZW5ndGgoIFJlc3VsdCwgbGVuICk7CisKKyAgaWYgbGVuID4gMCB0aGVuIGJlZ2luCisgICAgRlRjcENsaWVudC5SZWNlaXZlQnVmKCBQb2ludGVyKEBSZXN1bHRbMF0pXiwgbGVuKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVFRjcFNvY2tldFN0cmVhbUltcGwuV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTsKKy8vIG9sZCBzb2NrZXRzIHZlcnNpb24KK3ZhciBiQ2FuV3JpdGUsIGJFcnJvciA6IEJvb2xlYW47CisgICAgcmV0dmFsLCB3c2FFcnJvciA6IEludGVnZXI7CisgICAgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworCisgIGlmIG5vdCBGVGNwQ2xpZW50LkFjdGl2ZQorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnbm90IG9wZW4nKTsKKworICAvLyBUaGUgc2VsZWN0IGZ1bmN0aW9uIHJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBzb2NrZXQgaGFuZGxlcyB0aGF0IGFyZSByZWFkeQorICAvLyBhbmQgY29udGFpbmVkIGluIHRoZSBmZF9zZXQgc3RydWN0dXJlcywgemVybyBpZiB0aGUgdGltZSBsaW1pdCBleHBpcmVkLAorICAvLyBvciBTT0NLRVRfRVJST1IgaWYgYW4gZXJyb3Igb2NjdXJyZWQuIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgU09DS0VUX0VSUk9SLAorICAvLyBXU0FHZXRMYXN0RXJyb3IgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYSBzcGVjaWZpYyBlcnJvciBjb2RlLgorICByZXR2YWwgOj0gU2VsZi5TZWxlY3QoIG5pbCwgQGJDYW5Xcml0ZSwgQGJFcnJvciwgRlRpbWVPdXQsIHdzYUVycm9yKTsKKyAgaWYgcmV0dmFsID0gU09DS0VUX0VSUk9SCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKFN5c0Vycm9yTWVzc2FnZShDYXJkaW5hbCh3c2FFcnJvcikpKTsKKworICBpZiAocmV0dmFsID0gMCkKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCd0aW1lZCBvdXQnKTsKKworICBpZiBiRXJyb3Igb3Igbm90IGJDYW5Xcml0ZQorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgndW5rbm93biBlcnJvcicpOworCisgIHBUbXAgOj0gcEJ1ZjsKKyAgSW5jKCBwVG1wLCBvZmZzZXQpOworICBGVGNwQ2xpZW50LlNlbmRCdWYoIHBUbXBeLCBjb3VudCk7CitlbmQ7CisKK3skRUxTRX0KKworZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworLy8gbmV3IHNvY2tldHMgdmVyc2lvbgordmFyIG5CeXRlcyA6IEludGVnZXI7CisgICAgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworCisgIHJlc3VsdCA6PSAwOworICBwVG1wICAgOj0gcEJ1ZjsKKyAgSW5jKCBwVG1wLCBvZmZzZXQpOworICB3aGlsZSBjb3VudCA+IDAgZG8gYmVnaW4KKyAgICBuQnl0ZXMgOj0gRlRjcENsaWVudC5SZWFkKCBwVG1wXiwgY291bnQpOworICAgIGlmIG5CeXRlcyA9IDAgdGhlbiBFeGl0OworICAgIEluYyggcFRtcCwgbkJ5dGVzKTsKKyAgICBEZWMoIGNvdW50LCBuQnl0ZXMpOworICAgIEluYyggcmVzdWx0LCBuQnl0ZXMpOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRUY3BTb2NrZXRTdHJlYW1JbXBsLlRvQXJyYXk6IFRCeXRlczsKKy8vIG5ldyBzb2NrZXRzIHZlcnNpb24KK3ZhciBsZW4gOiBJbnRlZ2VyOworYmVnaW4KKyAgbGVuIDo9IDA7CisgIHRyeQorICAgIGlmIEZUY3BDbGllbnQuUGVlayB0aGVuCisgICAgICByZXBlYXQKKyAgICAgICAgU2V0TGVuZ3RoKFJlc3VsdCwgTGVuZ3RoKFJlc3VsdCkgKyAxMDI0KTsKKyAgICAgICAgbGVuIDo9IEZUY3BDbGllbnQuUmVhZChSZXN1bHRbTGVuZ3RoKFJlc3VsdCkgLSAxMDI0XSwgMTAyNCk7CisgICAgICB1bnRpbCBsZW4gPCAxMDI0OworICBleGNlcHQKKyAgICBvbiBUVHJhbnNwb3J0RXhjZXB0aW9uIGRvIGJlZ2luIHsgZG9uJ3QgYWxsb3cgZGVmYXVsdCBleGNlcHRpb25zIH0gZW5kOworICAgIGVsc2UgcmFpc2U7CisgIGVuZDsKKyAgaWYgbGVuID4gMCB0aGVuCisgICAgU2V0TGVuZ3RoKFJlc3VsdCwgTGVuZ3RoKFJlc3VsdCkgLSAxMDI0ICsgbGVuKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUY3BTb2NrZXRTdHJlYW1JbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik7CisvLyBuZXcgc29ja2V0cyB2ZXJzaW9uCit2YXIgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworCisgIGlmIG5vdCBGVGNwQ2xpZW50LklzT3BlbgorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnbm90IG9wZW4nKTsKKworICBwVG1wIDo9IHBCdWY7CisgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgRlRjcENsaWVudC5Xcml0ZSggcFRtcF4sIGNvdW50KTsKK2VuZDsKKworeyRFTkRJRn0KKworCit7JElGIENvbXBpbGVyVmVyc2lvbiA8IDIxLjB9Citpbml0aWFsaXphdGlvbgorYmVnaW4KKyAgVEZyYW1lZFRyYW5zcG9ydEltcGxfSW5pdGlhbGl6ZTsKK2VuZDsKK3skSUZFTkR9CisKKworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHlwZVJlZ2lzdHJ5LnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMThlOTdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMKQEAgLTAsMCArMSw5NSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRocmlmdC5UeXBlUmVnaXN0cnk7CisKK2ludGVyZmFjZQorCit1c2VzCisgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLCBUeXBJbmZvLAorICBUaHJpZnQuUHJvdG9jb2w7CisKK3R5cGUKKyAgVEZhY3RvcnlNZXRob2Q8VD4gPSBmdW5jdGlvbjpUOworCisgIFR5cGVSZWdpc3RyeSA9IGNsYXNzCisgIHByaXZhdGUKKyAgICBjbGFzcyB2YXIgRlR5cGVJbmZvVG9GYWN0b3J5TG9va3VwIDogVERpY3Rpb25hcnk8UG9pbnRlciwgUG9pbnRlcj47CisgIHB1YmxpYworICAgIGNsYXNzIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgICBjbGFzcyBkZXN0cnVjdG9yIERlc3Ryb3k7CisgICAgY2xhc3MgcHJvY2VkdXJlIFJlZ2lzdGVyVHlwZUZhY3Rvcnk8Rj4oY29uc3QgYUZhY3RvcnlNZXRob2Q6IFRGYWN0b3J5TWV0aG9kPEY+KTsKKyAgICBjbGFzcyBmdW5jdGlvbiAgQ29uc3RydWN0PEY+OiBGOworICAgIGNsYXNzIGZ1bmN0aW9uICBDb25zdHJ1Y3RGcm9tVHlwZUluZm8oY29uc3QgYVR5cGVJbmZvOiBQVHlwZUluZm8pOiBJQmFzZTsKKyAgZW5kOworCitpbXBsZW1lbnRhdGlvbgorCisKK3sgVHlwZVJlZ2lzdHJhdGlvbiB9CisKK2NsYXNzIGNvbnN0cnVjdG9yIFR5cGVSZWdpc3RyeS5DcmVhdGU7CitiZWdpbgorICBGVHlwZUluZm9Ub0ZhY3RvcnlMb29rdXAgOj0gVERpY3Rpb25hcnk8UG9pbnRlciwgUG9pbnRlcj4uQ3JlYXRlOworZW5kOworCitjbGFzcyBkZXN0cnVjdG9yIFR5cGVSZWdpc3RyeS5EZXN0cm95OworYmVnaW4KKyAgRlR5cGVJbmZvVG9GYWN0b3J5TG9va3VwLkZyZWU7CitlbmQ7CisKK2NsYXNzIHByb2NlZHVyZSBUeXBlUmVnaXN0cnkuUmVnaXN0ZXJUeXBlRmFjdG9yeTxGPihjb25zdCBhRmFjdG9yeU1ldGhvZDogVEZhY3RvcnlNZXRob2Q8Rj4pOwordmFyCisgIFR5cGVJbmZvICAgICA6IFBvaW50ZXI7CitiZWdpbgorICBUeXBlSW5mbyA6PSBTeXN0ZW0uVHlwZUluZm8oRik7CisKKyAgaWYgKFR5cGVJbmZvIDw+IG5pbCkgYW5kIChQVHlwZUluZm8oVHlwZUluZm8pLktpbmQgPSB0a0ludGVyZmFjZSkKKyAgdGhlbiBGVHlwZUluZm9Ub0ZhY3RvcnlMb29rdXAuQWRkT3JTZXRWYWx1ZShUeXBlSW5mbywgQGFGYWN0b3J5TWV0aG9kKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVHlwZVJlZ2lzdHJ5LkNvbnN0cnVjdDxGPjogRjsKK3ZhcgorICBUeXBlSW5mbyAgICAgOiBQVHlwZUluZm87CisgIEZhY3RvcnkgICAgICA6IFBvaW50ZXI7CitiZWdpbgorICBSZXN1bHQgOj0gZGVmYXVsdChGKTsKKworICBUeXBlSW5mbyA6PSBTeXN0ZW0uVHlwZUluZm8oRik7CisKKyAgaWYgQXNzaWduZWQoVHlwZUluZm8pIGFuZCAoVHlwZUluZm8uS2luZCA9IHRrSW50ZXJmYWNlKQorICB0aGVuIGJlZ2luCisgICAgaWYgRlR5cGVJbmZvVG9GYWN0b3J5TG9va3VwLlRyeUdldFZhbHVlKFR5cGVJbmZvLCBGYWN0b3J5KQorICAgIHRoZW4gUmVzdWx0IDo9IFRGYWN0b3J5TWV0aG9kPEY+KEZhY3RvcnkpKCk7CisgIGVuZDsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVHlwZVJlZ2lzdHJ5LkNvbnN0cnVjdEZyb21UeXBlSW5mbyhjb25zdCBhVHlwZUluZm86IFBUeXBlSW5mbyk6IElCYXNlOwordmFyCisgIEZhY3RvcnkgICAgICA6IFBvaW50ZXI7CitiZWdpbgorICBSZXN1bHQgOj0gbmlsOworICBpZiBGVHlwZUluZm9Ub0ZhY3RvcnlMb29rdXAuVHJ5R2V0VmFsdWUoYVR5cGVJbmZvLCBGYWN0b3J5KQorICB0aGVuIFJlc3VsdCA6PSBJQmFzZShURmFjdG9yeU1ldGhvZDxJQmFzZT4oRmFjdG9yeSkoKSk7CitlbmQ7CisKKworCisKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5VdGlscy5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVXRpbHMucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNTc4NjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVXRpbHMucGFzCkBAIC0wLDAgKzEsMjU5IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGhyaWZ0LlV0aWxzOworCitpbnRlcmZhY2UKKworeyRJIFRocmlmdC5EZWZpbmVzLmluY30KKwordXNlcworICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICBDbGFzc2VzLCBXaW5kb3dzLCBTeXNVdGlscywgQ2hhcmFjdGVyLCBTeW5jT2JqczsKKyAgeyRFTFNFfQorICBTeXN0ZW0uQ2xhc3NlcywgV2luYXBpLldpbmRvd3MsIFN5c3RlbS5TeXNVdGlscywgU3lzdGVtLkNoYXJhY3RlciwgU3lzdGVtLlN5bmNPYmpzOworICB7JEVORElGfQorCit0eXBlCisgIElPdmVybGFwcGVkSGVscGVyID0gaW50ZXJmYWNlCisgICAgWyd7QTE4MzJFRkEtMkUwMi00ODg0LThGMDktRjBBMDI3NzE1N0ZBfSddCisgICAgZnVuY3Rpb24gT3ZlcmxhcHBlZCA6IFRPdmVybGFwcGVkOworICAgIGZ1bmN0aW9uIE92ZXJsYXBwZWRQdHIgOiBQT3ZlcmxhcHBlZDsKKyAgICBmdW5jdGlvbiBXYWl0SGFuZGxlIDogVEhhbmRsZTsKKyAgICBmdW5jdGlvbiBXYWl0Rm9yKGR3VGltZW91dDogRFdPUkQpIDogRFdPUkQ7CisgIGVuZDsKKworICBUT3ZlcmxhcHBlZEhlbHBlckltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElPdmVybGFwcGVkSGVscGVyKQorICBzdHJpY3QgcHJvdGVjdGVkCisgICAgRk92ZXJsYXBwZWQgOiBUT3ZlcmxhcHBlZDsKKyAgICBGRXZlbnQgICAgICA6IFRFdmVudDsKKworICAgIC8vIElPdmVybGFwcGVkSGVscGVyCisgICAgZnVuY3Rpb24gT3ZlcmxhcHBlZCA6IFRPdmVybGFwcGVkOworICAgIGZ1bmN0aW9uIE92ZXJsYXBwZWRQdHIgOiBQT3ZlcmxhcHBlZDsKKyAgICBmdW5jdGlvbiBXYWl0SGFuZGxlIDogVEhhbmRsZTsKKyAgICBmdW5jdGlvbiBXYWl0Rm9yKGR3VGltZW91dDogRFdPUkQpIDogRFdPUkQ7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKyAgZW5kOworCisKKyAgQmFzZTY0VXRpbHMgPSBjbGFzcyBzZWFsZWQKKyAgcHVibGljCisgICAgY2xhc3MgZnVuY3Rpb24gRW5jb2RlKCBjb25zdCBzcmMgOiBUQnl0ZXM7IHNyY09mZiwgbGVuIDogSW50ZWdlcjsgZHN0IDogVEJ5dGVzOyBkc3RPZmYgOiBJbnRlZ2VyKSA6IEludGVnZXI7IHN0YXRpYzsKKyAgICBjbGFzcyBmdW5jdGlvbiBEZWNvZGUoIGNvbnN0IHNyYyA6IFRCeXRlczsgc3JjT2ZmLCBsZW4gOiBJbnRlZ2VyOyBkc3QgOiBUQnl0ZXM7IGRzdE9mZiA6IEludGVnZXIpIDogSW50ZWdlcjsgc3RhdGljOworICBlbmQ7CisKKworICBDaGFyVXRpbHMgPSBjbGFzcyBzZWFsZWQKKyAgcHVibGljCisgICAgY2xhc3MgZnVuY3Rpb24gSXNIaWdoU3Vycm9nYXRlKCBjb25zdCBjIDogQ2hhcikgOiBCb29sZWFuOyBzdGF0aWM7IGlubGluZTsKKyAgICBjbGFzcyBmdW5jdGlvbiBJc0xvd1N1cnJvZ2F0ZSggY29uc3QgYyA6IENoYXIpIDogQm9vbGVhbjsgc3RhdGljOyBpbmxpbmU7CisgIGVuZDsKKworCit7JElGREVGIFdpbjY0fQorZnVuY3Rpb24gSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0KCB2YXIgQWRkZW5kIDogSW50NjQ7IFZhbHVlIDogSW50NjQpIDogSW50NjQ7ICAKK3skRU5ESUZ9CisKKworaW1wbGVtZW50YXRpb24KKworeyBUT3ZlcmxhcHBlZEhlbHBlckltcGwgfQorCitjb25zdHJ1Y3RvciBUT3ZlcmxhcHBlZEhlbHBlckltcGwuQ3JlYXRlOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRmlsbENoYXIoIEZPdmVybGFwcGVkLCBTaXplT2YoRk92ZXJsYXBwZWQpLCAwKTsKKyAgRkV2ZW50IDo9IFRFdmVudC5DcmVhdGUoIG5pbCwgVFJVRSwgRkFMU0UsICcnKTsgIC8vIGFsd2F5cyBNYW51YWxSZXNldCwgc2VlIE1TRE4KKyAgRk92ZXJsYXBwZWQuaEV2ZW50IDo9IEZFdmVudC5IYW5kbGU7CitlbmQ7CisKKworCitkZXN0cnVjdG9yIFRPdmVybGFwcGVkSGVscGVySW1wbC5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgRk92ZXJsYXBwZWQuaEV2ZW50IDo9IDA7CisgICAgRnJlZUFuZE5pbCggRkV2ZW50KTsKKworICBmaW5hbGx5CisgICAgaW5oZXJpdGVkIERlc3Ryb3k7CisgIGVuZDsKKworZW5kOworCisKK2Z1bmN0aW9uIFRPdmVybGFwcGVkSGVscGVySW1wbC5PdmVybGFwcGVkIDogVE92ZXJsYXBwZWQ7CitiZWdpbgorICByZXN1bHQgOj0gRk92ZXJsYXBwZWQ7CitlbmQ7CisKKworZnVuY3Rpb24gVE92ZXJsYXBwZWRIZWxwZXJJbXBsLk92ZXJsYXBwZWRQdHIgOiBQT3ZlcmxhcHBlZDsKK2JlZ2luCisgIHJlc3VsdCA6PSBARk92ZXJsYXBwZWQ7CitlbmQ7CisKKworZnVuY3Rpb24gVE92ZXJsYXBwZWRIZWxwZXJJbXBsLldhaXRIYW5kbGUgOiBUSGFuZGxlOworYmVnaW4KKyAgcmVzdWx0IDo9IEZPdmVybGFwcGVkLmhFdmVudDsKK2VuZDsKKworCitmdW5jdGlvbiBUT3ZlcmxhcHBlZEhlbHBlckltcGwuV2FpdEZvciggZHdUaW1lb3V0IDogRFdPUkQpIDogRFdPUkQ7CitiZWdpbgorICByZXN1bHQgOj0gV2FpdEZvclNpbmdsZU9iamVjdCggRk92ZXJsYXBwZWQuaEV2ZW50LCBkd1RpbWVvdXQpOworZW5kOworCisKK3sgQmFzZTY0VXRpbHMgfQorCitjbGFzcyBmdW5jdGlvbiBCYXNlNjRVdGlscy5FbmNvZGUoIGNvbnN0IHNyYyA6IFRCeXRlczsgc3JjT2ZmLCBsZW4gOiBJbnRlZ2VyOyBkc3QgOiBUQnl0ZXM7IGRzdE9mZiA6IEludGVnZXIpIDogSW50ZWdlcjsKK2NvbnN0IEVOQ09ERV9UQUJMRSA6IFBBbnNpQ2hhciA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJzsKK2JlZ2luCisgIEFTU0VSVCggbGVuIGluIFsxLi4zXSk7CisgIGRzdFtkc3RPZmZdIDo9IEJ5dGUoIEVOQ09ERV9UQUJMRVsgKHNyY1tzcmNPZmZdIHNociAyKSBhbmQgJDNGXSk7CisgIGNhc2UgbGVuIG9mCisgICAgMyA6IGJlZ2luCisgICAgICBJbmMoZHN0T2ZmKTsKKyAgICAgIGRzdFtkc3RPZmZdIDo9IEJ5dGUoIEVOQ09ERV9UQUJMRVsgKChzcmNbc3JjT2ZmXSBzaGwgNCkgYW5kICQzMCkgb3IgKChzcmNbc3JjT2ZmICsgMV0gc2hyIDQpIGFuZCAkMEYpXSk7CisgICAgICBJbmMoZHN0T2ZmKTsKKyAgICAgIGRzdFtkc3RPZmZdIDo9IEJ5dGUoIEVOQ09ERV9UQUJMRVsgKChzcmNbc3JjT2ZmICsgMV0gc2hsIDIpIGFuZCAkM0MpIG9yICgoc3JjW3NyY09mZiArIDJdIHNociA2KSBhbmQgJDAzKV0pOworICAgICAgSW5jKGRzdE9mZik7CisgICAgICBkc3RbZHN0T2ZmXSA6PSBCeXRlKCBFTkNPREVfVEFCTEVbIHNyY1tzcmNPZmYgKyAyXSBhbmQgJDNGXSk7CisgICAgICByZXN1bHQgOj0gNDsKKyAgICBlbmQ7CisKKyAgICAyIDogYmVnaW4KKyAgICAgIEluYyhkc3RPZmYpOworICAgICAgZHN0W2RzdE9mZl0gOj0gQnl0ZSggRU5DT0RFX1RBQkxFWyAoKHNyY1tzcmNPZmZdIHNobCA0KSBhbmQgJDMwKSBvciAoKHNyY1tzcmNPZmYgKyAxXSBzaHIgNCkgYW5kICQwRildKTsKKyAgICAgIEluYyhkc3RPZmYpOworICAgICAgZHN0W2RzdE9mZl0gOj0gQnl0ZSggRU5DT0RFX1RBQkxFWyAoc3JjW3NyY09mZiArIDFdIHNobCAyKSBhbmQgJDNDXSk7CisgICAgICByZXN1bHQgOj0gMzsKKyAgICBlbmQ7CisKKyAgICAxIDogYmVnaW4KKyAgICAgIEluYyhkc3RPZmYpOworICAgICAgZHN0W2RzdE9mZl0gOj0gQnl0ZSggRU5DT0RFX1RBQkxFWyAoc3JjW3NyY09mZl0gc2hsIDQpIGFuZCAkMzBdKTsKKyAgICAgIHJlc3VsdCA6PSAyOworICAgIGVuZDsKKworICBlbHNlCisgICAgQVNTRVJUKCBGQUxTRSk7CisgICAgcmVzdWx0IDo9IDA7ICAvLyBiZWNhdXNlIGludmFsaWQgY2FsbAorICBlbmQ7CitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gQmFzZTY0VXRpbHMuRGVjb2RlKCBjb25zdCBzcmMgOiBUQnl0ZXM7IHNyY09mZiwgbGVuIDogSW50ZWdlcjsgZHN0IDogVEJ5dGVzOyBkc3RPZmYgOiBJbnRlZ2VyKSA6IEludGVnZXI7Citjb25zdCBERUNPREVfVEFCTEUgOiBhcnJheVswLi4kRkZdIG9mIEludGVnZXIKKyAgICAgICAgICAgICAgICAgICA9ICggLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSw2MiwtMSwtMSwtMSw2MywKKyAgICAgICAgICAgICAgICAgICAgICAgNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LDEwLDExLDEyLDEzLDE0LAorICAgICAgICAgICAgICAgICAgICAgICAxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsCisgICAgICAgICAgICAgICAgICAgICAgIDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEgICk7CitiZWdpbgorICBBU1NFUlQoIGxlbiBpbiBbMS4uNF0pOworICByZXN1bHQgOj0gMTsKKyAgZHN0W2RzdE9mZl0gOj0gKChERUNPREVfVEFCTEVbc3JjW3NyY09mZl0gICAgIGFuZCAkMEZGXSBzaGwgMikKKyAgICAgICAgICAgICAgb3IgIChERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDFdIGFuZCAkMEZGXSBzaHIgNCkpOworCisgIGlmIChsZW4gPiAyKSB0aGVuIGJlZ2luCisgICAgSW5jKCByZXN1bHQpOworICAgIEluYyggZHN0T2ZmKTsKKyAgICBkc3RbZHN0T2ZmXSA6PSAoKChERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDFdIGFuZCAkMEZGXSBzaGwgNCkgYW5kICRGMCkKKyAgICAgICAgICAgICAgICBvciAgIChERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDJdIGFuZCAkMEZGXSBzaHIgMikpOworCisgICAgaWYgKGxlbiA+IDMpIHRoZW4gYmVnaW4KKyAgICAgIEluYyggcmVzdWx0KTsKKyAgICAgIEluYyggZHN0T2ZmKTsKKyAgICAgIGRzdFtkc3RPZmZdIDo9ICgoKERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmICsgMl0gYW5kICQwRkZdIHNobCA2KSBhbmQgJEMwKQorICAgICAgICAgICAgICAgICAgb3IgICAgREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAzXSBhbmQgJDBGRl0pOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIENoYXJVdGlscy5Jc0hpZ2hTdXJyb2dhdGUoIGNvbnN0IGMgOiBDaGFyKSA6IEJvb2xlYW47CitiZWdpbgorICB7JElGIENvbXBpbGVyVmVyc2lvbiA8IDI1LjB9CisgICAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgICByZXN1bHQgOj0gQ2hhcmFjdGVyLklzSGlnaFN1cnJvZ2F0ZShjKTsKKyAgICB7JEVMU0V9CisgICAgcmVzdWx0IDo9IFN5c3RlbS5DaGFyYWN0ZXIuSXNIaWdoU3Vycm9nYXRlKGMpOworICAgIHskRU5ESUZ9CisgIHskRUxTRX0KKyAgcmVzdWx0IDo9IGMuSXNIaWdoU3Vycm9nYXRlKCk7CisgIHskSUZFTkR9CitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gQ2hhclV0aWxzLklzTG93U3Vycm9nYXRlKCBjb25zdCBjIDogQ2hhcikgOiBCb29sZWFuOworYmVnaW4KKyAgeyRJRiBDb21waWxlclZlcnNpb24gPCAyNS4wfQorICAgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgICAgcmVzdWx0IDo9IENoYXJhY3Rlci5Jc0xvd1N1cnJvZ2F0ZShjKTsKKyAgICB7JEVMU0V9CisgICAgcmVzdWx0IDo9IFN5c3RlbS5DaGFyYWN0ZXIuSXNMb3dTdXJyb2dhdGUoYyk7CisgICAgeyRFTkRJRn0KKyAgeyRFTFNFfQorICByZXN1bHQgOj0gYy5Jc0xvd1N1cnJvZ2F0ZSgpOworICB7JElGRU5EfQorZW5kOworCisKK3skSUZERUYgV2luNjR9CisKK2Z1bmN0aW9uIEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjQoIHZhciBUYXJnZXQgOiBJbnQ2NDsgRXhjaGFuZ2UsIENvbXBhcmFuZCA6IEludDY0KSA6IEludDY0OyAgaW5saW5lOworYmVnaW4KKyAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgcmVzdWx0IDo9IFdpbmRvd3MuSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2U2NCggVGFyZ2V0LCBFeGNoYW5nZSwgQ29tcGFyYW5kKTsKKyAgeyRFTFNFfQorICByZXN1bHQgOj0gV2luQXBpLldpbmRvd3MuSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2U2NCggVGFyZ2V0LCBFeGNoYW5nZSwgQ29tcGFyYW5kKTsKKyAgeyRFTkRJRn0KK2VuZDsKKworCitmdW5jdGlvbiBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQoIHZhciBBZGRlbmQgOiBJbnQ2NDsgVmFsdWUgOiBJbnQ2NCkgOiBJbnQ2NDsKK3ZhciBvbGQgOiBJbnQ2NDsKK2JlZ2luCisgIHJlcGVhdAorICAgIE9sZCA6PSBBZGRlbmQ7CisgIHVudGlsIChJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZTY0KCBBZGRlbmQsIE9sZCArIFZhbHVlLCBPbGQpID0gT2xkKTsKKyAgcmVzdWx0IDo9IE9sZDsKK2VuZDsKKworeyRFTkRJRn0KKworCitlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjQ4MWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LnBhcwpAQCAtMCwwICsxLDIzOSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRocmlmdDsKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgU3lzVXRpbHMsCisgIFRocmlmdC5FeGNlcHRpb24sCisgIFRocmlmdC5Qcm90b2NvbDsKKworY29uc3QKKyAgVmVyc2lvbiA9ICcxLjAuMCc7CisKK3R5cGUKKyAgVEV4Y2VwdGlvbiA9IFRocmlmdC5FeGNlcHRpb24uVEV4Y2VwdGlvbjsgLy8gY29tcGF0aWJpbGl0eSBhbGlhcworCisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkQ2xhc3MgPSBjbGFzcyBvZiBUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZDsKKworICBUQXBwbGljYXRpb25FeGNlcHRpb24gPSBjbGFzcyggVEV4Y2VwdGlvbikKKyAgcHVibGljCisgICAgdHlwZQoreyRTQ09QRURFTlVNUyBPTn0KKyAgICAgIFRFeGNlcHRpb25UeXBlID0gKAorICAgICAgICBVbmtub3duLAorICAgICAgICBVbmtub3duTWV0aG9kLAorICAgICAgICBJbnZhbGlkTWVzc2FnZVR5cGUsCisgICAgICAgIFdyb25nTWV0aG9kTmFtZSwKKyAgICAgICAgQmFkU2VxdWVuY2VJRCwKKyAgICAgICAgTWlzc2luZ1Jlc3VsdCwKKyAgICAgICAgSW50ZXJuYWxFcnJvciwKKyAgICAgICAgUHJvdG9jb2xFcnJvciwKKyAgICAgICAgSW52YWxpZFRyYW5zZm9ybSwKKyAgICAgICAgSW52YWxpZFByb3RvY29sLAorICAgICAgICBVbnN1cHBvcnRlZENsaWVudFR5cGUKKyAgICAgICk7Cit7JFNDT1BFREVOVU1TIE9GRn0KKyAgcHJpdmF0ZQorICAgIGZ1bmN0aW9uIEdldFR5cGU6IFRFeGNlcHRpb25UeXBlOworICBwcm90ZWN0ZWQKKyAgICBjb25zdHJ1Y3RvciBIaWRkZW5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOworICBwdWJsaWMKKyAgICAvLyBwdXJwb3NlZnVsbHkgaGlkZSBpbmhlcml0ZWQgY29uc3RydWN0b3IKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOiBUQXBwbGljYXRpb25FeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlOiBUQXBwbGljYXRpb25FeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGUpOiBUQXBwbGljYXRpb25FeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGU7IGNvbnN0IG1zZzogc3RyaW5nKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworCisgICAgY2xhc3MgZnVuY3Rpb24gR2V0U3BlY2lhbGl6ZWRFeGNlcHRpb25UeXBlKEFUeXBlOiBURXhjZXB0aW9uVHlwZSk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkQ2xhc3M7CisKKyAgICBjbGFzcyBmdW5jdGlvbiBSZWFkKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3Qgb3Byb3Q6IElQcm90b2NvbCApOworICBlbmQ7CisKKyAgLy8gTmVlZGVkIHRvIHJlbW92ZSBkZXByZWNhdGlvbiB3YXJuaW5nCisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkID0gY2xhc3MgYWJzdHJhY3QgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKKyAgZW5kOworCisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd24gPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25Vbmtub3duTWV0aG9kID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZE1lc3NhZ2VUeXBlID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uV3JvbmdNZXRob2ROYW1lID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uQmFkU2VxdWVuY2VJRCA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbk1pc3NpbmdSZXN1bHQgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25JbnRlcm5hbEVycm9yID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uUHJvdG9jb2xFcnJvciA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRUcmFuc2Zvcm0gPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkUHJvdG9jb2wgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25VbnN1cHBvcnRlZENsaWVudFR5cGUgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworCisKK2ltcGxlbWVudGF0aW9uCisKK3sgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIH0KKworZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkdldFR5cGU6IFRFeGNlcHRpb25UeXBlOworYmVnaW4KKyAgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25Vbmtub3duTWV0aG9kIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLlVua25vd25NZXRob2QKKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRNZXNzYWdlVHlwZSB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5JbnZhbGlkTWVzc2FnZVR5cGUKKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbldyb25nTWV0aG9kTmFtZSB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5Xcm9uZ01ldGhvZE5hbWUKKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkJhZFNlcXVlbmNlSUQgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuQmFkU2VxdWVuY2VJRAorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uTWlzc2luZ1Jlc3VsdCB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5NaXNzaW5nUmVzdWx0CisgIGVsc2UgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25JbnRlcm5hbEVycm9yIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkludGVybmFsRXJyb3IKKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblByb3RvY29sRXJyb3IgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuUHJvdG9jb2xFcnJvcgorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZFRyYW5zZm9ybSB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5JbnZhbGlkVHJhbnNmb3JtCisgIGVsc2UgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkUHJvdG9jb2wgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuSW52YWxpZFByb3RvY29sCisgIGVsc2UgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25VbnN1cHBvcnRlZENsaWVudFR5cGUgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuVW5zdXBwb3J0ZWRDbGllbnRUeXBlCisgIGVsc2UgUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLlVua25vd247CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5IaWRkZW5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShNc2cpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24uQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOworYmVnaW4KKyAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd24uQ3JlYXRlKE1zZyk7CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGU6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgnJyk7CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGUoIEFUeXBlOiBURXhjZXB0aW9uVHlwZSk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2JlZ2luCit7JFdBUk4gU1lNQk9MX0RFUFJFQ0FURUQgT0ZGfQorICBSZXN1bHQgOj0gQ3JlYXRlKEFUeXBlLCAnJyk7Cit7JFdBUk4gU1lNQk9MX0RFUFJFQ0FURUQgREVGQVVMVH0KK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkNyZWF0ZSggQVR5cGU6IFRFeGNlcHRpb25UeXBlOyBjb25zdCBtc2c6IHN0cmluZyk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBHZXRTcGVjaWFsaXplZEV4Y2VwdGlvblR5cGUoQVR5cGUpLkNyZWF0ZShtc2cpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24uR2V0U3BlY2lhbGl6ZWRFeGNlcHRpb25UeXBlKEFUeXBlOiBURXhjZXB0aW9uVHlwZSk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkQ2xhc3M7CitiZWdpbgorICBjYXNlIEFUeXBlIG9mCisgICAgVEV4Y2VwdGlvblR5cGUuVW5rbm93bk1ldGhvZDogICAgICAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5rbm93bk1ldGhvZDsKKyAgICBURXhjZXB0aW9uVHlwZS5JbnZhbGlkTWVzc2FnZVR5cGU6ICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkTWVzc2FnZVR5cGU7CisgICAgVEV4Y2VwdGlvblR5cGUuV3JvbmdNZXRob2ROYW1lOiAgICAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uV3JvbmdNZXRob2ROYW1lOworICAgIFRFeGNlcHRpb25UeXBlLkJhZFNlcXVlbmNlSUQ6ICAgICAgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkJhZFNlcXVlbmNlSUQ7CisgICAgVEV4Y2VwdGlvblR5cGUuTWlzc2luZ1Jlc3VsdDogICAgICAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uTWlzc2luZ1Jlc3VsdDsKKyAgICBURXhjZXB0aW9uVHlwZS5JbnRlcm5hbEVycm9yOiAgICAgICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25JbnRlcm5hbEVycm9yOworICAgIFRFeGNlcHRpb25UeXBlLlByb3RvY29sRXJyb3I6ICAgICAgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblByb3RvY29sRXJyb3I7CisgICAgVEV4Y2VwdGlvblR5cGUuSW52YWxpZFRyYW5zZm9ybTogICAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZFRyYW5zZm9ybTsKKyAgICBURXhjZXB0aW9uVHlwZS5JbnZhbGlkUHJvdG9jb2w6ICAgICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkUHJvdG9jb2w7CisgICAgVEV4Y2VwdGlvblR5cGUuVW5zdXBwb3J0ZWRDbGllbnRUeXBlOiBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5zdXBwb3J0ZWRDbGllbnRUeXBlOworICBlbHNlCisgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd247CisgIGVuZDsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlJlYWQoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2wpOiBUQXBwbGljYXRpb25FeGNlcHRpb247Cit2YXIKKyAgZmllbGQgOiBUVGhyaWZ0RmllbGQ7CisgIG1zZyA6IHN0cmluZzsKKyAgdHlwIDogVEV4Y2VwdGlvblR5cGU7CisgIHN0cnVjIDogVFRocmlmdFN0cnVjdDsKK2JlZ2luCisgIG1zZyA6PSAnJzsKKyAgdHlwIDo9IFRFeGNlcHRpb25UeXBlLlVua25vd247CisgIHN0cnVjIDo9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbjsKKyAgd2hpbGUgKCBUcnVlICkgZG8KKyAgYmVnaW4KKyAgICBmaWVsZCA6PSBpcHJvdC5SZWFkRmllbGRCZWdpbjsKKyAgICBpZiAoIGZpZWxkLlR5cGVfID0gVFR5cGUuU3RvcCkgdGhlbgorICAgIGJlZ2luCisgICAgICBCcmVhazsKKyAgICBlbmQ7CisKKyAgICBjYXNlIGZpZWxkLklkIG9mCisgICAgICAxIDogYmVnaW4KKyAgICAgICAgaWYgKCBmaWVsZC5UeXBlXyA9IFRUeXBlLlN0cmluZ18pIHRoZW4KKyAgICAgICAgYmVnaW4KKyAgICAgICAgICBtc2cgOj0gaXByb3QuUmVhZFN0cmluZzsKKyAgICAgICAgZW5kIGVsc2UKKyAgICAgICAgYmVnaW4KKyAgICAgICAgICBUUHJvdG9jb2xVdGlsLlNraXAoIGlwcm90LCBmaWVsZC5UeXBlXyApOworICAgICAgICBlbmQ7CisgICAgICBlbmQ7CisKKyAgICAgIDIgOiBiZWdpbgorICAgICAgICBpZiAoIGZpZWxkLlR5cGVfID0gVFR5cGUuSTMyKSB0aGVuCisgICAgICAgIGJlZ2luCisgICAgICAgICAgdHlwIDo9IFRFeGNlcHRpb25UeXBlKCBpcHJvdC5SZWFkSTMyICk7CisgICAgICAgIGVuZCBlbHNlCisgICAgICAgIGJlZ2luCisgICAgICAgICAgVFByb3RvY29sVXRpbC5Ta2lwKCBpcHJvdCwgZmllbGQuVHlwZV8gKTsKKyAgICAgICAgZW5kOworICAgICAgZW5kIGVsc2UKKyAgICAgIGJlZ2luCisgICAgICAgIFRQcm90b2NvbFV0aWwuU2tpcCggaXByb3QsIGZpZWxkLlR5cGVfKTsKKyAgICAgIGVuZDsKKyAgICBlbmQ7CisgICAgaXByb3QuUmVhZEZpZWxkRW5kOworICBlbmQ7CisgIGlwcm90LlJlYWRTdHJ1Y3RFbmQ7CisgIFJlc3VsdCA6PSBHZXRTcGVjaWFsaXplZEV4Y2VwdGlvblR5cGUodHlwKS5DcmVhdGUobXNnKTsKK2VuZDsKKworcHJvY2VkdXJlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5Xcml0ZSggY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7Cit2YXIKKyAgc3RydWMgOiBUVGhyaWZ0U3RydWN0OworICBmaWVsZCA6IFRUaHJpZnRGaWVsZDsKK2JlZ2luCisgIEluaXQoc3RydWMsICdUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKKyAgSW5pdChmaWVsZCk7CisKKyAgb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbiggc3RydWMgKTsKKyAgaWYgTWVzc2FnZSA8PiAnJyB0aGVuCisgIGJlZ2luCisgICAgZmllbGQuTmFtZSA6PSAnbWVzc2FnZSc7CisgICAgZmllbGQuVHlwZV8gOj0gVFR5cGUuU3RyaW5nXzsKKyAgICBmaWVsZC5JZCA6PSAxOworICAgIG9wcm90LldyaXRlRmllbGRCZWdpbiggZmllbGQgKTsKKyAgICBvcHJvdC5Xcml0ZVN0cmluZyggTWVzc2FnZSApOworICAgIG9wcm90LldyaXRlRmllbGRFbmQ7CisgIGVuZDsKKworICBmaWVsZC5OYW1lIDo9ICd0eXBlJzsKKyAgZmllbGQuVHlwZV8gOj0gVFR5cGUuSTMyOworICBmaWVsZC5JZCA6PSAyOworICBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOworICBvcHJvdC5Xcml0ZUkzMihJbnRlZ2VyKEdldFR5cGUpKTsKKyAgb3Byb3QuV3JpdGVGaWVsZEVuZCgpOworICBvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOworICBvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOworZW5kOworCit7IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkIH0KKworY29uc3RydWN0b3IgVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKK2JlZ2luCisgIGluaGVyaXRlZCBIaWRkZW5DcmVhdGUoTXNnKTsKK2VuZDsKKworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L0NvbnNvbGVIZWxwZXIucGFzIGIvbGliL2RlbHBoaS90ZXN0L0NvbnNvbGVIZWxwZXIucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOGRkY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvQ29uc29sZUhlbHBlci5wYXMKQEAgLTAsMCArMSwxMzIgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBDb25zb2xlSGVscGVyOworCitpbnRlcmZhY2UKKwordXNlcyBDbGFzc2VzOworCit0eXBlCisgIFRUaHJpZnRDb25zb2xlID0gY2xhc3MKKyAgcHVibGljCisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBTOiBzdHJpbmcpOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBXcml0ZUxpbmUoIGNvbnN0IFM6IHN0cmluZyk7IHZpcnR1YWw7CisgIGVuZDsKKworICBUR1VJQ29uc29sZSA9IGNsYXNzKCBUVGhyaWZ0Q29uc29sZSApCisgIHByaXZhdGUKKyAgICBGTGluZUJyZWFrIDogQm9vbGVhbjsKKyAgICBGTWVtbyA6IFRTdHJpbmdzOworCisgICAgcHJvY2VkdXJlIEludGVybmFsV3JpdGUoIGNvbnN0IFM6IHN0cmluZzsgYldyaXRlTGluZTogQm9vbGVhbik7CisgIHB1YmxpYworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgUzogc3RyaW5nKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGluZSggY29uc3QgUzogc3RyaW5nKTsgb3ZlcnJpZGU7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBTWVtbzogVFN0cmluZ3MpOworICBlbmQ7CisKK2Z1bmN0aW9uIENvbnNvbGU6IFRUaHJpZnRDb25zb2xlOworcHJvY2VkdXJlIENoYW5nZUNvbnNvbGUoIEFDb25zb2xlOiBUVGhyaWZ0Q29uc29sZSApOworcHJvY2VkdXJlIFJlc3RvcmVDb25zb2xlVG9EZWZhdWx0OworCitpbXBsZW1lbnRhdGlvbgorCit2YXIKKyAgRkRlZmF1bHRDb25zb2xlIDogVFRocmlmdENvbnNvbGU7CisgIEZDb25zb2xlIDogVFRocmlmdENvbnNvbGU7CisKK2Z1bmN0aW9uIENvbnNvbGU6IFRUaHJpZnRDb25zb2xlOworYmVnaW4KKyAgUmVzdWx0IDo9IEZDb25zb2xlOworZW5kOworCit7IFRUaHJpZnRDb25zb2xlIH0KKworcHJvY2VkdXJlIFRUaHJpZnRDb25zb2xlLldyaXRlKGNvbnN0IFM6IHN0cmluZyk7CitiZWdpbgorICBTeXN0ZW0uV3JpdGUoIFMgKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRDb25zb2xlLldyaXRlTGluZShjb25zdCBTOiBzdHJpbmcpOworYmVnaW4KKyAgU3lzdGVtLldyaXRlbG4oIFMgKTsKK2VuZDsKKworcHJvY2VkdXJlIENoYW5nZUNvbnNvbGUoIEFDb25zb2xlOiBUVGhyaWZ0Q29uc29sZSApOworYmVnaW4KKyAgRkNvbnNvbGUgOj0gQUNvbnNvbGU7CitlbmQ7CisKK3Byb2NlZHVyZSBSZXN0b3JlQ29uc29sZVRvRGVmYXVsdDsKK2JlZ2luCisgIEZDb25zb2xlIDo9IEZEZWZhdWx0Q29uc29sZTsKK2VuZDsKKworeyBUR1VJQ29uc29sZSB9CisKK2NvbnN0cnVjdG9yIFRHVUlDb25zb2xlLkNyZWF0ZSggQU1lbW86IFRTdHJpbmdzKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZNZW1vIDo9IEFNZW1vOworICBGTGluZUJyZWFrIDo9IFRydWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUR1VJQ29uc29sZS5JbnRlcm5hbFdyaXRlKGNvbnN0IFM6IHN0cmluZzsgYldyaXRlTGluZTogQm9vbGVhbik7Cit2YXIKKyAgaWR4IDogSW50ZWdlcjsKK2JlZ2luCisgIGlmIEZMaW5lQnJlYWsgdGhlbgorICBiZWdpbgorICAgIEZNZW1vLkFkZCggUyApOworICBlbmQgZWxzZQorICBiZWdpbgorICAgIGlkeCA6PSBGTWVtby5Db3VudCAtIDE7CisgICAgaWYgaWR4IDwgMCB0aGVuCisgICAgICBGTWVtby5BZGQoIFMgKQorICAgIGVsc2UKKyAgICAgIEZNZW1vW2lkeF0gOj0gRk1lbW9baWR4XSArIFM7CisgIGVuZDsKKyAgRkxpbmVCcmVhayA6PSBiV3JpdGVMaW5lOworZW5kOworCitwcm9jZWR1cmUgVEdVSUNvbnNvbGUuV3JpdGUoY29uc3QgUzogc3RyaW5nKTsKK2JlZ2luCisgIEludGVybmFsV3JpdGUoIFMsIEZhbHNlKTsKK2VuZDsKKworcHJvY2VkdXJlIFRHVUlDb25zb2xlLldyaXRlTGluZShjb25zdCBTOiBzdHJpbmcpOworYmVnaW4KKyAgSW50ZXJuYWxXcml0ZSggUywgVHJ1ZSk7CitlbmQ7CisKK2luaXRpYWxpemF0aW9uCitiZWdpbgorICBGRGVmYXVsdENvbnNvbGUgOj0gVFRocmlmdENvbnNvbGUuQ3JlYXRlOworICBGQ29uc29sZSA6PSBGRGVmYXVsdENvbnNvbGU7CitlbmQ7CisKK2ZpbmFsaXphdGlvbgorYmVnaW4KKyAgRkRlZmF1bHRDb25zb2xlLkZyZWU7CitlbmQ7CisKK2VuZC4KKworCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvVGVzdENsaWVudC5wYXMgYi9saWIvZGVscGhpL3Rlc3QvVGVzdENsaWVudC5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZhNDNiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0Q2xpZW50LnBhcwpAQCAtMCwwICsxLDE0NTUgQEAKK++7vygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBUZXN0Q2xpZW50OworCit7JEkgLi4vc3JjL1RocmlmdC5EZWZpbmVzLmluY30KKworey4kREVGSU5FIFN0cmVzc1Rlc3R9ICAgLy8gYWN0aXZhdGUgdG8gc3RyZXNzLXRlc3QgdGhlIHNlcnZlciB3aXRoIGZyZXF1ZW50IGNvbm5lY3RzL2Rpc2Nvbm5lY3RzCit7LiRERUZJTkUgUGVyZlRlc3R9ICAgICAvLyBhY3RpdmF0ZSB0aGUgcGVyZm9ybWFuY2UgdGVzdAoreyRERUZJTkUgRXhjZXB0aW9uc30gICAgLy8gYWN0aXZhdGUgdGhlIGV4Y2VwdGlvbnMgdGVzdCAob3IgZGlzYWJsZSB3aGlsZSBkZWJ1Z2dpbmcpCisKK3skaWYgQ29tcGlsZXJWZXJzaW9uID49IDI4fQoreyRERUZJTkUgU3VwcG9ydHNBc3luY30KK3skaWZlbmR9CisKK2ludGVyZmFjZQorCit1c2VzCisgIFdpbmRvd3MsIFN5c1V0aWxzLCBDbGFzc2VzLCBNYXRoLCBDb21PYmosIEFjdGl2ZVgsCisgIHskSUZERUYgU3VwcG9ydHNBc3luY30gU3lzdGVtLlRocmVhZGluZywgeyRFTkRJRn0KKyAgRGF0ZVV0aWxzLAorICBHZW5lcmljcy5Db2xsZWN0aW9ucywKKyAgVGVzdENvbnN0YW50cywKKyAgQ29uc29sZUhlbHBlciwKKyAgVGhyaWZ0LAorICBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdCwKKyAgVGhyaWZ0LlByb3RvY29sLkpTT04sCisgIFRocmlmdC5Qcm90b2NvbCwKKyAgVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcywKKyAgVGhyaWZ0LlRyYW5zcG9ydCwKKyAgVGhyaWZ0LlN0cmVhbSwKKyAgVGhyaWZ0LlRlc3QsCisgIFRocmlmdC5VdGlscywKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zOworCit0eXBlCisgIFRUaHJlYWRDb25zb2xlID0gY2xhc3MKKyAgcHJpdmF0ZQorICAgIEZUaHJlYWQgOiBUVGhyZWFkOworICBwdWJsaWMKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IFMgOiBzdHJpbmcpOworICAgIHByb2NlZHVyZSBXcml0ZUxpbmUoIGNvbnN0IFMgOiBzdHJpbmcpOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggQVRocmVhZDogVFRocmVhZCk7CisgIGVuZDsKKworICBUVGVzdFNldHVwID0gcmVjb3JkCisgICAgcHJvdFR5cGUgIDogVEtub3duUHJvdG9jb2w7CisgICAgZW5kcG9pbnQgIDogVEVuZHBvaW50VHJhbnNwb3J0OworICAgIGxheWVyZWQgICA6IFRMYXllcmVkVHJhbnNwb3J0czsKKyAgICB1c2VTU0wgICAgOiBCb29sZWFuOyAvLyBpbmNsdWRlIHdoZXJlIGFwcHJvcHJpYXRlIChUTGF5ZXJlZFRyYW5zcG9ydD8pCisgICAgaG9zdCAgICAgIDogc3RyaW5nOworICAgIHBvcnQgICAgICA6IEludGVnZXI7CisgICAgc1BpcGVOYW1lIDogc3RyaW5nOworICAgIGhBbm9uUmVhZCwgaEFub25Xcml0ZSA6IFRIYW5kbGU7CisgIGVuZDsKKworICBUQ2xpZW50VGhyZWFkID0gY2xhc3MoIFRUaHJlYWQgKQorICBwcml2YXRlIHR5cGUKKyAgICBUVGVzdEdyb3VwID0gKAorICAgICAgdGVzdF9Vbmtub3duLAorICAgICAgdGVzdF9CYXNlVHlwZXMsCisgICAgICB0ZXN0X1N0cnVjdHMsCisgICAgICB0ZXN0X0NvbnRhaW5lcnMsCisgICAgICB0ZXN0X0V4Y2VwdGlvbnMKKyAgICAgIC8vIG5ldyB2YWx1ZXMgaGVyZQorICAgICk7CisgICAgVFRlc3RHcm91cHMgPSBzZXQgb2YgVFRlc3RHcm91cDsKKworICAgIFRUZXN0U2l6ZSA9ICgKKyAgICAgIEVtcHR5LCAgICAgICAgICAgLy8gRWRnZSBjYXNlOiB0aGUgemVyby1sZW5ndGggZW1wdHkgYmluYXJ5CisgICAgICBOb3JtYWwsICAgICAgICAgIC8vIEZhaXJseSBzbWFsbCBhcnJheSBvZiB1c3VhbCBzaXplICgyNTYgYnl0ZXMpCisgICAgICBCeXRlQXJyYXlUZXN0LCAgIC8vIFRIUklGVC00NDU0IExhcmdlIHdyaXRlcy9yZWFkcyBtYXkgY2F1c2UgcmFuZ2UgY2hlY2sgZXJyb3JzIGluIGRlYnVnIG1vZGUKKyAgICAgIFBpcGVXcml0ZUxpbWl0ICAgLy8gVEhSSUZULTQzNzIgUGlwZSB3cml0ZSBvcGVyYXRpb25zIGFjcm9zcyBhIG5ldHdvcmsgYXJlIGxpbWl0ZWQgdG8gNjUsNTM1IGJ5dGVzIHBlciB3cml0ZS4KKyAgICApOworCisgIHByaXZhdGUKKyAgICBGU2V0dXAgOiBUVGVzdFNldHVwOworICAgIEZUcmFuc3BvcnQgOiBJVHJhbnNwb3J0OworICAgIEZQcm90b2NvbCA6IElQcm90b2NvbDsKKyAgICBGTnVtSXRlcmF0aW9uIDogSW50ZWdlcjsKKyAgICBGQ29uc29sZSA6IFRUaHJlYWRDb25zb2xlOworCisgICAgLy8gdGVzdCByZXBvcnRpbmcsIHdpbGwgYmUgcmVmYWN0b3JlZCBvdXQgaW50byBzZXBhcmF0ZSBjbGFzcyBsYXRlcgorICAgIEZUZXN0R3JvdXAgOiBzdHJpbmc7CisgICAgRkN1cnJlbnRUZXN0IDogVFRlc3RHcm91cDsKKyAgICBGU3VjY2Vzc2VzIDogSW50ZWdlcjsKKyAgICBGRXJyb3JzIDogVFN0cmluZ0xpc3Q7CisgICAgRkZhaWxlZCA6IFRUZXN0R3JvdXBzOworICAgIEZFeGVjdXRlZCA6IFRUZXN0R3JvdXBzOworICAgIHByb2NlZHVyZSBTdGFydFRlc3RHcm91cCggY29uc3QgYUdyb3VwIDogc3RyaW5nOyBjb25zdCBhVGVzdCA6IFRUZXN0R3JvdXApOworICAgIHByb2NlZHVyZSBFeHBlY3QoIGFUZXN0UmVzdWx0IDogQm9vbGVhbjsgY29uc3QgYVRlc3RJbmZvIDogc3RyaW5nKTsKKyAgICBwcm9jZWR1cmUgUmVwb3J0UmVzdWx0czsKKyAgICBmdW5jdGlvbiAgQ2FsY3VsYXRlRXhpdENvZGUgOiBCeXRlOworCisgICAgcHJvY2VkdXJlIENsaWVudFRlc3Q7CisgICAgeyRJRkRFRiBTdXBwb3J0c0FzeW5jfQorICAgIHByb2NlZHVyZSBDbGllbnRBc3luY1Rlc3Q7CisgICAgeyRFTkRJRn0KKworICAgIHByb2NlZHVyZSBJbml0aWFsaXplUHJvdG9jb2xUcmFuc3BvcnRTdGFjazsKKyAgICBwcm9jZWR1cmUgU2h1dGRvd25Qcm90b2NvbFRyYW5zcG9ydFN0YWNrOworCisgICAgcHJvY2VkdXJlIEpTT05Qcm90b2NvbFJlYWRXcml0ZVRlc3Q7CisgICAgZnVuY3Rpb24gIFByZXBhcmVCaW5hcnlEYXRhKCBhUmFuZG9tRGlzdCA6IEJvb2xlYW47IGFTaXplIDogVFRlc3RTaXplKSA6IFRCeXRlczsKKyAgICB7JElGREVGIFN0cmVzc1Rlc3R9CisgICAgcHJvY2VkdXJlIFN0cmVzc1Rlc3QoY29uc3QgY2xpZW50IDogVFRocmlmdFRlc3QuSWZhY2UpOworICAgIHskRU5ESUZ9CisgICAgeyRJRkRFRiBXaW42NH0KKyAgICBwcm9jZWR1cmUgVXNlSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0OworICAgIHskRU5ESUZ9CisgIHByb3RlY3RlZAorICAgIHByb2NlZHVyZSBFeGVjdXRlOyBvdmVycmlkZTsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhU2V0dXAgOiBUVGVzdFNldHVwOyBjb25zdCBhTnVtSXRlcmF0aW9uOiBJbnRlZ2VyKTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworICBlbmQ7CisKKyAgVFRlc3RDbGllbnQgPSBjbGFzcworICBwcml2YXRlCisgICAgY2xhc3MgdmFyCisgICAgICBGTnVtSXRlcmF0aW9uIDogSW50ZWdlcjsKKyAgICAgIEZOdW1UaHJlYWQgOiBJbnRlZ2VyOworCisgICAgY2xhc3MgcHJvY2VkdXJlIFByaW50Q21kTGluZUhlbHA7CisgICAgY2xhc3MgcHJvY2VkdXJlIEludmFsaWRBcmdzOworICBwdWJsaWMKKyAgICBjbGFzcyBmdW5jdGlvbiBFeGVjdXRlKCBjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpIDogQnl0ZTsKKyAgZW5kOworCisKK2ltcGxlbWVudGF0aW9uCisKK2NvbnN0CisgICBFWElUQ09ERV9TVUNDRVNTICAgICAgICAgICA9ICQwMDsgIC8vIG5vIGVycm9ycyBiaXRzIHNldAorICAgLy8KKyAgIEVYSVRDT0RFX0ZBSUxCSVRfQkFTRVRZUEVTICA9ICQwMTsKKyAgIEVYSVRDT0RFX0ZBSUxCSVRfU1RSVUNUUyAgICA9ICQwMjsKKyAgIEVYSVRDT0RFX0ZBSUxCSVRfQ09OVEFJTkVSUyA9ICQwNDsKKyAgIEVYSVRDT0RFX0ZBSUxCSVRfRVhDRVBUSU9OUyA9ICQwODsKKworICAgTUFQX0ZBSUxVUkVTX1RPX0VYSVRDT0RFX0JJVFMgOiBhcnJheVtUQ2xpZW50VGhyZWFkLlRUZXN0R3JvdXBdIG9mIEJ5dGUgPSAoCisgICAgIEVYSVRDT0RFX1NVQ0NFU1MsICAvLyBubyBiaXRzIGhlcmUKKyAgICAgRVhJVENPREVfRkFJTEJJVF9CQVNFVFlQRVMsCisgICAgIEVYSVRDT0RFX0ZBSUxCSVRfU1RSVUNUUywKKyAgICAgRVhJVENPREVfRkFJTEJJVF9DT05UQUlORVJTLAorICAgICBFWElUQ09ERV9GQUlMQklUX0VYQ0VQVElPTlMKKyAgICk7CisKKworCitmdW5jdGlvbiBCb29sVG9TdHJpbmcoIGIgOiBCb29sZWFuKSA6IHN0cmluZzsKKy8vIG92ZXJyaWRlcyBnbG9iYWwgQm9vbFRvU3RyaW5nKCkKK2JlZ2luCisgIGlmIGIKKyAgdGhlbiByZXN1bHQgOj0gJ3RydWUnCisgIGVsc2UgcmVzdWx0IDo9ICdmYWxzZSc7CitlbmQ7CisKKy8vIG5vdCBhdmFpbGFibGUgaW4gYWxsIHZlcnNpb25zLCBzbyBtYWtlIHN1cmUgd2UgaGF2ZSB0aGlzIG9uZSBpbXBvcnRlZAorZnVuY3Rpb24gSXNEZWJ1Z2dlclByZXNlbnQ6IEJPT0w7IHN0ZGNhbGw7IGV4dGVybmFsIEtFUk5FTDMyIG5hbWUgJ0lzRGVidWdnZXJQcmVzZW50JzsKKworeyBUVGVzdENsaWVudCB9CisKK2NsYXNzIHByb2NlZHVyZSBUVGVzdENsaWVudC5QcmludENtZExpbmVIZWxwOworY29uc3QgSEVMUFRFWFQgPSAnIFtvcHRpb25zXScjMTAKKyAgICAgICAgICAgICAgICsgIzEwCisgICAgICAgICAgICAgICArICdBbGxvd2VkIG9wdGlvbnM6JyMxMAorICAgICAgICAgICAgICAgKyAnICAtaCBbIC0taGVscCBdICAgICAgICAgICAgICAgcHJvZHVjZSBoZWxwIG1lc3NhZ2UnIzEwCisgICAgICAgICAgICAgICArICcgIC0taG9zdCBhcmcgKD1sb2NhbGhvc3QpICAgICBIb3N0IHRvIGNvbm5lY3QnIzEwCisgICAgICAgICAgICAgICArICcgIC0tcG9ydCBhcmcgKD05MDkwKSAgICAgICAgICBQb3J0IG51bWJlciB0byBjb25uZWN0JyMxMAorICAgICAgICAgICAgICAgKyAnICAtLWRvbWFpbi1zb2NrZXQgYXJnICAgICAgICAgRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KSwnIzEwCisgICAgICAgICAgICAgICArICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIGhvc3QgYW5kIHBvcnQnIzEwCisgICAgICAgICAgICAgICArICcgIC0tbmFtZWQtcGlwZSBhcmcgICAgICAgICAgICBXaW5kb3dzIE5hbWVkIFBpcGUgKGUuZy4gTXlUaHJpZnRQaXBlKScjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS1hbm9uLXBpcGVzIGhSZWFkIGhXcml0ZSAgIFdpbmRvd3MgQW5vbnltb3VzIFBpcGVzIHBhaXIgKGhhbmRsZXMpJyMxMAorICAgICAgICAgICAgICAgKyAnICAtLXRyYW5zcG9ydCBhcmcgKD1zb2NrZXRzKSAgVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBldmh0dHAnIzEwCisgICAgICAgICAgICAgICArICcgIC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSAgICBQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uJyMxMAorICAgICAgICAgICAgICAgKyAnICAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wnIzEwCisgICAgICAgICAgICAgICArICcgIC1uIFsgLS10ZXN0bG9vcHMgXSBhcmcgKD0xKSBOdW1iZXIgb2YgVGVzdHMnIzEwCisgICAgICAgICAgICAgICArICcgIC10IFsgLS10aHJlYWRzIF0gYXJnICg9MSkgICBOdW1iZXIgb2YgVGVzdCB0aHJlYWRzJyMxMAorICAgICAgICAgICAgICAgOworYmVnaW4KKyAgV3JpdGVsbiggQ2hhbmdlRmlsZUV4dChFeHRyYWN0RmlsZU5hbWUoUGFyYW1TdHIoMCkpLCcnKSArIEhFTFBURVhUKTsKK2VuZDsKKworY2xhc3MgcHJvY2VkdXJlIFRUZXN0Q2xpZW50LkludmFsaWRBcmdzOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoICdJbnZhbGlkIGFyZ3MuJyk7CisgIENvbnNvbGUuV3JpdGVMaW5lKCBDaGFuZ2VGaWxlRXh0KEV4dHJhY3RGaWxlTmFtZShQYXJhbVN0cigwKSksJycpICsgJyAtaCBmb3IgbW9yZSBpbmZvcm1hdGlvbicpOworICBBYm9ydDsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVFRlc3RDbGllbnQuRXhlY3V0ZShjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpIDogQnl0ZTsKK3ZhcgorICBpIDogSW50ZWdlcjsKKyAgdGhyZWFkRXhpdENvZGUgOiBCeXRlOworICBzIDogc3RyaW5nOworICB0aHJlYWRzIDogYXJyYXkgb2YgVFRocmVhZDsKKyAgZHRTdGFydCA6IFREYXRlVGltZTsKKyAgdGVzdCA6IEludGVnZXI7CisgIHRocmVhZCA6IFRUaHJlYWQ7CisgIHNldHVwIDogVFRlc3RTZXR1cDsKK2JlZ2luCisgIC8vIGluaXQgcmVjb3JkCisgIHdpdGggc2V0dXAgZG8gYmVnaW4KKyAgICBwcm90VHlwZSAgIDo9IHByb3RfQmluYXJ5OworICAgIGVuZHBvaW50ICAgOj0gdHJuc19Tb2NrZXRzOworICAgIGxheWVyZWQgICAgOj0gW107CisgICAgdXNlU1NMICAgICA6PSBGQUxTRTsKKyAgICBob3N0ICAgICAgIDo9ICdsb2NhbGhvc3QnOworICAgIHBvcnQgICAgICAgOj0gOTA5MDsKKyAgICBzUGlwZU5hbWUgIDo9ICcnOworICAgIGhBbm9uUmVhZCAgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgICAgaEFub25Xcml0ZSA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgZW5kOworCisgIHRyeQorICAgIGkgOj0gMDsKKyAgICB3aGlsZSAoIGkgPCBMZW5ndGgoYXJncykgKSBkbyBiZWdpbgorICAgICAgcyA6PSBhcmdzW2ldOworICAgICAgSW5jKCBpKTsKKworICAgICAgaWYgKHMgPSAnLWgnKSBvciAocyA9ICctLWhlbHAnKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIC1oIFsgLS1oZWxwIF0gICAgICAgICAgICAgICBwcm9kdWNlIGhlbHAgbWVzc2FnZQorICAgICAgICBQcmludENtZExpbmVIZWxwOworICAgICAgICByZXN1bHQgOj0gJEZGOyAgIC8vIGFsbCB0ZXN0cyBmYWlsZWQKKyAgICAgICAgRXhpdDsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBzID0gJy0taG9zdCcgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLWhvc3QgYXJnICg9bG9jYWxob3N0KSAgICAgSG9zdCB0byBjb25uZWN0CisgICAgICAgIHNldHVwLmhvc3QgOj0gYXJnc1tpXTsKKyAgICAgICAgSW5jKCBpKTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBzID0gJy0tcG9ydCcgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLXBvcnQgYXJnICg9OTA5MCkgICAgICAgICAgUG9ydCBudW1iZXIgdG8gY29ubmVjdAorICAgICAgICBzIDo9IGFyZ3NbaV07CisgICAgICAgIEluYyggaSk7CisgICAgICAgIHNldHVwLnBvcnQgOj0gU3RyVG9JbnREZWYocywwKTsKKyAgICAgICAgaWYgc2V0dXAucG9ydCA8PSAwIHRoZW4gSW52YWxpZEFyZ3M7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgcyA9ICctLWRvbWFpbi1zb2NrZXQnIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS1kb21haW4tc29ja2V0IGFyZyAgICAgICAgIERvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCksIGluc3RlYWQgb2YgaG9zdCBhbmQgcG9ydAorICAgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdkb21haW4tc29ja2V0IG5vdCBzdXBwb3J0ZWQnKTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBzID0gJy0tbmFtZWQtcGlwZScgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLW5hbWVkLXBpcGUgYXJnICAgICAgICAgICAgV2luZG93cyBOYW1lZCBQaXBlIChlLmcuIE15VGhyaWZ0UGlwZSkKKyAgICAgICAgc2V0dXAuZW5kcG9pbnQgOj0gdHJuc19OYW1lZFBpcGVzOworICAgICAgICBzZXR1cC5zUGlwZU5hbWUgOj0gYXJnc1tpXTsKKyAgICAgICAgSW5jKCBpKTsKKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIG5hbWVkIHBpcGUgKCcrc2V0dXAuc1BpcGVOYW1lKycpJyk7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgcyA9ICctLWFub24tcGlwZXMnIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS1hbm9uLXBpcGVzIGhSZWFkIGhXcml0ZSAgIFdpbmRvd3MgQW5vbnltb3VzIFBpcGVzIHBhaXIgKGhhbmRsZXMpCisgICAgICAgIHNldHVwLmVuZHBvaW50IDo9IHRybnNfQW5vblBpcGVzOworICAgICAgICBzZXR1cC5oQW5vblJlYWQgOj0gVEhhbmRsZSggU3RyVG9JbnREZWYoIGFyZ3NbaV0sIEludGVnZXIoSU5WQUxJRF9IQU5ETEVfVkFMVUUpKSk7CisgICAgICAgIEluYyggaSk7CisgICAgICAgIHNldHVwLmhBbm9uV3JpdGUgOj0gVEhhbmRsZSggU3RyVG9JbnREZWYoIGFyZ3NbaV0sIEludGVnZXIoSU5WQUxJRF9IQU5ETEVfVkFMVUUpKSk7CisgICAgICAgIEluYyggaSk7CisgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBhbm9ueW1vdXMgcGlwZXMgKCcrSW50VG9TdHIoSW50ZWdlcihzZXR1cC5oQW5vblJlYWQpKSsnIGFuZCAnK0ludFRvU3RyKEludGVnZXIoc2V0dXAuaEFub25Xcml0ZSkpKycpJyk7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgcyA9ICctLXRyYW5zcG9ydCcgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLXRyYW5zcG9ydCBhcmcgKD1zb2NrZXRzKSAgVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBldmh0dHAKKyAgICAgICAgcyA6PSBhcmdzW2ldOworICAgICAgICBJbmMoIGkpOworCisgICAgICAgIGlmICAgICAgcyA9ICdidWZmZXJlZCcgdGhlbiBJbmNsdWRlKCBzZXR1cC5sYXllcmVkLCB0cm5zX0J1ZmZlcmVkKQorICAgICAgICBlbHNlIGlmIHMgPSAnZnJhbWVkJyAgIHRoZW4gSW5jbHVkZSggc2V0dXAubGF5ZXJlZCwgdHJuc19GcmFtZWQpCisgICAgICAgIGVsc2UgaWYgcyA9ICdodHRwJyAgICAgdGhlbiBzZXR1cC5lbmRwb2ludCA6PSB0cm5zX0h0dHAKKyAgICAgICAgZWxzZSBpZiBzID0gJ2V2aHR0cCcgICB0aGVuIHNldHVwLmVuZHBvaW50IDo9IHRybnNfRXZIdHRwCisgICAgICAgIGVsc2UgSW52YWxpZEFyZ3M7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgcyA9ICctLXByb3RvY29sJyB0aGVuIGJlZ2luCisgICAgICAgIC8vIC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSAgICBQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uCisgICAgICAgIHMgOj0gYXJnc1tpXTsKKyAgICAgICAgSW5jKCBpKTsKKworICAgICAgICBpZiAgICAgIHMgPSAnYmluYXJ5JyAgIHRoZW4gc2V0dXAucHJvdFR5cGUgOj0gcHJvdF9CaW5hcnkKKyAgICAgICAgZWxzZSBpZiBzID0gJ2NvbXBhY3QnICB0aGVuIHNldHVwLnByb3RUeXBlIDo9IHByb3RfQ29tcGFjdAorICAgICAgICBlbHNlIGlmIHMgPSAnanNvbicgICAgIHRoZW4gc2V0dXAucHJvdFR5cGUgOj0gcHJvdF9KU09OCisgICAgICAgIGVsc2UgSW52YWxpZEFyZ3M7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgcyA9ICctLXNzbCcgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wKKyAgICAgICAgc2V0dXAudXNlU1NMIDo9IFRSVUU7CisKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiAocyA9ICctbicpIG9yIChzID0gJy0tdGVzdGxvb3BzJykgdGhlbiBiZWdpbgorICAgICAgICAvLyAtbiBbIC0tdGVzdGxvb3BzIF0gYXJnICg9MSkgTnVtYmVyIG9mIFRlc3RzCisgICAgICAgIEZOdW1JdGVyYXRpb24gOj0gU3RyVG9JbnREZWYoIGFyZ3NbaV0sIDApOworICAgICAgICBJbmMoIGkpOworICAgICAgICBpZiBGTnVtSXRlcmF0aW9uIDw9IDAKKyAgICAgICAgdGhlbiBJbnZhbGlkQXJnczsKKworICAgICAgZW5kCisgICAgICBlbHNlIGlmIChzID0gJy10Jykgb3IgKHMgPSAnLS10aHJlYWRzJykgdGhlbiBiZWdpbgorICAgICAgICAvLyAtdCBbIC0tdGhyZWFkcyBdIGFyZyAoPTEpICAgTnVtYmVyIG9mIFRlc3QgdGhyZWFkcworICAgICAgICBGTnVtVGhyZWFkIDo9IFN0clRvSW50RGVmKCBhcmdzW2ldLCAwKTsKKyAgICAgICAgSW5jKCBpKTsKKyAgICAgICAgaWYgRk51bVRocmVhZCA8PSAwCisgICAgICAgIHRoZW4gSW52YWxpZEFyZ3M7CisgICAgICBlbmQKKyAgICAgIGVsc2UgYmVnaW4KKyAgICAgICAgSW52YWxpZEFyZ3M7CisgICAgICBlbmQ7CisgICAgZW5kOworCisKKyAgICAvLyBJbiB0aGUgYW5vbnltb3VzIHBpcGVzIG1vZGUgdGhlIGNsaWVudCBpcyBsYXVuY2hlZCBieSB0aGUgdGVzdCBzZXJ2ZXIKKyAgICAvLyAtPiBiZWhhdmUgbmljZWx5IGFuZCBhbGxvdyBmb3IgYXR0YWNoaW5nIGEgZGVidWdnZXIgdG8gdGhpcyBwcm9jZXNzCisgICAgaWYgKHNldHVwLmVuZHBvaW50ID0gdHJuc19Bbm9uUGlwZXMpIGFuZCBub3QgSXNEZWJ1Z2dlclByZXNlbnQKKyAgICB0aGVuIE1lc3NhZ2VCb3goIDAsICdBdHRhY2ggRGVidWdnZXIgYW5kL29yIGNsaWNrIE9LIHRvIGNvbnRpbnVlLicsCisgICAgICAgICAgICAgICAgICAgICAgICAnVGhyaWZ0IFRlc3RDbGllbnQgKERlbHBoaSknLAorICAgICAgICAgICAgICAgICAgICAgICAgTUJfT0sgb3IgTUJfSUNPTkVYQ0xBTUFUSU9OKTsKKworICAgIFNldExlbmd0aCggdGhyZWFkcywgRk51bVRocmVhZCk7CisgICAgZHRTdGFydCA6PSBOb3c7CisKKyAgICAvLyBsYXllcmVkIHRyYW5zcG9ydHMgYXJlIG5vdCByZWFsbHkgbWVhbnQgdG8gYmUgc3RhY2tlZCB1cG9uIGVhY2ggb3RoZXIKKyAgICBpZiAodHJuc19GcmFtZWQgaW4gc2V0dXAubGF5ZXJlZCkgdGhlbiBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIGZyYW1lZCB0cmFuc3BvcnQnKTsKKyAgICBlbmQKKyAgICBlbHNlIGlmICh0cm5zX0J1ZmZlcmVkIGluIHNldHVwLmxheWVyZWQpIHRoZW4gYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBidWZmZXJlZCB0cmFuc3BvcnQnKTsKKyAgICBlbmQ7CisKKyAgICBDb25zb2xlLldyaXRlTGluZShUSFJJRlRfUFJPVE9DT0xTW3NldHVwLnByb3RUeXBlXSsnIHByb3RvY29sJyk7CisKKyAgICBmb3IgdGVzdCA6PSAwIHRvIEZOdW1UaHJlYWQgLSAxIGRvIGJlZ2luCisgICAgICB0aHJlYWQgOj0gVENsaWVudFRocmVhZC5DcmVhdGUoIHNldHVwLCBGTnVtSXRlcmF0aW9uKTsKKyAgICAgIHRocmVhZHNbdGVzdF0gOj0gdGhyZWFkOworICAgICAgdGhyZWFkLlN0YXJ0OworICAgIGVuZDsKKworICAgIHJlc3VsdCA6PSAwOworICAgIGZvciB0ZXN0IDo9IDAgdG8gRk51bVRocmVhZCAtIDEgZG8gYmVnaW4KKyAgICAgIHRocmVhZEV4aXRDb2RlIDo9IHRocmVhZHNbdGVzdF0uV2FpdEZvcjsKKyAgICAgIHJlc3VsdCA6PSByZXN1bHQgb3IgdGhyZWFkRXhpdENvZGU7CisgICAgICB0aHJlYWRzW3Rlc3RdLkZyZWU7CisgICAgICB0aHJlYWRzW3Rlc3RdIDo9IG5pbDsKKyAgICBlbmQ7CisKKyAgICBDb25zb2xlLldyaXRlKCdUb3RhbCB0aW1lOiAnICsgSW50VG9TdHIoIE1pbGxpU2Vjb25kc0JldHdlZW4oTm93LCBkdFN0YXJ0KSkpOworCisgIGV4Y2VwdAorICAgIG9uIEU6IEVBYm9ydCBkbyByYWlzZTsKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8gYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCBFLk1lc3NhZ2UgKyAjMTAgKyBFLlN0YWNrVHJhY2UpOworICAgICAgcmFpc2U7CisgICAgZW5kOworICBlbmQ7CisKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJycpOworICBDb25zb2xlLldyaXRlTGluZSgnZG9uZSEnKTsKK2VuZDsKKworeyBUQ2xpZW50VGhyZWFkIH0KKworcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuQ2xpZW50VGVzdDsKK3ZhcgorICBjbGllbnQgOiBUVGhyaWZ0VGVzdC5JZmFjZTsKKyAgcyA6IHN0cmluZzsKKyAgaTggOiBTaG9ydEludDsKKyAgaTMyIDogSW50ZWdlcjsKKyAgaTY0IDogSW50NjQ7CisgIGJpbk91dCxiaW5JbiA6IFRCeXRlczsKKyAgZHViIDogRG91YmxlOworICBvIDogSVh0cnVjdDsKKyAgbzIgOiBJWHRydWN0MjsKKyAgaSA6IElYdHJ1Y3Q7CisgIGkyIDogSVh0cnVjdDI7CisgIG1hcG91dCA6IElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsSW50ZWdlcj47CisgIG1hcGluIDogSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlcixJbnRlZ2VyPjsKKyAgc3RybWFwb3V0IDogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz47CisgIHN0cm1hcGluIDogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz47CisgIGogOiBJbnRlZ2VyOworICBmaXJzdCA6IEJvb2xlYW47CisgIGtleSA6IEludGVnZXI7CisgIHN0cmtleSA6IHN0cmluZzsKKyAgbGlzdG91dCA6IElUaHJpZnRMaXN0PEludGVnZXI+OworICBsaXN0aW4gOiBJVGhyaWZ0TGlzdDxJbnRlZ2VyPjsKKyAgc2V0b3V0IDogSUhhc2hTZXQ8SW50ZWdlcj47CisgIHNldGluIDogSUhhc2hTZXQ8SW50ZWdlcj47CisgIHJldCA6IFROdW1iZXJ6OworICB1aWQgOiBJbnQ2NDsKKyAgbW0gOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJbnRlZ2VyPj47CisgIHBvcyA6IElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIEludGVnZXI+OworICBuZWcgOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJbnRlZ2VyPjsKKyAgbTIgOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJbnRlZ2VyPjsKKyAgazIgOiBJbnRlZ2VyOworICBpbnNhbmUgOiBJSW5zYW5pdHk7CisgIHRydWNrIDogSVh0cnVjdDsKKyAgd2hvYSA6IElUaHJpZnREaWN0aW9uYXJ5PEludDY0LCBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5Pj47CisgIGtleTY0IDogSW50NjQ7CisgIHZhbCA6IElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+OworICBrMl8yIDogVE51bWJlcno7CisgIGszIDogVE51bWJlcno7CisgIHYyIDogSUluc2FuaXR5OworICB1c2VyTWFwIDogSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIEludDY0PjsKKyAgeHRydWN0cyA6IElUaHJpZnRMaXN0PElYdHJ1Y3Q+OworICB4IDogSVh0cnVjdDsKKyAgYXJnMCA6IFNob3J0SW50OworICBhcmcxIDogSW50ZWdlcjsKKyAgYXJnMiA6IEludDY0OworICBhcmczIDogSVRocmlmdERpY3Rpb25hcnk8U21hbGxJbnQsIHN0cmluZz47CisgIGFyZzQgOiBUTnVtYmVyejsKKyAgYXJnNSA6IEludDY0OworICB7JElGREVGIFBlcmZUZXN0fQorICBTdGFydFRpY2sgOiBDYXJkaW5hbDsKKyAgayA6IEludGVnZXI7CisgIHskRU5ESUZ9CisgIGhlbGxvLCBnb29kYnllIDogSVh0cnVjdDsKKyAgY3JhenkgOiBJSW5zYW5pdHk7CisgIGxvb25leSA6IElJbnNhbml0eTsKKyAgZmlyc3RfbWFwIDogSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT47CisgIHNlY29uZF9tYXAgOiBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5PjsKKyAgcGFpciA6IFRQYWlyPFROdW1iZXJ6LCBUVXNlcklkPjsKKyAgdGVzdHNpemUgOiBUVGVzdFNpemU7CitiZWdpbgorICBjbGllbnQgOj0gVFRocmlmdFRlc3QuVENsaWVudC5DcmVhdGUoIEZQcm90b2NvbCk7CisgIEZUcmFuc3BvcnQuT3BlbjsKKworICB7JElGREVGIFN0cmVzc1Rlc3R9CisgIFN0cmVzc1Rlc3QoIGNsaWVudCk7CisgIHskRU5ESUYgU3RyZXNzVGVzdH0KKworICB7JElGREVGIEV4Y2VwdGlvbnN9CisgIC8vIGluLWRlcHRoIGV4Y2VwdGlvbiB0ZXN0CisgIC8vICgxKSBkbyB3ZSBnZXQgYW4gZXhjZXB0aW9uIGF0IGFsbD8KKyAgLy8gKDIpIGRvIHdlIGdldCB0aGUgcmlnaHQgZXhjZXB0aW9uPworICAvLyAoMykgZG9lcyB0aGUgZXhjZXB0aW9uIGNvbnRhaW4gdGhlIGV4cGVjdGVkIGRhdGE/CisgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdEV4Y2VwdGlvbicsIHRlc3RfRXhjZXB0aW9ucyk7CisgIC8vIGNhc2UgMTogZXhjZXB0aW9uIHR5cGUgZGVjbGFyZWQgaW4gSURMIGF0IHRoZSBmdW5jdGlvbiBjYWxsCisgIHRyeQorICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpOworICAgIEV4cGVjdCggRkFMU0UsICd0ZXN0RXhjZXB0aW9uKCcnWGNlcHRpb24nJyk6IG11c3QgdHJvdyBhbiBleGNlcHRpb24nKTsKKyAgZXhjZXB0CisgICAgb24gZTpUWGNlcHRpb24gZG8gYmVnaW4KKyAgICAgIEV4cGVjdCggZS5FcnJvckNvZGUgPSAxMDAxLCAgICAgICAnZXJyb3IgY29kZScpOworICAgICAgRXhwZWN0KCBlLk1lc3NhZ2VfICA9ICdYY2VwdGlvbicsICdlcnJvciBtZXNzYWdlJyk7CisgICAgICBDb25zb2xlLldyaXRlTGluZSggJyA9ICcgKyBJbnRUb1N0cihlLkVycm9yQ29kZSkgKyAnLCAnICsgZS5NZXNzYWdlXyApOworICAgIGVuZDsKKyAgICBvbiBlOlRUcmFuc3BvcnRFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgOiAiJytlLlRvU3RyaW5nKyciJyk7CisgICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CisgIGVuZDsKKworICAvLyBjYXNlIDI6IGV4Y2VwdGlvbiB0eXBlIE5PVCBkZWNsYXJlZCBpbiBJREwgYXQgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgLy8gdGhpcyB3aWxsIGNsb3NlIHRoZSBjb25uZWN0aW9uCisgIHRyeQorICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdURXhjZXB0aW9uJyk7CisgICAgRXhwZWN0KCBGQUxTRSwgJ3Rlc3RFeGNlcHRpb24oJydURXhjZXB0aW9uJycpOiBtdXN0IHRyb3cgYW4gZXhjZXB0aW9uJyk7CisgIGV4Y2VwdAorICAgIG9uIGU6VFRyYW5zcG9ydEV4Y2VwdGlvbiBkbyBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIGUuQ2xhc3NOYW1lKycgPSAnK2UuTWVzc2FnZSk7IC8vIHRoaXMgaXMgd2hhdCB3ZSBnZXQKKyAgICBlbmQ7CisgICAgb24gZTpUQXBwbGljYXRpb25FeGNlcHRpb24gZG8gYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCBlLkNsYXNzTmFtZSsnID0gJytlLk1lc3NhZ2UpOyAvLyB0aGlzIGlzIHdoYXQgd2UgZ2V0CisgICAgZW5kOworICAgIG9uIGU6VEV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKKyAgZW5kOworCisKKyAgaWYgRlRyYW5zcG9ydC5Jc09wZW4gdGhlbiBGVHJhbnNwb3J0LkNsb3NlOworICBGVHJhbnNwb3J0Lk9wZW47ICAgLy8gcmUtb3BlbiBjb25uZWN0aW9uLCBzZXJ2ZXIgaGFzIGFscmVhZHkgY2xvc2VkCisKKworICAvLyBjYXNlIDM6IG5vIGV4Y2VwdGlvbgorICB0cnkKKyAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignc29tZXRoaW5nJyk7CisgICAgRXhwZWN0KCBUUlVFLCAndGVzdEV4Y2VwdGlvbignJ3NvbWV0aGluZycnKTogbXVzdCBub3QgdHJvdyBhbiBleGNlcHRpb24nKTsKKyAgZXhjZXB0CisgICAgb24gZTpUVHJhbnNwb3J0RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIDogIicrZS5Ub1N0cmluZysnIicpOworICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOworICBlbmQ7CisgIHskRU5ESUYgRXhjZXB0aW9uc30KKworCisgIC8vIHNpbXBsZSB0aGluZ3MKKyAgU3RhcnRUZXN0R3JvdXAoICdzaW1wbGUgVGhyaWZ0IGNhbGxzJywgdGVzdF9CYXNlVHlwZXMpOworICBjbGllbnQudGVzdFZvaWQoKTsKKyAgRXhwZWN0KCBUUlVFLCAndGVzdFZvaWQoKScpOyAgLy8gc3VjY2VzcyA6PSBubyBleGNlcHRpb24KKworICBzIDo9IEJvb2xUb1N0cmluZyggY2xpZW50LnRlc3RCb29sKFRSVUUpKTsKKyAgRXhwZWN0KCBzID0gQm9vbFRvU3RyaW5nKFRSVUUpLCAgJ3Rlc3RCb29sKFRSVUUpID0gJytzKTsKKyAgcyA6PSBCb29sVG9TdHJpbmcoIGNsaWVudC50ZXN0Qm9vbChGQUxTRSkpOworICBFeHBlY3QoIHMgPSBCb29sVG9TdHJpbmcoRkFMU0UpLCAgJ3Rlc3RCb29sKEZBTFNFKSA9ICcrcyk7CisKKyAgcyA6PSBjbGllbnQudGVzdFN0cmluZygnVGVzdCcpOworICBFeHBlY3QoIHMgPSAnVGVzdCcsICd0ZXN0U3RyaW5nKCcnVGVzdCcnKSA9ICInK3MrJyInKTsKKworICBzIDo9IGNsaWVudC50ZXN0U3RyaW5nKCcnKTsgIC8vIGVtcHR5IHN0cmluZworICBFeHBlY3QoIHMgPSAnJywgJ3Rlc3RTdHJpbmcoJycnJykgPSAiJytzKyciJyk7CisKKyAgcyA6PSBjbGllbnQudGVzdFN0cmluZyhIVUdFX1RFU1RfU1RSSU5HKTsKKyAgRXhwZWN0KCBsZW5ndGgocykgPSBsZW5ndGgoSFVHRV9URVNUX1NUUklORyksCisgICAgICAgICAgJ3Rlc3RTdHJpbmcoIGxlbmd0aChIVUdFX1RFU1RfU1RSSU5HKSA9ICcrSW50VG9TdHIoTGVuZ3RoKEhVR0VfVEVTVF9TVFJJTkcpKSsnKSAnCisgICAgICAgICArJz0+IGxlbmd0aChyZXN1bHQpID0gJytJbnRUb1N0cihMZW5ndGgocykpKTsKKworICBpOCA6PSBjbGllbnQudGVzdEJ5dGUoMSk7CisgIEV4cGVjdCggaTggPSAxLCAndGVzdEJ5dGUoMSkgPSAnICsgSW50VG9TdHIoIGk4ICkpOworCisgIGkzMiA6PSBjbGllbnQudGVzdEkzMigtMSk7CisgIEV4cGVjdCggaTMyID0gLTEsICd0ZXN0STMyKC0xKSA9ICcgKyBJbnRUb1N0cihpMzIpKTsKKworICBDb25zb2xlLldyaXRlTGluZSgndGVzdEk2NCgtMzQzNTk3MzgzNjgpJyk7CisgIGk2NCA6PSBjbGllbnQudGVzdEk2NCgtMzQzNTk3MzgzNjgpOworICBFeHBlY3QoIGk2NCA9IC0zNDM1OTczODM2OCwgJ3Rlc3RJNjQoLTM0MzU5NzM4MzY4KSA9ICcgKyBJbnRUb1N0ciggaTY0KSk7CisKKyAgLy8gcmFuZG9tIGJpbmFyeSBzbWFsbAorICBmb3IgdGVzdHNpemUgOj0gTG93KFRUZXN0U2l6ZSkgdG8gSGlnaChUVGVzdFNpemUpIGRvIGJlZ2luCisgICAgYmluT3V0IDo9IFByZXBhcmVCaW5hcnlEYXRhKCBUUlVFLCB0ZXN0c2l6ZSk7CisgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RCaW5hcnkoJytCeXRlc1RvSGV4KGJpbk91dCkrJyknKTsKKyAgICB0cnkKKyAgICAgIGJpbkluIDo9IGNsaWVudC50ZXN0QmluYXJ5KGJpbk91dCk7CisgICAgICBFeHBlY3QoIExlbmd0aChiaW5PdXQpID0gTGVuZ3RoKGJpbkluKSwgJ3Rlc3RCaW5hcnkoKTogbGVuZ3RoICcrSW50VG9TdHIoTGVuZ3RoKGJpbk91dCkpKycgPSAnK0ludFRvU3RyKExlbmd0aChiaW5JbikpKTsKKyAgICAgIGkzMiA6PSBNaW4oIExlbmd0aChiaW5PdXQpLCBMZW5ndGgoYmluSW4pKTsKKyAgICAgIEV4cGVjdCggQ29tcGFyZU1lbSggYmluT3V0LCBiaW5JbiwgaTMyKSwgJ3Rlc3RCaW5hcnkoJytCeXRlc1RvSGV4KGJpbk91dCkrJykgPSAnK0J5dGVzVG9IZXgoYmluSW4pKTsKKyAgICBleGNlcHQKKyAgICAgIG9uIGU6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIGRvIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0QmluYXJ5KCk6ICcrZS5NZXNzYWdlKTsKKyAgICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICd0ZXN0QmluYXJ5KCk6IFVuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CisgICAgZW5kOworICBlbmQ7CisKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3REb3VibGUoNS4zMjUwOTgyMzUpJyk7CisgIGR1YiA6PSBjbGllbnQudGVzdERvdWJsZSg1LjMyNTA5ODIzNSk7CisgIEV4cGVjdCggYWJzKGR1Yi01LjMyNTA5ODIzNSkgPCAxZS0xNCwgJ3Rlc3REb3VibGUoNS4zMjUwOTgyMzUpID0gJyArIEZsb2F0VG9TdHIoIGR1YikpOworCisgIC8vIHN0cnVjdHMKKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0U3RydWN0JywgdGVzdF9TdHJ1Y3RzKTsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RTdHJ1Y3QoeycnWmVybycnLCAxLCAtMywgLTV9KScpOworICBvIDo9IFRYdHJ1Y3RJbXBsLkNyZWF0ZTsKKyAgby5TdHJpbmdfdGhpbmcgOj0gJ1plcm8nOworICBvLkJ5dGVfdGhpbmcgOj0gMTsKKyAgby5JMzJfdGhpbmcgOj0gLTM7CisgIG8uSTY0X3RoaW5nIDo9IC01OworICBpIDo9IGNsaWVudC50ZXN0U3RydWN0KG8pOworICBFeHBlY3QoIGkuU3RyaW5nX3RoaW5nID0gJ1plcm8nLCAnaS5TdHJpbmdfdGhpbmcgPSAiJytpLlN0cmluZ190aGluZysnIicpOworICBFeHBlY3QoIGkuQnl0ZV90aGluZyA9IDEsICdpLkJ5dGVfdGhpbmcgPSAnK0ludFRvU3RyKGkuQnl0ZV90aGluZykpOworICBFeHBlY3QoIGkuSTMyX3RoaW5nID0gLTMsICdpLkkzMl90aGluZyA9ICcrSW50VG9TdHIoaS5JMzJfdGhpbmcpKTsKKyAgRXhwZWN0KCBpLkk2NF90aGluZyA9IC01LCAnaS5JNjRfdGhpbmcgPSAnK0ludFRvU3RyKGkuSTY0X3RoaW5nKSk7CisgIEV4cGVjdCggaS5fX2lzc2V0X1N0cmluZ190aGluZywgJ2kuX19pc3NldF9TdHJpbmdfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhpLl9faXNzZXRfU3RyaW5nX3RoaW5nKSk7CisgIEV4cGVjdCggaS5fX2lzc2V0X0J5dGVfdGhpbmcsICdpLl9faXNzZXRfQnl0ZV90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9CeXRlX3RoaW5nKSk7CisgIEV4cGVjdCggaS5fX2lzc2V0X0kzMl90aGluZywgJ2kuX19pc3NldF9JMzJfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhpLl9faXNzZXRfSTMyX3RoaW5nKSk7CisgIEV4cGVjdCggaS5fX2lzc2V0X0k2NF90aGluZywgJ2kuX19pc3NldF9JNjRfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhpLl9faXNzZXRfSTY0X3RoaW5nKSk7CisKKyAgLy8gbmVzdGVkIHN0cnVjdHMKKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0TmVzdCcsIHRlc3RfU3RydWN0cyk7CisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0TmVzdCh7MSwgeycnWmVybycnLCAxLCAtMywgLTV9LCA1fSknKTsKKyAgbzIgOj0gVFh0cnVjdDJJbXBsLkNyZWF0ZTsKKyAgbzIuQnl0ZV90aGluZyA6PSAxOworICBvMi5TdHJ1Y3RfdGhpbmcgOj0gbzsKKyAgbzIuSTMyX3RoaW5nIDo9IDU7CisgIGkyIDo9IGNsaWVudC50ZXN0TmVzdChvMik7CisgIGkgOj0gaTIuU3RydWN0X3RoaW5nOworICBFeHBlY3QoIGkuU3RyaW5nX3RoaW5nID0gJ1plcm8nLCAnaS5TdHJpbmdfdGhpbmcgPSAiJytpLlN0cmluZ190aGluZysnIicpOworICBFeHBlY3QoIGkuQnl0ZV90aGluZyA9IDEsICAnaS5CeXRlX3RoaW5nID0gJytJbnRUb1N0cihpLkJ5dGVfdGhpbmcpKTsKKyAgRXhwZWN0KCBpLkkzMl90aGluZyA9IC0zLCAgJ2kuSTMyX3RoaW5nID0gJytJbnRUb1N0cihpLkkzMl90aGluZykpOworICBFeHBlY3QoIGkuSTY0X3RoaW5nID0gLTUsICAnaS5JNjRfdGhpbmcgPSAnK0ludFRvU3RyKGkuSTY0X3RoaW5nKSk7CisgIEV4cGVjdCggaTIuQnl0ZV90aGluZyA9IDEsICdpMi5CeXRlX3RoaW5nID0gJytJbnRUb1N0cihpMi5CeXRlX3RoaW5nKSk7CisgIEV4cGVjdCggaTIuSTMyX3RoaW5nID0gNSwgICdpMi5JMzJfdGhpbmcgPSAnK0ludFRvU3RyKGkyLkkzMl90aGluZykpOworICBFeHBlY3QoIGkuX19pc3NldF9TdHJpbmdfdGhpbmcsICdpLl9faXNzZXRfU3RyaW5nX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X1N0cmluZ190aGluZykpOworICBFeHBlY3QoIGkuX19pc3NldF9CeXRlX3RoaW5nLCAgJ2kuX19pc3NldF9CeXRlX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X0J5dGVfdGhpbmcpKTsKKyAgRXhwZWN0KCBpLl9faXNzZXRfSTMyX3RoaW5nLCAgJ2kuX19pc3NldF9JMzJfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhpLl9faXNzZXRfSTMyX3RoaW5nKSk7CisgIEV4cGVjdCggaS5fX2lzc2V0X0k2NF90aGluZywgICdpLl9faXNzZXRfSTY0X3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X0k2NF90aGluZykpOworICBFeHBlY3QoIGkyLl9faXNzZXRfQnl0ZV90aGluZywgJ2kyLl9faXNzZXRfQnl0ZV90aGluZycpOworICBFeHBlY3QoIGkyLl9faXNzZXRfSTMyX3RoaW5nLCAgJ2kyLl9faXNzZXRfSTMyX3RoaW5nJyk7CisKKyAgLy8gbWFwPHR5cGUxLHR5cGUyPjogQSBtYXAgb2Ygc3RyaWN0bHkgdW5pcXVlIGtleXMgdG8gdmFsdWVzLgorICAvLyBUcmFuc2xhdGVzIHRvIGFuIFNUTCBtYXAsIEphdmEgSGFzaE1hcCwgUEhQIGFzc29jaWF0aXZlIGFycmF5LCBQeXRob24vUnVieSBkaWN0aW9uYXJ5LCBldGMuCisgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdE1hcCcsIHRlc3RfQ29udGFpbmVycyk7CisgIG1hcG91dCA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8SW50ZWdlcixJbnRlZ2VyPi5DcmVhdGU7CisgIGZvciBqIDo9IDAgdG8gNCBkbworICBiZWdpbgorICAgIG1hcG91dC5BZGRPclNldFZhbHVlKCBqLCBqIC0gMTApOworICBlbmQ7CisgIENvbnNvbGUuV3JpdGUoJ3Rlc3RNYXAoeycpOworICBmaXJzdCA6PSBUcnVlOworICBmb3Iga2V5IGluIG1hcG91dC5LZXlzIGRvCisgIGJlZ2luCisgICAgaWYgZmlyc3QKKyAgICB0aGVuIGZpcnN0IDo9IEZhbHNlCisgICAgZWxzZSBDb25zb2xlLldyaXRlKCAnLCAnICk7CisgICAgQ29uc29sZS5Xcml0ZSggSW50VG9TdHIoIGtleSkgKyAnID0+ICcgKyBJbnRUb1N0ciggbWFwb3V0W2tleV0pKTsKKyAgZW5kOworICBDb25zb2xlLldyaXRlTGluZSgnfSknKTsKKworICBtYXBpbiA6PSBjbGllbnQudGVzdE1hcCggbWFwb3V0ICk7CisgIEV4cGVjdCggbWFwaW4uQ291bnQgPSBtYXBvdXQuQ291bnQsICd0ZXN0TWFwOiBtYXBpbi5Db3VudCA9IG1hcG91dC5Db3VudCcpOworICBmb3IgaiA6PSAwIHRvIDQgZG8KKyAgYmVnaW4KKyAgICBFeHBlY3QoIG1hcG91dC5Db250YWluc0tleShqKSwgJ3Rlc3RNYXA6IG1hcG91dC5Db250YWluc0tleSgnK0ludFRvU3RyKGopKycpID0gJytCb29sVG9TdHJpbmcobWFwb3V0LkNvbnRhaW5zS2V5KGopKSk7CisgIGVuZDsKKyAgZm9yIGtleSBpbiBtYXBpbi5LZXlzIGRvCisgIGJlZ2luCisgICAgRXhwZWN0KCBtYXBpbltrZXldID0gbWFwb3V0W2tleV0sICd0ZXN0TWFwOiAnK0ludFRvU3RyKGtleSkgKyAnID0+ICcgKyBJbnRUb1N0ciggbWFwaW5ba2V5XSkpOworICAgIEV4cGVjdCggbWFwaW5ba2V5XSA9IGtleSAtIDEwLCAndGVzdE1hcDogbWFwaW5bJytJbnRUb1N0cihrZXkpKyddID0gJytJbnRUb1N0ciggbWFwaW5ba2V5XSkpOworICBlbmQ7CisKKworICAvLyBtYXA8dHlwZTEsdHlwZTI+OiBBIG1hcCBvZiBzdHJpY3RseSB1bmlxdWUga2V5cyB0byB2YWx1ZXMuCisgIC8vIFRyYW5zbGF0ZXMgdG8gYW4gU1RMIG1hcCwgSmF2YSBIYXNoTWFwLCBQSFAgYXNzb2NpYXRpdmUgYXJyYXksIFB5dGhvbi9SdWJ5IGRpY3Rpb25hcnksIGV0Yy4KKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0U3RyaW5nTWFwJywgdGVzdF9Db250YWluZXJzKTsKKyAgc3RybWFwb3V0IDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxzdHJpbmcsc3RyaW5nPi5DcmVhdGU7CisgIGZvciBqIDo9IDAgdG8gNCBkbworICBiZWdpbgorICAgIHN0cm1hcG91dC5BZGRPclNldFZhbHVlKCBJbnRUb1N0cihqKSwgSW50VG9TdHIoaiAtIDEwKSk7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZSgndGVzdFN0cmluZ01hcCh7Jyk7CisgIGZpcnN0IDo9IFRydWU7CisgIGZvciBzdHJrZXkgaW4gc3RybWFwb3V0LktleXMgZG8KKyAgYmVnaW4KKyAgICBpZiBmaXJzdAorICAgIHRoZW4gZmlyc3QgOj0gRmFsc2UKKyAgICBlbHNlIENvbnNvbGUuV3JpdGUoICcsICcgKTsKKyAgICBDb25zb2xlLldyaXRlKCBzdHJrZXkgKyAnID0+ICcgKyBzdHJtYXBvdXRbc3Rya2V5XSk7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ30pJyk7CisKKyAgc3RybWFwaW4gOj0gY2xpZW50LnRlc3RTdHJpbmdNYXAoIHN0cm1hcG91dCApOworICBFeHBlY3QoIHN0cm1hcGluLkNvdW50ID0gc3RybWFwb3V0LkNvdW50LCAndGVzdFN0cmluZ01hcDogc3RybWFwaW4uQ291bnQgPSBzdHJtYXBvdXQuQ291bnQnKTsKKyAgZm9yIGogOj0gMCB0byA0IGRvCisgIGJlZ2luCisgICAgRXhwZWN0KCBzdHJtYXBvdXQuQ29udGFpbnNLZXkoSW50VG9TdHIoaikpLAorICAgICAgICAgICAgJ3Rlc3RTdHJpbmdNYXA6IHN0cm1hcG91dC5Db250YWluc0tleSgnK0ludFRvU3RyKGopKycpID0gJworICAgICAgICAgICAgKyBCb29sVG9TdHJpbmcoc3RybWFwb3V0LkNvbnRhaW5zS2V5KEludFRvU3RyKGopKSkpOworICBlbmQ7CisgIGZvciBzdHJrZXkgaW4gc3RybWFwaW4uS2V5cyBkbworICBiZWdpbgorICAgIEV4cGVjdCggc3RybWFwaW5bc3Rya2V5XSA9IHN0cm1hcG91dFtzdHJrZXldLCAndGVzdFN0cmluZ01hcDogJytzdHJrZXkgKyAnID0+ICcgKyBzdHJtYXBpbltzdHJrZXldKTsKKyAgICBFeHBlY3QoIHN0cm1hcGluW3N0cmtleV0gPSBJbnRUb1N0ciggU3RyVG9JbnQoc3Rya2V5KSAtIDEwKSwgJ3Rlc3RTdHJpbmdNYXA6IHN0cm1hcGluWycrc3Rya2V5KyddID0gJytzdHJtYXBpbltzdHJrZXldKTsKKyAgZW5kOworCisKKyAgLy8gc2V0PHR5cGU+OiBBbiB1bm9yZGVyZWQgc2V0IG9mIHVuaXF1ZSBlbGVtZW50cy4KKyAgLy8gVHJhbnNsYXRlcyB0byBhbiBTVEwgc2V0LCBKYXZhIEhhc2hTZXQsIHNldCBpbiBQeXRob24sIGV0Yy4KKyAgLy8gTm90ZTogUEhQIGRvZXMgbm90IHN1cHBvcnQgc2V0cywgc28gaXQgaXMgdHJlYXRlZCBzaW1pbGFyIHRvIGEgTGlzdAorICBTdGFydFRlc3RHcm91cCggJ3Rlc3RTZXQnLCB0ZXN0X0NvbnRhaW5lcnMpOworICBzZXRvdXQgOj0gVEhhc2hTZXRJbXBsPEludGVnZXI+LkNyZWF0ZTsKKyAgZm9yIGogOj0gLTIgdG8gMiBkbworICBiZWdpbgorICAgIHNldG91dC5BZGQoIGogKTsKKyAgZW5kOworICBDb25zb2xlLldyaXRlKCd0ZXN0U2V0KHsnKTsKKyAgZmlyc3QgOj0gVHJ1ZTsKKyAgZm9yIGogaW4gc2V0b3V0IGRvCisgIGJlZ2luCisgICAgaWYgZmlyc3QKKyAgICB0aGVuIGZpcnN0IDo9IEZhbHNlCisgICAgZWxzZSBDb25zb2xlLldyaXRlKCcsICcpOworICAgIENvbnNvbGUuV3JpdGUoSW50VG9TdHIoIGopKTsKKyAgZW5kOworICBDb25zb2xlLldyaXRlTGluZSgnfSknKTsKKworICBzZXRpbiA6PSBjbGllbnQudGVzdFNldChzZXRvdXQpOworICBFeHBlY3QoIHNldGluLkNvdW50ID0gc2V0b3V0LkNvdW50LCAndGVzdFNldDogc2V0aW4uQ291bnQgPSBzZXRvdXQuQ291bnQnKTsKKyAgRXhwZWN0KCBzZXRpbi5Db3VudCA9IDUsICd0ZXN0U2V0OiBzZXRpbi5Db3VudCA9ICcrSW50VG9TdHIoc2V0aW4uQ291bnQpKTsKKyAgZm9yIGogOj0gLTIgdG8gMiBkbyAvLyB1bm9yZGVyZWQsIHdlIGNhbid0IHJlbHkgb24gdGhlIG9yZGVyID0+IHRlc3QgZm9yIGtub3duIGVsZW1lbnRzIG9ubHkKKyAgYmVnaW4KKyAgICBFeHBlY3QoIHNldGluLkNvbnRhaW5zKGopLCAndGVzdFNldDogc2V0aW4uQ29udGFpbnMoJytJbnRUb1N0cihqKSsnKSA9PiAnK0Jvb2xUb1N0cmluZyhzZXRpbi5Db250YWlucyhqKSkpOworICBlbmQ7CisKKyAgLy8gbGlzdDx0eXBlPjogQW4gb3JkZXJlZCBsaXN0IG9mIGVsZW1lbnRzLgorICAvLyBUcmFuc2xhdGVzIHRvIGFuIFNUTCB2ZWN0b3IsIEphdmEgQXJyYXlMaXN0LCBuYXRpdmUgYXJyYXlzIGluIHNjcmlwdGluZyBsYW5ndWFnZXMsIGV0Yy4KKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0TGlzdCcsIHRlc3RfQ29udGFpbmVycyk7CisgIGxpc3RvdXQgOj0gVFRocmlmdExpc3RJbXBsPEludGVnZXI+LkNyZWF0ZTsKKyAgbGlzdG91dC5BZGQoICsxKTsKKyAgbGlzdG91dC5BZGQoIC0yKTsKKyAgbGlzdG91dC5BZGQoICszKTsKKyAgbGlzdG91dC5BZGQoIC00KTsKKyAgbGlzdG91dC5BZGQoIDApOworICBDb25zb2xlLldyaXRlKCd0ZXN0TGlzdCh7Jyk7CisgIGZpcnN0IDo9IFRydWU7CisgIGZvciBqIGluIGxpc3RvdXQgZG8KKyAgICBiZWdpbgorICAgIGlmIGZpcnN0CisgICAgdGhlbiBmaXJzdCA6PSBGYWxzZQorICAgIGVsc2UgQ29uc29sZS5Xcml0ZSgnLCAnKTsKKyAgICBDb25zb2xlLldyaXRlKEludFRvU3RyKCBqKSk7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ30pJyk7CisKKyAgbGlzdGluIDo9IGNsaWVudC50ZXN0TGlzdChsaXN0b3V0KTsKKyAgRXhwZWN0KCBsaXN0aW4uQ291bnQgPSBsaXN0b3V0LkNvdW50LCAndGVzdExpc3Q6IGxpc3Rpbi5Db3VudCA9IGxpc3RvdXQuQ291bnQnKTsKKyAgRXhwZWN0KCBsaXN0aW4uQ291bnQgPSA1LCAndGVzdExpc3Q6IGxpc3Rpbi5Db3VudCA9ICcrSW50VG9TdHIobGlzdGluLkNvdW50KSk7CisgIEV4cGVjdCggbGlzdGluWzBdID0gKzEsICdsaXN0aW5bMF0gPSAnK0ludFRvU3RyKCBsaXN0aW5bMF0pKTsKKyAgRXhwZWN0KCBsaXN0aW5bMV0gPSAtMiwgJ2xpc3RpblsxXSA9ICcrSW50VG9TdHIoIGxpc3RpblsxXSkpOworICBFeHBlY3QoIGxpc3RpblsyXSA9ICszLCAnbGlzdGluWzJdID0gJytJbnRUb1N0ciggbGlzdGluWzJdKSk7CisgIEV4cGVjdCggbGlzdGluWzNdID0gLTQsICdsaXN0aW5bM10gPSAnK0ludFRvU3RyKCBsaXN0aW5bM10pKTsKKyAgRXhwZWN0KCBsaXN0aW5bNF0gPSAwLCAgJ2xpc3Rpbls0XSA9ICcrSW50VG9TdHIoIGxpc3Rpbls0XSkpOworCisgIC8vIGVudW1zCisgIHJldCA6PSBjbGllbnQudGVzdEVudW0oVE51bWJlcnouT05FKTsKKyAgRXhwZWN0KCByZXQgPSBUTnVtYmVyei5PTkUsICd0ZXN0RW51bShPTkUpID0gJytJbnRUb1N0cihPcmQocmV0KSkpOworCisgIHJldCA6PSBjbGllbnQudGVzdEVudW0oVE51bWJlcnouVFdPKTsKKyAgRXhwZWN0KCByZXQgPSBUTnVtYmVyei5UV08sICd0ZXN0RW51bShUV08pID0gJytJbnRUb1N0cihPcmQocmV0KSkpOworCisgIHJldCA6PSBjbGllbnQudGVzdEVudW0oVE51bWJlcnouVEhSRUUpOworICBFeHBlY3QoIHJldCA9IFROdW1iZXJ6LlRIUkVFLCAndGVzdEVudW0oVEhSRUUpID0gJytJbnRUb1N0cihPcmQocmV0KSkpOworCisgIHJldCA6PSBjbGllbnQudGVzdEVudW0oVE51bWJlcnouRklWRSk7CisgIEV4cGVjdCggcmV0ID0gVE51bWJlcnouRklWRSwgJ3Rlc3RFbnVtKEZJVkUpID0gJytJbnRUb1N0cihPcmQocmV0KSkpOworCisgIHJldCA6PSBjbGllbnQudGVzdEVudW0oVE51bWJlcnouRUlHSFQpOworICBFeHBlY3QoIHJldCA9IFROdW1iZXJ6LkVJR0hULCAndGVzdEVudW0oRUlHSFQpID0gJytJbnRUb1N0cihPcmQocmV0KSkpOworCisKKyAgLy8gdHlwZWRlZgorICB1aWQgOj0gY2xpZW50LnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMyk7CisgIEV4cGVjdCggdWlkID0gMzA5ODU4MjM1MDgyNTIzLCAndGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSA9ICcrSW50VG9TdHIodWlkKSk7CisKKworICAvLyBtYXBzIG9mIG1hcHMKKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0TWFwTWFwKDEpJywgdGVzdF9Db250YWluZXJzKTsKKyAgbW0gOj0gY2xpZW50LnRlc3RNYXBNYXAoMSk7CisgIENvbnNvbGUuV3JpdGUoJyA9IHsnKTsKKyAgZm9yIGtleSBpbiBtbS5LZXlzIGRvCisgIGJlZ2luCisgICAgQ29uc29sZS5Xcml0ZSggSW50VG9TdHIoIGtleSkgKyAnID0+IHsnKTsKKyAgICBtMiA6PSBtbVtrZXldOworICAgIGZvciAgazIgaW4gbTIuS2V5cyBkbworICAgIGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlKCBJbnRUb1N0ciggazIpICsgJyA9PiAnICsgSW50VG9TdHIoIG0yW2syXSkgKyAnLCAnKTsKKyAgICBlbmQ7CisgICAgQ29uc29sZS5Xcml0ZSgnfSwgJyk7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ30nKTsKKworICAvLyB2ZXJpZnkgcmVzdWx0IGRhdGEKKyAgRXhwZWN0KCBtbS5Db3VudCA9IDIsICdtbS5Db3VudCA9ICcrSW50VG9TdHIobW0uQ291bnQpKTsKKyAgcG9zIDo9IG1tWzRdOworICBuZWcgOj0gbW1bLTRdOworICBmb3IgaiA6PSAxIHRvIDQgZG8KKyAgYmVnaW4KKyAgICBFeHBlY3QoIHBvc1tqXSAgPSBqLCAgJ3Bvc1tqXSAgPSAnK0ludFRvU3RyKHBvc1tqXSkpOworICAgIEV4cGVjdCggbmVnWy1qXSA9IC1qLCAnbmVnWy1qXSA9ICcrSW50VG9TdHIobmVnWy1qXSkpOworICBlbmQ7CisKKworCisgIC8vIGluc2FuaXR5CisgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdEluc2FuaXR5JywgdGVzdF9TdHJ1Y3RzKTsKKyAgaW5zYW5lIDo9IFRJbnNhbml0eUltcGwuQ3JlYXRlOworICBpbnNhbmUuVXNlck1hcCA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VE51bWJlcnosIEludDY0Pi5DcmVhdGU7CisgIGluc2FuZS5Vc2VyTWFwLkFkZE9yU2V0VmFsdWUoIFROdW1iZXJ6LkZJVkUsIDUwMDApOworICB0cnVjayA6PSBUWHRydWN0SW1wbC5DcmVhdGU7CisgIHRydWNrLlN0cmluZ190aGluZyA6PSAnVHJ1Y2snOworICB0cnVjay5CeXRlX3RoaW5nIDo9IC04OyAgLy8gYnl0ZSBpcyBzaWduZWQKKyAgdHJ1Y2suSTMyX3RoaW5nIDo9IDMyOworICB0cnVjay5JNjRfdGhpbmcgOj0gNjQ7CisgIGluc2FuZS5YdHJ1Y3RzIDo9IFRUaHJpZnRMaXN0SW1wbDxJWHRydWN0Pi5DcmVhdGU7CisgIGluc2FuZS5YdHJ1Y3RzLkFkZCggdHJ1Y2sgKTsKKyAgd2hvYSA6PSBjbGllbnQudGVzdEluc2FuaXR5KCBpbnNhbmUgKTsKKyAgQ29uc29sZS5Xcml0ZSgnID0geycpOworICBmb3Iga2V5NjQgaW4gd2hvYS5LZXlzIGRvCisgIGJlZ2luCisgICAgdmFsIDo9IHdob2Fba2V5NjRdOworICAgIENvbnNvbGUuV3JpdGUoIEludFRvU3RyKCBrZXk2NCkgKyAnID0+IHsnKTsKKyAgICBmb3IgazJfMiBpbiB2YWwuS2V5cyBkbworICAgIGJlZ2luCisgICAgICB2MiA6PSB2YWxbazJfMl07CisgICAgICBDb25zb2xlLldyaXRlKCBJbnRUb1N0ciggSW50ZWdlciggazJfMikpICsgJyA9PiB7Jyk7CisgICAgICB1c2VyTWFwIDo9IHYyLlVzZXJNYXA7CisgICAgICBDb25zb2xlLldyaXRlKCd7Jyk7CisgICAgICBpZiB1c2VyTWFwIDw+IG5pbCB0aGVuCisgICAgICBiZWdpbgorICAgICAgICBmb3IgazMgaW4gdXNlck1hcC5LZXlzIGRvCisgICAgICAgIGJlZ2luCisgICAgICAgICAgQ29uc29sZS5Xcml0ZSggSW50VG9TdHIoIEludGVnZXIoIGszKSkgKyAnID0+ICcgKyBJbnRUb1N0ciggdXNlck1hcFtrM10pICsgJywgJyk7CisgICAgICAgIGVuZDsKKyAgICAgIGVuZCBlbHNlCisgICAgICBiZWdpbgorICAgICAgICBDb25zb2xlLldyaXRlKCdudWxsJyk7CisgICAgICBlbmQ7CisgICAgICBDb25zb2xlLldyaXRlKCd9LCAnKTsKKyAgICAgIHh0cnVjdHMgOj0gdjIuWHRydWN0czsKKyAgICAgIENvbnNvbGUuV3JpdGUoJ3snKTsKKworICAgICAgaWYgeHRydWN0cyA8PiBuaWwgdGhlbgorICAgICAgYmVnaW4KKyAgICAgICAgZm9yIHggaW4geHRydWN0cyBkbworICAgICAgICBiZWdpbgorICAgICAgICAgIENvbnNvbGUuV3JpdGUoJ3siJyArIHguU3RyaW5nX3RoaW5nICsgJyIsICcgKworICAgICAgICAgICAgSW50VG9TdHIoIHguQnl0ZV90aGluZykgKyAnLCAnICsKKyAgICAgICAgICAgIEludFRvU3RyKCB4LkkzMl90aGluZykgKyAnLCAnICsKKyAgICAgICAgICAgIEludFRvU3RyKCB4LkkzMl90aGluZykgKyAnfSwgJyk7CisgICAgICAgIGVuZDsKKyAgICAgIGVuZCBlbHNlCisgICAgICBiZWdpbgorICAgICAgICBDb25zb2xlLldyaXRlKCdudWxsJyk7CisgICAgICBlbmQ7CisgICAgICBDb25zb2xlLldyaXRlKCd9Jyk7CisgICAgICBDb25zb2xlLldyaXRlKCd9LCAnKTsKKyAgICBlbmQ7CisgICAgQ29uc29sZS5Xcml0ZSgnfSwgJyk7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ30nKTsKKworICAoKioKKyAgICogU28geW91IHRoaW5rIHlvdSd2ZSBnb3QgdGhpcyBhbGwgd29ya2VkLCBvdXQgZWg/CisgICAqCisgICAqIENyZWF0ZXMgYSB0aGUgcmV0dXJuZWQgbWFwIHdpdGggdGhlc2UgdmFsdWVzIGFuZCBwcmludHMgaXQgb3V0OgorICAgKiAgIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisgICAqICAgICAgICAgICAgMyA9PiBhcmd1bWVudCwKKyAgICogICAgICAgICAgfSwKKyAgICogICAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAorICAgKiAgIH0KKyAgICogQHJldHVybiBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4+IC0gYSBtYXAgd2l0aCB0aGUgYWJvdmUgdmFsdWVzCisgICAqKQorCisgIC8vIHZlcmlmeSByZXN1bHQgZGF0YQorICBFeHBlY3QoIHdob2EuQ291bnQgPSAyLCAnd2hvYS5Db3VudCA9ICcrSW50VG9TdHIod2hvYS5Db3VudCkpOworICAvLworICBmaXJzdF9tYXAgIDo9IHdob2FbMV07CisgIHNlY29uZF9tYXAgOj0gd2hvYVsyXTsKKyAgRXhwZWN0KCBmaXJzdF9tYXAuQ291bnQgPSAyLCAnZmlyc3RfbWFwLkNvdW50ID0gJytJbnRUb1N0cihmaXJzdF9tYXAuQ291bnQpKTsKKyAgRXhwZWN0KCBzZWNvbmRfbWFwLkNvdW50ID0gMSwgJ3NlY29uZF9tYXAuQ291bnQgPSAnK0ludFRvU3RyKHNlY29uZF9tYXAuQ291bnQpKTsKKyAgLy8KKyAgbG9vbmV5IDo9IHNlY29uZF9tYXBbVE51bWJlcnouU0lYXTsKKyAgRXhwZWN0KCBBc3NpZ25lZChsb29uZXkpLCAnQXNzaWduZWQobG9vbmV5KSA9ICcrQm9vbFRvU3RyaW5nKEFzc2lnbmVkKGxvb25leSkpKTsKKyAgRXhwZWN0KCBub3QgbG9vbmV5Ll9faXNzZXRfVXNlck1hcCwgJ2xvb25leS5fX2lzc2V0X1VzZXJNYXAgPSAnK0Jvb2xUb1N0cmluZyhsb29uZXkuX19pc3NldF9Vc2VyTWFwKSk7CisgIEV4cGVjdCggbm90IGxvb25leS5fX2lzc2V0X1h0cnVjdHMsICdsb29uZXkuX19pc3NldF9YdHJ1Y3RzID0gJytCb29sVG9TdHJpbmcobG9vbmV5Ll9faXNzZXRfWHRydWN0cykpOworICAvLworICBmb3IgcmV0IGluIFtUTnVtYmVyei5UV08sIFROdW1iZXJ6LlRIUkVFXSBkbyBiZWdpbgorICAgIGNyYXp5IDo9IGZpcnN0X21hcFtyZXRdOworICAgIENvbnNvbGUuV3JpdGVMaW5lKCdmaXJzdF9tYXBbJytpbnRUb1N0cihPcmQocmV0KSkrJ10nKTsKKworICAgIEV4cGVjdCggY3JhenkuX19pc3NldF9Vc2VyTWFwLCAnY3JhenkuX19pc3NldF9Vc2VyTWFwID0gJytCb29sVG9TdHJpbmcoY3JhenkuX19pc3NldF9Vc2VyTWFwKSk7CisgICAgRXhwZWN0KCBjcmF6eS5fX2lzc2V0X1h0cnVjdHMsICdjcmF6eS5fX2lzc2V0X1h0cnVjdHMgPSAnK0Jvb2xUb1N0cmluZyhjcmF6eS5fX2lzc2V0X1h0cnVjdHMpKTsKKworICAgIEV4cGVjdCggY3JhenkuVXNlck1hcC5Db3VudCA9IGluc2FuZS5Vc2VyTWFwLkNvdW50LCAnY3JhenkuVXNlck1hcC5Db3VudCA9ICcrSW50VG9TdHIoY3JhenkuVXNlck1hcC5Db3VudCkpOworICAgIGZvciBwYWlyIGluIGluc2FuZS5Vc2VyTWFwIGRvIGJlZ2luCisgICAgICBFeHBlY3QoIGNyYXp5LlVzZXJNYXBbcGFpci5LZXldID0gcGFpci5WYWx1ZSwgJ2NyYXp5LlVzZXJNYXBbJytJbnRUb1N0cihPcmQocGFpci5rZXkpKSsnXSA9ICcrSW50VG9TdHIoY3JhenkuVXNlck1hcFtwYWlyLktleV0pKTsKKyAgICBlbmQ7CisKKyAgICBFeHBlY3QoIGNyYXp5Llh0cnVjdHMuQ291bnQgPSBpbnNhbmUuWHRydWN0cy5Db3VudCwgJ2NyYXp5Llh0cnVjdHMuQ291bnQgPSAnK0ludFRvU3RyKGNyYXp5Llh0cnVjdHMuQ291bnQpKTsKKyAgICBmb3IgYXJnMCA6PSAwIHRvIGluc2FuZS5YdHJ1Y3RzLkNvdW50LTEgZG8gYmVnaW4KKyAgICAgIGhlbGxvICAgOj0gaW5zYW5lLlh0cnVjdHNbYXJnMF07CisgICAgICBnb29kYnllIDo9IGNyYXp5Llh0cnVjdHNbYXJnMF07CisgICAgICBFeHBlY3QoIGdvb2RieWUuU3RyaW5nX3RoaW5nID0gaGVsbG8uU3RyaW5nX3RoaW5nLCAnZ29vZGJ5ZS5TdHJpbmdfdGhpbmcgPSAnK2dvb2RieWUuU3RyaW5nX3RoaW5nKTsKKyAgICAgIEV4cGVjdCggZ29vZGJ5ZS5CeXRlX3RoaW5nID0gaGVsbG8uQnl0ZV90aGluZywgJ2dvb2RieWUuQnl0ZV90aGluZyA9ICcrSW50VG9TdHIoZ29vZGJ5ZS5CeXRlX3RoaW5nKSk7CisgICAgICBFeHBlY3QoIGdvb2RieWUuSTMyX3RoaW5nID0gaGVsbG8uSTMyX3RoaW5nLCAnZ29vZGJ5ZS5JMzJfdGhpbmcgPSAnK0ludFRvU3RyKGdvb2RieWUuSTMyX3RoaW5nKSk7CisgICAgICBFeHBlY3QoIGdvb2RieWUuSTY0X3RoaW5nID0gaGVsbG8uSTY0X3RoaW5nLCAnZ29vZGJ5ZS5JNjRfdGhpbmcgPSAnK0ludFRvU3RyKGdvb2RieWUuSTY0X3RoaW5nKSk7CisgICAgZW5kOworICBlbmQ7CisKKworICAvLyBtdWx0aSBhcmdzCisgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdE11bHRpJywgdGVzdF9CYXNlVHlwZXMpOworICBhcmcwIDo9IDE7CisgIGFyZzEgOj0gMjsKKyAgYXJnMiA6PSBIaWdoKEludDY0KTsKKyAgYXJnMyA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8U21hbGxJbnQsIHN0cmluZz4uQ3JlYXRlOworICBhcmczLkFkZE9yU2V0VmFsdWUoIDEsICdvbmUnKTsKKyAgYXJnNCA6PSBUTnVtYmVyei5GSVZFOworICBhcmc1IDo9IDUwMDAwMDA7CisgIENvbnNvbGUuV3JpdGVMaW5lKCdUZXN0IE11bHRpKCcgKyBJbnRUb1N0ciggYXJnMCkgKyAnLCcgKworICAgIEludFRvU3RyKCBhcmcxKSArICcsJyArIEludFRvU3RyKCBhcmcyKSArICcsJyArCisgICAgYXJnMy5Ub1N0cmluZyArICcsJyArIEludFRvU3RyKCBJbnRlZ2VyKCBhcmc0KSkgKyAnLCcgKworICAgICAgSW50VG9TdHIoIGFyZzUpICsgJyknKTsKKworICBpIDo9IGNsaWVudC50ZXN0TXVsdGkoIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOworICBFeHBlY3QoIGkuU3RyaW5nX3RoaW5nID0gJ0hlbGxvMicsICd0ZXN0TXVsdGk6IGkuU3RyaW5nX3RoaW5nID0gIicraS5TdHJpbmdfdGhpbmcrJyInKTsKKyAgRXhwZWN0KCBpLkJ5dGVfdGhpbmcgPSBhcmcwLCAndGVzdE11bHRpOiBpLkJ5dGVfdGhpbmcgPSAnK0ludFRvU3RyKGkuQnl0ZV90aGluZykpOworICBFeHBlY3QoIGkuSTMyX3RoaW5nID0gYXJnMSwgJ3Rlc3RNdWx0aTogaS5JMzJfdGhpbmcgPSAnK0ludFRvU3RyKGkuSTMyX3RoaW5nKSk7CisgIEV4cGVjdCggaS5JNjRfdGhpbmcgPSBhcmcyLCAndGVzdE11bHRpOiBpLkk2NF90aGluZyA9ICcrSW50VG9TdHIoaS5JNjRfdGhpbmcpKTsKKyAgRXhwZWN0KCBpLl9faXNzZXRfU3RyaW5nX3RoaW5nLCAndGVzdE11bHRpOiBpLl9faXNzZXRfU3RyaW5nX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X1N0cmluZ190aGluZykpOworICBFeHBlY3QoIGkuX19pc3NldF9CeXRlX3RoaW5nLCAndGVzdE11bHRpOiBpLl9faXNzZXRfQnl0ZV90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9CeXRlX3RoaW5nKSk7CisgIEV4cGVjdCggaS5fX2lzc2V0X0kzMl90aGluZywgJ3Rlc3RNdWx0aTogaS5fX2lzc2V0X0kzMl90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9JMzJfdGhpbmcpKTsKKyAgRXhwZWN0KCBpLl9faXNzZXRfSTY0X3RoaW5nLCAndGVzdE11bHRpOiBpLl9faXNzZXRfSTY0X3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X0k2NF90aGluZykpOworCisgIC8vIG11bHRpIGV4Y2VwdGlvbgorICBTdGFydFRlc3RHcm91cCggJ3Rlc3RNdWx0aUV4Y2VwdGlvbigxKScsIHRlc3RfRXhjZXB0aW9ucyk7CisgIHRyeQorICAgIGkgOj0gY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbiggJ25lZWQgbW9yZSBwaXp6YScsICdydW4gb3V0IG9mIGJlZXInKTsKKyAgICBFeHBlY3QoIGkuU3RyaW5nX3RoaW5nID0gJ3J1biBvdXQgb2YgYmVlcicsICdpLlN0cmluZ190aGluZyA9ICInICtpLlN0cmluZ190aGluZysgJyInKTsKKyAgICBFeHBlY3QoIGkuX19pc3NldF9TdHJpbmdfdGhpbmcsICdpLl9faXNzZXRfU3RyaW5nX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X1N0cmluZ190aGluZykpOworICAgIHsgdGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgdHJ1ZSwgdGhlc2UgZmllbGRzIGFyZSBkZWZhdWx0LXNlcmlhbGl6ZWQKKyAgICBFeHBlY3QoIG5vdCBpLl9faXNzZXRfQnl0ZV90aGluZywgJ2kuX19pc3NldF9CeXRlX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X0J5dGVfdGhpbmcpKTsKKyAgICBFeHBlY3QoIG5vdCBpLl9faXNzZXRfSTMyX3RoaW5nLCAnaS5fX2lzc2V0X0kzMl90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9JMzJfdGhpbmcpKTsKKyAgICBFeHBlY3QoIG5vdCBpLl9faXNzZXRfSTY0X3RoaW5nLCAnaS5fX2lzc2V0X0k2NF90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9JNjRfdGhpbmcpKTsKKyAgICB9CisgIGV4Y2VwdAorICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOworICBlbmQ7CisKKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0TXVsdGlFeGNlcHRpb24oWGNlcHRpb24pJywgdGVzdF9FeGNlcHRpb25zKTsKKyAgdHJ5CisgICAgaSA6PSBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCAnWGNlcHRpb24nLCAnc2Vjb25kIHRlc3QnKTsKKyAgICBFeHBlY3QoIEZBTFNFLCAndGVzdE11bHRpRXhjZXB0aW9uKCcnWGNlcHRpb24nJyk6IG11c3QgdHJvdyBhbiBleGNlcHRpb24nKTsKKyAgZXhjZXB0CisgICAgb24geDpUWGNlcHRpb24gZG8gYmVnaW4KKyAgICAgIEV4cGVjdCggeC5fX2lzc2V0X0Vycm9yQ29kZSwgJ3guX19pc3NldF9FcnJvckNvZGUgPSAnK0Jvb2xUb1N0cmluZyh4Ll9faXNzZXRfRXJyb3JDb2RlKSk7CisgICAgICBFeHBlY3QoIHguX19pc3NldF9NZXNzYWdlXywgICd4Ll9faXNzZXRfTWVzc2FnZV8gPSAnK0Jvb2xUb1N0cmluZyh4Ll9faXNzZXRfTWVzc2FnZV8pKTsKKyAgICAgIEV4cGVjdCggeC5FcnJvckNvZGUgPSAxMDAxLCAneC5FcnJvckNvZGUgPSAnK0ludFRvU3RyKHguRXJyb3JDb2RlKSk7CisgICAgICBFeHBlY3QoIHguTWVzc2FnZV8gPSAnVGhpcyBpcyBhbiBYY2VwdGlvbicsICd4Lk1lc3NhZ2UgPSAiJyt4Lk1lc3NhZ2VfKyciJyk7CisgICAgZW5kOworICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOworICBlbmQ7CisKKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0TXVsdGlFeGNlcHRpb24oWGNlcHRpb24yKScsIHRlc3RfRXhjZXB0aW9ucyk7CisgIHRyeQorICAgIGkgOj0gY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbiggJ1hjZXB0aW9uMicsICd0aGlyZCB0ZXN0Jyk7CisgICAgRXhwZWN0KCBGQUxTRSwgJ3Rlc3RNdWx0aUV4Y2VwdGlvbignJ1hjZXB0aW9uMicnKTogbXVzdCB0cm93IGFuIGV4Y2VwdGlvbicpOworICBleGNlcHQKKyAgICBvbiB4OlRYY2VwdGlvbjIgZG8gYmVnaW4KKyAgICAgIEV4cGVjdCggeC5fX2lzc2V0X0Vycm9yQ29kZSwgJ3guX19pc3NldF9FcnJvckNvZGUgPSAnK0Jvb2xUb1N0cmluZyh4Ll9faXNzZXRfRXJyb3JDb2RlKSk7CisgICAgICBFeHBlY3QoIHguX19pc3NldF9TdHJ1Y3RfdGhpbmcsICAneC5fX2lzc2V0X1N0cnVjdF90aGluZyA9ICcrQm9vbFRvU3RyaW5nKHguX19pc3NldF9TdHJ1Y3RfdGhpbmcpKTsKKyAgICAgIEV4cGVjdCggeC5FcnJvckNvZGUgPSAyMDAyLCAneC5FcnJvckNvZGUgPSAnK0ludFRvU3RyKHguRXJyb3JDb2RlKSk7CisgICAgICBFeHBlY3QoIHguU3RydWN0X3RoaW5nLlN0cmluZ190aGluZyA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uMicsICd4LlN0cnVjdF90aGluZy5TdHJpbmdfdGhpbmcgPSAiJyt4LlN0cnVjdF90aGluZy5TdHJpbmdfdGhpbmcrJyInKTsKKyAgICAgIEV4cGVjdCggeC5TdHJ1Y3RfdGhpbmcuX19pc3NldF9TdHJpbmdfdGhpbmcsICd4LlN0cnVjdF90aGluZy5fX2lzc2V0X1N0cmluZ190aGluZyA9ICcrQm9vbFRvU3RyaW5nKHguU3RydWN0X3RoaW5nLl9faXNzZXRfU3RyaW5nX3RoaW5nKSk7CisgICAgICB7IHRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IHRydWUsIHRoZXNlIGZpZWxkcyBhcmUgZGVmYXVsdC1zZXJpYWxpemVkCisgICAgICBFeHBlY3QoIG5vdCB4LlN0cnVjdF90aGluZy5fX2lzc2V0X0J5dGVfdGhpbmcsICd4LlN0cnVjdF90aGluZy5fX2lzc2V0X0J5dGVfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyh4LlN0cnVjdF90aGluZy5fX2lzc2V0X0J5dGVfdGhpbmcpKTsKKyAgICAgIEV4cGVjdCggbm90IHguU3RydWN0X3RoaW5nLl9faXNzZXRfSTMyX3RoaW5nLCAneC5TdHJ1Y3RfdGhpbmcuX19pc3NldF9JMzJfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyh4LlN0cnVjdF90aGluZy5fX2lzc2V0X0kzMl90aGluZykpOworICAgICAgRXhwZWN0KCBub3QgeC5TdHJ1Y3RfdGhpbmcuX19pc3NldF9JNjRfdGhpbmcsICd4LlN0cnVjdF90aGluZy5fX2lzc2V0X0k2NF90aGluZyA9ICcrQm9vbFRvU3RyaW5nKHguU3RydWN0X3RoaW5nLl9faXNzZXRfSTY0X3RoaW5nKSk7CisgICAgICB9CisgICAgZW5kOworICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOworICBlbmQ7CisKKworICAvLyBvbmV3YXkgZnVuY3Rpb25zCisgIFN0YXJ0VGVzdEdyb3VwKCAnVGVzdCBPbmV3YXkoMSknLCB0ZXN0X1Vua25vd24pOworICBjbGllbnQudGVzdE9uZXdheSgxKTsKKyAgRXhwZWN0KCBUUlVFLCAnVGVzdCBPbmV3YXkoMSknKTsgIC8vIHN1Y2Nlc3MgOj0gbm8gZXhjZXB0aW9uCisKKyAgLy8gY2FsbCB0aW1lCisgIHskSUZERUYgUGVyZlRlc3R9CisgIFN0YXJ0VGVzdEdyb3VwKCAnVGVzdCBDYWxsdGltZSgpJyk7CisgIFN0YXJ0VGljayA6PSBHZXRUaWNrQ291bnQ7CisgIGZvciBrIDo9IDAgdG8gMTAwMCAtIDEgZG8KKyAgYmVnaW4KKyAgICBjbGllbnQudGVzdFZvaWQoKTsKKyAgZW5kOworICBDb25zb2xlLldyaXRlTGluZSgnID0gJyArIEZsb2F0VG9TdHIoIChHZXRUaWNrQ291bnQgLSBTdGFydFRpY2spIC8gMTAwMCApICsgJyBtcyBhIHRlc3RWb2lkKCkgY2FsbCcgKTsKKyAgeyRFTkRJRiBQZXJmVGVzdH0KKworICAvLyBubyBtb3JlIHRlc3RzIGhlcmUKKyAgU3RhcnRUZXN0R3JvdXAoICcnLCB0ZXN0X1Vua25vd24pOworZW5kOworCisKK3skSUZERUYgU3VwcG9ydHNBc3luY30KK3Byb2NlZHVyZSBUQ2xpZW50VGhyZWFkLkNsaWVudEFzeW5jVGVzdDsKK3ZhcgorICBjbGllbnQgOiBUVGhyaWZ0VGVzdC5JQXN5bmM7CisgIHMgOiBzdHJpbmc7CisgIGk4IDogU2hvcnRJbnQ7CitiZWdpbgorICBTdGFydFRlc3RHcm91cCggJ0FzeW5jIFRlc3RzJywgdGVzdF9Vbmtub3duKTsKKyAgY2xpZW50IDo9IFRUaHJpZnRUZXN0LlRDbGllbnQuQ3JlYXRlKCBGUHJvdG9jb2wpOworICBGVHJhbnNwb3J0Lk9wZW47CisKKyAgLy8gb25ld2F5IHZvaWQgZnVuY3Rpb25zCisgIGNsaWVudC50ZXN0T25ld2F5QXN5bmMoMSkuV2FpdDsKKyAgRXhwZWN0KCBUUlVFLCAnVGVzdCBPbmV3YXkoMSknKTsgIC8vIHN1Y2Nlc3MgOj0gbm8gZXhjZXB0aW9uCisKKyAgLy8gbm9ybWFsIGZ1bmN0aW9ucworICBzIDo9IGNsaWVudC50ZXN0U3RyaW5nQXN5bmMoSFVHRV9URVNUX1NUUklORykuVmFsdWU7CisgIEV4cGVjdCggbGVuZ3RoKHMpID0gbGVuZ3RoKEhVR0VfVEVTVF9TVFJJTkcpLAorICAgICAgICAgICd0ZXN0U3RyaW5nKCBsZW5ndGgoSFVHRV9URVNUX1NUUklORykgPSAnK0ludFRvU3RyKExlbmd0aChIVUdFX1RFU1RfU1RSSU5HKSkrJykgJworICAgICAgICAgKyc9PiBsZW5ndGgocmVzdWx0KSA9ICcrSW50VG9TdHIoTGVuZ3RoKHMpKSk7CisKKyAgaTggOj0gY2xpZW50LnRlc3RCeXRlKDEpLlZhbHVlOworICBFeHBlY3QoIGk4ID0gMSwgJ3Rlc3RCeXRlKDEpID0gJyArIEludFRvU3RyKCBpOCApKTsKK2VuZDsKK3skRU5ESUZ9CisKKworeyRJRkRFRiBTdHJlc3NUZXN0fQorcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuU3RyZXNzVGVzdChjb25zdCBjbGllbnQgOiBUVGhyaWZ0VGVzdC5JZmFjZSk7CitiZWdpbgorICB3aGlsZSBUUlVFIGRvIGJlZ2luCisgICAgdHJ5CisgICAgICBpZiBub3QgRlRyYW5zcG9ydC5Jc09wZW4gdGhlbiBGVHJhbnNwb3J0Lk9wZW47ICAgLy8gcmUtb3BlbiBjb25uZWN0aW9uLCBzZXJ2ZXIgaGFzIGFscmVhZHkgY2xvc2VkCisgICAgICB0cnkKKyAgICAgICAgY2xpZW50LnRlc3RTdHJpbmcoJ1Rlc3QnKTsKKyAgICAgICAgV3JpdGUoJy4nKTsKKyAgICAgIGZpbmFsbHkKKyAgICAgICAgaWYgRlRyYW5zcG9ydC5Jc09wZW4gdGhlbiBGVHJhbnNwb3J0LkNsb3NlOworICAgICAgZW5kOworICAgIGV4Y2VwdAorICAgICAgb24gZTpFeGNlcHRpb24gZG8gV3JpdGVsbigjMTArZS5tZXNzYWdlKTsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZDsKK3skRU5ESUZ9CisKKworZnVuY3Rpb24gVENsaWVudFRocmVhZC5QcmVwYXJlQmluYXJ5RGF0YSggYVJhbmRvbURpc3QgOiBCb29sZWFuOyBhU2l6ZSA6IFRUZXN0U2l6ZSkgOiBUQnl0ZXM7Cit2YXIgaSA6IEludGVnZXI7CitiZWdpbgorICBjYXNlIGFTaXplIG9mCisgICAgRW1wdHkgICAgICAgICAgOiBTZXRMZW5ndGgoIHJlc3VsdCwgMCk7CisgICAgTm9ybWFsICAgICAgICAgOiBTZXRMZW5ndGgoIHJlc3VsdCwgJDEwMCk7CisgICAgQnl0ZUFycmF5VGVzdCAgOiBTZXRMZW5ndGgoIHJlc3VsdCwgU2l6ZU9mKFRCeXRlQXJyYXkpICsgMTI4KTsKKyAgICBQaXBlV3JpdGVMaW1pdCA6IFNldExlbmd0aCggcmVzdWx0LCA2NTUzNSArIDEyOCk7CisgIGVsc2UKKyAgICByYWlzZSBFQXJndW1lbnRFeGNlcHRpb24uQ3JlYXRlKCdhU2l6ZScpOworICBlbmQ7CisKKyAgQVNTRVJUKCBMb3cocmVzdWx0KSA9IDApOworICBpZiBMZW5ndGgocmVzdWx0KSA9IDAgdGhlbiBFeGl0OworCisgIC8vIGxpbmVhciBkaXN0cmlidXRpb24sIHVubGVzcyByYW5kb20gaXMgcmVxdWVzdGVkCisgIGlmIG5vdCBhUmFuZG9tRGlzdCB0aGVuIGJlZ2luCisgICAgZm9yIGkgOj0gTG93KHJlc3VsdCkgdG8gSGlnaChyZXN1bHQpIGRvIGJlZ2luCisgICAgICByZXN1bHRbaV0gOj0gaSBtb2QgJDEwMDsKKyAgICBlbmQ7CisgICAgRXhpdDsKKyAgZW5kOworCisgIC8vIHJhbmRvbSBkaXN0cmlidXRpb24gb2YgYWxsIDI1NiB2YWx1ZXMKKyAgRmlsbENoYXIoIHJlc3VsdFswXSwgTGVuZ3RoKHJlc3VsdCkgKiBTaXplT2YocmVzdWx0WzBdKSwgJDApOworICBmb3IgaSA6PSBMb3cocmVzdWx0KSB0byBIaWdoKHJlc3VsdCkgZG8gYmVnaW4KKyAgICByZXN1bHRbaV0gOj0gQnl0ZSggUmFuZG9tKCQxMDApKTsKKyAgZW5kOworZW5kOworCisKK3skSUZERUYgV2luNjR9Citwcm9jZWR1cmUgVENsaWVudFRocmVhZC5Vc2VJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQ7Cit2YXIgYSxiIDogSW50NjQ7CitiZWdpbgorICBhIDo9IDE7CisgIGIgOj0gMjsKKyAgVGhyaWZ0LlV0aWxzLkludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NCggYSxiKTsKKyAgRXhwZWN0KCBhID0gMywgJ0ludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NCcpOworZW5kOworeyRFTkRJRn0KKworCitwcm9jZWR1cmUgVENsaWVudFRocmVhZC5KU09OUHJvdG9jb2xSZWFkV3JpdGVUZXN0OworLy8gVGVzdHMgb25seSB0aGVuIHJlYWQvd3JpdGUgcHJvY2VkdXJlcyBvZiB0aGUgSlNPTiBwcm90b2NvbAorLy8gQWxsIHRlc3RzIHN1Y2NlZWQsIGlmIHdlIGNhbiByZWFkIHdoYXQgd2Ugd3JvdGUgYmVmb3JlCisvLyBOb3RlIHRoYXQgcGFzc2luZyB0aGlzIHRlc3QgZG9lcyBub3QgaW1wbHksIHRoYXQgb3VyIEpTT04gaXMgcmVhbGx5IGNvbXBhdGlibGUgdG8gd2hhdAorLy8gb3RoZXIgY2xpZW50cyBvciBzZXJ2ZXJzIGV4cGVjdCBhcyB0aGUgcmVhbCBKU09OLiBUaGlzIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyB0ZXN0LgordmFyIHByb3QgICA6IElQcm90b2NvbDsKKyAgICBzdG0gICAgOiBUU3RyaW5nU3RyZWFtOworICAgIGxpc3QgICA6IFRUaHJpZnRMaXN0OworICAgIGJpbmFyeSwgYmluUmVhZCwgZW1wdHlCaW5hcnkgOiBUQnl0ZXM7CisgICAgaSxpRXJyIDogSW50ZWdlcjsKK2NvbnN0CisgIFRFU1RfU0hPUlQgICA9IFNob3J0SW50KCAkRkUpOworICBURVNUX1NNQUxMICAgPSBTbWFsbEludCggJEZFREMpOworICBURVNUX0xPTkcgICAgPSBMb25nSW50KCAkRkVEQ0JBOTgpOworICBURVNUX0k2NCAgICAgPSBJbnQ2NCggJEZFRENCQTk4NzY1NDMyMTApOworICBURVNUX0RPVUJMRSAgPSAtMS4yMzRlLTU2OworICBERUxUQV9ET1VCTEUgPSBURVNUX0RPVUJMRSAqIDFlLTE0OworICBURVNUX1NUUklORyAgPSAnYWJjLScjJDAwRTQjJDAwZjYjJDAwZmM7IC8vIGdlcm1hbiB1bWxhdXRzIChlbi11czogImZ1bm55IGNoYXJzIikKKyAgLy8gVGVzdCBUSFJJRlQtMjMzNiBhbmQgVEhSSUZULTM0MDQgd2l0aCBVKzFEMTFFIChHIENsZWYgc3ltYm9sKSBhbmQgJ9Cg0YPRgdGB0LrQvtC1INCd0LDQt9Cy0LDQvdC40LUnOworICBHX0NMRUZfQU5EX0NZUklMTElDX1RFWFQgPSAjJDFkMTFlJyAnIyQwNDIwIyQwNDQzIyQwNDQxIyQwNDQxIyQwNDNhIyQwNDNlIyQwNDM1JyAnIyQwNDFkIyQwNDMwIyQwNDM3IyQwNDMyIyQwNDMwIyQwNDNkIyQwNDM4IyQwNDM1OworICBHX0NMRUZfQU5EX0NZUklMTElDX0pTT04gPSAnIlx1ZDgzNFx1ZGQxZSBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0M2VcdTA0MzUgXHUwNDFkXHUwNDMwXHUwNDM3XHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1Iic7CisgIC8vIHRlc3QgYm90aCBwb3NzaWJsZSBzb2xpZHVzIGVuY29kaW5ncworICBTT0xJRFVTX0pTT05fREFUQSA9ICcib25lL3R3b1wvdGhyZWUiJzsKKyAgU09MSURVU19FWENQRUNURUQgPSAnb25lL3R3by90aHJlZSc7CitiZWdpbgorICBzdG0gIDo9IFRTdHJpbmdTdHJlYW0uQ3JlYXRlOworICB0cnkKKyAgICBTdGFydFRlc3RHcm91cCggJ0pzb25Qcm90b2NvbFRlc3QnLCB0ZXN0X1Vua25vd24pOworCisgICAgLy8gcHJlcGFyZSBiaW5hcnkgZGF0YQorICAgIGJpbmFyeSA6PSBQcmVwYXJlQmluYXJ5RGF0YSggRkFMU0UsIE5vcm1hbCk7CisgICAgU2V0TGVuZ3RoKCBlbXB0eUJpbmFyeSwgMCk7IC8vIGVtcHR5IGJpbmFyeSBkYXRhIGJsb2NrCisKKyAgICAvLyBvdXRwdXQgc2V0dXAKKyAgICBwcm90IDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSgKKyAgICAgICAgICAgICAgVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKAorICAgICAgICAgICAgICAgIG5pbCwgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBzdG0sIEZBTFNFKSkpOworCisgICAgLy8gd3JpdGUKKyAgICBJbml0KCBsaXN0LCBUVHlwZS5TdHJpbmdfLCA5KTsKKyAgICBwcm90LldyaXRlTGlzdEJlZ2luKCBsaXN0KTsKKyAgICBwcm90LldyaXRlQm9vbCggVFJVRSk7CisgICAgcHJvdC5Xcml0ZUJvb2woIEZBTFNFKTsKKyAgICBwcm90LldyaXRlQnl0ZSggVEVTVF9TSE9SVCk7CisgICAgcHJvdC5Xcml0ZUkxNiggVEVTVF9TTUFMTCk7CisgICAgcHJvdC5Xcml0ZUkzMiggVEVTVF9MT05HKTsKKyAgICBwcm90LldyaXRlSTY0KCBURVNUX0k2NCk7CisgICAgcHJvdC5Xcml0ZURvdWJsZSggVEVTVF9ET1VCTEUpOworICAgIHByb3QuV3JpdGVTdHJpbmcoIFRFU1RfU1RSSU5HKTsKKyAgICBwcm90LldyaXRlQmluYXJ5KCBiaW5hcnkpOworICAgIHByb3QuV3JpdGVTdHJpbmcoICcnKTsgIC8vIGVtcHR5IHN0cmluZworICAgIHByb3QuV3JpdGVCaW5hcnkoIGVtcHR5QmluYXJ5KTsgLy8gZW1wdHkgYmluYXJ5IGRhdGEgYmxvY2sKKyAgICBwcm90LldyaXRlTGlzdEVuZDsKKworICAgIC8vIGlucHV0IHNldHVwCisgICAgRXhwZWN0KCBzdG0uUG9zaXRpb24gPSBzdG0uU2l6ZSwgJ1N0cmVhbSBwb3NpdGlvbi9sZW5ndGggYWZ0ZXIgd3JpdGUnKTsKKyAgICBzdG0uUG9zaXRpb24gOj0gMDsKKyAgICBwcm90IDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSgKKyAgICAgICAgICAgICAgVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKAorICAgICAgICAgICAgICAgIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggc3RtLCBGQUxTRSksIG5pbCkpOworCisgICAgLy8gcmVhZCBhbmQgY29tcGFyZQorICAgIGxpc3QgOj0gcHJvdC5SZWFkTGlzdEJlZ2luOworICAgIEV4cGVjdCggbGlzdC5FbGVtZW50VHlwZSA9IFRUeXBlLlN0cmluZ18sICdsaXN0IGVsZW1lbnQgdHlwZScpOworICAgIEV4cGVjdCggbGlzdC5Db3VudCA9IDksICdsaXN0IGVsZW1lbnQgY291bnQnKTsKKyAgICBFeHBlY3QoIHByb3QuUmVhZEJvb2wsICdXcml0ZUJvb2wvUmVhZEJvb2w6IFRSVUUnKTsKKyAgICBFeHBlY3QoIG5vdCBwcm90LlJlYWRCb29sLCAnV3JpdGVCb29sL1JlYWRCb29sOiBGQUxTRScpOworICAgIEV4cGVjdCggcHJvdC5SZWFkQnl0ZSAgID0gVEVTVF9TSE9SVCwgICdXcml0ZUJ5dGUvUmVhZEJ5dGUnKTsKKyAgICBFeHBlY3QoIHByb3QuUmVhZEkxNiAgICA9IFRFU1RfU01BTEwsICAnV3JpdGVJMTYvUmVhZEkxNicpOworICAgIEV4cGVjdCggcHJvdC5SZWFkSTMyICAgID0gVEVTVF9MT05HLCAgICdXcml0ZUkzMi9SZWFkSTMyJyk7CisgICAgRXhwZWN0KCBwcm90LlJlYWRJNjQgICAgPSBURVNUX0k2NCwgICAgJ1dyaXRlSTY0L1JlYWRJNjQnKTsKKyAgICBFeHBlY3QoIGFicyhwcm90LlJlYWREb3VibGUtVEVTVF9ET1VCTEUpIDwgYWJzKERFTFRBX0RPVUJMRSksICdXcml0ZURvdWJsZS9SZWFkRG91YmxlJyk7CisgICAgRXhwZWN0KCBwcm90LlJlYWRTdHJpbmcgPSBURVNUX1NUUklORywgJ1dyaXRlU3RyaW5nL1JlYWRTdHJpbmcnKTsKKyAgICBiaW5SZWFkIDo9IHByb3QuUmVhZEJpbmFyeTsKKyAgICBFeHBlY3QoIExlbmd0aChwcm90LlJlYWRTdHJpbmcpID0gMCwgJ1dyaXRlU3RyaW5nL1JlYWRTdHJpbmcgKGVtcHR5IHN0cmluZyknKTsKKyAgICBFeHBlY3QoIExlbmd0aChwcm90LlJlYWRCaW5hcnkpID0gMCwgJ2VtcHR5IFdyaXRlQmluYXJ5L1JlYWRCaW5hcnkgKGVtcHR5IGRhdGEgYmxvY2spJyk7CisgICAgcHJvdC5SZWFkTGlzdEVuZDsKKworICAgIC8vIHRlc3QgYmluYXJ5IGRhdGEKKyAgICBFeHBlY3QoIExlbmd0aChiaW5hcnkpID0gTGVuZ3RoKGJpblJlYWQpLCAnQmluYXJ5IGRhdGEgbGVuZ3RoIGNoZWNrJyk7CisgICAgaUVyciA6PSAtMTsKKyAgICBmb3IgaSA6PSBMb3coYmluYXJ5KSB0byBIaWdoKGJpbmFyeSkgZG8gYmVnaW4KKyAgICAgIGlmIGJpbmFyeVtpXSA8PiBiaW5SZWFkW2ldIHRoZW4gYmVnaW4KKyAgICAgICAgaUVyciA6PSBpOworICAgICAgICBCcmVhazsKKyAgICAgIGVuZDsKKyAgICBlbmQ7CisgICAgaWYgaUVyciA8IDAKKyAgICB0aGVuIEV4cGVjdCggVFJVRSwgICdCaW5hcnkgZGF0YSBjaGVjayAoJytJbnRUb1N0cihMZW5ndGgoYmluYXJ5KSkrJyBCeXRlcyknKQorICAgIGVsc2UgRXhwZWN0KCBGQUxTRSwgJ0JpbmFyeSBkYXRhIGNoZWNrIGF0IG9mZnNldCAnK0ludFRvU3RyKGlFcnIpKTsKKworICAgIEV4cGVjdCggc3RtLlBvc2l0aW9uID0gc3RtLlNpemUsICdTdHJlYW0gcG9zaXRpb24gYWZ0ZXIgcmVhZCcpOworCisKKyAgICAvLyBTb2xpZHVzIGNhbiBiZSBlbmNvZGVkIGluIHR3byB3YXlzLiBNYWtlIHN1cmUgd2UgY2FuIHJlYWQgYm90aAorICAgIHN0bS5Qb3NpdGlvbiA6PSAwOworICAgIHN0bS5TaXplICAgICA6PSAwOworICAgIHN0bS5Xcml0ZVN0cmluZyhTT0xJRFVTX0pTT05fREFUQSk7CisgICAgc3RtLlBvc2l0aW9uIDo9IDA7CisgICAgcHJvdCA6PSBUSlNPTlByb3RvY29sSW1wbC5DcmVhdGUoCisgICAgICAgICAgICAgIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNyZWF0ZSgKKyAgICAgICAgICAgICAgICBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIHN0bSwgRkFMU0UpLCBuaWwpKTsKKyAgICBFeHBlY3QoIHByb3QuUmVhZFN0cmluZyA9IFNPTElEVVNfRVhDUEVDVEVELCAnU29saWR1cyBlbmNvZGluZycpOworCisKKyAgICAvLyBXaWRlY2hhcnMgc2hvdWxkIHdvcmsgdG9vLiBEbyB0aGV5PworICAgIC8vIEFmdGVyIHdyaXRpbmcsIHdlIGVuc3VyZSB0aGF0IHdlIGFyZSBhYmxlIHRvIHJlYWQgaXQgYmFjaworICAgIC8vIFdlIGNhbid0IGFzc3VtZSBoZXgtZW5jb2RpbmcsIHNpbmNlIChuZWFybHkpIGFueSBVbmljb2RlIGNoYXIgaXMgdmFsaWQgSlNPTgorICAgIHN0bS5Qb3NpdGlvbiA6PSAwOworICAgIHN0bS5TaXplICAgICA6PSAwOworICAgIHByb3QgOj0gVEpTT05Qcm90b2NvbEltcGwuQ3JlYXRlKAorICAgICAgICAgICAgICBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DcmVhdGUoCisgICAgICAgICAgICAgICAgbmlsLCBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIHN0bSwgRkFMU0UpKSk7CisgICAgcHJvdC5Xcml0ZVN0cmluZyggR19DTEVGX0FORF9DWVJJTExJQ19URVhUKTsKKyAgICBzdG0uUG9zaXRpb24gOj0gMDsKKyAgICBwcm90IDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSgKKyAgICAgICAgICAgICAgVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKAorICAgICAgICAgICAgICAgIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggc3RtLCBGQUxTRSksIG5pbCkpOworICAgIEV4cGVjdCggcHJvdC5SZWFkU3RyaW5nID0gR19DTEVGX0FORF9DWVJJTExJQ19URVhULCAnV3JpdGluZyBKU09OIHdpdGggY2hhcnMgPiA4IGJpdCcpOworCisgICAgLy8gV2lkZWNoYXJzIHNob3VsZCB3b3JrIHdpdGggaGV4LWVuY29kaW5nIHRvby4gRG8gdGhleT8KKyAgICBzdG0uUG9zaXRpb24gOj0gMDsKKyAgICBzdG0uU2l6ZSAgICAgOj0gMDsKKyAgICBzdG0uV3JpdGVTdHJpbmcoIEdfQ0xFRl9BTkRfQ1lSSUxMSUNfSlNPTik7CisgICAgc3RtLlBvc2l0aW9uIDo9IDA7CisgICAgcHJvdCA6PSBUSlNPTlByb3RvY29sSW1wbC5DcmVhdGUoCisgICAgICAgICAgICAgIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNyZWF0ZSgKKyAgICAgICAgICAgICAgICBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIHN0bSwgRkFMU0UpLCBuaWwpKTsKKyAgICBFeHBlY3QoIHByb3QuUmVhZFN0cmluZyA9IEdfQ0xFRl9BTkRfQ1lSSUxMSUNfVEVYVCwgJ1JlYWRpbmcgSlNPTiB3aXRoIGNoYXJzID4gOCBiaXQnKTsKKworCisgIGZpbmFsbHkKKyAgICBzdG0uRnJlZTsKKyAgICBwcm90IDo9IG5pbDsgIC8vLT4gUmVsZWFzZQorICAgIFN0YXJ0VGVzdEdyb3VwKCAnJywgdGVzdF9Vbmtub3duKTsgIC8vIG5vIG1vcmUgdGVzdHMgaGVyZQorICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuU3RhcnRUZXN0R3JvdXAoIGNvbnN0IGFHcm91cCA6IHN0cmluZzsgY29uc3QgYVRlc3QgOiBUVGVzdEdyb3VwKTsKK2JlZ2luCisgIEZUZXN0R3JvdXAgOj0gYUdyb3VwOworICBGQ3VycmVudFRlc3QgOj0gYVRlc3Q7CisKKyAgSW5jbHVkZSggRkV4ZWN1dGVkLCBhVGVzdCk7CisKKyAgaWYgRlRlc3RHcm91cCA8PiAnJyB0aGVuIGJlZ2luCisgICAgQ29uc29sZS5Xcml0ZUxpbmUoJycpOworICAgIENvbnNvbGUuV3JpdGVMaW5lKCBhR3JvdXArJyB0ZXN0cycpOworICAgIENvbnNvbGUuV3JpdGVMaW5lKCBTdHJpbmdPZkNoYXIoJy0nLDYwKSk7CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVENsaWVudFRocmVhZC5FeHBlY3QoIGFUZXN0UmVzdWx0IDogQm9vbGVhbjsgY29uc3QgYVRlc3RJbmZvIDogc3RyaW5nKTsKK2JlZ2luCisgIGlmIGFUZXN0UmVzdWx0ICB0aGVuIGJlZ2luCisgICAgSW5jKEZTdWNjZXNzZXMpOworICAgIENvbnNvbGUuV3JpdGVMaW5lKCBhVGVzdEluZm8rJzogcGFzc2VkJyk7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgRkVycm9ycy5BZGQoIEZUZXN0R3JvdXArJzogJythVGVzdEluZm8pOworICAgIEluY2x1ZGUoIEZGYWlsZWQsIEZDdXJyZW50VGVzdCk7CisgICAgQ29uc29sZS5Xcml0ZUxpbmUoIGFUZXN0SW5mbysnOiAqKiogRkFJTEVEICoqKicpOworCisgICAgLy8gV2UgaGF2ZSBhIGZhaWxlZCB0ZXN0IQorICAgIC8vIC0+IGlzc3VlIERlYnVnQnJlYWsgT05MWSBpZiBhIGRlYnVnZ2VyIGlzIGF0dGFjaGVkLAorICAgIC8vIC0+IHVuaGFuZGxlZCBEZWJ1Z0JyZWFrcyB3b3VsZCBjYXVzZSBXaW5kb3dzIHRvIHRlcm1pbmF0ZSB0aGUgYXBwIG90aGVyd2lzZQorICAgIGlmIElzRGVidWdnZXJQcmVzZW50CisgICAgdGhlbiB7JElGREVGIENQVVg2NH0gRGVidWdCcmVhayB7JEVMU0V9IGFzbSBpbnQgMyBlbmQgeyRFTkRJRn07CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVENsaWVudFRocmVhZC5SZXBvcnRSZXN1bHRzOwordmFyIG5Ub3RhbCA6IEludGVnZXI7CisgICAgc0xpbmUgOiBzdHJpbmc7CitiZWdpbgorICAvLyBwcmV2ZW50IHVzIGZyb20gc3R1cGlkIERJVi8wIGVycm9ycworICBuVG90YWwgOj0gRlN1Y2Nlc3NlcyArIEZFcnJvcnMuQ291bnQ7CisgIGlmIG5Ub3RhbCA9IDAgdGhlbiBiZWdpbgorICAgIENvbnNvbGUuV3JpdGVMaW5lKCdObyByZXN1bHRzIGxvZ2dlZCcpOworICAgIEV4aXQ7CisgIGVuZDsKKworICBDb25zb2xlLldyaXRlTGluZSgnJyk7CisgIENvbnNvbGUuV3JpdGVMaW5lKCBTdHJpbmdPZkNoYXIoJz0nLDYwKSk7CisgIENvbnNvbGUuV3JpdGVMaW5lKCBJbnRUb1N0cihuVG90YWwpKycgdGVzdHMgcGVyZm9ybWVkJyk7CisgIENvbnNvbGUuV3JpdGVMaW5lKCBJbnRUb1N0cihGU3VjY2Vzc2VzKSsnIHRlc3RzIHN1Y2NlZWRlZCAoJytJbnRUb1N0cihyb3VuZCgxMDAqRlN1Y2Nlc3Nlcy9uVG90YWwpKSsnJSknKTsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoIEludFRvU3RyKEZFcnJvcnMuQ291bnQpKycgdGVzdHMgZmFpbGVkICgnK0ludFRvU3RyKHJvdW5kKDEwMCpGRXJyb3JzLkNvdW50L25Ub3RhbCkpKyclKScpOworICBDb25zb2xlLldyaXRlTGluZSggU3RyaW5nT2ZDaGFyKCc9Jyw2MCkpOworICBpZiBGRXJyb3JzLkNvdW50ID4gMCB0aGVuIGJlZ2luCisgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ0ZBSUxFRCBURVNUUzonKTsKKyAgICBmb3Igc0xpbmUgaW4gRkVycm9ycyBkbyBDb25zb2xlLldyaXRlTGluZSgnLSAnK3NMaW5lKTsKKyAgICBDb25zb2xlLldyaXRlTGluZSggU3RyaW5nT2ZDaGFyKCc9Jyw2MCkpOworICAgIEludGVybG9ja2VkSW5jcmVtZW50KCBFeGl0Q29kZSk7ICAvLyByZXR1cm4gPD4gMCBvbiBlcnJvcnMKKyAgZW5kOworICBDb25zb2xlLldyaXRlTGluZSgnJyk7CitlbmQ7CisKKworZnVuY3Rpb24gVENsaWVudFRocmVhZC5DYWxjdWxhdGVFeGl0Q29kZSA6IEJ5dGU7Cit2YXIgdGVzdCA6IFRUZXN0R3JvdXA7CitiZWdpbgorICByZXN1bHQgOj0gRVhJVENPREVfU1VDQ0VTUzsKKyAgZm9yIHRlc3QgOj0gTG93KFRUZXN0R3JvdXApIHRvIEhpZ2goVFRlc3RHcm91cCkgZG8gYmVnaW4KKyAgICBpZiAodGVzdCBpbiBGRmFpbGVkKSBvciBub3QgKHRlc3QgaW4gRkV4ZWN1dGVkKQorICAgIHRoZW4gcmVzdWx0IDo9IHJlc3VsdCBvciBNQVBfRkFJTFVSRVNfVE9fRVhJVENPREVfQklUU1t0ZXN0XTsKKyAgZW5kOworZW5kOworCisKK2NvbnN0cnVjdG9yIFRDbGllbnRUaHJlYWQuQ3JlYXRlKCBjb25zdCBhU2V0dXAgOiBUVGVzdFNldHVwOyBjb25zdCBhTnVtSXRlcmF0aW9uOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZTZXR1cCA6PSBhU2V0dXA7CisgIEZOdW1JdGVyYXRpb24gOj0gQU51bUl0ZXJhdGlvbjsKKworICBGQ29uc29sZSA6PSBUVGhyZWFkQ29uc29sZS5DcmVhdGUoIFNlbGYgKTsKKyAgRkN1cnJlbnRUZXN0IDo9IHRlc3RfVW5rbm93bjsKKworICAvLyBlcnJvciBsaXN0OiBrZWVwIGNvcnJlY3Qgb3JkZXIsIGFsbG93IGZvciBkdXBsaWNhdGVzCisgIEZFcnJvcnMgOj0gVFN0cmluZ0xpc3QuQ3JlYXRlOworICBGRXJyb3JzLlNvcnRlZCA6PSBGQUxTRTsKKyAgRkVycm9ycy5EdXBsaWNhdGVzIDo9IGR1cEFjY2VwdDsKKworICBpbmhlcml0ZWQgQ3JlYXRlKCBUUlVFKTsKK2VuZDsKKworZGVzdHJ1Y3RvciBUQ2xpZW50VGhyZWFkLkRlc3Ryb3k7CitiZWdpbgorICBGcmVlQW5kTmlsKCBGQ29uc29sZSk7CisgIEZyZWVBbmROaWwoIEZFcnJvcnMpOworICBpbmhlcml0ZWQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQ2xpZW50VGhyZWFkLkV4ZWN1dGU7Cit2YXIKKyAgaSA6IEludGVnZXI7CitiZWdpbgorICAvLyBwZXJmb3JtIGFsbCB0ZXN0cworICB0cnkKKyAgICB7JElGREVGIFdpbjY0fQorICAgIFVzZUludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NDsKKyAgICB7JEVORElGfQorICAgIEpTT05Qcm90b2NvbFJlYWRXcml0ZVRlc3Q7CisKKyAgICAvLyBtdXN0IGJlIHJ1biBpbiB0aGUgY29udGV4dCBvZiB0aGUgdGhyZWFkCisgICAgSW5pdGlhbGl6ZVByb3RvY29sVHJhbnNwb3J0U3RhY2s7CisgICAgdHJ5CisgICAgICBmb3IgaSA6PSAwIHRvIEZOdW1JdGVyYXRpb24gLSAxIGRvIGJlZ2luCisgICAgICAgIENsaWVudFRlc3Q7CisgICAgICAgIHskSUZERUYgU3VwcG9ydHNBc3luY30KKyAgICAgICAgQ2xpZW50QXN5bmNUZXN0OworICAgICAgICB7JEVORElGfQorICAgICAgZW5kOworCisgICAgICAvLyByZXBvcnQgdGhlIG91dGNvbWUKKyAgICAgIFJlcG9ydFJlc3VsdHM7CisgICAgICBTZXRSZXR1cm5WYWx1ZSggQ2FsY3VsYXRlRXhpdENvZGUpOworCisgICAgZmluYWxseQorICAgICAgU2h1dGRvd25Qcm90b2NvbFRyYW5zcG9ydFN0YWNrOworICAgIGVuZDsKKworICBleGNlcHQKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAndW5leHBlY3RlZCBleGNlcHRpb246ICInK2UubWVzc2FnZSsnIicpOworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuSW5pdGlhbGl6ZVByb3RvY29sVHJhbnNwb3J0U3RhY2s7Cit2YXIKKyAgc3RyZWFtdHJhbnMgOiBJU3RyZWFtVHJhbnNwb3J0OworICBodHRwIDogSUhUVFBDbGllbnQ7CisgIHNVcmwgOiBzdHJpbmc7Citjb25zdAorICBERUJVR19USU1FT1VUICAgPSAzMCAqIDEwMDA7CisgIFJFTEVBU0VfVElNRU9VVCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQ7CisgIFBJUEVfVElNRU9VVCAgICA9IFJFTEVBU0VfVElNRU9VVDsKKyAgSFRUUF9USU1FT1VUUyAgID0gMTAgKiAxMDAwOworYmVnaW4KKyAgLy8gbmVlZGVkIGZvciBIVFRQIGNsaWVudHMgYXMgdGhleSB1dGlsaXplIHRoZSBNU1hNTCBDT00gY29tcG9uZW50cworICBPbGVDaGVjayggQ29Jbml0aWFsaXplKCBuaWwpKTsKKworICBjYXNlIEZTZXR1cC5lbmRwb2ludCBvZgorICAgIHRybnNfU29ja2V0czogYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBzb2NrZXRzICgnK0ZTZXR1cC5ob3N0KycgcG9ydCAnK0ludFRvU3RyKEZTZXR1cC5wb3J0KSsnKScpOworICAgICAgc3RyZWFtdHJhbnMgOj0gVFNvY2tldEltcGwuQ3JlYXRlKCBGU2V0dXAuaG9zdCwgRlNldHVwLnBvcnQgKTsKKyAgICAgIEZUcmFuc3BvcnQgOj0gc3RyZWFtdHJhbnM7CisgICAgZW5kOworCisgICAgdHJuc19IdHRwOiBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIEhUVFBDbGllbnQnKTsKKyAgICAgIGlmIEZTZXR1cC51c2VTU0wKKyAgICAgIHRoZW4gc1VybCA6PSAnaHR0cDovLycKKyAgICAgIGVsc2Ugc1VybCA6PSAnaHR0cHM6Ly8nOworICAgICAgc1VybCA6PSBzVXJsICsgRlNldHVwLmhvc3Q7CisgICAgICBjYXNlIEZTZXR1cC5wb3J0IG9mCisgICAgICAgIDgwICA6IGlmIEZTZXR1cC51c2VTU0wgdGhlbiBzVXJsIDo9IHNVcmwgKyAnOicrIEludFRvU3RyKEZTZXR1cC5wb3J0KTsKKyAgICAgICAgNDQzIDogaWYgbm90IEZTZXR1cC51c2VTU0wgdGhlbiBzVXJsIDo9IHNVcmwgKyAnOicrIEludFRvU3RyKEZTZXR1cC5wb3J0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgaWYgRlNldHVwLnBvcnQgPiAwIHRoZW4gc1VybCA6PSBzVXJsICsgJzonKyBJbnRUb1N0cihGU2V0dXAucG9ydCk7CisgICAgICBlbmQ7CisgICAgICBodHRwIDo9IFRIVFRQQ2xpZW50SW1wbC5DcmVhdGUoIHNVcmwpOworICAgICAgaHR0cC5EbnNSZXNvbHZlVGltZW91dCA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgaHR0cC5Db25uZWN0aW9uVGltZW91dCA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgaHR0cC5TZW5kVGltZW91dCAgICAgICA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgaHR0cC5SZWFkVGltZW91dCAgICAgICA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgRlRyYW5zcG9ydCA6PSBodHRwOworICAgIGVuZDsKKworICAgIHRybnNfRXZIdHRwOiBiZWdpbgorICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZShFTkRQT0lOVF9UUkFOU1BPUlRTW0ZTZXR1cC5lbmRwb2ludF0rJyB0cmFuc3BvcnQgbm90IGltcGxlbWVudGVkJyk7CisgICAgZW5kOworCisgICAgdHJuc19OYW1lZFBpcGVzOiBiZWdpbgorICAgICAgc3RyZWFtdHJhbnMgOj0gVE5hbWVkUGlwZVRyYW5zcG9ydENsaWVudEVuZEltcGwuQ3JlYXRlKCBGU2V0dXAuc1BpcGVOYW1lLCAwLCBuaWwsIFBJUEVfVElNRU9VVCwgUElQRV9USU1FT1VUKTsKKyAgICAgIEZUcmFuc3BvcnQgOj0gc3RyZWFtdHJhbnM7CisgICAgZW5kOworCisgICAgdHJuc19Bbm9uUGlwZXM6IGJlZ2luCisgICAgICBzdHJlYW10cmFucyA6PSBUQW5vbnltb3VzUGlwZVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBGU2V0dXAuaEFub25SZWFkLCBGU2V0dXAuaEFub25Xcml0ZSwgRkFMU0UpOworICAgICAgRlRyYW5zcG9ydCA6PSBzdHJlYW10cmFuczsKKyAgICBlbmQ7CisKKyAgZWxzZQorICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ1VuaGFuZGxlZCBlbmRwb2ludCB0cmFuc3BvcnQnKTsKKyAgZW5kOworICBBU1NFUlQoIEZUcmFuc3BvcnQgPD4gbmlsKTsKKworICAvLyBsYXllcmVkIHRyYW5zcG9ydHMgYXJlIG5vdCByZWFsbHkgbWVhbnQgdG8gYmUgc3RhY2tlZCB1cG9uIGVhY2ggb3RoZXIKKyAgaWYgKHRybnNfRnJhbWVkIGluIEZTZXR1cC5sYXllcmVkKSB0aGVuIGJlZ2luCisgICAgRlRyYW5zcG9ydCA6PSBURnJhbWVkVHJhbnNwb3J0SW1wbC5DcmVhdGUoIEZUcmFuc3BvcnQpOworICBlbmQKKyAgZWxzZSBpZiAodHJuc19CdWZmZXJlZCBpbiBGU2V0dXAubGF5ZXJlZCkgYW5kIChzdHJlYW10cmFucyA8PiBuaWwpIHRoZW4gYmVnaW4KKyAgICBGVHJhbnNwb3J0IDo9IFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBzdHJlYW10cmFucywgMzIpOyAgLy8gc21hbGwgYnVmZmVyIHRvIHRlc3QgcmVhZCgpCisgIGVuZDsKKworICBpZiBGU2V0dXAudXNlU1NMIHRoZW4gYmVnaW4KKyAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdTU0wvVExTIG5vdCBpbXBsZW1lbnRlZCcpOworICBlbmQ7CisKKyAgLy8gY3JlYXRlIHByb3RvY29sIGluc3RhbmNlLCBkZWZhdWx0IHRvIEJpbmFyeVByb3RvY29sCisgIGNhc2UgRlNldHVwLnByb3RUeXBlIG9mCisgICAgcHJvdF9CaW5hcnkgIDogIEZQcm90b2NvbCA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLkNyZWF0ZSggRlRyYW5zcG9ydCwgQklOQVJZX1NUUklDVF9SRUFELCBCSU5BUllfU1RSSUNUX1dSSVRFKTsKKyAgICBwcm90X0pTT04gICAgOiAgRlByb3RvY29sIDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSggRlRyYW5zcG9ydCk7CisgICAgcHJvdF9Db21wYWN0IDogIEZQcm90b2NvbCA6PSBUQ29tcGFjdFByb3RvY29sSW1wbC5DcmVhdGUoIEZUcmFuc3BvcnQpOworICBlbHNlCisgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnVW5oYW5kbGVkIHByb3RvY29sJyk7CisgIGVuZDsKKworICBBU1NFUlQoIChGVHJhbnNwb3J0IDw+IG5pbCkgYW5kIChGUHJvdG9jb2wgPD4gbmlsKSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuU2h1dGRvd25Qcm90b2NvbFRyYW5zcG9ydFN0YWNrOworYmVnaW4KKyAgdHJ5CisgICAgRlByb3RvY29sIDo9IG5pbDsKKworICAgIGlmIEZUcmFuc3BvcnQgPD4gbmlsIHRoZW4gYmVnaW4KKyAgICAgIEZUcmFuc3BvcnQuQ2xvc2U7CisgICAgICBGVHJhbnNwb3J0IDo9IG5pbDsKKyAgICBlbmQ7CisKKyAgZmluYWxseQorICAgIENvVW5pbml0aWFsaXplOworICBlbmQ7CitlbmQ7CisKKworeyBUVGhyZWFkQ29uc29sZSB9CisKK2NvbnN0cnVjdG9yIFRUaHJlYWRDb25zb2xlLkNyZWF0ZShBVGhyZWFkOiBUVGhyZWFkKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZUaHJlYWQgOj0gQVRocmVhZDsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJlYWRDb25zb2xlLldyaXRlKGNvbnN0IFM6IHN0cmluZyk7Cit2YXIKKyAgcHJvYyA6IFRUaHJlYWRQcm9jZWR1cmU7CitiZWdpbgorICBwcm9jIDo9IHByb2NlZHVyZQorICBiZWdpbgorICAgIENvbnNvbGUuV3JpdGUoIFMgKTsKKyAgZW5kOworICBUVGhyZWFkLlN5bmNocm9uaXplKCBGVGhyZWFkLCBwcm9jKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJlYWRDb25zb2xlLldyaXRlTGluZShjb25zdCBTOiBzdHJpbmcpOwordmFyCisgIHByb2MgOiBUVGhyZWFkUHJvY2VkdXJlOworYmVnaW4KKyAgcHJvYyA6PSBwcm9jZWR1cmUKKyAgYmVnaW4KKyAgICBDb25zb2xlLldyaXRlTGluZSggUyApOworICBlbmQ7CisgIFRUaHJlYWQuU3luY2hyb25pemUoIEZUaHJlYWQsIHByb2MpOworZW5kOworCitpbml0aWFsaXphdGlvbgorYmVnaW4KKyAgVFRlc3RDbGllbnQuRk51bUl0ZXJhdGlvbiA6PSAxOworICBUVGVzdENsaWVudC5GTnVtVGhyZWFkIDo9IDE7CitlbmQ7CisKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9UZXN0Q29uc3RhbnRzLnBhcyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0Q29uc3RhbnRzLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzk2OWRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L1Rlc3RDb25zdGFudHMucGFzCkBAIC0wLDAgKzEsMTYyIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGVzdENvbnN0YW50czsKKworaW50ZXJmYWNlCisKK3VzZXMgU3lzVXRpbHM7CisKK3R5cGUKKyAgVEtub3duUHJvdG9jb2wgPSAoCisgICAgcHJvdF9CaW5hcnksICAvLyBkZWZhdWx0IGJpbmFyeSBwcm90b2NvbAorICAgIHByb3RfSlNPTiwgICAgLy8gSlNPTiBwcm90b2NvbAorICAgIHByb3RfQ29tcGFjdAorICApOworCisgIFRTZXJ2ZXJUeXBlID0gKAorICAgIHNydl9TaW1wbGUsCisgICAgc3J2X05vbmJsb2NraW5nLAorICAgIHNydl9UaHJlYWRwb29sLAorICAgIHNydl9UaHJlYWRlZAorICApOworCisgIFRFbmRwb2ludFRyYW5zcG9ydCA9ICgKKyAgICB0cm5zX1NvY2tldHMsCisgICAgdHJuc19IdHRwLAorICAgIHRybnNfTmFtZWRQaXBlcywKKyAgICB0cm5zX0Fub25QaXBlcywKKyAgICB0cm5zX0V2SHR0cCAgLy8gYXMgbGlzdGVkIG9uIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy90ZXN0CisgICk7CisKKyAgVExheWVyZWRUcmFuc3BvcnQgPSAoCisgICAgdHJuc19CdWZmZXJlZCwKKyAgICB0cm5zX0ZyYW1lZAorICApOworCisgIFRMYXllcmVkVHJhbnNwb3J0cyA9IHNldCBvZiBUTGF5ZXJlZFRyYW5zcG9ydDsKKworY29uc3QKKyAgU0VSVkVSX1RZUEVTIDogYXJyYXlbVFNlcnZlclR5cGVdIG9mIHN0cmluZworICAgICAgICAgICAgICAgICAgPSAoJ1NpbXBsZScsICdOb25ibG9ja2luZycsICdUaHJlYWRwb29sJywgJ1RocmVhZGVkJyk7CisKKyAgVEhSSUZUX1BST1RPQ09MUyA6IGFycmF5W1RLbm93blByb3RvY29sXSBvZiBzdHJpbmcKKyAgICAgICAgICAgICAgICAgID0gKCdCaW5hcnknLCAnSlNPTicsICdDb21wYWN0Jyk7CisKKyAgTEFZRVJFRF9UUkFOU1BPUlRTIDogYXJyYXlbVExheWVyZWRUcmFuc3BvcnRdIG9mIHN0cmluZworICAgICAgICAgICAgICAgICAgPSAoJ0J1ZmZlcmVkJywgJ0ZyYW1lZCcpOworCisgIEVORFBPSU5UX1RSQU5TUE9SVFMgOiBhcnJheVtURW5kcG9pbnRUcmFuc3BvcnRdIG9mIHN0cmluZworICAgICAgICAgICAgICAgICAgPSAoJ1NvY2tldHMnLCAnSHR0cCcsICdOYW1lZCBQaXBlcycsJ0Fub24gUGlwZXMnLCAnRXZIdHRwJyk7CisKKyAgLy8gZGVmYXVsdHMgYXJlOiByZWFkPWZhbHNlLCB3cml0ZT10cnVlCisgIEJJTkFSWV9TVFJJQ1RfUkVBRCAgPSBGQUxTRTsKKyAgQklOQVJZX1NUUklDVF9XUklURSA9IEZBTFNFOworCisgIEhVR0VfVEVTVF9TVFJJTkcgPSAnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15ICcKKyAgICAgICAgICAgICAgICAgICArICdlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ3ZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCAnCisgICAgICAgICAgICAgICAgICAgKyAnYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ25vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkICcKKyAgICAgICAgICAgICAgICAgICArICdkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiAnCisgICAgICAgICAgICAgICAgICAgKyAnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15ICcKKyAgICAgICAgICAgICAgICAgICArICdlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ3ZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCAnCisgICAgICAgICAgICAgICAgICAgKyAnYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ25vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkICcKKyAgICAgICAgICAgICAgICAgICArICdkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiAnCisgICAgICAgICAgICAgICAgICAgKyAnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15ICcKKyAgICAgICAgICAgICAgICAgICArICdlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ3ZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCAnCisgICAgICAgICAgICAgICAgICAgKyAnYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ25vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkICcKKyAgICAgICAgICAgICAgICAgICArICdkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiAnCisgICAgICAgICAgICAgICAgICAgKyAnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15ICcKKyAgICAgICAgICAgICAgICAgICArICdlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ3ZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCAnCisgICAgICAgICAgICAgICAgICAgKyAnYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ25vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkICcKKyAgICAgICAgICAgICAgICAgICArICdkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiAnCisgICAgICAgICAgICAgICAgICAgKyAnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15ICcKKyAgICAgICAgICAgICAgICAgICArICdlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ3ZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCAnCisgICAgICAgICAgICAgICAgICAgKyAnYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ25vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkICcKKyAgICAgICAgICAgICAgICAgICArICdkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiAnCisgICAgICAgICAgICAgICAgICAgKyAnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15ICcKKyAgICAgICAgICAgICAgICAgICArICdlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ3ZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCAnCisgICAgICAgICAgICAgICAgICAgKyAnYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ25vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkICcKKyAgICAgICAgICAgICAgICAgICArICdkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiAnCisgICAgICAgICAgICAgICAgICAgKyAnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15ICcKKyAgICAgICAgICAgICAgICAgICArICdlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ3ZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCAnCisgICAgICAgICAgICAgICAgICAgKyAnYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ25vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkICcKKyAgICAgICAgICAgICAgICAgICArICdkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiAnCisgICAgICAgICAgICAgICAgICAgKyAnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15ICcKKyAgICAgICAgICAgICAgICAgICArICdlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ3ZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCAnCisgICAgICAgICAgICAgICAgICAgKyAnYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ25vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkICcKKyAgICAgICAgICAgICAgICAgICArICdkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiAnCisgICAgICAgICAgICAgICAgICAgKyAnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15ICcKKyAgICAgICAgICAgICAgICAgICArICdlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ3ZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCAnCisgICAgICAgICAgICAgICAgICAgKyAnYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ25vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkICcKKyAgICAgICAgICAgICAgICAgICArICdkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiAnOworCisKK2Z1bmN0aW9uIEJ5dGVzVG9IZXgoIGNvbnN0IGJ5dGVzIDogVEJ5dGVzKSA6IHN0cmluZzsKKworCitpbXBsZW1lbnRhdGlvbgorCisKK2Z1bmN0aW9uIEJ5dGVzVG9IZXgoIGNvbnN0IGJ5dGVzIDogVEJ5dGVzKSA6IHN0cmluZzsKK3ZhciBpIDogSW50ZWdlcjsKK2JlZ2luCisgIHJlc3VsdCA6PSAnJzsKKyAgZm9yIGkgOj0gTG93KGJ5dGVzKSB0byBIaWdoKGJ5dGVzKSBkbyBiZWdpbgorICAgIHJlc3VsdCA6PSByZXN1bHQgKyBJbnRUb0hleChieXRlc1tpXSwyKTsKKyAgZW5kOworZW5kOworCisKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9UZXN0U2VydmVyLnBhcyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0U2VydmVyLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWNiMTc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L1Rlc3RTZXJ2ZXIucGFzCkBAIC0wLDAgKzEsNzQ1IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGVzdFNlcnZlcjsKKworeyRJIC4uL3NyYy9UaHJpZnQuRGVmaW5lcy5pbmN9Cit7JFdBUk4gU1lNQk9MX1BMQVRGT1JNIE9GRn0KKworey4kREVGSU5FIFJ1bkVuZGxlc3N9ICAgLy8gYWN0aXZhdGUgdG8gaW50ZXJhY3RpdmVseSBzdHJlc3MtdGVzdCB0aGUgc2VydmVyIHN0b3Agcm91dGluZXMgdmlhIEN0cmwrQworCitpbnRlcmZhY2UKKwordXNlcworICBXaW5kb3dzLCBTeXNVdGlscywKKyAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCisgIFRocmlmdC5TZXJ2ZXIsCisgIFRocmlmdC5UcmFuc3BvcnQsCisgIFRocmlmdC5UcmFuc3BvcnQuUGlwZXMsCisgIFRocmlmdC5Qcm90b2NvbCwKKyAgVGhyaWZ0LlByb3RvY29sLkpTT04sCisgIFRocmlmdC5Qcm90b2NvbC5Db21wYWN0LAorICBUaHJpZnQuQ29sbGVjdGlvbnMsCisgIFRocmlmdC5VdGlscywKKyAgVGhyaWZ0LlRlc3QsCisgIFRocmlmdCwKKyAgVGVzdENvbnN0YW50cywKKyAgVGVzdFNlcnZlckV2ZW50cywKKyAgQ29uc29sZUhlbHBlciwKKyAgQ29udG5yczsKKwordHlwZQorICBUVGVzdFNlcnZlciA9IGNsYXNzCisgIHB1YmxpYworICAgIHR5cGUKKworICAgICAgSVRlc3RIYW5kbGVyID0gaW50ZXJmYWNlKCBUVGhyaWZ0VGVzdC5JZmFjZSApCisgICAgICAgIHByb2NlZHVyZSBTZXRTZXJ2ZXIoIGNvbnN0IEFTZXJ2ZXIgOiBJU2VydmVyICk7CisgICAgICAgIHByb2NlZHVyZSBUZXN0U3RvcDsKKyAgICAgIGVuZDsKKworICAgICAgVFRlc3RIYW5kbGVySW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVRlc3RIYW5kbGVyICkKKyAgICAgIHByaXZhdGUKKyAgICAgICAgRlNlcnZlciA6IElTZXJ2ZXI7CisgICAgICBwcm90ZWN0ZWQKKyAgICAgICAgcHJvY2VkdXJlIHRlc3RWb2lkKCk7CisgICAgICAgIGZ1bmN0aW9uIHRlc3RCb29sKHRoaW5nOiBCb29sZWFuKTogQm9vbGVhbjsKKyAgICAgICAgZnVuY3Rpb24gdGVzdFN0cmluZyhjb25zdCB0aGluZzogc3RyaW5nKTogc3RyaW5nOworICAgICAgICBmdW5jdGlvbiB0ZXN0Qnl0ZSh0aGluZzogU2hvcnRJbnQpOiBTaG9ydEludDsKKyAgICAgICAgZnVuY3Rpb24gdGVzdEkzMih0aGluZzogSW50ZWdlcik6IEludGVnZXI7CisgICAgICAgIGZ1bmN0aW9uIHRlc3RJNjQoY29uc3QgdGhpbmc6IEludDY0KTogSW50NjQ7CisgICAgICAgIGZ1bmN0aW9uIHRlc3REb3VibGUoY29uc3QgdGhpbmc6IERvdWJsZSk6IERvdWJsZTsKKyAgICAgICAgZnVuY3Rpb24gdGVzdEJpbmFyeShjb25zdCB0aGluZzogVEJ5dGVzKTogVEJ5dGVzOworICAgICAgICBmdW5jdGlvbiB0ZXN0U3RydWN0KGNvbnN0IHRoaW5nOiBJWHRydWN0KTogSVh0cnVjdDsKKyAgICAgICAgZnVuY3Rpb24gdGVzdE5lc3QoY29uc3QgdGhpbmc6IElYdHJ1Y3QyKTogSVh0cnVjdDI7CisgICAgICAgIGZ1bmN0aW9uIHRlc3RNYXAoY29uc3QgdGhpbmc6IElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIEludGVnZXI+KTogSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSW50ZWdlcj47CisgICAgICAgIGZ1bmN0aW9uIHRlc3RTdHJpbmdNYXAoY29uc3QgdGhpbmc6IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPik6IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPjsKKyAgICAgICAgZnVuY3Rpb24gdGVzdFNldChjb25zdCB0aGluZzogSUhhc2hTZXQ8SW50ZWdlcj4pOiBJSGFzaFNldDxJbnRlZ2VyPjsKKyAgICAgICAgZnVuY3Rpb24gdGVzdExpc3QoY29uc3QgdGhpbmc6IElUaHJpZnRMaXN0PEludGVnZXI+KTogSVRocmlmdExpc3Q8SW50ZWdlcj47CisgICAgICAgIGZ1bmN0aW9uIHRlc3RFbnVtKHRoaW5nOiBUTnVtYmVyeik6IFROdW1iZXJ6OworICAgICAgICBmdW5jdGlvbiB0ZXN0VHlwZWRlZihjb25zdCB0aGluZzogSW50NjQpOiBJbnQ2NDsKKyAgICAgICAgZnVuY3Rpb24gdGVzdE1hcE1hcChoZWxsbzogSW50ZWdlcik6IElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIEludGVnZXI+PjsKKyAgICAgICAgZnVuY3Rpb24gdGVzdEluc2FuaXR5KGNvbnN0IGFyZ3VtZW50OiBJSW5zYW5pdHkpOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnQ2NCwgSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT4+OworICAgICAgICBmdW5jdGlvbiB0ZXN0TXVsdGkoYXJnMDogU2hvcnRJbnQ7IGFyZzE6IEludGVnZXI7IGNvbnN0IGFyZzI6IEludDY0OyBjb25zdCBhcmczOiBJVGhyaWZ0RGljdGlvbmFyeTxTbWFsbEludCwgc3RyaW5nPjsgYXJnNDogVE51bWJlcno7IGNvbnN0IGFyZzU6IEludDY0KTogSVh0cnVjdDsKKyAgICAgICAgcHJvY2VkdXJlIHRlc3RFeGNlcHRpb24oY29uc3QgYXJnOiBzdHJpbmcpOworICAgICAgICBmdW5jdGlvbiB0ZXN0TXVsdGlFeGNlcHRpb24oY29uc3QgYXJnMDogc3RyaW5nOyBjb25zdCBhcmcxOiBzdHJpbmcpOiBJWHRydWN0OworICAgICAgICBwcm9jZWR1cmUgdGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcDogSW50ZWdlcik7CisKKyAgICAgICAgcHJvY2VkdXJlIFRlc3RTdG9wOworICAgICAgICBwcm9jZWR1cmUgU2V0U2VydmVyKCBjb25zdCBBU2VydmVyIDogSVNlcnZlciApOworICAgICAgZW5kOworCisgICAgICBjbGFzcyBwcm9jZWR1cmUgUHJpbnRDbWRMaW5lSGVscDsKKyAgICAgIGNsYXNzIHByb2NlZHVyZSBJbnZhbGlkQXJnczsKKworICAgICAgY2xhc3MgcHJvY2VkdXJlIExhdW5jaEFub25QaXBlQ2hpbGQoIGNvbnN0IGFwcCA6IHN0cmluZzsgY29uc3QgdHJhbnNwb3J0IDogSUFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnQpOworICAgICAgY2xhc3MgcHJvY2VkdXJlIEV4ZWN1dGUoIGNvbnN0IGFyZ3M6IGFycmF5IG9mIHN0cmluZyk7CisgIGVuZDsKKworaW1wbGVtZW50YXRpb24KKworCit2YXIgZ19IYW5kbGVyIDogVFRlc3RTZXJ2ZXIuSVRlc3RIYW5kbGVyID0gbmlsOworCisKK2Z1bmN0aW9uIE15Q29uc29sZUV2ZW50SGFuZGxlciggZHdDdHJsVHlwZSA6IERXT1JEKSA6IEJPT0w7ICBzdGRjYWxsOworLy8gTm90ZSB0aGF0IHRoaXMgSGFuZGxlciBwcm9jZWR1cmUgaXMgY2FsbGVkIGZyb20gYW5vdGhlciB0aHJlYWQKK3ZhciBoYW5kbGVyIDogVFRlc3RTZXJ2ZXIuSVRlc3RIYW5kbGVyOworYmVnaW4KKyAgcmVzdWx0IDo9IFRSVUU7CisgIHRyeQorICAgIGNhc2UgZHdDdHJsVHlwZSBvZgorICAgICAgQ1RSTF9DX0VWRU5UICAgICAgICA6ICBDb25zb2xlLldyaXRlTGluZSggJ0N0cmwrQyBwcmVzc2VkJyk7CisgICAgICBDVFJMX0JSRUFLX0VWRU5UICAgIDogIENvbnNvbGUuV3JpdGVMaW5lKCAnQ3RybCtCcmVhayBwcmVzc2VkJyk7CisgICAgICBDVFJMX0NMT1NFX0VWRU5UICAgIDogIENvbnNvbGUuV3JpdGVMaW5lKCAnUmVjZWl2ZWQgQ2xvc2VUYXNrIHNpZ25hbCcpOworICAgICAgQ1RSTF9MT0dPRkZfRVZFTlQgICA6ICBDb25zb2xlLldyaXRlTGluZSggJ1JlY2VpdmVkIExvZ09mZiBzaWduYWwnKTsKKyAgICAgIENUUkxfU0hVVERPV05fRVZFTlQgOiAgQ29uc29sZS5Xcml0ZUxpbmUoICdSZWNlaXZlZCBTaHV0ZG93biBzaWduYWwnKTsKKyAgICBlbHNlCisgICAgICBDb25zb2xlLldyaXRlTGluZSggJ1JlY2VpdmVkIGNvbnNvbGUgZXZlbnQgIycrSW50VG9TdHIoSW50ZWdlcihkd0N0cmxUeXBlKSkpOworICAgIGVuZDsKKworICAgIGhhbmRsZXIgOj0gZ19IYW5kbGVyOworICAgIGlmIGhhbmRsZXIgPD4gbmlsIHRoZW4gaGFuZGxlci5UZXN0U3RvcDsKKworICBleGNlcHQKKyAgICAvLyBjYXRjaCBhbGwKKyAgZW5kOworZW5kOworCisKK3sgVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbCB9CisKK3Byb2NlZHVyZSBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLlNldFNlcnZlciggY29uc3QgQVNlcnZlcjogSVNlcnZlcik7CitiZWdpbgorICBGU2VydmVyIDo9IEFTZXJ2ZXI7CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdEJ5dGUodGhpbmc6IFNob3J0SW50KTogU2hvcnRJbnQ7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdEJ5dGUoIicgKyBJbnRUb1N0ciggdGhpbmcpICsgJyIpJyk7CisgIFJlc3VsdCA6PSB0aGluZzsKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0RG91YmxlKCBjb25zdCB0aGluZzogRG91YmxlKTogRG91YmxlOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3REb3VibGUoIicgKyBGbG9hdFRvU3RyKCB0aGluZyApICsgJyIpJyk7CisgIFJlc3VsdCA6PSB0aGluZzsKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0QmluYXJ5KGNvbnN0IHRoaW5nOiBUQnl0ZXMpOiBUQnl0ZXM7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdEJpbmFyeSgiJyArIEJ5dGVzVG9IZXgoIHRoaW5nICkgKyAnIiknKTsKKyAgUmVzdWx0IDo9IHRoaW5nOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RFbnVtKHRoaW5nOiBUTnVtYmVyeik6IFROdW1iZXJ6OworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RFbnVtKCcgKyBJbnRUb1N0ciggSW50ZWdlciggdGhpbmcpKSArICcpJyk7CisgIFJlc3VsdCA6PSB0aGluZzsKK2VuZDsKKworcHJvY2VkdXJlIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdEV4Y2VwdGlvbihjb25zdCBhcmc6IHN0cmluZyk7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdEV4Y2VwdGlvbignICsgYXJnICsgJyknKTsKKyAgaWYgKCBhcmcgPSAnWGNlcHRpb24nKSB0aGVuCisgIGJlZ2luCisgICAgcmFpc2UgVFhjZXB0aW9uLkNyZWF0ZSggMTAwMSwgYXJnKTsKKyAgZW5kOworCisgIGlmIChhcmcgPSAnVEV4Y2VwdGlvbicpIHRoZW4KKyAgYmVnaW4KKyAgICByYWlzZSBURXhjZXB0aW9uLkNyZWF0ZSgnVEV4Y2VwdGlvbicpOworICBlbmQ7CisKKyAgLy8gZWxzZSBkbyBub3QgdGhyb3cgYW55dGhpbmcKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0STMyKHRoaW5nOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0STMyKCInICsgSW50VG9TdHIoIHRoaW5nKSArICciKScpOworICBSZXN1bHQgOj0gdGhpbmc7CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdEk2NCggY29uc3QgdGhpbmc6IEludDY0KTogSW50NjQ7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdEk2NCgiJyArIEludFRvU3RyKCB0aGluZykgKyAnIiknKTsKKyAgUmVzdWx0IDo9IHRoaW5nOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RJbnNhbml0eSgKKyAgY29uc3QgYXJndW1lbnQ6IElJbnNhbml0eSk6IElUaHJpZnREaWN0aW9uYXJ5PEludDY0LCBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5Pj47Cit2YXIKKyAgbG9vbmV5IDogSUluc2FuaXR5OworICBmaXJzdF9tYXAgOiBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5PjsKKyAgc2Vjb25kX21hcCA6IElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+OworICBpbnNhbmUgOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnQ2NCwgSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT4+OworCitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdEluc2FuaXR5KCknKTsKKworICAoKioKKyAgICogU28geW91IHRoaW5rIHlvdSd2ZSBnb3QgdGhpcyBhbGwgd29ya2VkLCBvdXQgZWg/CisgICAqCisgICAqIENyZWF0ZXMgYSB0aGUgcmV0dXJuZWQgbWFwIHdpdGggdGhlc2UgdmFsdWVzIGFuZCBwcmludHMgaXQgb3V0OgorICAgKiAgIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisgICAqICAgICAgICAgICAgMyA9PiBhcmd1bWVudCwKKyAgICogICAgICAgICAgfSwKKyAgICogICAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAorICAgKiAgIH0KKyAgICogQHJldHVybiBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4+IC0gYSBtYXAgd2l0aCB0aGUgYWJvdmUgdmFsdWVzCisgICAqKQorCisgIGZpcnN0X21hcCA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VE51bWJlcnosIElJbnNhbml0eT4uQ3JlYXRlOworICBzZWNvbmRfbWFwIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUTnVtYmVyeiwgSUluc2FuaXR5Pi5DcmVhdGU7CisKKyAgZmlyc3RfbWFwLkFkZE9yU2V0VmFsdWUoIFROdW1iZXJ6LlRXTywgYXJndW1lbnQpOworICBmaXJzdF9tYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouVEhSRUUsIGFyZ3VtZW50KTsKKworICBsb29uZXkgOj0gVEluc2FuaXR5SW1wbC5DcmVhdGU7CisgIHNlY29uZF9tYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouU0lYLCBsb29uZXkpOworCisgIGluc2FuZSA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8SW50NjQsIElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+Pi5DcmVhdGU7CisKKyAgaW5zYW5lLkFkZE9yU2V0VmFsdWUoIDEsIGZpcnN0X21hcCk7CisgIGluc2FuZS5BZGRPclNldFZhbHVlKCAyLCBzZWNvbmRfbWFwKTsKKworICBSZXN1bHQgOj0gaW5zYW5lOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RMaXN0KAorICBjb25zdCB0aGluZzogSVRocmlmdExpc3Q8SW50ZWdlcj4pOiBJVGhyaWZ0TGlzdDxJbnRlZ2VyPjsKK3ZhcgorICBmaXJzdCA6IEJvb2xlYW47CisgIGVsZW0gOiBJbnRlZ2VyOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZSgndGVzdExpc3QoeycpOworICBmaXJzdCA6PSBUcnVlOworICBmb3IgZWxlbSBpbiB0aGluZyBkbworICBiZWdpbgorICAgIGlmIGZpcnN0IHRoZW4KKyAgICBiZWdpbgorICAgICAgZmlyc3QgOj0gRmFsc2U7CisgICAgZW5kIGVsc2UKKyAgICBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZSgnLCAnKTsKKyAgICBlbmQ7CisgICAgQ29uc29sZS5Xcml0ZSggSW50VG9TdHIoIGVsZW0pKTsKKyAgZW5kOworICBDb25zb2xlLldyaXRlTGluZSgnfSknKTsKKyAgUmVzdWx0IDo9IHRoaW5nOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RNYXAoCisgIGNvbnN0IHRoaW5nOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJbnRlZ2VyPik6IElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIEludGVnZXI+OwordmFyCisgIGZpcnN0IDogQm9vbGVhbjsKKyAga2V5IDogSW50ZWdlcjsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGUoJ3Rlc3RNYXAoeycpOworICBmaXJzdCA6PSBUcnVlOworICBmb3Iga2V5IGluIHRoaW5nLktleXMgZG8KKyAgYmVnaW4KKyAgICBpZiAoZmlyc3QpIHRoZW4KKyAgICBiZWdpbgorICAgICAgZmlyc3QgOj0gZmFsc2U7CisgICAgZW5kIGVsc2UKKyAgICBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZSgnLCAnKTsKKyAgICBlbmQ7CisgICAgQ29uc29sZS5Xcml0ZShJbnRUb1N0cihrZXkpICsgJyA9PiAnICsgSW50VG9TdHIoIHRoaW5nW2tleV0pKTsKKyAgZW5kOworICBDb25zb2xlLldyaXRlTGluZSgnfSknKTsKKyAgUmVzdWx0IDo9IHRoaW5nOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLlRlc3RNYXBNYXAoCisgIGhlbGxvOiBJbnRlZ2VyKTogSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSW50ZWdlcj4+OwordmFyCisgIG1hcG1hcCA6IElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIEludGVnZXI+PjsKKyAgcG9zIDogSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSW50ZWdlcj47CisgIG5lZyA6IElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIEludGVnZXI+OworICBpIDogSW50ZWdlcjsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0TWFwTWFwKCcgKyBJbnRUb1N0ciggaGVsbG8pICsgJyknKTsKKyAgbWFwbWFwIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxJbnRlZ2VyLCBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJbnRlZ2VyPj4uQ3JlYXRlOworICBwb3MgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPEludGVnZXIsIEludGVnZXI+LkNyZWF0ZTsKKyAgbmVnIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxJbnRlZ2VyLCBJbnRlZ2VyPi5DcmVhdGU7CisKKyAgZm9yIGkgOj0gMSB0byA0IGRvCisgIGJlZ2luCisgICAgcG9zLkFkZE9yU2V0VmFsdWUoIGksIGkpOworICAgIG5lZy5BZGRPclNldFZhbHVlKCAtaSwgLWkpOworICBlbmQ7CisKKyAgbWFwbWFwLkFkZE9yU2V0VmFsdWUoNCwgcG9zKTsKKyAgbWFwbWFwLkFkZE9yU2V0VmFsdWUoIC00LCBuZWcpOworCisgIFJlc3VsdCA6PSBtYXBtYXA7CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdE11bHRpKGFyZzA6IFNob3J0SW50OyBhcmcxOiBJbnRlZ2VyOworICBjb25zdCBhcmcyOiBJbnQ2NDsgY29uc3QgYXJnMzogSVRocmlmdERpY3Rpb25hcnk8U21hbGxJbnQsIHN0cmluZz47CisgIGFyZzQ6IFROdW1iZXJ6OyBjb25zdCBhcmc1OiBJbnQ2NCk6IElYdHJ1Y3Q7Cit2YXIKKyAgaGVsbG8gOiBJWHRydWN0OworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RNdWx0aSgpJyk7CisgIGhlbGxvIDo9IFRYdHJ1Y3RJbXBsLkNyZWF0ZTsKKyAgaGVsbG8uU3RyaW5nX3RoaW5nIDo9ICdIZWxsbzInOworICBoZWxsby5CeXRlX3RoaW5nIDo9IGFyZzA7CisgIGhlbGxvLkkzMl90aGluZyA6PSBhcmcxOworICBoZWxsby5JNjRfdGhpbmcgOj0gYXJnMjsKKyAgUmVzdWx0IDo9IGhlbGxvOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RNdWx0aUV4Y2VwdGlvbiggY29uc3QgYXJnMCwgYXJnMTogc3RyaW5nKTogSVh0cnVjdDsKK3ZhcgorICB4MiA6IFRYY2VwdGlvbjI7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdE11bHRpRXhjZXB0aW9uKCcgKyBhcmcwICsgJywgJyArIGFyZzEgKyAnKScpOworICBpZiAoIGFyZzAgPSAnWGNlcHRpb24nKSB0aGVuCisgIGJlZ2luCisgICAgcmFpc2UgVFhjZXB0aW9uLkNyZWF0ZSggMTAwMSwgJ1RoaXMgaXMgYW4gWGNlcHRpb24nKTsgIC8vIHRlc3QgdGhlIG5ldyByaWNoIENUT1IKKyAgZW5kIGVsc2UKKyAgaWYgKCBhcmcwID0gJ1hjZXB0aW9uMicpIHRoZW4KKyAgYmVnaW4KKyAgICB4MiA6PSBUWGNlcHRpb24yLkNyZWF0ZTsgIC8vIHRoZSBvbGQgd2F5IHN0aWxsIHdvcmtzIHRvbz8KKyAgICB4Mi5FcnJvckNvZGUgOj0gMjAwMjsKKyAgICB4Mi5TdHJ1Y3RfdGhpbmcgOj0gVFh0cnVjdEltcGwuQ3JlYXRlOworICAgIHgyLlN0cnVjdF90aGluZy5TdHJpbmdfdGhpbmcgOj0gJ1RoaXMgaXMgYW4gWGNlcHRpb24yJzsKKyAgICB4Mi5VcGRhdGVNZXNzYWdlUHJvcGVydHk7CisgICAgcmFpc2UgeDI7CisgIGVuZDsKKworICBSZXN1bHQgOj0gVFh0cnVjdEltcGwuQ3JlYXRlOworICBSZXN1bHQuU3RyaW5nX3RoaW5nIDo9IGFyZzE7CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdE5lc3QoIGNvbnN0IHRoaW5nOiBJWHRydWN0Mik6IElYdHJ1Y3QyOwordmFyCisgIHRlbXAgOiBJWHRydWN0OworYmVnaW4KKyAgdGVtcCA6PSB0aGluZy5TdHJ1Y3RfdGhpbmc7CisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0TmVzdCh7JyArCisgICAgICAgICBJbnRUb1N0ciggdGhpbmcuQnl0ZV90aGluZykgKyAnLCB7JyArCisgICAgICAgICAnIicgKyB0ZW1wLlN0cmluZ190aGluZyArICciLCAnICsKKyAgICAgICAgIEludFRvU3RyKCB0ZW1wLkJ5dGVfdGhpbmcpICsgJywgJyArCisgICAgICAgICBJbnRUb1N0ciggdGVtcC5JMzJfdGhpbmcpICsgJywgJyArCisgICAgICAgICBJbnRUb1N0ciggdGVtcC5JNjRfdGhpbmcpICsgJ30sICcgKworICAgICAgICAgSW50VG9TdHIoIHRlbXAuSTMyX3RoaW5nKSArICd9KScpOworICBSZXN1bHQgOj0gdGhpbmc7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RPbmV3YXkoc2Vjb25kc1RvU2xlZXA6IEludGVnZXIpOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RPbmV3YXkoJyArIEludFRvU3RyKCBzZWNvbmRzVG9TbGVlcCApKyAnKSwgc2xlZXBpbmcuLi4nKTsKKyAgU2xlZXAoc2Vjb25kc1RvU2xlZXAgKiAxMDAwKTsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RPbmV3YXkgZmluaXNoZWQnKTsKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0U2V0KAorICBjb25zdCB0aGluZzogSUhhc2hTZXQ8SW50ZWdlcj4pOklIYXNoU2V0PEludGVnZXI+OwordmFyCisgIGZpcnN0IDogQm9vbGVhbjsKKyAgZWxlbSA6IEludGVnZXI7CitiZWdpbgorICBDb25zb2xlLldyaXRlKCd0ZXN0U2V0KHsnKTsKKyAgZmlyc3QgOj0gVHJ1ZTsKKworICBmb3IgZWxlbSBpbiB0aGluZyBkbworICBiZWdpbgorICAgIGlmIGZpcnN0IHRoZW4KKyAgICBiZWdpbgorICAgICAgZmlyc3QgOj0gRmFsc2U7CisgICAgZW5kIGVsc2UKKyAgICBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZSggJywgJyk7CisgICAgZW5kOworICAgIENvbnNvbGUuV3JpdGUoIEludFRvU3RyKCBlbGVtKSk7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ30pJyk7CisgIFJlc3VsdCA6PSB0aGluZzsKK2VuZDsKKworcHJvY2VkdXJlIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdFN0b3A7CitiZWdpbgorICBpZiBGU2VydmVyIDw+IG5pbCB0aGVuCisgIGJlZ2luCisgICAgRlNlcnZlci5TdG9wOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdEJvb2wodGhpbmc6IEJvb2xlYW4pOiBCb29sZWFuOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RCb29sKCcgKyBCb29sVG9TdHIodGhpbmcsdHJ1ZSkgKyAnKScpOworICBSZXN1bHQgOj0gdGhpbmc7CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdFN0cmluZyggY29uc3QgdGhpbmc6IHN0cmluZyk6IHN0cmluZzsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0c3RyaW5nKCInICsgdGhpbmcgKyAnIiknKTsKKyAgUmVzdWx0IDo9IHRoaW5nOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RTdHJpbmdNYXAoCisgIGNvbnN0IHRoaW5nOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4pOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz47Cit2YXIKKyAgZmlyc3QgOiBCb29sZWFuOworICBrZXkgOiBzdHJpbmc7CitiZWdpbgorICBDb25zb2xlLldyaXRlKCd0ZXN0U3RyaW5nTWFwKHsnKTsKKyAgZmlyc3QgOj0gVHJ1ZTsKKyAgZm9yIGtleSBpbiB0aGluZy5LZXlzIGRvCisgIGJlZ2luCisgICAgaWYgKGZpcnN0KSB0aGVuCisgICAgYmVnaW4KKyAgICAgIGZpcnN0IDo9IGZhbHNlOworICAgIGVuZCBlbHNlCisgICAgYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGUoJywgJyk7CisgICAgZW5kOworICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgJyA9PiAnICsgdGhpbmdba2V5XSk7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ30pJyk7CisgIFJlc3VsdCA6PSB0aGluZzsKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0VHlwZWRlZiggY29uc3QgdGhpbmc6IEludDY0KTogSW50NjQ7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdFR5cGVkZWYoJyArIEludFRvU3RyKCB0aGluZykgKyAnKScpOworICBSZXN1bHQgOj0gdGhpbmc7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLlRlc3RWb2lkOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RWb2lkKCknKTsKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0U3RydWN0KCBjb25zdCB0aGluZzogSVh0cnVjdCk6IElYdHJ1Y3Q7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdFN0cnVjdCh7JyArCisgICAgJyInICsgdGhpbmcuU3RyaW5nX3RoaW5nICsgJyIsICcgKworICAgICAgSW50VG9TdHIoIHRoaW5nLkJ5dGVfdGhpbmcpICsgJywgJyArCisgICAgICBJbnRUb1N0ciggdGhpbmcuSTMyX3RoaW5nKSArICcsICcgKworICAgICAgSW50VG9TdHIoIHRoaW5nLkk2NF90aGluZykpOworICBSZXN1bHQgOj0gdGhpbmc7CitlbmQ7CisKKworeyBUVGVzdFNlcnZlciB9CisKKworY2xhc3MgcHJvY2VkdXJlIFRUZXN0U2VydmVyLlByaW50Q21kTGluZUhlbHA7Citjb25zdCBIRUxQVEVYVCA9ICcgW29wdGlvbnNdJyMxMAorICAgICAgICAgICAgICAgKyAjMTAKKyAgICAgICAgICAgICAgICsgJ0FsbG93ZWQgb3B0aW9uczonIzEwCisgICAgICAgICAgICAgICArICcgIC1oIFsgLS1oZWxwIF0gICAgICAgICAgICAgICBwcm9kdWNlIGhlbHAgbWVzc2FnZScjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS1wb3J0IGFyZyAoPTkwOTApICAgICAgICAgIFBvcnQgbnVtYmVyIHRvIGxpc3RlbicjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS1kb21haW4tc29ja2V0IGFyZyAgICAgICAgIFVuaXggRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KScjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS1uYW1lZC1waXBlIGFyZyAgICAgICAgICAgIFdpbmRvd3MgTmFtZWQgUGlwZSAoZS5nLiBNeVRocmlmdFBpcGUpJyMxMAorICAgICAgICAgICAgICAgKyAnICAtLXNlcnZlci10eXBlIGFyZyAoPXNpbXBsZSkgdHlwZSBvZiBzZXJ2ZXIsICJzaW1wbGUiLCAidGhyZWFkLXBvb2wiLCcjMTAKKyAgICAgICAgICAgICAgICsgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRlZCIsIG9yICJub25ibG9ja2luZyInIzEwCisgICAgICAgICAgICAgICArICcgIC0tdHJhbnNwb3J0IGFyZyAoPXNvY2tldCkgICB0cmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIGFub25waXBlJyMxMAorICAgICAgICAgICAgICAgKyAnICAtLXByb3RvY29sIGFyZyAoPWJpbmFyeSkgICAgcHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbicjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS1zc2wgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMJyMxMAorICAgICAgICAgICAgICAgKyAnICAtLXByb2Nlc3Nvci1ldmVudHMgICAgICAgICAgcHJvY2Vzc29yLWV2ZW50cycjMTAKKyAgICAgICAgICAgICAgICsgJyAgLW4gWyAtLXdvcmtlcnMgXSBhcmcgKD00KSAgIE51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gT25seSB2YWxpZCBmb3InIzEwCisgICAgICAgICAgICAgICArICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZScjMTAKKyAgICAgICAgICAgICAgIDsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCBDaGFuZ2VGaWxlRXh0KEV4dHJhY3RGaWxlTmFtZShQYXJhbVN0cigwKSksJycpICsgSEVMUFRFWFQpOworZW5kOworCitjbGFzcyBwcm9jZWR1cmUgVFRlc3RTZXJ2ZXIuSW52YWxpZEFyZ3M7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSggJ0ludmFsaWQgYXJncy4nKTsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoIENoYW5nZUZpbGVFeHQoRXh0cmFjdEZpbGVOYW1lKFBhcmFtU3RyKDApKSwnJykgKyAnIC1oIGZvciBtb3JlIGluZm9ybWF0aW9uJyk7CisgIEFib3J0OworZW5kOworCitjbGFzcyBwcm9jZWR1cmUgVFRlc3RTZXJ2ZXIuTGF1bmNoQW5vblBpcGVDaGlsZCggY29uc3QgYXBwIDogc3RyaW5nOyBjb25zdCB0cmFuc3BvcnQgOiBJQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydCk7CisvL0xhdW5jaCBjaGlsZCBwcm9jZXNzIGFuZCBwYXNzIFIvVyBhbm9ueW1vdXMgcGlwZSBoYW5kbGVzIG9uIGNtZCBsaW5lLgorLy9UaGlzIGlzIGEgc2ltcGxlIGV4YW1wbGUgYW5kIGRvZXMgbm90IGluY2x1ZGUgZWxldmF0aW9uIG9yIG90aGVyCisvL2FkdmFuY2VkIGZlYXR1cmVzLgordmFyIHBpIDogUFJPQ0VTU19JTkZPUk1BVElPTjsKKyAgICAgICAgc2kgOiBTVEFSVFVQSU5GTzsKKyAgICAgICAgc0FyZywgc0hhbmRsZXMsIHNDbWRMaW5lIDogc3RyaW5nOworICAgIGkgOiBJbnRlZ2VyOworYmVnaW4KKyAgR2V0U3RhcnR1cEluZm8oIHNpKTsgIC8vc2V0IHN0YXJ0dXBpbmZvIGZvciB0aGUgc3Bhd25lZCBwcm9jZXNzCisKKyAgLy8gcHJlZm9ybWF0IGhhbmRsZXMgYXJncworICBzSGFuZGxlcyA6PSBGb3JtYXQoICclZCAlZCcsCisgICAgICAgICAgICAgICAgICAgIFsgSW50ZWdlcih0cmFuc3BvcnQuQ2xpZW50QW5vblJlYWQpLAorICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIodHJhbnNwb3J0LkNsaWVudEFub25Xcml0ZSldKTsKKworICAvLyBwYXNzIGFsbCBzZXR0aW5ncyB0byBjbGllbnQKKyAgc0NtZExpbmUgOj0gYXBwOworICBmb3IgaSA6PSAxIHRvIFBhcmFtQ291bnQgZG8gYmVnaW4KKyAgICBzQXJnIDo9IFBhcmFtU3RyKGkpOworCisgICAgLy8gYWRkIGFub255bW91cyBoYW5kbGVzIGFuZCBxdW90ZSBzdHJpbmdzIHdoZXJlIGFwcHJvcHJpYXRlCisgICAgaWYgc0FyZyA9ICctYW5vbicKKyAgICB0aGVuIHNBcmcgOj0gc0FyZyArJyAnKyBzSGFuZGxlcworICAgIGVsc2UgYmVnaW4KKyAgICAgIGlmIFBvcygnICcsc0FyZykgPiAwCisgICAgICB0aGVuIHNBcmcgOj0gJyInK3NBcmcrJyInOworICAgIGVuZDs7CisKKyAgICBzQ21kTGluZSA6PSBzQ21kTGluZSArJyAnKyBzQXJnOworICBlbmQ7CisKKyAgLy8gc3Bhd24gdGhlIGNoaWxkIHByb2Nlc3MKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ1N0YXJ0aW5nIGNsaWVudCAnK3NDbWRMaW5lKTsKKyAgV2luMzJDaGVjayggQ3JlYXRlUHJvY2VzcyggbmlsLCBQQ2hhcihzQ21kTGluZSksIG5pbCxuaWwsVFJVRSwwLG5pbCxuaWwsc2kscGkpKTsKKworICBDbG9zZUhhbmRsZSggcGkuaFRocmVhZCk7CisgICAgQ2xvc2VIYW5kbGUoIHBpLmhQcm9jZXNzKTsKK2VuZDsKKworCitjbGFzcyBwcm9jZWR1cmUgVFRlc3RTZXJ2ZXIuRXhlY3V0ZSggY29uc3QgYXJnczogYXJyYXkgb2Ygc3RyaW5nKTsKK3ZhcgorICBQb3J0IDogSW50ZWdlcjsKKyAgU2VydmVyRXZlbnRzIDogQm9vbGVhbjsKKyAgc1BpcGVOYW1lIDogc3RyaW5nOworICB0ZXN0SGFuZGxlciA6IElUZXN0SGFuZGxlcjsKKyAgdGVzdFByb2Nlc3NvciA6IElQcm9jZXNzb3I7CisgIFNlcnZlclRyYW5zIDogSVNlcnZlclRyYW5zcG9ydDsKKyAgU2VydmVyRW5naW5lIDogSVNlcnZlcjsKKyAgYW5vbnltb3VzcGlwZSA6IElBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0OworICBuYW1lZHBpcGUgOiBJTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0OworICBUcmFuc3BvcnRGYWN0b3J5IDogSVRyYW5zcG9ydEZhY3Rvcnk7CisgIFByb3RvY29sRmFjdG9yeSA6IElQcm90b2NvbEZhY3Rvcnk7CisgIGksIG51bVdvcmtlciA6IEludGVnZXI7CisgIHMgOiBzdHJpbmc7CisgIHByb3RUeXBlIDogVEtub3duUHJvdG9jb2w7CisgIHNlcnZlcnR5cGUgOiBUU2VydmVyVHlwZTsKKyAgZW5kcG9pbnQgOiBURW5kcG9pbnRUcmFuc3BvcnQ7CisgIGxheWVyZWQgOiBUTGF5ZXJlZFRyYW5zcG9ydHM7CisgIFVzZVNTTCA6IEJvb2xlYW47IC8vIGluY2x1ZGUgd2hlcmUgYXBwcm9wcmlhdGUgKFRMYXllcmVkVHJhbnNwb3J0PykKK2JlZ2luCisgIHRyeQorICAgIFNlcnZlckV2ZW50cyA6PSBGQUxTRTsKKyAgICBwcm90VHlwZSA6PSBwcm90X0JpbmFyeTsKKyAgICBzZXJ2ZXJ0eXBlIDo9IHNydl9TaW1wbGU7CisgICAgZW5kcG9pbnQgOj0gdHJuc19Tb2NrZXRzOworICAgIGxheWVyZWQgOj0gW107CisgICAgVXNlU1NMIDo9IEZBTFNFOworICAgIFBvcnQgOj0gOTA5MDsKKyAgICBzUGlwZU5hbWUgOj0gJyc7CisgICAgbnVtV29ya2VyIDo9IDQ7CisKKyAgICBpIDo9IDA7CisgICAgd2hpbGUgKCBpIDwgTGVuZ3RoKGFyZ3MpICkgZG8gYmVnaW4KKyAgICAgIHMgOj0gYXJnc1tpXTsKKyAgICAgIEluYyhpKTsKKworICAgICAgLy8gQWxsb3dlZCBvcHRpb25zOgorICAgICAgaWYgKHMgPSAnLWgnKSBvciAocyA9ICctLWhlbHAnKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIC1oIFsgLS1oZWxwIF0gICAgICAgICAgICAgICBwcm9kdWNlIGhlbHAgbWVzc2FnZQorICAgICAgICBQcmludENtZExpbmVIZWxwOworICAgICAgICBFeGl0OworICAgICAgZW5kCisgICAgICBlbHNlIGlmIChzID0gJy0tcG9ydCcpIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS1wb3J0IGFyZyAoPTkwOTApICAgICAgICAgIFBvcnQgbnVtYmVyIHRvIGxpc3RlbgorICAgICAgICBzIDo9IGFyZ3NbaV07CisgICAgICAgIEluYyhpKTsKKyAgICAgICAgUG9ydCA6PSBTdHJUb0ludERlZiggcywgUG9ydCk7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgKHMgPSAnLS1kb21haW4tc29ja2V0JykgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLWRvbWFpbi1zb2NrZXQgYXJnICAgICAgICAgVW5peCBEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ2RvbWFpbi1zb2NrZXQgbm90IHN1cHBvcnRlZCcpOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIChzID0gJy0tbmFtZWQtcGlwZScpIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS1uYW1lZC1waXBlIGFyZyAgICAgICAgICAgIFdpbmRvd3MgTmFtZWQgUGlwZSAoZS5nLiBNeVRocmlmdFBpcGUpCisgICAgICAgIGVuZHBvaW50IDo9IHRybnNfTmFtZWRQaXBlczsKKyAgICAgICAgc1BpcGVOYW1lIDo9IGFyZ3NbaV07ICAvLyAtcGlwZSA8bmFtZT4KKyAgICAgICAgSW5jKCBpICk7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgKHMgPSAnLS1zZXJ2ZXItdHlwZScpIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS1zZXJ2ZXItdHlwZSBhcmcgKD1zaW1wbGUpIHR5cGUgb2Ygc2VydmVyLAorICAgICAgICAvLyBhcmcgPSAic2ltcGxlIiwgInRocmVhZC1wb29sIiwgInRocmVhZGVkIiwgb3IgIm5vbmJsb2NraW5nIgorICAgICAgICBzIDo9IGFyZ3NbaV07CisgICAgICAgIEluYyhpKTsKKworICAgICAgICBpZiAgICAgIHMgPSAnc2ltcGxlJyAgICAgIHRoZW4gc2VydmVydHlwZSA6PSBzcnZfU2ltcGxlCisgICAgICAgIGVsc2UgaWYgcyA9ICd0aHJlYWQtcG9vbCcgdGhlbiBzZXJ2ZXJ0eXBlIDo9IHNydl9UaHJlYWRwb29sCisgICAgICAgIGVsc2UgaWYgcyA9ICd0aHJlYWRlZCcgICAgdGhlbiBzZXJ2ZXJ0eXBlIDo9IHNydl9UaHJlYWRlZAorICAgICAgICBlbHNlIGlmIHMgPSAnbm9uYmxvY2tpbmcnIHRoZW4gc2VydmVydHlwZSA6PSBzcnZfTm9uYmxvY2tpbmcKKyAgICAgICAgZWxzZSBJbnZhbGlkQXJnczsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiAocyA9ICctLXRyYW5zcG9ydCcpIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS10cmFuc3BvcnQgYXJnICg9YnVmZmVyZWQpIHRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cAorICAgICAgICBzIDo9IGFyZ3NbaV07CisgICAgICAgIEluYyhpKTsKKworICAgICAgICBpZiAgICAgIHMgPSAnYnVmZmVyZWQnIHRoZW4gSW5jbHVkZSggbGF5ZXJlZCwgdHJuc19CdWZmZXJlZCkKKyAgICAgICAgZWxzZSBpZiBzID0gJ2ZyYW1lZCcgICB0aGVuIEluY2x1ZGUoIGxheWVyZWQsIHRybnNfRnJhbWVkKQorICAgICAgICBlbHNlIGlmIHMgPSAnaHR0cCcgICAgIHRoZW4gZW5kcG9pbnQgOj0gdHJuc19IdHRwCisgICAgICAgIGVsc2UgaWYgcyA9ICdhbm9ucGlwZScgdGhlbiBlbmRwb2ludCA6PSB0cm5zX0Fub25QaXBlcworICAgICAgICBlbHNlIEludmFsaWRBcmdzOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIChzID0gJy0tcHJvdG9jb2wnKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSAgICBwcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uCisgICAgICAgIHMgOj0gYXJnc1tpXTsKKyAgICAgICAgSW5jKGkpOworCisgICAgICAgIGlmICAgICAgcyA9ICdiaW5hcnknICAgdGhlbiBwcm90VHlwZSA6PSBwcm90X0JpbmFyeQorICAgICAgICBlbHNlIGlmIHMgPSAnY29tcGFjdCcgIHRoZW4gcHJvdFR5cGUgOj0gcHJvdF9Db21wYWN0CisgICAgICAgIGVsc2UgaWYgcyA9ICdqc29uJyAgICAgdGhlbiBwcm90VHlwZSA6PSBwcm90X0pTT04KKyAgICAgICAgZWxzZSBJbnZhbGlkQXJnczsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiAocyA9ICctLXNzbCcpIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS1zc2wgICAgIEVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMCisgICAgICAgIFVzZVNTTCA6PSBUUlVFOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIChzID0gJy0tcHJvY2Vzc29yLWV2ZW50cycpIHRoZW4gYmVnaW4KKyAgICAgICAgIC8vIC0tcHJvY2Vzc29yLWV2ZW50cyAgICAgICAgICBwcm9jZXNzb3ItZXZlbnRzCisgICAgICAgIFNlcnZlckV2ZW50cyA6PSBUUlVFOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIChzID0gJy1uJykgb3IgKHMgPSAnLS13b3JrZXJzJykgdGhlbiBiZWdpbgorICAgICAgICAvLyAtbiBbIC0td29ya2VycyBdIGFyZyAoPTQpICAgTnVtYmVyIG9mIHRocmVhZCBwb29scyB3b3JrZXJzLgorICAgICAgICAvLyBPbmx5IHZhbGlkIGZvciB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZQorICAgICAgICBzIDo9IGFyZ3NbaV07CisgICAgICAgIG51bVdvcmtlciA6PSBTdHJUb0ludERlZihzLDApOworICAgICAgICBpZiBudW1Xb3JrZXIgPiAwCisgICAgICAgIHRoZW4gSW5jKGkpCisgICAgICAgIGVsc2UgbnVtV29ya2VyIDo9IDQ7CisgICAgICBlbmQKKyAgICAgIGVsc2UgYmVnaW4KKyAgICAgICAgSW52YWxpZEFyZ3M7CisgICAgICBlbmQ7CisgICAgZW5kOworCisKKyAgICBDb25zb2xlLldyaXRlTGluZSgnU2VydmVyIGNvbmZpZ3VyYXRpb246ICcpOworCisgICAgLy8gY3JlYXRlIHByb3RvY29sIGZhY3RvcnksIGRlZmF1bHQgdG8gQmluYXJ5UHJvdG9jb2wKKyAgICBjYXNlIHByb3RUeXBlIG9mCisgICAgICBwcm90X0JpbmFyeSAgOiAgUHJvdG9jb2xGYWN0b3J5IDo9IFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlKCBCSU5BUllfU1RSSUNUX1JFQUQsIEJJTkFSWV9TVFJJQ1RfV1JJVEUpOworICAgICAgcHJvdF9KU09OICAgIDogIFByb3RvY29sRmFjdG9yeSA6PSBUSlNPTlByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGU7CisgICAgICBwcm90X0NvbXBhY3QgOiAgUHJvdG9jb2xGYWN0b3J5IDo9IFRDb21wYWN0UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZTsKKyAgICBlbHNlCisgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdVbmhhbmRsZWQgcHJvdG9jb2wnKTsKKyAgICBlbmQ7CisgICAgQVNTRVJUKCBQcm90b2NvbEZhY3RvcnkgPD4gbmlsKTsKKyAgICBDb25zb2xlLldyaXRlTGluZSgnLSAnK1RIUklGVF9QUk9UT0NPTFNbcHJvdFR5cGVdKycgcHJvdG9jb2wnKTsKKworICAgIGNhc2UgZW5kcG9pbnQgb2YKKworICAgICAgdHJuc19Tb2NrZXRzIDogYmVnaW4KKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJy0gc29ja2V0cyAocG9ydCAnK0ludFRvU3RyKHBvcnQpKycpJyk7CisgICAgICAgIGlmICh0cm5zX0J1ZmZlcmVkIGluIGxheWVyZWQpIHRoZW4gQ29uc29sZS5Xcml0ZUxpbmUoJy0gYnVmZmVyZWQnKTsKKyAgICAgICAgc2VydmVydHJhbnMgOj0gVFNlcnZlclNvY2tldEltcGwuQ3JlYXRlKCBQb3J0LCAwLCAodHJuc19CdWZmZXJlZCBpbiBsYXllcmVkKSk7CisgICAgICBlbmQ7CisKKyAgICAgIHRybnNfSHR0cCA6IGJlZ2luCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoRU5EUE9JTlRfVFJBTlNQT1JUU1tlbmRwb2ludF0rJyBzZXJ2ZXIgdHJhbnNwb3J0IG5vdCBpbXBsZW1lbnRlZCcpOworICAgICAgZW5kOworCisgICAgICB0cm5zX05hbWVkUGlwZXMgOiBiZWdpbgorICAgICAgICBDb25zb2xlLldyaXRlTGluZSgnLSBuYW1lZCBwaXBlICgnK3NQaXBlTmFtZSsnKScpOworICAgICAgICBuYW1lZHBpcGUgICA6PSBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5DcmVhdGUoIHNQaXBlTmFtZSwgNDA5NiwgUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTKTsKKyAgICAgICAgc2VydmVydHJhbnMgOj0gbmFtZWRwaXBlOworICAgICAgZW5kOworCisgICAgICB0cm5zX0Fub25QaXBlcyA6IGJlZ2luCisgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCctIGFub255bW91cyBwaXBlcycpOworICAgICAgICBhbm9ueW1vdXNwaXBlIDo9IFRBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5DcmVhdGU7CisgICAgICAgIHNlcnZlcnRyYW5zICAgOj0gYW5vbnltb3VzcGlwZTsKKyAgICAgIGVuZAorCisgICAgZWxzZQorICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnVW5oYW5kbGVkIGVuZHBvaW50IHRyYW5zcG9ydCcpOworICAgIGVuZDsKKyAgICBBU1NFUlQoIHNlcnZlcnRyYW5zIDw+IG5pbCk7CisKKyAgICBpZiBVc2VTU0wgdGhlbiBiZWdpbgorICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnU1NMIG5vdCBpbXBsZW1lbnRlZCcpOworICAgIGVuZDsKKworICAgIGlmICh0cm5zX0ZyYW1lZCBpbiBsYXllcmVkKSB0aGVuIGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlTGluZSgnLSBmcmFtZWQgdHJhbnNwb3J0Jyk7CisgICAgICBUcmFuc3BvcnRGYWN0b3J5IDo9IFRGcmFtZWRUcmFuc3BvcnRJbXBsLlRGYWN0b3J5LkNyZWF0ZQorICAgIGVuZAorICAgIGVsc2UgYmVnaW4KKyAgICAgIFRyYW5zcG9ydEZhY3RvcnkgOj0gVFRyYW5zcG9ydEZhY3RvcnlJbXBsLkNyZWF0ZTsKKyAgICBlbmQ7CisgICAgQVNTRVJUKCBUcmFuc3BvcnRGYWN0b3J5IDw+IG5pbCk7CisKKyAgICB0ZXN0SGFuZGxlciAgIDo9IFRUZXN0SGFuZGxlckltcGwuQ3JlYXRlOworICAgIHRlc3RQcm9jZXNzb3IgOj0gVFRocmlmdFRlc3QuVFByb2Nlc3NvckltcGwuQ3JlYXRlKCB0ZXN0SGFuZGxlciApOworCisgICAgY2FzZSBzZXJ2ZXJ0eXBlIG9mCisgICAgICBzcnZfU2ltcGxlICAgICAgOiBiZWdpbgorICAgICAgICBTZXJ2ZXJFbmdpbmUgOj0gVFNpbXBsZVNlcnZlci5DcmVhdGUoIHRlc3RQcm9jZXNzb3IsIFNlcnZlclRyYW5zLCBUcmFuc3BvcnRGYWN0b3J5LCBQcm90b2NvbEZhY3RvcnkpOworICAgICAgZW5kOworCisgICAgICBzcnZfTm9uYmxvY2tpbmcgOiBiZWdpbgorICAgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKFNFUlZFUl9UWVBFU1tzZXJ2ZXJ0eXBlXSsnIHNlcnZlciBub3QgaW1wbGVtZW50ZWQnKTsKKyAgICAgIGVuZDsKKworICAgICAgc3J2X1RocmVhZHBvb2wsCisgICAgICBzcnZfVGhyZWFkZWQ6IGJlZ2luCisgICAgICAgIGlmIG51bVdvcmtlciA+IDEgdGhlbiB7dXNlIGhlcmV9OworICAgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKFNFUlZFUl9UWVBFU1tzZXJ2ZXJ0eXBlXSsnIHNlcnZlciBub3QgaW1wbGVtZW50ZWQnKTsKKyAgICAgIGVuZDsKKworICAgIGVsc2UKKyAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ1VuaGFuZGxlZCBzZXJ2ZXIgdHlwZScpOworICAgIGVuZDsKKyAgICBBU1NFUlQoIFNlcnZlckVuZ2luZSA8PiBuaWwpOworCisgICAgdGVzdEhhbmRsZXIuU2V0U2VydmVyKCBTZXJ2ZXJFbmdpbmUpOworCisgICAgLy8gdGVzdCBldmVudHM/CisgICAgaWYgU2VydmVyRXZlbnRzIHRoZW4gYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCctIHNlcnZlciBldmVudHMgdGVzdCBlbmFibGVkJyk7CisgICAgICBTZXJ2ZXJFbmdpbmUuU2VydmVyRXZlbnRzIDo9IFRTZXJ2ZXJFdmVudHNJbXBsLkNyZWF0ZTsKKyAgICBlbmQ7CisKKyAgICAvLyBzdGFydCB0aGUgY2xpZW50IG5vdyB3aGVuIHdlIGhhdmUgdGhlIGFub24gaGFuZGxlcywgYnV0IGJlZm9yZSB0aGUgc2VydmVyIHN0YXJ0cworICAgIGlmIGVuZHBvaW50ID0gdHJuc19Bbm9uUGlwZXMKKyAgICB0aGVuIExhdW5jaEFub25QaXBlQ2hpbGQoIEV4dHJhY3RGaWxlUGF0aChQYXJhbVN0cigwKSkrJ2NsaWVudC5leGUnLCBhbm9ueW1vdXNwaXBlKTsKKworICAgIC8vIGluc3RhbGwgQ3RybCtDIGhhbmRsZXIgYmVmb3JlIHRoZSBzZXJ2ZXIgc3RhcnRzCisgICAgZ19IYW5kbGVyIDo9IHRlc3RIYW5kbGVyOworICAgIFNldENvbnNvbGVDdHJsSGFuZGxlciggQE15Q29uc29sZUV2ZW50SGFuZGxlciwgVFJVRSk7CisKKyAgICBDb25zb2xlLldyaXRlTGluZSgnJyk7CisgICAgcmVwZWF0CisgICAgICBDb25zb2xlLldyaXRlTGluZSgnU3RhcnRpbmcgdGhlIHNlcnZlciAuLi4nKTsKKyAgICAgIHNlcnZlckVuZ2luZS5TZXJ2ZTsKKyAgICB1bnRpbCB7JElGREVGIFJ1bkVuZGxlc3N9IEZBTFNFIHskRUxTRX0gVFJVRSB7JEVORElGfTsKKworICAgIHRlc3RIYW5kbGVyLlNldFNlcnZlciggbmlsKTsKKyAgICBnX0hhbmRsZXIgOj0gbmlsOworCisgIGV4Y2VwdAorICAgIG9uIEU6IEVBYm9ydCBkbyByYWlzZTsKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8gYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCBFLk1lc3NhZ2UgKyAjMTAgKyBFLlN0YWNrVHJhY2UgKTsKKyAgICBlbmQ7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoICdkb25lLicpOworZW5kOworCisKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9UZXN0U2VydmVyRXZlbnRzLnBhcyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0U2VydmVyRXZlbnRzLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjA4Y2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L1Rlc3RTZXJ2ZXJFdmVudHMucGFzCkBAIC0wLDAgKzEsMTc0IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGVzdFNlcnZlckV2ZW50czsKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgU3lzVXRpbHMsCisgIFRocmlmdCwKKyAgVGhyaWZ0LlByb3RvY29sLAorICBUaHJpZnQuVHJhbnNwb3J0LAorICBUaHJpZnQuU2VydmVyLAorICBDb25zb2xlSGVscGVyOworCit0eXBlCisgIFRSZXF1ZXN0RXZlbnRzSW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVJlcXVlc3RFdmVudHMpCisgIHByb3RlY3RlZAorICAgIEZTdGFydCA6IFREYXRlVGltZTsKKyAgICAvLyBJUmVxdWVzdFByb2Nlc3NpbmdFdmVudHMKKyAgICBwcm9jZWR1cmUgUHJlUmVhZDsKKyAgICBwcm9jZWR1cmUgUG9zdFJlYWQ7CisgICAgcHJvY2VkdXJlIFByZVdyaXRlOworICAgIHByb2NlZHVyZSBQb3N0V3JpdGU7CisgICAgcHJvY2VkdXJlIE9uZXdheUNvbXBsZXRlOworICAgIHByb2NlZHVyZSBVbmhhbmRsZWRFcnJvciggY29uc3QgZSA6IEV4Y2VwdGlvbik7CisgICAgcHJvY2VkdXJlIENsZWFudXBDb250ZXh0OworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGU7CisgIGVuZDsKKworCisgIFRQcm9jZXNzb3JFdmVudHNJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJUHJvY2Vzc29yRXZlbnRzKQorICBwcm90ZWN0ZWQKKyAgICBGUmVxcyA6IEludGVnZXI7CisgICAgLy8gSVByb2Nlc3NvckV2ZW50cworICAgIHByb2NlZHVyZSBQcm9jZXNzaW5nKCBjb25zdCB0cmFuc3BvcnQgOiBJVHJhbnNwb3J0KTsKKyAgICBmdW5jdGlvbiAgQ3JlYXRlUmVxdWVzdENvbnRleHQoIGNvbnN0IGFGdW5jdGlvbk5hbWUgOiBzdHJpbmcpIDogSVJlcXVlc3RFdmVudHM7CisgICAgcHJvY2VkdXJlIENsZWFudXBDb250ZXh0OworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGU7CisgIGVuZDsKKworCisgIFRTZXJ2ZXJFdmVudHNJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJU2VydmVyRXZlbnRzKQorICBwcm90ZWN0ZWQKKyAgICAvLyBJU2VydmVyRXZlbnRzCisgICAgcHJvY2VkdXJlIFByZVNlcnZlOworICAgIHByb2NlZHVyZSBQcmVBY2NlcHQ7CisgICAgZnVuY3Rpb24gIENyZWF0ZVByb2Nlc3NpbmdDb250ZXh0KCBjb25zdCBpbnB1dCwgb3V0cHV0IDogSVByb3RvY29sKSA6IElQcm9jZXNzb3JFdmVudHM7CisgIGVuZDsKKworCitpbXBsZW1lbnRhdGlvbgorCit7IFRTZXJ2ZXJFdmVudHNJbXBsIH0KKworcHJvY2VkdXJlIFRTZXJ2ZXJFdmVudHNJbXBsLlByZVNlcnZlOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ1NlcnZlckV2ZW50czogU2VydmVyIHN0YXJ0aW5nIHRvIHNlcnZlIHJlcXVlc3RzJyk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRTZXJ2ZXJFdmVudHNJbXBsLlByZUFjY2VwdDsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCdTZXJ2ZXJFdmVudHM6IFNlcnZlciB0cmFuc3BvcnQgaXMgcmVhZHkgdG8gYWNjZXB0IGluY29taW5nIGNhbGxzJyk7CitlbmQ7CisKKworZnVuY3Rpb24gVFNlcnZlckV2ZW50c0ltcGwuQ3JlYXRlUHJvY2Vzc2luZ0NvbnRleHQoY29uc3QgaW5wdXQsIG91dHB1dDogSVByb3RvY29sKTogSVByb2Nlc3NvckV2ZW50czsKK2JlZ2luCisgIHJlc3VsdCA6PSBUUHJvY2Vzc29yRXZlbnRzSW1wbC5DcmVhdGU7CitlbmQ7CisKKworeyBUUHJvY2Vzc29yRXZlbnRzSW1wbCB9CisKK2NvbnN0cnVjdG9yIFRQcm9jZXNzb3JFdmVudHNJbXBsLkNyZWF0ZTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZSZXFzIDo9IDA7CisgIENvbnNvbGUuV3JpdGVMaW5lKCdQcm9jZXNzb3JFdmVudHM6IENsaWVudCBjb25uZWN0ZWQsIHByb2Nlc3NpbmcgYmVnaW5zJyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUUHJvY2Vzc29yRXZlbnRzSW1wbC5Qcm9jZXNzaW5nKGNvbnN0IHRyYW5zcG9ydDogSVRyYW5zcG9ydCk7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgnUHJvY2Vzc29yRXZlbnRzOiBQcm9jZXNzaW5nIG9mIGluY29taW5nIHJlcXVlc3QgYmVnaW5zJyk7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb2Nlc3NvckV2ZW50c0ltcGwuQ3JlYXRlUmVxdWVzdENvbnRleHQoIGNvbnN0IGFGdW5jdGlvbk5hbWU6IHN0cmluZyk6IElSZXF1ZXN0RXZlbnRzOworYmVnaW4KKyAgcmVzdWx0IDo9IFRSZXF1ZXN0RXZlbnRzSW1wbC5DcmVhdGU7CisgIEluYyggRlJlcXMpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvY2Vzc29yRXZlbnRzSW1wbC5DbGVhbnVwQ29udGV4dDsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCAnUHJvY2Vzc29yRXZlbnRzOiBjb21wbGV0ZWQgYWZ0ZXIgaGFuZGxpbmcgJytJbnRUb1N0cihGUmVxcykrJyByZXF1ZXN0cy4nKTsKK2VuZDsKKworCit7IFRSZXF1ZXN0RXZlbnRzSW1wbCB9CisKKworY29uc3RydWN0b3IgVFJlcXVlc3RFdmVudHNJbXBsLkNyZWF0ZTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZTdGFydCA6PSBOb3c7CisgIENvbnNvbGUuV3JpdGVMaW5lKCdSZXF1ZXN0RXZlbnRzOiBOZXcgcmVxdWVzdCcpOworZW5kOworCisKK3Byb2NlZHVyZSBUUmVxdWVzdEV2ZW50c0ltcGwuUHJlUmVhZDsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCdSZXF1ZXN0RXZlbnRzOiBSZWFkaW5nIHJlcXVlc3QgbWVzc2FnZSAuLi4nKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFJlcXVlc3RFdmVudHNJbXBsLlBvc3RSZWFkOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ1JlcXVlc3RFdmVudHM6IFJlYWRpbmcgcmVxdWVzdCBtZXNzYWdlIGNvbXBsZXRlZCcpOworZW5kOworCitwcm9jZWR1cmUgVFJlcXVlc3RFdmVudHNJbXBsLlByZVdyaXRlOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ1JlcXVlc3RFdmVudHM6IFdyaXRpbmcgcmVzcG9uc2UgbWVzc2FnZSAuLi4nKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFJlcXVlc3RFdmVudHNJbXBsLlBvc3RXcml0ZTsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCdSZXF1ZXN0RXZlbnRzOiBXcml0aW5nIHJlc3BvbnNlIG1lc3NhZ2UgY29tcGxldGVkJyk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRSZXF1ZXN0RXZlbnRzSW1wbC5PbmV3YXlDb21wbGV0ZTsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCdSZXF1ZXN0RXZlbnRzOiBPbmV3YXkgbWVzc2FnZSBwcm9jZXNzZWQnKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFJlcXVlc3RFdmVudHNJbXBsLlVuaGFuZGxlZEVycm9yKGNvbnN0IGU6IEV4Y2VwdGlvbik7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgnUmVxdWVzdEV2ZW50czogVW5oYW5kbGVkIGV4Y2VwdGlvbiBvZiB0eXBlICcrZS5jbGFzc25hbWUpOworZW5kOworCisKK3Byb2NlZHVyZSBUUmVxdWVzdEV2ZW50c0ltcGwuQ2xlYW51cENvbnRleHQ7Cit2YXIgbWlsbGlzIDogRG91YmxlOworYmVnaW4KKyAgbWlsbGlzIDo9IChOb3cgLSBGU3RhcnQpICogKDI0KjYwKjYwKjEwMDApOworICBDb25zb2xlLldyaXRlTGluZSggJ1JlcXVlc3QgcHJvY2Vzc2luZyBjb21wbGV0ZWQgaW4gJytJbnRUb1N0cihSb3VuZChtaWxsaXMpKSsnIG1zJyk7CitlbmQ7CisKKworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L2NsaWVudC5kcHIgYi9saWIvZGVscGhpL3Rlc3QvY2xpZW50LmRwcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmRiZDNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L2NsaWVudC5kcHIKQEAgLTAsMCArMSw3MiBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCisKK3Byb2dyYW0gY2xpZW50OworCit7JEFQUFRZUEUgQ09OU09MRX0KKwordXNlcworICBTeXNVdGlscywKKyAgVGVzdENsaWVudCBpbiAnVGVzdENsaWVudC5wYXMnLAorICBUaHJpZnQuVGVzdCwgLy8gaW4gJ2dlbi1kZWxwaGlcVGhyaWZ0LlRlc3QucGFzJywKKyAgVGhyaWZ0IGluICcuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQuUGlwZXMgaW4gJy4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wuSlNPTiBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5KU09OLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbC5Db21wYWN0IGluICcuLlxzcmNcVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleCBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXgucGFzJywKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCisgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCisgIFRocmlmdC5TdHJlYW0gaW4gJy4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcycsCisgIFRocmlmdC5UeXBlUmVnaXN0cnkgaW4gJy4uXHNyY1xUaHJpZnQuVHlwZVJlZ2lzdHJ5LnBhcycsCisgIFRocmlmdC5VdGlscyBpbiAnLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnOworCit2YXIKKyAgblBhcmFtQ291bnQgOiBJbnRlZ2VyOworICBhcmdzIDogYXJyYXkgb2Ygc3RyaW5nOworICBpIDogSW50ZWdlcjsKKyAgYXJnIDogc3RyaW5nOworCitiZWdpbgorICB0cnkKKyAgICBXcml0ZWxuKCAnRGVscGhpIFRlc3RDbGllbnQgJytUaHJpZnQuVmVyc2lvbik7CisgICAgblBhcmFtQ291bnQgOj0gUGFyYW1Db3VudDsKKyAgICBTZXRMZW5ndGgoIGFyZ3MsIG5QYXJhbUNvdW50KTsKKyAgICBmb3IgaSA6PSAxIHRvIG5QYXJhbUNvdW50IGRvIGJlZ2luCisgICAgICBhcmcgOj0gUGFyYW1TdHIoIGkgKTsKKyAgICAgIGFyZ3NbaS0xXSA6PSBhcmc7CisgICAgZW5kOworCisgICAgRXhpdENvZGUgOj0gVFRlc3RDbGllbnQuRXhlY3V0ZSggYXJncyk7CisKKyAgZXhjZXB0CisgICAgb24gRTogRUFib3J0IGRvIGJlZ2luCisgICAgICBFeGl0Q29kZSA6PSAkRkY7CisgICAgZW5kOworICAgIG9uIEU6IEV4Y2VwdGlvbiBkbyBiZWdpbgorICAgICAgV3JpdGVsbihFLkNsYXNzTmFtZSwgJzogJywgRS5NZXNzYWdlKTsKKyAgICAgIEV4aXRDb2RlIDo9ICRGRjsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L2NvZGVnZW4vUkVBRE1FLm1kIGIvbGliL2RlbHBoaS90ZXN0L2NvZGVnZW4vUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMTQ1ODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvY29kZWdlbi9SRUFETUUubWQKQEAgLTAsMCArMSwyOCBAQAorSG93IHRvIHVzZSB0aGUgdGVzdCBjYXNlOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLSBjb3B5IGFuZCB0aGUgdGVtcGxhdGUgYmF0Y2ggZmlsZQorLSBvcGVuIHRoZSBiYXRjaCBmaWxlIGFuZCBhZGp1c3QgY29uZmlndXJhdGlvbiBhcyBuZWNlc3NhcnkKKy0gcnVuIHRoZSBiYXRjaAorCisKK0NvbmZpZ3VyYXRpb246CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTVk5XT1JLRElSCitzaG91bGQgcG9pbnQgdG8gdGhlIFRocmlmdCB3b3JraW5nIGNvcHkgcm9vdAorCitNWV9USFJJRlRfRklMRVMKK2NhbiBiZSBzZXQgdG8gcG9pbnQgdG8gYSBmb2xkZXIgd2l0aCBtb3JlIHRocmlmdCBJREwgZmlsZXMuCitJZiB5b3UgZG9uJ3QgaGF2ZSBhbnkgc3VjaCBmaWxlcywganVzdCBsZWF2ZSB0aGUgc2V0dGluZyBibGFuay4KKworQklOCitMb2NhbCBNU1lTIGJpbmFyeSBmb2xkZXIuIFlvdXIgVEhSSUZULkVYRSBpcyBpbnN0YWxsZWQgaGVyZS4KKworTUlOR1dfQklOCitMb2NhbCBNaW5HVyBiaW4gZm9sZGVyLiBDb250YWlucyBETEwgZmlsZXMgcmVxdWlyZWQgYnkgVEhSSUZULkVYRQorCitEQ0MKK0lkZW50aWZpZXMgdGhlIERlbHBoaSBDb21tYW5kIExpbmUgY29tcGlsZXIgKGRjYzMyLmV4ZSkKK1RvIGJlIGNvbmZpZ3VpcmVkIG9ubHksIGlmIHRoZSBkZWZhdWx0IGlzIG5vdCBzdWl0YWJsZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKkVPRioKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvY29kZWdlbi9ydW4tUGFzY2FsLUNvZGVnZW4tVGVzdHMuYmF0LnRtcGwgYi9saWIvZGVscGhpL3Rlc3QvY29kZWdlbi9ydW4tUGFzY2FsLUNvZGVnZW4tVGVzdHMuYmF0LnRtcGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJhYjBhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9jb2RlZ2VuL3J1bi1QYXNjYWwtQ29kZWdlbi1UZXN0cy5iYXQudG1wbApAQCAtMCwwICsxLDE3MyBAQAorUkVNIC8qCitSRU0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitSRU0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorUkVNICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK1JFTSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorUkVNICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorUkVNICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorUkVNICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitSRU0gKgorUkVNICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK1JFTSAqCitSRU0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitSRU0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorUkVNICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitSRU0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorUkVNICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworUkVNICogdW5kZXIgdGhlIExpY2Vuc2UuCitSRU0gKi8KK0BlY2hvIG9mZgoraWYgIiI9PSIlMSIgZ290byBDT05GSUcKK2dvdG8gSEFORExFRElSCisKK1JFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOkNPTkZJRworUkVNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3JlbSAqIENPTkZJR1VSQVRJT04gQkVHSU4KK3JlbSAqIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MsIGFkanVzdCBhcyBuZWNlc3NhcnkgdG8gbWVldCB5b3VyIHN5c3RlbSBzZXR1cAorc2V0IFNWTldPUktESVI9CitzZXQgTVlfVEhSSUZUX0ZJTEVTPQorc2V0IEJJTj1DOlxNU3lzMTBcbG9jYWxcYmluCitzZXQgTUlOR1dfQklOPUM6XE1pbkdXXGJpbgorc2V0IERDQz0KK3NldCBTVUJESVI9Z2VuLWRlbHBoaQorcmVtICogQ09ORklHVVJBVElPTiBFTkQKKworCitSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzpTVEFSVAorUkVNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3JlbSAqIGNvbmZpZ3VyZWQ/CitpZiAiJVNWTldPUktESVIlIj09IiIgZ290byBDT05GSUdfRVJST1IKKworcmVtICogdHJ5IHRvIGZpbmQgZGNjMzIuZXhlCitlY2hvIExvb2tpbmcgZm9yIGRjYzMyLmV4ZSAuLi4KK2lmIG5vdCBleGlzdCAiJURDQyUiIHNldCBEQ0M9JVByb2dyYW1GaWxlcyVcRW1iYXJjYWRlcm9cUkFEIFN0dWRpb1w4LjBcYmluXGRjYzMyLmV4ZQoraWYgbm90IGV4aXN0ICIlRENDJSIgc2V0IERDQz0lUHJvZ3JhbUZpbGVzKHg4NiklXEVtYmFyY2FkZXJvXFJBRCBTdHVkaW9cOC4wXGJpblxkY2MzMi5leGUKK2lmIG5vdCBleGlzdCAiJURDQyUiIGdvdG8gQ09ORklHX0VSUk9SCitlY2hvIEZvdW5kICVEQ0MlCitlY2hvLgorCityZW0gKiBzb21lIGhlbHBlcnMKK3NldCBQQVRIPSVCSU4lOyVNSU5HV19CSU4lOyVQQVRIJQorc2V0IFRBUkdFVD0lU1ZOV09SS0RJUiVcLi5cdGhyaWZ0LXRlc3RpbmcKK3NldCBTT1VSQ0U9JVNWTldPUktESVIlCitzZXQgVEVTVEFQUD1UZXN0UHJvamVjdAorc2V0IFVOSVRTRUFSQ0g9JVNPVVJDRSVcbGliXHBhc1xzcmM7JVNPVVJDRSVcbGliXGRlbHBoaVxzcmMKK3NldCBPVVREQ1U9IiVUQVJHRVQlXGRjdSIKK3NldCBMT0dGSUxFPSVUQVJHRVQlXCVTVUJESVIlXGNvZGVnZW4ubG9nCisKK3JlbSAqIGNyZWF0ZSBhbmQvb3IgZW1wdHkgdGFyZ2V0IGRpcnMKK2lmIG5vdCBleGlzdCAiJVRBUkdFVCUiICAgICAgICAgICBtZCAiJVRBUkdFVCUiCitpZiBub3QgZXhpc3QgIiVUQVJHRVQlXCVTVUJESVIlIiAgbWQgIiVUQVJHRVQlXCVTVUJESVIlIgoraWYgbm90IGV4aXN0ICIlT1VURENVJSIgICAgICAgICAgIG1kICIlT1VURENVJSIKK2lmIGV4aXN0ICIlVEFSR0VUJVwqLnRocmlmdCIgICAgICBkZWwgIiVUQVJHRVQlXCoudGhyaWZ0IiAgICAgICAvUQoraWYgZXhpc3QgIiVUQVJHRVQlXCVTVUJESVIlXCouKiIgIGRlbCAiJVRBUkdFVCVcJVNVQkRJUiVcKi4qIiAgIC9RCitpZiBleGlzdCAiJU9VVERDVSVcKi4qIiAgICAgICAgICAgZGVsICIlT1VURENVJVwqLioiICAgICAgICAgICAgL1EKKworcmVtICogcmVjdXJzZSB0aHJvdWdoIHRocmlmdCBXQyBhbmQgIm15IHRocmlmdCBmaWxlcyIgZm9sZGVyCityZW0gKiBjb3BpZXMgYWxsIC50aHJpZnQgZmlsZXMgaW50byB0aHJpZnQtdGVzdGluZworY2FsbCAlMCAlU09VUkNFJQoraWYgbm90ICIlTVlfVEhSSUZUX0ZJTEVTJSI9PSIiIGNhbGwgJTAgJU1ZX1RIUklGVF9GSUxFUyUKKworcmVtICogY29tcGlsZSBhbGwgdGhyaWZ0IGZpbGVzLCBnZW5lcmF0ZSBQQVMgYW5kIEMrKyBjb2RlCitlY2hvLgorZWNobyBHZW5lcmF0aW5nIGNvZGUsIHBsZWFzZSB3YWl0IC4uLgorY2QgIiVUQVJHRVQlIgorZm9yICUlYSBpbiAoKi50aHJpZnQpIGRvICIlQklOJVx0aHJpZnQuZXhlIiAtdiAtLWdlbiBkZWxwaGk6cmVnaXN0ZXJfdHlwZXMsY29uc3RwcmVmaXgsZXZlbnRzLHhtbGRvYyAiJSVhIiAyPj4gIiVMT0dGSUxFJSIKK1JFTSAqIGZvciAlJWEgaW4gKCoudGhyaWZ0KSBkbyAiJUJJTiVcdGhyaWZ0LmV4ZSIgLXYgLS1nZW4gY3BwICIlJWEiID4+IE5VTDoKK2NtZCAvYyBzdGFydCBub3RlcGFkICIlTE9HRklMRSUiCitjZCAuLgorCityZW0gKiBjaGVjayBmb3Igc3BlY2lhbCBEZWxwaGkgdGVzdGNhc2VzIGJlaW5nIHByb2Nlc3NlZAoraWYgbm90IGV4aXN0ICIlVEFSR0VUJVwlU1VCRElSJVxSZXNlcnZlZEtleXdvcmRzLnBhcyIgZ290byBURVNUQ0FTRV9NSVNTSU5HCisKKworcmVtICogZ2VuZXJhdGUgYSBtaW5pbWFsIERQUiBmaWxlIHRoYXQgdXNlcyBhbGwgZ2VuZXJhdGVkIHBhc2NhbCB1bml0cworY2QgIiVUQVJHRVQlXCVTVUJESVIlXCIKK2lmIGV4aXN0IGluaGVyaXRlZC4qICByZW4gaW5oZXJpdGVkLiogIF9pbmhlcml0ZWQuKgorZWNobyBwcm9ncmFtICVURVNUQVBQJTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiAlVEVTVEFQUCUuZHByCitlY2hvIHskQVBQVFlQRSBDT05TT0xFfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+ICVURVNUQVBQJS5kcHIKK2VjaG8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJVRFU1RBUFAlLmRwcgorZWNobyB1c2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAlVEVTVEFQUCUuZHByCitmb3IgJSVhIGluICgqLnBhcykgZG8gZWNobyAgICUlfm5hLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+ICVURVNUQVBQJS5kcHIKK2VjaG8gICBXaW5kb3dzLCBDbGFzc2VzLCBTeXNVdGlsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJVRFU1RBUFAlLmRwcgorZWNoby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAlVEVTVEFQUCUuZHByCitlY2hvIGJlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+ICVURVNUQVBQJS5kcHIKK2VjaG8gICBXcml0ZWxuKCdTdWNjZXNzZnVsbHkgY29tcGlsZWQhJyk7ICAgICAgICAgICAgICAgICAgICAgICAgPj4gJVRFU1RBUFAlLmRwcgorZWNobyAgIFdyaXRlbG4oJ0xpc3Qgb2YgdW5pdHM6Jyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAlVEVTVEFQUCUuZHByCitmb3IgJSVhIGluICgqLnBhcykgZG8gZWNobyAgIFdyaXRlKCclJX5uYSc6MzAsJyc6MTApOyAgICAgICAgICAgID4+ICVURVNUQVBQJS5kcHIKK2VjaG8gICBXcml0ZWxuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJVRFU1RBUFAlLmRwcgorZWNobyBlbmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAlVEVTVEFQUCUuZHByCitlY2hvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+ICVURVNUQVBQJS5kcHIKK2NkIC4uXC4uCisKK3JlbSAqIHRyeSB0byBjb21waWxlIHRoZSBEUFIKK3JlbSAqIHRoaXMgc2hvdWxkIG5vdCB0aHJvdyBhbnkgZXJyb3JzLCB3YXJuaW5ncyBvciBoaW50cworIiVEQ0MlIiAgLUIgIiVUQVJHRVQlXCVTVUJESVIlXCVURVNUQVBQJSIgLVUiJVVOSVRTRUFSQ0glIiAtSSIlVU5JVFNFQVJDSCUiIC1OIiVPVVREQ1UlIiAtRSIlVEFSR0VUJVwlU1VCRElSJSIKK2RpciAiJVRBUkdFVCVcJVNVQkRJUiVcJVRFU1RBUFAlLmV4ZSIKK2lmIG5vdCBleGlzdCAiJVRBUkdFVCVcJVNVQkRJUiVcJVRFU1RBUFAlLmV4ZSIgIGdvdG8gQ09ERUdFTl9GQUlMRUQKK2VjaG8uCitlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitlY2hvIFRoZSBjb21waWxlZCBwcm9ncmFtIGlzIG5vdyBleGVjdXRlZC4gSWYgaXQgaGFuZ3Mgb3IgY3Jhc2hlcywgd2UKK2VjaG8gaGF2ZSBhIHNlcmlvdXMgcHJvYmxlbSB3aXRoIHRoZSBnZW5lcmF0ZWQgY29kZS4gRXhwZWN0ZWQgb3V0cHV0CitlY2hvIGlzICJTdWNjZXNzZnVsbHkgY29tcGlsZWQ6IiBmb2xsb3dlZCBieSBhIGxpc3Qgb2YgZ2VuZXJhdGVkIHVuaXRzLgorZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiVUQVJHRVQlXCVTVUJESVIlXCVURVNUQVBQJS5leGUiCitlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitlY2hvLgorcGF1c2UKK0dPVE8gRU9GCisKK1JFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOkRYRV9OT1RfRk9VTkQKK1JFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZWNobyBEZWxwaGkgQ29tcGlsZXIgKGRjYzMyLmV4ZSkgbm90IGZvdW5kLgorZWNobyBQbGVhc2UgY2hlY2sgdGhlICJEQ0MiIHNldHRpbmcgaW4gdGhpcyBiYXRjaC4KK2VjaG8uCitjbWQgL2Mgc3RhcnQgbm90ZXBhZCBSRUFETUUuTUQKK2NtZCAvYyBzdGFydCBub3RlcGFkICUwCitwYXVzZQorR09UTyBFT0YKKworCitSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzpDT05GSUdfRVJST1IKK1JFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZWNobyBNaXNzaW5nLCBpbmNvbXBsZXRlIG9yIHdyb25nIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MhCitjbWQgL2Mgc3RhcnQgbm90ZXBhZCBSRUFETUUuTUQKK2NtZCAvYyBzdGFydCBub3RlcGFkICUwCitwYXVzZQorR09UTyBFT0YKKworCitSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzpURVNUQ0FTRV9NSVNTSU5HCitSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2VjaG8gTWlzc2luZyBhbiBleHBlY3RlZCBEZWxwaGkgdGVzdGNhc2UhCitwYXVzZQorR09UTyBFT0YKKworCitSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzpDT0RFR0VOX0ZBSUxFRAorUkVNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitlY2hvIENvZGUgZ2VuZXJhdGlvbiBGQUlMRUQhCitwYXVzZQorR09UTyBFT0YKKworCitSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzpIQU5ETEVESVIKK1JFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUkVNIGVjaG8gJTEKK2ZvciAvRCAlJWEgaW4gKCUxXCopIGRvIGNhbGwgJTAgJSVhCitpZiBleGlzdCAiJTFcKi50aHJpZnQiICAgY29weSAvYiAiJTFcKi50aHJpZnQiICIlVEFSR0VUJVwqLioiCitHT1RPIEVPRgorCisKK1JFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOkVPRgorUkVNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRJbmNsdWRlZC50aHJpZnQgYi9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRJbmNsdWRlZC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI0N2E1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEluY2x1ZGVkLnRocmlmdApAQCAtMCwwICsxLDI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIG1ha2Ugc3VyZSBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBwcm9kdWNlIG5hbWUgY29sbGlzaW9ucyB3aXRoIHByZWRlZmluZWQga2V5d29yZHMKK25hbWVzcGFjZSBkZWxwaGkgU3lzVXRpbHMKKworY29uc3QgaTMyIGludGVnZXIgPSA0MgorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLmRwciBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLmRwcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmJjOGMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMuZHByCkBAIC0wLDAgKzEsMTUgQEAKK3Byb2dyYW0gUmVzZXJ2ZWRLZXl3b3JkczsKKworeyRBUFBUWVBFIENPTlNPTEV9CisKK3VzZXMKKyAgU3lzVXRpbHMsIFN5c3RlbV87CisKK2JlZ2luCisgIHRyeQorICAgIHsgVE9ETyAtb1VzZXIgLWNDb25zb2xlIE1haW4gOiBDb2RlIGhpZXIgZWluZvxnZW4gfQorICBleGNlcHQKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8KKyAgICAgIFdyaXRlbG4oRS5DbGFzc05hbWUsICc6ICcsIEUuTWVzc2FnZSk7CisgIGVuZDsKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLmRwcm9qIGIvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMuZHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkOTU0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLmRwcm9qCkBAIC0wLDAgKzEsMTEyIEBACivvu78JPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisJCTxQcm9wZXJ0eUdyb3VwPgorCQkJPFByb2plY3RHdWlkPntGMkU5QjZGQy1BOTMxLTQyNzEtOEUzMC01QTRFNDAyNDgxQjR9PC9Qcm9qZWN0R3VpZD4KKwkJCTxNYWluU291cmNlPlJlc2VydmVkS2V5d29yZHMuZHByPC9NYWluU291cmNlPgorCQkJPFByb2plY3RWZXJzaW9uPjEyLjM8L1Byb2plY3RWZXJzaW9uPgorCQkJPEJhc2lzPlRydWU8L0Jhc2lzPgorCQkJPENvbmZpZyBDb25kaXRpb249IickKENvbmZpZyknPT0nJyI+RGVidWc8L0NvbmZpZz4KKwkJCTxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisJCQk8QXBwVHlwZT5Db25zb2xlPC9BcHBUeXBlPgorCQkJPEZyYW1ld29ya1R5cGU+Tm9uZTwvRnJhbWV3b3JrVHlwZT4KKwkJCTxEQ0NfRENDQ29tcGlsZXI+RENDMzI8L0RDQ19EQ0NDb21waWxlcj4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nQmFzaXMnIG9yICckKEJhc2UpJyE9JyciPgorCQkJPEJhc2U+dHJ1ZTwvQmFzZT4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nRGVidWcnIG9yICckKENmZ18xKSchPScnIj4KKwkJCTxDZmdfMT50cnVlPC9DZmdfMT4KKwkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPEJhc2U+dHJ1ZTwvQmFzZT4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nUmVsZWFzZScgb3IgJyQoQ2ZnXzIpJyE9JyciPgorCQkJPENmZ18yPnRydWU8L0NmZ18yPgorCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQmFzZSknIT0nJyI+CisJCQk8RENDX0ltYWdlQmFzZT4wMDQwMDAwMDwvRENDX0ltYWdlQmFzZT4KKwkJCTxEQ0NfRGN1T3V0cHV0Pi5cJChDb25maWcpXCQoUGxhdGZvcm0pPC9EQ0NfRGN1T3V0cHV0PgorCQkJPERDQ19Vbml0U2VhcmNoUGF0aD5nZW4tZGVscGhpOy4uXC4uXHNyYzskKERDQ19Vbml0U2VhcmNoUGF0aCk8L0RDQ19Vbml0U2VhcmNoUGF0aD4KKwkJCTxEQ0NfVW5pdEFsaWFzPldpblR5cGVzPVdpbmRvd3M7V2luUHJvY3M9V2luZG93cztEYmlUeXBlcz1CREU7RGJpUHJvY3M9QkRFOyQoRENDX1VuaXRBbGlhcyk8L0RDQ19Vbml0QWxpYXM+CisJCQk8RENDX0V4ZU91dHB1dD4uXCQoQ29uZmlnKVwkKFBsYXRmb3JtKTwvRENDX0V4ZU91dHB1dD4KKwkJCTxEQ0NfTj5mYWxzZTwvRENDX04+CisJCQk8RENDX1M+ZmFsc2U8L0RDQ19TPgorCQkJPERDQ19LPmZhbHNlPC9EQ0NfSz4KKwkJCTxEQ0NfRT5mYWxzZTwvRENDX0U+CisJCQk8RENDX0Y+ZmFsc2U8L0RDQ19GPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzEpJyE9JyciPgorCQkJPERDQ19EZWZpbmU+REVCVUc7JChEQ0NfRGVmaW5lKTwvRENDX0RlZmluZT4KKwkJCTxEQ0NfT3B0aW1pemU+ZmFsc2U8L0RDQ19PcHRpbWl6ZT4KKwkJCTxEQ0NfR2VuZXJhdGVTdGFja0ZyYW1lcz50cnVlPC9EQ0NfR2VuZXJhdGVTdGFja0ZyYW1lcz4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18yKSchPScnIj4KKwkJCTxEQ0NfTG9jYWxEZWJ1Z1N5bWJvbHM+ZmFsc2U8L0RDQ19Mb2NhbERlYnVnU3ltYm9scz4KKwkJCTxEQ0NfRGVmaW5lPlJFTEVBU0U7JChEQ0NfRGVmaW5lKTwvRENDX0RlZmluZT4KKwkJCTxEQ0NfU3ltYm9sUmVmZXJlbmNlSW5mbz4wPC9EQ0NfU3ltYm9sUmVmZXJlbmNlSW5mbz4KKwkJCTxEQ0NfRGVidWdJbmZvcm1hdGlvbj5mYWxzZTwvRENDX0RlYnVnSW5mb3JtYXRpb24+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPEl0ZW1Hcm91cD4KKwkJCTxEZWxwaGlDb21waWxlIEluY2x1ZGU9IlJlc2VydmVkS2V5d29yZHMuZHByIj4KKwkJCQk8TWFpblNvdXJjZT5NYWluU291cmNlPC9NYWluU291cmNlPgorCQkJPC9EZWxwaGlDb21waWxlPgorCQkJPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlIj4KKwkJCQk8S2V5PkNmZ18yPC9LZXk+CisJCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8L0J1aWxkQ29uZmlndXJhdGlvbj4KKwkJCTxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iQmFzaXMiPgorCQkJCTxLZXk+QmFzZTwvS2V5PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCQk8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnIj4KKwkJCQk8S2V5PkNmZ18xPC9LZXk+CisJCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8L0J1aWxkQ29uZmlndXJhdGlvbj4KKwkJPC9JdGVtR3JvdXA+CisJCTxJbXBvcnQgQ29uZGl0aW9uPSJFeGlzdHMoJyQoQkRTKVxCaW5cQ29kZUdlYXIuRGVscGhpLlRhcmdldHMnKSIgUHJvamVjdD0iJChCRFMpXEJpblxDb2RlR2Vhci5EZWxwaGkuVGFyZ2V0cyIvPgorCQk8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEFQUERBVEEpXEVtYmFyY2FkZXJvXCQoQkRTQVBQREFUQUJBU0VESVIpXCQoUFJPRFVDVFZFUlNJT04pXFVzZXJUb29scy5wcm9qJykiIFByb2plY3Q9IiQoQVBQREFUQSlcRW1iYXJjYWRlcm9cJChCRFNBUFBEQVRBQkFTRURJUilcJChQUk9EVUNUVkVSU0lPTilcVXNlclRvb2xzLnByb2oiLz4KKwkJPFByb3BlcnR5R3JvdXA+CisJCQk8UHJlQnVpbGRFdmVudD48IVtDREFUQVt0aHJpZnQgLXIgIC1nZW4gZGVscGhpIFJlc2VydmVkS2V5d29yZHMudGhyaWZ0XV0+PC9QcmVCdWlsZEV2ZW50PgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9qZWN0RXh0ZW5zaW9ucz4KKwkJCTxCb3JsYW5kLlBlcnNvbmFsaXR5PkRlbHBoaS5QZXJzb25hbGl0eS4xMjwvQm9ybGFuZC5QZXJzb25hbGl0eT4KKwkJCTxCb3JsYW5kLlByb2plY3RUeXBlLz4KKwkJCTxCb3JsYW5kUHJvamVjdD4KKwkJCQk8RGVscGhpLlBlcnNvbmFsaXR5PgorCQkJCQk8VmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iSW5jbHVkZVZlckluZm8iPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJBdXRvSW5jQnVpbGQiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJNYWpvclZlciI+MTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iTWlub3JWZXIiPjA8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlJlbGVhc2UiPjA8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkJ1aWxkIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJEZWJ1ZyI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlByZVJlbGVhc2UiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJTcGVjaWFsIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUHJpdmF0ZSI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkRMTCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkxvY2FsZSI+MTAzMTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQ29kZVBhZ2UiPjEyNTI8L1ZlcnNpb25JbmZvPgorCQkJCQk8L1ZlcnNpb25JbmZvPgorCQkJCQk8VmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21wYW55TmFtZSIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlRGVzY3JpcHRpb24iLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZVZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iSW50ZXJuYWxOYW1lIi8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsQ29weXJpZ2h0Ii8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsVHJhZGVtYXJrcyIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJPcmlnaW5hbEZpbGVuYW1lIi8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3ROYW1lIi8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3RWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbW1lbnRzIi8+CisJCQkJCTwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQk8U291cmNlPgorCQkJCQkJPFNvdXJjZSBOYW1lPSJNYWluU291cmNlIj5SZXNlcnZlZEtleXdvcmRzLmRwcjwvU291cmNlPgorCQkJCQk8L1NvdXJjZT4KKwkJCQk8L0RlbHBoaS5QZXJzb25hbGl0eT4KKwkJCQk8UGxhdGZvcm1zPgorCQkJCQk8UGxhdGZvcm0gdmFsdWU9IldpbjMyIj5UcnVlPC9QbGF0Zm9ybT4KKwkJCQk8L1BsYXRmb3Jtcz4KKwkJCTwvQm9ybGFuZFByb2plY3Q+CisJCQk8UHJvamVjdEZpbGVWZXJzaW9uPjEyPC9Qcm9qZWN0RmlsZVZlcnNpb24+CisJCTwvUHJvamVjdEV4dGVuc2lvbnM+CisJPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMudGhyaWZ0IGIvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNDlkNzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRLZXl3b3Jkcy50aHJpZnQKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gbWFrZSBzdXJlIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IHByb2R1Y2UgbmFtZSBjb2xsaXNpb25zIHdpdGggcHJlZGVmaW5lZCBrZXl3b3JkcworbmFtZXNwYWNlIGRlbHBoaSBTeXN0ZW0KKworaW5jbHVkZSAiUmVzZXJ2ZWRJbmNsdWRlZC50aHJpZnQiCisKKwordHlwZWRlZiBpMzIgQ2FyZGluYWwKK3R5cGVkZWYgc3RyaW5nIG1lc3NhZ2UKK3R5cGVkZWYgbGlzdDwgbWFwPCBDYXJkaW5hbCwgbWVzc2FnZT4+IHByb2dyYW0KKworc3RydWN0IHVuaXQgeworICAxOiBDYXJkaW5hbCBkb3dudG87CisgIDI6IHByb2dyYW0gcHJvY2VkdXJlOworfQorCit0eXBlZGVmIHNldDwgdW5pdD4gdW5pdHMKKworZXhjZXB0aW9uIGV4Y2VwdGlvbjEgeworICAxOiBwcm9ncmFtIG1lc3NhZ2U7CisgIDI6IHVuaXQgYXJyYXk7Cit9CisKK3NlcnZpY2UgY29uc3RydWN0b3IgeworICB1bml0IENyZWF0ZSgxOiBDYXJkaW5hbCBhc207IDI6IG1lc3NhZ2UgaW5oZXJpdGVkKSB0aHJvd3MgKDE6IGV4Y2VwdGlvbjEgbGFiZWwpOworICB1bml0cyBEZXN0cm95KCk7Cit9CisKK2NvbnN0IENhcmRpbmFsIGRvd250byA9ICsxCitjb25zdCBDYXJkaW5hbCBwdWJsaXNoZWQgPSAtMQorCitlbnVtIGtleXdvcmRzIHsKKyAgcmVjb3JkID0gMSwKKyAgcmVwZWF0ID0gMiwKKyAgZGVwcmVjYXRlZCA9IDMKK30KKworCitzdHJ1Y3QgU3RydWN0X2xpc3RzIHsKKyAgMTogbGlzdDxTdHJ1Y3Rfc2ltcGxlPiBpbml0OworICAyOiBsaXN0PFN0cnVjdF9zaW1wbGU+IHN0cnVjOworICAzOiBsaXN0PFN0cnVjdF9zaW1wbGU+IGZpZWxkOworICA0OiBsaXN0PFN0cnVjdF9zaW1wbGU+IGZpZWxkXzsKKyAgNTogbGlzdDxTdHJ1Y3Rfc2ltcGxlPiB0cmFja2VyOworICA2OiBsaXN0PFN0cnVjdF9zaW1wbGU+IFNlbGY7Cit9CisKK3N0cnVjdCBTdHJ1Y3Rfc3RydWN0cyB7CisgIDE6IFN0cnVjdF9zaW1wbGUgaW5pdDsKKyAgMjogU3RydWN0X3NpbXBsZSBzdHJ1YzsKKyAgMzogU3RydWN0X3NpbXBsZSBmaWVsZDsKKyAgNDogU3RydWN0X3NpbXBsZSBmaWVsZF87CisgIDU6IFN0cnVjdF9zaW1wbGUgdHJhY2tlcjsKKyAgNjogU3RydWN0X3NpbXBsZSBTZWxmOworfQorCitzdHJ1Y3QgU3RydWN0X3NpbXBsZSB7CisgIDE6IGJvb2wgaW5pdDsKKyAgMjogYm9vbCBzdHJ1YzsKKyAgMzogYm9vbCBmaWVsZDsKKyAgNDogYm9vbCBmaWVsZF87CisgIDU6IGJvb2wgdHJhY2tlcjsKKyAgNjogYm9vbCBTZWxmOworfQorCitzdHJ1Y3QgU3RydWN0X3N0cmluZ3MgeworICAxOiBzdHJpbmcgaW5pdDsKKyAgMjogc3RyaW5nIHN0cnVjOworICAzOiBzdHJpbmcgZmllbGQ7CisgIDQ6IHN0cmluZyBmaWVsZF87CisgIDU6IHN0cmluZyB0cmFja2VyOworICA2OiBzdHJpbmcgU2VsZjsKK30KKworc3RydWN0IFN0cnVjdF9iaW5hcnkgeworICAxOiBiaW5hcnkgaW5pdDsKKyAgMjogYmluYXJ5IHN0cnVjOworICAzOiBiaW5hcnkgZmllbGQ7CisgIDQ6IGJpbmFyeSBmaWVsZF87CisgIDU6IGJpbmFyeSB0cmFja2VyOworICA2OiBiaW5hcnkgU2VsZjsKK30KKworCit0eXBlZGVmIGkzMiBJUHJvdG9jb2wgCit0eXBlZGVmIGkzMiBJVHJhbnNwb3J0Cit0eXBlZGVmIGkzMiBJRmFjZQordHlwZWRlZiBpMzIgSUFzeW5jCit0eXBlZGVmIGkzMiBTeXN0ZW0KK3R5cGVkZWYgaTMyIFN5c1V0aWxzCit0eXBlZGVmIGkzMiBHZW5lcmljcwordHlwZWRlZiBpMzIgVGhyaWZ0CisKK3N0cnVjdCBTdHJ1Y3RfVGhyaWZ0X05hbWVzIHsKKyAgMTogSVByb3RvY29sICAgSVByb3RvY29sCisgIDI6IElUcmFuc3BvcnQgIElUcmFuc3BvcnQKKyAgMzogSUZhY2UgICAgICAgSUZhY2UKKyAgNDogSUFzeW5jICAgICAgSUFzeW5jCisgIDU6IFN5c3RlbSAgICAgIFN5c3RlbQorICA2OiBTeXNVdGlscyAgICBTeXNVdGlscworICA3OiBHZW5lcmljcyAgICBHZW5lcmljcworICA4OiBUaHJpZnQgICAgICBUaHJpZnQKK30KKworCitlbnVtIFRocmlmdDQ1NTRfRW51bSB7CisgIEZvbyA9IDAsCisgIEJhciA9IDEsCisgIEJheiA9IDIsCit9CisKK3N0cnVjdCBUaHJpZnQ0NTU0X1N0cnVjdCB7CisgIDEgOiBvcHRpb25hbCBkb3VibGUgTWluVmFsdWUKKyAgMiA6IG9wdGlvbmFsIGRvdWJsZSBNYXhWYWx1ZQorICAzIDogb3B0aW9uYWwgYm9vbCBJbnRlZ2VyICAvLyBjYXVzZXMgaXNzdWUKKyAgNCA6IG9wdGlvbmFsIFRocmlmdDQ1NTRfRW51bSBGb28KK30KKworCisvLyBFT0YKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9tYWtldGVzdC5zaCBiL2xpYi9kZWxwaGkvdGVzdC9tYWtldGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZjA2MzljCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L21ha2V0ZXN0LnNoCkBAIC0wLDAgKzEsMjMgQEAKKyMhL2Jpbi9zaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBkZWxwaGkgLW8gLiAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguQ2xpZW50Lk1haW4ucGFzIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5DbGllbnQuTWFpbi5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVmZGY2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguQ2xpZW50Lk1haW4ucGFzCkBAIC0wLDAgKzEsMTMxIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgTXVsdGlwbGV4LkNsaWVudC5NYWluOworCit7LiRERUZJTkUgU3RyZXNzVGVzdH0gICAvLyBhY3RpdmF0ZSB0byBzdHJlc3MtdGVzdCB0aGUgc2VydmVyIHdpdGggZnJlcXVlbnQgY29ubmVjdHMvZGlzY29ubmVjdHMKK3suJERFRklORSBQZXJmVGVzdH0gICAgIC8vIGFjdGl2YXRlIHRvIGFjdGl2YXRlIHRoZSBwZXJmb3JtYW5jZSB0ZXN0CisKK2ludGVyZmFjZQorCit1c2VzCisgIFdpbmRvd3MsIFN5c1V0aWxzLCBDbGFzc2VzLAorICBEYXRlVXRpbHMsCisgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAorICBUaHJpZnQsCisgIFRocmlmdC5Qcm90b2NvbCwKKyAgVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleCwKKyAgVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcywKKyAgVGhyaWZ0LlRyYW5zcG9ydCwKKyAgVGhyaWZ0LlN0cmVhbSwKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zLAorICBCZW5jaG1hcmssICAvLyBpbiBnZW4tZGVscGhpIGZvbGRlcgorICBBZ2dyLCAgICAgICAvLyBpbiBnZW4tZGVscGhpIGZvbGRlcgorICBNdWx0aXBsZXguVGVzdC5Db21tb247CisKK3R5cGUKKyAgVFRlc3RDbGllbnQgPSBjbGFzcworICBwcm90ZWN0ZWQKKyAgICBGUHJvdG9jb2wgOiBJUHJvdG9jb2w7CisKKyAgICBwcm9jZWR1cmUgUGFyc2VBcmdzKCBjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpOworICAgIHByb2NlZHVyZSBTZXR1cDsKKyAgICBwcm9jZWR1cmUgUnVuOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFyZ3M6IGFycmF5IG9mIHN0cmluZyk7CisgICAgY2xhc3MgcHJvY2VkdXJlIEV4ZWN1dGUoIGNvbnN0IGFyZ3M6IGFycmF5IG9mIHN0cmluZyk7CisgIGVuZDsKKworaW1wbGVtZW50YXRpb24KKworCit0eXBlCisgIElTZXJ2aWNlQ2xpZW50ID0gaW50ZXJmYWNlCisgICAgWyd7Nzc0NUMxQzItQUIyMC00M0JBLUI2RjAtMDhCRjkyREUwQkFDfSddCisgICAgcHJvY2VkdXJlIFRlc3Q7CisgIGVuZDsKKworLy8tLS0gVFRlc3RDbGllbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2NsYXNzIHByb2NlZHVyZSBUVGVzdENsaWVudC5FeGVjdXRlKCBjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpOwordmFyIGNsaWVudCA6IFRUZXN0Q2xpZW50OworYmVnaW4KKyAgY2xpZW50IDo9IFRUZXN0Q2xpZW50LkNyZWF0ZShhcmdzKTsKKyAgdHJ5CisgICAgY2xpZW50LlJ1bjsKKyAgZmluYWxseQorICAgIGNsaWVudC5GcmVlOworICBlbmQ7CitlbmQ7CisKKworY29uc3RydWN0b3IgVFRlc3RDbGllbnQuQ3JlYXRlKCBjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgUGFyc2VBcmdzKGFyZ3MpOworICBTZXR1cDsKK2VuZDsKKworCitwcm9jZWR1cmUgVFRlc3RDbGllbnQuUGFyc2VBcmdzKCBjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpOworYmVnaW4KKyAgaWYgTGVuZ3RoKGFyZ3MpIDw+IDAKKyAgdGhlbiByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdObyBhcmdzIGFjY2VwdGVkIHNvIGZhcicpOworZW5kOworCisKK3Byb2NlZHVyZSBUVGVzdENsaWVudC5TZXR1cDsKK3ZhciB0cmFucyA6IElUcmFuc3BvcnQ7CitiZWdpbgorICB0cmFucyA6PSBUU29ja2V0SW1wbC5DcmVhdGUoICdsb2NhbGhvc3QnLCA5MDkwKTsKKyAgdHJhbnMgOj0gVEZyYW1lZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCB0cmFucyk7CisgIHRyYW5zLk9wZW47CisgIEZQcm90b2NvbCA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLkNyZWF0ZSggdHJhbnMsIFRSVUUsIFRSVUUpOworZW5kOworCisKK3Byb2NlZHVyZSBUVGVzdENsaWVudC5SdW47Cit2YXIgYmVuY2ggOiBUQmVuY2htYXJrU2VydmljZS5JZmFjZTsKKyAgICBhZ2dyICA6IFRBZ2dyLklmYWNlOworICAgIG11bHRpcGxleCA6IElQcm90b2NvbDsKKyAgICBpICAgICAgICAgOiBJbnRlZ2VyOworYmVnaW4KKyAgdHJ5CisgICAgbXVsdGlwbGV4IDo9IFRNdWx0aXBsZXhlZFByb3RvY29sLkNyZWF0ZSggRlByb3RvY29sLCBOQU1FX0JFTkNITUFSS1NFUlZJQ0UpOworICAgIGJlbmNoICAgICA6PSBUQmVuY2htYXJrU2VydmljZS5UQ2xpZW50LkNyZWF0ZSggbXVsdGlwbGV4KTsKKworICAgIG11bHRpcGxleCA6PSBUTXVsdGlwbGV4ZWRQcm90b2NvbC5DcmVhdGUoIEZQcm90b2NvbCwgTkFNRV9BR0dSKTsKKyAgICBhZ2dyICAgICAgOj0gVEFnZ3IuVENsaWVudC5DcmVhdGUoIG11bHRpcGxleCk7CisKKyAgICBmb3IgaSA6PSAxIHRvIDEwCisgICAgZG8gYWdnci5hZGRWYWx1ZSggYmVuY2guZmlib25hY2NpKGkpKTsKKworICAgIGZvciBpIGluIGFnZ3IuZ2V0VmFsdWVzCisgICAgZG8gV3JpdGUoSW50VG9TdHIoaSkrJyAnKTsKKyAgICBXcml0ZUxuOworICBleGNlcHQKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBXcml0ZWxuKCMxMCtlLk1lc3NhZ2UpOworICBlbmQ7CitlbmQ7CisKKworZW5kLgorCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguU2VydmVyLk1haW4ucGFzIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5TZXJ2ZXIuTWFpbi5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg2MGY1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguU2VydmVyLk1haW4ucGFzCkBAIC0wLDAgKzEsMjAxIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgTXVsdGlwbGV4LlNlcnZlci5NYWluOworCit7JFdBUk4gU1lNQk9MX1BMQVRGT1JNIE9GRn0KKworey4kREVGSU5FIFJ1bkVuZGxlc3N9ICAgLy8gYWN0aXZhdGUgdG8gaW50ZXJhY3RpdmVseSBzdHJlc3MtdGVzdCB0aGUgc2VydmVyIHN0b3Agcm91dGluZXMgdmlhIEN0cmwrQworCitpbnRlcmZhY2UKKwordXNlcworICBXaW5kb3dzLCBTeXNVdGlscywKKyAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCisgIFRocmlmdC5TZXJ2ZXIsCisgIFRocmlmdC5UcmFuc3BvcnQsCisgIFRocmlmdC5UcmFuc3BvcnQuUGlwZXMsCisgIFRocmlmdC5Qcm90b2NvbCwKKyAgVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleCwKKyAgVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXgsCisgIFRocmlmdC5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0LlV0aWxzLAorICBUaHJpZnQsCisgIEJlbmNobWFyaywgIC8vIGluIGdlbi1kZWxwaGkgZm9sZGVyCisgIEFnZ3IsICAgICAgIC8vIGluIGdlbi1kZWxwaGkgZm9sZGVyCisgIE11bHRpcGxleC5UZXN0LkNvbW1vbiwKKyAgQ29uc29sZUhlbHBlciwKKyAgQ29udG5yczsKKwordHlwZQorICBUVGVzdFNlcnZlciA9IGNsYXNzCisgIHB1YmxpYyB0eXBlCisgICAgSVRlc3RIYW5kbGVyID0gaW50ZXJmYWNlCisgICAgICBbJ3tDQUUwOUFBQi04MEZCLTQ4RTktQjNBOC03RjlCOTZGNTQxOUF9J10KKyAgICAgIHByb2NlZHVyZSBTZXRTZXJ2ZXIoIGNvbnN0IEFTZXJ2ZXIgOiBJU2VydmVyICk7CisgICAgZW5kOworCisgIHByb3RlY3RlZCB0eXBlCisgICAgVFRlc3RIYW5kbGVySW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVRlc3RIYW5kbGVyKQorICAgIHByaXZhdGUKKyAgICAgIEZTZXJ2ZXIgOiBJU2VydmVyOworICAgIHByb3RlY3RlZAorICAgICAgLy8gSVRlc3RIYW5kbGVyCisgICAgICBwcm9jZWR1cmUgU2V0U2VydmVyKCBjb25zdCBBU2VydmVyIDogSVNlcnZlciApOworCisgICAgICBwcm9wZXJ0eSBTZXJ2ZXIgOiBJU2VydmVyIHJlYWQgRlNlcnZlciB3cml0ZSBTZXRTZXJ2ZXI7CisgICAgZW5kOworCisgICAgVEJlbmNobWFya1NlcnZpY2VJbXBsID0gY2xhc3MoIFRUZXN0SGFuZGxlckltcGwsIFRCZW5jaG1hcmtTZXJ2aWNlLklmYWNlKQorICAgIHByb3RlY3RlZAorICAgICAgLy8gVEJlbmNobWFya1NlcnZpY2UuSWZhY2UKKyAgICAgIGZ1bmN0aW9uIGZpYm9uYWNjaShuOiBTaG9ydEludCk6IEludGVnZXI7CisgICAgZW5kOworCisKKyAgICBUQWdnckltcGwgPSBjbGFzcyggVFRlc3RIYW5kbGVySW1wbCwgVEFnZ3IuSWZhY2UpCisgICAgcHJvdGVjdGVkCisgICAgICBGTGlzdCA6IElUaHJpZnRMaXN0PEludGVnZXI+OworCisgICAgICAvLyBUQWdnci5JZmFjZQorICAgICAgcHJvY2VkdXJlIGFkZFZhbHVlKHZhbHVlOiBJbnRlZ2VyKTsKKyAgICAgIGZ1bmN0aW9uIGdldFZhbHVlcygpOiBJVGhyaWZ0TGlzdDxJbnRlZ2VyPjsKKyAgICBwdWJsaWMKKyAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgICAgIGRlc3RydWN0b3IgRGVzdHJveTsgIG92ZXJyaWRlOworICAgIGVuZDsKKworICBwdWJsaWMKKyAgICBjbGFzcyBwcm9jZWR1cmUgRXhlY3V0ZSggY29uc3QgYXJnczogYXJyYXkgb2Ygc3RyaW5nKTsKKyAgZW5kOworCisKK2ltcGxlbWVudGF0aW9uCisKKworeyBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsIH0KKworcHJvY2VkdXJlIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwuU2V0U2VydmVyKCBjb25zdCBBU2VydmVyOiBJU2VydmVyKTsKK2JlZ2luCisgIEZTZXJ2ZXIgOj0gQVNlcnZlcjsKK2VuZDsKKworCit7IFRUZXN0U2VydmVyLlRCZW5jaG1hcmtTZXJ2aWNlSW1wbCB9CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRCZW5jaG1hcmtTZXJ2aWNlSW1wbC5maWJvbmFjY2kobjogU2hvcnRJbnQpOiBJbnRlZ2VyOwordmFyIHByZXYsIG5leHQgOiBJbnRlZ2VyOworYmVnaW4KKyAgcHJldiAgIDo9IDA7CisgIHJlc3VsdCA6PSAxOworICB3aGlsZSBuID4gMCBkbyBiZWdpbgorICAgIG5leHQgICA6PSByZXN1bHQgKyBwcmV2OworICAgIHByZXYgICA6PSByZXN1bHQ7CisgICAgcmVzdWx0IDo9IG5leHQ7CisgICAgRGVjKG4pOworICBlbmQ7CitlbmQ7CisKK3sgVFRlc3RTZXJ2ZXIuVEFnZ3JJbXBsIH0KKworY29uc3RydWN0b3IgVFRlc3RTZXJ2ZXIuVEFnZ3JJbXBsLkNyZWF0ZTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZMaXN0IDo9IFRUaHJpZnRMaXN0SW1wbDxJbnRlZ2VyPi5DcmVhdGU7CitlbmQ7CisKKworZGVzdHJ1Y3RvciBUVGVzdFNlcnZlci5UQWdnckltcGwuRGVzdHJveTsKK2JlZ2luCisgIHRyeQorICAgIEZyZWVBbmROaWwoIEZMaXN0KTsKKyAgZmluYWxseQorICAgIGluaGVyaXRlZCBEZXN0cm95OworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRUZXN0U2VydmVyLlRBZ2dySW1wbC5hZGRWYWx1ZSh2YWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGTGlzdC5BZGQoIHZhbHVlKTsKK2VuZDsKKworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UQWdnckltcGwuZ2V0VmFsdWVzKCk6IElUaHJpZnRMaXN0PEludGVnZXI+OworYmVnaW4KKyAgcmVzdWx0IDo9IEZMaXN0OworZW5kOworCisKK3sgVFRlc3RTZXJ2ZXIgfQorCitjbGFzcyBwcm9jZWR1cmUgVFRlc3RTZXJ2ZXIuRXhlY3V0ZSggY29uc3QgYXJnczogYXJyYXkgb2Ygc3RyaW5nKTsKK3ZhcgorICBUcmFuc3BvcnRGYWN0b3J5IDogSVRyYW5zcG9ydEZhY3Rvcnk7CisgIFByb3RvY29sRmFjdG9yeSAgOiBJUHJvdG9jb2xGYWN0b3J5OworICBTZXJ2ZXJUcmFucyAgICAgIDogSVNlcnZlclRyYW5zcG9ydDsKKyAgYmVuY2hIYW5kbGVyICAgICA6IFRCZW5jaG1hcmtTZXJ2aWNlLklmYWNlOworICBhZ2dySGFuZGxlciAgICAgIDogVEFnZ3IuSWZhY2U7CisgIGJlbmNoUHJvY2Vzc29yICAgOiBJUHJvY2Vzc29yOworICBhZ2dyUHJvY2Vzc29yICAgIDogSVByb2Nlc3NvcjsKKyAgbXVsdGlwbGV4ICAgICAgICA6IElNdWx0aXBsZXhlZFByb2Nlc3NvcjsKKyAgU2VydmVyRW5naW5lICAgICA6IElTZXJ2ZXI7CitiZWdpbgorICB0cnkKKyAgICAvLyBjcmVhdGUgcHJvdG9jb2wgZmFjdG9yeSwgZGVmYXVsdCB0byBCaW5hcnlQcm90b2NvbAorICAgIFByb3RvY29sRmFjdG9yeSAgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGUoIFRSVUUsIFRSVUUpOworICAgIHNlcnZlcnRyYW5zICAgICAgOj0gVFNlcnZlclNvY2tldEltcGwuQ3JlYXRlKCA5MDkwLCAwLCBGQUxTRSk7CisgICAgVHJhbnNwb3J0RmFjdG9yeSA6PSBURnJhbWVkVHJhbnNwb3J0SW1wbC5URmFjdG9yeS5DcmVhdGU7CisKKyAgICBiZW5jaEhhbmRsZXIgICAgIDo9IFRCZW5jaG1hcmtTZXJ2aWNlSW1wbC5DcmVhdGU7CisgICAgYmVuY2hQcm9jZXNzb3IgICA6PSBUQmVuY2htYXJrU2VydmljZS5UUHJvY2Vzc29ySW1wbC5DcmVhdGUoIGJlbmNoSGFuZGxlcik7CisKKyAgICBhZ2dySGFuZGxlciAgICAgIDo9IFRBZ2dySW1wbC5DcmVhdGU7CisgICAgYWdnclByb2Nlc3NvciAgICA6PSBUQWdnci5UUHJvY2Vzc29ySW1wbC5DcmVhdGUoIGFnZ3JIYW5kbGVyKTsKKworICAgIG11bHRpcGxleCAgICAgICAgOj0gVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5DcmVhdGU7CisgICAgbXVsdGlwbGV4LlJlZ2lzdGVyUHJvY2Vzc29yKCBOQU1FX0JFTkNITUFSS1NFUlZJQ0UsIGJlbmNoUHJvY2Vzc29yKTsKKyAgICBtdWx0aXBsZXguUmVnaXN0ZXJQcm9jZXNzb3IoIE5BTUVfQUdHUiwgIGFnZ3JQcm9jZXNzb3IpOworCisgICAgU2VydmVyRW5naW5lIDo9IFRTaW1wbGVTZXJ2ZXIuQ3JlYXRlKCBtdWx0aXBsZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJUcmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbEZhY3RvcnkpOworCisgICAgKGJlbmNoSGFuZGxlciBhcyBJVGVzdEhhbmRsZXIpLlNldFNlcnZlciggU2VydmVyRW5naW5lKTsKKyAgICAoYWdnckhhbmRsZXIgYXMgSVRlc3RIYW5kbGVyKS5TZXRTZXJ2ZXIoIFNlcnZlckVuZ2luZSk7CisKKyAgICBDb25zb2xlLldyaXRlTGluZSgnU3RhcnRpbmcgdGhlIHNlcnZlciAuLi4nKTsKKyAgICBTZXJ2ZXJFbmdpbmUuc2VydmUoKTsKKworICAgIChiZW5jaEhhbmRsZXIgYXMgSVRlc3RIYW5kbGVyKS5TZXRTZXJ2ZXIoIG5pbCk7CisgICAgKGFnZ3JIYW5kbGVyIGFzIElUZXN0SGFuZGxlcikuU2V0U2VydmVyKCBuaWwpOworCisgIGV4Y2VwdAorICAgIG9uIEU6IEV4Y2VwdGlvbiBkbworICAgIGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlKCBFLk1lc3NhZ2UpOworICAgIGVuZDsKKyAgZW5kOworICBDb25zb2xlLldyaXRlTGluZSggJ2RvbmUuJyk7CitlbmQ7CisKKworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmRwciBiL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguVGVzdC5DbGllbnQuZHByCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNzhkOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmRwcgpAQCAtMCwwICsxLDY3IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKKworcHJvZ3JhbSBNdWx0aXBsZXguVGVzdC5DbGllbnQ7CisKK3skQVBQVFlQRSBDT05TT0xFfQorCit1c2VzCisgIFN5c1V0aWxzLAorICBNdWx0aXBsZXguQ2xpZW50Lk1haW4gaW4gJ011bHRpcGxleC5DbGllbnQuTWFpbi5wYXMnLAorICBUaHJpZnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQucGFzJywKKyAgVGhyaWZ0LlNvY2tldCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Tb2NrZXQucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cLi5cc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKKyAgVGhyaWZ0LlRyYW5zcG9ydCBpbiAnLi5cLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzJywKKyAgVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcyBpbiAnLi5cLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQuUGlwZXMucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXggaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcycsCisgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAorICBUaHJpZnQuU2VydmVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAorICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnLAorICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlwuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAorICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJzsKKwordmFyCisgIG5QYXJhbUNvdW50IDogSW50ZWdlcjsKKyAgYXJncyA6IGFycmF5IG9mIHN0cmluZzsKKyAgaSA6IEludGVnZXI7CisgIGFyZyA6IHN0cmluZzsKKyAgcyA6IHN0cmluZzsKKworYmVnaW4KKyAgdHJ5CisgICAgV3JpdGVsbiggJ011bHRpcGxleCBUZXN0Q2xpZW50ICcrVGhyaWZ0LlZlcnNpb24pOworICAgIG5QYXJhbUNvdW50IDo9IFBhcmFtQ291bnQ7CisgICAgU2V0TGVuZ3RoKCBhcmdzLCBuUGFyYW1Db3VudCk7CisgICAgZm9yIGkgOj0gMSB0byBuUGFyYW1Db3VudCBkbworICAgIGJlZ2luCisgICAgICBhcmcgOj0gUGFyYW1TdHIoIGkgKTsKKyAgICAgIGFyZ3NbaS0xXSA6PSBhcmc7CisgICAgZW5kOworICAgIFRUZXN0Q2xpZW50LkV4ZWN1dGUoIGFyZ3MgKTsKKyAgICBSZWFkbG47CisgIGV4Y2VwdAorICAgIG9uIEU6IEV4Y2VwdGlvbiBkbyBiZWdpbgorICAgICAgV3JpdGVsbihFLkNsYXNzTmFtZSwgJzogJywgRS5NZXNzYWdlKTsKKyAgICAgIEV4aXRDb2RlIDo9ICRGRkZGOworICAgIGVuZDsKKyAgZW5kOworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuQ29tbW9uLnBhcyBiL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguVGVzdC5Db21tb24ucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYWYwODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuQ29tbW9uLnBhcwpAQCAtMCwwICsxLDM1IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgTXVsdGlwbGV4LlRlc3QuQ29tbW9uOworCitpbnRlcmZhY2UKKworY29uc3QKKyAgTkFNRV9CRU5DSE1BUktTRVJWSUNFID0gJ0JlbmNobWFya1NlcnZpY2UnOworICBOQU1FX0FHR1IgICAgICAgICAgICAgPSAnQWdncic7CisKKworaW1wbGVtZW50YXRpb24KKworLy8gbml4CisKK2VuZC4KKworCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmRwciBiL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguVGVzdC5TZXJ2ZXIuZHByCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMDQ2MmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmRwcgpAQCAtMCwwICsxLDY4IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3Byb2dyYW0gTXVsdGlwbGV4LlRlc3QuU2VydmVyOworCit7JEFQUFRZUEUgQ09OU09MRX0KKwordXNlcworICBTeXNVdGlscywKKyAgTXVsdGlwbGV4LlNlcnZlci5NYWluIGluICdNdWx0aXBsZXguU2VydmVyLk1haW4ucGFzJywKKyAgQ29uc29sZUhlbHBlciBpbiAnLi5cQ29uc29sZUhlbHBlci5wYXMnLAorICBUaHJpZnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cLi5cc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKKyAgVGhyaWZ0LlNvY2tldCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Tb2NrZXQucGFzJywKKyAgVGhyaWZ0LlRyYW5zcG9ydCBpbiAnLi5cLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzJywKKyAgVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcyBpbiAnLi5cLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQuUGlwZXMucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXggaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcycsCisgIFRocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4IGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXgucGFzJywKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlwuLlxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCisgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCisgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnLAorICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlwuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAorICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnOworCit2YXIKKyAgblBhcmFtQ291bnQgOiBJbnRlZ2VyOworICBhcmdzIDogYXJyYXkgb2Ygc3RyaW5nOworICBpIDogSW50ZWdlcjsKKyAgYXJnIDogc3RyaW5nOworICBzIDogc3RyaW5nOworCitiZWdpbgorICB0cnkKKyAgICBXcml0ZWxuKCAnTXVsdGlwbGV4IFRlc3RTZXJ2ZXIgJytUaHJpZnQuVmVyc2lvbik7CisgICAgblBhcmFtQ291bnQgOj0gUGFyYW1Db3VudDsKKyAgICBTZXRMZW5ndGgoIGFyZ3MsIG5QYXJhbUNvdW50KTsKKyAgICBmb3IgaSA6PSAxIHRvIG5QYXJhbUNvdW50IGRvCisgICAgYmVnaW4KKyAgICAgIGFyZyA6PSBQYXJhbVN0ciggaSApOworICAgICAgYXJnc1tpLTFdIDo9IGFyZzsKKyAgICBlbmQ7CisgICAgVFRlc3RTZXJ2ZXIuRXhlY3V0ZSggYXJncyApOworICAgIFdyaXRlbG4oJ1ByZXNzIEVOVEVSIHRvIGNsb3NlIC4uLiAnKTsgUmVhZGxuOworICBleGNlcHQKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8KKyAgICAgIFdyaXRlbG4oRS5DbGFzc05hbWUsICc6ICcsIEUuTWVzc2FnZSk7CisgIGVuZDsKK2VuZC4KKworCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyL1Rlc3RTZXJpYWxpemVyLkRhdGEucGFzIGIvbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvVGVzdFNlcmlhbGl6ZXIuRGF0YS5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjMDA3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyL1Rlc3RTZXJpYWxpemVyLkRhdGEucGFzCkBAIC0wLDAgKzEsMzUwIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGVzdFNlcmlhbGl6ZXIuRGF0YTsKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgU3lzVXRpbHMsCisgIFRocmlmdC5Db2xsZWN0aW9ucywKKyAgRGVidWdQcm90b1Rlc3Q7CisKKwordHlwZQorICBGaXh0dXJlcyA9IGNsYXNzCisgIHB1YmxpYworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZU9uZU9mRWFjaCA6IElPbmVPZkVhY2g7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlTmVzdGluZyA6IElOZXN0aW5nOworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZUhvbHlNb2xleSA6IElIb2x5TW9sZXk7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlQ29tcGFjdFByb3RvVGVzdFN0cnVjdCA6IElDb21wYWN0UHJvdG9UZXN0U3RydWN0OworCisgIC8vIFRoZXNlIGJ5dGUgYXJyYXlzIGFyZSBzZXJpYWxpemVkIHZlcnNpb25zIG9mIHRoZSBhYm92ZSBzdHJ1Y3RzLgorICAvLyBUaGV5IHdlcmUgc2VyaWFsaXplZCBpbiBiaW5hcnkgcHJvdG9jb2wgdXNpbmcgdGhyaWZ0IDAuNi54IGFuZCBhcmUgdXNlZCB0bworICAvLyB0ZXN0IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggcmVzcGVjdCB0byB0aGUgc3RhbmRhcmQgc2NoZW1lLgorICAoKgorICAgICAgICAgIGFsbCBkYXRhIGNvcGllZCBmcm9tIEpBVkEgdmVyc2lvbiwKKyAgICAgICAgICB0byBiZSB1c2VkIGxhdGVyCisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gcGVyc2lzdGVudEJ5dGVzT25lT2ZFYWNoID0gbmV3IGJ5dGVbXSB7CisgICAgJDAyLCAkMDAsICQwMSwgJDAxLCAkMDIsICQwMCwgJDAyLCAkMDAsICQwMywgJDAwLAorICAgICQwMywgJEQ2LCAkMDYsICQwMCwgJDA0LCAkNjksICQ3OCwgJDA4LCAkMDAsICQwNSwKKyAgICAkMDEsICQwMCwgJDAwLCAkMDAsICQwQSwgJDAwLCAkMDYsICQwMCwgJDAwLCAkMDAsCisgICAgJDAxLCAkNjUsICRBMCwgJEJDLCAkMDAsICQwNCwgJDAwLCAkMDcsICQ0MCwgJDA5LAorICAgICQyMSwgJEZCLCAkNTQsICQ0NCwgJDJELCAkMTgsICQwQiwgJDAwLCAkMDgsICQwMCwKKyAgICAkMDAsICQwMCwgJDBELCAkNEEsICQ1MywgJDRGLCAkNEUsICQyMCwgJDU0LCAkNDgsCisgICAgJDQ5LCAkNTMsICQyMSwgJDIwLCAkMjIsICQwMSwgJDBCLCAkMDAsICQwOSwgJDAwLAorICAgICQwMCwgJDAwLCAkMkUsICREMywgJDgwLCAkRTIsICQ4NSwgJEFFLCAkQ0UsICQ5RCwKKyAgICAkMjAsICREMCwgJDlELCAkQ0UsICRCRiwgJEUyLCAkODUsICRCRiwgJEQwLCAkQkUsCisgICAgJEM5LCAkQTEsICREMCwgJEIzLCAkRDAsICRCMCwgJENGLCAkODEsICRFMiwgJDg0LAorICAgICQ4RSwgJDIwLCAkQ0UsICQ5MSwgJDc0LCAkNzQsICRDRSwgJEIxLCAkRTIsICQ4NSwKKyAgICAkQkQsICRDRSwgJEJBLCAkRUYsICRCRiwgJEJELCAkRTIsICQ4MCwgJEJDLCAkMDIsCisgICAgJDAwLCAkMEEsICQwMCwgJDBCLCAkMDAsICQwQiwgJDAwLCAkMDAsICQwMCwgJDA2LAorICAgICQ2MiwgJDYxLCAkNzMsICQ2NSwgJDM2LCAkMzQsICQwRiwgJDAwLCAkMEMsICQwMywKKyAgICAkMDAsICQwMCwgJDAwLCAkMDMsICQwMSwgJDAyLCAkMDMsICQwRiwgJDAwLCAkMEQsCisgICAgJDA2LCAkMDAsICQwMCwgJDAwLCAkMDMsICQwMCwgJDAxLCAkMDAsICQwMiwgJDAwLAorICAgICQwMywgJDBGLCAkMDAsICQwRSwgJDBBLCAkMDAsICQwMCwgJDAwLCAkMDMsICQwMCwKKyAgICAkMDAsICQwMCwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDEsICQwMCwgJDAwLCAkMDAsCisgICAgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDIsICQwMCwgJDAwLCAkMDAsICQwMCwgJDAwLAorICAgICQwMCwgJDAwLCAkMDMsICQwMCB9OworCisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gcGVyc2lzdGVudEJ5dGVzTmVzdGluZyA9IG5ldyBieXRlW10geworICAgICQwQywgJDAwLCAkMDEsICQwOCwgJDAwLCAkMDEsICQwMCwgJDAwLCAkN0EsICQ2OSwKKyAgICAkMEIsICQwMCwgJDAyLCAkMDAsICQwMCwgJDAwLCAkMTMsICQ0OSwgJDIwLCAkNjEsCisgICAgJDZELCAkMjAsICQ2MSwgJDIwLCAkNjIsICQ2RiwgJDZFLCAkNkIsICQyRSwgJDJFLAorICAgICQyRSwgJDIwLCAkNzgsICQ2RiwgJDcyLCAkMjEsICQwMCwgJDBDLCAkMDAsICQwMiwKKyAgICAkMDIsICQwMCwgJDAxLCAkMDEsICQwMiwgJDAwLCAkMDIsICQwMCwgJDAzLCAkMDAsCisgICAgJDAzLCAkRDYsICQwNiwgJDAwLCAkMDQsICQ2OSwgJDc4LCAkMDgsICQwMCwgJDA1LAorICAgICQwMSwgJDAwLCAkMDAsICQwMCwgJDBBLCAkMDAsICQwNiwgJDAwLCAkMDAsICQwMCwKKyAgICAkMDEsICQ2NSwgJEEwLCAkQkMsICQwMCwgJDA0LCAkMDAsICQwNywgJDQwLCAkMDksCisgICAgJDIxLCAkRkIsICQ1NCwgJDQ0LCAkMkQsICQxOCwgJDBCLCAkMDAsICQwOCwgJDAwLAorICAgICQwMCwgJDAwLCAkMEQsICQ0QSwgJDUzLCAkNEYsICQ0RSwgJDIwLCAkNTQsICQ0OCwKKyAgICAkNDksICQ1MywgJDIxLCAkMjAsICQyMiwgJDAxLCAkMEIsICQwMCwgJDA5LCAkMDAsCisgICAgJDAwLCAkMDAsICQyRSwgJEQzLCAkODAsICRFMiwgJDg1LCAkQUUsICRDRSwgJDlELAorICAgICQyMCwgJEQwLCAkOUQsICRDRSwgJEJGLCAkRTIsICQ4NSwgJEJGLCAkRDAsICRCRSwKKyAgICAkQzksICRBMSwgJEQwLCAkQjMsICREMCwgJEIwLCAkQ0YsICQ4MSwgJEUyLCAkODQsCisgICAgJDhFLCAkMjAsICRDRSwgJDkxLCAkNzQsICQ3NCwgJENFLCAkQjEsICRFMiwgJDg1LAorICAgICRCRCwgJENFLCAkQkEsICRFRiwgJEJGLCAkQkQsICRFMiwgJDgwLCAkQkMsICQwMiwKKyAgICAkMDAsICQwQSwgJDAwLCAkMEIsICQwMCwgJDBCLCAkMDAsICQwMCwgJDAwLCAkMDYsCisgICAgJDYyLCAkNjEsICQ3MywgJDY1LCAkMzYsICQzNCwgJDBGLCAkMDAsICQwQywgJDAzLAorICAgICQwMCwgJDAwLCAkMDAsICQwMywgJDAxLCAkMDIsICQwMywgJDBGLCAkMDAsICQwRCwKKyAgICAkMDYsICQwMCwgJDAwLCAkMDAsICQwMywgJDAwLCAkMDEsICQwMCwgJDAyLCAkMDAsCisgICAgJDAzLCAkMEYsICQwMCwgJDBFLCAkMEEsICQwMCwgJDAwLCAkMDAsICQwMywgJDAwLAorICAgICQwMCwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwMSwgJDAwLCAkMDAsICQwMCwKKyAgICAkMDAsICQwMCwgJDAwLCAkMDAsICQwMiwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDAsCisgICAgJDAwLCAkMDAsICQwMywgJDAwLCAkMDAgfTsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBwZXJzaXN0ZW50Qnl0ZXNIb2x5TW9sZXkgPSBuZXcgYnl0ZVtdIHsKKyAgICAkMEYsICQwMCwgJDAxLCAkMEMsICQwMCwgJDAwLCAkMDAsICQwMiwgJDAyLCAkMDAsCisgICAgJDAxLCAkMDEsICQwMiwgJDAwLCAkMDIsICQwMCwgJDAzLCAkMDAsICQwMywgJDIzLAorICAgICQwNiwgJDAwLCAkMDQsICQ2OSwgJDc4LCAkMDgsICQwMCwgJDA1LCAkMDEsICQwMCwKKyAgICAkMDAsICQwMCwgJDBBLCAkMDAsICQwNiwgJDAwLCAkMDAsICQwMCwgJDAxLCAkNjUsCisgICAgJEEwLCAkQkMsICQwMCwgJDA0LCAkMDAsICQwNywgJDQwLCAkMDksICQyMSwgJEZCLAorICAgICQ1NCwgJDQ0LCAkMkQsICQxOCwgJDBCLCAkMDAsICQwOCwgJDAwLCAkMDAsICQwMCwKKyAgICAkMEQsICQ0QSwgJDUzLCAkNEYsICQ0RSwgJDIwLCAkNTQsICQ0OCwgJDQ5LCAkNTMsCisgICAgJDIxLCAkMjAsICQyMiwgJDAxLCAkMEIsICQwMCwgJDA5LCAkMDAsICQwMCwgJDAwLAorICAgICQyRSwgJEQzLCAkODAsICRFMiwgJDg1LCAkQUUsICRDRSwgJDlELCAkMjAsICREMCwKKyAgICAkOUQsICRDRSwgJEJGLCAkRTIsICQ4NSwgJEJGLCAkRDAsICRCRSwgJEM5LCAkQTEsCisgICAgJEQwLCAkQjMsICREMCwgJEIwLCAkQ0YsICQ4MSwgJEUyLCAkODQsICQ4RSwgJDIwLAorICAgICRDRSwgJDkxLCAkNzQsICQ3NCwgJENFLCAkQjEsICRFMiwgJDg1LCAkQkQsICRDRSwKKyAgICAkQkEsICRFRiwgJEJGLCAkQkQsICRFMiwgJDgwLCAkQkMsICQwMiwgJDAwLCAkMEEsCisgICAgJDAwLCAkMEIsICQwMCwgJDBCLCAkMDAsICQwMCwgJDAwLCAkMDYsICQ2MiwgJDYxLAorICAgICQ3MywgJDY1LCAkMzYsICQzNCwgJDBGLCAkMDAsICQwQywgJDAzLCAkMDAsICQwMCwKKyAgICAkMDAsICQwMywgJDAxLCAkMDIsICQwMywgJDBGLCAkMDAsICQwRCwgJDA2LCAkMDAsCisgICAgJDAwLCAkMDAsICQwMywgJDAwLCAkMDEsICQwMCwgJDAyLCAkMDAsICQwMywgJDBGLAorICAgICQwMCwgJDBFLCAkMEEsICQwMCwgJDAwLCAkMDAsICQwMywgJDAwLCAkMDAsICQwMCwKKyAgICAkMDAsICQwMCwgJDAwLCAkMDAsICQwMSwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDAsCisgICAgJDAwLCAkMDAsICQwMiwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwMCwgJDAwLAorICAgICQwMywgJDAwLCAkMDIsICQwMCwgJDAxLCAkMDEsICQwMiwgJDAwLCAkMDIsICQwMCwKKyAgICAkMDMsICQwMCwgJDAzLCAkRDYsICQwNiwgJDAwLCAkMDQsICQ2OSwgJDc4LCAkMDgsCisgICAgJDAwLCAkMDUsICQwMSwgJDAwLCAkMDAsICQwMCwgJDBBLCAkMDAsICQwNiwgJDAwLAorICAgICQwMCwgJDAwLCAkMDEsICQ2NSwgJEEwLCAkQkMsICQwMCwgJDA0LCAkMDAsICQwNywKKyAgICAkNDAsICQwOSwgJDIxLCAkRkIsICQ1NCwgJDQ0LCAkMkQsICQxOCwgJDBCLCAkMDAsCisgICAgJDA4LCAkMDAsICQwMCwgJDAwLCAkMEQsICQ0QSwgJDUzLCAkNEYsICQ0RSwgJDIwLAorICAgICQ1NCwgJDQ4LCAkNDksICQ1MywgJDIxLCAkMjAsICQyMiwgJDAxLCAkMEIsICQwMCwKKyAgICAkMDksICQwMCwgJDAwLCAkMDAsICQyRSwgJEQzLCAkODAsICRFMiwgJDg1LCAkQUUsCisgICAgJENFLCAkOUQsICQyMCwgJEQwLCAkOUQsICRDRSwgJEJGLCAkRTIsICQ4NSwgJEJGLAorICAgICREMCwgJEJFLCAkQzksICRBMSwgJEQwLCAkQjMsICREMCwgJEIwLCAkQ0YsICQ4MSwKKyAgICAkRTIsICQ4NCwgJDhFLCAkMjAsICRDRSwgJDkxLCAkNzQsICQ3NCwgJENFLCAkQjEsCisgICAgJEUyLCAkODUsICRCRCwgJENFLCAkQkEsICRFRiwgJEJGLCAkQkQsICRFMiwgJDgwLAorICAgICRCQywgJDAyLCAkMDAsICQwQSwgJDAwLCAkMEIsICQwMCwgJDBCLCAkMDAsICQwMCwKKyAgICAkMDAsICQwNiwgJDYyLCAkNjEsICQ3MywgJDY1LCAkMzYsICQzNCwgJDBGLCAkMDAsCisgICAgJDBDLCAkMDMsICQwMCwgJDAwLCAkMDAsICQwMywgJDAxLCAkMDIsICQwMywgJDBGLAorICAgICQwMCwgJDBELCAkMDYsICQwMCwgJDAwLCAkMDAsICQwMywgJDAwLCAkMDEsICQwMCwKKyAgICAkMDIsICQwMCwgJDAzLCAkMEYsICQwMCwgJDBFLCAkMEEsICQwMCwgJDAwLCAkMDAsCisgICAgJDAzLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwMSwgJDAwLAorICAgICQwMCwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwMiwgJDAwLCAkMDAsICQwMCwKKyAgICAkMDAsICQwMCwgJDAwLCAkMDAsICQwMywgJDAwLCAkMEUsICQwMCwgJDAyLCAkMEYsCisgICAgJDAwLCAkMDAsICQwMCwgJDAzLCAkMEIsICQwMCwgJDAwLCAkMDAsICQwMCwgJDBCLAorICAgICQwMCwgJDAwLCAkMDAsICQwMywgJDAwLCAkMDAsICQwMCwgJDBGLCAkNzQsICQ2OCwKKyAgICAkNjUsICQ2RSwgJDIwLCAkNjEsICQyMCwgJDZGLCAkNkUsICQ2NSwgJDJDLCAkMjAsCisgICAgJDc0LCAkNzcsICQ2RiwgJDAwLCAkMDAsICQwMCwgJDA2LCAkNzQsICQ2OCwgJDcyLAorICAgICQ2NSwgJDY1LCAkMjEsICQwMCwgJDAwLCAkMDAsICQwNiwgJDQ2LCAkNEYsICQ1NSwKKyAgICAkNTIsICQyMSwgJDIxLCAkMEIsICQwMCwgJDAwLCAkMDAsICQwMiwgJDAwLCAkMDAsCisgICAgJDAwLCAkMDksICQ2MSwgJDZFLCAkNjQsICQyMCwgJDYxLCAkMjAsICQ2RiwgJDZFLAorICAgICQ2NSwgJDAwLCAkMDAsICQwMCwgJDA5LCAkNjEsICQ2RSwgJDY0LCAkMjAsICQ2MSwKKyAgICAkMjAsICQ3NCwgJDc3LCAkNkYsICQwRCwgJDAwLCAkMDMsICQwQiwgJDBGLCAkMDAsCisgICAgJDAwLCAkMDAsICQwMywgJDAwLCAkMDAsICQwMCwgJDAzLCAkNzQsICQ3NywgJDZGLAorICAgICQwQywgJDAwLCAkMDAsICQwMCwgJDAyLCAkMDgsICQwMCwgJDAxLCAkMDAsICQwMCwKKyAgICAkMDAsICQwMSwgJDBCLCAkMDAsICQwMiwgJDAwLCAkMDAsICQwMCwgJDA1LCAkNTcsCisgICAgJDYxLCAkNjksICQ3NCwgJDJFLCAkMDAsICQwOCwgJDAwLCAkMDEsICQwMCwgJDAwLAorICAgICQwMCwgJDAyLCAkMEIsICQwMCwgJDAyLCAkMDAsICQwMCwgJDAwLCAkMDUsICQ1NywKKyAgICAkNjgsICQ2MSwgJDc0LCAkM0YsICQwMCwgJDAwLCAkMDAsICQwMCwgJDA1LCAkNzQsCisgICAgJDY4LCAkNzIsICQ2NSwgJDY1LCAkMEMsICQwMCwgJDAwLCAkMDAsICQwMCwgJDAwLAorICAgICQwMCwgJDAwLCAkMDQsICQ3QSwgJDY1LCAkNzIsICQ2RiwgJDBDLCAkMDAsICQwMCwKKyAgICAkMDAsICQwMCwgJDAwIH07CisKKworKikKKworICBwcml2YXRlCisgICAgY29uc3QKKyAgICAgIGtVbmljb2RlQnl0ZXMgOiBwYWNrZWQgYXJyYXlbMC4uNDNdIG9mIEJ5dGUKKyAgICAgICAgICAgICAgICAgICAgPSAoICRkMywgJDgwLCAkZTIsICQ4NSwgJGFlLCAkY2UsICQ5ZCwgJDIwLCAkZDAsICQ5ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICRjZSwgJGJmLCAkZTIsICQ4NSwgJGJmLCAkZDAsICRiZSwgJGM5LCAkYTEsICRkMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICRiMywgJGQwLCAkYjAsICRjZiwgJDgxLCAkZTIsICQ4NCwgJDhlLCAkMjAsICRjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICQ5MSwgJDc0LCAkNzQsICRjZSwgJGIxLCAkZTIsICQ4NSwgJGJkLCAkY2UsICRiYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICQ4MywgJGUyLCAkODAsICRiYyk7CisKKyAgZW5kOworCisKK2ltcGxlbWVudGF0aW9uCisKKworY2xhc3MgZnVuY3Rpb24gRml4dHVyZXMuQ3JlYXRlT25lT2ZFYWNoIDogSU9uZU9mRWFjaDsKK3ZhciBkYiA6IERvdWJsZTsKKyAgICB1cyA6IFV0ZjhTdHJpbmc7CitiZWdpbgorICByZXN1bHQgOj0gVE9uZU9mRWFjaEltcGwuQ3JlYXRlOworICByZXN1bHQuc2V0SW1fdHJ1ZSggVFJVRSk7CisgIHJlc3VsdC5zZXRJbV9mYWxzZSggRkFMU0UpOworICByZXN1bHQuc2V0QV9iaXRlKCBTaG9ydEludCgkRDYpKTsKKyAgcmVzdWx0LnNldEludGVnZXIxNiggMjcwMDApOworICByZXN1bHQuc2V0SW50ZWdlcjMyKCAxIHNobCAyNCk7CisgIHJlc3VsdC5zZXRJbnRlZ2VyNjQoIEludDY0KDYwMDApICogSW50NjQoMTAwMCkgKiBJbnQ2NCgxMDAwKSk7CisgIGRiIDo9IFBpOworICByZXN1bHQuc2V0RG91YmxlX3ByZWNpc2lvbiggZGIpOworICByZXN1bHQuc2V0U29tZV9jaGFyYWN0ZXJzKCAnSlNPTiBUSElTISBcIlwxJyk7CisKKyAgLy8gPz8KKyAgU2V0TGVuZ3RoKCB1cywgTGVuZ3RoKGtVbmljb2RlQnl0ZXMpKTsKKyAgTW92ZSgga1VuaWNvZGVCeXRlc1swXSwgdXNbMV0sIExlbmd0aChrVW5pY29kZUJ5dGVzKSk7CisgIC8vID8/CisgIFNldFN0cmluZyggdXMsIFBDaGFyKEBrVW5pY29kZUJ5dGVzWzBdKSwgTGVuZ3RoKGtVbmljb2RlQnl0ZXMpKTsKKyAgLy8gISEKKyAgcmVzdWx0LnNldFpvbWdfdW5pY29kZSggVW5pY29kZVN0cmluZyggdXMpKTsKKworICB7JElGIGNEZWJ1Z1Byb3RvVGVzdF9PcHRpb25fQW5zaVN0cl9CaW5hcnl9CisgIHJlc3VsdC5TZXRCYXNlNjQoJ2Jhc2U2NCcpOworICB7JEVMU0V9CisgIHJlc3VsdC5TZXRCYXNlNjQoIFRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKCdiYXNlNjQnKSk7CisgIHskSUZFTkR9CisKKyAgLy8gYnl0ZSwgaTE2LCBhbmQgaTY0IGxpc3RzIGFyZSBwb3B1bGF0ZWQgYnkgZGVmYXVsdCBjb25zdHJ1Y3RvcgorZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIEZpeHR1cmVzLkNyZWF0ZU5lc3RpbmcgOiBJTmVzdGluZzsKK3ZhciBib25rIDogSUJvbms7CitiZWdpbgorICBib25rIDo9IFRCb25rSW1wbC5DcmVhdGU7CisgIGJvbmsuVHlwZV8gICA6PSAzMTMzNzsKKyAgYm9uay5NZXNzYWdlIDo9ICdJIGFtIGEgYm9uay4uLiB4b3IhJzsKKworICByZXN1bHQgOj0gVE5lc3RpbmdJbXBsLkNyZWF0ZTsKKyAgcmVzdWx0Lk15X2JvbmsgOj0gYm9uazsKKyAgcmVzdWx0Lk15X29vZSA6PSBDcmVhdGVPbmVPZkVhY2g7CitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gRml4dHVyZXMuQ3JlYXRlSG9seU1vbGV5IDogSUhvbHlNb2xleTsKK3ZhciBiaWcgOiBJVGhyaWZ0TGlzdDxJT25lT2ZFYWNoPjsKKyAgICBzdGFnZTEgOiBJVGhyaWZ0TGlzdDxTdHJpbmc+OworICAgIHN0YWdlMiA6IElUaHJpZnRMaXN0PElCb25rPjsKKyAgICBiICAgICAgOiBJQm9uazsKK2JlZ2luCisgIHJlc3VsdCA6PSBUSG9seU1vbGV5SW1wbC5DcmVhdGU7CisKKyAgYmlnIDo9IFRUaHJpZnRMaXN0SW1wbDxJT25lT2ZFYWNoPi5DcmVhdGU7CisgIGJpZy5hZGQoIENyZWF0ZU9uZU9mRWFjaCk7CisgIGJpZy5hZGQoIENyZWF0ZU5lc3RpbmcubXlfb29lKTsKKyAgcmVzdWx0LkJpZyA6PSBiaWc7CisgIHJlc3VsdC5CaWdbMF0uc2V0QV9iaXRlKCAkMjIpOworICByZXN1bHQuQmlnWzBdLnNldEFfYml0ZSggJDIzKTsKKworICByZXN1bHQuQ29udGFpbiA6PSBUSGFzaFNldEltcGw8IElUaHJpZnRMaXN0PHN0cmluZz4+LkNyZWF0ZTsKKyAgc3RhZ2UxIDo9IFRUaHJpZnRMaXN0SW1wbDxTdHJpbmc+LkNyZWF0ZTsKKyAgc3RhZ2UxLmFkZCggJ2FuZCBhIG9uZScpOworICBzdGFnZTEuYWRkKCAnYW5kIGEgdHdvJyk7CisgIHJlc3VsdC5Db250YWluLmFkZCggc3RhZ2UxKTsKKworICBzdGFnZTEgOj0gVFRocmlmdExpc3RJbXBsPFN0cmluZz4uQ3JlYXRlOworICBzdGFnZTEuYWRkKCAndGhlbiBhIG9uZSwgdHdvJyk7CisgIHN0YWdlMS5hZGQoICd0aHJlZSEnKTsKKyAgc3RhZ2UxLmFkZCggJ0ZPVVIhIScpOworICByZXN1bHQuQ29udGFpbi5hZGQoIHN0YWdlMSk7CisKKyAgc3RhZ2UxIDo9IFRUaHJpZnRMaXN0SW1wbDxTdHJpbmc+LkNyZWF0ZTsKKyAgcmVzdWx0LkNvbnRhaW4uYWRkKCBzdGFnZTEpOworCisgIHN0YWdlMiA6PSBUVGhyaWZ0TGlzdEltcGw8SUJvbms+LkNyZWF0ZTsKKyAgcmVzdWx0LkJvbmtzIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDwgU3RyaW5nLCBJVGhyaWZ0TGlzdDwgSUJvbms+Pi5DcmVhdGU7CisgIC8vIG9uZSBlbXB0eQorICByZXN1bHQuQm9ua3MuQWRkKCAnemVybycsIHN0YWdlMik7CisKKyAgLy8gb25lIHdpdGggdHdvCisgIHN0YWdlMiA6PSBUVGhyaWZ0TGlzdEltcGw8SUJvbms+LkNyZWF0ZTsKKyAgYiA6PSBUQm9ua0ltcGwuQ3JlYXRlOworICBiLnR5cGVfIDo9IDE7CisgIGIubWVzc2FnZSA6PSAnV2FpdC4nOworICBzdGFnZTIuQWRkKCBiKTsKKyAgYiA6PSBUQm9ua0ltcGwuQ3JlYXRlOworICBiLnR5cGVfIDo9IDI7CisgIGIubWVzc2FnZSA6PSAnV2hhdD8nOworICBzdGFnZTIuQWRkKCBiKTsKKyAgcmVzdWx0LkJvbmtzLkFkZCggJ3R3bycsIHN0YWdlMik7CisKKyAgLy8gb25lIHdpdGggdGhyZWUKKyAgc3RhZ2UyIDo9IFRUaHJpZnRMaXN0SW1wbDxJQm9uaz4uQ3JlYXRlOworICBiIDo9IFRCb25rSW1wbC5DcmVhdGU7CisgIGIudHlwZV8gOj0gMzsKKyAgYi5tZXNzYWdlIDo9ICdxdW90aCc7CisgIHN0YWdlMi5BZGQoIGIpOworICBiIDo9IFRCb25rSW1wbC5DcmVhdGU7CisgIGIudHlwZV8gOj0gNDsKKyAgYi5tZXNzYWdlIDo9ICd0aGUgcmF2ZW4nOworICBzdGFnZTIuQWRkKCBiKTsKKyAgYiA6PSBUQm9ua0ltcGwuQ3JlYXRlOworICBiLnR5cGVfIDo9IDU7CisgIGIubWVzc2FnZSA6PSAnbmV2ZXJtb3JlJzsKKyAgc3RhZ2UyLkFkZCggYik7CisgIHJlc3VsdC5ib25rcy5BZGQoICd0aHJlZScsIHN0YWdlMik7CitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gRml4dHVyZXMuQ3JlYXRlQ29tcGFjdFByb3RvVGVzdFN0cnVjdCA6IElDb21wYWN0UHJvdG9UZXN0U3RydWN0OworLy8gc3VwZXJodWdlIGNvbXBhY3QgcHJvdG8gdGVzdCBzdHJ1Y3QKK2JlZ2luCisgIHJlc3VsdCA6PSBUQ29tcGFjdFByb3RvVGVzdFN0cnVjdEltcGwuQ3JlYXRlOworICByZXN1bHQuQV9ieXRlIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQV9ieXRlOworICByZXN1bHQuQV9pMTYgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5BX2kxNjsKKyAgcmVzdWx0LkFfaTMyIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQV9pMzI7CisgIHJlc3VsdC5BX2k2NCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkFfaTY0OworICByZXN1bHQuQV9kb3VibGUgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5BX2RvdWJsZTsKKyAgcmVzdWx0LkFfc3RyaW5nIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQV9zdHJpbmc7CisgIHJlc3VsdC5BX2JpbmFyeSA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkFfYmluYXJ5OworICByZXN1bHQuVHJ1ZV9maWVsZCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULlRydWVfZmllbGQ7CisgIHJlc3VsdC5GYWxzZV9maWVsZCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkZhbHNlX2ZpZWxkOworICByZXN1bHQuRW1wdHlfc3RydWN0X2ZpZWxkIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuRW1wdHlfc3RydWN0X2ZpZWxkOworICByZXN1bHQuQnl0ZV9saXN0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9saXN0OworICByZXN1bHQuSTE2X2xpc3QgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5JMTZfbGlzdDsKKyAgcmVzdWx0LkkzMl9saXN0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuSTMyX2xpc3Q7CisgIHJlc3VsdC5JNjRfbGlzdCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkk2NF9saXN0OworICByZXN1bHQuRG91YmxlX2xpc3QgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5Eb3VibGVfbGlzdDsKKyAgcmVzdWx0LlN0cmluZ19saXN0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuU3RyaW5nX2xpc3Q7CisgIHJlc3VsdC5CaW5hcnlfbGlzdCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJpbmFyeV9saXN0OworICByZXN1bHQuQm9vbGVhbl9saXN0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQm9vbGVhbl9saXN0OworICByZXN1bHQuU3RydWN0X2xpc3QgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5TdHJ1Y3RfbGlzdDsKKyAgcmVzdWx0LkJ5dGVfc2V0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9zZXQ7CisgIHJlc3VsdC5JMTZfc2V0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuSTE2X3NldDsKKyAgcmVzdWx0LkkzMl9zZXQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5JMzJfc2V0OworICByZXN1bHQuSTY0X3NldCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkk2NF9zZXQ7CisgIHJlc3VsdC5Eb3VibGVfc2V0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuRG91YmxlX3NldDsKKyAgcmVzdWx0LlN0cmluZ19zZXQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5TdHJpbmdfc2V0OworICByZXN1bHQuU3RyaW5nX3NldCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULlN0cmluZ19zZXQ7CisgIHJlc3VsdC5TdHJpbmdfc2V0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuU3RyaW5nX3NldDsKKyAgcmVzdWx0LkJpbmFyeV9zZXQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CaW5hcnlfc2V0OworICByZXN1bHQuQm9vbGVhbl9zZXQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5Cb29sZWFuX3NldDsKKyAgcmVzdWx0LlN0cnVjdF9zZXQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5TdHJ1Y3Rfc2V0OworICByZXN1bHQuQnl0ZV9ieXRlX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfYnl0ZV9tYXA7CisgIHJlc3VsdC5JMTZfYnl0ZV9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5JMTZfYnl0ZV9tYXA7CisgIHJlc3VsdC5JMzJfYnl0ZV9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5JMzJfYnl0ZV9tYXA7CisgIHJlc3VsdC5JNjRfYnl0ZV9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5JNjRfYnl0ZV9tYXA7CisgIHJlc3VsdC5Eb3VibGVfYnl0ZV9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5Eb3VibGVfYnl0ZV9tYXA7CisgIHJlc3VsdC5TdHJpbmdfYnl0ZV9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5TdHJpbmdfYnl0ZV9tYXA7CisgIHJlc3VsdC5CaW5hcnlfYnl0ZV9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CaW5hcnlfYnl0ZV9tYXA7CisgIHJlc3VsdC5Cb29sZWFuX2J5dGVfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQm9vbGVhbl9ieXRlX21hcDsKKyAgcmVzdWx0LkJ5dGVfaTE2X21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfaTE2X21hcDsKKyAgcmVzdWx0LkJ5dGVfaTMyX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfaTMyX21hcDsKKyAgcmVzdWx0LkJ5dGVfaTY0X21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfaTY0X21hcDsKKyAgcmVzdWx0LkJ5dGVfZG91YmxlX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfZG91YmxlX21hcDsKKyAgcmVzdWx0LkJ5dGVfc3RyaW5nX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfc3RyaW5nX21hcDsKKyAgcmVzdWx0LkJ5dGVfYmluYXJ5X21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfYmluYXJ5X21hcDsKKyAgcmVzdWx0LkJ5dGVfYm9vbGVhbl9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CeXRlX2Jvb2xlYW5fbWFwOworICByZXN1bHQuTGlzdF9ieXRlX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkxpc3RfYnl0ZV9tYXA7CisgIHJlc3VsdC5TZXRfYnl0ZV9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5TZXRfYnl0ZV9tYXA7CisgIHJlc3VsdC5NYXBfYnl0ZV9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5NYXBfYnl0ZV9tYXA7CisgIHJlc3VsdC5CeXRlX21hcF9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CeXRlX21hcF9tYXA7CisgIHJlc3VsdC5CeXRlX3NldF9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CeXRlX3NldF9tYXA7CisgIHJlc3VsdC5CeXRlX2xpc3RfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9saXN0X21hcDsKKworICB7JElGIGNEZWJ1Z1Byb3RvVGVzdF9PcHRpb25fQW5zaVN0cl9CaW5hcnl9CisgIHJlc3VsdC5BX2JpbmFyeSA6PSBBbnNpU3RyaW5nKCAjMCMxIzIjMyM0IzUjNiM3IzgpOworICB7JEVMU0V9CisgIHJlc3VsdC5BX2JpbmFyeSA6PSBURW5jb2RpbmcuVVRGOC5HZXRCeXRlcyggIzAjMSMyIzMjNCM1IzYjNyM4KTsKKyAgeyRJRkVORH0KK2VuZDsKKworCisKKworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci9UZXN0U2VyaWFsaXplci5kcHIgYi9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci9UZXN0U2VyaWFsaXplci5kcHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlMjJhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyL1Rlc3RTZXJpYWxpemVyLmRwcgpAQCAtMCwwICsxLDIzMSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCitwcm9ncmFtIFRlc3RTZXJpYWxpemVyOworCit7JEFQUFRZUEUgQ09OU09MRX0KKwordXNlcworICBDbGFzc2VzLCBXaW5kb3dzLCBTeXNVdGlscywgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCisgIFRocmlmdCBpbiAnLi5cLi5cc3JjXFRocmlmdC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlwuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAorICBUaHJpZnQuU29ja2V0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAorICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sLkpTT04gaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMnLAorICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKKyAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKKyAgVGhyaWZ0LlV0aWxzIGluICcuLlwuLlxzcmNcVGhyaWZ0LlV0aWxzLnBhcycsCisgIFRocmlmdC5TZXJpYWxpemVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcmlhbGl6ZXIucGFzJywKKyAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJywKKyAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKKyAgU3lzdGVtXywKKyAgRGVidWdQcm90b1Rlc3QsCisgIFRlc3RTZXJpYWxpemVyLkRhdGE7CisKKworCit0eXBlCisgIFRUZXN0U2VyaWFsaXplciA9IGNsYXNzIC8vZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHByaXZhdGUKKyAgICBGUHJvdG9jb2xzIDogVExpc3Q8IElQcm90b2NvbEZhY3Rvcnk+OworCisgICAgY2xhc3MgZnVuY3Rpb24gIFNlcmlhbGl6ZShjb25zdCBpbnB1dCA6IElCYXNlOyBjb25zdCBmYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeSkgOiBUQnl0ZXM7ICBvdmVybG9hZDsKKyAgICBjbGFzcyBwcm9jZWR1cmUgU2VyaWFsaXplKGNvbnN0IGlucHV0IDogSUJhc2U7IGNvbnN0IGZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5OyBjb25zdCBhU3RyZWFtIDogVFN0cmVhbSk7ICBvdmVybG9hZDsKKyAgICBjbGFzcyBwcm9jZWR1cmUgRGVzZXJpYWxpemUoIGNvbnN0IGlucHV0IDogVEJ5dGVzOyBjb25zdCB0YXJnZXQgOiBJQmFzZTsgY29uc3QgZmFjdG9yeSA6IElQcm90b2NvbEZhY3RvcnkpOyAgb3ZlcmxvYWQ7CisgICAgY2xhc3MgcHJvY2VkdXJlIERlc2VyaWFsaXplKCBjb25zdCBpbnB1dCA6IFRTdHJlYW07IGNvbnN0IHRhcmdldCA6IElCYXNlOyBjb25zdCBmYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeSk7ICBvdmVybG9hZDsKKworICAgIHByb2NlZHVyZSBUZXN0X1NlcmlhbGl6ZXJfRGVzZXJpYWxpemVyOworCisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKworICAgIHByb2NlZHVyZSBSdW5UZXN0czsKKyAgZW5kOworCisKKworeyBUVGVzdFNlcmlhbGl6ZXIgfQorCitjb25zdHJ1Y3RvciBUVGVzdFNlcmlhbGl6ZXIuQ3JlYXRlOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlByb3RvY29scyA6PSBUTGlzdDwgSVByb3RvY29sRmFjdG9yeT4uQ3JlYXRlOworICBGUHJvdG9jb2xzLkFkZCggVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGUpOworICAvL0ZQcm90b2NvbHMuQWRkKCBUQ29tcGFjdFByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGUpOworICBGUHJvdG9jb2xzLkFkZCggVEpTT05Qcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlKTsKK2VuZDsKKworCitkZXN0cnVjdG9yIFRUZXN0U2VyaWFsaXplci5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgRnJlZUFuZE5pbCggRlByb3RvY29scyk7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCit0eXBlIFRNZXRob2QgPSAobXRfQnl0ZXMsIG10X1N0cmVhbSk7CisKKworcHJvY2VkdXJlIFRUZXN0U2VyaWFsaXplci5UZXN0X1NlcmlhbGl6ZXJfRGVzZXJpYWxpemVyOwordmFyIGxldmVsM29vZSwgY29ycmVjdCA6IElPbmVPZkVhY2g7CisgICAgZmFjdG9yeSA6IElQcm90b2NvbEZhY3Rvcnk7CisgICAgYnl0ZXMgICA6IFRCeXRlczsKKyAgICBzdHJlYW0gIDogVEZpbGVTdHJlYW07CisgICAgaSAgICAgICA6IEludGVnZXI7CisgICAgbWV0aG9kICA6IFRNZXRob2Q7CitiZWdpbgorICBjb3JyZWN0IDo9IEZpeHR1cmVzLkNyZWF0ZU9uZU9mRWFjaDsKKyAgc3RyZWFtICA6PSBURmlsZVN0cmVhbS5DcmVhdGUoICdUZXN0U2VyaWFsaXplci5kYXQnLCBmbUNyZWF0ZSk7CisgIHRyeQorCisgICAgZm9yIG1ldGhvZCBpbiBbTG93KFRNZXRob2QpLi5IaWdoKFRNZXRob2QpXSBkbyBiZWdpbgorICAgICAgZm9yIGZhY3RvcnkgaW4gRlByb3RvY29scyBkbyBiZWdpbgorCisgICAgICAgIC8vIHdyaXRlCisgICAgICAgIGxldmVsM29vZSA6PSBGaXh0dXJlcy5DcmVhdGVPbmVPZkVhY2g7CisgICAgICAgIGNhc2UgbWV0aG9kIG9mCisgICAgICAgICAgbXRfQnl0ZXM6ICBieXRlcyA6PSBTZXJpYWxpemUoIGxldmVsM29vZSwgZmFjdG9yeSk7CisgICAgICAgICAgbXRfU3RyZWFtOiBiZWdpbgorICAgICAgICAgICAgc3RyZWFtLlNpemUgOj0gMDsKKyAgICAgICAgICAgIFNlcmlhbGl6ZSggbGV2ZWwzb29lLCBmYWN0b3J5LCBzdHJlYW0pOworICAgICAgICAgIGVuZAorICAgICAgICBlbHNlCisgICAgICAgICAgQVNTRVJUKCBGQUxTRSk7CisgICAgICAgIGVuZDsKKworICAgICAgICAvLyBpbml0ICsgcmVhZAorICAgICAgICBsZXZlbDNvb2UgOj0gVE9uZU9mRWFjaEltcGwuQ3JlYXRlOworICAgICAgICBjYXNlIG1ldGhvZCBvZgorICAgICAgICAgIG10X0J5dGVzOiAgRGVzZXJpYWxpemUoIGJ5dGVzLCBsZXZlbDNvb2UsIGZhY3RvcnkpOworICAgICAgICAgIG10X1N0cmVhbTogYmVnaW4KKyAgICAgICAgICAgIHN0cmVhbS5Qb3NpdGlvbiA6PSAwOworICAgICAgICAgICAgRGVzZXJpYWxpemUoIHN0cmVhbSwgbGV2ZWwzb29lLCBmYWN0b3J5KTsKKyAgICAgICAgICBlbmQKKyAgICAgICAgZWxzZQorICAgICAgICAgIEFTU0VSVCggRkFMU0UpOworICAgICAgICBlbmQ7CisKKworICAgICAgICAvLyBjaGVjaworICAgICAgICBBU1NFUlQoIGxldmVsM29vZS5JbV90cnVlID0gY29ycmVjdC5JbV90cnVlKTsKKyAgICAgICAgQVNTRVJUKCBsZXZlbDNvb2UuSW1fZmFsc2UgPSBjb3JyZWN0LkltX2ZhbHNlKTsKKyAgICAgICAgQVNTRVJUKCBsZXZlbDNvb2UuQV9iaXRlID0gY29ycmVjdC5BX2JpdGUpOworICAgICAgICBBU1NFUlQoIGxldmVsM29vZS5JbnRlZ2VyMTYgPSBjb3JyZWN0LkludGVnZXIxNik7CisgICAgICAgIEFTU0VSVCggbGV2ZWwzb29lLkludGVnZXIzMiA9IGNvcnJlY3QuSW50ZWdlcjMyKTsKKyAgICAgICAgQVNTRVJUKCBsZXZlbDNvb2UuSW50ZWdlcjY0ID0gY29ycmVjdC5JbnRlZ2VyNjQpOworICAgICAgICBBU1NFUlQoIEFicyggbGV2ZWwzb29lLkRvdWJsZV9wcmVjaXNpb24gLSBjb3JyZWN0LkRvdWJsZV9wcmVjaXNpb24pIDwgMUUtMTIpOworICAgICAgICBBU1NFUlQoIGxldmVsM29vZS5Tb21lX2NoYXJhY3RlcnMgPSBjb3JyZWN0LlNvbWVfY2hhcmFjdGVycyk7CisgICAgICAgIEFTU0VSVCggbGV2ZWwzb29lLlpvbWdfdW5pY29kZSA9IGNvcnJlY3QuWm9tZ191bmljb2RlKTsKKyAgICAgICAgQVNTRVJUKCBsZXZlbDNvb2UuV2hhdF93aG8gPSBjb3JyZWN0LldoYXRfd2hvKTsKKyAgICAgICAgQVNTRVJUKCBsZXZlbDNvb2UuQmFzZTY0ID0gY29ycmVjdC5CYXNlNjQpOworCisgICAgICAgIEFTU0VSVCggbGV2ZWwzb29lLkJ5dGVfbGlzdC5Db3VudCA9IGNvcnJlY3QuQnl0ZV9saXN0LkNvdW50KTsKKyAgICAgICAgZm9yIGkgOj0gMCB0byBsZXZlbDNvb2UuQnl0ZV9saXN0LkNvdW50LTEKKyAgICAgICAgZG8gQVNTRVJUKCBsZXZlbDNvb2UuQnl0ZV9saXN0W2ldID0gY29ycmVjdC5CeXRlX2xpc3RbaV0pOworCisgICAgICAgIEFTU0VSVCggbGV2ZWwzb29lLkkxNl9saXN0LkNvdW50ID0gY29ycmVjdC5JMTZfbGlzdC5Db3VudCk7CisgICAgICAgIGZvciBpIDo9IDAgdG8gbGV2ZWwzb29lLkkxNl9saXN0LkNvdW50LTEKKyAgICAgICAgZG8gQVNTRVJUKCBsZXZlbDNvb2UuSTE2X2xpc3RbaV0gPSBjb3JyZWN0LkkxNl9saXN0W2ldKTsKKworICAgICAgICBBU1NFUlQoIGxldmVsM29vZS5JNjRfbGlzdC5Db3VudCA9IGNvcnJlY3QuSTY0X2xpc3QuQ291bnQpOworICAgICAgICBmb3IgaSA6PSAwIHRvIGxldmVsM29vZS5JNjRfbGlzdC5Db3VudC0xCisgICAgICAgIGRvIEFTU0VSVCggbGV2ZWwzb29lLkk2NF9saXN0W2ldID0gY29ycmVjdC5JNjRfbGlzdFtpXSk7CisgICAgICBlbmQ7CisgICAgZW5kOworCisgIGZpbmFsbHkKKyAgICBzdHJlYW0uRnJlZTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUVGVzdFNlcmlhbGl6ZXIuUnVuVGVzdHM7CitiZWdpbgorICB0cnkKKyAgICBUZXN0X1NlcmlhbGl6ZXJfRGVzZXJpYWxpemVyOworICBleGNlcHQKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBiZWdpbgorICAgICAgV3JpdGVsbiggZS5NZXNzYWdlKTsKKyAgICAgIFdyaXRlKCdIaXQgRU5URVIgdG8gY2xvc2UgLi4uICcpOyBSZWFkbG47CisgICAgZW5kOworICBlbmQ7CitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gVFRlc3RTZXJpYWxpemVyLlNlcmlhbGl6ZShjb25zdCBpbnB1dCA6IElCYXNlOyBjb25zdCBmYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeSkgOiBUQnl0ZXM7Cit2YXIgc2VyaWFsIDogVFNlcmlhbGl6ZXI7CitiZWdpbgorICBzZXJpYWwgOj0gVFNlcmlhbGl6ZXIuQ3JlYXRlKCBmYWN0b3J5KTsKKyAgdHJ5CisgICAgcmVzdWx0IDo9IHNlcmlhbC5TZXJpYWxpemUoIGlucHV0KTsKKyAgZmluYWxseQorICAgIHNlcmlhbC5GcmVlOworICBlbmQ7CitlbmQ7CisKKworY2xhc3MgcHJvY2VkdXJlIFRUZXN0U2VyaWFsaXplci5TZXJpYWxpemUoY29uc3QgaW5wdXQgOiBJQmFzZTsgY29uc3QgZmFjdG9yeSA6IElQcm90b2NvbEZhY3Rvcnk7IGNvbnN0IGFTdHJlYW0gOiBUU3RyZWFtKTsKK3ZhciBzZXJpYWwgOiBUU2VyaWFsaXplcjsKK2JlZ2luCisgIHNlcmlhbCA6PSBUU2VyaWFsaXplci5DcmVhdGUoIGZhY3RvcnkpOworICB0cnkKKyAgICBzZXJpYWwuU2VyaWFsaXplKCBpbnB1dCwgYVN0cmVhbSk7CisgIGZpbmFsbHkKKyAgICBzZXJpYWwuRnJlZTsKKyAgZW5kOworZW5kOworCisKK2NsYXNzIHByb2NlZHVyZSBUVGVzdFNlcmlhbGl6ZXIuRGVzZXJpYWxpemUoIGNvbnN0IGlucHV0IDogVEJ5dGVzOyBjb25zdCB0YXJnZXQgOiBJQmFzZTsgY29uc3QgZmFjdG9yeSA6IElQcm90b2NvbEZhY3RvcnkpOwordmFyIHNlcmlhbCA6IFREZXNlcmlhbGl6ZXI7CitiZWdpbgorICBzZXJpYWwgOj0gVERlc2VyaWFsaXplci5DcmVhdGUoIGZhY3RvcnkpOworICB0cnkKKyAgICBzZXJpYWwuRGVzZXJpYWxpemUoIGlucHV0LCB0YXJnZXQpOworICBmaW5hbGx5CisgICAgc2VyaWFsLkZyZWU7CisgIGVuZDsKK2VuZDsKKworY2xhc3MgcHJvY2VkdXJlIFRUZXN0U2VyaWFsaXplci5EZXNlcmlhbGl6ZSggY29uc3QgaW5wdXQgOiBUU3RyZWFtOyBjb25zdCB0YXJnZXQgOiBJQmFzZTsgY29uc3QgZmFjdG9yeSA6IElQcm90b2NvbEZhY3RvcnkpOwordmFyIHNlcmlhbCA6IFREZXNlcmlhbGl6ZXI7CitiZWdpbgorICBzZXJpYWwgOj0gVERlc2VyaWFsaXplci5DcmVhdGUoIGZhY3RvcnkpOworICB0cnkKKyAgICBzZXJpYWwuRGVzZXJpYWxpemUoIGlucHV0LCB0YXJnZXQpOworICBmaW5hbGx5CisgICAgc2VyaWFsLkZyZWU7CisgIGVuZDsKK2VuZDsKKworCit2YXIgdGVzdCA6IFRUZXN0U2VyaWFsaXplcjsKK2JlZ2luCisgIHRlc3QgOj0gVFRlc3RTZXJpYWxpemVyLkNyZWF0ZTsKKyAgdHJ5CisgICAgdGVzdC5SdW5UZXN0czsKKyAgZmluYWxseQorICAgIHRlc3QuRnJlZTsKKyAgZW5kOworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2VydmVyLmRwciBiL2xpYi9kZWxwaGkvdGVzdC9zZXJ2ZXIuZHByCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZTQ4YTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3Qvc2VydmVyLmRwcgpAQCAtMCwwICsxLDczIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3Byb2dyYW0gc2VydmVyOworCit7JEFQUFRZUEUgQ09OU09MRX0KKwordXNlcworICBTeXNVdGlscywKKyAgVGVzdFNlcnZlciBpbiAnVGVzdFNlcnZlci5wYXMnLAorICBUZXN0U2VydmVyRXZlbnRzIGluICdUZXN0U2VydmVyRXZlbnRzLnBhcycsCisgIFRocmlmdC5UZXN0LCAgLy8gaW4gZ2VuLWRlbHBoaSBmb2xkZXIKKyAgVGhyaWZ0IGluICcuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQuUGlwZXMgaW4gJy4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wuSlNPTiBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5KU09OLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbC5Db21wYWN0IGluICcuLlxzcmNcVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleCBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXgucGFzJywKKyAgVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXggaW4gJy4uXHNyY1xUaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleC5wYXMnLAorICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKKyAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKKyAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKKyAgVGhyaWZ0LlV0aWxzIGluICcuLlxzcmNcVGhyaWZ0LlV0aWxzLnBhcycsCisgIFRocmlmdC5TdHJlYW0gaW4gJy4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcyc7CisKK3ZhcgorICBuUGFyYW1Db3VudCA6IEludGVnZXI7CisgIGFyZ3MgOiBhcnJheSBvZiBzdHJpbmc7CisgIGkgOiBJbnRlZ2VyOworICBhcmcgOiBzdHJpbmc7CisKK2JlZ2luCisgIHRyeQorICAgIFdyaXRlbG4oICdEZWxwaGkgVGVzdFNlcnZlciAnK1RocmlmdC5WZXJzaW9uKTsKKyAgICBuUGFyYW1Db3VudCA6PSBQYXJhbUNvdW50OworICAgIFNldExlbmd0aCggYXJncywgblBhcmFtQ291bnQpOworICAgIGZvciBpIDo9IDEgdG8gblBhcmFtQ291bnQgZG8gYmVnaW4KKyAgICAgIGFyZyA6PSBQYXJhbVN0ciggaSApOworICAgICAgYXJnc1tpLTFdIDo9IGFyZzsKKyAgICBlbmQ7CisKKyAgICBUVGVzdFNlcnZlci5FeGVjdXRlKCBhcmdzICk7CisKKyAgZXhjZXB0CisgICAgb24gRTogRUFib3J0IGRvIGJlZ2luCisgICAgICBFeGl0Q29kZSA6PSAkRkY7CisgICAgZW5kOworICAgIG9uIEU6IEV4Y2VwdGlvbiBkbyBiZWdpbgorICAgICAgV3JpdGVsbihFLkNsYXNzTmFtZSwgJzogJywgRS5NZXNzYWdlKTsKKyAgICAgIEV4aXRDb2RlIDo9ICRGRjsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L3NraXAvUkVBRE1FLm1kIGIvbGliL2RlbHBoaS90ZXN0L3NraXAvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNDkzNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3Qvc2tpcC9SRUFETUUubWQKQEAgLTAsMCArMSwxMSBAQAorVGhlc2UgdHdvIHByb2plY3RzIGJlbG9uZyB0b2dldGhlci4gQm90aCBwcm9ncmFtcworc2ltdWxhdGUgc2VydmVyIGFuZCBjbGllbnQgZm9yIGRpZmZlcmVudCB2ZXJzaW9ucworb2YgdGhlIHNhbWUgcHJvdG9jb2wuCisKK1RoZSBpbnRlbnRpb24gb2YgdGhpcyB0ZXN0IGlzIHRvIGVuc3VyZSBmdWxseQord29ya2luZyBjb21wYXRpYmlsaXR5IGZlYXR1cmVzIG9mIHRoZSBEZWxwaGkgVGhyaWZ0CitpbXBsZW1lbnRhdGlvbi4KKworVGhlIGV4cGVjdGVkIHRlc3QgcmVzdWx0IGlzLCB0aGF0IG5vIGVycm9ycyBvY2N1cgord2l0aCBib3RoIHByb2dyYW1zLCByZWdhcmRsZXNzIGluIHdoaWNoIG9yZGVyIHRoZXkKK21pZ2h0IGJlIHN0YXJ0ZWQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2tpcC9pZGwvc2tpcHRlc3RfdmVyc2lvbl8xLnRocmlmdCBiL2xpYi9kZWxwaGkvdGVzdC9za2lwL2lkbC9za2lwdGVzdF92ZXJzaW9uXzEudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNTNjNWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3Qvc2tpcC9pZGwvc2tpcHRlc3RfdmVyc2lvbl8xLnRocmlmdApAQCAtMCwwICsxLDQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworLy8gdmVyc2lvbiAxIG9mIHRoZSBpbnRlcmZhY2UKKworbmFtZXNwYWNlICogU2tpcHRlc3QuT25lCisKK2NvbnN0IGkzMiBTS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTiA9IDEKKworc3RydWN0IFBvbmcgeworICAxIDogb3B0aW9uYWwgaTMyIHZlcnNpb24xCit9CisKK3N0cnVjdCBQaW5nIHsKKyAgMSA6IG9wdGlvbmFsIGkzMiB2ZXJzaW9uMQorfQorCitleGNlcHRpb24gUG9uZ0ZhaWxlZCB7CisgIDIyMiA6IG9wdGlvbmFsIGkzMiBwb25nRXJyb3JDb2RlCit9CisKKworc2VydmljZSBTa2lwVGVzdFNlcnZpY2UgeworICB2b2lkIFBpbmdQb25nKCAxOiBQaW5nIHBvbmcpIHRocm93cyAoNDQ0OiBQb25nRmFpbGVkIHBvZik7Cit9CisKKworLy8gRU9GClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L3NraXAvaWRsL3NraXB0ZXN0X3ZlcnNpb25fMi50aHJpZnQgYi9saWIvZGVscGhpL3Rlc3Qvc2tpcC9pZGwvc2tpcHRlc3RfdmVyc2lvbl8yLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzM1MmQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L3NraXAvaWRsL3NraXB0ZXN0X3ZlcnNpb25fMi50aHJpZnQKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8vIHZlcnNpb24gMiBvZiB0aGUgaW50ZXJmYWNlCisKK25hbWVzcGFjZSAqIFNraXB0ZXN0LlR3bworCitjb25zdCBpMzIgU0tJUFRFU1RTRVJWSUNFX1ZFUlNJT04gPSAyCisKK3N0cnVjdCBQb25nIHsKKyAgMSA6IG9wdGlvbmFsIGkzMiB2ZXJzaW9uMQorICAyIDogb3B0aW9uYWwgaTE2IHZlcnNpb24yCit9CisKK3N0cnVjdCBQaW5nIHsKKyAgMSA6IG9wdGlvbmFsIGkzMiB2ZXJzaW9uMQorICAxMCA6IG9wdGlvbmFsIGJvb2wgYm9vbFZhbAorICAxMSA6IG9wdGlvbmFsIGJ5dGUgYnl0ZVZhbAorICAxMiA6IG9wdGlvbmFsIGRvdWJsZSBkYlZhbAorICAxMyA6IG9wdGlvbmFsIGkxNiBpMTZWYWwKKyAgMTQgOiBvcHRpb25hbCBpMzIgaTMyVmFsCisgIDE1IDogb3B0aW9uYWwgaTY0IGk2NFZhbAorICAxNiA6IG9wdGlvbmFsIHN0cmluZyBzdHJWYWwKKyAgMTcgOiBvcHRpb25hbCBQb25nIHN0cnVjdFZhbAorICAxOCA6IG9wdGlvbmFsIG1hcDwgbGlzdDwgUG9uZz4sIHNldDwgc3RyaW5nPj4gbWFwVmFsCit9CisKK2V4Y2VwdGlvbiBQaW5nRmFpbGVkIHsKKyAgMSA6IG9wdGlvbmFsIGkzMiBwaW5nRXJyb3JDb2RlCit9CisKK2V4Y2VwdGlvbiBQb25nRmFpbGVkIHsKKyAgMjIyIDogb3B0aW9uYWwgaTMyIHBvbmdFcnJvckNvZGUKKyAgMTAgOiBvcHRpb25hbCBib29sIGJvb2xWYWwKKyAgMTEgOiBvcHRpb25hbCBieXRlIGJ5dGVWYWwKKyAgMTIgOiBvcHRpb25hbCBkb3VibGUgZGJWYWwKKyAgMTMgOiBvcHRpb25hbCBpMTYgaTE2VmFsCisgIDE0IDogb3B0aW9uYWwgaTMyIGkzMlZhbAorICAxNSA6IG9wdGlvbmFsIGk2NCBpNjRWYWwKKyAgMTYgOiBvcHRpb25hbCBzdHJpbmcgc3RyVmFsCisgIDE3IDogb3B0aW9uYWwgUG9uZyBzdHJ1Y3RWYWwKKyAgMTggOiBvcHRpb25hbCBtYXA8IGxpc3Q8IFBvbmc+LCBzZXQ8IHN0cmluZz4+IG1hcFZhbAorfQorCisKK3NlcnZpY2UgU2tpcFRlc3RTZXJ2aWNlIHsKKyAgUGluZyBQaW5nUG9uZyggMTogUGluZyBwaW5nLCAzOiBQb25nIHBvbmcpIHRocm93cyAoMTogUGluZ0ZhaWxlZCBwaWYsIDQ0NDogUG9uZ0ZhaWxlZCBwb2YpOworfQorCisKKy8vIEVPRgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2tpcC9za2lwdGVzdF92ZXJzaW9uMS5kcHIgYi9saWIvZGVscGhpL3Rlc3Qvc2tpcC9za2lwdGVzdF92ZXJzaW9uMS5kcHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAzZDZiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9za2lwL3NraXB0ZXN0X3ZlcnNpb24xLmRwcgpAQCAtMCwwICsxLDIwMSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCitwcm9ncmFtIHNraXB0ZXN0X3ZlcnNpb24xOworCit7JEFQUFRZUEUgQ09OU09MRX0KKwordXNlcworICBDbGFzc2VzLCBXaW5kb3dzLCBTeXNVdGlscywKKyAgU2tpcHRlc3QuT25lLAorICBUaHJpZnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cLi5cc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKKyAgVGhyaWZ0LlNvY2tldCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Tb2NrZXQucGFzJywKKyAgVGhyaWZ0LlRyYW5zcG9ydCBpbiAnLi5cLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbC5KU09OIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzJywKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlwuLlxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCisgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCisgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnLAorICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlwuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAorICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnOworCitjb25zdAorICBSRVFVRVNUX0VYVCAgPSAnLnJlcXVlc3QnOworICBSRVNQT05TRV9FWFQgPSAnLnJlc3BvbnNlJzsKKworCitmdW5jdGlvbiBDcmVhdGVQaW5nIDogSVBpbmc7CitiZWdpbgorICByZXN1bHQgOj0gVFBpbmdJbXBsLkNyZWF0ZTsKKyAgcmVzdWx0LlZlcnNpb24xICA6PSBUc2tpcHRlc3RfdmVyc2lvbl8xQ29uc3RhbnRzLlNLSVBURVNUU0VSVklDRV9WRVJTSU9OOworZW5kOworCisKK3R5cGUKKyAgVER1bW15U2VydmVyID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBUU2tpcFRlc3RTZXJ2aWNlLklmYWNlKQorICBwcm90ZWN0ZWQKKyAgICAvLyBUU2tpcFRlc3RTZXJ2aWNlLklmYWNlCisgICAgcHJvY2VkdXJlIFBpbmdQb25nKGNvbnN0IHBpbmc6IElQaW5nKTsKKyAgZW5kOworCisKK3Byb2NlZHVyZSBURHVtbXlTZXJ2ZXIuUGluZ1BvbmcoY29uc3QgcGluZzogSVBpbmcpOworLy8gVFNraXBUZXN0U2VydmljZS5JZmFjZQorYmVnaW4KKyAgV3JpdGVsbignLSBwZXJmb3JtaW5nIHJlcXVlc3QgZnJvbSB2ZXJzaW9uICcrSW50VG9TdHIocGluZy5WZXJzaW9uMSkrJyBjbGllbnQnKTsKK2VuZDsKKworCitmdW5jdGlvbiBDcmVhdGVQcm90b2NvbCggcHJvdGZhY3QgOiBJUHJvdG9jb2xGYWN0b3J5OyBzdG0gOiBUU3RyZWFtOyBhRm9ySW5wdXQgOiBCb29sZWFuKSA6IElQcm90b2NvbDsKK3ZhciBhZGFwdCAgOiBJVGhyaWZ0U3RyZWFtOworICAgIHRyYW5zICA6IElUcmFuc3BvcnQ7CitiZWdpbgorICBhZGFwdCAgOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBzdG0sIEZBTFNFKTsKKyAgaWYgYUZvcklucHV0CisgIHRoZW4gdHJhbnMgOj0gVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBhZGFwdCwgbmlsKQorICBlbHNlIHRyYW5zIDo9IFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNyZWF0ZSggbmlsLCBhZGFwdCk7CisgIHJlc3VsdCA6PSBwcm90ZmFjdC5HZXRQcm90b2NvbCggdHJhbnMpOworZW5kOworCisKK3Byb2NlZHVyZSBDcmVhdGVSZXF1ZXN0KCBwcm90ZmFjdCA6IElQcm90b2NvbEZhY3Rvcnk7IGZuYW1lIDogc3RyaW5nKTsKK3ZhciBzdG0gICAgOiBURmlsZVN0cmVhbTsKKyAgICBwaW5nICAgOiBJUGluZzsKKyAgICBwcm90byAgOiBJUHJvdG9jb2w7CisgICAgY2xpZW50IDogVFNraXBUZXN0U2VydmljZS5UQ2xpZW50OyAgIC8vIHdlIG5lZWQgYWNjZXNzIHRvIHNlbmQvcmVjdl9waW5ncG9uZygpCisgICAgY2xpUmVmIDogSVVua25vd247ICAgICAgICAgICAgICAgICAgIC8vIGhvbGRzIHRoZSByZWZjb3VudAorYmVnaW4KKyAgV3JpdGVsbignLSBjcmVhdGluZyBuZXcgcmVxdWVzdCcpOworICBzdG0gOj0gVEZpbGVTdHJlYW0uQ3JlYXRlKCBmbmFtZStSRVFVRVNUX0VYVCsnLnRtcCcsIGZtQ3JlYXRlKTsKKyAgdHJ5CisgICAgcGluZyA6PSBDcmVhdGVQaW5nOworCisgICAgLy8gc2F2ZSByZXF1ZXN0IGRhdGEKKyAgICBwcm90byAgOj0gQ3JlYXRlUHJvdG9jb2woIHByb3RmYWN0LCBzdG0sIEZBTFNFKTsKKyAgICBjbGllbnQgOj0gVFNraXBUZXN0U2VydmljZS5UQ2xpZW50LkNyZWF0ZSggbmlsLCBwcm90byk7CisgICAgY2xpUmVmIDo9IGNsaWVudCBhcyBJVW5rbm93bjsKKyAgICBjbGllbnQuc2VuZF9QaW5nUG9uZyggcGluZyk7CisKKyAgZmluYWxseQorICAgIGNsaWVudCA6PSBuaWw7ICAvLyBub3QgRnJlZSEKKyAgICBjbGlSZWYgOj0gbmlsOworICAgIHN0bS5GcmVlOworICAgIGlmIGNsaWVudCA9IG5pbCB0aGVuIHt3YXJuaW5nIHN1cHByZXNzZWR9OworICBlbmQ7CisKKyAgRGVsZXRlRmlsZSggZm5hbWUrUkVRVUVTVF9FWFQpOworICBSZW5hbWVGaWxlKCBmbmFtZStSRVFVRVNUX0VYVCsnLnRtcCcsIGZuYW1lK1JFUVVFU1RfRVhUKTsKK2VuZDsKKworCitwcm9jZWR1cmUgUmVhZFJlc3BvbnNlKCBwcm90ZmFjdCA6IElQcm90b2NvbEZhY3Rvcnk7IGZuYW1lIDogc3RyaW5nKTsKK3ZhciBzdG0gICAgOiBURmlsZVN0cmVhbTsKKyAgICBwcm90byAgOiBJUHJvdG9jb2w7CisgICAgY2xpZW50IDogVFNraXBUZXN0U2VydmljZS5UQ2xpZW50OyAgIC8vIHdlIG5lZWQgYWNjZXNzIHRvIHNlbmQvcmVjdl9waW5ncG9uZygpCisgICAgY2xpUmVmIDogSVVua25vd247ICAgICAgICAgICAgICAgICAgIC8vIGhvbGRzIHRoZSByZWZjb3VudAorYmVnaW4KKyAgV3JpdGVsbignLSByZWFkaW5nIHJlc3BvbnNlJyk7CisgIHN0bSA6PSBURmlsZVN0cmVhbS5DcmVhdGUoIGZuYW1lK1JFU1BPTlNFX0VYVCwgZm1PcGVuUmVhZCk7CisgIHRyeQorICAgIC8vIHNhdmUgcmVxdWVzdCBkYXRhCisgICAgcHJvdG8gIDo9IENyZWF0ZVByb3RvY29sKCBwcm90ZmFjdCwgc3RtLCBUUlVFKTsKKyAgICBjbGllbnQgOj0gVFNraXBUZXN0U2VydmljZS5UQ2xpZW50LkNyZWF0ZSggcHJvdG8sIG5pbCk7CisgICAgY2xpUmVmIDo9IGNsaWVudCBhcyBJVW5rbm93bjsKKyAgICBjbGllbnQucmVjdl9QaW5nUG9uZzsKKworICBmaW5hbGx5CisgICAgY2xpZW50IDo9IG5pbDsgIC8vIG5vdCBGcmVlIQorICAgIGNsaVJlZiA6PSBuaWw7CisgICAgc3RtLkZyZWU7CisgICAgaWYgY2xpZW50ID0gbmlsIHRoZW4ge3dhcm5pbmcgc3VwcHJlc3NlZH07CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgUHJvY2Vzc0ZpbGUoIHByb3RmYWN0IDogSVByb3RvY29sRmFjdG9yeTsgZm5hbWUgOiBzdHJpbmcpOwordmFyIHN0bUluLCBzdG1PdXQgICA6IFRGaWxlU3RyZWFtOworICAgIHByb3RJbiwgcHJvdE91dCA6IElQcm90b2NvbDsKKyAgICBzZXJ2ZXIgOiBJUHJvY2Vzc29yOworYmVnaW4KKyAgV3JpdGVsbignLSBwcm9jZXNzaW5nIHJlcXVlc3QnKTsKKyAgc3RtT3V0IDo9IG5pbDsKKyAgc3RtSW4gIDo9IFRGaWxlU3RyZWFtLkNyZWF0ZSggZm5hbWUrUkVRVUVTVF9FWFQsIGZtT3BlblJlYWQpOworICB0cnkKKyAgICBzdG1PdXQgOj0gVEZpbGVTdHJlYW0uQ3JlYXRlKCBmbmFtZStSRVNQT05TRV9FWFQrJy50bXAnLCBmbUNyZWF0ZSk7CisKKyAgICAvLyBwcm9jZXNzIHJlcXVlc3QgYW5kIHdyaXRlIHJlc3BvbnNlIGRhdGEKKyAgICBwcm90SW4gIDo9IENyZWF0ZVByb3RvY29sKCBwcm90ZmFjdCwgc3RtSW4sICBUUlVFKTsKKyAgICBwcm90T3V0IDo9IENyZWF0ZVByb3RvY29sKCBwcm90ZmFjdCwgc3RtT3V0LCBGQUxTRSk7CisKKyAgICBzZXJ2ZXIgOj0gVFNraXBUZXN0U2VydmljZS5UUHJvY2Vzc29ySW1wbC5DcmVhdGUoIFREdW1teVNlcnZlci5DcmVhdGUpOworICAgIHNlcnZlci5Qcm9jZXNzKCBwcm90SW4sIHByb3RPdXQpOworCisgIGZpbmFsbHkKKyAgICBzZXJ2ZXIgOj0gbmlsOyAgLy8gbm90IEZyZWUhCisgICAgc3RtSW4uRnJlZTsKKyAgICBzdG1PdXQuRnJlZTsKKyAgICBpZiBzZXJ2ZXIgPSBuaWwgdGhlbiB7d2FybmluZyBzdXBwcmVzc2VkfTsKKyAgZW5kOworCisgIERlbGV0ZUZpbGUoIGZuYW1lK1JFU1BPTlNFX0VYVCk7CisgIFJlbmFtZUZpbGUoIGZuYW1lK1JFU1BPTlNFX0VYVCsnLnRtcCcsIGZuYW1lK1JFU1BPTlNFX0VYVCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRlc3QoIHByb3RmYWN0IDogSVByb3RvY29sRmFjdG9yeTsgZm5hbWUgOiBzdHJpbmcpOworYmVnaW4KKyAgLy8gdHJ5IHRvIHJlYWQgYW4gZXhpc3RpbmcgcmVxdWVzdAorICBpZiBGaWxlRXhpc3RzKCBmbmFtZSArIFJFUVVFU1RfRVhUKSB0aGVuIGJlZ2luCisgICAgUHJvY2Vzc0ZpbGUoIHByb3RmYWN0LCBmbmFtZSk7CisgICAgUmVhZFJlc3BvbnNlKCBwcm90ZmFjdCwgZm5hbWUpOworICBlbmQ7CisKKyAgLy8gY3JlYXRlIGEgbmV3IHJlcXVlc3QgYW5kIHRyeSB0byBwcm9jZXNzCisgIENyZWF0ZVJlcXVlc3QoIHByb3RmYWN0LCBmbmFtZSk7CisgIFByb2Nlc3NGaWxlKCBwcm90ZmFjdCwgZm5hbWUpOworICBSZWFkUmVzcG9uc2UoIHByb3RmYWN0LCBmbmFtZSk7CitlbmQ7CisKKworY29uc3QKKyAgRklMRV9CSU5BUlkgPSAncGluZ3BvbmcuYmluJzsKKyAgRklMRV9KU09OICAgPSAncGluZ3BvbmcuanNvbic7CitiZWdpbgorICB0cnkKKyAgICBXcml0ZWxuKCAnRGVscGhpIFNraXBUZXN0ICcrSW50VG9TdHIoVHNraXB0ZXN0X3ZlcnNpb25fMUNvbnN0YW50cy5TS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTikrJyB1c2luZyAnK1RocmlmdC5WZXJzaW9uKTsKKworICAgIFdyaXRlbG47CisgICAgV3JpdGVsbignQmluYXJ5IHByb3RvY29sJyk7CisgICAgVGVzdCggVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGUsIEZJTEVfQklOQVJZKTsKKworICAgIFdyaXRlbG47CisgICAgV3JpdGVsbignSlNPTiBwcm90b2NvbCcpOworICAgIFRlc3QoIFRKU09OUHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZSwgICBGSUxFX0pTT04pOworCisgICAgV3JpdGVsbjsKKyAgICBXcml0ZWxuKCdUZXN0IGNvbXBsZXRlZCB3aXRob3V0IGVycm9ycy4nKTsKKyAgICBXcml0ZWxuOworICAgIFdyaXRlKCdQcmVzcyBFTlRFUiB0byBjbG9zZSAuLi4nKTsgIFJlYWRsbjsKKyAgZXhjZXB0CisgICAgb24gRTogRXhjZXB0aW9uIGRvCisgICAgICBXcml0ZWxuKEUuQ2xhc3NOYW1lLCAnOiAnLCBFLk1lc3NhZ2UpOworICBlbmQ7CitlbmQuCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9za2lwL3NraXB0ZXN0X3ZlcnNpb24yLmRwciBiL2xpYi9kZWxwaGkvdGVzdC9za2lwL3NraXB0ZXN0X3ZlcnNpb24yLmRwcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzNiMjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L3NraXAvc2tpcHRlc3RfdmVyc2lvbjIuZHByCkBAIC0wLDAgKzEsMjI4IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3Byb2dyYW0gc2tpcHRlc3RfdmVyc2lvbjI7CisKK3skQVBQVFlQRSBDT05TT0xFfQorCit1c2VzCisgIENsYXNzZXMsIFdpbmRvd3MsIFN5c1V0aWxzLAorICBTa2lwdGVzdC5Ud28sCisgIFRocmlmdCBpbiAnLi5cLi5cc3JjXFRocmlmdC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlwuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAorICBUaHJpZnQuU29ja2V0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAorICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sLkpTT04gaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMnLAorICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKKyAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKKyAgVGhyaWZ0LlV0aWxzIGluICcuLlwuLlxzcmNcVGhyaWZ0LlV0aWxzLnBhcycsCisgIFRocmlmdC5UeXBlUmVnaXN0cnkgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHlwZVJlZ2lzdHJ5LnBhcycsCisgIFRocmlmdC5TdHJlYW0gaW4gJy4uXC4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcyc7CisKK2NvbnN0CisgIFJFUVVFU1RfRVhUICA9ICcucmVxdWVzdCc7CisgIFJFU1BPTlNFX0VYVCA9ICcucmVzcG9uc2UnOworCitmdW5jdGlvbiBDcmVhdGVQaW5nIDogSVBpbmc7Cit2YXIgbGlzdCA6IElUaHJpZnRMaXN0PElQb25nPjsKKyAgICBzZXRfIDogSUhhc2hTZXQ8c3RyaW5nPjsKK2JlZ2luCisgIHJlc3VsdCA6PSBUUGluZ0ltcGwuQ3JlYXRlOworICByZXN1bHQuVmVyc2lvbjEgIDo9IFRza2lwdGVzdF92ZXJzaW9uXzJDb25zdGFudHMuU0tJUFRFU1RTRVJWSUNFX1ZFUlNJT047CisgIHJlc3VsdC5Cb29sVmFsICAgOj0gVFJVRTsKKyAgcmVzdWx0LkJ5dGVWYWwgICA6PSAyOworICByZXN1bHQuRGJWYWwgICAgIDo9IDM7CisgIHJlc3VsdC5JMTZWYWwgICAgOj0gNDsKKyAgcmVzdWx0LkkzMlZhbCAgICA6PSA1OworICByZXN1bHQuSTY0VmFsICAgIDo9IDY7CisgIHJlc3VsdC5TdHJWYWwgICAgOj0gJ3NldmVuJzsKKworICByZXN1bHQuU3RydWN0VmFsIDo9IFRQb25nSW1wbC5DcmVhdGU7CisgIHJlc3VsdC5TdHJ1Y3RWYWwuVmVyc2lvbjEgOj0gLTE7CisgIHJlc3VsdC5TdHJ1Y3RWYWwuVmVyc2lvbjIgOj0gLTI7CisKKyAgbGlzdCA6PSBUVGhyaWZ0TGlzdEltcGw8SVBvbmc+LkNyZWF0ZTsKKyAgbGlzdC5BZGQoIHJlc3VsdC5TdHJ1Y3RWYWwpOworICBsaXN0LkFkZCggcmVzdWx0LlN0cnVjdFZhbCk7CisKKyAgc2V0XyA6PSBUSGFzaFNldEltcGw8c3RyaW5nPi5DcmVhdGU7CisgIHNldF8uQWRkKCAnb25lJyk7CisgIHNldF8uQWRkKCAndW5vJyk7CisgIHNldF8uQWRkKCAnZWlucycpOworICBzZXRfLkFkZCggJ2VlbicpOworCisgIHJlc3VsdC5NYXBWYWwgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPCBJVGhyaWZ0TGlzdDxJUG9uZz4sIElIYXNoU2V0PHN0cmluZz4+LkNyZWF0ZTsKKyAgcmVzdWx0Lk1hcFZhbC5BZGQoIGxpc3QsIHNldF8pOworZW5kOworCisKK3R5cGUKKyAgVER1bW15U2VydmVyID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBUU2tpcFRlc3RTZXJ2aWNlLklmYWNlKQorICBwcm90ZWN0ZWQKKyAgICAvLyBUU2tpcFRlc3RTZXJ2aWNlLklmYWNlCisgICAgZnVuY3Rpb24gUGluZ1BvbmcoY29uc3QgcGluZzogSVBpbmc7IGNvbnN0IHBvbmc6IElQb25nKTogSVBpbmc7CisgIGVuZDsKKworCitmdW5jdGlvbiBURHVtbXlTZXJ2ZXIuUGluZ1BvbmcoY29uc3QgcGluZzogSVBpbmc7IGNvbnN0IHBvbmc6IElQb25nKTogSVBpbmc7CisvLyBUU2tpcFRlc3RTZXJ2aWNlLklmYWNlCitiZWdpbgorICBXcml0ZWxuKCctIHBlcmZvcm1pbmcgcmVxdWVzdCBmcm9tIHZlcnNpb24gJytJbnRUb1N0cihwaW5nLlZlcnNpb24xKSsnIGNsaWVudCcpOworICByZXN1bHQgOj0gQ3JlYXRlUGluZzsKK2VuZDsKKworCitmdW5jdGlvbiBDcmVhdGVQcm90b2NvbCggcHJvdGZhY3QgOiBJUHJvdG9jb2xGYWN0b3J5OyBzdG0gOiBUU3RyZWFtOyBhRm9ySW5wdXQgOiBCb29sZWFuKSA6IElQcm90b2NvbDsKK3ZhciBhZGFwdCAgOiBJVGhyaWZ0U3RyZWFtOworICAgIHRyYW5zICA6IElUcmFuc3BvcnQ7CitiZWdpbgorICBhZGFwdCAgOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBzdG0sIEZBTFNFKTsKKyAgaWYgYUZvcklucHV0CisgIHRoZW4gdHJhbnMgOj0gVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBhZGFwdCwgbmlsKQorICBlbHNlIHRyYW5zIDo9IFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNyZWF0ZSggbmlsLCBhZGFwdCk7CisgIHJlc3VsdCA6PSBwcm90ZmFjdC5HZXRQcm90b2NvbCggdHJhbnMpOworZW5kOworCisKK3Byb2NlZHVyZSBDcmVhdGVSZXF1ZXN0KCBwcm90ZmFjdCA6IElQcm90b2NvbEZhY3Rvcnk7IGZuYW1lIDogc3RyaW5nKTsKK3ZhciBzdG0gICAgOiBURmlsZVN0cmVhbTsKKyAgICBwaW5nICAgOiBJUGluZzsKKyAgICBwcm90byAgOiBJUHJvdG9jb2w7CisgICAgY2xpZW50IDogVFNraXBUZXN0U2VydmljZS5UQ2xpZW50OyAgIC8vIHdlIG5lZWQgYWNjZXNzIHRvIHNlbmQvcmVjdl9waW5ncG9uZygpCisgICAgY2xpUmVmIDogSVVua25vd247ICAgICAgICAgICAgICAgICAgIC8vIGhvbGRzIHRoZSByZWZjb3VudAorYmVnaW4KKyAgV3JpdGVsbignLSBjcmVhdGluZyBuZXcgcmVxdWVzdCcpOworICBzdG0gOj0gVEZpbGVTdHJlYW0uQ3JlYXRlKCBmbmFtZStSRVFVRVNUX0VYVCsnLnRtcCcsIGZtQ3JlYXRlKTsKKyAgdHJ5CisgICAgcGluZyA6PSBDcmVhdGVQaW5nOworCisgICAgLy8gc2F2ZSByZXF1ZXN0IGRhdGEKKyAgICBwcm90byAgOj0gQ3JlYXRlUHJvdG9jb2woIHByb3RmYWN0LCBzdG0sIEZBTFNFKTsKKyAgICBjbGllbnQgOj0gVFNraXBUZXN0U2VydmljZS5UQ2xpZW50LkNyZWF0ZSggbmlsLCBwcm90byk7CisgICAgY2xpUmVmIDo9IGNsaWVudCBhcyBJVW5rbm93bjsKKyAgICBjbGllbnQuc2VuZF9QaW5nUG9uZyggcGluZywgcGluZy5TdHJ1Y3RWYWwpOworCisgIGZpbmFsbHkKKyAgICBjbGllbnQgOj0gbmlsOyAgLy8gbm90IEZyZWUhCisgICAgY2xpUmVmIDo9IG5pbDsKKyAgICBzdG0uRnJlZTsKKyAgICBpZiBjbGllbnQgPSBuaWwgdGhlbiB7d2FybmluZyBzdXBwcmVzc2VkfTsKKyAgZW5kOworCisgIERlbGV0ZUZpbGUoIGZuYW1lK1JFUVVFU1RfRVhUKTsKKyAgUmVuYW1lRmlsZSggZm5hbWUrUkVRVUVTVF9FWFQrJy50bXAnLCBmbmFtZStSRVFVRVNUX0VYVCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFJlYWRSZXNwb25zZSggcHJvdGZhY3QgOiBJUHJvdG9jb2xGYWN0b3J5OyBmbmFtZSA6IHN0cmluZyk7Cit2YXIgc3RtICAgIDogVEZpbGVTdHJlYW07CisgICAgcGluZyAgIDogSVBpbmc7CisgICAgcHJvdG8gIDogSVByb3RvY29sOworICAgIGNsaWVudCA6IFRTa2lwVGVzdFNlcnZpY2UuVENsaWVudDsgICAvLyB3ZSBuZWVkIGFjY2VzcyB0byBzZW5kL3JlY3ZfcGluZ3BvbmcoKQorICAgIGNsaVJlZiA6IElVbmtub3duOyAgICAgICAgICAgICAgICAgICAvLyBob2xkcyB0aGUgcmVmY291bnQKK2JlZ2luCisgIFdyaXRlbG4oJy0gcmVhZGluZyByZXNwb25zZScpOworICBzdG0gOj0gVEZpbGVTdHJlYW0uQ3JlYXRlKCBmbmFtZStSRVNQT05TRV9FWFQsIGZtT3BlblJlYWQpOworICB0cnkKKyAgICAvLyBzYXZlIHJlcXVlc3QgZGF0YQorICAgIHByb3RvICA6PSBDcmVhdGVQcm90b2NvbCggcHJvdGZhY3QsIHN0bSwgVFJVRSk7CisgICAgY2xpZW50IDo9IFRTa2lwVGVzdFNlcnZpY2UuVENsaWVudC5DcmVhdGUoIHByb3RvLCBuaWwpOworICAgIGNsaVJlZiA6PSBjbGllbnQgYXMgSVVua25vd247CisgICAgcGluZyAgIDo9IGNsaWVudC5yZWN2X1BpbmdQb25nOworCisgIGZpbmFsbHkKKyAgICBjbGllbnQgOj0gbmlsOyAgLy8gbm90IEZyZWUhCisgICAgY2xpUmVmIDo9IG5pbDsKKyAgICBzdG0uRnJlZTsKKyAgICBpZiBjbGllbnQgPSBuaWwgdGhlbiB7d2FybmluZyBzdXBwcmVzc2VkfTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBQcm9jZXNzRmlsZSggcHJvdGZhY3QgOiBJUHJvdG9jb2xGYWN0b3J5OyBmbmFtZSA6IHN0cmluZyk7Cit2YXIgc3RtSW4sIHN0bU91dCAgIDogVEZpbGVTdHJlYW07CisgICAgcHJvdEluLCBwcm90T3V0IDogSVByb3RvY29sOworICAgIHNlcnZlciA6IElQcm9jZXNzb3I7CitiZWdpbgorICBXcml0ZWxuKCctIHByb2Nlc3NpbmcgcmVxdWVzdCcpOworICBzdG1PdXQgOj0gbmlsOworICBzdG1JbiAgOj0gVEZpbGVTdHJlYW0uQ3JlYXRlKCBmbmFtZStSRVFVRVNUX0VYVCwgZm1PcGVuUmVhZCk7CisgIHRyeQorICAgIHN0bU91dCA6PSBURmlsZVN0cmVhbS5DcmVhdGUoIGZuYW1lK1JFU1BPTlNFX0VYVCsnLnRtcCcsIGZtQ3JlYXRlKTsKKworICAgIC8vIHByb2Nlc3MgcmVxdWVzdCBhbmQgd3JpdGUgcmVzcG9uc2UgZGF0YQorICAgIHByb3RJbiAgOj0gQ3JlYXRlUHJvdG9jb2woIHByb3RmYWN0LCBzdG1JbiwgIFRSVUUpOworICAgIHByb3RPdXQgOj0gQ3JlYXRlUHJvdG9jb2woIHByb3RmYWN0LCBzdG1PdXQsIEZBTFNFKTsKKworICAgIHNlcnZlciA6PSBUU2tpcFRlc3RTZXJ2aWNlLlRQcm9jZXNzb3JJbXBsLkNyZWF0ZSggVER1bW15U2VydmVyLkNyZWF0ZSk7CisgICAgc2VydmVyLlByb2Nlc3MoIHByb3RJbiwgcHJvdE91dCk7CisKKyAgZmluYWxseQorICAgIHNlcnZlciA6PSBuaWw7ICAvLyBub3QgRnJlZSEKKyAgICBzdG1Jbi5GcmVlOworICAgIHN0bU91dC5GcmVlOworICAgIGlmIHNlcnZlciA9IG5pbCB0aGVuIHt3YXJuaW5nIHN1cHByZXNzZWR9OworICBlbmQ7CisKKyAgRGVsZXRlRmlsZSggZm5hbWUrUkVTUE9OU0VfRVhUKTsKKyAgUmVuYW1lRmlsZSggZm5hbWUrUkVTUE9OU0VfRVhUKycudG1wJywgZm5hbWUrUkVTUE9OU0VfRVhUKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVGVzdCggcHJvdGZhY3QgOiBJUHJvdG9jb2xGYWN0b3J5OyBmbmFtZSA6IHN0cmluZyk7CitiZWdpbgorICAvLyB0cnkgdG8gcmVhZCBhbiBleGlzdGluZyByZXF1ZXN0CisgIGlmIEZpbGVFeGlzdHMoIGZuYW1lICsgUkVRVUVTVF9FWFQpIHRoZW4gYmVnaW4KKyAgICBQcm9jZXNzRmlsZSggcHJvdGZhY3QsIGZuYW1lKTsKKyAgICBSZWFkUmVzcG9uc2UoIHByb3RmYWN0LCBmbmFtZSk7CisgIGVuZDsKKworICAvLyBjcmVhdGUgYSBuZXcgcmVxdWVzdCBhbmQgdHJ5IHRvIHByb2Nlc3MKKyAgQ3JlYXRlUmVxdWVzdCggcHJvdGZhY3QsIGZuYW1lKTsKKyAgUHJvY2Vzc0ZpbGUoIHByb3RmYWN0LCBmbmFtZSk7CisgIFJlYWRSZXNwb25zZSggcHJvdGZhY3QsIGZuYW1lKTsKK2VuZDsKKworCitjb25zdAorICBGSUxFX0JJTkFSWSA9ICdwaW5ncG9uZy5iaW4nOworICBGSUxFX0pTT04gICA9ICdwaW5ncG9uZy5qc29uJzsKK2JlZ2luCisgIHRyeQorICAgIFdyaXRlbG4oICdEZWxwaGkgU2tpcFRlc3QgJytJbnRUb1N0cihUc2tpcHRlc3RfdmVyc2lvbl8yQ29uc3RhbnRzLlNLSVBURVNUU0VSVklDRV9WRVJTSU9OKSsnIHVzaW5nICcrVGhyaWZ0LlZlcnNpb24pOworCisgICAgV3JpdGVsbjsKKyAgICBXcml0ZWxuKCdCaW5hcnkgcHJvdG9jb2wnKTsKKyAgICBUZXN0KCBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZSwgRklMRV9CSU5BUlkpOworCisgICAgV3JpdGVsbjsKKyAgICBXcml0ZWxuKCdKU09OIHByb3RvY29sJyk7CisgICAgVGVzdCggVEpTT05Qcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlLCAgIEZJTEVfSlNPTik7CisKKyAgICBXcml0ZWxuOworICAgIFdyaXRlbG4oJ1Rlc3QgY29tcGxldGVkIHdpdGhvdXQgZXJyb3JzLicpOworICAgIFdyaXRlbG47CisgICAgV3JpdGUoJ1ByZXNzIEVOVEVSIHRvIGNsb3NlIC4uLicpOyAgUmVhZGxuOworICBleGNlcHQKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8KKyAgICAgIFdyaXRlbG4oRS5DbGFzc05hbWUsICc6ICcsIEUuTWVzc2FnZSk7CisgIGVuZDsKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L3R5cGVyZWdpc3RyeS9UZXN0VHlwZVJlZ2lzdHJ5LmRwciBiL2xpYi9kZWxwaGkvdGVzdC90eXBlcmVnaXN0cnkvVGVzdFR5cGVSZWdpc3RyeS5kcHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThhN2M3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC90eXBlcmVnaXN0cnkvVGVzdFR5cGVSZWdpc3RyeS5kcHIKQEAgLTAsMCArMSw5MCBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCitwcm9ncmFtIFRlc3RUeXBlUmVnaXN0cnk7CisKK3skQVBQVFlQRSBDT05TT0xFfQorCit1c2VzCisgIENsYXNzZXMsIFdpbmRvd3MsIFN5c1V0aWxzLCBHZW5lcmljcy5Db2xsZWN0aW9ucywgVHlwSW5mbywKKyAgVGhyaWZ0IGluICcuLlwuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCisgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wuSlNPTiBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5KU09OLnBhcycsCisgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAorICBUaHJpZnQuU2VydmVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAorICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKKyAgVGhyaWZ0LlNlcmlhbGl6ZXIgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU2VyaWFsaXplci5wYXMnLAorICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnLAorICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlwuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAorICBEZWJ1Z1Byb3RvVGVzdDsKKwordHlwZQorICBUZXN0ZXI8VCA6IElJbnRlcmZhY2U+ID0gY2xhc3MKKyAgcHVibGljCisgICAgY2xhc3MgcHJvY2VkdXJlIFRlc3Q7CisgIGVuZDsKKworY2xhc3MgcHJvY2VkdXJlIFRlc3RlcjxUPi5UZXN0OwordmFyIGluc3RhbmNlIDogVDsKKyAgICBuYW1lIDogc3RyaW5nOworYmVnaW4KKyAgaW5zdGFuY2UgOj0gVHlwZVJlZ2lzdHJ5LkNvbnN0cnVjdDxUPjsKKyAgbmFtZSA6PSBHZXRUeXBlTmFtZShUeXBlSW5mbyhUKSk7CisgIGlmIGluc3RhbmNlIDw+IG5pbAorICB0aGVuIFdyaXRlbG4oIG5hbWUsICcgPSBvaycpCisgIGVsc2UgYmVnaW4KKyAgICBXcml0ZWxuKCBuYW1lLCAnID0gZmFpbGVkJyk7CisgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSggJ1Rlc3Qgd2l0aCAnK25hbWUrJyBmYWlsZWQhJyk7CisgIGVuZDsKK2VuZDsKKworYmVnaW4KKyAgV3JpdGVsbignVGVzdGluZyAuLi4nKTsKKyAgVGVzdGVyPElEb3VibGVzPi5UZXN0OworICBUZXN0ZXI8SU9uZU9mRWFjaD4uVGVzdDsKKyAgVGVzdGVyPElCb25rPi5UZXN0OworICBUZXN0ZXI8SU5lc3Rpbmc+LlRlc3Q7CisgIFRlc3RlcjxJSG9seU1vbGV5Pi5UZXN0OworICBUZXN0ZXI8SUJhY2t3YXJkcz4uVGVzdDsKKyAgVGVzdGVyPElFbXB0eT4uVGVzdDsKKyAgVGVzdGVyPElXcmFwcGVyPi5UZXN0OworICBUZXN0ZXI8SVJhbmRvbVN0dWZmPi5UZXN0OworICBUZXN0ZXI8SUJhc2U2ND4uVGVzdDsKKyAgVGVzdGVyPElDb21wYWN0UHJvdG9UZXN0U3RydWN0Pi5UZXN0OworICBUZXN0ZXI8SVNpbmdsZU1hcFRlc3RTdHJ1Y3Q+LlRlc3Q7CisgIFRlc3RlcjxJQmxvd1VwPi5UZXN0OworICBUZXN0ZXI8SVJldmVyc2VPcmRlclN0cnVjdD4uVGVzdDsKKyAgVGVzdGVyPElTdHJ1Y3RXaXRoU29tZUVudW0+LlRlc3Q7CisgIFRlc3RlcjxJVGVzdFVuaW9uPi5UZXN0OworICBUZXN0ZXI8SVRlc3RVbmlvbk1pbnVzU3RyaW5nRmllbGQ+LlRlc3Q7CisgIFRlc3RlcjxJQ29tcGFyYWJsZVVuaW9uPi5UZXN0OworICBUZXN0ZXI8SVN0cnVjdFdpdGhBVW5pb24+LlRlc3Q7CisgIFRlc3RlcjxJUHJpbWl0aXZlVGhlblN0cnVjdD4uVGVzdDsKKyAgVGVzdGVyPElTdHJ1Y3RXaXRoQVNvbWVtYXA+LlRlc3Q7CisgIFRlc3RlcjxJQmlnRmllbGRJZFN0cnVjdD4uVGVzdDsKKyAgVGVzdGVyPElCcmVha3NSdWJ5Q29tcGFjdFByb3RvY29sPi5UZXN0OworICBUZXN0ZXI8SVR1cGxlUHJvdG9jb2xUZXN0U3RydWN0Pi5UZXN0OworICBXcml0ZWxuKCdDb21wbGV0ZWQuJyk7CisKKworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZXJsL01ha2VmaWxlLmFtIGIvbGliL2VybC9NYWtlZmlsZS5hbQppbmRleCBhMzYzY2Y0Li4wNjMyM2I0IDEwMDY0NAotLS0gYS9saWIvZXJsL01ha2VmaWxlLmFtCisrKyBiL2xpYi9lcmwvTWFrZWZpbGUuYW0KQEAgLTE4LDIwICsxOCw0NCBAQAogIwogCiBUSFJJRlQgPSAuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0Ci1USFJJRlRfRklMRVMgPSAkKHdpbGRjYXJkIC4uLy4uL3Rlc3QvKi50aHJpZnQpIFwKLQkJCSAgICQod2lsZGNhcmQgdGVzdC8qLnRocmlmdCkKK1RIUklGVF9PTUlUX0ZJTEUgPSB0ZXN0L1RocmlmdF9vbWl0X3dpdGhvdXQudGhyaWZ0CitUSFJJRlRfRklMRVMgPSAkKHdpbGRjYXJkIHRlc3QvKi50aHJpZnQpIFwKKwkJICAkKFRIUklGVF9PTUlUX0ZJTEUpIFwKKwkJICAuLi8uLi90ZXN0L0NvbnN0YW50c0RlbW8udGhyaWZ0IFwKKwkJICAuLi8uLi90ZXN0L05hbWVDb25mbGljdFRlc3QudGhyaWZ0IFwKKwkJICAuLi8uLi90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IFwKKwkJICAuLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CiAKLS5nZW5lcmF0ZWQ6ICQoVEhSSUZUX0ZJTEVTKQoraWYgRVJMQU5HX09UUDE2CitFUkxfRkxBRyA9IGVybDpvdHAxNgorRVJMX0ZMQUdfTEVHQUNZID0gZXJsOm90cDE2LGxlZ2FjeW5hbWVzCisjIG90cDE2ICsgbWFwcyBkb2VzIG5vdCBtYWtlIHNlbnNlLiBXZSBuZWVkIHRvIGdlbmVyYXRlIGl0IGFueXdheSB0byBhdm9pZCBpbmNsdWRlIGVycm9yLgorRVJMX0ZMQUdfTUFQUyA9IGVybDpvdHAxNgorZWxzZQorRVJMX0ZMQUcgPSBlcmwKK0VSTF9GTEFHX0xFR0FDWSA9IGVybDpsZWdhY3luYW1lcworRVJMX0ZMQUdfTUFQUyA9IGVybDptYXBzCitlbmRpZgorCiskKFRIUklGVF9PTUlUX0ZJTEUpOiB0ZXN0L1RocmlmdF9vbWl0X3dpdGgudGhyaWZ0CisJZ3JlcCAtdiBvbWl0ICQ8ID4kQAorCisuZ2VuZXJhdGVkOiAkKFRIUklGVCkgJChUSFJJRlRfRklMRVMpCiAJZm9yIGYgaW4gJChUSFJJRlRfRklMRVMpIDsgZG8gXAotCSAgJChUSFJJRlQpIC0tZ2VuIGVybCAtb3V0IHRlc3QgJCRmIDsgXAotCWRvbmUgOyBcCisJCSQoVEhSSUZUKSAtLWdlbiAkKEVSTF9GTEFHKSAtbyB0ZXN0ICQkZiA7IFwKKwlkb25lCisJJChUSFJJRlQpIC0tZ2VuICQoRVJMX0ZMQUdfTEVHQUNZKSAtbyB0ZXN0IHRlc3QvZmxhZ3MvTGVnYWN5TmFtZXMudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuICQoRVJMX0ZMQUdfTUFQUykgLW8gdGVzdCB0ZXN0L2ZsYWdzL1RocmlmdDMyMTQudGhyaWZ0CiAJdG91Y2ggLmdlbmVyYXRlZAogCiBhbGw6IC5nZW5lcmF0ZWQKLQkuL3JlYmFyIGNvbXBpbGUKKwkkKFJFQkFSKSBnZXQtZGVwcworCSQoUkVCQVIpIGNvbXBpbGUKIAogY2hlY2s6IC5nZW5lcmF0ZWQKLQkuL3JlYmFyIGV1bml0CisJJChSRUJBUikgLUMgcmViYXIudGVzdC5jb25maWcgZ2V0LWRlcHMKKwkkKFJFQkFSKSAtQyByZWJhci50ZXN0LmNvbmZpZyBjb21waWxlCisJJChSRUJBUikgLUMgcmViYXIudGVzdC5jb25maWcgc2tpcF9kZXBzPXRydWUgZXVuaXQKIAogaW5zdGFsbDogYWxsCiAJbWtkaXIgLXAgJChERVNURElSKSQoRVJMQU5HX0lOU1RBTExfTElCX0RJUl90aHJpZnQpIDsgXApAQCAtNDYsMzUgKzcwLDIyIEBACiAJcm0gLXJmICQoREVTVERJUikkKEVSTEFOR19JTlNUQUxMX0xJQl9ESVJfdGhyaWZ0KQogCiBjbGVhbjoKLQlybSAuZ2VuZXJhdGVkCi0JLi9yZWJhciBjbGVhbgorCXJtIC1mIC5nZW5lcmF0ZWQKKwlybSAtcmYgdGVzdC9nZW4tZXJsLworCXJtIC1mICQoVEhSSUZUX09NSVRfRklMRSkKKwkkKFJFQkFSKSBjbGVhbgogCiBtYWludGFpbmVyLWNsZWFuLWxvY2FsOgotCXJtIC1mIHRlc3Qvc2Vjb25kU2VydmljZV8qIFwKLQkJICB0ZXN0L2FTZXJ2aWNlXyogXAotCQkgIHRlc3Qvc2VydmljZUZvckV4Y2VwdGlvbldpdGhBTWFwXyogXAotCQkgIHRlc3QvYW5ub3RhdGlvblRlc3RfKiBcCi0JCSAgdGVzdC9zZXJ2aWNlXyogXAotCQkgIHRlc3QvY29uc3RhbnRzRGVtb18qIFwKLQkJICB0ZXN0L3NtYWxsU2VydmljZV8qIFwKLQkJICB0ZXN0L3NtYWxsVGVzdF8qIFwKLQkJICB0ZXN0L2RlYnVnUHJvdG9UZXN0XyogXAotCQkgIHRlc3Qvc3J2XyogXAotCQkgIHRlc3QvZGVuc2VMaW5raW5nVGVzdF8qIFwKLQkJICB0ZXN0L3N0cmVzc1Rlc3RfKiBcCi0JCSAgdGVzdC9kb2NUZXN0XyogXAotCQkgIHRlc3QvZW1wdHlTZXJ2aWNlXyogXAotCQkgIHRlc3QvaW5oZXJpdGVkXyogXAotCQkgIHRlc3QvamF2YUJlYW5zVGVzdF8qIFwKLQkJICB0ZXN0L3RocmlmdDExNTFfKiBcCi0JCSAgdGVzdC9qYXZhQmVhbnNUZXN0XyogXAotCQkgIHRlc3QvbWFueVR5cGVkZWZzXyogXAotCQkgIHRlc3QvdGhyaWZ0VGVzdF8qIFwKLQkJICB0ZXN0L29wdGlvbmFsUmVxdWlyZWRUZXN0XyogXAotCQkgIHRlc3QveW93emFfKiBcCi0JCSAgdGVzdC9yZXZlcnNlT3JkZXJTZXJ2aWNlXyoKIAlybSAtcmYgZWJpbgogCi1FWFRSQV9ESVNUID0gaW5jbHVkZSBzcmMgcmViYXIgcmViYXIuY29uZmlnCitFWFRSQV9ESVNUID0gXAorCWluY2x1ZGUgXAorCXNyYyBcCisJY29kaW5nX3N0YW5kYXJkcy5tZCBcCisJcmViYXIuY29uZmlnIFwKKwlyZWJhci5jb25maWcuc2NyaXB0IFwKKwlyZWJhci50ZXN0LmNvbmZpZyBcCisJdGVzdCBcCisJUkVBRE1FLm1kCiAKIE1BSU5UQUlORVJDTEVBTkZJTEVTID0gTWFrZWZpbGUuaW4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvUkVBRE1FIGIvbGliL2VybC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2N2M1NDkuLjAwMDAwMDAKLS0tIGEvbGliL2VybC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi1UaHJpZnQgRXJsYW5nIFNvZnR3YXJlIExpYnJhcnkKLQotTGljZW5zZQotPT09PT09PQotCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLQotRXhhbXBsZQotPT09PT09PQotCi1FeGFtcGxlIHNlc3Npb24gdXNpbmcgdGhyaWZ0X2NsaWVudDoKLQotMT4ge29rLCBDMH0gPSB0aHJpZnRfY2xpZW50X3V0aWw6bmV3KCJsb2NhbGhvc3QiLCA5MDkwLCB0aHJpZnRUZXN0X3RocmlmdCwgW10pLCBvay4KLW9rCi0yPiB7QzEsIFIxfSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDMCwgdGVzdFZvaWQsIFtdKSwgUjEuCi17b2ssb2t9Ci0zPiB7QzIsIFIyfSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDMSwgdGVzdFZvaWQsIFthc2RmXSksIFIyLgote2Vycm9yLHtiYWRfYXJncyx0ZXN0Vm9pZCxbYXNkZl19fQotND4ge0MzLCBSM30gPSB0aHJpZnRfY2xpZW50OmNhbGwoQzIsIHRlc3RJMzIsIFsxMjNdKSwgUjMuCi17b2ssMTIzfQotNT4ge0M0LCBSNH0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQzMsIHRlc3RPbmV3YXksIFsxXSksIFI0Lgote29rLG9rfQotNj4ge0M1LCBSNX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQzQsIHRlc3RYY2VwdGlvbiwgWyJmb28iXSksIFI1Lgote2Vycm9yLHtub19mdW5jdGlvbix0ZXN0WGNlcHRpb259fQotNz4ge0M2LCBSNn0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQzUsIHRlc3RFeGNlcHRpb24sIFsiZm9vIl0pLCBSNi4KLXtvayxva30KLTg+IHtDNywgUjd9ID0gKGNhdGNoIHRocmlmdF9jbGllbnQ6Y2FsbChDNiwgdGVzdEV4Y2VwdGlvbiwgWyJYY2VwdGlvbiJdKSksIFI3Lgote2V4Y2VwdGlvbix7eGNlcHRpb24sMTAwMSw8PCJYY2VwdGlvbiI+Pn19CmRpZmYgLS1naXQgYS9saWIvZXJsL1JFQURNRS5tZCBiL2xpYi9lcmwvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzM2QwNWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL1JFQURNRS5tZApAQCAtMCwwICsxLDUxIEBACisjIFRocmlmdCBFcmxhbmcgU29mdHdhcmUgTGlicmFyeSAjCisKKyMjIExpY2Vuc2UgIyMKKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKyMjIFJlbGVhc2UgTm90ZXMgIyMKKworIyMjIDAuOS4yICMjIworCithcyBvZiAwLjkuMiBzdHJ1Y3QgYW5kIGZ1bmN0aW9uIG5hbWluZyBjb252ZW50aW9ucyBoYXZlIGNoYW5nZWQuIHRvIHJldGFpbiB0aGUKK29sZCBuYW1pbmcgY29udmVudGlvbnMgKGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSkgdXNlIHRoZSBjb21waWxlciBvcHRpb24KK2BsZWdhY3luYW1lc2AKKworIyMgRXhhbXBsZSAjIworCitFeGFtcGxlIHNlc3Npb24gdXNpbmcgdGhyaWZ0X2NsaWVudDoKKworYGBgZXJsCisxPiB7b2ssIEMwfSA9IHRocmlmdF9jbGllbnRfdXRpbDpuZXcoImxvY2FsaG9zdCIsIDkwOTAsIHRocmlmdF90ZXN0X3RocmlmdCwgW10pLCBvay4KK29rCisyPiB7QzEsIFIxfSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDMCwgdGVzdFZvaWQsIFtdKSwgUjEuCit7b2ssb2t9CiszPiB7QzIsIFIyfSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDMSwgdGVzdFZvaWQsIFthc2RmXSksIFIyLgore2Vycm9yLHtiYWRfYXJncyx0ZXN0Vm9pZCxbYXNkZl19fQorND4ge0MzLCBSM30gPSB0aHJpZnRfY2xpZW50OmNhbGwoQzIsIHRlc3RJMzIsIFsxMjNdKSwgUjMuCit7b2ssMTIzfQorNT4ge0M0LCBSNH0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQzMsIHRlc3RPbmV3YXksIFsxXSksIFI0Lgore29rLG9rfQorNj4ge0M1LCBSNX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQzQsIHRlc3RYY2VwdGlvbiwgWyJmb28iXSksIFI1Lgore2Vycm9yLHtub19mdW5jdGlvbix0ZXN0WGNlcHRpb259fQorNz4ge0M2LCBSNn0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQzUsIHRlc3RFeGNlcHRpb24sIFsiZm9vIl0pLCBSNi4KK3tvayxva30KKzg+IHtDNywgUjd9ID0gKGNhdGNoIHRocmlmdF9jbGllbnQ6Y2FsbChDNiwgdGVzdEV4Y2VwdGlvbiwgWyJYY2VwdGlvbiJdKSksIFI3Lgore2V4Y2VwdGlvbix7eGNlcHRpb24sMTAwMSw8PCJYY2VwdGlvbiI+Pn19CitgYGAKZGlmZiAtLWdpdCBhL2xpYi9lcmwvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9lcmwvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDM3ZGJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEsMyBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCisKK1BhcnRpY3VsYXJseSBmb3IgRXJsYW5nIHBsZWFzZSBmb2xsb3cgdGhlIEVybGFuZyBbUHJvZ3JhbW1pbmcgUnVsZXMgYW5kIENvbnZlbnRpb25zXShodHRwOi8vd3d3LmVybGFuZy5zZS9kb2MvcHJvZ3JhbW1pbmdfcnVsZXMuc2h0bWwpLiAKZGlmZiAtLWdpdCBhL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfY29uc3RhbnRzLmhybCBiL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfY29uc3RhbnRzLmhybAppbmRleCA2MWQ4ZTFhLi43Y2IyOWViIDEwMDY0NAotLS0gYS9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X2NvbnN0YW50cy5ocmwKKysrIGIvbGliL2VybC9pbmNsdWRlL3RocmlmdF9jb25zdGFudHMuaHJsCkBAIC0yMiw2ICsyMiw3IEBACiAtZGVmaW5lKHRUeXBlX1ZPSUQsIDEpLgogLWRlZmluZSh0VHlwZV9CT09MLCAyKS4KIC1kZWZpbmUodFR5cGVfQllURSwgMykuCistZGVmaW5lKHRUeXBlX0k4LCAzKS4KIC1kZWZpbmUodFR5cGVfRE9VQkxFLCA0KS4KIC1kZWZpbmUodFR5cGVfSTE2LCA2KS4KIC1kZWZpbmUodFR5cGVfSTMyLCA4KS4KQEAgLTUzLDQgKzU0LDkgQEAKIC1kZWZpbmUoVEFwcGxpY2F0aW9uRXhjZXB0aW9uX01JU1NJTkdfUkVTVUxULCA1KS4KIC1kZWZpbmUoVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lOVEVSTkFMX0VSUk9SLCA2KS4KIC1kZWZpbmUoVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1BST1RPQ09MX0VSUk9SLCA3KS4KKy1kZWZpbmUoVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lOVkFMSURfVFJBTlNGT1JNLCA4KS4KKy1kZWZpbmUoVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lOVkFMSURfUFJPVE9DT0wsIDkpLgorLWRlZmluZShUQXBwbGljYXRpb25FeGNlcHRpb25fVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUsIDEwKS4KIAorLWRlZmluZSAoTVVMVElQTEVYRURfU0VSVklDRV9TRVBBUkFUT1IsICI6IikuCistZGVmaW5lIChNVUxUSVBMRVhFRF9FUlJPUl9IQU5ETEVSX0tFWSwgImVycm9yX2hhbmRsZXIiKS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfcHJvdG9jb2wuaHJsIGIvbGliL2VybC9pbmNsdWRlL3RocmlmdF9wcm90b2NvbC5ocmwKaW5kZXggZjg1ZjQ1NS4uYmMwYWNjOCAxMDA2NDQKLS0tIGEvbGliL2VybC9pbmNsdWRlL3RocmlmdF9wcm90b2NvbC5ocmwKKysrIGIvbGliL2VybC9pbmNsdWRlL3RocmlmdF9wcm90b2NvbC5ocmwKQEAgLTIwLDEyICsyMCwxMiBAQAogLWlmbmRlZihUSFJJRlRfUFJPVE9DT0xfSU5DTFVERUQpLgogLWRlZmluZShUSFJJRlRfUFJPVE9DT0xfSU5DTFVERUQsIHRydWUpLgogCi0tcmVjb3JkKHByb3RvY29sX21lc3NhZ2VfYmVnaW4sIHtuYW1lLCB0eXBlLCBzZXFpZH0pLgotLXJlY29yZChwcm90b2NvbF9zdHJ1Y3RfYmVnaW4sIHtuYW1lfSkuCi0tcmVjb3JkKHByb3RvY29sX2ZpZWxkX2JlZ2luLCB7bmFtZSwgdHlwZSwgaWR9KS4KLS1yZWNvcmQocHJvdG9jb2xfbWFwX2JlZ2luLCB7a3R5cGUsIHZ0eXBlLCBzaXplfSkuCi0tcmVjb3JkKHByb3RvY29sX2xpc3RfYmVnaW4sIHtldHlwZSwgc2l6ZX0pLgotLXJlY29yZChwcm90b2NvbF9zZXRfYmVnaW4sIHtldHlwZSwgc2l6ZX0pLgorLXJlY29yZChwcm90b2NvbF9tZXNzYWdlX2JlZ2luLCB7bmFtZSA6OiBzdHJpbmcoKSwgdHlwZSA6OiBpbnRlZ2VyKCksIHNlcWlkIDo6IGludGVnZXIoKX0pLgorLXJlY29yZChwcm90b2NvbF9zdHJ1Y3RfYmVnaW4sIHtuYW1lIDo6IHN0cmluZygpfSkuCistcmVjb3JkKHByb3RvY29sX2ZpZWxkX2JlZ2luLCB7bmFtZSA6OiBzdHJpbmcoKSwgdHlwZSA6OiBpbnRlZ2VyKCksIGlkIDo6IGludGVnZXIoKX0pLgorLXJlY29yZChwcm90b2NvbF9tYXBfYmVnaW4sIHtrdHlwZSA6OiBpbnRlZ2VyKCksIHZ0eXBlIDo6IGludGVnZXIoKSwgc2l6ZSA6OiBpbnRlZ2VyKCl9KS4KKy1yZWNvcmQocHJvdG9jb2xfbGlzdF9iZWdpbiwge2V0eXBlIDo6IGludGVnZXIoKSwgc2l6ZSA6OiBpbnRlZ2VyKCl9KS4KKy1yZWNvcmQocHJvdG9jb2xfc2V0X2JlZ2luLCB7ZXR5cGUgOjogaW50ZWdlcigpLCBzaXplIDo6IGludGVnZXIoKX0pLgogCiAtdHlwZSB0cHJvdF9oZWFkZXJfdmFsKCkgOjogI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57fQogICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fQpkaWZmIC0tZ2l0IGEvbGliL2VybC9yZWJhciBiL2xpYi9lcmwvcmViYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUzNDE5ZWEuLjAwMDAwMDAKLS0tIGEvbGliL2VybC9yZWJhcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9lcmwvcmViYXIuY29uZmlnIGIvbGliL2VybC9yZWJhci5jb25maWcKaW5kZXggN2ViMjZiMi4uMWVhMThhNCAxMDA2NDQKLS0tIGEvbGliL2VybC9yZWJhci5jb25maWcKKysrIGIvbGliL2VybC9yZWJhci5jb25maWcKQEAgLTEsMyArMSBAQAote2VybF9vcHRzLCBbZGVidWdfaW5mb119LgotJSB7cHJlX2hvb2tzLCBbe2NvbXBpbGUsICIuL3NjcmlwdHMvcmViYXItcHJlLWNvbXBpbGUifSwKLSUgICAgICAgICAgICAge2NsZWFuLCAiLi9zY3JpcHRzL3JlYmFyLWNsZWFuIn1dfS4KK3tlcmxfb3B0cywgW3twbGF0Zm9ybV9kZWZpbmUsICJeUi4qIiwgb3RwMTZfb3JfbGVzc30sIGRlYnVnX2luZm9dfS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvcmViYXIuY29uZmlnLnNjcmlwdCBiL2xpYi9lcmwvcmViYXIuY29uZmlnLnNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzMzODIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC9yZWJhci5jb25maWcuc2NyaXB0CkBAIC0wLDAgKzEsNyBAQAorRGVmMCA9IGNhc2Ugbm90IGVybGFuZzppc19idWlsdGluKGVybGFuZywgbW9ub3RvbmljX3RpbWUsIDApIG9mCisgICAgICAgICAgIHRydWUgLT4gW107CisgICAgICAgICAgIGZhbHNlIC0+IFt7ZCwgdGltZV9jb3JyZWN0aW9ufV0KKyAgICAgICBlbmQsCitEZWZzID0gRGVmMCwKK2xpc3RzOmtleXN0b3JlKGVybF9vcHRzLCAxLCBDT05GSUcsCisgICAgICAgICAgICAgICB7ZXJsX29wdHMsIHByb3BsaXN0czpnZXRfdmFsdWUoZXJsX29wdHMsIENPTkZJRywgW10pICsrIERlZnN9KS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvcmViYXIudGVzdC5jb25maWcgYi9saWIvZXJsL3JlYmFyLnRlc3QuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZjJhZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3JlYmFyLnRlc3QuY29uZmlnCkBAIC0wLDAgKzEsNSBAQAore2VybF9vcHRzLCBbe3BsYXRmb3JtX2RlZmluZSwgIl5SLioiLCBvdHAxNl9vcl9sZXNzfSwgZGVidWdfaW5mb119LgorCit7ZGVwcywgWworICB7bWVjaywgIiIsIHtnaXQsICJodHRwczovL2dpdGh1Yi5jb20vZXByb3h1cy9tZWNrLmdpdCIsIHt0YWcsICIwLjguOSJ9fX0KK119LgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0LmFwcC5zcmMgYi9saWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2IyMjVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0LmFwcC5zcmMKQEAgLTAsMCArMSw3NCBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCislJSUgLSotIG1vZGU6ZXJsYW5nIC0qLQore2FwcGxpY2F0aW9uLCB0aHJpZnQsIFsKKyAgJSBBIHF1aWNrIGRlc2NyaXB0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbi4KKyAge2Rlc2NyaXB0aW9uLCAiVGhyaWZ0IGJpbmRpbmdzIn0sCisKKyAgJSBUaGUgdmVyc2lvbiBvZiB0aGUgYXBwbGljYXRvbgorICB7dnNuLCAiMS4wLjAifSwKKworICAlIEFsbCBtb2R1bGVzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICB7bW9kdWxlcywgWworICAgIHRocmlmdF9iYXNlNjRfdHJhbnNwb3J0LAorICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2wsCisgICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydCwKKyAgICB0aHJpZnRfY2xpZW50X3V0aWwsCisgICAgdGhyaWZ0X2NsaWVudCwKKyAgICB0aHJpZnRfZGlza19sb2dfdHJhbnNwb3J0LAorICAgIHRocmlmdF9maWxlX3RyYW5zcG9ydCwKKyAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydCwKKyAgICB0aHJpZnRfaHR0cF90cmFuc3BvcnQsCisgICAgdGhyaWZ0X2pzb25fcGFyc2VyLAorICAgIHRocmlmdF9qc29uX3Byb3RvY29sLAorICAgIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LAorICAgIHRocmlmdF9tZW1vcnlfYnVmZmVyLAorICAgIHRocmlmdF9wcm9jZXNzb3IsCisgICAgdGhyaWZ0X3Byb3RvY29sLAorICAgIHRocmlmdF9yZWNvbm5lY3RpbmdfY2xpZW50LAorICAgIHRocmlmdF9zZXJ2ZXIsCisgICAgdGhyaWZ0X3NlcnZpY2UsCisgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXIsCisgICAgdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQsCisgICAgdGhyaWZ0X3RyYW5zcG9ydF9zdGF0ZV90ZXN0LAorICAgIHRocmlmdF90cmFuc3BvcnQKKyAgXX0sCisKKyAgJSBBbGwgb2YgdGhlIHJlZ2lzdGVyZWQgbmFtZXMgdGhlIGFwcGxpY2F0aW9uIHVzZXMuIFRoaXMgY2FuIGJlIGlnbm9yZWQuCisgIHtyZWdpc3RlcmVkLCBbXX0sCisKKyAgJSBBcHBsaWNhdGlvbnMgdGhhdCBhcmUgdG8gYmUgc3RhcnRlZCBwcmlvciB0byB0aGlzIG9uZS4gVGhpcyBjYW4gYmUgaWdub3JlZAorICAlIGxlYXZlIGl0IGFsb25lIHVubGVzcyB5b3UgdW5kZXJzdGFuZCBpdCB3ZWxsIGFuZCBsZXQgdGhlIC5yZWwgZmlsZXMgaW4KKyAgJSB5b3VyIHJlbGVhc2UgaGFuZGxlIHRoaXMuCisgIHthcHBsaWNhdGlvbnMsIFtrZXJuZWwsIHN0ZGxpYl19LAorCisgICUgT1RQIGFwcGxpY2F0aW9uIGxvYWRlciB3aWxsIGxvYWQsIGJ1dCBub3Qgc3RhcnQsIGluY2x1ZGVkIGFwcHMuIEFnYWluCisgICUgdGhpcyBjYW4gYmUgaWdub3JlZCBhcyB3ZWxsLiAgVG8gbG9hZCBidXQgbm90IHN0YXJ0IGFuIGFwcGxpY2F0aW9uIGl0CisgICUgaXMgZWFzaWVyIHRvIGluY2x1ZGUgaXQgaW4gdGhlIC5yZWwgZmlsZSBmb2xsb3dlZCBieSB0aGUgYXRvbSAnbm9uZScKKyAge2luY2x1ZGVkX2FwcGxpY2F0aW9ucywgW119LAorCisgICUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHNpbWlsYXIgdG8gdGhvc2UgaW4gdGhlIGNvbmZpZyBmaWxlIHNwZWNpZmllZAorICAlIG9uIHRoZSBjb21tYW5kIGxpbmUuIGNhbiBiZSBmZXRjaGVkIHdpdGggZ2FzOmdldF9lbnYKKyAge2VudiwgWworICAgICUgSWYgYW4gZXJyb3IvY3Jhc2ggb2NjdXJzIGR1cmluZyBwcm9jZXNzaW5nIG9mIGEgZnVuY3Rpb24sCisgICAgJSBzaG91bGQgdGhlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBzZXJpYWxpemVkIGJhY2sgdG8gdGhlIGNsaWVudAorICAgICUgaW5jbHVkZSB0aGUgZXJsYW5nIGJhY2t0cmFjZT8KKyAgICB7ZXhjZXB0aW9uc19pbmNsdWRlX3RyYWNlcywgdHJ1ZX0KKyAgXX0KK119LgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0LmFwcC5zcmMuaW4gYi9saWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyYy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2YzRjMS4uMDAwMDAwMAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyYy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSUlCi0lJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0lJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0lJQotJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSUlCi0lJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0lJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0lJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotJSUgdW5kZXIgdGhlIExpY2Vuc2UuCi0lJQotJSUlIC0qLSBtb2RlOmVybGFuZyAtKi0KLXthcHBsaWNhdGlvbiwgQFBBQ0tBR0VfTkFNRUAsCi0gWwotICAlIEEgcXVpY2sgZGVzY3JpcHRpb24gb2YgdGhlIGFwcGxpY2F0aW9uLgotICB7ZGVzY3JpcHRpb24sICJUaHJpZnQgYmluZGluZ3MifSwKLQotICAlIFRoZSB2ZXJzaW9uIG9mIHRoZSBhcHBsaWNhdG9uCi0gIHt2c24sICJAUEFDS0FHRV9WRVJTSU9OQCJ9LAotCi0gICUgQWxsIG1vZHVsZXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uCi0gIHttb2R1bGVzLCBbCi0gICBdfSwKLQotICAlIEFsbCBvZiB0aGUgcmVnaXN0ZXJlZCBuYW1lcyB0aGUgYXBwbGljYXRpb24gdXNlcy4gVGhpcyBjYW4gYmUgaWdub3JlZC4KLSAge3JlZ2lzdGVyZWQsIFtdfSwKLQotICAlIEFwcGxpY2F0aW9ucyB0aGF0IGFyZSB0byBiZSBzdGFydGVkIHByaW9yIHRvIHRoaXMgb25lLiBUaGlzIGNhbiBiZSBpZ25vcmVkCi0gICUgbGVhdmUgaXQgYWxvbmUgdW5sZXNzIHlvdSB1bmRlcnN0YW5kIGl0IHdlbGwgYW5kIGxldCB0aGUgLnJlbCBmaWxlcyBpbgotICAlIHlvdXIgcmVsZWFzZSBoYW5kbGUgdGhpcy4KLSAge2FwcGxpY2F0aW9ucywKLSAgIFsKLSAgICBrZXJuZWwsCi0gICAgc3RkbGliCi0gICBdfSwKLQotICAlIE9UUCBhcHBsaWNhdGlvbiBsb2FkZXIgd2lsbCBsb2FkLCBidXQgbm90IHN0YXJ0LCBpbmNsdWRlZCBhcHBzLiBBZ2FpbgotICAlIHRoaXMgY2FuIGJlIGlnbm9yZWQgYXMgd2VsbC4gIFRvIGxvYWQgYnV0IG5vdCBzdGFydCBhbiBhcHBsaWNhdGlvbiBpdAotICAlIGlzIGVhc2llciB0byBpbmNsdWRlIGl0IGluIHRoZSAucmVsIGZpbGUgZm9sbG93ZWQgYnkgdGhlIGF0b20gJ25vbmUnCi0gIHtpbmNsdWRlZF9hcHBsaWNhdGlvbnMsIFtdfSwKLQotICAlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBzaW1pbGFyIHRvIHRob3NlIGluIHRoZSBjb25maWcgZmlsZSBzcGVjaWZpZWQKLSAgJSBvbiB0aGUgY29tbWFuZCBsaW5lLiBjYW4gYmUgZmV0Y2hlZCB3aXRoIGdhczpnZXRfZW52Ci0gIHtlbnYsIFsKLSAgICAgICAgICUgSWYgYW4gZXJyb3IvY3Jhc2ggb2NjdXJzIGR1cmluZyBwcm9jZXNzaW5nIG9mIGEgZnVuY3Rpb24sCi0gICAgICAgICAlIHNob3VsZCB0aGUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHNlcmlhbGl6ZWQgYmFjayB0byB0aGUgY2xpZW50Ci0gICAgICAgICAlIGluY2x1ZGUgdGhlIGVybGFuZyBiYWNrdHJhY2U/Ci0gICAgICAgICB7ZXhjZXB0aW9uc19pbmNsdWRlX3RyYWNlcywgdHJ1ZX0KLSAgXX0KLSBdCi19LgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmVybAppbmRleCA4MDBmZDhlLi44NWFiYjYyIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmVybApAQCAtMzMzLDExICszMzMsMTUgQEAKIG5ld19wcm90b2NvbF9mYWN0b3J5KFRyYW5zcG9ydEZhY3RvcnksIE9wdGlvbnMpIC0+CiAgICAgUGFyc2VkT3B0cyA9IHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhPcHRpb25zLCAjdGJwX29wdHN7fSksCiAgICAgRiA9IGZ1bigpIC0+Ci0gICAgICAgICAgICAgICAge29rLCBUcmFuc3BvcnR9ID0gVHJhbnNwb3J0RmFjdG9yeSgpLAotICAgICAgICAgICAgICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KAotICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgW3tzdHJpY3RfcmVhZCwgIFBhcnNlZE9wdHMjdGJwX29wdHMuc3RyaWN0X3JlYWR9LAotICAgICAgICAgICAgICAgICAgIHtzdHJpY3Rfd3JpdGUsIFBhcnNlZE9wdHMjdGJwX29wdHMuc3RyaWN0X3dyaXRlfV0pCisgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydEZhY3RvcnkoKSBvZgorICAgICAgICAgICAgICAgICAgICB7b2ssIFRyYW5zcG9ydH0gLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbe3N0cmljdF9yZWFkLCAgUGFyc2VkT3B0cyN0YnBfb3B0cy5zdHJpY3RfcmVhZH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHJpY3Rfd3JpdGUsIFBhcnNlZE9wdHMjdGJwX29wdHMuc3RyaWN0X3dyaXRlfV0pOworICAgICAgICAgICAgICAgICAgICB7ZXJyb3IsIEVycm9yfSAtPgorICAgICAgICAgICAgICAgICAgICAgICAge2Vycm9yLCBFcnJvcn0KKyAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgZW5kLAogICAgIHtvaywgRn0uCiAKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5lcmwKaW5kZXggZDRkNjE0ZS4uZTlkM2ZmZiAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5lcmwKQEAgLTIxLDU3ICsyMSw3OCBAQAogCiAtYmVoYXZpb3VyKHRocmlmdF90cmFuc3BvcnQpLgogCi0lJSBBUEkKLS1leHBvcnQoW25ldy8xLCBuZXdfdHJhbnNwb3J0X2ZhY3RvcnkvMV0pLgorJSUgY29uc3RydWN0b3IKKy1leHBvcnQoW25ldy8xXSkuCislJSBwcm90b2NvbCBjYWxsYmFja3MKKy1leHBvcnQoW3JlYWQvMiwgcmVhZF9leGFjdC8yLCB3cml0ZS8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCislJSBsZWdhY3kgYXBpCistZXhwb3J0KFtuZXdfdHJhbnNwb3J0X2ZhY3RvcnkvMV0pLgogCi0lJSB0aHJpZnRfdHJhbnNwb3J0IGNhbGxiYWNrcwotLWV4cG9ydChbd3JpdGUvMiwgcmVhZC8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCiAKLS1yZWNvcmQoYnVmZmVyZWRfdHJhbnNwb3J0LCB7d3JhcHBlZCwgJSBhIHRocmlmdF90cmFuc3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfYnVmZmVyICUgaW9saXN0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS4KLS10eXBlIHN0YXRlKCkgOjogI2J1ZmZlcmVkX3RyYW5zcG9ydHt9LgorLXJlY29yZCh0X2J1ZmZlcmVkLCB7CisgIHdyYXBwZWQsCisgIHdyaXRlX2J1ZmZlcgorfSkuCisKKy10eXBlIHN0YXRlKCkgOjogI3RfYnVmZmVyZWR7fS4KKworCistc3BlYyBuZXcoVHJhbnNwb3J0Ojp0aHJpZnRfdHJhbnNwb3J0OnRfdHJhbnNwb3J0KCkpIC0+CisgIHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KKworbmV3KFdyYXBwZWQpIC0+CisgIFN0YXRlID0gI3RfYnVmZmVyZWR7CisgICAgd3JhcHBlZCA9IFdyYXBwZWQsCisgICAgd3JpdGVfYnVmZmVyID0gW10KKyAgfSwKKyAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgorCisKIC1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KIAogCi1uZXcoV3JhcHBlZFRyYW5zcG9ydCkgLT4KLSAgICBTdGF0ZSA9ICNidWZmZXJlZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWRUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2J1ZmZlciA9IFtdfSwKLSAgICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCislJSByZWFkcyBkYXRhIHRocm91Z2ggZnJvbSB0aGUgd3JhcHBlZCB0cmFuc3BvcnQKK3JlYWQoU3RhdGUgPSAjdF9idWZmZXJlZHt3cmFwcGVkID0gV3JhcHBlZH0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICB7TmV3U3RhdGUsIFJlc3BvbnNlfSA9IHRocmlmdF90cmFuc3BvcnQ6cmVhZChXcmFwcGVkLCBMZW4pLAorICB7U3RhdGUjdF9idWZmZXJlZHt3cmFwcGVkID0gTmV3U3RhdGV9LCBSZXNwb25zZX0uCiAKIAotJSUgV3JpdGVzIGRhdGEgaW50byB0aGUgYnVmZmVyCi13cml0ZShTdGF0ZSA9ICNidWZmZXJlZF90cmFuc3BvcnR7d3JpdGVfYnVmZmVyID0gV0J1Zn0sIERhdGEpIC0+Ci0gICAge1N0YXRlI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBbV0J1ZiwgRGF0YV19LCBva30uCislJSByZWFkcyBkYXRhIHRocm91Z2ggZnJvbSB0aGUgd3JhcHBlZCB0cmFuc3BvcnQKK3JlYWRfZXhhY3QoU3RhdGUgPSAjdF9idWZmZXJlZHt3cmFwcGVkID0gV3JhcHBlZH0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICB7TmV3U3RhdGUsIFJlc3BvbnNlfSA9IHRocmlmdF90cmFuc3BvcnQ6cmVhZF9leGFjdChXcmFwcGVkLCBMZW4pLAorICB7U3RhdGUjdF9idWZmZXJlZHt3cmFwcGVkID0gTmV3U3RhdGV9LCBSZXNwb25zZX0uCiAKLSUlIEZsdXNoZXMgdGhlIGJ1ZmZlciB0aHJvdWdoIHRvIHRoZSB3cmFwcGVkIHRyYW5zcG9ydAotZmx1c2goU3RhdGUgPSAjYnVmZmVyZWRfdHJhbnNwb3J0e3dyaXRlX2J1ZmZlciA9IFdCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZCA9IFdyYXBwZWQwfSkgLT4KLSAgICB7V3JhcHBlZDEsIFJlc3BvbnNlfSA9IHRocmlmdF90cmFuc3BvcnQ6d3JpdGUoV3JhcHBlZDAsIFdCdWYpLAotICAgIHtXcmFwcGVkMiwgX30gPSB0aHJpZnRfdHJhbnNwb3J0OmZsdXNoKFdyYXBwZWQxKSwKLSAgICBOZXdTdGF0ZSA9IFN0YXRlI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkID0gV3JhcHBlZDJ9LAotICAgIHtOZXdTdGF0ZSwgUmVzcG9uc2V9LgogCi0lJSBDbG9zZXMgdGhlIHRyYW5zcG9ydCBhbmQgdGhlIHdyYXBwZWQgdHJhbnNwb3J0Ci1jbG9zZShTdGF0ZSA9ICNidWZmZXJlZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWQwfSkgLT4KLSAgICB7V3JhcHBlZDEsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OmNsb3NlKFdyYXBwZWQwKSwKLSAgICBOZXdTdGF0ZSA9IFN0YXRlI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZDF9LAotICAgIHtOZXdTdGF0ZSwgUmVzdWx0fS4KK3dyaXRlKFN0YXRlID0gI3RfYnVmZmVyZWR7d3JpdGVfYnVmZmVyID0gQnVmZmVyfSwgRGF0YSkgLT4KKyAge1N0YXRlI3RfYnVmZmVyZWR7d3JpdGVfYnVmZmVyID0gW0J1ZmZlciwgRGF0YV19LCBva30uCiAKLSUlIFJlYWRzIGRhdGEgdGhyb3VnaCBmcm9tIHRoZSB3cmFwcGVkIHRyYW5zcG9ydAotcmVhZChTdGF0ZSA9ICNidWZmZXJlZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWQwfSwgTGVuKSB3aGVuIGlzX2ludGVnZXIoTGVuKSAtPgotICAgIHtXcmFwcGVkMSwgUmVzcG9uc2V9ID0gdGhyaWZ0X3RyYW5zcG9ydDpyZWFkKFdyYXBwZWQwLCBMZW4pLAotICAgIE5ld1N0YXRlID0gU3RhdGUjYnVmZmVyZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkMX0sCi0gICAge05ld1N0YXRlLCBSZXNwb25zZX0uCisKK2ZsdXNoKFN0YXRlID0gI3RfYnVmZmVyZWR7d3JhcHBlZCA9IFdyYXBwZWQsIHdyaXRlX2J1ZmZlciA9IEJ1ZmZlcn0pIC0+CisgIGNhc2UgaW9saXN0X3NpemUoQnVmZmVyKSBvZgorICAgICUlIGlmIHdyaXRlIGJ1ZmZlciBpcyBlbXB0eSwgZG8gbm90aGluZworICAgIDAgLT4ge1N0YXRlLCBva307CisgICAgXyAtPgorICAgICAge1dyaXR0ZW4sIFJlc3BvbnNlfSA9IHRocmlmdF90cmFuc3BvcnQ6d3JpdGUoV3JhcHBlZCwgQnVmZmVyKSwKKyAgICAgIHtGbHVzaGVkLCBva30gPSB0aHJpZnRfdHJhbnNwb3J0OmZsdXNoKFdyaXR0ZW4pLAorICAgICAge1N0YXRlI3RfYnVmZmVyZWR7d3JhcHBlZCA9IEZsdXNoZWQsIHdyaXRlX2J1ZmZlciA9IFtdfSwgUmVzcG9uc2V9CisgIGVuZC4KKworCitjbG9zZShTdGF0ZSA9ICN0X2J1ZmZlcmVke3dyYXBwZWQgPSBXcmFwcGVkfSkgLT4KKyAge0Nsb3NlZCwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6Y2xvc2UoV3JhcHBlZCksCisgIHtTdGF0ZSN0X2J1ZmZlcmVke3dyYXBwZWQgPSBDbG9zZWR9LCBSZXN1bHR9LgorCiAKICUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICUlJSBJbnRlcm5hbCBmdW5jdGlvbnMKICUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICUlJSUgRkFDVE9SWSBHRU5FUkFUSU9OICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKIG5ld190cmFuc3BvcnRfZmFjdG9yeShXcmFwRmFjdG9yeSkgLT4KLSAgICBGID0gZnVuKCkgLT4KLSAgICAgICAgICAgICAgICB7b2ssIFdyYXBwZWR9ID0gV3JhcEZhY3RvcnkoKSwKLSAgICAgICAgICAgICAgICBuZXcoV3JhcHBlZCkKLSAgICAgICAgZW5kLAotICAgIHtvaywgRn0uCisgIEYgPSBmdW4oKSAtPgorICAgIHtvaywgV3JhcHBlZH0gPSBXcmFwRmFjdG9yeSgpLAorICAgIG5ldyhXcmFwcGVkKQorICBlbmQsCisgIHtvaywgRn0uCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9jbGllbnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudC5lcmwKaW5kZXggNWM3NGFkYy4uMWE5Y2I1MCAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudC5lcmwKQEAgLTM2LDEzICszNiwxMiBAQAogCiAtc3BlYyBjYWxsKCN0Y2xpZW50e30sIGF0b20oKSwgbGlzdCgpKSAtPiB7I3RjbGllbnR7fSwge29rLCBhbnkoKX0gfCB7ZXJyb3IsIGFueSgpfX0uCiBjYWxsKENsaWVudCA9ICN0Y2xpZW50e30sIEZ1bmN0aW9uLCBBcmdzKQotICB3aGVuIGlzX2F0b20oRnVuY3Rpb24pLCBpc19saXN0KEFyZ3MpIC0+Ci0gICAgY2FzZSBzZW5kX2Z1bmN0aW9uX2NhbGwoQ2xpZW50LCBGdW5jdGlvbiwgQXJncykgb2YKLSAgICAgICAge0NsaWVudDEsIG9rfSAtPgotICAgICAgICAgICAgcmVjZWl2ZV9mdW5jdGlvbl9yZXN1bHQoQ2xpZW50MSwgRnVuY3Rpb24pOwotICAgICAgICBFbHNlIC0+Ci0gICAgICAgICAgICBFbHNlCi0gICAgZW5kLgord2hlbiBpc19hdG9tKEZ1bmN0aW9uKSwgaXNfbGlzdChBcmdzKSAtPgorICBjYXNlIHNlbmRfZnVuY3Rpb25fY2FsbChDbGllbnQsIEZ1bmN0aW9uLCBBcmdzKSBvZgorICAgIHtvaywgQ2xpZW50MX0gLT4gcmVjZWl2ZV9mdW5jdGlvbl9yZXN1bHQoQ2xpZW50MSwgRnVuY3Rpb24pOworICAgIHt7ZXJyb3IsIFh9LCBDbGllbnQxfSAtPiB7Q2xpZW50MSwge2Vycm9yLCBYfX07CisgICAgRWxzZSAtPiBFbHNlCisgIGVuZC4KIAogCiAlJSBTZW5kcyBhIGZ1bmN0aW9uIGNhbGwgYnV0IGRvZXMgbm90IHJlYWQgdGhlIHJlc3VsdC4gVGhpcyBpcyB1c2VmdWwKQEAgLTUxLDcgKzUwLDEwIEBACiAtc3BlYyBzZW5kX2NhbGwoI3RjbGllbnR7fSwgYXRvbSgpLCBsaXN0KCkpIC0+IHsjdGNsaWVudHt9LCBva30uCiBzZW5kX2NhbGwoQ2xpZW50ID0gI3RjbGllbnR7fSwgRnVuY3Rpb24sIEFyZ3MpCiAgIHdoZW4gaXNfYXRvbShGdW5jdGlvbiksIGlzX2xpc3QoQXJncykgLT4KLSAgICBzZW5kX2Z1bmN0aW9uX2NhbGwoQ2xpZW50LCBGdW5jdGlvbiwgQXJncykuCisgICAgY2FzZSBzZW5kX2Z1bmN0aW9uX2NhbGwoQ2xpZW50LCBGdW5jdGlvbiwgQXJncykgb2YKKyAgICAgIHtvaywgQ2xpZW50MX0gLT4ge0NsaWVudDEsIG9rfTsKKyAgICAgIEVsc2UgLT4gRWxzZQorICAgIGVuZC4KIAogLXNwZWMgY2xvc2UoI3RjbGllbnR7fSkgLT4gb2suCiBjbG9zZSgjdGNsaWVudHtwcm90b2NvbD1Qcm90b2NvbH0pIC0+CkBAIC02MSwyOCArNjMsNDAgQEAKICUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICUlJSBJbnRlcm5hbCBmdW5jdGlvbnMKICUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS1zcGVjIHNlbmRfZnVuY3Rpb25fY2FsbCgjdGNsaWVudHt9LCBhdG9tKCksIGxpc3QoKSkgLT4geyN0Y2xpZW50e30sIG9rIHwge2Vycm9yLCBhbnkoKX19Lgotc2VuZF9mdW5jdGlvbl9jYWxsKENsaWVudCA9ICN0Y2xpZW50e3Byb3RvY29sID0gUHJvdG8wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgID0gU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCAgICA9IFNlcUlkfSwKLSAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICBBcmdzKSAtPgotICAgIFBhcmFtcyA9IFNlcnZpY2U6ZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgcGFyYW1zX3R5cGUpLAotICAgIGNhc2UgUGFyYW1zIG9mCi0gICAgICAgIG5vX2Z1bmN0aW9uIC0+Ci0gICAgICAgICAgICB7Q2xpZW50LCB7ZXJyb3IsIHtub19mdW5jdGlvbiwgRnVuY3Rpb259fX07Ci0gICAgICAgIHtzdHJ1Y3QsIFBMaXN0fSB3aGVuIGxlbmd0aChQTGlzdCkgPS89IGxlbmd0aChBcmdzKSAtPgotICAgICAgICAgICAge0NsaWVudCwge2Vycm9yLCB7YmFkX2FyZ3MsIEZ1bmN0aW9uLCBBcmdzfX19OwotICAgICAgICB7c3RydWN0LCBfUExpc3R9IC0+Ci0gICAgICAgICAgICBCZWdpbiA9ICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue25hbWUgPSBhdG9tX3RvX2xpc3QoRnVuY3Rpb24pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gP3RNZXNzYWdlVHlwZV9DQUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCA9IFNlcUlkfSwKLSAgICAgICAgICAgIHtQcm90bzEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90bzAsIEJlZ2luKSwKLSAgICAgICAgICAgIHtQcm90bzIsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90bzEsIHtQYXJhbXMsIGxpc3RfdG9fdHVwbGUoW0Z1bmN0aW9uIHwgQXJnc10pfSksCi0gICAgICAgICAgICB7UHJvdG8zLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUHJvdG8yLCBtZXNzYWdlX2VuZCksCi0gICAgICAgICAgICB7UHJvdG80LCBva30gPSB0aHJpZnRfcHJvdG9jb2w6Zmx1c2hfdHJhbnNwb3J0KFByb3RvMyksCi0gICAgICAgICAgICB7Q2xpZW50I3RjbGllbnR7cHJvdG9jb2wgPSBQcm90bzR9LCBva30KLSAgICBlbmQuCistc3BlYyBzZW5kX2Z1bmN0aW9uX2NhbGwoI3RjbGllbnR7fSwgYXRvbSgpLCBsaXN0KCkpIC0+IHtvayB8IHtlcnJvciwgYW55KCl9LCAjdGNsaWVudHt9fS4KK3NlbmRfZnVuY3Rpb25fY2FsbChDbGllbnQgPSAjdGNsaWVudHtzZXJ2aWNlID0gU2VydmljZX0sIEZ1bmN0aW9uLCBBcmdzKSAtPgorICB7UGFyYW1zLCBSZXBseX0gPSB0cnkKKyAgICB7U2VydmljZTpmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBwYXJhbXNfdHlwZSksIFNlcnZpY2U6ZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgcmVwbHlfdHlwZSl9CisgIGNhdGNoIGVycm9yOmZ1bmN0aW9uX2NsYXVzZSAtPiB7bm9fZnVuY3Rpb24sIDB9CisgIGVuZCwKKyAgTXNnVHlwZSA9IGNhc2UgUmVwbHkgb2YKKyAgICBvbmV3YXlfdm9pZCAtPiA/dE1lc3NhZ2VUeXBlX09ORVdBWTsKKyAgICBfIC0+ID90TWVzc2FnZVR5cGVfQ0FMTAorICBlbmQsCisgIGNhc2UgUGFyYW1zIG9mCisgICAgbm9fZnVuY3Rpb24gLT4KKyAgICAgIHt7ZXJyb3IsIHtub19mdW5jdGlvbiwgRnVuY3Rpb259fSwgQ2xpZW50fTsKKyAgICB7c3RydWN0LCBQTGlzdH0gd2hlbiBsZW5ndGgoUExpc3QpID0vPSBsZW5ndGgoQXJncykgLT4KKyAgICAgIHt7ZXJyb3IsIHtiYWRfYXJncywgRnVuY3Rpb24sIEFyZ3N9fSwgQ2xpZW50fTsKKyAgICB7c3RydWN0LCBfUExpc3R9IC0+IHdyaXRlX21lc3NhZ2UoQ2xpZW50LCBGdW5jdGlvbiwgQXJncywgUGFyYW1zLCBNc2dUeXBlKQorICBlbmQuCisKKy1zcGVjIHdyaXRlX21lc3NhZ2UoI3RjbGllbnR7fSwgYXRvbSgpLCBsaXN0KCksIHtzdHJ1Y3QsIGxpc3QoKX0sIGludGVnZXIoKSkgLT4KKyAge29rIHwge2Vycm9yLCBhbnkoKX0sICN0Y2xpZW50e319Lgord3JpdGVfbWVzc2FnZShDbGllbnQgPSAjdGNsaWVudHtwcm90b2NvbCA9IFAwLCBzZXFpZCA9IFNlcX0sIEZ1bmN0aW9uLCBBcmdzLCBQYXJhbXMsIE1zZ1R5cGUpIC0+CisgIHRyeQorICAgIHtQMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFAwLCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsKKyAgICAgIG5hbWUgPSBhdG9tX3RvX2xpc3QoRnVuY3Rpb24pLAorICAgICAgdHlwZSA9IE1zZ1R5cGUsCisgICAgICBzZXFpZCA9IFNlcQorICAgIH0pLAorICAgIHtQMiwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFAxLCB7UGFyYW1zLCBsaXN0X3RvX3R1cGxlKFtGdW5jdGlvbnxBcmdzXSl9KSwKKyAgICB7UDMsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQMiwgbWVzc2FnZV9lbmQpLAorICAgIHtQNCwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOmZsdXNoX3RyYW5zcG9ydChQMyksCisgICAge29rLCBDbGllbnQjdGNsaWVudHtwcm90b2NvbCA9IFA0fX0KKyAgY2F0Y2gKKyAgICBlcnJvcjp7YmFkbWF0Y2gsIHtfLCB7ZXJyb3IsIF99ID0gRXJyb3J9fSAtPiB7RXJyb3IsIENsaWVudH0KKyAgZW5kLgogCiAtc3BlYyByZWNlaXZlX2Z1bmN0aW9uX3Jlc3VsdCgjdGNsaWVudHt9LCBhdG9tKCkpIC0+IHsjdGNsaWVudHt9LCB7b2ssIGFueSgpfSB8IHtlcnJvciwgYW55KCl9fS4KIHJlY2VpdmVfZnVuY3Rpb25fcmVzdWx0KENsaWVudCA9ICN0Y2xpZW50e3NlcnZpY2UgPSBTZXJ2aWNlfSwgRnVuY3Rpb24pIC0+CkBAIC05NiwxNyArMTEwLDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCAgICA9IFNlcUlkfSwKICAgICAgICAgICAgIEZ1bmN0aW9uLAogICAgICAgICAgICAgUmVwbHlUeXBlKSAtPgotICAgIHtQcm90bzEsIE1lc3NhZ2VCZWdpbn0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQcm90bzAsIG1lc3NhZ2VfYmVnaW4pLAotICAgIE5ld0NsaWVudCA9IENsaWVudCN0Y2xpZW50e3Byb3RvY29sID0gUHJvdG8xfSwKLSAgICBjYXNlIE1lc3NhZ2VCZWdpbiBvZgotICAgICAgICAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbntzZXFpZCA9IFJldFNlcUlkfSB3aGVuIFJldFNlcUlkID0vPSBTZXFJZCAtPgotICAgICAgICAgICAge05ld0NsaWVudCwge2Vycm9yLCB7YmFkX3NlcV9pZCwgU2VxSWR9fX07Ci0KLSAgICAgICAgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57dHlwZSA9ID90TWVzc2FnZVR5cGVfRVhDRVBUSU9OfSAtPgotICAgICAgICAgICAgaGFuZGxlX2FwcGxpY2F0aW9uX2V4Y2VwdGlvbihOZXdDbGllbnQpOwotCi0gICAgICAgICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue3R5cGUgPSA/dE1lc3NhZ2VUeXBlX1JFUExZfSAtPgotICAgICAgICAgICAgaGFuZGxlX3JlcGx5KE5ld0NsaWVudCwgRnVuY3Rpb24sIFJlcGx5VHlwZSkKKyAgICBjYXNlIHRocmlmdF9wcm90b2NvbDpyZWFkKFByb3RvMCwgbWVzc2FnZV9iZWdpbikgb2YKKyAgICAgICAgIHtQcm90bzEsIHtlcnJvciwgUmVhc29ufX0gLT4KKyAgICAgICAgICAgICBOZXdDbGllbnQgPSBDbGllbnQjdGNsaWVudHtwcm90b2NvbCA9IFByb3RvMX0sCisgICAgICAgICAgICAge05ld0NsaWVudCwge2Vycm9yLCBSZWFzb259fTsKKyAgICAgICAgIHtQcm90bzEsIE1lc3NhZ2VCZWdpbn0gLT4KKyAgICAgICAgICAgICBOZXdDbGllbnQgPSBDbGllbnQjdGNsaWVudHtwcm90b2NvbCA9IFByb3RvMX0sCisgICAgICAgICAgICAgY2FzZSBNZXNzYWdlQmVnaW4gb2YKKyAgICAgICAgICAgICAgICAgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57c2VxaWQgPSBSZXRTZXFJZH0gd2hlbiBSZXRTZXFJZCA9Lz0gU2VxSWQgLT4KKyAgICAgICAgICAgICAgICAgICAgIHtOZXdDbGllbnQsIHtlcnJvciwge2JhZF9zZXFfaWQsIFNlcUlkfX19OworICAgICAgICAgICAgICAgICAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnt0eXBlID0gP3RNZXNzYWdlVHlwZV9FWENFUFRJT059IC0+CisgICAgICAgICAgICAgICAgICAgICBoYW5kbGVfYXBwbGljYXRpb25fZXhjZXB0aW9uKE5ld0NsaWVudCk7CisgICAgICAgICAgICAgICAgICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue3R5cGUgPSA/dE1lc3NhZ2VUeXBlX1JFUExZfSAtPgorICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX3JlcGx5KE5ld0NsaWVudCwgRnVuY3Rpb24sIFJlcGx5VHlwZSkKKyAgICAgICAgICAgICBlbmQKICAgICBlbmQuCiAKIApkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudF91dGlsLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9jbGllbnRfdXRpbC5lcmwKaW5kZXggYzUyYmI4Yi4uMWRiZTUxZSAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudF91dGlsLmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfY2xpZW50X3V0aWwuZXJsCkBAIC0yMCw2ICsyMCwxMSBAQAogLW1vZHVsZSh0aHJpZnRfY2xpZW50X3V0aWwpLgogCiAtZXhwb3J0KFtuZXcvNF0pLgorLWV4cG9ydChbbmV3X211bHRpcGxleGVkLzMsIG5ld19tdWx0aXBsZXhlZC80XSkuCisKKy10eXBlIHNlcnZpY2VfbmFtZSgpICAgICAgICAgICAgOjogbm9uZW1wdHlfc3RyaW5nKCkuCistdHlwZSBzZXJ2aWNlX21vZHVsZSgpICAgICAgICAgIDo6IGF0b20oKS4KKy10eXBlIG11bHRpcGxleGVkX3NlcnZpY2VfbWFwKCkgOjogW3tTZXJ2aWNlTmFtZTo6c2VydmljZV9uYW1lKCksIFNlcnZpY2VNb2R1bGU6OnNlcnZpY2VfbW9kdWxlKCl9XS4KIAogJSUKICUlIFNwbGl0cyBjbGllbnQgb3B0aW9ucyBpbnRvIGNsaWVudCwgcHJvdG9jb2wsIGFuZCB0cmFuc3BvcnQgb3B0aW9ucwpAQCAtMzQsMjggKzM5LDc0IEBACiAKIHNwbGl0X29wdGlvbnMoW09wdCA9IHtPcHRLZXksIF99IHwgUmVzdF0sIFByb3RvSW4sIFRyYW5zSW4pCiAgIHdoZW4gT3B0S2V5ID06PSBzdHJpY3RfcmVhZDsKLSAgICAgICBPcHRLZXkgPTo9IHN0cmljdF93cml0ZSAtPgorICAgICAgIE9wdEtleSA9Oj0gc3RyaWN0X3dyaXRlOworICAgICAgIE9wdEtleSA9Oj0gcHJvdG9jb2wgLT4KICAgICBzcGxpdF9vcHRpb25zKFJlc3QsIFtPcHQgfCBQcm90b0luXSwgVHJhbnNJbik7CiAKIHNwbGl0X29wdGlvbnMoW09wdCA9IHtPcHRLZXksIF99IHwgUmVzdF0sIFByb3RvSW4sIFRyYW5zSW4pCiAgIHdoZW4gT3B0S2V5ID06PSBmcmFtZWQ7CiAgICAgICAgT3B0S2V5ID06PSBjb25uZWN0X3RpbWVvdXQ7Ci0gICAgICAgT3B0S2V5ID06PSBzb2Nrb3B0cyAtPgorICAgICAgIE9wdEtleSA9Oj0gcmVjdl90aW1lb3V0OworICAgICAgIE9wdEtleSA9Oj0gc29ja29wdHM7CisgICAgICAgT3B0S2V5ID06PSBzc2x0cmFuc3BvcnQ7CisgICAgICAgT3B0S2V5ID06PSBzc2xvcHRpb25zLT4KICAgICBzcGxpdF9vcHRpb25zKFJlc3QsIFByb3RvSW4sIFtPcHQgfCBUcmFuc0luXSkuCiAKIAogJSUgQ2xpZW50IGNvbnN0cnVjdG9yIGZvciB0aGUgY29tbW9uLWNhc2Ugb2Ygc29ja2V0IHRyYW5zcG9ydHMKLSUlIHdpdGggdGhlIGJpbmFyeSBwcm90b2NvbAogbmV3KEhvc3QsIFBvcnQsIFNlcnZpY2UsIE9wdGlvbnMpCiAgIHdoZW4gaXNfaW50ZWdlcihQb3J0KSwgaXNfYXRvbShTZXJ2aWNlKSwgaXNfbGlzdChPcHRpb25zKSAtPgotICAgIHtQcm90b09wdHMsIFRyYW5zT3B0c30gPSBzcGxpdF9vcHRpb25zKE9wdGlvbnMpLAorICAgIHtQcm90b09wdHMsIFRyYW5zT3B0czB9ID0gc3BsaXRfb3B0aW9ucyhPcHRpb25zKSwKIAorICAgIHtUcmFuc3BvcnRNb2R1bGUsIFRyYW5zT3B0czJ9ID0gY2FzZSBsaXN0czprZXl0YWtlKHNzbHRyYW5zcG9ydCwgMSwgVHJhbnNPcHRzMCkgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dmFsdWUsIHtfLCB0cnVlfSwgVHJhbnNPcHRzMX0gLT4ge3RocmlmdF9zc2xzb2NrZXRfdHJhbnNwb3J0LCBUcmFuc09wdHMxfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtPiB7dGhyaWZ0X3NvY2tldF90cmFuc3BvcnQsIFRyYW5zT3B0czB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisKKyAgICB7UHJvdG9jb2xNb2R1bGUsIFByb3RvT3B0czF9ID0gY2FzZSBsaXN0czprZXl0YWtlKHByb3RvY29sLCAxLCBQcm90b09wdHMpIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZhbHVlLCB7XywgY29tcGFjdH0sIE9wdHN9IC0+IHt0aHJpZnRfY29tcGFjdF9wcm90b2NvbCwgT3B0c307CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZhbHVlLCB7XywganNvbn0sIE9wdHN9IC0+IHt0aHJpZnRfanNvbl9wcm90b2NvbCwgT3B0c307CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZhbHVlLCB7XywgYmluYXJ5fSwgT3B0c30gLT4ge3RocmlmdF9iaW5hcnlfcHJvdG9jb2wsIE9wdHN9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC0+IHt0aHJpZnRfYmluYXJ5X3Byb3RvY29sLCBQcm90b09wdHN9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKICAgICB7b2ssIFRyYW5zcG9ydEZhY3Rvcnl9ID0KLSAgICAgICAgdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3X3RyYW5zcG9ydF9mYWN0b3J5KEhvc3QsIFBvcnQsIFRyYW5zT3B0cyksCisgICAgICAgIFRyYW5zcG9ydE1vZHVsZTpuZXdfdHJhbnNwb3J0X2ZhY3RvcnkoSG9zdCwgUG9ydCwgVHJhbnNPcHRzMiksCiAKLSAgICB7b2ssIFByb3RvY29sRmFjdG9yeX0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ld19wcm90b2NvbF9mYWN0b3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0RmFjdG9yeSwgUHJvdG9PcHRzKSwKKyAgICB7b2ssIFByb3RvY29sRmFjdG9yeX0gPSBQcm90b2NvbE1vZHVsZTpuZXdfcHJvdG9jb2xfZmFjdG9yeSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydEZhY3RvcnksIFByb3RvT3B0czEpLAorCisgICAgY2FzZSBQcm90b2NvbEZhY3RvcnkoKSBvZgorICAgICAgICB7b2ssIFByb3RvY29sfSAtPgorICAgICAgICAgICAgdGhyaWZ0X2NsaWVudDpuZXcoUHJvdG9jb2wsIFNlcnZpY2UpOworICAgICAgICB7ZXJyb3IsIEVycm9yfSAtPgorICAgICAgICAgICAge2Vycm9yLCBFcnJvcn0KKyAgICBlbmQuCisKKy1zcGVjIG5ld19tdWx0aXBsZXhlZChIb3N0LCBQb3J0LCBTZXJ2aWNlcywgT3B0aW9ucykgLT4ge29rLCBTZXJ2aWNlVGhyaWZ0Q2xpZW50TGlzdH0gd2hlbgorICAgIEhvc3QgICAgICAgIDo6IG5vbmVtcHR5X3N0cmluZygpLAorICAgIFBvcnQgICAgICAgIDo6IG5vbl9uZWdfaW50ZWdlcigpLAorICAgIFNlcnZpY2VzICAgIDo6IG11bHRpcGxleGVkX3NlcnZpY2VfbWFwKCksCisgICAgT3B0aW9ucyAgICAgOjogbGlzdCgpLAorICAgIFNlcnZpY2VUaHJpZnRDbGllbnRMaXN0IDo6IFt7U2VydmljZU5hbWU6Omxpc3QoKSwgVGhyaWZ0Q2xpZW50Ojp0ZXJtKCl9XS4KK25ld19tdWx0aXBsZXhlZChIb3N0LCBQb3J0LCBTZXJ2aWNlcywgT3B0aW9ucykgd2hlbiBpc19pbnRlZ2VyKFBvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2xpc3QoU2VydmljZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2xpc3QoT3B0aW9ucykgLT4KKyAgICBuZXdfbXVsdGlwbGV4ZWQodGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3X3RyYW5zcG9ydF9mYWN0b3J5KEhvc3QsIFBvcnQsIE9wdGlvbnMpLCBTZXJ2aWNlcywgT3B0aW9ucykuCisKKy1zcGVjIG5ld19tdWx0aXBsZXhlZChUcmFuc3BvcnRGYWN0b3J5VHVwbGUsIFNlcnZpY2VzLCBPcHRpb25zKSAtPiB7b2ssIFNlcnZpY2VUaHJpZnRDbGllbnRMaXN0fSB3aGVuCisgICAgVHJhbnNwb3J0RmFjdG9yeVR1cGxlICAgOjoge29rLCBUcmFuc3BvcnRGYWN0b3J5Ojp0ZXJtKCl9LAorICAgIFNlcnZpY2VzICAgICAgICAgICAgICAgIDo6IG11bHRpcGxleGVkX3NlcnZpY2VfbWFwKCksCisgICAgT3B0aW9ucyAgICAgICAgICAgICAgICAgOjogbGlzdCgpLAorICAgIFNlcnZpY2VUaHJpZnRDbGllbnRMaXN0IDo6IFt7U2VydmljZU5hbWU6OnNlcnZpY2VfbmFtZSgpLCBUaHJpZnRDbGllbnQ6OnRlcm0oKX1dLgorbmV3X211bHRpcGxleGVkKFRyYW5zcG9ydEZhY3RvcnlUdXBsZSwgU2VydmljZXMsIE9wdGlvbnMpIHdoZW4gaXNfbGlzdChTZXJ2aWNlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19saXN0KE9wdGlvbnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfdHVwbGUoVHJhbnNwb3J0RmFjdG9yeVR1cGxlKSAtPgorICAgIHtQcm90b09wdHMsIF99ID0gc3BsaXRfb3B0aW9ucyhPcHRpb25zKSwKKworICAgIHtvaywgVHJhbnNwb3J0RmFjdG9yeX0gPSBUcmFuc3BvcnRGYWN0b3J5VHVwbGUsCisKKyAgICB7b2ssIFByb3RvY29sRmFjdG9yeX0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ld19wcm90b2NvbF9mYWN0b3J5KFRyYW5zcG9ydEZhY3RvcnksIFByb3RvT3B0cyksCiAKICAgICB7b2ssIFByb3RvY29sfSA9IFByb3RvY29sRmFjdG9yeSgpLAogCi0gICAgdGhyaWZ0X2NsaWVudDpuZXcoUHJvdG9jb2wsIFNlcnZpY2UpLgorICAgIHtvaywgW3tTZXJ2aWNlTmFtZSwgZWxlbWVudCgyLCB0aHJpZnRfY2xpZW50Om5ldyhlbGVtZW50KDIsIHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbDpuZXcoUHJvdG9jb2wsIFNlcnZpY2VOYW1lKSksIFNlcnZpY2UpKX0gfHwge1NlcnZpY2VOYW1lLCBTZXJ2aWNlfSA8LSBTZXJ2aWNlc119LgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMTQyMjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5lcmwKQEAgLTAsMCArMSwzOTAgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRocmlmdF9jb21wYWN0X3Byb3RvY29sKS4KKworLWJlaGF2aW91cih0aHJpZnRfcHJvdG9jb2wpLgorCistaW5jbHVkZSgidGhyaWZ0X2NvbnN0YW50cy5ocmwiKS4KKy1pbmNsdWRlKCJ0aHJpZnRfcHJvdG9jb2wuaHJsIikuCisKKy1leHBvcnQoW25ldy8xLCBuZXcvMiwKKyAgICAgICAgIHJlYWQvMiwKKyAgICAgICAgIHdyaXRlLzIsCisgICAgICAgICBmbHVzaF90cmFuc3BvcnQvMSwKKyAgICAgICAgIGNsb3NlX3RyYW5zcG9ydC8xLAorICAgICAgICAgbmV3X3Byb3RvY29sX2ZhY3RvcnkvMgorICAgICAgICBdKS4KKworLWRlZmluZShJRF9OT05FLCAxNiMxMDAwMCkuCistZGVmaW5lKENCT09MX05PTkUsIDApLgorLWRlZmluZShDQk9PTF9UUlVFLCAxKS4KKy1kZWZpbmUoQ0JPT0xfRkFMU0UsIDIpLgorCistcmVjb3JkKHRfY29tcGFjdCwge3RyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICUgc3RhdGUgZm9yIHBlbmRpbmcgYm9vbGVhbiBmaWVsZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfc3RhY2s9W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3ZhbHVlPT9DQk9PTF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfc3RhY2s9W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9pZD0/SURfTk9ORQorICAgICAgICAgICAgICAgICAgICAgICAgICB9KS4KKy10eXBlIHN0YXRlKCkgOjogI3RfY29tcGFjdHt9LgorLWluY2x1ZGUoInRocmlmdF9wcm90b2NvbF9iZWhhdmlvdXIuaHJsIikuCisKKy1kZWZpbmUoUFJPVE9DT0xfSUQsIDE2IzgyKS4KKy1kZWZpbmUoVkVSU0lPTl9NQVNLLCAxNiMxZikuCistZGVmaW5lKFZFUlNJT05fMSwgMTYjMDEpLgorLWRlZmluZShUWVBFX01BU0ssIDE2I0UwKS4KKy1kZWZpbmUoVFlQRV9CSVRTLCAxNiMwNykuCistZGVmaW5lKFRZUEVfU0hJRlRfQU1PVU5ULCA1KS4KKwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX1NUT1ApIC0+IDE2IzA7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfQk9PTCkgLT4gMTYjMjsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9JOCkgLT4gMTYjMzsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9JMTYpIC0+IDE2IzQ7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfSTMyKSAtPiAxNiM1OwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX0k2NCkgLT4gMTYjNjsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9ET1VCTEUpIC0+IDE2Izc7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfU1RSSU5HKSAtPiAxNiM4OwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX1NUUlVDVCkgLT4gMTYjQzsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9NQVApIC0+IDE2I0I7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfU0VUKSAtPiAxNiNBOwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX0xJU1QpIC0+IDE2IzkuCisKK2NvbXBhY3RfdG9fdHlwZWlkKDE2IzApIC0+ICA/dFR5cGVfU1RPUDsKK2NvbXBhY3RfdG9fdHlwZWlkKD9DQk9PTF9GQUxTRSkgLT4gID90VHlwZV9CT09MOworY29tcGFjdF90b190eXBlaWQoP0NCT09MX1RSVUUpIC0+ICA/dFR5cGVfQk9PTDsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2IzcpIC0+ICA/dFR5cGVfRE9VQkxFOworY29tcGFjdF90b190eXBlaWQoMTYjMykgLT4gID90VHlwZV9JODsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2IzQpIC0+ICA/dFR5cGVfSTE2OworY29tcGFjdF90b190eXBlaWQoMTYjNSkgLT4gID90VHlwZV9JMzI7Citjb21wYWN0X3RvX3R5cGVpZCgxNiM2KSAtPiAgP3RUeXBlX0k2NDsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2IzgpIC0+ICA/dFR5cGVfU1RSSU5HOworY29tcGFjdF90b190eXBlaWQoMTYjQykgLT4gID90VHlwZV9TVFJVQ1Q7Citjb21wYWN0X3RvX3R5cGVpZCgxNiNCKSAtPiAgP3RUeXBlX01BUDsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2I0EpIC0+ICA/dFR5cGVfU0VUOworY29tcGFjdF90b190eXBlaWQoMTYjOSkgLT4gID90VHlwZV9MSVNULgorCitib29sX3RvX2Nib29sKFZhbHVlKSB3aGVuIFZhbHVlIC0+ID9DQk9PTF9UUlVFOworYm9vbF90b19jYm9vbChfKSAtPiA/Q0JPT0xfRkFMU0UuCitjYm9vbF90b19ib29sKFZhbHVlKSAtPiBWYWx1ZSA9Oj0gP0NCT09MX1RSVUUuCisKK25ldyhUcmFuc3BvcnQpIC0+IG5ldyhUcmFuc3BvcnQsIF9PcHRpb25zID0gW10pLgorCituZXcoVHJhbnNwb3J0LCBfT3B0aW9ucykgLT4KKyAgU3RhdGUgID0gI3RfY29tcGFjdHt0cmFuc3BvcnQgPSBUcmFuc3BvcnR9LAorICB0aHJpZnRfcHJvdG9jb2w6bmV3KD9NT0RVTEUsIFN0YXRlKS4KKworZmx1c2hfdHJhbnNwb3J0KFRoaXMgPSAjdF9jb21wYWN0e3RyYW5zcG9ydCA9IFRyYW5zcG9ydH0pIC0+CisgIHtOZXdUcmFuc3BvcnQsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OmZsdXNoKFRyYW5zcG9ydCksCisgIHtUaGlzI3RfY29tcGFjdHt0cmFuc3BvcnQgPSBOZXdUcmFuc3BvcnR9LCBSZXN1bHR9LgorCitjbG9zZV90cmFuc3BvcnQoVGhpcyA9ICN0X2NvbXBhY3R7dHJhbnNwb3J0ID0gVHJhbnNwb3J0fSkgLT4KKyAge05ld1RyYW5zcG9ydCwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6Y2xvc2UoVHJhbnNwb3J0KSwKKyAge1RoaXMjdF9jb21wYWN0e3RyYW5zcG9ydCA9IE5ld1RyYW5zcG9ydH0sIFJlc3VsdH0uCisKKyUlJQorJSUlIGluc3RhbmNlIG1ldGhvZHMKKyUlJQorCit3cml0ZV9maWVsZF9iZWdpbihUaGlzMCA9ICN0X2NvbXBhY3R7d3JpdGVfc3RhY2s9W0xhc3RJZHxUXX0sIENvbXBhY3RUeXBlLCBJZCkgLT4KKyAgSWREaWZmID0gSWQgLSBMYXN0SWQsCisgIFRoaXMxID0gVGhpczAjdF9jb21wYWN0e3dyaXRlX3N0YWNrPVtJZHxUXX0sCisgIGNhc2UgKElkRGlmZiA+IDApIGFuZCAoSWREaWZmIDwgMTYpIG9mCisgICAgdHJ1ZSAtPiB3cml0ZShUaGlzMSwge2J5dGUsIChJZERpZmYgYnNsIDQpIGJvciBDb21wYWN0VHlwZX0pOworICAgIGZhbHNlIC0+CisgICAgICB7VGhpczIsIG9rfSA9IHdyaXRlKFRoaXMxLCB7Ynl0ZSwgQ29tcGFjdFR5cGV9KSwKKyAgICAgIHdyaXRlKFRoaXMyLCB7aTE2LCBJZH0pCisgIGVuZC4KKworLXNwZWMgdG9femlnemFnKGludGVnZXIoKSkgLT4gbm9uX25lZ19pbnRlZ2VyKCkuCit0b196aWd6YWcoVmFsdWUpIC0+IDE2I0ZGRkZGRkZGRkZGRkZGRkYgYmFuZCAoKFZhbHVlIGJzbCAxKSBieG9yIChWYWx1ZSBic3IgNjMpKS4KKworLXNwZWMgZnJvbV96aWd6YWcobm9uX25lZ19pbnRlZ2VyKCkpIC0+IGludGVnZXIoKS4KK2Zyb21femlnemFnKFZhbHVlKSAtPiAoVmFsdWUgYnNyIDEpIGJ4b3IgLShWYWx1ZSBiYW5kIDEpLgorCistc3BlYyB0b192YXJpbnQobm9uX25lZ19pbnRlZ2VyKCksIGlvbGlzdCgpKSAtPiBpb2xpc3QoKS4KK3RvX3ZhcmludChWYWx1ZSwgQWNjKSB3aGVuIChWYWx1ZSA8IDE2IzgwKSAtPiBbQWNjLCBWYWx1ZV07Cit0b192YXJpbnQoVmFsdWUsIEFjYykgLT4KKyAgdG9fdmFyaW50KFZhbHVlIGJzciA3LCBbQWNjLCAoKFZhbHVlIGJhbmQgMTYjN0YpIGJvciAxNiM4MCldKS4KKworLXNwZWMgcmVhZF92YXJpbnQoI3RfY29tcGFjdHt9LCBub25fbmVnX2ludGVnZXIoKSwgbm9uX25lZ19pbnRlZ2VyKCkpIC0+IG5vbl9uZWdfaW50ZWdlcigpLgorcmVhZF92YXJpbnQoVGhpczAsIEFjYywgQ291bnQpIC0+CisgIHtUaGlzMSwge29rLCBCeXRlfX0gPSByZWFkKFRoaXMwLCBieXRlKSwKKyAgY2FzZSAoQnl0ZSBiYW5kIDE2IzgwKSBvZgorICAgIDAgLT4ge1RoaXMxLCB7b2ssIChCeXRlIGJzbCAoNyAqIENvdW50KSkgKyBBY2N9fTsKKyAgICBfIC0+IHJlYWRfdmFyaW50KFRoaXMxLCAoKEJ5dGUgYmFuZCAxNiM3ZikgYnNsICg3ICogQ291bnQpKSArIEFjYywgQ291bnQgKyAxKQorICBlbmQuCisKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsKKyAgICAgICAgbmFtZSA9IE5hbWUsCisgICAgICAgIHR5cGUgPSBUeXBlLAorICAgICAgICBzZXFpZCA9IFNlcWlkfSkgLT4KKyAge1RoaXMxLCBva30gPSB3cml0ZShUaGlzMCwge2J5dGUsID9QUk9UT0NPTF9JRH0pLAorICB7VGhpczIsIG9rfSA9IHdyaXRlKFRoaXMxLCB7Ynl0ZSwgKD9WRVJTSU9OXzEgYmFuZCA/VkVSU0lPTl9NQVNLKSBib3IgKFR5cGUgYnNsID9UWVBFX1NISUZUX0FNT1VOVCl9KSwKKyAge1RoaXMzLCBva30gPSB3cml0ZShUaGlzMiwge3VpMzIsIFNlcWlkfSksCisgIHtUaGlzNCwgb2t9ID0gd3JpdGUoVGhpczMsIHtzdHJpbmcsIE5hbWV9KSwKKyAge1RoaXM0LCBva307CisKK3dyaXRlKFRoaXMsIG1lc3NhZ2VfZW5kKSAtPiB7VGhpcywgb2t9OworCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueworICAgICAgIG5hbWUgPSBfTmFtZSwKKyAgICAgICB0eXBlID0gVHlwZSwKKyAgICAgICBpZCA9IElkfSkKK3doZW4gKFR5cGUgPTo9ID90VHlwZV9CT09MKSAtPiB7VGhpczAjdF9jb21wYWN0e3dyaXRlX2lkID0gSWR9LCBva307CisKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57CisgICAgICAgbmFtZSA9IF9OYW1lLAorICAgICAgIHR5cGUgPSBUeXBlLAorICAgICAgIGlkID0gSWR9KSAtPgorICB3cml0ZV9maWVsZF9iZWdpbihUaGlzMCwgdHlwZWlkX3RvX2NvbXBhY3QoVHlwZSksIElkKTsKKword3JpdGUoVGhpcywgZmllbGRfc3RvcCkgLT4gd3JpdGUoVGhpcywge2J5dGUsID90VHlwZV9TVE9QfSk7CisKK3dyaXRlKFRoaXMsIGZpZWxkX2VuZCkgLT4ge1RoaXMsIG9rfTsKKword3JpdGUoVGhpczAsICNwcm90b2NvbF9tYXBfYmVnaW57CisgICAgICBrdHlwZSA9IF9LdHlwZSwKKyAgICAgIHZ0eXBlID0gX1Z0eXBlLAorICAgICAgc2l6ZSA9IFNpemV9KQord2hlbiBTaXplID06PSAwIC0+CisgIHdyaXRlKFRoaXMwLCB7Ynl0ZSwgMH0pOworCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX21hcF9iZWdpbnsKKyAgICAgICBrdHlwZSA9IEt0eXBlLAorICAgICAgIHZ0eXBlID0gVnR5cGUsCisgICAgICAgc2l6ZSA9IFNpemV9KSAtPgorICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7dWkzMiwgU2l6ZX0pLAorICB3cml0ZShUaGlzMSwge2J5dGUsICh0eXBlaWRfdG9fY29tcGFjdChLdHlwZSkgYnNsIDQpIGJvciB0eXBlaWRfdG9fY29tcGFjdChWdHlwZSl9KTsKKword3JpdGUoVGhpcywgbWFwX2VuZCkgLT4ge1RoaXMsIG9rfTsKKword3JpdGUoVGhpczAsICNwcm90b2NvbF9saXN0X2JlZ2lueworICAgICAgICBldHlwZSA9IEV0eXBlLAorICAgICAgICBzaXplID0gU2l6ZX0pCit3aGVuIFNpemUgPCAxNiNmIC0+CisgIHdyaXRlKFRoaXMwLCB7Ynl0ZSwgKFNpemUgYnNsIDQpIGJvciB0eXBlaWRfdG9fY29tcGFjdChFdHlwZSl9KTsKKword3JpdGUoVGhpczAsICNwcm90b2NvbF9saXN0X2JlZ2lueworICAgICAgICBldHlwZSA9IEV0eXBlLAorICAgICAgICBzaXplID0gU2l6ZX0pIC0+CisgIHtUaGlzMSwgb2t9ID0gd3JpdGUoVGhpczAsIHtieXRlLCAxNiNmMCBib3IgdHlwZWlkX3RvX2NvbXBhY3QoRXR5cGUpfSksCisgIHdyaXRlKFRoaXMxLCB7dWkzMiwgU2l6ZX0pOworCit3cml0ZShUaGlzLCBsaXN0X2VuZCkgLT4ge1RoaXMsIG9rfTsKKword3JpdGUoVGhpczAsICNwcm90b2NvbF9zZXRfYmVnaW57CisgICAgICAgIGV0eXBlID0gRXR5cGUsCisgICAgICAgIHNpemUgPSBTaXplfSkgLT4KKyAgd3JpdGUoVGhpczAsICNwcm90b2NvbF9saXN0X2JlZ2lue2V0eXBlID0gRXR5cGUsIHNpemUgPSAgU2l6ZX0pOworCit3cml0ZShUaGlzLCBzZXRfZW5kKSAtPiB7VGhpcywgb2t9OworCit3cml0ZShUaGlzID0gI3RfY29tcGFjdHt3cml0ZV9zdGFjayA9IFN0YWNrfSwgI3Byb3RvY29sX3N0cnVjdF9iZWdpbnt9KSAtPgorICB7VGhpcyN0X2NvbXBhY3R7d3JpdGVfc3RhY2sgPSBbMHxTdGFja119LCBva307Cit3cml0ZShUaGlzID0gI3RfY29tcGFjdHt3cml0ZV9zdGFjayA9IFtffFRdfSwgc3RydWN0X2VuZCkgLT4KKyAge1RoaXMjdF9jb21wYWN0e3dyaXRlX3N0YWNrID0gVH0sIG9rfTsKKword3JpdGUoVGhpcyA9ICN0X2NvbXBhY3R7d3JpdGVfaWQgPSA/SURfTk9ORX0sIHtib29sLCBWYWx1ZX0pIC0+CisgIHdyaXRlKFRoaXMsIHtieXRlLCBib29sX3RvX2Nib29sKFZhbHVlKX0pOworCit3cml0ZShUaGlzMCA9ICN0X2NvbXBhY3R7d3JpdGVfaWQgPSBJZH0sIHtib29sLCBWYWx1ZX0pIC0+CisgIHtUaGlzMSwgb2t9ID0gd3JpdGVfZmllbGRfYmVnaW4oVGhpczAsIGJvb2xfdG9fY2Jvb2woVmFsdWUpLCBJZCksCisgIHtUaGlzMSN0X2NvbXBhY3R7d3JpdGVfaWQgPSA/SURfTk9ORX0sIG9rfTsKKword3JpdGUoVGhpcywge2J5dGUsIFZhbHVlfSkgd2hlbiBpc19pbnRlZ2VyKFZhbHVlKSAtPgorICB3cml0ZShUaGlzLCA8PFZhbHVlOjgvYmlnLXNpZ25lZD4+KTsKKword3JpdGUoVGhpcywge2kxNiwgVmFsdWV9KSB3aGVuIGlzX2ludGVnZXIoVmFsdWUpIC0+IHdyaXRlKFRoaXMsIHRvX3ZhcmludCh0b196aWd6YWcoVmFsdWUpLCBbXSkpOword3JpdGUoVGhpcywge3VpMzIsIFZhbHVlfSkgd2hlbiBpc19pbnRlZ2VyKFZhbHVlKSAtPiB3cml0ZShUaGlzLCB0b192YXJpbnQoVmFsdWUsIFtdKSk7Cit3cml0ZShUaGlzLCB7aTMyLCBWYWx1ZX0pIHdoZW4gaXNfaW50ZWdlcihWYWx1ZSkgLT4KKyAgd3JpdGUoVGhpcywgdG9fdmFyaW50KHRvX3ppZ3phZyhWYWx1ZSksIFtdKSk7Cit3cml0ZShUaGlzLCB7aTY0LCBWYWx1ZX0pIHdoZW4gaXNfaW50ZWdlcihWYWx1ZSkgLT4gd3JpdGUoVGhpcywgdG9fdmFyaW50KHRvX3ppZ3phZyhWYWx1ZSksIFtdKSk7CisKK3dyaXRlKFRoaXMsIHtkb3VibGUsIERvdWJsZX0pIC0+CisgIHdyaXRlKFRoaXMsIDw8RG91YmxlOjY0L2Zsb2F0LXNpZ25lZC1saXR0bGU+Pik7CisKK3dyaXRlKFRoaXMwLCB7c3RyaW5nLCBTdHJ9KSB3aGVuIGlzX2xpc3QoU3RyKSAtPgorICAlIFRPRE86IGxpbWl0IGxlbmd0aAorICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7dWkzMiwgbGVuZ3RoKFN0cil9KSwKKyAge1RoaXMyLCBva30gPSB3cml0ZShUaGlzMSwgbGlzdF90b19iaW5hcnkoU3RyKSksCisgIHtUaGlzMiwgb2t9OworCit3cml0ZShUaGlzMCwge3N0cmluZywgQmlufSkgd2hlbiBpc19iaW5hcnkoQmluKSAtPgorICAlIFRPRE86IGxpbWl0IGxlbmd0aAorICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7dWkzMiwgc2l6ZShCaW4pfSksCisgIHtUaGlzMiwgb2t9ID0gd3JpdGUoVGhpczEsIEJpbiksCisgIHtUaGlzMiwgb2t9OworCislJSBEYXRhIDo6IGlvbGlzdCgpCit3cml0ZShUaGlzID0gI3RfY29tcGFjdHt0cmFuc3BvcnQgPSBUcmFuc30sIERhdGEpIC0+CisgIHtOZXdUcmFuc3BvcnQsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OndyaXRlKFRyYW5zLCBEYXRhKSwKKyAge1RoaXMjdF9jb21wYWN0e3RyYW5zcG9ydCA9IE5ld1RyYW5zcG9ydH0sIFJlc3VsdH0uCisKKyUlCislJQorCityZWFkKFRoaXMwLCBtZXNzYWdlX2JlZ2luKSAtPgorICB7VGhpczEsIHtvaywgP1BST1RPQ09MX0lEfX0gPSByZWFkKFRoaXMwLCB1Ynl0ZSksCisgIHtUaGlzMiwge29rLCBWZXJBbmRUeXBlfX0gPSByZWFkKFRoaXMxLCB1Ynl0ZSksCisgID9WRVJTSU9OXzEgPSBWZXJBbmRUeXBlIGJhbmQgP1ZFUlNJT05fTUFTSywKKyAge1RoaXMzLCB7b2ssIFNlcUlkfX0gPSByZWFkKFRoaXMyLCB1aTMyKSwKKyAge1RoaXM0LCB7b2ssIE5hbWV9fSA9IHJlYWQoVGhpczMsIHN0cmluZyksCisgIHtUaGlzNCwgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57CisgICAgICAgICAgICAgbmFtZSAgPSBiaW5hcnlfdG9fbGlzdChOYW1lKSwKKyAgICAgICAgICAgICB0eXBlICA9IChWZXJBbmRUeXBlIGJzciA/VFlQRV9TSElGVF9BTU9VTlQpIGJhbmQgP1RZUEVfQklUUywKKyAgICAgICAgICAgICBzZXFpZCA9IFNlcUlkfX07CisKK3JlYWQoVGhpcywgbWVzc2FnZV9lbmQpIC0+IHtUaGlzLCBva307CisKK3JlYWQoVGhpcyA9ICN0X2NvbXBhY3R7cmVhZF9zdGFjayA9IFN0YWNrfSwgc3RydWN0X2JlZ2luKSAtPgorICB7VGhpcyN0X2NvbXBhY3R7cmVhZF9zdGFjayA9IFswfFN0YWNrXX0sIG9rfTsKK3JlYWQoVGhpcyA9ICN0X2NvbXBhY3R7cmVhZF9zdGFjayA9IFtfSHxUXX0sIHN0cnVjdF9lbmQpIC0+CisgIHtUaGlzI3RfY29tcGFjdHtyZWFkX3N0YWNrID0gVH0sIG9rfTsKKworcmVhZChUaGlzMCA9ICN0X2NvbXBhY3R7cmVhZF9zdGFjayA9IFtMYXN0SWR8VF19LCBmaWVsZF9iZWdpbikgLT4KKyAge1RoaXMxLCB7b2ssIEJ5dGV9fSA9IHJlYWQoVGhpczAsIHVieXRlKSwKKyAgY2FzZSBCeXRlIGJhbmQgMTYjZiBvZgorICAgIENvbXBhY3RUeXBlID0gP3RUeXBlX1NUT1AgLT4KKyAgICAgIHtUaGlzMSwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lue3R5cGUgPSBDb21wYWN0VHlwZX19OworICAgIENvbXBhY3RUeXBlIC0+CisgICAgICB7VGhpczIsIHtvaywgSWR9fSA9IGNhc2UgQnl0ZSBic3IgNCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLT4gcmVhZChUaGlzMSwgaTE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZERpZmYgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtUaGlzMSwge29rLCBMYXN0SWQgKyBJZERpZmZ9fQorICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgICAgICBjYXNlIGNvbXBhY3RfdG9fdHlwZWlkKENvbXBhY3RUeXBlKSBvZgorICAgICAgICA/dFR5cGVfQk9PTCAtPgorICAgICAgICAgIHtUaGlzMiN0X2NvbXBhY3R7cmVhZF9zdGFjayA9IFtJZHxUXSwgcmVhZF92YWx1ZSA9IGNib29sX3RvX2Jvb2woQ29tcGFjdFR5cGUpfSwKKyAgICAgICAgICAgI3Byb3RvY29sX2ZpZWxkX2JlZ2lue3R5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSBJZH19OworICAgICAgICBUeXBlIC0+CisgICAgICAgICAge1RoaXMyI3RfY29tcGFjdHtyZWFkX3N0YWNrID0gW0lkfFRdfSwKKyAgICAgICAgICAgI3Byb3RvY29sX2ZpZWxkX2JlZ2lue3R5cGUgPSBUeXBlLCBpZCA9IElkfX0KKyAgICAgIGVuZAorICBlbmQ7CisKK3JlYWQoVGhpcywgZmllbGRfZW5kKSAtPiB7VGhpcywgb2t9OworCityZWFkKFRoaXMwLCBtYXBfYmVnaW4pIC0+CisgIHtUaGlzMSwge29rLCBTaXplfX0gID0gcmVhZChUaGlzMCwgdWkzMiksCisgIHtUaGlzMiwge29rLCBLVn19ID0gY2FzZSBTaXplIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAwIC0+IHtUaGlzMSwge29rLCAwfX07CisgICAgICAgICAgICAgICAgICAgICAgICBfIC0+IHJlYWQoVGhpczEsIHVieXRlKQorICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAge1RoaXMyLCAjcHJvdG9jb2xfbWFwX2JlZ2lue2t0eXBlID0gY29tcGFjdF90b190eXBlaWQoS1YgYnNyIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnR5cGUgPSBjb21wYWN0X3RvX3R5cGVpZChLViBiYW5kIDE2I2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFNpemV9fTsKK3JlYWQoVGhpcywgbWFwX2VuZCkgLT4ge1RoaXMsIG9rfTsKKworcmVhZChUaGlzMCwgbGlzdF9iZWdpbikgLT4KKyAge1RoaXMxLCB7b2ssIFNpemVBbmRUeXBlfX0gPSByZWFkKFRoaXMwLCB1Ynl0ZSksCisgIHtUaGlzMiwge29rLCBTaXplfX0gPSBjYXNlIChTaXplQW5kVHlwZSBic3IgNCkgYmFuZCAxNiNmIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgIDE2I2YgLT4gcmVhZChUaGlzMSwgdWkzMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIEVsc2UgLT4ge1RoaXMxLCB7b2ssIEVsc2V9fQorICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICB7VGhpczIsICNwcm90b2NvbF9saXN0X2JlZ2lue2V0eXBlID0gY29tcGFjdF90b190eXBlaWQoU2l6ZUFuZFR5cGUgYmFuZCAxNiNmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX19OworCityZWFkKFRoaXMsIGxpc3RfZW5kKSAtPiB7VGhpcywgb2t9OworCityZWFkKFRoaXMwLCBzZXRfYmVnaW4pIC0+CisgIHtUaGlzMSwge29rLCBTaXplQW5kVHlwZX19ID0gcmVhZChUaGlzMCwgdWJ5dGUpLAorICB7VGhpczIsIHtvaywgU2l6ZX19ID0gY2FzZSAoU2l6ZUFuZFR5cGUgYnNyIDQpIGJhbmQgMTYjZiBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAxNiNmIC0+IHJlYWQoVGhpczEsIHVpMzIpOworICAgICAgICAgICAgICAgICAgICAgICAgICBFbHNlIC0+IHtUaGlzMSwge29rLCBFbHNlfX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAge1RoaXMyLCAjcHJvdG9jb2xfc2V0X2JlZ2lue2V0eXBlID0gY29tcGFjdF90b190eXBlaWQoU2l6ZUFuZFR5cGUgYmFuZCAxNiNmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX19OworCityZWFkKFRoaXMsIHNldF9lbmQpIC0+IHtUaGlzLCBva307CisKK3JlYWQoVGhpczAsIGZpZWxkX3N0b3ApIC0+CisgIHtUaGlzMSwge29rLCA/dFR5cGVfU1RPUH19ID0gcmVhZChUaGlzMCwgdWJ5dGUpLAorICB7VGhpczEsIG9rfTsKKworJSUKKworcmVhZChUaGlzMCA9ICN0X2NvbXBhY3R7cmVhZF92YWx1ZSA9ID9DQk9PTF9OT05FfSwgYm9vbCkgLT4KKyAge1RoaXMxLCB7b2ssIEJ5dGV9fSA9IHJlYWQoVGhpczAsIHVieXRlKSwKKyAge1RoaXMxLCB7b2ssIGNib29sX3RvX2Jvb2woQnl0ZSl9fTsKKworcmVhZChUaGlzMCA9ICN0X2NvbXBhY3R7cmVhZF92YWx1ZSA9IEJvb2x9LCBib29sKSAtPgorICB7VGhpczAjdF9jb21wYWN0e3JlYWRfdmFsdWUgPSA/Q0JPT0xfTk9ORX0sIHtvaywgQm9vbH19OworCityZWFkKFRoaXMwLCB1Ynl0ZSkgLT4KKyAge1RoaXMxLCB7b2ssIDw8VmFsOjgvaW50ZWdlci11bnNpZ25lZC1iaWcsIF8vYmluYXJ5Pj59fSA9IHJlYWRfZGF0YShUaGlzMCwgMSksCisgIHtUaGlzMSwge29rLCBWYWx9fTsKKworcmVhZChUaGlzMCwgYnl0ZSkgLT4KKyAge1RoaXMxLCBCeXRlc30gPSByZWFkX2RhdGEoVGhpczAsIDEpLAorICBjYXNlIEJ5dGVzIG9mCisgICAge29rLCA8PFZhbDo4L2ludGVnZXItc2lnbmVkLWJpZywgXy9iaW5hcnk+Pn0gLT4ge1RoaXMxLCB7b2ssIFZhbH19OworICAgIEVsc2UgLT4ge1RoaXMxLCBFbHNlfQorICBlbmQ7CisKK3JlYWQoVGhpczAsIGkxNikgLT4KKyAge1RoaXMxLCB7b2ssIFppZ3phZ319ID0gcmVhZF92YXJpbnQoVGhpczAsIDAsIDApLAorICB7VGhpczEsIHtvaywgZnJvbV96aWd6YWcoWmlnemFnKX19OworCityZWFkKFRoaXMwLCB1aTMyKSAtPiByZWFkX3ZhcmludChUaGlzMCwgMCwgMCk7CisKK3JlYWQoVGhpczAsIGkzMikgLT4KKyAge1RoaXMxLCB7b2ssIFppZ3phZ319ID0gcmVhZF92YXJpbnQoVGhpczAsIDAsIDApLAorICB7VGhpczEsIHtvaywgZnJvbV96aWd6YWcoWmlnemFnKX19OworCityZWFkKFRoaXMwLCBpNjQpIC0+CisgIHtUaGlzMSwge29rLCBaaWd6YWd9fSA9IHJlYWRfdmFyaW50KFRoaXMwLCAwLCAwKSwKKyAge1RoaXMxLCB7b2ssIGZyb21femlnemFnKFppZ3phZyl9fTsKKworcmVhZChUaGlzMCwgZG91YmxlKSAtPgorICB7VGhpczEsIEJ5dGVzfSA9IHJlYWRfZGF0YShUaGlzMCwgOCksCisgIGNhc2UgQnl0ZXMgb2YKKyAgICB7b2ssIDw8VmFsOjY0L2Zsb2F0LXNpZ25lZC1saXR0bGUsIF8vYmluYXJ5Pj59IC0+IHtUaGlzMSwge29rLCBWYWx9fTsKKyAgICBFbHNlIC0+IHtUaGlzMSwgRWxzZX0KKyAgZW5kOworCislIHJldHVybnMgYSBiaW5hcnkgZGlyZWN0bHksIGNhbGwgYmluYXJ5X3RvX2xpc3QgaWYgbmVjZXNzYXJ5CityZWFkKFRoaXMwLCBzdHJpbmcpIC0+CisgIHtUaGlzMSwge29rLCBTen19ICA9IHJlYWQoVGhpczAsIHVpMzIpLAorICByZWFkX2RhdGEoVGhpczEsIFN6KS4KKworLXNwZWMgcmVhZF9kYXRhKCN0X2NvbXBhY3R7fSwgbm9uX25lZ19pbnRlZ2VyKCkpIC0+CisgICAgeyN0X2NvbXBhY3R7fSwge29rLCBiaW5hcnkoKX0gfCB7ZXJyb3IsIF9SZWFzb259fS4KK3JlYWRfZGF0YShUaGlzLCAwKSAtPiB7VGhpcywge29rLCA8PD4+fX07CityZWFkX2RhdGEoVGhpcyA9ICN0X2NvbXBhY3R7dHJhbnNwb3J0ID0gVHJhbnN9LCBMZW4pIHdoZW4gaXNfaW50ZWdlcihMZW4pIGFuZGFsc28gTGVuID4gMCAtPgorICAgIHtOZXdUcmFuc3BvcnQsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OnJlYWQoVHJhbnMsIExlbiksCisgICAge1RoaXMjdF9jb21wYWN0e3RyYW5zcG9ydCA9IE5ld1RyYW5zcG9ydH0sIFJlc3VsdH0uCisKKworJSUlJSBGQUNUT1JZIEdFTkVSQVRJT04gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorCislJSByZXR1cm5zIGEgKGZ1bigpIC0+IHRocmlmdF9wcm90b2NvbCgpKQorbmV3X3Byb3RvY29sX2ZhY3RvcnkoVHJhbnNwb3J0RmFjdG9yeSwgX09wdGlvbnMpIC0+CisgIEYgPSBmdW4oKSAtPgorICAgICAgICAgIGNhc2UgVHJhbnNwb3J0RmFjdG9yeSgpIG9mCisgICAgICAgICAgICB7b2ssIFRyYW5zcG9ydH0gLT4KKyAgICAgICAgICAgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2w6bmV3KAorICAgICAgICAgICAgICAgIFRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICBbXSk7CisgICAgICAgICAgICB7ZXJyb3IsIEVycm9yfSAtPgorICAgICAgICAgICAgICB7ZXJyb3IsIEVycm9yfQorICAgICAgICAgIGVuZAorICAgICAgZW5kLAorICB7b2ssIEZ9LgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9maWxlX3RyYW5zcG9ydC5lcmwKaW5kZXggYmEzYWE4OS4uMDcxMTUyYiAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfZmlsZV90cmFuc3BvcnQuZXJsCkBAIC0yMSw2OSArMjEsOTUgQEAKIAogLWJlaGF2aW91cih0aHJpZnRfdHJhbnNwb3J0KS4KIAotLWV4cG9ydChbbmV3X3JlYWRlci8xLAotICAgICAgICAgbmV3LzEsCi0gICAgICAgICBuZXcvMiwKLSAgICAgICAgIHdyaXRlLzIsIHJlYWQvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgorJSUgY29uc3RydWN0b3JzCistZXhwb3J0KFtuZXcvMSwgbmV3LzJdKS4KKyUlIHByb3RvY29sIGNhbGxiYWNrcworLWV4cG9ydChbcmVhZC8yLCByZWFkX2V4YWN0LzIsIHdyaXRlLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KKyUlIGxlZ2FjeSBhcGkKKy1leHBvcnQoW25ld19yZWFkZXIvMV0pLgogCi0tcmVjb3JkKHRfZmlsZV90cmFuc3BvcnQsIHtkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRfY2xvc2UgPSB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IHdyaXRlfSkuCi0tdHlwZSBzdGF0ZSgpIDo6ICN0X2ZpbGVfdHJhbnNwb3J0e30uCi0taW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCiAKLSUlJSUgQ09OU1RSVUNUSU9OICAgJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorLXJlY29yZCh0X2ZpbGUsIHsKKyAgZGV2aWNlLAorICBzaG91bGRfY2xvc2UgPSB0cnVlLAorICBtb2RlID0gd3JpdGUKK30pLgogCi1uZXdfcmVhZGVyKEZpbGVuYW1lKSAtPgotICAgIGNhc2UgZmlsZTpvcGVuKEZpbGVuYW1lLCBbcmVhZCwgYmluYXJ5LCB7cmVhZF9haGVhZCwgMTAyNCoxMDI0fV0pIG9mCi0gICAgICAgIHtvaywgSU9EZXZpY2V9IC0+Ci0gICAgICAgICAgICBuZXcoSU9EZXZpY2UsIFt7c2hvdWxkX2Nsb3NlLCB0cnVlfSwge21vZGUsIHJlYWR9XSk7Ci0gICAgICAgIEVycm9yIC0+IEVycm9yCi0gICAgZW5kLgorLXR5cGUgc3RhdGUoKSA6OiAjdF9maWxle30uCiAKLW5ldyhEZXZpY2UpIC0+Ci0gICAgbmV3KERldmljZSwgW10pLgogCi0lJSBEZXZpY2UgOjogaW9fZGV2aWNlKCkKLSUlCistc3BlYyBuZXcoRGV2aWNlOjpmaWxlOmlvX2RldmljZSgpKSAtPgorICB0aHJpZnRfdHJhbnNwb3J0OnRfdHJhbnNwb3J0KCkuCisKK25ldyhEZXZpY2UpIC0+IG5ldyhEZXZpY2UsIFtdKS4KKworLXNwZWMgbmV3KERldmljZTo6ZmlsZTppb19kZXZpY2UoKSwgT3B0czo6bGlzdCgpKSAtPgorICB0aHJpZnRfdHJhbnNwb3J0OnRfdHJhbnNwb3J0KCkuCisKICUlIERldmljZSBzaG91bGQgYmUgb3BlbmVkIGluIHJhdyBhbmQgYmluYXJ5IG1vZGUuCiBuZXcoRGV2aWNlLCBPcHRzKSB3aGVuIGlzX2xpc3QoT3B0cykgLT4KLSAgICBTdGF0ZSA9IHBhcnNlX29wdHMoT3B0cywgI3RfZmlsZV90cmFuc3BvcnR7ZGV2aWNlID0gRGV2aWNlfSksCi0gICAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgorICBTdGF0ZSA9IHBhcnNlX29wdHMoT3B0cywgI3RfZmlsZXtkZXZpY2UgPSBEZXZpY2V9KSwKKyAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgogCiAKLSUlIFBhcnNlIG9wdGlvbnMKLXBhcnNlX29wdHMoW3tzaG91bGRfY2xvc2UsIEJvb2x9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2Jvb2xlYW4oQm9vbCkgLT4KLSAgICBwYXJzZV9vcHRzKFJlc3QsIFN0YXRlI3RfZmlsZV90cmFuc3BvcnR7c2hvdWxkX2Nsb3NlID0gQm9vbH0pOwotcGFyc2Vfb3B0cyhbe21vZGUsIE1vZGV9IHwgUmVzdF0sIFN0YXRlKQotICB3aGVuIE1vZGUgPTo9IHdyaXRlOwotICAgICAgIE1vZGUgPTo9IHJlYWQgLT4KLSAgICBwYXJzZV9vcHRzKFJlc3QsIFN0YXRlI3RfZmlsZV90cmFuc3BvcnR7bW9kZSA9IE1vZGV9KTsKK3BhcnNlX29wdHMoW3tzaG91bGRfY2xvc2UsIEJvb2x9fFJlc3RdLCBTdGF0ZSkKK3doZW4gaXNfYm9vbGVhbihCb29sKSAtPgorICBwYXJzZV9vcHRzKFJlc3QsIFN0YXRlI3RfZmlsZXtzaG91bGRfY2xvc2UgPSBCb29sfSk7CitwYXJzZV9vcHRzKFt7bW9kZSwgTW9kZX18UmVzdF0sIFN0YXRlKQord2hlbiBNb2RlID06PSB3cml0ZTsgTW9kZSA9Oj0gcmVhZCAtPgorICBwYXJzZV9vcHRzKFJlc3QsIFN0YXRlI3RfZmlsZXttb2RlID0gTW9kZX0pOwogcGFyc2Vfb3B0cyhbXSwgU3RhdGUpIC0+Ci0gICAgIFN0YXRlLgorICBTdGF0ZS4KIAogCi0lJSUlIFRSQU5TUE9SVCBJTVBMICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKLQotd3JpdGUoVGhpcyA9ICN0X2ZpbGVfdHJhbnNwb3J0e2RldmljZSA9IERldmljZSwgbW9kZSA9IHdyaXRlfSwgRGF0YSkgLT4KLSAgICB7VGhpcywgZmlsZTp3cml0ZShEZXZpY2UsIERhdGEpfTsKLXdyaXRlKFRoaXMsIF9EKSAtPgotICAgIHtUaGlzLCB7ZXJyb3IsIHJlYWRfbW9kZX19LgorLWluY2x1ZGUoInRocmlmdF90cmFuc3BvcnRfYmVoYXZpb3VyLmhybCIpLgogCiAKLXJlYWQoVGhpcyA9ICN0X2ZpbGVfdHJhbnNwb3J0e2RldmljZSA9IERldmljZSwgbW9kZSA9IHJlYWR9LCBMZW4pCi0gIHdoZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgotICAgIHtUaGlzLCBmaWxlOnJlYWQoRGV2aWNlLCBMZW4pfTsKLXJlYWQoVGhpcywgX0QpIC0+Ci0gICAge1RoaXMsIHtlcnJvciwgcmVhZF9tb2RlfX0uCityZWFkKFN0YXRlID0gI3RfZmlsZXtkZXZpY2UgPSBEZXZpY2UsIG1vZGUgPSByZWFkfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIGNhc2UgZmlsZTpyZWFkKERldmljZSwgTGVuKSBvZgorICAgIGVvZiAtPiB7U3RhdGUsIHtlcnJvciwgZW9mfX07CisgICAge29rLCBSZXN1bHR9IC0+IHtTdGF0ZSwge29rLCBpb2xpc3RfdG9fYmluYXJ5KFJlc3VsdCl9fQorICBlbmQ7CityZWFkKFN0YXRlLCBfKSAtPgorICB7U3RhdGUsIHtlcnJvciwgd3JpdGVfbW9kZX19LgogCi1mbHVzaChUaGlzID0gI3RfZmlsZV90cmFuc3BvcnR7ZGV2aWNlID0gRGV2aWNlLCBtb2RlID0gd3JpdGV9KSAtPgotICAgIHtUaGlzLCBmaWxlOnN5bmMoRGV2aWNlKX0uCiAKLWNsb3NlKFRoaXMgPSAjdF9maWxlX3RyYW5zcG9ydHtkZXZpY2UgPSBEZXZpY2UsIHNob3VsZF9jbG9zZSA9IFNDfSkgLT4KLSAgICBjYXNlIFNDIG9mCi0gICAgICAgIHRydWUgLT4KLSAgICAgICAgICAgIHtUaGlzLCBmaWxlOmNsb3NlKERldmljZSl9OwotICAgICAgICBmYWxzZSAtPgotICAgICAgICAgICAge1RoaXMsIG9rfQotICAgIGVuZC4KK3JlYWRfZXhhY3QoU3RhdGUgPSAjdF9maWxle2RldmljZSA9IERldmljZSwgbW9kZSA9IHJlYWR9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgY2FzZSBmaWxlOnJlYWQoRGV2aWNlLCBMZW4pIG9mCisgICAgZW9mIC0+IHtTdGF0ZSwge2Vycm9yLCBlb2Z9fTsKKyAgICB7b2ssIFJlc3VsdH0gLT4KKyAgICAgIGNhc2UgaW9saXN0X3NpemUoUmVzdWx0KSBvZgorICAgICAgICBYIHdoZW4gWCA8IExlbiAtPiB7U3RhdGUsIHtlcnJvciwgZW9mfX07CisgICAgICAgIF8gLT4ge1N0YXRlLCB7b2ssIGlvbGlzdF90b19iaW5hcnkoUmVzdWx0KX19CisgICAgICBlbmQKKyAgZW5kOworcmVhZF9leGFjdChTdGF0ZSwgXykgLT4KKyAge1N0YXRlLCB7ZXJyb3IsIHdyaXRlX21vZGV9fS4KKworCit3cml0ZShTdGF0ZSA9ICN0X2ZpbGV7ZGV2aWNlID0gRGV2aWNlLCBtb2RlID0gd3JpdGV9LCBEYXRhKSAtPgorICB7U3RhdGUsIGZpbGU6d3JpdGUoRGV2aWNlLCBEYXRhKX07Cit3cml0ZShTdGF0ZSwgXykgLT4KKyAge1N0YXRlLCB7ZXJyb3IsIHJlYWRfbW9kZX19LgorCisKK2ZsdXNoKFN0YXRlID0gI3RfZmlsZXtkZXZpY2UgPSBEZXZpY2UsIG1vZGUgPSB3cml0ZX0pIC0+CisgIHtTdGF0ZSwgZmlsZTpzeW5jKERldmljZSl9LgorCisKK2Nsb3NlKFN0YXRlID0gI3RfZmlsZXtkZXZpY2UgPSBEZXZpY2UsIHNob3VsZF9jbG9zZSA9IFNDfSkgLT4KKyAgY2FzZSBTQyBvZgorICAgIHRydWUgLT4ge1N0YXRlLCBmaWxlOmNsb3NlKERldmljZSl9OworICAgIGZhbHNlIC0+IHtTdGF0ZSwgb2t9CisgIGVuZC4KKworCislJSBsZWdhY3kgYXBpLiBsZWZ0IGZvciBjb21wYXRpYmlsaXR5CituZXdfcmVhZGVyKEZpbGVuYW1lKSAtPgorICBjYXNlIGZpbGU6b3BlbihGaWxlbmFtZSwgW3JlYWQsIGJpbmFyeSwge3JlYWRfYWhlYWQsIDEwMjQqMTAyNH1dKSBvZgorICAgIHtvaywgSU9EZXZpY2V9IC0+IG5ldyhJT0RldmljZSwgW3tzaG91bGRfY2xvc2UsIHRydWV9LCB7bW9kZSwgcmVhZH1dKTsKKyAgICBFcnJvciAtPiBFcnJvcgorICBlbmQuCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybAppbmRleCAyYzU1MzFhLi45YTVkNmFmIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuZXJsCkBAIC0yMSw5MSArMjEsMTA2IEBACiAKIC1iZWhhdmlvdXIodGhyaWZ0X3RyYW5zcG9ydCkuCiAKLSUlIEFQSQorJSUgY29uc3RydWN0b3IKIC1leHBvcnQoW25ldy8xXSkuCislJSBwcm90b2NvbCBjYWxsYmFja3MKKy1leHBvcnQoW3JlYWQvMiwgcmVhZF9leGFjdC8yLCB3cml0ZS8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCiAKLSUlIHRocmlmdF90cmFuc3BvcnQgY2FsbGJhY2tzCi0tZXhwb3J0KFt3cml0ZS8yLCByZWFkLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KIAotLXJlY29yZChmcmFtZWRfdHJhbnNwb3J0LCB7d3JhcHBlZCwgJSBhIHRocmlmdF90cmFuc3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfYnVmZmVyLCAlIGlvbGlzdCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9idWZmZXIgJSBpb2xpc3QoKQotICAgICAgICAgICAgICAgICAgICAgICAgICB9KS4KLS10eXBlIHN0YXRlKCkgOjogI2ZyYW1lZF90cmFuc3BvcnR7fS4KKy1yZWNvcmQodF9mcmFtZWQsIHsKKyAgd3JhcHBlZCwKKyAgcmVhZF9idWZmZXIsCisgIHdyaXRlX2J1ZmZlcgorfSkuCisKKy10eXBlIHN0YXRlKCkgOjogI3RfZnJhbWVke30uCisKKworLXNwZWMgbmV3KFRyYW5zcG9ydDo6dGhyaWZ0X3RyYW5zcG9ydDp0X3RyYW5zcG9ydCgpKSAtPgorICB0aHJpZnRfdHJhbnNwb3J0OnRfdHJhbnNwb3J0KCkuCisKK25ldyhXcmFwcGVkKSAtPgorICBTdGF0ZSA9ICN0X2ZyYW1lZHsKKyAgICB3cmFwcGVkID0gV3JhcHBlZCwKKyAgICByZWFkX2J1ZmZlciA9IFtdLAorICAgIHdyaXRlX2J1ZmZlciA9IFtdCisgIH0sCisgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KKworCiAtaW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCiAKLW5ldyhXcmFwcGVkVHJhbnNwb3J0KSAtPgotICAgIFN0YXRlID0gI2ZyYW1lZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWRUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX2J1ZmZlciA9IFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfYnVmZmVyID0gW119LAotICAgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KIAotJSUgV3JpdGVzIGRhdGEgaW50byB0aGUgYnVmZmVyCi13cml0ZShTdGF0ZSA9ICNmcmFtZWRfdHJhbnNwb3J0e3dyaXRlX2J1ZmZlciA9IFdCdWZ9LCBEYXRhKSAtPgotICAgIHtTdGF0ZSNmcmFtZWRfdHJhbnNwb3J0e3dyaXRlX2J1ZmZlciA9IFtXQnVmLCBEYXRhXX0sIG9rfS4KK3JlYWQoU3RhdGUgPSAjdF9mcmFtZWR7d3JhcHBlZCA9IFdyYXBwZWQsIHJlYWRfYnVmZmVyID0gQnVmZmVyfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIEJpbmFyeSA9IGlvbGlzdF90b19iaW5hcnkoQnVmZmVyKSwKKyAgY2FzZSBCaW5hcnkgb2YKKyAgICA8PD4+IHdoZW4gTGVuID4gMCAtPgorICAgICAgY2FzZSBuZXh0X2ZyYW1lKFdyYXBwZWQpIG9mCisgICAgICAgIHtOZXdTdGF0ZSwge29rLCBGcmFtZX19IC0+CisgICAgICAgICAgTmV3QmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShbQmluYXJ5LCBGcmFtZV0pLAorICAgICAgICAgIEdpdmUgPSBtaW4oaW9saXN0X3NpemUoTmV3QmluYXJ5KSwgTGVuKSwKKyAgICAgICAgICB7UmVzdWx0LCBSZW1haW5pbmd9ID0gc3BsaXRfYmluYXJ5KE5ld0JpbmFyeSwgR2l2ZSksCisgICAgICAgICAge1N0YXRlI3RfZnJhbWVke3dyYXBwZWQgPSBOZXdTdGF0ZSwgcmVhZF9idWZmZXIgPSBSZW1haW5pbmd9LCB7b2ssIFJlc3VsdH19OworICAgICAgICB7TmV3U3RhdGUsIEVycm9yfSAtPgorICAgICAgICAgIHtTdGF0ZSN0X2ZyYW1lZHt3cmFwcGVkID0gTmV3U3RhdGV9LCBFcnJvcn0KKyAgICAgIGVuZDsKKyAgICAlJSByZWFkIG9mIHplcm8gYnl0ZXMKKyAgICA8PD4+IC0+IHtTdGF0ZSwge29rLCA8PD4+fX07CisgICAgJSUgcmVhZCBidWZmZXIgaXMgbm9uZW1wdHkKKyAgICBfIC0+CisgICAgICBHaXZlID0gbWluKGlvbGlzdF9zaXplKEJpbmFyeSksIExlbiksCisgICAgICB7UmVzdWx0LCBSZW1haW5pbmd9ID0gc3BsaXRfYmluYXJ5KEJpbmFyeSwgR2l2ZSksCisgICAgICB7U3RhdGUjdF9mcmFtZWR7cmVhZF9idWZmZXIgPSBSZW1haW5pbmd9LCB7b2ssIFJlc3VsdH19CisgIGVuZC4KIAotJSUgRmx1c2hlcyB0aGUgYnVmZmVyIHRocm91Z2ggdG8gdGhlIHdyYXBwZWQgdHJhbnNwb3J0Ci1mbHVzaChTdGF0ZTAgPSAjZnJhbWVkX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWQgPSBXcmFwcGVkMH0pIC0+Ci0gICAgRnJhbWVMZW4gPSBpb2xpc3Rfc2l6ZShCdWZmZXIpLAotICAgIERhdGEgICAgID0gWzw8RnJhbWVMZW46MzIvaW50ZWdlci1zaWduZWQtYmlnPj4sIEJ1ZmZlcl0sCiAKLSAgICB7V3JhcHBlZDEsIFJlc3BvbnNlfSA9IHRocmlmdF90cmFuc3BvcnQ6d3JpdGUoV3JhcHBlZDAsIERhdGEpLAorcmVhZF9leGFjdChTdGF0ZSA9ICN0X2ZyYW1lZHt3cmFwcGVkID0gV3JhcHBlZCwgcmVhZF9idWZmZXIgPSBCdWZmZXJ9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShCdWZmZXIpLAorICBjYXNlIGlvbGlzdF9zaXplKEJpbmFyeSkgb2YKKyAgICAlJSByZWFkIGJ1ZmZlciBpcyBsYXJnZXIgdGhhbiByZXF1ZXN0ZWQgcmVhZCBzaXplCisgICAgWCB3aGVuIFggPj0gTGVuIC0+CisgICAgICB7UmVzdWx0LCBSZW1haW5pbmd9ID0gc3BsaXRfYmluYXJ5KEJpbmFyeSwgTGVuKSwKKyAgICAgIHtTdGF0ZSN0X2ZyYW1lZHtyZWFkX2J1ZmZlciA9IFJlbWFpbmluZ30sIHtvaywgUmVzdWx0fX07CisgICAgJSUgcmVhZCBidWZmZXIgaXMgaW5zdWZmaWNpZW50IGZvciByZXF1ZXN0ZWQgcmVhZCBzaXplCisgICAgXyAtPgorICAgICAgY2FzZSBuZXh0X2ZyYW1lKFdyYXBwZWQpIG9mCisgICAgICAgIHtOZXdTdGF0ZSwge29rLCBGcmFtZX19IC0+CisgICAgICAgICAgcmVhZF9leGFjdCgKKyAgICAgICAgICAgIFN0YXRlI3RfZnJhbWVke3dyYXBwZWQgPSBOZXdTdGF0ZSwgcmVhZF9idWZmZXIgPSBbQnVmZmVyLCBGcmFtZV19LAorICAgICAgICAgICAgTGVuCisgICAgICAgICAgKTsKKyAgICAgICAge05ld1N0YXRlLCBFcnJvcn0gLT4KKyAgICAgICAgICB7U3RhdGUjdF9mcmFtZWR7d3JhcHBlZCA9IE5ld1N0YXRlfSwgRXJyb3J9CisgICAgICBlbmQKKyAgZW5kLgogCi0gICAge1dyYXBwZWQyLCBffSA9IHRocmlmdF90cmFuc3BvcnQ6Zmx1c2goV3JhcHBlZDEpLAorbmV4dF9mcmFtZShUcmFuc3BvcnQpIC0+CisgIGNhc2UgdGhyaWZ0X3RyYW5zcG9ydDpyZWFkX2V4YWN0KFRyYW5zcG9ydCwgNCkgb2YKKyAgICB7TmV3U3RhdGUsIHtvaywgPDxGcmFtZUxlbmd0aDozMi9pbnRlZ2VyLXNpZ25lZC1iaWc+Pn19IC0+CisgICAgICB0aHJpZnRfdHJhbnNwb3J0OnJlYWRfZXhhY3QoTmV3U3RhdGUsIEZyYW1lTGVuZ3RoKTsKKyAgICBFcnJvciAtPiBFcnJvcgorICBlbmQuCiAKLSAgICBTdGF0ZTEgPSBTdGF0ZTAjZnJhbWVkX3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZDIsIHdyaXRlX2J1ZmZlciA9IFtdfSwKLSAgICB7U3RhdGUxLCBSZXNwb25zZX0uCiAKLSUlIENsb3NlcyB0aGUgdHJhbnNwb3J0IGFuZCB0aGUgd3JhcHBlZCB0cmFuc3BvcnQKLWNsb3NlKFN0YXRlID0gI2ZyYW1lZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWQwfSkgLT4KLSAgICB7V3JhcHBlZDEsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OmNsb3NlKFdyYXBwZWQwKSwKLSAgICBOZXdTdGF0ZSA9IFN0YXRlI2ZyYW1lZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWQxfSwKLSAgICB7TmV3U3RhdGUsIFJlc3VsdH0uCit3cml0ZShTdGF0ZSA9ICN0X2ZyYW1lZHt3cml0ZV9idWZmZXIgPSBCdWZmZXJ9LCBEYXRhKSAtPgorICB7U3RhdGUjdF9mcmFtZWR7d3JpdGVfYnVmZmVyID0gW0J1ZmZlciwgRGF0YV19LCBva30uCiAKLSUlIFJlYWRzIGRhdGEgdGhyb3VnaCBmcm9tIHRoZSB3cmFwcGVkIHRyYW5zcG9ydAotcmVhZChTdGF0ZTAgPSAjZnJhbWVkX3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZDAsIHJlYWRfYnVmZmVyID0gUkJ1Zn0sCi0gICAgIExlbikgd2hlbiBpc19pbnRlZ2VyKExlbikgLT4KLSAgICB7V3JhcHBlZDEsIHtSQnVmMSwgUkJ1ZjFTaXplfX0gPQotICAgICAgICAlJSBpZiB0aGUgcmVhZCBidWZmZXIgaXMgZW1wdHksIHJlYWQgYW5vdGhlciBmcmFtZQotICAgICAgICAlJSBvdGhlcndpc2UsIGp1c3QgcmVhZCBmcm9tIHdoYXQncyBsZWZ0IGluIHRoZSBidWZmZXIKLSAgICAgICAgY2FzZSBpb2xpc3Rfc2l6ZShSQnVmKSBvZgotICAgICAgICAgICAgMCAtPgotICAgICAgICAgICAgICAgICUlIHJlYWQgdGhlIGZyYW1lIGxlbmd0aAotICAgICAgICAgICAgICAgIGNhc2UgdGhyaWZ0X3RyYW5zcG9ydDpyZWFkKFdyYXBwZWQwLCA0KSBvZgotICAgICAgICAgICAgICAgICAge1dyYXBwZWRTMSwKLSAgICAgICAgICAgICAgICAgICAge29rLCA8PEZyYW1lTGVuOjMyL2ludGVnZXItc2lnbmVkLWJpZywgXy9iaW5hcnk+Pn19IC0+Ci0gICAgICAgICAgICAgICAgICAgICUlIHRoZW4gcmVhZCB0aGUgZGF0YQotICAgICAgICAgICAgICAgICAgICBjYXNlIHRocmlmdF90cmFuc3BvcnQ6cmVhZChXcmFwcGVkUzEsIEZyYW1lTGVuKSBvZgotICAgICAgICAgICAgICAgICAgICAgIHtXcmFwcGVkUzIsIHtvaywgQmlufX0gLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHtXcmFwcGVkUzIsIHtCaW4sIGVybGFuZzpieXRlX3NpemUoQmluKX19OwotICAgICAgICAgICAgICAgICAgICAgIHtXcmFwcGVkUzIsIHtlcnJvciwgUmVhc29uMX19IC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICB7V3JhcHBlZFMyLCB7ZXJyb3IsIFJlYXNvbjF9fQotICAgICAgICAgICAgICAgICAgICBlbmQ7Ci0gICAgICAgICAgICAgICAgICB7V3JhcHBlZFMxLCB7ZXJyb3IsIFJlYXNvbjJ9fSAtPgotICAgICAgICAgICAgICAgICAgICB7V3JhcHBlZFMxLCB7ZXJyb3IsIFJlYXNvbjJ9fQotICAgICAgICAgICAgICAgIGVuZDsKLSAgICAgICAgICAgIFN6IC0+Ci0gICAgICAgICAgICAgICAge1dyYXBwZWQwLCB7UkJ1ZiwgU3p9fQotICAgICAgICBlbmQsCiAKLSAgICAlJSBwdWxsIG9mZiBHaXZlIGJ5dGVzLCByZXR1cm4gdGhlbSB0byB0aGUgdXNlciwgbGVhdmUgdGhlIHJlc3QgaW4gdGhlIGJ1ZmZlcgotICAgIGNhc2UgUkJ1ZjEgb2YKLSAgICAgIGVycm9yIC0+Ci0gICAgICAgIHsgU3RhdGUwI2ZyYW1lZF90cmFuc3BvcnQge3dyYXBwZWQgPSBXcmFwcGVkMSwgcmVhZF9idWZmZXIgPSBbXSB9LAotICAgICAgICAgIHtSQnVmMSwgUkJ1ZjFTaXplfSB9OwotICAgICAgXyAtPgotICAgICAgICBHaXZlID0gbWluKFJCdWYxU2l6ZSwgTGVuKSwKLSAgICAgICAgPDxEYXRhOkdpdmUvYmluYXJ5LCBSQnVmMi9iaW5hcnk+PiA9IGlvbGlzdF90b19iaW5hcnkoUkJ1ZjEpLAorZmx1c2goU3RhdGUgPSAjdF9mcmFtZWR7d3JpdGVfYnVmZmVyID0gQnVmZmVyLCB3cmFwcGVkID0gV3JhcHBlZH0pIC0+CisgIGNhc2UgaW9saXN0X3NpemUoQnVmZmVyKSBvZgorICAgICUlIGlmIHdyaXRlIGJ1ZmZlciBpcyBlbXB0eSwgZG8gbm90aGluZworICAgIDAgLT4ge1N0YXRlLCBva307CisgICAgRnJhbWVMZW4gLT4KKyAgICAgIERhdGEgPSBbPDxGcmFtZUxlbjozMi9pbnRlZ2VyLXNpZ25lZC1iaWc+PiwgQnVmZmVyXSwKKyAgICAgIHtXcml0dGVuLCBSZXNwb25zZX0gPSB0aHJpZnRfdHJhbnNwb3J0OndyaXRlKFdyYXBwZWQsIERhdGEpLAorICAgICAge0ZsdXNoZWQsIG9rfSA9IHRocmlmdF90cmFuc3BvcnQ6Zmx1c2goV3JpdHRlbiksCisgICAgICB7U3RhdGUjdF9mcmFtZWR7d3JhcHBlZCA9IEZsdXNoZWQsIHdyaXRlX2J1ZmZlciA9IFtdfSwgUmVzcG9uc2V9CisgIGVuZC4KIAotICAgICAgICB7IFN0YXRlMCNmcmFtZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkMSwgcmVhZF9idWZmZXI9UkJ1ZjJ9LAotICAgICAgICAgIHtvaywgRGF0YX0gfQotICAgIGVuZC4KIAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgSW50ZXJuYWwgZnVuY3Rpb25zCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW1pbihBLEIpIHdoZW4gQTxCIC0+IEE7Ci1taW4oXyxCKSAgICAgICAgICAtPiBCLgorY2xvc2UoU3RhdGUgPSAjdF9mcmFtZWR7d3JhcHBlZCA9IFdyYXBwZWR9KSAtPgorICB7Q2xvc2VkLCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDpjbG9zZShXcmFwcGVkKSwKKyAge1N0YXRlI3RfZnJhbWVke3dyYXBwZWQgPSBDbG9zZWR9LCBSZXN1bHR9LgogCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfaHR0cF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2h0dHBfdHJhbnNwb3J0LmVybAppbmRleCA3ZDAyMjZmLi40NmJjZWRlIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfaHR0cF90cmFuc3BvcnQuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9odHRwX3RyYW5zcG9ydC5lcmwKQEAgLTg3LDcgKzg3LDcgQEAKICAgICAgICAgICAgIHtTdGF0ZSwgb2t9OwogICAgICAgICBXQmluYXJ5IC0+CiAgICAgICAgICAgICB7b2ssIHt7X1ZlcnNpb24sIDIwMCwgX1JlYXNvblBocmFzZX0sIF9IZWFkZXJzLCBCb2R5fX0gPQotICAgICAgICAgICAgICBodHRwOnJlcXVlc3QocG9zdCwKKyAgICAgICAgICAgICAgaHR0cGM6cmVxdWVzdChwb3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJodHRwOi8vIiArKyBIb3N0ICsrIFBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3siVXNlci1BZ2VudCIsICJFcmxhbmcvdGhyaWZ0X2h0dHBfdHJhbnNwb3J0In0gfCBFeHRyYUhlYWRlcnNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi94LXRocmlmdCIsCkBAIC0xMTQsNiArMTE0LDMgQEAKICAgICAgICAgXyAtPgogICAgICAgICAgICAge1N0YXRlLCB7ZXJyb3IsICdFT0YnfX0KICAgICBlbmQuCi0KLW1pbihBLEIpIHdoZW4gQTxCIC0+IEE7Ci1taW4oXyxCKSAgICAgICAgICAtPiBCLgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2pzb25fcGFyc2VyLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9qc29uX3BhcnNlci5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU0N2YxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9qc29uX3BhcnNlci5lcmwKQEAgLTAsMCArMSw0MTkgQEAKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCislJSBUaGUganNvbiBwYXJzZXIgaW1wbGVtZW50YXRpb24gd2FzIGNyZWF0ZWQgYnkKKyUlIGFsaXNkYWlyIHN1bGxpdmFuIDxhbGlzZGFpckBoYXJ0YnJha2UuY29tPiBiYXNlZCBvbgorJSUgdGhlIGpzeCBqc29uIGxpYnJhcnkKKworLW1vZHVsZSh0aHJpZnRfanNvbl9wYXJzZXIpLgorLWV4cG9ydChbcGFyc2VyLzAsIGhhbmRsZV9ldmVudC8yXSkuCisKKworLXJlY29yZChjb25maWcsIHtzdHJpY3RfdXRmOCA9IGZhbHNlIDo6IGJvb2xlYW4oKX0pLgorCisKK3BhcnNlcigpIC0+IGZ1bihKU09OKSAtPiBzdGFydChKU09OLCB7P01PRFVMRSwgW119LCBbXSwgI2NvbmZpZ3t9KSBlbmQuCisKKworaGFuZGxlX2V2ZW50KEV2ZW50LCB7SGFuZGxlciwgU3RhdGV9LCBfQ29uZmlnKSAtPiB7SGFuZGxlciwgSGFuZGxlcjpoYW5kbGVfZXZlbnQoRXZlbnQsIFN0YXRlKX0uCisKK2hhbmRsZV9ldmVudChlbmRfanNvbiwgU3RhdGUpIC0+IGxpc3RzOnJldmVyc2UoW2VuZF9qc29uXSArKyBTdGF0ZSk7CitoYW5kbGVfZXZlbnQoRXZlbnQsIFN0YXRlKSAtPiBbRXZlbnRdICsrIFN0YXRlLgorCisKKyUlIHdoaXRlc3BhY2UKKy1kZWZpbmUoc3BhY2UsIDE2IzIwKS4KKy1kZWZpbmUodGFiLCAxNiMwOSkuCistZGVmaW5lKGNyLCAxNiMwRCkuCistZGVmaW5lKG5ld2xpbmUsIDE2IzBBKS4KKworJSUgb2JqZWN0IGRlbGltaXRlcnMKKy1kZWZpbmUoc3RhcnRfb2JqZWN0LCAxNiM3QikuCistZGVmaW5lKGVuZF9vYmplY3QsIDE2IzdEKS4KKworJSUgYXJyYXkgZGVsaW1pdGVycworLWRlZmluZShzdGFydF9hcnJheSwgMTYjNUIpLgorLWRlZmluZShlbmRfYXJyYXksIDE2IzVEKS4KKworJSUga3Ygc2VwZXJhdG9yCistZGVmaW5lKGNvbW1hLCAxNiMyQykuCistZGVmaW5lKGRvdWJsZXF1b3RlLCAxNiMyMikuCistZGVmaW5lKHNpbmdsZXF1b3RlLCAxNiMyNykuCistZGVmaW5lKGNvbG9uLCAxNiMzQSkuCisKKyUlIHN0cmluZyBlc2NhcGUgc2VxdWVuY2VzCistZGVmaW5lKHJzb2xpZHVzLCAxNiM1QykuCistZGVmaW5lKHNvbGlkdXMsIDE2IzJGKS4KKworJSUgbWF0aAorLWRlZmluZSh6ZXJvLCAxNiMzMCkuCistZGVmaW5lKGRlY2ltYWxwb2ludCwgMTYjMkUpLgorLWRlZmluZShuZWdhdGl2ZSwgMTYjMkQpLgorLWRlZmluZShwb3NpdGl2ZSwgMTYjMkIpLgorCislJSBjb21tZW50cworLWRlZmluZShzdGFyLCAxNiMyQSkuCisKKworJSUgc29tZSB1c2VmdWwgZ3VhcmRzCistZGVmaW5lKGlzX2hleChTeW1ib2wpLAorICAgIChTeW1ib2wgPj0gJGEgYW5kYWxzbyBTeW1ib2wgPTwgJGYpIG9yZWxzZQorICAgIChTeW1ib2wgPj0gJEEgYW5kYWxzbyBTeW1ib2wgPTwgJEYpIG9yZWxzZQorICAgIChTeW1ib2wgPj0gJDAgYW5kYWxzbyBTeW1ib2wgPTwgJDkpCispLgorCistZGVmaW5lKGlzX25vbnplcm8oU3ltYm9sKSwKKyAgICBTeW1ib2wgPj0gJDEgYW5kYWxzbyBTeW1ib2wgPTwgJDkKKykuCisKKy1kZWZpbmUoaXNfd2hpdGVzcGFjZShTeW1ib2wpLAorICAgIFN5bWJvbCA9Oj0gP3NwYWNlOyBTeW1ib2wgPTo9ID90YWI7IFN5bWJvbCA9Oj0gP2NyOyBTeW1ib2wgPTo9ID9uZXdsaW5lCispLgorCisKKyUlIGxpc3RzIGFyZSBiZW5jaG1hcmtlZCB0byBiZSBmYXN0ZXIgKHRobyBoaWdoZXIgaW4gbWVtb3J5IHVzYWdlKSB0aGFuIGJpbmFyaWVzCituZXdfc2VxKCkgLT4gW10uCituZXdfc2VxKEMpIC0+IFtDXS4KKworYWNjX3NlcShTZXEsIEMpIHdoZW4gaXNfbGlzdChDKSAtPiBsaXN0czpyZXZlcnNlKEMpICsrIFNlcTsKK2FjY19zZXEoU2VxLCBDKSAtPiBbQ10gKysgU2VxLgorCitlbmRfc2VxKFNlcSkgLT4gdW5pY29kZTpjaGFyYWN0ZXJzX3RvX2JpbmFyeShsaXN0czpyZXZlcnNlKFNlcSkpLgorCitlbmRfc2VxKFNlcSwgXykgLT4gZW5kX3NlcShTZXEpLgorCisKK3N0YXJ0KDw8MTYjZWYsIDE2I2JiLCAxNiNiZiwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICB2YWx1ZShSZXN0LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKTsKK3N0YXJ0KEJpbiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICB2YWx1ZShCaW4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpLgorCisKK3ZhbHVlKDw8P2RvdWJsZXF1b3RlLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBuZXdfc2VxKCksIFN0YWNrLCBDb25maWcpOwordmFsdWUoPDwkdCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICB0cnVlKFJlc3QsIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpOwordmFsdWUoPDwkZiwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICBmYWxzZShSZXN0LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKTsKK3ZhbHVlKDw8JG4sIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgbnVsbChSZXN0LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKTsKK3ZhbHVlKDw8P25lZ2F0aXZlLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIG5lZ2F0aXZlKFJlc3QsIEhhbmRsZXIsIG5ld19zZXEoJC0pLCBTdGFjaywgQ29uZmlnKTsKK3ZhbHVlKDw8P3plcm8sIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgemVybyhSZXN0LCBIYW5kbGVyLCBuZXdfc2VxKCQwKSwgU3RhY2ssIENvbmZpZyk7Cit2YWx1ZSg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIHdoZW4gP2lzX25vbnplcm8oUykgLT4KKyAgICBpbnRlZ2VyKFJlc3QsIEhhbmRsZXIsIG5ld19zZXEoUyksIFN0YWNrLCBDb25maWcpOwordmFsdWUoPDw/c3RhcnRfb2JqZWN0LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIG9iamVjdChSZXN0LCBoYW5kbGVfZXZlbnQoc3RhcnRfb2JqZWN0LCBIYW5kbGVyLCBDb25maWcpLCBba2V5fFN0YWNrXSwgQ29uZmlnKTsKK3ZhbHVlKDw8P3N0YXJ0X2FycmF5LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIGFycmF5KFJlc3QsIGhhbmRsZV9ldmVudChzdGFydF9hcnJheSwgSGFuZGxlciwgQ29uZmlnKSwgW2FycmF5fFN0YWNrXSwgQ29uZmlnKTsKK3ZhbHVlKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgd2hlbiA/aXNfd2hpdGVzcGFjZShTKSAtPgorICAgIHZhbHVlKFJlc3QsIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpOwordmFsdWUoX0JpbiwgX0hhbmRsZXIsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCitvYmplY3QoPDw/ZG91YmxlcXVvdGUsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIG5ld19zZXEoKSwgU3RhY2ssIENvbmZpZyk7CitvYmplY3QoPDw/ZW5kX29iamVjdCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgW2tleXxTdGFja10sIENvbmZpZykgLT4KKyAgICBtYXliZV9kb25lKFJlc3QsIGhhbmRsZV9ldmVudChlbmRfb2JqZWN0LCBIYW5kbGVyLCBDb25maWcpLCBTdGFjaywgQ29uZmlnKTsKK29iamVjdCg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIHdoZW4gP2lzX3doaXRlc3BhY2UoUykgLT4KKyAgICBvYmplY3QoUmVzdCwgSGFuZGxlciwgU3RhY2ssIENvbmZpZyk7CitvYmplY3QoX0JpbiwgX0hhbmRsZXIsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCithcnJheSg8PD9lbmRfYXJyYXksIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFthcnJheXxTdGFja10sIENvbmZpZykgLT4KKyAgICBtYXliZV9kb25lKFJlc3QsIGhhbmRsZV9ldmVudChlbmRfYXJyYXksIEhhbmRsZXIsIENvbmZpZyksIFN0YWNrLCBDb25maWcpOworYXJyYXkoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSB3aGVuID9pc193aGl0ZXNwYWNlKFMpIC0+CisgICAgYXJyYXkoUmVzdCwgSGFuZGxlciwgU3RhY2ssIENvbmZpZyk7CithcnJheShCaW4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgdmFsdWUoQmluLCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKS4KKworCitjb2xvbig8PD9jb2xvbiwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgW2tleXxTdGFja10sIENvbmZpZykgLT4KKyAgICB2YWx1ZShSZXN0LCBIYW5kbGVyLCBbb2JqZWN0fFN0YWNrXSwgQ29uZmlnKTsKK2NvbG9uKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgd2hlbiA/aXNfd2hpdGVzcGFjZShTKSAtPgorICAgIGNvbG9uKFJlc3QsIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpOworY29sb24oX0JpbiwgX0hhbmRsZXIsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCitrZXkoPDw/ZG91YmxlcXVvdGUsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIG5ld19zZXEoKSwgU3RhY2ssIENvbmZpZyk7CitrZXkoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSB3aGVuID9pc193aGl0ZXNwYWNlKFMpIC0+CisgICAga2V5KFJlc3QsIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpOwora2V5KF9CaW4sIF9IYW5kbGVyLCBfU3RhY2ssIF9Db25maWcpIC0+CisgICAgZXJsYW5nOmVycm9yKGJhZGFyZykuCisKKworJSUgbm90ZSB0aGF0IGlmIHlvdSBlbmNvdW50ZXIgYW4gZXJyb3IgZnJvbSBzdHJpbmcgYW5kIHlvdSBjYW4ndCBmaW5kIHRoZSBjbGF1c2UgdGhhdAorJSUgIGNhdXNlZCBpdCBoZXJlLCBpdCBtaWdodCBiZSBpbiB1bmVzY2FwZSBiZWxvdworc3RyaW5nKDw8P2RvdWJsZXF1b3RlLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgZG91YmxlcXVvdGUoUmVzdCwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PD9zb2xpZHVzLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCA/c29saWR1cyksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8P3Jzb2xpZHVzL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICB1bmVzY2FwZShSZXN0LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiMyMCwgWCA8IDE2IzIwMjggLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPT0gMTYjMjAyODsgWCA9PSAxNiMyMDI5IC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID4gMTYjMjAyOSwgWCA8IDE2I2Q4MDAgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPiAxNiNkZmZmLCBYIDwgMTYjZmRkMCAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+IDE2I2ZkZWYsIFggPCAxNiNmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2IzEwMDAwLCBYIDwgMTYjMWZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjMjAwMDAsIFggPCAxNiMyZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiMzMDAwMCwgWCA8IDE2IzNmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2IzQwMDAwLCBYIDwgMTYjNGZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjNTAwMDAsIFggPCAxNiM1ZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiM2MDAwMCwgWCA8IDE2IzZmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2IzcwMDAwLCBYIDwgMTYjN2ZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjODAwMDAsIFggPCAxNiM4ZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiM5MDAwMCwgWCA8IDE2IzlmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2I2EwMDAwLCBYIDwgMTYjYWZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjYjAwMDAsIFggPCAxNiNiZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiNjMDAwMCwgWCA8IDE2I2NmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2I2QwMDAwLCBYIDwgMTYjZGZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjZTAwMDAsIFggPCAxNiNlZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiNmMDAwMCwgWCA8IDE2I2ZmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2IzEwMDAwMCwgWCA8IDE2IzEwZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworJSUgc3Vycm9nYXRlcworc3RyaW5nKDw8MjM3LCBYLCBfLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWc9I2NvbmZpZ3tzdHJpY3RfdXRmOD1mYWxzZX0pCisgICAgICAgIHdoZW4gWCA+PSAxNjAgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIDE2I2ZmZmQpLCBTdGFjaywgQ29uZmlnKTsKKyUlIHUreGZmZmUsIHUreGZmZmYsIGNvbnRyb2wgY29kZXMgYW5kIG90aGVyIG5vbmNoYXJhY3RlcnMKK3N0cmluZyg8PF8vdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnPSNjb25maWd7c3RyaWN0X3V0Zjg9ZmFsc2V9KSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgMTYjZmZmZCksIFN0YWNrLCBDb25maWcpOworJSUgdStmZmZlIGFuZCB1K2ZmZmYgZm9yIFIxNEJYWCAoc3Vic2VxdWVudCBydW50aW1lcyB3aWxsIGhhcHBpbHkgbWF0Y2ggdGhlCislJSAgcHJlY2VkaW5nIGNsYXVzZQorc3RyaW5nKDw8MjM5LCAxOTEsIFgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZz0jY29uZmlne3N0cmljdF91dGY4PWZhbHNlfSkKKyAgICAgICAgd2hlbiBYID09IDE5MDsgWCA9PSAxOTEgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIDE2I2ZmZmQpLCBTdGFjaywgQ29uZmlnKTsKKyUlIG92ZXJsb25nIGVuY29kaW5ncyBhbmQgbWlzc2luZyBjb250aW51YXRpb25zIG9mIGEgMiBieXRlIHNlcXVlbmNlCitzdHJpbmcoPDxYLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWc9I2NvbmZpZ3tzdHJpY3RfdXRmOD1mYWxzZX0pCisgICAgICAgIHdoZW4gWCA+PSAxOTIsIFggPTwgMjIzIC0+CisgICAgc3RyaXBfY29udGludWF0aW9ucyhSZXN0LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcsIDEpOworJSUgb3ZlcmxvbmcgZW5jb2RpbmdzIGFuZCBtaXNzaW5nIGNvbnRpbnVhdGlvbnMgb2YgYSAzIGJ5dGUgc2VxdWVuY2UKK3N0cmluZyg8PFgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZz0jY29uZmlne3N0cmljdF91dGY4PWZhbHNlfSkKKyAgICAgICAgd2hlbiBYID49IDIyNCwgWCA9PCAyMzkgLT4KKyAgICBzdHJpcF9jb250aW51YXRpb25zKFJlc3QsIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZywgMik7CislJSBvdmVybG9uZyBlbmNvZGluZ3MgYW5kIG1pc3NpbmcgY29udGludWF0aW9ucyBvZiBhIDQgYnl0ZSBzZXF1ZW5jZQorc3RyaW5nKDw8WCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnPSNjb25maWd7c3RyaWN0X3V0Zjg9ZmFsc2V9KQorICAgICAgICB3aGVuIFggPj0gMjQwLCBYID08IDI0NyAtPgorICAgIHN0cmlwX2NvbnRpbnVhdGlvbnMoUmVzdCwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnLCAzKTsKKyUlIGluY29tcGxldGVzIGFuZCB1bmV4cGVjdGVkIGJ5dGVzLCBpbmNsdWRpbmcgb3JwaGFuIGNvbnRpbnVhdGlvbnMKK3N0cmluZyg8PF8sIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZz0jY29uZmlne3N0cmljdF91dGY4PWZhbHNlfSkgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIDE2I2ZmZmQpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyhfQmluLCBfSGFuZGxlciwgX0FjYywgX1N0YWNrLCBfQ29uZmlnKSAtPgorICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCitkb3VibGVxdW90ZShSZXN0LCBIYW5kbGVyLCBBY2MsIFtrZXl8X10gPSBTdGFjaywgQ29uZmlnKSAtPgorICAgIGNvbG9uKFJlc3QsIGhhbmRsZV9ldmVudCh7a2V5LCBlbmRfc2VxKEFjYywgQ29uZmlnKX0sIEhhbmRsZXIsIENvbmZpZyksIFN0YWNrLCBDb25maWcpOworZG91YmxlcXVvdGUoUmVzdCwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIG1heWJlX2RvbmUoUmVzdCwgaGFuZGxlX2V2ZW50KHtzdHJpbmcsIGVuZF9zZXEoQWNjLCBDb25maWcpfSwgSGFuZGxlciwgQ29uZmlnKSwgU3RhY2ssIENvbmZpZykuCisKKworJSUgc3RyaXBzIGNvbnRpbnVhdGlvbiBieXRlcyBhZnRlciBiYWQgdXRmIGJ5dGVzLCBndWFyZHMgYWdhaW5zdCBib3RoIHRvbyBzaG9ydAorJSUgIGFuZCBvdmVybG9uZyBzZXF1ZW5jZXMuIE4gaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHN0cmlwCitzdHJpcF9jb250aW51YXRpb25zKDw8UmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnLCAwKSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgMTYjZmZmZCksIFN0YWNrLCBDb25maWcpOworc3RyaXBfY29udGludWF0aW9ucyg8PFgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZywgTikgd2hlbiBYID49IDEyOCwgWCA9PCAxOTEgLT4KKyAgICBzdHJpcF9jb250aW51YXRpb25zKFJlc3QsIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZywgTiAtIDEpOworJSUgbm90IGEgY29udGludWF0aW9uIGJ5dGUsIGluc2VydCBhIHJlcGxhY2VtZW50IGNoYXJhY3RlciBmb3Igc2VxdWVuY2UgdGh1cworJSUgIGZhciBhbmQgZGlzcGF0Y2ggYmFjayB0byBzdHJpbmcKK3N0cmlwX2NvbnRpbnVhdGlvbnMoPDxSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcsIF8pIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAxNiNmZmZkKSwgU3RhY2ssIENvbmZpZykuCisKKworJSUgdGhpcyBhbGwgZ2V0cyByZWFsbHkgZ3Jvc3MgYW5kIHNob3VsZCBwcm9iYWJseSBldmVudHVhbGx5IGJlIGZvbGRlZCBpbnRvCislJSAgYnV0IGZvciBub3cgaXQgZmFrZXMgYmVpbmcgcGFydCBvZiBzdHJpbmcgb24gaW5jb21wbGV0ZXMgYW5kIGVycm9ycwordW5lc2NhcGUoPDwkYiwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgJFxiKSwgU3RhY2ssIENvbmZpZyk7Cit1bmVzY2FwZSg8PCRmLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAkXGYpLCBTdGFjaywgQ29uZmlnKTsKK3VuZXNjYXBlKDw8JG4sIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsICRcbiksIFN0YWNrLCBDb25maWcpOwordW5lc2NhcGUoPDwkciwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgJFxyKSwgU3RhY2ssIENvbmZpZyk7Cit1bmVzY2FwZSg8PCR0LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAkXHQpLCBTdGFjaywgQ29uZmlnKTsKK3VuZXNjYXBlKDw8P2RvdWJsZXF1b3RlLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAkXCIpLCBTdGFjaywgQ29uZmlnKTsKK3VuZXNjYXBlKDw8P3Jzb2xpZHVzLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAkXFwpLCBTdGFjaywgQ29uZmlnKTsKK3VuZXNjYXBlKDw8P3NvbGlkdXMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsICQvKSwgU3RhY2ssIENvbmZpZyk7Cit1bmVzY2FwZSg8PCR1LCAkZCwgQSwgQiwgQywgP3Jzb2xpZHVzLCAkdSwgJGQsIFgsIFksIFosIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykKKyAgICAgICAgd2hlbiAoQSA9PSAkOCBvcmVsc2UgQSA9PSAkOSBvcmVsc2UgQSA9PSAkYSBvcmVsc2UgQSA9PSAkYiksCisgICAgICAgICAgICAgKFggPT0gJGMgb3JlbHNlIFggPT0gJGQgb3JlbHNlIFggPT0gJGUgb3JlbHNlIFggPT0gJGYpLAorICAgICAgICAgICAgID9pc19oZXgoQiksID9pc19oZXgoQyksID9pc19oZXgoWSksID9pc19oZXgoWikKKyAgICAgICAgLT4KKyAgICBIaWdoID0gZXJsYW5nOmxpc3RfdG9faW50ZWdlcihbJGQsIEEsIEIsIENdLCAxNiksCisgICAgTG93ID0gZXJsYW5nOmxpc3RfdG9faW50ZWdlcihbJGQsIFgsIFksIFpdLCAxNiksCisgICAgQ29kZXBvaW50ID0gKEhpZ2ggLSAxNiNkODAwKSAqIDE2IzQwMCArIChMb3cgLSAxNiNkYzAwKSArIDE2IzEwMDAwLAorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgQ29kZXBvaW50KSwgU3RhY2ssIENvbmZpZyk7Cit1bmVzY2FwZSg8PCR1LCAkZCwgQSwgQiwgQywgP3Jzb2xpZHVzLCAkdSwgVywgWCwgWSwgWiwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKQorICAgICAgICB3aGVuIChBID09ICQ4IG9yZWxzZSBBID09ICQ5IG9yZWxzZSBBID09ICRhIG9yZWxzZSBBID09ICRiKSwKKyAgICAgICAgICAgICA/aXNfaGV4KEIpLCA/aXNfaGV4KEMpLCA/aXNfaGV4KFcpLCA/aXNfaGV4KFgpLCA/aXNfaGV4KFkpLCA/aXNfaGV4KFopCisgICAgICAgIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBbMTYjZmZmZCwgMTYjZmZmZF0pLCBTdGFjaywgQ29uZmlnKTsKK3VuZXNjYXBlKDw8JHUsIEEsIEIsIEMsIEQsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykKKyAgICAgICAgd2hlbiA/aXNfaGV4KEEpLCA/aXNfaGV4KEIpLCA/aXNfaGV4KEMpLCA/aXNfaGV4KEQpIC0+CisgICAgY2FzZSBlcmxhbmc6bGlzdF90b19pbnRlZ2VyKFtBLCBCLCBDLCBEXSwgMTYpIG9mCisgICAgICAgIENvZGVwb2ludCB3aGVuIENvZGVwb2ludCA8IDE2I2Q4MDA7IENvZGVwb2ludCA+IDE2I2RmZmYgLT4KKyAgICAgICAgICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgQ29kZXBvaW50KSwgU3RhY2ssIENvbmZpZyk7CisgICAgICAgIF8gLT4KKyAgICAgICAgICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgMTYjZmZmZCksIFN0YWNrLCBDb25maWcpCisgICAgZW5kOwordW5lc2NhcGUoX0JpbiwgX0hhbmRsZXIsIF9BY2MsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCislJSBsaWtlIGluIHN0cmluZ3MsIHRoZXJlJ3Mgc29tZSBwc2V1ZG8gc3RhdGVzIGluIGhlcmUgdGhhdCB3aWxsIG5ldmVyCislJSAgc2hvdyB1cCBpbiBlcnJvcnMgb3IgaW5jb21wbGV0ZXMuIHNvbWUgc2hvdyB1cCBpbiB2YWx1ZSwgc29tZSBzaG93CislJSAgdXAgaW4gaW50ZWdlciwgZGVjaW1hbCBvciBleHAKK25lZ2F0aXZlKDw8JDAsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICB6ZXJvKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAkMCksIFN0YWNrLCBDb25maWcpOworbmVnYXRpdmUoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gP2lzX25vbnplcm8oUykgLT4KKyAgICBpbnRlZ2VyKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBTKSwgU3RhY2ssIENvbmZpZyk7CituZWdhdGl2ZShfQmluLCBfSGFuZGxlciwgX0FjYywgX1N0YWNrLCBfQ29uZmlnKSAtPgorICAgIGVybGFuZzplcnJvcihiYWRhcmcpLgorCisKK3plcm8oPDw/ZGVjaW1hbHBvaW50LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgZGVjaW1hbChSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgP2RlY2ltYWxwb2ludCksIFN0YWNrLCBDb25maWcpOworemVybyg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBTID06PSAkZTsgUyA9Oj0gJEUgLT4KKyAgICBlKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAiLjBlIiksIFN0YWNrLCBDb25maWcpOworemVybyhCaW4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBmaW5pc2hfbnVtYmVyKEJpbiwgSGFuZGxlciwge3plcm8sIEFjY30sIFN0YWNrLCBDb25maWcpLgorCisKK2ludGVnZXIoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gUyA9Oj0gP3plcm87ID9pc19ub256ZXJvKFMpIC0+CisgICAgaW50ZWdlcihSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgUyksIFN0YWNrLCBDb25maWcpOworaW50ZWdlcig8PD9kZWNpbWFscG9pbnQsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBpbml0aWFsZGVjaW1hbChSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgP2RlY2ltYWxwb2ludCksIFN0YWNrLCBDb25maWcpOworaW50ZWdlcig8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBTID06PSAkZTsgUyA9Oj0gJEUgLT4KKyAgICBlKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAiLjBlIiksIFN0YWNrLCBDb25maWcpOworaW50ZWdlcihCaW4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBmaW5pc2hfbnVtYmVyKEJpbiwgSGFuZGxlciwge2ludGVnZXIsIEFjY30sIFN0YWNrLCBDb25maWcpLgorCisKK2luaXRpYWxkZWNpbWFsKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFMgPTo9ID96ZXJvOyA/aXNfbm9uemVybyhTKSAtPgorICAgIGRlY2ltYWwoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFMpLCBTdGFjaywgQ29uZmlnKTsKK2luaXRpYWxkZWNpbWFsKF9CaW4sIF9IYW5kbGVyLCBfQWNjLCBfU3RhY2ssIF9Db25maWcpIC0+CisgICAgZXJsYW5nOmVycm9yKGJhZGFyZykuCisKKworZGVjaW1hbCg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBTID06PSA/emVybzsgP2lzX25vbnplcm8oUykgLT4KKyAgICBkZWNpbWFsKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBTKSwgU3RhY2ssIENvbmZpZyk7CitkZWNpbWFsKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFMgPTo9ICRlOyBTID06PSAkRSAtPgorICAgIGUoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsICRlKSwgU3RhY2ssIENvbmZpZyk7CitkZWNpbWFsKEJpbiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIGZpbmlzaF9udW1iZXIoQmluLCBIYW5kbGVyLCB7ZGVjaW1hbCwgQWNjfSwgU3RhY2ssIENvbmZpZykuCisKKworZSg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBTID06PSA/emVybzsgP2lzX25vbnplcm8oUykgLT4KKyAgICBleHAoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFMpLCBTdGFjaywgQ29uZmlnKTsKK2UoPDxTaWduLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gU2lnbiA9Oj0gP3Bvc2l0aXZlOyBTaWduID06PSA/bmVnYXRpdmUgLT4KKyAgICBleChSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgU2lnbiksIFN0YWNrLCBDb25maWcpOworZShfQmluLCBfSGFuZGxlciwgX0FjYywgX1N0YWNrLCBfQ29uZmlnKSAtPgorICAgIGVybGFuZzplcnJvcihiYWRhcmcpLgorCisKK2V4KDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFMgPTo9ID96ZXJvOyA/aXNfbm9uemVybyhTKSAtPgorICAgIGV4cChSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgUyksIFN0YWNrLCBDb25maWcpOworZXgoX0JpbiwgX0hhbmRsZXIsIF9BY2MsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCitleHAoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gUyA9Oj0gP3plcm87ID9pc19ub256ZXJvKFMpIC0+CisgICAgZXhwKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBTKSwgU3RhY2ssIENvbmZpZyk7CitleHAoQmluLCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgZmluaXNoX251bWJlcihCaW4sIEhhbmRsZXIsIHtleHAsIEFjY30sIFN0YWNrLCBDb25maWcpLgorCisKK2ZpbmlzaF9udW1iZXIoUmVzdCwgSGFuZGxlciwgQWNjLCBbXSwgQ29uZmlnKSAtPgorICAgIG1heWJlX2RvbmUoUmVzdCwgaGFuZGxlX2V2ZW50KGZvcm1hdF9udW1iZXIoQWNjKSwgSGFuZGxlciwgQ29uZmlnKSwgW10sIENvbmZpZyk7CitmaW5pc2hfbnVtYmVyKFJlc3QsIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBtYXliZV9kb25lKFJlc3QsIGhhbmRsZV9ldmVudChmb3JtYXRfbnVtYmVyKEFjYyksIEhhbmRsZXIsIENvbmZpZyksIFN0YWNrLCBDb25maWcpLgorCisKK2Zvcm1hdF9udW1iZXIoe3plcm8sIEFjY30pIC0+IHtpbnRlZ2VyLCBsaXN0X3RvX2ludGVnZXIobGlzdHM6cmV2ZXJzZShBY2MpKX07Citmb3JtYXRfbnVtYmVyKHtpbnRlZ2VyLCBBY2N9KSAtPiB7aW50ZWdlciwgbGlzdF90b19pbnRlZ2VyKGxpc3RzOnJldmVyc2UoQWNjKSl9OworZm9ybWF0X251bWJlcih7ZGVjaW1hbCwgQWNjfSkgLT4ge2Zsb2F0LCBsaXN0X3RvX2Zsb2F0KGxpc3RzOnJldmVyc2UoQWNjKSl9OworZm9ybWF0X251bWJlcih7ZXhwLCBBY2N9KSAtPiB7ZmxvYXQsIGxpc3RfdG9fZmxvYXQobGlzdHM6cmV2ZXJzZShBY2MpKX0uCisKKwordHJ1ZSg8PCRyLCAkdSwgJGUsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgbWF5YmVfZG9uZShSZXN0LCBoYW5kbGVfZXZlbnQoe2xpdGVyYWwsIHRydWV9LCBIYW5kbGVyLCBDb25maWcpLCBTdGFjaywgQ29uZmlnKTsKK3RydWUoX0JpbiwgX0hhbmRsZXIsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCitmYWxzZSg8PCRhLCAkbCwgJHMsICRlLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIG1heWJlX2RvbmUoUmVzdCwgaGFuZGxlX2V2ZW50KHtsaXRlcmFsLCBmYWxzZX0sIEhhbmRsZXIsIENvbmZpZyksIFN0YWNrLCBDb25maWcpOworZmFsc2UoX0JpbiwgX0hhbmRsZXIsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCitudWxsKDw8JHUsICRsLCAkbCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICBtYXliZV9kb25lKFJlc3QsIGhhbmRsZV9ldmVudCh7bGl0ZXJhbCwgbnVsbH0sIEhhbmRsZXIsIENvbmZpZyksIFN0YWNrLCBDb25maWcpOworbnVsbChfQmluLCBfSGFuZGxlciwgX1N0YWNrLCBfQ29uZmlnKSAtPgorICAgIGVybGFuZzplcnJvcihiYWRhcmcpLgorCisKK21heWJlX2RvbmUoPDxSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBbXSwgQ29uZmlnKSAtPgorICAgIGRvbmUoUmVzdCwgaGFuZGxlX2V2ZW50KGVuZF9qc29uLCBIYW5kbGVyLCBDb25maWcpLCBbXSwgQ29uZmlnKTsKK21heWJlX2RvbmUoPDw/ZW5kX29iamVjdCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgW29iamVjdHxTdGFja10sIENvbmZpZykgLT4KKyAgICBtYXliZV9kb25lKFJlc3QsIGhhbmRsZV9ldmVudChlbmRfb2JqZWN0LCBIYW5kbGVyLCBDb25maWcpLCBTdGFjaywgQ29uZmlnKTsKK21heWJlX2RvbmUoPDw/ZW5kX2FycmF5LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBbYXJyYXl8U3RhY2tdLCBDb25maWcpIC0+CisgICAgbWF5YmVfZG9uZShSZXN0LCBoYW5kbGVfZXZlbnQoZW5kX2FycmF5LCBIYW5kbGVyLCBDb25maWcpLCBTdGFjaywgQ29uZmlnKTsKK21heWJlX2RvbmUoPDw/Y29tbWEsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFtvYmplY3R8U3RhY2tdLCBDb25maWcpIC0+CisgICAga2V5KFJlc3QsIEhhbmRsZXIsIFtrZXl8U3RhY2tdLCBDb25maWcpOworbWF5YmVfZG9uZSg8PD9jb21tYSwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgW2FycmF5fF9dID0gU3RhY2ssIENvbmZpZykgLT4KKyAgICB2YWx1ZShSZXN0LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKTsKK21heWJlX2RvbmUoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSB3aGVuID9pc193aGl0ZXNwYWNlKFMpIC0+CisgICAgbWF5YmVfZG9uZShSZXN0LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKTsKK21heWJlX2RvbmUoX0JpbiwgX0hhbmRsZXIsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCitkb25lKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgW10sIENvbmZpZykgd2hlbiA/aXNfd2hpdGVzcGFjZShTKSAtPgorICAgIGRvbmUoUmVzdCwgSGFuZGxlciwgW10sIENvbmZpZyk7Citkb25lKDw8Pj4sIHtfSGFuZGxlciwgU3RhdGV9LCBbXSwgX0NvbmZpZykgLT4gU3RhdGU7Citkb25lKF9CaW4sIF9IYW5kbGVyLCBfU3RhY2ssIF9Db25maWcpIC0+IGVybGFuZzplcnJvcihiYWRhcmcpLgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2pzb25fcHJvdG9jb2wuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2pzb25fcHJvdG9jb2wuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZjNkYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfanNvbl9wcm90b2NvbC5lcmwKQEAgLTAsMCArMSw1NjcgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorJSUgVGhlIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gd2FzIGNyZWF0ZWQgYnkKKyUlIFBldGVyIE5ldW1hcmsgPG5ldW1hcmsucGV0ZXJAZ21haWwuY29tPiBiYXNlZCBvbgorJSUgdGhlIGJpbmFyeSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbi4KKworLW1vZHVsZSh0aHJpZnRfanNvbl9wcm90b2NvbCkuCisKKy1iZWhhdmlvdXIodGhyaWZ0X3Byb3RvY29sKS4KKworLWluY2x1ZGUoInRocmlmdF9jb25zdGFudHMuaHJsIikuCistaW5jbHVkZSgidGhyaWZ0X3Byb3RvY29sLmhybCIpLgorCistZXhwb3J0KFtuZXcvMSwgbmV3LzIsCisgICAgICAgICByZWFkLzIsCisgICAgICAgICB3cml0ZS8yLAorICAgICAgICAgZmx1c2hfdHJhbnNwb3J0LzEsCisgICAgICAgICBjbG9zZV90cmFuc3BvcnQvMSwKKyAgICAgICAgIG5ld19wcm90b2NvbF9mYWN0b3J5LzIKKyAgICAgICAgXSkuCisKKy1yZWNvcmQoanNvbl9jb250ZXh0LCB7CisgICAgJSB0aGUgdHlwZSBvZiBqc29uX2NvbnRleHQ6IGFycmF5IG9yIG9iamVjdAorICAgIHR5cGUsCisgICAgJSBmaWVsZHMgcmVhZCBvciB3cml0dGVuCisgICAgZmllbGRzX3Byb2Nlc3NlZCA9IDAKK30pLgorCistcmVjb3JkKGpzb25fcHJvdG9jb2wsIHsKKyAgICB0cmFuc3BvcnQsCisgICAgY29udGV4dF9zdGFjayA9IFtdLAorICAgIGpzeAorfSkuCistdHlwZSBzdGF0ZSgpIDo6ICNqc29uX3Byb3RvY29se30uCistaW5jbHVkZSgidGhyaWZ0X3Byb3RvY29sX2JlaGF2aW91ci5ocmwiKS4KKworLWRlZmluZShWRVJTSU9OXzEsIDEpLgorLWRlZmluZShKU09OX0RPVUJMRV9QUkVDSVNJT04sIDE2KS4KKwordHlwZWlkX3RvX2pzb24oP3RUeXBlX0JPT0wpIC0+ICJ0ZiI7Cit0eXBlaWRfdG9fanNvbig/dFR5cGVfQllURSkgLT4gImk4IjsKK3R5cGVpZF90b19qc29uKD90VHlwZV9ET1VCTEUpIC0+ICJkYmwiOwordHlwZWlkX3RvX2pzb24oP3RUeXBlX0k4KSAtPiAiaTgiOwordHlwZWlkX3RvX2pzb24oP3RUeXBlX0kxNikgLT4gImkxNiI7Cit0eXBlaWRfdG9fanNvbig/dFR5cGVfSTMyKSAtPiAiaTMyIjsKK3R5cGVpZF90b19qc29uKD90VHlwZV9JNjQpIC0+ICJpNjQiOwordHlwZWlkX3RvX2pzb24oP3RUeXBlX1NUUklORykgLT4gInN0ciI7Cit0eXBlaWRfdG9fanNvbig/dFR5cGVfU1RSVUNUKSAtPiAicmVjIjsKK3R5cGVpZF90b19qc29uKD90VHlwZV9NQVApIC0+ICJtYXAiOwordHlwZWlkX3RvX2pzb24oP3RUeXBlX1NFVCkgLT4gInNldCI7Cit0eXBlaWRfdG9fanNvbig/dFR5cGVfTElTVCkgLT4gImxzdCIuCisKK2pzb25fdG9fdHlwZWlkKCJ0ZiIpIC0+ID90VHlwZV9CT09MOworanNvbl90b190eXBlaWQoImRibCIpIC0+ID90VHlwZV9ET1VCTEU7Citqc29uX3RvX3R5cGVpZCgiaTgiKSAtPiA/dFR5cGVfSTg7Citqc29uX3RvX3R5cGVpZCgiaTE2IikgLT4gP3RUeXBlX0kxNjsKK2pzb25fdG9fdHlwZWlkKCJpMzIiKSAtPiA/dFR5cGVfSTMyOworanNvbl90b190eXBlaWQoImk2NCIpIC0+ID90VHlwZV9JNjQ7Citqc29uX3RvX3R5cGVpZCgic3RyIikgLT4gP3RUeXBlX1NUUklORzsKK2pzb25fdG9fdHlwZWlkKCJyZWMiKSAtPiA/dFR5cGVfU1RSVUNUOworanNvbl90b190eXBlaWQoIm1hcCIpIC0+ID90VHlwZV9NQVA7Citqc29uX3RvX3R5cGVpZCgic2V0IikgLT4gP3RUeXBlX1NFVDsKK2pzb25fdG9fdHlwZWlkKCJsc3QiKSAtPiA/dFR5cGVfTElTVC4KKworc3RhcnRfY29udGV4dChvYmplY3QpIC0+ICJ7IjsKK3N0YXJ0X2NvbnRleHQoYXJyYXkpIC0+ICJbIi4KKworZW5kX2NvbnRleHQob2JqZWN0KSAtPiAifSI7CitlbmRfY29udGV4dChhcnJheSkgLT4gIl0iLgorCisKK25ldyhUcmFuc3BvcnQpIC0+CisgICAgbmV3KFRyYW5zcG9ydCwgX09wdGlvbnMgPSBbXSkuCisKK25ldyhUcmFuc3BvcnQsIF9PcHRpb25zKSAtPgorICAgIFN0YXRlICA9ICNqc29uX3Byb3RvY29se3RyYW5zcG9ydCA9IFRyYW5zcG9ydH0sCisgICAgdGhyaWZ0X3Byb3RvY29sOm5ldyg/TU9EVUxFLCBTdGF0ZSkuCisKK2ZsdXNoX3RyYW5zcG9ydChUaGlzID0gI2pzb25fcHJvdG9jb2x7dHJhbnNwb3J0ID0gVHJhbnNwb3J0fSkgLT4KKyAgICB7TmV3VHJhbnNwb3J0LCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDpmbHVzaChUcmFuc3BvcnQpLAorICAgIHtUaGlzI2pzb25fcHJvdG9jb2x7CisgICAgICAgICAgICB0cmFuc3BvcnQgPSBOZXdUcmFuc3BvcnQsCisgICAgICAgICAgICBjb250ZXh0X3N0YWNrID0gW10KKyAgICAgICAgfSwgUmVzdWx0fS4KKworY2xvc2VfdHJhbnNwb3J0KFRoaXMgPSAjanNvbl9wcm90b2NvbHt0cmFuc3BvcnQgPSBUcmFuc3BvcnR9KSAtPgorICAgIHtOZXdUcmFuc3BvcnQsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OmNsb3NlKFRyYW5zcG9ydCksCisgICAge1RoaXMjanNvbl9wcm90b2NvbHsKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IE5ld1RyYW5zcG9ydCwKKyAgICAgICAgICAgIGNvbnRleHRfc3RhY2sgPSBbXSwKKyAgICAgICAgICAgIGpzeCA9IHVuZGVmaW5lZAorICAgICAgICB9LCBSZXN1bHR9LgorCislJSUKKyUlJSBpbnN0YW5jZSBtZXRob2RzCislJSUKKyUgcGxhY2VzIGEgbmV3IGNvbnRleHQgb24gdGhlIHN0YWNrOgord3JpdGUoI2pzb25fcHJvdG9jb2x7Y29udGV4dF9zdGFjayA9IFN0YWNrfSA9IFN0YXRlMCwge2VudGVyX2NvbnRleHQsIFR5cGV9KSAtPgorICAgIHtTdGF0ZTEsIG9rfSA9IHdyaXRlX3ZhbHVlcyhTdGF0ZTAsIFt7Y29udGV4dF9wcmVfaXRlbSwgZmFsc2V9XSksCisgICAgU3RhdGUyID0gU3RhdGUxI2pzb25fcHJvdG9jb2x7Y29udGV4dF9zdGFjayA9IFsKKyAgICAgICAgI2pzb25fY29udGV4dHt0eXBlPVR5cGV9fFN0YWNrXX0sCisgICAgd3JpdGVfdmFsdWVzKFN0YXRlMiwgIFtsaXN0X3RvX2JpbmFyeShzdGFydF9jb250ZXh0KFR5cGUpKV0pOworCislIHJlbW92ZXMgdGhlIHRvcG1vc3QgY29udGV4dCBmcm9tIHN0YWNrICAgIAord3JpdGUoI2pzb25fcHJvdG9jb2x7Y29udGV4dF9zdGFjayA9IFtDdXJyQ3R4dHxTdGFja119ID0gU3RhdGUwLCB7ZXhpdF9jb250ZXh0fSkgLT4KKyAgICBUeXBlID0gQ3VyckN0eHQjanNvbl9jb250ZXh0LnR5cGUsCisgICAgU3RhdGUxID0gU3RhdGUwI2pzb25fcHJvdG9jb2x7Y29udGV4dF9zdGFjayA9IFN0YWNrfSwKKyAgICB3cml0ZV92YWx1ZXMoU3RhdGUxLCBbCisgICAgICAgICAgICBsaXN0X3RvX2JpbmFyeShlbmRfY29udGV4dChUeXBlKSksCisgICAgICAgICAgICB7Y29udGV4dF9wb3N0X2l0ZW0sIGZhbHNlfQorICAgICAgICBdKTsKKworJSB3cml0ZXMgbmVjZXNzYXJ5IHByZWx1ZGUgdG8gZmllbGQgb3IgY29udGFpbmVyIGRlcGVuZGluZyBvbiBjdXJyZW50IGNvbnRleHQgICAKK3dyaXRlKCNqc29uX3Byb3RvY29se2NvbnRleHRfc3RhY2sgPSBbXX0gPSBUaGlzMCwKKyAgICB7Y29udGV4dF9wcmVfaXRlbSwgX30pIC0+IHtUaGlzMCwgb2t9Oword3JpdGUoI2pzb25fcHJvdG9jb2x7Y29udGV4dF9zdGFjayA9IFtDb250ZXh0fF9DdHh0VGFpbF19ID0gVGhpczAsCisgICAge2NvbnRleHRfcHJlX2l0ZW0sIE1heU5lZWRRdW90ZXN9KSAtPgorICAgIEZpZWxkTm8gPSBDb250ZXh0I2pzb25fY29udGV4dC5maWVsZHNfcHJvY2Vzc2VkLAorICAgIEN0eHRUeXBlID0gQ29udGV4dCNqc29uX2NvbnRleHQudHlwZSwKKyAgICBSZW0gPSBGaWVsZE5vIHJlbSAyLAorICAgIGNhc2Uge0N0eHRUeXBlLCBGaWVsZE5vLCBSZW0sIE1heU5lZWRRdW90ZXN9IG9mCisgICAgICAgIHthcnJheSwgTiwgXywgX30gd2hlbiBOID4gMCAtPiAgJSBhcnJheSBlbGVtZW50IChub3QgZmlyc3QpCisgICAgICAgICAgICB3cml0ZShUaGlzMCwgPDwiLCI+Pik7CisgICAgICAgIHtvYmplY3QsIDAsIF8sIHRydWV9IC0+ICUgbm9uLXN0cmluZyBvYmplY3Qga2V5IChmaXJzdCkKKyAgICAgICAgICAgIHdyaXRlKFRoaXMwLCA8PCJcIiI+Pik7CisgICAgICAgIHtvYmplY3QsIE4sIDAsIHRydWV9IHdoZW4gTiA+IDAgLT4gJSBub24tc3RyaW5nIG9iamVjdCBrZXkgKG5vdCBmaXJzdCkKKyAgICAgICAgICAgIHdyaXRlKFRoaXMwLCA8PCIsXCIiPj4pOworICAgICAgICB7b2JqZWN0LCBOLCAwLCBmYWxzZX0gd2hlbiBOID4gMC0+ICUgc3RyaW5nIG9iamVjdCBrZXkgKG5vdCBmaXJzdCkKKyAgICAgICAgICAgIHdyaXRlKFRoaXMwLCA8PCIsIj4+KTsKKyAgICAgICAgXyAtPiAlIG5vIHByZS1maWVsZCBuZWNlc3NhcnkKKyAgICAgICAgICAgIHtUaGlzMCwgb2t9CisgICAgZW5kOworCislIHdyaXRlcyBuZWNlc3NhcnkgcG9zdGx1ZGUgdG8gZmllbGQgb3IgY29udGFpbmVyIGRlcGVuZGluZyBvbiBjdXJyZW50IGNvbnRleHQgICAKK3dyaXRlKCNqc29uX3Byb3RvY29se2NvbnRleHRfc3RhY2sgPSBbXX0gPSBUaGlzMCwKKyAgICB7Y29udGV4dF9wb3N0X2l0ZW0sIF99KSAtPiB7VGhpczAsIG9rfTsKK3dyaXRlKCNqc29uX3Byb3RvY29se2NvbnRleHRfc3RhY2sgPSBbQ29udGV4dHxDdHh0VGFpbF19ID0gVGhpczAsCisgICAge2NvbnRleHRfcG9zdF9pdGVtLCBNYXlOZWVkUXVvdGVzfSkgLT4KKyAgICBGaWVsZE5vID0gQ29udGV4dCNqc29uX2NvbnRleHQuZmllbGRzX3Byb2Nlc3NlZCwKKyAgICBDdHh0VHlwZSA9IENvbnRleHQjanNvbl9jb250ZXh0LnR5cGUsCisgICAgUmVtID0gRmllbGRObyByZW0gMiwKKyAgICB7VGhpczEsIG9rfSA9IGNhc2Uge0N0eHRUeXBlLCBSZW0sIE1heU5lZWRRdW90ZXN9IG9mCisgICAgICAgIHtvYmplY3QsIDAsIHRydWV9IC0+ICUgbm9uLXN0cmluZyBvYmplY3Qga2V5IAorICAgICAgICAgICAgd3JpdGUoVGhpczAsIDw8IlwiOiI+Pik7CisgICAgICAgIHtvYmplY3QsIDAsIGZhbHNlfSAtPiAlIHN0cmluZyBvYmplY3Qga2V5IAorICAgICAgICAgICAgd3JpdGUoVGhpczAsIDw8IjoiPj4pOworICAgICAgICBfIC0+ICUgbm8gcHJlLWZpZWxkIG5lY2Vzc2FyeQorICAgICAgICAgICAge1RoaXMwLCBva30KKyAgICBlbmQsCisgICAgTmV3Q29udGV4dCA9IENvbnRleHQjanNvbl9jb250ZXh0e2ZpZWxkc19wcm9jZXNzZWQgPSBGaWVsZE5vICsgMX0sCisgICAge1RoaXMxI2pzb25fcHJvdG9jb2x7Y29udGV4dF9zdGFjaz1bTmV3Q29udGV4dHxDdHh0VGFpbF19LCBva307CisKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsKKyAgICBuYW1lID0gTmFtZSwKKyAgICB0eXBlID0gVHlwZSwKKyAgICBzZXFpZCA9IFNlcWlkfSkgLT4KKyAgICB3cml0ZV92YWx1ZXMoVGhpczAsIFsKKyAgICAgICAge2VudGVyX2NvbnRleHQsIGFycmF5fSwKKyAgICAgICAge2kzMiwgP1ZFUlNJT05fMX0sCisgICAgICAgIHtzdHJpbmcsIE5hbWV9LAorICAgICAgICB7aTMyLCBUeXBlfSwKKyAgICAgICAge2kzMiwgU2VxaWR9CisgICAgXSk7CisKK3dyaXRlKFRoaXMsIG1lc3NhZ2VfZW5kKSAtPiAgCisgICAgd3JpdGVfdmFsdWVzKFRoaXMsIFt7ZXhpdF9jb250ZXh0fV0pOworCislIEV4YW1wbGUgZmllbGQgZXhwcmVzc2lvbjogIjEiOnsiZGJsIjozLjE0fQord3JpdGUoVGhpczAsICNwcm90b2NvbF9maWVsZF9iZWdpbnsKKyAgICAgICBuYW1lID0gX05hbWUsCisgICAgICAgdHlwZSA9IFR5cGUsCisgICAgICAgaWQgPSBJZH0pIC0+CisgICAgd3JpdGVfdmFsdWVzKFRoaXMwLCBbCisgICAgICAgICUgZW50ZXJpbmcgJ291dGVyJyBvYmplY3QKKyAgICAgICAge2kxNiwgSWR9LAorICAgICAgICAlIGVudGVyaW5nICdvdXRlcicgb2JqZWN0CisgICAgICAgIHtlbnRlcl9jb250ZXh0LCBvYmplY3R9LAorICAgICAgICB7c3RyaW5nLCB0eXBlaWRfdG9fanNvbihUeXBlKX0KKyAgICBdKTsKKword3JpdGUoVGhpcywgZmllbGRfc3RvcCkgLT4gCisgICAge1RoaXMsIG9rfTsKKword3JpdGUoVGhpcywgZmllbGRfZW5kKSAtPiAKKyAgICB3cml0ZV92YWx1ZXMoVGhpcyxbe2V4aXRfY29udGV4dH1dKTsKKworJSBFeGFtcGxlIG1lc3NhZ2Ugd2l0aCBtYXA6IFsxLCJ0ZXN0TWFwIiwxLDAseyIxIjp7Im1hcCI6WyJpMzIiLCJpMzIiLDMseyI3Ijo3NywiOCI6ODgsIjkiOjk5fV19fV0KK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfbWFwX2JlZ2lueworICAgICAgIGt0eXBlID0gS3R5cGUsCisgICAgICAgdnR5cGUgPSBWdHlwZSwKKyAgICAgICBzaXplID0gU2l6ZX0pIC0+CisgICAgd3JpdGVfdmFsdWVzKFRoaXMwLCBbCisgICAgICAgIHtlbnRlcl9jb250ZXh0LCBhcnJheX0sCisgICAgICAgIHtzdHJpbmcsIHR5cGVpZF90b19qc29uKEt0eXBlKX0sCisgICAgICAgIHtzdHJpbmcsIHR5cGVpZF90b19qc29uKFZ0eXBlKX0sCisgICAgICAgIHtpMzIsIFNpemV9LAorICAgICAgICB7ZW50ZXJfY29udGV4dCwgb2JqZWN0fQorICAgIF0pOworCit3cml0ZShUaGlzLCBtYXBfZW5kKSAtPiAKKyAgICB3cml0ZV92YWx1ZXMoVGhpcyxbCisgICAgICAgIHtleGl0X2NvbnRleHR9LAorICAgICAgICB7ZXhpdF9jb250ZXh0fQorICAgIF0pOworCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX2xpc3RfYmVnaW57CisgICAgICAgIGV0eXBlID0gRXR5cGUsCisgICAgICAgIHNpemUgPSBTaXplfSkgLT4KKyAgICB3cml0ZV92YWx1ZXMoVGhpczAsIFsKKyAgICAgICAge2VudGVyX2NvbnRleHQsIGFycmF5fSwKKyAgICAgICAge3N0cmluZywgdHlwZWlkX3RvX2pzb24oRXR5cGUpfSwKKyAgICAgICAge2kzMiwgU2l6ZX0KKyAgICBdKTsKKword3JpdGUoVGhpcywgbGlzdF9lbmQpIC0+IAorICAgIHdyaXRlX3ZhbHVlcyhUaGlzLFsKKyAgICAgICAge2V4aXRfY29udGV4dH0KKyAgICBdKTsKKworJSBleGFtcGxlIG1lc3NhZ2Ugd2l0aCBzZXQ6IFsxLCJ0ZXN0U2V0IiwxLDAseyIxIjp7InNldCI6WyJpMzIiLDMsMSwyLDNdfX1dCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX3NldF9iZWdpbnsKKyAgICAgICAgZXR5cGUgPSBFdHlwZSwKKyAgICAgICAgc2l6ZSA9IFNpemV9KSAtPgorICAgIHdyaXRlX3ZhbHVlcyhUaGlzMCwgWworICAgICAgICB7ZW50ZXJfY29udGV4dCwgYXJyYXl9LAorICAgICAgICB7c3RyaW5nLCB0eXBlaWRfdG9fanNvbihFdHlwZSl9LAorICAgICAgICB7aTMyLCBTaXplfQorICAgIF0pOworCit3cml0ZShUaGlzLCBzZXRfZW5kKSAtPiAKKyAgICB3cml0ZV92YWx1ZXMoVGhpcyxbCisgICAgICAgIHtleGl0X2NvbnRleHR9CisgICAgXSk7CislIGV4YW1wbGUgbWVzc2FnZSB3aXRoIHN0cnVjdDogWzEsInRlc3RTdHJ1Y3QiLDEsMCx7IjEiOnsicmVjIjp7IjEiOnsic3RyIjoid29ya2VkIn0sIjQiOnsiaTgiOjF9LCI5Ijp7ImkzMiI6MTA3Mzc0MTgyNH0sIjExIjp7Imk2NCI6MTE1MjkyMTUwNDYwNjg0NzAwMH19fX1dCit3cml0ZShUaGlzLCAjcHJvdG9jb2xfc3RydWN0X2JlZ2lue30pIC0+IAorICAgIHdyaXRlX3ZhbHVlcyhUaGlzLCBbCisgICAgICAgIHtlbnRlcl9jb250ZXh0LCBvYmplY3R9CisgICAgXSk7CisKK3dyaXRlKFRoaXMsIHN0cnVjdF9lbmQpIC0+IAorICAgIHdyaXRlX3ZhbHVlcyhUaGlzLFsKKyAgICAgICAge2V4aXRfY29udGV4dH0KKyAgICBdKTsKKword3JpdGUoVGhpcywge2Jvb2wsIHRydWV9KSAgLT4gd3JpdGVfdmFsdWVzKFRoaXMsIFsKKyAgICAgICAge2NvbnRleHRfcHJlX2l0ZW0sIHRydWV9LAorICAgICAgICA8PCJ0cnVlIj4+LAorICAgICAgICB7Y29udGV4dF9wb3N0X2l0ZW0sIHRydWV9CisgICAgXSk7CisKK3dyaXRlKFRoaXMsIHtib29sLCBmYWxzZX0pIC0+IHdyaXRlX3ZhbHVlcyhUaGlzLCBbCisgICAgICAgIHtjb250ZXh0X3ByZV9pdGVtLCB0cnVlfSwKKyAgICAgICAgPDwiZmFsc2UiPj4sCisgICAgICAgIHtjb250ZXh0X3Bvc3RfaXRlbSwgdHJ1ZX0KKyAgICBdKTsKKword3JpdGUoVGhpcywge2J5dGUsIEJ5dGV9KSAtPiB3cml0ZV92YWx1ZXMoVGhpcywgWworICAgICAgICB7Y29udGV4dF9wcmVfaXRlbSwgdHJ1ZX0sCisgICAgICAgIGxpc3RfdG9fYmluYXJ5KGludGVnZXJfdG9fbGlzdChCeXRlKSksCisgICAgICAgIHtjb250ZXh0X3Bvc3RfaXRlbSwgdHJ1ZX0KKyAgICBdKTsKKword3JpdGUoVGhpcywge2kxNiwgSTE2fSkgLT4KKyAgICB3cml0ZShUaGlzLCB7Ynl0ZSwgSTE2fSk7CisKK3dyaXRlKFRoaXMsIHtpMzIsIEkzMn0pIC0+CisgICAgd3JpdGUoVGhpcywge2J5dGUsIEkzMn0pOworCit3cml0ZShUaGlzLCB7aTY0LCBJNjR9KSAtPgorICAgIHdyaXRlKFRoaXMsIHtieXRlLCBJNjR9KTsKKword3JpdGUoVGhpcywge2RvdWJsZSwgRG91YmxlfSkgLT4gd3JpdGVfdmFsdWVzKFRoaXMsIFsKKyAgICAgICAge2NvbnRleHRfcHJlX2l0ZW0sIHRydWV9LAorICAgICAgICBsaXN0X3RvX2JpbmFyeShpb19saWI6Zm9ybWF0KCJ+LipmIiwgWz9KU09OX0RPVUJMRV9QUkVDSVNJT04sRG91YmxlXSkpLAorICAgICAgICB7Y29udGV4dF9wb3N0X2l0ZW0sIHRydWV9CisgICAgXSk7CisKK3dyaXRlKFRoaXMwLCB7c3RyaW5nLCBTdHJ9KSAtPiB3cml0ZV92YWx1ZXMoVGhpczAsIFsKKyAgICAgICAge2NvbnRleHRfcHJlX2l0ZW0sIGZhbHNlfSwKKyAgICAgICAgY2FzZSBpc19iaW5hcnkoU3RyKSBvZgorICAgICAgICAgICAgdHJ1ZSAtPiBTdHI7CisgICAgICAgICAgICBmYWxzZSAtPiA8PCJcIiIsIChsaXN0X3RvX2JpbmFyeShTdHIpKS9iaW5hcnksICJcIiI+PgorICAgICAgICBlbmQsCisgICAgICAgIHtjb250ZXh0X3Bvc3RfaXRlbSwgZmFsc2V9CisgICAgXSk7CisKKyUlIFRPRE86IGJpbmFyeSBmaWVsZHMgc2hvdWxkIGJlIGJhc2U2NCBlbmNvZGVkPworCislJSBEYXRhIDo6IGlvbGlzdCgpCit3cml0ZShUaGlzID0gI2pzb25fcHJvdG9jb2x7dHJhbnNwb3J0ID0gVHJhbnN9LCBEYXRhKSAtPgorICAgICVpbzpmb3JtYXQoIkRhdGEgfnAgQ3R4dCB+cH5ufm4iLCBbRGF0YSwgVGhpcyNqc29uX3Byb3RvY29sLmNvbnRleHRfc3RhY2tdKSwKKyAgICB7TmV3VHJhbnNwb3J0LCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDp3cml0ZShUcmFucywgRGF0YSksCisgICAge1RoaXMjanNvbl9wcm90b2NvbHt0cmFuc3BvcnQgPSBOZXdUcmFuc3BvcnR9LCBSZXN1bHR9LgorCit3cml0ZV92YWx1ZXMoVGhpczAsIFZhbHVlTGlzdCkgLT4KKyAgICBGaW5hbFN0YXRlID0gbGlzdHM6Zm9sZGwoCisgICAgICAgIGZ1bihWYWwsIFRoaXNJbikgLT4KKyAgICAgICAgICAgIHtUaGlzT3V0LCBva30gPSB3cml0ZShUaGlzSW4sIFZhbCksCisgICAgICAgICAgICBUaGlzT3V0CisgICAgICAgIGVuZCwKKyAgICAgICAgVGhpczAsCisgICAgICAgIFZhbHVlTGlzdCksCisgICAge0ZpbmFsU3RhdGUsIG9rfS4KKworJSUgSSB3aXNoIHRoZSBlcmxhbmcgdmVyc2lvbiBvZiB0aGUgdHJhbnNwb3J0IGludGVyZmFjZSBpbmNsdWRlZCBhIAorJSUgcmVhZF9hbGwgZnVuY3Rpb24gKGxpa2UgZWcuIHRoZSBqYXZhIGltcGxlbWVudGF0aW9uKS4gU2luY2UgaXQgZG9lc24ndCwKKyUlIGhlcmUncyBteSB2ZXJzaW9uIChldmVuIHRob3VnaCBpdCBwcm9iYWJseSBzaG91bGRuJ3QgYmUgaW4gdGhpcyBmaWxlKS4KKyUlCislJSBUaGUgcmVzdWx0aW5nIGJpbmFyeSBpcyBpbW1lZGlhdGVseSBzZW5kIHRvIHRoZSBKU1ggc3RyZWFtIHBhcnNlci4KKyUlIFN1YnNlcXVlbnQgY2FsbHMgdG8gcmVhZCBhY3R1YWxseSBvcGVyYXRlIG9uIHRoZSBldmVudHMgcmV0dXJuZWQgYnkgSlNYLgorcmVhZF9hbGwoI2pzb25fcHJvdG9jb2x7dHJhbnNwb3J0ID0gVHJhbnNwb3J0MH0gPSBTdGF0ZSkgLT4KKyAgICB7VHJhbnNwb3J0MSwgQmlufSA9IHJlYWRfYWxsXzEoVHJhbnNwb3J0MCwgW10pLAorICAgIFAgPSB0aHJpZnRfanNvbl9wYXJzZXI6cGFyc2VyKCksCisgICAgW0ZpcnN0fFJlc3RdID0gUChCaW4pLAorICAgIFN0YXRlI2pzb25fcHJvdG9jb2x7CisgICAgICAgIHRyYW5zcG9ydCA9IFRyYW5zcG9ydDEsCisgICAgICAgIGpzeCA9IHtldmVudCwgRmlyc3QsIFJlc3R9CisgICAgfS4KKworcmVhZF9hbGxfMShUcmFuc3BvcnQwLCBJb0xpc3QpIC0+CisgICAge1RyYW5zcG9ydDEsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OnJlYWQoVHJhbnNwb3J0MCwgMSksCisgICAgY2FzZSBSZXN1bHQgb2YKKyAgICAgICAge29rLCA8PD4+fSAtPiAlIG5vdGhpbmcgcmVhZDogYXNzdW1lIHdlJ3JlIGRvbmUKKyAgICAgICAgICAgIHtUcmFuc3BvcnQxLCBpb2xpc3RfdG9fYmluYXJ5KGxpc3RzOnJldmVyc2UoSW9MaXN0KSl9OworICAgICAgICB7b2ssIERhdGF9IC0+ICUgY2hhcmFjdGVyIHN1Y2Nlc3NmdWxseSByZWFkOyByZWFkIG1vcmUKKyAgICAgICAgICAgIHJlYWRfYWxsXzEoVHJhbnNwb3J0MSwgW0RhdGF8SW9MaXN0XSk7CisgICAgICAgIHtlcnJvciwgJ0VPRid9IC0+ICUgd2UncmUgZG9uZQorICAgICAgICAgICAge1RyYW5zcG9ydDEsIGlvbGlzdF90b19iaW5hcnkobGlzdHM6cmV2ZXJzZShJb0xpc3QpKX0KKyAgICBlbmQuCisKKyUgRXhwZWN0IHJlYWRzIGFuIGV2ZW50IGZyb20gdGhlIEpTWCBldmVudCBzdHJlYW0uIEl0IHJlY2VpdmVzIGFuIGV2ZW50IG9yIGRhdGEKKyUgdHlwZSBhcyBpbnB1dC4gQ29tcGFyaW5nIHRoZSByZWFkIGV2ZW50IGZyb20gdGhlIG9uZSBpcyB3YXMgcGFzc2VkLCBpdAorJSByZXR1cm5zIGFuIGVycm9yIGlmIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBlbmNvdW50ZXJlZC4KKyUgRXhwZWN0IGFsc28gbWFpbnRhaW5zIHRoZSBjb250ZXh0IHN0YWNrIGluICNqc29uX3Byb3RvY29sLgorZXhwZWN0KCNqc29uX3Byb3RvY29se2pzeD17ZXZlbnQsIHtUeXBlLCBEYXRhfT1FdiwgW05leHR8UmVzdF19fT1TdGF0ZSwgRXhwZWN0ZWRUeXBlKSAtPgorICAgIE5leHRTdGF0ZSA9IFN0YXRlI2pzb25fcHJvdG9jb2x7anN4PXtldmVudCwgTmV4dCwgUmVzdH19LAorICAgIGNhc2UgVHlwZSA9PSBFeHBlY3RlZFR5cGUgb2YKKyAgICAgICAgdHJ1ZSAtPiAKKyAgICAgICAgICAgIHtOZXh0U3RhdGUsIHtvaywgY29udmVydF9kYXRhKFR5cGUsIERhdGEpfX07CisgICAgICAgIGZhbHNlIC0+CisgICAgICAgICAgICB7TmV4dFN0YXRlLCB7ZXJyb3IsIHt1bmV4cGVjdGVkX2pzb25fZXZlbnQsIEV2fX19CisgICAgZW5kOworCitleHBlY3QoI2pzb25fcHJvdG9jb2x7anN4PXtldmVudCwgRXZlbnQsIE5leHR9fT1TdGF0ZSwgRXhwZWN0ZWRFdmVudCkgLT4KKyAgICAgZXhwZWN0KFN0YXRlI2pzb25fcHJvdG9jb2x7anN4PXtldmVudCwge0V2ZW50LCBub25lfSwgTmV4dH19LCBFeHBlY3RlZEV2ZW50KS4KKworY29udmVydF9kYXRhKGludGVnZXIsIEkpIC0+IGxpc3RfdG9faW50ZWdlcihJKTsKK2NvbnZlcnRfZGF0YShmbG9hdCwgRikgLT4gbGlzdF90b19mbG9hdChGKTsKK2NvbnZlcnRfZGF0YShfLCBEKSAtPiBELgorCitleHBlY3RfbWFueShTdGF0ZSwgRXhwZWN0ZWRMaXN0KSAtPgorICAgIGV4cGVjdF9tYW55XzEoU3RhdGUsIEV4cGVjdGVkTGlzdCwgW10sIG9rKS4KKworZXhwZWN0X21hbnlfMShTdGF0ZSwgW10sIFJlc3VsdExpc3QsIFN0YXR1cykgLT4KKyAgICB7U3RhdGUsIHtTdGF0dXMsIGxpc3RzOnJldmVyc2UoUmVzdWx0TGlzdCl9fTsKK2V4cGVjdF9tYW55XzEoU3RhdGUsIFtFeHBlY3RlZHxFeHBUYWlsXSwgUmVzdWx0TGlzdCwgX1ByZXZTdGF0dXMpIC0+CisgICAge1N0YXRlMSwge1N0YXR1cywgRGF0YX19ID0gZXhwZWN0KFN0YXRlLCBFeHBlY3RlZCksCisgICAgTmV3UmVzdWx0TGlzdCA9IFtEYXRhfFJlc3VsdExpc3RdLAorICAgIGNhc2UgU3RhdHVzIG9mCisgICAgICAgICUgaW4gY2FzZSBvZiBlcnJvciwgZW5kIHByZW1hdHVyZWx5CisgICAgICAgIGVycm9yIC0+IGV4cGVjdF9tYW55XzEoU3RhdGUxLCBbXSwgTmV3UmVzdWx0TGlzdCwgU3RhdHVzKTsKKyAgICAgICAgb2sgLT4gZXhwZWN0X21hbnlfMShTdGF0ZTEsIEV4cFRhaWwsIE5ld1Jlc3VsdExpc3QsIFN0YXR1cykKKyAgICBlbmQuCisKKyUgd3JhcHBlciBhcm91bmQgZXhwZWN0IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGNvbnRhaW5lciBvcGVuaW5nL2Nsb3NpbmcgZnVuY3Rpb25zCitleHBlY3Rfbm9kYXRhKFRoaXMsIEV4cGVjdGVkTGlzdCkgLT4KKyAgICBjYXNlIGV4cGVjdF9tYW55KFRoaXMsIEV4cGVjdGVkTGlzdCkgb2YKKyAgICAgICAge1N0YXRlLCB7b2ssIF99fSAtPiAKKyAgICAgICAgICAgIHtTdGF0ZSwgb2t9OworICAgICAgICBFcnJvciAtPiAKKyAgICAgICAgICAgIEVycm9yCisgICAgZW5kLgorCityZWFkX2ZpZWxkKCNqc29uX3Byb3RvY29se2pzeD17ZXZlbnQsIEZpZWxkLCBbTmV4dHxSZXN0XX19ID0gU3RhdGUpIC0+CisgICAgTmV3U3RhdGUgPSBTdGF0ZSNqc29uX3Byb3RvY29se2pzeD17ZXZlbnQsIE5leHQsIFJlc3R9fSwKKyAgICB7TmV3U3RhdGUsIEZpZWxkfS4KKworcmVhZChUaGlzMCwgbWVzc2FnZV9iZWdpbikgLT4KKyAgICAlIGNhbGwgcmVhZF9hbGwgdG8gZ2V0IHRoZSBjb250ZW50cyBvZiB0aGUgdHJhbnNwb3J0IGJ1ZmZlciBpbnRvIEpTWC4KKyAgICBUaGlzMSA9IHJlYWRfYWxsKFRoaXMwKSwKKyAgICBjYXNlIGV4cGVjdF9tYW55KFRoaXMxLCAKKyAgICAgICAgICAgIFtzdGFydF9hcnJheSwgaW50ZWdlciwgc3RyaW5nLCBpbnRlZ2VyLCBpbnRlZ2VyXSkgb2YKKyAgICAgICAge1RoaXMyLCB7b2ssIFtfLCBWZXJzaW9uLCBOYW1lLCBUeXBlLCBTZXFJZF19fSAtPgorICAgICAgICAgICAgY2FzZSBWZXJzaW9uID06PSA/VkVSU0lPTl8xIG9mCisgICAgICAgICAgICAgICAgdHJ1ZSAtPgorICAgICAgICAgICAgICAgICAgICB7VGhpczIsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue25hbWUgID0gTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlICA9IFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQgPSBTZXFJZH19OworICAgICAgICAgICAgICAgIGZhbHNlIC0+CisgICAgICAgICAgICAgICAgICAgIHtUaGlzMiwge2Vycm9yLCBub19qc29uX3Byb3RvY29sX3ZlcnNpb259fQorICAgICAgICAgICAgZW5kOworICAgICAgICBPdGhlciAtPiBPdGhlcgorICAgIGVuZDsKKworcmVhZChUaGlzLCBtZXNzYWdlX2VuZCkgLT4gCisgICAgZXhwZWN0X25vZGF0YShUaGlzLCBbZW5kX2FycmF5XSk7CisKK3JlYWQoVGhpcywgc3RydWN0X2JlZ2luKSAtPiAKKyAgICBleHBlY3Rfbm9kYXRhKFRoaXMsIFtzdGFydF9vYmplY3RdKTsKKworcmVhZChUaGlzLCBzdHJ1Y3RfZW5kKSAtPiAKKyAgICBleHBlY3Rfbm9kYXRhKFRoaXMsIFtlbmRfb2JqZWN0XSk7CisKK3JlYWQoVGhpczAsIGZpZWxkX2JlZ2luKSAtPgorICAgIHtUaGlzMSwgUmVhZH0gPSBleHBlY3RfbWFueShUaGlzMCwgCisgICAgICAgICAgICBbJWZpZWxkIGlkCisgICAgICAgICAgICAga2V5LCAKKyAgICAgICAgICAgICAlIHt9IHN1cnJvdW5kaW5nIGZpZWxkCisgICAgICAgICAgICAgc3RhcnRfb2JqZWN0LCAKKyAgICAgICAgICAgICAlIHR5cGUgb2YgZmllbGQKKyAgICAgICAgICAgICBrZXldKSwKKyAgICBjYXNlIFJlYWQgb2YKKyAgICAgICAge29rLCBbRmllbGRJZFN0ciwgXywgRmllbGRUeXBlXX0gLT4KKyAgICAgICAgICAgIHtUaGlzMSwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueworICAgICAgICAgICAgICAgIHR5cGUgPSBqc29uX3RvX3R5cGVpZChGaWVsZFR5cGUpLCAKKyAgICAgICAgICAgICAgICBpZCA9IGxpc3RfdG9faW50ZWdlcihGaWVsZElkU3RyKX19OyAlIFRPRE86IGRvIHdlIG5lZWQgdG8gd3JhcCB0aGlzIGluIGEgdHJ5L2NhdGNoPworICAgICAgICB7ZXJyb3IsW3t1bmV4cGVjdGVkX2pzb25fZXZlbnQsIHtlbmRfb2JqZWN0LG5vbmV9fV19IC0+CisgICAgICAgICAgICB7VGhpczEsICNwcm90b2NvbF9maWVsZF9iZWdpbnt0eXBlID0gP3RUeXBlX1NUT1B9fTsKKyAgICAgICAgT3RoZXIgLT4gCisgICAgICAgICAgICBpbzpmb3JtYXQoIioqKiogT1RIRVIgYnJhbmNoIHNlbGVjdGVkICoqKioiKSwKKyAgICAgICAgICAgIHtUaGlzMSwgT3RoZXJ9CisgICAgZW5kOworCityZWFkKFRoaXMsIGZpZWxkX2VuZCkgLT4gCisgICAgZXhwZWN0X25vZGF0YShUaGlzLCBbZW5kX29iamVjdF0pOworCislIEV4YW1wbGUgbWVzc2FnZSB3aXRoIG1hcDogWzEsInRlc3RNYXAiLDEsMCx7IjEiOnsibWFwIjpbImkzMiIsImkzMiIsMyx7IjciOjc3LCI4Ijo4OCwiOSI6OTl9XX19XQorcmVhZChUaGlzMCwgbWFwX2JlZ2luKSAtPgorICAgIGNhc2UgZXhwZWN0X21hbnkoVGhpczAsIAorICAgICAgICAgICAgW3N0YXJ0X2FycmF5LAorICAgICAgICAgICAgICUga2V5IHR5cGUKKyAgICAgICAgICAgICBzdHJpbmcsIAorICAgICAgICAgICAgICUgdmFsdWUgdHlwZQorICAgICAgICAgICAgIHN0cmluZywgCisgICAgICAgICAgICAgJSBzaXplCisgICAgICAgICAgICAgaW50ZWdlciwKKyAgICAgICAgICAgICAlIHRoZSBmb2xsb3dpbmcgb2JqZWN0IGNvbnRhaW5zIHRoZSBtYXAKKyAgICAgICAgICAgICBzdGFydF9vYmplY3RdKSBvZgorICAgICAgICB7VGhpczEsIHtvaywgW18sIEt0eXBlLCBWdHlwZSwgU2l6ZSwgX119fSAtPgorICAgICAgICAgICAge1RoaXMxLCAjcHJvdG9jb2xfbWFwX2JlZ2lue2t0eXBlID0gS3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0eXBlID0gVnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfX07CisgICAgICAgIE90aGVyIC0+IE90aGVyCisgICAgZW5kOworCityZWFkKFRoaXMsIG1hcF9lbmQpIC0+IAorICAgIGV4cGVjdF9ub2RhdGEoVGhpcywgW2VuZF9vYmplY3QsIGVuZF9hcnJheV0pOworCityZWFkKFRoaXMwLCBsaXN0X2JlZ2luKSAtPgorICAgIGNhc2UgZXhwZWN0X21hbnkoVGhpczAsIAorICAgICAgICAgICAgW3N0YXJ0X2FycmF5LAorICAgICAgICAgICAgICUgZWxlbWVudCB0eXBlCisgICAgICAgICAgICAgc3RyaW5nLCAKKyAgICAgICAgICAgICAlIHNpemUKKyAgICAgICAgICAgICBpbnRlZ2VyXSkgb2YKKyAgICAgICAge1RoaXMxLCB7b2ssIFtfLCBFdHlwZSwgU2l6ZV19fSAtPgorICAgICAgICAgICAge1RoaXMxLCAjcHJvdG9jb2xfbGlzdF9iZWdpbnsKKyAgICAgICAgICAgICAgICBldHlwZSA9IEV0eXBlLAorICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfX07CisgICAgICAgIE90aGVyIC0+IE90aGVyCisgICAgZW5kOworCityZWFkKFRoaXMsIGxpc3RfZW5kKSAtPiAKKyAgICBleHBlY3Rfbm9kYXRhKFRoaXMsIFtlbmRfYXJyYXldKTsKKworJSBleGFtcGxlIG1lc3NhZ2Ugd2l0aCBzZXQ6IFsxLCJ0ZXN0U2V0IiwxLDAseyIxIjp7InNldCI6WyJpMzIiLDMsMSwyLDNdfX1dCityZWFkKFRoaXMwLCBzZXRfYmVnaW4pIC0+CisgICAgY2FzZSBleHBlY3RfbWFueShUaGlzMCwgCisgICAgICAgICAgICBbc3RhcnRfYXJyYXksCisgICAgICAgICAgICAgJSBlbGVtZW50IHR5cGUKKyAgICAgICAgICAgICBzdHJpbmcsIAorICAgICAgICAgICAgICUgc2l6ZQorICAgICAgICAgICAgIGludGVnZXJdKSBvZgorICAgICAgICB7VGhpczEsIHtvaywgW18sIEV0eXBlLCBTaXplXX19IC0+CisgICAgICAgICAgICB7VGhpczEsICNwcm90b2NvbF9zZXRfYmVnaW57CisgICAgICAgICAgICAgICAgZXR5cGUgPSBFdHlwZSwKKyAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX19OworICAgICAgICBPdGhlciAtPiBPdGhlcgorICAgIGVuZDsKKworcmVhZChUaGlzLCBzZXRfZW5kKSAtPiAKKyAgICBleHBlY3Rfbm9kYXRhKFRoaXMsIFtlbmRfYXJyYXldKTsKKworcmVhZChUaGlzMCwgZmllbGRfc3RvcCkgLT4KKyAgICB7VGhpczAsIG9rfTsKKyUlCisKK3JlYWQoVGhpczAsIGJvb2wpIC0+CisgICAge1RoaXMxLCBGaWVsZH0gPSByZWFkX2ZpZWxkKFRoaXMwKSwKKyAgICBWYWx1ZSA9IGNhc2UgRmllbGQgb2YKKyAgICAgICAge2xpdGVyYWwsIEl9IC0+IAorICAgICAgICAgICAge29rLCBJfTsgCisgICAgICAgIF9PdGhlciAtPgorICAgICAgICAgICAge2Vycm9yLCB1bmV4cGVjdGVkX2V2ZW50X2Zvcl9ib29sZWFufQorICAgIGVuZCwKKyAgICB7VGhpczEsIFZhbHVlfTsKKworcmVhZChUaGlzMCwgYnl0ZSkgLT4KKyAgICB7VGhpczEsIEZpZWxkfSA9IHJlYWRfZmllbGQoVGhpczApLAorICAgIFZhbHVlID0gY2FzZSBGaWVsZCBvZgorICAgICAgICB7a2V5LCBLfSAtPgorICAgICAgICAgICAge29rLCBsaXN0X3RvX2ludGVnZXIoSyl9OworICAgICAgICB7aW50ZWdlciwgSX0gLT4gCisgICAgICAgICAgICB7b2ssIGxpc3RfdG9faW50ZWdlcihJKX07IAorICAgICAgICBfT3RoZXIgLT4KKyAgICAgICAgICAgIHtlcnJvciwgdW5leHBlY3RlZF9ldmVudF9mb3JfaW50ZWdlcn0KKyAgICBlbmQsCisgICAge1RoaXMxLCBWYWx1ZX07CisKK3JlYWQoVGhpczAsIGkxNikgLT4KKyAgICByZWFkKFRoaXMwLCBieXRlKTsKKworcmVhZChUaGlzMCwgaTMyKSAtPgorICAgIHJlYWQoVGhpczAsIGJ5dGUpOworCityZWFkKFRoaXMwLCBpNjQpIC0+CisgICAgcmVhZChUaGlzMCwgYnl0ZSk7CisKK3JlYWQoVGhpczAsIGRvdWJsZSkgLT4KKyAgICB7VGhpczEsIEZpZWxkfSA9IHJlYWRfZmllbGQoVGhpczApLAorICAgIFZhbHVlID0gY2FzZSBGaWVsZCBvZgorICAgICAgICB7ZmxvYXQsIEl9IC0+IAorICAgICAgICAgICAge29rLCBsaXN0X3RvX2Zsb2F0KEkpfTsgCisgICAgICAgIF9PdGhlciAtPgorICAgICAgICAgICAge2Vycm9yLCB1bmV4cGVjdGVkX2V2ZW50X2Zvcl9kb3VibGV9CisgICAgZW5kLAorICAgIHtUaGlzMSwgVmFsdWV9OworCislIHJldHVybnMgYSBiaW5hcnkgZGlyZWN0bHksIGNhbGwgYmluYXJ5X3RvX2xpc3QgaWYgbmVjZXNzYXJ5CityZWFkKFRoaXMwLCBzdHJpbmcpIC0+CisgICAge1RoaXMxLCBGaWVsZH0gPSByZWFkX2ZpZWxkKFRoaXMwKSwKKyAgICBWYWx1ZSA9IGNhc2UgRmllbGQgb2YKKyAgICAgICAge3N0cmluZywgSX0gLT4gCisgICAgICAgICAgICB7b2ssIEl9OyAKKyAgICAgICAge2tleSwgSn0gLT4gCisgICAgICAgICAgICB7b2ssIEp9OyAKKyAgICAgICAgX090aGVyIC0+CisgICAgICAgICAgICB7ZXJyb3IsIHVuZXhwZWN0ZWRfZXZlbnRfZm9yX3N0cmluZ30KKyAgICBlbmQsCisgICAge1RoaXMxLCBWYWx1ZX0uCisKKyUlJSUgRkFDVE9SWSBHRU5FUkFUSU9OICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKworJSUgcmV0dXJucyBhIChmdW4oKSAtPiB0aHJpZnRfcHJvdG9jb2woKSkKK25ld19wcm90b2NvbF9mYWN0b3J5KFRyYW5zcG9ydEZhY3RvcnksIF9PcHRpb25zKSAtPgorICAgICUgT25seSBzdHJpY2UgcmVhZC93cml0ZSBhcmUgaW1wbGVtZW50ZWQKKyAgICBGID0gZnVuKCkgLT4KKyAgICAgICAgICAgICAgICB7b2ssIFRyYW5zcG9ydH0gPSBUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgICAgdGhyaWZ0X2pzb25fcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCwgW10pCisgICAgICAgIGVuZCwKKyAgICB7b2ssIEZ9LgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOWFjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydC5lcmwKQEAgLTAsMCArMSw4MyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQpLgorCistYmVoYXZpb3VyKHRocmlmdF90cmFuc3BvcnQpLgorCislJSBjb25zdHJ1Y3RvcnMKKy1leHBvcnQoW25ldy8wLCBuZXcvMV0pLgorJSUgcHJvdG9jb2wgY2FsbGJhY2tzCistZXhwb3J0KFtyZWFkLzIsIHJlYWRfZXhhY3QvMiwgd3JpdGUvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgorCisKKy1yZWNvcmQodF9tZW1idWZmZXIsIHsKKyAgYnVmZmVyID0gW10KK30pLgorCistdHlwZSBzdGF0ZSgpIDo6ICN0X21lbWJ1ZmZlcnt9LgorCisKKy1zcGVjIG5ldygpIC0+IHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KKworbmV3KCkgLT4gbmV3KFtdKS4KKworLXNwZWMgbmV3KEJ1Zjo6aW9kYXRhKCkpIC0+IHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KKworbmV3KEJ1Zikgd2hlbiBpc19saXN0KEJ1ZikgLT4KKyAgU3RhdGUgPSAjdF9tZW1idWZmZXJ7YnVmZmVyID0gQnVmfSwKKyAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpOworbmV3KEJ1Zikgd2hlbiBpc19iaW5hcnkoQnVmKSAtPgorICBTdGF0ZSA9ICN0X21lbWJ1ZmZlcntidWZmZXIgPSBbQnVmXX0sCisgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KKworCistaW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCisKKworcmVhZChTdGF0ZSA9ICN0X21lbWJ1ZmZlcntidWZmZXIgPSBCdWZ9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShCdWYpLAorICBHaXZlID0gbWluKGlvbGlzdF9zaXplKEJpbmFyeSksIExlbiksCisgIHtSZXN1bHQsIFJlbWFpbmluZ30gPSBzcGxpdF9iaW5hcnkoQmluYXJ5LCBHaXZlKSwKKyAge1N0YXRlI3RfbWVtYnVmZmVye2J1ZmZlciA9IFJlbWFpbmluZ30sIHtvaywgUmVzdWx0fX0uCisKKworcmVhZF9leGFjdChTdGF0ZSA9ICN0X21lbWJ1ZmZlcntidWZmZXIgPSBCdWZ9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShCdWYpLAorICBjYXNlIGlvbGlzdF9zaXplKEJpbmFyeSkgb2YKKyAgICBYIHdoZW4gWCA+PSBMZW4gLT4KKyAgICAgIHtSZXN1bHQsIFJlbWFpbmluZ30gPSBzcGxpdF9iaW5hcnkoQmluYXJ5LCBMZW4pLAorICAgICAge1N0YXRlI3RfbWVtYnVmZmVye2J1ZmZlciA9IFJlbWFpbmluZ30sIHtvaywgUmVzdWx0fX07CisgICAgXyAtPgorICAgICAge1N0YXRlLCB7ZXJyb3IsIGVvZn19CisgIGVuZC4KKworCit3cml0ZShTdGF0ZSA9ICN0X21lbWJ1ZmZlcntidWZmZXIgPSBCdWZ9LCBEYXRhKQord2hlbiBpc19saXN0KERhdGEpOyBpc19iaW5hcnkoRGF0YSkgLT4KKyAge1N0YXRlI3RfbWVtYnVmZmVye2J1ZmZlciA9IFtCdWYsIERhdGFdfSwgb2t9LgorCisKK2ZsdXNoKFN0YXRlKSAtPiB7U3RhdGUsIG9rfS4KKworCitjbG9zZShTdGF0ZSkgLT4ge1N0YXRlLCBva30uCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9tZW1vcnlfYnVmZmVyLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9tZW1vcnlfYnVmZmVyLmVybAppbmRleCBjZTdjMWRhLi42YTU5ZWE1IDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfbWVtb3J5X2J1ZmZlci5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X21lbW9yeV9idWZmZXIuZXJsCkBAIC0yMSw0OSArMjEsMjcgQEAKIAogLWJlaGF2aW91cih0aHJpZnRfdHJhbnNwb3J0KS4KIAotJSUgQVBJCi0tZXhwb3J0KFtuZXcvMCwgbmV3LzEsIG5ld190cmFuc3BvcnRfZmFjdG9yeS8wXSkuCislJSBjb25zdHJ1Y3RvcnMKKy1leHBvcnQoW25ldy8wLCBuZXcvMV0pLgorJSUgcHJvdG9jb2wgY2FsbGJhY2tzCistZXhwb3J0KFtyZWFkLzIsIHdyaXRlLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KKyUlIGxlZ2FjeSBhcGkKKy1leHBvcnQoW25ld190cmFuc3BvcnRfZmFjdG9yeS8wXSkuCiAKLSUlIHRocmlmdF90cmFuc3BvcnQgY2FsbGJhY2tzCi0tZXhwb3J0KFt3cml0ZS8yLCByZWFkLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KIAotLXJlY29yZChtZW1vcnlfYnVmZmVyLCB7YnVmZmVyfSkuCi0tdHlwZSBzdGF0ZSgpIDo6ICNtZW1vcnlfYnVmZmVye30uCi0taW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCislJSB3cmFwcGVyIGFyb3VuZCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCBmb3IgbGVnYWN5IHJlYXNvbnMKIAotbmV3KCkgLT4KLSAgICBTdGF0ZSA9ICNtZW1vcnlfYnVmZmVye2J1ZmZlciA9IFtdfSwKLSAgICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCituZXcoKSAtPiB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpuZXcoKS4KIAotbmV3IChCdWYpIHdoZW4gaXNfbGlzdCAoQnVmKSAtPgotICBTdGF0ZSA9ICNtZW1vcnlfYnVmZmVye2J1ZmZlciA9IEJ1Zn0sCi0gIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKTsKLW5ldyAoQnVmKSAtPgotICBTdGF0ZSA9ICNtZW1vcnlfYnVmZmVye2J1ZmZlciA9IFtCdWZdfSwKLSAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgorbmV3KFN0YXRlKSAtPiB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpuZXcoU3RhdGUpLgogCi1uZXdfdHJhbnNwb3J0X2ZhY3RvcnkoKSAtPgotICAgIHtvaywgZnVuKCkgLT4gbmV3KCkgZW5kfS4KK25ld190cmFuc3BvcnRfZmFjdG9yeSgpIC0+IHtvaywgZnVuKCkgLT4gbmV3KCkgZW5kfS4KIAotJSUgV3JpdGVzIGRhdGEgaW50byB0aGUgYnVmZmVyCi13cml0ZShTdGF0ZSA9ICNtZW1vcnlfYnVmZmVye2J1ZmZlciA9IEJ1Zn0sIERhdGEpIC0+Ci0gICAge1N0YXRlI21lbW9yeV9idWZmZXJ7YnVmZmVyID0gW0J1ZiwgRGF0YV19LCBva30uCit3cml0ZShTdGF0ZSwgRGF0YSkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6d3JpdGUoU3RhdGUsIERhdGEpLgogCi1mbHVzaChTdGF0ZSA9ICNtZW1vcnlfYnVmZmVyIHtidWZmZXIgPSBCdWZ9KSAtPgotICAgIHtTdGF0ZSNtZW1vcnlfYnVmZmVye2J1ZmZlciA9IFtdfSwgQnVmfS4KK3JlYWQoU3RhdGUsIERhdGEpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OnJlYWQoU3RhdGUsIERhdGEpLgogCi1jbG9zZShTdGF0ZSkgLT4KLSAgICB7U3RhdGUsIG9rfS4KK2ZsdXNoKFN0YXRlKSAtPiB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpmbHVzaChTdGF0ZSkuCiAKLXJlYWQoU3RhdGUgPSAjbWVtb3J5X2J1ZmZlcntidWZmZXIgPSBCdWZ9LCBMZW4pIHdoZW4gaXNfaW50ZWdlcihMZW4pIC0+Ci0gICAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShCdWYpLAotICAgIEdpdmUgPSBtaW4oaW9saXN0X3NpemUoQmluYXJ5KSwgTGVuKSwKLSAgICB7UmVzdWx0LCBSZW1haW5pbmd9ID0gc3BsaXRfYmluYXJ5KEJpbmFyeSwgR2l2ZSksCi0gICAge1N0YXRlI21lbW9yeV9idWZmZXJ7YnVmZmVyID0gUmVtYWluaW5nfSwge29rLCBSZXN1bHR9fS4KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgSW50ZXJuYWwgZnVuY3Rpb25zCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1taW4oQSxCKSB3aGVuIEE8QiAtPiBBOwotbWluKF8sQikgICAgICAgICAgLT4gQi4KK2Nsb3NlKFN0YXRlKSAtPiB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpjbG9zZShTdGF0ZSkuCiAKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlci5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXIuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YzVlOTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXIuZXJsCkBAIC0wLDAgKzEsNTcgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcikuCisKKy1leHBvcnQoWworICAgICAgICAgIG5ldy8wCisgICAgICAgICAsc3RvcmUvMworICAgICAgICAgLGZpbmQvMgorICAgICAgICAgLGZldGNoLzIKKyAgICAgICAgXSkuCisKKy10eXBlIHNlcnZpY2VfaGFuZGxlcigpICAgICA6OiBub25lbXB0eV9zdHJpbmcoKS4KKy10eXBlIG1vZHVsZV8oKSAgICAgICAgICAgICA6OiBhdG9tKCkuCistdHlwZSBzZXJ2aWNlX2hhbmRsZXJfbWFwKCkgOjogW3tTZXJ2aWNlSGFuZGxlcjo6c2VydmljZV9oYW5kbGVyKCksIE1vZHVsZTo6bW9kdWxlXygpfV0uCisKKy1zcGVjIG5ldygpIC0+IHNlcnZpY2VfaGFuZGxlcl9tYXAoKS4KK25ldygpIC0+CisgICAgb3JkZGljdDpuZXcoKS4KKworLXNwZWMgc3RvcmUoU2VydmljZUhhbmRsZXIsIE1vZHVsZSwgTWFwKSAtPiBOZXdNYXAgd2hlbgorICAgIFNlcnZpY2VIYW5kbGVyIDo6IHNlcnZpY2VfaGFuZGxlcigpLAorICAgIE1vZHVsZSAgICAgICAgIDo6IG1vZHVsZV8oKSwKKyAgICBNYXAgICAgICAgICAgICA6OiBzZXJ2aWNlX2hhbmRsZXJfbWFwKCksCisgICAgTmV3TWFwICAgICAgICAgOjogc2VydmljZV9oYW5kbGVyX21hcCgpLgorc3RvcmUoU2VydmljZUhhbmRsZXIsIE1vZHVsZSwgTWFwKSAtPgorICAgIG9yZGRpY3Q6c3RvcmUoU2VydmljZUhhbmRsZXIsIE1vZHVsZSwgTWFwKS4KKworLXNwZWMgZmluZChTZXJ2aWNlSGFuZGxlciwgTWFwKSAtPiB7b2ssIE1vZHVsZX0gfCBlcnJvciB3aGVuCisgICAgU2VydmljZUhhbmRsZXIgOjogc2VydmljZV9oYW5kbGVyKCksCisgICAgTW9kdWxlICAgICAgICAgOjogbW9kdWxlXygpLAorICAgIE1hcCAgICAgICAgICAgIDo6IHNlcnZpY2VfaGFuZGxlcl9tYXAoKS4KK2ZpbmQoU2VydmljZUhhbmRsZXIsIE1hcCkgLT4KKyAgICBvcmRkaWN0OmZpbmQoU2VydmljZUhhbmRsZXIsIE1hcCkuCisKKy1zcGVjIGZldGNoKFNlcnZpY2VIYW5kbGVyLCBNYXApIC0+IE1vZHVsZSB3aGVuCisgICAgU2VydmljZUhhbmRsZXIgOjogc2VydmljZV9oYW5kbGVyKCksCisgICAgTW9kdWxlICAgICAgICAgOjogbW9kdWxlXygpLAorICAgIE1hcCAgICAgICAgICAgIDo6IHNlcnZpY2VfaGFuZGxlcl9tYXAoKS4KK2ZldGNoKFNlcnZpY2VIYW5kbGVyLCBNYXApIC0+CisgICAgb3JkZGljdDpmZXRjaChTZXJ2aWNlSGFuZGxlciwgTWFwKS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmN2I3MGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZXJsCkBAIC0wLDAgKzEsODMgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbCkuCisKKy1iZWhhdmlvdXIodGhyaWZ0X3Byb3RvY29sKS4KKworLWluY2x1ZGUoInRocmlmdF9jb25zdGFudHMuaHJsIikuCistaW5jbHVkZSgidGhyaWZ0X3Byb3RvY29sLmhybCIpLgorCistaW5jbHVkZSgidGhyaWZ0X3Byb3RvY29sX2JlaGF2aW91ci5ocmwiKS4KKworLWV4cG9ydChbbmV3LzIsCisgICAgICAgICByZWFkLzIsCisgICAgICAgICB3cml0ZS8yLAorICAgICAgICAgZmx1c2hfdHJhbnNwb3J0LzEsCisgICAgICAgICBjbG9zZV90cmFuc3BvcnQvMQorICAgICAgICBdKS4KKworLXJlY29yZChwcm90b2NvbCwge21vZHVsZSwgZGF0YX0pLgorLXR5cGUgcHJvdG9jb2woKSA6OiAjcHJvdG9jb2x7fS4KKworLXJlY29yZCAobXVsdGlwbGV4ZWRfcHJvdG9jb2wsIHtwcm90b2NvbF9tb2R1bGVfdG9fZGVjb3JhdGU6OmF0b20oKSwKKwkJCQkJCQkJcHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZTo6dGVybSgpLAorCQkJCQkJCQlzZXJ2aWNlX25hbWU6Om5vbmVtcHR5X3N0cmluZygpfSkuCisKKy10eXBlIHN0YXRlKCkgOjogI211bHRpcGxleGVkX3Byb3RvY29se30uCisKKy1zcGVjIG5ldyhQcm90b2NvbFRvRGVjb3JhdGU6OnByb3RvY29sKCksIFNlcnZpY2VOYW1lOjpub25lbXB0eV9zdHJpbmcoKSkgLT4ge29rLCBQcm90b2NvbDo6cHJvdG9jb2woKX0uCituZXcoUHJvdG9jb2xUb0RlY29yYXRlLCBTZXJ2aWNlTmFtZSkgd2hlbiBpc19yZWNvcmQoUHJvdG9jb2xUb0RlY29yYXRlLCBwcm90b2NvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19saXN0KFNlcnZpY2VOYW1lKSAtPgorICAgIFN0YXRlID0gI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX21vZHVsZV90b19kZWNvcmF0ZSA9IFByb3RvY29sVG9EZWNvcmF0ZSNwcm90b2NvbC5tb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gUHJvdG9jb2xUb0RlY29yYXRlI3Byb3RvY29sLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lID0gU2VydmljZU5hbWV9LAorICAgIHRocmlmdF9wcm90b2NvbDpuZXcoP01PRFVMRSwgU3RhdGUpLgorCitmbHVzaF90cmFuc3BvcnQoU3RhdGUgPSAjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7cHJvdG9jb2xfbW9kdWxlX3RvX2RlY29yYXRlID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMH0pIC0+CisgICAge1N0YXRlMSwgb2t9ID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlOmZsdXNoX3RyYW5zcG9ydChTdGF0ZTApLAorICAgIHtTdGF0ZSNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUxfSwgb2t9LgorCitjbG9zZV90cmFuc3BvcnQoU3RhdGUgPSAjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7cHJvdG9jb2xfbW9kdWxlX3RvX2RlY29yYXRlID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMH0pIC0+CisgICAge1N0YXRlMSwgb2t9ID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlOmNsb3NlX3RyYW5zcG9ydChTdGF0ZTApLAorICAgIHtTdGF0ZSNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUxfSwgb2t9LgorCit3cml0ZShTdGF0ZSA9ICNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9tb2R1bGVfdG9fZGVjb3JhdGUgPSBQcm90b2NvbE1vZHVsZVRvRGVjb3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sX2RhdGFfdG9fZGVjb3JhdGUgPSBTdGF0ZTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUgPSBTZXJ2aWNlTmFtZX0sCisgICAgICBNZXNzYWdlID0gI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57bmFtZSA9IE5hbWV9KSAtPgorICAgIHtTdGF0ZTEsIG9rfSA9IFByb3RvY29sTW9kdWxlVG9EZWNvcmF0ZTp3cml0ZShTdGF0ZTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbntuYW1lPVNlcnZpY2VOYW1lICsrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID9NVUxUSVBMRVhFRF9TRVJWSUNFX1NFUEFSQVRPUiArKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lfSksCisgICAge1N0YXRlI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX2RhdGFfdG9fZGVjb3JhdGUgPSBTdGF0ZTF9LCBva307CisKK3dyaXRlKFN0YXRlID0gI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX21vZHVsZV90b19kZWNvcmF0ZSA9IFByb3RvY29sTW9kdWxlVG9EZWNvcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMH0sCisgICAgICBNZXNzYWdlKSAtPgorICAgIHtTdGF0ZTEsIG9rfSA9IFByb3RvY29sTW9kdWxlVG9EZWNvcmF0ZTp3cml0ZShTdGF0ZTAsIE1lc3NhZ2UpLAorICAgIHtTdGF0ZSNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUxfSwgb2t9LgorCityZWFkKFN0YXRlID0gI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX21vZHVsZV90b19kZWNvcmF0ZSA9IFByb3RvY29sTW9kdWxlVG9EZWNvcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUwfSwKKyAgICAgTWVzc2FnZSkgLT4KKyAgICB7U3RhdGUxLCBSZXN1bHR9ID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlOnJlYWQoU3RhdGUwLCBNZXNzYWdlKSwKKyAgICB7U3RhdGUjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7cHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMX0sIFJlc3VsdH0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfcHJvY2Vzc29yLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9wcm9jZXNzb3IuZXJsCmluZGV4IDg4YWYwNWEuLjVjOWYyNmYgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9wcm9jZXNzb3IuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9wcm9jZXNzb3IuZXJsCkBAIC0zMiwyNSArMzIsNTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgPSBTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IEhhbmRsZXJ9KS4KIAotbG9vcChTdGF0ZTAgPSAjdGhyaWZ0X3Byb2Nlc3Nvcntwcm90b2NvbCAgPSBQcm90bzB9KSAtPgorbG9vcChTdGF0ZTAgPSAjdGhyaWZ0X3Byb2Nlc3Nvcntwcm90b2NvbCAgPSBQcm90bzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlID0gU2VydmljZX0pIC0+CisKICAgICB7UHJvdG8xLCBNZXNzYWdlQmVnaW59ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG8wLCBtZXNzYWdlX2JlZ2luKSwKICAgICBTdGF0ZTEgPSBTdGF0ZTAjdGhyaWZ0X3Byb2Nlc3Nvcntwcm90b2NvbCA9IFByb3RvMX0sCisKKyAgICBFcnJvckhhbmRsZXIgPSBmdW4KKyAgICAgICAgKEhhbmRsZXJNb2R1bGVzKSB3aGVuIGlzX2xpc3QoSGFuZGxlck1vZHVsZXMpIC0+IHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpmZXRjaCg/TVVMVElQTEVYRURfRVJST1JfSEFORExFUl9LRVksIEhhbmRsZXJNb2R1bGVzKTsKKyAgICAgICAgKEhhbmRsZXJNb2R1bGUpIC0+IEhhbmRsZXJNb2R1bGUKKyAgICBlbmQsCisKICAgICBjYXNlIE1lc3NhZ2VCZWdpbiBvZgorCiAgICAgICAgICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue25hbWUgPSBGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ID90TWVzc2FnZVR5cGVfQ0FMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQgPSBTZXFpZH0gLT4KLSAgICAgICAgICAgIHtTdGF0ZTIsIG9rfSA9IGhhbmRsZV9mdW5jdGlvbihTdGF0ZTEsIGxpc3RfdG9fYXRvbShGdW5jdGlvbiksIFNlcWlkKSwKLSAgICAgICAgICAgIGxvb3AoU3RhdGUyKTsKLSAgICAgICAgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57bmFtZSA9IEZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gP3RNZXNzYWdlVHlwZV9PTkVXQVksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCA9IFNlcWlkfSAtPgotICAgICAgICAgICAge1N0YXRlMiwgb2t9ID0gaGFuZGxlX2Z1bmN0aW9uKFN0YXRlMSwgbGlzdF90b19hdG9tKEZ1bmN0aW9uKSwgU2VxaWQpLAotICAgICAgICAgICAgbG9vcChTdGF0ZTIpOwotICAgICAgICB7ZXJyb3IsIHRpbWVvdXR9IC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCA9IFNlcWlkfSB3aGVuIFR5cGUgPTo9ID90TWVzc2FnZVR5cGVfQ0FMTDsgVHlwZSA9Oj0gP3RNZXNzYWdlVHlwZV9PTkVXQVkgLT4KKyAgICAgICAgICAgIGNhc2Ugc3RyaW5nOnRva2VucyhGdW5jdGlvbiwgP01VTFRJUExFWEVEX1NFUlZJQ0VfU0VQQVJBVE9SKSBvZgorICAgICAgICAgICAgICAgIFtTZXJ2aWNlTmFtZSwgRnVuY3Rpb25OYW1lXSAtPgorICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlTW9kdWxlICA9IHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpmZXRjaChTZXJ2aWNlTmFtZSwgU2VydmljZSksCisgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VIYW5kbGVyID0gdGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyOmZldGNoKFNlcnZpY2VOYW1lLCBIYW5kbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBoYW5kbGVfZnVuY3Rpb24oU3RhdGUxI3RocmlmdF9wcm9jZXNzb3J7c2VydmljZT1TZXJ2aWNlTW9kdWxlLCBoYW5kbGVyPVNlcnZpY2VIYW5kbGVyfSwgbGlzdF90b19hdG9tKEZ1bmN0aW9uTmFtZSksIFNlcWlkKSBvZgorICAgICAgICAgICAgICAgICAgICAgICAge1N0YXRlMiwgb2t9IC0+IGxvb3AoU3RhdGUyI3RocmlmdF9wcm9jZXNzb3J7c2VydmljZT1TZXJ2aWNlLCBoYW5kbGVyPUhhbmRsZXJ9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHtfU3RhdGUyLCB7ZXJyb3IsIFJlYXNvbn19IC0+CisJCQkJCQkJYXBwbHkoRXJyb3JIYW5kbGVyKEhhbmRsZXIpLCBoYW5kbGVfZXJyb3IsIFtsaXN0X3RvX2F0b20oRnVuY3Rpb24pLCBSZWFzb25dKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2w6Y2xvc2VfdHJhbnNwb3J0KFByb3RvMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sKKyAgICAgICAgICAgICAgICAgICAgZW5kOworICAgICAgICAgICAgICAgIF8gLT4KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBoYW5kbGVfZnVuY3Rpb24oU3RhdGUxLCBsaXN0X3RvX2F0b20oRnVuY3Rpb24pLCBTZXFpZCkgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIHtTdGF0ZTIsIG9rfSAtPiBsb29wKFN0YXRlMik7CisgICAgICAgICAgICAgICAgICAgICAgICB7X1N0YXRlMiwge2Vycm9yLCBSZWFzb259fSAtPgorCQkJCQkJCWFwcGx5KEVycm9ySGFuZGxlcihIYW5kbGVyKSwgaGFuZGxlX2Vycm9yLCBbbGlzdF90b19hdG9tKEZ1bmN0aW9uKSwgUmVhc29uXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sOmNsb3NlX3RyYW5zcG9ydChQcm90bzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rCisgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgZW5kOworICAgICAgICB7ZXJyb3IsIHRpbWVvdXQgPSBSZWFzb259IC0+CisJCQlhcHBseShFcnJvckhhbmRsZXIoSGFuZGxlciksIGhhbmRsZV9lcnJvciwgW3VuZGVmaW5lZCwgUmVhc29uXSksCiAgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2w6Y2xvc2VfdHJhbnNwb3J0KFByb3RvMSksCiAgICAgICAgICAgICBvazsKLSAgICAgICAge2Vycm9yLCBjbG9zZWR9IC0+CisgICAgICAgIHtlcnJvciwgY2xvc2VkID0gUmVhc29ufSAtPgogICAgICAgICAgICAgJSUgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJDbGllbnQgZGlzY29ubmVjdGVkfm4iKSwKKwkJCWFwcGx5KEVycm9ySGFuZGxlcihIYW5kbGVyKSwgaGFuZGxlX2Vycm9yLCBbdW5kZWZpbmVkLCBSZWFzb25dKSwKKyAgICAgICAgICAgIHRocmlmdF9wcm90b2NvbDpjbG9zZV90cmFuc3BvcnQoUHJvdG8xKSwKKyAgICAgICAgICAgIGV4aXQoc2h1dGRvd24pOworICAgICAgICB7ZXJyb3IsIFJlYXNvbn0gLT4KKwkJCWFwcGx5KEVycm9ySGFuZGxlcihIYW5kbGVyKSwgaGFuZGxlX2Vycm9yLCBbdW5kZWZpbmVkLCBSZWFzb25dKSwKICAgICAgICAgICAgIHRocmlmdF9wcm90b2NvbDpjbG9zZV90cmFuc3BvcnQoUHJvdG8xKSwKICAgICAgICAgICAgIGV4aXQoc2h1dGRvd24pCiAgICAgZW5kLgpAQCAtMTc1LDExICsyMDQsMTYgQEAKICAgICBzZW5kX3JlcGx5KFN0YXRlLCBGdW5jdGlvbiwgP3RNZXNzYWdlVHlwZV9FWENFUFRJT04sIFJlcGx5LCBTZXFpZCkuCiAKIHNlbmRfcmVwbHkoU3RhdGUgPSAjdGhyaWZ0X3Byb2Nlc3Nvcntwcm90b2NvbCA9IFByb3RvMH0sIEZ1bmN0aW9uLCBSZXBseU1lc3NhZ2VUeXBlLCBSZXBseSwgU2VxaWQpIC0+Ci0gICAge1Byb3RvMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvMCwgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGF0b21fdG9fbGlzdChGdW5jdGlvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFJlcGx5TWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQgPSBTZXFpZH0pLAotICAgIHtQcm90bzIsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90bzEsIFJlcGx5KSwKLSAgICB7UHJvdG8zLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUHJvdG8yLCBtZXNzYWdlX2VuZCksCi0gICAge1Byb3RvNCwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOmZsdXNoX3RyYW5zcG9ydChQcm90bzMpLAotICAgIHtTdGF0ZSN0aHJpZnRfcHJvY2Vzc29ye3Byb3RvY29sID0gUHJvdG80fSwgb2t9LgorICAgIHRyeQorICAgICAgICB7UHJvdG8xLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUHJvdG8wLCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGF0b21fdG9fbGlzdChGdW5jdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBSZXBseU1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCA9IFNlcWlkfSksCisgICAgICAgIHtQcm90bzIsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90bzEsIFJlcGx5KSwKKyAgICAgICAge1Byb3RvMywgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvMiwgbWVzc2FnZV9lbmQpLAorICAgICAgICB7UHJvdG80LCBva30gPSB0aHJpZnRfcHJvdG9jb2w6Zmx1c2hfdHJhbnNwb3J0KFByb3RvMyksCisgICAgICAgIHtTdGF0ZSN0aHJpZnRfcHJvY2Vzc29ye3Byb3RvY29sID0gUHJvdG80fSwgb2t9CisgICAgY2F0Y2gKKyAgICAgICAgZXJyb3I6e2JhZG1hdGNoLCB7Xywge2Vycm9yLCBffSA9IEVycm9yfX0gLT4KKyAgICAgICAgICAgIHtTdGF0ZSwgRXJyb3J9CisgICAgZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X3Byb3RvY29sLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9wcm90b2NvbC5lcmwKaW5kZXggMTkzYjA3YS4uMmZlMTBkNiAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X3Byb3RvY29sLmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfcHJvdG9jb2wuZXJsCkBAIC02Myw4ICs2Myw4IEBACiB0eXBlaWRfdG9fYXRvbSg/dFR5cGVfU1RPUCkgLT4gZmllbGRfc3RvcDsKIHR5cGVpZF90b19hdG9tKD90VHlwZV9WT0lEKSAtPiB2b2lkOwogdHlwZWlkX3RvX2F0b20oP3RUeXBlX0JPT0wpIC0+IGJvb2w7Ci10eXBlaWRfdG9fYXRvbSg/dFR5cGVfQllURSkgLT4gYnl0ZTsKIHR5cGVpZF90b19hdG9tKD90VHlwZV9ET1VCTEUpIC0+IGRvdWJsZTsKK3R5cGVpZF90b19hdG9tKD90VHlwZV9JOCkgLT4gYnl0ZTsKIHR5cGVpZF90b19hdG9tKD90VHlwZV9JMTYpIC0+IGkxNjsKIHR5cGVpZF90b19hdG9tKD90VHlwZV9JMzIpIC0+IGkzMjsKIHR5cGVpZF90b19hdG9tKD90VHlwZV9JNjQpIC0+IGk2NDsKQEAgLTc2LDggKzc2LDkgQEAKIAogdGVybV90b190eXBlaWQodm9pZCkgLT4gP3RUeXBlX1ZPSUQ7CiB0ZXJtX3RvX3R5cGVpZChib29sKSAtPiA/dFR5cGVfQk9PTDsKLXRlcm1fdG9fdHlwZWlkKGJ5dGUpIC0+ID90VHlwZV9CWVRFOwordGVybV90b190eXBlaWQoYnl0ZSkgLT4gP3RUeXBlX0k4OwogdGVybV90b190eXBlaWQoZG91YmxlKSAtPiA/dFR5cGVfRE9VQkxFOwordGVybV90b190eXBlaWQoaTgpIC0+ID90VHlwZV9JODsKIHRlcm1fdG9fdHlwZWlkKGkxNikgLT4gP3RUeXBlX0kxNjsKIHRlcm1fdG9fdHlwZWlkKGkzMikgLT4gP3RUeXBlX0kzMjsKIHRlcm1fdG9fdHlwZWlkKGk2NCkgLT4gP3RUeXBlX0k2NDsKQEAgLTE0OCw4ICsxNDksMTIgQEAKIHJlYWQoSVByb3RvMCwge21hcCwgS2V5VHlwZSwgVmFsVHlwZX0pIC0+CiAgICAge0lQcm90bzEsICNwcm90b2NvbF9tYXBfYmVnaW57c2l6ZSA9IFNpemUsIGt0eXBlID0gS1R5cGUsIHZ0eXBlID0gVlR5cGV9fSA9CiAgICAgICAgIHJlYWQoSVByb3RvMCwgbWFwX2JlZ2luKSwKLSAgICB7S1R5cGUsIEtUeXBlfSA9IHt0ZXJtX3RvX3R5cGVpZChLZXlUeXBlKSwgS1R5cGV9LAotICAgIHtWVHlwZSwgVlR5cGV9ID0ge3Rlcm1fdG9fdHlwZWlkKFZhbFR5cGUpLCBWVHlwZX0sCisgICAgXyA9IGNhc2UgU2l6ZSBvZgorICAgICAgMCAtPiAwOworICAgICAgXyAtPgorICAgICAgICB7S1R5cGUsIEtUeXBlfSA9IHt0ZXJtX3RvX3R5cGVpZChLZXlUeXBlKSwgS1R5cGV9LAorICAgICAgICB7VlR5cGUsIFZUeXBlfSA9IHt0ZXJtX3RvX3R5cGVpZChWYWxUeXBlKSwgVlR5cGV9CisgICAgZW5kLAogICAgIHtMaXN0LCBJUHJvdG8yfSA9IGxpc3RzOm1hcGZvbGRsKGZ1bihfLCBQcm90b1MwKSAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1Byb3RvUzEsIHtvaywgS2V5fX0gPSByZWFkKFByb3RvUzAsIEtleVR5cGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1Byb3RvUzIsIHtvaywgVmFsfX0gPSByZWFkKFByb3RvUzEsIFZhbFR5cGUpLApAQCAtMTkxLDcgKzE5Niw4IEBACiAgICAgICAgIHRocmlmdF9wcm90b2NvbDpyZWFkKElQcm90bzAsIGZpZWxkX2JlZ2luKSwKICAgICBjYXNlIHtGVHlwZSwgRmlkfSBvZgogICAgICAgICB7P3RUeXBlX1NUT1AsIF99IC0+Ci0gICAgICAgICAgICB7SVByb3RvMSwgUlR1cGxlfTsKKyAgICAgICAgICAgIHtJUHJvdG8yLCBva30gPSByZWFkKElQcm90bzEsIHN0cnVjdF9lbmQpLAorICAgICAgICAgICAge0lQcm90bzIsIFJUdXBsZX07CiAgICAgICAgIF9FbHNlIC0+CiAgICAgICAgICAgICBjYXNlIGRpY3Q6ZmluZChGaWQsIFNEaWN0KSBvZgogICAgICAgICAgICAgICAgIHtvaywge1R5cGUsIEluZGV4fX0gLT4KQEAgLTIwOCwxOCArMjE0LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcF9maWVsZChGVHlwZSwgSVByb3RvMSwgU0RpY3QsIFJUdXBsZSkKICAgICAgICAgICAgICAgICAgICAgZW5kOwogICAgICAgICAgICAgICAgIF9FbHNlMiAtPgotICAgICAgICAgICAgICAgICAgICBlcnJvcl9sb2dnZXI6aW5mb19tc2coIlNraXBwaW5nIGZpZWxkIH5wIHdpdGggdW5rbm93biBmaWR+biIsIFtGaWRdKSwKICAgICAgICAgICAgICAgICAgICAgc2tpcF9maWVsZChGVHlwZSwgSVByb3RvMSwgU0RpY3QsIFJUdXBsZSkKICAgICAgICAgICAgIGVuZAogICAgIGVuZC4KIAogc2tpcF9maWVsZChGVHlwZSwgSVByb3RvMCwgU0RpY3QsIFJUdXBsZSkgLT4KLSAgICBGVHlwZUF0b20gPSB0aHJpZnRfcHJvdG9jb2w6dHlwZWlkX3RvX2F0b20oRlR5cGUpLAotICAgIHtJUHJvdG8xLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6c2tpcChJUHJvdG8wLCBGVHlwZUF0b20pLAorICAgIHtJUHJvdG8xLCBva30gPSBza2lwKElQcm90bzAsIHR5cGVpZF90b19hdG9tKEZUeXBlKSksCiAgICAge0lQcm90bzIsIG9rfSA9IHJlYWQoSVByb3RvMSwgZmllbGRfZW5kKSwKICAgICByZWFkX3N0cnVjdF9sb29wKElQcm90bzIsIFNEaWN0LCBSVHVwbGUpLgogCi0tc3BlYyBza2lwKCNwcm90b2NvbHt9LCBhbnkoKSkgLT4geyNwcm90b2NvbHt9LCBva30uCistc3BlYyBza2lwKCNwcm90b2NvbHt9LCBhdG9tKCkpIC0+IHsjcHJvdG9jb2x7fSwgb2t9LgogCiBza2lwKFByb3RvMCwgc3RydWN0KSAtPgogICAgIHtQcm90bzEsIG9rfSA9IHJlYWQoUHJvdG8wLCBzdHJ1Y3RfYmVnaW4pLApAQCAtMjU2LDcgKzI2MCw3IEBACiAgICAgICAgID90VHlwZV9TVE9QIC0+CiAgICAgICAgICAgICB7UHJvdG8xLCBva307CiAgICAgICAgIF9FbHNlIC0+Ci0gICAgICAgICAgICB7UHJvdG8yLCBva30gPSBza2lwKFByb3RvMSwgVHlwZSksCisgICAgICAgICAgICB7UHJvdG8yLCBva30gPSBza2lwKFByb3RvMSwgdHlwZWlkX3RvX2F0b20oVHlwZSkpLAogICAgICAgICAgICAge1Byb3RvMywgb2t9ID0gcmVhZChQcm90bzIsIGZpZWxkX2VuZCksCiAgICAgICAgICAgICBza2lwX3N0cnVjdF9sb29wKFByb3RvMykKICAgICBlbmQuCkBAIC0yNjYsOCArMjcwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfSkgLT4KICAgICBjYXNlIFNpemUgb2YKICAgICAgICAgTiB3aGVuIE4gPiAwIC0+Ci0gICAgICAgICAgICB7UHJvdG8xLCBva30gPSBza2lwKFByb3RvMCwgS3R5cGUpLAotICAgICAgICAgICAge1Byb3RvMiwgb2t9ID0gc2tpcChQcm90bzEsIFZ0eXBlKSwKKyAgICAgICAgICAgIHtQcm90bzEsIG9rfSA9IHNraXAoUHJvdG8wLCB0eXBlaWRfdG9fYXRvbShLdHlwZSkpLAorICAgICAgICAgICAge1Byb3RvMiwgb2t9ID0gc2tpcChQcm90bzEsIHR5cGVpZF90b19hdG9tKFZ0eXBlKSksCiAgICAgICAgICAgICBza2lwX21hcF9sb29wKFByb3RvMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwI3Byb3RvY29sX21hcF9iZWdpbntzaXplID0gU2l6ZSAtIDF9KTsKICAgICAgICAgMCAtPiB7UHJvdG8wLCBva30KQEAgLTI3Nyw3ICsyODEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFNpemV9KSAtPgogICAgIGNhc2UgU2l6ZSBvZgogICAgICAgICBOIHdoZW4gTiA+IDAgLT4KLSAgICAgICAgICAgIHtQcm90bzEsIG9rfSA9IHNraXAoUHJvdG8wLCBFdHlwZSksCisgICAgICAgICAgICB7UHJvdG8xLCBva30gPSBza2lwKFByb3RvMCwgdHlwZWlkX3RvX2F0b20oRXR5cGUpKSwKICAgICAgICAgICAgIHNraXBfc2V0X2xvb3AoUHJvdG8xLAogICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAjcHJvdG9jb2xfc2V0X2JlZ2lue3NpemUgPSBTaXplIC0gMX0pOwogICAgICAgICAwIC0+IHtQcm90bzAsIG9rfQpAQCAtMjg3LDcgKzI5MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfSkgLT4KICAgICBjYXNlIFNpemUgb2YKICAgICAgICAgTiB3aGVuIE4gPiAwIC0+Ci0gICAgICAgICAgICB7UHJvdG8xLCBva30gPSBza2lwKFByb3RvMCwgRXR5cGUpLAorICAgICAgICAgICAge1Byb3RvMSwgb2t9ID0gc2tpcChQcm90bzAsIHR5cGVpZF90b19hdG9tKEV0eXBlKSksCiAgICAgICAgICAgICBza2lwX2xpc3RfbG9vcChQcm90bzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAjcHJvdG9jb2xfbGlzdF9iZWdpbntzaXplID0gU2l6ZSAtIDF9KTsKICAgICAgICAgMCAtPiB7UHJvdG8wLCBva30KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9yZWNvbm5lY3RpbmdfY2xpZW50LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9yZWNvbm5lY3RpbmdfY2xpZW50LmVybAppbmRleCA4ZmYxOTQxLi41MzhmZDNhIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfcmVjb25uZWN0aW5nX2NsaWVudC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X3JlY29ubmVjdGluZ19jbGllbnQuZXJsCkBAIC0zNiwxNCArMzYsMTQgQEAKICAgICAgICAgICB0ZXJtaW5hdGUvMiwKICAgICAgICAgICBjb2RlX2NoYW5nZS8zIF0pLgogCi0tcmVjb3JkKCBzdGF0ZSwgeyBjbGllbnQgPSBuaWwsIAorLXJlY29yZCggc3RhdGUsIHsgY2xpZW50ID0gbmlsLAogICAgICAgICAgICAgICAgICAgaG9zdCwKICAgICAgICAgICAgICAgICAgIHBvcnQsCiAgICAgICAgICAgICAgICAgICB0aHJpZnRfc3ZjLAogICAgICAgICAgICAgICAgICAgdGhyaWZ0X29wdHMsCiAgICAgICAgICAgICAgICAgICByZWNvbm5fbWluLAogICAgICAgICAgICAgICAgICAgcmVjb25uX21heCwKLSAgICAgICAgICAgICAgICAgIHJlY29ubl90aW1lLAorICAgICAgICAgICAgICAgICAgcmVjb25uX3RpbWUgPSAwLAogICAgICAgICAgICAgICAgICAgb3BfY250X2RpY3QsCiAgICAgICAgICAgICAgICAgICBvcF90aW1lX2RpY3QgfSApLgogCkBAIC0xMTUsOSArMTE1LDkgQEAKICAgICAgICAgICAgICBfRnJvbSwKICAgICAgICAgICAgICBTdGF0ZT0jc3RhdGV7IGNsaWVudCA9IENsaWVudCB9ICkgLT4KIAotICBTdGFydCA9IG5vdygpLAorICBUaW1lciA9IHRpbWVyX2Z1bigpLAogICBSZXN1bHQgPSAoIGNhdGNoIHRocmlmdF9jbGllbnQ6Y2FsbCggQ2xpZW50LCBPcCwgQXJncykgKSwKLSAgVGltZSA9IHRpbWVyOm5vd19kaWZmKCBub3coKSwgU3RhcnQgKSwKKyAgVGltZSA9IFRpbWVyKCksCiAKICAgY2FzZSBSZXN1bHQgb2YKICAgICB7IEMsIHsgb2ssIFJlcGx5IH0gfSAtPgpAQCAtMTU2LDYgKzE1Niw5IEBACiAlJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFN0YXRlfQogJSUgRGVzY3JpcHRpb246IEhhbmRsaW5nIGFsbCBub24gY2FsbC9jYXN0IG1lc3NhZ2VzCiAlJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitoYW5kbGVfaW5mbyggdHJ5X2Nvbm5lY3QsIFN0YXRlICkgLT4KKyAgeyBub3JlcGx5LCB0cnlfY29ubmVjdCggU3RhdGUgKSB9OworCiBoYW5kbGVfaW5mbyggX0luZm8sIFN0YXRlICkgLT4KICAgeyBub3JlcGx5LCBTdGF0ZSB9LgogCkBAIC0yMTQsNiArMjE3LDIxIEBACiAgICAgZmFsc2UgLT4gQmFja29mZgogICBlbmQuCiAKKy1pZmRlZih0aW1lX2NvcnJlY3Rpb24pLgordGltZXJfZnVuKCkgLT4KKyAgVDEgPSBlcmxhbmc6bW9ub3RvbmljX3RpbWUoKSwKKyAgZnVuKCkgLT4KKyAgICBUMiA9IGVybGFuZzptb25vdG9uaWNfdGltZSgpLAorICAgIGVybGFuZzpjb252ZXJ0X3RpbWVfdW5pdChUMiAtIFQxLCBuYXRpdmUsIG1pY3JvX3NlY29uZHMpCisgIGVuZC4KKy1lbHNlLgordGltZXJfZnVuKCkgLT4KKyAgVDEgPSBlcmxhbmc6dGltZXN0YW1wKCksCisgIGZ1bigpIC0+CisgICAgVDIgPSBlcmxhbmc6dGltZXN0YW1wKCksCisgICAgdGltZXI6bm93X2RpZmYoVDIsIFQxKQorICBlbmQuCistZW5kaWYuCiAKIGluY3Jfc3RhdHMoIE9wLCBSZXN1bHQsIFRpbWUsCiAgICAgICAgICAgICBTdGF0ZSA9ICNzdGF0ZXsgb3BfY250X2RpY3QgID0gT3BDbnREaWN0LApkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X3NvY2tldF9zZXJ2ZXIuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X3NvY2tldF9zZXJ2ZXIuZXJsCmluZGV4IGY3YzdhMDIuLjRlM2MwNTIgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9zb2NrZXRfc2VydmVyLmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfc29ja2V0X3NlcnZlci5lcmwKQEAgLTIxLDEyICsyMSwxOSBAQAogCiAtYmVoYXZpb3VyKGdlbl9zZXJ2ZXIpLgogCi0tZXhwb3J0KFtzdGFydC8xLCBzdG9wLzFdKS4KKy1pbmNsdWRlICgidGhyaWZ0X2NvbnN0YW50cy5ocmwiKS4KIAotLWV4cG9ydChbaW5pdC8xLCBoYW5kbGVfY2FsbC8zLCBoYW5kbGVfY2FzdC8yLCB0ZXJtaW5hdGUvMiwgY29kZV9jaGFuZ2UvMywKLSAgICAgICAgIGhhbmRsZV9pbmZvLzJdKS4KKy1pZmRlZihURVNUKS4KKyAgICAtY29tcGlsZShleHBvcnRfYWxsKS4KKyAgICAtZXhwb3J0X3JlY29yZHMoW3RocmlmdF9zb2NrZXRfc2VydmVyXSkuCistZWxzZS4KKyAgICAtZXhwb3J0KFtzdGFydC8xLCBzdG9wLzFdKS4KIAotLWV4cG9ydChbYWNjZXB0b3JfbG9vcC8xXSkuCisgICAgLWV4cG9ydChbaW5pdC8xLCBoYW5kbGVfY2FsbC8zLCBoYW5kbGVfY2FzdC8yLCB0ZXJtaW5hdGUvMiwgY29kZV9jaGFuZ2UvMywKKyAgICAgICAgICAgICBoYW5kbGVfaW5mby8yXSkuCisKKyAgICAtZXhwb3J0KFthY2NlcHRvcl9sb29wLzFdKS4KKy1lbmRpZi4KIAogLXJlY29yZCh0aHJpZnRfc29ja2V0X3NlcnZlciwKICAgICAgICAge3BvcnQsCkBAIC0zOCw3ICs0NSwxMCBAQAogICAgICAgICAgbGlzdGVuPW51bGwsCiAgICAgICAgICBhY2NlcHRvcj1udWxsLAogICAgICAgICAgc29ja2V0X29wdHM9W3tyZWN2X3RpbWVvdXQsIDUwMH1dLAotICAgICAgICAgZnJhbWVkPWZhbHNlCisgICAgICAgICBwcm90b2NvbD1iaW5hcnksCisgICAgICAgICBmcmFtZWQ9ZmFsc2UsCisgICAgICAgICBzc2x0cmFuc3BvcnQ9ZmFsc2UsCisgICAgICAgICBzc2xvcHRpb25zPVtdCiAgICAgICAgIH0pLgogCiBzdGFydChTdGF0ZT0jdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7fSkgLT4KQEAgLTkxLDEwICsxMDEsNDYgQEAKICAgICBwYXJzZV9vcHRpb25zKFJlc3QsIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye2lwPVBhcnNlZElwfSk7CiBwYXJzZV9vcHRpb25zKFt7c29ja2V0X29wdHMsIEx9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2xpc3QoTCksIGxlbmd0aChMKSA+IDAgLT4KICAgICBwYXJzZV9vcHRpb25zKFJlc3QsIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye3NvY2tldF9vcHRzPUx9KTsKLXBhcnNlX29wdGlvbnMoW3toYW5kbGVyLCBIYW5kbGVyfSB8IFJlc3RdLCBTdGF0ZSkgLT4KKworcGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIFtdfSB8IF9SZXN0XSwgX1N0YXRlKSAtPgorICAgIHRocm93KCJBdCBsZWFzdCBhbiBlcnJvciBoYW5kbGVyIG11c3QgYmUgZGVmaW5lZC4iKTsKK3BhcnNlX29wdGlvbnMoW3toYW5kbGVyLCBTZXJ2aWNlSGFuZGxlclByb3BlcnR5TGlzdH0gfCBSZXN0XSwgU3RhdGUpIHdoZW4gaXNfbGlzdChTZXJ2aWNlSGFuZGxlclByb3BlcnR5TGlzdCkgLT4KKyAgICBTZXJ2aWNlSGFuZGxlck1hcCA9CisgICAgY2FzZSBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlci5oYW5kbGVyIG9mCisgICAgICAgIHVuZGVmaW5lZCAtPgorICAgICAgICAgICAgbGlzdHM6Zm9sZGwoCisgICAgICAgICAgICAgICAgZnVuICh7U2VydmljZU5hbWUsIFNlcnZpY2VIYW5kbGVyfSwgQWNjKSB3aGVuIGlzX2xpc3QoU2VydmljZU5hbWUpLCBpc19hdG9tKFNlcnZpY2VIYW5kbGVyKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyOnN0b3JlKFNlcnZpY2VOYW1lLCBTZXJ2aWNlSGFuZGxlciwgQWNjKTsKKyAgICAgICAgICAgICAgICAgICAgKF8sIF9BY2MpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdygiVGhlIGhhbmRsZXIgb3B0aW9uIGlzIG5vdCBwcm9wZXJseSBjb25maWd1cmVkIGZvciBtdWx0aXBsZXhlZCBzZXJ2aWNlcy4gSXQgc2hvdWxkIGJlIGEga2luZCBvZiBbe1wiZXJyb3JfaGFuZGxlclwiLCBNb2R1bGU6OmF0b20oKX0sIHtTZXJpY2VOYW1lOjpsaXN0KCksIE1vZHVsZTo6YXRvbSgpfSwgLi4uXSIpCisgICAgICAgICAgICAgICAgZW5kLCB0aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXI6bmV3KCksIFNlcnZpY2VIYW5kbGVyUHJvcGVydHlMaXN0KTsKKyAgICAgICAgXyAtPiB0aHJvdygiRXJyb3Igd2hpbGUgcGFyc2luZyB0aGUgaGFuZGxlciBvcHRpb24uIikKKyAgICBlbmQsCisgICAgY2FzZSB0aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXI6ZmluZCg/TVVMVElQTEVYRURfRVJST1JfSEFORExFUl9LRVksIFNlcnZpY2VIYW5kbGVyTWFwKSBvZgorICAgICAgICB7b2ssIF9FcnJvckhhbmRsZXJ9IC0+IHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7aGFuZGxlcj1TZXJ2aWNlSGFuZGxlck1hcH0pOworICAgICAgICBlcnJvciAtPiB0aHJvdygiVGhlIGhhbmRsZXIgb3B0aW9uIGlzIG5vdCBwcm9wZXJseSBjb25maWd1cmVkIGZvciBtdWx0aXBsZXhlZCBzZXJ2aWNlcy4gSXQgc2hvdWxkIGJlIGEga2luZCBvZiBbe1wiZXJyb3JfaGFuZGxlclwiLCBNb2R1bGU6OmF0b20oKX0sIHtTZXJpY2VOYW1lOjpsaXN0KCksIE1vZHVsZTo6YXRvbSgpfSwgLi4uXSIpCisgICAgZW5kOworcGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIEhhbmRsZXJ9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVyLmhhbmRsZXIgPT0gdW5kZWZpbmVkLCBpc19hdG9tKEhhbmRsZXIpIC0+CiAgICAgcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcntoYW5kbGVyPUhhbmRsZXJ9KTsKLXBhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCBTZXJ2aWNlfSB8IFJlc3RdLCBTdGF0ZSkgLT4KKworcGFyc2Vfb3B0aW9ucyhbe3NlcnZpY2UsIFtdfSB8IF9SZXN0XSwgX1N0YXRlKSAtPgorICAgIHRocm93KCJBdCBsZWFzdCBvbmUgc2VydmljZSBtb2R1bGUgbXVzdCBiZSBkZWZpbmVkLiIpOworcGFyc2Vfb3B0aW9ucyhbe3NlcnZpY2UsIFNlcnZpY2VNb2R1bGVQcm9wZXJ0eUxpc3R9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2xpc3QoU2VydmljZU1vZHVsZVByb3BlcnR5TGlzdCkgLT4KKyAgICBTZXJ2aWNlTW9kdWxlTWFwID0KKyAgICBjYXNlIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVyLnNlcnZpY2Ugb2YKKyAgICAgICAgdW5kZWZpbmVkIC0+CisgICAgICAgICAgICBsaXN0czpmb2xkbCgKKyAgICAgICAgICAgICAgICBmdW4gKHtTZXJ2aWNlTmFtZSwgU2VydmljZU1vZHVsZX0sIEFjYykgd2hlbiBpc19saXN0KFNlcnZpY2VOYW1lKSwgaXNfYXRvbShTZXJ2aWNlTW9kdWxlKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyOnN0b3JlKFNlcnZpY2VOYW1lLCBTZXJ2aWNlTW9kdWxlLCBBY2MpOworICAgICAgICAgICAgICAgICAgICAoXywgX0FjYykgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93KCJUaGUgc2VydmljZSBvcHRpb24gaXMgbm90IHByb3Blcmx5IGNvbmZpZ3VyZWQgZm9yIG11bHRpcGxleGVkIHNlcnZpY2VzLiBJdCBzaG91bGQgYmUgYSBraW5kIG9mIFt7U2VyaWNlTmFtZTo6bGlzdCgpLCBTZXJ2aWNlTW9kdWxlOjphdG9tKCl9LCAuLi5dIikKKyAgICAgICAgICAgICAgICBlbmQsIHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpuZXcoKSwgU2VydmljZU1vZHVsZVByb3BlcnR5TGlzdCk7CisgICAgICAgIF8gLT4gdGhyb3coIkVycm9yIHdoaWxlIHBhcnNpbmcgdGhlIHNlcnZpY2Ugb3B0aW9uLiIpCisgICAgZW5kLAorICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7c2VydmljZT1TZXJ2aWNlTW9kdWxlTWFwfSk7CitwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgU2VydmljZX0gfCBSZXN0XSwgU3RhdGUpIHdoZW4gU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXIuc2VydmljZSA9PSB1bmRlZmluZWQsIGlzX2F0b20oU2VydmljZSkgLT4KICAgICBwYXJzZV9vcHRpb25zKFJlc3QsIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye3NlcnZpY2U9U2VydmljZX0pOworCiBwYXJzZV9vcHRpb25zKFt7bWF4LCBNYXh9IHwgUmVzdF0sIFN0YXRlKSAtPgogICAgIE1heEludCA9IGNhc2UgTWF4IG9mCiAgICAgICAgICAgICAgICAgIE1heCB3aGVuIGlzX2xpc3QoTWF4KSAtPgpAQCAtMTAzLDggKzE0OSwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgTWF4CiAgICAgICAgICAgICAgZW5kLAogICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7bWF4PU1heEludH0pOworCitwYXJzZV9vcHRpb25zKFt7cHJvdG9jb2wsIFByb3RvfSB8IFJlc3RdLCBTdGF0ZSkgd2hlbiBpc19hdG9tKFByb3RvKSAtPgorICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7cHJvdG9jb2w9UHJvdG99KTsKKwogcGFyc2Vfb3B0aW9ucyhbe2ZyYW1lZCwgRnJhbWVkfSB8IFJlc3RdLCBTdGF0ZSkgd2hlbiBpc19ib29sZWFuKEZyYW1lZCkgLT4KLSAgICBwYXJzZV9vcHRpb25zKFJlc3QsIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye2ZyYW1lZD1GcmFtZWR9KS4KKyAgICBwYXJzZV9vcHRpb25zKFJlc3QsIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye2ZyYW1lZD1GcmFtZWR9KTsKKworcGFyc2Vfb3B0aW9ucyhbe3NzbHRyYW5zcG9ydCwgU1NMVHJhbnNwb3J0fSB8IFJlc3RdLCBTdGF0ZSkgd2hlbiBpc19ib29sZWFuKFNTTFRyYW5zcG9ydCkgLT4KKyAgICBwYXJzZV9vcHRpb25zKFJlc3QsIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye3NzbHRyYW5zcG9ydD1TU0xUcmFuc3BvcnR9KTsKK3BhcnNlX29wdGlvbnMoW3tzc2xvcHRpb25zLCBTU0xPcHRpb25zfSB8IFJlc3RdLCBTdGF0ZSkgd2hlbiBpc19saXN0KFNTTE9wdGlvbnMpIC0+CisgICAgcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcntzc2xvcHRpb25zPVNTTE9wdGlvbnN9KS4KIAogc3RhcnRfc2VydmVyKFN0YXRlPSN0aHJpZnRfc29ja2V0X3NlcnZlcntuYW1lPU5hbWV9KSAtPgogICAgIGNhc2UgTmFtZSBvZgpAQCAtMTY4LDI1ICsyMjMsMzIgQEAKICAgICBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcnthY2NlcHRvcj1udWxsfTsKIG5ld19hY2NlcHRvcihTdGF0ZT0jdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7bGlzdGVuPUxpc3RlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZT1TZXJ2aWNlLCBoYW5kbGVyPUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF9vcHRzPU9wdHMsIGZyYW1lZD1GcmFtZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X29wdHM9T3B0cywgZnJhbWVkPUZyYW1lZCwgcHJvdG9jb2w9UHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbHRyYW5zcG9ydD1Tc2xUcmFuc3BvcnQsIHNzbG9wdGlvbnM9U3NsT3B0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIC0+CiAgICAgUGlkID0gcHJvY19saWI6c3Bhd25fbGluayg/TU9EVUxFLCBhY2NlcHRvcl9sb29wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3tzZWxmKCksIExpc3RlbiwgU2VydmljZSwgSGFuZGxlciwgT3B0cywgRnJhbWVkfV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3tzZWxmKCksIExpc3RlbiwgU2VydmljZSwgSGFuZGxlciwgT3B0cywgRnJhbWVkLCBTc2xUcmFuc3BvcnQsIFNzbE9wdGlvbnMsIFByb3RvfV0pLAogICAgIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye2FjY2VwdG9yPVBpZH0uCiAKLWFjY2VwdG9yX2xvb3Aoe1NlcnZlciwgTGlzdGVuLCBTZXJ2aWNlLCBIYW5kbGVyLCBTb2NrZXRPcHRzLCBGcmFtZWR9KQorYWNjZXB0b3JfbG9vcCh7U2VydmVyLCBMaXN0ZW4sIFNlcnZpY2UsIEhhbmRsZXIsIFNvY2tldE9wdHMsIEZyYW1lZCwgU3NsVHJhbnNwb3J0LCBTc2xPcHRpb25zLCBQcm90b30pCiAgIHdoZW4gaXNfcGlkKFNlcnZlciksIGlzX2xpc3QoU29ja2V0T3B0cykgLT4KICAgICBjYXNlIGNhdGNoIGdlbl90Y3A6YWNjZXB0KExpc3Rlbikgb2YgJSBpbmZpbml0ZSB0aW1lb3V0CiAgICAgICAgIHtvaywgU29ja2V0fSAtPgogICAgICAgICAgICAgZ2VuX3NlcnZlcjpjYXN0KFNlcnZlciwge2FjY2VwdGVkLCBzZWxmKCl9KSwKICAgICAgICAgICAgIFByb3RvR2VuID0gZnVuKCkgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFNvY2tldFRyYW5zcG9ydH0gICA9IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0Om5ldyhTb2NrZXQsIFNvY2tldE9wdHMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgVHJhbnNwb3J0fSAgICAgICAgID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGcmFtZWQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0Om5ldyhTb2NrZXRUcmFuc3BvcnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLT4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydDpuZXcoU29ja2V0VHJhbnNwb3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge29rLCBQcm90b2NvbH0gICAgICAgICAgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgU29ja2V0VHJhbnNwb3J0fSA9IGNhc2UgU3NsVHJhbnNwb3J0IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgIC0+IHRocmlmdF9zc2xzb2NrZXRfdHJhbnNwb3J0Om5ldyhTb2NrZXQsIFNvY2tldE9wdHMsIFNzbE9wdGlvbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtPiB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpuZXcoU29ja2V0LCBTb2NrZXRPcHRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFRyYW5zcG9ydH0gICAgICAgPSBjYXNlIEZyYW1lZCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlICAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDpuZXcoU29ja2V0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLT4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydDpuZXcoU29ja2V0VHJhbnNwb3J0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFByb3RvY29sfSAgICAgICAgPSBjYXNlIFByb3RvIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYWN0IC0+IHRocmlmdF9jb21wYWN0X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbiAtPiB0aHJpZnRfanNvbl9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gLT4gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFByb3RvY29sfQogICAgICAgICAgICAgICAgICAgICAgICBlbmQsCiAgICAgICAgICAgICB0aHJpZnRfcHJvY2Vzc29yOmluaXQoe1NlcnZlciwgUHJvdG9HZW4sIFNlcnZpY2UsIEhhbmRsZXJ9KTsKQEAgLTIxNCw4ICsyNzYsMTEgQEAKIGhhbmRsZV9jYXN0KHN0b3AsIFN0YXRlKSAtPgogICAgIHtzdG9wLCBub3JtYWwsIFN0YXRlfS4KIAotdGVybWluYXRlKF9SZWFzb24sICN0aHJpZnRfc29ja2V0X3NlcnZlcntsaXN0ZW49TGlzdGVuLCBwb3J0PVBvcnR9KSAtPgordGVybWluYXRlKFJlYXNvbiwgI3RocmlmdF9zb2NrZXRfc2VydmVye2xpc3Rlbj1MaXN0ZW4sIHBvcnQ9UG9ydH0pIC0+CiAgICAgZ2VuX3RjcDpjbG9zZShMaXN0ZW4pLAorICAgIHtiYWNrdHJhY2UsIEJ0fSA9IGVybGFuZzpwcm9jZXNzX2luZm8oc2VsZigpLCBiYWNrdHJhY2UpLAorICAgIGVycm9yX2xvZ2dlcjplcnJvcl9yZXBvcnQoez9NT0RVTEUsID9MSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjaGlsZF9lcnJvciwgUmVhc29uLCBCdH19KSwKICAgICBjYXNlIFBvcnQgPCAxMDI0IG9mCiAgICAgICAgIHRydWUgLT4KICAgICAgICAgICAgIGNhdGNoIGZkc3J2OnN0b3AoKSwKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9zb2NrZXRfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9zb2NrZXRfdHJhbnNwb3J0LmVybAppbmRleCA1ZTFlZjAyLi5mYTEwZWQwIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfc29ja2V0X3RyYW5zcG9ydC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQuZXJsCkBAIC0yMSwxMDIgKzIxLDE1NiBAQAogCiAtYmVoYXZpb3VyKHRocmlmdF90cmFuc3BvcnQpLgogCi0tZXhwb3J0KFtuZXcvMSwKLSAgICAgICAgIG5ldy8yLAotICAgICAgICAgd3JpdGUvMiwgcmVhZC8yLCBmbHVzaC8xLCBjbG9zZS8xLAorJSUgY29uc3RydWN0b3JzCistZXhwb3J0KFtuZXcvMSwgbmV3LzJdKS4KKyUlIHRyYW5zcG9ydCBjYWxsYmFja3MKKy1leHBvcnQoW3JlYWQvMiwgcmVhZF9leGFjdC8yLCB3cml0ZS8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCislJSBsZWdhY3kgYXBpCistZXhwb3J0KFtuZXdfdHJhbnNwb3J0X2ZhY3RvcnkvM10pLgogCi0gICAgICAgICBuZXdfdHJhbnNwb3J0X2ZhY3RvcnkvM10pLgogCi0tcmVjb3JkKGRhdGEsIHtzb2NrZXQsCi0gICAgICAgICAgICAgICByZWN2X3RpbWVvdXQ9aW5maW5pdHl9KS4KLS10eXBlIHN0YXRlKCkgOjogI2RhdGF7fS4KLS1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KKy1yZWNvcmQodF9zb2NrZXQsIHsKKyAgc29ja2V0LAorICByZWN2X3RpbWVvdXQ9NjAwMDAsCisgIGJ1ZmZlciA9IFtdCit9KS4KIAotbmV3KFNvY2tldCkgLT4KLSAgICBuZXcoU29ja2V0LCBbXSkuCistdHlwZSBzdGF0ZSgpIDo6ICN0X3NvY2tldHt9LgorCisKKy1zcGVjIG5ldyhTb2NrZXQ6OmFueSgpKSAtPgorICB0aHJpZnRfdHJhbnNwb3J0OnRfdHJhbnNwb3J0KCkuCisKK25ldyhTb2NrZXQpIC0+IG5ldyhTb2NrZXQsIFtdKS4KKworLXNwZWMgbmV3KFNvY2tldDo6YW55KCksIE9wdHM6Omxpc3QoKSkgLT4KKyAgdGhyaWZ0X3RyYW5zcG9ydDp0X3RyYW5zcG9ydCgpLgogCiBuZXcoU29ja2V0LCBPcHRzKSB3aGVuIGlzX2xpc3QoT3B0cykgLT4KLSAgICBTdGF0ZSA9Ci0gICAgICAgIGNhc2UgbGlzdHM6a2V5c2VhcmNoKHJlY3ZfdGltZW91dCwgMSwgT3B0cykgb2YKLSAgICAgICAgICAgIHt2YWx1ZSwge3JlY3ZfdGltZW91dCwgVGltZW91dH19Ci0gICAgICAgICAgICB3aGVuIGlzX2ludGVnZXIoVGltZW91dCksIFRpbWVvdXQgPiAwIC0+Ci0gICAgICAgICAgICAgICAgI2RhdGF7c29ja2V0PVNvY2tldCwgcmVjdl90aW1lb3V0PVRpbWVvdXR9OwotICAgICAgICAgICAgXyAtPgotICAgICAgICAgICAgICAgICNkYXRhe3NvY2tldD1Tb2NrZXR9Ci0gICAgICAgIGVuZCwKLSAgICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCi0KLSUlIERhdGEgOjogaW9saXN0KCkKLXdyaXRlKFRoaXMgPSAjZGF0YXtzb2NrZXQgPSBTb2NrZXR9LCBEYXRhKSAtPgotICAgIHtUaGlzLCBnZW5fdGNwOnNlbmQoU29ja2V0LCBEYXRhKX0uCi0KLXJlYWQoVGhpcyA9ICNkYXRhe3NvY2tldD1Tb2NrZXQsIHJlY3ZfdGltZW91dD1UaW1lb3V0fSwgTGVuKQotICB3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KLSAgICBjYXNlIGdlbl90Y3A6cmVjdihTb2NrZXQsIExlbiwgVGltZW91dCkgb2YKLSAgICAgICAgRXJyID0ge2Vycm9yLCB0aW1lb3V0fSAtPgotICAgICAgICAgICAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJyZWFkIHRpbWVvdXQ6IHBlZXIgY29ubiB+cCIsIFtpbmV0OnBlZXJuYW1lKFNvY2tldCldKSwKLSAgICAgICAgICAgIGdlbl90Y3A6Y2xvc2UoU29ja2V0KSwKLSAgICAgICAgICAgIHtUaGlzLCBFcnJ9OwotICAgICAgICBEYXRhIC0+Ci0gICAgICAgICAgICB7VGhpcywgRGF0YX0KLSAgICBlbmQuCi0KLSUlIFdlIGNhbid0IHJlYWxseSBmbHVzaCAtIGV2ZXJ5dGhpbmcgaXMgZmx1c2hlZCB3aGVuIHdlIHdyaXRlCi1mbHVzaChUaGlzKSAtPgotICAgIHtUaGlzLCBva30uCi0KLWNsb3NlKFRoaXMgPSAjZGF0YXtzb2NrZXQgPSBTb2NrZXR9KSAtPgotICAgIHtUaGlzLCBnZW5fdGNwOmNsb3NlKFNvY2tldCl9LgorICBTdGF0ZSA9IHBhcnNlX29wdHMoT3B0cywgI3Rfc29ja2V0e3NvY2tldCA9IFNvY2tldH0pLAorICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCiAKIAotJSUlJSBGQUNUT1JZIEdFTkVSQVRJT04gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorcGFyc2Vfb3B0cyhbe3JlY3ZfdGltZW91dCwgVGltZW91dH18UmVzdF0sIFN0YXRlKQord2hlbiBpc19pbnRlZ2VyKFRpbWVvdXQpLCBUaW1lb3V0ID4gMCAtPgorICBwYXJzZV9vcHRzKFJlc3QsIFN0YXRlI3Rfc29ja2V0e3JlY3ZfdGltZW91dCA9IFRpbWVvdXR9KTsKK3BhcnNlX29wdHMoW3tyZWN2X3RpbWVvdXQsIGluZmluaXR5fXxSZXN0XSwgU3RhdGUpIC0+CisgIHBhcnNlX29wdHMoUmVzdCwgU3RhdGUjdF9zb2NrZXR7cmVjdl90aW1lb3V0ID0gaW5maW5pdHl9KTsKK3BhcnNlX29wdHMoW10sIFN0YXRlKSAtPgorICBTdGF0ZS4KIAogCistaW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCisKKworcmVhZChTdGF0ZSA9ICN0X3NvY2tldHtidWZmZXIgPSBCdWZ9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShCdWYpLAorICBjYXNlIGlvbGlzdF9zaXplKEJpbmFyeSkgb2YKKyAgICBYIHdoZW4gWCA+PSBMZW4gLT4KKyAgICAgIHtSZXN1bHQsIFJlbWFpbmluZ30gPSBzcGxpdF9iaW5hcnkoQmluYXJ5LCBMZW4pLAorICAgICAge1N0YXRlI3Rfc29ja2V0e2J1ZmZlciA9IFJlbWFpbmluZ30sIHtvaywgUmVzdWx0fX07CisgICAgXyAtPiByZWN2KFN0YXRlLCBMZW4pCisgIGVuZC4KKworcmVjdihTdGF0ZSA9ICN0X3NvY2tldHtzb2NrZXQgPSBTb2NrZXQsIGJ1ZmZlciA9IEJ1Zn0sIExlbikgLT4KKyAgY2FzZSBnZW5fdGNwOnJlY3YoU29ja2V0LCAwLCBTdGF0ZSN0X3NvY2tldC5yZWN2X3RpbWVvdXQpIG9mCisgICAge2Vycm9yLCBFcnJvcn0gLT4KKyAgICAgIGdlbl90Y3A6Y2xvc2UoU29ja2V0KSwKKyAgICAgIHtTdGF0ZSwge2Vycm9yLCBFcnJvcn19OworICAgIHtvaywgRGF0YX0gLT4KKyAgICAgIEJpbmFyeSA9IGlvbGlzdF90b19iaW5hcnkoW0J1ZiwgRGF0YV0pLAorICAgICAgR2l2ZSA9IG1pbihpb2xpc3Rfc2l6ZShCaW5hcnkpLCBMZW4pLAorICAgICAge1Jlc3VsdCwgUmVtYWluaW5nfSA9IHNwbGl0X2JpbmFyeShCaW5hcnksIEdpdmUpLAorICAgICAge1N0YXRlI3Rfc29ja2V0e2J1ZmZlciA9IFJlbWFpbmluZ30sIHtvaywgUmVzdWx0fX0KKyAgZW5kLgorCisKK3JlYWRfZXhhY3QoU3RhdGUgPSAjdF9zb2NrZXR7YnVmZmVyID0gQnVmfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIEJpbmFyeSA9IGlvbGlzdF90b19iaW5hcnkoQnVmKSwKKyAgY2FzZSBpb2xpc3Rfc2l6ZShCaW5hcnkpIG9mCisgICAgWCB3aGVuIFggPj0gTGVuIC0+IHJlYWQoU3RhdGUsIExlbik7CisgICAgWCAtPgorICAgICAgY2FzZSBnZW5fdGNwOnJlY3YoU3RhdGUjdF9zb2NrZXQuc29ja2V0LCBMZW4gLSBYLCBTdGF0ZSN0X3NvY2tldC5yZWN2X3RpbWVvdXQpIG9mCisgICAgICAgIHtlcnJvciwgRXJyb3J9IC0+CisgICAgICAgICAgZ2VuX3RjcDpjbG9zZShTdGF0ZSN0X3NvY2tldC5zb2NrZXQpLAorICAgICAgICAgIHtTdGF0ZSwge2Vycm9yLCBFcnJvcn19OworICAgICAgICB7b2ssIERhdGF9IC0+CisgICAgICAgICAge1N0YXRlI3Rfc29ja2V0e2J1ZmZlciA9IFtdfSwge29rLCA8PEJpbmFyeS9iaW5hcnksIERhdGEvYmluYXJ5Pj59fQorICAgICAgZW5kCisgIGVuZC4KKworCit3cml0ZShTdGF0ZSA9ICN0X3NvY2tldHtzb2NrZXQgPSBTb2NrZXR9LCBEYXRhKSAtPgorICBjYXNlIGdlbl90Y3A6c2VuZChTb2NrZXQsIERhdGEpIG9mCisgICAge2Vycm9yLCBFcnJvcn0gLT4KKyAgICAgIGdlbl90Y3A6Y2xvc2UoU29ja2V0KSwKKyAgICAgIHtTdGF0ZSwge2Vycm9yLCBFcnJvcn19OworICAgIG9rIC0+IHtTdGF0ZSwgb2t9CisgIGVuZC4KKworCitmbHVzaChTdGF0ZSkgLT4KKyAge1N0YXRlI3Rfc29ja2V0e2J1ZmZlciA9IFtdfSwgb2t9LgorCisKK2Nsb3NlKFN0YXRlID0gI3Rfc29ja2V0e3NvY2tldCA9IFNvY2tldH0pIC0+CisgIHtTdGF0ZSwgZ2VuX3RjcDpjbG9zZShTb2NrZXQpfS4KKworCislJSBsZWdhY3kgYXBpLiBsZWZ0IGZvciBjb21wYXRpYmlsaXR5CisKICUlIFRoZSBmb2xsb3dpbmcgImxvY2FsIiByZWNvcmQgaXMgZmlsbGVkIGluIGJ5IHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucy8yCiAlJSBiZWxvdy4gVGhlc2Ugb3B0aW9ucyBjYW4gYmUgcGFzc2VkIHRvIG5ld19wcm90b2NvbF9mYWN0b3J5LzMgaW4gYQogJSUgcHJvcGxpc3RzLXN0eWxlIG9wdGlvbiBsaXN0LiBUaGV5J3JlIHBhcnNlZCBsaWtlIHRoaXMgc28gaXQgaXMgYW4gTyhuKQogJSUgb3BlcmF0aW9uIGluc3RlYWQgb2YgTyhuXjIpCi0tcmVjb3JkKGZhY3Rvcnlfb3B0cywge2Nvbm5lY3RfdGltZW91dCA9IGluZmluaXR5LAotICAgICAgICAgICAgICAgICAgICAgICBzb2Nrb3B0cyA9IFtdLAotICAgICAgICAgICAgICAgICAgICAgICBmcmFtZWQgPSBmYWxzZX0pLgorLXJlY29yZChmYWN0b3J5X29wdHMsIHsKKyAgY29ubmVjdF90aW1lb3V0ID0gaW5maW5pdHksCisgIHNvY2tvcHRzID0gW10sCisgIGZyYW1lZCA9IGZhbHNlCit9KS4KIAotcGFyc2VfZmFjdG9yeV9vcHRpb25zKFtdLCBPcHRzKSAtPgotICAgIE9wdHM7Ci1wYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tmcmFtZWQsIEJvb2x9IHwgUmVzdF0sIE9wdHMpIHdoZW4gaXNfYm9vbGVhbihCb29sKSAtPgotICAgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBPcHRzI2ZhY3Rvcnlfb3B0c3tmcmFtZWQ9Qm9vbH0pOwotcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7c29ja29wdHMsIE9wdExpc3R9IHwgUmVzdF0sIE9wdHMpIHdoZW4gaXNfbGlzdChPcHRMaXN0KSAtPgotICAgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBPcHRzI2ZhY3Rvcnlfb3B0c3tzb2Nrb3B0cz1PcHRMaXN0fSk7Ci1wYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tjb25uZWN0X3RpbWVvdXQsIFRPfSB8IFJlc3RdLCBPcHRzKSB3aGVuIFRPID06PSBpbmZpbml0eTsgaXNfaW50ZWdlcihUTykgLT4KLSAgICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgT3B0cyNmYWN0b3J5X29wdHN7Y29ubmVjdF90aW1lb3V0PVRPfSkuCitwYXJzZV9mYWN0b3J5X29wdGlvbnMoW10sIEZhY3RvcnlPcHRzLCBUcmFuc09wdHMpIC0+IHtGYWN0b3J5T3B0cywgVHJhbnNPcHRzfTsKK3BhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe2ZyYW1lZCwgQm9vbH18UmVzdF0sIEZhY3RvcnlPcHRzLCBUcmFuc09wdHMpCit3aGVuIGlzX2Jvb2xlYW4oQm9vbCkgLT4KKyAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIEZhY3RvcnlPcHRzI2ZhY3Rvcnlfb3B0c3tmcmFtZWQgPSBCb29sfSwgVHJhbnNPcHRzKTsKK3BhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe3NvY2tvcHRzLCBPcHRMaXN0fXxSZXN0XSwgRmFjdG9yeU9wdHMsIFRyYW5zT3B0cykKK3doZW4gaXNfbGlzdChPcHRMaXN0KSAtPgorICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgRmFjdG9yeU9wdHMjZmFjdG9yeV9vcHRze3NvY2tvcHRzID0gT3B0TGlzdH0sIFRyYW5zT3B0cyk7CitwYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tjb25uZWN0X3RpbWVvdXQsIFRPfXxSZXN0XSwgRmFjdG9yeU9wdHMsIFRyYW5zT3B0cykKK3doZW4gVE8gPTo9IGluZmluaXR5OyBpc19pbnRlZ2VyKFRPKSAtPgorICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgRmFjdG9yeU9wdHMjZmFjdG9yeV9vcHRze2Nvbm5lY3RfdGltZW91dCA9IFRPfSwgVHJhbnNPcHRzKTsKK3BhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe3JlY3ZfdGltZW91dCwgVE99fFJlc3RdLCBGYWN0b3J5T3B0cywgVHJhbnNPcHRzKQord2hlbiBUTyA9Oj0gaW5maW5pdHk7IGlzX2ludGVnZXIoVE8pIC0+CisgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBGYWN0b3J5T3B0cywgW3tyZWN2X3RpbWVvdXQsIFRPfV0gKysgVHJhbnNPcHRzKS4KIAogCi0lJQogJSUgR2VuZXJhdGVzIGEgInRyYW5zcG9ydCBmYWN0b3J5IiBmdW5jdGlvbiAtIGEgZnVuIHdoaWNoIHJldHVybnMgYSB0aHJpZnRfdHJhbnNwb3J0KCkKICUlIGluc3RhbmNlLgotJSUgVGhpcyBjYW4gYmUgcGFzc2VkIGludG8gYSBwcm90b2NvbCBmYWN0b3J5IHRvIGdlbmVyYXRlIGEgY29ubmVjdGlvbiB0byBhCislJSBTdGF0ZSBjYW4gYmUgcGFzc2VkIGludG8gYSBwcm90b2NvbCBmYWN0b3J5IHRvIGdlbmVyYXRlIGEgY29ubmVjdGlvbiB0byBhCiAlJSB0aHJpZnQgc2VydmVyIG92ZXIgYSBzb2NrZXQuCi0lJQogbmV3X3RyYW5zcG9ydF9mYWN0b3J5KEhvc3QsIFBvcnQsIE9wdGlvbnMpIC0+Ci0gICAgUGFyc2VkT3B0cyA9IHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhPcHRpb25zLCAjZmFjdG9yeV9vcHRze30pLAotCi0gICAgRiA9IGZ1bigpIC0+Ci0gICAgICAgICAgICAgICAgU29ja09wdHMgPSBbYmluYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYWNrZXQsIDB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHthY3RpdmUsIGZhbHNlfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bm9kZWxheSwgdHJ1ZX0gfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZE9wdHMjZmFjdG9yeV9vcHRzLnNvY2tvcHRzXSwKLSAgICAgICAgICAgICAgICBjYXNlIGNhdGNoIGdlbl90Y3A6Y29ubmVjdChIb3N0LCBQb3J0LCBTb2NrT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRPcHRzI2ZhY3Rvcnlfb3B0cy5jb25uZWN0X3RpbWVvdXQpIG9mCi0gICAgICAgICAgICAgICAgICAgIHtvaywgU29ja30gLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0Om5ldyhTb2NrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgQnVmVHJhbnNwb3J0fSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQYXJzZWRPcHRzI2ZhY3Rvcnlfb3B0cy5mcmFtZWQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAgLT4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQ6bmV3KFRyYW5zcG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6bmV3KFRyYW5zcG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICB7b2ssIEJ1ZlRyYW5zcG9ydH07Ci0gICAgICAgICAgICAgICAgICAgIEVycm9yICAtPgotICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IKLSAgICAgICAgICAgICAgICBlbmQKKyAge0ZhY3RvcnlPcHRzLCBUcmFuc09wdHN9ID0gcGFyc2VfZmFjdG9yeV9vcHRpb25zKE9wdGlvbnMsICNmYWN0b3J5X29wdHN7fSwgW10pLAorICB7b2ssIGZ1bigpIC0+IFNvY2tPcHRzID0gW2JpbmFyeSwKKyAgICAgIHtwYWNrZXQsIDB9LAorICAgICAge2FjdGl2ZSwgZmFsc2V9LAorICAgICAge25vZGVsYXksIHRydWV9fEZhY3RvcnlPcHRzI2ZhY3Rvcnlfb3B0cy5zb2Nrb3B0cworICAgIF0sCisgICAgY2FzZSBjYXRjaCBnZW5fdGNwOmNvbm5lY3QoCisgICAgICBIb3N0LAorICAgICAgUG9ydCwKKyAgICAgIFNvY2tPcHRzLAorICAgICAgRmFjdG9yeU9wdHMjZmFjdG9yeV9vcHRzLmNvbm5lY3RfdGltZW91dAorICAgICkgb2YKKyAgICAgIHtvaywgU29ja30gLT4KKyAgICAgICAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2ssIFRyYW5zT3B0cyksCisgICAgICAgIHtvaywgQnVmVHJhbnNwb3J0fSA9IGNhc2UgRmFjdG9yeU9wdHMjZmFjdG9yeV9vcHRzLmZyYW1lZCBvZgorICAgICAgICAgIHRydWUgIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0Om5ldyhUcmFuc3BvcnQpOworICAgICAgICAgIGZhbHNlIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6bmV3KFRyYW5zcG9ydCkKICAgICAgICAgZW5kLAotICAgIHtvaywgRn0uCisgICAgICAgIHtvaywgQnVmVHJhbnNwb3J0fTsKKyAgICAgIEVycm9yICAtPiBFcnJvcgorICAgIGVuZAorICBlbmR9LgorCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfc3Nsc29ja2V0X3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfc3Nsc29ja2V0X3RyYW5zcG9ydC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjExMTUzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9zc2xzb2NrZXRfdHJhbnNwb3J0LmVybApAQCAtMCwwICsxLDE0NyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCistbW9kdWxlKHRocmlmdF9zc2xzb2NrZXRfdHJhbnNwb3J0KS4KKworLWluY2x1ZGUoInRocmlmdF90cmFuc3BvcnRfYmVoYXZpb3VyLmhybCIpLgorCistYmVoYXZpb3VyKHRocmlmdF90cmFuc3BvcnQpLgorCistZXhwb3J0KFtuZXcvMywKKyAgICAgICAgIHdyaXRlLzIsIHJlYWQvMiwgZmx1c2gvMSwgY2xvc2UvMSwKKworICAgICAgICAgbmV3X3RyYW5zcG9ydF9mYWN0b3J5LzNdKS4KKworJSUgRXhwb3J0IG9ubHkgZm9yIHRoZSB0cmFuc3BvcnQgZmFjdG9yeQorLWV4cG9ydChbbmV3LzJdKS4KKworLXJlY29yZChkYXRhLCB7c29ja2V0LAorICAgICAgICAgICAgICAgcmVjdl90aW1lb3V0PWluZmluaXR5fSkuCistdHlwZSBzdGF0ZSgpIDo6ICNkYXRhe30uCisKKyUlIFRoZSBmb2xsb3dpbmcgImxvY2FsIiByZWNvcmQgaXMgZmlsbGVkIGluIGJ5IHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucy8yCislJSBiZWxvdy4gVGhlc2Ugb3B0aW9ucyBjYW4gYmUgcGFzc2VkIHRvIG5ld19wcm90b2NvbF9mYWN0b3J5LzMgaW4gYQorJSUgcHJvcGxpc3RzLXN0eWxlIG9wdGlvbiBsaXN0LiBUaGV5J3JlIHBhcnNlZCBsaWtlIHRoaXMgc28gaXQgaXMgYW4gTyhuKQorJSUgb3BlcmF0aW9uIGluc3RlYWQgb2YgTyhuXjIpCistcmVjb3JkKGZhY3Rvcnlfb3B0cywge2Nvbm5lY3RfdGltZW91dCA9IGluZmluaXR5LAorICAgICAgICAgICAgICAgICAgICAgICBzb2Nrb3B0cyA9IFtdLAorICAgICAgICAgICAgICAgICAgICAgICBmcmFtZWQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3Nsb3B0aW9ucyA9IFtdfSkuCisKK3BhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbXSwgT3B0cykgLT4KKyAgICBPcHRzOworcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7ZnJhbWVkLCBCb29sfSB8IFJlc3RdLCBPcHRzKSB3aGVuIGlzX2Jvb2xlYW4oQm9vbCkgLT4KKyAgICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgT3B0cyNmYWN0b3J5X29wdHN7ZnJhbWVkPUJvb2x9KTsKK3BhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe3NvY2tvcHRzLCBPcHRMaXN0fSB8IFJlc3RdLCBPcHRzKSB3aGVuIGlzX2xpc3QoT3B0TGlzdCkgLT4KKyAgICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgT3B0cyNmYWN0b3J5X29wdHN7c29ja29wdHM9T3B0TGlzdH0pOworcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7Y29ubmVjdF90aW1lb3V0LCBUT30gfCBSZXN0XSwgT3B0cykgd2hlbiBUTyA9Oj0gaW5maW5pdHk7IGlzX2ludGVnZXIoVE8pIC0+CisgICAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIE9wdHMjZmFjdG9yeV9vcHRze2Nvbm5lY3RfdGltZW91dD1UT30pOworcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7c3Nsb3B0aW9ucywgU3NsT3B0aW9uc30gfCBSZXN0XSwgT3B0cykgd2hlbiBpc19saXN0KFNzbE9wdGlvbnMpIC0+CisgICAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIE9wdHMjZmFjdG9yeV9vcHRze3NzbG9wdGlvbnM9U3NsT3B0aW9uc30pLgorCituZXcoU29ja2V0LCBTb2NrT3B0cywgU3NsT3B0aW9ucykgd2hlbiBpc19saXN0KFNvY2tPcHRzKSwgaXNfbGlzdChTc2xPcHRpb25zKSAtPgorICAgIGluZXQ6c2V0b3B0cyhTb2NrZXQsIFt7YWN0aXZlLCBmYWxzZX1dKSwgJSUgPT4gcHJldmVudCB0aGUgc3NsIGhhbmRzaGFrZSBtZXNzYWdlcyBnZXQgbG9zdAorCisgICAgJSUgdXBncmFkZSB0byBhbiBzc2wgc29ja2V0CisgICAgY2FzZSBjYXRjaCBzc2w6c3NsX2FjY2VwdChTb2NrZXQsIFNzbE9wdGlvbnMpIG9mICUgaW5maW5pdGUgdGltZW91dAorICAgICAgICB7b2ssIFNzbFNvY2tldH0gLT4KKyAgICAgICAgICAgIG5ldyhTc2xTb2NrZXQsIFNvY2tPcHRzKTsKKyAgICAgICAge2Vycm9yLCBSZWFzb259IC0+CisgICAgICAgICAgICBleGl0KHtlcnJvciwgUmVhc29ufSk7CisgICAgICAgIE90aGVyIC0+CisgICAgICAgICAgICBlcnJvcl9sb2dnZXI6ZXJyb3JfcmVwb3J0KAorICAgICAgICAgICAgICBbe2FwcGxpY2F0aW9uLCB0aHJpZnR9LAorICAgICAgICAgICAgICAgIlNTTCBhY2NlcHQgZmFpbGVkIGVycm9yIiwKKyAgICAgICAgICAgICAgIGxpc3RzOmZsYXR0ZW4oaW9fbGliOmZvcm1hdCgifnAiLCBbT3RoZXJdKSldKSwKKyAgICAgICAgICAgIGV4aXQoe2Vycm9yLCBzc2xfYWNjZXB0X2ZhaWxlZH0pCisgICAgZW5kLgorCituZXcoU3NsU29ja2V0LCBTb2NrT3B0cykgLT4KKyAgICBTdGF0ZSA9CisgICAgICAgIGNhc2UgbGlzdHM6a2V5c2VhcmNoKHJlY3ZfdGltZW91dCwgMSwgU29ja09wdHMpIG9mCisgICAgICAgICAgICB7dmFsdWUsIHtyZWN2X3RpbWVvdXQsIFRpbWVvdXR9fQorICAgICAgICAgICAgICB3aGVuIGlzX2ludGVnZXIoVGltZW91dCksIFRpbWVvdXQgPiAwIC0+CisgICAgICAgICAgICAgICAgI2RhdGF7c29ja2V0PVNzbFNvY2tldCwgcmVjdl90aW1lb3V0PVRpbWVvdXR9OworICAgICAgICAgICAgXyAtPgorICAgICAgICAgICAgICAgICNkYXRhe3NvY2tldD1Tc2xTb2NrZXR9CisgICAgICAgIGVuZCwKKyAgICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCisKKyUlIERhdGEgOjogaW9saXN0KCkKK3dyaXRlKFRoaXMgPSAjZGF0YXtzb2NrZXQgPSBTb2NrZXR9LCBEYXRhKSAtPgorICAgIHtUaGlzLCBzc2w6c2VuZChTb2NrZXQsIERhdGEpfS4KKworcmVhZChUaGlzID0gI2RhdGF7c29ja2V0PVNvY2tldCwgcmVjdl90aW1lb3V0PVRpbWVvdXR9LCBMZW4pCisgIHdoZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICAgIGNhc2Ugc3NsOnJlY3YoU29ja2V0LCBMZW4sIFRpbWVvdXQpIG9mCisgICAgICAgIEVyciA9IHtlcnJvciwgdGltZW91dH0gLT4KKyAgICAgICAgICAgIGVycm9yX2xvZ2dlcjppbmZvX21zZygicmVhZCB0aW1lb3V0OiBwZWVyIGNvbm4gfnAiLCBbaW5ldDpwZWVybmFtZShTb2NrZXQpXSksCisgICAgICAgICAgICBzc2w6Y2xvc2UoU29ja2V0KSwKKyAgICAgICAgICAgIHtUaGlzLCBFcnJ9OworICAgICAgICBEYXRhIC0+CisgICAgICAgICAgICB7VGhpcywgRGF0YX0KKyAgICBlbmQuCisKKyUlIFdlIGNhbid0IHJlYWxseSBmbHVzaCAtIGV2ZXJ5dGhpbmcgaXMgZmx1c2hlZCB3aGVuIHdlIHdyaXRlCitmbHVzaChUaGlzKSAtPgorICAgIHtUaGlzLCBva30uCisKK2Nsb3NlKFRoaXMgPSAjZGF0YXtzb2NrZXQgPSBTb2NrZXR9KSAtPgorICAgIHtUaGlzLCBzc2w6Y2xvc2UoU29ja2V0KX0uCisKKyUlJSUgRkFDVE9SWSBHRU5FUkFUSU9OICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKworJSUKKyUlIEdlbmVyYXRlcyBhICJ0cmFuc3BvcnQgZmFjdG9yeSIgZnVuY3Rpb24gLSBhIGZ1biB3aGljaCByZXR1cm5zIGEgdGhyaWZ0X3RyYW5zcG9ydCgpCislJSBpbnN0YW5jZS4KKyUlIFRoaXMgY2FuIGJlIHBhc3NlZCBpbnRvIGEgcHJvdG9jb2wgZmFjdG9yeSB0byBnZW5lcmF0ZSBhIGNvbm5lY3Rpb24gdG8gYQorJSUgdGhyaWZ0IHNlcnZlciBvdmVyIGEgc29ja2V0LgorJSUKK25ld190cmFuc3BvcnRfZmFjdG9yeShIb3N0LCBQb3J0LCBPcHRpb25zKSAtPgorICAgIFBhcnNlZE9wdHMgPSBwYXJzZV9mYWN0b3J5X29wdGlvbnMoT3B0aW9ucywgI2ZhY3Rvcnlfb3B0c3t9KSwKKworICAgIEYgPSBmdW4oKSAtPgorICAgICAgICAgICAgICAgIFNvY2tPcHRzID0gW2JpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFja2V0LCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7YWN0aXZlLCBmYWxzZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAge25vZGVsYXksIHRydWV9IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRPcHRzI2ZhY3Rvcnlfb3B0cy5zb2Nrb3B0c10sCisgICAgICAgICAgICAgICAgY2FzZSBjYXRjaCBnZW5fdGNwOmNvbm5lY3QoSG9zdCwgUG9ydCwgU29ja09wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkT3B0cyNmYWN0b3J5X29wdHMuY29ubmVjdF90aW1lb3V0KSBvZgorICAgICAgICAgICAgICAgICAgICB7b2ssIFNvY2t9IC0+CisgICAgICAgICAgICAgICAgICAgICAgICBTc2xTb2NrID0gY2FzZSBjYXRjaCBzc2w6Y29ubmVjdChTb2NrLCBQYXJzZWRPcHRzI2ZhY3Rvcnlfb3B0cy5zc2xvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkT3B0cyNmYWN0b3J5X29wdHMuY29ubmVjdF90aW1lb3V0KSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFNzbFNvY2tldH0gLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNzbFNvY2tldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXIgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2xvZ2dlcjppbmZvX21zZygiZXJyb3Igd2hpbGUgY29ubmVjdGluZyBvdmVyIHNzbCAtIHJlYXNvbjogfnB+biIsIFtPdGhlcl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggZ2VuX3RjcDpjbG9zZShTb2NrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoZXJyb3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X3NzbHNvY2tldF90cmFuc3BvcnQ6bmV3KFNzbFNvY2ssIFNvY2tPcHRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgQnVmVHJhbnNwb3J0fSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQYXJzZWRPcHRzI2ZhY3Rvcnlfb3B0cy5mcmFtZWQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAgLT4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQ6bmV3KFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6bmV3KFRyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIEJ1ZlRyYW5zcG9ydH07CisgICAgICAgICAgICAgICAgICAgIEVycm9yICAtPgorICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgZW5kLAorICAgIHtvaywgRn0uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfdHJhbnNwb3J0LmVybAppbmRleCAzOWY4YzA1Li4yNDE0YmRlIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfdHJhbnNwb3J0LmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfdHJhbnNwb3J0LmVybApAQCAtMjAsNTkgKzIwLDEwNyBAQAogLW1vZHVsZSh0aHJpZnRfdHJhbnNwb3J0KS4KIAogLWV4cG9ydChbYmVoYXZpb3VyX2luZm8vMV0pLgorJSUgY29uc3RydWN0b3JzCistZXhwb3J0KFtuZXcvMSwgbmV3LzJdKS4KKyUlIHRyYW5zcG9ydCBjYWxsYmFja3MKKy1leHBvcnQoW3JlYWQvMiwgcmVhZF9leGFjdC8yLCB3cml0ZS8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCiAKLS1leHBvcnQoW25ldy8yLAotICAgICAgICAgd3JpdGUvMiwKLSAgICAgICAgIHJlYWQvMiwKLSAgICAgICAgIGZsdXNoLzEsCi0gICAgICAgICBjbG9zZS8xCi0gICAgICAgIF0pLgorLWV4cG9ydF90eXBlKFt0X3RyYW5zcG9ydC8wXSkuCisKIAogYmVoYXZpb3VyX2luZm8oY2FsbGJhY2tzKSAtPgotICAgIFt7cmVhZCwgMn0sCi0gICAgIHt3cml0ZSwgMn0sCi0gICAgIHtmbHVzaCwgMX0sCi0gICAgIHtjbG9zZSwgMX0KLSAgICBdLgorICBbe3JlYWQsIDJ9LCB7d3JpdGUsIDJ9LCB7Zmx1c2gsIDF9LCB7Y2xvc2UsIDF9XS4KIAotLXJlY29yZCh0cmFuc3BvcnQsIHttb2R1bGUsIGRhdGF9KS4KKworLXJlY29yZCh0X3RyYW5zcG9ydCwgeworICBtb2R1bGUsCisgIHN0YXRlCit9KS4KKworLXR5cGUgc3RhdGUoKSA6OiAjdF90cmFuc3BvcnR7fS4KKy10eXBlIHRfdHJhbnNwb3J0KCkgOjogI3RfdHJhbnNwb3J0e30uCisKIAogLWlmZGVmKHRyYW5zcG9ydF93cmFwcGVyX21vZHVsZSkuCiAtZGVmaW5lKGRlYnVnX3dyYXAoVHJhbnNwb3J0KSwKLSAgICAgICAgY2FzZSBUcmFuc3BvcnQjdHJhbnNwb3J0Lm1vZHVsZSBvZgotICAgICAgICAgICAgP3RyYW5zcG9ydF93cmFwcGVyX21vZHVsZSAtPgotICAgICAgICAgICAgICAgIFRyYW5zcG9ydDsKLSAgICAgICAgICAgIF9FbHNlIC0+Ci0gICAgICAgICAgICAgICAge29rLCBSZXN1bHR9ID0gP3RyYW5zcG9ydF93cmFwcGVyX21vZHVsZTpuZXcoVHJhbnNwb3J0KSwKLSAgICAgICAgICAgICAgICBSZXN1bHQKLSAgICAgICAgZW5kKS4KKyAgY2FzZSBUcmFuc3BvcnQjdF90cmFuc3BvcnQubW9kdWxlIG9mCisgICAgP3RyYW5zcG9ydF93cmFwcGVyX21vZHVsZSAtPiBUcmFuc3BvcnQ7CisgICAgX0Vsc2UgLT4KKyAgICAgIHtvaywgUmVzdWx0fSA9ID90cmFuc3BvcnRfd3JhcHBlcl9tb2R1bGU6bmV3KFRyYW5zcG9ydCksCisgICAgICBSZXN1bHQKKyAgZW5kCispLgogLWVsc2UuCiAtZGVmaW5lKGRlYnVnX3dyYXAoVHJhbnNwb3J0KSwgVHJhbnNwb3J0KS4KIC1lbmRpZi4KIAotbmV3KE1vZHVsZSwgRGF0YSkgd2hlbiBpc19hdG9tKE1vZHVsZSkgLT4KLSAgICBUcmFuc3BvcnQwID0gI3RyYW5zcG9ydHttb2R1bGUgPSBNb2R1bGUsIGRhdGEgPSBEYXRhfSwKLSAgICBUcmFuc3BvcnQxID0gP2RlYnVnX3dyYXAoVHJhbnNwb3J0MCksCi0gICAge29rLCBUcmFuc3BvcnQxfS4KIAotLXNwZWMgd3JpdGUoI3RyYW5zcG9ydHt9LCBpb2xpc3QoKSB8IGJpbmFyeSgpKSAtPiB7I3RyYW5zcG9ydHt9LCBvayB8IHtlcnJvciwgX1JlYXNvbn19Lgotd3JpdGUoVHJhbnNwb3J0LCBEYXRhKSAtPgotICAgIE1vZHVsZSA9IFRyYW5zcG9ydCN0cmFuc3BvcnQubW9kdWxlLAotICAgIHtOZXdUcmFuc0RhdGEsIFJlc3VsdH0gPSBNb2R1bGU6d3JpdGUoVHJhbnNwb3J0I3RyYW5zcG9ydC5kYXRhLCBEYXRhKSwKLSAgICB7VHJhbnNwb3J0I3RyYW5zcG9ydHtkYXRhID0gTmV3VHJhbnNEYXRhfSwgUmVzdWx0fS4KKy10eXBlIHdyYXBwYWJsZSgpIDo6CisgIGJpbmFyeSgpIHwKKyAgbGlzdCgpIHwKKyAge21lbWJ1ZmZlciwgYmluYXJ5KCkgfCBsaXN0KCl9IHwKKyAge3RjcCwgcG9ydCgpfSB8CisgIHt0Y3AsIHBvcnQoKSwgbGlzdCgpfSB8CisgIHtmaWxlLCBmaWxlOmlvX2RldmljZSgpfSB8CisgIHtmaWxlLCBmaWxlOmlvX2RldmljZSgpLCBsaXN0KCl9IHwKKyAge2ZpbGUsIGZpbGU6ZmlsZW5hbWUoKX0gfAorICB7ZmlsZSwgZmlsZTpmaWxlbmFtZSgpLCBsaXN0KCl9LgogCi0tc3BlYyByZWFkKCN0cmFuc3BvcnR7fSwgbm9uX25lZ19pbnRlZ2VyKCkpIC0+IHsjdHJhbnNwb3J0e30sIHtvaywgYmluYXJ5KCl9IHwge2Vycm9yLCBfUmVhc29ufX0uCi1yZWFkKFRyYW5zcG9ydCwgTGVuKSB3aGVuIGlzX2ludGVnZXIoTGVuKSAtPgotICAgIE1vZHVsZSA9IFRyYW5zcG9ydCN0cmFuc3BvcnQubW9kdWxlLAotICAgIHtOZXdUcmFuc0RhdGEsIFJlc3VsdH0gPSBNb2R1bGU6cmVhZChUcmFuc3BvcnQjdHJhbnNwb3J0LmRhdGEsIExlbiksCi0gICAge1RyYW5zcG9ydCN0cmFuc3BvcnR7ZGF0YSA9IE5ld1RyYW5zRGF0YX0sIFJlc3VsdH0uCistc3BlYyBuZXcod3JhcHBhYmxlKCkpIC0+IHtvaywgI3RfdHJhbnNwb3J0e319LgogCi0tc3BlYyBmbHVzaCgjdHJhbnNwb3J0e30pIC0+IHsjdHJhbnNwb3J0e30sIG9rIHwge2Vycm9yLCBfUmVhc29ufX0uCi1mbHVzaChUcmFuc3BvcnQgPSAjdHJhbnNwb3J0e21vZHVsZSA9IE1vZHVsZSwgZGF0YSA9IERhdGF9KSAtPgotICAgIHtOZXdUcmFuc0RhdGEsIFJlc3VsdH0gPSBNb2R1bGU6Zmx1c2goRGF0YSksCi0gICAge1RyYW5zcG9ydCN0cmFuc3BvcnR7ZGF0YSA9IE5ld1RyYW5zRGF0YX0sIFJlc3VsdH0uCituZXcoe21lbWJ1ZmZlciwgTWVtYnVmZmVyfSkgd2hlbiBpc19iaW5hcnkoTWVtYnVmZmVyKTsgaXNfbGlzdChNZW1idWZmZXIpIC0+CisgIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldyhNZW1idWZmZXIpOworbmV3KHttZW1idWZmZXIsIE1lbWJ1ZmZlciwgW119KSB3aGVuIGlzX2JpbmFyeShNZW1idWZmZXIpOyBpc19saXN0KE1lbWJ1ZmZlcikgLT4KKyAgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KE1lbWJ1ZmZlcik7CituZXcoe3RjcCwgU29ja2V0fSkgd2hlbiBpc19wb3J0KFNvY2tldCkgLT4KKyAgbmV3KHt0Y3AsIFNvY2tldCwgW119KTsKK25ldyh7dGNwLCBTb2NrZXQsIE9wdHN9KSB3aGVuIGlzX3BvcnQoU29ja2V0KSAtPgorICB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpuZXcoU29ja2V0LCBPcHRzKTsKK25ldyh7ZmlsZSwgRmlsZW5hbWV9KSB3aGVuIGlzX2xpc3QoRmlsZW5hbWUpOyBpc19iaW5hcnkoRmlsZW5hbWUpIC0+CisgIG5ldyh7ZmlsZSwgRmlsZW5hbWUsIFtdfSk7CituZXcoe2ZpbGUsIEZpbGVuYW1lLCBPcHRzfSkgd2hlbiBpc19saXN0KEZpbGVuYW1lKTsgaXNfYmluYXJ5KEZpbGVuYW1lKSAtPgorICB7b2ssIEZpbGV9ID0gZmlsZTpvcGVuKEZpbGVuYW1lLCBbcmF3LCBiaW5hcnldKSwKKyAgbmV3KHtmaWxlLCBGaWxlLCBPcHRzfSk7CituZXcoe2ZpbGUsIEZpbGUsIE9wdHN9KSAtPgorICB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6bmV3KEZpbGUsIE9wdHMpLgogCi0tc3BlYyBjbG9zZSgjdHJhbnNwb3J0e30pIC0+IHsjdHJhbnNwb3J0e30sIG9rIHwge2Vycm9yLCBfUmVhc29ufX0uCi1jbG9zZShUcmFuc3BvcnQgPSAjdHJhbnNwb3J0e21vZHVsZSA9IE1vZHVsZSwgZGF0YSA9IERhdGF9KSAtPgotICAgIHtOZXdUcmFuc0RhdGEsIFJlc3VsdH0gPSBNb2R1bGU6Y2xvc2UoRGF0YSksCi0gICAge1RyYW5zcG9ydCN0cmFuc3BvcnR7ZGF0YSA9IE5ld1RyYW5zRGF0YX0sIFJlc3VsdH0uCistc3BlYyBuZXcoTW9kdWxlOjptb2R1bGUoKSwgU3RhdGU6OmFueSgpKSAtPiB7b2ssICN0X3RyYW5zcG9ydHt9fS4KKworbmV3KE1vZHVsZSwgU3RhdGUpIHdoZW4gaXNfYXRvbShNb2R1bGUpIC0+CisgIHtvaywgP2RlYnVnX3dyYXAoI3RfdHJhbnNwb3J0e21vZHVsZSA9IE1vZHVsZSwgc3RhdGUgPSBTdGF0ZX0pfS4KKworCistaW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCisKKworcmVhZChUcmFuc3BvcnQgPSAjdF90cmFuc3BvcnR7bW9kdWxlID0gTW9kdWxlfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIHtOZXdTdGF0ZSwgUmVzdWx0fSA9IE1vZHVsZTpyZWFkKFRyYW5zcG9ydCN0X3RyYW5zcG9ydC5zdGF0ZSwgTGVuKSwKKyAge1RyYW5zcG9ydCN0X3RyYW5zcG9ydHtzdGF0ZSA9IE5ld1N0YXRlfSwgUmVzdWx0fS4KKworCityZWFkX2V4YWN0KFRyYW5zcG9ydCA9ICN0X3RyYW5zcG9ydHttb2R1bGUgPSBNb2R1bGV9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgY2FzZSBsaXN0czprZXlmaW5kKHJlYWRfZXhhY3QsIDEsIE1vZHVsZTptb2R1bGVfaW5mbyhleHBvcnRzKSkgb2YKKyAgICB7cmVhZF9leGFjdCwgMn0gLT4KKyAgICAgIHtOZXdTdGF0ZSwgUmVzdWx0fSA9IE1vZHVsZTpyZWFkX2V4YWN0KFRyYW5zcG9ydCN0X3RyYW5zcG9ydC5zdGF0ZSwgTGVuKSwKKyAgICAgIHtUcmFuc3BvcnQjdF90cmFuc3BvcnR7c3RhdGUgPSBOZXdTdGF0ZX0sIFJlc3VsdH07CisgICAgXyAtPgorICAgICAgcmVhZChUcmFuc3BvcnQsIExlbikKKyAgZW5kLgorCisKK3dyaXRlKFRyYW5zcG9ydCA9ICN0X3RyYW5zcG9ydHttb2R1bGUgPSBNb2R1bGV9LCBEYXRhKSAtPgorICB7TmV3U3RhdGUsIFJlc3VsdH0gPSBNb2R1bGU6d3JpdGUoVHJhbnNwb3J0I3RfdHJhbnNwb3J0LnN0YXRlLCBEYXRhKSwKKyAge1RyYW5zcG9ydCN0X3RyYW5zcG9ydHtzdGF0ZSA9IE5ld1N0YXRlfSwgUmVzdWx0fS4KKworCitmbHVzaChUcmFuc3BvcnQgPSAjdF90cmFuc3BvcnR7bW9kdWxlID0gTW9kdWxlfSkgLT4KKyAge05ld1N0YXRlLCBSZXN1bHR9ID0gTW9kdWxlOmZsdXNoKFRyYW5zcG9ydCN0X3RyYW5zcG9ydC5zdGF0ZSksCisgIHtUcmFuc3BvcnQjdF90cmFuc3BvcnR7c3RhdGUgPSBOZXdTdGF0ZX0sIFJlc3VsdH0uCisKKworY2xvc2UoVHJhbnNwb3J0ID0gI3RfdHJhbnNwb3J0e21vZHVsZSA9IE1vZHVsZX0pIC0+CisgIHtOZXdTdGF0ZSwgUmVzdWx0fSA9IE1vZHVsZTpjbG9zZShUcmFuc3BvcnQjdF90cmFuc3BvcnQuc3RhdGUpLAorICB7VHJhbnNwb3J0I3RfdHJhbnNwb3J0e3N0YXRlID0gTmV3U3RhdGV9LCBSZXN1bHR9LgorCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvVGhyaWZ0MTQ3NS50aHJpZnQgYi9saWIvZXJsL3Rlc3QvVGhyaWZ0MTQ3NS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FkZWI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC9UaHJpZnQxNDc1LnRocmlmdApAQCAtMCwwICsxLDM0IEBACitzdHJ1Y3QgU3RydWN0QgoreworICAxOiBzdHJpbmcgeAorfQorCitzdHJ1Y3QgU3RydWN0QQoreworICAxOiBzdHJpbmcgYSwKKyAgMjogYmluYXJ5IGIsCisgIDM6IG9wdGlvbmFsIHN0cmluZyBjLAorICA0OiBvcHRpb25hbCBiaW5hcnkgZCwKKyAgNTogcmVxdWlyZWQgc3RyaW5nIGUsCisgIDY6IHJlcXVpcmVkIGJpbmFyeSBmLAorICA3OiBzdHJpbmcgZyA9ICJmb28iLAorICA4OiBpMzIgaCwKKyAgOTogb3B0aW9uYWwgaTMyIGksCisgIDEwOiByZXF1aXJlZCBpMzIgaiwKKyAgMTE6IHJlcXVpcmVkIGkzMiBrID0gNSwKKyAgMTI6IGRvdWJsZSBsLAorICAxMzogb3B0aW9uYWwgZG91YmxlIG0sCisgIDE0OiByZXF1aXJlZCBkb3VibGUgbiwKKyAgMTU6IGRvdWJsZSBvID0gMy4xNDE1OSwKKyAgMTY6IGxpc3Q8c3RyaW5nPiBzdHJpbmdfbGlzdCwKKyAgMTc6IGxpc3Q8Ynl0ZT4gYnl0ZV9saXN0ID0gWzEsIDIsIDNdLAorICAxODogcmVxdWlyZWQgbGlzdDxzdHJpbmc+IHJzbCwKKyAgMTk6IG9wdGlvbmFsIGxpc3Q8c3RyaW5nPiBvc2wsCisgIDIwOiBzZXQ8c3RyaW5nPiBzdHJpbmdfc2V0LAorICAyMTogcmVxdWlyZWQgc2V0PHN0cmluZz4gcnNzLAorICAyMjogb3B0aW9uYWwgc2V0PHN0cmluZz4gb3NzLAorICAyMzogbWFwPHN0cmluZywgc3RyaW5nPiBzdHJpbmdfbWFwLAorICAyNDogcmVxdWlyZWQgbWFwPHN0cmluZywgc3RyaW5nPiByc20sCisgIDI1OiBvcHRpb25hbCBtYXA8c3RyaW5nLCBzdHJpbmc+IG9zbSwKKyAgMjY6IFN0cnVjdEIgc3RydWN0YgorfQpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L1RocmlmdF9vbWl0X3dpdGgudGhyaWZ0IGIvbGliL2VybC90ZXN0L1RocmlmdF9vbWl0X3dpdGgudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZmZjN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvVGhyaWZ0X29taXRfd2l0aC50aHJpZnQKQEAgLTAsMCArMSwyMiBAQAorc3RydWN0IHRlc3QxIHsKKyAgMTogaTMyIG9uZQorICAyOiBpMzIgdHdvICAgICAgICAgICAgICAgICAgICAvLyBvbWl0CisgIDM6IGkzMiB0aHJlZQorfQorCitzdHJ1Y3QgdGVzdDIgeworICAxOiBpMzIgb25lCisgIDI6IHRlc3QyIHR3byAgICAgICAgICAgICAgICAgIC8vIG9taXQKKyAgMzogaTMyIHRocmVlCit9CisKK3N0cnVjdCB0ZXN0MyB7CisgIDE6IGkzMiBvbmUKKyAgMjogbGlzdDx0ZXN0MT4gdHdvICAgICAgICAgICAgLy8gb21pdAorfQorCitzdHJ1Y3QgdGVzdDQgeworICAxOiBpMzIgb25lCisgIDI6IG1hcDxpMzIsdGVzdDE+IHR3byAgICAgICAgIC8vIG9taXQKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L2ZsYWdzL0xlZ2FjeU5hbWVzLnRocmlmdCBiL2xpYi9lcmwvdGVzdC9mbGFncy9MZWdhY3lOYW1lcy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhmMjcyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC9mbGFncy9MZWdhY3lOYW1lcy50aHJpZnQKQEAgLTAsMCArMSwzMyBAQAorZW51bSBOdW1iZXJ6Cit7CisgIE9ORSA9IDEsCisgIFRXTywKKyAgVEhSRUUsCisgIEZJVkUgPSA1LAorICBTSVgsCisgIEVJR0hUID0gOAorfQorCitjb25zdCBOdW1iZXJ6IG15TnVtYmVyeiA9IE51bWJlcnouT05FOworCitzdHJ1Y3QgQ2FwaXRhbGl6ZWRTdHJ1Y3QKK3sKKyAgMTogaTMyIElkLAorICAyOiBiaW5hcnkgbWVzc2FnZQorfQorCitzdHJ1Y3QgTGlzdENhcGl0YWxpemVkU3RydWN0cworeworICAxOiBsaXN0PENhcGl0YWxpemVkU3RydWN0PiBzdHJ1Y3RzCit9CisKK2V4Y2VwdGlvbiBYY2VwdGlvbiB7CisgIDE6IGkzMiBlcnJvckNvZGUsCisgIDI6IGJpbmFyeSBtZXNzYWdlCit9CisKK3NlcnZpY2UgTGVnYWN5TmFtZXMKK3sKKyAgTGlzdENhcGl0YWxpemVkU3RydWN0cyBOYW1lcygxOiBDYXBpdGFsaXplZFN0cnVjdCBmb28sIDI6IENhcGl0YWxpemVkU3RydWN0IGJhcikKKyAgICB0aHJvd3MoMTogWGNlcHRpb24gZXJyKQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC9mbGFncy9UaHJpZnQzMjE0LnRocmlmdCBiL2xpYi9lcmwvdGVzdC9mbGFncy9UaHJpZnQzMjE0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTExMGNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L2ZsYWdzL1RocmlmdDMyMTQudGhyaWZ0CkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworc3RydWN0IFN0cmluZ01hcAoreworICAxOiBtYXA8aTMyLCBzdHJpbmc+IGRhdGEgPSB7MTogImEiLCAyOiAiYiJ9OworfQpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L2xlZ2FjeV9uYW1lc190ZXN0LmVybCBiL2xpYi9lcmwvdGVzdC9sZWdhY3lfbmFtZXNfdGVzdC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE2YWEzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC9sZWdhY3lfbmFtZXNfdGVzdC5lcmwKQEAgLTAsMCArMSw2OSBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUobGVnYWN5X25hbWVzX3Rlc3QpLgorLWNvbXBpbGUoZXhwb3J0X2FsbCkuCisKKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworLWluY2x1ZGUoImdlbi1lcmwvbGVnYWN5TmFtZXNfY29uc3RhbnRzLmhybCIpLgorCityZWNvcmRfZ2VuZXJhdGlvbl90ZXN0XygpIC0+CisgIFsKKyAgICB7ImNhcGl0YWxpemVkU3RydWN0IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Y2FwaXRhbGl6ZWRTdHJ1Y3QsIF8sIF99LAorICAgICAgI2NhcGl0YWxpemVkU3RydWN0e2lkPW51bGwsbWVzc2FnZT1udWxsfQorICAgICl9CisgIF0uCisKK3N0cnVjdF9pbmZvX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiY2FwaXRhbGl6ZWRTdHJ1Y3QgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGkzMiwgJ2lkJywgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgc3RyaW5nLCAnbWVzc2FnZScsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbGVnYWN5TmFtZXNfdHlwZXM6c3RydWN0X2luZm9fZXh0KGNhcGl0YWxpemVkU3RydWN0KQorICAgICl9LAorICAgIHsibGlzdENhcGl0YWxpemVkU3RydWN0cyBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtzdHJ1Y3QsIHsnbGVnYWN5TmFtZXNfdHlwZXMnLCAnY2FwaXRhbGl6ZWRTdHJ1Y3QnfX19LCAnc3RydWN0cycsIFtdfQorICAgICAgXX0sCisgICAgICBsZWdhY3lOYW1lc190eXBlczpzdHJ1Y3RfaW5mb19leHQobGlzdENhcGl0YWxpemVkU3RydWN0cykKKyAgICApfQorICBdLgorCitzZXJ2aWNlX2luZm9fdGVzdF8oKSAtPgorICBbCisgICAgeyJuYW1lcyBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge3N0cnVjdCwgeydsZWdhY3lOYW1lc190eXBlcycsICdjYXBpdGFsaXplZFN0cnVjdCd9fX0sCisgICAgICAgIHsyLCB7c3RydWN0LCB7J2xlZ2FjeU5hbWVzX3R5cGVzJywgJ2NhcGl0YWxpemVkU3RydWN0J319fQorICAgICAgXX0sCisgICAgICBsZWdhY3lOYW1lc190aHJpZnQ6ZnVuY3Rpb25faW5mbyhuYW1lcywgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJuYW1lcyByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCB7J2xlZ2FjeU5hbWVzX3R5cGVzJywgJ2xpc3RDYXBpdGFsaXplZFN0cnVjdHMnfX0sCisgICAgICBsZWdhY3lOYW1lc190aHJpZnQ6ZnVuY3Rpb25faW5mbyhuYW1lcywgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7Im5hbWVzIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCB7c3RydWN0LCB7J2xlZ2FjeU5hbWVzX3R5cGVzJywgJ3hjZXB0aW9uJ319fV19LAorICAgICAgbGVnYWN5TmFtZXNfdGhyaWZ0OmZ1bmN0aW9uX2luZm8obmFtZXMsIGV4Y2VwdGlvbnMpCisgICAgKX0KKyAgXS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC9tdWx0aXBsZXhpbmcudGhyaWZ0IGIvbGliL2VybC90ZXN0L211bHRpcGxleGluZy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3OTk0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC9tdWx0aXBsZXhpbmcudGhyaWZ0CkBAIC0wLDAgKzEsNyBAQAorc2VydmljZSBNdWx0aXBsZXhpbmdfQ2FsY3VsYXRvciB7CisgICAgaTMyIGFkZCgxOiBpMzIgeCwgMjogaTMyIHkpCit9CisKK3NlcnZpY2UgTXVsdGlwbGV4aW5nX1dlYXRoZXJSZXBvcnQgeworICAgIGRvdWJsZSBnZXRUZW1wZXJhdHVyZSgpCit9CmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvbXVsdGlwbGV4aW5nX3Rlc3QuZXJsIGIvbGliL2VybC90ZXN0L211bHRpcGxleGluZ190ZXN0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjJkNjE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L211bHRpcGxleGluZ190ZXN0LmVybApAQCAtMCwwICsxLDU3IEBACistbW9kdWxlKG11bHRpcGxleGluZ190ZXN0KS4KKworLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCistZXhwb3J0KFsKKyAgICAgaGFuZGxlX2Z1bmN0aW9uLzIKKyAgICAsaGFuZGxlX2Vycm9yLzIKK10pLgorCitzdGFydF9tdWx0aXBsZXhlZF9zZXJ2ZXJfdGVzdCgpIC0+CisKKyAgICBQb3J0ID0gOTA5MCwKKyAgICBTZXJ2aWNlcyA9IFsKKyAgICAgICAgICAgICAgICB7Ik11bHRpcGxleGluZ19DYWxjdWxhdG9yIiwgICAgbXVsdGlwbGV4aW5nX19jYWxjdWxhdG9yX3RocmlmdH0sCisgICAgICAgICAgICAgICAgeyJNdWx0aXBsZXhpbmdfV2VhdGhlclJlcG9ydCIsIG11bHRpcGxleGluZ19fd2VhdGhlcl9yZXBvcnRfdGhyaWZ0fQorICAgICAgICAgICAgICAgXSwKKworICAgIHtvaywgUGlkfSA9IHRocmlmdF9zb2NrZXRfc2VydmVyOnN0YXJ0KFsKKyAgICAgICAge2lwLCAiMTI3LjAuMC4xIn0sCisgICAgICAgIHtwb3J0LCBQb3J0fSwKKyAgICAgICAge25hbWUsID9NT0RVTEV9LAorICAgICAgICB7c2VydmljZSwgU2VydmljZXN9LAorICAgICAgICB7aGFuZGxlciwgWworICAgICAgICAgICAgeyJlcnJvcl9oYW5kbGVyIiwgICAgICAgICAgICAgID9NT0RVTEV9LAorICAgICAgICAgICAgeyJNdWx0aXBsZXhpbmdfQ2FsY3VsYXRvciIsICAgID9NT0RVTEV9LAorICAgICAgICAgICAgeyJNdWx0aXBsZXhpbmdfV2VhdGhlclJlcG9ydCIsID9NT0RVTEV9CisgICAgICAgIF19CisgICAgIF0pLAorCisgICAge29rLCBbeyJNdWx0aXBsZXhpbmdfQ2FsY3VsYXRvciIsIENhbGN1bGF0b3JDbGllbnQwfSwKKyAgICAgICAgICB7Ik11bHRpcGxleGluZ19XZWF0aGVyUmVwb3J0IiwgV2VhdGhlclJlcG9ydENsaWVudDB9XX0gPSB0aHJpZnRfY2xpZW50X3V0aWw6bmV3X211bHRpcGxleGVkKCIxMjcuMC4wLjEiLCBQb3J0LCBTZXJ2aWNlcywgW10pLAorCisgICAgP2Fzc2VydE1hdGNoKHtfLCB7ZXJyb3IsIHtiYWRfYXJncywgXywgX319fSwgdGhyaWZ0X2NsaWVudDpjYWxsKFdlYXRoZXJSZXBvcnRDbGllbnQwLCBnZXRUZW1wZXJhdHVyZSwgWzFdKSksCisgICAgP2Fzc2VydE1hdGNoKHtfLCB7ZXJyb3IsIHtiYWRfYXJncywgXywgX319fSwgdGhyaWZ0X2NsaWVudDpjYWxsKENhbGN1bGF0b3JDbGllbnQwLCBhZGQsIFsxXSkpLAorICAgID9hc3NlcnRNYXRjaCh7Xywge2Vycm9yLCB7YmFkX2FyZ3MsIF8sIF99fX0sIHRocmlmdF9jbGllbnQ6Y2FsbChDYWxjdWxhdG9yQ2xpZW50MCwgYWRkLCBbMSwxLDFdKSksCisKKyAgICA/YXNzZXJ0TWF0Y2goe18sIHtlcnJvciwge25vX2Z1bmN0aW9uLCBffX19LCB0aHJpZnRfY2xpZW50OmNhbGwoQ2FsY3VsYXRvckNsaWVudDAsIGdldFRlbXBlcmF0dXJlLCBbXSkpLAorICAgID9hc3NlcnRNYXRjaCh7Xywge2Vycm9yLCB7bm9fZnVuY3Rpb24sIF99fX0sIHRocmlmdF9jbGllbnQ6Y2FsbChXZWF0aGVyUmVwb3J0Q2xpZW50MCwgYWRkLCBbNDEsIDFdKSksCisKKyAgICA/YXNzZXJ0TWF0Y2goe18sIHtvaywgNDJ9fSwgdGhyaWZ0X2NsaWVudDpjYWxsKENhbGN1bGF0b3JDbGllbnQwLCBhZGQsIFs0MSwgMV0pKSwKKyAgICA/YXNzZXJ0TWF0Y2goe18sIHtvaywgNDIuMH19LCB0aHJpZnRfY2xpZW50OmNhbGwoV2VhdGhlclJlcG9ydENsaWVudDAsIGdldFRlbXBlcmF0dXJlLCBbXSkpLAorCisgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6c3RvcChQaWQpLgorCislJSBIQU5ETEUgRlVOQ1RJT05TCisKKyUlIENhbGN1bGF0b3IgaGFuZGxlcworaGFuZGxlX2Z1bmN0aW9uKGFkZCwge1gsIFl9KSAtPgorICAgIHtyZXBseSwgWCArIFl9OworCislJSBXZWF0aGVyUmVwb3J0IGhhbmRsZXMKK2hhbmRsZV9mdW5jdGlvbihnZXRUZW1wZXJhdHVyZSwge30pIC0+CisgICAge3JlcGx5LCA0Mi4wfS4KKworaGFuZGxlX2Vycm9yKF9GLCBfUmVhc29uKSAtPgorJSUgICAgID9kZWJ1Z0hlcmUsID9kZWJ1Z1ZhbCh7X0YsIF9SZWFzb259KSwKKyAgICBvay4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvbmFtZV9jb25mbGljdF90ZXN0LmVybCBiL2xpYi9lcmwvdGVzdC9uYW1lX2NvbmZsaWN0X3Rlc3QuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMWRmNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvbmFtZV9jb25mbGljdF90ZXN0LmVybApAQCAtMCwwICsxLDI5OSBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUobmFtZV9jb25mbGljdF90ZXN0KS4KKy1jb21waWxlKGV4cG9ydF9hbGwpLgorCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKy1pbmNsdWRlKCJnZW4tZXJsL25hbWVfY29uZmxpY3RfdGVzdF9jb25zdGFudHMuaHJsIikuCisKK3JlY29yZF9nZW5lcmF0aW9uX3Rlc3RfKCkgLT4KKyAgWworICAgIHsidXNpbmcgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt1c2luZywgXywgX30sCisgICAgICAjdXNpbmd7c2luZ2xlPW51bGwsaW50ZWdlcj1udWxsfQorICAgICl9LAorICAgIHsiZGVsZWdhdGUgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtkZWxlZ2F0ZSwgXywgX30sCisgICAgICAjZGVsZWdhdGV7cGFydGlhbD1udWxsLGRlbGVnYXRlPW51bGx9CisgICAgKX0sCisgICAgeyJnZXQgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtnZXQsIF99LAorICAgICAgI2dldHtzYnl0ZT1udWxsfQorICAgICl9LAorICAgIHsicGFydGlhbCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3BhcnRpYWwsIF8sIF8sIF99LAorICAgICAgI3BhcnRpYWx7dXNpbmc9bnVsbH0KKyAgICApfSwKKyAgICB7IkNsYXNzQW5kUHJvcCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeydDbGFzc0FuZFByb3AnLCBfLCBfLCBfLCBffSwKKyAgICAgICMnQ2xhc3NBbmRQcm9wJ3sKKyAgICAgICAgJ0NsYXNzQW5kUHJvcCc9bnVsbCwKKyAgICAgICAgJ0NsYXNzQW5kUHJvcF8nPW51bGwsCisgICAgICAgICdDbGFzc0FuZFByb3BfXyc9bnVsbCwKKyAgICAgICAgJ0NsYXNzQW5kUHJvcGVyJz1udWxsCisgICAgICB9CisgICAgKX0sCisgICAgeyJzZWNvbmRfY2hhbmNlIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7c2Vjb25kX2NoYW5jZSwgXywgXywgXywgX30sCisgICAgICAjc2Vjb25kX2NoYW5jZXsKKyAgICAgICAgJ1NFQ09ORF9DSEFOQ0UnPW51bGwsCisgICAgICAgICdTRUNPTkRfQ0hBTkNFXyc9bnVsbCwKKyAgICAgICAgJ1NFQ09ORF9DSEFOQ0VfXyc9bnVsbCwKKyAgICAgICAgJ1NFQ09ORF9DSEFOQ0VTJz1udWxsCisgICAgICB9CisgICAgKX0sCisgICAgeyJOT1dfRUFUX1RISVMgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsnTk9XX0VBVF9USElTJywgXywgXywgXywgX30sCisgICAgICAjJ05PV19FQVRfVEhJUyd7CisgICAgICAgIG5vd19lYXRfdGhpcz1udWxsLAorICAgICAgICBub3dfZWF0X3RoaXNfPW51bGwsCisgICAgICAgIG5vd19lYXRfdGhpc19fPW51bGwsCisgICAgICAgIG5vd19lYXRfdGhpc19hbmRfdGhpcz1udWxsCisgICAgICB9CisgICAgKX0sCisgICAgeyJUaGVFZGdlQ2FzZSByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeydUaGVFZGdlQ2FzZScsIF8sIF8sIF8sIF8sIF8sIF99LAorICAgICAgIydUaGVFZGdlQ2FzZSd7CisgICAgICAgIHRoZUVkZ2VDYXNlPW51bGwsCisgICAgICAgIHRoZUVkZ2VDYXNlXz1udWxsLAorICAgICAgICB0aGVFZGdlQ2FzZV9fPW51bGwsCisgICAgICAgICdUaGVFZGdlQ2FzZSc9bnVsbCwKKyAgICAgICAgJ1RoZUVkZ2VDYXNlXyc9bnVsbCwKKyAgICAgICAgJ1RoZUVkZ2VDYXNlX18nPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7IlRyaWNreV8gcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsnVHJpY2t5XycsIF8sIF99LAorICAgICAgIydUcmlja3lfJ3t0cmlja3k9bnVsbCwnVHJpY2t5Jz1udWxsfQorICAgICl9LAorICAgIHsiTmVzdGVkIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J05lc3RlZCcsIF8sIF8sIF8sIF8sIF8sIF99LAorICAgICAgIydOZXN0ZWQneworICAgICAgICAnQ2xhc3NBbmRQcm9wJz1udWxsLAorICAgICAgICBzZWNvbmRfY2hhbmNlPW51bGwsCisgICAgICAgICdOT1dfRUFUX1RISVMnPW51bGwsCisgICAgICAgICdUaGVFZGdlQ2FzZSc9bnVsbCwKKyAgICAgICAgJ1RyaWNreV8nPW51bGwsCisgICAgICAgICdOZXN0ZWQnPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7IlByb2JsZW1fIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J1Byb2JsZW1fJywgXywgX30sCisgICAgICAjJ1Byb2JsZW1fJ3twcm9ibGVtPW51bGwsJ1Byb2JsZW0nPW51bGx9CisgICAgKX0KKyAgXS4KKworc3RydWN0X2luZm9fdGVzdF8oKSAtPgorICBbCisgICAgeyJ1c2luZyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgZG91YmxlfSx7MiwgZG91YmxlfV19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKHVzaW5nKQorICAgICl9LAorICAgIHsiZGVsZWdhdGUgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCBzdHJpbmd9LAorICAgICAgICB7Miwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgZGVsZWdhdGV9fX0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKGRlbGVnYXRlKQorICAgICl9LAorICAgIHsiZ2V0IGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBib29sfV19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKGdldCkKKyAgICApfSwKKyAgICB7InBhcnRpYWwgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCB1c2luZ319fSwKKyAgICAgICAgezIsIGJvb2x9LAorICAgICAgICB7MywgYm9vbH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKHBhcnRpYWwpCisgICAgKX0sCisgICAgeyJDbGFzc0FuZFByb3AgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGJvb2x9LHsyLCBib29sfSx7MywgYm9vbH0sezQsIGJvb2x9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ0NsYXNzQW5kUHJvcCcpCisgICAgKX0sCisgICAgeyJzZWNvbmRfY2hhbmNlIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBib29sfSx7MiwgYm9vbH0sezMsIGJvb2x9LHs0LCBib29sfV19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKHNlY29uZF9jaGFuY2UpCisgICAgKX0sCisgICAgeyJOT1dfRUFUX1RISVMgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGJvb2x9LHsyLCBib29sfSx7MywgYm9vbH0sezQsIGJvb2x9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ05PV19FQVRfVEhJUycpCisgICAgKX0sCisgICAgeyJUaGVFZGdlQ2FzZSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgYm9vbH0sezIsIGJvb2x9LHszLCBib29sfSx7NCwgYm9vbH0sezUsIGJvb2x9LHs2LCBib29sfV19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdUaGVFZGdlQ2FzZScpCisgICAgKX0sCisgICAgeyJUcmlja3lfIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBib29sfSx7MiwgYm9vbH1dfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnVHJpY2t5XycpCisgICAgKX0sCisgICAgeyJOZXN0ZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnQ2xhc3NBbmRQcm9wJ319fSwKKyAgICAgICAgezIsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIHNlY29uZF9jaGFuY2V9fX0sCisgICAgICAgIHszLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnTk9XX0VBVF9USElTJ319fSwKKyAgICAgICAgezQsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdUaGVFZGdlQ2FzZSd9fX0sCisgICAgICAgIHs1LCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnVHJpY2t5Xyd9fX0sCisgICAgICAgIHs2LCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnTmVzdGVkJ319fQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ05lc3RlZCcpCisgICAgKX0sCisgICAgeyJQcm9ibGVtXyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgYm9vbH0sezIsIGJvb2x9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ1Byb2JsZW1fJykKKyAgICApfSwKKyAgICB7InVzaW5nIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBkb3VibGUsIHNpbmdsZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgZG91YmxlLCBpbnRlZ2VyLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQodXNpbmcpCisgICAgKX0sCisgICAgeyJkZWxlZ2F0ZSBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgc3RyaW5nLCBwYXJ0aWFsLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCBkZWxlZ2F0ZX19LCBkZWxlZ2F0ZSwgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KGRlbGVnYXRlKQorICAgICl9LAorICAgIHsiZ2V0IGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCB1bmRlZmluZWQsIGJvb2wsIHNieXRlLCB1bmRlZmluZWR9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KGdldCkKKyAgICApfSwKKyAgICB7InBhcnRpYWwgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIHVzaW5nfX0sIHVzaW5nLCAjdXNpbmd7fX0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsIHJlYWQsIHVuZGVmaW5lZH0sCisgICAgICAgIHszLCB1bmRlZmluZWQsIGJvb2wsIHdyaXRlLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQocGFydGlhbCkKKyAgICApfSwKKyAgICB7IkNsYXNzQW5kUHJvcCBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgJ0NsYXNzQW5kUHJvcCcsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsICdDbGFzc0FuZFByb3BfJywgdW5kZWZpbmVkfSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgYm9vbCwgJ0NsYXNzQW5kUHJvcF9fJywgdW5kZWZpbmVkfSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwgYm9vbCwgJ0NsYXNzQW5kUHJvcGVyJywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdDbGFzc0FuZFByb3AnKQorICAgICl9LAorICAgIHsic2Vjb25kX2NoYW5jZSBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgJ1NFQ09ORF9DSEFOQ0UnLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCAnU0VDT05EX0NIQU5DRV8nLCB1bmRlZmluZWR9LAorICAgICAgICB7MywgdW5kZWZpbmVkLCBib29sLCAnU0VDT05EX0NIQU5DRV9fJywgdW5kZWZpbmVkfSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwgYm9vbCwgJ1NFQ09ORF9DSEFOQ0VTJywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KHNlY29uZF9jaGFuY2UpCisgICAgKX0sCisgICAgeyJOT1dfRUFUX1RISVMgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGJvb2wsIG5vd19lYXRfdGhpcywgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgbm93X2VhdF90aGlzXywgdW5kZWZpbmVkfSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgYm9vbCwgbm93X2VhdF90aGlzX18sIHVuZGVmaW5lZH0sCisgICAgICAgIHs0LCB1bmRlZmluZWQsIGJvb2wsIG5vd19lYXRfdGhpc19hbmRfdGhpcywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdOT1dfRUFUX1RISVMnKQorICAgICl9LAorICAgIHsiVGhlRWRnZUNhc2UgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGJvb2wsIHRoZUVkZ2VDYXNlLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCB0aGVFZGdlQ2FzZV8sIHVuZGVmaW5lZH0sCisgICAgICAgIHszLCB1bmRlZmluZWQsIGJvb2wsIHRoZUVkZ2VDYXNlX18sIHVuZGVmaW5lZH0sCisgICAgICAgIHs0LCB1bmRlZmluZWQsIGJvb2wsICdUaGVFZGdlQ2FzZScsIHVuZGVmaW5lZH0sCisgICAgICAgIHs1LCB1bmRlZmluZWQsIGJvb2wsICdUaGVFZGdlQ2FzZV8nLCB1bmRlZmluZWR9LAorICAgICAgICB7NiwgdW5kZWZpbmVkLCBib29sLCAnVGhlRWRnZUNhc2VfXycsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnVGhlRWRnZUNhc2UnKQorICAgICl9LAorICAgIHsiVHJpY2t5XyBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgdHJpY2t5LCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCAnVHJpY2t5JywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdUcmlja3lfJykKKyAgICApfSwKKyAgICB7Ik5lc3RlZCBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge3N0cnVjdCwgeworICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKKyAgICAgICAgICAnQ2xhc3NBbmRQcm9wJworICAgICAgICB9fSwgJ0NsYXNzQW5kUHJvcCcsICMnQ2xhc3NBbmRQcm9wJ3t9fSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwge3N0cnVjdCwgeworICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKKyAgICAgICAgICBzZWNvbmRfY2hhbmNlCisgICAgICAgIH19LCBzZWNvbmRfY2hhbmNlLCAjc2Vjb25kX2NoYW5jZXt9fSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwge3N0cnVjdCwgeworICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKKyAgICAgICAgICAnTk9XX0VBVF9USElTJworICAgICAgICB9fSwgJ05PV19FQVRfVEhJUycsICMnTk9XX0VBVF9USElTJ3t9fSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwge3N0cnVjdCwgeworICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKKyAgICAgICAgICAnVGhlRWRnZUNhc2UnCisgICAgICAgIH19LCAnVGhlRWRnZUNhc2UnLCAjJ1RoZUVkZ2VDYXNlJ3t9fSwKKyAgICAgICAgezUsIHVuZGVmaW5lZCwge3N0cnVjdCwgeworICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKKyAgICAgICAgICAnVHJpY2t5XycKKyAgICAgICAgfX0sICdUcmlja3lfJywgIydUcmlja3lfJ3t9fSwKKyAgICAgICAgezYsIHVuZGVmaW5lZCwge3N0cnVjdCwgeworICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKKyAgICAgICAgICAnTmVzdGVkJworICAgICAgICB9fSwgJ05lc3RlZCcsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnTmVzdGVkJykKKyAgICApfSwKKyAgICB7IlByb2JsZW1fIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCBwcm9ibGVtLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCAnUHJvYmxlbScsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnUHJvYmxlbV8nKQorICAgICl9CisgIF0uCisKK3NlcnZpY2VfaW5mb190ZXN0XygpIC0+CisgIFsKKyAgICB7ImV2ZW50IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIHBhcnRpYWx9fX1dfSwKKyAgICAgIGV4dGVybl90aHJpZnQ6ZnVuY3Rpb25faW5mbyhldmVudCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJldmVudCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCBkZWxlZ2F0ZX19LAorICAgICAgZXh0ZXJuX3RocmlmdDpmdW5jdGlvbl9pbmZvKGV2ZW50LCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsiZXZlbnQgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICBleHRlcm5fdGhyaWZ0OmZ1bmN0aW9uX2luZm8oZXZlbnQsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJGb28gcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgJ05lc3RlZCd9fX1dfSwKKyAgICAgIGV4dGVybl90aHJpZnQ6ZnVuY3Rpb25faW5mbygnRm9vJywgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJGb28gcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgZXh0ZXJuX3RocmlmdDpmdW5jdGlvbl9pbmZvKCdGb28nLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsiRm9vIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnUHJvYmxlbV8nfX19XX0sCisgICAgICBleHRlcm5fdGhyaWZ0OmZ1bmN0aW9uX2luZm8oJ0ZvbycsIGV4Y2VwdGlvbnMpCisgICAgKX0KKyAgXS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X2NsaWVudC5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF9jbGllbnQuZXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWY1OTZkLi4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvdGVzdC90ZXN0X2NsaWVudC5lcmwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotJSUKLSUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0lJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0lJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0lJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0lJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSUlCi0lJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotJSUKLSUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0lJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0lJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0lJSB1bmRlciB0aGUgTGljZW5zZS4KLSUlCi0KLS1tb2R1bGUodGVzdF9jbGllbnQpLgotCi0tZXhwb3J0KFtzdGFydC8wLCBzdGFydC8xXSkuCi0KLS1pbmNsdWRlKCJ0aHJpZnRUZXN0X3R5cGVzLmhybCIpLgotCi0tcmVjb3JkKG9wdGlvbnMsIHtwb3J0ID0gOTA5MCwKLSAgICAgICAgICAgICAgICAgIGNsaWVudF9vcHRzID0gW119KS4KLQotcGFyc2VfYXJncyhBcmdzKSAtPiBwYXJzZV9hcmdzKEFyZ3MsICNvcHRpb25ze30pLgotcGFyc2VfYXJncyhbXSwgT3B0cykgLT4gT3B0czsKLXBhcnNlX2FyZ3MoW0hlYWQgfCBSZXN0XSwgT3B0cykgLT4KLSAgICBOZXdPcHRzID0KLSAgICAgICAgY2FzZSBjYXRjaCBsaXN0X3RvX2ludGVnZXIoSGVhZCkgb2YKLSAgICAgICAgICAgIFBvcnQgd2hlbiBpc19pbnRlZ2VyKFBvcnQpIC0+Ci0gICAgICAgICAgICAgICAgT3B0cyNvcHRpb25ze3BvcnQgPSBQb3J0fTsKLSAgICAgICAgICAgIF9FbHNlIC0+Ci0gICAgICAgICAgICAgICAgY2FzZSBIZWFkIG9mCi0gICAgICAgICAgICAgICAgICAgICJmcmFtZWQiIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7Y2xpZW50X29wdHMgPSBbe2ZyYW1lZCwgdHJ1ZX0gfCBPcHRzI29wdGlvbnMuY2xpZW50X29wdHNdfTsKLSAgICAgICAgICAgICAgICAgICAgIiIgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIE9wdHM7Ci0gICAgICAgICAgICAgICAgICAgIF9FbHNlIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcmxhbmc6ZXJyb3Ioe2JhZF9hcmcsIEhlYWR9KQotICAgICAgICAgICAgICAgIGVuZAotICAgICAgICBlbmQsCi0gICAgcGFyc2VfYXJncyhSZXN0LCBOZXdPcHRzKS4KLQotCi1zdGFydCgpIC0+IHN0YXJ0KFtdKS4KLXN0YXJ0KEFyZ3MpIC0+Ci0gICNvcHRpb25ze3BvcnQgPSBQb3J0LCBjbGllbnRfb3B0cyA9IENsaWVudE9wdHN9ID0gcGFyc2VfYXJncyhBcmdzKSwKLSAge29rLCBDbGllbnQwfSA9IHRocmlmdF9jbGllbnRfdXRpbDpuZXcoCi0gICAgIjEyNy4wLjAuMSIsIFBvcnQsIHRocmlmdFRlc3RfdGhyaWZ0LCBDbGllbnRPcHRzKSwKLQotICBEZW1vWHRydWN0ID0gI3h0cnVjdHsKLSAgICBzdHJpbmdfdGhpbmcgPSA8PCJaZXJvIj4+LAotICAgIGJ5dGVfdGhpbmcgPSAxLAotICAgIGkzMl90aGluZyA9IDkxMjgzNjEsCi0gICAgaTY0X3RoaW5nID0gOTIyMzM3MjAzNjg1NDc3NTgwN30sCi0KLSAgRGVtb05lc3QgPSAjeHRydWN0MnsKLSAgICBieXRlX3RoaW5nID0gNywKLSAgICBzdHJ1Y3RfdGhpbmcgPSBEZW1vWHRydWN0LAotICAgICUgTm90ZSB0aGF0IHdlIGRvbid0IHNldCBpMzJfdGhpbmcsIGl0IHdpbGwgY29tZSBiYWNrIGFzIHVuZGVmaW5lZAotICAgICUgZnJvbSB0aGUgUHl0aG9uIHNlcnZlciwgYnV0IDAgZnJvbSB0aGUgQysrIHNlcnZlciwgc2luY2UgaXQgaXMgbm90Ci0gICAgJSBvcHRpb25hbAotICAgIGkzMl90aGluZyA9IDJ9LAotCi0gICUgSXMgaXQgc2FmZSB0byBtYXRjaCB0aGVzZSB0aGluZ3M/Ci0gIERlbW9EaWN0ID0gZGljdDpmcm9tX2xpc3QoWyB7S2V5LCBLZXktMTB9IHx8IEtleSA8LSBsaXN0czpzZXEoMCwxMCkgXSksCi0gIERlbW9TZXQgPSBzZXRzOmZyb21fbGlzdChbIEtleSB8fCBLZXkgPC0gbGlzdHM6c2VxKC0zLDMpIF0pLAotCi0gICVEZW1vSW5zYW5lID0gI2luc2FuaXR5ewotICAlICB1c2VyTWFwID0gZGljdDpmcm9tX2xpc3QoW3s/dGhyaWZ0VGVzdF9GSVZFLCA1MDAwfV0pLAotICAlICB4dHJ1Y3RzID0gWyN4dHJ1Y3R7IHN0cmluZ190aGluZyA9IDw8IlRydWNrIj4+LCBieXRlX3RoaW5nID0gOCwgaTMyX3RoaW5nID0gOCwgaTY0X3RoaW5nID0gOH1dfSwKLQotICB7Q2xpZW50MDEsIHtvaywgb2t9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwLCB0ZXN0Vm9pZCwgW10pLAotCi0gIHtDbGllbnQwMiwge29rLCA8PCJUZXN0Ij4+fX0gICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwMSwgdGVzdFN0cmluZywgWyJUZXN0Il0pLAotICB7Q2xpZW50MDMsIHtvaywgPDwiVGVzdCI+Pn19ICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDIsIHRlc3RTdHJpbmcsIFs8PCJUZXN0Ij4+XSksCi0gIHtDbGllbnQwNCwge29rLCA2M319ICAgICAgICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwMywgdGVzdEJ5dGUsIFs2M10pLAotICB7Q2xpZW50MDUsIHtvaywgLTF9fSAgICAgICAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDQsIHRlc3RJMzIsIFstMV0pLAotICB7Q2xpZW50MDYsIHtvaywgMH19ICAgICAgICAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDUsIHRlc3RJMzIsIFswXSksCi0gIHtDbGllbnQwNywge29rLCAtMzQzNTk3MzgzNjh9fSAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwNiwgdGVzdEk2NCwgWy0zNDM1OTczODM2OF0pLAotICB7Q2xpZW50MDgsIHtvaywgLTUuMjA5ODUyM319ICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDcsIHRlc3REb3VibGUsIFstNS4yMDk4NTIzXSksCi0gIHtDbGllbnQwOSwge29rLCBEZW1vWHRydWN0fX0gICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwOCwgdGVzdFN0cnVjdCwgW0RlbW9YdHJ1Y3RdKSwKLSAge0NsaWVudDEwLCB7b2ssIERlbW9OZXN0fX0gICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA5LCB0ZXN0TmVzdCwgW0RlbW9OZXN0XSksCi0gIHtDbGllbnQxMSwge29rLCBEZW1vRGljdH19ICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxMCwgdGVzdE1hcCwgW0RlbW9EaWN0XSksCi0gIHtDbGllbnQxMiwge29rLCBEZW1vU2V0fX0gICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxMSwgdGVzdFNldCwgW0RlbW9TZXRdKSwKLSAge0NsaWVudDEzLCB7b2ssIFstMSwyLDNdfX0gICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDEyLCB0ZXN0TGlzdCwgW1stMSwyLDNdXSksCi0gIHtDbGllbnQxNCwge29rLCAxfX0gICAgICAgICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxMywgdGVzdEVudW0sIFs/dGhyaWZ0VGVzdF9OdW1iZXJ6X09ORV0pLAotICB7Q2xpZW50MTUsIHtvaywgMzA5ODU4MjM1MDgyNTIzfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTQsIHRlc3RUeXBlZGVmLCBbMzA5ODU4MjM1MDgyNTIzXSksCi0KLSAgJSBObyBweXRob24gaW1wbGVtZW50YXRpb24sIGJ1dCB3b3JrcyB3aXRoIEMrKyBhbmQgRXJsYW5nLgotICAle0NsaWVudDE2LCB7b2ssIEluc2FuZVJlc3VsdH19ICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDE1LCB0ZXN0SW5zYW5pdHksIFtEZW1vSW5zYW5lXSksCi0gICVpbzpmb3JtYXQoIn5wfm4iLCBbSW5zYW5lUmVzdWx0XSksCi0gIENsaWVudDE2ID0gQ2xpZW50MTUsCi0KLSAge0NsaWVudDE3LCB7b2ssICN4dHJ1Y3R7c3RyaW5nX3RoaW5nID0gPDwiTWVzc2FnZSI+Pn19fSA9Ci0gICAgdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDE2LCB0ZXN0TXVsdGlFeGNlcHRpb24sIFsiU2FmZSIsICJNZXNzYWdlIl0pLAotCi0gIENsaWVudDE4ID0KLSAgICB0cnkKLSAgICAgIHtDbGllbnRTMSwgUmVzdWx0MX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTcsIHRlc3RNdWx0aUV4Y2VwdGlvbiwgWyJYY2VwdGlvbiIsICJNZXNzYWdlIl0pLAotICAgICAgaW86Zm9ybWF0KCJVbmV4cGVjdGVkIHJldHVybiEgfnB+biIsIFtSZXN1bHQxXSksCi0gICAgICBDbGllbnRTMQotICAgIGNhdGNoCi0gICAgICB0aHJvdzp7Q2xpZW50UzIsIHtleGNlcHRpb24sIEV4blMxID0gI3hjZXB0aW9ue319fSAtPgotICAgICAgICAjeGNlcHRpb257ZXJyb3JDb2RlID0gMTAwMSwgbWVzc2FnZSA9IDw8IlRoaXMgaXMgYW4gWGNlcHRpb24iPj59ID0gRXhuUzEsCi0gICAgICAgIENsaWVudFMyOwotICAgICAgdGhyb3c6e0NsaWVudFMyLCB7ZXhjZXB0aW9uLCBfRXhuUzEgPSAjeGNlcHRpb24ye319fSAtPgotICAgICAgICBpbzpmb3JtYXQoIldyb25nIGV4Y2VwdGlvbiB0eXBlIX5uIiwgW10pLAotICAgICAgICBDbGllbnRTMgotICAgIGVuZCwKLQotICBDbGllbnQxOSA9Ci0gICAgdHJ5Ci0gICAgICB7Q2xpZW50UzMsIFJlc3VsdDJ9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDE4LCB0ZXN0TXVsdGlFeGNlcHRpb24sIFsiWGNlcHRpb24yIiwgIk1lc3NhZ2UiXSksCi0gICAgICBpbzpmb3JtYXQoIlVuZXhwZWN0ZWQgcmV0dXJuISB+cH5uIiwgW1Jlc3VsdDJdKSwKLSAgICAgIENsaWVudFMzCi0gICAgY2F0Y2gKLSAgICAgIHRocm93OntDbGllbnRTNCwge2V4Y2VwdGlvbiwgX0V4blMyID0gI3hjZXB0aW9ue319fSAtPgotICAgICAgICBpbzpmb3JtYXQoIldyb25nIGV4Y2VwdGlvbiB0eXBlIX5uIiwgW10pLAotICAgICAgICBDbGllbnRTNDsKLSAgICAgIHRocm93OntDbGllbnRTNCwge2V4Y2VwdGlvbiwgRXhuUzIgPSAjeGNlcHRpb24ye319fSAtPgotICAgICAgICAjeGNlcHRpb24ye2Vycm9yQ29kZSA9IDIwMDIsCi0gICAgICAgICAgICAgICAgICAgc3RydWN0X3RoaW5nID0gI3h0cnVjdHsKLSAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190aGluZyA9IDw8IlRoaXMgaXMgYW4gWGNlcHRpb24yIj4+fX0gPSBFeG5TMiwKLSAgICAgICAgQ2xpZW50UzQKLSAgICBlbmQsCi0KLSAgdGhyaWZ0X2NsaWVudDpjbG9zZShDbGllbnQxOSkuCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF9jb25zdC5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF9jb25zdC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI3Nzc3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X2NvbnN0LmVybApAQCAtMCwwICsxLDU0IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X2NvbnN0KS4KKworLWlmZGVmKFRFU1QpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCistaW5jbHVkZSgiZ2VuLWVybC9jb25zdGFudHNfZGVtb190eXBlcy5ocmwiKS4KKworbmFtZXNwYWNlX3Rlc3QoKSAtPgorICAlJSBWZXJpZnkgdGhhdCByZWNvcmRzIHByb2R1Y2VkIGJ5IENvbnN0YW50c0RlbW8udGhyaWZ0IGhhdmUgdGhlIHJpZ2h0IG5hbWVzcGFjZS4KKyAgaW86Zm9ybWF0KHVzZXIsICJpbiBuYW1lc3BhY2VfdGVzdCgpXG4iLCBbXSksCisgIHtzdHJ1Y3QsIF99ID0gY29uc3RhbnRzX2RlbW9fdHlwZXM6c3RydWN0X2luZm8oJ2NvbnN0c190aGluZycpLAorICB7c3RydWN0LCBffSA9IGNvbnN0YW50c19kZW1vX3R5cGVzOnN0cnVjdF9pbmZvKCdjb25zdHNfQmxhaCcpLAorICBvay4KKworY29uc3RfbWFwX3Rlc3QoKSAtPgorICA/YXNzZXJ0RXF1YWwoMjMzLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX21hcCgzNTUzMikpLAorICA/YXNzZXJ0RXJyb3IoZnVuY3Rpb25fY2xhdXNlLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX21hcCgwKSksCisKKyAgP2Fzc2VydEVxdWFsKDg1MywgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAoNDM1MjMsIGRlZmF1bHQpKSwKKyAgP2Fzc2VydEVxdWFsKGRlZmF1bHQsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbWFwKDEwMTEwLCBkZWZhdWx0KSksCisKKyAgP2Fzc2VydEVxdWFsKDk4MzI1LCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX21hcDIoImxranNkZiIpKSwKKyAgP2Fzc2VydEVycm9yKGZ1bmN0aW9uX2NsYXVzZSwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAyKCJub25leGlzdCIpKSwKKworICA/YXNzZXJ0RXF1YWwoMjMzLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX21hcDIoImhlbGxvIiwgMzIxKSksCisgID9hc3NlcnRFcXVhbCgzMjEsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbWFwMigiZ29vZGJ5ZSIsIDMyMSkpLgorCitjb25zdF9saXN0X3Rlc3QoKSAtPgorICA/YXNzZXJ0RXF1YWwoMjM1OTgzNTIsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbGlzdCgyKSksCisgID9hc3NlcnRFcnJvcihmdW5jdGlvbl9jbGF1c2UsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbGlzdCgwKSksCisKKyAgP2Fzc2VydEVxdWFsKDMyNTM1MjMsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbGlzdCgzLCBkZWZhdWx0KSksCisgID9hc3NlcnRFcXVhbChkZWZhdWx0LCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX2xpc3QoMTAsIGRlZmF1bHQpKS4KKworLWVuZGlmLiAlJSBURVNUCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF9kaXNrbG9nLmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X2Rpc2tsb2cuZXJsCmluZGV4IDE3YTI3YjAuLmRjYjZmYzEgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvdGVzdC90ZXN0X2Rpc2tsb2cuZXJsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X2Rpc2tsb2cuZXJsCkBAIC0yNiwxMiArMjYsMTIgQEAKICAge29rLCBUcmFuc3BvcnRGYWN0b3J5fSA9CiAgICAgdGhyaWZ0X2Rpc2tfbG9nX3RyYW5zcG9ydDpuZXdfdHJhbnNwb3J0X2ZhY3RvcnkoCiAgICAgICB0ZXN0X2Rpc2tsb2csCi0gICAgICBbe2ZpbGUsICIvdG1wL3Rlc3RfbG9nIn0sCisgICAgICBbe2ZpbGUsICIuL3Rlc3RfbG9nIn0sCiAgICAgICAge3NpemUsIHsxMDI0KjEwMjQsIDEwfX1dKSwKICAge29rLCBQcm90b2NvbEZhY3Rvcnl9ID0KICAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ld19wcm90b2NvbF9mYWN0b3J5KCBUcmFuc3BvcnRGYWN0b3J5LCBbXSksCiAgIHtvaywgUHJvdG99ID0gUHJvdG9jb2xGYWN0b3J5KCksCi0gIHtvaywgQ2xpZW50MH0gPSB0aHJpZnRfY2xpZW50Om5ldyhQcm90bywgdGhyaWZ0VGVzdF90aHJpZnQpLAorICB7b2ssIENsaWVudDB9ID0gdGhyaWZ0X2NsaWVudDpuZXcoUHJvdG8sIHRocmlmdF90ZXN0X3RocmlmdCksCiAKICAgaW86Zm9ybWF0KCJDbGllbnQgc3RhcnRlZH5uIiksCiAKQEAgLTQ3LDYgKzQ3LDEzIEBACiAKICAge19DbGllbnQzLCBva30gPSB0aHJpZnRfY2xpZW50OmNsb3NlKENsaWVudDIpLAogICBpbzpmb3JtYXQoIkNsaWVudCBjbG9zZWR+biIpLAorICAKKyAgbGlzdHM6Zm9yZWFjaChmdW4oRmlsZSkgLT4gZmlsZTpkZWxldGUoRmlsZSkgZW5kLCBbCisgICAgIi4vdGVzdF9sb2cuMSIsCisgICAgIi4vdGVzdF9sb2cuaWR4IiwKKyAgICAiLi90ZXN0X2xvZy5zaXoiCisgIF0pLAorICBpbzpmb3JtYXQoIkNsZWFuaW5nIHVwIHRlc3QgZmlsZXN+biIpLAogCiAgIG9rLgogCkBAIC01NCw3ICs2MSw3IEBACiAgIHtvaywgVHJhbnNwb3J0RmFjdG9yeX0gPQogICAgIHRocmlmdF9kaXNrX2xvZ190cmFuc3BvcnQ6bmV3X3RyYW5zcG9ydF9mYWN0b3J5KAogICAgICAgdGVzdF9kaXNrbG9nLAotICAgICAgW3tmaWxlLCAiL3RtcC90ZXN0X2I2NF9sb2cifSwKKyAgICAgIFt7ZmlsZSwgIi4vdGVzdF9iNjRfbG9nIn0sCiAgICAgICAge3NpemUsIHsxMDI0KjEwMjQsIDEwfX1dKSwKICAge29rLCBCNjRGYWN0b3J5fSA9CiAgICAgdGhyaWZ0X2Jhc2U2NF90cmFuc3BvcnQ6bmV3X3RyYW5zcG9ydF9mYWN0b3J5KFRyYW5zcG9ydEZhY3RvcnkpLApAQCAtNjMsNyArNzAsNyBAQAogICB7b2ssIFByb3RvY29sRmFjdG9yeX0gPQogICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3X3Byb3RvY29sX2ZhY3RvcnkoQnVmRmFjdG9yeSwgW10pLAogICB7b2ssIFByb3RvfSA9IFByb3RvY29sRmFjdG9yeSgpLAotICB7b2ssIENsaWVudDB9ID0gdGhyaWZ0X2NsaWVudDpuZXcoUHJvdG8sIHRocmlmdFRlc3RfdGhyaWZ0KSwKKyAge29rLCBDbGllbnQwfSA9IHRocmlmdF9jbGllbnQ6bmV3KFByb3RvLCB0aHJpZnRfdGVzdF90aHJpZnQpLAogCiAgIGlvOmZvcm1hdCgiQ2xpZW50IHN0YXJ0ZWR+biIpLAogCkBAIC04MCw2ICs4NywxMyBAQAogICB7X0NsaWVudDMsIG9rfSA9IHRocmlmdF9jbGllbnQ6Y2xvc2UoQ2xpZW50MiksCiAgIGlvOmZvcm1hdCgiQ2xpZW50IGNsb3NlZH5uIiksCiAKKyAgbGlzdHM6Zm9yZWFjaChmdW4oRmlsZSkgLT4gZmlsZTpkZWxldGUoRmlsZSkgZW5kLCBbCisgICAgIi4vdGVzdF9iNjRfbG9nLjEiLAorICAgICIuL3Rlc3RfYjY0X2xvZy5pZHgiLAorICAgICIuL3Rlc3RfYjY0X2xvZy5zaXoiCisgIF0pLAorICBpbzpmb3JtYXQoIkNsZWFuaW5nIHVwIHRlc3QgZmlsZXN+biIpLAorCiAgIG9rLgogCiAtZW5kaWYuCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF9tZW1idWZmZXIuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfbWVtYnVmZmVyLmVybApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EwMTE0My4uMDAwMDAwMAotLS0gYS9saWIvZXJsL3Rlc3QvdGVzdF9tZW1idWZmZXIuZXJsCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLSUlCi0lJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0lJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0lJQotJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSUlCi0lJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0lJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0lJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotJSUgdW5kZXIgdGhlIExpY2Vuc2UuCi0lJQotCi0tbW9kdWxlKHRlc3RfbWVtYnVmZmVyKS4KLQotLWlmZGVmKFRFU1QpLgotLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgotCi0taW5jbHVkZSgidGhyaWZ0VGVzdF90eXBlcy5ocmwiKS4KLQotdGVzdF9kYXRhKCkgLT4KLSAgI3h0cnVjdCB7Ci0gICAgc3RyaW5nX3RoaW5nID0gPDwiZm9vYmFyIj4+LAotICAgIGJ5dGVfdGhpbmcgPSAxMjMsCi0gICAgaTMyX3RoaW5nID0gMTIzNDU2NywKLSAgICBpNjRfdGhpbmcgPSAxMjM0NTY3ODkwMAotICB9LgotCi1lbmNvZGVfZGVjb2RlXzFfdGVzdCgpIC0+Ci0gIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyOm5ldygpLAotICB7b2ssIFByb3RvY29sMH0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpLAotICBUZXN0RGF0YSA9IHRlc3RfZGF0YSgpLAotICB7UHJvdG9jb2wxLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUHJvdG9jb2wwLAotICAgIHt7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdFRlc3RfdHlwZXM6c3RydWN0X2luZm8oJ3h0cnVjdCcpKX0sCi0gICAgICBUZXN0RGF0YX0pLAotICB7X1Byb3RvY29sMiwge29rLCBSZXN1bHR9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFByb3RvY29sMSwKLSAgICB7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdFRlc3RfdHlwZXM6c3RydWN0X2luZm8oJ3h0cnVjdCcpKX0sCi0gICAgJ3h0cnVjdCcpLAotICBSZXN1bHQgPSBUZXN0RGF0YS4KLQotZW5jb2RlX2RlY29kZV8yX3Rlc3QoKSAtPgotICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcjpuZXcoKSwKLSAge29rLCBQcm90b2NvbDB9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKLSAgVGVzdERhdGEgPSB0ZXN0X2RhdGEoKSwKLSAge1Byb3RvY29sMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvY29sMCwKLSAgICB7e3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnRUZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCd4dHJ1Y3QnKSl9LAotICAgICAgVGVzdERhdGF9KSwKLSAge19Qcm90b2NvbDIsIHtvaywgUmVzdWx0fX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQcm90b2NvbDEsCi0gICAge3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnRUZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCd4dHJ1Y3QzJykpfSwKLSAgICAneHRydWN0MycpLAotCi0gIFJlc3VsdCA9ICN4dHJ1Y3Qze3N0cmluZ190aGluZyA9IFRlc3REYXRhI3h0cnVjdC5zdHJpbmdfdGhpbmcsCi0gICAgY2hhbmdlZCA9IHVuZGVmaW5lZCwKLSAgICBpMzJfdGhpbmcgPSBUZXN0RGF0YSN4dHJ1Y3QuaTMyX3RoaW5nLAotICAgIGk2NF90aGluZyA9IFRlc3REYXRhI3h0cnVjdC5pNjRfdGhpbmd9LgotCi0KLWVuY29kZV9kZWNvZGVfM190ZXN0KCkgLT4KLSAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbW9yeV9idWZmZXI6bmV3KCksCi0gIHtvaywgUHJvdG9jb2wwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCi0gIFRlc3REYXRhID0gI2Jvb2xze2ltX3RydWUgPSB0cnVlLCBpbV9mYWxzZSA9IGZhbHNlfSwKLSAge1Byb3RvY29sMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvY29sMCwKLSAgICB7e3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnRUZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdib29scycpKX0sCi0gICAgICBUZXN0RGF0YX0pLAotICB7X1Byb3RvY29sMiwge29rLCBSZXN1bHR9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFByb3RvY29sMSwKLSAgICB7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdFRlc3RfdHlwZXM6c3RydWN0X2luZm8oJ2Jvb2xzJykpfSwKLSAgICAnYm9vbHMnKSwKLQotICB0cnVlID0gVGVzdERhdGEjYm9vbHMuaW1fdHJ1ZSAgPTo9IFJlc3VsdCNib29scy5pbV90cnVlLAotICB0cnVlID0gVGVzdERhdGEjYm9vbHMuaW1fZmFsc2UgPTo9IFJlc3VsdCNib29scy5pbV9mYWxzZS4KLQotCi1lbmNvZGVfZGVjb2RlXzRfdGVzdCgpIC0+Ci0gIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyOm5ldygpLAotICB7b2ssIFByb3RvY29sMH0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpLAotICBUZXN0RGF0YSA9ICNpbnNhbml0eXt4dHJ1Y3RzPVtdfSwKLSAge1Byb3RvY29sMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvY29sMCwKLSAgICB7e3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnRUZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdpbnNhbml0eScpKX0sCi0gICAgICBUZXN0RGF0YX0pLAotICB7X1Byb3RvY29sMiwge29rLCBSZXN1bHR9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFByb3RvY29sMSwKLSAgICB7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdFRlc3RfdHlwZXM6c3RydWN0X2luZm8oJ2luc2FuaXR5JykpfSwKLSAgICAnaW5zYW5pdHknKSwKLQotICBUZXN0RGF0YSA9IFJlc3VsdC4KLQotZW5jb2RlX2RlY29kZV81X3Rlc3QoKSAtPgotICAlIHRlc3Qgd3JpdGluZyB0byBhIGJ1ZmZlciwgZ2V0dGluZyB0aGUgYnl0ZXMgb3V0LCBwdXR0aW5nIHRoZW0KLSAgJSBpbiBhIG5ldyBidWZmZXIgYW5kIHJlYWRpbmcgdGhlbQotCi0gICUgaGVyZSdzIHRoZSB3cml0aW5nIHBhcnQKLSAge29rLCBUcmFuc3BvcnQwfSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyOm5ldygpLAotICB7b2ssIFByb3RvY29sMH0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQwKSwKLSAgVGVzdERhdGEgPSB0ZXN0X2RhdGEoKSwKLSAge1Byb3RvY29sMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvY29sMCwKLSAgICB7e3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnRUZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCd4dHJ1Y3QnKSl9LAotICAgICAgVGVzdERhdGF9KSwKLSAgJSBmbHVzaCBub3cgcmV0dXJucyB0aGUgYnVmZmVyCi0gIHtfUHJvdG9jb2wyLCBCdWZ9ID0gdGhyaWZ0X3Byb3RvY29sOmZsdXNoX3RyYW5zcG9ydCAoUHJvdG9jb2wxKSwKLQotICAlIG5vdyB0aGUgcmVhZGluZyBwYXJ0Ci0gIHtvaywgVDJ9ID0gdGhyaWZ0X21lbW9yeV9idWZmZXI6bmV3IChCdWYpLAotICB7b2ssIFAyfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFQyKSwKLSAge18sIHtvaywgUmVzdWx0fX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQMiwKLSAgICB7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdFRlc3RfdHlwZXM6c3RydWN0X2luZm8oJ3h0cnVjdCcpKX0sCi0gICAgJ3h0cnVjdCcpLAotCi0gIFJlc3VsdCA9IFRlc3REYXRhLgotCi0tZW5kaWYuCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF9vbWl0LmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X29taXQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwODQxZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF9vbWl0LmVybApAQCAtMCwwICsxLDc5IEBACistbW9kdWxlKHRlc3Rfb21pdCkuCisKKy1pbmNsdWRlKCJnZW4tZXJsL3RocmlmdF9vbWl0X3dpdGhfdHlwZXMuaHJsIikuCisKKy1pZmRlZihURVNUKS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworb21pdF9zdHJ1Y3QxX3Rlc3QoKSAtPgorICAlJSBJbiB0aGlzIHRlc3QsIHRoZSBmaWVsZCB0aGF0IGlzIGRlbGV0ZWQgaXMgYSBiYXNpYyB0eXBlIChhbiBpMzIpLgorICBBID0gI3Rlc3Qxe29uZSA9IDEsIHRocmVlID0gM30sCisgIEIgPSAjdGVzdDF7b25lID0gMSwgdHdvID0gMiwgdGhyZWUgPSAzfSwKKyAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KCksCisgIHtvaywgUDB9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKKworICB7UDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQMCwge3tzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRoX3R5cGVzLCBlbGVtZW50KDEsIEEpfX0sIEF9KSwKKyAge1AyLCB7b2ssIE8wfX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQMSwge3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhvdXRfdHlwZXMsIGVsZW1lbnQoMSwgQSl9fSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDEsIEEpLCBlbGVtZW50KDEsIE8wKSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDIsIEEpLCBlbGVtZW50KDIsIE8wKSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDQsIEEpLCBlbGVtZW50KDMsIE8wKSksCisKKyAge1AzLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDIsIHt7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aF90eXBlcywgZWxlbWVudCgxLCBCKX19LCBCfSksCisgIHtfUDQsIHtvaywgTzF9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFAzLCB7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aG91dF90eXBlcywgZWxlbWVudCgxLCBBKX19KSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMSwgQSksIGVsZW1lbnQoMSwgTzEpKSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMiwgQSksIGVsZW1lbnQoMiwgTzEpKSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoNCwgQSksIGVsZW1lbnQoMywgTzEpKSwKKworICBvay4KKworb21pdF9zdHJ1Y3QyX3Rlc3QoKSAtPgorICAlJSBJbiB0aGlzIHRlc3QsIHRoZSBmaWVsZCB0aGF0IGlzIGRlbGV0ZWQgaXMgYSBzdHJ1Y3QuCisgIEEgPSAjdGVzdDJ7b25lID0gMSwgdHdvID0gI3Rlc3Qye29uZSA9IDEwLCB0aHJlZSA9IDMwfSwgdGhyZWUgPSAzfSwKKyAgQiA9ICN0ZXN0MntvbmUgPSAxLCB0d28gPSAjdGVzdDJ7b25lID0gMTAsIHR3byA9ICN0ZXN0MntvbmUgPSAxMDB9LCB0aHJlZSA9IDMwfSwgdGhyZWUgPSAzfSwKKworICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpuZXcoKSwKKyAge29rLCBQMH0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpLAorCisgIHtQMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFAwLCB7e3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhfdHlwZXMsIGVsZW1lbnQoMSwgQSl9fSwgQX0pLAorICB7UDIsIHtvaywgTzB9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFAxLCB7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aG91dF90eXBlcywgZWxlbWVudCgxLCBBKX19KSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMSwgQSksIGVsZW1lbnQoMSwgTzApKSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMiwgQSksIGVsZW1lbnQoMiwgTzApKSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoNCwgQSksIGVsZW1lbnQoMywgTzApKSwKKworICB7UDMsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQMiwge3tzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRoX3R5cGVzLCBlbGVtZW50KDEsIEIpfX0sIEJ9KSwKKyAge19QNCwge29rLCBPMX19ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUDMsIHtzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRob3V0X3R5cGVzLCBlbGVtZW50KDEsIEEpfX0pLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCgxLCBBKSwgZWxlbWVudCgxLCBPMSkpLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCgyLCBBKSwgZWxlbWVudCgyLCBPMSkpLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCg0LCBBKSwgZWxlbWVudCgzLCBPMSkpLAorCisgIG9rLgorCitvbWl0X2xpc3RfdGVzdCgpIC0+CisgICUlIEluIHRoaXMgdGVzdCwgdGhlIGZpZWxkIHRoYXQgaXMgZGVsZXRlZCBpcyBhIGxpc3QuCisgIEEgPSAjdGVzdDF7b25lID0gMSwgdHdvID0gMiwgdGhyZWUgPSAzfSwKKyAgQiA9ICN0ZXN0M3tvbmUgPSAxLCB0d28gPSBbIEEgXX0sCisKKyAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KCksCisgIHtvaywgUDB9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKKworICB7UDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQMCwge3tzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRoX3R5cGVzLCBlbGVtZW50KDEsIEIpfX0sIEJ9KSwKKyAge19QMiwge29rLCBPMH19ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUDEsIHtzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRob3V0X3R5cGVzLCBlbGVtZW50KDEsIEIpfX0pLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCgyLCBCKSwgZWxlbWVudCgyLCBPMCkpLAorCisgIG9rLgorCitvbWl0X21hcF90ZXN0KCkgLT4KKyAgJSUgSW4gdGhpcyB0ZXN0LCB0aGUgZmllbGQgdGhhdCBpcyBkZWxldGVkIGlzIGEgbWFwLgorICBBID0gI3Rlc3Qxe29uZSA9IDEsIHR3byA9IDIsIHRocmVlID0gM30sCisgIEIgPSAjdGVzdDR7b25lID0gMSwgdHdvID0gZGljdDpmcm9tX2xpc3QoWyB7MiwgQX0gXSl9LAorCisgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpLAorICB7b2ssIFAwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCisKKyAge1AxLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDAsIHt7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aF90eXBlcywgZWxlbWVudCgxLCBCKX19LCBCfSksCisgIHtfUDIsIHtvaywgTzB9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFAxLCB7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aG91dF90eXBlcywgZWxlbWVudCgxLCBCKX19KSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMiwgQiksIGVsZW1lbnQoMiwgTzApKSwKKworICBvay4KKworLWVuZGlmLiAlJSBURVNUCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF9yZW5kZXJlZF9kb3VibGVfY29uc3RhbnRzLmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X3JlbmRlcmVkX2RvdWJsZV9jb25zdGFudHMuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZmNlODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF9yZW5kZXJlZF9kb3VibGVfY29uc3RhbnRzLmVybApAQCAtMCwwICsxLDY4IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3JlbmRlcmVkX2RvdWJsZV9jb25zdGFudHMpLgorCistaWZkZWYoVEVTVCkuCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKy1pbmNsdWRlKCJnZW4tZXJsL2RvdWJsZV9jb25zdGFudHNfdGVzdF9jb25zdGFudHMuaHJsIikuCisKKy1kZWZpbmUoRVBTSUxPTiwgMC4wMDAwMDAxKS4KKworcmVuZGVyZWRfZG91YmxlX2NvbnN0YW50c190ZXN0KCkgLT4KKyAgP2Fzc2VydChhYnMoMS4wIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTEwMC4wIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoOTIyMzM3MjAzNjg1NDc3NTgwNy4wIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygtOTIyMzM3MjAzNjg1NDc3NTgwNy4wIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoMy4xNDE1OTI2NTM1OSAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygxMDAwMDAwLjEgLSA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC0xMDAwMDAwLjEgLSA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDEuN2UrMzA4IC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoOTIyMzM3MjAzNjg1NDc3NTgxNi40MyAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTEuN2UrMzA4IC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMgLSA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QpKSwKKyAgP2Fzc2VydChpc19mbG9hdCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QpKSwKKyAgP2Fzc2VydChpc19mbG9hdCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpKSwKKyAgP2Fzc2VydChpc19mbG9hdCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKS4KKworcmVuZGVyZWRfZG91YmxlX2xpc3RfdGVzdCgpIC0+CisgID9hc3NlcnRFcXVhbCgxMiwgbGVuZ3RoKD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpLAorICA/YXNzZXJ0KGFicygxLjAgLSBsaXN0czpudGgoMSwgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygtMTAwLjAgLSBsaXN0czpudGgoMiwgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygxMDAuMCAtIGxpc3RzOm50aCgzLCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDkyMjMzNzIwMzY4NTQ3NzU4MDcuMCAtIGxpc3RzOm50aCg0LCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC05MjIzMzcyMDM2ODU0Nzc1ODA3LjAgLSBsaXN0czpudGgoNSwgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygzLjE0MTU5MjY1MzU5IC0gbGlzdHM6bnRoKDYsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoMTAwMDAwMC4xIC0gbGlzdHM6bnRoKDcsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTEwMDAwMDAuMSAtIGxpc3RzOm50aCg4LCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDEuN2UrMzA4IC0gbGlzdHM6bnRoKDksID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTEuN2UrMzA4IC0gbGlzdHM6bnRoKDEwLCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMgLSBsaXN0czpudGgoMTEsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMgLSBsaXN0czpudGgoMTIsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKS4KKworLWVuZGlmLiAlJSBURVNUClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3Rfc2VydmVyLmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X3NlcnZlci5lcmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZjdiMDguLjAwMDAwMDAKLS0tIGEvbGliL2VybC90ZXN0L3Rlc3Rfc2VydmVyLmVybAorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0lJQotJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0lJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotJSUKLSUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0lJQotJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSUlIHVuZGVyIHRoZSBMaWNlbnNlLgotJSUKLQotLW1vZHVsZSh0ZXN0X3NlcnZlcikuCi0KLS1leHBvcnQoW2dvLzAsIGdvLzEsIHN0YXJ0X2xpbmsvMiwgaGFuZGxlX2Z1bmN0aW9uLzJdKS4KLQotLWluY2x1ZGUoInRocmlmdFRlc3RfdHlwZXMuaHJsIikuCi0KLS1yZWNvcmQob3B0aW9ucywge3BvcnQgPSA5MDkwLAotICAgICAgICAgICAgICAgICAgc2VydmVyX29wdHMgPSBbXX0pLgotCi1wYXJzZV9hcmdzKEFyZ3MpIC0+IHBhcnNlX2FyZ3MoQXJncywgI29wdGlvbnN7fSkuCi1wYXJzZV9hcmdzKFtdLCBPcHRzKSAtPiBPcHRzOwotcGFyc2VfYXJncyhbSGVhZCB8IFJlc3RdLCBPcHRzKSAtPgotICAgIE5ld09wdHMgPQotICAgICAgICBjYXNlIGNhdGNoIGxpc3RfdG9faW50ZWdlcihIZWFkKSBvZgotICAgICAgICAgICAgUG9ydCB3aGVuIGlzX2ludGVnZXIoUG9ydCkgLT4KLSAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7cG9ydCA9IFBvcnR9OwotICAgICAgICAgICAgX0Vsc2UgLT4KLSAgICAgICAgICAgICAgICBjYXNlIEhlYWQgb2YKLSAgICAgICAgICAgICAgICAgICAgImZyYW1lZCIgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tzZXJ2ZXJfb3B0cyA9IFt7ZnJhbWVkLCB0cnVlfSB8IE9wdHMjb3B0aW9ucy5zZXJ2ZXJfb3B0c119OwotICAgICAgICAgICAgICAgICAgICAiIiAtPgotICAgICAgICAgICAgICAgICAgICAgICAgT3B0czsKLSAgICAgICAgICAgICAgICAgICAgX0Vsc2UgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIGVybGFuZzplcnJvcih7YmFkX2FyZywgSGVhZH0pCi0gICAgICAgICAgICAgICAgZW5kCi0gICAgICAgIGVuZCwKLSAgICBwYXJzZV9hcmdzKFJlc3QsIE5ld09wdHMpLgotCi1nbygpIC0+IGdvKFtdKS4KLWdvKEFyZ3MpIC0+Ci0gICAgI29wdGlvbnN7cG9ydCA9IFBvcnQsIHNlcnZlcl9vcHRzID0gU2VydmVyT3B0c30gPSBwYXJzZV9hcmdzKEFyZ3MpLAotICAgIHNwYXduKGZ1bigpIC0+IHN0YXJ0X2xpbmsoUG9ydCwgU2VydmVyT3B0cyksIHJlY2VpdmUgYWZ0ZXIgaW5maW5pdHkgLT4gb2sgZW5kIGVuZCkuCi0KLXN0YXJ0X2xpbmsoUG9ydCwgU2VydmVyT3B0cykgLT4KLSAgICB0aHJpZnRfc29ja2V0X3NlcnZlcjpzdGFydChbe2hhbmRsZXIsID9NT0RVTEV9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2VydmljZSwgdGhyaWZ0VGVzdF90aHJpZnR9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cG9ydCwgUG9ydH1dICsrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmVyT3B0cykuCi0KLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RWb2lkLCB7fSkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RWb2lkfm4iKSwKLSAgICBvazsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RTdHJpbmcsIHtTfSkgd2hlbiBpc19iaW5hcnkoUykgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RTdHJpbmc6IH5wfm4iLCBbU10pLAotICAgIHtyZXBseSwgU307Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0Qnl0ZSwge0k4fSkgd2hlbiBpc19pbnRlZ2VyKEk4KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdEJ5dGU6IH5wfm4iLCBbSThdKSwKLSAgICB7cmVwbHksIEk4fTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RJMzIsIHtJMzJ9KSB3aGVuIGlzX2ludGVnZXIoSTMyKSAtPgotICAgIGlvOmZvcm1hdCgidGVzdEkzMjogfnB+biIsIFtJMzJdKSwKLSAgICB7cmVwbHksIEkzMn07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0STY0LCB7STY0fSkgd2hlbiBpc19pbnRlZ2VyKEk2NCkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RJNjQ6IH5wfm4iLCBbSTY0XSksCi0gICAge3JlcGx5LCBJNjR9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdERvdWJsZSwge0RvdWJsZX0pIHdoZW4gaXNfZmxvYXQoRG91YmxlKSAtPgotICAgIGlvOmZvcm1hdCgidGVzdERvdWJsZTogfnB+biIsIFtEb3VibGVdKSwKLSAgICB7cmVwbHksIERvdWJsZX07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0U3RydWN0LAotICAgICAgICAgICAgICAgIHtTdHJ1Y3QgPSAjeHRydWN0e3N0cmluZ190aGluZyA9IFN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcgPSBCeXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nID0gSTMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gSTY0fX0pCi13aGVuIGlzX2JpbmFyeShTdHJpbmcpLAotICAgICBpc19pbnRlZ2VyKEJ5dGUpLAotICAgICBpc19pbnRlZ2VyKEkzMiksCi0gICAgIGlzX2ludGVnZXIoSTY0KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdFN0cnVjdDogfnB+biIsIFtTdHJ1Y3RdKSwKLSAgICB7cmVwbHksIFN0cnVjdH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0TmVzdCwKLSAgICAgICAgICAgICAgICB7TmVzdH0pIHdoZW4gaXNfcmVjb3JkKE5lc3QsIHh0cnVjdDIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19yZWNvcmQoTmVzdCN4dHJ1Y3QyLnN0cnVjdF90aGluZywgeHRydWN0KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdE5lc3Q6IH5wfm4iLCBbTmVzdF0pLAotICAgIHtyZXBseSwgTmVzdH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0TWFwLCB7TWFwfSkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RNYXA6IH5wfm4iLCBbZGljdDp0b19saXN0KE1hcCldKSwKLSAgICB7cmVwbHksIE1hcH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0U2V0LCB7U2V0fSkgLT4KLSAgICB0cnVlID0gc2V0czppc19zZXQoU2V0KSwKLSAgICBpbzpmb3JtYXQoInRlc3RTZXQ6IH5wfm4iLCBbc2V0czp0b19saXN0KFNldCldKSwKLSAgICB7cmVwbHksIFNldH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0TGlzdCwge0xpc3R9KSB3aGVuIGlzX2xpc3QoTGlzdCkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RMaXN0OiB+cH5uIiwgW0xpc3RdKSwKLSAgICB7cmVwbHksIExpc3R9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdEVudW0sIHtFbnVtfSkgd2hlbiBpc19pbnRlZ2VyKEVudW0pIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0RW51bTogfnB+biIsIFtFbnVtXSksCi0gICAge3JlcGx5LCBFbnVtfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RUeXBlZGVmLCB7VXNlcklEfSkgd2hlbiBpc19pbnRlZ2VyKFVzZXJJRCkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RUeXBlZGVmOiB+cH5uIiwgW1VzZXJJRF0pLAotICAgIHtyZXBseSwgVXNlcklEfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RNYXBNYXAsIHtIZWxsb30pIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0TWFwTWFwOiB+cH5uIiwgW0hlbGxvXSksCi0KLSAgICBQb3NMaXN0ID0gW3tJLCBJfSAgIHx8IEkgPC0gbGlzdHM6c2VxKDEsIDUpXSwKLSAgICBOZWdMaXN0ID0gW3stSSwgLUl9IHx8IEkgPC0gbGlzdHM6c2VxKDEsIDUpXSwKLQotICAgIE1hcE1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7NCwgIGRpY3Q6ZnJvbV9saXN0KFBvc0xpc3QpfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey00LCBkaWN0OmZyb21fbGlzdChOZWdMaXN0KX1dKSwKLSAgICB7cmVwbHksIE1hcE1hcH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0SW5zYW5pdHksIHtJbnNhbml0eX0pIHdoZW4gaXNfcmVjb3JkKEluc2FuaXR5LCBpbnNhbml0eSkgLT4KLSAgICBIZWxsbyA9ICN4dHJ1Y3R7c3RyaW5nX3RoaW5nID0gPDwiSGVsbG8yIj4+LAotICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nID0gMiwKLSAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nID0gMiwKLSAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gMn0sCi0KLSAgICBHb29kYnllID0gI3h0cnVjdHtzdHJpbmdfdGhpbmcgPSA8PCJHb29kYnllNCI+PiwKLSAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nID0gNCwKLSAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgPSA0LAotICAgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZyA9IDR9LAotICAgIENyYXp5ID0gI2luc2FuaXR5ewotICAgICAgdXNlck1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7P3RocmlmdFRlc3RfTnVtYmVyel9FSUdIVCwgOH1dKSwKLSAgICAgIHh0cnVjdHMgPSBbR29vZGJ5ZV0KLSAgICAgIH0sCi0KLSAgICBMb29uZXkgPSAjaW5zYW5pdHl7Ci0gICAgICB1c2VyTWFwID0gZGljdDpmcm9tX2xpc3QoW3s/dGhyaWZ0VGVzdF9OdW1iZXJ6X0ZJVkUsIDV9XSksCi0gICAgICB4dHJ1Y3RzID0gW0hlbGxvXQotICAgICAgfSwKLQotICAgIEZpcnN0TWFwID0gZGljdDpmcm9tX2xpc3QoW3s/dGhyaWZ0VGVzdF9OdW1iZXJ6X1RXTywgQ3Jhenl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs/dGhyaWZ0VGVzdF9OdW1iZXJ6X1RIUkVFLCBDcmF6eX1dKSwKLQotICAgIFNlY29uZE1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7P3RocmlmdFRlc3RfTnVtYmVyel9TSVgsIExvb25leX1dKSwKLQotICAgIEluc2FuZSA9IGRpY3Q6ZnJvbV9saXN0KFt7MSwgRmlyc3RNYXB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MiwgU2Vjb25kTWFwfV0pLAotCi0gICAgaW86Zm9ybWF0KCJSZXR1cm4gPSB+cH5uIiwgW0luc2FuZV0pLAotCi0gICAge3JlcGx5LCBJbnNhbmV9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdE11bHRpLCBBcmdzID0ge0FyZzAsIEFyZzEsIEFyZzIsIF9BcmczLCBBcmc0LCBBcmc1fSkKLSAgd2hlbiBpc19pbnRlZ2VyKEFyZzApLAotICAgICAgIGlzX2ludGVnZXIoQXJnMSksCi0gICAgICAgaXNfaW50ZWdlcihBcmcyKSwKLSAgICAgICBpc19pbnRlZ2VyKEFyZzQpLAotICAgICAgIGlzX2ludGVnZXIoQXJnNSkgLT4KLQotICAgIGlvOmZvcm1hdCgidGVzdE11bHRpKH5wKX5uIiwgW0FyZ3NdKSwKLSAgICB7cmVwbHksICN4dHJ1Y3R7c3RyaW5nX3RoaW5nID0gPDwiSGVsbG8yIj4+LAotICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nID0gQXJnMCwKLSAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nID0gQXJnMSwKLSAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gQXJnMn19OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdEV4Y2VwdGlvbiwge1N0cmluZ30pIHdoZW4gaXNfYmluYXJ5KFN0cmluZykgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RFeGNlcHRpb24ofnApfm4iLCBbU3RyaW5nXSksCi0gICAgY2FzZSBTdHJpbmcgb2YKLSAgICAgICAgPDwiWGNlcHRpb24iPj4gLT4KLSAgICAgICAgICAgIHRocm93KCN4Y2VwdGlvbntlcnJvckNvZGUgPSAxMDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBTdHJpbmd9KTsKLSAgICAgICAgXyAtPgotICAgICAgICAgICAgb2sKLSAgICBlbmQ7Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0TXVsdGlFeGNlcHRpb24sIHtBcmcwLCBBcmcxfSkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RNdWx0aUV4Y2VwdGlvbih+cCwgfnApfm4iLCBbQXJnMCwgQXJnMV0pLAotICAgIGNhc2UgQXJnMCBvZgotICAgICAgICA8PCJYY2VwdGlvbiI+PiAtPgotICAgICAgICAgICAgdGhyb3coI3hjZXB0aW9ue2Vycm9yQ29kZSA9IDEwMDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSA8PCJUaGlzIGlzIGFuIFhjZXB0aW9uIj4+fSk7Ci0gICAgICAgIDw8IlhjZXB0aW9uMiI+PiAtPgotICAgICAgICAgICAgdGhyb3coI3hjZXB0aW9uMntlcnJvckNvZGUgPSAyMDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3RoaW5nID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN4dHJ1Y3R7c3RyaW5nX3RoaW5nID0gPDwiVGhpcyBpcyBhbiBYY2VwdGlvbjIiPj59fSk7Ci0gICAgICAgIF8gLT4KLSAgICAgICAgICAgIHtyZXBseSwgI3h0cnVjdHtzdHJpbmdfdGhpbmcgPSBBcmcxfX0KLSAgICBlbmQ7Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0T25ld2F5LCB7U2Vjb25kc30pIC0+Ci0gICAgdGltZXI6c2xlZXAoMTAwMCAqIFNlY29uZHMpLAotICAgIG9rLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0XzExNTEuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0XzExNTEuZXJsCmluZGV4IDljZWU0ODYuLmY0YTkxMGUgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF8xMTUxLmVybAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfMTE1MS5lcmwKQEAgLTEsMjQgKzEsMzQgQEAKIC1tb2R1bGUodGVzdF90aHJpZnRfMTE1MSkuCiAKLS1pbmNsdWRlKCJ0aHJpZnQxMTUxX3R5cGVzLmhybCIpLgorLWluY2x1ZGUoImdlbi1lcmwvdGhyaWZ0MTE1MV90eXBlcy5ocmwiKS4KIAogLWlmZGVmKFRFU1QpLgogLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgogCiB1bm1hdGNoZWRfc3RydWN0X3Rlc3QoKSAtPgotICBTMSA9ICNzdHJ1Y3RDe3g9I3N0cnVjdEJ7eD0xfX0sCisgIFMxID0gIydTdHJ1Y3RDJ3t4PSMnU3RydWN0Qid7eD0xfX0sCiAgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyOm5ldygpLAogICB7b2ssIFByb3RvY29sfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCi0gID9hc3NlcnRFeGNlcHRpb24gKGVycm9yLCBzdHJ1Y3RfdW5tYXRjaGVkLAotICAgIHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90b2NvbCwKLSAgICAgIHt7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdDExNTFfdHlwZXM6c3RydWN0X2luZm8oJ3N0cnVjdEMnKSl9LCBTMX0pKS4KKyAgP2Fzc2VydEV4Y2VwdGlvbigKKyAgICBlcnJvciwKKyAgICBzdHJ1Y3RfdW5tYXRjaGVkLAorICAgIHRocmlmdF9wcm90b2NvbDp3cml0ZSgKKyAgICAgIFByb3RvY29sLAorICAgICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0MTE1MV90eXBlczpzdHJ1Y3RfaW5mbygnU3RydWN0QycpKX0sIFMxfQorICAgICkKKyAgKS4KIAogYmFkYXJnX3Rlc3QoKSAtPgotICBTMiA9ICNzdHJ1Y3RDe3g9I3N0cnVjdEF7eD0iMSJ9fSwKKyAgUzIgPSAjJ1N0cnVjdEMne3g9IydTdHJ1Y3RBJ3t4PSIxIn19LAogICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcjpuZXcoKSwKICAge29rLCBQcm90b2NvbH0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpLAotICA/YXNzZXJ0RXhjZXB0aW9uIChlcnJvciwgYmFkYXJnLAotICAgIHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90b2NvbCwKLSAgICAgIHt7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdDExNTFfdHlwZXM6c3RydWN0X2luZm8oJ3N0cnVjdEMnKSl9LCBTMn0pKS4KKyAgP2Fzc2VydEV4Y2VwdGlvbigKKyAgICBlcnJvciwKKyAgICBiYWRhcmcsCisgICAgdGhyaWZ0X3Byb3RvY29sOndyaXRlKAorICAgICAgUHJvdG9jb2wsCisgICAgICB7e3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnQxMTUxX3R5cGVzOnN0cnVjdF9pbmZvKCdTdHJ1Y3RDJykpfSwgUzJ9CisgICAgKQorICApLgogCiAtZW5kaWYuCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfMzIxNC5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfMzIxNC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY5NTQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF8zMjE0LmVybApAQCAtMCwwICsxLDYwIEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3RocmlmdF8zMjE0KS4KKy1jb21waWxlKGV4cG9ydF9hbGwpLgorCistaW5jbHVkZSgiZ2VuLWVybC90aHJpZnQzMjE0X3R5cGVzLmhybCIpLgorCistaWZkZWYoVEVTVCkuCistaWZuZGVmKG90cDE2X29yX2xlc3MpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCityZWNvcmRfZ2VuZXJhdGlvbl90ZXN0XygpIC0+CisgIFsKKyAgICB7IlN0cmluZ01hcCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeydTdHJpbmdNYXAnLCBffSwKKyAgICAgICMnU3RyaW5nTWFwJ3tkYXRhPSN7NTAgPT4gImZvbyJ9fQorICAgICl9LAorICAgIHsiU3RyaW5nTWFwIHJlY29yZCBkZWZhdWx0cyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7J1N0cmluZ01hcCcsICN7MSA9PiAiYSIsIDIgPT4gImIifX0sCisgICAgICAjJ1N0cmluZ01hcCd7fQorICAgICl9LAorICAgIHsiU3RyaW5nTWFwIHJlY29yZCBkaWN0IGZyb20gbGlzdCIsID9fYXNzZXJ0Tm90RXF1YWwoCisgICAgICB7J1N0cmluZ01hcCcsIGRpY3Q6ZnJvbV9saXN0KFt7MSwgImEifSwgezIsICJiIn1dKX0sCisgICAgICAjJ1N0cmluZ01hcCd7fQorICAgICl9LAorICAgIHsiU3RyaW5nTWFwIHJlY29yZCBtYXAgZnJvbSBsaXN0IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHsnU3RyaW5nTWFwJywgbWFwczpmcm9tX2xpc3QoW3sxLCAiYSJ9LCB7MiwgImIifV0pfSwKKyAgICAgICMnU3RyaW5nTWFwJ3t9CisgICAgKX0KKyAgXS4KKworc3RydWN0X2luZm9fdGVzdF8oKSAtPgorICBbCisgICAgeyJTdHJpbmdNYXAgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHttYXAsIGkzMiwgc3RyaW5nfSwgJ2RhdGEnLCAjezEgPT4gImEiLCAyID0+ICJiIn19CisgICAgICBdfSwKKyAgICAgIHRocmlmdDMyMTRfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdTdHJpbmdNYXAnKQorICAgICl9CisgIF0uCisKKy1lbmRpZi4KKy1lbmRpZi4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxOWU4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuZXJsCkBAIC0wLDAgKzEsMzU5IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCisKK25ldyhUcmFuc3BvcnQpIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6bmV3KFRyYW5zcG9ydCkuCisKK25ld190ZXN0XygpIC0+CisgIFsKKyAgICB7Im5ldyBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7dF90cmFuc3BvcnQsIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQsIHt0X2J1ZmZlcmVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIFtdfX0sCisgICAgICAgIFtdCisgICAgICB9fX0sCisgICAgICBuZXcoe3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCBbXX19KQorICAgICl9CisgIF0uCisKKworcmVhZChGcmFtZSwgQnl0ZXMpIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6cmVhZChGcmFtZSwgQnl0ZXMpLgorCityZWFkX3Rlc3RfKCkgLT4KKyAgWworICAgIHsicmVhZCB6ZXJvIGJ5dGVzIGZyb20gYW4gZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDAKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgMSBieXRlIGZyb20gYW4gZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMAorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8ImFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8ImgiPj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGEgemlsbGlvbiBieXRlcyBmcm9tIG5vbmVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaGFsbG8gd29ybGQiPj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDY1NTM2CisgICAgICApCisgICAgKX0KKyAgXS4KKworCityZWFkX2V4YWN0KEZyYW1lLCBCeXRlcykgLT4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydDpyZWFkX2V4YWN0KEZyYW1lLCBCeXRlcykuCisKK3JlYWRfZXhhY3RfdGVzdF8oKSAtPgorICBbCisgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIGFuIGVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDw+Pn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gYW4gZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtfLCB7ZXJyb3IsIGVvZn19LAorICAgICAgcmVhZF9leGFjdCgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IHplcm8gYnl0ZXMgZnJvbSBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gbm9uZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIG5vbmVtcHR5IGJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaCI+Pn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IGEgemlsbGlvbiBieXRlcyBmcm9tIG5vbmVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7ZXJyb3IsIGVvZn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PCJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDY1NTM2CisgICAgICApCisgICAgKX0KKyAgXS4KKworCit3cml0ZShGcmFtZWQsIERhdGEpIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6d3JpdGUoRnJhbWVkLCBEYXRhKS4KKword3JpdGVfdGVzdF8oKSAtPgorICBbCisgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIGVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtbXSwgW11dCisgICAgICAgIH0sCisgICAgICAgIG9rCisgICAgICB9LAorICAgICAgd3JpdGUoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIFtdCisgICAgICApCisgICAgKX0sCisgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIG5vbmVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtbImhhbGxvIHdvcmxkIl0sIFtdXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbImhhbGxvIHdvcmxkIl0KKyAgICAgICAgfSwKKyAgICAgICAgW10KKyAgICAgICkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGJpbmFyeSB0byBlbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbW10sIDw8Pj5dCisgICAgICAgIH0sCisgICAgICAgIG9rCisgICAgICB9LAorICAgICAgd3JpdGUoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDw8Pj4KKyAgICAgICkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGJpbmFyeSB0byBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbWyJoYWxsbyB3b3JsZCJdLCA8PD4+XQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbImhhbGxvIHdvcmxkIl0KKyAgICAgICAgfSwKKyAgICAgICAgPDw+PgorICAgICAgKQorICAgICl9CisgIF0uCisKKworZmx1c2goVHJhbnNwb3J0KSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0OmZsdXNoKFRyYW5zcG9ydCkuCisKK2ZsdXNoX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiZmx1c2ggZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIGZsdXNoKHt0X2J1ZmZlcmVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgW10KKyAgICAgIH0pCisgICAgKX0sCisgICAgeyJmbHVzaCBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIFs8PD4+LCA8PCJoYWxsbyB3b3JsZCI+Pl0KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIGZsdXNoKHt0X2J1ZmZlcmVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgPDwiaGFsbG8gd29ybGQiPj4KKyAgICAgIH0pCisgICAgKX0KKyAgXS4KKworCitjbG9zZShUcmFuc3BvcnQpIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6Y2xvc2UoVHJhbnNwb3J0KS4KKworY2xvc2VfdGVzdF8oKSAtPgorICB7ImNsb3NlIGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAge3t0X2J1ZmZlcmVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgW10KKyAgICAgIH0sCisgICAgICBvaworICAgIH0sCisgICAgY2xvc2Uoe3RfYnVmZmVyZWQsCisgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgIFtdCisgICAgfSkKKyAgKX0uCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGE3OGM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuZXJsCkBAIC0wLDAgKzEsMjE5IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3RocmlmdF9jb21wYWN0X3Byb3RvY29sKS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKy1pbmNsdWRlKCJ0aHJpZnRfY29uc3RhbnRzLmhybCIpLgorLWluY2x1ZGUoInRocmlmdF9wcm90b2NvbC5ocmwiKS4KKworCituZXcoVHJhbnNwb3J0KSAtPiB0aHJpZnRfY29tcGFjdF9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KS4KK25ldygpIC0+CisgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpLAorICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KS4KKworbmV3X3Rlc3QoKSAtPgorICBuZXcodGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KCkpLgorCit3cml0ZShUaGlzLCBWYWx1ZSkgLT4gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFRoaXMsIFZhbHVlKS4KK3JlYWQoVGhpcywgVHlwZSkgLT4gdGhyaWZ0X3Byb3RvY29sOnJlYWQoVGhpcywgVHlwZSkuCisKK3N0cihUaGlzMCwgVmFsdWUwKSAtPgorICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7c3RyaW5nLCBWYWx1ZTB9KSwKKyAge1RoaXMyLCB7b2ssIFZhbHVlMX19ID0gcmVhZChUaGlzMSwgc3RyaW5nKSwKKyAgP2Fzc2VydEVxdWFsKFZhbHVlMCwgYmluYXJ5X3RvX2xpc3QoVmFsdWUxKSksCisgIHtUaGlzMiwgb2t9Lgorc3RyaW5nX3Rlc3QoKSAtPgorICB7b2ssIFRoaXMwfSA9IG5ldygpLAorICB7VGhpczEsIG9rfSA9IHN0cihUaGlzMCwgImFhYSIpLAorICB7VGhpczIsIG9rfSA9IHN0cihUaGlzMSwgIiIpLAorICB7VGhpczIsIG9rfS4KKworcm91bmRfdHJpcChUaGlzMCwgVHlwZSwgVmFsdWUwKSAtPgorICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7VHlwZSwgVmFsdWUwfSksCisgIHtUaGlzMiwge29rLCBWYWx1ZTF9fSA9IHJlYWQoVGhpczEsIFR5cGUpLAorICA/YXNzZXJ0RXF1YWwoVmFsdWUwLCBWYWx1ZTEpLAorICB7VGhpczIsIG9rfS4KKworYm9vbF90ZXN0KCkgLT4KKyAge29rLCBUaGlzMH0gPSBuZXcoKSwKKyAge1RoaXMxLCBva30gPSByb3VuZF90cmlwKFRoaXMwLCBib29sLCB0cnVlKSwKKyAge1RoaXMyLCBva30gPSByb3VuZF90cmlwKFRoaXMxLCBib29sLCBmYWxzZSksCisgIHtUaGlzMiwgb2t9LgorCitieXRlKFRoaXMwLCBWYWx1ZTApIC0+IHJvdW5kX3RyaXAoVGhpczAsIGJ5dGUsIFZhbHVlMCkuCitieXRlX3Rlc3QoKSAtPgorICB7b2ssIFRoaXMwfSA9IG5ldygpLAorICB7VGhpczEsIG9rfSA9IGJ5dGUoVGhpczAsIDApLAorICB7VGhpczIsIG9rfSA9IGJ5dGUoVGhpczEsIDQyKSwKKyAge1RoaXMzLCBva30gPSBieXRlKFRoaXMyLCAtMSksCisgIHtUaGlzNCwgb2t9ID0gYnl0ZShUaGlzMywgLTEyOCksCisgIHtUaGlzNCwgb2t9LgorCitpMTYoVGhpczAsIFZhbHVlMCkgLT4gcm91bmRfdHJpcChUaGlzMCwgaTE2LCBWYWx1ZTApLgoraTE2X3Rlc3QoKSAtPgorICB7b2ssIFRoaXMwfSA9IG5ldygpLAorICB7VGhpczEsIG9rfSA9IGkxNihUaGlzMCwgMCksCisgIHtUaGlzMiwgb2t9ID0gaTE2KFRoaXMxLCA0MiksCisgIHtUaGlzMywgb2t9ID0gaTE2KFRoaXMyLCAzMDAwMCksCisgIHtUaGlzNCwgb2t9ID0gaTE2KFRoaXMzLCAtMSksCisgIHtUaGlzNSwgb2t9ID0gaTE2KFRoaXM0LCAtMTI4KSwKKyAge1RoaXM2LCBva30gPSBpMTYoVGhpczUsIC0zMDAwMCksCisgIHtUaGlzNiwgb2t9LgorCitpMzIoVGhpczAsIFZhbHVlMCkgLT4gcm91bmRfdHJpcChUaGlzMCwgaTMyLCBWYWx1ZTApLgoraTMyX3Rlc3QoKSAtPgorICB7b2ssIFRoaXMwfSA9IG5ldygpLAorICB7VGhpczEsIG9rfSA9IGkzMihUaGlzMCwgMCksCisgIHtUaGlzMiwgb2t9ID0gaTMyKFRoaXMxLCA0MiksCisgIHtUaGlzMywgb2t9ID0gaTMyKFRoaXMyLCAzMDAwMCksCisgIHtUaGlzNCwgb2t9ID0gaTMyKFRoaXMzLCAyMDAwMDAwMDAyKSwKKyAge1RoaXM1LCBva30gPSBpMzIoVGhpczQsIC0xKSwKKyAge1RoaXM2LCBva30gPSBpMzIoVGhpczUsIC0xMjgpLAorICB7VGhpczcsIG9rfSA9IGkzMihUaGlzNiwgLTMwMDAwKSwKKyAge1RoaXM4LCBva30gPSBpMzIoVGhpczcsIC0yMDAwMDAwMDAyKSwKKyAge1RoaXM4LCBva30uCisKK2k2NChUaGlzMCwgVmFsdWUwKSAtPiByb3VuZF90cmlwKFRoaXMwLCBpNjQsIFZhbHVlMCkuCitpNjRfdGVzdCgpIC0+CisgIHtvaywgVGhpczB9ID0gbmV3KCksCisgIHtUaGlzMSwgb2t9ID0gaTY0KFRoaXMwLCAwKSwKKyAge1RoaXMyLCBva30gPSBpNjQoVGhpczEsIDQyKSwKKyAge1RoaXMzLCBva30gPSBpNjQoVGhpczIsIDMwMDAwKSwKKyAge1RoaXM0LCBva30gPSBpNjQoVGhpczMsIDIwMDAwMDAwMDIpLAorICB7VGhpczUsIG9rfSA9IGk2NChUaGlzNCwgMTAwMDAwMDAwMDAwMDAwMDY0KSwKKyAge1RoaXM2LCBva30gPSBpNjQoVGhpczUsIC0xKSwKKyAge1RoaXM3LCBva30gPSBpNjQoVGhpczYsIC0xMjgpLAorICB7VGhpczgsIG9rfSA9IGk2NChUaGlzNywgLTMwMDAwKSwKKyAge1RoaXM5LCBva30gPSBpNjQoVGhpczgsIC0yMDAwMDAwMDAyKSwKKyAge1RoaXMxMCwgb2t9ID0gaTY0KFRoaXM5LCAtMTAwMDAwMDAwMDAwMDAwMDY0KSwKKyAge1RoaXMxMCwgb2t9LgorCitzdHJ1Y3RfdGVzdCgpIC0+CisgIHtvaywgUDB9ID0gbmV3KCksCisgIHtQMSwgb2t9ID0gd3JpdGUoUDAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfSksCisgIHtQMiwgb2t9ID0gd3JpdGUoUDEsICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fSksCisgIHtQMywgb2t9ID0gd3JpdGUoUDIsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDEiLCB0eXBlID0gP3RUeXBlX0k4LCBpZCA9IDF9KSwKKyAge1A0LCBva30gPSB3cml0ZShQMywge2J5dGUsIDQyfSksCisgIHtQNSwgb2t9ID0gd3JpdGUoUDQsIGZpZWxkX2VuZCksCisgIHtQNiwgb2t9ID0gd3JpdGUoUDUsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDIiLCB0eXBlID0gP3RUeXBlX0k4LCBpZCA9IDE0fSksCisgIHtQNywgb2t9ID0gd3JpdGUoUDYsIHtieXRlLCAzfSksCisgIHtQOCwgb2t9ID0gd3JpdGUoUDcsIGZpZWxkX2VuZCksCisgIHtQOSwgb2t9ID0gd3JpdGUoUDgsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDMiLCB0eXBlID0gP3RUeXBlX0k4LCBpZCA9IDQyfSksCisgIHtQMTAsIG9rfSA9IHdyaXRlKFA5LCB7Ynl0ZSwgOH0pLAorICB7UDExLCBva30gPSB3cml0ZShQMTAsIGZpZWxkX2VuZCksCisgIHtQMTIsIG9rfSA9IHdyaXRlKFAxMSwgZmllbGRfc3RvcCksCisgIHtQMTMsIG9rfSA9IHdyaXRlKFAxMiwgc3RydWN0X2VuZCksCisgIHtQMTQsIG9rfSA9IHdyaXRlKFAxMywgbWVzc2FnZV9lbmQpLAorCisgIHtQMTUsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfX0gPSByZWFkKFAxNCwgbWVzc2FnZV9iZWdpbiksCisgIHtQMTYsIG9rfSA9IHJlYWQoUDE1LCBzdHJ1Y3RfYmVnaW4pLAorICB7UDE3LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfSTgsIGlkID0gMSB9fSA9IHJlYWQoUDE2LCBmaWVsZF9iZWdpbiksCisgIHtQMTgsIHtvaywgNDJ9fSA9IHJlYWQoUDE3LCBieXRlKSwKKyAge1AxOSwgb2t9ID0gcmVhZChQMTgsIGZpZWxkX2VuZCksCisgIHtQMjAsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9JOCwgaWQgPSAxNCB9fSA9IHJlYWQoUDE5LCBmaWVsZF9iZWdpbiksCisgIHtQMjEsIHtvaywgM319ID0gcmVhZChQMjAsIGJ5dGUpLAorICB7UDIyLCBva30gPSByZWFkKFAyMSwgZmllbGRfZW5kKSwKKyAge1AyMywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX0k4LCBpZCA9IDQyIH19ID0gcmVhZChQMjIsIGZpZWxkX2JlZ2luKSwKKyAge1AyNCwge29rLCA4fX0gPSByZWFkKFAyMywgYnl0ZSksCisgIHtQMjUsIG9rfSA9IHJlYWQoUDI0LCBmaWVsZF9lbmQpLAorICB7UDI2LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfU1RPUH19ID0gcmVhZChQMjUsIGZpZWxkX2JlZ2luKSwKKyAge1AyNywgb2t9ID0gcmVhZChQMjYsIHN0cnVjdF9lbmQpLAorICB7UDI4LCBva30gPSByZWFkKFAyNywgbWVzc2FnZV9lbmQpLAorICB7UDI4LCBva30uCisKK2Jvb2xfZmllbGRfdGVzdCgpIC0+CisgIHtvaywgUDB9ID0gbmV3KCksCisgIHtQMSwgb2t9ID0gd3JpdGUoUDAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfSksCisgIHtQMiwgb2t9ID0gd3JpdGUoUDEsICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fSksCisgIHtQMywgb2t9ID0gd3JpdGUoUDIsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDEiLCB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gMX0pLAorICB7UDQsIG9rfSA9IHdyaXRlKFAzLCB7Ym9vbCwgdHJ1ZX0pLAorICB7UDUsIG9rfSA9IHdyaXRlKFA0LCBmaWVsZF9lbmQpLAorICB7UDYsIG9rfSA9IHdyaXRlKFA1LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQyIiwgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDE0fSksCisgIHtQNywgb2t9ID0gd3JpdGUoUDYsIHtib29sLCBmYWxzZX0pLAorICB7UDgsIG9rfSA9IHdyaXRlKFA3LCBmaWVsZF9lbmQpLAorICB7UDksIG9rfSA9IHdyaXRlKFA4LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQzIiwgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDQyfSksCisgIHtQMTAsIG9rfSA9IHdyaXRlKFA5LCB7Ym9vbCwgdHJ1ZX0pLAorICB7UDExLCBva30gPSB3cml0ZShQMTAsIGZpZWxkX2VuZCksCisgIHtQMTIsIG9rfSA9IHdyaXRlKFAxMSwgZmllbGRfc3RvcCksCisgIHtQMTMsIG9rfSA9IHdyaXRlKFAxMiwgc3RydWN0X2VuZCksCisgIHtQMTQsIG9rfSA9IHdyaXRlKFAxMywgbWVzc2FnZV9lbmQpLAorCisgIHtQMTUsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfX0gPSByZWFkKFAxNCwgbWVzc2FnZV9iZWdpbiksCisgIHtQMTYsIG9rfSA9IHJlYWQoUDE1LCBzdHJ1Y3RfYmVnaW4pLAorICB7UDE3LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSAxIH19ID0gcmVhZChQMTYsIGZpZWxkX2JlZ2luKSwKKyAge1AxOCwge29rLCB0cnVlfX0gPSByZWFkKFAxNywgYm9vbCksCisgIHtQMTksIG9rfSA9IHJlYWQoUDE4LCBmaWVsZF9lbmQpLAorICB7UDIwLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSAxNCB9fSA9IHJlYWQoUDE5LCBmaWVsZF9iZWdpbiksCisgIHtQMjEsIHtvaywgZmFsc2V9fSA9IHJlYWQoUDIwLCBib29sKSwKKyAge1AyMiwgb2t9ID0gcmVhZChQMjEsIGZpZWxkX2VuZCksCisgIHtQMjMsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDQyIH19ID0gcmVhZChQMjIsIGZpZWxkX2JlZ2luKSwKKyAge1AyNCwge29rLCB0cnVlfX0gPSByZWFkKFAyMywgYm9vbCksCisgIHtQMjUsIG9rfSA9IHJlYWQoUDI0LCBmaWVsZF9lbmQpLAorICB7UDI2LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfU1RPUH19ID0gcmVhZChQMjUsIGZpZWxkX2JlZ2luKSwKKyAge1AyNywgb2t9ID0gcmVhZChQMjYsIHN0cnVjdF9lbmQpLAorICB7UDI4LCBva30gPSByZWFkKFAyNywgbWVzc2FnZV9lbmQpLAorICB7UDI4LCBva30uCisKK25lc3RpbmdfdGVzdCgpIC0+CisgIHtvaywgUDB9ID0gbmV3KCksCisgIHtQMSwgb2t9ID0gd3JpdGUoUDAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfSksCisgIHtQMiwgb2t9ID0gd3JpdGUoUDEsICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fSksCisgIHtQMywgb2t9ID0gd3JpdGUoUDIsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDEiLCB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gMTR9KSwKKyAge1A0LCBva30gPSB3cml0ZShQMywge2Jvb2wsIHRydWV9KSwKKyAge1A1LCBva30gPSB3cml0ZShQNCwgZmllbGRfZW5kKSwKKworICB7UDYsIG9rfSA9IHdyaXRlKFA1LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQyIiwgdHlwZSA9ID90VHlwZV9TVFJVQ1QsIGlkID0gMjh9KSwKKyAge1A3LCBva30gPSB3cml0ZShQNiwgI3Byb3RvY29sX3N0cnVjdF9iZWdpbnt9KSwKKyAge1A4LCBva30gPSB3cml0ZShQNywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyBuYW1lID0gImZpZWxkMl8xIiwgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDMwMDAwfSksCisgIHtQOSwgb2t9ID0gd3JpdGUoUDgsIHtib29sLCBmYWxzZX0pLAorICB7UDEwLCBva30gPSB3cml0ZShQOSwgZmllbGRfZW5kKSwKKyAge1AxMSwgb2t9ID0gd3JpdGUoUDEwLCBmaWVsZF9zdG9wKSwKKyAge1AxMiwgb2t9ID0gd3JpdGUoUDExLCBzdHJ1Y3RfZW5kKSwKKyAge1AxMywgb2t9ID0gd3JpdGUoUDEyLCBmaWVsZF9lbmQpLAorCisgIHtQMTQsIG9rfSA9IHdyaXRlKFAxMywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyBuYW1lID0gImZpZWxkMyIsIHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSA0Mn0pLAorICB7UDE1LCBva30gPSB3cml0ZShQMTQsIHtib29sLCB0cnVlfSksCisgIHtQMTYsIG9rfSA9IHdyaXRlKFAxNSwgZmllbGRfZW5kKSwKKyAge1AxNywgb2t9ID0gd3JpdGUoUDE2LCBmaWVsZF9zdG9wKSwKKyAge1AxOCwgb2t9ID0gd3JpdGUoUDE3LCBzdHJ1Y3RfZW5kKSwKKyAge1AxOSwgb2t9ID0gd3JpdGUoUDE4LCBtZXNzYWdlX2VuZCksCisKKyAge1AyMCwgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57IG5hbWUgPSAiTWVzc2FnZTEiLCB0eXBlID0gP3RUeXBlX0k4LCBzZXFpZCA9IDN9fSA9IHJlYWQoUDE5LCBtZXNzYWdlX2JlZ2luKSwKKyAge1AyMSwgb2t9ID0gcmVhZChQMjAsIHN0cnVjdF9iZWdpbiksCisgIHtQMjIsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDE0IH19ID0gcmVhZChQMjEsIGZpZWxkX2JlZ2luKSwKKyAge1AyMywge29rLCB0cnVlfX0gPSByZWFkKFAyMiwgYm9vbCksCisgIHtQMjQsIG9rfSA9IHJlYWQoUDIzLCBmaWVsZF9lbmQpLAorCisgIHtQMjUsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9TVFJVQ1QsIGlkID0gMjggfX0gPSByZWFkKFAyNCwgZmllbGRfYmVnaW4pLAorICB7UDI2LCBva30gPSByZWFkKFAyNSwgc3RydWN0X2JlZ2luKSwKKyAge1AyNywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gMzAwMDAgfX0gPSByZWFkKFAyNiwgZmllbGRfYmVnaW4pLAorICB7UDI4LCB7b2ssIGZhbHNlfX0gPSByZWFkKFAyNywgYm9vbCksCisgIHtQMjksIG9rfSA9IHJlYWQoUDI4LCBmaWVsZF9lbmQpLAorICB7UDMwLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfU1RPUCB9fSA9IHJlYWQoUDI5LCBmaWVsZF9iZWdpbiksCisgIHtQMzEsIG9rfSA9IHJlYWQoUDMwLCBzdHJ1Y3RfZW5kKSwKKyAge1AzMiwgb2t9ID0gcmVhZChQMzEsIGZpZWxkX2VuZCksCisKKyAge1AzMywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gNDIgfX0gPSByZWFkKFAzMiwgZmllbGRfYmVnaW4pLAorICB7UDM0LCB7b2ssIHRydWV9fSA9IHJlYWQoUDMzLCBib29sKSwKKyAge1AzNSwgb2t9ID0gcmVhZChQMzQsIGZpZWxkX2VuZCksCisgIHtQMzYsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9TVE9QIH19ID0gcmVhZChQMzUsIGZpZWxkX2JlZ2luKSwKKyAge1AzNywgb2t9ID0gcmVhZChQMzYsIHN0cnVjdF9lbmQpLAorICB7UDM4LCBva30gPSByZWFkKFAzNywgbWVzc2FnZV9lbmQpLAorICB7UDM4LCBva30uCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfZmlsZV90cmFuc3BvcnQuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTVjMWQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LmVybApAQCAtMCwwICsxLDIxMyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfZmlsZV90cmFuc3BvcnQpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCisKK25ldyhGaWxlKSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6bmV3KEZpbGUpLgorbmV3KEZpbGUsIE9wdHMpIC0+IHRocmlmdF9maWxlX3RyYW5zcG9ydDpuZXcoRmlsZSwgT3B0cykuCisKK25ld190ZXN0XygpIC0+CisgIFsKKyAgICB7Im5ldyBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9maWxlX3RyYW5zcG9ydCwge3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfX19LAorICAgICAgbmV3KGFfZmFrZV9maWxlKQorICAgICl9LAorICAgIHsibmV3IGZpbGUgaW4gcmVhZCBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9maWxlX3RyYW5zcG9ydCwge3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHJlYWR9fX0sCisgICAgICBuZXcoYV9mYWtlX2ZpbGUsIFt7bW9kZSwgcmVhZH1dKQorICAgICl9LAorICAgIHsibmV3IGZpbGUgaW4gd3JpdGUgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfZmlsZV90cmFuc3BvcnQsIHt0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX19fSwKKyAgICAgIG5ldyhhX2Zha2VfZmlsZSwgW3ttb2RlLCB3cml0ZX1dKQorICAgICl9LAorICAgIHsibmV3IGZpbGUgaW4gc2hvdWxkX2Nsb3NlIHRydWUgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfZmlsZV90cmFuc3BvcnQsIHt0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX19fSwKKyAgICAgIG5ldyhhX2Zha2VfZmlsZSwgW3tzaG91bGRfY2xvc2UsIHRydWV9XSkKKyAgICApfSwKKyAgICB7Im5ldyBmaWxlIGluIHNob3VsZF9jbG9zZSBmYWxzZSBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9maWxlX3RyYW5zcG9ydCwge3RfZmlsZSwgYV9mYWtlX2ZpbGUsIGZhbHNlLCB3cml0ZX19fSwKKyAgICAgIG5ldyhhX2Zha2VfZmlsZSwgW3tzaG91bGRfY2xvc2UsIGZhbHNlfV0pCisgICAgKX0KKyAgXS4KKworCityZWFkKEZpbGUsIEJ5dGVzKSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6cmVhZChGaWxlLCBCeXRlcykuCisKK3JlYWRfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGZpbGUsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZmlsZSwgcmVhZCwgZnVuKEJpbiwgTikgLT4KKyAgICAgICAge1Jlc3VsdCwgX30gPSBzcGxpdF9iaW5hcnkoQmluLCBtaW4oaW9saXN0X3NpemUoQmluKSwgTikpLAorICAgICAgICB7b2ssIFJlc3VsdH0KKyAgICAgIGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGZpbGUpIGVuZCwKKyAgICBbCisgICAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIGVtcHR5IGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWQoe3RfZmlsZSwgPDw+PiwgdHJ1ZSwgcmVhZH0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBlbXB0eSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgICByZWFkKHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHJlYWR9LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWQoe3RfZmlsZSwgPDwiaGFsbG8gd29ybGQiPj4sIHRydWUsIHJlYWR9LCAwKQorICAgICAgKX0sCisgICAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8ImgiPj59fSwKKyAgICAgICAgcmVhZCh7dF9maWxlLCA8PCJoYWxsbyB3b3JsZCI+PiwgdHJ1ZSwgcmVhZH0sIDEpCisgICAgICApfSwKKyAgICAgIHsicmVhZCBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtvaywgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgcmVhZCh7dF9maWxlLCA8PCJoYWxsbyB3b3JsZCI+PiwgdHJ1ZSwgcmVhZH0sIDY1NTM2KQorICAgICAgKX0sCisgICAgICB7InJlYWQgMCBieXRlIGZyb20gZmlsZSBpbiB3cml0ZSBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtlcnJvciwgd3JpdGVfbW9kZX19LAorICAgICAgICByZWFkKHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHdyaXRlfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIGZpbGUgaW4gd3JpdGUgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIHdyaXRlX21vZGV9fSwKKyAgICAgICAgcmVhZCh7dF9maWxlLCA8PD4+LCB0cnVlLCB3cml0ZX0sIDEpCisgICAgICApfQorICAgIF0KKyAgfS4KKworCityZWFkX2V4YWN0KEZpbGUsIEJ5dGVzKSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6cmVhZF9leGFjdChGaWxlLCBCeXRlcykuCisKK3JlYWRfZXhhY3RfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGZpbGUsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZmlsZSwgcmVhZCwgZnVuKEJpbiwgTikgLT4KKyAgICAgICAge1Jlc3VsdCwgX30gPSBzcGxpdF9iaW5hcnkoQmluLCBtaW4oaW9saXN0X3NpemUoQmluKSwgTikpLAorICAgICAgICB7b2ssIFJlc3VsdH0KKyAgICAgIGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGZpbGUpIGVuZCwKKyAgICBbCisgICAgICB7InJlYWQgZXhhY3RseSB6ZXJvIGJ5dGVzIGZyb20gZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9maWxlLCA8PD4+LCB0cnVlLCByZWFkfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIGVvZn19LAorICAgICAgICByZWFkX2V4YWN0KHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHJlYWR9LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgZXhhY3RseSB6ZXJvIGJ5dGVzIGZyb20gbm9uZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9maWxlLCA8PCJoYWxsbyB3b3JsZCI+PiwgdHJ1ZSwgcmVhZH0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIG5vbmVtcHR5IGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PCJoIj4+fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3RfZmlsZSwgPDwiaGFsbG8gd29ybGQiPj4sIHRydWUsIHJlYWR9LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgZXhhY3RseSBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtlcnJvciwgZW9mfX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3RfZmlsZSwgPDwiaGFsbG8gd29ybGQiPj4sIHRydWUsIHJlYWR9LCA2NTUzNikKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGV4YWN0bHkgMCBieXRlIGZyb20gZmlsZSBpbiB3cml0ZSBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtlcnJvciwgd3JpdGVfbW9kZX19LAorICAgICAgICByZWFkX2V4YWN0KHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHdyaXRlfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gZmlsZSBpbiB3cml0ZSBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtlcnJvciwgd3JpdGVfbW9kZX19LAorICAgICAgICByZWFkX2V4YWN0KHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHdyaXRlfSwgMSkKKyAgICAgICl9CisgICAgXQorICB9LgorCisKK3dyaXRlKEZpbGUsIERhdGEpIC0+IHRocmlmdF9maWxlX3RyYW5zcG9ydDp3cml0ZShGaWxlLCBEYXRhKS4KKword3JpdGVfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGZpbGUsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZmlsZSwgd3JpdGUsIGZ1bihfLCBfKSAtPiBvayBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChmaWxlKSBlbmQsCisgICAgWworICAgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCBbXSkKKyAgICAgICl9LAorICAgICAgeyJ3cml0ZSBlbXB0eSBiaW5hcnkgdG8gZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCBva30sCisgICAgICAgIHdyaXRlKHt0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX0sIDw8Pj4pCisgICAgICApfSwKKyAgICAgIHsid3JpdGUgYSBsaXN0IHRvIGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCAiaGFsbG8gd29ybGQiKQorICAgICAgKX0sCisgICAgICB7IndyaXRlIGEgYmluYXJ5IHRvIGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCA8PCJoYWxsbyB3b3JsZCI+PikKKyAgICAgICl9LAorICAgICAgeyJ3cml0ZSBhIGJpbmFyeSB0byBmaWxlIGluIHJlYWQgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIHJlYWRfbW9kZX19LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgcmVhZH0sIDw8ImhhbGxvIHdvcmxkIj4+KQorICAgICAgKX0sCisgICAgICB7IndyaXRlIGEgbGlzdCB0byBmaWxlIGluIHJlYWQgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIHJlYWRfbW9kZX19LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgcmVhZH0sICJoYWxsbyB3b3JsZCIpCisgICAgICApfQorICAgIF0KKyAgfS4KKworCitmbHVzaChUcmFuc3BvcnQpIC0+IHRocmlmdF9maWxlX3RyYW5zcG9ydDpmbHVzaChUcmFuc3BvcnQpLgorCitmbHVzaF90ZXN0XygpIC0+CisgIHtzZXR1cCwKKyAgICBmdW4oKSAtPgorICAgICAgbWVjazpuZXcoZmlsZSwgW3Vuc3RpY2ssIHBhc3N0aHJvdWdoXSksCisgICAgICBtZWNrOmV4cGVjdChmaWxlLCBzeW5jLCBmdW4oX0ZpbGUpIC0+IG9rIGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGZpbGUpIGVuZCwKKyAgICBbCisgICAgICB7ImZsdXNoIGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgb2t9LAorICAgICAgICBmbHVzaCh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9KQorICAgICAgKX0KKyAgICBdCisgIH0uCisKKworY2xvc2UoVHJhbnNwb3J0KSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6Y2xvc2UoVHJhbnNwb3J0KS4KKworY2xvc2VfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGZpbGUsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZmlsZSwgY2xvc2UsIGZ1bihfKSAtPiBvayBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChmaWxlKSBlbmQsCisgICAgWworICAgICAgeyJjbG9zZSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX0sIG9rfSwKKyAgICAgICAgY2xvc2Uoe3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSkKKyAgICAgICl9CisgICAgXQorICB9LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTUzOGE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuZXJsCkBAIC0wLDAgKzEsNDA0IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0KS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworCituZXcoVHJhbnNwb3J0KSAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDpuZXcoVHJhbnNwb3J0KS4KKworbmV3X3Rlc3RfKCkgLT4KKyAgWworICAgIHsibmV3IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7dF90cmFuc3BvcnQsIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0LCB7dF9mcmFtZWQsCisgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgW119fSwKKyAgICAgICAgW10sCisgICAgICAgIFtdCisgICAgICB9fX0sCisgICAgICBuZXcoe3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCBbXX19KQorICAgICl9CisgIF0uCisKKworcmVhZChGcmFtZSwgQnl0ZXMpIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0OnJlYWQoRnJhbWUsIEJ5dGVzKS4KKworcmVhZF90ZXN0XygpIC0+CisgIFsKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIGFuIGVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIGFuIGVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge18sIHtlcnJvciwgZW9mfX0sCisgICAgICByZWFkKAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCB6ZXJvIGJ5dGVzIGZyb20gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PDAsIDAsIDAsIDExLCAiaGFsbG8gd29ybGQiPj4KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8Pj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8MCwgMCwgMCwgMTEsICJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDAKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICA8PCJhbGxvIHdvcmxkIj4+LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaCI+Pn0KKyAgICAgIH0sCisgICAgICByZWFkKAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLAorICAgICAgICAgICAgPDwwLCAwLCAwLCAxMSwgImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBub25lbXB0eSBidWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgPDwiYWxsbyB3b3JsZCI+PiwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8ImgiPj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICA8PD4+LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaGFsbG8gd29ybGQiPj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8MCwgMCwgMCwgMTEsICJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDY1NTM2CisgICAgICApCisgICAgKX0KKyAgXS4KKworCityZWFkX2V4YWN0KEZyYW1lLCBCeXRlcykgLT4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQ6cmVhZF9leGFjdChGcmFtZSwgQnl0ZXMpLgorCityZWFkX2V4YWN0X3Rlc3RfKCkgLT4KKyAgWworICAgIHsicmVhZCBleGFjdGx5IHplcm8gYnl0ZXMgZnJvbSBhbiBlbXB0eSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIDw8Pj4sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gYW4gZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge2Vycm9yLCBlb2Z9fSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLAorICAgICAgICAgICAgPDwwLCAwLCAwLCAxMSwgImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgPDw+PiwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8Pj59CisgICAgICB9LAorICAgICAgcmVhZF9leGFjdCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8MCwgMCwgMCwgMTEsICJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDAKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgZXhhY3RseSAxIGJ5dGUgZnJvbSBub25lbXB0eSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIDw8ImFsbG8gd29ybGQiPj4sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PDAsIDAsIDAsIDExLCAiaGFsbG8gd29ybGQiPj4KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gbm9uZW1wdHkgYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIDw8ImFsbG8gd29ybGQiPj4sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICA8PCJoYWxsbyB3b3JsZCI+PiwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbW10sPDwiaGFsbG8gd29ybGQiPj5dLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtlcnJvciwgZW9mfQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PDAsIDAsIDAsIDExLCAiaGFsbG8gd29ybGQiPj4KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICA2NTUzNgorICAgICAgKQorICAgICl9CisgIF0uCisKKword3JpdGUoRnJhbWVkLCBEYXRhKSAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDp3cml0ZShGcmFtZWQsIERhdGEpLgorCit3cml0ZV90ZXN0XygpIC0+CisgIFsKKyAgICB7IndyaXRlIGVtcHR5IGxpc3QgdG8gZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbW10sIFtdXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgW10KKyAgICAgICkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGxpc3QgdG8gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbWyJoYWxsbyB3b3JsZCJdLCBbXV0KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICB3cml0ZSgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFsiaGFsbG8gd29ybGQiXQorICAgICAgICB9LAorICAgICAgICBbXQorICAgICAgKQorICAgICl9LAorICAgIHsid3JpdGUgZW1wdHkgYmluYXJ5IHRvIGVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW1tdLCA8PD4+XQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgPDw+PgorICAgICAgKQorICAgICl9LAorICAgIHsid3JpdGUgZW1wdHkgYmluYXJ5IHRvIG5vbmVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW1siaGFsbG8gd29ybGQiXSwgPDw+Pl0KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICB3cml0ZSgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFsiaGFsbG8gd29ybGQiXQorICAgICAgICB9LAorICAgICAgICA8PD4+CisgICAgICApCisgICAgKX0KKyAgXS4KKworCitmbHVzaChUcmFuc3BvcnQpIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0OmZsdXNoKFRyYW5zcG9ydCkuCisKK2ZsdXNoX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiZmx1c2ggZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIG9rCisgICAgICB9LAorICAgICAgZmx1c2goe3RfZnJhbWVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgW10sCisgICAgICAgIFtdCisgICAgICB9KQorICAgICl9LAorICAgIHsiZmx1c2ggbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIFs8PD4+LCBbPDwwLCAwLCAwLCAxMT4+LCA8PCJoYWxsbyB3b3JsZCI+Pl1dCisgICAgICAgICAgfX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICBmbHVzaCh7dF9mcmFtZWQsCisgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICBbXSwKKyAgICAgICAgPDwiaGFsbG8gd29ybGQiPj4KKyAgICAgIH0pCisgICAgKX0KKyAgXS4KKworCitjbG9zZShUcmFuc3BvcnQpIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0OmNsb3NlKFRyYW5zcG9ydCkuCisKK2Nsb3NlX3Rlc3RfKCkgLT4KKyAgeyJjbG9zZSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICB7e3RfZnJhbWVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgW10sCisgICAgICAgIFtdCisgICAgICB9LAorICAgICAgb2sKKyAgICB9LAorICAgIGNsb3NlKHt0X2ZyYW1lZCwKKyAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgW10sCisgICAgICBbXQorICAgIH0pCisgICl9LgorCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4OWM3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LmVybApAQCAtMCwwICsxLDE2NyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCkuCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKworbmV3KCkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KCkuCituZXcoRGF0YSkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KERhdGEpLgorCituZXdfdGVzdF8oKSAtPgorICBbCisgICAgeyJuZXcgZW1wdHkgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIF8sIHt0X21lbWJ1ZmZlciwgW119fX0sCisgICAgICBuZXcoKQorICAgICl9LAorICAgIHsibmV3IG1lbWJ1ZmZlciB3aXRoIDw8Pj4iLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgXywge3RfbWVtYnVmZmVyLCBbPDw+Pl19fX0sCisgICAgICBuZXcoPDw+PikKKyAgICApfSwKKyAgICB7Im5ldyBtZW1idWZmZXIgd2l0aCBbXSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCBfLCB7dF9tZW1idWZmZXIsIFtdfX19LAorICAgICAgbmV3KFtdKQorICAgICl9LAorICAgIHsibmV3IG1lbWJ1ZmZlciB3aXRoIDw8XCJoYWxsbyB3b3JsZFwiPj4iLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgXywge3RfbWVtYnVmZmVyLCBbPDwiaGFsbG8gd29ybGQiPj5dfX19LAorICAgICAgbmV3KDw8ImhhbGxvIHdvcmxkIj4+KQorICAgICl9LAorICAgIHsibmV3IG1lbWJ1ZmZlciB3aXRoIFwiaGFsbG8gd29ybGRcIiIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCBfLCB7dF9tZW1idWZmZXIsICJoYWxsbyB3b3JsZCJ9fX0sCisgICAgICBuZXcoImhhbGxvIHdvcmxkIikKKyAgICApfQorICBdLgorCisKK3JlYWQoTWVtYnVmZmVyLCBCeXRlcykgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6cmVhZChNZW1idWZmZXIsIEJ5dGVzKS4KKworcmVhZF90ZXN0XygpIC0+CisgIFsKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIGFuIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICByZWFkKHt0X21lbWJ1ZmZlciwgW119LCAwKQorICAgICl9LAorICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBhbiBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgcmVhZCh7dF9tZW1idWZmZXIsIFtdfSwgMSkKKyAgICApfSwKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn0sIHtvaywgPDw+Pn19LAorICAgICAgcmVhZCh7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCAwKQorICAgICl9LAorICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBub25lbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgPDwiYWxsbyB3b3JsZCI+Pn0sIHtvaywgPDwiaCI+Pn19LAorICAgICAgcmVhZCh7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCAxKQorICAgICl9LAorICAgIHsicmVhZCBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBidWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgPDw+Pn0sIHtvaywgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgIHJlYWQoe3RfbWVtYnVmZmVyLCBbWyJoYWxsbyIsICIgIl0sICJ3b3JsZCJdfSwgNjU1MzYpCisgICAgKX0KKyAgXS4KKworCityZWFkX2V4YWN0KE1lbWJ1ZmZlciwgQnl0ZXMpIC0+CisgIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OnJlYWRfZXhhY3QoTWVtYnVmZmVyLCBCeXRlcykuCisKK3JlYWRfZXhhY3RfdGVzdF8oKSAtPgorICBbCisgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIGFuIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICByZWFkX2V4YWN0KHt0X21lbWJ1ZmZlciwgW119LCAwKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIGFuIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge2Vycm9yLCBlb2Z9fSwKKyAgICAgIHJlYWRfZXhhY3Qoe3RfbWVtYnVmZmVyLCBbXX0sIDEpCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn0sIHtvaywgPDw+Pn19LAorICAgICAgcmVhZF9leGFjdCh7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCAwKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCA8PCJhbGxvIHdvcmxkIj4+fSwge29rLCA8PCJoIj4+fX0sCisgICAgICByZWFkX2V4YWN0KHt0X21lbWJ1ZmZlciwgW1siaGFsbG8iLCAiICJdLCAid29ybGQiXX0sIDEpCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCB7ZXJyb3IsIGVvZn19LAorICAgICAgcmVhZF9leGFjdCh7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCA2NTUzNikKKyAgICApfQorICBdLgorCisKK3dyaXRlKE1lbWJ1ZmZlciwgRGF0YSkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6d3JpdGUoTWVtYnVmZmVyLCBEYXRhKS4KKword3JpdGVfdGVzdF8oKSAtPgorICBbCisgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbW10sIFtdXX0sIG9rfSwKKyAgICAgIHdyaXRlKHt0X21lbWJ1ZmZlciwgW119LCBbXSkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGxpc3QgdG8gbm9uZW1wdHkgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9tZW1idWZmZXIsIFsiaGFsbG8gd29ybGQiLCBbXV19LCBva30sCisgICAgICB3cml0ZSh7dF9tZW1idWZmZXIsICJoYWxsbyB3b3JsZCJ9LCBbXSkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGJpbmFyeSB0byBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgW1tdLCA8PD4+XX0sIG9rfSwKKyAgICAgIHdyaXRlKHt0X21lbWJ1ZmZlciwgW119LCA8PD4+KQorICAgICl9LAorICAgIHsid3JpdGUgZW1wdHkgYmluYXJ5IHRvIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbImhhbGxvIHdvcmxkIiwgPDw+Pl19LCBva30sCisgICAgICB3cml0ZSh7dF9tZW1idWZmZXIsICJoYWxsbyB3b3JsZCJ9LCA8PD4+KQorICAgICl9LAorICAgIHsid3JpdGUgYSBsaXN0IHRvIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbW10sICJoYWxsbyB3b3JsZCJdfSwgb2t9LAorICAgICAgd3JpdGUoe3RfbWVtYnVmZmVyLCBbXX0sICJoYWxsbyB3b3JsZCIpCisgICAgKX0sCisgICAgeyJ3cml0ZSBhIGxpc3QgdG8gbm9uZW1wdHkgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCBva30sCisgICAgICB3cml0ZSh7dF9tZW1idWZmZXIsIFsiaGFsbG8iLCAiICJdfSwgIndvcmxkIikKKyAgICApfSwKKyAgICB7IndyaXRlIGEgYmluYXJ5IHRvIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbW10sIDw8ImhhbGxvIHdvcmxkIj4+XX0sIG9rfSwKKyAgICAgIHdyaXRlKHt0X21lbWJ1ZmZlciwgW119LCA8PCJoYWxsbyB3b3JsZCI+PikKKyAgICApfSwKKyAgICB7IndyaXRlIGEgYmluYXJ5IHRvIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbWyJoYWxsbyIsICIgIl0sIDw8IndvcmxkIj4+XX0sIG9rfSwKKyAgICAgIHdyaXRlKHt0X21lbWJ1ZmZlciwgWyJoYWxsbyIsICIgIl19LCA8PCJ3b3JsZCI+PikKKyAgICApfQorICBdLgorCisKK2ZsdXNoKFRyYW5zcG9ydCkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6Zmx1c2goVHJhbnNwb3J0KS4KKworZmx1c2hfdGVzdF8oKSAtPgorICBbCisgICAgeyJmbHVzaCBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgW119LCBva30sCisgICAgICBmbHVzaCh7dF9tZW1idWZmZXIsIFtdfSkKKyAgICApfSwKKyAgICB7ImZsdXNoIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbPDwiaGFsbG8gd29ybGQiPj5dfSwgb2t9LAorICAgICAgZmx1c2goe3RfbWVtYnVmZmVyLCBbPDwiaGFsbG8gd29ybGQiPj5dfSkKKyAgICApfQorICBdLgorCisKK2Nsb3NlKFRyYW5zcG9ydCkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6Y2xvc2UoVHJhbnNwb3J0KS4KKworY2xvc2VfdGVzdF8oKSAtPgorICB7ImNsb3NlIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAge3t0X21lbWJ1ZmZlciwgX30sIG9rfSwKKyAgICBjbG9zZSh7dF9tZW1idWZmZXIsIFtdfSkKKyAgKX0uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYzBmMjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfc29ja2V0X3RyYW5zcG9ydC5lcmwKQEAgLTAsMCArMSwxOTkgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRlc3RfdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCisKK25ldyhTb2NrZXQpIC0+IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0Om5ldyhTb2NrZXQpLgorbmV3KFNvY2tldCwgT3B0cykgLT4gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2tldCwgT3B0cykuCisKK25ld190ZXN0XygpIC0+CisgIFsKKyAgICB7Im5ldyBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQsIHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfX19LAorICAgICAgbmV3KGFfZmFrZV9zb2NrZXQpCisgICAgKX0sCisgICAgeyJuZXcgc29ja2V0IHdpdGggbm8gb3B0aW9ucyIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydCwge3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119fX0sCisgICAgICBuZXcoYV9mYWtlX3NvY2tldCwgW10pCisgICAgKX0sCisgICAgeyJuZXcgc29ja2V0IHdpdGggaW50ZWdlciB0aW1lb3V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0LCB7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDUwMDAsIFtdfX19LAorICAgICAgbmV3KGFfZmFrZV9zb2NrZXQsIFt7cmVjdl90aW1lb3V0LCA1MDAwfV0pCisgICAgKX0sCisgICAgeyJuZXcgc29ja2V0IHdpdGggaW5maW5pdHkgdGltZW91dCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydCwge3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCBpbmZpbml0eSwgW119fX0sCisgICAgICBuZXcoYV9mYWtlX3NvY2tldCwgW3tyZWN2X3RpbWVvdXQsIGluZmluaXR5fV0pCisgICAgKX0KKyAgXS4KKworCityZWFkKFNvY2tldCwgQnl0ZXMpIC0+IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0OnJlYWQoU29ja2V0LCBCeXRlcykuCisKK3JlYWRfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGdlbl90Y3AsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZ2VuX3RjcCwgcmVjdiwgZnVuKEJpbiwgMCwgXykgLT4ge29rLCBCaW59IGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGdlbl90Y3ApIGVuZCwKKyAgICBbCisgICAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIGVtcHR5IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZCh7dF9zb2NrZXQsIDw8Pj4sIDYwMDAwLCBbXX0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBlbXB0eSBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWQoe3Rfc29ja2V0LCA8PD4+LCA2MDAwMCwgW119LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIF99LCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZCh7dF9zb2NrZXQsIDw8ImhhbGxvIHdvcmxkIj4+LCA2MDAwMCwgW119LCAwKQorICAgICAgKX0sCisgICAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgPDwiYWxsbyB3b3JsZCI+Pn0sIHtvaywgPDwiaCI+Pn19LAorICAgICAgICByZWFkKHt0X3NvY2tldCwgPDwiaGFsbG8gd29ybGQiPj4sIDYwMDAwLCBbXX0sIDEpCisgICAgICApfSwKKyAgICAgIHsicmVhZCBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCA8PD4+fSwge29rLCA8PCJoYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICByZWFkKHt0X3NvY2tldCwgPDwiaGFsbG8gd29ybGQiPj4sIDYwMDAwLCBbXX0sIDY1NTM2KQorICAgICAgKX0sCisgICAgICB7InJlYWQgMSBieXRlIGZyb20gcHJldmlvdXNseSBidWZmZXJlZCBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCA8PCJhbGxvIj4+fSwge29rLCA8PCJoIj4+fX0sCisgICAgICAgIHJlYWQoe3Rfc29ja2V0LCA8PCIgd29ybGQiPj4sIDYwMDAwLCA8PCJoYWxsbyI+Pn0sIDEpCisgICAgICApfSwKKyAgICAgIHsicmVhZCA2IGJ5dGUgZnJvbSBwcmV2aW91c2x5IGJ1ZmZlcmVkIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIDw8IndvcmxkIj4+fSwge29rLCA8PCJoYWxsbyAiPj59fSwKKyAgICAgICAgcmVhZCh7dF9zb2NrZXQsIDw8IiB3b3JsZCI+PiwgNjAwMDAsIDw8ImhhbGxvIj4+fSwgNikKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGEgemlsbGlvbiBieXRlcyBmcm9tIHByZXZpb3VzbHkgYnVmZmVyZWQgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgPDw+Pn0sIHtvaywgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgcmVhZCh7dF9zb2NrZXQsIDw8IiB3b3JsZCI+PiwgNjAwMDAsIDw8ImhhbGxvIj4+fSwgNjU1MzYpCisgICAgICApfQorICAgIF0KKyAgfS4KKworCityZWFkX2V4YWN0KFNvY2tldCwgQnl0ZXMpIC0+IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0OnJlYWRfZXhhY3QoU29ja2V0LCBCeXRlcykuCisKK3JlYWRfZXhhY3RfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGdlbl90Y3AsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZ2VuX3RjcCwgcmVjdiwgZnVuKEJpbiwgTiwgXykgLT4KKyAgICAgICAgY2FzZSBOIG9mCisgICAgICAgICAgMCAtPiB7b2ssIEJpbn07CisgICAgICAgICAgMSAtPiB7b2ssIDw8ImgiPj59OworICAgICAgICAgIE4gd2hlbiBOID4gMiAtPiB7ZXJyb3IsIHRpbWVvdXR9CisgICAgICAgIGVuZAorICAgICAgZW5kKSwKKyAgICAgIG1lY2s6ZXhwZWN0KGdlbl90Y3AsIGNsb3NlLCBmdW4oXykgLT4gb2sgZW5kKQorICAgIGVuZCwKKyAgICBmdW4oXykgLT4gbWVjazp1bmxvYWQoZ2VuX3RjcCkgZW5kLAorICAgIFsKKyAgICAgIHsicmVhZF9leGFjdCB6ZXJvIGJ5dGVzIGZyb20gZW1wdHkgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgICByZWFkX2V4YWN0KHt0X3NvY2tldCwgPDw+PiwgNjAwMDAsIFtdfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkX2V4YWN0IHplcm8gYnl0ZXMgZnJvbSBub25lbXB0eSBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCBffSwge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3Rfc29ja2V0LCA8PCJoYWxsbyB3b3JsZCI+PiwgNjAwMDAsIFtdfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkX2V4YWN0IDEgYnl0ZSBmcm9tIG5vbmVtcHR5IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIFtdfSwge29rLCA8PCJoIj4+fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3Rfc29ja2V0LCA8PCJoYWxsbyB3b3JsZCI+PiwgNjAwMDAsIFtdfSwgMSkKKyAgICAgICl9LAorICAgICAgeyJyZWFkX2V4YWN0IGEgemlsbGlvbiBieXRlcyBmcm9tIG5vbmVtcHR5IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIFtdfSwge2Vycm9yLCB0aW1lb3V0fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3Rfc29ja2V0LCA8PCJoYWxsbyB3b3JsZCI+PiwgNjAwMDAsIFtdfSwgNjU1MzYpCisgICAgICApfSwKKyAgICAgIHsicmVhZF9leGFjdCAxIGJ5dGUgZnJvbSBwcmV2aW91c2x5IGJ1ZmZlcmVkIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIDw8ImFsbG8iPj59LCB7b2ssIDw8ImgiPj59fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9zb2NrZXQsIDw8IiB3b3JsZCI+PiwgNjAwMDAsIDw8ImhhbGxvIj4+fSwgMSkKKyAgICAgICl9LAorICAgICAgeyJyZWFkX2V4YWN0IDYgYnl0ZSBmcm9tIHByZXZpb3VzbHkgYnVmZmVyZWQgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgW119LCB7b2ssIDw8Im1vcmUgaCI+Pn19LAorICAgICAgICByZWFkX2V4YWN0KHt0X3NvY2tldCwgPDwiaGFsbG8iPj4sIDYwMDAwLCA8PCJtb3JlICI+Pn0sIDYpCisgICAgICApfSwKKyAgICAgIHsicmVhZF9leGFjdCBhIHppbGxpb24gYnl0ZXMgZnJvbSBwcmV2aW91c2x5IGJ1ZmZlcmVkIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIDw8ImhhbGxvIj4+fSwge2Vycm9yLCB0aW1lb3V0fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3Rfc29ja2V0LCA8PCIgd29ybGQiPj4sIDYwMDAwLCA8PCJoYWxsbyI+Pn0sIDY1NTM2KQorICAgICAgKX0KKyAgICBdCisgIH0uCisKKword3JpdGUoU29ja2V0LCBEYXRhKSAtPiB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDp3cml0ZShTb2NrZXQsIERhdGEpLgorCit3cml0ZV90ZXN0XygpIC0+CisgIHtzZXR1cCwKKyAgICBmdW4oKSAtPgorICAgICAgbWVjazpuZXcoZ2VuX3RjcCwgW3Vuc3RpY2ssIHBhc3N0aHJvdWdoXSksCisgICAgICBtZWNrOmV4cGVjdChnZW5fdGNwLCBzZW5kLCBmdW4oXywgXykgLT4gb2sgZW5kKQorICAgIGVuZCwKKyAgICBmdW4oXykgLT4gbWVjazp1bmxvYWQoZ2VuX3RjcCkgZW5kLAorICAgIFsKKyAgICAgIHsid3JpdGUgZW1wdHkgbGlzdCB0byBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCBva30sCisgICAgICAgIHdyaXRlKHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSwgW10pCisgICAgICApfSwKKyAgICAgIHsid3JpdGUgZW1wdHkgYmluYXJ5IHRvIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0sIG9rfSwKKyAgICAgICAgd3JpdGUoe3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCA8PD4+KQorICAgICAgKX0sCisgICAgICB7IndyaXRlIGEgbGlzdCB0byBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCBva30sCisgICAgICAgIHdyaXRlKHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSwgImhhbGxvIHdvcmxkIikKKyAgICAgICl9LAorICAgICAgeyJ3cml0ZSBhIGJpbmFyeSB0byBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCBva30sCisgICAgICAgIHdyaXRlKHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSwgPDwiaGFsbG8gd29ybGQiPj4pCisgICAgICApfQorICAgIF0KKyAgfS4KKworCitmbHVzaChUcmFuc3BvcnQpIC0+IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0OmZsdXNoKFRyYW5zcG9ydCkuCisKK2ZsdXNoX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiZmx1c2ggc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0sIG9rfSwKKyAgICAgIGZsdXNoKHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSkKKyAgICApfQorICBdLgorCisKK2Nsb3NlKFRyYW5zcG9ydCkgLT4gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6Y2xvc2UoVHJhbnNwb3J0KS4KKworY2xvc2VfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGdlbl90Y3AsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZ2VuX3RjcCwgY2xvc2UsIGZ1bihfKSAtPiBvayBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChnZW5fdGNwKSBlbmQsCisgICAgWworICAgICAgeyJjbG9zZSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCBva30sCisgICAgICAgIGNsb3NlKHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSkKKyAgICAgICl9CisgICAgXQorICB9LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90aHJpZnRfc29ja2V0X3NlcnZlcl90ZXN0LmVybCBiL2xpYi9lcmwvdGVzdC90aHJpZnRfc29ja2V0X3NlcnZlcl90ZXN0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODE4Yjg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3RocmlmdF9zb2NrZXRfc2VydmVyX3Rlc3QuZXJsCkBAIC0wLDAgKzEsNDkgQEAKKy1tb2R1bGUgKHRocmlmdF9zb2NrZXRfc2VydmVyX3Rlc3QpLgorCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKy1pbmNsdWRlICgidGhyaWZ0X2NvbnN0YW50cy5ocmwiKS4KKworcGFyc2VfaGFuZGxlcl9vcHRpb25zX3Rlc3RfKCkgLT4KKyAgICBDb3JyZWN0U2VydmljZUhhbmRsZXJPcHRpb25MaXN0ID0gW3s/TVVMVElQTEVYRURfRVJST1JfSEFORExFUl9LRVksID9NT0RVTEV9LCB7IlNlcnZpY2UxIiwgP01PRFVMRX0sIHsiU2VydmljZTIiLCA/TU9EVUxFfV0sCisgICAgTWlzc2luZ0Vycm9ySGFuZGxlck9wdGlvbkxpc3QgICA9IFt7IlNlcnZpY2UxIiwgP01PRFVMRX0sIHsiU2VydmljZTIiLCA/TU9EVUxFfV0sCisgICAgV3JvbmdTZXJ2aWNlMkhhbmRsZXJPcHRpb25MaXN0ICA9IFt7P01VTFRJUExFWEVEX0VSUk9SX0hBTkRMRVJfS0VZLCA/TU9EVUxFfSwgeyJTZXJ2aWNlMSIsID9NT0RVTEV9LCB7IlNlcnZpY2UyIiwgIk1vZHVsZSJ9XSwKKyAgICBXcm9uZ1NlcnZpY2VLZXlPcHRpb25MaXN0ICAgICAgID0gW3s/TVVMVElQTEVYRURfRVJST1JfSEFORExFUl9LRVksID9NT0RVTEV9LCB7J3NlcnZpY2UxJywgP01PRFVMRX0sIHsiU2VydmljZTIiLCA/TU9EVUxFfV0sCisgICAgQ29ycmVjdEhhbmRsZXJUZXN0RnVuY3Rpb24gPSBmdW4oKSAtPgorICAgICAgICA/YXNzZXJ0TWF0Y2goe3RocmlmdF9zb2NrZXRfc2VydmVyLF8sXyxfLF8sXyxfLF8sXyxfLF8sXyxfLF99LCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgQ29ycmVjdFNlcnZpY2VIYW5kbGVyT3B0aW9uTGlzdH1dKSksCisgICAgICAgIHt0aHJpZnRfc29ja2V0X3NlcnZlcixfLF8sIEhhbmRsZXJMaXN0LF8sXyxfLF8sXyxfLF8sXyxfLF99ID0gdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIENvcnJlY3RTZXJ2aWNlSGFuZGxlck9wdGlvbkxpc3R9XSksCisgICAgICAgIGxpc3RzOmZvcmVhY2goZnVuCisgICAgICAgICAgICAoe1NlcnZpY2VOYW1lLCBIYW5kbGVyTW9kdWxlfSkgLT4KKyAgICAgICAgICAgICAgICA/YXNzZXJ0TWF0Y2goe29rLCBIYW5kbGVyTW9kdWxlfSB3aGVuIGlzX2F0b20oSGFuZGxlck1vZHVsZSksIHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpmaW5kKFNlcnZpY2VOYW1lLCBIYW5kbGVyTGlzdCkpCisgICAgICAgIGVuZCwgQ29ycmVjdFNlcnZpY2VIYW5kbGVyT3B0aW9uTGlzdCkKKyAgICBlbmQsCisgICAgWworICAgICB7IkJhZCBhcmd1bWVudCBmb3IgdGhlIGhhbmRsZXIgb3B0aW9uIiwgP19hc3NlcnRUaHJvdyhfLCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgW119XSkpfSwKKyAgICAgeyJUcnkgdG8gcGFyc2UgdGhlIGhhbmRsZXIgb3B0aW9uIHR3aWNlIiwgP19hc3NlcnRUaHJvdyhfLCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgP01PRFVMRX0sIHtoYW5kbGVyLCBDb3JyZWN0U2VydmljZUhhbmRsZXJPcHRpb25MaXN0fV0pKX0sCisgICAgIHsiUGFyc2UgdGhlIGhhbmRsZXIgb3B0aW9uIGFzIGEgbm9uIG11bHRpcGxleGVkIHNlcnZpY2UgaGFuZGxlciIsID9fYXNzZXJ0TWF0Y2goe3RocmlmdF9zb2NrZXRfc2VydmVyLF8sXyw/TU9EVUxFLF8sXyxfLF8sXyxfLF8sXyxfLF99LCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgP01PRFVMRX1dKSl9LAorICAgICB7Ik5vIGVycm9yIGhhbmRsZXIgd2FzIGRlZmluZWQiLCA/X2Fzc2VydFRocm93KF8sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3toYW5kbGVyLCBNaXNzaW5nRXJyb3JIYW5kbGVyT3B0aW9uTGlzdH1dKSl9LAorICAgICB7IkJhZCBoYW5kbGVyIG1vZHVsZSBmb3IgU2VydmljZTIiLCA/X2Fzc2VydFRocm93KF8sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3toYW5kbGVyLCBXcm9uZ1NlcnZpY2UySGFuZGxlck9wdGlvbkxpc3R9XSkpfSwKKyAgICAgeyJCYWQgc2VydmljZSBrZXkgZm9yIFNlcnZpY2UxIiwgP19hc3NlcnRUaHJvdyhfLCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgV3JvbmdTZXJ2aWNlS2V5T3B0aW9uTGlzdH1dKSl9LAorICAgICB7IlRyeSB0byBwYXJzZSBhIGNvcnJlY3QgaGFuZGxlciBvcHRpb24gbGlzdCIsIENvcnJlY3RIYW5kbGVyVGVzdEZ1bmN0aW9ufQorICAgIF0uCisKK3BhcnNlX3NlcnZpY2Vfb3B0aW9uc190ZXN0XygpIC0+CisgICAgQ29ycmVjdFNlcnZpY2VNb2R1bGVPcHRpb25MaXN0ID0gW3siU2VydmljZTEiLCA/TU9EVUxFfSwgeyJTZXJ2aWNlMiIsID9NT0RVTEV9XSwKKyAgICBXcm9uZ1NlcnZpY2UyTW9kdWxlT3B0aW9uTGlzdCAgPSBbeyJTZXJ2aWNlMSIsID9NT0RVTEV9LCB7IlNlcnZpY2UyIiwgInRocmlmdF9zZXJ2aWNlX21vZHVsZSJ9XSwKKyAgICBXcm9uZ1NlcnZpY2VLZXlPcHRpb25MaXN0ICAgICAgID0gW3snc2VydmljZTEnLCA/TU9EVUxFfSwgeyJTZXJ2aWNlMiIsID9NT0RVTEV9XSwKKyAgICBDb3JyZWN0U2VydmljZU1vZHVsZVRlc3RGdW5jdGlvbiA9IGZ1bigpIC0+CisgICAgICAgID9hc3NlcnRNYXRjaCh7dGhyaWZ0X3NvY2tldF9zZXJ2ZXIsXyxfLF8sXyxfLF8sXyxfLF8sXyxfLF8sX30sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCBDb3JyZWN0U2VydmljZU1vZHVsZU9wdGlvbkxpc3R9XSkpLAorICAgICAgICB7dGhyaWZ0X3NvY2tldF9zZXJ2ZXIsXywgU2VydmljZU1vZHVsZUxpc3QsXyxfLF8sXyxfLF8sXyxfLF8sXyxffSA9IHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCBDb3JyZWN0U2VydmljZU1vZHVsZU9wdGlvbkxpc3R9XSksCisgICAgICAgIGxpc3RzOmZvcmVhY2goZnVuCisgICAgICAgICAgICAoe1NlcnZpY2VOYW1lLCBTZXJ2aWNlTW9kdWxlfSkgLT4KKyAgICAgICAgICAgICAgICA/YXNzZXJ0TWF0Y2goe29rLCBTZXJ2aWNlTW9kdWxlfSB3aGVuIGlzX2F0b20oU2VydmljZU1vZHVsZSksIHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpmaW5kKFNlcnZpY2VOYW1lLCBTZXJ2aWNlTW9kdWxlTGlzdCkpCisgICAgICAgIGVuZCwgQ29ycmVjdFNlcnZpY2VNb2R1bGVPcHRpb25MaXN0KQorICAgIGVuZCwKKyAgICBbCisgICAgIHsiQmFkIGFyZ3VtZW50IGZvciB0aGUgc2VydmljZSBvcHRpb24iLCA/X2Fzc2VydFRocm93KF8sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCBbXX1dKSl9LAorICAgICB7IlRyeSB0byBwYXJzZSB0aGUgc2VydmljZSBvcHRpb24gdHdpY2UiLCA/X2Fzc2VydFRocm93KF8sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCA/TU9EVUxFfSwge3NlcnZpY2UsIENvcnJlY3RTZXJ2aWNlTW9kdWxlT3B0aW9uTGlzdH1dKSl9LAorICAgICB7IlBhcnNlIGEgc2VydmljZSBtb2R1bGUgZm9yIGEgbm9uIG11bHRpcGxleGVkIHNlcnZpY2UiLCA/X2Fzc2VydE1hdGNoKHt0aHJpZnRfc29ja2V0X3NlcnZlcixfLD9NT0RVTEUsXyxfLF8sXyxfLF8sXyxfLF8sXyxffSwgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe3NlcnZpY2UsID9NT0RVTEV9XSkpfSwKKyAgICAgeyJCYWQgc2VydmljZSBtb2R1bGUgZm9yIFNlcnZpY2UyIiwgP19hc3NlcnRUaHJvdyhfLCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgV3JvbmdTZXJ2aWNlMk1vZHVsZU9wdGlvbkxpc3R9XSkpfSwKKyAgICAgeyJCYWQgc2VydmljZSBrZXkgZm9yIFNlcnZpY2UxIiwgP19hc3NlcnRUaHJvdyhfLCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgV3JvbmdTZXJ2aWNlS2V5T3B0aW9uTGlzdH1dKSl9LAorICAgICB7IlRyeSB0byBwYXJzZSBhIGNvcnJlY3Qgc2VydmljZSBvcHRpb24gbGlzdCIsIENvcnJlY3RTZXJ2aWNlTW9kdWxlVGVzdEZ1bmN0aW9ufQorICAgIF0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGhyaWZ0X3Rlc3RfdGVzdC5lcmwgYi9saWIvZXJsL3Rlc3QvdGhyaWZ0X3Rlc3RfdGVzdC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkZjYxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90aHJpZnRfdGVzdF90ZXN0LmVybApAQCAtMCwwICsxLDY0MyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKyUgZG9uJ3QgcmVuYW1lIHRoaXMgdGhyaWZ0X3Rlc3QsIGl0IGNsb2JiZXJzIGdlbmVyYXRlZCBmaWxlcworLW1vZHVsZSh0aHJpZnRfdGVzdF90ZXN0KS4KKy1jb21waWxlKGV4cG9ydF9hbGwpLgorCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKy1pbmNsdWRlKCJnZW4tZXJsL3RocmlmdF90ZXN0X2NvbnN0YW50cy5ocmwiKS4KKworY29uc3RhbnRfdGVzdF8oKSAtPgorICBbCisgICAgeyJteU51bWJlcnogZXF1YWxzIDEiLCA/X2Fzc2VydEVxdWFsKDEsID9USFJJRlRfVEVTVF9NWU5VTUJFUlopfQorICBdLgorCityZWNvcmRfZ2VuZXJhdGlvbl90ZXN0XygpIC0+CisgIFsKKyAgICB7IkJvbmsgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuQm9uaycsIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5Cb25rJ3ttZXNzYWdlPW51bGwsdHlwZT1udWxsfQorICAgICl9LAorICAgIHsiQm9vbHMgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuQm9vbHMnLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuQm9vbHMne2ltX3RydWU9bnVsbCxpbV9mYWxzZT1udWxsfQorICAgICl9LAorICAgIHsiWHRydWN0IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Llh0cnVjdCcsIF8sIF8sIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5YdHJ1Y3Qne3N0cmluZ190aGluZz1udWxsLGJ5dGVfdGhpbmc9bnVsbCxpMzJfdGhpbmc9bnVsbCxpNjRfdGhpbmc9bnVsbH0KKyAgICApfSwKKyAgICB7Ilh0cnVjdDIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuWHRydWN0MicsIF8sIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5YdHJ1Y3QyJ3tieXRlX3RoaW5nPW51bGwsc3RydWN0X3RoaW5nPW51bGwsaTMyX3RoaW5nPW51bGx9CisgICAgKX0sCisgICAgeyJYdHJ1Y3QzIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Llh0cnVjdDMnLCBfLCBfLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuWHRydWN0Myd7c3RyaW5nX3RoaW5nPW51bGwsY2hhbmdlZD1udWxsLGkzMl90aGluZz1udWxsLGk2NF90aGluZz1udWxsfQorICAgICl9LAorICAgIHsiSW5zYW5pdHkgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuSW5zYW5pdHknLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuSW5zYW5pdHkne3VzZXJNYXA9bnVsbCx4dHJ1Y3RzPW51bGx9CisgICAgKX0sCisgICAgeyJDcmF6eU5lc3RpbmcgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuQ3JhenlOZXN0aW5nJywgXywgXywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0LkNyYXp5TmVzdGluZyd7CisgICAgICAgIHN0cmluZ19maWVsZD1udWxsLAorICAgICAgICBzZXRfZmllbGQ9bnVsbCwKKyAgICAgICAgbGlzdF9maWVsZD1udWxsLAorICAgICAgICBiaW5hcnlfZmllbGQ9bnVsbAorICAgICAgfQorICAgICl9LAorICAgIHsiWGNlcHRpb24gcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuWGNlcHRpb24nLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuWGNlcHRpb24ne2Vycm9yQ29kZT1udWxsLG1lc3NhZ2U9bnVsbH0KKyAgICApfSwKKyAgICB7IlhjZXB0aW9uMiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5YY2VwdGlvbjInLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuWGNlcHRpb24yJ3tlcnJvckNvZGU9bnVsbCxzdHJ1Y3RfdGhpbmc9bnVsbH0KKyAgICApfSwKKyAgICB7IkVtcHR5U3RydWN0IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goeyd0aHJpZnQudGVzdC5FbXB0eVN0cnVjdCd9LCAjJ3RocmlmdC50ZXN0LkVtcHR5U3RydWN0J3t9KX0sCisgICAgeyJPbmVGaWVsZCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKHsndGhyaWZ0LnRlc3QuT25lRmllbGQnLCBffSwgIyd0aHJpZnQudGVzdC5PbmVGaWVsZCd7ZmllbGQ9bnVsbH0pfSwKKyAgICB7IlZlcnNpb25pbmdUZXN0VjEgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuVmVyc2lvbmluZ1Rlc3RWMScsIF8sIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5WZXJzaW9uaW5nVGVzdFYxJ3tiZWdpbl9pbl9ib3RoPW51bGwsb2xkX3N0cmluZz1udWxsLGVuZF9pbl9ib3RoPW51bGx9CisgICAgKX0sCisgICAgeyJWZXJzaW9uaW5nVGVzdFYyIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjInLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuVmVyc2lvbmluZ1Rlc3RWMid7CisgICAgICAgIGJlZ2luX2luX2JvdGg9bnVsbCwKKyAgICAgICAgbmV3aW50PW51bGwsCisgICAgICAgIG5ld2J5dGU9bnVsbCwKKyAgICAgICAgbmV3c2hvcnQ9bnVsbCwKKyAgICAgICAgbmV3bG9uZz1udWxsLAorICAgICAgICBuZXdkb3VibGU9bnVsbCwKKyAgICAgICAgbmV3c3RydWN0PW51bGwsCisgICAgICAgIG5ld2xpc3Q9bnVsbCwKKyAgICAgICAgbmV3c2V0PW51bGwsCisgICAgICAgIG5ld21hcD1udWxsLAorICAgICAgICBuZXdzdHJpbmc9bnVsbCwKKyAgICAgICAgZW5kX2luX2JvdGg9bnVsbAorICAgICAgfQorICAgICl9LAorICAgIHsiTGlzdFR5cGVWZXJzaW9uaW5nVjEgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuTGlzdFR5cGVWZXJzaW9uaW5nVjEnLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuTGlzdFR5cGVWZXJzaW9uaW5nVjEne215aW50cz1udWxsLGhlbGxvPW51bGx9CisgICAgKX0sCisgICAgeyJMaXN0VHlwZVZlcnNpb25pbmdWMiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5MaXN0VHlwZVZlcnNpb25pbmdWMicsIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5MaXN0VHlwZVZlcnNpb25pbmdWMid7c3RyaW5ncz1udWxsLGhlbGxvPW51bGx9CisgICAgKX0sCisgICAgeyJHdWVzc1Byb3RvY29sU3RydWN0IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Lkd1ZXNzUHJvdG9jb2xTdHJ1Y3QnLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuR3Vlc3NQcm90b2NvbFN0cnVjdCd7bWFwX2ZpZWxkPW51bGx9CisgICAgKX0sCisgICAgeyJMYXJnZURlbHRhcyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5MYXJnZURlbHRhcycsIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5MYXJnZURlbHRhcyd7CisgICAgICAgIGIxPW51bGwsCisgICAgICAgIGIxMD1udWxsLAorICAgICAgICBiMTAwPW51bGwsCisgICAgICAgIGNoZWNrX3RydWU9bnVsbCwKKyAgICAgICAgYjEwMDA9bnVsbCwKKyAgICAgICAgY2hlY2tfZmFsc2U9bnVsbCwKKyAgICAgICAgdmVydHdvMjAwMD1udWxsLAorICAgICAgICBhX3NldDI1MDA9bnVsbCwKKyAgICAgICAgdmVydHdvMzAwMD1udWxsLAorICAgICAgICBiaWdfbnVtYmVycz1udWxsCisgICAgICB9CisgICAgKX0sCisgICAgeyJOZXN0ZWRMaXN0c0kzMngyIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Lk5lc3RlZExpc3RzSTMyeDInLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuTmVzdGVkTGlzdHNJMzJ4Mid7aW50ZWdlcmxpc3Q9bnVsbH0KKyAgICApfSwKKyAgICB7Ik5lc3RlZExpc3RzSTMyeDMgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuTmVzdGVkTGlzdHNJMzJ4MycsIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5OZXN0ZWRMaXN0c0kzMngzJ3tpbnRlZ2VybGlzdD1udWxsfQorICAgICl9LAorICAgIHsiTmVzdGVkTWl4ZWR4MiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5OZXN0ZWRNaXhlZHgyJywgXywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0Lk5lc3RlZE1peGVkeDIneworICAgICAgICBpbnRfc2V0X2xpc3Q9bnVsbCwKKyAgICAgICAgbWFwX2ludF9zdHJzZXQ9bnVsbCwKKyAgICAgICAgbWFwX2ludF9zdHJzZXRfbGlzdD1udWxsCisgICAgICB9CisgICAgKX0sCisgICAgeyJMaXN0Qm9ua3MgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCh7J3RocmlmdC50ZXN0Lkxpc3RCb25rcycsIF99LCAjJ3RocmlmdC50ZXN0Lkxpc3RCb25rcyd7Ym9uaz1udWxsfSl9LAorICAgIHsiTmVzdGVkTGlzdHNCb25rIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Lk5lc3RlZExpc3RzQm9uaycsIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5OZXN0ZWRMaXN0c0Jvbmsne2Jvbms9bnVsbH0KKyAgICApfSwKKyAgICB7IkJvb2xUZXN0IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0LkJvb2xUZXN0JywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0LkJvb2xUZXN0J3tiPW51bGwscz1udWxsfQorICAgICl9LAorICAgIHsiU3RydWN0QSByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKHsndGhyaWZ0LnRlc3QuU3RydWN0QScsIF99LCAjJ3RocmlmdC50ZXN0LlN0cnVjdEEne3M9bnVsbH0pfSwKKyAgICB7IlN0cnVjdEIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuU3RydWN0QicsIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5TdHJ1Y3RCJ3thYT1udWxsLGFiPW51bGx9CisgICAgKX0KKyAgXS4KKworc3RydWN0X2luZm9fdGVzdF8oKSAtPgorICBbCisgICAgeyJCb25rIGRlZmluaXRpb24gKHNob3J0IHZlcnNpb24pIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgc3RyaW5nfSwgezIsIGkzMn1dfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCd0aHJpZnQudGVzdC5Cb25rJykKKyAgICApfSwKKyAgICB7IkJvbmsgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHN0cmluZywgbWVzc2FnZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgaTMyLCB0eXBlLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuQm9uaycpCisgICAgKX0sCisgICAgeyJCb29scyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgaW1fdHJ1ZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgaW1fZmFsc2UsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5Cb29scycpCisgICAgKX0sCisgICAgeyJYdHJ1Y3QgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHN0cmluZywgc3RyaW5nX3RoaW5nLCB1bmRlZmluZWR9LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCBieXRlLCBieXRlX3RoaW5nLCB1bmRlZmluZWR9LAorICAgICAgICB7OSwgdW5kZWZpbmVkLCBpMzIsIGkzMl90aGluZywgdW5kZWZpbmVkfSwKKyAgICAgICAgezExLCB1bmRlZmluZWQsIGk2NCwgaTY0X3RoaW5nLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuWHRydWN0JykKKyAgICApfSwKKyAgICB7Ilh0cnVjdDIgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGJ5dGUsIGJ5dGVfdGhpbmcsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAndGhyaWZ0LnRlc3QuWHRydWN0J319LCBzdHJ1Y3RfdGhpbmcsICMndGhyaWZ0LnRlc3QuWHRydWN0J3t9fSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgaTMyLCBpMzJfdGhpbmcsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5YdHJ1Y3QyJykKKyAgICApfSwKKyAgICB7Ilh0cnVjdDMgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHN0cmluZywgc3RyaW5nX3RoaW5nLCB1bmRlZmluZWR9LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCBpMzIsIGNoYW5nZWQsIHVuZGVmaW5lZH0sCisgICAgICAgIHs5LCB1bmRlZmluZWQsIGkzMiwgaTMyX3RoaW5nLCB1bmRlZmluZWR9LAorICAgICAgICB7MTEsIHVuZGVmaW5lZCwgaTY0LCBpNjRfdGhpbmcsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5YdHJ1Y3QzJykKKyAgICApfSwKKyAgICB7Ikluc2FuaXR5IGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bWFwLCBpMzIsIGk2NH0sIHVzZXJNYXAsIGRpY3Q6bmV3KCl9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCB7bGlzdCwge3N0cnVjdCwgeyd0aHJpZnRfdGVzdF90eXBlcycsICd0aHJpZnQudGVzdC5YdHJ1Y3QnfX19LCB4dHJ1Y3RzLCBbXX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5JbnNhbml0eScpCisgICAgKX0sCisgICAgeyJDcmF6eU5lc3RpbmcgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHN0cmluZywgc3RyaW5nX2ZpZWxkLCB1bmRlZmluZWR9LAorICAgICAgICB7Miwgb3B0aW9uYWwsIHtzZXQsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAndGhyaWZ0LnRlc3QuSW5zYW5pdHknfX19LCBzZXRfZmllbGQsIHNldHM6bmV3KCl9LAorICAgICAgICB7MywgcmVxdWlyZWQsIHtsaXN0LCB7bWFwLAorICAgICAgICAgIHtzZXQsIGkzMn0sCisgICAgICAgICAge21hcCwgaTMyLCB7c2V0LCB7bGlzdCwge21hcCwge3N0cnVjdCwgeyd0aHJpZnRfdGVzdF90eXBlcycsICd0aHJpZnQudGVzdC5JbnNhbml0eSd9fSwgc3RyaW5nfX19fQorICAgICAgICB9fSwgbGlzdF9maWVsZCwgW119LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCBzdHJpbmcsIGJpbmFyeV9maWVsZCwgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LkNyYXp5TmVzdGluZycpCisgICAgKX0sCisgICAgeyJYY2VwdGlvbiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgaTMyLCBlcnJvckNvZGUsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHN0cmluZywgbWVzc2FnZSwgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LlhjZXB0aW9uJykKKyAgICApfSwKKyAgICB7IlhjZXB0aW9uMiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgaTMyLCBlcnJvckNvZGUsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAndGhyaWZ0LnRlc3QuWHRydWN0J319LCBzdHJ1Y3RfdGhpbmcsICMndGhyaWZ0LnRlc3QuWHRydWN0J3t9fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LlhjZXB0aW9uMicpCisgICAgKX0sCisgICAgeyJFbXB0eVN0cnVjdCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuRW1wdHlTdHJ1Y3QnKQorICAgICl9LAorICAgIHsiT25lRmllbGQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAndGhyaWZ0LnRlc3QuRW1wdHlTdHJ1Y3QnfX0sIGZpZWxkLCAjJ3RocmlmdC50ZXN0LkVtcHR5U3RydWN0J3t9fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lk9uZUZpZWxkJykKKyAgICApfSwKKyAgICB7IlZlcnNpb25pbmdUZXN0VjEgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGkzMiwgYmVnaW5faW5fYm90aCwgdW5kZWZpbmVkfSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgc3RyaW5nLCBvbGRfc3RyaW5nLCB1bmRlZmluZWR9LAorICAgICAgICB7MTIsIHVuZGVmaW5lZCwgaTMyLCBlbmRfaW5fYm90aCwgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjEnKQorICAgICl9LAorICAgIHsiVmVyc2lvbmluZ1Rlc3RWMiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgaTMyLCBiZWdpbl9pbl9ib3RoLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBpMzIsIG5ld2ludCwgdW5kZWZpbmVkfSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgYnl0ZSwgbmV3Ynl0ZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwgaTE2LCBuZXdzaG9ydCwgdW5kZWZpbmVkfSwKKyAgICAgICAgezUsIHVuZGVmaW5lZCwgaTY0LCBuZXdsb25nLCB1bmRlZmluZWR9LAorICAgICAgICB7NiwgdW5kZWZpbmVkLCBkb3VibGUsIG5ld2RvdWJsZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezcsIHVuZGVmaW5lZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuQm9uayd9fSwgbmV3c3RydWN0LCAjJ3RocmlmdC50ZXN0LkJvbmsne319LAorICAgICAgICB7OCwgdW5kZWZpbmVkLCB7bGlzdCwgaTMyfSwgbmV3bGlzdCwgW119LAorICAgICAgICB7OSwgdW5kZWZpbmVkLCB7c2V0LCBpMzJ9LCBuZXdzZXQsIHNldHM6bmV3KCl9LAorICAgICAgICB7MTAsIHVuZGVmaW5lZCwge21hcCwgaTMyLCBpMzJ9LCBuZXdtYXAsIGRpY3Q6bmV3KCl9LAorICAgICAgICB7MTEsIHVuZGVmaW5lZCwgc3RyaW5nLCBuZXdzdHJpbmcsIHVuZGVmaW5lZH0sCisgICAgICAgIHsxMiwgdW5kZWZpbmVkLCBpMzIsIGVuZF9pbl9ib3RoLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuVmVyc2lvbmluZ1Rlc3RWMicpCisgICAgKX0sCisgICAgeyJMaXN0VHlwZVZlcnNpb25pbmdWMSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIGkzMn0sIG15aW50cywgW119LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBzdHJpbmcsIGhlbGxvLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuTGlzdFR5cGVWZXJzaW9uaW5nVjEnKQorICAgICl9LAorICAgIHsiTGlzdFR5cGVWZXJzaW9uaW5nVjIgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtsaXN0LCBzdHJpbmd9LCBzdHJpbmdzLCBbXX0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHN0cmluZywgaGVsbG8sIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5MaXN0VHlwZVZlcnNpb25pbmdWMicpCisgICAgKX0sCisgICAgeyJHdWVzc1Byb3RvY29sU3RydWN0IGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7NywgdW5kZWZpbmVkLCB7bWFwLCBzdHJpbmcsIHN0cmluZ30sIG1hcF9maWVsZCwgZGljdDpuZXcoKX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5HdWVzc1Byb3RvY29sU3RydWN0JykKKyAgICApfSwKKyAgICB7IkxhcmdlRGVsdGFzIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5Cb29scyd9fSwgYjEsICMndGhyaWZ0LnRlc3QuQm9vbHMne319LAorICAgICAgICB7MTAsIHVuZGVmaW5lZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuQm9vbHMnfX0sIGIxMCwgIyd0aHJpZnQudGVzdC5Cb29scyd7fX0sCisgICAgICAgIHsxMDAsIHVuZGVmaW5lZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuQm9vbHMnfX0sIGIxMDAsICMndGhyaWZ0LnRlc3QuQm9vbHMne319LAorICAgICAgICB7NTAwLCB1bmRlZmluZWQsIGJvb2wsIGNoZWNrX3RydWUsIHVuZGVmaW5lZH0sCisgICAgICAgIHsxMDAwLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LkJvb2xzJ319LCBiMTAwMCwgIyd0aHJpZnQudGVzdC5Cb29scyd7fX0sCisgICAgICAgIHsxNTAwLCB1bmRlZmluZWQsIGJvb2wsIGNoZWNrX2ZhbHNlLCB1bmRlZmluZWR9LAorICAgICAgICB7MjAwMCwgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5WZXJzaW9uaW5nVGVzdFYyJ319LCB2ZXJ0d28yMDAwLCAjJ3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjIne319LAorICAgICAgICB7MjUwMCwgdW5kZWZpbmVkLCB7c2V0LCBzdHJpbmd9LCBhX3NldDI1MDAsIHNldHM6bmV3KCl9LAorICAgICAgICB7MzAwMCwgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5WZXJzaW9uaW5nVGVzdFYyJ319LCB2ZXJ0d28zMDAwLCAjJ3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjIne319LAorICAgICAgICB7NDAwMCwgdW5kZWZpbmVkLCB7bGlzdCwgaTMyfSwgYmlnX251bWJlcnMsIFtdfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LkxhcmdlRGVsdGFzJykKKyAgICApfSwKKyAgICB7Ik5lc3RlZExpc3RzSTMyeDIgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtsaXN0LCB7bGlzdCwgaTMyfX0sIGludGVnZXJsaXN0LCBbXX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5OZXN0ZWRMaXN0c0kzMngyJykKKyAgICApfSwKKyAgICB7Ik5lc3RlZExpc3RzSTMyeDMgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtsaXN0LCB7bGlzdCwge2xpc3QsIGkzMn19fSwgaW50ZWdlcmxpc3QsIFtdfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lk5lc3RlZExpc3RzSTMyeDMnKQorICAgICl9LAorICAgIHsiTmVzdGVkTWl4ZWR4MiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtzZXQsIGkzMn19LCBpbnRfc2V0X2xpc3QsIFtdfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwge21hcCwgaTMyLCB7c2V0LCBzdHJpbmd9fSwgbWFwX2ludF9zdHJzZXQsIGRpY3Q6bmV3KCl9LAorICAgICAgICB7MywgdW5kZWZpbmVkLCB7bGlzdCwge21hcCwgaTMyLCB7c2V0LCBzdHJpbmd9fX0sIG1hcF9pbnRfc3Ryc2V0X2xpc3QsIFtdfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lk5lc3RlZE1peGVkeDInKQorICAgICl9LAorICAgIHsiTGlzdEJvbmtzIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuQm9uayd9fX0sIGJvbmssIFtdfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lkxpc3RCb25rcycpCisgICAgKX0sCisgICAgeyJOZXN0ZWRMaXN0c0JvbmsgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtsaXN0LCB7bGlzdCwge2xpc3QsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LkJvbmsnfX19fX0sIGJvbmssIFtdfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lk5lc3RlZExpc3RzQm9uaycpCisgICAgKX0sCisgICAgeyJCb29sVGVzdCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIG9wdGlvbmFsLCBib29sLCBiLCB0cnVlfSwKKyAgICAgICAgezIsIG9wdGlvbmFsLCBzdHJpbmcsIHMsICJ0cnVlIn0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5Cb29sVGVzdCcpCisgICAgKX0sCisgICAgeyJTdHJ1Y3RBIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCByZXF1aXJlZCwgc3RyaW5nLCBzLCB1bmRlZmluZWR9XX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LlN0cnVjdEEnKQorICAgICl9LAorICAgIHsiU3RydWN0QiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIG9wdGlvbmFsLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5TdHJ1Y3RBJ319LCBhYSwgIyd0aHJpZnQudGVzdC5TdHJ1Y3RBJ3t9fSwKKyAgICAgICAgezIsIHJlcXVpcmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5TdHJ1Y3RBJ319LCBhYiwgIyd0aHJpZnQudGVzdC5TdHJ1Y3RBJ3t9fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LlN0cnVjdEInKQorICAgICl9CisgIF0uCisKK3NlcnZpY2VfaW5mb190ZXN0XygpIC0+CisgIFsKKyAgICB7InRlc3RWb2lkIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0Vm9pZCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0Vm9pZCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0Vm9pZCwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RWb2lkIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFZvaWQsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0U3RyaW5nIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHN0cmluZ31dfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJpbmcsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdFN0cmluZyByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICBzdHJpbmcsCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RyaW5nLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdFN0cmluZyBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJpbmcsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0Qnl0ZSBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBieXRlfV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEJ5dGUsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdEJ5dGUgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgYnl0ZSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RCeXRlLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdEJ5dGUgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0Qnl0ZSwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RJMzIgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgaTMyfV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEkzMiwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0STMyIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIGkzMiwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJMzIsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0STMyIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEkzMiwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RJNjQgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgaTY0fV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEk2NCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0STY0IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIGk2NCwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJNjQsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0STY0IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEk2NCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3REb3VibGUgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgZG91YmxlfV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdERvdWJsZSwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0RG91YmxlIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIGRvdWJsZSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3REb3VibGUsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0RG91YmxlIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdERvdWJsZSwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RTdHJ1Y3QgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0Llh0cnVjdCd9fX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cnVjdCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0U3RydWN0IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0Llh0cnVjdCd9fSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJ1Y3QsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0U3RydWN0IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cnVjdCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3ROZXN0IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5YdHJ1Y3QyJ319fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TmVzdCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TmVzdCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5YdHJ1Y3QyJ319LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE5lc3QsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TmVzdCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3ROZXN0LCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdE1hcCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge21hcCwgaTMyLCBpMzJ9fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TWFwLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RNYXAgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge21hcCwgaTMyLCBpMzJ9LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE1hcCwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RNYXAgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TWFwLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdFN0cmluZ01hcCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge21hcCwgc3RyaW5nLCBzdHJpbmd9fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RyaW5nTWFwLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RTdHJpbmdNYXAgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge21hcCwgc3RyaW5nLCBzdHJpbmd9LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cmluZ01hcCwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RTdHJpbmdNYXAgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RyaW5nTWFwLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdFNldCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge3NldCwgaTMyfX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFNldCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0U2V0IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzZXQsIGkzMn0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U2V0LCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdFNldCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTZXQsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0TGlzdCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge2xpc3QsIGkzMn19CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RMaXN0LCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RMaXN0IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtsaXN0LCBpMzJ9LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdExpc3QsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TGlzdCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RMaXN0LCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdEVudW0gcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIGkzMn0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEVudW0sIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdEVudW0gcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgaTMyLAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEVudW0sIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0RW51bSBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RFbnVtLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdFR5cGVkZWYgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgaTY0fV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFR5cGVkZWYsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdFR5cGVkZWYgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgaTY0LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFR5cGVkZWYsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0VHlwZWRlZiBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RUeXBlZGVmLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdE1hcE1hcCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgaTMyfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TWFwTWFwLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RNYXBNYXAgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge21hcCwgaTMyLCB7bWFwLCBpMzIsaTMyfX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TWFwTWFwLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdE1hcE1hcCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNYXBNYXAsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0SW5zYW5pdHkgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0Lkluc2FuaXR5J319fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0SW5zYW5pdHksIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdEluc2FuaXR5IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHttYXAsIGk2NCwge21hcCwgaTMyLCB7c3RydWN0LCB7J3RocmlmdF90ZXN0X3R5cGVzJywgJ3RocmlmdC50ZXN0Lkluc2FuaXR5J319fX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0SW5zYW5pdHksIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0SW5zYW5pdHkgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0SW5zYW5pdHksIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0TXVsdGkgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIGJ5dGV9LAorICAgICAgICB7MiwgaTMyfSwKKyAgICAgICAgezMsIGk2NH0sCisgICAgICAgIHs0LCB7bWFwLCBpMTYsIHN0cmluZ319LAorICAgICAgICB7NSwgaTMyfSwKKyAgICAgICAgezYsIGk2NH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE11bHRpLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RNdWx0aSByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5YdHJ1Y3QnfX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TXVsdGksIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TXVsdGkgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TXVsdGksIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0RXhjZXB0aW9uIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHN0cmluZ31dfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RFeGNlcHRpb24sIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdEV4Y2VwdGlvbiByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RXhjZXB0aW9uLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdEV4Y2VwdGlvbiBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LlhjZXB0aW9uJ319fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RXhjZXB0aW9uLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdE11bHRpRXhjZXB0aW9uIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHN0cmluZ30sIHsyLCBzdHJpbmd9XX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TXVsdGlFeGNlcHRpb24sIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdE11bHRpRXhjZXB0aW9uIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0Llh0cnVjdCd9fSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNdWx0aUV4Y2VwdGlvbiwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RNdWx0aUV4Y2VwdGlvbiBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LlhjZXB0aW9uJ319fSwKKyAgICAgICAgezIsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LlhjZXB0aW9uMid9fX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE11bHRpRXhjZXB0aW9uLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdE9uZXdheSBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBpMzJ9XX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0T25ld2F5LCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RPbmV3YXkgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgb25ld2F5X3ZvaWQsCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0T25ld2F5LCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdE9uZXdheSBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RPbmV3YXksIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJzZWNvbmR0ZXN0U3RyaW5nIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHN0cmluZ31dfSwKKyAgICAgIHNlY29uZF9zZXJ2aWNlX3RocmlmdDpmdW5jdGlvbl9pbmZvKHNlY29uZHRlc3RTdHJpbmcsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsic2Vjb25kdGVzdFN0cmluZyByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICBzdHJpbmcsCisgICAgICBzZWNvbmRfc2VydmljZV90aHJpZnQ6ZnVuY3Rpb25faW5mbyhzZWNvbmR0ZXN0U3RyaW5nLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsic2Vjb25kdGVzdFN0cmluZyBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHNlY29uZF9zZXJ2aWNlX3RocmlmdDpmdW5jdGlvbl9pbmZvKHNlY29uZHRlc3RTdHJpbmcsIGV4Y2VwdGlvbnMpCisgICAgKX0KKyAgXS4KZGlmZiAtLWdpdCBhL2xpYi9nby9NYWtlLmRlcHMgYi9saWIvZ28vTWFrZS5kZXBzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmU3NWRhLi4wMDAwMDAwCi0tLSBhL2xpYi9nby9NYWtlLmRlcHMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotdGhyaWZ0Ly5pbnN0YWxsOiBidWZpby5pbnN0YWxsIGJ5dGVzLmluc3RhbGwgY29udGFpbmVyL2xpc3QuaW5zdGFsbCBjb250YWluZXIvdmVjdG9yLmluc3RhbGwgZW5jb2RpbmcvYmFzZTY0Lmluc3RhbGwgZW5jb2RpbmcvYmluYXJ5Lmluc3RhbGwgZm10Lmluc3RhbGwgaHR0cC5pbnN0YWxsIGlvLmluc3RhbGwganNvbi5pbnN0YWxsIGxvZy5pbnN0YWxsIG1hdGguaW5zdGFsbCBuZXQuaW5zdGFsbCBvcy5pbnN0YWxsIHJlZmxlY3QuaW5zdGFsbCBzb3J0Lmluc3RhbGwgc3RyY29udi5pbnN0YWxsIHN0cmluZ3MuaW5zdGFsbAotYXJjaGl2ZS90YXIuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9hcmNoaXZlL3Rhci5hCi1hcmNoaXZlL3ppcC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2FyY2hpdmUvemlwLmEKLWFzbjEuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9hc24xLmEKLWJpZy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2JpZy5hCi1idWZpby5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2J1ZmlvLmEKLWJ5dGVzLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vYnl0ZXMuYQotY21hdGguaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jbWF0aC5hCi1jb21wcmVzcy9iemlwMi5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NvbXByZXNzL2J6aXAyLmEKLWNvbXByZXNzL2ZsYXRlLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY29tcHJlc3MvZmxhdGUuYQotY29tcHJlc3MvZ3ppcC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NvbXByZXNzL2d6aXAuYQotY29tcHJlc3MvbHp3Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY29tcHJlc3MvbHp3LmEKLWNvbXByZXNzL3psaWIuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jb21wcmVzcy96bGliLmEKLWNvbnRhaW5lci9oZWFwLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY29udGFpbmVyL2hlYXAuYQotY29udGFpbmVyL2xpc3QuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jb250YWluZXIvbGlzdC5hCi1jb250YWluZXIvcmluZy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NvbnRhaW5lci9yaW5nLmEKLWNvbnRhaW5lci92ZWN0b3IuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jb250YWluZXIvdmVjdG9yLmEKLWNyeXB0by5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by5hCi1jcnlwdG8vYWVzLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL2Flcy5hCi1jcnlwdG8vYmxvd2Zpc2guaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vYmxvd2Zpc2guYQotY3J5cHRvL2Nhc3Q1Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL2Nhc3Q1LmEKLWNyeXB0by9jaXBoZXIuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vY2lwaGVyLmEKLWNyeXB0by9kZXMuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vZGVzLmEKLWNyeXB0by9kc2EuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vZHNhLmEKLWNyeXB0by9lY2RzYS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by9lY2RzYS5hCi1jcnlwdG8vZWxsaXB0aWMuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vZWxsaXB0aWMuYQotY3J5cHRvL2htYWMuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vaG1hYy5hCi1jcnlwdG8vbWQ0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL21kNC5hCi1jcnlwdG8vbWQ1Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL21kNS5hCi1jcnlwdG8vb2NzcC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by9vY3NwLmEKLWNyeXB0by9vcGVucGdwLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL29wZW5wZ3AuYQotY3J5cHRvL29wZW5wZ3AvYXJtb3IuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vb3BlbnBncC9hcm1vci5hCi1jcnlwdG8vb3BlbnBncC9lcnJvci5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by9vcGVucGdwL2Vycm9yLmEKLWNyeXB0by9vcGVucGdwL3BhY2tldC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by9vcGVucGdwL3BhY2tldC5hCi1jcnlwdG8vb3BlbnBncC9zMmsuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vb3BlbnBncC9zMmsuYQotY3J5cHRvL3JhbmQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vcmFuZC5hCi1jcnlwdG8vcmM0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL3JjNC5hCi1jcnlwdG8vcmlwZW1kMTYwLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL3JpcGVtZDE2MC5hCi1jcnlwdG8vcnNhLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL3JzYS5hCi1jcnlwdG8vc2hhMS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by9zaGExLmEKLWNyeXB0by9zaGEyNTYuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vc2hhMjU2LmEKLWNyeXB0by9zaGE1MTIuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vc2hhNTEyLmEKLWNyeXB0by9zdWJ0bGUuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vc3VidGxlLmEKLWNyeXB0by90bHMuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vdGxzLmEKLWNyeXB0by90d29maXNoLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL3R3b2Zpc2guYQotY3J5cHRvL3g1MDkuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8veDUwOS5hCi1jcnlwdG8veDUwOS9jcmwuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8veDUwOS9jcmwuYQotY3J5cHRvL3h0ZWEuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8veHRlYS5hCi1kZWJ1Zy9kd2FyZi5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2RlYnVnL2R3YXJmLmEKLWRlYnVnL21hY2hvLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZGVidWcvbWFjaG8uYQotZGVidWcvZWxmLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZGVidWcvZWxmLmEKLWRlYnVnL2dvc3ltLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZGVidWcvZ29zeW0uYQotZGVidWcvcGUuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9kZWJ1Zy9wZS5hCi1kZWJ1Zy9wcm9jLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZGVidWcvcHJvYy5hCi1lYm5mLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZWJuZi5hCi1lbmNvZGluZy9hc2NpaTg1Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZW5jb2RpbmcvYXNjaWk4NS5hCi1lbmNvZGluZy9iYXNlMzIuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9lbmNvZGluZy9iYXNlMzIuYQotZW5jb2RpbmcvYmFzZTY0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZW5jb2RpbmcvYmFzZTY0LmEKLWVuY29kaW5nL2JpbmFyeS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2VuY29kaW5nL2JpbmFyeS5hCi1lbmNvZGluZy9naXQ4NS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2VuY29kaW5nL2dpdDg1LmEKLWVuY29kaW5nL2hleC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2VuY29kaW5nL2hleC5hCi1lbmNvZGluZy9saW5lLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZW5jb2RpbmcvbGluZS5hCi1lbmNvZGluZy9wZW0uaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9lbmNvZGluZy9wZW0uYQotZXhlYy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2V4ZWMuYQotZXhwL2RhdGFmbXQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9leHAvZGF0YWZtdC5hCi1leHAvZHJhdy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2V4cC9kcmF3LmEKLWV4cC9kcmF3L3gxMS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2V4cC9kcmF3L3gxMS5hCi1leHAvZXZhbC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2V4cC9ldmFsLmEKLWV4cHZhci5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2V4cHZhci5hCi1mbGFnLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZmxhZy5hCi1mbXQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9mbXQuYQotZ28vYXN0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZ28vYXN0LmEKLWdvL2RvYy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2dvL2RvYy5hCi1nby9wYXJzZXIuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9nby9wYXJzZXIuYQotZ28vcHJpbnRlci5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2dvL3ByaW50ZXIuYQotZ28vc2Nhbm5lci5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2dvL3NjYW5uZXIuYQotZ28vdG9rZW4uaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9nby90b2tlbi5hCi1nby90eXBlY2hlY2tlci5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2dvL3R5cGVjaGVja2VyLmEKLWdvL3R5cGVzLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZ28vdHlwZXMuYQotZ29iLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZ29iLmEKLWhhc2guaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9oYXNoLmEKLWhhc2gvYWRsZXIzMi5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2hhc2gvYWRsZXIzMi5hCi1oYXNoL2NyYzMyLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vaGFzaC9jcmMzMi5hCi1oYXNoL2NyYzY0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vaGFzaC9jcmM2NC5hCi1oYXNoL2Zudi5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2hhc2gvZm52LmEKLWh0bWwuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9odG1sLmEKLWh0dHAuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9odHRwLmEKLWh0dHAvY2dpLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vaHR0cC9jZ2kuYQotaHR0cC9mY2dpLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vaHR0cC9mY2dpLmEKLWh0dHAvcHByb2YuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9odHRwL3Bwcm9mLmEKLWh0dHAvaHR0cHRlc3QuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9odHRwL2h0dHB0ZXN0LmEKLWh0dHAvc3BkeS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2h0dHAvc3BkeS5hCi1pbWFnZS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2ltYWdlLmEKLWltYWdlL2JtcC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2ltYWdlL2JtcC5hCi1pbWFnZS9naWYuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9pbWFnZS9naWYuYQotaW1hZ2UvanBlZy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2ltYWdlL2pwZWcuYQotaW1hZ2UvcG5nLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vaW1hZ2UvcG5nLmEKLWltYWdlL3RpZmYuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9pbWFnZS90aWZmLmEKLWltYWdlL3ljYmNyLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vaW1hZ2UveWNiY3IuYQotaW5kZXgvc3VmZml4YXJyYXkuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9pbmRleC9zdWZmaXhhcnJheS5hCi1pby5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2lvLmEKLWlvL2lvdXRpbC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2lvL2lvdXRpbC5hCi1qc29uLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vanNvbi5hCi1sb2cuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9sb2cuYQotbWF0aC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L21hdGguYQotbWltZS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L21pbWUuYQotbWltZS9tdWx0aXBhcnQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9taW1lL211bHRpcGFydC5hCi1uZXQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9uZXQuYQotbmV0L2RpY3QuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9uZXQvZGljdC5hCi1uZXQvdGV4dHByb3RvLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vbmV0L3RleHRwcm90by5hCi1uZXRjaGFuLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vbmV0Y2hhbi5hCi1vcy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L29zLmEKLW9zL3NpZ25hbC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L29zL3NpZ25hbC5hCi1vcy91c2VyLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vb3MvdXNlci5hCi1wYXRjaC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3BhdGNoLmEKLXBhdGguaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9wYXRoLmEKLXBhdGgvZmlsZXBhdGguaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9wYXRoL2ZpbGVwYXRoLmEKLXJhbmQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9yYW5kLmEKLXJlZmxlY3QuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9yZWZsZWN0LmEKLXJlZ2V4cC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3JlZ2V4cC5hCi1ycGMuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9ycGMuYQotcnBjL2pzb25ycGMuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9ycGMvanNvbnJwYy5hCi1ydW50aW1lLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vcnVudGltZS5hCi1ydW50aW1lL2Nnby5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3J1bnRpbWUvY2dvLmEKLXJ1bnRpbWUvZGVidWcuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9ydW50aW1lL2RlYnVnLmEKLXJ1bnRpbWUvcHByb2YuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9ydW50aW1lL3Bwcm9mLmEKLXNjYW5uZXIuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9zY2FubmVyLmEKLXNtdHAuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9zbXRwLmEKLXNvcnQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9zb3J0LmEKLXN0cmNvbnYuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9zdHJjb252LmEKLXN0cmluZ3MuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9zdHJpbmdzLmEKLXN5bmMuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9zeW5jLmEKLXN5bmMvYXRvbWljLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vc3luYy9hdG9taWMuYQotc3lzY2FsbC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3N5c2NhbGwuYQotc3lzbG9nLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vc3lzbG9nLmEKLXRhYndyaXRlci5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3RhYndyaXRlci5hCi10ZW1wbGF0ZS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3RlbXBsYXRlLmEKLXRlc3RpbmcuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS90ZXN0aW5nLmEKLXRlc3RpbmcvaW90ZXN0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vdGVzdGluZy9pb3Rlc3QuYQotdGVzdGluZy9xdWljay5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3Rlc3RpbmcvcXVpY2suYQotdGVzdGluZy9zY3JpcHQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS90ZXN0aW5nL3NjcmlwdC5hCi10aW1lLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vdGltZS5hCi10cnkuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS90cnkuYQotdW5pY29kZS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3VuaWNvZGUuYQotdXRmMTYuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS91dGYxNi5hCi11dGY4Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vdXRmOC5hCi13ZWJzb2NrZXQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS93ZWJzb2NrZXQuYQoteG1sLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0veG1sLmEKLS4uL2NtZC9jZ28uaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS8uLi9jbWQvY2dvLmEKLS4uL2NtZC9lYm5mbGludC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9Ly4uL2NtZC9lYm5mbGludC5hCi0uLi9jbWQvZ29kb2MuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS8uLi9jbWQvZ29kb2MuYQotLi4vY21kL2dvZml4Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vLi4vY21kL2dvZml4LmEKLS4uL2NtZC9nb2ZtdC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9Ly4uL2NtZC9nb2ZtdC5hCi0uLi9jbWQvZ29pbnN0YWxsLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vLi4vY21kL2dvaW5zdGFsbC5hCi0uLi9jbWQvZ290ZXN0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vLi4vY21kL2dvdGVzdC5hCi0uLi9jbWQvZ290eXBlLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vLi4vY21kL2dvdHlwZS5hCi0uLi9jbWQvZ292ZXQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS8uLi9jbWQvZ292ZXQuYQotLi4vY21kL2dveWFjYy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9Ly4uL2NtZC9nb3lhY2MuYQotLi4vY21kL2hncGF0Y2guaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS8uLi9jbWQvaGdwYXRjaC5hCmRpZmYgLS1naXQgYS9saWIvZ28vTWFrZWZpbGUgYi9saWIvZ28vTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlODFkOGQuLjAwMDAwMDAKLS0tIGEvbGliL2dvL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAwOSBUaGUgR28gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUKLSMgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jIEFmdGVyIGVkaXRpbmcgdGhlIERJUlM9IGxpc3Qgb3IgYWRkaW5nIGltcG9ydHMgdG8gYW55IEdvIGZpbGVzCi0jIGluIGFueSBvZiB0aG9zZSBkaXJlY3RvcmllcywgcnVuOgotIwotIwkuL2RlcHMuYmFzaAotIwotIyB0byByZWJ1aWxkIHRoZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGluIE1ha2UuZGVwcy4KLQotCi1pbmNsdWRlICQoR09ST09UKS9zcmMvTWFrZS5pbmMKLQotYWxsOiBNYWtlLmRlcHMgaW5zdGFsbAotCi1ESVJTPVwKLSAgICAgdGhyaWZ0L1wKLQotVEVTVD1cCi0JJChmaWx0ZXItb3V0ICQoTk9URVNUKSwkKERJUlMpKQotCi0KLWNsZWFuLmRpcnM6ICQoYWRkc3VmZml4IC5jbGVhbiwgJChESVJTKSkKLWluc3RhbGwuZGlyczogJChhZGRzdWZmaXggLmluc3RhbGwsICQoRElSUykpCi1udWtlLmRpcnM6ICQoYWRkc3VmZml4IC5udWtlLCAkKERJUlMpKQotdGVzdC5kaXJzOiAkKGFkZHN1ZmZpeCAudGVzdCwgJChESVJTKSkKLWNoZWNrLmRpcnM6ICQoYWRkc3VmZml4IC5jaGVjaywgJChESVJTKSkKLQotJS5jbGVhbjoKLQkrY2QgJCogJiYgZ29tYWtlIGNsZWFuCi0KLSUuaW5zdGFsbDoKLQkrY2QgJCogJiYgZ29tYWtlIGluc3RhbGwKLQotJS5udWtlOgotCStjZCAkKiAmJiBnb21ha2UgbnVrZQotCi0lLnRlc3Q6Ci0JK2NkICQqICYmIGdvbWFrZSB0ZXN0Ci0KLSUuY2hlY2s6Ci0JK2NkICQqICYmIGdvbWFrZSBjaGVjawotCi1jbGVhbjogY2xlYW4uZGlycwotCi1pbnN0YWxsOiBpbnN0YWxsLmRpcnMKLQotdGVzdDoJdGVzdC5kaXJzCi0KLWNoZWNrOgljaGVjay5kaXJzCi0KLSNudWtlOiBudWtlLmRpcnMKLSMJcm0gLXJmICIkKEdPUk9PVCkiL3BrZy90aHJpZnQuKgotCi1lY2hvLWRpcnM6Ci0JQGVjaG8gJChESVJTKQotCi1NYWtlLmRlcHM6Ci0JLi9kZXBzLmJhc2gKLQotZGVwczoKLQkuL2RlcHMuYmFzaAotCmRpZmYgLS1naXQgYS9saWIvZ28vTWFrZWZpbGUuYW0gYi9saWIvZ28vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRmYTVmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9IC4KKworaWYgV0lUSF9URVNUUworU1VCRElSUyArPSB0ZXN0CitlbmRpZgorCitpbnN0YWxsOgorCUBlY2hvICcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKKwlAZWNobyAnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisJQGVjaG8gJ1RoZSBHbyBjbGllbnQgbGlicmFyeSBzaG91bGQgYmUgaW5zdGFsbGVkIHZpYSAiZ28gZ2V0IiwgcGxlYXNlIHNlZSAvbGliL2dvL1JFQURNRS5tZCcKKwlAZWNobyAnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisJQGVjaG8gJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworCitjaGVjay1sb2NhbDoKKwlHT1BBVEg9YHB3ZGAgJChHTykgdGVzdCAtcmFjZSAuL3RocmlmdAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtcmYgcGtnCisKK2FsbC1sb2NhbDoKKwlHT1BBVEg9YHB3ZGAgJChHTykgYnVpbGQgLi90aHJpZnQKKworRVhUUkFfRElTVCA9IFwKKwl0aHJpZnQgXAorCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCVJFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL2dvL1JFQURNRS5tZCBiL2xpYi9nby9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U2ZDVlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby9SRUFETUUubWQKQEAgLTAsMCArMSw4MyBAQAorVGhyaWZ0IEdvIFNvZnR3YXJlIExpYnJhcnkKKworTGljZW5zZQorPT09PT09PQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworCitVc2luZyBUaHJpZnQgd2l0aCBHbworPT09PT09PT09PT09PT09PT09PT0KKworVGhyaWZ0IHN1cHBvcnRzIEdvIDEuNysKKworSW4gZm9sbG93aW5nIEdvIGNvbnZlbnRpb25zLCB3ZSByZWNvbW1lbmQgeW91IHVzZSB0aGUgJ2dvJyB0b29sIHRvIGluc3RhbGwKK1RocmlmdCBmb3IgZ28uCisKKyAgICAkIGdvIGdldCBnaXRodWIuY29tL2FwYWNoZS90aHJpZnQvbGliL2dvL3RocmlmdC8uLi4KKworV2lsbCByZXRyaWV2ZSBhbmQgaW5zdGFsbCB0aGUgbW9zdCByZWNlbnQgdmVyc2lvbiBvZiB0aGUgcGFja2FnZS4KKworCitBIG5vdGUgYWJvdXQgb3B0aW9uYWwgZmllbGRzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSB0aHJpZnQtdG8tR28gY29tcGlsZXIgdHJpZXMgdG8gcmVwcmVzZW50IHRocmlmdCBJREwgc3RydWN0cyBhcyBHbyBzdHJ1Y3RzLgorV2UgbXVzdCBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gb3B0aW9uYWwgZmllbGRzIHRoYXQgYXJlIHNldCB0byB0aGVpcgorZGVmYXVsdCB2YWx1ZSBhbmQgb3B0aW9uYWwgdmFsdWVzIHdoaWNoIGFyZSBhY3R1YWxseSB1bnNldCwgc28gdGhlIGdlbmVyYXRlZAorY29kZSByZXByZXNlbnRzIG9wdGlvbmFsIGZpZWxkcyB2aWEgcG9pbnRlcnMuCisKK1RoaXMgaXMgZ2VuZXJhbGx5IGludHVpdGl2ZSBhbmQgd29ya3Mgd2VsbCBtdWNoIG9mIHRoZSB0aW1lLCBidXQgR28gZG9lcyBub3QKK2hhdmUgYSBzeW50YXggZm9yIGNyZWF0aW5nIGEgcG9pbnRlciB0byBhIGNvbnN0YW50IGluIGEgc2luZ2xlIGV4cHJlc3Npb24uIFRoYXQKK2lzLCBnaXZlbiBhIHN0cnVjdCBsaWtlCisKKyAgICBzdHJ1Y3QgU29tZUlETFR5cGUgeworICAgIAlPcHRpb25hbEZpZWxkICppbnQzMgorICAgIH0KKworLCB0aGUgZm9sbG93aW5nIHdpbGwgbm90IGNvbXBpbGU6CisKKyAgICB4IDo9ICZTb21lSURMVHlwZXsKKyAgICAJT3B0aW9uYWxGaWVsZDogJigzKSwKKyAgICB9CisKKyhOb3IgaXMgdGhlcmUgYW55IG90aGVyIHN5bnRheCB0aGF0J3MgYnVpbHQgaW4gdG8gdGhlIGxhbmd1YWdlKQorCitBcyBzdWNoLCB3ZSBwcm92aWRlIHNvbWUgaGVscGVycyB0aGF0IGRvIGp1c3QgdGhpcyB1bmRlciBsaWIvZ28vdGhyaWZ0Ly4gRS5nLiwKKworICAgIHggOj0gJlNvbWVJRExUeXBleworICAgIAlPcHRpb25hbEZpZWxkOiB0aHJpZnQuSW50MzJQdHIoMyksCisgICAgfQorCitBbmQgc28gb24uIFRoZSBjb2RlIGdlbmVyYXRvciBhbHNvIGNyZWF0ZXMgYW5hbG9nb3VzIGhlbHBlcnMgZm9yIHVzZXItZGVmaW5lZAordHlwZWRlZnMgYW5kIGVudW1zLgorCitBZGRpbmcgY3VzdG9tIHRhZ3MgdG8gZ2VuZXJhdGVkIFRocmlmdCBzdHJ1Y3RzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1lvdSBjYW4gYWRkIHRhZ3MgdG8gdGhlIGF1dG8tZ2VuZXJhdGVkIHRocmlmdCBzdHJ1Y3RzIHVzaW5nIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorCisgICAgc3RydWN0IGZvbyB7CisgICAgICAxOiByZXF1aXJlZCBzdHJpbmcgQmFyIChnby50YWcgPSAic29tZV90YWc6XCJzb21lX3RhZ192YWx1ZVwiIikKKyAgICB9CisgICAgCit3aGljaCB3aWxsIGdlbmVyYXRlOgorCisgICAgdHlwZSBGb28gc3RydWN0IHsKKyAgICAgIEJhciBzdHJpbmcgYHRocmlmdDoiYmFyLDEscmVxdWlyZWQiIHNvbWVfdGFnOiJzb21lX3RhZ192YWx1ZSJgCisgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2dvL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvZ28vY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvZ28vZGVwcy5iYXNoIGIvbGliL2dvL2RlcHMuYmFzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiZDQwNC4uMDAwMDAwMAotLS0gYS9saWIvZ28vZGVwcy5iYXNoCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgYmFzaAotIyBDb3B5cmlnaHQgMjAwOSBUaGUgR28gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUKLSMgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi1PVVQ9Ik1ha2UuZGVwcyIKLVRNUD0iTWFrZS5kZXBzLnRtcCIKLQotaWYgWyAtZiAkT1VUIF0gJiYgISBbIC13ICRPVVQgXTsgdGhlbgotCWVjaG8gIiQwOiAkT1VUIGlzIHJlYWQtb25seTsgYWJvcnRpbmcuIiAxPiYyCi0JZXhpdCAxCi1maQotCi0jIEdldCBsaXN0IG9mIGRpcmVjdG9yaWVzIGZyb20gTWFrZWZpbGUKLWRpcnM9JChzZWQgJzEsL15ESVJTPS9kOyAvXiQvLCRkOyBzL1xcLy9nJyBNYWtlZmlsZSkKLWRpcnMyPSQoc2VkICcxLC9eRElSUz0vZDsgL14kLywkZDsgcy9cXC8vZycgJEdPUk9PVC9zcmMvcGtnL01ha2VmaWxlKQotZGlycGF0PSQoZWNobyAkZGlycyAkZGlyczIgfCBzZWQgJ3MvIC98L2c7IHMvLiovXigmKSQvJykKLQotZm9yIGRpciBpbiAkZGlyczsgZG8gKAotCWNkICRkaXIgfHwgZXhpdCAxCi0KLQlzb3VyY2VzPSQoc2VkIC1uICdzL1wuZ29cXC8uZ28vcCcgTWFrZWZpbGUpCi0Jc291cmNlcz0kKGxzICRzb3VyY2VzIDI+IC9kZXYvbnVsbCkgICMgcmVtb3ZlIC5zLCAuYywgZXRjLgotCi0JZGVwcz0kKAotCQlzZWQgLW4gJy9eaW1wb3J0LioiL3A7IC9eaW1wb3J0WyBcdF0qKC8sL14pL3AnICRzb3VyY2VzIC9kZXYvbnVsbCB8Ci0JCWN1dCAtZCAnIicgLWYyIHwKLQkJZWdyZXAgIiRkaXJwYXQiIHwKLQkJZ3JlcCAtdiAiXiRkaXJcJCIgfAotCQlzZWQgJ3MvJC8uaW5zdGFsbC8nIHwKLQkJc29ydCAtdQotCSkKLQotCWVjaG8gJGRpci5pbnN0YWxsOiAkZGVwcwotKSBkb25lID4gJFRNUAotCi1mb3IgZGlyIGluICRkaXJzMjsgZG8gKAotICBlY2hvICRkaXIuaW5zdGFsbDogXCR7R09ST09UfS9wa2cvXCR7R09PU31fXCR7R09BUkNIfS8ke2Rpcn0uYQotKSBkb25lID4+ICRUTVAKLQotbXYgJFRNUCAkT1VUCmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9CaW5hcnlLZXlUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L0JpbmFyeUtleVRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxY2I2MTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9CaW5hcnlLZXlUZXN0LnRocmlmdApAQCAtMCwwICsxLDI0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBNYWtlIHN1cmUgdGhhdCB0aHJpZnQgcHJvZHVjZSBjb21waWxhYmxlIGNvZGUgZm9yIGJpbmFyeSBrZXkKK3N0cnVjdCB0ZXN0U3RydWN0IHsKKyAgMTogcmVxdWlyZWQgbWFwPGJpbmFyeSxzdHJpbmc+IGJpbl90b19zdHJpbmcKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvRG9udEV4cG9ydFJXVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9Eb250RXhwb3J0UldUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWU1YTZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvRG9udEV4cG9ydFJXVGVzdC50aHJpZnQKQEAgLTAsMCArMSwyNyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3N0cnVjdCBJbm5lclN0cnVjdCB7CisgIDE6IHJlcXVpcmVkIHN0cmluZyBpZAorfQorCitzdHJ1Y3QgVGVzdFN0cnVjdCB7CisgIDE6IHJlcXVpcmVkIHN0cmluZyBpZAorICAyOiByZXF1aXJlZCBJbm5lclN0cnVjdCBpbm5lcgorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvRXJyb3JUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L0Vycm9yVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiNjY0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L0Vycm9yVGVzdC50aHJpZnQKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KK3N0cnVjdCBUZXN0U3RydWN0IAoreworICAxOiBtYXA8c3RyaW5nLCBzdHJpbmc+IG0sCisgIDI6IGxpc3Q8c3RyaW5nPiBsLAorICAzOiBzZXQ8c3RyaW5nPiBzLAorICA0OiBpMzIgaQorfQorCitzZXJ2aWNlIEVycm9yVGVzdCAKK3sKKyAgVGVzdFN0cnVjdCAgICAgICAgIHRlc3RTdHJ1Y3QoMTogVGVzdFN0cnVjdCB0aGluZykKKyAgc3RyaW5nICAgICAgICAgICAgIHRlc3RTdHJpbmcoMTogc3RyaW5nIHMpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9Hb1RhZ1Rlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvR29UYWdUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDhiM2I2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvR29UYWdUZXN0LnRocmlmdApAQCAtMCwwICsxLDI0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc3RydWN0IHRhZ2dlZCB7CisgICAgMTogc3RyaW5nIHN0cmluZ190aGluZywKKyAgICAyOiBpNjQgaW50X3RoaW5nIChnby50YWcgPSAianNvbjpcImludF90aGluZyxzdHJpbmdcIiIpLAorICAgIDM6IG9wdGlvbmFsIGk2NCBvcHRpb25hbF9pbnRfdGhpbmcKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L0lnbm9yZUluaXRpYWxpc21zVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9JZ25vcmVJbml0aWFsaXNtc1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMzBlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9JZ25vcmVJbml0aWFsaXNtc1Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzdHJ1Y3QgSWdub3JlSW5pdGlhbGlzbXNUZXN0IHsKKyAgICAxOiBpNjQgaWQsCisgICAgMjogaTY0IG15X2lkLAorICAgIDM6IGk2NCBudW1fY3B1LAorICAgIDQ6IGk2NCBudW1fZ3B1LAorICAgIDU6IGk2NCBteV9JRCwKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L0luY2x1ZGVzVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9JbmNsdWRlc1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNjAzMjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9JbmNsdWRlc1Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsNjcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbmNsdWRlICJUaHJpZnRUZXN0LnRocmlmdCIKK2luY2x1ZGUgIk5hbWVzcGFjZWRUZXN0LnRocmlmdCIKKworY29uc3QgVGhyaWZ0VGVzdC5Vc2VySWQgVVNFUklEID0gNDIKK2NvbnN0IE5hbWVzcGFjZWRUZXN0LlVzZXJJZCBVU0VSSUQxID0gNDEKK2NvbnN0IFRocmlmdFRlc3QuTWFwVHlwZSBNQVBDT05TVEFOVCA9IHsnaGVsbG8nOnt9LCAnZ29vZG5pZ2h0Jzp7fX0KKworY29uc3QgaTMyIFRXTyA9IE5hbWVzcGFjZWRUZXN0LlN0dWZmLlRXTworY29uc3QgaTMyIFRIUkVFID0gTmFtZXNwYWNlZFRlc3QuVEhSRUUKKworc3RydWN0IHRlc3RTdHJ1Y3QgeworICAxOiBsaXN0PFRocmlmdFRlc3QuTnVtYmVyej4gbGlzdE51bWJlcnMKK30KKworc3RydWN0IFRlc3RTdHJ1Y3QyIHsKKyAgMTogdGVzdFN0cnVjdCBibGFoLAorICAyOiBUaHJpZnRUZXN0LlVzZXJJZCBpZCwKKyAgMzogTmFtZXNwYWNlZFRlc3QuU3R1ZmYgc3R1ZmYsCit9CisKK3NlcnZpY2UgdGVzdFNlcnZpY2UgZXh0ZW5kcyBUaHJpZnRUZXN0LlNlY29uZFNlcnZpY2UgeworICBUaHJpZnRUZXN0LkNyYXp5TmVzdGluZyBnZXRDcmF6eU5lc3RpbmcoCisgICAgMTogVGhyaWZ0VGVzdC5TdHJ1Y3RBIGEsCisgICAgMjogVGhyaWZ0VGVzdC5OdW1iZXJ6IG51bWJlcnMKKyAgKSB0aHJvd3MoMTogVGhyaWZ0VGVzdC5YY2VwdGlvbiBlcnIxKSwKKworICB2b2lkIGdldFNvbWVWYWx1ZV9ET19OT1RfQ0FMTCgpLAorfQorCitzZXJ2aWNlIEV4dGVuZGVkU2VydmljZSBleHRlbmRzIHRlc3RTZXJ2aWNlIHsKKyAgdm9pZCBleHRlbmRlZE1ldGhvZCgpLAorICBOYW1lc3BhY2VkVGVzdC5TdHVmZlN0cnVjdCBleHRlbmRlZE1ldGhvZDIoKSwKK30KKworc2VydmljZSBFeHRlbmRlZDJTZXJ2aWNlIGV4dGVuZHMgTmFtZXNwYWNlZFRlc3QuTmFtZXNwYWNlZFNlcnZpY2UgeworICB2b2lkIGV4dGVuZGVkTWV0aG9kMygpLAorfQorCit0eXBlZGVmIG1hcDxUaHJpZnRUZXN0LlVzZXJJZCwgbWFwPE5hbWVzcGFjZWRUZXN0LlVzZXJJZCwgbGlzdDxUZXN0U3RydWN0Mj4gPiA+IENvbXBsZXhNYXBUeXBlCisKK3N0cnVjdCBDb21wbGV4TWFwU3RydWN0IHsKKyAgMTogQ29tcGxleE1hcFR5cGUgY29tcGxleCwKK30KKworc2VydmljZSBDb21wbGV4TWFwU2VydmljZSB7CisgIENvbXBsZXhNYXBTdHJ1Y3QgdHJhbnNmb3JtTWFwKDE6IENvbXBsZXhNYXBTdHJ1Y3QgaW5wdXQpLAorfQorCmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9Jbml0aWFsaXNtc1Rlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvSW5pdGlhbGlzbXNUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDg2YWMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvSW5pdGlhbGlzbXNUZXN0LnRocmlmdApAQCAtMCwwICsxLDI0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc3RydWN0IEluaXRpYWxpc21zVGVzdCB7CisgICAgMTogc3RyaW5nIHVzZXJfaWQsCisgICAgMjogc3RyaW5nIHNlcnZlcl91cmwsCisgICAgMzogc3RyaW5nIGlkLCAKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L01ha2VmaWxlLmFtIGIvbGliL2dvL3Rlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhkNDY4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTExIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworVEhSSUZUQVJHUyA9IC1vdXQgZ29wYXRoL3NyYy8gLS1nZW4gZ286dGhyaWZ0X2ltcG9ydD10aHJpZnQkKENPTVBJTEVSX0VYVFJBRkxBRykKK1RIUklGVFRFU1QgPSAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKworIyBUaHJpZnQgZm9yIEdPIGhhcyBwcm9ibGVtcyB3aXRoIGNvbXBsZXggbWFwIGtleXM6IFRIUklGVC0yMDYzCitnb3BhdGg6ICQoVEhSSUZUKSAkKFRIUklGVFRFU1QpIFwKKwkJCQlJbmNsdWRlc1Rlc3QudGhyaWZ0IFwKKwkJCQlOYW1lc3BhY2VkVGVzdC50aHJpZnQgXAorCQkJCU11bHRpcGxleGVkUHJvdG9jb2xUZXN0LnRocmlmdCBcCisJCQkJT25ld2F5VGVzdC50aHJpZnQgXAorCQkJCU9wdGlvbmFsRmllbGRzVGVzdC50aHJpZnQgXAorCQkJCVJlcXVpcmVkRmllbGRUZXN0LnRocmlmdCBcCisJCQkJU2VydmljZXNUZXN0LnRocmlmdCBcCisJCQkJR29UYWdUZXN0LnRocmlmdCBcCisJCQkJVHlwZWRlZkZpZWxkVGVzdC50aHJpZnQgXAorCQkJCVJlZkFubm90YXRpb25GaWVsZHNUZXN0LnRocmlmdCBcCisJCQkJVW5pb25EZWZhdWx0VmFsdWVUZXN0LnRocmlmdCBcCisJCQkJVW5pb25CaW5hcnlUZXN0LnRocmlmdCBcCisJCQkJRXJyb3JUZXN0LnRocmlmdCBcCisJCQkJTmFtZXNUZXN0LnRocmlmdCBcCisJCQkJSW5pdGlhbGlzbXNUZXN0LnRocmlmdCBcCisJCQkJRG9udEV4cG9ydFJXVGVzdC50aHJpZnQgXAorCQkJCWRvbnRleHBvcnRyd3Rlc3QvY29tcGlsZV90ZXN0LmdvIFwKKwkJCQlJZ25vcmVJbml0aWFsaXNtc1Rlc3QudGhyaWZ0CisJbWtkaXIgLXAgZ29wYXRoL3NyYworCWdyZXAgLXYgbGlzdC4qbWFwLipsaXN0LiptYXAgJChUSFJJRlRURVNUKSB8IGdyZXAgLXYgJ3NldDxJbnNhbml0eT4nID4gVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSAtciBJbmNsdWRlc1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgQmluYXJ5S2V5VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBNdWx0aXBsZXhlZFByb3RvY29sVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBPbmV3YXlUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIE9wdGlvbmFsRmllbGRzVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBSZXF1aXJlZEZpZWxkVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBTZXJ2aWNlc1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgR29UYWdUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIFR5cGVkZWZGaWVsZFRlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgUmVmQW5ub3RhdGlvbkZpZWxkc1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgVW5pb25EZWZhdWx0VmFsdWVUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIFVuaW9uQmluYXJ5VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBFcnJvclRlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgTmFtZXNUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIEluaXRpYWxpc21zVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSxyZWFkX3dyaXRlX3ByaXZhdGUgRG9udEV4cG9ydFJXVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSxpZ25vcmVfaW5pdGlhbGlzbXMgSWdub3JlSW5pdGlhbGlzbXNUZXN0LnRocmlmdAorCUdPUEFUSD1gcHdkYC9nb3BhdGggJChHTykgZ2V0IGdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrIHx8IHRydWUKKwlzZWQgLWkgJ3MvXCJjb250ZXh0XCIvXCJnb2xhbmcub3JnXC94XC9uZXRcL2NvbnRleHRcIi9nJyBnb3BhdGgvc3JjL2dpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrL2NvbnRyb2xsZXIuZ28gfHwgdHJ1ZQorCUdPUEFUSD1gcHdkYC9nb3BhdGggJChHTykgZ2V0IGdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrCisJbG4gLW5mcyAuLi8uLi8uLi90aHJpZnQgZ29wYXRoL3NyYy90aHJpZnQKKwlsbiAtbmZzIC4uLy4uL3Rlc3RzIGdvcGF0aC9zcmMvdGVzdHMKKwljcCAtciAuL2RvbnRleHBvcnRyd3Rlc3QgZ29wYXRoL3NyYworCXRvdWNoIGdvcGF0aAorCitjaGVjazogZ29wYXRoCisJR09QQVRIPWBwd2RgL2dvcGF0aCAkKEdPKSBidWlsZCBcCisJCQkJaW5jbHVkZXN0ZXN0IFwKKwkJCQliaW5hcnlrZXl0ZXN0IFwKKwkJCQlzZXJ2aWNlc3Rlc3QgXAorCQkJCXR5cGVkZWZmaWVsZHRlc3QgXAorCQkJCXJlZmFubm90YXRpb25maWVsZHN0ZXN0IFwKKwkJCQllcnJvcnRlc3QJXAorCQkJCW5hbWVzdGVzdCBcCisJCQkJaW5pdGlhbGlzbXN0ZXN0IFwKKwkJCQlkb250ZXhwb3J0cnd0ZXN0IFwKKwkJCQlpZ25vcmVpbml0aWFsaXNtc3Rlc3QgXAorCQkJCXVuaW9uYmluYXJ5dGVzdAorCUdPUEFUSD1gcHdkYC9nb3BhdGggJChHTykgdGVzdCB0aHJpZnQgdGVzdHMgZG9udGV4cG9ydHJ3dGVzdAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnb3BhdGggVGhyaWZ0VGVzdC50aHJpZnQgZ2VuLWdvCisKK2NsaWVudDogc3R1YnMKKwkkKEdPKSBydW4gVGVzdENsaWVudC5nbworCitFWFRSQV9ESVNUID0gXAorCWRvbnRleHBvcnRyd3Rlc3QgXAorCXRlc3RzIFwKKwlCaW5hcnlLZXlUZXN0LnRocmlmdCBcCisJR29UYWdUZXN0LnRocmlmdCBcCisJSW5jbHVkZXNUZXN0LnRocmlmdCBcCisJTXVsdGlwbGV4ZWRQcm90b2NvbFRlc3QudGhyaWZ0IFwKKwlOYW1lc3BhY2VkVGVzdC50aHJpZnQgXAorCU9uZXdheVRlc3QudGhyaWZ0IFwKKwlPcHRpb25hbEZpZWxkc1Rlc3QudGhyaWZ0IFwKKwlSZXF1aXJlZEZpZWxkVGVzdC50aHJpZnQgXAorCVJlZkFubm90YXRpb25GaWVsZHNUZXN0LnRocmlmdCBcCisJVW5pb25EZWZhdWx0VmFsdWVUZXN0LnRocmlmdCBcCisJVW5pb25CaW5hcnlUZXN0LnRocmlmdCBcCisJU2VydmljZXNUZXN0LnRocmlmdCBcCisJVHlwZWRlZkZpZWxkVGVzdC50aHJpZnQgXAorCUVycm9yVGVzdC50aHJpZnQgXAorCU5hbWVzVGVzdC50aHJpZnQgXAorCUluaXRpYWxpc21zVGVzdC50aHJpZnQgXAorCURvbnRFeHBvcnRSV1Rlc3QudGhyaWZ0IFwKKwlJZ25vcmVJbml0aWFsaXNtc1Rlc3QudGhyaWZ0CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9NdWx0aXBsZXhlZFByb3RvY29sVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9NdWx0aXBsZXhlZFByb3RvY29sVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2M2Y1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L011bHRpcGxleGVkUHJvdG9jb2xUZXN0LnRocmlmdApAQCAtMCwwICsxLDI3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc2VydmljZSBGaXJzdCB7CisgICAgaTY0IHJldHVybk9uZSgpOworfQorCitzZXJ2aWNlIFNlY29uZCB7CisgICAgaTY0IHJldHVyblR3bygpOworfQorCmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9OYW1lc1Rlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvTmFtZXNUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2U5NTYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvTmFtZXNUZXN0LnRocmlmdApAQCAtMCwwICsxLDMyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc3RydWN0IE5hbWVzVGVzdCB7CisgICAgMTogcmVxdWlyZWQgc3RyaW5nIHR5cGUKK30KKworc2VydmljZSBOYW1lQ29sbGlzaW9uT25lCit7CisgICAgdm9pZCBibGFoQmxhaCgpCit9CisKK3NlcnZpY2UgTmFtZUNvbGxpc2lvblR3bworeworICAgIHZvaWQgYmxhaEJsYWgoKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvTmFtZXNwYWNlZFRlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvTmFtZXNwYWNlZFRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MTAzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9OYW1lc3BhY2VkVGVzdC50aHJpZnQKQEAgLTAsMCArMSw0MCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2luY2x1ZGUgIlRocmlmdFRlc3QudGhyaWZ0IgorCituYW1lc3BhY2UgZ28gbGliLmdvLnRlc3QubmFtZXNwYWNlZHRlc3QKKworZW51bSBTdHVmZiB7CisgIE9ORSA9IDEsCisgIFRXTyA9IDIsCit9CisKK2NvbnN0IGkzMiBUSFJFRSA9IDM7CisKK3R5cGVkZWYgaTY0IFVzZXJJZAorCitzdHJ1Y3QgU3R1ZmZTdHJ1Y3QgeworICAyOiBTdHVmZiBzdHVmZiwKK30KKworc2VydmljZSBOYW1lc3BhY2VkU2VydmljZSB7CisgIFRocmlmdFRlc3QuVXNlcklkIGdldFVzZXJJRCgpLAorfQorCmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9PbmV3YXlUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L09uZXdheVRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNDJmODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9PbmV3YXlUZXN0LnRocmlmdApAQCAtMCwwICsxLDI0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc2VydmljZSBPbmVXYXkgeworICAgIG9uZXdheSB2b2lkIGhpKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykKKyAgICB2b2lkIGVtcHR5ZnVuYygpCisgICAgaTY0IGVjaG9faW50KDE6IGk2NCBwYXJhbSkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L09wdGlvbmFsRmllbGRzVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9PcHRpb25hbEZpZWxkc1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZmMxNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9PcHRpb25hbEZpZWxkc1Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsNTAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzdHJ1Y3Qgc3RydWN0QSB7CisgMTogcmVxdWlyZWQgaTY0IHNhX2kKK30KKworc3RydWN0IGFsbF9vcHRpb25hbCB7CisgMTogb3B0aW9uYWwgc3RyaW5nIHMgPSAiREVGQVVMVCIsCisgMjogb3B0aW9uYWwgaTY0IGkgPSA0MiwKKyAzOiBvcHRpb25hbCBib29sIGIgPSBmYWxzZSwKKyA0OiBvcHRpb25hbCBzdHJpbmcgczIsCisgNTogb3B0aW9uYWwgaTY0IGkyLAorIDY6IG9wdGlvbmFsIGJvb2wgYjIsCisgNzogb3B0aW9uYWwgc3RydWN0QSBhYSwKKyA5OiBvcHRpb25hbCBsaXN0PGk2ND4gbCwKKyAxMDogb3B0aW9uYWwgbGlzdDxpNjQ+IGwyID0gWzEsIDJdLAorIDExOiBvcHRpb25hbCBtYXA8aTY0LCBpNjQ+IG0sCisgMTI6IG9wdGlvbmFsIG1hcDxpNjQsIGk2ND4gbTIgPSB7MToyLCAzOjR9LAorIDEzOiBvcHRpb25hbCBiaW5hcnkgYmluLAorIDE0OiBvcHRpb25hbCBiaW5hcnkgYmluMiA9ICJhc2RmIiwKK30KKworc3RydWN0IHN0cnVjdEIgeworIDE6IHJlcXVpcmVkIHN0cnVjdEEgcmVxdWlyZWRfc3RydWN0X3RoaW5nCisgMjogb3B0aW9uYWwgc3RydWN0QSBvcHRpb25hbF9zdHJ1Y3RfdGhpbmcKK30KKworc3RydWN0IHN0cnVjdEMgeworIDE6IHN0cmluZyBzLAorIDI6IHJlcXVpcmVkIGkzMiBpLAorIDM6IG9wdGlvbmFsIGJvb2wgYiwKKyA0OiByZXF1aXJlZCBzdHJpbmcgczIsCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9SZWZBbm5vdGF0aW9uRmllbGRzVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9SZWZBbm5vdGF0aW9uRmllbGRzVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdmMjhjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L1JlZkFubm90YXRpb25GaWVsZHNUZXN0LnRocmlmdApAQCAtMCwwICsxLDU4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc3RydWN0IHN0cnVjdEEgeworIDE6IHJlcXVpcmVkIGk2NCBzYV9pCit9CisKK3N0cnVjdCBhbGxfcmVmZXJlbmNlZCB7CisgMTogb3B0aW9uYWwgc3RyaW5nIHMgPSAiREVGQVVMVCIgKGNwcC5yZWYgPSAiIiksCisgMjogb3B0aW9uYWwgaTY0IGkgPSA0MiAoY3BwLnJlZiA9ICIiKSwKKyAzOiBvcHRpb25hbCBib29sIGIgPSBmYWxzZSAoY3BwLnJlZiA9ICIiKSwKKyA0OiBvcHRpb25hbCBzdHJpbmcgczIgKGNwcC5yZWYgPSAiIiksCisgNTogb3B0aW9uYWwgaTY0IGkyIChjcHAucmVmID0gIiIpLAorIDY6IG9wdGlvbmFsIGJvb2wgYjIgKGNwcC5yZWYgPSAiIiksCisgNzogb3B0aW9uYWwgc3RydWN0QSBhYSAoY3BwLnJlZiA9ICIiKSwKKyA5OiBvcHRpb25hbCBsaXN0PGk2ND4gbCAoY3BwLnJlZiA9ICIiKSwKKyAxMDogb3B0aW9uYWwgbGlzdDxpNjQ+IGwyID0gWzEsIDJdIChjcHAucmVmID0gIiIpLAorIDExOiBvcHRpb25hbCBtYXA8aTY0LCBpNjQ+IG0gKGNwcC5yZWYgPSAiIiksCisgMTI6IG9wdGlvbmFsIG1hcDxpNjQsIGk2ND4gbTIgPSB7MToyLCAzOjR9IChjcHAucmVmID0gIiIpLAorIDEzOiBvcHRpb25hbCBiaW5hcnkgYmluIChjcHAucmVmID0gIiIpLAorIDE0OiBvcHRpb25hbCBiaW5hcnkgYmluMiA9ICJhc2RmIiAoY3BwLnJlZiA9ICIiKSwKKworIDE1OiByZXF1aXJlZCBzdHJpbmcgcmVmX3MgPSAiREVGQVVMVCIgKGNwcC5yZWYgPSAiIiksCisgMTY6IHJlcXVpcmVkIGk2NCByZWZfaSA9IDQyIChjcHAucmVmID0gIiIpLAorIDE3OiByZXF1aXJlZCBib29sIHJlZl9iID0gZmFsc2UgKGNwcC5yZWYgPSAiIiksCisgMTg6IHJlcXVpcmVkIHN0cmluZyByZWZfczIgKGNwcC5yZWYgPSAiIiksCisgMTk6IHJlcXVpcmVkIGk2NCByZWZfaTIgKGNwcC5yZWYgPSAiIiksCisgMjA6IHJlcXVpcmVkIGJvb2wgcmVmX2IyIChjcHAucmVmID0gIiIpLAorIDIxOiByZXF1aXJlZCBzdHJ1Y3RBIHJlZl9hYSAoY3BwLnJlZiA9ICIiKSwKKyAyMjogcmVxdWlyZWQgbGlzdDxpNjQ+IHJlZl9sIChjcHAucmVmID0gIiIpLAorIDIzOiByZXF1aXJlZCBsaXN0PGk2ND4gcmVmX2wyID0gWzEsIDJdIChjcHAucmVmID0gIiIpLAorIDI0OiByZXF1aXJlZCBtYXA8aTY0LCBpNjQ+IHJlZl9tIChjcHAucmVmID0gIiIpLAorIDI1OiByZXF1aXJlZCBtYXA8aTY0LCBpNjQ+IHJlZl9tMiA9IHsxOjIsIDM6NH0gKGNwcC5yZWYgPSAiIiksCisgMjY6IHJlcXVpcmVkIGJpbmFyeSByZWZfYmluIChjcHAucmVmID0gIiIpLAorIDI3OiByZXF1aXJlZCBiaW5hcnkgcmVmX2JpbjIgPSAiYXNkZiIgKGNwcC5yZWYgPSAiIiksCisKK30KKworc3RydWN0IHN0cnVjdEIgeworIDE6IHJlcXVpcmVkIHN0cnVjdEEgcmVxdWlyZWRfc3RydWN0X3RoaW5nCisgMjogb3B0aW9uYWwgc3RydWN0QSBvcHRpb25hbF9zdHJ1Y3RfdGhpbmcKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L1JlcXVpcmVkRmllbGRUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L1JlcXVpcmVkRmllbGRUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTJkY2FlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvUmVxdWlyZWRGaWVsZFRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsNyBAQAorc3RydWN0IFJlcXVpcmVkRmllbGQgeworICAxOiByZXF1aXJlZCBzdHJpbmcgbmFtZQorfQorCitzdHJ1Y3QgT3RoZXJUaGluZyB7CisgIDE6IHJlcXVpcmVkIGkxNiB2YWx1ZQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvU2VydmljZXNUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L1NlcnZpY2VzVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyYjAzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L1NlcnZpY2VzVGVzdC50aHJpZnQKQEAgLTAsMCArMSwxMTEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIFdlIGFyZSBvbmx5IHRlc3RpbmcgdGhhdCBnZW5lcmF0ZWQgY29kZSBjb21waWxlcywgbm8gY29ycmVjdG5lc3MgY2hlY2tpbmcgaXMgZG9uZQorCitleGNlcHRpb24gbW9kZXJhdGVfZGlzYXN0ZXIgeworICAxOiBpMzIgZXJyb3JDb2RlLAorICAyOiBzdHJpbmcgbWVzc2FnZQorfQorCitleGNlcHRpb24gdG90YWxfZGlzYXN0ZXIgeworICAxOiBzdHJpbmcgbWVzc2FnZQorICAyOiBvcHRpb25hbCBib29sIHByZXNpZGVudF93YXNfd29rZW5fdXAgPSBmYWxzZQorfQorCitzdHJ1Y3Qgc3RydWN0X2EgeworICAxOiByZXF1aXJlZCBpNjQgd2hhdGV2ZXIKK30KKworc2VydmljZSBhX3NlcnYgeworICAgIHZvaWQgdm9pZGZ1bmMoKSwKKyAgICB2b2lkIHZvaWRfd2l0aF8xZXgoKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICB2b2lkIHZvaWRfd2l0aF8yZXgoKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgc3RyaW5nIHN0cmluZ2Z1bmMoKQorICAgIHN0cmluZyBzdHJpbmdmdW5jXzFleCgpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIHN0cmluZyBzdHJpbmdmdW5jXzJleCgpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBpNjQgaTY0ZnVuYygpCisgICAgaTY0IGk2NGZ1bmNfMWV4KCkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgaTY0IGk2NGZ1bmNfMmV4KCkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIGxpc3Q8c3RyaW5nPiBsaXN0X29mX3N0cmluZ3NfZnVuYygpCisgICAgbGlzdDxzdHJpbmc+IGxpc3Rfb2Zfc3RyaW5nc19mdW5jXzFleCgpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIGxpc3Q8c3RyaW5nPiBsaXN0X29mX3N0cmluZ3NfZnVuY18yZXgoKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgbWFwPGk2NCxzdHJpbmc+IG1hcF9mdW5jKCkKKyAgICBtYXA8aTY0LHN0cmluZz4gbWFwX2Z1bmNfMWV4KCkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgbWFwPGk2NCxzdHJpbmc+IG1hcF9mdW5jXzJleCgpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBzdHJ1Y3RfYSBzdHJ1Y3RfYV9mdW5jKCkKKyAgICBzdHJ1Y3RfYSBzdHJ1Y3RfYV9mdW5jXzFleCgpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIHN0cnVjdF9hIHN0cnVjdF9hX2Z1bmNfMmV4KCkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIHZvaWQgdm9pZGZ1bmNfMWludCgxOiBpNjQgaSksCisgICAgdm9pZCB2b2lkX3dpdGhfMWV4XzFpbnQoMTogaTY0IGkpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIHZvaWQgdm9pZF93aXRoXzJleF8xaW50KDE6IGk2NCBpKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgc3RyaW5nIHN0cmluZ2Z1bmNfMWludCgxOiBpNjQgaSkKKyAgICBzdHJpbmcgc3RyaW5nZnVuY18xZXhfMWludCgxOiBpNjQgaSkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgc3RyaW5nIHN0cmluZ2Z1bmNfMmV4XzFpbnQoMTogaTY0IGkpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBpNjQgaTY0ZnVuY18xaW50KDE6IGk2NCBpKQorICAgIGk2NCBpNjRmdW5jXzFleF8xaW50KDE6IGk2NCBpKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBpNjQgaTY0ZnVuY18yZXhfMWludCgxOiBpNjQgaSkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIGxpc3Q8c3RyaW5nPiBsaXN0X29mX3N0cmluZ3NfZnVuY18xaW50KDE6IGk2NCBpKQorICAgIGxpc3Q8c3RyaW5nPiBsaXN0X29mX3N0cmluZ3NfZnVuY18xZXhfMWludCgxOiBpNjQgaSkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgbGlzdDxzdHJpbmc+IGxpc3Rfb2Zfc3RyaW5nc19mdW5jXzJleF8xaW50KDE6IGk2NCBpKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgbWFwPGk2NCxzdHJpbmc+IG1hcF9mdW5jXzFpbnQoMTogaTY0IGkpCisgICAgbWFwPGk2NCxzdHJpbmc+IG1hcF9mdW5jXzFleF8xaW50KDE6IGk2NCBpKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBtYXA8aTY0LHN0cmluZz4gbWFwX2Z1bmNfMmV4XzFpbnQoMTogaTY0IGkpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBzdHJ1Y3RfYSBzdHJ1Y3RfYV9mdW5jXzFpbnQoMTogaTY0IGkpCisgICAgc3RydWN0X2Egc3RydWN0X2FfZnVuY18xZXhfMWludCgxOiBpNjQgaSkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgc3RydWN0X2Egc3RydWN0X2FfZnVuY18yZXhfMWludCgxOiBpNjQgaSkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIHZvaWQgdm9pZGZ1bmNfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpLAorICAgIHZvaWQgdm9pZF93aXRoXzFleF8xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgdm9pZCB2b2lkX3dpdGhfMmV4XzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgc3RyaW5nIHN0cmluZ2Z1bmNfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpCisgICAgc3RyaW5nIHN0cmluZ2Z1bmNfMWV4XzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBzdHJpbmcgc3RyaW5nZnVuY18yZXhfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBpNjQgaTY0ZnVuY18xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykKKyAgICBpNjQgaTY0ZnVuY18xZXhfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIGk2NCBpNjRmdW5jXzJleF8xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIGxpc3Q8c3RyaW5nPiBsaXN0X29mX3N0cmluZ3NfZnVuY18xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykKKyAgICBsaXN0PHN0cmluZz4gbGlzdF9vZl9zdHJpbmdzX2Z1bmNfMWV4XzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBsaXN0PHN0cmluZz4gbGlzdF9vZl9zdHJpbmdzX2Z1bmNfMmV4XzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgbWFwPGk2NCxzdHJpbmc+IG1hcF9mdW5jXzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKQorICAgIG1hcDxpNjQsc3RyaW5nPiBtYXBfZnVuY18xZXhfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIG1hcDxpNjQsc3RyaW5nPiBtYXBfZnVuY18yZXhfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBzdHJ1Y3RfYSBzdHJ1Y3RfYV9mdW5jXzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKQorICAgIHN0cnVjdF9hIHN0cnVjdF9hX2Z1bmNfMWV4XzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBzdHJ1Y3RfYSBzdHJ1Y3RfYV9mdW5jXzJleF8xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIHN0cnVjdF9hIHN0cnVjdF9hX2Z1bmNfMXN0cnVjdF9hKDE6IHN0cnVjdF9hIHN0KQorCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9UeXBlZGVmRmllbGRUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L1R5cGVkZWZGaWVsZFRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MGU4YzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9UeXBlZGVmRmllbGRUZXN0LnRocmlmdApAQCAtMCwwICsxLDM5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBXZSBhcmUgb25seSB0ZXN0aW5nIHRoYXQgZ2VuZXJhdGVkIGNvZGUgY29tcGlsZXMsIG5vIGNvcnJlY3RuZXNzIGNoZWNraW5nIGlzIGRvbmUKKworZW51bSBEZXRhaWxzIHsKKyAgRXZlcnl0aGluZyA9IDAKKyAgU3RhdGVPbmx5ID0gMQorICBTdGF0ZUFuZE9wdGlvbnMgPSAyCisgIFNvbWV0aGluZ0Vsc2UgPSAzCit9CisKK3R5cGVkZWYgbGlzdDwgRGV0YWlscz4gIERldGFpbHNXYW50ZWQKKworc3RydWN0IEJhc2VSZXF1ZXN0IHsKKyAgMSA6IG9wdGlvbmFsIHN0cmluZyBSZXF1ZXN0SUQKK30KKworc3RydWN0IEdldE15RGV0YWlscyB7CisgIDEgOiByZXF1aXJlZCBCYXNlUmVxdWVzdCBiYXNlXworICAyIDogcmVxdWlyZWQgc3RyaW5nIE9iamVjdElECisgIDMgOiBvcHRpb25hbCBEZXRhaWxzV2FudGVkIERldGFpbHNXYW50ZWQKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L1VuaW9uQmluYXJ5VGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9VbmlvbkJpbmFyeVRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NzExMmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9VbmlvbkJpbmFyeVRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMjUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIFNlZSBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NTczCit1bmlvbiBTYW1wbGUgeworICAxOiBtYXA8c3RyaW5nLCBzdHJpbmc+IHUxLAorICAyOiBiaW5hcnkgdTIsCisgIDM6IGxpc3Q8c3RyaW5nPiB1MworfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvVW5pb25EZWZhdWx0VmFsdWVUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L1VuaW9uRGVmYXVsdFZhbHVlVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM5MzQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L1VuaW9uRGVmYXVsdFZhbHVlVGVzdC50aHJpZnQKQEAgLTAsMCArMSwzNCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3N0cnVjdCBPcHRpb24xIHsKK30KKworc3RydWN0IE9wdGlvbjIgeworICAxOiBvcHRpb25hbCBzdHJpbmcgbmFtZQorfQorCit1bmlvbiBEZXNjZW5kYW50IHsKKyAgMTogT3B0aW9uMSBvcHRpb24xCisgIDI6IE9wdGlvbjIgb3B0aW9uMgorfQorCitzdHJ1Y3QgVGVzdFN0cnVjdCB7CisgIDE6IG9wdGlvbmFsIERlc2NlbmRhbnQgZGVzY2VuZGFudCA9IHsgIm9wdGlvbjEiOiB7fX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L2RvbnRleHBvcnRyd3Rlc3QvY29tcGlsZV90ZXN0LmdvIGIvbGliL2dvL3Rlc3QvZG9udGV4cG9ydHJ3dGVzdC9jb21waWxlX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2NzYzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L2RvbnRleHBvcnRyd3Rlc3QvY29tcGlsZV90ZXN0LmdvCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBkb250ZXhwb3J0cnd0ZXN0CisKK2ltcG9ydCAoCisJInRlc3RpbmciCispCisKKy8vIE1ha2Ugc3VyZSB0aGF0IHRocmlmdCBnZW5lcmF0ZXMgbm9uLWV4cG9ydGVkIHJlYWQvd3JpdGUgbWV0aG9kcyBpZgorLy8gcmVhZF93cml0ZV9wcml2YXRlIG9wdGlvbiBpcyBzcGVjaWZpZWQKK2Z1bmMgVGVzdFJlYWRXcml0ZU1ldGhvZHNBcmVQcml2YXRlKHQgKnRlc3RpbmcuVCkgeworCS8vIFRoaXMgd2lsbCBvbmx5IGNvbXBpbGUgaWYgcmVhZC93cml0ZSBtZXRob2RzIGV4aXN0CisJcyA6PSBOZXdUZXN0U3RydWN0KCkKKwlfID0gcy5yZWFkCisJXyA9IHMud3JpdGUKKworCWlzIDo9IE5ld0lubmVyU3RydWN0KCkKKwlfID0gaXMucmVhZAorCV8gPSBpcy53cml0ZQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvYmluYXJ5X2tleV90ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvYmluYXJ5X2tleV90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOTYxOTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9iaW5hcnlfa2V5X3Rlc3QuZ28KQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJImJpbmFyeWtleXRlc3QiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdEJpbmFyeU1hcEtleUdlbmVyYXRlc1N0cmluZyh0ICp0ZXN0aW5nLlQpIHsKKwlzIDo9IGJpbmFyeWtleXRlc3QuTmV3VGVzdFN0cnVjdCgpCisJLy9UaGlzIHdpbGwgb25seSBjb21waWxlIGlmIEJpblRvU3RyaW5nIGhhcyB0eXBlIG9mIG1hcFtzdHJpbmddc3RyaW5nCisJcy5CaW5Ub1N0cmluZyA9IG1ha2UobWFwW3N0cmluZ11zdHJpbmcpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9jbGllbnRfZXJyb3JfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL2NsaWVudF9lcnJvcl90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZWM0ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9jbGllbnRfZXJyb3JfdGVzdC5nbwpAQCAtMCwwICsxLDg3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImVycm9ycyIKKwkiZXJyb3J0ZXN0IgorCSJ0ZXN0aW5nIgorCSJ0aHJpZnQiCisKKwkiZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2siCispCisKKy8vIFRlc3RDYXNlOiBDb21wcmVoZW5zaXZlIGNhbGwgYW5kIHJlcGx5IHdvcmtmbG93IGluIHRoZSBjbGllbnQuCisvLyBTZXR1cCBtb2NrIHRvIGZhaWwgYXQgYSBjZXJ0YWluIHBvc2l0aW9uLiBSZXR1cm4gdHJ1ZSBpZiBwb3NpdGlvbiBleGlzdHMgb3RoZXJ3aXNlIGZhbHNlLgorZnVuYyBwcmVwYXJlQ2xpZW50Q2FsbFJlcGx5KHByb3RvY29sICpNb2NrVFByb3RvY29sLCBmYWlsQXQgaW50LCBmYWlsV2l0aCBlcnJvcikgYm9vbCB7CisJdmFyIGVyciBlcnJvciA9IG5pbAorCisJaWYgZmFpbEF0ID09IDAgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0IDo9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUJlZ2luKCJ0ZXN0U3RydWN0IiwgdGhyaWZ0LkNBTEwsIGludDMyKDEpKS5SZXR1cm4oZXJyKQorCWlmIGZhaWxBdCA9PSAwIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDEgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigidGVzdFN0cnVjdF9hcmdzIikuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigidGhpbmciLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUlVDVCksIGludDE2KDEpKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDMgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigiVGVzdFN0cnVjdCIpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDMgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oIm0iLCB0aHJpZnQuVFR5cGUodGhyaWZ0Lk1BUCksIGludDE2KDEpKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDUgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNYXBCZWdpbih0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgMCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA2IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlTWFwRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA3IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA3IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDggeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJsIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5MSVNUKSwgaW50MTYoMikpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDggeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gOSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUxpc3RCZWdpbih0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIDApLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDkgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMTAgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVMaXN0RW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMTAgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMTEgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDExIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDEyIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisKKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJzIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TRVQpLCBpbnQxNigzKSkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMTIgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMTMgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTZXRCZWdpbih0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIDApLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDEzIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDE0IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlU2V0RW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMTQgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMTUgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDE1IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDE2IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigiaSIsIHRocmlmdC5UVHlwZSh0aHJpZnQuSTMyKSwgaW50MTYoNCkpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDE2IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDE3IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlSTMyKGludDMyKDMpKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxNyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxOCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMTggeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMTkgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxOSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyMCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDIwIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDIxIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyMSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyMiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDIyIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDIzIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMjMgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMjQgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMjQgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMjUgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDI1IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDI2IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRNZXNzYWdlQmVnaW4oKS5SZXR1cm4oInRlc3RTdHJ1Y3QiLCB0aHJpZnQuUkVQTFksIGludDMyKDEpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDI2IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDI3IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJ1Y3RCZWdpbigpLlJldHVybigidGVzdFN0cnVjdF9hcmdzIiwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyNyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyOCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigiXyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSVUNUKSwgaW50MTYoMCksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMjggeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMjkgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEJlZ2luKCkuUmV0dXJuKCJUZXN0U3RydWN0IiwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyOSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzMCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigibSIsIHRocmlmdC5UVHlwZSh0aHJpZnQuTUFQKSwgaW50MTYoMSksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMzAgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMzEgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1hcEJlZ2luKCkuUmV0dXJuKHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCAwLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDMxIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDMyIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRNYXBFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzMiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzMyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzMyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzNCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigibCIsIHRocmlmdC5UVHlwZSh0aHJpZnQuTElTVCksIGludDE2KDIpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDM0IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDM1IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRMaXN0QmVnaW4oKS5SZXR1cm4odGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCAwLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDM1IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDM2IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRMaXN0RW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMzYgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMzcgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMzcgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMzggeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oInMiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNFVCksIGludDE2KDMpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDM4IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDM5IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRTZXRCZWdpbigpLlJldHVybih0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIDAsIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMzkgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNDAgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFNldEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQwIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQxIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQxIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQyIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJpIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5JMzIpLCBpbnQxNig0KSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0MiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0MyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkSTMyKCkuUmV0dXJuKGludDMyKDMpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQzIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQ0IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQ0IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQ1IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJfIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVE9QKSwgaW50MTYoNSksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNDUgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNDYgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQ2IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQ3IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQ3IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQ4IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJfIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVE9QKSwgaW50MTYoMSksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNDggeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNDkgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQ5IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDUwIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRNZXNzYWdlRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNTAgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlyZXR1cm4gZmFsc2UKK30KKworLy8gVGVzdENhc2U6IENvbXByZWhlbnNpdmUgY2FsbCBhbmQgcmVwbHkgd29ya2Zsb3cgaW4gdGhlIGNsaWVudC4KKy8vIEV4cGVjdGluZyBUVHJhbnNwb3J0RXJyb3Igb24gZmFpbC4KK2Z1bmMgVGVzdENsaWVudFJlcG9ydFRUcmFuc3BvcnRFcnJvcnModCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKworCXRoaW5nIDo9IGVycm9ydGVzdC5OZXdUZXN0U3RydWN0KCkKKwl0aGluZy5NID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZykKKwl0aGluZy5MID0gbWFrZShbXXN0cmluZywgMCkKKwl0aGluZy5TID0gbWFrZShbXXN0cmluZywgMCkKKwl0aGluZy5JID0gMworCisJZXJyIDo9IHRocmlmdC5OZXdUVHJhbnNwb3J0RXhjZXB0aW9uKHRocmlmdC5USU1FRF9PVVQsICJ0ZXN0IikKKwlmb3IgaSA6PSAwOyA7IGkrKyB7CisJCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJCWlmICFwcmVwYXJlQ2xpZW50Q2FsbFJlcGx5KHByb3RvY29sLCBpLCBlcnIpIHsKKwkJCXJldHVybgorCQl9CisJCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RydWN0KGRlZmF1bHRDdHgsIHRoaW5nKQorCQltb2NrQ3RybC5GaW5pc2goKQorCQltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJCWVycjIsIG9rIDo9IHJldEVyci4odGhyaWZ0LlRUcmFuc3BvcnRFeGNlcHRpb24pCisJCWlmICFvayB7CisJCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRUcmFzcG9ydEV4Y2VwdGlvbiIpCisJCX0KKworCQlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5USU1FRF9PVVQgeworCQkJdC5GYXRhbCgiRXhwZWN0ZWQgVElNRURfT1VUIGVycm9yIikKKwkJfQorCX0KK30KKworLy8gVGVzdENhc2U6IENvbXByZWhlbnNpdmUgY2FsbCBhbmQgcmVwbHkgd29ya2Zsb3cgaW4gdGhlIGNsaWVudC4KKy8vIEV4cGVjdGluZyBUVHJhbnNwb3J0RXJyb3Igb24gZmFpbC4KKy8vIFNpbWlsYXIgdG8gVGVzdENsaWVudFJlcG9ydFRUcmFuc3BvcnRFcnJvcnMsIGJ1dCB1c2luZyBsZWdhY3kgY2xpZW50IGNvbnN0cnVjdG9yLgorZnVuYyBUZXN0Q2xpZW50UmVwb3J0VFRyYW5zcG9ydEVycm9yc0xlZ2FjeSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VE1lbW9yeUJ1ZmZlcigpCisJdGhpbmcgOj0gZXJyb3J0ZXN0Lk5ld1Rlc3RTdHJ1Y3QoKQorCXRoaW5nLk0gPSBtYWtlKG1hcFtzdHJpbmddc3RyaW5nKQorCXRoaW5nLkwgPSBtYWtlKFtdc3RyaW5nLCAwKQorCXRoaW5nLlMgPSBtYWtlKFtdc3RyaW5nLCAwKQorCXRoaW5nLkkgPSAzCisKKwllcnIgOj0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRFeGNlcHRpb24odGhyaWZ0LlRJTUVEX09VVCwgInRlc3QiKQorCWZvciBpIDo9IDA7IDsgaSsrIHsKKwkJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwkJaWYgIXByZXBhcmVDbGllbnRDYWxsUmVwbHkocHJvdG9jb2wsIGksIGVycikgeworCQkJcmV0dXJuCisJCX0KKwkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKKwkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RydWN0KGRlZmF1bHRDdHgsIHRoaW5nKQorCQltb2NrQ3RybC5GaW5pc2goKQorCQltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJCWVycjIsIG9rIDo9IHJldEVyci4odGhyaWZ0LlRUcmFuc3BvcnRFeGNlcHRpb24pCisJCWlmICFvayB7CisJCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRUcmFzcG9ydEV4Y2VwdGlvbiIpCisJCX0KKworCQlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5USU1FRF9PVVQgeworCQkJdC5GYXRhbCgiRXhwZWN0ZWQgVElNRURfT1VUIGVycm9yIikKKwkJfQorCX0KK30KKworLy8gVGVzdENhc2U6IENvbXByZWhlbnNpdmUgY2FsbCBhbmQgcmVwbHkgd29ya2Zsb3cgaW4gdGhlIGNsaWVudC4KKy8vIEV4cGVjdGluZyBUVFByb3RvY29sRXJyb3JzIG9uIGZhaWwuCitmdW5jIFRlc3RDbGllbnRSZXBvcnRUUHJvdG9jb2xFcnJvcnModCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKworCXRoaW5nIDo9IGVycm9ydGVzdC5OZXdUZXN0U3RydWN0KCkKKwl0aGluZy5NID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZykKKwl0aGluZy5MID0gbWFrZShbXXN0cmluZywgMCkKKwl0aGluZy5TID0gbWFrZShbXXN0cmluZywgMCkKKwl0aGluZy5JID0gMworCisJZXJyIDo9IHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZSh0aHJpZnQuSU5WQUxJRF9EQVRBLCBlcnJvcnMuTmV3KCJ0ZXN0IikpCisJZm9yIGkgOj0gMDsgOyBpKysgeworCQlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCQlpZiAhcHJlcGFyZUNsaWVudENhbGxSZXBseShwcm90b2NvbCwgaSwgZXJyKSB7CisJCQlyZXR1cm4KKwkJfQorCQljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisJCV8sIHJldEVyciA6PSBjbGllbnQuVGVzdFN0cnVjdChkZWZhdWx0Q3R4LCB0aGluZykKKwkJbW9ja0N0cmwuRmluaXNoKCkKKwkJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCQllcnIyLCBvayA6PSByZXRFcnIuKHRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24pCisJCWlmICFvayB7CisJCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRQcm90b2NvbEV4Y2VwdGlvbiIpCisJCX0KKwkJaWYgZXJyMi5UeXBlSWQoKSAhPSB0aHJpZnQuSU5WQUxJRF9EQVRBIHsKKwkJCXQuRmF0YWwoIkV4cGVjdGVkIElOVkFMSURfREFUQSBlcnJvciIpCisJCX0KKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBDb21wcmVoZW5zaXZlIGNhbGwgYW5kIHJlcGx5IHdvcmtmbG93IGluIHRoZSBjbGllbnQuCisvLyBFeHBlY3RpbmcgVFRQcm90b2NvbEVycm9ycyBvbiBmYWlsLgorLy8gU2ltaWxhciB0byBUZXN0Q2xpZW50UmVwb3J0VFByb3RvY29sRXJyb3JzLCBidXQgdXNpbmcgbGVnYWN5IGNsaWVudCBjb25zdHJ1Y3Rvci4KK2Z1bmMgVGVzdENsaWVudFJlcG9ydFRQcm90b2NvbEVycm9yc0xlZ2FjeSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VE1lbW9yeUJ1ZmZlcigpCisJdGhpbmcgOj0gZXJyb3J0ZXN0Lk5ld1Rlc3RTdHJ1Y3QoKQorCXRoaW5nLk0gPSBtYWtlKG1hcFtzdHJpbmddc3RyaW5nKQorCXRoaW5nLkwgPSBtYWtlKFtdc3RyaW5nLCAwKQorCXRoaW5nLlMgPSBtYWtlKFtdc3RyaW5nLCAwKQorCXRoaW5nLkkgPSAzCisKKwllcnIgOj0gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKHRocmlmdC5JTlZBTElEX0RBVEEsIGVycm9ycy5OZXcoInRlc3QiKSkKKwlmb3IgaSA6PSAwOyA7IGkrKyB7CisJCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJCWlmICFwcmVwYXJlQ2xpZW50Q2FsbFJlcGx5KHByb3RvY29sLCBpLCBlcnIpIHsKKwkJCXJldHVybgorCQl9CisJCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCisJCV8sIHJldEVyciA6PSBjbGllbnQuVGVzdFN0cnVjdChkZWZhdWx0Q3R4LCB0aGluZykKKwkJbW9ja0N0cmwuRmluaXNoKCkKKwkJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCQllcnIyLCBvayA6PSByZXRFcnIuKHRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24pCisJCWlmICFvayB7CisJCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRQcm90b2NvbEV4Y2VwdGlvbiIpCisJCX0KKwkJaWYgZXJyMi5UeXBlSWQoKSAhPSB0aHJpZnQuSU5WQUxJRF9EQVRBIHsKKwkJCXQuRmF0YWwoIkV4cGVjdGVkIElOVkFMSURfREFUQSBlcnJvciIpCisJCX0KKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBjYWxsIGFuZCByZXBseSB3aXRoIGV4Y2VwdGlvbiB3b3JrZmxvdyBpbiB0aGUgY2xpZW50LgorLy8gU2V0dXAgbW9jayB0byBmYWlsIGF0IGEgY2VydGFpbiBwb3NpdGlvbi4gUmV0dXJuIHRydWUgaWYgcG9zaXRpb24gZXhpc3RzIG90aGVyd2lzZSBmYWxzZS4KK2Z1bmMgcHJlcGFyZUNsaWVudENhbGxFeGNlcHRpb24ocHJvdG9jb2wgKk1vY2tUUHJvdG9jb2wsIGZhaWxBdCBpbnQsIGZhaWxXaXRoIGVycm9yKSBib29sIHsKKwl2YXIgZXJyIGVycm9yID0gbmlsCisKKwkvLyBObyBuZWVkIHRvIHRlc3QgZmFpbHVyZSBpbiB0aGlzIGJsb2NrLCBiZWNhdXNlIGl0IGlzIGNvdmVyZWQgaW4gb3RoZXIgdGVzdCBjYXNlcworCWxhc3QgOj0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlQmVnaW4oInRlc3RTdHJpbmciLCB0aHJpZnQuQ0FMTCwgaW50MzIoMSkpCisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oInRlc3RTdHJpbmdfYXJncyIpLkFmdGVyKGxhc3QpCisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigicyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoMSkpLkFmdGVyKGxhc3QpCisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RyaW5nKCJ0ZXN0IikuQWZ0ZXIobGFzdCkKKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLkFmdGVyKGxhc3QpCisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCkuQWZ0ZXIobGFzdCkKKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKS5BZnRlcihsYXN0KQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VFbmQoKS5BZnRlcihsYXN0KQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkuQWZ0ZXIobGFzdCkKKworCS8vIFJlYWRpbmcgdGhlIGV4Y2VwdGlvbiwgbWlnaHQgZmFpbC4KKwlpZiBmYWlsQXQgPT0gMCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUJlZ2luKCkuUmV0dXJuKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LkVYQ0VQVElPTiwgaW50MzIoMSksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJ1Y3RCZWdpbigpLlJldHVybigiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDIgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oIm1lc3NhZ2UiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDEpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDIgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RyaW5nKCkuUmV0dXJuKCJ0ZXN0IiwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA1IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJ0eXBlIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5JMzIpLCBpbnQxNigyKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA1IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDYgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEkzMigpLlJldHVybihpbnQzMih0aHJpZnQuUFJPVE9DT0xfRVJST1IpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDYgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA3IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDggeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oIl8iLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUT1ApLCBpbnQxNigyKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA4IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDkgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDkgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMTAgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxMCB7CisJCXJldHVybiB0cnVlCisJfQorCisJcmV0dXJuIGZhbHNlCit9CisKKy8vIFRlc3RDYXNlOiBjYWxsIGFuZCByZXBseSB3aXRoIGV4Y2VwdGlvbiB3b3JrZmxvdyBpbiB0aGUgY2xpZW50LgorZnVuYyBUZXN0Q2xpZW50Q2FsbEV4Y2VwdGlvbih0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCisJZXJyIDo9IHRocmlmdC5OZXdUVHJhbnNwb3J0RXhjZXB0aW9uKHRocmlmdC5USU1FRF9PVVQsICJ0ZXN0IikKKwlmb3IgaSA6PSAwOyA7IGkrKyB7CisJCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJCXdpbGxDb21wbGV0ZSA6PSAhcHJlcGFyZUNsaWVudENhbGxFeGNlcHRpb24ocHJvdG9jb2wsIGksIGVycikKKworCQljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisJCV8sIHJldEVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAidGVzdCIpCisJCW1vY2tDdHJsLkZpbmlzaCgpCisJCW1vY2tDdHJsID0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKworCQlpZiAhd2lsbENvbXBsZXRlIHsKKwkJCWVycjIsIG9rIDo9IHJldEVyci4odGhyaWZ0LlRUcmFuc3BvcnRFeGNlcHRpb24pCisJCQlpZiAhb2sgeworCQkJCXQuRmF0YWwoIkV4cGVjdGVkIGEgVFRyYW5zcG9ydEV4Y2VwdGlvbiIpCisJCQl9CisJCQlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5USU1FRF9PVVQgeworCQkJCXQuRmF0YWwoIkV4cGVjdGVkIFRJTUVEX09VVCBlcnJvciIpCisJCQl9CisJCX0gZWxzZSB7CisJCQllcnIyLCBvayA6PSByZXRFcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJCQlpZiAhb2sgeworCQkJCXQuRmF0YWwoIkV4cGVjdGVkIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwkJCX0KKwkJCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LlBST1RPQ09MX0VSUk9SIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBQUk9UT0NPTF9FUlJPUiBlcnJvciIpCisJCQl9CisJCQlicmVhaworCQl9CisJfQorfQorCisvLyBUZXN0Q2FzZTogY2FsbCBhbmQgcmVwbHkgd2l0aCBleGNlcHRpb24gd29ya2Zsb3cgaW4gdGhlIGNsaWVudC4KKy8vIFNpbWlsYXIgdG8gVGVzdENsaWVudENhbGxFeGNlcHRpb24sIGJ1dCB1c2luZyBsZWdhY3kgY2xpZW50IGNvbnN0cnVjdG9yLgorZnVuYyBUZXN0Q2xpZW50Q2FsbEV4Y2VwdGlvbkxlZ2FjeSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VE1lbW9yeUJ1ZmZlcigpCisJZXJyIDo9IHRocmlmdC5OZXdUVHJhbnNwb3J0RXhjZXB0aW9uKHRocmlmdC5USU1FRF9PVVQsICJ0ZXN0IikKKwlmb3IgaSA6PSAwOyA7IGkrKyB7CisJCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJCXdpbGxDb21wbGV0ZSA6PSAhcHJlcGFyZUNsaWVudENhbGxFeGNlcHRpb24ocHJvdG9jb2wsIGksIGVycikKKworCQljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudFByb3RvY29sKHRyYW5zcG9ydCwgcHJvdG9jb2wsIHByb3RvY29sKQorCQlfLCByZXRFcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQorCQltb2NrQ3RybC5GaW5pc2goKQorCQltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisKKwkJaWYgIXdpbGxDb21wbGV0ZSB7CisJCQllcnIyLCBvayA6PSByZXRFcnIuKHRocmlmdC5UVHJhbnNwb3J0RXhjZXB0aW9uKQorCQkJaWYgIW9rIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRUcmFuc3BvcnRFeGNlcHRpb24iKQorCQkJfQorCQkJaWYgZXJyMi5UeXBlSWQoKSAhPSB0aHJpZnQuVElNRURfT1VUIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBUSU1FRF9PVVQgZXJyb3IiKQorCQkJfQorCQl9IGVsc2UgeworCQkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCQkJaWYgIW9rIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJCQl9CisJCQlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5QUk9UT0NPTF9FUlJPUiB7CisJCQkJdC5GYXRhbCgiRXhwZWN0ZWQgUFJPVE9DT0xfRVJST1IgZXJyb3IiKQorCQkJfQorCQkJYnJlYWsKKwkJfQorCX0KK30KKworLy8gVGVzdENhc2U6IE1pc21hdGNoaW5nIHNlcXVlbmNlIGlkIGhhcyBiZWVuIHJlY2VpdmVkIGluIHRoZSBjbGllbnQuCitmdW5jIFRlc3RDbGllbnRTZXFJZE1pc21hdGNoKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlQmVnaW4oInRlc3RTdHJpbmciLCB0aHJpZnQuQ0FMTCwgaW50MzIoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJ0ZXN0U3RyaW5nX2FyZ3MiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJzIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCBpbnQxNigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RyaW5nKCJ0ZXN0IiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidGVzdFN0cmluZyIsIHRocmlmdC5SRVBMWSwgaW50MzIoMiksIG5pbCksCisJKQorCisJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCV8sIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAidGVzdCIpCisJbW9ja0N0cmwuRmluaXNoKCkKKwlhcHBFcnIsIG9rIDo9IGVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKwlpZiAhb2sgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBUQXBwbGljYXRpb25FeGNlcHRpb24iKQorCX0KKwlpZiBhcHBFcnIuVHlwZUlkKCkgIT0gdGhyaWZ0LkJBRF9TRVFVRU5DRV9JRCB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIEJBRF9TRVFVRU5DRV9JRCBlcnJvciIpCisJfQorfQorCisvLyBUZXN0Q2FzZTogTWlzbWF0Y2hpbmcgc2VxdWVuY2UgaWQgaGFzIGJlZW4gcmVjZWl2ZWQgaW4gdGhlIGNsaWVudC4KKy8vIFNpbWlsYXIgdG8gVGVzdENsaWVudFNlcUlkTWlzbWF0Y2gsIGJ1dCB1c2luZyBsZWdhY3kgY2xpZW50IGNvbnN0cnVjdG9yLgorZnVuYyBUZXN0Q2xpZW50U2VxSWRNaXNtYXRjaExlZ2VhY3kodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQorCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUJlZ2luKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LkNBTEwsIGludDMyKDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigidGVzdFN0cmluZ19hcmdzIiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigicyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cmluZygidGVzdCIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRNZXNzYWdlQmVnaW4oKS5SZXR1cm4oInRlc3RTdHJpbmciLCB0aHJpZnQuUkVQTFksIGludDMyKDIpLCBuaWwpLAorCSkKKworCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCisJXywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKKwltb2NrQ3RybC5GaW5pc2goKQorCWFwcEVyciwgb2sgOj0gZXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJfQorCWlmIGFwcEVyci5UeXBlSWQoKSAhPSB0aHJpZnQuQkFEX1NFUVVFTkNFX0lEIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgQkFEX1NFUVVFTkNFX0lEIGVycm9yIikKKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBXcm9uZyBtZXRob2QgbmFtZSBoYXMgYmVlbiByZWNlaXZlZCBpbiB0aGUgY2xpZW50LgorZnVuYyBUZXN0Q2xpZW50V3JvbmdNZXRob2ROYW1lKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlQmVnaW4oInRlc3RTdHJpbmciLCB0aHJpZnQuQ0FMTCwgaW50MzIoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJ0ZXN0U3RyaW5nX2FyZ3MiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJzIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCBpbnQxNigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RyaW5nKCJ0ZXN0IiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidW5rbm93biIsIHRocmlmdC5SRVBMWSwgaW50MzIoMSksIG5pbCksCisJKQorCisJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCV8sIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAidGVzdCIpCisJbW9ja0N0cmwuRmluaXNoKCkKKwlhcHBFcnIsIG9rIDo9IGVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKwlpZiAhb2sgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBUQXBwbGljYXRpb25FeGNlcHRpb24iKQorCX0KKwlpZiBhcHBFcnIuVHlwZUlkKCkgIT0gdGhyaWZ0LldST05HX01FVEhPRF9OQU1FIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgV1JPTkdfTUVUSE9EX05BTUUgZXJyb3IiKQorCX0KK30KKworLy8gVGVzdENhc2U6IFdyb25nIG1ldGhvZCBuYW1lIGhhcyBiZWVuIHJlY2VpdmVkIGluIHRoZSBjbGllbnQuCisvLyBTaW1pbGFyIHRvIFRlc3RDbGllbnRXcm9uZ01ldGhvZE5hbWUsIGJ1dCB1c2luZyBsZWdhY3kgY2xpZW50IGNvbnN0cnVjdG9yLgorZnVuYyBUZXN0Q2xpZW50V3JvbmdNZXRob2ROYW1lTGVnYWN5KHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKKwlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VCZWdpbigidGVzdFN0cmluZyIsIHRocmlmdC5DQUxMLCBpbnQzMigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oInRlc3RTdHJpbmdfYXJncyIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oInMiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJpbmcoInRlc3QiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUJlZ2luKCkuUmV0dXJuKCJ1bmtub3duIiwgdGhyaWZ0LlJFUExZLCBpbnQzMigxKSwgbmlsKSwKKwkpCisKKwljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudFByb3RvY29sKHRyYW5zcG9ydCwgcHJvdG9jb2wsIHByb3RvY29sKQorCV8sIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAidGVzdCIpCisJbW9ja0N0cmwuRmluaXNoKCkKKwlhcHBFcnIsIG9rIDo9IGVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKwlpZiAhb2sgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBUQXBwbGljYXRpb25FeGNlcHRpb24iKQorCX0KKwlpZiBhcHBFcnIuVHlwZUlkKCkgIT0gdGhyaWZ0LldST05HX01FVEhPRF9OQU1FIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgV1JPTkdfTUVUSE9EX05BTUUgZXJyb3IiKQorCX0KK30KKworLy8gVGVzdENhc2U6IFdyb25nIG1lc3NhZ2UgdHlwZSBoYXMgYmVlbiByZWNlaXZlZCBpbiB0aGUgY2xpZW50LgorZnVuYyBUZXN0Q2xpZW50V3JvbmdNZXNzYWdlVHlwZSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUJlZ2luKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LkNBTEwsIGludDMyKDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigidGVzdFN0cmluZ19hcmdzIiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigicyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cmluZygidGVzdCIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRNZXNzYWdlQmVnaW4oKS5SZXR1cm4oInRlc3RTdHJpbmciLCB0aHJpZnQuSU5WQUxJRF9UTUVTU0FHRV9UWVBFLCBpbnQzMigxKSwgbmlsKSwKKwkpCisKKwljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisJXywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKKwltb2NrQ3RybC5GaW5pc2goKQorCWFwcEVyciwgb2sgOj0gZXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJfQorCWlmIGFwcEVyci5UeXBlSWQoKSAhPSB0aHJpZnQuSU5WQUxJRF9NRVNTQUdFX1RZUEVfRVhDRVBUSU9OIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgSU5WQUxJRF9NRVNTQUdFX1RZUEVfRVhDRVBUSU9OIGVycm9yIikKKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBXcm9uZyBtZXNzYWdlIHR5cGUgaGFzIGJlZW4gcmVjZWl2ZWQgaW4gdGhlIGNsaWVudC4KKy8vIFNpbWlsYXIgdG8gVGVzdENsaWVudFdyb25nTWVzc2FnZVR5cGUsIGJ1dCB1c2luZyBsZWdhY3kgY2xpZW50IGNvbnN0cnVjdG9yLgorZnVuYyBUZXN0Q2xpZW50V3JvbmdNZXNzYWdlVHlwZUxlZ2FjeSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VE1lbW9yeUJ1ZmZlcigpCisJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlQmVnaW4oInRlc3RTdHJpbmciLCB0aHJpZnQuQ0FMTCwgaW50MzIoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJ0ZXN0U3RyaW5nX2FyZ3MiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJzIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCBpbnQxNigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RyaW5nKCJ0ZXN0IiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidGVzdFN0cmluZyIsIHRocmlmdC5JTlZBTElEX1RNRVNTQUdFX1RZUEUsIGludDMyKDEpLCBuaWwpLAorCSkKKworCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCisJXywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKKwltb2NrQ3RybC5GaW5pc2goKQorCWFwcEVyciwgb2sgOj0gZXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJfQorCWlmIGFwcEVyci5UeXBlSWQoKSAhPSB0aHJpZnQuSU5WQUxJRF9NRVNTQUdFX1RZUEVfRVhDRVBUSU9OIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgSU5WQUxJRF9NRVNTQUdFX1RZUEVfRVhDRVBUSU9OIGVycm9yIikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9jb250ZXh0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvY29udGV4dC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTNhODJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvY29udGV4dC5nbwpAQCAtMCwwICsxLDI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKykKKwordmFyIGRlZmF1bHRDdHggPSBjb250ZXh0LkJhY2tncm91bmQoKQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvZW5jb2RpbmdfanNvbl90ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvZW5jb2RpbmdfanNvbl90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZDQ1NjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9lbmNvZGluZ19qc29uX3Rlc3QuZ28KQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJImVuY29kaW5nIgorCSJlbmNvZGluZy9qc29uIgorCSJ0ZXN0aW5nIgorCSJ0aHJpZnR0ZXN0IgorKQorCitmdW5jIFRlc3RFbnVtSXNUZXh0TWFyc2hhbGxlcih0ICp0ZXN0aW5nLlQpIHsKKwlvbmUgOj0gdGhyaWZ0dGVzdC5OdW1iZXJ6X09ORQorCXZhciB0bSBlbmNvZGluZy5UZXh0TWFyc2hhbGVyID0gb25lCisJYiwgZXJyIDo9IHRtLk1hcnNoYWxUZXh0KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgZnJvbSBNYXJzaGFsVGV4dDogJXMiLCBlcnIpCisJfQorCWlmIHN0cmluZyhiKSAhPSBvbmUuU3RyaW5nKCkgeworCQl0LkVycm9yZigiTWFyc2hhbFRleHQoJXMpID0gJXMsIGV4cGVjdGVkID0gJXMiLCBvbmUsIGIsIG9uZSkKKwl9Cit9CisKK2Z1bmMgVGVzdEVudW1Jc1RleHRVbm1hcnNoYWxsZXIodCAqdGVzdGluZy5UKSB7CisJdmFyIHRtIGVuY29kaW5nLlRleHRVbm1hcnNoYWxlciA9IHRocmlmdHRlc3QuTnVtYmVyelB0cih0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPKQorCWVyciA6PSB0bS5Vbm1hcnNoYWxUZXh0KFtdYnl0ZSgiVFdPIikpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGZyb20gVW5tYXJzaGFsVGV4dChUV08pOiAlcyIsIGVycikKKwl9CisJaWYgKih0bS4oKnRocmlmdHRlc3QuTnVtYmVyeikpICE9IHRocmlmdHRlc3QuTnVtYmVyel9UV08geworCQl0LkVycm9yZigiVW5tYXJzaGFsVGV4dChUV08pID0gJXMiLCB0bSkKKwl9CisKKwllcnIgPSB0bS5Vbm1hcnNoYWxUZXh0KFtdYnl0ZSgiTkFOIikpCisJaWYgZXJyID09IG5pbCB7CisJCXQuRXJyb3JmKCJFcnJvciBmcm9tIFVubWFyc2hhbFRleHQoTkFOKSIpCisJfQorfQorCitmdW5jIFRlc3RKU09OTWFyc2hhbFVubWFyc2hhbCh0ICp0ZXN0aW5nLlQpIHsKKwlzMSA6PSB0aHJpZnR0ZXN0LlN0cnVjdEJ7CisJCUFhOiAmdGhyaWZ0dGVzdC5TdHJ1Y3RBe1M6ICJBYSJ9LAorCQlBYjogJnRocmlmdHRlc3QuU3RydWN0QXtTOiAiQWIifSwKKwl9CisKKwliLCBlcnIgOj0ganNvbi5NYXJzaGFsKHMxKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBmcm9tIGpzb24uTWFyc2hhbDogJXMiLCBlcnIpCisJfQorCisJczIgOj0gdGhyaWZ0dGVzdC5TdHJ1Y3RCe30KKwllcnIgPSBqc29uLlVubWFyc2hhbChiLCAmczIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGZyb20ganNvbi5Vbm1hcnNoYWw6ICVzIiwgZXJyKQorCX0KKworCWlmICpzMS5BYSAhPSAqczIuQWEgfHwgKnMxLkFiICE9ICpzMi5BYiB7CisJCXQuTG9nZigiczEgPSAlK3YiLCBzMSkKKwkJdC5Mb2dmKCJzMiA9ICUrdiIsIHMyKQorCQl0LkVycm9yZigianNvbjogVW5tYXJzaGFsKE1hcnNoYWwocykpICE9IHMiKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL2dvdGFnX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9nb3RhZ190ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZjA1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9nb3RhZ190ZXN0LmdvCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJnb3RhZ3Rlc3QiCisJInJlZmxlY3QiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdERlZmF1bHRUYWcodCAqdGVzdGluZy5UKSB7CisJcyA6PSBnb3RhZ3Rlc3QuVGFnZ2Vke30KKwlzdCA6PSByZWZsZWN0LlR5cGVPZihzKQorCWZpZWxkLCBvayA6PSBzdC5GaWVsZEJ5TmFtZSgiU3RyaW5nVGhpbmciKQorCWlmICFvayB8fCBmaWVsZC5UYWcuR2V0KCJqc29uIikgIT0gInN0cmluZ190aGluZyIgeworCQl0LkVycm9yKCJVbmV4cGVjdGVkIGRlZmF1bHQgdGFnIHZhbHVlIikKKwl9Cit9CisKK2Z1bmMgVGVzdEN1c3RvbVRhZyh0ICp0ZXN0aW5nLlQpIHsKKwlzIDo9IGdvdGFndGVzdC5UYWdnZWR7fQorCXN0IDo9IHJlZmxlY3QuVHlwZU9mKHMpCisJZmllbGQsIG9rIDo9IHN0LkZpZWxkQnlOYW1lKCJJbnRUaGluZyIpCisJaWYgIW9rIHx8IGZpZWxkLlRhZy5HZXQoImpzb24iKSAhPSAiaW50X3RoaW5nLHN0cmluZyIgeworCQl0LkVycm9yKCJVbmV4cGVjdGVkIGN1c3RvbSB0YWcgdmFsdWUiKQorCX0KK30KKworZnVuYyBUZXN0T3B0aW9uYWxUYWcodCAqdGVzdGluZy5UKSB7CisJcyA6PSBnb3RhZ3Rlc3QuVGFnZ2Vke30KKwlzdCA6PSByZWZsZWN0LlR5cGVPZihzKQorCWZpZWxkLCBvayA6PSBzdC5GaWVsZEJ5TmFtZSgiT3B0aW9uYWxJbnRUaGluZyIpCisJaWYgIW9rIHx8IGZpZWxkLlRhZy5HZXQoImpzb24iKSAhPSAib3B0aW9uYWxfaW50X3RoaW5nLG9taXRlbXB0eSIgeworCQl0LkVycm9yKCJVbmV4cGVjdGVkIGRlZmF1bHQgdGFnIHZhbHVlIGZvciBvcHRpb25hbCBmaWVsZCIpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvaWdub3JlaW5pdGlhbGlzbXNfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL2lnbm9yZWluaXRpYWxpc21zX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NkNWY2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL2lnbm9yZWluaXRpYWxpc21zX3Rlc3QuZ28KQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJImlnbm9yZWluaXRpYWxpc21zdGVzdCIKKwkicmVmbGVjdCIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0SWdub3JlSW5pdGlhbGlzbXNGbGFnSXNIb25vdXJlZCh0ICp0ZXN0aW5nLlQpIHsKKwlzIDo9IGlnbm9yZWluaXRpYWxpc21zdGVzdC5JZ25vcmVJbml0aWFsaXNtc1Rlc3R7fQorCXN0IDo9IHJlZmxlY3QuVHlwZU9mKHMpCisJXywgb2sgOj0gc3QuRmllbGRCeU5hbWUoIklkIikKKwlpZiAhb2sgeworCQl0LkVycm9yKCJJZCBhdHRyaWJ1dGUgaXMgbWlzc2luZyEiKQorCX0KKwlfLCBvayA9IHN0LkZpZWxkQnlOYW1lKCJNeUlkIikKKwlpZiAhb2sgeworCQl0LkVycm9yKCJNeUlkIGF0dHJpYnV0ZSBpcyBtaXNzaW5nISIpCisJfQorCV8sIG9rID0gc3QuRmllbGRCeU5hbWUoIk51bUNwdSIpCisJaWYgIW9rIHsKKwkJdC5FcnJvcigiTnVtQ3B1IGF0dHJpYnV0ZSBpcyBtaXNzaW5nISIpCisJfQorCV8sIG9rID0gc3QuRmllbGRCeU5hbWUoIk51bUdwdSIpCisJaWYgIW9rIHsKKwkJdC5FcnJvcigiTnVtR3B1IGF0dHJpYnV0ZSBpcyBtaXNzaW5nISIpCisJfQorCV8sIG9rID0gc3QuRmllbGRCeU5hbWUoIk15X0lEIikKKwlpZiAhb2sgeworCQl0LkVycm9yKCJNeV9JRCBhdHRyaWJ1dGUgaXMgbWlzc2luZyEiKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL2luaXRpYWxpc21zX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9pbml0aWFsaXNtc190ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwOTIzZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9pbml0aWFsaXNtc190ZXN0LmdvCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJpbml0aWFsaXNtc3Rlc3QiCisJInJlZmxlY3QiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdFRoYXRDb21tb25Jbml0aWFsaXNtc0FyZUZpeGVkKHQgKnRlc3RpbmcuVCkgeworCXMgOj0gaW5pdGlhbGlzbXN0ZXN0LkluaXRpYWxpc21zVGVzdHt9CisJc3QgOj0gcmVmbGVjdC5UeXBlT2YocykKKwlfLCBvayA6PSBzdC5GaWVsZEJ5TmFtZSgiVXNlcklEIikKKwlpZiAhb2sgeworCQl0LkVycm9yKCJVc2VySUQgYXR0cmlidXRlIGlzIG1pc3NpbmchIikKKwl9CisJXywgb2sgPSBzdC5GaWVsZEJ5TmFtZSgiU2VydmVyVVJMIikKKwlpZiAhb2sgeworCQl0LkVycm9yKCJTZXJ2ZXJVUkwgYXR0cmlidXRlIGlzIG1pc3NpbmchIikKKwl9CisJXywgb2sgPSBzdC5GaWVsZEJ5TmFtZSgiSUQiKQorCWlmICFvayB7CisJCXQuRXJyb3IoIklEIGF0dHJpYnV0ZSBpcyBtaXNzaW5nISIpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvbXVsdGlwbGV4ZWRfcHJvdG9jb2xfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL211bHRpcGxleGVkX3Byb3RvY29sX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFhYzYyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL211bHRpcGxleGVkX3Byb3RvY29sX3Rlc3QuZ28KQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJtdWx0aXBsZXhlZHByb3RvY29sdGVzdCIKKwkibmV0IgorCSJ0ZXN0aW5nIgorCSJ0aHJpZnQiCisJInRpbWUiCispCisKK2Z1bmMgRmluZEF2YWlsYWJsZVRDUFNlcnZlclBvcnQoKSBuZXQuQWRkciB7CisJaWYgbCwgZXJyIDo9IG5ldC5MaXN0ZW4oInRjcCIsICIxMjcuMC4wLjE6MCIpOyBlcnIgIT0gbmlsIHsKKwkJcGFuaWMoIkNvdWxkIG5vdCBmaW5kIGF2YWlsYWJsZSBzZXJ2ZXIgcG9ydCIpCisJfSBlbHNlIHsKKwkJZGVmZXIgbC5DbG9zZSgpCisJCXJldHVybiBsLkFkZHIoKQorCX0KK30KKwordHlwZSBGaXJzdEltcGwgc3RydWN0e30KKworZnVuYyAoZiAqRmlyc3RJbXBsKSBSZXR1cm5PbmUoY3R4IGNvbnRleHQuQ29udGV4dCkgKHIgaW50NjQsIGVyciBlcnJvcikgeworCXJldHVybiAxLCBuaWwKK30KKwordHlwZSBTZWNvbmRJbXBsIHN0cnVjdHt9CisKK2Z1bmMgKHMgKlNlY29uZEltcGwpIFJldHVyblR3byhjdHggY29udGV4dC5Db250ZXh0KSAociBpbnQ2NCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIDIsIG5pbAorfQorCitmdW5jIGNyZWF0ZVRyYW5zcG9ydChhZGRyIG5ldC5BZGRyKSAodGhyaWZ0LlRUcmFuc3BvcnQsIGVycm9yKSB7CisJc29ja2V0IDo9IHRocmlmdC5OZXdUU29ja2V0RnJvbUFkZHJUaW1lb3V0KGFkZHIsIFRJTUVPVVQpCisJdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0KHNvY2tldCkKKwllcnIgOj0gdHJhbnNwb3J0Lk9wZW4oKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJcmV0dXJuIHRyYW5zcG9ydCwgbmlsCit9CisKK2Z1bmMgVGVzdE11bHRpcGxleGVkUHJvdG9jb2xGaXJzdCh0ICp0ZXN0aW5nLlQpIHsKKwlwcm9jZXNzb3IgOj0gdGhyaWZ0Lk5ld1RNdWx0aXBsZXhlZFByb2Nlc3NvcigpCisJcHJvdG9jb2xGYWN0b3J5IDo9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpCisJdHJhbnNwb3J0RmFjdG9yeSA6PSB0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKQorCXRyYW5zcG9ydEZhY3RvcnkgPSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkodHJhbnNwb3J0RmFjdG9yeSkKKwlhZGRyIDo9IEZpbmRBdmFpbGFibGVUQ1BTZXJ2ZXJQb3J0KCkKKwlzZXJ2ZXJUcmFuc3BvcnQsIGVyciA6PSB0aHJpZnQuTmV3VFNlcnZlclNvY2tldFRpbWVvdXQoYWRkci5TdHJpbmcoKSwgVElNRU9VVCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVW5hYmxlIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0IiwgZXJyKQorCX0KKwlzZXJ2ZXIgPSB0aHJpZnQuTmV3VFNpbXBsZVNlcnZlcjQocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkKKworCWZpcnN0UHJvY2Vzc29yIDo9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld0ZpcnN0UHJvY2Vzc29yKCZGaXJzdEltcGx7fSkKKwlwcm9jZXNzb3IuUmVnaXN0ZXJQcm9jZXNzb3IoIkZpcnN0U2VydmljZSIsIGZpcnN0UHJvY2Vzc29yKQorCisJc2Vjb25kUHJvY2Vzc29yIDo9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld1NlY29uZFByb2Nlc3NvcigmU2Vjb25kSW1wbHt9KQorCXByb2Nlc3Nvci5SZWdpc3RlclByb2Nlc3NvcigiU2Vjb25kU2VydmljZSIsIHNlY29uZFByb2Nlc3NvcikKKworCWRlZmVyIHNlcnZlci5TdG9wKCkKKwlnbyBzZXJ2ZXIuU2VydmUoKQorCXRpbWUuU2xlZXAoMTAgKiB0aW1lLk1pbGxpc2Vjb25kKQorCisJdHJhbnNwb3J0LCBlcnIgOj0gY3JlYXRlVHJhbnNwb3J0KGFkZHIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoZXJyKQorCX0KKwlkZWZlciB0cmFuc3BvcnQuQ2xvc2UoKQorCXByb3RvY29sIDo9IHRocmlmdC5OZXdUTXVsdGlwbGV4ZWRQcm90b2NvbCh0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sVHJhbnNwb3J0KHRyYW5zcG9ydCksICJGaXJzdFNlcnZpY2UiKQorCisJY2xpZW50IDo9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld0ZpcnN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKworCXJldCwgZXJyIDo9IGNsaWVudC5SZXR1cm5PbmUoZGVmYXVsdEN0eCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVW5hYmxlIHRvIGNhbGwgZmlyc3Qgc2VydmVyOiIsIGVycikKKwl9IGVsc2UgaWYgcmV0ICE9IDEgeworCQl0LkZhdGFsKCJVbmV4cGVjdGVkIHJlc3VsdCBmcm9tIHNlcnZlcjogIiwgcmV0KQorCX0KK30KKworZnVuYyBUZXN0TXVsdGlwbGV4ZWRQcm90b2NvbFNlY29uZCh0ICp0ZXN0aW5nLlQpIHsKKwlwcm9jZXNzb3IgOj0gdGhyaWZ0Lk5ld1RNdWx0aXBsZXhlZFByb2Nlc3NvcigpCisJcHJvdG9jb2xGYWN0b3J5IDo9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpCisJdHJhbnNwb3J0RmFjdG9yeSA6PSB0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKQorCXRyYW5zcG9ydEZhY3RvcnkgPSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkodHJhbnNwb3J0RmFjdG9yeSkKKwlhZGRyIDo9IEZpbmRBdmFpbGFibGVUQ1BTZXJ2ZXJQb3J0KCkKKwlzZXJ2ZXJUcmFuc3BvcnQsIGVyciA6PSB0aHJpZnQuTmV3VFNlcnZlclNvY2tldFRpbWVvdXQoYWRkci5TdHJpbmcoKSwgVElNRU9VVCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVW5hYmxlIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0IiwgZXJyKQorCX0KKwlzZXJ2ZXIgPSB0aHJpZnQuTmV3VFNpbXBsZVNlcnZlcjQocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkKKworCWZpcnN0UHJvY2Vzc29yIDo9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld0ZpcnN0UHJvY2Vzc29yKCZGaXJzdEltcGx7fSkKKwlwcm9jZXNzb3IuUmVnaXN0ZXJQcm9jZXNzb3IoIkZpcnN0U2VydmljZSIsIGZpcnN0UHJvY2Vzc29yKQorCisJc2Vjb25kUHJvY2Vzc29yIDo9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld1NlY29uZFByb2Nlc3NvcigmU2Vjb25kSW1wbHt9KQorCXByb2Nlc3Nvci5SZWdpc3RlclByb2Nlc3NvcigiU2Vjb25kU2VydmljZSIsIHNlY29uZFByb2Nlc3NvcikKKworCWRlZmVyIHNlcnZlci5TdG9wKCkKKwlnbyBzZXJ2ZXIuU2VydmUoKQorCXRpbWUuU2xlZXAoMTAgKiB0aW1lLk1pbGxpc2Vjb25kKQorCisJdHJhbnNwb3J0LCBlcnIgOj0gY3JlYXRlVHJhbnNwb3J0KGFkZHIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoZXJyKQorCX0KKwlkZWZlciB0cmFuc3BvcnQuQ2xvc2UoKQorCXByb3RvY29sIDo9IHRocmlmdC5OZXdUTXVsdGlwbGV4ZWRQcm90b2NvbCh0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sVHJhbnNwb3J0KHRyYW5zcG9ydCksICJTZWNvbmRTZXJ2aWNlIikKKworCWNsaWVudCA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdTZWNvbmRDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCisJcmV0LCBlcnIgOj0gY2xpZW50LlJldHVyblR3byhkZWZhdWx0Q3R4KQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmFibGUgdG8gY2FsbCBzZWNvbmQgc2VydmVyOiIsIGVycikKKwl9IGVsc2UgaWYgcmV0ICE9IDIgeworCQl0LkZhdGFsKCJVbmV4cGVjdGVkIHJlc3VsdCBmcm9tIHNlcnZlcjogIiwgcmV0KQorCX0KK30KKworZnVuYyBUZXN0TXVsdGlwbGV4ZWRQcm90b2NvbExlZ2FjeSh0ICp0ZXN0aW5nLlQpIHsKKwlwcm9jZXNzb3IgOj0gdGhyaWZ0Lk5ld1RNdWx0aXBsZXhlZFByb2Nlc3NvcigpCisJcHJvdG9jb2xGYWN0b3J5IDo9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpCisJdHJhbnNwb3J0RmFjdG9yeSA6PSB0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKQorCXRyYW5zcG9ydEZhY3RvcnkgPSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkodHJhbnNwb3J0RmFjdG9yeSkKKwlhZGRyIDo9IEZpbmRBdmFpbGFibGVUQ1BTZXJ2ZXJQb3J0KCkKKwlzZXJ2ZXJUcmFuc3BvcnQsIGVyciA6PSB0aHJpZnQuTmV3VFNlcnZlclNvY2tldFRpbWVvdXQoYWRkci5TdHJpbmcoKSwgVElNRU9VVCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVW5hYmxlIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0IiwgZXJyKQorCX0KKwlzZXJ2ZXIgPSB0aHJpZnQuTmV3VFNpbXBsZVNlcnZlcjQocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkKKworCWZpcnN0UHJvY2Vzc29yIDo9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld0ZpcnN0UHJvY2Vzc29yKCZGaXJzdEltcGx7fSkKKwlwcm9jZXNzb3IuUmVnaXN0ZXJQcm9jZXNzb3IoIkZpcnN0U2VydmljZSIsIGZpcnN0UHJvY2Vzc29yKQorCisJc2Vjb25kUHJvY2Vzc29yIDo9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld1NlY29uZFByb2Nlc3NvcigmU2Vjb25kSW1wbHt9KQorCXByb2Nlc3Nvci5SZWdpc3RlclByb2Nlc3NvcigiU2Vjb25kU2VydmljZSIsIHNlY29uZFByb2Nlc3NvcikKKworCWRlZmVyIHNlcnZlci5TdG9wKCkKKwlnbyBzZXJ2ZXIuU2VydmUoKQorCXRpbWUuU2xlZXAoMTAgKiB0aW1lLk1pbGxpc2Vjb25kKQorCisJdHJhbnNwb3J0LCBlcnIgOj0gY3JlYXRlVHJhbnNwb3J0KGFkZHIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3IoZXJyKQorCQlyZXR1cm4KKwl9CisJZGVmZXIgdHJhbnNwb3J0LkNsb3NlKCkKKworCXByb3RvY29sIDo9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xUcmFuc3BvcnQodHJhbnNwb3J0KQorCWNsaWVudCA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdTZWNvbmRDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCisJcmV0LCBlcnIgOj0gY2xpZW50LlJldHVyblR3byhkZWZhdWx0Q3R4KQorCS8vZXhwZWN0IGVycm9yIHNpbmNlIGRlZmF1bHQgcHJvY2Vzc29yIGlzIG5vdCByZWdpc3RlcmVkCisJaWYgZXJyID09IG5pbCB7CisJCXQuRmF0YWwoIkV4cGVjdGluZyBlcnJvciIpCisJfQorCisJLy9yZWdpc3RlciBkZWZhdWx0IHByb2Nlc3NvciBhbmQgY2FsbCBhZ2FpbgorCXByb2Nlc3Nvci5SZWdpc3RlckRlZmF1bHQobXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kUHJvY2Vzc29yKCZTZWNvbmRJbXBse30pKQorCXRyYW5zcG9ydCwgZXJyID0gY3JlYXRlVHJhbnNwb3J0KGFkZHIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3IoZXJyKQorCQlyZXR1cm4KKwl9CisJZGVmZXIgdHJhbnNwb3J0LkNsb3NlKCkKKworCXByb3RvY29sID0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpCisJY2xpZW50ID0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kQ2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKworCXJldCwgZXJyID0gY2xpZW50LlJldHVyblR3byhkZWZhdWx0Q3R4KQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmFibGUgdG8gY2FsbCBsZWdhY3kgc2VydmVyOiIsIGVycikKKwl9CisJaWYgcmV0ICE9IDIgeworCQl0LkZhdGFsKCJVbmV4cGVjdGVkIHJlc3VsdCBmcm9tIHNlcnZlcjogIiwgcmV0KQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL25hbWVzX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9uYW1lc190ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYjYzYTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9uYW1lc190ZXN0LmdvCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJuYW1lc3Rlc3QiCisJInJlZmxlY3QiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdFRoYXRBdHRyaWJ1dGVOYW1lU3Vic3RpdHVpb25Eb2VzTm90T2NjdXIodCAqdGVzdGluZy5UKSB7CisJcyA6PSBuYW1lc3Rlc3QuTmFtZXNUZXN0e30KKwlzdCA6PSByZWZsZWN0LlR5cGVPZihzKQorCV8sIG9rIDo9IHN0LkZpZWxkQnlOYW1lKCJUeXBlIikKKwlpZiAhb2sgeworCQl0LkVycm9yKCJUeXBlIGF0dHJpYnV0ZSBpcyBtaXNzaW5nISIpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvb25lX3dheV90ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvb25lX3dheV90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZDBiYmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9vbmVfd2F5X3Rlc3QuZ28KQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImZtdCIKKwkibmV0IgorCSJvbmV3YXl0ZXN0IgorCSJ0ZXN0aW5nIgorCSJ0aHJpZnQiCisJInRpbWUiCispCisKK2Z1bmMgZmluZFBvcnQoKSBuZXQuQWRkciB7CisJaWYgbCwgZXJyIDo9IG5ldC5MaXN0ZW4oInRjcCIsICIxMjcuMC4wLjE6MCIpOyBlcnIgIT0gbmlsIHsKKwkJcGFuaWMoIkNvdWxkIG5vdCBmaW5kIGF2YWlsYWJsZSBzZXJ2ZXIgcG9ydCIpCisJfSBlbHNlIHsKKwkJZGVmZXIgbC5DbG9zZSgpCisJCXJldHVybiBsLkFkZHIoKQorCX0KK30KKwordHlwZSBpbXBsIHN0cnVjdHt9CisKK2Z1bmMgKGkgKmltcGwpIEhpKGN0eCBjb250ZXh0LkNvbnRleHQsIGluIGludDY0LCBzIHN0cmluZykgKGVyciBlcnJvcikgICAgICAgIHsgZm10LlByaW50bG4oIkhpISIpOyByZXR1cm4gfQorZnVuYyAoaSAqaW1wbCkgRW1wdHlmdW5jKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gfQorZnVuYyAoaSAqaW1wbCkgRWNob0ludChjdHggY29udGV4dC5Db250ZXh0LCBwYXJhbSBpbnQ2NCkgKHIgaW50NjQsIGVyciBlcnJvcikgeyByZXR1cm4gcGFyYW0sIG5pbCB9CisKK2NvbnN0IFRJTUVPVVQgPSB0aW1lLlNlY29uZAorCit2YXIgYWRkciBuZXQuQWRkcgordmFyIHNlcnZlciAqdGhyaWZ0LlRTaW1wbGVTZXJ2ZXIKK3ZhciBjbGllbnQgKm9uZXdheXRlc3QuT25lV2F5Q2xpZW50CisKK2Z1bmMgVGVzdEluaXRPbmV3YXkodCAqdGVzdGluZy5UKSB7CisJdmFyIGVyciBlcnJvcgorCWFkZHIgPSBmaW5kUG9ydCgpCisJc2VydmVyVHJhbnNwb3J0LCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJ2ZXJTb2NrZXRUaW1lb3V0KGFkZHIuU3RyaW5nKCksIFRJTUVPVVQpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBjcmVhdGUgc2VydmVyIHNvY2tldCIsIGVycikKKwl9CisJcHJvY2Vzc29yIDo9IG9uZXdheXRlc3QuTmV3T25lV2F5UHJvY2Vzc29yKCZpbXBse30pCisJc2VydmVyID0gdGhyaWZ0Lk5ld1RTaW1wbGVTZXJ2ZXIyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0KQorCisJZ28gc2VydmVyLlNlcnZlKCkKKwl0aW1lLlNsZWVwKDEwICogdGltZS5NaWxsaXNlY29uZCkKK30KKworZnVuYyBUZXN0SW5pdE9uZXdheUNsaWVudCh0ICp0ZXN0aW5nLlQpIHsKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciwgVElNRU9VVCkKKwlwcm90b2NvbCA6PSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sVHJhbnNwb3J0KHRyYW5zcG9ydCkKKwljbGllbnQgPSBvbmV3YXl0ZXN0Lk5ld09uZVdheUNsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisJZXJyIDo9IHRyYW5zcG9ydC5PcGVuKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVW5hYmxlIHRvIG9wZW4gY2xpZW50IHNvY2tldCIsIGVycikKKwl9Cit9CisKK2Z1bmMgVGVzdENhbGxPbmV3YXlTZXJ2ZXIodCAqdGVzdGluZy5UKSB7CisJLy9jYWxsIG9uZXdheSBmdW5jdGlvbgorCWVyciA6PSBjbGllbnQuSGkoZGVmYXVsdEN0eCwgMSwgIiIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgZXJyb3I6ICIsIGVycikKKwl9CisJLy9UaGVyZSBpcyBubyB3YXkgdG8gZGV0ZWN0IHByb3RvY29sIHByb2JsZW1zIHdpdGggc2luZ2xlIG9uZXdheSBjYWxsIHNvIHdlIGNhbGwgaXQgc2Vjb25kIHRpbWUKKwlpLCBlcnIgOj0gY2xpZW50LkVjaG9JbnQoZGVmYXVsdEN0eCwgNDIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgZXJyb3I6ICIsIGVycikKKwl9CisJaWYgaSAhPSA0MiB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgcmV0dXJuZWQgdmFsdWU6ICIsIGkpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvb3B0aW9uYWxfZmllbGRzX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9vcHRpb25hbF9maWVsZHNfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGFkNjYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvb3B0aW9uYWxfZmllbGRzX3Rlc3QuZ28KQEAgLTAsMCArMSwyODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJieXRlcyIKKwlnb21vY2sgImdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrIgorCSJvcHRpb25hbGZpZWxkc3Rlc3QiCisJInRlc3RpbmciCisJInRocmlmdCIKKykKKworZnVuYyBUZXN0SXNTZXRSZXR1cm5GYWxzZU9uQ3JlYXRpb24odCAqdGVzdGluZy5UKSB7CisJYW8gOj0gb3B0aW9uYWxmaWVsZHN0ZXN0Lk5ld0FsbE9wdGlvbmFsKCkKKwlpZiBhby5Jc1NldFMoKSB7CisJCXQuRXJyb3JmKCJPcHRpb25hbCBmaWVsZCBTIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorCWlmIGFvLklzU2V0SSgpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIEkgaXMgc2V0IG9uIGluaXRpYWxpemF0aW9uIikKKwl9CisJaWYgYW8uSXNTZXRCKCkgeworCQl0LkVycm9yZigiT3B0aW9uYWwgZmllbGQgQiBpcyBzZXQgb24gaW5pdGlhbGl6YXRpb24iKQorCX0KKwlpZiBhby5Jc1NldFMyKCkgeworCQl0LkVycm9yZigiT3B0aW9uYWwgZmllbGQgUzIgaXMgc2V0IG9uIGluaXRpYWxpemF0aW9uIikKKwl9CisJaWYgYW8uSXNTZXRJMigpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIEkyIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorCWlmIGFvLklzU2V0QjIoKSB7CisJCXQuRXJyb3JmKCJPcHRpb25hbCBmaWVsZCBCMiBpcyBzZXQgb24gaW5pdGlhbGl6YXRpb24iKQorCX0KKwlpZiBhby5Jc1NldEFhKCkgeworCQl0LkVycm9yZigiT3B0aW9uYWwgZmllbGQgQWEgaXMgc2V0IG9uIGluaXRpYWxpemF0aW9uIikKKwl9CisJaWYgYW8uSXNTZXRMKCkgeworCQl0LkVycm9yZigiT3B0aW9uYWwgZmllbGQgTCBpcyBzZXQgb24gaW5pdGlhbGl6YXRpb24iKQorCX0KKwlpZiBhby5Jc1NldEwyKCkgeworCQl0LkVycm9yZigiT3B0aW9uYWwgZmllbGQgTDIgaXMgc2V0IG9uIGluaXRpYWxpemF0aW9uIikKKwl9CisJaWYgYW8uSXNTZXRNKCkgeworCQl0LkVycm9yZigiT3B0aW9uYWwgZmllbGQgTSBpcyBzZXQgb24gaW5pdGlhbGl6YXRpb24iKQorCX0KKwlpZiBhby5Jc1NldE0yKCkgeworCQl0LkVycm9yZigiT3B0aW9uYWwgZmllbGQgTTIgaXMgc2V0IG9uIGluaXRpYWxpemF0aW9uIikKKwl9CisJaWYgYW8uSXNTZXRCaW4oKSB7CisJCXQuRXJyb3JmKCJPcHRpb25hbCBmaWVsZCBCaW4gaXMgc2V0IG9uIGluaXRpYWxpemF0aW9uIikKKwl9CisJaWYgYW8uSXNTZXRCaW4yKCkgeworCQl0LkVycm9yZigiT3B0aW9uYWwgZmllbGQgQmluMiBpcyBzZXQgb24gaW5pdGlhbGl6YXRpb24iKQorCX0KK30KKworZnVuYyBUZXN0RGVmYXVsdFZhbHVlc09uQ3JlYXRpb24odCAqdGVzdGluZy5UKSB7CisJYW8gOj0gb3B0aW9uYWxmaWVsZHN0ZXN0Lk5ld0FsbE9wdGlvbmFsKCkKKwlpZiBhby5HZXRTKCkgIT0gIkRFRkFVTFQiIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSAlI3YgZm9yIGZpZWxkIFMiLCBhby5HZXRTKCkpCisJfQorCWlmIGFvLkdldEkoKSAhPSA0MiB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGRlZmF1bHQgdmFsdWUgJSN2IGZvciBmaWVsZCBJIiwgYW8uR2V0SSgpKQorCX0KKwlpZiBhby5HZXRCKCkgIT0gZmFsc2UgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBkZWZhdWx0IHZhbHVlICUjdiBmb3IgZmllbGQgQiIsIGFvLkdldEIoKSkKKwl9CisJaWYgYW8uR2V0UzIoKSAhPSAiIiB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGRlZmF1bHQgdmFsdWUgJSN2IGZvciBmaWVsZCBTMiIsIGFvLkdldFMyKCkpCisJfQorCWlmIGFvLkdldEkyKCkgIT0gMCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGRlZmF1bHQgdmFsdWUgJSN2IGZvciBmaWVsZCBJMiIsIGFvLkdldEkyKCkpCisJfQorCWlmIGFvLkdldEIyKCkgIT0gZmFsc2UgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBkZWZhdWx0IHZhbHVlICUjdiBmb3IgZmllbGQgQjIiLCBhby5HZXRCMigpKQorCX0KKwlpZiBsIDo9IGFvLkdldEwoKTsgbGVuKGwpICE9IDAgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBkZWZhdWx0IHZhbHVlICUjdiBmb3IgZmllbGQgTCIsIGwpCisJfQorCWlmIGwgOj0gYW8uR2V0TDIoKTsgbGVuKGwpICE9IDIgfHwgbFswXSAhPSAxIHx8IGxbMV0gIT0gMiB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGRlZmF1bHQgdmFsdWUgJSN2IGZvciBmaWVsZCBMMiIsIGwpCisJfQorCS8vRklYTUU6IHNob3VsZCB3ZSByZXR1cm4gZW1wdHkgbWFwIGhlcmU/CisJaWYgbSA6PSBhby5HZXRNKCk7IG0gIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSAlI3YgZm9yIGZpZWxkIE0iLCBtKQorCX0KKwlpZiBtIDo9IGFvLkdldE0yKCk7IGxlbihtKSAhPSAyIHx8IG1bMV0gIT0gMiB8fCBtWzNdICE9IDQgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBkZWZhdWx0IHZhbHVlICUjdiBmb3IgZmllbGQgTTIiLCBtKQorCX0KKwlpZiBidiA6PSBhby5HZXRCaW4oKTsgYnYgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEJpbiIsIGJ2KQorCX0KKwlpZiBidiA6PSBhby5HZXRCaW4yKCk7ICFieXRlcy5FcXVhbChidiwgW11ieXRlKCJhc2RmIikpIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEJpbjIiLCBidikKKwl9Cit9CisKK2Z1bmMgVGVzdEluaXRpYWxWYWx1ZXNPbkNyZWF0aW9uKHQgKnRlc3RpbmcuVCkgeworCWFvIDo9IG9wdGlvbmFsZmllbGRzdGVzdC5OZXdBbGxPcHRpb25hbCgpCisJaWYgYW8uUyAhPSAiREVGQVVMVCIgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBpbml0aWFsIHZhbHVlICUjdiBmb3IgZmllbGQgUyIsIGFvLlMpCisJfQorCWlmIGFvLkkgIT0gNDIgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBpbml0aWFsIHZhbHVlICUjdiBmb3IgZmllbGQgSSIsIGFvLkkpCisJfQorCWlmIGFvLkIgIT0gZmFsc2UgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBpbml0aWFsIHZhbHVlICUjdiBmb3IgZmllbGQgQiIsIGFvLkIpCisJfQorCWlmIGFvLlMyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGluaXRpYWwgdmFsdWUgJSN2IGZvciBmaWVsZCBTMiIsIGFvLlMyKQorCX0KKwlpZiBhby5JMiAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBpbml0aWFsIHZhbHVlICUjdiBmb3IgZmllbGQgSTIiLCBhby5JMikKKwl9CisJaWYgYW8uQjIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgaW5pdGlhbCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEIyIiwgYW8uQjIpCisJfQorCWlmIGFvLkwgIT0gbmlsIHx8IGxlbihhby5MKSAhPSAwIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgaW5pdGlhbCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEwiLCBhby5MKQorCX0KKwlpZiBhby5MMiAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBpbml0aWFsIHZhbHVlICUjdiBmb3IgZmllbGQgTDIiLCBhby5MMikKKwl9CisJaWYgYW8uTSAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBpbml0aWFsIHZhbHVlICUjdiBmb3IgZmllbGQgTSIsIGFvLk0pCisJfQorCWlmIGFvLk0yICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGluaXRpYWwgdmFsdWUgJSN2IGZvciBmaWVsZCBNMiIsIGFvLk0yKQorCX0KKwlpZiBhby5CaW4gIT0gbmlsIHx8IGxlbihhby5CaW4pICE9IDAgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBpbml0aWFsIHZhbHVlICUjdiBmb3IgZmllbGQgQmluIiwgYW8uQmluKQorCX0KKwlpZiAhYnl0ZXMuRXF1YWwoYW8uQmluMiwgW11ieXRlKCJhc2RmIikpIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgaW5pdGlhbCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEJpbjIiLCBhby5CaW4yKQorCX0KK30KKworZnVuYyBUZXN0SXNTZXRSZXR1cm5UcnVlQWZ0ZXJVcGRhdGUodCAqdGVzdGluZy5UKSB7CisJYW8gOj0gb3B0aW9uYWxmaWVsZHN0ZXN0Lk5ld0FsbE9wdGlvbmFsKCkKKwlhby5TID0gInNvbWV2YWx1ZSIKKwlhby5JID0gMTIzCisJYW8uQiA9IHRydWUKKwlhby5BYSA9IG9wdGlvbmFsZmllbGRzdGVzdC5OZXdTdHJ1Y3RBKCkKKwlpZiAhYW8uSXNTZXRTKCkgeworCQl0LkVycm9yZigiRmllbGQgUyBzaG91bGQgYmUgc2V0IikKKwl9CisJaWYgIWFvLklzU2V0SSgpIHsKKwkJdC5FcnJvcmYoIkZpZWxkIEkgc2hvdWxkIGJlIHNldCIpCisJfQorCWlmICFhby5Jc1NldEIoKSB7CisJCXQuRXJyb3JmKCJGaWVsZCBCIHNob3VsZCBiZSBzZXQiKQorCX0KKwlpZiAhYW8uSXNTZXRBYSgpIHsKKwkJdC5FcnJvcmYoIkZpZWxkIGFhIHNob3VsZCBiZSBzZXQiKQorCX0KK30KKworZnVuYyBUZXN0TGlzdE5vdEVtcHR5KHQgKnRlc3RpbmcuVCkgeworCWFvIDo9IG9wdGlvbmFsZmllbGRzdGVzdC5OZXdBbGxPcHRpb25hbCgpCisJYW8uTCA9IFtdaW50NjR7MSwgMiwgM30KKwlpZiAhYW8uSXNTZXRMKCkgeworCQl0LkVycm9yZigiRmllbGQgTCBzaG91bGQgYmUgc2V0IikKKwl9Cit9CisKKy8vTWFrZSBzdXJlIHRoYXQgb3B0aW9uYWwgZmllbGRzIGFyZSBub3QgYmVpbmcgc2VyaWFsaXplZAorZnVuYyBUZXN0Tm9PcHRpb25hbFVuc2V0RmllbGRzT25XaXJlKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJZGVmZXIgbW9ja0N0cmwuRmluaXNoKCkKKwlwcm90byA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJhbGxfb3B0aW9uYWwiKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKS5SZXR1cm4obmlsKSwKKwkpCisJYW8gOj0gb3B0aW9uYWxmaWVsZHN0ZXN0Lk5ld0FsbE9wdGlvbmFsKCkKKwlhby5Xcml0ZShwcm90bykKK30KKworZnVuYyBUZXN0Tm9TZXRUb0RlZmF1bHRGaWVsZHNPbldpcmUodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlkZWZlciBtb2NrQ3RybC5GaW5pc2goKQorCXByb3RvIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oImFsbF9vcHRpb25hbCIpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLlJldHVybihuaWwpLAorCSkKKwlhbyA6PSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3QWxsT3B0aW9uYWwoKQorCWFvLkkgPSA0MgorCWFvLldyaXRlKHByb3RvKQorfQorCisvL01ha2Ugc3VyZSB0aGF0IG9ubHkgb25lIGZpZWxkIGlzIGJlaW5nIHNlcmlhbGl6ZWQgd2hlbiBzZXQgdG8gbm9uLWRlZmF1bHQKK2Z1bmMgVGVzdE9uZUlTZXRGaWVsZE9uV2lyZSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCWRlZmVyIG1vY2tDdHJsLkZpbmlzaCgpCisJcHJvdG8gOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigiYWxsX29wdGlvbmFsIikuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigiaSIsIHRocmlmdC5UVHlwZSh0aHJpZnQuSTY0KSwgaW50MTYoMikpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUk2NChpbnQ2NCgxMjMpKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLlJldHVybihuaWwpLAorCSkKKwlhbyA6PSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3QWxsT3B0aW9uYWwoKQorCWFvLkkgPSAxMjMKKwlhby5Xcml0ZShwcm90bykKK30KKworZnVuYyBUZXN0T25lTFNldEZpZWxkT25XaXJlKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJZGVmZXIgbW9ja0N0cmwuRmluaXNoKCkKKwlwcm90byA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJhbGxfb3B0aW9uYWwiKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJsIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5MSVNUKSwgaW50MTYoOSkpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUxpc3RCZWdpbih0aHJpZnQuVFR5cGUodGhyaWZ0Lkk2NCksIDIpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUk2NChpbnQ2NCgxKSkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlSTY0KGludDY0KDIpKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVMaXN0RW5kKCkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKS5SZXR1cm4obmlsKSwKKwkpCisJYW8gOj0gb3B0aW9uYWxmaWVsZHN0ZXN0Lk5ld0FsbE9wdGlvbmFsKCkKKwlhby5MID0gW11pbnQ2NHsxLCAyfQorCWFvLldyaXRlKHByb3RvKQorfQorCitmdW5jIFRlc3RPbmVCaW5TZXRGaWVsZE9uV2lyZSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCWRlZmVyIG1vY2tDdHJsLkZpbmlzaCgpCisJcHJvdG8gOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigiYWxsX29wdGlvbmFsIikuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigiYmluIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCBpbnQxNigxMykpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUJpbmFyeShbXWJ5dGUoInNvbWVieXRlc3RyaW5nIikpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCkuUmV0dXJuKG5pbCksCisJKQorCWFvIDo9IG9wdGlvbmFsZmllbGRzdGVzdC5OZXdBbGxPcHRpb25hbCgpCisJYW8uQmluID0gW11ieXRlKCJzb21lYnl0ZXN0cmluZyIpCisJYW8uV3JpdGUocHJvdG8pCit9CisKK2Z1bmMgVGVzdE9uZUVtcHR5QmluU2V0RmllbGRPbldpcmUodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlkZWZlciBtb2NrQ3RybC5GaW5pc2goKQorCXByb3RvIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oImFsbF9vcHRpb25hbCIpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oImJpbiIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoMTMpKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVCaW5hcnkoW11ieXRle30pLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCkuUmV0dXJuKG5pbCksCisJKQorCWFvIDo9IG9wdGlvbmFsZmllbGRzdGVzdC5OZXdBbGxPcHRpb25hbCgpCisJYW8uQmluID0gW11ieXRle30KKwlhby5Xcml0ZShwcm90bykKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3Byb3RvY29sX21vY2suZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9wcm90b2NvbF9tb2NrLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZDdhMDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9wcm90b2NvbF9tb2NrLmdvCkBAIC0wLDAgKzEsNTEzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IE1vY2tHZW4uIERPIE5PVCBFRElUIQorLy8gU291cmNlOiB0aHJpZnQgKGludGVyZmFjZXM6IFRQcm90b2NvbCkKKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJjb250ZXh0IgorCXRocmlmdCAidGhyaWZ0IgorCisJZ29tb2NrICJnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jayIKKykKKworLy8gTW9jayBvZiBUUHJvdG9jb2wgaW50ZXJmYWNlCit0eXBlIE1vY2tUUHJvdG9jb2wgc3RydWN0IHsKKwljdHJsICAgICAqZ29tb2NrLkNvbnRyb2xsZXIKKwlyZWNvcmRlciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcgorfQorCisvLyBSZWNvcmRlciBmb3IgTW9ja1RQcm90b2NvbCAobm90IGV4cG9ydGVkKQordHlwZSBfTW9ja1RQcm90b2NvbFJlY29yZGVyIHN0cnVjdCB7CisJbW9jayAqTW9ja1RQcm90b2NvbAorfQorCitmdW5jIE5ld01vY2tUUHJvdG9jb2woY3RybCAqZ29tb2NrLkNvbnRyb2xsZXIpICpNb2NrVFByb3RvY29sIHsKKwltb2NrIDo9ICZNb2NrVFByb3RvY29se2N0cmw6IGN0cmx9CisJbW9jay5yZWNvcmRlciA9ICZfTW9ja1RQcm90b2NvbFJlY29yZGVye21vY2t9CisJcmV0dXJuIG1vY2sKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIEVYUEVDVCgpICpfTW9ja1RQcm90b2NvbFJlY29yZGVyIHsKKwlyZXR1cm4gX20ucmVjb3JkZXIKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiRmx1c2giKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIkZsdXNoIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRCaW5hcnkoKSAoW11ieXRlLCBlcnJvcikgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkQmluYXJ5IikKKwlyZXQwLCBfIDo9IHJldFswXS4oW11ieXRlKQorCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MQorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRCaW5hcnkoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkQmluYXJ5IikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRCb29sKCkgKGJvb2wsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRCb29sIikKKwlyZXQwLCBfIDo9IHJldFswXS4oYm9vbCkKKwlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCisJcmV0dXJuIHJldDAsIHJldDEKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkQm9vbCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRCb29sIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRCeXRlKCkgKGludDgsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRCeXRlIikKKwlyZXQwLCBfIDo9IHJldFswXS4oaW50OCkKKwlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCisJcmV0dXJuIHJldDAsIHJldDEKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkQnl0ZSgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRCeXRlIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWREb3VibGUoKSAoZmxvYXQ2NCwgZXJyb3IpIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZERvdWJsZSIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGZsb2F0NjQpCisJcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZERvdWJsZSgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWREb3VibGUiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZEZpZWxkQmVnaW4oKSAoc3RyaW5nLCB0aHJpZnQuVFR5cGUsIGludDE2LCBlcnJvcikgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkRmllbGRCZWdpbiIpCisJcmV0MCwgXyA6PSByZXRbMF0uKHN0cmluZykKKwlyZXQxLCBfIDo9IHJldFsxXS4odGhyaWZ0LlRUeXBlKQorCXJldDIsIF8gOj0gcmV0WzJdLihpbnQxNikKKwlyZXQzLCBfIDo9IHJldFszXS4oZXJyb3IpCisJcmV0dXJuIHJldDAsIHJldDEsIHJldDIsIHJldDMKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkRmllbGRCZWdpbigpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRGaWVsZEJlZ2luIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRGaWVsZEVuZCgpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZEZpZWxkRW5kIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkRmllbGRFbmQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkRmllbGRFbmQiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZEkxNigpIChpbnQxNiwgZXJyb3IpIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZEkxNiIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGludDE2KQorCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MQorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRJMTYoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkSTE2IikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRJMzIoKSAoaW50MzIsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRJMzIiKQorCXJldDAsIF8gOj0gcmV0WzBdLihpbnQzMikKKwlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCisJcmV0dXJuIHJldDAsIHJldDEKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkSTMyKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZEkzMiIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkSTY0KCkgKGludDY0LCBlcnJvcikgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkSTY0IikKKwlyZXQwLCBfIDo9IHJldFswXS4oaW50NjQpCisJcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZEk2NCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRJNjQiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZExpc3RCZWdpbigpICh0aHJpZnQuVFR5cGUsIGludCwgZXJyb3IpIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZExpc3RCZWdpbiIpCisJcmV0MCwgXyA6PSByZXRbMF0uKHRocmlmdC5UVHlwZSkKKwlyZXQxLCBfIDo9IHJldFsxXS4oaW50KQorCXJldDIsIF8gOj0gcmV0WzJdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MSwgcmV0MgorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRMaXN0QmVnaW4oKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkTGlzdEJlZ2luIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRMaXN0RW5kKCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkTGlzdEVuZCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZExpc3RFbmQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkTGlzdEVuZCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkTWFwQmVnaW4oKSAodGhyaWZ0LlRUeXBlLCB0aHJpZnQuVFR5cGUsIGludCwgZXJyb3IpIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZE1hcEJlZ2luIikKKwlyZXQwLCBfIDo9IHJldFswXS4odGhyaWZ0LlRUeXBlKQorCXJldDEsIF8gOj0gcmV0WzFdLih0aHJpZnQuVFR5cGUpCisJcmV0MiwgXyA6PSByZXRbMl0uKGludCkKKwlyZXQzLCBfIDo9IHJldFszXS4oZXJyb3IpCisJcmV0dXJuIHJldDAsIHJldDEsIHJldDIsIHJldDMKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkTWFwQmVnaW4oKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkTWFwQmVnaW4iKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZE1hcEVuZCgpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZE1hcEVuZCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZE1hcEVuZCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRNYXBFbmQiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZE1lc3NhZ2VCZWdpbigpIChzdHJpbmcsIHRocmlmdC5UTWVzc2FnZVR5cGUsIGludDMyLCBlcnJvcikgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkTWVzc2FnZUJlZ2luIikKKwlyZXQwLCBfIDo9IHJldFswXS4oc3RyaW5nKQorCXJldDEsIF8gOj0gcmV0WzFdLih0aHJpZnQuVE1lc3NhZ2VUeXBlKQorCXJldDIsIF8gOj0gcmV0WzJdLihpbnQzMikKKwlyZXQzLCBfIDo9IHJldFszXS4oZXJyb3IpCisJcmV0dXJuIHJldDAsIHJldDEsIHJldDIsIHJldDMKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkTWVzc2FnZUJlZ2luKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZE1lc3NhZ2VCZWdpbiIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkTWVzc2FnZUVuZCgpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZE1lc3NhZ2VFbmQiKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRNZXNzYWdlRW5kKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZE1lc3NhZ2VFbmQiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZFNldEJlZ2luKCkgKHRocmlmdC5UVHlwZSwgaW50LCBlcnJvcikgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkU2V0QmVnaW4iKQorCXJldDAsIF8gOj0gcmV0WzBdLih0aHJpZnQuVFR5cGUpCisJcmV0MSwgXyA6PSByZXRbMV0uKGludCkKKwlyZXQyLCBfIDo9IHJldFsyXS4oZXJyb3IpCisJcmV0dXJuIHJldDAsIHJldDEsIHJldDIKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkU2V0QmVnaW4oKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkU2V0QmVnaW4iKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZFNldEVuZCgpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZFNldEVuZCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZFNldEVuZCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRTZXRFbmQiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZFN0cmluZygpIChzdHJpbmcsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRTdHJpbmciKQorCXJldDAsIF8gOj0gcmV0WzBdLihzdHJpbmcpCisJcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZFN0cmluZygpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRTdHJpbmciKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZFN0cnVjdEJlZ2luKCkgKHN0cmluZywgZXJyb3IpIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZFN0cnVjdEJlZ2luIikKKwlyZXQwLCBfIDo9IHJldFswXS4oc3RyaW5nKQorCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MQorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRTdHJ1Y3RCZWdpbigpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRTdHJ1Y3RCZWdpbiIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkU3RydWN0RW5kKCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkU3RydWN0RW5kIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkU3RydWN0RW5kKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZFN0cnVjdEVuZCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBTa2lwKF9wYXJhbTAgdGhyaWZ0LlRUeXBlKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlNraXAiLCBfcGFyYW0wKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFNraXAoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiU2tpcCIsIGFyZzApCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBUcmFuc3BvcnQoKSB0aHJpZnQuVFRyYW5zcG9ydCB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRyYW5zcG9ydCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKHRocmlmdC5UVHJhbnNwb3J0KQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgVHJhbnNwb3J0KCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVHJhbnNwb3J0IikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlQmluYXJ5KF9wYXJhbTAgW11ieXRlKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlQmluYXJ5IiwgX3BhcmFtMCkKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZUJpbmFyeShhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZUJpbmFyeSIsIGFyZzApCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZUJvb2woX3BhcmFtMCBib29sKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlQm9vbCIsIF9wYXJhbTApCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVCb29sKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlQm9vbCIsIGFyZzApCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZUJ5dGUoX3BhcmFtMCBpbnQ4KSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlQnl0ZSIsIF9wYXJhbTApCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVCeXRlKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlQnl0ZSIsIGFyZzApCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZURvdWJsZShfcGFyYW0wIGZsb2F0NjQpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVEb3VibGUiLCBfcGFyYW0wKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlRG91YmxlKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlRG91YmxlIiwgYXJnMCkKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlRmllbGRCZWdpbihfcGFyYW0wIHN0cmluZywgX3BhcmFtMSB0aHJpZnQuVFR5cGUsIF9wYXJhbTIgaW50MTYpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVGaWVsZEJlZ2luIiwgX3BhcmFtMCwgX3BhcmFtMSwgX3BhcmFtMikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZUZpZWxkQmVnaW4oYXJnMCwgYXJnMSwgYXJnMiBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVGaWVsZEJlZ2luIiwgYXJnMCwgYXJnMSwgYXJnMikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlRmllbGRFbmQoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlRmllbGRFbmQiKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlRmllbGRFbmQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZUZpZWxkRW5kIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlRmllbGRTdG9wKCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZUZpZWxkU3RvcCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVGaWVsZFN0b3AoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZUZpZWxkU3RvcCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZUkxNihfcGFyYW0wIGludDE2KSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlSTE2IiwgX3BhcmFtMCkKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZUkxNihhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZUkxNiIsIGFyZzApCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZUkzMihfcGFyYW0wIGludDMyKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlSTMyIiwgX3BhcmFtMCkKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZUkzMihhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZUkzMiIsIGFyZzApCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZUk2NChfcGFyYW0wIGludDY0KSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlSTY0IiwgX3BhcmFtMCkKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZUk2NChhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZUk2NCIsIGFyZzApCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZUxpc3RCZWdpbihfcGFyYW0wIHRocmlmdC5UVHlwZSwgX3BhcmFtMSBpbnQpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVMaXN0QmVnaW4iLCBfcGFyYW0wLCBfcGFyYW0xKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlTGlzdEJlZ2luKGFyZzAsIGFyZzEgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlTGlzdEJlZ2luIiwgYXJnMCwgYXJnMSkKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlTGlzdEVuZCgpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVMaXN0RW5kIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZUxpc3RFbmQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZUxpc3RFbmQiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVNYXBCZWdpbihfcGFyYW0wIHRocmlmdC5UVHlwZSwgX3BhcmFtMSB0aHJpZnQuVFR5cGUsIF9wYXJhbTIgaW50KSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlTWFwQmVnaW4iLCBfcGFyYW0wLCBfcGFyYW0xLCBfcGFyYW0yKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlTWFwQmVnaW4oYXJnMCwgYXJnMSwgYXJnMiBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVNYXBCZWdpbiIsIGFyZzAsIGFyZzEsIGFyZzIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZU1hcEVuZCgpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVNYXBFbmQiKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlTWFwRW5kKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVNYXBFbmQiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVNZXNzYWdlQmVnaW4oX3BhcmFtMCBzdHJpbmcsIF9wYXJhbTEgdGhyaWZ0LlRNZXNzYWdlVHlwZSwgX3BhcmFtMiBpbnQzMikgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZU1lc3NhZ2VCZWdpbiIsIF9wYXJhbTAsIF9wYXJhbTEsIF9wYXJhbTIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVNZXNzYWdlQmVnaW4oYXJnMCwgYXJnMSwgYXJnMiBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVNZXNzYWdlQmVnaW4iLCBhcmcwLCBhcmcxLCBhcmcyKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVNZXNzYWdlRW5kKCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZU1lc3NhZ2VFbmQiKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlTWVzc2FnZUVuZCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlTWVzc2FnZUVuZCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZVNldEJlZ2luKF9wYXJhbTAgdGhyaWZ0LlRUeXBlLCBfcGFyYW0xIGludCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZVNldEJlZ2luIiwgX3BhcmFtMCwgX3BhcmFtMSkKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZVNldEJlZ2luKGFyZzAsIGFyZzEgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlU2V0QmVnaW4iLCBhcmcwLCBhcmcxKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVTZXRFbmQoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlU2V0RW5kIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZVNldEVuZCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlU2V0RW5kIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlU3RyaW5nKF9wYXJhbTAgc3RyaW5nKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlU3RyaW5nIiwgX3BhcmFtMCkKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZVN0cmluZyhhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZVN0cmluZyIsIGFyZzApCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZVN0cnVjdEJlZ2luKF9wYXJhbTAgc3RyaW5nKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlU3RydWN0QmVnaW4iLCBfcGFyYW0wKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlU3RydWN0QmVnaW4oYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVTdHJ1Y3RCZWdpbiIsIGFyZzApCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZVN0cnVjdEVuZCgpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVTdHJ1Y3RFbmQiKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlU3RydWN0RW5kKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVTdHJ1Y3RFbmQiKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvcHJvdG9jb2xzX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9wcm90b2NvbHNfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmZkOWMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvcHJvdG9jb2xzX3Rlc3QuZ28KQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJInRlc3RpbmciCisJInRocmlmdCIKKwkidGhyaWZ0dGVzdCIKKykKKworZnVuYyBSdW5Tb2NrZXRUZXN0U3VpdGUodCAqdGVzdGluZy5ULCBwcm90b2NvbEZhY3RvcnkgdGhyaWZ0LlRQcm90b2NvbEZhY3RvcnksCisJdHJhbnNwb3J0RmFjdG9yeSB0aHJpZnQuVFRyYW5zcG9ydEZhY3RvcnkpIHsKKwkvLyBzZXJ2ZXIKKwl2YXIgZXJyIGVycm9yCisJYWRkciA9IEZpbmRBdmFpbGFibGVUQ1BTZXJ2ZXJQb3J0KCkKKwlzZXJ2ZXJUcmFuc3BvcnQsIGVyciA6PSB0aHJpZnQuTmV3VFNlcnZlclNvY2tldFRpbWVvdXQoYWRkci5TdHJpbmcoKSwgVElNRU9VVCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVW5hYmxlIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0IiwgZXJyKQorCX0KKwlwcm9jZXNzb3IgOj0gdGhyaWZ0dGVzdC5OZXdUaHJpZnRUZXN0UHJvY2Vzc29yKE5ld1RocmlmdFRlc3RIYW5kbGVyKCkpCisJc2VydmVyID0gdGhyaWZ0Lk5ld1RTaW1wbGVTZXJ2ZXI0KHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisJc2VydmVyLkxpc3RlbigpCisKKwlnbyBzZXJ2ZXIuU2VydmUoKQorCisJLy8gY2xpZW50CisJdmFyIHRyYW5zcG9ydCB0aHJpZnQuVFRyYW5zcG9ydCA9IHRocmlmdC5OZXdUU29ja2V0RnJvbUFkZHJUaW1lb3V0KGFkZHIsIFRJTUVPVVQpCisJdHJhbnNwb3J0LCBlcnIgPSB0cmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydCh0cmFuc3BvcnQpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoZXJyKQorCX0KKwl2YXIgcHJvdG9jb2wgdGhyaWZ0LlRQcm90b2NvbCA9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpCisJdGhyaWZ0VGVzdENsaWVudCA6PSB0aHJpZnR0ZXN0Lk5ld1RocmlmdFRlc3RDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCWVyciA9IHRyYW5zcG9ydC5PcGVuKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVW5hYmxlIHRvIG9wZW4gY2xpZW50IHNvY2tldCIsIGVycikKKwl9CisKKwlkcml2ZXIgOj0gTmV3VGhyaWZ0VGVzdERyaXZlcih0LCB0aHJpZnRUZXN0Q2xpZW50KQorCWRyaXZlci5TdGFydCgpCit9CisKKy8vIFJ1biB0ZXN0IHN1aXRlIHVzaW5nIFRKU09OUHJvdG9jb2wKK2Z1bmMgVGVzdFRKU09OUHJvdG9jb2wodCAqdGVzdGluZy5UKSB7CisJUnVuU29ja2V0VGVzdFN1aXRlKHQsCisJCXRocmlmdC5OZXdUSlNPTlByb3RvY29sRmFjdG9yeSgpLAorCQl0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSkKKwlSdW5Tb2NrZXRUZXN0U3VpdGUodCwKKwkJdGhyaWZ0Lk5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCksCisJCXRocmlmdC5OZXdUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KDg5MTIpKQorCVJ1blNvY2tldFRlc3RTdWl0ZSh0LAorCQl0aHJpZnQuTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKSwKKwkJdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpKSkKK30KKworLy8gUnVuIHRlc3Qgc3VpdGUgdXNpbmcgVEJpbmFyeVByb3RvY29sCitmdW5jIFRlc3RUQmluYXJ5UHJvdG9jb2wodCAqdGVzdGluZy5UKSB7CisJUnVuU29ja2V0VGVzdFN1aXRlKHQsCisJCXRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpLAorCQl0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSkKKwlSdW5Tb2NrZXRUZXN0U3VpdGUodCwKKwkJdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCksCisJCXRocmlmdC5OZXdUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KDg5MTIpKQorCVJ1blNvY2tldFRlc3RTdWl0ZSh0LAorCQl0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSwKKwkJdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpKSkKK30KKworLy8gUnVuIHRlc3Qgc3VpdGUgdXNpbmcgVENvbXBhY3RCaW5hcnlQcm90b2NvbAorZnVuYyBUZXN0VENvbXBhY3RQcm90b2NvbCh0ICp0ZXN0aW5nLlQpIHsKKwlSdW5Tb2NrZXRUZXN0U3VpdGUodCwKKwkJdGhyaWZ0Lk5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCksCisJCXRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpKQorCVJ1blNvY2tldFRlc3RTdWl0ZSh0LAorCQl0aHJpZnQuTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSwKKwkJdGhyaWZ0Lk5ld1RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoODkxMikpCisJUnVuU29ja2V0VGVzdFN1aXRlKHQsCisJCXRocmlmdC5OZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpLAorCQl0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkodGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkpKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvcmVxdWlyZWRfZmllbGRzX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9yZXF1aXJlZF9maWVsZHNfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmE0MTRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvcmVxdWlyZWRfZmllbGRzX3Rlc3QuZ28KQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jayIKKwkib3B0aW9uYWxmaWVsZHN0ZXN0IgorCSJyZXF1aXJlZGZpZWxkdGVzdCIKKwkidGVzdGluZyIKKwkidGhyaWZ0IgorKQorCitmdW5jIFRlc3RSZXF1aXJlZEZpZWxkX1N1Y2Vjc3NXaGVuU2V0KHQgKnRlc3RpbmcuVCkgeworCS8vIGNyZWF0ZSBhIG5ldyBSZXF1aXJlZEZpZWxkIGluc3RhbmNlIHdpdGggdGhlIHJlcXVpcmVkIGZpZWxkIHNldAorCXNvdXJjZSA6PSAmcmVxdWlyZWRmaWVsZHRlc3QuUmVxdWlyZWRGaWVsZHtOYW1lOiAidGhpcyBpcyBhIHRlc3QifQorCXNvdXJjZURhdGEsIGVyciA6PSB0aHJpZnQuTmV3VFNlcmlhbGl6ZXIoKS5Xcml0ZShjb250ZXh0LkJhY2tncm91bmQoKSwgc291cmNlKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiZmFpbGVkIHRvIHNlcmlhbGl6ZSAlVDogJXYiLCBzb3VyY2UsIGVycikKKwl9CisKKwlkIDo9IHRocmlmdC5OZXdURGVzZXJpYWxpemVyKCkKKwllcnIgPSBkLlJlYWQoJnJlcXVpcmVkZmllbGR0ZXN0LlJlcXVpcmVkRmllbGR7fSwgc291cmNlRGF0YSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIkRpZCBub3QgZXhwZWN0IGFuIGVycm9yIHdoZW4gdHJ5aW5nIHRvIGRlc2VyaWFsaXplIHRoZSByZXF1aXJlZGZpZWxkdGVzdC5SZXF1aXJlZEZpZWxkOiAldiIsIGVycikKKwl9Cit9CisKK2Z1bmMgVGVzdFJlcXVpcmVkRmllbGRfRXJyb3JXaGVuTWlzc2luZyh0ICp0ZXN0aW5nLlQpIHsKKwkvLyBjcmVhdGUgYSBuZXcgT3RoZXJUaGluZyBpbnN0YW5jZSwgd2l0aG91dCBzZXR0aW5nIHRoZSByZXF1aXJlZCBmaWVsZAorCXNvdXJjZSA6PSAmcmVxdWlyZWRmaWVsZHRlc3QuT3RoZXJUaGluZ3t9CisJc291cmNlRGF0YSwgZXJyIDo9IHRocmlmdC5OZXdUU2VyaWFsaXplcigpLldyaXRlKGNvbnRleHQuQmFja2dyb3VuZCgpLCBzb3VyY2UpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJmYWlsZWQgdG8gc2VyaWFsaXplICVUOiAldiIsIHNvdXJjZSwgZXJyKQorCX0KKworCS8vIGF0dGVtcHQgdG8gZGVzZXJpYWxpemUgaW50byBhIGRpZmZlcmVudCB0eXBlICh3aGljaCBzaG91bGQgZmFpbCkKKwlkIDo9IHRocmlmdC5OZXdURGVzZXJpYWxpemVyKCkKKwllcnIgPSBkLlJlYWQoJnJlcXVpcmVkZmllbGR0ZXN0LlJlcXVpcmVkRmllbGR7fSwgc291cmNlRGF0YSkKKwlpZiBlcnIgPT0gbmlsIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgYW4gZXJyb3Igd2hlbiB0cnlpbmcgdG8gZGVzZXJpYWxpemUgYW4gb2JqZWN0IHdoaWNoIGlzIG1pc3NpbmcgYSByZXF1aXJlZCBmaWVsZCIpCisJfQorfQorCitmdW5jIFRlc3RTdHJ1Y3RSZWFkUmVxdWlyZWRGaWVsZHModCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCXRlc3RTdHJ1Y3QgOj0gb3B0aW9uYWxmaWVsZHN0ZXN0Lk5ld1N0cnVjdEMoKQorCisJLy8gTm9uZSBvZiByZXF1aXJlZCBmaWVsZHMgYXJlIHNldAorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RydWN0QmVnaW4oKS5SZXR1cm4oIlN0cnVjdEMiLCBuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigiXyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RPUCksIGludDE2KDEpLCBuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RydWN0RW5kKCkuUmV0dXJuKG5pbCksCisJKQorCisJZXJyIDo9IHRlc3RTdHJ1Y3QuUmVhZChwcm90b2NvbCkKKwltb2NrQ3RybC5GaW5pc2goKQorCW1vY2tDdHJsID0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlpZiBlcnIgPT0gbmlsIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgcmVhZCB0byBmYWlsIikKKwl9CisJZXJyMiwgb2sgOj0gZXJyLih0aHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIGEgVFByb3RvY29sRXhjZXB0aW9uIikKKwl9CisJaWYgZXJyMi5UeXBlSWQoKSAhPSB0aHJpZnQuSU5WQUxJRF9EQVRBIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgSU5WQUxJRF9EQVRBIFRQcm90b2NvbEV4Y2VwdGlvbiIpCisJfQorCisJLy8gT25lIG9mIHRoZSByZXF1aXJlZCBmaWVsZHMgaXMgc2V0CisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJ1Y3RCZWdpbigpLlJldHVybigiU3RydWN0QyIsIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJJIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5JMzIpLCBpbnQxNigyKSwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEkzMigpLlJldHVybihpbnQzMigxKSwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkRW5kKCkuUmV0dXJuKG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJfIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVE9QKSwgaW50MTYoMSksIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJ1Y3RFbmQoKS5SZXR1cm4obmlsKSwKKwkpCisKKwllcnIgPSB0ZXN0U3RydWN0LlJlYWQocHJvdG9jb2wpCisJbW9ja0N0cmwuRmluaXNoKCkKKwltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJaWYgZXJyID09IG5pbCB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIHJlYWQgdG8gZmFpbCIpCisJfQorCWVycjIsIG9rID0gZXJyLih0aHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIGEgVFByb3RvY29sRXhjZXB0aW9uIikKKwl9CisJaWYgZXJyMi5UeXBlSWQoKSAhPSB0aHJpZnQuSU5WQUxJRF9EQVRBIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgSU5WQUxJRF9EQVRBIFRQcm90b2NvbEV4Y2VwdGlvbiIpCisJfQorCisJLy8gQm90aCBvZiB0aGUgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEJlZ2luKCkuUmV0dXJuKCJTdHJ1Y3RDIiwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oImkiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LkkzMiksIGludDE2KDIpLCBuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkSTMyKCkuUmV0dXJuKGludDMyKDEpLCBuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRFbmQoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oInMyIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCBpbnQxNig0KSwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cmluZygpLlJldHVybigidGVzdCIsIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEVuZCgpLlJldHVybihuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigiXyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RPUCksIGludDE2KDEpLCBuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RydWN0RW5kKCkuUmV0dXJuKG5pbCksCisJKQorCisJZXJyID0gdGVzdFN0cnVjdC5SZWFkKHByb3RvY29sKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIHJlYWQgdG8gc3VjY2VlZCIpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvc3RydWN0X2FyZ3NfcmV0c190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvc3RydWN0X2FyZ3NfcmV0c190ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZTliMjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9zdHJ1Y3RfYXJnc19yZXRzX3Rlc3QuZ28KQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJc3QgInNlcnZpY2VzdGVzdCIKKykKKworLy90aGlzIGZ1bmN0aW9uIGlzIG5ldmVyIGNhbGxlZCwgaXQgd2lsbCBmYWlsIHRvIGNvbXBpbGUgaWYgY2hlY2sgaXMgZmFpbGVkCitmdW5jIHN0YXRpY0NoZWNrU3RydWN0QXJnc1Jlc3VsdHMoKSB7CisJLy9DaGVjayB0aGF0IHN0cnVjdCBhcmdzIGFuZCByZXN1bHRzIGFyZSBwYXNzZWQgYnkgcmVmZXJlbmNlCisJdmFyIHNhICpzdC5TdHJ1Y3RBID0gJnN0LlN0cnVjdEF7fQorCXZhciBpZmFjZSBzdC5BU2VydgorCXZhciBlcnIgZXJyb3IKKworCXNhLCBlcnIgPSBpZmFjZS5TdHJ1Y3RBRnVuY18xc3RydWN0QShkZWZhdWx0Q3R4LCBzYSkKKwlfID0gZXJyCisJXyA9IHNhCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy90aHJpZnR0ZXN0X2RyaXZlci5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL3RocmlmdHRlc3RfZHJpdmVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNTRjYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy90aHJpZnR0ZXN0X2RyaXZlci5nbwpAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJInJlZmxlY3QiCisJInRlc3RpbmciCisJInRocmlmdHRlc3QiCispCisKK3R5cGUgVGhyaWZ0VGVzdERyaXZlciBzdHJ1Y3QgeworCWNsaWVudCB0aHJpZnR0ZXN0LlRocmlmdFRlc3QKKwl0ICAgICAgKnRlc3RpbmcuVAorfQorCitmdW5jIE5ld1RocmlmdFRlc3REcml2ZXIodCAqdGVzdGluZy5ULCBjbGllbnQgdGhyaWZ0dGVzdC5UaHJpZnRUZXN0KSAqVGhyaWZ0VGVzdERyaXZlciB7CisJcmV0dXJuICZUaHJpZnRUZXN0RHJpdmVye2NsaWVudCwgdH0KK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdERyaXZlcikgU3RhcnQoKSB7CisJY2xpZW50IDo9IHAuY2xpZW50CisJdCA6PSBwLnQKKworCWlmIGNsaWVudC5UZXN0Vm9pZChkZWZhdWx0Q3R4KSAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0Vm9pZCBmYWlsZWQiKQorCX0KKworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAiVGVzdCIpOyByICE9ICJUZXN0IiB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdFN0cmluZyB3aXRoIHNpbXBsZSB0ZXh0IGZhaWxlZCIpCisJfQorCisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICIiKTsgciAhPSAiIiB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdFN0cmluZyB3aXRoIGVtcHR5IHRleHQgZmFpbGVkIikKKwl9CisKKwlzdHJpbmdUZXN0IDo9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgIiArCisJCSJBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwgIiArCisJCSLQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sICIgKworCQki4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCAiICsKKwkJIkNlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgIiArCisJCSJEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsICIgKworCQkiRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCAiICsKKwkJIkZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgIiArCisJCSJBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCAiICsKKwkJIktyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsICIgKworCQkiSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCAiICsKKwkJIuGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgIiArCisJCSJSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sICIgKworCQkiTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgIiArCisJCSJCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCDZhdin2LLZkNix2YjZhtuMLCBCYWhhc2EgIiArCisJCSJNZWxheXUsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKoiICsKKwkJIk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgIiArCisJCSJPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgIiArCisJCSJOb3JmdWsgLyBQaXRrZXJuLCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7EgywgIiArCisJCSLQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlICIgKworCQkiRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCAiICsKKwkJIlN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgIiArCisJCSJUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCAiICsKKwkJIldhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsICIgKworCQkiQsOibi1sw6JtLWfDuiwg57K16KqeIgorCisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsIHN0cmluZ1Rlc3QpOyByICE9IHN0cmluZ1Rlc3QgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RTdHJpbmcgd2l0aCBhbGwgbGFuZ3VhZ2VzIGZhaWxlZCIpCisJfQorCisJc3BlY2lhbENoYXJhY3RlcnMgOj0gInF1b3RlOiBcIiBiYWNrc2xhc2g6IiArCisJCSIgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICIgKworCQkiIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogJ1xcXGJcblxyXHQnIiArCisJCSIgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCIgKworCQkiIGNoYXItdG8tdGVzdC1qc29uLXBhcnNpbmc6IF1dIFwiXV0gXFxcIiB9fX17IFtbWyAiCisKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgc3BlY2lhbENoYXJhY3RlcnMpOyByICE9IHNwZWNpYWxDaGFyYWN0ZXJzIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0U3RyaW5nIHdpdGggc3BlY2lhbENoYXJhY3RlcnMgZmFpbGVkIikKKwl9CisKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RCeXRlKGRlZmF1bHRDdHgsIDEpOyByICE9IDEgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RCeXRlKDEpIGZhaWxlZCIpCisJfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoZGVmYXVsdEN0eCwgMCk7IHIgIT0gMCB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEJ5dGUoMCkgZmFpbGVkIikKKwl9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZShkZWZhdWx0Q3R4LCAtMSk7IHIgIT0gLTEgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RCeXRlKC0xKSBmYWlsZWQiKQorCX0KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RCeXRlKGRlZmF1bHRDdHgsIC0xMjcpOyByICE9IC0xMjcgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RCeXRlKC0xMjcpIGZhaWxlZCIpCisJfQorCisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0STMyKGRlZmF1bHRDdHgsIC0xKTsgciAhPSAtMSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEkzMigtMSkgZmFpbGVkIikKKwl9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0STMyKGRlZmF1bHRDdHgsIDEpOyByICE9IDEgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RJMzIoMSkgZmFpbGVkIikKKwl9CisKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RJNjQoZGVmYXVsdEN0eCwgLTUpOyByICE9IC01IHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0STY0KC01KSBmYWlsZWQiKQorCX0KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RJNjQoZGVmYXVsdEN0eCwgNSk7IHIgIT0gNSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEk2NCg1KSBmYWlsZWQiKQorCX0KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RJNjQoZGVmYXVsdEN0eCwgLTM0MzU5NzM4MzY4KTsgciAhPSAtMzQzNTk3MzgzNjggfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RJNjQoLTM0MzU5NzM4MzY4KSBmYWlsZWQiKQorCX0KKworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdERvdWJsZShkZWZhdWx0Q3R4LCAtNS4yMDk4NTIzKTsgciAhPSAtNS4yMDk4NTIzIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0RG91YmxlKC01LjIwOTg1MjMpIGZhaWxlZCIpCisJfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdERvdWJsZShkZWZhdWx0Q3R4LCAtNy4wMTIwNTIxNzUyMTUwNDQpOyByICE9IC03LjAxMjA1MjE3NTIxNTA0NCB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdERvdWJsZSgtNy4wMTIwNTIxNzUyMTUwNDQpIGZhaWxlZCIpCisJfQorCisJLy8gVE9ETzogYWRkIHRlc3RCaW5hcnkoKSBjYWxsCisKKwlvdXQgOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQorCW91dC5TdHJpbmdUaGluZyA9ICJaZXJvIgorCW91dC5CeXRlVGhpbmcgPSAxCisJb3V0LkkzMlRoaW5nID0gLTMKKwlvdXQuSTY0VGhpbmcgPSAxMDAwMDAwCisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RydWN0KGRlZmF1bHRDdHgsIG91dCk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBvdXQpIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0U3RydWN0IGZhaWxlZCIpCisJfQorCisJb3V0MiA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdDIoKQorCW91dDIuQnl0ZVRoaW5nID0gMQorCW91dDIuU3RydWN0VGhpbmcgPSBvdXQKKwlvdXQyLkkzMlRoaW5nID0gNQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdE5lc3QoZGVmYXVsdEN0eCwgb3V0Mik7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBvdXQyKSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdE5lc3QgZmFpbGVkIikKKwl9CisKKwltYXBvdXQgOj0gbWFrZShtYXBbaW50MzJdaW50MzIpCisJZm9yIGkgOj0gaW50MzIoMCk7IGkgPCA1OyBpKysgeworCQltYXBvdXRbaV0gPSBpIC0gMTAKKwl9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0TWFwKGRlZmF1bHRDdHgsIG1hcG91dCk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBtYXBvdXQpIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0TWFwIGZhaWxlZCIpCisJfQorCisJbWFwVGVzdElucHV0IDo9IG1hcFtzdHJpbmddc3RyaW5neworCQkiYSI6ICIxMjMiLCAiYSBiIjogIndpdGggc3BhY2VzICIsICJzYW1lIjogInNhbWUiLCAiMCI6ICJudW1lcmljIGtleSIsCisJCSJsb25nVmFsdWUiOiBzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiAibG9uZyBrZXkiLAorCX0KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmdNYXAoZGVmYXVsdEN0eCwgbWFwVGVzdElucHV0KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIG1hcFRlc3RJbnB1dCkgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RTdHJpbmdNYXAgZmFpbGVkIikKKwl9CisKKwlzZXRUZXN0SW5wdXQgOj0gW11pbnQzMnsxLCAyLCAzfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFNldChkZWZhdWx0Q3R4LCBzZXRUZXN0SW5wdXQpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgc2V0VGVzdElucHV0KSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdFNldCBmYWlsZWQiKQorCX0KKworCWxpc3RUZXN0IDo9IFtdaW50MzJ7MSwgMiwgM30KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RMaXN0KGRlZmF1bHRDdHgsIGxpc3RUZXN0KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIGxpc3RUZXN0KSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdExpc3QgZmFpbGVkIikKKwl9CisKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RFbnVtKGRlZmF1bHRDdHgsIHRocmlmdHRlc3QuTnVtYmVyel9PTkUpOyByICE9IHRocmlmdHRlc3QuTnVtYmVyel9PTkUgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RFbnVtIGZhaWxlZCIpCisJfQorCisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0VHlwZWRlZihkZWZhdWx0Q3R4LCA2OSk7IHIgIT0gNjkgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RUeXBlZGVmIGZhaWxlZCIpCisJfQorCisJbWFwTWFwVGVzdCA6PSBtYXBbaW50MzJdbWFwW2ludDMyXWludDMyeworCQk0OiAgezE6IDEsIDI6IDIsIDM6IDMsIDQ6IDR9LAorCQktNDogey00OiAtNCwgLTM6IC0zLCAtMjogLTIsIC0xOiAtMX0sCisJfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdE1hcE1hcChkZWZhdWx0Q3R4LCAxKTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIG1hcE1hcFRlc3QpIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0TWFwTWFwIGZhaWxlZCIpCisJfQorCisJY3JhenlYMSA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCisJY3JhenlYMS5TdHJpbmdUaGluZyA9ICJHb29kYnllNCIKKwljcmF6eVgxLkJ5dGVUaGluZyA9IDQKKwljcmF6eVgxLkkzMlRoaW5nID0gNAorCWNyYXp5WDEuSTY0VGhpbmcgPSA0CisKKwljcmF6eVgyIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKKwljcmF6eVgyLlN0cmluZ1RoaW5nID0gIkhlbGxvMiIKKwljcmF6eVgyLkJ5dGVUaGluZyA9IDIKKwljcmF6eVgyLkkzMlRoaW5nID0gMgorCWNyYXp5WDIuSTY0VGhpbmcgPSAyCisKKwljcmF6eSA6PSB0aHJpZnR0ZXN0Lk5ld0luc2FuaXR5KCkKKwljcmF6eS5Vc2VyTWFwID0gbWFwW3RocmlmdHRlc3QuTnVtYmVyel10aHJpZnR0ZXN0LlVzZXJJZHs1OiA1LCA4OiA4fQorCWNyYXp5Llh0cnVjdHMgPSBbXSp0aHJpZnR0ZXN0Llh0cnVjdHtjcmF6eVgxLCBjcmF6eVgyfQorCisJY3JhenlFbXB0eSA6PSB0aHJpZnR0ZXN0Lk5ld0luc2FuaXR5KCkKKwljcmF6eUVtcHR5LlVzZXJNYXAgPSBtYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6XXRocmlmdHRlc3QuVXNlcklke30KKwljcmF6eUVtcHR5Llh0cnVjdHMgPSBbXSp0aHJpZnR0ZXN0Llh0cnVjdHt9CisKKwlpbnNhbml0eSA6PSBtYXBbdGhyaWZ0dGVzdC5Vc2VySWRdbWFwW3RocmlmdHRlc3QuTnVtYmVyel0qdGhyaWZ0dGVzdC5JbnNhbml0eXsKKwkJMToge3RocmlmdHRlc3QuTnVtYmVyel9UV086IGNyYXp5LCB0aHJpZnR0ZXN0Lk51bWJlcnpfVEhSRUU6IGNyYXp5fSwKKwkJMjoge3RocmlmdHRlc3QuTnVtYmVyel9TSVg6IGNyYXp5RW1wdHl9LAorCX0KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RJbnNhbml0eShkZWZhdWx0Q3R4LCBjcmF6eSk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBpbnNhbml0eSkgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RJbnNhbml0eSBmYWlsZWQiKQorCX0KKworCWlmIGVyciA6PSBjbGllbnQuVGVzdEV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiVEV4Y2VwdGlvbiIpOyBlcnIgPT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEV4Y2VwdGlvbiBURXhjZXB0aW9uIGZhaWxlZCIpCisJfQorCisJaWYgZXJyLCBvayA6PSBjbGllbnQuVGVzdEV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiWGNlcHRpb24iKS4oKnRocmlmdHRlc3QuWGNlcHRpb24pOyBvayA9PSBmYWxzZSB8fCBlcnIgPT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEV4Y2VwdGlvbiBYY2VwdGlvbiBmYWlsZWQiKQorCX0gZWxzZSBpZiBlcnIuRXJyb3JDb2RlICE9IDEwMDEgfHwgZXJyLk1lc3NhZ2UgIT0gIlhjZXB0aW9uIiB7CisJCXQuRmF0YWwoIlRlc3RFeGNlcHRpb24gWGNlcHRpb24gZmFpbGVkIikKKwl9CisKKwlpZiBlcnIgOj0gY2xpZW50LlRlc3RFeGNlcHRpb24oZGVmYXVsdEN0eCwgIm5vIEV4Y2VwdGlvbiIpOyBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEV4Y2VwdGlvbiBubyBFeGNlcHRpb24gZmFpbGVkIikKKwl9CisKKwlpZiBlcnIgOj0gY2xpZW50LlRlc3RPbmV3YXkoZGVmYXVsdEN0eCwgMCk7IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0T25ld2F5IGZhaWxlZCIpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvdGhyaWZ0dGVzdF9oYW5kbGVyLmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvdGhyaWZ0dGVzdF9oYW5kbGVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYjllZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy90aHJpZnR0ZXN0X2hhbmRsZXIuZ28KQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlcnJvcnMiCisJInRocmlmdCIKKwkidGhyaWZ0dGVzdCIKKwkidGltZSIKKykKKwordHlwZSBTZWNvbmRTZXJ2aWNlSGFuZGxlciBzdHJ1Y3QgeworfQorCitmdW5jIE5ld1NlY29uZFNlcnZpY2VIYW5kbGVyKCkgKlNlY29uZFNlcnZpY2VIYW5kbGVyIHsKKwlyZXR1cm4gJlNlY29uZFNlcnZpY2VIYW5kbGVye30KK30KKworZnVuYyAocCAqU2Vjb25kU2VydmljZUhhbmRsZXIpIEJsYWhCbGFoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlNlY29uZFNlcnZpY2VIYW5kbGVyKSBTZWNvbmR0ZXN0U3RyaW5nKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIHN0cmluZykgKHIgc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCit0eXBlIFRocmlmdFRlc3RIYW5kbGVyIHN0cnVjdCB7Cit9CisKK2Z1bmMgTmV3VGhyaWZ0VGVzdEhhbmRsZXIoKSAqVGhyaWZ0VGVzdEhhbmRsZXIgeworCXJldHVybiAmVGhyaWZ0VGVzdEhhbmRsZXJ7fQorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFZvaWQoY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RTdHJpbmcoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgc3RyaW5nKSAociBzdHJpbmcsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0Qm9vbChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBib29sKSAociBib29sLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEJ5dGUoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgaW50OCkgKHIgaW50OCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RJMzIoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgaW50MzIpIChyIGludDMyLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEk2NChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBpbnQ2NCkgKHIgaW50NjQsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0RG91YmxlKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGZsb2F0NjQpIChyIGZsb2F0NjQsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0QmluYXJ5KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIFtdYnl0ZSkgKHIgW11ieXRlLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFN0cnVjdChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyAqdGhyaWZ0dGVzdC5YdHJ1Y3QpIChyICp0aHJpZnR0ZXN0Llh0cnVjdCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3ROZXN0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nICp0aHJpZnR0ZXN0Llh0cnVjdDIpIChyICp0aHJpZnR0ZXN0Llh0cnVjdDIsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0TWFwKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIG1hcFtpbnQzMl1pbnQzMikgKHIgbWFwW2ludDMyXWludDMyLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFN0cmluZ01hcChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBtYXBbc3RyaW5nXXN0cmluZykgKHIgbWFwW3N0cmluZ11zdHJpbmcsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0U2V0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIFtdaW50MzIpIChyIFtdaW50MzIsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0TGlzdChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBbXWludDMyKSAociBbXWludDMyLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEVudW0oY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgdGhyaWZ0dGVzdC5OdW1iZXJ6KSAociB0aHJpZnR0ZXN0Lk51bWJlcnosIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0VHlwZWRlZihjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyB0aHJpZnR0ZXN0LlVzZXJJZCkgKHIgdGhyaWZ0dGVzdC5Vc2VySWQsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0TWFwTWFwKGN0eCBjb250ZXh0LkNvbnRleHQsIGhlbGxvIGludDMyKSAociBtYXBbaW50MzJdbWFwW2ludDMyXWludDMyLCBlcnIgZXJyb3IpIHsKKwlyID0gbWFrZShtYXBbaW50MzJdbWFwW2ludDMyXWludDMyKQorCXBvcyA6PSBtYWtlKG1hcFtpbnQzMl1pbnQzMikKKwluZWcgOj0gbWFrZShtYXBbaW50MzJdaW50MzIpCisKKwlmb3IgaSA6PSBpbnQzMigxKTsgaSA8IDU7IGkrKyB7CisJCXBvc1tpXSA9IGkKKwkJbmVnWy1pXSA9IC1pCisJfQorCXJbNF0gPSBwb3MKKwlyWy00XSA9IG5lZworCisJcmV0dXJuIHIsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEluc2FuaXR5KGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZ3VtZW50ICp0aHJpZnR0ZXN0Lkluc2FuaXR5KSAociBtYXBbdGhyaWZ0dGVzdC5Vc2VySWRdbWFwW3RocmlmdHRlc3QuTnVtYmVyel0qdGhyaWZ0dGVzdC5JbnNhbml0eSwgZXJyIGVycm9yKSB7CisJaGVsbG8gOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQorCWhlbGxvLlN0cmluZ1RoaW5nID0gIkhlbGxvMiIKKwloZWxsby5CeXRlVGhpbmcgPSAyCisJaGVsbG8uSTMyVGhpbmcgPSAyCisJaGVsbG8uSTY0VGhpbmcgPSAyCisKKwlnb29kYnllIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKKwlnb29kYnllLlN0cmluZ1RoaW5nID0gIkdvb2RieWU0IgorCWdvb2RieWUuQnl0ZVRoaW5nID0gNAorCWdvb2RieWUuSTMyVGhpbmcgPSA0CisJZ29vZGJ5ZS5JNjRUaGluZyA9IDQKKworCWNyYXp5IDo9IHRocmlmdHRlc3QuTmV3SW5zYW5pdHkoKQorCWNyYXp5LlVzZXJNYXAgPSBtYWtlKG1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpddGhyaWZ0dGVzdC5Vc2VySWQpCisJY3JhenkuVXNlck1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpfRUlHSFRdID0gOAorCWNyYXp5LlVzZXJNYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6X0ZJVkVdID0gNQorCWNyYXp5Llh0cnVjdHMgPSBbXSp0aHJpZnR0ZXN0Llh0cnVjdHtnb29kYnllLCBoZWxsb30KKworCWZpcnN0X21hcCA6PSBtYWtlKG1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpdKnRocmlmdHRlc3QuSW5zYW5pdHkpCisJc2Vjb25kX21hcCA6PSBtYWtlKG1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpdKnRocmlmdHRlc3QuSW5zYW5pdHkpCisKKwlmaXJzdF9tYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6X1RXT10gPSBjcmF6eQorCWZpcnN0X21hcFt0aHJpZnR0ZXN0Lk51bWJlcnpfVEhSRUVdID0gY3JhenkKKworCWxvb25leSA6PSB0aHJpZnR0ZXN0Lk5ld0luc2FuaXR5KCkKKwlzZWNvbmRfbWFwW3RocmlmdHRlc3QuTnVtYmVyel9TSVhdID0gbG9vbmV5CisKKwl2YXIgaW5zYW5lID0gbWFrZShtYXBbdGhyaWZ0dGVzdC5Vc2VySWRdbWFwW3RocmlmdHRlc3QuTnVtYmVyel0qdGhyaWZ0dGVzdC5JbnNhbml0eSkKKwlpbnNhbmVbMV0gPSBmaXJzdF9tYXAKKwlpbnNhbmVbMl0gPSBzZWNvbmRfbWFwCisKKwlyZXR1cm4gaW5zYW5lLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RNdWx0aShjdHggY29udGV4dC5Db250ZXh0LCBhcmcwIGludDgsIGFyZzEgaW50MzIsIGFyZzIgaW50NjQsIGFyZzMgbWFwW2ludDE2XXN0cmluZywgYXJnNCB0aHJpZnR0ZXN0Lk51bWJlcnosIGFyZzUgdGhyaWZ0dGVzdC5Vc2VySWQpIChyICp0aHJpZnR0ZXN0Llh0cnVjdCwgZXJyIGVycm9yKSB7CisJciA9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKKwlyLlN0cmluZ1RoaW5nID0gIkhlbGxvMiIKKwlyLkJ5dGVUaGluZyA9IGFyZzAKKwlyLkkzMlRoaW5nID0gYXJnMQorCXIuSTY0VGhpbmcgPSBhcmcyCisJcmV0dXJuIHIsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEV4Y2VwdGlvbihjdHggY29udGV4dC5Db250ZXh0LCBhcmcgc3RyaW5nKSAoZXJyIGVycm9yKSB7CisJaWYgYXJnID09ICJYY2VwdGlvbiIgeworCQl4IDo9IHRocmlmdHRlc3QuTmV3WGNlcHRpb24oKQorCQl4LkVycm9yQ29kZSA9IDEwMDEKKwkJeC5NZXNzYWdlID0gYXJnCisJCXJldHVybiB4CisJfSBlbHNlIGlmIGFyZyA9PSAiVEV4Y2VwdGlvbiIgeworCQlyZXR1cm4gdGhyaWZ0LlRFeGNlcHRpb24oZXJyb3JzLk5ldyhhcmcpKQorCX0gZWxzZSB7CisJCXJldHVybiBuaWwKKwl9Cit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0TXVsdGlFeGNlcHRpb24oY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnMCBzdHJpbmcsIGFyZzEgc3RyaW5nKSAociAqdGhyaWZ0dGVzdC5YdHJ1Y3QsIGVyciBlcnJvcikgeworCWlmIGFyZzAgPT0gIlhjZXB0aW9uIiB7CisJCXggOj0gdGhyaWZ0dGVzdC5OZXdYY2VwdGlvbigpCisJCXguRXJyb3JDb2RlID0gMTAwMQorCQl4Lk1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIKKwkJcmV0dXJuIG5pbCwgeAorCX0gZWxzZSBpZiBhcmcwID09ICJYY2VwdGlvbjIiIHsKKwkJeDIgOj0gdGhyaWZ0dGVzdC5OZXdYY2VwdGlvbjIoKQorCQl4Mi5FcnJvckNvZGUgPSAyMDAyCisJCXgyLlN0cnVjdFRoaW5nID0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQorCQl4Mi5TdHJ1Y3RUaGluZy5TdHJpbmdUaGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIKKwkJcmV0dXJuIG5pbCwgeDIKKwl9CisKKwlyZXMgOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQorCXJlcy5TdHJpbmdUaGluZyA9IGFyZzEKKwlyZXR1cm4gcmVzLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RPbmV3YXkoY3R4IGNvbnRleHQuQ29udGV4dCwgc2Vjb25kc1RvU2xlZXAgaW50MzIpIChlcnIgZXJyb3IpIHsKKwl0aW1lLlNsZWVwKHRpbWUuU2Vjb25kICogdGltZS5EdXJhdGlvbihzZWNvbmRzVG9TbGVlcCkpCisJcmV0dXJuIG5pbAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvdW5pb25fYmluYXJ5X3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy91bmlvbl9iaW5hcnlfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGFlMmNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvdW5pb25fYmluYXJ5X3Rlc3QuZ28KQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJInRlc3RpbmciCisJInVuaW9uYmluYXJ5dGVzdCIKKykKKworCisvLyBTZWUgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDU3MworZnVuYyBUZXN0VW5pb25CaW5hcnkodCAqdGVzdGluZy5UKSB7CisJcyA6PSB1bmlvbmJpbmFyeXRlc3QuTmV3U2FtcGxlKCkKKwlzLlUxID0gbWFwW3N0cmluZ11zdHJpbmd7fQorCXMuVTIgPSBbXWJ5dGV7fQorCWlmIG4gOj0gcy5Db3VudFNldEZpZWxkc1NhbXBsZSgpOyBuICE9IDIgeworCQl0LkVycm9yZigiRXhwZWN0ZWQgMiBzZXQgZmllbGRzLCBnb3QgJWQhIiwgbikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy91bmlvbl9kZWZhdWx0X3ZhbHVlX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy91bmlvbl9kZWZhdWx0X3ZhbHVlX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjYmY0ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3VuaW9uX2RlZmF1bHRfdmFsdWVfdGVzdC5nbwpAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkidGVzdGluZyIKKwkidW5pb25kZWZhdWx0dmFsdWV0ZXN0IgorKQorCitmdW5jIFRlc3RVbmlvbkRlZmF1bHRWYWx1ZSh0ICp0ZXN0aW5nLlQpIHsKKwlzIDo9IHVuaW9uZGVmYXVsdHZhbHVldGVzdC5OZXdUZXN0U3RydWN0KCkKKwlkIDo9IHMuR2V0RGVzY2VuZGFudCgpCisJaWYgZCA9PSBuaWwgeworCQl0LkVycm9yKCJEZWZhdWx0IFVuaW9uIHZhbHVlIG5vdCBzZXQhIikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L01ha2VmaWxlIGIvbGliL2dvL3RocmlmdC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlmNzg2Mi4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAwOSBUaGUgR28gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUKLSMgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi1pbmNsdWRlICQoR09ST09UKS9zcmMvTWFrZS5pbmMKLQotVEFSRz10aHJpZnQKLUdPRklMRVM9XAotICAgICAgICB0YXBwbGljYXRpb25fZXhjZXB0aW9uLmdvXAotICAgICAgICB0YmFzZS5nb1wKLSAgICAgICAgdGJpbmFyeV9wcm90b2NvbC5nb1wKLSAgICAgICAgdGNvbXBhY3RfcHJvdG9jb2wuZ29cCi0gICAgICAgIHRjb21wYXJlLmdvXAotICAgICAgICB0Y29udGFpbmVyLmdvXAotICAgICAgICB0ZXhjZXB0aW9uLmdvXAotICAgICAgICB0ZmllbGQuZ29cCi0gICAgICAgIHRmcmFtZWRfdHJhbnNwb3J0LmdvXAotICAgICAgICB0aHR0cF9jbGllbnQuZ29cCi0gICAgICAgIHRpb3N0cmVhbV90cmFuc3BvcnQuZ29cCi0gICAgICAgIHRsaXN0LmdvXAotICAgICAgICB0anNvbl9wcm90b2NvbC5nb1wKLSAgICAgICAgdG1hcC5nb1wKLSAgICAgICAgdG1lbW9yeV9idWZmZXIuZ29cCi0gICAgICAgIHRtZXNzYWdlLmdvXAotICAgICAgICB0bWVzc2FnZXR5cGUuZ29cCi0gICAgICAgIHRub25ibG9ja2luZ19zZXJ2ZXIuZ29cCi0gICAgICAgIHRub25ibG9ja2luZ19zZXJ2ZXJfc29ja2V0LmdvXAotICAgICAgICB0bm9uYmxvY2tpbmdfc29ja2V0LmdvXAotICAgICAgICB0bm9uYmxvY2tpbmdfdHJhbnNwb3J0LmdvXAotICAgICAgICB0bnVtZXJpYy5nb1wKLSAgICAgICAgdHByb2Nlc3Nvci5nb1wKLSAgICAgICAgdHByb2Nlc3Nvcl9mYWN0b3J5LmdvXAotICAgICAgICB0cHJvdG9jb2wuZ29cCi0gICAgICAgIHRwcm90b2NvbF9leGNlcHRpb24uZ29cCi0gICAgICAgIHRwcm90b2NvbF9mYWN0b3J5LmdvXAotICAgICAgICB0c2VydmVyLmdvXAotICAgICAgICB0c2VydmVyX3NvY2tldC5nb1wKLSAgICAgICAgdHNlcnZlcl90cmFuc3BvcnQuZ29cCi0gICAgICAgIHRzZXQuZ29cCi0gICAgICAgIHRzaW1wbGVfc2VydmVyLmdvXAotICAgICAgICB0c2ltcGxlX2pzb25fcHJvdG9jb2wuZ29cCi0gICAgICAgIHRzb2NrZXQuZ29cCi0gICAgICAgIHRzdHJ1Y3QuZ29cCi0gICAgICAgIHR0cmFuc3BvcnQuZ29cCi0gICAgICAgIHR0cmFuc3BvcnRfZXhjZXB0aW9uLmdvXAotICAgICAgICB0dHJhbnNwb3J0X2ZhY3RvcnkuZ29cCi0gICAgICAgIHR0eXBlLmdvCi0KLURJUlM9XAotCi1pbmNsdWRlICQoR09ST09UKS9zcmMvTWFrZS5wa2cKLQotY2hlY2s6Ci0JZ29tYWtlIHRlc3QKLQotLWluY2x1ZGUgLi4vTWFrZS5kZXBzCi0KLQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9fdGVzdG1haW4uZ28gYi9saWIvZ28vdGhyaWZ0L190ZXN0bWFpbi5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IwYWJmYi4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L190ZXN0bWFpbi5nbworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLXBhY2thZ2UgbWFpbgotCi1pbXBvcnQgIi4vX3h0ZXN0XyIKLWltcG9ydCAidGVzdGluZyIKLWltcG9ydCBfX3JlZ2V4cF9fICJyZWdleHAiCi0KLXZhciB0ZXN0cyA9IFtddGVzdGluZy5JbnRlcm5hbFRlc3R7Ci0JeyJ0aHJpZnRfdGVzdC5UZXN0VEFwcGxpY2F0aW9uRXhjZXB0aW9uIiwgdGhyaWZ0X3Rlc3QuVGVzdFRBcHBsaWNhdGlvbkV4Y2VwdGlvbn0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0UmVhZFdyaXRlQmluYXJ5UHJvdG9jb2wiLCB0aHJpZnRfdGVzdC5UZXN0UmVhZFdyaXRlQmluYXJ5UHJvdG9jb2x9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFJlYWRXcml0ZUNvbXBhY3RQcm90b2NvbCIsIHRocmlmdF90ZXN0LlRlc3RSZWFkV3JpdGVDb21wYWN0UHJvdG9jb2x9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFRFeGNlcHRpb24iLCB0aHJpZnRfdGVzdC5UZXN0VEV4Y2VwdGlvbn0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0RnJhbWVkVHJhbnNwb3J0IiwgdGhyaWZ0X3Rlc3QuVGVzdEZyYW1lZFRyYW5zcG9ydH0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0SHR0cENsaWVudCIsIHRocmlmdF90ZXN0LlRlc3RIdHRwQ2xpZW50fSwKLQl7InRocmlmdF90ZXN0LlRlc3RJT1N0cmVhbVRyYW5zcG9ydCIsIHRocmlmdF90ZXN0LlRlc3RJT1N0cmVhbVRyYW5zcG9ydH0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0V3JpdGVKU09OUHJvdG9jb2xCb29sIiwgdGhyaWZ0X3Rlc3QuVGVzdFdyaXRlSlNPTlByb3RvY29sQm9vbH0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0UmVhZEpTT05Qcm90b2NvbEJvb2wiLCB0aHJpZnRfdGVzdC5UZXN0UmVhZEpTT05Qcm90b2NvbEJvb2x9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFdyaXRlSlNPTlByb3RvY29sQnl0ZSIsIHRocmlmdF90ZXN0LlRlc3RXcml0ZUpTT05Qcm90b2NvbEJ5dGV9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFJlYWRKU09OUHJvdG9jb2xCeXRlIiwgdGhyaWZ0X3Rlc3QuVGVzdFJlYWRKU09OUHJvdG9jb2xCeXRlfSwKLQl7InRocmlmdF90ZXN0LlRlc3RXcml0ZUpTT05Qcm90b2NvbEkxNiIsIHRocmlmdF90ZXN0LlRlc3RXcml0ZUpTT05Qcm90b2NvbEkxNn0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0UmVhZEpTT05Qcm90b2NvbEkxNiIsIHRocmlmdF90ZXN0LlRlc3RSZWFkSlNPTlByb3RvY29sSTE2fSwKLQl7InRocmlmdF90ZXN0LlRlc3RXcml0ZUpTT05Qcm90b2NvbEkzMiIsIHRocmlmdF90ZXN0LlRlc3RXcml0ZUpTT05Qcm90b2NvbEkzMn0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0UmVhZEpTT05Qcm90b2NvbEkzMiIsIHRocmlmdF90ZXN0LlRlc3RSZWFkSlNPTlByb3RvY29sSTMyfSwKLQl7InRocmlmdF90ZXN0LlRlc3RXcml0ZUpTT05Qcm90b2NvbEk2NCIsIHRocmlmdF90ZXN0LlRlc3RXcml0ZUpTT05Qcm90b2NvbEk2NH0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0UmVhZEpTT05Qcm90b2NvbEk2NCIsIHRocmlmdF90ZXN0LlRlc3RSZWFkSlNPTlByb3RvY29sSTY0fSwKLQl7InRocmlmdF90ZXN0LlRlc3RXcml0ZUpTT05Qcm90b2NvbERvdWJsZSIsIHRocmlmdF90ZXN0LlRlc3RXcml0ZUpTT05Qcm90b2NvbERvdWJsZX0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0UmVhZEpTT05Qcm90b2NvbERvdWJsZSIsIHRocmlmdF90ZXN0LlRlc3RSZWFkSlNPTlByb3RvY29sRG91YmxlfSwKLQl7InRocmlmdF90ZXN0LlRlc3RXcml0ZUpTT05Qcm90b2NvbFN0cmluZyIsIHRocmlmdF90ZXN0LlRlc3RXcml0ZUpTT05Qcm90b2NvbFN0cmluZ30sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0UmVhZEpTT05Qcm90b2NvbFN0cmluZyIsIHRocmlmdF90ZXN0LlRlc3RSZWFkSlNPTlByb3RvY29sU3RyaW5nfSwKLQl7InRocmlmdF90ZXN0LlRlc3RXcml0ZUpTT05Qcm90b2NvbEJpbmFyeSIsIHRocmlmdF90ZXN0LlRlc3RXcml0ZUpTT05Qcm90b2NvbEJpbmFyeX0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0UmVhZEpTT05Qcm90b2NvbEJpbmFyeSIsIHRocmlmdF90ZXN0LlRlc3RSZWFkSlNPTlByb3RvY29sQmluYXJ5fSwKLQl7InRocmlmdF90ZXN0LlRlc3RXcml0ZUpTT05Qcm90b2NvbExpc3QiLCB0aHJpZnRfdGVzdC5UZXN0V3JpdGVKU09OUHJvdG9jb2xMaXN0fSwKLQl7InRocmlmdF90ZXN0LlRlc3RXcml0ZUpTT05Qcm90b2NvbFNldCIsIHRocmlmdF90ZXN0LlRlc3RXcml0ZUpTT05Qcm90b2NvbFNldH0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0V3JpdGVKU09OUHJvdG9jb2xNYXAiLCB0aHJpZnRfdGVzdC5UZXN0V3JpdGVKU09OUHJvdG9jb2xNYXB9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFJlYWRXcml0ZUpTT05TdHJ1Y3QiLCB0aHJpZnRfdGVzdC5UZXN0UmVhZFdyaXRlSlNPTlN0cnVjdH0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0UmVhZFdyaXRlSlNPTlByb3RvY29sIiwgdGhyaWZ0X3Rlc3QuVGVzdFJlYWRXcml0ZUpTT05Qcm90b2NvbH0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0TWVtb3J5QnVmZmVyIiwgdGhyaWZ0X3Rlc3QuVGVzdE1lbW9yeUJ1ZmZlcn0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0Tm9uYmxvY2tpbmdUcmFuc3BvcnRTZXJ2ZXJUb0NsaWVudCIsIHRocmlmdF90ZXN0LlRlc3ROb25ibG9ja2luZ1RyYW5zcG9ydFNlcnZlclRvQ2xpZW50fSwKLQl7InRocmlmdF90ZXN0LlRlc3ROb25ibG9ja2luZ1RyYW5zcG9ydENsaWVudFRvU2VydmVyIiwgdGhyaWZ0X3Rlc3QuVGVzdE5vbmJsb2NraW5nVHJhbnNwb3J0Q2xpZW50VG9TZXJ2ZXJ9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdE5vdGhpbmciLCB0aHJpZnRfdGVzdC5UZXN0Tm90aGluZ30sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xCb29sIiwgdGhyaWZ0X3Rlc3QuVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sQm9vbH0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEJvb2wiLCB0aHJpZnRfdGVzdC5UZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEJvb2x9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sQnl0ZSIsIHRocmlmdF90ZXN0LlRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEJ5dGV9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xCeXRlIiwgdGhyaWZ0X3Rlc3QuVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xCeXRlfSwKLQl7InRocmlmdF90ZXN0LlRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEkxNiIsIHRocmlmdF90ZXN0LlRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEkxNn0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEkxNiIsIHRocmlmdF90ZXN0LlRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sSTE2fSwKLQl7InRocmlmdF90ZXN0LlRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEkzMiIsIHRocmlmdF90ZXN0LlRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEkzMn0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEkzMiIsIHRocmlmdF90ZXN0LlRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sSTMyfSwKLQl7InRocmlmdF90ZXN0LlRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEk2NCIsIHRocmlmdF90ZXN0LlRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEk2NH0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEk2NCIsIHRocmlmdF90ZXN0LlRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sSTY0fSwKLQl7InRocmlmdF90ZXN0LlRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbERvdWJsZSIsIHRocmlmdF90ZXN0LlRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbERvdWJsZX0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbERvdWJsZSIsIHRocmlmdF90ZXN0LlRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sRG91YmxlfSwKLQl7InRocmlmdF90ZXN0LlRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbFN0cmluZyIsIHRocmlmdF90ZXN0LlRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbFN0cmluZ30sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbFN0cmluZyIsIHRocmlmdF90ZXN0LlRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sU3RyaW5nfSwKLQl7InRocmlmdF90ZXN0LlRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEJpbmFyeSIsIHRocmlmdF90ZXN0LlRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEJpbmFyeX0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEJpbmFyeSIsIHRocmlmdF90ZXN0LlRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sQmluYXJ5fSwKLQl7InRocmlmdF90ZXN0LlRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbExpc3QiLCB0aHJpZnRfdGVzdC5UZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xMaXN0fSwKLQl7InRocmlmdF90ZXN0LlRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbFNldCIsIHRocmlmdF90ZXN0LlRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbFNldH0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xNYXAiLCB0aHJpZnRfdGVzdC5UZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xNYXB9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFJlYWRXcml0ZVNpbXBsZUpTT05TdHJ1Y3QiLCB0aHJpZnRfdGVzdC5UZXN0UmVhZFdyaXRlU2ltcGxlSlNPTlN0cnVjdH0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0UmVhZFdyaXRlU2ltcGxlSlNPTlByb3RvY29sIiwgdGhyaWZ0X3Rlc3QuVGVzdFJlYWRXcml0ZVNpbXBsZUpTT05Qcm90b2NvbH0sCi19Ci12YXIgYmVuY2htYXJrcyA9IFtddGVzdGluZy5JbnRlcm5hbEJlbmNobWFya3sgLy8KLX0KLQotZnVuYyBtYWluKCkgewotCXRlc3RpbmcuTWFpbihfX3JlZ2V4cF9fLk1hdGNoU3RyaW5nLCB0ZXN0cykKLQl0ZXN0aW5nLlJ1bkJlbmNobWFya3MoX19yZWdleHBfXy5NYXRjaFN0cmluZywgYmVuY2htYXJrcykKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uLmdvIGIvbGliL2dvL3RocmlmdC9hcHBsaWNhdGlvbl9leGNlcHRpb24uZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlkN2VlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uLmdvCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2NvbnN0ICgKKwlVTktOT1dOX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiAgPSAwCisJVU5LTk9XTl9NRVRIT0QgICAgICAgICAgICAgICAgID0gMQorCUlOVkFMSURfTUVTU0FHRV9UWVBFX0VYQ0VQVElPTiA9IDIKKwlXUk9OR19NRVRIT0RfTkFNRSAgICAgICAgICAgICAgPSAzCisJQkFEX1NFUVVFTkNFX0lEICAgICAgICAgICAgICAgID0gNAorCU1JU1NJTkdfUkVTVUxUICAgICAgICAgICAgICAgICA9IDUKKwlJTlRFUk5BTF9FUlJPUiAgICAgICAgICAgICAgICAgPSA2CisJUFJPVE9DT0xfRVJST1IgICAgICAgICAgICAgICAgID0gNworKQorCit2YXIgZGVmYXVsdEFwcGxpY2F0aW9uRXhjZXB0aW9uTWVzc2FnZSA9IG1hcFtpbnQzMl1zdHJpbmd7CisJVU5LTk9XTl9BUFBMSUNBVElPTl9FWENFUFRJT046ICAidW5rbm93biBhcHBsaWNhdGlvbiBleGNlcHRpb24iLAorCVVOS05PV05fTUVUSE9EOiAgICAgICAgICAgICAgICAgInVua25vd24gbWV0aG9kIiwKKwlJTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT046ICJpbnZhbGlkIG1lc3NhZ2UgdHlwZSIsCisJV1JPTkdfTUVUSE9EX05BTUU6ICAgICAgICAgICAgICAid3JvbmcgbWV0aG9kIG5hbWUiLAorCUJBRF9TRVFVRU5DRV9JRDogICAgICAgICAgICAgICAgImJhZCBzZXF1ZW5jZSBJRCIsCisJTUlTU0lOR19SRVNVTFQ6ICAgICAgICAgICAgICAgICAibWlzc2luZyByZXN1bHQiLAorCUlOVEVSTkFMX0VSUk9SOiAgICAgICAgICAgICAgICAgInVua25vd24gaW50ZXJuYWwgZXJyb3IiLAorCVBST1RPQ09MX0VSUk9SOiAgICAgICAgICAgICAgICAgInVua25vd24gcHJvdG9jb2wgZXJyb3IiLAorfQorCisvLyBBcHBsaWNhdGlvbiBsZXZlbCBUaHJpZnQgZXhjZXB0aW9uCit0eXBlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBpbnRlcmZhY2UgeworCVRFeGNlcHRpb24KKwlUeXBlSWQoKSBpbnQzMgorCVJlYWQoaXByb3QgVFByb3RvY29sKSBlcnJvcgorCVdyaXRlKG9wcm90IFRQcm90b2NvbCkgZXJyb3IKK30KKwordHlwZSB0QXBwbGljYXRpb25FeGNlcHRpb24gc3RydWN0IHsKKwltZXNzYWdlIHN0cmluZworCXR5cGVfICAgaW50MzIKK30KKworZnVuYyAoZSB0QXBwbGljYXRpb25FeGNlcHRpb24pIEVycm9yKCkgc3RyaW5nIHsKKwlpZiBlLm1lc3NhZ2UgIT0gIiIgeworCQlyZXR1cm4gZS5tZXNzYWdlCisJfQorCXJldHVybiBkZWZhdWx0QXBwbGljYXRpb25FeGNlcHRpb25NZXNzYWdlW2UudHlwZV9dCit9CisKK2Z1bmMgTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHR5cGVfIGludDMyLCBtZXNzYWdlIHN0cmluZykgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKwlyZXR1cm4gJnRBcHBsaWNhdGlvbkV4Y2VwdGlvbnttZXNzYWdlLCB0eXBlX30KK30KKworZnVuYyAocCAqdEFwcGxpY2F0aW9uRXhjZXB0aW9uKSBUeXBlSWQoKSBpbnQzMiB7CisJcmV0dXJuIHAudHlwZV8KK30KKworZnVuYyAocCAqdEFwcGxpY2F0aW9uRXhjZXB0aW9uKSBSZWFkKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCS8vIFRPRE86IHRoaXMgc2hvdWxkIHJlYWxseSBiZSBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyCisJXywgZXJyIDo9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisKKwltZXNzYWdlIDo9ICIiCisJdHlwZV8gOj0gaW50MzIoVU5LTk9XTl9BUFBMSUNBVElPTl9FWENFUFRJT04pCisKKwlmb3IgeworCQlfLCB0dHlwZSwgaWQsIGVyciA6PSBpcHJvdC5SZWFkRmllbGRCZWdpbigpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJCWlmIHR0eXBlID09IFNUT1AgeworCQkJYnJlYWsKKwkJfQorCQlzd2l0Y2ggaWQgeworCQljYXNlIDE6CisJCQlpZiB0dHlwZSA9PSBTVFJJTkcgeworCQkJCWlmIG1lc3NhZ2UsIGVyciA9IGlwcm90LlJlYWRTdHJpbmcoKTsgZXJyICE9IG5pbCB7CisJCQkJCXJldHVybiBlcnIKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIGVyciA9IFNraXBEZWZhdWx0RGVwdGgoaXByb3QsIHR0eXBlKTsgZXJyICE9IG5pbCB7CisJCQkJCXJldHVybiBlcnIKKwkJCQl9CisJCQl9CisJCWNhc2UgMjoKKwkJCWlmIHR0eXBlID09IEkzMiB7CisJCQkJaWYgdHlwZV8sIGVyciA9IGlwcm90LlJlYWRJMzIoKTsgZXJyICE9IG5pbCB7CisJCQkJCXJldHVybiBlcnIKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIGVyciA9IFNraXBEZWZhdWx0RGVwdGgoaXByb3QsIHR0eXBlKTsgZXJyICE9IG5pbCB7CisJCQkJCXJldHVybiBlcnIKKwkJCQl9CisJCQl9CisJCWRlZmF1bHQ6CisJCQlpZiBlcnIgPSBTa2lwRGVmYXVsdERlcHRoKGlwcm90LCB0dHlwZSk7IGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJfQorCQlpZiBlcnIgPSBpcHJvdC5SZWFkRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwl9CisJaWYgZXJyIDo9IGlwcm90LlJlYWRTdHJ1Y3RFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisKKwlwLm1lc3NhZ2UgPSBtZXNzYWdlCisJcC50eXBlXyA9IHR5cGVfCisKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKnRBcHBsaWNhdGlvbkV4Y2VwdGlvbikgV3JpdGUob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7CisJZXJyID0gb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbigiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwlpZiBsZW4ocC5FcnJvcigpKSA+IDAgeworCQllcnIgPSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oIm1lc3NhZ2UiLCBTVFJJTkcsIDEpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuCisJCX0KKwkJZXJyID0gb3Byb3QuV3JpdGVTdHJpbmcocC5FcnJvcigpKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybgorCQl9CisJCWVyciA9IG9wcm90LldyaXRlRmllbGRFbmQoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybgorCQl9CisJfQorCWVyciA9IG9wcm90LldyaXRlRmllbGRCZWdpbigidHlwZSIsIEkzMiwgMikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCWVyciA9IG9wcm90LldyaXRlSTMyKHAudHlwZV8pCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKwllcnIgPSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCWVyciA9IG9wcm90LldyaXRlRmllbGRTdG9wKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCWVyciA9IG9wcm90LldyaXRlU3RydWN0RW5kKCkKKwlyZXR1cm4KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NDMzNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl90ZXN0LmdvCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHQgKnRlc3RpbmcuVCkgeworCWV4YyA6PSBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24oVU5LTk9XTl9BUFBMSUNBVElPTl9FWENFUFRJT04sICIiKQorCWlmIGV4Yy5FcnJvcigpICE9IGRlZmF1bHRBcHBsaWNhdGlvbkV4Y2VwdGlvbk1lc3NhZ2VbVU5LTk9XTl9BUFBMSUNBVElPTl9FWENFUFRJT05dIHsKKwkJdC5GYXRhbGYoIkV4cGVjdGVkIGVtcHR5IHN0cmluZyBmb3IgZXhjZXB0aW9uIGJ1dCBmb3VuZCAnJXMnIiwgZXhjLkVycm9yKCkpCisJfQorCWlmIGV4Yy5UeXBlSWQoKSAhPSBVTktOT1dOX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiB7CisJCXQuRmF0YWxmKCJFeHBlY3RlZCB0eXBlIFVOS05PV04gZm9yIGV4Y2VwdGlvbiBidXQgZm91bmQgJyV2JyIsIGV4Yy5UeXBlSWQoKSkKKwl9CisJZXhjID0gTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKFdST05HX01FVEhPRF9OQU1FLCAianVua19tZXRob2QiKQorCWlmIGV4Yy5FcnJvcigpICE9ICJqdW5rX21ldGhvZCIgeworCQl0LkZhdGFsZigiRXhwZWN0ZWQgJ2p1bmtfbWV0aG9kJyBmb3IgZXhjZXB0aW9uIGJ1dCBmb3VuZCAnJXMnIiwgZXhjLkVycm9yKCkpCisJfQorCWlmIGV4Yy5UeXBlSWQoKSAhPSBXUk9OR19NRVRIT0RfTkFNRSB7CisJCXQuRmF0YWxmKCJFeHBlY3RlZCB0eXBlIFdST05HX01FVEhPRF9OQU1FIGZvciBleGNlcHRpb24gYnV0IGZvdW5kICcldiciLCBleGMuVHlwZUlkKCkpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9iaW5hcnlfcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L2JpbmFyeV9wcm90b2NvbC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjkwYmY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9iaW5hcnlfcHJvdG9jb2wuZ28KQEAgLTAsMCArMSw1MDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiYnl0ZXMiCisJImNvbnRleHQiCisJImVuY29kaW5nL2JpbmFyeSIKKwkiZXJyb3JzIgorCSJmbXQiCisJImlvIgorCSJtYXRoIgorKQorCit0eXBlIFRCaW5hcnlQcm90b2NvbCBzdHJ1Y3QgeworCXRyYW5zICAgICAgICAgVFJpY2hUcmFuc3BvcnQKKwlvcmlnVHJhbnNwb3J0IFRUcmFuc3BvcnQKKwlyZWFkZXIgICAgICAgIGlvLlJlYWRlcgorCXdyaXRlciAgICAgICAgaW8uV3JpdGVyCisJc3RyaWN0UmVhZCAgICBib29sCisJc3RyaWN0V3JpdGUgICBib29sCisJYnVmZmVyICAgICAgICBbNjRdYnl0ZQorfQorCit0eXBlIFRCaW5hcnlQcm90b2NvbEZhY3Rvcnkgc3RydWN0IHsKKwlzdHJpY3RSZWFkICBib29sCisJc3RyaWN0V3JpdGUgYm9vbAorfQorCitmdW5jIE5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0IFRUcmFuc3BvcnQpICpUQmluYXJ5UHJvdG9jb2wgeworCXJldHVybiBOZXdUQmluYXJ5UHJvdG9jb2wodCwgZmFsc2UsIHRydWUpCit9CisKK2Z1bmMgTmV3VEJpbmFyeVByb3RvY29sKHQgVFRyYW5zcG9ydCwgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUgYm9vbCkgKlRCaW5hcnlQcm90b2NvbCB7CisJcCA6PSAmVEJpbmFyeVByb3RvY29se29yaWdUcmFuc3BvcnQ6IHQsIHN0cmljdFJlYWQ6IHN0cmljdFJlYWQsIHN0cmljdFdyaXRlOiBzdHJpY3RXcml0ZX0KKwlpZiBldCwgb2sgOj0gdC4oVFJpY2hUcmFuc3BvcnQpOyBvayB7CisJCXAudHJhbnMgPSBldAorCX0gZWxzZSB7CisJCXAudHJhbnMgPSBOZXdUUmljaFRyYW5zcG9ydCh0KQorCX0KKwlwLnJlYWRlciA9IHAudHJhbnMKKwlwLndyaXRlciA9IHAudHJhbnMKKwlyZXR1cm4gcAorfQorCitmdW5jIE5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkgKlRCaW5hcnlQcm90b2NvbEZhY3RvcnkgeworCXJldHVybiBOZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KGZhbHNlLCB0cnVlKQorfQorCitmdW5jIE5ld1RCaW5hcnlQcm90b2NvbEZhY3Rvcnkoc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUgYm9vbCkgKlRCaW5hcnlQcm90b2NvbEZhY3RvcnkgeworCXJldHVybiAmVEJpbmFyeVByb3RvY29sRmFjdG9yeXtzdHJpY3RSZWFkOiBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZTogc3RyaWN0V3JpdGV9Cit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbEZhY3RvcnkpIEdldFByb3RvY29sKHQgVFRyYW5zcG9ydCkgVFByb3RvY29sIHsKKwlyZXR1cm4gTmV3VEJpbmFyeVByb3RvY29sKHQsIHAuc3RyaWN0UmVhZCwgcC5zdHJpY3RXcml0ZSkKK30KKworLyoqCisgKiBXcml0aW5nIE1ldGhvZHMKKyAqLworCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlTWVzc2FnZUJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFJZCBpbnQzMikgZXJyb3IgeworCWlmIHAuc3RyaWN0V3JpdGUgeworCQl2ZXJzaW9uIDo9IHVpbnQzMihWRVJTSU9OXzEpIHwgdWludDMyKHR5cGVJZCkKKwkJZSA6PSBwLldyaXRlSTMyKGludDMyKHZlcnNpb24pKQorCQlpZiBlICE9IG5pbCB7CisJCQlyZXR1cm4gZQorCQl9CisJCWUgPSBwLldyaXRlU3RyaW5nKG5hbWUpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXJldHVybiBlCisJCX0KKwkJZSA9IHAuV3JpdGVJMzIoc2VxSWQpCisJCXJldHVybiBlCisJfSBlbHNlIHsKKwkJZSA6PSBwLldyaXRlU3RyaW5nKG5hbWUpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXJldHVybiBlCisJCX0KKwkJZSA9IHAuV3JpdGVCeXRlKGludDgodHlwZUlkKSkKKwkJaWYgZSAhPSBuaWwgeworCQkJcmV0dXJuIGUKKwkJfQorCQllID0gcC5Xcml0ZUkzMihzZXFJZCkKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlTWVzc2FnZUVuZCgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVTdHJ1Y3RCZWdpbihuYW1lIHN0cmluZykgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZVN0cnVjdEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVGaWVsZEJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2KSBlcnJvciB7CisJZSA6PSBwLldyaXRlQnl0ZShpbnQ4KHR5cGVJZCkpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwllID0gcC5Xcml0ZUkxNihpZCkKKwlyZXR1cm4gZQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlRmllbGRFbmQoKSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlRmllbGRTdG9wKCkgZXJyb3IgeworCWUgOj0gcC5Xcml0ZUJ5dGUoU1RPUCkKKwlyZXR1cm4gZQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlTWFwQmVnaW4oa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWUgOj0gcC5Xcml0ZUJ5dGUoaW50OChrZXlUeXBlKSkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWUgPSBwLldyaXRlQnl0ZShpbnQ4KHZhbHVlVHlwZSkpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwllID0gcC5Xcml0ZUkzMihpbnQzMihzaXplKSkKKwlyZXR1cm4gZQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlTWFwRW5kKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUxpc3RCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwllIDo9IHAuV3JpdGVCeXRlKGludDgoZWxlbVR5cGUpKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJZSA9IHAuV3JpdGVJMzIoaW50MzIoc2l6ZSkpCisJcmV0dXJuIGUKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUxpc3RFbmQoKSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlU2V0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJZSA6PSBwLldyaXRlQnl0ZShpbnQ4KGVsZW1UeXBlKSkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWUgPSBwLldyaXRlSTMyKGludDMyKHNpemUpKQorCXJldHVybiBlCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVTZXRFbmQoKSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlQm9vbCh2YWx1ZSBib29sKSBlcnJvciB7CisJaWYgdmFsdWUgeworCQlyZXR1cm4gcC5Xcml0ZUJ5dGUoMSkKKwl9CisJcmV0dXJuIHAuV3JpdGVCeXRlKDApCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVCeXRlKHZhbHVlIGludDgpIGVycm9yIHsKKwllIDo9IHAudHJhbnMuV3JpdGVCeXRlKGJ5dGUodmFsdWUpKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUkxNih2YWx1ZSBpbnQxNikgZXJyb3IgeworCXYgOj0gcC5idWZmZXJbMDoyXQorCWJpbmFyeS5CaWdFbmRpYW4uUHV0VWludDE2KHYsIHVpbnQxNih2YWx1ZSkpCisJXywgZSA6PSBwLndyaXRlci5Xcml0ZSh2KQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUkzMih2YWx1ZSBpbnQzMikgZXJyb3IgeworCXYgOj0gcC5idWZmZXJbMDo0XQorCWJpbmFyeS5CaWdFbmRpYW4uUHV0VWludDMyKHYsIHVpbnQzMih2YWx1ZSkpCisJXywgZSA6PSBwLndyaXRlci5Xcml0ZSh2KQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUk2NCh2YWx1ZSBpbnQ2NCkgZXJyb3IgeworCXYgOj0gcC5idWZmZXJbMDo4XQorCWJpbmFyeS5CaWdFbmRpYW4uUHV0VWludDY0KHYsIHVpbnQ2NCh2YWx1ZSkpCisJXywgZXJyIDo9IHAud3JpdGVyLldyaXRlKHYpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVEb3VibGUodmFsdWUgZmxvYXQ2NCkgZXJyb3IgeworCXJldHVybiBwLldyaXRlSTY0KGludDY0KG1hdGguRmxvYXQ2NGJpdHModmFsdWUpKSkKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZVN0cmluZyh2YWx1ZSBzdHJpbmcpIGVycm9yIHsKKwllIDo9IHAuV3JpdGVJMzIoaW50MzIobGVuKHZhbHVlKSkpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlfLCBlcnIgOj0gcC50cmFucy5Xcml0ZVN0cmluZyh2YWx1ZSkKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUJpbmFyeSh2YWx1ZSBbXWJ5dGUpIGVycm9yIHsKKwllIDo9IHAuV3JpdGVJMzIoaW50MzIobGVuKHZhbHVlKSkpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlfLCBlcnIgOj0gcC53cml0ZXIuV3JpdGUodmFsdWUpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKKy8qKgorICogUmVhZGluZyBtZXRob2RzCisgKi8KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkTWVzc2FnZUJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFJZCBpbnQzMiwgZXJyIGVycm9yKSB7CisJc2l6ZSwgZSA6PSBwLlJlYWRJMzIoKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuICIiLCB0eXBlSWQsIDAsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlpZiBzaXplIDwgMCB7CisJCXR5cGVJZCA9IFRNZXNzYWdlVHlwZShzaXplICYgMHgwZmYpCisJCXZlcnNpb24gOj0gaW50NjQoaW50NjQoc2l6ZSkgJiBWRVJTSU9OX01BU0spCisJCWlmIHZlcnNpb24gIT0gVkVSU0lPTl8xIHsKKwkJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShCQURfVkVSU0lPTiwgZm10LkVycm9yZigiQmFkIHZlcnNpb24gaW4gUmVhZE1lc3NhZ2VCZWdpbiIpKQorCQl9CisJCW5hbWUsIGUgPSBwLlJlYWRTdHJpbmcoKQorCQlpZiBlICE9IG5pbCB7CisJCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCX0KKwkJc2VxSWQsIGUgPSBwLlJlYWRJMzIoKQorCQlpZiBlICE9IG5pbCB7CisJCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCX0KKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIG5pbAorCX0KKwlpZiBwLnN0cmljdFJlYWQgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoQkFEX1ZFUlNJT04sIGZtdC5FcnJvcmYoIk1pc3NpbmcgdmVyc2lvbiBpbiBSZWFkTWVzc2FnZUJlZ2luIikpCisJfQorCW5hbWUsIGUyIDo9IHAucmVhZFN0cmluZ0JvZHkoc2l6ZSkKKwlpZiBlMiAhPSBuaWwgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZTIKKwl9CisJYiwgZTMgOj0gcC5SZWFkQnl0ZSgpCisJaWYgZTMgIT0gbmlsIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGUzCisJfQorCXR5cGVJZCA9IFRNZXNzYWdlVHlwZShiKQorCXNlcUlkLCBlNCA6PSBwLlJlYWRJMzIoKQorCWlmIGU0ICE9IG5pbCB7CisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlNAorCX0KKwlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZE1lc3NhZ2VFbmQoKSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRTdHJ1Y3RCZWdpbigpIChuYW1lIHN0cmluZywgZXJyIGVycm9yKSB7CisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZFN0cnVjdEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZEZpZWxkQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUVHlwZSwgc2VxSWQgaW50MTYsIGVyciBlcnJvcikgeworCXQsIGVyciA6PSBwLlJlYWRCeXRlKCkKKwl0eXBlSWQgPSBUVHlwZSh0KQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCisJfQorCWlmIHQgIT0gU1RPUCB7CisJCXNlcUlkLCBlcnIgPSBwLlJlYWRJMTYoKQorCX0KKwlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZEZpZWxkRW5kKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKwordmFyIGludmFsaWREYXRhTGVuZ3RoID0gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlcnJvcnMuTmV3KCJJbnZhbGlkIGRhdGEgbGVuZ3RoIikpCisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZE1hcEJlZ2luKCkgKGtUeXBlLCB2VHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikgeworCWssIGUgOj0gcC5SZWFkQnl0ZSgpCisJaWYgZSAhPSBuaWwgeworCQllcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJcmV0dXJuCisJfQorCWtUeXBlID0gVFR5cGUoaykKKwl2LCBlIDo9IHAuUmVhZEJ5dGUoKQorCWlmIGUgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCXJldHVybgorCX0KKwl2VHlwZSA9IFRUeXBlKHYpCisJc2l6ZTMyLCBlIDo9IHAuUmVhZEkzMigpCisJaWYgZSAhPSBuaWwgeworCQllcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJcmV0dXJuCisJfQorCWlmIHNpemUzMiA8IDAgeworCQllcnIgPSBpbnZhbGlkRGF0YUxlbmd0aAorCQlyZXR1cm4KKwl9CisJc2l6ZSA9IGludChzaXplMzIpCisJcmV0dXJuIGtUeXBlLCB2VHlwZSwgc2l6ZSwgbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZE1hcEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZExpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikgeworCWIsIGUgOj0gcC5SZWFkQnl0ZSgpCisJaWYgZSAhPSBuaWwgeworCQllcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJcmV0dXJuCisJfQorCWVsZW1UeXBlID0gVFR5cGUoYikKKwlzaXplMzIsIGUgOj0gcC5SZWFkSTMyKCkKKwlpZiBlICE9IG5pbCB7CisJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQlyZXR1cm4KKwl9CisJaWYgc2l6ZTMyIDwgMCB7CisJCWVyciA9IGludmFsaWREYXRhTGVuZ3RoCisJCXJldHVybgorCX0KKwlzaXplID0gaW50KHNpemUzMikKKworCXJldHVybgorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRMaXN0RW5kKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkU2V0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlcnIgZXJyb3IpIHsKKwliLCBlIDo9IHAuUmVhZEJ5dGUoKQorCWlmIGUgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCXJldHVybgorCX0KKwllbGVtVHlwZSA9IFRUeXBlKGIpCisJc2l6ZTMyLCBlIDo9IHAuUmVhZEkzMigpCisJaWYgZSAhPSBuaWwgeworCQllcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJcmV0dXJuCisJfQorCWlmIHNpemUzMiA8IDAgeworCQllcnIgPSBpbnZhbGlkRGF0YUxlbmd0aAorCQlyZXR1cm4KKwl9CisJc2l6ZSA9IGludChzaXplMzIpCisJcmV0dXJuIGVsZW1UeXBlLCBzaXplLCBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkU2V0RW5kKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkQm9vbCgpIChib29sLCBlcnJvcikgeworCWIsIGUgOj0gcC5SZWFkQnl0ZSgpCisJdiA6PSB0cnVlCisJaWYgYiAhPSAxIHsKKwkJdiA9IGZhbHNlCisJfQorCXJldHVybiB2LCBlCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZEJ5dGUoKSAoaW50OCwgZXJyb3IpIHsKKwl2LCBlcnIgOj0gcC50cmFucy5SZWFkQnl0ZSgpCisJcmV0dXJuIGludDgodiksIGVycgorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRJMTYoKSAodmFsdWUgaW50MTYsIGVyciBlcnJvcikgeworCWJ1ZiA6PSBwLmJ1ZmZlclswOjJdCisJZXJyID0gcC5yZWFkQWxsKGJ1ZikKKwl2YWx1ZSA9IGludDE2KGJpbmFyeS5CaWdFbmRpYW4uVWludDE2KGJ1ZikpCisJcmV0dXJuIHZhbHVlLCBlcnIKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkSTMyKCkgKHZhbHVlIGludDMyLCBlcnIgZXJyb3IpIHsKKwlidWYgOj0gcC5idWZmZXJbMDo0XQorCWVyciA9IHAucmVhZEFsbChidWYpCisJdmFsdWUgPSBpbnQzMihiaW5hcnkuQmlnRW5kaWFuLlVpbnQzMihidWYpKQorCXJldHVybiB2YWx1ZSwgZXJyCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZEk2NCgpICh2YWx1ZSBpbnQ2NCwgZXJyIGVycm9yKSB7CisJYnVmIDo9IHAuYnVmZmVyWzA6OF0KKwllcnIgPSBwLnJlYWRBbGwoYnVmKQorCXZhbHVlID0gaW50NjQoYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoYnVmKSkKKwlyZXR1cm4gdmFsdWUsIGVycgorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWREb3VibGUoKSAodmFsdWUgZmxvYXQ2NCwgZXJyIGVycm9yKSB7CisJYnVmIDo9IHAuYnVmZmVyWzA6OF0KKwllcnIgPSBwLnJlYWRBbGwoYnVmKQorCXZhbHVlID0gbWF0aC5GbG9hdDY0ZnJvbWJpdHMoYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoYnVmKSkKKwlyZXR1cm4gdmFsdWUsIGVycgorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRTdHJpbmcoKSAodmFsdWUgc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlzaXplLCBlIDo9IHAuUmVhZEkzMigpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gIiIsIGUKKwl9CisJaWYgc2l6ZSA8IDAgeworCQllcnIgPSBpbnZhbGlkRGF0YUxlbmd0aAorCQlyZXR1cm4KKwl9CisKKwlyZXR1cm4gcC5yZWFkU3RyaW5nQm9keShzaXplKQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRCaW5hcnkoKSAoW11ieXRlLCBlcnJvcikgeworCXNpemUsIGUgOj0gcC5SZWFkSTMyKCkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGUKKwl9CisJaWYgc2l6ZSA8IDAgeworCQlyZXR1cm4gbmlsLCBpbnZhbGlkRGF0YUxlbmd0aAorCX0KKworCWlzaXplIDo9IGludChzaXplKQorCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgaXNpemUpCisJXywgZXJyIDo9IGlvLlJlYWRGdWxsKHAudHJhbnMsIGJ1ZikKKwlyZXR1cm4gYnVmLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKHAudHJhbnMuRmx1c2goY3R4KSkKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBTa2lwKGZpZWxkVHlwZSBUVHlwZSkgKGVyciBlcnJvcikgeworCXJldHVybiBTa2lwRGVmYXVsdERlcHRoKHAsIGZpZWxkVHlwZSkKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBUcmFuc3BvcnQoKSBUVHJhbnNwb3J0IHsKKwlyZXR1cm4gcC5vcmlnVHJhbnNwb3J0Cit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgcmVhZEFsbChidWYgW11ieXRlKSBlcnJvciB7CisJXywgZXJyIDo9IGlvLlJlYWRGdWxsKHAucmVhZGVyLCBidWYpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKK2NvbnN0IHJlYWRMaW1pdCA9IDMyNzY4CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgcmVhZFN0cmluZ0JvZHkoc2l6ZSBpbnQzMikgKHZhbHVlIHN0cmluZywgZXJyIGVycm9yKSB7CisJaWYgc2l6ZSA8IDAgeworCQlyZXR1cm4gIiIsIG5pbAorCX0KKworCXZhciAoCisJCWJ1ZiBieXRlcy5CdWZmZXIKKwkJZSAgIGVycm9yCisJCWIgICBbXWJ5dGUKKwkpCisKKwlzd2l0Y2ggeworCWNhc2UgaW50KHNpemUpIDw9IGxlbihwLmJ1ZmZlcik6CisJCWIgPSBwLmJ1ZmZlcls6c2l6ZV0gLy8gYXZvaWRzIGFsbG9jYXRpb24gZm9yIHNtYWxsIHJlYWRzCisJY2FzZSBpbnQoc2l6ZSkgPCByZWFkTGltaXQ6CisJCWIgPSBtYWtlKFtdYnl0ZSwgc2l6ZSkKKwlkZWZhdWx0OgorCQliID0gbWFrZShbXWJ5dGUsIHJlYWRMaW1pdCkKKwl9CisKKwlmb3Igc2l6ZSA+IDAgeworCQlfLCBlID0gaW8uUmVhZEZ1bGwocC50cmFucywgYikKKwkJYnVmLldyaXRlKGIpCisJCWlmIGUgIT0gbmlsIHsKKwkJCWJyZWFrCisJCX0KKwkJc2l6ZSAtPSByZWFkTGltaXQKKwkJaWYgc2l6ZSA8IHJlYWRMaW1pdCAmJiBzaXplID4gMCB7CisJCQliID0gYls6c2l6ZV0KKwkJfQorCX0KKwlyZXR1cm4gYnVmLlN0cmluZygpLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvYmluYXJ5X3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L2JpbmFyeV9wcm90b2NvbF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NjJjYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2JpbmFyeV9wcm90b2NvbF90ZXN0LmdvCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0UmVhZFdyaXRlQmluYXJ5UHJvdG9jb2wodCAqdGVzdGluZy5UKSB7CisJUmVhZFdyaXRlUHJvdG9jb2xUZXN0KHQsIE5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NzAyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydC5nbwpAQCAtMCwwICsxLDkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImJ1ZmlvIgorCSJjb250ZXh0IgorKQorCit0eXBlIFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnkgc3RydWN0IHsKKwlzaXplIGludAorfQorCit0eXBlIFRCdWZmZXJlZFRyYW5zcG9ydCBzdHJ1Y3QgeworCWJ1ZmlvLlJlYWRXcml0ZXIKKwl0cCBUVHJhbnNwb3J0Cit9CisKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zLCBwLnNpemUpLCBuaWwKK30KKworZnVuYyBOZXdUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KGJ1ZmZlclNpemUgaW50KSAqVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuICZUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5e3NpemU6IGJ1ZmZlclNpemV9Cit9CisKK2Z1bmMgTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQsIGJ1ZmZlclNpemUgaW50KSAqVEJ1ZmZlcmVkVHJhbnNwb3J0IHsKKwlyZXR1cm4gJlRCdWZmZXJlZFRyYW5zcG9ydHsKKwkJUmVhZFdyaXRlcjogYnVmaW8uUmVhZFdyaXRlcnsKKwkJCVJlYWRlcjogYnVmaW8uTmV3UmVhZGVyU2l6ZSh0cmFucywgYnVmZmVyU2l6ZSksCisJCQlXcml0ZXI6IGJ1ZmlvLk5ld1dyaXRlclNpemUodHJhbnMsIGJ1ZmZlclNpemUpLAorCQl9LAorCQl0cDogdHJhbnMsCisJfQorfQorCitmdW5jIChwICpUQnVmZmVyZWRUcmFuc3BvcnQpIElzT3BlbigpIGJvb2wgeworCXJldHVybiBwLnRwLklzT3BlbigpCit9CisKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydCkgT3BlbigpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gcC50cC5PcGVuKCkKK30KKworZnVuYyAocCAqVEJ1ZmZlcmVkVHJhbnNwb3J0KSBDbG9zZSgpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gcC50cC5DbG9zZSgpCit9CisKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydCkgUmVhZChiIFtdYnl0ZSkgKGludCwgZXJyb3IpIHsKKwluLCBlcnIgOj0gcC5SZWFkV3JpdGVyLlJlYWQoYikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcC5SZWFkV3JpdGVyLlJlYWRlci5SZXNldChwLnRwKQorCX0KKwlyZXR1cm4gbiwgZXJyCit9CisKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydCkgV3JpdGUoYiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJbiwgZXJyIDo9IHAuUmVhZFdyaXRlci5Xcml0ZShiKQorCWlmIGVyciAhPSBuaWwgeworCQlwLlJlYWRXcml0ZXIuV3JpdGVyLlJlc2V0KHAudHApCisJfQorCXJldHVybiBuLCBlcnIKK30KKworZnVuYyAocCAqVEJ1ZmZlcmVkVHJhbnNwb3J0KSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CisJaWYgZXJyIDo9IHAuUmVhZFdyaXRlci5GbHVzaCgpOyBlcnIgIT0gbmlsIHsKKwkJcC5SZWFkV3JpdGVyLldyaXRlci5SZXNldChwLnRwKQorCQlyZXR1cm4gZXJyCisJfQorCXJldHVybiBwLnRwLkZsdXNoKGN0eCkKK30KKworZnVuYyAocCAqVEJ1ZmZlcmVkVHJhbnNwb3J0KSBSZW1haW5pbmdCeXRlcygpIChudW1fYnl0ZXMgdWludDY0KSB7CisJcmV0dXJuIHAudHAuUmVtYWluaW5nQnl0ZXMoKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlYzBjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0X3Rlc3QuZ28KQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RCdWZmZXJlZFRyYW5zcG9ydCh0ICp0ZXN0aW5nLlQpIHsKKwl0cmFucyA6PSBOZXdUQnVmZmVyZWRUcmFuc3BvcnQoTmV3VE1lbW9yeUJ1ZmZlcigpLCAxMDI0MCkKKwlUcmFuc3BvcnRUZXN0KHQsIHRyYW5zLCB0cmFucykKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvY2xpZW50LmdvIGIvbGliL2dvL3RocmlmdC9jbGllbnQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg3OTFjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvY2xpZW50LmdvCkBAIC0wLDAgKzEsODUgQEAKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImZtdCIKKykKKwordHlwZSBUQ2xpZW50IGludGVyZmFjZSB7CisJQ2FsbChjdHggY29udGV4dC5Db250ZXh0LCBtZXRob2Qgc3RyaW5nLCBhcmdzLCByZXN1bHQgVFN0cnVjdCkgZXJyb3IKK30KKwordHlwZSBUU3RhbmRhcmRDbGllbnQgc3RydWN0IHsKKwlzZXFJZCAgICAgICAgaW50MzIKKwlpcHJvdCwgb3Byb3QgVFByb3RvY29sCit9CisKKy8vIFRTdGFuZGFyZENsaWVudCBpbXBsZW1lbnRzIFRDbGllbnQsIGFuZCB1c2VzIHRoZSBzdGFuZGFyZCBtZXNzYWdlIGZvcm1hdCBmb3IgVGhyaWZ0LgorLy8gSXQgaXMgbm90IHNhZmUgZm9yIGNvbmN1cnJlbnQgdXNlLgorZnVuYyBOZXdUU3RhbmRhcmRDbGllbnQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wgVFByb3RvY29sKSAqVFN0YW5kYXJkQ2xpZW50IHsKKwlyZXR1cm4gJlRTdGFuZGFyZENsaWVudHsKKwkJaXByb3Q6IGlucHV0UHJvdG9jb2wsCisJCW9wcm90OiBvdXRwdXRQcm90b2NvbCwKKwl9Cit9CisKK2Z1bmMgKHAgKlRTdGFuZGFyZENsaWVudCkgU2VuZChjdHggY29udGV4dC5Db250ZXh0LCBvcHJvdCBUUHJvdG9jb2wsIHNlcUlkIGludDMyLCBtZXRob2Qgc3RyaW5nLCBhcmdzIFRTdHJ1Y3QpIGVycm9yIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obWV0aG9kLCBDQUxMLCBzZXFJZCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBhcmdzLldyaXRlKG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlyZXR1cm4gb3Byb3QuRmx1c2goY3R4KQorfQorCitmdW5jIChwICpUU3RhbmRhcmRDbGllbnQpIFJlY3YoaXByb3QgVFByb3RvY29sLCBzZXFJZCBpbnQzMiwgbWV0aG9kIHN0cmluZywgcmVzdWx0IFRTdHJ1Y3QpIGVycm9yIHsKKwlyTWV0aG9kLCByVHlwZUlkLCByU2VxSWQsIGVyciA6PSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKworCWlmIG1ldGhvZCAhPSByTWV0aG9kIHsKKwkJcmV0dXJuIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbihXUk9OR19NRVRIT0RfTkFNRSwgZm10LlNwcmludGYoIiVzOiB3cm9uZyBtZXRob2QgbmFtZSIsIG1ldGhvZCkpCisJfSBlbHNlIGlmIHNlcUlkICE9IHJTZXFJZCB7CisJCXJldHVybiBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24oQkFEX1NFUVVFTkNFX0lELCBmbXQuU3ByaW50ZigiJXM6IG91dCBvZiBvcmRlciBzZXF1ZW5jZSByZXNwb25zZSIsIG1ldGhvZCkpCisJfSBlbHNlIGlmIHJUeXBlSWQgPT0gRVhDRVBUSU9OIHsKKwkJdmFyIGV4Y2VwdGlvbiB0QXBwbGljYXRpb25FeGNlcHRpb24KKwkJaWYgZXJyIDo9IGV4Y2VwdGlvbi5SZWFkKGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKworCQlpZiBlcnIgOj0gaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKworCQlyZXR1cm4gJmV4Y2VwdGlvbgorCX0gZWxzZSBpZiByVHlwZUlkICE9IFJFUExZIHsKKwkJcmV0dXJuIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbihJTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT04sIGZtdC5TcHJpbnRmKCIlczogaW52YWxpZCBtZXNzYWdlIHR5cGUiLCBtZXRob2QpKQorCX0KKworCWlmIGVyciA6PSByZXN1bHQuUmVhZChpcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCisJcmV0dXJuIGlwcm90LlJlYWRNZXNzYWdlRW5kKCkKK30KKworZnVuYyAocCAqVFN0YW5kYXJkQ2xpZW50KSBDYWxsKGN0eCBjb250ZXh0LkNvbnRleHQsIG1ldGhvZCBzdHJpbmcsIGFyZ3MsIHJlc3VsdCBUU3RydWN0KSBlcnJvciB7CisJcC5zZXFJZCsrCisJc2VxSWQgOj0gcC5zZXFJZAorCisJaWYgZXJyIDo9IHAuU2VuZChjdHgsIHAub3Byb3QsIHNlcUlkLCBtZXRob2QsIGFyZ3MpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKworCS8vIG1ldGhvZCBpcyBvbmV3YXkKKwlpZiByZXN1bHQgPT0gbmlsIHsKKwkJcmV0dXJuIG5pbAorCX0KKworCXJldHVybiBwLlJlY3YocC5pcHJvdCwgc2VxSWQsIG1ldGhvZCwgcmVzdWx0KQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9jb21tb25fdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvY29tbW9uX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1OTdmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvY29tbW9uX3Rlc3QuZ28KQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgImNvbnRleHQiCisKK3R5cGUgbW9ja1Byb2Nlc3NvciBzdHJ1Y3QgeworCVByb2Nlc3NGdW5jIGZ1bmMoaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKQorfQorCitmdW5jIChtICptb2NrUHJvY2Vzc29yKSBQcm9jZXNzKGN0eCBjb250ZXh0LkNvbnRleHQsIGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikgeworCXJldHVybiBtLlByb2Nlc3NGdW5jKGluLCBvdXQpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2wuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwMGQ1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvY29tcGFjdF9wcm90b2NvbC5nbwpAQCAtMCwwICsxLDgxMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlbmNvZGluZy9iaW5hcnkiCisJImZtdCIKKwkiaW8iCisJIm1hdGgiCispCisKK2NvbnN0ICgKKwlDT01QQUNUX1BST1RPQ09MX0lEICAgICAgID0gMHgwODIKKwlDT01QQUNUX1ZFUlNJT04gICAgICAgICAgID0gMQorCUNPTVBBQ1RfVkVSU0lPTl9NQVNLICAgICAgPSAweDFmCisJQ09NUEFDVF9UWVBFX01BU0sgICAgICAgICA9IDB4MEUwCisJQ09NUEFDVF9UWVBFX0JJVFMgICAgICAgICA9IDB4MDcKKwlDT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5UID0gNQorKQorCit0eXBlIHRDb21wYWN0VHlwZSBieXRlCisKK2NvbnN0ICgKKwlDT01QQUNUX0JPT0xFQU5fVFJVRSAgPSAweDAxCisJQ09NUEFDVF9CT09MRUFOX0ZBTFNFID0gMHgwMgorCUNPTVBBQ1RfQllURSAgICAgICAgICA9IDB4MDMKKwlDT01QQUNUX0kxNiAgICAgICAgICAgPSAweDA0CisJQ09NUEFDVF9JMzIgICAgICAgICAgID0gMHgwNQorCUNPTVBBQ1RfSTY0ICAgICAgICAgICA9IDB4MDYKKwlDT01QQUNUX0RPVUJMRSAgICAgICAgPSAweDA3CisJQ09NUEFDVF9CSU5BUlkgICAgICAgID0gMHgwOAorCUNPTVBBQ1RfTElTVCAgICAgICAgICA9IDB4MDkKKwlDT01QQUNUX1NFVCAgICAgICAgICAgPSAweDBBCisJQ09NUEFDVF9NQVAgICAgICAgICAgID0gMHgwQgorCUNPTVBBQ1RfU1RSVUNUICAgICAgICA9IDB4MEMKKykKKwordmFyICgKKwl0dHlwZVRvQ29tcGFjdFR5cGUgbWFwW1RUeXBlXXRDb21wYWN0VHlwZQorKQorCitmdW5jIGluaXQoKSB7CisJdHR5cGVUb0NvbXBhY3RUeXBlID0gbWFwW1RUeXBlXXRDb21wYWN0VHlwZXsKKwkJU1RPUDogICBTVE9QLAorCQlCT09MOiAgIENPTVBBQ1RfQk9PTEVBTl9UUlVFLAorCQlCWVRFOiAgIENPTVBBQ1RfQllURSwKKwkJSTE2OiAgICBDT01QQUNUX0kxNiwKKwkJSTMyOiAgICBDT01QQUNUX0kzMiwKKwkJSTY0OiAgICBDT01QQUNUX0k2NCwKKwkJRE9VQkxFOiBDT01QQUNUX0RPVUJMRSwKKwkJU1RSSU5HOiBDT01QQUNUX0JJTkFSWSwKKwkJTElTVDogICBDT01QQUNUX0xJU1QsCisJCVNFVDogICAgQ09NUEFDVF9TRVQsCisJCU1BUDogICAgQ09NUEFDVF9NQVAsCisJCVNUUlVDVDogQ09NUEFDVF9TVFJVQ1QsCisJfQorfQorCit0eXBlIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5IHN0cnVjdHt9CisKK2Z1bmMgTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSAqVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgeworCXJldHVybiAmVENvbXBhY3RQcm90b2NvbEZhY3Rvcnl7fQorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sRmFjdG9yeSkgR2V0UHJvdG9jb2wodHJhbnMgVFRyYW5zcG9ydCkgVFByb3RvY29sIHsKKwlyZXR1cm4gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKK30KKwordHlwZSBUQ29tcGFjdFByb3RvY29sIHN0cnVjdCB7CisJdHJhbnMgICAgICAgICBUUmljaFRyYW5zcG9ydAorCW9yaWdUcmFuc3BvcnQgVFRyYW5zcG9ydAorCisJLy8gVXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IGZpZWxkIGZvciB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgc3RydWN0cywKKwkvLyBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgorCWxhc3RGaWVsZCAgIFtdaW50CisJbGFzdEZpZWxkSWQgaW50CisKKwkvLyBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZSBzbyBpdCBjYW4KKwkvLyBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCisJYm9vbGVhbkZpZWxkTmFtZSAgICBzdHJpbmcKKwlib29sZWFuRmllbGRJZCAgICAgIGludDE2CisJYm9vbGVhbkZpZWxkUGVuZGluZyBib29sCisKKwkvLyBJZiB3ZSByZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4KKwkvLyB2YWx1ZSBoZXJlIHNvIHRoYXQgcmVhZEJvb2wgY2FuIHVzZSBpdC4KKwlib29sVmFsdWUgICAgICAgICAgYm9vbAorCWJvb2xWYWx1ZUlzTm90TnVsbCBib29sCisJYnVmZmVyICAgICAgICAgICAgIFs2NF1ieXRlCit9CisKKy8vIENyZWF0ZSBhIFRDb21wYWN0UHJvdG9jb2wgZ2l2ZW4gYSBUVHJhbnNwb3J0CitmdW5jIE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMgVFRyYW5zcG9ydCkgKlRDb21wYWN0UHJvdG9jb2wgeworCXAgOj0gJlRDb21wYWN0UHJvdG9jb2x7b3JpZ1RyYW5zcG9ydDogdHJhbnMsIGxhc3RGaWVsZDogW11pbnR7fX0KKwlpZiBldCwgb2sgOj0gdHJhbnMuKFRSaWNoVHJhbnNwb3J0KTsgb2sgeworCQlwLnRyYW5zID0gZXQKKwl9IGVsc2UgeworCQlwLnRyYW5zID0gTmV3VFJpY2hUcmFuc3BvcnQodHJhbnMpCisJfQorCisJcmV0dXJuIHAKKworfQorCisvLworLy8gUHVibGljIFdyaXRpbmcgbWV0aG9kcy4KKy8vCisKKy8vIFdyaXRlIGEgbWVzc2FnZSBoZWFkZXIgdG8gdGhlIHdpcmUuIENvbXBhY3QgUHJvdG9jb2wgbWVzc2FnZXMgY29udGFpbiB0aGUKKy8vIHByb3RvY29sIHZlcnNpb24gc28gd2UgY2FuIG1pZ3JhdGUgZm9yd2FyZHMgaW4gdGhlIGZ1dHVyZSBpZiBuZWVkIGJlLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVNZXNzYWdlQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcWlkIGludDMyKSBlcnJvciB7CisJZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KENPTVBBQ1RfUFJPVE9DT0xfSUQpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwllcnIgPSBwLndyaXRlQnl0ZURpcmVjdCgoQ09NUEFDVF9WRVJTSU9OICYgQ09NUEFDVF9WRVJTSU9OX01BU0spIHwgKChieXRlKHR5cGVJZCkgPDwgQ09NUEFDVF9UWVBFX1NISUZUX0FNT1VOVCkgJiBDT01QQUNUX1RZUEVfTUFTSykpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwlfLCBlcnIgPSBwLndyaXRlVmFyaW50MzIoc2VxaWQpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwllIDo9IHAuV3JpdGVTdHJpbmcobmFtZSkKKwlyZXR1cm4gZQorCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlTWVzc2FnZUVuZCgpIGVycm9yIHsgcmV0dXJuIG5pbCB9CisKKy8vIFdyaXRlIGEgc3RydWN0IGJlZ2luLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZQorLy8gdXNlIGl0IGFzIGFuIG9wcG9ydHVuaXR5IHRvIHB1dCBzcGVjaWFsIHBsYWNlaG9sZGVyIG1hcmtlcnMgb24gdGhlIGZpZWxkCisvLyBzdGFjayBzbyB3ZSBjYW4gZ2V0IHRoZSBmaWVsZCBpZCBkZWx0YXMgY29ycmVjdC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlU3RydWN0QmVnaW4obmFtZSBzdHJpbmcpIGVycm9yIHsKKwlwLmxhc3RGaWVsZCA9IGFwcGVuZChwLmxhc3RGaWVsZCwgcC5sYXN0RmllbGRJZCkKKwlwLmxhc3RGaWVsZElkID0gMAorCXJldHVybiBuaWwKK30KKworLy8gV3JpdGUgYSBzdHJ1Y3QgZW5kLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZSB1c2UKKy8vIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcG9wIHRoZSBsYXN0IGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgc3RydWN0IG9mZgorLy8gb2YgdGhlIGZpZWxkIHN0YWNrLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVTdHJ1Y3RFbmQoKSBlcnJvciB7CisJcC5sYXN0RmllbGRJZCA9IHAubGFzdEZpZWxkW2xlbihwLmxhc3RGaWVsZCktMV0KKwlwLmxhc3RGaWVsZCA9IHAubGFzdEZpZWxkWzpsZW4ocC5sYXN0RmllbGQpLTFdCisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUZpZWxkQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUVHlwZSwgaWQgaW50MTYpIGVycm9yIHsKKwlpZiB0eXBlSWQgPT0gQk9PTCB7CisJCS8vIHdlIHdhbnQgdG8gcG9zc2libHkgaW5jbHVkZSB0aGUgdmFsdWUsIHNvIHdlJ2xsIHdhaXQuCisJCXAuYm9vbGVhbkZpZWxkTmFtZSwgcC5ib29sZWFuRmllbGRJZCwgcC5ib29sZWFuRmllbGRQZW5kaW5nID0gbmFtZSwgaWQsIHRydWUKKwkJcmV0dXJuIG5pbAorCX0KKwlfLCBlcnIgOj0gcC53cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lLCB0eXBlSWQsIGlkLCAweEZGKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCisvLyBUaGUgd29ya2hvcnNlIG9mIHdyaXRlRmllbGRCZWdpbi4gSXQgaGFzIHRoZSBvcHRpb24gb2YgZG9pbmcgYQorLy8gJ3R5cGUgb3ZlcnJpZGUnIG9mIHRoZSB0eXBlIGhlYWRlci4gVGhpcyBpcyB1c2VkIHNwZWNpZmljYWxseSBpbiB0aGUKKy8vIGJvb2xlYW4gZmllbGQgY2FzZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHdyaXRlRmllbGRCZWdpbkludGVybmFsKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2LCB0eXBlT3ZlcnJpZGUgYnl0ZSkgKGludCwgZXJyb3IpIHsKKwkvLyBzaG9ydCBsYXN0RmllbGQgPSBsYXN0RmllbGRfLnBvcCgpOworCisJLy8gaWYgdGhlcmUncyBhIHR5cGUgb3ZlcnJpZGUsIHVzZSB0aGF0LgorCXZhciB0eXBlVG9Xcml0ZSBieXRlCisJaWYgdHlwZU92ZXJyaWRlID09IDB4RkYgeworCQl0eXBlVG9Xcml0ZSA9IGJ5dGUocC5nZXRDb21wYWN0VHlwZSh0eXBlSWQpKQorCX0gZWxzZSB7CisJCXR5cGVUb1dyaXRlID0gdHlwZU92ZXJyaWRlCisJfQorCS8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAorCWZpZWxkSWQgOj0gaW50KGlkKQorCXdyaXR0ZW4gOj0gMAorCWlmIGZpZWxkSWQgPiBwLmxhc3RGaWVsZElkICYmIGZpZWxkSWQtcC5sYXN0RmllbGRJZCA8PSAxNSB7CisJCS8vIHdyaXRlIHRoZW0gdG9nZXRoZXIKKwkJZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KGJ5dGUoKGZpZWxkSWQtcC5sYXN0RmllbGRJZCk8PDQpIHwgdHlwZVRvV3JpdGUpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIDAsIGVycgorCQl9CisJfSBlbHNlIHsKKwkJLy8gd3JpdGUgdGhlbSBzZXBhcmF0ZQorCQllcnIgOj0gcC53cml0ZUJ5dGVEaXJlY3QodHlwZVRvV3JpdGUpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIDAsIGVycgorCQl9CisJCWVyciA9IHAuV3JpdGVJMTYoaWQpCisJCXdyaXR0ZW4gPSAxICsgMgorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiAwLCBlcnIKKwkJfQorCX0KKworCXAubGFzdEZpZWxkSWQgPSBmaWVsZElkCisJLy8gcC5sYXN0RmllbGQuUHVzaChmaWVsZC5pZCk7CisJcmV0dXJuIHdyaXR0ZW4sIG5pbAorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUZpZWxkRW5kKCkgZXJyb3IgeyByZXR1cm4gbmlsIH0KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVGaWVsZFN0b3AoKSBlcnJvciB7CisJZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KFNUT1ApCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlTWFwQmVnaW4oa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWlmIHNpemUgPT0gMCB7CisJCWVyciA6PSBwLndyaXRlQnl0ZURpcmVjdCgwKQorCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwl9CisJXywgZXJyIDo9IHAud3JpdGVWYXJpbnQzMihpbnQzMihzaXplKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJfQorCWVyciA9IHAud3JpdGVCeXRlRGlyZWN0KGJ5dGUocC5nZXRDb21wYWN0VHlwZShrZXlUeXBlKSk8PDQgfCBieXRlKHAuZ2V0Q29tcGFjdFR5cGUodmFsdWVUeXBlKSkpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlTWFwRW5kKCkgZXJyb3IgeyByZXR1cm4gbmlsIH0KKworLy8gV3JpdGUgYSBsaXN0IGhlYWRlci4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCV8sIGVyciA6PSBwLndyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1UeXBlLCBzaXplKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUxpc3RFbmQoKSBlcnJvciB7IHJldHVybiBuaWwgfQorCisvLyBXcml0ZSBhIHNldCBoZWFkZXIuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZVNldEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCV8sIGVyciA6PSBwLndyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1UeXBlLCBzaXplKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZVNldEVuZCgpIGVycm9yIHsgcmV0dXJuIG5pbCB9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlQm9vbCh2YWx1ZSBib29sKSBlcnJvciB7CisJdiA6PSBieXRlKENPTVBBQ1RfQk9PTEVBTl9GQUxTRSkKKwlpZiB2YWx1ZSB7CisJCXYgPSBieXRlKENPTVBBQ1RfQk9PTEVBTl9UUlVFKQorCX0KKwlpZiBwLmJvb2xlYW5GaWVsZFBlbmRpbmcgeworCQkvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKKwkJXywgZXJyIDo9IHAud3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwocC5ib29sZWFuRmllbGROYW1lLCBCT09MLCBwLmJvb2xlYW5GaWVsZElkLCB2KQorCQlwLmJvb2xlYW5GaWVsZFBlbmRpbmcgPSBmYWxzZQorCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwl9CisJLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCB3cml0ZSB0aGUgdmFsdWUuCisJZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KHYpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKKy8vIFdyaXRlIGEgYnl0ZS4gTm90aGluZyB0byBzZWUgaGVyZSEKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlQnl0ZSh2YWx1ZSBpbnQ4KSBlcnJvciB7CisJZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KGJ5dGUodmFsdWUpKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCisvLyBXcml0ZSBhbiBJMTYgYXMgYSB6aWd6YWcgdmFyaW50LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVJMTYodmFsdWUgaW50MTYpIGVycm9yIHsKKwlfLCBlcnIgOj0gcC53cml0ZVZhcmludDMyKHAuaW50MzJUb1ppZ3phZyhpbnQzMih2YWx1ZSkpKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCisvLyBXcml0ZSBhbiBpMzIgYXMgYSB6aWd6YWcgdmFyaW50LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVJMzIodmFsdWUgaW50MzIpIGVycm9yIHsKKwlfLCBlcnIgOj0gcC53cml0ZVZhcmludDMyKHAuaW50MzJUb1ppZ3phZyh2YWx1ZSkpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKKy8vIFdyaXRlIGFuIGk2NCBhcyBhIHppZ3phZyB2YXJpbnQuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUk2NCh2YWx1ZSBpbnQ2NCkgZXJyb3IgeworCV8sIGVyciA6PSBwLndyaXRlVmFyaW50NjQocC5pbnQ2NFRvWmlnemFnKHZhbHVlKSkKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKK30KKworLy8gV3JpdGUgYSBkb3VibGUgdG8gdGhlIHdpcmUgYXMgOCBieXRlcy4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlRG91YmxlKHZhbHVlIGZsb2F0NjQpIGVycm9yIHsKKwlidWYgOj0gcC5idWZmZXJbMDo4XQorCWJpbmFyeS5MaXR0bGVFbmRpYW4uUHV0VWludDY0KGJ1ZiwgbWF0aC5GbG9hdDY0Yml0cyh2YWx1ZSkpCisJXywgZXJyIDo9IHAudHJhbnMuV3JpdGUoYnVmKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCisvLyBXcml0ZSBhIHN0cmluZyB0byB0aGUgd2lyZSB3aXRoIGEgdmFyaW50IHNpemUgcHJlY2VkaW5nLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVTdHJpbmcodmFsdWUgc3RyaW5nKSBlcnJvciB7CisJXywgZSA6PSBwLndyaXRlVmFyaW50MzIoaW50MzIobGVuKHZhbHVlKSkpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCWlmIGxlbih2YWx1ZSkgPiAwIHsKKwl9CisJXywgZSA9IHAudHJhbnMuV3JpdGVTdHJpbmcodmFsdWUpCisJcmV0dXJuIGUKK30KKworLy8gV3JpdGUgYSBieXRlIGFycmF5LCB1c2luZyBhIHZhcmludCBmb3IgdGhlIHNpemUuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUJpbmFyeShiaW4gW11ieXRlKSBlcnJvciB7CisJXywgZSA6PSBwLndyaXRlVmFyaW50MzIoaW50MzIobGVuKGJpbikpKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlpZiBsZW4oYmluKSA+IDAgeworCQlfLCBlID0gcC50cmFucy5Xcml0ZShiaW4pCisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJcmV0dXJuIG5pbAorfQorCisvLworLy8gUmVhZGluZyBtZXRob2RzLgorLy8KKworLy8gUmVhZCBhIG1lc3NhZ2UgaGVhZGVyLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZE1lc3NhZ2VCZWdpbigpIChuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxSWQgaW50MzIsIGVyciBlcnJvcikgeworCisJcHJvdG9jb2xJZCwgZXJyIDo9IHAucmVhZEJ5dGVEaXJlY3QoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisKKwlpZiBwcm90b2NvbElkICE9IENPTVBBQ1RfUFJPVE9DT0xfSUQgeworCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIHByb3RvY29sIGlkICUwMnggYnV0IGdvdCAlMDJ4IiwgQ09NUEFDVF9QUk9UT0NPTF9JRCwgcHJvdG9jb2xJZCkKKwkJcmV0dXJuICIiLCB0eXBlSWQsIHNlcUlkLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShCQURfVkVSU0lPTiwgZSkKKwl9CisKKwl2ZXJzaW9uQW5kVHlwZSwgZXJyIDo9IHAucmVhZEJ5dGVEaXJlY3QoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisKKwl2ZXJzaW9uIDo9IHZlcnNpb25BbmRUeXBlICYgQ09NUEFDVF9WRVJTSU9OX01BU0sKKwl0eXBlSWQgPSBUTWVzc2FnZVR5cGUoKHZlcnNpb25BbmRUeXBlID4+IENPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQpICYgQ09NUEFDVF9UWVBFX0JJVFMpCisJaWYgdmVyc2lvbiAhPSBDT01QQUNUX1ZFUlNJT04geworCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIHZlcnNpb24gJTAyeCBidXQgZ290ICUwMngiLCBDT01QQUNUX1ZFUlNJT04sIHZlcnNpb24pCisJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKEJBRF9WRVJTSU9OLCBlKQorCQlyZXR1cm4KKwl9CisJc2VxSWQsIGUgOj0gcC5yZWFkVmFyaW50MzIoKQorCWlmIGUgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCXJldHVybgorCX0KKwluYW1lLCBlcnIgPSBwLlJlYWRTdHJpbmcoKQorCXJldHVybgorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkTWVzc2FnZUVuZCgpIGVycm9yIHsgcmV0dXJuIG5pbCB9CisKKy8vIFJlYWQgYSBzdHJ1Y3QgYmVnaW4uIFRoZXJlJ3Mgbm90aGluZyBvbiB0aGUgd2lyZSBmb3IgdGhpcywgYnV0IGl0IGlzIG91cgorLy8gb3Bwb3J0dW5pdHkgdG8gcHVzaCBhIG5ldyBzdHJ1Y3QgYmVnaW4gbWFya2VyIG9udG8gdGhlIGZpZWxkIHN0YWNrLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZFN0cnVjdEJlZ2luKCkgKG5hbWUgc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlwLmxhc3RGaWVsZCA9IGFwcGVuZChwLmxhc3RGaWVsZCwgcC5sYXN0RmllbGRJZCkKKwlwLmxhc3RGaWVsZElkID0gMAorCXJldHVybgorfQorCisvLyBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvcgorLy8gdGhpcyBzdHJ1Y3QgZnJvbSB0aGUgZmllbGQgc3RhY2suCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkU3RydWN0RW5kKCkgZXJyb3IgeworCS8vIGNvbnN1bWUgdGhlIGxhc3QgZmllbGQgd2UgcmVhZCBvZmYgdGhlIHdpcmUuCisJcC5sYXN0RmllbGRJZCA9IHAubGFzdEZpZWxkW2xlbihwLmxhc3RGaWVsZCktMV0KKwlwLmxhc3RGaWVsZCA9IHAubGFzdEZpZWxkWzpsZW4ocC5sYXN0RmllbGQpLTFdCisJcmV0dXJuIG5pbAorfQorCisvLyBSZWFkIGEgZmllbGQgaGVhZGVyIG9mZiB0aGUgd2lyZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRGaWVsZEJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2LCBlcnIgZXJyb3IpIHsKKwl0LCBlcnIgOj0gcC5yZWFkQnl0ZURpcmVjdCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCS8vIGlmIGl0J3MgYSBzdG9wLCB0aGVuIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHksIGFzIHRoZSBzdHJ1Y3QgaXMgb3Zlci4KKwlpZiAodCAmIDB4MGYpID09IFNUT1AgeworCQlyZXR1cm4gIiIsIFNUT1AsIDAsIG5pbAorCX0KKworCS8vIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KKwltb2RpZmllciA6PSBpbnQxNigodCAmIDB4ZjApID4+IDQpCisJaWYgbW9kaWZpZXIgPT0gMCB7CisJCS8vIG5vdCBhIGRlbHRhLiBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZC4KKwkJaWQsIGVyciA9IHAuUmVhZEkxNigpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuCisJCX0KKwl9IGVsc2UgeworCQkvLyBoYXMgYSBkZWx0YS4gYWRkIHRoZSBkZWx0YSB0byB0aGUgbGFzdCByZWFkIGZpZWxkIGlkLgorCQlpZCA9IGludDE2KHAubGFzdEZpZWxkSWQpICsgbW9kaWZpZXIKKwl9CisJdHlwZUlkLCBlIDo9IHAuZ2V0VFR5cGUodENvbXBhY3RUeXBlKHQgJiAweDBmKSkKKwlpZiBlICE9IG5pbCB7CisJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQlyZXR1cm4KKwl9CisKKwkvLyBpZiB0aGlzIGhhcHBlbnMgdG8gYmUgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgdHlwZQorCWlmIHAuaXNCb29sVHlwZSh0KSB7CisJCS8vIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlLgorCQlwLmJvb2xWYWx1ZSA9IChieXRlKHQpJjB4MGYgPT0gQ09NUEFDVF9CT09MRUFOX1RSVUUpCisJCXAuYm9vbFZhbHVlSXNOb3ROdWxsID0gdHJ1ZQorCX0KKworCS8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLgorCXAubGFzdEZpZWxkSWQgPSBpbnQoaWQpCisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRGaWVsZEVuZCgpIGVycm9yIHsgcmV0dXJuIG5pbCB9CisKKy8vIFJlYWQgYSBtYXAgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNpemUgaXMgemVybywgc2tpcCByZWFkaW5nIHRoZSBrZXkKKy8vIGFuZCB2YWx1ZSB0eXBlLiBUaGlzIG1lYW5zIHRoYXQgMC1sZW5ndGggbWFwcyB3aWxsIHlpZWxkIFRNYXBzIHdpdGhvdXQgdGhlCisvLyAiY29ycmVjdCIgdHlwZXMuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkTWFwQmVnaW4oKSAoa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIGVycm9yKSB7CisJc2l6ZTMyLCBlIDo9IHAucmVhZFZhcmludDMyKCkKKwlpZiBlICE9IG5pbCB7CisJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQlyZXR1cm4KKwl9CisJaWYgc2l6ZTMyIDwgMCB7CisJCWVyciA9IGludmFsaWREYXRhTGVuZ3RoCisJCXJldHVybgorCX0KKwlzaXplID0gaW50KHNpemUzMikKKworCWtleUFuZFZhbHVlVHlwZSA6PSBieXRlKFNUT1ApCisJaWYgc2l6ZSAhPSAwIHsKKwkJa2V5QW5kVmFsdWVUeXBlLCBlcnIgPSBwLnJlYWRCeXRlRGlyZWN0KCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4KKwkJfQorCX0KKwlrZXlUeXBlLCBfID0gcC5nZXRUVHlwZSh0Q29tcGFjdFR5cGUoa2V5QW5kVmFsdWVUeXBlID4+IDQpKQorCXZhbHVlVHlwZSwgXyA9IHAuZ2V0VFR5cGUodENvbXBhY3RUeXBlKGtleUFuZFZhbHVlVHlwZSAmIDB4ZikpCisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRNYXBFbmQoKSBlcnJvciB7IHJldHVybiBuaWwgfQorCisvLyBSZWFkIGEgbGlzdCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgbGlzdCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKKy8vIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIGxpc3QsIHRoZSA0IE1TQgorLy8gb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQorLy8gdHJ1ZSBzaXplLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZExpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikgeworCXNpemVfYW5kX3R5cGUsIGVyciA6PSBwLnJlYWRCeXRlRGlyZWN0KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCXNpemUgPSBpbnQoKHNpemVfYW5kX3R5cGUgPj4gNCkgJiAweDBmKQorCWlmIHNpemUgPT0gMTUgeworCQlzaXplMiwgZSA6PSBwLnJlYWRWYXJpbnQzMigpCisJCWlmIGUgIT0gbmlsIHsKKwkJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQkJcmV0dXJuCisJCX0KKwkJaWYgc2l6ZTIgPCAwIHsKKwkJCWVyciA9IGludmFsaWREYXRhTGVuZ3RoCisJCQlyZXR1cm4KKwkJfQorCQlzaXplID0gaW50KHNpemUyKQorCX0KKwllbGVtVHlwZSwgZSA6PSBwLmdldFRUeXBlKHRDb21wYWN0VHlwZShzaXplX2FuZF90eXBlKSkKKwlpZiBlICE9IG5pbCB7CisJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQlyZXR1cm4KKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRMaXN0RW5kKCkgZXJyb3IgeyByZXR1cm4gbmlsIH0KKworLy8gUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorLy8gYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgc2V0LCB0aGUgNCBNU0IKKy8vIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKKy8vIHRydWUgc2l6ZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRTZXRCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikgeworCXJldHVybiBwLlJlYWRMaXN0QmVnaW4oKQorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkU2V0RW5kKCkgZXJyb3IgeyByZXR1cm4gbmlsIH0KKworLy8gUmVhZCBhIGJvb2xlYW4gb2ZmIHRoZSB3aXJlLiBJZiB0aGlzIGlzIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIHNob3VsZAorLy8gYWxyZWFkeSBoYXZlIGJlZW4gcmVhZCBkdXJpbmcgcmVhZEZpZWxkQmVnaW4sIHNvIHdlJ2xsIGp1c3QgY29uc3VtZSB0aGUKKy8vIHByZS1zdG9yZWQgdmFsdWUuIE90aGVyd2lzZSwgcmVhZCBhIGJ5dGUuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkQm9vbCgpICh2YWx1ZSBib29sLCBlcnIgZXJyb3IpIHsKKwlpZiBwLmJvb2xWYWx1ZUlzTm90TnVsbCB7CisJCXAuYm9vbFZhbHVlSXNOb3ROdWxsID0gZmFsc2UKKwkJcmV0dXJuIHAuYm9vbFZhbHVlLCBuaWwKKwl9CisJdiwgZXJyIDo9IHAucmVhZEJ5dGVEaXJlY3QoKQorCXJldHVybiB2ID09IENPTVBBQ1RfQk9PTEVBTl9UUlVFLCBlcnIKK30KKworLy8gUmVhZCBhIHNpbmdsZSBieXRlIG9mZiB0aGUgd2lyZS4gTm90aGluZyBpbnRlcmVzdGluZyBoZXJlLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZEJ5dGUoKSAoaW50OCwgZXJyb3IpIHsKKwl2LCBlcnIgOj0gcC5yZWFkQnl0ZURpcmVjdCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiAwLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwlyZXR1cm4gaW50OCh2KSwgZXJyCit9CisKKy8vIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZEkxNigpICh2YWx1ZSBpbnQxNiwgZXJyIGVycm9yKSB7CisJdiwgZXJyIDo9IHAuUmVhZEkzMigpCisJcmV0dXJuIGludDE2KHYpLCBlcnIKK30KKworLy8gUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkSTMyKCkgKHZhbHVlIGludDMyLCBlcnIgZXJyb3IpIHsKKwl2LCBlIDo9IHAucmVhZFZhcmludDMyKCkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiAwLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJdmFsdWUgPSBwLnppZ3phZ1RvSW50MzIodikKKwlyZXR1cm4gdmFsdWUsIG5pbAorfQorCisvLyBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRJNjQoKSAodmFsdWUgaW50NjQsIGVyciBlcnJvcikgeworCXYsIGUgOj0gcC5yZWFkVmFyaW50NjQoKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIDAsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwl2YWx1ZSA9IHAuemlnemFnVG9JbnQ2NCh2KQorCXJldHVybiB2YWx1ZSwgbmlsCit9CisKKy8vIE5vIG1hZ2ljIGhlcmUgLSBqdXN0IHJlYWQgYSBkb3VibGUgb2ZmIHRoZSB3aXJlLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZERvdWJsZSgpICh2YWx1ZSBmbG9hdDY0LCBlcnIgZXJyb3IpIHsKKwlsb25nQml0cyA6PSBwLmJ1ZmZlclswOjhdCisJXywgZSA6PSBpby5SZWFkRnVsbChwLnRyYW5zLCBsb25nQml0cykKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiAwLjAsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlyZXR1cm4gbWF0aC5GbG9hdDY0ZnJvbWJpdHMocC5ieXRlc1RvVWludDY0KGxvbmdCaXRzKSksIG5pbAorfQorCisvLyBSZWFkcyBhIFtdYnl0ZSAodmlhIHJlYWRCaW5hcnkpLCBhbmQgdGhlbiBVVEYtOCBkZWNvZGVzIGl0LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZFN0cmluZygpICh2YWx1ZSBzdHJpbmcsIGVyciBlcnJvcikgeworCWxlbmd0aCwgZSA6PSBwLnJlYWRWYXJpbnQzMigpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gIiIsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlpZiBsZW5ndGggPCAwIHsKKwkJcmV0dXJuICIiLCBpbnZhbGlkRGF0YUxlbmd0aAorCX0KKworCWlmIGxlbmd0aCA9PSAwIHsKKwkJcmV0dXJuICIiLCBuaWwKKwl9CisJdmFyIGJ1ZiBbXWJ5dGUKKwlpZiBsZW5ndGggPD0gaW50MzIobGVuKHAuYnVmZmVyKSkgeworCQlidWYgPSBwLmJ1ZmZlclswOmxlbmd0aF0KKwl9IGVsc2UgeworCQlidWYgPSBtYWtlKFtdYnl0ZSwgbGVuZ3RoKQorCX0KKwlfLCBlID0gaW8uUmVhZEZ1bGwocC50cmFucywgYnVmKQorCXJldHVybiBzdHJpbmcoYnVmKSwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCit9CisKKy8vIFJlYWQgYSBbXWJ5dGUgZnJvbSB0aGUgd2lyZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRCaW5hcnkoKSAodmFsdWUgW11ieXRlLCBlcnIgZXJyb3IpIHsKKwlsZW5ndGgsIGUgOj0gcC5yZWFkVmFyaW50MzIoKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCWlmIGxlbmd0aCA9PSAwIHsKKwkJcmV0dXJuIFtdYnl0ZXt9LCBuaWwKKwl9CisJaWYgbGVuZ3RoIDwgMCB7CisJCXJldHVybiBuaWwsIGludmFsaWREYXRhTGVuZ3RoCisJfQorCisJYnVmIDo9IG1ha2UoW11ieXRlLCBsZW5ndGgpCisJXywgZSA9IGlvLlJlYWRGdWxsKHAudHJhbnMsIGJ1ZikKKwlyZXR1cm4gYnVmLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgeworCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24ocC50cmFucy5GbHVzaChjdHgpKQorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBTa2lwKGZpZWxkVHlwZSBUVHlwZSkgKGVyciBlcnJvcikgeworCXJldHVybiBTa2lwRGVmYXVsdERlcHRoKHAsIGZpZWxkVHlwZSkKK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgVHJhbnNwb3J0KCkgVFRyYW5zcG9ydCB7CisJcmV0dXJuIHAub3JpZ1RyYW5zcG9ydAorfQorCisvLworLy8gSW50ZXJuYWwgd3JpdGluZyBtZXRob2RzCisvLworCisvLyBBYnN0cmFjdCBtZXRob2QgZm9yIHdyaXRpbmcgdGhlIHN0YXJ0IG9mIGxpc3RzIGFuZCBzZXRzLiBMaXN0IGFuZCBzZXRzIG9uCisvLyB0aGUgd2lyZSBkaWZmZXIgb25seSBieSB0aGUgdHlwZSBpbmRpY2F0b3IuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSB3cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIChpbnQsIGVycm9yKSB7CisJaWYgc2l6ZSA8PSAxNCB7CisJCXJldHVybiAxLCBwLndyaXRlQnl0ZURpcmVjdChieXRlKGludDMyKHNpemU8PDQpIHwgaW50MzIocC5nZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpKSkKKwl9CisJZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KDB4ZjAgfCBieXRlKHAuZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIDAsIGVycgorCX0KKwltLCBlcnIgOj0gcC53cml0ZVZhcmludDMyKGludDMyKHNpemUpKQorCXJldHVybiAxICsgbSwgZXJyCit9CisKKy8vIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisvLyBUT0RPKHBvbWFjayk6IG1ha2UgYSBwZXJtYW5lbnQgYnVmZmVyIGxpa2Ugd3JpdGVWYXJpbnQ2ND8KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHdyaXRlVmFyaW50MzIobiBpbnQzMikgKGludCwgZXJyb3IpIHsKKwlpMzJidWYgOj0gcC5idWZmZXJbMDo1XQorCWlkeCA6PSAwCisJZm9yIHsKKwkJaWYgKG4gJiBeMHg3RikgPT0gMCB7CisJCQlpMzJidWZbaWR4XSA9IGJ5dGUobikKKwkJCWlkeCsrCisJCQkvLyBwLndyaXRlQnl0ZURpcmVjdChieXRlKG4pKTsKKwkJCWJyZWFrCisJCQkvLyByZXR1cm47CisJCX0gZWxzZSB7CisJCQlpMzJidWZbaWR4XSA9IGJ5dGUoKG4gJiAweDdGKSB8IDB4ODApCisJCQlpZHgrKworCQkJLy8gcC53cml0ZUJ5dGVEaXJlY3QoYnl0ZSgoKG4gJiAweDdGKSB8IDB4ODApKSk7CisJCQl1IDo9IHVpbnQzMihuKQorCQkJbiA9IGludDMyKHUgPj4gNykKKwkJfQorCX0KKwlyZXR1cm4gcC50cmFucy5Xcml0ZShpMzJidWZbMDppZHhdKQorfQorCisvLyBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHdyaXRlVmFyaW50NjQobiBpbnQ2NCkgKGludCwgZXJyb3IpIHsKKwl2YXJpbnQ2NG91dCA6PSBwLmJ1ZmZlclswOjEwXQorCWlkeCA6PSAwCisJZm9yIHsKKwkJaWYgKG4gJiBeMHg3RikgPT0gMCB7CisJCQl2YXJpbnQ2NG91dFtpZHhdID0gYnl0ZShuKQorCQkJaWR4KysKKwkJCWJyZWFrCisJCX0gZWxzZSB7CisJCQl2YXJpbnQ2NG91dFtpZHhdID0gYnl0ZSgobiAmIDB4N0YpIHwgMHg4MCkKKwkJCWlkeCsrCisJCQl1IDo9IHVpbnQ2NChuKQorCQkJbiA9IGludDY0KHUgPj4gNykKKwkJfQorCX0KKwlyZXR1cm4gcC50cmFucy5Xcml0ZSh2YXJpbnQ2NG91dFswOmlkeF0pCit9CisKKy8vIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKy8vIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGludDY0VG9aaWd6YWcobCBpbnQ2NCkgaW50NjQgeworCXJldHVybiAobCA8PCAxKSBeIChsID4+IDYzKQorfQorCisvLyBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisvLyByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBpbnQzMlRvWmlnemFnKG4gaW50MzIpIGludDMyIHsKKwlyZXR1cm4gKG4gPDwgMSkgXiAobiA+PiAzMSkKK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgZml4ZWRVaW50NjRUb0J5dGVzKG4gdWludDY0LCBidWYgW11ieXRlKSB7CisJYmluYXJ5LkxpdHRsZUVuZGlhbi5QdXRVaW50NjQoYnVmLCBuKQorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBmaXhlZEludDY0VG9CeXRlcyhuIGludDY0LCBidWYgW11ieXRlKSB7CisJYmluYXJ5LkxpdHRsZUVuZGlhbi5QdXRVaW50NjQoYnVmLCB1aW50NjQobikpCit9CisKKy8vIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgorLy8gVXNlZCBpbnRlcm5hbGx5IGJ5IG90aGVyIHdyaXRpbmcgbWV0aG9kcyB0aGF0IGtub3cgdGhleSBuZWVkIHRvIHdyaXRlIGEgYnl0ZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHdyaXRlQnl0ZURpcmVjdChiIGJ5dGUpIGVycm9yIHsKKwlyZXR1cm4gcC50cmFucy5Xcml0ZUJ5dGUoYikKK30KKworLy8gV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSB3cml0ZUludEFzQnl0ZURpcmVjdChuIGludCkgKGludCwgZXJyb3IpIHsKKwlyZXR1cm4gMSwgcC53cml0ZUJ5dGVEaXJlY3QoYnl0ZShuKSkKK30KKworLy8KKy8vIEludGVybmFsIHJlYWRpbmcgbWV0aG9kcworLy8KKworLy8gUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisvLyBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDUgYnl0ZXMuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSByZWFkVmFyaW50MzIoKSAoaW50MzIsIGVycm9yKSB7CisJLy8gaWYgdGhlIHdpcmUgY29udGFpbnMgdGhlIHJpZ2h0IHN0dWZmLCB0aGlzIHdpbGwganVzdCB0cnVuY2F0ZSB0aGUgaTY0IHdlCisJLy8gcmVhZCBhbmQgZ2V0IHVzIHRoZSByaWdodCBzaWduLgorCXYsIGVyciA6PSBwLnJlYWRWYXJpbnQ2NCgpCisJcmV0dXJuIGludDMyKHYpLCBlcnIKK30KKworLy8gUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byAxMCBieXRlcy4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHJlYWRWYXJpbnQ2NCgpIChpbnQ2NCwgZXJyb3IpIHsKKwlzaGlmdCA6PSB1aW50KDApCisJcmVzdWx0IDo9IGludDY0KDApCisJZm9yIHsKKwkJYiwgZXJyIDo9IHAucmVhZEJ5dGVEaXJlY3QoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiAwLCBlcnIKKwkJfQorCQlyZXN1bHQgfD0gaW50NjQoYiYweDdmKSA8PCBzaGlmdAorCQlpZiAoYiAmIDB4ODApICE9IDB4ODAgeworCQkJYnJlYWsKKwkJfQorCQlzaGlmdCArPSA3CisJfQorCXJldHVybiByZXN1bHQsIG5pbAorfQorCisvLyBSZWFkIGEgYnl0ZSwgdW5saWtlIFJlYWRCeXRlIHRoYXQgcmVhZHMgVGhyaWZ0LWJ5dGUgdGhhdCBpcyBpOC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHJlYWRCeXRlRGlyZWN0KCkgKGJ5dGUsIGVycm9yKSB7CisJcmV0dXJuIHAudHJhbnMuUmVhZEJ5dGUoKQorfQorCisvLworLy8gZW5jb2RpbmcgaGVscGVycworLy8KKworLy8gQ29udmVydCBmcm9tIHppZ3phZyBpbnQgdG8gaW50LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgemlnemFnVG9JbnQzMihuIGludDMyKSBpbnQzMiB7CisJdSA6PSB1aW50MzIobikKKwlyZXR1cm4gaW50MzIodT4+MSkgXiAtKG4gJiAxKQorfQorCisvLyBDb252ZXJ0IGZyb20gemlnemFnIGxvbmcgdG8gbG9uZy4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHppZ3phZ1RvSW50NjQobiBpbnQ2NCkgaW50NjQgeworCXUgOj0gdWludDY0KG4pCisJcmV0dXJuIGludDY0KHU+PjEpIF4gLShuICYgMSkKK30KKworLy8gTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG1hc2sgYnl0ZXMgYXJlIGxvbmcgbGl0ZXJhbHMsCisvLyBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBpbnQgbGVmdCA1NiBiaXRzLAorLy8geW91IGp1c3QgZ2V0IGEgbWVzc2VkIHVwIGludC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGJ5dGVzVG9JbnQ2NChiIFtdYnl0ZSkgaW50NjQgeworCXJldHVybiBpbnQ2NChiaW5hcnkuTGl0dGxlRW5kaWFuLlVpbnQ2NChiKSkKK30KKworLy8gTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG1hc2sgYnl0ZXMgYXJlIGxvbmcgbGl0ZXJhbHMsCisvLyBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBpbnQgbGVmdCA1NiBiaXRzLAorLy8geW91IGp1c3QgZ2V0IGEgbWVzc2VkIHVwIGludC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGJ5dGVzVG9VaW50NjQoYiBbXWJ5dGUpIHVpbnQ2NCB7CisJcmV0dXJuIGJpbmFyeS5MaXR0bGVFbmRpYW4uVWludDY0KGIpCit9CisKKy8vCisvLyB0eXBlIHRlc3RpbmcgYW5kIGNvbnZlcnRpbmcKKy8vCisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGlzQm9vbFR5cGUoYiBieXRlKSBib29sIHsKKwlyZXR1cm4gKGImMHgwZikgPT0gQ09NUEFDVF9CT09MRUFOX1RSVUUgfHwgKGImMHgwZikgPT0gQ09NUEFDVF9CT09MRUFOX0ZBTFNFCit9CisKKy8vIEdpdmVuIGEgdENvbXBhY3RUeXBlIGNvbnN0YW50LCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nCisvLyBUVHlwZSB2YWx1ZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGdldFRUeXBlKHQgdENvbXBhY3RUeXBlKSAoVFR5cGUsIGVycm9yKSB7CisJc3dpdGNoIGJ5dGUodCkgJiAweDBmIHsKKwljYXNlIFNUT1A6CisJCXJldHVybiBTVE9QLCBuaWwKKwljYXNlIENPTVBBQ1RfQk9PTEVBTl9GQUxTRSwgQ09NUEFDVF9CT09MRUFOX1RSVUU6CisJCXJldHVybiBCT09MLCBuaWwKKwljYXNlIENPTVBBQ1RfQllURToKKwkJcmV0dXJuIEJZVEUsIG5pbAorCWNhc2UgQ09NUEFDVF9JMTY6CisJCXJldHVybiBJMTYsIG5pbAorCWNhc2UgQ09NUEFDVF9JMzI6CisJCXJldHVybiBJMzIsIG5pbAorCWNhc2UgQ09NUEFDVF9JNjQ6CisJCXJldHVybiBJNjQsIG5pbAorCWNhc2UgQ09NUEFDVF9ET1VCTEU6CisJCXJldHVybiBET1VCTEUsIG5pbAorCWNhc2UgQ09NUEFDVF9CSU5BUlk6CisJCXJldHVybiBTVFJJTkcsIG5pbAorCWNhc2UgQ09NUEFDVF9MSVNUOgorCQlyZXR1cm4gTElTVCwgbmlsCisJY2FzZSBDT01QQUNUX1NFVDoKKwkJcmV0dXJuIFNFVCwgbmlsCisJY2FzZSBDT01QQUNUX01BUDoKKwkJcmV0dXJuIE1BUCwgbmlsCisJY2FzZSBDT01QQUNUX1NUUlVDVDoKKwkJcmV0dXJuIFNUUlVDVCwgbmlsCisJfQorCXJldHVybiBTVE9QLCBURXhjZXB0aW9uKGZtdC5FcnJvcmYoImRvbid0IGtub3cgd2hhdCB0eXBlOiAldiIsIHQmMHgwZikpCit9CisKKy8vIEdpdmVuIGEgVFR5cGUgdmFsdWUsIGZpbmQgdGhlIGFwcHJvcHJpYXRlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBnZXRDb21wYWN0VHlwZSh0IFRUeXBlKSB0Q29tcGFjdFR5cGUgeworCXJldHVybiB0dHlwZVRvQ29tcGFjdFR5cGVbdF0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvY29tcGFjdF9wcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9jb21wYWN0X3Byb3RvY29sX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmNzdmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvY29tcGFjdF9wcm90b2NvbF90ZXN0LmdvCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiYnl0ZXMiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdFJlYWRXcml0ZUNvbXBhY3RQcm90b2NvbCh0ICp0ZXN0aW5nLlQpIHsKKwlSZWFkV3JpdGVQcm90b2NvbFRlc3QodCwgTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSkKKworCXRyYW5zcG9ydHMgOj0gW11UVHJhbnNwb3J0eworCQlOZXdUTWVtb3J5QnVmZmVyKCksCisJCU5ld1N0cmVhbVRyYW5zcG9ydFJXKGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgMTYzODQpKSksCisJCU5ld1RGcmFtZWRUcmFuc3BvcnQoTmV3VE1lbW9yeUJ1ZmZlcigpKSwKKwl9CisKKwl6bGliMCwgXyA6PSBOZXdUWmxpYlRyYW5zcG9ydChOZXdUTWVtb3J5QnVmZmVyKCksIDApCisJemxpYjYsIF8gOj0gTmV3VFpsaWJUcmFuc3BvcnQoTmV3VE1lbW9yeUJ1ZmZlcigpLCA2KQorCXpsaWI5LCBfIDo9IE5ld1RabGliVHJhbnNwb3J0KE5ld1RGcmFtZWRUcmFuc3BvcnQoTmV3VE1lbW9yeUJ1ZmZlcigpKSwgOSkKKwl0cmFuc3BvcnRzID0gYXBwZW5kKHRyYW5zcG9ydHMsIHpsaWIwLCB6bGliNiwgemxpYjkpCisKKwlmb3IgXywgdHJhbnMgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7CisJCXAgOj0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlQm9vbCh0LCBwLCB0cmFucykKKwkJcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUJ5dGUodCwgcCwgdHJhbnMpCisJCXAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVJMTYodCwgcCwgdHJhbnMpCisJCXAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVJMzIodCwgcCwgdHJhbnMpCisJCXAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVJNjQodCwgcCwgdHJhbnMpCisJCXAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVEb3VibGUodCwgcCwgdHJhbnMpCisJCXAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVTdHJpbmcodCwgcCwgdHJhbnMpCisJCXAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVCaW5hcnkodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2NvbnRleHQuZ28gYi9saWIvZ28vdGhyaWZ0L2NvbnRleHQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1YzFiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvY29udGV4dC5nbwpAQCAtMCwwICsxLDI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAiY29udGV4dCIKKwordmFyIGRlZmF1bHRDdHggPSBjb250ZXh0LkJhY2tncm91bmQoKQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9kZWJ1Z19wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvZGVidWdfcHJvdG9jb2wuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc5NDNlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvZGVidWdfcHJvdG9jb2wuZ28KQEAgLTAsMCArMSwyNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkibG9nIgorKQorCit0eXBlIFREZWJ1Z1Byb3RvY29sIHN0cnVjdCB7CisJRGVsZWdhdGUgIFRQcm90b2NvbAorCUxvZ1ByZWZpeCBzdHJpbmcKK30KKwordHlwZSBURGVidWdQcm90b2NvbEZhY3Rvcnkgc3RydWN0IHsKKwlVbmRlcmx5aW5nIFRQcm90b2NvbEZhY3RvcnkKKwlMb2dQcmVmaXggIHN0cmluZworfQorCitmdW5jIE5ld1REZWJ1Z1Byb3RvY29sRmFjdG9yeSh1bmRlcmx5aW5nIFRQcm90b2NvbEZhY3RvcnksIGxvZ1ByZWZpeCBzdHJpbmcpICpURGVidWdQcm90b2NvbEZhY3RvcnkgeworCXJldHVybiAmVERlYnVnUHJvdG9jb2xGYWN0b3J5eworCQlVbmRlcmx5aW5nOiB1bmRlcmx5aW5nLAorCQlMb2dQcmVmaXg6ICBsb2dQcmVmaXgsCisJfQorfQorCitmdW5jICh0ICpURGVidWdQcm90b2NvbEZhY3RvcnkpIEdldFByb3RvY29sKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm90b2NvbCB7CisJcmV0dXJuICZURGVidWdQcm90b2NvbHsKKwkJRGVsZWdhdGU6ICB0LlVuZGVybHlpbmcuR2V0UHJvdG9jb2wodHJhbnMpLAorCQlMb2dQcmVmaXg6IHQuTG9nUHJlZml4LAorCX0KK30KKworZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVNZXNzYWdlQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcWlkIGludDMyKSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0eXBlSWQsIHNlcWlkKQorCWxvZy5QcmludGYoIiVzV3JpdGVNZXNzYWdlQmVnaW4obmFtZT0lI3YsIHR5cGVJZD0lI3YsIHNlcWlkPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgbmFtZSwgdHlwZUlkLCBzZXFpZCwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlTWVzc2FnZUVuZCgpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlTWVzc2FnZUVuZCgpCisJbG9nLlByaW50ZigiJXNXcml0ZU1lc3NhZ2VFbmQoKSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVTdHJ1Y3RCZWdpbihuYW1lIHN0cmluZykgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVTdHJ1Y3RCZWdpbihuYW1lKQorCWxvZy5QcmludGYoIiVzV3JpdGVTdHJ1Y3RCZWdpbihuYW1lPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgbmFtZSwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlU3RydWN0RW5kKCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVTdHJ1Y3RFbmQoKQorCWxvZy5QcmludGYoIiVzV3JpdGVTdHJ1Y3RFbmQoKSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVGaWVsZEJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2KSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZUZpZWxkQmVnaW4obmFtZSwgdHlwZUlkLCBpZCkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlRmllbGRCZWdpbihuYW1lPSUjdiwgdHlwZUlkPSUjdiwgaWQlI3YpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIG5hbWUsIHR5cGVJZCwgaWQsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZUZpZWxkRW5kKCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVGaWVsZEVuZCgpCisJbG9nLlByaW50ZigiJXNXcml0ZUZpZWxkRW5kKCkgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlRmllbGRTdG9wKCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVGaWVsZFN0b3AoKQorCWxvZy5QcmludGYoIiVzV3JpdGVGaWVsZFN0b3AoKSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVNYXBCZWdpbihrZXlUeXBlIFRUeXBlLCB2YWx1ZVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZU1hcEJlZ2luKGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlTWFwQmVnaW4oa2V5VHlwZT0lI3YsIHZhbHVlVHlwZT0lI3YsIHNpemU9JSN2KSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZU1hcEVuZCgpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlTWFwRW5kKCkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlTWFwRW5kKCkgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpCisJbG9nLlByaW50ZigiJXNXcml0ZUxpc3RCZWdpbihlbGVtVHlwZT0lI3YsIHNpemU9JSN2KSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBlbGVtVHlwZSwgc2l6ZSwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlTGlzdEVuZCgpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlTGlzdEVuZCgpCisJbG9nLlByaW50ZigiJXNXcml0ZUxpc3RFbmQoKSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVTZXRCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpCisJbG9nLlByaW50ZigiJXNXcml0ZVNldEJlZ2luKGVsZW1UeXBlPSUjdiwgc2l6ZT0lI3YpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIGVsZW1UeXBlLCBzaXplLCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVTZXRFbmQoKSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZVNldEVuZCgpCisJbG9nLlByaW50ZigiJXNXcml0ZVNldEVuZCgpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZUJvb2wodmFsdWUgYm9vbCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVCb29sKHZhbHVlKQorCWxvZy5QcmludGYoIiVzV3JpdGVCb29sKHZhbHVlPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZUJ5dGUodmFsdWUgaW50OCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVCeXRlKHZhbHVlKQorCWxvZy5QcmludGYoIiVzV3JpdGVCeXRlKHZhbHVlPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZUkxNih2YWx1ZSBpbnQxNikgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVJMTYodmFsdWUpCisJbG9nLlByaW50ZigiJXNXcml0ZUkxNih2YWx1ZT0lI3YpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVJMzIodmFsdWUgaW50MzIpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlSTMyKHZhbHVlKQorCWxvZy5QcmludGYoIiVzV3JpdGVJMzIodmFsdWU9JSN2KSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlSTY0KHZhbHVlIGludDY0KSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZUk2NCh2YWx1ZSkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlSTY0KHZhbHVlPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZURvdWJsZSh2YWx1ZSBmbG9hdDY0KSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZURvdWJsZSh2YWx1ZSkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlRG91YmxlKHZhbHVlPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZVN0cmluZyh2YWx1ZSBzdHJpbmcpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlU3RyaW5nKHZhbHVlKQorCWxvZy5QcmludGYoIiVzV3JpdGVTdHJpbmcodmFsdWU9JSN2KSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlQmluYXJ5KHZhbHVlIFtdYnl0ZSkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVCaW5hcnkodmFsdWUpCisJbG9nLlByaW50ZigiJXNXcml0ZUJpbmFyeSh2YWx1ZT0lI3YpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuIGVycgorfQorCitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkTWVzc2FnZUJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFpZCBpbnQzMiwgZXJyIGVycm9yKSB7CisJbmFtZSwgdHlwZUlkLCBzZXFpZCwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRNZXNzYWdlQmVnaW4oKQorCWxvZy5QcmludGYoIiVzUmVhZE1lc3NhZ2VCZWdpbigpIChuYW1lPSUjdiwgdHlwZUlkPSUjdiwgc2VxaWQ9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIG5hbWUsIHR5cGVJZCwgc2VxaWQsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRNZXNzYWdlRW5kKCkgKGVyciBlcnJvcikgeworCWVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkTWVzc2FnZUVuZCgpCisJbG9nLlByaW50ZigiJXNSZWFkTWVzc2FnZUVuZCgpIGVycj0lI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkU3RydWN0QmVnaW4oKSAobmFtZSBzdHJpbmcsIGVyciBlcnJvcikgeworCW5hbWUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkU3RydWN0QmVnaW4oKQorCWxvZy5QcmludGYoIiVzUmVhZFN0cnVjdEJlZ2luKCkgKG5hbWUlI3YsIGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgbmFtZSwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZFN0cnVjdEVuZCgpIChlcnIgZXJyb3IpIHsKKwllcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZFN0cnVjdEVuZCgpCisJbG9nLlByaW50ZigiJXNSZWFkU3RydWN0RW5kKCkgZXJyPSUjdiIsIHRkcC5Mb2dQcmVmaXgsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRGaWVsZEJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2LCBlcnIgZXJyb3IpIHsKKwluYW1lLCB0eXBlSWQsIGlkLCBlcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZEZpZWxkQmVnaW4oKQorCWxvZy5QcmludGYoIiVzUmVhZEZpZWxkQmVnaW4oKSAobmFtZT0lI3YsIHR5cGVJZD0lI3YsIGlkPSUjdiwgZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCBuYW1lLCB0eXBlSWQsIGlkLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkRmllbGRFbmQoKSAoZXJyIGVycm9yKSB7CisJZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRGaWVsZEVuZCgpCisJbG9nLlByaW50ZigiJXNSZWFkRmllbGRFbmQoKSBlcnI9JSN2IiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZE1hcEJlZ2luKCkgKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikgeworCWtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRNYXBCZWdpbigpCisJbG9nLlByaW50ZigiJXNSZWFkTWFwQmVnaW4oKSAoa2V5VHlwZT0lI3YsIHZhbHVlVHlwZT0lI3YsIHNpemU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZE1hcEVuZCgpIChlcnIgZXJyb3IpIHsKKwllcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZE1hcEVuZCgpCisJbG9nLlByaW50ZigiJXNSZWFkTWFwRW5kKCkgZXJyPSUjdiIsIHRkcC5Mb2dQcmVmaXgsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRMaXN0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlcnIgZXJyb3IpIHsKKwllbGVtVHlwZSwgc2l6ZSwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRMaXN0QmVnaW4oKQorCWxvZy5QcmludGYoIiVzUmVhZExpc3RCZWdpbigpIChlbGVtVHlwZT0lI3YsIHNpemU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIGVsZW1UeXBlLCBzaXplLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkTGlzdEVuZCgpIChlcnIgZXJyb3IpIHsKKwllcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZExpc3RFbmQoKQorCWxvZy5QcmludGYoIiVzUmVhZExpc3RFbmQoKSBlcnI9JSN2IiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZFNldEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIGVycm9yKSB7CisJZWxlbVR5cGUsIHNpemUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkU2V0QmVnaW4oKQorCWxvZy5QcmludGYoIiVzUmVhZFNldEJlZ2luKCkgKGVsZW1UeXBlPSUjdiwgc2l6ZT0lI3YsIGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgZWxlbVR5cGUsIHNpemUsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRTZXRFbmQoKSAoZXJyIGVycm9yKSB7CisJZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRTZXRFbmQoKQorCWxvZy5QcmludGYoIiVzUmVhZFNldEVuZCgpIGVycj0lI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkQm9vbCgpICh2YWx1ZSBib29sLCBlcnIgZXJyb3IpIHsKKwl2YWx1ZSwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRCb29sKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRCb29sKCkgKHZhbHVlPSUjdiwgZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZEJ5dGUoKSAodmFsdWUgaW50OCwgZXJyIGVycm9yKSB7CisJdmFsdWUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkQnl0ZSgpCisJbG9nLlByaW50ZigiJXNSZWFkQnl0ZSgpICh2YWx1ZT0lI3YsIGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRJMTYoKSAodmFsdWUgaW50MTYsIGVyciBlcnJvcikgeworCXZhbHVlLCBlcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZEkxNigpCisJbG9nLlByaW50ZigiJXNSZWFkSTE2KCkgKHZhbHVlPSUjdiwgZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZEkzMigpICh2YWx1ZSBpbnQzMiwgZXJyIGVycm9yKSB7CisJdmFsdWUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkSTMyKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRJMzIoKSAodmFsdWU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkSTY0KCkgKHZhbHVlIGludDY0LCBlcnIgZXJyb3IpIHsKKwl2YWx1ZSwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRJNjQoKQorCWxvZy5QcmludGYoIiVzUmVhZEk2NCgpICh2YWx1ZT0lI3YsIGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWREb3VibGUoKSAodmFsdWUgZmxvYXQ2NCwgZXJyIGVycm9yKSB7CisJdmFsdWUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkRG91YmxlKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWREb3VibGUoKSAodmFsdWU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkU3RyaW5nKCkgKHZhbHVlIHN0cmluZywgZXJyIGVycm9yKSB7CisJdmFsdWUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkU3RyaW5nKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRTdHJpbmcoKSAodmFsdWU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkQmluYXJ5KCkgKHZhbHVlIFtdYnl0ZSwgZXJyIGVycm9yKSB7CisJdmFsdWUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkQmluYXJ5KCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRCaW5hcnkoKSAodmFsdWU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBTa2lwKGZpZWxkVHlwZSBUVHlwZSkgKGVyciBlcnJvcikgeworCWVyciA9IHRkcC5EZWxlZ2F0ZS5Ta2lwKGZpZWxkVHlwZSkKKwlsb2cuUHJpbnRmKCIlc1NraXAoZmllbGRUeXBlPSUjdikgKGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgZmllbGRUeXBlLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJZXJyID0gdGRwLkRlbGVnYXRlLkZsdXNoKGN0eCkKKwlsb2cuUHJpbnRmKCIlc0ZsdXNoKCkgKGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybgorfQorCitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBUcmFuc3BvcnQoKSBUVHJhbnNwb3J0IHsKKwlyZXR1cm4gdGRwLkRlbGVnYXRlLlRyYW5zcG9ydCgpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2Rlc2VyaWFsaXplci5nbyBiL2xpYi9nby90aHJpZnQvZGVzZXJpYWxpemVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYTA5ODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2Rlc2VyaWFsaXplci5nbwpAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK3R5cGUgVERlc2VyaWFsaXplciBzdHJ1Y3QgeworCVRyYW5zcG9ydCBUVHJhbnNwb3J0CisJUHJvdG9jb2wgIFRQcm90b2NvbAorfQorCitmdW5jIE5ld1REZXNlcmlhbGl6ZXIoKSAqVERlc2VyaWFsaXplciB7CisJdmFyIHRyYW5zcG9ydCBUVHJhbnNwb3J0CisJdHJhbnNwb3J0ID0gTmV3VE1lbW9yeUJ1ZmZlckxlbigxMDI0KQorCisJcHJvdG9jb2wgOj0gTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpCisKKwlyZXR1cm4gJlREZXNlcmlhbGl6ZXJ7CisJCXRyYW5zcG9ydCwKKwkJcHJvdG9jb2x9Cit9CisKK2Z1bmMgKHQgKlREZXNlcmlhbGl6ZXIpIFJlYWRTdHJpbmcobXNnIFRTdHJ1Y3QsIHMgc3RyaW5nKSAoZXJyIGVycm9yKSB7CisJZXJyID0gbmlsCisJaWYgXywgZXJyID0gdC5UcmFuc3BvcnQuV3JpdGUoW11ieXRlKHMpKTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKwlpZiBlcnIgPSBtc2cuUmVhZCh0LlByb3RvY29sKTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKwlyZXR1cm4KK30KKworZnVuYyAodCAqVERlc2VyaWFsaXplcikgUmVhZChtc2cgVFN0cnVjdCwgYiBbXWJ5dGUpIChlcnIgZXJyb3IpIHsKKwllcnIgPSBuaWwKKwlpZiBfLCBlcnIgPSB0LlRyYW5zcG9ydC5Xcml0ZShiKTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKwlpZiBlcnIgPSBtc2cuUmVhZCh0LlByb3RvY29sKTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKwlyZXR1cm4KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvZXhjZXB0aW9uLmdvIGIvbGliL2dvL3RocmlmdC9leGNlcHRpb24uZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE4ZDZmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvZXhjZXB0aW9uLmdvCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiZXJyb3JzIgorKQorCisvLyBHZW5lcmljIFRocmlmdCBleGNlcHRpb24KK3R5cGUgVEV4Y2VwdGlvbiBpbnRlcmZhY2UgeworCWVycm9yCit9CisKKy8vIFByZXBlbmRzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gYW4gZXJyb3Igd2l0aG91dCBsb3NpbmcgdGhlIFRocmlmdCBleGNlcHRpb24gaW50ZXJmYWNlCitmdW5jIFByZXBlbmRFcnJvcihwcmVwZW5kIHN0cmluZywgZXJyIGVycm9yKSBlcnJvciB7CisJaWYgdCwgb2sgOj0gZXJyLihUVHJhbnNwb3J0RXhjZXB0aW9uKTsgb2sgeworCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0LlR5cGVJZCgpLCBwcmVwZW5kK3QuRXJyb3IoKSkKKwl9CisJaWYgdCwgb2sgOj0gZXJyLihUUHJvdG9jb2xFeGNlcHRpb24pOyBvayB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZSh0LlR5cGVJZCgpLCBlcnJvcnMuTmV3KHByZXBlbmQrZXJyLkVycm9yKCkpKQorCX0KKwlpZiB0LCBvayA6PSBlcnIuKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbik7IG9rIHsKKwkJcmV0dXJuIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0LlR5cGVJZCgpLCBwcmVwZW5kK3QuRXJyb3IoKSkKKwl9CisKKwlyZXR1cm4gZXJyb3JzLk5ldyhwcmVwZW5kICsgZXJyLkVycm9yKCkpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2V4Y2VwdGlvbl90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9leGNlcHRpb25fdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWY1ZTJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9leGNlcHRpb25fdGVzdC5nbwpAQCAtMCwwICsxLDY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImVycm9ycyIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0UHJlcGVuZEVycm9yKHQgKnRlc3RpbmcuVCkgeworCWVyciA6PSBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24oSU5URVJOQUxfRVJST1IsICJvcmlnaW5hbCBlcnJvciIpCisJZXJyMiwgb2sgOj0gUHJlcGVuZEVycm9yKCJQcmVwZW5kOiAiLCBlcnIpLihUQXBwbGljYXRpb25FeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiQ291bGRuJ3QgY2FzdCBlcnJvciBUQXBwbGljYXRpb25FeGNlcHRpb24iKQorCX0KKwlpZiBlcnIyLkVycm9yKCkgIT0gIlByZXBlbmQ6IG9yaWdpbmFsIGVycm9yIiB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgZXJyb3Igc3RyaW5nIikKKwl9CisJaWYgZXJyMi5UeXBlSWQoKSAhPSBJTlRFUk5BTF9FUlJPUiB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgdHlwZSBlcnJvciIpCisJfQorCisJZXJyMyA6PSBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGVycm9ycy5OZXcoIm9yaWdpbmFsIGVycm9yIikpCisJZXJyNCwgb2sgOj0gUHJlcGVuZEVycm9yKCJQcmVwZW5kOiAiLCBlcnIzKS4oVFByb3RvY29sRXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkNvdWxkbid0IGNhc3QgZXJyb3IgVFByb3RvY29sRXhjZXB0aW9uIikKKwl9CisJaWYgZXJyNC5FcnJvcigpICE9ICJQcmVwZW5kOiBvcmlnaW5hbCBlcnJvciIgeworCQl0LkZhdGFsKCJVbmV4cGVjdGVkIGVycm9yIHN0cmluZyIpCisJfQorCWlmIGVycjQuVHlwZUlkKCkgIT0gSU5WQUxJRF9EQVRBIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCB0eXBlIGVycm9yIikKKwl9CisKKwllcnI1IDo9IE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oVElNRURfT1VULCAib3JpZ2luYWwgZXJyb3IiKQorCWVycjYsIG9rIDo9IFByZXBlbmRFcnJvcigiUHJlcGVuZDogIiwgZXJyNSkuKFRUcmFuc3BvcnRFeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiQ291bGRuJ3QgY2FzdCBlcnJvciBUVHJhbnNwb3J0RXhjZXB0aW9uIikKKwl9CisJaWYgZXJyNi5FcnJvcigpICE9ICJQcmVwZW5kOiBvcmlnaW5hbCBlcnJvciIgeworCQl0LkZhdGFsKCJVbmV4cGVjdGVkIGVycm9yIHN0cmluZyIpCisJfQorCWlmIGVycjYuVHlwZUlkKCkgIT0gVElNRURfT1VUIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCB0eXBlIGVycm9yIikKKwl9CisKKwllcnI3IDo9IGVycm9ycy5OZXcoIm9yaWdpbmFsIGVycm9yIikKKwllcnI4IDo9IFByZXBlbmRFcnJvcigiUHJlcGVuZDogIiwgZXJyNykKKwlpZiBlcnI4LkVycm9yKCkgIT0gIlByZXBlbmQ6IG9yaWdpbmFsIGVycm9yIiB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgZXJyb3Igc3RyaW5nIikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2ZpZWxkLmdvIGIvbGliL2dvL3RocmlmdC9maWVsZC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDY2NTI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9maWVsZC5nbwpAQCAtMCwwICsxLDc5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKKy8vIEhlbHBlciBjbGFzcyB0aGF0IGVuY2Fwc3VsYXRlcyBmaWVsZCBtZXRhZGF0YS4KK3R5cGUgZmllbGQgc3RydWN0IHsKKwluYW1lICAgc3RyaW5nCisJdHlwZUlkIFRUeXBlCisJaWQgICAgIGludAorfQorCitmdW5jIG5ld0ZpZWxkKG4gc3RyaW5nLCB0IFRUeXBlLCBpIGludCkgKmZpZWxkIHsKKwlyZXR1cm4gJmZpZWxke25hbWU6IG4sIHR5cGVJZDogdCwgaWQ6IGl9Cit9CisKK2Z1bmMgKHAgKmZpZWxkKSBOYW1lKCkgc3RyaW5nIHsKKwlpZiBwID09IG5pbCB7CisJCXJldHVybiAiIgorCX0KKwlyZXR1cm4gcC5uYW1lCit9CisKK2Z1bmMgKHAgKmZpZWxkKSBUeXBlSWQoKSBUVHlwZSB7CisJaWYgcCA9PSBuaWwgeworCQlyZXR1cm4gVFR5cGUoVk9JRCkKKwl9CisJcmV0dXJuIHAudHlwZUlkCit9CisKK2Z1bmMgKHAgKmZpZWxkKSBJZCgpIGludCB7CisJaWYgcCA9PSBuaWwgeworCQlyZXR1cm4gLTEKKwl9CisJcmV0dXJuIHAuaWQKK30KKworZnVuYyAocCAqZmllbGQpIFN0cmluZygpIHN0cmluZyB7CisJaWYgcCA9PSBuaWwgeworCQlyZXR1cm4gIjxuaWw+IgorCX0KKwlyZXR1cm4gIjxURmllbGQgbmFtZTonIiArIHAubmFtZSArICInIHR5cGU6IiArIHN0cmluZyhwLnR5cGVJZCkgKyAiIGZpZWxkLWlkOiIgKyBzdHJpbmcocC5pZCkgKyAiPiIKK30KKwordmFyIEFOT05ZTU9VU19GSUVMRCAqZmllbGQKKwordHlwZSBmaWVsZFNsaWNlIFtdZmllbGQKKworZnVuYyAocCBmaWVsZFNsaWNlKSBMZW4oKSBpbnQgeworCXJldHVybiBsZW4ocCkKK30KKworZnVuYyAocCBmaWVsZFNsaWNlKSBMZXNzKGksIGogaW50KSBib29sIHsKKwlyZXR1cm4gcFtpXS5JZCgpIDwgcFtqXS5JZCgpCit9CisKK2Z1bmMgKHAgZmllbGRTbGljZSkgU3dhcChpLCBqIGludCkgeworCXBbaV0sIHBbal0gPSBwW2pdLCBwW2ldCit9CisKK2Z1bmMgaW5pdCgpIHsKKwlBTk9OWU1PVVNfRklFTEQgPSBuZXdGaWVsZCgiIiwgU1RPUCwgMCkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWZhNjVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9mcmFtZWRfdHJhbnNwb3J0LmdvCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImJ1ZmlvIgorCSJieXRlcyIKKwkiY29udGV4dCIKKwkiZW5jb2RpbmcvYmluYXJ5IgorCSJmbXQiCisJImlvIgorKQorCitjb25zdCBERUZBVUxUX01BWF9MRU5HVEggPSAxNjM4NDAwMAorCit0eXBlIFRGcmFtZWRUcmFuc3BvcnQgc3RydWN0IHsKKwl0cmFuc3BvcnQgVFRyYW5zcG9ydAorCWJ1ZiAgICAgICBieXRlcy5CdWZmZXIKKwlyZWFkZXIgICAgKmJ1ZmlvLlJlYWRlcgorCWZyYW1lU2l6ZSB1aW50MzIgLy9DdXJyZW50IHJlbWFpbmluZyBzaXplIG9mIHRoZSBmcmFtZS4gaWYgPT0wIHJlYWQgbmV4dCBmcmFtZSBoZWFkZXIKKwlidWZmZXIgICAgWzRdYnl0ZQorCW1heExlbmd0aCB1aW50MzIKK30KKwordHlwZSB0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3QgeworCWZhY3RvcnkgICBUVHJhbnNwb3J0RmFjdG9yeQorCW1heExlbmd0aCB1aW50MzIKK30KKworZnVuYyBOZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeShmYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5KSBUVHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuICZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeXtmYWN0b3J5OiBmYWN0b3J5LCBtYXhMZW5ndGg6IERFRkFVTFRfTUFYX0xFTkdUSH0KK30KKworZnVuYyBOZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeU1heExlbmd0aChmYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5LCBtYXhMZW5ndGggdWludDMyKSBUVHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuICZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeXtmYWN0b3J5OiBmYWN0b3J5LCBtYXhMZW5ndGg6IG1heExlbmd0aH0KK30KKworZnVuYyAocCAqdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydChiYXNlIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXR0LCBlcnIgOj0gcC5mYWN0b3J5LkdldFRyYW5zcG9ydChiYXNlKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJcmV0dXJuIE5ld1RGcmFtZWRUcmFuc3BvcnRNYXhMZW5ndGgodHQsIHAubWF4TGVuZ3RoKSwgbmlsCit9CisKK2Z1bmMgTmV3VEZyYW1lZFRyYW5zcG9ydCh0cmFuc3BvcnQgVFRyYW5zcG9ydCkgKlRGcmFtZWRUcmFuc3BvcnQgeworCXJldHVybiAmVEZyYW1lZFRyYW5zcG9ydHt0cmFuc3BvcnQ6IHRyYW5zcG9ydCwgcmVhZGVyOiBidWZpby5OZXdSZWFkZXIodHJhbnNwb3J0KSwgbWF4TGVuZ3RoOiBERUZBVUxUX01BWF9MRU5HVEh9Cit9CisKK2Z1bmMgTmV3VEZyYW1lZFRyYW5zcG9ydE1heExlbmd0aCh0cmFuc3BvcnQgVFRyYW5zcG9ydCwgbWF4TGVuZ3RoIHVpbnQzMikgKlRGcmFtZWRUcmFuc3BvcnQgeworCXJldHVybiAmVEZyYW1lZFRyYW5zcG9ydHt0cmFuc3BvcnQ6IHRyYW5zcG9ydCwgcmVhZGVyOiBidWZpby5OZXdSZWFkZXIodHJhbnNwb3J0KSwgbWF4TGVuZ3RoOiBtYXhMZW5ndGh9Cit9CisKK2Z1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIE9wZW4oKSBlcnJvciB7CisJcmV0dXJuIHAudHJhbnNwb3J0Lk9wZW4oKQorfQorCitmdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBJc09wZW4oKSBib29sIHsKKwlyZXR1cm4gcC50cmFuc3BvcnQuSXNPcGVuKCkKK30KKworZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgQ2xvc2UoKSBlcnJvciB7CisJcmV0dXJuIHAudHJhbnNwb3J0LkNsb3NlKCkKK30KKworZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgUmVhZChidWYgW11ieXRlKSAobCBpbnQsIGVyciBlcnJvcikgeworCWlmIHAuZnJhbWVTaXplID09IDAgeworCQlwLmZyYW1lU2l6ZSwgZXJyID0gcC5yZWFkRnJhbWVIZWFkZXIoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybgorCQl9CisJfQorCWlmIHAuZnJhbWVTaXplIDwgdWludDMyKGxlbihidWYpKSB7CisJCWZyYW1lU2l6ZSA6PSBwLmZyYW1lU2l6ZQorCQl0bXAgOj0gbWFrZShbXWJ5dGUsIHAuZnJhbWVTaXplKQorCQlsLCBlcnIgPSBwLlJlYWQodG1wKQorCQljb3B5KGJ1ZiwgdG1wKQorCQlpZiBlcnIgPT0gbmlsIHsKKwkJCWVyciA9IE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZm10LkVycm9yZigiTm90IGVub3VnaCBmcmFtZSBzaXplICVkIHRvIHJlYWQgJWQgYnl0ZXMiLCBmcmFtZVNpemUsIGxlbihidWYpKSkKKwkJCXJldHVybgorCQl9CisJfQorCWdvdCwgZXJyIDo9IHAucmVhZGVyLlJlYWQoYnVmKQorCXAuZnJhbWVTaXplID0gcC5mcmFtZVNpemUgLSB1aW50MzIoZ290KQorCS8vc2FuaXR5IGNoZWNrCisJaWYgcC5mcmFtZVNpemUgPCAwIHsKKwkJcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oVU5LTk9XTl9UUkFOU1BPUlRfRVhDRVBUSU9OLCAiTmVnYXRpdmUgZnJhbWUgc2l6ZSIpCisJfQorCXJldHVybiBnb3QsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorfQorCitmdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBSZWFkQnl0ZSgpIChjIGJ5dGUsIGVyciBlcnJvcikgeworCWlmIHAuZnJhbWVTaXplID09IDAgeworCQlwLmZyYW1lU2l6ZSwgZXJyID0gcC5yZWFkRnJhbWVIZWFkZXIoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybgorCQl9CisJfQorCWlmIHAuZnJhbWVTaXplIDwgMSB7CisJCXJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGZtdC5FcnJvcmYoIk5vdCBlbm91Z2ggZnJhbWUgc2l6ZSAlZCB0byByZWFkICVkIGJ5dGVzIiwgcC5mcmFtZVNpemUsIDEpKQorCX0KKwljLCBlcnIgPSBwLnJlYWRlci5SZWFkQnl0ZSgpCisJaWYgZXJyID09IG5pbCB7CisJCXAuZnJhbWVTaXplLS0KKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIFdyaXRlKGJ1ZiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJbiwgZXJyIDo9IHAuYnVmLldyaXRlKGJ1ZikKKwlyZXR1cm4gbiwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCit9CisKK2Z1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIFdyaXRlQnl0ZShjIGJ5dGUpIGVycm9yIHsKKwlyZXR1cm4gcC5idWYuV3JpdGVCeXRlKGMpCit9CisKK2Z1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIFdyaXRlU3RyaW5nKHMgc3RyaW5nKSAobiBpbnQsIGVyciBlcnJvcikgeworCXJldHVybiBwLmJ1Zi5Xcml0ZVN0cmluZyhzKQorfQorCitmdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CisJc2l6ZSA6PSBwLmJ1Zi5MZW4oKQorCWJ1ZiA6PSBwLmJ1ZmZlcls6NF0KKwliaW5hcnkuQmlnRW5kaWFuLlB1dFVpbnQzMihidWYsIHVpbnQzMihzaXplKSkKKwlfLCBlcnIgOj0gcC50cmFuc3BvcnQuV3JpdGUoYnVmKQorCWlmIGVyciAhPSBuaWwgeworCQlwLmJ1Zi5UcnVuY2F0ZSgwKQorCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCisJfQorCWlmIHNpemUgPiAwIHsKKwkJaWYgbiwgZXJyIDo9IHAuYnVmLldyaXRlVG8ocC50cmFuc3BvcnQpOyBlcnIgIT0gbmlsIHsKKwkJCXByaW50KCJFcnJvciB3aGlsZSBmbHVzaGluZyB3cml0ZSBidWZmZXIgb2Ygc2l6ZSAiLCBzaXplLCAiIHRvIHRyYW5zcG9ydCwgb25seSB3cm90ZSAiLCBuLCAiIGJ5dGVzOiAiLCBlcnIuRXJyb3IoKSwgIlxuIikKKwkJCXAuYnVmLlRydW5jYXRlKDApCisJCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCisJCX0KKwl9CisJZXJyID0gcC50cmFuc3BvcnQuRmx1c2goY3R4KQorCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKK30KKworZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgcmVhZEZyYW1lSGVhZGVyKCkgKHVpbnQzMiwgZXJyb3IpIHsKKwlidWYgOj0gcC5idWZmZXJbOjRdCisJaWYgXywgZXJyIDo9IGlvLlJlYWRGdWxsKHAucmVhZGVyLCBidWYpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIDAsIGVycgorCX0KKwlzaXplIDo9IGJpbmFyeS5CaWdFbmRpYW4uVWludDMyKGJ1ZikKKwlpZiBzaXplIDwgMCB8fCBzaXplID4gcC5tYXhMZW5ndGggeworCQlyZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04sIGZtdC5TcHJpbnRmKCJJbmNvcnJlY3QgZnJhbWUgc2l6ZSAoJWQpIiwgc2l6ZSkpCisJfQorCXJldHVybiBzaXplLCBuaWwKK30KKworZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgeworCXJldHVybiB1aW50NjQocC5mcmFtZVNpemUpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2ZyYW1lZF90cmFuc3BvcnRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNjgzZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2ZyYW1lZF90cmFuc3BvcnRfdGVzdC5nbwpAQCAtMCwwICsxLDI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdEZyYW1lZFRyYW5zcG9ydCh0ICp0ZXN0aW5nLlQpIHsKKwl0cmFucyA6PSBOZXdURnJhbWVkVHJhbnNwb3J0KE5ld1RNZW1vcnlCdWZmZXIoKSkKKwlUcmFuc3BvcnRUZXN0KHQsIHRyYW5zLCB0cmFucykKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvaHR0cF9jbGllbnQuZ28gYi9saWIvZ28vdGhyaWZ0L2h0dHBfY2xpZW50LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjODJiZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2h0dHBfY2xpZW50LmdvCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImJ5dGVzIgorCSJjb250ZXh0IgorCSJpbyIKKwkiaW8vaW91dGlsIgorCSJuZXQvaHR0cCIKKwkibmV0L3VybCIKKwkic3RyY29udiIKKykKKworLy8gRGVmYXVsdCB0byB1c2luZyB0aGUgc2hhcmVkIGh0dHAgY2xpZW50LiBMaWJyYXJ5IHVzZXJzIGFyZQorLy8gZnJlZSB0byBjaGFuZ2UgdGhpcyBnbG9iYWwgY2xpZW50IG9yIHNwZWNpZnkgb25lIHRocm91Z2gKKy8vIFRIdHRwQ2xpZW50T3B0aW9ucy4KK3ZhciBEZWZhdWx0SHR0cENsaWVudCAqaHR0cC5DbGllbnQgPSBodHRwLkRlZmF1bHRDbGllbnQKKwordHlwZSBUSHR0cENsaWVudCBzdHJ1Y3QgeworCWNsaWVudCAgICAgICAgICAgICAqaHR0cC5DbGllbnQKKwlyZXNwb25zZSAgICAgICAgICAgKmh0dHAuUmVzcG9uc2UKKwl1cmwgICAgICAgICAgICAgICAgKnVybC5VUkwKKwlyZXF1ZXN0QnVmZmVyICAgICAgKmJ5dGVzLkJ1ZmZlcgorCWhlYWRlciAgICAgICAgICAgICBodHRwLkhlYWRlcgorCW5zZWNDb25uZWN0VGltZW91dCBpbnQ2NAorCW5zZWNSZWFkVGltZW91dCAgICBpbnQ2NAorfQorCit0eXBlIFRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3QgeworCW9wdGlvbnMgVEh0dHBDbGllbnRPcHRpb25zCisJdXJsICAgICBzdHJpbmcKK30KKworZnVuYyAocCAqVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJaWYgdHJhbnMgIT0gbmlsIHsKKwkJdCwgb2sgOj0gdHJhbnMuKCpUSHR0cENsaWVudCkKKwkJaWYgb2sgJiYgdC51cmwgIT0gbmlsIHsKKwkJCXJldHVybiBOZXdUSHR0cENsaWVudFdpdGhPcHRpb25zKHQudXJsLlN0cmluZygpLCBwLm9wdGlvbnMpCisJCX0KKwl9CisJcmV0dXJuIE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnMocC51cmwsIHAub3B0aW9ucykKK30KKwordHlwZSBUSHR0cENsaWVudE9wdGlvbnMgc3RydWN0IHsKKwkvLyBJZiBuaWwsIERlZmF1bHRIdHRwQ2xpZW50IGlzIHVzZWQKKwlDbGllbnQgKmh0dHAuQ2xpZW50Cit9CisKK2Z1bmMgTmV3VEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5KHVybCBzdHJpbmcpICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiBOZXdUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnlXaXRoT3B0aW9ucyh1cmwsIFRIdHRwQ2xpZW50T3B0aW9uc3t9KQorfQorCitmdW5jIE5ld1RIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeVdpdGhPcHRpb25zKHVybCBzdHJpbmcsIG9wdGlvbnMgVEh0dHBDbGllbnRPcHRpb25zKSAqVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gJlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeXt1cmw6IHVybCwgb3B0aW9uczogb3B0aW9uc30KK30KKworZnVuYyBOZXdUSHR0cENsaWVudFdpdGhPcHRpb25zKHVybHN0ciBzdHJpbmcsIG9wdGlvbnMgVEh0dHBDbGllbnRPcHRpb25zKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlwYXJzZWRVUkwsIGVyciA6PSB1cmwuUGFyc2UodXJsc3RyKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJYnVmIDo9IG1ha2UoW11ieXRlLCAwLCAxMDI0KQorCWNsaWVudCA6PSBvcHRpb25zLkNsaWVudAorCWlmIGNsaWVudCA9PSBuaWwgeworCQljbGllbnQgPSBEZWZhdWx0SHR0cENsaWVudAorCX0KKwlodHRwSGVhZGVyIDo9IG1hcFtzdHJpbmddW11zdHJpbmd7IkNvbnRlbnQtVHlwZSI6IHsiYXBwbGljYXRpb24veC10aHJpZnQifX0KKwlyZXR1cm4gJlRIdHRwQ2xpZW50e2NsaWVudDogY2xpZW50LCB1cmw6IHBhcnNlZFVSTCwgcmVxdWVzdEJ1ZmZlcjogYnl0ZXMuTmV3QnVmZmVyKGJ1ZiksIGhlYWRlcjogaHR0cEhlYWRlcn0sIG5pbAorfQorCitmdW5jIE5ld1RIdHRwQ2xpZW50KHVybHN0ciBzdHJpbmcpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiBOZXdUSHR0cENsaWVudFdpdGhPcHRpb25zKHVybHN0ciwgVEh0dHBDbGllbnRPcHRpb25ze30pCit9CisKKy8vIFNldCB0aGUgSFRUUCBIZWFkZXIgZm9yIHRoaXMgc3BlY2lmaWMgVGhyaWZ0IFRyYW5zcG9ydAorLy8gSXQgaXMgaW1wb3J0YW50IHRoYXQgeW91IGZpcnN0IGFzc2VydCB0aGUgVFRyYW5zcG9ydCBhcyBhIFRIdHRwQ2xpZW50IHR5cGUKKy8vIGxpa2Ugc286CisvLworLy8gaHR0cFRyYW5zIDo9IHRyYW5zLihUSHR0cENsaWVudCkKKy8vIGh0dHBUcmFucy5TZXRIZWFkZXIoIlVzZXItQWdlbnQiLCJUaHJpZnQgQ2xpZW50IDEuMCIpCitmdW5jIChwICpUSHR0cENsaWVudCkgU2V0SGVhZGVyKGtleSBzdHJpbmcsIHZhbHVlIHN0cmluZykgeworCXAuaGVhZGVyLkFkZChrZXksIHZhbHVlKQorfQorCisvLyBHZXQgdGhlIEhUVFAgSGVhZGVyIHJlcHJlc2VudGVkIGJ5IHRoZSBzdXBwbGllZCBIZWFkZXIgS2V5IGZvciB0aGlzIHNwZWNpZmljIFRocmlmdCBUcmFuc3BvcnQKKy8vIEl0IGlzIGltcG9ydGFudCB0aGF0IHlvdSBmaXJzdCBhc3NlcnQgdGhlIFRUcmFuc3BvcnQgYXMgYSBUSHR0cENsaWVudCB0eXBlCisvLyBsaWtlIHNvOgorLy8KKy8vIGh0dHBUcmFucyA6PSB0cmFucy4oVEh0dHBDbGllbnQpCisvLyBoZHJWYWx1ZSA6PSBodHRwVHJhbnMuR2V0SGVhZGVyKCJVc2VyLUFnZW50IikKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBHZXRIZWFkZXIoa2V5IHN0cmluZykgc3RyaW5nIHsKKwlyZXR1cm4gcC5oZWFkZXIuR2V0KGtleSkKK30KKworLy8gRGVsZXRlcyB0aGUgSFRUUCBIZWFkZXIgZ2l2ZW4gYSBIZWFkZXIgS2V5IGZvciB0aGlzIHNwZWNpZmljIFRocmlmdCBUcmFuc3BvcnQKKy8vIEl0IGlzIGltcG9ydGFudCB0aGF0IHlvdSBmaXJzdCBhc3NlcnQgdGhlIFRUcmFuc3BvcnQgYXMgYSBUSHR0cENsaWVudCB0eXBlCisvLyBsaWtlIHNvOgorLy8KKy8vIGh0dHBUcmFucyA6PSB0cmFucy4oVEh0dHBDbGllbnQpCisvLyBodHRwVHJhbnMuRGVsSGVhZGVyKCJVc2VyLUFnZW50IikKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBEZWxIZWFkZXIoa2V5IHN0cmluZykgeworCXAuaGVhZGVyLkRlbChrZXkpCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBPcGVuKCkgZXJyb3IgeworCS8vIGRvIG5vdGhpbmcKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBJc09wZW4oKSBib29sIHsKKwlyZXR1cm4gcC5yZXNwb25zZSAhPSBuaWwgfHwgcC5yZXF1ZXN0QnVmZmVyICE9IG5pbAorfQorCitmdW5jIChwICpUSHR0cENsaWVudCkgY2xvc2VSZXNwb25zZSgpIGVycm9yIHsKKwl2YXIgZXJyIGVycm9yCisJaWYgcC5yZXNwb25zZSAhPSBuaWwgJiYgcC5yZXNwb25zZS5Cb2R5ICE9IG5pbCB7CisJCS8vIFRoZSBkb2NzIHNwZWNpZnkgdGhhdCBpZiBrZWVwYWxpdmUgaXMgZW5hYmxlZCBhbmQgdGhlIHJlc3BvbnNlIGJvZHkgaXMgbm90CisJCS8vIHJlYWQgdG8gY29tcGxldGlvbiB0aGUgY29ubmVjdGlvbiB3aWxsIG5ldmVyIGJlIHJldHVybmVkIHRvIHRoZSBwb29sIGFuZAorCQkvLyByZXVzZWQuIEVycm9ycyBhcmUgYmVpbmcgaWdub3JlZCBoZXJlIGJlY2F1c2UgaWYgdGhlIGNvbm5lY3Rpb24gaXMgaW52YWxpZAorCQkvLyBhbmQgdGhpcyBmYWlscyBmb3Igc29tZSByZWFzb24sIHRoZSBDbG9zZSgpIG1ldGhvZCB3aWxsIGRvIGFueSByZW1haW5pbmcKKwkJLy8gY2xlYW51cC4KKwkJaW8uQ29weShpb3V0aWwuRGlzY2FyZCwgcC5yZXNwb25zZS5Cb2R5KQorCisJCWVyciA9IHAucmVzcG9uc2UuQm9keS5DbG9zZSgpCisJfQorCisJcC5yZXNwb25zZSA9IG5pbAorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqVEh0dHBDbGllbnQpIENsb3NlKCkgZXJyb3IgeworCWlmIHAucmVxdWVzdEJ1ZmZlciAhPSBuaWwgeworCQlwLnJlcXVlc3RCdWZmZXIuUmVzZXQoKQorCQlwLnJlcXVlc3RCdWZmZXIgPSBuaWwKKwl9CisJcmV0dXJuIHAuY2xvc2VSZXNwb25zZSgpCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBSZWFkKGJ1ZiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJaWYgcC5yZXNwb25zZSA9PSBuaWwgeworCQlyZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIlJlc3BvbnNlIGJ1ZmZlciBpcyBlbXB0eSwgbm8gcmVxdWVzdC4iKQorCX0KKwluLCBlcnIgOj0gcC5yZXNwb25zZS5Cb2R5LlJlYWQoYnVmKQorCWlmIG4gPiAwICYmIChlcnIgPT0gbmlsIHx8IGVyciA9PSBpby5FT0YpIHsKKwkJcmV0dXJuIG4sIG5pbAorCX0KKwlyZXR1cm4gbiwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBSZWFkQnl0ZSgpIChjIGJ5dGUsIGVyciBlcnJvcikgeworCXJldHVybiByZWFkQnl0ZShwLnJlc3BvbnNlLkJvZHkpCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBXcml0ZShidWYgW11ieXRlKSAoaW50LCBlcnJvcikgeworCW4sIGVyciA6PSBwLnJlcXVlc3RCdWZmZXIuV3JpdGUoYnVmKQorCXJldHVybiBuLCBlcnIKK30KKworZnVuYyAocCAqVEh0dHBDbGllbnQpIFdyaXRlQnl0ZShjIGJ5dGUpIGVycm9yIHsKKwlyZXR1cm4gcC5yZXF1ZXN0QnVmZmVyLldyaXRlQnl0ZShjKQorfQorCitmdW5jIChwICpUSHR0cENsaWVudCkgV3JpdGVTdHJpbmcocyBzdHJpbmcpIChuIGludCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHAucmVxdWVzdEJ1ZmZlci5Xcml0ZVN0cmluZyhzKQorfQorCitmdW5jIChwICpUSHR0cENsaWVudCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgeworCS8vIENsb3NlIGFueSBwcmV2aW91cyByZXNwb25zZSBib2R5IHRvIGF2b2lkIGxlYWtpbmcgY29ubmVjdGlvbnMuCisJcC5jbG9zZVJlc3BvbnNlKCkKKworCXJlcSwgZXJyIDo9IGh0dHAuTmV3UmVxdWVzdCgiUE9TVCIsIHAudXJsLlN0cmluZygpLCBwLnJlcXVlc3RCdWZmZXIpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKKwl9CisJcmVxLkhlYWRlciA9IHAuaGVhZGVyCisJaWYgY3R4ICE9IG5pbCB7CisJCXJlcSA9IHJlcS5XaXRoQ29udGV4dChjdHgpCisJfQorCXJlc3BvbnNlLCBlcnIgOj0gcC5jbGllbnQuRG8ocmVxKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCisJfQorCWlmIHJlc3BvbnNlLlN0YXR1c0NvZGUgIT0gaHR0cC5TdGF0dXNPSyB7CisJCS8vIENsb3NlIHRoZSByZXNwb25zZSB0byBhdm9pZCBsZWFraW5nIGZpbGUgZGVzY3JpcHRvcnMuIGNsb3NlUmVzcG9uc2UgZG9lcworCQkvLyBtb3JlIHRoYW4ganVzdCBjYWxsIENsb3NlKCksIHNvIHRlbXBvcmFyaWx5IGFzc2lnbiBpdCBhbmQgcmV1c2UgdGhlIGxvZ2ljLgorCQlwLnJlc3BvbnNlID0gcmVzcG9uc2UKKwkJcC5jbG9zZVJlc3BvbnNlKCkKKworCQkvLyBUT0RPKHBvbWFjaykgbG9nIGJhZCByZXNwb25zZQorCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04sICJIVFRQIFJlc3BvbnNlIGNvZGU6ICIrc3RyY29udi5JdG9hKHJlc3BvbnNlLlN0YXR1c0NvZGUpKQorCX0KKwlwLnJlc3BvbnNlID0gcmVzcG9uc2UKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBSZW1haW5pbmdCeXRlcygpIChudW1fYnl0ZXMgdWludDY0KSB7CisJbGVuIDo9IHAucmVzcG9uc2UuQ29udGVudExlbmd0aAorCWlmIGxlbiA+PSAwIHsKKwkJcmV0dXJuIHVpbnQ2NChsZW4pCisJfQorCisJY29uc3QgbWF4U2l6ZSA9IF51aW50NjQoMCkKKwlyZXR1cm4gbWF4U2l6ZSAvLyB0aGUgdGhydXRoIGlzLCB3ZSBqdXN0IGRvbid0IGtub3cgdW5sZXNzIGZyYW1lZCBpcyB1c2VkCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBOZXdUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgaW5zdGVhZC4KK2Z1bmMgTmV3VEh0dHBQb3N0Q2xpZW50VHJhbnNwb3J0RmFjdG9yeSh1cmwgc3RyaW5nKSAqVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gTmV3VEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5V2l0aE9wdGlvbnModXJsLCBUSHR0cENsaWVudE9wdGlvbnN7fSkKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIE5ld1RIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeVdpdGhPcHRpb25zIGluc3RlYWQuCitmdW5jIE5ld1RIdHRwUG9zdENsaWVudFRyYW5zcG9ydEZhY3RvcnlXaXRoT3B0aW9ucyh1cmwgc3RyaW5nLCBvcHRpb25zIFRIdHRwQ2xpZW50T3B0aW9ucykgKlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuIE5ld1RIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeVdpdGhPcHRpb25zKHVybCwgb3B0aW9ucykKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnMgaW5zdGVhZC4KK2Z1bmMgTmV3VEh0dHBQb3N0Q2xpZW50V2l0aE9wdGlvbnModXJsc3RyIHN0cmluZywgb3B0aW9ucyBUSHR0cENsaWVudE9wdGlvbnMpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiBOZXdUSHR0cENsaWVudFdpdGhPcHRpb25zKHVybHN0ciwgb3B0aW9ucykKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIE5ld1RIdHRwQ2xpZW50IGluc3RlYWQuCitmdW5jIE5ld1RIdHRwUG9zdENsaWVudCh1cmxzdHIgc3RyaW5nKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VEh0dHBDbGllbnRXaXRoT3B0aW9ucyh1cmxzdHIsIFRIdHRwQ2xpZW50T3B0aW9uc3t9KQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9odHRwX2NsaWVudF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9odHRwX2NsaWVudF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MzY4MGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2h0dHBfY2xpZW50X3Rlc3QuZ28KQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkibmV0L2h0dHAiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdEh0dHBDbGllbnQodCAqdGVzdGluZy5UKSB7CisJbCwgYWRkciA6PSBIdHRwQ2xpZW50U2V0dXBGb3JUZXN0KHQpCisJaWYgbCAhPSBuaWwgeworCQlkZWZlciBsLkNsb3NlKCkKKwl9CisJdHJhbnMsIGVyciA6PSBOZXdUSHR0cFBvc3RDbGllbnQoImh0dHA6Ly8iICsgYWRkci5TdHJpbmcoKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJbC5DbG9zZSgpCisJCXQuRmF0YWxmKCJVbmFibGUgdG8gY29ubmVjdCB0byAlczogJXMiLCBhZGRyLlN0cmluZygpLCBlcnIpCisJfQorCVRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQorfQorCitmdW5jIFRlc3RIdHRwQ2xpZW50SGVhZGVycyh0ICp0ZXN0aW5nLlQpIHsKKwlsLCBhZGRyIDo9IEh0dHBDbGllbnRTZXR1cEZvclRlc3QodCkKKwlpZiBsICE9IG5pbCB7CisJCWRlZmVyIGwuQ2xvc2UoKQorCX0KKwl0cmFucywgZXJyIDo9IE5ld1RIdHRwUG9zdENsaWVudCgiaHR0cDovLyIgKyBhZGRyLlN0cmluZygpKQorCWlmIGVyciAhPSBuaWwgeworCQlsLkNsb3NlKCkKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byBjb25uZWN0IHRvICVzOiAlcyIsIGFkZHIuU3RyaW5nKCksIGVycikKKwl9CisJVHJhbnNwb3J0SGVhZGVyVGVzdCh0LCB0cmFucywgdHJhbnMpCit9CisKK2Z1bmMgVGVzdEh0dHBDdXN0b21DbGllbnQodCAqdGVzdGluZy5UKSB7CisJbCwgYWRkciA6PSBIdHRwQ2xpZW50U2V0dXBGb3JUZXN0KHQpCisJaWYgbCAhPSBuaWwgeworCQlkZWZlciBsLkNsb3NlKCkKKwl9CisKKwlodHRwVHJhbnNwb3J0IDo9ICZjdXN0b21IdHRwVHJhbnNwb3J0e30KKworCXRyYW5zLCBlcnIgOj0gTmV3VEh0dHBQb3N0Q2xpZW50V2l0aE9wdGlvbnMoImh0dHA6Ly8iK2FkZHIuU3RyaW5nKCksIFRIdHRwQ2xpZW50T3B0aW9uc3sKKwkJQ2xpZW50OiAmaHR0cC5DbGllbnR7CisJCQlUcmFuc3BvcnQ6IGh0dHBUcmFuc3BvcnQsCisJCX0sCisJfSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJbC5DbG9zZSgpCisJCXQuRmF0YWxmKCJVbmFibGUgdG8gY29ubmVjdCB0byAlczogJXMiLCBhZGRyLlN0cmluZygpLCBlcnIpCisJfQorCVRyYW5zcG9ydEhlYWRlclRlc3QodCwgdHJhbnMsIHRyYW5zKQorCisJaWYgIWh0dHBUcmFuc3BvcnQuaGl0IHsKKwkJdC5GYXRhbGYoIkN1c3RvbSBjbGllbnQgd2FzIG5vdCB1c2VkIikKKwl9Cit9CisKK2Z1bmMgVGVzdEh0dHBDdXN0b21DbGllbnRQYWNrYWdlU2NvcGUodCAqdGVzdGluZy5UKSB7CisJbCwgYWRkciA6PSBIdHRwQ2xpZW50U2V0dXBGb3JUZXN0KHQpCisJaWYgbCAhPSBuaWwgeworCQlkZWZlciBsLkNsb3NlKCkKKwl9CisJaHR0cFRyYW5zcG9ydCA6PSAmY3VzdG9tSHR0cFRyYW5zcG9ydHt9CisJRGVmYXVsdEh0dHBDbGllbnQgPSAmaHR0cC5DbGllbnR7CisJCVRyYW5zcG9ydDogaHR0cFRyYW5zcG9ydCwKKwl9CisKKwl0cmFucywgZXJyIDo9IE5ld1RIdHRwUG9zdENsaWVudCgiaHR0cDovLyIgKyBhZGRyLlN0cmluZygpKQorCWlmIGVyciAhPSBuaWwgeworCQlsLkNsb3NlKCkKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byBjb25uZWN0IHRvICVzOiAlcyIsIGFkZHIuU3RyaW5nKCksIGVycikKKwl9CisJVHJhbnNwb3J0SGVhZGVyVGVzdCh0LCB0cmFucywgdHJhbnMpCisKKwlpZiAhaHR0cFRyYW5zcG9ydC5oaXQgeworCQl0LkZhdGFsZigiQ3VzdG9tIGNsaWVudCB3YXMgbm90IHVzZWQiKQorCX0KK30KKwordHlwZSBjdXN0b21IdHRwVHJhbnNwb3J0IHN0cnVjdCB7CisJaGl0IGJvb2wKK30KKworZnVuYyAoYyAqY3VzdG9tSHR0cFRyYW5zcG9ydCkgUm91bmRUcmlwKHJlcSAqaHR0cC5SZXF1ZXN0KSAoKmh0dHAuUmVzcG9uc2UsIGVycm9yKSB7CisJYy5oaXQgPSB0cnVlCisJcmV0dXJuIGh0dHAuRGVmYXVsdFRyYW5zcG9ydC5Sb3VuZFRyaXAocmVxKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9odHRwX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvaHR0cF90cmFuc3BvcnQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZmMGYzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvaHR0cF90cmFuc3BvcnQuZ28KQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb21wcmVzcy9nemlwIgorCSJpbyIKKwkibmV0L2h0dHAiCisJInN0cmluZ3MiCispCisKKy8vIE5ld1RocmlmdEhhbmRsZXJGdW5jIGlzIGEgZnVuY3Rpb24gdGhhdCBjcmVhdGUgYSByZWFkeSB0byB1c2UgQXBhY2hlIFRocmlmdCBIYW5kbGVyIGZ1bmN0aW9uCitmdW5jIE5ld1RocmlmdEhhbmRsZXJGdW5jKHByb2Nlc3NvciBUUHJvY2Vzc29yLAorCWluUGZhY3RvcnksIG91dFBmYWN0b3J5IFRQcm90b2NvbEZhY3RvcnkpIGZ1bmModyBodHRwLlJlc3BvbnNlV3JpdGVyLCByICpodHRwLlJlcXVlc3QpIHsKKworCXJldHVybiBneihmdW5jKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0KSB7CisJCXcuSGVhZGVyKCkuQWRkKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQorCisJCXRyYW5zcG9ydCA6PSBOZXdTdHJlYW1UcmFuc3BvcnQoci5Cb2R5LCB3KQorCQlwcm9jZXNzb3IuUHJvY2VzcyhyLkNvbnRleHQoKSwgaW5QZmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpLCBvdXRQZmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpKQorCX0pCit9CisKKy8vIGd6IHRyYW5zcGFyZW50bHkgY29tcHJlc3NlcyB0aGUgSFRUUCByZXNwb25zZSBpZiB0aGUgY2xpZW50IHN1cHBvcnRzIGl0LgorZnVuYyBneihoYW5kbGVyIGh0dHAuSGFuZGxlckZ1bmMpIGh0dHAuSGFuZGxlckZ1bmMgeworCXJldHVybiBmdW5jKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0KSB7CisJCWlmICFzdHJpbmdzLkNvbnRhaW5zKHIuSGVhZGVyLkdldCgiQWNjZXB0LUVuY29kaW5nIiksICJnemlwIikgeworCQkJaGFuZGxlcih3LCByKQorCQkJcmV0dXJuCisJCX0KKwkJdy5IZWFkZXIoKS5TZXQoIkNvbnRlbnQtRW5jb2RpbmciLCAiZ3ppcCIpCisJCWd6IDo9IGd6aXAuTmV3V3JpdGVyKHcpCisJCWRlZmVyIGd6LkNsb3NlKCkKKwkJZ3p3IDo9IGd6aXBSZXNwb25zZVdyaXRlcntXcml0ZXI6IGd6LCBSZXNwb25zZVdyaXRlcjogd30KKwkJaGFuZGxlcihnencsIHIpCisJfQorfQorCit0eXBlIGd6aXBSZXNwb25zZVdyaXRlciBzdHJ1Y3QgeworCWlvLldyaXRlcgorCWh0dHAuUmVzcG9uc2VXcml0ZXIKK30KKworZnVuYyAodyBnemlwUmVzcG9uc2VXcml0ZXIpIFdyaXRlKGIgW11ieXRlKSAoaW50LCBlcnJvcikgeworCXJldHVybiB3LldyaXRlci5Xcml0ZShiKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9pb3N0cmVhbV90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L2lvc3RyZWFtX3RyYW5zcG9ydC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWE5M2JjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9pb3N0cmVhbV90cmFuc3BvcnQuZ28KQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiYnVmaW8iCisJImNvbnRleHQiCisJImlvIgorKQorCisvLyBTdHJlYW1UcmFuc3BvcnQgaXMgYSBUcmFuc3BvcnQgbWFkZSBvZiBhbiBpby5SZWFkZXIgYW5kL29yIGFuIGlvLldyaXRlcgordHlwZSBTdHJlYW1UcmFuc3BvcnQgc3RydWN0IHsKKwlpby5SZWFkZXIKKwlpby5Xcml0ZXIKKwlpc1JlYWRXcml0ZXIgYm9vbAorCWNsb3NlZCAgICAgICBib29sCit9CisKK3R5cGUgU3RyZWFtVHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3QgeworCVJlYWRlciAgICAgICBpby5SZWFkZXIKKwlXcml0ZXIgICAgICAgaW8uV3JpdGVyCisJaXNSZWFkV3JpdGVyIGJvb2wKK30KKworZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCWlmIHRyYW5zICE9IG5pbCB7CisJCXQsIG9rIDo9IHRyYW5zLigqU3RyZWFtVHJhbnNwb3J0KQorCQlpZiBvayB7CisJCQlpZiB0LmlzUmVhZFdyaXRlciB7CisJCQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFJXKHQuUmVhZGVyLihpby5SZWFkV3JpdGVyKSksIG5pbAorCQkJfQorCQkJaWYgdC5SZWFkZXIgIT0gbmlsICYmIHQuV3JpdGVyICE9IG5pbCB7CisJCQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydCh0LlJlYWRlciwgdC5Xcml0ZXIpLCBuaWwKKwkJCX0KKwkJCWlmIHQuUmVhZGVyICE9IG5pbCAmJiB0LldyaXRlciA9PSBuaWwgeworCQkJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRSKHQuUmVhZGVyKSwgbmlsCisJCQl9CisJCQlpZiB0LlJlYWRlciA9PSBuaWwgJiYgdC5Xcml0ZXIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0Vyh0LldyaXRlciksIG5pbAorCQkJfQorCQkJcmV0dXJuICZTdHJlYW1UcmFuc3BvcnR7fSwgbmlsCisJCX0KKwl9CisJaWYgcC5pc1JlYWRXcml0ZXIgeworCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0UlcocC5SZWFkZXIuKGlvLlJlYWRXcml0ZXIpKSwgbmlsCisJfQorCWlmIHAuUmVhZGVyICE9IG5pbCAmJiBwLldyaXRlciAhPSBuaWwgeworCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0KHAuUmVhZGVyLCBwLldyaXRlciksIG5pbAorCX0KKwlpZiBwLlJlYWRlciAhPSBuaWwgJiYgcC5Xcml0ZXIgPT0gbmlsIHsKKwkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFIocC5SZWFkZXIpLCBuaWwKKwl9CisJaWYgcC5SZWFkZXIgPT0gbmlsICYmIHAuV3JpdGVyICE9IG5pbCB7CisJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRXKHAuV3JpdGVyKSwgbmlsCisJfQorCXJldHVybiAmU3RyZWFtVHJhbnNwb3J0e30sIG5pbAorfQorCitmdW5jIE5ld1N0cmVhbVRyYW5zcG9ydEZhY3RvcnkocmVhZGVyIGlvLlJlYWRlciwgd3JpdGVyIGlvLldyaXRlciwgaXNSZWFkV3JpdGVyIGJvb2wpICpTdHJlYW1UcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gJlN0cmVhbVRyYW5zcG9ydEZhY3Rvcnl7UmVhZGVyOiByZWFkZXIsIFdyaXRlcjogd3JpdGVyLCBpc1JlYWRXcml0ZXI6IGlzUmVhZFdyaXRlcn0KK30KKworZnVuYyBOZXdTdHJlYW1UcmFuc3BvcnQociBpby5SZWFkZXIsIHcgaW8uV3JpdGVyKSAqU3RyZWFtVHJhbnNwb3J0IHsKKwlyZXR1cm4gJlN0cmVhbVRyYW5zcG9ydHtSZWFkZXI6IGJ1ZmlvLk5ld1JlYWRlcihyKSwgV3JpdGVyOiBidWZpby5OZXdXcml0ZXIodyl9Cit9CisKK2Z1bmMgTmV3U3RyZWFtVHJhbnNwb3J0UihyIGlvLlJlYWRlcikgKlN0cmVhbVRyYW5zcG9ydCB7CisJcmV0dXJuICZTdHJlYW1UcmFuc3BvcnR7UmVhZGVyOiBidWZpby5OZXdSZWFkZXIocil9Cit9CisKK2Z1bmMgTmV3U3RyZWFtVHJhbnNwb3J0Vyh3IGlvLldyaXRlcikgKlN0cmVhbVRyYW5zcG9ydCB7CisJcmV0dXJuICZTdHJlYW1UcmFuc3BvcnR7V3JpdGVyOiBidWZpby5OZXdXcml0ZXIodyl9Cit9CisKK2Z1bmMgTmV3U3RyZWFtVHJhbnNwb3J0UlcocncgaW8uUmVhZFdyaXRlcikgKlN0cmVhbVRyYW5zcG9ydCB7CisJYnVmcncgOj0gYnVmaW8uTmV3UmVhZFdyaXRlcihidWZpby5OZXdSZWFkZXIocncpLCBidWZpby5OZXdXcml0ZXIocncpKQorCXJldHVybiAmU3RyZWFtVHJhbnNwb3J0e1JlYWRlcjogYnVmcncsIFdyaXRlcjogYnVmcncsIGlzUmVhZFdyaXRlcjogdHJ1ZX0KK30KKworZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBJc09wZW4oKSBib29sIHsKKwlyZXR1cm4gIXAuY2xvc2VkCit9CisKKy8vIGltcGxpY2l0bHkgb3BlbmVkIG9uIGNyZWF0aW9uLCBjYW4ndCBiZSByZW9wZW5lZCBvbmNlIGNsb3NlZAorZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBPcGVuKCkgZXJyb3IgeworCWlmICFwLmNsb3NlZCB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKEFMUkVBRFlfT1BFTiwgIlN0cmVhbVRyYW5zcG9ydCBhbHJlYWR5IG9wZW4uIikKKwl9IGVsc2UgeworCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgImNhbm5vdCByZW9wZW4gU3RyZWFtVHJhbnNwb3J0LiIpCisJfQorfQorCisvLyBDbG9zZXMgYm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zLgorZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBDbG9zZSgpIGVycm9yIHsKKwlpZiBwLmNsb3NlZCB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiU3RyZWFtVHJhbnNwb3J0IGFscmVhZHkgY2xvc2VkLiIpCisJfQorCXAuY2xvc2VkID0gdHJ1ZQorCWNsb3NlZFJlYWRlciA6PSBmYWxzZQorCWlmIHAuUmVhZGVyICE9IG5pbCB7CisJCWMsIG9rIDo9IHAuUmVhZGVyLihpby5DbG9zZXIpCisJCWlmIG9rIHsKKwkJCWUgOj0gYy5DbG9zZSgpCisJCQljbG9zZWRSZWFkZXIgPSB0cnVlCisJCQlpZiBlICE9IG5pbCB7CisJCQkJcmV0dXJuIGUKKwkJCX0KKwkJfQorCQlwLlJlYWRlciA9IG5pbAorCX0KKwlpZiBwLldyaXRlciAhPSBuaWwgJiYgKCFjbG9zZWRSZWFkZXIgfHwgIXAuaXNSZWFkV3JpdGVyKSB7CisJCWMsIG9rIDo9IHAuV3JpdGVyLihpby5DbG9zZXIpCisJCWlmIG9rIHsKKwkJCWUgOj0gYy5DbG9zZSgpCisJCQlpZiBlICE9IG5pbCB7CisJCQkJcmV0dXJuIGUKKwkJCX0KKwkJfQorCQlwLldyaXRlciA9IG5pbAorCX0KKwlyZXR1cm4gbmlsCit9CisKKy8vIEZsdXNoZXMgdGhlIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbSBpZiBub3QgbnVsbC4KK2Z1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgeworCWlmIHAuV3JpdGVyID09IG5pbCB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IGZsdXNoIG51bGwgb3V0cHV0U3RyZWFtIikKKwl9CisJZiwgb2sgOj0gcC5Xcml0ZXIuKEZsdXNoZXIpCisJaWYgb2sgeworCQllcnIgOj0gZi5GbHVzaCgpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorCQl9CisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBSZWFkKGMgW11ieXRlKSAobiBpbnQsIGVyciBlcnJvcikgeworCW4sIGVyciA9IHAuUmVhZGVyLlJlYWQoYykKKwlpZiBlcnIgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCisJfQorCXJldHVybgorfQorCitmdW5jIChwICpTdHJlYW1UcmFuc3BvcnQpIFJlYWRCeXRlKCkgKGMgYnl0ZSwgZXJyIGVycm9yKSB7CisJZiwgb2sgOj0gcC5SZWFkZXIuKGlvLkJ5dGVSZWFkZXIpCisJaWYgb2sgeworCQljLCBlcnIgPSBmLlJlYWRCeXRlKCkKKwl9IGVsc2UgeworCQljLCBlcnIgPSByZWFkQnl0ZShwLlJlYWRlcikKKwl9CisJaWYgZXJyICE9IG5pbCB7CisJCWVyciA9IE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorCX0KKwlyZXR1cm4KK30KKworZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBXcml0ZShjIFtdYnl0ZSkgKG4gaW50LCBlcnIgZXJyb3IpIHsKKwluLCBlcnIgPSBwLldyaXRlci5Xcml0ZShjKQorCWlmIGVyciAhPSBuaWwgeworCQllcnIgPSBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydCkgV3JpdGVCeXRlKGMgYnl0ZSkgKGVyciBlcnJvcikgeworCWYsIG9rIDo9IHAuV3JpdGVyLihpby5CeXRlV3JpdGVyKQorCWlmIG9rIHsKKwkJZXJyID0gZi5Xcml0ZUJ5dGUoYykKKwl9IGVsc2UgeworCQllcnIgPSB3cml0ZUJ5dGUocC5Xcml0ZXIsIGMpCisJfQorCWlmIGVyciAhPSBuaWwgeworCQllcnIgPSBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydCkgV3JpdGVTdHJpbmcocyBzdHJpbmcpIChuIGludCwgZXJyIGVycm9yKSB7CisJZiwgb2sgOj0gcC5Xcml0ZXIuKHN0cmluZ1dyaXRlcikKKwlpZiBvayB7CisJCW4sIGVyciA9IGYuV3JpdGVTdHJpbmcocykKKwl9IGVsc2UgeworCQluLCBlcnIgPSBwLldyaXRlci5Xcml0ZShbXWJ5dGUocykpCisJfQorCWlmIGVyciAhPSBuaWwgeworCQllcnIgPSBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgeworCWNvbnN0IG1heFNpemUgPSBedWludDY0KDApCisJcmV0dXJuIG1heFNpemUgLy8gdGhlIHRocnV0aCBpcywgd2UganVzdCBkb24ndCBrbm93IHVubGVzcyBmcmFtZWQgaXMgdXNlZAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9pb3N0cmVhbV90cmFuc3BvcnRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvaW9zdHJlYW1fdHJhbnNwb3J0X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVhNjExNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvaW9zdHJlYW1fdHJhbnNwb3J0X3Rlc3QuZ28KQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJieXRlcyIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0U3RyZWFtVHJhbnNwb3J0KHQgKnRlc3RpbmcuVCkgeworCXRyYW5zIDo9IE5ld1N0cmVhbVRyYW5zcG9ydFJXKGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgMTAyNCkpKQorCVRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQorfQorCitmdW5jIFRlc3RTdHJlYW1UcmFuc3BvcnRPcGVuQ2xvc2UodCAqdGVzdGluZy5UKSB7CisJdHJhbnMgOj0gTmV3U3RyZWFtVHJhbnNwb3J0UlcoYnl0ZXMuTmV3QnVmZmVyKG1ha2UoW11ieXRlLCAwLCAxMDI0KSkpCisJaWYgIXRyYW5zLklzT3BlbigpIHsKKwkJdC5GYXRhbCgiU3RyZWFtVHJhbnNwb3J0IHNob3VsZCBiZSBhbHJlYWR5IG9wZW4iKQorCX0KKwlpZiB0cmFucy5PcGVuKCkgPT0gbmlsIHsKKwkJdC5GYXRhbCgiU3RyZWFtVHJhbnNwb3J0IHNob3VsZCByZXR1cm4gZXJyb3Igd2hlbiBvcGVuIHR3aWNlIikKKwl9CisJaWYgdHJhbnMuQ2xvc2UoKSAhPSBuaWwgeworCQl0LkZhdGFsKCJTdHJlYW1UcmFuc3BvcnQgc2hvdWxkIG5vdCByZXR1cm4gZXJyb3Igd2hlbiBjbG9zaW5nIG9wZW4gdHJhbnNwb3J0IikKKwl9CisJaWYgdHJhbnMuSXNPcGVuKCkgeworCQl0LkZhdGFsKCJTdHJlYW1UcmFuc3BvcnQgc2hvdWxkIG5vdCBiZSBvcGVuIGFmdGVyIGNsb3NlIikKKwl9CisJaWYgdHJhbnMuQ2xvc2UoKSA9PSBuaWwgeworCQl0LkZhdGFsKCJTdHJlYW1UcmFuc3BvcnQgc2hvdWxkIHJldHVybiBlcnJvciB3aGVuIGNsb3NpbmcgYSBub24gb3BlbiB0cmFuc3BvcnQiKQorCX0KKwlpZiB0cmFucy5PcGVuKCkgPT0gbmlsIHsKKwkJdC5GYXRhbCgiU3RyZWFtVHJhbnNwb3J0IHNob3VsZCBub3QgYmUgYWJsZSB0byByZW9wZW4iKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmU2ODVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9qc29uX3Byb3RvY29sLmdvCkBAIC0wLDAgKzEsNTg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImVuY29kaW5nL2Jhc2U2NCIKKwkiZm10IgorKQorCitjb25zdCAoCisJVEhSSUZUX0pTT05fUFJPVE9DT0xfVkVSU0lPTiA9IDEKKykKKworLy8gZm9yIHJlZmVyZW5jZXMgdG8gX1BhcnNlQ29udGV4dCBzZWUgdHNpbXBsZWpzb25fcHJvdG9jb2wuZ28KKworLy8gSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgorLy8KKy8vIFRoaXMgcHJvdG9jb2wgcHJvZHVjZXMvY29uc3VtZXMgYSBzaW1wbGUgb3V0cHV0IGZvcm1hdAorLy8gc3VpdGFibGUgZm9yIHBhcnNpbmcgYnkgc2NyaXB0aW5nIGxhbmd1YWdlcy4gIEl0IHNob3VsZCBub3QgYmUKKy8vIGNvbmZ1c2VkIHdpdGggdGhlIGZ1bGwtZmVhdHVyZWQgVEpTT05Qcm90b2NvbC4KKy8vCit0eXBlIFRKU09OUHJvdG9jb2wgc3RydWN0IHsKKwkqVFNpbXBsZUpTT05Qcm90b2NvbAorfQorCisvLyBDb25zdHJ1Y3RvcgorZnVuYyBOZXdUSlNPTlByb3RvY29sKHQgVFRyYW5zcG9ydCkgKlRKU09OUHJvdG9jb2wgeworCXYgOj0gJlRKU09OUHJvdG9jb2x7VFNpbXBsZUpTT05Qcm90b2NvbDogTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0KX0KKwl2LnBhcnNlQ29udGV4dFN0YWNrID0gYXBwZW5kKHYucGFyc2VDb250ZXh0U3RhY2ssIGludChfQ09OVEVYVF9JTl9UT1BMRVZFTCkpCisJdi5kdW1wQ29udGV4dCA9IGFwcGVuZCh2LmR1bXBDb250ZXh0LCBpbnQoX0NPTlRFWFRfSU5fVE9QTEVWRUwpKQorCXJldHVybiB2Cit9CisKKy8vIEZhY3RvcnkKK3R5cGUgVEpTT05Qcm90b2NvbEZhY3Rvcnkgc3RydWN0e30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbEZhY3RvcnkpIEdldFByb3RvY29sKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm90b2NvbCB7CisJcmV0dXJuIE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCit9CisKK2Z1bmMgTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKSAqVEpTT05Qcm90b2NvbEZhY3RvcnkgeworCXJldHVybiAmVEpTT05Qcm90b2NvbEZhY3Rvcnl7fQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZU1lc3NhZ2VCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxSWQgaW50MzIpIGVycm9yIHsKKwlwLnJlc2V0Q29udGV4dFN0YWNrKCkgLy8gVEhSSUZULTM3MzUKKwlpZiBlIDo9IHAuT3V0cHV0TGlzdEJlZ2luKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlSTMyKFRIUklGVF9KU09OX1BST1RPQ09MX1ZFUlNJT04pOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyhuYW1lKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuV3JpdGVCeXRlKGludDgodHlwZUlkKSk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlSTMyKHNlcUlkKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlTWVzc2FnZUVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVTdHJ1Y3RCZWdpbihuYW1lIHN0cmluZykgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRPYmplY3RCZWdpbigpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVTdHJ1Y3RFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0T2JqZWN0RW5kKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVGaWVsZEJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2KSBlcnJvciB7CisJaWYgZSA6PSBwLldyaXRlSTE2KGlkKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuT3V0cHV0T2JqZWN0QmVnaW4oKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlzLCBlMSA6PSBwLlR5cGVJZFRvU3RyaW5nKHR5cGVJZCkKKwlpZiBlMSAhPSBuaWwgeworCQlyZXR1cm4gZTEKKwl9CisJaWYgZSA6PSBwLldyaXRlU3RyaW5nKHMpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVGaWVsZEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRPYmplY3RFbmQoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUZpZWxkU3RvcCgpIGVycm9yIHsgcmV0dXJuIG5pbCB9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlTWFwQmVnaW4oa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRMaXN0QmVnaW4oKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlzLCBlMSA6PSBwLlR5cGVJZFRvU3RyaW5nKGtleVR5cGUpCisJaWYgZTEgIT0gbmlsIHsKKwkJcmV0dXJuIGUxCisJfQorCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyhzKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlzLCBlMSA9IHAuVHlwZUlkVG9TdHJpbmcodmFsdWVUeXBlKQorCWlmIGUxICE9IG5pbCB7CisJCXJldHVybiBlMQorCX0KKwlpZiBlIDo9IHAuV3JpdGVTdHJpbmcocyk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlSTY0KGludDY0KHNpemUpKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gcC5PdXRwdXRPYmplY3RCZWdpbigpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlTWFwRW5kKCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRPYmplY3RFbmQoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gcC5PdXRwdXRMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0RWxlbUxpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVMaXN0RW5kKCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dExpc3RFbmQoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZVNldEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dEVsZW1MaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlU2V0RW5kKCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dExpc3RFbmQoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUJvb2woYiBib29sKSBlcnJvciB7CisJaWYgYiB7CisJCXJldHVybiBwLldyaXRlSTMyKDEpCisJfQorCXJldHVybiBwLldyaXRlSTMyKDApCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlQnl0ZShiIGludDgpIGVycm9yIHsKKwlyZXR1cm4gcC5Xcml0ZUkzMihpbnQzMihiKSkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVJMTYodiBpbnQxNikgZXJyb3IgeworCXJldHVybiBwLldyaXRlSTMyKGludDMyKHYpKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUkzMih2IGludDMyKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0STY0KGludDY0KHYpKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUk2NCh2IGludDY0KSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0STY0KGludDY0KHYpKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZURvdWJsZSh2IGZsb2F0NjQpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRGNjQodikKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVTdHJpbmcodiBzdHJpbmcpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRTdHJpbmcodikKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVCaW5hcnkodiBbXWJ5dGUpIGVycm9yIHsKKwkvLyBKU09OIGxpYnJhcnkgb25seSB0YWtlcyBpbiBhIHN0cmluZywKKwkvLyBub3QgYW4gYXJiaXRyYXJ5IGJ5dGUgYXJyYXksIHRvIGVuc3VyZSBieXRlcyBhcmUgdHJhbnNtaXR0ZWQKKwkvLyBlZmZpY2llbnRseSB3ZSBtdXN0IGNvbnZlcnQgdGhpcyBpbnRvIGEgdmFsaWQgSlNPTiBzdHJpbmcKKwkvLyB0aGVyZWZvcmUgd2UgdXNlIGJhc2U2NCBlbmNvZGluZyB0byBhdm9pZCBleGNlc3NpdmUgZXNjYXBpbmcvcXVvdGluZworCWlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX1FVT1RFX0JZVEVTKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXdyaXRlciA6PSBiYXNlNjQuTmV3RW5jb2RlcihiYXNlNjQuU3RkRW5jb2RpbmcsIHAud3JpdGVyKQorCWlmIF8sIGUgOj0gd3JpdGVyLldyaXRlKHYpOyBlICE9IG5pbCB7CisJCXAud3JpdGVyLlJlc2V0KHAudHJhbnMpIC8vIFRIUklGVC0zNzM1CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJaWYgZSA6PSB3cml0ZXIuQ2xvc2UoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX1FVT1RFX0JZVEVTKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXJldHVybiBwLk91dHB1dFBvc3RWYWx1ZSgpCit9CisKKy8vIFJlYWRpbmcgbWV0aG9kcy4KK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRNZXNzYWdlQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcUlkIGludDMyLCBlcnIgZXJyb3IpIHsKKwlwLnJlc2V0Q29udGV4dFN0YWNrKCkgLy8gVEhSSUZULTM3MzUKKwlpZiBpc051bGwsIGVyciA6PSBwLlBhcnNlTGlzdEJlZ2luKCk7IGlzTnVsbCB8fCBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgorCX0KKwl2ZXJzaW9uLCBlcnIgOj0gcC5SZWFkSTMyKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgorCX0KKwlpZiB2ZXJzaW9uICE9IFRIUklGVF9KU09OX1BST1RPQ09MX1ZFUlNJT04geworCQllIDo9IGZtdC5FcnJvcmYoIlVua25vd24gUHJvdG9jb2wgdmVyc2lvbiAlZCwgZXhwZWN0ZWQgdmVyc2lvbiAlZCIsIHZlcnNpb24sIFRIUklGVF9KU09OX1BST1RPQ09MX1ZFUlNJT04pCisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisKKwl9CisJaWYgbmFtZSwgZXJyID0gcC5SZWFkU3RyaW5nKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCisJfQorCWJUeXBlSWQsIGVyciA6PSBwLlJlYWRCeXRlKCkKKwl0eXBlSWQgPSBUTWVzc2FnZVR5cGUoYlR5cGVJZCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgorCX0KKwlpZiBzZXFJZCwgZXJyID0gcC5SZWFkSTMyKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCisJfQorCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBuaWwKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZE1lc3NhZ2VFbmQoKSBlcnJvciB7CisJZXJyIDo9IHAuUGFyc2VMaXN0RW5kKCkKKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRTdHJ1Y3RCZWdpbigpIChuYW1lIHN0cmluZywgZXJyIGVycm9yKSB7CisJXywgZXJyID0gcC5QYXJzZU9iamVjdFN0YXJ0KCkKKwlyZXR1cm4gIiIsIGVycgorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkU3RydWN0RW5kKCkgZXJyb3IgeworCXJldHVybiBwLlBhcnNlT2JqZWN0RW5kKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZEZpZWxkQmVnaW4oKSAoc3RyaW5nLCBUVHlwZSwgaW50MTYsIGVycm9yKSB7CisJYiwgXyA6PSBwLnJlYWRlci5QZWVrKDEpCisJaWYgbGVuKGIpIDwgMSB8fCBiWzBdID09IEpTT05fUkJSQUNFWzBdIHx8IGJbMF0gPT0gSlNPTl9SQlJBQ0tFVFswXSB7CisJCXJldHVybiAiIiwgU1RPUCwgLTEsIG5pbAorCX0KKwlmaWVsZElkLCBlcnIgOj0gcC5SZWFkSTE2KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuICIiLCBTVE9QLCBmaWVsZElkLCBlcnIKKwl9CisJaWYgXywgZXJyID0gcC5QYXJzZU9iamVjdFN0YXJ0KCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gIiIsIFNUT1AsIGZpZWxkSWQsIGVycgorCX0KKwlzVHlwZSwgZXJyIDo9IHAuUmVhZFN0cmluZygpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiAiIiwgU1RPUCwgZmllbGRJZCwgZXJyCisJfQorCWZUeXBlLCBlcnIgOj0gcC5TdHJpbmdUb1R5cGVJZChzVHlwZSkKKwlyZXR1cm4gIiIsIGZUeXBlLCBmaWVsZElkLCBlcnIKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZEZpZWxkRW5kKCkgZXJyb3IgeworCXJldHVybiBwLlBhcnNlT2JqZWN0RW5kKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZE1hcEJlZ2luKCkgKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgZXJyb3IpIHsKKwlpZiBpc051bGwsIGUgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZSAhPSBuaWwgeworCQlyZXR1cm4gVk9JRCwgVk9JRCwgMCwgZQorCX0KKworCS8vIHJlYWQga2V5VHlwZQorCXNLZXlUeXBlLCBlIDo9IHAuUmVhZFN0cmluZygpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4ga2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlCisJfQorCWtleVR5cGUsIGUgPSBwLlN0cmluZ1RvVHlwZUlkKHNLZXlUeXBlKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZQorCX0KKworCS8vIHJlYWQgdmFsdWVUeXBlCisJc1ZhbHVlVHlwZSwgZSA6PSBwLlJlYWRTdHJpbmcoKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZQorCX0KKwl2YWx1ZVR5cGUsIGUgPSBwLlN0cmluZ1RvVHlwZUlkKHNWYWx1ZVR5cGUpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4ga2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlCisJfQorCisJLy8gcmVhZCBzaXplCisJaVNpemUsIGUgOj0gcC5SZWFkSTY0KCkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGUKKwl9CisJc2l6ZSA9IGludChpU2l6ZSkKKworCV8sIGUgPSBwLlBhcnNlT2JqZWN0U3RhcnQoKQorCXJldHVybiBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGUKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZE1hcEVuZCgpIGVycm9yIHsKKwllIDo9IHAuUGFyc2VPYmplY3RFbmQoKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIHAuUGFyc2VMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZExpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgZXJyb3IpIHsKKwlyZXR1cm4gcC5QYXJzZUVsZW1MaXN0QmVnaW4oKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkTGlzdEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5QYXJzZUxpc3RFbmQoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkU2V0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlIGVycm9yKSB7CisJcmV0dXJuIHAuUGFyc2VFbGVtTGlzdEJlZ2luKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZFNldEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5QYXJzZUxpc3RFbmQoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkQm9vbCgpIChib29sLCBlcnJvcikgeworCXZhbHVlLCBlcnIgOj0gcC5SZWFkSTMyKCkKKwlyZXR1cm4gKHZhbHVlICE9IDApLCBlcnIKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZEJ5dGUoKSAoaW50OCwgZXJyb3IpIHsKKwl2LCBlcnIgOj0gcC5SZWFkSTY0KCkKKwlyZXR1cm4gaW50OCh2KSwgZXJyCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRJMTYoKSAoaW50MTYsIGVycm9yKSB7CisJdiwgZXJyIDo9IHAuUmVhZEk2NCgpCisJcmV0dXJuIGludDE2KHYpLCBlcnIKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZEkzMigpIChpbnQzMiwgZXJyb3IpIHsKKwl2LCBlcnIgOj0gcC5SZWFkSTY0KCkKKwlyZXR1cm4gaW50MzIodiksIGVycgorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkSTY0KCkgKGludDY0LCBlcnJvcikgeworCXYsIF8sIGVyciA6PSBwLlBhcnNlSTY0KCkKKwlyZXR1cm4gdiwgZXJyCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWREb3VibGUoKSAoZmxvYXQ2NCwgZXJyb3IpIHsKKwl2LCBfLCBlcnIgOj0gcC5QYXJzZUY2NCgpCisJcmV0dXJuIHYsIGVycgorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkU3RyaW5nKCkgKHN0cmluZywgZXJyb3IpIHsKKwl2YXIgdiBzdHJpbmcKKwlpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gdiwgZXJyCisJfQorCWYsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQorCWlmIGxlbihmKSA+IDAgJiYgZlswXSA9PSBKU09OX1FVT1RFIHsKKwkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQl2YWx1ZSwgZXJyIDo9IHAuUGFyc2VTdHJpbmdCb2R5KCkKKwkJdiA9IHZhbHVlCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIHYsIGVycgorCQl9CisJfSBlbHNlIGlmIGxlbihmKSA+IDAgJiYgZlswXSA9PSBKU09OX05VTExbMF0geworCQliIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9OVUxMKSkKKwkJXywgZXJyIDo9IHAucmVhZGVyLlJlYWQoYikKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwkJfQorCQlpZiBzdHJpbmcoYikgIT0gc3RyaW5nKEpTT05fTlVMTCkgeworCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBhIEpTT04gc3RyaW5nLCBmb3VuZCB1bnF1b3RlZCBkYXRhIHN0YXJ0ZWQgd2l0aCAlcyIsIHN0cmluZyhiKSkKKwkJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCX0KKwl9IGVsc2UgeworCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIGEgSlNPTiBzdHJpbmcsIGZvdW5kIHVucXVvdGVkIGRhdGEgc3RhcnRlZCB3aXRoICVzIiwgc3RyaW5nKGYpKQorCQlyZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCX0KKwlyZXR1cm4gdiwgcC5QYXJzZVBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRCaW5hcnkoKSAoW11ieXRlLCBlcnJvcikgeworCXZhciB2IFtdYnl0ZQorCWlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKwlmLCBfIDo9IHAucmVhZGVyLlBlZWsoMSkKKwlpZiBsZW4oZikgPiAwICYmIGZbMF0gPT0gSlNPTl9RVU9URSB7CisJCXAucmVhZGVyLlJlYWRCeXRlKCkKKwkJdmFsdWUsIGVyciA6PSBwLlBhcnNlQmFzZTY0RW5jb2RlZEJvZHkoKQorCQl2ID0gdmFsdWUKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gdiwgZXJyCisJCX0KKwl9IGVsc2UgaWYgbGVuKGYpID4gMCAmJiBmWzBdID09IEpTT05fTlVMTFswXSB7CisJCWIgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKQorCQlfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCQl9CisJCWlmIHN0cmluZyhiKSAhPSBzdHJpbmcoSlNPTl9OVUxMKSB7CisJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIGEgSlNPTiBzdHJpbmcsIGZvdW5kIHVucXVvdGVkIGRhdGEgc3RhcnRlZCB3aXRoICVzIiwgc3RyaW5nKGIpKQorCQkJcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJfQorCX0gZWxzZSB7CisJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgYSBKU09OIHN0cmluZywgZm91bmQgdW5xdW90ZWQgZGF0YSBzdGFydGVkIHdpdGggJXMiLCBzdHJpbmcoZikpCisJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJfQorCisJcmV0dXJuIHYsIHAuUGFyc2VQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJZXJyID0gcC53cml0ZXIuRmx1c2goKQorCWlmIGVyciA9PSBuaWwgeworCQllcnIgPSBwLnRyYW5zLkZsdXNoKGN0eCkKKwl9CisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFNraXAoZmllbGRUeXBlIFRUeXBlKSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIFNraXBEZWZhdWx0RGVwdGgocCwgZmllbGRUeXBlKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBUcmFuc3BvcnQoKSBUVHJhbnNwb3J0IHsKKwlyZXR1cm4gcC50cmFucworfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBPdXRwdXRFbGVtTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRMaXN0QmVnaW4oKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlzLCBlMSA6PSBwLlR5cGVJZFRvU3RyaW5nKGVsZW1UeXBlKQorCWlmIGUxICE9IG5pbCB7CisJCXJldHVybiBlMQorCX0KKwlpZiBlIDo9IHAuV3JpdGVTdHJpbmcocyk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlSTY0KGludDY0KHNpemUpKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFBhcnNlRWxlbUxpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgZXJyb3IpIHsKKwlpZiBpc051bGwsIGUgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZSAhPSBuaWwgeworCQlyZXR1cm4gVk9JRCwgMCwgZQorCX0KKwlzRWxlbVR5cGUsIGVyciA6PSBwLlJlYWRTdHJpbmcoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gVk9JRCwgc2l6ZSwgZXJyCisJfQorCWVsZW1UeXBlLCBlcnIgPSBwLlN0cmluZ1RvVHlwZUlkKHNFbGVtVHlwZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVsZW1UeXBlLCBzaXplLCBlcnIKKwl9CisJblNpemUsIGVycjIgOj0gcC5SZWFkSTY0KCkKKwlzaXplID0gaW50KG5TaXplKQorCXJldHVybiBlbGVtVHlwZSwgc2l6ZSwgZXJyMgorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSByZWFkRWxlbUxpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgZXJyb3IpIHsKKwlpZiBpc051bGwsIGUgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZSAhPSBuaWwgeworCQlyZXR1cm4gVk9JRCwgMCwgZQorCX0KKwlzRWxlbVR5cGUsIGVyciA6PSBwLlJlYWRTdHJpbmcoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gVk9JRCwgc2l6ZSwgZXJyCisJfQorCWVsZW1UeXBlLCBlcnIgPSBwLlN0cmluZ1RvVHlwZUlkKHNFbGVtVHlwZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVsZW1UeXBlLCBzaXplLCBlcnIKKwl9CisJblNpemUsIGVycjIgOj0gcC5SZWFkSTY0KCkKKwlzaXplID0gaW50KG5TaXplKQorCXJldHVybiBlbGVtVHlwZSwgc2l6ZSwgZXJyMgorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSB3cml0ZUVsZW1MaXN0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJaWYgZSA6PSBwLk91dHB1dExpc3RCZWdpbigpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXMsIGUxIDo9IHAuVHlwZUlkVG9TdHJpbmcoZWxlbVR5cGUpCisJaWYgZTEgIT0gbmlsIHsKKwkJcmV0dXJuIGUxCisJfQorCWlmIGUgOj0gcC5PdXRwdXRTdHJpbmcocyk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLk91dHB1dEk2NChpbnQ2NChzaXplKSk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBUeXBlSWRUb1N0cmluZyhmaWVsZFR5cGUgVFR5cGUpIChzdHJpbmcsIGVycm9yKSB7CisJc3dpdGNoIGJ5dGUoZmllbGRUeXBlKSB7CisJY2FzZSBCT09MOgorCQlyZXR1cm4gInRmIiwgbmlsCisJY2FzZSBCWVRFOgorCQlyZXR1cm4gImk4IiwgbmlsCisJY2FzZSBJMTY6CisJCXJldHVybiAiaTE2IiwgbmlsCisJY2FzZSBJMzI6CisJCXJldHVybiAiaTMyIiwgbmlsCisJY2FzZSBJNjQ6CisJCXJldHVybiAiaTY0IiwgbmlsCisJY2FzZSBET1VCTEU6CisJCXJldHVybiAiZGJsIiwgbmlsCisJY2FzZSBTVFJJTkc6CisJCXJldHVybiAic3RyIiwgbmlsCisJY2FzZSBTVFJVQ1Q6CisJCXJldHVybiAicmVjIiwgbmlsCisJY2FzZSBNQVA6CisJCXJldHVybiAibWFwIiwgbmlsCisJY2FzZSBTRVQ6CisJCXJldHVybiAic2V0IiwgbmlsCisJY2FzZSBMSVNUOgorCQlyZXR1cm4gImxzdCIsIG5pbAorCX0KKworCWUgOj0gZm10LkVycm9yZigiVW5rbm93biBmaWVsZFR5cGU6ICVkIiwgaW50KGZpZWxkVHlwZSkpCisJcmV0dXJuICIiLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFN0cmluZ1RvVHlwZUlkKGZpZWxkVHlwZSBzdHJpbmcpIChUVHlwZSwgZXJyb3IpIHsKKwlzd2l0Y2ggZmllbGRUeXBlIHsKKwljYXNlICJ0ZiI6CisJCXJldHVybiBUVHlwZShCT09MKSwgbmlsCisJY2FzZSAiaTgiOgorCQlyZXR1cm4gVFR5cGUoQllURSksIG5pbAorCWNhc2UgImkxNiI6CisJCXJldHVybiBUVHlwZShJMTYpLCBuaWwKKwljYXNlICJpMzIiOgorCQlyZXR1cm4gVFR5cGUoSTMyKSwgbmlsCisJY2FzZSAiaTY0IjoKKwkJcmV0dXJuIFRUeXBlKEk2NCksIG5pbAorCWNhc2UgImRibCI6CisJCXJldHVybiBUVHlwZShET1VCTEUpLCBuaWwKKwljYXNlICJzdHIiOgorCQlyZXR1cm4gVFR5cGUoU1RSSU5HKSwgbmlsCisJY2FzZSAicmVjIjoKKwkJcmV0dXJuIFRUeXBlKFNUUlVDVCksIG5pbAorCWNhc2UgIm1hcCI6CisJCXJldHVybiBUVHlwZShNQVApLCBuaWwKKwljYXNlICJzZXQiOgorCQlyZXR1cm4gVFR5cGUoU0VUKSwgbmlsCisJY2FzZSAibHN0IjoKKwkJcmV0dXJuIFRUeXBlKExJU1QpLCBuaWwKKwl9CisKKwllIDo9IGZtdC5FcnJvcmYoIlVua25vd24gdHlwZSBpZGVudGlmaWVyOiAlcyIsIGZpZWxkVHlwZSkKKwlyZXR1cm4gVFR5cGUoU1RPUCksIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9qc29uX3Byb3RvY29sX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljNGQ2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbF90ZXN0LmdvCkBAIC0wLDAgKzEsNjUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImVuY29kaW5nL2Jhc2U2NCIKKwkiZW5jb2RpbmcvanNvbiIKKwkiZm10IgorCSJtYXRoIgorCSJzdHJjb252IgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbEJvb2wodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYm9vbGVhbiIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIEJPT0xfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlQm9vbCh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWV4cGVjdGVkIDo9ICIiCisJCWlmIHZhbHVlIHsKKwkJCWV4cGVjdGVkID0gIjEiCisJCX0gZWxzZSB7CisJCQlleHBlY3RlZCA9ICIwIgorCQl9CisJCWlmIHMgIT0gZXhwZWN0ZWQgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIGV4cGVjdGVkIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCX0KKwkJdiA6PSAtMQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgKHYgIT0gMCkgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbEJvb2wodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYm9vbGVhbiIKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgQk9PTF9WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCQlpZiB2YWx1ZSB7CisJCQl0cmFucy5Xcml0ZShbXWJ5dGV7JzEnfSkgLy8gbm90IEpTT05fVFJVRQorCQl9IGVsc2UgeworCQkJdHJhbnMuV3JpdGUoW11ieXRleycwJ30pIC8vIG5vdCBKU09OX0ZBTFNFCisJCX0KKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJdiwgZSA6PSBwLlJlYWRCb29sKCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdnYgOj0gLTEKKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnZ2KTsgZXJyICE9IG5pbCB8fCAodnYgIT0gMCkgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdnYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbEJ5dGUodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYnl0ZSIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIEJZVEVfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlQnl0ZSh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCX0KKwkJdiA6PSBpbnQ4KDApCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRKU09OUHJvdG9jb2xCeXRlKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJ5dGUiCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIEJZVEVfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZEJ5dGUoKQorCQlpZiBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xJMTYodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiaW50MTYiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQxNl9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVJMTYodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQl9CisJCXYgOj0gaW50MTYoMCkKKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbEkxNih0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQxNiIKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UMTZfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZEkxNigpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbEkzMih0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQzMiIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDMyX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZUkzMih2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCX0KKwkJdiA6PSBpbnQzMigwKQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RSZWFkSlNPTlByb3RvY29sSTMyKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDMyIgorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQzMl9WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkSTMyKCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CisKK2Z1bmMgVGVzdFdyaXRlSlNPTlByb3RvY29sSTY0KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDY0IgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UNjRfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlSTY0KHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJaWYgcyAhPSBmbXQuU3ByaW50KHZhbHVlKSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJfQorCQl2IDo9IGludDY0KDApCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRKU09OUHJvdG9jb2xJNjQodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiaW50NjQiCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDY0X1ZBTFVFUyB7CisJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCQlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJCXRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuRm9ybWF0SW50KHZhbHVlLCAxMCkpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkSTY0KCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CisKK2Z1bmMgVGVzdFdyaXRlSlNPTlByb3RvY29sRG91YmxlKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImRvdWJsZSIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7CisJCQlpZiBzICE9IGpzb25RdW90ZShKU09OX0lORklOSVRZKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX0lORklOSVRZKSkKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIC0xKSB7CisJCQlpZiBzICE9IGpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSkKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKKwkJCWlmIHMgIT0ganNvblF1b3RlKEpTT05fTkFOKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05BTikpCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJCX0KKwkJCXYgOj0gZmxvYXQ2NCgwKQorCQkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRKU09OUHJvdG9jb2xEb3VibGUodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiZG91YmxlIgorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwkJbiA6PSBOZXdOdW1lcmljRnJvbURvdWJsZSh2YWx1ZSkKKwkJdHJhbnMuV3JpdGVTdHJpbmcobi5TdHJpbmcoKSkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJdiwgZSA6PSBwLlJlYWREb3VibGUoKQorCQlpZiBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgbWF0aC5Jc0luZih2YWx1ZSwgMSkgeworCQkJaWYgIW1hdGguSXNJbmYodiwgMSkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgLTEpIHsKKwkJCWlmICFtYXRoLklzSW5mKHYsIC0xKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7CisJCQlpZiAhbWF0aC5Jc05hTih2KSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiB2ICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJCX0KKwkJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQkJfQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xTdHJpbmcodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAic3RyaW5nIgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgU1RSSU5HX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIHNbMF0gIT0gJyInIHx8IHNbbGVuKHMpLTFdICE9ICciJyB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAnJXYnLCB3cm90ZSAnJXYnLCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgZm10LlNwcmludCgiXCIiLCB2YWx1ZSwgIlwiIikpCisJCX0KKwkJdiA6PSBuZXcoc3RyaW5nKQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCB2KTsgZXJyICE9IG5pbCB8fCAqdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCAqdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbFN0cmluZyh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJzdHJpbmciCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIFNUUklOR19WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCQl0cmFucy5Xcml0ZVN0cmluZyhqc29uUXVvdGUodmFsdWUpKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZFN0cmluZygpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXYxIDo9IG5ldyhzdHJpbmcpCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksIHYxKTsgZXJyICE9IG5pbCB8fCAqdjEgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgKnYxKQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xCaW5hcnkodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYmluYXJ5IgorCXZhbHVlIDo9IHByb3RvY29sX2JkYXRhCisJYjY0dmFsdWUgOj0gbWFrZShbXWJ5dGUsIGJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGVkTGVuKGxlbihwcm90b2NvbF9iZGF0YSkpKQorCWJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGUoYjY0dmFsdWUsIHZhbHVlKQorCWI2NFN0cmluZyA6PSBzdHJpbmcoYjY0dmFsdWUpCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCWlmIGUgOj0gcC5Xcml0ZUJpbmFyeSh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwl9CisJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCX0KKwlzIDo9IHRyYW5zLlN0cmluZygpCisJZXhwZWN0ZWRTdHJpbmcgOj0gZm10LlNwcmludCgiXCIiLCBiNjRTdHJpbmcsICJcIiIpCisJaWYgcyAhPSBleHBlY3RlZFN0cmluZyB7CisJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2XG4gIHdyb3RlOiAgXCIldlwiXG5leHBlY3RlZDogXCIldlwiIiwgdGhldHlwZSwgdmFsdWUsIHMsIGV4cGVjdGVkU3RyaW5nKQorCX0KKwl2MSwgZXJyIDo9IHAuUmVhZEJpbmFyeSgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCBiaW5hcnk6ICVzIiwgZXJyLkVycm9yKCkpCisJfQorCWlmIGxlbih2MSkgIT0gbGVuKHZhbHVlKSB7CisJCXQuRmF0YWxmKCJJbnZhbGlkIHZhbHVlIGZvciBiaW5hcnlcbmV4cGVjdGVkOiBcIiV2XCJcbiAgIHJlYWQ6IFwiJXZcIiIsIHZhbHVlLCB2MSkKKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgdmFsdWUgeworCQlpZiB2MVtrXSAhPSB2IHsKKwkJCXQuRmF0YWxmKCJJbnZhbGlkIHZhbHVlIGZvciBiaW5hcnkgYXQgJXZcbmV4cGVjdGVkOiBcIiV2XCJcbiAgIHJlYWQ6IFwiJXZcIiIsIGssIHYsIHYxW2tdKQorCQl9CisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbEJpbmFyeSh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJiaW5hcnkiCisJdmFsdWUgOj0gcHJvdG9jb2xfYmRhdGEKKwliNjR2YWx1ZSA6PSBtYWtlKFtdYnl0ZSwgYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZWRMZW4obGVuKHByb3RvY29sX2JkYXRhKSkpCisJYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZShiNjR2YWx1ZSwgdmFsdWUpCisJYjY0U3RyaW5nIDo9IHN0cmluZyhiNjR2YWx1ZSkKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJdHJhbnMuV3JpdGVTdHJpbmcoanNvblF1b3RlKGI2NFN0cmluZykpCisJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJcyA6PSB0cmFucy5TdHJpbmcoKQorCXYsIGUgOj0gcC5SZWFkQmluYXJ5KCkKKwlpZiBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwl9CisJaWYgbGVuKHYpICE9IGxlbih2YWx1ZSkgeworCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSBsZW5ndGggJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQgbGVuZ3RoOiAldiIsIHRoZXR5cGUsIGxlbih2YWx1ZSksIHMsIGxlbih2KSkKKwl9CisJZm9yIGkgOj0gMDsgaSA8IGxlbih2KTsgaSsrIHsKKwkJaWYgdltpXSAhPSB2YWx1ZVtpXSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAlZCB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCBpLCB2YWx1ZVtpXSwgcywgdltpXSkKKwkJfQorCX0KKwl2MSA6PSBuZXcoc3RyaW5nKQorCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksIHYxKTsgZXJyICE9IG5pbCB8fCAqdjEgIT0gYjY0U3RyaW5nIHsKKwkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgKnYxKQorCX0KKwl0cmFucy5SZXNldCgpCisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbExpc3QodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAibGlzdCIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJcC5Xcml0ZUxpc3RCZWdpbihUVHlwZShET1VCTEUpLCBsZW4oRE9VQkxFX1ZBTFVFUykpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJfQorCXAuV3JpdGVMaXN0RW5kKCkKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuRXJyb3IoKSkKKwl9CisJc3RyIDo9IHRyYW5zLlN0cmluZygpCisJc3RyMSA6PSBuZXcoW11pbnRlcmZhY2V7fSkKKwllcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHN0ciksIHN0cjEpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gZGVjb2RlICVzLCB3cm90ZTogJXMiLCB0aGV0eXBlLCBzdHIpCisJfQorCWwgOj0gKnN0cjEKKwlpZiBsZW4obCkgPCAyIHsKKwkJdC5GYXRhbGYoIkxpc3QgbXVzdCBiZSBhdCBsZWFzdCBvZiBsZW5ndGggdHdvIHRvIGluY2x1ZGUgbWV0YWRhdGEiKQorCX0KKwlpZiBsWzBdICE9ICJkYmwiIHsKKwkJdC5GYXRhbCgiSW52YWxpZCB0eXBlIGZvciBsaXN0LCBleHBlY3RlZDogIiwgU1RSSU5HLCAiLCBidXQgd2FzOiAiLCBsWzBdKQorCX0KKwlpZiBpbnQobFsxXS4oZmxvYXQ2NCkpICE9IGxlbihET1VCTEVfVkFMVUVTKSB7CisJCXQuRmF0YWwoIkludmFsaWQgbGVuZ3RoIGZvciBsaXN0LCBleHBlY3RlZDogIiwgbGVuKERPVUJMRV9WQUxVRVMpLCAiLCBidXQgd2FzOiAiLCBsWzFdKQorCX0KKwlmb3IgaywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCXMgOj0gbFtrKzJdCisJCWlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9JTkZJTklUWSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9JTkZJTklUWSksIHN0cikKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIDApIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9ORUdBVElWRV9JTkZJTklUWSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9ORUdBVElWRV9JTkZJTklUWSksIHN0cikKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9OQU4geworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05BTiksIHN0cikKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIHMuKGZsb2F0NjQpICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCQl9CisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFdyaXRlSlNPTlByb3RvY29sU2V0KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gInNldCIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJcC5Xcml0ZVNldEJlZ2luKFRUeXBlKERPVUJMRSksIGxlbihET1VCTEVfVkFMVUVTKSkKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZURvdWJsZSh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwl9CisJcC5Xcml0ZVNldEVuZCgpCisJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCBlLkVycm9yKCkpCisJfQorCXN0ciA6PSB0cmFucy5TdHJpbmcoKQorCXN0cjEgOj0gbmV3KFtdaW50ZXJmYWNle30pCisJZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzdHIpLCBzdHIxKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIGRlY29kZSAlcywgd3JvdGU6ICVzIiwgdGhldHlwZSwgc3RyKQorCX0KKwlsIDo9ICpzdHIxCisJaWYgbGVuKGwpIDwgMiB7CisJCXQuRmF0YWxmKCJTZXQgbXVzdCBiZSBhdCBsZWFzdCBvZiBsZW5ndGggdHdvIHRvIGluY2x1ZGUgbWV0YWRhdGEiKQorCX0KKwlpZiBsWzBdICE9ICJkYmwiIHsKKwkJdC5GYXRhbCgiSW52YWxpZCB0eXBlIGZvciBzZXQsIGV4cGVjdGVkOiAiLCBET1VCTEUsICIsIGJ1dCB3YXM6ICIsIGxbMF0pCisJfQorCWlmIGludChsWzFdLihmbG9hdDY0KSkgIT0gbGVuKERPVUJMRV9WQUxVRVMpIHsKKwkJdC5GYXRhbCgiSW52YWxpZCBsZW5ndGggZm9yIHNldCwgZXhwZWN0ZWQ6ICIsIGxlbihET1VCTEVfVkFMVUVTKSwgIiwgYnV0IHdhczogIiwgbFsxXSkKKwl9CisJZm9yIGssIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlzIDo9IGxbaysyXQorCQlpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fSU5GSU5JVFkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fSU5GSU5JVFkpLCBzdHIpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAwKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpLCBzdHIpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fTkFOIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9OQU4pLCBzdHIpCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiBzLihmbG9hdDY0KSAhPSB2YWx1ZSB7CisJCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQkJfQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbE1hcCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJtYXAiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCXAuV3JpdGVNYXBCZWdpbihUVHlwZShJMzIpLCBUVHlwZShET1VCTEUpLCBsZW4oRE9VQkxFX1ZBTFVFUykpCisJZm9yIGssIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVJMzIoaW50MzIoaykpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGtleSBpbnQzMiB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgaywgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5Xcml0ZURvdWJsZSh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgZmxvYXQ2NCB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCX0KKwlwLldyaXRlTWFwRW5kKCkKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuRXJyb3IoKSkKKwl9CisJc3RyIDo9IHRyYW5zLlN0cmluZygpCisJaWYgc3RyWzBdICE9ICdbJyB8fCBzdHJbbGVuKHN0ciktMV0gIT0gJ10nIHsKKwkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMsIHdyb3RlOiAldiwgaW4gZ286ICV2IiwgdGhldHlwZSwgc3RyLCBET1VCTEVfVkFMVUVTKQorCX0KKwlleHBlY3RlZEtleVR5cGUsIGV4cGVjdGVkVmFsdWVUeXBlLCBleHBlY3RlZFNpemUsIGVyciA6PSBwLlJlYWRNYXBCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJFcnJvciB3aGlsZSByZWFkaW5nIG1hcCBiZWdpbjogJXMiLCBlcnIuRXJyb3IoKSkKKwl9CisJaWYgZXhwZWN0ZWRLZXlUeXBlICE9IEkzMiB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIG1hcCBrZXkgdHlwZSAiLCBJMzIsICIsIGJ1dCB3YXMgIiwgZXhwZWN0ZWRLZXlUeXBlKQorCX0KKwlpZiBleHBlY3RlZFZhbHVlVHlwZSAhPSBET1VCTEUgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBtYXAgdmFsdWUgdHlwZSAiLCBET1VCTEUsICIsIGJ1dCB3YXMgIiwgZXhwZWN0ZWRWYWx1ZVR5cGUpCisJfQorCWlmIGV4cGVjdGVkU2l6ZSAhPSBsZW4oRE9VQkxFX1ZBTFVFUykgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBtYXAgc2l6ZSBvZiAiLCBsZW4oRE9VQkxFX1ZBTFVFUyksICIsIGJ1dCB3YXMgIiwgZXhwZWN0ZWRTaXplKQorCX0KKwlmb3IgaywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCWlrLCBlcnIgOj0gcC5SZWFkSTMyKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkZhdGFsZigiQmFkIGtleSBmb3IgJXMgaW5kZXggJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2LCBlcnJvcjogJXMiLCB0aGV0eXBlLCBrLCBpaywgc3RyaW5nKGspLCBlcnIuRXJyb3IoKSkKKwkJfQorCQlpZiBpbnQoaWspICE9IGsgeworCQkJdC5GYXRhbGYoIkJhZCBrZXkgZm9yICVzIGluZGV4ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIGssIGlrLCBrKQorCQl9CisJCWR2LCBlcnIgOj0gcC5SZWFkRG91YmxlKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBpbmRleCAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYsIGVycm9yOiAlcyIsIHRoZXR5cGUsIGssIGR2LCB2YWx1ZSwgZXJyLkVycm9yKCkpCisJCX0KKwkJcyA6PSBzdHJjb252LkZvcm1hdEZsb2F0KGR2LCAnZycsIDEwLCA2NCkKKwkJaWYgbWF0aC5Jc0luZih2YWx1ZSwgMSkgeworCQkJaWYgIW1hdGguSXNJbmYoZHYsIDEpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fSU5GSU5JVFkpKQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgMCkgeworCQkJaWYgIW1hdGguSXNJbmYoZHYsIDApIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpKQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc05hTih2YWx1ZSkgeworCQkJaWYgIW1hdGguSXNOYU4oZHYpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05BTikpCisJCQl9CisJCX0gZWxzZSB7CisJCQlleHBlY3RlZCA6PSBzdHJjb252LkZvcm1hdEZsb2F0KHZhbHVlLCAnZycsIDEwLCA2NCkKKwkJCWlmIHMgIT0gZXhwZWN0ZWQgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGV4cGVjdGVkKQorCQkJfQorCQkJdiA6PSBmbG9hdDY0KDApCisJCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJCX0KKwkJfQorCX0KKwllcnIgPSBwLlJlYWRNYXBFbmQoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiRXJyb3Igd2hpbGUgcmVhZGluZyBtYXAgZW5kOiAlcyIsIGVyci5FcnJvcigpKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2xvd2xldmVsX2JlbmNobWFya3NfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvbG93bGV2ZWxfYmVuY2htYXJrc190ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNzM2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2xvd2xldmVsX2JlbmNobWFya3NfdGVzdC5nbwpAQCAtMCwwICsxLDU0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJieXRlcyIKKwkidGVzdGluZyIKKykKKwordmFyIGJpbmFyeVByb3RvRiA9IE5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKK3ZhciBjb21wYWN0UHJvdG9GID0gTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKQorCit2YXIgYnVmID0gYnl0ZXMuTmV3QnVmZmVyKG1ha2UoW11ieXRlLCAwLCAxMDI0KSkKKwordmFyIHRmdiA9IFtdVFRyYW5zcG9ydEZhY3Rvcnl7CisJTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkoMTAyNCksCisJTmV3U3RyZWFtVHJhbnNwb3J0RmFjdG9yeShidWYsIGJ1ZiwgdHJ1ZSksCisJTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkoMTAyNCkpLAorfQorCitmdW5jIEJlbmNobWFya0JpbmFyeUJvb2xfMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQm9vbChiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQmluYXJ5Qnl0ZV8wKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCeXRlKGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtCaW5hcnlJMTZfMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTE2KGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtCaW5hcnlJMzJfMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTMyKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQmluYXJ5STY0XzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUk2NChiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0JpbmFyeURvdWJsZV8wKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVEb3VibGUoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtCaW5hcnlTdHJpbmdfMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlU3RyaW5nKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQmluYXJ5QmluYXJ5XzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJpbmFyeShiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQmluYXJ5Qm9vbF8xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCb29sKGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtCaW5hcnlCeXRlXzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJ5dGUoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0JpbmFyeUkxNl8xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJMTYoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0JpbmFyeUkzMl8xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJMzIoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtCaW5hcnlJNjRfMShiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTY0KGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQmluYXJ5RG91YmxlXzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZURvdWJsZShiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0JpbmFyeVN0cmluZ18xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVTdHJpbmcoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtCaW5hcnlCaW5hcnlfMShiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQmluYXJ5KGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtCaW5hcnlCb29sXzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJvb2woYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0JpbmFyeUJ5dGVfMihiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQmluYXJ5STE2XzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUkxNihiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQmluYXJ5STMyXzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUkzMihiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0JpbmFyeUk2NF8yKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJNjQoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtCaW5hcnlEb3VibGVfMihiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlRG91YmxlKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQmluYXJ5U3RyaW5nXzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZVN0cmluZyhiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0JpbmFyeUJpbmFyeV8yKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCaW5hcnkoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0NvbXBhY3RCb29sXzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCb29sKGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0Qnl0ZV8wKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEkxNl8wKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTE2KGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0STMyXzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJMzIoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0STY0XzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJNjQoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0RG91YmxlMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZURvdWJsZShiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0NvbXBhY3RTdHJpbmcwKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlU3RyaW5nKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEJpbmFyeTAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCaW5hcnkoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0NvbXBhY3RCb29sXzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCb29sKGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0Qnl0ZV8xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEkxNl8xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTE2KGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0STMyXzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJMzIoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0STY0XzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJNjQoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0RG91YmxlMShiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZURvdWJsZShiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0NvbXBhY3RTdHJpbmcxKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlU3RyaW5nKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEJpbmFyeTEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCaW5hcnkoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0NvbXBhY3RCb29sXzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCb29sKGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0Qnl0ZV8yKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEkxNl8yKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTE2KGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0STMyXzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJMzIoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0STY0XzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJNjQoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0RG91YmxlMihiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZURvdWJsZShiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0NvbXBhY3RTdHJpbmcyKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlU3RyaW5nKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEJpbmFyeTIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCaW5hcnkoYiwgcCwgdHJhbnMpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9tZW1vcnlfYnVmZmVyLmdvIGIvbGliL2dvL3RocmlmdC9tZW1vcnlfYnVmZmVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MzZkMjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L21lbW9yeV9idWZmZXIuZ28KQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJieXRlcyIKKwkiY29udGV4dCIKKykKKworLy8gTWVtb3J5IGJ1ZmZlci1iYXNlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCit0eXBlIFRNZW1vcnlCdWZmZXIgc3RydWN0IHsKKwkqYnl0ZXMuQnVmZmVyCisJc2l6ZSBpbnQKK30KKwordHlwZSBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3QgeworCXNpemUgaW50Cit9CisKK2Z1bmMgKHAgKlRNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJaWYgdHJhbnMgIT0gbmlsIHsKKwkJdCwgb2sgOj0gdHJhbnMuKCpUTWVtb3J5QnVmZmVyKQorCQlpZiBvayAmJiB0LnNpemUgPiAwIHsKKwkJCXJldHVybiBOZXdUTWVtb3J5QnVmZmVyTGVuKHQuc2l6ZSksIG5pbAorCQl9CisJfQorCXJldHVybiBOZXdUTWVtb3J5QnVmZmVyTGVuKHAuc2l6ZSksIG5pbAorfQorCitmdW5jIE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KHNpemUgaW50KSAqVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiAmVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3Rvcnl7c2l6ZTogc2l6ZX0KK30KKworZnVuYyBOZXdUTWVtb3J5QnVmZmVyKCkgKlRNZW1vcnlCdWZmZXIgeworCXJldHVybiAmVE1lbW9yeUJ1ZmZlcntCdWZmZXI6ICZieXRlcy5CdWZmZXJ7fSwgc2l6ZTogMH0KK30KKworZnVuYyBOZXdUTWVtb3J5QnVmZmVyTGVuKHNpemUgaW50KSAqVE1lbW9yeUJ1ZmZlciB7CisJYnVmIDo9IG1ha2UoW11ieXRlLCAwLCBzaXplKQorCXJldHVybiAmVE1lbW9yeUJ1ZmZlcntCdWZmZXI6IGJ5dGVzLk5ld0J1ZmZlcihidWYpLCBzaXplOiBzaXplfQorfQorCitmdW5jIChwICpUTWVtb3J5QnVmZmVyKSBJc09wZW4oKSBib29sIHsKKwlyZXR1cm4gdHJ1ZQorfQorCitmdW5jIChwICpUTWVtb3J5QnVmZmVyKSBPcGVuKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVE1lbW9yeUJ1ZmZlcikgQ2xvc2UoKSBlcnJvciB7CisJcC5CdWZmZXIuUmVzZXQoKQorCXJldHVybiBuaWwKK30KKworLy8gRmx1c2hpbmcgYSBtZW1vcnkgYnVmZmVyIGlzIGEgbm8tb3AKK2Z1bmMgKHAgKlRNZW1vcnlCdWZmZXIpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRNZW1vcnlCdWZmZXIpIFJlbWFpbmluZ0J5dGVzKCkgKG51bV9ieXRlcyB1aW50NjQpIHsKKwlyZXR1cm4gdWludDY0KHAuQnVmZmVyLkxlbigpKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9tZW1vcnlfYnVmZmVyX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L21lbW9yeV9idWZmZXJfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjJlOGJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9tZW1vcnlfYnVmZmVyX3Rlc3QuZ28KQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RNZW1vcnlCdWZmZXIodCAqdGVzdGluZy5UKSB7CisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlckxlbigxMDI0KQorCVRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9tZXNzYWdldHlwZS5nbyBiL2xpYi9nby90aHJpZnQvbWVzc2FnZXR5cGUuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhYjJlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvbWVzc2FnZXR5cGUuZ28KQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCisvLyBNZXNzYWdlIHR5cGUgY29uc3RhbnRzIGluIHRoZSBUaHJpZnQgcHJvdG9jb2wuCit0eXBlIFRNZXNzYWdlVHlwZSBpbnQzMgorCitjb25zdCAoCisJSU5WQUxJRF9UTUVTU0FHRV9UWVBFIFRNZXNzYWdlVHlwZSA9IDAKKwlDQUxMICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlID0gMQorCVJFUExZICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUgPSAyCisJRVhDRVBUSU9OICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSA9IDMKKwlPTkVXQVkgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlID0gNAorKQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9tdWx0aXBsZXhlZF9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAyOGEzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZ28KQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZm10IgorCSJzdHJpbmdzIgorKQorCisvKgorVE11bHRpcGxleGVkUHJvdG9jb2wgaXMgYSBwcm90b2NvbC1pbmRlcGVuZGVudCBjb25jcmV0ZSBkZWNvcmF0b3IKK3RoYXQgYWxsb3dzIGEgVGhyaWZ0IGNsaWVudCB0byBjb21tdW5pY2F0ZSB3aXRoIGEgbXVsdGlwbGV4aW5nIFRocmlmdCBzZXJ2ZXIsCitieSBwcmVwZW5kaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUgZHVyaW5nIGZ1bmN0aW9uIGNhbGxzLgorCitOT1RFOiBUSElTIElTIE5PVCBVU0VEIEJZIFNFUlZFUlMuICBPbiB0aGUgc2VydmVyLCB1c2UgVE11bHRpcGxleGVkUHJvY2Vzc29yIHRvIGhhbmRsZSByZXF1ZXN0Citmcm9tIGEgbXVsdGlwbGV4aW5nIGNsaWVudC4KKworVGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgorCitzb2NrZXQgOj0gdGhyaWZ0Lk5ld1RTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciwgVElNRU9VVCkKK3RyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpCitwcm90b2NvbCA6PSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sVHJhbnNwb3J0KHRyYW5zcG9ydCkKKworbXAgOj0gdGhyaWZ0Lk5ld1RNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpCitzZXJ2aWNlIDo9IENhbGN1bGF0b3IuTmV3Q2FsY3VsYXRvckNsaWVudChtcCkKKworbXAyIDo9IHRocmlmdC5OZXdUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIldlYXRoZXJSZXBvcnQiKQorc2VydmljZTIgOj0gV2VhdGhlclJlcG9ydC5OZXdXZWF0aGVyUmVwb3J0Q2xpZW50KG1wMikKKworZXJyIDo9IHRyYW5zcG9ydC5PcGVuKCkKK2lmIGVyciAhPSBuaWwgeworCXQuRmF0YWwoIlVuYWJsZSB0byBvcGVuIGNsaWVudCBzb2NrZXQiLCBlcnIpCit9CisKK2ZtdC5QcmludGxuKHNlcnZpY2UuQWRkKDIsMikpCitmbXQuUHJpbnRsbihzZXJ2aWNlMi5HZXRUZW1wZXJhdHVyZSgpKQorKi8KKwordHlwZSBUTXVsdGlwbGV4ZWRQcm90b2NvbCBzdHJ1Y3QgeworCVRQcm90b2NvbAorCXNlcnZpY2VOYW1lIHN0cmluZworfQorCitjb25zdCBNVUxUSVBMRVhFRF9TRVBBUkFUT1IgPSAiOiIKKworZnVuYyBOZXdUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCBUUHJvdG9jb2wsIHNlcnZpY2VOYW1lIHN0cmluZykgKlRNdWx0aXBsZXhlZFByb3RvY29sIHsKKwlyZXR1cm4gJlRNdWx0aXBsZXhlZFByb3RvY29seworCQlUUHJvdG9jb2w6ICAgcHJvdG9jb2wsCisJCXNlcnZpY2VOYW1lOiBzZXJ2aWNlTmFtZSwKKwl9Cit9CisKK2Z1bmMgKHQgKlRNdWx0aXBsZXhlZFByb3RvY29sKSBXcml0ZU1lc3NhZ2VCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxaWQgaW50MzIpIGVycm9yIHsKKwlpZiB0eXBlSWQgPT0gQ0FMTCB8fCB0eXBlSWQgPT0gT05FV0FZIHsKKwkJcmV0dXJuIHQuVFByb3RvY29sLldyaXRlTWVzc2FnZUJlZ2luKHQuc2VydmljZU5hbWUrTVVMVElQTEVYRURfU0VQQVJBVE9SK25hbWUsIHR5cGVJZCwgc2VxaWQpCisJfSBlbHNlIHsKKwkJcmV0dXJuIHQuVFByb3RvY29sLldyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHR5cGVJZCwgc2VxaWQpCisJfQorfQorCisvKgorVE11bHRpcGxleGVkUHJvY2Vzc29yIGlzIGEgVFByb2Nlc3NvciBhbGxvd2luZworYSBzaW5nbGUgVFNlcnZlciB0byBwcm92aWRlIG11bHRpcGxlIHNlcnZpY2VzLgorCitUbyBkbyBzbywgeW91IGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gcmVnaXN0ZXIgYWRkaXRpb25hbAorcHJvY2Vzc29ycyB3aXRoIGl0LCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisKK3ZhciBwcm9jZXNzb3IgPSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvY2Vzc29yKCkKKworZmlyc3RQcm9jZXNzb3IgOj0KK3Byb2Nlc3Nvci5SZWdpc3RlclByb2Nlc3NvcigiRmlyc3RTZXJ2aWNlIiwgZmlyc3RQcm9jZXNzb3IpCisKK3Byb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigKKyAgIkNhbGN1bGF0b3IiLAorICBDYWxjdWxhdG9yLk5ld0NhbGN1bGF0b3JQcm9jZXNzb3IoJkNhbGN1bGF0b3JIYW5kbGVye30pLAorKQorCitwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgICJXZWF0aGVyUmVwb3J0IiwKKyAgV2VhdGhlclJlcG9ydC5OZXdXZWF0aGVyUmVwb3J0UHJvY2Vzc29yKCZXZWF0aGVyUmVwb3J0SGFuZGxlcnt9KSwKKykKKworc2VydmVyVHJhbnNwb3J0LCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJ2ZXJTb2NrZXRUaW1lb3V0KGFkZHIsIFRJTUVPVVQpCitpZiBlcnIgIT0gbmlsIHsKKyAgdC5GYXRhbCgiVW5hYmxlIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0IiwgZXJyKQorfQorc2VydmVyIDo9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyMihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCkKK3NlcnZlci5TZXJ2ZSgpOworKi8KKwordHlwZSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3Igc3RydWN0IHsKKwlzZXJ2aWNlUHJvY2Vzc29yTWFwIG1hcFtzdHJpbmddVFByb2Nlc3NvcgorCURlZmF1bHRQcm9jZXNzb3IgICAgVFByb2Nlc3NvcgorfQorCitmdW5jIE5ld1RNdWx0aXBsZXhlZFByb2Nlc3NvcigpICpUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgeworCXJldHVybiAmVE11bHRpcGxleGVkUHJvY2Vzc29yeworCQlzZXJ2aWNlUHJvY2Vzc29yTWFwOiBtYWtlKG1hcFtzdHJpbmddVFByb2Nlc3NvciksCisJfQorfQorCitmdW5jICh0ICpUTXVsdGlwbGV4ZWRQcm9jZXNzb3IpIFJlZ2lzdGVyRGVmYXVsdChwcm9jZXNzb3IgVFByb2Nlc3NvcikgeworCXQuRGVmYXVsdFByb2Nlc3NvciA9IHByb2Nlc3NvcgorfQorCitmdW5jICh0ICpUTXVsdGlwbGV4ZWRQcm9jZXNzb3IpIFJlZ2lzdGVyUHJvY2Vzc29yKG5hbWUgc3RyaW5nLCBwcm9jZXNzb3IgVFByb2Nlc3NvcikgeworCWlmIHQuc2VydmljZVByb2Nlc3Nvck1hcCA9PSBuaWwgeworCQl0LnNlcnZpY2VQcm9jZXNzb3JNYXAgPSBtYWtlKG1hcFtzdHJpbmddVFByb2Nlc3NvcikKKwl9CisJdC5zZXJ2aWNlUHJvY2Vzc29yTWFwW25hbWVdID0gcHJvY2Vzc29yCit9CisKK2Z1bmMgKHQgKlRNdWx0aXBsZXhlZFByb2Nlc3NvcikgUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pIHsKKwluYW1lLCB0eXBlSWQsIHNlcWlkLCBlcnIgOj0gaW4uUmVhZE1lc3NhZ2VCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBmYWxzZSwgZXJyCisJfQorCWlmIHR5cGVJZCAhPSBDQUxMICYmIHR5cGVJZCAhPSBPTkVXQVkgeworCQlyZXR1cm4gZmFsc2UsIGZtdC5FcnJvcmYoIlVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlICV2IiwgdHlwZUlkKQorCX0KKwkvL2V4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZQorCXYgOj0gc3RyaW5ncy5TcGxpdE4obmFtZSwgTVVMVElQTEVYRURfU0VQQVJBVE9SLCAyKQorCWlmIGxlbih2KSAhPSAyIHsKKwkJaWYgdC5EZWZhdWx0UHJvY2Vzc29yICE9IG5pbCB7CisJCQlzbWIgOj0gTmV3U3RvcmVkTWVzc2FnZVByb3RvY29sKGluLCBuYW1lLCB0eXBlSWQsIHNlcWlkKQorCQkJcmV0dXJuIHQuRGVmYXVsdFByb2Nlc3Nvci5Qcm9jZXNzKGN0eCwgc21iLCBvdXQpCisJCX0KKwkJcmV0dXJuIGZhbHNlLCBmbXQuRXJyb3JmKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogJXMuICBEaWQgeW91IGZvcmdldCB0byB1c2UgYSBUTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/IiwgbmFtZSkKKwl9CisJYWN0dWFsUHJvY2Vzc29yLCBvayA6PSB0LnNlcnZpY2VQcm9jZXNzb3JNYXBbdlswXV0KKwlpZiAhb2sgeworCQlyZXR1cm4gZmFsc2UsIGZtdC5FcnJvcmYoIlNlcnZpY2UgbmFtZSBub3QgZm91bmQ6ICVzLiAgRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyIsIHZbMF0pCisJfQorCXNtYiA6PSBOZXdTdG9yZWRNZXNzYWdlUHJvdG9jb2woaW4sIHZbMV0sIHR5cGVJZCwgc2VxaWQpCisJcmV0dXJuIGFjdHVhbFByb2Nlc3Nvci5Qcm9jZXNzKGN0eCwgc21iLCBvdXQpCit9CisKKy8vUHJvdG9jb2wgdGhhdCB1c2Ugc3RvcmVkIG1lc3NhZ2UgZm9yIFJlYWRNZXNzYWdlQmVnaW4KK3R5cGUgc3RvcmVkTWVzc2FnZVByb3RvY29sIHN0cnVjdCB7CisJVFByb3RvY29sCisJbmFtZSAgIHN0cmluZworCXR5cGVJZCBUTWVzc2FnZVR5cGUKKwlzZXFpZCAgaW50MzIKK30KKworZnVuYyBOZXdTdG9yZWRNZXNzYWdlUHJvdG9jb2wocHJvdG9jb2wgVFByb3RvY29sLCBuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxaWQgaW50MzIpICpzdG9yZWRNZXNzYWdlUHJvdG9jb2wgeworCXJldHVybiAmc3RvcmVkTWVzc2FnZVByb3RvY29se3Byb3RvY29sLCBuYW1lLCB0eXBlSWQsIHNlcWlkfQorfQorCitmdW5jIChzICpzdG9yZWRNZXNzYWdlUHJvdG9jb2wpIFJlYWRNZXNzYWdlQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcWlkIGludDMyLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gcy5uYW1lLCBzLnR5cGVJZCwgcy5zZXFpZCwgbmlsCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L251bWVyaWMuZ28gYi9saWIvZ28vdGhyaWZ0L251bWVyaWMuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4ZGFhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvbnVtZXJpYy5nbwpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJtYXRoIgorCSJzdHJjb252IgorKQorCit0eXBlIE51bWVyaWMgaW50ZXJmYWNlIHsKKwlJbnQ2NCgpIGludDY0CisJSW50MzIoKSBpbnQzMgorCUludDE2KCkgaW50MTYKKwlCeXRlKCkgYnl0ZQorCUludCgpIGludAorCUZsb2F0NjQoKSBmbG9hdDY0CisJRmxvYXQzMigpIGZsb2F0MzIKKwlTdHJpbmcoKSBzdHJpbmcKKwlpc051bGwoKSBib29sCit9CisKK3R5cGUgbnVtZXJpYyBzdHJ1Y3QgeworCWlWYWx1ZSBpbnQ2NAorCWRWYWx1ZSBmbG9hdDY0CisJc1ZhbHVlIHN0cmluZworCWlzTmlsICBib29sCit9CisKK3ZhciAoCisJSU5GSU5JVFkgICAgICAgICAgTnVtZXJpYworCU5FR0FUSVZFX0lORklOSVRZIE51bWVyaWMKKwlOQU4gICAgICAgICAgICAgICBOdW1lcmljCisJWkVSTyAgICAgICAgICAgICAgTnVtZXJpYworCU5VTUVSSUNfTlVMTCAgICAgIE51bWVyaWMKKykKKworZnVuYyBOZXdOdW1lcmljRnJvbURvdWJsZShkVmFsdWUgZmxvYXQ2NCkgTnVtZXJpYyB7CisJaWYgbWF0aC5Jc0luZihkVmFsdWUsIDEpIHsKKwkJcmV0dXJuIElORklOSVRZCisJfQorCWlmIG1hdGguSXNJbmYoZFZhbHVlLCAtMSkgeworCQlyZXR1cm4gTkVHQVRJVkVfSU5GSU5JVFkKKwl9CisJaWYgbWF0aC5Jc05hTihkVmFsdWUpIHsKKwkJcmV0dXJuIE5BTgorCX0KKwlpVmFsdWUgOj0gaW50NjQoZFZhbHVlKQorCXNWYWx1ZSA6PSBzdHJjb252LkZvcm1hdEZsb2F0KGRWYWx1ZSwgJ2cnLCAxMCwgNjQpCisJaXNOaWwgOj0gZmFsc2UKKwlyZXR1cm4gJm51bWVyaWN7aVZhbHVlOiBpVmFsdWUsIGRWYWx1ZTogZFZhbHVlLCBzVmFsdWU6IHNWYWx1ZSwgaXNOaWw6IGlzTmlsfQorfQorCitmdW5jIE5ld051bWVyaWNGcm9tSTY0KGlWYWx1ZSBpbnQ2NCkgTnVtZXJpYyB7CisJZFZhbHVlIDo9IGZsb2F0NjQoaVZhbHVlKQorCXNWYWx1ZSA6PSBzdHJpbmcoaVZhbHVlKQorCWlzTmlsIDo9IGZhbHNlCisJcmV0dXJuICZudW1lcmlje2lWYWx1ZTogaVZhbHVlLCBkVmFsdWU6IGRWYWx1ZSwgc1ZhbHVlOiBzVmFsdWUsIGlzTmlsOiBpc05pbH0KK30KKworZnVuYyBOZXdOdW1lcmljRnJvbUkzMihpVmFsdWUgaW50MzIpIE51bWVyaWMgeworCWRWYWx1ZSA6PSBmbG9hdDY0KGlWYWx1ZSkKKwlzVmFsdWUgOj0gc3RyaW5nKGlWYWx1ZSkKKwlpc05pbCA6PSBmYWxzZQorCXJldHVybiAmbnVtZXJpY3tpVmFsdWU6IGludDY0KGlWYWx1ZSksIGRWYWx1ZTogZFZhbHVlLCBzVmFsdWU6IHNWYWx1ZSwgaXNOaWw6IGlzTmlsfQorfQorCitmdW5jIE5ld051bWVyaWNGcm9tU3RyaW5nKHNWYWx1ZSBzdHJpbmcpIE51bWVyaWMgeworCWlmIHNWYWx1ZSA9PSBJTkZJTklUWS5TdHJpbmcoKSB7CisJCXJldHVybiBJTkZJTklUWQorCX0KKwlpZiBzVmFsdWUgPT0gTkVHQVRJVkVfSU5GSU5JVFkuU3RyaW5nKCkgeworCQlyZXR1cm4gTkVHQVRJVkVfSU5GSU5JVFkKKwl9CisJaWYgc1ZhbHVlID09IE5BTi5TdHJpbmcoKSB7CisJCXJldHVybiBOQU4KKwl9CisJaVZhbHVlLCBfIDo9IHN0cmNvbnYuUGFyc2VJbnQoc1ZhbHVlLCAxMCwgNjQpCisJZFZhbHVlLCBfIDo9IHN0cmNvbnYuUGFyc2VGbG9hdChzVmFsdWUsIDY0KQorCWlzTmlsIDo9IGxlbihzVmFsdWUpID09IDAKKwlyZXR1cm4gJm51bWVyaWN7aVZhbHVlOiBpVmFsdWUsIGRWYWx1ZTogZFZhbHVlLCBzVmFsdWU6IHNWYWx1ZSwgaXNOaWw6IGlzTmlsfQorfQorCitmdW5jIE5ld051bWVyaWNGcm9tSlNPTlN0cmluZyhzVmFsdWUgc3RyaW5nLCBpc051bGwgYm9vbCkgTnVtZXJpYyB7CisJaWYgaXNOdWxsIHsKKwkJcmV0dXJuIE5ld051bGxOdW1lcmljKCkKKwl9CisJaWYgc1ZhbHVlID09IEpTT05fSU5GSU5JVFkgeworCQlyZXR1cm4gSU5GSU5JVFkKKwl9CisJaWYgc1ZhbHVlID09IEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgeworCQlyZXR1cm4gTkVHQVRJVkVfSU5GSU5JVFkKKwl9CisJaWYgc1ZhbHVlID09IEpTT05fTkFOIHsKKwkJcmV0dXJuIE5BTgorCX0KKwlpVmFsdWUsIF8gOj0gc3RyY29udi5QYXJzZUludChzVmFsdWUsIDEwLCA2NCkKKwlkVmFsdWUsIF8gOj0gc3RyY29udi5QYXJzZUZsb2F0KHNWYWx1ZSwgNjQpCisJcmV0dXJuICZudW1lcmlje2lWYWx1ZTogaVZhbHVlLCBkVmFsdWU6IGRWYWx1ZSwgc1ZhbHVlOiBzVmFsdWUsIGlzTmlsOiBpc051bGx9Cit9CisKK2Z1bmMgTmV3TnVsbE51bWVyaWMoKSBOdW1lcmljIHsKKwlyZXR1cm4gJm51bWVyaWN7aVZhbHVlOiAwLCBkVmFsdWU6IDAuMCwgc1ZhbHVlOiAiIiwgaXNOaWw6IHRydWV9Cit9CisKK2Z1bmMgKHAgKm51bWVyaWMpIEludDY0KCkgaW50NjQgeworCXJldHVybiBwLmlWYWx1ZQorfQorCitmdW5jIChwICpudW1lcmljKSBJbnQzMigpIGludDMyIHsKKwlyZXR1cm4gaW50MzIocC5pVmFsdWUpCit9CisKK2Z1bmMgKHAgKm51bWVyaWMpIEludDE2KCkgaW50MTYgeworCXJldHVybiBpbnQxNihwLmlWYWx1ZSkKK30KKworZnVuYyAocCAqbnVtZXJpYykgQnl0ZSgpIGJ5dGUgeworCXJldHVybiBieXRlKHAuaVZhbHVlKQorfQorCitmdW5jIChwICpudW1lcmljKSBJbnQoKSBpbnQgeworCXJldHVybiBpbnQocC5pVmFsdWUpCit9CisKK2Z1bmMgKHAgKm51bWVyaWMpIEZsb2F0NjQoKSBmbG9hdDY0IHsKKwlyZXR1cm4gcC5kVmFsdWUKK30KKworZnVuYyAocCAqbnVtZXJpYykgRmxvYXQzMigpIGZsb2F0MzIgeworCXJldHVybiBmbG9hdDMyKHAuZFZhbHVlKQorfQorCitmdW5jIChwICpudW1lcmljKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwLnNWYWx1ZQorfQorCitmdW5jIChwICpudW1lcmljKSBpc051bGwoKSBib29sIHsKKwlyZXR1cm4gcC5pc05pbAorfQorCitmdW5jIGluaXQoKSB7CisJSU5GSU5JVFkgPSAmbnVtZXJpY3tpVmFsdWU6IDAsIGRWYWx1ZTogbWF0aC5JbmYoMSksIHNWYWx1ZTogIkluZmluaXR5IiwgaXNOaWw6IGZhbHNlfQorCU5FR0FUSVZFX0lORklOSVRZID0gJm51bWVyaWN7aVZhbHVlOiAwLCBkVmFsdWU6IG1hdGguSW5mKC0xKSwgc1ZhbHVlOiAiLUluZmluaXR5IiwgaXNOaWw6IGZhbHNlfQorCU5BTiA9ICZudW1lcmlje2lWYWx1ZTogMCwgZFZhbHVlOiBtYXRoLk5hTigpLCBzVmFsdWU6ICJOYU4iLCBpc05pbDogZmFsc2V9CisJWkVSTyA9ICZudW1lcmlje2lWYWx1ZTogMCwgZFZhbHVlOiAwLCBzVmFsdWU6ICIwIiwgaXNOaWw6IGZhbHNlfQorCU5VTUVSSUNfTlVMTCA9ICZudW1lcmlje2lWYWx1ZTogMCwgZFZhbHVlOiAwLCBzVmFsdWU6ICIwIiwgaXNOaWw6IHRydWV9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3BvaW50ZXJpemUuZ28gYi9saWIvZ28vdGhyaWZ0L3BvaW50ZXJpemUuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2YjJjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvcG9pbnRlcml6ZS5nbwpAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRoaXMgZmlsZSBpcyBob21lIHRvIGhlbHBlcnMgdGhhdCBjb252ZXJ0IGZyb20gdmFyaW91cyBiYXNlIHR5cGVzIHRvCisvLyByZXNwZWN0aXZlIHBvaW50ZXIgdHlwZXMuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgR28gZG9lcyBub3QgcGVybWl0CisvLyByZWZlcmVuY2VzIHRvIGNvbnN0YW50cywgbm9yIGNhbiBhIHBvaW50ZXIgdHlwZSB0byBiYXNlIHR5cGUgYmUgYWxsb2NhdGVkCisvLyBhbmQgaW5pdGlhbGl6ZWQgaW4gYSBzaW5nbGUgZXhwcmVzc2lvbi4KKy8vCisvLyBFLmcuLCB0aGlzIGlzIG5vdCBhbGxvd2VkOgorLy8KKy8vICAgIHZhciBpcCAqaW50ID0gJjUKKy8vCisvLyBCdXQgdGhpcyAqaXMqIGFsbG93ZWQ6CisvLworLy8gICAgZnVuYyBJbnRQdHIoaSBpbnQpICppbnQgeyByZXR1cm4gJmkgfQorLy8gICAgdmFyIGlwICppbnQgPSBJbnRQdHIoNSkKKy8vCisvLyBTaW5jZSBwb2ludGVycyB0byBiYXNlIHR5cGVzIGFyZSBjb21tb25wbGFjZSBhcyBbb3B0aW9uYWxdIGZpZWxkcyBpbgorLy8gZXhwb3J0ZWQgdGhyaWZ0IHN0cnVjdHMsIHdlIGZhY3RvciBzdWNoIGhlbHBlcnMgaGVyZS4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworZnVuYyBGbG9hdDMyUHRyKHYgZmxvYXQzMikgKmZsb2F0MzIgeyByZXR1cm4gJnYgfQorZnVuYyBGbG9hdDY0UHRyKHYgZmxvYXQ2NCkgKmZsb2F0NjQgeyByZXR1cm4gJnYgfQorZnVuYyBJbnRQdHIodiBpbnQpICppbnQgICAgICAgICAgICAgeyByZXR1cm4gJnYgfQorZnVuYyBJbnQzMlB0cih2IGludDMyKSAqaW50MzIgICAgICAgeyByZXR1cm4gJnYgfQorZnVuYyBJbnQ2NFB0cih2IGludDY0KSAqaW50NjQgICAgICAgeyByZXR1cm4gJnYgfQorZnVuYyBTdHJpbmdQdHIodiBzdHJpbmcpICpzdHJpbmcgICAgeyByZXR1cm4gJnYgfQorZnVuYyBVaW50MzJQdHIodiB1aW50MzIpICp1aW50MzIgICAgeyByZXR1cm4gJnYgfQorZnVuYyBVaW50NjRQdHIodiB1aW50NjQpICp1aW50NjQgICAgeyByZXR1cm4gJnYgfQorZnVuYyBCb29sUHRyKHYgYm9vbCkgKmJvb2wgICAgICAgICAgeyByZXR1cm4gJnYgfQorZnVuYyBCeXRlU2xpY2VQdHIodiBbXWJ5dGUpICpbXWJ5dGUgeyByZXR1cm4gJnYgfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wcm9jZXNzb3JfZmFjdG9yeS5nbyBiL2xpYi9nby90aHJpZnQvcHJvY2Vzc29yX2ZhY3RvcnkuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiMTMyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvcHJvY2Vzc29yX2ZhY3RvcnkuZ28KQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgImNvbnRleHQiCisKKy8vIEEgcHJvY2Vzc29yIGlzIGEgZ2VuZXJpYyBvYmplY3Qgd2hpY2ggb3BlcmF0ZXMgdXBvbiBhbiBpbnB1dCBzdHJlYW0gYW5kCisvLyB3cml0ZXMgdG8gc29tZSBvdXRwdXQgc3RyZWFtLgordHlwZSBUUHJvY2Vzc29yIGludGVyZmFjZSB7CisJUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pCit9CisKK3R5cGUgVFByb2Nlc3NvckZ1bmN0aW9uIGludGVyZmFjZSB7CisJUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBzZXFJZCBpbnQzMiwgaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKQorfQorCisvLyBUaGUgZGVmYXVsdCBwcm9jZXNzb3IgZmFjdG9yeSBqdXN0IHJldHVybnMgYSBzaW5nbGV0b24KKy8vIGluc3RhbmNlLgordHlwZSBUUHJvY2Vzc29yRmFjdG9yeSBpbnRlcmZhY2UgeworCUdldFByb2Nlc3Nvcih0cmFucyBUVHJhbnNwb3J0KSBUUHJvY2Vzc29yCit9CisKK3R5cGUgdFByb2Nlc3NvckZhY3Rvcnkgc3RydWN0IHsKKwlwcm9jZXNzb3IgVFByb2Nlc3NvcgorfQorCitmdW5jIE5ld1RQcm9jZXNzb3JGYWN0b3J5KHAgVFByb2Nlc3NvcikgVFByb2Nlc3NvckZhY3RvcnkgeworCXJldHVybiAmdFByb2Nlc3NvckZhY3Rvcnl7cHJvY2Vzc29yOiBwfQorfQorCitmdW5jIChwICp0UHJvY2Vzc29yRmFjdG9yeSkgR2V0UHJvY2Vzc29yKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm9jZXNzb3IgeworCXJldHVybiBwLnByb2Nlc3NvcgorfQorCisvKioKKyAqIFRoZSBkZWZhdWx0IHByb2Nlc3NvciBmYWN0b3J5IGp1c3QgcmV0dXJucyBhIHNpbmdsZXRvbgorICogaW5zdGFuY2UuCisgKi8KK3R5cGUgVFByb2Nlc3NvckZ1bmN0aW9uRmFjdG9yeSBpbnRlcmZhY2UgeworCUdldFByb2Nlc3NvckZ1bmN0aW9uKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm9jZXNzb3JGdW5jdGlvbgorfQorCit0eXBlIHRQcm9jZXNzb3JGdW5jdGlvbkZhY3Rvcnkgc3RydWN0IHsKKwlwcm9jZXNzb3IgVFByb2Nlc3NvckZ1bmN0aW9uCit9CisKK2Z1bmMgTmV3VFByb2Nlc3NvckZ1bmN0aW9uRmFjdG9yeShwIFRQcm9jZXNzb3JGdW5jdGlvbikgVFByb2Nlc3NvckZ1bmN0aW9uRmFjdG9yeSB7CisJcmV0dXJuICZ0UHJvY2Vzc29yRnVuY3Rpb25GYWN0b3J5e3Byb2Nlc3NvcjogcH0KK30KKworZnVuYyAocCAqdFByb2Nlc3NvckZ1bmN0aW9uRmFjdG9yeSkgR2V0UHJvY2Vzc29yRnVuY3Rpb24odHJhbnMgVFRyYW5zcG9ydCkgVFByb2Nlc3NvckZ1bmN0aW9uIHsKKwlyZXR1cm4gcC5wcm9jZXNzb3IKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNWI3YTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sLmdvCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImVycm9ycyIKKwkiZm10IgorKQorCitjb25zdCAoCisJVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMAorCVZFUlNJT05fMSAgICA9IDB4ODAwMTAwMDAKKykKKwordHlwZSBUUHJvdG9jb2wgaW50ZXJmYWNlIHsKKwlXcml0ZU1lc3NhZ2VCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxaWQgaW50MzIpIGVycm9yCisJV3JpdGVNZXNzYWdlRW5kKCkgZXJyb3IKKwlXcml0ZVN0cnVjdEJlZ2luKG5hbWUgc3RyaW5nKSBlcnJvcgorCVdyaXRlU3RydWN0RW5kKCkgZXJyb3IKKwlXcml0ZUZpZWxkQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUVHlwZSwgaWQgaW50MTYpIGVycm9yCisJV3JpdGVGaWVsZEVuZCgpIGVycm9yCisJV3JpdGVGaWVsZFN0b3AoKSBlcnJvcgorCVdyaXRlTWFwQmVnaW4oa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IKKwlXcml0ZU1hcEVuZCgpIGVycm9yCisJV3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvcgorCVdyaXRlTGlzdEVuZCgpIGVycm9yCisJV3JpdGVTZXRCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yCisJV3JpdGVTZXRFbmQoKSBlcnJvcgorCVdyaXRlQm9vbCh2YWx1ZSBib29sKSBlcnJvcgorCVdyaXRlQnl0ZSh2YWx1ZSBpbnQ4KSBlcnJvcgorCVdyaXRlSTE2KHZhbHVlIGludDE2KSBlcnJvcgorCVdyaXRlSTMyKHZhbHVlIGludDMyKSBlcnJvcgorCVdyaXRlSTY0KHZhbHVlIGludDY0KSBlcnJvcgorCVdyaXRlRG91YmxlKHZhbHVlIGZsb2F0NjQpIGVycm9yCisJV3JpdGVTdHJpbmcodmFsdWUgc3RyaW5nKSBlcnJvcgorCVdyaXRlQmluYXJ5KHZhbHVlIFtdYnl0ZSkgZXJyb3IKKworCVJlYWRNZXNzYWdlQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcWlkIGludDMyLCBlcnIgZXJyb3IpCisJUmVhZE1lc3NhZ2VFbmQoKSBlcnJvcgorCVJlYWRTdHJ1Y3RCZWdpbigpIChuYW1lIHN0cmluZywgZXJyIGVycm9yKQorCVJlYWRTdHJ1Y3RFbmQoKSBlcnJvcgorCVJlYWRGaWVsZEJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2LCBlcnIgZXJyb3IpCisJUmVhZEZpZWxkRW5kKCkgZXJyb3IKKwlSZWFkTWFwQmVnaW4oKSAoa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIGVycm9yKQorCVJlYWRNYXBFbmQoKSBlcnJvcgorCVJlYWRMaXN0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlcnIgZXJyb3IpCisJUmVhZExpc3RFbmQoKSBlcnJvcgorCVJlYWRTZXRCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikKKwlSZWFkU2V0RW5kKCkgZXJyb3IKKwlSZWFkQm9vbCgpICh2YWx1ZSBib29sLCBlcnIgZXJyb3IpCisJUmVhZEJ5dGUoKSAodmFsdWUgaW50OCwgZXJyIGVycm9yKQorCVJlYWRJMTYoKSAodmFsdWUgaW50MTYsIGVyciBlcnJvcikKKwlSZWFkSTMyKCkgKHZhbHVlIGludDMyLCBlcnIgZXJyb3IpCisJUmVhZEk2NCgpICh2YWx1ZSBpbnQ2NCwgZXJyIGVycm9yKQorCVJlYWREb3VibGUoKSAodmFsdWUgZmxvYXQ2NCwgZXJyIGVycm9yKQorCVJlYWRTdHJpbmcoKSAodmFsdWUgc3RyaW5nLCBlcnIgZXJyb3IpCisJUmVhZEJpbmFyeSgpICh2YWx1ZSBbXWJ5dGUsIGVyciBlcnJvcikKKworCVNraXAoZmllbGRUeXBlIFRUeXBlKSAoZXJyIGVycm9yKQorCUZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpCisKKwlUcmFuc3BvcnQoKSBUVHJhbnNwb3J0Cit9CisKKy8vIFRoZSBtYXhpbXVtIHJlY3Vyc2l2ZSBkZXB0aCB0aGUgc2tpcCgpIGZ1bmN0aW9uIHdpbGwgdHJhdmVyc2UKK2NvbnN0IERFRkFVTFRfUkVDVVJTSU9OX0RFUFRIID0gNjQKKworLy8gU2tpcHMgb3ZlciB0aGUgbmV4dCBkYXRhIGVsZW1lbnQgZnJvbSB0aGUgcHJvdmlkZWQgaW5wdXQgVFByb3RvY29sIG9iamVjdC4KK2Z1bmMgU2tpcERlZmF1bHREZXB0aChwcm90IFRQcm90b2NvbCwgdHlwZUlkIFRUeXBlKSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIFNraXAocHJvdCwgdHlwZUlkLCBERUZBVUxUX1JFQ1VSU0lPTl9ERVBUSCkKK30KKworLy8gU2tpcHMgb3ZlciB0aGUgbmV4dCBkYXRhIGVsZW1lbnQgZnJvbSB0aGUgcHJvdmlkZWQgaW5wdXQgVFByb3RvY29sIG9iamVjdC4KK2Z1bmMgU2tpcChzZWxmIFRQcm90b2NvbCwgZmllbGRUeXBlIFRUeXBlLCBtYXhEZXB0aCBpbnQpIChlcnIgZXJyb3IpIHsKKworCWlmIG1heERlcHRoIDw9IDAgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoREVQVEhfTElNSVQsIGVycm9ycy5OZXcoIkRlcHRoIGxpbWl0IGV4Y2VlZGVkIikpCisJfQorCisJc3dpdGNoIGZpZWxkVHlwZSB7CisJY2FzZSBTVE9QOgorCQlyZXR1cm4KKwljYXNlIEJPT0w6CisJCV8sIGVyciA9IHNlbGYuUmVhZEJvb2woKQorCQlyZXR1cm4KKwljYXNlIEJZVEU6CisJCV8sIGVyciA9IHNlbGYuUmVhZEJ5dGUoKQorCQlyZXR1cm4KKwljYXNlIEkxNjoKKwkJXywgZXJyID0gc2VsZi5SZWFkSTE2KCkKKwkJcmV0dXJuCisJY2FzZSBJMzI6CisJCV8sIGVyciA9IHNlbGYuUmVhZEkzMigpCisJCXJldHVybgorCWNhc2UgSTY0OgorCQlfLCBlcnIgPSBzZWxmLlJlYWRJNjQoKQorCQlyZXR1cm4KKwljYXNlIERPVUJMRToKKwkJXywgZXJyID0gc2VsZi5SZWFkRG91YmxlKCkKKwkJcmV0dXJuCisJY2FzZSBTVFJJTkc6CisJCV8sIGVyciA9IHNlbGYuUmVhZFN0cmluZygpCisJCXJldHVybgorCWNhc2UgU1RSVUNUOgorCQlpZiBfLCBlcnIgPSBzZWxmLlJlYWRTdHJ1Y3RCZWdpbigpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCQlmb3IgeworCQkJXywgdHlwZUlkLCBfLCBfIDo9IHNlbGYuUmVhZEZpZWxkQmVnaW4oKQorCQkJaWYgdHlwZUlkID09IFNUT1AgeworCQkJCWJyZWFrCisJCQl9CisJCQllcnIgOj0gU2tpcChzZWxmLCB0eXBlSWQsIG1heERlcHRoLTEpCisJCQlpZiBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCQlzZWxmLlJlYWRGaWVsZEVuZCgpCisJCX0KKwkJcmV0dXJuIHNlbGYuUmVhZFN0cnVjdEVuZCgpCisJY2FzZSBNQVA6CisJCWtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZXJyIDo9IHNlbGYuUmVhZE1hcEJlZ2luKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwkJZm9yIGkgOj0gMDsgaSA8IHNpemU7IGkrKyB7CisJCQllcnIgOj0gU2tpcChzZWxmLCBrZXlUeXBlLCBtYXhEZXB0aC0xKQorCQkJaWYgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQkJc2VsZi5Ta2lwKHZhbHVlVHlwZSkKKwkJfQorCQlyZXR1cm4gc2VsZi5SZWFkTWFwRW5kKCkKKwljYXNlIFNFVDoKKwkJZWxlbVR5cGUsIHNpemUsIGVyciA6PSBzZWxmLlJlYWRTZXRCZWdpbigpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJCWZvciBpIDo9IDA7IGkgPCBzaXplOyBpKysgeworCQkJZXJyIDo9IFNraXAoc2VsZiwgZWxlbVR5cGUsIG1heERlcHRoLTEpCisJCQlpZiBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCX0KKwkJcmV0dXJuIHNlbGYuUmVhZFNldEVuZCgpCisJY2FzZSBMSVNUOgorCQllbGVtVHlwZSwgc2l6ZSwgZXJyIDo9IHNlbGYuUmVhZExpc3RCZWdpbigpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJCWZvciBpIDo9IDA7IGkgPCBzaXplOyBpKysgeworCQkJZXJyIDo9IFNraXAoc2VsZiwgZWxlbVR5cGUsIG1heERlcHRoLTEpCisJCQlpZiBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCX0KKwkJcmV0dXJuIHNlbGYuUmVhZExpc3RFbmQoKQorCWRlZmF1bHQ6CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGVycm9ycy5OZXcoZm10LlNwcmludGYoIlVua25vd24gZGF0YSB0eXBlICVkIiwgZmllbGRUeXBlKSkpCisJfQorCXJldHVybiBuaWwKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcHJvdG9jb2xfZXhjZXB0aW9uLmdvIGIvbGliL2dvL3RocmlmdC9wcm90b2NvbF9leGNlcHRpb24uZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlhYjc1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvcHJvdG9jb2xfZXhjZXB0aW9uLmdvCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiZW5jb2RpbmcvYmFzZTY0IgorKQorCisvLyBUaHJpZnQgUHJvdG9jb2wgZXhjZXB0aW9uCit0eXBlIFRQcm90b2NvbEV4Y2VwdGlvbiBpbnRlcmZhY2UgeworCVRFeGNlcHRpb24KKwlUeXBlSWQoKSBpbnQKK30KKworY29uc3QgKAorCVVOS05PV05fUFJPVE9DT0xfRVhDRVBUSU9OID0gMAorCUlOVkFMSURfREFUQSAgICAgICAgICAgICAgID0gMQorCU5FR0FUSVZFX1NJWkUgICAgICAgICAgICAgID0gMgorCVNJWkVfTElNSVQgICAgICAgICAgICAgICAgID0gMworCUJBRF9WRVJTSU9OICAgICAgICAgICAgICAgID0gNAorCU5PVF9JTVBMRU1FTlRFRCAgICAgICAgICAgID0gNQorCURFUFRIX0xJTUlUICAgICAgICAgICAgICAgID0gNgorKQorCit0eXBlIHRQcm90b2NvbEV4Y2VwdGlvbiBzdHJ1Y3QgeworCXR5cGVJZCAgaW50CisJbWVzc2FnZSBzdHJpbmcKK30KKworZnVuYyAocCAqdFByb3RvY29sRXhjZXB0aW9uKSBUeXBlSWQoKSBpbnQgeworCXJldHVybiBwLnR5cGVJZAorfQorCitmdW5jIChwICp0UHJvdG9jb2xFeGNlcHRpb24pIFN0cmluZygpIHN0cmluZyB7CisJcmV0dXJuIHAubWVzc2FnZQorfQorCitmdW5jIChwICp0UHJvdG9jb2xFeGNlcHRpb24pIEVycm9yKCkgc3RyaW5nIHsKKwlyZXR1cm4gcC5tZXNzYWdlCit9CisKK2Z1bmMgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVyciBlcnJvcikgVFByb3RvY29sRXhjZXB0aW9uIHsKKwlpZiBlcnIgPT0gbmlsIHsKKwkJcmV0dXJuIG5pbAorCX0KKwlpZiBlLCBvayA6PSBlcnIuKFRQcm90b2NvbEV4Y2VwdGlvbik7IG9rIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgXywgb2sgOj0gZXJyLihiYXNlNjQuQ29ycnVwdElucHV0RXJyb3IpOyBvayB7CisJCXJldHVybiAmdFByb3RvY29sRXhjZXB0aW9ue0lOVkFMSURfREFUQSwgZXJyLkVycm9yKCl9CisJfQorCXJldHVybiAmdFByb3RvY29sRXhjZXB0aW9ue1VOS05PV05fUFJPVE9DT0xfRVhDRVBUSU9OLCBlcnIuRXJyb3IoKX0KK30KKworZnVuYyBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShlcnJUeXBlIGludCwgZXJyIGVycm9yKSBUUHJvdG9jb2xFeGNlcHRpb24geworCWlmIGVyciA9PSBuaWwgeworCQlyZXR1cm4gbmlsCisJfQorCXJldHVybiAmdFByb3RvY29sRXhjZXB0aW9ue2VyclR5cGUsIGVyci5FcnJvcigpfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wcm90b2NvbF9mYWN0b3J5LmdvIGIvbGliL2dvL3RocmlmdC9wcm90b2NvbF9mYWN0b3J5LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MGY3OTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX2ZhY3RvcnkuZ28KQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCisvLyBGYWN0b3J5IGludGVyZmFjZSBmb3IgY29uc3RydWN0aW5nIHByb3RvY29sIGluc3RhbmNlcy4KK3R5cGUgVFByb3RvY29sRmFjdG9yeSBpbnRlcmZhY2UgeworCUdldFByb3RvY29sKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm90b2NvbAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9wcm90b2NvbF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NDA1NWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX3Rlc3QuZ28KQEAgLTAsMCArMSw1MTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiYnl0ZXMiCisJImNvbnRleHQiCisJImlvL2lvdXRpbCIKKwkibWF0aCIKKwkibmV0IgorCSJuZXQvaHR0cCIKKwkidGVzdGluZyIKKykKKworY29uc3QgUFJPVE9DT0xfQklOQVJZX0RBVEFfU0laRSA9IDE1NQorCit2YXIgKAorCXByb3RvY29sX2JkYXRhIFtdYnl0ZSAvLyB0ZXN0IGRhdGEgZm9yIHdyaXRpbmc7IHNhbWUgYXMgZGF0YQorCUJPT0xfVkFMVUVTICAgIFtdYm9vbAorCUJZVEVfVkFMVUVTICAgIFtdaW50OAorCUlOVDE2X1ZBTFVFUyAgIFtdaW50MTYKKwlJTlQzMl9WQUxVRVMgICBbXWludDMyCisJSU5UNjRfVkFMVUVTICAgW11pbnQ2NAorCURPVUJMRV9WQUxVRVMgIFtdZmxvYXQ2NAorCVNUUklOR19WQUxVRVMgIFtdc3RyaW5nCispCisKK2Z1bmMgaW5pdCgpIHsKKwlwcm90b2NvbF9iZGF0YSA9IG1ha2UoW11ieXRlLCBQUk9UT0NPTF9CSU5BUllfREFUQV9TSVpFKQorCWZvciBpIDo9IDA7IGkgPCBQUk9UT0NPTF9CSU5BUllfREFUQV9TSVpFOyBpKysgeworCQlwcm90b2NvbF9iZGF0YVtpXSA9IGJ5dGUoKGkgKyAnYScpICUgMjU1KQorCX0KKwlCT09MX1ZBTFVFUyA9IFtdYm9vbHtmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlfQorCUJZVEVfVkFMVUVTID0gW11pbnQ4ezExNywgMCwgMSwgMzIsIDEyNywgLTEyOCwgLTF9CisJSU5UMTZfVkFMVUVTID0gW11pbnQxNns0NTksIDAsIDEsIC0xLCAtMTI4LCAxMjcsIDMyNzY3LCAtMzI3Njh9CisJSU5UMzJfVkFMVUVTID0gW11pbnQzMns0NTksIDAsIDEsIC0xLCAtMTI4LCAxMjcsIDMyNzY3LCAyMTQ3NDgzNjQ3LCAtMjE0NzQ4MzUzNX0KKwlJTlQ2NF9WQUxVRVMgPSBbXWludDY0ezQ1OSwgMCwgMSwgLTEsIC0xMjgsIDEyNywgMzI3NjcsIDIxNDc0ODM2NDcsIC0yMTQ3NDgzNTM1LCAzNDM1OTczODQ4MSwgLTM1MTg0MzcyMDg4NzE5LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgOTIyMzM3MjAzNjg1NDc3NTgwN30KKwlET1VCTEVfVkFMVUVTID0gW11mbG9hdDY0ezQ1OS4zLCAwLjAsIC0xLjAsIDEuMCwgMC41LCAwLjMzMzMsIDMuMTQxNTksIDEuNTM3ZS0zOCwgMS42NzNlMjUsIDYuMDIyMTQxNzllMjMsIC02LjAyMjE0MTc5ZTIzLCBJTkZJTklUWS5GbG9hdDY0KCksIE5FR0FUSVZFX0lORklOSVRZLkZsb2F0NjQoKSwgTkFOLkZsb2F0NjQoKX0KKwlTVFJJTkdfVkFMVUVTID0gW11zdHJpbmd7IiIsICJhIiwgInN0W3VmXWYiLCAic3QsdTpmZiB3aXRoIHNwYWNlcyIsICJzdHVmZlx0d2l0aFxuZXNjYXBlXFxjaGFyYWN0ZXJzJy4uLlwibG90c3tvZn1mdW48L3htbD4ifQorfQorCit0eXBlIEhUVFBFY2hvU2VydmVyIHN0cnVjdHt9Cit0eXBlIEhUVFBIZWFkZXJFY2hvU2VydmVyIHN0cnVjdHt9CisKK2Z1bmMgKHAgKkhUVFBFY2hvU2VydmVyKSBTZXJ2ZUhUVFAodyBodHRwLlJlc3BvbnNlV3JpdGVyLCByZXEgKmh0dHAuUmVxdWVzdCkgeworCWJ1ZiwgZXJyIDo9IGlvdXRpbC5SZWFkQWxsKHJlcS5Cb2R5KQorCWlmIGVyciAhPSBuaWwgeworCQl3LldyaXRlSGVhZGVyKGh0dHAuU3RhdHVzQmFkUmVxdWVzdCkKKwkJdy5Xcml0ZShidWYpCisJfSBlbHNlIHsKKwkJdy5Xcml0ZUhlYWRlcihodHRwLlN0YXR1c09LKQorCQl3LldyaXRlKGJ1ZikKKwl9Cit9CisKK2Z1bmMgKHAgKkhUVFBIZWFkZXJFY2hvU2VydmVyKSBTZXJ2ZUhUVFAodyBodHRwLlJlc3BvbnNlV3JpdGVyLCByZXEgKmh0dHAuUmVxdWVzdCkgeworCWJ1ZiwgZXJyIDo9IGlvdXRpbC5SZWFkQWxsKHJlcS5Cb2R5KQorCWlmIGVyciAhPSBuaWwgeworCQl3LldyaXRlSGVhZGVyKGh0dHAuU3RhdHVzQmFkUmVxdWVzdCkKKwkJdy5Xcml0ZShidWYpCisJfSBlbHNlIHsKKwkJdy5Xcml0ZUhlYWRlcihodHRwLlN0YXR1c09LKQorCQl3LldyaXRlKGJ1ZikKKwl9Cit9CisKK2Z1bmMgSHR0cENsaWVudFNldHVwRm9yVGVzdCh0ICp0ZXN0aW5nLlQpIChuZXQuTGlzdGVuZXIsIG5ldC5BZGRyKSB7CisJYWRkciwgZXJyIDo9IEZpbmRBdmFpbGFibGVUQ1BTZXJ2ZXJQb3J0KDQwMDAwKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIGZpbmQgYXZhaWxhYmxlIHRjcCBwb3J0IGFkZHI6ICVzIiwgZXJyKQorCQlyZXR1cm4gbmlsLCBhZGRyCisJfQorCWwsIGVyciA6PSBuZXQuTGlzdGVuKGFkZHIuTmV0d29yaygpLCBhZGRyLlN0cmluZygpKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHNldHVwIHRjcCBsaXN0ZW5lciBvbiAlczogJXMiLCBhZGRyLlN0cmluZygpLCBlcnIpCisJCXJldHVybiBsLCBhZGRyCisJfQorCWdvIGh0dHAuU2VydmUobCwgJkhUVFBFY2hvU2VydmVye30pCisJcmV0dXJuIGwsIGFkZHIKK30KKworZnVuYyBIdHRwQ2xpZW50U2V0dXBGb3JIZWFkZXJUZXN0KHQgKnRlc3RpbmcuVCkgKG5ldC5MaXN0ZW5lciwgbmV0LkFkZHIpIHsKKwlhZGRyLCBlcnIgOj0gRmluZEF2YWlsYWJsZVRDUFNlcnZlclBvcnQoNDAwMDApCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gZmluZCBhdmFpbGFibGUgdGNwIHBvcnQgYWRkcjogJXMiLCBlcnIpCisJCXJldHVybiBuaWwsIGFkZHIKKwl9CisJbCwgZXJyIDo9IG5ldC5MaXN0ZW4oYWRkci5OZXR3b3JrKCksIGFkZHIuU3RyaW5nKCkpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gc2V0dXAgdGNwIGxpc3RlbmVyIG9uICVzOiAlcyIsIGFkZHIuU3RyaW5nKCksIGVycikKKwkJcmV0dXJuIGwsIGFkZHIKKwl9CisJZ28gaHR0cC5TZXJ2ZShsLCAmSFRUUEhlYWRlckVjaG9TZXJ2ZXJ7fSkKKwlyZXR1cm4gbCwgYWRkcgorfQorCitmdW5jIFJlYWRXcml0ZVByb3RvY29sVGVzdCh0ICp0ZXN0aW5nLlQsIHByb3RvY29sRmFjdG9yeSBUUHJvdG9jb2xGYWN0b3J5KSB7CisJYnVmIDo9IGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgMTAyNCkpCisJbCwgYWRkciA6PSBIdHRwQ2xpZW50U2V0dXBGb3JUZXN0KHQpCisJZGVmZXIgbC5DbG9zZSgpCisJdHJhbnNwb3J0cyA6PSBbXVRUcmFuc3BvcnRGYWN0b3J5eworCQlOZXdUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSgxMDI0KSwKKwkJTmV3U3RyZWFtVHJhbnNwb3J0RmFjdG9yeShidWYsIGJ1ZiwgdHJ1ZSksCisJCU5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpKSwKKwkJTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5V2l0aEZhY3RvcnkoMCwgTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkoMTAyNCkpLAorCQlOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnlXaXRoRmFjdG9yeSg2LCBOZXdUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSgxMDI0KSksCisJCU5ld1RabGliVHJhbnNwb3J0RmFjdG9yeVdpdGhGYWN0b3J5KDksIE5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpKSksCisJCU5ld1RIdHRwUG9zdENsaWVudFRyYW5zcG9ydEZhY3RvcnkoImh0dHA6Ly8iICsgYWRkci5TdHJpbmcoKSksCisJfQorCWZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKKwkJdHJhbnMsIGVyciA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3IoZXJyKQorCQkJY29udGludWUKKwkJfQorCQlwIDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlQm9vbCh0LCBwLCB0cmFucykKKwkJdHJhbnMuQ2xvc2UoKQorCX0KKwlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7CisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KKwkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUJ5dGUodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVJMTYodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVJMzIodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVJNjQodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVEb3VibGUodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVTdHJpbmcodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVCaW5hcnkodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVJNjQodCwgcCwgdHJhbnMpCisJCVJlYWRXcml0ZURvdWJsZSh0LCBwLCB0cmFucykKKwkJUmVhZFdyaXRlQmluYXJ5KHQsIHAsIHRyYW5zKQorCQlSZWFkV3JpdGVCeXRlKHQsIHAsIHRyYW5zKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFJlYWRXcml0ZUJvb2wodCB0ZXN0aW5nLlRCLCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgeworCXRoZXR5cGUgOj0gVFR5cGUoQk9PTCkKKwl0aGVsZW4gOj0gbGVuKEJPT0xfVkFMVUVTKQorCWVyciA6PSBwLldyaXRlTGlzdEJlZ2luKHRoZXR5cGUsIHRoZWxlbikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciB3cml0aW5nIGxpc3QgYmVnaW46ICVxIiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgZXJyLCB0aGV0eXBlKQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBCT09MX1ZBTFVFUyB7CisJCWVyciA9IHAuV3JpdGVCb29sKHYpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAldiBFcnJvciB3cml0aW5nIGJvb2wgaW4gbGlzdCBhdCBpbmRleCAldjogJXYiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCisJCX0KKwl9CisJcC5Xcml0ZUxpc3RFbmQoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUICV2IEVycm9yIHdyaXRpbmcgbGlzdCBlbmQ6ICV2IiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgZXJyLCBCT09MX1ZBTFVFUykKKwl9CisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwl0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgRXJyb3IgcmVhZGluZyBsaXN0OiAldiIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgQk9PTF9WQUxVRVMpCisJfQorCV8sIG9rIDo9IHAuKCpUU2ltcGxlSlNPTlByb3RvY29sKQorCWlmICFvayB7CisJCWlmIHRoZXR5cGUgIT0gdGhldHlwZTIgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKKwkJfQorCQlpZiB0aGVsZW4gIT0gdGhlbGVuMiB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCisJCX0KKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgQk9PTF9WQUxVRVMgeworCQl2YWx1ZSwgZXJyIDo9IHAuUmVhZEJvb2woKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgRXJyb3IgcmVhZGluZyBib29sIGF0IGluZGV4ICV2OiAldiIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgaywgdikKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRXJyb3JmKCIlczogaW5kZXggJXYgJXYgJXYgJXYgIT0gJXYiLCAiUmVhZFdyaXRlQm9vbCIsIGssIHAsIHRyYW5zLCB2LCB2YWx1ZSkKKwkJfQorCX0KKwllcnIgPSBwLlJlYWRMaXN0RW5kKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCBVbmFibGUgdG8gcmVhZCBsaXN0IGVuZDogJXEiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIpCisJfQorfQorCitmdW5jIFJlYWRXcml0ZUJ5dGUodCB0ZXN0aW5nLlRCLCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgeworCXRoZXR5cGUgOj0gVFR5cGUoQllURSkKKwl0aGVsZW4gOj0gbGVuKEJZVEVfVkFMVUVTKQorCWVyciA6PSBwLldyaXRlTGlzdEJlZ2luKHRoZXR5cGUsIHRoZWxlbikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciB3cml0aW5nIGxpc3QgYmVnaW46ICVxIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgZXJyLCB0aGV0eXBlKQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBCWVRFX1ZBTFVFUyB7CisJCWVyciA9IHAuV3JpdGVCeXRlKHYpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciB3cml0aW5nIGJ5dGUgaW4gbGlzdCBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCisJCX0KKwl9CisJZXJyID0gcC5Xcml0ZUxpc3RFbmQoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHdyaXRpbmcgbGlzdCBlbmQ6ICVxIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgZXJyLCBCWVRFX1ZBTFVFUykKKwl9CisJZXJyID0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciBmbHVzaGluZyBsaXN0IG9mIGJ5dGVzOiAlcSIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIGVyciwgQllURV9WQUxVRVMpCisJfQorCXRoZXR5cGUyLCB0aGVsZW4yLCBlcnIgOj0gcC5SZWFkTGlzdEJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGxpc3Q6ICVxIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgZXJyLCBCWVRFX1ZBTFVFUykKKwl9CisJXywgb2sgOj0gcC4oKlRTaW1wbGVKU09OUHJvdG9jb2wpCisJaWYgIW9rIHsKKwkJaWYgdGhldHlwZSAhPSB0aGV0eXBlMiB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIHRoZXR5cGUsIHRoZXR5cGUyKQorCQl9CisJCWlmIHRoZWxlbiAhPSB0aGVsZW4yIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICV2ICE9IGxlbiAldiIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKKwkJfQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBCWVRFX1ZBTFVFUyB7CisJCXZhbHVlLCBlcnIgOj0gcC5SZWFkQnl0ZSgpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGJ5dGUgYXQgaW5kZXggJWQ6ICVxIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgZXJyLCBrLCB2KQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlZCAhPSAlZCIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIHYsIHZhbHVlKQorCQl9CisJfQorCWVyciA9IHAuUmVhZExpc3RFbmQoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUIFVuYWJsZSB0byByZWFkIGxpc3QgZW5kOiAlcSIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIGVycikKKwl9Cit9CisKK2Z1bmMgUmVhZFdyaXRlSTE2KHQgdGVzdGluZy5UQiwgcCBUUHJvdG9jb2wsIHRyYW5zIFRUcmFuc3BvcnQpIHsKKwl0aGV0eXBlIDo9IFRUeXBlKEkxNikKKwl0aGVsZW4gOj0gbGVuKElOVDE2X1ZBTFVFUykKKwlwLldyaXRlTGlzdEJlZ2luKHRoZXR5cGUsIHRoZWxlbikKKwlmb3IgXywgdiA6PSByYW5nZSBJTlQxNl9WQUxVRVMgeworCQlwLldyaXRlSTE2KHYpCisJfQorCXAuV3JpdGVMaXN0RW5kKCkKKwlwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCXRoZXR5cGUyLCB0aGVsZW4yLCBlcnIgOj0gcC5SZWFkTGlzdEJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGxpc3Q6ICVxIiwgIlJlYWRXcml0ZUkxNiIsIHAsIHRyYW5zLCBlcnIsIElOVDE2X1ZBTFVFUykKKwl9CisJXywgb2sgOj0gcC4oKlRTaW1wbGVKU09OUHJvdG9jb2wpCisJaWYgIW9rIHsKKwkJaWYgdGhldHlwZSAhPSB0aGV0eXBlMiB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVJMTYiLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCisJCX0KKwkJaWYgdGhlbGVuICE9IHRoZWxlbjIgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXYgIT0gbGVuICV2IiwgIlJlYWRXcml0ZUkxNiIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCisJCX0KKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgSU5UMTZfVkFMVUVTIHsKKwkJdmFsdWUsIGVyciA6PSBwLlJlYWRJMTYoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBpbnQxNiBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlSTE2IiwgcCwgdHJhbnMsIGVyciwgaywgdikKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJWQgIT0gJWQiLCAiUmVhZFdyaXRlSTE2IiwgcCwgdHJhbnMsIHYsIHZhbHVlKQorCQl9CisJfQorCWVyciA9IHAuUmVhZExpc3RFbmQoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUIFVuYWJsZSB0byByZWFkIGxpc3QgZW5kOiAlcSIsICJSZWFkV3JpdGVJMTYiLCBwLCB0cmFucywgZXJyKQorCX0KK30KKworZnVuYyBSZWFkV3JpdGVJMzIodCB0ZXN0aW5nLlRCLCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgeworCXRoZXR5cGUgOj0gVFR5cGUoSTMyKQorCXRoZWxlbiA6PSBsZW4oSU5UMzJfVkFMVUVTKQorCXAuV3JpdGVMaXN0QmVnaW4odGhldHlwZSwgdGhlbGVuKQorCWZvciBfLCB2IDo9IHJhbmdlIElOVDMyX1ZBTFVFUyB7CisJCXAuV3JpdGVJMzIodikKKwl9CisJcC5Xcml0ZUxpc3RFbmQoKQorCXAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgbGlzdDogJXEiLCAiUmVhZFdyaXRlSTMyIiwgcCwgdHJhbnMsIGVyciwgSU5UMzJfVkFMVUVTKQorCX0KKwlfLCBvayA6PSBwLigqVFNpbXBsZUpTT05Qcm90b2NvbCkKKwlpZiAhb2sgeworCQlpZiB0aGV0eXBlICE9IHRoZXR5cGUyIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZUkzMiIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKKwkJfQorCQlpZiB0aGVsZW4gIT0gdGhlbGVuMiB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlSTMyIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKKwkJfQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBJTlQzMl9WQUxVRVMgeworCQl2YWx1ZSwgZXJyIDo9IHAuUmVhZEkzMigpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGludDMyIGF0IGluZGV4ICVkOiAlcSIsICJSZWFkV3JpdGVJMzIiLCBwLCB0cmFucywgZXJyLCBrLCB2KQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlZCAhPSAlZCIsICJSZWFkV3JpdGVJMzIiLCBwLCB0cmFucywgdiwgdmFsdWUpCisJCX0KKwl9CisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgVW5hYmxlIHRvIHJlYWQgbGlzdCBlbmQ6ICVxIiwgIlJlYWRXcml0ZUkzMiIsIHAsIHRyYW5zLCBlcnIpCisJfQorfQorCitmdW5jIFJlYWRXcml0ZUk2NCh0IHRlc3RpbmcuVEIsIHAgVFByb3RvY29sLCB0cmFucyBUVHJhbnNwb3J0KSB7CisJdGhldHlwZSA6PSBUVHlwZShJNjQpCisJdGhlbGVuIDo9IGxlbihJTlQ2NF9WQUxVRVMpCisJcC5Xcml0ZUxpc3RCZWdpbih0aGV0eXBlLCB0aGVsZW4pCisJZm9yIF8sIHYgOj0gcmFuZ2UgSU5UNjRfVkFMVUVTIHsKKwkJcC5Xcml0ZUk2NCh2KQorCX0KKwlwLldyaXRlTGlzdEVuZCgpCisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwl0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVJNjQiLCBwLCB0cmFucywgZXJyLCBJTlQ2NF9WQUxVRVMpCisJfQorCV8sIG9rIDo9IHAuKCpUU2ltcGxlSlNPTlByb3RvY29sKQorCWlmICFvayB7CisJCWlmIHRoZXR5cGUgIT0gdGhldHlwZTIgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlSTY0IiwgcCwgdHJhbnMsIHRoZXR5cGUsIHRoZXR5cGUyKQorCQl9CisJCWlmIHRoZWxlbiAhPSB0aGVsZW4yIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICV2ICE9IGxlbiAldiIsICJSZWFkV3JpdGVJNjQiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQorCQl9CisJfQorCWZvciBrLCB2IDo9IHJhbmdlIElOVDY0X1ZBTFVFUyB7CisJCXZhbHVlLCBlcnIgOj0gcC5SZWFkSTY0KCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgaW50NjQgYXQgaW5kZXggJWQ6ICVxIiwgIlJlYWRXcml0ZUk2NCIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUICVxICE9ICVxIiwgIlJlYWRXcml0ZUk2NCIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKKwkJfQorCX0KKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCBVbmFibGUgdG8gcmVhZCBsaXN0IGVuZDogJXEiLCAiUmVhZFdyaXRlSTY0IiwgcCwgdHJhbnMsIGVycikKKwl9Cit9CisKK2Z1bmMgUmVhZFdyaXRlRG91YmxlKHQgdGVzdGluZy5UQiwgcCBUUHJvdG9jb2wsIHRyYW5zIFRUcmFuc3BvcnQpIHsKKwl0aGV0eXBlIDo9IFRUeXBlKERPVUJMRSkKKwl0aGVsZW4gOj0gbGVuKERPVUJMRV9WQUxVRVMpCisJcC5Xcml0ZUxpc3RCZWdpbih0aGV0eXBlLCB0aGVsZW4pCisJZm9yIF8sIHYgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCXAuV3JpdGVEb3VibGUodikKKwl9CisJcC5Xcml0ZUxpc3RFbmQoKQorCXAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUICV2IEVycm9yIHJlYWRpbmcgbGlzdDogJXYiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIGVyciwgRE9VQkxFX1ZBTFVFUykKKwl9CisJaWYgdGhldHlwZSAhPSB0aGV0eXBlMiB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKKwl9CisJaWYgdGhlbGVuICE9IHRoZWxlbjIgeworCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCXZhbHVlLCBlcnIgOj0gcC5SZWFkRG91YmxlKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgZG91YmxlIGF0IGluZGV4ICVkOiAldiIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgZXJyLCBrLCB2KQorCQl9CisJCWlmIG1hdGguSXNOYU4odikgeworCQkJaWYgIW1hdGguSXNOYU4odmFsdWUpIHsKKwkJCQl0LkVycm9yZigiJXM6ICVUICVUIG1hdGguSXNOYU4oJXYpICE9IG1hdGguSXNOYU4oJXYpIiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKKwkJCX0KKwkJfSBlbHNlIGlmIHYgIT0gdmFsdWUgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAldiAhPSAldiIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgdiwgdmFsdWUpCisJCX0KKwl9CisJZXJyID0gcC5SZWFkTGlzdEVuZCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgVW5hYmxlIHRvIHJlYWQgbGlzdCBlbmQ6ICVxIiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCBlcnIpCisJfQorfQorCitmdW5jIFJlYWRXcml0ZVN0cmluZyh0IHRlc3RpbmcuVEIsIHAgVFByb3RvY29sLCB0cmFucyBUVHJhbnNwb3J0KSB7CisJdGhldHlwZSA6PSBUVHlwZShTVFJJTkcpCisJdGhlbGVuIDo9IGxlbihTVFJJTkdfVkFMVUVTKQorCXAuV3JpdGVMaXN0QmVnaW4odGhldHlwZSwgdGhlbGVuKQorCWZvciBfLCB2IDo9IHJhbmdlIFNUUklOR19WQUxVRVMgeworCQlwLldyaXRlU3RyaW5nKHYpCisJfQorCXAuV3JpdGVMaXN0RW5kKCkKKwlwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCXRoZXR5cGUyLCB0aGVsZW4yLCBlcnIgOj0gcC5SZWFkTGlzdEJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGxpc3Q6ICVxIiwgIlJlYWRXcml0ZVN0cmluZyIsIHAsIHRyYW5zLCBlcnIsIFNUUklOR19WQUxVRVMpCisJfQorCV8sIG9rIDo9IHAuKCpUU2ltcGxlSlNPTlByb3RvY29sKQorCWlmICFvayB7CisJCWlmIHRoZXR5cGUgIT0gdGhldHlwZTIgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIHRoZXR5cGUsIHRoZXR5cGUyKQorCQl9CisJCWlmIHRoZWxlbiAhPSB0aGVsZW4yIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICV2ICE9IGxlbiAldiIsICJSZWFkV3JpdGVTdHJpbmciLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQorCQl9CisJfQorCWZvciBrLCB2IDo9IHJhbmdlIFNUUklOR19WQUxVRVMgeworCQl2YWx1ZSwgZXJyIDo9IHAuUmVhZFN0cmluZygpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIHN0cmluZyBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIGVyciwgaywgdikKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgIT0gJXYiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIHYsIHZhbHVlKQorCQl9CisJfQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUIFVuYWJsZSB0byByZWFkIGxpc3QgZW5kOiAlcSIsICJSZWFkV3JpdGVTdHJpbmciLCBwLCB0cmFucywgZXJyKQorCX0KK30KKworZnVuYyBSZWFkV3JpdGVCaW5hcnkodCB0ZXN0aW5nLlRCLCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgeworCXYgOj0gcHJvdG9jb2xfYmRhdGEKKwlwLldyaXRlQmluYXJ5KHYpCisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwl2YWx1ZSwgZXJyIDo9IHAuUmVhZEJpbmFyeSgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgVW5hYmxlIHRvIHJlYWQgYmluYXJ5OiAlcyIsICJSZWFkV3JpdGVCaW5hcnkiLCBwLCB0cmFucywgZXJyLkVycm9yKCkpCisJfQorCWlmIGxlbih2KSAhPSBsZW4odmFsdWUpIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4odikgIT0gbGVuKHZhbHVlKS4uLiAlZCAhPSAlZCIsICJSZWFkV3JpdGVCaW5hcnkiLCBwLCB0cmFucywgbGVuKHYpLCBsZW4odmFsdWUpKQorCX0gZWxzZSB7CisJCWZvciBpIDo9IDA7IGkgPCBsZW4odik7IGkrKyB7CisJCQlpZiB2W2ldICE9IHZhbHVlW2ldIHsKKwkJCQl0LkVycm9yZigiJXM6ICVUICVUICVzICE9ICVzIiwgIlJlYWRXcml0ZUJpbmFyeSIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L3JpY2hfdHJhbnNwb3J0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMjViZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3JpY2hfdHJhbnNwb3J0LmdvCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICJpbyIKKwordHlwZSBSaWNoVHJhbnNwb3J0IHN0cnVjdCB7CisJVFRyYW5zcG9ydAorfQorCisvLyBXcmFwcyBUcmFuc3BvcnQgdG8gcHJvdmlkZSBUUmljaFRyYW5zcG9ydCBpbnRlcmZhY2UKK2Z1bmMgTmV3VFJpY2hUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKlJpY2hUcmFuc3BvcnQgeworCXJldHVybiAmUmljaFRyYW5zcG9ydHt0cmFuc30KK30KKworZnVuYyAociAqUmljaFRyYW5zcG9ydCkgUmVhZEJ5dGUoKSAoYyBieXRlLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gcmVhZEJ5dGUoci5UVHJhbnNwb3J0KQorfQorCitmdW5jIChyICpSaWNoVHJhbnNwb3J0KSBXcml0ZUJ5dGUoYyBieXRlKSBlcnJvciB7CisJcmV0dXJuIHdyaXRlQnl0ZShyLlRUcmFuc3BvcnQsIGMpCit9CisKK2Z1bmMgKHIgKlJpY2hUcmFuc3BvcnQpIFdyaXRlU3RyaW5nKHMgc3RyaW5nKSAobiBpbnQsIGVyciBlcnJvcikgeworCXJldHVybiByLldyaXRlKFtdYnl0ZShzKSkKK30KKworZnVuYyAociAqUmljaFRyYW5zcG9ydCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgeworCXJldHVybiByLlRUcmFuc3BvcnQuUmVtYWluaW5nQnl0ZXMoKQorfQorCitmdW5jIHJlYWRCeXRlKHIgaW8uUmVhZGVyKSAoYyBieXRlLCBlcnIgZXJyb3IpIHsKKwl2IDo9IFsxXWJ5dGV7MH0KKwluLCBlcnIgOj0gci5SZWFkKHZbMDoxXSkKKwlpZiBuID4gMCAmJiAoZXJyID09IG5pbCB8fCBlcnIgPT0gaW8uRU9GKSB7CisJCXJldHVybiB2WzBdLCBuaWwKKwl9CisJaWYgbiA+IDAgJiYgZXJyICE9IG5pbCB7CisJCXJldHVybiB2WzBdLCBlcnIKKwl9CisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiAwLCBlcnIKKwl9CisJcmV0dXJuIHZbMF0sIG5pbAorfQorCitmdW5jIHdyaXRlQnl0ZSh3IGlvLldyaXRlciwgYyBieXRlKSBlcnJvciB7CisJdiA6PSBbMV1ieXRle2N9CisJXywgZXJyIDo9IHcuV3JpdGUodlswOjFdKQorCXJldHVybiBlcnIKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnRfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWMzZmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9yaWNoX3RyYW5zcG9ydF90ZXN0LmdvCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiYnl0ZXMiCisJImVycm9ycyIKKwkiaW8iCisJInJlZmxlY3QiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdEVuc3VyZVRyYW5zcG9ydHNBcmVSaWNoKHQgKnRlc3RpbmcuVCkgeworCWJ1ZiA6PSBieXRlcy5OZXdCdWZmZXIobWFrZShbXWJ5dGUsIDAsIDEwMjQpKQorCisJdHJhbnNwb3J0cyA6PSBbXVRUcmFuc3BvcnRGYWN0b3J5eworCQlOZXdUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSgxMDI0KSwKKwkJTmV3U3RyZWFtVHJhbnNwb3J0RmFjdG9yeShidWYsIGJ1ZiwgdHJ1ZSksCisJCU5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpKSwKKwkJTmV3VEh0dHBQb3N0Q2xpZW50VHJhbnNwb3J0RmFjdG9yeSgiaHR0cDovLzEyNy4wLjAuMSIpLAorCX0KKwlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7CisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KKwkJXywgb2sgOj0gdHJhbnMuKFRSaWNoVHJhbnNwb3J0KQorCQlpZiAhb2sgeworCQkJdC5FcnJvcmYoIlRyYW5zcG9ydCAlcyBkb2VzIG5vdCBpbXBsZW1lbnQgVFJpY2hUcmFuc3BvcnQgaW50ZXJmYWNlIiwgcmVmbGVjdC5WYWx1ZU9mKHRyYW5zKSkKKwkJfQorCX0KK30KKworLy8gVGVzdFJlYWRCeXRlIHRlc3RzIHdoZXRoZXIgcmVhZEJ5dGUgaGFuZGxlcyBlcnJvciBjYXNlcyBjb3JyZWN0bHkuCitmdW5jIFRlc3RSZWFkQnl0ZSh0ICp0ZXN0aW5nLlQpIHsKKwlmb3IgaSwgdGVzdCA6PSByYW5nZSByZWFkQnl0ZVRlc3RzIHsKKwkJdiwgZXJyIDo9IHJlYWRCeXRlKHRlc3QucikKKwkJaWYgdiAhPSB0ZXN0LnYgeworCQkJdC5GYXRhbGYoIlRlc3RSZWFkQnl0ZSAlZDogdmFsdWUgZGlmZmVycy4gRXhwZWN0ZWQgJWQsIGdvdCAlZCIsIGksIHRlc3QudiwgdGVzdC5yLnYpCisJCX0KKwkJaWYgZXJyICE9IHRlc3QuZXJyIHsKKwkJCXQuRmF0YWxmKCJUZXN0UmVhZEJ5dGUgJWQ6IGVycm9yIGRpZmZlcnMuIEV4cGVjdGVkICVzLCBnb3QgJXMiLCBpLCB0ZXN0LmVyciwgdGVzdC5yLmVycikKKwkJfQorCX0KK30KKwordmFyIHNvbWVFcnJvciA9IGVycm9ycy5OZXcoIlNvbWUgZXJyb3IiKQordmFyIHJlYWRCeXRlVGVzdHMgPSBbXXN0cnVjdCB7CisJciAgICptb2NrUmVhZGVyCisJdiAgIGJ5dGUKKwllcnIgZXJyb3IKK317CisJeyZtb2NrUmVhZGVyezAsIDU1LCBpby5FT0Z9LCAwLCBpby5FT0Z9LCAgICAgICAgLy8gcmVhZGVyIHNlbmRzIEVPRiB3L28gZGF0YQorCXsmbW9ja1JlYWRlcnswLCA1NSwgc29tZUVycm9yfSwgMCwgc29tZUVycm9yfSwgIC8vIHJlYWRlciBzZW5kcyBzb21lIG90aGVyIGVycm9yCisJeyZtb2NrUmVhZGVyezEsIDU1LCBuaWx9LCA1NSwgbmlsfSwgICAgICAgICAgICAgLy8gcmVhZGVyIHNlbmRzIGRhdGEgdy9vIGVycm9yCisJeyZtb2NrUmVhZGVyezEsIDU1LCBpby5FT0Z9LCA1NSwgbmlsfSwgICAgICAgICAgLy8gcmVhZGVyIHNlbmRzIGRhdGEgd2l0aCBFT0YKKwl7Jm1vY2tSZWFkZXJ7MSwgNTUsIHNvbWVFcnJvcn0sIDU1LCBzb21lRXJyb3J9LCAvLyByZWFkZXIgc2VuZHMgZGF0YSB3aXRoc29tZSBlcnJvcgorfQorCit0eXBlIG1vY2tSZWFkZXIgc3RydWN0IHsKKwluICAgaW50CisJdiAgIGJ5dGUKKwllcnIgZXJyb3IKK30KKworZnVuYyAociAqbW9ja1JlYWRlcikgUmVhZChwIFtdYnl0ZSkgKG4gaW50LCBlcnIgZXJyb3IpIHsKKwlpZiByLm4gPiAwIHsKKwkJcFswXSA9IHIudgorCX0KKwlyZXR1cm4gci5uLCByLmVycgorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyLmdvIGIvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZjRkMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXIuZ28KQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorKQorCit0eXBlIFRTZXJpYWxpemVyIHN0cnVjdCB7CisJVHJhbnNwb3J0ICpUTWVtb3J5QnVmZmVyCisJUHJvdG9jb2wgIFRQcm90b2NvbAorfQorCit0eXBlIFRTdHJ1Y3QgaW50ZXJmYWNlIHsKKwlXcml0ZShwIFRQcm90b2NvbCkgZXJyb3IKKwlSZWFkKHAgVFByb3RvY29sKSBlcnJvcgorfQorCitmdW5jIE5ld1RTZXJpYWxpemVyKCkgKlRTZXJpYWxpemVyIHsKKwl0cmFuc3BvcnQgOj0gTmV3VE1lbW9yeUJ1ZmZlckxlbigxMDI0KQorCXByb3RvY29sIDo9IE5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCisJcmV0dXJuICZUU2VyaWFsaXplcnsKKwkJdHJhbnNwb3J0LAorCQlwcm90b2NvbH0KK30KKworZnVuYyAodCAqVFNlcmlhbGl6ZXIpIFdyaXRlU3RyaW5nKGN0eCBjb250ZXh0LkNvbnRleHQsIG1zZyBUU3RydWN0KSAocyBzdHJpbmcsIGVyciBlcnJvcikgeworCXQuVHJhbnNwb3J0LlJlc2V0KCkKKworCWlmIGVyciA9IG1zZy5Xcml0ZSh0LlByb3RvY29sKTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCWlmIGVyciA9IHQuUHJvdG9jb2wuRmx1c2goY3R4KTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKwlpZiBlcnIgPSB0LlRyYW5zcG9ydC5GbHVzaChjdHgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCisJcmV0dXJuIHQuVHJhbnNwb3J0LlN0cmluZygpLCBuaWwKK30KKworZnVuYyAodCAqVFNlcmlhbGl6ZXIpIFdyaXRlKGN0eCBjb250ZXh0LkNvbnRleHQsIG1zZyBUU3RydWN0KSAoYiBbXWJ5dGUsIGVyciBlcnJvcikgeworCXQuVHJhbnNwb3J0LlJlc2V0KCkKKworCWlmIGVyciA9IG1zZy5Xcml0ZSh0LlByb3RvY29sKTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCWlmIGVyciA9IHQuUHJvdG9jb2wuRmx1c2goY3R4KTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCWlmIGVyciA9IHQuVHJhbnNwb3J0LkZsdXNoKGN0eCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisKKwliID0gYXBwZW5kKGIsIHQuVHJhbnNwb3J0LkJ5dGVzKCkuLi4pCisJcmV0dXJuCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvc2VyaWFsaXplcl90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMjI3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdGVzdC5nbwpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlcnJvcnMiCisJImZtdCIKKwkidGVzdGluZyIKKykKKwordHlwZSBQcm90b2NvbEZhY3RvcnkgaW50ZXJmYWNlIHsKKwlHZXRQcm90b2NvbCh0IFRUcmFuc3BvcnQpIFRQcm90b2NvbAorfQorCitmdW5jIGNvbXBhcmVTdHJ1Y3RzKG0sIG0xIE15VGVzdFN0cnVjdCkgKGJvb2wsIGVycm9yKSB7CisJc3dpdGNoIHsKKwljYXNlIG0uT24gIT0gbTEuT246CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiQm9vbGVhbiBub3QgZXF1YWwiKQorCWNhc2UgbS5CICE9IG0xLkI6CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiQnl0ZSBub3QgZXF1YWwiKQorCWNhc2UgbS5JbnQxNiAhPSBtMS5JbnQxNjoKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJJbnQxNiBub3QgZXF1YWwiKQorCWNhc2UgbS5JbnQzMiAhPSBtMS5JbnQzMjoKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJJbnQzMiBub3QgZXF1YWwiKQorCWNhc2UgbS5JbnQ2NCAhPSBtMS5JbnQ2NDoKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJJbnQ2NCBub3QgZXF1YWwiKQorCWNhc2UgbS5EICE9IG0xLkQ6CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiRG91YmxlIG5vdCBlcXVhbCIpCisJY2FzZSBtLlN0ICE9IG0xLlN0OgorCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoIlN0cmluZyBub3QgZXF1YWwiKQorCisJY2FzZSBsZW4obS5CaW4pICE9IGxlbihtMS5CaW4pOgorCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoIkJpbmFyeSBzaXplIG5vdCBlcXVhbCIpCisJY2FzZSBsZW4obS5CaW4pID09IGxlbihtMS5CaW4pOgorCQlmb3IgaSA6PSByYW5nZSBtLkJpbiB7CisJCQlpZiBtLkJpbltpXSAhPSBtMS5CaW5baV0geworCQkJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiQmluYXJ5IG5vdCBlcXVhbCIpCisJCQl9CisJCX0KKwljYXNlIGxlbihtLlN0cmluZ01hcCkgIT0gbGVuKG0xLlN0cmluZ01hcCk6CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiU3RyaW5nTWFwIHNpemUgbm90IGVxdWFsIikKKwljYXNlIGxlbihtLlN0cmluZ0xpc3QpICE9IGxlbihtMS5TdHJpbmdMaXN0KToKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJTdHJpbmdMaXN0IHNpemUgbm90IGVxdWFsIikKKwljYXNlIGxlbihtLlN0cmluZ1NldCkgIT0gbGVuKG0xLlN0cmluZ1NldCk6CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiU3RyaW5nU2V0IHNpemUgbm90IGVxdWFsIikKKworCWNhc2UgbS5FICE9IG0xLkU6CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiTXlUZXN0RW51bSBub3QgZXF1YWwiKQorCisJZGVmYXVsdDoKKwkJcmV0dXJuIHRydWUsIG5pbAorCisJfQorCXJldHVybiB0cnVlLCBuaWwKK30KKworZnVuYyBQcm90b2NvbFRlc3QxKHRlc3QgKnRlc3RpbmcuVCwgcGYgUHJvdG9jb2xGYWN0b3J5KSAoYm9vbCwgZXJyb3IpIHsKKwl0IDo9IE5ld1RTZXJpYWxpemVyKCkKKwl0LlByb3RvY29sID0gcGYuR2V0UHJvdG9jb2wodC5UcmFuc3BvcnQpCisJdmFyIG0gPSBNeVRlc3RTdHJ1Y3R7fQorCW0uT24gPSB0cnVlCisJbS5CID0gaW50OCgwKQorCW0uSW50MTYgPSAxCisJbS5JbnQzMiA9IDIKKwltLkludDY0ID0gMworCW0uRCA9IDQuMQorCW0uU3QgPSAiVGVzdCIKKwltLkJpbiA9IG1ha2UoW11ieXRlLCAxMCkKKwltLlN0cmluZ01hcCA9IG1ha2UobWFwW3N0cmluZ11zdHJpbmcsIDUpCisJbS5TdHJpbmdMaXN0ID0gbWFrZShbXXN0cmluZywgNSkKKwltLlN0cmluZ1NldCA9IG1ha2UobWFwW3N0cmluZ11zdHJ1Y3R7fSwgNSkKKwltLkUgPSAyCisKKwlzLCBlcnIgOj0gdC5Xcml0ZVN0cmluZyhjb250ZXh0LkJhY2tncm91bmQoKSwgJm0pCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldyhmbXQuU3ByaW50ZigiVW5hYmxlIHRvIFNlcmlhbGl6ZSBzdHJ1Y3Rcblx0ICVzIiwgZXJyKSkKKwl9CisKKwl0MSA6PSBOZXdURGVzZXJpYWxpemVyKCkKKwl0MS5Qcm90b2NvbCA9IHBmLkdldFByb3RvY29sKHQxLlRyYW5zcG9ydCkKKwl2YXIgbTEgPSBNeVRlc3RTdHJ1Y3R7fQorCWlmIGVyciA9IHQxLlJlYWRTdHJpbmcoJm0xLCBzKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldyhmbXQuU3ByaW50ZigiVW5hYmxlIHRvIERlc2VyaWFsaXplIHN0cnVjdFxuXHQgJXMiLCBlcnIpKQorCisJfQorCisJcmV0dXJuIGNvbXBhcmVTdHJ1Y3RzKG0sIG0xKQorCit9CisKK2Z1bmMgUHJvdG9jb2xUZXN0Mih0ZXN0ICp0ZXN0aW5nLlQsIHBmIFByb3RvY29sRmFjdG9yeSkgKGJvb2wsIGVycm9yKSB7CisJdCA6PSBOZXdUU2VyaWFsaXplcigpCisJdC5Qcm90b2NvbCA9IHBmLkdldFByb3RvY29sKHQuVHJhbnNwb3J0KQorCXZhciBtID0gTXlUZXN0U3RydWN0e30KKwltLk9uID0gZmFsc2UKKwltLkIgPSBpbnQ4KDApCisJbS5JbnQxNiA9IDEKKwltLkludDMyID0gMgorCW0uSW50NjQgPSAzCisJbS5EID0gNC4xCisJbS5TdCA9ICJUZXN0IgorCW0uQmluID0gbWFrZShbXWJ5dGUsIDEwKQorCW0uU3RyaW5nTWFwID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZywgNSkKKwltLlN0cmluZ0xpc3QgPSBtYWtlKFtdc3RyaW5nLCA1KQorCW0uU3RyaW5nU2V0ID0gbWFrZShtYXBbc3RyaW5nXXN0cnVjdHt9LCA1KQorCW0uRSA9IDIKKworCXMsIGVyciA6PSB0LldyaXRlU3RyaW5nKGNvbnRleHQuQmFja2dyb3VuZCgpLCAmbSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KGZtdC5TcHJpbnRmKCJVbmFibGUgdG8gU2VyaWFsaXplIHN0cnVjdFxuXHQgJXMiLCBlcnIpKQorCisJfQorCisJdDEgOj0gTmV3VERlc2VyaWFsaXplcigpCisJdDEuUHJvdG9jb2wgPSBwZi5HZXRQcm90b2NvbCh0MS5UcmFuc3BvcnQpCisJdmFyIG0xID0gTXlUZXN0U3RydWN0e30KKwlpZiBlcnIgPSB0MS5SZWFkU3RyaW5nKCZtMSwgcyk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoZm10LlNwcmludGYoIlVuYWJsZSB0byBEZXNlcmlhbGl6ZSBzdHJ1Y3Rcblx0ICVzIiwgZXJyKSkKKworCX0KKworCXJldHVybiBjb21wYXJlU3RydWN0cyhtLCBtMSkKKworfQorCitmdW5jIFRlc3RTZXJpYWxpemVyKHQgKnRlc3RpbmcuVCkgeworCisJdmFyIHByb3RvY29sX2ZhY3RvcmllcyBtYXBbc3RyaW5nXVByb3RvY29sRmFjdG9yeQorCXByb3RvY29sX2ZhY3RvcmllcyA9IG1ha2UobWFwW3N0cmluZ11Qcm90b2NvbEZhY3RvcnkpCisJcHJvdG9jb2xfZmFjdG9yaWVzWyJCaW5hcnkiXSA9IE5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKKwlwcm90b2NvbF9mYWN0b3JpZXNbIkNvbXBhY3QiXSA9IE5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkKKwkvL3Byb3RvY29sX2ZhY3Rvcmllc1siU2ltcGxlSlNPTiJdID0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkoKSAtIHdyaXRlIG9ubHksIGNhbid0IGJlIHJlYWQgYmFjayBieSBkZXNpZ24KKwlwcm90b2NvbF9mYWN0b3JpZXNbIkpTT04iXSA9IE5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCkKKworCXZhciB0ZXN0cyBtYXBbc3RyaW5nXWZ1bmMoKnRlc3RpbmcuVCwgUHJvdG9jb2xGYWN0b3J5KSAoYm9vbCwgZXJyb3IpCisJdGVzdHMgPSBtYWtlKG1hcFtzdHJpbmddZnVuYygqdGVzdGluZy5ULCBQcm90b2NvbEZhY3RvcnkpIChib29sLCBlcnJvcikpCisJdGVzdHNbIlRlc3QgMSJdID0gUHJvdG9jb2xUZXN0MQorCXRlc3RzWyJUZXN0IDIiXSA9IFByb3RvY29sVGVzdDIKKwkvL3Rlc3RzWyJUZXN0IDMiXSA9IFByb3RvY29sVGVzdDMgLy8gRXhhbXBsZSBvZiBob3cgdG8gYWRkIGFkZGl0aW9uYWwgdGVzdHMKKworCWZvciBuYW1lLCBwZiA6PSByYW5nZSBwcm90b2NvbF9mYWN0b3JpZXMgeworCisJCWZvciB0ZXN0LCBmIDo9IHJhbmdlIHRlc3RzIHsKKworCQkJaWYgcywgZXJyIDo9IGYodCwgcGYpOyAhcyB8fCBlcnIgIT0gbmlsIHsKKwkJCQl0LkVycm9yZigiJXMgRmFpbGVkIGZvciAlcyBwcm90b2NvbFxuXHQgJXMiLCB0ZXN0LCBuYW1lLCBlcnIpCisJCQl9CisKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyX3R5cGVzX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdHlwZXNfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTQ3MmJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyX3R5cGVzX3Rlc3QuZ28KQEAgLTAsMCArMSw2MzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworLy8gQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKEZJWE1FKQorLy8gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORworCisvKiBUSEUgRk9MTE9XSU5HIFRIUklGVCBGSUxFIFdBUyBVU0VEIFRPIENSRUFURSBUSElTCisKK2VudW0gTXlUZXN0RW51bSB7CisJRklSU1QgPSAxLAorCVNFQ09ORCA9IDIsCisJVEhJUkQgPSAzLAorCUZPVVJUSCA9IDQsCit9CisKK3N0cnVjdCBNeVRlc3RTdHJ1Y3QgeworCTE6IGJvb2wgb24sCisJMjogYnl0ZSBiLAorCTM6IGkxNiBpbnQxNiwKKwk0OiBpMzIgaW50MzIsCisJNTogaTY0IGludDY0LAorCTY6IGRvdWJsZSBkLAorCTc6IHN0cmluZyBzdCwKKwk4OiBiaW5hcnkgYmluLAorCTk6IG1hcDxzdHJpbmcsIHN0cmluZz4gc3RyaW5nTWFwLAorCTEwOiBsaXN0PHN0cmluZz4gc3RyaW5nTGlzdCwKKwkxMTogc2V0PHN0cmluZz4gc3RyaW5nU2V0LAorCTEyOiBNeVRlc3RFbnVtIGUsCit9CisqLworCitpbXBvcnQgKAorCSJmbXQiCispCisKKy8vIChuZWVkZWQgdG8gZW5zdXJlIHNhZmV0eSBiZWNhdXNlIG9mIG5haXZlIGltcG9ydCBsaXN0IGNvbnN0cnVjdGlvbi4pCit2YXIgXyA9IFpFUk8KK3ZhciBfID0gZm10LlByaW50ZgorCit2YXIgR29VbnVzZWRQcm90ZWN0aW9uX18gaW50CisKK3R5cGUgTXlUZXN0RW51bSBpbnQ2NAorCitjb25zdCAoCisJTXlUZXN0RW51bV9GSVJTVCAgTXlUZXN0RW51bSA9IDEKKwlNeVRlc3RFbnVtX1NFQ09ORCBNeVRlc3RFbnVtID0gMgorCU15VGVzdEVudW1fVEhJUkQgIE15VGVzdEVudW0gPSAzCisJTXlUZXN0RW51bV9GT1VSVEggTXlUZXN0RW51bSA9IDQKKykKKworZnVuYyAocCBNeVRlc3RFbnVtKSBTdHJpbmcoKSBzdHJpbmcgeworCXN3aXRjaCBwIHsKKwljYXNlIE15VGVzdEVudW1fRklSU1Q6CisJCXJldHVybiAiRklSU1QiCisJY2FzZSBNeVRlc3RFbnVtX1NFQ09ORDoKKwkJcmV0dXJuICJTRUNPTkQiCisJY2FzZSBNeVRlc3RFbnVtX1RISVJEOgorCQlyZXR1cm4gIlRISVJEIgorCWNhc2UgTXlUZXN0RW51bV9GT1VSVEg6CisJCXJldHVybiAiRk9VUlRIIgorCX0KKwlyZXR1cm4gIjxVTlNFVD4iCit9CisKK2Z1bmMgTXlUZXN0RW51bUZyb21TdHJpbmcocyBzdHJpbmcpIChNeVRlc3RFbnVtLCBlcnJvcikgeworCXN3aXRjaCBzIHsKKwljYXNlICJGSVJTVCI6CisJCXJldHVybiBNeVRlc3RFbnVtX0ZJUlNULCBuaWwKKwljYXNlICJTRUNPTkQiOgorCQlyZXR1cm4gTXlUZXN0RW51bV9TRUNPTkQsIG5pbAorCWNhc2UgIlRISVJEIjoKKwkJcmV0dXJuIE15VGVzdEVudW1fVEhJUkQsIG5pbAorCWNhc2UgIkZPVVJUSCI6CisJCXJldHVybiBNeVRlc3RFbnVtX0ZPVVJUSCwgbmlsCisJfQorCXJldHVybiBNeVRlc3RFbnVtKDApLCBmbXQuRXJyb3JmKCJub3QgYSB2YWxpZCBNeVRlc3RFbnVtIHN0cmluZyIpCit9CisKK2Z1bmMgTXlUZXN0RW51bVB0cih2IE15VGVzdEVudW0pICpNeVRlc3RFbnVtIHsgcmV0dXJuICZ2IH0KKwordHlwZSBNeVRlc3RTdHJ1Y3Qgc3RydWN0IHsKKwlPbiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgYHRocmlmdDoib24sMSIganNvbjoib24iYAorCUIgICAgICAgICAgaW50OCAgICAgICAgICAgICAgICBgdGhyaWZ0OiJiLDIiIGpzb246ImIiYAorCUludDE2ICAgICAgaW50MTYgICAgICAgICAgICAgICBgdGhyaWZ0OiJpbnQxNiwzIiBqc29uOiJpbnQxNiJgCisJSW50MzIgICAgICBpbnQzMiAgICAgICAgICAgICAgIGB0aHJpZnQ6ImludDMyLDQiIGpzb246ImludDMyImAKKwlJbnQ2NCAgICAgIGludDY0ICAgICAgICAgICAgICAgYHRocmlmdDoiaW50NjQsNSIganNvbjoiaW50NjQiYAorCUQgICAgICAgICAgZmxvYXQ2NCAgICAgICAgICAgICBgdGhyaWZ0OiJkLDYiIGpzb246ImQiYAorCVN0ICAgICAgICAgc3RyaW5nICAgICAgICAgICAgICBgdGhyaWZ0OiJzdCw3IiBqc29uOiJzdCJgCisJQmluICAgICAgICBbXWJ5dGUgICAgICAgICAgICAgIGB0aHJpZnQ6ImJpbiw4IiBqc29uOiJiaW4iYAorCVN0cmluZ01hcCAgbWFwW3N0cmluZ11zdHJpbmcgICBgdGhyaWZ0OiJzdHJpbmdNYXAsOSIganNvbjoic3RyaW5nTWFwImAKKwlTdHJpbmdMaXN0IFtdc3RyaW5nICAgICAgICAgICAgYHRocmlmdDoic3RyaW5nTGlzdCwxMCIganNvbjoic3RyaW5nTGlzdCJgCisJU3RyaW5nU2V0ICBtYXBbc3RyaW5nXXN0cnVjdHt9IGB0aHJpZnQ6InN0cmluZ1NldCwxMSIganNvbjoic3RyaW5nU2V0ImAKKwlFICAgICAgICAgIE15VGVzdEVudW0gICAgICAgICAgYHRocmlmdDoiZSwxMiIganNvbjoiZSJgCit9CisKK2Z1bmMgTmV3TXlUZXN0U3RydWN0KCkgKk15VGVzdFN0cnVjdCB7CisJcmV0dXJuICZNeVRlc3RTdHJ1Y3R7fQorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldE9uKCkgYm9vbCB7CisJcmV0dXJuIHAuT24KK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBHZXRCKCkgaW50OCB7CisJcmV0dXJuIHAuQgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldEludDE2KCkgaW50MTYgeworCXJldHVybiBwLkludDE2Cit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0SW50MzIoKSBpbnQzMiB7CisJcmV0dXJuIHAuSW50MzIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBHZXRJbnQ2NCgpIGludDY0IHsKKwlyZXR1cm4gcC5JbnQ2NAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldEQoKSBmbG9hdDY0IHsKKwlyZXR1cm4gcC5ECit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0U3QoKSBzdHJpbmcgeworCXJldHVybiBwLlN0Cit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0QmluKCkgW11ieXRlIHsKKwlyZXR1cm4gcC5CaW4KK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBHZXRTdHJpbmdNYXAoKSBtYXBbc3RyaW5nXXN0cmluZyB7CisJcmV0dXJuIHAuU3RyaW5nTWFwCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0U3RyaW5nTGlzdCgpIFtdc3RyaW5nIHsKKwlyZXR1cm4gcC5TdHJpbmdMaXN0Cit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0U3RyaW5nU2V0KCkgbWFwW3N0cmluZ11zdHJ1Y3R7fSB7CisJcmV0dXJuIHAuU3RyaW5nU2V0Cit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0RSgpIE15VGVzdEVudW0geworCXJldHVybiBwLkUKK30KK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgUmVhZChpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlpZiBfLCBlcnIgOj0gaXByb3QuUmVhZFN0cnVjdEJlZ2luKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCByZWFkIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlmb3IgeworCQlfLCBmaWVsZFR5cGVJZCwgZmllbGRJZCwgZXJyIDo9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCBmaWVsZCAlZCByZWFkIGVycm9yOiAiLCBwLCBmaWVsZElkKSwgZXJyKQorCQl9CisJCWlmIGZpZWxkVHlwZUlkID09IFNUT1AgeworCQkJYnJlYWsKKwkJfQorCQlzd2l0Y2ggZmllbGRJZCB7CisJCWNhc2UgMToKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDEoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgMjoKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDIoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgMzoKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDMoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgNDoKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDQoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgNToKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDUoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgNjoKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDYoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgNzoKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDcoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgODoKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDgoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgOToKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDkoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgMTA6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQxMChpcHJvdCk7IGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJY2FzZSAxMToKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDExKGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQljYXNlIDEyOgorCQkJaWYgZXJyIDo9IHAucmVhZEZpZWxkMTIoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWRlZmF1bHQ6CisJCQlpZiBlcnIgOj0gaXByb3QuU2tpcChmaWVsZFR5cGVJZCk7IGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJfQorCQlpZiBlcnIgOj0gaXByb3QuUmVhZEZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJfQorCWlmIGVyciA6PSBpcHJvdC5SZWFkU3RydWN0RW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCByZWFkIHN0cnVjdCBlbmQgZXJyb3I6ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSByZWFkRmllbGQxKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkQm9vbCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCAxOiAiLCBlcnIpCisJfSBlbHNlIHsKKwkJcC5PbiA9IHYKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDIoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRCeXRlKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDI6ICIsIGVycikKKwl9IGVsc2UgeworCQl0ZW1wIDo9IGludDgodikKKwkJcC5CID0gdGVtcAorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkMyhpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZEkxNigpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCAzOiAiLCBlcnIpCisJfSBlbHNlIHsKKwkJcC5JbnQxNiA9IHYKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDQoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRJMzIoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgNDogIiwgZXJyKQorCX0gZWxzZSB7CisJCXAuSW50MzIgPSB2CisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSByZWFkRmllbGQ1KGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkSTY0KCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDU6ICIsIGVycikKKwl9IGVsc2UgeworCQlwLkludDY0ID0gdgorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkNihpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZERvdWJsZSgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCA2OiAiLCBlcnIpCisJfSBlbHNlIHsKKwkJcC5EID0gdgorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkNyhpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZFN0cmluZygpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCA3OiAiLCBlcnIpCisJfSBlbHNlIHsKKwkJcC5TdCA9IHYKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDgoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRCaW5hcnkoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgODogIiwgZXJyKQorCX0gZWxzZSB7CisJCXAuQmluID0gdgorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkOShpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlfLCBfLCBzaXplLCBlcnIgOj0gaXByb3QuUmVhZE1hcEJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBtYXAgYmVnaW46ICIsIGVycikKKwl9CisJdE1hcCA6PSBtYWtlKG1hcFtzdHJpbmddc3RyaW5nLCBzaXplKQorCXAuU3RyaW5nTWFwID0gdE1hcAorCWZvciBpIDo9IDA7IGkgPCBzaXplOyBpKysgeworCQl2YXIgX2tleTAgc3RyaW5nCisJCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkU3RyaW5nKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCAwOiAiLCBlcnIpCisJCX0gZWxzZSB7CisJCQlfa2V5MCA9IHYKKwkJfQorCQl2YXIgX3ZhbDEgc3RyaW5nCisJCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkU3RyaW5nKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCAwOiAiLCBlcnIpCisJCX0gZWxzZSB7CisJCQlfdmFsMSA9IHYKKwkJfQorCQlwLlN0cmluZ01hcFtfa2V5MF0gPSBfdmFsMQorCX0KKwlpZiBlcnIgOj0gaXByb3QuUmVhZE1hcEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBtYXAgZW5kOiAiLCBlcnIpCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSByZWFkRmllbGQxMChpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlfLCBzaXplLCBlcnIgOj0gaXByb3QuUmVhZExpc3RCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgbGlzdCBiZWdpbjogIiwgZXJyKQorCX0KKwl0U2xpY2UgOj0gbWFrZShbXXN0cmluZywgMCwgc2l6ZSkKKwlwLlN0cmluZ0xpc3QgPSB0U2xpY2UKKwlmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKKwkJdmFyIF9lbGVtMiBzdHJpbmcKKwkJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRTdHJpbmcoKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDA6ICIsIGVycikKKwkJfSBlbHNlIHsKKwkJCV9lbGVtMiA9IHYKKwkJfQorCQlwLlN0cmluZ0xpc3QgPSBhcHBlbmQocC5TdHJpbmdMaXN0LCBfZWxlbTIpCisJfQorCWlmIGVyciA6PSBpcHJvdC5SZWFkTGlzdEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBsaXN0IGVuZDogIiwgZXJyKQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkMTEoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJXywgc2l6ZSwgZXJyIDo9IGlwcm90LlJlYWRTZXRCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgc2V0IGJlZ2luOiAiLCBlcnIpCisJfQorCXRTZXQgOj0gbWFrZShtYXBbc3RyaW5nXXN0cnVjdHt9LCBzaXplKQorCXAuU3RyaW5nU2V0ID0gdFNldAorCWZvciBpIDo9IDA7IGkgPCBzaXplOyBpKysgeworCQl2YXIgX2VsZW0zIHN0cmluZworCQlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZFN0cmluZygpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgMDogIiwgZXJyKQorCQl9IGVsc2UgeworCQkJX2VsZW0zID0gdgorCQl9CisJCXAuU3RyaW5nU2V0W19lbGVtM10gPSBzdHJ1Y3R7fXt9CisJfQorCWlmIGVyciA6PSBpcHJvdC5SZWFkU2V0RW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIHNldCBlbmQ6ICIsIGVycikKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDEyKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkSTMyKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDEyOiAiLCBlcnIpCisJfSBlbHNlIHsKKwkJdGVtcCA6PSBNeVRlc3RFbnVtKHYpCisJCXAuRSA9IHRlbXAKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIFdyaXRlKG9wcm90IFRQcm90b2NvbCkgZXJyb3IgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKCJNeVRlc3RTdHJ1Y3QiKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIHN0cnVjdCBiZWdpbiBlcnJvcjogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDEob3Byb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gcC53cml0ZUZpZWxkMihvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQzKG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDQob3Byb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gcC53cml0ZUZpZWxkNShvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQ2KG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDcob3Byb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gcC53cml0ZUZpZWxkOChvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQ5KG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDEwKG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDExKG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDEyKG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRTdG9wKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJ3cml0ZSBmaWVsZCBzdG9wIGVycm9yOiAiLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigid3JpdGUgc3RydWN0IHN0b3AgZXJyb3I6ICIsIGVycikKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQxKG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oIm9uIiwgQk9PTCwgMSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciAxOm9uOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVCb29sKGJvb2wocC5PbikpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQub24gKDEpIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDE6b246ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkMihvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJiIiwgQllURSwgMik7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciAyOmI6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUJ5dGUoaW50OChwLkIpKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULmIgKDIpIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDI6YjogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQzKG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oImludDE2IiwgSTE2LCAzKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDM6aW50MTY6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUkxNihpbnQxNihwLkludDE2KSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC5pbnQxNiAoMykgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgMzppbnQxNjogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQ0KG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oImludDMyIiwgSTMyLCA0KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDQ6aW50MzI6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUkzMihpbnQzMihwLkludDMyKSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC5pbnQzMiAoNCkgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgNDppbnQzMjogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQ1KG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oImludDY0IiwgSTY0LCA1KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDU6aW50NjQ6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUk2NChpbnQ2NChwLkludDY0KSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC5pbnQ2NCAoNSkgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgNTppbnQ2NDogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQ2KG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oImQiLCBET1VCTEUsIDYpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgNjpkOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVEb3VibGUoZmxvYXQ2NChwLkQpKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULmQgKDYpIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDY6ZDogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQ3KG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oInN0IiwgU1RSSU5HLCA3KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDc6c3Q6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cmluZyhzdHJpbmcocC5TdCkpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuc3QgKDcpIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDc6c3Q6ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkOChvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJiaW4iLCBTVFJJTkcsIDgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgODpiaW46ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUJpbmFyeShwLkJpbik7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC5iaW4gKDgpIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDg6YmluOiAiLCBwKSwgZXJyKQorCX0KKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgd3JpdGVGaWVsZDkob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbigic3RyaW5nTWFwIiwgTUFQLCA5KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDk6c3RyaW5nTWFwOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVNYXBCZWdpbihTVFJJTkcsIFNUUklORywgbGVuKHAuU3RyaW5nTWFwKSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciB3cml0aW5nIG1hcCBiZWdpbjogIiwgZXJyKQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBwLlN0cmluZ01hcCB7CisJCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cmluZyhzdHJpbmcoaykpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULiAoMCkgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJCX0KKwkJaWYgZXJyIDo9IG9wcm90LldyaXRlU3RyaW5nKHN0cmluZyh2KSk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuICgwKSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwkJfQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVNYXBFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHdyaXRpbmcgbWFwIGVuZDogIiwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDk6c3RyaW5nTWFwOiAiLCBwKSwgZXJyKQorCX0KKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgd3JpdGVGaWVsZDEwKG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oInN0cmluZ0xpc3QiLCBMSVNULCAxMCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciAxMDpzdHJpbmdMaXN0OiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVMaXN0QmVnaW4oU1RSSU5HLCBsZW4ocC5TdHJpbmdMaXN0KSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciB3cml0aW5nIGxpc3QgYmVnaW46ICIsIGVycikKKwl9CisJZm9yIF8sIHYgOj0gcmFuZ2UgcC5TdHJpbmdMaXN0IHsKKwkJaWYgZXJyIDo9IG9wcm90LldyaXRlU3RyaW5nKHN0cmluZyh2KSk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuICgwKSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwkJfQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVMaXN0RW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciB3cml0aW5nIGxpc3QgZW5kOiAiLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgMTA6c3RyaW5nTGlzdDogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQxMShvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJzdHJpbmdTZXQiLCBTRVQsIDExKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDExOnN0cmluZ1NldDogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlU2V0QmVnaW4oU1RSSU5HLCBsZW4ocC5TdHJpbmdTZXQpKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHdyaXRpbmcgc2V0IGJlZ2luOiAiLCBlcnIpCisJfQorCWZvciB2IDo9IHJhbmdlIHAuU3RyaW5nU2V0IHsKKwkJaWYgZXJyIDo9IG9wcm90LldyaXRlU3RyaW5nKHN0cmluZyh2KSk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuICgwKSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwkJfQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVTZXRFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHdyaXRpbmcgc2V0IGVuZDogIiwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDExOnN0cmluZ1NldDogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQxMihvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJlIiwgSTMyLCAxMik7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciAxMjplOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVJMzIoaW50MzIocC5FKSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC5lICgxMikgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgMTI6ZTogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIFN0cmluZygpIHN0cmluZyB7CisJaWYgcCA9PSBuaWwgeworCQlyZXR1cm4gIjxuaWw+IgorCX0KKwlyZXR1cm4gZm10LlNwcmludGYoIk15VGVzdFN0cnVjdCglK3YpIiwgKnApCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NlcnZlci5nbyBiL2xpYi9nby90aHJpZnQvc2VydmVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MTNmYTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NlcnZlci5nbwpAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK3R5cGUgVFNlcnZlciBpbnRlcmZhY2UgeworCVByb2Nlc3NvckZhY3RvcnkoKSBUUHJvY2Vzc29yRmFjdG9yeQorCVNlcnZlclRyYW5zcG9ydCgpIFRTZXJ2ZXJUcmFuc3BvcnQKKwlJbnB1dFRyYW5zcG9ydEZhY3RvcnkoKSBUVHJhbnNwb3J0RmFjdG9yeQorCU91dHB1dFRyYW5zcG9ydEZhY3RvcnkoKSBUVHJhbnNwb3J0RmFjdG9yeQorCUlucHV0UHJvdG9jb2xGYWN0b3J5KCkgVFByb3RvY29sRmFjdG9yeQorCU91dHB1dFByb3RvY29sRmFjdG9yeSgpIFRQcm90b2NvbEZhY3RvcnkKKworCS8vIFN0YXJ0cyB0aGUgc2VydmVyCisJU2VydmUoKSBlcnJvcgorCS8vIFN0b3BzIHRoZSBzZXJ2ZXIuIFRoaXMgaXMgb3B0aW9uYWwgb24gYSBwZXItaW1wbGVtZW50YXRpb24gYmFzaXMuIE5vdAorCS8vIGFsbCBzZXJ2ZXJzIGFyZSByZXF1aXJlZCB0byBiZSBjbGVhbmx5IHN0b3BwYWJsZS4KKwlTdG9wKCkgZXJyb3IKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldC5nbyBiL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGQyNGFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXJfc29ja2V0LmdvCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJIm5ldCIKKwkic3luYyIKKwkidGltZSIKKykKKwordHlwZSBUU2VydmVyU29ja2V0IHN0cnVjdCB7CisJbGlzdGVuZXIgICAgICBuZXQuTGlzdGVuZXIKKwlhZGRyICAgICAgICAgIG5ldC5BZGRyCisJY2xpZW50VGltZW91dCB0aW1lLkR1cmF0aW9uCisKKwkvLyBQcm90ZWN0cyB0aGUgaW50ZXJydXB0ZWQgdmFsdWUgdG8gbWFrZSBpdCB0aHJlYWQgc2FmZS4KKwltdSAgICAgICAgICBzeW5jLlJXTXV0ZXgKKwlpbnRlcnJ1cHRlZCBib29sCit9CisKK2Z1bmMgTmV3VFNlcnZlclNvY2tldChsaXN0ZW5BZGRyIHN0cmluZykgKCpUU2VydmVyU29ja2V0LCBlcnJvcikgeworCXJldHVybiBOZXdUU2VydmVyU29ja2V0VGltZW91dChsaXN0ZW5BZGRyLCAwKQorfQorCitmdW5jIE5ld1RTZXJ2ZXJTb2NrZXRUaW1lb3V0KGxpc3RlbkFkZHIgc3RyaW5nLCBjbGllbnRUaW1lb3V0IHRpbWUuRHVyYXRpb24pICgqVFNlcnZlclNvY2tldCwgZXJyb3IpIHsKKwlhZGRyLCBlcnIgOj0gbmV0LlJlc29sdmVUQ1BBZGRyKCJ0Y3AiLCBsaXN0ZW5BZGRyKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJcmV0dXJuICZUU2VydmVyU29ja2V0e2FkZHI6IGFkZHIsIGNsaWVudFRpbWVvdXQ6IGNsaWVudFRpbWVvdXR9LCBuaWwKK30KKworLy8gQ3JlYXRlcyBhIFRTZXJ2ZXJTb2NrZXQgZnJvbSBhIG5ldC5BZGRyCitmdW5jIE5ld1RTZXJ2ZXJTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciBuZXQuQWRkciwgY2xpZW50VGltZW91dCB0aW1lLkR1cmF0aW9uKSAqVFNlcnZlclNvY2tldCB7CisJcmV0dXJuICZUU2VydmVyU29ja2V0e2FkZHI6IGFkZHIsIGNsaWVudFRpbWVvdXQ6IGNsaWVudFRpbWVvdXR9Cit9CisKK2Z1bmMgKHAgKlRTZXJ2ZXJTb2NrZXQpIExpc3RlbigpIGVycm9yIHsKKwlwLm11LkxvY2soKQorCWRlZmVyIHAubXUuVW5sb2NrKCkKKwlpZiBwLklzTGlzdGVuaW5nKCkgeworCQlyZXR1cm4gbmlsCisJfQorCWwsIGVyciA6PSBuZXQuTGlzdGVuKHAuYWRkci5OZXR3b3JrKCksIHAuYWRkci5TdHJpbmcoKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlwLmxpc3RlbmVyID0gbAorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNlcnZlclNvY2tldCkgQWNjZXB0KCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJcC5tdS5STG9jaygpCisJaW50ZXJydXB0ZWQgOj0gcC5pbnRlcnJ1cHRlZAorCXAubXUuUlVubG9jaygpCisKKwlpZiBpbnRlcnJ1cHRlZCB7CisJCXJldHVybiBuaWwsIGVyclRyYW5zcG9ydEludGVycnVwdGVkCisJfQorCisJcC5tdS5Mb2NrKCkKKwlsaXN0ZW5lciA6PSBwLmxpc3RlbmVyCisJcC5tdS5VbmxvY2soKQorCWlmIGxpc3RlbmVyID09IG5pbCB7CisJCXJldHVybiBuaWwsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJObyB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQiKQorCX0KKworCWNvbm4sIGVyciA6PSBsaXN0ZW5lci5BY2NlcHQoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKKwl9CisJcmV0dXJuIE5ld1RTb2NrZXRGcm9tQ29ublRpbWVvdXQoY29ubiwgcC5jbGllbnRUaW1lb3V0KSwgbmlsCit9CisKKy8vIENoZWNrcyB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgbGlzdGVuaW5nLgorZnVuYyAocCAqVFNlcnZlclNvY2tldCkgSXNMaXN0ZW5pbmcoKSBib29sIHsKKwlyZXR1cm4gcC5saXN0ZW5lciAhPSBuaWwKK30KKworLy8gQ29ubmVjdHMgdGhlIHNvY2tldCwgY3JlYXRpbmcgYSBuZXcgc29ja2V0IG9iamVjdCBpZiBuZWNlc3NhcnkuCitmdW5jIChwICpUU2VydmVyU29ja2V0KSBPcGVuKCkgZXJyb3IgeworCXAubXUuTG9jaygpCisJZGVmZXIgcC5tdS5VbmxvY2soKQorCWlmIHAuSXNMaXN0ZW5pbmcoKSB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKEFMUkVBRFlfT1BFTiwgIlNlcnZlciBzb2NrZXQgYWxyZWFkeSBvcGVuIikKKwl9CisJaWYgbCwgZXJyIDo9IG5ldC5MaXN0ZW4ocC5hZGRyLk5ldHdvcmsoKSwgcC5hZGRyLlN0cmluZygpKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9IGVsc2UgeworCQlwLmxpc3RlbmVyID0gbAorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTZXJ2ZXJTb2NrZXQpIEFkZHIoKSBuZXQuQWRkciB7CisJaWYgcC5saXN0ZW5lciAhPSBuaWwgeworCQlyZXR1cm4gcC5saXN0ZW5lci5BZGRyKCkKKwl9CisJcmV0dXJuIHAuYWRkcgorfQorCitmdW5jIChwICpUU2VydmVyU29ja2V0KSBDbG9zZSgpIGVycm9yIHsKKwl2YXIgZXJyIGVycm9yCisJcC5tdS5Mb2NrKCkKKwlpZiBwLklzTGlzdGVuaW5nKCkgeworCQllcnIgPSBwLmxpc3RlbmVyLkNsb3NlKCkKKwkJcC5saXN0ZW5lciA9IG5pbAorCX0KKwlwLm11LlVubG9jaygpCisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpUU2VydmVyU29ja2V0KSBJbnRlcnJ1cHQoKSBlcnJvciB7CisJcC5tdS5Mb2NrKCkKKwlwLmludGVycnVwdGVkID0gdHJ1ZQorCXAubXUuVW5sb2NrKCkKKwlwLkNsb3NlKCkKKworCXJldHVybiBuaWwKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXJfc29ja2V0X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFlMTk4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldF90ZXN0LmdvCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiZm10IgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RTb2NrZXRJc250TGlzdGVuaW5nQWZ0ZXJJbnRlcnJ1cHQodCAqdGVzdGluZy5UKSB7CisJaG9zdCA6PSAiMTI3LjAuMC4xIgorCXBvcnQgOj0gOTA5MAorCWFkZHIgOj0gZm10LlNwcmludGYoIiVzOiVkIiwgaG9zdCwgcG9ydCkKKworCXNvY2tldCA6PSBDcmVhdGVTZXJ2ZXJTb2NrZXQodCwgYWRkcikKKwlzb2NrZXQuTGlzdGVuKCkKKwlzb2NrZXQuSW50ZXJydXB0KCkKKworCW5ld1NvY2tldCA6PSBDcmVhdGVTZXJ2ZXJTb2NrZXQodCwgYWRkcikKKwllcnIgOj0gbmV3U29ja2V0Lkxpc3RlbigpCisJZGVmZXIgbmV3U29ja2V0LkludGVycnVwdCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJGYWlsZWQgdG8gcmViaW5kczogJXMiLCBlcnIpCisJfQorfQorCitmdW5jIFRlc3RTb2NrZXRDb25jdXJyZW5jeSh0ICp0ZXN0aW5nLlQpIHsKKwlob3N0IDo9ICIxMjcuMC4wLjEiCisJcG9ydCA6PSA5MDkwCisJYWRkciA6PSBmbXQuU3ByaW50ZigiJXM6JWQiLCBob3N0LCBwb3J0KQorCisJc29ja2V0IDo9IENyZWF0ZVNlcnZlclNvY2tldCh0LCBhZGRyKQorCWdvIGZ1bmMoKSB7IHNvY2tldC5MaXN0ZW4oKSB9KCkKKwlnbyBmdW5jKCkgeyBzb2NrZXQuSW50ZXJydXB0KCkgfSgpCit9CisKK2Z1bmMgQ3JlYXRlU2VydmVyU29ja2V0KHQgKnRlc3RpbmcuVCwgYWRkciBzdHJpbmcpICpUU2VydmVyU29ja2V0IHsKKwlzb2NrZXQsIGVyciA6PSBOZXdUU2VydmVyU29ja2V0KGFkZHIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJGYWlsZWQgdG8gY3JlYXRlIHNlcnZlciBzb2NrZXQ6ICVzIiwgZXJyKQorCX0KKwlyZXR1cm4gc29ja2V0Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NlcnZlcl90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXJfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmFmNDU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXJfdGVzdC5nbwpAQCAtMCwwICsxLDI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdE5vdGhpbmcodCAqdGVzdGluZy5UKSB7CisKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2VydmVyX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvc2VydmVyX3RyYW5zcG9ydC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWM0MGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXJfdHJhbnNwb3J0LmdvCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworLy8gU2VydmVyIHRyYW5zcG9ydC4gT2JqZWN0IHdoaWNoIHByb3ZpZGVzIGNsaWVudCB0cmFuc3BvcnRzLgordHlwZSBUU2VydmVyVHJhbnNwb3J0IGludGVyZmFjZSB7CisJTGlzdGVuKCkgZXJyb3IKKwlBY2NlcHQoKSAoVFRyYW5zcG9ydCwgZXJyb3IpCisJQ2xvc2UoKSBlcnJvcgorCisJLy8gT3B0aW9uYWwgbWV0aG9kIGltcGxlbWVudGF0aW9uLiBUaGlzIHNpZ25hbHMgdG8gdGhlIHNlcnZlciB0cmFuc3BvcnQKKwkvLyB0aGF0IGl0IHNob3VsZCBicmVhayBvdXQgb2YgYW55IGFjY2VwdCgpIG9yIGxpc3RlbigpIHRoYXQgaXQgaXMgY3VycmVudGx5CisJLy8gYmxvY2tlZCBvbi4gVGhpcyBtZXRob2QsIGlmIGltcGxlbWVudGVkLCBNVVNUIGJlIHRocmVhZCBzYWZlLCBhcyBpdCBtYXkKKwkvLyBiZSBjYWxsZWQgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQgY29udGV4dCB0aGFuIHRoZSBvdGhlciBUU2VydmVyVHJhbnNwb3J0CisJLy8gbWV0aG9kcy4KKwlJbnRlcnJ1cHQoKSBlcnJvcgorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zaW1wbGVfanNvbl9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX2pzb25fcHJvdG9jb2wuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4YTcxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX2pzb25fcHJvdG9jb2wuZ28KQEAgLTAsMCArMSwxMzM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImJ1ZmlvIgorCSJieXRlcyIKKwkiY29udGV4dCIKKwkiZW5jb2RpbmcvYmFzZTY0IgorCSJlbmNvZGluZy9qc29uIgorCSJmbXQiCisJImlvIgorCSJtYXRoIgorCSJzdHJjb252IgorKQorCit0eXBlIF9QYXJzZUNvbnRleHQgaW50CisKK2NvbnN0ICgKKwlfQ09OVEVYVF9JTl9UT1BMRVZFTCAgICAgICAgICBfUGFyc2VDb250ZXh0ID0gMQorCV9DT05URVhUX0lOX0xJU1RfRklSU1QgICAgICAgIF9QYXJzZUNvbnRleHQgPSAyCisJX0NPTlRFWFRfSU5fTElTVCAgICAgICAgICAgICAgX1BhcnNlQ29udGV4dCA9IDMKKwlfQ09OVEVYVF9JTl9PQkpFQ1RfRklSU1QgICAgICBfUGFyc2VDb250ZXh0ID0gNAorCV9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWSAgIF9QYXJzZUNvbnRleHQgPSA1CisJX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfVkFMVUUgX1BhcnNlQ29udGV4dCA9IDYKKykKKworZnVuYyAocCBfUGFyc2VDb250ZXh0KSBTdHJpbmcoKSBzdHJpbmcgeworCXN3aXRjaCBwIHsKKwljYXNlIF9DT05URVhUX0lOX1RPUExFVkVMOgorCQlyZXR1cm4gIlRPUExFVkVMIgorCWNhc2UgX0NPTlRFWFRfSU5fTElTVF9GSVJTVDoKKwkJcmV0dXJuICJMSVNULUZJUlNUIgorCWNhc2UgX0NPTlRFWFRfSU5fTElTVDoKKwkJcmV0dXJuICJMSVNUIgorCWNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNUOgorCQlyZXR1cm4gIk9CSkVDVC1GSVJTVCIKKwljYXNlIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWToKKwkJcmV0dXJuICJPQkpFQ1QtTkVYVC1LRVkiCisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRToKKwkJcmV0dXJuICJPQkpFQ1QtTkVYVC1WQUxVRSIKKwl9CisJcmV0dXJuICJVTktOT1dOLVBBUlNFLUNPTlRFWFQiCit9CisKKy8vIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKy8vCisvLyBUaGlzIHByb3RvY29sIHByb2R1Y2VzL2NvbnN1bWVzIGEgc2ltcGxlIG91dHB1dCBmb3JtYXQKKy8vIHN1aXRhYmxlIGZvciBwYXJzaW5nIGJ5IHNjcmlwdGluZyBsYW5ndWFnZXMuICBJdCBzaG91bGQgbm90IGJlCisvLyBjb25mdXNlZCB3aXRoIHRoZSBmdWxsLWZlYXR1cmVkIFRKU09OUHJvdG9jb2wuCisvLwordHlwZSBUU2ltcGxlSlNPTlByb3RvY29sIHN0cnVjdCB7CisJdHJhbnMgVFRyYW5zcG9ydAorCisJcGFyc2VDb250ZXh0U3RhY2sgW11pbnQKKwlkdW1wQ29udGV4dCAgICAgICBbXWludAorCisJd3JpdGVyICpidWZpby5Xcml0ZXIKKwlyZWFkZXIgKmJ1ZmlvLlJlYWRlcgorfQorCisvLyBDb25zdHJ1Y3RvcgorZnVuYyBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHQgVFRyYW5zcG9ydCkgKlRTaW1wbGVKU09OUHJvdG9jb2wgeworCXYgOj0gJlRTaW1wbGVKU09OUHJvdG9jb2x7dHJhbnM6IHQsCisJCXdyaXRlcjogYnVmaW8uTmV3V3JpdGVyKHQpLAorCQlyZWFkZXI6IGJ1ZmlvLk5ld1JlYWRlcih0KSwKKwl9CisJdi5wYXJzZUNvbnRleHRTdGFjayA9IGFwcGVuZCh2LnBhcnNlQ29udGV4dFN0YWNrLCBpbnQoX0NPTlRFWFRfSU5fVE9QTEVWRUwpKQorCXYuZHVtcENvbnRleHQgPSBhcHBlbmQodi5kdW1wQ29udGV4dCwgaW50KF9DT05URVhUX0lOX1RPUExFVkVMKSkKKwlyZXR1cm4gdgorfQorCisvLyBGYWN0b3J5Cit0eXBlIFRTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5IHN0cnVjdHt9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KSBHZXRQcm90b2NvbCh0cmFucyBUVHJhbnNwb3J0KSBUUHJvdG9jb2wgeworCXJldHVybiBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorfQorCitmdW5jIE5ld1RTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KCkgKlRTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5IHsKKwlyZXR1cm4gJlRTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5e30KK30KKwordmFyICgKKwlKU09OX0NPTU1BICAgICAgICAgICAgICAgICAgIFtdYnl0ZQorCUpTT05fQ09MT04gICAgICAgICAgICAgICAgICAgW11ieXRlCisJSlNPTl9MQlJBQ0UgICAgICAgICAgICAgICAgICBbXWJ5dGUKKwlKU09OX1JCUkFDRSAgICAgICAgICAgICAgICAgIFtdYnl0ZQorCUpTT05fTEJSQUNLRVQgICAgICAgICAgICAgICAgW11ieXRlCisJSlNPTl9SQlJBQ0tFVCAgICAgICAgICAgICAgICBbXWJ5dGUKKwlKU09OX1FVT1RFICAgICAgICAgICAgICAgICAgIGJ5dGUKKwlKU09OX1FVT1RFX0JZVEVTICAgICAgICAgICAgIFtdYnl0ZQorCUpTT05fTlVMTCAgICAgICAgICAgICAgICAgICAgW11ieXRlCisJSlNPTl9UUlVFICAgICAgICAgICAgICAgICAgICBbXWJ5dGUKKwlKU09OX0ZBTFNFICAgICAgICAgICAgICAgICAgIFtdYnl0ZQorCUpTT05fSU5GSU5JVFkgICAgICAgICAgICAgICAgc3RyaW5nCisJSlNPTl9ORUdBVElWRV9JTkZJTklUWSAgICAgICBzdHJpbmcKKwlKU09OX05BTiAgICAgICAgICAgICAgICAgICAgIHN0cmluZworCUpTT05fSU5GSU5JVFlfQllURVMgICAgICAgICAgW11ieXRlCisJSlNPTl9ORUdBVElWRV9JTkZJTklUWV9CWVRFUyBbXWJ5dGUKKwlKU09OX05BTl9CWVRFUyAgICAgICAgICAgICAgIFtdYnl0ZQorCWpzb25fbm9uYmFzZV9tYXBfZWxlbV9ieXRlcyAgW11ieXRlCispCisKK2Z1bmMgaW5pdCgpIHsKKwlKU09OX0NPTU1BID0gW11ieXRleycsJ30KKwlKU09OX0NPTE9OID0gW11ieXRleyc6J30KKwlKU09OX0xCUkFDRSA9IFtdYnl0ZXsneyd9CisJSlNPTl9SQlJBQ0UgPSBbXWJ5dGV7J30nfQorCUpTT05fTEJSQUNLRVQgPSBbXWJ5dGV7J1snfQorCUpTT05fUkJSQUNLRVQgPSBbXWJ5dGV7J10nfQorCUpTT05fUVVPVEUgPSAnIicKKwlKU09OX1FVT1RFX0JZVEVTID0gW11ieXRleyciJ30KKwlKU09OX05VTEwgPSBbXWJ5dGV7J24nLCAndScsICdsJywgJ2wnfQorCUpTT05fVFJVRSA9IFtdYnl0ZXsndCcsICdyJywgJ3UnLCAnZSd9CisJSlNPTl9GQUxTRSA9IFtdYnl0ZXsnZicsICdhJywgJ2wnLCAncycsICdlJ30KKwlKU09OX0lORklOSVRZID0gIkluZmluaXR5IgorCUpTT05fTkVHQVRJVkVfSU5GSU5JVFkgPSAiLUluZmluaXR5IgorCUpTT05fTkFOID0gIk5hTiIKKwlKU09OX0lORklOSVRZX0JZVEVTID0gW11ieXRleydJJywgJ24nLCAnZicsICdpJywgJ24nLCAnaScsICd0JywgJ3knfQorCUpTT05fTkVHQVRJVkVfSU5GSU5JVFlfQllURVMgPSBbXWJ5dGV7Jy0nLCAnSScsICduJywgJ2YnLCAnaScsICduJywgJ2knLCAndCcsICd5J30KKwlKU09OX05BTl9CWVRFUyA9IFtdYnl0ZXsnTicsICdhJywgJ04nfQorCWpzb25fbm9uYmFzZV9tYXBfZWxlbV9ieXRlcyA9IFtdYnl0ZXsnXScsICcsJywgJ1snfQorfQorCitmdW5jIGpzb25RdW90ZShzIHN0cmluZykgc3RyaW5nIHsKKwliLCBfIDo9IGpzb24uTWFyc2hhbChzKQorCXMxIDo9IHN0cmluZyhiKQorCXJldHVybiBzMQorfQorCitmdW5jIGpzb25VbnF1b3RlKHMgc3RyaW5nKSAoc3RyaW5nLCBib29sKSB7CisJczEgOj0gbmV3KHN0cmluZykKKwllcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCBzMSkKKwlyZXR1cm4gKnMxLCBlcnIgPT0gbmlsCit9CisKK2Z1bmMgbWlzbWF0Y2goZXhwZWN0ZWQsIGFjdHVhbCBzdHJpbmcpIGVycm9yIHsKKwlyZXR1cm4gZm10LkVycm9yZigiRXhwZWN0ZWQgJyVzJyBidXQgZm91bmQgJyVzJyB3aGlsZSBwYXJzaW5nIEpTT04uIiwgZXhwZWN0ZWQsIGFjdHVhbCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVNZXNzYWdlQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcUlkIGludDMyKSBlcnJvciB7CisJcC5yZXNldENvbnRleHRTdGFjaygpIC8vIFRIUklGVC0zNzM1CisJaWYgZSA6PSBwLk91dHB1dExpc3RCZWdpbigpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyhuYW1lKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuV3JpdGVCeXRlKGludDgodHlwZUlkKSk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlSTMyKHNlcUlkKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlTWVzc2FnZUVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVTdHJ1Y3RCZWdpbihuYW1lIHN0cmluZykgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRPYmplY3RCZWdpbigpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVTdHJ1Y3RFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0T2JqZWN0RW5kKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVGaWVsZEJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2KSBlcnJvciB7CisJaWYgZSA6PSBwLldyaXRlU3RyaW5nKG5hbWUpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVGaWVsZEVuZCgpIGVycm9yIHsKKwkvL3JldHVybiBwLk91dHB1dExpc3RFbmQoKQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVGaWVsZFN0b3AoKSBlcnJvciB7IHJldHVybiBuaWwgfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZU1hcEJlZ2luKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwlpZiBlIDo9IHAuT3V0cHV0TGlzdEJlZ2luKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlQnl0ZShpbnQ4KGtleVR5cGUpKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuV3JpdGVCeXRlKGludDgodmFsdWVUeXBlKSk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIHAuV3JpdGVJMzIoaW50MzIoc2l6ZSkpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlTWFwRW5kKCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dExpc3RFbmQoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUxpc3RCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRFbGVtTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUxpc3RFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0TGlzdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlU2V0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0RWxlbUxpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVTZXRFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0TGlzdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlQm9vbChiIGJvb2wpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRCb29sKGIpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlQnl0ZShiIGludDgpIGVycm9yIHsKKwlyZXR1cm4gcC5Xcml0ZUkzMihpbnQzMihiKSkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVJMTYodiBpbnQxNikgZXJyb3IgeworCXJldHVybiBwLldyaXRlSTMyKGludDMyKHYpKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUkzMih2IGludDMyKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0STY0KGludDY0KHYpKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUk2NCh2IGludDY0KSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0STY0KGludDY0KHYpKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZURvdWJsZSh2IGZsb2F0NjQpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRGNjQodikKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVTdHJpbmcodiBzdHJpbmcpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRTdHJpbmcodikKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVCaW5hcnkodiBbXWJ5dGUpIGVycm9yIHsKKwkvLyBKU09OIGxpYnJhcnkgb25seSB0YWtlcyBpbiBhIHN0cmluZywKKwkvLyBub3QgYW4gYXJiaXRyYXJ5IGJ5dGUgYXJyYXksIHRvIGVuc3VyZSBieXRlcyBhcmUgdHJhbnNtaXR0ZWQKKwkvLyBlZmZpY2llbnRseSB3ZSBtdXN0IGNvbnZlcnQgdGhpcyBpbnRvIGEgdmFsaWQgSlNPTiBzdHJpbmcKKwkvLyB0aGVyZWZvcmUgd2UgdXNlIGJhc2U2NCBlbmNvZGluZyB0byBhdm9pZCBleGNlc3NpdmUgZXNjYXBpbmcvcXVvdGluZworCWlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX1FVT1RFX0JZVEVTKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXdyaXRlciA6PSBiYXNlNjQuTmV3RW5jb2RlcihiYXNlNjQuU3RkRW5jb2RpbmcsIHAud3JpdGVyKQorCWlmIF8sIGUgOj0gd3JpdGVyLldyaXRlKHYpOyBlICE9IG5pbCB7CisJCXAud3JpdGVyLlJlc2V0KHAudHJhbnMpIC8vIFRIUklGVC0zNzM1CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJaWYgZSA6PSB3cml0ZXIuQ2xvc2UoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX1FVT1RFX0JZVEVTKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXJldHVybiBwLk91dHB1dFBvc3RWYWx1ZSgpCit9CisKKy8vIFJlYWRpbmcgbWV0aG9kcy4KK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRNZXNzYWdlQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcUlkIGludDMyLCBlcnIgZXJyb3IpIHsKKwlwLnJlc2V0Q29udGV4dFN0YWNrKCkgLy8gVEhSSUZULTM3MzUKKwlpZiBpc051bGwsIGVyciA6PSBwLlBhcnNlTGlzdEJlZ2luKCk7IGlzTnVsbCB8fCBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgorCX0KKwlpZiBuYW1lLCBlcnIgPSBwLlJlYWRTdHJpbmcoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlcnIKKwl9CisJYlR5cGVJZCwgZXJyIDo9IHAuUmVhZEJ5dGUoKQorCXR5cGVJZCA9IFRNZXNzYWdlVHlwZShiVHlwZUlkKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCisJfQorCWlmIHNlcUlkLCBlcnIgPSBwLlJlYWRJMzIoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlcnIKKwl9CisJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkTWVzc2FnZUVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5QYXJzZUxpc3RFbmQoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkU3RydWN0QmVnaW4oKSAobmFtZSBzdHJpbmcsIGVyciBlcnJvcikgeworCV8sIGVyciA9IHAuUGFyc2VPYmplY3RTdGFydCgpCisJcmV0dXJuICIiLCBlcnIKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZFN0cnVjdEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5QYXJzZU9iamVjdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRGaWVsZEJlZ2luKCkgKHN0cmluZywgVFR5cGUsIGludDE2LCBlcnJvcikgeworCWlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiAiIiwgU1RPUCwgMCwgZXJyCisJfQorCWIsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQorCWlmIGxlbihiKSA+IDAgeworCQlzd2l0Y2ggYlswXSB7CisJCWNhc2UgSlNPTl9SQlJBQ0VbMF06CisJCQlyZXR1cm4gIiIsIFNUT1AsIDAsIG5pbAorCQljYXNlIEpTT05fUVVPVEU6CisJCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJCQluYW1lLCBlcnIgOj0gcC5QYXJzZVN0cmluZ0JvZHkoKQorCQkJLy8gc2ltcGxlanNvbiBpcyBub3QgbWVhbnQgdG8gYmUgcmVhZCBiYWNrIGludG8gdGhyaWZ0CisJCQkvLyAtIHNlZSBodHRwOi8vd2lraS5hcGFjaGUub3JnL3RocmlmdC9UaHJpZnRVc2FnZUphdmEKKwkJCS8vIC0gdXNlIEpTT04gaW5zdGVhZAorCQkJaWYgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIG5hbWUsIFNUT1AsIDAsIGVycgorCQkJfQorCQkJcmV0dXJuIG5hbWUsIFNUT1AsIC0xLCBwLlBhcnNlUG9zdFZhbHVlKCkKKwkJCS8qCisJCQkgICBpZiBlcnIgPSBwLlBhcnNlUG9zdFZhbHVlKCk7IGVyciAhPSBuaWwgeworCQkJICAgICByZXR1cm4gbmFtZSwgU1RPUCwgMCwgZXJyCisJCQkgICB9CisJCQkgICBpZiBpc051bGwsIGVyciA6PSBwLlBhcnNlTGlzdEJlZ2luKCk7IGlzTnVsbCB8fCBlcnIgIT0gbmlsIHsKKwkJCSAgICAgcmV0dXJuIG5hbWUsIFNUT1AsIDAsIGVycgorCQkJICAgfQorCQkJICAgYlR5cGUsIGVyciA6PSBwLlJlYWRCeXRlKCkKKwkJCSAgIHRoZXR5cGUgOj0gVFR5cGUoYlR5cGUpCisJCQkgICBpZiBlcnIgIT0gbmlsIHsKKwkJCSAgICAgcmV0dXJuIG5hbWUsIHRoZXR5cGUsIDAsIGVycgorCQkJICAgfQorCQkJICAgaWQsIGVyciA6PSBwLlJlYWRJMTYoKQorCQkJICAgcmV0dXJuIG5hbWUsIHRoZXR5cGUsIGlkLCBlcnIKKwkJCSovCisJCX0KKwkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBcIn1cIiBvciAnXCInLCBidXQgZm91bmQ6ICclcyciLCBzdHJpbmcoYikpCisJCXJldHVybiAiIiwgU1RPUCwgMCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCX0KKwlyZXR1cm4gIiIsIFNUT1AsIDAsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihpby5FT0YpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRGaWVsZEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCisJLy9yZXR1cm4gcC5QYXJzZUxpc3RFbmQoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkTWFwQmVnaW4oKSAoa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCwgZSBlcnJvcikgeworCWlmIGlzTnVsbCwgZSA6PSBwLlBhcnNlTGlzdEJlZ2luKCk7IGlzTnVsbCB8fCBlICE9IG5pbCB7CisJCXJldHVybiBWT0lELCBWT0lELCAwLCBlCisJfQorCisJLy8gcmVhZCBrZXlUeXBlCisJYktleVR5cGUsIGUgOj0gcC5SZWFkQnl0ZSgpCisJa2V5VHlwZSA9IFRUeXBlKGJLZXlUeXBlKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZQorCX0KKworCS8vIHJlYWQgdmFsdWVUeXBlCisJYlZhbHVlVHlwZSwgZSA6PSBwLlJlYWRCeXRlKCkKKwl2YWx1ZVR5cGUgPSBUVHlwZShiVmFsdWVUeXBlKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZQorCX0KKworCS8vIHJlYWQgc2l6ZQorCWlTaXplLCBlcnIgOj0gcC5SZWFkSTY0KCkKKwlzaXplID0gaW50KGlTaXplKQorCXJldHVybiBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGVycgorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkTWFwRW5kKCkgZXJyb3IgeworCXJldHVybiBwLlBhcnNlTGlzdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRMaXN0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlIGVycm9yKSB7CisJcmV0dXJuIHAuUGFyc2VFbGVtTGlzdEJlZ2luKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZExpc3RFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuUGFyc2VMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZFNldEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZSBlcnJvcikgeworCXJldHVybiBwLlBhcnNlRWxlbUxpc3RCZWdpbigpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRTZXRFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuUGFyc2VMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZEJvb2woKSAoYm9vbCwgZXJyb3IpIHsKKwl2YXIgdmFsdWUgYm9vbAorCisJaWYgZXJyIDo9IHAuUGFyc2VQcmVWYWx1ZSgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIHZhbHVlLCBlcnIKKwl9CisJZiwgXyA6PSBwLnJlYWRlci5QZWVrKDEpCisJaWYgbGVuKGYpID4gMCB7CisJCXN3aXRjaCBmWzBdIHsKKwkJY2FzZSBKU09OX1RSVUVbMF06CisJCQliIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9UUlVFKSkKKwkJCV8sIGVyciA6PSBwLnJlYWRlci5SZWFkKGIpCisJCQlpZiBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZmFsc2UsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJCQl9CisJCQlpZiBzdHJpbmcoYikgPT0gc3RyaW5nKEpTT05fVFJVRSkgeworCQkJCXZhbHVlID0gdHJ1ZQorCQkJfSBlbHNlIHsKKwkJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIFwidHJ1ZVwiIGJ1dCBmb3VuZDogJXMiLCBzdHJpbmcoYikpCisJCQkJcmV0dXJuIHZhbHVlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCQlicmVhaworCQljYXNlIEpTT05fRkFMU0VbMF06CisJCQliIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9GQUxTRSkpCisJCQlfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiKQorCQkJaWYgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGZhbHNlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCQkJfQorCQkJaWYgc3RyaW5nKGIpID09IHN0cmluZyhKU09OX0ZBTFNFKSB7CisJCQkJdmFsdWUgPSBmYWxzZQorCQkJfSBlbHNlIHsKKwkJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIFwiZmFsc2VcIiBidXQgZm91bmQ6ICVzIiwgc3RyaW5nKGIpKQorCQkJCXJldHVybiB2YWx1ZSwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQkJYnJlYWsKKwkJY2FzZSBKU09OX05VTExbMF06CisJCQliIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9OVUxMKSkKKwkJCV8sIGVyciA6PSBwLnJlYWRlci5SZWFkKGIpCisJCQlpZiBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZmFsc2UsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJCQl9CisJCQlpZiBzdHJpbmcoYikgPT0gc3RyaW5nKEpTT05fTlVMTCkgeworCQkJCXZhbHVlID0gZmFsc2UKKwkJCX0gZWxzZSB7CisJCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBcIm51bGxcIiBidXQgZm91bmQ6ICVzIiwgc3RyaW5nKGIpKQorCQkJCXJldHVybiB2YWx1ZSwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQlkZWZhdWx0OgorCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBcInRydWVcIiwgXCJmYWxzZVwiLCBvciBcIm51bGxcIiBidXQgZm91bmQ6ICVzIiwgc3RyaW5nKGYpKQorCQkJcmV0dXJuIHZhbHVlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCX0KKwl9CisJcmV0dXJuIHZhbHVlLCBwLlBhcnNlUG9zdFZhbHVlKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZEJ5dGUoKSAoaW50OCwgZXJyb3IpIHsKKwl2LCBlcnIgOj0gcC5SZWFkSTY0KCkKKwlyZXR1cm4gaW50OCh2KSwgZXJyCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRJMTYoKSAoaW50MTYsIGVycm9yKSB7CisJdiwgZXJyIDo9IHAuUmVhZEk2NCgpCisJcmV0dXJuIGludDE2KHYpLCBlcnIKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZEkzMigpIChpbnQzMiwgZXJyb3IpIHsKKwl2LCBlcnIgOj0gcC5SZWFkSTY0KCkKKwlyZXR1cm4gaW50MzIodiksIGVycgorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkSTY0KCkgKGludDY0LCBlcnJvcikgeworCXYsIF8sIGVyciA6PSBwLlBhcnNlSTY0KCkKKwlyZXR1cm4gdiwgZXJyCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWREb3VibGUoKSAoZmxvYXQ2NCwgZXJyb3IpIHsKKwl2LCBfLCBlcnIgOj0gcC5QYXJzZUY2NCgpCisJcmV0dXJuIHYsIGVycgorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkU3RyaW5nKCkgKHN0cmluZywgZXJyb3IpIHsKKwl2YXIgdiBzdHJpbmcKKwlpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gdiwgZXJyCisJfQorCWYsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQorCWlmIGxlbihmKSA+IDAgJiYgZlswXSA9PSBKU09OX1FVT1RFIHsKKwkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQl2YWx1ZSwgZXJyIDo9IHAuUGFyc2VTdHJpbmdCb2R5KCkKKwkJdiA9IHZhbHVlCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIHYsIGVycgorCQl9CisJfSBlbHNlIGlmIGxlbihmKSA+IDAgJiYgZlswXSA9PSBKU09OX05VTExbMF0geworCQliIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9OVUxMKSkKKwkJXywgZXJyIDo9IHAucmVhZGVyLlJlYWQoYikKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwkJfQorCQlpZiBzdHJpbmcoYikgIT0gc3RyaW5nKEpTT05fTlVMTCkgeworCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBhIEpTT04gc3RyaW5nLCBmb3VuZCB1bnF1b3RlZCBkYXRhIHN0YXJ0ZWQgd2l0aCAlcyIsIHN0cmluZyhiKSkKKwkJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCX0KKwl9IGVsc2UgeworCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIGEgSlNPTiBzdHJpbmcsIGZvdW5kIHVucXVvdGVkIGRhdGEgc3RhcnRlZCB3aXRoICVzIiwgc3RyaW5nKGYpKQorCQlyZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCX0KKwlyZXR1cm4gdiwgcC5QYXJzZVBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRCaW5hcnkoKSAoW11ieXRlLCBlcnJvcikgeworCXZhciB2IFtdYnl0ZQorCWlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKwlmLCBfIDo9IHAucmVhZGVyLlBlZWsoMSkKKwlpZiBsZW4oZikgPiAwICYmIGZbMF0gPT0gSlNPTl9RVU9URSB7CisJCXAucmVhZGVyLlJlYWRCeXRlKCkKKwkJdmFsdWUsIGVyciA6PSBwLlBhcnNlQmFzZTY0RW5jb2RlZEJvZHkoKQorCQl2ID0gdmFsdWUKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gdiwgZXJyCisJCX0KKwl9IGVsc2UgaWYgbGVuKGYpID4gMCAmJiBmWzBdID09IEpTT05fTlVMTFswXSB7CisJCWIgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKQorCQlfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCQl9CisJCWlmIHN0cmluZyhiKSAhPSBzdHJpbmcoSlNPTl9OVUxMKSB7CisJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIGEgSlNPTiBzdHJpbmcsIGZvdW5kIHVucXVvdGVkIGRhdGEgc3RhcnRlZCB3aXRoICVzIiwgc3RyaW5nKGIpKQorCQkJcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJfQorCX0gZWxzZSB7CisJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgYSBKU09OIHN0cmluZywgZm91bmQgdW5xdW90ZWQgZGF0YSBzdGFydGVkIHdpdGggJXMiLCBzdHJpbmcoZikpCisJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJfQorCisJcmV0dXJuIHYsIHAuUGFyc2VQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihwLndyaXRlci5GbHVzaCgpKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBTa2lwKGZpZWxkVHlwZSBUVHlwZSkgKGVyciBlcnJvcikgeworCXJldHVybiBTa2lwRGVmYXVsdERlcHRoKHAsIGZpZWxkVHlwZSkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgVHJhbnNwb3J0KCkgVFRyYW5zcG9ydCB7CisJcmV0dXJuIHAudHJhbnMKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0UHJlVmFsdWUoKSBlcnJvciB7CisJY3h0IDo9IF9QYXJzZUNvbnRleHQocC5kdW1wQ29udGV4dFtsZW4ocC5kdW1wQ29udGV4dCktMV0pCisJc3dpdGNoIGN4dCB7CisJY2FzZSBfQ09OVEVYVF9JTl9MSVNULCBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVk6CisJCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX0NPTU1BKTsgZSAhPSBuaWwgeworCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQl9CisJCWJyZWFrCisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRToKKwkJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fQ09MT04pOyBlICE9IG5pbCB7CisJCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCX0KKwkJYnJlYWsKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRQb3N0VmFsdWUoKSBlcnJvciB7CisJY3h0IDo9IF9QYXJzZUNvbnRleHQocC5kdW1wQ29udGV4dFtsZW4ocC5kdW1wQ29udGV4dCktMV0pCisJc3dpdGNoIGN4dCB7CisJY2FzZSBfQ09OVEVYVF9JTl9MSVNUX0ZJUlNUOgorCQlwLmR1bXBDb250ZXh0ID0gcC5kdW1wQ29udGV4dFs6bGVuKHAuZHVtcENvbnRleHQpLTFdCisJCXAuZHVtcENvbnRleHQgPSBhcHBlbmQocC5kdW1wQ29udGV4dCwgaW50KF9DT05URVhUX0lOX0xJU1QpKQorCQlicmVhaworCWNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNUOgorCQlwLmR1bXBDb250ZXh0ID0gcC5kdW1wQ29udGV4dFs6bGVuKHAuZHVtcENvbnRleHQpLTFdCisJCXAuZHVtcENvbnRleHQgPSBhcHBlbmQocC5kdW1wQ29udGV4dCwgaW50KF9DT05URVhUX0lOX09CSkVDVF9ORVhUX1ZBTFVFKSkKKwkJYnJlYWsKKwljYXNlIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWToKKwkJcC5kdW1wQ29udGV4dCA9IHAuZHVtcENvbnRleHRbOmxlbihwLmR1bXBDb250ZXh0KS0xXQorCQlwLmR1bXBDb250ZXh0ID0gYXBwZW5kKHAuZHVtcENvbnRleHQsIGludChfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRSkpCisJCWJyZWFrCisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRToKKwkJcC5kdW1wQ29udGV4dCA9IHAuZHVtcENvbnRleHRbOmxlbihwLmR1bXBDb250ZXh0KS0xXQorCQlwLmR1bXBDb250ZXh0ID0gYXBwZW5kKHAuZHVtcENvbnRleHQsIGludChfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVkpKQorCQlicmVhaworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dEJvb2wodmFsdWUgYm9vbCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXZhciB2IHN0cmluZworCWlmIHZhbHVlIHsKKwkJdiA9IHN0cmluZyhKU09OX1RSVUUpCisJfSBlbHNlIHsKKwkJdiA9IHN0cmluZyhKU09OX0ZBTFNFKQorCX0KKwlzd2l0Y2ggX1BhcnNlQ29udGV4dChwLmR1bXBDb250ZXh0W2xlbihwLmR1bXBDb250ZXh0KS0xXSkgeworCWNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNULCBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVk6CisJCXYgPSBqc29uUXVvdGUodikKKwlkZWZhdWx0OgorCX0KKwlpZiBlIDo9IHAuT3V0cHV0U3RyaW5nRGF0YSh2KTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gcC5PdXRwdXRQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXROdWxsKCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX05VTEwpOyBlICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJcmV0dXJuIHAuT3V0cHV0UG9zdFZhbHVlKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0RjY0KHZhbHVlIGZsb2F0NjQpIGVycm9yIHsKKwlpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwl2YXIgdiBzdHJpbmcKKwlpZiBtYXRoLklzTmFOKHZhbHVlKSB7CisJCXYgPSBzdHJpbmcoSlNPTl9RVU9URSkgKyBKU09OX05BTiArIHN0cmluZyhKU09OX1FVT1RFKQorCX0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7CisJCXYgPSBzdHJpbmcoSlNPTl9RVU9URSkgKyBKU09OX0lORklOSVRZICsgc3RyaW5nKEpTT05fUVVPVEUpCisJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIC0xKSB7CisJCXYgPSBzdHJpbmcoSlNPTl9RVU9URSkgKyBKU09OX05FR0FUSVZFX0lORklOSVRZICsgc3RyaW5nKEpTT05fUVVPVEUpCisJfSBlbHNlIHsKKwkJdiA9IHN0cmNvbnYuRm9ybWF0RmxvYXQodmFsdWUsICdnJywgLTEsIDY0KQorCQlzd2l0Y2ggX1BhcnNlQ29udGV4dChwLmR1bXBDb250ZXh0W2xlbihwLmR1bXBDb250ZXh0KS0xXSkgeworCQljYXNlIF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCwgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZOgorCQkJdiA9IHN0cmluZyhKU09OX1FVT1RFKSArIHYgKyBzdHJpbmcoSlNPTl9RVU9URSkKKwkJZGVmYXVsdDoKKwkJfQorCX0KKwlpZiBlIDo9IHAuT3V0cHV0U3RyaW5nRGF0YSh2KTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gcC5PdXRwdXRQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRJNjQodmFsdWUgaW50NjQpIGVycm9yIHsKKwlpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwl2IDo9IHN0cmNvbnYuRm9ybWF0SW50KHZhbHVlLCAxMCkKKwlzd2l0Y2ggX1BhcnNlQ29udGV4dChwLmR1bXBDb250ZXh0W2xlbihwLmR1bXBDb250ZXh0KS0xXSkgeworCWNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNULCBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVk6CisJCXYgPSBqc29uUXVvdGUodikKKwlkZWZhdWx0OgorCX0KKwlpZiBlIDo9IHAuT3V0cHV0U3RyaW5nRGF0YSh2KTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gcC5PdXRwdXRQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRTdHJpbmcocyBzdHJpbmcpIGVycm9yIHsKKwlpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuT3V0cHV0U3RyaW5nRGF0YShqc29uUXVvdGUocykpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBwLk91dHB1dFBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dFN0cmluZ0RhdGEocyBzdHJpbmcpIGVycm9yIHsKKwlfLCBlIDo9IHAud3JpdGUoW11ieXRlKHMpKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0T2JqZWN0QmVnaW4oKSBlcnJvciB7CisJaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fTEJSQUNFKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXAuZHVtcENvbnRleHQgPSBhcHBlbmQocC5kdW1wQ29udGV4dCwgaW50KF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCkpCisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRPYmplY3RFbmQoKSBlcnJvciB7CisJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fUkJSQUNFKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXAuZHVtcENvbnRleHQgPSBwLmR1bXBDb250ZXh0WzpsZW4ocC5kdW1wQ29udGV4dCktMV0KKwlpZiBlIDo9IHAuT3V0cHV0UG9zdFZhbHVlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRMaXN0QmVnaW4oKSBlcnJvciB7CisJaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fTEJSQUNLRVQpOyBlICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJcC5kdW1wQ29udGV4dCA9IGFwcGVuZChwLmR1bXBDb250ZXh0LCBpbnQoX0NPTlRFWFRfSU5fTElTVF9GSVJTVCkpCisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRMaXN0RW5kKCkgZXJyb3IgeworCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX1JCUkFDS0VUKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXAuZHVtcENvbnRleHQgPSBwLmR1bXBDb250ZXh0WzpsZW4ocC5kdW1wQ29udGV4dCktMV0KKwlpZiBlIDo9IHAuT3V0cHV0UG9zdFZhbHVlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRFbGVtTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRMaXN0QmVnaW4oKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuV3JpdGVCeXRlKGludDgoZWxlbVR5cGUpKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuV3JpdGVJNjQoaW50NjQoc2l6ZSkpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VQcmVWYWx1ZSgpIGVycm9yIHsKKwlpZiBlIDo9IHAucmVhZE5vblNpZ25pZmljYW50V2hpdGVzcGFjZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJY3h0IDo9IF9QYXJzZUNvbnRleHQocC5wYXJzZUNvbnRleHRTdGFja1tsZW4ocC5wYXJzZUNvbnRleHRTdGFjayktMV0pCisJYiwgXyA6PSBwLnJlYWRlci5QZWVrKDEpCisJc3dpdGNoIGN4dCB7CisJY2FzZSBfQ09OVEVYVF9JTl9MSVNUOgorCQlpZiBsZW4oYikgPiAwIHsKKwkJCXN3aXRjaCBiWzBdIHsKKwkJCWNhc2UgSlNPTl9SQlJBQ0tFVFswXToKKwkJCQlyZXR1cm4gbmlsCisJCQljYXNlIEpTT05fQ09NTUFbMF06CisJCQkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQkJCWlmIGUgOj0gcC5yZWFkTm9uU2lnbmlmaWNhbnRXaGl0ZXNwYWNlKCk7IGUgIT0gbmlsIHsKKwkJCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQkJCX0KKwkJCQlyZXR1cm4gbmlsCisJCQlkZWZhdWx0OgorCQkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgXCJdXCIgb3IgXCIsXCIgaW4gbGlzdCBjb250ZXh0LCBidXQgZm91bmQgXCIlc1wiIiwgc3RyaW5nKGIpKQorCQkJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCX0KKwkJYnJlYWsKKwljYXNlIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWToKKwkJaWYgbGVuKGIpID4gMCB7CisJCQlzd2l0Y2ggYlswXSB7CisJCQljYXNlIEpTT05fUkJSQUNFWzBdOgorCQkJCXJldHVybiBuaWwKKwkJCWNhc2UgSlNPTl9DT01NQVswXToKKwkJCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJCQkJaWYgZSA6PSBwLnJlYWROb25TaWduaWZpY2FudFdoaXRlc3BhY2UoKTsgZSAhPSBuaWwgeworCQkJCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCQkJfQorCQkJCXJldHVybiBuaWwKKwkJCWRlZmF1bHQ6CisJCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBcIn1cIiBvciBcIixcIiBpbiBvYmplY3QgY29udGV4dCwgYnV0IGZvdW5kIFwiJXNcIiIsIHN0cmluZyhiKSkKKwkJCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQl9CisJCWJyZWFrCisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRToKKwkJaWYgbGVuKGIpID4gMCB7CisJCQlzd2l0Y2ggYlswXSB7CisJCQljYXNlIEpTT05fQ09MT05bMF06CisJCQkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQkJCWlmIGUgOj0gcC5yZWFkTm9uU2lnbmlmaWNhbnRXaGl0ZXNwYWNlKCk7IGUgIT0gbmlsIHsKKwkJCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQkJCX0KKwkJCQlyZXR1cm4gbmlsCisJCQlkZWZhdWx0OgorCQkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgXCI6XCIgaW4gb2JqZWN0IGNvbnRleHQsIGJ1dCBmb3VuZCBcIiVzXCIiLCBzdHJpbmcoYikpCisJCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCX0KKwkJfQorCQlicmVhaworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlUG9zdFZhbHVlKCkgZXJyb3IgeworCWlmIGUgOj0gcC5yZWFkTm9uU2lnbmlmaWNhbnRXaGl0ZXNwYWNlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwljeHQgOj0gX1BhcnNlQ29udGV4dChwLnBhcnNlQ29udGV4dFN0YWNrW2xlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXSkKKwlzd2l0Y2ggY3h0IHsKKwljYXNlIF9DT05URVhUX0lOX0xJU1RfRklSU1Q6CisJCXAucGFyc2VDb250ZXh0U3RhY2sgPSBwLnBhcnNlQ29udGV4dFN0YWNrWzpsZW4ocC5wYXJzZUNvbnRleHRTdGFjayktMV0KKwkJcC5wYXJzZUNvbnRleHRTdGFjayA9IGFwcGVuZChwLnBhcnNlQ29udGV4dFN0YWNrLCBpbnQoX0NPTlRFWFRfSU5fTElTVCkpCisJCWJyZWFrCisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfRklSU1QsIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWToKKwkJcC5wYXJzZUNvbnRleHRTdGFjayA9IHAucGFyc2VDb250ZXh0U3RhY2tbOmxlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXQorCQlwLnBhcnNlQ29udGV4dFN0YWNrID0gYXBwZW5kKHAucGFyc2VDb250ZXh0U3RhY2ssIGludChfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRSkpCisJCWJyZWFrCisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRToKKwkJcC5wYXJzZUNvbnRleHRTdGFjayA9IHAucGFyc2VDb250ZXh0U3RhY2tbOmxlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXQorCQlwLnBhcnNlQ29udGV4dFN0YWNrID0gYXBwZW5kKHAucGFyc2VDb250ZXh0U3RhY2ssIGludChfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVkpKQorCQlicmVhaworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIHJlYWROb25TaWduaWZpY2FudFdoaXRlc3BhY2UoKSBlcnJvciB7CisJZm9yIHsKKwkJYiwgXyA6PSBwLnJlYWRlci5QZWVrKDEpCisJCWlmIGxlbihiKSA8IDEgeworCQkJcmV0dXJuIG5pbAorCQl9CisJCXN3aXRjaCBiWzBdIHsKKwkJY2FzZSAnICcsICdccicsICdcbicsICdcdCc6CisJCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJCQljb250aW51ZQorCQlkZWZhdWx0OgorCQkJYnJlYWsKKwkJfQorCQlicmVhaworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlU3RyaW5nQm9keSgpIChzdHJpbmcsIGVycm9yKSB7CisJbGluZSwgZXJyIDo9IHAucmVhZGVyLlJlYWRTdHJpbmcoSlNPTl9RVU9URSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuICIiLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwlsIDo9IGxlbihsaW5lKQorCS8vIGNvdW50IG51bWJlciBvZiBlc2NhcGVzIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGtlZXAgZ29pbmcKKwlpIDo9IDEKKwlmb3IgOyBpIDwgbDsgaSsrIHsKKwkJaWYgbGluZVtsLWktMV0gIT0gJ1xcJyB7CisJCQlicmVhaworCQl9CisJfQorCWlmIGkmMHgwMSA9PSAxIHsKKwkJdiwgb2sgOj0ganNvblVucXVvdGUoc3RyaW5nKEpTT05fUVVPVEUpICsgbGluZSkKKwkJaWYgIW9rIHsKKwkJCXJldHVybiAiIiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwkJfQorCQlyZXR1cm4gdiwgbmlsCisJfQorCXMsIGVyciA6PSBwLlBhcnNlUXVvdGVkU3RyaW5nQm9keSgpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiAiIiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwl9CisJc3RyIDo9IHN0cmluZyhKU09OX1FVT1RFKSArIGxpbmUgKyBzCisJdiwgb2sgOj0ganNvblVucXVvdGUoc3RyKQorCWlmICFvayB7CisJCWUgOj0gZm10LkVycm9yZigiVW5hYmxlIHRvIHBhcnNlIGFzIEpTT04gc3RyaW5nICVzIiwgc3RyKQorCQlyZXR1cm4gIiIsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwl9CisJcmV0dXJuIHYsIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZVF1b3RlZFN0cmluZ0JvZHkoKSAoc3RyaW5nLCBlcnJvcikgeworCWxpbmUsIGVyciA6PSBwLnJlYWRlci5SZWFkU3RyaW5nKEpTT05fUVVPVEUpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiAiIiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwl9CisJbCA6PSBsZW4obGluZSkKKwkvLyBjb3VudCBudW1iZXIgb2YgZXNjYXBlcyB0byBzZWUgaWYgd2UgbmVlZCB0byBrZWVwIGdvaW5nCisJaSA6PSAxCisJZm9yIDsgaSA8IGw7IGkrKyB7CisJCWlmIGxpbmVbbC1pLTFdICE9ICdcXCcgeworCQkJYnJlYWsKKwkJfQorCX0KKwlpZiBpJjB4MDEgPT0gMSB7CisJCXJldHVybiBsaW5lLCBuaWwKKwl9CisJcywgZXJyIDo9IHAuUGFyc2VRdW90ZWRTdHJpbmdCb2R5KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuICIiLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwl2IDo9IGxpbmUgKyBzCisJcmV0dXJuIHYsIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZUJhc2U2NEVuY29kZWRCb2R5KCkgKFtdYnl0ZSwgZXJyb3IpIHsKKwlsaW5lLCBlcnIgOj0gcC5yZWFkZXIuUmVhZEJ5dGVzKEpTT05fUVVPVEUpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBsaW5lLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwlsaW5lMiA6PSBsaW5lWzAgOiBsZW4obGluZSktMV0KKwlsIDo9IGxlbihsaW5lMikKKwlpZiAobCAlIDQpICE9IDAgeworCQlwYWQgOj0gNCAtIChsICUgNCkKKwkJZmlsbCA6PSBbLi4uXWJ5dGV7Jz0nLCAnPScsICc9J30KKwkJbGluZTIgPSBhcHBlbmQobGluZTIsIGZpbGxbOnBhZF0uLi4pCisJCWwgPSBsZW4obGluZTIpCisJfQorCW91dHB1dCA6PSBtYWtlKFtdYnl0ZSwgYmFzZTY0LlN0ZEVuY29kaW5nLkRlY29kZWRMZW4obCkpCisJbiwgZXJyIDo9IGJhc2U2NC5TdGRFbmNvZGluZy5EZWNvZGUob3V0cHV0LCBsaW5lMikKKwlyZXR1cm4gb3V0cHV0WzA6bl0sIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlSTY0KCkgKGludDY0LCBib29sLCBlcnJvcikgeworCWlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiAwLCBmYWxzZSwgZXJyCisJfQorCXZhciB2YWx1ZSBpbnQ2NAorCXZhciBpc251bGwgYm9vbAorCWlmIHAuc2FmZVBlZWtDb250YWlucyhKU09OX05VTEwpIHsKKwkJcC5yZWFkZXIuUmVhZChtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTlVMTCkpKQorCQlpc251bGwgPSB0cnVlCisJfSBlbHNlIHsKKwkJbnVtLCBlcnIgOj0gcC5yZWFkTnVtZXJpYygpCisJCWlzbnVsbCA9IChudW0gPT0gbmlsKQorCQlpZiAhaXNudWxsIHsKKwkJCXZhbHVlID0gbnVtLkludDY0KCkKKwkJfQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiB2YWx1ZSwgaXNudWxsLCBlcnIKKwkJfQorCX0KKwlyZXR1cm4gdmFsdWUsIGlzbnVsbCwgcC5QYXJzZVBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlRjY0KCkgKGZsb2F0NjQsIGJvb2wsIGVycm9yKSB7CisJaWYgZXJyIDo9IHAuUGFyc2VQcmVWYWx1ZSgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIDAsIGZhbHNlLCBlcnIKKwl9CisJdmFyIHZhbHVlIGZsb2F0NjQKKwl2YXIgaXNudWxsIGJvb2wKKwlpZiBwLnNhZmVQZWVrQ29udGFpbnMoSlNPTl9OVUxMKSB7CisJCXAucmVhZGVyLlJlYWQobWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKSkKKwkJaXNudWxsID0gdHJ1ZQorCX0gZWxzZSB7CisJCW51bSwgZXJyIDo9IHAucmVhZE51bWVyaWMoKQorCQlpc251bGwgPSAobnVtID09IG5pbCkKKwkJaWYgIWlzbnVsbCB7CisJCQl2YWx1ZSA9IG51bS5GbG9hdDY0KCkKKwkJfQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiB2YWx1ZSwgaXNudWxsLCBlcnIKKwkJfQorCX0KKwlyZXR1cm4gdmFsdWUsIGlzbnVsbCwgcC5QYXJzZVBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlT2JqZWN0U3RhcnQoKSAoYm9vbCwgZXJyb3IpIHsKKwlpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZmFsc2UsIGVycgorCX0KKwl2YXIgYiBbXWJ5dGUKKwliLCBlcnIgOj0gcC5yZWFkZXIuUGVlaygxKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZmFsc2UsIGVycgorCX0KKwlpZiBsZW4oYikgPiAwICYmIGJbMF0gPT0gSlNPTl9MQlJBQ0VbMF0geworCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJCXAucGFyc2VDb250ZXh0U3RhY2sgPSBhcHBlbmQocC5wYXJzZUNvbnRleHRTdGFjaywgaW50KF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCkpCisJCXJldHVybiBmYWxzZSwgbmlsCisJfSBlbHNlIGlmIHAuc2FmZVBlZWtDb250YWlucyhKU09OX05VTEwpIHsKKwkJcmV0dXJuIHRydWUsIG5pbAorCX0KKwllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkICd7JyBvciBudWxsLCBidXQgZm91bmQgJyVzJyIsIHN0cmluZyhiKSkKKwlyZXR1cm4gZmFsc2UsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VPYmplY3RFbmQoKSBlcnJvciB7CisJaWYgaXNOdWxsLCBlcnIgOj0gcC5yZWFkSWZOdWxsKCk7IGlzTnVsbCB8fCBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwljeHQgOj0gX1BhcnNlQ29udGV4dChwLnBhcnNlQ29udGV4dFN0YWNrW2xlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXSkKKwlpZiAoY3h0ICE9IF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCkgJiYgKGN4dCAhPSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVkpIHsKKwkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCB0byBiZSBpbiB0aGUgT2JqZWN0IENvbnRleHQsIGJ1dCBub3QgaW4gT2JqZWN0IENvbnRleHQgKCVkKSIsIGN4dCkKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwl9CisJbGluZSwgZXJyIDo9IHAucmVhZGVyLlJlYWRTdHJpbmcoSlNPTl9SQlJBQ0VbMF0pCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwlmb3IgXywgY2hhciA6PSByYW5nZSBsaW5lIHsKKwkJc3dpdGNoIGNoYXIgeworCQlkZWZhdWx0OgorCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RpbmcgZW5kIG9mIG9iamVjdCBcIn1cIiwgYnV0IGZvdW5kOiBcIiVzXCIiLCBsaW5lKQorCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJY2FzZSAnICcsICdcbicsICdccicsICdcdCcsICd9JzoKKwkJCWJyZWFrCisJCX0KKwl9CisJcC5wYXJzZUNvbnRleHRTdGFjayA9IHAucGFyc2VDb250ZXh0U3RhY2tbOmxlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXQorCXJldHVybiBwLlBhcnNlUG9zdFZhbHVlKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VMaXN0QmVnaW4oKSAoaXNOdWxsIGJvb2wsIGVyciBlcnJvcikgeworCWlmIGUgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGZhbHNlLCBlCisJfQorCXZhciBiIFtdYnl0ZQorCWIsIGVyciA9IHAucmVhZGVyLlBlZWsoMSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGZhbHNlLCBlcnIKKwl9CisJaWYgbGVuKGIpID49IDEgJiYgYlswXSA9PSBKU09OX0xCUkFDS0VUWzBdIHsKKwkJcC5wYXJzZUNvbnRleHRTdGFjayA9IGFwcGVuZChwLnBhcnNlQ29udGV4dFN0YWNrLCBpbnQoX0NPTlRFWFRfSU5fTElTVF9GSVJTVCkpCisJCXAucmVhZGVyLlJlYWRCeXRlKCkKKwkJaXNOdWxsID0gZmFsc2UKKwl9IGVsc2UgaWYgcC5zYWZlUGVla0NvbnRhaW5zKEpTT05fTlVMTCkgeworCQlpc051bGwgPSB0cnVlCisJfSBlbHNlIHsKKwkJZXJyID0gZm10LkVycm9yZigiRXhwZWN0ZWQgXCJudWxsXCIgb3IgXCJbXCIsIHJlY2VpdmVkICVxIiwgYikKKwl9CisJcmV0dXJuIGlzTnVsbCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlcnIpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlRWxlbUxpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgZXJyb3IpIHsKKwlpZiBpc051bGwsIGUgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZSAhPSBuaWwgeworCQlyZXR1cm4gVk9JRCwgMCwgZQorCX0KKwliRWxlbVR5cGUsIGVyciA6PSBwLlJlYWRCeXRlKCkKKwllbGVtVHlwZSA9IFRUeXBlKGJFbGVtVHlwZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVsZW1UeXBlLCBzaXplLCBlcnIKKwl9CisJblNpemUsIGVycjIgOj0gcC5SZWFkSTY0KCkKKwlzaXplID0gaW50KG5TaXplKQorCXJldHVybiBlbGVtVHlwZSwgc2l6ZSwgZXJyMgorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZUxpc3RFbmQoKSBlcnJvciB7CisJaWYgaXNOdWxsLCBlcnIgOj0gcC5yZWFkSWZOdWxsKCk7IGlzTnVsbCB8fCBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwljeHQgOj0gX1BhcnNlQ29udGV4dChwLnBhcnNlQ29udGV4dFN0YWNrW2xlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXSkKKwlpZiBjeHQgIT0gX0NPTlRFWFRfSU5fTElTVCB7CisJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgdG8gYmUgaW4gdGhlIExpc3QgQ29udGV4dCwgYnV0IG5vdCBpbiBMaXN0IENvbnRleHQgKCVkKSIsIGN4dCkKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwl9CisJbGluZSwgZXJyIDo9IHAucmVhZGVyLlJlYWRTdHJpbmcoSlNPTl9SQlJBQ0tFVFswXSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJfQorCWZvciBfLCBjaGFyIDo9IHJhbmdlIGxpbmUgeworCQlzd2l0Y2ggY2hhciB7CisJCWRlZmF1bHQ6CisJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGluZyBlbmQgb2YgbGlzdCBcIl1cIiwgYnV0IGZvdW5kOiBcIiV2XCIiLCBsaW5lKQorCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJY2FzZSAnICcsICdcbicsICdccicsICdcdCcsIHJ1bmUoSlNPTl9SQlJBQ0tFVFswXSk6CisJCQlicmVhaworCQl9CisJfQorCXAucGFyc2VDb250ZXh0U3RhY2sgPSBwLnBhcnNlQ29udGV4dFN0YWNrWzpsZW4ocC5wYXJzZUNvbnRleHRTdGFjayktMV0KKwlpZiBfUGFyc2VDb250ZXh0KHAucGFyc2VDb250ZXh0U3RhY2tbbGVuKHAucGFyc2VDb250ZXh0U3RhY2spLTFdKSA9PSBfQ09OVEVYVF9JTl9UT1BMRVZFTCB7CisJCXJldHVybiBuaWwKKwl9CisJcmV0dXJuIHAuUGFyc2VQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSByZWFkU2luZ2xlVmFsdWUoKSAoaW50ZXJmYWNle30sIFRUeXBlLCBlcnJvcikgeworCWUgOj0gcC5yZWFkTm9uU2lnbmlmaWNhbnRXaGl0ZXNwYWNlKCkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBuaWwsIFZPSUQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwliLCBlIDo9IHAucmVhZGVyLlBlZWsoMSkKKwlpZiBsZW4oYikgPiAwIHsKKwkJYyA6PSBiWzBdCisJCXN3aXRjaCBjIHsKKwkJY2FzZSBKU09OX05VTExbMF06CisJCQlidWYgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKQorCQkJXywgZSA6PSBwLnJlYWRlci5SZWFkKGJ1ZikKKwkJCWlmIGUgIT0gbmlsIHsKKwkJCQlyZXR1cm4gbmlsLCBWT0lELCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJCX0KKwkJCWlmIHN0cmluZyhKU09OX05VTEwpICE9IHN0cmluZyhidWYpIHsKKwkJCQllID0gbWlzbWF0Y2goc3RyaW5nKEpTT05fTlVMTCksIHN0cmluZyhidWYpKQorCQkJCXJldHVybiBuaWwsIFZPSUQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCX0KKwkJCXJldHVybiBuaWwsIFZPSUQsIG5pbAorCQljYXNlIEpTT05fUVVPVEU6CisJCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJCQl2LCBlIDo9IHAuUGFyc2VTdHJpbmdCb2R5KCkKKwkJCWlmIGUgIT0gbmlsIHsKKwkJCQlyZXR1cm4gdiwgVVRGOCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCQl9CisJCQlpZiB2ID09IEpTT05fSU5GSU5JVFkgeworCQkJCXJldHVybiBJTkZJTklUWSwgRE9VQkxFLCBuaWwKKwkJCX0gZWxzZSBpZiB2ID09IEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgeworCQkJCXJldHVybiBORUdBVElWRV9JTkZJTklUWSwgRE9VQkxFLCBuaWwKKwkJCX0gZWxzZSBpZiB2ID09IEpTT05fTkFOIHsKKwkJCQlyZXR1cm4gTkFOLCBET1VCTEUsIG5pbAorCQkJfQorCQkJcmV0dXJuIHYsIFVURjgsIG5pbAorCQljYXNlIEpTT05fVFJVRVswXToKKwkJCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fVFJVRSkpCisJCQlfLCBlIDo9IHAucmVhZGVyLlJlYWQoYnVmKQorCQkJaWYgZSAhPSBuaWwgeworCQkJCXJldHVybiB0cnVlLCBCT09MLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJCX0KKwkJCWlmIHN0cmluZyhKU09OX1RSVUUpICE9IHN0cmluZyhidWYpIHsKKwkJCQllIDo9IG1pc21hdGNoKHN0cmluZyhKU09OX1RSVUUpLCBzdHJpbmcoYnVmKSkKKwkJCQlyZXR1cm4gdHJ1ZSwgQk9PTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQkJcmV0dXJuIHRydWUsIEJPT0wsIG5pbAorCQljYXNlIEpTT05fRkFMU0VbMF06CisJCQlidWYgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX0ZBTFNFKSkKKwkJCV8sIGUgOj0gcC5yZWFkZXIuUmVhZChidWYpCisJCQlpZiBlICE9IG5pbCB7CisJCQkJcmV0dXJuIGZhbHNlLCBCT09MLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJCX0KKwkJCWlmIHN0cmluZyhKU09OX0ZBTFNFKSAhPSBzdHJpbmcoYnVmKSB7CisJCQkJZSA6PSBtaXNtYXRjaChzdHJpbmcoSlNPTl9GQUxTRSksIHN0cmluZyhidWYpKQorCQkJCXJldHVybiBmYWxzZSwgQk9PTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQkJcmV0dXJuIGZhbHNlLCBCT09MLCBuaWwKKwkJY2FzZSBKU09OX0xCUkFDS0VUWzBdOgorCQkJXywgZSA6PSBwLnJlYWRlci5SZWFkQnl0ZSgpCisJCQlyZXR1cm4gbWFrZShbXWludGVyZmFjZXt9LCAwKSwgTElTVCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCWNhc2UgSlNPTl9MQlJBQ0VbMF06CisJCQlfLCBlIDo9IHAucmVhZGVyLlJlYWRCeXRlKCkKKwkJCXJldHVybiBtYWtlKG1hcFtzdHJpbmddaW50ZXJmYWNle30pLCBTVFJVQ1QsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQljYXNlICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ2UnLCAnRScsICcuJywgJysnLCAnLScsIEpTT05fSU5GSU5JVFlbMF0sIEpTT05fTkFOWzBdOgorCQkJLy8gYXNzdW1lIG51bWVyaWMKKwkJCXYsIGUgOj0gcC5yZWFkTnVtZXJpYygpCisJCQlyZXR1cm4gdiwgRE9VQkxFLCBlCisJCWRlZmF1bHQ6CisJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIGVsZW1lbnQgaW4gbGlzdCBidXQgZm91bmQgJyVzJyB3aGlsZSBwYXJzaW5nIEpTT04uIiwgc3RyaW5nKGMpKQorCQkJcmV0dXJuIG5pbCwgVk9JRCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQl9CisJfQorCWUgPSBmbXQuRXJyb3JmKCJDYW5ub3QgcmVhZCBhIHNpbmdsZSBlbGVtZW50IHdoaWxlIHBhcnNpbmcgSlNPTi4iKQorCXJldHVybiBuaWwsIFZPSUQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKworfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSByZWFkSWZOdWxsKCkgKGJvb2wsIGVycm9yKSB7CisJY29udCA6PSB0cnVlCisJZm9yIGNvbnQgeworCQliLCBfIDo9IHAucmVhZGVyLlBlZWsoMSkKKwkJaWYgbGVuKGIpIDwgMSB7CisJCQlyZXR1cm4gZmFsc2UsIG5pbAorCQl9CisJCXN3aXRjaCBiWzBdIHsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBmYWxzZSwgbmlsCisJCWNhc2UgSlNPTl9OVUxMWzBdOgorCQkJY29udCA9IGZhbHNlCisJCQlicmVhaworCQljYXNlICcgJywgJ1xuJywgJ1xyJywgJ1x0JzoKKwkJCXAucmVhZGVyLlJlYWRCeXRlKCkKKwkJCWJyZWFrCisJCX0KKwl9CisJaWYgcC5zYWZlUGVla0NvbnRhaW5zKEpTT05fTlVMTCkgeworCQlwLnJlYWRlci5SZWFkKG1ha2UoW11ieXRlLCBsZW4oSlNPTl9OVUxMKSkpCisJCXJldHVybiB0cnVlLCBuaWwKKwl9CisJcmV0dXJuIGZhbHNlLCBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgcmVhZFF1b3RlSWZOZXh0KCkgeworCWIsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQorCWlmIGxlbihiKSA+IDAgJiYgYlswXSA9PSBKU09OX1FVT1RFIHsKKwkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCX0KK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgcmVhZE51bWVyaWMoKSAoTnVtZXJpYywgZXJyb3IpIHsKKwlpc051bGwsIGVyciA6PSBwLnJlYWRJZk51bGwoKQorCWlmIGlzTnVsbCB8fCBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgZXJyCisJfQorCWhhc0RlY2ltYWxQb2ludCA6PSBmYWxzZQorCW5leHRDYW5CZVNpZ24gOj0gdHJ1ZQorCWhhc0UgOj0gZmFsc2UKKwlNQVhfTEVOIDo9IDQwCisJYnVmIDo9IGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgTUFYX0xFTikpCisJY29udGludWVGb3IgOj0gdHJ1ZQorCWluUXVvdGVzIDo9IGZhbHNlCisJZm9yIGNvbnRpbnVlRm9yIHsKKwkJYywgZXJyIDo9IHAucmVhZGVyLlJlYWRCeXRlKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlpZiBlcnIgPT0gaW8uRU9GIHsKKwkJCQlicmVhaworCQkJfQorCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwkJfQorCQlzd2l0Y2ggYyB7CisJCWNhc2UgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknOgorCQkJYnVmLldyaXRlQnl0ZShjKQorCQkJbmV4dENhbkJlU2lnbiA9IGZhbHNlCisJCWNhc2UgJy4nOgorCQkJaWYgaGFzRGVjaW1hbFBvaW50IHsKKwkJCQllIDo9IGZtdC5FcnJvcmYoIlVuYWJsZSB0byBwYXJzZSBudW1iZXIgd2l0aCBtdWx0aXBsZSBkZWNpbWFsIHBvaW50cyAnJXMuJyIsIGJ1Zi5TdHJpbmcoKSkKKwkJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCQlpZiBoYXNFIHsKKwkJCQllIDo9IGZtdC5FcnJvcmYoIlVuYWJsZSB0byBwYXJzZSBudW1iZXIgd2l0aCBkZWNpbWFsIHBvaW50cyBpbiB0aGUgZXhwb25lbnQgJyVzLiciLCBidWYuU3RyaW5nKCkpCisJCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQkJYnVmLldyaXRlQnl0ZShjKQorCQkJaGFzRGVjaW1hbFBvaW50LCBuZXh0Q2FuQmVTaWduID0gdHJ1ZSwgZmFsc2UKKwkJY2FzZSAnZScsICdFJzoKKwkJCWlmIGhhc0UgeworCQkJCWUgOj0gZm10LkVycm9yZigiVW5hYmxlIHRvIHBhcnNlIG51bWJlciB3aXRoIG11bHRpcGxlIGV4cG9uZW50cyAnJXMlYyciLCBidWYuU3RyaW5nKCksIGMpCisJCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQkJYnVmLldyaXRlQnl0ZShjKQorCQkJaGFzRSwgbmV4dENhbkJlU2lnbiA9IHRydWUsIHRydWUKKwkJY2FzZSAnLScsICcrJzoKKwkJCWlmICFuZXh0Q2FuQmVTaWduIHsKKwkJCQllIDo9IGZtdC5FcnJvcmYoIk5lZ2F0aXZlIHNpZ24gd2l0aGluIG51bWJlciIpCisJCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQkJYnVmLldyaXRlQnl0ZShjKQorCQkJbmV4dENhbkJlU2lnbiA9IGZhbHNlCisJCWNhc2UgJyAnLCAwLCAnXHQnLCAnXG4nLCAnXHInLCBKU09OX1JCUkFDRVswXSwgSlNPTl9SQlJBQ0tFVFswXSwgSlNPTl9DT01NQVswXSwgSlNPTl9DT0xPTlswXToKKwkJCXAucmVhZGVyLlVucmVhZEJ5dGUoKQorCQkJY29udGludWVGb3IgPSBmYWxzZQorCQljYXNlIEpTT05fTkFOWzBdOgorCQkJaWYgYnVmLkxlbigpID09IDAgeworCQkJCWJ1ZmZlciA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTkFOKSkKKwkJCQlidWZmZXJbMF0gPSBjCisJCQkJXywgZSA6PSBwLnJlYWRlci5SZWFkKGJ1ZmZlclsxOl0pCisJCQkJaWYgZSAhPSBuaWwgeworCQkJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJCQl9CisJCQkJaWYgSlNPTl9OQU4gIT0gc3RyaW5nKGJ1ZmZlcikgeworCQkJCQllIDo9IG1pc21hdGNoKEpTT05fTkFOLCBzdHJpbmcoYnVmZmVyKSkKKwkJCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJCX0KKwkJCQlpZiBpblF1b3RlcyB7CisJCQkJCXAucmVhZFF1b3RlSWZOZXh0KCkKKwkJCQl9CisJCQkJcmV0dXJuIE5BTiwgbmlsCisJCQl9IGVsc2UgeworCQkJCWUgOj0gZm10LkVycm9yZigiVW5hYmxlIHRvIHBhcnNlIG51bWJlciBzdGFydGluZyB3aXRoIGNoYXJhY3RlciAnJWMnIiwgYykKKwkJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCWNhc2UgSlNPTl9JTkZJTklUWVswXToKKwkJCWlmIGJ1Zi5MZW4oKSA9PSAwIHx8IChidWYuTGVuKCkgPT0gMSAmJiBidWYuQnl0ZXMoKVswXSA9PSAnKycpIHsKKwkJCQlidWZmZXIgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX0lORklOSVRZKSkKKwkJCQlidWZmZXJbMF0gPSBjCisJCQkJXywgZSA6PSBwLnJlYWRlci5SZWFkKGJ1ZmZlclsxOl0pCisJCQkJaWYgZSAhPSBuaWwgeworCQkJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJCQl9CisJCQkJaWYgSlNPTl9JTkZJTklUWSAhPSBzdHJpbmcoYnVmZmVyKSB7CisJCQkJCWUgOj0gbWlzbWF0Y2goSlNPTl9JTkZJTklUWSwgc3RyaW5nKGJ1ZmZlcikpCisJCQkJCXJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCQl9CisJCQkJaWYgaW5RdW90ZXMgeworCQkJCQlwLnJlYWRRdW90ZUlmTmV4dCgpCisJCQkJfQorCQkJCXJldHVybiBJTkZJTklUWSwgbmlsCisJCQl9IGVsc2UgaWYgYnVmLkxlbigpID09IDEgJiYgYnVmLkJ5dGVzKClbMF0gPT0gSlNPTl9ORUdBVElWRV9JTkZJTklUWVswXSB7CisJCQkJYnVmZmVyIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9ORUdBVElWRV9JTkZJTklUWSkpCisJCQkJYnVmZmVyWzBdID0gSlNPTl9ORUdBVElWRV9JTkZJTklUWVswXQorCQkJCWJ1ZmZlclsxXSA9IGMKKwkJCQlfLCBlIDo9IHAucmVhZGVyLlJlYWQoYnVmZmVyWzI6XSkKKwkJCQlpZiBlICE9IG5pbCB7CisJCQkJCXJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQkJCX0KKwkJCQlpZiBKU09OX05FR0FUSVZFX0lORklOSVRZICE9IHN0cmluZyhidWZmZXIpIHsKKwkJCQkJZSA6PSBtaXNtYXRjaChKU09OX05FR0FUSVZFX0lORklOSVRZLCBzdHJpbmcoYnVmZmVyKSkKKwkJCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJCX0KKwkJCQlpZiBpblF1b3RlcyB7CisJCQkJCXAucmVhZFF1b3RlSWZOZXh0KCkKKwkJCQl9CisJCQkJcmV0dXJuIE5FR0FUSVZFX0lORklOSVRZLCBuaWwKKwkJCX0gZWxzZSB7CisJCQkJZSA6PSBmbXQuRXJyb3JmKCJVbmFibGUgdG8gcGFyc2UgbnVtYmVyIHN0YXJ0aW5nIHdpdGggY2hhcmFjdGVyICclYycgZHVlIHRvIGV4aXN0aW5nIGJ1ZmZlciAlcyIsIGMsIGJ1Zi5TdHJpbmcoKSkKKwkJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCWNhc2UgSlNPTl9RVU9URToKKwkJCWlmICFpblF1b3RlcyB7CisJCQkJaW5RdW90ZXMgPSB0cnVlCisJCQl9IGVsc2UgeworCQkJCWJyZWFrCisJCQl9CisJCWRlZmF1bHQ6CisJCQllIDo9IGZtdC5FcnJvcmYoIlVuYWJsZSB0byBwYXJzZSBudW1iZXIgc3RhcnRpbmcgd2l0aCBjaGFyYWN0ZXIgJyVjJyIsIGMpCisJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCX0KKwl9CisJaWYgYnVmLkxlbigpID09IDAgeworCQllIDo9IGZtdC5FcnJvcmYoIlVuYWJsZSB0byBwYXJzZSBudW1iZXIgZnJvbSBlbXB0eSBzdHJpbmcgJyciKQorCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJfQorCXJldHVybiBOZXdOdW1lcmljRnJvbUpTT05TdHJpbmcoYnVmLlN0cmluZygpLCBmYWxzZSksIG5pbAorfQorCisvLyBTYWZlbHkgcGVla3MgaW50byB0aGUgYnVmZmVyLCByZWFkaW5nIG9ubHkgd2hhdCBpcyBuZWNlc3NhcnkKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIHNhZmVQZWVrQ29udGFpbnMoYiBbXWJ5dGUpIGJvb2wgeworCWZvciBpIDo9IDA7IGkgPCBsZW4oYik7IGkrKyB7CisJCWEsIF8gOj0gcC5yZWFkZXIuUGVlayhpICsgMSkKKwkJaWYgbGVuKGEpID09IDAgfHwgYVtpXSAhPSBiW2ldIHsKKwkJCXJldHVybiBmYWxzZQorCQl9CisJfQorCXJldHVybiB0cnVlCit9CisKKy8vIFJlc2V0IHRoZSBjb250ZXh0IHN0YWNrIHRvIGl0cyBpbml0aWFsIHN0YXRlLgorZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgcmVzZXRDb250ZXh0U3RhY2soKSB7CisJcC5wYXJzZUNvbnRleHRTdGFjayA9IFtdaW50e2ludChfQ09OVEVYVF9JTl9UT1BMRVZFTCl9CisJcC5kdW1wQ29udGV4dCA9IFtdaW50e2ludChfQ09OVEVYVF9JTl9UT1BMRVZFTCl9Cit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIHdyaXRlKGIgW11ieXRlKSAoaW50LCBlcnJvcikgeworCW4sIGVyciA6PSBwLndyaXRlci5Xcml0ZShiKQorCWlmIGVyciAhPSBuaWwgeworCQlwLndyaXRlci5SZXNldChwLnRyYW5zKSAvLyBUSFJJRlQtMzczNQorCX0KKwlyZXR1cm4gbiwgZXJyCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NpbXBsZV9qc29uX3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3NpbXBsZV9qc29uX3Byb3RvY29sX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5ODA4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX2pzb25fcHJvdG9jb2xfdGVzdC5nbwpAQCAtMCwwICsxLDcxNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlbmNvZGluZy9iYXNlNjQiCisJImVuY29kaW5nL2pzb24iCisJImZtdCIKKwkibWF0aCIKKwkic3RyY29udiIKKwkic3RyaW5ncyIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xCb29sKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJvb2xlYW4iCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBCT09MX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZUJvb2wodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQl9CisJCXYgOj0gZmFsc2UKKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEJvb2wodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYm9vbGVhbiIKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgQk9PTF9WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCQlpZiB2YWx1ZSB7CisJCQl0cmFucy5Xcml0ZShKU09OX1RSVUUpCisJCX0gZWxzZSB7CisJCQl0cmFucy5Xcml0ZShKU09OX0ZBTFNFKQorCQl9CisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkQm9vbCgpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEJ5dGUodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYnl0ZSIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIEJZVEVfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlQnl0ZSh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCX0KKwkJdiA6PSBpbnQ4KDApCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xCeXRlKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJ5dGUiCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIEJZVEVfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZEJ5dGUoKQorCQlpZiBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xJMTYodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiaW50MTYiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQxNl9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVJMTYodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQl9CisJCXYgOj0gaW50MTYoMCkKKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEkxNih0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQxNiIKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UMTZfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZEkxNigpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEkzMih0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQzMiIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDMyX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZUkzMih2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCX0KKwkJdiA6PSBpbnQzMigwKQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sSTMyKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDMyIgorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQzMl9WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkSTMyKCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CisKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xJMzJOdWxsKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDMyIgorCXZhbHVlIDo9ICJudWxsIgorCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCXRyYW5zLldyaXRlU3RyaW5nKHZhbHVlKQorCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwl2LCBlIDo9IHAuUmVhZEkzMigpCisKKwlpZiBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwl9CisJaWYgdiAhPSAwIHsKKwkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJfQorCXRyYW5zLlJlc2V0KCkKKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sSTY0KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDY0IgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UNjRfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlSTY0KHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJaWYgcyAhPSBmbXQuU3ByaW50KHZhbHVlKSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJfQorCQl2IDo9IGludDY0KDApCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xJNjQodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiaW50NjQiCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDY0X1ZBTFVFUyB7CisJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCQlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJCXRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuRm9ybWF0SW50KHZhbHVlLCAxMCkpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkSTY0KCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CisKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xJNjROdWxsKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDMyIgorCXZhbHVlIDo9ICJudWxsIgorCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCXRyYW5zLldyaXRlU3RyaW5nKHZhbHVlKQorCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwl2LCBlIDo9IHAuUmVhZEk2NCgpCisKKwlpZiBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwl9CisJaWYgdiAhPSAwIHsKKwkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJfQorCXRyYW5zLlJlc2V0KCkKKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sRG91YmxlKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImRvdWJsZSIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7CisJCQlpZiBzICE9IGpzb25RdW90ZShKU09OX0lORklOSVRZKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX0lORklOSVRZKSkKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIC0xKSB7CisJCQlpZiBzICE9IGpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSkKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKKwkJCWlmIHMgIT0ganNvblF1b3RlKEpTT05fTkFOKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05BTikpCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJCX0KKwkJCXYgOj0gZmxvYXQ2NCgwKQorCQkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xEb3VibGUodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiZG91YmxlIgorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwkJbiA6PSBOZXdOdW1lcmljRnJvbURvdWJsZSh2YWx1ZSkKKwkJdHJhbnMuV3JpdGVTdHJpbmcobi5TdHJpbmcoKSkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJdiwgZSA6PSBwLlJlYWREb3VibGUoKQorCQlpZiBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgbWF0aC5Jc0luZih2YWx1ZSwgMSkgeworCQkJaWYgIW1hdGguSXNJbmYodiwgMSkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgLTEpIHsKKwkJCWlmICFtYXRoLklzSW5mKHYsIC0xKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7CisJCQlpZiAhbWF0aC5Jc05hTih2KSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiB2ICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJCX0KKwkJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQkJfQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xTdHJpbmcodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAic3RyaW5nIgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgU1RSSU5HX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIHNbMF0gIT0gJyInIHx8IHNbbGVuKHMpLTFdICE9ICciJyB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAnJXYnLCB3cm90ZSAnJXYnLCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgZm10LlNwcmludCgiXCIiLCB2YWx1ZSwgIlwiIikpCisJCX0KKwkJdiA6PSBuZXcoc3RyaW5nKQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCB2KTsgZXJyICE9IG5pbCB8fCAqdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCAqdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbFN0cmluZyh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJzdHJpbmciCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIFNUUklOR19WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCQl0cmFucy5Xcml0ZVN0cmluZyhqc29uUXVvdGUodmFsdWUpKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZFN0cmluZygpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXYxIDo9IG5ldyhzdHJpbmcpCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksIHYxKTsgZXJyICE9IG5pbCB8fCAqdjEgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgKnYxKQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xTdHJpbmdOdWxsKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gInN0cmluZyIKKwl2YWx1ZSA6PSAibnVsbCIKKworCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwl0cmFucy5Xcml0ZVN0cmluZyh2YWx1ZSkKKwl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlzIDo9IHRyYW5zLlN0cmluZygpCisJdiwgZSA6PSBwLlJlYWRTdHJpbmcoKQorCWlmIGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCX0KKwlpZiB2ICE9ICIiIHsKKwkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJfQorCXRyYW5zLlJlc2V0KCkKKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sQmluYXJ5KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJpbmFyeSIKKwl2YWx1ZSA6PSBwcm90b2NvbF9iZGF0YQorCWI2NHZhbHVlIDo9IG1ha2UoW11ieXRlLCBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlZExlbihsZW4ocHJvdG9jb2xfYmRhdGEpKSkKKwliYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlKGI2NHZhbHVlLCB2YWx1ZSkKKwliNjRTdHJpbmcgOj0gc3RyaW5nKGI2NHZhbHVlKQorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwlpZiBlIDo9IHAuV3JpdGVCaW5hcnkodmFsdWUpOyBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJfQorCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwl9CisJcyA6PSB0cmFucy5TdHJpbmcoKQorCWlmIHMgIT0gZm10LlNwcmludCgiXCIiLCBiNjRTdHJpbmcsICJcIiIpIHsKKwkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXZcbiAgd3JvdGU6ICV2XG5leHBlY3RlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgIlwiIitiNjRTdHJpbmcrIlwiIikKKwl9CisJdjEgOj0gbmV3KHN0cmluZykKKwlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCB2MSk7IGVyciAhPSBuaWwgfHwgKnYxICE9IGI2NFN0cmluZyB7CisJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsICp2MSkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sQmluYXJ5KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJpbmFyeSIKKwl2YWx1ZSA6PSBwcm90b2NvbF9iZGF0YQorCWI2NHZhbHVlIDo9IG1ha2UoW11ieXRlLCBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlZExlbihsZW4ocHJvdG9jb2xfYmRhdGEpKSkKKwliYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlKGI2NHZhbHVlLCB2YWx1ZSkKKwliNjRTdHJpbmcgOj0gc3RyaW5nKGI2NHZhbHVlKQorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwl0cmFucy5Xcml0ZVN0cmluZyhqc29uUXVvdGUoYjY0U3RyaW5nKSkKKwl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlzIDo9IHRyYW5zLlN0cmluZygpCisJdiwgZSA6PSBwLlJlYWRCaW5hcnkoKQorCWlmIGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCX0KKwlpZiBsZW4odikgIT0gbGVuKHZhbHVlKSB7CisJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlIGxlbmd0aCAldiwgd3JvdGU6ICV2LCByZWNlaXZlZCBsZW5ndGg6ICV2IiwgdGhldHlwZSwgbGVuKHZhbHVlKSwgcywgbGVuKHYpKQorCX0KKwlmb3IgaSA6PSAwOyBpIDwgbGVuKHYpOyBpKysgeworCQlpZiB2W2ldICE9IHZhbHVlW2ldIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICVkIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIGksIHZhbHVlW2ldLCBzLCB2W2ldKQorCQl9CisJfQorCXYxIDo9IG5ldyhzdHJpbmcpCisJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgdjEpOyBlcnIgIT0gbmlsIHx8ICp2MSAhPSBiNjRTdHJpbmcgeworCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCAqdjEpCisJfQorCXRyYW5zLlJlc2V0KCkKKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xCaW5hcnlOdWxsKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJpbmFyeSIKKwl2YWx1ZSA6PSAibnVsbCIKKworCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwl0cmFucy5Xcml0ZVN0cmluZyh2YWx1ZSkKKwl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlzIDo9IHRyYW5zLlN0cmluZygpCisJYiwgZSA6PSBwLlJlYWRCaW5hcnkoKQorCXYgOj0gc3RyaW5nKGIpCisKKwlpZiBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwl9CisJaWYgdiAhPSAiIiB7CisJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCX0KKwl0cmFucy5SZXNldCgpCisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbExpc3QodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAibGlzdCIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJcC5Xcml0ZUxpc3RCZWdpbihUVHlwZShET1VCTEUpLCBsZW4oRE9VQkxFX1ZBTFVFUykpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJfQorCXAuV3JpdGVMaXN0RW5kKCkKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuRXJyb3IoKSkKKwl9CisJc3RyIDo9IHRyYW5zLlN0cmluZygpCisJc3RyMSA6PSBuZXcoW11pbnRlcmZhY2V7fSkKKwllcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHN0ciksIHN0cjEpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gZGVjb2RlICVzLCB3cm90ZTogJXMiLCB0aGV0eXBlLCBzdHIpCisJfQorCWwgOj0gKnN0cjEKKwlpZiBsZW4obCkgPCAyIHsKKwkJdC5GYXRhbGYoIkxpc3QgbXVzdCBiZSBhdCBsZWFzdCBvZiBsZW5ndGggdHdvIHRvIGluY2x1ZGUgbWV0YWRhdGEiKQorCX0KKwlpZiBpbnQobFswXS4oZmxvYXQ2NCkpICE9IERPVUJMRSB7CisJCXQuRmF0YWwoIkludmFsaWQgdHlwZSBmb3IgbGlzdCwgZXhwZWN0ZWQ6ICIsIERPVUJMRSwgIiwgYnV0IHdhczogIiwgbFswXSkKKwl9CisJaWYgaW50KGxbMV0uKGZsb2F0NjQpKSAhPSBsZW4oRE9VQkxFX1ZBTFVFUykgeworCQl0LkZhdGFsKCJJbnZhbGlkIGxlbmd0aCBmb3IgbGlzdCwgZXhwZWN0ZWQ6ICIsIGxlbihET1VCTEVfVkFMVUVTKSwgIiwgYnV0IHdhczogIiwgbFsxXSkKKwl9CisJZm9yIGssIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlzIDo9IGxbaysyXQorCQlpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fSU5GSU5JVFkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fSU5GSU5JVFkpLCBzdHIpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAwKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpLCBzdHIpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fTkFOIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9OQU4pLCBzdHIpCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiBzLihmbG9hdDY0KSAhPSB2YWx1ZSB7CisJCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQkJfQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbFNldCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJzZXQiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCXAuV3JpdGVTZXRCZWdpbihUVHlwZShET1VCTEUpLCBsZW4oRE9VQkxFX1ZBTFVFUykpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJfQorCXAuV3JpdGVTZXRFbmQoKQorCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgZS5FcnJvcigpKQorCX0KKwlzdHIgOj0gdHJhbnMuU3RyaW5nKCkKKwlzdHIxIDo9IG5ldyhbXWludGVyZmFjZXt9KQorCWVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUoc3RyKSwgc3RyMSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byBkZWNvZGUgJXMsIHdyb3RlOiAlcyIsIHRoZXR5cGUsIHN0cikKKwl9CisJbCA6PSAqc3RyMQorCWlmIGxlbihsKSA8IDIgeworCQl0LkZhdGFsZigiU2V0IG11c3QgYmUgYXQgbGVhc3Qgb2YgbGVuZ3RoIHR3byB0byBpbmNsdWRlIG1ldGFkYXRhIikKKwl9CisJaWYgaW50KGxbMF0uKGZsb2F0NjQpKSAhPSBET1VCTEUgeworCQl0LkZhdGFsKCJJbnZhbGlkIHR5cGUgZm9yIHNldCwgZXhwZWN0ZWQ6ICIsIERPVUJMRSwgIiwgYnV0IHdhczogIiwgbFswXSkKKwl9CisJaWYgaW50KGxbMV0uKGZsb2F0NjQpKSAhPSBsZW4oRE9VQkxFX1ZBTFVFUykgeworCQl0LkZhdGFsKCJJbnZhbGlkIGxlbmd0aCBmb3Igc2V0LCBleHBlY3RlZDogIiwgbGVuKERPVUJMRV9WQUxVRVMpLCAiLCBidXQgd2FzOiAiLCBsWzFdKQorCX0KKwlmb3IgaywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCXMgOj0gbFtrKzJdCisJCWlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9JTkZJTklUWSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9JTkZJTklUWSksIHN0cikKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIDApIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9ORUdBVElWRV9JTkZJTklUWSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9ORUdBVElWRV9JTkZJTklUWSksIHN0cikKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9OQU4geworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05BTiksIHN0cikKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIHMuKGZsb2F0NjQpICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCQl9CisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sTWFwKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gIm1hcCIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJcC5Xcml0ZU1hcEJlZ2luKFRUeXBlKEkzMiksIFRUeXBlKERPVUJMRSksIGxlbihET1VCTEVfVkFMVUVTKSkKKwlmb3IgaywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZUkzMihpbnQzMihrKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMga2V5IGludDMyIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCBrLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLldyaXRlRG91YmxlKHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSBmbG9hdDY0IHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJfQorCXAuV3JpdGVNYXBFbmQoKQorCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgZS5FcnJvcigpKQorCX0KKwlzdHIgOj0gdHJhbnMuU3RyaW5nKCkKKwlpZiBzdHJbMF0gIT0gJ1snIHx8IHN0cltsZW4oc3RyKS0xXSAhPSAnXScgeworCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcywgd3JvdGU6ICV2LCBpbiBnbzogJXYiLCB0aGV0eXBlLCBzdHIsIERPVUJMRV9WQUxVRVMpCisJfQorCWwgOj0gc3RyaW5ncy5TcGxpdChzdHJbMTpsZW4oc3RyKS0xXSwgIiwiKQorCWlmIGxlbihsKSA8IDMgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBsaXN0IG9mIGF0IGxlYXN0IGxlbmd0aCAzIGZvciBtYXAgZm9yIG1ldGFkYXRhLCBidXQgd2FzIG9mIGxlbmd0aCAiLCBsZW4obCkpCisJfQorCWV4cGVjdGVkS2V5VHlwZSwgXyA6PSBzdHJjb252LkF0b2kobFswXSkKKwlleHBlY3RlZFZhbHVlVHlwZSwgXyA6PSBzdHJjb252LkF0b2kobFsxXSkKKwlleHBlY3RlZFNpemUsIF8gOj0gc3RyY29udi5BdG9pKGxbMl0pCisJaWYgZXhwZWN0ZWRLZXlUeXBlICE9IEkzMiB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIG1hcCBrZXkgdHlwZSAiLCBJMzIsICIsIGJ1dCB3YXMgIiwgbFswXSkKKwl9CisJaWYgZXhwZWN0ZWRWYWx1ZVR5cGUgIT0gRE9VQkxFIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgbWFwIHZhbHVlIHR5cGUgIiwgRE9VQkxFLCAiLCBidXQgd2FzICIsIGxbMV0pCisJfQorCWlmIGV4cGVjdGVkU2l6ZSAhPSBsZW4oRE9VQkxFX1ZBTFVFUykgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBtYXAgc2l6ZSBvZiAiLCBsZW4oRE9VQkxFX1ZBTFVFUyksICIsIGJ1dCB3YXMgIiwgbFsyXSkKKwl9CisJZm9yIGssIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlzdHJrIDo9IGxbayoyKzNdCisJCXN0cnYgOj0gbFtrKjIrNF0KKwkJaWssIGVyciA6PSBzdHJjb252LkF0b2koc3RyaykKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBpbmRleCAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYsIGVycm9yOiAlcyIsIHRoZXR5cGUsIGssIHN0cmssIHN0cmluZyhrKSwgZXJyLkVycm9yKCkpCisJCX0KKwkJaWYgaWsgIT0gayB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBpbmRleCAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCBrLCBzdHJrLCBrKQorCQl9CisJCXMgOj0gc3RydgorCQlpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7CisJCQlpZiBzICE9IGpzb25RdW90ZShKU09OX0lORklOSVRZKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX0lORklOSVRZKSkKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIDApIHsKKwkJCWlmIHMgIT0ganNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpKQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc05hTih2YWx1ZSkgeworCQkJaWYgcyAhPSBqc29uUXVvdGUoSlNPTl9OQU4pIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05BTikpCisJCQl9CisJCX0gZWxzZSB7CisJCQlleHBlY3RlZCA6PSBzdHJjb252LkZvcm1hdEZsb2F0KHZhbHVlLCAnZycsIDEwLCA2NCkKKwkJCWlmIHMgIT0gZXhwZWN0ZWQgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGV4cGVjdGVkKQorCQkJfQorCQkJdiA6PSBmbG9hdDY0KDApCisJCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJCX0KKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2ltcGxlX3NlcnZlci5nbyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX3NlcnZlci5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDM1ODAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zaW1wbGVfc2VydmVyLmdvCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImxvZyIKKwkicnVudGltZS9kZWJ1ZyIKKwkic3luYyIKKwkic3luYy9hdG9taWMiCispCisKKy8qCisgKiBUaGlzIGlzIG5vdCBhIHR5cGljYWwgVFNpbXBsZVNlcnZlciBhcyBpdCBpcyBub3QgYmxvY2tlZCBhZnRlciBhY2NlcHQgYSBzb2NrZXQuCisgKiBJdCBpcyBtb3JlIGxpa2UgYSBUVGhyZWFkZWRTZXJ2ZXIgdGhhdCBjYW4gaGFuZGxlIGRpZmZlcmVudCBjb25uZWN0aW9ucyBpbiBkaWZmZXJlbnQgZ29yb3V0aW5lcy4KKyAqIFRoaXMgd2lsbCB3b3JrIGlmIGdvbGFuZyB1c2VyIGltcGxlbWVudHMgYSBjb25uLXBvb2wgbGlrZSB0aGluZyBpbiBjbGllbnQgc2lkZS4KKyAqLwordHlwZSBUU2ltcGxlU2VydmVyIHN0cnVjdCB7CisJY2xvc2VkIGludDMyCisJd2cgICAgIHN5bmMuV2FpdEdyb3VwCisJbXUgICAgIHN5bmMuTXV0ZXgKKworCXByb2Nlc3NvckZhY3RvcnkgICAgICAgVFByb2Nlc3NvckZhY3RvcnkKKwlzZXJ2ZXJUcmFuc3BvcnQgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQKKwlpbnB1dFRyYW5zcG9ydEZhY3RvcnkgIFRUcmFuc3BvcnRGYWN0b3J5CisJb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeQorCWlucHV0UHJvdG9jb2xGYWN0b3J5ICAgVFByb3RvY29sRmFjdG9yeQorCW91dHB1dFByb3RvY29sRmFjdG9yeSAgVFByb3RvY29sRmFjdG9yeQorfQorCitmdW5jIE5ld1RTaW1wbGVTZXJ2ZXIyKHByb2Nlc3NvciBUUHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQgVFNlcnZlclRyYW5zcG9ydCkgKlRTaW1wbGVTZXJ2ZXIgeworCXJldHVybiBOZXdUU2ltcGxlU2VydmVyRmFjdG9yeTIoTmV3VFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0KQorfQorCitmdW5jIE5ld1RTaW1wbGVTZXJ2ZXI0KHByb2Nlc3NvciBUUHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQgVFNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5IFRQcm90b2NvbEZhY3RvcnkpICpUU2ltcGxlU2VydmVyIHsKKwlyZXR1cm4gTmV3VFNpbXBsZVNlcnZlckZhY3Rvcnk0KE5ld1RQcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksCisJCXNlcnZlclRyYW5zcG9ydCwKKwkJdHJhbnNwb3J0RmFjdG9yeSwKKwkJcHJvdG9jb2xGYWN0b3J5LAorCSkKK30KKworZnVuYyBOZXdUU2ltcGxlU2VydmVyNihwcm9jZXNzb3IgVFByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0IFRTZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSwgaW5wdXRQcm90b2NvbEZhY3RvcnkgVFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5IFRQcm90b2NvbEZhY3RvcnkpICpUU2ltcGxlU2VydmVyIHsKKwlyZXR1cm4gTmV3VFNpbXBsZVNlcnZlckZhY3Rvcnk2KE5ld1RQcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksCisJCXNlcnZlclRyYW5zcG9ydCwKKwkJaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorCQlvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorCQlpbnB1dFByb3RvY29sRmFjdG9yeSwKKwkJb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorCSkKK30KKworZnVuYyBOZXdUU2ltcGxlU2VydmVyRmFjdG9yeTIocHJvY2Vzc29yRmFjdG9yeSBUUHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0IFRTZXJ2ZXJUcmFuc3BvcnQpICpUU2ltcGxlU2VydmVyIHsKKwlyZXR1cm4gTmV3VFNpbXBsZVNlcnZlckZhY3Rvcnk2KHByb2Nlc3NvckZhY3RvcnksCisJCXNlcnZlclRyYW5zcG9ydCwKKwkJTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSwKKwkJTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSwKKwkJTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSwKKwkJTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSwKKwkpCit9CisKK2Z1bmMgTmV3VFNpbXBsZVNlcnZlckZhY3Rvcnk0KHByb2Nlc3NvckZhY3RvcnkgVFByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCBUU2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkgVFByb3RvY29sRmFjdG9yeSkgKlRTaW1wbGVTZXJ2ZXIgeworCXJldHVybiBOZXdUU2ltcGxlU2VydmVyRmFjdG9yeTYocHJvY2Vzc29yRmFjdG9yeSwKKwkJc2VydmVyVHJhbnNwb3J0LAorCQl0cmFuc3BvcnRGYWN0b3J5LAorCQl0cmFuc3BvcnRGYWN0b3J5LAorCQlwcm90b2NvbEZhY3RvcnksCisJCXByb3RvY29sRmFjdG9yeSwKKwkpCit9CisKK2Z1bmMgTmV3VFNpbXBsZVNlcnZlckZhY3Rvcnk2KHByb2Nlc3NvckZhY3RvcnkgVFByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCBUU2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnksIGlucHV0UHJvdG9jb2xGYWN0b3J5IFRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSBUUHJvdG9jb2xGYWN0b3J5KSAqVFNpbXBsZVNlcnZlciB7CisJcmV0dXJuICZUU2ltcGxlU2VydmVyeworCQlwcm9jZXNzb3JGYWN0b3J5OiAgICAgICBwcm9jZXNzb3JGYWN0b3J5LAorCQlzZXJ2ZXJUcmFuc3BvcnQ6ICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisJCWlucHV0VHJhbnNwb3J0RmFjdG9yeTogIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKwkJb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTogb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKwkJaW5wdXRQcm90b2NvbEZhY3Rvcnk6ICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCisJCW91dHB1dFByb3RvY29sRmFjdG9yeTogIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKwl9Cit9CisKK2Z1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIFByb2Nlc3NvckZhY3RvcnkoKSBUUHJvY2Vzc29yRmFjdG9yeSB7CisJcmV0dXJuIHAucHJvY2Vzc29yRmFjdG9yeQorfQorCitmdW5jIChwICpUU2ltcGxlU2VydmVyKSBTZXJ2ZXJUcmFuc3BvcnQoKSBUU2VydmVyVHJhbnNwb3J0IHsKKwlyZXR1cm4gcC5zZXJ2ZXJUcmFuc3BvcnQKK30KKworZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgSW5wdXRUcmFuc3BvcnRGYWN0b3J5KCkgVFRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiBwLmlucHV0VHJhbnNwb3J0RmFjdG9yeQorfQorCitmdW5jIChwICpUU2ltcGxlU2VydmVyKSBPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KCkgVFRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiBwLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkKK30KKworZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgSW5wdXRQcm90b2NvbEZhY3RvcnkoKSBUUHJvdG9jb2xGYWN0b3J5IHsKKwlyZXR1cm4gcC5pbnB1dFByb3RvY29sRmFjdG9yeQorfQorCitmdW5jIChwICpUU2ltcGxlU2VydmVyKSBPdXRwdXRQcm90b2NvbEZhY3RvcnkoKSBUUHJvdG9jb2xGYWN0b3J5IHsKKwlyZXR1cm4gcC5vdXRwdXRQcm90b2NvbEZhY3RvcnkKK30KKworZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgTGlzdGVuKCkgZXJyb3IgeworCXJldHVybiBwLnNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKQorfQorCitmdW5jIChwICpUU2ltcGxlU2VydmVyKSBpbm5lckFjY2VwdCgpIChpbnQzMiwgZXJyb3IpIHsKKwljbGllbnQsIGVyciA6PSBwLnNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKQorCXAubXUuTG9jaygpCisJZGVmZXIgcC5tdS5VbmxvY2soKQorCWNsb3NlZCA6PSBhdG9taWMuTG9hZEludDMyKCZwLmNsb3NlZCkKKwlpZiBjbG9zZWQgIT0gMCB7CisJCXJldHVybiBjbG9zZWQsIG5pbAorCX0KKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIDAsIGVycgorCX0KKwlpZiBjbGllbnQgIT0gbmlsIHsKKwkJcC53Zy5BZGQoMSkKKwkJZ28gZnVuYygpIHsKKwkJCWRlZmVyIHAud2cuRG9uZSgpCisJCQlpZiBlcnIgOj0gcC5wcm9jZXNzUmVxdWVzdHMoY2xpZW50KTsgZXJyICE9IG5pbCB7CisJCQkJbG9nLlByaW50bG4oImVycm9yIHByb2Nlc3NpbmcgcmVxdWVzdDoiLCBlcnIpCisJCQl9CisJCX0oKQorCX0KKwlyZXR1cm4gMCwgbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIEFjY2VwdExvb3AoKSBlcnJvciB7CisJZm9yIHsKKwkJY2xvc2VkLCBlcnIgOj0gcC5pbm5lckFjY2VwdCgpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJCWlmIGNsb3NlZCAhPSAwIHsKKwkJCXJldHVybiBuaWwKKwkJfQorCX0KK30KKworZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgU2VydmUoKSBlcnJvciB7CisJZXJyIDo9IHAuTGlzdGVuKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlwLkFjY2VwdExvb3AoKQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgU3RvcCgpIGVycm9yIHsKKwlwLm11LkxvY2soKQorCWRlZmVyIHAubXUuVW5sb2NrKCkKKwlpZiBhdG9taWMuTG9hZEludDMyKCZwLmNsb3NlZCkgIT0gMCB7CisJCXJldHVybiBuaWwKKwl9CisJYXRvbWljLlN0b3JlSW50MzIoJnAuY2xvc2VkLCAxKQorCXAuc2VydmVyVHJhbnNwb3J0LkludGVycnVwdCgpCisJcC53Zy5XYWl0KCkKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIHByb2Nlc3NSZXF1ZXN0cyhjbGllbnQgVFRyYW5zcG9ydCkgZXJyb3IgeworCXByb2Nlc3NvciA6PSBwLnByb2Nlc3NvckZhY3RvcnkuR2V0UHJvY2Vzc29yKGNsaWVudCkKKwlpbnB1dFRyYW5zcG9ydCwgZXJyIDo9IHAuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJb3V0cHV0VHJhbnNwb3J0LCBlcnIgOj0gcC5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaW5wdXRQcm90b2NvbCA6PSBwLmlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KQorCW91dHB1dFByb3RvY29sIDo9IHAub3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCkKKwlkZWZlciBmdW5jKCkgeworCQlpZiBlIDo9IHJlY292ZXIoKTsgZSAhPSBuaWwgeworCQkJbG9nLlByaW50ZigicGFuaWMgaW4gcHJvY2Vzc29yOiAlczogJXMiLCBlLCBkZWJ1Zy5TdGFjaygpKQorCQl9CisJfSgpCisKKwlpZiBpbnB1dFRyYW5zcG9ydCAhPSBuaWwgeworCQlkZWZlciBpbnB1dFRyYW5zcG9ydC5DbG9zZSgpCisJfQorCWlmIG91dHB1dFRyYW5zcG9ydCAhPSBuaWwgeworCQlkZWZlciBvdXRwdXRUcmFuc3BvcnQuQ2xvc2UoKQorCX0KKwlmb3IgeworCQlpZiBhdG9taWMuTG9hZEludDMyKCZwLmNsb3NlZCkgIT0gMCB7CisJCQlyZXR1cm4gbmlsCisJCX0KKworCQlvaywgZXJyIDo9IHByb2Nlc3Nvci5Qcm9jZXNzKGRlZmF1bHRDdHgsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKQorCQlpZiBlcnIsIG9rIDo9IGVyci4oVFRyYW5zcG9ydEV4Y2VwdGlvbik7IG9rICYmIGVyci5UeXBlSWQoKSA9PSBFTkRfT0ZfRklMRSB7CisJCQlyZXR1cm4gbmlsCisJCX0gZWxzZSBpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCQlpZiBlcnIsIG9rIDo9IGVyci4oVEFwcGxpY2F0aW9uRXhjZXB0aW9uKTsgb2sgJiYgZXJyLlR5cGVJZCgpID09IFVOS05PV05fTUVUSE9EIHsKKwkJCWNvbnRpbnVlCisJCX0KKwkJaWYgIW9rIHsKKwkJCWJyZWFrCisJCX0KKwl9CisJcmV0dXJuIG5pbAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zaW1wbGVfc2VydmVyX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3NpbXBsZV9zZXJ2ZXJfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODE0OWE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zaW1wbGVfc2VydmVyX3Rlc3QuZ28KQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkidGVzdGluZyIKKwkiZXJyb3JzIgorCSJydW50aW1lIgorKQorCit0eXBlIG1vY2tTZXJ2ZXJUcmFuc3BvcnQgc3RydWN0IHsKKwlMaXN0ZW5GdW5jICAgIGZ1bmMoKSBlcnJvcgorCUFjY2VwdEZ1bmMgICAgZnVuYygpIChUVHJhbnNwb3J0LCBlcnJvcikKKwlDbG9zZUZ1bmMgICAgIGZ1bmMoKSBlcnJvcgorCUludGVycnVwdEZ1bmMgZnVuYygpIGVycm9yCit9CisKK2Z1bmMgKG0gKm1vY2tTZXJ2ZXJUcmFuc3BvcnQpIExpc3RlbigpIGVycm9yIHsKKwlyZXR1cm4gbS5MaXN0ZW5GdW5jKCkKK30KKworZnVuYyAobSAqbW9ja1NlcnZlclRyYW5zcG9ydCkgQWNjZXB0KCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJcmV0dXJuIG0uQWNjZXB0RnVuYygpCit9CisKK2Z1bmMgKG0gKm1vY2tTZXJ2ZXJUcmFuc3BvcnQpIENsb3NlKCkgZXJyb3IgeworCXJldHVybiBtLkNsb3NlRnVuYygpCit9CisKK2Z1bmMgKG0gKm1vY2tTZXJ2ZXJUcmFuc3BvcnQpIEludGVycnVwdCgpIGVycm9yIHsKKwlyZXR1cm4gbS5JbnRlcnJ1cHRGdW5jKCkKK30KKwordHlwZSBtb2NrVFRyYW5zcG9ydCBzdHJ1Y3QgeworCVRUcmFuc3BvcnQKK30KKworZnVuYyAobSAqbW9ja1RUcmFuc3BvcnQpIENsb3NlKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyBUZXN0TXVsdGlwbGVTdG9wKHQgKnRlc3RpbmcuVCkgeworCXByb2MgOj0gJm1vY2tQcm9jZXNzb3J7CisJCVByb2Nlc3NGdW5jOiBmdW5jKGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikgeworCQkJcmV0dXJuIGZhbHNlLCBuaWwKKwkJfSwKKwl9CisKKwl2YXIgaW50ZXJydXB0Q2FsbGVkIGJvb2wKKwljIDo9IG1ha2UoY2hhbiBzdHJ1Y3R7fSkKKwl0cmFucyA6PSAmbW9ja1NlcnZlclRyYW5zcG9ydHsKKwkJTGlzdGVuRnVuYzogZnVuYygpIGVycm9yIHsKKwkJCXJldHVybiBuaWwKKwkJfSwKKwkJQWNjZXB0RnVuYzogZnVuYygpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCQkJPC1jCisJCQlyZXR1cm4gbmlsLCBuaWwKKwkJfSwKKwkJQ2xvc2VGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJYyA8LSBzdHJ1Y3R7fXt9CisJCQlyZXR1cm4gbmlsCisJCX0sCisJCUludGVycnVwdEZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlpbnRlcnJ1cHRDYWxsZWQgPSB0cnVlCisJCQlyZXR1cm4gbmlsCisJCX0sCisJfQorCisJc2VydiA6PSBOZXdUU2ltcGxlU2VydmVyMihwcm9jLCB0cmFucykKKwlnbyBzZXJ2LlNlcnZlKCkKKwlzZXJ2LlN0b3AoKQorCWlmICFpbnRlcnJ1cHRDYWxsZWQgeworCQl0LkVycm9yKCJmaXJzdCBzZXJ2ZXIgdHJhbnNwb3J0IHNob3VsZCBoYXZlIGJlZW4gaW50ZXJydXB0ZWQiKQorCX0KKworCXNlcnYgPSBOZXdUU2ltcGxlU2VydmVyMihwcm9jLCB0cmFucykKKwlpbnRlcnJ1cHRDYWxsZWQgPSBmYWxzZQorCWdvIHNlcnYuU2VydmUoKQorCXNlcnYuU3RvcCgpCisJaWYgIWludGVycnVwdENhbGxlZCB7CisJCXQuRXJyb3IoInNlY29uZCBzZXJ2ZXIgdHJhbnNwb3J0IHNob3VsZCBoYXZlIGJlZW4gaW50ZXJydXB0ZWQiKQorCX0KK30KKworZnVuYyBUZXN0V2FpdFJhY2UodCAqdGVzdGluZy5UKSB7CisJcHJvYyA6PSAmbW9ja1Byb2Nlc3NvcnsKKwkJUHJvY2Vzc0Z1bmM6IGZ1bmMoaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKSB7CisJCQlyZXR1cm4gZmFsc2UsIG5pbAorCQl9LAorCX0KKworCXRyYW5zIDo9ICZtb2NrU2VydmVyVHJhbnNwb3J0eworCQlMaXN0ZW5GdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCQlBY2NlcHRGdW5jOiBmdW5jKCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJCQlyZXR1cm4gJm1vY2tUVHJhbnNwb3J0e30sIG5pbAorCQl9LAorCQlDbG9zZUZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlyZXR1cm4gbmlsCisJCX0sCisJCUludGVycnVwdEZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlyZXR1cm4gbmlsCisJCX0sCisJfQorCisJc2VydiA6PSBOZXdUU2ltcGxlU2VydmVyMihwcm9jLCB0cmFucykKKwlnbyBzZXJ2LlNlcnZlKCkKKwlydW50aW1lLkdvc2NoZWQoKQorCXNlcnYuU3RvcCgpCit9CisKK2Z1bmMgVGVzdE5vSGFuZ0R1cmluZ1N0b3BGcm9tRGFuZ2xpbmdMb2NrQWNxdWlyZUR1cmluZ0FjY2VwdExvb3AodCAqdGVzdGluZy5UKSB7CisJcHJvYyA6PSAmbW9ja1Byb2Nlc3NvcnsKKwkJUHJvY2Vzc0Z1bmM6IGZ1bmMoaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKSB7CisJCQlyZXR1cm4gZmFsc2UsIG5pbAorCQl9LAorCX0KKworCXRyYW5zIDo9ICZtb2NrU2VydmVyVHJhbnNwb3J0eworCQlMaXN0ZW5GdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCQlBY2NlcHRGdW5jOiBmdW5jKCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJCQlyZXR1cm4gbmlsLCBlcnJvcnMuTmV3KCJubyBzaXIiKQorCQl9LAorCQlDbG9zZUZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlyZXR1cm4gbmlsCisJCX0sCisJCUludGVycnVwdEZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlyZXR1cm4gbmlsCisJCX0sCisJfQorCisJc2VydiA6PSBOZXdUU2ltcGxlU2VydmVyMihwcm9jLCB0cmFucykKKwlnbyBzZXJ2LlNlcnZlKCkKKwlydW50aW1lLkdvc2NoZWQoKQorCXNlcnYuU3RvcCgpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NvY2tldC5nbyBiL2xpYi9nby90aHJpZnQvc29ja2V0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NTQyNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NvY2tldC5nbwpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJuZXQiCisJInRpbWUiCispCisKK3R5cGUgVFNvY2tldCBzdHJ1Y3QgeworCWNvbm4gICAgbmV0LkNvbm4KKwlhZGRyICAgIG5ldC5BZGRyCisJdGltZW91dCB0aW1lLkR1cmF0aW9uCit9CisKKy8vIE5ld1RTb2NrZXQgY3JlYXRlcyBhIG5ldC5Db25uLWJhY2tlZCBUVHJhbnNwb3J0LCBnaXZlbiBhIGhvc3QgYW5kIHBvcnQKKy8vCisvLyBFeGFtcGxlOgorLy8gCXRyYW5zLCBlcnIgOj0gdGhyaWZ0Lk5ld1RTb2NrZXQoImxvY2FsaG9zdDo5MDkwIikKK2Z1bmMgTmV3VFNvY2tldChob3N0UG9ydCBzdHJpbmcpICgqVFNvY2tldCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VFNvY2tldFRpbWVvdXQoaG9zdFBvcnQsIDApCit9CisKKy8vIE5ld1RTb2NrZXRUaW1lb3V0IGNyZWF0ZXMgYSBuZXQuQ29ubi1iYWNrZWQgVFRyYW5zcG9ydCwgZ2l2ZW4gYSBob3N0IGFuZCBwb3J0CisvLyBpdCBhbHNvIGFjY2VwdHMgYSB0aW1lb3V0IGFzIGEgdGltZS5EdXJhdGlvbgorZnVuYyBOZXdUU29ja2V0VGltZW91dChob3N0UG9ydCBzdHJpbmcsIHRpbWVvdXQgdGltZS5EdXJhdGlvbikgKCpUU29ja2V0LCBlcnJvcikgeworCS8vY29ubiwgZXJyIDo9IG5ldC5EaWFsVGltZW91dChuZXR3b3JrLCBhZGRyZXNzLCB0aW1lb3V0KQorCWFkZHIsIGVyciA6PSBuZXQuUmVzb2x2ZVRDUEFkZHIoInRjcCIsIGhvc3RQb3J0KQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJcmV0dXJuIE5ld1RTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciwgdGltZW91dCksIG5pbAorfQorCisvLyBDcmVhdGVzIGEgVFNvY2tldCBmcm9tIGEgbmV0LkFkZHIKK2Z1bmMgTmV3VFNvY2tldEZyb21BZGRyVGltZW91dChhZGRyIG5ldC5BZGRyLCB0aW1lb3V0IHRpbWUuRHVyYXRpb24pICpUU29ja2V0IHsKKwlyZXR1cm4gJlRTb2NrZXR7YWRkcjogYWRkciwgdGltZW91dDogdGltZW91dH0KK30KKworLy8gQ3JlYXRlcyBhIFRTb2NrZXQgZnJvbSBhbiBleGlzdGluZyBuZXQuQ29ubgorZnVuYyBOZXdUU29ja2V0RnJvbUNvbm5UaW1lb3V0KGNvbm4gbmV0LkNvbm4sIHRpbWVvdXQgdGltZS5EdXJhdGlvbikgKlRTb2NrZXQgeworCXJldHVybiAmVFNvY2tldHtjb25uOiBjb25uLCBhZGRyOiBjb25uLlJlbW90ZUFkZHIoKSwgdGltZW91dDogdGltZW91dH0KK30KKworLy8gU2V0cyB0aGUgc29ja2V0IHRpbWVvdXQKK2Z1bmMgKHAgKlRTb2NrZXQpIFNldFRpbWVvdXQodGltZW91dCB0aW1lLkR1cmF0aW9uKSBlcnJvciB7CisJcC50aW1lb3V0ID0gdGltZW91dAorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNvY2tldCkgcHVzaERlYWRsaW5lKHJlYWQsIHdyaXRlIGJvb2wpIHsKKwl2YXIgdCB0aW1lLlRpbWUKKwlpZiBwLnRpbWVvdXQgPiAwIHsKKwkJdCA9IHRpbWUuTm93KCkuQWRkKHRpbWUuRHVyYXRpb24ocC50aW1lb3V0KSkKKwl9CisJaWYgcmVhZCAmJiB3cml0ZSB7CisJCXAuY29ubi5TZXREZWFkbGluZSh0KQorCX0gZWxzZSBpZiByZWFkIHsKKwkJcC5jb25uLlNldFJlYWREZWFkbGluZSh0KQorCX0gZWxzZSBpZiB3cml0ZSB7CisJCXAuY29ubi5TZXRXcml0ZURlYWRsaW5lKHQpCisJfQorfQorCisvLyBDb25uZWN0cyB0aGUgc29ja2V0LCBjcmVhdGluZyBhIG5ldyBzb2NrZXQgb2JqZWN0IGlmIG5lY2Vzc2FyeS4KK2Z1bmMgKHAgKlRTb2NrZXQpIE9wZW4oKSBlcnJvciB7CisJaWYgcC5Jc09wZW4oKSB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKEFMUkVBRFlfT1BFTiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZC4iKQorCX0KKwlpZiBwLmFkZHIgPT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDYW5ub3Qgb3BlbiBuaWwgYWRkcmVzcy4iKQorCX0KKwlpZiBsZW4ocC5hZGRyLk5ldHdvcmsoKSkgPT0gMCB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gYmFkIG5ldHdvcmsgbmFtZS4iKQorCX0KKwlpZiBsZW4ocC5hZGRyLlN0cmluZygpKSA9PSAwIHsKKwkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDYW5ub3Qgb3BlbiBiYWQgYWRkcmVzcy4iKQorCX0KKwl2YXIgZXJyIGVycm9yCisJaWYgcC5jb25uLCBlcnIgPSBuZXQuRGlhbFRpbWVvdXQocC5hZGRyLk5ldHdvcmsoKSwgcC5hZGRyLlN0cmluZygpLCBwLnRpbWVvdXQpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sIGVyci5FcnJvcigpKQorCX0KKwlyZXR1cm4gbmlsCit9CisKKy8vIFJldHJpZXZlIHRoZSB1bmRlcmx5aW5nIG5ldC5Db25uCitmdW5jIChwICpUU29ja2V0KSBDb25uKCkgbmV0LkNvbm4geworCXJldHVybiBwLmNvbm4KK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIGlzIG9wZW4KK2Z1bmMgKHAgKlRTb2NrZXQpIElzT3BlbigpIGJvb2wgeworCWlmIHAuY29ubiA9PSBuaWwgeworCQlyZXR1cm4gZmFsc2UKKwl9CisJcmV0dXJuIHRydWUKK30KKworLy8gQ2xvc2VzIHRoZSBzb2NrZXQuCitmdW5jIChwICpUU29ja2V0KSBDbG9zZSgpIGVycm9yIHsKKwkvLyBDbG9zZSB0aGUgc29ja2V0CisJaWYgcC5jb25uICE9IG5pbCB7CisJCWVyciA6PSBwLmNvbm4uQ2xvc2UoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCQlwLmNvbm4gPSBuaWwKKwl9CisJcmV0dXJuIG5pbAorfQorCisvL1JldHVybnMgdGhlIHJlbW90ZSBhZGRyZXNzIG9mIHRoZSBzb2NrZXQuCitmdW5jIChwICpUU29ja2V0KSBBZGRyKCkgbmV0LkFkZHIgeworCXJldHVybiBwLmFkZHIKK30KKworZnVuYyAocCAqVFNvY2tldCkgUmVhZChidWYgW11ieXRlKSAoaW50LCBlcnJvcikgeworCWlmICFwLklzT3BlbigpIHsKKwkJcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDb25uZWN0aW9uIG5vdCBvcGVuIikKKwl9CisJcC5wdXNoRGVhZGxpbmUodHJ1ZSwgZmFsc2UpCisJbiwgZXJyIDo9IHAuY29ubi5SZWFkKGJ1ZikKKwlyZXR1cm4gbiwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCit9CisKK2Z1bmMgKHAgKlRTb2NrZXQpIFdyaXRlKGJ1ZiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJaWYgIXAuSXNPcGVuKCkgeworCQlyZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNvbm5lY3Rpb24gbm90IG9wZW4iKQorCX0KKwlwLnB1c2hEZWFkbGluZShmYWxzZSwgdHJ1ZSkKKwlyZXR1cm4gcC5jb25uLldyaXRlKGJ1ZikKK30KKworZnVuYyAocCAqVFNvY2tldCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNvY2tldCkgSW50ZXJydXB0KCkgZXJyb3IgeworCWlmICFwLklzT3BlbigpIHsKKwkJcmV0dXJuIG5pbAorCX0KKwlyZXR1cm4gcC5jb25uLkNsb3NlKCkKK30KKworZnVuYyAocCAqVFNvY2tldCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgeworCWNvbnN0IG1heFNpemUgPSBedWludDY0KDApCisJcmV0dXJuIG1heFNpemUgLy8gdGhlIHRocnV0aCBpcywgd2UganVzdCBkb24ndCBrbm93IHVubGVzcyBmcmFtZWQgaXMgdXNlZAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zc2xfc2VydmVyX3NvY2tldC5nbyBiL2xpYi9nby90aHJpZnQvc3NsX3NlcnZlcl9zb2NrZXQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA3YWZjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc3NsX3NlcnZlcl9zb2NrZXQuZ28KQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY3J5cHRvL3RscyIKKwkibmV0IgorCSJ0aW1lIgorKQorCit0eXBlIFRTU0xTZXJ2ZXJTb2NrZXQgc3RydWN0IHsKKwlsaXN0ZW5lciAgICAgIG5ldC5MaXN0ZW5lcgorCWFkZHIgICAgICAgICAgbmV0LkFkZHIKKwljbGllbnRUaW1lb3V0IHRpbWUuRHVyYXRpb24KKwlpbnRlcnJ1cHRlZCAgIGJvb2wKKwljZmcgICAgICAgICAgICp0bHMuQ29uZmlnCit9CisKK2Z1bmMgTmV3VFNTTFNlcnZlclNvY2tldChsaXN0ZW5BZGRyIHN0cmluZywgY2ZnICp0bHMuQ29uZmlnKSAoKlRTU0xTZXJ2ZXJTb2NrZXQsIGVycm9yKSB7CisJcmV0dXJuIE5ld1RTU0xTZXJ2ZXJTb2NrZXRUaW1lb3V0KGxpc3RlbkFkZHIsIGNmZywgMCkKK30KKworZnVuYyBOZXdUU1NMU2VydmVyU29ja2V0VGltZW91dChsaXN0ZW5BZGRyIHN0cmluZywgY2ZnICp0bHMuQ29uZmlnLCBjbGllbnRUaW1lb3V0IHRpbWUuRHVyYXRpb24pICgqVFNTTFNlcnZlclNvY2tldCwgZXJyb3IpIHsKKwlpZiBjZmcuTWluVmVyc2lvbiA9PSAwIHsKKwkJY2ZnLk1pblZlcnNpb24gPSB0bHMuVmVyc2lvblRMUzEwCisJfQorCWFkZHIsIGVyciA6PSBuZXQuUmVzb2x2ZVRDUEFkZHIoInRjcCIsIGxpc3RlbkFkZHIpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKwlyZXR1cm4gJlRTU0xTZXJ2ZXJTb2NrZXR7YWRkcjogYWRkciwgY2xpZW50VGltZW91dDogY2xpZW50VGltZW91dCwgY2ZnOiBjZmd9LCBuaWwKK30KKworZnVuYyAocCAqVFNTTFNlcnZlclNvY2tldCkgTGlzdGVuKCkgZXJyb3IgeworCWlmIHAuSXNMaXN0ZW5pbmcoKSB7CisJCXJldHVybiBuaWwKKwl9CisJbCwgZXJyIDo9IHRscy5MaXN0ZW4ocC5hZGRyLk5ldHdvcmsoKSwgcC5hZGRyLlN0cmluZygpLCBwLmNmZykKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlwLmxpc3RlbmVyID0gbAorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNTTFNlcnZlclNvY2tldCkgQWNjZXB0KCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJaWYgcC5pbnRlcnJ1cHRlZCB7CisJCXJldHVybiBuaWwsIGVyclRyYW5zcG9ydEludGVycnVwdGVkCisJfQorCWlmIHAubGlzdGVuZXIgPT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldCIpCisJfQorCWNvbm4sIGVyciA6PSBwLmxpc3RlbmVyLkFjY2VwdCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorCX0KKwlyZXR1cm4gTmV3VFNTTFNvY2tldEZyb21Db25uVGltZW91dChjb25uLCBwLmNmZywgcC5jbGllbnRUaW1lb3V0KSwgbmlsCit9CisKKy8vIENoZWNrcyB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgbGlzdGVuaW5nLgorZnVuYyAocCAqVFNTTFNlcnZlclNvY2tldCkgSXNMaXN0ZW5pbmcoKSBib29sIHsKKwlyZXR1cm4gcC5saXN0ZW5lciAhPSBuaWwKK30KKworLy8gQ29ubmVjdHMgdGhlIHNvY2tldCwgY3JlYXRpbmcgYSBuZXcgc29ja2V0IG9iamVjdCBpZiBuZWNlc3NhcnkuCitmdW5jIChwICpUU1NMU2VydmVyU29ja2V0KSBPcGVuKCkgZXJyb3IgeworCWlmIHAuSXNMaXN0ZW5pbmcoKSB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKEFMUkVBRFlfT1BFTiwgIlNlcnZlciBzb2NrZXQgYWxyZWFkeSBvcGVuIikKKwl9CisJaWYgbCwgZXJyIDo9IHRscy5MaXN0ZW4ocC5hZGRyLk5ldHdvcmsoKSwgcC5hZGRyLlN0cmluZygpLCBwLmNmZyk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfSBlbHNlIHsKKwkJcC5saXN0ZW5lciA9IGwKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU1NMU2VydmVyU29ja2V0KSBBZGRyKCkgbmV0LkFkZHIgeworCXJldHVybiBwLmFkZHIKK30KKworZnVuYyAocCAqVFNTTFNlcnZlclNvY2tldCkgQ2xvc2UoKSBlcnJvciB7CisJZGVmZXIgZnVuYygpIHsKKwkJcC5saXN0ZW5lciA9IG5pbAorCX0oKQorCWlmIHAuSXNMaXN0ZW5pbmcoKSB7CisJCXJldHVybiBwLmxpc3RlbmVyLkNsb3NlKCkKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU1NMU2VydmVyU29ja2V0KSBJbnRlcnJ1cHQoKSBlcnJvciB7CisJcC5pbnRlcnJ1cHRlZCA9IHRydWUKKwlyZXR1cm4gbmlsCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NzbF9zb2NrZXQuZ28gYi9saWIvZ28vdGhyaWZ0L3NzbF9zb2NrZXQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE2MzM3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc3NsX3NvY2tldC5nbwpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJjcnlwdG8vdGxzIgorCSJuZXQiCisJInRpbWUiCispCisKK3R5cGUgVFNTTFNvY2tldCBzdHJ1Y3QgeworCWNvbm4gbmV0LkNvbm4KKwkvLyBob3N0UG9ydCBjb250YWlucyBob3N0OnBvcnQgKGUuZy4gImFzZGYuY29tOjEyMzQ1IikuIFRoZSBmaWVsZCBpcworCS8vIG9ubHkgdmFsaWQgaWYgYWRkciBpcyBuaWwuCisJaG9zdFBvcnQgc3RyaW5nCisJLy8gYWRkciBpcyBuaWwgd2hlbiBob3N0UG9ydCBpcyBub3QgIiIsIGFuZCBpcyBvbmx5IHVzZWQgd2hlbiB0aGUKKwkvLyBUU1NMU29ja2V0IGlzIGNvbnN0cnVjdGVkIGZyb20gYSBuZXQuQWRkci4KKwlhZGRyICAgIG5ldC5BZGRyCisJdGltZW91dCB0aW1lLkR1cmF0aW9uCisJY2ZnICAgICAqdGxzLkNvbmZpZworfQorCisvLyBOZXdUU1NMU29ja2V0IGNyZWF0ZXMgYSBuZXQuQ29ubi1iYWNrZWQgVFRyYW5zcG9ydCwgZ2l2ZW4gYSBob3N0IGFuZCBwb3J0IGFuZCB0bHMgQ29uZmlndXJhdGlvbgorLy8KKy8vIEV4YW1wbGU6CisvLyAJdHJhbnMsIGVyciA6PSB0aHJpZnQuTmV3VFNTTFNvY2tldCgibG9jYWxob3N0OjkwOTAiLCBuaWwpCitmdW5jIE5ld1RTU0xTb2NrZXQoaG9zdFBvcnQgc3RyaW5nLCBjZmcgKnRscy5Db25maWcpICgqVFNTTFNvY2tldCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VFNTTFNvY2tldFRpbWVvdXQoaG9zdFBvcnQsIGNmZywgMCkKK30KKworLy8gTmV3VFNTTFNvY2tldFRpbWVvdXQgY3JlYXRlcyBhIG5ldC5Db25uLWJhY2tlZCBUVHJhbnNwb3J0LCBnaXZlbiBhIGhvc3QgYW5kIHBvcnQKKy8vIGl0IGFsc28gYWNjZXB0cyBhIHRscyBDb25maWd1cmF0aW9uIGFuZCBhIHRpbWVvdXQgYXMgYSB0aW1lLkR1cmF0aW9uCitmdW5jIE5ld1RTU0xTb2NrZXRUaW1lb3V0KGhvc3RQb3J0IHN0cmluZywgY2ZnICp0bHMuQ29uZmlnLCB0aW1lb3V0IHRpbWUuRHVyYXRpb24pICgqVFNTTFNvY2tldCwgZXJyb3IpIHsKKwlpZiBjZmcuTWluVmVyc2lvbiA9PSAwIHsKKwkJY2ZnLk1pblZlcnNpb24gPSB0bHMuVmVyc2lvblRMUzEwCisJfQorCXJldHVybiAmVFNTTFNvY2tldHtob3N0UG9ydDogaG9zdFBvcnQsIHRpbWVvdXQ6IHRpbWVvdXQsIGNmZzogY2ZnfSwgbmlsCit9CisKKy8vIENyZWF0ZXMgYSBUU1NMU29ja2V0IGZyb20gYSBuZXQuQWRkcgorZnVuYyBOZXdUU1NMU29ja2V0RnJvbUFkZHJUaW1lb3V0KGFkZHIgbmV0LkFkZHIsIGNmZyAqdGxzLkNvbmZpZywgdGltZW91dCB0aW1lLkR1cmF0aW9uKSAqVFNTTFNvY2tldCB7CisJcmV0dXJuICZUU1NMU29ja2V0e2FkZHI6IGFkZHIsIHRpbWVvdXQ6IHRpbWVvdXQsIGNmZzogY2ZnfQorfQorCisvLyBDcmVhdGVzIGEgVFNTTFNvY2tldCBmcm9tIGFuIGV4aXN0aW5nIG5ldC5Db25uCitmdW5jIE5ld1RTU0xTb2NrZXRGcm9tQ29ublRpbWVvdXQoY29ubiBuZXQuQ29ubiwgY2ZnICp0bHMuQ29uZmlnLCB0aW1lb3V0IHRpbWUuRHVyYXRpb24pICpUU1NMU29ja2V0IHsKKwlyZXR1cm4gJlRTU0xTb2NrZXR7Y29ubjogY29ubiwgYWRkcjogY29ubi5SZW1vdGVBZGRyKCksIHRpbWVvdXQ6IHRpbWVvdXQsIGNmZzogY2ZnfQorfQorCisvLyBTZXRzIHRoZSBzb2NrZXQgdGltZW91dAorZnVuYyAocCAqVFNTTFNvY2tldCkgU2V0VGltZW91dCh0aW1lb3V0IHRpbWUuRHVyYXRpb24pIGVycm9yIHsKKwlwLnRpbWVvdXQgPSB0aW1lb3V0CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU1NMU29ja2V0KSBwdXNoRGVhZGxpbmUocmVhZCwgd3JpdGUgYm9vbCkgeworCXZhciB0IHRpbWUuVGltZQorCWlmIHAudGltZW91dCA+IDAgeworCQl0ID0gdGltZS5Ob3coKS5BZGQodGltZS5EdXJhdGlvbihwLnRpbWVvdXQpKQorCX0KKwlpZiByZWFkICYmIHdyaXRlIHsKKwkJcC5jb25uLlNldERlYWRsaW5lKHQpCisJfSBlbHNlIGlmIHJlYWQgeworCQlwLmNvbm4uU2V0UmVhZERlYWRsaW5lKHQpCisJfSBlbHNlIGlmIHdyaXRlIHsKKwkJcC5jb25uLlNldFdyaXRlRGVhZGxpbmUodCkKKwl9Cit9CisKKy8vIENvbm5lY3RzIHRoZSBzb2NrZXQsIGNyZWF0aW5nIGEgbmV3IHNvY2tldCBvYmplY3QgaWYgbmVjZXNzYXJ5LgorZnVuYyAocCAqVFNTTFNvY2tldCkgT3BlbigpIGVycm9yIHsKKwl2YXIgZXJyIGVycm9yCisJLy8gSWYgd2UgaGF2ZSBhIGhvc3RuYW1lLCB3ZSBuZWVkIHRvIHBhc3MgdGhlIGhvc3RuYW1lIHRvIHRscy5EaWFsIGZvcgorCS8vIGNlcnRpZmljYXRlIGhvc3RuYW1lIGNoZWNrcy4KKwlpZiBwLmhvc3RQb3J0ICE9ICIiIHsKKwkJaWYgcC5jb25uLCBlcnIgPSB0bHMuRGlhbFdpdGhEaWFsZXIoJm5ldC5EaWFsZXJ7CisJCQlUaW1lb3V0OiBwLnRpbWVvdXR9LCAidGNwIiwgcC5ob3N0UG9ydCwgcC5jZmcpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCBlcnIuRXJyb3IoKSkKKwkJfQorCX0gZWxzZSB7CisJCWlmIHAuSXNPcGVuKCkgeworCQkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oQUxSRUFEWV9PUEVOLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkLiIpCisJCX0KKwkJaWYgcC5hZGRyID09IG5pbCB7CisJCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNhbm5vdCBvcGVuIG5pbCBhZGRyZXNzLiIpCisJCX0KKwkJaWYgbGVuKHAuYWRkci5OZXR3b3JrKCkpID09IDAgeworCQkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDYW5ub3Qgb3BlbiBiYWQgbmV0d29yayBuYW1lLiIpCisJCX0KKwkJaWYgbGVuKHAuYWRkci5TdHJpbmcoKSkgPT0gMCB7CisJCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNhbm5vdCBvcGVuIGJhZCBhZGRyZXNzLiIpCisJCX0KKwkJaWYgcC5jb25uLCBlcnIgPSB0bHMuRGlhbFdpdGhEaWFsZXIoJm5ldC5EaWFsZXJ7CisJCQlUaW1lb3V0OiBwLnRpbWVvdXR9LCBwLmFkZHIuTmV0d29yaygpLCBwLmFkZHIuU3RyaW5nKCksIHAuY2ZnKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgZXJyLkVycm9yKCkpCisJCX0KKwl9CisJcmV0dXJuIG5pbAorfQorCisvLyBSZXRyaWV2ZSB0aGUgdW5kZXJseWluZyBuZXQuQ29ubgorZnVuYyAocCAqVFNTTFNvY2tldCkgQ29ubigpIG5ldC5Db25uIHsKKwlyZXR1cm4gcC5jb25uCit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBvcGVuCitmdW5jIChwICpUU1NMU29ja2V0KSBJc09wZW4oKSBib29sIHsKKwlpZiBwLmNvbm4gPT0gbmlsIHsKKwkJcmV0dXJuIGZhbHNlCisJfQorCXJldHVybiB0cnVlCit9CisKKy8vIENsb3NlcyB0aGUgc29ja2V0LgorZnVuYyAocCAqVFNTTFNvY2tldCkgQ2xvc2UoKSBlcnJvciB7CisJLy8gQ2xvc2UgdGhlIHNvY2tldAorCWlmIHAuY29ubiAhPSBuaWwgeworCQllcnIgOj0gcC5jb25uLkNsb3NlKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwkJcC5jb25uID0gbmlsCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNTTFNvY2tldCkgUmVhZChidWYgW11ieXRlKSAoaW50LCBlcnJvcikgeworCWlmICFwLklzT3BlbigpIHsKKwkJcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDb25uZWN0aW9uIG5vdCBvcGVuIikKKwl9CisJcC5wdXNoRGVhZGxpbmUodHJ1ZSwgZmFsc2UpCisJbiwgZXJyIDo9IHAuY29ubi5SZWFkKGJ1ZikKKwlyZXR1cm4gbiwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCit9CisKK2Z1bmMgKHAgKlRTU0xTb2NrZXQpIFdyaXRlKGJ1ZiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJaWYgIXAuSXNPcGVuKCkgeworCQlyZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNvbm5lY3Rpb24gbm90IG9wZW4iKQorCX0KKwlwLnB1c2hEZWFkbGluZShmYWxzZSwgdHJ1ZSkKKwlyZXR1cm4gcC5jb25uLldyaXRlKGJ1ZikKK30KKworZnVuYyAocCAqVFNTTFNvY2tldCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNTTFNvY2tldCkgSW50ZXJydXB0KCkgZXJyb3IgeworCWlmICFwLklzT3BlbigpIHsKKwkJcmV0dXJuIG5pbAorCX0KKwlyZXR1cm4gcC5jb25uLkNsb3NlKCkKK30KKworZnVuYyAocCAqVFNTTFNvY2tldCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgeworCWNvbnN0IG1heFNpemUgPSBedWludDY0KDApCisJcmV0dXJuIG1heFNpemUgLy8gdGhlIHRocnV0aCBpcywgd2UganVzdCBkb24ndCBrbm93IHVubGVzcyBmcmFtZWQgaXMgdXNlZAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90YXBwbGljYXRpb25fZXhjZXB0aW9uLmdvIGIvbGliL2dvL3RocmlmdC90YXBwbGljYXRpb25fZXhjZXB0aW9uLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzhiZjJlLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdGFwcGxpY2F0aW9uX2V4Y2VwdGlvbi5nbworKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLWltcG9ydCAoCi0gICJvcyIKLSkKLQotY29uc3QgKAotICBVTktOT1dOX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiAgPSAwCi0gIFVOS05PV05fTUVUSE9EICAgICAgICAgICAgICAgICA9IDEKLSAgSU5WQUxJRF9NRVNTQUdFX1RZUEVfRVhDRVBUSU9OID0gMgotICBXUk9OR19NRVRIT0RfTkFNRSAgICAgICAgICAgICAgPSAzCi0gIEJBRF9TRVFVRU5DRV9JRCAgICAgICAgICAgICAgICA9IDQKLSAgTUlTU0lOR19SRVNVTFQgICAgICAgICAgICAgICAgID0gNQotICBJTlRFUk5BTF9FUlJPUiAgICAgICAgICAgICAgICAgPSA2Ci0gIFBST1RPQ09MX0VSUk9SICAgICAgICAgICAgICAgICA9IDcKLSkKLQotCi0vKioKLSAqIEFwcGxpY2F0aW9uIGxldmVsIGV4Y2VwdGlvbgotICoKLSAqLwotdHlwZSBUQXBwbGljYXRpb25FeGNlcHRpb24gaW50ZXJmYWNlIHsKLSAgVEV4Y2VwdGlvbgotICBUeXBlSWQoKSBpbnQzMgotICBSZWFkKGlwcm90IFRQcm90b2NvbCkgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgb3MuRXJyb3IpCi0gIFdyaXRlKG9wcm90IFRQcm90b2NvbCkgb3MuRXJyb3IKLX0KLQotdHlwZSB0QXBwbGljYXRpb25FeGNlcHRpb24gc3RydWN0IHsKLSAgVEV4Y2VwdGlvbgotICB0eXBlXyBpbnQzMgotfQotCi1mdW5jIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbkRlZmF1bHQoKSBUQXBwbGljYXRpb25FeGNlcHRpb24gewotICByZXR1cm4gTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKFVOS05PV05fQVBQTElDQVRJT05fRVhDRVBUSU9OLCAiVU5LTk9XTiIpCi19Ci0KLWZ1bmMgTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSh0eXBlXyBpbnQzMikgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgcmV0dXJuIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0eXBlXywgIlVOS05PV04iKQotfQotCi1mdW5jIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0eXBlXyBpbnQzMiwgbWVzc2FnZSBzdHJpbmcpIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0gIHJldHVybiAmdEFwcGxpY2F0aW9uRXhjZXB0aW9ue1RFeGNlcHRpb246IE5ld1RFeGNlcHRpb24obWVzc2FnZSksIHR5cGVfOiB0eXBlX30KLX0KLQotZnVuYyBOZXdUQXBwbGljYXRpb25FeGNlcHRpb25NZXNzYWdlKG1lc3NhZ2Ugc3RyaW5nKSBUQXBwbGljYXRpb25FeGNlcHRpb24gewotICByZXR1cm4gTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKFVOS05PV05fQVBQTElDQVRJT05fRVhDRVBUSU9OLCBtZXNzYWdlKQotfQotCi1mdW5jIChwICp0QXBwbGljYXRpb25FeGNlcHRpb24pIFR5cGVJZCgpIGludDMyIHsKLSAgcmV0dXJuIHAudHlwZV8KLX0KLQotZnVuYyAocCAqdEFwcGxpY2F0aW9uRXhjZXB0aW9uKSBSZWFkKGlwcm90IFRQcm90b2NvbCkgKGVycm9yIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgZXJyIG9zLkVycm9yKSB7Ci0gIF8sIGVyciA9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybgotICB9Ci0KLSAgbWVzc2FnZSA6PSAiIgotICB0eXBlXyA6PSBpbnQzMihVTktOT1dOX0FQUExJQ0FUSU9OX0VYQ0VQVElPTikKLQotICBmb3IgewotICAgIF8sIHR0eXBlLCBpZCwgZXJyIDo9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybgotICAgIH0KLSAgICBpZiB0dHlwZSA9PSBTVE9QIHsKLSAgICAgIGJyZWFrCi0gICAgfQotICAgIHN3aXRjaCBpZCB7Ci0gICAgY2FzZSAxOgotICAgICAgaWYgdHR5cGUgPT0gU1RSSU5HIHsKLSAgICAgICAgbWVzc2FnZSwgZXJyID0gaXByb3QuUmVhZFN0cmluZygpCi0gICAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICAgIHJldHVybgotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBTa2lwRGVmYXVsdERlcHRoKGlwcm90LCB0dHlwZSkKLSAgICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrCi0gICAgY2FzZSAyOgotICAgICAgaWYgdHR5cGUgPT0gSTMyIHsKLSAgICAgICAgdHlwZV8sIGVyciA9IGlwcm90LlJlYWRJMzIoKQotICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4KLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gU2tpcERlZmF1bHREZXB0aChpcHJvdCwgdHR5cGUpCi0gICAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICAgIHJldHVybgotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhawotICAgIGRlZmF1bHQ6Ci0gICAgICBlcnIgPSBTa2lwRGVmYXVsdERlcHRoKGlwcm90LCB0dHlwZSkKLSAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICByZXR1cm4KLSAgICAgIH0KLSAgICAgIGJyZWFrCi0gICAgfQotICAgIGVyciA9IGlwcm90LlJlYWRGaWVsZEVuZCgpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4KLSAgICB9Ci0gIH0KLSAgZXJyID0gaXByb3QuUmVhZFN0cnVjdEVuZCgpCi0gIGVycm9yID0gTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHR5cGVfLCBtZXNzYWdlKQotICByZXR1cm4KLX0KLQotZnVuYyAocCAqdEFwcGxpY2F0aW9uRXhjZXB0aW9uKSBXcml0ZShvcHJvdCBUUHJvdG9jb2wpIChlcnIgb3MuRXJyb3IpIHsKLSAgZXJyID0gb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbigiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKLSAgaWYgbGVuKHAuU3RyaW5nKCkpID4gMCB7Ci0gICAgZXJyID0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJtZXNzYWdlIiwgU1RSSU5HLCAxKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuCi0gICAgfQotICAgIGVyciA9IG9wcm90LldyaXRlU3RyaW5nKHAuU3RyaW5nKCkpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4KLSAgICB9Ci0gICAgZXJyID0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4KLSAgICB9Ci0gIH0KLSAgZXJyID0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJ0eXBlIiwgSTMyLCAyKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4KLSAgfQotICBlcnIgPSBvcHJvdC5Xcml0ZUkzMihwLnR5cGVfKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4KLSAgfQotICBlcnIgPSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuCi0gIH0KLSAgZXJyID0gb3Byb3QuV3JpdGVGaWVsZFN0b3AoKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4KLSAgfQotICBlcnIgPSBvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpCi0gIHJldHVybgotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90YXBwbGljYXRpb25fZXhjZXB0aW9uX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3RhcHBsaWNhdGlvbl9leGNlcHRpb25fdGVzdC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk1NzJmNC4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3RhcHBsaWNhdGlvbl9leGNlcHRpb25fdGVzdC5nbworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnRfdGVzdAotCi1pbXBvcnQgKAotICAuICJ0aHJpZnQiCi0gICJ0ZXN0aW5nIgotKQotCi1mdW5jIFRlc3RUQXBwbGljYXRpb25FeGNlcHRpb24odCAqdGVzdGluZy5UKSB7Ci0gIGV4YyA6PSBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24oVU5LTk9XTl9BUFBMSUNBVElPTl9FWENFUFRJT04sICIiKQotICBpZiBleGMuU3RyaW5nKCkgIT0gIiIgewotICAgIHQuRmF0YWxmKCJFeHBlY3RlZCBlbXB0eSBzdHJpbmcgZm9yIGV4Y2VwdGlvbiBidXQgZm91bmQgJyVzJyIsIGV4Yy5TdHJpbmcoKSkKLSAgfQotICBpZiBleGMuVHlwZUlkKCkgIT0gVU5LTk9XTl9BUFBMSUNBVElPTl9FWENFUFRJT04gewotICAgIHQuRmF0YWxmKCJFeHBlY3RlZCB0eXBlIFVOS05PV04gZm9yIGV4Y2VwdGlvbiBidXQgZm91bmQgJyVzJyIsIGV4Yy5UeXBlSWQoKSkKLSAgfQotICBleGMgPSBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24oV1JPTkdfTUVUSE9EX05BTUUsICJqdW5rX21ldGhvZCIpCi0gIGlmIGV4Yy5TdHJpbmcoKSAhPSAianVua19tZXRob2QiIHsKLSAgICB0LkZhdGFsZigiRXhwZWN0ZWQgJ2p1bmtfbWV0aG9kJyBmb3IgZXhjZXB0aW9uIGJ1dCBmb3VuZCAnJXMnIiwgZXhjLlN0cmluZygpKQotICB9Ci0gIGlmIGV4Yy5UeXBlSWQoKSAhPSBXUk9OR19NRVRIT0RfTkFNRSB7Ci0gICAgdC5GYXRhbGYoIkV4cGVjdGVkIHR5cGUgV1JPTkdfTUVUSE9EX05BTUUgZm9yIGV4Y2VwdGlvbiBidXQgZm91bmQgJyVzJyIsIGV4Yy5UeXBlSWQoKSkKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90YmFzZS5nbyBiL2xpYi9nby90aHJpZnQvdGJhc2UuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYzUyZDAuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90YmFzZS5nbworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnQKLQotLyoqCi0gKiBHZW5lcmljIGJhc2UgaW50ZXJmYWNlIGZvciBnZW5lcmF0ZWQgVGhyaWZ0IG9iamVjdHMuCi0gKgotICovCi10eXBlIFRCYXNlIGludGVyZmFjZSB7Ci0KLSAgLyoqCi0gICAqIFJlYWRzIHRoZSBUT2JqZWN0IGZyb20gdGhlIGdpdmVuIGlucHV0IHByb3RvY29sCi0gICAqCi0gICAqIEBwYXJhbSBpcHJvdCBJbnB1dCBwcm90b2NvbAotICAgKi8KLSAgUmVhZChpcHJvdCBUUHJvdG9jb2wpIChlcnIgVEV4Y2VwdGlvbikKLQotICAvKioKLSAgICogV3JpdGVzIHRoZSBvYmplY3RzIG91dCB0byB0aGUgcHJvdG9jb2wKLSAgICoKLSAgICogQHBhcmFtIG9wcm90IE91dHB1dCBwcm90b2NvbAotICAgKi8KLSAgV3JpdGUob3Byb3QgVFByb3RvY29sKSAoZXJyIFRFeGNlcHRpb24pCi0KLSAgLyoqCi0gICAqIENoZWNrIGlmIGEgZmllbGQgaXMgY3VycmVudGx5IHNldCBvciB1bnNldC4KLSAgICoKLSAgICogQHBhcmFtIGZpZWxkCi0gICAqLwotICBJc1NldChmaWVsZCBURmllbGQpIGJvb2wKLQotICAvKioKLSAgICogR2V0IGEgZmllbGQncyB2YWx1ZSBieSBmaWVsZCB2YXJpYWJsZS4gUHJpbWl0aXZlIHR5cGVzIHdpbGwgYmUgd3JhcHBlZCBpbiAKLSAgICogdGhlIGFwcHJvcHJpYXRlICJib3hlZCIgdHlwZXMuCi0gICAqCi0gICAqIEBwYXJhbSBmaWVsZAotICAgKi8KLSAgRmllbGRWYWx1ZShmaWVsZCBURmllbGQpIGludGVyZmFjZXt9Ci0KLSAgLyoqCi0gICAqIFNldCBhIGZpZWxkJ3MgdmFsdWUgYnkgZmllbGQgdmFyaWFibGUuIFByaW1pdGl2ZSB0eXBlcyBtdXN0IGJlICJib3hlZCIgaW4KLSAgICogdGhlIGFwcHJvcHJpYXRlIG9iamVjdCB3cmFwcGVyIHR5cGUuCi0gICAqCi0gICAqIEBwYXJhbSBmaWVsZAotICAgKi8KLSAgU2V0RmllbGRWYWx1ZShmaWVsZCBURmllbGQsIHZhbHVlIGludGVyZmFjZXt9KQotCi0gIERlZXBDb3B5KCkgVEJhc2UKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdGJpbmFyeV9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvdGJpbmFyeV9wcm90b2NvbC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM4OGRhNi4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3RiaW5hcnlfcHJvdG9jb2wuZ28KKysrIC9kZXYvbnVsbApAQCAtMSw0OTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi1pbXBvcnQgKAotICAiZW5jb2RpbmcvYmluYXJ5IgotICAibWF0aCIKLSAgInN0cmluZ3MiCi0gICJpbyIKLSkKLQotdHlwZSBUQmluYXJ5UHJvdG9jb2wgc3RydWN0IHsKLSAgLy9UUHJvdG9jb2xCYXNlOwotICB0cmFucyAgICAgICAgICAgIFRUcmFuc3BvcnQKLSAgX1N0cmljdFJlYWQgICAgICBib29sCi0gIF9TdHJpY3RXcml0ZSAgICAgYm9vbAotICBfUmVhZExlbmd0aCAgICAgIGludAotICBfQ2hlY2tSZWFkTGVuZ3RoIGJvb2wKLX0KLQotdHlwZSBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IHN0cnVjdCB7Ci0gIF9TdHJpY3RSZWFkICBib29sCi0gIF9TdHJpY3RXcml0ZSBib29sCi19Ci0KLWZ1bmMgTmV3VEJpbmFyeVByb3RvY29sVHJhbnNwb3J0KHQgVFRyYW5zcG9ydCkgKlRCaW5hcnlQcm90b2NvbCB7Ci0gIHJldHVybiBOZXdUQmluYXJ5UHJvdG9jb2wodCwgZmFsc2UsIHRydWUpCi19Ci0KLWZ1bmMgTmV3VEJpbmFyeVByb3RvY29sKHQgVFRyYW5zcG9ydCwgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUgYm9vbCkgKlRCaW5hcnlQcm90b2NvbCB7Ci0gIC8vcmV0dXJuICZUQmluYXJ5UHJvdG9jb2x7VFByb3RvY29sQmFzZTpUUHJvdG9jb2xCYXNle3RyYW5zOnR9LCBfU3RyaWN0UmVhZDpzdHJpY3RSZWFkLCBfU3RyaWN0V3JpdGU6c3RyaWN0V3JpdGUsIF9SZWFkTGVuZ3RoOjAsIF9DaGVja1JlYWRMZW5ndGg6ZmFsc2V9OwotICByZXR1cm4gJlRCaW5hcnlQcm90b2NvbHt0cmFuczogdCwgX1N0cmljdFJlYWQ6IHN0cmljdFJlYWQsIF9TdHJpY3RXcml0ZTogc3RyaWN0V3JpdGUsIF9SZWFkTGVuZ3RoOiAwLCBfQ2hlY2tSZWFkTGVuZ3RoOiBmYWxzZX0KLX0KLQotZnVuYyBOZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpICpUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IHsKLSAgcmV0dXJuIE5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnkoZmFsc2UsIHRydWUpCi19Ci0KLWZ1bmMgTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeShzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSBib29sKSAqVEJpbmFyeVByb3RvY29sRmFjdG9yeSB7Ci0gIHJldHVybiAmVEJpbmFyeVByb3RvY29sRmFjdG9yeXtfU3RyaWN0UmVhZDogc3RyaWN0UmVhZCwgX1N0cmljdFdyaXRlOiBzdHJpY3RXcml0ZX0KLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sRmFjdG9yeSkgR2V0UHJvdG9jb2wodCBUVHJhbnNwb3J0KSBUUHJvdG9jb2wgewotICByZXR1cm4gTmV3VEJpbmFyeVByb3RvY29sKHQsIHAuX1N0cmljdFJlYWQsIHAuX1N0cmljdFdyaXRlKQotfQotCi0vKioKLSAqIFdyaXRpbmcgTWV0aG9kcwotICovCi0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVNZXNzYWdlQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcUlkIGludDMyKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiBwLl9TdHJpY3RXcml0ZSB7Ci0gICAgdmVyc2lvbiA6PSB1aW50MzIoVkVSU0lPTl8xKSB8IHVpbnQzMih0eXBlSWQpCi0gICAgZSA6PSBwLldyaXRlSTMyKGludDMyKHZlcnNpb24pKQotICAgIGlmIGUgIT0gbmlsIHsKLSAgICAgIHJldHVybiBlCi0gICAgfQotICAgIGUgPSBwLldyaXRlU3RyaW5nKG5hbWUpCi0gICAgaWYgZSAhPSBuaWwgewotICAgICAgcmV0dXJuIGUKLSAgICB9Ci0gICAgZSA9IHAuV3JpdGVJMzIoc2VxSWQpCi0gICAgcmV0dXJuIGUKLSAgfSBlbHNlIHsKLSAgICBlIDo9IHAuV3JpdGVTdHJpbmcobmFtZSkKLSAgICBpZiBlICE9IG5pbCB7Ci0gICAgICByZXR1cm4gZQotICAgIH0KLSAgICBlID0gcC5Xcml0ZUJ5dGUoYnl0ZSh0eXBlSWQpKQotICAgIGlmIGUgIT0gbmlsIHsKLSAgICAgIHJldHVybiBlCi0gICAgfQotICAgIGUgPSBwLldyaXRlSTMyKHNlcUlkKQotICAgIHJldHVybiBlCi0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlTWVzc2FnZUVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZVN0cnVjdEJlZ2luKG5hbWUgc3RyaW5nKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVTdHJ1Y3RFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVGaWVsZEJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBlIDo9IHAuV3JpdGVCeXRlKGJ5dGUodHlwZUlkKSkKLSAgaWYgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgZSA9IHAuV3JpdGVJMTYoaWQpCi0gIHJldHVybiBlCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVGaWVsZEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUZpZWxkU3RvcCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGUgOj0gcC5Xcml0ZUJ5dGUoU1RPUCkKLSAgcmV0dXJuIGUKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZU1hcEJlZ2luKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGUgOj0gcC5Xcml0ZUJ5dGUoYnl0ZShrZXlUeXBlKSkKLSAgaWYgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgZSA9IHAuV3JpdGVCeXRlKGJ5dGUodmFsdWVUeXBlKSkKLSAgaWYgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgZSA9IHAuV3JpdGVJMzIoaW50MzIoc2l6ZSkpCi0gIHJldHVybiBlCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVNYXBFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBlIDo9IHAuV3JpdGVCeXRlKGJ5dGUoZWxlbVR5cGUpKQotICBpZiBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICBlID0gcC5Xcml0ZUkzMihpbnQzMihzaXplKSkKLSAgcmV0dXJuIGUKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUxpc3RFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVTZXRCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGUgOj0gcC5Xcml0ZUJ5dGUoYnl0ZShlbGVtVHlwZSkpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIGUgPSBwLldyaXRlSTMyKGludDMyKHNpemUpKQotICByZXR1cm4gZQotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlU2V0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlQm9vbCh2YWx1ZSBib29sKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiB2YWx1ZSB7Ci0gICAgcmV0dXJuIHAuV3JpdGVCeXRlKDEpCi0gIH0KLSAgcmV0dXJuIHAuV3JpdGVCeXRlKDApCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVCeXRlKHZhbHVlIGJ5dGUpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHYgOj0gW11ieXRle3ZhbHVlfQotICBfLCBlIDo9IHAudHJhbnMuV3JpdGUodikKLSAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVJMTYodmFsdWUgaW50MTYpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGggOj0gYnl0ZSgweGZmICYgKHZhbHVlID4+IDgpKQotICBsIDo9IGJ5dGUoMHhmZiAmIHZhbHVlKQotICB2IDo9IFtdYnl0ZXtoLCBsfQotICBfLCBlIDo9IHAudHJhbnMuV3JpdGUodikKLSAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVJMzIodmFsdWUgaW50MzIpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGEgOj0gYnl0ZSgweGZmICYgKHZhbHVlID4+IDI0KSkKLSAgYiA6PSBieXRlKDB4ZmYgJiAodmFsdWUgPj4gMTYpKQotICBjIDo9IGJ5dGUoMHhmZiAmICh2YWx1ZSA+PiA4KSkKLSAgZCA6PSBieXRlKDB4ZmYgJiB2YWx1ZSkKLSAgdiA6PSBbXWJ5dGV7YSwgYiwgYywgZH0KLSAgXywgZSA6PSBwLnRyYW5zLldyaXRlKHYpCi0gIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlSTY0KHZhbHVlIGludDY0KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBhIDo9IGJ5dGUoMHhmZiAmICh2YWx1ZSA+PiA1NikpCi0gIGIgOj0gYnl0ZSgweGZmICYgKHZhbHVlID4+IDQ4KSkKLSAgYyA6PSBieXRlKDB4ZmYgJiAodmFsdWUgPj4gNDApKQotICBkIDo9IGJ5dGUoMHhmZiAmICh2YWx1ZSA+PiAzMikpCi0gIGUgOj0gYnl0ZSgweGZmICYgKHZhbHVlID4+IDI0KSkKLSAgZiA6PSBieXRlKDB4ZmYgJiAodmFsdWUgPj4gMTYpKQotICBnIDo9IGJ5dGUoMHhmZiAmICh2YWx1ZSA+PiA4KSkKLSAgaCA6PSBieXRlKDB4ZmYgJiB2YWx1ZSkKLSAgdiA6PSBbXWJ5dGV7YSwgYiwgYywgZCwgZSwgZiwgZywgaH0KLSAgXywgZXJyIDo9IHAudHJhbnMuV3JpdGUodikKLSAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZURvdWJsZSh2YWx1ZSBmbG9hdDY0KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5Xcml0ZUk2NChpbnQ2NChtYXRoLkZsb2F0NjRiaXRzKHZhbHVlKSkpCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVTdHJpbmcodmFsdWUgc3RyaW5nKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5Xcml0ZUJpbmFyeUZyb21SZWFkZXIoc3RyaW5ncy5OZXdSZWFkZXIodmFsdWUpLCBsZW4odmFsdWUpKQotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlQmluYXJ5KHZhbHVlIFtdYnl0ZSkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgZSA6PSBwLldyaXRlSTMyKGludDMyKGxlbih2YWx1ZSkpKQotICBpZiBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICBfLCBlcnIgOj0gcC50cmFucy5Xcml0ZSh2YWx1ZSkKLSAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUJpbmFyeUZyb21SZWFkZXIocmVhZGVyIGlvLlJlYWRlciwgc2l6ZSBpbnQpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGUgOj0gcC5Xcml0ZUkzMihpbnQzMihzaXplKSkKLSAgaWYgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgXywgZXJyIDo9IGlvLkNvcHluKHAudHJhbnMsIHJlYWRlciwgaW50NjQoc2l6ZSkpCi0gIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi19Ci0KLQotLyoqCi0gKiBSZWFkaW5nIG1ldGhvZHMKLSAqLwotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRNZXNzYWdlQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcUlkIGludDMyLCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHNpemUsIGUgOj0gcC5SZWFkSTMyKCkKLSAgaWYgZSAhPSBuaWwgewotICAgIHJldHVybiAiIiwgdHlwZUlkLCAwLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICB9Ci0gIGlmIHNpemUgPCAwIHsKLSAgICB0eXBlSWQgPSBUTWVzc2FnZVR5cGUoc2l6ZSAmIDB4MGZmKQotICAgIHZlcnNpb24gOj0gaW50NjQoaW50NjQoc2l6ZSkgJiBWRVJTSU9OX01BU0spCi0gICAgaWYgdmVyc2lvbiAhPSBWRVJTSU9OXzEgewotICAgICAgcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihCQURfVkVSU0lPTiwgIkJhZCB2ZXJzaW9uIGluIFJlYWRNZXNzYWdlQmVnaW4iKQotICAgIH0KLSAgICBuYW1lLCBlID0gcC5SZWFkU3RyaW5nKCkKLSAgICBpZiBlICE9IG5pbCB7Ci0gICAgICByZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgICB9Ci0gICAgc2VxSWQsIGUgPSBwLlJlYWRJMzIoKQotICAgIGlmIGUgIT0gbmlsIHsKLSAgICAgIHJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICAgIH0KLSAgICByZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgbmlsCi0gIH0KLSAgaWYgcC5fU3RyaWN0UmVhZCB7Ci0gICAgcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihCQURfVkVSU0lPTiwgIk1pc3NpbmcgdmVyc2lvbiBpbiBSZWFkTWVzc2FnZUJlZ2luIikKLSAgfQotICBuYW1lLCBlMiA6PSBwLnJlYWRTdHJpbmdCb2R5KGludChzaXplKSkKLSAgaWYgZTIgIT0gbmlsIHsKLSAgICByZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZTIKLSAgfQotICBiLCBlMyA6PSBwLlJlYWRCeXRlKCkKLSAgaWYgZTMgIT0gbmlsIHsKLSAgICByZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZTMKLSAgfQotICB0eXBlSWQgPSBUTWVzc2FnZVR5cGUoYikKLSAgc2VxSWQsIGU0IDo9IHAuUmVhZEkzMigpCi0gIGlmIGU0ICE9IG5pbCB7Ci0gICAgcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGU0Ci0gIH0KLSAgcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIG5pbAotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRNZXNzYWdlRW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRTdHJ1Y3RCZWdpbigpIChuYW1lIHN0cmluZywgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICByZXR1cm4KLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkU3RydWN0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRGaWVsZEJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIHNlcUlkIGludDE2LCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHQsIGVyciA6PSBwLlJlYWRCeXRlKCkKLSAgdHlwZUlkID0gVFR5cGUodCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgotICB9Ci0gIGlmIHQgIT0gU1RPUCB7Ci0gICAgc2VxSWQsIGVyciA9IHAuUmVhZEkxNigpCi0gIH0KLSAgcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRGaWVsZEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkTWFwQmVnaW4oKSAoa1R5cGUsIHZUeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBrLCBlIDo9IHAuUmVhZEJ5dGUoKQotICBpZiBlICE9IG5pbCB7Ci0gICAgZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgICByZXR1cm4KLSAgfQotICBrVHlwZSA9IFRUeXBlKGspCi0gIHYsIGUgOj0gcC5SZWFkQnl0ZSgpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICBlcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICAgIHJldHVybgotICB9Ci0gIHZUeXBlID0gVFR5cGUodikKLSAgc2l6ZTMyLCBlIDo9IHAuUmVhZEkzMigpCi0gIHNpemUgPSBpbnQoc2l6ZTMyKQotICBpZiBlICE9IG5pbCB7Ci0gICAgZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgICByZXR1cm4KLSAgfQotICByZXR1cm4ga1R5cGUsIHZUeXBlLCBzaXplLCBuaWwKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkTWFwRW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRMaXN0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGIsIGUgOj0gcC5SZWFkQnl0ZSgpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICBlcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICAgIHJldHVybgotICB9Ci0gIGVsZW1UeXBlID0gVFR5cGUoYikKLSAgc2l6ZTMyLCBlIDo9IHAuUmVhZEkzMigpCi0gIHNpemUgPSBpbnQoc2l6ZTMyKQotICBpZiBlICE9IG5pbCB7Ci0gICAgZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgICByZXR1cm4KLSAgfQotICByZXR1cm4gZWxlbVR5cGUsIHNpemUsIG5pbAotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRMaXN0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRTZXRCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgYiwgZSA6PSBwLlJlYWRCeXRlKCkKLSAgaWYgZSAhPSBuaWwgewotICAgIGVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gICAgcmV0dXJuCi0gIH0KLSAgZWxlbVR5cGUgPSBUVHlwZShiKQotICBzaXplMzIsIGUgOj0gcC5SZWFkSTMyKCkKLSAgc2l6ZSA9IGludChzaXplMzIpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICBlcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICAgIHJldHVybgotICB9Ci0gIHJldHVybiBlbGVtVHlwZSwgc2l6ZSwgbmlsCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZFNldEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkQm9vbCgpIChib29sLCBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgYiwgZSA6PSBwLlJlYWRCeXRlKCkKLSAgdiA6PSB0cnVlCi0gIGlmIGIgIT0gMSB7Ci0gICAgdiA9IGZhbHNlCi0gIH0KLSAgcmV0dXJuIHYsIGUKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkQnl0ZSgpICh2YWx1ZSBieXRlLCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGJ1ZiA6PSBbXWJ5dGV7MH0KLSAgZXJyID0gcC5yZWFkQWxsKGJ1ZikKLSAgcmV0dXJuIGJ1ZlswXSwgZXJyCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZEkxNigpICh2YWx1ZSBpbnQxNiwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBidWYgOj0gW11ieXRlezAsIDB9Ci0gIGVyciA9IHAucmVhZEFsbChidWYpCi0gIHZhbHVlID0gaW50MTYoYmluYXJ5LkJpZ0VuZGlhbi5VaW50MTYoYnVmKSkKLSAgcmV0dXJuIHZhbHVlLCBlcnIKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkSTMyKCkgKHZhbHVlIGludDMyLCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGJ1ZiA6PSBbXWJ5dGV7MCwgMCwgMCwgMH0KLSAgZXJyID0gcC5yZWFkQWxsKGJ1ZikKLSAgdmFsdWUgPSBpbnQzMihiaW5hcnkuQmlnRW5kaWFuLlVpbnQzMihidWYpKQotICByZXR1cm4gdmFsdWUsIGVycgotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRJNjQoKSAodmFsdWUgaW50NjQsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgYnVmIDo9IFtdYnl0ZXswLCAwLCAwLCAwLCAwLCAwLCAwLCAwfQotICBlcnIgPSBwLnJlYWRBbGwoYnVmKQotICB2YWx1ZSA9IGludDY0KGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGJ1ZikpCi0gIHJldHVybiB2YWx1ZSwgZXJyCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZERvdWJsZSgpICh2YWx1ZSBmbG9hdDY0LCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGJ1ZiA6PSBbXWJ5dGV7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KLSAgZXJyID0gcC5yZWFkQWxsKGJ1ZikKLSAgdmFsdWUgPSBtYXRoLkZsb2F0NjRmcm9tYml0cyhiaW5hcnkuQmlnRW5kaWFuLlVpbnQ2NChidWYpKQotICByZXR1cm4gdmFsdWUsIGVycgotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRTdHJpbmcoKSAodmFsdWUgc3RyaW5nLCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHNpemUsIGUgOj0gcC5SZWFkSTMyKCkKLSAgaWYgZSAhPSBuaWwgewotICAgIHJldHVybiAiIiwgZQotICB9Ci0gIHJldHVybiBwLnJlYWRTdHJpbmdCb2R5KGludChzaXplKSkKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkQmluYXJ5KCkgKFtdYnl0ZSwgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHNpemUsIGUgOj0gcC5SZWFkSTMyKCkKLSAgaWYgZSAhPSBuaWwgewotICAgIHJldHVybiBuaWwsIGUKLSAgfQotICBpc2l6ZSA6PSBpbnQoc2l6ZSkKLSAgZSA9IHAuY2hlY2tSZWFkTGVuZ3RoKGlzaXplKQotICBpZiBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIG5pbCwgZQotICB9Ci0gIGJ1ZiA6PSBtYWtlKFtdYnl0ZSwgaXNpemUpCi0gIF8sIGVyciA6PSBwLnRyYW5zLlJlYWRBbGwoYnVmKQotICByZXR1cm4gYnVmLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgRmx1c2goKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IocC50cmFucy5GbHVzaCgpKQotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFNraXAoZmllbGRUeXBlIFRUeXBlKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICByZXR1cm4gU2tpcERlZmF1bHREZXB0aChwLCBmaWVsZFR5cGUpCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgVHJhbnNwb3J0KCkgVFRyYW5zcG9ydCB7Ci0gIHJldHVybiBwLnRyYW5zCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgcmVhZEFsbChidWYgW11ieXRlKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBlIDo9IHAuY2hlY2tSZWFkTGVuZ3RoKGxlbihidWYpKQotICBpZiBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICBfLCBlcnIgOj0gcC50cmFucy5SZWFkQWxsKGJ1ZikKLSAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBzZXRSZWFkTGVuZ3RoKHJlYWRMZW5ndGggaW50KSB7Ci0gIHAuX1JlYWRMZW5ndGggPSByZWFkTGVuZ3RoCi0gIHAuX0NoZWNrUmVhZExlbmd0aCA9IHRydWUKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBjaGVja1JlYWRMZW5ndGgobGVuZ3RoIGludCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgaWYgcC5fQ2hlY2tSZWFkTGVuZ3RoIHsKLSAgICBwLl9SZWFkTGVuZ3RoID0gcC5fUmVhZExlbmd0aCAtIGxlbmd0aAotICAgIGlmIHAuX1JlYWRMZW5ndGggPCAwIHsKLSAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oVU5LTk9XTl9QUk9UT0NPTF9FWENFUFRJT04sICJNZXNzYWdlIGxlbmd0aCBleGNlZWRlZDogIitzdHJpbmcobGVuZ3RoKSkKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIHJlYWRTdHJpbmdCb2R5KHNpemUgaW50KSAodmFsdWUgc3RyaW5nLCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGlmIHNpemUgPCAwIHsKLSAgICByZXR1cm4gIiIsIG5pbAotICB9Ci0gIGVyciA9IHAuY2hlY2tSZWFkTGVuZ3RoKHNpemUpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiAiIiwgZXJyCi0gIH0KLSAgaXNpemUgOj0gaW50KHNpemUpCi0gIGJ1ZiA6PSBtYWtlKFtdYnl0ZSwgaXNpemUpCi0gIF8sIGUgOj0gcC50cmFucy5SZWFkQWxsKGJ1ZikKLSAgcmV0dXJuIHN0cmluZyhidWYpLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90YmluYXJ5X3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3RiaW5hcnlfcHJvdG9jb2xfdGVzdC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIxYjI0OC4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3RiaW5hcnlfcHJvdG9jb2xfdGVzdC5nbworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnRfdGVzdAotCi1pbXBvcnQgKAotICAuICJ0aHJpZnQiCi0gICJ0ZXN0aW5nIgotICAvLyJieXRlcyI7Ci0pCi0KLQotZnVuYyBUZXN0UmVhZFdyaXRlQmluYXJ5UHJvdG9jb2wodCAqdGVzdGluZy5UKSB7Ci0gIFJlYWRXcml0ZVByb3RvY29sVGVzdCh0LCBOZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpKQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90Y29tcGFjdF9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvdGNvbXBhY3RfcHJvdG9jb2wuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNzgwZjcuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90Y29tcGFjdF9wcm90b2NvbC5nbworKysgL2Rldi9udWxsCkBAIC0xLDg1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLWltcG9ydCAoCi0gICJjb250YWluZXIvdmVjdG9yIgotICAiZW5jb2RpbmcvYmluYXJ5IgotICAiZm10IgotICAibWF0aCIKLSAgIm9zIgotICAic3RyaW5ncyIKLSkKLQotY29uc3QgKAotICBDT01QQUNUX1BST1RPQ09MX0lEICAgICAgID0gMHgwODIKLSAgQ09NUEFDVF9WRVJTSU9OICAgICAgICAgICA9IDEKLSAgQ09NUEFDVF9WRVJTSU9OX01BU0sgICAgICA9IDB4MWYKLSAgQ09NUEFDVF9UWVBFX01BU0sgICAgICAgICA9IDB4MEUwCi0gIENPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQgPSA1Ci0pCi0KLXR5cGUgVENvbXBhY3RUeXBlIGJ5dGUKLQotY29uc3QgKAotICBDT01QQUNUX0JPT0xFQU5fVFJVRSAgPSAweDAxCi0gIENPTVBBQ1RfQk9PTEVBTl9GQUxTRSA9IDB4MDIKLSAgQ09NUEFDVF9CWVRFICAgICAgICAgID0gMHgwMwotICBDT01QQUNUX0kxNiAgICAgICAgICAgPSAweDA0Ci0gIENPTVBBQ1RfSTMyICAgICAgICAgICA9IDB4MDUKLSAgQ09NUEFDVF9JNjQgICAgICAgICAgID0gMHgwNgotICBDT01QQUNUX0RPVUJMRSAgICAgICAgPSAweDA3Ci0gIENPTVBBQ1RfQklOQVJZICAgICAgICA9IDB4MDgKLSAgQ09NUEFDVF9MSVNUICAgICAgICAgID0gMHgwOQotICBDT01QQUNUX1NFVCAgICAgICAgICAgPSAweDBBCi0gIENPTVBBQ1RfTUFQICAgICAgICAgICA9IDB4MEIKLSAgQ09NUEFDVF9TVFJVQ1QgICAgICAgID0gMHgwQwotKQotCi12YXIgKAotICBfVFR5cGVUb0NvbXBhY3RUeXBlIFtdVENvbXBhY3RUeXBlCi0gIF9UU1RPUCAgICAgICAgICAgICAgVEZpZWxkCi0pCi0KLWZ1bmMgaW5pdCgpIHsKLSAgX1RTVE9QID0gTmV3VEZpZWxkKCIiLCBTVE9QLCAwKQotICBfVFR5cGVUb0NvbXBhY3RUeXBlID0gbWFrZShbXVRDb21wYWN0VHlwZSwgaW50KFVURjE2KSsxKQotICBfVFR5cGVUb0NvbXBhY3RUeXBlW2ludChTVE9QKV0gPSBTVE9QCi0gIF9UVHlwZVRvQ29tcGFjdFR5cGVbaW50KEJPT0wpXSA9IENPTVBBQ1RfQk9PTEVBTl9UUlVFCi0gIF9UVHlwZVRvQ29tcGFjdFR5cGVbaW50KEJZVEUpXSA9IENPTVBBQ1RfQllURQotICBfVFR5cGVUb0NvbXBhY3RUeXBlW2ludChJMTYpXSA9IENPTVBBQ1RfSTE2Ci0gIF9UVHlwZVRvQ29tcGFjdFR5cGVbaW50KEkzMildID0gQ09NUEFDVF9JMzIKLSAgX1RUeXBlVG9Db21wYWN0VHlwZVtpbnQoSTY0KV0gPSBDT01QQUNUX0k2NAotICBfVFR5cGVUb0NvbXBhY3RUeXBlW2ludChET1VCTEUpXSA9IENPTVBBQ1RfRE9VQkxFCi0gIF9UVHlwZVRvQ29tcGFjdFR5cGVbaW50KFNUUklORyldID0gQ09NUEFDVF9CSU5BUlkKLSAgX1RUeXBlVG9Db21wYWN0VHlwZVtpbnQoTElTVCldID0gQ09NUEFDVF9MSVNUCi0gIF9UVHlwZVRvQ29tcGFjdFR5cGVbaW50KFNFVCldID0gQ09NUEFDVF9TRVQKLSAgX1RUeXBlVG9Db21wYWN0VHlwZVtpbnQoTUFQKV0gPSBDT01QQUNUX01BUAotICBfVFR5cGVUb0NvbXBhY3RUeXBlW2ludChTVFJVQ1QpXSA9IENPTVBBQ1RfU1RSVUNUCi19Ci0KLXR5cGUgVENvbXBhY3RQcm90b2NvbEZhY3Rvcnkgc3RydWN0e30KLQotZnVuYyBOZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpICpUQ29tcGFjdFByb3RvY29sRmFjdG9yeSB7Ci0gIHJldHVybiAmVENvbXBhY3RQcm90b2NvbEZhY3Rvcnl7fQotfQotCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sRmFjdG9yeSkgR2V0UHJvdG9jb2wodHJhbnMgVFRyYW5zcG9ydCkgVFByb3RvY29sIHsKLSAgcmV0dXJuIE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCi19Ci0KLXR5cGUgVENvbXBhY3RQcm90b2NvbCBzdHJ1Y3QgewotICB0cmFucyBUVHJhbnNwb3J0Ci0KLSAgLyoqIAotICAgKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAotICAgKiBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgotICAgKi8KLSAgbGFzdEZpZWxkICAgKnZlY3Rvci5JbnRWZWN0b3IKLSAgbGFzdEZpZWxkSWQgaW50Ci0KLSAgLyoqIAotICAgKiBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZSBzbyBpdCBjYW4gCi0gICAqIGhhdmUgdGhlIHZhbHVlIGluY29ycG9yYXRlZC4KLSAgICovCi0gIGJvb2xlYW5GaWVsZCBURmllbGQKLQotICAvKioKLSAgICogSWYgd2UgcmVhZCBhIGZpZWxkIGhlYWRlciwgYW5kIGl0J3MgYSBib29sZWFuIGZpZWxkLCBzYXZlIHRoZSBib29sZWFuIAotICAgKiB2YWx1ZSBoZXJlIHNvIHRoYXQgcmVhZEJvb2wgY2FuIHVzZSBpdC4KLSAgICovCi0gIGJvb2xWYWx1ZSAgICAgICAgICBib29sCi0gIGJvb2xWYWx1ZUlzTm90TnVsbCBib29sCi19Ci0KLS8qKgotICogQ3JlYXRlIGEgVENvbXBhY3RQcm90b2NvbC4KLSAqCi0gKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSBUVHJhbnNwb3J0IG9iamVjdCB0byByZWFkIGZyb20gb3Igd3JpdGUgdG8uCi0gKi8KLWZ1bmMgTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucyBUVHJhbnNwb3J0KSAqVENvbXBhY3RQcm90b2NvbCB7Ci0gIHJldHVybiAmVENvbXBhY3RQcm90b2NvbHt0cmFuczogdHJhbnMsIGxhc3RGaWVsZDogJnZlY3Rvci5JbnRWZWN0b3J7fX0KLX0KLQotCi0vLwotLy8gUHVibGljIFdyaXRpbmcgbWV0aG9kcy4KLS8vCi0KLS8qKgotICogV3JpdGUgYSBtZXNzYWdlIGhlYWRlciB0byB0aGUgd2lyZS4gQ29tcGFjdCBQcm90b2NvbCBtZXNzYWdlcyBjb250YWluIHRoZQotICogcHJvdG9jb2wgdmVyc2lvbiBzbyB3ZSBjYW4gbWlncmF0ZSBmb3J3YXJkcyBpbiB0aGUgZnV0dXJlIGlmIG5lZWQgYmUuCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlTWVzc2FnZUJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFpZCBpbnQzMikgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgXywgZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KENPTVBBQ1RfUFJPVE9DT0xfSUQpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi0gIH0KLSAgXywgZXJyID0gcC53cml0ZUJ5dGVEaXJlY3QoKENPTVBBQ1RfVkVSU0lPTiAmIENPTVBBQ1RfVkVSU0lPTl9NQVNLKSB8ICgoYnl0ZSh0eXBlSWQpIDw8IENPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQpICYgQ09NUEFDVF9UWVBFX01BU0spKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotICB9Ci0gIF8sIGVyciA9IHAud3JpdGVWYXJpbnQzMihzZXFpZCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLSAgfQotICBlIDo9IHAuV3JpdGVTdHJpbmcobmFtZSkKLSAgcmV0dXJuIGUKLQotfQotCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZU1lc3NhZ2VFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24geyByZXR1cm4gbmlsIH0KLQotLyoqCi0gKiBXcml0ZSBhIHN0cnVjdCBiZWdpbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UgCi0gKiB1c2UgaXQgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQKLSAqIHN0YWNrIHNvIHdlIGNhbiBnZXQgdGhlIGZpZWxkIGlkIGRlbHRhcyBjb3JyZWN0LgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZVN0cnVjdEJlZ2luKG5hbWUgc3RyaW5nKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBwLmxhc3RGaWVsZC5QdXNoKHAubGFzdEZpZWxkSWQpCi0gIHAubGFzdEZpZWxkSWQgPSAwCi0gIHJldHVybiBuaWwKLX0KLQotLyoqCi0gKiBXcml0ZSBhIHN0cnVjdCBlbmQuIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZQotICogdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBwb3AgdGhlIGxhc3QgZmllbGQgZnJvbSB0aGUgY3VycmVudCBzdHJ1Y3Qgb2ZmCi0gKiBvZiB0aGUgZmllbGQgc3RhY2suCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlU3RydWN0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcC5sYXN0RmllbGRJZCA9IHAubGFzdEZpZWxkLlBvcCgpCi0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVGaWVsZEJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiB0eXBlSWQgPT0gQk9PTCB7Ci0gICAgLy8gd2Ugd2FudCB0byBwb3NzaWJseSBpbmNsdWRlIHRoZSB2YWx1ZSwgc28gd2UnbGwgd2FpdC4KLSAgICBwLmJvb2xlYW5GaWVsZCA9IE5ld1RGaWVsZChuYW1lLCB0eXBlSWQsIGludChpZCkpCi0gICAgcmV0dXJuIG5pbAotICB9Ci0gIF8sIGVyciA6PSBwLndyaXRlRmllbGRCZWdpbkludGVybmFsKG5hbWUsIHR5cGVJZCwgaWQsIDB4RkYpCi0gIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi19Ci0KLQotLyoqCi0gKiBUaGUgd29ya2hvcnNlIG9mIHdyaXRlRmllbGRCZWdpbi4gSXQgaGFzIHRoZSBvcHRpb24gb2YgZG9pbmcgYSAKLSAqICd0eXBlIG92ZXJyaWRlJyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlIAotICogYm9vbGVhbiBmaWVsZCBjYXNlLgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lIHN0cmluZywgdHlwZUlkIFRUeXBlLCBpZCBpbnQxNiwgdHlwZU92ZXJyaWRlIGJ5dGUpIChpbnQsIG9zLkVycm9yKSB7Ci0gIC8vIHNob3J0IGxhc3RGaWVsZCA9IGxhc3RGaWVsZF8ucG9wKCk7Ci0KLSAgLy8gaWYgdGhlcmUncyBhIHR5cGUgb3ZlcnJpZGUsIHVzZSB0aGF0LgotICB2YXIgdHlwZVRvV3JpdGUgYnl0ZQotICBpZiB0eXBlT3ZlcnJpZGUgPT0gMHhGRiB7Ci0gICAgdHlwZVRvV3JpdGUgPSBieXRlKHAuZ2V0Q29tcGFjdFR5cGUodHlwZUlkKSkKLSAgfSBlbHNlIHsKLSAgICB0eXBlVG9Xcml0ZSA9IHR5cGVPdmVycmlkZQotICB9Ci0gIC8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAotICBmaWVsZElkIDo9IGludChpZCkKLSAgd3JpdHRlbiA6PSAwCi0gIGlmIGZpZWxkSWQgPiBwLmxhc3RGaWVsZElkICYmIGZpZWxkSWQtcC5sYXN0RmllbGRJZCA8PSAxNSB7Ci0gICAgLy8gd3JpdGUgdGhlbSB0b2dldGhlcgotICAgIHdyaXR0ZW4sIGVyciA6PSBwLndyaXRlQnl0ZURpcmVjdChieXRlKChmaWVsZElkLXAubGFzdEZpZWxkSWQpPDw0KSB8IHR5cGVUb1dyaXRlKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIHdyaXR0ZW4sIGVycgotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyB3cml0ZSB0aGVtIHNlcGFyYXRlCi0gICAgbiwgZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KHR5cGVUb1dyaXRlKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIG4sIGVycgotICAgIH0KLSAgICBlcnIgPSBwLldyaXRlSTE2KGlkKQotICAgIHdyaXR0ZW4gPSBuICsgMgotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIHdyaXR0ZW4sIGVycgotICAgIH0KLSAgfQotCi0gIHAubGFzdEZpZWxkSWQgPSBmaWVsZElkCi0gIC8vIHAubGFzdEZpZWxkLlB1c2goZmllbGQuaWQpOwotICByZXR1cm4gd3JpdHRlbiwgbmlsCi19Ci0KLQotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVGaWVsZEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7IHJldHVybiBuaWwgfQotCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUZpZWxkU3RvcCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIF8sIGVyciA6PSBwLndyaXRlQnl0ZURpcmVjdChTVE9QKQotICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotfQotCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZU1hcEJlZ2luKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGlmIHNpemUgPT0gMCB7Ci0gICAgXywgZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KDApCi0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLSAgfQotICBfLCBlcnIgOj0gcC53cml0ZVZhcmludDMyKGludDMyKHNpemUpKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotICB9Ci0gIF8sIGVyciA9IHAud3JpdGVCeXRlRGlyZWN0KGJ5dGUocC5nZXRDb21wYWN0VHlwZShrZXlUeXBlKSk8PDQgfCBieXRlKHAuZ2V0Q29tcGFjdFR5cGUodmFsdWVUeXBlKSkpCi0gIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi19Ci0KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlTWFwRW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsgcmV0dXJuIG5pbCB9Ci0KLS8qKgotICogV3JpdGUgYSBsaXN0IGhlYWRlci4KLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBfLCBlcnIgOj0gcC53cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtVHlwZSwgc2l6ZSkKLSAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLX0KLQotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVMaXN0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsgcmV0dXJuIG5pbCB9Ci0KLS8qKgotICogV3JpdGUgYSBzZXQgaGVhZGVyLgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZVNldEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgXywgZXJyIDo9IHAud3JpdGVDb2xsZWN0aW9uQmVnaW4oZWxlbVR5cGUsIHNpemUpCi0gIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi19Ci0KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlU2V0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsgcmV0dXJuIG5pbCB9Ci0KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlQm9vbCh2YWx1ZSBib29sKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICB2IDo9IGJ5dGUoQ09NUEFDVF9CT09MRUFOX0ZBTFNFKQotICBpZiB2YWx1ZSB7Ci0gICAgdiA9IGJ5dGUoQ09NUEFDVF9CT09MRUFOX1RSVUUpCi0gIH0KLSAgaWYgcC5ib29sZWFuRmllbGQgIT0gbmlsIHsKLSAgICAvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKLSAgICBfLCBlcnIgOj0gcC53cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChwLmJvb2xlYW5GaWVsZC5OYW1lKCksIHAuYm9vbGVhbkZpZWxkLlR5cGVJZCgpLCBpbnQxNihwLmJvb2xlYW5GaWVsZC5JZCgpKSwgdikKLSAgICBwLmJvb2xlYW5GaWVsZCA9IG5pbAotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi0gIH0KLSAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCB3cml0ZSB0aGUgdmFsdWUuCi0gIF8sIGVyciA6PSBwLndyaXRlQnl0ZURpcmVjdCh2KQotICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotfQotCi0vKiogCi0gKiBXcml0ZSBhIGJ5dGUuIE5vdGhpbmcgdG8gc2VlIGhlcmUhCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlQnl0ZSh2YWx1ZSBieXRlKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBfLCBlcnIgOj0gcC53cml0ZUJ5dGVEaXJlY3QodmFsdWUpCi0gIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi19Ci0KLS8qKgotICogV3JpdGUgYW4gSTE2IGFzIGEgemlnemFnIHZhcmludC4KLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVJMTYodmFsdWUgaW50MTYpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIF8sIGVyciA6PSBwLndyaXRlVmFyaW50MzIocC5pbnQzMlRvWmlnemFnKGludDMyKHZhbHVlKSkpCi0gIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi19Ci0KLS8qKgotICogV3JpdGUgYW4gaTMyIGFzIGEgemlnemFnIHZhcmludC4KLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVJMzIodmFsdWUgaW50MzIpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIF8sIGVyciA6PSBwLndyaXRlVmFyaW50MzIocC5pbnQzMlRvWmlnemFnKHZhbHVlKSkKLSAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLX0KLQotLyoqCi0gKiBXcml0ZSBhbiBpNjQgYXMgYSB6aWd6YWcgdmFyaW50LgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUk2NCh2YWx1ZSBpbnQ2NCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgXywgZXJyIDo9IHAud3JpdGVWYXJpbnQ2NChwLmludDY0VG9aaWd6YWcodmFsdWUpKQotICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotfQotCi0vKioKLSAqIFdyaXRlIGEgZG91YmxlIHRvIHRoZSB3aXJlIGFzIDggYnl0ZXMuCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlRG91YmxlKHZhbHVlIGZsb2F0NjQpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGJ1ZiA6PSBtYWtlKFtdYnl0ZSwgOCkKLSAgYmluYXJ5LkxpdHRsZUVuZGlhbi5QdXRVaW50NjQoYnVmLCBtYXRoLkZsb2F0NjRiaXRzKHZhbHVlKSkKLSAgXywgZXJyIDo9IHAudHJhbnMuV3JpdGUoYnVmKQotICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotfQotCi0vKioKLSAqIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSB3aXJlIHdpdGggYSB2YXJpbnQgc2l6ZSBwcmVjZWVkaW5nLgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZVN0cmluZyh2YWx1ZSBzdHJpbmcpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGJ1ZiA6PSBtYWtlKFtdYnl0ZSwgbGVuKHZhbHVlKSkKLSAgc3RyaW5ncy5OZXdSZWFkZXIodmFsdWUpLlJlYWQoYnVmKQotICByZXR1cm4gcC5Xcml0ZUJpbmFyeShidWYpCi19Ci0KLS8qKgotICogV3JpdGUgYSBieXRlIGFycmF5LCB1c2luZyBhIHZhcmludCBmb3IgdGhlIHNpemUuIAotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUJpbmFyeShiaW4gW11ieXRlKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBfLCBlIDo9IHAud3JpdGVWYXJpbnQzMihpbnQzMihsZW4oYmluKSkpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgfQotICBpZiBsZW4oYmluKSA+IDAgewotICAgIF8sIGUgPSBwLnRyYW5zLldyaXRlKGJpbikKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLQotLy8gCi0vLyBSZWFkaW5nIG1ldGhvZHMuCi0vLyAKLQotLyoqCi0gKiBSZWFkIGEgbWVzc2FnZSBoZWFkZXIuIAotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkTWVzc2FnZUJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFJZCBpbnQzMiwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBwcm90b2NvbElkLCBlcnIgOj0gcC5SZWFkQnl0ZSgpCi0gIGlmIHByb3RvY29sSWQgIT0gQ09NUEFDVF9QUk9UT0NPTF9JRCB7Ci0gICAgcyA6PSBmbXQuU3ByaW50ZigiRXhwZWN0ZWQgcHJvdG9jb2wgaWQgJTAyeCBidXQgZ290ICUwMngiLCBDT01QQUNUX1BST1RPQ09MX0lELCBwcm90b2NvbElkKQotICAgIHJldHVybiAiIiwgdHlwZUlkLCBzZXFJZCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKEJBRF9WRVJTSU9OLCBzKQotICB9Ci0gIHZlcnNpb25BbmRUeXBlLCBlcnIgOj0gcC5SZWFkQnl0ZSgpCi0gIHZlcnNpb24gOj0gdmVyc2lvbkFuZFR5cGUgJiBDT01QQUNUX1ZFUlNJT05fTUFTSwotICB0eXBlSWQgPSBUTWVzc2FnZVR5cGUoKHZlcnNpb25BbmRUeXBlID4+IENPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQpICYgMHgwMykKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuCi0gIH0KLSAgaWYgdmVyc2lvbiAhPSBDT01QQUNUX1ZFUlNJT04gewotICAgIHMgOj0gZm10LlNwcmludGYoIkV4cGVjdGVkIHZlcnNpb24gJTAyeCBidXQgZ290ICUwMngiLCBDT01QQUNUX1ZFUlNJT04sIHZlcnNpb24pCi0gICAgZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uKEJBRF9WRVJTSU9OLCBzKQotICAgIHJldHVybgotICB9Ci0gIHNlcUlkLCBlIDo9IHAucmVhZFZhcmludDMyKCkKLSAgaWYgZSAhPSBuaWwgewotICAgIGVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gICAgcmV0dXJuCi0gIH0KLSAgbmFtZSwgZXJyID0gcC5SZWFkU3RyaW5nKCkKLSAgcmV0dXJuCi19Ci0KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRNZXNzYWdlRW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsgcmV0dXJuIG5pbCB9Ci0KLS8qKgotICogUmVhZCBhIHN0cnVjdCBiZWdpbi4gVGhlcmUncyBub3RoaW5nIG9uIHRoZSB3aXJlIGZvciB0aGlzLCBidXQgaXQgaXMgb3VyCi0gKiBvcHBvcnR1bml0eSB0byBwdXNoIGEgbmV3IHN0cnVjdCBiZWdpbiBtYXJrZXIgb250byB0aGUgZmllbGQgc3RhY2suCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRTdHJ1Y3RCZWdpbigpIChuYW1lIHN0cmluZywgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBwLmxhc3RGaWVsZC5QdXNoKHAubGFzdEZpZWxkSWQpCi0gIHAubGFzdEZpZWxkSWQgPSAwCi0gIHJldHVybgotfQotCi0vKioKLSAqIERvZXNuJ3QgYWN0dWFsbHkgY29uc3VtZSBhbnkgd2lyZSBkYXRhLCBqdXN0IHJlbW92ZXMgdGhlIGxhc3QgZmllbGQgZm9yIAotICogdGhpcyBzdHJ1Y3QgZnJvbSB0aGUgZmllbGQgc3RhY2suCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRTdHJ1Y3RFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICAvLyBjb25zdW1lIHRoZSBsYXN0IGZpZWxkIHdlIHJlYWQgb2ZmIHRoZSB3aXJlLgotICBwLmxhc3RGaWVsZElkID0gcC5sYXN0RmllbGQuUG9wKCkKLSAgcmV0dXJuIG5pbAotfQotCi0vKioKLSAqIFJlYWQgYSBmaWVsZCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiAKLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZEZpZWxkQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUVHlwZSwgaWQgaW50MTYsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgdCwgZXJyIDo9IHAuUmVhZEJ5dGUoKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4KLSAgfQotCi0gIC8vIGlmIGl0J3MgYSBzdG9wLCB0aGVuIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHksIGFzIHRoZSBzdHJ1Y3QgaXMgb3Zlci4KLSAgaWYgKHQgJiAweDBmKSA9PSBTVE9QIHsKLSAgICByZXR1cm4gX1RTVE9QLk5hbWUoKSwgX1RTVE9QLlR5cGVJZCgpLCBpbnQxNihfVFNUT1AuSWQoKSksIG5pbAotICB9Ci0KLSAgLy8gbWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSB0eXBlIGhlYWRlci4gaXQgY291bGQgY29udGFpbiBhIGZpZWxkIGlkIGRlbHRhLgotICBtb2RpZmllciA6PSBpbnQxNigodCAmIDB4ZjApID4+IDQpCi0gIGlmIG1vZGlmaWVyID09IDAgewotICAgIC8vIG5vdCBhIGRlbHRhLiBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZC4KLSAgICBpZCwgZXJyID0gcC5SZWFkSTE2KCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybgotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBoYXMgYSBkZWx0YS4gYWRkIHRoZSBkZWx0YSB0byB0aGUgbGFzdCByZWFkIGZpZWxkIGlkLgotICAgIGlkID0gaW50MTYocC5sYXN0RmllbGRJZCkgKyBtb2RpZmllcgotICB9Ci0gIHR5cGVJZCwgZSA6PSBwLmdldFRUeXBlKFRDb21wYWN0VHlwZSh0ICYgMHgwZikpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICBlcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICAgIHJldHVybgotICB9Ci0KLSAgLy8gaWYgdGhpcyBoYXBwZW5zIHRvIGJlIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIGlzIGVuY29kZWQgaW4gdGhlIHR5cGUKLSAgaWYgcC5pc0Jvb2xUeXBlKHQpIHsKLSAgICAvLyBzYXZlIHRoZSBib29sZWFuIHZhbHVlIGluIGEgc3BlY2lhbCBpbnN0YW5jZSB2YXJpYWJsZS4KLSAgICBwLmJvb2xWYWx1ZSA9IChieXRlKHQpJjB4MGYgPT0gQ09NUEFDVF9CT09MRUFOX1RSVUUpCi0gICAgcC5ib29sVmFsdWVJc05vdE51bGwgPSB0cnVlCi0gIH0KLQotICAvLyBwdXNoIHRoZSBuZXcgZmllbGQgb250byB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGtlZXAgdGhlIGRlbHRhcyBnb2luZy4KLSAgcC5sYXN0RmllbGRJZCA9IGludChpZCkKLSAgcmV0dXJuCi19Ci0KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRGaWVsZEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7IHJldHVybiBuaWwgfQotCi0vKiogCi0gKiBSZWFkIGEgbWFwIGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzaXplIGlzIHplcm8sIHNraXAgcmVhZGluZyB0aGUga2V5Ci0gKiBhbmQgdmFsdWUgdHlwZS4gVGhpcyBtZWFucyB0aGF0IDAtbGVuZ3RoIG1hcHMgd2lsbCB5aWVsZCBUTWFwcyB3aXRob3V0IHRoZQotICogImNvcnJlY3QiIHR5cGVzLgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkTWFwQmVnaW4oKSAoa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBzaXplMzIsIGUgOj0gcC5yZWFkVmFyaW50MzIoKQotICBzaXplID0gaW50KHNpemUzMikKLSAgaWYgZSAhPSBuaWwgewotICAgIGVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gICAgcmV0dXJuCi0gIH0KLSAga2V5QW5kVmFsdWVUeXBlIDo9IGJ5dGUoU1RPUCkKLSAgaWYgc2l6ZSAhPSAwIHsKLSAgICBrZXlBbmRWYWx1ZVR5cGUsIGVyciA9IHAuUmVhZEJ5dGUoKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuCi0gICAgfQotICB9Ci0gIGtleVR5cGUsIF8gPSBwLmdldFRUeXBlKFRDb21wYWN0VHlwZShrZXlBbmRWYWx1ZVR5cGUgPj4gNCkpCi0gIHZhbHVlVHlwZSwgXyA9IHAuZ2V0VFR5cGUoVENvbXBhY3RUeXBlKGtleUFuZFZhbHVlVHlwZSAmIDB4ZikpCi0gIHJldHVybgotfQotCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkTWFwRW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsgcmV0dXJuIG5pbCB9Ci0KLS8qKgotICogUmVhZCBhIGxpc3QgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIGxpc3Qgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsIAotICogYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgbGlzdCwgdGhlIDQgTVNCCi0gKiBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCi0gKiB0cnVlIHNpemUuCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRMaXN0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHNpemVfYW5kX3R5cGUsIGVyciA6PSBwLlJlYWRCeXRlKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuCi0gIH0KLSAgc2l6ZSA9IGludCgoc2l6ZV9hbmRfdHlwZSA+PiA0KSAmIDB4MGYpCi0gIGlmIHNpemUgPT0gMTUgewotICAgIHNpemUyLCBlIDo9IHAucmVhZFZhcmludDMyKCkKLSAgICBpZiBlICE9IG5pbCB7Ci0gICAgICBlcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICAgICAgcmV0dXJuCi0gICAgfQotICAgIHNpemUgPSBpbnQoc2l6ZTIpCi0gIH0KLSAgZWxlbVR5cGUsIGUgOj0gcC5nZXRUVHlwZShUQ29tcGFjdFR5cGUoc2l6ZV9hbmRfdHlwZSkpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICBlcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICAgIHJldHVybgotICB9Ci0gIHJldHVybgotfQotCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkTGlzdEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7IHJldHVybiBuaWwgfQotCi0vKioKLSAqIFJlYWQgYSBzZXQgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNldCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwgCi0gKiBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBzZXQsIHRoZSA0IE1TQgotICogb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQotICogdHJ1ZSBzaXplLgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkU2V0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHJldHVybiBwLlJlYWRMaXN0QmVnaW4oKQotfQotCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkU2V0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsgcmV0dXJuIG5pbCB9Ci0KLS8qKgotICogUmVhZCBhIGJvb2xlYW4gb2ZmIHRoZSB3aXJlLiBJZiB0aGlzIGlzIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIHNob3VsZAotICogYWxyZWFkeSBoYXZlIGJlZW4gcmVhZCBkdXJpbmcgcmVhZEZpZWxkQmVnaW4sIHNvIHdlJ2xsIGp1c3QgY29uc3VtZSB0aGUKLSAqIHByZS1zdG9yZWQgdmFsdWUuIE90aGVyd2lzZSwgcmVhZCBhIGJ5dGUuCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRCb29sKCkgKHZhbHVlIGJvb2wsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgaWYgcC5ib29sVmFsdWVJc05vdE51bGwgewotICAgIHAuYm9vbFZhbHVlSXNOb3ROdWxsID0gZmFsc2UKLSAgICByZXR1cm4gcC5ib29sVmFsdWUsIG5pbAotICB9Ci0gIHYsIGVyciA6PSBwLlJlYWRCeXRlKCkKLSAgcmV0dXJuIHYgPT0gQ09NUEFDVF9CT09MRUFOX1RSVUUsIGVycgotfQotCi0vKioKLSAqIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZEJ5dGUoKSAodmFsdWUgYnl0ZSwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBidWYgOj0gW11ieXRlezB9Ci0gIF8sIGUgOj0gcC50cmFucy5SZWFkQWxsKGJ1ZikKLSAgaWYgZSAhPSBuaWwgewotICAgIHJldHVybiAwLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICB9Ci0gIHJldHVybiBidWZbMF0sIG5pbAotfQotCi0vKioKLSAqIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkSTE2KCkgKHZhbHVlIGludDE2LCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHYsIGVyciA6PSBwLlJlYWRJMzIoKQotICByZXR1cm4gaW50MTYodiksIGVycgotfQotCi0vKioKLSAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkSTMyKCkgKHZhbHVlIGludDMyLCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHYsIGUgOj0gcC5yZWFkVmFyaW50MzIoKQotICBpZiBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIDAsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gIH0KLSAgdmFsdWUgPSBwLnppZ3phZ1RvSW50MzIodikKLSAgcmV0dXJuIHZhbHVlLCBuaWwKLX0KLQotLyoqCi0gKiBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZEk2NCgpICh2YWx1ZSBpbnQ2NCwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICB2LCBlIDo9IHAucmVhZFZhcmludDY0KCkKLSAgaWYgZSAhPSBuaWwgewotICAgIHJldHVybiAwLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICB9Ci0gIHZhbHVlID0gcC56aWd6YWdUb0ludDY0KHYpCi0gIHJldHVybiB2YWx1ZSwgbmlsCi19Ci0KLS8qKgotICogTm8gbWFnaWMgaGVyZSAtIGp1c3QgcmVhZCBhIGRvdWJsZSBvZmYgdGhlIHdpcmUuCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWREb3VibGUoKSAodmFsdWUgZmxvYXQ2NCwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBsb25nQml0cyA6PSBtYWtlKFtdYnl0ZSwgOCkKLSAgXywgZSA6PSBwLnRyYW5zLlJlYWRBbGwobG9uZ0JpdHMpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICByZXR1cm4gMC4wLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICB9Ci0gIHJldHVybiBtYXRoLkZsb2F0NjRmcm9tYml0cyhwLmJ5dGVzVG9VaW50NjQobG9uZ0JpdHMpKSwgbmlsCi19Ci0KLS8qKgotICogUmVhZHMgYSBbXWJ5dGUgKHZpYSByZWFkQmluYXJ5KSwgYW5kIHRoZW4gVVRGLTggZGVjb2RlcyBpdC4KLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZFN0cmluZygpICh2YWx1ZSBzdHJpbmcsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgdiwgZSA6PSBwLlJlYWRCaW5hcnkoKQotICByZXR1cm4gc3RyaW5nKHYpLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotfQotCi0vKioKLSAqIFJlYWQgYSBbXWJ5dGUgZnJvbSB0aGUgd2lyZS4gCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRCaW5hcnkoKSAodmFsdWUgW11ieXRlLCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGxlbmd0aCwgZSA6PSBwLnJlYWRWYXJpbnQzMigpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICByZXR1cm4gW11ieXRle30sIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gIH0KLSAgaWYgbGVuZ3RoID09IDAgewotICAgIHJldHVybiBbXWJ5dGV7fSwgbmlsCi0gIH0KLQotICBidWYgOj0gbWFrZShbXWJ5dGUsIGxlbmd0aCkKLSAgcC50cmFucy5SZWFkQWxsKGJ1ZikKLSAgcmV0dXJuIGJ1ZiwgbmlsCi19Ci0KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIEZsdXNoKCkgKGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKHAudHJhbnMuRmx1c2goKSkKLX0KLQotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgU2tpcChmaWVsZFR5cGUgVFR5cGUpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHJldHVybiBTa2lwRGVmYXVsdERlcHRoKHAsIGZpZWxkVHlwZSkKLX0KLQotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgVHJhbnNwb3J0KCkgVFRyYW5zcG9ydCB7Ci0gIHJldHVybiBwLnRyYW5zCi19Ci0KLS8vCi0vLyBJbnRlcm5hbCB3cml0aW5nIG1ldGhvZHMKLS8vCi0KLS8qKgotICogQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbiAKLSAqIHRoZSB3aXJlIGRpZmZlciBvbmx5IGJ5IHRoZSB0eXBlIGluZGljYXRvci4KLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgd3JpdGVDb2xsZWN0aW9uQmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSAoaW50LCBvcy5FcnJvcikgewotICBpZiBzaXplIDw9IDE0IHsKLSAgICByZXR1cm4gcC53cml0ZUJ5dGVEaXJlY3QoYnl0ZShpbnQzMihzaXplPDw0KSB8IGludDMyKHAuZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKSkpCi0gIH0KLSAgbiwgZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KDB4ZjAgfCBieXRlKHAuZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIG4sIGVycgotICB9Ci0gIG0sIGVyciA6PSBwLndyaXRlVmFyaW50MzIoaW50MzIoc2l6ZSkpCi0gIHJldHVybiBuICsgbSwgZXJyCi19Ci0KLS8qKgotICogV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgd2lyZS4KLSAqIFRPRE8ocG9tYWNrKTogbWFrZSBhIHBlcm1hbmVudCBidWZmZXIgbGlrZSB3cml0ZVZhcmludDY0PwotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSB3cml0ZVZhcmludDMyKG4gaW50MzIpIChpbnQsIG9zLkVycm9yKSB7Ci0gIGkzMmJ1ZiA6PSBtYWtlKFtdYnl0ZSwgNSkKLSAgaWR4IDo9IDAKLSAgZm9yIHsKLSAgICBpZiAobiAmIF4weDdGKSA9PSAwIHsKLSAgICAgIGkzMmJ1ZltpZHhdID0gYnl0ZShuKQotICAgICAgaWR4KysKLSAgICAgIC8vIHAud3JpdGVCeXRlRGlyZWN0KGJ5dGUobikpOwotICAgICAgYnJlYWsKLSAgICAgIC8vIHJldHVybjsKLSAgICB9IGVsc2UgewotICAgICAgaTMyYnVmW2lkeF0gPSBieXRlKChuICYgMHg3RikgfCAweDgwKQotICAgICAgaWR4KysKLSAgICAgIC8vIHAud3JpdGVCeXRlRGlyZWN0KGJ5dGUoKChuICYgMHg3RikgfCAweDgwKSkpOwotICAgICAgdSA6PSB1aW50MzIobikKLSAgICAgIG4gPSBpbnQzMih1ID4+IDcpCi0gICAgfQotICB9Ci0gIHJldHVybiBwLnRyYW5zLldyaXRlKGkzMmJ1ZlswOmlkeF0pCi19Ci0KLS8qKgotICogV3JpdGUgYW4gaTY0IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIHdpcmUuCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHdyaXRlVmFyaW50NjQobiBpbnQ2NCkgKGludCwgb3MuRXJyb3IpIHsKLSAgdmFyaW50NjRvdXQgOj0gbWFrZShbXWJ5dGUsIDEwKQotICBpZHggOj0gMAotICBmb3IgewotICAgIGlmIChuICYgXjB4N0YpID09IDAgewotICAgICAgdmFyaW50NjRvdXRbaWR4XSA9IGJ5dGUobikKLSAgICAgIGlkeCsrCi0gICAgICBicmVhawotICAgIH0gZWxzZSB7Ci0gICAgICB2YXJpbnQ2NG91dFtpZHhdID0gYnl0ZSgobiAmIDB4N0YpIHwgMHg4MCkKLSAgICAgIGlkeCsrCi0gICAgICB1IDo9IHVpbnQ2NChuKQotICAgICAgbiA9IGludDY0KHUgPj4gNykKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHAudHJhbnMuV3JpdGUodmFyaW50NjRvdXRbMDppZHhdKQotfQotCi0vKioKLSAqIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUgCi0gKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGludDY0VG9aaWd6YWcobCBpbnQ2NCkgaW50NjQgewotICByZXR1cm4gKGwgPDwgMSkgXiAobCA+PiA2MykKLX0KLQotLyoqCi0gKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlIAotICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBpbnQzMlRvWmlnemFnKG4gaW50MzIpIGludDMyIHsKLSAgcmV0dXJuIChuIDw8IDEpIF4gKG4gPj4gMzEpCi19Ci0KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGZpeGVkVWludDY0VG9CeXRlcyhuIHVpbnQ2NCwgYnVmIFtdYnl0ZSkgewotICBiaW5hcnkuTGl0dGxlRW5kaWFuLlB1dFVpbnQ2NChidWYsIG4pCi19Ci0KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGZpeGVkSW50NjRUb0J5dGVzKG4gaW50NjQsIGJ1ZiBbXWJ5dGUpIHsKLSAgYmluYXJ5LkxpdHRsZUVuZGlhbi5QdXRVaW50NjQoYnVmLCB1aW50NjQobikpCi19Ci0KLS8qKiAKLSAqIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2libGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuIAotICogVXNlZCBpbnRlcm5hbGx5IGJ5IG90aGVyIHdyaXRpbmcgbWV0aG9kcyB0aGF0IGtub3cgdGhleSBuZWVkIHRvIHdyaXRlIGEgYnl0ZS4KLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgd3JpdGVCeXRlRGlyZWN0KGIgYnl0ZSkgKGludCwgb3MuRXJyb3IpIHsKLSAgcmV0dXJuIHAudHJhbnMuV3JpdGUoW11ieXRle2J9KQotfQotCi0vKiogCi0gKiBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSB3cml0ZUludEFzQnl0ZURpcmVjdChuIGludCkgKGludCwgb3MuRXJyb3IpIHsKLSAgcmV0dXJuIHAud3JpdGVCeXRlRGlyZWN0KGJ5dGUobikpCi19Ci0KLQotLy8KLS8vIEludGVybmFsIHJlYWRpbmcgbWV0aG9kcwotLy8KLQotLyoqCi0gKiBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKLSAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gNSBieXRlcy4KLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgcmVhZFZhcmludDMyKCkgKGludDMyLCBvcy5FcnJvcikgewotICAvLyBpZiB0aGUgd2lyZSBjb250YWlucyB0aGUgcmlnaHQgc3R1ZmYsIHRoaXMgd2lsbCBqdXN0IHRydW5jYXRlIHRoZSBpNjQgd2UKLSAgLy8gcmVhZCBhbmQgZ2V0IHVzIHRoZSByaWdodCBzaWduLgotICB2LCBlcnIgOj0gcC5yZWFkVmFyaW50NjQoKQotICByZXR1cm4gaW50MzIodiksIGVycgotfQotCi0KLS8qKgotICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldCAKLSAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gMTAgYnl0ZXMuCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHJlYWRWYXJpbnQ2NCgpIChpbnQ2NCwgb3MuRXJyb3IpIHsKLSAgc2hpZnQgOj0gdWludCgwKQotICByZXN1bHQgOj0gaW50NjQoMCkKLSAgZm9yIHsKLSAgICBiLCBlcnIgOj0gcC5SZWFkQnl0ZSgpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4gMCwgZXJyCi0gICAgfQotICAgIHJlc3VsdCB8PSBpbnQ2NChiJjB4N2YpIDw8IHNoaWZ0Ci0gICAgaWYgKGIgJiAweDgwKSAhPSAweDgwIHsKLSAgICAgIGJyZWFrCi0gICAgfQotICAgIHNoaWZ0ICs9IDcKLSAgfQotICByZXR1cm4gcmVzdWx0LCBuaWwKLX0KLQotCi0vLwotLy8gZW5jb2RpbmcgaGVscGVycwotLy8KLQotLyoqCi0gKiBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHppZ3phZ1RvSW50MzIobiBpbnQzMikgaW50MzIgewotICB1IDo9IHVpbnQzMihuKQotICByZXR1cm4gaW50MzIodT4+MSkgXiAtKG4gJiAxKQotfQotCi0vKiogCi0gKiBDb252ZXJ0IGZyb20gemlnemFnIGxvbmcgdG8gbG9uZy4KLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgemlnemFnVG9JbnQ2NChuIGludDY0KSBpbnQ2NCB7Ci0gIHUgOj0gdWludDY0KG4pCi0gIHJldHVybiBpbnQ2NCh1Pj4xKSBeIC0obiAmIDEpCi19Ci0KLS8qKgotICogTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG1hc2sgYnl0ZXMgYXJlIGxvbmcgbGl0ZXJhbHMsIAotICogb3RoZXJ3aXNlIHRoZXknbGwgZGVmYXVsdCB0byBpbnRzLCBhbmQgd2hlbiB5b3Ugc2hpZnQgYW4gaW50IGxlZnQgNTYgYml0cywKLSAqIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBpbnQuCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGJ5dGVzVG9JbnQ2NChiIFtdYnl0ZSkgaW50NjQgewotICByZXR1cm4gaW50NjQoYmluYXJ5LkxpdHRsZUVuZGlhbi5VaW50NjQoYikpCi19Ci0KLS8qKgotICogTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG1hc2sgYnl0ZXMgYXJlIGxvbmcgbGl0ZXJhbHMsIAotICogb3RoZXJ3aXNlIHRoZXknbGwgZGVmYXVsdCB0byBpbnRzLCBhbmQgd2hlbiB5b3Ugc2hpZnQgYW4gaW50IGxlZnQgNTYgYml0cywKLSAqIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBpbnQuCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGJ5dGVzVG9VaW50NjQoYiBbXWJ5dGUpIHVpbnQ2NCB7Ci0gIHJldHVybiBiaW5hcnkuTGl0dGxlRW5kaWFuLlVpbnQ2NChiKQotfQotCi0vLwotLy8gdHlwZSB0ZXN0aW5nIGFuZCBjb252ZXJ0aW5nCi0vLwotCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBpc0Jvb2xUeXBlKGIgYnl0ZSkgYm9vbCB7Ci0gIHJldHVybiAoYiYweDBmKSA9PSBDT01QQUNUX0JPT0xFQU5fVFJVRSB8fCAoYiYweDBmKSA9PSBDT01QQUNUX0JPT0xFQU5fRkFMU0UKLX0KLQotLyoqCi0gKiBHaXZlbiBhIFRDb21wYWN0VHlwZSBjb25zdGFudCwgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZyAKLSAqIFRUeXBlIHZhbHVlLgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBnZXRUVHlwZSh0IFRDb21wYWN0VHlwZSkgKFRUeXBlLCBvcy5FcnJvcikgewotICBzd2l0Y2ggYnl0ZSh0KSAmIDB4MGYgewotICBjYXNlIFNUT1A6Ci0gICAgcmV0dXJuIFNUT1AsIG5pbAotICBjYXNlIENPTVBBQ1RfQk9PTEVBTl9GQUxTRToKLSAgY2FzZSBDT01QQUNUX0JPT0xFQU5fVFJVRToKLSAgICByZXR1cm4gQk9PTCwgbmlsCi0gIGNhc2UgQ09NUEFDVF9CWVRFOgotICAgIHJldHVybiBCWVRFLCBuaWwKLSAgY2FzZSBDT01QQUNUX0kxNjoKLSAgICByZXR1cm4gSTE2LCBuaWwKLSAgY2FzZSBDT01QQUNUX0kzMjoKLSAgICByZXR1cm4gSTMyLCBuaWwKLSAgY2FzZSBDT01QQUNUX0k2NDoKLSAgICByZXR1cm4gSTY0LCBuaWwKLSAgY2FzZSBDT01QQUNUX0RPVUJMRToKLSAgICByZXR1cm4gRE9VQkxFLCBuaWwKLSAgY2FzZSBDT01QQUNUX0JJTkFSWToKLSAgICByZXR1cm4gU1RSSU5HLCBuaWwKLSAgY2FzZSBDT01QQUNUX0xJU1Q6Ci0gICAgcmV0dXJuIExJU1QsIG5pbAotICBjYXNlIENPTVBBQ1RfU0VUOgotICAgIHJldHVybiBTRVQsIG5pbAotICBjYXNlIENPTVBBQ1RfTUFQOgotICAgIHJldHVybiBNQVAsIG5pbAotICBjYXNlIENPTVBBQ1RfU1RSVUNUOgotICAgIHJldHVybiBTVFJVQ1QsIG5pbAotICB9Ci0gIHJldHVybiBTVE9QLCBOZXdURXhjZXB0aW9uKCJkb24ndCBrbm93IHdoYXQgdHlwZTogIiArIHN0cmluZyh0JjB4MGYpKQotfQotCi0vKioKLSAqIEdpdmVuIGEgVFR5cGUgdmFsdWUsIGZpbmQgdGhlIGFwcHJvcHJpYXRlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQuCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGdldENvbXBhY3RUeXBlKHQgVFR5cGUpIFRDb21wYWN0VHlwZSB7Ci0gIHJldHVybiBfVFR5cGVUb0NvbXBhY3RUeXBlW2ludCh0KV0KLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdGNvbXBhY3RfcHJvdG9jb2xfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvdGNvbXBhY3RfcHJvdG9jb2xfdGVzdC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEwZTM5Yy4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3Rjb21wYWN0X3Byb3RvY29sX3Rlc3QuZ28KKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0X3Rlc3QKLQotaW1wb3J0ICgKLSAgLiAidGhyaWZ0IgotICAidGVzdGluZyIKLSAgLy8iYnl0ZXMiOwotKQotCi1mdW5jIFRlc3RSZWFkV3JpdGVDb21wYWN0UHJvdG9jb2wodCAqdGVzdGluZy5UKSB7Ci0gIFJlYWRXcml0ZVByb3RvY29sVGVzdCh0LCBOZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpKQotICAvKgotICAgICB0cmFuc3BvcnRzIDo9IFtdVFRyYW5zcG9ydHsKLSAgICAgICBOZXdUTWVtb3J5QnVmZmVyKCksIAotICAgICAgIE5ld1RJT1N0cmVhbVRyYW5zcG9ydFJXKGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgMTYzODQpKSksCi0gICAgICAgTmV3VEZyYW1lZFRyYW5zcG9ydChOZXdUTWVtb3J5QnVmZmVyKCkpLAotICAgICB9Ci0gICAgIGZvciBfLCB0cmFucyA6PSByYW5nZSB0cmFuc3BvcnRzIHsKLSAgICAgICBwIDo9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpOwotICAgICAgIFJlYWRXcml0ZUJvb2wodCwgcCwgdHJhbnMpOwotICAgICAgIHAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKTsKLSAgICAgICBSZWFkV3JpdGVCeXRlKHQsIHAsIHRyYW5zKTsKLSAgICAgICBwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucyk7Ci0gICAgICAgUmVhZFdyaXRlSTE2KHQsIHAsIHRyYW5zKTsKLSAgICAgICBwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucyk7Ci0gICAgICAgUmVhZFdyaXRlSTMyKHQsIHAsIHRyYW5zKTsKLSAgICAgICBwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucyk7Ci0gICAgICAgUmVhZFdyaXRlSTY0KHQsIHAsIHRyYW5zKTsKLSAgICAgICBwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucyk7Ci0gICAgICAgUmVhZFdyaXRlRG91YmxlKHQsIHAsIHRyYW5zKTsKLSAgICAgICBwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucyk7Ci0gICAgICAgUmVhZFdyaXRlU3RyaW5nKHQsIHAsIHRyYW5zKTsKLSAgICAgICBwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucyk7Ci0gICAgICAgUmVhZFdyaXRlQmluYXJ5KHQsIHAsIHRyYW5zKTsKLSAgICAgICB0cmFucy5DbG9zZSgpOwotICAgICB9Ci0gICovCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3Rjb21wYXJlLmdvIGIvbGliL2dvL3RocmlmdC90Y29tcGFyZS5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmZWY0NC4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3Rjb21wYXJlLmdvCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIHRocmlmdAotCi1mdW5jIENvbXBhcmVJbnQoaSwgaiBpbnQpIGludCB7Ci0gIGlmIGkgPiBqIHsKLSAgICByZXR1cm4gMQotICB9Ci0gIGlmIGkgPCBqIHsKLSAgICByZXR1cm4gLTEKLSAgfQotICByZXR1cm4gMAotfQotCi1mdW5jIENvbXBhcmVJbnQxNihpLCBqIGludDE2KSBpbnQgewotICBpZiBpID4gaiB7Ci0gICAgcmV0dXJuIDEKLSAgfQotICBpZiBpIDwgaiB7Ci0gICAgcmV0dXJuIC0xCi0gIH0KLSAgcmV0dXJuIDAKLX0KLQotZnVuYyBDb21wYXJlSW50MzIoaSwgaiBpbnQzMikgaW50IHsKLSAgaWYgaSA+IGogewotICAgIHJldHVybiAxCi0gIH0KLSAgaWYgaSA8IGogewotICAgIHJldHVybiAtMQotICB9Ci0gIHJldHVybiAwCi19Ci0KLWZ1bmMgQ29tcGFyZUludDY0KGksIGogaW50MzIpIGludCB7Ci0gIGlmIGkgPiBqIHsKLSAgICByZXR1cm4gMQotICB9Ci0gIGlmIGkgPCBqIHsKLSAgICByZXR1cm4gLTEKLSAgfQotICByZXR1cm4gMAotfQotCi1mdW5jIENvbXBhcmVTdHJpbmdBcnJheShpLCBqIFtdc3RyaW5nKSBpbnQgewotICBpZiBjbXAgOj0gQ29tcGFyZUludChsZW4oaSksIGxlbihqKSk7IGNtcCAhPSAwIHsKLSAgICByZXR1cm4gY21wCi0gIH0KLSAgc2l6ZSA6PSBsZW4oaSkKLSAgZm9yIGsgOj0gMDsgayA8IHNpemU7IGsrKyB7Ci0gICAgaWYgY21wIDo9IENvbXBhcmVTdHJpbmcoaVtrXSwgaltrXSk7IGNtcCAhPSAwIHsKLSAgICAgIHJldHVybiBjbXAKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDAKLX0KLQotZnVuYyBDb21wYXJlU3RyaW5nKGksIGogc3RyaW5nKSBpbnQgewotICBpZiBpID4gaiB7Ci0gICAgcmV0dXJuIDEKLSAgfQotICBpZiBpIDwgaiB7Ci0gICAgcmV0dXJuIC0xCi0gIH0KLSAgcmV0dXJuIDAKLX0KLQotZnVuYyBDb21wYXJlRmxvYXQoaSwgaiBmbG9hdDMyKSBpbnQgewotICBpZiBpID4gaiB7Ci0gICAgcmV0dXJuIDEKLSAgfQotICBpZiBpIDwgaiB7Ci0gICAgcmV0dXJuIC0xCi0gIH0KLSAgcmV0dXJuIDAKLX0KLQotZnVuYyBDb21wYXJlRG91YmxlKGksIGogZmxvYXQ2NCkgaW50IHsKLSAgaWYgaSA+IGogewotICAgIHJldHVybiAxCi0gIH0KLSAgaWYgaSA8IGogewotICAgIHJldHVybiAtMQotICB9Ci0gIHJldHVybiAwCi19Ci0KLWZ1bmMgQ29tcGFyZUJ5dGUoaSwgaiBieXRlKSBpbnQgewotICBpZiBpID4gaiB7Ci0gICAgcmV0dXJuIDEKLSAgfQotICBpZiBpIDwgaiB7Ci0gICAgcmV0dXJuIC0xCi0gIH0KLSAgcmV0dXJuIDAKLX0KLQotZnVuYyBDb21wYXJlQm9vbChpLCBqIGJvb2wpIGludCB7Ci0gIGlmIGkgewotICAgIGlmIGogewotICAgICAgcmV0dXJuIDAKLSAgICB9Ci0gICAgcmV0dXJuIDEKLSAgfQotICBpZiBqIHsKLSAgICByZXR1cm4gLTEKLSAgfQotICByZXR1cm4gMAotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90Y29udGFpbmVyLmdvIGIvbGliL2dvL3RocmlmdC90Y29udGFpbmVyLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWEzY2JhLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdGNvbnRhaW5lci5nbworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIHRocmlmdAotCi10eXBlIFRDb250YWluZXIgaW50ZXJmYWNlIHsKLSAgTGVuKCkgaW50Ci0gIENvbnRhaW5zKGRhdGEgaW50ZXJmYWNle30pIGJvb2wKLSAgRXF1YWxzKG90aGVyIGludGVyZmFjZXt9KSBib29sCi0gIENvbXBhcmVUbyhvdGhlciBpbnRlcmZhY2V7fSkgKGludCwgYm9vbCkKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdGV4Y2VwdGlvbi5nbyBiL2xpYi9nby90aHJpZnQvdGV4Y2VwdGlvbi5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU2Y2JkNS4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3RleGNlcHRpb24uZ28KKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLWltcG9ydCAoCi0gICJvcyIKLSkKLQotLyoqCi0gKiBHZW5lcmljIGV4Y2VwdGlvbiBjbGFzcyBmb3IgVGhyaWZ0LgotICoKLSAqLwotCi10eXBlIFRFeGNlcHRpb24gaW50ZXJmYWNlIHsKLSAgU3RyaW5nKCkgc3RyaW5nCi19Ci0KLXR5cGUgdEV4Y2VwdGlvbiBzdHJ1Y3QgewotICBtZXNzYWdlIHN0cmluZwotfQotCi1mdW5jIChwICp0RXhjZXB0aW9uKSBTdHJpbmcoKSBzdHJpbmcgewotICByZXR1cm4gcC5tZXNzYWdlCi19Ci0KLWZ1bmMgTmV3VEV4Y2VwdGlvbihtIHN0cmluZykgVEV4Y2VwdGlvbiB7Ci0gIHJldHVybiAmdEV4Y2VwdGlvbnttZXNzYWdlOiBtfQotfQotCi1mdW5jIE5ld1RFeGNlcHRpb25Gcm9tT3NFcnJvcihlIG9zLkVycm9yKSBURXhjZXB0aW9uIHsKLSAgaWYgZSA9PSBuaWwgewotICAgIHJldHVybiBuaWwKLSAgfQotICB0LCBvayA6PSBlLihURXhjZXB0aW9uKQotICBpZiBvayB7Ci0gICAgcmV0dXJuIHQKLSAgfQotICByZXR1cm4gTmV3VEV4Y2VwdGlvbihlLlN0cmluZygpKQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90ZXhjZXB0aW9uX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3RleGNlcHRpb25fdGVzdC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBiM2NkZC4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3RleGNlcHRpb25fdGVzdC5nbworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnRfdGVzdAotCi1pbXBvcnQgKAotICAuICJ0aHJpZnQiCi0gICJvcyIKLSAgInRlc3RpbmciCi0pCi0KLQotZnVuYyBUZXN0VEV4Y2VwdGlvbih0ICp0ZXN0aW5nLlQpIHsKLSAgZXhjIDo9IE5ld1RFeGNlcHRpb24oIiIpCi0gIGlmIGV4Yy5TdHJpbmcoKSAhPSAiIiB7Ci0gICAgdC5GYXRhbGYoIkV4cGVjdGVkIGVtcHR5IHN0cmluZyBmb3IgZXhjZXB0aW9uIGJ1dCBmb3VuZCAnJXMnIiwgZXhjLlN0cmluZygpKQotICB9Ci0gIGV4YyA9IE5ld1RFeGNlcHRpb25Gcm9tT3NFcnJvcihvcy5FT0YpCi0gIGlmIGV4Yy5TdHJpbmcoKSAhPSBvcy5FT0YuU3RyaW5nKCkgewotICAgIHQuRmF0YWxmKCJFeHBlY3RlZCAnJXMnLCBidXQgZm91bmQgJyVzJyIsIG9zLkVPRi5TdHJpbmcoKSwgZXhjLlN0cmluZygpKQotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RmaWVsZC5nbyBiL2xpYi9nby90aHJpZnQvdGZpZWxkLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWQ5Yjg5Li4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdGZpZWxkLmdvCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnQKLQotaW1wb3J0ICgKLSAgInNvcnQiCi0pCi0KLS8qKgotICogSGVscGVyIGNsYXNzIHRoYXQgZW5jYXBzdWxhdGVzIGZpZWxkIG1ldGFkYXRhLgotICoKLSAqLwotdHlwZSBURmllbGQgaW50ZXJmYWNlIHsKLSAgTmFtZSgpIHN0cmluZwotICBUeXBlSWQoKSBUVHlwZQotICBJZCgpIGludAotICBTdHJpbmcoKSBzdHJpbmcKLSAgQ29tcGFyZVRvKG90aGVyIGludGVyZmFjZXt9KSAoaW50LCBib29sKQotICBFcXVhbHMob3RoZXIgaW50ZXJmYWNle30pIGJvb2wKLX0KLQotdHlwZSB0RmllbGQgc3RydWN0IHsKLSAgbmFtZSAgIHN0cmluZwotICB0eXBlSWQgVFR5cGUKLSAgaWQgICAgIGludAotfQotCi1mdW5jIE5ld1RGaWVsZERlZmF1bHQoKSBURmllbGQgewotICByZXR1cm4gQU5PTllNT1VTX0ZJRUxECi19Ci0KLWZ1bmMgTmV3VEZpZWxkKG4gc3RyaW5nLCB0IFRUeXBlLCBpIGludCkgVEZpZWxkIHsKLSAgcmV0dXJuICZ0RmllbGR7bmFtZTogbiwgdHlwZUlkOiB0LCBpZDogaX0KLX0KLQotZnVuYyAocCAqdEZpZWxkKSBOYW1lKCkgc3RyaW5nIHsKLSAgaWYgcCA9PSBuaWwgewotICAgIHJldHVybiAiIgotICB9Ci0gIHJldHVybiBwLm5hbWUKLX0KLQotZnVuYyAocCAqdEZpZWxkKSBUeXBlSWQoKSBUVHlwZSB7Ci0gIGlmIHAgPT0gbmlsIHsKLSAgICByZXR1cm4gVFR5cGUoVk9JRCkKLSAgfQotICByZXR1cm4gcC50eXBlSWQKLX0KLQotZnVuYyAocCAqdEZpZWxkKSBJZCgpIGludCB7Ci0gIGlmIHAgPT0gbmlsIHsKLSAgICByZXR1cm4gLTEKLSAgfQotICByZXR1cm4gcC5pZAotfQotCi1mdW5jIChwICp0RmllbGQpIFN0cmluZygpIHN0cmluZyB7Ci0gIGlmIHAgPT0gbmlsIHsKLSAgICByZXR1cm4gIjxuaWw+IgotICB9Ci0gIHJldHVybiAiPFRGaWVsZCBuYW1lOiciICsgcC5uYW1lICsgIicgdHlwZToiICsgc3RyaW5nKHAudHlwZUlkKSArICIgZmllbGQtaWQ6IiArIHN0cmluZyhwLmlkKSArICI+IgotfQotCi1mdW5jIChwICp0RmllbGQpIENvbXBhcmVUbyhvdGhlciBpbnRlcmZhY2V7fSkgKGludCwgYm9vbCkgewotICBpZiBvdGhlciA9PSBuaWwgewotICAgIHJldHVybiAxLCB0cnVlCi0gIH0KLSAgaWYgZGF0YSwgb2sgOj0gb3RoZXIuKFRGaWVsZCk7IG9rIHsKLSAgICBpZiBwLklkKCkgIT0gZGF0YS5JZCgpIHsKLSAgICAgIHJldHVybiBDb21wYXJlSW50KHAuSWQoKSwgZGF0YS5JZCgpKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBwLlR5cGVJZCgpICE9IGRhdGEuVHlwZUlkKCkgewotICAgICAgcmV0dXJuIENvbXBhcmVCeXRlKGJ5dGUocC5UeXBlSWQoKSksIGJ5dGUoZGF0YS5UeXBlSWQoKSkpLCB0cnVlCi0gICAgfQotICAgIHJldHVybiBDb21wYXJlU3RyaW5nKHAuTmFtZSgpLCBkYXRhLk5hbWUoKSksIHRydWUKLSAgfQotICByZXR1cm4gMCwgZmFsc2UKLX0KLQotZnVuYyAocCAqdEZpZWxkKSBFcXVhbHMob3RoZXIgaW50ZXJmYWNle30pIGJvb2wgewotICBpZiBwID09IG5pbCB7Ci0gICAgcmV0dXJuIG90aGVyID09IG5pbAotICB9Ci0gIGlmIG90aGVyID09IG5pbCB7Ci0gICAgcmV0dXJuIGZhbHNlCi0gIH0KLSAgaWYgZGF0YSwgb2sgOj0gb3RoZXIuKFRGaWVsZCk7IG9rIHsKLSAgICByZXR1cm4gcC5UeXBlSWQoKSA9PSBkYXRhLlR5cGVJZCgpICYmIHAuSWQoKSA9PSBkYXRhLklkKCkKLSAgfQotICByZXR1cm4gZmFsc2UKLX0KLQotdmFyIEFOT05ZTU9VU19GSUVMRCBURmllbGQKLQotdHlwZSB0RmllbGRBcnJheSBbXVRGaWVsZAotCi1mdW5jIChwIHRGaWVsZEFycmF5KSBMZW4oKSBpbnQgewotICByZXR1cm4gbGVuKHApCi19Ci0KLWZ1bmMgKHAgdEZpZWxkQXJyYXkpIExlc3MoaSwgaiBpbnQpIGJvb2wgewotICByZXR1cm4gcFtpXS5JZCgpIDwgcFtqXS5JZCgpCi19Ci0KLWZ1bmMgKHAgdEZpZWxkQXJyYXkpIFN3YXAoaSwgaiBpbnQpIHsKLSAgcFtpXSwgcFtqXSA9IHBbal0sIHBbaV0KLX0KLQotdHlwZSBURmllbGRDb250YWluZXIgaW50ZXJmYWNlIHsKLSAgVENvbnRhaW5lcgotICBGaWVsZE5hbWVGcm9tRmllbGRJZChpZCBpbnQpIHN0cmluZwotICBGaWVsZElkRnJvbUZpZWxkTmFtZShuYW1lIHN0cmluZykgaW50Ci0gIEZpZWxkRnJvbUZpZWxkSWQoaWQgaW50KSBURmllbGQKLSAgRmllbGRGcm9tRmllbGROYW1lKG5hbWUgc3RyaW5nKSBURmllbGQKLSAgQXQoaSBpbnQpIFRGaWVsZAotICBJdGVyKCkgPC1jaGFuIFRGaWVsZAotfQotCi10eXBlIHRGaWVsZENvbnRhaW5lciBzdHJ1Y3QgewotICBmaWVsZHMgICAgICAgICBbXVRGaWVsZAotICBuYW1lVG9GaWVsZE1hcCBtYXBbc3RyaW5nXVRGaWVsZAotICBpZFRvRmllbGRNYXAgICBtYXBbaW50XVRGaWVsZAotfQotCi1mdW5jIE5ld1RGaWVsZENvbnRhaW5lcihmaWVsZHMgW11URmllbGQpIFRGaWVsZENvbnRhaW5lciB7Ci0gIHNvcnRlZEZpZWxkcyA6PSBtYWtlKFtdVEZpZWxkLCBsZW4oZmllbGRzKSkKLSAgbmFtZVRvRmllbGRNYXAgOj0gbWFrZShtYXBbc3RyaW5nXVRGaWVsZCkKLSAgaWRUb0ZpZWxkTWFwIDo9IG1ha2UobWFwW2ludF1URmllbGQpCi0gIGZvciBpLCBmaWVsZCA6PSByYW5nZSBmaWVsZHMgewotICAgIHNvcnRlZEZpZWxkc1tpXSA9IGZpZWxkCi0gICAgaWRUb0ZpZWxkTWFwW2ZpZWxkLklkKCldID0gZmllbGQKLSAgICBpZiBmaWVsZC5OYW1lKCkgIT0gIiIgewotICAgICAgbmFtZVRvRmllbGRNYXBbZmllbGQuTmFtZSgpXSA9IGZpZWxkCi0gICAgfQotICB9Ci0gIHNvcnQuU29ydCh0RmllbGRBcnJheShzb3J0ZWRGaWVsZHMpKQotICByZXR1cm4gJnRGaWVsZENvbnRhaW5lcnsKLSAgICBmaWVsZHM6ICAgICAgICAgZmllbGRzLAotICAgIG5hbWVUb0ZpZWxkTWFwOiBuYW1lVG9GaWVsZE1hcCwKLSAgICBpZFRvRmllbGRNYXA6ICAgaWRUb0ZpZWxkTWFwLAotICB9Ci19Ci0KLWZ1bmMgKHAgKnRGaWVsZENvbnRhaW5lcikgRmllbGROYW1lRnJvbUZpZWxkSWQoaWQgaW50KSBzdHJpbmcgewotICBpZiBmaWVsZCwgb2sgOj0gcC5pZFRvRmllbGRNYXBbaWRdOyBvayB7Ci0gICAgcmV0dXJuIGZpZWxkLk5hbWUoKQotICB9Ci0gIHJldHVybiAiIgotfQotCi1mdW5jIChwICp0RmllbGRDb250YWluZXIpIEZpZWxkSWRGcm9tRmllbGROYW1lKG5hbWUgc3RyaW5nKSBpbnQgewotICBpZiBmaWVsZCwgb2sgOj0gcC5uYW1lVG9GaWVsZE1hcFtuYW1lXTsgb2sgewotICAgIHJldHVybiBmaWVsZC5JZCgpCi0gIH0KLSAgcmV0dXJuIC0xCi19Ci0KLWZ1bmMgKHAgKnRGaWVsZENvbnRhaW5lcikgRmllbGRGcm9tRmllbGRJZChpZCBpbnQpIFRGaWVsZCB7Ci0gIGlmIGZpZWxkLCBvayA6PSBwLmlkVG9GaWVsZE1hcFtpZF07IG9rIHsKLSAgICByZXR1cm4gZmllbGQKLSAgfQotICByZXR1cm4gQU5PTllNT1VTX0ZJRUxECi19Ci0KLWZ1bmMgKHAgKnRGaWVsZENvbnRhaW5lcikgRmllbGRGcm9tRmllbGROYW1lKG5hbWUgc3RyaW5nKSBURmllbGQgewotICBpZiBmaWVsZCwgb2sgOj0gcC5uYW1lVG9GaWVsZE1hcFtuYW1lXTsgb2sgewotICAgIHJldHVybiBmaWVsZAotICB9Ci0gIHJldHVybiBBTk9OWU1PVVNfRklFTEQKLX0KLQotZnVuYyAocCAqdEZpZWxkQ29udGFpbmVyKSBMZW4oKSBpbnQgewotICByZXR1cm4gbGVuKHAuZmllbGRzKQotfQotCi1mdW5jIChwICp0RmllbGRDb250YWluZXIpIEF0KGkgaW50KSBURmllbGQgewotICByZXR1cm4gcC5GaWVsZEZyb21GaWVsZElkKGkpCi19Ci0KLWZ1bmMgKHAgKnRGaWVsZENvbnRhaW5lcikgQ29udGFpbnMoZGF0YSBpbnRlcmZhY2V7fSkgYm9vbCB7Ci0gIGlmIGksIG9rIDo9IGRhdGEuKGludCk7IG9rIHsKLSAgICBmb3IgXywgZmllbGQgOj0gcmFuZ2UgcC5maWVsZHMgewotICAgICAgaWYgZmllbGQuSWQoKSA9PSBpIHsKLSAgICAgICAgcmV0dXJuIHRydWUKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZiBpLCBvayA6PSBkYXRhLihpbnQxNik7IG9rIHsKLSAgICBmb3IgXywgZmllbGQgOj0gcmFuZ2UgcC5maWVsZHMgewotICAgICAgaWYgZmllbGQuSWQoKSA9PSBpbnQoaSkgewotICAgICAgICByZXR1cm4gdHJ1ZQotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIGlmIHMsIG9rIDo9IGRhdGEuKHN0cmluZyk7IG9rIHsKLSAgICBmb3IgXywgZmllbGQgOj0gcmFuZ2UgcC5maWVsZHMgewotICAgICAgaWYgZmllbGQuTmFtZSgpID09IHMgewotICAgICAgICByZXR1cm4gdHJ1ZQotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIGlmIGYsIG9rIDo9IGRhdGEuKFRGaWVsZCk7IG9rIHsKLSAgICBmb3IgXywgZmllbGQgOj0gcmFuZ2UgcC5maWVsZHMgewotICAgICAgaWYgZmllbGQuRXF1YWxzKGYpIHsKLSAgICAgICAgcmV0dXJuIHRydWUKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlCi19Ci0KLWZ1bmMgKHAgKnRGaWVsZENvbnRhaW5lcikgRXF1YWxzKG90aGVyIGludGVyZmFjZXt9KSBib29sIHsKLSAgaWYgb3RoZXIgPT0gbmlsIHsKLSAgICByZXR1cm4gZmFsc2UKLSAgfQotICBpZiBkYXRhLCBvayA6PSBvdGhlci4oVEZpZWxkQ29udGFpbmVyKTsgb2sgewotICAgIGlmIHAuTGVuKCkgIT0gZGF0YS5MZW4oKSB7Ci0gICAgICByZXR1cm4gZmFsc2UKLSAgICB9Ci0gICAgZm9yIF8sIGZpZWxkIDo9IHJhbmdlIHAuZmllbGRzIHsKLSAgICAgIGlmICFkYXRhLkNvbnRhaW5zKGZpZWxkKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZQotICB9Ci0gIHJldHVybiBmYWxzZQotfQotCi1mdW5jIChwICp0RmllbGRDb250YWluZXIpIENvbXBhcmVUbyhvdGhlciBpbnRlcmZhY2V7fSkgKGludCwgYm9vbCkgewotICBpZiBvdGhlciA9PSBuaWwgewotICAgIHJldHVybiAxLCB0cnVlCi0gIH0KLSAgaWYgZGF0YSwgb2sgOj0gb3RoZXIuKFRGaWVsZENvbnRhaW5lcik7IG9rIHsKLSAgICBjb250LCBvazIgOj0gZGF0YS4oKnRGaWVsZENvbnRhaW5lcikKLSAgICBpZiBvazIgJiYgcCA9PSBjb250IHsKLSAgICAgIHJldHVybiAwLCB0cnVlCi0gICAgfQotICAgIGlmIGNtcCA6PSBDb21wYXJlSW50KHAuTGVuKCksIGRhdGEuTGVuKCkpOyBjbXAgIT0gMCB7Ci0gICAgICByZXR1cm4gY21wLCB0cnVlCi0gICAgfQotICAgIGZvciBfLCBmaWVsZCA6PSByYW5nZSBwLmZpZWxkcyB7Ci0gICAgICBpZiBjbXAsIG9rMyA6PSBmaWVsZC5Db21wYXJlVG8oZGF0YS5BdChmaWVsZC5JZCgpKSk7ICFvazMgfHwgY21wICE9IDAgewotICAgICAgICByZXR1cm4gY21wLCBvazMKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDAsIHRydWUKLSAgfQotICByZXR1cm4gMCwgZmFsc2UKLX0KLQotZnVuYyAocCAqdEZpZWxkQ29udGFpbmVyKSBJdGVyKCkgPC1jaGFuIFRGaWVsZCB7Ci0gIGMgOj0gbWFrZShjaGFuIFRGaWVsZCkKLSAgZ28gcC5pdGVyYXRlKGMpCi0gIHJldHVybiBjCi19Ci0KLWZ1bmMgKHAgKnRGaWVsZENvbnRhaW5lcikgaXRlcmF0ZShjIGNoYW48LSBURmllbGQpIHsKLSAgZm9yIF8sIHYgOj0gcmFuZ2UgcC5maWVsZHMgewotICAgIGMgPC0gdgotICB9Ci0gIGNsb3NlKGMpCi19Ci0KLWZ1bmMgaW5pdCgpIHsKLSAgQU5PTllNT1VTX0ZJRUxEID0gTmV3VEZpZWxkKCIiLCBTVE9QLCAwKQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90ZnJhbWVkX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvdGZyYW1lZF90cmFuc3BvcnQuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMDQ5Y2IuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90ZnJhbWVkX3RyYW5zcG9ydC5nbworKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLWltcG9ydCAoCi0gICJlbmNvZGluZy9iaW5hcnkiCi0gICJieXRlcyIKLSAgIm9zIgotKQotCi0KLXR5cGUgVEZyYW1lZFRyYW5zcG9ydCBzdHJ1Y3QgewotICB0cmFuc3BvcnQgICBUVHJhbnNwb3J0Ci0gIHdyaXRlQnVmZmVyICpieXRlcy5CdWZmZXIKLSAgcmVhZEJ1ZmZlciAgKmJ5dGVzLkJ1ZmZlcgotfQotCi10eXBlIHRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdCB7Ci0gIGZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnkKLX0KLQotZnVuYyBOZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeShmYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5KSBUVHJhbnNwb3J0RmFjdG9yeSB7Ci0gIHJldHVybiAmdEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnl7ZmFjdG9yeTogZmFjdG9yeX0KLX0KLQotZnVuYyAocCAqdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydChiYXNlIFRUcmFuc3BvcnQpIFRUcmFuc3BvcnQgewotICByZXR1cm4gTmV3VEZyYW1lZFRyYW5zcG9ydChwLmZhY3RvcnkuR2V0VHJhbnNwb3J0KGJhc2UpKQotfQotCi1mdW5jIE5ld1RGcmFtZWRUcmFuc3BvcnQodHJhbnNwb3J0IFRUcmFuc3BvcnQpICpURnJhbWVkVHJhbnNwb3J0IHsKLSAgd3JpdGVCdWYgOj0gbWFrZShbXWJ5dGUsIDAsIDEwMjQpCi0gIHJlYWRCdWYgOj0gbWFrZShbXWJ5dGUsIDAsIDEwMjQpCi0gIHJldHVybiAmVEZyYW1lZFRyYW5zcG9ydHt0cmFuc3BvcnQ6IHRyYW5zcG9ydCwgd3JpdGVCdWZmZXI6IGJ5dGVzLk5ld0J1ZmZlcih3cml0ZUJ1ZiksIHJlYWRCdWZmZXI6IGJ5dGVzLk5ld0J1ZmZlcihyZWFkQnVmKX0KLX0KLQotZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgT3BlbigpIG9zLkVycm9yIHsKLSAgcmV0dXJuIHAudHJhbnNwb3J0Lk9wZW4oKQotfQotCi1mdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBJc09wZW4oKSBib29sIHsKLSAgcmV0dXJuIHAudHJhbnNwb3J0LklzT3BlbigpCi19Ci0KLWZ1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIFBlZWsoKSBib29sIHsKLSAgcmV0dXJuIHAudHJhbnNwb3J0LlBlZWsoKQotfQotCi1mdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBDbG9zZSgpIG9zLkVycm9yIHsKLSAgcmV0dXJuIHAudHJhbnNwb3J0LkNsb3NlKCkKLX0KLQotZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgUmVhZChidWYgW11ieXRlKSAoaW50LCBvcy5FcnJvcikgewotICBpZiBwLnJlYWRCdWZmZXIuTGVuKCkgPiAwIHsKLSAgICBnb3QsIGVyciA6PSBwLnJlYWRCdWZmZXIuUmVhZChidWYpCi0gICAgaWYgZ290ID4gMCB7Ci0gICAgICByZXR1cm4gZ290LCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotICAgIH0KLSAgfQotCi0gIC8vIFJlYWQgYW5vdGhlciBmcmFtZSBvZiBkYXRhCi0gIHAucmVhZEZyYW1lKCkKLQotICBnb3QsIGVyciA6PSBwLnJlYWRCdWZmZXIuUmVhZChidWYpCi0gIHJldHVybiBnb3QsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi19Ci0KLWZ1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIFJlYWRBbGwoYnVmIFtdYnl0ZSkgKGludCwgb3MuRXJyb3IpIHsKLSAgcmV0dXJuIFJlYWRBbGxUcmFuc3BvcnQocCwgYnVmKQotfQotCi1mdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBXcml0ZShidWYgW11ieXRlKSAoaW50LCBvcy5FcnJvcikgewotICBuLCBlcnIgOj0gcC53cml0ZUJ1ZmZlci5Xcml0ZShidWYpCi0gIHJldHVybiBuLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotfQotCi1mdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBGbHVzaCgpIG9zLkVycm9yIHsKLSAgc2l6ZSA6PSBwLndyaXRlQnVmZmVyLkxlbigpCi0gIGJ1ZiA6PSBbXWJ5dGV7MCwgMCwgMCwgMH0KLSAgYmluYXJ5LkJpZ0VuZGlhbi5QdXRVaW50MzIoYnVmLCB1aW50MzIoc2l6ZSkpCi0gIF8sIGVyciA6PSBwLnRyYW5zcG9ydC5Xcml0ZShidWYpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotICB9Ci0gIGlmIHNpemUgPiAwIHsKLSAgICBuLCBlcnIgOj0gcC53cml0ZUJ1ZmZlci5Xcml0ZVRvKHAudHJhbnNwb3J0KQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcHJpbnQoIkVycm9yIHdoaWxlIGZsdXNoaW5nIHdyaXRlIGJ1ZmZlciBvZiBzaXplICIsIHNpemUsICIgdG8gdHJhbnNwb3J0LCBvbmx5IHdyb3RlICIsIG4sICIgYnl0ZXM6ICIsIGVyci5TdHJpbmcoKSwgIlxuIikKLSAgICAgIHJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotICAgIH0KLSAgfQotICBlcnIgPSBwLnRyYW5zcG9ydC5GbHVzaCgpCi0gIHJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotfQotCi1mdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSByZWFkRnJhbWUoKSAoaW50LCBvcy5FcnJvcikgewotICBidWYgOj0gW11ieXRlezAsIDAsIDAsIDB9Ci0gIF8sIGVyciA6PSBwLnRyYW5zcG9ydC5SZWFkQWxsKGJ1ZikKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIDAsIGVycgotICB9Ci0gIHNpemUgOj0gaW50KGJpbmFyeS5CaWdFbmRpYW4uVWludDMyKGJ1ZikpCi0gIGlmIHNpemUgPCAwIHsKLSAgICAvLyBUT0RPKHBvbWFjaykgbG9nIGVycm9yCi0gICAgcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oVU5LTk9XTl9UUkFOU1BPUlRfRVhDRVBUSU9OLCAiUmVhZCBhIG5lZ2F0aXZlIGZyYW1lIHNpemUgKCIrc3RyaW5nKHNpemUpKyIpIikKLSAgfQotICBpZiBzaXplID09IDAgewotICAgIHJldHVybiAwLCBuaWwKLSAgfQotICBidWYyIDo9IG1ha2UoW11ieXRlLCBzaXplKQotICBuLCBlcnIgOj0gcC50cmFuc3BvcnQuUmVhZEFsbChidWYyKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gbiwgZXJyCi0gIH0KLSAgcC5yZWFkQnVmZmVyID0gYnl0ZXMuTmV3QnVmZmVyKGJ1ZjIpCi0gIHJldHVybiBzaXplLCBuaWwKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdGZyYW1lZF90cmFuc3BvcnRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvdGZyYW1lZF90cmFuc3BvcnRfdGVzdC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY2MzE4Yy4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3RmcmFtZWRfdHJhbnNwb3J0X3Rlc3QuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0X3Rlc3QKLQotaW1wb3J0ICgKLSAgLiAidGhyaWZ0IgotICAidGVzdGluZyIKLSkKLQotZnVuYyBUZXN0RnJhbWVkVHJhbnNwb3J0KHQgKnRlc3RpbmcuVCkgewotICB0cmFucyA6PSBOZXdURnJhbWVkVHJhbnNwb3J0KE5ld1RNZW1vcnlCdWZmZXIoKSkKLSAgVHJhbnNwb3J0VGVzdCh0LCB0cmFucywgdHJhbnMpCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RodHRwX2NsaWVudC5nbyBiL2xpYi9nby90aHJpZnQvdGh0dHBfY2xpZW50LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGRkOWNlLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdGh0dHBfY2xpZW50LmdvCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnQKLQotaW1wb3J0ICgKLSAgImJ5dGVzIgotICAiaHR0cCIKLSAgIm9zIgotICAic3RyY29udiIKLSkKLQotCi10eXBlIFRIdHRwQ2xpZW50IHN0cnVjdCB7Ci0gIHJlc3BvbnNlICAgICAgICAgICAqaHR0cC5SZXNwb25zZQotICB1cmwgICAgICAgICAgICAgICAgKmh0dHAuVVJMCi0gIHJlcXVlc3RCdWZmZXIgICAgICAqYnl0ZXMuQnVmZmVyCi0gIG5zZWNDb25uZWN0VGltZW91dCBpbnQ2NAotICBuc2VjUmVhZFRpbWVvdXQgICAgaW50NjQKLX0KLQotdHlwZSBUSHR0cENsaWVudFRyYW5zcG9ydEZhY3Rvcnkgc3RydWN0IHsKLSAgdXJsICAgIHN0cmluZwotICBpc1Bvc3QgYm9vbAotfQotCi1mdW5jIChwICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSBUVHJhbnNwb3J0IHsKLSAgaWYgdHJhbnMgIT0gbmlsIHsKLSAgICB0LCBvayA6PSB0cmFucy4oKlRIdHRwQ2xpZW50KQotICAgIGlmIG9rICYmIHQudXJsICE9IG5pbCB7Ci0gICAgICBpZiB0LnJlcXVlc3RCdWZmZXIgIT0gbmlsIHsKLSAgICAgICAgdDIsIF8gOj0gTmV3VEh0dHBQb3N0Q2xpZW50KHQudXJsLlN0cmluZygpKQotICAgICAgICByZXR1cm4gdDIKLSAgICAgIH0KLSAgICAgIHQyLCBfIDo9IE5ld1RIdHRwQ2xpZW50KHQudXJsLlN0cmluZygpKQotICAgICAgcmV0dXJuIHQyCi0gICAgfQotICB9Ci0gIGlmIHAuaXNQb3N0IHsKLSAgICBzLCBfIDo9IE5ld1RIdHRwUG9zdENsaWVudChwLnVybCkKLSAgICByZXR1cm4gcwotICB9Ci0gIHMsIF8gOj0gTmV3VEh0dHBDbGllbnQocC51cmwpCi0gIHJldHVybiBzCi19Ci0KLWZ1bmMgTmV3VEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5KHVybCBzdHJpbmcpICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgewotICByZXR1cm4gJlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeXt1cmw6IHVybCwgaXNQb3N0OiBmYWxzZX0KLX0KLQotZnVuYyBOZXdUSHR0cFBvc3RDbGllbnRUcmFuc3BvcnRGYWN0b3J5KHVybCBzdHJpbmcpICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgewotICByZXR1cm4gJlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeXt1cmw6IHVybCwgaXNQb3N0OiB0cnVlfQotfQotCi0KLWZ1bmMgTmV3VEh0dHBDbGllbnQodXJsIHN0cmluZykgKFRUcmFuc3BvcnQsIG9zLkVycm9yKSB7Ci0gIHBhcnNlZFVSTCwgZXJyIDo9IGh0dHAuUGFyc2VVUkwodXJsKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gbmlsLCBlcnIKLSAgfQotICByZXNwb25zZSwgZXJyIDo9IGh0dHAuR2V0KHVybCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIG5pbCwgZXJyCi0gIH0KLSAgcmV0dXJuICZUSHR0cENsaWVudHtyZXNwb25zZTogcmVzcG9uc2UsIHVybDogcGFyc2VkVVJMfSwgbmlsCi19Ci0KLWZ1bmMgTmV3VEh0dHBQb3N0Q2xpZW50KHVybCBzdHJpbmcpIChUVHJhbnNwb3J0LCBvcy5FcnJvcikgewotICBwYXJzZWRVUkwsIGVyciA6PSBodHRwLlBhcnNlVVJMKHVybCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIG5pbCwgZXJyCi0gIH0KLSAgYnVmIDo9IG1ha2UoW11ieXRlLCAwLCAxMDI0KQotICByZXR1cm4gJlRIdHRwQ2xpZW50e3VybDogcGFyc2VkVVJMLCByZXF1ZXN0QnVmZmVyOiBieXRlcy5OZXdCdWZmZXIoYnVmKX0sIG5pbAotfQotCi1mdW5jIChwICpUSHR0cENsaWVudCkgT3BlbigpIG9zLkVycm9yIHsKLSAgLy8gZG8gbm90aGluZwotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRIdHRwQ2xpZW50KSBJc09wZW4oKSBib29sIHsKLSAgcmV0dXJuIHAucmVzcG9uc2UgIT0gbmlsIHx8IHAucmVxdWVzdEJ1ZmZlciAhPSBuaWwKLX0KLQotZnVuYyAocCAqVEh0dHBDbGllbnQpIFBlZWsoKSBib29sIHsKLSAgcmV0dXJuIHAuSXNPcGVuKCkKLX0KLQotZnVuYyAocCAqVEh0dHBDbGllbnQpIENsb3NlKCkgb3MuRXJyb3IgewotICBpZiBwLnJlc3BvbnNlICE9IG5pbCAmJiBwLnJlc3BvbnNlLkJvZHkgIT0gbmlsIHsKLSAgICBlcnIgOj0gcC5yZXNwb25zZS5Cb2R5LkNsb3NlKCkKLSAgICBwLnJlc3BvbnNlID0gbmlsCi0gICAgcmV0dXJuIGVycgotICB9Ci0gIGlmIHAucmVxdWVzdEJ1ZmZlciAhPSBuaWwgewotICAgIHAucmVxdWVzdEJ1ZmZlci5SZXNldCgpCi0gICAgcC5yZXF1ZXN0QnVmZmVyID0gbmlsCi0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUSHR0cENsaWVudCkgUmVhZChidWYgW11ieXRlKSAoaW50LCBvcy5FcnJvcikgewotICBpZiBwLnJlc3BvbnNlID09IG5pbCB7Ci0gICAgcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJSZXNwb25zZSBidWZmZXIgaXMgZW1wdHksIG5vIHJlcXVlc3QuIikKLSAgfQotICBuLCBlcnIgOj0gcC5yZXNwb25zZS5Cb2R5LlJlYWQoYnVmKQotICByZXR1cm4gbiwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLX0KLQotZnVuYyAocCAqVEh0dHBDbGllbnQpIFJlYWRBbGwoYnVmIFtdYnl0ZSkgKGludCwgb3MuRXJyb3IpIHsKLSAgcmV0dXJuIFJlYWRBbGxUcmFuc3BvcnQocCwgYnVmKQotfQotCi1mdW5jIChwICpUSHR0cENsaWVudCkgV3JpdGUoYnVmIFtdYnl0ZSkgKGludCwgb3MuRXJyb3IpIHsKLSAgbiwgZXJyIDo9IHAucmVxdWVzdEJ1ZmZlci5Xcml0ZShidWYpCi0gIHJldHVybiBuLCBlcnIKLX0KLQotZnVuYyAocCAqVEh0dHBDbGllbnQpIEZsdXNoKCkgb3MuRXJyb3IgewotICByZXNwb25zZSwgZXJyIDo9IGh0dHAuUG9zdChwLnVybC5TdHJpbmcoKSwgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IiwgcC5yZXF1ZXN0QnVmZmVyKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLSAgfQotICBpZiByZXNwb25zZS5TdGF0dXNDb2RlICE9IGh0dHAuU3RhdHVzT0sgewotICAgIC8vIFRPRE8ocG9tYWNrKSBsb2cgYmFkIHJlc3BvbnNlCi0gICAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oVU5LTk9XTl9UUkFOU1BPUlRfRVhDRVBUSU9OLCAiSFRUUCBSZXNwb25zZSBjb2RlOiAiKyBzdHJjb252Lkl0b2EocmVzcG9uc2UuU3RhdHVzQ29kZSkpCi0gIH0KLSAgcC5yZXNwb25zZSA9IHJlc3BvbnNlCi0gIHJldHVybiBuaWwKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdGh0dHBfY2xpZW50X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3RodHRwX2NsaWVudF90ZXN0LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGQyZjUwLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdGh0dHBfY2xpZW50X3Rlc3QuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0X3Rlc3QKLQotaW1wb3J0ICgKLSAgLiAidGhyaWZ0IgotICAidGVzdGluZyIKLSkKLQotZnVuYyBUZXN0SHR0cENsaWVudCh0ICp0ZXN0aW5nLlQpIHsKLSAgbCwgYWRkciA6PSBIdHRwQ2xpZW50U2V0dXBGb3JUZXN0KHQpCi0gIGlmIGwgIT0gbmlsIHsKLSAgICBkZWZlciBsLkNsb3NlKCkKLSAgfQotICB0cmFucywgZXJyIDo9IE5ld1RIdHRwUG9zdENsaWVudCgiaHR0cDovLyIgKyBhZGRyLlN0cmluZygpKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICBsLkNsb3NlKCkKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIGNvbm5lY3QgdG8gJXM6ICVzIiwgYWRkci5TdHJpbmcoKSwgZXJyKQotICB9Ci0gIFRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90aW9zdHJlYW1fdHJhbnNwb3J0LmdvIGIvbGliL2dvL3RocmlmdC90aW9zdHJlYW1fdHJhbnNwb3J0LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzRiZWVhLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdGlvc3RyZWFtX3RyYW5zcG9ydC5nbworKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLWltcG9ydCAoCi0gICJidWZpbyIKLSAgImlvIgotICAib3MiCi0pCi0KLS8qKgotICogVGhpcyBpcyB0aGUgbW9zdCBjb21tb25seSB1c2VkIGJhc2UgdHJhbnNwb3J0LiBJdCB0YWtlcyBhbiBJbnB1dFN0cmVhbQotICogYW5kIGFuIE91dHB1dFN0cmVhbSBhbmQgdXNlcyB0aG9zZSB0byBwZXJmb3JtIGFsbCB0cmFuc3BvcnQgb3BlcmF0aW9ucy4KLSAqIFRoaXMgYWxsb3dzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggYWxsIHRoZSBuaWNlIGNvbnN0cnVjdHMgSmF2YSBhbHJlYWR5Ci0gKiBoYXMgdG8gcHJvdmlkZSBhIHZhcmlldHkgb2YgdHlwZXMgb2Ygc3RyZWFtcy4KLSAqCi0gKi8KLXR5cGUgVElPU3RyZWFtVHJhbnNwb3J0IHN0cnVjdCB7Ci0gIFJlYWRlciAgICAgICBpby5SZWFkZXIKLSAgV3JpdGVyICAgICAgIGlvLldyaXRlcgotICBJc1JlYWRXcml0ZXIgYm9vbAotfQotCi10eXBlIFRJT1N0cmVhbVRyYW5zcG9ydEZhY3Rvcnkgc3RydWN0IHsKLSAgUmVhZGVyICAgICAgIGlvLlJlYWRlcgotICBXcml0ZXIgICAgICAgaW8uV3JpdGVyCi0gIElzUmVhZFdyaXRlciBib29sCi19Ci0KLWZ1bmMgKHAgKlRJT1N0cmVhbVRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSBUVHJhbnNwb3J0IHsKLSAgaWYgdHJhbnMgIT0gbmlsIHsKLSAgICB0LCBvayA6PSB0cmFucy4oKlRJT1N0cmVhbVRyYW5zcG9ydCkKLSAgICBpZiBvayB7Ci0gICAgICBpZiB0LklzUmVhZFdyaXRlciB7Ci0gICAgICAgIHJldHVybiBOZXdUSU9TdHJlYW1UcmFuc3BvcnRSVyh0LlJlYWRlci4oaW8uUmVhZFdyaXRlcikpCi0gICAgICB9Ci0gICAgICBpZiB0LlJlYWRlciAhPSBuaWwgJiYgdC5Xcml0ZXIgIT0gbmlsIHsKLSAgICAgICAgcmV0dXJuIE5ld1RJT1N0cmVhbVRyYW5zcG9ydFJBbmRXKHQuUmVhZGVyLCB0LldyaXRlcikKLSAgICAgIH0KLSAgICAgIGlmIHQuUmVhZGVyICE9IG5pbCAmJiB0LldyaXRlciA9PSBuaWwgewotICAgICAgICByZXR1cm4gTmV3VElPU3RyZWFtVHJhbnNwb3J0Uih0LlJlYWRlcikKLSAgICAgIH0KLSAgICAgIGlmIHQuUmVhZGVyID09IG5pbCAmJiB0LldyaXRlciAhPSBuaWwgewotICAgICAgICByZXR1cm4gTmV3VElPU3RyZWFtVHJhbnNwb3J0Vyh0LldyaXRlcikKLSAgICAgIH0KLSAgICAgIHJldHVybiBOZXdUSU9TdHJlYW1UcmFuc3BvcnREZWZhdWx0KCkKLSAgICB9Ci0gIH0KLSAgaWYgcC5Jc1JlYWRXcml0ZXIgewotICAgIHJldHVybiBOZXdUSU9TdHJlYW1UcmFuc3BvcnRSVyhwLlJlYWRlci4oaW8uUmVhZFdyaXRlcikpCi0gIH0KLSAgaWYgcC5SZWFkZXIgIT0gbmlsICYmIHAuV3JpdGVyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RJT1N0cmVhbVRyYW5zcG9ydFJBbmRXKHAuUmVhZGVyLCBwLldyaXRlcikKLSAgfQotICBpZiBwLlJlYWRlciAhPSBuaWwgJiYgcC5Xcml0ZXIgPT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VElPU3RyZWFtVHJhbnNwb3J0UihwLlJlYWRlcikKLSAgfQotICBpZiBwLlJlYWRlciA9PSBuaWwgJiYgcC5Xcml0ZXIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VElPU3RyZWFtVHJhbnNwb3J0VyhwLldyaXRlcikKLSAgfQotICByZXR1cm4gTmV3VElPU3RyZWFtVHJhbnNwb3J0RGVmYXVsdCgpCi19Ci0KLWZ1bmMgTmV3VElPU3RyZWFtVHJhbnNwb3J0RmFjdG9yeShyZWFkZXIgaW8uUmVhZGVyLCB3cml0ZXIgaW8uV3JpdGVyLCBpc1JlYWRXcml0ZXIgYm9vbCkgKlRJT1N0cmVhbVRyYW5zcG9ydEZhY3RvcnkgewotICByZXR1cm4gJlRJT1N0cmVhbVRyYW5zcG9ydEZhY3Rvcnl7UmVhZGVyOiByZWFkZXIsIFdyaXRlcjogd3JpdGVyLCBJc1JlYWRXcml0ZXI6IGlzUmVhZFdyaXRlcn0KLX0KLQotCi0vKioKLSAqIFN1YmNsYXNzZXMgY2FuIGludm9rZSB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBhbmQgdGhlbiBhc3NpZ24gdGhlIGlucHV0Ci0gKiBzdHJlYW1zIGluIHRoZSBvcGVuIG1ldGhvZC4KLSAqLwotZnVuYyBOZXdUSU9TdHJlYW1UcmFuc3BvcnREZWZhdWx0KCkgKlRJT1N0cmVhbVRyYW5zcG9ydCB7Ci0gIHJldHVybiAmVElPU3RyZWFtVHJhbnNwb3J0e30KLX0KLQotLyoqCi0gKiBJbnB1dCBzdHJlYW0gY29uc3RydWN0b3IuCi0gKgotICogQHBhcmFtIGlzIElucHV0IHN0cmVhbSB0byByZWFkIGZyb20KLSAqLwotZnVuYyBOZXdUSU9TdHJlYW1UcmFuc3BvcnRSKHIgaW8uUmVhZGVyKSAqVElPU3RyZWFtVHJhbnNwb3J0IHsKLSAgcmV0dXJuICZUSU9TdHJlYW1UcmFuc3BvcnR7UmVhZGVyOiBidWZpby5OZXdSZWFkZXIocil9Ci19Ci0KLS8qKgotICogT3V0cHV0IHN0cmVhbSBjb25zdHJ1Y3Rvci4KLSAqCi0gKiBAcGFyYW0gb3MgT3V0cHV0IHN0cmVhbSB0byByZWFkIGZyb20KLSAqLwotZnVuYyBOZXdUSU9TdHJlYW1UcmFuc3BvcnRXKHcgaW8uV3JpdGVyKSAqVElPU3RyZWFtVHJhbnNwb3J0IHsKLSAgcmV0dXJuICZUSU9TdHJlYW1UcmFuc3BvcnR7V3JpdGVyOiBidWZpby5OZXdXcml0ZXIodyl9Ci19Ci0KLS8qKgotICogVHdvLXdheSBzdHJlYW0gY29uc3RydWN0b3IuCi0gKgotICogQHBhcmFtIGlzIElucHV0IHN0cmVhbSB0byByZWFkIGZyb20KLSAqIEBwYXJhbSBvcyBPdXRwdXQgc3RyZWFtIHRvIHJlYWQgZnJvbQotICovCi1mdW5jIE5ld1RJT1N0cmVhbVRyYW5zcG9ydFJBbmRXKHIgaW8uUmVhZGVyLCB3IGlvLldyaXRlcikgKlRJT1N0cmVhbVRyYW5zcG9ydCB7Ci0gIHJldHVybiAmVElPU3RyZWFtVHJhbnNwb3J0e1JlYWRlcjogYnVmaW8uTmV3UmVhZGVyKHIpLCBXcml0ZXI6IGJ1ZmlvLk5ld1dyaXRlcih3KX0KLX0KLQotLyoqCi0gKiBUd28td2F5IHN0cmVhbSBjb25zdHJ1Y3Rvci4KLSAqCi0gKiBAcGFyYW0gaXMgSW5wdXQgc3RyZWFtIHRvIHJlYWQgZnJvbQotICogQHBhcmFtIG9zIE91dHB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tCi0gKi8KLWZ1bmMgTmV3VElPU3RyZWFtVHJhbnNwb3J0UlcocncgaW8uUmVhZFdyaXRlcikgKlRJT1N0cmVhbVRyYW5zcG9ydCB7Ci0gIC8vIGJ1ZmlvIGhhcyBhIGJ1ZyB3aGVyZSBvbmNlIGEgUmVhZGVyIGhpdHMgRU9GLCBhIG5ldyBXcml0ZSBuZXZlciBicmluZ3MgdGhlIHJlYWRlciBvdXQgb2YgRU9GCi0gIC8vIGV2ZW4gaWYgcmVhZGVyIGFuZCB3cml0ZXIgdXNlIHRoZSBzYW1lIHVuZGVybGllcgotICAvL2J1ZnJ3IDo9IGJ1ZmlvLk5ld1JlYWRXcml0ZXIoYnVmaW8uTmV3UmVhZGVyKHJ3KSwgYnVmaW8uTmV3V3JpdGVyKHJ3KSk7Ci0gIHJldHVybiAmVElPU3RyZWFtVHJhbnNwb3J0e1JlYWRlcjogcncsIFdyaXRlcjogcncsIElzUmVhZFdyaXRlcjogdHJ1ZX0KLX0KLQotLyoqCi0gKiBUaGUgc3RyZWFtcyBtdXN0IGFscmVhZHkgYmUgb3BlbiBhdCBjb25zdHJ1Y3Rpb24gdGltZSwgc28gdGhpcyBzaG91bGQKLSAqIGFsd2F5cyByZXR1cm4gdHJ1ZS4KLSAqCi0gKiBAcmV0dXJuIHRydWUKLSAqLwotZnVuYyAocCAqVElPU3RyZWFtVHJhbnNwb3J0KSBJc09wZW4oKSBib29sIHsKLSAgcmV0dXJuIHRydWUKLX0KLQotLyoqCi0gKiBUaGUgc3RyZWFtcyBtdXN0IGFscmVhZHkgYmUgb3Blbi4gVGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgotICovCi1mdW5jIChwICpUSU9TdHJlYW1UcmFuc3BvcnQpIE9wZW4oKSBvcy5FcnJvciB7Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVElPU3RyZWFtVHJhbnNwb3J0KSBQZWVrKCkgYm9vbCB7Ci0gIHJldHVybiBwLklzT3BlbigpCi19Ci0KLS8qKgotICogQ2xvc2VzIGJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgc3RyZWFtcy4KLSAqLwotZnVuYyAocCAqVElPU3RyZWFtVHJhbnNwb3J0KSBDbG9zZSgpIG9zLkVycm9yIHsKLSAgY2xvc2VkUmVhZGVyIDo9IGZhbHNlCi0gIGlmIHAuUmVhZGVyICE9IG5pbCB7Ci0gICAgYywgb2sgOj0gcC5SZWFkZXIuKGlvLkNsb3NlcikKLSAgICBpZiBvayB7Ci0gICAgICBlIDo9IGMuQ2xvc2UoKQotICAgICAgY2xvc2VkUmVhZGVyID0gdHJ1ZQotICAgICAgaWYgZSAhPSBuaWwgewotICAgICAgICBMT0dHRVIuUHJpbnQoIkVycm9yIGNsb3NpbmcgaW5wdXQgc3RyZWFtLiIsIGUpCi0gICAgICB9Ci0gICAgfQotICAgIHAuUmVhZGVyID0gbmlsCi0gIH0KLSAgaWYgcC5Xcml0ZXIgIT0gbmlsICYmICghY2xvc2VkUmVhZGVyIHx8ICFwLklzUmVhZFdyaXRlcikgewotICAgIGMsIG9rIDo9IHAuV3JpdGVyLihpby5DbG9zZXIpCi0gICAgaWYgb2sgewotICAgICAgZSA6PSBjLkNsb3NlKCkKLSAgICAgIGlmIGUgIT0gbmlsIHsKLSAgICAgICAgTE9HR0VSLlByaW50KCJFcnJvciBjbG9zaW5nIG91dHB1dCBzdHJlYW0uIiwgZSkKLSAgICAgIH0KLSAgICB9Ci0gICAgcC5Xcml0ZXIgPSBuaWwKLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLS8qKgotICogUmVhZHMgZnJvbSB0aGUgdW5kZXJseWluZyBpbnB1dCBzdHJlYW0gaWYgbm90IG51bGwuCi0gKi8KLWZ1bmMgKHAgKlRJT1N0cmVhbVRyYW5zcG9ydCkgUmVhZChidWYgW11ieXRlKSAoaW50LCBvcy5FcnJvcikgewotICBpZiBwLlJlYWRlciA9PSBuaWwgewotICAgIHJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IHJlYWQgZnJvbSBudWxsIGlucHV0U3RyZWFtIikKLSAgfQotICBuLCBlcnIgOj0gcC5SZWFkZXIuUmVhZChidWYpCi0gIHJldHVybiBuLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotfQotCi1mdW5jIChwICpUSU9TdHJlYW1UcmFuc3BvcnQpIFJlYWRBbGwoYnVmIFtdYnl0ZSkgKGludCwgb3MuRXJyb3IpIHsKLSAgcmV0dXJuIFJlYWRBbGxUcmFuc3BvcnQocCwgYnVmKQotfQotCi0KLS8qKgotICogV3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gaWYgbm90IG51bGwuCi0gKi8KLWZ1bmMgKHAgKlRJT1N0cmVhbVRyYW5zcG9ydCkgV3JpdGUoYnVmIFtdYnl0ZSkgKGludCwgb3MuRXJyb3IpIHsKLSAgaWYgcC5Xcml0ZXIgPT0gbmlsIHsKLSAgICBMT0dHRVIuUHJpbnQoIkNvdWxkIG5vdCB3cml0ZSB0byBpb3N0cmVhbSBhcyBXcml0ZXIgaXMgbnVsbFxuIikKLSAgICByZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNhbm5vdCB3cml0ZSB0byBudWxsIG91dHB1dFN0cmVhbSIpCi0gIH0KLSAgbiwgZXJyIDo9IHAuV3JpdGVyLldyaXRlKGJ1ZikKLSAgaWYgbiA9PSAwIHx8IGVyciAhPSBuaWwgewotICAgIExPR0dFUi5QcmludCgiRXJyb3Igd3JpdGluZyB0byBpb3N0cmVhbSwgb25seSB3cm90ZSAiLCBuLCAiIGJ5dGVzOiAiLCBlcnIuU3RyaW5nKCksICJcbiIpCi0gIH0KLSAgcmV0dXJuIG4sIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi19Ci0KLS8qKgotICogRmx1c2hlcyB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtIGlmIG5vdCBudWxsLgotICovCi1mdW5jIChwICpUSU9TdHJlYW1UcmFuc3BvcnQpIEZsdXNoKCkgb3MuRXJyb3IgewotICBpZiBwLldyaXRlciA9PSBuaWwgewotICAgIHJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IGZsdXNoIG51bGwgb3V0cHV0U3RyZWFtIikKLSAgfQotICBmLCBvayA6PSBwLldyaXRlci4oRmx1c2hlcikKLSAgaWYgb2sgewotICAgIGVyciA6PSBmLkZsdXNoKCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotICAgIH0KLSAgfQotICByZXR1cm4gbmlsCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3Rpb3N0cmVhbV90cmFuc3BvcnRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvdGlvc3RyZWFtX3RyYW5zcG9ydF90ZXN0LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzQyNWM3Li4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdGlvc3RyZWFtX3RyYW5zcG9ydF90ZXN0LmdvCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdF90ZXN0Ci0KLWltcG9ydCAoCi0gIC4gInRocmlmdCIKLSAgInRlc3RpbmciCi0gICJieXRlcyIKLSkKLQotZnVuYyBUZXN0SU9TdHJlYW1UcmFuc3BvcnQodCAqdGVzdGluZy5UKSB7Ci0gIHRyYW5zIDo9IE5ld1RJT1N0cmVhbVRyYW5zcG9ydFJXKGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgMTAyNCkpKQotICBUcmFuc3BvcnRUZXN0KHQsIHRyYW5zLCB0cmFucykKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdGpzb25fcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L3Rqc29uX3Byb3RvY29sLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWFiNzAwLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdGpzb25fcHJvdG9jb2wuZ28KKysrIC9kZXYvbnVsbApAQCAtMSw1MzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi1pbXBvcnQgKAotICAiZW5jb2RpbmcvYmFzZTY0IgotICAiZm10IgotKQotCi1jb25zdCAoCi0gIFRIUklGVF9KU09OX1BST1RPQ09MX1ZFUlNJT04gPSAxCi0pCi0KLS8vIGZvciByZWZlcmVuY2VzIHRvIF9QYXJzZUNvbnRleHQgc2VlIHRzaW1wbGVqc29uX3Byb3RvY29sLmdvCi0KLS8qKgotICogSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgotICoKLSAqIFRoaXMgcHJvdG9jb2wgcHJvZHVjZXMvY29uc3VtZXMgYSBzaW1wbGUgb3V0cHV0IGZvcm1hdAotICogc3VpdGFibGUgZm9yIHBhcnNpbmcgYnkgc2NyaXB0aW5nIGxhbmd1YWdlcy4gIEl0IHNob3VsZCBub3QgYmUKLSAqIGNvbmZ1c2VkIHdpdGggdGhlIGZ1bGwtZmVhdHVyZWQgVEpTT05Qcm90b2NvbC4KLSAqCi0gKi8KLXR5cGUgVEpTT05Qcm90b2NvbCBzdHJ1Y3QgewotICAqVFNpbXBsZUpTT05Qcm90b2NvbAotfQotCi0vKioKLSAqIENvbnN0cnVjdG9yCi0gKi8KLWZ1bmMgTmV3VEpTT05Qcm90b2NvbCh0IFRUcmFuc3BvcnQpICpUSlNPTlByb3RvY29sIHsKLSAgdiA6PSAmVEpTT05Qcm90b2NvbHtUU2ltcGxlSlNPTlByb3RvY29sOiBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHQpfQotICB2LnBhcnNlQ29udGV4dFN0YWNrLlB1c2goaW50KF9DT05URVhUX0lOX1RPUExFVkVMKSkKLSAgdi5kdW1wQ29udGV4dC5QdXNoKGludChfQ09OVEVYVF9JTl9UT1BMRVZFTCkpCi0gIHJldHVybiB2Ci19Ci0KLS8qKgotICogRmFjdG9yeQotICovCi10eXBlIFRKU09OUHJvdG9jb2xGYWN0b3J5IHN0cnVjdHt9Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2xGYWN0b3J5KSBHZXRQcm90b2NvbCh0cmFucyBUVHJhbnNwb3J0KSBUUHJvdG9jb2wgewotICByZXR1cm4gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKLX0KLQotZnVuYyBOZXdUSlNPTlByb3RvY29sRmFjdG9yeSgpICpUSlNPTlByb3RvY29sRmFjdG9yeSB7Ci0gIHJldHVybiAmVEpTT05Qcm90b2NvbEZhY3Rvcnl7fQotfQotCi0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlTWVzc2FnZUJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFJZCBpbnQzMikgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgaWYgZSA6PSBwLk91dHB1dExpc3RCZWdpbigpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICBpZiBlIDo9IHAuV3JpdGVJMzIoVEhSSUZUX0pTT05fUFJPVE9DT0xfVkVSU0lPTik7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIGlmIGUgOj0gcC5Xcml0ZVN0cmluZyhuYW1lKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgaWYgZSA6PSBwLldyaXRlQnl0ZShieXRlKHR5cGVJZCkpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICBpZiBlIDo9IHAuV3JpdGVJMzIoc2VxSWQpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlTWVzc2FnZUVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLk91dHB1dExpc3RFbmQoKQotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZVN0cnVjdEJlZ2luKG5hbWUgc3RyaW5nKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiBlIDo9IHAuT3V0cHV0T2JqZWN0QmVnaW4oKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZVN0cnVjdEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLk91dHB1dE9iamVjdEVuZCgpCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlRmllbGRCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRUeXBlLCBpZCBpbnQxNikgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgaWYgZSA6PSBwLldyaXRlSTE2KGlkKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgaWYgZSA6PSBwLk91dHB1dE9iamVjdEJlZ2luKCk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIGlmIGUgOj0gcC5Xcml0ZVN0cmluZyhwLlR5cGVJZFRvU3RyaW5nKHR5cGVJZCkpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlRmllbGRFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5PdXRwdXRPYmplY3RFbmQoKQotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUZpZWxkU3RvcCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7IHJldHVybiBuaWwgfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZU1hcEJlZ2luKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGlmIGUgOj0gcC5PdXRwdXRMaXN0QmVnaW4oKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgaWYgZSA6PSBwLldyaXRlU3RyaW5nKHAuVHlwZUlkVG9TdHJpbmcoa2V5VHlwZSkpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICBpZiBlIDo9IHAuV3JpdGVTdHJpbmcocC5UeXBlSWRUb1N0cmluZyh2YWx1ZVR5cGUpKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgcmV0dXJuIHAuV3JpdGVJNjQoaW50NjQoc2l6ZSkpCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlTWFwRW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuT3V0cHV0TGlzdEVuZCgpCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuT3V0cHV0RWxlbUxpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSkKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVMaXN0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuT3V0cHV0TGlzdEVuZCgpCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlU2V0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5PdXRwdXRFbGVtTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKQotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZVNldEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLk91dHB1dExpc3RFbmQoKQotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUJvb2woYiBib29sKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5PdXRwdXRCb29sKGIpCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlQnl0ZShiIGJ5dGUpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLldyaXRlSTMyKGludDMyKGIpKQotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUkxNih2IGludDE2KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5Xcml0ZUkzMihpbnQzMih2KSkKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVJMzIodiBpbnQzMikgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuT3V0cHV0STY0KGludDY0KHYpKQotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUk2NCh2IGludDY0KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5PdXRwdXRJNjQoaW50NjQodikpCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlRG91YmxlKHYgZmxvYXQ2NCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuT3V0cHV0RjY0KHYpCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlU3RyaW5nKHYgc3RyaW5nKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5PdXRwdXRTdHJpbmcodikKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVCaW5hcnkodiBbXWJ5dGUpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIC8vIEpTT04gbGlicmFyeSBvbmx5IHRha2VzIGluIGEgc3RyaW5nLCAKLSAgLy8gbm90IGFuIGFyYml0cmFyeSBieXRlIGFycmF5LCB0byBlbnN1cmUgYnl0ZXMgYXJlIHRyYW5zbWl0dGVkCi0gIC8vIGVmZmljaWVudGx5IHdlIG11c3QgY29udmVydCB0aGlzIGludG8gYSB2YWxpZCBKU09OIHN0cmluZwotICAvLyB0aGVyZWZvcmUgd2UgdXNlIGJhc2U2NCBlbmNvZGluZyB0byBhdm9pZCBleGNlc3NpdmUgZXNjYXBpbmcvcXVvdGluZwotICBpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgcC53cml0ZXIuV3JpdGUoSlNPTl9RVU9URV9CWVRFUykKLSAgd3JpdGVyIDo9IGJhc2U2NC5OZXdFbmNvZGVyKGJhc2U2NC5TdGRFbmNvZGluZywgcC53cml0ZXIpCi0gIGlmIF8sIGUgOj0gd3JpdGVyLldyaXRlKHYpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gIH0KLSAgd3JpdGVyLkNsb3NlKCkKLSAgcC53cml0ZXIuV3JpdGUoSlNPTl9RVU9URV9CWVRFUykKLSAgcmV0dXJuIHAuT3V0cHV0UG9zdFZhbHVlKCkKLX0KLQotLyoqCi0gKiBSZWFkaW5nIG1ldGhvZHMuCi0gKi8KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZE1lc3NhZ2VCZWdpbigpIChuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxSWQgaW50MzIsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgaWYgaXNOdWxsLCBlcnIgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgotICB9Ci0gIHZlcnNpb24sIGVyciA6PSBwLlJlYWRJMzIoKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCi0gIH0KLSAgaWYgdmVyc2lvbiAhPSBUSFJJRlRfSlNPTl9QUk9UT0NPTF9WRVJTSU9OIHsKLSAgICByZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgZm10LlNwcmludCgiVW5rbm93biBQcm90b2NvbCB2ZXJzaW9uICIsIHZlcnNpb24sICIsIGV4cGVjdGVkIHZlcnNpb24gIiwgVEhSSUZUX0pTT05fUFJPVE9DT0xfVkVSU0lPTiwgIlxuIikpCi0gIH0KLSAgaWYgbmFtZSwgZXJyID0gcC5SZWFkU3RyaW5nKCk7IGVyciAhPSBuaWwgewotICAgIHJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlcnIKLSAgfQotICBiVHlwZUlkLCBlcnIgOj0gcC5SZWFkQnl0ZSgpCi0gIHR5cGVJZCA9IFRNZXNzYWdlVHlwZShiVHlwZUlkKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCi0gIH0KLSAgaWYgc2VxSWQsIGVyciA9IHAuUmVhZEkzMigpOyBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCi0gIH0KLSAgcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIG5pbAotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkTWVzc2FnZUVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGVyciA6PSBwLlBhcnNlTGlzdEVuZCgpCi0gIHJldHVybiBlcnIKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZFN0cnVjdEJlZ2luKCkgKG5hbWUgc3RyaW5nLCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIF8sIGVyciA9IHAuUGFyc2VPYmplY3RTdGFydCgpCi0gIHJldHVybiAiIiwgZXJyCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRTdHJ1Y3RFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5QYXJzZU9iamVjdEVuZCgpCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRGaWVsZEJlZ2luKCkgKHN0cmluZywgVFR5cGUsIGludDE2LCBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgaWYgcC5yZWFkZXIuQnVmZmVyZWQoKSA8IDEgewotICAgIHJldHVybiAiIiwgU1RPUCwgLTEsIG5pbAotICB9Ci0gIGIsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQotICBpZiBsZW4oYikgPCAxIHx8IGJbMF0gPT0gSlNPTl9SQlJBQ0VbMF0gfHwgYlswXSA9PSBKU09OX1JCUkFDS0VUWzBdIHsKLSAgICByZXR1cm4gIiIsIFNUT1AsIC0xLCBuaWwKLSAgfQotICBmaWVsZElkLCBlcnIgOj0gcC5SZWFkSTE2KCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuICIiLCBTVE9QLCBmaWVsZElkLCBlcnIKLSAgfQotICBpZiBfLCBlcnIgPSBwLlBhcnNlT2JqZWN0U3RhcnQoKTsgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuICIiLCBTVE9QLCBmaWVsZElkLCBlcnIKLSAgfQotICBzVHlwZSwgZXJyIDo9IHAuUmVhZFN0cmluZygpCi0gIGZUeXBlIDo9IHAuU3RyaW5nVG9UeXBlSWQoc1R5cGUpCi0gIHJldHVybiAiIiwgZlR5cGUsIGZpZWxkSWQsIGVycgotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkRmllbGRFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5QYXJzZU9iamVjdEVuZCgpCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRNYXBCZWdpbigpIChrZXlUeXBlIFRUeXBlLCB2YWx1ZVR5cGUgVFR5cGUsIHNpemUgaW50LCBlIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBpZiBpc051bGwsIGUgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZSAhPSBuaWwgewotICAgIHJldHVybiBWT0lELCBWT0lELCAwLCBlCi0gIH0KLQotICAvLyByZWFkIGtleVR5cGUKLSAgc0tleVR5cGUsIGUgOj0gcC5SZWFkU3RyaW5nKCkKLSAga2V5VHlwZSA9IHAuU3RyaW5nVG9UeXBlSWQoc0tleVR5cGUpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICByZXR1cm4ga2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlCi0gIH0KLQotICAvLyByZWFkIHZhbHVlVHlwZQotICBzVmFsdWVUeXBlLCBlIDo9IHAuUmVhZFN0cmluZygpCi0gIHZhbHVlVHlwZSA9IHAuU3RyaW5nVG9UeXBlSWQoc1ZhbHVlVHlwZSkKLSAgaWYgZSAhPSBuaWwgewotICAgIHJldHVybiBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGUKLSAgfQotCi0gIC8vIHJlYWQgc2l6ZQotICBpU2l6ZSwgZXJyIDo9IHAuUmVhZEk2NCgpCi0gIHNpemUgPSBpbnQoaVNpemUpCi0gIHJldHVybiBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGVycgotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkTWFwRW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuUGFyc2VMaXN0RW5kKCkKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZExpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHJldHVybiBwLlBhcnNlRWxlbUxpc3RCZWdpbigpCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRMaXN0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuUGFyc2VMaXN0RW5kKCkKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZFNldEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZSBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgcmV0dXJuIHAuUGFyc2VFbGVtTGlzdEJlZ2luKCkKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZFNldEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLlBhcnNlTGlzdEVuZCgpCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRCb29sKCkgKGJvb2wsIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICB2YXIgdmFsdWUgYm9vbAotICBpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgewotICAgIHJldHVybiB2YWx1ZSwgZXJyCi0gIH0KLSAgYiwgXyA6PSBwLnJlYWRlci5QZWVrKGxlbihKU09OX0ZBTFNFKSkKLSAgaWYgbGVuKGIpID4gMCB7Ci0gICAgc3dpdGNoIGJbMF0gewotICAgIGNhc2UgSlNPTl9UUlVFWzBdOgotICAgICAgaWYgc3RyaW5nKGJbMDpsZW4oSlNPTl9UUlVFKV0pID09IHN0cmluZyhKU09OX1RSVUUpIHsKLSAgICAgICAgcC5yZWFkZXIuUmVhZChiWzA6bGVuKEpTT05fVFJVRSldKQotICAgICAgICB2YWx1ZSA9IHRydWUKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZSwgTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgIkV4cGVjdGVkIFwidHJ1ZVwiIGJ1dCBmb3VuZDogIitzdHJpbmcoYikpCi0gICAgICB9Ci0gICAgICBicmVhawotICAgIGNhc2UgSlNPTl9GQUxTRVswXToKLSAgICAgIGlmIHN0cmluZyhiWzA6bGVuKEpTT05fRkFMU0UpXSkgPT0gc3RyaW5nKEpTT05fRkFMU0UpIHsKLSAgICAgICAgcC5yZWFkZXIuUmVhZChiWzA6bGVuKEpTT05fRkFMU0UpXSkKLSAgICAgICAgdmFsdWUgPSBmYWxzZQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgXCJmYWxzZVwiIGJ1dCBmb3VuZDogIitzdHJpbmcoYikpCi0gICAgICB9Ci0gICAgICBicmVhawotICAgIGNhc2UgSlNPTl9OVUxMWzBdOgotICAgICAgaWYgc3RyaW5nKGJbMDpsZW4oSlNPTl9OVUxMKV0pID09IHN0cmluZyhKU09OX05VTEwpIHsKLSAgICAgICAgcC5yZWFkZXIuUmVhZChiWzA6bGVuKEpTT05fTlVMTCldKQotICAgICAgICB2YWx1ZSA9IGZhbHNlCi0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gdmFsdWUsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsICJFeHBlY3RlZCBcIm51bGxcIiBidXQgZm91bmQ6ICIrc3RyaW5nKGIpKQotICAgICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gdmFsdWUsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsICJFeHBlY3RlZCBcInRydWVcIiwgXCJmYWxzZVwiLCBvciBcIm51bGxcIiBidXQgZm91bmQ6ICIrc3RyaW5nKGIpKQotICAgIH0KLSAgfQotICByZXR1cm4gdmFsdWUsIHAuUGFyc2VQb3N0VmFsdWUoKQotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkQnl0ZSgpIChieXRlLCBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgdiwgZXJyIDo9IHAuUmVhZEk2NCgpCi0gIHJldHVybiBieXRlKHYpLCBlcnIKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZEkxNigpIChpbnQxNiwgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHYsIGVyciA6PSBwLlJlYWRJNjQoKQotICByZXR1cm4gaW50MTYodiksIGVycgotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkSTMyKCkgKGludDMyLCBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgdiwgZXJyIDo9IHAuUmVhZEk2NCgpCi0gIHJldHVybiBpbnQzMih2KSwgZXJyCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRJNjQoKSAoaW50NjQsIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICB2LCBfLCBlcnIgOj0gcC5QYXJzZUk2NCgpCi0gIHJldHVybiB2LCBlcnIKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZERvdWJsZSgpIChmbG9hdDY0LCBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgdiwgXywgZXJyIDo9IHAuUGFyc2VGNjQoKQotICByZXR1cm4gdiwgZXJyCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRTdHJpbmcoKSAoc3RyaW5nLCBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgdmFyIHYgc3RyaW5nCi0gIGlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIHYsIGVycgotICB9Ci0gIGIsIF8gOj0gcC5yZWFkZXIuUGVlayhsZW4oSlNPTl9OVUxMKSkKLSAgaWYgbGVuKGIpID4gMCAmJiBiWzBdID09IEpTT05fUVVPVEUgewotICAgIHAucmVhZGVyLlJlYWRCeXRlKCkKLSAgICB2YWx1ZSwgZXJyIDo9IHAuUGFyc2VTdHJpbmdCb2R5KCkKLSAgICB2ID0gdmFsdWUKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiB2LCBlcnIKLSAgICB9Ci0gIH0gZWxzZSBpZiBsZW4oYikgPj0gbGVuKEpTT05fTlVMTCkgJiYgc3RyaW5nKGJbMDpsZW4oSlNPTl9OVUxMKV0pID09IHN0cmluZyhKU09OX05VTEwpIHsKLSAgICBfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiWzA6bGVuKEpTT05fTlVMTCldKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsIGZtdC5TcHJpbnQoIkV4cGVjdGVkIGEgSlNPTiBzdHJpbmcsIGZvdW5kICIsIHN0cmluZyhiKSkpCi0gIH0KLSAgcmV0dXJuIHYsIHAuUGFyc2VQb3N0VmFsdWUoKQotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkQmluYXJ5KCkgKFtdYnl0ZSwgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHZhciB2IFtdYnl0ZQotICBpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgewotICAgIHJldHVybiBuaWwsIGVycgotICB9Ci0gIGIsIF8gOj0gcC5yZWFkZXIuUGVlayhsZW4oSlNPTl9OVUxMKSkKLSAgaWYgbGVuKGIpID4gMCAmJiBiWzBdID09IEpTT05fUVVPVEUgewotICAgIHAucmVhZGVyLlJlYWRCeXRlKCkKLSAgICB2YWx1ZSwgZXJyIDo9IHAuUGFyc2VCYXNlNjRFbmNvZGVkQm9keSgpCi0gICAgdiA9IHZhbHVlCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4gdiwgZXJyCi0gICAgfQotICB9IGVsc2UgaWYgbGVuKGIpID49IGxlbihKU09OX05VTEwpICYmIHN0cmluZyhiWzA6bGVuKEpTT05fTlVMTCldKSA9PSBzdHJpbmcoSlNPTl9OVUxMKSB7Ci0gICAgXywgZXJyIDo9IHAucmVhZGVyLlJlYWQoYlswOmxlbihKU09OX05VTEwpXSkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi0gICAgfQotICB9IGVsc2UgewotICAgIHJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCBmbXQuU3ByaW50KCJFeHBlY3RlZCBhIEpTT04gc3RyaW5nLCBmb3VuZCAiLCBzdHJpbmcoYikpKQotICB9Ci0gIHJldHVybiB2LCBwLlBhcnNlUG9zdFZhbHVlKCkKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgRmx1c2goKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IocC53cml0ZXIuRmx1c2goKSkKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgU2tpcChmaWVsZFR5cGUgVFR5cGUpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHJldHVybiBTa2lwRGVmYXVsdERlcHRoKHAsIGZpZWxkVHlwZSkKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgVHJhbnNwb3J0KCkgVFRyYW5zcG9ydCB7Ci0gIHJldHVybiBwLnRyYW5zCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIHJlYWRFbGVtTGlzdEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZSBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgaWYgaXNOdWxsLCBlIDo9IHAuUGFyc2VMaXN0QmVnaW4oKTsgaXNOdWxsIHx8IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gVk9JRCwgMCwgZQotICB9Ci0gIHNFbGVtVHlwZSwgZXJyIDo9IHAuUmVhZFN0cmluZygpCi0gIGVsZW1UeXBlID0gcC5TdHJpbmdUb1R5cGVJZChzRWxlbVR5cGUpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBlbGVtVHlwZSwgc2l6ZSwgZXJyCi0gIH0KLSAgblNpemUsIGVycjIgOj0gcC5SZWFkSTY0KCkKLSAgc2l6ZSA9IGludChuU2l6ZSkKLSAgcmV0dXJuIGVsZW1UeXBlLCBzaXplLCBlcnIyCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIHdyaXRlRWxlbUxpc3RCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGlmIGUgOj0gcC5PdXRwdXRMaXN0QmVnaW4oKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgaWYgZSA6PSBwLk91dHB1dFN0cmluZyhwLlR5cGVJZFRvU3RyaW5nKGVsZW1UeXBlKSk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIGlmIGUgOj0gcC5PdXRwdXRJNjQoaW50NjQoc2l6ZSkpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFR5cGVJZFRvU3RyaW5nKGZpZWxkVHlwZSBUVHlwZSkgc3RyaW5nIHsKLSAgc3dpdGNoIGJ5dGUoZmllbGRUeXBlKSB7Ci0gIGNhc2UgU1RPUDoKLSAgICByZXR1cm4gInN0cCIKLSAgY2FzZSBWT0lEOgotICAgIHJldHVybiAidiIKLSAgY2FzZSBCT09MOgotICAgIHJldHVybiAidGYiCi0gIGNhc2UgQllURToKLSAgICByZXR1cm4gImk4IgotICBjYXNlIERPVUJMRToKLSAgICByZXR1cm4gImRibCIKLSAgY2FzZSBJMTY6Ci0gICAgcmV0dXJuICJpMTYiCi0gIGNhc2UgSTMyOgotICAgIHJldHVybiAiaTMyIgotICBjYXNlIEk2NDoKLSAgICByZXR1cm4gImk2NCIKLSAgY2FzZSBTVFJJTkc6Ci0gICAgcmV0dXJuICJzdHIiCi0gIGNhc2UgU1RSVUNUOgotICAgIHJldHVybiAicmVjIgotICBjYXNlIE1BUDoKLSAgICByZXR1cm4gIm1hcCIKLSAgY2FzZSBTRVQ6Ci0gICAgcmV0dXJuICJzZXQiCi0gIGNhc2UgTElTVDoKLSAgICByZXR1cm4gImxzdCIKLSAgY2FzZSBFTlVNOgotICAgIHJldHVybiAiaTMyIgotICBjYXNlIFVURjE2OgotICAgIHJldHVybiAic3RyIgotICBjYXNlIEdFTkVSSUM6Ci0gICAgcmV0dXJuICJnZW4iCi0gIH0KLSAgcmV0dXJuICIiCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFN0cmluZ1RvVHlwZUlkKGZpZWxkVHlwZSBzdHJpbmcpIFRUeXBlIHsKLSAgc3dpdGNoIGZpZWxkVHlwZSB7Ci0gIGNhc2UgInN0cCI6Ci0gICAgcmV0dXJuIFRUeXBlKFNUT1ApCi0gIGNhc2UgInYiOgotICAgIHJldHVybiBUVHlwZShWT0lEKQotICBjYXNlICJ0ZiI6Ci0gICAgcmV0dXJuIFRUeXBlKEJPT0wpCi0gIGNhc2UgImk4IjoKLSAgICByZXR1cm4gVFR5cGUoQllURSkKLSAgY2FzZSAiZGJsIjoKLSAgICByZXR1cm4gVFR5cGUoRE9VQkxFKQotICBjYXNlICIxNiI6Ci0gICAgcmV0dXJuIFRUeXBlKEkxNikKLSAgY2FzZSAiaTMyIjoKLSAgICByZXR1cm4gVFR5cGUoSTMyKQotICBjYXNlICJpNjQiOgotICAgIHJldHVybiBUVHlwZShJNjQpCi0gIGNhc2UgInN0ciI6Ci0gICAgcmV0dXJuIFRUeXBlKFNUUklORykKLSAgY2FzZSAicmVjIjoKLSAgICByZXR1cm4gVFR5cGUoU1RSVUNUKQotICBjYXNlICJtYXAiOgotICAgIHJldHVybiBUVHlwZShNQVApCi0gIGNhc2UgInNldCI6Ci0gICAgcmV0dXJuIFRUeXBlKFNFVCkKLSAgY2FzZSAibHN0IjoKLSAgICByZXR1cm4gVFR5cGUoTElTVCkKLSAgY2FzZSAiZW5tIjoKLSAgICByZXR1cm4gVFR5cGUoRU5VTSkKLSAgY2FzZSAidTE2IjoKLSAgICByZXR1cm4gVFR5cGUoVVRGMTYpCi0gIGNhc2UgImdlbiI6Ci0gICAgcmV0dXJuIFRUeXBlKEdFTkVSSUMpCi0gIH0KLSAgcmV0dXJuIFRUeXBlKFNUT1ApCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3Rqc29uX3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3Rqc29uX3Byb3RvY29sX3Rlc3QuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZjBmMmUuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90anNvbl9wcm90b2NvbF90ZXN0LmdvCisrKyAvZGV2L251bGwKQEAgLTEsNjc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnRfdGVzdAotCi1pbXBvcnQgKAotICAuICJ0aHJpZnQiCi0gICJlbmNvZGluZy9iYXNlNjQiCi0gICJmbXQiCi0gICJqc29uIgotICAibWF0aCIKLSAgInN0cmNvbnYiCi0gICJ0ZXN0aW5nIgotKQotCi1mdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbEJvb2wodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gImJvb2xlYW4iCi0gIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICBwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBCT09MX1ZBTFVFUyB7Ci0gICAgaWYgZSA6PSBwLldyaXRlQm9vbCh2YWx1ZSk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgICBpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQotICAgIH0KLSAgICB2IDo9IGZhbHNlCi0gICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICB9Ci0gIHRyYW5zLkNsb3NlKCkKLX0KLQotZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbEJvb2wodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gImJvb2xlYW4iCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBCT09MX1ZBTFVFUyB7Ci0gICAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gICAgcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQotICAgIGlmIHZhbHVlIHsKLSAgICAgIHRyYW5zLldyaXRlKEpTT05fVFJVRSkKLSAgICB9IGVsc2UgewotICAgICAgdHJhbnMuV3JpdGUoSlNPTl9GQUxTRSkKLSAgICB9Ci0gICAgdHJhbnMuRmx1c2goKQotICAgIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgICB2LCBlIDo9IHAuUmVhZEJvb2woKQotICAgIGlmIGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIGlmIHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgfQotICAgIGlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgfQotICAgIHRyYW5zLlJlc2V0KCkKLSAgICB0cmFucy5DbG9zZSgpCi0gIH0KLX0KLQotZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xCeXRlKHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJieXRlIgotICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQotICBmb3IgXywgdmFsdWUgOj0gcmFuZ2UgQllURV9WQUxVRVMgewotICAgIGlmIGUgOj0gcC5Xcml0ZUJ5dGUodmFsdWUpOyBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBzIDo9IHRyYW5zLlN0cmluZygpCi0gICAgaWYgcyAhPSBmbXQuU3ByaW50KHZhbHVlKSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKLSAgICB9Ci0gICAgdiA6PSBieXRlKDApCi0gICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICB9Ci0gIHRyYW5zLkNsb3NlKCkKLX0KLQotZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbEJ5dGUodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gImJ5dGUiCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBCWVRFX1ZBTFVFUyB7Ci0gICAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gICAgcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQotICAgIHRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShpbnQodmFsdWUpKSkKLSAgICB0cmFucy5GbHVzaCgpCi0gICAgcyA6PSB0cmFucy5TdHJpbmcoKQotICAgIHYsIGUgOj0gcC5SZWFkQnl0ZSgpCi0gICAgaWYgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgaWYgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICAgIHRyYW5zLkNsb3NlKCkKLSAgfQotfQotCi1mdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbEkxNih0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAiaW50MTYiCi0gIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICBwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQxNl9WQUxVRVMgewotICAgIGlmIGUgOj0gcC5Xcml0ZUkxNih2YWx1ZSk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgICBpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQotICAgIH0KLSAgICB2IDo9IGludDE2KDApCi0gICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICB9Ci0gIHRyYW5zLkNsb3NlKCkKLX0KLQotZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbEkxNih0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAiaW50MTYiCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQxNl9WQUxVRVMgewotICAgIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICAgIHAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKLSAgICB0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCi0gICAgdHJhbnMuRmx1c2goKQotICAgIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgICB2LCBlIDo9IHAuUmVhZEkxNigpCi0gICAgaWYgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgaWYgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICAgIHRyYW5zLkNsb3NlKCkKLSAgfQotfQotCi1mdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbEkzMih0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAiaW50MzIiCi0gIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICBwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQzMl9WQUxVRVMgewotICAgIGlmIGUgOj0gcC5Xcml0ZUkzMih2YWx1ZSk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgICBpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQotICAgIH0KLSAgICB2IDo9IGludDMyKDApCi0gICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICB9Ci0gIHRyYW5zLkNsb3NlKCkKLX0KLQotZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbEkzMih0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAiaW50MzIiCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQzMl9WQUxVRVMgewotICAgIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICAgIHAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKLSAgICB0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCi0gICAgdHJhbnMuRmx1c2goKQotICAgIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgICB2LCBlIDo9IHAuUmVhZEkzMigpCi0gICAgaWYgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgaWYgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICAgIHRyYW5zLkNsb3NlKCkKLSAgfQotfQotCi1mdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbEk2NCh0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAiaW50NjQiCi0gIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICBwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQ2NF9WQUxVRVMgewotICAgIGlmIGUgOj0gcC5Xcml0ZUk2NCh2YWx1ZSk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgICBpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQotICAgIH0KLSAgICB2IDo9IGludDY0KDApCi0gICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICB9Ci0gIHRyYW5zLkNsb3NlKCkKLX0KLQotZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbEk2NCh0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAiaW50NjQiCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQ2NF9WQUxVRVMgewotICAgIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICAgIHAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKLSAgICB0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2E2NCh2YWx1ZSkpCi0gICAgdHJhbnMuRmx1c2goKQotICAgIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgICB2LCBlIDo9IHAuUmVhZEk2NCgpCi0gICAgaWYgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgaWYgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICAgIHRyYW5zLkNsb3NlKCkKLSAgfQotfQotCi1mdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbERvdWJsZSh0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAiZG91YmxlIgotICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQotICBmb3IgXywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7Ci0gICAgaWYgZSA6PSBwLldyaXRlRG91YmxlKHZhbHVlKTsgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIGlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgcyA6PSB0cmFucy5TdHJpbmcoKQotICAgIGlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKLSAgICAgIGlmIHMgIT0gSnNvblF1b3RlKEpTT05fSU5GSU5JVFkpIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIEpzb25RdW90ZShKU09OX0lORklOSVRZKSkKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgLTEpIHsKLSAgICAgIGlmIHMgIT0gSnNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIEpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSkKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgbWF0aC5Jc05hTih2YWx1ZSkgewotICAgICAgaWYgcyAhPSBKc29uUXVvdGUoSlNPTl9OQU4pIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIEpzb25RdW90ZShKU09OX05BTikpCi0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKLSAgICAgIH0KLSAgICAgIHYgOj0gZmxvYXQ2NCgwKQotICAgICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewotICAgICAgICB0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgICAgfQotICAgIH0KLSAgICB0cmFucy5SZXNldCgpCi0gIH0KLSAgdHJhbnMuQ2xvc2UoKQotfQotCi1mdW5jIFRlc3RSZWFkSlNPTlByb3RvY29sRG91YmxlKHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJkb3VibGUiCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKLSAgICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgICBwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCi0gICAgbiA6PSBOZXdOdW1lcmljRnJvbURvdWJsZSh2YWx1ZSkKLSAgICB0cmFucy5Xcml0ZVN0cmluZyhuLlN0cmluZygpKQotICAgIHRyYW5zLkZsdXNoKCkKLSAgICBzIDo9IHRyYW5zLlN0cmluZygpCi0gICAgdiwgZSA6PSBwLlJlYWREb3VibGUoKQotICAgIGlmIGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIGlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKLSAgICAgIGlmICFtYXRoLklzSW5mKHYsIDEpIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgICB9Ci0gICAgfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIC0xKSB7Ci0gICAgICBpZiAhbWF0aC5Jc0luZih2LCAtMSkgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgbWF0aC5Jc05hTih2YWx1ZSkgewotICAgICAgaWYgIW1hdGguSXNOYU4odikgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgdiAhPSB2YWx1ZSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgICAgfQotICAgICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewotICAgICAgICB0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgICAgfQotICAgIH0KLSAgICB0cmFucy5SZXNldCgpCi0gICAgdHJhbnMuQ2xvc2UoKQotICB9Ci19Ci0KLWZ1bmMgVGVzdFdyaXRlSlNPTlByb3RvY29sU3RyaW5nKHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJzdHJpbmciCi0gIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICBwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBTVFJJTkdfVkFMVUVTIHsKLSAgICBpZiBlIDo9IHAuV3JpdGVTdHJpbmcodmFsdWUpOyBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBzIDo9IHRyYW5zLlN0cmluZygpCi0gICAgaWYgc1swXSAhPSAnIicgfHwgc1tsZW4ocyktMV0gIT0gJyInIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICcldicsIHdyb3RlICcldicsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCBmbXQuU3ByaW50KCJcIiIsIHZhbHVlLCAiXCIiKSkKLSAgICB9Ci0gICAgdiA6PSBuZXcoc3RyaW5nKQotICAgIGlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksIHYpOyBlcnIgIT0gbmlsIHx8ICp2ICE9IHZhbHVlIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsICp2KQotICAgIH0KLSAgICB0cmFucy5SZXNldCgpCi0gIH0KLSAgdHJhbnMuQ2xvc2UoKQotfQotCi1mdW5jIFRlc3RSZWFkSlNPTlByb3RvY29sU3RyaW5nKHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJzdHJpbmciCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBTVFJJTkdfVkFMVUVTIHsKLSAgICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgICBwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCi0gICAgdHJhbnMuV3JpdGVTdHJpbmcoSnNvblF1b3RlKHZhbHVlKSkKLSAgICB0cmFucy5GbHVzaCgpCi0gICAgcyA6PSB0cmFucy5TdHJpbmcoKQotICAgIHYsIGUgOj0gcC5SZWFkU3RyaW5nKCkKLSAgICBpZiBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBpZiB2ICE9IHZhbHVlIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgIH0KLSAgICB2MSA6PSBuZXcoc3RyaW5nKQotICAgIGlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksIHYxKTsgZXJyICE9IG5pbCB8fCAqdjEgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgKnYxKQotICAgIH0KLSAgICB0cmFucy5SZXNldCgpCi0gICAgdHJhbnMuQ2xvc2UoKQotICB9Ci19Ci0KLWZ1bmMgVGVzdFdyaXRlSlNPTlByb3RvY29sQmluYXJ5KHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJiaW5hcnkiCi0gIHZhbHVlIDo9IHByb3RvY29sX2JkYXRhCi0gIGI2NHZhbHVlIDo9IG1ha2UoW11ieXRlLCBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlZExlbihsZW4ocHJvdG9jb2xfYmRhdGEpKSkKLSAgYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZShiNjR2YWx1ZSwgdmFsdWUpCi0gIGI2NFN0cmluZyA6PSBzdHJpbmcoYjY0dmFsdWUpCi0gIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICBwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCi0gIGlmIGUgOj0gcC5Xcml0ZUJpbmFyeSh2YWx1ZSk7IGUgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgfQotICBpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICB9Ci0gIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgZXhwZWN0ZWRTdHJpbmcgOj0gZm10LlNwcmludCgiXCIiLCBiNjRTdHJpbmcsICJcIiIpCi0gIGlmIHMgIT0gZXhwZWN0ZWRTdHJpbmcgewotICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2XG4gIHdyb3RlOiAgXCIldlwiXG5leHBlY3RlZDogXCIldlwiIiwgdGhldHlwZSwgdmFsdWUsIHMsIGV4cGVjdGVkU3RyaW5nKQotICB9Ci0gIHYxLCBlcnIgOj0gcC5SZWFkQmluYXJ5KCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkIGJpbmFyeTogJXMiLCBlcnIuU3RyaW5nKCkpCi0gIH0KLSAgaWYgbGVuKHYxKSAhPSBsZW4odmFsdWUpIHsKLSAgICB0LkZhdGFsZigiSW52YWxpZCB2YWx1ZSBmb3IgYmluYXJ5XG5leHBlY3RlZDogXCIldlwiXG4gICByZWFkOiBcIiV2XCIiLCB2YWx1ZSwgdjEpCi0gIH0KLSAgZm9yIGssIHYgOj0gcmFuZ2UgdmFsdWUgewotICAgIGlmIHYxW2tdICE9IHYgewotICAgICAgdC5GYXRhbGYoIkludmFsaWQgdmFsdWUgZm9yIGJpbmFyeSBhdCAldlxuZXhwZWN0ZWQ6IFwiJXZcIlxuICAgcmVhZDogXCIldlwiIiwgaywgdiwgdjFba10pCi0gICAgfQotICB9Ci0gIHRyYW5zLkNsb3NlKCkKLX0KLQotZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbEJpbmFyeSh0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAiYmluYXJ5IgotICB2YWx1ZSA6PSBwcm90b2NvbF9iZGF0YQotICBiNjR2YWx1ZSA6PSBtYWtlKFtdYnl0ZSwgYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZWRMZW4obGVuKHByb3RvY29sX2JkYXRhKSkpCi0gIGJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGUoYjY0dmFsdWUsIHZhbHVlKQotICBiNjRTdHJpbmcgOj0gc3RyaW5nKGI2NHZhbHVlKQotICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQotICB0cmFucy5Xcml0ZVN0cmluZyhKc29uUXVvdGUoYjY0U3RyaW5nKSkKLSAgdHJhbnMuRmx1c2goKQotICBzIDo9IHRyYW5zLlN0cmluZygpCi0gIHYsIGUgOj0gcC5SZWFkQmluYXJ5KCkKLSAgaWYgZSAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gIH0KLSAgaWYgbGVuKHYpICE9IGxlbih2YWx1ZSkgewotICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlIGxlbmd0aCAldiwgd3JvdGU6ICV2LCByZWNlaXZlZCBsZW5ndGg6ICV2IiwgdGhldHlwZSwgbGVuKHZhbHVlKSwgcywgbGVuKHYpKQotICB9Ci0gIGZvciBpIDo9IDA7IGkgPCBsZW4odik7IGkrKyB7Ci0gICAgaWYgdltpXSAhPSB2YWx1ZVtpXSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAlZCB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCBpLCB2YWx1ZVtpXSwgcywgdltpXSkKLSAgICB9Ci0gIH0KLSAgdjEgOj0gbmV3KHN0cmluZykKLSAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgdjEpOyBlcnIgIT0gbmlsIHx8ICp2MSAhPSBiNjRTdHJpbmcgewotICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsICp2MSkKLSAgfQotICB0cmFucy5SZXNldCgpCi0gIHRyYW5zLkNsb3NlKCkKLX0KLQotZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xMaXN0KHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJsaXN0IgotICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQotICBwLldyaXRlTGlzdEJlZ2luKFRUeXBlKERPVUJMRSksIGxlbihET1VCTEVfVkFMVUVTKSkKLSAgZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgewotICAgIGlmIGUgOj0gcC5Xcml0ZURvdWJsZSh2YWx1ZSk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgfQotICBwLldyaXRlTGlzdEVuZCgpCi0gIGlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgZS5TdHJpbmcoKSkKLSAgfQotICBzdHIgOj0gdHJhbnMuU3RyaW5nKCkKLSAgc3RyMSA6PSBuZXcoW11pbnRlcmZhY2V7fSkKLSAgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzdHIpLCBzdHIxKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIGRlY29kZSAlcywgd3JvdGU6ICVzIiwgdGhldHlwZSwgc3RyKQotICB9Ci0gIGwgOj0gKnN0cjEKLSAgaWYgbGVuKGwpIDwgMiB7Ci0gICAgdC5GYXRhbGYoIkxpc3QgbXVzdCBiZSBhdCBsZWFzdCBvZiBsZW5ndGggdHdvIHRvIGluY2x1ZGUgbWV0YWRhdGEiKQotICB9Ci0gIGlmIGludChsWzBdLihmbG9hdDY0KSkgIT0gRE9VQkxFIHsKLSAgICB0LkZhdGFsKCJJbnZhbGlkIHR5cGUgZm9yIGxpc3QsIGV4cGVjdGVkOiAiLCBET1VCTEUsICIsIGJ1dCB3YXM6ICIsIGxbMF0pCi0gIH0KLSAgaWYgaW50KGxbMV0uKGZsb2F0NjQpKSAhPSBsZW4oRE9VQkxFX1ZBTFVFUykgewotICAgIHQuRmF0YWwoIkludmFsaWQgbGVuZ3RoIGZvciBsaXN0LCBleHBlY3RlZDogIiwgbGVuKERPVUJMRV9WQUxVRVMpLCAiLCBidXQgd2FzOiAiLCBsWzFdKQotICB9Ci0gIGZvciBrLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKLSAgICBzIDo9IGxbaysyXQotICAgIGlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKLSAgICAgIGlmIHMuKHN0cmluZykgIT0gSlNPTl9JTkZJTklUWSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywgSnNvblF1b3RlKEpTT05fSU5GSU5JVFkpLCBzdHIpCi0gICAgICB9Ci0gICAgfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIDApIHsKLSAgICAgIGlmIHMuKHN0cmluZykgIT0gSlNPTl9ORUdBVElWRV9JTkZJTklUWSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywgSnNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpLCBzdHIpCi0gICAgICB9Ci0gICAgfSBlbHNlIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKLSAgICAgIGlmIHMuKHN0cmluZykgIT0gSlNPTl9OQU4gewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBKc29uUXVvdGUoSlNPTl9OQU4pLCBzdHIpCi0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIHMuKGZsb2F0NjQpICE9IHZhbHVlIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJyIsIHRoZXR5cGUsIHZhbHVlLCBzKQotICAgICAgfQotICAgIH0KLSAgICB0cmFucy5SZXNldCgpCi0gIH0KLSAgdHJhbnMuQ2xvc2UoKQotfQotCi1mdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbFNldCh0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAic2V0IgotICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQotICBwLldyaXRlU2V0QmVnaW4oVFR5cGUoRE9VQkxFKSwgbGVuKERPVUJMRV9WQUxVRVMpKQotICBmb3IgXywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7Ci0gICAgaWYgZSA6PSBwLldyaXRlRG91YmxlKHZhbHVlKTsgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICB9Ci0gIHAuV3JpdGVTZXRFbmQoKQotICBpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuU3RyaW5nKCkpCi0gIH0KLSAgc3RyIDo9IHRyYW5zLlN0cmluZygpCi0gIHN0cjEgOj0gbmV3KFtdaW50ZXJmYWNle30pCi0gIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUoc3RyKSwgc3RyMSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byBkZWNvZGUgJXMsIHdyb3RlOiAlcyIsIHRoZXR5cGUsIHN0cikKLSAgfQotICBsIDo9ICpzdHIxCi0gIGlmIGxlbihsKSA8IDIgewotICAgIHQuRmF0YWxmKCJTZXQgbXVzdCBiZSBhdCBsZWFzdCBvZiBsZW5ndGggdHdvIHRvIGluY2x1ZGUgbWV0YWRhdGEiKQotICB9Ci0gIGlmIGludChsWzBdLihmbG9hdDY0KSkgIT0gRE9VQkxFIHsKLSAgICB0LkZhdGFsKCJJbnZhbGlkIHR5cGUgZm9yIHNldCwgZXhwZWN0ZWQ6ICIsIERPVUJMRSwgIiwgYnV0IHdhczogIiwgbFswXSkKLSAgfQotICBpZiBpbnQobFsxXS4oZmxvYXQ2NCkpICE9IGxlbihET1VCTEVfVkFMVUVTKSB7Ci0gICAgdC5GYXRhbCgiSW52YWxpZCBsZW5ndGggZm9yIHNldCwgZXhwZWN0ZWQ6ICIsIGxlbihET1VCTEVfVkFMVUVTKSwgIiwgYnV0IHdhczogIiwgbFsxXSkKLSAgfQotICBmb3IgaywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7Ci0gICAgcyA6PSBsW2srMl0KLSAgICBpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7Ci0gICAgICBpZiBzLihzdHJpbmcpICE9IEpTT05fSU5GSU5JVFkgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIEpzb25RdW90ZShKU09OX0lORklOSVRZKSwgc3RyKQotICAgICAgfQotICAgIH0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAwKSB7Ci0gICAgICBpZiBzLihzdHJpbmcpICE9IEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIEpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSwgc3RyKQotICAgICAgfQotICAgIH0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7Ci0gICAgICBpZiBzLihzdHJpbmcpICE9IEpTT05fTkFOIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywgSnNvblF1b3RlKEpTT05fTkFOKSwgc3RyKQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiBzLihmbG9hdDY0KSAhPSB2YWx1ZSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcyciLCB0aGV0eXBlLCB2YWx1ZSwgcykKLSAgICAgIH0KLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICB9Ci0gIHRyYW5zLkNsb3NlKCkKLX0KLQotZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xNYXAodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gIm1hcCIKLSAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gIHAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKLSAgcC5Xcml0ZU1hcEJlZ2luKFRUeXBlKEkzMiksIFRUeXBlKERPVUJMRSksIGxlbihET1VCTEVfVkFMVUVTKSkKLSAgZm9yIGssIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgewotICAgIGlmIGUgOj0gcC5Xcml0ZUkzMihpbnQzMihrKSk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMga2V5IGludDMyIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCBrLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlIGZsb2F0NjQgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgfQotICBwLldyaXRlTWFwRW5kKCkKLSAgaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCBlLlN0cmluZygpKQotICB9Ci0gIHN0ciA6PSB0cmFucy5TdHJpbmcoKQotICBpZiBzdHJbMF0gIT0gJ1snIHx8IHN0cltsZW4oc3RyKS0xXSAhPSAnXScgewotICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzLCB3cm90ZTogJXEsIGluIGdvOiAlcSIsIHRoZXR5cGUsIHN0ciwgRE9VQkxFX1ZBTFVFUykKLSAgfQotICBleHBlY3RlZEtleVR5cGUsIGV4cGVjdGVkVmFsdWVUeXBlLCBleHBlY3RlZFNpemUsIGVyciA6PSBwLlJlYWRNYXBCZWdpbigpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJFcnJvciB3aGlsZSByZWFkaW5nIG1hcCBiZWdpbjogJXMiLCBlcnIuU3RyaW5nKCkpCi0gIH0KLSAgaWYgZXhwZWN0ZWRLZXlUeXBlICE9IEkzMiB7Ci0gICAgdC5GYXRhbCgiRXhwZWN0ZWQgbWFwIGtleSB0eXBlICIsIEkzMiwgIiwgYnV0IHdhcyAiLCBleHBlY3RlZEtleVR5cGUpCi0gIH0KLSAgaWYgZXhwZWN0ZWRWYWx1ZVR5cGUgIT0gRE9VQkxFIHsKLSAgICB0LkZhdGFsKCJFeHBlY3RlZCBtYXAgdmFsdWUgdHlwZSAiLCBET1VCTEUsICIsIGJ1dCB3YXMgIiwgZXhwZWN0ZWRWYWx1ZVR5cGUpCi0gIH0KLSAgaWYgZXhwZWN0ZWRTaXplICE9IGxlbihET1VCTEVfVkFMVUVTKSB7Ci0gICAgdC5GYXRhbCgiRXhwZWN0ZWQgbWFwIHNpemUgb2YgIiwgbGVuKERPVUJMRV9WQUxVRVMpLCAiLCBidXQgd2FzICIsIGV4cGVjdGVkU2l6ZSkKLSAgfQotICBmb3IgaywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7Ci0gICAgaWssIGVyciA6PSBwLlJlYWRJMzIoKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIkJhZCBrZXkgZm9yICVzIGluZGV4ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiwgZXJyb3I6ICVzIiwgdGhldHlwZSwgaywgaWssIHN0cmluZyhrKSwgZXJyLlN0cmluZygpKQotICAgIH0KLSAgICBpZiBpbnQoaWspICE9IGsgewotICAgICAgdC5GYXRhbGYoIkJhZCBrZXkgZm9yICVzIGluZGV4ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIGssIGlrLCBrKQotICAgIH0KLSAgICBkdiwgZXJyIDo9IHAuUmVhZERvdWJsZSgpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBpbmRleCAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYsIGVycm9yOiAlcyIsIHRoZXR5cGUsIGssIGR2LCB2YWx1ZSwgZXJyLlN0cmluZygpKQotICAgIH0KLSAgICBzIDo9IHN0cmNvbnYuRnRvYTY0KGR2LCAnZycsIDEwKQotICAgIGlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKLSAgICAgIGlmICFtYXRoLklzSW5mKGR2LCAxKSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBKc29uUXVvdGUoSlNPTl9JTkZJTklUWSkpCi0gICAgICB9Ci0gICAgfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIDApIHsKLSAgICAgIGlmICFtYXRoLklzSW5mKGR2LCAwKSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBKc29uUXVvdGUoSlNPTl9ORUdBVElWRV9JTkZJTklUWSkpCi0gICAgICB9Ci0gICAgfSBlbHNlIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKLSAgICAgIGlmICFtYXRoLklzTmFOKGR2KSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywgSnNvblF1b3RlKEpTT05fTkFOKSkKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgZXhwZWN0ZWQgOj0gc3RyY29udi5GdG9hNjQodmFsdWUsICdnJywgMTApCi0gICAgICBpZiBzICE9IGV4cGVjdGVkIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQgJXYiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywgZXhwZWN0ZWQpCi0gICAgICB9Ci0gICAgICB2IDo9IGZsb2F0NjQoMCkKLSAgICAgIGlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICAgIH0KLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICB9Ci0gIHRyYW5zLkNsb3NlKCkKLX0KLQotCi1mdW5jIFRlc3RSZWFkV3JpdGVKU09OU3RydWN0KHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJzdHJ1Y3QiCi0gIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICBwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCi0gIG9yaWcgOj0gTmV3V29yaygpCi0gIG9yaWcuTnVtMSA9IDI1Ci0gIG9yaWcuTnVtMiA9IDEwMgotICBvcmlnLk9wID0gQURECi0gIG9yaWcuQ29tbWVudCA9ICJBZGQ6IDI1ICsgMTAyIgotICBpZiBlIDo9IG9yaWcuV3JpdGUocCk7IGUgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICUjdiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgb3JpZywgZS5TdHJpbmcoKSkKLSAgfQotICBwLkZsdXNoKCkKLSAgdC5Mb2coIk1lbW9yeSBidWZmZXIgY29udGVudHM6ICIsIHRyYW5zLlN0cmluZygpKQotICBleHBlY3RlZFN0cmluZyA6PSAie1wiMVwiOntcImkzMlwiOjI1fSxcIjJcIjp7XCJpMzJcIjoxMDJ9LFwiM1wiOntcImkzMlwiOjF9LFwiNFwiOntcInN0clwiOlwiQWRkOiAyNSArIDEwMlwifX0iCi0gIGlmIGV4cGVjdGVkU3RyaW5nICE9IHRyYW5zLlN0cmluZygpIHsKLSAgICB0LkZhdGFsZigiRXhwZWN0ZWQgSlNPTiBTdHJ1Y3Qgd2l0aCB2YWx1ZSAlI3YgYnV0IGhhdmUgJSN2IiwgZXhwZWN0ZWRTdHJpbmcsIHRyYW5zLlN0cmluZygpKQotICB9Ci0gIHJlYWQgOj0gTmV3V29yaygpCi0gIGUgOj0gcmVhZC5SZWFkKHApCi0gIHQuTG9nZigiUmVhZCAlcyB2YWx1ZTogJSN2IiwgdGhldHlwZSwgcmVhZCkKLSAgaWYgZSAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgZS5TdHJpbmcoKSkKLSAgfQotICBpZiAhb3JpZy5FcXVhbHMocmVhZCkgewotICAgIHQuRmF0YWxmKCJPcmlnaW5hbCBXcml0ZSAhPSBSZWFkOiAlI3YgIT0gJSN2ICIsIG9yaWcsIHJlYWQpCi0gIH0KLX0KLQotZnVuYyBUZXN0UmVhZFdyaXRlSlNPTlByb3RvY29sKHQgKnRlc3RpbmcuVCkgewotICBSZWFkV3JpdGVQcm90b2NvbFRlc3QodCwgTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKSkKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdGxpc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3RsaXN0LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzhmYzNiLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdGxpc3QuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi1pbXBvcnQgKAotICAiY29udGFpbmVyL3ZlY3RvciIKLSkKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdGhhdCBlbmNhcHN1bGF0ZXMgbGlzdCBtZXRhZGF0YS4KLSAqCi0gKi8KLXR5cGUgVExpc3QgaW50ZXJmYWNlIHsKLSAgVENvbnRhaW5lcgotICBFbGVtVHlwZSgpIFRUeXBlCi0gIEF0KGkgaW50KSBpbnRlcmZhY2V7fQotICBTZXQoaSBpbnQsIGRhdGEgaW50ZXJmYWNle30pCi0gIFB1c2goZGF0YSBpbnRlcmZhY2V7fSkKLSAgUG9wKCkgaW50ZXJmYWNle30KLSAgU3dhcChpLCBqIGludCkKLSAgSW5zZXJ0KGkgaW50LCBkYXRhIGludGVyZmFjZXt9KQotICBEZWxldGUoaSBpbnQpCi0gIExlc3MoaSwgaiBpbnQpIGJvb2wKLSAgSXRlcigpIDwtY2hhbiBpbnRlcmZhY2V7fQotfQotCi10eXBlIHRMaXN0IHN0cnVjdCB7Ci0gIGVsZW1UeXBlIFRUeXBlCi0gIGwgICAgICAgICp2ZWN0b3IuVmVjdG9yCi19Ci0KLWZ1bmMgTmV3VExpc3QodCBUVHlwZSwgcyBpbnQpIFRMaXN0IHsKLSAgdmFyIHYgdmVjdG9yLlZlY3RvcgotICByZXR1cm4gJnRMaXN0e2VsZW1UeXBlOiB0LCBsOiB2LlJlc2l6ZShzLCBzKX0KLX0KLQotZnVuYyBOZXdUTGlzdERlZmF1bHQoKSBUTGlzdCB7Ci0gIHZhciB2IHZlY3Rvci5WZWN0b3IKLSAgcmV0dXJuICZ0TGlzdHtlbGVtVHlwZTogVFR5cGUoU1RPUCksIGw6ICZ2fQotfQotCi1mdW5jIChwICp0TGlzdCkgRWxlbVR5cGUoKSBUVHlwZSB7Ci0gIHJldHVybiBwLmVsZW1UeXBlCi19Ci0KLWZ1bmMgKHAgKnRMaXN0KSBMZW4oKSBpbnQgewotICByZXR1cm4gcC5sLkxlbigpCi19Ci0KLWZ1bmMgKHAgKnRMaXN0KSBBdChpIGludCkgaW50ZXJmYWNle30gewotICByZXR1cm4gcC5sLkF0KGkpCi19Ci0KLWZ1bmMgKHAgKnRMaXN0KSBTZXQoaSBpbnQsIGRhdGEgaW50ZXJmYWNle30pIHsKLSAgaWYgcC5lbGVtVHlwZS5Jc0VtcHR5VHlwZSgpIHsKLSAgICBwLmVsZW1UeXBlID0gVHlwZUZyb21WYWx1ZShkYXRhKQotICB9Ci0gIGlmIGRhdGEsIG9rIDo9IHAuZWxlbVR5cGUuQ29lcmNlRGF0YShkYXRhKTsgb2sgewotICAgIHAubC5TZXQoaSwgZGF0YSkKLSAgfQotfQotCi1mdW5jIChwICp0TGlzdCkgUHVzaChkYXRhIGludGVyZmFjZXt9KSB7Ci0gIGlmIHAuZWxlbVR5cGUuSXNFbXB0eVR5cGUoKSB7Ci0gICAgcC5lbGVtVHlwZSA9IFR5cGVGcm9tVmFsdWUoZGF0YSkKLSAgfQotICBkYXRhLCBvayA6PSBwLmVsZW1UeXBlLkNvZXJjZURhdGEoZGF0YSkKLSAgaWYgb2sgewotICAgIHAubC5QdXNoKGRhdGEpCi0gIH0KLX0KLQotZnVuYyAocCAqdExpc3QpIFBvcCgpIGludGVyZmFjZXt9IHsKLSAgcmV0dXJuIHAubC5Qb3AoKQotfQotCi1mdW5jIChwICp0TGlzdCkgU3dhcChpLCBqIGludCkgewotICBwLmwuU3dhcChpLCBqKQotfQotCi1mdW5jIChwICp0TGlzdCkgSW5zZXJ0KGkgaW50LCBkYXRhIGludGVyZmFjZXt9KSB7Ci0gIHAubC5JbnNlcnQoaSwgZGF0YSkKLX0KLQotZnVuYyAocCAqdExpc3QpIERlbGV0ZShpIGludCkgewotICBwLmwuRGVsZXRlKGkpCi19Ci0KLWZ1bmMgKHAgKnRMaXN0KSBDb250YWlucyhkYXRhIGludGVyZmFjZXt9KSBib29sIHsKLSAgcmV0dXJuIHAuaW5kZXhPZihkYXRhKSA+PSAwCi19Ci0KLWZ1bmMgKHAgKnRMaXN0KSBMZXNzKGksIGogaW50KSBib29sIHsKLSAgcmV0dXJuIHAubC5MZXNzKGksIGopCi19Ci0KLWZ1bmMgKHAgKnRMaXN0KSBJdGVyKCkgPC1jaGFuIGludGVyZmFjZXt9IHsKLSAgYyA6PSBtYWtlKGNoYW4gaW50ZXJmYWNle30pCi0gIGdvIHAuaXRlcmF0ZShjKQotICByZXR1cm4gYwotfQotCi1mdW5jIChwICp0TGlzdCkgaXRlcmF0ZShjIGNoYW48LSBpbnRlcmZhY2V7fSkgewotICBmb3IgXywgZWxlbSA6PSByYW5nZSAqcC5sIHsKLSAgICBjIDwtIGVsZW0KLSAgfQotICBjbG9zZShjKQotfQotCi1mdW5jIChwICp0TGlzdCkgaW5kZXhPZihkYXRhIGludGVyZmFjZXt9KSBpbnQgewotICBpZiBkYXRhID09IG5pbCB7Ci0gICAgc2l6ZSA6PSBwLmwuTGVuKCkKLSAgICBmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKLSAgICAgIGlmIHAubC5BdChpKSA9PSBuaWwgewotICAgICAgICByZXR1cm4gaQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gLTEKLSAgfQotICBkYXRhLCBvayA6PSBwLmVsZW1UeXBlLkNvZXJjZURhdGEoZGF0YSkKLSAgaWYgZGF0YSA9PSBuaWwgfHwgIW9rIHsKLSAgICByZXR1cm4gLTEKLSAgfQotICBzaXplIDo9IHAubC5MZW4oKQotICBpZiBwLmVsZW1UeXBlLklzQmFzZVR5cGUoKSB8fCBwLmVsZW1UeXBlLklzRW51bSgpIHsKLSAgICBmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKLSAgICAgIGlmIGRhdGEgPT0gcC5sLkF0KGkpIHsKLSAgICAgICAgcmV0dXJuIGkKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIC0xCi0gIH0KLSAgaWYgY21wLCBvayA6PSBkYXRhLihFcXVhbHNPdGhlckludGVyZmFjZSk7IG9rIHsKLSAgICBmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKLSAgICAgIGlmIGNtcC5FcXVhbHMocC5sLkF0KGkpKSB7Ci0gICAgICAgIHJldHVybiBpCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAtMQotICB9Ci0gIHN3aXRjaCBwLmVsZW1UeXBlIHsKLSAgY2FzZSBNQVA6Ci0gICAgaWYgY21wLCBvayA6PSBkYXRhLihFcXVhbHNNYXApOyBvayB7Ci0gICAgICBmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKLSAgICAgICAgdiA6PSBwLmwuQXQoaSkKLSAgICAgICAgaWYgdiA9PSBuaWwgewotICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIH0KLSAgICAgICAgaWYgY21wLkVxdWFscyh2LihUTWFwKSkgewotICAgICAgICAgIHJldHVybiBpCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiAtMQotICAgIH0KLSAgY2FzZSBTRVQ6Ci0gICAgaWYgY21wLCBvayA6PSBkYXRhLihFcXVhbHNTZXQpOyBvayB7Ci0gICAgICBmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKLSAgICAgICAgdiA6PSBwLmwuQXQoaSkKLSAgICAgICAgaWYgdiA9PSBuaWwgewotICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIH0KLSAgICAgICAgaWYgY21wLkVxdWFscyh2LihUU2V0KSkgewotICAgICAgICAgIHJldHVybiBpCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiAtMQotICAgIH0KLSAgY2FzZSBMSVNUOgotICAgIGlmIGNtcCwgb2sgOj0gZGF0YS4oRXF1YWxzTGlzdCk7IG9rIHsKLSAgICAgIGZvciBpIDo9IDA7IGkgPCBzaXplOyBpKysgewotICAgICAgICB2IDo9IHAubC5BdChpKQotICAgICAgICBpZiB2ID09IG5pbCB7Ci0gICAgICAgICAgY29udGludWUKLSAgICAgICAgfQotICAgICAgICBpZiBjbXAuRXF1YWxzKHYuKFRMaXN0KSkgewotICAgICAgICAgIHJldHVybiBpCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiAtMQotICAgIH0KLSAgY2FzZSBTVFJVQ1Q6Ci0gICAgaWYgY21wLCBvayA6PSBkYXRhLihFcXVhbHNTdHJ1Y3QpOyBvayB7Ci0gICAgICBmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKLSAgICAgICAgdiA6PSBwLmwuQXQoaSkKLSAgICAgICAgaWYgdiA9PSBuaWwgewotICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIH0KLSAgICAgICAgaWYgY21wLkVxdWFscyh2LihUU3RydWN0KSkgewotICAgICAgICAgIHJldHVybiBpCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiAtMQotICAgIH0KLSAgfQotICByZXR1cm4gLTEKLX0KLQotZnVuYyAocCAqdExpc3QpIEVxdWFscyhvdGhlciBpbnRlcmZhY2V7fSkgYm9vbCB7Ci0gIGMsIGNvayA6PSBwLkNvbXBhcmVUbyhvdGhlcikKLSAgcmV0dXJuIGNvayAmJiBjID09IDAKLX0KLQotZnVuYyAocCAqdExpc3QpIENvbXBhcmVUbyhvdGhlciBpbnRlcmZhY2V7fSkgKGludCwgYm9vbCkgewotICByZXR1cm4gVFR5cGUoTElTVCkuQ29tcGFyZShwLCBvdGhlcikKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdG1hcC5nbyBiL2xpYi9nby90aHJpZnQvdG1hcC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0MmYwNS4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3RtYXAuZ28KKysrIC9kZXYvbnVsbApAQCAtMSw3NjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi1pbXBvcnQgKAotICAiY29udGFpbmVyL2xpc3QiCi0gICJyZWZsZWN0IgotKQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0aGF0IGVuY2Fwc3VsYXRlcyBtYXAgbWV0YWRhdGEuCi0gKgotICovCi10eXBlIFRNYXAgaW50ZXJmYWNlIHsKLSAgS2V5VHlwZSgpIFRUeXBlCi0gIFZhbHVlVHlwZSgpIFRUeXBlCi0gIExlbigpIGludAotICBTZXQoa2V5LCB2YWx1ZSBpbnRlcmZhY2V7fSkKLSAgR2V0KGtleSBpbnRlcmZhY2V7fSkgKGludGVyZmFjZXt9LCBib29sKQotICBDb250YWlucyhrZXkgaW50ZXJmYWNle30pIGJvb2wKLSAgSXRlcigpIDwtY2hhbiBUTWFwRWxlbQotICBLZXlJdGVyKCkgPC1jaGFuIGludGVyZmFjZXt9Ci0gIFZhbHVlSXRlcigpIDwtY2hhbiBpbnRlcmZhY2V7fQotICBLZXlzKCkgW11pbnRlcmZhY2V7fQotICBWYWx1ZXMoKSBbXWludGVyZmFjZXt9Ci0gIExlc3Mob3RoZXIgaW50ZXJmYWNle30pIGJvb2wKLSAgRXF1YWxzKG90aGVyIGludGVyZmFjZXt9KSBib29sCi0gIENvbXBhcmVUbyhvdGhlciBpbnRlcmZhY2V7fSkgKGludCwgYm9vbCkKLX0KLQotdHlwZSBUTWFwRWxlbSBpbnRlcmZhY2UgewotICBLZXkoKSBpbnRlcmZhY2V7fQotICBWYWx1ZSgpIGludGVyZmFjZXt9Ci19Ci0KLXR5cGUgdE1hcCBzdHJ1Y3QgewotICBrZXlUeXBlICAgVFR5cGUKLSAgdmFsdWVUeXBlIFRUeXBlCi0gIHNpemUgICAgICBpbnQKLSAgbCAgICAgICAgICpsaXN0Lkxpc3QKLSAgYiAgICAgICAgIG1hcFtib29sXWludGVyZmFjZXt9Ci0gIGkwOCAgICAgICBtYXBbYnl0ZV1pbnRlcmZhY2V7fQotICBpMTYgICAgICAgbWFwW2ludDE2XWludGVyZmFjZXt9Ci0gIGkzMiAgICAgICBtYXBbaW50MzJdaW50ZXJmYWNle30KLSAgaTY0ICAgICAgIG1hcFtpbnQ2NF1pbnRlcmZhY2V7fQotICBmNjQgICAgICAgbWFwW2Zsb2F0NjRdaW50ZXJmYWNle30KLSAgcyAgICAgICAgIG1hcFtzdHJpbmddaW50ZXJmYWNle30KLX0KLQotdHlwZSB0TWFwRWxlbSBzdHJ1Y3QgewotICBrZXkgICBpbnRlcmZhY2V7fQotICB2YWx1ZSBpbnRlcmZhY2V7fQotfQotCi1mdW5jIChwICp0TWFwRWxlbSkgS2V5KCkgaW50ZXJmYWNle30gewotICByZXR1cm4gcC5rZXkKLX0KLQotZnVuYyAocCAqdE1hcEVsZW0pIFZhbHVlKCkgaW50ZXJmYWNle30gewotICByZXR1cm4gcC52YWx1ZQotfQotCi1mdW5jIE5ld1RNYXBFbGVtKGssIHYgaW50ZXJmYWNle30pIFRNYXBFbGVtIHsKLSAgcmV0dXJuICZ0TWFwRWxlbXtrZXk6IGssIHZhbHVlOiB2fQotfQotCi1mdW5jIE5ld1RNYXAoaywgdiBUVHlwZSwgcyBpbnQpIFRNYXAgewotICByZXR1cm4gJnRNYXB7a2V5VHlwZTogaywgdmFsdWVUeXBlOiB2LCBzaXplOiBzLCBsOiBsaXN0Lk5ldygpfQotfQotCi1mdW5jIE5ld1RNYXBEZWZhdWx0KCkgVE1hcCB7Ci0gIHJldHVybiBOZXdUTWFwKFNUT1AsIFNUT1AsIDApCi19Ci0KLWZ1bmMgKHAgKnRNYXApIEtleVR5cGUoKSBUVHlwZSB7Ci0gIHJldHVybiBwLmtleVR5cGUKLX0KLQotZnVuYyAocCAqdE1hcCkgVmFsdWVUeXBlKCkgVFR5cGUgewotICByZXR1cm4gcC52YWx1ZVR5cGUKLX0KLQotZnVuYyAocCAqdE1hcCkgTGVuKCkgaW50IHsKLSAgaWYgcC5sLkxlbigpICE9IDAgewotICAgIHJldHVybiBwLmwuTGVuKCkKLSAgfQotICBzd2l0Y2ggcC5LZXlUeXBlKCkgewotICBjYXNlIFNUT1AsIFZPSUQ6Ci0gICAgcmV0dXJuIDAKLSAgY2FzZSBCT09MOgotICAgIHJldHVybiBsZW4ocC5iKQotICBjYXNlIEJZVEU6Ci0gICAgcmV0dXJuIGxlbihwLmkwOCkKLSAgY2FzZSBJMTY6Ci0gICAgcmV0dXJuIGxlbihwLmkxNikKLSAgY2FzZSBJMzI6Ci0gICAgcmV0dXJuIGxlbihwLmkzMikKLSAgY2FzZSBJNjQ6Ci0gICAgcmV0dXJuIGxlbihwLmk2NCkKLSAgY2FzZSBET1VCTEU6Ci0gICAgcmV0dXJuIGxlbihwLmY2NCkKLSAgY2FzZSBTVFJJTkcsIFVURjgsIFVURjE2OgotICAgIHJldHVybiBsZW4ocC5zKQotICBkZWZhdWx0OgotICAgIHJldHVybiBwLnNpemUKLSAgfQotICByZXR1cm4gcC5zaXplCi19Ci0KLWZ1bmMgKHAgKnRNYXApIEdldChrZXkgaW50ZXJmYWNle30pIChpbnRlcmZhY2V7fSwgYm9vbCkgewotICBpZiBwLktleVR5cGUoKS5Jc0VtcHR5VHlwZSgpIHsKLSAgICByZXR1cm4gbmlsLCBmYWxzZQotICB9Ci0gIGlmIGtleSA9PSBuaWwgewotICAgIGZvciBlbGVtIDo9IHAubC5Gcm9udCgpOyBlbGVtICE9IG5pbDsgZWxlbSA9IGVsZW0uTmV4dCgpIHsKLSAgICAgIGUgOj0gZWxlbS5WYWx1ZS4oVE1hcEVsZW0pCi0gICAgICBrIDo9IGUuS2V5KCkKLSAgICAgIGlmIGsgPT0gbmlsIHsKLSAgICAgICAgcmV0dXJuIGUuVmFsdWUoKSwgdHJ1ZQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmlsLCBmYWxzZQotICB9Ci0gIHVzZUtleSwgb2sgOj0gcC5LZXlUeXBlKCkuQ29lcmNlRGF0YShrZXkpCi0gIGlmICFvayB7Ci0gICAgcmV0dXJuIG5pbCwgZmFsc2UKLSAgfQotICBzd2l0Y2ggcC5LZXlUeXBlKCkgewotICBjYXNlIFNUT1AsIFZPSUQ6Ci0gICAgLy8gaWYgaGVyZSwgdGhlbiB3ZSBkb24ndCBoYXZlIGEga2V5IHR5cGUgeWV0IGFuZCBrZXkgaXMgbm90IG5pbAotICAgIC8vIHNvIHRoaXMgaXMgcHJldHR5IG11Y2ggYW4gZW1wdHkgbWFwCi0gICAgcmV0dXJuIG5pbCwgZmFsc2UKLSAgY2FzZSBCT09MOgotICAgIG0gOj0gcC5iCi0gICAgaWYgbSA9PSBuaWwgewotICAgICAgcmV0dXJuIG5pbCwgZmFsc2UKLSAgICB9Ci0gICAgaWYgdiwgb2sgOj0gbVt1c2VLZXkuKGJvb2wpXTsgb2sgewotICAgICAgcmV0dXJuIHYsIHRydWUKLSAgICB9Ci0gICAgcmV0dXJuIG5pbCwgdHJ1ZQotICBjYXNlIEJZVEU6Ci0gICAgbSA6PSBwLmkwOAotICAgIGlmIHYsIG9rIDo9IG1bdXNlS2V5LihieXRlKV07IG9rIHsKLSAgICAgIHJldHVybiB2LCB0cnVlCi0gICAgfQotICAgIHJldHVybiBuaWwsIGZhbHNlCi0gIGNhc2UgRE9VQkxFOgotICAgIG0gOj0gcC5mNjQKLSAgICBpZiBtID09IG5pbCB7Ci0gICAgICByZXR1cm4gbmlsLCBmYWxzZQotICAgIH0KLSAgICBpZiB2LCBvayA6PSBtW3VzZUtleS4oZmxvYXQ2NCldOyBvayB7Ci0gICAgICByZXR1cm4gdiwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gbmlsLCBmYWxzZQotICBjYXNlIEkxNjoKLSAgICBtIDo9IHAuaTE2Ci0gICAgaWYgbSA9PSBuaWwgewotICAgICAgcmV0dXJuIG5pbCwgZmFsc2UKLSAgICB9Ci0gICAgaWYgdiwgb2sgOj0gbVt1c2VLZXkuKGludDE2KV07IG9rIHsKLSAgICAgIHJldHVybiB2LCB0cnVlCi0gICAgfQotICAgIHJldHVybiBuaWwsIGZhbHNlCi0gIGNhc2UgSTMyOgotICAgIG0gOj0gcC5pMzIKLSAgICBpZiBtID09IG5pbCB7Ci0gICAgICByZXR1cm4gbmlsLCBmYWxzZQotICAgIH0KLSAgICBpZiB2LCBvayA6PSBtW3VzZUtleS4oaW50MzIpXTsgb2sgewotICAgICAgcmV0dXJuIHYsIHRydWUKLSAgICB9Ci0gICAgcmV0dXJuIG5pbCwgZmFsc2UKLSAgY2FzZSBJNjQ6Ci0gICAgbSA6PSBwLmk2NAotICAgIGlmIG0gPT0gbmlsIHsKLSAgICAgIHJldHVybiBuaWwsIGZhbHNlCi0gICAgfQotICAgIGlmIHYsIG9rIDo9IG1bdXNlS2V5LihpbnQ2NCldOyBvayB7Ci0gICAgICByZXR1cm4gdiwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gbmlsLCBmYWxzZQotICBjYXNlIFNUUklORywgVVRGOCwgVVRGMTY6Ci0gICAgLy8gVE9ETyhwb21hY2spIHByb3Blcmx5IGhhbmRsZSBFTlVNCi0gICAgbSA6PSBwLnMKLSAgICBpZiBtID09IG5pbCB7Ci0gICAgICByZXR1cm4gbmlsLCBmYWxzZQotICAgIH0KLSAgICBpZiB2LCBvayA6PSBtW3VzZUtleS4oc3RyaW5nKV07IG9rIHsKLSAgICAgIHJldHVybiB2LCB0cnVlCi0gICAgfQotICAgIHJldHVybiBuaWwsIGZhbHNlCi0gIGNhc2UgU1RSVUNUOgotICAgIGZvciBlbGVtIDo9IHAubC5Gcm9udCgpOyBlbGVtICE9IG5pbDsgZWxlbSA9IGVsZW0uTmV4dCgpIHsKLSAgICAgIGUgOj0gZWxlbS5WYWx1ZS4oVE1hcEVsZW0pCi0gICAgICBrIDo9IGUuS2V5KCkKLSAgICAgIGlmIGsgPT0gbmlsIHsKLSAgICAgICAgY29udGludWUKLSAgICAgIH0KLSAgICAgIHN0cnVjdGtleSwgb2sgOj0gay4oVFN0cnVjdCkKLSAgICAgIGlmIG9rIHsKLSAgICAgICAgaWYgc3RydWN0a2V5LkVxdWFscyh1c2VLZXkuKFRTdHJ1Y3QpKSB7Ci0gICAgICAgICAgcmV0dXJuIGUuVmFsdWUoKSwgdHJ1ZQotICAgICAgICB9Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICB9Ci0gICAgICBpZiByZWZsZWN0LkRlZXBFcXVhbCh1c2VLZXksIGspIHsKLSAgICAgICAgcmV0dXJuIGUuVmFsdWUoKSwgdHJ1ZQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmlsLCBmYWxzZQotICBjYXNlIE1BUDoKLSAgICBmb3IgZWxlbSA6PSBwLmwuRnJvbnQoKTsgZWxlbSAhPSBuaWw7IGVsZW0gPSBlbGVtLk5leHQoKSB7Ci0gICAgICBlIDo9IGVsZW0uVmFsdWUuKFRNYXBFbGVtKQotICAgICAgayA6PSBlLktleSgpCi0gICAgICBpZiBrID09IG5pbCB7Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICB9Ci0gICAgICBtYXBrZXksIG9rIDo9IGsuKFRNYXApCi0gICAgICBpZiBvayB7Ci0gICAgICAgIGlmIG1hcGtleS5FcXVhbHModXNlS2V5LihUTWFwKSkgewotICAgICAgICAgIHJldHVybiBlLlZhbHVlKCksIHRydWUKLSAgICAgICAgfQotICAgICAgICBjb250aW51ZQotICAgICAgfQotICAgICAgaWYgcmVmbGVjdC5EZWVwRXF1YWwodXNlS2V5LCBrKSB7Ci0gICAgICAgIHJldHVybiBlLlZhbHVlKCksIHRydWUKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5pbCwgZmFsc2UKLSAgY2FzZSBTRVQ6Ci0gICAgZm9yIGVsZW0gOj0gcC5sLkZyb250KCk7IGVsZW0gIT0gbmlsOyBlbGVtID0gZWxlbS5OZXh0KCkgewotICAgICAgZSA6PSBlbGVtLlZhbHVlLihUTWFwRWxlbSkKLSAgICAgIGsgOj0gZS5LZXkoKQotICAgICAgaWYgayA9PSBuaWwgewotICAgICAgICBjb250aW51ZQotICAgICAgfQotICAgICAgc2V0a2V5LCBvayA6PSBrLihUU2V0KQotICAgICAgaWYgb2sgewotICAgICAgICBpZiBzZXRrZXkuRXF1YWxzKHVzZUtleS4oVFNldCkpIHsKLSAgICAgICAgICByZXR1cm4gZS5WYWx1ZSgpLCB0cnVlCi0gICAgICAgIH0KLSAgICAgICAgY29udGludWUKLSAgICAgIH0KLSAgICAgIGlmIHJlZmxlY3QuRGVlcEVxdWFsKHVzZUtleSwgaykgewotICAgICAgICByZXR1cm4gZS5WYWx1ZSgpLCB0cnVlCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuaWwsIGZhbHNlCi0gIGNhc2UgTElTVDoKLSAgICBmb3IgZWxlbSA6PSBwLmwuRnJvbnQoKTsgZWxlbSAhPSBuaWw7IGVsZW0gPSBlbGVtLk5leHQoKSB7Ci0gICAgICBlIDo9IGVsZW0uVmFsdWUuKFRNYXBFbGVtKQotICAgICAgayA6PSBlLktleSgpCi0gICAgICBpZiBrID09IG5pbCB7Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICB9Ci0gICAgICBsaXN0a2V5LCBvayA6PSBrLihUTGlzdCkKLSAgICAgIGlmIG9rIHsKLSAgICAgICAgaWYgbGlzdGtleS5FcXVhbHModXNlS2V5LihUTGlzdCkpIHsKLSAgICAgICAgICByZXR1cm4gZS5WYWx1ZSgpLCB0cnVlCi0gICAgICAgIH0KLSAgICAgICAgY29udGludWUKLSAgICAgIH0KLSAgICAgIGlmIHJlZmxlY3QuRGVlcEVxdWFsKHVzZUtleSwgaykgewotICAgICAgICByZXR1cm4gZS5WYWx1ZSgpLCB0cnVlCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuaWwsIGZhbHNlCi0gIGRlZmF1bHQ6Ci0gICAgcGFuaWMoIkludmFsaWQgVGhyaWZ0IGVsZW1lbnQgdHlwZSIpCi0gIH0KLSAgcmV0dXJuIG5pbCwgZmFsc2UKLX0KLQotCi1mdW5jIChwICp0TWFwKSBTZXQoa2V5LCB2YWx1ZSBpbnRlcmZhY2V7fSkgewotICBpZiBwLktleVR5cGUoKSA9PSBTVE9QIHx8IHAuS2V5VHlwZSgpID09IFZPSUQgewotICAgIHAua2V5VHlwZSA9IFR5cGVGcm9tVmFsdWUoa2V5KQotICB9Ci0gIGNvZXJjZWRLZXksIG9rIDo9IHAuS2V5VHlwZSgpLkNvZXJjZURhdGEoa2V5KQotICBpZiAhb2sgewotICAgIHJldHVybgotICB9Ci0gIGlmIHAuVmFsdWVUeXBlKCkgPT0gU1RPUCB8fCBwLlZhbHVlVHlwZSgpID09IFZPSUQgewotICAgIHAudmFsdWVUeXBlID0gVHlwZUZyb21WYWx1ZSh2YWx1ZSkKLSAgfQotICBjb2VyY2VkVmFsdWUsIG9rIDo9IHAuVmFsdWVUeXBlKCkuQ29lcmNlRGF0YSh2YWx1ZSkKLSAgaWYgIW9rIHsKLSAgICByZXR1cm4KLSAgfQotICBuZXdFbGVtIDo9IE5ld1RNYXBFbGVtKGNvZXJjZWRLZXksIGNvZXJjZWRWYWx1ZSkKLSAgaWYgIXAuS2V5VHlwZSgpLklzQmFzZVR5cGUoKSB7Ci0gICAgZm9yIGVsZW0gOj0gcC5sLkZyb250KCk7IGVsZW0gIT0gbmlsOyBlbGVtID0gZWxlbS5OZXh0KCkgewotICAgICAgayA6PSBlbGVtLlZhbHVlLihUTWFwRWxlbSkuS2V5KCkKLSAgICAgIGlmIGNtcCwgb2sgOj0gcC5LZXlUeXBlKCkuQ29tcGFyZShjb2VyY2VkS2V5LCBrKTsgb2sgJiYgY21wID49IDAgewotICAgICAgICBpZiBjbXAgPT0gMCB7Ci0gICAgICAgICAgcC5sLkluc2VydEFmdGVyKG5ld0VsZW0sIGVsZW0pCi0gICAgICAgICAgcC5sLlJlbW92ZShlbGVtKQotICAgICAgICAgIHJldHVybgotICAgICAgICB9Ci0gICAgICAgIHAubC5JbnNlcnRCZWZvcmUobmV3RWxlbSwgZWxlbSkKLSAgICAgICAgcmV0dXJuCi0gICAgICB9Ci0gICAgfQotICAgIHAubC5QdXNoQmFjayhuZXdFbGVtKQotICAgIHJldHVybgotICB9Ci0gIGlmIGtleSA9PSBuaWwgewotICAgIHJldHVybgotICB9Ci0gIHN3aXRjaCBwLktleVR5cGUoKSB7Ci0gIGNhc2UgU1RPUCwgVk9JRDoKLSAgICAvLyBpZiBoZXJlLCB0aGVuIHdlIGRvbid0IGhhdmUgYSBrZXkgdHlwZSB5ZXQgYW5kIGtleSBpcyBub3QgbmlsCi0gICAgLy8gc28gdGhpcyBpcyBwcmV0dHkgbXVjaCBhbiBlbXB0eSBtYXAKLSAgICByZXR1cm4KLSAgY2FzZSBCT09MOgotICAgIGlmIHAuYiA9PSBuaWwgewotICAgICAgcC5iID0gbWFrZShtYXBbYm9vbF1pbnRlcmZhY2V7fSkKLSAgICB9Ci0gICAgYiA6PSBjb2VyY2VkS2V5Lihib29sKQotICAgIHAuYltiXSA9IHZhbHVlCi0gIGNhc2UgQllURToKLSAgICBpZiBwLmkwOCA9PSBuaWwgewotICAgICAgcC5pMDggPSBtYWtlKG1hcFtieXRlXWludGVyZmFjZXt9KQotICAgIH0KLSAgICBiIDo9IGNvZXJjZWRLZXkuKGJ5dGUpCi0gICAgcC5pMDhbYl0gPSB2YWx1ZQotICBjYXNlIERPVUJMRToKLSAgICBpZiBwLmY2NCA9PSBuaWwgewotICAgICAgcC5mNjQgPSBtYWtlKG1hcFtmbG9hdDY0XWludGVyZmFjZXt9KQotICAgIH0KLSAgICBiIDo9IGNvZXJjZWRLZXkuKGZsb2F0NjQpCi0gICAgcC5mNjRbYl0gPSB2YWx1ZQotICBjYXNlIEkxNjoKLSAgICBpZiBwLmkxNiA9PSBuaWwgewotICAgICAgcC5pMTYgPSBtYWtlKG1hcFtpbnQxNl1pbnRlcmZhY2V7fSkKLSAgICB9Ci0gICAgYiA6PSBjb2VyY2VkS2V5LihpbnQxNikKLSAgICBwLmkxNltiXSA9IHZhbHVlCi0gIGNhc2UgSTMyOgotICAgIGlmIHAuaTMyID09IG5pbCB7Ci0gICAgICBwLmkzMiA9IG1ha2UobWFwW2ludDMyXWludGVyZmFjZXt9KQotICAgIH0KLSAgICBiIDo9IGNvZXJjZWRLZXkuKGludDMyKQotICAgIHAuaTMyW2JdID0gdmFsdWUKLSAgY2FzZSBJNjQ6Ci0gICAgaWYgcC5pNjQgPT0gbmlsIHsKLSAgICAgIHAuaTY0ID0gbWFrZShtYXBbaW50NjRdaW50ZXJmYWNle30pCi0gICAgfQotICAgIGIgOj0gY29lcmNlZEtleS4oaW50NjQpCi0gICAgcC5pNjRbYl0gPSB2YWx1ZQotICBjYXNlIFNUUklORywgVVRGOCwgVVRGMTY6Ci0gICAgaWYgcC5zID09IG5pbCB7Ci0gICAgICBwLnMgPSBtYWtlKG1hcFtzdHJpbmddaW50ZXJmYWNle30pCi0gICAgfQotICAgIGIgOj0gY29lcmNlZEtleS4oc3RyaW5nKQotICAgIHAuc1tiXSA9IHZhbHVlCi0gIGNhc2UgU1RSVUNULCBNQVAsIFNFVCwgTElTVDoKLSAgICBwYW5pYygiU2hvdWxkIG5ldmVyIGJlIGhlcmUiKQotICBkZWZhdWx0OgotICAgIHBhbmljKCJTaG91bGQgbmV2ZXIgYmUgaGVyZSIpCi0gIH0KLX0KLQotZnVuYyAocCAqdE1hcCkgQ29udGFpbnMoa2V5IGludGVyZmFjZXt9KSBib29sIHsKLSAgY29lcmNlZEtleSwgb2sgOj0gcC5LZXlUeXBlKCkuQ29lcmNlRGF0YShrZXkpCi0gIGlmICFvayB7Ci0gICAgcmV0dXJuIGZhbHNlCi0gIH0KLSAgaWYgY29lcmNlZEtleSA9PSBuaWwgewotICAgIGZvciBlbGVtIDo9IHAubC5Gcm9udCgpOyBlbGVtICE9IG5pbDsgZWxlbSA9IGVsZW0uTmV4dCgpIHsKLSAgICAgIGsgOj0gZWxlbS5WYWx1ZS4oVE1hcEVsZW0pLktleSgpCi0gICAgICBpZiBrID09IG5pbCB7Ci0gICAgICAgIHJldHVybiB0cnVlCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZQotICB9Ci0gIGlmICFvayB7Ci0gICAgcmV0dXJuIGZhbHNlCi0gIH0KLSAgc3dpdGNoIHAuS2V5VHlwZSgpIHsKLSAgY2FzZSBTVE9QOgotICAgIC8vIGlmIGhlcmUsIHRoZW4gd2UgZG9uJ3QgaGF2ZSBhIGtleSB0eXBlIHlldCBhbmQga2V5IGlzIG5vdCBuaWwKLSAgICAvLyBzbyB0aGlzIGlzIHByZXR0eSBtdWNoIGFuIGVtcHR5IG1hcAotICAgIHJldHVybiBmYWxzZQotICBjYXNlIFZPSUQ6Ci0gICAgLy8gaWYgaGVyZSwgdGhlbiB3ZSBkb24ndCBoYXZlIGEga2V5IHR5cGUgeWV0IGFuZCBrZXkgaXMgbm90IG5pbAotICAgIC8vIHNvIHRoaXMgaXMgcHJldHR5IG11Y2ggYW4gZW1wdHkgbWFwCi0gICAgcmV0dXJuIGZhbHNlCi0gIGNhc2UgQk9PTDoKLSAgICBtIDo9IHAuYgotICAgIGlmIG0gPT0gbmlsIHsKLSAgICAgIHJldHVybiBmYWxzZQotICAgIH0KLSAgICBfLCBvayA6PSBtW2NvZXJjZWRLZXkuKGJvb2wpXQotICAgIHJldHVybiBvawotICBjYXNlIEJZVEU6Ci0gICAgbSA6PSBwLmkwOAotICAgIF8sIG9rIDo9IG1bY29lcmNlZEtleS4oYnl0ZSldCi0gICAgcmV0dXJuIG9rCi0gIGNhc2UgRE9VQkxFOgotICAgIG0gOj0gcC5mNjQKLSAgICBpZiBtID09IG5pbCB7Ci0gICAgICByZXR1cm4gZmFsc2UKLSAgICB9Ci0gICAgXywgb2sgOj0gbVtjb2VyY2VkS2V5LihmbG9hdDY0KV0KLSAgICByZXR1cm4gb2sKLSAgY2FzZSBJMTY6Ci0gICAgbSA6PSBwLmkxNgotICAgIGlmIG0gPT0gbmlsIHsKLSAgICAgIHJldHVybiBmYWxzZQotICAgIH0KLSAgICBfLCBvayA6PSBtW2NvZXJjZWRLZXkuKGludDE2KV0KLSAgICByZXR1cm4gb2sKLSAgY2FzZSBJMzI6Ci0gICAgbSA6PSBwLmkzMgotICAgIGlmIG0gPT0gbmlsIHsKLSAgICAgIHJldHVybiBmYWxzZQotICAgIH0KLSAgICBfLCBvayA6PSBtW2NvZXJjZWRLZXkuKGludDMyKV0KLSAgICByZXR1cm4gb2sKLSAgY2FzZSBJNjQ6Ci0gICAgbSA6PSBwLmk2NAotICAgIGlmIG0gPT0gbmlsIHsKLSAgICAgIHJldHVybiBmYWxzZQotICAgIH0KLSAgICBfLCBvayA6PSBtW2NvZXJjZWRLZXkuKGludDY0KV0KLSAgICByZXR1cm4gb2sKLSAgY2FzZSBTVFJJTkcsIFVURjgsIFVURjE2OgotICAgIC8vIFRPRE8ocG9tYWNrKSBwcm9wZXJseSBoYW5kbGUgRU5VTQotICAgIG0gOj0gcC5zCi0gICAgaWYgbSA9PSBuaWwgewotICAgICAgcmV0dXJuIGZhbHNlCi0gICAgfQotICAgIF8sIG9rIDo9IG1bY29lcmNlZEtleS4oc3RyaW5nKV0KLSAgICByZXR1cm4gb2sKLSAgY2FzZSBTVFJVQ1Q6Ci0gICAgZm9yIGVsZW0gOj0gcC5sLkZyb250KCk7IGVsZW0gIT0gbmlsOyBlbGVtID0gZWxlbS5OZXh0KCkgewotICAgICAgZSA6PSBlbGVtLlZhbHVlLihUTWFwRWxlbSkKLSAgICAgIGsgOj0gZS5LZXkoKQotICAgICAgaWYgayA9PSBuaWwgewotICAgICAgICBjb250aW51ZQotICAgICAgfQotICAgICAgc3RydWN0a2V5LCBvayA6PSBrLihUU3RydWN0KQotICAgICAgaWYgb2sgewotICAgICAgICBpZiBzdHJ1Y3RrZXkuRXF1YWxzKGNvZXJjZWRLZXkuKFRTdHJ1Y3QpKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWUKLSAgICAgICAgfQotICAgICAgICBjb250aW51ZQotICAgICAgfQotICAgICAgaWYgcmVmbGVjdC5EZWVwRXF1YWwoY29lcmNlZEtleSwgaykgewotICAgICAgICByZXR1cm4gdHJ1ZQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2UKLSAgY2FzZSBNQVA6Ci0gICAgZm9yIGVsZW0gOj0gcC5sLkZyb250KCk7IGVsZW0gIT0gbmlsOyBlbGVtID0gZWxlbS5OZXh0KCkgewotICAgICAgZSA6PSBlbGVtLlZhbHVlLihUTWFwRWxlbSkKLSAgICAgIGsgOj0gZS5LZXkoKQotICAgICAgaWYgayA9PSBuaWwgewotICAgICAgICBjb250aW51ZQotICAgICAgfQotICAgICAgbWFwa2V5LCBvayA6PSBrLihUTWFwKQotICAgICAgaWYgb2sgewotICAgICAgICBpZiBtYXBrZXkuRXF1YWxzKGNvZXJjZWRLZXkuKFRNYXApKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWUKLSAgICAgICAgfQotICAgICAgICBjb250aW51ZQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2UKLSAgY2FzZSBTRVQ6Ci0gICAgZm9yIGVsZW0gOj0gcC5sLkZyb250KCk7IGVsZW0gIT0gbmlsOyBlbGVtID0gZWxlbS5OZXh0KCkgewotICAgICAgZSA6PSBlbGVtLlZhbHVlLihUTWFwRWxlbSkKLSAgICAgIGsgOj0gZS5LZXkoKQotICAgICAgaWYgayA9PSBuaWwgewotICAgICAgICBjb250aW51ZQotICAgICAgfQotICAgICAgc2V0a2V5LCBvayA6PSBrLihUU2V0KQotICAgICAgaWYgb2sgewotICAgICAgICBpZiBzZXRrZXkuRXF1YWxzKGNvZXJjZWRLZXkuKFRTZXQpKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWUKLSAgICAgICAgfQotICAgICAgICBjb250aW51ZQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2UKLSAgY2FzZSBMSVNUOgotICAgIGZvciBlbGVtIDo9IHAubC5Gcm9udCgpOyBlbGVtICE9IG5pbDsgZWxlbSA9IGVsZW0uTmV4dCgpIHsKLSAgICAgIGUgOj0gZWxlbS5WYWx1ZS4oVE1hcEVsZW0pCi0gICAgICBrIDo9IGUuS2V5KCkKLSAgICAgIGlmIGsgPT0gbmlsIHsKLSAgICAgICAgY29udGludWUKLSAgICAgIH0KLSAgICAgIGxpc3RrZXksIG9rIDo9IGsuKFRMaXN0KQotICAgICAgaWYgb2sgewotICAgICAgICBpZiBsaXN0a2V5LkVxdWFscyhjb2VyY2VkS2V5LihUTGlzdCkpIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZQotICAgICAgICB9Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZQotICBkZWZhdWx0OgotICAgIHBhbmljKCJJbnZhbGlkIFRocmlmdCBlbGVtZW50IHR5cGUiKQotICB9Ci0gIHJldHVybiBmYWxzZQotfQotCi0vLyBJdGVyYXRlIG92ZXIgYWxsIGVsZW1lbnRzOyBkcml2ZXIgZm9yIHJhbmdlCi1mdW5jIChwICp0TWFwKSBpdGVyYXRlKGMgY2hhbjwtIFRNYXBFbGVtKSB7Ci0gIHN3aXRjaCBwLktleVR5cGUoKSB7Ci0gIGNhc2UgU1RPUCwgVk9JRDoKLSAgICBjbG9zZShjKQotICBjYXNlIEJPT0w6Ci0gICAgZm9yIGssIHYgOj0gcmFuZ2UgcC5iIHsKLSAgICAgIGMgPC0gTmV3VE1hcEVsZW0oaywgdikKLSAgICB9Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBCWVRFOgotICAgIGZvciBrLCB2IDo9IHJhbmdlIHAuaTA4IHsKLSAgICAgIGMgPC0gTmV3VE1hcEVsZW0oaywgdikKLSAgICB9Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBJMTY6Ci0gICAgZm9yIGssIHYgOj0gcmFuZ2UgcC5pMTYgewotICAgICAgYyA8LSBOZXdUTWFwRWxlbShrLCB2KQotICAgIH0KLSAgICBjbG9zZShjKQotICBjYXNlIEkzMjoKLSAgICBmb3IgaywgdiA6PSByYW5nZSBwLmkzMiB7Ci0gICAgICBjIDwtIE5ld1RNYXBFbGVtKGssIHYpCi0gICAgfQotICAgIGNsb3NlKGMpCi0gIGNhc2UgSTY0OgotICAgIGZvciBrLCB2IDo9IHJhbmdlIHAuaTY0IHsKLSAgICAgIGMgPC0gTmV3VE1hcEVsZW0oaywgdikKLSAgICB9Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBET1VCTEU6Ci0gICAgZm9yIGssIHYgOj0gcmFuZ2UgcC5mNjQgewotICAgICAgYyA8LSBOZXdUTWFwRWxlbShrLCB2KQotICAgIH0KLSAgICBjbG9zZShjKQotICBjYXNlIFNUUklORywgVVRGOCwgVVRGMTY6Ci0gICAgZm9yIGssIHYgOj0gcmFuZ2UgcC5zIHsKLSAgICAgIGMgPC0gTmV3VE1hcEVsZW0oaywgdikKLSAgICB9Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBTVFJVQ1Q6Ci0gICAgZm9yIHYgOj0gcC5sLkZyb250KCk7IHYgIT0gbmlsOyB2ID0gdi5OZXh0KCkgewotICAgICAgYyA8LSB2LlZhbHVlLihUTWFwRWxlbSkKLSAgICB9Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBMSVNUOgotICAgIGZvciB2IDo9IHAubC5Gcm9udCgpOyB2ICE9IG5pbDsgdiA9IHYuTmV4dCgpIHsKLSAgICAgIGMgPC0gdi5WYWx1ZS4oVE1hcEVsZW0pCi0gICAgfQotICAgIGNsb3NlKGMpCi0gIGNhc2UgU0VUOgotICAgIGZvciB2IDo9IHAubC5Gcm9udCgpOyB2ICE9IG5pbDsgdiA9IHYuTmV4dCgpIHsKLSAgICAgIGMgPC0gdi5WYWx1ZS4oVE1hcEVsZW0pCi0gICAgfQotICAgIGNsb3NlKGMpCi0gIGRlZmF1bHQ6Ci0gICAgcGFuaWMoIkludmFsaWQgVGhyaWZ0IHR5cGUiKQotICB9Ci19Ci0KLS8vIENoYW5uZWwgaXRlcmF0b3IgZm9yIHJhbmdlLgotZnVuYyAocCAqdE1hcCkgSXRlcigpIDwtY2hhbiBUTWFwRWxlbSB7Ci0gIGMgOj0gbWFrZShjaGFuIFRNYXBFbGVtKQotICBnbyBwLml0ZXJhdGUoYykKLSAgcmV0dXJuIGMKLX0KLQotLy8gSXRlcmF0ZSBvdmVyIGFsbCBrZXlzOyBkcml2ZXIgZm9yIHJhbmdlCi1mdW5jIChwICp0TWFwKSBpdGVyYXRlS2V5cyhjIGNoYW48LSBpbnRlcmZhY2V7fSkgewotICBzd2l0Y2ggcC5LZXlUeXBlKCkgewotICBjYXNlIFNUT1AsIFZPSUQ6Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBCT09MOgotICAgIGZvciBrLCBfIDo9IHJhbmdlIHAuYiB7Ci0gICAgICBjIDwtIGsKLSAgICB9Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBCWVRFOgotICAgIGZvciBrLCBfIDo9IHJhbmdlIHAuaTA4IHsKLSAgICAgIGMgPC0gawotICAgIH0KLSAgICBjbG9zZShjKQotICBjYXNlIEkxNjoKLSAgICBmb3IgaywgXyA6PSByYW5nZSBwLmkxNiB7Ci0gICAgICBjIDwtIGsKLSAgICB9Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBJMzI6Ci0gICAgZm9yIGssIF8gOj0gcmFuZ2UgcC5pMzIgewotICAgICAgYyA8LSBrCi0gICAgfQotICAgIGNsb3NlKGMpCi0gIGNhc2UgSTY0OgotICAgIGZvciBrLCBfIDo9IHJhbmdlIHAuaTY0IHsKLSAgICAgIGMgPC0gawotICAgIH0KLSAgICBjbG9zZShjKQotICBjYXNlIERPVUJMRToKLSAgICBmb3IgaywgXyA6PSByYW5nZSBwLmY2NCB7Ci0gICAgICBjIDwtIGsKLSAgICB9Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBTVFJJTkcsIFVURjgsIFVURjE2OgotICAgIGZvciBrLCBfIDo9IHJhbmdlIHAucyB7Ci0gICAgICBjIDwtIGsKLSAgICB9Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBTVFJVQ1Q6Ci0gICAgZm9yIHYgOj0gcC5sLkZyb250KCk7IHYgIT0gbmlsOyB2ID0gdi5OZXh0KCkgewotICAgICAgYyA8LSB2LlZhbHVlLihUTWFwRWxlbSkuS2V5KCkKLSAgICB9Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBMSVNUOgotICAgIGZvciB2IDo9IHAubC5Gcm9udCgpOyB2ICE9IG5pbDsgdiA9IHYuTmV4dCgpIHsKLSAgICAgIGMgPC0gdi5WYWx1ZS4oVE1hcEVsZW0pLktleSgpCi0gICAgfQotICAgIGNsb3NlKGMpCi0gIGNhc2UgU0VUOgotICAgIGZvciB2IDo9IHAubC5Gcm9udCgpOyB2ICE9IG5pbDsgdiA9IHYuTmV4dCgpIHsKLSAgICAgIGMgPC0gdi5WYWx1ZS4oVE1hcEVsZW0pLktleSgpCi0gICAgfQotICAgIGNsb3NlKGMpCi0gIGRlZmF1bHQ6Ci0gICAgcGFuaWMoIkludmFsaWQgVGhyaWZ0IHR5cGUiKQotICB9Ci19Ci0KLWZ1bmMgKHAgKnRNYXApIEtleUl0ZXIoKSA8LWNoYW4gaW50ZXJmYWNle30gewotICBjIDo9IG1ha2UoY2hhbiBpbnRlcmZhY2V7fSkKLSAgZ28gcC5pdGVyYXRlS2V5cyhjKQotICByZXR1cm4gYwotfQotCi0vLyBJdGVyYXRlIG92ZXIgYWxsIHZhbHVlczsgZHJpdmVyIGZvciByYW5nZQotZnVuYyAocCAqdE1hcCkgaXRlcmF0ZVZhbHVlcyhjIGNoYW48LSBpbnRlcmZhY2V7fSkgewotICBzd2l0Y2ggcC5LZXlUeXBlKCkgewotICBjYXNlIFNUT1AsIFZPSUQ6Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBCT09MOgotICAgIGZvciBfLCB2IDo9IHJhbmdlIHAuYiB7Ci0gICAgICBjIDwtIHYKLSAgICB9Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBCWVRFOgotICAgIGZvciBfLCB2IDo9IHJhbmdlIHAuaTA4IHsKLSAgICAgIGMgPC0gdgotICAgIH0KLSAgICBjbG9zZShjKQotICBjYXNlIEkxNjoKLSAgICBmb3IgXywgdiA6PSByYW5nZSBwLmkxNiB7Ci0gICAgICBjIDwtIHYKLSAgICB9Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBJMzI6Ci0gICAgZm9yIF8sIHYgOj0gcmFuZ2UgcC5pMzIgewotICAgICAgYyA8LSB2Ci0gICAgfQotICAgIGNsb3NlKGMpCi0gIGNhc2UgSTY0OgotICAgIGZvciBfLCB2IDo9IHJhbmdlIHAuaTY0IHsKLSAgICAgIGMgPC0gdgotICAgIH0KLSAgICBjbG9zZShjKQotICBjYXNlIERPVUJMRToKLSAgICBmb3IgXywgdiA6PSByYW5nZSBwLmY2NCB7Ci0gICAgICBjIDwtIHYKLSAgICB9Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBTVFJJTkcsIFVURjgsIFVURjE2OgotICAgIGZvciBfLCB2IDo9IHJhbmdlIHAucyB7Ci0gICAgICBjIDwtIHYKLSAgICB9Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBTVFJVQ1Q6Ci0gICAgZm9yIHYgOj0gcC5sLkZyb250KCk7IHYgIT0gbmlsOyB2ID0gdi5OZXh0KCkgewotICAgICAgYyA8LSB2LlZhbHVlLihUTWFwRWxlbSkuVmFsdWUoKQotICAgIH0KLSAgICBjbG9zZShjKQotICBjYXNlIExJU1Q6Ci0gICAgZm9yIHYgOj0gcC5sLkZyb250KCk7IHYgIT0gbmlsOyB2ID0gdi5OZXh0KCkgewotICAgICAgYyA8LSB2LlZhbHVlLihUTWFwRWxlbSkuVmFsdWUoKQotICAgIH0KLSAgICBjbG9zZShjKQotICBjYXNlIFNFVDoKLSAgICBmb3IgdiA6PSBwLmwuRnJvbnQoKTsgdiAhPSBuaWw7IHYgPSB2Lk5leHQoKSB7Ci0gICAgICBjIDwtIHYuVmFsdWUuKFRNYXBFbGVtKS5WYWx1ZSgpCi0gICAgfQotICAgIGNsb3NlKGMpCi0gIGRlZmF1bHQ6Ci0gICAgcGFuaWMoIkludmFsaWQgVGhyaWZ0IHR5cGUiKQotICB9Ci19Ci0KLWZ1bmMgKHAgKnRNYXApIFZhbHVlSXRlcigpIDwtY2hhbiBpbnRlcmZhY2V7fSB7Ci0gIGMgOj0gbWFrZShjaGFuIGludGVyZmFjZXt9KQotICBnbyBwLml0ZXJhdGVWYWx1ZXMoYykKLSAgcmV0dXJuIGMKLX0KLQotCi1mdW5jIChwICp0TWFwKSBMZXNzKG90aGVyIGludGVyZmFjZXt9KSBib29sIHsKLSAgY21wLCBvayA6PSBwLkNvbXBhcmVUbyhvdGhlcikKLSAgcmV0dXJuIG9rICYmIGNtcCA+IDAKLX0KLQotZnVuYyAocCAqdE1hcCkgRXF1YWxzKG90aGVyIGludGVyZmFjZXt9KSBib29sIHsKLSAgYywgY29rIDo9IHAuQ29tcGFyZVRvKG90aGVyKQotICByZXR1cm4gY29rICYmIGMgPT0gMAotfQotCi1mdW5jIChwICp0TWFwKSBDb21wYXJlVG8ob3RoZXIgaW50ZXJmYWNle30pIChpbnQsIGJvb2wpIHsKLSAgcmV0dXJuIFRUeXBlKE1BUCkuQ29tcGFyZShwLCBvdGhlcikKLX0KLQotZnVuYyAocCAqdE1hcCkgS2V5cygpIFtdaW50ZXJmYWNle30gewotICBzaXplIDo9IHAuTGVuKCkKLSAgdmFsdWVzIDo9IG1ha2UoW11pbnRlcmZhY2V7fSwgc2l6ZSwgc2l6ZSkKLSAgaSA6PSAwCi0gIGZvciBrIDo9IHJhbmdlIHAuS2V5SXRlcigpIHsKLSAgICB2YWx1ZXNbaV0gPSBrCi0gICAgaSsrCi0gIH0KLSAgcmV0dXJuIHZhbHVlcwotfQotCi1mdW5jIChwICp0TWFwKSBWYWx1ZXMoKSBbXWludGVyZmFjZXt9IHsKLSAgc2l6ZSA6PSBwLkxlbigpCi0gIHZhbHVlcyA6PSBtYWtlKFtdaW50ZXJmYWNle30sIHNpemUsIHNpemUpCi0gIGkgOj0gMAotICBmb3IgdiA6PSByYW5nZSBwLlZhbHVlSXRlcigpIHsKLSAgICB2YWx1ZXNbaV0gPSB2Ci0gICAgaSsrCi0gIH0KLSAgcmV0dXJuIHZhbHVlcwotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90bWVtb3J5X2J1ZmZlci5nbyBiL2xpYi9nby90aHJpZnQvdG1lbW9yeV9idWZmZXIuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5Yjc5NGUuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90bWVtb3J5X2J1ZmZlci5nbworKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLWltcG9ydCAoCi0gICJieXRlcyIKLSAgImlvIgotICAib3MiCi0pCi0KLS8qKgotICogTWVtb3J5IGJ1ZmZlci1iYXNlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCi0gKgotICovCi10eXBlIFRNZW1vcnlCdWZmZXIgc3RydWN0IHsKLSAgYnVmICAqYnl0ZXMuQnVmZmVyCi0gIHNpemUgaW50Ci19Ci0KLXR5cGUgVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3Rvcnkgc3RydWN0IHsKLSAgc2l6ZSBpbnQKLX0KLQotZnVuYyAocCAqVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSBUVHJhbnNwb3J0IHsKLSAgaWYgdHJhbnMgIT0gbmlsIHsKLSAgICB0LCBvayA6PSB0cmFucy4oKlRNZW1vcnlCdWZmZXIpCi0gICAgaWYgb2sgJiYgdC5zaXplID4gMCB7Ci0gICAgICByZXR1cm4gTmV3VE1lbW9yeUJ1ZmZlckxlbih0LnNpemUpCi0gICAgfQotICB9Ci0gIHJldHVybiBOZXdUTWVtb3J5QnVmZmVyTGVuKHAuc2l6ZSkKLX0KLQotZnVuYyBOZXdUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeShzaXplIGludCkgKlRNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5IHsKLSAgcmV0dXJuICZUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeXtzaXplOiBzaXplfQotfQotCi1mdW5jIE5ld1RNZW1vcnlCdWZmZXIoKSAqVE1lbW9yeUJ1ZmZlciB7Ci0gIHJldHVybiAmVE1lbW9yeUJ1ZmZlcntidWY6ICZieXRlcy5CdWZmZXJ7fSwgc2l6ZTogMH0KLX0KLQotZnVuYyBOZXdUTWVtb3J5QnVmZmVyTGVuKHNpemUgaW50KSAqVE1lbW9yeUJ1ZmZlciB7Ci0gIGJ1ZiA6PSBtYWtlKFtdYnl0ZSwgMCwgc2l6ZSkKLSAgcmV0dXJuICZUTWVtb3J5QnVmZmVye2J1ZjogYnl0ZXMuTmV3QnVmZmVyKGJ1ZiksIHNpemU6IHNpemV9Ci19Ci0KLWZ1bmMgKHAgKlRNZW1vcnlCdWZmZXIpIElzT3BlbigpIGJvb2wgewotICByZXR1cm4gdHJ1ZQotfQotCi1mdW5jIChwICpUTWVtb3J5QnVmZmVyKSBPcGVuKCkgb3MuRXJyb3IgewotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRNZW1vcnlCdWZmZXIpIFBlZWsoKSBib29sIHsKLSAgcmV0dXJuIHAuSXNPcGVuKCkKLX0KLQotZnVuYyAocCAqVE1lbW9yeUJ1ZmZlcikgQ2xvc2UoKSBvcy5FcnJvciB7Ci0gIHAuYnVmLlJlc2V0KCkKLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUTWVtb3J5QnVmZmVyKSBSZWFkKGJ1ZiBbXWJ5dGUpIChpbnQsIG9zLkVycm9yKSB7Ci0gIHJldHVybiBwLmJ1Zi5SZWFkKGJ1ZikKLX0KLQotZnVuYyAocCAqVE1lbW9yeUJ1ZmZlcikgUmVhZEFsbChidWYgW11ieXRlKSAoaW50LCBvcy5FcnJvcikgewotICByZXR1cm4gUmVhZEFsbFRyYW5zcG9ydChwLCBidWYpCi19Ci0KLWZ1bmMgKHAgKlRNZW1vcnlCdWZmZXIpIFJlYWRCeXRlKCkgKGJ5dGUsIG9zLkVycm9yKSB7Ci0gIHJldHVybiBwLmJ1Zi5SZWFkQnl0ZSgpCi19Ci0KLWZ1bmMgKHAgKlRNZW1vcnlCdWZmZXIpIFJlYWRGcm9tKHIgaW8uUmVhZGVyKSAoaW50NjQsIG9zLkVycm9yKSB7Ci0gIHJldHVybiBwLmJ1Zi5SZWFkRnJvbShyKQotfQotCi1mdW5jIChwICpUTWVtb3J5QnVmZmVyKSBXcml0ZShidWYgW11ieXRlKSAoaW50LCBvcy5FcnJvcikgewotICByZXR1cm4gcC5idWYuV3JpdGUoYnVmKQotfQotCi1mdW5jIChwICpUTWVtb3J5QnVmZmVyKSBXcml0ZVN0cmluZyhidWYgc3RyaW5nKSAoaW50LCBvcy5FcnJvcikgewotICByZXR1cm4gcC5idWYuV3JpdGVTdHJpbmcoYnVmKQotfQotCi1mdW5jIChwICpUTWVtb3J5QnVmZmVyKSBXcml0ZVRvKHcgaW8uV3JpdGVyKSAoaW50NjQsIG9zLkVycm9yKSB7Ci0gIHJldHVybiBwLmJ1Zi5Xcml0ZVRvKHcpCi19Ci0KLWZ1bmMgKHAgKlRNZW1vcnlCdWZmZXIpIEZsdXNoKCkgb3MuRXJyb3IgewotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRNZW1vcnlCdWZmZXIpIFJlc2V0KCkgewotICBwLmJ1Zi5SZXNldCgpCi19Ci0KLWZ1bmMgKHAgKlRNZW1vcnlCdWZmZXIpIEJ5dGVzKCkgW11ieXRlIHsKLSAgcmV0dXJuIHAuYnVmLkJ5dGVzKCkKLX0KLQotZnVuYyAocCAqVE1lbW9yeUJ1ZmZlcikgTGVuKCkgaW50IHsKLSAgcmV0dXJuIHAuYnVmLkxlbigpCi19Ci0KLWZ1bmMgKHAgKlRNZW1vcnlCdWZmZXIpIFN0cmluZygpIHN0cmluZyB7Ci0gIHJldHVybiBwLmJ1Zi5TdHJpbmcoKQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90bWVtb3J5X2J1ZmZlcl90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC90bWVtb3J5X2J1ZmZlcl90ZXN0LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDE3ODY0Li4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdG1lbW9yeV9idWZmZXJfdGVzdC5nbworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnRfdGVzdAotCi1pbXBvcnQgKAotICAuICJ0aHJpZnQiCi0gICJ0ZXN0aW5nIgotKQotCi1mdW5jIFRlc3RNZW1vcnlCdWZmZXIodCAqdGVzdGluZy5UKSB7Ci0gIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXJMZW4oMTAyNCkKLSAgVHJhbnNwb3J0VGVzdCh0LCB0cmFucywgdHJhbnMpCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RtZXNzYWdlLmdvIGIvbGliL2dvL3RocmlmdC90bWVzc2FnZS5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc2OGNiNC4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3RtZXNzYWdlLmdvCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0aGF0IGVuY2Fwc3VsYXRlcyBzdHJ1Y3QgbWV0YWRhdGEuCi0gKgotICovCi10eXBlIFRNZXNzYWdlIGludGVyZmFjZSB7Ci0gIE5hbWUoKSBzdHJpbmcKLSAgVHlwZUlkKCkgVE1lc3NhZ2VUeXBlCi0gIFNlcUlkKCkgaW50Ci0gIEVxdWFscyhvdGhlciBUTWVzc2FnZSkgYm9vbAotfQotdHlwZSB0TWVzc2FnZSBzdHJ1Y3QgewotICBuYW1lICAgc3RyaW5nCi0gIHR5cGVJZCBUTWVzc2FnZVR5cGUKLSAgc2VxaWQgIGludAotfQotCi1mdW5jIE5ld1RNZXNzYWdlRGVmYXVsdCgpIFRNZXNzYWdlIHsKLSAgcmV0dXJuIE5ld1RNZXNzYWdlKCIiLCBTVE9QLCAwKQotfQotCi1mdW5jIE5ld1RNZXNzYWdlKG4gc3RyaW5nLCB0IFRNZXNzYWdlVHlwZSwgcyBpbnQpIFRNZXNzYWdlIHsKLSAgcmV0dXJuICZ0TWVzc2FnZXtuYW1lOiBuLCB0eXBlSWQ6IHQsIHNlcWlkOiBzfQotfQotCi1mdW5jIChwICp0TWVzc2FnZSkgTmFtZSgpIHN0cmluZyB7Ci0gIHJldHVybiBwLm5hbWUKLX0KLQotZnVuYyAocCAqdE1lc3NhZ2UpIFR5cGVJZCgpIFRNZXNzYWdlVHlwZSB7Ci0gIHJldHVybiBwLnR5cGVJZAotfQotCi1mdW5jIChwICp0TWVzc2FnZSkgU2VxSWQoKSBpbnQgewotICByZXR1cm4gcC5zZXFpZAotfQotCi1mdW5jIChwICp0TWVzc2FnZSkgU3RyaW5nKCkgc3RyaW5nIHsKLSAgcmV0dXJuICI8VE1lc3NhZ2UgbmFtZTonIiArIHAubmFtZSArICInIHR5cGU6ICIgKyBzdHJpbmcocC50eXBlSWQpICsgIiBzZXFpZDoiICsgc3RyaW5nKHAuc2VxaWQpICsgIj4iCi19Ci0KLWZ1bmMgKHAgKnRNZXNzYWdlKSBFcXVhbHMob3RoZXIgVE1lc3NhZ2UpIGJvb2wgewotICByZXR1cm4gcC5uYW1lID09IG90aGVyLk5hbWUoKSAmJiBwLnR5cGVJZCA9PSBvdGhlci5UeXBlSWQoKSAmJiBwLnNlcWlkID09IG90aGVyLlNlcUlkKCkKLX0KLQotdmFyIEVNUFRZX01FU1NBR0UgVE1lc3NhZ2UKLQotZnVuYyBpbml0KCkgewotICBFTVBUWV9NRVNTQUdFID0gTmV3VE1lc3NhZ2VEZWZhdWx0KCkKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdG1lc3NhZ2V0eXBlLmdvIGIvbGliL2dvL3RocmlmdC90bWVzc2FnZXR5cGUuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMWM2NmMuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90bWVzc2FnZXR5cGUuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLS8qKgotICogTWVzc2FnZSB0eXBlIGNvbnN0YW50cyBpbiB0aGUgVGhyaWZ0IHByb3RvY29sLgotICoKLSAqLwotdHlwZSBUTWVzc2FnZVR5cGUgaW50MzIKLQotY29uc3QgKAotICBJTlZBTElEX1RNRVNTQUdFX1RZUEUgVE1lc3NhZ2VUeXBlID0gMAotICBDQUxMICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlID0gMQotICBSRVBMWSAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlID0gMgotICBFWENFUFRJT04gICAgICAgICAgICAgVE1lc3NhZ2VUeXBlID0gMwotICBPTkVXQVkgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlID0gNAotKQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90bm9uYmxvY2tpbmdfc2VydmVyLmdvIGIvbGliL2dvL3RocmlmdC90bm9uYmxvY2tpbmdfc2VydmVyLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjM0YzVhLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdG5vbmJsb2NraW5nX3NlcnZlci5nbworKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLWltcG9ydCAoCi0gICJvcyIKLSkKLQotLyoqCi0gKiBBIG5vbmJsb2NraW5nIFRTZXJ2ZXIgaW1wbGVtZW50YXRpb24uIFRoaXMgYWxsb3dzIGZvciBmYWlybmVzcyBhbW9uZ3N0IGFsbAotICogY29ubmVjdGVkIGNsaWVudHMgaW4gdGVybXMgb2YgaW52b2NhdGlvbnMuCi0gKgotICogVGhpcyBzZXJ2ZXIgaXMgaW5oZXJlbnRseSBzaW5nbGUtdGhyZWFkZWQuIElmIHlvdSB3YW50IGEgbGltaXRlZCB0aHJlYWQgcG9vbAotICogY291cGxlZCB3aXRoIGludm9jYXRpb24tZmFpcm5lc3MsIHNlZSBUSHNIYVNlcnZlci4KLSAqCi0gKiBUbyB1c2UgdGhpcyBzZXJ2ZXIsIHlvdSBNVVNUIHVzZSBhIFRGcmFtZWRUcmFuc3BvcnQgYXQgdGhlIG91dGVybW9zdAotICogdHJhbnNwb3J0LCBvdGhlcndpc2UgdGhpcyBzZXJ2ZXIgd2lsbCBiZSB1bmFibGUgdG8gZGV0ZXJtaW5lIHdoZW4gYSB3aG9sZQotICogbWV0aG9kIGNhbGwgaGFzIGJlZW4gcmVhZCBvZmYgdGhlIHdpcmUuIENsaWVudHMgbXVzdCBhbHNvIHVzZSBURnJhbWVkVHJhbnNwb3J0LgotICovCi10eXBlIFROb25ibG9ja2luZ1NlcnZlciBzdHJ1Y3QgewotICAvKiogRmxhZyBmb3Igc3RvcHBpbmcgdGhlIHNlcnZlciAqLwotICBzdG9wcGVkIGJvb2wKLQotICBwcm9jZXNzb3JGYWN0b3J5ICAgICAgIFRQcm9jZXNzb3JGYWN0b3J5Ci0gIHNlcnZlclRyYW5zcG9ydCAgICAgICAgVFNlcnZlclRyYW5zcG9ydAotICBpbnB1dFRyYW5zcG9ydEZhY3RvcnkgIFRUcmFuc3BvcnRGYWN0b3J5Ci0gIG91dHB1dFRyYW5zcG9ydEZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnkKLSAgaW5wdXRQcm90b2NvbEZhY3RvcnkgICBUUHJvdG9jb2xGYWN0b3J5Ci0gIG91dHB1dFByb3RvY29sRmFjdG9yeSAgVFByb3RvY29sRmFjdG9yeQotfQotCi0KLWZ1bmMgTmV3VE5vbmJsb2NraW5nU2VydmVyMihwcm9jZXNzb3IgVFByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0IFRTZXJ2ZXJUcmFuc3BvcnQpICpUTm9uYmxvY2tpbmdTZXJ2ZXIgewotICByZXR1cm4gTmV3VE5vbmJsb2NraW5nU2VydmVyRmFjdG9yeTIoTmV3VFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0KQotfQotCi1mdW5jIE5ld1ROb25ibG9ja2luZ1NlcnZlcjQocHJvY2Vzc29yIFRQcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCBUU2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkgVFByb3RvY29sRmFjdG9yeSkgKlROb25ibG9ja2luZ1NlcnZlciB7Ci0gIHJldHVybiBOZXdUTm9uYmxvY2tpbmdTZXJ2ZXJGYWN0b3J5NChOZXdUUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLAotICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgIHByb3RvY29sRmFjdG9yeSwKLSAgKQotfQotCi1mdW5jIE5ld1ROb25ibG9ja2luZ1NlcnZlcjYocHJvY2Vzc29yIFRQcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCBUU2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnksIGlucHV0UHJvdG9jb2xGYWN0b3J5IFRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSBUUHJvdG9jb2xGYWN0b3J5KSAqVE5vbmJsb2NraW5nU2VydmVyIHsKLSAgcmV0dXJuIE5ld1ROb25ibG9ja2luZ1NlcnZlckZhY3Rvcnk2KE5ld1RQcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksCi0gICAgc2VydmVyVHJhbnNwb3J0LAotICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgKQotfQotCi1mdW5jIE5ld1ROb25ibG9ja2luZ1NlcnZlckZhY3RvcnkyKHByb2Nlc3NvckZhY3RvcnkgVFByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCBUU2VydmVyVHJhbnNwb3J0KSAqVE5vbmJsb2NraW5nU2VydmVyIHsKLSAgcmV0dXJuIE5ld1ROb25ibG9ja2luZ1NlcnZlckZhY3Rvcnk2KHByb2Nlc3NvckZhY3RvcnksCi0gICAgc2VydmVyVHJhbnNwb3J0LAotICAgIE5ld1RUcmFuc3BvcnRGYWN0b3J5KCksCi0gICAgTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSwKLSAgICBOZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpLAotICAgIE5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCksCi0gICkKLX0KLQotZnVuYyBOZXdUTm9uYmxvY2tpbmdTZXJ2ZXJGYWN0b3J5NChwcm9jZXNzb3JGYWN0b3J5IFRQcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQgVFNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5IFRQcm90b2NvbEZhY3RvcnkpICpUTm9uYmxvY2tpbmdTZXJ2ZXIgewotICByZXR1cm4gTmV3VE5vbmJsb2NraW5nU2VydmVyRmFjdG9yeTYocHJvY2Vzc29yRmFjdG9yeSwKLSAgICBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgIHByb3RvY29sRmFjdG9yeSwKLSAgICBwcm90b2NvbEZhY3RvcnksCi0gICkKLX0KLQotZnVuYyBOZXdUTm9uYmxvY2tpbmdTZXJ2ZXJGYWN0b3J5Nihwcm9jZXNzb3JGYWN0b3J5IFRQcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQgVFNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5LCBpbnB1dFByb3RvY29sRmFjdG9yeSBUUHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkgVFByb3RvY29sRmFjdG9yeSkgKlROb25ibG9ja2luZ1NlcnZlciB7Ci0gIHJldHVybiAmVE5vbmJsb2NraW5nU2VydmVye3Byb2Nlc3NvckZhY3Rvcnk6IHByb2Nlc3NvckZhY3RvcnksCi0gICAgc2VydmVyVHJhbnNwb3J0OiAgICAgICAgc2VydmVyVHJhbnNwb3J0LAotICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeTogIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5OiAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgIG91dHB1dFByb3RvY29sRmFjdG9yeTogIG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgfQotfQotCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTZXJ2ZXIpIFByb2Nlc3NvckZhY3RvcnkoKSBUUHJvY2Vzc29yRmFjdG9yeSB7Ci0gIHJldHVybiBwLnByb2Nlc3NvckZhY3RvcnkKLX0KLQotZnVuYyAocCAqVE5vbmJsb2NraW5nU2VydmVyKSBTZXJ2ZXJUcmFuc3BvcnQoKSBUU2VydmVyVHJhbnNwb3J0IHsKLSAgcmV0dXJuIHAuc2VydmVyVHJhbnNwb3J0Ci19Ci0KLWZ1bmMgKHAgKlROb25ibG9ja2luZ1NlcnZlcikgSW5wdXRUcmFuc3BvcnRGYWN0b3J5KCkgVFRyYW5zcG9ydEZhY3RvcnkgewotICByZXR1cm4gcC5pbnB1dFRyYW5zcG9ydEZhY3RvcnkKLX0KLQotZnVuYyAocCAqVE5vbmJsb2NraW5nU2VydmVyKSBPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KCkgVFRyYW5zcG9ydEZhY3RvcnkgewotICByZXR1cm4gcC5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5Ci19Ci0KLWZ1bmMgKHAgKlROb25ibG9ja2luZ1NlcnZlcikgSW5wdXRQcm90b2NvbEZhY3RvcnkoKSBUUHJvdG9jb2xGYWN0b3J5IHsKLSAgcmV0dXJuIHAuaW5wdXRQcm90b2NvbEZhY3RvcnkKLX0KLQotZnVuYyAocCAqVE5vbmJsb2NraW5nU2VydmVyKSBPdXRwdXRQcm90b2NvbEZhY3RvcnkoKSBUUHJvdG9jb2xGYWN0b3J5IHsKLSAgcmV0dXJuIHAub3V0cHV0UHJvdG9jb2xGYWN0b3J5Ci19Ci0KLWZ1bmMgKHAgKlROb25ibG9ja2luZ1NlcnZlcikgU2VydmUoKSBvcy5FcnJvciB7Ci0gIHAuc3RvcHBlZCA9IGZhbHNlCi0gIGVyciA6PSBwLnNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gZXJyCi0gIH0KLSAgZm9yICFwLnN0b3BwZWQgewotICAgIGNsaWVudCwgZXJyIDo9IHAuc2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4gZXJyCi0gICAgfQotICAgIGlmIGNsaWVudCAhPSBuaWwgewotICAgICAgZ28gcC5wcm9jZXNzUmVxdWVzdChjbGllbnQpCi0gICAgfQotICB9Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVE5vbmJsb2NraW5nU2VydmVyKSBTdG9wKCkgb3MuRXJyb3IgewotICBwLnN0b3BwZWQgPSB0cnVlCi0gIHAuc2VydmVyVHJhbnNwb3J0LkludGVycnVwdCgpCi0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVE5vbmJsb2NraW5nU2VydmVyKSBJc1N0b3BwZWQoKSBib29sIHsKLSAgcmV0dXJuIHAuc3RvcHBlZAotfQotCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTZXJ2ZXIpIHByb2Nlc3NSZXF1ZXN0KGNsaWVudCBUVHJhbnNwb3J0KSB7Ci0gIHByb2Nlc3NvciA6PSBwLnByb2Nlc3NvckZhY3RvcnkuR2V0UHJvY2Vzc29yKGNsaWVudCkKLSAgaW5wdXRUcmFuc3BvcnQgOj0gcC5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCkKLSAgb3V0cHV0VHJhbnNwb3J0IDo9IHAub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KQotICBpbnB1dFByb3RvY29sIDo9IHAuaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpCi0gIG91dHB1dFByb3RvY29sIDo9IHAub3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCkKLSAgaWYgaW5wdXRUcmFuc3BvcnQgIT0gbmlsIHsKLSAgICBkZWZlciBpbnB1dFRyYW5zcG9ydC5DbG9zZSgpCi0gIH0KLSAgaWYgb3V0cHV0VHJhbnNwb3J0ICE9IG5pbCB7Ci0gICAgZGVmZXIgb3V0cHV0VHJhbnNwb3J0LkNsb3NlKCkKLSAgfQotICBmb3IgewotICAgIG9rLCBlIDo9IHByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKQotICAgIGlmIGUgIT0gbmlsIHsKLSAgICAgIGlmICFwLnN0b3BwZWQgewotICAgICAgICAvLyBUT0RPKHBvbWFjaykgbG9nIGVycm9yCi0gICAgICAgIGJyZWFrCi0gICAgICB9Ci0gICAgfQotICAgIGlmICFvayB7Ci0gICAgICBicmVhawotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90bm9uYmxvY2tpbmdfc2VydmVyX3NvY2tldC5nbyBiL2xpYi9nby90aHJpZnQvdG5vbmJsb2NraW5nX3NlcnZlcl9zb2NrZXQuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjOWRiYWEuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90bm9uYmxvY2tpbmdfc2VydmVyX3NvY2tldC5nbworKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLWltcG9ydCAoCi0gICJuZXQiCi0gICJvcyIKLSkKLQotLyoqCi0gKiBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLiBUbyBiZSBjb21tZW50ZWQgc29vbiEKLSAqLwotdHlwZSBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgc3RydWN0IHsKLSAgbGlzdGVuZXIgbmV0Lkxpc3RlbmVyCi0gIGFkZHIgICAgIG5ldC5BZGRyCi0gIC8qKgotICAgKiBTb2NrZXQgdGltZW91dAotICAgKi8KLSAgbnNlY1RpbWVvdXQgaW50NjQKLX0KLQotdHlwZSBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXRUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdCB7Ci0gIGFkZHIgbmV0LkFkZHIKLX0KLQotZnVuYyAocCAqVE5vbmJsb2NraW5nU2VydmVyU29ja2V0VHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIFRUcmFuc3BvcnQgewotICBpZiB0cmFucyAhPSBuaWwgewotICAgIHQsIG9rIDo9IHRyYW5zLigqVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KQotICAgIGlmIG9rICYmIHQuYWRkciAhPSBuaWwgewotICAgICAgcywgXyA6PSBOZXdUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXRBZGRyKHQuYWRkcikKLSAgICAgIHMuU2V0VGltZW91dCh0Lm5zZWNUaW1lb3V0KQotICAgICAgcmV0dXJuIHMKLSAgICB9Ci0gIH0KLSAgcywgXyA6PSBOZXdUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXRBZGRyKHAuYWRkcikKLSAgcmV0dXJuIHMKLX0KLQotZnVuYyBOZXdUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXRUcmFuc3BvcnRGYWN0b3J5KGFkZHIgbmV0LkFkZHIpICpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXRUcmFuc3BvcnRGYWN0b3J5IHsKLSAgcmV0dXJuICZUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXRUcmFuc3BvcnRGYWN0b3J5e2FkZHI6IGFkZHJ9Ci19Ci0KLQotZnVuYyBOZXdUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXRMaXN0ZW5lcihsaXN0ZW5lciBuZXQuTGlzdGVuZXIpICgqVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LCBUVHJhbnNwb3J0RXhjZXB0aW9uKSB7Ci0gIHMgOj0gJlROb25ibG9ja2luZ1NlcnZlclNvY2tldHtsaXN0ZW5lcjogbGlzdGVuZXIsIGFkZHI6IGxpc3RlbmVyLkFkZHIoKX0KLSAgcmV0dXJuIHMsIG5pbAotfQotCi1mdW5jIE5ld1ROb25ibG9ja2luZ1NlcnZlclNvY2tldEFkZHIoYWRkciBuZXQuQWRkcikgKCpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQsIFRUcmFuc3BvcnRFeGNlcHRpb24pIHsKLSAgcyA6PSAmVE5vbmJsb2NraW5nU2VydmVyU29ja2V0e2FkZHI6IGFkZHJ9Ci0gIHJldHVybiBzLCBuaWwKLX0KLQotZnVuYyAocCAqVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KSBMaXN0ZW4oKSBvcy5FcnJvciB7Ci0gIHJldHVybiBwLk9wZW4oKQotfQotCi0vKioKLSAqIFNldHMgdGhlIHNvY2tldCB0aW1lb3V0Ci0gKgotICogQHBhcmFtIHRpbWVvdXQgTmFub3NlY29uZHMgdGltZW91dAotICovCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQpIFNldFRpbWVvdXQobnNlY1RpbWVvdXQgaW50NjQpIG9zLkVycm9yIHsKLSAgcC5uc2VjVGltZW91dCA9IG5zZWNUaW1lb3V0Ci0gIHJldHVybiBuaWwKLX0KLQotLyoqCi0gKiBDaGVja3Mgd2hldGhlciB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZC4KLSAqLwotZnVuYyAocCAqVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KSBJc09wZW4oKSBib29sIHsKLSAgcmV0dXJuIHAubGlzdGVuZXIgIT0gbmlsCi19Ci0KLS8qKgotICogQ29ubmVjdHMgdGhlIHNvY2tldCwgY3JlYXRpbmcgYSBuZXcgc29ja2V0IG9iamVjdCBpZiBuZWNlc3NhcnkuCi0gKi8KLWZ1bmMgKHAgKlROb25ibG9ja2luZ1NlcnZlclNvY2tldCkgT3BlbigpIG9zLkVycm9yIHsKLSAgaWYgIXAuSXNPcGVuKCkgewotICAgIGwsIGVyciA6PSBuZXQuTGlzdGVuKHAuYWRkci5OZXR3b3JrKCksIHAuYWRkci5TdHJpbmcoKSkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiBlcnIKLSAgICB9Ci0gICAgcC5saXN0ZW5lciA9IGwKLSAgICByZXR1cm4gbmlsCi0gIH0KLSAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oQUxSRUFEWV9PUEVOLCAiU2VydmVyIHNvY2tldCBhbHJlYWR5IG9wZW4iKQotfQotCi0vKioKLSAqIFBlcmZvcm0gYSBub25ibG9ja2luZyByZWFkIGludG8gYnVmZmVyLgotICovCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQpIFJlYWQoYnVmIFtdYnl0ZSkgKGludCwgb3MuRXJyb3IpIHsKLSAgcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oVU5LTk9XTl9UUkFOU1BPUlRfRVhDRVBUSU9OLCAiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LlJlYWQoW11ieXRlKSBpcyBub3QgaW1wbGVtZW50ZWQiKQotfQotCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQpIFJlYWRBbGwoYnVmIFtdYnl0ZSkgKGludCwgb3MuRXJyb3IpIHsKLSAgcmV0dXJuIFJlYWRBbGxUcmFuc3BvcnQocCwgYnVmKQotfQotCi0vKioKLSAqIFBlcmZvcm0gYSBub25ibG9ja2luZyB3cml0ZSBvZiB0aGUgZGF0YSBpbiBidWZmZXI7Ci0gKi8KLWZ1bmMgKHAgKlROb25ibG9ja2luZ1NlcnZlclNvY2tldCkgV3JpdGUoYnVmIFtdYnl0ZSkgKGludCwgb3MuRXJyb3IpIHsKLSAgcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oVU5LTk9XTl9UUkFOU1BPUlRfRVhDRVBUSU9OLCAiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LldyaXRlKFtdYnl0ZSkgaXMgbm90IGltcGxlbWVudGVkIikKLX0KLQotLyoqCi0gKiBGbHVzaGVzIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gaWYgbm90IG51bGwuCi0gKi8KLWZ1bmMgKHAgKlROb25ibG9ja2luZ1NlcnZlclNvY2tldCkgRmx1c2goKSBvcy5FcnJvciB7Ci0gIHJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKFVOS05PV05fVFJBTlNQT1JUX0VYQ0VQVElPTiwgIlROb25ibG9ja2luZ1NlcnZlclNvY2tldC5GbHVzaCgpIGlzIG5vdCBpbXBsZW1lbnRlZCIpCi19Ci0KLWZ1bmMgKHAgKlROb25ibG9ja2luZ1NlcnZlclNvY2tldCkgQWRkcigpIG5ldC5BZGRyIHsKLSAgcmV0dXJuIHAuYWRkcgotfQotCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQpIEFjY2VwdCgpIChUVHJhbnNwb3J0LCBvcy5FcnJvcikgewotICBpZiAhcC5Jc09wZW4oKSB7Ci0gICAgcmV0dXJuIG5pbCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldCIpCi0gIH0KLSAgY29ubiwgZXJyIDo9IHAubGlzdGVuZXIuQWNjZXB0KCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIG5pbCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLSAgfQotICBjb25uLlNldFRpbWVvdXQocC5uc2VjVGltZW91dCkKLSAgcmV0dXJuIE5ld1RTb2NrZXRDb25uKGNvbm4pCi19Ci0KLWZ1bmMgKHAgKlROb25ibG9ja2luZ1NlcnZlclNvY2tldCkgUGVlaygpIGJvb2wgewotICByZXR1cm4gcC5Jc09wZW4oKQotfQotCi0vKioKLSAqIENsb3NlcyB0aGUgc29ja2V0LgotICovCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQpIENsb3NlKCkgKGVyciBvcy5FcnJvcikgewotICBpZiBwLklzT3BlbigpIHsKLSAgICBlcnIgOj0gcC5saXN0ZW5lci5DbG9zZSgpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLSAgICB9Ci0gICAgcC5saXN0ZW5lciA9IG5pbAotICB9Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KSBJbnRlcnJ1cHQoKSBvcy5FcnJvciB7Ci0gIC8vIHByb2JhYmx5IG5vdCByaWdodAotICByZXR1cm4gcC5DbG9zZSgpCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3Rub25ibG9ja2luZ19zb2NrZXQuZ28gYi9saWIvZ28vdGhyaWZ0L3Rub25ibG9ja2luZ19zb2NrZXQuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMTc1YjguLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90bm9uYmxvY2tpbmdfc29ja2V0LmdvCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnQKLQotaW1wb3J0ICgKLSAgIm5ldCIKLSAgIm9zIgotKQotCi0vKioKLSAqIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuIFRvIGJlIGNvbW1lbnRlZCBzb29uIQotICovCi10eXBlIFROb25ibG9ja2luZ1NvY2tldCBzdHJ1Y3QgewotICBjb25uIG5ldC5Db25uCi0gIGFkZHIgbmV0LkFkZHIKLSAgLyoqCi0gICAqIFNvY2tldCB0aW1lb3V0Ci0gICAqLwotICBuc2VjVGltZW91dCBpbnQ2NAotfQotCi10eXBlIFROb25ibG9ja2luZ1NvY2tldFRyYW5zcG9ydEZhY3Rvcnkgc3RydWN0IHsKLSAgYWRkciBuZXQuQWRkcgotfQotCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTb2NrZXRUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgVFRyYW5zcG9ydCB7Ci0gIGlmIHRyYW5zICE9IG5pbCB7Ci0gICAgdCwgb2sgOj0gdHJhbnMuKCpUTm9uYmxvY2tpbmdTb2NrZXQpCi0gICAgaWYgb2sgewotICAgICAgcywgXyA6PSBOZXdUTm9uYmxvY2tpbmdTb2NrZXRBZGRyKHQuYWRkcikKLSAgICAgIHMuU2V0VGltZW91dCh0Lm5zZWNUaW1lb3V0KQotICAgICAgcmV0dXJuIHMKLSAgICB9Ci0gIH0KLSAgcywgXyA6PSBOZXdUTm9uYmxvY2tpbmdTb2NrZXRBZGRyKHAuYWRkcikKLSAgcmV0dXJuIHMKLX0KLQotZnVuYyBOZXdUTm9uYmxvY2tpbmdTb2NrZXRUcmFuc3BvcnRGYWN0b3J5KGFkZHIgbmV0LkFkZHIpICpUTm9uYmxvY2tpbmdTb2NrZXRUcmFuc3BvcnRGYWN0b3J5IHsKLSAgcmV0dXJuICZUTm9uYmxvY2tpbmdTb2NrZXRUcmFuc3BvcnRGYWN0b3J5e2FkZHI6IGFkZHJ9Ci19Ci0KLWZ1bmMgTmV3VE5vbmJsb2NraW5nU29ja2V0Q29ubihjb25uIG5ldC5Db25uKSAoKlROb25ibG9ja2luZ1NvY2tldCwgVFRyYW5zcG9ydEV4Y2VwdGlvbikgewotICBzIDo9ICZUTm9uYmxvY2tpbmdTb2NrZXR7Y29ubjogY29ubiwgYWRkcjogY29ubi5SZW1vdGVBZGRyKCl9Ci0gIHJldHVybiBzLCBuaWwKLX0KLQotZnVuYyBOZXdUTm9uYmxvY2tpbmdTb2NrZXRBZGRyKGFkZHIgbmV0LkFkZHIpICgqVE5vbmJsb2NraW5nU29ja2V0LCBUVHJhbnNwb3J0RXhjZXB0aW9uKSB7Ci0gIHMgOj0gJlROb25ibG9ja2luZ1NvY2tldHthZGRyOiBhZGRyfQotICByZXR1cm4gcywgbmlsCi19Ci0KLS8qKgotICogU2V0cyB0aGUgc29ja2V0IHRpbWVvdXQKLSAqCi0gKiBAcGFyYW0gbnNlY1RpbWVvdXQgTmFub3NlY29uZHMgdGltZW91dAotICovCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTb2NrZXQpIFNldFRpbWVvdXQobnNlY1RpbWVvdXQgaW50NjQpIG9zLkVycm9yIHsKLSAgcC5uc2VjVGltZW91dCA9IG5zZWNUaW1lb3V0Ci0gIGlmIHAuSXNPcGVuKCkgewotICAgIGlmIGVyciA6PSBwLmNvbm4uU2V0VGltZW91dChuc2VjVGltZW91dCk7IGVyciAhPSBuaWwgewotICAgICAgTE9HR0VSLlByaW50KCJDb3VsZCBub3Qgc2V0IHNvY2tldCB0aW1lb3V0LiIsIGVycikKLSAgICAgIHJldHVybiBlcnIKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi0vKioKLSAqIENoZWNrcyB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkLgotICovCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTb2NrZXQpIElzT3BlbigpIGJvb2wgewotICByZXR1cm4gcC5jb25uICE9IG5pbAotfQotCi0vKioKLSAqIENvbm5lY3RzIHRoZSBzb2NrZXQsIGNyZWF0aW5nIGEgbmV3IHNvY2tldCBvYmplY3QgaWYgbmVjZXNzYXJ5LgotICovCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTb2NrZXQpIE9wZW4oKSBvcy5FcnJvciB7Ci0gIGlmIHAuSXNPcGVuKCkgewotICAgIHJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKEFMUkVBRFlfT1BFTiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZC4iKQotICB9Ci0gIGlmIHAuYWRkciA9PSBuaWwgewotICAgIHJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gbmlsIGFkZHJlc3MuIikKLSAgfQotICBpZiBsZW4ocC5hZGRyLk5ldHdvcmsoKSkgPT0gMCB7Ci0gICAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDYW5ub3Qgb3BlbiBiYWQgbmV0d29yayBuYW1lLiIpCi0gIH0KLSAgaWYgbGVuKHAuYWRkci5TdHJpbmcoKSkgPT0gMCB7Ci0gICAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDYW5ub3Qgb3BlbiBiYWQgYWRkcmVzcy4iKQotICB9Ci0KLSAgdmFyIGVyciBvcy5FcnJvcgotICBpZiBwLmNvbm4sIGVyciA9IG5ldC5EaWFsKHAuYWRkci5OZXR3b3JrKCksIHAuYWRkci5TdHJpbmcoKSk7IGVyciAhPSBuaWwgewotICAgIExPR0dFUi5QcmludCgiQ291bGQgbm90IG9wZW4gc29ja2V0IiwgZXJyLlN0cmluZygpKQotICAgIHJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCBlcnIuU3RyaW5nKCkpCi0gIH0KLSAgaWYgcC5jb25uICE9IG5pbCB7Ci0gICAgcC5jb25uLlNldFRpbWVvdXQocC5uc2VjVGltZW91dCkKLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLS8qKgotICogUGVyZm9ybSBhIG5vbmJsb2NraW5nIHJlYWQgaW50byBidWZmZXIuCi0gKi8KLWZ1bmMgKHAgKlROb25ibG9ja2luZ1NvY2tldCkgUmVhZChidWYgW11ieXRlKSAoaW50LCBvcy5FcnJvcikgewotICBpZiAhcC5Jc09wZW4oKSB7Ci0gICAgcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDb25uZWN0aW9uIG5vdCBvcGVuIikKLSAgfQotICBuLCBlcnIgOj0gcC5jb25uLlJlYWQoYnVmKQotICByZXR1cm4gbiwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLX0KLQotCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTb2NrZXQpIFJlYWRBbGwoYnVmIFtdYnl0ZSkgKGludCwgb3MuRXJyb3IpIHsKLSAgcmV0dXJuIFJlYWRBbGxUcmFuc3BvcnQocCwgYnVmKQotfQotCi0vKioKLSAqIFBlcmZvcm0gYSBub25ibG9ja2luZyB3cml0ZSBvZiB0aGUgZGF0YSBpbiBidWZmZXI7Ci0gKi8KLWZ1bmMgKHAgKlROb25ibG9ja2luZ1NvY2tldCkgV3JpdGUoYnVmIFtdYnl0ZSkgKGludCwgb3MuRXJyb3IpIHsKLSAgaWYgIXAuSXNPcGVuKCkgewotICAgIHJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ29ubmVjdGlvbiBub3Qgb3BlbiIpCi0gIH0KLSAgcmV0dXJuIHAuY29ubi5Xcml0ZShidWYpCi19Ci0KLS8qKgotICogRmx1c2hlcyB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtIGlmIG5vdCBudWxsLgotICovCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTb2NrZXQpIEZsdXNoKCkgb3MuRXJyb3IgewotICBpZiAhcC5Jc09wZW4oKSB7Ci0gICAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDb25uZWN0aW9uIG5vdCBvcGVuIikKLSAgfQotICBmLCBvayA6PSBwLmNvbm4uKEZsdXNoZXIpCi0gIGlmIG9rIHsKLSAgICBlcnIgOj0gZi5GbHVzaCgpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTb2NrZXQpIEFkZHIoKSBuZXQuQWRkciB7Ci0gIHJldHVybiBwLmFkZHIKLX0KLQotZnVuYyAocCAqVE5vbmJsb2NraW5nU29ja2V0KSBQZWVrKCkgYm9vbCB7Ci0gIHJldHVybiBwLklzT3BlbigpCi19Ci0KLS8qKgotICogQ2xvc2VzIHRoZSBzb2NrZXQuCi0gKi8KLWZ1bmMgKHAgKlROb25ibG9ja2luZ1NvY2tldCkgQ2xvc2UoKSBvcy5FcnJvciB7Ci0gIGlmIHAuY29ubiAhPSBuaWwgewotICAgIGlmIGVyciA6PSBwLmNvbm4uQ2xvc2UoKTsgZXJyICE9IG5pbCB7Ci0gICAgICBMT0dHRVIuUHJpbnQoIkNvdWxkIG5vdCBjbG9zZSBzb2NrZXQuIiwgZXJyLlN0cmluZygpKQotICAgICAgcmV0dXJuIGVycgotICAgIH0KLSAgICBwLmNvbm4gPSBuaWwKLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlROb25ibG9ja2luZ1NvY2tldCkgSW50ZXJydXB0KCkgb3MuRXJyb3IgewotICBpZiAhcC5Jc09wZW4oKSB7Ci0gICAgcmV0dXJuIG5pbAotICB9Ci0gIC8vIFRPRE8ocG9tYWNrKSBmaXggSW50ZXJydXB0IGFzIGl0IGlzIHByb2JhYmx5IG5vdCByaWdodAotICByZXR1cm4gcC5DbG9zZSgpCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3Rub25ibG9ja2luZ190cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L3Rub25ibG9ja2luZ190cmFuc3BvcnQuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhOWMyNmQuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90bm9uYmxvY2tpbmdfdHJhbnNwb3J0LmdvCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi10eXBlIFROb25ibG9ja2luZ1RyYW5zcG9ydCBpbnRlcmZhY2UgewotICBUVHJhbnNwb3J0Ci19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3Rub25ibG9ja2luZ190cmFuc3BvcnRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvdG5vbmJsb2NraW5nX3RyYW5zcG9ydF90ZXN0LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDAxOWRiLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdG5vbmJsb2NraW5nX3RyYW5zcG9ydF90ZXN0LmdvCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdF90ZXN0Ci0KLWltcG9ydCAoCi0gIC4gInRocmlmdCIKLSAgInRlc3RpbmciCi0gICJuZXQiCi0pCi0KLWZ1bmMgVGVzdE5vbmJsb2NraW5nVHJhbnNwb3J0U2VydmVyVG9DbGllbnQodCAqdGVzdGluZy5UKSB7Ci0KLSAgYWRkciwgZXJyIDo9IEZpbmRBdmFpbGFibGVUQ1BTZXJ2ZXJQb3J0KDQwMDAwKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIGZpbmQgYXZhaWxhYmxlIHRjcCBwb3J0IGFkZHI6ICVzIiwgZXJyKQotICB9Ci0gIHRyYW5zMSwgZXJyIDo9IE5ld1ROb25ibG9ja2luZ1NlcnZlclNvY2tldEFkZHIoYWRkcikKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byBzZXR1cCBzZXJ2ZXIgc29ja2V0IGxpc3RlbmVyOiAlcyIsIGVycikKLSAgfQotICB0cmFuczEuT3BlbigpCi0gIHRyYW5zMiwgZXJyIDo9IE5ld1ROb25ibG9ja2luZ1NvY2tldEFkZHIoYWRkcikKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byBzZXR1cCBjbGllbnQgc29ja2V0OiAlcyIsIGVycikKLSAgfQotICB0cmFuczEuU2V0VGltZW91dCgxMCkKLSAgdHJhbnMyLlNldFRpbWVvdXQoMTApCi0gIGVyciA9IHRyYW5zMi5PcGVuKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byBjb25uZWN0IGNsaWVudCB0byBzZXJ2ZXI6ICVzIiwgZXJyKQotICB9Ci0gIHMsIGVyciA6PSB0cmFuczEuQWNjZXB0KCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byBhY2NlcHQgY2xpZW50IGNvbm5lY3Rpb24gZnJvbSBzZXJ2ZXI6ICVzIiwgZXJyKQotICB9Ci0gIC8vcy5TZXRUaW1lb3V0KDEwKQotICBUcmFuc3BvcnRUZXN0KHQsIE5ld1RGcmFtZWRUcmFuc3BvcnQocyksIE5ld1RGcmFtZWRUcmFuc3BvcnQodHJhbnMyKSkKLSAgdHJhbnMxLkNsb3NlKCkKLX0KLQotZnVuYyBUZXN0Tm9uYmxvY2tpbmdUcmFuc3BvcnRDbGllbnRUb1NlcnZlcih0ICp0ZXN0aW5nLlQpIHsKLSAgYWRkciwgZXJyIDo9IEZpbmRBdmFpbGFibGVUQ1BTZXJ2ZXJQb3J0KDQwMDAwKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIGZpbmQgYXZhaWxhYmxlIHRjcCBwb3J0IGFkZHI6ICVzIiwgZXJyKQotICB9Ci0gIGwsIGVyciA6PSBuZXQuTGlzdGVuKGFkZHIuTmV0d29yaygpLCBhZGRyLlN0cmluZygpKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHNldHVwIGxpc3RlbmVyOiAlcyIsIGVycikKLSAgfQotICB0cmFuczEsIGVyciA6PSBOZXdUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXRMaXN0ZW5lcihsKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHNldHVwIHNlcnZlciBzb2NrZXQgbGlzdGVuZXI6ICVzIiwgZXJyKQotICB9Ci0gIHRyYW5zMiwgZXJyIDo9IE5ld1ROb25ibG9ja2luZ1NvY2tldEFkZHIobC5BZGRyKCkpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gc2V0dXAgY2xpZW50IHNvY2tldDogJXMiLCBlcnIpCi0gIH0KLSAgdHJhbnMxLlNldFRpbWVvdXQoMTApCi0gIHRyYW5zMi5TZXRUaW1lb3V0KDEwKQotICBlcnIgPSB0cmFuczIuT3BlbigpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gY29ubmVjdCBjbGllbnQgdG8gc2VydmVyOiAlcyIsIGVycikKLSAgfQotICBzLCBlcnIgOj0gdHJhbnMxLkFjY2VwdCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gYWNjZXB0IGNsaWVudCBjb25uZWN0aW9uIGZyb20gc2VydmVyOiAlcyIsIGVycikKLSAgfQotICAvL3MuU2V0VGltZW91dCgxMCkKLSAgVHJhbnNwb3J0VGVzdCh0LCBOZXdURnJhbWVkVHJhbnNwb3J0KHRyYW5zMiksIE5ld1RGcmFtZWRUcmFuc3BvcnQocykpCi0gIHRyYW5zMS5DbG9zZSgpCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RudW1lcmljLmdvIGIvbGliL2dvL3RocmlmdC90bnVtZXJpYy5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmNjUwOC4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3RudW1lcmljLmdvCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIHRocmlmdAotCi1pbXBvcnQgKAotICAibWF0aCIKLSAgInN0cmNvbnYiCi0pCi0KLXR5cGUgTnVtZXJpYyBpbnRlcmZhY2UgewotICBJbnQ2NCgpIGludDY0Ci0gIEludDMyKCkgaW50MzIKLSAgSW50MTYoKSBpbnQxNgotICBCeXRlKCkgYnl0ZQotICBJbnQoKSBpbnQKLSAgRmxvYXQ2NCgpIGZsb2F0NjQKLSAgRmxvYXQzMigpIGZsb2F0MzIKLSAgU3RyaW5nKCkgc3RyaW5nCi0gIGlzTnVsbCgpIGJvb2wKLX0KLQotdHlwZSBudW1lcmljIHN0cnVjdCB7Ci0gIGlWYWx1ZSBpbnQ2NAotICBkVmFsdWUgZmxvYXQ2NAotICBzVmFsdWUgc3RyaW5nCi0gIGlzTmlsICBib29sCi19Ci0KLXZhciAoCi0gIElORklOSVRZICAgICAgICAgIE51bWVyaWMKLSAgTkVHQVRJVkVfSU5GSU5JVFkgTnVtZXJpYwotICBOQU4gICAgICAgICAgICAgICBOdW1lcmljCi0gIFpFUk8gICAgICAgICAgICAgIE51bWVyaWMKLSAgTlVNRVJJQ19OVUxMICAgICAgTnVtZXJpYwotKQotCi1mdW5jIE5ld051bWVyaWNGcm9tRG91YmxlKGRWYWx1ZSBmbG9hdDY0KSBOdW1lcmljIHsKLSAgaWYgbWF0aC5Jc0luZihkVmFsdWUsIDEpIHsKLSAgICByZXR1cm4gSU5GSU5JVFkKLSAgfQotICBpZiBtYXRoLklzSW5mKGRWYWx1ZSwgLTEpIHsKLSAgICByZXR1cm4gTkVHQVRJVkVfSU5GSU5JVFkKLSAgfQotICBpZiBtYXRoLklzTmFOKGRWYWx1ZSkgewotICAgIHJldHVybiBOQU4KLSAgfQotICBpVmFsdWUgOj0gaW50NjQoZFZhbHVlKQotICBzVmFsdWUgOj0gc3RyY29udi5GdG9hNjQoZFZhbHVlLCAnZycsIDEwKQotICBpc05pbCA6PSBmYWxzZQotICByZXR1cm4gJm51bWVyaWN7aVZhbHVlOiBpVmFsdWUsIGRWYWx1ZTogZFZhbHVlLCBzVmFsdWU6IHNWYWx1ZSwgaXNOaWw6IGlzTmlsfQotfQotCi1mdW5jIE5ld051bWVyaWNGcm9tSTY0KGlWYWx1ZSBpbnQ2NCkgTnVtZXJpYyB7Ci0gIGRWYWx1ZSA6PSBmbG9hdDY0KGlWYWx1ZSkKLSAgc1ZhbHVlIDo9IHN0cmluZyhpVmFsdWUpCi0gIGlzTmlsIDo9IGZhbHNlCi0gIHJldHVybiAmbnVtZXJpY3tpVmFsdWU6IGlWYWx1ZSwgZFZhbHVlOiBkVmFsdWUsIHNWYWx1ZTogc1ZhbHVlLCBpc05pbDogaXNOaWx9Ci19Ci0KLWZ1bmMgTmV3TnVtZXJpY0Zyb21JMzIoaVZhbHVlIGludDMyKSBOdW1lcmljIHsKLSAgZFZhbHVlIDo9IGZsb2F0NjQoaVZhbHVlKQotICBzVmFsdWUgOj0gc3RyaW5nKGlWYWx1ZSkKLSAgaXNOaWwgOj0gZmFsc2UKLSAgcmV0dXJuICZudW1lcmlje2lWYWx1ZTogaW50NjQoaVZhbHVlKSwgZFZhbHVlOiBkVmFsdWUsIHNWYWx1ZTogc1ZhbHVlLCBpc05pbDogaXNOaWx9Ci19Ci0KLWZ1bmMgTmV3TnVtZXJpY0Zyb21TdHJpbmcoc1ZhbHVlIHN0cmluZykgTnVtZXJpYyB7Ci0gIGlmIHNWYWx1ZSA9PSBJTkZJTklUWS5TdHJpbmcoKSB7Ci0gICAgcmV0dXJuIElORklOSVRZCi0gIH0KLSAgaWYgc1ZhbHVlID09IE5FR0FUSVZFX0lORklOSVRZLlN0cmluZygpIHsKLSAgICByZXR1cm4gTkVHQVRJVkVfSU5GSU5JVFkKLSAgfQotICBpZiBzVmFsdWUgPT0gTkFOLlN0cmluZygpIHsKLSAgICByZXR1cm4gTkFOCi0gIH0KLSAgaVZhbHVlLCBfIDo9IHN0cmNvbnYuQXRvaTY0KHNWYWx1ZSkKLSAgZFZhbHVlLCBfIDo9IHN0cmNvbnYuQXRvZjY0KHNWYWx1ZSkKLSAgaXNOaWwgOj0gbGVuKHNWYWx1ZSkgPT0gMAotICByZXR1cm4gJm51bWVyaWN7aVZhbHVlOiBpVmFsdWUsIGRWYWx1ZTogZFZhbHVlLCBzVmFsdWU6IHNWYWx1ZSwgaXNOaWw6IGlzTmlsfQotfQotCi1mdW5jIE5ld051bWVyaWNGcm9tSlNPTlN0cmluZyhzVmFsdWUgc3RyaW5nLCBpc051bGwgYm9vbCkgTnVtZXJpYyB7Ci0gIGlmIGlzTnVsbCB7Ci0gICAgcmV0dXJuIE5ld051bGxOdW1lcmljKCkKLSAgfQotICBpZiBzVmFsdWUgPT0gSlNPTl9JTkZJTklUWSB7Ci0gICAgcmV0dXJuIElORklOSVRZCi0gIH0KLSAgaWYgc1ZhbHVlID09IEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgewotICAgIHJldHVybiBORUdBVElWRV9JTkZJTklUWQotICB9Ci0gIGlmIHNWYWx1ZSA9PSBKU09OX05BTiB7Ci0gICAgcmV0dXJuIE5BTgotICB9Ci0gIGlWYWx1ZSwgXyA6PSBzdHJjb252LkF0b2k2NChzVmFsdWUpCi0gIGRWYWx1ZSwgXyA6PSBzdHJjb252LkF0b2Y2NChzVmFsdWUpCi0gIHJldHVybiAmbnVtZXJpY3tpVmFsdWU6IGlWYWx1ZSwgZFZhbHVlOiBkVmFsdWUsIHNWYWx1ZTogc1ZhbHVlLCBpc05pbDogaXNOdWxsfQotfQotCi1mdW5jIE5ld051bGxOdW1lcmljKCkgTnVtZXJpYyB7Ci0gIHJldHVybiAmbnVtZXJpY3tpVmFsdWU6IDAsIGRWYWx1ZTogMC4wLCBzVmFsdWU6ICIiLCBpc05pbDogdHJ1ZX0KLX0KLQotZnVuYyAocCAqbnVtZXJpYykgSW50NjQoKSBpbnQ2NCB7Ci0gIHJldHVybiBwLmlWYWx1ZQotfQotCi1mdW5jIChwICpudW1lcmljKSBJbnQzMigpIGludDMyIHsKLSAgcmV0dXJuIGludDMyKHAuaVZhbHVlKQotfQotCi1mdW5jIChwICpudW1lcmljKSBJbnQxNigpIGludDE2IHsKLSAgcmV0dXJuIGludDE2KHAuaVZhbHVlKQotfQotCi1mdW5jIChwICpudW1lcmljKSBCeXRlKCkgYnl0ZSB7Ci0gIHJldHVybiBieXRlKHAuaVZhbHVlKQotfQotCi1mdW5jIChwICpudW1lcmljKSBJbnQoKSBpbnQgewotICByZXR1cm4gaW50KHAuaVZhbHVlKQotfQotCi1mdW5jIChwICpudW1lcmljKSBGbG9hdDY0KCkgZmxvYXQ2NCB7Ci0gIHJldHVybiBwLmRWYWx1ZQotfQotCi1mdW5jIChwICpudW1lcmljKSBGbG9hdDMyKCkgZmxvYXQzMiB7Ci0gIHJldHVybiBmbG9hdDMyKHAuZFZhbHVlKQotfQotCi1mdW5jIChwICpudW1lcmljKSBTdHJpbmcoKSBzdHJpbmcgewotICByZXR1cm4gcC5zVmFsdWUKLX0KLQotZnVuYyAocCAqbnVtZXJpYykgaXNOdWxsKCkgYm9vbCB7Ci0gIHJldHVybiBwLmlzTmlsCi19Ci0KLWZ1bmMgaW5pdCgpIHsKLSAgSU5GSU5JVFkgPSAmbnVtZXJpY3tpVmFsdWU6IDAsIGRWYWx1ZTogbWF0aC5JbmYoMSksIHNWYWx1ZTogIkluZmluaXR5IiwgaXNOaWw6IGZhbHNlfQotICBORUdBVElWRV9JTkZJTklUWSA9ICZudW1lcmlje2lWYWx1ZTogMCwgZFZhbHVlOiBtYXRoLkluZigtMSksIHNWYWx1ZTogIi1JbmZpbml0eSIsIGlzTmlsOiBmYWxzZX0KLSAgTkFOID0gJm51bWVyaWN7aVZhbHVlOiAwLCBkVmFsdWU6IG1hdGguTmFOKCksIHNWYWx1ZTogIk5hTiIsIGlzTmlsOiBmYWxzZX0KLSAgWkVSTyA9ICZudW1lcmlje2lWYWx1ZTogMCwgZFZhbHVlOiAwLCBzVmFsdWU6ICIwIiwgaXNOaWw6IGZhbHNlfQotICBOVU1FUklDX05VTEwgPSAmbnVtZXJpY3tpVmFsdWU6IDAsIGRWYWx1ZTogMCwgc1ZhbHVlOiAiMCIsIGlzTmlsOiB0cnVlfQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90cHJvY2Vzc29yLmdvIGIvbGliL2dvL3RocmlmdC90cHJvY2Vzc29yLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmJiNWU0Li4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdHByb2Nlc3Nvci5nbworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnQKLQotLyoqCi0gKiBBIHByb2Nlc3NvciBpcyBhIGdlbmVyaWMgb2JqZWN0IHdoaWNoIG9wZXJhdGVzIHVwb24gYW4gaW5wdXQgc3RyZWFtIGFuZAotICogd3JpdGVzIHRvIHNvbWUgb3V0cHV0IHN0cmVhbS4KLSAqCi0gKi8KLXR5cGUgVFByb2Nlc3NvciBpbnRlcmZhY2UgewotICBQcm9jZXNzKGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikKLX0KLQotdHlwZSBUUHJvY2Vzc29yRnVuY3Rpb24gaW50ZXJmYWNlIHsKLSAgUHJvY2VzcyhzZXFJZCBpbnQzMiwgaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90cHJvY2Vzc29yX2ZhY3RvcnkuZ28gYi9saWIvZ28vdGhyaWZ0L3Rwcm9jZXNzb3JfZmFjdG9yeS5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI2ODFhYi4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3Rwcm9jZXNzb3JfZmFjdG9yeS5nbworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnQKLQotCi0vKioKLSAqIFRoZSBkZWZhdWx0IHByb2Nlc3NvciBmYWN0b3J5IGp1c3QgcmV0dXJucyBhIHNpbmdsZXRvbgotICogaW5zdGFuY2UuCi0gKi8KLXR5cGUgVFByb2Nlc3NvckZhY3RvcnkgaW50ZXJmYWNlIHsKLSAgR2V0UHJvY2Vzc29yKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm9jZXNzb3IKLX0KLQotdHlwZSB0UHJvY2Vzc29yRmFjdG9yeSBzdHJ1Y3QgewotICBwcm9jZXNzb3IgVFByb2Nlc3NvcgotfQotCi1mdW5jIE5ld1RQcm9jZXNzb3JGYWN0b3J5KHAgVFByb2Nlc3NvcikgVFByb2Nlc3NvckZhY3RvcnkgewotICByZXR1cm4gJnRQcm9jZXNzb3JGYWN0b3J5e3Byb2Nlc3NvcjogcH0KLX0KLQotZnVuYyAocCAqdFByb2Nlc3NvckZhY3RvcnkpIEdldFByb2Nlc3Nvcih0cmFucyBUVHJhbnNwb3J0KSBUUHJvY2Vzc29yIHsKLSAgcmV0dXJuIHAucHJvY2Vzc29yCi19Ci0KLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBwcm9jZXNzb3IgZmFjdG9yeSBqdXN0IHJldHVybnMgYSBzaW5nbGV0b24KLSAqIGluc3RhbmNlLgotICovCi10eXBlIFRQcm9jZXNzb3JGdW5jdGlvbkZhY3RvcnkgaW50ZXJmYWNlIHsKLSAgR2V0UHJvY2Vzc29yRnVuY3Rpb24odHJhbnMgVFRyYW5zcG9ydCkgVFByb2Nlc3NvckZ1bmN0aW9uCi19Ci0KLXR5cGUgdFByb2Nlc3NvckZ1bmN0aW9uRmFjdG9yeSBzdHJ1Y3QgewotICBwcm9jZXNzb3IgVFByb2Nlc3NvckZ1bmN0aW9uCi19Ci0KLWZ1bmMgTmV3VFByb2Nlc3NvckZ1bmN0aW9uRmFjdG9yeShwIFRQcm9jZXNzb3JGdW5jdGlvbikgVFByb2Nlc3NvckZ1bmN0aW9uRmFjdG9yeSB7Ci0gIHJldHVybiAmdFByb2Nlc3NvckZ1bmN0aW9uRmFjdG9yeXtwcm9jZXNzb3I6IHB9Ci19Ci0KLWZ1bmMgKHAgKnRQcm9jZXNzb3JGdW5jdGlvbkZhY3RvcnkpIEdldFByb2Nlc3NvckZ1bmN0aW9uKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm9jZXNzb3JGdW5jdGlvbiB7Ci0gIHJldHVybiBwLnByb2Nlc3NvcgotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90cHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L3Rwcm90b2NvbC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNiMjdhOC4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3Rwcm90b2NvbC5nbworKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLQotY29uc3QgKAotICBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwCi0gIFZFUlNJT05fMSAgICA9IDB4ODAwMTAwMDAKLSkKLQotdHlwZSBFbXB0eUludGVyZmFjZSBpbnRlcmZhY2V7fQotCi10eXBlIFRQcm90b2NvbCBpbnRlcmZhY2UgewotICBXcml0ZU1lc3NhZ2VCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxaWQgaW50MzIpIFRQcm90b2NvbEV4Y2VwdGlvbgotICBXcml0ZU1lc3NhZ2VFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24KLSAgV3JpdGVTdHJ1Y3RCZWdpbihuYW1lIHN0cmluZykgVFByb3RvY29sRXhjZXB0aW9uCi0gIFdyaXRlU3RydWN0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uCi0gIFdyaXRlRmllbGRCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRUeXBlLCBpZCBpbnQxNikgVFByb3RvY29sRXhjZXB0aW9uCi0gIFdyaXRlRmllbGRFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24KLSAgV3JpdGVGaWVsZFN0b3AoKSBUUHJvdG9jb2xFeGNlcHRpb24KLSAgV3JpdGVNYXBCZWdpbihrZXlUeXBlIFRUeXBlLCB2YWx1ZVR5cGUgVFR5cGUsIHNpemUgaW50KSBUUHJvdG9jb2xFeGNlcHRpb24KLSAgV3JpdGVNYXBFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24KLSAgV3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBUUHJvdG9jb2xFeGNlcHRpb24KLSAgV3JpdGVMaXN0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uCi0gIFdyaXRlU2V0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBUUHJvdG9jb2xFeGNlcHRpb24KLSAgV3JpdGVTZXRFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24KLSAgV3JpdGVCb29sKHZhbHVlIGJvb2wpIFRQcm90b2NvbEV4Y2VwdGlvbgotICBXcml0ZUJ5dGUodmFsdWUgYnl0ZSkgVFByb3RvY29sRXhjZXB0aW9uCi0gIFdyaXRlSTE2KHZhbHVlIGludDE2KSBUUHJvdG9jb2xFeGNlcHRpb24KLSAgV3JpdGVJMzIodmFsdWUgaW50MzIpIFRQcm90b2NvbEV4Y2VwdGlvbgotICBXcml0ZUk2NCh2YWx1ZSBpbnQ2NCkgVFByb3RvY29sRXhjZXB0aW9uCi0gIFdyaXRlRG91YmxlKHZhbHVlIGZsb2F0NjQpIFRQcm90b2NvbEV4Y2VwdGlvbgotICBXcml0ZVN0cmluZyh2YWx1ZSBzdHJpbmcpIFRQcm90b2NvbEV4Y2VwdGlvbgotICBXcml0ZUJpbmFyeSh2YWx1ZSBbXWJ5dGUpIFRQcm90b2NvbEV4Y2VwdGlvbgotCi0gIFJlYWRNZXNzYWdlQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcWlkIGludDMyLCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKQotICBSZWFkTWVzc2FnZUVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbgotICBSZWFkU3RydWN0QmVnaW4oKSAobmFtZSBzdHJpbmcsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pCi0gIFJlYWRTdHJ1Y3RFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24KLSAgUmVhZEZpZWxkQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUVHlwZSwgaWQgaW50MTYsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pCi0gIFJlYWRGaWVsZEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbgotICBSZWFkTWFwQmVnaW4oKSAoa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikKLSAgUmVhZE1hcEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbgotICBSZWFkTGlzdEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikKLSAgUmVhZExpc3RFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24KLSAgUmVhZFNldEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikKLSAgUmVhZFNldEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbgotICBSZWFkQm9vbCgpICh2YWx1ZSBib29sLCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKQotICBSZWFkQnl0ZSgpICh2YWx1ZSBieXRlLCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKQotICBSZWFkSTE2KCkgKHZhbHVlIGludDE2LCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKQotICBSZWFkSTMyKCkgKHZhbHVlIGludDMyLCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKQotICBSZWFkSTY0KCkgKHZhbHVlIGludDY0LCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKQotICBSZWFkRG91YmxlKCkgKHZhbHVlIGZsb2F0NjQsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pCi0gIFJlYWRTdHJpbmcoKSAodmFsdWUgc3RyaW5nLCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKQotICBSZWFkQmluYXJ5KCkgKHZhbHVlIFtdYnl0ZSwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikKLQotICBTa2lwKGZpZWxkVHlwZSBUVHlwZSkgKGVyciBUUHJvdG9jb2xFeGNlcHRpb24pCi0gIEZsdXNoKCkgKGVyciBUUHJvdG9jb2xFeGNlcHRpb24pCi0KLSAgVHJhbnNwb3J0KCkgVFRyYW5zcG9ydAotfQotCi0vKioKLSAqIFRoZSBtYXhpbXVtIHJlY3Vyc2l2ZSBkZXB0aCB0aGUgc2tpcCgpIGZ1bmN0aW9uIHdpbGwgdHJhdmVyc2UgYmVmb3JlCi0gKiB0aHJvd2luZyBhIFRFeGNlcHRpb24uCi0gKi8KLXZhciAoCi0gIE1heFNraXBEZXB0aCA9IDE8PDMxIC0gMQotKQotCi0vKioKLSAqIFNwZWNpZmllcyB0aGUgbWF4aW11bSByZWN1cnNpdmUgZGVwdGggdGhhdCB0aGUgc2tpcCBmdW5jdGlvbiB3aWxsCi0gKiB0cmF2ZXJzZSBiZWZvcmUgdGhyb3dpbmcgYSBURXhjZXB0aW9uLiAgVGhpcyBpcyBhIGdsb2JhbCBzZXR0aW5nLCBzbwotICogYW55IGNhbGwgdG8gc2tpcCBpbiB0aGlzIEpWTSB3aWxsIGVuZm9yY2UgdGhpcyB2YWx1ZS4KLSAqCi0gKiBAcGFyYW0gZGVwdGggIHRoZSBtYXhpbXVtIHJlY3Vyc2l2ZSBkZXB0aC4gIEEgdmFsdWUgb2YgMiB3b3VsZCBhbGxvdwotICogICAgdGhlIHNraXAgZnVuY3Rpb24gdG8gc2tpcCBhIHN0cnVjdHVyZSBvciBjb2xsZWN0aW9uIHdpdGggYmFzaWMgY2hpbGRyZW4sCi0gKiAgICBidXQgaXQgd291bGQgbm90IHBlcm1pdCBza2lwcGluZyBhIHN0cnVjdCB0aGF0IGhhZCBhIGZpZWxkIGNvbnRhaW5pbmcKLSAqICAgIGEgY2hpbGQgc3RydWN0LiAgQSB2YWx1ZSBvZiAxIHdvdWxkIG9ubHkgYWxsb3cgc2tpcHBpbmcgb2Ygc2ltcGxlCi0gKiAgICB0eXBlcyBhbmQgZW1wdHkgc3RydWN0cy9jb2xsZWN0aW9ucy4KLSAqLwotZnVuYyBTZXRNYXhTa2lwRGVwdGgoZGVwdGggaW50KSB7Ci0gIE1heFNraXBEZXB0aCA9IGRlcHRoCi19Ci0KLS8qKgotICogU2tpcHMgb3ZlciB0aGUgbmV4dCBkYXRhIGVsZW1lbnQgZnJvbSB0aGUgcHJvdmlkZWQgaW5wdXQgVFByb3RvY29sIG9iamVjdC4KLSAqCi0gKiBAcGFyYW0gcHJvdCAgdGhlIHByb3RvY29sIG9iamVjdCB0byByZWFkIGZyb20KLSAqIEBwYXJhbSB0eXBlICB0aGUgbmV4dCB2YWx1ZSB3aWxsIGJlIGludGVwcmV0ZWQgYXMgdGhpcyBUVHlwZSB2YWx1ZS4KLSAqLwotZnVuYyBTa2lwRGVmYXVsdERlcHRoKHByb3QgVFByb3RvY29sLCB0eXBlSWQgVFR5cGUpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHJldHVybiBTa2lwKHByb3QsIHR5cGVJZCwgTWF4U2tpcERlcHRoKQotfQotCi0vKioKLSAqIFNraXBzIG92ZXIgdGhlIG5leHQgZGF0YSBlbGVtZW50IGZyb20gdGhlIHByb3ZpZGVkIGlucHV0IFRQcm90b2NvbCBvYmplY3QuCi0gKgotICogQHBhcmFtIHByb3QgIHRoZSBwcm90b2NvbCBvYmplY3QgdG8gcmVhZCBmcm9tCi0gKiBAcGFyYW0gdHlwZSAgdGhlIG5leHQgdmFsdWUgd2lsbCBiZSBpbnRlcHJldGVkIGFzIHRoaXMgVFR5cGUgdmFsdWUuCi0gKiBAcGFyYW0gbWF4RGVwdGggIHRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IHNraXAgY29tcGxleCBvYmplY3RzIHRvIHRoaXMKLSAqICAgcmVjdXJzaXZlIGRlcHRoLCB0byBwcmV2ZW50IEphdmEgc3RhY2sgb3ZlcmZsb3cuCi0gKi8KLWZ1bmMgU2tpcChzZWxmIFRQcm90b2NvbCwgZmllbGRUeXBlIFRUeXBlLCBtYXhEZXB0aCBpbnQpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHN3aXRjaCBmaWVsZFR5cGUgewotICBjYXNlIFNUT1A6Ci0gICAgcmV0dXJuCi0gIGNhc2UgQk9PTDoKLSAgICBfLCBlcnIgPSBzZWxmLlJlYWRCb29sKCkKLSAgICByZXR1cm4KLSAgY2FzZSBCWVRFOgotICAgIF8sIGVyciA9IHNlbGYuUmVhZEJ5dGUoKQotICAgIHJldHVybgotICBjYXNlIEkxNjoKLSAgICBfLCBlcnIgPSBzZWxmLlJlYWRJMTYoKQotICAgIHJldHVybgotICBjYXNlIEkzMjoKLSAgICBfLCBlcnIgPSBzZWxmLlJlYWRJMzIoKQotICAgIHJldHVybgotICBjYXNlIEk2NDoKLSAgICBfLCBlcnIgPSBzZWxmLlJlYWRJNjQoKQotICAgIHJldHVybgotICBjYXNlIERPVUJMRToKLSAgICBfLCBlcnIgPSBzZWxmLlJlYWREb3VibGUoKQotICAgIHJldHVybgotICBjYXNlIFNUUklORzoKLSAgICBfLCBlcnIgPSBzZWxmLlJlYWRTdHJpbmcoKQotICAgIHJldHVybgotICBjYXNlIFNUUlVDVDoKLSAgICB7Ci0gICAgICBfLCBlcnIgPSBzZWxmLlJlYWRTdHJ1Y3RCZWdpbigpCi0gICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgcmV0dXJuCi0gICAgICB9Ci0gICAgICBmb3IgewotICAgICAgICBfLCB0eXBlSWQsIF8sIF8gOj0gc2VsZi5SZWFkRmllbGRCZWdpbigpCi0gICAgICAgIGlmIHR5cGVJZCA9PSBTVE9QIHsKLSAgICAgICAgICBicmVhawotICAgICAgICB9Ci0gICAgICAgIFNraXAoc2VsZiwgdHlwZUlkLCBtYXhEZXB0aC0xKQotICAgICAgICBzZWxmLlJlYWRGaWVsZEVuZCgpCi0gICAgICB9Ci0gICAgICByZXR1cm4gc2VsZi5SZWFkU3RydWN0RW5kKCkKLSAgICB9Ci0gIGNhc2UgTUFQOgotICAgIHsKLSAgICAgIGtleVR5cGUsIHZhbHVlVHlwZSwgbCwgZXJyIDo9IHNlbGYuUmVhZE1hcEJlZ2luKCkKLSAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICByZXR1cm4gZXJyCi0gICAgICB9Ci0gICAgICBzaXplIDo9IGludChsKQotICAgICAgZm9yIGkgOj0gMDsgaSA8IHNpemU7IGkrKyB7Ci0gICAgICAgIFNraXAoc2VsZiwga2V5VHlwZSwgbWF4RGVwdGgtMSkKLSAgICAgICAgc2VsZi5Ta2lwKHZhbHVlVHlwZSkKLSAgICAgIH0KLSAgICAgIHJldHVybiBzZWxmLlJlYWRNYXBFbmQoKQotICAgIH0KLSAgY2FzZSBTRVQ6Ci0gICAgewotICAgICAgZWxlbVR5cGUsIGwsIGVyciA6PSBzZWxmLlJlYWRTZXRCZWdpbigpCi0gICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgcmV0dXJuIGVycgotICAgICAgfQotICAgICAgc2l6ZSA6PSBpbnQobCkKLSAgICAgIGZvciBpIDo9IDA7IGkgPCBzaXplOyBpKysgewotICAgICAgICBTa2lwKHNlbGYsIGVsZW1UeXBlLCBtYXhEZXB0aC0xKQotICAgICAgfQotICAgICAgcmV0dXJuIHNlbGYuUmVhZFNldEVuZCgpCi0gICAgfQotICBjYXNlIExJU1Q6Ci0gICAgewotICAgICAgZWxlbVR5cGUsIGwsIGVyciA6PSBzZWxmLlJlYWRMaXN0QmVnaW4oKQotICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgIHJldHVybiBlcnIKLSAgICAgIH0KLSAgICAgIHNpemUgOj0gaW50KGwpCi0gICAgICBmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKLSAgICAgICAgU2tpcChzZWxmLCBlbGVtVHlwZSwgbWF4RGVwdGgtMSkKLSAgICAgIH0KLSAgICAgIHJldHVybiBzZWxmLlJlYWRMaXN0RW5kKCkKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5pbAotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90cHJvdG9jb2xfZXhjZXB0aW9uLmdvIGIvbGliL2dvL3RocmlmdC90cHJvdG9jb2xfZXhjZXB0aW9uLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGFjOTdlLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdHByb3RvY29sX2V4Y2VwdGlvbi5nbworKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLWltcG9ydCAoCi0gICJlbmNvZGluZy9iYXNlNjQiCi0gICJvcyIKLSkKLQotLyoqCi0gKiBQcm90b2NvbCBleGNlcHRpb25zLgotICoKLSAqLwotdHlwZSBUUHJvdG9jb2xFeGNlcHRpb24gaW50ZXJmYWNlIHsKLSAgVEV4Y2VwdGlvbgotICBUeXBlSWQoKSBpbnQKLX0KLQotY29uc3QgKAotICBVTktOT1dOX1BST1RPQ09MX0VYQ0VQVElPTiA9IDAKLSAgSU5WQUxJRF9EQVRBICAgICAgICAgICAgICAgPSAxCi0gIE5FR0FUSVZFX1NJWkUgICAgICAgICAgICAgID0gMgotICBTSVpFX0xJTUlUICAgICAgICAgICAgICAgICA9IDMKLSAgQkFEX1ZFUlNJT04gICAgICAgICAgICAgICAgPSA0Ci0gIE5PVF9JTVBMRU1FTlRFRCAgICAgICAgICAgID0gNQotKQotCi10eXBlIHRQcm90b2NvbEV4Y2VwdGlvbiBzdHJ1Y3QgewotICB0eXBlSWQgIGludAotICBtZXNzYWdlIHN0cmluZwotfQotCi1mdW5jIChwICp0UHJvdG9jb2xFeGNlcHRpb24pIFR5cGVJZCgpIGludCB7Ci0gIHJldHVybiBwLnR5cGVJZAotfQotCi1mdW5jIChwICp0UHJvdG9jb2xFeGNlcHRpb24pIFN0cmluZygpIHN0cmluZyB7Ci0gIHJldHVybiBwLm1lc3NhZ2UKLX0KLQotZnVuYyBOZXdUUHJvdG9jb2xFeGNlcHRpb25EZWZhdWx0KCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkRlZmF1bHRUeXBlKFVOS05PV05fUFJPVE9DT0xfRVhDRVBUSU9OKQotfQotCi1mdW5jIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkRlZmF1bHRUeXBlKHQgaW50KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKHQsICIiKQotfQotCi1mdW5jIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkRlZmF1bHRTdHJpbmcobSBzdHJpbmcpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oVU5LTk9XTl9QUk9UT0NPTF9FWENFUFRJT04sIG0pCi19Ci0KLWZ1bmMgTmV3VFByb3RvY29sRXhjZXB0aW9uKHQgaW50LCBtIHN0cmluZykgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuICZ0UHJvdG9jb2xFeGNlcHRpb257dHlwZUlkOiB0LCBtZXNzYWdlOiBtfQotfQotCi1mdW5jIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChmaWVsZElkIGludCwgZmllbGROYW1lIHN0cmluZywgc3RydWN0TmFtZSBzdHJpbmcsIGUgVFByb3RvY29sRXhjZXB0aW9uKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICB0IDo9IGUuVHlwZUlkKCkKLSAgaWYgdCA9PSBVTktOT1dOX1BST1RPQ09MX0VYQ0VQVElPTiB7Ci0gICAgdCA9IElOVkFMSURfREFUQQotICB9Ci0gIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24odCwgIlVuYWJsZSB0byByZWFkIGZpZWxkICIrc3RyaW5nKGZpZWxkSWQpKyIgKCIrZmllbGROYW1lKyIpIGluICIrc3RydWN0TmFtZSsiIGR1ZSB0bzogIitlLlN0cmluZygpKQotfQotCi1mdW5jIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoZmllbGRJZCBpbnQsIGZpZWxkTmFtZSBzdHJpbmcsIHN0cnVjdE5hbWUgc3RyaW5nLCBlIFRQcm90b2NvbEV4Y2VwdGlvbikgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgdCA6PSBlLlR5cGVJZCgpCi0gIGlmIHQgPT0gVU5LTk9XTl9QUk9UT0NPTF9FWENFUFRJT04gewotICAgIHQgPSBJTlZBTElEX0RBVEEKLSAgfQotICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKHQsICJVbmFibGUgdG8gd3JpdGUgZmllbGQgIitzdHJpbmcoZmllbGRJZCkrIiAoIitmaWVsZE5hbWUrIikgaW4gIitzdHJ1Y3ROYW1lKyIgZHVlIHRvOiAiK2UuU3RyaW5nKCkpCi19Ci0KLWZ1bmMgTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZFN0cnVjdChzdHJ1Y3ROYW1lIHN0cmluZywgZSBUUHJvdG9jb2xFeGNlcHRpb24pIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHQgOj0gZS5UeXBlSWQoKQotICBpZiB0ID09IFVOS05PV05fUFJPVE9DT0xfRVhDRVBUSU9OIHsKLSAgICB0ID0gSU5WQUxJRF9EQVRBCi0gIH0KLSAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbih0LCAiVW5hYmxlIHRvIHJlYWQgc3RydWN0ICIrc3RydWN0TmFtZSsiIGR1ZSB0bzogIitlLlN0cmluZygpKQotfQotCi1mdW5jIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlU3RydWN0KHN0cnVjdE5hbWUgc3RyaW5nLCBlIFRQcm90b2NvbEV4Y2VwdGlvbikgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgdCA6PSBlLlR5cGVJZCgpCi0gIGlmIHQgPT0gVU5LTk9XTl9QUk9UT0NPTF9FWENFUFRJT04gewotICAgIHQgPSBJTlZBTElEX0RBVEEKLSAgfQotICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKHQsICJVbmFibGUgdG8gd3JpdGUgc3RydWN0ICIrc3RydWN0TmFtZSsiIGR1ZSB0bzogIitlLlN0cmluZygpKQotfQotCi1mdW5jIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUgb3MuRXJyb3IpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGlmIGUgPT0gbmlsIHsKLSAgICByZXR1cm4gbmlsCi0gIH0KLSAgaWYgdCwgb2sgOj0gZS4oVFByb3RvY29sRXhjZXB0aW9uKTsgb2sgewotICAgIHJldHVybiB0Ci0gIH0KLSAgaWYgdGUsIG9rIDo9IGUuKFRUcmFuc3BvcnRFeGNlcHRpb24pOyBvayB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21UcmFuc3BvcnRFeGNlcHRpb24odGUpCi0gIH0KLSAgaWYgXywgb2sgOj0gZS4oYmFzZTY0LkNvcnJ1cHRJbnB1dEVycm9yKTsgb2sgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCBlLlN0cmluZygpKQotICB9Ci0gIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25EZWZhdWx0U3RyaW5nKGUuU3RyaW5nKCkpCi19Ci0KLWZ1bmMgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbVRyYW5zcG9ydEV4Y2VwdGlvbihlIFRUcmFuc3BvcnRFeGNlcHRpb24pIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGlmIGUgPT0gbmlsIHsKLSAgICByZXR1cm4gbmlsCi0gIH0KLSAgaWYgdCwgb2sgOj0gZS4oVFByb3RvY29sRXhjZXB0aW9uKTsgb2sgewotICAgIHJldHVybiB0Ci0gIH0KLSAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkRlZmF1bHRTdHJpbmcoZS5TdHJpbmcoKSkKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHByb3RvY29sX2ZhY3RvcnkuZ28gYi9saWIvZ28vdGhyaWZ0L3Rwcm90b2NvbF9mYWN0b3J5LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWVkMmMyLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdHByb3RvY29sX2ZhY3RvcnkuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLS8qKgotICogRmFjdG9yeSBpbnRlcmZhY2UgZm9yIGNvbnN0cnVjdGluZyBwcm90b2NvbCBpbnN0YW5jZXMuCi0gKgotICovCi10eXBlIFRQcm90b2NvbEZhY3RvcnkgaW50ZXJmYWNlIHsKLSAgR2V0UHJvdG9jb2wodHJhbnMgVFRyYW5zcG9ydCkgVFByb3RvY29sCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3Rwcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC90cHJvdG9jb2xfdGVzdC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFlZjhlOS4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3Rwcm90b2NvbF90ZXN0LmdvCisrKyAvZGV2L251bGwKQEAgLTEsMTgyNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0X3Rlc3QKLQotaW1wb3J0ICgKLSAgLiAidGhyaWZ0IgotICAidGVzdGluZyIKLSAgImh0dHAiCi0gICJtYXRoIgotICAibmV0IgotICAiaW8vaW91dGlsIgotICAib3MiCi0gICJieXRlcyIKLSAgImZtdCIKLSkKLQotY29uc3QgUFJPVE9DT0xfQklOQVJZX0RBVEFfU0laRSA9IDE1NQotCi12YXIgKAotICBkYXRhICAgICAgICAgICBzdHJpbmcgLy8gdGVzdCBkYXRhIGZvciB3cml0aW5nCi0gIHByb3RvY29sX2JkYXRhIFtdYnl0ZSAvLyB0ZXN0IGRhdGEgZm9yIHdyaXRpbmc7IHNhbWUgYXMgZGF0YQotICBCT09MX1ZBTFVFUyAgICBbXWJvb2wKLSAgQllURV9WQUxVRVMgICAgW11ieXRlCi0gIElOVDE2X1ZBTFVFUyAgIFtdaW50MTYKLSAgSU5UMzJfVkFMVUVTICAgW11pbnQzMgotICBJTlQ2NF9WQUxVRVMgICBbXWludDY0Ci0gIERPVUJMRV9WQUxVRVMgIFtdZmxvYXQ2NAotICBTVFJJTkdfVkFMVUVTICBbXXN0cmluZwotKQotCi0KLWZ1bmMgaW5pdCgpIHsKLSAgcHJvdG9jb2xfYmRhdGEgPSBtYWtlKFtdYnl0ZSwgUFJPVE9DT0xfQklOQVJZX0RBVEFfU0laRSkKLSAgZm9yIGkgOj0gMDsgaSA8IFBST1RPQ09MX0JJTkFSWV9EQVRBX1NJWkU7IGkrKyB7Ci0gICAgcHJvdG9jb2xfYmRhdGFbaV0gPSBieXRlKChpICsgJ2EnKSAlIDI1NSkKLSAgfQotICBkYXRhID0gc3RyaW5nKHByb3RvY29sX2JkYXRhKQotICBCT09MX1ZBTFVFUyA9IFtdYm9vbHtmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlfQotICBCWVRFX1ZBTFVFUyA9IFtdYnl0ZXsxMTcsIDAsIDEsIDMyLCAxMjcsIDEyOCwgMjU1fQotICBJTlQxNl9WQUxVRVMgPSBbXWludDE2ezQ1OSwgMCwgMSwgLTEsIC0xMjgsIDEyNywgMzI3NjcsIC0zMjc2OH0KLSAgSU5UMzJfVkFMVUVTID0gW11pbnQzMns0NTksIDAsIDEsIC0xLCAtMTI4LCAxMjcsIDMyNzY3LCAyMTQ3NDgzNjQ3LCAtMjE0NzQ4MzUzNX0KLSAgSU5UNjRfVkFMVUVTID0gW11pbnQ2NHs0NTksIDAsIDEsIC0xLCAtMTI4LCAxMjcsIDMyNzY3LCAyMTQ3NDgzNjQ3LCAtMjE0NzQ4MzUzNSwgMzQzNTk3Mzg0ODEsIC0zNTE4NDM3MjA4ODcxOSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsIDkyMjMzNzIwMzY4NTQ3NzU4MDd9Ci0gIERPVUJMRV9WQUxVRVMgPSBbXWZsb2F0NjR7NDU5LjMsIDAuMCwgLTEuMCwgMS4wLCAwLjUsIDAuMzMzMywgMy4xNDE1OSwgMS41MzdlLTM4LCAxLjY3M2UyNSwgNi4wMjIxNDE3OWUyMywgLTYuMDIyMTQxNzllMjMsIElORklOSVRZLkZsb2F0NjQoKSwgTkVHQVRJVkVfSU5GSU5JVFkuRmxvYXQ2NCgpLCBOQU4uRmxvYXQ2NCgpfQotICBTVFJJTkdfVkFMVUVTID0gW11zdHJpbmd7IiIsICJhIiwgInN0W3VmXWYiLCAic3QsdTpmZiB3aXRoIHNwYWNlcyIsICJzdHVmZlx0d2l0aFxuZXNjYXBlXFxjaGFyYWN0ZXJzJy4uLlwibG90c3tvZn1mdW48L3htbD4ifQotfQotCi10eXBlIEhUVFBFY2hvU2VydmVyIHN0cnVjdHt9Ci0KLWZ1bmMgKHAgKkhUVFBFY2hvU2VydmVyKSBTZXJ2ZUhUVFAodyBodHRwLlJlc3BvbnNlV3JpdGVyLCByZXEgKmh0dHAuUmVxdWVzdCkgewotICBidWYsIGVyciA6PSBpb3V0aWwuUmVhZEFsbChyZXEuQm9keSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdy5Xcml0ZUhlYWRlcihodHRwLlN0YXR1c0JhZFJlcXVlc3QpCi0gICAgdy5Xcml0ZShidWYpCi0gIH0gZWxzZSB7Ci0gICAgdy5Xcml0ZUhlYWRlcihodHRwLlN0YXR1c09LKQotICAgIHcuV3JpdGUoYnVmKQotICB9Ci19Ci0KLWZ1bmMgSHR0cENsaWVudFNldHVwRm9yVGVzdCh0ICp0ZXN0aW5nLlQpIChuZXQuTGlzdGVuZXIsIG5ldC5BZGRyKSB7Ci0gIGFkZHIsIGVyciA6PSBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydCg0MDAwMCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byBmaW5kIGF2YWlsYWJsZSB0Y3AgcG9ydCBhZGRyOiAlcyIsIGVycikKLSAgICByZXR1cm4gbmlsLCBhZGRyCi0gIH0KLSAgbCwgZXJyIDo9IG5ldC5MaXN0ZW4oYWRkci5OZXR3b3JrKCksIGFkZHIuU3RyaW5nKCkpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gc2V0dXAgdGNwIGxpc3RlbmVyIG9uICVzOiAlcyIsIGFkZHIuU3RyaW5nKCksIGVycikKLSAgICByZXR1cm4gbCwgYWRkcgotICB9Ci0gIGdvIGh0dHAuU2VydmUobCwgJkhUVFBFY2hvU2VydmVye30pCi0gIHJldHVybiBsLCBhZGRyCi19Ci0KLQotZnVuYyBSZWFkV3JpdGVQcm90b2NvbFRlc3QodCAqdGVzdGluZy5ULCBwcm90b2NvbEZhY3RvcnkgVFByb3RvY29sRmFjdG9yeSkgewotICBidWYgOj0gYnl0ZXMuTmV3QnVmZmVyKG1ha2UoW11ieXRlLCAwLCAxMDI0KSkKLSAgbCwgYWRkciA6PSBIdHRwQ2xpZW50U2V0dXBGb3JUZXN0KHQpCi0gIGRlZmVyIGwuQ2xvc2UoKQotICB0cmFuc3BvcnRzIDo9IFtdVFRyYW5zcG9ydEZhY3Rvcnl7Ci0gICAgTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkoMTAyNCksCi0gICAgTmV3VElPU3RyZWFtVHJhbnNwb3J0RmFjdG9yeShidWYsIGJ1ZiwgdHJ1ZSksCi0gICAgTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkoMTAyNCkpLAotICAgIE5ld1RIdHRwUG9zdENsaWVudFRyYW5zcG9ydEZhY3RvcnkoImh0dHA6Ly8iICsgYWRkci5TdHJpbmcoKSksCi0gIH0KLSAgZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotICAgIHRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCi0gICAgcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCi0gICAgUmVhZFdyaXRlQm9vbCh0LCBwLCB0cmFucykKLSAgICB0cmFucy5DbG9zZSgpCi0gIH0KLSAgZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotICAgIHRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCi0gICAgcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCi0gICAgUmVhZFdyaXRlQnl0ZSh0LCBwLCB0cmFucykKLSAgICB0cmFucy5DbG9zZSgpCi0gIH0KLSAgZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotICAgIHRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCi0gICAgcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCi0gICAgUmVhZFdyaXRlSTE2KHQsIHAsIHRyYW5zKQotICAgIHRyYW5zLkNsb3NlKCkKLSAgfQotICBmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7Ci0gICAgdHJhbnMgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKLSAgICBwIDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykKLSAgICBSZWFkV3JpdGVJMzIodCwgcCwgdHJhbnMpCi0gICAgdHJhbnMuQ2xvc2UoKQotICB9Ci0gIGZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKLSAgICB0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQotICAgIHAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQotICAgIFJlYWRXcml0ZUk2NCh0LCBwLCB0cmFucykKLSAgICB0cmFucy5DbG9zZSgpCi0gIH0KLSAgZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotICAgIHRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCi0gICAgcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCi0gICAgUmVhZFdyaXRlRG91YmxlKHQsIHAsIHRyYW5zKQotICAgIHRyYW5zLkNsb3NlKCkKLSAgfQotICBmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7Ci0gICAgdHJhbnMgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKLSAgICBwIDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykKLSAgICBSZWFkV3JpdGVTdHJpbmcodCwgcCwgdHJhbnMpCi0gICAgdHJhbnMuQ2xvc2UoKQotICB9Ci0gIGZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKLSAgICB0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQotICAgIHAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQotICAgIFJlYWRXcml0ZUJpbmFyeSh0LCBwLCB0cmFucykKLSAgICB0cmFucy5DbG9zZSgpCi0gIH0KLSAgZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotICAgIHRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCi0gICAgcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCi0gICAgUmVhZFdyaXRlV29yayh0LCBwLCB0cmFucykKLSAgICB0cmFucy5DbG9zZSgpCi0gIH0KLSAgZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotICAgIHRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCi0gICAgcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCi0gICAgUmVhZFdyaXRlQ2FsY3VsYXRlKHQsIHAsIHRyYW5zKQotICAgIHRyYW5zLkNsb3NlKCkKLSAgfQotCi0gIC8vIHRoaXMgdGVzdCBkb2Vzbid0IHdvcmsgaW4gYWxsIGNhc2VzIGR1ZSB0byBFT0YgaXNzdWVzIGJldHdlZW4KLSAgLy8gYnVmZmVyIHJlYWQgYW5kIGJ1ZmZlciB3cml0ZSB3aGVuIHVzaW5nIHRoZSBzYW1lIGJ1ZmlvIGZvciBib3RoCi0gIC8vZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotICAvLyAgdHJhbnMgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKLSAgLy8gIHAgOj0gR2V0UHJvdG9jb2wodHJhbnMpOwotICAvLyAgUmVhZFdyaXRlSTY0KHQsIHAsIHRyYW5zKTsKLSAgLy8gIFJlYWRXcml0ZURvdWJsZSh0LCBwLCB0cmFucyk7Ci0gIC8vICBSZWFkV3JpdGVCaW5hcnkodCwgcCwgdHJhbnMpOwotICAvLyAgUmVhZFdyaXRlQnl0ZSh0LCBwLCB0cmFucyk7Ci0gIC8vICB0cmFucy5DbG9zZSgpCi0gIC8vfQotCi19Ci0KLWZ1bmMgUmVhZFdyaXRlQm9vbCh0ICp0ZXN0aW5nLlQsIHAgVFByb3RvY29sLCB0cmFucyBUVHJhbnNwb3J0KSB7Ci0gIHRoZXR5cGUgOj0gVFR5cGUoQk9PTCkKLSAgdGhlbGVuIDo9IGxlbihCT09MX1ZBTFVFUykKLSAgZXJyIDo9IHAuV3JpdGVMaXN0QmVnaW4odGhldHlwZSwgdGhlbGVuKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHdyaXRpbmcgbGlzdCBiZWdpbjogJXEiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIHRoZXR5cGUpCi0gIH0KLSAgZm9yIGssIHYgOj0gcmFuZ2UgQk9PTF9WQUxVRVMgewotICAgIGVyciA9IHAuV3JpdGVCb29sKHYpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICB0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHdyaXRpbmcgYm9vbCBpbiBsaXN0IGF0IGluZGV4ICVkOiAlcSIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgaywgdikKLSAgICB9Ci0gIH0KLSAgcC5Xcml0ZUxpc3RFbmQoKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHdyaXRpbmcgbGlzdCBlbmQ6ICVxIiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgZXJyLCBCT09MX1ZBTFVFUykKLSAgfQotICBwLkZsdXNoKCkKLSAgdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgbGlzdDogJXEiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIEJPT0xfVkFMVUVTKQotICB9Ci0gIF8sIG9rIDo9IHAuKCpUU2ltcGxlSlNPTlByb3RvY29sKQotICBpZiAhb2sgewotICAgIGlmIHRoZXR5cGUgIT0gdGhldHlwZTIgewotICAgICAgdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKLSAgICB9Ci0gICAgaWYgdGhlbGVuICE9IHRoZWxlbjIgewotICAgICAgdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXMgIT0gbGVuICVzIiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQotICAgIH0KLSAgfQotICBmb3IgaywgdiA6PSByYW5nZSBCT09MX1ZBTFVFUyB7Ci0gICAgdmFsdWUsIGVyciA6PSBwLlJlYWRCb29sKCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBib29sIGF0IGluZGV4ICVkOiAlcSIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgaywgdikKLSAgICB9Ci0gICAgaWYgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkVycm9yZigiJXM6IGluZGV4ICVkICVxICVxICVxICE9ICVxIiwgIlJlYWRXcml0ZUJvb2wiLCBrLCBwLCB0cmFucywgdiwgdmFsdWUpCi0gICAgfQotICB9Ci0gIGVyciA9IHAuUmVhZExpc3RFbmQoKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkVycm9yZigiJXM6ICVUICVUIFVuYWJsZSB0byByZWFkIGxpc3QgZW5kOiAlcSIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVycikKLSAgfQotfQotCi1mdW5jIFJlYWRXcml0ZUJ5dGUodCAqdGVzdGluZy5ULCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgewotICB0aGV0eXBlIDo9IFRUeXBlKEJZVEUpCi0gIHRoZWxlbiA6PSBsZW4oQllURV9WQUxVRVMpCi0gIGVyciA6PSBwLldyaXRlTGlzdEJlZ2luKHRoZXR5cGUsIHRoZWxlbikKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciB3cml0aW5nIGxpc3QgYmVnaW46ICVxIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgZXJyLCB0aGV0eXBlKQotICB9Ci0gIGZvciBrLCB2IDo9IHJhbmdlIEJZVEVfVkFMVUVTIHsKLSAgICBlcnIgPSBwLldyaXRlQnl0ZSh2KQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciB3cml0aW5nIGJ5dGUgaW4gbGlzdCBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCi0gICAgfQotICB9Ci0gIGVyciA9IHAuV3JpdGVMaXN0RW5kKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciB3cml0aW5nIGxpc3QgZW5kOiAlcSIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIGVyciwgQllURV9WQUxVRVMpCi0gIH0KLSAgZXJyID0gcC5GbHVzaCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgZmx1c2hpbmcgbGlzdCBvZiBieXRlczogJXEiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCBlcnIsIEJZVEVfVkFMVUVTKQotICB9Ci0gIHRoZXR5cGUyLCB0aGVsZW4yLCBlcnIgOj0gcC5SZWFkTGlzdEJlZ2luKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGxpc3Q6ICVxIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgZXJyLCBCWVRFX1ZBTFVFUykKLSAgfQotICBfLCBvayA6PSBwLigqVFNpbXBsZUpTT05Qcm90b2NvbCkKLSAgaWYgIW9rIHsKLSAgICBpZiB0aGV0eXBlICE9IHRoZXR5cGUyIHsKLSAgICAgIHQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCi0gICAgfQotICAgIGlmIHRoZWxlbiAhPSB0aGVsZW4yIHsKLSAgICAgIHQuRXJyb3JmKCIlczogJVQgJVQgbGVuICVzICE9IGxlbiAlcyIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKLSAgICB9Ci0gIH0KLSAgZm9yIGssIHYgOj0gcmFuZ2UgQllURV9WQUxVRVMgewotICAgIHZhbHVlLCBlcnIgOj0gcC5SZWFkQnl0ZSgpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICB0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgYnl0ZSBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCi0gICAgfQotICAgIGlmIHYgIT0gdmFsdWUgewotICAgICAgdC5FcnJvcmYoIiVzOiAlVCAlVCAlZCAhPSAlZCIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIHYsIHZhbHVlKQotICAgIH0KLSAgfQotICBlcnIgPSBwLlJlYWRMaXN0RW5kKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5FcnJvcmYoIiVzOiAlVCAlVCBVbmFibGUgdG8gcmVhZCBsaXN0IGVuZDogJXEiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCBlcnIpCi0gIH0KLX0KLQotZnVuYyBSZWFkV3JpdGVJMTYodCAqdGVzdGluZy5ULCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgewotICB0aGV0eXBlIDo9IFRUeXBlKEkxNikKLSAgdGhlbGVuIDo9IGxlbihJTlQxNl9WQUxVRVMpCi0gIHAuV3JpdGVMaXN0QmVnaW4odGhldHlwZSwgdGhlbGVuKQotICBmb3IgXywgdiA6PSByYW5nZSBJTlQxNl9WQUxVRVMgewotICAgIHAuV3JpdGVJMTYodikKLSAgfQotICBwLldyaXRlTGlzdEVuZCgpCi0gIHAuRmx1c2goKQotICB0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVJMTYiLCBwLCB0cmFucywgZXJyLCBJTlQxNl9WQUxVRVMpCi0gIH0KLSAgXywgb2sgOj0gcC4oKlRTaW1wbGVKU09OUHJvdG9jb2wpCi0gIGlmICFvayB7Ci0gICAgaWYgdGhldHlwZSAhPSB0aGV0eXBlMiB7Ci0gICAgICB0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVJMTYiLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCi0gICAgfQotICAgIGlmIHRoZWxlbiAhPSB0aGVsZW4yIHsKLSAgICAgIHQuRXJyb3JmKCIlczogJVQgJVQgbGVuICVzICE9IGxlbiAlcyIsICJSZWFkV3JpdGVJMTYiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQotICAgIH0KLSAgfQotICBmb3IgaywgdiA6PSByYW5nZSBJTlQxNl9WQUxVRVMgewotICAgIHZhbHVlLCBlcnIgOj0gcC5SZWFkSTE2KCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBpbnQxNiBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlSTE2IiwgcCwgdHJhbnMsIGVyciwgaywgdikKLSAgICB9Ci0gICAgaWYgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkVycm9yZigiJXM6ICVUICVUICVkICE9ICVkIiwgIlJlYWRXcml0ZUkxNiIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKLSAgICB9Ci0gIH0KLSAgZXJyID0gcC5SZWFkTGlzdEVuZCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRXJyb3JmKCIlczogJVQgJVQgVW5hYmxlIHRvIHJlYWQgbGlzdCBlbmQ6ICVxIiwgIlJlYWRXcml0ZUkxNiIsIHAsIHRyYW5zLCBlcnIpCi0gIH0KLX0KLQotZnVuYyBSZWFkV3JpdGVJMzIodCAqdGVzdGluZy5ULCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgewotICB0aGV0eXBlIDo9IFRUeXBlKEkzMikKLSAgdGhlbGVuIDo9IGxlbihJTlQzMl9WQUxVRVMpCi0gIHAuV3JpdGVMaXN0QmVnaW4odGhldHlwZSwgdGhlbGVuKQotICBmb3IgXywgdiA6PSByYW5nZSBJTlQzMl9WQUxVRVMgewotICAgIHAuV3JpdGVJMzIodikKLSAgfQotICBwLldyaXRlTGlzdEVuZCgpCi0gIHAuRmx1c2goKQotICB0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVJMzIiLCBwLCB0cmFucywgZXJyLCBJTlQzMl9WQUxVRVMpCi0gIH0KLSAgXywgb2sgOj0gcC4oKlRTaW1wbGVKU09OUHJvdG9jb2wpCi0gIGlmICFvayB7Ci0gICAgaWYgdGhldHlwZSAhPSB0aGV0eXBlMiB7Ci0gICAgICB0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVJMzIiLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCi0gICAgfQotICAgIGlmIHRoZWxlbiAhPSB0aGVsZW4yIHsKLSAgICAgIHQuRXJyb3JmKCIlczogJVQgJVQgbGVuICVzICE9IGxlbiAlcyIsICJSZWFkV3JpdGVJMzIiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQotICAgIH0KLSAgfQotICBmb3IgaywgdiA6PSByYW5nZSBJTlQzMl9WQUxVRVMgewotICAgIHZhbHVlLCBlcnIgOj0gcC5SZWFkSTMyKCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBpbnQzMiBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlSTMyIiwgcCwgdHJhbnMsIGVyciwgaywgdikKLSAgICB9Ci0gICAgaWYgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkVycm9yZigiJXM6ICVUICVUICVkICE9ICVkIiwgIlJlYWRXcml0ZUkzMiIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKLSAgICB9Ci0gIH0KLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5FcnJvcmYoIiVzOiAlVCAlVCBVbmFibGUgdG8gcmVhZCBsaXN0IGVuZDogJXEiLCAiUmVhZFdyaXRlSTMyIiwgcCwgdHJhbnMsIGVycikKLSAgfQotfQotCi1mdW5jIFJlYWRXcml0ZUk2NCh0ICp0ZXN0aW5nLlQsIHAgVFByb3RvY29sLCB0cmFucyBUVHJhbnNwb3J0KSB7Ci0gIHRoZXR5cGUgOj0gVFR5cGUoSTY0KQotICB0aGVsZW4gOj0gbGVuKElOVDY0X1ZBTFVFUykKLSAgcC5Xcml0ZUxpc3RCZWdpbih0aGV0eXBlLCB0aGVsZW4pCi0gIGZvciBfLCB2IDo9IHJhbmdlIElOVDY0X1ZBTFVFUyB7Ci0gICAgcC5Xcml0ZUk2NCh2KQotICB9Ci0gIHAuV3JpdGVMaXN0RW5kKCkKLSAgcC5GbHVzaCgpCi0gIHRoZXR5cGUyLCB0aGVsZW4yLCBlcnIgOj0gcC5SZWFkTGlzdEJlZ2luKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGxpc3Q6ICVxIiwgIlJlYWRXcml0ZUk2NCIsIHAsIHRyYW5zLCBlcnIsIElOVDY0X1ZBTFVFUykKLSAgfQotICBfLCBvayA6PSBwLigqVFNpbXBsZUpTT05Qcm90b2NvbCkKLSAgaWYgIW9rIHsKLSAgICBpZiB0aGV0eXBlICE9IHRoZXR5cGUyIHsKLSAgICAgIHQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZUk2NCIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKLSAgICB9Ci0gICAgaWYgdGhlbGVuICE9IHRoZWxlbjIgewotICAgICAgdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXMgIT0gbGVuICVzIiwgIlJlYWRXcml0ZUk2NCIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCi0gICAgfQotICB9Ci0gIGZvciBrLCB2IDo9IHJhbmdlIElOVDY0X1ZBTFVFUyB7Ci0gICAgdmFsdWUsIGVyciA6PSBwLlJlYWRJNjQoKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGludDY0IGF0IGluZGV4ICVkOiAlcSIsICJSZWFkV3JpdGVJNjQiLCBwLCB0cmFucywgZXJyLCBrLCB2KQotICAgIH0KLSAgICBpZiB2ICE9IHZhbHVlIHsKLSAgICAgIHQuRXJyb3JmKCIlczogJVQgJVQgJXEgIT0gJXEiLCAiUmVhZFdyaXRlSTY0IiwgcCwgdHJhbnMsIHYsIHZhbHVlKQotICAgIH0KLSAgfQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkVycm9yZigiJXM6ICVUICVUIFVuYWJsZSB0byByZWFkIGxpc3QgZW5kOiAlcSIsICJSZWFkV3JpdGVJNjQiLCBwLCB0cmFucywgZXJyKQotICB9Ci19Ci0KLWZ1bmMgUmVhZFdyaXRlRG91YmxlKHQgKnRlc3RpbmcuVCwgcCBUUHJvdG9jb2wsIHRyYW5zIFRUcmFuc3BvcnQpIHsKLSAgdGhldHlwZSA6PSBUVHlwZShET1VCTEUpCi0gIHRoZWxlbiA6PSBsZW4oRE9VQkxFX1ZBTFVFUykKLSAgcC5Xcml0ZUxpc3RCZWdpbih0aGV0eXBlLCB0aGVsZW4pCi0gIGZvciBfLCB2IDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgewotICAgIHAuV3JpdGVEb3VibGUodikKLSAgfQotICBwLldyaXRlTGlzdEVuZCgpCi0gIHAuRmx1c2goKQotICB3cm90ZWJ1ZmZlciA6PSAiIgotICBpZiBtZW10cmFucywgb2sgOj0gdHJhbnMuKCpUTWVtb3J5QnVmZmVyKTsgb2sgewotICAgIHdyb3RlYnVmZmVyID0gbWVtdHJhbnMuU3RyaW5nKCkKLSAgfQotICB0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSwgd3JvdGU6ICV2IiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCBlcnIsIERPVUJMRV9WQUxVRVMsIHdyb3RlYnVmZmVyKQotICB9Ci0gIGlmIHRoZXR5cGUgIT0gdGhldHlwZTIgewotICAgIHQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKLSAgfQotICBpZiB0aGVsZW4gIT0gdGhlbGVuMiB7Ci0gICAgdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXMgIT0gbGVuICVzIiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCi0gIH0KLSAgZm9yIGssIHYgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7Ci0gICAgdmFsdWUsIGVyciA6PSBwLlJlYWREb3VibGUoKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGRvdWJsZSBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIGVyciwgaywgdikKLSAgICB9Ci0gICAgaWYgbWF0aC5Jc05hTih2KSB7Ci0gICAgICBpZiAhbWF0aC5Jc05hTih2YWx1ZSkgewotICAgICAgICB0LkVycm9yZigiJXM6ICVUICVUIG1hdGguSXNOYU4oJXEpICE9IG1hdGguSXNOYU4oJXEpIiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkVycm9yZigiJXM6ICVUICVUICV2ICE9ICVxIiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKLSAgICB9Ci0gIH0KLSAgZXJyID0gcC5SZWFkTGlzdEVuZCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRXJyb3JmKCIlczogJVQgJVQgVW5hYmxlIHRvIHJlYWQgbGlzdCBlbmQ6ICVxIiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCBlcnIpCi0gIH0KLX0KLQotZnVuYyBSZWFkV3JpdGVTdHJpbmcodCAqdGVzdGluZy5ULCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgewotICB0aGV0eXBlIDo9IFRUeXBlKFNUUklORykKLSAgdGhlbGVuIDo9IGxlbihTVFJJTkdfVkFMVUVTKQotICBwLldyaXRlTGlzdEJlZ2luKHRoZXR5cGUsIHRoZWxlbikKLSAgZm9yIF8sIHYgOj0gcmFuZ2UgU1RSSU5HX1ZBTFVFUyB7Ci0gICAgcC5Xcml0ZVN0cmluZyh2KQotICB9Ci0gIHAuV3JpdGVMaXN0RW5kKCkKLSAgcC5GbHVzaCgpCi0gIHRoZXR5cGUyLCB0aGVsZW4yLCBlcnIgOj0gcC5SZWFkTGlzdEJlZ2luKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGxpc3Q6ICVxIiwgIlJlYWRXcml0ZVN0cmluZyIsIHAsIHRyYW5zLCBlcnIsIFNUUklOR19WQUxVRVMpCi0gIH0KLSAgXywgb2sgOj0gcC4oKlRTaW1wbGVKU09OUHJvdG9jb2wpCi0gIGlmICFvayB7Ci0gICAgaWYgdGhldHlwZSAhPSB0aGV0eXBlMiB7Ci0gICAgICB0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVTdHJpbmciLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCi0gICAgfQotICAgIGlmIHRoZWxlbiAhPSB0aGVsZW4yIHsKLSAgICAgIHQuRXJyb3JmKCIlczogJVQgJVQgbGVuICVzICE9IGxlbiAlcyIsICJSZWFkV3JpdGVTdHJpbmciLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQotICAgIH0KLSAgfQotICBmb3IgaywgdiA6PSByYW5nZSBTVFJJTkdfVkFMVUVTIHsKLSAgICB2YWx1ZSwgZXJyIDo9IHAuUmVhZFN0cmluZygpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICB0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgc3RyaW5nIGF0IGluZGV4ICVkOiAlcSIsICJSZWFkV3JpdGVTdHJpbmciLCBwLCB0cmFucywgZXJyLCBrLCB2KQotICAgIH0KLSAgICBpZiB2ICE9IHZhbHVlIHsKLSAgICAgIHQuRXJyb3JmKCIlczogJVQgJVQgJWQgIT0gJWQiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIHYsIHZhbHVlKQotICAgIH0KLSAgfQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkVycm9yZigiJXM6ICVUICVUIFVuYWJsZSB0byByZWFkIGxpc3QgZW5kOiAlcSIsICJSZWFkV3JpdGVTdHJpbmciLCBwLCB0cmFucywgZXJyKQotICB9Ci19Ci0KLQotZnVuYyBSZWFkV3JpdGVCaW5hcnkodCAqdGVzdGluZy5ULCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgewotICB2IDo9IHByb3RvY29sX2JkYXRhCi0gIHAuV3JpdGVCaW5hcnkodikKLSAgcC5GbHVzaCgpCi0gIHZhbHVlLCBlcnIgOj0gcC5SZWFkQmluYXJ5KCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5FcnJvcmYoIiVzOiAlVCAlVCBVbmFibGUgdG8gcmVhZCBiaW5hcnk6ICVzIiwgIlJlYWRXcml0ZUJpbmFyeSIsIHAsIHRyYW5zLCBlcnIuU3RyaW5nKCkpCi0gIH0KLSAgaWYgbGVuKHYpICE9IGxlbih2YWx1ZSkgewotICAgIHQuRXJyb3JmKCIlczogJVQgJVQgbGVuKHYpICE9IGxlbih2YWx1ZSkuLi4gJWQgIT0gJWQiLCAiUmVhZFdyaXRlQmluYXJ5IiwgcCwgdHJhbnMsIGxlbih2KSwgbGVuKHZhbHVlKSkKLSAgfSBlbHNlIHsKLSAgICBmb3IgaSA6PSAwOyBpIDwgbGVuKHYpOyBpKysgewotICAgICAgaWYgdltpXSAhPSB2YWx1ZVtpXSB7Ci0gICAgICAgIHQuRXJyb3JmKCIlczogJVQgJVQgJXMgIT0gJXMiLCAiUmVhZFdyaXRlQmluYXJ5IiwgcCwgdHJhbnMsIHYsIHZhbHVlKQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0KLWZ1bmMgUmVhZFdyaXRlV29yayh0ICp0ZXN0aW5nLlQsIHAgVFByb3RvY29sLCB0cmFucyBUVHJhbnNwb3J0KSB7Ci0gIHRoZXR5cGUgOj0gInN0cnVjdCIKLSAgb3JpZyA6PSBOZXdXb3JrKCkKLSAgb3JpZy5OdW0xID0gMjUKLSAgb3JpZy5OdW0yID0gMTAyCi0gIG9yaWcuT3AgPSBBREQKLSAgb3JpZy5Db21tZW50ID0gIkFkZDogMjUgKyAxMDIiCi0gIHJldHVybgotICBpZiBlIDo9IG9yaWcuV3JpdGUocCk7IGUgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICUjdiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgb3JpZywgZS5TdHJpbmcoKSkKLSAgfQotICByZWFkIDo9IE5ld1dvcmsoKQotICBlIDo9IHJlYWQuUmVhZChwKQotICBpZiBlICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCBlLlN0cmluZygpKQotICB9Ci0gIGlmICFvcmlnLkVxdWFscyhyZWFkKSB7Ci0gICAgdC5GYXRhbGYoIk9yaWdpbmFsIFdyaXRlICE9IFJlYWQ6ICUjdiAhPSAlI3YgIiwgb3JpZywgcmVhZCkKLSAgfQotfQotCi0KLWZ1bmMgUmVhZFdyaXRlQ2FsY3VsYXRlKHQgKnRlc3RpbmcuVCwgcCBUUHJvdG9jb2wsIHRyYW5zIFRUcmFuc3BvcnQpIHsKLSAgbWVzc2FnZU5hbWUgOj0gImNhbGN1bGF0ZSIKLSAgbG9naWQgOj0gaW50MzIoMTIpCi0gIHNlcUlkIDo9IGludDMyKDM1KQotICB3IDo9IE5ld1dvcmsoKQotICB3Lk51bTEgPSAyNQotICB3Lk51bTIgPSAxMDIKLSAgdy5PcCA9IEFERAotICB3LkNvbW1lbnQgPSAiQWRkOiAyNSArIDEwMiIKLQotICBhcmdzMzEgOj0gTmV3Q2FsY3VsYXRlQXJncygpCi0gIGFyZ3MzMS5Mb2dpZCA9IGxvZ2lkCi0gIGFyZ3MzMS5XID0gdwotICBwLldyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2VOYW1lLCBDQUxMLCBzZXFJZCkKLSAgaWYgZXJyIDo9IGFyZ3MzMS5Xcml0ZShwKTsgZXJyICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIiVzOiAlVCAlVCBVbmFibGUgdG8gd3JpdGUgbWVzc2FnZTogJXMiLCBtZXNzYWdlTmFtZSwgcCwgdHJhbnMsIGVyci5TdHJpbmcoKSkKLSAgfQotICBwLldyaXRlTWVzc2FnZUVuZCgpCi0gIHAuVHJhbnNwb3J0KCkuRmx1c2goKQotCi0gIG5hbWUsIHR0eXBlLCBzZXFpZCwgZXJyMSA6PSBwLlJlYWRNZXNzYWdlQmVnaW4oKQotICBpZiBlcnIxICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIiVzOiAlVCAlVCBVbmFibGUgdG8gcmVhZCBtZXNzYWdlIGJlZ2luOiAlcyIsIG1lc3NhZ2VOYW1lLCBwLCB0cmFucywgZXJyMS5TdHJpbmcoKSkKLSAgfQotICBpZiBuYW1lICE9IG1lc3NhZ2VOYW1lIHsKLSAgICB0LkVycm9yZigiJXM6ICVUICVUIEV4cGVjdGVkIG1lc3NhZ2UgbmFtZWQgXCIlc1wiLCBidXQgd2FzOiBcIiVzXCIiLCBtZXNzYWdlTmFtZSwgcCwgdHJhbnMsIG1lc3NhZ2VOYW1lLCBuYW1lKQotICB9Ci0gIGlmIHR0eXBlICE9IENBTEwgewotICAgIHQuRXJyb3JmKCIlczogJVQgJVQgRXhwZWN0ZWQgbWVzc2FnZSB0eXBlIFwiJXNcIiwgYnV0IHdhczogXCIlc1wiIiwgbWVzc2FnZU5hbWUsIHAsIHRyYW5zLCBDQUxMLCB0dHlwZSkKLSAgfQotICBpZiBzZXFpZCAhPSBzZXFJZCB7Ci0gICAgdC5FcnJvcmYoIiVzOiAlVCAlVCBFeHBlY3RlZCBtZXNzYWdlIHR5cGUgXCIlc1wiLCBidXQgd2FzOiBcIiVzXCIiLCBtZXNzYWdlTmFtZSwgcCwgdHJhbnMsIHNlcUlkLCBzZXFpZCkKLSAgfQotICBjYWxjQXJncyA6PSBOZXdDYWxjdWxhdGVBcmdzKCkKLSAgZXJyMiA6PSBjYWxjQXJncy5SZWFkKHApCi0gIGlmICFhcmdzMzEuRXF1YWxzKGNhbGNBcmdzKSB7Ci0gICAgLy9jbXAxLCBfIDo9IGFyZ3MzMS5XLkNvbXBhcmVUbyhjYWxjQXJncy5XKQotICAgIGNtcDIsIG9rIDo9IGFyZ3MzMS5Db21wYXJlVG8oY2FsY0FyZ3MpCi0gICAgdC5FcnJvcmYoIiVzOiAlVCAlVCBDYWxjdWxhdGUgYXJncyBub3QgYXMgZXhwZWN0ZWQsICVUIHZzICVULCBjbXA6ICUjdiwgb2s6ICUjdiwgZXF1YWxzOiAlI3YiLCBtZXNzYWdlTmFtZSwgcCwgdHJhbnMsIGFyZ3MzMSwgY2FsY0FyZ3MsIGNtcDIsIG9rLCBhcmdzMzEuRXF1YWxzKGNhbGNBcmdzKSkKLSAgfQotICBpZiBlcnIyICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIiVzOiAlVCAlVCBVbmFibGUgdG8gcmVhZCBtZXNzYWdlIGVuZDogJXMiLCBtZXNzYWdlTmFtZSwgcCwgdHJhbnMsIGVycjIuU3RyaW5nKCkpCi0gIH0KLSAgZXJyMyA6PSBwLlJlYWRNZXNzYWdlRW5kKCkKLSAgaWYgZXJyMyAhPSBuaWwgewotICAgIHQuRmF0YWxmKCIlczogJVQgJVQgVW5hYmxlIHRvIHJlYWQgbWVzc2FnZSBlbmQ6ICVzIiwgbWVzc2FnZU5hbWUsIHAsIHRyYW5zLCBlcnIzLlN0cmluZygpKQotICB9Ci19Ci0KLQotLyoqCi0gKllvdSBjYW4gZGVmaW5lIGVudW1zLCB3aGljaCBhcmUganVzdCAzMiBiaXQgaW50ZWdlcnMuIFZhbHVlcyBhcmUgb3B0aW9uYWwKLSAqYW5kIHN0YXJ0IGF0IDEgaWYgbm90IHN1cHBsaWVkLCBDIHN0eWxlIGFnYWluLgotICovCi10eXBlIE9wZXJhdGlvbiBpbnQKLQotY29uc3QgKAotICBBREQgICAgICBPcGVyYXRpb24gPSAxCi0gIFNVQlRSQUNUIE9wZXJhdGlvbiA9IDIKLSAgTVVMVElQTFkgT3BlcmF0aW9uID0gMwotICBESVZJREUgICBPcGVyYXRpb24gPSA0Ci0pCi0KLWZ1bmMgKHAgT3BlcmF0aW9uKSBTdHJpbmcoKSBzdHJpbmcgewotICBzd2l0Y2ggcCB7Ci0gIGNhc2UgQUREOgotICAgIHJldHVybiAiQUREIgotICBjYXNlIFNVQlRSQUNUOgotICAgIHJldHVybiAiU1VCVFJBQ1QiCi0gIGNhc2UgTVVMVElQTFk6Ci0gICAgcmV0dXJuICJNVUxUSVBMWSIKLSAgY2FzZSBESVZJREU6Ci0gICAgcmV0dXJuICJESVZJREUiCi0gIH0KLSAgcmV0dXJuICIiCi19Ci0KLWZ1bmMgRnJvbU9wZXJhdGlvblN0cmluZyhzIHN0cmluZykgT3BlcmF0aW9uIHsKLSAgc3dpdGNoIHMgewotICBjYXNlICJBREQiOgotICAgIHJldHVybiBBREQKLSAgY2FzZSAiU1VCVFJBQ1QiOgotICAgIHJldHVybiBTVUJUUkFDVAotICBjYXNlICJNVUxUSVBMWSI6Ci0gICAgcmV0dXJuIE1VTFRJUExZCi0gIGNhc2UgIkRJVklERSI6Ci0gICAgcmV0dXJuIERJVklERQotICB9Ci0gIHJldHVybiBPcGVyYXRpb24oLTEwMDAwKQotfQotCi1mdW5jIChwIE9wZXJhdGlvbikgVmFsdWUoKSBpbnQgewotICByZXR1cm4gaW50KHApCi19Ci0KLWZ1bmMgKHAgT3BlcmF0aW9uKSBJc0VudW0oKSBib29sIHsKLSAgcmV0dXJuIHRydWUKLX0KLQotLyoqCi0gKlRocmlmdCBsZXRzIHlvdSBkbyB0eXBlZGVmcyB0byBnZXQgcHJldHR5IG5hbWVzIGZvciB5b3VyIHR5cGVzLiBTdGFuZGFyZAotICpDIHN0eWxlIGhlcmUuCi0gKi8KLXR5cGUgTXlJbnRlZ2VyIGludDMyCi0KLWNvbnN0IElOVDMyQ09OU1RBTlQgPSA5ODUzCi0KLXZhciBNQVBDT05TVEFOVCBUTWFwCi0vKioKLSAqIFN0cnVjdHMgYXJlIHRoZSBiYXNpYyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcy4gVGhleSBhcmUgY29tcHJpc2VkIG9mIGZpZWxkcwotICogd2hpY2ggZWFjaCBoYXZlIGFuIGludGVnZXIgaWRlbnRpZmllciwgYSB0eXBlLCBhIHN5bWJvbGljIG5hbWUsIGFuZCBhbgotICogb3B0aW9uYWwgZGVmYXVsdCB2YWx1ZS4KLSAqIAotICogRmllbGRzIGNhbiBiZSBkZWNsYXJlZCAib3B0aW9uYWwiLCB3aGljaCBlbnN1cmVzIHRoZXkgd2lsbCBub3QgYmUgaW5jbHVkZWQKLSAqIGluIHRoZSBzZXJpYWxpemVkIG91dHB1dCBpZiB0aGV5IGFyZW4ndCBzZXQuICBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyBzb21lCi0gKiBtYW51YWwgbWFuYWdlbWVudCBpbiBzb21lIGxhbmd1YWdlcy4KLSAqIAotICogQXR0cmlidXRlczoKLSAqICAtIE51bTEKLSAqICAtIE51bTIKLSAqICAtIE9wCi0gKiAgLSBDb21tZW50Ci0gKi8KLXR5cGUgV29yayBzdHJ1Y3QgewotICBUU3RydWN0Ci0gIF8gICAgICAgaW50ZXJmYWNle30gIm51bTEiICAgIC8vIG5pbCAjIDAKLSAgTnVtMSAgICBpbnQzMiAgICAgICAibnVtMSIgICAgLy8gMQotICBOdW0yICAgIGludDMyICAgICAgICJudW0yIiAgICAvLyAyCi0gIE9wICAgICAgT3BlcmF0aW9uICAgIm9wIiAgICAgIC8vIDMKLSAgQ29tbWVudCBzdHJpbmcgICAgICAiY29tbWVudCIgLy8gNAotfQotCi1mdW5jIE5ld1dvcmsoKSAqV29yayB7Ci0gIG91dHB1dCA6PSAmV29ya3sKLSAgICBUU3RydWN0OiBOZXdUU3RydWN0KCJXb3JrIiwgW11URmllbGR7Ci0gICAgICBOZXdURmllbGQoIm51bTEiLCBJMzIsIDEpLAotICAgICAgTmV3VEZpZWxkKCJudW0yIiwgSTMyLCAyKSwKLSAgICAgIE5ld1RGaWVsZCgib3AiLCBJMzIsIDMpLAotICAgICAgTmV3VEZpZWxkKCJjb21tZW50IiwgU1RSSU5HLCA0KSwKLSAgICB9KSwKLSAgfQotICB7Ci0gICAgb3V0cHV0Lk51bTEgPSAwCi0gIH0KLSAgcmV0dXJuIG91dHB1dAotfQotCi1mdW5jIChwICpXb3JrKSBSZWFkKGlwcm90IFRQcm90b2NvbCkgKGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgXywgZXJyID0gaXByb3QuUmVhZFN0cnVjdEJlZ2luKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRTdHJ1Y3QocC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICBmb3IgewotICAgIGZpZWxkTmFtZSwgZmllbGRUeXBlSWQsIGZpZWxkSWQsIGVyciA6PSBpcHJvdC5SZWFkRmllbGRCZWdpbigpCi0gICAgaWYgZmllbGRJZCA8IDAgewotICAgICAgZmllbGRJZCA9IGludDE2KHAuRmllbGRJZEZyb21GaWVsZE5hbWUoZmllbGROYW1lKSkKLSAgICB9IGVsc2UgaWYgZmllbGROYW1lID09ICIiIHsKLSAgICAgIGZpZWxkTmFtZSA9IHAuRmllbGROYW1lRnJvbUZpZWxkSWQoaW50KGZpZWxkSWQpKQotICAgIH0KLSAgICBpZiBmaWVsZFR5cGVJZCA9PSBHRU5FUklDIHsKLSAgICAgIGZpZWxkVHlwZUlkID0gcC5GaWVsZEZyb21GaWVsZElkKGludChmaWVsZElkKSkuVHlwZUlkKCkKLSAgICB9Ci0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgIH0KLSAgICBpZiBmaWVsZFR5cGVJZCA9PSBTVE9QIHsKLSAgICAgIGJyZWFrCi0gICAgfQotICAgIGlmIGZpZWxkSWQgPT0gMSB8fCBmaWVsZE5hbWUgPT0gIm51bTEiIHsKLSAgICAgIGlmIGZpZWxkVHlwZUlkID09IEkzMiB7Ci0gICAgICAgIGVyciA9IHAuUmVhZEZpZWxkMShpcHJvdCkKLSAgICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIGZpZWxkVHlwZUlkID09IFZPSUQgewotICAgICAgICBlcnIgPSBpcHJvdC5Ta2lwKGZpZWxkVHlwZUlkKQotICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBwLlJlYWRGaWVsZDEoaXByb3QpCi0gICAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgZmllbGRJZCA9PSAyIHx8IGZpZWxkTmFtZSA9PSAibnVtMiIgewotICAgICAgaWYgZmllbGRUeXBlSWQgPT0gSTMyIHsKLSAgICAgICAgZXJyID0gcC5SZWFkRmllbGQyKGlwcm90KQotICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgZmllbGRUeXBlSWQgPT0gVk9JRCB7Ci0gICAgICAgIGVyciA9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpCi0gICAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IHAuUmVhZEZpZWxkMihpcHJvdCkKLSAgICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSBpZiBmaWVsZElkID09IDMgfHwgZmllbGROYW1lID09ICJvcCIgewotICAgICAgaWYgZmllbGRUeXBlSWQgPT0gSTMyIHsKLSAgICAgICAgZXJyID0gcC5SZWFkRmllbGQzKGlwcm90KQotICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgZmllbGRUeXBlSWQgPT0gVk9JRCB7Ci0gICAgICAgIGVyciA9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpCi0gICAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IHAuUmVhZEZpZWxkMyhpcHJvdCkKLSAgICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSBpZiBmaWVsZElkID09IDQgfHwgZmllbGROYW1lID09ICJjb21tZW50IiB7Ci0gICAgICBpZiBmaWVsZFR5cGVJZCA9PSBTVFJJTkcgewotICAgICAgICBlcnIgPSBwLlJlYWRGaWVsZDQoaXByb3QpCi0gICAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiBmaWVsZFR5cGVJZCA9PSBWT0lEIHsKLSAgICAgICAgZXJyID0gaXByb3QuU2tpcChmaWVsZFR5cGVJZCkKLSAgICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gcC5SZWFkRmllbGQ0KGlwcm90KQotICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGVyciA9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpCi0gICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICAgIH0KLSAgICB9Ci0gICAgZXJyID0gaXByb3QuUmVhZEZpZWxkRW5kKCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgfQotICB9Ci0gIGVyciA9IGlwcm90LlJlYWRTdHJ1Y3RFbmQoKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZFN0cnVjdChwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIHJldHVybiBlcnIKLX0KLQotZnVuYyAocCAqV29yaykgUmVhZEZpZWxkMShpcHJvdCBUUHJvdG9jb2wpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHY0LCBlcnI1IDo9IGlwcm90LlJlYWRJMzIoKQotICBpZiBlcnI1ICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZCgxLCAibnVtMSIsIHAuVGhyaWZ0TmFtZSgpLCBlcnI1KQotICB9Ci0gIHAuTnVtMSA9IHY0Ci0gIHJldHVybiBlcnIKLX0KLQotZnVuYyAocCAqV29yaykgUmVhZEZpZWxkTnVtMShpcHJvdCBUUHJvdG9jb2wpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLlJlYWRGaWVsZDEoaXByb3QpCi19Ci0KLWZ1bmMgKHAgKldvcmspIFJlYWRGaWVsZDIoaXByb3QgVFByb3RvY29sKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICB2NiwgZXJyNyA6PSBpcHJvdC5SZWFkSTMyKCkKLSAgaWYgZXJyNyAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoMiwgIm51bTIiLCBwLlRocmlmdE5hbWUoKSwgZXJyNykKLSAgfQotICBwLk51bTIgPSB2NgotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKldvcmspIFJlYWRGaWVsZE51bTIoaXByb3QgVFByb3RvY29sKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5SZWFkRmllbGQyKGlwcm90KQotfQotCi1mdW5jIChwICpXb3JrKSBSZWFkRmllbGQzKGlwcm90IFRQcm90b2NvbCkgKGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgdjgsIGVycjkgOj0gaXByb3QuUmVhZEkzMigpCi0gIGlmIGVycjkgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKDMsICJvcCIsIHAuVGhyaWZ0TmFtZSgpLCBlcnI5KQotICB9Ci0gIHAuT3AgPSBPcGVyYXRpb24odjgpCi0gIHJldHVybiBlcnIKLX0KLQotZnVuYyAocCAqV29yaykgUmVhZEZpZWxkT3AoaXByb3QgVFByb3RvY29sKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5SZWFkRmllbGQzKGlwcm90KQotfQotCi1mdW5jIChwICpXb3JrKSBSZWFkRmllbGQ0KGlwcm90IFRQcm90b2NvbCkgKGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgdjEwLCBlcnIxMSA6PSBpcHJvdC5SZWFkU3RyaW5nKCkKLSAgaWYgZXJyMTEgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKDQsICJjb21tZW50IiwgcC5UaHJpZnROYW1lKCksIGVycjExKQotICB9Ci0gIHAuQ29tbWVudCA9IHYxMAotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKldvcmspIFJlYWRGaWVsZENvbW1lbnQoaXByb3QgVFByb3RvY29sKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5SZWFkRmllbGQ0KGlwcm90KQotfQotCi1mdW5jIChwICpXb3JrKSBXcml0ZShvcHJvdCBUUHJvdG9jb2wpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGVyciA9IG9wcm90LldyaXRlU3RydWN0QmVnaW4oIldvcmsiKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVTdHJ1Y3QocC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICBlcnIgPSBwLldyaXRlRmllbGQxKG9wcm90KQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gZXJyCi0gIH0KLSAgZXJyID0gcC5Xcml0ZUZpZWxkMihvcHJvdCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIGVycgotICB9Ci0gIGVyciA9IHAuV3JpdGVGaWVsZDMob3Byb3QpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBlcnIKLSAgfQotICBlcnIgPSBwLldyaXRlRmllbGQ0KG9wcm90KQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gZXJyCi0gIH0KLSAgZXJyID0gb3Byb3QuV3JpdGVGaWVsZFN0b3AoKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVGaWVsZCgtMSwgIlNUT1AiLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIGVyciA9IG9wcm90LldyaXRlU3RydWN0RW5kKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlU3RydWN0KHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgcmV0dXJuIGVycgotfQotCi1mdW5jIChwICpXb3JrKSBXcml0ZUZpZWxkMShvcHJvdCBUUHJvdG9jb2wpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGVyciA9IG9wcm90LldyaXRlRmllbGRCZWdpbigibnVtMSIsIEkzMiwgMSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoMSwgIm51bTEiLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIGVyciA9IG9wcm90LldyaXRlSTMyKGludDMyKHAuTnVtMSkpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKDEsICJudW0xIiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICBlcnIgPSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoMSwgIm51bTEiLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIHJldHVybiBlcnIKLX0KLQotZnVuYyAocCAqV29yaykgV3JpdGVGaWVsZE51bTEob3Byb3QgVFByb3RvY29sKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5Xcml0ZUZpZWxkMShvcHJvdCkKLX0KLQotZnVuYyAocCAqV29yaykgV3JpdGVGaWVsZDIob3Byb3QgVFByb3RvY29sKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBlcnIgPSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oIm51bTIiLCBJMzIsIDIpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKDIsICJudW0yIiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICBlcnIgPSBvcHJvdC5Xcml0ZUkzMihpbnQzMihwLk51bTIpKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVGaWVsZCgyLCAibnVtMiIsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgZXJyID0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKDIsICJudW0yIiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKldvcmspIFdyaXRlRmllbGROdW0yKG9wcm90IFRQcm90b2NvbCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuV3JpdGVGaWVsZDIob3Byb3QpCi19Ci0KLWZ1bmMgKHAgKldvcmspIFdyaXRlRmllbGQzKG9wcm90IFRQcm90b2NvbCkgKGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgZXJyID0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJvcCIsIEkzMiwgMykKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoMywgIm9wIiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICBlcnIgPSBvcHJvdC5Xcml0ZUkzMihpbnQzMihwLk9wKSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoMywgIm9wIiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICBlcnIgPSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoMywgIm9wIiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKldvcmspIFdyaXRlRmllbGRPcChvcHJvdCBUUHJvdG9jb2wpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLldyaXRlRmllbGQzKG9wcm90KQotfQotCi1mdW5jIChwICpXb3JrKSBXcml0ZUZpZWxkNChvcHJvdCBUUHJvdG9jb2wpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGVyciA9IG9wcm90LldyaXRlRmllbGRCZWdpbigiY29tbWVudCIsIFNUUklORywgNCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoNCwgImNvbW1lbnQiLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIGVyciA9IG9wcm90LldyaXRlU3RyaW5nKHN0cmluZyhwLkNvbW1lbnQpKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVGaWVsZCg0LCAiY29tbWVudCIsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgZXJyID0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKDQsICJjb21tZW50IiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKldvcmspIFdyaXRlRmllbGRDb21tZW50KG9wcm90IFRQcm90b2NvbCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuV3JpdGVGaWVsZDQob3Byb3QpCi19Ci0KLWZ1bmMgKHAgKldvcmspIFRTdHJ1Y3ROYW1lKCkgc3RyaW5nIHsKLSAgcmV0dXJuICJXb3JrIgotfQotCi1mdW5jIChwICpXb3JrKSBUaHJpZnROYW1lKCkgc3RyaW5nIHsKLSAgcmV0dXJuICJXb3JrIgotfQotCi1mdW5jIChwICpXb3JrKSBTdHJpbmcoKSBzdHJpbmcgewotICBpZiBwID09IG5pbCB7Ci0gICAgcmV0dXJuICI8bmlsPiIKLSAgfQotICByZXR1cm4gZm10LlNwcmludGYoIldvcmsoJSt2KSIsICpwKQotfQotCi1mdW5jIChwICpXb3JrKSBDb21wYXJlVG8ob3RoZXIgaW50ZXJmYWNle30pIChpbnQsIGJvb2wpIHsKLSAgaWYgb3RoZXIgPT0gbmlsIHsKLSAgICByZXR1cm4gMSwgdHJ1ZQotICB9Ci0gIGRhdGEsIG9rIDo9IG90aGVyLigqV29yaykKLSAgaWYgIW9rIHsKLSAgICByZXR1cm4gMCwgZmFsc2UKLSAgfQotICBpZiBwLk51bTEgIT0gZGF0YS5OdW0xIHsKLSAgICBpZiBwLk51bTEgPCBkYXRhLk51bTEgewotICAgICAgcmV0dXJuIC0xLCB0cnVlCi0gICAgfQotICAgIHJldHVybiAxLCB0cnVlCi0gIH0KLSAgaWYgcC5OdW0yICE9IGRhdGEuTnVtMiB7Ci0gICAgaWYgcC5OdW0yIDwgZGF0YS5OdW0yIHsKLSAgICAgIHJldHVybiAtMSwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gMSwgdHJ1ZQotICB9Ci0gIGlmIHAuT3AgIT0gZGF0YS5PcCB7Ci0gICAgaWYgcC5PcCA8IGRhdGEuT3AgewotICAgICAgcmV0dXJuIC0xLCB0cnVlCi0gICAgfQotICAgIHJldHVybiAxLCB0cnVlCi0gIH0KLSAgaWYgcC5Db21tZW50ICE9IGRhdGEuQ29tbWVudCB7Ci0gICAgaWYgcC5Db21tZW50IDwgZGF0YS5Db21tZW50IHsKLSAgICAgIHJldHVybiAtMSwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gMSwgdHJ1ZQotICB9Ci0gIHJldHVybiAwLCB0cnVlCi19Ci0KLWZ1bmMgKHAgKldvcmspIEF0dHJpYnV0ZUJ5RmllbGRJZChpZCBpbnQpIGludGVyZmFjZXt9IHsKLSAgc3dpdGNoIGlkIHsKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gbmlsCi0gIGNhc2UgMToKLSAgICByZXR1cm4gcC5OdW0xCi0gIGNhc2UgMjoKLSAgICByZXR1cm4gcC5OdW0yCi0gIGNhc2UgMzoKLSAgICByZXR1cm4gcC5PcAotICBjYXNlIDQ6Ci0gICAgcmV0dXJuIHAuQ29tbWVudAotICB9Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqV29yaykgVFN0cnVjdEZpZWxkcygpIFRGaWVsZENvbnRhaW5lciB7Ci0gIHJldHVybiBOZXdURmllbGRDb250YWluZXIoW11URmllbGR7Ci0gICAgTmV3VEZpZWxkKCJudW0xIiwgSTMyLCAxKSwKLSAgICBOZXdURmllbGQoIm51bTIiLCBJMzIsIDIpLAotICAgIE5ld1RGaWVsZCgib3AiLCBJMzIsIDMpLAotICAgIE5ld1RGaWVsZCgiY29tbWVudCIsIFNUUklORywgNCksCi0gIH0pCi19Ci0KLQotdHlwZSBJQ2FsY3VsYXRvciBpbnRlcmZhY2UgewotICAvKioKLSAgICogUGFyYW1ldGVyczoKLSAgICogIC0gS2V5Ci0gICAqLwotICBDYWxjdWxhdGUobG9naWQgaW50MzIsIHcgKldvcmspIChyZXR2YWwzMCBpbnQzMiwgb3VjaCAqSW52YWxpZE9wZXJhdGlvbiwgZXJyIG9zLkVycm9yKQotfQotCi10eXBlIENhbGN1bGF0b3JDbGllbnQgc3RydWN0IHsKLSAgVHJhbnNwb3J0ICAgICAgIFRUcmFuc3BvcnQKLSAgUHJvdG9jb2xGYWN0b3J5IFRQcm90b2NvbEZhY3RvcnkKLSAgSW5wdXRQcm90b2NvbCAgIFRQcm90b2NvbAotICBPdXRwdXRQcm90b2NvbCAgVFByb3RvY29sCi0gIFNlcUlkICAgICAgICAgICBpbnQzMgotfQotCi1mdW5jIE5ld0NhbGN1bGF0b3JDbGllbnRGYWN0b3J5KHQgVFRyYW5zcG9ydCwgZiBUUHJvdG9jb2xGYWN0b3J5KSAqQ2FsY3VsYXRvckNsaWVudCB7Ci0gIHJldHVybiAmQ2FsY3VsYXRvckNsaWVudHtUcmFuc3BvcnQ6IHQsCi0gICAgUHJvdG9jb2xGYWN0b3J5OiBmLAotICAgIElucHV0UHJvdG9jb2w6ICAgZi5HZXRQcm90b2NvbCh0KSwKLSAgICBPdXRwdXRQcm90b2NvbDogIGYuR2V0UHJvdG9jb2wodCksCi0gICAgU2VxSWQ6ICAgICAgICAgICAwLAotICB9Ci19Ci0KLWZ1bmMgTmV3Q2FsY3VsYXRvckNsaWVudFByb3RvY29sKHQgVFRyYW5zcG9ydCwgaXByb3QgVFByb3RvY29sLCBvcHJvdCBUUHJvdG9jb2wpICpDYWxjdWxhdG9yQ2xpZW50IHsKLSAgcmV0dXJuICZDYWxjdWxhdG9yQ2xpZW50e1RyYW5zcG9ydDogdCwKLSAgICBQcm90b2NvbEZhY3Rvcnk6IG5pbCwKLSAgICBJbnB1dFByb3RvY29sOiAgIGlwcm90LAotICAgIE91dHB1dFByb3RvY29sOiAgb3Byb3QsCi0gICAgU2VxSWQ6ICAgICAgICAgICAwLAotICB9Ci19Ci0KLQotLyoqCi0gKiBQYXJhbWV0ZXJzOgotICogIC0gTG9naWQKLSAqICAtIFcKLSAqLwotZnVuYyAocCAqQ2FsY3VsYXRvckNsaWVudCkgQ2FsY3VsYXRlKGxvZ2lkIGludDMyLCB3ICpXb3JrKSAocmV0dmFsMzAgaW50MzIsIG91Y2ggKkludmFsaWRPcGVyYXRpb24sIGVyciBvcy5FcnJvcikgewotICBlcnIgPSBwLlNlbmRDYWxjdWxhdGUobG9naWQsIHcpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybgotICB9Ci0gIHJldHVybiBwLlJlY3ZDYWxjdWxhdGUoKQotfQotCi1mdW5jIChwICpDYWxjdWxhdG9yQ2xpZW50KSBTZW5kQ2FsY3VsYXRlKGxvZ2lkIGludDMyLCB3ICpXb3JrKSAoZXJyIG9zLkVycm9yKSB7Ci0gIG9wcm90IDo9IHAuT3V0cHV0UHJvdG9jb2wKLSAgaWYgb3Byb3QgIT0gbmlsIHsKLSAgICBvcHJvdCA9IHAuUHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHAuVHJhbnNwb3J0KQotICAgIHAuT3V0cHV0UHJvdG9jb2wgPSBvcHJvdAotICB9Ci0gIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKCJjYWxjdWxhdGUiLCBDQUxMLCBwLlNlcUlkKQotICBhcmdzMzEgOj0gTmV3Q2FsY3VsYXRlQXJncygpCi0gIGFyZ3MzMS5Mb2dpZCA9IGxvZ2lkCi0gIGFyZ3MzMS5XID0gdwotICBlcnIgPSBhcmdzMzEuV3JpdGUob3Byb3QpCi0gIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpCi0gIG9wcm90LlRyYW5zcG9ydCgpLkZsdXNoKCkKLSAgcmV0dXJuCi19Ci0KLQotZnVuYyAocCAqQ2FsY3VsYXRvckNsaWVudCkgUmVjdkNhbGN1bGF0ZSgpICh2YWx1ZSBpbnQzMiwgb3VjaCAqSW52YWxpZE9wZXJhdGlvbiwgZXJyIG9zLkVycm9yKSB7Ci0gIGlwcm90IDo9IHAuSW5wdXRQcm90b2NvbAotICBpZiBpcHJvdCA9PSBuaWwgewotICAgIGlwcm90ID0gcC5Qcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wocC5UcmFuc3BvcnQpCi0gICAgcC5JbnB1dFByb3RvY29sID0gaXByb3QKLSAgfQotICBfLCBtVHlwZUlkLCBfLCBlcnIgOj0gaXByb3QuUmVhZE1lc3NhZ2VCZWdpbigpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybgotICB9Ci0gIGlmIG1UeXBlSWQgPT0gRVhDRVBUSU9OIHsKLSAgICBlcnJvcjMzIDo9IE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbkRlZmF1bHQoKQotICAgIGVycm9yMzQsIGVyciA6PSBlcnJvcjMzLlJlYWQoaXByb3QpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4KLSAgICB9Ci0gICAgaWYgZXJyID0gaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4KLSAgICB9Ci0gICAgZXJyID0gZXJyb3IzNAotICAgIHJldHVybgotICB9Ci0gIHJlc3VsdDMyIDo9IE5ld0NhbGN1bGF0ZVJlc3VsdCgpCi0gIGVyciA9IHJlc3VsdDMyLlJlYWQoaXByb3QpCi0gIGlwcm90LlJlYWRNZXNzYWdlRW5kKCkKLSAgdmFsdWUgPSByZXN1bHQzMi5TdWNjZXNzCi0gIGlmIHJlc3VsdDMyLk91Y2ggIT0gbmlsIHsKLSAgICBvdWNoID0gcmVzdWx0MzIuT3VjaAotICB9Ci0gIHJldHVybgotfQotCi0KLS8qKgotICogQXR0cmlidXRlczoKLSAqICAtIExvZ2lkCi0gKiAgLSBXCi0gKi8KLXR5cGUgQ2FsY3VsYXRlQXJncyBzdHJ1Y3QgewotICBUU3RydWN0Ci0gIF8gICAgIGludGVyZmFjZXt9ICJsb2dpZCIgLy8gbmlsICMgMAotICBMb2dpZCBpbnQzMiAgICAgICAibG9naWQiIC8vIDEKLSAgVyAgICAgKldvcmsgICAgICAgInciICAgICAvLyAyCi19Ci0KLWZ1bmMgTmV3Q2FsY3VsYXRlQXJncygpICpDYWxjdWxhdGVBcmdzIHsKLSAgb3V0cHV0IDo9ICZDYWxjdWxhdGVBcmdzewotICAgIFRTdHJ1Y3Q6IE5ld1RTdHJ1Y3QoImNhbGN1bGF0ZV9hcmdzIiwgW11URmllbGR7Ci0gICAgICBOZXdURmllbGQoImxvZ2lkIiwgSTMyLCAxKSwKLSAgICAgIE5ld1RGaWVsZCgidyIsIFNUUlVDVCwgMiksCi0gICAgfSksCi0gIH0KLSAgewotICB9Ci0gIHJldHVybiBvdXRwdXQKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRlQXJncykgUmVhZChpcHJvdCBUUHJvdG9jb2wpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIF8sIGVyciA9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkU3RydWN0KHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgZm9yIHsKLSAgICBmaWVsZE5hbWUsIGZpZWxkVHlwZUlkLCBmaWVsZElkLCBlcnIgOj0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKQotICAgIGlmIGZpZWxkSWQgPCAwIHsKLSAgICAgIGZpZWxkSWQgPSBpbnQxNihwLkZpZWxkSWRGcm9tRmllbGROYW1lKGZpZWxkTmFtZSkpCi0gICAgfSBlbHNlIGlmIGZpZWxkTmFtZSA9PSAiIiB7Ci0gICAgICBmaWVsZE5hbWUgPSBwLkZpZWxkTmFtZUZyb21GaWVsZElkKGludChmaWVsZElkKSkKLSAgICB9Ci0gICAgaWYgZmllbGRUeXBlSWQgPT0gR0VORVJJQyB7Ci0gICAgICBmaWVsZFR5cGVJZCA9IHAuRmllbGRGcm9tRmllbGRJZChpbnQoZmllbGRJZCkpLlR5cGVJZCgpCi0gICAgfQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICB9Ci0gICAgaWYgZmllbGRUeXBlSWQgPT0gU1RPUCB7Ci0gICAgICBicmVhawotICAgIH0KLSAgICBpZiBmaWVsZElkID09IDEgfHwgZmllbGROYW1lID09ICJsb2dpZCIgewotICAgICAgaWYgZmllbGRUeXBlSWQgPT0gSTMyIHsKLSAgICAgICAgZXJyID0gcC5SZWFkRmllbGQxKGlwcm90KQotICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgZmllbGRUeXBlSWQgPT0gVk9JRCB7Ci0gICAgICAgIGVyciA9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpCi0gICAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IHAuUmVhZEZpZWxkMShpcHJvdCkKLSAgICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSBpZiBmaWVsZElkID09IDIgfHwgZmllbGROYW1lID09ICJ3IiB7Ci0gICAgICBpZiBmaWVsZFR5cGVJZCA9PSBTVFJVQ1QgewotICAgICAgICBlcnIgPSBwLlJlYWRGaWVsZDIoaXByb3QpCi0gICAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiBmaWVsZFR5cGVJZCA9PSBWT0lEIHsKLSAgICAgICAgZXJyID0gaXByb3QuU2tpcChmaWVsZFR5cGVJZCkKLSAgICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gcC5SZWFkRmllbGQyKGlwcm90KQotICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGVyciA9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpCi0gICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICAgIH0KLSAgICB9Ci0gICAgZXJyID0gaXByb3QuUmVhZEZpZWxkRW5kKCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgfQotICB9Ci0gIGVyciA9IGlwcm90LlJlYWRTdHJ1Y3RFbmQoKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZFN0cnVjdChwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIHJldHVybiBlcnIKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRlQXJncykgUmVhZEZpZWxkMShpcHJvdCBUUHJvdG9jb2wpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHY0NywgZXJyNDggOj0gaXByb3QuUmVhZEkzMigpCi0gIGlmIGVycjQ4ICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZCgxLCAibG9naWQiLCBwLlRocmlmdE5hbWUoKSwgZXJyNDgpCi0gIH0KLSAgcC5Mb2dpZCA9IHY0NwotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZUFyZ3MpIFJlYWRGaWVsZExvZ2lkKGlwcm90IFRQcm90b2NvbCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuUmVhZEZpZWxkMShpcHJvdCkKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRlQXJncykgUmVhZEZpZWxkMihpcHJvdCBUUHJvdG9jb2wpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHAuVyA9IE5ld1dvcmsoKQotICBlcnI1MSA6PSBwLlcuUmVhZChpcHJvdCkKLSAgaWYgZXJyNTEgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZFN0cnVjdCgicC5XV29yayIsIGVycjUxKQotICB9Ci0gIHJldHVybiBlcnIKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRlQXJncykgUmVhZEZpZWxkVyhpcHJvdCBUUHJvdG9jb2wpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLlJlYWRGaWVsZDIoaXByb3QpCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZUFyZ3MpIFdyaXRlKG9wcm90IFRQcm90b2NvbCkgKGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgZXJyID0gb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbigiY2FsY3VsYXRlX2FyZ3MiKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVTdHJ1Y3QocC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICBlcnIgPSBwLldyaXRlRmllbGQxKG9wcm90KQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gZXJyCi0gIH0KLSAgZXJyID0gcC5Xcml0ZUZpZWxkMihvcHJvdCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIGVycgotICB9Ci0gIGVyciA9IG9wcm90LldyaXRlRmllbGRTdG9wKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoLTEsICJTVE9QIiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICBlcnIgPSBvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZVN0cnVjdChwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIHJldHVybiBlcnIKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRlQXJncykgV3JpdGVGaWVsZDEob3Byb3QgVFByb3RvY29sKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBlcnIgPSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oImxvZ2lkIiwgSTMyLCAxKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVGaWVsZCgxLCAibG9naWQiLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIGVyciA9IG9wcm90LldyaXRlSTMyKGludDMyKHAuTG9naWQpKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVGaWVsZCgxLCAibG9naWQiLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIGVyciA9IG9wcm90LldyaXRlRmllbGRFbmQoKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVGaWVsZCgxLCAibG9naWQiLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIHJldHVybiBlcnIKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRlQXJncykgV3JpdGVGaWVsZExvZ2lkKG9wcm90IFRQcm90b2NvbCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuV3JpdGVGaWVsZDEob3Byb3QpCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZUFyZ3MpIFdyaXRlRmllbGQyKG9wcm90IFRQcm90b2NvbCkgKGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgaWYgcC5XICE9IG5pbCB7Ci0gICAgZXJyID0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJ3IiwgU1RSVUNULCAyKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoMiwgInciLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgIH0KLSAgICBlcnIgPSBwLlcuV3JpdGUob3Byb3QpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVTdHJ1Y3QoIldvcmsiLCBlcnIpCi0gICAgfQotICAgIGVyciA9IG9wcm90LldyaXRlRmllbGRFbmQoKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoMiwgInciLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgIH0KLSAgfQotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZUFyZ3MpIFdyaXRlRmllbGRXKG9wcm90IFRQcm90b2NvbCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuV3JpdGVGaWVsZDIob3Byb3QpCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZUFyZ3MpIFRTdHJ1Y3ROYW1lKCkgc3RyaW5nIHsKLSAgcmV0dXJuICJDYWxjdWxhdGVBcmdzIgotfQotCi1mdW5jIChwICpDYWxjdWxhdGVBcmdzKSBUaHJpZnROYW1lKCkgc3RyaW5nIHsKLSAgcmV0dXJuICJjYWxjdWxhdGVfYXJncyIKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRlQXJncykgU3RyaW5nKCkgc3RyaW5nIHsKLSAgaWYgcCA9PSBuaWwgewotICAgIHJldHVybiAiPG5pbD4iCi0gIH0KLSAgcmV0dXJuIGZtdC5TcHJpbnRmKCJDYWxjdWxhdGVBcmdzKCUrdikiLCAqcCkKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRlQXJncykgQ29tcGFyZVRvKG90aGVyIGludGVyZmFjZXt9KSAoaW50LCBib29sKSB7Ci0gIGlmIG90aGVyID09IG5pbCB7Ci0gICAgcmV0dXJuIDEsIHRydWUKLSAgfQotICBkYXRhLCBvayA6PSBvdGhlci4oKkNhbGN1bGF0ZUFyZ3MpCi0gIGlmICFvayB7Ci0gICAgcmV0dXJuIDAsIGZhbHNlCi0gIH0KLSAgaWYgcC5Mb2dpZCAhPSBkYXRhLkxvZ2lkIHsKLSAgICBpZiBwLkxvZ2lkIDwgZGF0YS5Mb2dpZCB7Ci0gICAgICByZXR1cm4gLTEsIHRydWUKLSAgICB9Ci0gICAgcmV0dXJuIDEsIHRydWUKLSAgfQotICBpZiBjbXAsIG9rIDo9IHAuVy5Db21wYXJlVG8oZGF0YS5XKTsgIW9rIHx8IGNtcCAhPSAwIHsKLSAgICByZXR1cm4gY21wLCBvawotICB9Ci0gIHJldHVybiAwLCB0cnVlCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZUFyZ3MpIEF0dHJpYnV0ZUJ5RmllbGRJZChpZCBpbnQpIGludGVyZmFjZXt9IHsKLSAgc3dpdGNoIGlkIHsKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gbmlsCi0gIGNhc2UgMToKLSAgICByZXR1cm4gcC5Mb2dpZAotICBjYXNlIDI6Ci0gICAgcmV0dXJuIHAuVwotICB9Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRlQXJncykgVFN0cnVjdEZpZWxkcygpIFRGaWVsZENvbnRhaW5lciB7Ci0gIHJldHVybiBOZXdURmllbGRDb250YWluZXIoW11URmllbGR7Ci0gICAgTmV3VEZpZWxkKCJsb2dpZCIsIEkzMiwgMSksCi0gICAgTmV3VEZpZWxkKCJ3IiwgU1RSVUNULCAyKSwKLSAgfSkKLX0KLQotLyoqCi0gKiBBdHRyaWJ1dGVzOgotICogIC0gU3VjY2VzcwotICogIC0gT3VjaAotICovCi10eXBlIENhbGN1bGF0ZVJlc3VsdCBzdHJ1Y3QgewotICBUU3RydWN0Ci0gIFN1Y2Nlc3MgaW50MzIgICAgICAgICAgICAgInN1Y2Nlc3MiIC8vIDAKLSAgT3VjaCAgICAqSW52YWxpZE9wZXJhdGlvbiAib3VjaCIgICAgLy8gMQotfQotCi1mdW5jIE5ld0NhbGN1bGF0ZVJlc3VsdCgpICpDYWxjdWxhdGVSZXN1bHQgewotICBvdXRwdXQgOj0gJkNhbGN1bGF0ZVJlc3VsdHsKLSAgICBUU3RydWN0OiBOZXdUU3RydWN0KCJjYWxjdWxhdGVfcmVzdWx0IiwgW11URmllbGR7Ci0gICAgICBOZXdURmllbGQoInN1Y2Nlc3MiLCBJMzIsIDApLAotICAgICAgTmV3VEZpZWxkKCJvdWNoIiwgU1RSVUNULCAxKSwKLSAgICB9KSwKLSAgfQotICB7Ci0gIH0KLSAgcmV0dXJuIG91dHB1dAotfQotCi1mdW5jIChwICpDYWxjdWxhdGVSZXN1bHQpIFJlYWQoaXByb3QgVFByb3RvY29sKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBfLCBlcnIgPSBpcHJvdC5SZWFkU3RydWN0QmVnaW4oKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZFN0cnVjdChwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIGZvciB7Ci0gICAgZmllbGROYW1lLCBmaWVsZFR5cGVJZCwgZmllbGRJZCwgZXJyIDo9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCkKLSAgICBpZiBmaWVsZElkIDwgMCB7Ci0gICAgICBmaWVsZElkID0gaW50MTYocC5GaWVsZElkRnJvbUZpZWxkTmFtZShmaWVsZE5hbWUpKQotICAgIH0gZWxzZSBpZiBmaWVsZE5hbWUgPT0gIiIgewotICAgICAgZmllbGROYW1lID0gcC5GaWVsZE5hbWVGcm9tRmllbGRJZChpbnQoZmllbGRJZCkpCi0gICAgfQotICAgIGlmIGZpZWxkVHlwZUlkID09IEdFTkVSSUMgewotICAgICAgZmllbGRUeXBlSWQgPSBwLkZpZWxkRnJvbUZpZWxkSWQoaW50KGZpZWxkSWQpKS5UeXBlSWQoKQotICAgIH0KLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgfQotICAgIGlmIGZpZWxkVHlwZUlkID09IFNUT1AgewotICAgICAgYnJlYWsKLSAgICB9Ci0gICAgaWYgZmllbGRJZCA9PSAwIHx8IGZpZWxkTmFtZSA9PSAic3VjY2VzcyIgewotICAgICAgaWYgZmllbGRUeXBlSWQgPT0gSTMyIHsKLSAgICAgICAgZXJyID0gcC5SZWFkRmllbGQwKGlwcm90KQotICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgZmllbGRUeXBlSWQgPT0gVk9JRCB7Ci0gICAgICAgIGVyciA9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpCi0gICAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IHAuUmVhZEZpZWxkMChpcHJvdCkKLSAgICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSBpZiBmaWVsZElkID09IDEgfHwgZmllbGROYW1lID09ICJvdWNoIiB7Ci0gICAgICBpZiBmaWVsZFR5cGVJZCA9PSBTVFJVQ1QgewotICAgICAgICBlcnIgPSBwLlJlYWRGaWVsZDEoaXByb3QpCi0gICAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiBmaWVsZFR5cGVJZCA9PSBWT0lEIHsKLSAgICAgICAgZXJyID0gaXByb3QuU2tpcChmaWVsZFR5cGVJZCkKLSAgICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gcC5SZWFkRmllbGQxKGlwcm90KQotICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGVyciA9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpCi0gICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICAgIH0KLSAgICB9Ci0gICAgZXJyID0gaXByb3QuUmVhZEZpZWxkRW5kKCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgfQotICB9Ci0gIGVyciA9IGlwcm90LlJlYWRTdHJ1Y3RFbmQoKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZFN0cnVjdChwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIHJldHVybiBlcnIKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRlUmVzdWx0KSBSZWFkRmllbGQwKGlwcm90IFRQcm90b2NvbCkgKGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgdjUyLCBlcnI1MyA6PSBpcHJvdC5SZWFkSTMyKCkKLSAgaWYgZXJyNTMgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKDAsICJzdWNjZXNzIiwgcC5UaHJpZnROYW1lKCksIGVycjUzKQotICB9Ci0gIHAuU3VjY2VzcyA9IHY1MgotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZVJlc3VsdCkgUmVhZEZpZWxkU3VjY2VzcyhpcHJvdCBUUHJvdG9jb2wpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLlJlYWRGaWVsZDAoaXByb3QpCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZVJlc3VsdCkgUmVhZEZpZWxkMShpcHJvdCBUUHJvdG9jb2wpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHAuT3VjaCA9IE5ld0ludmFsaWRPcGVyYXRpb24oKQotICBlcnI1NiA6PSBwLk91Y2guUmVhZChpcHJvdCkKLSAgaWYgZXJyNTYgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZFN0cnVjdCgicC5PdWNoSW52YWxpZE9wZXJhdGlvbiIsIGVycjU2KQotICB9Ci0gIHJldHVybiBlcnIKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRlUmVzdWx0KSBSZWFkRmllbGRPdWNoKGlwcm90IFRQcm90b2NvbCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuUmVhZEZpZWxkMShpcHJvdCkKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRlUmVzdWx0KSBXcml0ZShvcHJvdCBUUHJvdG9jb2wpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGVyciA9IG9wcm90LldyaXRlU3RydWN0QmVnaW4oImNhbGN1bGF0ZV9yZXN1bHQiKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVTdHJ1Y3QocC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICBlcnIgPSBwLldyaXRlRmllbGQwKG9wcm90KQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gZXJyCi0gIH0KLSAgZXJyID0gcC5Xcml0ZUZpZWxkMShvcHJvdCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIGVycgotICB9Ci0gIGVyciA9IG9wcm90LldyaXRlRmllbGRTdG9wKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoLTEsICJTVE9QIiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICBlcnIgPSBvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZVN0cnVjdChwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIHJldHVybiBlcnIKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRlUmVzdWx0KSBXcml0ZUZpZWxkMChvcHJvdCBUUHJvdG9jb2wpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGVyciA9IG9wcm90LldyaXRlRmllbGRCZWdpbigic3VjY2VzcyIsIEkzMiwgMCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoMCwgInN1Y2Nlc3MiLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIGVyciA9IG9wcm90LldyaXRlSTMyKGludDMyKHAuU3VjY2VzcykpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKDAsICJzdWNjZXNzIiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICBlcnIgPSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoMCwgInN1Y2Nlc3MiLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIHJldHVybiBlcnIKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRlUmVzdWx0KSBXcml0ZUZpZWxkU3VjY2VzcyhvcHJvdCBUUHJvdG9jb2wpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLldyaXRlRmllbGQwKG9wcm90KQotfQotCi1mdW5jIChwICpDYWxjdWxhdGVSZXN1bHQpIFdyaXRlRmllbGQxKG9wcm90IFRQcm90b2NvbCkgKGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgaWYgcC5PdWNoICE9IG5pbCB7Ci0gICAgZXJyID0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJvdWNoIiwgU1RSVUNULCAxKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoMSwgIm91Y2giLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgIH0KLSAgICBlcnIgPSBwLk91Y2guV3JpdGUob3Byb3QpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVTdHJ1Y3QoIkludmFsaWRPcGVyYXRpb24iLCBlcnIpCi0gICAgfQotICAgIGVyciA9IG9wcm90LldyaXRlRmllbGRFbmQoKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoMSwgIm91Y2giLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgIH0KLSAgfQotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZVJlc3VsdCkgV3JpdGVGaWVsZE91Y2gob3Byb3QgVFByb3RvY29sKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5Xcml0ZUZpZWxkMShvcHJvdCkKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRlUmVzdWx0KSBUU3RydWN0TmFtZSgpIHN0cmluZyB7Ci0gIHJldHVybiAiQ2FsY3VsYXRlUmVzdWx0IgotfQotCi1mdW5jIChwICpDYWxjdWxhdGVSZXN1bHQpIFRocmlmdE5hbWUoKSBzdHJpbmcgewotICByZXR1cm4gImNhbGN1bGF0ZV9yZXN1bHQiCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZVJlc3VsdCkgU3RyaW5nKCkgc3RyaW5nIHsKLSAgaWYgcCA9PSBuaWwgewotICAgIHJldHVybiAiPG5pbD4iCi0gIH0KLSAgcmV0dXJuIGZtdC5TcHJpbnRmKCJDYWxjdWxhdGVSZXN1bHQoJSt2KSIsICpwKQotfQotCi1mdW5jIChwICpDYWxjdWxhdGVSZXN1bHQpIENvbXBhcmVUbyhvdGhlciBpbnRlcmZhY2V7fSkgKGludCwgYm9vbCkgewotICBpZiBvdGhlciA9PSBuaWwgewotICAgIHJldHVybiAxLCB0cnVlCi0gIH0KLSAgZGF0YSwgb2sgOj0gb3RoZXIuKCpDYWxjdWxhdGVSZXN1bHQpCi0gIGlmICFvayB7Ci0gICAgcmV0dXJuIDAsIGZhbHNlCi0gIH0KLSAgaWYgcC5TdWNjZXNzICE9IGRhdGEuU3VjY2VzcyB7Ci0gICAgaWYgcC5TdWNjZXNzIDwgZGF0YS5TdWNjZXNzIHsKLSAgICAgIHJldHVybiAtMSwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gMSwgdHJ1ZQotICB9Ci0gIGlmIGNtcCwgb2sgOj0gcC5PdWNoLkNvbXBhcmVUbyhkYXRhLk91Y2gpOyAhb2sgfHwgY21wICE9IDAgewotICAgIHJldHVybiBjbXAsIG9rCi0gIH0KLSAgcmV0dXJuIDAsIHRydWUKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRlUmVzdWx0KSBBdHRyaWJ1dGVCeUZpZWxkSWQoaWQgaW50KSBpbnRlcmZhY2V7fSB7Ci0gIHN3aXRjaCBpZCB7Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIG5pbAotICBjYXNlIDA6Ci0gICAgcmV0dXJuIHAuU3VjY2VzcwotICBjYXNlIDE6Ci0gICAgcmV0dXJuIHAuT3VjaAotICB9Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRlUmVzdWx0KSBUU3RydWN0RmllbGRzKCkgVEZpZWxkQ29udGFpbmVyIHsKLSAgcmV0dXJuIE5ld1RGaWVsZENvbnRhaW5lcihbXVRGaWVsZHsKLSAgICBOZXdURmllbGQoInN1Y2Nlc3MiLCBJMzIsIDApLAotICAgIE5ld1RGaWVsZCgib3VjaCIsIFNUUlVDVCwgMSksCi0gIH0pCi19Ci0KLQotLyoqCi0gKiBTdHJ1Y3RzIGNhbiBhbHNvIGJlIGV4Y2VwdGlvbnMsIGlmIHRoZXkgYXJlIG5hc3R5LgotICogCi0gKiBBdHRyaWJ1dGVzOgotICogIC0gV2hhdAotICogIC0gV2h5Ci0gKi8KLXR5cGUgSW52YWxpZE9wZXJhdGlvbiBzdHJ1Y3QgewotICBUU3RydWN0Ci0gIF8gICAgaW50ZXJmYWNle30gIndoYXQiIC8vIG5pbCAjIDAKLSAgV2hhdCBpbnQzMiAgICAgICAid2hhdCIgLy8gMQotICBXaHkgIHN0cmluZyAgICAgICJ3aHkiICAvLyAyCi19Ci0KLWZ1bmMgTmV3SW52YWxpZE9wZXJhdGlvbigpICpJbnZhbGlkT3BlcmF0aW9uIHsKLSAgb3V0cHV0IDo9ICZJbnZhbGlkT3BlcmF0aW9uewotICAgIFRTdHJ1Y3Q6IE5ld1RTdHJ1Y3QoIkludmFsaWRPcGVyYXRpb24iLCBbXVRGaWVsZHsKLSAgICAgIE5ld1RGaWVsZCgid2hhdCIsIEkzMiwgMSksCi0gICAgICBOZXdURmllbGQoIndoeSIsIFNUUklORywgMiksCi0gICAgfSksCi0gIH0KLSAgewotICB9Ci0gIHJldHVybiBvdXRwdXQKLX0KLQotZnVuYyAocCAqSW52YWxpZE9wZXJhdGlvbikgUmVhZChpcHJvdCBUUHJvdG9jb2wpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIF8sIGVyciA9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkU3RydWN0KHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgZm9yIHsKLSAgICBmaWVsZE5hbWUsIGZpZWxkVHlwZUlkLCBmaWVsZElkLCBlcnIgOj0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKQotICAgIGlmIGZpZWxkSWQgPCAwIHsKLSAgICAgIGZpZWxkSWQgPSBpbnQxNihwLkZpZWxkSWRGcm9tRmllbGROYW1lKGZpZWxkTmFtZSkpCi0gICAgfSBlbHNlIGlmIGZpZWxkTmFtZSA9PSAiIiB7Ci0gICAgICBmaWVsZE5hbWUgPSBwLkZpZWxkTmFtZUZyb21GaWVsZElkKGludChmaWVsZElkKSkKLSAgICB9Ci0gICAgaWYgZmllbGRUeXBlSWQgPT0gR0VORVJJQyB7Ci0gICAgICBmaWVsZFR5cGVJZCA9IHAuRmllbGRGcm9tRmllbGRJZChpbnQoZmllbGRJZCkpLlR5cGVJZCgpCi0gICAgfQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICB9Ci0gICAgaWYgZmllbGRUeXBlSWQgPT0gU1RPUCB7Ci0gICAgICBicmVhawotICAgIH0KLSAgICBpZiBmaWVsZElkID09IDEgfHwgZmllbGROYW1lID09ICJ3aGF0IiB7Ci0gICAgICBpZiBmaWVsZFR5cGVJZCA9PSBJMzIgewotICAgICAgICBlcnIgPSBwLlJlYWRGaWVsZDEoaXByb3QpCi0gICAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiBmaWVsZFR5cGVJZCA9PSBWT0lEIHsKLSAgICAgICAgZXJyID0gaXByb3QuU2tpcChmaWVsZFR5cGVJZCkKLSAgICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gcC5SZWFkRmllbGQxKGlwcm90KQotICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIGZpZWxkSWQgPT0gMiB8fCBmaWVsZE5hbWUgPT0gIndoeSIgewotICAgICAgaWYgZmllbGRUeXBlSWQgPT0gU1RSSU5HIHsKLSAgICAgICAgZXJyID0gcC5SZWFkRmllbGQyKGlwcm90KQotICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgZmllbGRUeXBlSWQgPT0gVk9JRCB7Ci0gICAgICAgIGVyciA9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpCi0gICAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IHAuUmVhZEZpZWxkMihpcHJvdCkKLSAgICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBlcnIgPSBpcHJvdC5Ta2lwKGZpZWxkVHlwZUlkKQotICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICB9Ci0gICAgfQotICAgIGVyciA9IGlwcm90LlJlYWRGaWVsZEVuZCgpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgIH0KLSAgfQotICBlcnIgPSBpcHJvdC5SZWFkU3RydWN0RW5kKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRTdHJ1Y3QocC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKkludmFsaWRPcGVyYXRpb24pIFJlYWRGaWVsZDEoaXByb3QgVFByb3RvY29sKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICB2MTIsIGVycjEzIDo9IGlwcm90LlJlYWRJMzIoKQotICBpZiBlcnIxMyAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoMSwgIndoYXQiLCBwLlRocmlmdE5hbWUoKSwgZXJyMTMpCi0gIH0KLSAgcC5XaGF0ID0gdjEyCi0gIHJldHVybiBlcnIKLX0KLQotZnVuYyAocCAqSW52YWxpZE9wZXJhdGlvbikgUmVhZEZpZWxkV2hhdChpcHJvdCBUUHJvdG9jb2wpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLlJlYWRGaWVsZDEoaXByb3QpCi19Ci0KLWZ1bmMgKHAgKkludmFsaWRPcGVyYXRpb24pIFJlYWRGaWVsZDIoaXByb3QgVFByb3RvY29sKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICB2MTQsIGVycjE1IDo9IGlwcm90LlJlYWRTdHJpbmcoKQotICBpZiBlcnIxNSAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoMiwgIndoeSIsIHAuVGhyaWZ0TmFtZSgpLCBlcnIxNSkKLSAgfQotICBwLldoeSA9IHYxNAotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKkludmFsaWRPcGVyYXRpb24pIFJlYWRGaWVsZFdoeShpcHJvdCBUUHJvdG9jb2wpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLlJlYWRGaWVsZDIoaXByb3QpCi19Ci0KLWZ1bmMgKHAgKkludmFsaWRPcGVyYXRpb24pIFdyaXRlKG9wcm90IFRQcm90b2NvbCkgKGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgZXJyID0gb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbigiSW52YWxpZE9wZXJhdGlvbiIpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZVN0cnVjdChwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIGVyciA9IHAuV3JpdGVGaWVsZDEob3Byb3QpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBlcnIKLSAgfQotICBlcnIgPSBwLldyaXRlRmllbGQyKG9wcm90KQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gZXJyCi0gIH0KLSAgZXJyID0gb3Byb3QuV3JpdGVGaWVsZFN0b3AoKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVGaWVsZCgtMSwgIlNUT1AiLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIGVyciA9IG9wcm90LldyaXRlU3RydWN0RW5kKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlU3RydWN0KHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgcmV0dXJuIGVycgotfQotCi1mdW5jIChwICpJbnZhbGlkT3BlcmF0aW9uKSBXcml0ZUZpZWxkMShvcHJvdCBUUHJvdG9jb2wpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGVyciA9IG9wcm90LldyaXRlRmllbGRCZWdpbigid2hhdCIsIEkzMiwgMSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoMSwgIndoYXQiLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIGVyciA9IG9wcm90LldyaXRlSTMyKGludDMyKHAuV2hhdCkpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKDEsICJ3aGF0IiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICBlcnIgPSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoMSwgIndoYXQiLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIHJldHVybiBlcnIKLX0KLQotZnVuYyAocCAqSW52YWxpZE9wZXJhdGlvbikgV3JpdGVGaWVsZFdoYXQob3Byb3QgVFByb3RvY29sKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5Xcml0ZUZpZWxkMShvcHJvdCkKLX0KLQotZnVuYyAocCAqSW52YWxpZE9wZXJhdGlvbikgV3JpdGVGaWVsZDIob3Byb3QgVFByb3RvY29sKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBlcnIgPSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oIndoeSIsIFNUUklORywgMikKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoMiwgIndoeSIsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgZXJyID0gb3Byb3QuV3JpdGVTdHJpbmcoc3RyaW5nKHAuV2h5KSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoMiwgIndoeSIsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgZXJyID0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKDIsICJ3aHkiLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIHJldHVybiBlcnIKLX0KLQotZnVuYyAocCAqSW52YWxpZE9wZXJhdGlvbikgV3JpdGVGaWVsZFdoeShvcHJvdCBUUHJvdG9jb2wpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLldyaXRlRmllbGQyKG9wcm90KQotfQotCi1mdW5jIChwICpJbnZhbGlkT3BlcmF0aW9uKSBUU3RydWN0TmFtZSgpIHN0cmluZyB7Ci0gIHJldHVybiAiSW52YWxpZE9wZXJhdGlvbiIKLX0KLQotZnVuYyAocCAqSW52YWxpZE9wZXJhdGlvbikgVGhyaWZ0TmFtZSgpIHN0cmluZyB7Ci0gIHJldHVybiAiSW52YWxpZE9wZXJhdGlvbiIKLX0KLQotZnVuYyAocCAqSW52YWxpZE9wZXJhdGlvbikgU3RyaW5nKCkgc3RyaW5nIHsKLSAgaWYgcCA9PSBuaWwgewotICAgIHJldHVybiAiPG5pbD4iCi0gIH0KLSAgcmV0dXJuIGZtdC5TcHJpbnRmKCJJbnZhbGlkT3BlcmF0aW9uKCUrdikiLCAqcCkKLX0KLQotZnVuYyAocCAqSW52YWxpZE9wZXJhdGlvbikgQ29tcGFyZVRvKG90aGVyIGludGVyZmFjZXt9KSAoaW50LCBib29sKSB7Ci0gIGlmIG90aGVyID09IG5pbCB7Ci0gICAgcmV0dXJuIDEsIHRydWUKLSAgfQotICBkYXRhLCBvayA6PSBvdGhlci4oKkludmFsaWRPcGVyYXRpb24pCi0gIGlmICFvayB7Ci0gICAgcmV0dXJuIDAsIGZhbHNlCi0gIH0KLSAgaWYgcC5XaGF0ICE9IGRhdGEuV2hhdCB7Ci0gICAgaWYgcC5XaGF0IDwgZGF0YS5XaGF0IHsKLSAgICAgIHJldHVybiAtMSwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gMSwgdHJ1ZQotICB9Ci0gIGlmIHAuV2h5ICE9IGRhdGEuV2h5IHsKLSAgICBpZiBwLldoeSA8IGRhdGEuV2h5IHsKLSAgICAgIHJldHVybiAtMSwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gMSwgdHJ1ZQotICB9Ci0gIHJldHVybiAwLCB0cnVlCi19Ci0KLWZ1bmMgKHAgKkludmFsaWRPcGVyYXRpb24pIEF0dHJpYnV0ZUJ5RmllbGRJZChpZCBpbnQpIGludGVyZmFjZXt9IHsKLSAgc3dpdGNoIGlkIHsKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gbmlsCi0gIGNhc2UgMToKLSAgICByZXR1cm4gcC5XaGF0Ci0gIGNhc2UgMjoKLSAgICByZXR1cm4gcC5XaHkKLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKkludmFsaWRPcGVyYXRpb24pIFRTdHJ1Y3RGaWVsZHMoKSBURmllbGRDb250YWluZXIgewotICByZXR1cm4gTmV3VEZpZWxkQ29udGFpbmVyKFtdVEZpZWxkewotICAgIE5ld1RGaWVsZCgid2hhdCIsIEkzMiwgMSksCi0gICAgTmV3VEZpZWxkKCJ3aHkiLCBTVFJJTkcsIDIpLAotICB9KQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTI3MzhhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC90cmFuc3BvcnQuZ28KQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlcnJvcnMiCisJImlvIgorKQorCit2YXIgZXJyVHJhbnNwb3J0SW50ZXJydXB0ZWQgPSBlcnJvcnMuTmV3KCJUcmFuc3BvcnQgSW50ZXJydXB0ZWQiKQorCit0eXBlIEZsdXNoZXIgaW50ZXJmYWNlIHsKKwlGbHVzaCgpIChlcnIgZXJyb3IpCit9CisKK3R5cGUgQ29udGV4dEZsdXNoZXIgaW50ZXJmYWNlIHsKKwlGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKQorfQorCit0eXBlIFJlYWRTaXplUHJvdmlkZXIgaW50ZXJmYWNlIHsKKwlSZW1haW5pbmdCeXRlcygpIChudW1fYnl0ZXMgdWludDY0KQorfQorCisvLyBFbmNhcHN1bGF0ZXMgdGhlIEkvTyBsYXllcgordHlwZSBUVHJhbnNwb3J0IGludGVyZmFjZSB7CisJaW8uUmVhZFdyaXRlQ2xvc2VyCisJQ29udGV4dEZsdXNoZXIKKwlSZWFkU2l6ZVByb3ZpZGVyCisKKwkvLyBPcGVucyB0aGUgdHJhbnNwb3J0IGZvciBjb21tdW5pY2F0aW9uCisJT3BlbigpIGVycm9yCisKKwkvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuCisJSXNPcGVuKCkgYm9vbAorfQorCit0eXBlIHN0cmluZ1dyaXRlciBpbnRlcmZhY2UgeworCVdyaXRlU3RyaW5nKHMgc3RyaW5nKSAobiBpbnQsIGVyciBlcnJvcikKK30KKworLy8gVGhpcyBpcyAiZW5jaGFuY2VkIiB0cmFuc3BvcnQgd2l0aCBleHRyYSBjYXBhYmlsaXRpZXMuIFlvdSBuZWVkIHRvIHVzZSBvbmUgb2YgdGhlc2UKKy8vIHRvIGNvbnN0cnVjdCBwcm90b2NvbC4KKy8vIE5vdGFibHksIFRTb2NrZXQgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBhbmQgaXQgaXMgYWx3YXlzIGEgbWlzdGFrZSB0byB1c2UKKy8vIFRTb2NrZXQgZGlyZWN0bHkgaW4gcHJvdG9jb2wuCit0eXBlIFRSaWNoVHJhbnNwb3J0IGludGVyZmFjZSB7CisJaW8uUmVhZFdyaXRlcgorCWlvLkJ5dGVSZWFkZXIKKwlpby5CeXRlV3JpdGVyCisJc3RyaW5nV3JpdGVyCisJQ29udGV4dEZsdXNoZXIKKwlSZWFkU2l6ZVByb3ZpZGVyCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF9leGNlcHRpb24uZ28gYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF9leGNlcHRpb24uZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwNWI0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X2V4Y2VwdGlvbi5nbwpAQCAtMCwwICsxLDkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImVycm9ycyIKKwkiaW8iCispCisKK3R5cGUgdGltZW91dGFibGUgaW50ZXJmYWNlIHsKKwlUaW1lb3V0KCkgYm9vbAorfQorCisvLyBUaHJpZnQgVHJhbnNwb3J0IGV4Y2VwdGlvbgordHlwZSBUVHJhbnNwb3J0RXhjZXB0aW9uIGludGVyZmFjZSB7CisJVEV4Y2VwdGlvbgorCVR5cGVJZCgpIGludAorCUVycigpIGVycm9yCit9CisKK2NvbnN0ICgKKwlVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04gPSAwCisJTk9UX09QRU4gICAgICAgICAgICAgICAgICAgID0gMQorCUFMUkVBRFlfT1BFTiAgICAgICAgICAgICAgICA9IDIKKwlUSU1FRF9PVVQgICAgICAgICAgICAgICAgICAgPSAzCisJRU5EX09GX0ZJTEUgICAgICAgICAgICAgICAgID0gNAorKQorCit0eXBlIHRUcmFuc3BvcnRFeGNlcHRpb24gc3RydWN0IHsKKwl0eXBlSWQgaW50CisJZXJyICAgIGVycm9yCit9CisKK2Z1bmMgKHAgKnRUcmFuc3BvcnRFeGNlcHRpb24pIFR5cGVJZCgpIGludCB7CisJcmV0dXJuIHAudHlwZUlkCit9CisKK2Z1bmMgKHAgKnRUcmFuc3BvcnRFeGNlcHRpb24pIEVycm9yKCkgc3RyaW5nIHsKKwlyZXR1cm4gcC5lcnIuRXJyb3IoKQorfQorCitmdW5jIChwICp0VHJhbnNwb3J0RXhjZXB0aW9uKSBFcnIoKSBlcnJvciB7CisJcmV0dXJuIHAuZXJyCit9CisKK2Z1bmMgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0IGludCwgZSBzdHJpbmcpIFRUcmFuc3BvcnRFeGNlcHRpb24geworCXJldHVybiAmdFRyYW5zcG9ydEV4Y2VwdGlvbnt0eXBlSWQ6IHQsIGVycjogZXJyb3JzLk5ldyhlKX0KK30KKworZnVuYyBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGUgZXJyb3IpIFRUcmFuc3BvcnRFeGNlcHRpb24geworCWlmIGUgPT0gbmlsIHsKKwkJcmV0dXJuIG5pbAorCX0KKworCWlmIHQsIG9rIDo9IGUuKFRUcmFuc3BvcnRFeGNlcHRpb24pOyBvayB7CisJCXJldHVybiB0CisJfQorCisJc3dpdGNoIHYgOj0gZS4odHlwZSkgeworCWNhc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbjoKKwkJcmV0dXJuIHYKKwljYXNlIHRpbWVvdXRhYmxlOgorCQlpZiB2LlRpbWVvdXQoKSB7CisJCQlyZXR1cm4gJnRUcmFuc3BvcnRFeGNlcHRpb257dHlwZUlkOiBUSU1FRF9PVVQsIGVycjogZX0KKwkJfQorCX0KKworCWlmIGUgPT0gaW8uRU9GIHsKKwkJcmV0dXJuICZ0VHJhbnNwb3J0RXhjZXB0aW9ue3R5cGVJZDogRU5EX09GX0ZJTEUsIGVycjogZX0KKwl9CisKKwlyZXR1cm4gJnRUcmFuc3BvcnRFeGNlcHRpb257dHlwZUlkOiBVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04sIGVycjogZX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X2V4Y2VwdGlvbl90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfZXhjZXB0aW9uX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ0MzE0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X2V4Y2VwdGlvbl90ZXN0LmdvCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiZm10IgorCSJpbyIKKworCSJ0ZXN0aW5nIgorKQorCit0eXBlIHRpbWVvdXQgc3RydWN0eyB0aW1lZG91dCBib29sIH0KKworZnVuYyAodCAqdGltZW91dCkgVGltZW91dCgpIGJvb2wgeworCXJldHVybiB0LnRpbWVkb3V0Cit9CisKK2Z1bmMgKHQgKnRpbWVvdXQpIEVycm9yKCkgc3RyaW5nIHsKKwlyZXR1cm4gZm10LlNwcmludGYoIlRpbWVvdXQ6ICV2IiwgdC50aW1lZG91dCkKK30KKworZnVuYyBUZXN0VEV4Y2VwdGlvblRpbWVvdXQodCAqdGVzdGluZy5UKSB7CisJdGltZW91dCA6PSAmdGltZW91dHt0cnVlfQorCWV4Y2VwdGlvbiA6PSBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKHRpbWVvdXQpCisJaWYgdGltZW91dC5FcnJvcigpICE9IGV4Y2VwdGlvbi5FcnJvcigpIHsKKwkJdC5GYXRhbGYoIkVycm9yIGRpZCBub3QgbWF0Y2g6IGV4cGVjdGVkICVxLCBnb3QgJXEiLCB0aW1lb3V0LkVycm9yKCksIGV4Y2VwdGlvbi5FcnJvcigpKQorCX0KKworCWlmIGV4Y2VwdGlvbi5UeXBlSWQoKSAhPSBUSU1FRF9PVVQgeworCQl0LkZhdGFsZigiVHlwZUlkIHdhcyBub3QgVElNRURfT1VUOiBleHBlY3RlZCAldiwgZ290ICV2IiwgVElNRURfT1VULCBleGNlcHRpb24uVHlwZUlkKCkpCisJfQorfQorCitmdW5jIFRlc3RURXhjZXB0aW9uRU9GKHQgKnRlc3RpbmcuVCkgeworCWV4Y2VwdGlvbiA6PSBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGlvLkVPRikKKwlpZiBpby5FT0YuRXJyb3IoKSAhPSBleGNlcHRpb24uRXJyb3IoKSB7CisJCXQuRmF0YWxmKCJFcnJvciBkaWQgbm90IG1hdGNoOiBleHBlY3RlZCAlcSwgZ290ICVxIiwgaW8uRU9GLkVycm9yKCksIGV4Y2VwdGlvbi5FcnJvcigpKQorCX0KKworCWlmIGV4Y2VwdGlvbi5UeXBlSWQoKSAhPSBFTkRfT0ZfRklMRSB7CisJCXQuRmF0YWxmKCJUeXBlSWQgd2FzIG5vdCBFTkRfT0ZfRklMRTogZXhwZWN0ZWQgJXYsIGdvdCAldiIsIEVORF9PRl9GSUxFLCBleGNlcHRpb24uVHlwZUlkKCkpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfZmFjdG9yeS5nbyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X2ZhY3RvcnkuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgwNTgwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X2ZhY3RvcnkuZ28KQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCisvLyBGYWN0b3J5IGNsYXNzIHVzZWQgdG8gY3JlYXRlIHdyYXBwZWQgaW5zdGFuY2Ugb2YgVHJhbnNwb3J0cy4KKy8vIFRoaXMgaXMgdXNlZCBwcmltYXJpbHkgaW4gc2VydmVycywgd2hpY2ggZ2V0IFRyYW5zcG9ydHMgZnJvbQorLy8gYSBTZXJ2ZXJUcmFuc3BvcnQgYW5kIHRoZW4gbWF5IHdhbnQgdG8gbXV0YXRlIHRoZW0gKGkuZS4gY3JlYXRlCisvLyBhIEJ1ZmZlcmVkVHJhbnNwb3J0IGZyb20gdGhlIHVuZGVybHlpbmcgYmFzZSB0cmFuc3BvcnQpCit0eXBlIFRUcmFuc3BvcnRGYWN0b3J5IGludGVyZmFjZSB7CisJR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikKK30KKwordHlwZSB0VHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3R7fQorCisvLyBSZXR1cm4gYSB3cmFwcGVkIGluc3RhbmNlIG9mIHRoZSBiYXNlIFRyYW5zcG9ydC4KK2Z1bmMgKHAgKnRUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJcmV0dXJuIHRyYW5zLCBuaWwKK30KKworZnVuYyBOZXdUVHJhbnNwb3J0RmFjdG9yeSgpIFRUcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gJnRUcmFuc3BvcnRGYWN0b3J5e30KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMjc4MDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF90ZXN0LmdvCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImlvIgorCSJuZXQiCisJInN0cmNvbnYiCisJInRlc3RpbmciCispCisKK2NvbnN0IFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFID0gNDA5NgorCit2YXIgKAorCXRyYW5zcG9ydF9iZGF0YSAgW11ieXRlIC8vIHRlc3QgZGF0YSBmb3Igd3JpdGluZzsgc2FtZSBhcyBkYXRhCisJdHJhbnNwb3J0X2hlYWRlciBtYXBbc3RyaW5nXXN0cmluZworKQorCitmdW5jIGluaXQoKSB7CisJdHJhbnNwb3J0X2JkYXRhID0gbWFrZShbXWJ5dGUsIFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFKQorCWZvciBpIDo9IDA7IGkgPCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRTsgaSsrIHsKKwkJdHJhbnNwb3J0X2JkYXRhW2ldID0gYnl0ZSgoaSArICdhJykgJSAyNTUpCisJfQorCXRyYW5zcG9ydF9oZWFkZXIgPSBtYXBbc3RyaW5nXXN0cmluZ3sia2V5IjogIlVzZXItQWdlbnQiLAorCQkidmFsdWUiOiAiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgNi4yOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMzIuMC4xNjY3LjAgU2FmYXJpLzUzNy4zNiJ9Cit9CisKK2Z1bmMgVHJhbnNwb3J0VGVzdCh0ICp0ZXN0aW5nLlQsIHdyaXRlVHJhbnMgVFRyYW5zcG9ydCwgcmVhZFRyYW5zIFRUcmFuc3BvcnQpIHsKKwlidWYgOj0gbWFrZShbXWJ5dGUsIFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFKQorCWlmICF3cml0ZVRyYW5zLklzT3BlbigpIHsKKwkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBub3Qgb3BlbjogJXMiLCB3cml0ZVRyYW5zLCB3cml0ZVRyYW5zKQorCX0KKwlpZiAhcmVhZFRyYW5zLklzT3BlbigpIHsKKwkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBub3Qgb3BlbjogJXMiLCByZWFkVHJhbnMsIHJlYWRUcmFucykKKwl9CisJXywgZXJyIDo9IHdyaXRlVHJhbnMuV3JpdGUodHJhbnNwb3J0X2JkYXRhKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIGNhbm5vdCB3cml0ZSBiaW5hcnkgZGF0YSBvZiBsZW5ndGggJWQ6ICVzIiwgd3JpdGVUcmFucywgbGVuKHRyYW5zcG9ydF9iZGF0YSksIGVycikKKwl9CisJZXJyID0gd3JpdGVUcmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBjYW5ub3QgZmx1c2ggd3JpdGUgb2YgYmluYXJ5IGRhdGE6ICVzIiwgd3JpdGVUcmFucywgZXJyKQorCX0KKwluLCBlcnIgOj0gaW8uUmVhZEZ1bGwocmVhZFRyYW5zLCBidWYpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJUcmFuc3BvcnQgJVQgY2Fubm90IHJlYWQgYmluYXJ5IGRhdGEgb2YgbGVuZ3RoICVkOiAlcyIsIHJlYWRUcmFucywgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUsIGVycikKKwl9CisJaWYgbiAhPSBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSB7CisJCXQuRXJyb3JmKCJUcmFuc3BvcnQgJVQgcmVhZCBvbmx5ICVkIGluc3RlYWQgb2YgJWQgYnl0ZXMgb2YgYmluYXJ5IGRhdGEiLCByZWFkVHJhbnMsIG4sIFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFKQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBidWYgeworCQlpZiB2ICE9IHRyYW5zcG9ydF9iZGF0YVtrXSB7CisJCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIHJlYWQgJWQgaW5zdGVhZCBvZiAlZCBmb3IgaW5kZXggJWQgb2YgYmluYXJ5IGRhdGEgMiIsIHJlYWRUcmFucywgdiwgdHJhbnNwb3J0X2JkYXRhW2tdLCBrKQorCQl9CisJfQorCV8sIGVyciA9IHdyaXRlVHJhbnMuV3JpdGUodHJhbnNwb3J0X2JkYXRhKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIGNhbm5vdCB3cml0ZSBiaW5hcnkgZGF0YSAyIG9mIGxlbmd0aCAlZDogJXMiLCB3cml0ZVRyYW5zLCBsZW4odHJhbnNwb3J0X2JkYXRhKSwgZXJyKQorCX0KKwllcnIgPSB3cml0ZVRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIGNhbm5vdCBmbHVzaCB3cml0ZSBiaW5hcnkgZGF0YSAyOiAlcyIsIHdyaXRlVHJhbnMsIGVycikKKwl9CisJYnVmID0gbWFrZShbXWJ5dGUsIFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFKQorCXJlYWQgOj0gMQorCWZvciBuID0gMDsgbiA8IFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFICYmIHJlYWQgIT0gMDsgeworCQlyZWFkLCBlcnIgPSByZWFkVHJhbnMuUmVhZChidWZbbjpdKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3JmKCJUcmFuc3BvcnQgJVQgY2Fubm90IHJlYWQgYmluYXJ5IGRhdGEgMiBvZiB0b3RhbCBsZW5ndGggJWQgZnJvbSBvZmZzZXQgJWQ6ICVzIiwgcmVhZFRyYW5zLCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSwgbiwgZXJyKQorCQl9CisJCW4gKz0gcmVhZAorCX0KKwlpZiBuICE9IFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFIHsKKwkJdC5FcnJvcmYoIlRyYW5zcG9ydCAlVCByZWFkIG9ubHkgJWQgaW5zdGVhZCBvZiAlZCBieXRlcyBvZiBiaW5hcnkgZGF0YSAyIiwgcmVhZFRyYW5zLCBuLCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSkKKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgYnVmIHsKKwkJaWYgdiAhPSB0cmFuc3BvcnRfYmRhdGFba10geworCQkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCByZWFkICVkIGluc3RlYWQgb2YgJWQgZm9yIGluZGV4ICVkIG9mIGJpbmFyeSBkYXRhIDIiLCByZWFkVHJhbnMsIHYsIHRyYW5zcG9ydF9iZGF0YVtrXSwgaykKKwkJfQorCX0KK30KKworZnVuYyBUcmFuc3BvcnRIZWFkZXJUZXN0KHQgKnRlc3RpbmcuVCwgd3JpdGVUcmFucyBUVHJhbnNwb3J0LCByZWFkVHJhbnMgVFRyYW5zcG9ydCkgeworCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUpCisJaWYgIXdyaXRlVHJhbnMuSXNPcGVuKCkgeworCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIG5vdCBvcGVuOiAlcyIsIHdyaXRlVHJhbnMsIHdyaXRlVHJhbnMpCisJfQorCWlmICFyZWFkVHJhbnMuSXNPcGVuKCkgeworCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIG5vdCBvcGVuOiAlcyIsIHJlYWRUcmFucywgcmVhZFRyYW5zKQorCX0KKwkvLyBOZWVkIHRvIGFzc2VydCB0eXBlIG9mIFRUcmFuc3BvcnQgdG8gVEh0dHBDbGllbnQgdG8gZXhwb3NlIHRoZSBTZXR0ZXIKKwlodHRwV1Bvc3RUcmFucyA6PSB3cml0ZVRyYW5zLigqVEh0dHBDbGllbnQpCisJaHR0cFdQb3N0VHJhbnMuU2V0SGVhZGVyKHRyYW5zcG9ydF9oZWFkZXJbImtleSJdLCB0cmFuc3BvcnRfaGVhZGVyWyJ2YWx1ZSJdKQorCisJXywgZXJyIDo9IHdyaXRlVHJhbnMuV3JpdGUodHJhbnNwb3J0X2JkYXRhKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIGNhbm5vdCB3cml0ZSBiaW5hcnkgZGF0YSBvZiBsZW5ndGggJWQ6ICVzIiwgd3JpdGVUcmFucywgbGVuKHRyYW5zcG9ydF9iZGF0YSksIGVycikKKwl9CisJZXJyID0gd3JpdGVUcmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBjYW5ub3QgZmx1c2ggd3JpdGUgb2YgYmluYXJ5IGRhdGE6ICVzIiwgd3JpdGVUcmFucywgZXJyKQorCX0KKwkvLyBOZWVkIHRvIGFzc2VydCB0eXBlIG9mIFRUcmFuc3BvcnQgdG8gVEh0dHBDbGllbnQgdG8gZXhwb3NlIHRoZSBHZXR0ZXIKKwlodHRwUlBvc3RUcmFucyA6PSByZWFkVHJhbnMuKCpUSHR0cENsaWVudCkKKwlyZWFkSGVhZGVyIDo9IGh0dHBSUG9zdFRyYW5zLkdldEhlYWRlcih0cmFuc3BvcnRfaGVhZGVyWyJrZXkiXSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlRyYW5zcG9ydCAlVCBjYW5ub3QgcmVhZCBIVFRQIEhlYWRlciBWYWx1ZSIsIGh0dHBSUG9zdFRyYW5zKQorCX0KKworCWlmIHRyYW5zcG9ydF9oZWFkZXJbInZhbHVlIl0gIT0gcmVhZEhlYWRlciB7CisJCXQuRXJyb3JmKCJFeHBlY3RlZCBIVFRQIEhlYWRlciBWYWx1ZSAlcywgZ290ICVzIiwgdHJhbnNwb3J0X2hlYWRlclsidmFsdWUiXSwgcmVhZEhlYWRlcikKKwl9CisJbiwgZXJyIDo9IGlvLlJlYWRGdWxsKHJlYWRUcmFucywgYnVmKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVHJhbnNwb3J0ICVUIGNhbm5vdCByZWFkIGJpbmFyeSBkYXRhIG9mIGxlbmd0aCAlZDogJXMiLCByZWFkVHJhbnMsIFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFLCBlcnIpCisJfQorCWlmIG4gIT0gVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUgeworCQl0LkVycm9yZigiVHJhbnNwb3J0ICVUIHJlYWQgb25seSAlZCBpbnN0ZWFkIG9mICVkIGJ5dGVzIG9mIGJpbmFyeSBkYXRhIiwgcmVhZFRyYW5zLCBuLCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSkKKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgYnVmIHsKKwkJaWYgdiAhPSB0cmFuc3BvcnRfYmRhdGFba10geworCQkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCByZWFkICVkIGluc3RlYWQgb2YgJWQgZm9yIGluZGV4ICVkIG9mIGJpbmFyeSBkYXRhIDIiLCByZWFkVHJhbnMsIHYsIHRyYW5zcG9ydF9iZGF0YVtrXSwgaykKKwkJfQorCX0KK30KKworZnVuYyBDbG9zZVRyYW5zcG9ydHModCAqdGVzdGluZy5ULCByZWFkVHJhbnMgVFRyYW5zcG9ydCwgd3JpdGVUcmFucyBUVHJhbnNwb3J0KSB7CisJZXJyIDo9IHJlYWRUcmFucy5DbG9zZSgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJUcmFuc3BvcnQgJVQgY2Fubm90IGNsb3NlIHJlYWQgdHJhbnNwb3J0OiAlcyIsIHJlYWRUcmFucywgZXJyKQorCX0KKwlpZiB3cml0ZVRyYW5zICE9IHJlYWRUcmFucyB7CisJCWVyciA9IHdyaXRlVHJhbnMuQ2xvc2UoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3JmKCJUcmFuc3BvcnQgJVQgY2Fubm90IGNsb3NlIHdyaXRlIHRyYW5zcG9ydDogJXMiLCB3cml0ZVRyYW5zLCBlcnIpCisJCX0KKwl9Cit9CisKK2Z1bmMgRmluZEF2YWlsYWJsZVRDUFNlcnZlclBvcnQoc3RhcnRQb3J0IGludCkgKG5ldC5BZGRyLCBlcnJvcikgeworCWZvciBpIDo9IHN0YXJ0UG9ydDsgaSA8IDY1NTM1OyBpKysgeworCQlzIDo9ICIxMjcuMC4wLjE6IiArIHN0cmNvbnYuSXRvYShpKQorCQlsLCBlcnIgOj0gbmV0Lkxpc3RlbigidGNwIiwgcykKKwkJaWYgZXJyID09IG5pbCB7CisJCQlsLkNsb3NlKCkKKwkJCXJldHVybiBuZXQuUmVzb2x2ZVRDUEFkZHIoInRjcCIsIHMpCisJCX0KKwl9CisJcmV0dXJuIG5pbCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04sICJDb3VsZCBub3QgZmluZCBhdmFpbGFibGUgc2VydmVyIHBvcnQiKQorfQorCitmdW5jIHZhbHVlSW5TbGljZSh2YWx1ZSBzdHJpbmcsIHNsaWNlIFtdc3RyaW5nKSBib29sIHsKKwlmb3IgXywgdiA6PSByYW5nZSBzbGljZSB7CisJCWlmIHZhbHVlID09IHYgeworCQkJcmV0dXJuIHRydWUKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2UKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHNlcnZlci5nbyBiL2xpYi9nby90aHJpZnQvdHNlcnZlci5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJjMzE2Ny4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3RzZXJ2ZXIuZ28KKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLWltcG9ydCAoCi0gICJvcyIKLSkKLQotdHlwZSBUU2VydmVyIGludGVyZmFjZSB7Ci0gIC8qKgotICAgKiBDb3JlIHByb2Nlc3NvcgotICAgKi8KLSAgUHJvY2Vzc29yRmFjdG9yeSgpIFRQcm9jZXNzb3JGYWN0b3J5Ci0gIC8qKgotICAgKiBTZXJ2ZXIgdHJhbnNwb3J0Ci0gICAqLwotICBTZXJ2ZXJUcmFuc3BvcnQoKSBUU2VydmVyVHJhbnNwb3J0Ci0gIC8qKgotICAgKiBJbnB1dCBUcmFuc3BvcnQgRmFjdG9yeQotICAgKi8KLSAgSW5wdXRUcmFuc3BvcnRGYWN0b3J5KCkgVFRyYW5zcG9ydEZhY3RvcnkKLSAgLyoqCi0gICAqIE91dHB1dCBUcmFuc3BvcnQgRmFjdG9yeQotICAgKi8KLSAgT3V0cHV0VHJhbnNwb3J0RmFjdG9yeSgpIFRUcmFuc3BvcnRGYWN0b3J5Ci0gIC8qKgotICAgKiBJbnB1dCBQcm90b2NvbCBGYWN0b3J5Ci0gICAqLwotICBJbnB1dFByb3RvY29sRmFjdG9yeSgpIFRQcm90b2NvbEZhY3RvcnkKLSAgLyoqCi0gICAqIE91dHB1dCBQcm90b2NvbCBGYWN0b3J5Ci0gICAqLwotICBPdXRwdXRQcm90b2NvbEZhY3RvcnkoKSBUUHJvdG9jb2xGYWN0b3J5Ci0KLSAgLyoqCi0gICAqIFRoZSBydW4gbWV0aG9kIGZpcmVzIHVwIHRoZSBzZXJ2ZXIgYW5kIGdldHMgdGhpbmdzIGdvaW5nLgotICAgKi8KLSAgU2VydmUoKSBvcy5FcnJvcgotICAvKioKLSAgICogU3RvcCB0aGUgc2VydmVyLiBUaGlzIGlzIG9wdGlvbmFsIG9uIGEgcGVyLWltcGxlbWVudGF0aW9uIGJhc2lzLiBOb3QKLSAgICogYWxsIHNlcnZlcnMgYXJlIHJlcXVpcmVkIHRvIGJlIGNsZWFubHkgc3RvcHBhYmxlLgotICAgKi8KLSAgU3RvcCgpIG9zLkVycm9yCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RzZXJ2ZXJfc29ja2V0LmdvIGIvbGliL2dvL3RocmlmdC90c2VydmVyX3NvY2tldC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMzZTc0OC4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3RzZXJ2ZXJfc29ja2V0LmdvCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnQKLQotaW1wb3J0ICgKLSAgIm5ldCIKLSAgIm9zIgotKQotCi0KLXR5cGUgVFNlcnZlclNvY2tldCBzdHJ1Y3QgewotICAvKioKLSAgICogVW5kZXJseWluZyBzb2NrZXQgY29uZWN0aW9uIG9iamVjdAotICAgKi8KLSAgY29ubiBuZXQuQ29ubgotICAvKioKLSAgICogVW5kZXJseWluZyBzb2NrZXQgY29uZWN0aW9uIG9iamVjdAotICAgKi8KLSAgbGlzdGVuZXIgbmV0Lkxpc3RlbmVyCi0KLSAgLyoqCi0gICAqIEFkZHJlc3MgdG8gbGlzdGVuIG9uCi0gICAqLwotICBhZGRyIG5ldC5BZGRyCi0KLSAgLyoqCi0gICAqIENsaWVudCB0aW1lb3V0IGluIG5hbm9zZWNvbmRzCi0gICAqLwotICBuc2VjQ2xpZW50VGltZW91dCBpbnQ2NAotfQotCi10eXBlIFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdCB7Ci0gIGFkZHIgICAgICAgICAgICAgIG5ldC5BZGRyCi0gIG5zZWNDbGllbnRUaW1lb3V0IGludDY0Ci19Ci0KLWZ1bmMgKHAgKlRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgVFRyYW5zcG9ydCB7Ci0gIGlmIHRyYW5zICE9IG5pbCB7Ci0gICAgdCwgb2sgOj0gdHJhbnMuKCpUU2VydmVyU29ja2V0KQotICAgIGlmIG9rICYmIHQuYWRkciAhPSBuaWwgewotICAgICAgcywgXyA6PSBOZXdUU2VydmVyU29ja2V0QWRkclRpbWVvdXQodC5hZGRyLCB0Lm5zZWNDbGllbnRUaW1lb3V0KQotICAgICAgcmV0dXJuIHMKLSAgICB9Ci0gIH0KLSAgcywgXyA6PSBOZXdUU2VydmVyU29ja2V0QWRkclRpbWVvdXQocC5hZGRyLCBwLm5zZWNDbGllbnRUaW1lb3V0KQotICByZXR1cm4gcwotfQotCi1mdW5jIE5ld1RTZXJ2ZXJTb2NrZXRUcmFuc3BvcnRGYWN0b3J5KGFkZHIgbmV0LkFkZHIsIG5zZWNDbGllbnRUaW1lb3V0IGludDY0KSAqVFNlcnZlclNvY2tldFRyYW5zcG9ydEZhY3RvcnkgewotICByZXR1cm4gJlRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnRGYWN0b3J5e2FkZHI6IGFkZHIsIG5zZWNDbGllbnRUaW1lb3V0OiBuc2VjQ2xpZW50VGltZW91dH0KLX0KLQotZnVuYyBOZXdUU2VydmVyU29ja2V0Q29ubihjb25uIG5ldC5Db25uKSAqVFNlcnZlclNvY2tldCB7Ci0gIHJldHVybiBOZXdUU2VydmVyU29ja2V0Q29ublRpbWVvdXQoY29ubiwgMCkKLX0KLQotZnVuYyBOZXdUU2VydmVyU29ja2V0Q29ublRpbWVvdXQoY29ubiBuZXQuQ29ubiwgbnNlY0NsaWVudFRpbWVvdXQgaW50NjQpICpUU2VydmVyU29ja2V0IHsKLSAgdiA6PSAmVFNlcnZlclNvY2tldHtjb25uOiBjb25uLCBhZGRyOiBjb25uLkxvY2FsQWRkcigpLCBuc2VjQ2xpZW50VGltZW91dDogbnNlY0NsaWVudFRpbWVvdXR9Ci0gIGNvbm4uU2V0VGltZW91dChuc2VjQ2xpZW50VGltZW91dCkKLSAgcmV0dXJuIHYKLX0KLQotZnVuYyBOZXdUU2VydmVyU29ja2V0QWRkcihhZGRyIG5ldC5BZGRyKSAoKlRTZXJ2ZXJTb2NrZXQsIFRUcmFuc3BvcnRFeGNlcHRpb24pIHsKLSAgcmV0dXJuIE5ld1RTZXJ2ZXJTb2NrZXRBZGRyVGltZW91dChhZGRyLCAwKQotfQotCi1mdW5jIE5ld1RTZXJ2ZXJTb2NrZXRBZGRyVGltZW91dChhZGRyIG5ldC5BZGRyLCBuc2VjQ2xpZW50VGltZW91dCBpbnQ2NCkgKCpUU2VydmVyU29ja2V0LCBUVHJhbnNwb3J0RXhjZXB0aW9uKSB7Ci0gIHMgOj0gJlRTZXJ2ZXJTb2NrZXR7YWRkcjogYWRkciwgbnNlY0NsaWVudFRpbWVvdXQ6IG5zZWNDbGllbnRUaW1lb3V0fQotICByZXR1cm4gcywgbmlsCi19Ci0KLWZ1bmMgKHAgKlRTZXJ2ZXJTb2NrZXQpIExpc3RlbigpIChlcnIgb3MuRXJyb3IpIHsKLSAgaWYgcC5saXN0ZW5lciA9PSBuaWwgewotICAgIGlmIHAubGlzdGVuZXIsIGVyciA9IG5ldC5MaXN0ZW4oInRjcCIsIHAuYWRkci5TdHJpbmcoKSk7IGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIGVycgotICAgIH0KLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRTZXJ2ZXJTb2NrZXQpIEFjY2VwdCgpIChUVHJhbnNwb3J0LCBvcy5FcnJvcikgewotICBpZiBwLmxpc3RlbmVyID09IG5pbCB7Ci0gICAgaWYgZXJyIDo9IHAuTGlzdGVuKCk7IGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIG5pbCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLSAgICB9Ci0gICAgaWYgcC5saXN0ZW5lciA9PSBuaWwgewotICAgICAgcmV0dXJuIG5pbCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldCIpCi0gICAgfQotICB9Ci0gIGNvbm4sIGVyciA6PSBwLmxpc3RlbmVyLkFjY2VwdCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBuaWwsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi0gIH0KLSAgY29ubi5TZXRUaW1lb3V0KHAubnNlY0NsaWVudFRpbWVvdXQpCi0gIHJldHVybiBOZXdUU29ja2V0Q29ubihjb25uKQotfQotCi0vKioKLSAqIENoZWNrcyB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkLgotICovCi1mdW5jIChwICpUU2VydmVyU29ja2V0KSBJc09wZW4oKSBib29sIHsKLSAgcmV0dXJuIHAubGlzdGVuZXIgIT0gbmlsCi19Ci0KLS8qKgotICogQ29ubmVjdHMgdGhlIHNvY2tldCwgY3JlYXRpbmcgYSBuZXcgc29ja2V0IG9iamVjdCBpZiBuZWNlc3NhcnkuCi0gKi8KLWZ1bmMgKHAgKlRTZXJ2ZXJTb2NrZXQpIE9wZW4oKSBvcy5FcnJvciB7Ci0gIGlmICFwLklzT3BlbigpIHsKLSAgICBsLCBlcnIgOj0gbmV0Lkxpc3RlbihwLmFkZHIuTmV0d29yaygpLCBwLmFkZHIuU3RyaW5nKCkpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4gZXJyCi0gICAgfQotICAgIHAubGlzdGVuZXIgPSBsCi0gICAgcmV0dXJuIG5pbAotICB9Ci0gIHJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKEFMUkVBRFlfT1BFTiwgIlNlcnZlciBzb2NrZXQgYWxyZWFkeSBvcGVuIikKLX0KLQotLyoqCi0gKiBQZXJmb3JtIGEgbm9uYmxvY2tpbmcgcmVhZCBpbnRvIGJ1ZmZlci4KLSAqLwotZnVuYyAocCAqVFNlcnZlclNvY2tldCkgUmVhZChidWYgW11ieXRlKSAoaW50LCBvcy5FcnJvcikgewotICByZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04sICJUU2VydmVyU29ja2V0LlJlYWQoW11ieXRlKSBpcyBub3QgaW1wbGVtZW50ZWQiKQotfQotCi1mdW5jIChwICpUU2VydmVyU29ja2V0KSBSZWFkQWxsKGJ1ZiBbXWJ5dGUpIChpbnQsIG9zLkVycm9yKSB7Ci0gIHJldHVybiBSZWFkQWxsVHJhbnNwb3J0KHAsIGJ1ZikKLX0KLQotLyoqCi0gKiBQZXJmb3JtIGEgbm9uYmxvY2tpbmcgd3JpdGUgb2YgdGhlIGRhdGEgaW4gYnVmZmVyOwotICovCi1mdW5jIChwICpUU2VydmVyU29ja2V0KSBXcml0ZShidWYgW11ieXRlKSAoaW50LCBvcy5FcnJvcikgewotICByZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04sICJUU2VydmVyU29ja2V0LldyaXRlKFtdYnl0ZSkgaXMgbm90IGltcGxlbWVudGVkIikKLX0KLQotLyoqCi0gKiBGbHVzaGVzIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gaWYgbm90IG51bGwuCi0gKi8KLWZ1bmMgKHAgKlRTZXJ2ZXJTb2NrZXQpIEZsdXNoKCkgb3MuRXJyb3IgewotICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04sICJUU2VydmVyU29ja2V0LkZsdXNoKCkgaXMgbm90IGltcGxlbWVudGVkIikKLX0KLQotZnVuYyAocCAqVFNlcnZlclNvY2tldCkgQWRkcigpIG5ldC5BZGRyIHsKLSAgcmV0dXJuIHAuYWRkcgotfQotCi1mdW5jIChwICpUU2VydmVyU29ja2V0KSBQZWVrKCkgYm9vbCB7Ci0gIHJldHVybiBwLklzT3BlbigpCi19Ci0KLS8qKgotICogQ2xvc2VzIHRoZSBzb2NrZXQuCi0gKi8KLWZ1bmMgKHAgKlRTZXJ2ZXJTb2NrZXQpIENsb3NlKCkgKGVyciBvcy5FcnJvcikgewotICBpZiBwLklzT3BlbigpIHsKLSAgICBlcnIgOj0gcC5saXN0ZW5lci5DbG9zZSgpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLSAgICB9Ci0gICAgcC5saXN0ZW5lciA9IG5pbAotICB9Ci0gIGlmIHAuY29ubiAhPSBuaWwgewotICAgIGVyciA6PSBwLmNvbm4uQ2xvc2UoKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi0gICAgfQotICAgIHAuY29ubiA9IG5pbAotICB9Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVFNlcnZlclNvY2tldCkgSW50ZXJydXB0KCkgb3MuRXJyb3IgewotICAvLyBUT0RPKHBvbWFjaykgZml4IEludGVycnVwdCBhcyBpdCBpcyBwcm9iYWJseSBub3QgcmlnaHQKLSAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tT3NFcnJvcihwLkNsb3NlKCkpCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RzZXJ2ZXJfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvdHNlcnZlcl90ZXN0LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2JlODc5Li4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdHNlcnZlcl90ZXN0LmdvCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdF90ZXN0Ci0KLWltcG9ydCAoCi0gICJ0ZXN0aW5nIgotKQotCi1mdW5jIFRlc3ROb3RoaW5nKHQgKnRlc3RpbmcuVCkgewotCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RzZXJ2ZXJfdHJhbnNwb3J0LmdvIGIvbGliL2dvL3RocmlmdC90c2VydmVyX3RyYW5zcG9ydC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYzYTQ2Mi4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3RzZXJ2ZXJfdHJhbnNwb3J0LmdvCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi1pbXBvcnQgIm9zIgotCi0vKioKLSAqIFNlcnZlciB0cmFuc3BvcnQuIE9iamVjdCB3aGljaCBwcm92aWRlcyBjbGllbnQgdHJhbnNwb3J0cy4KLSAqCi0gKi8KLXR5cGUgVFNlcnZlclRyYW5zcG9ydCBpbnRlcmZhY2UgewotICBMaXN0ZW4oKSBvcy5FcnJvcgotICBBY2NlcHQoKSAoVFRyYW5zcG9ydCwgb3MuRXJyb3IpCi0gIENsb3NlKCkgb3MuRXJyb3IKLQotICAvKioKLSAgICogT3B0aW9uYWwgbWV0aG9kIGltcGxlbWVudGF0aW9uLiBUaGlzIHNpZ25hbHMgdG8gdGhlIHNlcnZlciB0cmFuc3BvcnQKLSAgICogdGhhdCBpdCBzaG91bGQgYnJlYWsgb3V0IG9mIGFueSBhY2NlcHQoKSBvciBsaXN0ZW4oKSB0aGF0IGl0IGlzIGN1cnJlbnRseQotICAgKiBibG9ja2VkIG9uLiBUaGlzIG1ldGhvZCwgaWYgaW1wbGVtZW50ZWQsIE1VU1QgYmUgdGhyZWFkIHNhZmUsIGFzIGl0IG1heQotICAgKiBiZSBjYWxsZWQgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQgY29udGV4dCB0aGFuIHRoZSBvdGhlciBUU2VydmVyVHJhbnNwb3J0Ci0gICAqIG1ldGhvZHMuCi0gICAqLwotICBJbnRlcnJ1cHQoKSBvcy5FcnJvcgotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90c2V0LmdvIGIvbGliL2dvL3RocmlmdC90c2V0LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODY4MTA5Li4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdHNldC5nbworKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLWltcG9ydCAoCi0gICJjb250YWluZXIvbGlzdCIKLSkKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdGhhdCBlbmNhcHN1bGF0ZXMgc2V0IG1ldGFkYXRhLgotICoKLSAqLwotdHlwZSBUU2V0IGludGVyZmFjZSB7Ci0gIFRDb250YWluZXIKLSAgRWxlbVR5cGUoKSBUVHlwZQotICBBZGQoZGF0YSBpbnRlcmZhY2V7fSkKLSAgUmVtb3ZlKGRhdGEgaW50ZXJmYWNle30pCi0gIExlc3Mob3RoZXIgaW50ZXJmYWNle30pIGJvb2wKLSAgRnJvbnQoKSAqbGlzdC5FbGVtZW50Ci0gIEJhY2soKSAqbGlzdC5FbGVtZW50Ci0gIFZhbHVlcygpIFtdaW50ZXJmYWNle30KLX0KLQotdHlwZSB0U2V0IHN0cnVjdCB7Ci0gIGVsZW1UeXBlIFRUeXBlCi0gIHNpemUgICAgIGludAotICBsICAgICAgICAqbGlzdC5MaXN0Ci19Ci0KLWZ1bmMgTmV3VFNldCh0IFRUeXBlLCBzIGludCkgVFNldCB7Ci0gIHJldHVybiAmdFNldHtlbGVtVHlwZTogdCwgc2l6ZTogcywgbDogbGlzdC5OZXcoKX0KLX0KLQotZnVuYyBOZXdUU2V0RGVmYXVsdCgpIFRTZXQgewotICByZXR1cm4gTmV3VFNldChTVE9QLCAwKQotfQotCi1mdW5jIChwICp0U2V0KSBFbGVtVHlwZSgpIFRUeXBlIHsKLSAgcmV0dXJuIHAuZWxlbVR5cGUKLX0KLQotZnVuYyAocCAqdFNldCkgRnJvbnQoKSAqbGlzdC5FbGVtZW50IHsKLSAgcmV0dXJuIHAubC5Gcm9udCgpCi19Ci0KLWZ1bmMgKHAgKnRTZXQpIEJhY2soKSAqbGlzdC5FbGVtZW50IHsKLSAgcmV0dXJuIHAubC5CYWNrKCkKLX0KLQotZnVuYyAocCAqdFNldCkgTGVuKCkgaW50IHsKLSAgaWYgcC5sLkxlbigpICE9IDAgewotICAgIHJldHVybiBwLmwuTGVuKCkKLSAgfQotICByZXR1cm4gcC5zaXplCi19Ci0KLWZ1bmMgKHAgKnRTZXQpIENvbnRhaW5zKGRhdGEgaW50ZXJmYWNle30pIGJvb2wgewotICByZXR1cm4gcC5maW5kKGRhdGEpICE9IG5pbAotfQotCi1mdW5jIChwICp0U2V0KSBBZGQob3RoZXIgaW50ZXJmYWNle30pIHsKLSAgaWYgZGF0YSwgb2sgOj0gcC5lbGVtVHlwZS5Db2VyY2VEYXRhKG90aGVyKTsgb2sgewotICAgIGZvciBlbGVtIDo9IHAubC5Gcm9udCgpOyBlbGVtICE9IG5pbDsgZWxlbSA9IGVsZW0uTmV4dCgpIHsKLSAgICAgIGlmIGNtcCwgb2sgOj0gcC5lbGVtVHlwZS5Db21wYXJlKGRhdGEsIGVsZW0uVmFsdWUpOyBvayAmJiBjbXAgPj0gMCB7Ci0gICAgICAgIGlmIGNtcCA+IDAgewotICAgICAgICAgIHAubC5JbnNlcnRCZWZvcmUoZGF0YSwgZWxlbSkKLSAgICAgICAgfQotICAgICAgICByZXR1cm4KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotZnVuYyAocCAqdFNldCkgUmVtb3ZlKGRhdGEgaW50ZXJmYWNle30pIHsKLSAgZWxlbSA6PSBwLmZpbmQoZGF0YSkKLSAgaWYgZWxlbSAhPSBuaWwgewotICAgIHAubC5SZW1vdmUoZWxlbSkKLSAgfQotfQotCi1mdW5jIChwICp0U2V0KSBMZXNzKG90aGVyIGludGVyZmFjZXt9KSBib29sIHsKLSAgY21wLCBvayA6PSBwLkNvbXBhcmVUbyhvdGhlcikKLSAgcmV0dXJuIG9rICYmIGNtcCA+IDAKLX0KLQotZnVuYyAocCAqdFNldCkgRXF1YWxzKG90aGVyIGludGVyZmFjZXt9KSBib29sIHsKLSAgYywgY29rIDo9IHAuQ29tcGFyZVRvKG90aGVyKQotICByZXR1cm4gY29rICYmIGMgPT0gMAotfQotCi1mdW5jIChwICp0U2V0KSBDb21wYXJlVG8ob3RoZXIgaW50ZXJmYWNle30pIChpbnQsIGJvb2wpIHsKLSAgcmV0dXJuIFRUeXBlKFNFVCkuQ29tcGFyZShwLCBvdGhlcikKLX0KLQotZnVuYyAocCAqdFNldCkgZmluZChkYXRhIGludGVyZmFjZXt9KSAqbGlzdC5FbGVtZW50IHsKLSAgaWYgZGF0YSA9PSBuaWwgewotICAgIGZvciBlbGVtIDo9IHAubC5Gcm9udCgpOyBlbGVtICE9IG5pbDsgZWxlbSA9IGVsZW0uTmV4dCgpIHsKLSAgICAgIGlmIGVsZW0uVmFsdWUgPT0gbmlsIHsKLSAgICAgICAgcmV0dXJuIGVsZW0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5pbAotICB9Ci0gIGRhdGEsIG9rIDo9IHAuZWxlbVR5cGUuQ29lcmNlRGF0YShkYXRhKQotICBpZiBkYXRhID09IG5pbCB8fCAhb2sgewotICAgIHJldHVybiBuaWwKLSAgfQotICBpZiBwLmVsZW1UeXBlLklzQmFzZVR5cGUoKSB8fCBwLmVsZW1UeXBlLklzRW51bSgpIHsKLSAgICBmb3IgZWxlbSA6PSBwLmwuRnJvbnQoKTsgZWxlbSAhPSBuaWw7IGVsZW0gPSBlbGVtLk5leHQoKSB7Ci0gICAgICBpZiBkYXRhID09IGVsZW0uVmFsdWUgewotICAgICAgICByZXR1cm4gZWxlbQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmlsCi0gIH0KLSAgaWYgY21wLCBvayA6PSBkYXRhLihFcXVhbHNPdGhlckludGVyZmFjZSk7IG9rIHsKLSAgICBmb3IgZWxlbSA6PSBwLmwuRnJvbnQoKTsgZWxlbSAhPSBuaWw7IGVsZW0gPSBlbGVtLk5leHQoKSB7Ci0gICAgICBpZiBjbXAuRXF1YWxzKGVsZW0uVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGVsZW0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5pbAotICB9Ci0gIHN3aXRjaCBwLmVsZW1UeXBlIHsKLSAgY2FzZSBNQVA6Ci0gICAgaWYgY21wLCBvayA6PSBkYXRhLihFcXVhbHNNYXApOyBvayB7Ci0gICAgICBmb3IgZWxlbSA6PSBwLmwuRnJvbnQoKTsgZWxlbSAhPSBuaWw7IGVsZW0gPSBlbGVtLk5leHQoKSB7Ci0gICAgICAgIHYgOj0gZWxlbS5WYWx1ZQotICAgICAgICBpZiB2ID09IG5pbCB7Ci0gICAgICAgICAgY29udGludWUKLSAgICAgICAgfQotICAgICAgICBpZiBjbXAuRXF1YWxzKHYuKFRNYXApKSB7Ci0gICAgICAgICAgcmV0dXJuIGVsZW0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG5pbAotICAgIH0KLSAgY2FzZSBTRVQ6Ci0gICAgaWYgY21wLCBvayA6PSBkYXRhLihFcXVhbHNTZXQpOyBvayB7Ci0gICAgICBmb3IgZWxlbSA6PSBwLmwuRnJvbnQoKTsgZWxlbSAhPSBuaWw7IGVsZW0gPSBlbGVtLk5leHQoKSB7Ci0gICAgICAgIHYgOj0gZWxlbS5WYWx1ZQotICAgICAgICBpZiB2ID09IG5pbCB7Ci0gICAgICAgICAgY29udGludWUKLSAgICAgICAgfQotICAgICAgICBpZiBjbXAuRXF1YWxzKHYuKFRTZXQpKSB7Ci0gICAgICAgICAgcmV0dXJuIGVsZW0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG5pbAotICAgIH0KLSAgY2FzZSBMSVNUOgotICAgIGlmIGNtcCwgb2sgOj0gZGF0YS4oRXF1YWxzTGlzdCk7IG9rIHsKLSAgICAgIGZvciBlbGVtIDo9IHAubC5Gcm9udCgpOyBlbGVtICE9IG5pbDsgZWxlbSA9IGVsZW0uTmV4dCgpIHsKLSAgICAgICAgdiA6PSBlbGVtLlZhbHVlCi0gICAgICAgIGlmIHYgPT0gbmlsIHsKLSAgICAgICAgICBjb250aW51ZQotICAgICAgICB9Ci0gICAgICAgIGlmIGNtcC5FcXVhbHModi4oVExpc3QpKSB7Ci0gICAgICAgICAgcmV0dXJuIGVsZW0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG5pbAotICAgIH0KLSAgY2FzZSBTVFJVQ1Q6Ci0gICAgaWYgY21wLCBvayA6PSBkYXRhLihFcXVhbHNTdHJ1Y3QpOyBvayB7Ci0gICAgICBmb3IgZWxlbSA6PSBwLmwuRnJvbnQoKTsgZWxlbSAhPSBuaWw7IGVsZW0gPSBlbGVtLk5leHQoKSB7Ci0gICAgICAgIHYgOj0gZWxlbS5WYWx1ZQotICAgICAgICBpZiB2ID09IG5pbCB7Ci0gICAgICAgICAgY29udGludWUKLSAgICAgICAgfQotICAgICAgICBpZiBjbXAuRXF1YWxzKHYuKFRTdHJ1Y3QpKSB7Ci0gICAgICAgICAgcmV0dXJuIGVsZW0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG5pbAotICAgIH0KLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKnRTZXQpIFZhbHVlcygpIFtdaW50ZXJmYWNle30gewotICBzaXplIDo9IHAubC5MZW4oKQotICB2YWx1ZXMgOj0gbWFrZShbXWludGVyZmFjZXt9LCBzaXplLCBzaXplKQotICBpIDo9IDAKLSAgZm9yIHYgOj0gcC5sLkZyb250KCk7IHYgIT0gbmlsOyB2ID0gdi5OZXh0KCkgewotICAgIHZhbHVlc1tpXSA9IHYuVmFsdWUKLSAgICBpKysKLSAgfQotICByZXR1cm4gdmFsdWVzCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RzaW1wbGVfanNvbl9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvdHNpbXBsZV9qc29uX3Byb3RvY29sLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjlkZDljLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdHNpbXBsZV9qc29uX3Byb3RvY29sLmdvCisrKyAvZGV2L251bGwKQEAgLTEsMTI4MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLWltcG9ydCAoCi0gICJidWZpbyIKLSAgImJ5dGVzIgotICAiY29udGFpbmVyL3ZlY3RvciIKLSAgImVuY29kaW5nL2Jhc2U2NCIKLSAgImZtdCIKLSAgImlvIgotICAianNvbiIKLSAgIm1hdGgiCi0gICJvcyIKLSAgInN0cmNvbnYiCi0gICJzdHJpbmdzIgotKQotCi10eXBlIF9QYXJzZUNvbnRleHQgaW50Ci0KLWNvbnN0ICgKLSAgX0NPTlRFWFRfSU5fVE9QTEVWRUwgICAgICAgICAgX1BhcnNlQ29udGV4dCA9IDEKLSAgX0NPTlRFWFRfSU5fTElTVF9GSVJTVCAgICAgICAgX1BhcnNlQ29udGV4dCA9IDIKLSAgX0NPTlRFWFRfSU5fTElTVCAgICAgICAgICAgICAgX1BhcnNlQ29udGV4dCA9IDMKLSAgX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNUICAgICAgX1BhcnNlQ29udGV4dCA9IDQKLSAgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZICAgX1BhcnNlQ29udGV4dCA9IDUKLSAgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfVkFMVUUgX1BhcnNlQ29udGV4dCA9IDYKLSkKLQotZnVuYyAocCBfUGFyc2VDb250ZXh0KSBTdHJpbmcoKSBzdHJpbmcgewotICBzd2l0Y2ggcCB7Ci0gIGNhc2UgX0NPTlRFWFRfSU5fVE9QTEVWRUw6Ci0gICAgcmV0dXJuICJUT1BMRVZFTCIKLSAgY2FzZSBfQ09OVEVYVF9JTl9MSVNUX0ZJUlNUOgotICAgIHJldHVybiAiTElTVC1GSVJTVCIKLSAgY2FzZSBfQ09OVEVYVF9JTl9MSVNUOgotICAgIHJldHVybiAiTElTVCIKLSAgY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfRklSU1Q6Ci0gICAgcmV0dXJuICJPQkpFQ1QtRklSU1QiCi0gIGNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZOgotICAgIHJldHVybiAiT0JKRUNULU5FWFQtS0VZIgotICBjYXNlIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX1ZBTFVFOgotICAgIHJldHVybiAiT0JKRUNULU5FWFQtVkFMVUUiCi0gIH0KLSAgcmV0dXJuICJVTktOT1dOLVBBUlNFLUNPTlRFWFQiCi19Ci0KLS8qKgotICogSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgotICoKLSAqIFRoaXMgcHJvdG9jb2wgcHJvZHVjZXMvY29uc3VtZXMgYSBzaW1wbGUgb3V0cHV0IGZvcm1hdAotICogc3VpdGFibGUgZm9yIHBhcnNpbmcgYnkgc2NyaXB0aW5nIGxhbmd1YWdlcy4gIEl0IHNob3VsZCBub3QgYmUKLSAqIGNvbmZ1c2VkIHdpdGggdGhlIGZ1bGwtZmVhdHVyZWQgVEpTT05Qcm90b2NvbC4KLSAqCi0gKi8KLXR5cGUgVFNpbXBsZUpTT05Qcm90b2NvbCBzdHJ1Y3QgewotICAvL1RQcm90b2NvbEJhc2U7Ci0gIHRyYW5zIFRUcmFuc3BvcnQKLQotICAvKioKLSAgICogU3RhY2sgb2YgbmVzdGVkIGNvbnRleHRzIHRoYXQgd2UgbWF5IGJlIGluLgotICAgKi8KLSAgcGFyc2VDb250ZXh0U3RhY2sgdmVjdG9yLkludFZlY3RvcgotICAvKioKLSAgICogU3RhY2sgb2YgbmVzdGVkIGNvbnRleHRzIHRoYXQgd2UgbWF5IGJlIGluLgotICAgKi8KLSAgZHVtcENvbnRleHQgdmVjdG9yLkludFZlY3RvcgotCi0gIC8qKgotICAgKiBDdXJyZW50IGNvbnRleHQgdGhhdCB3ZSBhcmUgaW4KLSAgICovCi0gIHdyaXRlciBUVHJhbnNwb3J0Ci0gIHJlYWRlciAqYnVmaW8uUmVhZGVyCi19Ci0KLS8qKgotICogQ29uc3RydWN0b3IKLSAqLwotZnVuYyBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHQgVFRyYW5zcG9ydCkgKlRTaW1wbGVKU09OUHJvdG9jb2wgewotICB2IDo9ICZUU2ltcGxlSlNPTlByb3RvY29se3RyYW5zOiB0LAotICAgIHdyaXRlcjogdCwKLSAgICByZWFkZXI6IGJ1ZmlvLk5ld1JlYWRlcih0KSwKLSAgfQotICB2LnBhcnNlQ29udGV4dFN0YWNrLlB1c2goaW50KF9DT05URVhUX0lOX1RPUExFVkVMKSkKLSAgdi5kdW1wQ29udGV4dC5QdXNoKGludChfQ09OVEVYVF9JTl9UT1BMRVZFTCkpCi0gIHJldHVybiB2Ci19Ci0KLS8qKgotICogRmFjdG9yeQotICovCi10eXBlIFRTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5IHN0cnVjdHt9Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KSBHZXRQcm90b2NvbCh0cmFucyBUVHJhbnNwb3J0KSBUUHJvdG9jb2wgewotICByZXR1cm4gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKLX0KLQotZnVuYyBOZXdUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSgpICpUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSB7Ci0gIHJldHVybiAmVFNpbXBsZUpTT05Qcm90b2NvbEZhY3Rvcnl7fQotfQotCi12YXIgKAotICBKU09OX0NPTU1BICAgICAgICAgICAgICAgICAgIFtdYnl0ZQotICBKU09OX0NPTE9OICAgICAgICAgICAgICAgICAgIFtdYnl0ZQotICBKU09OX0xCUkFDRSAgICAgICAgICAgICAgICAgIFtdYnl0ZQotICBKU09OX1JCUkFDRSAgICAgICAgICAgICAgICAgIFtdYnl0ZQotICBKU09OX0xCUkFDS0VUICAgICAgICAgICAgICAgIFtdYnl0ZQotICBKU09OX1JCUkFDS0VUICAgICAgICAgICAgICAgIFtdYnl0ZQotICBKU09OX1FVT1RFICAgICAgICAgICAgICAgICAgIGJ5dGUKLSAgSlNPTl9RVU9URV9CWVRFUyAgICAgICAgICAgICBbXWJ5dGUKLSAgSlNPTl9OVUxMICAgICAgICAgICAgICAgICAgICBbXWJ5dGUKLSAgSlNPTl9UUlVFICAgICAgICAgICAgICAgICAgICBbXWJ5dGUKLSAgSlNPTl9GQUxTRSAgICAgICAgICAgICAgICAgICBbXWJ5dGUKLSAgSlNPTl9JTkZJTklUWSAgICAgICAgICAgICAgICBzdHJpbmcKLSAgSlNPTl9ORUdBVElWRV9JTkZJTklUWSAgICAgICBzdHJpbmcKLSAgSlNPTl9OQU4gICAgICAgICAgICAgICAgICAgICBzdHJpbmcKLSAgSlNPTl9JTkZJTklUWV9CWVRFUyAgICAgICAgICBbXWJ5dGUKLSAgSlNPTl9ORUdBVElWRV9JTkZJTklUWV9CWVRFUyBbXWJ5dGUKLSAgSlNPTl9OQU5fQllURVMgICAgICAgICAgICAgICBbXWJ5dGUKLSAganNvbl9ub25iYXNlX21hcF9lbGVtX2J5dGVzICBbXWJ5dGUKLSkKLQotZnVuYyBpbml0KCkgewotICBKU09OX0NPTU1BID0gW11ieXRleycsJ30KLSAgSlNPTl9DT0xPTiA9IFtdYnl0ZXsnOid9Ci0gIEpTT05fTEJSQUNFID0gW11ieXRleyd7J30KLSAgSlNPTl9SQlJBQ0UgPSBbXWJ5dGV7J30nfQotICBKU09OX0xCUkFDS0VUID0gW11ieXRleydbJ30KLSAgSlNPTl9SQlJBQ0tFVCA9IFtdYnl0ZXsnXSd9Ci0gIEpTT05fUVVPVEUgPSAnIicKLSAgSlNPTl9RVU9URV9CWVRFUyA9IFtdYnl0ZXsnIid9Ci0gIEpTT05fTlVMTCA9IFtdYnl0ZXsnbicsICd1JywgJ2wnLCAnbCd9Ci0gIEpTT05fVFJVRSA9IFtdYnl0ZXsndCcsICdyJywgJ3UnLCAnZSd9Ci0gIEpTT05fRkFMU0UgPSBbXWJ5dGV7J2YnLCAnYScsICdsJywgJ3MnLCAnZSd9Ci0gIEpTT05fSU5GSU5JVFkgPSAiSW5maW5pdHkiCi0gIEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgPSAiLUluZmluaXR5IgotICBKU09OX05BTiA9ICJOYU4iCi0gIEpTT05fSU5GSU5JVFlfQllURVMgPSBbXWJ5dGV7J0knLCAnbicsICdmJywgJ2knLCAnbicsICdpJywgJ3QnLCAneSd9Ci0gIEpTT05fTkVHQVRJVkVfSU5GSU5JVFlfQllURVMgPSBbXWJ5dGV7Jy0nLCAnSScsICduJywgJ2YnLCAnaScsICduJywgJ2knLCAndCcsICd5J30KLSAgSlNPTl9OQU5fQllURVMgPSBbXWJ5dGV7J04nLCAnYScsICdOJ30KLSAganNvbl9ub25iYXNlX21hcF9lbGVtX2J5dGVzID0gW11ieXRleyddJywgJywnLCAnWyd9Ci19Ci0KLWZ1bmMgSnNvblF1b3RlKHMgc3RyaW5nKSBzdHJpbmcgewotICBiLCBfIDo9IGpzb24uTWFyc2hhbChzKQotICBzMSA6PSBzdHJpbmcoYikKLSAgcmV0dXJuIHMxCi19Ci0KLWZ1bmMgSnNvblVucXVvdGUocyBzdHJpbmcpIChzdHJpbmcsIGJvb2wpIHsKLSAgczEgOj0gbmV3KHN0cmluZykKLSAgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgczEpCi0gIHJldHVybiAqczEsIGVyciA9PSBuaWwKLX0KLQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZU1lc3NhZ2VCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxSWQgaW50MzIpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGlmIGUgOj0gcC5PdXRwdXRMaXN0QmVnaW4oKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgaWYgZSA6PSBwLldyaXRlU3RyaW5nKG5hbWUpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICBpZiBlIDo9IHAuV3JpdGVCeXRlKGJ5dGUodHlwZUlkKSk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIGlmIGUgOj0gcC5Xcml0ZUkzMihzZXFJZCk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVNZXNzYWdlRW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuT3V0cHV0TGlzdEVuZCgpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlU3RydWN0QmVnaW4obmFtZSBzdHJpbmcpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGlmIGUgOj0gcC5PdXRwdXRPYmplY3RCZWdpbigpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlU3RydWN0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuT3V0cHV0T2JqZWN0RW5kKCkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVGaWVsZEJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiBlIDo9IHAuV3JpdGVTdHJpbmcobmFtZSk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIHJldHVybiBuaWwKLSAgLyoKLSAgICAJaWYgZSA6PSBwLk91dHB1dExpc3RCZWdpbigpOyBlICE9IG5pbCB7Ci0gICAgICAgIHJldHVybiBlCi0gICAgICB9Ci0gICAgICBpZiBlIDo9IHAuV3JpdGVCeXRlKGJ5dGUodHlwZUlkKSk7IGUgIT0gbmlsIHsKLSAgICAgICAgcmV0dXJuIGUKLSAgICAgIH0KLSAgICAgIHJldHVybiBwLldyaXRlSTE2KGlkKQotICAqLwotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUZpZWxkRW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgLy9yZXR1cm4gcC5PdXRwdXRMaXN0RW5kKCkKLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUZpZWxkU3RvcCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7IHJldHVybiBuaWwgfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZU1hcEJlZ2luKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGlmIGUgOj0gcC5PdXRwdXRMaXN0QmVnaW4oKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgaWYgZSA6PSBwLldyaXRlQnl0ZShieXRlKGtleVR5cGUpKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgaWYgZSA6PSBwLldyaXRlQnl0ZShieXRlKHZhbHVlVHlwZSkpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICByZXR1cm4gcC5Xcml0ZUkzMihpbnQzMihzaXplKSkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVNYXBFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5PdXRwdXRMaXN0RW5kKCkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5PdXRwdXRFbGVtTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUxpc3RFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5PdXRwdXRMaXN0RW5kKCkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVTZXRCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLk91dHB1dEVsZW1MaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlU2V0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuT3V0cHV0TGlzdEVuZCgpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlQm9vbChiIGJvb2wpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLk91dHB1dEJvb2woYikKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVCeXRlKGIgYnl0ZSkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuV3JpdGVJMzIoaW50MzIoYikpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlSTE2KHYgaW50MTYpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLldyaXRlSTMyKGludDMyKHYpKQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUkzMih2IGludDMyKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5PdXRwdXRJNjQoaW50NjQodikpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlSTY0KHYgaW50NjQpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLk91dHB1dEk2NChpbnQ2NCh2KSkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVEb3VibGUodiBmbG9hdDY0KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5PdXRwdXRGNjQodikKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVTdHJpbmcodiBzdHJpbmcpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLk91dHB1dFN0cmluZyh2KQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUJpbmFyeSh2IFtdYnl0ZSkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgLy8gSlNPTiBsaWJyYXJ5IG9ubHkgdGFrZXMgaW4gYSBzdHJpbmcsIAotICAvLyBub3QgYW4gYXJiaXRyYXJ5IGJ5dGUgYXJyYXksIHRvIGVuc3VyZSBieXRlcyBhcmUgdHJhbnNtaXR0ZWQKLSAgLy8gZWZmaWNpZW50bHkgd2UgbXVzdCBjb252ZXJ0IHRoaXMgaW50byBhIHZhbGlkIEpTT04gc3RyaW5nCi0gIC8vIHRoZXJlZm9yZSB3ZSB1c2UgYmFzZTY0IGVuY29kaW5nIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBlc2NhcGluZy9xdW90aW5nCi0gIGlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICBpZiBfLCBlIDo9IHAud3JpdGVyLldyaXRlKEpTT05fUVVPVEVfQllURVMpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gIH0KLSAgd3JpdGVyIDo9IGJhc2U2NC5OZXdFbmNvZGVyKGJhc2U2NC5TdGRFbmNvZGluZywgcC53cml0ZXIpCi0gIGlmIF8sIGUgOj0gd3JpdGVyLldyaXRlKHYpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gIH0KLSAgaWYgZSA6PSB3cml0ZXIuQ2xvc2UoKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICB9Ci0gIGlmIF8sIGUgOj0gcC53cml0ZXIuV3JpdGUoSlNPTl9RVU9URV9CWVRFUyk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgfQotICByZXR1cm4gcC5PdXRwdXRQb3N0VmFsdWUoKQotfQotCi0vKioKLSAqIFJlYWRpbmcgbWV0aG9kcy4KLSAqLwotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkTWVzc2FnZUJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFJZCBpbnQzMiwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBpZiBpc051bGwsIGVyciA6PSBwLlBhcnNlTGlzdEJlZ2luKCk7IGlzTnVsbCB8fCBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCi0gIH0KLSAgaWYgbmFtZSwgZXJyID0gcC5SZWFkU3RyaW5nKCk7IGVyciAhPSBuaWwgewotICAgIHJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlcnIKLSAgfQotICBiVHlwZUlkLCBlcnIgOj0gcC5SZWFkQnl0ZSgpCi0gIHR5cGVJZCA9IFRNZXNzYWdlVHlwZShiVHlwZUlkKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCi0gIH0KLSAgaWYgc2VxSWQsIGVyciA9IHAuUmVhZEkzMigpOyBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCi0gIH0KLSAgcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIG5pbAotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkTWVzc2FnZUVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLlBhcnNlTGlzdEVuZCgpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRTdHJ1Y3RCZWdpbigpIChuYW1lIHN0cmluZywgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBfLCBlcnIgPSBwLlBhcnNlT2JqZWN0U3RhcnQoKQotICByZXR1cm4gIiIsIGVycgotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkU3RydWN0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuUGFyc2VPYmplY3RFbmQoKQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkRmllbGRCZWdpbigpIChzdHJpbmcsIFRUeXBlLCBpbnQxNiwgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuICIiLCBTVE9QLCAwLCBlcnIKLSAgfQotICBpZiBwLnJlYWRlci5CdWZmZXJlZCgpIDwgMSB7Ci0gICAgcmV0dXJuICIiLCBTVE9QLCAwLCBuaWwKLSAgfQotICBiLCBfIDo9IHAucmVhZGVyLlBlZWsoMSkKLSAgaWYgbGVuKGIpID4gMCB7Ci0gICAgc3dpdGNoIGJbMF0gewotICAgIGNhc2UgSlNPTl9SQlJBQ0VbMF06Ci0gICAgICByZXR1cm4gIiIsIFNUT1AsIDAsIG5pbAotICAgIGNhc2UgSlNPTl9RVU9URToKLSAgICAgIHAucmVhZGVyLlJlYWRCeXRlKCkKLSAgICAgIG5hbWUsIGVyciA6PSBwLlBhcnNlU3RyaW5nQm9keSgpCi0gICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgcmV0dXJuIG5hbWUsIFNUT1AsIDAsIGVycgotICAgICAgfQotICAgICAgcmV0dXJuIG5hbWUsIEdFTkVSSUMsIC0xLCBwLlBhcnNlUG9zdFZhbHVlKCkKLSAgICAgIC8qCi0gICAgICAgICBpZiBlcnIgPSBwLlBhcnNlUG9zdFZhbHVlKCk7IGVyciAhPSBuaWwgewotICAgICAgICAgICByZXR1cm4gbmFtZSwgU1RPUCwgMCwgZXJyCi0gICAgICAgICB9Ci0gICAgICAgICBpZiBpc051bGwsIGVyciA6PSBwLlBhcnNlTGlzdEJlZ2luKCk7IGlzTnVsbCB8fCBlcnIgIT0gbmlsIHsKLSAgICAgICAgICAgcmV0dXJuIG5hbWUsIFNUT1AsIDAsIGVycgotICAgICAgICAgfQotICAgICAgICAgYlR5cGUsIGVyciA6PSBwLlJlYWRCeXRlKCkKLSAgICAgICAgIHRoZXR5cGUgOj0gVFR5cGUoYlR5cGUpCi0gICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICAgcmV0dXJuIG5hbWUsIHRoZXR5cGUsIDAsIGVycgotICAgICAgICAgfQotICAgICAgICAgaWQsIGVyciA6PSBwLlJlYWRJMTYoKQotICAgICAgICAgcmV0dXJuIG5hbWUsIHRoZXR5cGUsIGlkLCBlcnIKLSAgICAgICovCi0gICAgfQotICAgIHJldHVybiAiIiwgU1RPUCwgMCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgZm10LlNwcmludCgiRXhwZWN0ZWQgXCJ9XCIgb3IgJ1wiJywgYnV0IGZvdW5kOiAnIiwgc3RyaW5nKGIpLCAiJyIpKQotICB9Ci0gIHJldHVybiAiIiwgU1RPUCwgMCwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3Iob3MuRU9GKQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkRmllbGRFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gbmlsCi0gIC8vcmV0dXJuIHAuUGFyc2VMaXN0RW5kKCkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZE1hcEJlZ2luKCkgKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGlmIGlzTnVsbCwgZSA6PSBwLlBhcnNlTGlzdEJlZ2luKCk7IGlzTnVsbCB8fCBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIFZPSUQsIFZPSUQsIDAsIGUKLSAgfQotCi0gIC8vIHJlYWQga2V5VHlwZQotICBiS2V5VHlwZSwgZSA6PSBwLlJlYWRCeXRlKCkKLSAga2V5VHlwZSA9IFRUeXBlKGJLZXlUeXBlKQotICBpZiBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZQotICB9Ci0KLSAgLy8gcmVhZCB2YWx1ZVR5cGUKLSAgYlZhbHVlVHlwZSwgZSA6PSBwLlJlYWRCeXRlKCkKLSAgdmFsdWVUeXBlID0gVFR5cGUoYlZhbHVlVHlwZSkKLSAgaWYgZSAhPSBuaWwgewotICAgIHJldHVybiBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGUKLSAgfQotCi0gIC8vIHJlYWQgc2l6ZQotICBpU2l6ZSwgZXJyIDo9IHAuUmVhZEk2NCgpCi0gIHNpemUgPSBpbnQoaVNpemUpCi0gIHJldHVybiBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGVycgotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkTWFwRW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuUGFyc2VMaXN0RW5kKCkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZExpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHJldHVybiBwLlBhcnNlRWxlbUxpc3RCZWdpbigpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRMaXN0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuUGFyc2VMaXN0RW5kKCkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZFNldEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZSBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgcmV0dXJuIHAuUGFyc2VFbGVtTGlzdEJlZ2luKCkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZFNldEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLlBhcnNlTGlzdEVuZCgpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRCb29sKCkgKGJvb2wsIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICB2YXIgdmFsdWUgYm9vbAotICBpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgewotICAgIHJldHVybiB2YWx1ZSwgZXJyCi0gIH0KLSAgYiwgXyA6PSBwLnJlYWRlci5QZWVrKGxlbihKU09OX0ZBTFNFKSkKLSAgaWYgbGVuKGIpID4gMCB7Ci0gICAgc3dpdGNoIGJbMF0gewotICAgIGNhc2UgSlNPTl9UUlVFWzBdOgotICAgICAgaWYgc3RyaW5nKGJbMDpsZW4oSlNPTl9UUlVFKV0pID09IHN0cmluZyhKU09OX1RSVUUpIHsKLSAgICAgICAgcC5yZWFkZXIuUmVhZChiWzA6bGVuKEpTT05fVFJVRSldKQotICAgICAgICB2YWx1ZSA9IHRydWUKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZSwgTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgIkV4cGVjdGVkIFwidHJ1ZVwiIGJ1dCBmb3VuZDogIitzdHJpbmcoYikpCi0gICAgICB9Ci0gICAgICBicmVhawotICAgIGNhc2UgSlNPTl9GQUxTRVswXToKLSAgICAgIGlmIHN0cmluZyhiWzA6bGVuKEpTT05fRkFMU0UpXSkgPT0gc3RyaW5nKEpTT05fRkFMU0UpIHsKLSAgICAgICAgcC5yZWFkZXIuUmVhZChiWzA6bGVuKEpTT05fRkFMU0UpXSkKLSAgICAgICAgdmFsdWUgPSBmYWxzZQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgXCJmYWxzZVwiIGJ1dCBmb3VuZDogIitzdHJpbmcoYikpCi0gICAgICB9Ci0gICAgICBicmVhawotICAgIGNhc2UgSlNPTl9OVUxMWzBdOgotICAgICAgaWYgc3RyaW5nKGJbMDpsZW4oSlNPTl9OVUxMKV0pID09IHN0cmluZyhKU09OX05VTEwpIHsKLSAgICAgICAgcC5yZWFkZXIuUmVhZChiWzA6bGVuKEpTT05fTlVMTCldKQotICAgICAgICB2YWx1ZSA9IGZhbHNlCi0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gdmFsdWUsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsICJFeHBlY3RlZCBcIm51bGxcIiBidXQgZm91bmQ6ICIrc3RyaW5nKGIpKQotICAgICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gdmFsdWUsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsICJFeHBlY3RlZCBcInRydWVcIiwgXCJmYWxzZVwiLCBvciBcIm51bGxcIiBidXQgZm91bmQ6ICIrc3RyaW5nKGIpKQotICAgIH0KLSAgfQotICByZXR1cm4gdmFsdWUsIHAuUGFyc2VQb3N0VmFsdWUoKQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkQnl0ZSgpIChieXRlLCBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgdiwgZXJyIDo9IHAuUmVhZEk2NCgpCi0gIHJldHVybiBieXRlKHYpLCBlcnIKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZEkxNigpIChpbnQxNiwgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHYsIGVyciA6PSBwLlJlYWRJNjQoKQotICByZXR1cm4gaW50MTYodiksIGVycgotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkSTMyKCkgKGludDMyLCBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgdiwgZXJyIDo9IHAuUmVhZEk2NCgpCi0gIHJldHVybiBpbnQzMih2KSwgZXJyCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRJNjQoKSAoaW50NjQsIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICB2LCBfLCBlcnIgOj0gcC5QYXJzZUk2NCgpCi0gIHJldHVybiB2LCBlcnIKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZERvdWJsZSgpIChmbG9hdDY0LCBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgdiwgXywgZXJyIDo9IHAuUGFyc2VGNjQoKQotICByZXR1cm4gdiwgZXJyCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRTdHJpbmcoKSAoc3RyaW5nLCBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgdmFyIHYgc3RyaW5nCi0gIGlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIHYsIGVycgotICB9Ci0gIGIsIF8gOj0gcC5yZWFkZXIuUGVlayhsZW4oSlNPTl9OVUxMKSkKLSAgaWYgbGVuKGIpID4gMCAmJiBiWzBdID09IEpTT05fUVVPVEUgewotICAgIHAucmVhZGVyLlJlYWRCeXRlKCkKLSAgICB2YWx1ZSwgZXJyIDo9IHAuUGFyc2VTdHJpbmdCb2R5KCkKLSAgICB2ID0gdmFsdWUKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiB2LCBlcnIKLSAgICB9Ci0gIH0gZWxzZSBpZiBsZW4oYikgPj0gbGVuKEpTT05fTlVMTCkgJiYgc3RyaW5nKGJbMDpsZW4oSlNPTl9OVUxMKV0pID09IHN0cmluZyhKU09OX05VTEwpIHsKLSAgICBfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiWzA6bGVuKEpTT05fTlVMTCldKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsIGZtdC5TcHJpbnQoIkV4cGVjdGVkIGEgSlNPTiBzdHJpbmcsIGZvdW5kICIsIHN0cmluZyhiKSkpCi0gIH0KLSAgcmV0dXJuIHYsIHAuUGFyc2VQb3N0VmFsdWUoKQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkQmluYXJ5KCkgKFtdYnl0ZSwgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHZhciB2IFtdYnl0ZQotICBpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgewotICAgIHJldHVybiBuaWwsIGVycgotICB9Ci0gIGIsIF8gOj0gcC5yZWFkZXIuUGVlayhsZW4oSlNPTl9OVUxMKSkKLSAgaWYgbGVuKGIpID4gMCAmJiBiWzBdID09IEpTT05fUVVPVEUgewotICAgIHAucmVhZGVyLlJlYWRCeXRlKCkKLSAgICB2YWx1ZSwgZXJyIDo9IHAuUGFyc2VCYXNlNjRFbmNvZGVkQm9keSgpCi0gICAgdiA9IHZhbHVlCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4gdiwgZXJyCi0gICAgfQotICB9IGVsc2UgaWYgbGVuKGIpID49IGxlbihKU09OX05VTEwpICYmIHN0cmluZyhiWzA6bGVuKEpTT05fTlVMTCldKSA9PSBzdHJpbmcoSlNPTl9OVUxMKSB7Ci0gICAgXywgZXJyIDo9IHAucmVhZGVyLlJlYWQoYlswOmxlbihKU09OX05VTEwpXSkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi0gICAgfQotICB9IGVsc2UgewotICAgIHJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCBmbXQuU3ByaW50KCJFeHBlY3RlZCBhIEpTT04gc3RyaW5nLCBmb3VuZCAiLCBzdHJpbmcoYikpKQotICB9Ci0gIHJldHVybiB2LCBwLlBhcnNlUG9zdFZhbHVlKCkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgRmx1c2goKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IocC53cml0ZXIuRmx1c2goKSkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgU2tpcChmaWVsZFR5cGUgVFR5cGUpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHJldHVybiBTa2lwRGVmYXVsdERlcHRoKHAsIGZpZWxkVHlwZSkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgVHJhbnNwb3J0KCkgVFRyYW5zcG9ydCB7Ci0gIHJldHVybiBwLnRyYW5zCi19Ci0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0UHJlVmFsdWUoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBjeHQgOj0gX1BhcnNlQ29udGV4dChwLmR1bXBDb250ZXh0Lkxhc3QoKSkKLSAgc3dpdGNoIGN4dCB7Ci0gIGNhc2UgX0NPTlRFWFRfSU5fTElTVCwgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZOgotICAgIGlmIF8sIGUgOj0gcC53cml0ZXIuV3JpdGUoSlNPTl9DT01NQSk7IGUgIT0gbmlsIHsKLSAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICAgIH0KLSAgICBicmVhawotICBjYXNlIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX1ZBTFVFOgotICAgIGlmIF8sIGUgOj0gcC53cml0ZXIuV3JpdGUoSlNPTl9DT0xPTik7IGUgIT0gbmlsIHsKLSAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICAgIH0KLSAgICBicmVhawotICB9Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0UG9zdFZhbHVlKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgY3h0IDo9IF9QYXJzZUNvbnRleHQocC5kdW1wQ29udGV4dC5MYXN0KCkpCi0gIHN3aXRjaCBjeHQgewotICBjYXNlIF9DT05URVhUX0lOX0xJU1RfRklSU1Q6Ci0gICAgcC5kdW1wQ29udGV4dC5Qb3AoKQotICAgIHAuZHVtcENvbnRleHQuUHVzaChpbnQoX0NPTlRFWFRfSU5fTElTVCkpCi0gICAgYnJlYWsKLSAgY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfRklSU1Q6Ci0gICAgcC5kdW1wQ29udGV4dC5Qb3AoKQotICAgIHAuZHVtcENvbnRleHQuUHVzaChpbnQoX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfVkFMVUUpKQotICAgIGJyZWFrCi0gIGNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZOgotICAgIHAuZHVtcENvbnRleHQuUG9wKCkKLSAgICBwLmR1bXBDb250ZXh0LlB1c2goaW50KF9DT05URVhUX0lOX09CSkVDVF9ORVhUX1ZBTFVFKSkKLSAgICBicmVhawotICBjYXNlIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX1ZBTFVFOgotICAgIHAuZHVtcENvbnRleHQuUG9wKCkKLSAgICBwLmR1bXBDb250ZXh0LlB1c2goaW50KF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWSkpCi0gICAgYnJlYWsKLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dEJvb2wodmFsdWUgYm9vbCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIHZhciB2IHN0cmluZwotICBpZiB2YWx1ZSB7Ci0gICAgdiA9IHN0cmluZyhKU09OX1RSVUUpCi0gIH0gZWxzZSB7Ci0gICAgdiA9IHN0cmluZyhKU09OX0ZBTFNFKQotICB9Ci0gIHN3aXRjaCBfUGFyc2VDb250ZXh0KHAuZHVtcENvbnRleHQuTGFzdCgpKSB7Ci0gIGNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNULCBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVk6Ci0gICAgdiA9IEpzb25RdW90ZSh2KQotICBkZWZhdWx0OgotICB9Ci0gIGlmIGUgOj0gcC5PdXRwdXRTdHJpbmdEYXRhKHYpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICByZXR1cm4gcC5PdXRwdXRQb3N0VmFsdWUoKQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXROdWxsKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIGlmIF8sIGUgOj0gcC53cml0ZXIuV3JpdGUoSlNPTl9OVUxMKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICB9Ci0gIHJldHVybiBwLk91dHB1dFBvc3RWYWx1ZSgpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dEY2NCh2YWx1ZSBmbG9hdDY0KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgdmFyIHYgc3RyaW5nCi0gIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKLSAgICB2ID0gc3RyaW5nKEpTT05fUVVPVEUpICsgSlNPTl9OQU4gKyBzdHJpbmcoSlNPTl9RVU9URSkKLSAgfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKLSAgICB2ID0gc3RyaW5nKEpTT05fUVVPVEUpICsgSlNPTl9JTkZJTklUWSArIHN0cmluZyhKU09OX1FVT1RFKQotICB9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgLTEpIHsKLSAgICB2ID0gc3RyaW5nKEpTT05fUVVPVEUpICsgSlNPTl9ORUdBVElWRV9JTkZJTklUWSArIHN0cmluZyhKU09OX1FVT1RFKQotICB9IGVsc2UgewotICAgIHYgPSBzdHJjb252LkZ0b2E2NCh2YWx1ZSwgJ2cnLCAtMSkKLSAgICBzd2l0Y2ggX1BhcnNlQ29udGV4dChwLmR1bXBDb250ZXh0Lkxhc3QoKSkgewotICAgIGNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNULCBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVk6Ci0gICAgICB2ID0gc3RyaW5nKEpTT05fUVVPVEUpICsgdiArIHN0cmluZyhKU09OX1FVT1RFKQotICAgIGRlZmF1bHQ6Ci0gICAgfQotICB9Ci0gIGlmIGUgOj0gcC5PdXRwdXRTdHJpbmdEYXRhKHYpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICByZXR1cm4gcC5PdXRwdXRQb3N0VmFsdWUoKQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRJNjQodmFsdWUgaW50NjQpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICB2IDo9IHN0cmNvbnYuSXRvYTY0KHZhbHVlKQotICBzd2l0Y2ggX1BhcnNlQ29udGV4dChwLmR1bXBDb250ZXh0Lkxhc3QoKSkgewotICBjYXNlIF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCwgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZOgotICAgIHYgPSBKc29uUXVvdGUodikKLSAgZGVmYXVsdDoKLSAgfQotICBpZiBlIDo9IHAuT3V0cHV0U3RyaW5nRGF0YSh2KTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgcmV0dXJuIHAuT3V0cHV0UG9zdFZhbHVlKCkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0U3RyaW5nKHMgc3RyaW5nKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgaWYgZSA6PSBwLk91dHB1dFN0cmluZ0RhdGEoSnNvblF1b3RlKHMpKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgcmV0dXJuIHAuT3V0cHV0UG9zdFZhbHVlKCkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0U3RyaW5nRGF0YShzIHN0cmluZykgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgXywgZSA6PSBpby5Db3B5bihwLndyaXRlciwgc3RyaW5ncy5OZXdSZWFkZXIocyksIGludDY0KGxlbihzKSkpCi0gIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRPYmplY3RCZWdpbigpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICBpZiBfLCBlIDo9IHAud3JpdGVyLldyaXRlKEpTT05fTEJSQUNFKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICB9Ci0gIHAuZHVtcENvbnRleHQuUHVzaChpbnQoX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNUKSkKLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRPYmplY3RFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiBfLCBlIDo9IHAud3JpdGVyLldyaXRlKEpTT05fUkJSQUNFKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICB9Ci0gIHAuZHVtcENvbnRleHQuUG9wKCkKLSAgaWYgZSA6PSBwLk91dHB1dFBvc3RWYWx1ZSgpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dExpc3RCZWdpbigpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICBpZiBfLCBlIDo9IHAud3JpdGVyLldyaXRlKEpTT05fTEJSQUNLRVQpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gIH0KLSAgcC5kdW1wQ29udGV4dC5QdXNoKGludChfQ09OVEVYVF9JTl9MSVNUX0ZJUlNUKSkKLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRMaXN0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgaWYgXywgZSA6PSBwLndyaXRlci5Xcml0ZShKU09OX1JCUkFDS0VUKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICB9Ci0gIHAuZHVtcENvbnRleHQuUG9wKCkKLSAgaWYgZSA6PSBwLk91dHB1dFBvc3RWYWx1ZSgpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dEVsZW1MaXN0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiBlIDo9IHAuT3V0cHV0TGlzdEJlZ2luKCk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIGlmIGUgOj0gcC5Xcml0ZUJ5dGUoYnl0ZShlbGVtVHlwZSkpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICBpZiBlIDo9IHAuV3JpdGVJNjQoaW50NjQoc2l6ZSkpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlUHJlVmFsdWUoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiBlIDo9IHAucmVhZE5vblNpZ25pZmljYW50V2hpdGVzcGFjZSgpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gIH0KLSAgY3h0IDo9IF9QYXJzZUNvbnRleHQocC5wYXJzZUNvbnRleHRTdGFjay5MYXN0KCkpCi0gIGlmIHAucmVhZGVyLkJ1ZmZlcmVkKCkgPCAxIHsKLSAgICByZXR1cm4gbmlsCi0gIH0KLSAgYiwgXyA6PSBwLnJlYWRlci5QZWVrKDEpCi0gIHN3aXRjaCBjeHQgewotICBjYXNlIF9DT05URVhUX0lOX0xJU1Q6Ci0gICAgaWYgbGVuKGIpID4gMCB7Ci0gICAgICBzd2l0Y2ggYlswXSB7Ci0gICAgICBjYXNlIEpTT05fUkJSQUNLRVRbMF06Ci0gICAgICAgIHJldHVybiBuaWwKLSAgICAgIGNhc2UgSlNPTl9DT01NQVswXToKLSAgICAgICAgcC5yZWFkZXIuUmVhZEJ5dGUoKQotICAgICAgICBpZiBlIDo9IHAucmVhZE5vblNpZ25pZmljYW50V2hpdGVzcGFjZSgpOyBlICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5pbAotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsIGZtdC5TcHJpbnQoIkV4cGVjdGVkIFwiXVwiIG9yIFwiLFwiIGluIGxpc3QgY29udGV4dCwgYnV0IGZvdW5kIFwiIiwgc3RyaW5nKGIpLCAiXCIiKSkKLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWsKLSAgY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVk6Ci0gICAgaWYgbGVuKGIpID4gMCB7Ci0gICAgICBzd2l0Y2ggYlswXSB7Ci0gICAgICBjYXNlIEpTT05fUkJSQUNFWzBdOgotICAgICAgICByZXR1cm4gbmlsCi0gICAgICBjYXNlIEpTT05fQ09NTUFbMF06Ci0gICAgICAgIHAucmVhZGVyLlJlYWRCeXRlKCkKLSAgICAgICAgaWYgZSA6PSBwLnJlYWROb25TaWduaWZpY2FudFdoaXRlc3BhY2UoKTsgZSAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuaWwKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCBmbXQuU3ByaW50KCJFeHBlY3RlZCBcIn1cIiBvciBcIixcIiBpbiBvYmplY3QgY29udGV4dCwgYnV0IGZvdW5kIFwiIiwgc3RyaW5nKGIpLCAiXCIiKSkKLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWsKLSAgY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRToKLSAgICBpZiBsZW4oYikgPiAwIHsKLSAgICAgIHN3aXRjaCBiWzBdIHsKLSAgICAgIGNhc2UgSlNPTl9DT0xPTlswXToKLSAgICAgICAgcC5yZWFkZXIuUmVhZEJ5dGUoKQotICAgICAgICBpZiBlIDo9IHAucmVhZE5vblNpZ25pZmljYW50V2hpdGVzcGFjZSgpOyBlICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5pbAotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsIGZtdC5TcHJpbnQoIkV4cGVjdGVkIFwiOlwiIGluIG9iamVjdCBjb250ZXh0LCBidXQgZm91bmQgXCIiLCBzdHJpbmcoYiksICJcIiIpKQotICAgICAgfQotICAgIH0KLSAgICBicmVhawotICB9Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VQb3N0VmFsdWUoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiBlIDo9IHAucmVhZE5vblNpZ25pZmljYW50V2hpdGVzcGFjZSgpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gIH0KLSAgY3h0IDo9IF9QYXJzZUNvbnRleHQocC5wYXJzZUNvbnRleHRTdGFjay5MYXN0KCkpCi0gIHN3aXRjaCBjeHQgewotICBjYXNlIF9DT05URVhUX0lOX0xJU1RfRklSU1Q6Ci0gICAgcC5wYXJzZUNvbnRleHRTdGFjay5Qb3AoKQotICAgIHAucGFyc2VDb250ZXh0U3RhY2suUHVzaChpbnQoX0NPTlRFWFRfSU5fTElTVCkpCi0gICAgYnJlYWsKLSAgY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfRklSU1QsIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWToKLSAgICBwLnBhcnNlQ29udGV4dFN0YWNrLlBvcCgpCi0gICAgcC5wYXJzZUNvbnRleHRTdGFjay5QdXNoKGludChfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRSkpCi0gICAgYnJlYWsKLSAgY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRToKLSAgICBwLnBhcnNlQ29udGV4dFN0YWNrLlBvcCgpCi0gICAgcC5wYXJzZUNvbnRleHRTdGFjay5QdXNoKGludChfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVkpKQotICAgIGJyZWFrCi0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSByZWFkTm9uU2lnbmlmaWNhbnRXaGl0ZXNwYWNlKCkgb3MuRXJyb3IgewotICBmb3IgcC5yZWFkZXIuQnVmZmVyZWQoKSA+IDAgewotICAgIGIsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQotICAgIGlmIGxlbihiKSA8IDEgewotICAgICAgcmV0dXJuIG5pbAotICAgIH0KLSAgICBzd2l0Y2ggYlswXSB7Ci0gICAgY2FzZSAnICcsICdccicsICdcbicsICdcdCc6Ci0gICAgICBwLnJlYWRlci5SZWFkQnl0ZSgpCi0gICAgICBjb250aW51ZQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhawotICAgIH0KLSAgICBicmVhawotICB9Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VTdHJpbmdCb2R5KCkgKHN0cmluZywgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGxpbmUsIGVyciA6PSBwLnJlYWRlci5SZWFkU3RyaW5nKEpTT05fUVVPVEUpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiAiIiwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotICB9Ci0gIGwgOj0gbGVuKGxpbmUpCi0gIC8vIGNvdW50IG51bWJlciBvZiBlc2NhcGVzIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGtlZXAgZ29pbmcKLSAgaSA6PSAxCi0gIGZvciA7IGkgPCBsOyBpKysgewotICAgIGlmIGxpbmVbbC1pLTFdICE9ICdcXCcgewotICAgICAgYnJlYWsKLSAgICB9Ci0gIH0KLSAgaWYgaSYweDAxID09IDEgewotICAgIHYsIG9rIDo9IEpzb25VbnF1b3RlKHN0cmluZyhKU09OX1FVT1RFKSArIGxpbmUpCi0gICAgaWYgIW9rIHsKLSAgICAgIHJldHVybiAiIiwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotICAgIH0KLSAgICByZXR1cm4gdiwgbmlsCi0gIH0KLSAgcywgZXJyIDo9IHAuUGFyc2VRdW90ZWRTdHJpbmdCb2R5KCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuICIiLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi0gIH0KLSAgc3RyIDo9IHN0cmluZyhKU09OX1FVT1RFKSArIGxpbmUgKyBzCi0gIHYsIG9rIDo9IEpzb25VbnF1b3RlKHN0cikKLSAgaWYgIW9rIHsKLSAgICByZXR1cm4gIiIsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsICJVbmFibGUgdG8gcGFyc2UgYXMgSlNPTiBzdHJpbmcgIitzdHIpCi0gIH0KLSAgcmV0dXJuIHYsIG5pbAotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZVF1b3RlZFN0cmluZ0JvZHkoKSAoc3RyaW5nLCBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgbGluZSwgZXJyIDo9IHAucmVhZGVyLlJlYWRTdHJpbmcoSlNPTl9RVU9URSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuICIiLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi0gIH0KLSAgbCA6PSBsZW4obGluZSkKLSAgLy8gY291bnQgbnVtYmVyIG9mIGVzY2FwZXMgdG8gc2VlIGlmIHdlIG5lZWQgdG8ga2VlcCBnb2luZwotICBpIDo9IDEKLSAgZm9yIDsgaSA8IGw7IGkrKyB7Ci0gICAgaWYgbGluZVtsLWktMV0gIT0gJ1xcJyB7Ci0gICAgICBicmVhawotICAgIH0KLSAgfQotICBpZiBpJjB4MDEgPT0gMSB7Ci0gICAgcmV0dXJuIGxpbmUsIG5pbAotICB9Ci0gIHMsIGVyciA6PSBwLlBhcnNlUXVvdGVkU3RyaW5nQm9keSgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiAiIiwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotICB9Ci0gIHYgOj0gbGluZSArIHMKLSAgcmV0dXJuIHYsIG5pbAotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZUJhc2U2NEVuY29kZWRCb2R5KCkgKFtdYnl0ZSwgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGxpbmUsIGVyciA6PSBwLnJlYWRlci5SZWFkQnl0ZXMoSlNPTl9RVU9URSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIGxpbmUsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLSAgfQotICBsaW5lMiA6PSBsaW5lWzAgOiBsZW4obGluZSktMV0KLSAgbCA6PSBsZW4obGluZTIpCi0gIG91dHB1dCA6PSBtYWtlKFtdYnl0ZSwgYmFzZTY0LlN0ZEVuY29kaW5nLkRlY29kZWRMZW4obCkpCi0gIG4sIGVyciA6PSBiYXNlNjQuU3RkRW5jb2RpbmcuRGVjb2RlKG91dHB1dCwgbGluZTIpCi0gIHJldHVybiBvdXRwdXRbMDpuXSwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZUk2NCgpIChpbnQ2NCwgYm9vbCwgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIDAsIGZhbHNlLCBlcnIKLSAgfQotICB2YXIgdmFsdWUgaW50NjQKLSAgdmFyIGlzbnVsbCBib29sCi0gIGIsIF8gOj0gcC5yZWFkZXIuUGVlayhsZW4oSlNPTl9OVUxMKSkKLSAgaWYgbGVuKGIpID49IGxlbihKU09OX05VTEwpICYmIHN0cmluZyhiKSA9PSBzdHJpbmcoSlNPTl9OVUxMKSB7Ci0gICAgcC5yZWFkZXIuUmVhZChiWzA6bGVuKEpTT05fTlVMTCldKQotICAgIGlzbnVsbCA9IHRydWUKLSAgfSBlbHNlIHsKLSAgICBudW0sIGVyciA6PSBwLnJlYWROdW1lcmljKCkKLSAgICBpc251bGwgPSAobnVtID09IG5pbCkKLSAgICBpZiAhaXNudWxsIHsKLSAgICAgIHZhbHVlID0gbnVtLkludDY0KCkKLSAgICB9Ci0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4gdmFsdWUsIGlzbnVsbCwgZXJyCi0gICAgfQotICB9Ci0gIHJldHVybiB2YWx1ZSwgaXNudWxsLCBwLlBhcnNlUG9zdFZhbHVlKCkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VGNjQoKSAoZmxvYXQ2NCwgYm9vbCwgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIDAsIGZhbHNlLCBlcnIKLSAgfQotICB2YXIgdmFsdWUgZmxvYXQ2NAotICB2YXIgaXNudWxsIGJvb2wKLSAgYiwgXyA6PSBwLnJlYWRlci5QZWVrKGxlbihKU09OX05VTEwpKQotICBpZiBsZW4oYikgPj0gbGVuKEpTT05fTlVMTCkgJiYgc3RyaW5nKGIpID09IHN0cmluZyhKU09OX05VTEwpIHsKLSAgICBwLnJlYWRlci5SZWFkKGJbMDpsZW4oSlNPTl9OVUxMKV0pCi0gICAgaXNudWxsID0gdHJ1ZQotICB9IGVsc2UgewotICAgIG51bSwgZXJyIDo9IHAucmVhZE51bWVyaWMoKQotICAgIGlzbnVsbCA9IChudW0gPT0gbmlsKQotICAgIGlmICFpc251bGwgewotICAgICAgdmFsdWUgPSBudW0uRmxvYXQ2NCgpCi0gICAgfQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIHZhbHVlLCBpc251bGwsIGVycgotICAgIH0KLSAgfQotICByZXR1cm4gdmFsdWUsIGlzbnVsbCwgcC5QYXJzZVBvc3RWYWx1ZSgpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlT2JqZWN0U3RhcnQoKSAoYm9vbCwgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIGZhbHNlLCBlcnIKLSAgfQotICBiLCBfIDo9IHAucmVhZGVyLlBlZWsobGVuKEpTT05fTlVMTCkpCi0gIGlmIGxlbihiKSA+IDAgJiYgYlswXSA9PSBKU09OX0xCUkFDRVswXSB7Ci0gICAgcC5yZWFkZXIuUmVhZEJ5dGUoKQotICAgIHAucGFyc2VDb250ZXh0U3RhY2suUHVzaChpbnQoX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNUKSkKLSAgICByZXR1cm4gZmFsc2UsIG5pbAotICB9IGVsc2UgaWYgbGVuKGIpID49IGxlbihKU09OX05VTEwpICYmIHN0cmluZyhiWzA6bGVuKEpTT05fTlVMTCldKSA9PSBzdHJpbmcoSlNPTl9OVUxMKSB7Ci0gICAgcmV0dXJuIHRydWUsIG5pbAotICB9Ci0gIHJldHVybiBmYWxzZSwgTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgZm10LlNwcmludCgiRXhwZWN0ZWQgJ3snIG9yIG51bGwsIGJ1dCBmb3VuZCAnIiwgc3RyaW5nKGIpLCAiJyIpKQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZU9iamVjdEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGlmIGlzTnVsbCwgZXJyIDo9IHAucmVhZElmTnVsbCgpOyBpc051bGwgfHwgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIGVycgotICB9Ci0gIGN4dCA6PSBfUGFyc2VDb250ZXh0KHAucGFyc2VDb250ZXh0U3RhY2suTGFzdCgpKQotICBpZiBjeHQgIT0gX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNUICYmIGN4dCAhPSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVkgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCBmbXQuU3ByaW50KCJFeHBlY3RlZCB0byBiZSBpbiB0aGUgT2JqZWN0IENvbnRleHQsIGJ1dCBub3QgaW4gT2JqZWN0IENvbnRleHQiKSkKLSAgfQotICBsaW5lLCBlcnIgOj0gcC5yZWFkZXIuUmVhZFN0cmluZyhKU09OX1JCUkFDRVswXSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLSAgfQotICBmb3IgXywgY2hhciA6PSByYW5nZSBsaW5lIHsKLSAgICBzd2l0Y2ggY2hhciB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCBmbXQuU3ByaW50KCJFeHBlY3RpbmcgZW5kIG9mIG9iamVjdCBcIn1cIiwgYnV0IGZvdW5kOiBcIiIsIGxpbmUsICJcIiIpKQotICAgIGNhc2UgJyAnLCAnXG4nLCAnXHInLCAnXHQnLCAnfSc6Ci0gICAgICBicmVhawotICAgIH0KLSAgfQotICBwLnBhcnNlQ29udGV4dFN0YWNrLlBvcCgpCi0gIHJldHVybiBwLlBhcnNlUG9zdFZhbHVlKCkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VMaXN0QmVnaW4oKSAoYm9vbCwgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGlmIGUgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZmFsc2UsIGUKLSAgfQotICBiLCBlIDo9IHAucmVhZGVyLlBlZWsobGVuKEpTT05fTlVMTCkpCi0gIGlmIGUgPT0gbmlsICYmIGxlbihiKSA+PSAxICYmIGJbMF0gPT0gSlNPTl9MQlJBQ0tFVFswXSB7Ci0gICAgcC5wYXJzZUNvbnRleHRTdGFjay5QdXNoKGludChfQ09OVEVYVF9JTl9MSVNUX0ZJUlNUKSkKLSAgICBwLnJlYWRlci5SZWFkQnl0ZSgpCi0gICAgcmV0dXJuIGZhbHNlLCBuaWwKLSAgfSBlbHNlIGlmIGUgPT0gbmlsICYmIGxlbihiKSA+PSBsZW4oSlNPTl9OVUxMKSAmJiBzdHJpbmcoYikgPT0gc3RyaW5nKEpTT05fTlVMTCkgewotICAgIHJldHVybiB0cnVlLCBuaWwKLSAgfQotICByZXR1cm4gZmFsc2UsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsIGZtdC5TcHJpbnRmKCJFeHBlY3RlZCAnbnVsbCcgb3IgJ3snLCByZWNlaXZlZCAnJXEnIiwgYikpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlRWxlbUxpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGlmIGlzTnVsbCwgZSA6PSBwLlBhcnNlTGlzdEJlZ2luKCk7IGlzTnVsbCB8fCBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIFZPSUQsIDAsIGUKLSAgfQotICBiRWxlbVR5cGUsIGVyciA6PSBwLlJlYWRCeXRlKCkKLSAgZWxlbVR5cGUgPSBUVHlwZShiRWxlbVR5cGUpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBlbGVtVHlwZSwgc2l6ZSwgZXJyCi0gIH0KLSAgblNpemUsIGVycjIgOj0gcC5SZWFkSTY0KCkKLSAgc2l6ZSA9IGludChuU2l6ZSkKLSAgcmV0dXJuIGVsZW1UeXBlLCBzaXplLCBlcnIyCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlTGlzdEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGlmIGlzTnVsbCwgZXJyIDo9IHAucmVhZElmTnVsbCgpOyBpc051bGwgfHwgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIGVycgotICB9Ci0gIGlmIF9QYXJzZUNvbnRleHQocC5wYXJzZUNvbnRleHRTdGFjay5MYXN0KCkpICE9IF9DT05URVhUX0lOX0xJU1QgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgdG8gYmUgaW4gdGhlIExpc3QgQ29udGV4dCwgYnV0IG5vdCBpbiBMaXN0IENvbnRleHQiKQotICB9Ci0gIGxpbmUsIGVyciA6PSBwLnJlYWRlci5SZWFkU3RyaW5nKEpTT05fUkJSQUNLRVRbMF0pCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi0gIH0KLSAgZm9yIF8sIGNoYXIgOj0gcmFuZ2UgbGluZSB7Ci0gICAgc3dpdGNoIGNoYXIgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgZm10LlNwcmludCgiRXhwZWN0aW5nIGVuZCBvZiBsaXN0IFwiXVwiLCBidXQgZm91bmQ6IFwiIiwgbGluZSwgIlwiIikpCi0gICAgY2FzZSAnICcsICdcbicsICdccicsICdcdCcsIGludChKU09OX1JCUkFDS0VUWzBdKToKLSAgICAgIGJyZWFrCi0gICAgfQotICB9Ci0gIHAucGFyc2VDb250ZXh0U3RhY2suUG9wKCkKLSAgcmV0dXJuIHAuUGFyc2VQb3N0VmFsdWUoKQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSByZWFkU2luZ2xlVmFsdWUoKSAoaW50ZXJmYWNle30sIFRUeXBlLCBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgZSA6PSBwLnJlYWROb25TaWduaWZpY2FudFdoaXRlc3BhY2UoKQotICBpZiBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIG5pbCwgVk9JRCwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgfQotICBiLCBlIDo9IHAucmVhZGVyLlBlZWsoMTApCi0gIGlmIGxlbihiKSA+IDAgewotICAgIGMgOj0gYlswXQotICAgIHN3aXRjaCBjIHsKLSAgICBjYXNlIEpTT05fTlVMTFswXToKLSAgICAgIGJ1ZiA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTlVMTCkpCi0gICAgICBfLCBlIDo9IHAucmVhZGVyLlJlYWQoYnVmKQotICAgICAgaWYgZSAhPSBuaWwgewotICAgICAgICByZXR1cm4gbmlsLCBWT0lELCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICAgICAgfQotICAgICAgaWYgc3RyaW5nKEpTT05fTlVMTCkgIT0gc3RyaW5nKGJ1ZikgewotICAgICAgICBlIDo9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsICJFeHBlY3RlZCAnIitzdHJpbmcoSlNPTl9OVUxMKSsiJyBidXQgZm91bmQgJyIrc3RyaW5nKGJ1ZikrIicgd2hpbGUgcGFyc2luZyBKU09OLiIpCi0gICAgICAgIHJldHVybiBuaWwsIFZPSUQsIGUKLSAgICAgIH0KLSAgICAgIHJldHVybiBuaWwsIFZPSUQsIG5pbAotICAgIGNhc2UgSlNPTl9RVU9URToKLSAgICAgIHAucmVhZGVyLlJlYWRCeXRlKCkKLSAgICAgIHYsIGUgOj0gcC5QYXJzZVN0cmluZ0JvZHkoKQotICAgICAgaWYgZSAhPSBuaWwgewotICAgICAgICByZXR1cm4gdiwgVVRGOCwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgICAgIH0KLSAgICAgIGlmIHYgPT0gSlNPTl9JTkZJTklUWSB7Ci0gICAgICAgIHJldHVybiBJTkZJTklUWSwgRE9VQkxFLCBuaWwKLSAgICAgIH0gZWxzZSBpZiB2ID09IEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgewotICAgICAgICByZXR1cm4gTkVHQVRJVkVfSU5GSU5JVFksIERPVUJMRSwgbmlsCi0gICAgICB9IGVsc2UgaWYgdiA9PSBKU09OX05BTiB7Ci0gICAgICAgIHJldHVybiBOQU4sIERPVUJMRSwgbmlsCi0gICAgICB9Ci0gICAgICByZXR1cm4gdiwgVVRGOCwgbmlsCi0gICAgY2FzZSBKU09OX1RSVUVbMF06Ci0gICAgICBidWYgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX1RSVUUpKQotICAgICAgXywgZSA6PSBwLnJlYWRlci5SZWFkKGJ1ZikKLSAgICAgIGlmIGUgIT0gbmlsIHsKLSAgICAgICAgcmV0dXJuIHRydWUsIEJPT0wsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gICAgICB9Ci0gICAgICBpZiBzdHJpbmcoSlNPTl9UUlVFKSAhPSBzdHJpbmcoYnVmKSB7Ci0gICAgICAgIGUgOj0gTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgIkV4cGVjdGVkICciK3N0cmluZyhKU09OX1RSVUUpKyInIGJ1dCBmb3VuZCAnIitzdHJpbmcoYnVmKSsiJyB3aGlsZSBwYXJzaW5nIEpTT04uIikKLSAgICAgICAgcmV0dXJuIHRydWUsIEJPT0wsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZSwgQk9PTCwgbmlsCi0gICAgY2FzZSBKU09OX0ZBTFNFWzBdOgotICAgICAgYnVmIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9GQUxTRSkpCi0gICAgICBfLCBlIDo9IHAucmVhZGVyLlJlYWQoYnVmKQotICAgICAgaWYgZSAhPSBuaWwgewotICAgICAgICByZXR1cm4gZmFsc2UsIEJPT0wsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gICAgICB9Ci0gICAgICBpZiBzdHJpbmcoSlNPTl9GQUxTRSkgIT0gc3RyaW5nKGJ1ZikgewotICAgICAgICBlIDo9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsICJFeHBlY3RlZCAnIitzdHJpbmcoSlNPTl9GQUxTRSkrIicgYnV0IGZvdW5kICciK3N0cmluZyhidWYpKyInIHdoaWxlIHBhcnNpbmcgSlNPTi4iKQotICAgICAgICByZXR1cm4gZmFsc2UsIEJPT0wsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2UsIEJPT0wsIG5pbAotICAgIGNhc2UgSlNPTl9MQlJBQ0tFVFswXToKLSAgICAgIF8sIGUgOj0gcC5yZWFkZXIuUmVhZEJ5dGUoKQotICAgICAgcmV0dXJuIG1ha2UoW11pbnRlcmZhY2V7fSwgMCksIExJU1QsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gICAgY2FzZSBKU09OX0xCUkFDRVswXToKLSAgICAgIF8sIGUgOj0gcC5yZWFkZXIuUmVhZEJ5dGUoKQotICAgICAgcmV0dXJuIG1ha2UobWFwW3N0cmluZ11pbnRlcmZhY2V7fSksIFNUUlVDVCwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgICBjYXNlICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ2UnLCAnRScsICcuJywgJysnLCAnLScsIEpTT05fSU5GSU5JVFlbMF0sIEpTT05fTkFOWzBdOgotICAgICAgLy8gYXNzdW1lIG51bWVyaWMKLSAgICAgIHYsIGUgOj0gcC5yZWFkTnVtZXJpYygpCi0gICAgICByZXR1cm4gdiwgRE9VQkxFLCBlCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBuaWwsIFZPSUQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsICJFeHBlY3RlZCBlbGVtZW50IGluIGxpc3QgYnV0IGZvdW5kICciK3N0cmluZyhjKSsiJyB3aGlsZSBwYXJzaW5nIEpTT04uIikKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5pbCwgVk9JRCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgIkNhbm5vdCByZWFkIGEgc2luZ2xlIGVsZW1lbnQgd2hpbGUgcGFyc2luZyBKU09OLiIpCi0KLX0KLQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSByZWFkSWZOdWxsKCkgKGJvb2wsIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBjb250IDo9IHRydWUKLSAgZm9yIHAucmVhZGVyLkJ1ZmZlcmVkKCkgPiAwICYmIGNvbnQgewotICAgIGIsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQotICAgIGlmIGxlbihiKSA8IDEgewotICAgICAgcmV0dXJuIGZhbHNlLCBuaWwKLSAgICB9Ci0gICAgc3dpdGNoIGJbMF0gewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2UsIG5pbAotICAgIGNhc2UgSlNPTl9OVUxMWzBdOgotICAgICAgY29udCA9IGZhbHNlCi0gICAgICBicmVhawotICAgIGNhc2UgJyAnLCAnXG4nLCAnXHInLCAnXHQnOgotICAgICAgcC5yZWFkZXIuUmVhZEJ5dGUoKQotICAgICAgYnJlYWsKLSAgICB9Ci0gIH0KLSAgaWYgcC5yZWFkZXIuQnVmZmVyZWQoKSA9PSAwIHsKLSAgICByZXR1cm4gZmFsc2UsIG5pbAotICB9Ci0gIGIsIF8gOj0gcC5yZWFkZXIuUGVlayhsZW4oSlNPTl9OVUxMKSkKLSAgaWYgc3RyaW5nKGIpID09IHN0cmluZyhKU09OX05VTEwpIHsKLSAgICBwLnJlYWRlci5SZWFkKGJbMDpsZW4oSlNPTl9OVUxMKV0pCi0gICAgcmV0dXJuIHRydWUsIG5pbAotICB9Ci0gIHJldHVybiBmYWxzZSwgbmlsCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIHJlYWRRdW90ZUlmTmV4dCgpIHsKLSAgaWYgcC5yZWFkZXIuQnVmZmVyZWQoKSA8IDEgewotICAgIHJldHVybgotICB9Ci0gIGIsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQotICBpZiBsZW4oYikgPiAwICYmIGJbMF0gPT0gSlNPTl9RVU9URSB7Ci0gICAgcC5yZWFkZXIuUmVhZEJ5dGUoKQotICB9Ci19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIHJlYWROdW1lcmljKCkgKE51bWVyaWMsIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBpc051bGwsIGVyciA6PSBwLnJlYWRJZk51bGwoKQotICBpZiBpc051bGwgfHwgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5VTUVSSUNfTlVMTCwgZXJyCi0gIH0KLSAgaGFzRGVjaW1hbFBvaW50IDo9IGZhbHNlCi0gIG5leHRDYW5CZVNpZ24gOj0gdHJ1ZQotICBoYXNFIDo9IGZhbHNlCi0gIE1BWF9MRU4gOj0gNDAKLSAgYnVmIDo9IGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgTUFYX0xFTikpCi0gIGNvbnRpbnVlRm9yIDo9IHRydWUKLSAgaW5RdW90ZXMgOj0gZmFsc2UKLSAgZm9yIGNvbnRpbnVlRm9yIHsKLSAgICBjLCBlcnIgOj0gcC5yZWFkZXIuUmVhZEJ5dGUoKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgaWYgZXJyID09IG9zLkVPRiB7Ci0gICAgICAgIGJyZWFrCi0gICAgICB9Ci0gICAgICByZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi0gICAgfQotICAgIHN3aXRjaCBjIHsKLSAgICBjYXNlICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JzoKLSAgICAgIGJ1Zi5Xcml0ZUJ5dGUoYykKLSAgICAgIG5leHRDYW5CZVNpZ24gPSBmYWxzZQotICAgIGNhc2UgJy4nOgotICAgICAgaWYgaGFzRGVjaW1hbFBvaW50IHsKLSAgICAgICAgcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgZm10LlNwcmludGYoIlVuYWJsZSB0byBwYXJzZSBudW1iZXIgd2l0aCBtdWx0aXBsZSBkZWNpbWFsIHBvaW50cyAnJXMuJyIsIGJ1Zi5TdHJpbmcoKSkpCi0gICAgICB9Ci0gICAgICBpZiBoYXNFIHsKLSAgICAgICAgcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgZm10LlNwcmludGYoIlVuYWJsZSB0byBwYXJzZSBudW1iZXIgd2l0aCBkZWNpbWFsIHBvaW50cyBpbiB0aGUgZXhwb25lbnQgJyVzLiciLCBidWYuU3RyaW5nKCkpKQotICAgICAgfQotICAgICAgYnVmLldyaXRlQnl0ZShjKQotICAgICAgaGFzRGVjaW1hbFBvaW50LCBuZXh0Q2FuQmVTaWduID0gdHJ1ZSwgZmFsc2UKLSAgICBjYXNlICdlJywgJ0UnOgotICAgICAgaWYgaGFzRSB7Ci0gICAgICAgIHJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsIGZtdC5TcHJpbnRmKCJVbmFibGUgdG8gcGFyc2UgbnVtYmVyIHdpdGggbXVsdGlwbGUgZXhwb25lbnRzICclcyVjJyIsIGJ1Zi5TdHJpbmcoKSwgYykpCi0gICAgICB9Ci0gICAgICBidWYuV3JpdGVCeXRlKGMpCi0gICAgICBoYXNFLCBuZXh0Q2FuQmVTaWduID0gdHJ1ZSwgdHJ1ZQotICAgIGNhc2UgJy0nLCAnKyc6Ci0gICAgICBpZiAhbmV4dENhbkJlU2lnbiB7Ci0gICAgICAgIHJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsIGZtdC5TcHJpbnQoIk5lZ2F0aXZlIHNpZ24gd2l0aGluIG51bWJlciIpKQotICAgICAgfQotICAgICAgYnVmLldyaXRlQnl0ZShjKQotICAgICAgbmV4dENhbkJlU2lnbiA9IGZhbHNlCi0gICAgY2FzZSAnICcsIDAsICdcdCcsICdcbicsICdccicsIEpTT05fUkJSQUNFWzBdLCBKU09OX1JCUkFDS0VUWzBdLCBKU09OX0NPTU1BWzBdLCBKU09OX0NPTE9OWzBdOgotICAgICAgcC5yZWFkZXIuVW5yZWFkQnl0ZSgpCi0gICAgICBjb250aW51ZUZvciA9IGZhbHNlCi0gICAgY2FzZSBKU09OX05BTlswXToKLSAgICAgIGlmIGJ1Zi5MZW4oKSA9PSAwIHsKLSAgICAgICAgYnVmZmVyIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9OQU4pKQotICAgICAgICBidWZmZXJbMF0gPSBjCi0gICAgICAgIF8sIGUgOj0gcC5yZWFkZXIuUmVhZChidWZmZXJbMTpdKQotICAgICAgICBpZiBlICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgICAgICAgfQotICAgICAgICBpZiBKU09OX05BTiAhPSBzdHJpbmcoYnVmZmVyKSB7Ci0gICAgICAgICAgZSA6PSBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgJyIrSlNPTl9OQU4rIicgYnV0IGZvdW5kICciK3N0cmluZyhidWZmZXIpKyInIHdoaWxlIHBhcnNpbmcgSlNPTi4iKQotICAgICAgICAgIHJldHVybiBOVU1FUklDX05VTEwsIGUKLSAgICAgICAgfQotICAgICAgICBpZiBpblF1b3RlcyB7Ci0gICAgICAgICAgcC5yZWFkUXVvdGVJZk5leHQoKQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOQU4sIG5pbAotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgZm10LlNwcmludGYoIlVuYWJsZSB0byBwYXJzZSBudW1iZXIgc3RhcnRpbmcgd2l0aCBjaGFyYWN0ZXIgJyVjJyIsIGMpKQotICAgICAgfQotICAgIGNhc2UgSlNPTl9JTkZJTklUWVswXToKLSAgICAgIGlmIGJ1Zi5MZW4oKSA9PSAwIHx8IChidWYuTGVuKCkgPT0gMSAmJiBidWYuQnl0ZXMoKVswXSA9PSAnKycpIHsKLSAgICAgICAgYnVmZmVyIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9JTkZJTklUWSkpCi0gICAgICAgIGJ1ZmZlclswXSA9IGMKLSAgICAgICAgXywgZSA6PSBwLnJlYWRlci5SZWFkKGJ1ZmZlclsxOl0pCi0gICAgICAgIGlmIGUgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICAgICAgICB9Ci0gICAgICAgIGlmIEpTT05fSU5GSU5JVFkgIT0gc3RyaW5nKGJ1ZmZlcikgewotICAgICAgICAgIGUgOj0gTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgIkV4cGVjdGVkICciK0pTT05fSU5GSU5JVFkrIicgYnV0IGZvdW5kICciK3N0cmluZyhidWZmZXIpKyInIHdoaWxlIHBhcnNpbmcgSlNPTi4iKQotICAgICAgICAgIHJldHVybiBOVU1FUklDX05VTEwsIGUKLSAgICAgICAgfQotICAgICAgICBpZiBpblF1b3RlcyB7Ci0gICAgICAgICAgcC5yZWFkUXVvdGVJZk5leHQoKQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJTkZJTklUWSwgbmlsCi0gICAgICB9IGVsc2UgaWYgYnVmLkxlbigpID09IDEgJiYgYnVmLkJ5dGVzKClbMF0gPT0gSlNPTl9ORUdBVElWRV9JTkZJTklUWVswXSB7Ci0gICAgICAgIGJ1ZmZlciA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpKQotICAgICAgICBidWZmZXJbMF0gPSBKU09OX05FR0FUSVZFX0lORklOSVRZWzBdCi0gICAgICAgIGJ1ZmZlclsxXSA9IGMKLSAgICAgICAgXywgZSA6PSBwLnJlYWRlci5SZWFkKGJ1ZmZlclsyOl0pCi0gICAgICAgIGlmIGUgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICAgICAgICB9Ci0gICAgICAgIGlmIEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgIT0gc3RyaW5nKGJ1ZmZlcikgewotICAgICAgICAgIGUgOj0gTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgIkV4cGVjdGVkICciK0pTT05fTkVHQVRJVkVfSU5GSU5JVFkrIicgYnV0IGZvdW5kICciK3N0cmluZyhidWZmZXIpKyInIHdoaWxlIHBhcnNpbmcgSlNPTi4iKQotICAgICAgICAgIHJldHVybiBOVU1FUklDX05VTEwsIGUKLSAgICAgICAgfQotICAgICAgICBpZiBpblF1b3RlcyB7Ci0gICAgICAgICAgcC5yZWFkUXVvdGVJZk5leHQoKQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBORUdBVElWRV9JTkZJTklUWSwgbmlsCi0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCBmbXQuU3ByaW50ZigiVW5hYmxlIHRvIHBhcnNlIG51bWJlciBzdGFydGluZyB3aXRoIGNoYXJhY3RlciAnJWMnIGR1ZSB0byBleGlzdGluZyBidWZmZXIgJXMiLCBjLCBidWYuU3RyaW5nKCkpKQotICAgICAgfQotICAgIGNhc2UgSlNPTl9RVU9URToKLSAgICAgIGlmICFpblF1b3RlcyB7Ci0gICAgICAgIGluUXVvdGVzID0gdHJ1ZQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYnJlYWsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgZm10LlNwcmludGYoIlVuYWJsZSB0byBwYXJzZSBudW1iZXIgc3RhcnRpbmcgd2l0aCBjaGFyYWN0ZXIgJyVjJyIsIGMpKQotICAgIH0KLSAgfQotICBpZiBidWYuTGVuKCkgPT0gMCB7Ci0gICAgcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgZm10LlNwcmludCgiVW5hYmxlIHRvIHBhcnNlIG51bWJlciBmcm9tIGVtcHR5IHN0cmluZyAnJyIpKQotICB9Ci0gIHJldHVybiBOZXdOdW1lcmljRnJvbUpTT05TdHJpbmcoYnVmLlN0cmluZygpLCBmYWxzZSksIG5pbAotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90c2ltcGxlX2pzb25fcHJvdG9jb2xfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvdHNpbXBsZV9qc29uX3Byb3RvY29sX3Rlc3QuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1N2Q1NWIuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90c2ltcGxlX2pzb25fcHJvdG9jb2xfdGVzdC5nbworKysgL2Rldi9udWxsCkBAIC0xLDY2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0X3Rlc3QKLQotaW1wb3J0ICgKLSAgLiAidGhyaWZ0IgotICAiZW5jb2RpbmcvYmFzZTY0IgotICAiZm10IgotICAianNvbiIKLSAgIm1hdGgiCi0gICJzdHJjb252IgotICAic3RyaW5ncyIKLSAgInRlc3RpbmciCi0pCi0KLWZ1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sQm9vbCh0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAiYm9vbGVhbiIKLSAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gIHAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKLSAgZm9yIF8sIHZhbHVlIDo9IHJhbmdlIEJPT0xfVkFMVUVTIHsKLSAgICBpZiBlIDo9IHAuV3JpdGVCb29sKHZhbHVlKTsgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIGlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgcyA6PSB0cmFucy5TdHJpbmcoKQotICAgIGlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgewotICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCi0gICAgfQotICAgIHYgOj0gZmFsc2UKLSAgICBpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgIH0KLSAgICB0cmFucy5SZXNldCgpCi0gIH0KLSAgdHJhbnMuQ2xvc2UoKQotfQotCi1mdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sQm9vbCh0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAiYm9vbGVhbiIKLSAgZm9yIF8sIHZhbHVlIDo9IHJhbmdlIEJPT0xfVkFMVUVTIHsKLSAgICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgICBwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCi0gICAgaWYgdmFsdWUgewotICAgICAgdHJhbnMuV3JpdGUoSlNPTl9UUlVFKQotICAgIH0gZWxzZSB7Ci0gICAgICB0cmFucy5Xcml0ZShKU09OX0ZBTFNFKQotICAgIH0KLSAgICB0cmFucy5GbHVzaCgpCi0gICAgcyA6PSB0cmFucy5TdHJpbmcoKQotICAgIHYsIGUgOj0gcC5SZWFkQm9vbCgpCi0gICAgaWYgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgaWYgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICAgIHRyYW5zLkNsb3NlKCkKLSAgfQotfQotCi1mdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEJ5dGUodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gImJ5dGUiCi0gIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICBwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBCWVRFX1ZBTFVFUyB7Ci0gICAgaWYgZSA6PSBwLldyaXRlQnl0ZSh2YWx1ZSk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgICBpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQotICAgIH0KLSAgICB2IDo9IGJ5dGUoMCkKLSAgICBpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgIH0KLSAgICB0cmFucy5SZXNldCgpCi0gIH0KLSAgdHJhbnMuQ2xvc2UoKQotfQotCi1mdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sQnl0ZSh0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAiYnl0ZSIKLSAgZm9yIF8sIHZhbHVlIDo9IHJhbmdlIEJZVEVfVkFMVUVTIHsKLSAgICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgICBwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCi0gICAgdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQotICAgIHRyYW5zLkZsdXNoKCkKLSAgICBzIDo9IHRyYW5zLlN0cmluZygpCi0gICAgdiwgZSA6PSBwLlJlYWRCeXRlKCkKLSAgICBpZiBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBpZiB2ICE9IHZhbHVlIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgIH0KLSAgICBpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgIH0KLSAgICB0cmFucy5SZXNldCgpCi0gICAgdHJhbnMuQ2xvc2UoKQotICB9Ci19Ci0KLWZ1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sSTE2KHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJpbnQxNiIKLSAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gIHAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKLSAgZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDE2X1ZBTFVFUyB7Ci0gICAgaWYgZSA6PSBwLldyaXRlSTE2KHZhbHVlKTsgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIGlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgcyA6PSB0cmFucy5TdHJpbmcoKQotICAgIGlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgewotICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCi0gICAgfQotICAgIHYgOj0gaW50MTYoMCkKLSAgICBpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgIH0KLSAgICB0cmFucy5SZXNldCgpCi0gIH0KLSAgdHJhbnMuQ2xvc2UoKQotfQotCi1mdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sSTE2KHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJpbnQxNiIKLSAgZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDE2X1ZBTFVFUyB7Ci0gICAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gICAgcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQotICAgIHRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShpbnQodmFsdWUpKSkKLSAgICB0cmFucy5GbHVzaCgpCi0gICAgcyA6PSB0cmFucy5TdHJpbmcoKQotICAgIHYsIGUgOj0gcC5SZWFkSTE2KCkKLSAgICBpZiBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBpZiB2ICE9IHZhbHVlIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgIH0KLSAgICBpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgIH0KLSAgICB0cmFucy5SZXNldCgpCi0gICAgdHJhbnMuQ2xvc2UoKQotICB9Ci19Ci0KLWZ1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sSTMyKHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJpbnQzMiIKLSAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gIHAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKLSAgZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDMyX1ZBTFVFUyB7Ci0gICAgaWYgZSA6PSBwLldyaXRlSTMyKHZhbHVlKTsgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIGlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgcyA6PSB0cmFucy5TdHJpbmcoKQotICAgIGlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgewotICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCi0gICAgfQotICAgIHYgOj0gaW50MzIoMCkKLSAgICBpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgIH0KLSAgICB0cmFucy5SZXNldCgpCi0gIH0KLSAgdHJhbnMuQ2xvc2UoKQotfQotCi1mdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sSTMyKHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJpbnQzMiIKLSAgZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDMyX1ZBTFVFUyB7Ci0gICAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gICAgcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQotICAgIHRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShpbnQodmFsdWUpKSkKLSAgICB0cmFucy5GbHVzaCgpCi0gICAgcyA6PSB0cmFucy5TdHJpbmcoKQotICAgIHYsIGUgOj0gcC5SZWFkSTMyKCkKLSAgICBpZiBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBpZiB2ICE9IHZhbHVlIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgIH0KLSAgICBpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgIH0KLSAgICB0cmFucy5SZXNldCgpCi0gICAgdHJhbnMuQ2xvc2UoKQotICB9Ci19Ci0KLWZ1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sSTY0KHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJpbnQ2NCIKLSAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gIHAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKLSAgZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDY0X1ZBTFVFUyB7Ci0gICAgaWYgZSA6PSBwLldyaXRlSTY0KHZhbHVlKTsgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIGlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgcyA6PSB0cmFucy5TdHJpbmcoKQotICAgIGlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgewotICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCi0gICAgfQotICAgIHYgOj0gaW50NjQoMCkKLSAgICBpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgIH0KLSAgICB0cmFucy5SZXNldCgpCi0gIH0KLSAgdHJhbnMuQ2xvc2UoKQotfQotCi1mdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sSTY0KHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJpbnQ2NCIKLSAgZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDY0X1ZBTFVFUyB7Ci0gICAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gICAgcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQotICAgIHRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYTY0KHZhbHVlKSkKLSAgICB0cmFucy5GbHVzaCgpCi0gICAgcyA6PSB0cmFucy5TdHJpbmcoKQotICAgIHYsIGUgOj0gcC5SZWFkSTY0KCkKLSAgICBpZiBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBpZiB2ICE9IHZhbHVlIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgIH0KLSAgICBpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgIH0KLSAgICB0cmFucy5SZXNldCgpCi0gICAgdHJhbnMuQ2xvc2UoKQotICB9Ci19Ci0KLWZ1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sRG91YmxlKHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJkb3VibGUiCi0gIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICBwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKLSAgICBpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBzIDo9IHRyYW5zLlN0cmluZygpCi0gICAgaWYgbWF0aC5Jc0luZih2YWx1ZSwgMSkgewotICAgICAgaWYgcyAhPSBKc29uUXVvdGUoSlNPTl9JTkZJTklUWSkgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgSnNvblF1b3RlKEpTT05fSU5GSU5JVFkpKQotICAgICAgfQotICAgIH0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAtMSkgewotICAgICAgaWYgcyAhPSBKc29uUXVvdGUoSlNPTl9ORUdBVElWRV9JTkZJTklUWSkgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgSnNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpKQotICAgICAgfQotICAgIH0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7Ci0gICAgICBpZiBzICE9IEpzb25RdW90ZShKU09OX05BTikgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgSnNvblF1b3RlKEpTT05fTkFOKSkKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgcyAhPSBmbXQuU3ByaW50KHZhbHVlKSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQotICAgICAgfQotICAgICAgdiA6PSBmbG9hdDY0KDApCi0gICAgICBpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgICB9Ci0gICAgfQotICAgIHRyYW5zLlJlc2V0KCkKLSAgfQotICB0cmFucy5DbG9zZSgpCi19Ci0KLWZ1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xEb3VibGUodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gImRvdWJsZSIKLSAgZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgewotICAgIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICAgIHAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKLSAgICBuIDo9IE5ld051bWVyaWNGcm9tRG91YmxlKHZhbHVlKQotICAgIHRyYW5zLldyaXRlU3RyaW5nKG4uU3RyaW5nKCkpCi0gICAgdHJhbnMuRmx1c2goKQotICAgIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgICB2LCBlIDo9IHAuUmVhZERvdWJsZSgpCi0gICAgaWYgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgaWYgbWF0aC5Jc0luZih2YWx1ZSwgMSkgewotICAgICAgaWYgIW1hdGguSXNJbmYodiwgMSkgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgLTEpIHsKLSAgICAgIGlmICFtYXRoLklzSW5mKHYsIC0xKSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgICAgfQotICAgIH0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7Ci0gICAgICBpZiAhbWF0aC5Jc05hTih2KSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiB2ICE9IHZhbHVlIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgICB9Ci0gICAgICBpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgICB9Ci0gICAgfQotICAgIHRyYW5zLlJlc2V0KCkKLSAgICB0cmFucy5DbG9zZSgpCi0gIH0KLX0KLQotZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xTdHJpbmcodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gInN0cmluZyIKLSAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gIHAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKLSAgZm9yIF8sIHZhbHVlIDo9IHJhbmdlIFNUUklOR19WQUxVRVMgewotICAgIGlmIGUgOj0gcC5Xcml0ZVN0cmluZyh2YWx1ZSk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgICBpZiBzWzBdICE9ICciJyB8fCBzW2xlbihzKS0xXSAhPSAnIicgewotICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJyV2Jywgd3JvdGUgJyV2JywgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIGZtdC5TcHJpbnQoIlwiIiwgdmFsdWUsICJcIiIpKQotICAgIH0KLSAgICB2IDo9IG5ldyhzdHJpbmcpCi0gICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgdik7IGVyciAhPSBuaWwgfHwgKnYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgKnYpCi0gICAgfQotICAgIHRyYW5zLlJlc2V0KCkKLSAgfQotICB0cmFucy5DbG9zZSgpCi19Ci0KLWZ1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xTdHJpbmcodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gInN0cmluZyIKLSAgZm9yIF8sIHZhbHVlIDo9IHJhbmdlIFNUUklOR19WQUxVRVMgewotICAgIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICAgIHAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKLSAgICB0cmFucy5Xcml0ZVN0cmluZyhKc29uUXVvdGUodmFsdWUpKQotICAgIHRyYW5zLkZsdXNoKCkKLSAgICBzIDo9IHRyYW5zLlN0cmluZygpCi0gICAgdiwgZSA6PSBwLlJlYWRTdHJpbmcoKQotICAgIGlmIGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIGlmIHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgfQotICAgIHYxIDo9IG5ldyhzdHJpbmcpCi0gICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgdjEpOyBlcnIgIT0gbmlsIHx8ICp2MSAhPSB2YWx1ZSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCAqdjEpCi0gICAgfQotICAgIHRyYW5zLlJlc2V0KCkKLSAgICB0cmFucy5DbG9zZSgpCi0gIH0KLX0KLQotZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xCaW5hcnkodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gImJpbmFyeSIKLSAgdmFsdWUgOj0gcHJvdG9jb2xfYmRhdGEKLSAgYjY0dmFsdWUgOj0gbWFrZShbXWJ5dGUsIGJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGVkTGVuKGxlbihwcm90b2NvbF9iZGF0YSkpKQotICBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlKGI2NHZhbHVlLCB2YWx1ZSkKLSAgYjY0U3RyaW5nIDo9IHN0cmluZyhiNjR2YWx1ZSkKLSAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gIHAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKLSAgaWYgZSA6PSBwLldyaXRlQmluYXJ5KHZhbHVlKTsgZSAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICB9Ci0gIGlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gIH0KLSAgcyA6PSB0cmFucy5TdHJpbmcoKQotICBpZiBzICE9IGZtdC5TcHJpbnQoIlwiIiwgYjY0U3RyaW5nLCAiXCIiKSB7Ci0gICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXZcbiAgd3JvdGU6ICV2XG5leHBlY3RlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgIlwiIitiNjRTdHJpbmcrIlwiIikKLSAgfQotICB2MSA6PSBuZXcoc3RyaW5nKQotICBpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCB2MSk7IGVyciAhPSBuaWwgfHwgKnYxICE9IGI2NFN0cmluZyB7Ci0gICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgKnYxKQotICB9Ci0gIHRyYW5zLkNsb3NlKCkKLX0KLQotZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEJpbmFyeSh0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAiYmluYXJ5IgotICB2YWx1ZSA6PSBwcm90b2NvbF9iZGF0YQotICBiNjR2YWx1ZSA6PSBtYWtlKFtdYnl0ZSwgYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZWRMZW4obGVuKHByb3RvY29sX2JkYXRhKSkpCi0gIGJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGUoYjY0dmFsdWUsIHZhbHVlKQotICBiNjRTdHJpbmcgOj0gc3RyaW5nKGI2NHZhbHVlKQotICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQotICB0cmFucy5Xcml0ZVN0cmluZyhKc29uUXVvdGUoYjY0U3RyaW5nKSkKLSAgdHJhbnMuRmx1c2goKQotICBzIDo9IHRyYW5zLlN0cmluZygpCi0gIHYsIGUgOj0gcC5SZWFkQmluYXJ5KCkKLSAgaWYgZSAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gIH0KLSAgaWYgbGVuKHYpICE9IGxlbih2YWx1ZSkgewotICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlIGxlbmd0aCAldiwgd3JvdGU6ICV2LCByZWNlaXZlZCBsZW5ndGg6ICV2IiwgdGhldHlwZSwgbGVuKHZhbHVlKSwgcywgbGVuKHYpKQotICB9Ci0gIGZvciBpIDo9IDA7IGkgPCBsZW4odik7IGkrKyB7Ci0gICAgaWYgdltpXSAhPSB2YWx1ZVtpXSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAlZCB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCBpLCB2YWx1ZVtpXSwgcywgdltpXSkKLSAgICB9Ci0gIH0KLSAgdjEgOj0gbmV3KHN0cmluZykKLSAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgdjEpOyBlcnIgIT0gbmlsIHx8ICp2MSAhPSBiNjRTdHJpbmcgewotICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsICp2MSkKLSAgfQotICB0cmFucy5SZXNldCgpCi0gIHRyYW5zLkNsb3NlKCkKLX0KLQotZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xMaXN0KHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJsaXN0IgotICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQotICBwLldyaXRlTGlzdEJlZ2luKFRUeXBlKERPVUJMRSksIGxlbihET1VCTEVfVkFMVUVTKSkKLSAgZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgewotICAgIGlmIGUgOj0gcC5Xcml0ZURvdWJsZSh2YWx1ZSk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgfQotICBwLldyaXRlTGlzdEVuZCgpCi0gIGlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgZS5TdHJpbmcoKSkKLSAgfQotICBzdHIgOj0gdHJhbnMuU3RyaW5nKCkKLSAgc3RyMSA6PSBuZXcoW11pbnRlcmZhY2V7fSkKLSAgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzdHIpLCBzdHIxKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIGRlY29kZSAlcywgd3JvdGU6ICVzIiwgdGhldHlwZSwgc3RyKQotICB9Ci0gIGwgOj0gKnN0cjEKLSAgaWYgbGVuKGwpIDwgMiB7Ci0gICAgdC5GYXRhbGYoIkxpc3QgbXVzdCBiZSBhdCBsZWFzdCBvZiBsZW5ndGggdHdvIHRvIGluY2x1ZGUgbWV0YWRhdGEiKQotICB9Ci0gIGlmIGludChsWzBdLihmbG9hdDY0KSkgIT0gRE9VQkxFIHsKLSAgICB0LkZhdGFsKCJJbnZhbGlkIHR5cGUgZm9yIGxpc3QsIGV4cGVjdGVkOiAiLCBET1VCTEUsICIsIGJ1dCB3YXM6ICIsIGxbMF0pCi0gIH0KLSAgaWYgaW50KGxbMV0uKGZsb2F0NjQpKSAhPSBsZW4oRE9VQkxFX1ZBTFVFUykgewotICAgIHQuRmF0YWwoIkludmFsaWQgbGVuZ3RoIGZvciBsaXN0LCBleHBlY3RlZDogIiwgbGVuKERPVUJMRV9WQUxVRVMpLCAiLCBidXQgd2FzOiAiLCBsWzFdKQotICB9Ci0gIGZvciBrLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKLSAgICBzIDo9IGxbaysyXQotICAgIGlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKLSAgICAgIGlmIHMuKHN0cmluZykgIT0gSlNPTl9JTkZJTklUWSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywgSnNvblF1b3RlKEpTT05fSU5GSU5JVFkpLCBzdHIpCi0gICAgICB9Ci0gICAgfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIDApIHsKLSAgICAgIGlmIHMuKHN0cmluZykgIT0gSlNPTl9ORUdBVElWRV9JTkZJTklUWSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywgSnNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpLCBzdHIpCi0gICAgICB9Ci0gICAgfSBlbHNlIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKLSAgICAgIGlmIHMuKHN0cmluZykgIT0gSlNPTl9OQU4gewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBKc29uUXVvdGUoSlNPTl9OQU4pLCBzdHIpCi0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIHMuKGZsb2F0NjQpICE9IHZhbHVlIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJyIsIHRoZXR5cGUsIHZhbHVlLCBzKQotICAgICAgfQotICAgIH0KLSAgICB0cmFucy5SZXNldCgpCi0gIH0KLSAgdHJhbnMuQ2xvc2UoKQotfQotCi1mdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbFNldCh0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAic2V0IgotICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQotICBwLldyaXRlU2V0QmVnaW4oVFR5cGUoRE9VQkxFKSwgbGVuKERPVUJMRV9WQUxVRVMpKQotICBmb3IgXywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7Ci0gICAgaWYgZSA6PSBwLldyaXRlRG91YmxlKHZhbHVlKTsgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICB9Ci0gIHAuV3JpdGVTZXRFbmQoKQotICBpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuU3RyaW5nKCkpCi0gIH0KLSAgc3RyIDo9IHRyYW5zLlN0cmluZygpCi0gIHN0cjEgOj0gbmV3KFtdaW50ZXJmYWNle30pCi0gIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUoc3RyKSwgc3RyMSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byBkZWNvZGUgJXMsIHdyb3RlOiAlcyIsIHRoZXR5cGUsIHN0cikKLSAgfQotICBsIDo9ICpzdHIxCi0gIGlmIGxlbihsKSA8IDIgewotICAgIHQuRmF0YWxmKCJTZXQgbXVzdCBiZSBhdCBsZWFzdCBvZiBsZW5ndGggdHdvIHRvIGluY2x1ZGUgbWV0YWRhdGEiKQotICB9Ci0gIGlmIGludChsWzBdLihmbG9hdDY0KSkgIT0gRE9VQkxFIHsKLSAgICB0LkZhdGFsKCJJbnZhbGlkIHR5cGUgZm9yIHNldCwgZXhwZWN0ZWQ6ICIsIERPVUJMRSwgIiwgYnV0IHdhczogIiwgbFswXSkKLSAgfQotICBpZiBpbnQobFsxXS4oZmxvYXQ2NCkpICE9IGxlbihET1VCTEVfVkFMVUVTKSB7Ci0gICAgdC5GYXRhbCgiSW52YWxpZCBsZW5ndGggZm9yIHNldCwgZXhwZWN0ZWQ6ICIsIGxlbihET1VCTEVfVkFMVUVTKSwgIiwgYnV0IHdhczogIiwgbFsxXSkKLSAgfQotICBmb3IgaywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7Ci0gICAgcyA6PSBsW2srMl0KLSAgICBpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7Ci0gICAgICBpZiBzLihzdHJpbmcpICE9IEpTT05fSU5GSU5JVFkgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIEpzb25RdW90ZShKU09OX0lORklOSVRZKSwgc3RyKQotICAgICAgfQotICAgIH0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAwKSB7Ci0gICAgICBpZiBzLihzdHJpbmcpICE9IEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIEpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSwgc3RyKQotICAgICAgfQotICAgIH0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7Ci0gICAgICBpZiBzLihzdHJpbmcpICE9IEpTT05fTkFOIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywgSnNvblF1b3RlKEpTT05fTkFOKSwgc3RyKQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiBzLihmbG9hdDY0KSAhPSB2YWx1ZSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcyciLCB0aGV0eXBlLCB2YWx1ZSwgcykKLSAgICAgIH0KLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICB9Ci0gIHRyYW5zLkNsb3NlKCkKLX0KLQotZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xNYXAodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gIm1hcCIKLSAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gIHAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKLSAgcC5Xcml0ZU1hcEJlZ2luKFRUeXBlKEkzMiksIFRUeXBlKERPVUJMRSksIGxlbihET1VCTEVfVkFMVUVTKSkKLSAgZm9yIGssIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgewotICAgIGlmIGUgOj0gcC5Xcml0ZUkzMihpbnQzMihrKSk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMga2V5IGludDMyIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCBrLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlIGZsb2F0NjQgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgfQotICBwLldyaXRlTWFwRW5kKCkKLSAgaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCBlLlN0cmluZygpKQotICB9Ci0gIHN0ciA6PSB0cmFucy5TdHJpbmcoKQotICBpZiBzdHJbMF0gIT0gJ1snIHx8IHN0cltsZW4oc3RyKS0xXSAhPSAnXScgewotICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzLCB3cm90ZTogJXEsIGluIGdvOiAlcSIsIHRoZXR5cGUsIHN0ciwgRE9VQkxFX1ZBTFVFUykKLSAgfQotICBsIDo9IHN0cmluZ3MuU3BsaXQoc3RyWzE6bGVuKHN0ciktMV0sICIsIiwgLTEpCi0gIGlmIGxlbihsKSA8IDMgewotICAgIHQuRmF0YWwoIkV4cGVjdGVkIGxpc3Qgb2YgYXQgbGVhc3QgbGVuZ3RoIDMgZm9yIG1hcCBmb3IgbWV0YWRhdGEsIGJ1dCB3YXMgb2YgbGVuZ3RoICIsIGxlbihsKSkKLSAgfQotICBleHBlY3RlZEtleVR5cGUsIF8gOj0gc3RyY29udi5BdG9pKGxbMF0pCi0gIGV4cGVjdGVkVmFsdWVUeXBlLCBfIDo9IHN0cmNvbnYuQXRvaShsWzFdKQotICBleHBlY3RlZFNpemUsIF8gOj0gc3RyY29udi5BdG9pKGxbMl0pCi0gIGlmIGV4cGVjdGVkS2V5VHlwZSAhPSBJMzIgewotICAgIHQuRmF0YWwoIkV4cGVjdGVkIG1hcCBrZXkgdHlwZSAiLCBJMzIsICIsIGJ1dCB3YXMgIiwgbFswXSkKLSAgfQotICBpZiBleHBlY3RlZFZhbHVlVHlwZSAhPSBET1VCTEUgewotICAgIHQuRmF0YWwoIkV4cGVjdGVkIG1hcCB2YWx1ZSB0eXBlICIsIERPVUJMRSwgIiwgYnV0IHdhcyAiLCBsWzFdKQotICB9Ci0gIGlmIGV4cGVjdGVkU2l6ZSAhPSBsZW4oRE9VQkxFX1ZBTFVFUykgewotICAgIHQuRmF0YWwoIkV4cGVjdGVkIG1hcCBzaXplIG9mICIsIGxlbihET1VCTEVfVkFMVUVTKSwgIiwgYnV0IHdhcyAiLCBsWzJdKQotICB9Ci0gIGZvciBrLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKLSAgICBzdHJrIDo9IGxbayoyKzNdCi0gICAgc3RydiA6PSBsW2sqMis0XQotICAgIGlrLCBlcnIgOj0gc3RyY29udi5BdG9pKHN0cmspCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBpbmRleCAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYsIGVycm9yOiAlcyIsIHRoZXR5cGUsIGssIHN0cmssIHN0cmluZyhrKSwgZXJyLlN0cmluZygpKQotICAgIH0KLSAgICBpZiBpayAhPSBrIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGluZGV4ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIGssIHN0cmssIGspCi0gICAgfQotICAgIHMgOj0gc3RydgotICAgIGlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKLSAgICAgIGlmIHMgIT0gSnNvblF1b3RlKEpTT05fSU5GSU5JVFkpIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIEpzb25RdW90ZShKU09OX0lORklOSVRZKSkKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgMCkgewotICAgICAgaWYgcyAhPSBKc29uUXVvdGUoSlNPTl9ORUdBVElWRV9JTkZJTklUWSkgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywgSnNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpKQotICAgICAgfQotICAgIH0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7Ci0gICAgICBpZiBzICE9IEpzb25RdW90ZShKU09OX05BTikgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIEpzb25RdW90ZShKU09OX05BTikpCi0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV4cGVjdGVkIDo9IHN0cmNvbnYuRnRvYTY0KHZhbHVlLCAnZycsIDEwKQotICAgICAgaWYgcyAhPSBleHBlY3RlZCB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGV4cGVjdGVkKQotICAgICAgfQotICAgICAgdiA6PSBmbG9hdDY0KDApCi0gICAgICBpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgICB9Ci0gICAgfQotICAgIHRyYW5zLlJlc2V0KCkKLSAgfQotICB0cmFucy5DbG9zZSgpCi19Ci0KLQotZnVuYyBUZXN0UmVhZFdyaXRlU2ltcGxlSlNPTlN0cnVjdCh0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAic3RydWN0IgotICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQotICBvcmlnIDo9IE5ld1dvcmsoKQotICBvcmlnLk51bTEgPSAyNQotICBvcmlnLk51bTIgPSAxMDIKLSAgb3JpZy5PcCA9IEFERAotICBvcmlnLkNvbW1lbnQgPSAiQWRkOiAyNSArIDEwMiIKLSAgaWYgZSA6PSBvcmlnLldyaXRlKHApOyBlICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAlI3YgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIG9yaWcsIGUuU3RyaW5nKCkpCi0gIH0KLSAgdC5Mb2coIk1lbW9yeSBidWZmZXIgY29udGVudHM6ICIsIHRyYW5zLlN0cmluZygpKQotICByZWFkIDo9IE5ld1dvcmsoKQotICBlIDo9IHJlYWQuUmVhZChwKQotICB0LkxvZ2YoIlJlYWQgJXMgdmFsdWU6ICUjdiIsIHRoZXR5cGUsIHJlYWQpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIGUuU3RyaW5nKCkpCi0gIH0KLSAgaWYgIW9yaWcuRXF1YWxzKHJlYWQpIHsKLSAgICB0LkZhdGFsZigiT3JpZ2luYWwgV3JpdGUgIT0gUmVhZDogJSN2ICE9ICUjdiAiLCBvcmlnLCByZWFkKQotICB9Ci19Ci0KLWZ1bmMgVGVzdFJlYWRXcml0ZVNpbXBsZUpTT05Qcm90b2NvbCh0ICp0ZXN0aW5nLlQpIHsKLSAgUmVhZFdyaXRlUHJvdG9jb2xUZXN0KHQsIE5ld1RTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KCkpCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RzaW1wbGVfc2VydmVyLmdvIGIvbGliL2dvL3RocmlmdC90c2ltcGxlX3NlcnZlci5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM3ZDY1Ni4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3RzaW1wbGVfc2VydmVyLmdvCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnQKLQotaW1wb3J0ICgKLSAgIm9zIgotKQotCi0KLS8qKgotICogU2ltcGxlIHNpbmdsZXRocmVhZGVkIHNlcnZlciBmb3IgdGVzdGluZy4KLSAqCi0gKi8KLXR5cGUgVFNpbXBsZVNlcnZlciBzdHJ1Y3QgewotICBzdG9wcGVkIGJvb2wKLQotICBwcm9jZXNzb3JGYWN0b3J5ICAgICAgIFRQcm9jZXNzb3JGYWN0b3J5Ci0gIHNlcnZlclRyYW5zcG9ydCAgICAgICAgVFNlcnZlclRyYW5zcG9ydAotICBpbnB1dFRyYW5zcG9ydEZhY3RvcnkgIFRUcmFuc3BvcnRGYWN0b3J5Ci0gIG91dHB1dFRyYW5zcG9ydEZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnkKLSAgaW5wdXRQcm90b2NvbEZhY3RvcnkgICBUUHJvdG9jb2xGYWN0b3J5Ci0gIG91dHB1dFByb3RvY29sRmFjdG9yeSAgVFByb3RvY29sRmFjdG9yeQotfQotCi1mdW5jIE5ld1RTaW1wbGVTZXJ2ZXIyKHByb2Nlc3NvciBUUHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQgVFNlcnZlclRyYW5zcG9ydCkgKlRTaW1wbGVTZXJ2ZXIgewotICByZXR1cm4gTmV3VFNpbXBsZVNlcnZlckZhY3RvcnkyKE5ld1RQcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCkKLX0KLQotZnVuYyBOZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IgVFByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0IFRTZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSBUUHJvdG9jb2xGYWN0b3J5KSAqVFNpbXBsZVNlcnZlciB7Ci0gIHJldHVybiBOZXdUU2ltcGxlU2VydmVyRmFjdG9yeTQoTmV3VFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwKLSAgICBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICBwcm90b2NvbEZhY3RvcnksCi0gICkKLX0KLQotZnVuYyBOZXdUU2ltcGxlU2VydmVyNihwcm9jZXNzb3IgVFByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0IFRTZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSwgaW5wdXRQcm90b2NvbEZhY3RvcnkgVFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5IFRQcm90b2NvbEZhY3RvcnkpICpUU2ltcGxlU2VydmVyIHsKLSAgcmV0dXJuIE5ld1RTaW1wbGVTZXJ2ZXJGYWN0b3J5NihOZXdUUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLAotICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICkKLX0KLQotZnVuYyBOZXdUU2ltcGxlU2VydmVyRmFjdG9yeTIocHJvY2Vzc29yRmFjdG9yeSBUUHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0IFRTZXJ2ZXJUcmFuc3BvcnQpICpUU2ltcGxlU2VydmVyIHsKLSAgcmV0dXJuIE5ld1RTaW1wbGVTZXJ2ZXJGYWN0b3J5Nihwcm9jZXNzb3JGYWN0b3J5LAotICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICBOZXdUVHJhbnNwb3J0RmFjdG9yeSgpLAotICAgIE5ld1RUcmFuc3BvcnRGYWN0b3J5KCksCi0gICAgTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSwKLSAgICBOZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpLAotICApCi19Ci0KLWZ1bmMgTmV3VFNpbXBsZVNlcnZlckZhY3Rvcnk0KHByb2Nlc3NvckZhY3RvcnkgVFByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCBUU2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkgVFByb3RvY29sRmFjdG9yeSkgKlRTaW1wbGVTZXJ2ZXIgewotICByZXR1cm4gTmV3VFNpbXBsZVNlcnZlckZhY3Rvcnk2KHByb2Nlc3NvckZhY3RvcnksCi0gICAgc2VydmVyVHJhbnNwb3J0LAotICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICBwcm90b2NvbEZhY3RvcnksCi0gICAgcHJvdG9jb2xGYWN0b3J5LAotICApCi19Ci0KLWZ1bmMgTmV3VFNpbXBsZVNlcnZlckZhY3Rvcnk2KHByb2Nlc3NvckZhY3RvcnkgVFByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCBUU2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnksIGlucHV0UHJvdG9jb2xGYWN0b3J5IFRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSBUUHJvdG9jb2xGYWN0b3J5KSAqVFNpbXBsZVNlcnZlciB7Ci0gIHJldHVybiAmVFNpbXBsZVNlcnZlcntwcm9jZXNzb3JGYWN0b3J5OiBwcm9jZXNzb3JGYWN0b3J5LAotICAgIHNlcnZlclRyYW5zcG9ydDogICAgICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk6ICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTogb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICBpbnB1dFByb3RvY29sRmFjdG9yeTogICBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICBvdXRwdXRQcm90b2NvbEZhY3Rvcnk6ICBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gIH0KLX0KLQotZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgUHJvY2Vzc29yRmFjdG9yeSgpIFRQcm9jZXNzb3JGYWN0b3J5IHsKLSAgcmV0dXJuIHAucHJvY2Vzc29yRmFjdG9yeQotfQotCi1mdW5jIChwICpUU2ltcGxlU2VydmVyKSBTZXJ2ZXJUcmFuc3BvcnQoKSBUU2VydmVyVHJhbnNwb3J0IHsKLSAgcmV0dXJuIHAuc2VydmVyVHJhbnNwb3J0Ci19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIElucHV0VHJhbnNwb3J0RmFjdG9yeSgpIFRUcmFuc3BvcnRGYWN0b3J5IHsKLSAgcmV0dXJuIHAuaW5wdXRUcmFuc3BvcnRGYWN0b3J5Ci19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoKSBUVHJhbnNwb3J0RmFjdG9yeSB7Ci0gIHJldHVybiBwLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkKLX0KLQotZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgSW5wdXRQcm90b2NvbEZhY3RvcnkoKSBUUHJvdG9jb2xGYWN0b3J5IHsKLSAgcmV0dXJuIHAuaW5wdXRQcm90b2NvbEZhY3RvcnkKLX0KLQotZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgT3V0cHV0UHJvdG9jb2xGYWN0b3J5KCkgVFByb3RvY29sRmFjdG9yeSB7Ci0gIHJldHVybiBwLm91dHB1dFByb3RvY29sRmFjdG9yeQotfQotCi1mdW5jIChwICpUU2ltcGxlU2VydmVyKSBTZXJ2ZSgpIG9zLkVycm9yIHsKLSAgcC5zdG9wcGVkID0gZmFsc2UKLSAgZXJyIDo9IHAuc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBlcnIKLSAgfQotICBmb3IgIXAuc3RvcHBlZCB7Ci0gICAgY2xpZW50LCBlcnIgOj0gcC5zZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiBlcnIKLSAgICB9Ci0gICAgaWYgY2xpZW50ICE9IG5pbCB7Ci0gICAgICBwLnByb2Nlc3NSZXF1ZXN0KGNsaWVudCkKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUU2ltcGxlU2VydmVyKSBTdG9wKCkgb3MuRXJyb3IgewotICBwLnN0b3BwZWQgPSB0cnVlCi0gIHAuc2VydmVyVHJhbnNwb3J0LkludGVycnVwdCgpCi0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgcHJvY2Vzc1JlcXVlc3QoY2xpZW50IFRUcmFuc3BvcnQpIHsKLSAgcHJvY2Vzc29yIDo9IHAucHJvY2Vzc29yRmFjdG9yeS5HZXRQcm9jZXNzb3IoY2xpZW50KQotICBpbnB1dFRyYW5zcG9ydCA6PSBwLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KQotICBvdXRwdXRUcmFuc3BvcnQgOj0gcC5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpCi0gIGlucHV0UHJvdG9jb2wgOj0gcC5pbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCkKLSAgb3V0cHV0UHJvdG9jb2wgOj0gcC5vdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KQotICBpZiBpbnB1dFRyYW5zcG9ydCAhPSBuaWwgewotICAgIGRlZmVyIGlucHV0VHJhbnNwb3J0LkNsb3NlKCkKLSAgfQotICBpZiBvdXRwdXRUcmFuc3BvcnQgIT0gbmlsIHsKLSAgICBkZWZlciBvdXRwdXRUcmFuc3BvcnQuQ2xvc2UoKQotICB9Ci0gIGZvciB7Ci0gICAgb2ssIGUgOj0gcHJvY2Vzc29yLlByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpCi0gICAgaWYgZSAhPSBuaWwgewotICAgICAgaWYgIXAuc3RvcHBlZCB7Ci0gICAgICAgIC8vIFRPRE8ocG9tYWNrKSBsb2cgZXJyb3IKLSAgICAgICAgYnJlYWsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgIW9rIHsKLSAgICAgIGJyZWFrCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3Rzb2NrZXQuZ28gYi9saWIvZ28vdGhyaWZ0L3Rzb2NrZXQuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYzYyNTMuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90c29ja2V0LmdvCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnQKLQotaW1wb3J0ICgKLSAgIm5ldCIKLSAgIm9zIgotICAiYnl0ZXMiCi0pCi0KLS8qKgotICogU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4gVG8gYmUgY29tbWVudGVkIHNvb24hCi0gKgotICovCi10eXBlIFRTb2NrZXQgc3RydWN0IHsKLSAgd3JpdGVCdWZmZXIgKmJ5dGVzLkJ1ZmZlcgotICAvKioKLSAgICogV3JhcHBlZCBTb2NrZXQgb2JqZWN0Ci0gICAqLwotICBjb25uIG5ldC5Db25uCi0gIC8qKgotICAgKiBSZW1vdGUgQWRkcgotICAgKi8KLSAgYWRkciBuZXQuQWRkcgotICAvKioKLSAgICogU29ja2V0IHRpbWVvdXQgaW4gbmFub3NlY29uZHMKLSAgICovCi0gIG5zZWNUaW1lb3V0IGludDY0Ci19Ci0KLS8qKgotICogQ29uc3RydWN0b3IgdGhhdCB0YWtlcyBhbiBhbHJlYWR5IGNyZWF0ZWQgc29ja2V0LgotICoKLSAqIEBwYXJhbSBzb2NrZXQgQWxyZWFkeSBjcmVhdGVkIHNvY2tldCBvYmplY3QKLSAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciBzZXR0aW5nIHVwIHRoZSBzdHJlYW1zCi0gKi8KLWZ1bmMgTmV3VFNvY2tldENvbm4oY29ubmVjdGlvbiBuZXQuQ29ubikgKCpUU29ja2V0LCBUVHJhbnNwb3J0RXhjZXB0aW9uKSB7Ci0gIGFkZHJlc3MgOj0gY29ubmVjdGlvbi5SZW1vdGVBZGRyKCkKLSAgaWYgYWRkcmVzcyA9PSBuaWwgewotICAgIGFkZHJlc3MgPSBjb25uZWN0aW9uLkxvY2FsQWRkcigpCi0gIH0KLSAgcCA6PSAmVFNvY2tldHtjb25uOiBjb25uZWN0aW9uLCBhZGRyOiBhZGRyZXNzLCBuc2VjVGltZW91dDogMCwgd3JpdGVCdWZmZXI6IGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgNDA5NikpfQotICByZXR1cm4gcCwgbmlsCi19Ci0KLS8qKgotICogQ3JlYXRlcyBhIG5ldyB1bmNvbm5lY3RlZCBzb2NrZXQgdGhhdCB3aWxsIGNvbm5lY3QgdG8gdGhlIGdpdmVuIGhvc3QKLSAqIG9uIHRoZSBnaXZlbiBwb3J0LgotICoKLSAqIEBwYXJhbSBob3N0IFJlbW90ZSBob3N0Ci0gKiBAcGFyYW0gcG9ydCBSZW1vdGUgcG9ydAotICovCi1mdW5jIE5ld1RTb2NrZXRBZGRyKGFkZHJlc3MgbmV0LkFkZHIpICpUU29ja2V0IHsKLSAgcmV0dXJuIE5ld1RTb2NrZXQoYWRkcmVzcywgMCkKLX0KLQotLyoqCi0gKiBDcmVhdGVzIGEgbmV3IHVuY29ubmVjdGVkIHNvY2tldCB0aGF0IHdpbGwgY29ubmVjdCB0byB0aGUgZ2l2ZW4gaG9zdAotICogb24gdGhlIGdpdmVuIHBvcnQuCi0gKgotICogQHBhcmFtIGhvc3QgICAgUmVtb3RlIGhvc3QKLSAqIEBwYXJhbSBwb3J0ICAgIFJlbW90ZSBwb3J0Ci0gKiBAcGFyYW0gbnNlY1RpbWVvdXQgU29ja2V0IHRpbWVvdXQKLSAqLwotZnVuYyBOZXdUU29ja2V0KGFkZHJlc3MgbmV0LkFkZHIsIG5zZWNUaW1lb3V0IGludDY0KSAqVFNvY2tldCB7Ci0gIHNvY2sgOj0gJlRTb2NrZXR7YWRkcjogYWRkcmVzcywgbnNlY1RpbWVvdXQ6IG5zZWNUaW1lb3V0LCB3cml0ZUJ1ZmZlcjogYnl0ZXMuTmV3QnVmZmVyKG1ha2UoW11ieXRlLCAwLCA0MDk2KSl9Ci0gIHJldHVybiBzb2NrCi19Ci0KLS8qKgotICogU2V0cyB0aGUgc29ja2V0IHRpbWVvdXQKLSAqCi0gKiBAcGFyYW0gdGltZW91dCBOYW5vc2Vjb25kcyB0aW1lb3V0Ci0gKi8KLWZ1bmMgKHAgKlRTb2NrZXQpIFNldFRpbWVvdXQobnNlY1RpbWVvdXQgaW50NjQpIG9zLkVycm9yIHsKLSAgcC5uc2VjVGltZW91dCA9IG5zZWNUaW1lb3V0Ci0gIGlmIHAuSXNPcGVuKCkgewotICAgIGlmIGVyciA6PSBwLmNvbm4uU2V0VGltZW91dChuc2VjVGltZW91dCk7IGVyciAhPSBuaWwgewotICAgICAgTE9HR0VSLlByaW50KCJDb3VsZCBub3Qgc2V0IHNvY2tldCB0aW1lb3V0LiIsIGVycikKLSAgICAgIHJldHVybiBlcnIKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi0vKioKLSAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgc29ja2V0LgotICovCi1mdW5jIChwICpUU29ja2V0KSBDb25uKCkgbmV0LkNvbm4gewotICByZXR1cm4gcC5jb25uCi19Ci0KLS8qKgotICogQ2hlY2tzIHdoZXRoZXIgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQuCi0gKi8KLWZ1bmMgKHAgKlRTb2NrZXQpIElzT3BlbigpIGJvb2wgewotICBpZiBwLmNvbm4gPT0gbmlsIHsKLSAgICByZXR1cm4gZmFsc2UKLSAgfQotICByZXR1cm4gdHJ1ZQotfQotCi0vKioKLSAqIENvbm5lY3RzIHRoZSBzb2NrZXQsIGNyZWF0aW5nIGEgbmV3IHNvY2tldCBvYmplY3QgaWYgbmVjZXNzYXJ5LgotICovCi1mdW5jIChwICpUU29ja2V0KSBPcGVuKCkgb3MuRXJyb3IgewotICBpZiBwLklzT3BlbigpIHsKLSAgICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihBTFJFQURZX09QRU4sICJTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQuIikKLSAgfQotICBpZiBwLmFkZHIgPT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNhbm5vdCBvcGVuIG5pbCBhZGRyZXNzLiIpCi0gIH0KLSAgaWYgbGVuKHAuYWRkci5OZXR3b3JrKCkpID09IDAgewotICAgIHJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gYmFkIG5ldHdvcmsgbmFtZS4iKQotICB9Ci0gIGlmIGxlbihwLmFkZHIuU3RyaW5nKCkpID09IDAgewotICAgIHJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gYmFkIGFkZHJlc3MuIikKLSAgfQotICB2YXIgZXJyIG9zLkVycm9yCi0gIGlmIHAuY29ubiwgZXJyID0gbmV0LkRpYWwocC5hZGRyLk5ldHdvcmsoKSwgcC5hZGRyLlN0cmluZygpKTsgZXJyICE9IG5pbCB7Ci0gICAgTE9HR0VSLlByaW50KCJDb3VsZCBub3Qgb3BlbiBzb2NrZXQiLCBlcnIuU3RyaW5nKCkpCi0gICAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sIGVyci5TdHJpbmcoKSkKLSAgfQotICBpZiBwLmNvbm4gIT0gbmlsIHsKLSAgICBwLmNvbm4uU2V0VGltZW91dChwLm5zZWNUaW1lb3V0KQotICB9Ci0gIHJldHVybiBuaWwKLX0KLQotLyoqCi0gKiBDbG9zZXMgdGhlIHNvY2tldC4KLSAqLwotZnVuYyAocCAqVFNvY2tldCkgQ2xvc2UoKSBvcy5FcnJvciB7Ci0gIC8vIENsb3NlIHRoZSBzb2NrZXQKLSAgaWYgcC5jb25uICE9IG5pbCB7Ci0gICAgZXJyIDo9IHAuY29ubi5DbG9zZSgpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICBMT0dHRVIuUHJpbnQoIkNvdWxkIG5vdCBjbG9zZSBzb2NrZXQuICIsIGVyci5TdHJpbmcoKSkKLSAgICAgIHJldHVybiBlcnIKLSAgICB9Ci0gICAgcC5jb25uID0gbmlsCi0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi0KLWZ1bmMgKHAgKlRTb2NrZXQpIFJlYWQoYnVmIFtdYnl0ZSkgKGludCwgb3MuRXJyb3IpIHsKLSAgaWYgIXAuSXNPcGVuKCkgewotICAgIHJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ29ubmVjdGlvbiBub3Qgb3BlbiIpCi0gIH0KLSAgbiwgZXJyIDo9IHAuY29ubi5SZWFkKGJ1ZikKLSAgcmV0dXJuIG4sIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi19Ci0KLQotZnVuYyAocCAqVFNvY2tldCkgUmVhZEFsbChidWYgW11ieXRlKSAoaW50LCBvcy5FcnJvcikgewotICByZXR1cm4gUmVhZEFsbFRyYW5zcG9ydChwLCBidWYpCi19Ci0KLWZ1bmMgKHAgKlRTb2NrZXQpIFdyaXRlKGJ1ZiBbXWJ5dGUpIChpbnQsIG9zLkVycm9yKSB7Ci0gIGlmICFwLklzT3BlbigpIHsKLSAgICByZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNvbm5lY3Rpb24gbm90IG9wZW4iKQotICB9Ci0gIHAud3JpdGVCdWZmZXIuV3JpdGUoYnVmKQotICByZXR1cm4gbGVuKGJ1ZiksIG5pbAotfQotCi1mdW5jIChwICpUU29ja2V0KSBQZWVrKCkgYm9vbCB7Ci0gIHJldHVybiBwLklzT3BlbigpCi19Ci0KLWZ1bmMgKHAgKlRTb2NrZXQpIEZsdXNoKCkgb3MuRXJyb3IgewotICBpZiAhcC5Jc09wZW4oKSB7Ci0gICAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDb25uZWN0aW9uIG5vdCBvcGVuIikKLSAgfQotICBfLCBlcnIgOj0gcC53cml0ZUJ1ZmZlci5Xcml0ZVRvKHAuY29ubikKLSAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi19Ci0KLWZ1bmMgKHAgKlRTb2NrZXQpIEludGVycnVwdCgpIG9zLkVycm9yIHsKLSAgaWYgIXAuSXNPcGVuKCkgewotICAgIHJldHVybiBuaWwKLSAgfQotICAvLyBUT0RPKHBvbWFjaykgZml4IEludGVycnVwdCBhcyB0aGlzIGlzIHByb2JhYmx5IHdyb25nCi0gIHJldHVybiBwLmNvbm4uQ2xvc2UoKQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90c3RydWN0LmdvIGIvbGliL2dvL3RocmlmdC90c3RydWN0LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWFmZmFlLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdHN0cnVjdC5nbworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnQKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdGhhdCBlbmNhcHN1bGF0ZXMgc3RydWN0IG1ldGFkYXRhLgotICoKLSAqLwotdHlwZSBUU3RydWN0IGludGVyZmFjZSB7Ci0gIFRGaWVsZENvbnRhaW5lcgotICBUU3RydWN0TmFtZSgpIHN0cmluZwotICBUaHJpZnROYW1lKCkgc3RyaW5nCi0gIFRTdHJ1Y3RGaWVsZHMoKSBURmllbGRDb250YWluZXIKLSAgU3RyaW5nKCkgc3RyaW5nCi0gIEF0dHJpYnV0ZUZyb21GaWVsZElkKGZpZWxkSWQgaW50KSBpbnRlcmZhY2V7fQotICBBdHRyaWJ1dGVGcm9tRmllbGROYW1lKGZpZWxkTmFtZSBzdHJpbmcpIGludGVyZmFjZXt9Ci19Ci0KLXR5cGUgdFN0cnVjdCBzdHJ1Y3QgewotICBURmllbGRDb250YWluZXIKLSAgbmFtZSBzdHJpbmcKLX0KLQotZnVuYyBOZXdUU3RydWN0RW1wdHkobmFtZSBzdHJpbmcpIFRTdHJ1Y3QgewotICByZXR1cm4gJnRTdHJ1Y3R7Ci0gICAgbmFtZTogICAgICAgICAgICBuYW1lLAotICAgIFRGaWVsZENvbnRhaW5lcjogTmV3VEZpZWxkQ29udGFpbmVyKG1ha2UoW11URmllbGQsIDAsIDApKSwKLSAgfQotfQotCi1mdW5jIE5ld1RTdHJ1Y3QobmFtZSBzdHJpbmcsIGZpZWxkcyBbXVRGaWVsZCkgVFN0cnVjdCB7Ci0gIHJldHVybiAmdFN0cnVjdHsKLSAgICBuYW1lOiAgICAgICAgICAgIG5hbWUsCi0gICAgVEZpZWxkQ29udGFpbmVyOiBOZXdURmllbGRDb250YWluZXIoZmllbGRzKSwKLSAgfQotfQotCi1mdW5jIChwICp0U3RydWN0KSBUU3RydWN0TmFtZSgpIHN0cmluZyB7Ci0gIHJldHVybiBwLm5hbWUKLX0KLQotZnVuYyAocCAqdFN0cnVjdCkgVGhyaWZ0TmFtZSgpIHN0cmluZyB7Ci0gIHJldHVybiBwLm5hbWUKLX0KLQotZnVuYyAocCAqdFN0cnVjdCkgVFN0cnVjdEZpZWxkcygpIFRGaWVsZENvbnRhaW5lciB7Ci0gIHJldHVybiBwLlRGaWVsZENvbnRhaW5lcgotfQotCi1mdW5jIChwICp0U3RydWN0KSBTdHJpbmcoKSBzdHJpbmcgewotICByZXR1cm4gcC5uYW1lCi19Ci0KLWZ1bmMgKHAgKnRTdHJ1Y3QpIEVxdWFscyhvdGhlciBpbnRlcmZhY2V7fSkgYm9vbCB7Ci0gIGNtcCwgb2sgOj0gcC5Db21wYXJlVG8ob3RoZXIpCi0gIHJldHVybiBvayAmJiBjbXAgPT0gMAotfQotCi1mdW5jIChwICp0U3RydWN0KSBDb21wYXJlVG8ob3RoZXIgaW50ZXJmYWNle30pIChpbnQsIGJvb2wpIHsKLSAgcmV0dXJuIFRUeXBlKFNUUlVDVCkuQ29tcGFyZShwLCBvdGhlcikKLX0KLQotZnVuYyAocCAqdFN0cnVjdCkgQXR0cmlidXRlRnJvbUZpZWxkSWQoZmllbGRJZCBpbnQpIGludGVyZmFjZXt9IHsKLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICp0U3RydWN0KSBBdHRyaWJ1dGVGcm9tRmllbGROYW1lKGZpZWxkTmFtZSBzdHJpbmcpIGludGVyZmFjZXt9IHsKLSAgcmV0dXJuIHAuQXR0cmlidXRlRnJvbUZpZWxkSWQocC5GaWVsZElkRnJvbUZpZWxkTmFtZShmaWVsZE5hbWUpKQotfQotCi0KLXZhciBBTk9OWU1PVVNfU1RSVUNUIFRTdHJ1Y3QKLQotZnVuYyBpbml0KCkgewotICBBTk9OWU1PVVNfU1RSVUNUID0gTmV3VFN0cnVjdEVtcHR5KCIiKQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90dHJhbnNwb3J0LmdvIGIvbGliL2dvL3RocmlmdC90dHJhbnNwb3J0LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjliMGI0Li4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdHRyYW5zcG9ydC5nbworKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLWltcG9ydCAoCi0gICJvcyIKLSAgImxvZyIKLSAgInN0cmNvbnYiCi0pCi0KLXR5cGUgRmx1c2hlciBpbnRlcmZhY2UgewotICBGbHVzaCgpIChlcnIgb3MuRXJyb3IpCi19Ci0KLS8qKgotICogR2VuZXJpYyBjbGFzcyB0aGF0IGVuY2Fwc3VsYXRlcyB0aGUgSS9PIGxheWVyLiBUaGlzIGlzIGJhc2ljYWxseSBhIHRoaW4KLSAqIHdyYXBwZXIgYXJvdW5kIHRoZSBjb21iaW5lZCBmdW5jdGlvbmFsaXR5IG9mIEphdmEgaW5wdXQvb3V0cHV0IHN0cmVhbXMuCi0gKgotICovCi10eXBlIFRUcmFuc3BvcnQgaW50ZXJmYWNlIHsKLSAgLyoqCi0gICAqIFF1ZXJpZXMgd2hldGhlciB0aGUgdHJhbnNwb3J0IGlzIG9wZW4uCi0gICAqCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4uCi0gICAqLwotICBJc09wZW4oKSBib29sCi0KLSAgLyoqCi0gICAqIE9wZW5zIHRoZSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcvd3JpdGluZy4KLSAgICoKLSAgICogQHJldHVybnMgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGUgdHJhbnNwb3J0IGNvdWxkIG5vdCBiZSBvcGVuZWQKLSAgICovCi0gIE9wZW4oKSAoZXJyIG9zLkVycm9yKQotCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIHRyYW5zcG9ydC4KLSAgICovCi0gIENsb3NlKCkgKGVyciBvcy5FcnJvcikKLQotICAvKioKLSAgICogUmVhZHMgdXAgdG8gbGVuIGJ5dGVzIGludG8gYnVmZmVyIGJ1Ziwgc3RhcnRpbmcgYXR0IG9mZnNldCBvZmYuCi0gICAqCi0gICAqIEBwYXJhbSBidWYgQXJyYXkgdG8gcmVhZCBpbnRvCi0gICAqIEBwYXJhbSBvZmYgSW5kZXggdG8gc3RhcnQgcmVhZGluZyBhdAotICAgKiBAcGFyYW0gbGVuIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQKLSAgICogQHJldHVybiBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIGRhdGEKLSAgICovCi0gIFJlYWQoYnVmIFtdYnl0ZSkgKG4gaW50LCBlcnIgb3MuRXJyb3IpCi0KLSAgLyoqCi0gICAqIEd1YXJhbnRlZXMgdGhhdCBhbGwgb2YgbGVuIGJ5dGVzIGFyZSBhY3R1YWxseSByZWFkIG9mZiB0aGUgdHJhbnNwb3J0LgotICAgKgotICAgKiBAcGFyYW0gYnVmIEFycmF5IHRvIHJlYWQgaW50bwotICAgKiBAcGFyYW0gb2ZmIEluZGV4IHRvIHN0YXJ0IHJlYWRpbmcgYXQKLSAgICogQHBhcmFtIGxlbiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLCB3aGljaCBtdXN0IGJlIGVxdWFsIHRvIGxlbgotICAgKiBAcmV0dXJuIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgZGF0YQotICAgKi8KLSAgUmVhZEFsbChidWYgW11ieXRlKSAobiBpbnQsIGVyciBvcy5FcnJvcikKLQotICAvKioKLSAgICogV3JpdGVzIHRoZSBidWZmZXIgdG8gdGhlIG91dHB1dAotICAgKgotICAgKiBAcGFyYW0gYnVmIFRoZSBvdXRwdXQgZGF0YSBidWZmZXIKLSAgICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgd3JpdHRlbgotICAgKiBAcmV0dXJuIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdyaXRpbmcgZGF0YQotICAgKi8KLSAgV3JpdGUoYnVmIFtdYnl0ZSkgKG4gaW50LCBlcnIgb3MuRXJyb3IpCi0KLSAgLyoqCi0gICAqIEZsdXNoIGFueSBwZW5kaW5nIGRhdGEgb3V0IG9mIGEgdHJhbnNwb3J0IGJ1ZmZlci4KLSAgICoKLSAgICogQHJldHVybiBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3cml0aW5nIG91dCBkYXRhLgotICAgKi8KLSAgRmx1c2goKSAoZXJyIG9zLkVycm9yKQotCi0gIC8qKgotICAgKiBJcyB0aGVyZSBtb3JlIGRhdGEgdG8gYmUgcmVhZD8KLSAgICoKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSByZW1vdGUgc2lkZSBpcyBzdGlsbCBhbGl2ZSBhbmQgZmVlZGluZyB1cwotICAgKi8KLSAgUGVlaygpIGJvb2wKLX0KLS8qCi10eXBlIFRUcmFuc3BvcnRCYXNlIHN0cnVjdCB7Ci19Ci0KLWZ1bmMgKHAqIFRUcmFuc3BvcnRCYXNlKSBJc09wZW4oKSBib29sIHsKLSAgcmV0dXJuIGZhbHNlOwotfTsKLQotZnVuYyAocCogVFRyYW5zcG9ydEJhc2UpIFBlZWsoKSBib29sIHsKLSAgcmV0dXJuIHAuSXNPcGVuKCk7Ci19Ci0KLWZ1bmMgKHAqIFRUcmFuc3BvcnRCYXNlKSBPcGVuKCkgb3MuRXJyb3IgewotICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihVTktOT1dOLCAiU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBUVHJhbnNwb3J0QmFzZS5PcGVuKCkiKTsKLX0KLQotZnVuYyAocCogVFRyYW5zcG9ydEJhc2UpIENsb3NlKCkgb3MuRXJyb3IgewotICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihVTktOT1dOLCAiU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBUVHJhbnNwb3J0QmFzZS5DbG9zZSgpIik7Ci19Ci0KLWZ1bmMgKHAqIFRUcmFuc3BvcnRCYXNlKSBSZWFkKGJ1ZiBbXWJ5dGUpIChpbnQsIG9zLkVycm9yKSB7Ci0gIHJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRGVmYXVsdFN0cmluZygiU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBUVHJhbnNwb3J0QmFzZS5SZWFkKCkiKTsKLX0KLQotZnVuYyAocCogVFRyYW5zcG9ydEJhc2UpIFJlYWRBbGwoYnVmIFtdYnl0ZSkgKG4gaW50LCBlcnIgb3MuRXJyb3IpewotICByZXQgOj0gMDsKLSAgc2l6ZSA6PSBsZW4oYnVmKTsKLSAgZm9yIChuIDwgc2l6ZSkgewotICAgIHJldCwgZXJyID0gcC5SZWFkKGJ1ZltuOl0pOwotICAgIGlmIHJldCA8PSAwIHsKLSAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICBlcnIgPSBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRGVmYXVsdFN0cmluZygiQ2Fubm90IHJlYWQuIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQuIFRyaWVkIHRvIHJlYWQgIiArIHN0cmluZyhzaXplKSArICIgYnl0ZXMsIGJ1dCBvbmx5IGdvdCAiICsgc3RyaW5nKG4pICsgIiBieXRlcy4iKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXQsIGVycjsKLSAgICB9Ci0gICAgbiArPSByZXQ7Ci0gIH0KLSAgcmV0dXJuIG4sIGVycjsKLX0KLQotZnVuYyAocCogVFRyYW5zcG9ydEJhc2UpIFdyaXRlKGJ1ZiBbXWJ5dGUpIChpbnQsIG9zLkVycm9yKSB7Ci0gIHJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRGVmYXVsdFN0cmluZygiU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBUVHJhbnNwb3J0QmFzZS5Xcml0ZSgpIik7Ci19Ci0KLWZ1bmMgKHAqIFRUcmFuc3BvcnRCYXNlKSBGbHVzaCgpIG9zLkVycm9yIHsKLSAgcmV0dXJuIG5pbDsKLX0KLSovCi0vKioKLSAqIEd1YXJhbnRlZXMgdGhhdCBhbGwgb2YgbGVuIGJ5dGVzIGFyZSBhY3R1YWxseSByZWFkIG9mZiB0aGUgdHJhbnNwb3J0LgotICoKLSAqIEBwYXJhbSBidWYgQXJyYXkgdG8gcmVhZCBpbnRvCi0gKiBAcGFyYW0gb2ZmIEluZGV4IHRvIHN0YXJ0IHJlYWRpbmcgYXQKLSAqIEBwYXJhbSBsZW4gTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAotICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQsIHdoaWNoIG11c3QgYmUgZXF1YWwgdG8gbGVuCi0gKiBAcmV0dXJuIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgZGF0YQotICovCi1mdW5jIFJlYWRBbGxUcmFuc3BvcnQocCBUVHJhbnNwb3J0LCBidWYgW11ieXRlKSAobiBpbnQsIGVyciBvcy5FcnJvcikgewotICByZXQgOj0gMAotICBzaXplIDo9IGxlbihidWYpCi0gIGZvciBuIDwgc2l6ZSB7Ci0gICAgcmV0LCBlcnIgPSBwLlJlYWQoYnVmW246XSkKLSAgICBpZiByZXQgPD0gMCB7Ci0gICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgZXJyID0gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkRlZmF1bHRTdHJpbmcoIkNhbm5vdCByZWFkLiBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkLiBUcmllZCB0byByZWFkICIgKyBzdHJjb252Lkl0b2Eoc2l6ZSkgKyAiIGJ5dGVzLCBidXQgb25seSBnb3QgIiArIHN0cmNvbnYuSXRvYShuKSArICIgYnl0ZXMuIikKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXQsIGVycgotICAgIH0KLSAgICBuICs9IHJldAotICB9Ci0gIHJldHVybiBuLCBlcnIKLX0KLQotCi12YXIgKAotICBMT0dHRVIgKmxvZy5Mb2dnZXIKLSkKLQotZnVuYyBpbml0KCkgewotICBMT0dHRVIgPSBsb2cuTmV3KG9zLlN0ZGVyciwgIiIsIGxvZy5MZGF0ZXxsb2cuTHRpbWV8bG9nLkxzaG9ydGZpbGUpCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3R0cmFuc3BvcnRfZXhjZXB0aW9uLmdvIGIvbGliL2dvL3RocmlmdC90dHJhbnNwb3J0X2V4Y2VwdGlvbi5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlmYWUxNy4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3R0cmFuc3BvcnRfZXhjZXB0aW9uLmdvCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi1pbXBvcnQgKAotICAib3MiCi0pCi0KLS8qKgotICogVHJhbnNwb3J0IGV4Y2VwdGlvbnMuCi0gKgotICovCi10eXBlIFRUcmFuc3BvcnRFeGNlcHRpb24gaW50ZXJmYWNlIHsKLSAgVEV4Y2VwdGlvbgotICBUeXBlSWQoKSBpbnQKLX0KLQotY29uc3QgKAotICBVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04gPSAwCi0gIE5PVF9PUEVOICAgICAgICAgICAgICAgICAgICA9IDEKLSAgQUxSRUFEWV9PUEVOICAgICAgICAgICAgICAgID0gMgotICBUSU1FRF9PVVQgICAgICAgICAgICAgICAgICAgPSAzCi0gIEVORF9PRl9GSUxFICAgICAgICAgICAgICAgICA9IDQKLSkKLQotdHlwZSB0VHJhbnNwb3J0RXhjZXB0aW9uIHN0cnVjdCB7Ci0gIHR5cGVJZCAgaW50Ci0gIG1lc3NhZ2Ugc3RyaW5nCi19Ci0KLWZ1bmMgKHAgKnRUcmFuc3BvcnRFeGNlcHRpb24pIFR5cGVJZCgpIGludCB7Ci0gIHJldHVybiBwLnR5cGVJZAotfQotCi1mdW5jIChwICp0VHJhbnNwb3J0RXhjZXB0aW9uKSBTdHJpbmcoKSBzdHJpbmcgewotICByZXR1cm4gcC5tZXNzYWdlCi19Ci0KLWZ1bmMgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkRlZmF1bHQoKSBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25EZWZhdWx0VHlwZShVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04pCi19Ci0KLWZ1bmMgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkRlZmF1bHRUeXBlKHQgaW50KSBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24odCwgIiIpCi19Ci0KLWZ1bmMgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkRlZmF1bHRTdHJpbmcobSBzdHJpbmcpIFRUcmFuc3BvcnRFeGNlcHRpb24gewotICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04sIG0pCi19Ci0KLWZ1bmMgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0IGludCwgbSBzdHJpbmcpIFRUcmFuc3BvcnRFeGNlcHRpb24gewotICByZXR1cm4gJnRUcmFuc3BvcnRFeGNlcHRpb257dHlwZUlkOiB0LCBtZXNzYWdlOiBtfQotfQotCi1mdW5jIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tT3NFcnJvcihlIG9zLkVycm9yKSBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgaWYgZSA9PSBuaWwgewotICAgIHJldHVybiBuaWwKLSAgfQotICB0LCBvayA6PSBlLihUVHJhbnNwb3J0RXhjZXB0aW9uKQotICBpZiBvayB7Ci0gICAgcmV0dXJuIHQKLSAgfQotICBpZiBlID09IG9zLkVPRiB7Ci0gICAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oRU5EX09GX0ZJTEUsIGUuU3RyaW5nKCkpCi0gIH0KLSAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25EZWZhdWx0U3RyaW5nKGUuU3RyaW5nKCkpCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3R0cmFuc3BvcnRfZmFjdG9yeS5nbyBiL2xpYi9nby90aHJpZnQvdHRyYW5zcG9ydF9mYWN0b3J5LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWI0ZGJlLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdHRyYW5zcG9ydF9mYWN0b3J5LmdvCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi0vKioKLSAqIEZhY3RvcnkgY2xhc3MgdXNlZCB0byBjcmVhdGUgd3JhcHBlZCBpbnN0YW5jZSBvZiBUcmFuc3BvcnRzLgotICogVGhpcyBpcyB1c2VkIHByaW1hcmlseSBpbiBzZXJ2ZXJzLCB3aGljaCBnZXQgVHJhbnNwb3J0cyBmcm9tCi0gKiBhIFNlcnZlclRyYW5zcG9ydCBhbmQgdGhlbiBtYXkgd2FudCB0byBtdXRhdGUgdGhlbSAoaS5lLiBjcmVhdGUKLSAqIGEgQnVmZmVyZWRUcmFuc3BvcnQgZnJvbSB0aGUgdW5kZXJseWluZyBiYXNlIHRyYW5zcG9ydCkKLSAqCi0gKi8KLXR5cGUgVFRyYW5zcG9ydEZhY3RvcnkgaW50ZXJmYWNlIHsKLSAgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIFRUcmFuc3BvcnQKLX0KLQotdHlwZSB0VHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3R7fQotCi0vKioKLSAqIFJldHVybiBhIHdyYXBwZWQgaW5zdGFuY2Ugb2YgdGhlIGJhc2UgVHJhbnNwb3J0LgotICoKLSAqIEBwYXJhbSB0cmFucyBUaGUgYmFzZSB0cmFuc3BvcnQKLSAqIEByZXR1cm4gV3JhcHBlZCBUcmFuc3BvcnQKLSAqLwotZnVuYyAocCAqdFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSBUVHJhbnNwb3J0IHsKLSAgcmV0dXJuIHRyYW5zCi19Ci0KLWZ1bmMgTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSBUVHJhbnNwb3J0RmFjdG9yeSB7Ci0gIHJldHVybiAmdFRyYW5zcG9ydEZhY3Rvcnl7fQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90dHJhbnNwb3J0X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3R0cmFuc3BvcnRfdGVzdC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE1OGE3NC4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3R0cmFuc3BvcnRfdGVzdC5nbworKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0X3Rlc3QKLQotaW1wb3J0ICgKLSAgLiAidGhyaWZ0IgotICAidGVzdGluZyIKLSAgIm5ldCIKLSAgIm9zIgotICAic3RyY29udiIKLSkKLQotY29uc3QgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUgPSA0MDk2Ci0KLXZhciAoCi0gIHRyYW5zcG9ydF9iZGF0YSBbXWJ5dGUgLy8gdGVzdCBkYXRhIGZvciB3cml0aW5nOyBzYW1lIGFzIGRhdGEKLSkKLQotZnVuYyBpbml0KCkgewotICB0cmFuc3BvcnRfYmRhdGEgPSBtYWtlKFtdYnl0ZSwgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUpCi0gIGZvciBpIDo9IDA7IGkgPCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRTsgaSsrIHsKLSAgICB0cmFuc3BvcnRfYmRhdGFbaV0gPSBieXRlKChpICsgJ2EnKSAlIDI1NSkKLSAgfQotfQotCi1mdW5jIFRyYW5zcG9ydFRlc3QodCAqdGVzdGluZy5ULCB3cml0ZVRyYW5zIFRUcmFuc3BvcnQsIHJlYWRUcmFucyBUVHJhbnNwb3J0KSB7Ci0gIGJ1ZiA6PSBtYWtlKFtdYnl0ZSwgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUpCi0gIGlmICF3cml0ZVRyYW5zLklzT3BlbigpIHsKLSAgICBlcnIgOj0gd3JpdGVUcmFucy5PcGVuKCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgY2Fubm90IG9wZW4gd3JpdGUgdHJhbnNwb3J0OiAlcyIsIHdyaXRlVHJhbnMsIGVycikKLSAgICB9Ci0gIH0KLSAgaWYgIXJlYWRUcmFucy5Jc09wZW4oKSB7Ci0gICAgZXJyIDo9IHJlYWRUcmFucy5PcGVuKCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgY2Fubm90IG9wZW4gcmVhZCB0cmFuc3BvcnQ6ICVzIiwgcmVhZFRyYW5zLCBlcnIpCi0gICAgfQotICB9Ci0gIF8sIGVyciA6PSB3cml0ZVRyYW5zLldyaXRlKHRyYW5zcG9ydF9iZGF0YSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBjYW5ub3Qgd3JpdGUgYmluYXJ5IGRhdGEgb2YgbGVuZ3RoICVkOiAlcyIsIHdyaXRlVHJhbnMsIGxlbih0cmFuc3BvcnRfYmRhdGEpLCBlcnIpCi0gIH0KLSAgZXJyID0gd3JpdGVUcmFucy5GbHVzaCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgY2Fubm90IGZsdXNoIHdyaXRlIG9mIGJpbmFyeSBkYXRhOiAlcyIsIHdyaXRlVHJhbnMsIGVycikKLSAgfQotICBuLCBlcnIgOj0gcmVhZFRyYW5zLlJlYWRBbGwoYnVmKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkVycm9yZigiVHJhbnNwb3J0ICVUIGNhbm5vdCByZWFkIGJpbmFyeSBkYXRhIG9mIGxlbmd0aCAlZDogJXMiLCByZWFkVHJhbnMsIFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFLCBlcnIpCi0gIH0KLSAgaWYgbiAhPSBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSB7Ci0gICAgdC5FcnJvcmYoIlRyYW5zcG9ydCAlVCByZWFkIG9ubHkgJWQgaW5zdGVhZCBvZiAlZCBieXRlcyBvZiBiaW5hcnkgZGF0YSIsIHJlYWRUcmFucywgbiwgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUpCi0gIH0KLSAgZm9yIGssIHYgOj0gcmFuZ2UgYnVmIHsKLSAgICBpZiB2ICE9IHRyYW5zcG9ydF9iZGF0YVtrXSB7Ci0gICAgICB0LkZhdGFsZigiVHJhbnNwb3J0ICVUIHJlYWQgJWQgaW5zdGVhZCBvZiAlZCBmb3IgaW5kZXggJWQgb2YgYmluYXJ5IGRhdGEgMiIsIHJlYWRUcmFucywgdiwgdHJhbnNwb3J0X2JkYXRhW2tdLCBrKQotICAgIH0KLSAgfQotICBfLCBlcnIgPSB3cml0ZVRyYW5zLldyaXRlKHRyYW5zcG9ydF9iZGF0YSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBjYW5ub3Qgd3JpdGUgYmluYXJ5IGRhdGEgMiBvZiBsZW5ndGggJWQ6ICVzIiwgd3JpdGVUcmFucywgbGVuKHRyYW5zcG9ydF9iZGF0YSksIGVycikKLSAgfQotICBlcnIgPSB3cml0ZVRyYW5zLkZsdXNoKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBjYW5ub3QgZmx1c2ggd3JpdGUgYmluYXJ5IGRhdGEgMjogJXMiLCB3cml0ZVRyYW5zLCBlcnIpCi0gIH0KLSAgYiA6PSByZWFkVHJhbnMuUGVlaygpCi0gIGlmIGIgIT0gdHJ1ZSB7Ci0gICAgdC5FcnJvcmYoIlRyYW5zcG9ydCAlVCByZXR1cm5lZCAlcyBmb3IgUGVlaygpIiwgcmVhZFRyYW5zLCBiKQotICB9Ci0gIGJ1ZiA9IG1ha2UoW11ieXRlLCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSkKLSAgcmVhZCA6PSAxCi0gIGZvciBuID0gMDsgbiA8IFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFICYmIHJlYWQgIT0gMDsgewotICAgIHJlYWQsIGVyciA9IHJlYWRUcmFucy5SZWFkKGJ1ZltuOl0pCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICB0LkVycm9yZigiVHJhbnNwb3J0ICVUIGNhbm5vdCByZWFkIGJpbmFyeSBkYXRhIDIgb2YgdG90YWwgbGVuZ3RoICVkIGZyb20gb2Zmc2V0ICVkOiAlcyIsIHJlYWRUcmFucywgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUsIG4sIGVycikKLSAgICB9Ci0gICAgbiArPSByZWFkCi0gIH0KLSAgaWYgbiAhPSBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSB7Ci0gICAgdC5FcnJvcmYoIlRyYW5zcG9ydCAlVCByZWFkIG9ubHkgJWQgaW5zdGVhZCBvZiAlZCBieXRlcyBvZiBiaW5hcnkgZGF0YSAyIiwgcmVhZFRyYW5zLCBuLCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSkKLSAgfQotICBmb3IgaywgdiA6PSByYW5nZSBidWYgewotICAgIGlmIHYgIT0gdHJhbnNwb3J0X2JkYXRhW2tdIHsKLSAgICAgIHQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgcmVhZCAlZCBpbnN0ZWFkIG9mICVkIGZvciBpbmRleCAlZCBvZiBiaW5hcnkgZGF0YSAyIiwgcmVhZFRyYW5zLCB2LCB0cmFuc3BvcnRfYmRhdGFba10sIGspCi0gICAgfQotICB9Ci19Ci0KLWZ1bmMgQ2xvc2VUcmFuc3BvcnRzKHQgKnRlc3RpbmcuVCwgcmVhZFRyYW5zIFRUcmFuc3BvcnQsIHdyaXRlVHJhbnMgVFRyYW5zcG9ydCkgewotICBlcnIgOj0gcmVhZFRyYW5zLkNsb3NlKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5FcnJvcmYoIlRyYW5zcG9ydCAlVCBjYW5ub3QgY2xvc2UgcmVhZCB0cmFuc3BvcnQ6ICVzIiwgcmVhZFRyYW5zLCBlcnIpCi0gIH0KLSAgaWYgd3JpdGVUcmFucyAhPSByZWFkVHJhbnMgewotICAgIGVyciA9IHdyaXRlVHJhbnMuQ2xvc2UoKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgdC5FcnJvcmYoIlRyYW5zcG9ydCAlVCBjYW5ub3QgY2xvc2Ugd3JpdGUgdHJhbnNwb3J0OiAlcyIsIHdyaXRlVHJhbnMsIGVycikKLSAgICB9Ci0gIH0KLX0KLQotZnVuYyBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydChzdGFydFBvcnQgaW50KSAobmV0LkFkZHIsIG9zLkVycm9yKSB7Ci0gIGZvciBpIDo9IHN0YXJ0UG9ydDsgaSA8IDY1NTM1OyBpKysgewotICAgIHMgOj0gIjEyNy4wLjAuMToiICsgc3RyY29udi5JdG9hKGkpCi0gICAgbCwgZXJyIDo9IG5ldC5MaXN0ZW4oInRjcCIsIHMpCi0gICAgaWYgZXJyID09IG5pbCB7Ci0gICAgICBsLkNsb3NlKCkKLSAgICAgIHJldHVybiBuZXQuUmVzb2x2ZVRDUEFkZHIoInRjcCIsIHMpCi0gICAgfQotICB9Ci0gIHJldHVybiBuaWwsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oVU5LTk9XTl9UUkFOU1BPUlRfRVhDRVBUSU9OLCAiQ291bGQgbm90IGZpbmQgYXZhaWxhYmxlIHNlcnZlciBwb3J0IikKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHR5cGUuZ28gYi9saWIvZ28vdGhyaWZ0L3R0eXBlLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDI0YjM5Li4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdHR5cGUuZ28KKysrIC9kZXYvbnVsbApAQCAtMSw5NzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLWltcG9ydCAoCi0gICJjb250YWluZXIvbGlzdCIKLSAgImNvbnRhaW5lci92ZWN0b3IiCi0gICJzdHJjb252IgotKQotCi0vKioKLSAqIFR5cGUgY29uc3RhbnRzIGluIHRoZSBUaHJpZnQgcHJvdG9jb2wuCi0gKi8KLXR5cGUgVFR5cGUgYnl0ZQotCi1jb25zdCAoCi0gIFNUT1AgICAgPSAwCi0gIFZPSUQgICAgPSAxCi0gIEJPT0wgICAgPSAyCi0gIEJZVEUgICAgPSAzCi0gIEkwOCAgICAgPSAzCi0gIERPVUJMRSAgPSA0Ci0gIEkxNiAgICAgPSA2Ci0gIEkzMiAgICAgPSA4Ci0gIEk2NCAgICAgPSAxMAotICBTVFJJTkcgID0gMTEKLSAgVVRGNyAgICA9IDExCi0gIFNUUlVDVCAgPSAxMgotICBNQVAgICAgID0gMTMKLSAgU0VUICAgICA9IDE0Ci0gIExJU1QgICAgPSAxNQotICBFTlVNICAgID0gMTYKLSAgVVRGOCAgICA9IDE2Ci0gIFVURjE2ICAgPSAxNwotICBHRU5FUklDID0gMTI3Ci0pCi0KLWZ1bmMgKHAgVFR5cGUpIFN0cmluZygpIHN0cmluZyB7Ci0gIHN3aXRjaCBwIHsKLSAgY2FzZSBTVE9QOgotICAgIHJldHVybiAiU1RPUCIKLSAgY2FzZSBWT0lEOgotICAgIHJldHVybiAiVk9JRCIKLSAgY2FzZSBCT09MOgotICAgIHJldHVybiAiQk9PTCIKLSAgY2FzZSBCWVRFOgotICAgIHJldHVybiAiQllURSIKLSAgY2FzZSBET1VCTEU6Ci0gICAgcmV0dXJuICJET1VCTEUiCi0gIGNhc2UgSTE2OgotICAgIHJldHVybiAiSTE2IgotICBjYXNlIEkzMjoKLSAgICByZXR1cm4gIkkzMiIKLSAgY2FzZSBJNjQ6Ci0gICAgcmV0dXJuICJJNjQiCi0gIGNhc2UgU1RSSU5HOgotICAgIHJldHVybiAiU1RSSU5HIgotICBjYXNlIFNUUlVDVDoKLSAgICByZXR1cm4gIlNUUlVDVCIKLSAgY2FzZSBNQVA6Ci0gICAgcmV0dXJuICJNQVAiCi0gIGNhc2UgU0VUOgotICAgIHJldHVybiAiU0VUIgotICBjYXNlIExJU1Q6Ci0gICAgcmV0dXJuICJMSVNUIgotICBjYXNlIEVOVU06Ci0gICAgcmV0dXJuICJFTlVNIgotICBjYXNlIFVURjE2OgotICAgIHJldHVybiAiVVRGMTYiCi0gIGNhc2UgR0VORVJJQzoKLSAgICByZXR1cm4gIkdFTkVSSUMiCi0gIH0KLSAgcmV0dXJuICJVbmtub3duIgotfQotCi1mdW5jIChwIFRUeXBlKSBJc0Jhc2VUeXBlKCkgYm9vbCB7Ci0gIHN3aXRjaCBwIHsKLSAgY2FzZSBCT09MLCBCWVRFLCBET1VCTEUsIEkxNiwgSTMyLCBJNjQsIFNUUklORywgVVRGOCwgVVRGMTY6Ci0gICAgcmV0dXJuIHRydWUKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gZmFsc2UKLSAgfQotICByZXR1cm4gZmFsc2UKLX0KLQotZnVuYyAocCBUVHlwZSkgSXNFbXB0eVR5cGUoKSBib29sIHsKLSAgc3dpdGNoIHAgewotICBjYXNlIFNUT1AsIFZPSUQ6Ci0gICAgcmV0dXJuIHRydWUKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gZmFsc2UKLSAgfQotICByZXR1cm4gZmFsc2UKLX0KLQotZnVuYyAocCBUVHlwZSkgSXNFbnVtKCkgYm9vbCB7Ci0gIHN3aXRjaCBwIHsKLSAgY2FzZSBFTlVNOgotICAgIHJldHVybiB0cnVlCi0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIGZhbHNlCi0gIH0KLSAgcmV0dXJuIGZhbHNlCi19Ci0KLWZ1bmMgKHAgVFR5cGUpIElzTnVtZXJpY1R5cGUoKSBib29sIHsKLSAgc3dpdGNoIHAgewotICBjYXNlIEVOVU0sIEJPT0wsIEJZVEUsIERPVUJMRSwgSTE2LCBJMzIsIEk2NDoKLSAgICByZXR1cm4gdHJ1ZQotICBkZWZhdWx0OgotICAgIHJldHVybiBmYWxzZQotICB9Ci0gIHJldHVybiBmYWxzZQotfQotCi1mdW5jIChwIFRUeXBlKSBJc1N0cmluZ1R5cGUoKSBib29sIHsKLSAgc3dpdGNoIHAgewotICBjYXNlIFNUUklORywgVVRGOCwgVVRGMTY6Ci0gICAgcmV0dXJuIHRydWUKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gZmFsc2UKLSAgfQotICByZXR1cm4gZmFsc2UKLX0KLQotZnVuYyAocCBUVHlwZSkgSXNDb250YWluZXIoKSBib29sIHsKLSAgc3dpdGNoIHAgewotICBjYXNlIE1BUCwgU0VULCBMSVNUOgotICAgIHJldHVybiB0cnVlCi0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIGZhbHNlCi0gIH0KLSAgcmV0dXJuIGZhbHNlCi19Ci0KLWZ1bmMgKHAgVFR5cGUpIElzU3RydWN0KCkgYm9vbCB7Ci0gIHN3aXRjaCBwIHsKLSAgY2FzZSBTVFJVQ1Q6Ci0gICAgcmV0dXJuIHRydWUKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gZmFsc2UKLSAgfQotICByZXR1cm4gZmFsc2UKLX0KLQotZnVuYyAocCBUVHlwZSkgSXNNYXAoKSBib29sIHsKLSAgc3dpdGNoIHAgewotICBjYXNlIE1BUDoKLSAgICByZXR1cm4gdHJ1ZQotICBkZWZhdWx0OgotICAgIHJldHVybiBmYWxzZQotICB9Ci0gIHJldHVybiBmYWxzZQotfQotCi1mdW5jIChwIFRUeXBlKSBJc0xpc3QoKSBib29sIHsKLSAgc3dpdGNoIHAgewotICBjYXNlIExJU1Q6Ci0gICAgcmV0dXJuIHRydWUKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gZmFsc2UKLSAgfQotICByZXR1cm4gZmFsc2UKLX0KLQotZnVuYyAocCBUVHlwZSkgSXNTZXQoKSBib29sIHsKLSAgc3dpdGNoIHAgewotICBjYXNlIFNFVDoKLSAgICByZXR1cm4gdHJ1ZQotICBkZWZhdWx0OgotICAgIHJldHVybiBmYWxzZQotICB9Ci0gIHJldHVybiBmYWxzZQotfQotCi1mdW5jIChwIFRUeXBlKSBJc0ludCgpIGJvb2wgewotICBzd2l0Y2ggcCB7Ci0gIGNhc2UgQllURSwgSTE2LCBJMzIsIEk2NDoKLSAgICByZXR1cm4gdHJ1ZQotICBkZWZhdWx0OgotICAgIHJldHVybiBmYWxzZQotICB9Ci0gIHJldHVybiBmYWxzZQotfQotCi1mdW5jIChwIFRUeXBlKSBDb2VyY2Uob3RoZXIgaW50ZXJmYWNle30pIFRUeXBlIHsKLSAgaWYgb3RoZXIgPT0gbmlsIHsKLSAgICByZXR1cm4gVFR5cGUoU1RPUCkKLSAgfQotICBzd2l0Y2ggYiA6PSBvdGhlci4odHlwZSkgewotICBkZWZhdWx0OgotICAgIHJldHVybiBUVHlwZShTVE9QKQotICBjYXNlIG5pbDoKLSAgICByZXR1cm4gVFR5cGUoU1RPUCkKLSAgY2FzZSBUVHlwZToKLSAgICByZXR1cm4gYgotICBjYXNlIGJ5dGU6Ci0gICAgcmV0dXJuIFRUeXBlKGIpCi0gIGNhc2UgaW50OgotICAgIHJldHVybiBUVHlwZShieXRlKGIpKQotICBjYXNlIGludDg6Ci0gICAgcmV0dXJuIFRUeXBlKGJ5dGUoYikpCi0gIGNhc2UgaW50MzI6Ci0gICAgcmV0dXJuIFRUeXBlKGJ5dGUoYikpCi0gIGNhc2UgaW50NjQ6Ci0gICAgcmV0dXJuIFRUeXBlKGJ5dGUoYikpCi0gIGNhc2UgdWludDoKLSAgICByZXR1cm4gVFR5cGUoYnl0ZShiKSkKLSAgY2FzZSB1aW50MzI6Ci0gICAgcmV0dXJuIFRUeXBlKGJ5dGUoYikpCi0gIGNhc2UgdWludDY0OgotICAgIHJldHVybiBUVHlwZShieXRlKGIpKQotICBjYXNlIGZsb2F0MzI6Ci0gICAgcmV0dXJuIFRUeXBlKGJ5dGUoaW50KGIpKSkKLSAgY2FzZSBmbG9hdDY0OgotICAgIHJldHVybiBUVHlwZShieXRlKGludChiKSkpCi0gIH0KLSAgcmV0dXJuIFRUeXBlKFNUT1ApCi19Ci0KLWZ1bmMgKHAgVFR5cGUpIExlc3NUeXBlKG90aGVyIGludGVyZmFjZXt9KSBib29sIHsKLSAgcmV0dXJuIHAgPCBwLkNvZXJjZShvdGhlcikKLX0KLQotZnVuYyAocCBUVHlwZSkgTGVzcyhpLCBqIGludGVyZmFjZXt9KSBib29sIHsKLSAgY21wLCBvayA6PSBwLkNvbXBhcmUoaSwgaikKLSAgcmV0dXJuIG9rICYmIGNtcCA+IDAKLX0KLQotCi1mdW5jIChwIFRUeXBlKSBDb21wYXJlKGksIGogaW50ZXJmYWNle30pIChpbnQsIGJvb2wpIHsKLSAgaWYgaSA9PSBqIHsKLSAgICByZXR1cm4gMCwgdHJ1ZQotICB9Ci0gIGlmIGkgPT0gbmlsIHsKLSAgICBpZiBqID09IG5pbCB7Ci0gICAgICByZXR1cm4gMCwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gLTEsIHRydWUKLSAgfQotICBpZiBqID09IG5pbCB7Ci0gICAgcmV0dXJuIDEsIHRydWUKLSAgfQotICBjaSwgaW9rIDo9IHAuQ29lcmNlRGF0YShpKQotICBjaiwgam9rIDo9IHAuQ29lcmNlRGF0YShqKQotICBpZiBpb2sgJiYgIWpvayB7Ci0gICAgcmV0dXJuIDEsIHRydWUKLSAgfQotICBpZiAhaW9rICYmIGpvayB7Ci0gICAgcmV0dXJuIC0xLCB0cnVlCi0gIH0KLSAgLy8gaG9wZWZ1bGx5IHRoaXMgZG9lc24ndCBoYXBwZW4gYXMgQ29tcGFyZSgpIHdvdWxkIGNvbnRpbnVvdXNseSByZXR1cm4gMCwgZmFsc2UKLSAgaWYgIWlvayAmJiAham9rIHsKLSAgICByZXR1cm4gMCwgZmFsc2UKLSAgfQotICBpZiBjaSA9PSBjaiB7Ci0gICAgcmV0dXJuIDAsIHRydWUKLSAgfQotICBpZiBjaSA9PSBuaWwgewotICAgIGlmIGNqID09IG5pbCB7Ci0gICAgICByZXR1cm4gMCwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gLTEsIHRydWUKLSAgfQotICBpZiBjaiA9PSBuaWwgewotICAgIHJldHVybiAxLCB0cnVlCi0gIH0KLSAgc3dpdGNoIHAgewotICBjYXNlIFNUT1AsIFZPSUQ6Ci0gICAgLy8gaG9wZWZ1bGx5IHRoaXMgZG9lc24ndCBoYXBwZW4gYXMgQ29tcGFyZSgpIHdvdWxkIGNvbnRpbnVvdXNseSByZXR1cm4gMCwgZmFsc2UKLSAgICByZXR1cm4gMCwgZmFsc2UKLSAgY2FzZSBCT09MOgotICAgIHZpIDo9IGNpLihib29sKQotICAgIHZqIDo9IGNqLihib29sKQotICAgIGlmIHZpID09IHZqIHsKLSAgICAgIHJldHVybiAwLCB0cnVlCi0gICAgfQotICAgIGlmIHZpID09IGZhbHNlIHsKLSAgICAgIHJldHVybiAtMSwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gMSwgdHJ1ZQotICBjYXNlIEJZVEU6Ci0gICAgdmkgOj0gY2kuKGJ5dGUpCi0gICAgdmogOj0gY2ouKGJ5dGUpCi0gICAgaWYgdmkgPT0gdmogewotICAgICAgcmV0dXJuIDAsIHRydWUKLSAgICB9Ci0gICAgaWYgdmkgPCB2aiB7Ci0gICAgICByZXR1cm4gLTEsIHRydWUKLSAgICB9Ci0gICAgcmV0dXJuIDEsIHRydWUKLSAgY2FzZSBET1VCTEU6Ci0gICAgdmkgOj0gY2kuKGZsb2F0NjQpCi0gICAgdmogOj0gY2ouKGZsb2F0NjQpCi0gICAgaWYgdmkgPT0gdmogewotICAgICAgcmV0dXJuIDAsIHRydWUKLSAgICB9Ci0gICAgaWYgdmkgPCB2aiB7Ci0gICAgICByZXR1cm4gLTEsIHRydWUKLSAgICB9Ci0gICAgcmV0dXJuIDEsIHRydWUKLSAgY2FzZSBJMTY6Ci0gICAgdmkgOj0gY2kuKGludDE2KQotICAgIHZqIDo9IGNqLihpbnQxNikKLSAgICBpZiB2aSA9PSB2aiB7Ci0gICAgICByZXR1cm4gMCwgdHJ1ZQotICAgIH0KLSAgICBpZiB2aSA8IHZqIHsKLSAgICAgIHJldHVybiAtMSwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gMSwgdHJ1ZQotICBjYXNlIEkzMjoKLSAgICB2aSA6PSBjaS4oaW50MzIpCi0gICAgdmogOj0gY2ouKGludDMyKQotICAgIGlmIHZpID09IHZqIHsKLSAgICAgIHJldHVybiAwLCB0cnVlCi0gICAgfQotICAgIGlmIHZpIDwgdmogewotICAgICAgcmV0dXJuIC0xLCB0cnVlCi0gICAgfQotICAgIHJldHVybiAxLCB0cnVlCi0gIGNhc2UgSTY0OgotICAgIHZpIDo9IGNpLihpbnQ2NCkKLSAgICB2aiA6PSBjai4oaW50NjQpCi0gICAgaWYgdmkgPT0gdmogewotICAgICAgcmV0dXJuIDAsIHRydWUKLSAgICB9Ci0gICAgaWYgdmkgPCB2aiB7Ci0gICAgICByZXR1cm4gLTEsIHRydWUKLSAgICB9Ci0gICAgcmV0dXJuIDEsIHRydWUKLSAgY2FzZSBTVFJJTkcsIFVURjgsIFVURjE2OgotICAgIHZpIDo9IGNpLihzdHJpbmcpCi0gICAgdmogOj0gY2ouKHN0cmluZykKLSAgICBpZiB2aSA9PSB2aiB7Ci0gICAgICByZXR1cm4gMCwgdHJ1ZQotICAgIH0KLSAgICBpZiB2aSA8IHZqIHsKLSAgICAgIHJldHVybiAtMSwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gMSwgdHJ1ZQotICBjYXNlIFNUUlVDVDoKLSAgICBzaSA6PSBjaS4oVFN0cnVjdCkKLSAgICBzaiA6PSBjai4oVFN0cnVjdCkKLSAgICBpZiBjbXAgOj0gQ29tcGFyZVN0cmluZyhzaS5UaHJpZnROYW1lKCksIHNqLlRocmlmdE5hbWUoKSk7IGNtcCAhPSAwIHsKLSAgICAgIHJldHVybiBjbXAsIHRydWUKLSAgICB9Ci0gICAgaWYgY21wLCBvayA6PSBzaS5UU3RydWN0RmllbGRzKCkuQ29tcGFyZVRvKHNqLlRTdHJ1Y3RGaWVsZHMoKSk7ICFvayB8fCBjbXAgIT0gMCB7Ci0gICAgICByZXR1cm4gY21wLCBvawotICAgIH0KLSAgICBmb3IgZmllbGQgOj0gcmFuZ2Ugc2kuVFN0cnVjdEZpZWxkcygpLkl0ZXIoKSB7Ci0gICAgICBhIDo9IHNpLkF0dHJpYnV0ZUZyb21GaWVsZElkKGZpZWxkLklkKCkpCi0gICAgICBiIDo9IHNqLkF0dHJpYnV0ZUZyb21GaWVsZElkKGZpZWxkLklkKCkpCi0gICAgICBpZiBjbXAsIG9rIDo9IGZpZWxkLlR5cGVJZCgpLkNvbXBhcmUoYSwgYik7ICFvayB8fCBjbXAgIT0gMCB7Ci0gICAgICAgIHJldHVybiBjbXAsIG9rCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwLCB0cnVlCi0gIGNhc2UgTUFQOgotICAgIG1pIDo9IGNpLihUTWFwKQotICAgIG1qIDo9IGNqLihUTWFwKQotICAgIGVpIDo9IG1pLktleVR5cGUoKQotICAgIGlmIGVqIDo9IG1qLktleVR5cGUoKTsgZWkgIT0gZWogewotICAgICAgcmV0dXJuIENvbXBhcmVJbnQoaW50KGVpKSwgaW50KGVqKSksIHRydWUKLSAgICB9Ci0gICAgaWYgc2l6ZSA6PSBtaS5MZW4oKTsgc2l6ZSAhPSBtai5MZW4oKSB7Ci0gICAgICByZXR1cm4gQ29tcGFyZUludChzaXplLCBtai5MZW4oKSksIHRydWUKLSAgICB9Ci0gICAgaWYgYywgY29rIDo9IGVpLkNvbXBhcmUobWkuS2V5cygpLCBtai5LZXlzKCkpOyBjICE9IDAgfHwgIWNvayB7Ci0gICAgICByZXR1cm4gYywgY29rCi0gICAgfQotICAgIHJldHVybiBlaS5Db21wYXJlKG1pLlZhbHVlcygpLCBtai5WYWx1ZXMoKSkKLSAgY2FzZSBMSVNUOgotICAgIGxpIDo9IGNpLihUTGlzdCkKLSAgICBsaiA6PSBjai4oVExpc3QpCi0gICAgZWkgOj0gbGkuRWxlbVR5cGUoKQotICAgIGVqIDo9IGxqLkVsZW1UeXBlKCkKLSAgICBpZiBlaSAhPSBlaiB7Ci0gICAgICByZXR1cm4gQ29tcGFyZUludChpbnQoZWkpLCBpbnQoZWopKSwgdHJ1ZQotICAgIH0KLSAgICBzaXplIDo9IGxpLkxlbigpCi0gICAgaWYgc2l6ZSAhPSBsai5MZW4oKSB7Ci0gICAgICByZXR1cm4gQ29tcGFyZUludChzaXplLCBsai5MZW4oKSksIHRydWUKLSAgICB9Ci0gICAgZm9yIGsgOj0gMDsgayA8IHNpemU7IGsrKyB7Ci0gICAgICB2aSA6PSBsaS5BdChrKQotICAgICAgdmogOj0gbGouQXQoaykKLSAgICAgIGMsIGNvayA6PSBlaS5Db21wYXJlKHZpLCB2aikKLSAgICAgIGlmIGMgIT0gMCB8fCAhY29rIHsKLSAgICAgICAgcmV0dXJuIGMsIGNvawotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMCwgdHJ1ZQotICBjYXNlIFNFVDoKLSAgICBsaSA6PSBjaS4oVFNldCkKLSAgICBsaiA6PSBjai4oVFNldCkKLSAgICBlaSA6PSBsaS5FbGVtVHlwZSgpCi0gICAgZWogOj0gbGouRWxlbVR5cGUoKQotICAgIGlmIGVpICE9IGVqIHsKLSAgICAgIHJldHVybiBDb21wYXJlSW50KGludChlaSksIGludChlaikpLCB0cnVlCi0gICAgfQotICAgIHNpemUgOj0gbGkuTGVuKCkKLSAgICBpZiBzaXplICE9IGxqLkxlbigpIHsKLSAgICAgIHJldHVybiBDb21wYXJlSW50KHNpemUsIGxqLkxlbigpKSwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gZWkuQ29tcGFyZShsaS5WYWx1ZXMoKSwgbGouVmFsdWVzKCkpCi0gIGRlZmF1bHQ6Ci0gICAgcGFuaWMoIkludmFsaWQgdGhyaWZ0IHR5cGUgdG8gY29lcmNlIikKLSAgfQotICByZXR1cm4gMCwgZmFsc2UKLX0KLQotZnVuYyAocCBUVHlwZSkgQ29tcGFyZVZhbHVlQXJyYXlzKGxpLCBsaiBbXWludGVyZmFjZXt9KSAoaW50LCBib29sKSB7Ci0gIHNpemUgOj0gbGVuKGxpKQotICBpZiBjbXAgOj0gQ29tcGFyZUludChzaXplLCBsZW4obGopKTsgY21wICE9IDAgewotICAgIHJldHVybiBjbXAsIHRydWUKLSAgfQotICBmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKLSAgICB2aSA6PSBsaVtpXQotICAgIHZqIDo9IGxqW2ldCi0gICAgYywgY29rIDo9IHAuQ29tcGFyZSh2aSwgdmopCi0gICAgaWYgYyAhPSAwIHx8ICFjb2sgewotICAgICAgcmV0dXJuIGMsIGNvawotICAgIH0KLSAgfQotICByZXR1cm4gMCwgdHJ1ZQotfQotCi1mdW5jIChwIFRUeXBlKSBFcXVhbHMob3RoZXIgaW50ZXJmYWNle30pIGJvb2wgewotICByZXR1cm4gcCA9PSBwLkNvZXJjZShvdGhlcikKLX0KLQotdHlwZSBTdHJpbmdlciBpbnRlcmZhY2UgewotICBTdHJpbmcoKSBzdHJpbmcKLX0KLQotdHlwZSBFbnVtZXIgaW50ZXJmYWNlIHsKLSAgU3RyaW5nKCkgc3RyaW5nCi0gIFZhbHVlKCkgaW50Ci0gIElzRW51bSgpIGJvb2wKLX0KLQotZnVuYyBUeXBlRnJvbVZhbHVlKGRhdGEgaW50ZXJmYWNle30pIFRUeXBlIHsKLSAgc3dpdGNoIGkgOj0gZGF0YS4odHlwZSkgewotICBkZWZhdWx0OgotICAgIHJldHVybiBTVE9QCi0gIGNhc2UgbmlsOgotICAgIHJldHVybiBWT0lECi0gIGNhc2UgYm9vbDoKLSAgICByZXR1cm4gQk9PTAotICBjYXNlIGZsb2F0MzIsIGZsb2F0NjQ6Ci0gICAgcmV0dXJuIERPVUJMRQotICBjYXNlIGludCwgaW50MzI6Ci0gICAgcmV0dXJuIEkzMgotICBjYXNlIGJ5dGU6Ci0gICAgcmV0dXJuIEJZVEUKLSAgY2FzZSBpbnQ4OgotICAgIHJldHVybiBJMDgKLSAgY2FzZSBpbnQxNjoKLSAgICByZXR1cm4gSTE2Ci0gIGNhc2UgaW50NjQ6Ci0gICAgcmV0dXJuIEk2NAotICBjYXNlIHN0cmluZzoKLSAgICByZXR1cm4gU1RSSU5HCi0gIGNhc2UgVFN0cnVjdDoKLSAgICByZXR1cm4gU1RSVUNUCi0gIGNhc2UgVE1hcDoKLSAgICByZXR1cm4gTUFQCi0gIGNhc2UgVFNldDoKLSAgICByZXR1cm4gU0VUCi0gIGNhc2UgW11pbnRlcmZhY2V7fSwgKmxpc3QuTGlzdCwgKnZlY3Rvci5WZWN0b3IsIFRMaXN0OgotICAgIHJldHVybiBMSVNUCi0gIH0KLSAgcmV0dXJuIFNUT1AKLX0KLQotZnVuYyAocCBUVHlwZSkgQ29lcmNlRGF0YShkYXRhIGludGVyZmFjZXt9KSAoaW50ZXJmYWNle30sIGJvb2wpIHsKLSAgaWYgZGF0YSA9PSBuaWwgewotICAgIHN3aXRjaCBwIHsKLSAgICBjYXNlIFNUT1A6Ci0gICAgICByZXR1cm4gbmlsLCB0cnVlCi0gICAgY2FzZSBWT0lEOgotICAgICAgcmV0dXJuIG5pbCwgdHJ1ZQotICAgIGNhc2UgQk9PTDoKLSAgICAgIHJldHVybiBmYWxzZSwgdHJ1ZQotICAgIGNhc2UgQllURToKLSAgICAgIHJldHVybiBieXRlKDApLCB0cnVlCi0gICAgY2FzZSBET1VCTEU6Ci0gICAgICByZXR1cm4gZmxvYXQ2NCgwKSwgdHJ1ZQotICAgIGNhc2UgSTE2OgotICAgICAgcmV0dXJuIGludDE2KDApLCB0cnVlCi0gICAgY2FzZSBJMzI6Ci0gICAgICByZXR1cm4gaW50MzIoMCksIHRydWUKLSAgICBjYXNlIEk2NDoKLSAgICAgIHJldHVybiBpbnQ2NCgwKSwgdHJ1ZQotICAgIGNhc2UgU1RSSU5HLCBVVEY4LCBVVEYxNjoKLSAgICAgIHJldHVybiAiIiwgdHJ1ZQotICAgIGNhc2UgU1RSVUNUOgotICAgICAgcmV0dXJuIE5ld1RTdHJ1Y3RFbXB0eSgiIiksIHRydWUKLSAgICBjYXNlIE1BUDoKLSAgICAgIHJldHVybiBOZXdUTWFwRGVmYXVsdCgpLCB0cnVlCi0gICAgY2FzZSBMSVNUOgotICAgICAgcmV0dXJuIE5ld1RMaXN0RGVmYXVsdCgpLCB0cnVlCi0gICAgY2FzZSBTRVQ6Ci0gICAgICByZXR1cm4gTmV3VFNldERlZmF1bHQoKSwgdHJ1ZQotICAgIGRlZmF1bHQ6Ci0gICAgICBwYW5pYygiSW52YWxpZCB0aHJpZnQgdHlwZSB0byBjb2VyY2UiKQotICAgIH0KLSAgfQotICBzd2l0Y2ggcCB7Ci0gIGNhc2UgU1RPUDoKLSAgICByZXR1cm4gbmlsLCB0cnVlCi0gIGNhc2UgVk9JRDoKLSAgICByZXR1cm4gbmlsLCB0cnVlCi0gIGNhc2UgQk9PTDoKLSAgICBzd2l0Y2ggYiA6PSBkYXRhLih0eXBlKSB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZSwgZmFsc2UKLSAgICBjYXNlIGJvb2w6Ci0gICAgICByZXR1cm4gYiwgdHJ1ZQotICAgIGNhc2UgTnVtZXJpYzoKLSAgICAgIHJldHVybiBib29sKGIuSW50KCkgIT0gMCksIHRydWUKLSAgICBjYXNlIGludDoKLSAgICAgIHJldHVybiBiICE9IDAsIHRydWUKLSAgICBjYXNlIGJ5dGU6Ci0gICAgICByZXR1cm4gYiAhPSAwLCB0cnVlCi0gICAgY2FzZSBpbnQ4OgotICAgICAgcmV0dXJuIGIgIT0gMCwgdHJ1ZQotICAgIGNhc2UgaW50MTY6Ci0gICAgICByZXR1cm4gYiAhPSAwLCB0cnVlCi0gICAgY2FzZSBpbnQzMjoKLSAgICAgIHJldHVybiBiICE9IDAsIHRydWUKLSAgICBjYXNlIGludDY0OgotICAgICAgcmV0dXJuIGIgIT0gMCwgdHJ1ZQotICAgIGNhc2UgdWludDoKLSAgICAgIHJldHVybiBiICE9IDAsIHRydWUKLSAgICBjYXNlIHVpbnQxNjoKLSAgICAgIHJldHVybiBiICE9IDAsIHRydWUKLSAgICBjYXNlIHVpbnQzMjoKLSAgICAgIHJldHVybiBiICE9IDAsIHRydWUKLSAgICBjYXNlIHVpbnQ2NDoKLSAgICAgIHJldHVybiBiICE9IDAsIHRydWUKLSAgICBjYXNlIGZsb2F0MzI6Ci0gICAgICByZXR1cm4gYiAhPSAwLCB0cnVlCi0gICAgY2FzZSBmbG9hdDY0OgotICAgICAgcmV0dXJuIGIgIT0gMCwgdHJ1ZQotICAgIGNhc2UgU3RyaW5nZXI6Ci0gICAgICB2IDo9IGIuU3RyaW5nKCkKLSAgICAgIGlmIHYgPT0gImZhbHNlIiB8fCB2ID09ICIwIiB8fCBsZW4odikgPT0gMCB7Ci0gICAgICAgIHJldHVybiBmYWxzZSwgdHJ1ZQotICAgICAgfQotICAgICAgcmV0dXJuIHRydWUsIHRydWUKLSAgICBjYXNlIHN0cmluZzoKLSAgICAgIGlmIGIgPT0gImZhbHNlIiB8fCBiID09ICIwIiB8fCBsZW4oYikgPT0gMCB7Ci0gICAgICAgIHJldHVybiBmYWxzZSwgdHJ1ZQotICAgICAgfQotICAgICAgcmV0dXJuIHRydWUsIHRydWUKLSAgICB9Ci0gIGNhc2UgQllURToKLSAgICBpZiBiLCBvayA6PSBkYXRhLihieXRlKTsgb2sgewotICAgICAgcmV0dXJuIGIsIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oTnVtZXJpYyk7IG9rIHsKLSAgICAgIHJldHVybiBiLkJ5dGUoKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihib29sKTsgb2sgewotICAgICAgaWYgYiB7Ci0gICAgICAgIHJldHVybiBieXRlKDEpLCB0cnVlCi0gICAgICB9Ci0gICAgICByZXR1cm4gYnl0ZSgwKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihpbnQpOyBvayB7Ci0gICAgICByZXR1cm4gYnl0ZShiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihpbnQ4KTsgb2sgewotICAgICAgcmV0dXJuIGJ5dGUoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50MTYpOyBvayB7Ci0gICAgICByZXR1cm4gYnl0ZShiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihpbnQzMik7IG9rIHsKLSAgICAgIHJldHVybiBieXRlKGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGludDY0KTsgb2sgewotICAgICAgcmV0dXJuIGJ5dGUoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludCk7IG9rIHsKLSAgICAgIHJldHVybiBieXRlKGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKHVpbnQ4KTsgb2sgewotICAgICAgcmV0dXJuIGJ5dGUoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludDE2KTsgb2sgewotICAgICAgcmV0dXJuIGJ5dGUoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludDMyKTsgb2sgewotICAgICAgcmV0dXJuIGJ5dGUoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludDY0KTsgb2sgewotICAgICAgcmV0dXJuIGJ5dGUoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oZmxvYXQzMik7IG9rIHsKLSAgICAgIHJldHVybiBieXRlKGludChiKSksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oZmxvYXQ2NCk7IG9rIHsKLSAgICAgIHJldHVybiBieXRlKGludChiKSksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oU3RyaW5nZXIpOyBvayB7Ci0gICAgICBkYXRhID0gYi5TdHJpbmcoKQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihzdHJpbmcpOyBvayB7Ci0gICAgICBpMSwgZXJyIDo9IHN0cmNvbnYuQXRvaShiKQotICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgIHJldHVybiBieXRlKGludChpMSkpLCB0cnVlCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBieXRlKDApLCBmYWxzZQotICBjYXNlIERPVUJMRToKLSAgICBpZiBiLCBvayA6PSBkYXRhLihmbG9hdDMyKTsgb2sgewotICAgICAgcmV0dXJuIGZsb2F0NjQoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oZmxvYXQ2NCk7IG9rIHsKLSAgICAgIHJldHVybiBiLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKE51bWVyaWMpOyBvayB7Ci0gICAgICByZXR1cm4gYm9vbChiLkZsb2F0NjQoKSAhPSAwLjApLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGJ5dGUpOyBvayB7Ci0gICAgICByZXR1cm4gZmxvYXQ2NChiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihib29sKTsgb2sgewotICAgICAgaWYgYiB7Ci0gICAgICAgIHJldHVybiBmbG9hdDY0KDEuMCksIHRydWUKLSAgICAgIH0KLSAgICAgIHJldHVybiBmbG9hdDY0KDAuMCksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50KTsgb2sgewotICAgICAgcmV0dXJuIGZsb2F0NjQoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50OCk7IG9rIHsKLSAgICAgIHJldHVybiBmbG9hdDY0KGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGludDE2KTsgb2sgewotICAgICAgcmV0dXJuIGZsb2F0NjQoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50MzIpOyBvayB7Ci0gICAgICByZXR1cm4gZmxvYXQ2NChiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihpbnQ2NCk7IG9rIHsKLSAgICAgIHJldHVybiBmbG9hdDY0KGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKHVpbnQpOyBvayB7Ci0gICAgICByZXR1cm4gZmxvYXQ2NChiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLih1aW50OCk7IG9rIHsKLSAgICAgIHJldHVybiBmbG9hdDY0KGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKHVpbnQxNik7IG9rIHsKLSAgICAgIHJldHVybiBmbG9hdDY0KGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKHVpbnQzMik7IG9rIHsKLSAgICAgIHJldHVybiBmbG9hdDY0KGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKHVpbnQ2NCk7IG9rIHsKLSAgICAgIHJldHVybiBmbG9hdDY0KGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKFN0cmluZ2VyKTsgb2sgewotICAgICAgZGF0YSA9IGIuU3RyaW5nKCkKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oc3RyaW5nKTsgb2sgewotICAgICAgZDEsIGVyciA6PSBzdHJjb252LkF0b2Y2NChiKQotICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgIHJldHVybiBkMSwgdHJ1ZQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmxvYXQ2NCgwKSwgZmFsc2UKLSAgY2FzZSBJMTY6Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50MTYpOyBvayB7Ci0gICAgICByZXR1cm4gYiwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihpbnQpOyBvayB7Ci0gICAgICByZXR1cm4gaW50MTYoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oTnVtZXJpYyk7IG9rIHsKLSAgICAgIHJldHVybiBib29sKGIuSW50MTYoKSAhPSAwKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihieXRlKTsgb2sgewotICAgICAgcmV0dXJuIGludDE2KGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGJvb2wpOyBvayB7Ci0gICAgICBpZiBiIHsKLSAgICAgICAgcmV0dXJuIGludDE2KDEuMCksIHRydWUKLSAgICAgIH0KLSAgICAgIHJldHVybiBpbnQxNigwLjApLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGludDgpOyBvayB7Ci0gICAgICByZXR1cm4gaW50MTYoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50MzIpOyBvayB7Ci0gICAgICByZXR1cm4gaW50MTYoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50NjQpOyBvayB7Ci0gICAgICByZXR1cm4gaW50MTYoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludCk7IG9rIHsKLSAgICAgIHJldHVybiBpbnQxNihiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLih1aW50OCk7IG9rIHsKLSAgICAgIHJldHVybiBpbnQxNihiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLih1aW50MTYpOyBvayB7Ci0gICAgICByZXR1cm4gaW50MTYoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludDMyKTsgb2sgewotICAgICAgcmV0dXJuIGludDE2KGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKHVpbnQ2NCk7IG9rIHsKLSAgICAgIHJldHVybiBpbnQxNihiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihmbG9hdDMyKTsgb2sgewotICAgICAgcmV0dXJuIGludDE2KGludChiKSksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oZmxvYXQ2NCk7IG9rIHsKLSAgICAgIHJldHVybiBpbnQxNihpbnQoYikpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKFN0cmluZ2VyKTsgb2sgewotICAgICAgZGF0YSA9IGIuU3RyaW5nKCkKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oc3RyaW5nKTsgb2sgewotICAgICAgaTEsIGVyciA6PSBzdHJjb252LkF0b2koYikKLSAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICByZXR1cm4gaW50MTYoaTEpLCB0cnVlCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbnQxNigwKSwgZmFsc2UKLSAgY2FzZSBJMzI6Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50MzIpOyBvayB7Ci0gICAgICByZXR1cm4gYiwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihpbnQpOyBvayB7Ci0gICAgICByZXR1cm4gaW50MzIoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oTnVtZXJpYyk7IG9rIHsKLSAgICAgIHJldHVybiBib29sKGIuSW50MzIoKSAhPSAwKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihieXRlKTsgb2sgewotICAgICAgcmV0dXJuIGludDMyKGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGJvb2wpOyBvayB7Ci0gICAgICBpZiBiIHsKLSAgICAgICAgcmV0dXJuIGludDMyKDEuMCksIHRydWUKLSAgICAgIH0KLSAgICAgIHJldHVybiBpbnQzMigwLjApLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGludDgpOyBvayB7Ci0gICAgICByZXR1cm4gaW50MzIoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50MTYpOyBvayB7Ci0gICAgICByZXR1cm4gaW50MzIoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50NjQpOyBvayB7Ci0gICAgICByZXR1cm4gaW50MzIoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludCk7IG9rIHsKLSAgICAgIHJldHVybiBpbnQzMihiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLih1aW50OCk7IG9rIHsKLSAgICAgIHJldHVybiBpbnQzMihiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLih1aW50MTYpOyBvayB7Ci0gICAgICByZXR1cm4gaW50MzIoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludDMyKTsgb2sgewotICAgICAgcmV0dXJuIGludDMyKGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKHVpbnQ2NCk7IG9rIHsKLSAgICAgIHJldHVybiBpbnQzMihiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihmbG9hdDMyKTsgb2sgewotICAgICAgcmV0dXJuIGludDMyKGludChiKSksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oZmxvYXQ2NCk7IG9rIHsKLSAgICAgIHJldHVybiBpbnQzMihpbnQoYikpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKFN0cmluZ2VyKTsgb2sgewotICAgICAgZGF0YSA9IGIuU3RyaW5nKCkKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oc3RyaW5nKTsgb2sgewotICAgICAgaTEsIGVyciA6PSBzdHJjb252LkF0b2koYikKLSAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICByZXR1cm4gaW50MzIoaTEpLCB0cnVlCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbnQzMigwKSwgZmFsc2UKLSAgY2FzZSBJNjQ6Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50NjQpOyBvayB7Ci0gICAgICByZXR1cm4gYiwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihpbnQzMik7IG9rIHsKLSAgICAgIHJldHVybiBpbnQ2NChiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihpbnQpOyBvayB7Ci0gICAgICByZXR1cm4gaW50NjQoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oTnVtZXJpYyk7IG9rIHsKLSAgICAgIHJldHVybiBib29sKGIuSW50NjQoKSAhPSAwKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihieXRlKTsgb2sgewotICAgICAgcmV0dXJuIGludDY0KGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGJvb2wpOyBvayB7Ci0gICAgICBpZiBiIHsKLSAgICAgICAgcmV0dXJuIGludDY0KDEuMCksIHRydWUKLSAgICAgIH0KLSAgICAgIHJldHVybiBpbnQ2NCgwLjApLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGludDgpOyBvayB7Ci0gICAgICByZXR1cm4gaW50NjQoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50MTYpOyBvayB7Ci0gICAgICByZXR1cm4gaW50NjQoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludCk7IG9rIHsKLSAgICAgIHJldHVybiBpbnQ2NChiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLih1aW50OCk7IG9rIHsKLSAgICAgIHJldHVybiBpbnQ2NChiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLih1aW50MTYpOyBvayB7Ci0gICAgICByZXR1cm4gaW50NjQoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludDMyKTsgb2sgewotICAgICAgcmV0dXJuIGludDY0KGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKHVpbnQ2NCk7IG9rIHsKLSAgICAgIHJldHVybiBpbnQ2NChiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihmbG9hdDMyKTsgb2sgewotICAgICAgcmV0dXJuIGludDY0KGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGZsb2F0NjQpOyBvayB7Ci0gICAgICByZXR1cm4gaW50NjQoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oU3RyaW5nZXIpOyBvayB7Ci0gICAgICBkYXRhID0gYi5TdHJpbmcoKQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihzdHJpbmcpOyBvayB7Ci0gICAgICBpMSwgZXJyIDo9IHN0cmNvbnYuQXRvaTY0KGIpCi0gICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgcmV0dXJuIGkxLCB0cnVlCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbnQ2NCgwKSwgZmFsc2UKLSAgY2FzZSBTVFJJTkcsIFVURjgsIFVURjE2OgotICAgIGlmIGIsIG9rIDo9IGRhdGEuKEVudW1lcik7IG9rIHsKLSAgICAgIGlmIGkxLCBvayA6PSBkYXRhLihpbnQpOyBvayB7Ci0gICAgICAgIHJldHVybiBpMSwgdHJ1ZQotICAgICAgfQotICAgICAgcmV0dXJuIGIuU3RyaW5nKCksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oU3RyaW5nZXIpOyBvayB7Ci0gICAgICByZXR1cm4gYi5TdHJpbmcoKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihzdHJpbmcpOyBvayB7Ci0gICAgICByZXR1cm4gYiwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihpbnQpOyBvayB7Ci0gICAgICByZXR1cm4gc3RyaW5nKGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGJ5dGUpOyBvayB7Ci0gICAgICByZXR1cm4gc3RyaW5nKGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGJvb2wpOyBvayB7Ci0gICAgICBpZiBiIHsKLSAgICAgICAgcmV0dXJuICJ0cnVlIiwgdHJ1ZQotICAgICAgfQotICAgICAgcmV0dXJuICJmYWxzZSIsIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50OCk7IG9rIHsKLSAgICAgIHJldHVybiBzdHJpbmcoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50MTYpOyBvayB7Ci0gICAgICByZXR1cm4gc3RyaW5nKGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGludDMyKTsgb2sgewotICAgICAgcmV0dXJuIHN0cmluZyhiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihpbnQ2NCk7IG9rIHsKLSAgICAgIHJldHVybiBzdHJpbmcoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludCk7IG9rIHsKLSAgICAgIHJldHVybiBzdHJpbmcoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludDgpOyBvayB7Ci0gICAgICByZXR1cm4gc3RyaW5nKGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKHVpbnQxNik7IG9rIHsKLSAgICAgIHJldHVybiBzdHJpbmcoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludDMyKTsgb2sgewotICAgICAgcmV0dXJuIHN0cmluZyhiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLih1aW50NjQpOyBvayB7Ci0gICAgICByZXR1cm4gc3RyaW5nKGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGZsb2F0MzIpOyBvayB7Ci0gICAgICByZXR1cm4gc3RyY29udi5GdG9hMzIoYiwgJ2cnLCAtMSksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oZmxvYXQ2NCk7IG9rIHsKLSAgICAgIHJldHVybiBzdHJjb252LkZ0b2E2NChiLCAnZycsIC0xKSwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gIiIsIGZhbHNlCi0gIGNhc2UgU1RSVUNUOgotICAgIGlmIGIsIG9rIDo9IGRhdGEuKFRTdHJ1Y3QpOyBvayB7Ci0gICAgICByZXR1cm4gYiwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gTmV3VFN0cnVjdEVtcHR5KCIiKSwgdHJ1ZQotICBjYXNlIE1BUDoKLSAgICBpZiBiLCBvayA6PSBkYXRhLihUTWFwKTsgb2sgewotICAgICAgcmV0dXJuIGIsIHRydWUKLSAgICB9Ci0gICAgcmV0dXJuIE5ld1RNYXBEZWZhdWx0KCksIGZhbHNlCi0gIGNhc2UgTElTVDoKLSAgICBpZiBiLCBvayA6PSBkYXRhLihUTGlzdCk7IG9rIHsKLSAgICAgIHJldHVybiBiLCB0cnVlCi0gICAgfQotICAgIHJldHVybiBOZXdUTGlzdERlZmF1bHQoKSwgZmFsc2UKLSAgY2FzZSBTRVQ6Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oVFNldCk7IG9rIHsKLSAgICAgIHJldHVybiBiLCB0cnVlCi0gICAgfQotICAgIHJldHVybiBOZXdUU2V0RGVmYXVsdCgpLCBmYWxzZQotICBkZWZhdWx0OgotICAgIHBhbmljKCJJbnZhbGlkIHRocmlmdCB0eXBlIHRvIGNvZXJjZSIpCi0gIH0KLSAgcmV0dXJuIG5pbCwgZmFsc2UKLX0KLQotdHlwZSBFcXVhbHNPdGhlckludGVyZmFjZSBpbnRlcmZhY2UgewotICBFcXVhbHMob3RoZXIgaW50ZXJmYWNle30pIGJvb2wKLX0KLQotdHlwZSBFcXVhbHNNYXAgaW50ZXJmYWNlIHsKLSAgRXF1YWxzKG90aGVyIFRNYXApIGJvb2wKLX0KLQotdHlwZSBFcXVhbHNTZXQgaW50ZXJmYWNlIHsKLSAgRXF1YWxzKG90aGVyIFRTZXQpIGJvb2wKLX0KLQotdHlwZSBFcXVhbHNMaXN0IGludGVyZmFjZSB7Ci0gIEVxdWFscyhvdGhlciBUTGlzdCkgYm9vbAotfQotCi10eXBlIEVxdWFsc1N0cnVjdCBpbnRlcmZhY2UgewotICBFcXVhbHMob3RoZXIgVFN0cnVjdCkgYm9vbAotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90eXBlLmdvIGIvbGliL2dvL3RocmlmdC90eXBlLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOTJmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3R5cGUuZ28KQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCisvLyBUeXBlIGNvbnN0YW50cyBpbiB0aGUgVGhyaWZ0IHByb3RvY29sCit0eXBlIFRUeXBlIGJ5dGUKKworY29uc3QgKAorCVNUT1AgICA9IDAKKwlWT0lEICAgPSAxCisJQk9PTCAgID0gMgorCUJZVEUgICA9IDMKKwlJMDggICAgPSAzCisJRE9VQkxFID0gNAorCUkxNiAgICA9IDYKKwlJMzIgICAgPSA4CisJSTY0ICAgID0gMTAKKwlTVFJJTkcgPSAxMQorCVVURjcgICA9IDExCisJU1RSVUNUID0gMTIKKwlNQVAgICAgPSAxMworCVNFVCAgICA9IDE0CisJTElTVCAgID0gMTUKKwlVVEY4ICAgPSAxNgorCVVURjE2ICA9IDE3CisJLy9CSU5BUlkgPSAxOCAgIHdyb25nIGFuZCB1bnVzdWVkCispCisKK3ZhciB0eXBlTmFtZXMgPSBtYXBbaW50XXN0cmluZ3sKKwlTVE9QOiAgICJTVE9QIiwKKwlWT0lEOiAgICJWT0lEIiwKKwlCT09MOiAgICJCT09MIiwKKwlCWVRFOiAgICJCWVRFIiwKKwlET1VCTEU6ICJET1VCTEUiLAorCUkxNjogICAgIkkxNiIsCisJSTMyOiAgICAiSTMyIiwKKwlJNjQ6ICAgICJJNjQiLAorCVNUUklORzogIlNUUklORyIsCisJU1RSVUNUOiAiU1RSVUNUIiwKKwlNQVA6ICAgICJNQVAiLAorCVNFVDogICAgIlNFVCIsCisJTElTVDogICAiTElTVCIsCisJVVRGODogICAiVVRGOCIsCisJVVRGMTY6ICAiVVRGMTYiLAorfQorCitmdW5jIChwIFRUeXBlKSBTdHJpbmcoKSBzdHJpbmcgeworCWlmIHMsIG9rIDo9IHR5cGVOYW1lc1tpbnQocCldOyBvayB7CisJCXJldHVybiBzCisJfQorCXJldHVybiAiVW5rbm93biIKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvemxpYl90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZDQyNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0LmdvCkBAIC0wLDAgKzEsMTMyIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29tcHJlc3MvemxpYiIKKwkiY29udGV4dCIKKwkiaW8iCisJImxvZyIKKykKKworLy8gVFpsaWJUcmFuc3BvcnRGYWN0b3J5IGlzIGEgZmFjdG9yeSBmb3IgVFpsaWJUcmFuc3BvcnQgaW5zdGFuY2VzCit0eXBlIFRabGliVHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3QgeworCWxldmVsICAgaW50CisJZmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeQorfQorCisvLyBUWmxpYlRyYW5zcG9ydCBpcyBhIFRUcmFuc3BvcnQgaW1wbGVtZW50YXRpb24gdGhhdCBtYWtlcyB1c2Ugb2YgemxpYiBjb21wcmVzc2lvbi4KK3R5cGUgVFpsaWJUcmFuc3BvcnQgc3RydWN0IHsKKwlyZWFkZXIgICAgaW8uUmVhZENsb3NlcgorCXRyYW5zcG9ydCBUVHJhbnNwb3J0CisJd3JpdGVyICAgICp6bGliLldyaXRlcgorfQorCisvLyBHZXRUcmFuc3BvcnQgY29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBOZXdUWmxpYlRyYW5zcG9ydAorZnVuYyAocCAqVFpsaWJUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJaWYgcC5mYWN0b3J5ICE9IG5pbCB7CisJCS8vIHdyYXAgb3RoZXIgZmFjdG9yeQorCQl2YXIgZXJyIGVycm9yCisJCXRyYW5zLCBlcnIgPSBwLmZhY3RvcnkuR2V0VHJhbnNwb3J0KHRyYW5zKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBuaWwsIGVycgorCQl9CisJfQorCXJldHVybiBOZXdUWmxpYlRyYW5zcG9ydCh0cmFucywgcC5sZXZlbCkKK30KKworLy8gTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5IGNvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5CitmdW5jIE5ld1RabGliVHJhbnNwb3J0RmFjdG9yeShsZXZlbCBpbnQpICpUWmxpYlRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiAmVFpsaWJUcmFuc3BvcnRGYWN0b3J5e2xldmVsOiBsZXZlbCwgZmFjdG9yeTogbmlsfQorfQorCisvLyBOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnkgY29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBUWmxpYlRyYW5zcG9ydEZhY3RvcnkKKy8vIGFzIGEgd3JhcHBlciBvdmVyIGV4aXN0aW5nIHRyYW5zcG9ydCBmYWN0b3J5CitmdW5jIE5ld1RabGliVHJhbnNwb3J0RmFjdG9yeVdpdGhGYWN0b3J5KGxldmVsIGludCwgZmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSkgKlRabGliVHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuICZUWmxpYlRyYW5zcG9ydEZhY3Rvcnl7bGV2ZWw6IGxldmVsLCBmYWN0b3J5OiBmYWN0b3J5fQorfQorCisvLyBOZXdUWmxpYlRyYW5zcG9ydCBjb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIFRabGliVHJhbnNwb3J0CitmdW5jIE5ld1RabGliVHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQsIGxldmVsIGludCkgKCpUWmxpYlRyYW5zcG9ydCwgZXJyb3IpIHsKKwl3LCBlcnIgOj0gemxpYi5OZXdXcml0ZXJMZXZlbCh0cmFucywgbGV2ZWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWxvZy5QcmludGxuKGVycikKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCisJcmV0dXJuICZUWmxpYlRyYW5zcG9ydHsKKwkJd3JpdGVyOiAgICB3LAorCQl0cmFuc3BvcnQ6IHRyYW5zLAorCX0sIG5pbAorfQorCisvLyBDbG9zZSBjbG9zZXMgdGhlIHJlYWRlciBhbmQgd3JpdGVyIChmbHVzaGluZyBhbnkgdW53cml0dGVuIGRhdGEpIGFuZCBjbG9zZXMKKy8vIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KK2Z1bmMgKHogKlRabGliVHJhbnNwb3J0KSBDbG9zZSgpIGVycm9yIHsKKwlpZiB6LnJlYWRlciAhPSBuaWwgeworCQlpZiBlcnIgOj0gei5yZWFkZXIuQ2xvc2UoKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwl9CisJaWYgZXJyIDo9IHoud3JpdGVyLkNsb3NlKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXJldHVybiB6LnRyYW5zcG9ydC5DbG9zZSgpCit9CisKKy8vIEZsdXNoIGZsdXNoZXMgdGhlIHdyaXRlciBhbmQgaXRzIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorZnVuYyAoeiAqVFpsaWJUcmFuc3BvcnQpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKKwlpZiBlcnIgOj0gei53cml0ZXIuRmx1c2goKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJcmV0dXJuIHoudHJhbnNwb3J0LkZsdXNoKGN0eCkKK30KKworLy8gSXNPcGVuIHJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4KK2Z1bmMgKHogKlRabGliVHJhbnNwb3J0KSBJc09wZW4oKSBib29sIHsKKwlyZXR1cm4gei50cmFuc3BvcnQuSXNPcGVuKCkKK30KKworLy8gT3BlbiBvcGVucyB0aGUgdHJhbnNwb3J0IGZvciBjb21tdW5pY2F0aW9uCitmdW5jICh6ICpUWmxpYlRyYW5zcG9ydCkgT3BlbigpIGVycm9yIHsKKwlyZXR1cm4gei50cmFuc3BvcnQuT3BlbigpCit9CisKK2Z1bmMgKHogKlRabGliVHJhbnNwb3J0KSBSZWFkKHAgW11ieXRlKSAoaW50LCBlcnJvcikgeworCWlmIHoucmVhZGVyID09IG5pbCB7CisJCXIsIGVyciA6PSB6bGliLk5ld1JlYWRlcih6LnRyYW5zcG9ydCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCisJCX0KKwkJei5yZWFkZXIgPSByCisJfQorCisJcmV0dXJuIHoucmVhZGVyLlJlYWQocCkKK30KKworLy8gUmVtYWluaW5nQnl0ZXMgcmV0dXJucyB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgZGF0YSB0aGF0IGlzIHN0aWxsIHRvIGJlCisvLyByZWFkLgorZnVuYyAoeiAqVFpsaWJUcmFuc3BvcnQpIFJlbWFpbmluZ0J5dGVzKCkgdWludDY0IHsKKwlyZXR1cm4gei50cmFuc3BvcnQuUmVtYWluaW5nQnl0ZXMoKQorfQorCitmdW5jICh6ICpUWmxpYlRyYW5zcG9ydCkgV3JpdGUocCBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJcmV0dXJuIHoud3JpdGVyLldyaXRlKHApCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2ZjExZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvemxpYl90cmFuc3BvcnRfdGVzdC5nbwpAQCAtMCwwICsxLDYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbXByZXNzL3psaWIiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdFpsaWJUcmFuc3BvcnQodCAqdGVzdGluZy5UKSB7CisJdHJhbnMsIGVyciA6PSBOZXdUWmxpYlRyYW5zcG9ydChOZXdUTWVtb3J5QnVmZmVyKCksIHpsaWIuQmVzdENvbXByZXNzaW9uKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CisJVHJhbnNwb3J0VGVzdCh0LCB0cmFucywgdHJhbnMpCit9CisKK3R5cGUgRHVtbXlUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdHt9CisKK2Z1bmMgKHAgKkR1bW15VHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiBOZXdUTWVtb3J5QnVmZmVyKCksIG5pbAorfQorCitmdW5jIFRlc3RabGliRmFjdG9yeVRyYW5zcG9ydFdpdGhGYWN0b3J5KHQgKnRlc3RpbmcuVCkgeworCWZhY3RvcnkgOj0gTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5V2l0aEZhY3RvcnkoCisJCXpsaWIuQmVzdENvbXByZXNzaW9uLAorCQkmRHVtbXlUcmFuc3BvcnRGYWN0b3J5e30sCisJKQorCWJ1ZmZlciA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwl0cmFucywgZXJyIDo9IGZhY3RvcnkuR2V0VHJhbnNwb3J0KGJ1ZmZlcikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbChlcnIpCisJfQorCVRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQorfQorCitmdW5jIFRlc3RabGliRmFjdG9yeVRyYW5zcG9ydFdpdGhvdXRGYWN0b3J5KHQgKnRlc3RpbmcuVCkgeworCWZhY3RvcnkgOj0gTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5V2l0aEZhY3RvcnkoemxpYi5CZXN0Q29tcHJlc3Npb24sIG5pbCkKKwlidWZmZXIgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJdHJhbnMsIGVyciA6PSBmYWN0b3J5LkdldFRyYW5zcG9ydChidWZmZXIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoZXJyKQorCX0KKwlUcmFuc3BvcnRUZXN0KHQsIHRyYW5zLCB0cmFucykKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL1JFQURNRS5tZCBiL2xpYi9oYXhlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzRiNzczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTY0IEBACitUaHJpZnQgSGF4ZSBTb2Z0d2FyZSBMaWJyYXJ5CisKK0xpY2Vuc2UKKz09PT09PT0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKK1VzaW5nIFRocmlmdCB3aXRoIEhheGUKKz09PT09PT09PT09PT09PT09PT09PT09PQorCitIYXhlIHNldHVwCistLS0tLS0tLS0tLS0tLS0KKworVGhyaWZ0IHJlcXVpcmVzIEhheGUgMy4xLjMuIEluc3RhbGxlcnMgZm9yIFdpbmRvd3MgYW5kIE9TWAorcGxhdGZvcm1zIGFyZSBhdmFpbGFibGUgYXQgYGh0dHA6Ly9oYXhlLm9yZy9kb3dubG9hZGAuIAorCitEZXBlbmRpbmcgb24gdGhlIGRlc2lyZWQgdGFyZ2V0cywgeW91IG1heSBoYXZlIHRvIGluc3RhbGwgdGhlIGFwcHJvcHJpYXRlIEhheGVMaWJzIAorYWZ0ZXIgaW5zdGFsbGluZyBIYXhlIGl0c2VsZi4gRm9yIGV4YW1wbGUsIGlmIHlvdSBwbGFuIHRvIHRhcmdldCBDIywgSmF2YSBhbmQgQysrLAorZW50ZXIgdGhlIGZvbGxvd2luZyBjb21tYW5kcyBhZnRlciBpbnN0YWxsaW5nIEhheGU6CisKKyAgICBoYXhlbGliIGluc3RhbGwgaHhjcHAKKyAgICBoYXhlbGliIGluc3RhbGwgaHhqYXZhCisgICAgaGF4ZWxpYiBpbnN0YWxsIGh4Y3MKKworRm9yIG90aGVyIHRhcmdldHMsIHBsZWFzZSBjb25zdWx0IHRoZSBIYXhlIGRvY3VtZW50YXRpb24gd2hldGhlciBvciBub3QgYW55IGFkZGl0aW9uYWwKK3RhcmdldCBsaWJyYXJpZXMgbmVlZCB0byBiZSBpbnN0YWxsZWQgYW5kIGhvdyB0byBhY2hpZXZlIHRoaXMuCisKKworSGF4ZSBvbiBMaW51eCAKKy0tLS0tLS0tLS0tLS0tLQorCitGb3IgTGludXggcGxhdGZvcm1zIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgZGlzdHJvLXNwZWNpZmljIHBhY2thZ2UKK21hbmFnZXIsIHdoZXJlIHBvc3NpYmxlLiBNb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBhdCB0aGUgCitIYXhlIExpbnV4IGRvd25sb2FkIHNlY3Rpb246IGh0dHA6Ly9oYXhlLm9yZy9kb3dubG9hZC9saW51eAorCitJZiB5b3UgcnVuIGludG8gdGhlIGVycm9yIG1lc3NhZ2UgCisKKyAgICBVbmNhdWdodCBleGNlcHRpb24gLSBsb2FkLmMoMjM3KSA6IEZhaWxlZCB0byBsb2FkIGxpYnJhcnkgOiAvdXNyL2xpYi9uZWtvL3JlZ2V4cC5uZGxsICAKKwkobGlicGNyZS5zby4zOiBjYW5ub3Qgb3BlbiBzaGFyZWQgb2JqZWN0IGZpbGU6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkpCisKK3RoaXMgY2FuIGJlIHNvbHZlZCBkZXBlbmRpbmcgb24geW91ciBPU2VzIGJpdG5lc3MgYnkgZWl0aGVyCisKKyAgICBzdWRvIGxuIC1zZiAvdXNyL2xpYi9saWJwY3JlLnNvLjEgL3Vzci9saWIvbGlicGNyZS5zby4zCisgICAgc3VkbyBsZGNvbmZpZworCQorb3IKKworICAgIHN1ZG8gbG4gLXNmIC91c3IvbGliNjQvbGlicGNyZS5zby4xIC91c3IvbGliNjQvbGlicGNyZS5zby4zCisgICAgc3VkbyBsZGNvbmZpZworCitUaHJpZnQgSGF4ZSBiaW5kaW5ncworLS0tLS0tLS0tLS0tLS0tLS0tLQorCQorVGhyaWZ0IEhheGUgYmluZGluZ3MgY2FuIGJlIHNldCB1cCB2aWEgdGhlIGBoYXhlbGliYCB0b29sICAKK2VpdGhlciBmcm9tIHRoZSBvZmZpY2lhbCBBU0YgcmVwbywgb3IgdmlhIHRoZSBnaXRodWIgbWlycm9yLgorCistIFRvIHNldCB1cCBhbnkgKipzdGFibGUgdmVyc2lvbioqLCBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIGJyYW5jaCAoZS5nLiBgMS4wLjBgLCBldGMuKToKKworICAgIC0gYGhheGVsaWIgZ2l0IHRocmlmdCBodHRwczovL2dpdC5hcGFjaGUub3JnL3RocmlmdC5naXQgMS4wLjAgbGliL2hheGVgCisgICAgLSBgaGF4ZWxpYiBnaXQgdGhyaWZ0IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCAxLjAuMCBsaWIvaGF4ZWAKKworLSBUbyBzZXQgdXAgdGhlIGN1cnJlbnQgKipkZXZlbG9wbWVudCB2ZXJzaW9uKiosIHVzZSB0aGUgYG1hc3RlcmAgYnJhbmNoOgorICAKKyAgICAtIGBoYXhlbGliIGdpdCB0aHJpZnQgaHR0cHM6Ly9naXQuYXBhY2hlLm9yZy90aHJpZnQuZ2l0IG1hc3RlciBsaWIvaGF4ZWAJCisgICAgLSBgaGF4ZWxpYiBnaXQgdGhyaWZ0IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCBtYXN0ZXIgbGliL2hheGVgCisKK0FzIHVzdWFsLCB0aGUgaW5zdGFsbGVkIGxpYnJhcnkgY2FuIGJlIHVwZGF0ZWQgdXNpbmcgYGhheGVsaWIgdXBncmFkZWAgCitvciBgaGF4ZWxpYiB1cGRhdGUgdGhyaWZ0YC4KKworSW4gb3JkZXIgdG8gd29yayB3aXRoIFRocmlmdCwgeW91IHdpbGwgbmVlZCB0byBpbnN0YWxsIHRoZSBUaHJpZnQgY29tcGlsZXIgCitvciBidWlsZCBmcm9tIHNvdXJjZSwgZGVwZW5kaW5nIG9uIHlvdXIgb3BlcmF0aW5nIHN5c3RlbS4gQXBwcm9wcmlhdGUgCitkb3dubG9hZHMgYW5kIG1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworCQorVG8gZ2V0IHN0YXJ0ZWQsIHZpc2l0IHRoZSAvdHV0b3JpYWwvaGF4ZSBhbmQgL3Rlc3QvaGF4ZSBkaXJzIGZvciBleGFtcGxlcy4gCitJZiB5b3UgYXJlIHVzaW5nIEhJREUgb3IgdGhlIEZsYXNoRGV2ZWxvcCBJREUsIHlvdSdsbCBmaW5kIGFwcHJvcHJpYXRlIAorcHJvamVjdCBmaWxlcyBpbiB0aGVzZSBmb2xkZXJzLgorCisKK0N1cnJlbnQgc3RhdHVzCis9PT09PT09PT09PT09PT09PT09PT09PT0KKy0gdGVzdGVkIHdpdGggSGF4ZSBDKysgdGFyZ2V0CistIHRlc3RlZCB3aXRoIEhheGUgUEhQIHRhcmdldCAoY29uc29sZS93ZWIgc2VydmVyLCBiaW5hcnkgcHJvdG9jb2xzKQorLSB0cmFuc3BvcnRzOiBTb2NrZXQsIEhUVFAgKHNlcnZlcnMgcnVuIGluc2lkZSBQSFAgc2VydmVyL1BIUCB0YXJnZXQgb25seSksIFN0cmVhbQorLSBwcm90b2NvbHM6IEJpbmFyeSwgSlNPTiwgTXVsdGlwbGV4LCBDb21wYWN0CistIHR1dG9yaWFsIGNsaWVudCBhbmQgc2VydmVyIGF2YWlsYWJsZQorLSBjcm9zcy10ZXN0IGNsaWVudCBhbmQgc2VydmVyIGF2YWlsYWJsZSAKKworCitGdXJ0aGVyIGRldmVsb3BtZW50cworPT09PT09PT09PT09PT09PT09PT09PT09CistIGltcHJvdmUgdG8gd29yayB3aXRoIEMjLCBKYXZhIGFuZCBKYXZhU2NyaXB0IEhheGUvT3BlbkZMIHRhcmdldHMKKy0gaW1wcm92ZSB0byB3b3JrIHdpdGggbW9yZSAoaWRlYWxseSBhbGwpIEhheGUvT3BlbkZMIHRhcmdldHMKKy0gYWRkIEhUVFAgc2VydmVyLCB1cGRhdGUgdHV0b3JpYWwgYW5kIHRlc3RzIGFjY29yZGluZ2x5CisKKworS25vd24gcmVzdHJpY3Rpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT0KKworQWx0aG91Z2ggZGVzaWduZWQgd2l0aCBtYXhpbXVtIHBvcnRhYmlsaXR5IGluIG1pbmQsIGZvciB0ZWNobmljYWwgcmVhc29ucyBzb21lIHBsYXRmb3JtcworbWF5IG9ubHkgc3VwcG9ydCBwYXJ0cyBvZiB0aGUgbGlicmFyeSwgb3Igbm90IGJlIGNvbXBhdGlibGUgYXQgYWxsLgorCitKYXZhc2NyaXB0OgorLSB0dXRvcmlhbCBmYWlscyB0byBidWlsZCBiZWNhdXNlIG9mIHVuc3VwcG9ydGVkIFN5cy5hcmdzCisKK1BIUCBIVFRQIFNlcnZlciBub3RlcworPT09PT09PT09PT09PT09PT09PT09PT09CisKKy0geW91IGhhdmUgdG8gaW1wb3J0IFBIUCBmaWxlcyBnZW5lcmF0ZWQgYnkgaGF4ZSBpbnRvIFBIUAorYGBgcGhwCityZXF1aXJlX29uY2UgIGRpcm5hbWUoX19GSUxFX18pIC4gJy9iaW4vcGhwLXdlYi1zZXJ2ZXIvTWFpbi1kZWJ1Zy5waHAnOworYGBgCisKKy0gdHJhY2UoKSBieSBkZWZhdWx0IG91dHB1dHMgaW50byBzdGRvdXQgKGh0dHAgcmVzcG9uc2UpLCBzbyB5b3UgaGF2ZSB0byByZWRpcmVjdCBpdCB0byBzdGRlcnIgb3IgeW91IG93biBsb2dzLCBzb21ldGhpbmcgbGlrZQorYGBgaGF4ZQorLy9yZW1hcCB0cmFjZSB0byBlcnJvciBsb2cKK2hheGUuTG9nLnRyYWNlID0gZnVuY3Rpb24odjpEeW5hbWljLCA/aW5mb3M6aGF4ZS5Qb3NJbmZvcykgCit7IAorCS8vc2ltdWxhdGUgbm9ybWFsIHRyYWNlIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL2Jsb2IvZGV2ZWxvcG1lbnQvc3RkL2hheGUvTG9nLmh4CisJdmFyIG5ld1ZhbHVlIDogRHluYW1pYzsKKwlpZiAoaW5mb3MgIT0gbnVsbCAmJiBpbmZvcy5jdXN0b21QYXJhbXMhPW51bGwpIHsKKwkJdmFyIGV4dHJhOlN0cmluZyA9ICIiOworCQlmb3IoIHYgaW4gaW5mb3MuY3VzdG9tUGFyYW1zICkKKwkJCWV4dHJhICs9ICIsIiArIHY7CisJCW5ld1ZhbHVlID0gdiArIGV4dHJhOworCX0KKwllbHNlIHsKKwkJbmV3VmFsdWUgPSB2OworCX0KKwl2YXIgbXNnID0gaW5mb3MgIT0gbnVsbCA/IGluZm9zLmZpbGVOYW1lICsgJzonICsgaW5mb3MubGluZU51bWJlciArICc6ICcgOiAnJzsKKwlTeXMuc3RkZXJyKCkud3JpdGVTdHJpbmcoJyR7bXNnfSR7bmV3VmFsdWV9XG4nKTsKK30KK2BgYAorCistIHRvIGFsbG93IHRocmlmdCBzZXJ2ZXIgdG8gcmVhZC93cml0ZSBIVFRQIHJlcXVlc3QvcmVzcG9uc2UsIGl0IHNob3VsZCBiZSBwb2ludGVkIG91dCB0byBwaHAgc3RyZWFtcworYGBgaGF4ZQordHJhbnNwb3J0ID0JbmV3IFRXcmFwcGluZ1NlcnZlclRyYW5zcG9ydCgKKwkJCQluZXcgVFN0cmVhbVRyYW5zcG9ydCgKKwkJCQkJbmV3IFRGaWxlU3RyZWFtKCJwaHA6Ly9pbnB1dCIsIFJlYWQpLAorCQkJCQluZXcgVEZpbGVTdHJlYW0oInBocDovL291dHB1dCIsIEFwcGVuZCkKKwkJCQkJKQorCQkJCSk7CitgYGAKKworLSBUU2ltcGxlU2VydmVyIGRvZXNuJ3Qgc3RvcCBhZnRlciBmaXJzdCBjYWxsLCBzbyBwcm9jZXNzb3IucHJvY2VzcygpIHNob3VsZCBiZSBjYWxsZWQgaW5zdGVhZCwgb3IgdXNlIHJ1bk9uY2UgcHJvcGVydHkgCitgYGBoYXhlCit2YXIgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoIHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0cmFuc2ZhY3RvcnksIHByb3RmYWN0b3J5KTsKK3NlcnZlci5ydW5PbmNlID0gdHJ1ZTsKK2BgYAorCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2hheGUvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL2hheGVsaWIuanNvbiBiL2xpYi9oYXhlL2hheGVsaWIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTJhZDkwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvaGF4ZWxpYi5qc29uCkBAIC0wLDAgKzEsMTIgQEAKK3sKKwkibmFtZSI6ICJ0aHJpZnQiLAorCSJ1cmwiIDogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIsCisJImxpY2Vuc2UiOiAiQXBhY2hlIiwKKwkidGFncyI6IFsidGhyaWZ0IiwgInJwYyIsICJzZXJpYWxpemF0aW9uIiwgImNyb3NzIiwgImZyYW1ld29yayJdLAorCSJkZXNjcmlwdGlvbiI6ICJIYXhlIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgYW5kIHNlcmlhbGl6YXRpb24gZnJhbWV3b3JrIiwKKwkidmVyc2lvbiI6ICIxLjAuMCIsCisJInJlbGVhc2Vub3RlIjogIkxpY2Vuc2VkIHVuZGVyIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gVGhlIEFwYWNoZSBUaHJpZnQgY29tcGlsZXIgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIHNlcGFyYXRlbHkuIiwKKwkiY29udHJpYnV0b3JzIjogWyJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSJdLAorCSJkZXBlbmRlbmNpZXMiOiB7IH0sCisJImNsYXNzUGF0aCI6ICJzcmMiCit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQWJzdHJhY3RNZXRob2RFcnJvci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9BYnN0cmFjdE1ldGhvZEVycm9yLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YjgxNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQWJzdHJhY3RNZXRob2RFcnJvci5oeApAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKKyNpZiBmbGFzaAoraW1wb3J0IGZsYXNoLmVycm9ycy5JbGxlZ2FsT3BlcmF0aW9uRXJyb3I7CisjZWxzZQoraW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisjZW5kCisKK2NsYXNzIEFic3RyYWN0TWV0aG9kRXJyb3IKKyNpZiBmbGFzaAorZXh0ZW5kcyBJbGxlZ2FsT3BlcmF0aW9uRXJyb3IKKyNlbHNlCitleHRlbmRzIFRFeGNlcHRpb24KKyNlbmQKK3sKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcobWVzc2FnZSA6IFN0cmluZz0iIikgeworICAgICAgICAgIHN1cGVyKCJBdHRlbXB0IHRvIGNhbGwgYW4gYWJzdHJhY3QgbWV0aG9kIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQXJndW1lbnRFcnJvci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Bcmd1bWVudEVycm9yLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYTA0ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQXJndW1lbnRFcnJvci5oeApAQCAtMCwwICsxLDI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKKyNpZiAhIGZsYXNoCisvLyBwcmVkZWZpbmVkIGZvciBmbGFzaCBvbmx5CitjbGFzcyBBcmd1bWVudEVycm9yIGV4dGVuZHMgVEV4Y2VwdGlvbiB7CisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhtc2cgOiBTdHJpbmcgPSAiIikgeworICAgICAgICBzdXBlcihtc2cpOworICAgIH0KK30KKyNlbmQKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9MaW1pdHMuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvTGltaXRzLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZWVjM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvTGltaXRzLmh4CkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworY2xhc3MgTGltaXRzIHsKKworICAgIC8vIEhheGUgbGltaXRzIGFyZSBub3QgZml4ZWQgdmFsdWVzLCB0aGV5IGRlcGVuZCBvbiB0aGUgdGFyZ2V0IHBsYXRmb3JtCisgICAgLy8gRm9yIGV4YW1wbGUsIG5la28gbGltaXRzIGFuIGludCB0byAzMSBiaXRzIGluc3RlYWQgb2YgMzIuIFNvIHdlIGRldGVjdAorICAgIC8vIHRoZSB2YWx1ZXMgb25jZSBkdXJpbmcgaW50aWFsaXNhdGlvbiBpbiBvcmRlciB0bworICAgIC8vIChhKSBnZXQgdGhlIHJpZ2h0IHZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgIHBsYXRmb3JtLCBhbmQKKyAgICAvLyAoYikgcHJldmVudCB1cyBmcm9tIGRlcGVuZGVjaWVzIHRvIGEgYnVuY2ggb2YgZGVmaW5lcworCisgICAgcHVibGljIHN0YXRpYyB2YXIgSTMyX01BWCA9IHsKKyAgICAgICAgdmFyIGxhc3QgOiBJbnQgPSAwOworICAgICAgICB2YXIgbmV4dCA6IEludCA9IDA7CisgICAgICAgIGZvcihiaXQgaW4gMCAuLi4gMzIpIHsKKyAgICAgICAgICAgIGxhc3QgPSBuZXh0OworICAgICAgICAgICAgbmV4dCA9IGxhc3QgfCAoMSA8PCBiaXQpOworICAgICAgICAgICAgaWYobmV4dCA8IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsYXN0OyAvLyBmaW5hbCB2YWx1ZQorICAgIH0KKworICAgIC8vIGFkZCB3aGF0ZXZlciB5b3UgbmVlZAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZTg0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmh4CkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZTsKKworICAvKioKKyAgICogQXBwbGljYXRpb24gbGV2ZWwgZXhjZXB0aW9uCisgICAqLworY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgVEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9TVFJVQ1QgPSB7IG5ldyBUU3RydWN0KCJUQXBwbGljYXRpb25FeGNlcHRpb24iKTsgfTsKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgTUVTU0FHRV9GSUVMRCA9IHsgbmV3IFRGaWVsZCgibWVzc2FnZSIsIFRUeXBlLlNUUklORywgMSk7IH07CisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIFRZUEVfRklFTEQgPSB7IG5ldyBURmllbGQoInR5cGUiLCBUVHlwZS5JMzIsIDIpOyB9OworCisgICAgLy8gV0FSTklORzogVGhlc2UgYXJlIHN1YmplY3QgdG8gYmUgZXh0ZW5kZWQgaW4gdGhlIGZ1dHVyZSwgc28gd2UgY2FuJ3QgdXNlIGVudW1zCisgICAgLy8gd2l0aCBIYXhlIDMuMS4zIGJlY2F1c2Ugb2YgaHR0cHM6Ly9naXRodWIuY29tL0hheGVGb3VuZGF0aW9uL2hheGUvaXNzdWVzLzM2NDkKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgVU5LTk9XTiA6IEludCA9IDA7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFVOS05PV05fTUVUSE9EIDogSW50ID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgSU5WQUxJRF9NRVNTQUdFX1RZUEUgOiBJbnQgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBXUk9OR19NRVRIT0RfTkFNRSA6IEludCA9IDM7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEJBRF9TRVFVRU5DRV9JRCA6IEludCA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE1JU1NJTkdfUkVTVUxUIDogSW50ID0gNTsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgSU5URVJOQUxfRVJST1IgOiBJbnQgPSA2OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBQUk9UT0NPTF9FUlJPUiA6IEludCA9IDc7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIElOVkFMSURfVFJBTlNGT1JNIDogSW50ID0gODsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgSU5WQUxJRF9QUk9UT0NPTCA6IEludCA9IDk7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFIDogSW50ID0gMTA7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KHR5cGUgOiBJbnQgPSBVTktOT1dOLCBtZXNzYWdlIDogU3RyaW5nID0gIiIpIHsKKyAgICAgIHN1cGVyKG1lc3NhZ2UsIHR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVhZChpcHJvdDpUUHJvdG9jb2wpIDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHZhciBmaWVsZDpURmllbGQ7CisgICAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKworICAgICAgdmFyIG1lc3NhZ2UgOiBTdHJpbmcgPSBudWxsOworICAgICAgdmFyIHR5cGUgOiBJbnQgPSBVTktOT1dOOworCisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGZpZWxkLmlkKSB7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgICAgIG1lc3NhZ2UgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5JMzIpIHsKKyAgICAgICAgICAgICAgdHlwZSA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICB9CisgICAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOworICAgICAgcmV0dXJuIG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24odHlwZSwgbWVzc2FnZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKG9wcm90OlRQcm90b2NvbCkgOiBWb2lkIHsKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihUQVBQTElDQVRJT05fRVhDRVBUSU9OX1NUUlVDVCk7CisgICAgICAgIGlmIChlcnJvck1zZyAhPSBudWxsKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKE1FU1NBR0VfRklFTEQpOworICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGVycm9yTXNnKTsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFRZUEVfRklFTEQpOworICAgICAgICBvcHJvdC53cml0ZUkzMihlcnJvcklEKTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOworICAgICAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpOworICAgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZTBiZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2UuaHgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCisvLyBNYWtlIHN1cmUgd2UgdXNlIGF0IGxlYXN0IDMuMS4zCisvLyBTb21lIExpbnV4IHBsYXRmb3JtcyBoYXZlIHdhYWFheSB0b28gb2xkIHBhY2thZ2VzIGluIHRoZWlyIHJlcG9zCisvLyBQcm8gVGlwOiBMb29rIGF0IGh0dHA6Ly9vcGVuZmwuY29tIGZvciBhIGdvb2QgTGludXggaW5zdGFsbCBzY3JpcHQKKyNpZiggaGF4ZV92ZXIgPCAzLjEwMykKKyNlcnJvciBIYXhlIDMuMS4zIG9yIG5ld2VyIHJlcXVpcmVkLCBzb3JyeSEKKyNlbmQKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKKworICAvKioKKyAgICogR2VuZXJpYyBiYXNlIGludGVyZmFjZSBmb3IgZ2VuZXJhdGVkIFRocmlmdCBvYmplY3RzLgorICAgKgorICAgKi8KK2ludGVyZmFjZSBUQmFzZSB7CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgVE9iamVjdCBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpcHJvdCBJbnB1dCBwcm90b2NvbAorICAgICAqLworICAgIGZ1bmN0aW9uIHJlYWQoaXByb3Q6VFByb3RvY29sKSA6IFZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIG9iamVjdHMgb3V0IHRvIHRoZSBwcm90b2NvbAorICAgICAqCisgICAgICogQHBhcmFtIG9wcm90IE91dHB1dCBwcm90b2NvbAorICAgICAqLworICAgIGZ1bmN0aW9uIHdyaXRlKG9wcm90OlRQcm90b2NvbCkgOiBWb2lkOworCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgYSBmaWVsZCBpcyBjdXJyZW50bHkgc2V0IG9yIHVuc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIGZpZWxkSWQgVGhlIGZpZWxkJ3MgaWQgdGFnIGFzIGZvdW5kIGluIHRoZSBJREwuCisgICAgICovCisgICAgZnVuY3Rpb24gaXNTZXQoZmllbGRJZCA6IEludCkgOiBCb29sOworCisgICAgLyoqCisgICAgICogR2V0IGEgZmllbGQncyB2YWx1ZSBieSBpZC4gUHJpbWl0aXZlIHR5cGVzIHdpbGwgYmUgd3JhcHBlZCBpbiB0aGUKKyAgICAgKiBhcHByb3ByaWF0ZSAiYm94ZWQiIHR5cGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZpZWxkSWQgVGhlIGZpZWxkJ3MgaWQgdGFnIGFzIGZvdW5kIGluIHRoZSBJREwuCisgICAgICovCisgICAgZnVuY3Rpb24gZ2V0RmllbGRWYWx1ZShmaWVsZElkIDogSW50KSA6IER5bmFtaWM7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBmaWVsZCdzIHZhbHVlIGJ5IGlkLiBQcmltaXRpdmUgdHlwZXMgbXVzdCBiZSAiYm94ZWQiIGluIHRoZQorICAgICAqIGFwcHJvcHJpYXRlIG9iamVjdCB3cmFwcGVyIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmllbGRJZCBUaGUgZmllbGQncyBpZCB0YWcgYXMgZm91bmQgaW4gdGhlIElETC4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBzZXRGaWVsZFZhbHVlKGZpZWxkSWQgOiBJbnQsIHZhbHVlIDogRHluYW1pYykgOiBWb2lkOworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFeGNlcHRpb24uaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEV4Y2VwdGlvbi5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGZhMWZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFeGNlcHRpb24uaHgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitjbGFzcyBURXhjZXB0aW9uIHsKKworICAgIEA6aXNWYXIKKyAgICBwdWJsaWMgdmFyIGVycm9ySUQoZGVmYXVsdCxudWxsKSA6IEludDsKKyAgICBAOmlzVmFyCisgICAgcHVibGljIHZhciBlcnJvck1zZyhkZWZhdWx0LG51bGwpIDogU3RyaW5nOworCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KG1zZyA6IFN0cmluZyA9ICIiLCBpZCA6IEludCA9IDApIHsKKyAgICAgICAgZXJyb3JJRCA9IGlkOworICAgICAgICBlcnJvck1zZyA9IG1zZzsKKyAgICB9CisKK30KKyAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEZpZWxkUmVxdWlyZW1lbnRUeXBlLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RGaWVsZFJlcXVpcmVtZW50VHlwZS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzlhMmNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RGaWVsZFJlcXVpcmVtZW50VHlwZS5oeApAQCAtMCwwICsxLDMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKKyAgLyoqCisgICAqIFJlcXVpcmVtZW50IHR5cGUgY29uc3RhbnRzLgorICAgKgorICAgKi8KK0A6ZW51bQorYWJzdHJhY3QgVEZpZWxkUmVxdWlyZW1lbnRUeXBlKEludCkgIGZyb20gSW50IHRvIEludCAgeworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBSRVFVSVJFRCA6IEludCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE9QVElPTkFMIDogSW50ID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgREVGQVVMVCAgOiBJbnQgPSAzOworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RQcm9jZXNzb3IuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFByb2Nlc3Nvci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2I2ZjdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RQcm9jZXNzb3IuaHgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworCisvKioKKyAqIEEgcHJvY2Vzc29yIGlzIGEgZ2VuZXJpYyBvYmplY3Qgd2hpY2ggb3BlcmF0ZXMgdXBvbiBhbiBpbnB1dCBzdHJlYW0gYW5kCisgKiB3cml0ZXMgdG8gc29tZSBvdXRwdXQgc3RyZWFtLgorICovCitpbnRlcmZhY2UgVFByb2Nlc3NvciB7CisgICAgZnVuY3Rpb24gcHJvY2VzcyhpbnB1dDpUUHJvdG9jb2wsIG91dHB1dDpUUHJvdG9jb2wpIDogQm9vbDsKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvQml0Q29udmVydGVyLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9CaXRDb252ZXJ0ZXIuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUwYWFhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvQml0Q29udmVydGVyLmh4CkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyOworCitpbXBvcnQgaGF4ZS5JbnQ2NDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuaW8uQnl0ZXNCdWZmZXI7CisKK2NsYXNzIEJpdENvbnZlcnRlciB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIERvdWJsZVRvSW50NjRCaXRzKCBkYiA6IEZsb2F0KSA6IEludDY0IHsKKyAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICBidWYuYWRkRG91YmxlKCBkYik7CisgICAgICAgIHJldHVybiBieXRlc1RvTG9uZyggYnVmLmdldEJ5dGVzKCkpOworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBJbnQ2NEJpdHNUb0RvdWJsZSggaTY0IDogSW50NjQpIDogRmxvYXQgeworICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hZGQoIGZpeGVkTG9uZ1RvQnl0ZXMoIGk2NCkpOworICAgICAgICByZXR1cm4gYnVmLmdldEJ5dGVzKCkuZ2V0RG91YmxlKDApOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgbG9uZyBpbnRvIGxpdHRsZS1lbmRpYW4gYnl0ZXMgaW4gYnVmIHN0YXJ0aW5nIGF0IG9mZiBhbmQgZ29pbmcKKyAgICAgKiB1bnRpbCBvZmYrNy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZpeGVkTG9uZ1RvQnl0ZXMoIG4gOiBJbnQ2NCkgIDogQnl0ZXMgeworICAgICAgICB2YXIgYnVmID0gQnl0ZXMuYWxsb2MoOCk7CisgICAgICAgICNpZiggaGF4ZV92ZXIgPCAzLjIpCisgICAgICAgIGJ1Zi5zZXQoIDAsIEludDY0LmdldExvdyggSW50NjQuYW5kKCBuLCBJbnQ2NC5tYWtlKDAsIDB4ZmYpKSkpOworICAgICAgICBidWYuc2V0KCAxLCBJbnQ2NC5nZXRMb3coIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCA4KSwgIEludDY0Lm1ha2UoMCwgMHhmZikpKSk7CisgICAgICAgIGJ1Zi5zZXQoIDIsIEludDY0LmdldExvdyggSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDE2KSwgSW50NjQubWFrZSgwLCAweGZmKSkpKTsKKyAgICAgICAgYnVmLnNldCggMywgSW50NjQuZ2V0TG93KCBJbnQ2NC5hbmQoIEludDY0LnNociggbiwgMjQpLCBJbnQ2NC5tYWtlKDAsIDB4ZmYpKSkpOworICAgICAgICBidWYuc2V0KCA0LCBJbnQ2NC5nZXRMb3coIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCAzMiksIEludDY0Lm1ha2UoMCwgMHhmZikpKSk7CisgICAgICAgIGJ1Zi5zZXQoIDUsIEludDY0LmdldExvdyggSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDQwKSwgSW50NjQubWFrZSgwLCAweGZmKSkpKTsKKyAgICAgICAgYnVmLnNldCggNiwgSW50NjQuZ2V0TG93KCBJbnQ2NC5hbmQoIEludDY0LnNociggbiwgNDgpLCBJbnQ2NC5tYWtlKDAsIDB4ZmYpKSkpOworICAgICAgICBidWYuc2V0KCA3LCBJbnQ2NC5nZXRMb3coIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCA1NiksIEludDY0Lm1ha2UoMCwgMHhmZikpKSk7CisgICAgICAgICNlbHNlCisgICAgICAgIGJ1Zi5zZXQoIDAsIEludDY0LmFuZCggbiwgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgYnVmLnNldCggMSwgSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDgpLCAgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgYnVmLnNldCggMiwgSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDE2KSwgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgYnVmLnNldCggMywgSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDI0KSwgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgYnVmLnNldCggNCwgSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDMyKSwgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgYnVmLnNldCggNSwgSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDQwKSwgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgYnVmLnNldCggNiwgSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDQ4KSwgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgYnVmLnNldCggNywgSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDU2KSwgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgI2VuZAorICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBsb25nIGxpdGVyYWxzLAorICAgICAqIG90aGVyd2lzZSB0aGV5J2xsIGRlZmF1bHQgdG8gaW50cywgYW5kIHdoZW4geW91IHNoaWZ0IGFuIGludCBsZWZ0IDU2IGJpdHMsCisgICAgICogeW91IGp1c3QgZ2V0IGEgbWVzc2VkIHVwIGludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGJ5dGVzVG9Mb25nKCBieXRlcyA6IEJ5dGVzKSA6IEludDY0IHsKKyAgICAgICAgdmFyIHJlc3VsdCA6IEludDY0ID0gSW50NjQubWFrZSgwLCAwKTsKKyAgICAgICAgcmVzdWx0ID0gSW50NjQub3IoIEludDY0LnNobCggcmVzdWx0LCA4KSwgSW50NjQubWFrZSggMCwgYnl0ZXMuZ2V0KDcpKSk7CisgICAgICAgIHJlc3VsdCA9IEludDY0Lm9yKCBJbnQ2NC5zaGwoIHJlc3VsdCwgOCksIEludDY0Lm1ha2UoIDAsIGJ5dGVzLmdldCg2KSkpOworICAgICAgICByZXN1bHQgPSBJbnQ2NC5vciggSW50NjQuc2hsKCByZXN1bHQsIDgpLCBJbnQ2NC5tYWtlKCAwLCBieXRlcy5nZXQoNSkpKTsKKyAgICAgICAgcmVzdWx0ID0gSW50NjQub3IoIEludDY0LnNobCggcmVzdWx0LCA4KSwgSW50NjQubWFrZSggMCwgYnl0ZXMuZ2V0KDQpKSk7CisgICAgICAgIHJlc3VsdCA9IEludDY0Lm9yKCBJbnQ2NC5zaGwoIHJlc3VsdCwgOCksIEludDY0Lm1ha2UoIDAsIGJ5dGVzLmdldCgzKSkpOworICAgICAgICByZXN1bHQgPSBJbnQ2NC5vciggSW50NjQuc2hsKCByZXN1bHQsIDgpLCBJbnQ2NC5tYWtlKCAwLCBieXRlcy5nZXQoMikpKTsKKyAgICAgICAgcmVzdWx0ID0gSW50NjQub3IoIEludDY0LnNobCggcmVzdWx0LCA4KSwgSW50NjQubWFrZSggMCwgYnl0ZXMuZ2V0KDEpKSk7CisgICAgICAgIHJlc3VsdCA9IEludDY0Lm9yKCBJbnQ2NC5zaGwoIHJlc3VsdCwgOCksIEludDY0Lm1ha2UoIDAsIGJ5dGVzLmdldCgwKSkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworCisgICAgI2lmIGRlYnVnCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gVGVzdEJUTCggdGVzdCA6IEludDY0KSA6IFZvaWQgeworICAgICAgICB2YXIgYnVmIDogQnl0ZXMgPSBmaXhlZExvbmdUb0J5dGVzKCB0ZXN0KTsKKyAgICAgICAgdmFyIGVyZyA9IGJ5dGVzVG9Mb25nKGJ1Zik7CisgICAgICAgIGlmICggSW50NjQuY29tcGFyZSggZXJnLCB0ZXN0KSAhPSAwKQorICAgICAgICAgICAgdGhyb3cgJ0JpdENvbnZlcnRlci5ieXRlc1RvTG9uZ1Rlc3QoJHRlc3QpIGZhaWxlZDogJGVyZyc7CisgICAgfQorICAgICNlbmQKKworCisgICAgI2lmIGRlYnVnCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gVGVzdFBhaXIoIGEgOiBGbG9hdCwgYiA6IEludDY0KSA6IFZvaWQgeworICAgICAgICB2YXIgYnggPSBEb3VibGVUb0ludDY0Qml0cyhhKTsKKyAgICAgICAgaWYgKCBJbnQ2NC5jb21wYXJlKCBieCwgYikgIT0gMCkKKyAgICAgICAgICAgIHRocm93ICdCaXRDb252ZXJ0ZXIuVGVzdFBhaXI6IERvdWJsZVRvSW50NjRCaXRzKCRhKTogZXhwZWN0ZWQgJGIsIGdvdCAkYngnOworICAgICAgICB2YXIgYXggPSBJbnQ2NEJpdHNUb0RvdWJsZShiKTsKKyAgICAgICAgaWYoIGF4ICE9IGEpCisgICAgICAgICAgICB0aHJvdyAnQml0Q29udmVydGVyLlRlc3RQYWlyOiBJbnQ2NEJpdHNUb0RvdWJsZSgkYjogZXhwZWN0ZWQgJGEsIGdvdCAgJGF4JzsKKyAgICB9CisgICAgI2VuZAorCisKKyAgICAjaWYgZGVidWcKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFVuaXRUZXN0KCkgOiBWb2lkIHsKKworICAgICAgICAvLyBieXRlc1RvTG9uZygpCisgICAgICAgIHZhciBpIDogSW50OworICAgICAgICBUZXN0QlRMKCBJbnQ2NC5tYWtlKDAsMCkpOworICAgICAgICBmb3IgKCBpIGluIDAgLi4uIDYyKSB7CisgICAgICAgICAgICBUZXN0QlRMKCBJbnQ2NC5zaGwoIEludDY0Lm1ha2UoMCwxKSwgaSkpOworICAgICAgICAgICAgVGVzdEJUTCggSW50NjQuc3ViKCBJbnQ2NC5tYWtlKDAsMCksIEludDY0LnNobCggSW50NjQubWFrZSgwLDEpLCBpKSkpOworICAgICAgICB9CisgICAgICAgIFRlc3RCVEwoIEludDY0Lm1ha2UoMHg3RkZGRkZGRiwweEZGRkZGRkZGKSk7CisgICAgICAgIFRlc3RCVEwoIEludDY0Lm1ha2UoY2FzdCgweDgwMDAwMDAwLEludCksMHgwMDAwMDAwMCkpOworCisgICAgICAgIC8vIERvdWJsZVRvSW50NjRCaXRzOworICAgICAgICBUZXN0UGFpciggMS4wMDAwMDAwMDAwMDAwMDAwRSswMDAsICBJbnQ2NC5tYWtlKGNhc3QoMHgzRkYwMDAwMCxJbnQpLGNhc3QoMHgwMDAwMDAwMCxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAxLjUwMDAwMDAwMDAwMDAwMDBFKzAwMSwgIEludDY0Lm1ha2UoY2FzdCgweDQwMkUwMDAwLEludCksY2FzdCgweDAwMDAwMDAwLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDIuNTUwMDAwMDAwMDAwMDAwMEUrMDAyLCAgSW50NjQubWFrZShjYXN0KDB4NDA2RkUwMDAsSW50KSxjYXN0KDB4MDAwMDAwMDAsSW50KSkpOworICAgICAgICBUZXN0UGFpciggNC4yOTQ5NjcyOTUwMDAwMDAwRSswMDksICBJbnQ2NC5tYWtlKGNhc3QoMHg0MUVGRkZGRixJbnQpLGNhc3QoMHhGRkUwMDAwMCxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAzLjkwNjI1MDAwMDAwMDAwMDBFLTAwMywgIEludDY0Lm1ha2UoY2FzdCgweDNGNzAwMDAwLEludCksY2FzdCgweDAwMDAwMDAwLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDIuMzI4MzA2NDM2NTM4Njk2M0UtMDEwLCAgSW50NjQubWFrZShjYXN0KDB4M0RGMDAwMDAsSW50KSxjYXN0KDB4MDAwMDAwMDAsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjMwMDAwRS0zMDAsICBJbnQ2NC5tYWtlKGNhc3QoMHgwMUFBNzRGRSxJbnQpLGNhc3QoMHgxQzFFN0U0NSxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAxLjIzNDU2Nzg5MDEyMzQ1MDBFLTE1MCwgIEludDY0Lm1ha2UoY2FzdCgweDIwRDAyQTM2LEludCksY2FzdCgweDU4NkRCNEJCLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDEuMjM0NTY3ODkwMTIzNDU2NUUrMDAwLCAgSW50NjQubWFrZShjYXN0KDB4M0ZGM0MwQ0EsSW50KSxjYXN0KDB4NDI4QzU5RkEsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY3RSswMDAsICBJbnQ2NC5tYWtlKGNhc3QoMHgzRkYzQzBDQSxJbnQpLGNhc3QoMHg0MjhDNTlGQixJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAxLjIzNDU2Nzg5MDEyMzQ1NjlFKzAwMCwgIEludDY0Lm1ha2UoY2FzdCgweDNGRjNDMENBLEludCksY2FzdCgweDQyOEM1OUZDLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDEuMjM0NTY3ODkwMTIzNDU2OUUrMTUwLCAgSW50NjQubWFrZShjYXN0KDB4NUYxODIzNDQsSW50KSxjYXN0KDB4Q0QzQ0RGOUYsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY5RSszMDAsICBJbnQ2NC5tYWtlKGNhc3QoMHg3RTNEN0VFOCxJbnQpLGNhc3QoMHhCQ0JCRDM1MixJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIEludDY0Lm1ha2UoY2FzdCgweEZGRUZGRkZGLEludCksY2FzdCgweEZGRkZGRkZGLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAgSW50NjQubWFrZShjYXN0KDB4N0ZFRkZGRkYsSW50KSxjYXN0KDB4RkZGRkZGRkYsSW50KSkpOworICAgICAgICBUZXN0UGFpciggNC45NDA2NTY0NTg0MTI0NjU0RS0zMjQsICBJbnQ2NC5tYWtlKGNhc3QoMHgwMDAwMDAwMCxJbnQpLGNhc3QoMHgwMDAwMDAwMSxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAwLjAwMDAwMDAwMDAwMDAwMDBFKzAwMCwgIEludDY0Lm1ha2UoY2FzdCgweDAwMDAwMDAwLEludCksY2FzdCgweDAwMDAwMDAwLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDQuOTQwNjU2NDU4NDEyNDdFLTMyNCwgICAgSW50NjQubWFrZShjYXN0KDB4MDAwMDAwMDAsSW50KSxjYXN0KDB4MDAwMDAwMDEsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMy4yMzc4NTkyMTAwMjA2MDkyRS0zMTksICBJbnQ2NC5tYWtlKGNhc3QoMHgwMDAwMDAwMCxJbnQpLGNhc3QoMHgwMDAwRkZGRixJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAxLjM5MDY3MTE2MTU2Njk5NTlFLTMwOSwgIEludDY0Lm1ha2UoY2FzdCgweDAwMDBGRkZGLEludCksY2FzdCgweEZGRkZGRkZGLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIE1hdGguTkVHQVRJVkVfSU5GSU5JVFksICAgSW50NjQubWFrZShjYXN0KDB4RkZGMDAwMDAsSW50KSxjYXN0KDB4MDAwMDAwMDAsSW50KSkpOworICAgICAgICBUZXN0UGFpciggTWF0aC5QT1NJVElWRV9JTkZJTklUWSwgICBJbnQ2NC5tYWtlKGNhc3QoMHg3RkYwMDAwMCxJbnQpLGNhc3QoMHgwMDAwMDAwMCxJbnQpKSk7CisKKyAgICAgICAgLy8gTmFOIGlzIHNwZWNpYWwKKyAgICAgICAgdmFyIGk2NG5hbiA9IERvdWJsZVRvSW50NjRCaXRzKCBNYXRoLk5hTik7CisgICAgICAgIHZhciBpNjRjbXAgPSBJbnQ2NC5tYWtlKGNhc3QoMHhGRkY4MDAwMCwgSW50KSwgY2FzdCgweDAwMDAwMDAwLCBJbnQpKTsKKyAgICAgICAgaWYgKCAhIE1hdGguaXNOYU4oIEludDY0Qml0c1RvRG91YmxlKCBpNjRjbXApKSkKKyAgICAgICAgICAgIHRocm93ICdCaXRDb252ZXJ0ZXIgTmFOLVRlc3QgIzE6IGV4cGVjdGVkIE5hTic7CisKKyAgICAgICAgLy8gRm9yIGRvdWJsZXMsIGEgcXVpZXQgTmFOIGlzIGEgYml0IHBhdHRlcm4KKyAgICAgICAgLy8gYmV0d2VlbiA3RkY4MDAwMDAwMDAwMDAwIGFuZCA3RkZGRkZGRkZGRkZGRkZGCisgICAgICAgIC8vICAgICAgb3IgRkZGODAwMDAwMDAwMDAwMCBhbmQgRkZGRkZGRkZGRkZGRkZGRgorICAgICAgICB2YXIgbWluMSA9IEludDY0Lm1ha2UoIGNhc3QoMHg3RkY4MDAwMCwgSW50KSwgY2FzdCgweDAwMDAwMDAwLCBJbnQpKTsKKyAgICAgICAgdmFyIG1heDEgPSBJbnQ2NC5tYWtlKCBjYXN0KDB4N0ZGRkZGRkYsIEludCksIGNhc3QoMHhGRkZGRkZGRiwgSW50KSk7CisgICAgICAgIHZhciBtaW4yID0gSW50NjQubWFrZSggY2FzdCgweEZGRjgwMDAwLCBJbnQpLCBjYXN0KDB4MDAwMDAwMDAsIEludCkpOworICAgICAgICB2YXIgbWF4MiA9IEludDY0Lm1ha2UoIGNhc3QoMHhGRkZGRkZGRiwgSW50KSwgY2FzdCgweEZGRkZGRkZGLCBJbnQpKTsKKyAgICAgICAgdmFyIG9rMSA9ICAoSW50NjQuY29tcGFyZSggbWluMSwgaTY0bmFuKSA8PSAwKSAmJiAoSW50NjQuY29tcGFyZSggaTY0bmFuLCBtYXgxKSA8PSAwKTsKKyAgICAgICAgdmFyIG9rMiA9ICAoSW50NjQuY29tcGFyZSggbWluMiwgaTY0bmFuKSA8PSAwKSAmJiAoSW50NjQuY29tcGFyZSggaTY0bmFuLCBtYXgyKSA8PSAwKTsKKyAgICAgICAgaWYoICEgKG9rMSB8fCBvazIpKQorICAgICAgICAgICAgdGhyb3cgJ0JpdENvbnZlcnRlciBOYU4tVGVzdCAjMjogZmFpbGVkJzsKKyAgICB9CisgICAgI2VuZAorCit9CisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9JbnQ2NE1hcC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvSW50NjRNYXAuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg0NWZkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvSW50NjRNYXAuaHgKQEAgLTAsMCArMSwyOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXI7CisKK2ltcG9ydCBNYXA7CitpbXBvcnQgaGF4ZS5JbnQ2NDsKK2ltcG9ydCBoYXhlLmRzLkludE1hcDsKKworCisvLyBJbnQ2NE1hcCBhbGxvd3MgbWFwcGluZyBvZiBJbnQ2NCBrZXlzIHRvIGFyYml0cmFyeSB2YWx1ZXMuCisvLyBPYmplY3RNYXA8PiBjYW5ub3QgYmUgdXNlZCwgc2luY2Ugd2Ugd2FudCB0byBjb21wYXJlIGJ5IHZhbHVlLCBub3QgYWRkcmVzcworCitjbGFzcyBJbnQ2NE1hcDxUPiBpbXBsZW1lbnRzIElNYXA8IEludDY0LCBUPiB7CisKKyAgICBwcml2YXRlIHZhciBTdWJNYXBzIDogSW50TWFwPCBJbnRNYXA8IFQ+PjsgIC8vIEhpIC0+IExvIC0+IFZhbHVlCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCkgOiBWb2lkIHsKKyAgICAgICAgU3ViTWFwcyA9IG5ldyBJbnRNYXA8IEludE1hcDwgVD4+KCk7CisgICAgfTsKKworICAgIHByaXZhdGUgZnVuY3Rpb24gR2V0U3ViTWFwKCBoaSA6IGhheGUuSW50MzIsIGNhbkNyZWF0ZSA6IEJvb2wpIDogSW50TWFwPCBUPiB7CisgICAgICAgIGlmKCBTdWJNYXBzLmV4aXN0cyhoaSkpIHsKKyAgICAgICAgICAgIHJldHVybiBTdWJNYXBzLmdldChoaSk7CisgICAgICAgIH0KKworICAgICAgICBpZiggISBjYW5DcmVhdGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGxvbWFwID0gbmV3IEludE1hcDwgVD4oKTsKKyAgICAgICAgU3ViTWFwcy5zZXQoIGhpLCBsb21hcCk7CisgICAgICAgIHJldHVybiBsb21hcDsKKyAgICB9CisKKworICAgIHByaXZhdGUgZnVuY3Rpb24gR2V0TG93TWFwKCBrZXkgOiBoYXhlLkludDY0LCBjYW5DcmVhdGUgOiBCb29sKSA6IEludE1hcDwgVD4geworICAgICAgICAjaWYoIGhheGVfdmVyIDwgMy4yKQorICAgICAgICByZXR1cm4gR2V0U3ViTWFwKCBJbnQ2NC5nZXRIaWdoKGtleSksIGNhbkNyZWF0ZSk7CisgICAgICAgICNlbHNlCisgICAgICAgIHJldHVybiBHZXRTdWJNYXAoIGtleS5oaWdoLCBjYW5DcmVhdGUpOworICAgICAgICAjZW5kCisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIEdldExvd0luZGV4KCBrZXkgOiBoYXhlLkludDY0KSA6IGhheGUuSW50MzIgeworICAgICAgICAjaWYoIGhheGVfdmVyIDwgMy4yKQorICAgICAgICByZXR1cm4gSW50NjQuZ2V0TG93KGtleSk7CisgICAgICAgICNlbHNlCisgICAgICAgIHJldHVybiBrZXkubG93OworICAgICAgICAjZW5kCisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIE51bGxDaGVjaygga2V5IDogaGF4ZS5JbnQ2NCkgOiBCb29sIHsKKyAgICAgICAgI2lmKCBoYXhlX3ZlciA8IDMuMikKKyAgICAgICAgcmV0dXJuIChrZXkgIT0gbnVsbCk7CisgICAgICAgICNlbHNlCisgICAgICAgIHJldHVybiB0cnVlOyAgLy8gSW50NjQgaXMgbm90IG51bGxhYmxlIGFueW1vcmUgKGl0IG5ldmVyIHJlYWxseSB3YXMpCisgICAgICAgICNlbmQKKyAgICB9OworCisKKworICAgIC8qKgorICAgICAgICBNYXBzIGBrZXlgIHRvIGB2YWx1ZWAuCisgICAgICAgIElmIGBrZXlgIGFscmVhZHkgaGFzIGEgbWFwcGluZywgdGhlIHByZXZpb3VzIHZhbHVlIGRpc2FwcGVhcnMuCisgICAgICAgIElmIGBrZXlgIGlzIG51bGwsIHRoZSByZXN1bHQgaXMgdW5zcGVjaWZpZWQuCisgICAgKiovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldCgga2V5IDogSW50NjQsIHZhbHVlIDogVCApIDogVm9pZCB7CisgICAgICAgIGlmKCAhIE51bGxDaGVjayhrZXkpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB2YXIgbG9tYXAgPSBHZXRMb3dNYXAoIGtleSwgdHJ1ZSk7CisgICAgICAgIGxvbWFwLnNldCggR2V0TG93SW5kZXgoa2V5KSwgdmFsdWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICAgIFJldHVybnMgdGhlIGN1cnJlbnQgbWFwcGluZyBvZiBga2V5YC4KKyAgICAgICAgSWYgbm8gc3VjaCBtYXBwaW5nIGV4aXN0cywgbnVsbCBpcyByZXR1cm5lZC4KKyAgICAgICAgSWYgYGtleWAgaXMgbnVsbCwgdGhlIHJlc3VsdCBpcyB1bnNwZWNpZmllZC4KKworICAgICAgICBOb3RlIHRoYXQgYSBjaGVjayBsaWtlIGBtYXAuZ2V0KGtleSkgPT0gbnVsbGAgY2FuIGhvbGQgZm9yIHR3byByZWFzb25zOgorCisgICAgICAgICAgICAxLiB0aGUgbWFwIGhhcyBubyBtYXBwaW5nIGZvciBga2V5YAorICAgICAgICAgICAgMi4gdGhlIG1hcCBoYXMgYSBtYXBwaW5nIHdpdGggYSB2YWx1ZSBvZiBgbnVsbGAKKworICAgICAgICBJZiBpdCBpcyBpbXBvcnRhbnQgdG8gZGlzdGluZ3Vpc2ggdGhlc2UgY2FzZXMsIGBleGlzdHMoKWAgc2hvdWxkIGJlCisgICAgICAgIHVzZWQuCisKKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0KCBrZXkgOiBJbnQ2NCkgOiBOdWxsPFQ+IHsKKyAgICAgICAgaWYoICEgTnVsbENoZWNrKGtleSkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGxvbWFwID0gR2V0TG93TWFwKCBrZXksIHRydWUpOworICAgICAgICBpZiggbG9tYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbG9tYXAuZ2V0KCBHZXRMb3dJbmRleChrZXkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgICAgUmV0dXJucyB0cnVlIGlmIGBrZXlgIGhhcyBhIG1hcHBpbmcsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgSWYgYGtleWAgaXMgbnVsbCwgdGhlIHJlc3VsdCBpcyB1bnNwZWNpZmllZC4KKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZXhpc3RzKCBrZXkgOiBJbnQ2NCkgOiBCb29sIHsKKyAgICAgICAgaWYoICEgTnVsbENoZWNrKGtleSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBsb21hcCA9IEdldExvd01hcCgga2V5LCB0cnVlKTsKKyAgICAgICAgaWYoIGxvbWFwID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsb21hcC5leGlzdHMoIEdldExvd0luZGV4KGtleSkpOworICAgIH0KKworICAgIC8qKgorICAgICAgICBSZW1vdmVzIHRoZSBtYXBwaW5nIG9mIGBrZXlgIGFuZCByZXR1cm5zIHRydWUgaWYgc3VjaCBhIG1hcHBpbmcgZXhpc3RlZCwKKyAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLiBJZiBga2V5YCBpcyBudWxsLCB0aGUgcmVzdWx0IGlzIHVuc3BlY2lmaWVkLgorICAgICoqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZW1vdmUoIGtleSA6IEludDY0KSA6IEJvb2wgeworICAgICAgICBpZiggISBOdWxsQ2hlY2soa2V5KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGxvbWFwID0gR2V0TG93TWFwKCBrZXksIHRydWUpOworICAgICAgICBpZiggbG9tYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxvbWFwLnJlbW92ZSggR2V0TG93SW5kZXgoa2V5KSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgICAgUmV0dXJucyBhbiBJdGVyYXRvciBvdmVyIHRoZSBrZXlzIG9mIGB0aGlzYCBNYXAuCisgICAgICAgIFRoZSBvcmRlciBvZiBrZXlzIGlzIHVuZGVmaW5lZC4KKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24ga2V5cygpIDogSXRlcmF0b3I8SW50NjQ+IHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnQ2NEtleUl0ZXJhdG9yPFQ+KFN1Yk1hcHMpOworICAgIH0KKworICAgIC8qKgorICAgICAgICBSZXR1cm5zIGFuIEl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBvZiBgdGhpc2AgTWFwLgorICAgICAgICBUaGUgb3JkZXIgb2YgdmFsdWVzIGlzIHVuZGVmaW5lZC4KKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gaXRlcmF0b3IoKSA6IEl0ZXJhdG9yPFQ+IHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnQ2NFZhbHVlSXRlcmF0b3I8VD4oU3ViTWFwcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICAgIFJldHVybnMgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYHRoaXNgIE1hcC4KKyAgICAgICAgVGhlIGV4YWN0IHJlcHJlc2VudGF0aW9uIGRlcGVuZHMgb24gdGhlIHBsYXRmb3JtIGFuZCBrZXktdHlwZS4KKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdG9TdHJpbmcoKSA6IFN0cmluZyB7CisgICAgICAgIHZhciByZXN1bHQgOiBTdHJpbmcgPSAieyI7CisKKyAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yKCBrZXkgaW4gdGhpcy5rZXlzKCkpIHsKKyAgICAgICAgICAgIGlmKCBmaXJzdCkgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiLCI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlc3VsdCArPSAiICI7CisgICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmdldChrZXkpOworICAgICAgICAgICAgcmVzdWx0ICs9IEludDY0LnRvU3RyKGtleSkgKyAnID0+ICR2YWx1ZSc7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0ICsgIn0iOworICAgIH0KKworfQorCisKKy8vIGludGVybmFsIGhlbHBlciBjbGFzcyBmb3IgSW50NjRNYXA8VD4KKy8vIGFsbCBjbGFzcyB3aXRoIG1hdGNoaW5nIG1ldGhvZHMgY2FuIGJlIHVzZWQgYXMgaXRlcmF0b3IgKGR1Y2sgdHlwaW5nKQorcHJpdmF0ZSBjbGFzcyBJbnQ2NE1hcEl0ZXJhdG9yQmFzZTxUPiB7CisKKyAgICBwcml2YXRlIHZhciBTdWJNYXBzIDogSW50TWFwPCBJbnRNYXA8IFQ+PjsgIC8vIEhpIC0+IExvIC0+IFZhbHVlCisKKyAgICBwcml2YXRlIHZhciBIaUl0ZXJhdG9yIDogSXRlcmF0b3I8IEludD4gPSBudWxsOworICAgIHByaXZhdGUgdmFyIExvSXRlcmF0b3IgOiBJdGVyYXRvcjwgSW50PiA9IG51bGw7CisgICAgcHJpdmF0ZSB2YXIgQ3VycmVudEhpIDogSW50ID0gMDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIGRhdGEgOiBJbnRNYXA8IEludE1hcDwgVD4+KSA6IFZvaWQgeworICAgICAgICBTdWJNYXBzID0gZGF0YTsKKyAgICAgICAgSGlJdGVyYXRvciA9IFN1Yk1hcHMua2V5cygpOworICAgICAgICBMb0l0ZXJhdG9yID0gbnVsbDsKKyAgICAgICAgQ3VycmVudEhpID0gMDsKKyAgICB9OworCisgICAgLyoqCisgICAgICAgIFJldHVybnMgZmFsc2UgaWYgdGhlIGl0ZXJhdGlvbiBpcyBjb21wbGV0ZSwgdHJ1ZSBvdGhlcndpc2UuCisKKyAgICAgICAgVXN1YWxseSBpdGVyYXRpb24gaXMgY29uc2lkZXJlZCB0byBiZSBjb21wbGV0ZSBpZiBhbGwgZWxlbWVudHMgb2YgdGhlCisgICAgICAgIHVuZGVybHlpbmcgZGF0YSBzdHJ1Y3R1cmUgd2VyZSBoYW5kbGVkIHRocm91Z2ggY2FsbHMgdG8gbmV4dCgpLiBIb3dldmVyLAorICAgICAgICBpbiBjdXN0b20gaXRlcmF0b3JzIGFueSBsb2dpYyBtYXkgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNvbXBsZXRpb24KKyAgICAgICAgc3RhdGUuCisgICAgKiovCisgICAgcHVibGljIGZ1bmN0aW9uIGhhc05leHQoKSA6IEJvb2wgeworCisgICAgICAgIGlmKCAoTG9JdGVyYXRvciAhPSBudWxsKSAmJiBMb0l0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSggKEhpSXRlcmF0b3IgIT0gbnVsbCkgJiYgSGlJdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEN1cnJlbnRIaSA9IEhpSXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgTG9JdGVyYXRvciA9IFN1Yk1hcHMuZ2V0KEN1cnJlbnRIaSkua2V5cygpOworICAgICAgICAgICAgaWYoIChMb0l0ZXJhdG9yICE9IG51bGwpICYmIExvSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBIaUl0ZXJhdG9yID0gbnVsbDsKKyAgICAgICAgTG9JdGVyYXRvciA9IG51bGw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKK30KKworCisvLyBpbnRlcm5hbCBoZWxwZXIgY2xhc3MgZm9yIEludDY0TWFwPFQ+CisvLyBhbGwgY2xhc3Mgd2l0aCBtYXRjaGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIGFzIGl0ZXJhdG9yIChkdWNrIHR5cGluZykKK3ByaXZhdGUgY2xhc3MgSW50NjRLZXlJdGVyYXRvcjxUPmV4dGVuZHMgSW50NjRNYXBJdGVyYXRvckJhc2U8VD4geworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggZGF0YSA6IEludE1hcDwgSW50TWFwPCBUPj4pIDogVm9pZCB7CisgICAgICAgIHN1cGVyKGRhdGEpOworICAgIH07CisKKyAgICAvKioKKyAgICAgICAgUmV0dXJucyB0aGUgY3VycmVudCBpdGVtIG9mIHRoZSBJdGVyYXRvciBhbmQgYWR2YW5jZXMgdG8gdGhlIG5leHQgb25lLgorCisgICAgICAgIFRoaXMgbWV0aG9kIGlzIG5vdCByZXF1aXJlZCB0byBjaGVjayBoYXNOZXh0KCkgZmlyc3QuIEEgY2FsbCB0byB0aGlzCisgICAgICAgIG1ldGhvZCB3aGlsZSBoYXNOZXh0KCkgaXMgZmFsc2UgeWllbGRzIHVuc3BlY2lmaWVkIGJlaGF2aW9yLgorICAgICoqLworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXh0KCkgOiBJbnQ2NCB7CisgICAgICAgIGlmKCBoYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBJbnQ2NC5tYWtlKCBDdXJyZW50SGksIExvSXRlcmF0b3IubmV4dCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93ICJubyBtb3JlIGVsZW1lbnRzIjsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvLyBpbnRlcm5hbCBoZWxwZXIgY2xhc3MgZm9yIEludDY0TWFwPFQ+CisvLyBhbGwgY2xhc3Mgd2l0aCBtYXRjaGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIGFzIGl0ZXJhdG9yIChkdWNrIHR5cGluZykKK3ByaXZhdGUgY2xhc3MgSW50NjRWYWx1ZUl0ZXJhdG9yPFQ+IGV4dGVuZHMgSW50NjRNYXBJdGVyYXRvckJhc2U8VD4geworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggZGF0YSA6IEludE1hcDwgSW50TWFwPCBUPj4pIDogVm9pZCB7CisgICAgICAgIHN1cGVyKGRhdGEpOworICAgIH07CisKKyAgICAvKioKKyAgICAgICAgUmV0dXJucyB0aGUgY3VycmVudCBpdGVtIG9mIHRoZSBJdGVyYXRvciBhbmQgYWR2YW5jZXMgdG8gdGhlIG5leHQgb25lLgorCisgICAgICAgIFRoaXMgbWV0aG9kIGlzIG5vdCByZXF1aXJlZCB0byBjaGVjayBoYXNOZXh0KCkgZmlyc3QuIEEgY2FsbCB0byB0aGlzCisgICAgICAgIG1ldGhvZCB3aGlsZSBoYXNOZXh0KCkgaXMgZmFsc2UgeWllbGRzIHVuc3BlY2lmaWVkIGJlaGF2aW9yLgorICAgICoqLworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXh0KCkgOiBUIHsKKyAgICAgICAgaWYoIGhhc05leHQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFN1Yk1hcHMuZ2V0KEN1cnJlbnRIaSkuZ2V0KExvSXRlcmF0b3IubmV4dCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93ICJubyBtb3JlIGVsZW1lbnRzIjsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvLyBFT0YKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvSW50U2V0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9JbnRTZXQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlNWQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvSW50U2V0Lmh4CkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXI7CisKK2ltcG9ydCBNYXA7CisKKworY2xhc3MgSW50U2V0IHsKKworICAgIHByaXZhdGUgdmFyIF9lbGVtZW50cyA9IG5ldyBoYXhlLmRzLkludE1hcDxJbnQ+KCk7CisgICAgcHJpdmF0ZSB2YXIgX3NpemUgOiBJbnQgPSAwOworICAgIHB1YmxpYyB2YXIgc2l6ZShnZXQsbmV2ZXIpIDogSW50OworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggdmFsdWVzIDogQXJyYXk8SW50PiA9IG51bGwpIHsKKyAgICAgICAgaWYgKCB2YWx1ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yICggdmFsdWUgaW4gdmFsdWVzKSB7CisgICAgICAgICAgICAgICAgIGFkZCh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXRlcmF0b3IoKTpJdGVyYXRvcjxJbnQ+IHsKKyAgICAgICAgcmV0dXJuIF9lbGVtZW50cy5rZXlzKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRyYWNlQWxsKCkgOiBWb2lkIHsKKyAgICAgICAgdHJhY2UoJyRfc2l6ZSBlbnRyaWVzJyk7CisgICAgICAgIGZvcihlbnRyeSBpbiB0aGlzKSB7CisgICAgICAgICAgICB2YXIgeWVzID0gY29udGFpbnMoZW50cnkpOworICAgICAgICAgICAgdHJhY2UoJy0gJGVudHJ5LCBjb250YWlucygpID0gJHllcycpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZChvIDogSW50KSA6IEJvb2wgeworICAgICAgICBpZiggX2VsZW1lbnRzLmV4aXN0cyhvKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIF9zaXplKys7CisgICAgICAgIF9lbGVtZW50cy5zZXQobyxfc2l6ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhcigpIDogVm9pZCB7CisgICAgICAgIHdoaWxlKCBfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHJlbW92ZSggX2VsZW1lbnRzLmtleXMoKS5uZXh0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNvbnRhaW5zKG8gOiBJbnQpIDogQm9vbCB7CisgICAgICAgIHJldHVybiBfZWxlbWVudHMuZXhpc3RzKG8pOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc0VtcHR5KCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIF9zaXplID09IDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlbW92ZShvIDogSW50KSA6IEJvb2wgeworICAgICAgICBpZiAoY29udGFpbnMobykpIHsKKyAgICAgICAgICAgIF9lbGVtZW50cy5yZW1vdmUobyk7CisgICAgICAgICAgICBfc2l6ZS0tOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdG9BcnJheSgpIDogQXJyYXk8SW50PiB7CisgICAgICAgIHZhciByZXQgOiBBcnJheTxJbnQ+ID0gbmV3IEFycmF5PEludD4oKTsKKyAgICAgICAgZm9yIChrZXkgaW4gX2VsZW1lbnRzLmtleXMoKSkgeworICAgICAgICAgICAgcmV0LnB1c2goa2V5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRfc2l6ZSgpIDogSW50IHsKKyAgICAgICAgcmV0dXJuIF9zaXplOworICAgIH0KK30KKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL09iamVjdFNldC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvT2JqZWN0U2V0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZjcyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL09iamVjdFNldC5oeApAQCAtMCwwICsxLDk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyOworCitpbXBvcnQgTWFwOworCisKK2NsYXNzIE9iamVjdFNldDxLPiB7CisKKyAgICBwcml2YXRlIHZhciBfZWxlbWVudHMgPSBuZXcgaGF4ZS5kcy5PYmplY3RNYXA8SyxJbnQ+KCk7CisgICAgcHJpdmF0ZSB2YXIgX3NpemUgOiBJbnQgPSAwOworICAgIHB1YmxpYyB2YXIgc2l6ZShnZXQsbmV2ZXIpIDogSW50OworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggdmFsdWVzIDogQXJyYXk8Sz4gPSBudWxsKSB7CisgICAgICAgIGlmICggdmFsdWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoIHZhbHVlIGluIHZhbHVlcykgeworICAgICAgICAgICAgICAgICBhZGQodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGl0ZXJhdG9yKCk6SXRlcmF0b3I8Sz4geworICAgICAgICByZXR1cm4gX2VsZW1lbnRzLmtleXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdHJhY2VBbGwoKSA6IFZvaWQgeworICAgICAgICB0cmFjZSgnJF9zaXplIGVudHJpZXMnKTsKKyAgICAgICAgZm9yKGVudHJ5IGluIHRoaXMpIHsKKyAgICAgICAgICAgIHZhciB5ZXMgPSBjb250YWlucyhlbnRyeSk7CisgICAgICAgICAgICB0cmFjZSgnLSAkZW50cnksIGNvbnRhaW5zKCkgPSAkeWVzJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gYWRkKG8gOiBLKSA6IEJvb2wgeworICAgICAgICBpZiggX2VsZW1lbnRzLmV4aXN0cyhvKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIF9zaXplKys7CisgICAgICAgIF9lbGVtZW50cy5zZXQobyxfc2l6ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhcigpIDogVm9pZCB7CisgICAgICAgIHdoaWxlKCBfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHJlbW92ZSggX2VsZW1lbnRzLmtleXMoKS5uZXh0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNvbnRhaW5zKG8gOiBLKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gX2VsZW1lbnRzLmV4aXN0cyhvKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNFbXB0eSgpIDogQm9vbCB7CisgICAgICAgIHJldHVybiBfc2l6ZSA9PSAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZW1vdmUobyA6IEspIDogQm9vbCB7CisgICAgICAgIGlmIChjb250YWlucyhvKSkgeworICAgICAgICAgICAgX2VsZW1lbnRzLnJlbW92ZShvKTsKKyAgICAgICAgICAgIF9zaXplLS07CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0b0FycmF5KCkgOiBBcnJheTxLPiB7CisgICAgICAgIHZhciByZXQgOiBBcnJheTxLPiA9IG5ldyBBcnJheTxLPigpOworICAgICAgICBmb3IgKGtleSBpbiBfZWxlbWVudHMua2V5cygpKSB7CisgICAgICAgICAgICByZXQucHVzaChrZXkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldF9zaXplKCkgOiBJbnQgeworICAgICAgICByZXR1cm4gX3NpemU7CisgICAgfQorfQorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvU3RyaW5nU2V0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9TdHJpbmdTZXQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhjMGQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvU3RyaW5nU2V0Lmh4CkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXI7CisKK2ltcG9ydCBNYXA7CisKKworY2xhc3MgU3RyaW5nU2V0IHsKKworICAgIHByaXZhdGUgdmFyIF9lbGVtZW50cyA9IG5ldyBoYXhlLmRzLlN0cmluZ01hcDxJbnQ+KCk7CisgICAgcHJpdmF0ZSB2YXIgX3NpemUgOiBJbnQgPSAwOworICAgIHB1YmxpYyB2YXIgc2l6ZShnZXQsbmV2ZXIpIDogSW50OworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggdmFsdWVzIDogQXJyYXk8U3RyaW5nPiA9IG51bGwpIHsKKyAgICAgICAgaWYgKCB2YWx1ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yICggdmFsdWUgaW4gdmFsdWVzKSB7CisgICAgICAgICAgICAgICAgIGFkZCh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXRlcmF0b3IoKTpJdGVyYXRvcjxTdHJpbmc+IHsKKyAgICAgICAgcmV0dXJuIF9lbGVtZW50cy5rZXlzKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRyYWNlQWxsKCkgOiBWb2lkIHsKKyAgICAgICAgdHJhY2UoJyRfc2l6ZSBlbnRyaWVzJyk7CisgICAgICAgIGZvcihlbnRyeSBpbiB0aGlzKSB7CisgICAgICAgICAgICB2YXIgeWVzID0gY29udGFpbnMoZW50cnkpOworICAgICAgICAgICAgdHJhY2UoJy0gJGVudHJ5LCBjb250YWlucygpID0gJHllcycpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZChvIDogU3RyaW5nKSA6IEJvb2wgeworICAgICAgICBpZiggX2VsZW1lbnRzLmV4aXN0cyhvKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIF9zaXplKys7CisgICAgICAgIF9lbGVtZW50cy5zZXQobyxfc2l6ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhcigpIDogVm9pZCB7CisgICAgICAgIHdoaWxlKCBfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHJlbW92ZSggX2VsZW1lbnRzLmtleXMoKS5uZXh0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNvbnRhaW5zKG8gOiBTdHJpbmcpIDogQm9vbCB7CisgICAgICAgIHJldHVybiBfZWxlbWVudHMuZXhpc3RzKG8pOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc0VtcHR5KCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIF9zaXplID09IDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlbW92ZShvIDogU3RyaW5nKSA6IEJvb2wgeworICAgICAgICBpZiAoY29udGFpbnMobykpIHsKKyAgICAgICAgICAgIF9lbGVtZW50cy5yZW1vdmUobyk7CisgICAgICAgICAgICBfc2l6ZS0tOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdG9BcnJheSgpIDogQXJyYXk8U3RyaW5nPiB7CisgICAgICAgIHZhciByZXQgOiBBcnJheTxTdHJpbmc+ID0gbmV3IEFycmF5PFN0cmluZz4oKTsKKyAgICAgICAgZm9yIChrZXkgaW4gX2VsZW1lbnRzLmtleXMoKSkgeworICAgICAgICAgICAgcmV0LnB1c2goa2V5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRfc2l6ZSgpIDogU3RyaW5nIHsKKyAgICAgICAgcmV0dXJuIF9zaXplOworICAgIH0KK30KKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL1ppZ1phZy5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvWmlnWmFnLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmODYwMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL1ppZ1phZy5oeApAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlcjsKKworaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgaGF4ZS5JbnQzMjsKKworY2xhc3MgWmlnWmFnIHsKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICAgICAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEZyb21JbnQoIG4gOiBJbnQpIDogVUludCAgICB7CisgICAgICAgICNpZiBwaHAKKworICAgICAgICByZXR1cm4gY2FzdChjYXN0KGNhc3QobixJbnQzMikgPDwgMSxJbnQzMikgXiBjYXN0KGNhc3QobixJbnQzMikgPj4gMzEsSW50MzIpLFVJbnQpOworCisgICAgICAgICNlbHNlCisKKyAgICAgICAgcmV0dXJuIGNhc3QobiA8PCAxLFVJbnQpIF4gY2FzdChuID4+IDMxLFVJbnQpOworCisgICAgICAgICNlbmQKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgZnJvbSB6aWd6YWcgaW50IHRvIGludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFRvSW50KCBuIDogVUludCkgOiBJbnQgeworICAgICAgICAjaWYgcGhwCisKKyAgICAgICAgdmFyIGEgPSAoMHg3RkZGRkZGRiAmIGNhc3QobiA+PiAxLEludCkpOworICAgICAgICB2YXIgYiA9IChjYXN0KG4gJiAxLEludCkpOworICAgICAgICBiID0gLWI7ICAvLyB3b3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9pc3N1ZXMvNTI4OAorICAgICAgICByZXR1cm4gYSBeIGI7CisKKyAgICAgICAgI2Vsc2UKKworICAgICAgICByZXR1cm4gKDB4N0ZGRkZGRkYgJiBjYXN0KG4gPj4gMSxJbnQpKSBeICgtY2FzdChuICYgMSxJbnQpKTsKKworICAgICAgICAjZW5kCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgICAgICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gRnJvbUxvbmcoIG4gOiBJbnQ2NCkgOiBJbnQ2NCB7CisgICAgICAgIHJldHVybiBJbnQ2NC54b3IoIEludDY0LnNobChuLCAxKSwgSW50NjQuc2hyKG4sIDYzKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGZyb20gemlnemFnIGxvbmcgdG8gbG9uZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFRvTG9uZyggbiA6IEludDY0KSA6IEludDY0IHsKKyAgICAgICAgcmV0dXJuIEludDY0LnhvcigKKyAgICAgICAgICAgIEludDY0LmFuZCgKKyAgICAgICAgICAgICAgICBJbnQ2NC5zaHIobiwgMSksCisgICAgICAgICAgICAgICAgSW50NjQubWFrZSgweDdGRkZGRkZGLCAweEZGRkZGRkZGKSksCisgICAgICAgICAgICBJbnQ2NC5zdWIoCisgICAgICAgICAgICAgICAgSW50NjQubWFrZSgwLCAwKSwKKyAgICAgICAgICAgICAgICBJbnQ2NC5hbmQobiwgSW50NjQubWFrZSgwLDEpKSkpOworICAgIH0KKworCisgICAgI2lmIGRlYnVnCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gVGVzdDMyKCB0ZXN0IDogSW50KSA6IFZvaWQgeworICAgICAgICB2YXIgYSA6IFVJbnQgPSBaaWdaYWcuRnJvbUludCggdGVzdCk7CisgICAgICAgIHZhciBiIDogSW50ID0gWmlnWmFnLlRvSW50KGEpOworICAgICAgICAjaWYgcGhwCisgICAgICAgIHRlc3QgPSB0ZXN0ICYgMHhGRkZGRkZGRjsgIC8vIHdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL2lzc3Vlcy81Mjg5CisgICAgICAgICNlbmQKKyAgICAgICAgaWYoIHRlc3QgIT0gYikKKyAgICAgICAgICAgIHRocm93ICdaaWdaYWcuVGVzdDMyKCR0ZXN0KSBmYWlsZWQ6IGEgPSAkYSwgYiA9ICRiJzsKKyAgICB9CisgICAgI2VuZAorCisKKworICAgICNpZiBkZWJ1ZworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIFRlc3Q2NCggdGVzdCA6IGhheGUuSW50NjQpIDogVm9pZCB7CisgICAgICAgIHZhciBhIDogSW50NjQgPSBaaWdaYWcuRnJvbUxvbmcoIHRlc3QpOworICAgICAgICB2YXIgYiA6IEludDY0ID0gWmlnWmFnLlRvTG9uZyhhKTsKKyAgICAgICAgaWYoIEludDY0LmNvbXBhcmUoIHRlc3QsIGIpICE9IDApCisgICAgICAgICAgICB0aHJvdyAnWmlnWmFnLlRlc3Q2NCgkdGVzdCkgZmFpbGVkOiBhID0gJGEsIGIgPSAkYic7CisgICAgfQorICAgICNlbmQKKworCisgICAgI2lmIGRlYnVnCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBVbml0VGVzdCgpIDogVm9pZCB7CisgICAgICB2YXIgdTEgOiBVSW50ID0gMHhGRkZGRkZGRTsKKyAgICAgIHZhciB1MiA6IFVJbnQgPSAweEZGRkZGRkZGOworICAgICAgdmFyIGkxIDogSW50ID0gMjE0NzQ4MzY0NzsKKyAgICAgIHZhciBpMiA6IEludCA9IC0yMTQ3NDgzNjQ4OworCisgICAgICAjaWYgcGhwCisgICAgICBpMiA9IGkyICYgMHhGRkZGRkZGRjsgIC8vIHdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL2lzc3Vlcy81Mjg5CisgICAgICAjZW5kCisKKyAgICAgIC8vIHByb3RvYnVmIHRlc3RjYXNlcworICAgICAgaWYoIEZyb21JbnQoMCkgICE9IDApIHRocm93ICdwYiAjMSB0byBaaWdaYWcnOworICAgICAgaWYoIEZyb21JbnQoLTEpICE9IDEpIHRocm93ICdwYiAjMiB0byBaaWdaYWcnOworICAgICAgaWYoIEZyb21JbnQoMSkgICE9IDIpIHRocm93ICdwYiAjMyB0byBaaWdaYWcnOworICAgICAgaWYoIEZyb21JbnQoLTIpICE9IDMpIHRocm93ICdwYiAjNCB0byBaaWdaYWcnOworICAgICAgaWYoIEZyb21JbnQoaTEpICE9IHUxKSB0aHJvdyAncGIgIzUgdG8gWmlnWmFnJzsKKyAgICAgIGlmKCBGcm9tSW50KGkyKSAhPSB1MikgdGhyb3cgJ3BiICM2IHRvIFppZ1phZyc7CisKKyAgICAgIC8vIHByb3RvYnVmIHRlc3RjYXNlcworICAgICAgaWYoIFRvSW50KDApICE9IDApIHRocm93ICdwYiAjMSBmcm9tIFppZ1phZyc7CisgICAgICBpZiggVG9JbnQoMSkgIT0gLTEpIHRocm93ICdwYiAjMiBmcm9tIFppZ1phZyc7CisgICAgICBpZiggVG9JbnQoMikgIT0gMSkgdGhyb3cgJ3BiICMzIGZyb20gWmlnWmFnJzsKKyAgICAgIGlmKCBUb0ludCgzKSAhPSAtMikgdGhyb3cgJ3BiICM0IGZyb20gWmlnWmFnJzsKKyAgICAgIGlmKCBUb0ludCh1MSkgIT0gaTEpIHRocm93ICdwYiAjNSBmcm9tIFppZ1phZywgZ290ICR7VG9JbnQodTEpfSBleHBlY3RlZCAkaTEnOworICAgICAgaWYoIFRvSW50KHUyKSAhPSBpMikgdGhyb3cgJ3BiICM2IGZyb20gWmlnWmFnLCBnb3QgJHtUb0ludCh1Mil9IGV4cGVjdGVkICRpMic7CisKKyAgICAgIC8vIGJhY2sgYW5kIGZvcnRoIDMyCisgICAgICBUZXN0MzIoIDApOworICAgICAgZm9yKCBpIGluIDAgLi4uIDMwKSB7CisgICAgICAgIFRlc3QzMiggMSA8PCBpKTsKKyAgICAgICAgVGVzdDMyKCAtKDEgIDw8IGkpKTsKKyAgICAgIH0KKyAgICAgIFRlc3QzMiggMHg3RkZGRkZGRik7CisgICAgICBUZXN0MzIoIGNhc3QoMHg4MDAwMDAwMCxJbnQpKTsKKworICAgICAgLy8gYmFjayBhbmQgZm9ydGggNjQKKyAgICAgIFRlc3Q2NCggSW50NjQubWFrZSgwLDApKTsKKyAgICAgIGZvciggaSBpbiAwIC4uLiA2MikgeworICAgICAgICBUZXN0NjQoIEludDY0LnNobCggSW50NjQubWFrZSgwLDEpLCBpKSk7CisgICAgICAgIFRlc3Q2NCggSW50NjQuc3ViKCBJbnQ2NC5tYWtlKDAsMCksIEludDY0LnNobCggSW50NjQubWFrZSgwLDEpLCBpKSkpOworICAgICAgfQorICAgICAgVGVzdDY0KCBJbnQ2NC5tYWtlKDB4N0ZGRkZGRkYsMHhGRkZGRkZGRikpOworICAgICAgVGVzdDY0KCBJbnQ2NC5tYWtlKGNhc3QoMHg4MDAwMDAwMCxJbnQpLDB4MDAwMDAwMDApKTsKKyAgICB9CisgICAgI2VuZAorfQorCisgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZkYjExMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRNZXRhRGF0YS5oeApAQCAtMCwwICsxLDU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhOworCitpbXBvcnQgZmxhc2gudXRpbHMuRGljdGlvbmFyeTsKKworLyoqCisqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBzdG9yZSBtZXRhIGRhdGEgYWJvdXQgdGhyaWZ0IGZpZWxkcy4gRXZlcnkgZmllbGQgaW4gYQorKiBhIHN0cnVjdCBzaG91bGQgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBkZXNjcmliaW5nIGl0LgorKgorKi8KK2NsYXNzIEZpZWxkTWV0YURhdGEgeworCisgIHB1YmxpYyB2YXIgZmllbGROYW1lIDogU3RyaW5nOworICBwdWJsaWMgdmFyIHJlcXVpcmVtZW50VHlwZSA6IEludDsKKyAgcHVibGljIHZhciB2YWx1ZU1ldGFEYXRhOkZpZWxkVmFsdWVNZXRhRGF0YTsKKworICBwcml2YXRlIHN0YXRpYyB2YXIgc3RydWN0TWFwOkRpY3Rpb25hcnkgPSBuZXcgRGljdGlvbmFyeSgpOworCisgIHB1YmxpYyBmdW5jdGlvbiBGaWVsZE1ldGFEYXRhKG5hbWUgOiBTdHJpbmcsIHJlcSA6IEludCwgdk1ldGFEYXRhOkZpZWxkVmFsdWVNZXRhRGF0YSkgeworICAgIHRoaXMuZmllbGROYW1lID0gbmFtZTsKKyAgICB0aGlzLnJlcXVpcmVtZW50VHlwZSA9IHJlcTsKKyAgICB0aGlzLnZhbHVlTWV0YURhdGEgPSB2TWV0YURhdGE7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFkZFN0cnVjdE1ldGFEYXRhTWFwKHNDbGFzczpDbGFzcywgbWFwOkRpY3Rpb25hcnkpIDogVm9pZHsKKyAgICBzdHJ1Y3RNYXBbc0NsYXNzXSA9IG1hcDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIGEgbWFwIHdpdGggbWV0YWRhdGEgKGkuZS4gaW5zdGFuY2VzIG9mIEZpZWxkTWV0YURhdGEpIHRoYXQKKyAgICogZGVzY3JpYmUgdGhlIGZpZWxkcyBvZiB0aGUgZ2l2ZW4gY2xhc3MuCisgICAqCisgICAqIEBwYXJhbSBzQ2xhc3MgVGhlIFRCYXNlIGNsYXNzIGZvciB3aGljaCB0aGUgbWV0YWRhdGEgbWFwIGlzIHJlcXVlc3RlZAorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRTdHJ1Y3RNZXRhRGF0YU1hcChzQ2xhc3M6Q2xhc3MpOkRpY3Rpb25hcnkgeworICAgIHJldHVybiBzdHJ1Y3RNYXBbc0NsYXNzXTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZFZhbHVlTWV0YURhdGEuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkVmFsdWVNZXRhRGF0YS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODc5ZDkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZFZhbHVlTWV0YURhdGEuaHgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlOworCisvKioKKyAqIEZpZWxkVmFsdWVNZXRhRGF0YSBhbmQgY29sbGVjdGlvbiBvZiBzdWJjbGFzc2VzIHRvIHN0b3JlIG1ldGFkYXRhIGFib3V0CisgKiB0aGUgdmFsdWUocykgb2YgYSBmaWVsZAorICovCitjbGFzcyBGaWVsZFZhbHVlTWV0YURhdGEgeworCisgIHB1YmxpYyB2YXIgdHlwZSA6IEludDsKKworICBwdWJsaWMgZnVuY3Rpb24gRmllbGRWYWx1ZU1ldGFEYXRhKHR5cGUgOiBJbnQpIHsKKyAgICB0aGlzLnR5cGUgPSB0eXBlOworICB9CisKKyAgcHVibGljIGZ1bmN0aW9uIGlzU3RydWN0KCkgOiBCb29sIHsKKyAgICByZXR1cm4gdHlwZSA9PSBUVHlwZS5TVFJVQ1Q7CisgIH0KKworICBwdWJsaWMgZnVuY3Rpb24gaXNDb250YWluZXIoKSA6IEJvb2wgeworICAgIHJldHVybiB0eXBlID09IFRUeXBlLkxJU1QgfHwgdHlwZSA9PSBUVHlwZS5NQVAgfHwgdHlwZSA9PSBUVHlwZS5TRVQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvTGlzdE1ldGFEYXRhLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9MaXN0TWV0YURhdGEuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBjYTMxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvTGlzdE1ldGFEYXRhLmh4CkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGE7CisKK2NsYXNzIExpc3RNZXRhRGF0YSBleHRlbmRzIEZpZWxkVmFsdWVNZXRhRGF0YSB7CisKKyAgICBwdWJsaWMgdmFyIGVsZW1NZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGE7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gTGlzdE1ldGFEYXRhKHR5cGUgOiBJbnQsIGVNZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGEpIHsKKyAgICAgIHN1cGVyKHR5cGUpOworICAgICAgdGhpcy5lbGVtTWV0YURhdGEgPSBlTWV0YURhdGE7CisgICAgfQorfQorIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvTWFwTWV0YURhdGEuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL01hcE1ldGFEYXRhLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NjNlNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL01hcE1ldGFEYXRhLmh4CkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGE7CisKK2NsYXNzIE1hcE1ldGFEYXRhIGV4dGVuZHMgRmllbGRWYWx1ZU1ldGFEYXRhIHsKKworICAgIHB1YmxpYyB2YXIga2V5TWV0YURhdGE6RmllbGRWYWx1ZU1ldGFEYXRhOworICAgIHB1YmxpYyB2YXIgdmFsdWVNZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGE7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gTWFwTWV0YURhdGEodHlwZSA6IEludCwga01ldGFEYXRhOkZpZWxkVmFsdWVNZXRhRGF0YSwgdk1ldGFEYXRhOkZpZWxkVmFsdWVNZXRhRGF0YSkgeworICAgICAgc3VwZXIodHlwZSk7CisgICAgICB0aGlzLmtleU1ldGFEYXRhID0ga01ldGFEYXRhOworICAgICAgdGhpcy52YWx1ZU1ldGFEYXRhID0gdk1ldGFEYXRhOworICAgIH0KK30KKyAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvU2V0TWV0YURhdGEuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL1NldE1ldGFEYXRhLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMzY3ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL1NldE1ldGFEYXRhLmh4CkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGE7CisKK2NsYXNzIFNldE1ldGFEYXRhIGV4dGVuZHMgRmllbGRWYWx1ZU1ldGFEYXRhIHsKKworICAgIHB1YmxpYyB2YXIgZWxlbU1ldGFEYXRhOkZpZWxkVmFsdWVNZXRhRGF0YTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBTZXRNZXRhRGF0YSh0eXBlIDogSW50LCBlTWV0YURhdGE6RmllbGRWYWx1ZU1ldGFEYXRhKSB7CisgICAgICBzdXBlcih0eXBlKTsKKyAgICAgIHRoaXMuZWxlbU1ldGFEYXRhID0gZU1ldGFEYXRhOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvU3RydWN0TWV0YURhdGEuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL1N0cnVjdE1ldGFEYXRhLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MjJkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL1N0cnVjdE1ldGFEYXRhLmh4CkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGE7CisKK2NsYXNzIFN0cnVjdE1ldGFEYXRhIGV4dGVuZHMgRmllbGRWYWx1ZU1ldGFEYXRhIHsKKworICAgIHB1YmxpYyB2YXIgc3RydWN0Q2xhc3M6Q2xhc3M7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gU3RydWN0TWV0YURhdGEodHlwZSA6IEludCwgc0NsYXNzOkNsYXNzKSB7CisgICAgICBzdXBlcih0eXBlKTsKKyAgICAgIHRoaXMuc3RydWN0Q2xhc3MgPSBzQ2xhc3M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmMjkxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaHgKQEAgLTAsMCArMSwzMDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0lucHV0OworaW1wb3J0IGhheGUuaW8uQnl0ZXNPdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLkludDY0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworLyoqCisqIEJpbmFyeSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgorKi8KK2NsYXNzIFRCaW5hcnlQcm90b2NvbCBleHRlbmRzIFRSZWN1cnNpb25UcmFja2VyIGltcGxlbWVudHMgVFByb3RvY29sIHsKKworICAgIHByaXZhdGUgc3RhdGljIHZhciBBTk9OWU1PVVNfU1RSVUNUOlRTdHJ1Y3QgPSBuZXcgVFN0cnVjdCgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW5saW5lIHZhciBWRVJTSU9OX01BU0sgOiBoYXhlLkludDMyID0gMHhmZmZmMDAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBpbmxpbmUgdmFyIFZFUlNJT05fMSA6IGhheGUuSW50MzIgPSAweDgwMDEwMDAwOworCisgICAgcHJpdmF0ZSB2YXIgc3RyaWN0UmVhZF8gOiBCb29sID0gZmFsc2U7CisgICAgcHJpdmF0ZSB2YXIgc3RyaWN0V3JpdGVfIDogQm9vbCA9IHRydWU7CisgICAgcHJpdmF0ZSB2YXIgdHJhbnNfIDogVFRyYW5zcG9ydDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyh0cmFuczpUVHJhbnNwb3J0LCBzdHJpY3RSZWFkIDogQm9vbD1mYWxzZSwgc3RyaWN0V3JpdGUgOiBCb29sPXRydWUpIHsKKyAgICAgIHRyYW5zXyA9IHRyYW5zOworICAgICAgc3RyaWN0UmVhZF8gPSBzdHJpY3RSZWFkOworICAgICAgc3RyaWN0V3JpdGVfID0gc3RyaWN0V3JpdGU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydCgpOlRUcmFuc3BvcnQgeworICAgICAgcmV0dXJuIHRyYW5zXzsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4obWVzc2FnZTpUTWVzc2FnZSkgOiBWb2lkIHsKKyAgICAgICAgaWYgKHN0cmljdFdyaXRlXykgeworICAgICAgICAgIHZhciB2ZXJzaW9uIDogSW50ID0gVkVSU0lPTl8xIHwgbWVzc2FnZS50eXBlOworICAgICAgICAgIHdyaXRlSTMyKHZlcnNpb24pOworICAgICAgICAgIHdyaXRlU3RyaW5nKG1lc3NhZ2UubmFtZSk7CisgICAgICAgICAgd3JpdGVJMzIobWVzc2FnZS5zZXFpZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgd3JpdGVTdHJpbmcobWVzc2FnZS5uYW1lKTsKKyAgICAgICAgICB3cml0ZUJ5dGUobWVzc2FnZS50eXBlKTsKKyAgICAgICAgICB3cml0ZUkzMihtZXNzYWdlLnNlcWlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKHN0cnVjdDpUU3RydWN0KSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbihmaWVsZDpURmllbGQpIDogVm9pZCB7CisgICAgICB3cml0ZUJ5dGUoZmllbGQudHlwZSk7CisgICAgICB3cml0ZUkxNihmaWVsZC5pZCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpIDogVm9pZCB7CisgICAgICB3cml0ZUJ5dGUoVFR5cGUuU1RPUCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4obWFwOlRNYXApIDogVm9pZCB7CisgICAgICB3cml0ZUJ5dGUobWFwLmtleVR5cGUpOworICAgICAgd3JpdGVCeXRlKG1hcC52YWx1ZVR5cGUpOworICAgICAgd3JpdGVJMzIobWFwLnNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKGxpc3Q6VExpc3QpIDogVm9pZCB7CisgICAgICAgIHdyaXRlQnl0ZShsaXN0LmVsZW1UeXBlKTsKKyAgICAgICAgd3JpdGVJMzIobGlzdC5zaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkgOiBWb2lkIHt9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbihzZXQ6VFNldCkgOiBWb2lkIHsKKyAgICAgICAgd3JpdGVCeXRlKHNldC5lbGVtVHlwZSk7CisgICAgICAgIHdyaXRlSTMyKHNldC5zaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woYiA6IEJvb2wpIDogVm9pZCB7CisgICAgICAgIHdyaXRlQnl0ZShiID8gMSA6IDApOworICAgIH0KKworCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZShiIDogSW50KSA6IFZvaWQgeworICAgICAgICB2YXIgb3V0ID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisgICAgICAgIG91dC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICBvdXQud3JpdGVCeXRlKGIpOworICAgICAgICB0cmFuc18ud3JpdGUob3V0LmdldEJ5dGVzKCksIDAsIDEpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNihpMTYgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHZhciBvdXQgPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKyAgICAgICAgb3V0LmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgIG91dC53cml0ZUludDE2KGkxNik7CisgICAgICAgIHRyYW5zXy53cml0ZShvdXQuZ2V0Qnl0ZXMoKSwgMCwgMik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKGkzMiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIG91dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICBvdXQuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgb3V0LndyaXRlSW50MzIoaTMyKTsKKyAgICAgICAgdHJhbnNfLndyaXRlKG91dC5nZXRCeXRlcygpLCAwLCA0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoaTY0IDogaGF4ZS5JbnQ2NCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIG91dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICBvdXQuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgI2lmKCBoYXhlX3ZlciA8IDMuMikKKyAgICAgICAgdmFyIGhpID0gSW50NjQuZ2V0SGlnaChpNjQpOworICAgICAgICB2YXIgbG8gPSBJbnQ2NC5nZXRMb3coaTY0KTsKKyAgICAgICAgb3V0LndyaXRlSW50MzIoaGkpOworICAgICAgICBvdXQud3JpdGVJbnQzMihsbyk7CisgICAgICAgICNlbHNlCisgICAgICAgIG91dC53cml0ZUludDMyKGk2NC5oaWdoKTsKKyAgICAgICAgb3V0LndyaXRlSW50MzIoaTY0Lmxvdyk7CisgICAgICAgICNlbmQKKyAgICAgICAgdHJhbnNfLndyaXRlKG91dC5nZXRCeXRlcygpLCAwLCA4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoZHViOkZsb2F0KSA6IFZvaWQgeworICAgICAgICB2YXIgb3V0ID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisgICAgICAgIG91dC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICBvdXQud3JpdGVEb3VibGUoZHViKTsKKyAgICAgICAgdHJhbnNfLndyaXRlKG91dC5nZXRCeXRlcygpLCAwLCA4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoc3RyIDogU3RyaW5nKSA6IFZvaWQgeworICAgICAgICB2YXIgb3V0ID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisgICAgICAgIG91dC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICBvdXQud3JpdGVTdHJpbmcoc3RyKTsKKyAgICAgICAgdmFyIGJ5dGVzID0gb3V0LmdldEJ5dGVzKCk7CisgICAgICAgIHdyaXRlSTMyKCBieXRlcy5sZW5ndGgpOworICAgICAgICB0cmFuc18ud3JpdGUoIGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJpbmFyeShiaW46Qnl0ZXMpIDogVm9pZCB7CisgICAgICAgIHdyaXRlSTMyKGJpbi5sZW5ndGgpOworICAgICAgICB0cmFuc18ud3JpdGUoYmluLCAwLCBiaW4ubGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAgICovCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigpOlRNZXNzYWdlIHsKKyAgICAgICAgdmFyIHNpemUgOiBJbnQgPSByZWFkSTMyKCk7CisgICAgICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICAgICAgdmFyIHZlcnNpb24gOiBJbnQgPSBzaXplICYgVkVSU0lPTl9NQVNLOworICAgICAgICAgICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTl8xKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sICJCYWQgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IFRNZXNzYWdlKHJlYWRTdHJpbmcoKSwgc2l6ZSAmIDB4MDAwMDAwZmYsIHJlYWRJMzIoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoc3RyaWN0UmVhZF8pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwgIk1pc3NpbmcgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luLCBvbGQgY2xpZW50PyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBUTWVzc2FnZShyZWFkU3RyaW5nQm9keShzaXplKSwgcmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigpOlRTdHJ1Y3QgeworICAgICAgICByZXR1cm4gQU5PTllNT1VTX1NUUlVDVDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCkgOiBURmllbGQgeworICAgICAgICB2YXIgdHlwZSA6IEludCA9IHJlYWRCeXRlKCk7CisgICAgICAgIHZhciBpZCA6IEludCA9IDA7CisgICAgICAgIGlmICh0eXBlICE9IFRUeXBlLlNUT1ApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlkID0gcmVhZEkxNigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgVEZpZWxkKCIiLCB0eXBlLCBpZCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigpIDogVE1hcCB7CisgICAgICAgIHJldHVybiBuZXcgVE1hcChyZWFkQnl0ZSgpLCByZWFkQnl0ZSgpLCByZWFkSTMyKCkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkgOiBWb2lkIHt9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigpOlRMaXN0IHsKKyAgICAgICAgcmV0dXJuIG5ldyBUTGlzdChyZWFkQnl0ZSgpLCByZWFkSTMyKCkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigpIDogVFNldCB7CisgICAgICByZXR1cm4gbmV3IFRTZXQocmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIChyZWFkQnl0ZSgpID09IDEpOworICAgIH0KKworCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCkgOiBJbnQgeworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHZhciBsZW4gPSB0cmFuc18ucmVhZEFsbCggYnVmZmVyLCAwLCAxKTsKKyAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgMSk7CisgICAgICAgIGlucC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICByZXR1cm4gaW5wLnJlYWRCeXRlKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoKSA6IEludCB7CisgICAgICAgIHZhciBidWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgdmFyIGxlbiA9IHRyYW5zXy5yZWFkQWxsKCBidWZmZXIsIDAsIDIpOworICAgICAgICB2YXIgaW5wID0gbmV3IEJ5dGVzSW5wdXQoIGJ1ZmZlci5nZXRCeXRlcygpLCAwLCAyKTsKKyAgICAgICAgaW5wLmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgIHJldHVybiBpbnAucmVhZEludDE2KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoKSA6IEludCB7CisgICAgICAgIHZhciBidWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgdmFyIGxlbiA9IHRyYW5zXy5yZWFkQWxsKCBidWZmZXIsIDAsIDQpOworICAgICAgICB2YXIgaW5wID0gbmV3IEJ5dGVzSW5wdXQoIGJ1ZmZlci5nZXRCeXRlcygpLCAwLCA0KTsKKyAgICAgICAgaW5wLmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgIHJldHVybiBpbnAucmVhZEludDMyKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoKSA6IGhheGUuSW50NjQgeworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHZhciBsZW4gPSB0cmFuc18ucmVhZEFsbCggYnVmZmVyLCAwLCA4KTsKKyAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgOCk7CisgICAgICAgIGlucC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICB2YXIgaGkgPSBpbnAucmVhZEludDMyKCk7CisgICAgICAgIHZhciBsbyA9IGlucC5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIEludDY0Lm1ha2UoaGksbG8pOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCk6RmxvYXQgeworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHZhciBsZW4gPSB0cmFuc18ucmVhZEFsbCggYnVmZmVyLCAwLCA4KTsKKyAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgOCk7CisgICAgICAgIGlucC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICByZXR1cm4gaW5wLnJlYWREb3VibGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygpIDogU3RyaW5nIHsKKyAgICAgICAgcmV0dXJuIHJlYWRTdHJpbmdCb2R5KCByZWFkSTMyKCkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nQm9keShsZW4gOiBJbnQpIDogU3RyaW5nIHsKKyAgICAgICAgaWYoIGxlbiA+IDApIHsKKyAgICAgICAgICAgIHZhciBidWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIHRyYW5zXy5yZWFkQWxsKCBidWZmZXIsIDAsIGxlbik7CisgICAgICAgICAgICB2YXIgaW5wID0gbmV3IEJ5dGVzSW5wdXQoIGJ1ZmZlci5nZXRCeXRlcygpLCAwLCBsZW4pOworICAgICAgICAgICAgaW5wLmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gaW5wLnJlYWRTdHJpbmcobGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQmluYXJ5KCkgOiBCeXRlcyB7CisgICAgICAgIHZhciBsZW4gOiBJbnQgPSByZWFkSTMyKCk7CisgICAgICAgIHZhciBidWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgdHJhbnNfLnJlYWRBbGwoIGJ1ZmZlciwgMCwgbGVuKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci5nZXRCeXRlcygpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sRmFjdG9yeS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xGYWN0b3J5Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YTliZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sRmFjdG9yeS5oeApAQCAtMCwwICsxLDQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworCisvKioKKyogQmluYXJ5IFByb3RvY29sIEZhY3RvcnkKKyovCitjbGFzcyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7CisKKyAgICBwcml2YXRlIHZhciBzdHJpY3RSZWFkXyA6IEJvb2wgPSBmYWxzZTsKKyAgICBwcml2YXRlIHZhciBzdHJpY3RXcml0ZV8gOiBCb29sID0gdHJ1ZTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHN0cmljdFJlYWQgOiBCb29sID0gZmFsc2UsIHN0cmljdFdyaXRlIDogQm9vbCA9IHRydWUpIHsKKyAgICAgICAgc3RyaWN0UmVhZF8gID0gc3RyaWN0UmVhZDsKKyAgICAgICAgc3RyaWN0V3JpdGVfID0gc3RyaWN0V3JpdGU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCB0cmFucyA6IFRUcmFuc3BvcnQpIDogVFByb3RvY29sICB7CisgICAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKCB0cmFucywgc3RyaWN0UmVhZF8sIHN0cmljdFdyaXRlXyk7CisgICAgfQorfQorCisKKworICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNiMTNlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmh4CkBAIC0wLDAgKzEsNzE4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzSW5wdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc091dHB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworaW1wb3J0IGhheGUuZHMuR2VuZXJpY1N0YWNrOworaW1wb3J0IGhheGUuSW50MzI7CitpbXBvcnQgaGF4ZS5JbnQ2NDsKK2ltcG9ydCBoYXhlLlV0Zjg7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlci5aaWdaYWc7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyLkJpdENvbnZlcnRlcjsKKworCisvKioKKyogQ29tcGFjdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgorKi8KK2NsYXNzIFRDb21wYWN0UHJvdG9jb2wgZXh0ZW5kcyBUUmVjdXJzaW9uVHJhY2tlciBpbXBsZW1lbnRzIFRQcm90b2NvbCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgQU5PTllNT1VTX1NUUlVDVCA6IFRTdHJ1Y3QgPSBuZXcgVFN0cnVjdCgiIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIFRTVE9QIDogVEZpZWxkID0gbmV3IFRGaWVsZCgiIiwgVFR5cGUuU1RPUCwgMCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbmxpbmUgdmFyIFBST1RPQ09MX0lEIDogSW50ID0gMHg4MjsKKyAgICBwcml2YXRlIHN0YXRpYyBpbmxpbmUgdmFyIFZFUlNJT04gOiBJbnQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGlubGluZSB2YXIgVkVSU0lPTl9NQVNLIDogSW50ID0gMHgxZjsgLy8gMDAwMSAxMTExCisgICAgcHJpdmF0ZSBzdGF0aWMgaW5saW5lIHZhciBUWVBFX01BU0sgOiBJbnQgPSAweEUwOyAvLyAxMTEwIDAwMDAKKyAgICBwcml2YXRlIHN0YXRpYyBpbmxpbmUgdmFyIFRZUEVfQklUUyA6IEludCA9IDB4MDc7IC8vIDAwMDAgMDExMQorICAgIHByaXZhdGUgc3RhdGljIGlubGluZSB2YXIgVFlQRV9TSElGVF9BTU9VTlQgOiBJbnQgPSA1OworCisKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgdHR5cGVUb0NvbXBhY3RUeXBlID0gWworICAgICAgICBUVHlwZS5TVE9QICAgID0+IFRDb21wYWN0VHlwZXMuU1RPUCwKKyAgICAgICAgVFR5cGUuQk9PTCAgICA9PiBUQ29tcGFjdFR5cGVzLkJPT0xFQU5fVFJVRSwKKyAgICAgICAgVFR5cGUuQllURSAgICA9PiBUQ29tcGFjdFR5cGVzLkJZVEUsCisgICAgICAgIFRUeXBlLkRPVUJMRSAgPT4gVENvbXBhY3RUeXBlcy5ET1VCTEUsCisgICAgICAgIFRUeXBlLkkxNiAgICAgPT4gVENvbXBhY3RUeXBlcy5JMTYsCisgICAgICAgIFRUeXBlLkkzMiAgICAgPT4gVENvbXBhY3RUeXBlcy5JMzIsCisgICAgICAgIFRUeXBlLkk2NCAgICAgPT4gVENvbXBhY3RUeXBlcy5JNjQsCisgICAgICAgIFRUeXBlLlNUUklORyAgPT4gVENvbXBhY3RUeXBlcy5CSU5BUlksCisgICAgICAgIFRUeXBlLlNUUlVDVCAgPT4gVENvbXBhY3RUeXBlcy5TVFJVQ1QsCisgICAgICAgIFRUeXBlLk1BUCAgICAgPT4gVENvbXBhY3RUeXBlcy5NQVAsCisgICAgICAgIFRUeXBlLlNFVCAgICAgPT4gVENvbXBhY3RUeXBlcy5TRVQsCisgICAgICAgIFRUeXBlLkxJU1QgICAgPT4gVENvbXBhY3RUeXBlcy5MSVNUCisgICAgXTsKKworICAgIHByaXZhdGUgc3RhdGljIHZhciB0Y29tcGFjdFR5cGVUb1R5cGUgPSBbCisgICAgICAgIFRDb21wYWN0VHlwZXMuU1RPUCAgICAgICAgICA9PiBUVHlwZS5TVE9QLAorICAgICAgICBUQ29tcGFjdFR5cGVzLkJPT0xFQU5fVFJVRSAgPT4gVFR5cGUuQk9PTCwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5CT09MRUFOX0ZBTFNFID0+IFRUeXBlLkJPT0wsCisgICAgICAgIFRDb21wYWN0VHlwZXMuQllURSAgICAgICAgICA9PiBUVHlwZS5CWVRFLAorICAgICAgICBUQ29tcGFjdFR5cGVzLkkxNiAgICAgICAgICAgPT4gVFR5cGUuSTE2LAorICAgICAgICBUQ29tcGFjdFR5cGVzLkkzMiAgICAgICAgICAgPT4gVFR5cGUuSTMyLAorICAgICAgICBUQ29tcGFjdFR5cGVzLkk2NCAgICAgICAgICAgPT4gVFR5cGUuSTY0LAorICAgICAgICBUQ29tcGFjdFR5cGVzLkRPVUJMRSAgICAgICAgPT4gVFR5cGUuRE9VQkxFLAorICAgICAgICBUQ29tcGFjdFR5cGVzLkJJTkFSWSAgICAgICAgPT4gVFR5cGUuU1RSSU5HLAorICAgICAgICBUQ29tcGFjdFR5cGVzLkxJU1QgICAgICAgICAgPT4gVFR5cGUuTElTVCwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5TRVQgICAgICAgICAgID0+IFRUeXBlLlNFVCwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5NQVAgICAgICAgICAgID0+IFRUeXBlLk1BUCwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5TVFJVQ1QgICAgICAgID0+IFRUeXBlLlNUUlVDVAorICAgIF07CisKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBmaWVsZCBmb3IgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0cnVjdHMsCisgICAgICogc28gd2UgY2FuIGRvIHRoZSBkZWx0YSBzdHVmZi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZhciBsYXN0RmllbGRfIDogR2VuZXJpY1N0YWNrPEludD4gPSBuZXcgR2VuZXJpY1N0YWNrPEludD4oKTsKKyAgICBwcml2YXRlIHZhciBsYXN0RmllbGRJZF8gOiBJbnQgPSAwOworCisgICAgLyoqCisgICAgICogSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUgc28gaXQgY2FuCisgICAgICogaGF2ZSB0aGUgdmFsdWUgaW5jb3Jwb3JhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgdmFyIGJvb2xlYW5GaWVsZF8gOiBOdWxsPFRGaWVsZD47CisKKyAgICAvKioKKyAgICAgKiBJZiB3ZSBSZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4KKyAgICAgKiB2YWx1ZSBoZXJlIHNvIHRoYXQgUmVhZEJvb2wgY2FuIHVzZSBpdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZhciBib29sVmFsdWVfIDogTnVsbDxCb29sPjsKKworCisgICAgLy8gd2hldGhlciB0aGUgdW5kZXJseWluZyBzeXN0ZW0gaG9sZHMgU3RyaW5ncyBhcyBVVEYtOAorICAgIC8vIGh0dHA6Ly9vbGQuaGF4ZS5vcmcvbWFudWFsL2VuY29kaW5nCisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIHV0ZjhTdHJpbmdzID0gaGF4ZS5VdGY4LnZhbGlkYXRlKCLDhy3Dny3Dhi3Qri3QqCIpOworCisgICAgLy8gdGhlIHRyYW5zcG9ydCB1c2VkCisgICAgcHVibGljIHZhciB0cmFucyhkZWZhdWx0LG51bGwpIDogVFRyYW5zcG9ydDsKKworCisgICAgLy8gVENvbXBhY3RQcm90b2NvbCBDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHRyYW5zIDogVFRyYW5zcG9ydCkgeworICAgICAgICB0aGlzLnRyYW5zID0gdHJhbnM7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydCgpIDogVFRyYW5zcG9ydCB7CisgICAgICByZXR1cm4gdHJhbnM7CisgICAgfQorCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gUmVzZXQoKSA6IFZvaWR7CisgICAgICAgIHdoaWxlICggISBsYXN0RmllbGRfLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgbGFzdEZpZWxkXy5wb3AoKTsKKyAgICAgICAgfQorICAgICAgICBsYXN0RmllbGRJZF8gPSAwOworICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCisgICAgICogVXNlZCBpbnRlcm5hbGx5IGJ5IG90aGVyIHdyaXRpbmcgbWV0aG9kcyB0aGF0IGtub3cgdGhleSBuZWVkIHRvIFdyaXRlIGEgYnl0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlQnl0ZURpcmVjdCggYiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGJ1ZiA9IEJ5dGVzLmFsbG9jKDEpOworICAgICAgICBidWYuc2V0KCAwLCBiKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIGJ1ZiwgMCwgMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlVmFyaW50MzIoIG4gOiBVSW50KSA6IFZvaWQgeworICAgICAgICB2YXIgaTMyYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG4gJiB+MHg3RikgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpMzJidWYuYWRkQnl0ZSggbiAmIDB4RkYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkzMmJ1Zi5hZGRCeXRlKCAobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgICAgICAgICAgbiA+Pj0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhciB0bXAgPSBpMzJidWYuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgKiBXcml0ZSBhIG1lc3NhZ2UgaGVhZGVyIHRvIHRoZSB3aXJlLiBDb21wYWN0IFByb3RvY29sIG1lc3NhZ2VzIGNvbnRhaW4gdGhlCisgICAgKiBwcm90b2NvbCB2ZXJzaW9uIHNvIHdlIGNhbiBtaWdyYXRlIGZvcndhcmRzIGluIHRoZSBmdXR1cmUgaWYgbmVlZCBiZS4KKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbiggbWVzc2FnZSA6IFRNZXNzYWdlKSA6IFZvaWQgeworICAgICAgICBSZXNldCgpOworCisgICAgICAgIHZhciB2ZXJzaW9uQW5kVHlwZSA6IEludCA9ICAoVkVSU0lPTiAmIFZFUlNJT05fTUFTSykgfCAoKG1lc3NhZ2UudHlwZSA8PCBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX01BU0spOworICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoIFBST1RPQ09MX0lEKTsKKyAgICAgICAgV3JpdGVCeXRlRGlyZWN0KCB2ZXJzaW9uQW5kVHlwZSk7CisgICAgICAgIFdyaXRlVmFyaW50MzIoIGNhc3QoIG1lc3NhZ2Uuc2VxaWQsIFVJbnQpKTsKKyAgICAgICAgd3JpdGVTdHJpbmcoIG1lc3NhZ2UubmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBzdHJ1Y3QgYmVnaW4uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlCisgICAgICogdXNlIGl0IGFzIGFuIG9wcG9ydHVuaXR5IHRvIHB1dCBzcGVjaWFsIHBsYWNlaG9sZGVyIG1hcmtlcnMgb24gdGhlIGZpZWxkCisgICAgICogc3RhY2sgc28gd2UgY2FuIGdldCB0aGUgZmllbGQgaWQgZGVsdGFzIGNvcnJlY3QuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oc3RydWN0OlRTdHJ1Y3QpIDogVm9pZCB7CisgICAgICAgIGxhc3RGaWVsZF8uYWRkKCBsYXN0RmllbGRJZF8pOworICAgICAgICBsYXN0RmllbGRJZF8gPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgc3RydWN0IGVuZC4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UgdXNlCisgICAgICogdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBwb3AgdGhlIGxhc3QgZmllbGQgZnJvbSB0aGUgY3VycmVudCBzdHJ1Y3Qgb2ZmCisgICAgICogb2YgdGhlIGZpZWxkIHN0YWNrLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpIDogVm9pZCB7CisgICAgICAgIGxhc3RGaWVsZElkXyA9IGxhc3RGaWVsZF8ucG9wKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBmaWVsZCBoZWFkZXIgY29udGFpbmluZyB0aGUgZmllbGQgaWQgYW5kIGZpZWxkIHR5cGUuIElmIHRoZQorICAgICAqIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICg8IDE1KSwKKyAgICAgKiB0aGVuIHRoZSBmaWVsZCBpZCB3aWxsIGJlIGVuY29kZWQgaW4gdGhlIDQgTVNCIGFzIGEgZGVsdGEuIE90aGVyd2lzZSwgdGhlCisgICAgICogZmllbGQgaWQgd2lsbCBmb2xsb3cgdGhlIHR5cGUgaGVhZGVyIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKGZpZWxkOlRGaWVsZCkgOiBWb2lkIHsKKyAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuQk9PTCkKKyAgICAgICAgICAgIGJvb2xlYW5GaWVsZF8gPSBmaWVsZDsgLy8gd2Ugd2FudCB0byBwb3NzaWJseSBpbmNsdWRlIHRoZSB2YWx1ZSwgc28gd2UnbGwgd2FpdC4KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoZmllbGQsIDB4RkYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB3b3JraG9yc2Ugb2YgV3JpdGVGaWVsZEJlZ2luLiBJdCBoYXMgdGhlIG9wdGlvbiBvZiBkb2luZyBhCisgICAgICogJ3R5cGUgb3ZlcnJpZGUnIG9mIHRoZSB0eXBlIGhlYWRlci4gVGhpcyBpcyB1c2VkIHNwZWNpZmljYWxseSBpbiB0aGUKKyAgICAgKiBib29sZWFuIGZpZWxkIGNhc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbCggZmllbGQgOiBURmllbGQsIHR5cGVPdmVycmlkZSA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgLy8gaWYgdGhlcmUncyBhIHR5cGUgb3ZlcnJpZGUsIHVzZSB0aGF0LgorICAgICAgICB2YXIgdHlwZVRvV3JpdGUgOiBJbnQ7CisgICAgICAgIGlmICggdHlwZU92ZXJyaWRlID09IDB4RkYpCisgICAgICAgICAgICB0eXBlVG9Xcml0ZSA9IGdldENvbXBhY3RUeXBlKCBmaWVsZC50eXBlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdHlwZVRvV3JpdGUgPSB0eXBlT3ZlcnJpZGU7CisKKyAgICAgICAgLy8gY2hlY2sgaWYgd2UgY2FuIHVzZSBkZWx0YSBlbmNvZGluZyBmb3IgdGhlIGZpZWxkIGlkCisgICAgICAgIGlmIChmaWVsZC5pZCA+IGxhc3RGaWVsZElkXyAmJiBmaWVsZC5pZCAtIGxhc3RGaWVsZElkXyA8PSAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gV3JpdGUgdGhlbSB0b2dldGhlcgorICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KChmaWVsZC5pZCAtIGxhc3RGaWVsZElkXykgPDwgNCB8IHR5cGVUb1dyaXRlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdyaXRlIHRoZW0gc2VwYXJhdGUKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCh0eXBlVG9Xcml0ZSk7CisgICAgICAgICAgICB3cml0ZUkxNihmaWVsZC5pZCk7CisgICAgICAgIH0KKworICAgICAgICBsYXN0RmllbGRJZF8gPSBmaWVsZC5pZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgU1RPUCBzeW1ib2wgc28gd2Uga25vdyB0aGVyZSBhcmUgbm8gbW9yZSBmaWVsZHMgaW4gdGhpcyBzdHJ1Y3QuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVCeXRlRGlyZWN0KCBjYXN0KFRDb21wYWN0VHlwZXMuU1RPUCwgSW50KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBtYXAgaGVhZGVyLiBJZiB0aGUgbWFwIGlzIGVtcHR5LCBvbWl0IHRoZSBrZXkgYW5kIHZhbHVlIHR5cGUKKyAgICAgKiBoZWFkZXJzLCBhcyB3ZSBkb24ndCBuZWVkIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHNraXAgaXQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4obWFwOlRNYXApIDogVm9pZCB7CisgICAgICAgIGlmIChtYXAuc2l6ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB2YXIga3Z0eXBlID0gKGdldENvbXBhY3RUeXBlKG1hcC5rZXlUeXBlKSA8PCA0KSB8IGdldENvbXBhY3RUeXBlKG1hcC52YWx1ZVR5cGUpOworICAgICAgICAgICAgV3JpdGVWYXJpbnQzMiggY2FzdCggbWFwLnNpemUsIFVJbnQpKTsKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCgga3Z0eXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgbGlzdCBoZWFkZXIuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCBsaXN0IDogVExpc3QpIDogVm9pZCB7CisgICAgICAgIFdyaXRlQ29sbGVjdGlvbkJlZ2luKCBsaXN0LmVsZW1UeXBlLCBsaXN0LnNpemUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgc2V0IGhlYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbiggc2V0IDogVFNldCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVDb2xsZWN0aW9uQmVnaW4oIHNldC5lbGVtVHlwZSwgc2V0LnNpemUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgYm9vbGVhbiB2YWx1ZS4gUG90ZW50aWFsbHksIHRoaXMgY291bGQgYmUgYSBib29sZWFuIGZpZWxkLCBpbgorICAgICAqIHdoaWNoIGNhc2UgdGhlIGZpZWxkIGhlYWRlciBpbmZvIGlzbid0IHdyaXR0ZW4geWV0LiBJZiBzbywgZGVjaWRlIHdoYXQgdGhlCisgICAgICogcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiBXcml0ZSB0aGUgZmllbGQgaGVhZGVyLgorICAgICAqIE90aGVyd2lzZSwgV3JpdGUgYSBzaW5nbGUgYnl0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKGIgOiBCb29sKSA6IFZvaWQgeworICAgICAgICB2YXIgYmN0IDogSW50ID0gYiA/IFRDb21wYWN0VHlwZXMuQk9PTEVBTl9UUlVFIDogVENvbXBhY3RUeXBlcy5CT09MRUFOX0ZBTFNFOworCisgICAgICAgIGlmIChib29sZWFuRmllbGRfICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZmllbGQgaGVhZGVyIHlldAorICAgICAgICAgICAgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoIGJvb2xlYW5GaWVsZF8sIGJjdCk7CisgICAgICAgICAgICBib29sZWFuRmllbGRfID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3QgV3JpdGUgdGhlIHZhbHVlLgorICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KCBiY3QpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBieXRlLiBOb3RoaW5nIHRvIHNlZSBoZXJlIQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoIGIgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlQnl0ZURpcmVjdCggYik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYW4gSTE2IGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoIGkxNiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVWYXJpbnQzMiggWmlnWmFnLkZyb21JbnQoIGkxNikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGFuIGkzMiBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCBpMzIgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlVmFyaW50MzIoIFppZ1phZy5Gcm9tSW50KCBpMzIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhbiBpNjQgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCggaTY0IDogaGF4ZS5JbnQ2NCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVWYXJpbnQ2NCggIFppZ1phZy5Gcm9tTG9uZyggaTY0KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBkb3VibGUgdG8gdGhlIHdpcmUgYXMgOCBieXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoIGR1YiA6IEZsb2F0KSA6IFZvaWQgeworICAgICAgICB2YXIgZGF0YSA9IEJpdENvbnZlcnRlci5maXhlZExvbmdUb0J5dGVzKCBCaXRDb252ZXJ0ZXIuRG91YmxlVG9JbnQ2NEJpdHMoZHViKSk7CisgICAgICAgIHRyYW5zLndyaXRlKCBkYXRhLCAwLCBkYXRhLmxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBzdHJpbmcgdG8gdGhlIHdpcmUgd2l0aCBhIHZhcmludCBzaXplIHByZWNlZGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoc3RyIDogU3RyaW5nKSA6IFZvaWQgeworICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIGlmKCB1dGY4U3RyaW5ncykKKyAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIHN0cik7ICAvLyBubyBuZWVkIHRvIGVuY29kZSBvbiBVVEY4IHRhcmdldHMsIHRoZSBzdHJpbmcgaXMganVzdCBmaW5lCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIFV0ZjguZW5jb2RlKCBzdHIpKTsKKyAgICAgICAgdmFyIHRtcCA9IGJ1Zi5nZXRCeXRlcygpOworICAgICAgICB3cml0ZUJpbmFyeSggdG1wKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIGJ5dGUgYXJyYXksIHVzaW5nIGEgdmFyaW50IGZvciB0aGUgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCaW5hcnkoIGJpbiA6IEJ5dGVzKSA6IFZvaWQgeworICAgICAgICBXcml0ZVZhcmludDMyKCBjYXN0KGJpbi5sZW5ndGgsVUludCkpOworICAgICAgICB0cmFucy53cml0ZSggYmluLCAwLCBiaW4ubGVuZ3RoKTsKKyAgICB9CisKKworICAgIC8vIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCBieSBzdHJ1Y3RzLCBidXQgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhbnkgd2lyZQorICAgIC8vIG91dHB1dCBvciBwdXJwb3NlLgorICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKSA6IFZvaWQgeyB9CisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKSA6IFZvaWQgeyB9CisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkgOiBWb2lkIHsgfQorCisgICAgLy8KKyAgICAvLyBJbnRlcm5hbCB3cml0aW5nIG1ldGhvZHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorICAgICAqIHRoZSB3aXJlIGRpZmZlciBvbmx5IGJ5IHRoZSB0eXBlIGluZGljYXRvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlQ29sbGVjdGlvbkJlZ2luKCBlbGVtVHlwZSA6IEludCwgc2l6ZSA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgaWYgKHNpemUgPD0gMTQpICAgIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCggc2l6ZSA8PCA0IHwgZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCggMHhmMCB8IGdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSk7CisgICAgICAgICAgICBXcml0ZVZhcmludDMyKCBjYXN0KHNpemUsIFVJbnQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVWYXJpbnQ2NChuIDogaGF4ZS5JbnQ2NCkgOiBWb2lkICAgIHsKKyAgICAgICAgdmFyIHZhcmludDY0b3V0ID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggSW50NjQuaXNaZXJvKCBJbnQ2NC5hbmQoIG4sIEludDY0Lm5lZyhJbnQ2NC5tYWtlKDAsMHg3RikpKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgI2lmKCBoYXhlX3ZlciA8IDMuMikKKyAgICAgICAgICAgICAgICB2YXJpbnQ2NG91dC5hZGRCeXRlKCBJbnQ2NC5nZXRMb3cobikpOworICAgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgdmFyaW50NjRvdXQuYWRkQnl0ZSggbi5sb3cpOworICAgICAgICAgICAgICAgICNlbmQKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjaWYgKCBoYXhlX3ZlciA8IDMuMikKKyAgICAgICAgICAgICAgICB2YXJpbnQ2NG91dC5hZGRCeXRlKCAoSW50NjQuZ2V0TG93KG4pICYgMHg3RikgfCAweDgwKTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIHZhcmludDY0b3V0LmFkZEJ5dGUoIChuLmxvdyAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgICAgICAgICAgI2VuZAorICAgICAgICAgICAgICAgIG4gPSBJbnQ2NC5zaHIoIG4sIDcpOworICAgICAgICAgICAgICAgIG4gPSBJbnQ2NC5hbmQoIG4sIEludDY0Lm1ha2UoMHgwMUZGRkZGRiwweEZGRkZGRkZGKSk7ICAvLyBjbGVhbiBvdXQgdGhlIHNoaWZ0ZWQgNyBiaXRzCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdmFyIHRtcCA9IHZhcmludDY0b3V0LmdldEJ5dGVzKCk7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVhZCBhIG1lc3NhZ2UgaGVhZGVyLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCk6VE1lc3NhZ2UgeworICAgICAgICBSZXNldCgpOworCisgICAgICAgIHZhciBwcm90b2NvbElkIDogSW50ID0gcmVhZEJ5dGUoKTsKKyAgICAgICAgaWYgKHByb3RvY29sSWQgIT0gUFJPVE9DT0xfSUQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBwcm90b2NvbCBpZCAiICsgU3RyaW5nVG9vbHMuaGV4KFBST1RPQ09MX0lELDIpICsgIiBidXQgZ290ICIgKyBTdHJpbmdUb29scy5oZXgocHJvdG9jb2xJZCkpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHZlcnNpb25BbmRUeXBlIDogSW50ID0gcmVhZEJ5dGUoKTsKKyAgICAgICAgdmFyIHZlcnNpb24gOiBJbnQgPSAodmVyc2lvbkFuZFR5cGUgJiBWRVJTSU9OX01BU0spOworICAgICAgICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgdmVyc2lvbiAiICsgVkVSU0lPTiArICIgYnV0IGdvdCAiICsgdmVyc2lvbik7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdHlwZSA6IEludCA9ICgodmVyc2lvbkFuZFR5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9CSVRTKTsKKyAgICAgICAgdmFyIHNlcWlkIDogSW50ID0gY2FzdCggUmVhZFZhcmludDMyKCksIEludCk7CisgICAgICAgIHZhciBtc2dObSA6IFN0cmluZyA9IHJlYWRTdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUTWVzc2FnZSggbXNnTm0sIHR5cGUsIHNlcWlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgc3RydWN0IGJlZ2luLiBUaGVyZSdzIG5vdGhpbmcgb24gdGhlIHdpcmUgZm9yIHRoaXMsIGJ1dCBpdCBpcyBvdXIKKyAgICAgKiBvcHBvcnR1bml0eSB0byBwdXNoIGEgbmV3IHN0cnVjdCBiZWdpbiBtYXJrZXIgb250byB0aGUgZmllbGQgc3RhY2suCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigpOlRTdHJ1Y3QgeworICAgICAgICBsYXN0RmllbGRfLmFkZChsYXN0RmllbGRJZF8pOworICAgICAgICBsYXN0RmllbGRJZF8gPSAwOworICAgICAgICByZXR1cm4gQU5PTllNT1VTX1NUUlVDVDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvcgorICAgICAqIHRoaXMgc3RydWN0IGZyb20gdGhlIGZpZWxkIHN0YWNrLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgLy8gY29uc3VtZSB0aGUgbGFzdCBmaWVsZCB3ZSBSZWFkIG9mZiB0aGUgd2lyZS4KKyAgICAgICAgbGFzdEZpZWxkSWRfID0gbGFzdEZpZWxkXy5wb3AoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgZmllbGQgaGVhZGVyIG9mZiB0aGUgd2lyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oKSA6IFRGaWVsZCB7CisgICAgICAgIHZhciB0eXBlIDogSW50ID0gcmVhZEJ5dGUoKTsKKworICAgICAgICAvLyBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIuCisgICAgICAgIGlmICh0eXBlID09IGNhc3QoVENvbXBhY3RUeXBlcy5TVE9QLEludCkpIHsKKyAgICAgICAgICAgIHJldHVybiBUU1RPUDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBmaWVsZElkIDogSW50OworCisgICAgICAgIC8vIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KKyAgICAgICAgdmFyIG1vZGlmaWVyIDogSW50ID0gKCh0eXBlICYgMHhmMCkgPj4gNCk7CisgICAgICAgIGlmIChtb2RpZmllciA9PSAwKQorICAgICAgICAgICAgZmllbGRJZCA9IHJlYWRJMTYoKTsgIC8vIG5vdCBhIGRlbHRhLiBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZC4KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmllbGRJZCA9IGxhc3RGaWVsZElkXyArIG1vZGlmaWVyOyAvLyBhZGQgdGhlIGRlbHRhIHRvIHRoZSBsYXN0IFJlYWQgZmllbGQgaWQuCisKKyAgICAgICAgdmFyIGZpZWxkIDogVEZpZWxkICA9IG5ldyBURmllbGQoICIiLCBjYXN0KGdldFRUeXBlKHR5cGUgJiAweDBmKSxJbnQpLCBmaWVsZElkKTsKKworICAgICAgICAvLyBpZiB0aGlzIGhhcHBlbnMgdG8gYmUgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgdHlwZQorICAgICAgICBpZiAoaXNCb29sVHlwZSh0eXBlKSkgeworICAgICAgICAgICAgLy8gc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBpbiBhIHNwZWNpYWwgaW5zdGFuY2UgdmFyaWFibGUuCisgICAgICAgICAgICBib29sVmFsdWVfID0gKCh0eXBlICYgMHgwZikgPT0gY2FzdChUQ29tcGFjdFR5cGVzLkJPT0xFQU5fVFJVRSxJbnQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLgorICAgICAgICBsYXN0RmllbGRJZF8gPSBmaWVsZC5pZDsKKyAgICAgICAgcmV0dXJuIGZpZWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYSBtYXAgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNpemUgaXMgemVybywgc2tpcCBSZWFkaW5nIHRoZSBrZXkKKyAgICAgKiBhbmQgdmFsdWUgdHlwZS4gVGhpcyBtZWFucyB0aGF0IDAtbGVuZ3RoIG1hcHMgd2lsbCB5aWVsZCBUTWFwcyB3aXRob3V0IHRoZQorICAgICAqICJjb3JyZWN0IiB0eXBlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCkgOiBUTWFwIHsKKyAgICAgICAgdmFyIHNpemUgOiBJbnQgPSBjYXN0KCBSZWFkVmFyaW50MzIoKSwgSW50KTsKKyAgICAgICAgdmFyIGtleUFuZFZhbHVlVHlwZSA6IEludCA9ICgoc2l6ZSA9PSAwKSAgPyAgMCAgOiAgcmVhZEJ5dGUoKSk7CisgICAgICAgIHZhciBrZXkgOiBJbnQgPSBjYXN0KCBnZXRUVHlwZSggKGtleUFuZFZhbHVlVHlwZSAmIDB4RjApID4+IDQpLCBJbnQpOworICAgICAgICB2YXIgdmFsIDogSW50ID0gY2FzdCggZ2V0VFR5cGUoIGtleUFuZFZhbHVlVHlwZSAmIDB4MEYpLCBJbnQpOworICAgICAgICByZXR1cm4gbmV3IFRNYXAoIGtleSwgdmFsLCBzaXplKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgbGlzdCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgbGlzdCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKKyAgICAgKiBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBsaXN0LCB0aGUgNCBNU0IKKyAgICAgKiBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisgICAgICogdHJ1ZSBzaXplLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCk6VExpc3QgeworICAgICAgICB2YXIgc2l6ZV9hbmRfdHlwZSA6IEludCA9IHJlYWRCeXRlKCk7CisKKyAgICAgICAgdmFyIHNpemUgOiBJbnQgPSAoKHNpemVfYW5kX3R5cGUgJiAweEYwKSA+PiA0KSAmIDB4MEY7CisgICAgICAgIGlmIChzaXplID09IDE1KSB7CisgICAgICAgICAgICBzaXplID0gY2FzdCggUmVhZFZhcmludDMyKCksIEludCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdHlwZSA9IGdldFRUeXBlKHNpemVfYW5kX3R5cGUpOworICAgICAgICByZXR1cm4gbmV3IFRMaXN0KCB0eXBlLCBzaXplKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgc2V0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzZXQgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisgICAgICogYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgc2V0LCB0aGUgNCBNU0IKKyAgICAgKiBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisgICAgICogdHJ1ZSBzaXplLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oKSA6IFRTZXQgeworICAgICAgICB2YXIgc2l6ZV9hbmRfdHlwZSA6IEludCA9IHJlYWRCeXRlKCk7CisKKyAgICAgICAgdmFyIHNpemUgOiBJbnQgPSAoKHNpemVfYW5kX3R5cGUgJiAweEYwKSA+PiA0KSAmIDB4MEY7CisgICAgICAgIGlmIChzaXplID09IDE1KSB7CisgICAgICAgICAgICBzaXplID0gY2FzdCggUmVhZFZhcmludDMyKCksIEludCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdHlwZSA9IGdldFRUeXBlKHNpemVfYW5kX3R5cGUpOworICAgICAgICByZXR1cm4gbmV3IFRTZXQoIHR5cGUsIHNpemUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYSBib29sZWFuIG9mZiB0aGUgd2lyZS4gSWYgdGhpcyBpcyBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBzaG91bGQKKyAgICAgKiBhbHJlYWR5IGhhdmUgYmVlbiBSZWFkIGR1cmluZyBSZWFkRmllbGRCZWdpbiwgc28gd2UnbGwganVzdCBjb25zdW1lIHRoZQorICAgICAqIHByZS1zdG9yZWQgdmFsdWUuIE90aGVyd2lzZSwgUmVhZCBhIGJ5dGUuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCkgOiBCb29sIHsKKyAgICAgICAgaWYgKGJvb2xWYWx1ZV8gIT0gbnVsbCkgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA6IEJvb2wgPSBib29sVmFsdWVfOworICAgICAgICAgICAgYm9vbFZhbHVlXyA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChyZWFkQnl0ZSgpID09IGNhc3QoVENvbXBhY3RUeXBlcy5CT09MRUFOX1RSVUUsSW50KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhIHNpbmdsZSBieXRlIG9mZiB0aGUgd2lyZS4gTm90aGluZyBpbnRlcmVzdGluZyBoZXJlLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQnl0ZSgpIDogSW50IHsKKyAgICAgICAgdmFyIGJ5dGVSYXdCdWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgdHJhbnMucmVhZEFsbCggYnl0ZVJhd0J1ZiwgMCwgMSk7CisgICAgICAgIHJldHVybiBieXRlUmF3QnVmLmdldEJ5dGVzKCkuZ2V0KDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCkgOiBJbnQgeworICAgICAgICByZXR1cm4gWmlnWmFnLlRvSW50KCBSZWFkVmFyaW50MzIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoKSA6IEludCB7CisgICAgICAgIHJldHVybiBaaWdaYWcuVG9JbnQoIFJlYWRWYXJpbnQzMigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgpIDogaGF4ZS5JbnQ2NCB7CisgICAgICAgIHJldHVybiBaaWdaYWcuVG9Mb25nKCBSZWFkVmFyaW50NjQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm8gbWFnaWMgaGVyZSAtIGp1c3QgUmVhZCBhIGRvdWJsZSBvZmYgdGhlIHdpcmUuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoKTpGbG9hdCB7CisgICAgICAgIHZhciBsb25nQml0cyA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICB0cmFucy5yZWFkQWxsKCBsb25nQml0cywgMCwgOCk7CisgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuSW50NjRCaXRzVG9Eb3VibGUoIEJpdENvbnZlcnRlci5ieXRlc1RvTG9uZyggbG9uZ0JpdHMuZ2V0Qnl0ZXMoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgYnl0ZVtdICh2aWEgUmVhZEJpbmFyeSksIGFuZCB0aGVuIFVURi04IGRlY29kZXMgaXQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoKSA6IFN0cmluZyB7CisgICAgICAgIHZhciBsZW5ndGggOiBJbnQgPSBjYXN0KCBSZWFkVmFyaW50MzIoKSwgSW50KTsKKworICAgICAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgdHJhbnMucmVhZEFsbCggYnVmLCAwLCBsZW5ndGgpOworCisgICAgICAgIGxlbmd0aCA9IGJ1Zi5sZW5ndGg7CisgICAgICAgIHZhciBpbnAgPSBuZXcgQnl0ZXNJbnB1dCggYnVmLmdldEJ5dGVzKCkpOworICAgICAgICB2YXIgc3RyID0gaW5wLnJlYWRTdHJpbmcoIGxlbmd0aCk7CisgICAgICAgIGlmKCB1dGY4U3RyaW5ncykKKyAgICAgICAgICAgIHJldHVybiBzdHI7ICAvLyBubyBuZWVkIHRvIGRlY29kZSBvbiBVVEY4IHRhcmdldHMsIHRoZSBzdHJpbmcgaXMganVzdCBmaW5lCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBVdGY4LmRlY29kZSggc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgYnl0ZVtdIGZyb20gdGhlIHdpcmUuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCaW5hcnkoKSA6IEJ5dGVzIHsKKyAgICAgICAgdmFyIGxlbmd0aCA6IEludCA9IGNhc3QoIFJlYWRWYXJpbnQzMigpLCBJbnQpOworICAgICAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBCeXRlcy5hbGxvYygwKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgdHJhbnMucmVhZEFsbCggYnVmLCAwLCBsZW5ndGgpOworICAgICAgICByZXR1cm4gYnVmLmdldEJ5dGVzKCk7CisgICAgfQorCisKKyAgICAvLyBUaGVzZSBtZXRob2RzIGFyZSBoZXJlIGZvciB0aGUgc3RydWN0IHRvIGNhbGwsIGJ1dCBkb24ndCBoYXZlIGFueSB3aXJlCisgICAgLy8gZW5jb2RpbmcuCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKSA6IFZvaWQgeyB9CisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBFbmQoKSA6IFZvaWQgeyB9CisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkgOiBWb2lkIHsgfQorCisgICAgLy8KKyAgICAvLyBJbnRlcm5hbCBSZWFkaW5nIG1ldGhvZHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAgICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byA1IGJ5dGVzLgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZFZhcmludDMyKCkgOiBVSW50IHsKKyAgICAgICAgdmFyIHJlc3VsdCA6IFVJbnQgPSAwOworICAgICAgICB2YXIgc2hpZnQgOiBJbnQgPSAwOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgdmFyIGIgOiBJbnQgPSByZWFkQnl0ZSgpOworICAgICAgICAgICAgcmVzdWx0IHw9IGNhc3QoKGIgJiAweDdmKSA8PCBzaGlmdCwgVUludCk7CisgICAgICAgICAgICBpZiAoKGIgJiAweDgwKSAhPSAweDgwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaGlmdCArPSA3OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIFJlYWQgdXAgdG8gMTAgYnl0ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkVmFyaW50NjQoKSA6IEludDY0IHsKKyAgICAgICAgdmFyIHNoaWZ0IDogSW50ID0gMDsKKyAgICAgICAgdmFyIHJlc3VsdCA6IEludDY0ID0gSW50NjQubWFrZSgwLDApOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgdmFyIGIgOiBJbnQgPSByZWFkQnl0ZSgpOworICAgICAgICAgICAgcmVzdWx0ID0gSW50NjQub3IoIHJlc3VsdCwgSW50NjQuc2hsKCBJbnQ2NC5tYWtlKDAsYiAmIDB4N2YpLCBzaGlmdCkpOworICAgICAgICAgICAgaWYgKChiICYgMHg4MCkgIT0gMHg4MCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2hpZnQgKz0gNzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisKKyAgICAvLworICAgIC8vIHR5cGUgdGVzdGluZyBhbmQgY29udmVydGluZworICAgIC8vCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGlzQm9vbFR5cGUoIGIgOiBJbnQpIDogQm9vbCB7CisgICAgICAgIHZhciBsb3dlck5pYmJsZSA6IEludCA9IGIgJiAweDBmOworICAgICAgICBzd2l0Y2gobG93ZXJOaWJibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgVENvbXBhY3RUeXBlcy5CT09MRUFOX1RSVUU6IHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSBUQ29tcGFjdFR5cGVzLkJPT0xFQU5fRkFMU0U6IHJldHVybiB0cnVlOworICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RUeXBlcyBjb25zdGFudCwgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZworICAgICAqIFRUeXBlIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0VFR5cGUoIHR5cGUgOiBJbnQpIDogSW50IHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0Y29tcGFjdFR5cGVUb1R5cGVbdHlwZV07CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBlIDogRHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHR0IDogSW50ID0gKHR5cGUgJiAweDBmKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIFRQcm90b2NvbEV4Y2VwdGlvbi5VTktOT1dOLCAnZG9uXCd0IGtub3cgd2hhdCB0eXBlOiAkdHQgKCRlKScpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBUVHlwZSB2YWx1ZSwgZmluZCB0aGUgYXBwcm9wcmlhdGUgVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFR5cGVzIGNvbnN0YW50LgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0Q29tcGFjdFR5cGUoIHR0eXBlIDogSW50KSA6IEludAorICAgIHsKKyAgICAgICAgcmV0dXJuIGNhc3QoIHR0eXBlVG9Db21wYWN0VHlwZVt0dHlwZV0sIEludCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NjczYjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbEZhY3RvcnkuaHgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKworLyoqCisqIENvbXBhY3QgUHJvdG9jb2wgRmFjdG9yeQorKi8KK2NsYXNzIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCkgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCggdHJhbnMgOiBUVHJhbnNwb3J0KSA6IFRQcm90b2NvbCAgeworICAgICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2woIHRyYW5zKTsKKyAgICB9Cit9CisKKworCisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0VHlwZXMuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RUeXBlcy5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGQzZDg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0VHlwZXMuaHgKQEAgLTAsMCArMSw0MSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworLyoqCisgKiBBbGwgb2YgdGhlIG9uLXdpcmUgdHlwZSBjb2Rlcy4KKyAqLworQDplbnVtCithYnN0cmFjdCBUQ29tcGFjdFR5cGVzKEludCkgIGZyb20gSW50IHRvIEludCAgeworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBTVE9QICAgICAgICAgID0gMHgwMDsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgQk9PTEVBTl9UUlVFICA9IDB4MDE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEJPT0xFQU5fRkFMU0UgPSAweDAyOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBCWVRFICAgICAgICAgID0gMHgwMzsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgSTE2ICAgICAgICAgICA9IDB4MDQ7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEkzMiAgICAgICAgICAgPSAweDA1OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBJNjQgICAgICAgICAgID0gMHgwNjsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgRE9VQkxFICAgICAgICA9IDB4MDc7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEJJTkFSWSAgICAgICAgPSAweDA4OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBMSVNUICAgICAgICAgID0gMHgwOTsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgU0VUICAgICAgICAgICA9IDB4MEE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE1BUCAgICAgICAgICAgPSAweDBCOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBTVFJVQ1QgICAgICAgID0gMHgwQzsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RGaWVsZC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9URmllbGQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y1NDk4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9URmllbGQuaHgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitjbGFzcyBURmllbGQgeworCisgICAgcHVibGljIHZhciBuYW1lIDogU3RyaW5nOworICAgIHB1YmxpYyB2YXIgdHlwZSA6IEludDsKKyAgICBwdWJsaWMgdmFyIGlkIDogSW50OworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhuIDogU3RyaW5nID0gIiIsIHQgOiBJbnQgPSAwLCBpIDogSW50ID0gMCkgeworICAgICAgbmFtZSA9IG47CisgICAgICB0eXBlID0gdDsKKyAgICAgIGlkID0gaTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdG9TdHJpbmcoKSA6IFN0cmluZyB7CisgICAgICByZXR1cm4gJzxURmllbGQgbmFtZToiJG5hbWUiIHR5cGU6IiR0eXBlIiBmaWVsZC1pZDoiJGlkIj4nOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBlcXVhbHMoIG90aGVyRmllbGQgOiBURmllbGQpIDogQm9vbCB7CisgICAgICByZXR1cm4gKHR5cGUgPT0gb3RoZXJGaWVsZC50eXBlKQorICAgICAgICAgICYmIChpZCA9PSBvdGhlckZpZWxkLmlkKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwZmYzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmh4CkBAIC0wLDAgKzEsMTA3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzSW5wdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc091dHB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworaW1wb3J0IGhheGUuZHMuR2VuZXJpY1N0YWNrOworaW1wb3J0IGhheGUuVXRmODsKK2ltcG9ydCBoYXhlLmNyeXB0by5CYXNlNjQ7CitpbXBvcnQgaGF4ZS5JbnQ2NDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworCisKKy8qIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKyogIFRoaXMgaXMgYSBmdWxsLWZlYXR1cmVkIHByb3RvY29sIHN1cHBvcnRpbmcgV3JpdGUgYW5kIFJlYWQuCisqCisqICBQbGVhc2Ugc2VlIHRoZSBDKysgY2xhc3MgaGVhZGVyIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSB3aXJlIGZvcm1hdC4KKyoKKyogIEFkYXB0ZWQgZnJvbSB0aGUgSmF2YSB2ZXJzaW9uLgorKi8KK2NsYXNzIFRKU09OUHJvdG9jb2wgZXh0ZW5kcyBUUmVjdXJzaW9uVHJhY2tlciBpbXBsZW1lbnRzIFRQcm90b2NvbCB7CisKKyAgICBwdWJsaWMgdmFyIHRyYW5zKGRlZmF1bHQsbnVsbCkgOiBUVHJhbnNwb3J0OworCisgICAgLy8gU3RhY2sgb2YgbmVzdGVkIGNvbnRleHRzIHRoYXQgd2UgbWF5IGJlIGluCisgICAgcHJpdmF0ZSB2YXIgY29udGV4dFN0YWNrIDogR2VuZXJpY1N0YWNrPEpTT05CYXNlQ29udGV4dD4gPSBuZXcgR2VuZXJpY1N0YWNrPEpTT05CYXNlQ29udGV4dD4oKTsKKworICAgIC8vIEN1cnJlbnQgY29udGV4dCB0aGF0IHdlIGFyZSBpbgorICAgIHByaXZhdGUgdmFyIGNvbnRleHQgOiBKU09OQmFzZUNvbnRleHQ7CisKKyAgICAvLyBSZWFkZXIgdGhhdCBtYW5hZ2VzIGEgMS1ieXRlIGJ1ZmZlcgorICAgIHByaXZhdGUgdmFyIHJlYWRlciA6IExvb2thaGVhZFJlYWRlcjsKKworICAgIC8vIHdoZXRoZXIgdGhlIHVuZGVybHlpbmcgc3lzdGVtIGhvbGRzIFN0cmluZ3MgYXMgVVRGLTgKKyAgICAvLyBodHRwOi8vb2xkLmhheGUub3JnL21hbnVhbC9lbmNvZGluZworICAgIHByaXZhdGUgc3RhdGljIHZhciB1dGY4U3RyaW5ncyA9IGhheGUuVXRmOC52YWxpZGF0ZSgiw4ctw58tw4Yt0K4t0KgiKTsKKworICAgIC8vIFRKU09OUHJvdG9jb2wgQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCB0cmFucyA6IFRUcmFuc3BvcnQpCisgICAgeworICAgICAgICB0aGlzLnRyYW5zID0gdHJhbnM7CisgICAgICAgIHRoaXMuY29udGV4dCA9IG5ldyBKU09OQmFzZUNvbnRleHQodGhpcyk7CisgICAgICAgIHRoaXMucmVhZGVyID0gbmV3IExvb2thaGVhZFJlYWRlcih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KCkgOiBUVHJhbnNwb3J0IHsKKyAgICAgIHJldHVybiB0cmFuczsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4obWVzc2FnZTpUTWVzc2FnZSkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OQXJyYXlTdGFydCgpOworICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKCBKU09OQ29uc3RhbnRzLlZFUlNJT04pOworICAgICAgICBXcml0ZUpTT05TdHJpbmcoIEJ5dGVzRnJvbVN0cmluZyhtZXNzYWdlLm5hbWUpKTsKKyAgICAgICAgV3JpdGVKU09OSW50ZWdlciggbWVzc2FnZS50eXBlKTsKKyAgICAgICAgV3JpdGVKU09OSW50ZWdlciggbWVzc2FnZS5zZXFpZCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oc3RydWN0OlRTdHJ1Y3QpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OT2JqZWN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbihmaWVsZDpURmllbGQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIGZpZWxkLmlkICk7CisgICAgICAgIFdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgIFdyaXRlSlNPTlN0cmluZyggQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLkdldFR5cGVOYW1lRm9yVHlwZUlEKCBmaWVsZC50eXBlKSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OT2JqZWN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkgOiBWb2lkIHsgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4obWFwOlRNYXApIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgV3JpdGVKU09OU3RyaW5nKCBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuR2V0VHlwZU5hbWVGb3JUeXBlSUQoIG1hcC5rZXlUeXBlKSkpOworICAgICAgICBXcml0ZUpTT05TdHJpbmcoIEJ5dGVzRnJvbVN0cmluZyggSlNPTkNvbnN0YW50cy5HZXRUeXBlTmFtZUZvclR5cGVJRCggbWFwLnZhbHVlVHlwZSkpKTsKKyAgICAgICAgV3JpdGVKU09OSW50ZWdlciggbWFwLnNpemUpOworICAgICAgICBXcml0ZUpTT05PYmplY3RTdGFydCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTk9iamVjdEVuZCgpOworICAgICAgICBXcml0ZUpTT05BcnJheUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbihsaXN0OlRMaXN0KSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgIFdyaXRlSlNPTlN0cmluZyggQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLkdldFR5cGVOYW1lRm9yVHlwZUlEKCBsaXN0LmVsZW1UeXBlICkpKTsKKyAgICAgICAgV3JpdGVKU09OSW50ZWdlciggbGlzdC5zaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbihzZXQ6VFNldCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OQXJyYXlTdGFydCgpOworICAgICAgICBXcml0ZUpTT05TdHJpbmcoIEJ5dGVzRnJvbVN0cmluZyggSlNPTkNvbnN0YW50cy5HZXRUeXBlTmFtZUZvclR5cGVJRCggc2V0LmVsZW1UeXBlKSkpOworICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKCBzZXQuc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKGIgOiBCb29sKSA6IFZvaWQgeworICAgICAgICBpZiggYikKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKGIgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIGIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNihpMTYgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIGkxNik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKGkzMiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OSW50ZWdlciggaTMyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoaTY0IDogaGF4ZS5JbnQ2NCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OSW50NjQoIGk2NCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKGR1YjpGbG9hdCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09ORG91YmxlKGR1Yik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKHN0ciA6IFN0cmluZykgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OU3RyaW5nKCBCeXRlc0Zyb21TdHJpbmcoc3RyKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQmluYXJ5KGJpbjpCeXRlcykgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OQmFzZTY0KGJpbik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oKTpUTWVzc2FnZSB7CisgICAgICAgIHZhciBtZXNzYWdlIDogVE1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoKTsKKyAgICAgICAgUmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgIGlmIChSZWFkSlNPTkludGVnZXIoKSAhPSBKU09OQ29uc3RhbnRzLlZFUlNJT04pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uIik7CisgICAgICAgIH0KKworICAgICAgICBtZXNzYWdlLm5hbWUgPSBSZWFkSlNPTlN0cmluZyhmYWxzZSk7CisgICAgICAgIG1lc3NhZ2UudHlwZSA9IFJlYWRKU09OSW50ZWdlcigpOworICAgICAgICBtZXNzYWdlLnNlcWlkID0gUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpIDogVm9pZCB7CisgICAgICAgIFJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCk6VFN0cnVjdCB7CisgICAgICAgIFJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUU3RydWN0KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKSA6IFZvaWQgeworICAgICAgICBSZWFkSlNPTk9iamVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigpIDogVEZpZWxkIHsKKyAgICAgICAgdmFyIGZpZWxkIDogVEZpZWxkID0gbmV3IFRGaWVsZCgpOworICAgICAgICB2YXIgY2ggPSByZWFkZXIuUGVlaygpOworICAgICAgICBpZiAoU3RyaW5nRnJvbUJ5dGVzKGNoKSA9PSBKU09OQ29uc3RhbnRzLlJCUkFDRSkKKyAgICAgICAgeworICAgICAgICAgICAgZmllbGQudHlwZSA9IFRUeXBlLlNUT1A7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmaWVsZC5pZCA9IFJlYWRKU09OSW50ZWdlcigpOworICAgICAgICAgICAgUmVhZEpTT05PYmplY3RTdGFydCgpOworICAgICAgICAgICAgZmllbGQudHlwZSA9IEpTT05Db25zdGFudHMuR2V0VHlwZUlERm9yVHlwZU5hbWUoIFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKSA6IFZvaWQgeworICAgICAgICBSZWFkSlNPTk9iamVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oKSA6IFRNYXAgeworICAgICAgICBSZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgdmFyIEtleVR5cGUgPSBKU09OQ29uc3RhbnRzLkdldFR5cGVJREZvclR5cGVOYW1lKCBSZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICB2YXIgVmFsdWVUeXBlID0gSlNPTkNvbnN0YW50cy5HZXRUeXBlSURGb3JUeXBlTmFtZSggUmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgdmFyIENvdW50IDogSW50ID0gUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgIFJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKworICAgICAgICB2YXIgbWFwID0gbmV3IFRNYXAoIEtleVR5cGUsIFZhbHVlVHlwZSwgQ291bnQpOworICAgICAgICByZXR1cm4gbWFwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgUmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgUmVhZEpTT05BcnJheUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCk6VExpc3QgeworICAgICAgICBSZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgdmFyIEVsZW1lbnRUeXBlID0gSlNPTkNvbnN0YW50cy5HZXRUeXBlSURGb3JUeXBlTmFtZSggUmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgdmFyIENvdW50IDogSW50ID0gUmVhZEpTT05JbnRlZ2VyKCk7CisKKyAgICAgICAgdmFyIGxpc3QgPSBuZXcgVExpc3QoIEVsZW1lbnRUeXBlLCBDb3VudCk7CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpIDogVm9pZCB7CisgICAgICAgIFJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCkgOiBUU2V0IHsKKyAgICAgICAgUmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgIHZhciBFbGVtZW50VHlwZSA9IEpTT05Db25zdGFudHMuR2V0VHlwZUlERm9yVHlwZU5hbWUoIFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgIHZhciBDb3VudCA6IEludCA9IFJlYWRKU09OSW50ZWdlcigpOworCisgICAgICAgIHZhciBzZXQgPSBuZXcgVFNldCggRWxlbWVudFR5cGUsIENvdW50KTsKKyAgICAgICAgcmV0dXJuIHNldDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpIDogVm9pZCB7CisgICAgICAgIFJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gKFJlYWRKU09OSW50ZWdlcigpICE9IDApOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQnl0ZSgpIDogSW50IHsKKyAgICAgICAgcmV0dXJuIFJlYWRKU09OSW50ZWdlcigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCkgOiBJbnQgeworICAgICAgICByZXR1cm4gUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoKSA6IEludCB7CisgICAgICAgIHJldHVybiBSZWFkSlNPTkludGVnZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgpIDogaGF4ZS5JbnQ2NCB7CisgICAgICAgIHJldHVybiBSZWFkSlNPTkludDY0KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoKTpGbG9hdCB7CisgICAgICAgIHJldHVybiBSZWFkSlNPTkRvdWJsZSgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nKCkgOiBTdHJpbmcgeworICAgICAgICByZXR1cm4gUmVhZEpTT05TdHJpbmcoZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQmluYXJ5KCkgOiBCeXRlcyB7CisgICAgICAgIHJldHVybiBSZWFkSlNPTkJhc2U2NCgpOworICAgIH0KKworICAgIC8vIFB1c2ggYSBuZXcgSlNPTiBjb250ZXh0IG9udG8gdGhlIHN0YWNrLgorICAgIHByaXZhdGUgZnVuY3Rpb24gIFB1c2hDb250ZXh0KGMgOiBKU09OQmFzZUNvbnRleHQpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHRTdGFjay5hZGQoY29udGV4dCk7CisgICAgICAgIGNvbnRleHQgPSBjOworICAgIH0KKworICAgIC8vIFBvcCB0aGUgbGFzdCBKU09OIGNvbnRleHQgb2ZmIHRoZSBzdGFjaworICAgIHByaXZhdGUgZnVuY3Rpb24gIFBvcENvbnRleHQoKSA6IFZvaWQgeworICAgICAgICBjb250ZXh0ID0gY29udGV4dFN0YWNrLnBvcCgpOworICAgIH0KKworCisgICAgLy8gV3JpdGUgdGhlIGJ5dGVzIGluIGFycmF5IGJ1ZiBhcyBhIEpTT04gY2hhcmFjdGVycywgZXNjYXBpbmcgYXMgbmVlZGVkCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUpTT05TdHJpbmcoIGIgOiBCeXRlcykgOiBWb2lkIHsKKyAgICAgICAgY29udGV4dC5Xcml0ZSgpOworCisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuUVVPVEUpOworICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKworICAgICAgICBmb3IgKGkgaW4gMCAuLi4gYi5sZW5ndGgpIHsKKyAgICAgICAgICAgIHZhciB2YWx1ZSA9IGIuZ2V0KGkpOworCisgICAgICAgICAgICBpZiAoKHZhbHVlICYgMHgwMEZGKSA+PSAweDMwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChTdHJpbmcuZnJvbUNoYXJDb2RlKHZhbHVlKSA9PSBKU09OQ29uc3RhbnRzLkJBQ0tTTEFTSC5jaGFyQXQoMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuQkFDS1NMQVNIICsgSlNPTkNvbnN0YW50cy5CQUNLU0xBU0gpOworICAgICAgICAgICAgICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnMud3JpdGUoIGIsIGksIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbnVtID0gSlNPTkNvbnN0YW50cy5KU09OX0NIQVJfVEFCTEVbdmFsdWVdOworICAgICAgICAgICAgICAgIGlmIChudW0gPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zLndyaXRlKCBiLCBpLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobnVtID4gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFkZFN0cmluZyggSlNPTkNvbnN0YW50cy5CQUNLU0xBU0gpOworICAgICAgICAgICAgICAgICAgICBidWYuYWRkQnl0ZSggbnVtKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gYnVmLmdldEJ5dGVzKCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEpTT05Db25zdGFudHMuRVNDU0VRKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFkZFN0cmluZyggSGV4Q2hhciggKHZhbHVlICYgMHhGRjAwMDAwMCkgPj4gMTIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFkZFN0cmluZyggSGV4Q2hhciggKHZhbHVlICYgMHgwMEZGMDAwMCkgPj4gOCkpOworICAgICAgICAgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBIZXhDaGFyKCAodmFsdWUgJiAweDAwMDBGRjAwKSA+PiA0KSk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEhleENoYXIoIHZhbHVlICYgMHgwMDAwMDBGRikpOworICAgICAgICAgICAgICAgICAgICB0bXAgPSBidWYuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdG1wID0gQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLlFVT1RFKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgfQorCisgICAgLy8gV3JpdGUgb3V0IG51bWJlciBhcyBhIEpTT04gdmFsdWUuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzIHNvLAorICAgIC8vIGl0IHdpbGwgYmUgd3JhcHBlZCBpbiBxdW90ZXMgdG8gb3V0cHV0IGFzIGEgSlNPTiBzdHJpbmcuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUpTT05JbnRlZ2VyKCBudW0gOiBJbnQpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKworICAgICAgICB2YXIgc3RyIDogU3RyaW5nID0gIiI7CisgICAgICAgIHZhciBlc2NhcGVOdW0gOiBCb29sID0gY29udGV4dC5Fc2NhcGVOdW1iZXJzKCk7CisKKyAgICAgICAgaWYgKGVzY2FwZU51bSkgeworICAgICAgICAgICAgc3RyICs9IEpTT05Db25zdGFudHMuUVVPVEU7CisgICAgICAgIH0KKworICAgICAgICBzdHIgKz0gU3RkLnN0cmluZyhudW0pOworCisgICAgICAgIGlmIChlc2NhcGVOdW0pIHsKKyAgICAgICAgICAgIHN0ciArPSBKU09OQ29uc3RhbnRzLlFVT1RFOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHRtcCA9IEJ5dGVzRnJvbVN0cmluZyggc3RyKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgfQorCisgICAgLy8gV3JpdGUgb3V0IG51bWJlciBhcyBhIEpTT04gdmFsdWUuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzIHNvLAorICAgIC8vIGl0IHdpbGwgYmUgd3JhcHBlZCBpbiBxdW90ZXMgdG8gb3V0cHV0IGFzIGEgSlNPTiBzdHJpbmcuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUpTT05JbnQ2NCggbnVtIDogSW50NjQpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKworICAgICAgICB2YXIgc3RyIDogU3RyaW5nID0gIiI7CisgICAgICAgIHZhciBlc2NhcGVOdW0gOiBCb29sID0gY29udGV4dC5Fc2NhcGVOdW1iZXJzKCk7CisKKyAgICAgICAgaWYgKGVzY2FwZU51bSkgeworICAgICAgICAgICAgc3RyICs9IEpTT05Db25zdGFudHMuUVVPVEU7CisgICAgICAgIH0KKworICAgICAgICBzdHIgKz0gU3RkLnN0cmluZyhudW0pOworCisgICAgICAgIGlmIChlc2NhcGVOdW0pIHsKKyAgICAgICAgICAgIHN0ciArPSBKU09OQ29uc3RhbnRzLlFVT1RFOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHRtcCA9IEJ5dGVzRnJvbVN0cmluZyggc3RyKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgfQorCisgICAgLy8gV3JpdGUgb3V0IGEgZG91YmxlIGFzIGEgSlNPTiB2YWx1ZS4gSWYgaXQgaXMgTmFOIG9yIGluZmluaXR5IG9yIGlmIHRoZQorICAgIC8vIGNvbnRleHQgZGljdGF0ZXMgZXNjYXBpbmcsIFdyaXRlIG91dCBhcyBKU09OIHN0cmluZy4KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlSlNPTkRvdWJsZShudW0gOiBGbG9hdCkgOiBWb2lkIHsKKyAgICAgICAgY29udGV4dC5Xcml0ZSgpOworCisKKyAgICAgICAgdmFyIHNwZWNpYWwgOiBCb29sID0gZmFsc2U7CisgICAgICAgIHZhciByZW5kZXJlZCA6IFN0cmluZyA9ICIiOworICAgICAgICBpZiggTWF0aC5pc05hTihudW0pKSB7CisgICAgICAgICAgICBzcGVjaWFsID0gdHJ1ZTsKKyAgICAgICAgICAgIHJlbmRlcmVkID0gSlNPTkNvbnN0YW50cy5GTE9BVF9JU19OQU47CisgICAgICAgIH0gZWxzZSBpZiAoISBNYXRoLmlzRmluaXRlKG51bSkpIHsKKyAgICAgICAgICAgIHNwZWNpYWwgPSB0cnVlOworICAgICAgICAgICAgaWYoIG51bSA+IDApIHsKKyAgICAgICAgICAgICAgICByZW5kZXJlZCA9IEpTT05Db25zdGFudHMuRkxPQVRfSVNfUE9TX0lORjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVuZGVyZWQgPSBKU09OQ29uc3RhbnRzLkZMT0FUX0lTX05FR19JTkY7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZW5kZXJlZCA9IFN0ZC5zdHJpbmcobnVtKTsgIC8vIHBsYWluIGFuZCBzaW1wbGUgZmxvYXQgbnVtYmVyCisgICAgICAgIH0KKworICAgICAgICAvLyBjb21wb3NlIG91dHB1dAorICAgICAgICB2YXIgZXNjYXBlTnVtIDogQm9vbCA9IHNwZWNpYWwgfHwgY29udGV4dC5Fc2NhcGVOdW1iZXJzKCk7CisgICAgICAgIHZhciBzdHIgOiBTdHJpbmcgPSAiIjsKKyAgICAgICAgaWYgKGVzY2FwZU51bSkgeworICAgICAgICAgICAgc3RyICs9IEpTT05Db25zdGFudHMuUVVPVEU7CisgICAgICAgIH0KKyAgICAgICAgc3RyICs9IHJlbmRlcmVkOworICAgICAgICBpZiAoZXNjYXBlTnVtKSB7CisgICAgICAgICAgICBzdHIgKz0gSlNPTkNvbnN0YW50cy5RVU9URTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIHN0cik7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgIH0KKworICAgIC8vIFdyaXRlIG91dCBjb250ZW50cyBvZiBieXRlIGFycmF5IGIgYXMgYSBKU09OIHN0cmluZyB3aXRoIGJhc2UtNjQgZW5jb2RlZCBkYXRhCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUpTT05CYXNlNjQoIGIgOiBCeXRlcykgOiBWb2lkIHsKKyAgICAgICAgY29udGV4dC5Xcml0ZSgpOworCisgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFkZFN0cmluZyggSlNPTkNvbnN0YW50cy5RVU9URSk7CisgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEJhc2U2NC5lbmNvZGUoYikpOworICAgICAgICBidWYuYWRkU3RyaW5nKCBKU09OQ29uc3RhbnRzLlFVT1RFKTsKKworICAgICAgICB2YXIgdG1wID0gYnVmLmdldEJ5dGVzKCk7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVKU09OT2JqZWN0U3RhcnQoKSA6IFZvaWQgeworICAgICAgICBjb250ZXh0LldyaXRlKCk7CisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuTEJSQUNFKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgICAgIFB1c2hDb250ZXh0KCBuZXcgSlNPTlBhaXJDb250ZXh0KHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlSlNPTk9iamVjdEVuZCgpIDogVm9pZCB7CisgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICAgICAgdmFyIHRtcCA9IEJ5dGVzRnJvbVN0cmluZyggSlNPTkNvbnN0YW50cy5SQlJBQ0UpOworICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlSlNPTkFycmF5U3RhcnQoKSA6IFZvaWQgeworICAgICAgICBjb250ZXh0LldyaXRlKCk7CisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuTEJSQUNLRVQpOworICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICAgICAgUHVzaENvbnRleHQoIG5ldyBKU09OTGlzdENvbnRleHQodGhpcykpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVKU09OQXJyYXlFbmQoKSA6IFZvaWQgeworICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuUkJSQUNLRVQpOworICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlYWRpbmcgbWV0aG9kcy4KKyAgICAgKi8KKworICAgIC8vIFJlYWQgYSBieXRlIHRoYXQgbXVzdCBtYXRjaCBjaGFyLCBvdGhlcndpc2UgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICBwdWJsaWMgZnVuY3Rpb24gUmVhZEpTT05TeW50YXhDaGFyKCBjaGFyIDogU3RyaW5nKSA6IFZvaWQgeworICAgICAgICB2YXIgYiA9IEJ5dGVzRnJvbVN0cmluZyggY2hhcik7CisKKyAgICAgICAgdmFyIGNoID0gcmVhZGVyLlJlYWQoKTsKKyAgICAgICAgaWYgKGNoLmdldCgwKSAhPSBiLmdldCgwKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVW5leHBlY3RlZCBjaGFyYWN0ZXI6ICRjaCcpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmVhZCBpbiBhIEpTT04gc3RyaW5nLCB1bmVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlLgorICAgIC8vIFNraXAgUmVhZGluZyBmcm9tIHRoZSBjb250ZXh0IGlmIHNraXBDb250ZXh0IGlzIHRydWUuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTlN0cmluZyhza2lwQ29udGV4dCA6IEJvb2wpIDogU3RyaW5nCisgICAgeworICAgICAgICBpZiAoIXNraXBDb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LlJlYWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBidWZmZXIgOiBCeXRlc0J1ZmZlciA9IG5ldyBCeXRlc0J1ZmZlcigpOworCisgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5RVU9URSk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY2ggPSByZWFkZXIuUmVhZCgpOworCisgICAgICAgICAgICAvLyBlbmQgb2Ygc3RyaW5nPworICAgICAgICAgICAgaWYgKFN0cmluZ0Zyb21CeXRlcyhjaCkgPT0gSlNPTkNvbnN0YW50cy5RVU9URSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZXNjYXBlZD8KKyAgICAgICAgICAgIGlmIChTdHJpbmdGcm9tQnl0ZXMoY2gpICE9IEpTT05Db25zdGFudHMuRVNDU0VRLmNoYXJBdCgwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYWRkQnl0ZSggY2guZ2V0KDApKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBcdVhYWFggKGhleCB1bmljb2RlKSBhbmQgXFggKGNvbnRyb2wgY2hhcnMpCisgICAgICAgICAgICBjaCA9IHJlYWRlci5SZWFkKCk7CisgICAgICAgICAgICBpZiAoU3RyaW5nRnJvbUJ5dGVzKGNoKSAhPSBKU09OQ29uc3RhbnRzLkVTQ1NFUS5jaGFyQXQoMSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gSlNPTkNvbnN0YW50cy5FU0NBUEVfQ0hBUlNfVE9fVkFMVUVTW2NoLmdldCgwKV07CisgICAgICAgICAgICAgICAgaWYoIHZhbHVlID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgY29udHJvbCBjaGFyIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1ZmZlci5hZGRCeXRlKCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gaXQncyBcdVhYWFgKKyAgICAgICAgICAgIHZhciBoZXhidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIHZhciBoZXhsZW4gPSB0cmFucy5yZWFkQWxsKCBoZXhidWYsIDAsIDQpOworICAgICAgICAgICAgaWYoIGhleGxlbiAhPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJOb3QgZW5vdWdoIGRhdGEgZm9yIFxcdU5OTk4gc2VxdWVuY2UiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGhleGRpZ2l0cyA9IGhleGJ1Zi5nZXRCeXRlcygpOworICAgICAgICAgICAgdmFyIGNoYXJjb2RlID0gMDsKKyAgICAgICAgICAgIGNoYXJjb2RlID0gKGNoYXJjb2RlIDw8IDQpICsgSGV4VmFsKCBTdHJpbmcuZnJvbUNoYXJDb2RlKGhleGRpZ2l0cy5nZXQoMCkpKTsKKyAgICAgICAgICAgIGNoYXJjb2RlID0gKGNoYXJjb2RlIDw8IDQpICsgSGV4VmFsKCBTdHJpbmcuZnJvbUNoYXJDb2RlKGhleGRpZ2l0cy5nZXQoMSkpKTsKKyAgICAgICAgICAgIGNoYXJjb2RlID0gKGNoYXJjb2RlIDw8IDQpICsgSGV4VmFsKCBTdHJpbmcuZnJvbUNoYXJDb2RlKGhleGRpZ2l0cy5nZXQoMikpKTsKKyAgICAgICAgICAgIGNoYXJjb2RlID0gKGNoYXJjb2RlIDw8IDQpICsgSGV4VmFsKCBTdHJpbmcuZnJvbUNoYXJDb2RlKGhleGRpZ2l0cy5nZXQoMykpKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hZGRTdHJpbmcoIFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhcmNvZGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBTdHJpbmdGcm9tQnl0ZXMoIGJ1ZmZlci5nZXRCeXRlcygpKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnl0ZSBjb3VsZCBiZSBhIHZhbGlkIHBhcnQgb2YgYSBKU09OIG51bWJlci4KKyAgICBwcml2YXRlIGZ1bmN0aW9uIElzSlNPTk51bWVyaWMoYiA6IEludCkgOiBCb29sIHsKKyAgICAgICAgc3dpdGNoIChiKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlICIrIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICItIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICIuIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICIwIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICIxIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICIyIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICIzIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICI0Ii5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICI1Ii5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICI2Ii5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICI3Ii5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICI4Ii5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICI5Ii5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICJFIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICJlIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFJlYWQgaW4gYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGFsbCB2YWxpZCBpbiBKU09OIG51bWJlcnMuIERvZXMKKyAgICAvLyBub3QgZG8gYSBjb21wbGV0ZSByZWdleCBjaGVjayB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkgYSBudW1iZXIuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTk51bWVyaWNDaGFycygpIDogU3RyaW5nCisgICAgeworICAgICAgICB2YXIgYnVmZmVyIDogQnl0ZXNCdWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjaCA9IHJlYWRlci5QZWVrKCk7CisgICAgICAgICAgICBpZiggISBJc0pTT05OdW1lcmljKCBjaC5nZXQoMCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVyLmFkZEJ5dGUoIHJlYWRlci5SZWFkKCkuZ2V0KDApKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU3RyaW5nRnJvbUJ5dGVzKCBidWZmZXIuZ2V0Qnl0ZXMoKSk7CisgICAgfQorCisgICAgLy8gUmVhZCBpbiBhIEpTT04gbnVtYmVyLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcywgUmVhZCBpbiBlbmNsb3NpbmcgcXVvdGVzLgorICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZEpTT05JbnRlZ2VyKCkgOiBJbnQgeworICAgICAgICBjb250ZXh0LlJlYWQoKTsKKworICAgICAgICBpZiAoY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpIHsKKyAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5RVU9URSk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgc3RyIDogU3RyaW5nID0gUmVhZEpTT05OdW1lcmljQ2hhcnMoKTsKKworICAgICAgICBpZiAoY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpIHsKKyAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5RVU9URSk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdmFsdWUgPSBTdGQucGFyc2VJbnQoc3RyKTsKKyAgICAgICAgaWYoIHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgJ0JhZCBudW1lcmljIGRhdGE6ICRzdHInKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGluIGEgSlNPTiBudW1iZXIuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzLCBSZWFkIGluIGVuY2xvc2luZyBxdW90ZXMuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTkludDY0KCkgOiBoYXhlLkludDY0IHsKKyAgICAgICAgY29udGV4dC5SZWFkKCk7CisKKyAgICAgICAgaWYgKGNvbnRleHQuRXNjYXBlTnVtYmVycygpKSB7CisgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoIEpTT05Db25zdGFudHMuUVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHN0ciA6IFN0cmluZyA9IFJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisgICAgICAgIGlmKCBzdHIubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgJ0JhZCBudW1lcmljIGRhdGE6ICRzdHInKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb250ZXh0LkVzY2FwZU51bWJlcnMoKSkgeworICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKCBKU09OQ29uc3RhbnRzLlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb2Nlc3Mgc2lnbgorICAgICAgICB2YXIgYk1pbnVzID0gZmFsc2U7CisgICAgICAgIHZhciBzdGFydEF0ID0gMDsKKyAgICAgICAgaWYoIChzdHIuY2hhckF0KDApID09ICIrIikgfHwgKHN0ci5jaGFyQXQoMCkgPT0gIi0iKSkgeworICAgICAgICAgICAgYk1pbnVzID0gKHN0ci5jaGFyQXQoMCkgPT0gIi0iKTsKKyAgICAgICAgICAgIHN0YXJ0QXQrKzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb2Nlc3MgZGlnaXRzCisgICAgICAgIHZhciB2YWx1ZSA6IEludDY0ID0gSW50NjQubWFrZSgwLDApOworICAgICAgICB2YXIgYkdvdERpZ2l0cyA9IGZhbHNlOworICAgICAgICBmb3IoIGkgaW4gc3RhcnRBdCAuLi4gc3RyLmxlbmd0aCkgeworICAgICAgICAgICAgdmFyIGNoID0gc3RyLmNoYXJBdChpKTsKKyAgICAgICAgICAgIHZhciBkaWdpdCA9IEpTT05Db25zdGFudHMuREVDSU1BTF9ESUdJVFNbY2hdOworICAgICAgICAgICAgaWYoIGRpZ2l0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICdCYWQgbnVtZXJpYyBkYXRhOiAkc3RyJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiR290RGlnaXRzID0gdHJ1ZTsKKworICAgICAgICAgICAgLy8gdGhlc2UgYXJlIGRlY2ltYWwgZGlnaXRzCisgICAgICAgICAgICB2YWx1ZSA9IEludDY0Lm11bCggdmFsdWUsIEludDY0Lm1ha2UoMCwxMCkpOworICAgICAgICAgICAgdmFsdWUgPSBJbnQ2NC5hZGQoIHZhbHVlLCBJbnQ2NC5tYWtlKDAsZGlnaXQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb2Nlc3MgcGVuZGluZyBtaW51cyBzaWduLCBpZiBhcHBsaWNhYmxlCisgICAgICAgIC8vIHRoaXMgc2hvdWxkIGFsc28gaGFuZGxlIHRoZSBlZGdlIGNhc2UgTUlOX0lOVDY0IGNvcnJlY3RseQorICAgICAgICBpZiggYk1pbnVzICYmIChJbnQ2NC5jb21wYXJlKHZhbHVlLEludDY0Lm1ha2UoMCwwKSkgPiAwKSkgeworICAgICAgICAgICAgdmFsdWUgPSBJbnQ2NC5uZWcoIHZhbHVlKTsKKyAgICAgICAgICAgIGJNaW51cyA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYoICEgYkdvdERpZ2l0cykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAnQmFkIG51bWVyaWMgZGF0YTogJHN0cicpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8vIFJlYWQgaW4gYSBKU09OIGRvdWJsZSB2YWx1ZS4gVGhyb3cgaWYgdGhlIHZhbHVlIGlzIG5vdCB3cmFwcGVkIGluIHF1b3RlcworICAgIC8vIHdoZW4gZXhwZWN0ZWQgb3IgaWYgd3JhcHBlZCBpbiBxdW90ZXMgd2hlbiBub3QgZXhwZWN0ZWQuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTkRvdWJsZSgpIDogRmxvYXQgeworICAgICAgICBjb250ZXh0LlJlYWQoKTsKKworICAgICAgICB2YXIgc3RyIDogU3RyaW5nID0gIiI7CisgICAgICAgIGlmIChTdHJpbmdGcm9tQnl0ZXMocmVhZGVyLlBlZWsoKSkgPT0gSlNPTkNvbnN0YW50cy5RVU9URSkgeworICAgICAgICAgICAgc3RyID0gUmVhZEpTT05TdHJpbmcodHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZXMKKyAgICAgICAgICAgIGlmKCBzdHIgPT0gSlNPTkNvbnN0YW50cy5GTE9BVF9JU19OQU4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5OYU47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggc3RyID09IEpTT05Db25zdGFudHMuRkxPQVRfSVNfUE9TX0lORikgeworICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLlBPU0lUSVZFX0lORklOSVRZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIHN0ciA9PSBKU09OQ29uc3RhbnRzLkZMT0FUX0lTX05FR19JTkYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5ORUdBVElWRV9JTkZJTklUWTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoICEgY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpICAgIHsKKyAgICAgICAgICAgICAgICAvLyB0aHJvdyAtIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBjb250ZXh0LkVzY2FwZU51bWJlcnMoKSkgICAgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyAtIHdlIHNob3VsZCBoYXZlIGhhZCBhIHF1b3RlIGlmIEVzY2FwZU51bWJlcnMoKSA9PSB0cnVlCisgICAgICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKCBKU09OQ29uc3RhbnRzLlFVT1RFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RyID0gUmVhZEpTT05OdW1lcmljQ2hhcnMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBhcnNlIGFuZCBjaGVjayAtIHdlIHNob3VsZCBoYXZlIGF0IGxlYXN0IG9uZSB2YWxpZCBkaWdpdAorICAgICAgICB2YXIgZHViID0gU3RkLnBhcnNlRmxvYXQoIHN0cik7CisgICAgICAgIGlmKCAoc3RyLmxlbmd0aCA9PSAwKSB8fCBNYXRoLmlzTmFOKGR1YikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgJ0JhZCBudW1lcmljIGRhdGE6ICRzdHInKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkdWI7CisgICAgfQorCisgICAgLy8gUmVhZCBpbiBhIEpTT04gc3RyaW5nIGNvbnRhaW5pbmcgYmFzZS02NCBlbmNvZGVkIGRhdGEgYW5kIGRlY29kZSBpdC4KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFJlYWRKU09OQmFzZTY0KCkgOiBCeXRlcworICAgIHsKKyAgICAgICAgdmFyIHN0ciA9IFJlYWRKU09OU3RyaW5nKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIEJhc2U2NC5kZWNvZGUoIHN0cik7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTk9iamVjdFN0YXJ0KCkgOiBWb2lkIHsKKyAgICAgICAgY29udGV4dC5SZWFkKCk7CisgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5MQlJBQ0UpOworICAgICAgICBQdXNoQ29udGV4dChuZXcgSlNPTlBhaXJDb250ZXh0KHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFJlYWRKU09OT2JqZWN0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKCBKU09OQ29uc3RhbnRzLlJCUkFDRSk7CisgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFJlYWRKU09OQXJyYXlTdGFydCgpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHQuUmVhZCgpOworICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoIEpTT05Db25zdGFudHMuTEJSQUNLRVQpOworICAgICAgICBQdXNoQ29udGV4dChuZXcgSlNPTkxpc3RDb250ZXh0KHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFJlYWRKU09OQXJyYXlFbmQoKSA6IFZvaWQgeworICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoIEpTT05Db25zdGFudHMuUkJSQUNLRVQpOworICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEJ5dGVzRnJvbVN0cmluZyggc3RyIDogU3RyaW5nKSA6IEJ5dGVzIHsKKyAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICBpZiggdXRmOFN0cmluZ3MpCisgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBzdHIpOyAgLy8gbm8gbmVlZCB0byBlbmNvZGUgb24gVVRGOCB0YXJnZXRzLCB0aGUgc3RyaW5nIGlzIGp1c3QgZmluZQorICAgICAgICBlbHNlCisgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBVdGY4LmVuY29kZSggc3RyKSk7CisgICAgICAgIHJldHVybiBidWYuZ2V0Qnl0ZXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFN0cmluZ0Zyb21CeXRlcyggYnVmIDogQnl0ZXMpIDogU3RyaW5nIHsKKyAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWYpOworICAgICAgICBpZiggYnVmLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuICIiOyAgLy8gcmVhZFN0cmluZygpIHdvdWxkIHJldHVybiBudWxsIGluIHRoYXQgY2FzZSwgd2hpY2ggaXMgd3JvbmcKKyAgICAgICAgdmFyIHN0ciA9IGlucC5yZWFkU3RyaW5nKCBidWYubGVuZ3RoKTsKKyAgICAgICAgaWYoIHV0ZjhTdHJpbmdzKQorICAgICAgICAgICAgcmV0dXJuIHN0cjsgIC8vIG5vIG5lZWQgdG8gZGVjb2RlIG9uIFVURjggdGFyZ2V0cywgdGhlIHN0cmluZyBpcyBqdXN0IGZpbmUKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFV0ZjguZGVjb2RlKCBzdHIpOworICAgIH0KKworICAgIC8vIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggY2hhciAoJzAnLSc5JyBvciAnYSctJ2YnKSBpbnRvIGl0cyBjb3JyZXNwb25kaW5nIGhleCB2YWx1ZQorICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIEhleFZhbChjaGFyIDogU3RyaW5nKSA6IEludCB7CisgICAgICAgIHZhciB2YWx1ZSA9IEpTT05Db25zdGFudHMuSEVYX0RJR0lUU1tjaGFyXTsKKyAgICAgICAgaWYoIHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgJ0V4cGVjdGVkIGhleCBjaGFyYWN0ZXI6ICRjaGFyJyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8vIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggbmliYmxlIHRvIGl0cyBjb3JyZXNwb25kaW5nIGhleCBjaGFyYWN0ZXIKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBIZXhDaGFyKG5pYmJsZSA6IEludCkgOiBTdHJpbmcKKyAgICB7CisgICAgICAgIHJldHVybiAiMDEyMzQ1Njc4OWFiY2RlZiIuY2hhckF0KG5pYmJsZSAmIDB4MEYpOworICAgIH0KKworCit9CisKKworQDphbGxvdyhUSlNPTlByb3RvY29sKQorY2xhc3MgSlNPTkNvbnN0YW50cyB7CisgICAgcHVibGljIHN0YXRpYyB2YXIgQ09NTUEgPSAiLCI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgQ09MT04gPSAiOiI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTEJSQUNFID0gInsiOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIFJCUkFDRSA9ICJ9IjsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBMQlJBQ0tFVCA9ICJbIjsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBSQlJBQ0tFVCA9ICJdIjsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBRVU9URSA9ICJcIiI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgQkFDS1NMQVNIID0gIlxcIjsKKworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEVTQ1NFUSA9ICJcXHUiOworCisgICAgcHVibGljIHN0YXRpYyB2YXIgRkxPQVRfSVNfTkFOID0gIk5hTiI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgRkxPQVRfSVNfUE9TX0lORiA9ICJJbmZpbml0eSI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgRkxPQVRfSVNfTkVHX0lORiA9ICItSW5maW5pdHkiOworCisgICAgcHVibGljIHN0YXRpYyB2YXIgVkVSU0lPTiA9IDE7CisgICAgcHVibGljIHN0YXRpYyB2YXIgSlNPTl9DSEFSX1RBQkxFID0gWworICAgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgICAgImIiLmNvZGUsICJ0Ii5jb2RlLCAibiIuY29kZSwgIDAsICJmIi5jb2RlLCAiciIuY29kZSwgIDAsICAwLAorICAgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgICAgIDEsICAxLCAiXCIiLmNvZGUsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgXTsKKworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEVTQ0FQRV9DSEFSUyAgICAgPSBbJyInLCdcXCcsJy8nLCdiJywnZicsJ24nLCdyJywndCddOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEVTQ0FQRV9DSEFSU19UT19WQUxVRVMgPSBbCisgICAgICAgICJcIiIuY29kZSA9PiAweDIyLAorICAgICAgICAiXFwiLmNvZGUgPT4gMHg1QywKKyAgICAgICAgIi8iLmNvZGUgID0+IDB4MkYsCisgICAgICAgICJiIi5jb2RlICA9PiAweDA4LAorICAgICAgICAiZiIuY29kZSAgPT4gMHgwQywKKyAgICAgICAgIm4iLmNvZGUgID0+IDB4MEEsCisgICAgICAgICJyIi5jb2RlICA9PiAweDBELAorICAgICAgICAidCIuY29kZSAgPT4gMHgwOQorICAgIF07CisKKyAgICBwdWJsaWMgc3RhdGljIHZhciBERUNJTUFMX0RJR0lUUyA9IFsKKyAgICAgICAgIjAiID0+IDAsCisgICAgICAgICIxIiA9PiAxLAorICAgICAgICAiMiIgPT4gMiwKKyAgICAgICAgIjMiID0+IDMsCisgICAgICAgICI0IiA9PiA0LAorICAgICAgICAiNSIgPT4gNSwKKyAgICAgICAgIjYiID0+IDYsCisgICAgICAgICI3IiA9PiA3LAorICAgICAgICAiOCIgPT4gOCwKKyAgICAgICAgIjkiID0+IDkKKyAgICBdOworCisgICAgcHVibGljIHN0YXRpYyB2YXIgSEVYX0RJR0lUUyA9IFsKKyAgICAgICAgIjAiID0+IDAsCisgICAgICAgICIxIiA9PiAxLAorICAgICAgICAiMiIgPT4gMiwKKyAgICAgICAgIjMiID0+IDMsCisgICAgICAgICI0IiA9PiA0LAorICAgICAgICAiNSIgPT4gNSwKKyAgICAgICAgIjYiID0+IDYsCisgICAgICAgICI3IiA9PiA3LAorICAgICAgICAiOCIgPT4gOCwKKyAgICAgICAgIjkiID0+IDksCisgICAgICAgICJBIiA9PiAxMCwKKyAgICAgICAgImEiID0+IDEwLAorICAgICAgICAiQiIgPT4gMTEsCisgICAgICAgICJiIiA9PiAxMSwKKyAgICAgICAgIkMiID0+IDEyLAorICAgICAgICAiYyIgPT4gMTIsCisgICAgICAgICJEIiA9PiAxMywKKyAgICAgICAgImQiID0+IDEzLAorICAgICAgICAiRSIgPT4gMTQsCisgICAgICAgICJlIiA9PiAxNCwKKyAgICAgICAgIkYiID0+IDE1LAorICAgICAgICAiZiIgPT4gMTUKKyAgICBdOworCisKKyAgICBwdWJsaWMgc3RhdGljIHZhciBERUZfU1RSSU5HX1NJWkUgPSAxNjsKKworICAgIHB1YmxpYyBzdGF0aWMgdmFyIE5BTUVfQk9PTCAgID0gJ3RmJzsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX0JZVEUgICA9ICdpOCc7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTkFNRV9JMTYgICAgPSAnaTE2JzsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX0kzMiAgICA9ICdpMzInOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIE5BTUVfSTY0ICAgID0gJ2k2NCc7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTkFNRV9ET1VCTEUgPSAnZGJsJzsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX1NUUlVDVCA9ICdyZWMnOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIE5BTUVfU1RSSU5HID0gJ3N0cic7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTkFNRV9NQVAgICAgPSAnbWFwJzsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX0xJU1QgICA9ICdsc3QnOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIE5BTUVfU0VUICAgID0gJ3NldCc7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEdldFR5cGVOYW1lRm9yVHlwZUlEKHR5cGVJRCA6IEludCkgOiBTdHJpbmcgeworICAgICAgICBzd2l0Y2ggKHR5cGVJRCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBUVHlwZS5CT09MOiAgICAgcmV0dXJuIE5BTUVfQk9PTDsKKyAgICAgICAgICAgIGNhc2UgVFR5cGUuQllURTogICAgIHJldHVybiBOQU1FX0JZVEU7CisgICAgICAgICAgICBjYXNlIFRUeXBlLkkxNjogICAgICAgICByZXR1cm4gTkFNRV9JMTY7CisgICAgICAgICAgICBjYXNlIFRUeXBlLkkzMjogICAgICAgICByZXR1cm4gTkFNRV9JMzI7CisgICAgICAgICAgICBjYXNlIFRUeXBlLkk2NDogICAgICAgICByZXR1cm4gTkFNRV9JNjQ7CisgICAgICAgICAgICBjYXNlIFRUeXBlLkRPVUJMRTogICAgIHJldHVybiBOQU1FX0RPVUJMRTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGUuU1RSSU5HOiAgICAgcmV0dXJuIE5BTUVfU1RSSU5HOworICAgICAgICAgICAgY2FzZSBUVHlwZS5TVFJVQ1Q6ICAgICByZXR1cm4gTkFNRV9TVFJVQ1Q7CisgICAgICAgICAgICBjYXNlIFRUeXBlLk1BUDogICAgICAgICByZXR1cm4gTkFNRV9NQVA7CisgICAgICAgICAgICBjYXNlIFRUeXBlLlNFVDogICAgICAgICByZXR1cm4gTkFNRV9TRVQ7CisgICAgICAgICAgICBjYXNlIFRUeXBlLkxJU1Q6ICAgICByZXR1cm4gTkFNRV9MSVNUOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLk5PVF9JTVBMRU1FTlRFRCwgIlVucmVjb2duaXplZCB0eXBlIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIE5BTUVTX1RPX1RZUEVTID0gWworICAgICAgICBOQU1FX0JPT0wgICA9PiBUVHlwZS5CT09MLAorICAgICAgICBOQU1FX0JZVEUgICA9PiBUVHlwZS5CWVRFLAorICAgICAgICBOQU1FX0kxNiAgICA9PiBUVHlwZS5JMTYsCisgICAgICAgIE5BTUVfSTMyICAgID0+IFRUeXBlLkkzMiwKKyAgICAgICAgTkFNRV9JNjQgICAgPT4gVFR5cGUuSTY0LAorICAgICAgICBOQU1FX0RPVUJMRSA9PiBUVHlwZS5ET1VCTEUsCisgICAgICAgIE5BTUVfU1RSSU5HID0+IFRUeXBlLlNUUklORywKKyAgICAgICAgTkFNRV9TVFJVQ1QgPT4gVFR5cGUuU1RSVUNULAorICAgICAgICBOQU1FX01BUCAgICA9PiBUVHlwZS5NQVAsCisgICAgICAgIE5BTUVfU0VUICAgID0+IFRUeXBlLlNFVCwKKyAgICAgICAgTkFNRV9MSVNUICAgPT4gVFR5cGUuTElTVAorICAgIF07CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEdldFR5cGVJREZvclR5cGVOYW1lKG5hbWUgOiBTdHJpbmcpIDogSW50CisgICAgeworICAgICAgICB2YXIgdHlwZSA9IE5BTUVTX1RPX1RZUEVTW25hbWVdOworICAgICAgICBpZiggbnVsbCAhPSB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5OT1RfSU1QTEVNRU5URUQsICJVbnJlY29nbml6ZWQgdHlwZSIpOworICAgIH0KKworfQorCisKKy8vIEJhc2UgY2xhc3MgZm9yIHRyYWNraW5nIEpTT04gY29udGV4dHMgdGhhdCBtYXkgcmVxdWlyZSBpbnNlcnRpbmcvUmVhZGluZworLy8gYWRkaXRpb25hbCBKU09OIHN5bnRheCBjaGFyYWN0ZXJzLiBUaGlzIGJhc2UgY29udGV4dCBkb2VzIG5vdGhpbmcuCitAOmFsbG93KFRKU09OUHJvdG9jb2wpCitjbGFzcyBKU09OQmFzZUNvbnRleHQKK3sKKyAgICBwcml2YXRlIHZhciBwcm90byA6IFRKU09OUHJvdG9jb2w7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KHByb3RvIDogVEpTT05Qcm90b2NvbCApCisgICAgeworICAgICAgICB0aGlzLnByb3RvID0gcHJvdG87CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIFdyaXRlKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiBSZWFkKCkgOiBWb2lkIHsgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIEVzY2FwZU51bWJlcnMoKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisKKy8vIENvbnRleHQgZm9yIEpTT04gbGlzdHMuCisvLyBXaWxsIGluc2VydC9SZWFkIGNvbW1hcyBiZWZvcmUgZWFjaCBpdGVtIGV4Y2VwdCBmb3IgdGhlIGZpcnN0IG9uZQorQDphbGxvdyhUSlNPTlByb3RvY29sKQorY2xhc3MgSlNPTkxpc3RDb250ZXh0IGV4dGVuZHMgSlNPTkJhc2VDb250ZXh0Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggcHJvdG8gOiBUSlNPTlByb3RvY29sKSB7CisgICAgICAgIHN1cGVyKHByb3RvKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZhciBmaXJzdCA6IEJvb2wgPSB0cnVlOworCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIFdyaXRlKCkgOiBWb2lkIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICAgICAgYnVmLmFkZFN0cmluZyggSlNPTkNvbnN0YW50cy5DT01NQSk7CisgICAgICAgICAgICB2YXIgdG1wID0gYnVmLmdldEJ5dGVzKCk7CisgICAgICAgICAgICBwcm90by50cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBSZWFkKCkgOiBWb2lkIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdG8uUmVhZEpTT05TeW50YXhDaGFyKCBKU09OQ29uc3RhbnRzLkNPTU1BKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvLyBDb250ZXh0IGZvciBKU09OIHJlY29yZHMuCisvLyBXaWxsIGluc2VydC9SZWFkIGNvbG9ucyBiZWZvcmUgdGhlIHZhbHVlIHBvcnRpb24gb2YgZWFjaCByZWNvcmQKKy8vIHBhaXIsIGFuZCBjb21tYXMgYmVmb3JlIGVhY2gga2V5IGV4Y2VwdCB0aGUgZmlyc3QuIEluIGFkZGl0aW9uLAorLy8gd2lsbCBpbmRpY2F0ZSB0aGF0IG51bWJlcnMgaW4gdGhlIGtleSBwb3NpdGlvbiBuZWVkIHRvIGJlIGVzY2FwZWQKKy8vIGluIHF1b3RlcyAoc2luY2UgSlNPTiBrZXlzIG11c3QgYmUgc3RyaW5ncykuCitAOmFsbG93KFRKU09OUHJvdG9jb2wpCitjbGFzcyBKU09OUGFpckNvbnRleHQgZXh0ZW5kcyBKU09OQmFzZUNvbnRleHQKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBwcm90byA6IFRKU09OUHJvdG9jb2wgKSB7CisgICAgICAgIHN1cGVyKCBwcm90byk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2YXIgZmlyc3QgOiBCb29sID0gdHJ1ZTsKKyAgICBwcml2YXRlIHZhciBjb2xvbiA6IEJvb2wgID0gdHJ1ZTsKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBXcml0ZSgpIDogVm9pZCB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGNvbG9uID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIGNvbG9uID8gSlNPTkNvbnN0YW50cy5DT0xPTiA6IEpTT05Db25zdGFudHMuQ09NTUEpOworICAgICAgICAgICAgdmFyIHRtcCA9IGJ1Zi5nZXRCeXRlcygpOworICAgICAgICAgICAgcHJvdG8udHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgICAgICAgICBjb2xvbiA9ICFjb2xvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBSZWFkKCkgOiBWb2lkIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgY29sb24gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdG8uUmVhZEpTT05TeW50YXhDaGFyKCBjb2xvbiA/IEpTT05Db25zdGFudHMuQ09MT04gOiBKU09OQ29uc3RhbnRzLkNPTU1BKTsKKyAgICAgICAgICAgIGNvbG9uID0gIWNvbG9uOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIEVzY2FwZU51bWJlcnMoKSA6IEJvb2wKKyAgICB7CisgICAgICAgIHJldHVybiBjb2xvbjsKKyAgICB9Cit9CisKKy8vIEhvbGRzIHVwIHRvIG9uZSBieXRlIGZyb20gdGhlIHRyYW5zcG9ydAorQDphbGxvdyhUSlNPTlByb3RvY29sKQorY2xhc3MgTG9va2FoZWFkUmVhZGVyIHsKKworICAgIHByaXZhdGUgdmFyIHByb3RvIDogVEpTT05Qcm90b2NvbDsKKyAgICBwcml2YXRlIHZhciBkYXRhIDogQnl0ZXM7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBwcm90byA6IFRKU09OUHJvdG9jb2wgKSB7CisgICAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKKyAgICAgICAgZGF0YSA9IG51bGw7CisgICAgfQorCisKKyAgICAvLyBSZXR1cm4gYW5kIGNvbnN1bWUgdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkLCBlaXRoZXIgdGFraW5nIGl0IGZyb20gdGhlCisgICAgLy8gZGF0YSBidWZmZXIgaWYgcHJlc2VudCBvciBnZXR0aW5nIGl0IGZyb20gdGhlIHRyYW5zcG9ydCBvdGhlcndpc2UuCisgICAgcHVibGljIGZ1bmN0aW9uIFJlYWQoKSA6IEJ5dGVzIHsKKyAgICAgICAgdmFyIHJldHZhbCA9IFBlZWsoKTsKKyAgICAgICAgZGF0YSA9IG51bGw7CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSBuZXh0IGJ5dGUgdG8gYmUgUmVhZCB3aXRob3V0IGNvbnN1bWluZywgZmlsbGluZyB0aGUgZGF0YQorICAgIC8vIGJ1ZmZlciBpZiBpdCBoYXMgbm90IGJlZW4gZmlsbGVkIGFsUmVhZHkuCisgICAgcHVibGljIGZ1bmN0aW9uIFBlZWsoKSA6IEJ5dGVzIHsKKyAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgeworICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICAgICAgcHJvdG8udHJhbnMucmVhZEFsbChidWYsIDAsIDEpOworICAgICAgICAgICAgZGF0YSA9IGJ1Zi5nZXRCeXRlcygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkYXRhOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2xGYWN0b3J5Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2xGYWN0b3J5Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MzU1OGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbEZhY3RvcnkuaHgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKworLyoqCisqIEpTT04gUHJvdG9jb2wgRmFjdG9yeQorKi8KK2NsYXNzIFRKU09OUHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCkgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCggdHJhbnMgOiBUVHJhbnNwb3J0KSA6IFRQcm90b2NvbCAgeworICAgICAgICByZXR1cm4gbmV3IFRKU09OUHJvdG9jb2woIHRyYW5zKTsKKyAgICB9Cit9CisKKworCisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RMaXN0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RMaXN0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMWZiNTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVExpc3QuaHgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitjbGFzcyBUTGlzdCB7CisKKyAgICBwdWJsaWMgdmFyIGVsZW1UeXBlIDogSW50OworICAgIHB1YmxpYyB2YXIgc2l6ZSA6IEludDsKKworICAgICAgcHVibGljIGZ1bmN0aW9uIG5ldyh0IDogSW50ID0gMCwgcyA6IEludCA9IDApIHsKKyAgICAgICAgZWxlbVR5cGUgPSB0OworICAgICAgICBzaXplID0gczsKKyAgICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWFwLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNYXAuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRlNjI4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWFwLmh4CkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworY2xhc3MgVE1hcCB7CisKKyAgICBwdWJsaWMgdmFyIGtleVR5cGUgOiBJbnQ7CisgICAgcHVibGljIHZhciB2YWx1ZVR5cGUgOiBJbnQ7CisgICAgcHVibGljIHZhciBzaXplIDogSW50OworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhrIDogSW50ID0gMCwgdiA6IEludCA9IDAsIHMgOiBJbnQgPSAwKSB7CisgICAgICBrZXlUeXBlID0gazsKKyAgICAgIHZhbHVlVHlwZSA9IHY7CisgICAgICBzaXplID0gczsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1lc3NhZ2UuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1lc3NhZ2UuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5MjY0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWVzc2FnZS5oeApAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2NsYXNzIFRNZXNzYWdlIHsKKworICAgIHB1YmxpYyB2YXIgbmFtZSA6IFN0cmluZzsKKyAgICBwdWJsaWMgdmFyIHR5cGUgOiBJbnQ7CisgICAgcHVibGljIHZhciBzZXFpZCA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcobiA6IFN0cmluZyA9ICIiLCB0IDogSW50ID0gMCwgcyA6IEludCA9IDApIHsKKyAgICAgIG5hbWUgPSBuOworICAgICAgdHlwZSA9IHQ7CisgICAgICBzZXFpZCA9IHM7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRvU3RyaW5nKCkgOiBTdHJpbmcgeworICAgICAgcmV0dXJuICI8VE1lc3NhZ2UgbmFtZTonIiArIG5hbWUgKyAiJyB0eXBlOiAiICsgdHlwZSArICIgc2VxaWQ6IiArIHNlcWlkICsgIj4iOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBlcXVhbHMob3RoZXI6VE1lc3NhZ2UpIDogQm9vbCB7CisgICAgICByZXR1cm4gbmFtZSA9PSBvdGhlci5uYW1lICYmIHR5cGUgPT0gb3RoZXIudHlwZSAmJiBzZXFpZCA9PSBvdGhlci5zZXFpZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1lc3NhZ2VUeXBlLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlVHlwZS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDZkMzI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlVHlwZS5oeApAQCAtMCwwICsxLDI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK0A6ZW51bQorYWJzdHJhY3QgVE1lc3NhZ2VUeXBlKEludCkgIGZyb20gSW50IHRvIEludCAgeworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBDQUxMICAgICAgOiBJbnQgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBSRVBMWSAgICAgOiBJbnQgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBFWENFUFRJT04gOiBJbnQgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBPTkVXQVkgICAgOiBJbnQgPSA0OworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBhYTNjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaHgKQEAgLTAsMCArMSwxNzcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBoYXhlLmRzLlN0cmluZ01hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCisKKy8qKgorICogVE11bHRpcGxleGVkUHJvY2Vzc29yIGlzIGEgVFByb2Nlc3NvciBhbGxvd2luZyBhIHNpbmdsZSBUU2VydmVyIHRvIHByb3ZpZGUgbXVsdGlwbGUgc2VydmljZXMuCisgKiBUbyBkbyBzbywgeW91IGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gcmVnaXN0ZXIgYWRkaXRpb25hbCBwcm9jZXNzb3JzIHdpdGggaXQsCisgKiBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisgKgorICogICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgKgorICogICAgIHByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigKKyAqICAgICAgICAgIkNhbGN1bGF0b3IiLAorICogICAgICAgICBuZXcgQ2FsY3VsYXRvci5Qcm9jZXNzb3IobmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpKTsKKyAqCisgKiAgICAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICogICAgICAgICAiV2VhdGhlclJlcG9ydCIsCisgKiAgICAgICAgIG5ldyBXZWF0aGVyUmVwb3J0LlByb2Nlc3NvcihuZXcgV2VhdGhlclJlcG9ydEhhbmRsZXIoKSkpOworICoKKyAqICAgICBUU2VydmVyVHJhbnNwb3J0IHQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsKKyAqICAgICBUU2ltcGxlU2VydmVyIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKHByb2Nlc3NvciwgdCk7CisgKgorICogICAgIHNlcnZlci5zZXJ2ZSgpOworICovCitjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgaW1wbGVtZW50cyBUUHJvY2Vzc29yCit7CisgICAgcHJpdmF0ZSB2YXIgc2VydmljZVByb2Nlc3Nvck1hcCA6IFN0cmluZ01hcDxUUHJvY2Vzc29yPiA9IG5ldyBTdHJpbmdNYXA8VFByb2Nlc3Nvcj4oKTsKKyAgICBwcml2YXRlIHZhciBkZWZhdWx0UHJvY2Vzc29yIDogVFByb2Nlc3NvciA9IG51bGw7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqICdSZWdpc3RlcicgYSBzZXJ2aWNlIHdpdGggdGhpcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IuIFRoaXMgYWxsb3dzIHVzIHRvIGJyb2tlcgorICAgICAqIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byBzZWxlY3QgdGhlbSBhdCByZXF1ZXN0IHRpbWUuCisgICAgICoKKyAgICAgKiBBcmdzOgorICAgICAqIC0gc2VydmljZU5hbWUgICAgTmFtZSBvZiBhIHNlcnZpY2UsIGhhcyB0byBiZSBpZGVudGljYWwgdG8gdGhlIG5hbWUKKyAgICAgKiAgICAgICAgICAgICAgICAgIGRlY2xhcmVkIGluIHRoZSBUaHJpZnQgSURMLCBlLmcuICJXZWF0aGVyUmVwb3J0Ii4KKyAgICAgKiAtIHByb2Nlc3NvciAgICAgIEltcGxlbWVudGF0aW9uIG9mIGEgc2VydmljZSwgdXN1YWxseSByZWZlcnJlZCB0byBhcyAiaGFuZGxlcnMiLAorICAgICAqICAgICAgICAgICAgICAgICAgZS5nLiBXZWF0aGVyUmVwb3J0SGFuZGxlciBpbXBsZW1lbnRpbmcgV2VhdGhlclJlcG9ydC5JZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gUmVnaXN0ZXJQcm9jZXNzb3Ioc2VydmljZU5hbWUgOiBTdHJpbmcsIHByb2Nlc3NvciA6IFRQcm9jZXNzb3IsIGFzRGVmYXVsdCA6IEJvb2wgPSBmYWxzZSkgOiBWb2lkIHsKKyAgICAgICAgc2VydmljZVByb2Nlc3Nvck1hcC5zZXQoc2VydmljZU5hbWUsIHByb2Nlc3Nvcik7CisgICAgICAgIGlmICggYXNEZWZhdWx0KSB7CisgICAgICAgICAgICBpZiggZGVmYXVsdFByb2Nlc3NvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiggVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlVOS05PV04sICJDYW4ndCBoYXZlIG11bHRpcGxlIGRlZmF1bHQgcHJvY2Vzc29ycyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0UHJvY2Vzc29yID0gcHJvY2Vzc29yOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIEZhaWwoIG9wcm90IDogVFByb3RvY29sLCBtZXNzYWdlIDogVE1lc3NhZ2UsIGV4dHlwZSA6IEludCwgZXR4dCA6IFN0cmluZykgOiBWb2lkIHsKKyAgICAgICAgdmFyIGFwcGV4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiggZXh0eXBlLCBldHh0KTsKKworICAgICAgICB2YXIgbmV3TWVzc2FnZSA9IG5ldyBUTWVzc2FnZShtZXNzYWdlLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1lc3NhZ2Uuc2VxaWQpOworCisgICAgICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ld01lc3NhZ2UpOworICAgICAgICBhcHBleC53cml0ZSggb3Byb3QpOworICAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgICAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgcHJvY2VzcyBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHN0ZXBzOgorICAgICAqCisgICAgICogLSBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UuCisgICAgICogLSBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgbWVzc2FnZS4KKyAgICAgKiAtIFVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IuCisgICAgICogLSBEaXNwYXRjaCB0byB0aGUgcHJvY2Vzc29yLCB3aXRoIGEgZGVjb3JhdGVkIGluc3RhbmNlIG9mIFRQcm90b2NvbAorICAgICAqICAgIHRoYXQgYWxsb3dzIHJlYWRNZXNzYWdlQmVnaW4oKSB0byByZXR1cm4gdGhlIG9yaWdpbmFsIFRNZXNzYWdlLgorICAgICAqCisgICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZgorICAgICAqIC0gdGhlIG1lc3NhZ2UgdHlwZSBpcyBub3QgQ0FMTCBvciBPTkVXQVksCisgICAgICogLSB0aGUgc2VydmljZSBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIG1lc3NhZ2UsIG9yCisgICAgICogLSB0aGUgc2VydmljZSBuYW1lIGhhcyBub3QgYmVlbiBSZWdpc3RlclByb2Nlc3NvcigpZWQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHByb2Nlc3MoIGlwcm90IDogVFByb3RvY29sLCBvcHJvdCA6IFRQcm90b2NvbCkgOiBCb29sIHsKKyAgICAgICAgLyogIFVzZSB0aGUgYWN0dWFsIHVuZGVybHlpbmcgcHJvdG9jb2wgKGUuZy4gVEJpbmFyeVByb3RvY29sKSB0byByZWFkIHRoZQorICAgICAgICAgICAgbWVzc2FnZSBoZWFkZXIuICBUaGlzIHB1bGxzIHRoZSBtZXNzYWdlICJvZmYgdGhlIHdpcmUiLCB3aGljaCB3ZSdsbAorICAgICAgICAgICAgZGVhbCB3aXRoIGF0IHRoZSBlbmQgb2YgdGhpcyBtZXRob2QuICovCisKKyAgICAgICAgdmFyIG1lc3NhZ2UgOiBUTWVzc2FnZSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgICAgdmFyIG1ldGhvZE5hbWUgOiBTdHJpbmcgPSAiIjsKKworICAgICAgICBpZiAoKG1lc3NhZ2UudHlwZSAhPSBUTWVzc2FnZVR5cGUuQ0FMTCkgJiYgKG1lc3NhZ2UudHlwZSAhPSBUTWVzc2FnZVR5cGUuT05FV0FZKSkKKyAgICAgICAgeworICAgICAgICAgICAgRmFpbChvcHJvdCwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlZBTElEX01FU1NBR0VfVFlQRSwKKyAgICAgICAgICAgICAgICAgICJNZXNzYWdlIHR5cGUgQ0FMTCBvciBPTkVXQVkgZXhwZWN0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZQorICAgICAgICB2YXIgYWN0dWFsUHJvY2Vzc29yIDogVFByb2Nlc3NvciA9IG51bGw7CisgICAgICAgIHZhciBpbmRleCA9IG1lc3NhZ2UubmFtZS5pbmRleE9mKFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUik7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIC8vIGZhbGxiYWNrIHRvIGRlZmF1bHQgcHJvY2Vzc29yCisgICAgICAgICAgICBtZXRob2ROYW1lID0gbWVzc2FnZS5uYW1lOworICAgICAgICAgICAgYWN0dWFsUHJvY2Vzc29yID0gZGVmYXVsdFByb2Nlc3NvcjsKKyAgICAgICAgICAgIGlmKCBhY3R1YWxQcm9jZXNzb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEZhaWwob3Byb3QsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVkFMSURfUFJPVE9DT0wsCisgICAgICAgICAgICAgICAgICAgICAgIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiAiICsgbWVzc2FnZS5uYW1lICsgIiBhbmQgbm8gZGVmYXVsdCBwcm9jZXNzb3IgZGVmaW5lZC4gIiArCisgICAgICAgICAgICAgICAgICAgICAgIkRpZCB5b3UgZm9yZ2V0IHRvIHVzZSBhIFRNdWx0aXBsZXhQcm90b2NvbCBpbiB5b3VyIGNsaWVudD8iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHNlcnZpY2UgbmFtZSBnaXZlbgorICAgICAgICAgICAgdmFyIHNlcnZpY2VOYW1lID0gbWVzc2FnZS5uYW1lLnN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICAgICAgICBtZXRob2ROYW1lID0gbWVzc2FnZS5uYW1lLnN1YnN0cmluZyggc2VydmljZU5hbWUubGVuZ3RoICsgVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SLmxlbmd0aCk7CisgICAgICAgICAgICBhY3R1YWxQcm9jZXNzb3IgPSBzZXJ2aWNlUHJvY2Vzc29yTWFwLmdldCggc2VydmljZU5hbWUpOworICAgICAgICAgICAgaWYoIGFjdHVhbFByb2Nlc3NvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgRmFpbChvcHJvdCwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIlNlcnZpY2UgbmFtZSBub3QgZm91bmQ6ICIgKyBzZXJ2aWNlTmFtZSArICIuICIgKworICAgICAgICAgICAgICAgICAgICAgICJEaWQgeW91IGZvcmdldCB0byBjYWxsIFJlZ2lzdGVyUHJvY2Vzc29yKCk/Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCByZW1vdmluZyB0aGUgc2VydmljZSBuYW1lCisgICAgICAgIC8vIERpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKKyAgICAgICAgdmFyIG5ld01lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoIG1ldGhvZE5hbWUsIG1lc3NhZ2UudHlwZSwgbWVzc2FnZS5zZXFpZCk7CisgICAgICAgIHZhciBzdG9yZWRNc2cgPSBuZXcgU3RvcmVkTWVzc2FnZVByb3RvY29sKCBpcHJvdCwgbmV3TWVzc2FnZSk7CisgICAgICAgIHJldHVybiBhY3R1YWxQcm9jZXNzb3IucHJvY2Vzcyggc3RvcmVkTXNnLCBvcHJvdCk7CisgICAgfQorfQorCisKKy8qKgorICogIE91ciBnb2FsIHdhcyB0byB3b3JrIHdpdGggYW55IHByb3RvY29sLiAgSW4gb3JkZXIgdG8gZG8gdGhhdCwgd2UgbmVlZGVkCisgKiAgdG8gYWxsb3cgdGhlbSB0byBjYWxsIHJlYWRNZXNzYWdlQmVnaW4oKSBhbmQgZ2V0IGEgVE1lc3NhZ2UgaW4gZXhhY3RseQorICogIHRoZSBzdGFuZGFyZCBmb3JtYXQsIHdpdGhvdXQgdGhlIHNlcnZpY2UgbmFtZSBwcmVwZW5kZWQgdG8gVE1lc3NhZ2UubmFtZS4KKyAqLworY2xhc3MgU3RvcmVkTWVzc2FnZVByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sRGVjb3JhdG9yCit7CisgICAgcHJpdmF0ZSB2YXIgbWVzc2FnZUJlZ2luIDogVE1lc3NhZ2U7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBwcm90b2NvbCA6IFRQcm90b2NvbCwgbWVzc2FnZUJlZ2luIDogVE1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIoIHByb3RvY29sKTsKKyAgICAgICAgdGhpcy5tZXNzYWdlQmVnaW4gPSBtZXNzYWdlQmVnaW47CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oKSA6IFRNZXNzYWdlIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VCZWdpbjsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWNkMWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmh4CkBAIC0wLDAgKzEsOTcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworCisvKioKKyAqIFRNdWx0aXBsZXhlZFByb3RvY29sIGlzIGEgcHJvdG9jb2wtaW5kZXBlbmRlbnQgY29uY3JldGUgZGVjb3JhdG9yIHRoYXQgYWxsb3dzIGEgVGhyaWZ0CisgKiBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG11bHRpcGxleGluZyBUaHJpZnQgc2VydmVyLCBieSBwcmVwZW5kaW5nIHRoZSBzZXJ2aWNlIG5hbWUKKyAqIHRvIHRoZSBmdW5jdGlvbiBuYW1lIGR1cmluZyBmdW5jdGlvbiBjYWxscy4KKyAqCisgKiBOT1RFOiBUSElTIElTIE5PVCBUTyBCRSBVU0VEIEJZIFNFUlZFUlMuCisgKiBPbiB0aGUgc2VydmVyLCB1c2UgVE11bHRpcGxleGVkUHJvY2Vzc29yIHRvIGhhbmRsZSByZXF1ZXN0cyBmcm9tIGEgbXVsdGlwbGV4aW5nIGNsaWVudC4KKyAqCisgKiBUaGlzIGV4YW1wbGUgdXNlcyBhIHNpbmdsZSBzb2NrZXQgdHJhbnNwb3J0IHRvIGludm9rZSB0d28gc2VydmljZXM6CisgKgorICogICAgIFRTb2NrZXQgdHJhbnNwb3J0ID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOworICogICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgKgorICogICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAqCisgKiAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJDYWxjdWxhdG9yIik7CisgKiAgICAgQ2FsY3VsYXRvci5DbGllbnQgc2VydmljZSA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChtcCk7CisgKgorICogICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wMiA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIldlYXRoZXJSZXBvcnQiKTsKKyAqICAgICBXZWF0aGVyUmVwb3J0LkNsaWVudCBzZXJ2aWNlMiA9IG5ldyBXZWF0aGVyUmVwb3J0LkNsaWVudChtcDIpOworICoKKyAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZS5hZGQoMiwyKSk7CisgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UyLmdldFRlbXBlcmF0dXJlKCkpOworICoKKyAqLworY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2xEZWNvcmF0b3IgeworCisgICAgLyoqIFVzZWQgdG8gZGVsaW1pdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIGZ1bmN0aW9uIG5hbWUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgU0VQQVJBVE9SIDogU3RyaW5nID0gIjoiOworCisgICAgcHJpdmF0ZSB2YXIgc2VydmljZSA6IFN0cmluZzsKKworICAgIC8qKgorICAgICAqIFdyYXAgdGhlIHNwZWNpZmllZCBwcm90b2NvbCwgYWxsb3dpbmcgaXQgdG8gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGEKKyAgICAgKiBtdWx0aXBsZXhpbmcgc2VydmVyLiAgVGhlIDxjb2RlPnNlcnZpY2VOYW1lPC9jb2RlPiBpcyByZXF1aXJlZCBhcyBpdCBpcworICAgICAqIHByZXBlbmRlZCB0byB0aGUgbWVzc2FnZSBoZWFkZXIgc28gdGhhdCB0aGUgbXVsdGlwbGV4aW5nIHNlcnZlciBjYW4gYnJva2VyCisgICAgICogdGhlIGZ1bmN0aW9uIGNhbGwgdG8gdGhlIHByb3BlciBzZXJ2aWNlLgorICAgICAqCisgICAgICogQXJnczoKKyAgICAgKiAgcHJvdG9jb2wgICAgICAgIFlvdXIgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBvZiBjaG9pY2UsIGUuZy4gVEJpbmFyeVByb3RvY29sCisgICAgICogIHNlcnZpY2VOYW1lICAgICBUaGUgc2VydmljZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGNvbW11bmljYXRpbmcgdmlhIHRoaXMgcHJvdG9jb2wuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggcHJvdG9jb2wgOiBUUHJvdG9jb2wsIHNlcnZpY2VOYW1lIDogU3RyaW5nKSAgICB7CisgICAgICAgIHN1cGVyKCBwcm90b2NvbCk7CisgICAgICAgIHNlcnZpY2UgPSBzZXJ2aWNlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmVwZW5kcyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lLCBzZXBhcmF0ZWQgYnkgVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SLgorICAgICAqIEFyZ3M6CisgICAgICogICB0TWVzc2FnZSAgICAgVGhlIG9yaWdpbmFsIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCBtZXNzYWdlIDogVE1lc3NhZ2UpIDogVm9pZCB7CisgICAgICAgIHN3aXRjaCggbWVzc2FnZS50eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFRNZXNzYWdlVHlwZS5DQUxMOgorICAgICAgICAgICAgICAgIHN1cGVyLndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZSArIFNFUEFSQVRPUiArIG1lc3NhZ2UubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlcWlkKSk7CisKKyAgICAgICAgICAgIGNhc2UgVE1lc3NhZ2VUeXBlLk9ORVdBWToKKyAgICAgICAgICAgICAgICBzdXBlci53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgKyBTRVBBUkFUT1IgKyBtZXNzYWdlLm5hbWUsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXFpZCkpOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHN1cGVyLndyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2YzODQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oeApAQCAtMCwwICsxLDg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKy8qKgorKiBQcm90b2NvbCBpbnRlcmZhY2UgZGVmaW5pdGlvbgorKi8KK2ludGVyZmFjZSBUUHJvdG9jb2wgeworCisgICAgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KCkgOiBUVHJhbnNwb3J0OworCisgICAgLyoqCisgICAgICogV3JpdGluZyBtZXRob2RzLgorICAgICAqLworICAgIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2U6VE1lc3NhZ2UpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Y3Q6VFN0cnVjdCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbihmaWVsZDpURmllbGQpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4obWFwOlRNYXApIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbihsaXN0OlRMaXN0KSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oc2V0OlRTZXQpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZVNldEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUJvb2woYiA6IEJvb2wpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUJ5dGUoYiA6IEludCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlSTE2KGkxNiA6IEludCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlSTMyKGkzMiA6IEludCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlSTY0KGk2NCA6IGhheGUuSW50NjQpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZURvdWJsZShkdWIgOiBGbG9hdCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKHN0ciA6IFN0cmluZykgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlQmluYXJ5KGJpbiA6IEJ5dGVzKSA6IFZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAgICovCisgICAgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigpOlRNZXNzYWdlOworICAgIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigpOlRTdHJ1Y3Q7CisgICAgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigpOlRGaWVsZDsKKyAgICBmdW5jdGlvbiByZWFkRmllbGRFbmQoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCk6VE1hcDsKKyAgICBmdW5jdGlvbiByZWFkTWFwRW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oKTpUTGlzdDsKKyAgICBmdW5jdGlvbiByZWFkTGlzdEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiByZWFkU2V0QmVnaW4oKTpUU2V0OworICAgIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gcmVhZEJvb2woKSA6IEJvb2w7CisgICAgZnVuY3Rpb24gcmVhZEJ5dGUoKSA6IEludDsKKyAgICBmdW5jdGlvbiByZWFkSTE2KCkgOiBJbnQ7CisgICAgZnVuY3Rpb24gcmVhZEkzMigpIDogSW50OworICAgIGZ1bmN0aW9uIHJlYWRJNjQoKSA6IGhheGUuSW50NjQ7CisgICAgZnVuY3Rpb24gcmVhZERvdWJsZSgpIDogRmxvYXQ7CisgICAgZnVuY3Rpb24gcmVhZFN0cmluZygpIDogU3RyaW5nOworICAgIGZ1bmN0aW9uIHJlYWRCaW5hcnkoKSA6IEJ5dGVzOworCisgICAgLy8gcmVjdXJzaW9uIHRyYWNraW5nCisgICAgZnVuY3Rpb24gSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQ7Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjllOTNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oeApAQCAtMCwwICsxLDIyNiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5JbnQ2NDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCisKKy8qKgorICogVFByb3RvY29sRGVjb3JhdG9yIGZvcndhcmRzIGFsbCByZXF1ZXN0cyB0byBhbiBlbmNsb3NlZCBUUHJvdG9jb2wgaW5zdGFuY2UsCisgKiBwcm92aWRpbmcgYSB3YXkgdG8gYXV0aG9yIGNvbmNpc2UgY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuICBXaGlsZSBpdCBoYXMKKyAqIG5vIGFic3RyYWN0IG1ldGhvZHMsIGl0IGlzIG1hcmtlZCBhYnN0cmFjdCBhcyBhIHJlbWluZGVyIHRoYXQgYnkgaXRzZWxmLAorICogaXQgZG9lcyBub3QgbW9kaWZ5IHRoZSBiZWhhdmlvdXIgb2YgdGhlIGVuY2xvc2VkIFRQcm90b2NvbC4KKyAqCisgKiBTZWUgcC4xNzUgb2YgRGVzaWduIFBhdHRlcm5zIChieSBHYW1tYSBldCBhbC4pCisgKiBTZWUgVE11bHRpcGxleGVkUHJvdG9jb2wKKyAqLworY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yIGltcGxlbWVudHMgVFByb3RvY29sCit7CisgICAgcHJpdmF0ZSB2YXIgd3JhcHBlZCA6IFRQcm90b2NvbDsKKworICAgIC8qKgorICAgICAqIEVuY2xvc2VzIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wuCisgICAgICogQHBhcmFtIHByb3RvY29sIEFsbCBvcGVyYXRpb25zIHdpbGwgYmUgZm9yd2FyZCB0byB0aGlzIHByb3RvY29sLiAgTXVzdCBiZSBub24tbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIG5ldyggcHJvdG9jb2wgOiBUUHJvdG9jb2wpICAvLyBub3QgdG8gYmUgaW5zdGFudGlhdGVkLCBtdXN0IGRlcml2ZSBhIGNsYXNzCisgICAgeworICAgICAgICB3cmFwcGVkID0gcHJvdG9jb2w7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydCgpIDogVFRyYW5zcG9ydCB7CisgICAgICByZXR1cm4gd3JhcHBlZC5nZXRUcmFuc3BvcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oIHZhbHVlIDogVE1lc3NhZ2UpIDogVm9pZCAgICB7CisgICAgICAgIHdyYXBwZWQud3JpdGVNZXNzYWdlQmVnaW4oIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbih2YWx1ZSA6IFRTdHJ1Y3QpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVTdHJ1Y3RCZWdpbiggdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKHZhbHVlIDogVEZpZWxkKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlRmllbGRCZWdpbiggdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZUZpZWxkU3RvcCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKCB2YWx1ZSA6IFRNYXApIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVNYXBCZWdpbiggdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVNYXBFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oIHZhbHVlIDogVExpc3QpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVMaXN0QmVnaW4oIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZUxpc3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbiggdmFsdWUgOiBUU2V0KSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlU2V0QmVnaW4oIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlU2V0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCh2YWx1ZSA6IEJvb2wpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVCb29sKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSh2YWx1ZSA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZUJ5dGUoIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYodmFsdWUgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVJMTYoIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIodmFsdWUgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVJMzIoIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQodmFsdWUgOiBoYXhlLkludDY0KSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlSTY0KCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKHZhbHVlIDogRmxvYXQpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVEb3VibGUoIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcodmFsdWUgOiBTdHJpbmcpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVTdHJpbmcoIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCaW5hcnkodmFsdWUgOiBCeXRlcyApIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVCaW5hcnkoIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigpIDogVE1lc3NhZ2UgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC5yZWFkTWVzc2FnZUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oKSA6IFRTdHJ1Y3QgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQucmVhZFN0cnVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigpIDogVEZpZWxkIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZEZpZWxkQmVnaW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC5yZWFkRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCkgOiBUTWFwIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZE1hcEJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBFbmQoKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLnJlYWRNYXBFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigpIDogVExpc3QgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkTGlzdEJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC5yZWFkTGlzdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oKSA6IFRTZXQgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkU2V0QmVnaW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQucmVhZFNldEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgpIDogQm9vbAorICAgIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZEJvb2woKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoKSA6IEludCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRCeXRlKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoKSA6IEludCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRJMTYoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigpIDogSW50IHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZEkzMigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCkgOiBoYXhlLkludDY0IHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZEk2NCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCkgOiBGbG9hdCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWREb3VibGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygpIDogU3RyaW5nIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQmluYXJ5KCkgOiBCeXRlcyB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRCaW5hcnkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpIDogVm9pZCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNiMzdhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaHgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKKworY2xhc3MgVFByb3RvY29sRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7CisKKyAgICAvLyBXQVJOSU5HOiBUaGVzZSBhcmUgc3ViamVjdCB0byBiZSBleHRlbmRlZCBpbiB0aGUgZnV0dXJlLCBzbyB3ZSBjYW4ndCB1c2UgZW51bXMKKyAgICAvLyB3aXRoIEhheGUgMy4xLjMgYmVjYXVzZSBvZiBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9pc3N1ZXMvMzY0OQorICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBVTktOT1dOIDogSW50ID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgSU5WQUxJRF9EQVRBIDogSW50ID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgTkVHQVRJVkVfU0laRSA6IEludCA9IDI7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFNJWkVfTElNSVQgOiBJbnQgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBCQURfVkVSU0lPTiA6IEludCA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE5PVF9JTVBMRU1FTlRFRCA6IEludCA9IDU7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIERFUFRIX0xJTUlUIDogSW50ID0gNjsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoZXJyb3IgOiBJbnQgPSBVTktOT1dOLCBtZXNzYWdlIDogU3RyaW5nID0gIiIpIHsKKyAgICAgIHN1cGVyKG1lc3NhZ2UsIGVycm9yKTsKKyAgICB9CisKKworfSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMmQ2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5oeApAQCAtMCwwICsxLDI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworaW50ZXJmYWNlIFRQcm90b2NvbEZhY3RvcnkgeworICAgICBmdW5jdGlvbiBnZXRQcm90b2NvbCh0cmFuczpUVHJhbnNwb3J0KTpUUHJvdG9jb2w7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDFlNDA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuaHgKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CisKKyAgLyoqCisgICAqIFV0aWxpdHkgY2xhc3Mgd2l0aCBzdGF0aWMgbWV0aG9kcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBwcm90b2NvbCBkYXRhCisgICAqIHN0cmVhbXMuCisgICAqCisgICAqLworY2xhc3MgVFByb3RvY29sVXRpbCB7CisKKyAgICAvKioKKyAgICAgKiBTa2lwcyBvdmVyIHRoZSBuZXh0IGRhdGEgZWxlbWVudCBmcm9tIHRoZSBwcm92aWRlZCBpbnB1dCBUUHJvdG9jb2wgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHByb3QgIHRoZSBwcm90b2NvbCBvYmplY3QgdG8gcmVhZCBmcm9tCisgICAgICogQHBhcmFtIHR5cGUgIHRoZSBuZXh0IHZhbHVlIHdpbGwgYmUgaW50ZXByZXRlZCBhcyB0aGlzIFRUeXBlIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2tpcChwcm90OlRQcm90b2NvbCwgdHlwZSA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5CT09MOgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRCb29sKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkJZVEU6CisgICAgICAgICAgICAgICAgICAgIHByb3QucmVhZEJ5dGUoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRJMTYoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRJMzIoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTY0OgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRJNjQoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuRE9VQkxFOgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWREb3VibGUoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU1RSSU5HOgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRCaW5hcnkoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU1RSVUNUOgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkOlRGaWVsZCA9IHByb3QucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwKHByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTUFQOgorICAgICAgICAgICAgICAgICAgICB2YXIgbWFwOlRNYXAgPSBwcm90LnJlYWRNYXBCZWdpbigpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gMCAuLi4gbWFwLnNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAocHJvdCwgbWFwLmtleVR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcChwcm90LCBtYXAudmFsdWVUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRNYXBFbmQoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU0VUOgorICAgICAgICAgICAgICAgICAgICB2YXIgc2V0OlRTZXQgPSBwcm90LnJlYWRTZXRCZWdpbigpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGogaW4gMCAuLi4gc2V0LnNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAocHJvdCwgc2V0LmVsZW1UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRTZXRFbmQoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTElTVDoKKyAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3Q6VExpc3QgPSBwcm90LnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrIGluIDAgLi4uIGxpc3Quc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcChwcm90LCBsaXN0LmVsZW1UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRMaXN0RW5kKCk7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorCQkJCQl0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5VTktOT1dOLCAiVW5rbm93biBmaWVsZCB0eXBlICR7dHlwZX0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKGU6RHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RSZWN1cnNpb25UcmFja2VyLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RSZWN1cnNpb25UcmFja2VyLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMDIxMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFJlY3Vyc2lvblRyYWNrZXIuaHgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKKworCitjbGFzcyBUUmVjdXJzaW9uVHJhY2tlciB7CisKKyAgICAvLyBkZWZhdWx0CisgICAgcHJpdmF0ZSBzdGF0aWMgaW5saW5lIHZhciBERUZBVUxUX1JFQ1VSU0lPTl9ERVBUSCA6IEludCA9IDY0OworCisgICAgLy8gbGltaXQgYW5kIGFjdHVhbCB2YWx1ZQorICAgIHB1YmxpYyB2YXIgcmVjdXJzaW9uTGltaXQgOiBJbnQgPSBERUZBVUxUX1JFQ1VSU0lPTl9ERVBUSDsKKyAgICBwcml2YXRlIHZhciByZWN1cnNpb25EZXB0aCA6IEludCA9IDA7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQKKyAgICB7CisgICAgICAgIGlmIChyZWN1cnNpb25EZXB0aCA8IHJlY3Vyc2lvbkxpbWl0KQorICAgICAgICAgICAgKytyZWN1cnNpb25EZXB0aDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uREVQVEhfTElNSVQsICJEZXB0aCBsaW1pdCBleGNlZWRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpIDogVm9pZAorICAgIHsKKyAgICAgICAgLS1yZWN1cnNpb25EZXB0aDsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTZXQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFNldC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGVhYjM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTZXQuaHgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitjbGFzcyBUU2V0IHsKKworICAgIHB1YmxpYyB2YXIgZWxlbVR5cGUgOiBJbnQ7CisgICAgcHVibGljIHZhciBzaXplIDogSW50OworCisgICAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KHQgOiBJbnQgPSAwLCBzIDogSW50ID0gMCkgeworICAgICAgICBlbGVtVHlwZSA9IHQ7CisgICAgICAgIHNpemUgPSBzOworICAgICAgfQorCit9ICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU3RydWN0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTdHJ1Y3QuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUwYjdkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU3RydWN0Lmh4CkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworY2xhc3MgVFN0cnVjdCB7CisKKyAgICBwdWJsaWMgdmFyIG5hbWUgOiBTdHJpbmc7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KG4gOiBTdHJpbmcgPSAiIikgeworICAgICAgbmFtZSA9IG47CisgICAgfQorCit9ICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFR5cGUuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFR5cGUuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFiYmM5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UVHlwZS5oeApAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK0A6ZW51bQorYWJzdHJhY3QgVFR5cGUoSW50KSAgZnJvbSBJbnQgdG8gSW50ICB7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFNUT1AgOiBJbnQgICA9IDA7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFZPSUQgOiBJbnQgICA9IDE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEJPT0wgOiBJbnQgICA9IDI7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEJZVEUgOiBJbnQgICA9IDM7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIERPVUJMRSA6IEludCA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEkxNiA6IEludCAgICA9IDY7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEkzMiA6IEludCAgICA9IDg7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEk2NCA6IEludCAgICA9IDEwOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBTVFJJTkcgOiBJbnQgPSAxMTsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgU1RSVUNUIDogSW50ID0gMTI7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE1BUCA6IEludCAgICA9IDEzOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBTRVQgOiBJbnQgICAgPSAxNDsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgTElTVCA6IEludCAgID0gMTU7Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZlZWUwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5oeApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworY2xhc3MgVFNlcnZlcgoreworICAgIHByaXZhdGUgdmFyIHByb2Nlc3NvciA6IFRQcm9jZXNzb3IgPSBudWxsOworICAgIHByaXZhdGUgdmFyIHNlcnZlclRyYW5zcG9ydCA6IFRTZXJ2ZXJUcmFuc3BvcnQgPSBudWxsOworICAgIHByaXZhdGUgdmFyIGlucHV0VHJhbnNwb3J0RmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5ID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5IDogVFRyYW5zcG9ydEZhY3RvcnkgPSBudWxsOworICAgIHByaXZhdGUgdmFyIGlucHV0UHJvdG9jb2xGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeSA9IG51bGw7CisgICAgcHJpdmF0ZSB2YXIgb3V0cHV0UHJvdG9jb2xGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeSA9IG51bGw7CisKKyAgICAvLyBzZXJ2ZXIgZXZlbnRzCisgICAgcHVibGljIHZhciBzZXJ2ZXJFdmVudEhhbmRsZXIgOiBUU2VydmVyRXZlbnRIYW5kbGVyID0gbnVsbDsKKworICAgIC8vIExvZyBkZWxlZ2F0aW9uCisgICAgcHJpdmF0ZSB2YXIgX2xvZ0RlbGVnYXRlIDogRHluYW1pYy0+Vm9pZCAgPSBudWxsOworICAgIHB1YmxpYyB2YXIgbG9nRGVsZWdhdGUoZ2V0LHNldCkgOiBEeW5hbWljLT5Wb2lkOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggcHJvY2Vzc29yIDogVFByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQgOiBUU2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5ID0gbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5IDogVFRyYW5zcG9ydEZhY3RvcnkgPSBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeSA9IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeSA9IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUgOiBEeW5hbWljLT5Wb2lkID0gbnVsbCkKKyAgICB7CisgICAgICB0aGlzLnByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgICAgIHRoaXMuc2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0OworICAgICAgdGhpcy5pbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICB0aGlzLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgdGhpcy5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgdGhpcy5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICB0aGlzLmxvZ0RlbGVnYXRlID0gbG9nRGVsZWdhdGU7CisKKyAgICAgIEFwcGx5TWlzc2luZ0RlZmF1bHRzKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBBcHBseU1pc3NpbmdEZWZhdWx0cygpIHsKKyAgICAgICAgaWYoIHByb2Nlc3NvciA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgIkludmFsaWQgc2VydmVyIGNvbmZpZ3VyYXRpb246IHByb2Nlc3NvciBtaXNzaW5nIjsKKyAgICAgICAgaWYoIHNlcnZlclRyYW5zcG9ydCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgIkludmFsaWQgc2VydmVyIGNvbmZpZ3VyYXRpb246IHNlcnZlclRyYW5zcG9ydCBtaXNzaW5nIjsKKyAgICAgICAgaWYoIGlucHV0VHJhbnNwb3J0RmFjdG9yeSA9PSBudWxsKQorICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCk7CisgICAgICAgIGlmKCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5ICA9PSBudWxsKQorICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpOworICAgICAgICBpZiggaW5wdXRQcm90b2NvbEZhY3RvcnkgID09IG51bGwpCisgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCk7CisgICAgICAgIGlmKCBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPT0gbnVsbCkKKyAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeT0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKTsKKyAgICAgICAgaWYoIGxvZ0RlbGVnYXRlID09IG51bGwpCisgICAgICAgICAgICBsb2dEZWxlZ2F0ZSA9IERlZmF1bHRMb2dEZWxlZ2F0ZTsKKyAgICB9CisKKworICAgIHByaXZhdGUgZnVuY3Rpb24gc2V0X2xvZ0RlbGVnYXRlKHZhbHVlIDogRHluYW1pYy0+Vm9pZCkgOiBEeW5hbWljLT5Wb2lkIHsKKyAgICAgICAgaWYodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgX2xvZ0RlbGVnYXRlID0gdmFsdWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfbG9nRGVsZWdhdGUgPSBEZWZhdWx0TG9nRGVsZWdhdGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9sb2dEZWxlZ2F0ZTsKKyAgICB9CisKKworICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0X2xvZ0RlbGVnYXRlKCkgOiBEeW5hbWljLT5Wb2lkIHsKKyAgICAgICAgcmV0dXJuIF9sb2dEZWxlZ2F0ZTsKKyAgICB9CisKKworICAgIHByaXZhdGUgZnVuY3Rpb24gRGVmYXVsdExvZ0RlbGVnYXRlKHZhbHVlIDogRHluYW1pYykgOiBWb2lkICB7CisgICAgICAgIHRyYWNlKCB2YWx1ZSk7CisgICAgfQorCisKKworICAgIHB1YmxpYyBmdW5jdGlvbiBTZXJ2ZSgpIDogVm9pZCB7CisgICAgICAgIHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gU3RvcCgpIDogVm9pZCB7CisgICAgICAgIHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7CisgICAgfQorCit9CisgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYzk5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuaHgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKKworCisvLyBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgc2VydmVyIHVzZXJzIHRvIGhhbmRsZSBldmVudHMgZnJvbSB0aGUgc2VydmVyCitpbnRlcmZhY2UgVFNlcnZlckV2ZW50SGFuZGxlciB7CisKKyAgICAvLyBDYWxsZWQgYmVmb3JlIHRoZSBzZXJ2ZXIgYmVnaW5zCisgICAgZnVuY3Rpb24gcHJlU2VydmUoKSA6IFZvaWQ7CisKKyAgICAvLyBDYWxsZWQgd2hlbiBhIG5ldyBjbGllbnQgaGFzIGNvbm5lY3RlZCBhbmQgaXMgYWJvdXQgdG8gYmVpbmcgcHJvY2Vzc2luZworICAgIGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoIGlucHV0IDogVFByb3RvY29sLCBvdXRwdXQgOiBUUHJvdG9jb2wpIDogRHluYW1pYzsKKworICAgIC8vIENhbGxlZCB3aGVuIGEgY2xpZW50IGhhcyBmaW5pc2hlZCByZXF1ZXN0LWhhbmRsaW5nIHRvIGRlbGV0ZSBzZXJ2ZXIgY29udGV4dAorICAgIGZ1bmN0aW9uIGRlbGV0ZUNvbnRleHQoIHNlcnZlckNvbnRleHQgOiBEeW5hbWljLCBpbnB1dCA6IFRQcm90b2NvbCwgb3V0cHV0IDogVFByb3RvY29sKSA6IFZvaWQ7CisKKyAgICAvLyBDYWxsZWQgd2hlbiBhIGNsaWVudCBpcyBhYm91dCB0byBjYWxsIHRoZSBwcm9jZXNzb3IKKyAgICBmdW5jdGlvbiBwcm9jZXNzQ29udGV4dCggc2VydmVyQ29udGV4dCA6IER5bmFtaWMsIHRyYW5zcG9ydCA6IFRUcmFuc3BvcnQpIDogVm9pZDsKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjAwNzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmh4CkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qOworCisvLyBTaW1wbGUgc2luZ2xlLXRocmVhZGVkIHNlcnZlciBmb3IgdGVzdGluZworY2xhc3MgVFNpbXBsZVNlcnZlciBleHRlbmRzIFRTZXJ2ZXIgIHsKKworICAgIHByaXZhdGUgdmFyIHN0b3AgOiBCb29sID0gZmFsc2U7CisKKyAgICAvL3N0b3BzIGp1c3QgYWZ0ZXIgaW5wdXQgdHJhbnNwb3J0IHJldHVybnMgRU9GCisgICAgLy91c2VmdWwgZm9yIGxpbWl0ZWQgc2NlbmFyaW9zLCBsaWtlIGVtYmVkaW5nIGludG8gcGhwIHNlcnZlcgorICAgIHB1YmxpYyB2YXIgcnVuT25jZSA6IEJvb2wgPSBmYWxzZTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHByb2Nlc3NvciA6IFRQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5IDogVFRyYW5zcG9ydEZhY3RvcnkgPSBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkgPSBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlciA6IER5bmFtaWMtPlZvaWQgPSBudWxsKSB7CisgICAgICBzdXBlciggcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBsb2dnZXIpOworICAgIH0KKworCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIFNlcnZlKCkgOiBWb2lkCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoICh0dHggOiBUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBsb2dEZWxlZ2F0ZSh0dHgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmlyZSB0aGUgcHJlU2VydmUgc2VydmVyIGV2ZW50IHdoZW4gc2VydmVyIGlzIHVwLAorICAgICAgICAvLyBidXQgYmVmb3JlIGFueSBjbGllbnQgY29ubmVjdGlvbnMKKyAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJlU2VydmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlKCAhIHN0b3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjbGllbnQgOiBUVHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgIHZhciBpbnB1dFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgdmFyIG91dHB1dFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgdmFyIGlucHV0UHJvdG9jb2wgOiBUUHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgdmFyIG91dHB1dFByb3RvY29sIDogVFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgIHZhciBjb25uZWN0aW9uQ29udGV4dCA6IER5bmFtaWMgPSBudWxsOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpOworICAgICAgICAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoIGNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KCBjbGllbnQpOworICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woIGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woIG91dHB1dFRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVjb3ZlciBldmVudCBoYW5kbGVyIChpZiBhbnkpIGFuZCBmaXJlIGNyZWF0ZUNvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VydmVyIGV2ZW50IHdoZW4gYSBjbGllbnQgY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCA9IHNlcnZlckV2ZW50SGFuZGxlci5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgY2xpZW50IHJlcXVlc3RzIHVudGlsIGNsaWVudCBkaXNjb25uZWN0cworICAgICAgICAgICAgICAgICAgICB3aGlsZSggdHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyZSBwcm9jZXNzQ29udGV4dCBzZXJ2ZXIgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE4uQi4gVGhpcyBpcyB0aGUgcGF0dGVybiBpbXBsZW1lbnRlZCBpbiBDKysgYW5kIHRoZSBldmVudCBmaXJlcyBwcm92aXNpb25hbGx5LgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhhdCBpcyB0byBzYXkgaXQgbWF5IGJlIG1hbnkgbWludXRlcyBiZXR3ZWVuIHRoZSBldmVudCBmaXJpbmcgYW5kIHRoZSBjbGllbnQgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWN0dWFsbHkgYXJyaXZpbmcgb3IgdGhlIGNsaWVudCBtYXkgaGFuZyB1cCB3aXRob3V0IGV2ZXIgbWFrZWluZyBhIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy9Qcm9jZXNzIGNsaWVudCByZXF1ZXN0IChibG9ja3MgdW50aWwgdHJhbnNwb3J0IGlzIHJlYWRhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgcHJvY2Vzc29yLnByb2Nlc3MoIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIHR0eCA6IFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gVXN1YWxseSBhIGNsaWVudCBkaXNjb25uZWN0LCBleHBlY3RlZAorICAgICAgICAgICAgICAgIGlmKHJ1bk9uY2UgJiYgdHR4LmVycm9ySUQgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSkgeworICAgICAgICAgICAgICAgICAgLy9pbnB1dCByZXR1cm5zIGVvZiwgZXhpdAorICAgICAgICAgICAgICAgICAgLy9mb2xsb3dzIGxpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5jcHAKKyAgICAgICAgICAgICAgICAgIFN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggcGV4IDogVFByb3RvY29sRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKCckcGV4ICR7cGV4LmVycm9ySUR9ICR7cGV4LmVycm9yTXNnfScpOyAvLyBVbmV4cGVjdGVkCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggZSA6IER5bmFtaWMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoZSk7IC8vIFVuZXhwZWN0ZWQKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoY2xpZW50ICE9IG51bGwgJiYgIXJ1bk9uY2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZpcmUgZGVsZXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgYWZ0ZXIgY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIFN0b3AoKSA6IFZvaWQKKyAgICB7CisgICAgICBzdG9wID0gdHJ1ZTsKKyAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIzM2ZjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0Lmh4CkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CisKK2ltcG9ydCBoYXhlLmlvLkVvZjsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuaW8uQnl0ZXNCdWZmZXI7CitpbXBvcnQgaGF4ZS5pby5CeXRlc091dHB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzSW5wdXQ7CisKKworY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIC8vIGNvbnN0YW50cworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBERUZBVUxUX0JVRlNJWkUgOiBJbnQgPSAweDEwMDA7ICAgIC8vIDQwOTYgQnl0ZXMKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgTUlOX0JVRlNJWkUgOiBJbnQgPSAweDEwMDsgICAgICAgICAvLyAyNTYgQnl0ZXMKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgTUFYX0JVRlNJWkUgOiBJbnQgPSAweDEwMDAwMDsgICAgICAvLyAxIE1CCisKKyAgICAvLyBVbmRlcmx5aW5nIHRyYW5zcG9ydAorICAgIHB1YmxpYyB2YXIgdHJhbnNwb3J0KGRlZmF1bHQsbnVsbCkgOiAgVFRyYW5zcG9ydCA9IG51bGw7CisKKyAgICAvLyBCdWZmZXIgZm9yIGlucHV0L291dHB1dAorICAgIHByaXZhdGUgdmFyIHJlYWRCdWZmZXJfIDogQnl0ZXNJbnB1dCA9IG51bGw7CisgICAgcHJpdmF0ZSB2YXIgd3JpdGVCdWZmZXJfIDogQnl0ZXNPdXRwdXQgPSBudWxsOworICAgIHByaXZhdGUgdmFyIGJ1ZlNpemUgOiBJbnQ7CisKKyAgICAvLyBDb25zdHJ1Y3RvciB3cmFwcyBhcm91bmQgYW5vdGhlciB0cmFuc3BvcnQKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCB0cmFuc3BvcnQgOiBUVHJhbnNwb3J0LCBidWZTaXplIDogSW50ID0gREVGQVVMVF9CVUZTSVpFKSB7CisKKyAgICAgICAgLy8gZW5zdXJlIGJ1ZmZlciBzaXplIGlzIGluIHRoZSByYW5nZQorICAgICAgICBpZiAoIGJ1ZlNpemUgPCBNSU5fQlVGU0laRSkKKyAgICAgICAgICAgIGJ1ZlNpemUgPSBNSU5fQlVGU0laRTsKKyAgICAgICAgZWxzZSBpZiggYnVmU2l6ZSA+IE1BWF9CVUZTSVpFKQorICAgICAgICAgICAgYnVmU2l6ZSA9IE1BWF9CVUZTSVpFOworCisgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgICAgICB0aGlzLmJ1ZlNpemUgPSBidWZTaXplOworICAgICAgICB0aGlzLndyaXRlQnVmZmVyXyA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICB0aGlzLndyaXRlQnVmZmVyXy5iaWdFbmRpYW4gPSB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBvcGVuKCkgOiBWb2lkIHsKKyAgICAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gaXNPcGVuKCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zcG9ydC5pc09wZW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gY2xvc2UoKSA6IFZvaWQgeworICAgICAgICB0cmFuc3BvcnQuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gcmVhZChidWYgOiBCeXRlc0J1ZmZlciwgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogSW50IHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciBkYXRhID0gQnl0ZXMuYWxsb2MobGVuKTsKKworICAgICAgICAgICAgd2hpbGUoIHRydWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHJlYWRCdWZmZXJfICE9IG51bGwpICYmIChyZWFkQnVmZmVyXy5wb3NpdGlvbiA8IHJlYWRCdWZmZXJfLmxlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGdvdCA9IHJlYWRCdWZmZXJfLnJlYWRCeXRlcyhkYXRhLCAwLCBsZW4pOworICAgICAgICAgICAgICAgICAgICBpZiAoZ290ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFkZEJ5dGVzKGRhdGEsIDAsIGdvdCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ290OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gcG9pbnQgaW4gYnVmZmVyaW5nIHdoZW5ldmVyIHRoZQorICAgICAgICAgICAgICAgIC8vIHJlbWFpbmluZyBsZW5ndGggZXhjZWVkcyB0aGUgYnVmZmVyIHNpemUKKyAgICAgICAgICAgICAgICBpZiAoIGxlbiA+PSBidWZTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIHZhciBnb3QgPSB0cmFuc3BvcnQucmVhZCggYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChnb3QgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuYWRkQnl0ZXMoZGF0YSwgMCwgZ290KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnb3Q7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBmaWxsIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICBpZiAoIHJlYWRDaHVuaygpIDw9IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLCAnQ2FuXCd0IHJlYWQgJGxlbiBieXRlcyEnKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZW9mIDogRW9mKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLCAnQ2FuXCd0IHJlYWQgJGxlbiBieXRlcyEnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIHJlYWRDaHVuaygpIDogSW50IHsKKyAgICAgICAgdmFyIHNpemUgPSBidWZTaXplOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICAgICAgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkKCBidWZmZXIsIDAsIHNpemUpOworICAgICAgICAgICAgcmVhZEJ1ZmZlcl8gPSBuZXcgQnl0ZXNJbnB1dCggYnVmZmVyLmdldEJ5dGVzKCksIDAsIHNpemUpOworICAgICAgICAgICAgcmVhZEJ1ZmZlcl8uYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICB9CisgICAgICAgIGNhdGNoKGVvZiA6IEVvZikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgJ0NhblwndCByZWFkICRzaXplIGJ5dGVzIScpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUNodW5rKGZvcmNlV3JpdGUgOiBCb29sKSA6IFZvaWQgeworICAgICAgICBpZiggd3JpdGVCdWZmZXJfLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGlmICggZm9yY2VXcml0ZSB8fCAod3JpdGVCdWZmZXJfLmxlbmd0aCA+PSBidWZTaXplKSkgeworICAgICAgICAgICAgICAgIHZhciBidWYgPSB3cml0ZUJ1ZmZlcl8uZ2V0Qnl0ZXMoKTsKKyAgICAgICAgICAgICAgICB3cml0ZUJ1ZmZlcl8gPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKyAgICAgICAgICAgICAgICB3cml0ZUJ1ZmZlcl8uYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQud3JpdGUoYnVmLCAwLCBidWYubGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiB3cml0ZShidWYgOiBCeXRlcywgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHZhciBoYWxmU2l6ZSA6IEludCA9IFN0ZC5pbnQoYnVmU2l6ZSAvIDIpOworCisgICAgICAgIC8vIE5vIHBvaW50IGluIGJ1ZmZlcmluZyBpZiBsZW4gZXhjZWVkcyB0aGUgYnVmZmVyIHNpemUuCisgICAgICAgIC8vIEhvd2V2ZXIsIGlmIHRoZSBidWZmZXIgaXMgbGVzcyB0aGFuIGhhbGYgZnVsbCB3ZSBzaG91bGQgc3RpbGwgY29uc2lkZXIKKyAgICAgICAgLy8gc3F1YXNoaW5nIGFsbCBpbnRvIG9uZSB3cml0ZSwgZXhjZXB0IHdoZW4gdGhlIGFjdHVhbCB3cml0ZSBsZW4gaXMgdmVyeSBsYXJnZS4KKyAgICAgICAgdmFyIGh1Z2Vfd3JpdGUgOiBCb29sID0gKGxlbiA+PSAoMiAqIGJ1ZlNpemUpKTsKKyAgICAgICAgdmFyIGV4Y2VlZHNfYnVmIDogQm9vbCA9IGh1Z2Vfd3JpdGUgfHwgKGxlbiA+PSBidWZTaXplKTsKKyAgICAgICAgdmFyIHdyaXRlX3RocnUgOiBCb29sID0gZXhjZWVkc19idWYgJiYgKHdyaXRlQnVmZmVyXy5sZW5ndGggPj0gaGFsZlNpemUpOworICAgICAgICBpZiAoIHdyaXRlX3RocnUpIHsKKyAgICAgICAgICAgIHdyaXRlQ2h1bmsodHJ1ZSk7IC8vIGZvcmNlIHNlbmQgd2hhdGV2ZXIgd2UgaGF2ZSBpbiB0aGVyZQorICAgICAgICAgICAgdHJhbnNwb3J0LndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOyAgLy8gd3JpdGUgdGhydQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGVCdWZmZXJfLndyaXRlQnl0ZXMoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICB3cml0ZUNodW5rKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBmbHVzaCggY2FsbGJhY2sgOiBEeW5hbWljLT5Wb2lkID1udWxsKSA6IFZvaWQgeworICAgICAgICB3cml0ZUNodW5rKHRydWUpOworICAgICAgICB0cmFuc3BvcnQuZmx1c2goY2FsbGJhY2spOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzllNzIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Lmh4CkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKKworCitjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5IGV4dGVuZHMgVFRyYW5zcG9ydEZhY3RvcnkgeworCisgICAgcHJpdmF0ZSB2YXIgYnVmU2l6ZSA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoYnVmU2l6ZSA6IEludCA9IFRCdWZmZXJlZFRyYW5zcG9ydC5ERUZBVUxUX0JVRlNJWkUpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5idWZTaXplID0gYnVmU2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KGJhc2UgOiBUVHJhbnNwb3J0KSA6IFRUcmFuc3BvcnQgeworICAgICAgICByZXR1cm4gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydChiYXNlLCBidWZTaXplKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGaWxlU3RyZWFtLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVN0cmVhbS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDhhZDE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVN0cmVhbS5oeApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmlvLklucHV0OworaW1wb3J0IGhheGUuaW8uT3V0cHV0OworCisKK2VudW0gVEZpbGVNb2RlIHsKKyAgICBDcmVhdGVOZXc7CisgICAgQXBwZW5kOworICAgIFJlYWQ7Cit9CisKKworY2xhc3MgVEZpbGVTdHJlYW0gaW1wbGVtZW50cyBUU3RyZWFtIHsKKworICAgIHB1YmxpYyB2YXIgRmlsZU5hbWUoZGVmYXVsdCxudWxsKSA6IFN0cmluZzsKKworICAgIHByaXZhdGUgdmFyIElucHV0ICA6IHN5cy5pby5GaWxlSW5wdXQ7CisgICAgcHJpdmF0ZSB2YXIgT3V0cHV0IDogc3lzLmlvLkZpbGVPdXRwdXQ7CisKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIGZuYW1lIDogU3RyaW5nLCBtb2RlIDogVEZpbGVNb2RlKSB7CisgICAgICAgIEZpbGVOYW1lID0gZm5hbWU7CisgICAgICAgIHN3aXRjaCAoIG1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgVEZpbGVNb2RlLkNyZWF0ZU5ldzoKKyAgICAgICAgICAgICAgICBPdXRwdXQgPSBzeXMuaW8uRmlsZS53cml0ZSggZm5hbWUsIHRydWUpOworCisgICAgICAgICAgICBjYXNlIFRGaWxlTW9kZS5BcHBlbmQ6CisgICAgICAgICAgICAgICAgT3V0cHV0ID0gc3lzLmlvLkZpbGUuYXBwZW5kKCBmbmFtZSwgdHJ1ZSk7CisKKyAgICAgICAgICAgIGNhc2UgVEZpbGVNb2RlLlJlYWQ6CisgICAgICAgICAgICAgICAgSW5wdXQgPSBzeXMuaW8uRmlsZS5yZWFkKCBmbmFtZSwgdHJ1ZSk7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIG1vZGUiKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIENsb3NlKCkgOiBWb2lkIHsKKyAgICAgICAgaWYoIElucHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIElucHV0LmNsb3NlKCk7CisgICAgICAgICAgICBJbnB1dCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYoIE91dHB1dCAhPSBudWxsKSB7CisgICAgICAgICAgICBPdXRwdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIE91dHB1dCA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gUGVlaygpIDogQm9vbCB7CisgICAgICAgIGlmKCBJbnB1dCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJGaWxlIG5vdCBvcGVuIGZvciBpbnB1dCIpOworCisgICAgICAgIHJldHVybiAoISBJbnB1dC5lb2YoKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIFJlYWQoIGJ1ZiA6IEJ5dGVzLCBvZmZzZXQgOiBJbnQsIGNvdW50IDogSW50KSA6IEludCB7CisgICAgICAgIGlmKCBJbnB1dCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJGaWxlIG5vdCBvcGVuIGZvciBpbnB1dCIpOworCisgICAgICAgIHJldHVybiBJbnB1dC5yZWFkQnl0ZXMoIGJ1Ziwgb2Zmc2V0LCBjb3VudCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIFdyaXRlKCBidWYgOiBCeXRlcywgb2Zmc2V0IDogSW50LCBjb3VudCA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgaWYoIE91dHB1dCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJGaWxlIG5vdCBvcGVuIGZvciBvdXRwdXQiKTsKKworICAgICAgICBPdXRwdXQud3JpdGVCeXRlcyggYnVmLCBvZmZzZXQsIGNvdW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gRmx1c2goKSA6IFZvaWQgeworICAgICAgICBpZiggT3V0cHV0ICE9IG51bGwpCisgICAgICAgICAgICBPdXRwdXQuZmx1c2goKTsKKyAgICB9CisKK30KKyAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VmODJlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5oeApAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworCitpbXBvcnQgaGF4ZS5pby5Fb2Y7CitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworaW1wb3J0IGhheGUuaW8uQnl0ZXNPdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0lucHV0OworCisKKy8qKgorICogVEZyYW1lZFRyYW5zcG9ydCBpcyBhIGJ1ZmZlcmVkIFRUcmFuc3BvcnQgdGhhdCBlbnN1cmVzIGEgZnVsbHkgcmVhZCBtZXNzYWdlCisgKiBldmVyeSB0aW1lIGJ5IHByZWNlZGluZyBtZXNzYWdlcyB3aXRoIGEgNC1ieXRlIGZyYW1lIHNpemUuCisgKi8KK2NsYXNzIFRGcmFtZWRUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0Cit7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIERFRkFVTFRfTUFYX0xFTkdUSCA9IDE2Mzg0MDAwOworCisgICAgdmFyIG1heExlbmd0aF8gOiAgSW50OworCisgICAgLyoqCisgICAgICogVW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAgKi8KKyAgICB2YXIgdHJhbnNwb3J0XyA6ICBUVHJhbnNwb3J0ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBmb3Igb3V0cHV0CisgICAgICovCisgICAgdmFyIHdyaXRlQnVmZmVyXyA6IEJ5dGVzT3V0cHV0ID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgZm9yIGlucHV0CisgICAgICovCisgICAgdmFyIHJlYWRCdWZmZXJfIDogQnl0ZXNJbnB1dCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB3cmFwcyBhcm91bmQgYW5vdGhlciB0cmFuc3BvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCB0cmFuc3BvcnQgOiBUVHJhbnNwb3J0LCBtYXhMZW5ndGggOiBJbnQgPSBERUZBVUxUX01BWF9MRU5HVEgpIHsKKyAgICAgICAgdHJhbnNwb3J0XyA9IHRyYW5zcG9ydDsKKyAgICAgICAgbWF4TGVuZ3RoXyA9IG1heExlbmd0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gb3BlbigpIDogVm9pZCB7CisgICAgICAgIHRyYW5zcG9ydF8ub3BlbigpOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBpc09wZW4oKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gdHJhbnNwb3J0Xy5pc09wZW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gY2xvc2UoKSA6IFZvaWQgeworICAgICAgICB0cmFuc3BvcnRfLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlYWQoYnVmIDogQnl0ZXNCdWZmZXIsIG9mZiA6IEludCwgbGVuIDogSW50KSA6IEludCB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgZGF0YSA9IEJ5dGVzLmFsbG9jKGxlbik7CisKKyAgICAgICAgICAgIGlmICgocmVhZEJ1ZmZlcl8gIT0gbnVsbCkgJiYgKHJlYWRCdWZmZXJfLnBvc2l0aW9uIDwgcmVhZEJ1ZmZlcl8ubGVuZ3RoKSkgeworICAgICAgICAgICAgICAgIHZhciBnb3QgOiBJbnQgPSByZWFkQnVmZmVyXy5yZWFkQnl0ZXMoZGF0YSwgb2ZmLCBsZW4pOworICAgICAgICAgICAgICAgIGlmIChnb3QgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hZGRCeXRlcyhkYXRhLDAsZ290KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdvdDsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgLy8gUmVhZCBhbm90aGVyIGZyYW1lIG9mIGRhdGEKKyAgICAgICAgICAgIHJlYWRGcmFtZSgpOworCisgICAgICAgICAgICB2YXIgZ290ID0gcmVhZEJ1ZmZlcl8ucmVhZEJ5dGVzKGRhdGEsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIGJ1Zi5hZGRCeXRlcyhkYXRhLDAsZ290KTsKKyAgICAgICAgICAgIHJldHVybiBnb3Q7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGVvZiA6IEVvZikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgJ0NhblwndCByZWFkICRsZW4gYnl0ZXMhJyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIGZ1bmN0aW9uIHJlYWRGcmFtZVNpemUoKSA6IEludCB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICB2YXIgbGVuID0gdHJhbnNwb3J0Xy5yZWFkQWxsKCBidWZmZXIsIDAsIDQpOworICAgICAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgNCk7CisgICAgICAgICAgICBpbnAuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBpbnAucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goZW9mIDogRW9mKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLCAnQ2FuXCd0IHJlYWQgNCBieXRlcyEnKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgZnVuY3Rpb24gcmVhZEZyYW1lKCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIHNpemUgOiBJbnQgPSByZWFkRnJhbWVTaXplKCk7CisKKyAgICAgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICdSZWFkIGEgbmVnYXRpdmUgZnJhbWUgc2l6ZSAoJHNpemUpIScpOworICAgICAgICB9OworICAgICAgICBpZiAoc2l6ZSA+IG1heExlbmd0aF8pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgJ0ZyYW1lIHNpemUgKCRzaXplKSBsYXJnZXIgdGhhbiBtYXggbGVuZ3RoICgkbWF4TGVuZ3RoXykhJyk7CisgICAgICAgIH07CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciBidWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIHNpemUgPSB0cmFuc3BvcnRfLnJlYWRBbGwoIGJ1ZmZlciwgMCwgc2l6ZSk7CisgICAgICAgICAgICByZWFkQnVmZmVyXyA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgc2l6ZSk7CisgICAgICAgICAgICByZWFkQnVmZmVyXy5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGNhdGNoKGVvZiA6IEVvZikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgJ0NhblwndCByZWFkICRzaXplIGJ5dGVzIScpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHdyaXRlKGJ1ZiA6IEJ5dGVzLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgd3JpdGVCdWZmZXJfLndyaXRlQnl0ZXMoYnVmLCBvZmYsIGxlbik7CisgICAgfQorCisgICAgZnVuY3Rpb24gd3JpdGVGcmFtZVNpemUobGVuIDogSW50KSA6IFZvaWQgeworICAgICAgICB2YXIgb3V0ID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisgICAgICAgIG91dC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICBvdXQud3JpdGVJbnQzMihsZW4pOworICAgICAgICB0cmFuc3BvcnRfLndyaXRlKG91dC5nZXRCeXRlcygpLCAwLCA0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZmx1c2goIGNhbGxiYWNrIDogRHluYW1pYy0+Vm9pZCA9bnVsbCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGJ1ZiA6IEJ5dGVzID0gd3JpdGVCdWZmZXJfLmdldEJ5dGVzKCk7CisgICAgICAgIHZhciBsZW4gOiBJbnQgPSBidWYubGVuZ3RoOworICAgICAgICB3cml0ZUJ1ZmZlcl8gPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKworICAgICAgICB3cml0ZUZyYW1lU2l6ZShsZW4pOworICAgICAgICB0cmFuc3BvcnRfLndyaXRlKGJ1ZiwgMCwgbGVuKTsKKyAgICAgICAgdHJhbnNwb3J0Xy5mbHVzaChjYWxsYmFjayk7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNDVhNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Lmh4CkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKKworCitjbGFzcyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSBleHRlbmRzIFRUcmFuc3BvcnRGYWN0b3J5IHsKKworICAgIHZhciBtYXhMZW5ndGhfIDogSW50OworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhtYXhMZW5ndGggOiBJbnQgPSBURnJhbWVkVHJhbnNwb3J0LkRFRkFVTFRfTUFYX0xFTkdUSCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICBtYXhMZW5ndGhfID0gbWF4TGVuZ3RoOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoYmFzZSA6IFRUcmFuc3BvcnQpIDogVFRyYW5zcG9ydCB7CisgICAgICAgIHJldHVybiBuZXcgVEZyYW1lZFRyYW5zcG9ydChiYXNlLCBtYXhMZW5ndGhfKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGdWxsRHVwbGV4SHR0cENsaWVudC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZ1bGxEdXBsZXhIdHRwQ2xpZW50Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NzI4NTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGdWxsRHVwbGV4SHR0cENsaWVudC5oeApAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGZsYXNoLmVycm9ycy5FT0ZFcnJvcjsKK2ltcG9ydCBmbGFzaC5ldmVudHMuRXZlbnQ7CitpbXBvcnQgZmxhc2guZXZlbnRzLklPRXJyb3JFdmVudDsKK2ltcG9ydCBmbGFzaC5ldmVudHMuUHJvZ3Jlc3NFdmVudDsKK2ltcG9ydCBmbGFzaC5ldmVudHMuU2VjdXJpdHlFcnJvckV2ZW50OworaW1wb3J0IGZsYXNoLm5ldC5VUkxMb2FkZXI7CitpbXBvcnQgZmxhc2gubmV0LlVSTExvYWRlckRhdGFGb3JtYXQ7CitpbXBvcnQgZmxhc2gubmV0LlVSTFJlcXVlc3Q7CitpbXBvcnQgZmxhc2gubmV0LlVSTFJlcXVlc3RNZXRob2Q7CitpbXBvcnQgZmxhc2gudXRpbHMuSURhdGFJbnB1dDsKK2ltcG9ydCBmbGFzaC51dGlscy5JRGF0YU91dHB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGZsYXNoLm5ldC5Tb2NrZXQ7CitpbXBvcnQgZmxhc2guZXZlbnRzLkV2ZW50RGlzcGF0Y2hlcjsKKworCisgICAgLyoqCisgICAgICogSFRUUCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuIFVzZWQgZm9yIHdvcmtpbmcgd2l0aCBhCisgICAgICogVGhyaWZ0IHdlYiBzZXJ2aWNlcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBVbmxpa2UgSHR0cCBDbGllbnQsIGl0IHVzZXMgYSBzaW5nbGUgUE9TVCwgYW5kIGNodW5rLWVuY29kaW5nIHRvIHRyYW5zZmVyIGFsbCBtZXNzYWdlcy4KKyAgICAgKi8KKworICAgIHB1YmxpYyBjbGFzcyBURnVsbER1cGxleEh0dHBDbGllbnQgZXh0ZW5kcyBUVHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIHZhciBzb2NrZXQgOiBTb2NrZXQgPSBudWxsOworICAgICAgICBwcml2YXRlIHZhciBob3N0ICA6ICBTdHJpbmc7CisgICAgICAgIHByaXZhdGUgdmFyIHBvcnQgIDogIEludDsKKyAgICAgICAgcHJpdmF0ZSB2YXIgcmVzb3VyY2UgIDogIFN0cmluZzsKKyAgICAgICAgcHJpdmF0ZSB2YXIgc3RyaXBwZWQgIDogIEJvb2wgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSB2YXIgb2J1ZmZlciA6IEJ5dGVzID0gbmV3IEJ5dGVzKCk7CisgICAgICAgIHByaXZhdGUgdmFyIGlucHV0IDogSURhdGFJbnB1dDsKKyAgICAgICAgcHJpdmF0ZSB2YXIgb3V0cHV0IDogSURhdGFPdXRwdXQ7CisgICAgICAgIHByaXZhdGUgdmFyIGJ5dGVzSW5DaHVuayAgOiAgSW50ID0gMDsKKyAgICAgICAgcHJpdmF0ZSB2YXIgQ1JMRiA6IEJ5dGVzID0gbmV3IEJ5dGVzKCk7CisgICAgICAgIHByaXZhdGUgdmFyIGlvQ2FsbGJhY2sgOiBURXhjZXB0aW9uLT5Wb2lkID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSB2YXIgZXZlbnREaXNwYXRjaGVyIDogRXZlbnREaXNwYXRjaGVyID0gbmV3IEV2ZW50RGlzcGF0Y2hlcigpOworCisgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoaG9zdCAgOiAgU3RyaW5nLCBwb3J0ICA6ICBJbnQsIHJlc291cmNlICA6ICBTdHJpbmcpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIENSTEYud3JpdGVCeXRlKDEzKTsKKyAgICAgICAgICAgIENSTEYud3JpdGVCeXRlKDEwKTsKKyAgICAgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgICAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGNsb3NlKCkgIDogIFZvaWQKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5pbnB1dCA9IG51bGw7CisgICAgICAgICAgICB0aGlzLm91dHB1dCA9IG51bGw7CisgICAgICAgICAgICB0aGlzLnN0cmlwcGVkID0gZmFsc2U7CisgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHBlZWsoKSAgOiAgQm9vbAorICAgICAgICB7CisgICAgICAgICAgICBpZihzb2NrZXQuY29ubmVjdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCJCeXRlcyByZW1haW5lZDoiICsgc29ja2V0LmJ5dGVzQXZhaWxhYmxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc29ja2V0LmJ5dGVzQXZhaWxhYmxlPjA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gcmVhZChidWYgOiBCeXRlcywgb2ZmICA6ICBJbnQsIGxlbiAgOiAgSW50KSAgOiAgSW50CisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBuMSAgOiAgSW50ID0gMCwgbjIgIDogIEludCA9IDAsIG4zICA6ICBJbnQgPSAwLCBuNCAgOiAgSW50ID0gMCwgY2lkeCAgOiAgSW50ID0gMjsKKyAgICAgICAgICAgIHZhciBjaHVua1NpemUgOiBCeXRlcyA9IG5ldyBCeXRlcygpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIXN0cmlwcGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbjEgPSBuMjsKKyAgICAgICAgICAgICAgICAgICAgbjIgPSBuMzsKKyAgICAgICAgICAgICAgICAgICAgbjMgPSBuNDsKKyAgICAgICAgICAgICAgICAgICAgbjQgPSBpbnB1dC5yZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoKG4xID09IDEzKSAmJiAobjIgPT0gMTApICYmIChuMyA9PSAxMykgJiYgKG40ID09IDEwKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXBwZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gcmVhZCBjaHVuayBzaXplCisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzSW5DaHVuayA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbjEgPSBpbnB1dC5yZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgICAgICBuMiA9IGlucHV0LnJlYWRCeXRlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgY2h1bmtTaXplLndyaXRlQnl0ZShuMSk7CisgICAgICAgICAgICAgICAgICAgIGNodW5rU2l6ZS53cml0ZUJ5dGUobjIpOworCisgICAgICAgICAgICAgICAgICAgIHdoaWxlICghKChuMSA9PSAxMykgJiYgKG4yID09IDEwKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xID0gbjI7CisgICAgICAgICAgICAgICAgICAgICAgICBuMiA9IGlucHV0LnJlYWRCeXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaHVua1NpemUud3JpdGVCeXRlKG4yKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJ5dGVzSW5DaHVuayA9IHBhcnNlSW50KGNodW5rU2l6ZS50b1N0cmluZygpLCAxNik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW5wdXQucmVhZEJ5dGVzKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgICAgIGRlYnVnQnVmZmVyKGJ1Zik7CisgICAgICAgICAgICAgICAgYnl0ZXNJbkNodW5rIC09IGxlbjsKKworICAgICAgICAgICAgICAgIGlmIChieXRlc0luQ2h1bmsgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFkdmFuY2UgdGhlICA6ICAiXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQucmVhZFVURkJ5dGVzKDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKGUgOiBFT0ZFcnJvcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZShlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICJObyBtb3JlIGRhdGEgYXZhaWxhYmxlLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKGUgOiBURXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCdURXhjZXB0aW9uICRlJyk7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChlIDogRXJyb3IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhY2UoZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAnQmFkIElPIGVycm9yOiAkZScpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKGUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgJ0JhZCBJTyBlcnJvcjogJGUnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZ1bmN0aW9uIGRlYnVnQnVmZmVyKGJ1ZiA6IEJ5dGVzKSAgOiAgVm9pZAorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZGVidWcgIDogIFN0cmluZyA9ICJCVUZGRVIgPj4iOworICAgICAgICAgICAgdmFyIGkgIDogIEludDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBidWYubGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGVidWcgKz0gYnVmW2ldIGFzIGludDsKKyAgICAgICAgICAgICAgICBkZWJ1ZyArPSAiICI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyYWNlKGRlYnVnICsgIjw8Iik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gd3JpdGUoYnVmIDogQnl0ZXMsIG9mZiAgOiAgSW50LCBsZW4gIDogIEludCkgIDogIFZvaWQKKyAgICAgICAgeworICAgICAgICAgICAgb2J1ZmZlci53cml0ZUJ5dGVzKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIodHlwZSAgOiAgU3RyaW5nLCBsaXN0ZW5lciA6IEZ1bmN0aW9uLCB1c2VDYXB0dXJlICA6ICBCb29sID0gZmFsc2UsIHByaW9yaXR5ICA6ICBJbnQgPSAwLCB1c2VXZWFrUmVmZXJlbmNlICA6ICBCb29sID0gZmFsc2UpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUsIHByaW9yaXR5LCB1c2VXZWFrUmVmZXJlbmNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBvcGVuKCkgIDogIFZvaWQKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgU29ja2V0KCk7CisgICAgICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKEV2ZW50LkNPTk5FQ1QsIHNvY2tldENvbm5lY3RlZCk7CisgICAgICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKElPRXJyb3JFdmVudC5JT19FUlJPUiwgc29ja2V0RXJyb3IpOworICAgICAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihTZWN1cml0eUVycm9yRXZlbnQuU0VDVVJJVFlfRVJST1IsIHNvY2tldFNlY3VyaXR5RXJyb3IpOworICAgICAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihQcm9ncmVzc0V2ZW50LlNPQ0tFVF9EQVRBLCBzb2NrZXREYXRhSGFuZGxlcik7CisgICAgICAgICAgICB0aGlzLnNvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZ1bmN0aW9uIHNvY2tldENvbm5lY3RlZChldmVudCA6IEV2ZW50KSAgOiAgVm9pZAorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm91dHB1dCA9IHRoaXMuc29ja2V0OworICAgICAgICAgICAgdGhpcy5pbnB1dCA9IHRoaXMuc29ja2V0OworICAgICAgICAgICAgdGhpcy5vdXRwdXQud3JpdGVVVEYoICJDT05ORUNUICIgKyByZXNvdXJjZSArICIgSFRUUC8xLjFcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiSG9zdCA6ICAiICsgaG9zdCArICI6IiArIHBvcnQgKyAiXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVXNlci1BZ2VudCA6ICBUaHJpZnQvSGF4ZVxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlRyYW5zZmVyLUVuY29kaW5nIDogIGNodW5rZWRcclxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJjb250ZW50LXR5cGUgOiAgYXBwbGljYXRpb24veC10aHJpZnRcclxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJBY2NlcHQgOiAgKi8qXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXHJcbiIpOworICAgICAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZGlzcGF0Y2hFdmVudChldmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZnVuY3Rpb24gc29ja2V0RXJyb3IoZXZlbnQgOiBJT0Vycm9yRXZlbnQpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCJFcnJvciBDb25uZWN0aW5nOiIgKyBldmVudCk7CisgICAgICAgICAgICB0aGlzLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAoaW9DYWxsYmFjayA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlvQ2FsbGJhY2sobmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAiSU9FcnJvciA6ICAiICsgZXZlbnQudGV4dCkpOworICAgICAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZGlzcGF0Y2hFdmVudChldmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZnVuY3Rpb24gc29ja2V0U2VjdXJpdHlFcnJvcihldmVudCA6IFNlY3VyaXR5RXJyb3JFdmVudCkgIDogIFZvaWQKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoIlNlY3VyaXR5IEVycm9yIENvbm5lY3Rpbmc6IiArIGV2ZW50KTsKKyAgICAgICAgICAgIHRoaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZ1bmN0aW9uIHNvY2tldERhdGFIYW5kbGVyKGV2ZW50IDogUHJvZ3Jlc3NFdmVudCkgIDogIFZvaWQKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoIkdvdCBEYXRhIGNhbGw6IiAraW9DYWxsYmFjayk7CisgICAgICAgICAgICBpZiAoaW9DYWxsYmFjayAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlvQ2FsbGJhY2sobnVsbCk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZGlzcGF0Y2hFdmVudChldmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZmx1c2goY2FsbGJhY2sgOiBFcnJvci0+Vm9pZCA9IG51bGwpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCJzZXQgY2FsbGJhY2s6IiArIGNhbGxiYWNrKTsKKyAgICAgICAgICAgIHRoaXMuaW9DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICAgICAgdGhpcy5vdXRwdXQud3JpdGVVVEYodGhpcy5vYnVmZmVyLmxlbmd0aC50b1N0cmluZygxNikpOworICAgICAgICAgICAgdGhpcy5vdXRwdXQud3JpdGVCeXRlcyhDUkxGKTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0LndyaXRlQnl0ZXModGhpcy5vYnVmZmVyKTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0LndyaXRlQnl0ZXMoQ1JMRik7CisgICAgICAgICAgICB0aGlzLnNvY2tldC5mbHVzaCgpOworICAgICAgICAgICAgLy8gd2FpdGluZyBmb3IgIG5ldyBGbGV4IHNkayAzLjUKKyAgICAgICAgICAgIC8vdGhpcy5vYnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICB0aGlzLm9idWZmZXIgPSBuZXcgQnl0ZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBpc09wZW4oKSAgOiAgQm9vbAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKHRoaXMuc29ja2V0ID09IG51bGwgPyBmYWxzZSAgOiAgdGhpcy5zb2NrZXQuY29ubmVjdGVkKTsKKyAgICAgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmODY2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaHgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzT3V0cHV0OworaW1wb3J0IGhheGUuaW8uQnl0ZXNJbnB1dDsKKworaW1wb3J0IGhheGUuSHR0cDsKKworCisKKy8qKgorKiBIVFRQIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4gVXNlZCBmb3Igd29ya2luZyB3aXRoIGEKKyogVGhyaWZ0IHdlYiBzZXJ2aWNlcyBpbXBsZW1lbnRhdGlvbi4KKyovCisKK2NsYXNzIFRIdHRwQ2xpZW50IGV4dGVuZHMgVFRyYW5zcG9ydCB7CisKKyAgICBwcml2YXRlIHZhciByZXF1ZXN0QnVmZmVyXyAgOiBCeXRlc091dHB1dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgIHByaXZhdGUgdmFyIHJlc3BvbnNlQnVmZmVyXyA6IEJ5dGVzSW5wdXQgPSBudWxsOworCisgICAgcHJpdmF0ZSB2YXIgcmVxdWVzdF8gICAgICAgIDogSHR0cCA9IG51bGw7CisKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHJlcXVlc3RVcmwgOiBTdHJpbmcpIDogVm9pZCB7CisgICAgICAgICAgcmVxdWVzdF8gPSBuZXcgSHR0cChyZXF1ZXN0VXJsKTsKKyAgICAgICAgcmVxdWVzdF8uYWRkSGVhZGVyKCAiY29udGVudFR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBvcGVuKCkgOiBWb2lkIHsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gY2xvc2UoKSA6IFZvaWQgeworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBpc09wZW4oKSA6IEJvb2wgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlYWQoYnVmOkJ5dGVzQnVmZmVyLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBJbnQgeworICAgICAgICBpZiAocmVzcG9uc2VCdWZmZXJfID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgIlJlc3BvbnNlIGJ1ZmZlciBpcyBlbXB0eSwgbm8gcmVxdWVzdC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBkYXRhID1CeXRlcy5hbGxvYyhsZW4pOworICAgICAgICBsZW4gPSByZXNwb25zZUJ1ZmZlcl8ucmVhZEJ5dGVzKGRhdGEsIG9mZiwgbGVuKTsKKyAgICAgICAgYnVmLmFkZEJ5dGVzKGRhdGEsMCxsZW4pOworICAgICAgICByZXR1cm4gbGVuOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiB3cml0ZShidWY6Qnl0ZXMsIG9mZiA6IEludCwgbGVuIDogSW50KSA6IFZvaWQgeworICAgICAgcmVxdWVzdEJ1ZmZlcl8ud3JpdGVCeXRlcyhidWYsIG9mZiwgbGVuKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBmbHVzaChjYWxsYmFjazpEeW5hbWljLT5Wb2lkID0gbnVsbCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IHJlcXVlc3RCdWZmZXJfOworICAgICAgICByZXF1ZXN0QnVmZmVyXyA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICByZXNwb25zZUJ1ZmZlcl8gPSBudWxsOworCisgICAgICAgIHJlcXVlc3RfLm9uRGF0YSA9IGZ1bmN0aW9uKGRhdGEgOiBTdHJpbmcpIHsKKyAgICAgICAgICAgIHZhciB0bXAgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIHRtcC5hZGRTdHJpbmcoZGF0YSk7CisgICAgICAgICAgICByZXNwb25zZUJ1ZmZlcl8gPSBuZXcgQnl0ZXNJbnB1dCh0bXAuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICBpZiggY2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHJlcXVlc3RfLm9uRXJyb3IgPSBmdW5jdGlvbihtc2cgOiBTdHJpbmcpIHsKKyAgICAgICAgICAgIGlmKCBjYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2sobmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAiSU9FcnJvcjogIiArIG1zZykpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHJlcXVlc3RfLnNldFBvc3REYXRhKGJ1ZmZlci5nZXRCeXRlcygpLnRvU3RyaW5nKCkpOworICAgICAgICByZXF1ZXN0Xy5yZXF1ZXN0KHRydWUvKlBPU1QqLyk7CisgICAgfQorCit9CisKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJhZGIyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oeApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGhheGUucmVtb3RpbmcuU29ja2V0UHJvdG9jb2w7CitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworaW1wb3J0IGhheGUuaW8uQnl0ZXNJbnB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzT3V0cHV0OworaW1wb3J0IGhheGUuaW8uSW5wdXQ7CitpbXBvcnQgaGF4ZS5pby5PdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5Fb2Y7CisKKy8vaW1wb3J0IGZsYXNoLm5ldC5TZXJ2ZXJTb2NrZXQ7IC0gbm90IHlldCBhdmFpbGFibGUgb24gSGF4ZSAzLjEuMworI2lmICEgKGZsYXNoIHx8IGh0bWw1KQorCitpbXBvcnQgc3lzLm5ldC5Ib3N0OworCisKK2NsYXNzIFRTZXJ2ZXJTb2NrZXQgZXh0ZW5kcyBUU2VydmVyVHJhbnNwb3J0IHsKKworICAgIC8vIFVuZGVybHlpbmcgc2VydmVyIHdpdGggc29ja2V0CisgICAgcHJpdmF0ZSB2YXIgX3NvY2tldCA6IFNvY2tldD0gbnVsbDsKKworICAgIC8vIFRpbWVvdXQgZm9yIGNsaWVudCBzb2NrZXRzIGZyb20gYWNjZXB0CisgICAgcHJpdmF0ZSB2YXIgX2NsaWVudFRpbWVvdXQgOiBGbG9hdCA9IDU7CisKKyAgICAvLyBXaGV0aGVyIG9yIG5vdCB0byB3cmFwIG5ldyBUU29ja2V0IGNvbm5lY3Rpb25zIGluIGJ1ZmZlcnMKKyAgICBwcml2YXRlIHZhciBfdXNlQnVmZmVyZWRTb2NrZXRzIDogQm9vbCA9IGZhbHNlOworCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KD9hZGRyZXNzIDogU3RyaW5nID0gJ2xvY2FsaG9zdCcsICBwb3J0IDogSW50LCBjbGllbnRUaW1lb3V0IDogRmxvYXQgPSA1LCB1c2VCdWZmZXJlZFNvY2tldHMgOiBCb29sID0gZmFsc2UpCisgICAgeworICAgICAgICBfY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgIF91c2VCdWZmZXJlZFNvY2tldHMgPSB1c2VCdWZmZXJlZFNvY2tldHM7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIF9zb2NrZXQgPSBuZXcgU29ja2V0KCk7CisgICAgICAgICAgICBfc29ja2V0LmJpbmQoIG5ldyBIb3N0KGFkZHJlc3MpLCBwb3J0KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zb2NrZXQgPSBudWxsOworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgJ0NvdWxkIG5vdCBjcmVhdGUgU2VydmVyU29ja2V0IG9uIHBvcnQgJHBvcnQ6ICRlJyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBMaXN0ZW4oKSA6IFZvaWQKKyAgICB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSBub3QgdG8gYmxvY2sgb24gYWNjZXB0CisgICAgICAgIGlmIChfc29ja2V0ICE9IG51bGwpICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICNpZiAhcGhwCisgICAgICAgICAgICAgICAgX3NvY2tldC5saXN0ZW4oMSk7CisgICAgICAgICAgICAgICAgI2VuZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCdFcnJvciAkZScpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICdDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICRlJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIG92ZXJyaWRlIGZ1bmN0aW9uIEFjY2VwdEltcGwoKSA6IFRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIGlmIChfc29ja2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCAiTm8gdW5kZXJseWluZyBzZXJ2ZXIgc29ja2V0LiIpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBhY2NlcHRlZCA9IF9zb2NrZXQuYWNjZXB0KCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gVFNvY2tldC5mcm9tU29ja2V0KGFjY2VwdGVkKTsKKyAgICAgICAgICAgIHJlc3VsdC5zZXRUaW1lb3V0KCBfY2xpZW50VGltZW91dCk7CisKKyAgICAgICAgICAgIGlmKCBfdXNlQnVmZmVyZWRTb2NrZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93ICJidWZmZXJlZCB0cmFuc3BvcnQgbm90IHlldCBzdXBwb3J0ZWQiOyAgLy8gVE9ETworICAgICAgICAgICAgICAgIC8vcmVzdWx0ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydChyZXN1bHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoJ0Vycm9yICRlJyk7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbiggVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAnJGUnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBDbG9zZSgpIDogVm9pZAorICAgIHsKKyAgICAgICAgaWYgKF9zb2NrZXQgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3NvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCdFcnJvciAkZScpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICdXQVJOSU5HOiBDb3VsZCBub3QgY2xvc2Ugc2VydmVyIHNvY2tldDogJGUnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9zb2NrZXQgPSBudWxsOworICAgICAgICB9CisgICAgfQorfQorCisjZW5kCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE4OTk4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oeApAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitjbGFzcyBUU2VydmVyVHJhbnNwb3J0IHsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBBY2NlcHQoKSA6IFRUcmFuc3BvcnQgeworICAgICAgICB2YXIgdHJhbnNwb3J0ID0gQWNjZXB0SW1wbCgpOworICAgICAgICBpZiAodHJhbnNwb3J0ID09IG51bGwpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbiggVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAiYWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cmFuc3BvcnQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIExpc3RlbigpIDogVm9pZCB7CisgICAgICAgIHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIENsb3NlKCkgOiBWb2lkIHsKKyAgICAgICAgdGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIEFjY2VwdEltcGwoKSA6IFRUcmFuc3BvcnQgeworICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTQxYWI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmh4CkBAIC0wLDAgKzEsMzE4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCisjaWYgZmxhc2gKK2ltcG9ydCBmbGFzaC5uZXQuU29ja2V0OworI2Vsc2VpZiBqcworaW1wb3J0IGpzLmh0bWwuV2ViU29ja2V0OworI2Vsc2UKK2ltcG9ydCBoYXhlLnJlbW90aW5nLlNvY2tldFByb3RvY29sOworI2VuZAorCitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworaW1wb3J0IGhheGUuaW8uQnl0ZXNJbnB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzT3V0cHV0OworaW1wb3J0IGhheGUuaW8uSW5wdXQ7CitpbXBvcnQgaGF4ZS5pby5PdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5Fb2Y7CisKKworI2lmICEgKGZsYXNoIHx8IGpzKQoraW1wb3J0IHN5cy5uZXQuSG9zdDsKKyNlbmQKKworCisgIC8qKgorICAgKiBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLiBVc2VkIGZvciB3b3JraW5nIHdpdGggYQorICAgKiBUaHJpZnQgU29ja2V0IFNlcnZlciBiYXNlZCBpbXBsZW1lbnRhdGlvbnMuCisgICAqLworCitjbGFzcyBUU29ja2V0IGV4dGVuZHMgVFRyYW5zcG9ydCAgeworCisgICAgI2lmIChmbGFzaCB8fCBqcykKKyAgICBwcml2YXRlIHZhciBob3N0ICA6ICBTdHJpbmc7CisgICAgI2Vsc2UKKyAgICBwcml2YXRlIHZhciBob3N0ICA6ICBIb3N0OworICAgICNlbmQKKworICAgIHByaXZhdGUgdmFyIHBvcnQgIDogIEludDsKKworICAgICNpZiBqcworICAgIHByaXZhdGUgdmFyIHNvY2tldCA6IFdlYlNvY2tldCA9IG51bGw7CisgICAgI2Vsc2UKKyAgICBwcml2YXRlIHZhciBzb2NrZXQgOiBTb2NrZXQgPSBudWxsOworICAgICNlbmQKKworICAgICNpZiBqcworICAgIHByaXZhdGUgdmFyIGlucHV0IDogRHluYW1pYyA9IG51bGw7CisgICAgcHJpdmF0ZSB2YXIgb3V0cHV0IDogV2ViU29ja2V0ID0gbnVsbDsKKyAgICAjZWxzZWlmIGZsYXNoCisgICAgcHJpdmF0ZSB2YXIgaW5wdXQgOiBTb2NrZXQgPSBudWxsOworICAgIHByaXZhdGUgdmFyIG91dHB1dCA6IFNvY2tldCA9IG51bGw7CisgICAgI2Vsc2UKKyAgICBwcml2YXRlIHZhciBpbnB1dCA6IElucHV0ID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBvdXRwdXQgOiBPdXRwdXQgPSBudWxsOworICAgICNlbmQKKworICAgIHByaXZhdGUgdmFyIHRpbWVvdXQgOiBGbG9hdCA9IDMwOworCisgICAgcHJpdmF0ZSB2YXIgb2J1ZmZlciA6IEJ5dGVzT3V0cHV0ID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisgICAgcHJpdmF0ZSB2YXIgaW9DYWxsYmFjayA6IFRFeGNlcHRpb24tPlZvaWQgPSBudWxsOworICAgIHByaXZhdGUgdmFyIHJlYWRDb3VudCA6IEludCA9IDA7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KGhvc3QgOiBTdHJpbmcsIHBvcnQgIDogIEludCkgIDogIFZvaWQgIHsKKyAgICAgICAgI2lmIChmbGFzaCB8fCBqcykKKyAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgdGhpcy5ob3N0ID0gbmV3IEhvc3QoaG9zdCk7CisgICAgICAgICNlbmQKKworICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgIH0KKworICAgICNpZiAhIChmbGFzaCB8fCBqcykKKyAgICAvLyB1c2VkIGJ5IFRTb2NrZXRTZXJ2ZXIKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21Tb2NrZXQoIHNvY2tldCA6IFNvY2tldCkgOiBUU29ja2V0ICB7CisgICAgICAgIHZhciBzb2NrZXRIb3N0ID0gc29ja2V0Lmhvc3QoKTsKKyAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBUU29ja2V0KHNvY2tldEhvc3QuaG9zdC50b1N0cmluZygpLCBzb2NrZXRIb3N0LnBvcnQpOworICAgICAgICByZXN1bHQuYXNzaWduU29ja2V0KHNvY2tldCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgICNlbmQKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBjbG9zZSgpICA6ICBWb2lkICB7CisgICAgICAgIGlucHV0ID0gbnVsbDsKKyAgICAgICAgb3V0cHV0ID0gbnVsbDsKKyAgICAgICAgc29ja2V0LmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHBlZWsoKSAgOiAgQm9vbCAgeworICAgICAgICBpZiggKGlucHV0ID09IG51bGwpIHx8IChzb2NrZXQgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICNpZiBmbGFzaAorICAgICAgICAgICAgcmV0dXJuIChpbnB1dC5ieXRlc0F2YWlsYWJsZSA+IDApOworICAgICAgICAgICAgI2Vsc2VpZiBqcworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgdmFyIHJlYWR5ID0gU29ja2V0LnNlbGVjdCggW3NvY2tldF0sIG51bGwsIG51bGwsIDApOworICAgICAgICAgICAgcmV0dXJuIChyZWFkeS5yZWFkLmxlbmd0aCA+IDApOworICAgICAgICAgICAgI2VuZAorICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmVhZHMgdXAgdG8gbGVuIGJ5dGVzIGludG8gYnVmZmVyIGJ1Ziwgc3RhcnRpbmcgYXR0IG9mZnNldCBvZmYuCisgICAgLy8gTWF5IHJldHVybiBsZXNzIGJ5dGVzIHRoYW4gbGVuIHJlcXVpcmVkCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlYWQoIGJ1ZiA6IEJ5dGVzQnVmZmVyLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBJbnQgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICAjaWYgZmxhc2gKKworICAgICAgICAgICAgdmFyIHJlbWFpbmluZyA9IGxlbjsKKyAgICAgICAgICAgIHdoaWxlKCByZW1haW5pbmcgPiAwKSB7CisgICAgICAgICAgICAgICAgYnVmLmFkZEJ5dGUoIGlucHV0LnJlYWRCeXRlKCkpOworICAgICAgICAgICAgICAgIC0tcmVtYWluaW5nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbjsKKworICAgICAgICAgICAgI2Vsc2VpZiBqcworCisgICAgICAgICAgICBpZiggaW5wdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgIlN0aWxsIG5vIGRhdGEgIik7ICAvLyBkb24ndCBibG9jaworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIG5yID0gbGVuOworICAgICAgICAgICAgd2hpbGUoIG5yIDwgbGVuKSB7CisgICAgICAgICAgICAgICAgYnVmLmFkZEJ5dGUoIGlucHV0LmdldChvZmYrbnIpKTsKKyAgICAgICAgICAgICAgICArK25yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbjsKKworICAgICAgICAgICAgI2Vsc2UKKworICAgICAgICAgICAgLy9zb2NrZXQud2FpdEZvclJlYWQoKTsgIC0gIG5vLCB0aGlzIGlnbm9yZXMgdGltZW91dCBhbmQgYmxvY2tzIGluZmluaXRlbHkKKyAgICAgICAgICAgIGlmKHJlYWRDb3VudCA8IG9mZikgeworICAgICAgICAgICAgICAgIGlucHV0LnJlYWQob2ZmLXJlYWRDb3VudCk7CisgICAgICAgICAgICAgICAgcmVhZENvdW50ID0gb2ZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZGF0YSA9IEJ5dGVzLmFsbG9jKGxlbik7CisgICAgICAgICAgICB2YXIgZ290ID0gaW5wdXQucmVhZEJ5dGVzKGRhdGEsIDAsIGxlbik7CisgICAgICAgICAgICBidWYuYWRkQnl0ZXMoIGRhdGEsIDAsIGdvdCk7CisgICAgICAgICAgICByZWFkQ291bnQgKz0gZ290OworICAgICAgICAgICAgcmV0dXJuIGdvdDsKKworICAgICAgICAgICAgI2VuZAorICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogRW9mKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgnRW9mICRlJyk7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLCAiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZS4iKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IFRFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCdURXhjZXB0aW9uICRlJyk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoJ0Vycm9yICRlJyk7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICdCYWQgSU8gZXJyb3IgOiAkZScpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gd3JpdGUoYnVmIDogQnl0ZXMsIG9mZiAgOiAgSW50LCBsZW4gIDogIEludCkgIDogIFZvaWQKKyAgICB7CisgICAgICAgIG9idWZmZXIud3JpdGVCeXRlcyhidWYsIG9mZiwgbGVuKTsKKyAgICB9CisKKworCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGZsdXNoKGNhbGxiYWNrIDogRHluYW1pYy0+Vm9pZCA9IG51bGwpICA6ICBWb2lkCisgICAgeworICAgICAgICBpZiggISBpc09wZW4oKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIlRyYW5zcG9ydCBub3Qgb3BlbiIpOworICAgICAgICB9CisKKyAgICAgICAgI2lmIGZsYXNoCisKKyAgICAgICAgdmFyIGJ5dGVzID0gbmV3IGZsYXNoLnV0aWxzLkJ5dGVBcnJheSgpOworICAgICAgICB2YXIgZGF0YSA9IG9idWZmZXIuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgdmFyIGxlbiA9IDA7CisgICAgICAgIHdoaWxlKCBsZW4gPCBkYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgYnl0ZXMud3JpdGVCeXRlKGRhdGEuZ2V0KGxlbikpOworICAgICAgICAgICAgKytsZW47CisgICAgICAgIH0KKworICAgICAgICAjZWxzZWlmIGpzCisKKyAgICAgICAgdmFyIGRhdGEgPSBvYnVmZmVyLmdldEJ5dGVzKCk7CisgICAgICAgIHZhciBvdXRidWYgPSBuZXcganMuaHRtbC5JbnQ4QXJyYXkoZGF0YS5sZW5ndGgpOworICAgICAgICB2YXIgbGVuID0gMDsKKyAgICAgICAgd2hpbGUoIGxlbiA8IGRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICBvdXRidWYuc2V0KCBbZGF0YS5nZXQobGVuKV0sIGxlbik7CisgICAgICAgICAgICArK2xlbjsKKyAgICAgICAgfQorICAgICAgICB2YXIgYnl0ZXMgPSBvdXRidWYuYnVmZmVyOworCisgICAgICAgICNlbHNlCisKKyAgICAgICAgdmFyIGJ5dGVzID0gb2J1ZmZlci5nZXRCeXRlcygpOworICAgICAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoOworCisgICAgICAgICNlbmQKKworICAgICAgICBvYnVmZmVyID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisKKworICAgICAgICBpb0NhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkQ291bnQgPSAwOworCisgICAgICAgICAgICAjaWYganMKKyAgICAgICAgICAgIG91dHB1dC5zZW5kKCBieXRlcyk7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgb3V0cHV0LndyaXRlQnl0ZXMoIGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOworICAgICAgICAgICAgI2VuZAorCisgICAgICAgICAgICBpZihpb0NhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpb0NhbGxiYWNrKG51bGwpOyAgLy8gc3VjY2VzcyBjYWxsCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBURXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgnVEV4Y2VwdGlvbiAkZSwgbWVzc2FnZSA6ICR7ZS5lcnJvck1zZ30nKTsKKyAgICAgICAgICAgIGlmKGlvQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlvQ2FsbGJhY2soZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKSB7CisgICAgICAgICAgICB0cmFjZShlKTsKKyAgICAgICAgICAgIGlmKGlvQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlvQ2FsbGJhY2sobmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAnQmFkIElPIGVycm9yIDogJGUnKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gaXNPcGVuKCkgIDogIEJvb2wKKyAgICB7CisgICAgICAgIHJldHVybiAoc29ja2V0ICE9IG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBvcGVuKCkgIDogIFZvaWQKKyAgICB7CisgICAgICAgICNpZiBqcworICAgICAgICB2YXIgc29ja2V0ID0gbmV3IFdlYlNvY2tldCgpOworICAgICAgICBzb2NrZXQub25tZXNzYWdlID0gZnVuY3Rpb24oIGV2ZW50IDoganMuaHRtbC5NZXNzYWdlRXZlbnQpIHsKKyAgICAgICAgICAgIHRoaXMuaW5wdXQgPSBldmVudC5kYXRhOworICAgICAgICB9CisKKyAgICAgICAgI2Vsc2VpZiBmbGFzaAorICAgICAgICB2YXIgc29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICBzb2NrZXQuY29ubmVjdChob3N0LCBwb3J0KTsKKworICAgICAgICAjZWxzZWlmIHBocAorICAgICAgICB2YXIgc29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICBzb2NrZXQuY29ubmVjdChob3N0LCBwb3J0KTsKKyAgICAgICAgc29ja2V0LnNldEJsb2NraW5nKHRydWUpOworICAgICAgICBzb2NrZXQuc2V0VGltZW91dCh0aW1lb3V0KTsKKworICAgICAgICAjZWxzZQorICAgICAgICB2YXIgc29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICBzb2NrZXQuc2V0QmxvY2tpbmcodHJ1ZSk7CisgICAgICAgIHNvY2tldC5zZXRGYXN0U2VuZCh0cnVlKTsKKyAgICAgICAgc29ja2V0LnNldFRpbWVvdXQodGltZW91dCk7CisgICAgICAgIHNvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQpOworCisgICAgICAgICNlbmQKKworICAgICAgICBhc3NpZ25Tb2NrZXQoIHNvY2tldCk7CisgICAgfQorCisgICAgI2lmIGpzCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBhc3NpZ25Tb2NrZXQoIHNvY2tldCA6IFdlYlNvY2tldCkgIDogIFZvaWQKKyAgICAjZWxzZQorICAgIHByaXZhdGUgZnVuY3Rpb24gYXNzaWduU29ja2V0KCBzb2NrZXQgOiBTb2NrZXQpICA6ICBWb2lkCisgICAgI2VuZAorICAgIHsKKyAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7CisKKyAgICAgICAgI2lmIChmbGFzaCB8fCBqcykKKyAgICAgICAgb3V0cHV0ID0gc29ja2V0OworICAgICAgICBpbnB1dCA9IHNvY2tldDsKKworICAgICAgICAjZWxzZQorICAgICAgICBvdXRwdXQgPSBzb2NrZXQub3V0cHV0OworICAgICAgICBpbnB1dCA9IHNvY2tldC5pbnB1dDsKKworICAgICAgICAjZW5kCisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFRpbWVvdXQoIHRpbWVvdXQgOiBGbG9hdCApIDogVm9pZCB7CisgICAgICAgIGlmKGlzT3BlbigpKSB7CisgICAgICAgICAgICBzb2NrZXQuc2V0VGltZW91dCh0aW1lb3V0KTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU3RyZWFtLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU3RyZWFtLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYjNlZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTdHJlYW0uaHgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKKworCitpbnRlcmZhY2UgVFN0cmVhbSB7CisgICAgZnVuY3Rpb24gQ2xvc2UoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gUGVlaygpIDogQm9vbDsKKyAgICBmdW5jdGlvbiBSZWFkKCBidWYgOiBCeXRlcywgb2Zmc2V0IDogSW50LCBjb3VudCA6IEludCkgOiBJbnQ7CisgICAgZnVuY3Rpb24gV3JpdGUoIGJ1ZiA6IEJ5dGVzLCBvZmZzZXQgOiBJbnQsIGNvdW50IDogSW50KSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gRmx1c2goKSA6IFZvaWQ7Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFhN2MxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFN0cmVhbVRyYW5zcG9ydC5oeApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlci4qOworCitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworaW1wb3J0IGhheGUuaW8uQnl0ZXNPdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0lucHV0OworCisKK2NsYXNzIFRTdHJlYW1UcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKKworICAgIHB1YmxpYyB2YXIgSW5wdXRTdHJlYW0oZGVmYXVsdCxudWxsKSA6IFRTdHJlYW07CisgICAgcHVibGljIHZhciBPdXRwdXRTdHJlYW0oZGVmYXVsdCxudWxsKSA6IFRTdHJlYW07CisKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIGlucHV0IDogVFN0cmVhbSwgb3V0cHV0IDogVFN0cmVhbSkgeworICAgICAgICB0aGlzLklucHV0U3RyZWFtID0gaW5wdXQ7CisgICAgICAgIHRoaXMuT3V0cHV0U3RyZWFtID0gb3V0cHV0OworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBpc09wZW4oKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gcGVlaygpIDogQm9vbCB7CisgICAgICAgIHJldHVybiAoSW5wdXRTdHJlYW0gIT0gbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIG9wZW4oKSA6IFZvaWQgeworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBjbG9zZSgpIDogVm9pZCB7CisgICAgICAgIGlmIChJbnB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbS5DbG9zZSgpOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChPdXRwdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgT3V0cHV0U3RyZWFtLkNsb3NlKCk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlYWQoIGJ1ZiA6IEJ5dGVzQnVmZmVyLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBJbnQgeworICAgICAgICBpZiAoSW5wdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlYWQgZnJvbSBudWxsIElucHV0U3RyZWFtIik7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZGF0YSA6IEJ5dGVzID0gIEJ5dGVzLmFsbG9jKGxlbik7CisgICAgICAgIHZhciBzaXplID0gSW5wdXRTdHJlYW0uUmVhZCggZGF0YSwgb2ZmLCBsZW4pOworICAgICAgICBidWYuYWRkQnl0ZXMoIGRhdGEsIDAsIHNpemUpOworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gd3JpdGUoYnVmOkJ5dGVzLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgaWYgKE91dHB1dFN0cmVhbSA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbiggVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHdyaXRlIHRvIG51bGwgT3V0cHV0U3RyZWFtIik7CisgICAgICAgIH0KKworICAgICAgICBPdXRwdXRTdHJlYW0uV3JpdGUoYnVmLCBvZmYsIGxlbik7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGZsdXNoKGNhbGxiYWNrOkR5bmFtaWMtPlZvaWQgPW51bGwpIDogVm9pZCB7CisgICAgICAgIGlmIChPdXRwdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGZsdXNoIG51bGwgT3V0cHV0U3RyZWFtIik7CisgICAgICAgICAgICBpZihjYWxsYmFjayAhPSBudWxsKQorICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisKKyAgICAgICAgT3V0cHV0U3RyZWFtLkZsdXNoKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZiMzE3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oeApAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGhheGUuaW8uRW9mOworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5BYnN0cmFjdE1ldGhvZEVycm9yOworCitjbGFzcyBUVHJhbnNwb3J0IHsKKworICAgIC8qKgorICAgICAqIFF1ZXJpZXMgd2hldGhlciB0aGUgdHJhbnNwb3J0IGlzIG9wZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKSA6IEJvb2wgeworICAgICAgICAgIHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgdGhlcmUgbW9yZSBkYXRhIHRvIGJlIHJlYWQ/CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJlbW90ZSBzaWRlIGlzIHN0aWxsIGFsaXZlIGFuZCBmZWVkaW5nIHVzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHBlZWsoKSA6IEJvb2wgeworICAgICAgICAgIHJldHVybiBpc09wZW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlIHRyYW5zcG9ydCBjb3VsZCBub3QgYmUgb3BlbmVkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKSA6IFZvaWQgeworICAgICAgICAgIHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkgOiBWb2lkIHsKKyAgICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB1cCB0byBsZW4gYnl0ZXMgaW50byBidWZmZXIgYnVmLCBzdGFydGluZyBhdHQgb2Zmc2V0IG9mZi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWYgQXJyYXkgdG8gcmVhZCBpbnRvCisgICAgICogQHBhcmFtIG9mZiBJbmRleCB0byBzdGFydCByZWFkaW5nIGF0CisgICAgICogQHBhcmFtIGxlbiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkCisgICAgICogQHJldHVybiBUaGUgYnl0ZXMgY291bnQgYWN0dWFsbHkgcmVhZAorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBkYXRhCisgICAgICovCisgICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCBidWYgOiBCeXRlc0J1ZmZlciwgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogSW50IHsKKyAgICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgICB9CisKKyAgICAvKioKKyAgICAgKiBHdWFyYW50ZWVzIHRoYXQgYWxsIG9mIGxlbiBieXRlcyBhcmUgYWN0dWFsbHkgcmVhZCBvZmYgdGhlIHRyYW5zcG9ydC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWYgQXJyYXkgdG8gcmVhZCBpbnRvCisgICAgICogQHBhcmFtIG9mZiBJbmRleCB0byBzdGFydCByZWFkaW5nIGF0CisgICAgICogQHBhcmFtIGxlbiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQsIHdoaWNoIG11c3QgYmUgZXF1YWwgdG8gbGVuCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEFsbChidWYgOiBCeXRlc0J1ZmZlciwgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogSW50IHsKKyAgICAgICAgdmFyIGdvdCA6IEludCA9IDA7CisgICAgICAgIHZhciByZXQgOiBJbnQgPSAwOworICAgICAgICB3aGlsZSAoZ290IDwgbGVuKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldCA9IHJlYWQoYnVmLCBvZmYrZ290LCBsZW4tZ290KTsKKyAgICAgICAgICAgIGlmIChyZXQgPD0gMCkgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZC4gUmVtb3RlIHNpZGUgaGFzIGNsb3NlZC4gVHJpZWQgdG8gcmVhZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGVuICsgIiBieXRlcywgYnV0IG9ubHkgZ290ICIgKyBnb3QgKyAiIGJ5dGVzLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaCAoZW9mIDogRW9mKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLCAnQ2FuXCd0IHJlYWQgJGxlbiBieXRlcyEnKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ290ICs9IHJldDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ290OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgYnVmZmVyIHRvIHRoZSBvdXRwdXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBidWYgVGhlIG91dHB1dCBkYXRhIGJ1ZmZlcgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd3JpdGluZyBkYXRhCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQWxsKGJ1ZjpCeXRlcykgOiBWb2lkIHsKKyAgICAgICAgd3JpdGUoYnVmLCAwLCBidWYubGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdXAgdG8gbGVuIGJ5dGVzIGZyb20gdGhlIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWYgVGhlIG91dHB1dCBkYXRhIGJ1ZmZlcgorICAgICAqIEBwYXJhbSBvZmYgVGhlIG9mZnNldCB0byBzdGFydCB3cml0aW5nIGZyb20KKyAgICAgKiBAcGFyYW0gbGVuIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZShidWY6Qnl0ZXMsIG9mZiA6IEludCwgbGVuIDogSW50KSA6IFZvaWQgeworICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZsdXNoIGFueSBwZW5kaW5nIGRhdGEgb3V0IG9mIGEgdHJhbnNwb3J0IGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd3JpdGluZyBvdXQgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goY2FsbGJhY2s6RHluYW1pYy0+Vm9pZCA9bnVsbCkgOiBWb2lkIHsKKyAgICAgICAgaWYoY2FsbGJhY2sgIT0gbnVsbCkKKyAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMDI4ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaHgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisKK2NsYXNzIFRUcmFuc3BvcnRFeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIHsKKworICAgIC8vIFdBUk5JTkc6IFRoZXNlIGFyZSBzdWJqZWN0IHRvIGJlIGV4dGVuZGVkIGluIHRoZSBmdXR1cmUsIHNvIHdlIGNhbid0IHVzZSBlbnVtcworICAgIC8vIHdpdGggSGF4ZSAzLjEuMyBiZWNhdXNlIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL2lzc3Vlcy8zNjQ5CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFVOS05PV04gOiBJbnQgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBOT1RfT1BFTiA6IEludCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEFMUkVBRFlfT1BFTiA6IEludCA9IDI7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFRJTUVEX09VVCA6IEludCA9IDM7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEVORF9PRl9GSUxFIDogSW50ID0gNDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoZXJyb3IgOiBJbnQgPSBVTktOT1dOLCBtZXNzYWdlIDogU3RyaW5nID0gIiIpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSwgZXJyb3IpOworICAgIH0KKworfQorIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MWYzNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5Lmh4CkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKKy8qKgorICogRmFjdG9yeSBjbGFzcyB1c2VkIHRvIGNyZWF0ZSB3cmFwcGVkIGluc3RhbmNlIG9mIFRyYW5zcG9ydHMuCisgKiBUaGlzIGlzIHVzZWQgcHJpbWFyaWx5IGluIHNlcnZlcnMsIHdoaWNoIGdldCBUcmFuc3BvcnRzIGZyb20KKyAqIGEgU2VydmVyVHJhbnNwb3J0IGFuZCB0aGVuIG1heSB3YW50IHRvIG11dGF0ZSB0aGVtIChpLmUuIGNyZWF0ZQorICogYSBCdWZmZXJlZFRyYW5zcG9ydCBmcm9tIHRoZSB1bmRlcmx5aW5nIGJhc2UgdHJhbnNwb3J0KQorICoKKyAqLworY2xhc3MgVFRyYW5zcG9ydEZhY3RvcnkgeworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFJldHVybiBhIHdyYXBwZWQgaW5zdGFuY2Ugb2YgdGhlIGJhc2UgVHJhbnNwb3J0LgorICAgICoKKyAgICAqIEBwYXJhbSB0cmFucyBUaGUgYmFzZSB0cmFuc3BvcnQKKyAgICAqIEByZXR1cm4gV3JhcHBlZCBUcmFuc3BvcnQKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoIHRyYW5zIDogVFRyYW5zcG9ydCkgOiBUVHJhbnNwb3J0IHsKKyAgICAgICAgcmV0dXJuIHRyYW5zOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UV3JhcHBpbmdTZXJ2ZXJUcmFuc3BvcnQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RXcmFwcGluZ1NlcnZlclRyYW5zcG9ydC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjI3MmYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UV3JhcHBpbmdTZXJ2ZXJUcmFuc3BvcnQuaHgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworCisvKgorICAgd3JhcHMgcmVhbCB0cmFuc3BvcnQsIHByb3ZpZGVkIGJ5IGNvbnN0cnVjdG9yCisqLworY2xhc3MgVFdyYXBwaW5nU2VydmVyVHJhbnNwb3J0IGV4dGVuZHMgVFNlcnZlclRyYW5zcG9ydCB7CisKKyAgcHJpdmF0ZSB2YXIgdHJhbnNwb3J0KGRlZmF1bHQsbnVsbCkgOiBUVHJhbnNwb3J0OworCisgIHB1YmxpYyBmdW5jdGlvbiBuZXcodHJhbnNwb3J0IDogVFRyYW5zcG9ydCkgeworICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICB9CisKKyAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIExpc3RlbigpIDogVm9pZAorICB7CisgIH0KKworICBwcml2YXRlIG92ZXJyaWRlIGZ1bmN0aW9uIEFjY2VwdEltcGwoKSA6IFRUcmFuc3BvcnQKKyAgeworICAgIHJldHVybiB0cmFuc3BvcnQ7CisgIH0KKworICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gQ2xvc2UoKSA6IFZvaWQKKyAgeworCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvSGF4ZVRlc3RzLmh4cHJvaiBiL2xpYi9oYXhlL3Rlc3QvSGF4ZVRlc3RzLmh4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmVlZDgyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9IYXhlVGVzdHMuaHhwcm9qCkBAIC0wLDAgKzEsNjkgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8cHJvamVjdCB2ZXJzaW9uPSIyIj4KKyAgPCEtLSBPdXRwdXQgU1dGIG9wdGlvbnMgLS0+CisgIDxvdXRwdXQ+CisgICAgPG1vdmllIG91dHB1dFR5cGU9IkFwcGxpY2F0aW9uIiAvPgorICAgIDxtb3ZpZSBpbnB1dD0iIiAvPgorICAgIDxtb3ZpZSBwYXRoPSJiaW4vSGF4ZVRlc3RzIiAvPgorICAgIDxtb3ZpZSBmcHM9IjMwIiAvPgorICAgIDxtb3ZpZSB3aWR0aD0iODAwIiAvPgorICAgIDxtb3ZpZSBoZWlnaHQ9IjYwMCIgLz4KKyAgICA8bW92aWUgdmVyc2lvbj0iMSIgLz4KKyAgICA8bW92aWUgbWlub3JWZXJzaW9uPSIwIiAvPgorICAgIDxtb3ZpZSBwbGF0Zm9ybT0iQysrIiAvPgorICAgIDxtb3ZpZSBiYWNrZ3JvdW5kPSIjRkZGRkZGIiAvPgorICA8L291dHB1dD4KKyAgPCEtLSBPdGhlciBjbGFzc2VzIHRvIGJlIGNvbXBpbGVkIGludG8geW91ciBTV0YgLS0+CisgIDxjbGFzc3BhdGhzPgorICAgIDxjbGFzcyBwYXRoPSJzcmMiIC8+CisgICAgPGNsYXNzIHBhdGg9Imdlbi1oYXhlIiAvPgorICAgIDxjbGFzcyBwYXRoPSIuLi9zcmMiIC8+CisgIDwvY2xhc3NwYXRocz4KKyAgPCEtLSBCdWlsZCBvcHRpb25zIC0tPgorICA8YnVpbGQ+CisgICAgPG9wdGlvbiBkaXJlY3RpdmVzPSIiIC8+CisgICAgPG9wdGlvbiBmbGFzaFN0cmljdD0iRmFsc2UiIC8+CisgICAgPG9wdGlvbiBub0lubGluZU9uRGVidWc9IkZhbHNlIiAvPgorICAgIDxvcHRpb24gbWFpbkNsYXNzPSJNYWluIiAvPgorICAgIDxvcHRpb24gZW5hYmxlZGVidWc9IkZhbHNlIiAvPgorICAgIDxvcHRpb24gYWRkaXRpb25hbD0iIiAvPgorICA8L2J1aWxkPgorICA8IS0tIGhheGVsaWIgbGlicmFyaWVzIC0tPgorICA8aGF4ZWxpYj4KKyAgICA8IS0tIGV4YW1wbGU6IDxsaWJyYXJ5IG5hbWU9Ii4uLiIgLz4gLS0+CisgIDwvaGF4ZWxpYj4KKyAgPCEtLSBDbGFzcyBmaWxlcyB0byBjb21waWxlIChvdGhlciByZWZlcmVuY2VkIGNsYXNzZXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGluY2x1ZGVkKSAtLT4KKyAgPGNvbXBpbGVUYXJnZXRzPgorICAgIDwhLS0gZXhhbXBsZTogPGNvbXBpbGUgcGF0aD0iLi4uIiAvPiAtLT4KKyAgPC9jb21waWxlVGFyZ2V0cz4KKyAgPCEtLSBQYXRocyB0byBleGNsdWRlIGZyb20gdGhlIFByb2plY3QgRXhwbG9yZXIgdHJlZSAtLT4KKyAgPGhpZGRlblBhdGhzPgorICAgIDxoaWRkZW4gcGF0aD0ib2JqIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iY3BwLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJjc2hhcnAuaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9ImZsYXNoLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJqYXZhLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJqYXZhc2NyaXB0Lmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJtYWtlX2FsbC5iYXQiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJtYWtlX2FsbC5zaCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9Ik1ha2VmaWxlLmFtIiAvPgorICAgIDxoaWRkZW4gcGF0aD0ibmVrby5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0icGhwLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJwcm9qZWN0LmhpZGUiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJweXRob24uaHhtbCIgLz4KKyAgPC9oaWRkZW5QYXRocz4KKyAgPCEtLSBFeGVjdXRlZCBiZWZvcmUgYnVpbGQgLS0+CisgIDxwcmVCdWlsZENvbW1hbmQ+dGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi4vLi4vLi4vY29udHJpYi9hc3luYy10ZXN0L2FnZ3IudGhyaWZ0Cit0aHJpZnQgLXIgLWdlbiBoYXhlICAuLi8uLi8uLi9saWIvcmIvYmVuY2htYXJrL0JlbmNobWFyay50aHJpZnQ8L3ByZUJ1aWxkQ29tbWFuZD4KKyAgPCEtLSBFeGVjdXRlZCBhZnRlciBidWlsZCAtLT4KKyAgPHBvc3RCdWlsZENvbW1hbmQgYWx3YXlzUnVuPSJGYWxzZSIgLz4KKyAgPCEtLSBPdGhlciBwcm9qZWN0IG9wdGlvbnMgLS0+CisgIDxvcHRpb25zPgorICAgIDxvcHRpb24gc2hvd0hpZGRlblBhdGhzPSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIHRlc3RNb3ZpZT0iQ3VzdG9tIiAvPgorICAgIDxvcHRpb24gdGVzdE1vdmllQ29tbWFuZD0iYmluL0hheGVUZXN0cy9NYWluLmV4ZSBzZXJ2ZXIgbXVsdGlwbGV4IiAvPgorICA8L29wdGlvbnM+CisgIDwhLS0gUGx1Z2luIHN0b3JhZ2UgLS0+CisgIDxzdG9yYWdlIC8+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9oYXhlL3Rlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4YjI0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4NSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVENNRCA9ICQoVEhSSUZUKSAtLWdlbiBoYXhlIC1yCitUSFJJRlRURVNUID0gJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CitBR0dSID0gJCh0b3Bfc3JjZGlyKS9jb250cmliL2FzeW5jLXRlc3QvYWdnci50aHJpZnQKK0JFTkNITUFSSyA9ICQodG9wX3NyY2RpcikvbGliL3JiL2JlbmNobWFyay9CZW5jaG1hcmsudGhyaWZ0CisKK0JJTl9DUFAgPSBiaW4vTWFpbi1kZWJ1ZworQklOX1BIUCA9IGJpbi9waHAvTWFpbi1kZWJ1Zy5waHAKKworZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvVGhyaWZ0VGVzdC5oeDogJChUSFJJRlRURVNUKQorCSQoVEhSSUZUQ01EKSAkKFRIUklGVFRFU1QpCisKK2dlbi1oYXhlL3RocmlmdC90ZXN0L0FnZ3IuaHg6ICQoQUdHUikKKwkkKFRIUklGVENNRCkgJChBR0dSKQorCitnZW4taGF4ZS90aHJpZnQvdGVzdC9CZW5jaG1hcmtTZXJ2aWNlLmh4OiAkKEJFTkNITUFSSykKKwkkKFRIUklGVENNRCkgJChCRU5DSE1BUkspCisKK2FsbC1sb2NhbDogJChCSU5fQ1BQKSAkKEJJTl9QSFApCisKKyQoQklOX0NQUCk6IFwKKwkJc3JjLyouaHggXAorCQkuLi9zcmMvb3JnL2FwYWNoZS90aHJpZnQvKiovKi5oeCBcCisJCWdlbi1oYXhlL3RocmlmdC90ZXN0L1RocmlmdFRlc3QuaHggXAorCQlnZW4taGF4ZS90aHJpZnQvdGVzdC9BZ2dyLmh4IFwKKwkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvQmVuY2htYXJrU2VydmljZS5oeAorCSQoSEFYRSkgLS1jd2QgLiAgY3BwLmh4bWwKKworJChCSU5fUEhQKTogXAorCQlzcmMvKi5oeCBcCisJCS4uL3NyYy9vcmcvYXBhY2hlL3RocmlmdC8qKi8qLmh4IFwKKwkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvVGhyaWZ0VGVzdC5oeCBcCisJCWdlbi1oYXhlL3RocmlmdC90ZXN0L0FnZ3IuaHggXAorCQlnZW4taGF4ZS90aHJpZnQvdGVzdC9CZW5jaG1hcmtTZXJ2aWNlLmh4CisJJChIQVhFKSAtLWN3ZCAuICBwaHAuaHhtbAorCisKKyNUT0RPOiBvdGhlciBoYXhlIHRhcmdldHMKKyMgICAgJChIQVhFKSAgLS1jd2QgLiAgY3NoYXJwCisjICAgICQoSEFYRSkgIC0tY3dkIC4gIGZsYXNoCisjICAgICQoSEFYRSkgIC0tY3dkIC4gIGphdmEKKyMgICAgJChIQVhFKSAgLS1jd2QgLiAgamF2YXNjcmlwdAorIyAgICAkKEhBWEUpICAtLWN3ZCAuICBuZWtvCisjICAgICQoSEFYRSkgIC0tY3dkIC4gIHB5dGhvbiAgIyBuZWVkcyBIYXhlIDMuMi4wCisKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLWhheGUgYmluCisKK2NoZWNrOiAkKEJJTl9DUFApICQoQklOX1BIUCkKKwkkKEJJTl9DUFApCisJcGhwIC1mICQoQklOX1BIUCkKKworRVhUUkFfRElTVCA9IFwKKyAgICAgICAgICAgICBzcmMgXAorICAgICAgICAgICAgIGNwcC5oeG1sIFwKKyAgICAgICAgICAgICBjc2hhcnAuaHhtbCBcCisgICAgICAgICAgICAgZmxhc2guaHhtbCBcCisgICAgICAgICAgICAgamF2YS5oeG1sIFwKKyAgICAgICAgICAgICBqYXZhc2NyaXB0Lmh4bWwgXAorICAgICAgICAgICAgIG5la28uaHhtbCBcCisgICAgICAgICAgICAgcGhwLmh4bWwgXAorICAgICAgICAgICAgIHB5dGhvbi5oeG1sIFwKKyAgICAgICAgICAgICBwcm9qZWN0LmhpZGUgXAorICAgICAgICAgICAgIEhheGVUZXN0cy5oeHByb2ogXAorICAgICAgICAgICAgIG1ha2VfYWxsLmJhdCBcCisgICAgICAgICAgICAgbWFrZV9hbGwuc2gKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvY3BwLmh4bWwgYi9saWIvaGF4ZS90ZXN0L2NwcC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczODQ4YTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L2NwcC5oeG1sCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCAuLi9zcmMKKy1jcCBnZW4taGF4ZQorCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNDUFAgdGFyZ2V0CistY3BwIGJpbgorCisjVG8gcHJvZHVjZSA2NCBiaXQgYmluYXJpZXMgdGhlIGZpbGUgc2hvdWxkIGRlZmluZSB0aGUgSFhDUFBfTTY0IGNvbXBpbGUgdmFyaWFibGU6CisjLUQgSFhDUFBfTTY0CisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L2NzaGFycC5oeG1sIGIvbGliL2hheGUvdGVzdC9jc2hhcnAuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzM0YjBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9jc2hhcnAuaHhtbApAQCAtMCwwICsxLDM4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgLi4vc3JjCistY3AgZ2VuLWhheGUKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjQ1NIQVJQIHRhcmdldAorLWNzIGJpbi9UZXN0LmV4ZQorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9mbGFzaC5oeG1sIGIvbGliL2hheGUvdGVzdC9mbGFzaC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMTc2MzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L2ZsYXNoLmh4bWwKQEAgLTAsMCArMSwzOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIC4uL3NyYworLWNwIGdlbi1oYXhlCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI0ZsYXNoIHRhcmdldAorLXN3ZiBiaW4vVGVzdC5zd2YKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvamF2YS5oeG1sIGIvbGliL2hheGUvdGVzdC9qYXZhLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0NzE1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3QvamF2YS5oeG1sCkBAIC0wLDAgKzEsMzggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCAuLi9zcmMKKy1jcCBnZW4taGF4ZQorCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNKYXZhIHRhcmdldAorLWphdmEgYmluL1Rlc3QuamFyCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L2phdmFzY3JpcHQuaHhtbCBiL2xpYi9oYXhlL3Rlc3QvamF2YXNjcmlwdC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZDk5NjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L2phdmFzY3JpcHQuaHhtbApAQCAtMCwwICsxLDQ0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgLi4vc3JjCistY3AgZ2VuLWhheGUKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjSmF2YVNjcmlwdCB0YXJnZXQKKy1qcyBiaW4vVGVzdC5qcworCisjWW91IGNhbiB1c2UgLUQgc291cmNlLW1hcC1jb250ZW50IChyZXF1aXJlcyBIYXhlIDMuMSspIHRvIGhhdmUgdGhlIC5oeCAKKyNmaWxlcyBkaXJlY3RseSBlbWJlZGRlZCBpbnRvIHRoZSBtYXAgZmlsZSwgdGhpcyB3YXkgeW91IG9ubHkgaGF2ZSB0byAKKyN1cGxvYWQgaXQsIGFuZCBpdCB3aWxsIGJlIGFsd2F5cyBpbiBzeW5jIHdpdGggdGhlIGNvbXBpbGVkIC5qcyBldmVuIGlmIAorI3lvdSBtb2RpZnkgeW91ciAuaHggZmlsZXMuCistRCBzb3VyY2UtbWFwLWNvbnRlbnQKKworI0dlbmVyYXRlIHNvdXJjZSBtYXAgYW5kIGFkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvbWFrZV9hbGwuYmF0IGIvbGliL2hheGUvdGVzdC9tYWtlX2FsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMxNGUxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3QvbWFrZV9hbGwuYmF0CkBAIC0wLDAgKzEsNzAgQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworCitzZXRsb2NhbAoraWYgIiVIT01FRFJJVkUlIj09IiIgZ290byBNSVNTSU5HVkFSUworaWYgIiVIT01FUEFUSCUiPT0iIiBnb3RvIE1JU1NJTkdWQVJTCitpZiAiJUhBWEVQQVRIJSI9PSIiIGdvdG8gTk9USU5TVEFMTEVECisKK3NldCBwYXRoPSVIQVhFUEFUSCU7JUhBWEVQQVRIJVwuLlxuZWtvOyVwYXRoJQorCityZW0gIyBpbnZva2UgVGhyaWZ0IGNvbW5waWxlcgordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi5cLi5cLi5cdGVzdFxUaHJpZnRUZXN0LnRocmlmdAordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi5cLi5cLi5cY29udHJpYlxhc3luYy10ZXN0XGFnZ3IudGhyaWZ0Cit0aHJpZnQgLXIgLWdlbiBoYXhlICAuLlwuLlwuLlxsaWJccmJcYmVuY2htYXJrXEJlbmNobWFyay50aHJpZnQKK2lmIGVycm9ybGV2ZWwgMSBnb3RvIFNUT1AKKworcmVtICMgaW52b2tlIEhheGUgY29tcGlsZXIgZm9yIGFsbCB0YXJnZXRzCitmb3IgJSVhIGluICgqLmh4bWwpIGRvICgKKwlyZW0gKiBmaWx0ZXIgUHl0aG9uLCBhcyBpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IEhheGUgMy4xLjMgKGJ1dCB3aWxsIGJlIGluIDMuMS40KQorCWlmIG5vdCAiJSVhIj09InB5dGhvbi5oeG1sIiAoCisJCWVjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJZWNobyBCdWlsZGluZyAlJWEgLi4uCisJCWVjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJaGF4ZSAgLS1jd2QgLiAgJSVhCisJKQorKQorCisKK2VjaG8uCitlY2hvIGRvbmUuCitwYXVzZQorZ290byBlb2YKKworOk5PVElOU1RBTExFRAorZWNobyBGQVRBTDogRWl0aGVyIEhheGUgaXMgbm90IGluc3RhbGxlZCwgb3IgdGhlIEhBWEVQQVRIIHZhcmlhYmxlIGlzIG5vdCBzZXQuCitwYXVzZQorZ290byBlb2YKKworOk1JU1NJTkdWQVJTCitlY2hvIEZBVEFMOiBVbmFibGUgdG8gbG9jYXRlIGhvbWUgZm9sZGVyLgorZWNoby4KK2VjaG8gQm90aCBIT01FRFJJVkUgYW5kIEhPTUVQQVRIIG5lZWQgdG8gYmUgc2V0IHRvIHBvaW50IHRvIHlvdXIgSG9tZSBmb2xkZXIuCitlY2hvIFRoZSBjdXJyZW50IHZhbHVlcyBhcmU6CitlY2hvIEhPTUVEUklWRT0lSE9NRURSSVZFJQorZWNobyBIT01FUEFUSD0lSE9NRVBBVEglCitwYXVzZQorZ290byBlb2YKKworOlNUT1AKK3BhdXNlCitnb3RvIGVvZgorCis6ZW9mCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L21ha2VfYWxsLnNoIGIvbGliL2hheGUvdGVzdC9tYWtlX2FsbC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTJmNWVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9tYWtlX2FsbC5zaApAQCAtMCwwICsxLDQzIEBACisjIS9iaW4vc2gKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIGludm9rZSBUaHJpZnQgY29tbnBpbGVyCit0aHJpZnQgLXIgLWdlbiBoYXhlICAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Cit0aHJpZnQgLXIgLWdlbiBoYXhlICAuLi8uLi8uLi9jb250cmliL2FzeW5jLXRlc3QvYWdnci50aHJpZnQKK3RocmlmdCAtciAtZ2VuIGhheGUgIC4uLy4uLy4uL2xpYi9yYi9iZW5jaG1hcmsvQmVuY2htYXJrLnRocmlmdAorCisjIG91dHB1dCBmb2xkZXIKK2lmIFsgISAtZCBiaW4gXTsgdGhlbgorICBta2RpciAgYmluCitmaQorCisjIGludm9rZSBIYXhlIGNvbXBpbGVyCitmb3IgdGFyZ2V0IGluICouaHhtbDsgZG8gCisgIGVjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgZWNobyBCdWlsZGluZyAke3RhcmdldH0gLi4uCisgIGVjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaWYgWyAhIC1kIGJpbi8ke3RhcmdldH0gXTsgdGhlbgorICAgIG1rZGlyICBiaW4vJHt0YXJnZXR9CisgIGZpCisgIGhheGUgIC0tY3dkIC4gICR7dGFyZ2V0fSAKK2RvbmUKKworCisjZW9mCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L25la28uaHhtbCBiL2xpYi9oYXhlL3Rlc3QvbmVrby5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYjcwYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L25la28uaHhtbApAQCAtMCwwICsxLDM4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgLi4vc3JjCistY3AgZ2VuLWhheGUKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjbmVrbyB0YXJnZXQKKy1uZWtvIGJpbi9UZXN0Lm4KKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvcGhwLmh4bWwgYi9saWIvaGF4ZS90ZXN0L3BocC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZjJiMmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L3BocC5oeG1sCkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCAuLi9zcmMKKy1jcCBnZW4taGF4ZQorCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNQSFAgdGFyZ2V0CistcGhwIGJpbi9waHAvCistLXBocC1mcm9udCBNYWluLWRlYnVnLnBocAorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L3Byb2plY3QuaGlkZSBiL2xpYi9oYXhlL3Rlc3QvcHJvamVjdC5oaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZWY5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L3Byb2plY3QuaGlkZQpAQCAtMCwwICsxLDY3IEBACit7CisgICAgICJ0eXBlIiA6IDAKKyAgICAsInRhcmdldCIgOiA0CisgICAgLCJuYW1lIiA6ICJUZXN0IgorICAgICwibWFpbiIgOiBudWxsCisgICAgLCJwcm9qZWN0UGFja2FnZSIgOiAiIgorICAgICwiY29tcGFueSIgOiAiIgorICAgICwibGljZW5zZSIgOiAiIgorICAgICwidXJsIiA6ICIiCisgICAgLCJ0YXJnZXREYXRhIiA6IFsKKyAgICAgICAgIHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiZmxhc2guaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAxCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogImJpbi9UZXN0LnN3ZiIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJqYXZhc2NyaXB0Lmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMQorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJiaW5cXGluZGV4Lmh0bWwiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAibmVrby5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAibmVrbyBiaW4vVGVzdC5uIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogInBocC5oeG1sIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogImNwcC5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAiYmluL01haW4tZGVidWcuZXhlIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogImphdmEuaHhtbCIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJjc2hhcnAuaHhtbCIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJweXRob24uaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAyCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogInB5dGhvbiBiaW4vVGVzdC5weSIKKyAgICAgICAgfQorICAgIF0KKyAgICAsImZpbGVzIiA6IFsKKyAgICAgICAgIHsKKyAgICAgICAgICAgICAicGF0aCIgOiAic3JjXFxNYWluLmh4IgorICAgICAgICAgICAgLCJ1c2VUYWJzIiA6IHRydWUKKyAgICAgICAgICAgICwiaW5kZW50U2l6ZSIgOiA0CisgICAgICAgICAgICAsImZvbGRlZFJlZ2lvbnMiIDogWworCisgICAgICAgICAgICBdCisgICAgICAgICAgICAsImFjdGl2ZUxpbmUiIDogMTMKKyAgICAgICAgfQorICAgIF0KKyAgICAsImFjdGl2ZUZpbGUiIDogInNyY1xcTWFpbi5oeCIKKyAgICAsIm9wZW5GTFRhcmdldCIgOiBudWxsCisgICAgLCJvcGVuRkxCdWlsZE1vZGUiIDogIkRlYnVnIgorICAgICwicnVuQWN0aW9uVHlwZSIgOiBudWxsCisgICAgLCJydW5BY3Rpb25UZXh0IiA6IG51bGwKKyAgICAsImJ1aWxkQWN0aW9uQ29tbWFuZCIgOiBudWxsCisgICAgLCJoaWRkZW5JdGVtcyIgOiBbCisKKyAgICBdCisgICAgLCJzaG93SGlkZGVuSXRlbXMiIDogZmFsc2UKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L3B5dGhvbi5oeG1sIGIvbGliL2hheGUvdGVzdC9weXRob24uaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDZhMTMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9weXRob24uaHhtbApAQCAtMCwwICsxLDM4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgLi4vc3JjCistY3AgZ2VuLWhheGUKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjUHl0aG9uIHRhcmdldAorLXB5dGhvbiBiaW4vVGVzdC5weQorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9zcmMvTWFpbi5oeCBiL2xpYi9oYXhlL3Rlc3Qvc3JjL01haW4uaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMyNjJkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3Qvc3JjL01haW4uaHgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuKjsgIC8vIGdlbmVyYXRlZCBjb2RlCisKKworZW51bSBXaGF0VGVzdHMgeworICAgIE5vcm1hbDsKKyAgICBNdWx0aXBsZXg7Cit9CisKK2NsYXNzIE1haW4KK3sKKyAgICBzdGF0aWMgcHJpdmF0ZSB2YXIgdGVzdHMgOiBXaGF0VGVzdHMgPSBOb3JtYWw7CisgICAgc3RhdGljIHByaXZhdGUgdmFyIHNlcnZlciA6IEJvb2wgPSBmYWxzZTsKKworICAgIHN0YXRpYyBwcml2YXRlIGlubGluZSB2YXIgQ01ETElORUhFTFAgOiBTdHJpbmcKKyAgICAgICAgPSAiXG5IYXhlVGVzdHMgIFtjbGllbnR8c2VydmVyXSAgW211bHRpcGxleF1cbiIKKyAgICAgICAgKyAiICBjbGllbnR8c2VydmVyICAuLi4gZGV0ZXJtaW5lcyBydW4gbW9kZSBmb3Igc29tZSB0ZXN0cywgZGVmYXVsdCBpcyBjbGllbnRcbiIKKyAgICAgICAgKyAiICBtdWx0aXBsZXggLi4uLi4uLi4gcnVuIG11bHRpcGxleCB0ZXN0IHNlcnZlciBvciBjbGllbnRcbiI7CisKKyAgICBzdGF0aWMgcHJpdmF0ZSBmdW5jdGlvbiBQYXJzZUFyZ3MoKSB7CisgICAgICAgICNpZiBzeXMKKworICAgICAgICB2YXIgYXJncyA9IFN5cy5hcmdzKCk7CisgICAgICAgIGlmICggYXJncyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKCBhcmcgaW4gYXJncykgeworICAgICAgICAgICAgICAgIHN3aXRjaChhcmcudG9Mb3dlckNhc2UoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlICJjbGllbnQiOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgInNlcnZlciIgOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAibXVsdGlwbGV4IiA6CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0cyA9IE11bHRpcGxleDsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyAnSW52YWxpZCBhcmd1bWVudCAiJGFyZyJcbicrQ01ETElORUhFTFA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZAorICAgIH0KKworICAgIHN0YXRpYyBwdWJsaWMgZnVuY3Rpb24gbWFpbigpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgUGFyc2VBcmdzKCk7CisKKyAgICAgICAgICAgIHN3aXRjaCggdGVzdHMpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5vcm1hbDoKKyAgICAgICAgICAgICAgICAgICAgU3RyZWFtVGVzdC5SdW4oc2VydmVyKTsKKyAgICAgICAgICAgICAgICBjYXNlIE11bHRpcGxleDoKKyAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGV4VGVzdC5SdW4oc2VydmVyKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyAiVW5oYW5kbGVkIHRlc3QgbW9kZSAkdGVzdHMiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFjZSgiQWxsIHRlc3RzIGNvbXBsZXRlZC4iKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggZTogRHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoJyRlJyk7CisgICAgICAgICAgICAjaWYgc3lzCisgICAgICAgICAgICBTeXMuZXhpdCgxKTsgIC8vIGluZGljYXRlIGVycm9yCisgICAgICAgICAgICAjZW5kCisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9zcmMvTXVsdGlwbGV4VGVzdC5oeCBiL2xpYi9oYXhlL3Rlc3Qvc3JjL011bHRpcGxleFRlc3QuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgxOGI2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3Qvc3JjL011bHRpcGxleFRlc3QuaHgKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZTsKKworaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgaGF4ZS5JbnQzMjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworLy8gZGVidWcgb25seQoraW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbERlY29yYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm9jZXNzb3I7CisKKy8vIGdlbmVyYXRlZCBjb2RlIGltcG9ydHMKK2ltcG9ydCBBZ2dyOworaW1wb3J0IEFnZ3JJbXBsOworaW1wb3J0IEFnZ3JQcm9jZXNzb3I7CitpbXBvcnQgQmVuY2htYXJrU2VydmljZTsKK2ltcG9ydCBCZW5jaG1hcmtTZXJ2aWNlSW1wbDsKK2ltcG9ydCBCZW5jaG1hcmtTZXJ2aWNlUHJvY2Vzc29yOworaW1wb3J0IEVycm9yOworCisKK2NsYXNzIEJlbmNobWFya1NlcnZpY2VIYW5kbGVyIGltcGxlbWVudHMgQmVuY2htYXJrU2VydmljZQoreworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoKSB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGZpYm9uYWNjaShuIDogaGF4ZS5JbnQzMikgOiBoYXhlLkludDMyIHsKKyAgICAgICAgdHJhY2UoJ0JlbmNobWFyay5maWJvbmFjY2koJG4pJyk7CisgICAgICAgIHZhciBuZXh0IDogSW50OworICAgICAgICB2YXIgcHJldiAgID0gMDsKKyAgICAgICAgdmFyIHJlc3VsdCA9IDE7CisgICAgICAgIHdoaWxlKCBuID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbmV4dCAgID0gcmVzdWx0ICsgcHJldjsKKyAgICAgICAgICAgIHByZXYgICA9IHJlc3VsdDsKKyAgICAgICAgICAgIHJlc3VsdCA9IG5leHQ7CisgICAgICAgICAgICAtLW47CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CisKKworY2xhc3MgQWdnclNlcnZpY2VIYW5kbGVyIGltcGxlbWVudHMgQWdncgoreworICAgIHByaXZhdGUgdmFyIHZhbHVlcyA6IExpc3Q8aGF4ZS5JbnQzMj4gPSBuZXcgTGlzdDxoYXhlLkludDMyPigpOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gYWRkVmFsdWUodmFsdWUgOiBoYXhlLkludDMyKSA6IFZvaWQgICAgeworICAgICAgICB0cmFjZSgnQWdnci5hZGRWYWx1ZSgkdmFsdWUpJyk7CisgICAgICAgIHZhbHVlcy5hZGQoIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWVzKCkgOiBMaXN0PCBoYXhlLkludDMyPiB7CisgICAgICAgIHRyYWNlKCdBZ2dyLmdldFZhbHVlcygpJyk7CisgICAgICAgIHJldHVybiB2YWx1ZXM7CisgICAgfQorfQorCisKKworY2xhc3MgTXVsdGlwbGV4VGVzdCBleHRlbmRzIFRlc3RCYXNlIHsKKworICAgIHByaXZhdGUgaW5saW5lIHN0YXRpYyB2YXIgTkFNRV9CRU5DSE1BUktTRVJWSUNFIDogU3RyaW5nID0gIkJlbmNobWFya1NlcnZpY2UiOworICAgIHByaXZhdGUgaW5saW5lIHN0YXRpYyB2YXIgTkFNRV9BR0dSICAgICAgICAgICAgIDogU3RyaW5nICA9ICJBZ2dyIjsKKworCisgICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBmdW5jdGlvbiBSdW4oc2VydmVyIDogQm9vbCkgOiBWb2lkIHsKKyAgICAgICAgaWYgKCBzZXJ2ZXIpIHsKKyAgICAgICAgICAgIFJ1bk11bHRpcGxleFNlcnZlcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUnVuTXVsdGlwbGV4Q2xpZW50KCk7CisgICAgICAgICAgICBSdW5EZWZhdWx0Q2xpZW50KCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIHJ1biB0aGUgbXVsdGlwbGV4IHNlcnZlcgorICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgZnVuY3Rpb24gUnVuTXVsdGlwbGV4U2VydmVyKCkgOiBWb2lkICB7CisgICAgICAgdHJ5CisgICAgICAgeworICAgICAgICAgICAgdmFyIGJlbmNoSGFuZGxlciA6IEJlbmNobWFya1NlcnZpY2UgPSBuZXcgQmVuY2htYXJrU2VydmljZUhhbmRsZXIoKTsKKyAgICAgICAgICAgIHZhciBiZW5jaFByb2Nlc3NvciA6IFRQcm9jZXNzb3IgPSBuZXcgQmVuY2htYXJrU2VydmljZVByb2Nlc3NvciggYmVuY2hIYW5kbGVyKTsKKworICAgICAgICAgICAgdmFyIGFnZ3JIYW5kbGVyIDogQWdnciA9IG5ldyBBZ2dyU2VydmljZUhhbmRsZXIoKTsKKyAgICAgICAgICAgIHZhciBhZ2dyUHJvY2Vzc29yIDogVFByb2Nlc3NvciA9IG5ldyBBZ2dyUHJvY2Vzc29yKCBhZ2dySGFuZGxlcik7CisKKyAgICAgICAgICAgIHZhciBtdWx0aXBsZXggOiBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgICAgICAgICAgICBtdWx0aXBsZXguUmVnaXN0ZXJQcm9jZXNzb3IoIE5BTUVfQkVOQ0hNQVJLU0VSVklDRSwgYmVuY2hQcm9jZXNzb3IsIHRydWUpOyAgLy8gZGVmYXVsdAorICAgICAgICAgICAgbXVsdGlwbGV4LlJlZ2lzdGVyUHJvY2Vzc29yKCBOQU1FX0FHR1IsIGFnZ3JQcm9jZXNzb3IpOworCisgICAgICAgICAgICAvLyBwcm90b2NvbCt0cmFuc3BvcnQgc3RhY2sKKyAgICAgICAgICAgIHZhciBwcm90ZmFjdCA6IFRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSh0cnVlLHRydWUpOworICAgICAgICAgICAgdmFyIHNlcnZlcnRyYW5zIDogVFNlcnZlclRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0KCA5MDkwLCA1LCBmYWxzZSk7CisgICAgICAgICAgICB2YXIgdHJhbnNmYWN0IDogVFRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoKTsKKworICAgICAgICAgICAgdmFyIHNlcnZlciA6IFRTZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlciggbXVsdGlwbGV4LCBzZXJ2ZXJ0cmFucywgdHJhbnNmYWN0LCBwcm90ZmFjdCk7CisKKyAgICAgICAgICAgIHRyYWNlKCJTdGFydGluZyB0aGUgc2VydmVyIC4uLiIpOworICAgICAgICAgICAgc2VydmVyLlNlcnZlKCk7CisgICAgICAgfQorICAgICAgICBjYXRjaCggZSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KGZhbHNlLCcke2UuZXJyb3JJRH0gJHtlLmVycm9yTXNnfScpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKCBlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KGZhbHNlLCckZScpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyBydW4gbXVsdGlwbGV4IGNsaWVudCBhZ2FpbnN0IG11bHRpcGxleCBzZXJ2ZXIKKyAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIGZ1bmN0aW9uIFJ1bk11bHRpcGxleENsaWVudCgpIDogVm9pZCAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRyYW5zIDogVFRyYW5zcG9ydDsKKyAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOworICAgICAgICAgICAgdHJhbnMgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgICB0cmFucy5vcGVuKCk7CisKKyAgICAgICAgICAgIHZhciBwcm90b2NvbCA6IFRQcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnMsdHJ1ZSx0cnVlKTsKKyAgICAgICAgICAgIHZhciBtdWx0aXBsZXggOiBUTXVsdGlwbGV4ZWRQcm90b2NvbDsKKworICAgICAgICAgICAgbXVsdGlwbGV4ID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKCBwcm90b2NvbCwgTkFNRV9CRU5DSE1BUktTRVJWSUNFKTsKKyAgICAgICAgICAgIHZhciBiZW5jaCA9IG5ldyBCZW5jaG1hcmtTZXJ2aWNlSW1wbCggbXVsdGlwbGV4KTsKKworICAgICAgICAgICAgbXVsdGlwbGV4ID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKCBwcm90b2NvbCwgTkFNRV9BR0dSKTsKKyAgICAgICAgICAgIHZhciBhZ2dyID0gbmV3IEFnZ3JJbXBsKCBtdWx0aXBsZXgpOworCisgICAgICAgICAgICB0cmFjZSgnY2FsbGluZyBhZ2dyLmFkZCggYmVuY2guZmlibygpKS4uLicpOworICAgICAgICAgICAgZm9yKCBpIGluIDEgLi4uIDEwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCckaScpOworICAgICAgICAgICAgICAgIGFnZ3IuYWRkVmFsdWUoIGJlbmNoLmZpYm9uYWNjaShpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyYWNlKCdjYWxsaW5nIGFnZ3IgLi4uJyk7CisgICAgICAgICAgICB2YXIgaSA9IDE7CisgICAgICAgICAgICB2YXIgdmFsdWVzID0gYWdnci5nZXRWYWx1ZXMoKTsKKyAgICAgICAgICAgIFRlc3RCYXNlLkV4cGVjdCh2YWx1ZXMgIT0gbnVsbCwnYWdnci5nZXRWYWx1ZXMoKSA9PSBudWxsJyk7CisgICAgICAgICAgICBmb3IoIGsgaW4gdmFsdWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCdmaWIoJGkpID0gJGsnKTsKKyAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyYW5zLmNsb3NlKCk7CisgICAgICAgICAgICB0cmFjZSgnZG9uZS4nKTsKKworICAgICAgICB9CisgICAgICAgIGNhdGNoKCBlIDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0QmFzZS5FeHBlY3QoZmFsc2UsJyR7ZS5lcnJvcklEfSAke2UuZXJyb3JNc2d9Jyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goIGUgOiBURXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0QmFzZS5FeHBlY3QoZmFsc2UsJyRlJyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIHJ1biBub24tbXVsdGlwbGV4IGNsaWVudCBhZ2FpbnN0IG11bHRpcGxleCBzZXJ2ZXIgdG8gdGVzdCBkZWZhdWx0IGZhbGxiYWNrCisgICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBmdW5jdGlvbiBSdW5EZWZhdWx0Q2xpZW50KCkgOiBWb2lkICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdHJhbnMgOiBUVHJhbnNwb3J0OworICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCk7CisgICAgICAgICAgICB0cmFucyA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKTsKKyAgICAgICAgICAgIHRyYW5zLm9wZW4oKTsKKworICAgICAgICAgICAgdmFyIHByb3RvY29sIDogVFByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucyx0cnVlLHRydWUpOworCisgICAgICAgICAgICB2YXIgYmVuY2ggPSBuZXcgQmVuY2htYXJrU2VydmljZUltcGwoIHByb3RvY29sKTsKKworICAgICAgICAgICAgdHJhY2UoJ2NhbGxpbmcgYmVuY2ggKHZpYSBkZWZhdWx0KSAuLi4nKTsKKyAgICAgICAgICAgIGZvciggaSBpbiAxIC4uLiAxMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgayA9IGJlbmNoLmZpYm9uYWNjaShpKTsKKyAgICAgICAgICAgICAgICB0cmFjZSgnZmliKCRpKSA9ICRrJyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyYW5zLmNsb3NlKCk7CisgICAgICAgICAgICB0cmFjZSgnZG9uZS4nKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggZSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KGZhbHNlLCcke2UuZXJyb3JJRH0gJHtlLmVycm9yTXNnfScpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKCBlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KGZhbHNlLCckZScpOworICAgICAgICB9CisgICAgfQorCit9CisKKwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9zcmMvU3RyZWFtVGVzdC5oeCBiL2xpYi9oYXhlL3Rlc3Qvc3JjL1N0cmVhbVRlc3QuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ0ZjFlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3Qvc3JjL1N0cmVhbVRlc3QuaHgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlOworCitpbXBvcnQgaGF4ZS5JbnQ2NDsKK2ltcG9ydCBzeXMuRmlsZVN5c3RlbTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworaW1wb3J0IHRocmlmdC50ZXN0Lio7ICAvLyBnZW5lcmF0ZWQgY29kZQorCisKK2NsYXNzIFN0cmVhbVRlc3QgZXh0ZW5kcyBUZXN0QmFzZSB7CisKKworICAgIHByaXZhdGUgaW5saW5lIHN0YXRpYyB2YXIgdG1wZmlsZSA6IFN0cmluZyA9ICJkYXRhLnRtcCI7CisKKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIE1ha2VUZXN0RGF0YSgpIDogWHRydWN0IHsKKyAgICAgICAgdmFyIGRhdGEgOiBYdHJ1Y3QgPSBuZXcgWHRydWN0KCk7CisgICAgICAgIGRhdGEuc3RyaW5nX3RoaW5nID0gIlN0cmVhbXRlc3QiOworICAgICAgICBkYXRhLmJ5dGVfdGhpbmcgPSAtMTI4OworICAgICAgICBkYXRhLmkzMl90aGluZyA9IDQ3MTE7CisgICAgICAgIGRhdGEuaTY0X3RoaW5nID0gSW50NjQubWFrZSgweDEyMzQ1Njc4LDB4OUFCQ0RFRjApOworICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFdyaXRlRGF0YSgpIDogWHRydWN0CisgICAgeworICAgICAgICB2YXIgc3RyZWFtIDogVFN0cmVhbSA9IG5ldyBURmlsZVN0cmVhbSggdG1wZmlsZSwgQ3JlYXRlTmV3KTsKKyAgICAgICAgdmFyIHRyYW5zIDogVFRyYW5zcG9ydCA9IG5ldyBUU3RyZWFtVHJhbnNwb3J0KCBudWxsLCBzdHJlYW0pOworICAgICAgICB2YXIgcHJvdCA9IG5ldyBUSlNPTlByb3RvY29sKCB0cmFucyk7CisKKyAgICAgICAgdmFyIGRhdGEgPSBNYWtlVGVzdERhdGEoKTsKKyAgICAgICAgZGF0YS53cml0ZShwcm90KTsKKyAgICAgICAgdHJhbnMuY2xvc2UoKTsKKworICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFJlYWREYXRhKCkgOiBYdHJ1Y3QKKyAgICB7CisgICAgICAgIHZhciBzdHJlYW0gOiBUU3RyZWFtID0gbmV3IFRGaWxlU3RyZWFtKCB0bXBmaWxlLCBSZWFkKTsKKyAgICAgICAgdmFyIHRyYW5zIDogVFRyYW5zcG9ydCA9IG5ldyBUU3RyZWFtVHJhbnNwb3J0KCBzdHJlYW0sIG51bGwpOworICAgICAgICB2YXIgcHJvdCA9IG5ldyBUSlNPTlByb3RvY29sKCB0cmFucyk7CisKKyAgICAgICAgdmFyIGRhdGEgOiBYdHJ1Y3QgPSBuZXcgWHRydWN0KCk7CisgICAgICAgIGRhdGEucmVhZChwcm90KTsKKyAgICAgICAgdHJhbnMuY2xvc2UoKTsKKworICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIGZ1bmN0aW9uIFJ1bihzZXJ2ZXIgOiBCb29sKSA6IFZvaWQKKyAgICB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgd3JpdHRlbiA9IFdyaXRlRGF0YSgpOworICAgICAgICAgICAgdmFyIHJlYWQgPSBSZWFkRGF0YSgpOworICAgICAgICAgICAgRmlsZVN5c3RlbS5kZWxldGVGaWxlKHRtcGZpbGUpOworCisgICAgICAgICAgICBUZXN0QmFzZS5FeHBlY3QoIHJlYWQuc3RyaW5nX3RoaW5nID09IHdyaXR0ZW4uc3RyaW5nX3RoaW5nLCAic3RyaW5nIGRhdGEiKTsKKyAgICAgICAgICAgIFRlc3RCYXNlLkV4cGVjdCggcmVhZC5ieXRlX3RoaW5nID09IHdyaXR0ZW4uYnl0ZV90aGluZywgImJ5dGUgZGF0YSIpOworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KCByZWFkLmkzMl90aGluZyA9PSB3cml0dGVuLmkzMl90aGluZywgImkzMiBkYXRhIik7CisgICAgICAgICAgICBUZXN0QmFzZS5FeHBlY3QoIEludDY0LmNvbXBhcmUoIHJlYWQuaTY0X3RoaW5nLCB3cml0dGVuLmk2NF90aGluZykgPT0gMCwgImk2NCBkYXRhIik7CisKKyAgICAgICAgfSBjYXRjaChlOkR5bmFtaWMpIHsKKyAgICAgICAgICAgIEZpbGVTeXN0ZW0uZGVsZXRlRmlsZSh0bXBmaWxlKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICB9CisKK30KKworCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L3NyYy9UZXN0QmFzZS5oeCBiL2xpYi9oYXhlL3Rlc3Qvc3JjL1Rlc3RCYXNlLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMzI3NzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L3NyYy9UZXN0QmFzZS5oeApAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7CisKKworY2xhc3MgVGVzdEJhc2UgeworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBuZXcoKSB7CisgICAgICAgIC8vIG92ZXJyaWRlLCBpZiBuZWNlc3NhcnkKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFJ1bihzZXJ2ZXIgOiBCb29sKSA6IFZvaWQgeworICAgICAgICAgIHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBFeHBlY3QoIGV4cHIgOiBCb29sLCBpbmZvIDogU3RyaW5nLCA/cG9zIDogaGF4ZS5Qb3NJbmZvcykgOiBWb2lkIHsKKyAgICAgICAgaWYoICEgZXhwcikgeworICAgICAgICAgICAgdGhyb3cgKCdUZXN0ICIkaW5mbyIgZmFpbGVkIGF0ICcrcG9zLm1ldGhvZE5hbWUrJyBpbiAnK3Bvcy5maWxlTmFtZSsnOicrcG9zLmxpbmVOdW1iZXIpOworICAgICAgICB9CisgICAgfQorCit9CisgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hzL0NNYWtlTGlzdHMudHh0IGIvbGliL2hzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMGEzMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw5MyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgUmVidWlsZCB3aGVuIGFueSBvZiB0aGVzZSBmaWxlcyBjaGFuZ2VzCitzZXQoaGFza2VsbF9zb3VyY2VzCisgICAgc3JjL1RocmlmdC5ocworICAgIHNyYy9UaHJpZnQvQXJiaXRyYXJpZXMuaHMKKyAgICBzcmMvVGhyaWZ0L1Byb3RvY29sLmhzCisgICAgc3JjL1RocmlmdC9Qcm90b2NvbC9CaW5hcnkuaHMKKyAgICBzcmMvVGhyaWZ0L1Byb3RvY29sL0NvbXBhY3QuaHMKKyAgICBzcmMvVGhyaWZ0L1Byb3RvY29sL0pTT04uaHMKKyAgICBzcmMvVGhyaWZ0L1NlcnZlci5ocworICAgIHNyYy9UaHJpZnQvVHJhbnNwb3J0LmhzCisgICAgc3JjL1RocmlmdC9UcmFuc3BvcnQvRW1wdHkuaHMKKyAgICBzcmMvVGhyaWZ0L1RyYW5zcG9ydC9GcmFtZWQuaHMKKyAgICBzcmMvVGhyaWZ0L1RyYW5zcG9ydC9IYW5kbGUuaHMKKyAgICBzcmMvVGhyaWZ0L1RyYW5zcG9ydC9IdHRwQ2xpZW50LmhzCisgICAgc3JjL1RocmlmdC9UcmFuc3BvcnQvSU9CdWZmZXIuaHMKKyAgICBzcmMvVGhyaWZ0L1R5cGVzLmhzCisgICAgdGhyaWZ0LmNhYmFsCispCisKK2lmKEJVSUxEX1RFU1RJTkcpCisgICAgbGlzdChBUFBFTkQgaGFza2VsbF9zb3J1Y2VzCisgICAgICAgIHRlc3QvU3BlYy5ocworICAgICAgICB0ZXN0L0JpbmFyeVNwZWMuaHMKKyAgICAgICAgdGVzdC9Db21wYWN0U3BlYy5ocworICAgICAgICB0ZXN0L0pTT05TcGVjLmhzCisgICAgKQorICAgIHNldChoc19lbmFibGVfdGVzdCAiLS1lbmFibGUtdGVzdHMiKQorZW5kaWYoKQorCitzZXQoaGFza2VsbF9hcnRpZmFjdHMgdGhyaWZ0X2NhYmFsLnN0YW1wKQorIyBBZGRpbmcgKi5oaSBmaWxlcyBzbyB0aGF0IGFueSBtaXNzaW5nIGZpbGUgdHJpZ2dlcnMgdGhlIGJ1aWxkCitmb3JlYWNoKFNSQyAke2hhc2tlbGxfc291cmNlc30pCisgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChFWCAke1NSQ30gRVhUKQorICAgIGlmKCR7RVh9IFNUUkVRVUFMICIuaHMiKQorICAgICAgICBmaWxlKFJFTEFUSVZFX1BBVEggUkVMICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7U1JDfSkKKyAgICAgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChESVIgJHtSRUx9IERJUkVDVE9SWSkKKyAgICAgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChCQVNFICR7UkVMfSBOQU1FX1dFKQorICAgICAgICBsaXN0KEFQUEVORCBoYXNrZWxsX2FydGlmYWN0cyBkaXN0L2J1aWxkLyR7RElSfS8ke0JBU0V9LmhpKQorICAgIGVuZGlmKCkKK2VuZGZvcmVhY2goKQorCitpZihDTUFLRV9CVUlMRF9UWVBFIFNUUkVRVUFMICJEZWJ1ZyIpCisgICAgc2V0KGhzX29wdGltaXplIC1PMCkKK2Vsc2VpZihDTUFLRV9CVUlMRF9UWVBFIFNUUkVRVUFMICJSZWxlYXNlIikKKyAgICBzZXQoaHNfb3B0aW1pemUgLU8xKQorZW5kaWYoKQorCithZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgT1VUUFVUICR7aGFza2VsbF9hcnRpZmFjdHN9CisgICAgQ09NTUFORCAke0NBQkFMfSB1cGRhdGUKKyAgICAjIEJ1aWxkIGRlcGVuZGVuY2llcyBmaXJzdCB3aXRob3V0IC0tYnVpbGRkaXIsIG90aGVyd2lzZSBpdCBmYWlscy4KKyAgICBDT01NQU5EICR7Q0FCQUx9IGluc3RhbGwgLS1vbmx5LWRlcGVuZGVuY2llcyAke2hzX2VuYWJsZV90ZXN0fQorICAgIENPTU1BTkQgJHtDQUJBTH0gY29uZmlndXJlICR7aHNfb3B0aW1pemV9ICR7aHNfZW5hYmxlX3Rlc3R9IC0tYnVpbGRkaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2Rpc3QKKyAgICBDT01NQU5EICR7Q0FCQUx9IGJ1aWxkIC0tYnVpbGRkaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2Rpc3QKKyAgICBDT01NQU5EICR7Q0FCQUx9IGluc3RhbGwgLS1idWlsZGRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZGlzdAorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSB0b3VjaCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0X2NhYmFsLnN0YW1wCisgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CisgICAgREVQRU5EUyAke2hhc2tlbGxfc291cmNlc30KKyAgICBDT01NRU5UICJCdWlsZGluZyBIYXNrZWxsIGxpYnJhcnkiKQorCithZGRfY3VzdG9tX3RhcmdldChoYXNrZWxsX2xpYnJhcnkgQUxMCisgICAgREVQRU5EUyAke2hhc2tlbGxfYXJ0aWZhY3RzfSkKKworaWYoQlVJTERfVEVTVElORykKKyAgICBhZGRfdGVzdChOQU1FIEhhc2tlbGxDYWJhbENoZWNrCisgICAgICAgICAgICBDT01NQU5EICR7Q0FCQUx9IGNoZWNrCisgICAgICAgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCisgICAgYWRkX3Rlc3QoTkFNRSBIYXNrZWxsQ2FiYWxUZXN0CisgICAgICAgICAgICAjIENhYmFsIGZhaWxzIHRvIGZpbmQgYnVpbHQgZXhlY3V0YWJsZSB3aGVuIC0tYnVpbGRkaXIgaXMgc3BlY2lmaWVkLgorICAgICAgICAgICAgIyBTbyB3ZSBpbnZva2UgdGhlIGV4ZWN1dGFibGUgZGlyZWN0bHkuCisgICAgICAgICAgICAjIENPTU1BTkQgJHtDQUJBTH0gdGVzdCAtLWJ1aWxkZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9kaXN0CisgICAgICAgICAgICAjIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSkKKyAgICAgICAgICAgIENPTU1BTkQgZGlzdC9idWlsZC9zcGVjL3NwZWMpCitlbmRpZigpCmRpZmYgLS1naXQgYS9saWIvaHMvTWFrZWZpbGUuYW0gYi9saWIvaHMvTWFrZWZpbGUuYW0KaW5kZXggMzQ2NGE0Zi4uM2NkOGI1NyAxMDA2NDQKLS0tIGEvbGliL2hzL01ha2VmaWxlLmFtCisrKyBiL2xpYi9ocy9NYWtlZmlsZS5hbQpAQCAtMTgsMjYgKzE4LDMzIEBACiAjCiAKIEVYVFJBX0RJU1QgPSBcCi0gIExJQ0VOU0UgXAotICBSRUFETUUgXAotICBTZXR1cC5saHMgXAotICBUT0RPIFwKLSAgVGhyaWZ0LmNhYmFsIFwKLSAgc3JjCisJY29kaW5nX3N0YW5kYXJkcy5tZCBcCisJQ01ha2VMaXN0cy50eHQgXAorCUxJQ0VOU0UgXAorCVJFQURNRS5tZCBcCisJU2V0dXAubGhzIFwKKwlUT0RPIFwKKwl0aHJpZnQuY2FiYWwgXAorCXNyYyBcCisJdGVzdAogCiBhbGwtbG9jYWw6Ci0JJChSVU5IQVNLRUxMKSBTZXR1cC5saHMgY29uZmlndXJlICQoQ0FCQUxfQ09ORklHVVJFX0ZMQUdTKQotCSQoUlVOSEFTS0VMTCkgU2V0dXAubGhzIGJ1aWxkCisJJChDQUJBTCkgdXBkYXRlCisJJChDQUJBTCkgaW5zdGFsbAogCiBpbnN0YWxsLWV4ZWMtaG9vazoKLQkkKFJVTkhBU0tFTEwpIFNldHVwLmxocyBpbnN0YWxsCisJJChDQUJBTCkgaW5zdGFsbAogCiAjIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBIYXNrZWxsIGlzIG5vdCBjb25maWd1cmVkLgogY2xlYW4tbG9jYWw6Ci0JJChSVU5IQVNLRUxMKSBTZXR1cC5saHMgY2xlYW4KKwkkKENBQkFMKSBjbGVhbgogCiBtYWludGFpbmVyLWNsZWFuLWxvY2FsOgotCSQoUlVOSEFTS0VMTCkgU2V0dXAubGhzIGNsZWFuCisJJChDQUJBTCkgY2xlYW4KIAogY2hlY2stbG9jYWw6CiAJJChDQUJBTCkgY2hlY2sKKwkkKENBQkFMKSBpbnN0YWxsIC0tb25seS1kZXBlbmRlbmNpZXMgLS1lbmFibGUtdGVzdHMKKwkkKENBQkFMKSBjb25maWd1cmUgLS1lbmFibGUtdGVzdHMKKwkkKENBQkFMKSBidWlsZAorCSQoQ0FCQUwpIHRlc3QKZGlmZiAtLWdpdCBhL2xpYi9ocy9SRUFETUUgYi9saWIvaHMvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmZlNjk5Li4wMDAwMDAwCi0tLSBhL2xpYi9ocy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi1IYXNrZWxsIFRocmlmdCBCaW5kaW5ncwotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1Db21waWxlCi09PT09PT09Ci0KLVVzZSBDYWJhbCB0byBjb21waWxlIGFuZCBpbnN0YWxsOyAuL2NvbmZpZ3VyZSB1c2VzIENhYmFsIHVuZGVybmVhdGgsIGFuZCB0aGF0Ci1wYXRoIGlzIG5vdCB5ZXQgd2VsbCB0ZXN0ZWQuIFRocmlmdCdzIGxpYnJhcnkgYW5kIGdlbmVyYXRlZCBjb2RlIHNob3VsZCBjb21waWxlCi13aXRoIHByZXR0eSBtdWNoIGFueSBHSEMgZXh0ZW5zaW9ucyBvciB3YXJuaW5ncyB5b3UgZW5hYmxlIChvciBkaXNhYmxlKS4KLVBsZWFzZSByZXBvcnQgdGhpcyBub3QgYmVpbmcgdGhlIGNhc2UgYXMgYSBidWcgb24KLWh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9zZWN1cmUvQ3JlYXRlSXNzdWUhZGVmYXVsdC5qc3BhCi0KLUNoYW5jZXMgeW91J2xsIG5lZWQgdG8gbXVjayBhIGJpdCB3aXRoIENhYmFsIGZsYWdzIHRvIGluc3RhbGwgVGhyaWZ0OgotCi1DQUJBTF9DT05GSUdVUkVfRkxBR1M9Ii0tdXNlciIgLi9jb25maWd1cmUKLQotQmFzZSBUeXBlcwotPT09PT09PT09PQotCi1UaGUgbWFwcGluZyBmcm9tIFRocmlmdCB0eXBlcyB0byBIYXNrZWxsJ3MgaXM6Ci0KLSAqIGRvdWJsZSAtPiBEb3VibGUKLSAqIGJ5dGUgLT4gRGF0YS5Xb3JkLldvcmQ4Ci0gKiBpMTYgLT4gRGF0YS5JbnQuSW50MTYKLSAqIGkzMiAtPiBEYXRhLkludC5JbnQzMgotICogaTY0IC0+IERhdGEuSW50LkludDY0Ci0gKiBzdHJpbmcgLT4gU3RyaW5nCi0gKiBiaW5hcnkgLT4gRGF0YS5CeXRlU3RyaW5nLkxhenkKLSAqIGJvb2wgLT4gQm9vbGVhbgotCi1FbnVtcwotPT09PT0KLQotQmVjb21lIEhhc2tlbGwgJ2RhdGEnIHR5cGVzLiBVc2UgZnJvbUVudW0gdG8gZ2V0IG91dCB0aGUgaW50IHZhbHVlLgotCi1TdHJ1Y3RzCi09PT09PT09Ci0KLUJlY29tZSByZWNvcmRzLiBGaWVsZCBsYWJlbHMgYXJlIHVnbHksIG9mIHRoZSBmb3JtIGZfU1RSVUNUTkFNRV9GSUVMRE5BTUUuIEFsbAotZmllbGRzIGFyZSBNYXliZSB0eXBlcy4KLQotRXhjZXB0aW9ucwotPT09PT09PT09PQotCi1JZGVudGljYWwgdG8gc3RydWN0cy4gVGhyb3cgdGhlbSB3aXRoIHRocm93RHluLiBDYXRjaCB0aGVtIHdpdGggY2F0Y2hEeW4uCi0KLUNsaWVudAotPT09PT09Ci0KLUp1c3QgYSBidW5jaCBvZiBmdW5jdGlvbnMuIFlvdSBtYXkgaGF2ZSB0byBpbXBvcnQgYSBidW5jaCBvZiBjbGllbnQgZmlsZXMgdG8KLWRlYWwgd2l0aCBpbmhlcml0YW5jZS4KLQotSW50ZXJmYWNlCi09PT09PT09PT0KLQotWW91IHNob3VsZCBvbmx5IGhhdmUgdG8gaW1wb3J0IHRoZSBsYXN0IG9uZSBpbiB0aGUgY2hhaW4gb2YgaW5oZXJpdG9ycy4gVG8gbWFrZQotYW4gaW50ZXJmYWNlLCBkZWNsYXJlIGEgbGFiZWw6Ci0KLSAgZGF0YSBNeUlmYWNlID0gTXlJZmFjZQotCi1hbmQgdGhlbiBkZWNsYXJlIGl0IGFuIGluc3RhbmNlIG9mIGVhY2ggaWZhY2UgY2xhc3MsIHN0YXJ0aW5nIHdpdGggdGhlIHN1cGVyZXN0Ci1jbGFzcyBhbmQgcHJvY2VkaW5nIGRvd24gKGFsbCB0aGUgd2hpbGUgZGVmaW5pbmcgdGhlIG1ldGhvZHMpLiAgVGhlbiBwYXNzIHlvdXIKLWxhYmVsIHRvIHByb2Nlc3MgYXMgdGhlIGhhbmRsZXIuCi0KLVByb2Nlc3NvcgotPT09PT09PT09Ci0KLUp1c3QgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgaGFuZGxlciBsYWJlbCwgcHJvdG9jb2xzLiBJdCBjYWxscyB0aGUKLXN1cGVyY2xhc3NlcyBwcm9jZXNzIGlmIHRoZXJlIGlzIGEgc3VwZXJjbGFzcy4KLQpkaWZmIC0tZ2l0IGEvbGliL2hzL1JFQURNRS5tZCBiL2xpYi9ocy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhMGE3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy9SRUFETUUubWQKQEAgLTAsMCArMSw5OSBAQAorSGFza2VsbCBUaHJpZnQgQmluZGluZ3MKKworTGljZW5zZQorPT09PT09PQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworQ29tcGlsZQorPT09PT09PQorCitVc2UgQ2FiYWwgdG8gY29tcGlsZSBhbmQgaW5zdGFsbDsgLi9jb25maWd1cmUgdXNlcyBDYWJhbCB1bmRlcm5lYXRoLCBhbmQgdGhhdAorcGF0aCBpcyBub3QgeWV0IHdlbGwgdGVzdGVkLiBUaHJpZnQncyBsaWJyYXJ5IGFuZCBnZW5lcmF0ZWQgY29kZSBzaG91bGQgY29tcGlsZQord2l0aCBwcmV0dHkgbXVjaCBhbnkgR0hDIGV4dGVuc2lvbnMgb3Igd2FybmluZ3MgeW91IGVuYWJsZSAob3IgZGlzYWJsZSkuCitQbGVhc2UgcmVwb3J0IHRoaXMgbm90IGJlaW5nIHRoZSBjYXNlIGFzIGEgYnVnIG9uCitodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvc2VjdXJlL0NyZWF0ZUlzc3VlIWRlZmF1bHQuanNwYQorCitDaGFuY2VzIHlvdSdsbCBuZWVkIHRvIG11Y2sgYSBiaXQgd2l0aCBDYWJhbCBmbGFncyB0byBpbnN0YWxsIFRocmlmdDoKKworQ0FCQUxfQ09ORklHVVJFX0ZMQUdTPSItLXVzZXIiIC4vY29uZmlndXJlCisKK0Jhc2UgVHlwZXMKKz09PT09PT09PT0KKworVGhlIG1hcHBpbmcgZnJvbSBUaHJpZnQgdHlwZXMgdG8gSGFza2VsbCdzIGlzOgorCisgKiBkb3VibGUgLT4gRG91YmxlCisgKiBieXRlIC0+IERhdGEuSW50LkludDgKKyAqIGkxNiAtPiBEYXRhLkludC5JbnQxNgorICogaTMyIC0+IERhdGEuSW50LkludDMyCisgKiBpNjQgLT4gRGF0YS5JbnQuSW50NjQKKyAqIHN0cmluZyAtPiBUZXh0CisgKiBiaW5hcnkgLT4gRGF0YS5CeXRlU3RyaW5nLkxhenkKKyAqIGJvb2wgLT4gQm9vbGVhbgorCitFbnVtcworPT09PT0KKworQmVjb21lIEhhc2tlbGwgJ2RhdGEnIHR5cGVzLiBVc2UgZnJvbUVudW0gdG8gZ2V0IG91dCB0aGUgaW50IHZhbHVlLgorCitMaXN0cworPT09PT0KKworQmVjb21lIERhdGEuVmVjdG9yLlZlY3RvciBmcm9tIHRoZSB2ZWN0b3IgcGFja2FnZS4KKworTWFwcyBhbmQgU2V0cworPT09PT09PT09PT09PQorCitCZWNvbWUgRGF0YS5IYXNoTWFwLlN0cmljdC5NYXAgYW5kIERhdGEuSGFzaFNldC5TZXQgZnJvbSB0aGUKK3Vub3JkZXJlZC1jb250YWluZXJzIHBhY2thZ2UuCisKK1N0cnVjdHMKKz09PT09PT0KKworQmVjb21lIHJlY29yZHMuIEZpZWxkIGxhYmVscyBhcmUgdWdseSwgb2YgdGhlIGZvcm0gZl9TVFJVQ1ROQU1FX0ZJRUxETkFNRS4gQWxsCitmaWVsZHMgYXJlIE1heWJlIHR5cGVzLgorCitFeGNlcHRpb25zCis9PT09PT09PT09CisKK0lkZW50aWNhbCB0byBzdHJ1Y3RzLiBVc2UgdGhlbSB3aXRoIHRocm93IGFuZCBjYXRjaCBmcm9tIENvbnRyb2wuRXhjZXB0aW9uLgorCitDbGllbnQKKz09PT09PQorCitKdXN0IGEgYnVuY2ggb2YgZnVuY3Rpb25zLiBZb3UgbWF5IGhhdmUgdG8gaW1wb3J0IGEgYnVuY2ggb2YgY2xpZW50IGZpbGVzIHRvCitkZWFsIHdpdGggaW5oZXJpdGFuY2UuCisKK0ludGVyZmFjZQorPT09PT09PT09CisKK1lvdSBzaG91bGQgb25seSBoYXZlIHRvIGltcG9ydCB0aGUgbGFzdCBvbmUgaW4gdGhlIGNoYWluIG9mIGluaGVyaXRvcnMuIFRvIG1ha2UKK2FuIGludGVyZmFjZSwgZGVjbGFyZSBhIGxhYmVsOgorCisgIGRhdGEgTXlJZmFjZSA9IE15SWZhY2UKKworYW5kIHRoZW4gZGVjbGFyZSBpdCBhbiBpbnN0YW5jZSBvZiBlYWNoIGlmYWNlIGNsYXNzLCBzdGFydGluZyB3aXRoIHRoZSBzdXBlcmVzdAorY2xhc3MgYW5kIHByb2NlZWRpbmcgZG93biAoYWxsIHRoZSB3aGlsZSBkZWZpbmluZyB0aGUgbWV0aG9kcykuICBUaGVuIHBhc3MgeW91cgorbGFiZWwgdG8gcHJvY2VzcyBhcyB0aGUgaGFuZGxlci4KKworUHJvY2Vzc29yCis9PT09PT09PT0KKworSnVzdCBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBoYW5kbGVyIGxhYmVsLCBwcm90b2NvbHMuIEl0IGNhbGxzIHRoZQorc3VwZXJjbGFzc2VzIHByb2Nlc3MgaWYgdGhlcmUgaXMgYSBzdXBlcmNsYXNzLgpkaWZmIC0tZ2l0IGEvbGliL2hzL1NldHVwLmxocyBiL2xpYi9ocy9TZXR1cC5saHMKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQpkaWZmIC0tZ2l0IGEvbGliL2hzL1RocmlmdC5jYWJhbCBiL2xpYi9ocy9UaHJpZnQuY2FiYWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYTRkYWIuLjAwMDAwMDAKLS0tIGEvbGliL2hzL1RocmlmdC5jYWJhbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS0tCi0tLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0tLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLS0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0tLQotLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS0tCi0tLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0tLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0tLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotLS0gdW5kZXIgdGhlIExpY2Vuc2UuCi0tLQotCi1OYW1lOiAgICAgICAgICAgdGhyaWZ0Ci1WZXJzaW9uOiAgICAgICAgMC43LjAKLUNhYmFsLVZlcnNpb246ICA+PSAxLjQKLUxpY2Vuc2U6ICAgICAgICBPdGhlckxpY2Vuc2UKLUNhdGVnb3J5OiAgICAgICBGb3JlaWduCi1CdWlsZC1UeXBlOiAgICAgU2ltcGxlCi1TeW5vcHNpczogICAgICAgSGFza2VsbCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbQotSG9tZXBhZ2U6ICAgICAgIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZwotQnVnLVJlcG9ydHM6ICAgIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUCi1NYWludGFpbmVyOiAgICAgZGV2QHRocmlmdC5hcGFjaGUub3JnCi1MaWNlbnNlLUZpbGU6ICAgTElDRU5TRQotCi1EZXNjcmlwdGlvbjoKLSAgSGFza2VsbCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbS4gUmVxdWlyZXMgdGhlIHVzZSBvZiB0aGUgdGhyaWZ0IGNvZGUgZ2VuZXJhdG9yLgotCi1MaWJyYXJ5Ci0gIEhzLVNvdXJjZS1EaXJzOgotICAgIHNyYwotICBCdWlsZC1EZXBlbmRzOgotICAgIGJhc2UgPj0gNCwgYmFzZSA8IDUsIG5ldHdvcmssIGdoYy1wcmltLCBiaW5hcnksIGJ5dGVzdHJpbmcsIEhUVFAKLSAgRXhwb3NlZC1Nb2R1bGVzOgotICAgIFRocmlmdCwgVGhyaWZ0LlByb3RvY29sLCBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5LCBUaHJpZnQuVHJhbnNwb3J0LCAKLSAgICBUaHJpZnQuVHJhbnNwb3J0LkZyYW1lZCwgVGhyaWZ0LlRyYW5zcG9ydC5IYW5kbGUsCi0gICAgVGhyaWZ0LlRyYW5zcG9ydC5IdHRwQ2xpZW50LCBUaHJpZnQuU2VydmVyCi0gIEV4dGVuc2lvbnM6Ci0gICAgRGVyaXZlRGF0YVR5cGVhYmxlLCBFeGlzdGVudGlhbFF1YW50aWZpY2F0aW9uLCBGbGV4aWJsZUluc3RhbmNlcywKLSAgICBLaW5kU2lnbmF0dXJlcywgTWFnaWNIYXNoLCBSYW5rTlR5cGVzLAotICAgIFNjb3BlZFR5cGVWYXJpYWJsZXMsIFR5cGVTeW5vbnltSW5zdGFuY2VzCi0KZGlmZiAtLWdpdCBhL2xpYi9ocy9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2hzL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQuaHMgYi9saWIvaHMvc3JjL1RocmlmdC5ocwppbmRleCBlNTdjZmY1Li42NTgwMjA5IDEwMDY0NAotLS0gYS9saWIvaHMvc3JjL1RocmlmdC5ocworKysgYi9saWIvaHMvc3JjL1RocmlmdC5ocwpAQCAtMSw1ICsxLDUgQEAKIHstIyBMQU5HVUFHRSBEZXJpdmVEYXRhVHlwZWFibGUgIy19Ci17LSMgTEFOR1VBR0UgS2luZFNpZ25hdHVyZXMgIy19Cit7LSMgTEFOR1VBR0UgT3ZlcmxvYWRlZFN0cmluZ3MgIy19CiB7LSMgTEFOR1VBR0UgUmFua05UeXBlcyAjLX0KIC0tCiAtLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCkBAIC0zMCwxNCArMzAsMTcgQEAKICAgICAsIFRocmlmdEV4Y2VwdGlvbiguLikKICAgICApIHdoZXJlCiAKLWltcG9ydCBDb250cm9sLk1vbmFkICggd2hlbiApCiBpbXBvcnQgQ29udHJvbC5FeGNlcHRpb24KIAoraW1wb3J0IERhdGEuSW50CitpbXBvcnQgRGF0YS5UZXh0LkxhenkgKCBUZXh0LCBwYWNrLCB1bnBhY2sgKQoraW1wb3J0IERhdGEuVGV4dC5MYXp5LkVuY29kaW5nCiBpbXBvcnQgRGF0YS5UeXBlYWJsZSAoIFR5cGVhYmxlICkKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXAKIAotaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKIGltcG9ydCBUaHJpZnQuUHJvdG9jb2wKLQoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuVHlwZXMKIAogZGF0YSBUaHJpZnRFeGNlcHRpb24gPSBUaHJpZnRFeGNlcHRpb24KICAgZGVyaXZpbmcgKCBTaG93LCBUeXBlYWJsZSApCkBAIC01Miw2ICs1NSw5IEBACiAgICAgfCBBRV9NSVNTSU5HX1JFU1VMVAogICAgIHwgQUVfSU5URVJOQUxfRVJST1IKICAgICB8IEFFX1BST1RPQ09MX0VSUk9SCisgICAgfCBBRV9JTlZBTElEX1RSQU5TRk9STQorICAgIHwgQUVfSU5WQUxJRF9QUk9UT0NPTAorICAgIHwgQUVfVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUKICAgICAgIGRlcml2aW5nICggRXEsIFNob3csIFR5cGVhYmxlICkKIAogaW5zdGFuY2UgRW51bSBBcHBFeG5UeXBlIHdoZXJlCkBAIC02Myw2ICs2OSw5IEBACiAgICAgdG9FbnVtIDUgPSBBRV9NSVNTSU5HX1JFU1VMVAogICAgIHRvRW51bSA2ID0gQUVfSU5URVJOQUxfRVJST1IKICAgICB0b0VudW0gNyA9IEFFX1BST1RPQ09MX0VSUk9SCisgICAgdG9FbnVtIDggPSBBRV9JTlZBTElEX1RSQU5TRk9STQorICAgIHRvRW51bSA5ID0gQUVfSU5WQUxJRF9QUk9UT0NPTAorICAgIHRvRW51bSAxMCA9IEFFX1VOU1VQUE9SVEVEX0NMSUVOVF9UWVBFCiAgICAgdG9FbnVtIHQgPSBlcnJvciAkICJJbnZhbGlkIEFwcEV4blR5cGUgIiArKyBzaG93IHQKIAogICAgIGZyb21FbnVtIEFFX1VOS05PV04gPSAwCkBAIC03Myw1MCArODIsMzMgQEAKICAgICBmcm9tRW51bSBBRV9NSVNTSU5HX1JFU1VMVCA9IDUKICAgICBmcm9tRW51bSBBRV9JTlRFUk5BTF9FUlJPUiA9IDYKICAgICBmcm9tRW51bSBBRV9QUk9UT0NPTF9FUlJPUiA9IDcKKyAgICBmcm9tRW51bSBBRV9JTlZBTElEX1RSQU5TRk9STSA9IDgKKyAgICBmcm9tRW51bSBBRV9JTlZBTElEX1BST1RPQ09MID0gOQorICAgIGZyb21FbnVtIEFFX1VOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0gMTAKIAogZGF0YSBBcHBFeG4gPSBBcHBFeG4geyBhZV90eXBlIDo6IEFwcEV4blR5cGUsIGFlX21lc3NhZ2UgOjogU3RyaW5nIH0KICAgZGVyaXZpbmcgKCBTaG93LCBUeXBlYWJsZSApCiBpbnN0YW5jZSBFeGNlcHRpb24gQXBwRXhuCiAKLXdyaXRlQXBwRXhuIDo6IChQcm90b2NvbCBwLCBUcmFuc3BvcnQgdCkgPT4gcCB0IC0+IEFwcEV4biAtPiBJTyAoKQotd3JpdGVBcHBFeG4gcHQgYWUgPSBkbwotICAgIHdyaXRlU3RydWN0QmVnaW4gcHQgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIKK3dyaXRlQXBwRXhuIDo6IFByb3RvY29sIHAgPT4gcCAtPiBBcHBFeG4gLT4gSU8gKCkKK3dyaXRlQXBwRXhuIHB0IGFlID0gd3JpdGVWYWwgcHQgJCBUU3RydWN0ICQgTWFwLmZyb21MaXN0CisgICAgICAgICAgICAgICAgICAgIFsgKDEsICgibWVzc2FnZSIsIFRTdHJpbmcgJCBlbmNvZGVVdGY4ICQgcGFjayAkIGFlX21lc3NhZ2UgYWUpKQorICAgICAgICAgICAgICAgICAgICAsICgyLCAoInR5cGUiLCBUSTMyICQgZnJvbUludGVncmFsICQgZnJvbUVudW0gKGFlX3R5cGUgYWUpKSkKKyAgICAgICAgICAgICAgICAgICAgXQogCi0gICAgd2hlbiAoYWVfbWVzc2FnZSBhZSAvPSAiIikgJCBkbwotICAgICAgICB3cml0ZUZpZWxkQmVnaW4gcHQgKCJtZXNzYWdlIiwgVF9TVFJJTkcgLCAxKQotICAgICAgICB3cml0ZVN0cmluZyBwdCAoYWVfbWVzc2FnZSBhZSkKLSAgICAgICAgd3JpdGVGaWVsZEVuZCBwdAotCi0gICAgd3JpdGVGaWVsZEJlZ2luIHB0ICgidHlwZSIsIFRfSTMyLCAyKTsKLSAgICB3cml0ZUkzMiBwdCAoZnJvbUludGVncmFsICQgZnJvbUVudW0gKGFlX3R5cGUgYWUpKQotICAgIHdyaXRlRmllbGRFbmQgcHQKLSAgICB3cml0ZUZpZWxkU3RvcCBwdAotICAgIHdyaXRlU3RydWN0RW5kIHB0Ci0KLXJlYWRBcHBFeG4gOjogKFByb3RvY29sIHAsIFRyYW5zcG9ydCB0KSA9PiBwIHQgLT4gSU8gQXBwRXhuCityZWFkQXBwRXhuIDo6IFByb3RvY29sIHAgPT4gcCAtPiBJTyBBcHBFeG4KIHJlYWRBcHBFeG4gcHQgPSBkbwotICAgIF8gPC0gcmVhZFN0cnVjdEJlZ2luIHB0Ci0gICAgcmVjb3JkIDwtIHJlYWRBcHBFeG5GaWVsZHMgcHQgKEFwcEV4biB7YWVfdHlwZSA9IHVuZGVmaW5lZCwgYWVfbWVzc2FnZSA9IHVuZGVmaW5lZH0pCi0gICAgcmVhZFN0cnVjdEVuZCBwdAotICAgIHJldHVybiByZWNvcmQKKyAgICBsZXQgdHlwZW1hcCA9IE1hcC5mcm9tTGlzdCBbKDEsKCJtZXNzYWdlIixUX1NUUklORykpLCgyLCgidHlwZSIsVF9JMzIpKV0KKyAgICBUU3RydWN0IGZpZWxkcyA8LSByZWFkVmFsIHB0ICQgVF9TVFJVQ1QgdHlwZW1hcAorICAgIHJldHVybiAkIHJlYWRBcHBFeG5GaWVsZHMgZmllbGRzCiAKLXJlYWRBcHBFeG5GaWVsZHMgOjogZm9yYWxsIChhIDo6ICogLT4gKikgdC4gKFByb3RvY29sIGEsIFRyYW5zcG9ydCB0KSA9PiBhIHQgLT4gQXBwRXhuIC0+IElPIEFwcEV4biAKLXJlYWRBcHBFeG5GaWVsZHMgcHQgcmVjb3JkID0gZG8KLSAgICAoXywgZnQsIHRhZykgPC0gcmVhZEZpZWxkQmVnaW4gcHQKLSAgICBpZiBmdCA9PSBUX1NUT1AKLSAgICAgICAgdGhlbiByZXR1cm4gcmVjb3JkCi0gICAgICAgIGVsc2UgY2FzZSB0YWcgb2YKLSAgICAgICAgICAgICAgICAgMSAtPiBpZiBmdCA9PSBUX1NUUklORyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHMgPC0gcmVhZFN0cmluZyBwdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQXBwRXhuRmllbGRzIHB0IHJlY29yZHthZV9tZXNzYWdlID0gc30KLSAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBkbyBza2lwIHB0IGZ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEFwcEV4bkZpZWxkcyBwdCByZWNvcmQKLSAgICAgICAgICAgICAgICAgMiAtPiBpZiBmdCA9PSBUX0kzMiB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvIGkgPC0gcmVhZEkzMiBwdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQXBwRXhuRmllbGRzIHB0IHJlY29yZHthZV90eXBlID0gKHRvRW51bSAkIGZyb21JbnRlZ3JhbCBpKX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBkbyBza2lwIHB0IGZ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEFwcEV4bkZpZWxkcyBwdCByZWNvcmQKLSAgICAgICAgICAgICAgICAgXyAtPiBkbyBza2lwIHB0IGZ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEZpZWxkRW5kIHB0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEFwcEV4bkZpZWxkcyBwdCByZWNvcmQKLQorcmVhZEFwcEV4bkZpZWxkcyA6OiBNYXAuSGFzaE1hcCBJbnQxNiAoVGV4dCwgVGhyaWZ0VmFsKSAtPiBBcHBFeG4KK3JlYWRBcHBFeG5GaWVsZHMgZmllbGRzID0gQXBwRXhueworICBhZV9tZXNzYWdlID0gbWF5YmUgdW5kZWZpbmVkIHVud3JhcE1lc3NhZ2UgJCBNYXAubG9va3VwIDEgZmllbGRzLAorICBhZV90eXBlICAgID0gbWF5YmUgdW5kZWZpbmVkIHVud3JhcFR5cGUgJCBNYXAubG9va3VwIDIgZmllbGRzCisgIH0KKyAgd2hlcmUKKyAgICB1bndyYXBNZXNzYWdlIChfLCBUU3RyaW5nIHMpID0gdW5wYWNrICQgZGVjb2RlVXRmOCBzCisgICAgdW53cmFwTWVzc2FnZSBfID0gdW5kZWZpbmVkCisgICAgdW53cmFwVHlwZSAoXywgVEkzMiBpKSA9IHRvRW51bSAkIGZyb21JbnRlZ3JhbCBpCisgICAgdW53cmFwVHlwZSBfID0gdW5kZWZpbmVkCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9BcmJpdHJhcmllcy5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L0FyYml0cmFyaWVzLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YzBmYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvc3JjL1RocmlmdC9BcmJpdHJhcmllcy5ocwpAQCAtMCwwICsxLDU1IEBACit7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLW9ycGhhbnMgIy19CisKK21vZHVsZSBUaHJpZnQuQXJiaXRyYXJpZXMgd2hlcmUKKworaW1wb3J0IERhdGEuQml0cygpCisKK2ltcG9ydCBUZXN0LlF1aWNrQ2hlY2suQXJiaXRyYXJ5CisKK2ltcG9ydCBDb250cm9sLkFwcGxpY2F0aXZlICgoPCQ+KSkKK2ltcG9ydCBEYXRhLk1hcCAoTWFwKQoraW1wb3J0IHF1YWxpZmllZCBEYXRhLk1hcCBhcyBNYXAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5TZXQgYXMgU2V0CitpbXBvcnQgcXVhbGlmaWVkIERhdGEuVmVjdG9yIGFzIFZlY3RvcgoraW1wb3J0IHF1YWxpZmllZCBEYXRhLlRleHQuTGF6eSBhcyBUZXh0CitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaFNldCBhcyBIU2V0CitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgSE1hcAoraW1wb3J0IERhdGEuSGFzaGFibGUgKEhhc2hhYmxlKQorCitpbXBvcnQgRGF0YS5CeXRlU3RyaW5nLkxhenkgKEJ5dGVTdHJpbmcpCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIEJTCisKKy0tIFN0cmluZyBoYXMgYW4gQXJiaXRyYXJ5IGluc3RhbmNlIGFscmVhZHkKKy0tIEJvb2wgaGFzIGFuIEFyYml0cmFyeSBpbnN0YW5jZSBhbHJlYWR5CistLSBBIFRocmlmdCAnbGlzdCcgaXMgYSBWZWN0b3IuCisKK2luc3RhbmNlIEFyYml0cmFyeSBCeXRlU3RyaW5nIHdoZXJlCisgIGFyYml0cmFyeSA9IEJTLnBhY2sgLiBmaWx0ZXIgKC89IDApIDwkPiBhcmJpdHJhcnkKKworaW5zdGFuY2UgKEFyYml0cmFyeSBrKSA9PiBBcmJpdHJhcnkgKFZlY3Rvci5WZWN0b3Igaykgd2hlcmUKKyAgYXJiaXRyYXJ5ID0gVmVjdG9yLmZyb21MaXN0IDwkPiBhcmJpdHJhcnkKKworaW5zdGFuY2UgQXJiaXRyYXJ5IFRleHQuVGV4dCB3aGVyZQorICBhcmJpdHJhcnkgPSBUZXh0LnBhY2sgLiBmaWx0ZXIgKC89ICdcMCcpIDwkPiBhcmJpdHJhcnkKKworaW5zdGFuY2UgKEVxIGssIEhhc2hhYmxlIGssIEFyYml0cmFyeSBrKSA9PiBBcmJpdHJhcnkgKEhTZXQuSGFzaFNldCBrKSB3aGVyZQorICBhcmJpdHJhcnkgPSBIU2V0LmZyb21MaXN0IDwkPiBhcmJpdHJhcnkKKworaW5zdGFuY2UgKEVxIGssIEhhc2hhYmxlIGssIEFyYml0cmFyeSBrLCBBcmJpdHJhcnkgdikgPT4KKyAgICBBcmJpdHJhcnkgKEhNYXAuSGFzaE1hcCBrIHYpIHdoZXJlCisgIGFyYml0cmFyeSA9IEhNYXAuZnJvbUxpc3QgPCQ+IGFyYml0cmFyeQorCit7LQorICAgVG8gaGFuZGxlIFRocmlmdCAnZW51bScgd2Ugd291bGQgaWRlYWxseSB1c2Ugc29tZXRoaW5nIGxpa2U6CisKK2luc3RhbmNlIChFbnVtIGEsIEJvdW5kZWQgYSkgPT4gQXJiaXRyYXJ5IGEKKyAgICB3aGVyZSBhcmJpdHJhcnkgPSBlbGVtZW50cyAoZW51bUZyb21UbyBtaW5Cb3VuZCBtYXhCb3VuZCkKKworVW5mb3J0dW5hdGVseSB0aGlzIGRvZXNuJ3QgcGxheSBuaWNlbHkgd2l0aCB0aGUgdHlwZSBzeXN0ZW0uCitJbnN0ZWFkIHdlJ2xsIGdlbmVyYXRlIGFuIGFyYml0cmFyeSBpbnN0YW5jZSBhbG9uZyB3aXRoIHRoZSBjb2RlLgorLX0KKworey0KKyAgICBUaGVyZSBtaWdodCBiZSBzb21lIHdheSB0byBpbnRyb3NwZWN0IG9uIHRoZSBIYXNrZWxsIHN0cnVjdHVyZSBvZiBhCisgICAgVGhyaWZ0ICdzdHJ1Y3QnIG9yICdleGNlcHRpb24nIGJ1dCBnZW5lcmF0aW5nIHRoZSBjb2RlIGRpcmVjdGx5IGlzIHNpbXBsZXIuCistfQpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC5ocwppbmRleCAxYTMxOTMyLi42N2E5MTc1IDEwMDY0NAotLS0gYS9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC5ocworKysgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC5ocwpAQCAtMSw0ICsxLDYgQEAKK3stIyBMQU5HVUFHRSBDUFAgIy19CiB7LSMgTEFOR1VBR0UgRGVyaXZlRGF0YVR5cGVhYmxlICMtfQorey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzICMtfQogLS0KIC0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKIC0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0yMCwxNjYgKzIyLDQ2IEBACiAKIG1vZHVsZSBUaHJpZnQuUHJvdG9jb2wKICAgICAoIFByb3RvY29sKC4uKQotICAgICwgc2tpcAotICAgICwgTWVzc2FnZVR5cGUoLi4pCi0gICAgLCBUaHJpZnRUeXBlKC4uKQorICAgICwgU3RhdGVsZXNzUHJvdG9jb2woLi4pCiAgICAgLCBQcm90b2NvbEV4biguLikKICAgICAsIFByb3RvY29sRXhuVHlwZSguLikKKyAgICAsIGdldFR5cGVPZgorICAgICwgcnVuUGFyc2VyCisgICAgLCBic1RvRG91YmxlCisgICAgLCBic1RvRG91YmxlTEUKICAgICApIHdoZXJlCiAKLWltcG9ydCBDb250cm9sLk1vbmFkICggcmVwbGljYXRlTV8sIHVubGVzcyApCiBpbXBvcnQgQ29udHJvbC5FeGNlcHRpb24KK2ltcG9ydCBEYXRhLkF0dG9wYXJzZWMuQnl0ZVN0cmluZworaW1wb3J0IERhdGEuQml0cworaW1wb3J0IERhdGEuQnl0ZVN0cmluZy5VbnNhZmUKK2ltcG9ydCBEYXRhLkZ1bmN0b3IgKCg8JD4pKQogaW1wb3J0IERhdGEuSW50Ci1pbXBvcnQgRGF0YS5UeXBlYWJsZSAoIFR5cGVhYmxlICkKLWltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuTGF6eQoraW1wb3J0IERhdGEuTW9ub2lkIChtZW1wdHkpCitpbXBvcnQgRGF0YS5UZXh0LkxhenkgKFRleHQpCitpbXBvcnQgRGF0YS5UeXBlYWJsZSAoVHlwZWFibGUpCitpbXBvcnQgRGF0YS5Xb3JkCitpbXBvcnQgRm9yZWlnbi5QdHIgKGNhc3RQdHIpCitpbXBvcnQgRm9yZWlnbi5TdG9yYWJsZSAocGVlaywgcG9rZSkKK2ltcG9ydCBTeXN0ZW0uSU8uVW5zYWZlCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZyBhcyBCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIE1hcAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKIAogaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKLQotCi1kYXRhIFRocmlmdFR5cGUKLSAgICA9IFRfU1RPUAotICAgIHwgVF9WT0lECi0gICAgfCBUX0JPT0wKLSAgICB8IFRfQllURQotICAgIHwgVF9ET1VCTEUKLSAgICB8IFRfSTE2Ci0gICAgfCBUX0kzMgotICAgIHwgVF9JNjQKLSAgICB8IFRfU1RSSU5HCi0gICAgfCBUX1NUUlVDVAotICAgIHwgVF9NQVAKLSAgICB8IFRfU0VUCi0gICAgfCBUX0xJU1QKLSAgICAgIGRlcml2aW5nICggRXEgKQotCi1pbnN0YW5jZSBFbnVtIFRocmlmdFR5cGUgd2hlcmUKLSAgICBmcm9tRW51bSBUX1NUT1AgICA9IDAKLSAgICBmcm9tRW51bSBUX1ZPSUQgICA9IDEKLSAgICBmcm9tRW51bSBUX0JPT0wgICA9IDIKLSAgICBmcm9tRW51bSBUX0JZVEUgICA9IDMKLSAgICBmcm9tRW51bSBUX0RPVUJMRSA9IDQKLSAgICBmcm9tRW51bSBUX0kxNiAgICA9IDYKLSAgICBmcm9tRW51bSBUX0kzMiAgICA9IDgKLSAgICBmcm9tRW51bSBUX0k2NCAgICA9IDEwCi0gICAgZnJvbUVudW0gVF9TVFJJTkcgPSAxMQotICAgIGZyb21FbnVtIFRfU1RSVUNUID0gMTIKLSAgICBmcm9tRW51bSBUX01BUCAgICA9IDEzCi0gICAgZnJvbUVudW0gVF9TRVQgICAgPSAxNAotICAgIGZyb21FbnVtIFRfTElTVCAgID0gMTUKLQotICAgIHRvRW51bSAwICA9IFRfU1RPUAotICAgIHRvRW51bSAxICA9IFRfVk9JRAotICAgIHRvRW51bSAyICA9IFRfQk9PTAotICAgIHRvRW51bSAzICA9IFRfQllURQotICAgIHRvRW51bSA0ICA9IFRfRE9VQkxFCi0gICAgdG9FbnVtIDYgID0gVF9JMTYKLSAgICB0b0VudW0gOCAgPSBUX0kzMgotICAgIHRvRW51bSAxMCA9IFRfSTY0Ci0gICAgdG9FbnVtIDExID0gVF9TVFJJTkcKLSAgICB0b0VudW0gMTIgPSBUX1NUUlVDVAotICAgIHRvRW51bSAxMyA9IFRfTUFQCi0gICAgdG9FbnVtIDE0ID0gVF9TRVQKLSAgICB0b0VudW0gMTUgPSBUX0xJU1QKLSAgICB0b0VudW0gdCA9IGVycm9yICQgIkludmFsaWQgVGhyaWZ0VHlwZSAiICsrIHNob3cgdAotCi1kYXRhIE1lc3NhZ2VUeXBlCi0gICAgPSBNX0NBTEwKLSAgICB8IE1fUkVQTFkKLSAgICB8IE1fRVhDRVBUSU9OCi0gICAgICBkZXJpdmluZyAoIEVxICkKLQotaW5zdGFuY2UgRW51bSBNZXNzYWdlVHlwZSB3aGVyZQotICAgIGZyb21FbnVtIE1fQ0FMTCAgICAgID0gIDEKLSAgICBmcm9tRW51bSBNX1JFUExZICAgICA9ICAyCi0gICAgZnJvbUVudW0gTV9FWENFUFRJT04gPSAgMwotCi0gICAgdG9FbnVtIDEgPSBNX0NBTEwKLSAgICB0b0VudW0gMiA9IE1fUkVQTFkKLSAgICB0b0VudW0gMyA9IE1fRVhDRVBUSU9OCi0gICAgdG9FbnVtIHQgPSBlcnJvciAkICJJbnZhbGlkIE1lc3NhZ2VUeXBlICIgKysgc2hvdyB0Ci0KK2ltcG9ydCBUaHJpZnQuVHlwZXMKIAogY2xhc3MgUHJvdG9jb2wgYSB3aGVyZQotICAgIGdldFRyYW5zcG9ydCA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gdAorICByZWFkQnl0ZSA6OiBhIC0+IElPIExCUy5CeXRlU3RyaW5nCisgIHJlYWRWYWwgOjogYSAtPiBUaHJpZnRUeXBlIC0+IElPIFRocmlmdFZhbAorICByZWFkTWVzc2FnZSA6OiBhIC0+ICgoVGV4dCwgTWVzc2FnZVR5cGUsIEludDMyKSAtPiBJTyBiKSAtPiBJTyBiCiAKLSAgICB3cml0ZU1lc3NhZ2VCZWdpbiA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gKFN0cmluZywgTWVzc2FnZVR5cGUsIEludDMyKSAtPiBJTyAoKQotICAgIHdyaXRlTWVzc2FnZUVuZCAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQorICB3cml0ZVZhbCA6OiBhIC0+IFRocmlmdFZhbCAtPiBJTyAoKQorICB3cml0ZU1lc3NhZ2UgOjogYSAtPiAoVGV4dCwgTWVzc2FnZVR5cGUsIEludDMyKSAtPiBJTyAoKSAtPiBJTyAoKQogCi0gICAgd3JpdGVTdHJ1Y3RCZWdpbiA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gU3RyaW5nIC0+IElPICgpCi0gICAgd3JpdGVTdHJ1Y3RFbmQgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKCkKLSAgICB3cml0ZUZpZWxkQmVnaW4gIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiAoU3RyaW5nLCBUaHJpZnRUeXBlLCBJbnQxNikgLT4gSU8gKCkKLSAgICB3cml0ZUZpZWxkRW5kICAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQotICAgIHdyaXRlRmllbGRTdG9wICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0gICAgd3JpdGVNYXBCZWdpbiAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gKFRocmlmdFR5cGUsIFRocmlmdFR5cGUsIEludDMyKSAtPiBJTyAoKQotICAgIHdyaXRlTWFwRW5kICAgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0gICAgd3JpdGVMaXN0QmVnaW4gICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gKFRocmlmdFR5cGUsIEludDMyKSAtPiBJTyAoKQotICAgIHdyaXRlTGlzdEVuZCAgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0gICAgd3JpdGVTZXRCZWdpbiAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gKFRocmlmdFR5cGUsIEludDMyKSAtPiBJTyAoKQotICAgIHdyaXRlU2V0RW5kICAgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0KLSAgICB3cml0ZUJvb2wgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gQm9vbCAtPiBJTyAoKQotICAgIHdyaXRlQnl0ZSAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJbnQ4IC0+IElPICgpCi0gICAgd3JpdGVJMTYgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IEludDE2IC0+IElPICgpCi0gICAgd3JpdGVJMzIgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IEludDMyIC0+IElPICgpCi0gICAgd3JpdGVJNjQgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IEludDY0IC0+IElPICgpCi0gICAgd3JpdGVEb3VibGUgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IERvdWJsZSAtPiBJTyAoKQotICAgIHdyaXRlU3RyaW5nIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBTdHJpbmcgLT4gSU8gKCkKLSAgICB3cml0ZUJpbmFyeSA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gQnl0ZVN0cmluZyAtPiBJTyAoKQotCi0KLSAgICByZWFkTWVzc2FnZUJlZ2luIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoU3RyaW5nLCBNZXNzYWdlVHlwZSwgSW50MzIpCi0gICAgcmVhZE1lc3NhZ2VFbmQgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKCkKLQotICAgIHJlYWRTdHJ1Y3RCZWdpbiA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gU3RyaW5nCi0gICAgcmVhZFN0cnVjdEVuZCAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQotICAgIHJlYWRGaWVsZEJlZ2luICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKFN0cmluZywgVGhyaWZ0VHlwZSwgSW50MTYpCi0gICAgcmVhZEZpZWxkRW5kICAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQotICAgIHJlYWRNYXBCZWdpbiAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKFRocmlmdFR5cGUsIFRocmlmdFR5cGUsIEludDMyKQotICAgIHJlYWRNYXBFbmQgICAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKCkKLSAgICByZWFkTGlzdEJlZ2luICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPIChUaHJpZnRUeXBlLCBJbnQzMikKLSAgICByZWFkTGlzdEVuZCAgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0gICAgcmVhZFNldEJlZ2luICAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoVGhyaWZ0VHlwZSwgSW50MzIpCi0gICAgcmVhZFNldEVuZCAgICAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQotCi0gICAgcmVhZEJvb2wgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gQm9vbAotICAgIHJlYWRCeXRlICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPIEludDgKLSAgICByZWFkSTE2ICAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyBJbnQxNgotICAgIHJlYWRJMzIgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPIEludDMyCi0gICAgcmVhZEk2NCAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gSW50NjQKLSAgICByZWFkRG91YmxlIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyBEb3VibGUKLSAgICByZWFkU3RyaW5nIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyBTdHJpbmcKLSAgICByZWFkQmluYXJ5IDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyBCeXRlU3RyaW5nCi0KLQotc2tpcCA6OiAoUHJvdG9jb2wgcCwgVHJhbnNwb3J0IHQpID0+IHAgdCAtPiBUaHJpZnRUeXBlIC0+IElPICgpCi1za2lwIF8gVF9TVE9QID0gcmV0dXJuICgpCi1za2lwIF8gVF9WT0lEID0gcmV0dXJuICgpCi1za2lwIHAgVF9CT09MID0gcmVhZEJvb2wgcCA+PiByZXR1cm4gKCkKLXNraXAgcCBUX0JZVEUgPSByZWFkQnl0ZSBwID4+IHJldHVybiAoKQotc2tpcCBwIFRfSTE2ID0gcmVhZEkxNiBwID4+IHJldHVybiAoKQotc2tpcCBwIFRfSTMyID0gcmVhZEkzMiBwID4+IHJldHVybiAoKQotc2tpcCBwIFRfSTY0ID0gcmVhZEk2NCBwID4+IHJldHVybiAoKQotc2tpcCBwIFRfRE9VQkxFID0gcmVhZERvdWJsZSBwID4+IHJldHVybiAoKQotc2tpcCBwIFRfU1RSSU5HID0gcmVhZFN0cmluZyBwID4+IHJldHVybiAoKQotc2tpcCBwIFRfU1RSVUNUID0gZG8gXyA8LSByZWFkU3RydWN0QmVnaW4gcAotICAgICAgICAgICAgICAgICAgICAgc2tpcEZpZWxkcyBwCi0gICAgICAgICAgICAgICAgICAgICByZWFkU3RydWN0RW5kIHAKLXNraXAgcCBUX01BUCA9IGRvIChrLCB2LCBzKSA8LSByZWFkTWFwQmVnaW4gcAotICAgICAgICAgICAgICAgICAgcmVwbGljYXRlTV8gKGZyb21JbnRlZ3JhbCBzKSAoc2tpcCBwIGsgPj4gc2tpcCBwIHYpCi0gICAgICAgICAgICAgICAgICByZWFkTWFwRW5kIHAKLXNraXAgcCBUX1NFVCA9IGRvICh0LCBuKSA8LSByZWFkU2V0QmVnaW4gcAotICAgICAgICAgICAgICAgICAgcmVwbGljYXRlTV8gKGZyb21JbnRlZ3JhbCBuKSAoc2tpcCBwIHQpCi0gICAgICAgICAgICAgICAgICByZWFkU2V0RW5kIHAKLXNraXAgcCBUX0xJU1QgPSBkbyAodCwgbikgPC0gcmVhZExpc3RCZWdpbiBwCi0gICAgICAgICAgICAgICAgICAgcmVwbGljYXRlTV8gKGZyb21JbnRlZ3JhbCBuKSAoc2tpcCBwIHQpCi0gICAgICAgICAgICAgICAgICAgcmVhZExpc3RFbmQgcAotCi0KLXNraXBGaWVsZHMgOjogKFByb3RvY29sIHAsIFRyYW5zcG9ydCB0KSA9PiBwIHQgLT4gSU8gKCkKLXNraXBGaWVsZHMgcCA9IGRvCi0gICAgKF8sIHQsIF8pIDwtIHJlYWRGaWVsZEJlZ2luIHAKLSAgICB1bmxlc3MgKHQgPT0gVF9TVE9QKSAoc2tpcCBwIHQgPj4gcmVhZEZpZWxkRW5kIHAgPj4gc2tpcEZpZWxkcyBwKQotCitjbGFzcyBQcm90b2NvbCBhID0+IFN0YXRlbGVzc1Byb3RvY29sIGEgd2hlcmUKKyAgc2VyaWFsaXplVmFsIDo6IGEgLT4gVGhyaWZ0VmFsIC0+IExCUy5CeXRlU3RyaW5nCisgIGRlc2VyaWFsaXplVmFsIDo6IGEgLT4gVGhyaWZ0VHlwZSAtPiBMQlMuQnl0ZVN0cmluZyAtPiBUaHJpZnRWYWwKIAogZGF0YSBQcm90b2NvbEV4blR5cGUKICAgICA9IFBFX1VOS05PV04KQEAgLTE4Nyw4ICs2OSw2OCBAQAogICAgIHwgUEVfTkVHQVRJVkVfU0laRQogICAgIHwgUEVfU0laRV9MSU1JVAogICAgIHwgUEVfQkFEX1ZFUlNJT04KKyAgICB8IFBFX05PVF9JTVBMRU1FTlRFRAorICAgIHwgUEVfTUlTU0lOR19SRVFVSVJFRF9GSUVMRAogICAgICAgZGVyaXZpbmcgKCBFcSwgU2hvdywgVHlwZWFibGUgKQogCiBkYXRhIFByb3RvY29sRXhuID0gUHJvdG9jb2xFeG4gUHJvdG9jb2xFeG5UeXBlIFN0cmluZwogICBkZXJpdmluZyAoIFNob3csIFR5cGVhYmxlICkKIGluc3RhbmNlIEV4Y2VwdGlvbiBQcm90b2NvbEV4bgorCitnZXRUeXBlT2YgOjogVGhyaWZ0VmFsIC0+IFRocmlmdFR5cGUKK2dldFR5cGVPZiB2ID0gIGNhc2UgdiBvZgorICBUU3RydWN0e30gLT4gVF9TVFJVQ1QgTWFwLmVtcHR5CisgIFRNYXB7fSAtPiBUX01BUCBUX1ZPSUQgVF9WT0lECisgIFRMaXN0e30gLT4gVF9MSVNUIFRfVk9JRAorICBUU2V0e30gLT4gVF9TRVQgVF9WT0lECisgIFRCb29se30gLT4gVF9CT09MCisgIFRCeXRle30gLT4gVF9CWVRFCisgIFRJMTZ7fSAtPiBUX0kxNgorICBUSTMye30gLT4gVF9JMzIKKyAgVEk2NHt9IC0+IFRfSTY0CisgIFRTdHJpbmd7fSAtPiBUX1NUUklORworICBUQmluYXJ5e30gLT4gVF9CSU5BUlkKKyAgVERvdWJsZXt9IC0+IFRfRE9VQkxFCisKK3J1blBhcnNlciA6OiAoUHJvdG9jb2wgcCwgU2hvdyBhKSA9PiBwIC0+IFBhcnNlciBhIC0+IElPIGEKK3J1blBhcnNlciBwcm90IHAgPSByZWZpbGwgPj49IGdldFJlc3VsdCAuIHBhcnNlIHAKKyAgd2hlcmUKKyAgICByZWZpbGwgPSBoYW5kbGUgaGFuZGxlRU9GICQgTEJTLnRvU3RyaWN0IDwkPiByZWFkQnl0ZSBwcm90CisgICAgZ2V0UmVzdWx0IChEb25lIF8gYSkgPSByZXR1cm4gYQorICAgIGdldFJlc3VsdCAoUGFydGlhbCBrKSA9IHJlZmlsbCA+Pj0gZ2V0UmVzdWx0IC4gaworICAgIGdldFJlc3VsdCBmID0gdGhyb3cgJCBQcm90b2NvbEV4biBQRV9JTlZBTElEX0RBVEEgKHNob3cgZikKKworaGFuZGxlRU9GIDo6IFNvbWVFeGNlcHRpb24gLT4gSU8gQlMuQnl0ZVN0cmluZworaGFuZGxlRU9GID0gY29uc3QgJCByZXR1cm4gbWVtcHR5CisKKy0tIHwgQ29udmVydHMgYSBCeXRlU3RyaW5nIHRvIGEgRmxvYXRpbmcgcG9pbnQgbnVtYmVyCistLSBUaGUgQnl0ZVN0cmluZyBpcyBhc3N1bWVkIHRvIGJlIGVuY29kZWQgaW4gbmV0d29yayBvcmRlciAoQmlnIEVuZGlhbikKKy0tIHRoZXJlZm9yZSB0aGUgYmVoYXZpb3Igb2YgdGhpcyBmdW5jdGlvbiB2YXJpZXMgYmFzZWQgb24gd2hldGhlciB0aGUgbG9jYWwKKy0tIG1hY2hpbmUgaXMgYmlnIGVuZGlhbiBvciBsaXR0bGUgZW5kaWFuLgorYnNUb0RvdWJsZSA6OiBCUy5CeXRlU3RyaW5nIC0+IERvdWJsZQorYnNUb0RvdWJsZUxFIDo6IEJTLkJ5dGVTdHJpbmcgLT4gRG91YmxlCisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorYnNUb0RvdWJsZSBicyA9IHVuc2FmZUR1cGFibGVQZXJmb3JtSU8gJCB1bnNhZmVVc2VBc0NTdHJpbmcgYnMgY2FzdEJzU3dhcHBlZAorYnNUb0RvdWJsZUxFIGJzID0gdW5zYWZlRHVwYWJsZVBlcmZvcm1JTyAkIHVuc2FmZVVzZUFzQ1N0cmluZyBicyBjYXN0QnMKKyNlbHNlCitic1RvRG91YmxlIGJzID0gdW5zYWZlRHVwYWJsZVBlcmZvcm1JTyAkIHVuc2FmZVVzZUFzQ1N0cmluZyBicyBjYXN0QnMKK2JzVG9Eb3VibGVMRSBicyA9IHVuc2FmZUR1cGFibGVQZXJmb3JtSU8gJCB1bnNhZmVVc2VBc0NTdHJpbmcgYnMgY2FzdEJzU3dhcHBlZAorI2VuZGlmCisKKworY2FzdEJzU3dhcHBlZCBjaHJQdHIgPSBkbworICB3IDwtIHBlZWsgKGNhc3RQdHIgY2hyUHRyKQorICBwb2tlIChjYXN0UHRyIGNoclB0cikgKGJ5dGVTd2FwIHcpCisgIHBlZWsgKGNhc3RQdHIgY2hyUHRyKQorY2FzdEJzID0gcGVlayAuIGNhc3RQdHIKKworLS0gfCBTd2FwIGVuZGlhbm5lc3Mgb2YgYSA2NC1iaXQgd29yZAorYnl0ZVN3YXAgOjogV29yZDY0IC0+IFdvcmQ2NAorYnl0ZVN3YXAgdyA9ICh3IGBzaGlmdExgIDU2IC4mLiAweEZGMDAwMDAwMDAwMDAwMDApIC58LgorICAgICAgICAgICAgICh3IGBzaGlmdExgIDQwIC4mLiAweDAwRkYwMDAwMDAwMDAwMDApIC58LgorICAgICAgICAgICAgICh3IGBzaGlmdExgIDI0IC4mLiAweDAwMDBGRjAwMDAwMDAwMDApIC58LgorICAgICAgICAgICAgICh3IGBzaGlmdExgIDggIC4mLiAweDAwMDAwMEZGMDAwMDAwMDApIC58LgorICAgICAgICAgICAgICh3IGBzaGlmdFJgIDggIC4mLiAweDAwMDAwMDAwRkYwMDAwMDApIC58LgorICAgICAgICAgICAgICh3IGBzaGlmdFJgIDI0IC4mLiAweDAwMDAwMDAwMDBGRjAwMDApIC58LgorICAgICAgICAgICAgICh3IGBzaGlmdFJgIDQwIC4mLiAweDAwMDAwMDAwMDAwMEZGMDApIC58LgorICAgICAgICAgICAgICh3IGBzaGlmdFJgIDU2IC4mLiAweDAwMDAwMDAwMDAwMDAwRkYpCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9CaW5hcnkuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9CaW5hcnkuaHMKaW5kZXggYzU1ZWE1YS4uN2IwYWNkOSAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvQmluYXJ5LmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0JpbmFyeS5ocwpAQCAtMSw1ICsxLDMgQEAKLXstIyBMQU5HVUFHRSBFeGlzdGVudGlhbFF1YW50aWZpY2F0aW9uICMtfQotey0jIExBTkdVQUdFIE1hZ2ljSGFzaCAjLX0KIC0tCiAtLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAtLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtMTksMTQzICsxNywxOTYgQEAKIC0tIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0KIAorey0jIExBTkdVQUdFIENQUCAjLX0KK3stIyBMQU5HVUFHRSBFeGlzdGVudGlhbFF1YW50aWZpY2F0aW9uICMtfQorey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzICMtfQorey0jIExBTkdVQUdFIFNjb3BlZFR5cGVWYXJpYWJsZXMgIy19CisKIG1vZHVsZSBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5CiAgICAgKCBtb2R1bGUgVGhyaWZ0LlByb3RvY29sCiAgICAgLCBCaW5hcnlQcm90b2NvbCguLikKKyAgICAsIHZlcnNpb25NYXNrCisgICAgLCB2ZXJzaW9uMQogICAgICkgd2hlcmUKIAogaW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uICggdGhyb3cgKQotaW1wb3J0IENvbnRyb2wuTW9uYWQgKCBsaWZ0TSApCi0KLWltcG9ydCBxdWFsaWZpZWQgRGF0YS5CaW5hcnkKK2ltcG9ydCBDb250cm9sLk1vbmFkCiBpbXBvcnQgRGF0YS5CaXRzCitpbXBvcnQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQnVpbGRlcgoraW1wb3J0IERhdGEuRnVuY3RvcgogaW1wb3J0IERhdGEuSW50Ci0KLWltcG9ydCBHSEMuRXh0cwotaW1wb3J0IEdIQy5Xb3JkCitpbXBvcnQgRGF0YS5Nb25vaWQKK2ltcG9ydCBEYXRhLlRleHQuTGF6eS5FbmNvZGluZyAoIGRlY29kZVV0ZjgsIGVuY29kZVV0ZjggKQoraW1wb3J0IERhdGEuV29yZAogCiBpbXBvcnQgVGhyaWZ0LlByb3RvY29sCiBpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UeXBlcwogCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQXR0b3BhcnNlYy5CeXRlU3RyaW5nIGFzIFAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcuTGF6eSBhcyBMUAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkJpbmFyeSBhcyBCaW5hcnkKIGltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCi1pbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5LkNoYXI4IGFzIExCU0NoYXI4CitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuVGV4dC5MYXp5IGFzIExUCiAKLXZlcnNpb25fbWFzayA6OiBJbnQzMgotdmVyc2lvbl9tYXNrID0gMHhmZmZmMDAwMAordmVyc2lvbk1hc2sgOjogSW50MzIKK3ZlcnNpb25NYXNrID0gZnJvbUludGVncmFsICgweGZmZmYwMDAwIDo6IFdvcmQzMikKIAotdmVyc2lvbl8xIDo6IEludDMyCi12ZXJzaW9uXzEgICAgPSAweDgwMDEwMDAwCit2ZXJzaW9uMSA6OiBJbnQzMgordmVyc2lvbjEgPSBmcm9tSW50ZWdyYWwgKDB4ODAwMTAwMDAgOjogV29yZDMyKQogCiBkYXRhIEJpbmFyeVByb3RvY29sIGEgPSBUcmFuc3BvcnQgYSA9PiBCaW5hcnlQcm90b2NvbCBhCiAKK2dldFRyYW5zcG9ydCA6OiBUcmFuc3BvcnQgdCA9PiBCaW5hcnlQcm90b2NvbCB0IC0+IHQKK2dldFRyYW5zcG9ydCAoQmluYXJ5UHJvdG9jb2wgdCkgPSB0CiAKLWluc3RhbmNlIFByb3RvY29sIEJpbmFyeVByb3RvY29sIHdoZXJlCi0gICAgZ2V0VHJhbnNwb3J0IChCaW5hcnlQcm90b2NvbCB0KSA9IHQKKy0tIE5PVEU6IFJlYWRpbmcgYW5kIFdyaXRpbmcgZnVuY3Rpb25zIHJlbHkgb24gQnVpbGRlcnMgYW5kIERhdGEuQmluYXJ5IHRvCistLSBlbmNvZGUgYW5kIGRlY29kZSBkYXRhLiAgRGF0YS5CaW5hcnkgYXNzdW1lcyB0aGF0IHRoZSBiaW5hcnkgdmFsdWVzIGl0IGlzCistLSBlbmNvZGluZyB0byBhbmQgZGVjb2RpbmcgZnJvbSBhcmUgaW4gQklHIEVORElBTiBmb3JtYXQsIGFuZCBjb252ZXJ0cyB0aGUKKy0tIGVuZGlhbm5lc3MgYXMgbmVjZXNzYXJ5IHRvIG1hdGNoIHRoZSBsb2NhbCBtYWNoaW5lLgoraW5zdGFuY2UgVHJhbnNwb3J0IHQgPT4gUHJvdG9jb2wgKEJpbmFyeVByb3RvY29sIHQpIHdoZXJlCisgICAgcmVhZEJ5dGUgcCA9IHRSZWFkQWxsIChnZXRUcmFuc3BvcnQgcCkgMQorICAgIC0tIGZsdXNoVHJhbnNwb3J0IHAgPSB0Rmx1c2ggKGdldFRyYW5zcG9ydCBwKQorICAgIHdyaXRlTWVzc2FnZSBwIChuLCB0LCBzKSBmID0gZG8KKyAgICAgIHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApIG1lc3NhZ2VCZWdpbgorICAgICAgZgorICAgICAgdEZsdXNoICQgZ2V0VHJhbnNwb3J0IHAKKyAgICAgIHdoZXJlCisgICAgICAgIG1lc3NhZ2VCZWdpbiA9IHRvTGF6eUJ5dGVTdHJpbmcgJAorICAgICAgICAgIGJ1aWxkQmluYXJ5VmFsdWUgKFRJMzIgKHZlcnNpb24xIC58LiBmcm9tSW50ZWdyYWwgKGZyb21FbnVtIHQpKSkgPD4KKyAgICAgICAgICBidWlsZEJpbmFyeVZhbHVlIChUU3RyaW5nICQgZW5jb2RlVXRmOCBuKSA8PgorICAgICAgICAgIGJ1aWxkQmluYXJ5VmFsdWUgKFRJMzIgcykKIAotICAgIHdyaXRlTWVzc2FnZUJlZ2luIHAgKG4sIHQsIHMpID0gZG8KLSAgICAgICAgd3JpdGVJMzIgcCAodmVyc2lvbl8xIC58LiAoZnJvbUludGVncmFsICQgZnJvbUVudW0gdCkpCi0gICAgICAgIHdyaXRlU3RyaW5nIHAgbgotICAgICAgICB3cml0ZUkzMiBwIHMKLSAgICB3cml0ZU1lc3NhZ2VFbmQgXyA9IHJldHVybiAoKQotCi0gICAgd3JpdGVTdHJ1Y3RCZWdpbiBfIF8gPSByZXR1cm4gKCkKLSAgICB3cml0ZVN0cnVjdEVuZCBfID0gcmV0dXJuICgpCi0gICAgd3JpdGVGaWVsZEJlZ2luIHAgKF8sIHQsIGkpID0gd3JpdGVUeXBlIHAgdCA+PiB3cml0ZUkxNiBwIGkKLSAgICB3cml0ZUZpZWxkRW5kIF8gPSByZXR1cm4gKCkKLSAgICB3cml0ZUZpZWxkU3RvcCBwID0gd3JpdGVUeXBlIHAgVF9TVE9QCi0gICAgd3JpdGVNYXBCZWdpbiBwIChrLCB2LCBuKSA9IHdyaXRlVHlwZSBwIGsgPj4gd3JpdGVUeXBlIHAgdiA+PiB3cml0ZUkzMiBwIG4KLSAgICB3cml0ZU1hcEVuZCBfID0gcmV0dXJuICgpCi0gICAgd3JpdGVMaXN0QmVnaW4gcCAodCwgbikgPSB3cml0ZVR5cGUgcCB0ID4+IHdyaXRlSTMyIHAgbgotICAgIHdyaXRlTGlzdEVuZCBfID0gcmV0dXJuICgpCi0gICAgd3JpdGVTZXRCZWdpbiBwICh0LCBuKSA9IHdyaXRlVHlwZSBwIHQgPj4gd3JpdGVJMzIgcCBuCi0gICAgd3JpdGVTZXRFbmQgXyA9IHJldHVybiAoKQotCi0gICAgd3JpdGVCb29sIHAgYiA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApICQgTEJTLnNpbmdsZXRvbiAkIHRvRW51bSAkIGlmIGIgdGhlbiAxIGVsc2UgMAotICAgIHdyaXRlQnl0ZSBwIGIgPSB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSAkIERhdGEuQmluYXJ5LmVuY29kZSBiCi0gICAgd3JpdGVJMTYgcCBiID0gdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgJCBEYXRhLkJpbmFyeS5lbmNvZGUgYgotICAgIHdyaXRlSTMyIHAgYiA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApICQgRGF0YS5CaW5hcnkuZW5jb2RlIGIKLSAgICB3cml0ZUk2NCBwIGIgPSB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSAkIERhdGEuQmluYXJ5LmVuY29kZSBiCi0gICAgd3JpdGVEb3VibGUgcCBkID0gd3JpdGVJNjQgcCAoZnJvbUludGVncmFsICQgZmxvYXRCaXRzIGQpCi0gICAgd3JpdGVTdHJpbmcgcCBzID0gd3JpdGVJMzIgcCAoZnJvbUludGVncmFsICQgbGVuZ3RoIHMpID4+IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApIChMQlNDaGFyOC5wYWNrIHMpCi0gICAgd3JpdGVCaW5hcnkgcCBzID0gd3JpdGVJMzIgcCAoZnJvbUludGVncmFsICQgTEJTLmxlbmd0aCBzKSA+PiB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSBzCi0KLSAgICByZWFkTWVzc2FnZUJlZ2luIHAgPSBkbwotICAgICAgICB2ZXIgPC0gcmVhZEkzMiBwCi0gICAgICAgIGlmICh2ZXIgLiYuIHZlcnNpb25fbWFzayAvPSB2ZXJzaW9uXzEpCisgICAgcmVhZE1lc3NhZ2UgcCA9IChyZWFkTWVzc2FnZUJlZ2luIHAgPj49KQorICAgICAgd2hlcmUKKyAgICAgICAgcmVhZE1lc3NhZ2VCZWdpbiBwID0gcnVuUGFyc2VyIHAgJCBkbworICAgICAgICAgIFRJMzIgdmVyIDwtIHBhcnNlQmluYXJ5VmFsdWUgVF9JMzIKKyAgICAgICAgICBpZiB2ZXIgLiYuIHZlcnNpb25NYXNrIC89IHZlcnNpb24xCiAgICAgICAgICAgICB0aGVuIHRocm93ICQgUHJvdG9jb2xFeG4gUEVfQkFEX1ZFUlNJT04gIk1pc3NpbmcgdmVyc2lvbiBpZGVudGlmaWVyIgogICAgICAgICAgICAgZWxzZSBkbwotICAgICAgICAgICAgICBzIDwtIHJlYWRTdHJpbmcgcAotICAgICAgICAgICAgICBzeiA8LSByZWFkSTMyIHAKLSAgICAgICAgICAgICAgcmV0dXJuIChzLCB0b0VudW0gJCBmcm9tSW50ZWdyYWwgJCB2ZXIgLiYuIDB4RkYsIHN6KQotICAgIHJlYWRNZXNzYWdlRW5kIF8gPSByZXR1cm4gKCkKLSAgICByZWFkU3RydWN0QmVnaW4gXyA9IHJldHVybiAiIgotICAgIHJlYWRTdHJ1Y3RFbmQgXyA9IHJldHVybiAoKQotICAgIHJlYWRGaWVsZEJlZ2luIHAgPSBkbwotICAgICAgICB0IDwtIHJlYWRUeXBlIHAKLSAgICAgICAgbiA8LSBpZiB0IC89IFRfU1RPUCB0aGVuIHJlYWRJMTYgcCBlbHNlIHJldHVybiAwCi0gICAgICAgIHJldHVybiAoIiIsIHQsIG4pCi0gICAgcmVhZEZpZWxkRW5kIF8gPSByZXR1cm4gKCkKLSAgICByZWFkTWFwQmVnaW4gcCA9IGRvCi0gICAgICAgIGt0IDwtIHJlYWRUeXBlIHAKLSAgICAgICAgdnQgPC0gcmVhZFR5cGUgcAotICAgICAgICBuIDwtIHJlYWRJMzIgcAotICAgICAgICByZXR1cm4gKGt0LCB2dCwgbikKLSAgICByZWFkTWFwRW5kIF8gPSByZXR1cm4gKCkKLSAgICByZWFkTGlzdEJlZ2luIHAgPSBkbwotICAgICAgICB0IDwtIHJlYWRUeXBlIHAKLSAgICAgICAgbiA8LSByZWFkSTMyIHAKLSAgICAgICAgcmV0dXJuICh0LCBuKQotICAgIHJlYWRMaXN0RW5kIF8gPSByZXR1cm4gKCkKLSAgICByZWFkU2V0QmVnaW4gcCA9IGRvCi0gICAgICAgIHQgPC0gcmVhZFR5cGUgcAotICAgICAgICBuIDwtIHJlYWRJMzIgcAotICAgICAgICByZXR1cm4gKHQsIG4pCi0gICAgcmVhZFNldEVuZCBfID0gcmV0dXJuICgpCisgICAgICAgICAgICAgIFRTdHJpbmcgcyA8LSBwYXJzZUJpbmFyeVZhbHVlIFRfU1RSSU5HCisgICAgICAgICAgICAgIFRJMzIgc3ogPC0gcGFyc2VCaW5hcnlWYWx1ZSBUX0kzMgorICAgICAgICAgICAgICByZXR1cm4gKGRlY29kZVV0ZjggcywgdG9FbnVtICQgZnJvbUludGVncmFsICQgdmVyIC4mLiAweEZGLCBzeikKIAotICAgIHJlYWRCb29sIHAgPSAoPT0gMSkgYGZtYXBgIHJlYWRCeXRlIHAKKyAgICB3cml0ZVZhbCBwID0gdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgLiB0b0xhenlCeXRlU3RyaW5nIC4gYnVpbGRCaW5hcnlWYWx1ZQorICAgIHJlYWRWYWwgcCA9IHJ1blBhcnNlciBwIC4gcGFyc2VCaW5hcnlWYWx1ZQogCi0gICAgcmVhZEJ5dGUgcCA9IGRvCi0gICAgICAgIGJzIDwtIHRSZWFkQWxsIChnZXRUcmFuc3BvcnQgcCkgMQotICAgICAgICByZXR1cm4gJCBEYXRhLkJpbmFyeS5kZWNvZGUgYnMKK2luc3RhbmNlIFRyYW5zcG9ydCB0ID0+IFN0YXRlbGVzc1Byb3RvY29sIChCaW5hcnlQcm90b2NvbCB0KSB3aGVyZQorICAgIHNlcmlhbGl6ZVZhbCBfID0gdG9MYXp5Qnl0ZVN0cmluZyAuIGJ1aWxkQmluYXJ5VmFsdWUKKyAgICBkZXNlcmlhbGl6ZVZhbCBfIHR5IGJzID0KKyAgICAgIGNhc2UgTFAuZWl0aGVyUmVzdWx0ICQgTFAucGFyc2UgKHBhcnNlQmluYXJ5VmFsdWUgdHkpIGJzIG9mCisgICAgICAgIExlZnQgcyAtPiBlcnJvciBzCisgICAgICAgIFJpZ2h0IHZhbCAtPiB2YWwKIAotICAgIHJlYWRJMTYgcCA9IGRvCi0gICAgICAgIGJzIDwtIHRSZWFkQWxsIChnZXRUcmFuc3BvcnQgcCkgMgotICAgICAgICByZXR1cm4gJCBEYXRhLkJpbmFyeS5kZWNvZGUgYnMKKy0tIHwgV3JpdGluZyBGdW5jdGlvbnMKK2J1aWxkQmluYXJ5VmFsdWUgOjogVGhyaWZ0VmFsIC0+IEJ1aWxkZXIKK2J1aWxkQmluYXJ5VmFsdWUgKFRTdHJ1Y3QgZmllbGRzKSA9IGJ1aWxkQmluYXJ5U3RydWN0IGZpZWxkcyA8PiBidWlsZFR5cGUgVF9TVE9QCitidWlsZEJpbmFyeVZhbHVlIChUTWFwIGt5IHZ0IGVudHJpZXMpID0KKyAgYnVpbGRUeXBlIGt5IDw+CisgIGJ1aWxkVHlwZSB2dCA8PgorICBpbnQzMkJFIChmcm9tSW50ZWdyYWwgKGxlbmd0aCBlbnRyaWVzKSkgPD4KKyAgYnVpbGRCaW5hcnlNYXAgZW50cmllcworYnVpbGRCaW5hcnlWYWx1ZSAoVExpc3QgdHkgZW50cmllcykgPQorICBidWlsZFR5cGUgdHkgPD4KKyAgaW50MzJCRSAoZnJvbUludGVncmFsIChsZW5ndGggZW50cmllcykpIDw+CisgIGJ1aWxkQmluYXJ5TGlzdCBlbnRyaWVzCitidWlsZEJpbmFyeVZhbHVlIChUU2V0IHR5IGVudHJpZXMpID0KKyAgYnVpbGRUeXBlIHR5IDw+CisgIGludDMyQkUgKGZyb21JbnRlZ3JhbCAobGVuZ3RoIGVudHJpZXMpKSA8PgorICBidWlsZEJpbmFyeUxpc3QgZW50cmllcworYnVpbGRCaW5hcnlWYWx1ZSAoVEJvb2wgYikgPQorICB3b3JkOCAkIHRvRW51bSAkIGlmIGIgdGhlbiAxIGVsc2UgMAorYnVpbGRCaW5hcnlWYWx1ZSAoVEJ5dGUgYikgPSBpbnQ4IGIKK2J1aWxkQmluYXJ5VmFsdWUgKFRJMTYgaSkgPSBpbnQxNkJFIGkKK2J1aWxkQmluYXJ5VmFsdWUgKFRJMzIgaSkgPSBpbnQzMkJFIGkKK2J1aWxkQmluYXJ5VmFsdWUgKFRJNjQgaSkgPSBpbnQ2NEJFIGkKK2J1aWxkQmluYXJ5VmFsdWUgKFREb3VibGUgZCkgPSBkb3VibGVCRSBkCitidWlsZEJpbmFyeVZhbHVlIChUU3RyaW5nIHMpID0gaW50MzJCRSBsZW4gPD4gbGF6eUJ5dGVTdHJpbmcgcworICB3aGVyZQorICAgIGxlbiA6OiBJbnQzMiA9IGZyb21JbnRlZ3JhbCAoTEJTLmxlbmd0aCBzKQorYnVpbGRCaW5hcnlWYWx1ZSAoVEJpbmFyeSBzKSA9IGJ1aWxkQmluYXJ5VmFsdWUgKFRTdHJpbmcgcykKIAotICAgIHJlYWRJMzIgcCA9IGRvCi0gICAgICAgIGJzIDwtIHRSZWFkQWxsIChnZXRUcmFuc3BvcnQgcCkgNAotICAgICAgICByZXR1cm4gJCBEYXRhLkJpbmFyeS5kZWNvZGUgYnMKK2J1aWxkQmluYXJ5U3RydWN0IDo6IE1hcC5IYXNoTWFwIEludDE2IChMVC5UZXh0LCBUaHJpZnRWYWwpIC0+IEJ1aWxkZXIKK2J1aWxkQmluYXJ5U3RydWN0ID0gTWFwLmZvbGRyV2l0aEtleSBjb21iaW5lIG1lbXB0eQorICB3aGVyZQorICAgIGNvbWJpbmUgZmlkIChfLHZhbCkgcyA9CisgICAgICBidWlsZFR5cGVPZiB2YWwgPD4gaW50MTZCRSBmaWQgPD4gYnVpbGRCaW5hcnlWYWx1ZSB2YWwgPD4gcwogCi0gICAgcmVhZEk2NCBwID0gZG8KLSAgICAgICAgYnMgPC0gdFJlYWRBbGwgKGdldFRyYW5zcG9ydCBwKSA4Ci0gICAgICAgIHJldHVybiAkIERhdGEuQmluYXJ5LmRlY29kZSBicworYnVpbGRCaW5hcnlNYXAgOjogWyhUaHJpZnRWYWwsIFRocmlmdFZhbCldIC0+IEJ1aWxkZXIKK2J1aWxkQmluYXJ5TWFwID0gZm9sZGwgY29tYmluZSBtZW1wdHkKKyAgd2hlcmUKKyAgICBjb21iaW5lIHMgKGtleSwgdmFsKSA9IHMgPD4gYnVpbGRCaW5hcnlWYWx1ZSBrZXkgPD4gYnVpbGRCaW5hcnlWYWx1ZSB2YWwKIAotICAgIHJlYWREb3VibGUgcCA9IGRvCi0gICAgICAgIGJzIDwtIHJlYWRJNjQgcAotICAgICAgICByZXR1cm4gJCBmbG9hdE9mQml0cyAkIGZyb21JbnRlZ3JhbCBicworYnVpbGRCaW5hcnlMaXN0IDo6IFtUaHJpZnRWYWxdIC0+IEJ1aWxkZXIKK2J1aWxkQmluYXJ5TGlzdCA9IGZvbGRyIChtYXBwZW5kIC4gYnVpbGRCaW5hcnlWYWx1ZSkgbWVtcHR5CiAKLSAgICByZWFkU3RyaW5nIHAgPSBkbwotICAgICAgICBpIDwtIHJlYWRJMzIgcAotICAgICAgICBMQlNDaGFyOC51bnBhY2sgYGxpZnRNYCB0UmVhZEFsbCAoZ2V0VHJhbnNwb3J0IHApIChmcm9tSW50ZWdyYWwgaSkKKy0tIHwgUmVhZGluZyBGdW5jdGlvbnMKK3BhcnNlQmluYXJ5VmFsdWUgOjogVGhyaWZ0VHlwZSAtPiBQLlBhcnNlciBUaHJpZnRWYWwKK3BhcnNlQmluYXJ5VmFsdWUgKFRfU1RSVUNUIHRtYXApID0gVFN0cnVjdCA8JD4gcGFyc2VCaW5hcnlTdHJ1Y3QgdG1hcAorcGFyc2VCaW5hcnlWYWx1ZSAoVF9NQVAgXyBfKSA9IGRvCisgIGt0IDwtIHBhcnNlVHlwZQorICB2dCA8LSBwYXJzZVR5cGUKKyAgbiA8LSBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSA0CisgIFRNYXAga3QgdnQgPCQ+IHBhcnNlQmluYXJ5TWFwIGt0IHZ0IG4KK3BhcnNlQmluYXJ5VmFsdWUgKFRfTElTVCBfKSA9IGRvCisgIHQgPC0gcGFyc2VUeXBlCisgIG4gPC0gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgNAorICBUTGlzdCB0IDwkPiBwYXJzZUJpbmFyeUxpc3QgdCBuCitwYXJzZUJpbmFyeVZhbHVlIChUX1NFVCBfKSA9IGRvCisgIHQgPC0gcGFyc2VUeXBlCisgIG4gPC0gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgNAorICBUU2V0IHQgPCQ+IHBhcnNlQmluYXJ5TGlzdCB0IG4KK3BhcnNlQmluYXJ5VmFsdWUgVF9CT09MID0gVEJvb2wgLiAoLz0wKSA8JD4gUC5hbnlXb3JkOAorcGFyc2VCaW5hcnlWYWx1ZSBUX0JZVEUgPSBUQnl0ZSAuIEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDEKK3BhcnNlQmluYXJ5VmFsdWUgVF9JMTYgPSBUSTE2IC4gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgMgorcGFyc2VCaW5hcnlWYWx1ZSBUX0kzMiA9IFRJMzIgLiBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSA0CitwYXJzZUJpbmFyeVZhbHVlIFRfSTY0ID0gVEk2NCAuIEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDgKK3BhcnNlQmluYXJ5VmFsdWUgVF9ET1VCTEUgPSBURG91YmxlIC4gYnNUb0RvdWJsZSA8JD4gUC50YWtlIDgKK3BhcnNlQmluYXJ5VmFsdWUgVF9TVFJJTkcgPSBwYXJzZUJpbmFyeVN0cmluZyBUU3RyaW5nCitwYXJzZUJpbmFyeVZhbHVlIFRfQklOQVJZID0gcGFyc2VCaW5hcnlTdHJpbmcgVEJpbmFyeQorcGFyc2VCaW5hcnlWYWx1ZSB0eSA9IGVycm9yICQgIkNhbm5vdCByZWFkIHZhbHVlIG9mIHR5cGUgIiArKyBzaG93IHR5CiAKLSAgICByZWFkQmluYXJ5IHAgPSBkbwotICAgICAgICBpIDwtIHJlYWRJMzIgcAotICAgICAgICB0UmVhZEFsbCAoZ2V0VHJhbnNwb3J0IHApIChmcm9tSW50ZWdyYWwgaSkKK3BhcnNlQmluYXJ5U3RyaW5nIHR5ID0gZG8KKyAgaSA6OiBJbnQzMiAgPC0gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgNAorICB0eSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgKGZyb21JbnRlZ3JhbCBpKQorCitwYXJzZUJpbmFyeVN0cnVjdCA6OiBUeXBlTWFwIC0+IFAuUGFyc2VyIChNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSkKK3BhcnNlQmluYXJ5U3RydWN0IHRtYXAgPSBNYXAuZnJvbUxpc3QgPCQ+IFAubWFueVRpbGwgcGFyc2VGaWVsZCAobWF0Y2hUeXBlIFRfU1RPUCkKKyAgd2hlcmUKKyAgICBwYXJzZUZpZWxkID0gZG8KKyAgICAgIHQgPC0gcGFyc2VUeXBlCisgICAgICBuIDwtIEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDIKKyAgICAgIHYgPC0gY2FzZSAodCwgTWFwLmxvb2t1cCBuIHRtYXApIG9mCisgICAgICAgICAgICAgKFRfU1RSSU5HLCBKdXN0IChfLCBUX0JJTkFSWSkpIC0+IHBhcnNlQmluYXJ5VmFsdWUgVF9CSU5BUlkKKyAgICAgICAgICAgICBfIC0+IHBhcnNlQmluYXJ5VmFsdWUgdAorICAgICAgcmV0dXJuIChuLCAoIiIsIHYpKQorCitwYXJzZUJpbmFyeU1hcCA6OiBUaHJpZnRUeXBlIC0+IFRocmlmdFR5cGUgLT4gSW50MzIgLT4gUC5QYXJzZXIgWyhUaHJpZnRWYWwsIFRocmlmdFZhbCldCitwYXJzZUJpbmFyeU1hcCBrdCB2dCBuIHwgbiA8PSAwID0gcmV0dXJuIFtdCisgICAgICAgICAgICAgICAgICAgICAgIHwgb3RoZXJ3aXNlID0gZG8KKyAgayA8LSBwYXJzZUJpbmFyeVZhbHVlIGt0CisgIHYgPC0gcGFyc2VCaW5hcnlWYWx1ZSB2dAorICAoKGssdikgOikgPCQ+IHBhcnNlQmluYXJ5TWFwIGt0IHZ0IChuLTEpCisKK3BhcnNlQmluYXJ5TGlzdCA6OiBUaHJpZnRUeXBlIC0+IEludDMyIC0+IFAuUGFyc2VyIFtUaHJpZnRWYWxdCitwYXJzZUJpbmFyeUxpc3QgdHkgbiB8IG4gPD0gMCA9IHJldHVybiBbXQorICAgICAgICAgICAgICAgICAgICAgfCBvdGhlcndpc2UgPSBsaWZ0TTIgKDopIChwYXJzZUJpbmFyeVZhbHVlIHR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyc2VCaW5hcnlMaXN0IHR5IChuLTEpKQorCiAKIAogLS0gfCBXcml0ZSBhIHR5cGUgYXMgYSBieXRlCi13cml0ZVR5cGUgOjogKFByb3RvY29sIHAsIFRyYW5zcG9ydCB0KSA9PiBwIHQgLT4gVGhyaWZ0VHlwZSAtPiBJTyAoKQotd3JpdGVUeXBlIHAgdCA9IHdyaXRlQnl0ZSBwIChmcm9tSW50ZWdyYWwgJCBmcm9tRW51bSB0KQorYnVpbGRUeXBlIDo6IFRocmlmdFR5cGUgLT4gQnVpbGRlcgorYnVpbGRUeXBlIHQgPSB3b3JkOCAkIGZyb21JbnRlZ3JhbCAkIGZyb21FbnVtIHQKKworLS0gfCBXcml0ZSB0eXBlIG9mIGEgVGhyaWZ0VmFsIGFzIGEgYnl0ZQorYnVpbGRUeXBlT2YgOjogVGhyaWZ0VmFsIC0+IEJ1aWxkZXIKK2J1aWxkVHlwZU9mID0gYnVpbGRUeXBlIC4gZ2V0VHlwZU9mCiAKIC0tIHwgUmVhZCBhIGJ5dGUgYXMgdGhvdWdoIGl0IHdlcmUgYSBUaHJpZnRUeXBlCi1yZWFkVHlwZSA6OiAoUHJvdG9jb2wgcCwgVHJhbnNwb3J0IHQpID0+IHAgdCAtPiBJTyBUaHJpZnRUeXBlCi1yZWFkVHlwZSBwID0gZG8KLSAgICBiIDwtIHJlYWRCeXRlIHAKLSAgICByZXR1cm4gJCB0b0VudW0gJCBmcm9tSW50ZWdyYWwgYgorcGFyc2VUeXBlIDo6IFAuUGFyc2VyIFRocmlmdFR5cGUKK3BhcnNlVHlwZSA9IHRvRW51bSAuIGZyb21JbnRlZ3JhbCA8JD4gUC5hbnlXb3JkOAogCi1mbG9hdEJpdHMgOjogRG91YmxlIC0+IFdvcmQ2NAotZmxvYXRCaXRzIChEIyBkIykgPSBXNjQjICh1bnNhZmVDb2VyY2UjIGQjKQotCi1mbG9hdE9mQml0cyA6OiBXb3JkNjQgLT4gRG91YmxlCi1mbG9hdE9mQml0cyAoVzY0IyBiIykgPSBEIyAodW5zYWZlQ29lcmNlIyBiIykKLQorbWF0Y2hUeXBlIDo6IFRocmlmdFR5cGUgLT4gUC5QYXJzZXIgVGhyaWZ0VHlwZQorbWF0Y2hUeXBlIHQgPSB0IDwkIFAud29yZDggKGZyb21JbnRlZ3JhbCAkIGZyb21FbnVtIHQpCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9Db21wYWN0LmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvQ29tcGFjdC5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjM5NzBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvQ29tcGFjdC5ocwpAQCAtMCwwICsxLDMxMSBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK3stIyBMQU5HVUFHRSBDUFAgIy19Cit7LSMgTEFOR1VBR0UgRXhpc3RlbnRpYWxRdWFudGlmaWNhdGlvbiAjLX0KK3stIyBMQU5HVUFHRSBPdmVybG9hZGVkU3RyaW5ncyAjLX0KK3stIyBMQU5HVUFHRSBTY29wZWRUeXBlVmFyaWFibGVzICMtfQorCittb2R1bGUgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QKKyAgICAoIG1vZHVsZSBUaHJpZnQuUHJvdG9jb2wKKyAgICAsIENvbXBhY3RQcm90b2NvbCguLikKKyAgICAsIHBhcnNlVmFyaW50CisgICAgLCBidWlsZFZhcmludAorICAgICkgd2hlcmUKKworaW1wb3J0IENvbnRyb2wuQXBwbGljYXRpdmUKK2ltcG9ydCBDb250cm9sLk1vbmFkCitpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcgYXMgUAoraW1wb3J0IERhdGEuQXR0b3BhcnNlYy5CeXRlU3RyaW5nLkxhenkgYXMgTFAKK2ltcG9ydCBEYXRhLkJpdHMKK2ltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5CdWlsZGVyIGFzIEIKK2ltcG9ydCBEYXRhLkludAoraW1wb3J0IERhdGEuTGlzdCBhcyBMaXN0CitpbXBvcnQgRGF0YS5Nb25vaWQKK2ltcG9ydCBEYXRhLldvcmQKK2ltcG9ydCBEYXRhLlRleHQuTGF6eS5FbmNvZGluZyAoIGRlY29kZVV0ZjgsIGVuY29kZVV0ZjggKQorCitpbXBvcnQgVGhyaWZ0LlByb3RvY29sCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UeXBlcworCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZyBhcyBCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5UZXh0LkxhenkgYXMgTFQKKworLS0gfCB0aGUgQ29tcGFjdCBQcm90b2NvbCBpbXBsZW1lbnRzIHRoZSBzdGFuZGFyZCBUaHJpZnQgJ1RDb21wYWN0UHJvY290b2wnCistLSB3aGljaCBpcyBzaW1pbGFyIHRvIHRoZSAnVEJpbmFyeVByb3RvY29sJywgYnV0IHRha2VzIGxlc3Mgc3BhY2Ugb24gdGhlIHdpcmUuCistLSBJbnRlZ3JhbCB0eXBlcyBhcmUgZW5jb2RlZCB1c2luZyBhcyB2YXJpbnRzLgorZGF0YSBDb21wYWN0UHJvdG9jb2wgYSA9IENvbXBhY3RQcm90b2NvbCBhCisgICAgICAgICAgICAgICAgICAgICAgICAgLS0gXiBDb25zdHVjdCBhICdDb21wYWN0UHJvdG9jb2wnIHdpdGggYSAnVHJhbnNwb3J0JworCitwcm90b2NvbElELCB2ZXJzaW9uLCB2ZXJzaW9uTWFzaywgdHlwZU1hc2ssIHR5cGVCaXRzIDo6IFdvcmQ4Citwcm90b2NvbElEICA9IDB4ODIgLS0gMTAwMCAwMDEwCit2ZXJzaW9uICAgICA9IDB4MDEKK3ZlcnNpb25NYXNrID0gMHgxZiAtLSAwMDAxIDExMTEKK3R5cGVNYXNrICAgID0gMHhlMCAtLSAxMTEwIDAwMDAKK3R5cGVCaXRzICAgID0gMHgwNyAtLSAwMDAwIDAxMTEKK3R5cGVTaGlmdEFtb3VudCA6OiBJbnQKK3R5cGVTaGlmdEFtb3VudCA9IDUKKworZ2V0VHJhbnNwb3J0IDo6IFRyYW5zcG9ydCB0ID0+IENvbXBhY3RQcm90b2NvbCB0IC0+IHQKK2dldFRyYW5zcG9ydCAoQ29tcGFjdFByb3RvY29sIHQpID0gdAorCitpbnN0YW5jZSBUcmFuc3BvcnQgdCA9PiBQcm90b2NvbCAoQ29tcGFjdFByb3RvY29sIHQpIHdoZXJlCisgICAgcmVhZEJ5dGUgcCA9IHRSZWFkQWxsIChnZXRUcmFuc3BvcnQgcCkgMQorICAgIHdyaXRlTWVzc2FnZSBwIChuLCB0LCBzKSBmID0gZG8KKyAgICAgIHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApIG1lc3NhZ2VCZWdpbgorICAgICAgZgorICAgICAgdEZsdXNoICQgZ2V0VHJhbnNwb3J0IHAKKyAgICAgIHdoZXJlCisgICAgICAgIG1lc3NhZ2VCZWdpbiA9IHRvTGF6eUJ5dGVTdHJpbmcgJAorICAgICAgICAgIEIud29yZDggcHJvdG9jb2xJRCA8PgorICAgICAgICAgIEIud29yZDggKCh2ZXJzaW9uIC4mLiB2ZXJzaW9uTWFzaykgLnwuCisgICAgICAgICAgICAgICAgICAoKChmcm9tSW50ZWdyYWwgJCBmcm9tRW51bSB0KSBgc2hpZnRMYAorICAgICAgICAgICAgICAgICAgdHlwZVNoaWZ0QW1vdW50KSAuJi4gdHlwZU1hc2spKSA8PgorICAgICAgICAgIGJ1aWxkVmFyaW50IChpMzJUb1ppZ1phZyBzKSA8PgorICAgICAgICAgIGJ1aWxkQ29tcGFjdFZhbHVlIChUU3RyaW5nICQgZW5jb2RlVXRmOCBuKQorCisgICAgcmVhZE1lc3NhZ2UgcCBmID0gcmVhZE1lc3NhZ2VCZWdpbiA+Pj0gZgorICAgICAgd2hlcmUKKyAgICAgICAgcmVhZE1lc3NhZ2VCZWdpbiA9IHJ1blBhcnNlciBwICQgZG8KKyAgICAgICAgICBwaWQgPC0gZnJvbUludGVncmFsIDwkPiBQLmFueVdvcmQ4CisgICAgICAgICAgd2hlbiAocGlkIC89IHByb3RvY29sSUQpICQgZXJyb3IgIkJhZCBQcm90b2NvbCBJRCIKKyAgICAgICAgICB3IDwtIGZyb21JbnRlZ3JhbCA8JD4gUC5hbnlXb3JkOAorICAgICAgICAgIGxldCB2ZXIgPSB3IC4mLiB2ZXJzaW9uTWFzaworICAgICAgICAgIHdoZW4gKHZlciAvPSB2ZXJzaW9uKSAkIGVycm9yICJCYWQgUHJvdG9jb2wgdmVyc2lvbiIKKyAgICAgICAgICBsZXQgdHlwID0gKHcgYHNoaWZ0UmAgdHlwZVNoaWZ0QW1vdW50KSAuJi4gdHlwZUJpdHMKKyAgICAgICAgICBzZXFJZCA8LSBwYXJzZVZhcmludCB6aWdaYWdUb0kzMgorICAgICAgICAgIFRTdHJpbmcgbmFtZSA8LSBwYXJzZUNvbXBhY3RWYWx1ZSBUX1NUUklORworICAgICAgICAgIHJldHVybiAoZGVjb2RlVXRmOCBuYW1lLCB0b0VudW0gJCBmcm9tSW50ZWdyYWwgJCB0eXAsIHNlcUlkKQorCisgICAgd3JpdGVWYWwgcCA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApIC4gdG9MYXp5Qnl0ZVN0cmluZyAuIGJ1aWxkQ29tcGFjdFZhbHVlCisgICAgcmVhZFZhbCBwIHR5ID0gcnVuUGFyc2VyIHAgJCBwYXJzZUNvbXBhY3RWYWx1ZSB0eQorCitpbnN0YW5jZSBUcmFuc3BvcnQgdCA9PiBTdGF0ZWxlc3NQcm90b2NvbCAoQ29tcGFjdFByb3RvY29sIHQpIHdoZXJlCisgICAgc2VyaWFsaXplVmFsIF8gPSB0b0xhenlCeXRlU3RyaW5nIC4gYnVpbGRDb21wYWN0VmFsdWUKKyAgICBkZXNlcmlhbGl6ZVZhbCBfIHR5IGJzID0KKyAgICAgIGNhc2UgTFAuZWl0aGVyUmVzdWx0ICQgTFAucGFyc2UgKHBhcnNlQ29tcGFjdFZhbHVlIHR5KSBicyBvZgorICAgICAgICBMZWZ0IHMgLT4gZXJyb3IgcworICAgICAgICBSaWdodCB2YWwgLT4gdmFsCisKKy0tIHwgV3JpdGluZyBGdW5jdGlvbnMKK2J1aWxkQ29tcGFjdFZhbHVlIDo6IFRocmlmdFZhbCAtPiBCdWlsZGVyCitidWlsZENvbXBhY3RWYWx1ZSAoVFN0cnVjdCBmaWVsZHMpID0gYnVpbGRDb21wYWN0U3RydWN0IGZpZWxkcworYnVpbGRDb21wYWN0VmFsdWUgKFRNYXAga3QgdnQgZW50cmllcykgPQorICBsZXQgbGVuID0gZnJvbUludGVncmFsICQgbGVuZ3RoIGVudHJpZXMgOjogV29yZDMyIGluCisgIGlmIGxlbiA9PSAwCisgIHRoZW4gQi53b3JkOCAweDAwCisgIGVsc2UgYnVpbGRWYXJpbnQgbGVuIDw+CisgICAgICAgQi53b3JkOCAoZnJvbVRUeXBlIGt0IGBzaGlmdExgIDQgLnwuIGZyb21UVHlwZSB2dCkgPD4KKyAgICAgICBidWlsZENvbXBhY3RNYXAgZW50cmllcworYnVpbGRDb21wYWN0VmFsdWUgKFRMaXN0IHR5IGVudHJpZXMpID0KKyAgbGV0IGxlbiA9IGxlbmd0aCBlbnRyaWVzIGluCisgIChpZiBsZW4gPCAxNQorICAgdGhlbiBCLndvcmQ4ICQgKGZyb21JbnRlZ3JhbCBsZW4gYHNoaWZ0TGAgNCkgLnwuIGZyb21UVHlwZSB0eQorICAgZWxzZSBCLndvcmQ4ICgweEYwIC58LiBmcm9tVFR5cGUgdHkpIDw+CisgICAgICAgIGJ1aWxkVmFyaW50IChmcm9tSW50ZWdyYWwgbGVuIDo6IFdvcmQzMikpIDw+CisgIGJ1aWxkQ29tcGFjdExpc3QgZW50cmllcworYnVpbGRDb21wYWN0VmFsdWUgKFRTZXQgdHkgZW50cmllcykgPSBidWlsZENvbXBhY3RWYWx1ZSAoVExpc3QgdHkgZW50cmllcykKK2J1aWxkQ29tcGFjdFZhbHVlIChUQm9vbCBiKSA9CisgIEIud29yZDggJCB0b0VudW0gJCBpZiBiIHRoZW4gMSBlbHNlIDAKK2J1aWxkQ29tcGFjdFZhbHVlIChUQnl0ZSBiKSA9IGludDggYgorYnVpbGRDb21wYWN0VmFsdWUgKFRJMTYgaSkgPSBidWlsZFZhcmludCAkIGkxNlRvWmlnWmFnIGkKK2J1aWxkQ29tcGFjdFZhbHVlIChUSTMyIGkpID0gYnVpbGRWYXJpbnQgJCBpMzJUb1ppZ1phZyBpCitidWlsZENvbXBhY3RWYWx1ZSAoVEk2NCBpKSA9IGJ1aWxkVmFyaW50ICQgaTY0VG9aaWdaYWcgaQorYnVpbGRDb21wYWN0VmFsdWUgKFREb3VibGUgZCkgPSBkb3VibGVMRSBkCitidWlsZENvbXBhY3RWYWx1ZSAoVFN0cmluZyBzKSA9IGJ1aWxkVmFyaW50IGxlbiA8PiBsYXp5Qnl0ZVN0cmluZyBzCisgIHdoZXJlCisgICAgbGVuID0gZnJvbUludGVncmFsIChMQlMubGVuZ3RoIHMpIDo6IFdvcmQzMgorYnVpbGRDb21wYWN0VmFsdWUgKFRCaW5hcnkgcykgPSBidWlsZENvbXBhY3RWYWx1ZSAoVFN0cmluZyBzKQorCitidWlsZENvbXBhY3RTdHJ1Y3QgOjogTWFwLkhhc2hNYXAgSW50MTYgKExULlRleHQsIFRocmlmdFZhbCkgLT4gQnVpbGRlcgorYnVpbGRDb21wYWN0U3RydWN0ID0gZmxpcCAobG9vcCAwKSBtZW1wdHkgLiBNYXAudG9MaXN0CisgIHdoZXJlCisgICAgbG9vcCBfIFtdIGFjYyA9IGFjYyA8PiBCLndvcmQ4IChmcm9tVFR5cGUgVF9TVE9QKQorICAgIGxvb3AgbGFzdElkICgoZmlkLCAoXyx2YWwpKSA6IGZpZWxkcykgYWNjID0gbG9vcCBmaWQgZmllbGRzICQgYWNjIDw+CisgICAgICAoaWYgZmlkID4gbGFzdElkICYmIGZpZCAtIGxhc3RJZCA8PSAxNQorICAgICAgIHRoZW4gQi53b3JkOCAkIGZyb21JbnRlZ3JhbCAoKGZpZCAtIGxhc3RJZCkgYHNoaWZ0TGAgNCkgLnwuIHR5cGVPZiB2YWwKKyAgICAgICBlbHNlIEIud29yZDggKHR5cGVPZiB2YWwpIDw+IGJ1aWxkVmFyaW50IChpMTZUb1ppZ1phZyBmaWQpKSA8PgorICAgICAgKGlmIHR5cGVPZiB2YWwgPiAweDAyIC0tIE5vdCBhIFRfQk9PTAorICAgICAgIHRoZW4gYnVpbGRDb21wYWN0VmFsdWUgdmFsCisgICAgICAgZWxzZSBtZW1wdHkpIC0tIFRfQk9PTHMgYXJlIGVuY29kZWQgaW4gdGhlIHR5cGUKK2J1aWxkQ29tcGFjdE1hcCA6OiBbKFRocmlmdFZhbCwgVGhyaWZ0VmFsKV0gLT4gQnVpbGRlcgorYnVpbGRDb21wYWN0TWFwID0gZm9sZGwgY29tYmluZSBtZW1wdHkKKyAgd2hlcmUKKyAgICBjb21iaW5lIHMgKGtleSwgdmFsKSA9IGJ1aWxkQ29tcGFjdFZhbHVlIGtleSA8PiBidWlsZENvbXBhY3RWYWx1ZSB2YWwgPD4gcworCitidWlsZENvbXBhY3RMaXN0IDo6IFtUaHJpZnRWYWxdIC0+IEJ1aWxkZXIKK2J1aWxkQ29tcGFjdExpc3QgPSBmb2xkciAobWFwcGVuZCAuIGJ1aWxkQ29tcGFjdFZhbHVlKSBtZW1wdHkKKworLS0gfCBSZWFkaW5nIEZ1bmN0aW9ucworcGFyc2VDb21wYWN0VmFsdWUgOjogVGhyaWZ0VHlwZSAtPiBQYXJzZXIgVGhyaWZ0VmFsCitwYXJzZUNvbXBhY3RWYWx1ZSAoVF9TVFJVQ1QgdG1hcCkgPSBUU3RydWN0IDwkPiBwYXJzZUNvbXBhY3RTdHJ1Y3QgdG1hcAorcGFyc2VDb21wYWN0VmFsdWUgKFRfTUFQIGt0JyB2dCcpID0gZG8KKyAgbiA8LSBwYXJzZVZhcmludCBpZAorICBpZiBuID09IDAKKyAgICB0aGVuIHJldHVybiAkIFRNYXAga3QnIHZ0JyBbXQorICAgIGVsc2UgZG8KKyAgICB3IDwtIFAuYW55V29yZDgKKyAgICBsZXQga3QgPSB0eXBlRnJvbSAkIHcgYHNoaWZ0UmAgNAorICAgICAgICB2dCA9IHR5cGVGcm9tICQgdyAuJi4gMHgwRgorICAgIFRNYXAga3QgdnQgPCQ+IHBhcnNlQ29tcGFjdE1hcCBrdCB2dCBuCitwYXJzZUNvbXBhY3RWYWx1ZSAoVF9MSVNUIHR5KSA9IFRMaXN0IHR5IDwkPiBwYXJzZUNvbXBhY3RMaXN0CitwYXJzZUNvbXBhY3RWYWx1ZSAoVF9TRVQgdHkpID0gVFNldCB0eSA8JD4gcGFyc2VDb21wYWN0TGlzdAorcGFyc2VDb21wYWN0VmFsdWUgVF9CT09MID0gVEJvb2wgLiAoLz0wKSA8JD4gUC5hbnlXb3JkOAorcGFyc2VDb21wYWN0VmFsdWUgVF9CWVRFID0gVEJ5dGUgLiBmcm9tSW50ZWdyYWwgPCQ+IFAuYW55V29yZDgKK3BhcnNlQ29tcGFjdFZhbHVlIFRfSTE2ID0gVEkxNiA8JD4gcGFyc2VWYXJpbnQgemlnWmFnVG9JMTYKK3BhcnNlQ29tcGFjdFZhbHVlIFRfSTMyID0gVEkzMiA8JD4gcGFyc2VWYXJpbnQgemlnWmFnVG9JMzIKK3BhcnNlQ29tcGFjdFZhbHVlIFRfSTY0ID0gVEk2NCA8JD4gcGFyc2VWYXJpbnQgemlnWmFnVG9JNjQKK3BhcnNlQ29tcGFjdFZhbHVlIFRfRE9VQkxFID0gVERvdWJsZSAuIGJzVG9Eb3VibGVMRSA8JD4gUC50YWtlIDgKK3BhcnNlQ29tcGFjdFZhbHVlIFRfU1RSSU5HID0gcGFyc2VDb21wYWN0U3RyaW5nIFRTdHJpbmcKK3BhcnNlQ29tcGFjdFZhbHVlIFRfQklOQVJZID0gcGFyc2VDb21wYWN0U3RyaW5nIFRCaW5hcnkKK3BhcnNlQ29tcGFjdFZhbHVlIHR5ID0gZXJyb3IgJCAiQ2Fubm90IHJlYWQgdmFsdWUgb2YgdHlwZSAiICsrIHNob3cgdHkKKworcGFyc2VDb21wYWN0U3RyaW5nIHR5ID0gZG8KKyAgbGVuIDo6IFdvcmQzMiA8LSBwYXJzZVZhcmludCBpZAorICB0eSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgKGZyb21JbnRlZ3JhbCBsZW4pCisKK3BhcnNlQ29tcGFjdFN0cnVjdCA6OiBUeXBlTWFwIC0+IFBhcnNlciAoTWFwLkhhc2hNYXAgSW50MTYgKExULlRleHQsIFRocmlmdFZhbCkpCitwYXJzZUNvbXBhY3RTdHJ1Y3QgdG1hcCA9IE1hcC5mcm9tTGlzdCA8JD4gcGFyc2VGaWVsZHMgMAorICB3aGVyZQorICAgIHBhcnNlRmllbGRzIDo6IEludDE2IC0+IFBhcnNlciBbKEludDE2LCAoTFQuVGV4dCwgVGhyaWZ0VmFsKSldCisgICAgcGFyc2VGaWVsZHMgbGFzdElkID0gZG8KKyAgICAgIHcgPC0gUC5hbnlXb3JkOAorICAgICAgaWYgdyA9PSAweDAwCisgICAgICAgIHRoZW4gcmV0dXJuIFtdCisgICAgICAgIGVsc2UgZG8KKyAgICAgICAgICBsZXQgdHkgPSB0eXBlRnJvbSAodyAuJi4gMHgwRikKKyAgICAgICAgICAgICAgbW9kaWZpZXIgPSAodyAuJi4gMHhGMCkgYHNoaWZ0UmAgNAorICAgICAgICAgIGZpZCA8LSBpZiBtb2RpZmllciAvPSAwCisgICAgICAgICAgICAgICAgIHRoZW4gcmV0dXJuIChsYXN0SWQgKyBmcm9tSW50ZWdyYWwgbW9kaWZpZXIpCisgICAgICAgICAgICAgICAgIGVsc2UgcGFyc2VWYXJpbnQgemlnWmFnVG9JMTYKKyAgICAgICAgICB2YWwgPC0gaWYgdHkgPT0gVF9CT09MCisgICAgICAgICAgICAgICAgIHRoZW4gcmV0dXJuIChUQm9vbCAkICh3IC4mLiAweDBGKSA9PSAweDAxKQorICAgICAgICAgICAgICAgICBlbHNlIGNhc2UgKHR5LCBNYXAubG9va3VwIGZpZCB0bWFwKSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgKFRfU1RSSU5HLCBKdXN0IChfLCBUX0JJTkFSWSkpIC0+IHBhcnNlQ29tcGFjdFZhbHVlIFRfQklOQVJZCisgICAgICAgICAgICAgICAgICAgICAgICBfIC0+IHBhcnNlQ29tcGFjdFZhbHVlIHR5CisgICAgICAgICAgKChmaWQsIChMVC5lbXB0eSwgdmFsKSkgOiApIDwkPiBwYXJzZUZpZWxkcyBmaWQKKworcGFyc2VDb21wYWN0TWFwIDo6IFRocmlmdFR5cGUgLT4gVGhyaWZ0VHlwZSAtPiBJbnQzMiAtPgorICAgICAgICAgICAgICAgICAgIFBhcnNlciBbKFRocmlmdFZhbCwgVGhyaWZ0VmFsKV0KK3BhcnNlQ29tcGFjdE1hcCBrdCB2dCBuIHwgbiA8PSAwID0gcmV0dXJuIFtdCisgICAgICAgICAgICAgICAgICAgICAgICB8IG90aGVyd2lzZSA9IGRvCisgIGsgPC0gcGFyc2VDb21wYWN0VmFsdWUga3QKKyAgdiA8LSBwYXJzZUNvbXBhY3RWYWx1ZSB2dAorICAoKGssdikgOikgPCQ+IHBhcnNlQ29tcGFjdE1hcCBrdCB2dCAobi0xKQorCitwYXJzZUNvbXBhY3RMaXN0IDo6IFBhcnNlciBbVGhyaWZ0VmFsXQorcGFyc2VDb21wYWN0TGlzdCA9IGRvCisgIHcgPC0gUC5hbnlXb3JkOAorICBsZXQgdHkgPSB0eXBlRnJvbSAkIHcgLiYuIDB4MEYKKyAgICAgIGxzaXplID0gdyBgc2hpZnRSYCA0CisgIHNpemUgPC0gaWYgbHNpemUgPT0gMHhGCisgICAgICAgICAgdGhlbiBwYXJzZVZhcmludCBpZAorICAgICAgICAgIGVsc2UgcmV0dXJuICQgZnJvbUludGVncmFsIGxzaXplCisgIGxvb3AgdHkgc2l6ZQorICB3aGVyZQorICAgIGxvb3AgOjogVGhyaWZ0VHlwZSAtPiBJbnQzMiAtPiBQYXJzZXIgW1RocmlmdFZhbF0KKyAgICBsb29wIHR5IG4gfCBuIDw9IDAgPSByZXR1cm4gW10KKyAgICAgICAgICAgICAgfCBvdGhlcndpc2UgPSBsaWZ0TTIgKDopIChwYXJzZUNvbXBhY3RWYWx1ZSB0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9vcCB0eSAobi0xKSkKKworLS0gU2lnbmVkIG51bWJlcnMgbXVzdCBiZSBjb252ZXJ0ZWQgdG8gIlppZyBaYWciIGZvcm1hdCBiZWZvcmUgdGhleSBjYW4gYmUKKy0tIHNlcmlhbGl6ZWQgaW4gdGhlIFZhcmludCBmb3JtYXQKK2kxNlRvWmlnWmFnIDo6IEludDE2IC0+IFdvcmQxNgoraTE2VG9aaWdaYWcgbiA9IGZyb21JbnRlZ3JhbCAkIChuIGBzaGlmdExgIDEpIGB4b3JgIChuIGBzaGlmdFJgIDE1KQorCit6aWdaYWdUb0kxNiA6OiBXb3JkMTYgLT4gSW50MTYKK3ppZ1phZ1RvSTE2IG4gPSBmcm9tSW50ZWdyYWwgJCAobiBgc2hpZnRSYCAxKSBgeG9yYCBuZWdhdGUgKG4gLiYuIDB4MSkKKworaTMyVG9aaWdaYWcgOjogSW50MzIgLT4gV29yZDMyCitpMzJUb1ppZ1phZyBuID0gZnJvbUludGVncmFsICQgKG4gYHNoaWZ0TGAgMSkgYHhvcmAgKG4gYHNoaWZ0UmAgMzEpCisKK3ppZ1phZ1RvSTMyIDo6IFdvcmQzMiAtPiBJbnQzMgoremlnWmFnVG9JMzIgbiA9IGZyb21JbnRlZ3JhbCAkIChuIGBzaGlmdFJgIDEpIGB4b3JgIG5lZ2F0ZSAobiAuJi4gMHgxKQorCitpNjRUb1ppZ1phZyA6OiBJbnQ2NCAtPiBXb3JkNjQKK2k2NFRvWmlnWmFnIG4gPSBmcm9tSW50ZWdyYWwgJCAobiBgc2hpZnRMYCAxKSBgeG9yYCAobiBgc2hpZnRSYCA2MykKKworemlnWmFnVG9JNjQgOjogV29yZDY0IC0+IEludDY0Cit6aWdaYWdUb0k2NCBuID0gZnJvbUludGVncmFsICQgKG4gYHNoaWZ0UmAgMSkgYHhvcmAgbmVnYXRlIChuIC4mLiAweDEpCisKK2J1aWxkVmFyaW50IDo6IChCaXRzIGEsIEludGVncmFsIGEpICA9PiBhIC0+IEJ1aWxkZXIKK2J1aWxkVmFyaW50IG4gfCBuIC4mLiBjb21wbGVtZW50IDB4N0YgPT0gMCA9IEIud29yZDggJCBmcm9tSW50ZWdyYWwgbgorICAgICAgICAgICAgICB8IG90aGVyd2lzZSA9IEIud29yZDggKDB4ODAgLnwuIChmcm9tSW50ZWdyYWwgbiAuJi4gMHg3RikpIDw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRWYXJpbnQgKG4gYHNoaWZ0UmAgNykKKworcGFyc2VWYXJpbnQgOjogKEJpdHMgYSwgSW50ZWdyYWwgYSwgT3JkIGEpID0+IChhIC0+IGIpIC0+IFBhcnNlciBiCitwYXJzZVZhcmludCBmcm9tWmlnWmFnID0gZG8KKyAgYnl0ZXN0ZW1wIDwtIEJTLnVucGFjayA8JD4gUC50YWtlVGlsbCAobm90IC4gZmxpcCB0ZXN0Qml0IDcpCisgIGxzYiA8LSBQLmFueVdvcmQ4CisgIGxldCBieXRlcyA9IGxzYiA6IExpc3QucmV2ZXJzZSBieXRlc3RlbXAKKyAgcmV0dXJuICQgZnJvbVppZ1phZyAkIExpc3QuZm9sZGwnIGNvbWJpbmUgMHgwMCBieXRlcworICB3aGVyZSBjb21iaW5lIGEgYiA9IChhIGBzaGlmdExgIDcpIC58LiAoZnJvbUludGVncmFsIGIgLiYuIDB4N2YpCisKKy0tIHwgQ29tcHV0ZSB0aGUgQ29tcGFjdCBUeXBlCitmcm9tVFR5cGUgOjogVGhyaWZ0VHlwZSAtPiBXb3JkOAorZnJvbVRUeXBlIHR5ID0gY2FzZSB0eSBvZgorICBUX1NUT1AgLT4gMHgwMAorICBUX0JPT0wgLT4gMHgwMQorICBUX0JZVEUgLT4gMHgwMworICBUX0kxNiAtPiAweDA0CisgIFRfSTMyIC0+IDB4MDUKKyAgVF9JNjQgLT4gMHgwNgorICBUX0RPVUJMRSAtPiAweDA3CisgIFRfU1RSSU5HIC0+IDB4MDgKKyAgVF9CSU5BUlkgLT4gMHgwOAorICBUX0xJU1R7fSAtPiAweDA5CisgIFRfU0VUe30gLT4gMHgwQQorICBUX01BUHt9IC0+IDB4MEIKKyAgVF9TVFJVQ1R7fSAtPiAweDBDCisgIFRfVk9JRCAtPiBlcnJvciAiTm8gQ29tcGFjdCB0eXBlIGZvciBUX1ZPSUQiCisKK3R5cGVPZiA6OiBUaHJpZnRWYWwgLT4gV29yZDgKK3R5cGVPZiB2ID0gY2FzZSB2IG9mCisgIFRCb29sIFRydWUgLT4gMHgwMQorICBUQm9vbCBGYWxzZSAtPiAweDAyCisgIFRCeXRlIF8gLT4gMHgwMworICBUSTE2IF8gLT4gMHgwNAorICBUSTMyIF8gLT4gMHgwNQorICBUSTY0IF8gLT4gMHgwNgorICBURG91YmxlIF8gLT4gMHgwNworICBUU3RyaW5nIF8gLT4gMHgwOAorICBUQmluYXJ5IF8gLT4gMHgwOAorICBUTGlzdHt9IC0+IDB4MDkKKyAgVFNldHt9IC0+IDB4MEEKKyAgVE1hcHt9IC0+IDB4MEIKKyAgVFN0cnVjdHt9IC0+IDB4MEMKKwordHlwZUZyb20gOjogV29yZDggLT4gVGhyaWZ0VHlwZQordHlwZUZyb20gdyA9IGNhc2UgdyBvZgorICAweDAxIC0+IFRfQk9PTAorICAweDAyIC0+IFRfQk9PTAorICAweDAzIC0+IFRfQllURQorICAweDA0IC0+IFRfSTE2CisgIDB4MDUgLT4gVF9JMzIKKyAgMHgwNiAtPiBUX0k2NAorICAweDA3IC0+IFRfRE9VQkxFCisgIDB4MDggLT4gVF9TVFJJTkcKKyAgMHgwOSAtPiBUX0xJU1QgVF9WT0lECisgIDB4MEEgLT4gVF9TRVQgVF9WT0lECisgIDB4MEIgLT4gVF9NQVAgVF9WT0lEIFRfVk9JRAorICAweDBDIC0+IFRfU1RSVUNUIE1hcC5lbXB0eQorICBuIC0+IGVycm9yICQgInR5cGVGcm9tOiAiICsrIHNob3cgbiArKyAiIGlzIG5vdCBhIGNvbXBhY3QgdHlwZSIKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0hlYWRlci5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0hlYWRlci5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjQyZGI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvSGVhZGVyLmhzCkBAIC0wLDAgKzEsMTQxIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworCittb2R1bGUgVGhyaWZ0LlByb3RvY29sLkhlYWRlcgorICAgICggbW9kdWxlIFRocmlmdC5Qcm90b2NvbAorICAgICwgSGVhZGVyUHJvdG9jb2woLi4pCisgICAgLCBnZXRQcm90b2NvbFR5cGUKKyAgICAsIHNldFByb3RvY29sVHlwZQorICAgICwgZ2V0SGVhZGVycworICAgICwgZ2V0V3JpdGVIZWFkZXJzCisgICAgLCBzZXRIZWFkZXIKKyAgICAsIHNldEhlYWRlcnMKKyAgICAsIGNyZWF0ZUhlYWRlclByb3RvY29sCisgICAgLCBjcmVhdGVIZWFkZXJQcm90b2NvbDEKKyAgICApIHdoZXJlCisKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkpTT04KK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LkhlYWRlcgoraW1wb3J0IERhdGEuSU9SZWYKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5NYXAgYXMgTWFwCisKK2RhdGEgUHJvdG9jb2xXcmFwID0gZm9yYWxsIGEuIChQcm90b2NvbCBhKSA9PiBQcm90b2NvbFdyYXAoYSkKKworaW5zdGFuY2UgUHJvdG9jb2wgUHJvdG9jb2xXcmFwIHdoZXJlCisgIHJlYWRCeXRlIChQcm90b2NvbFdyYXAgcCkgPSByZWFkQnl0ZSBwCisgIHJlYWRWYWwgKFByb3RvY29sV3JhcCBwKSA9IHJlYWRWYWwgcAorICByZWFkTWVzc2FnZSAoUHJvdG9jb2xXcmFwIHApID0gcmVhZE1lc3NhZ2UgcAorICB3cml0ZVZhbCAoUHJvdG9jb2xXcmFwIHApID0gd3JpdGVWYWwgcAorICB3cml0ZU1lc3NhZ2UgKFByb3RvY29sV3JhcCBwKSA9IHdyaXRlTWVzc2FnZSBwCisKK2RhdGEgSGVhZGVyUHJvdG9jb2wgaSBvID0gKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgeworICAgIHRyYW5zIDo6IEhlYWRlclRyYW5zcG9ydCBpIG8sCisgICAgd3JhcHBlZFByb3RvIDo6IElPUmVmIFByb3RvY29sV3JhcAorICB9CisKK2NyZWF0ZVByb3RvY29sV3JhcCA6OiBUcmFuc3BvcnQgdCA9PiBQcm90b2NvbFR5cGUgLT4gdCAtPiBQcm90b2NvbFdyYXAKK2NyZWF0ZVByb3RvY29sV3JhcCB0eXAgdCA9CisgIGNhc2UgdHlwIG9mCisgICAgVEJpbmFyeSAtPiBQcm90b2NvbFdyYXAgJCBCaW5hcnlQcm90b2NvbCB0CisgICAgVENvbXBhY3QgLT4gUHJvdG9jb2xXcmFwICQgQ29tcGFjdFByb3RvY29sIHQKKyAgICBUSlNPTiAtPiBQcm90b2NvbFdyYXAgJCBKU09OUHJvdG9jb2wgdAorCitjcmVhdGVIZWFkZXJQcm90b2NvbCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBpIC0+IG8gLT4gSU8oSGVhZGVyUHJvdG9jb2wgaSBvKQorY3JlYXRlSGVhZGVyUHJvdG9jb2wgaSBvID0gZG8KKyAgdCA8LSBvcGVuSGVhZGVyVHJhbnNwb3J0IGkgbworICBwaWQgPC0gcmVhZElPUmVmICQgcHJvdG9jb2xUeXBlIHQKKyAgcHJvdG8gPC0gbmV3SU9SZWYgJCBjcmVhdGVQcm90b2NvbFdyYXAgcGlkIHQKKyAgcmV0dXJuICQgSGVhZGVyUHJvdG9jb2wgeyB0cmFucyA9IHQsIHdyYXBwZWRQcm90byA9IHByb3RvIH0KKworY3JlYXRlSGVhZGVyUHJvdG9jb2wxIDo6IFRyYW5zcG9ydCB0ID0+IHQgLT4gSU8oSGVhZGVyUHJvdG9jb2wgdCB0KQorY3JlYXRlSGVhZGVyUHJvdG9jb2wxIHQgPSBjcmVhdGVIZWFkZXJQcm90b2NvbCB0IHQKKworcmVzZXRQcm90b2NvbCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gSU8gKCkKK3Jlc2V0UHJvdG9jb2wgcCA9IGRvCisgIHBpZCA8LSByZWFkSU9SZWYgJCBwcm90b2NvbFR5cGUgJCB0cmFucyBwCisgIHdyaXRlSU9SZWYgKHdyYXBwZWRQcm90byBwKSAkIGNyZWF0ZVByb3RvY29sV3JhcCBwaWQgJCB0cmFucyBwCisKK2dldFdyYXBwZWQgPSByZWFkSU9SZWYgLiB3cmFwcGVkUHJvdG8KKworc2V0VHJhbnNwb3J0IDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclByb3RvY29sIGkgbyAtPiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IEhlYWRlclByb3RvY29sIGkgbworc2V0VHJhbnNwb3J0IHAgdCA9IHAgeyB0cmFucyA9IHQgfQorCit1cGRhdGVUcmFuc3BvcnQgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IChIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IEhlYWRlclRyYW5zcG9ydCBpIG8pLT4gSGVhZGVyUHJvdG9jb2wgaSBvCit1cGRhdGVUcmFuc3BvcnQgcCBmID0gc2V0VHJhbnNwb3J0IHAgKGYgJCB0cmFucyBwKQorCit0eXBlIEhlYWRlcnMgPSBNYXAuTWFwIFN0cmluZyBTdHJpbmcKKworLS0gVE9ETzogd2Ugd2FudCB0byBzZXQgaGVhZGVycyB3aXRob3V0IHJlY3JlYXRpbmcgY2xpZW50Li4uCitzZXRIZWFkZXIgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IFN0cmluZyAtPiBTdHJpbmcgLT4gSGVhZGVyUHJvdG9jb2wgaSBvCitzZXRIZWFkZXIgcCBrIHYgPSB1cGRhdGVUcmFuc3BvcnQgcCAkIFx0IC0+IHQgeyB3cml0ZUhlYWRlcnMgPSBNYXAuaW5zZXJ0IGsgdiAkIHdyaXRlSGVhZGVycyB0IH0KKworc2V0SGVhZGVycyA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gSGVhZGVycyAtPiBIZWFkZXJQcm90b2NvbCBpIG8KK3NldEhlYWRlcnMgcCBoID0gdXBkYXRlVHJhbnNwb3J0IHAgJCBcdCAtPiB0IHsgd3JpdGVIZWFkZXJzID0gaCB9CisKKy0tIFRPRE86IG1ha2UgaXQgcHVibGljIG9uY2Ugd2UgaGF2ZSBmaXJzdCB0cmFuc2Zvcm0gaW1wbGVtZW50YXRpb24gZm9yIEhhc2tlbGwKK3NldFRyYW5zZm9ybXMgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IFtUcmFuc2Zvcm1UeXBlXSAtPiBIZWFkZXJQcm90b2NvbCBpIG8KK3NldFRyYW5zZm9ybXMgcCB0cnMgPSB1cGRhdGVUcmFuc3BvcnQgcCAkIFx0IC0+IHQgeyB3cml0ZVRyYW5zZm9ybXMgPSB0cnMgfQorCitzZXRUcmFuc2Zvcm0gOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IFRyYW5zZm9ybVR5cGUgLT4gSGVhZGVyUHJvdG9jb2wgaSBvCitzZXRUcmFuc2Zvcm0gcCB0ciA9IHVwZGF0ZVRyYW5zcG9ydCBwICQgXHQgLT4gdCB7IHdyaXRlVHJhbnNmb3JtcyA9IHRyOih3cml0ZVRyYW5zZm9ybXMgdCkgfQorCitnZXRXcml0ZUhlYWRlcnMgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IEhlYWRlcnMKK2dldFdyaXRlSGVhZGVycyA9IHdyaXRlSGVhZGVycyAuIHRyYW5zCisKK2dldEhlYWRlcnMgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IElPIFsoU3RyaW5nLCBTdHJpbmcpXQorZ2V0SGVhZGVycyA9IHJlYWRJT1JlZiAuIGhlYWRlcnMgLiB0cmFucworCitnZXRQcm90b2NvbFR5cGUgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IElPIFByb3RvY29sVHlwZQorZ2V0UHJvdG9jb2xUeXBlIHAgPSByZWFkSU9SZWYgJCBwcm90b2NvbFR5cGUgJCB0cmFucyBwCisKK3NldFByb3RvY29sVHlwZSA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gUHJvdG9jb2xUeXBlIC0+IElPICgpCitzZXRQcm90b2NvbFR5cGUgcCB0eXAgPSBkbworICB0eXAwIDwtIGdldFByb3RvY29sVHlwZSBwCisgIGlmIHR5cCA9PSB0eXAwCisgICAgdGhlbiByZXR1cm4gKCkKKyAgICBlbHNlIGRvCisgICAgICB0U2V0UHJvdG9jb2wgKHRyYW5zIHApIHR5cAorICAgICAgcmVzZXRQcm90b2NvbCBwCisKK2luc3RhbmNlIChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IFByb3RvY29sIChIZWFkZXJQcm90b2NvbCBpIG8pIHdoZXJlCisgIHJlYWRCeXRlIHAgPSB0UmVhZEFsbCAodHJhbnMgcCkgMQorCisgIHJlYWRWYWwgcCB0cCA9IGRvCisgICAgcHJvdG8gPC0gZ2V0V3JhcHBlZCBwCisgICAgcmVhZFZhbCBwcm90byB0cAorCisgIHJlYWRNZXNzYWdlIHAgZiA9IGRvCisgICAgdFJlc2V0UHJvdG9jb2wgKHRyYW5zIHApCisgICAgcmVzZXRQcm90b2NvbCBwCisgICAgcHJvdG8gPC0gZ2V0V3JhcHBlZCBwCisgICAgcmVhZE1lc3NhZ2UgcHJvdG8gZgorCisgIHdyaXRlVmFsIHAgdiA9IGRvCisgICAgcHJvdG8gPC0gZ2V0V3JhcHBlZCBwCisgICAgd3JpdGVWYWwgcHJvdG8gdgorCisgIHdyaXRlTWVzc2FnZSBwIHggZiA9IGRvCisgICAgcHJvdG8gPC0gZ2V0V3JhcHBlZCBwCisgICAgd3JpdGVNZXNzYWdlIHByb3RvIHggZgorCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9KU09OLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvSlNPTi5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzllZGRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvSlNPTi5ocwpAQCAtMCwwICsxLDM2MiBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK3stIyBMQU5HVUFHRSBDUFAgIy19Cit7LSMgTEFOR1VBR0UgRXhpc3RlbnRpYWxRdWFudGlmaWNhdGlvbiAjLX0KK3stIyBMQU5HVUFHRSBPdmVybG9hZGVkU3RyaW5ncyAjLX0KK3stIyBMQU5HVUFHRSBTY29wZWRUeXBlVmFyaWFibGVzICMtfQorey0jIExBTkdVQUdFIFR1cGxlU2VjdGlvbnMgIy19CisKK21vZHVsZSBUaHJpZnQuUHJvdG9jb2wuSlNPTgorICAgICggbW9kdWxlIFRocmlmdC5Qcm90b2NvbAorICAgICwgSlNPTlByb3RvY29sKC4uKQorICAgICkgd2hlcmUKKworaW1wb3J0IENvbnRyb2wuQXBwbGljYXRpdmUKK2ltcG9ydCBDb250cm9sLkV4Y2VwdGlvbiAoYnJhY2tldCkKK2ltcG9ydCBDb250cm9sLk1vbmFkCitpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcgYXMgUAoraW1wb3J0IERhdGEuQXR0b3BhcnNlYy5CeXRlU3RyaW5nLkNoYXI4IGFzIFBDCitpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcuTGF6eSBhcyBMUAoraW1wb3J0IERhdGEuQnl0ZVN0cmluZy5CYXNlNjQuTGF6eSBhcyBCNjRDCitpbXBvcnQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQnVpbGRlciBhcyBCCitpbXBvcnQgRGF0YS5CeXRlU3RyaW5nLkludGVybmFsIChjMncsIHcyYykKK2ltcG9ydCBEYXRhLkZ1bmN0b3IKK2ltcG9ydCBEYXRhLkludAoraW1wb3J0IERhdGEuTGlzdAoraW1wb3J0IERhdGEuTWF5YmUgKGNhdE1heWJlcykKK2ltcG9ydCBEYXRhLk1vbm9pZAoraW1wb3J0IERhdGEuVGV4dC5MYXp5LkVuY29kaW5nCitpbXBvcnQgRGF0YS5Xb3JkCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwCisKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlR5cGVzCisKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5LkNoYXI4IGFzIExCU0MKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5UZXh0LkxhenkgYXMgTFQKKworLS0gfCBUaGUgSlNPTiBQcm90b2NvbCBkYXRhIHVzZXMgdGhlIHN0YW5kYXJkICdUSlNPTlByb3RvY29sJy4gIERhdGEgaXMKKy0tIGVuY29kZWQgYXMgYSBKU09OICdCeXRlU3RyaW5nJworZGF0YSBKU09OUHJvdG9jb2wgdCA9IEpTT05Qcm90b2NvbCB0CisgICAgICAgICAgICAgICAgICAgICAgLS0gXiBDb25zdHJ1Y3QgYSAnSlNPTlByb3RvY29sJyB3aXRoIGEgJ1RyYW5zcG9ydCcKK2dldFRyYW5zcG9ydCA6OiBUcmFuc3BvcnQgdCA9PiBKU09OUHJvdG9jb2wgdCAtPiB0CitnZXRUcmFuc3BvcnQgKEpTT05Qcm90b2NvbCB0KSA9IHQKKworaW5zdGFuY2UgVHJhbnNwb3J0IHQgPT4gUHJvdG9jb2wgKEpTT05Qcm90b2NvbCB0KSB3aGVyZQorICAgIHJlYWRCeXRlIHAgPSB0UmVhZEFsbCAoZ2V0VHJhbnNwb3J0IHApIDEKKworICAgIHdyaXRlTWVzc2FnZSAoSlNPTlByb3RvY29sIHQpIChzLCB0eSwgc3EpID0gYnJhY2tldCByZWFkTWVzc2FnZUJlZ2luIHJlYWRNZXNzYWdlRW5kIC4gY29uc3QKKyAgICAgIHdoZXJlCisgICAgICAgIHJlYWRNZXNzYWdlQmVnaW4gPSB0V3JpdGUgdCAkIHRvTGF6eUJ5dGVTdHJpbmcgJAorICAgICAgICAgIEIuY2hhcjggJ1snIDw+IGJ1aWxkU2hvd2FibGUgKDEgOjogSW50MzIpIDw+CisgICAgICAgICAgQi5zdHJpbmc4ICIsXCIiIDw+IGVzY2FwZSAoZW5jb2RlVXRmOCBzKSA8PiBCLmNoYXI4ICdcIicgPD4KKyAgICAgICAgICBCLmNoYXI4ICcsJyA8PiBidWlsZFNob3dhYmxlIChmcm9tRW51bSB0eSkgPD4KKyAgICAgICAgICBCLmNoYXI4ICcsJyA8PiBidWlsZFNob3dhYmxlIHNxIDw+CisgICAgICAgICAgQi5jaGFyOCAnLCcKKyAgICAgICAgcmVhZE1lc3NhZ2VFbmQgXyA9IGRvCisgICAgICAgICAgdFdyaXRlIHQgIl0iCisgICAgICAgICAgdEZsdXNoIHQKKworICAgIHJlYWRNZXNzYWdlIHAgPSBicmFja2V0IHJlYWRNZXNzYWdlQmVnaW4gcmVhZE1lc3NhZ2VFbmQKKyAgICAgIHdoZXJlCisgICAgICAgIHJlYWRNZXNzYWdlQmVnaW4gPSBydW5QYXJzZXIgcCAkIHNraXBTcGFjZSAqPiBkbworICAgICAgICAgIF92ZXIgOjogSW50MzIgPC0gbGV4ZW1lIChQQy5jaGFyOCAnWycpICo+IGxleGVtZSAoc2lnbmVkIGRlY2ltYWwpCisgICAgICAgICAgYnMgPC0gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IGxleGVtZSBlc2NhcGVkU3RyaW5nCisgICAgICAgICAgY2FzZSBkZWNvZGVVdGY4JyBicyBvZgorICAgICAgICAgICAgTGVmdCBfIC0+IGZhaWwgInJlYWRNZXNzYWdlOiBpbnZhbGlkIHRleHQgZW5jb2RpbmciCisgICAgICAgICAgICBSaWdodCBzdHIgLT4gZG8KKyAgICAgICAgICAgICAgdHkgPC0gdG9FbnVtIDwkPiAobGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IGxleGVtZSAoc2lnbmVkIGRlY2ltYWwpKQorICAgICAgICAgICAgICBzZXFOdW0gPC0gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IGxleGVtZSAoc2lnbmVkIGRlY2ltYWwpCisgICAgICAgICAgICAgIF8gPC0gUEMuY2hhcjggJywnCisgICAgICAgICAgICAgIHJldHVybiAoc3RyLCB0eSwgc2VxTnVtKQorICAgICAgICByZWFkTWVzc2FnZUVuZCBfID0gdm9pZCAkIHJ1blBhcnNlciBwIChQQy5jaGFyOCAnXScpCisKKyAgICB3cml0ZVZhbCBwID0gdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgLiB0b0xhenlCeXRlU3RyaW5nIC4gYnVpbGRKU09OVmFsdWUKKyAgICByZWFkVmFsIHAgdHkgPSBydW5QYXJzZXIgcCAkIHNraXBTcGFjZSAqPiBwYXJzZUpTT05WYWx1ZSB0eQorCitpbnN0YW5jZSBUcmFuc3BvcnQgdCA9PiBTdGF0ZWxlc3NQcm90b2NvbCAoSlNPTlByb3RvY29sIHQpIHdoZXJlCisgICAgc2VyaWFsaXplVmFsIF8gPSB0b0xhenlCeXRlU3RyaW5nIC4gYnVpbGRKU09OVmFsdWUKKyAgICBkZXNlcmlhbGl6ZVZhbCBfIHR5IGJzID0KKyAgICAgIGNhc2UgTFAuZWl0aGVyUmVzdWx0ICQgTFAucGFyc2UgKHBhcnNlSlNPTlZhbHVlIHR5KSBicyBvZgorICAgICAgICBMZWZ0IHMgLT4gZXJyb3IgcworICAgICAgICBSaWdodCB2YWwgLT4gdmFsCisKKy0tIFdyaXRpbmcgRnVuY3Rpb25zCisKK2J1aWxkSlNPTlZhbHVlIDo6IFRocmlmdFZhbCAtPiBCdWlsZGVyCitidWlsZEpTT05WYWx1ZSAoVFN0cnVjdCBmaWVsZHMpID0gQi5jaGFyOCAneycgPD4gYnVpbGRKU09OU3RydWN0IGZpZWxkcyA8PiBCLmNoYXI4ICd9JworYnVpbGRKU09OVmFsdWUgKFRNYXAga3QgdnQgZW50cmllcykgPQorICBCLmNoYXI4ICdbJyA8PiBCLmNoYXI4ICciJyA8PiBnZXRUeXBlTmFtZSBrdCA8PiBCLmNoYXI4ICciJyA8PgorICBCLmNoYXI4ICcsJyA8PiBCLmNoYXI4ICciJyA8PiBnZXRUeXBlTmFtZSB2dCA8PiBCLmNoYXI4ICciJyA8PgorICBCLmNoYXI4ICcsJyA8PiBidWlsZFNob3dhYmxlIChsZW5ndGggZW50cmllcykgPD4KKyAgQi5jaGFyOCAnLCcgPD4gQi5jaGFyOCAneycgPD4gYnVpbGRKU09OTWFwIGVudHJpZXMgPD4gQi5jaGFyOCAnfScgPD4KKyAgQi5jaGFyOCAnXScKK2J1aWxkSlNPTlZhbHVlIChUTGlzdCB0eSBlbnRyaWVzKSA9CisgIEIuY2hhcjggJ1snIDw+IEIuY2hhcjggJyInIDw+IGdldFR5cGVOYW1lIHR5IDw+IEIuY2hhcjggJyInIDw+CisgIEIuY2hhcjggJywnIDw+IGJ1aWxkU2hvd2FibGUgKGxlbmd0aCBlbnRyaWVzKSA8PgorICAoaWYgbGVuZ3RoIGVudHJpZXMgPiAwCisgICB0aGVuIEIuY2hhcjggJywnIDw+IGJ1aWxkSlNPTkxpc3QgZW50cmllcworICAgZWxzZSBtZW1wdHkpIDw+CisgIEIuY2hhcjggJ10nCitidWlsZEpTT05WYWx1ZSAoVFNldCB0eSBlbnRyaWVzKSA9IGJ1aWxkSlNPTlZhbHVlIChUTGlzdCB0eSBlbnRyaWVzKQorYnVpbGRKU09OVmFsdWUgKFRCb29sIGIpID0gaWYgYiB0aGVuIEIuY2hhcjggJzEnIGVsc2UgQi5jaGFyOCAnMCcKK2J1aWxkSlNPTlZhbHVlIChUQnl0ZSBiKSA9IGJ1aWxkU2hvd2FibGUgYgorYnVpbGRKU09OVmFsdWUgKFRJMTYgaSkgPSBidWlsZFNob3dhYmxlIGkKK2J1aWxkSlNPTlZhbHVlIChUSTMyIGkpID0gYnVpbGRTaG93YWJsZSBpCitidWlsZEpTT05WYWx1ZSAoVEk2NCBpKSA9IGJ1aWxkU2hvd2FibGUgaQorYnVpbGRKU09OVmFsdWUgKFREb3VibGUgZCkgPSBidWlsZFNob3dhYmxlIGQKK2J1aWxkSlNPTlZhbHVlIChUU3RyaW5nIHMpID0gQi5jaGFyOCAnXCInIDw+IGVzY2FwZSBzIDw+IEIuY2hhcjggJ1wiJworYnVpbGRKU09OVmFsdWUgKFRCaW5hcnkgcykgPSBCLmNoYXI4ICdcIicgPD4gKEIubGF6eUJ5dGVTdHJpbmcgLiBCNjRDLmVuY29kZSAkIHMpIDw+IEIuY2hhcjggJ1wiJworCitidWlsZEpTT05TdHJ1Y3QgOjogTWFwLkhhc2hNYXAgSW50MTYgKExULlRleHQsIFRocmlmdFZhbCkgLT4gQnVpbGRlcgorYnVpbGRKU09OU3RydWN0ID0gbWNvbmNhdCAuIGludGVyc3BlcnNlIChCLmNoYXI4ICcsJykgLiBNYXAuZm9sZHJXaXRoS2V5IGJ1aWxkRmllbGQgW10KKyAgd2hlcmUgCisgICAgYnVpbGRGaWVsZCBmaWQgKF8sdmFsKSA9ICg6KSAkCisgICAgICBCLmNoYXI4ICciJyA8PiBidWlsZFNob3dhYmxlIGZpZCA8PiBCLnN0cmluZzggIlwiOiIgPD4gCisgICAgICBCLmNoYXI4ICd7JyA8PgorICAgICAgQi5jaGFyOCAnIicgPD4gZ2V0VHlwZU5hbWUgKGdldFR5cGVPZiB2YWwpIDw+IEIuc3RyaW5nOCAiXCI6IiA8PgorICAgICAgYnVpbGRKU09OVmFsdWUgdmFsIDw+CisgICAgICBCLmNoYXI4ICd9JworCitidWlsZEpTT05NYXAgOjogWyhUaHJpZnRWYWwsIFRocmlmdFZhbCldIC0+IEJ1aWxkZXIKK2J1aWxkSlNPTk1hcCA9IG1jb25jYXQgLiBpbnRlcnNwZXJzZSAoQi5jaGFyOCAnLCcpIC4gbWFwIGJ1aWxkS1YKKyAgd2hlcmUKKyAgICBidWlsZEtWIChrZXlAKFRTdHJpbmcgXyksIHZhbCkgPQorICAgICAgYnVpbGRKU09OVmFsdWUga2V5IDw+IEIuY2hhcjggJzonIDw+IGJ1aWxkSlNPTlZhbHVlIHZhbAorICAgIGJ1aWxkS1YgKGtleSwgdmFsKSA9CisgICAgICBCLmNoYXI4ICdcIicgPD4gYnVpbGRKU09OVmFsdWUga2V5IDw+IEIuc3RyaW5nOCAiXCI6IiA8PiBidWlsZEpTT05WYWx1ZSB2YWwKK2J1aWxkSlNPTkxpc3QgOjogW1RocmlmdFZhbF0gLT4gQnVpbGRlcgorYnVpbGRKU09OTGlzdCA9IG1jb25jYXQgLiBpbnRlcnNwZXJzZSAoQi5jaGFyOCAnLCcpIC4gbWFwIGJ1aWxkSlNPTlZhbHVlCisKK2J1aWxkU2hvd2FibGUgOjogU2hvdyBhID0+IGEgLT4gIEJ1aWxkZXIKK2J1aWxkU2hvd2FibGUgPSBCLnN0cmluZzggLiBzaG93CisKKy0tIFJlYWRpbmcgRnVuY3Rpb25zCisKK3BhcnNlSlNPTlZhbHVlIDo6IFRocmlmdFR5cGUgLT4gUGFyc2VyIFRocmlmdFZhbAorcGFyc2VKU09OVmFsdWUgKFRfU1RSVUNUIHRtYXApID0KKyAgVFN0cnVjdCA8JD4gKGxleGVtZSAoUEMuY2hhcjggJ3snKSAqPiBwYXJzZUpTT05TdHJ1Y3QgdG1hcCA8KiBQQy5jaGFyOCAnfScpCitwYXJzZUpTT05WYWx1ZSAoVF9NQVAga3QgdnQpID0gZm1hcCAoVE1hcCBrdCB2dCkgJAorICBiZXR3ZWVuICdbJyAnXScgJAorICAgIGxleGVtZSBlc2NhcGVkU3RyaW5nICo+IGxleGVtZSAoUEMuY2hhcjggJywnKSAqPgorICAgIGxleGVtZSBlc2NhcGVkU3RyaW5nICo+IGxleGVtZSAoUEMuY2hhcjggJywnKSAqPgorICAgIGxleGVtZSBkZWNpbWFsICo+IGxleGVtZSAoUEMuY2hhcjggJywnKSAqPgorICAgIGJldHdlZW4gJ3snICd9JyAocGFyc2VKU09OTWFwIGt0IHZ0KQorcGFyc2VKU09OVmFsdWUgKFRfTElTVCB0eSkgPSBmbWFwIChUTGlzdCB0eSkgJAorICBiZXR3ZWVuICdbJyAnXScgJCBkbworICAgIGxlbiA8LSBsZXhlbWUgZXNjYXBlZFN0cmluZyAqPiBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIGRlY2ltYWwKKyAgICBpZiBsZW4gPiAwCisgICAgICB0aGVuIGxleGVtZSAoUEMuY2hhcjggJywnKSAqPiBwYXJzZUpTT05MaXN0IHR5CisgICAgICBlbHNlIHJldHVybiBbXQorcGFyc2VKU09OVmFsdWUgKFRfU0VUIHR5KSA9IGZtYXAgKFRTZXQgdHkpICQKKyAgYmV0d2VlbiAnWycgJ10nICQgZG8KKyAgICBsZW4gPC0gbGV4ZW1lIGVzY2FwZWRTdHJpbmcgKj4gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IGxleGVtZSBkZWNpbWFsCisgICAgaWYgbGVuID4gMAorICAgICAgdGhlbiAgbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IHBhcnNlSlNPTkxpc3QgdHkKKyAgICAgIGVsc2UgcmV0dXJuIFtdCitwYXJzZUpTT05WYWx1ZSBUX0JPT0wgPQorICAoVEJvb2wgVHJ1ZSA8JCBQQy5jaGFyOCAnMScpIDx8PiAoVEJvb2wgRmFsc2UgPCQgUEMuY2hhcjggJzAnKQorcGFyc2VKU09OVmFsdWUgVF9CWVRFID0gVEJ5dGUgPCQ+IHNpZ25lZCBkZWNpbWFsCitwYXJzZUpTT05WYWx1ZSBUX0kxNiA9IFRJMTYgPCQ+IHNpZ25lZCBkZWNpbWFsCitwYXJzZUpTT05WYWx1ZSBUX0kzMiA9IFRJMzIgPCQ+IHNpZ25lZCBkZWNpbWFsCitwYXJzZUpTT05WYWx1ZSBUX0k2NCA9IFRJNjQgPCQ+IHNpZ25lZCBkZWNpbWFsCitwYXJzZUpTT05WYWx1ZSBUX0RPVUJMRSA9IFREb3VibGUgPCQ+IGRvdWJsZQorcGFyc2VKU09OVmFsdWUgVF9TVFJJTkcgPSBUU3RyaW5nIDwkPiBlc2NhcGVkU3RyaW5nCitwYXJzZUpTT05WYWx1ZSBUX0JJTkFSWSA9IFRCaW5hcnkgPCQ+IGJhc2U2NFN0cmluZworcGFyc2VKU09OVmFsdWUgVF9TVE9QID0gZmFpbCAicGFyc2VKU09OVmFsdWU6IGNhbm5vdCBwYXJzZSB0eXBlIFRfU1RPUCIKK3BhcnNlSlNPTlZhbHVlIFRfVk9JRCA9IGZhaWwgInBhcnNlSlNPTlZhbHVlOiBjYW5ub3QgcGFyc2UgdHlwZSBUX1ZPSUQiCisKK3BhcnNlQW55VmFsdWUgOjogUGFyc2VyICgpCitwYXJzZUFueVZhbHVlID0gY2hvaWNlICQKKyAgICAgICAgICAgICAgICBza2lwQmV0d2VlbiAneycgJ30nIDoKKyAgICAgICAgICAgICAgICBza2lwQmV0d2VlbiAnWycgJ10nIDoKKyAgICAgICAgICAgICAgICBtYXAgKHZvaWQgLiBwYXJzZUpTT05WYWx1ZSkKKyAgICAgICAgICAgICAgICAgIFsgVF9CT09MCisgICAgICAgICAgICAgICAgICAsIFRfSTE2CisgICAgICAgICAgICAgICAgICAsIFRfSTMyCisgICAgICAgICAgICAgICAgICAsIFRfSTY0CisgICAgICAgICAgICAgICAgICAsIFRfRE9VQkxFCisgICAgICAgICAgICAgICAgICAsIFRfU1RSSU5HCisgICAgICAgICAgICAgICAgICAsIFRfQklOQVJZCisgICAgICAgICAgICAgICAgICBdCisgIHdoZXJlCisgICAgc2tpcEJldHdlZW4gOjogQ2hhciAtPiBDaGFyIC0+IFBhcnNlciAoKQorICAgIHNraXBCZXR3ZWVuIGEgYiA9IGJldHdlZW4gYSBiICQgdm9pZCAoUEMuc2F0aXNmeSAoXGMgLT4gYyAvPSBhICYmIGMgLz0gYikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8fD4gc2tpcEJldHdlZW4gYSBiCisKK3BhcnNlSlNPTlN0cnVjdCA6OiBUeXBlTWFwIC0+IFBhcnNlciAoTWFwLkhhc2hNYXAgSW50MTYgKExULlRleHQsIFRocmlmdFZhbCkpCitwYXJzZUpTT05TdHJ1Y3QgdG1hcCA9IE1hcC5mcm9tTGlzdCAuIGNhdE1heWJlcyA8JD4gcGFyc2VGaWVsZAorICAgICAgICAgICAgICAgICAgICAgICBgc2VwQnlgIGxleGVtZSAoUEMuY2hhcjggJywnKQorICB3aGVyZQorICAgIHBhcnNlRmllbGQgPSBkbworICAgICAgZmlkIDwtIGxleGVtZSAoYmV0d2VlbiAnIicgJyInIGRlY2ltYWwpIDwqIGxleGVtZSAoUEMuY2hhcjggJzonKQorICAgICAgY2FzZSBNYXAubG9va3VwIGZpZCB0bWFwIG9mCisgICAgICAgIEp1c3QgKHN0ciwgZnR5cGUpIC0+IGJldHdlZW4gJ3snICd9JyAkIGRvCisgICAgICAgICAgXyA8LSBsZXhlbWUgKGVzY2FwZWRTdHJpbmcpICo+IGxleGVtZSAoUEMuY2hhcjggJzonKQorICAgICAgICAgIHZhbCA8LSBsZXhlbWUgKHBhcnNlSlNPTlZhbHVlIGZ0eXBlKQorICAgICAgICAgIHJldHVybiAkIEp1c3QgKGZpZCwgKHN0ciwgdmFsKSkKKyAgICAgICAgTm90aGluZyAtPiBsZXhlbWUgcGFyc2VBbnlWYWx1ZSAqPiByZXR1cm4gTm90aGluZworCitwYXJzZUpTT05NYXAgOjogVGhyaWZ0VHlwZSAtPiBUaHJpZnRUeXBlIC0+IFBhcnNlciBbKFRocmlmdFZhbCwgVGhyaWZ0VmFsKV0KK3BhcnNlSlNPTk1hcCBrdCB2dCA9CisgICgoLCkgPCQ+IGxleGVtZSAocGFyc2VKU09OS2V5IGt0KSA8Kj4KKyAgIChsZXhlbWUgKFBDLmNoYXI4ICc6JykgKj4gbGV4ZW1lIChwYXJzZUpTT05WYWx1ZSB2dCkpKSBgc2VwQnlgCisgIGxleGVtZSAoUEMuY2hhcjggJywnKQorICB3aGVyZQorICAgIHBhcnNlSlNPTktleSBUX1NUUklORyA9IHBhcnNlSlNPTlZhbHVlIFRfU1RSSU5HCisgICAgcGFyc2VKU09OS2V5IFRfQklOQVJZID0gcGFyc2VKU09OVmFsdWUgVF9CSU5BUlkKKyAgICBwYXJzZUpTT05LZXkga3QgPSBQQy5jaGFyOCAnIicgKj4gcGFyc2VKU09OVmFsdWUga3QgPCogUEMuY2hhcjggJyInCisKK3BhcnNlSlNPTkxpc3QgOjogVGhyaWZ0VHlwZSAtPiBQYXJzZXIgW1RocmlmdFZhbF0KK3BhcnNlSlNPTkxpc3QgdHkgPSBsZXhlbWUgKHBhcnNlSlNPTlZhbHVlIHR5KSBgc2VwQnlgIGxleGVtZSAoUEMuY2hhcjggJywnKQorCitlc2NhcGVkU3RyaW5nIDo6IFBhcnNlciBMQlMuQnl0ZVN0cmluZworZXNjYXBlZFN0cmluZyA9IFBDLmNoYXI4ICciJyAqPgorICAgICAgICAgICAgICAgIChMQlMucGFjayA8JD4gUC5tYW55JyAoZXNjYXBlZENoYXIgPHw+IG5vdENoYXI4ICciJykpIDwqCisgICAgICAgICAgICAgICAgUEMuY2hhcjggJyInCisKK2Jhc2U2NFN0cmluZyA6OiBQYXJzZXIgTEJTLkJ5dGVTdHJpbmcKK2Jhc2U2NFN0cmluZyA9IFBDLmNoYXI4ICciJyAqPgorICAgICAgICAgICAgICAgKGRlY29kZUJhc2U2NCAuIExCU0MucGFjayA8JD4gUC5tYW55JyAoUEMubm90Q2hhciAnIicpKSA8KgorICAgICAgICAgICAgICAgUEMuY2hhcjggJyInCisgICAgICAgICAgICAgICB3aGVyZQorICAgICAgICAgICAgICAgICBkZWNvZGVCYXNlNjQgYiA9CisgICAgICAgICAgICAgICAgICAgbGV0IHBhZGRlZCA9IGNhc2UgKExCUy5sZW5ndGggYikgYG1vZGAgNCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgLT4gTEJTLmFwcGVuZCBiICI9PSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzIC0+IExCUy5hcHBlbmQgYiAiPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfIC0+IGIgaW4KKyAgICAgICAgICAgICAgICAgICBjYXNlIEI2NEMuZGVjb2RlIHBhZGRlZCBvZgorICAgICAgICAgICAgICAgICAgICAgUmlnaHQgcyAtPiBzCisgICAgICAgICAgICAgICAgICAgICBMZWZ0IHggLT4gZXJyb3IgeAorCitlc2NhcGVkQ2hhciA6OiBQYXJzZXIgV29yZDgKK2VzY2FwZWRDaGFyID0gUEMuY2hhcjggJ1xcJyAqPiAoYzJ3IDwkPiBjaG9pY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAnXFNPSCcgPCQgUC5zdHJpbmcgInUwMDAxIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcU1RYJyA8JCBQLnN0cmluZyAidTAwMDIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xFVFgnIDwkIFAuc3RyaW5nICJ1MDAwMyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXEVPVCcgPCQgUC5zdHJpbmcgInUwMDA0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcRU5RJyA8JCBQLnN0cmluZyAidTAwMDUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xBQ0snIDwkIFAuc3RyaW5nICJ1MDAwNiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXEJFTCcgPCQgUC5zdHJpbmcgInUwMDA3IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcQlMnICA8JCBQLnN0cmluZyAidTAwMDgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xWVCcgIDwkIFAuc3RyaW5nICJ1MDAwYiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXEZGJyAgPCQgUC5zdHJpbmcgInUwMDBjIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcQ1InICA8JCBQLnN0cmluZyAidTAwMGQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xTTycgIDwkIFAuc3RyaW5nICJ1MDAwZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXFNJJyAgPCQgUC5zdHJpbmcgInUwMDBmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcRExFJyA8JCBQLnN0cmluZyAidTAwMTAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xEQzEnIDwkIFAuc3RyaW5nICJ1MDAxMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXERDMicgPCQgUC5zdHJpbmcgInUwMDEyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcREMzJyA8JCBQLnN0cmluZyAidTAwMTMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xEQzQnIDwkIFAuc3RyaW5nICJ1MDAxNCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXE5BSycgPCQgUC5zdHJpbmcgInUwMDE1IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcU1lOJyA8JCBQLnN0cmluZyAidTAwMTYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xFVEInIDwkIFAuc3RyaW5nICJ1MDAxNyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXENBTicgPCQgUC5zdHJpbmcgInUwMDE4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcRU0nICA8JCBQLnN0cmluZyAidTAwMTkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xTVUInIDwkIFAuc3RyaW5nICJ1MDAxYSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXEVTQycgPCQgUC5zdHJpbmcgInUwMDFiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcRlMnICA8JCBQLnN0cmluZyAidTAwMWMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xHUycgIDwkIFAuc3RyaW5nICJ1MDAxZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXFJTJyAgPCQgUC5zdHJpbmcgInUwMDFlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcVVMnICA8JCBQLnN0cmluZyAidTAwMWYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xERUwnIDwkIFAuc3RyaW5nICJ1MDA3ZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXDAnIDwkIFBDLmNoYXIgJzAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xhJyA8JCBQQy5jaGFyICdhJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcYicgPCQgUEMuY2hhciAnYicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXGYnIDwkIFBDLmNoYXIgJ2YnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xuJyA8JCBQQy5jaGFyICduJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdccicgPCQgUEMuY2hhciAncicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXHQnIDwkIFBDLmNoYXIgJ3QnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1x2JyA8JCBQQy5jaGFyICd2JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcIicgPCQgUEMuY2hhciAnIicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXCcnIDwkIFBDLmNoYXIgJ1wnJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcXCcgPCQgUEMuY2hhciAnXFwnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJy8nICA8JCBQQy5jaGFyICcvJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCitlc2NhcGUgOjogTEJTLkJ5dGVTdHJpbmcgLT4gQnVpbGRlcgorZXNjYXBlID0gTEJTLmZvbGRsJyBlc2NhcGVDaGFyIG1lbXB0eQorICB3aGVyZQorICAgIGVzY2FwZUNoYXIgYiB3ID0gYiA8PiAoQi5sYXp5Qnl0ZVN0cmluZyAkIGNhc2UgdzJjIHcgb2YKKyAgICAgICdcMCcgLT4gIlxcMCIKKyAgICAgICdcYicgLT4gIlxcYiIKKyAgICAgICdcZicgLT4gIlxcZiIKKyAgICAgICdcbicgLT4gIlxcbiIKKyAgICAgICdccicgLT4gIlxcciIKKyAgICAgICdcdCcgLT4gIlxcdCIKKyAgICAgICdcIicgLT4gIlxcXCIiCisgICAgICAnXFwnIC0+ICJcXFxcIgorICAgICAgJ1xTT0gnIC0+ICJcXHUwMDAxIgorICAgICAgJ1xTVFgnIC0+ICJcXHUwMDAyIgorICAgICAgJ1xFVFgnIC0+ICJcXHUwMDAzIgorICAgICAgJ1xFT1QnIC0+ICJcXHUwMDA0IgorICAgICAgJ1xFTlEnIC0+ICJcXHUwMDA1IgorICAgICAgJ1xBQ0snIC0+ICJcXHUwMDA2IgorICAgICAgJ1xCRUwnIC0+ICJcXHUwMDA3IgorICAgICAgJ1xWVCcgIC0+ICJcXHUwMDBiIgorICAgICAgJ1xTTycgIC0+ICJcXHUwMDBlIgorICAgICAgJ1xTSScgIC0+ICJcXHUwMDBmIgorICAgICAgJ1xETEUnIC0+ICJcXHUwMDEwIgorICAgICAgJ1xEQzEnIC0+ICJcXHUwMDExIgorICAgICAgJ1xEQzInIC0+ICJcXHUwMDEyIgorICAgICAgJ1xEQzMnIC0+ICJcXHUwMDEzIgorICAgICAgJ1xEQzQnIC0+ICJcXHUwMDE0IgorICAgICAgJ1xOQUsnIC0+ICJcXHUwMDE1IgorICAgICAgJ1xTWU4nIC0+ICJcXHUwMDE2IgorICAgICAgJ1xFVEInIC0+ICJcXHUwMDE3IgorICAgICAgJ1xDQU4nIC0+ICJcXHUwMDE4IgorICAgICAgJ1xFTScgIC0+ICJcXHUwMDE5IgorICAgICAgJ1xTVUInIC0+ICJcXHUwMDFhIgorICAgICAgJ1xFU0MnIC0+ICJcXHUwMDFiIgorICAgICAgJ1xGUycgIC0+ICJcXHUwMDFjIgorICAgICAgJ1xHUycgIC0+ICJcXHUwMDFkIgorICAgICAgJ1xSUycgIC0+ICJcXHUwMDFlIgorICAgICAgJ1xVUycgIC0+ICJcXHUwMDFmIgorICAgICAgJ1xERUwnIC0+ICJcXHUwMDdmIgorICAgICAgXyAtPiBMQlMuc2luZ2xldG9uIHcpCisKK2xleGVtZSA6OiBQYXJzZXIgYSAtPiBQYXJzZXIgYQorbGV4ZW1lID0gKDwqIHNraXBTcGFjZSkKKworbm90Q2hhcjggOjogQ2hhciAtPiBQYXJzZXIgV29yZDgKK25vdENoYXI4IGMgPSBQLnNhdGlzZnkgKC89IGMydyBjKQorCitiZXR3ZWVuIDo6IENoYXIgLT4gQ2hhciAtPiBQYXJzZXIgYSAtPiBQYXJzZXIgYQorYmV0d2VlbiBhIGIgcCA9IGxleGVtZSAoUEMuY2hhcjggYSkgKj4gbGV4ZW1lIHAgPCogbGV4ZW1lIChQQy5jaGFyOCBiKQorCitnZXRUeXBlTmFtZSA6OiBUaHJpZnRUeXBlIC0+IEJ1aWxkZXIKK2dldFR5cGVOYW1lIHR5ID0gQi5zdHJpbmc4ICQgY2FzZSB0eSBvZgorICBUX1NUUlVDVCBfIC0+ICJyZWMiCisgIFRfTUFQIF8gXyAgLT4gIm1hcCIKKyAgVF9MSVNUIF8gICAtPiAibHN0IgorICBUX1NFVCBfICAgIC0+ICJzZXQiCisgIFRfQk9PTCAgICAgLT4gInRmIgorICBUX0JZVEUgICAgIC0+ICJpOCIKKyAgVF9JMTYgICAgICAtPiAiaTE2IgorICBUX0kzMiAgICAgIC0+ICJpMzIiCisgIFRfSTY0ICAgICAgLT4gImk2NCIKKyAgVF9ET1VCTEUgICAtPiAiZGJsIgorICBUX1NUUklORyAgIC0+ICJzdHIiCisgIFRfQklOQVJZICAgLT4gInN0ciIKKyAgXyAtPiBlcnJvciAiVW5yZWNvZ25pemVkIFR5cGUiCisKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1NlcnZlci5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1NlcnZlci5ocwppbmRleCBlZDc0Y2ViLi41NDNmMzM4IDEwMDY0NAotLS0gYS9saWIvaHMvc3JjL1RocmlmdC9TZXJ2ZXIuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvU2VydmVyLmhzCkBAIC0zOCwxMCArMzgsMTAgQEAKIAogLS0gfCBBIHRocmVhZGVkIHNldmVyIHRoYXQgaXMgY2FwYWJsZSBvZiB1c2luZyBhbnkgVHJhbnNwb3J0IG9yIFByb3RvY29sCiAtLSBpbnN0YW5jZXMuCi1ydW5UaHJlYWRlZFNlcnZlciA6OiAoVHJhbnNwb3J0IHQsIFByb3RvY29sIGksIFByb3RvY29sIG8pCi0gICAgICAgICAgICAgICAgICA9PiAoU29ja2V0IC0+IElPIChpIHQsIG8gdCkpCitydW5UaHJlYWRlZFNlcnZlciA6OiAoUHJvdG9jb2wgaSwgUHJvdG9jb2wgbykKKyAgICAgICAgICAgICAgICAgID0+IChTb2NrZXQgLT4gSU8gKGksIG8pKQogICAgICAgICAgICAgICAgICAgLT4gaAotICAgICAgICAgICAgICAgICAgLT4gKGggLT4gKGkgdCwgbyB0KSAtPiBJTyBCb29sKQorICAgICAgICAgICAgICAgICAgLT4gKGggLT4gKGksIG8pIC0+IElPIEJvb2wpCiAgICAgICAgICAgICAgICAgICAtPiBQb3J0SUQKICAgICAgICAgICAgICAgICAgIC0+IElPIGEKIHJ1blRocmVhZGVkU2VydmVyIGFjY2VwdGVyIGhhbmQgcHJvY18gcG9ydCA9IGRvCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQuaHMKaW5kZXggM2U1ZjE4Yi4uMzA2ZWRjMiAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0LmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC5ocwpAQCAtMSw0ICsxLDUgQEAKIHstIyBMQU5HVUFHRSBEZXJpdmVEYXRhVHlwZWFibGUgIy19Cit7LSMgTEFOR1VBR0UgTXVsdGlQYXJhbVR5cGVDbGFzc2VzICMtfQogLS0KIC0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKIC0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0yNiw4ICsyNyw5IEBACiAKIGltcG9ydCBDb250cm9sLk1vbmFkICggd2hlbiApCiBpbXBvcnQgQ29udHJvbC5FeGNlcHRpb24gKCBFeGNlcHRpb24sIHRocm93ICkKLQoraW1wb3J0IERhdGEuRnVuY3RvciAoICg8JD4pICkKIGltcG9ydCBEYXRhLlR5cGVhYmxlICggVHlwZWFibGUgKQoraW1wb3J0IERhdGEuV29yZAogCiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUwogaW1wb3J0IERhdGEuTW9ub2lkCkBAIC0zNiw2ICszOCw3IEBACiAgICAgdElzT3BlbiA6OiBhIC0+IElPIEJvb2wKICAgICB0Q2xvc2UgIDo6IGEgLT4gSU8gKCkKICAgICB0UmVhZCAgIDo6IGEgLT4gSW50IC0+IElPIExCUy5CeXRlU3RyaW5nCisgICAgdFBlZWsgICA6OiBhIC0+IElPIChNYXliZSBXb3JkOCkKICAgICB0V3JpdGUgIDo6IGEgLT4gTEJTLkJ5dGVTdHJpbmcgLT4gSU8gKCkKICAgICB0Rmx1c2ggIDo6IGEgLT4gSU8gKCkKICAgICB0UmVhZEFsbCA6OiBhIC0+IEludCAtPiBJTyBMQlMuQnl0ZVN0cmluZwpAQCAtNDYsOCArNDksOCBAQAogICAgICAgICBsZXQgcmxlbiA9IGZyb21JbnRlZ3JhbCAkIExCUy5sZW5ndGggcmVzdWx0CiAgICAgICAgIHdoZW4gKHJsZW4gPT0gMCkgKHRocm93ICQgVHJhbnNwb3J0RXhuICJDYW5ub3QgcmVhZC4gUmVtb3RlIHNpZGUgaGFzIGNsb3NlZC4iIFRFX1VOS05PV04pCiAgICAgICAgIGlmIGxlbiA8PSBybGVuCi0gICAgICAgICAgICB0aGVuIHJldHVybiByZXN1bHQKLSAgICAgICAgICAgIGVsc2UgKHJlc3VsdCBgbWFwcGVuZGApIGBmbWFwYCAodFJlYWRBbGwgYSAobGVuIC0gcmxlbikpCisgICAgICAgICAgdGhlbiByZXR1cm4gcmVzdWx0CisgICAgICAgICAgZWxzZSAocmVzdWx0IGBtYXBwZW5kYCkgPCQ+IHRSZWFkQWxsIGEgKGxlbiAtIHJsZW4pCiAKIGRhdGEgVHJhbnNwb3J0RXhuID0gVHJhbnNwb3J0RXhuIFN0cmluZyBUcmFuc3BvcnRFeG5UeXBlCiAgIGRlcml2aW5nICggU2hvdywgVHlwZWFibGUgKQpAQCAtNjAsNCArNjMsMyBAQAogICAgIHwgVEVfVElNRURfT1VUCiAgICAgfCBURV9FTkRfT0ZfRklMRQogICAgICAgZGVyaXZpbmcgKCBFcSwgU2hvdywgVHlwZWFibGUgKQotCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvRW1wdHkuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvRW1wdHkuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhZjVmZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9FbXB0eS5ocwpAQCAtMCwwICsxLDM2IEBACit7LSMgTEFOR1VBR0UgTXVsdGlQYXJhbVR5cGVDbGFzc2VzICMtfQorey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzICMtfQorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK21vZHVsZSBUaHJpZnQuVHJhbnNwb3J0LkVtcHR5CisgICAgICAgKCBFbXB0eVRyYW5zcG9ydCguLikKKyAgICAgICApIHdoZXJlCisKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CisKK2RhdGEgRW1wdHlUcmFuc3BvcnQgPSBFbXB0eVRyYW5zcG9ydAorCitpbnN0YW5jZSBUcmFuc3BvcnQgRW1wdHlUcmFuc3BvcnQgd2hlcmUKKyAgICB0SXNPcGVuID0gY29uc3QgJCByZXR1cm4gRmFsc2UKKyAgICB0Q2xvc2UgID0gY29uc3QgJCByZXR1cm4gKCkKKyAgICB0UmVhZCBfIF8gPSByZXR1cm4gIiIKKyAgICB0UGVlayA9IGNvbnN0ICQgcmV0dXJuIE5vdGhpbmcKKyAgICB0V3JpdGUgXyBfID0gcmV0dXJuICgpCisgICAgdEZsdXNoID0gY29uc3QkIHJldHVybiAoKQpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0ZyYW1lZC5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9GcmFtZWQuaHMKaW5kZXggZDRmZWFjMC4uNDJmYzQzZiAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0ZyYW1lZC5ocworKysgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvRnJhbWVkLmhzCkBAIC0xLDQgKzEsNSBAQAogey0jIExBTkdVQUdFIEZsZXhpYmxlSW5zdGFuY2VzICMtfQorey0jIExBTkdVQUdFIE11bHRpUGFyYW1UeXBlQ2xhc3NlcyAjLX0KIC0tCiAtLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAtLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtMjUsMTMgKzI2LDEwIEBACiAgICAgKSB3aGVyZQogCiBpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuSU9CdWZmZXIKIAotaW1wb3J0IENvbnRyb2wuTW9uYWQgKGxpZnRNKQogaW1wb3J0IERhdGEuSW50IChJbnQzMikKLWltcG9ydCBEYXRhLk1vbm9pZCAobWFwcGVuZCwgbWVtcHR5KQotaW1wb3J0IENvbnRyb2wuQ29uY3VycmVudC5NVmFyCiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuQmluYXJ5IGFzIEIKLWltcG9ydCBxdWFsaWZpZWQgRGF0YS5CaW5hcnkuQnVpbGRlciBhcyBCQgogaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKIAogCkBAIC02NSw4ICs2MywxNyBAQAogICAgICAgICAgICAgICAgICB0aGVuIHRSZWFkIHRyYW5zIG4KICAgICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gYnMKICAgICAgICAgIGVsc2UgcmV0dXJuIGJzCisgICAgdFBlZWsgdHJhbnMgPSBkbworICAgICAgbXcgPC0gcGVla0J1ZiAocmVhZEJ1ZmZlciB0cmFucykKKyAgICAgIGNhc2UgbXcgb2YKKyAgICAgICAgSnVzdCBfIC0+IHJldHVybiBtdworICAgICAgICBOb3RoaW5nIC0+IGRvCisgICAgICAgICAgbGVuIDwtIHJlYWRGcmFtZSB0cmFucworICAgICAgICAgIGlmIGxlbiA+IDAKKyAgICAgICAgICAgICB0aGVuIHRQZWVrIHRyYW5zCisgICAgICAgICAgICAgZWxzZSByZXR1cm4gTm90aGluZwogCi0gICAgdFdyaXRlIHRyYW5zID0gd3JpdGVCdWYgKHdyaXRlQnVmZmVyIHRyYW5zKQorICAgIHRXcml0ZSA9IHdyaXRlQnVmIC4gd3JpdGVCdWZmZXIKIAogICAgIHRGbHVzaCB0cmFucyA9IGRvCiAgICAgICBicyA8LSBmbHVzaEJ1ZiAod3JpdGVCdWZmZXIgdHJhbnMpCkBAIC04NCwzNyArOTEsOSBAQAogICBsZXQgc3ogPSBmcm9tSW50ZWdyYWwgKEIuZGVjb2RlIHN6QnMgOjogSW50MzIpCiAKICAgLS0gUmVhZCB0aGUgZnJhbWUgYW5kIHN0dWZmIGl0IGludG8gdGhlIHJlYWQgYnVmZmVyLgotICBicyAgIDwtIHRSZWFkICh3cmFwcGVkVHJhbnMgdHJhbnMpIHN6CisgIGJzIDwtIHRSZWFkICh3cmFwcGVkVHJhbnMgdHJhbnMpIHN6CiAgIGZpbGxCdWYgKHJlYWRCdWZmZXIgdHJhbnMpIGJzCiAKICAgLS0gUmV0dXJuIHRoZSBmcmFtZSBzaXplIHNvIHRoYXQgdGhlIGNhbGxlciBrbm93cyB3aGV0aGVyIHRvIGV4cGVjdAogICAtLSBzb21ldGhpbmcgaW4gdGhlIHJlYWQgYnVmZmVyIG9yIG5vdC4KICAgcmV0dXJuIHN6Ci0KLQotLS0gTWluaSBJTyBidWZmZXJzIChzdG9sZW4gZnJvbSBIdHRwQ2xpZW50LmhzKQotCi10eXBlIFdyaXRlQnVmZmVyID0gTVZhciAoQkIuQnVpbGRlcikKLQotbmV3V3JpdGVCdWZmZXIgOjogSU8gV3JpdGVCdWZmZXIKLW5ld1dyaXRlQnVmZmVyID0gbmV3TVZhciBtZW1wdHkKLQotd3JpdGVCdWYgOjogV3JpdGVCdWZmZXIgLT4gTEJTLkJ5dGVTdHJpbmcgLT4gSU8gKCkKLXdyaXRlQnVmIHcgcyA9IG1vZGlmeU1WYXJfIHcgJCByZXR1cm4gLiAoXGJ1aWxkZXIgLT4KLSAgICAgICAgICAgICAgICAgYnVpbGRlciBgbWFwcGVuZGAgKEJCLmZyb21MYXp5Qnl0ZVN0cmluZyBzKSkKLQotZmx1c2hCdWYgOjogV3JpdGVCdWZmZXIgLT4gSU8gKExCUy5CeXRlU3RyaW5nKQotZmx1c2hCdWYgdyA9IEJCLnRvTGF6eUJ5dGVTdHJpbmcgYGxpZnRNYCBzd2FwTVZhciB3IG1lbXB0eQotCi0KLXR5cGUgUmVhZEJ1ZmZlciA9IE1WYXIgKExCUy5CeXRlU3RyaW5nKQotCi1uZXdSZWFkQnVmZmVyIDo6IElPIFJlYWRCdWZmZXIKLW5ld1JlYWRCdWZmZXIgPSBuZXdNVmFyIG1lbXB0eQotCi1maWxsQnVmIDo6IFJlYWRCdWZmZXIgLT4gTEJTLkJ5dGVTdHJpbmcgLT4gSU8gKCkKLWZpbGxCdWYgciBzID0gc3dhcE1WYXIgciBzID4+IHJldHVybiAoKQotCi1yZWFkQnVmIDo6IFJlYWRCdWZmZXIgLT4gSW50IC0+IElPIChMQlMuQnl0ZVN0cmluZykKLXJlYWRCdWYgciBuID0gbW9kaWZ5TVZhciByICQgcmV0dXJuIC4gZmxpcFBhaXIgLiBMQlMuc3BsaXRBdCAoZnJvbUludGVncmFsIG4pCi0gICAgd2hlcmUgZmxpcFBhaXIgKGEsIGIpID0gKGIsIGEpCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSGFuZGxlLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0hhbmRsZS5ocwppbmRleCA3MGQzOWU3Li5mZjYyOTViIDEwMDY0NAotLS0gYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSGFuZGxlLmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IYW5kbGUuaHMKQEAgLTEsNSArMSw1IEBACiB7LSMgTEFOR1VBR0UgRmxleGlibGVJbnN0YW5jZXMgIy19Ci17LSMgTEFOR1VBR0UgS2luZFNpZ25hdHVyZXMgIy19Cit7LSMgTEFOR1VBR0UgTXVsdGlQYXJhbVR5cGVDbGFzc2VzICMtfQogey0jIExBTkdVQUdFIFNjb3BlZFR5cGVWYXJpYWJsZXMgIy19CiB7LSMgTEFOR1VBR0UgVHlwZVN5bm9ueW1JbnN0YW5jZXMgIy19CiB7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLW9ycGhhbnMgIy19CkBAIC0yNyw4ICsyNyw5IEBACiAgICAgLCBIYW5kbGVTb3VyY2UoLi4pCiAgICAgKSB3aGVyZQogCi1pbXBvcnQgQ29udHJvbC5FeGNlcHRpb24gKCB0aHJvdyApCi1pbXBvcnQgQ29udHJvbC5Nb25hZCAoKQoraW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uICggY2F0Y2gsIHRocm93ICkKK2ltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuSW50ZXJuYWwgKGMydykKK2ltcG9ydCBEYXRhLkZ1bmN0b3IKIAogaW1wb3J0IE5ldHdvcmsKIApAQCAtNDIsOSArNDMsMTYgQEAKIAogaW5zdGFuY2UgVHJhbnNwb3J0IEhhbmRsZSB3aGVyZQogICAgIHRJc09wZW4gPSBoSXNPcGVuCi0gICAgdENsb3NlIGggICAgPSBoQ2xvc2UgaAotICAgIHRSZWFkICBoIG4gID0gTEJTLmhHZXQgaCBuIGBjYXRjaGAgaGFuZGxlRU9GCi0gICAgdFdyaXRlIGggcyAgPSBMQlMuaFB1dCBoIHMKKyAgICB0Q2xvc2UgPSBoQ2xvc2UKKyAgICB0UmVhZCBoIG4gPSByZWFkIGBDb250cm9sLkV4Y2VwdGlvbi5jYXRjaGAgaGFuZGxlRU9GIG1lbXB0eQorICAgICAgd2hlcmUKKyAgICAgICAgcmVhZCA9IGRvCisgICAgICAgICAgaExvb2tBaGVhZCBoCisgICAgICAgICAgTEJTLmhHZXROb25CbG9ja2luZyBoIG4KKyAgICB0UmVhZEFsbCBfIDAgPSByZXR1cm4gbWVtcHR5CisgICAgdFJlYWRBbGwgaCBuID0gTEJTLmhHZXQgaCBuIGBDb250cm9sLkV4Y2VwdGlvbi5jYXRjaGAgdGhyb3dUcmFuc3BvcnRFeG4KKyAgICB0UGVlayBoID0gKEp1c3QgLiBjMncgPCQ+IGhMb29rQWhlYWQgaCkgYENvbnRyb2wuRXhjZXB0aW9uLmNhdGNoYCBoYW5kbGVFT0YgTm90aGluZworICAgIHRXcml0ZSA9IExCUy5oUHV0CiAgICAgdEZsdXNoID0gaEZsdXNoCiAKIApAQCAtNTksOCArNjcsMTIgQEAKIGluc3RhbmNlIEhhbmRsZVNvdXJjZSAoSG9zdE5hbWUsIFBvcnRJRCkgd2hlcmUKICAgICBoT3BlbiA9IHVuY3VycnkgY29ubmVjdFRvCiAKK3Rocm93VHJhbnNwb3J0RXhuIDo6IElPRXJyb3IgLT4gSU8gYQordGhyb3dUcmFuc3BvcnRFeG4gZSA9IGlmIGlzRU9GRXJyb3IgZQorICAgIHRoZW4gdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkNhbm5vdCByZWFkLiBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkLiIgVEVfVU5LTk9XTgorICAgIGVsc2UgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhhbmRsZSB0UmVhZEFsbDogQ291bGQgbm90IHJlYWQiIFRFX1VOS05PV04KIAotaGFuZGxlRU9GIDo6IGZvcmFsbCBhIChtIDo6ICogLT4gKikuKE1vbm9pZCBhLCBNb25hZCBtKSA9PiBJT0Vycm9yIC0+IG0gYQotaGFuZGxlRU9GIGUgPSBpZiBpc0VPRkVycm9yIGUKLSAgICB0aGVuIHJldHVybiBtZW1wdHkKLSAgICBlbHNlIHRocm93ICQgVHJhbnNwb3J0RXhuICJUQ2hhbm5lbFRyYW5zcG9ydDogQ291bGQgbm90IHJlYWQiIFRFX1VOS05PV04KK2hhbmRsZUVPRiA6OiBhIC0+IElPRXJyb3IgLT4gSU8gYQoraGFuZGxlRU9GIGEgZSA9IGlmIGlzRU9GRXJyb3IgZQorICAgIHRoZW4gcmV0dXJuIGEKKyAgICBlbHNlIHRocm93ICQgVHJhbnNwb3J0RXhuICJIYW5kbGU6IENvdWxkIG5vdCByZWFkIiBURV9VTktOT1dOCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSGVhZGVyLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0hlYWRlci5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGFjYWQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0hlYWRlci5ocwpAQCAtMCwwICsxLDM1NCBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK21vZHVsZSBUaHJpZnQuVHJhbnNwb3J0LkhlYWRlcgorICAoIG1vZHVsZSBUaHJpZnQuVHJhbnNwb3J0CisgICwgSGVhZGVyVHJhbnNwb3J0KC4uKQorICAsIG9wZW5IZWFkZXJUcmFuc3BvcnQKKyAgLCBQcm90b2NvbFR5cGUoLi4pCisgICwgVHJhbnNmb3JtVHlwZSguLikKKyAgLCBDbGllbnRUeXBlKC4uKQorICAsIHRSZXNldFByb3RvY29sCisgICwgdFNldFByb3RvY29sCisgICkgd2hlcmUKKworaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdAoraW1wb3J0IENvbnRyb2wuQXBwbGljYXRpdmUKK2ltcG9ydCBDb250cm9sLkV4Y2VwdGlvbiAoIHRocm93ICkKK2ltcG9ydCBDb250cm9sLk1vbmFkCitpbXBvcnQgRGF0YS5CaXRzCitpbXBvcnQgRGF0YS5JT1JlZgoraW1wb3J0IERhdGEuSW50CitpbXBvcnQgRGF0YS5Nb25vaWQKK2ltcG9ydCBEYXRhLldvcmQKKworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkF0dG9wYXJzZWMuQnl0ZVN0cmluZyBhcyBQCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQmluYXJ5IGFzIEJpbmFyeQoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcgYXMgQlMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkNoYXI4IGFzIEMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5LkJ1aWxkZXIgYXMgQgoraW1wb3J0IHF1YWxpZmllZCBEYXRhLk1hcCBhcyBNYXAKKworZGF0YSBQcm90b2NvbFR5cGUgPSBUQmluYXJ5IHwgVENvbXBhY3QgfCBUSlNPTiBkZXJpdmluZyAoRW51bSwgRXEpCitkYXRhIENsaWVudFR5cGUgPSBIZWFkZXJDbGllbnQgfCBGcmFtZWQgfCBVbmZyYW1lZCBkZXJpdmluZyAoRW51bSwgRXEpCisKK2luZm9JZEtleVZhbHVlID0gMQorCit0eXBlIEhlYWRlcnMgPSBNYXAuTWFwIFN0cmluZyBTdHJpbmcKKworZGF0YSBUcmFuc2Zvcm1UeXBlID0gWmxpYlRyYW5zZm9ybSBkZXJpdmluZyAoRW51bSwgRXEpCisKK2Zyb21UcmFuc3BvcnRUeXBlIDo6IFRyYW5zZm9ybVR5cGUgLT4gSW50MTYKK2Zyb21UcmFuc3BvcnRUeXBlIFpsaWJUcmFuc2Zvcm0gPSAxCisKK3RvVHJhbnNwb3J0VHlwZSA6OiBJbnQxNiAtPiBUcmFuc2Zvcm1UeXBlCit0b1RyYW5zcG9ydFR5cGUgMSA9IFpsaWJUcmFuc2Zvcm0KK3RvVHJhbnNwb3J0VHlwZSBfID0gIHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IFVua25vd24gdHJhbnNmb3JtIElEIiBURV9VTktOT1dOCisKK2RhdGEgSGVhZGVyVHJhbnNwb3J0IGkgbyA9IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclRyYW5zcG9ydAorICAgIHsgcmVhZEJ1ZmZlciA6OiBJT1JlZiBMQlMuQnl0ZVN0cmluZworICAgICwgd3JpdGVCdWZmZXIgOjogSU9SZWYgQi5CdWlsZGVyCisgICAgLCBpblRyYW5zIDo6IGkKKyAgICAsIG91dFRyYW5zIDo6IG8KKyAgICAsIGNsaWVudFR5cGUgOjogSU9SZWYgQ2xpZW50VHlwZQorICAgICwgcHJvdG9jb2xUeXBlIDo6IElPUmVmIFByb3RvY29sVHlwZQorICAgICwgaGVhZGVycyA6OiBJT1JlZiBbKFN0cmluZywgU3RyaW5nKV0KKyAgICAsIHdyaXRlSGVhZGVycyA6OiBIZWFkZXJzCisgICAgLCB0cmFuc2Zvcm1zIDo6IElPUmVmIFtUcmFuc2Zvcm1UeXBlXQorICAgICwgd3JpdGVUcmFuc2Zvcm1zIDo6IFtUcmFuc2Zvcm1UeXBlXQorICAgIH0KKworb3BlbkhlYWRlclRyYW5zcG9ydCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBpIC0+IG8gLT4gSU8gKEhlYWRlclRyYW5zcG9ydCBpIG8pCitvcGVuSGVhZGVyVHJhbnNwb3J0IGkgbyA9IGRvCisgIHBpZCA8LSBuZXdJT1JlZiBUQ29tcGFjdAorICByQnVmIDwtIG5ld0lPUmVmIExCUy5lbXB0eQorICB3QnVmIDwtIG5ld0lPUmVmIG1lbXB0eQorICBjVHlwZSA8LSBuZXdJT1JlZiBIZWFkZXJDbGllbnQKKyAgaCA8LSBuZXdJT1JlZiBbXQorICB0cmFucyA8LSBuZXdJT1JlZiBbXQorICByZXR1cm4gSGVhZGVyVHJhbnNwb3J0CisgICAgICB7IHJlYWRCdWZmZXIgPSByQnVmCisgICAgICAsIHdyaXRlQnVmZmVyID0gd0J1ZgorICAgICAgLCBpblRyYW5zID0gaQorICAgICAgLCBvdXRUcmFucyA9IG8KKyAgICAgICwgY2xpZW50VHlwZSA9IGNUeXBlCisgICAgICAsIHByb3RvY29sVHlwZSA9IHBpZAorICAgICAgLCBoZWFkZXJzID0gaAorICAgICAgLCB3cml0ZUhlYWRlcnMgPSBNYXAuZW1wdHkKKyAgICAgICwgdHJhbnNmb3JtcyA9IHRyYW5zCisgICAgICAsIHdyaXRlVHJhbnNmb3JtcyA9IFtdCisgICAgICB9CisKK2lzRnJhbWVkIHQgPSAoLz0gVW5mcmFtZWQpIDwkPiByZWFkSU9SZWYgKGNsaWVudFR5cGUgdCkKKworcmVhZEZyYW1lIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gSU8gQm9vbAorcmVhZEZyYW1lIHQgPSBkbworICBsZXQgaW5wdXQgPSBpblRyYW5zIHQKKyAgbGV0IHJCdWYgPSByZWFkQnVmZmVyIHQKKyAgbGV0IGNUeXBlID0gY2xpZW50VHlwZSB0CisgIGxzeiA8LSB0UmVhZCBpbnB1dCA0CisgIGxldCBzeiA9IExCUy50b1N0cmljdCBsc3oKKyAgY2FzZSBQLnBhcnNlT25seSBQLmVuZE9mSW5wdXQgc3ogb2YKKyAgICBSaWdodCBfIC0+IGRvIHJldHVybiBGYWxzZQorICAgIExlZnQgXyAtPiBkbworICAgICAgY2FzZSBwYXJzZUJpbmFyeU1hZ2ljIHN6IG9mCisgICAgICAgIFJpZ2h0IF8gLT4gZG8KKyAgICAgICAgICB3cml0ZUlPUmVmIHJCdWYgJCBsc3oKKyAgICAgICAgICB3cml0ZUlPUmVmIGNUeXBlIFVuZnJhbWVkCisgICAgICAgICAgd3JpdGVJT1JlZiAocHJvdG9jb2xUeXBlIHQpIFRCaW5hcnkKKyAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBMZWZ0IF8gLT4gZG8KKyAgICAgICAgICBjYXNlIHBhcnNlQ29tcGFjdE1hZ2ljIHN6IG9mCisgICAgICAgICAgICBSaWdodCBfIC0+IGRvCisgICAgICAgICAgICAgIHdyaXRlSU9SZWYgckJ1ZiAkIGxzegorICAgICAgICAgICAgICB3cml0ZUlPUmVmIGNUeXBlIFVuZnJhbWVkCisgICAgICAgICAgICAgIHdyaXRlSU9SZWYgKHByb3RvY29sVHlwZSB0KSBUQ29tcGFjdAorICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgTGVmdCBfIC0+IGRvCisgICAgICAgICAgICAgIGxldCBsZW4gPSBCaW5hcnkuZGVjb2RlIGxzeiA6OiBJbnQzMgorICAgICAgICAgICAgICBsYnVmIDwtIHRSZWFkQWxsIGlucHV0ICQgZnJvbUludGVncmFsIGxlbgorICAgICAgICAgICAgICBsZXQgYnVmID0gTEJTLnRvU3RyaWN0IGxidWYKKyAgICAgICAgICAgICAgY2FzZSBwYXJzZUJpbmFyeU1hZ2ljIGJ1ZiBvZgorICAgICAgICAgICAgICAgIFJpZ2h0IF8gLT4gZG8KKyAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgY1R5cGUgRnJhbWVkCisgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIChwcm90b2NvbFR5cGUgdCkgVEJpbmFyeQorICAgICAgICAgICAgICAgICAgd3JpdGVJT1JlZiByQnVmIGxidWYKKyAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgTGVmdCBfIC0+IGRvCisgICAgICAgICAgICAgICAgICBjYXNlIHBhcnNlQ29tcGFjdE1hZ2ljIGJ1ZiBvZgorICAgICAgICAgICAgICAgICAgICBSaWdodCBfIC0+IGRvCisgICAgICAgICAgICAgICAgICAgICAgd3JpdGVJT1JlZiBjVHlwZSBGcmFtZWQKKyAgICAgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIChwcm90b2NvbFR5cGUgdCkgVENvbXBhY3QKKyAgICAgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIHJCdWYgbGJ1ZgorICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgICAgIExlZnQgXyAtPiBkbworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgcGFyc2VIZWFkZXJNYWdpYyBidWYgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIFJpZ2h0IGZsYWdzIC0+IGRvCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCAoZmxhZ3MsIHNlcU51bSwgaGVhZGVyLCBib2R5KSA9IGV4dHJhY3RIZWFkZXIgYnVmCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgY1R5cGUgSGVhZGVyQ2xpZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUhlYWRlciB0IGhlYWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkIDwtIHVudHJhbnNmb3JtIHQgYm9keQorICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIHJCdWYgJCBMQlMuZnJvbVN0cmljdCAkIHBheWxvYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIExlZnQgXyAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGVhZGVyVHJhbnNwb3J0OiB1bmtvbnduIGNsaWVudCB0eXBlIiBURV9VTktOT1dOCisKK3BhcnNlQmluYXJ5TWFnaWMgPSBQLnBhcnNlT25seSAkIFAud29yZDggMHg4MCAqPiBQLndvcmQ4IDB4MDEgKj4gUC53b3JkOCAweDAwICo+IFAuYW55V29yZDgKK3BhcnNlQ29tcGFjdE1hZ2ljID0gUC5wYXJzZU9ubHkgJCBQLndvcmQ4IDB4ODIgKj4gUC5zYXRpc2Z5IChcYiAtPiBiIC4mLiAweDFmID09IDB4MDEpCitwYXJzZUhlYWRlck1hZ2ljID0gUC5wYXJzZU9ubHkgJCBQLndvcmQ4IDB4MGYgKj4gUC53b3JkOCAweGZmICo+IChQLmNvdW50IDIgUC5hbnlXb3JkOCkKKworcGFyc2VJMzIgOjogUC5QYXJzZXIgSW50MzIKK3BhcnNlSTMyID0gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgNAorcGFyc2VJMTYgOjogUC5QYXJzZXIgSW50MTYKK3BhcnNlSTE2ID0gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgMgorCitleHRyYWN0SGVhZGVyIDo6IEJTLkJ5dGVTdHJpbmcgLT4gKEludDE2LCBJbnQzMiwgQlMuQnl0ZVN0cmluZywgQlMuQnl0ZVN0cmluZykKK2V4dHJhY3RIZWFkZXIgYnMgPQorICBjYXNlIFAucGFyc2UgZXh0cmFjdEhlYWRlcl8gYnMgb2YKKyAgICBQLkRvbmUgcmVtYWluIChmbGFncywgc2VxTnVtLCBoZWFkZXIpIC0+IChmbGFncywgc2VxTnVtLCBoZWFkZXIsIHJlbWFpbikKKyAgICBfIC0+IHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IEludmFsaWQgaGVhZGVyIiBURV9VTktOT1dOCisgIHdoZXJlCisgICAgZXh0cmFjdEhlYWRlcl8gPSBkbworICAgICAgbWFnaWMgPC0gUC53b3JkOCAweDBmICo+IFAud29yZDggMHhmZgorICAgICAgZmxhZ3MgPC0gcGFyc2VJMTYKKyAgICAgIHNlcU51bSA8LSBwYXJzZUkzMgorICAgICAgKGhlYWRlclNpemUgOjogSW50KSA8LSAoKiA0KSAuIGZyb21JbnRlZ3JhbCA8JD4gcGFyc2VJMTYKKyAgICAgIGhlYWRlciA8LSBQLnRha2UgaGVhZGVyU2l6ZQorICAgICAgcmV0dXJuIChmbGFncywgc2VxTnVtLCBoZWFkZXIpCisKK2hhbmRsZUhlYWRlciB0IGhlYWRlciA9CisgIGNhc2UgUC5wYXJzZU9ubHkgcGFyc2VIZWFkZXIgaGVhZGVyIG9mCisgICAgUmlnaHQgKHBUeXBlLCB0cmFucywgaW5mbykgLT4gZG8KKyAgICAgIHdyaXRlSU9SZWYgKHByb3RvY29sVHlwZSB0KSBwVHlwZQorICAgICAgd3JpdGVJT1JlZiAodHJhbnNmb3JtcyB0KSB0cmFucworICAgICAgd3JpdGVJT1JlZiAoaGVhZGVycyB0KSBpbmZvCisgICAgXyAtPiB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGVhZGVyVHJhbnNwb3J0OiBJbnZhbGlkIGhlYWRlciIgVEVfVU5LTk9XTgorCisKK2l3MTYgOjogSW50MTYgLT4gV29yZDE2CitpdzE2ID0gZnJvbUludGVncmFsCitpdzMyIDo6IEludDMyIC0+IFdvcmQzMgoraXczMiA9IGZyb21JbnRlZ3JhbAord2kxNiA6OiBXb3JkMTYgLT4gSW50MTYKK3dpMTYgPSBmcm9tSW50ZWdyYWwKK3dpMzIgOjogV29yZDMyIC0+IEludDMyCit3aTMyID0gZnJvbUludGVncmFsCisKK3BhcnNlSGVhZGVyIDo6IFAuUGFyc2VyIChQcm90b2NvbFR5cGUsIFtUcmFuc2Zvcm1UeXBlXSwgWyhTdHJpbmcsIFN0cmluZyldKQorcGFyc2VIZWFkZXIgPSBkbworICBwcm90b2NvbFR5cGUgPC0gdG9Qcm90b2NvbFR5cGUgPCQ+IHBhcnNlVmFyaW50IHdpMTYKKyAgbnVtVHJhbnMgPC0gZnJvbUludGVncmFsIDwkPiBwYXJzZVZhcmludCB3aTE2CisgIHRyYW5zIDwtIHJlcGxpY2F0ZU0gbnVtVHJhbnMgcGFyc2VUcmFuc2Zvcm0KKyAgaW5mbyA8LSBwYXJzZUluZm8KKyAgcmV0dXJuIChwcm90b2NvbFR5cGUsIHRyYW5zLCBpbmZvKQorCit0b1Byb3RvY29sVHlwZSA6OiBJbnQxNiAtPiBQcm90b2NvbFR5cGUKK3RvUHJvdG9jb2xUeXBlIDAgPSBUQmluYXJ5Cit0b1Byb3RvY29sVHlwZSAxID0gVEpTT04KK3RvUHJvdG9jb2xUeXBlIDIgPSBUQ29tcGFjdAorCitmcm9tUHJvdG9jb2xUeXBlIDo6IFByb3RvY29sVHlwZSAtPiBJbnQxNgorZnJvbVByb3RvY29sVHlwZSBUQmluYXJ5ID0gMAorZnJvbVByb3RvY29sVHlwZSBUSlNPTiA9IDEKK2Zyb21Qcm90b2NvbFR5cGUgVENvbXBhY3QgPSAyCisKK3BhcnNlVHJhbnNmb3JtIDo6IFAuUGFyc2VyIFRyYW5zZm9ybVR5cGUKK3BhcnNlVHJhbnNmb3JtID0gdG9UcmFuc3BvcnRUeXBlIDwkPiBwYXJzZVZhcmludCB3aTE2CisKK3BhcnNlSW5mbyA6OiBQLlBhcnNlciBbKFN0cmluZywgU3RyaW5nKV0KK3BhcnNlSW5mbyA9IGRvCisgIG4gPC0gUC5laXRoZXJQIFAuZW5kT2ZJbnB1dCAocGFyc2VWYXJpbnQgd2kzMikKKyAgY2FzZSBuIG9mCisgICAgTGVmdCBfIC0+IHJldHVybiBbXQorICAgIFJpZ2h0IG4wIC0+CisgICAgICByZXBsaWNhdGVNIChmcm9tSW50ZWdyYWwgbjApICQgZG8KKyAgICAgICAga2xlbiA8LSBwYXJzZVZhcmludCB3aTE2CisgICAgICAgIGsgPC0gUC50YWtlICQgZnJvbUludGVncmFsIGtsZW4KKyAgICAgICAgdmxlbiA8LSBwYXJzZVZhcmludCB3aTE2CisgICAgICAgIHYgPC0gUC50YWtlICQgZnJvbUludGVncmFsIHZsZW4KKyAgICAgICAgcmV0dXJuIChDLnVucGFjayBrLCBDLnVucGFjayB2KQorCitwYXJzZVN0cmluZyA6OiBQLlBhcnNlciBCUy5CeXRlU3RyaW5nCitwYXJzZVN0cmluZyA9IHBhcnNlVmFyaW50IHdpMzIgPj49IChQLnRha2UgLiBmcm9tSW50ZWdyYWwpCisKK2J1aWxkSGVhZGVyIDo6IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gSU8gQi5CdWlsZGVyCitidWlsZEhlYWRlciB0ID0gZG8KKyAgcFR5cGUgPC0gcmVhZElPUmVmICQgcHJvdG9jb2xUeXBlIHQKKyAgbGV0IHBJZCA9IGJ1aWxkVmFyaW50ICQgaXcxNiAkIGZyb21Qcm90b2NvbFR5cGUgcFR5cGUKKyAgbGV0IGhlYWRlckNvbnRlbnQgPSBwSWQgPD4gKGJ1aWxkVHJhbnNmb3JtcyB0KSA8PiAoYnVpbGRJbmZvIHQpCisgIGxldCBsZW4gPSBmcm9tSW50ZWdyYWwgJCBMQlMubGVuZ3RoICQgQi50b0xhenlCeXRlU3RyaW5nIGhlYWRlckNvbnRlbnQKKyAgLS0gVE9ETzogbGVuZ3RoIGxpbWl0IGNoZWNrCisgIGxldCBwYWRkaW5nID0gbWNvbmNhdCAkIHJlcGxpY2F0ZSAobW9kIGxlbiA0KSAkIEIud29yZDggMAorICBsZXQgY29kZWRMZW4gPSBCLmludDE2QkUgKGZyb21JbnRlZ3JhbCAkIChxdW90IChsZW4gLSAxKSA0KSArIDEpCisgIGxldCBmbGFncyA9IDAKKyAgbGV0IHNlcU51bSA9IDAKKyAgcmV0dXJuICQgQi5pbnQxNkJFIDB4MGZmZiA8PiBCLmludDE2QkUgZmxhZ3MgPD4gQi5pbnQzMkJFIHNlcU51bSA8PiBjb2RlZExlbiA8PiBoZWFkZXJDb250ZW50IDw+IHBhZGRpbmcKKworYnVpbGRUcmFuc2Zvcm1zIDo6IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gQi5CdWlsZGVyCistLSBUT0RPOiBjaGVjayBsZW5ndGggbGltaXQKK2J1aWxkVHJhbnNmb3JtcyB0ID0KKyAgbGV0IHRyYW5zID0gd3JpdGVUcmFuc2Zvcm1zIHQgaW4KKyAgKGJ1aWxkVmFyaW50ICQgaXcxNiAkIGZyb21JbnRlZ3JhbCAkIGxlbmd0aCB0cmFucykgPD4KKyAgKG1jb25jYXQgJCBtYXAgKGJ1aWxkVmFyaW50IC4gaXcxNiAuIGZyb21UcmFuc3BvcnRUeXBlKSB0cmFucykKKworYnVpbGRJbmZvIDo6IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gQi5CdWlsZGVyCitidWlsZEluZm8gdCA9CisgIGxldCBoID0gTWFwLmFzc29jcyAkIHdyaXRlSGVhZGVycyB0IGluCisgIC0tIFRPRE86IGNoZWNrIGxlbmd0aCBsaW1pdAorICBjYXNlIGxlbmd0aCBoIG9mCisgICAgMCAtPiBtZW1wdHkKKyAgICBsZW4gLT4gKGJ1aWxkVmFyaW50ICQgaXcxNiAkIGZyb21JbnRlZ3JhbCAkIGxlbikgPD4gKG1jb25jYXQgJCBtYXAgYnVpbGRJbmZvRW50cnkgaCkKKyAgd2hlcmUKKyAgICBidWlsZEluZm9FbnRyeSAoaywgdikgPSBidWlsZFZhclN0ciBrIDw+IGJ1aWxkVmFyU3RyIHYKKyAgICAtLSBUT0RPOiBjaGVjayBsZW5ndGggbGltaXQKKyAgICBidWlsZFZhclN0ciBzID0gKGJ1aWxkVmFyaW50ICQgaXcxNiAkIGZyb21JbnRlZ3JhbCAkIGxlbmd0aCBzKSA8PiBCLnN0cmluZzggcworCit0UmVzZXRQcm90b2NvbCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IElPIEJvb2wKK3RSZXNldFByb3RvY29sIHQgPSBkbworICByQnVmIDwtIHJlYWRJT1JlZiAkIHJlYWRCdWZmZXIgdAorICB3cml0ZUlPUmVmIChjbGllbnRUeXBlIHQpIEhlYWRlckNsaWVudAorICByZWFkRnJhbWUgdAorCit0U2V0UHJvdG9jb2wgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyVHJhbnNwb3J0IGkgbyAtPiBQcm90b2NvbFR5cGUgLT4gSU8gKCkKK3RTZXRQcm90b2NvbCB0ID0gd3JpdGVJT1JlZiAocHJvdG9jb2xUeXBlIHQpCisKK3RyYW5zZm9ybSA6OiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IExCUy5CeXRlU3RyaW5nIC0+IExCUy5CeXRlU3RyaW5nCit0cmFuc2Zvcm0gdCBicyA9CisgIGZvbGRyIGFwcGx5VHJhbnNmb3JtIGJzICQgd3JpdGVUcmFuc2Zvcm1zIHQKKyAgd2hlcmUKKyAgICAtLSBhcHBseVRyYW5zZm9ybSBicyBabGliVHJhbnNmb3JtID0KKyAgICAtLSAgIHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IG5vdCBpbXBsZW1lbnRlZDogWmxpYlRyYW5zZm9ybSAgIiBURV9VTktOT1dOCisgICAgYXBwbHlUcmFuc2Zvcm0gYnMgXyA9CisgICAgICB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGVhZGVyVHJhbnNwb3J0OiBVbmtub3duIHRyYW5zZm9ybSIgVEVfVU5LTk9XTgorCit1bnRyYW5zZm9ybSA6OiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IEJTLkJ5dGVTdHJpbmcgLT4gSU8gQlMuQnl0ZVN0cmluZwordW50cmFuc2Zvcm0gdCBicyA9IGRvCisgIHRyYW5zIDwtIHJlYWRJT1JlZiAkIHRyYW5zZm9ybXMgdAorICByZXR1cm4gJCBmb2xkbCB1bmFwcGx5VHJhbnNmb3JtIGJzIHRyYW5zCisgIHdoZXJlCisgICAgLS0gdW5hcHBseVRyYW5zZm9ybSBicyBabGliVHJhbnNmb3JtID0KKyAgICAtLSAgIHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IG5vdCBpbXBsZW1lbnRlZDogWmxpYlRyYW5zZm9ybSAgIiBURV9VTktOT1dOCisgICAgdW5hcHBseVRyYW5zZm9ybSBicyBfID0KKyAgICAgIHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IFVua25vd24gdHJhbnNmb3JtIiBURV9VTktOT1dOCisKK2luc3RhbmNlIChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IFRyYW5zcG9ydCAoSGVhZGVyVHJhbnNwb3J0IGkgbykgd2hlcmUKKyAgdElzT3BlbiB0ID0gZG8KKyAgICB0SXNPcGVuIChpblRyYW5zIHQpCisgICAgdElzT3BlbiAob3V0VHJhbnMgdCkKKworICB0Q2xvc2UgdCA9IGRvCisgICAgdENsb3NlKG91dFRyYW5zIHQpCisgICAgdENsb3NlKGluVHJhbnMgdCkKKworICB0UmVhZCB0IGxlbiA9IGRvCisgICAgckJ1ZiA8LSByZWFkSU9SZWYgJCByZWFkQnVmZmVyIHQKKyAgICBpZiBub3QgJCBMQlMubnVsbCByQnVmCisgICAgICB0aGVuIGRvCisgICAgICAgIGxldCAoY29uc3VtZWQsIHJlbWFpbikgPSBMQlMuc3BsaXRBdCAoZnJvbUludGVncmFsIGxlbikgckJ1ZgorICAgICAgICB3cml0ZUlPUmVmIChyZWFkQnVmZmVyIHQpIHJlbWFpbgorICAgICAgICByZXR1cm4gY29uc3VtZWQKKyAgICAgIGVsc2UgZG8KKyAgICAgICAgZnJhbWVkIDwtIGlzRnJhbWVkIHQKKyAgICAgICAgaWYgbm90IGZyYW1lZAorICAgICAgICAgIHRoZW4gdFJlYWQgKGluVHJhbnMgdCkgbGVuCisgICAgICAgICAgZWxzZSBkbworICAgICAgICAgICAgb2sgPC0gcmVhZEZyYW1lIHQKKyAgICAgICAgICAgIGlmIG9rCisgICAgICAgICAgICAgIHRoZW4gdFJlYWQgdCBsZW4KKyAgICAgICAgICAgICAgZWxzZSByZXR1cm4gTEJTLmVtcHR5CisKKyAgdFBlZWsgdCA9IGRvCisgICAgckJ1ZiA8LSByZWFkSU9SZWYgKHJlYWRCdWZmZXIgdCkKKyAgICBpZiBub3QgJCBMQlMubnVsbCByQnVmCisgICAgICB0aGVuIHJldHVybiAkIEp1c3QgJCBMQlMuaGVhZCByQnVmCisgICAgICBlbHNlIGRvCisgICAgICAgIGZyYW1lZCA8LSBpc0ZyYW1lZCB0CisgICAgICAgIGlmIG5vdCBmcmFtZWQKKyAgICAgICAgICB0aGVuIHRQZWVrIChpblRyYW5zIHQpCisgICAgICAgICAgZWxzZSBkbworICAgICAgICAgICAgb2sgPC0gcmVhZEZyYW1lIHQKKyAgICAgICAgICAgIGlmIG9rCisgICAgICAgICAgICAgIHRoZW4gdFBlZWsgdAorICAgICAgICAgICAgICBlbHNlIHJldHVybiBOb3RoaW5nCisKKyAgdFdyaXRlIHQgYnVmID0gZG8KKyAgICBsZXQgd0J1ZiA9IHdyaXRlQnVmZmVyIHQKKyAgICBmcmFtZWQgPC0gaXNGcmFtZWQgdAorICAgIGlmIGZyYW1lZAorICAgICAgdGhlbiBtb2RpZnlJT1JlZiB3QnVmICg8PiBCLmxhenlCeXRlU3RyaW5nIGJ1ZikKKyAgICAgIGVsc2UKKyAgICAgICAgLS0gVE9ETzogd2hhdCBzaG91bGQgd2UgZG8gd2hlbiBzd2l0Y2hlZCB0byB1bmZyYW1lZCBpbiB0aGUgbWlkZGxlID8KKyAgICAgICAgdFdyaXRlKG91dFRyYW5zIHQpIGJ1ZgorCisgIHRGbHVzaCB0ID0gZG8KKyAgICBjVHlwZSA8LSByZWFkSU9SZWYgJCBjbGllbnRUeXBlIHQKKyAgICBjYXNlIGNUeXBlIG9mCisgICAgICBVbmZyYW1lZCAtPiB0Rmx1c2ggJCBvdXRUcmFucyB0CisgICAgICBGcmFtZWQgLT4gZmx1c2hCdWZmZXIgdCBpZCBtZW1wdHkKKyAgICAgIEhlYWRlckNsaWVudCAtPiBidWlsZEhlYWRlciB0ID4+PSBmbHVzaEJ1ZmZlciB0ICh0cmFuc2Zvcm0gdCkKKyAgICB3aGVyZQorICAgICAgZmx1c2hCdWZmZXIgdCBmIGhlYWRlciA9IGRvCisgICAgICAgIHdCdWYgPC0gcmVhZElPUmVmICQgd3JpdGVCdWZmZXIgdAorICAgICAgICB3cml0ZUlPUmVmICh3cml0ZUJ1ZmZlciB0KSBtZW1wdHkKKyAgICAgICAgbGV0IHBheWxvYWQgPSBCLnRvTGF6eUJ5dGVTdHJpbmcgKGhlYWRlciA8PiB3QnVmKQorICAgICAgICB0V3JpdGUgKG91dFRyYW5zIHQpICQgQmluYXJ5LmVuY29kZSAoZnJvbUludGVncmFsICQgTEJTLmxlbmd0aCBwYXlsb2FkIDo6IEludDMyKQorICAgICAgICB0V3JpdGUgKG91dFRyYW5zIHQpICQgZiBwYXlsb2FkCisgICAgICAgIHRGbHVzaCAob3V0VHJhbnMgdCkKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IdHRwQ2xpZW50LmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0h0dHBDbGllbnQuaHMKaW5kZXggYjFiMDk4Mi4uZWRlYjMyMCAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0h0dHBDbGllbnQuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0h0dHBDbGllbnQuaHMKQEAgLTIyLDE4ICsyMiwxNiBAQAogICAgICggbW9kdWxlIFRocmlmdC5UcmFuc3BvcnQKICAgICAsIEh0dHBDbGllbnQgKC4uKQogICAgICwgb3Blbkh0dHBDbGllbnQKLSAgICApIHdoZXJlCispIHdoZXJlCiAKIGltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5JT0J1ZmZlcgogaW1wb3J0IE5ldHdvcmsuVVJJCiBpbXBvcnQgTmV0d29yay5IVFRQIGhpZGluZyAocG9ydCwgaG9zdCkKIAotaW1wb3J0IENvbnRyb2wuTW9uYWQgKGxpZnRNKQogaW1wb3J0IERhdGEuTWF5YmUgKGZyb21KdXN0KQotaW1wb3J0IERhdGEuTW9ub2lkIChtYXBwZW5kLCBtZW1wdHkpCitpbXBvcnQgRGF0YS5Nb25vaWQgKG1lbXB0eSkKIGltcG9ydCBDb250cm9sLkV4Y2VwdGlvbiAodGhyb3cpCi1pbXBvcnQgQ29udHJvbC5Db25jdXJyZW50Lk1WYXIKLWltcG9ydCBxdWFsaWZpZWQgRGF0YS5CaW5hcnkuQnVpbGRlciBhcyBCCiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUwogCiAKQEAgLTczLDExICs3MSwxMyBAQAogCiBpbnN0YW5jZSBUcmFuc3BvcnQgSHR0cENsaWVudCB3aGVyZQogCi0gICAgdENsb3NlICA9IGNsb3NlIC4gaHN0cmVhbQorICAgIHRDbG9zZSA9IGNsb3NlIC4gaHN0cmVhbQogCi0gICAgdFJlYWQgaGNsaWVudCBuID0gcmVhZEJ1ZiAocmVhZEJ1ZmZlciBoY2xpZW50KSBuCisgICAgdFBlZWsgPSBwZWVrQnVmIC4gcmVhZEJ1ZmZlcgogCi0gICAgdFdyaXRlIGhjbGllbnQgPSB3cml0ZUJ1ZiAod3JpdGVCdWZmZXIgaGNsaWVudCkKKyAgICB0UmVhZCA9IHJlYWRCdWYgLiByZWFkQnVmZmVyCisKKyAgICB0V3JpdGUgPSB3cml0ZUJ1ZiAuIHdyaXRlQnVmZmVyCiAKICAgICB0Rmx1c2ggaGNsaWVudCA9IGRvCiAgICAgICBib2R5IDwtIGZsdXNoQnVmICQgd3JpdGVCdWZmZXIgaGNsaWVudApAQCAtOTIsMzYgKzkyLDEwIEBACiAKICAgICAgIHJlcyA8LSBzZW5kSFRUUCAoaHN0cmVhbSBoY2xpZW50KSByZXF1ZXN0CiAgICAgICBjYXNlIHJlcyBvZgotICAgICAgICBSaWdodCByZXNwb25zZSAtPiBkbwotICAgICAgICAgICAgZmlsbEJ1ZiAocmVhZEJ1ZmZlciBoY2xpZW50KSAocnNwQm9keSByZXNwb25zZSkKLSAgICAgICAgTGVmdCBfIC0+IGRvCisgICAgICAgIFJpZ2h0IHJlc3BvbnNlIC0+CisgICAgICAgICAgZmlsbEJ1ZiAocmVhZEJ1ZmZlciBoY2xpZW50KSAocnNwQm9keSByZXNwb25zZSkKKyAgICAgICAgTGVmdCBfIC0+CiAgICAgICAgICAgICB0aHJvdyAkIFRyYW5zcG9ydEV4biAiVEh0dHBDb25uZWN0aW9uOiBIVFRQIGZhaWx1cmUgZnJvbSBzZXJ2ZXIiIFRFX1VOS05PV04KICAgICAgIHJldHVybiAoKQogCiAgICAgdElzT3BlbiBfID0gcmV0dXJuIFRydWUKLS0tIE1pbmkgSU8gYnVmZmVycwotCi10eXBlIFdyaXRlQnVmZmVyID0gTVZhciAoQi5CdWlsZGVyKQotCi1uZXdXcml0ZUJ1ZmZlciA6OiBJTyBXcml0ZUJ1ZmZlcgotbmV3V3JpdGVCdWZmZXIgPSBuZXdNVmFyIG1lbXB0eQotCi13cml0ZUJ1ZiA6OiBXcml0ZUJ1ZmZlciAtPiBMQlMuQnl0ZVN0cmluZyAtPiBJTyAoKQotd3JpdGVCdWYgdyBzID0gbW9kaWZ5TVZhcl8gdyAkIHJldHVybiAuIChcYnVpbGRlciAtPgotICAgICAgICAgICAgICAgICBidWlsZGVyIGBtYXBwZW5kYCAoQi5mcm9tTGF6eUJ5dGVTdHJpbmcgcykpCi0KLWZsdXNoQnVmIDo6IFdyaXRlQnVmZmVyIC0+IElPIChMQlMuQnl0ZVN0cmluZykKLWZsdXNoQnVmIHcgPSBCLnRvTGF6eUJ5dGVTdHJpbmcgYGxpZnRNYCBzd2FwTVZhciB3IG1lbXB0eQotCi0KLXR5cGUgUmVhZEJ1ZmZlciA9IE1WYXIgKExCUy5CeXRlU3RyaW5nKQotCi1uZXdSZWFkQnVmZmVyIDo6IElPIFJlYWRCdWZmZXIKLW5ld1JlYWRCdWZmZXIgPSBuZXdNVmFyIG1lbXB0eQotCi1maWxsQnVmIDo6IFJlYWRCdWZmZXIgLT4gTEJTLkJ5dGVTdHJpbmcgLT4gSU8gKCkKLWZpbGxCdWYgciBzID0gc3dhcE1WYXIgciBzID4+IHJldHVybiAoKQotCi1yZWFkQnVmIDo6IFJlYWRCdWZmZXIgLT4gSW50IC0+IElPIChMQlMuQnl0ZVN0cmluZykKLXJlYWRCdWYgciBuID0gbW9kaWZ5TVZhciByICQgcmV0dXJuIC4gZmxpcFBhaXIgLiBMQlMuc3BsaXRBdCAoZnJvbUludGVncmFsIG4pCi0gICAgd2hlcmUgZmxpcFBhaXIgKGEsIGIpID0gKGIsIGEpCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSU9CdWZmZXIuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSU9CdWZmZXIuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ViZDdkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9JT0J1ZmZlci5ocwpAQCAtMCwwICsxLDY5IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworbW9kdWxlIFRocmlmdC5UcmFuc3BvcnQuSU9CdWZmZXIKKyAgICAgICAoIFdyaXRlQnVmZmVyCisgICAgICAgLCBuZXdXcml0ZUJ1ZmZlcgorICAgICAgICwgd3JpdGVCdWYKKyAgICAgICAsIGZsdXNoQnVmCisgICAgICAgLCBSZWFkQnVmZmVyCisgICAgICAgLCBuZXdSZWFkQnVmZmVyCisgICAgICAgLCBmaWxsQnVmCisgICAgICAgLCByZWFkQnVmCisgICAgICAgLCBwZWVrQnVmCisgICAgICAgKSB3aGVyZQorCitpbXBvcnQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQnVpbGRlcgoraW1wb3J0IERhdGEuRnVuY3RvcgoraW1wb3J0IERhdGEuSU9SZWYKK2ltcG9ydCBEYXRhLk1vbm9pZAoraW1wb3J0IERhdGEuV29yZAorCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworCit0eXBlIFdyaXRlQnVmZmVyID0gSU9SZWYgQnVpbGRlcgordHlwZSBSZWFkQnVmZmVyID0gSU9SZWYgTEJTLkJ5dGVTdHJpbmcKKworbmV3V3JpdGVCdWZmZXIgOjogSU8gV3JpdGVCdWZmZXIKK25ld1dyaXRlQnVmZmVyID0gbmV3SU9SZWYgbWVtcHR5CisKK3dyaXRlQnVmIDo6IFdyaXRlQnVmZmVyIC0+IExCUy5CeXRlU3RyaW5nIC0+IElPICgpCit3cml0ZUJ1ZiB3IHMgPSBtb2RpZnlJT1JlZiB3ICggPD4gbGF6eUJ5dGVTdHJpbmcgcykKKworZmx1c2hCdWYgOjogV3JpdGVCdWZmZXIgLT4gSU8gTEJTLkJ5dGVTdHJpbmcKK2ZsdXNoQnVmIHcgPSBkbworICBidWYgPC0gcmVhZElPUmVmIHcKKyAgd3JpdGVJT1JlZiB3IG1lbXB0eQorICByZXR1cm4gJCB0b0xhenlCeXRlU3RyaW5nIGJ1ZgorCituZXdSZWFkQnVmZmVyIDo6IElPIFJlYWRCdWZmZXIKK25ld1JlYWRCdWZmZXIgPSBuZXdJT1JlZiBtZW1wdHkKKworZmlsbEJ1ZiA6OiBSZWFkQnVmZmVyIC0+IExCUy5CeXRlU3RyaW5nIC0+IElPICgpCitmaWxsQnVmID0gd3JpdGVJT1JlZgorCityZWFkQnVmIDo6IFJlYWRCdWZmZXIgLT4gSW50IC0+IElPIExCUy5CeXRlU3RyaW5nCityZWFkQnVmIHIgbiA9IGRvCisgIGJzIDwtIHJlYWRJT1JlZiByCisgIGxldCAoaGQsIHRsKSA9IExCUy5zcGxpdEF0IChmcm9tSW50ZWdyYWwgbikgYnMKKyAgd3JpdGVJT1JlZiByIHRsCisgIHJldHVybiBoZAorCitwZWVrQnVmIDo6IFJlYWRCdWZmZXIgLT4gSU8gKE1heWJlIFdvcmQ4KQorcGVla0J1ZiByID0gKGZtYXAgZnN0IC4gTEJTLnVuY29ucykgPCQ+IHJlYWRJT1JlZiByCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvTWVtb3J5LmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L01lbW9yeS5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzkzYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L01lbW9yeS5ocwpAQCAtMCwwICsxLDc3IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworbW9kdWxlIFRocmlmdC5UcmFuc3BvcnQuTWVtb3J5CisgICAgICAgKCBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgLCBNZW1vcnlCdWZmZXIoLi4pCisgICAgICAgKSB3aGVyZQorCitpbXBvcnQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQnVpbGRlcgoraW1wb3J0IERhdGEuRnVuY3RvcgoraW1wb3J0IERhdGEuSU9SZWYKK2ltcG9ydCBEYXRhLk1vbm9pZAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKKworaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKKworCitkYXRhIE1lbW9yeUJ1ZmZlciA9IE1lbW9yeUJ1ZmZlciB7CisgIHdyaXRlQnVmZmVyIDo6IElPUmVmIEJ1aWxkZXIsCisgIHJlYWRCdWZmZXIgOjogSU9SZWYgTEJTLkJ5dGVTdHJpbmcKK30KKworb3Blbk1lbW9yeUJ1ZmZlciA6OiBJTyBNZW1vcnlCdWZmZXIKK29wZW5NZW1vcnlCdWZmZXIgPSBkbworICB3YnVmIDwtIG5ld0lPUmVmIG1lbXB0eQorICByYnVmIDwtIG5ld0lPUmVmIG1lbXB0eQorICByZXR1cm4gTWVtb3J5QnVmZmVyIHsKKyAgICB3cml0ZUJ1ZmZlciA9IHdidWYsCisgICAgcmVhZEJ1ZmZlciA9IHJidWYKKyAgfQorCitpbnN0YW5jZSBUcmFuc3BvcnQgTWVtb3J5QnVmZmVyIHdoZXJlCisgIHRJc09wZW4gPSBjb25zdCAkIHJldHVybiBGYWxzZQorICB0Q2xvc2UgID0gY29uc3QgJCByZXR1cm4gKCkKKyAgdEZsdXNoIHRyYW5zID0gZG8KKyAgICBsZXQgd0J1ZiA9IHdyaXRlQnVmZmVyIHRyYW5zCisgICAgd2IgPC0gcmVhZElPUmVmIHdCdWYKKyAgICBtb2RpZnlJT1JlZiAocmVhZEJ1ZmZlciB0cmFucykgJCBccmIgLT4gbWFwcGVuZCByYiAkIHRvTGF6eUJ5dGVTdHJpbmcgd2IKKyAgICB3cml0ZUlPUmVmIHdCdWYgbWVtcHR5CisKKyAgdFJlYWQgXyAwID0gcmV0dXJuIG1lbXB0eQorICB0UmVhZCB0cmFucyBuID0gZG8KKyAgICBsZXQgcmJ1ZiA9IHJlYWRCdWZmZXIgdHJhbnMKKyAgICByYiA8LSByZWFkSU9SZWYgcmJ1ZgorICAgIGxldCBsZW4gPSBmcm9tSW50ZWdyYWwgJCBMQlMubGVuZ3RoIHJiCisgICAgaWYgbGVuID09IDAKKyAgICAgIHRoZW4gZG8KKyAgICAgICAgdEZsdXNoIHRyYW5zCisgICAgICAgIHJiMiA8LSByZWFkSU9SZWYgKHJlYWRCdWZmZXIgdHJhbnMpCisgICAgICAgIGlmIChmcm9tSW50ZWdyYWwgJCBMQlMubGVuZ3RoIHJiMikgPT0gMAorICAgICAgICAgIHRoZW4gcmV0dXJuIG1lbXB0eQorICAgICAgICAgIGVsc2UgdFJlYWQgdHJhbnMgbgorICAgICAgZWxzZSBkbworICAgICAgICBsZXQgKHJldCwgcmVtYWluKSA9IExCUy5zcGxpdEF0IChmcm9tSW50ZWdyYWwgbikgcmIKKyAgICAgICAgd3JpdGVJT1JlZiByYnVmIHJlbWFpbgorICAgICAgICByZXR1cm4gcmV0CisKKyAgdFBlZWsgdHJhbnMgPSAoZm1hcCBmc3QgLiBMQlMudW5jb25zKSA8JD4gcmVhZElPUmVmIChyZWFkQnVmZmVyIHRyYW5zKQorCisgIHRXcml0ZSB0cmFucyB2ID0gZG8KKyAgICBtb2RpZnlJT1JlZiAod3JpdGVCdWZmZXIgdHJhbnMpICg8PiBsYXp5Qnl0ZVN0cmluZyB2KQpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvVHlwZXMuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9UeXBlcy5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTIwMDI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvVHlwZXMuaHMKQEAgLTAsMCArMSwxMzAgQEAKKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK3stIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tb3JwaGFucyAjLX0KKworbW9kdWxlIFRocmlmdC5UeXBlcyB3aGVyZQorCitpbXBvcnQgRGF0YS5Gb2xkYWJsZSAoZm9sZGwnKQoraW1wb3J0IERhdGEuSGFzaGFibGUgKCBIYXNoYWJsZSwgaGFzaFdpdGhTYWx0ICkKK2ltcG9ydCBEYXRhLkludAoraW1wb3J0IFRlc3QuUXVpY2tDaGVjay5BcmJpdHJhcnkKK2ltcG9ydCBUZXN0LlF1aWNrQ2hlY2suR2VuIChlbGVtZW50cykKK2ltcG9ydCBEYXRhLlRleHQuTGF6eSAoVGV4dCkKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaFNldCBhcyBTZXQKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5WZWN0b3IgYXMgVmVjdG9yCisKK2luc3RhbmNlIChIYXNoYWJsZSBhKSA9PiBIYXNoYWJsZSAoVmVjdG9yLlZlY3RvciBhKSB3aGVyZQorICBoYXNoV2l0aFNhbHQgPSBWZWN0b3IuZm9sZGwnIGhhc2hXaXRoU2FsdAorCisKK3R5cGUgVHlwZU1hcCA9IE1hcC5IYXNoTWFwIEludDE2IChUZXh0LCBUaHJpZnRUeXBlKQorCitkYXRhIFRocmlmdFZhbCA9IFRTdHJ1Y3QgKE1hcC5IYXNoTWFwIEludDE2IChUZXh0LCBUaHJpZnRWYWwpKQorICAgICAgICAgICAgICAgfCBUTWFwIFRocmlmdFR5cGUgVGhyaWZ0VHlwZSBbKFRocmlmdFZhbCwgVGhyaWZ0VmFsKV0KKyAgICAgICAgICAgICAgIHwgVExpc3QgVGhyaWZ0VHlwZSBbVGhyaWZ0VmFsXQorICAgICAgICAgICAgICAgfCBUU2V0IFRocmlmdFR5cGUgW1RocmlmdFZhbF0KKyAgICAgICAgICAgICAgIHwgVEJvb2wgQm9vbAorICAgICAgICAgICAgICAgfCBUQnl0ZSBJbnQ4CisgICAgICAgICAgICAgICB8IFRJMTYgSW50MTYKKyAgICAgICAgICAgICAgIHwgVEkzMiBJbnQzMgorICAgICAgICAgICAgICAgfCBUSTY0IEludDY0CisgICAgICAgICAgICAgICB8IFRTdHJpbmcgTEJTLkJ5dGVTdHJpbmcKKyAgICAgICAgICAgICAgIHwgVEJpbmFyeSBMQlMuQnl0ZVN0cmluZworICAgICAgICAgICAgICAgfCBURG91YmxlIERvdWJsZQorICAgICAgICAgICAgICAgICBkZXJpdmluZyAoRXEsIFNob3cpCisKKy0tIEluZm9ybWF0aW9uIGlzIG5lZWRlZCBoZXJlIGZvciBjb2xsZWN0aW9uIHR5cGVzIChpZSBUX1NUUlVDVCwgVF9NQVAsCistLSBUX0xJU1QsIGFuZCBUX1NFVCkgc28gdGhhdCB3ZSBrbm93IHdoYXQgdHlwZXMgdGhvc2UgY29sbGVjdGlvbnMgYXJlCistLSBwYXJhbWV0ZXJpemVkIGJ5LiAgSW4gbW9zdCBwcm90b2NvbHMsIHRoaXMgY2Fubm90IGJlIGRpc2Nlcm5lZCBkaXJlY3RseQorLS0gZnJvbSB0aGUgZGF0YSBiZWluZyByZWFkLgorZGF0YSBUaHJpZnRUeXBlCisgICAgPSBUX1NUT1AKKyAgICB8IFRfVk9JRAorICAgIHwgVF9CT09MCisgICAgfCBUX0JZVEUKKyAgICB8IFRfRE9VQkxFCisgICAgfCBUX0kxNgorICAgIHwgVF9JMzIKKyAgICB8IFRfSTY0CisgICAgfCBUX1NUUklORworICAgIHwgVF9CSU5BUlkKKyAgICB8IFRfU1RSVUNUIFR5cGVNYXAKKyAgICB8IFRfTUFQIFRocmlmdFR5cGUgVGhyaWZ0VHlwZQorICAgIHwgVF9TRVQgVGhyaWZ0VHlwZQorICAgIHwgVF9MSVNUIFRocmlmdFR5cGUKKyAgICAgIGRlcml2aW5nICggRXEsIFNob3cgKQorCistLSBOT1RFOiB3aGVuIHVzaW5nIHRvRW51bSBpbmZvcm1hdGlvbiBhYm91dCBwYXJhbWV0aXplZCB0eXBlcyBpcyBOT1QgcHJlc2VydmVkLgorLS0gVGhpcyBkZXNpZ24gY2hvaWNlIGlzIGNvbnNpc3RlbnQgd290aCB0aGUgVGhyaWZ0IGltcGxlbWVudGF0aW9uIGluIG90aGVyCistLSBsYW5ndWFnZXMKK2luc3RhbmNlIEVudW0gVGhyaWZ0VHlwZSB3aGVyZQorICAgIGZyb21FbnVtIFRfU1RPUCAgICAgICA9IDAKKyAgICBmcm9tRW51bSBUX1ZPSUQgICAgICAgPSAxCisgICAgZnJvbUVudW0gVF9CT09MICAgICAgID0gMgorICAgIGZyb21FbnVtIFRfQllURSAgICAgICA9IDMKKyAgICBmcm9tRW51bSBUX0RPVUJMRSAgICAgPSA0CisgICAgZnJvbUVudW0gVF9JMTYgICAgICAgID0gNgorICAgIGZyb21FbnVtIFRfSTMyICAgICAgICA9IDgKKyAgICBmcm9tRW51bSBUX0k2NCAgICAgICAgPSAxMAorICAgIGZyb21FbnVtIFRfU1RSSU5HICAgICA9IDExCisgICAgZnJvbUVudW0gVF9CSU5BUlkgICAgID0gMTEKKyAgICBmcm9tRW51bSAoVF9TVFJVQ1QgXykgPSAxMgorICAgIGZyb21FbnVtIChUX01BUCBfIF8pICA9IDEzCisgICAgZnJvbUVudW0gKFRfU0VUIF8pICAgID0gMTQKKyAgICBmcm9tRW51bSAoVF9MSVNUIF8pICAgPSAxNQorCisgICAgdG9FbnVtIDAgID0gVF9TVE9QCisgICAgdG9FbnVtIDEgID0gVF9WT0lECisgICAgdG9FbnVtIDIgID0gVF9CT09MCisgICAgdG9FbnVtIDMgID0gVF9CWVRFCisgICAgdG9FbnVtIDQgID0gVF9ET1VCTEUKKyAgICB0b0VudW0gNiAgPSBUX0kxNgorICAgIHRvRW51bSA4ICA9IFRfSTMyCisgICAgdG9FbnVtIDEwID0gVF9JNjQKKyAgICB0b0VudW0gMTEgPSBUX1NUUklORworICAgIC0tIHRvRW51bSAxMSA9IFRfQklOQVJZCisgICAgdG9FbnVtIDEyID0gVF9TVFJVQ1QgTWFwLmVtcHR5CisgICAgdG9FbnVtIDEzID0gVF9NQVAgVF9WT0lEIFRfVk9JRAorICAgIHRvRW51bSAxNCA9IFRfU0VUIFRfVk9JRAorICAgIHRvRW51bSAxNSA9IFRfTElTVCBUX1ZPSUQKKyAgICB0b0VudW0gdCA9IGVycm9yICQgIkludmFsaWQgVGhyaWZ0VHlwZSAiICsrIHNob3cgdAorCitkYXRhIE1lc3NhZ2VUeXBlCisgICAgPSBNX0NBTEwKKyAgICB8IE1fUkVQTFkKKyAgICB8IE1fRVhDRVBUSU9OCisgICAgfCBNX09ORVdBWQorICAgICAgZGVyaXZpbmcgKCBFcSwgU2hvdyApCisKK2luc3RhbmNlIEVudW0gTWVzc2FnZVR5cGUgd2hlcmUKKyAgICBmcm9tRW51bSBNX0NBTEwgICAgICA9ICAxCisgICAgZnJvbUVudW0gTV9SRVBMWSAgICAgPSAgMgorICAgIGZyb21FbnVtIE1fRVhDRVBUSU9OID0gIDMKKyAgICBmcm9tRW51bSBNX09ORVdBWSAgICA9ICA0CisKKyAgICB0b0VudW0gMSA9IE1fQ0FMTAorICAgIHRvRW51bSAyID0gTV9SRVBMWQorICAgIHRvRW51bSAzID0gTV9FWENFUFRJT04KKyAgICB0b0VudW0gNCA9IE1fT05FV0FZCisgICAgdG9FbnVtIHQgPSBlcnJvciAkICJJbnZhbGlkIE1lc3NhZ2VUeXBlICIgKysgc2hvdyB0CisKK2luc3RhbmNlIEFyYml0cmFyeSBNZXNzYWdlVHlwZSB3aGVyZQorICBhcmJpdHJhcnkgPSBlbGVtZW50cyBbTV9DQUxMLCBNX1JFUExZLCBNX0VYQ0VQVElPTiwgTV9PTkVXQVldCmRpZmYgLS1naXQgYS9saWIvaHMvdGVzdC9CaW5hcnlTcGVjLmhzIGIvbGliL2hzL3Rlc3QvQmluYXJ5U3BlYy5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjkyZmFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3Rlc3QvQmluYXJ5U3BlYy5ocwpAQCAtMCwwICsxLDkxIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworbW9kdWxlIEJpbmFyeVNwZWMgd2hlcmUKKworaW1wb3J0IFRlc3QuSHNwZWMKK2ltcG9ydCBUZXN0LkhzcGVjLlF1aWNrQ2hlY2sgKHByb3ApCisKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5LkNoYXI4IGFzIEMKKworaW1wb3J0IFRocmlmdC5UeXBlcworaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0Lk1lbW9yeQoraW1wb3J0IFRocmlmdC5Qcm90b2NvbAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5CaW5hcnkKKworc3BlYyA6OiBTcGVjCitzcGVjID0gZG8KKyAgZGVzY3JpYmUgIkJpbmFyeVByb3RvY29sIiAkIGRvCisgICAgZGVzY3JpYmUgImRvdWJsZSIgJCBkbworICAgICAgaXQgIndyaXRlcyBpbiBiaWcgZW5kaWFuIG9yZGVyIiAkIGRvCisgICAgICAgIGxldCB2YWwgPSAyICoqIDUzCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQmluYXJ5UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFREb3VibGUgdmFsKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgOAorICAgICAgICAoTEJTLnVucGFjayBiaW4pIGBzaG91bGRCZWBbNjcsIDY0LCAwLCAwLCAwLCAwLCAwLCAwXQorCisgICAgICBpdCAicmVhZHMgaW4gYmlnIGVuZGlhbiBvcmRlciIgJCBkbworICAgICAgICBsZXQgYmluID0gTEJTLnBhY2sgWzY3LCA2NCwgMCwgMCwgMCwgMCwgMCwgMF0KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBCaW5hcnlQcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgYmluCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIFRfRE9VQkxFCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChURG91YmxlICQgMiAqKiA1MykKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQmluYXJ5UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gJCBURG91YmxlIHZhbAorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gVF9ET1VCTEUKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChURG91YmxlIHZhbCkKKworICAgIGRlc2NyaWJlICJzdHJpbmciICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMiICQgZG8KKyAgICAgICAgbGV0IHZhbCA9IEMucGFjayAiYWFhIgorICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEJpbmFyeVByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUU3RyaW5nIHZhbCkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDcKKyAgICAgICAgKExCUy51bnBhY2sgYmluKSBgc2hvdWxkQmVgIFswLCAwLCAwLCAzLCA5NywgOTcsIDk3XQorCisgICAgZGVzY3JpYmUgImJpbmFyeSIgJCBkbworICAgICAgaXQgIndyaXRlcyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEJpbmFyeVByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUQmluYXJ5ICQgTEJTLnBhY2sgWzQyLCA0MywgNDRdKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChMQlMudW5wYWNrIGJpbikgYHNob3VsZEJlYCBbMCwgMCwgMCwgMywgNDIsIDQzLCA0NF0KKworICAgICAgaXQgInJlYWRzIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQmluYXJ5UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zICQgTEJTLnBhY2sgWzAsIDAsIDAsIDMsIDQyLCA0MywgNDRdCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX0JJTkFSWSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRCaW5hcnkgJCBMQlMucGFjayBbNDIsIDQzLCA0NF0pCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEJpbmFyeVByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUQmluYXJ5ICQgTEJTLnBhY2sgdmFsKQorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gKFRfQklOQVJZKQorICAgICAgICB2YWwyIGBzaG91bGRCZWAgKFRCaW5hcnkgJCBMQlMucGFjayB2YWwpCisKZGlmZiAtLWdpdCBhL2xpYi9ocy90ZXN0L0NvbXBhY3RTcGVjLmhzIGIvbGliL2hzL3Rlc3QvQ29tcGFjdFNwZWMuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0MGU3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy90ZXN0L0NvbXBhY3RTcGVjLmhzCkBAIC0wLDAgKzEsODEgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCittb2R1bGUgQ29tcGFjdFNwZWMgd2hlcmUKKworaW1wb3J0IFRlc3QuSHNwZWMKK2ltcG9ydCBUZXN0LkhzcGVjLlF1aWNrQ2hlY2sgKHByb3ApCisKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCisKK2ltcG9ydCBUaHJpZnQuVHlwZXMKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5NZW1vcnkKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdAorCitzcGVjIDo6IFNwZWMKK3NwZWMgPSBkbworICBkZXNjcmliZSAiQ29tcGFjdFByb3RvY29sIiAkIGRvCisgICAgZGVzY3JpYmUgImRvdWJsZSIgJCBkbworICAgICAgaXQgIndyaXRlcyBpbiBsaXR0bGUgZW5kaWFuIG9yZGVyIiAkIGRvCisgICAgICAgIGxldCB2YWwgPSAyICoqIDUzCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQ29tcGFjdFByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChURG91YmxlIHZhbCkKKyAgICAgICAgYmluIDwtIHRSZWFkQWxsIHRyYW5zIDgKKyAgICAgICAgKExCUy51bnBhY2sgYmluKSBgc2hvdWxkQmVgWzAsIDAsIDAsIDAsIDAsIDAsIDY0LCA2N10KKworICAgICAgaXQgInJlYWRzIGluIGxpdHRsZSBlbmRpYW4gb3JkZXIiICQgZG8KKyAgICAgICAgbGV0IGJpbiA9IExCUy5wYWNrIFswLCAwLCAwLCAwLCAwLCAwLCA2NCwgNjddCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQ29tcGFjdFByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyBiaW4KKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gVF9ET1VCTEUKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFREb3VibGUgJCAyICoqIDUzKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBDb21wYWN0UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gJCBURG91YmxlIHZhbAorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gVF9ET1VCTEUKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChURG91YmxlIHZhbCkKKworICAgIGRlc2NyaWJlICJiaW5hcnkiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBDb21wYWN0UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRCaW5hcnkgJCBMQlMucGFjayBbNDIsIDQzLCA0NF0pCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKExCUy51bnBhY2sgYmluKSBgc2hvdWxkQmVgIFszLCA0MiwgNDMsIDQ0XQorCisgICAgICBpdCAicmVhZHMiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBDb21wYWN0UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zICQgTEJTLnBhY2sgWzMsIDQyLCA0MywgNDRdCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX0JJTkFSWSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRCaW5hcnkgJCBMQlMucGFjayBbNDIsIDQzLCA0NF0pCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IENvbXBhY3RQcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVEJpbmFyeSAkIExCUy5wYWNrIHZhbCkKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvIChUX0JJTkFSWSkKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChUQmluYXJ5ICQgTEJTLnBhY2sgdmFsKQorCmRpZmYgLS1naXQgYS9saWIvaHMvdGVzdC9KU09OU3BlYy5ocyBiL2xpYi9ocy90ZXN0L0pTT05TcGVjLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMmM4MjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvdGVzdC9KU09OU3BlYy5ocwpAQCAtMCwwICsxLDIyNSBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK21vZHVsZSBKU09OU3BlYyB3aGVyZQorCitpbXBvcnQgVGVzdC5Ic3BlYworaW1wb3J0IFRlc3QuSHNwZWMuUXVpY2tDaGVjayAocHJvcCkKKworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQ2hhcjggYXMgQworCitpbXBvcnQgVGhyaWZ0LlR5cGVzCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuTWVtb3J5CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sCitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkpTT04KKwordFN0cmluZyA6OiBbQ2hhcl0gLT4gVGhyaWZ0VmFsCit0U3RyaW5nID0gVFN0cmluZyAuIEMucGFjaworCitzcGVjIDo6IFNwZWMKK3NwZWMgPSBkbworICBkZXNjcmliZSAiSlNPTlByb3RvY29sIiAkIGRvCisgICAgZGVzY3JpYmUgImJvb2wiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMgdHJ1ZSBhcyAxIiAkIGRvCisgICAgICAgIGxldCB2YWwgPSBUcnVlCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUQm9vbCB2YWwpCisgICAgICAgIGJpbiA8LXRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgIFsnMSddCisKKyAgICAgIGl0ICJ3cml0ZXMgZmFsc2UgYXMgMCIgJCBkbworICAgICAgICBsZXQgdmFsID0gRmFsc2UKKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRCb29sIHZhbCkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgIFsnMCddCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAkIFRCb29sIHZhbAorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gVF9CT09MCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVEJvb2wgdmFsKQorCisgICAgZGVzY3JpYmUgInN0cmluZyIgJCBkbworICAgICAgaXQgIndyaXRlcyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVFN0cmluZyAkIEMucGFjayAiXCJhIikKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgICJcIlxcXCJhXCIiCisKKyAgICAgIGl0ICJyZWFkcyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgJCBDLnBhY2sgIlwiXFxcImFcIiIKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfU1RSSU5HKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVFN0cmluZyAkIEMucGFjayAiXCJhIikKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUU3RyaW5nICQgQy5wYWNrIHZhbCkKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvIChUX1NUUklORykKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChUU3RyaW5nICQgQy5wYWNrIHZhbCkKKworICAgIGRlc2NyaWJlICJiaW5hcnkiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMgd2l0aCBwYWRkaW5nIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUQmluYXJ5ICQgTEJTLnBhY2sgWzFdKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChDLnVucGFjayBiaW4pIGBzaG91bGRCZWAgIlwiQVE9PVwiIgorCisgICAgICBpdCAicmVhZHMgd2l0aCBwYWRkaW5nIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAkIEMucGFjayAiXCJBUT09XCIiCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX0JJTkFSWSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRCaW5hcnkgJCBMQlMucGFjayBbMV0pCisKKyAgICAgIGl0ICJyZWFkcyB3aXRob3V0IHBhZGRpbmciICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zICQgQy5wYWNrICJcIkFRXCIiCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX0JJTkFSWSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRCaW5hcnkgJCBMQlMucGFjayBbMV0pCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVEJpbmFyeSAkIExCUy5wYWNrIHZhbCkKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvIChUX0JJTkFSWSkKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChUQmluYXJ5ICQgTEJTLnBhY2sgdmFsKQorCisgICAgZGVzY3JpYmUgImxpc3QiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMgZW1wdHkgbGlzdCIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVExpc3QgVF9CWVRFIFtdKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChDLnVucGFjayBiaW4pIGBzaG91bGRCZWAgIltcImk4XCIsMF0iCisKKyAgICAgIGl0ICJyZWFkcyBlbXB0eSIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgKEMucGFjayAiW1wiaThcIiwwXSIpCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX0xJU1QgVF9CWVRFKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVExpc3QgVF9CWVRFIFtdKQorCisgICAgICBpdCAid3JpdGVzIHNpbmdsZSBlbGVtZW50IiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUTGlzdCBUX0JZVEUgW1RCeXRlIDBdKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChDLnVucGFjayBiaW4pIGBzaG91bGRCZWAgIltcImk4XCIsMSwwXSIKKworICAgICAgaXQgInJlYWRzIHNpbmdsZSBlbGVtZW50IiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAoQy5wYWNrICJbXCJpOFwiLDEsMF0iKQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9MSVNUIFRfQllURSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRMaXN0IFRfQllURSBbVEJ5dGUgMF0pCisKKyAgICAgIGl0ICJyZWFkcyBlbGVtZW50cyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgKEMucGFjayAiW1wiaThcIiwyLDQyLCA0M10iKQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9MSVNUIFRfQllURSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRMaXN0IFRfQllURSBbVEJ5dGUgNDIsIFRCeXRlIDQzXSkKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvICQgKFRMaXN0IFRfU1RSSU5HICQgbWFwIHRTdHJpbmcgdmFsKQorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gJCBUX0xJU1QgVF9TVFJJTkcKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChUTGlzdCBUX1NUUklORyAkIG1hcCB0U3RyaW5nIHZhbCkKKworICAgIGRlc2NyaWJlICJzZXQiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMgZW1wdHkiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRTZXQgVF9CWVRFIFtdKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChDLnVucGFjayBiaW4pIGBzaG91bGRCZWAgIltcImk4XCIsMF0iCisKKyAgICAgIGl0ICJyZWFkcyBlbXB0eSIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgKEMucGFjayAiW1wiaThcIiwwXSIpCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX1NFVCBUX0JZVEUpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUU2V0IFRfQllURSBbXSkKKworICAgICAgaXQgInJlYWRzIHNpbmdsZSBlbGVtZW50IiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAoQy5wYWNrICJbXCJpOFwiLDEsMF0iKQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9TRVQgVF9CWVRFKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVFNldCBUX0JZVEUgW1RCeXRlIDBdKQorCisgICAgICBpdCAicmVhZHMgZWxlbWVudHMiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIChDLnBhY2sgIltcImk4XCIsMiw0MiwgNDNdIikKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfU0VUIFRfQllURSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRTZXQgVF9CWVRFIFtUQnl0ZSA0MiwgVEJ5dGUgNDNdKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gJCAoVFNldCBUX1NUUklORyAkIG1hcCB0U3RyaW5nIHZhbCkKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvICQgVF9TRVQgVF9TVFJJTkcKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChUU2V0IFRfU1RSSU5HICQgbWFwIHRTdHJpbmcgdmFsKQorCisgICAgZGVzY3JpYmUgIm1hcCIgJCBkbworICAgICAgaXQgIndyaXRlcyBlbXB0eSIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVE1hcCBUX0JZVEUgVF9CWVRFIFtdKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChDLnVucGFjayBiaW4pIGBzaG91bGRCZWAiW1wiaThcIixcImk4XCIsMCx7fV0iCisKKyAgICAgIGl0ICJyZWFkcyBlbXB0eSIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgKEMucGFjayAiW1wiaThcIixcImk4XCIsMCx7fV0iKQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9NQVAgVF9CWVRFIFRfQllURSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRNYXAgVF9CWVRFIFRfQllURSBbXSkKKworICAgICAgaXQgInJlYWRzIHN0cmluZy1zdHJpbmciICQgZG8KKyAgICAgICAgbGV0IGJpbiA9ICJbXCJzdHJcIixcInN0clwiLDIse1wiYVwiOlwiMlwiLFwiYlwiOlwiYmxhaFwifV0iCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAoQy5wYWNrIGJpbikKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfTUFQIFRfU1RSSU5HIFRfU1RSSU5HKQorICAgICAgICB2YWxgc2hvdWxkQmVgIChUTWFwIFRfU1RSSU5HIFRfU1RSSU5HIFsodFN0cmluZyAiYSIsIHRTdHJpbmcgIjIiKSwgKHRTdHJpbmcgImIiLCB0U3RyaW5nICJibGFoIildKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gJCAoVE1hcCBUX1NUUklORyBUX1NUUklORyAkIG1hcCB0b0tWIHZhbCkKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvICQgVF9NQVAgVF9TVFJJTkcgVF9TVFJJTkcKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChUTWFwIFRfU1RSSU5HIFRfU1RSSU5HICQgbWFwIHRvS1YgdmFsKQorICAgICAgICB3aGVyZQorICAgICAgICAgIHRvS1YgdiA9ICh0U3RyaW5nIHYsIHRTdHJpbmcgdikKKwpkaWZmIC0tZ2l0IGEvbGliL2hzL3Rlc3QvU3BlYy5ocyBiL2xpYi9ocy90ZXN0L1NwZWMuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VjOWE5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy90ZXN0L1NwZWMuaHMKQEAgLTAsMCArMSwzOCBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKKy0tIE91ciBDSSBkb2VzIG5vdCB3b3JrIHdlbGwgd2l0aCBhdXRvIGRpc2NvdmVyLgorLS0gTmVlZCB0byBhZGQgYnVpbGQtdGltZSBQQVRIIHZhcmlhYmxlIHRvIGhzcGVjLWRpc2NvdmVyIGRpciBmcm9tIENNYWtlCistLSBvciBpbnN0YWxsIGhzcGVjIHN5c3RlbS13aWRlIGZvciB0aGUgZm9sbG93aW5nIHRvIHdvcmsuCistLSB7LSMgT1BUSU9OU19HSEMgLUYgLXBnbUYgaHNwZWMtZGlzY292ZXIgIy19CisKK2ltcG9ydCBUZXN0LkhzcGVjCisKK2ltcG9ydCBxdWFsaWZpZWQgQmluYXJ5U3BlYworaW1wb3J0IHF1YWxpZmllZCBDb21wYWN0U3BlYworaW1wb3J0IHF1YWxpZmllZCBKU09OU3BlYworCittYWluIDo6IElPICgpCittYWluID0gaHNwZWMgc3BlYworCitzcGVjIDo6IFNwZWMKK3NwZWMgPSBkbworICBkZXNjcmliZSAiQmluYXJ5IiBCaW5hcnlTcGVjLnNwZWMKKyAgZGVzY3JpYmUgIkNvbXBhY3QiIENvbXBhY3RTcGVjLnNwZWMKKyAgZGVzY3JpYmUgIkpTT04iIEpTT05TcGVjLnNwZWMKZGlmZiAtLWdpdCBhL2xpYi9ocy90aHJpZnQuY2FiYWwgYi9saWIvaHMvdGhyaWZ0LmNhYmFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MTU1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvdGhyaWZ0LmNhYmFsCkBAIC0wLDAgKzEsODQgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCitOYW1lOiAgICAgICAgICAgdGhyaWZ0CitWZXJzaW9uOiAgICAgICAgMS4wLjAKK0NhYmFsLVZlcnNpb246ICAxLjI0CitMaWNlbnNlOiAgICAgICAgT3RoZXJMaWNlbnNlCitDYXRlZ29yeTogICAgICAgRm9yZWlnbgorQnVpbGQtVHlwZTogICAgIFNpbXBsZQorU3lub3BzaXM6ICAgICAgIEhhc2tlbGwgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0KK0hvbWVwYWdlOiAgICAgICBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKK0J1Zy1SZXBvcnRzOiAgICBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVAorTWFpbnRhaW5lcjogICAgIGRldkB0aHJpZnQuYXBhY2hlLm9yZworTGljZW5zZS1GaWxlOiAgIExJQ0VOU0UKKworRGVzY3JpcHRpb246CisgIEhhc2tlbGwgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0uIFJlcXVpcmVzIHRoZSB1c2Ugb2YgdGhlIHRocmlmdCBjb2RlIGdlbmVyYXRvci4KKworZmxhZyBuZXR3b3JrLXVyaQorICAgZGVzY3JpcHRpb246IEdldCBOZXR3b3JrLlVSSSBmcm9tIHRoZSBuZXR3b3JrLXVyaSBwYWNrYWdlCisgICBkZWZhdWx0OiBUcnVlCisKK0xpYnJhcnkKKyAgSHMtU291cmNlLURpcnM6CisgICAgc3JjCisgIEJ1aWxkLURlcGVuZHM6CisgICAgYmFzZSA+PSA0LCBiYXNlIDwgNSwgY29udGFpbmVycywgZ2hjLXByaW0sIGF0dG9wYXJzZWMsIGJpbmFyeSwgYnl0ZXN0cmluZyA+PSAwLjEwLCBiYXNlNjQtYnl0ZXN0cmluZywgaGFzaGFibGUsIEhUVFAsIHRleHQsIGhzcGVjLWNvcmUgPiAyLjQuMCwgdW5vcmRlcmVkLWNvbnRhaW5lcnMgPj0gMC4yLjYsIHZlY3RvciA+PSAwLjEwLjEyLjIsIFF1aWNrQ2hlY2sgPj0gMi44LjIsIHNwbGl0CisgIGlmIGZsYWcobmV0d29yay11cmkpCisgICAgIGJ1aWxkLWRlcGVuZHM6IG5ldHdvcmstdXJpID49IDIuNiwgbmV0d29yayA+PSAyLjYKKyAgZWxzZQorICAgICBidWlsZC1kZXBlbmRzOiBuZXR3b3JrIDwgMi42CisgIEV4cG9zZWQtTW9kdWxlczoKKyAgICBUaHJpZnQsCisgICAgVGhyaWZ0LkFyYml0cmFyaWVzCisgICAgVGhyaWZ0LlByb3RvY29sLAorICAgIFRocmlmdC5Qcm90b2NvbC5IZWFkZXIsCisgICAgVGhyaWZ0LlByb3RvY29sLkJpbmFyeSwKKyAgICBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdCwKKyAgICBUaHJpZnQuUHJvdG9jb2wuSlNPTiwKKyAgICBUaHJpZnQuU2VydmVyLAorICAgIFRocmlmdC5UcmFuc3BvcnQsCisgICAgVGhyaWZ0LlRyYW5zcG9ydC5FbXB0eSwKKyAgICBUaHJpZnQuVHJhbnNwb3J0LkZyYW1lZCwKKyAgICBUaHJpZnQuVHJhbnNwb3J0LkhhbmRsZSwKKyAgICBUaHJpZnQuVHJhbnNwb3J0LkhlYWRlciwKKyAgICBUaHJpZnQuVHJhbnNwb3J0Lkh0dHBDbGllbnQsCisgICAgVGhyaWZ0LlRyYW5zcG9ydC5JT0J1ZmZlciwKKyAgICBUaHJpZnQuVHJhbnNwb3J0Lk1lbW9yeSwKKyAgICBUaHJpZnQuVHlwZXMKKyAgRGVmYXVsdC1MYW5ndWFnZTogSGFza2VsbDIwMTAKKyAgRGVmYXVsdC1FeHRlbnNpb25zOgorICAgIERlcml2ZURhdGFUeXBlYWJsZSwKKyAgICBFeGlzdGVudGlhbFF1YW50aWZpY2F0aW9uLAorICAgIEZsZXhpYmxlSW5zdGFuY2VzLAorICAgIEtpbmRTaWduYXR1cmVzLAorICAgIE1hZ2ljSGFzaCwKKyAgICBSYW5rTlR5cGVzLAorICAgIFJlY29yZFdpbGRDYXJkcywKKyAgICBTY29wZWRUeXBlVmFyaWFibGVzLAorICAgIFR5cGVTeW5vbnltSW5zdGFuY2VzCisKK1Rlc3QtU3VpdGUgc3BlYworICBUeXBlOiBleGl0Y29kZS1zdGRpby0xLjAKKyAgSHMtU291cmNlLURpcnM6IHRlc3QKKyAgR2hjLU9wdGlvbnM6IC1XYWxsCisgIG1haW4taXM6IFNwZWMuaHMKKyAgQnVpbGQtRGVwZW5kczogYmFzZSwgdGhyaWZ0LCBoc3BlYywgUXVpY2tDaGVjayA+PSAyLjguMiwgYnl0ZXN0cmluZyA+PSAwLjEwLCB1bm9yZGVyZWQtY29udGFpbmVycyA+PSAwLjIuNgorICBEZWZhdWx0LUxhbmd1YWdlOiBIYXNrZWxsMjAxMApkaWZmIC0tZ2l0IGEvbGliL2phdmEvQ01ha2VMaXN0cy50eHQgYi9saWIvamF2YS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjA2NGU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw4NyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2lmKEFORFJPSUQpCisgICAgc2V0KFRIUklGVF9BQVIgb3V0cHV0cy9hYXIvdGhyaWZ0LWRlYnVnLmFhciBvdXRwdXRzL2Fhci90aHJpZnQtcmVsZWFzZS5hYXIpCisgICAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgICAgICBPVVRQVVQgJHtUSFJJRlRfQUFSfQorICAgICAgICBDT01NQU5EICR7R1JBRExFX0VYRUNVVEFCTEV9CisgICAgICAgICAgICAtcCAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2FuZHJvaWQiCisgICAgICAgICAgICAiLVBidWlsZERpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYW5kcm9pZC9idWlsZCIgYXNzZW1ibGUKKyAgICApCisgICAgYWRkX2N1c3RvbV90YXJnZXQodGhyaWZ0X2FhciBBTEwgREVQRU5EUyAke1RIUklGVF9BQVJ9KQorCitlbHNlKEFORFJPSUQpCisKKyAgICBpZihJU19BQlNPTFVURSAiJHtMSUJfSU5TVEFMTF9ESVJ9IikKKyAgICAgICAgc2V0KEpBVkFfSU5TVEFMTF9ESVIgIiR7TElCX0lOU1RBTExfRElSfS9qYXZhIikKKyAgICBlbHNlKCkKKyAgICAgICAgc2V0KEpBVkFfSU5TVEFMTF9ESVIgIiR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9LyR7TElCX0lOU1RBTExfRElSfS9qYXZhIikKKyAgICBlbmRpZigpCisKKyAgICBpZihJU19BQlNPTFVURSAiJHtET0NfSU5TVEFMTF9ESVJ9IikKKyAgICAgICAgc2V0KEpBVkFfRE9DX0lOU1RBTExfRElSICIke0RPQ19JTlNUQUxMX0RJUn0vamF2YSIpCisgICAgZWxzZSgpCisgICAgICAgIHNldChKQVZBX0RPQ19JTlNUQUxMX0RJUiAiJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vJHtET0NfSU5TVEFMTF9ESVJ9L2phdmEiKQorICAgIGVuZGlmKCkKKworICAgIGFkZF9jdXN0b21fdGFyZ2V0KFRocmlmdEphdmEgQUxMCisgICAgICAgIENPTU1FTlQgIkJ1aWxkaW5nIEphdmEgbGlicmFyeSB1c2luZyBHcmFkbGUgV3JhcHBlciIKKyAgICAgICAgQ09NTUFORCAke0dSQURMRVdfRVhFQ1VUQUJMRX0gJHtHUkFETEVfT1BUU30gYXNzZW1ibGUKKyAgICAgICAgICAgIC0tY29uc29sZT1wbGFpbiAtLW5vLWRhZW1vbgorICAgICAgICAgICAgLVByZWxlYXNlPXRydWUKKyAgICAgICAgICAgIC1QdGhyaWZ0LnZlcnNpb249JHt0aHJpZnRfVkVSU0lPTn0KKyAgICAgICAgICAgICItUGJ1aWxkLmRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYnVpbGQiCisgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQorICAgICkKKworICAgICMgRW5hYmxlIHB1Ymxpc2hpbmcgZnJvbSBDTWFrZSBpZiB0aGUgcHVibGlzaGluZyBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZAorICAgIGFkZF9jdXN0b21fdGFyZ2V0KE1hdmVuUHVibGlzaAorICAgICAgICBDT01NRU5UICJQdWJsaXNoaW5nIEphdmEgTGlicmFyeSB0byBBcGFjaGUgTWF2ZW4gc3RhZ2luZyIKKyAgICAgICAgQ09NTUFORCAke0dSQURMRVdfRVhFQ1VUQUJMRX0gJHtHUkFETEVfT1BUU30gY2xlYW4gdXBsb2FkQXJjaGl2ZXMKKyAgICAgICAgICAgIC0tY29uc29sZT1wbGFpbiAtLW5vLWRhZW1vbgorICAgICAgICAgICAgLVByZWxlYXNlPXRydWUKKyAgICAgICAgICAgIC1QdGhyaWZ0LnZlcnNpb249JHt0aHJpZnRfVkVSU0lPTn0KKyAgICAgICAgICAgICItUGJ1aWxkLmRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYnVpbGQiCisgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQorICAgICkKKworICAgICMgSG9vayB0aGUgQ01ha2UgaW5zdGFsbCBwcm9jZXNzIHRvIHRoZSByZXN1bHRzIGZyb20gbWFrZSBBTEwuCisgICAgIyBUaGlzIHdvcmtzIGJlc3Qgd2hlbiAnbWFrZSBhbGwgJiYgc3VkbyBtYWtlIGluc3RhbGwvZmFzdCcgaXMgdXNlZC4KKyAgICAjIFVzaW5nIHNsYXNoIHRvIGVuZCB0aGUgc291cmNlIGxvY2F0aW9uIHRvIGF2b2lkIGNvcHlpbmcgdGhlIGRpcmVjdG9yeSBwYXRoLgorICAgIGluc3RhbGwoRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9idWlsZC9saWJzLworICAgICAgICAgICAgREVTVElOQVRJT04gJHtKQVZBX0lOU1RBTExfRElSfQorICAgICAgICAgICAgRklMRVNfTUFUQ0hJTkcgUEFUVEVSTiAibGlidGhyaWZ0LSR7dGhyaWZ0X1ZFUlNJT059LmphciIpCisgICAgaW5zdGFsbChESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2J1aWxkL2RlcHMvCisgICAgICAgICAgICBERVNUSU5BVElPTiAke0pBVkFfSU5TVEFMTF9ESVJ9CisgICAgICAgICAgICBGSUxFU19NQVRDSElORyBQQVRURVJOICIqLmphciIpCisgICAgaW5zdGFsbChESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2J1aWxkL2RvY3MvamF2YWRvYy8KKyAgICAgICAgICAgIERFU1RJTkFUSU9OICR7SkFWQV9ET0NfSU5TVEFMTF9ESVJ9KQorCisgICAgaWYoQlVJTERfVEVTVElORykKKyAgICAgICAgYWRkX3Rlc3QoTkFNRSBKYXZhVGVzdAorICAgICAgICAgICAgICAgIENPTU1BTkQgJHtHUkFETEVXX0VYRUNVVEFCTEV9ICR7R1JBRExFX09QVFN9IHRlc3QKKyAgICAgICAgICAgICAgICAgICAgLS1jb25zb2xlPXBsYWluIC0tbm8tZGFlbW9uCisgICAgICAgICAgICAgICAgICAgIC1QcmVsZWFzZT10cnVlCisgICAgICAgICAgICAgICAgICAgIC1QdGhyaWZ0LnZlcnNpb249JHt0aHJpZnRfVkVSU0lPTn0KKyAgICAgICAgICAgICAgICAgICAgIi1QYnVpbGQuZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9idWlsZCIKKyAgICAgICAgICAgICAgICAgICAgIi1QdGhyaWZ0LmNvbXBpbGVyPSR7VEhSSUZUX0NPTVBJTEVSfSIKKyAgICAgICAgICAgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCisgICAgZW5kaWYoKQorZW5kaWYoQU5EUk9JRCkKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL01ha2VmaWxlLmFtIGIvbGliL2phdmEvTWFrZWZpbGUuYW0KaW5kZXggZWEwMTk3OC4uNjU5ODFjYSAxMDA2NDQKLS0tIGEvbGliL2phdmEvTWFrZWZpbGUuYW0KKysrIGIvbGliL2phdmEvTWFrZWZpbGUuYW0KQEAgLTE3LDIyICsxNyw1NiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotRVhUUkFfRElTVCA9IGJ1aWxkLnhtbCBidWlsZC5wcm9wZXJ0aWVzIHNyYyB0ZXN0Ci0KIGV4cG9ydCBDTEFTU1BBVEgKIAogYWxsLWxvY2FsOgotCSQoQU5UKSAkKEFOVF9GTEFHUykKKwkuL2dyYWRsZXcgJChHUkFETEVfT1BUUykgYXNzZW1ibGUgXAorCQktUHJlbGVhc2U9dHJ1ZSBcCisJCS1QdGhyaWZ0LnZlcnNpb249JChQQUNLQUdFX1ZFUlNJT04pIFwKKwkJLS1jb25zb2xlPXBsYWluCiAKIGluc3RhbGwtZXhlYy1ob29rOgotCSQoQU5UKSAkKEFOVF9GTEFHUykgaW5zdGFsbCAtRGluc3RhbGwucGF0aD0kKERFU1RESVIpJChKQVZBX1BSRUZJWCkgXAotCQktRGluc3RhbGwuamF2YWRvYy5wYXRoPSQoREVTVERJUikkKGRvY2RpcikvamF2YQorCS4vZ3JhZGxldyAkKEdSQURMRV9PUFRTKSBpbnN0YWxsIFwKKwkJLVByZWxlYXNlPXRydWUgXAorCQktUGluc3RhbGwucGF0aD0kKERFU1RESVIpJChKQVZBX1BSRUZJWCkgXAorCQktUGluc3RhbGwuamF2YWRvYy5wYXRoPSQoREVTVERJUikkKGRvY2RpcikvamF2YSBcCisJCS1QdGhyaWZ0LnZlcnNpb249JChQQUNLQUdFX1ZFUlNJT04pIFwKKwkJLS1jb25zb2xlPXBsYWluCiAKLSMgTWFrZSBzdXJlIHRoaXMgZG9lc24ndCBmYWlsIGlmIGFudCBpcyBub3QgY29uZmlndXJlZC4KIGNsZWFuLWxvY2FsOgotCUFOVD0kKEFOVCkgOyBpZiB0ZXN0IC16ICIkJEFOVCIgOyB0aGVuIEFOVD06IDsgZmkgOyBcCi0JJCRBTlQgJChBTlRfRkxBR1MpIGNsZWFuCisJLi9ncmFkbGV3ICQoR1JBRExFX09QVFMpIGNsZWFuIC0tY29uc29sZT1wbGFpbgogCi1jaGVjay1sb2NhbDogYWxsCi0JJChBTlQpICQoQU5UX0ZMQUdTKSB0ZXN0CitwcmVjcm9zczogJChUSFJJRlQpCisJLi9ncmFkbGV3ICQoR1JBRExFX09QVFMpIHNoYWRvd0phciBcCisJCS1QcmVsZWFzZT10cnVlIFwKKwkJLVB0aHJpZnQudmVyc2lvbj0kKFBBQ0tBR0VfVkVSU0lPTikgXAorCQktUHRocmlmdC5jb21waWxlcj0kKFRIUklGVCkgXAorCQktLWNvbnNvbGU9cGxhaW4KIAorY2hlY2stbG9jYWw6ICQoVEhSSUZUKQorCS4vZ3JhZGxldyAkKEdSQURMRV9PUFRTKSB0ZXN0IFwKKwkJLVByZWxlYXNlPXRydWUgXAorCQktUHRocmlmdC52ZXJzaW9uPSQoUEFDS0FHRV9WRVJTSU9OKSBcCisJCS1QdGhyaWZ0LmNvbXBpbGVyPSQoVEhSSUZUKSBcCisJCS0tY29uc29sZT1wbGFpbgorCittYXZlbi1wdWJsaXNoOgorCS4vZ3JhZGxldyAkKEdSQURMRV9PUFRTKSB1cGxvYWRBcmNoaXZlcyBcCisJCS1QcmVsZWFzZT10cnVlIFwKKwkJLVB0aHJpZnQudmVyc2lvbj0kKFBBQ0tBR0VfVkVSU0lPTikgXAorCQktLWNvbnNvbGU9cGxhaW4KKworRVhUUkFfRElTVCA9IFwKKwlidWlsZC5ncmFkbGUgXAorCWdyYWRsZS5wcm9wZXJ0aWVzIFwKKwlzZXR0aW5ncy5ncmFkbGUgXAorCWdyYWRsZSBcCisJZ3JhZGxldyBcCisJZ3JhZGxldy5iYXQgXAorCUNNYWtlTGlzdHMudHh0IFwKKwljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKKwlhbmRyb2lkIFwKKwlzcmMgXAorCXRlc3QgXAorCWNvZGVfcXVhbGl0eV90b29scyBcCisJUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9saWIvamF2YS9SRUFETUUgYi9saWIvamF2YS9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOGQzNTEuLjAwMDAwMDAKLS0tIGEvbGliL2phdmEvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotVGhyaWZ0IEphdmEgU29mdHdhcmUgTGlicmFyeQotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1Vc2luZyBUaHJpZnQgd2l0aCBKYXZhCi09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoZSBUaHJpZnQgSmF2YSBzb3VyY2UgaXMgbm90IGJ1aWxkIHVzaW5nIHRoZSBHTlUgdG9vbHMsIGJ1dCByYXRoZXIgdXNlcwotdGhlIEFwYWNoZSBBbnQgYnVpbGQgc3lzdGVtLCB3aGljaCB0ZW5kcyB0byBiZSBwcmVkb21pbmFudCBhbW9uZ3N0IEphdmEKLWRldmVsb3BlcnMuCi0KLVRvIGNvbXBpbGUgdGhlIEphdmEgVGhyaWZ0IGxpYnJhcmllcywgc2ltcGx5IGRvIHRoZSBmb2xsb3dpbmc6Ci0KLWFudAotCi1ZZXAsIHRoYXQncyBlYXN5LiBMb29rIGZvciBsaWJ0aHJpZnQuamFyIGluIHRoZSBiYXNlIGRpcmVjdG9yeS4KLQotVG8gaW5jbHVkZSBUaHJpZnQgaW4geW91ciBhcHBsaWNhdGlvbnMgc2ltcGx5IGFkZCBsaWJ0aHJpZnQuamFyIHRvIHlvdXIKLWNsYXNzcGF0aCwgb3IgaW5zdGFsbCBpZiBpbiB5b3VyIGRlZmF1bHQgc3lzdGVtIGNsYXNzcGF0aCBvZiBjaG9pY2UuCi0KLURlcGVuZGVuY2llcwotPT09PT09PT09PT09Ci0KLUFwYWNoZSBBbnQKLWh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL1JFQURNRS5tZCBiL2xpYi9qYXZhL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjVmMGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTc2IEBACitUaHJpZnQgSmF2YSBTb2Z0d2FyZSBMaWJyYXJ5CisKK0xpY2Vuc2UKKz09PT09PT0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKK0J1aWxkaW5nIGFuZCBpbnN0YWxsaW5nIGZyb20gc291cmNlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXaGVuIHVzaW5nIGEgQ01ha2UgYnVpbGQgZnJvbSB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBvbiBMaW51eCB0aGUKK2Vhc2llc3Qgd2F5IHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGlzIHRoaXMgc2ltcGxlIGNvbW1hbmQgbGluZToKKworICAgIG1ha2UgYWxsICYmIHN1ZG8gbWFrZSBpbnN0YWxsL2Zhc3QKKworSXQgaXMgaW1wb3J0YW50IHRvIHVzZSB0aGUgaW5zdGFsbC9mYXN0IG9wdGlvbiB0byBlbGltaW5hdGUKK3RoZSBhdXRvbWF0aWMgcmVidWlsZCBieSBkZXBlbmRlbmN5IHRoYXQgY2F1c2VzIGlzc3VlcyBiZWNhdXNlCit0aGUgYnVpbGQgdG9vbGluZyBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggY2FjaGVkIGZpbGVzIGluIHRoZQordXNlciBob21lIGRpcmVjdG9yeSBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MuIEluc3RlYWQgdGhpcyBidWlsZHMKK3RoZSBjb2RlIGluIHRoZSBleHBlY3RlZCBsb2NhbCBidWlsZCB0cmVlIGFuZCB0aGVuIHVzZXMgQ01ha2UKK2luc3RhbGwgY29kZSB0byBjb3B5IHRvIHRoZSB0YXJnZXQgZGVzdGluYXRpb24uCisKK0J1aWxkaW5nIFRocmlmdCB3aXRoIEdyYWRsZSB3aXRob3V0IENNYWtlL0F1dG9jb25mCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgVGhyaWZ0IEphdmEgc291cmNlIGlzIG5vdCBidWlsZCB1c2luZyB0aGUgR05VIHRvb2xzLCBidXQgcmF0aGVyIHVzZXMKK3RoZSBHcmFkbGUgYnVpbGQgc3lzdGVtLCB3aGljaCB0ZW5kcyB0byBiZSBwcmVkb21pbmFudCBhbW9uZ3N0IEphdmEKK2RldmVsb3BlcnMuCisKK1RvIGNvbXBpbGUgdGhlIEphdmEgVGhyaWZ0IGxpYnJhcmllcywgc2ltcGx5IGRvIHRoZSBmb2xsb3dpbmc6CisKKyAgICAuL2dyYWRsZXcKKworWWVwLCB0aGF0J3MgZWFzeS4gTG9vayBmb3IgbGlidGhyaWZ0LTx2ZXJzaW9uPi5qYXIgaW4gdGhlIGJ1aWxkL2xpYnMgZGlyZWN0b3J5LgorCitUaGUgZGVmYXVsdCBidWlsZCB3aWxsIHJ1biB0aGUgdW5pdCB0ZXN0cyB3aGljaCBleHBlY3QgYSB1c2FibGUKK1RocmlmdCBjb21waWxlciB0byBleGlzdCBvbiB0aGUgc3lzdGVtLiBZb3UgaGF2ZSB0d28gY2hvaWNlcyBmb3IKK3RoYXQuCisKKyogQnVpbGQgdGhlIFRocmlmdCBleGVjdXRhYmxlIGZyb20gc291cmNlIGF0IHRoZSBkZWZhdWx0CisgIGxvY2F0aW9uIGluIHRoZSBzb3VyY2UgdHJlZS4gVGhlIHByb2plY3QgaXMgY29uZmlndXJlZAorICB0byBsb29rIGZvciBpdCB0aGVyZS4KKyogSW5zdGFsbCB0aGUgcHVibGlzaGVkIGJpbmFyeSBkaXN0cmlidXRpb24gdG8gaGF2ZSBUaHJpZnQKKyAgZXhlY3V0YWJsZSBpbiBhIGtub3duIGxvY2F0aW9uIGFuZCBhZGQgdGhlIHBhdGggdG8gdGhlCisgIH4vLmdyYWRsZS9ncmFkbGUucHJvcGVydGllcyBmaWxlIHVzaW5nIHRoZSBwcm9wZXJ0eSBuYW1lCisgICJ0aHJpZnQuY29tcGlsZXIiLiBGb3IgZXhhbXBsZSB0aGlzIHdvdWxkIHNldCB0aGUgcGF0aCBpbgorICBhIFdpbmRvd3MgYm94IGlmIFRocmlmdCB3YXMgaW5zdGFsbGVkIHVuZGVyIEM6XFRocmlmdAorCisgICAgdGhyaWZ0LmNvbXBpbGVyPUM6L1RocmlmdC90aHJpZnQuZXhlCisKK1RvIGp1c3QgYnVpbGQgdGhlIGxpYnJhcnkgd2l0aG91dCBydW5uaW5nIHVuaXQgdGVzdHMgeW91IHNpbXBseSBkbyB0aGlzLgorCisgICAgLi9ncmFkbGV3IGFzc2VtYmxlCisKK1RvIGluc3RhbGwgdGhlIGxpYnJhcnkgaW4gdGhlIGxvY2FsIE1hdmVuIHJlcG9zaXRvcnkgbG9jYXRpb24KK3doZXJlIG90aGVyIE1hdmVuIG9yIEdyYWRsZSBidWlsZHMgY2FuIHJlZmVyZW5jZSBpdCBzaW1wbHkgZG8gdGhpcy4KKworICAgIC4vZ3JhZGxldyBpbnN0YWxsCisKK1RoZSBsaWJyYXJ5IHdpbGwgYmUgcGxhY2VkIGluIHlvdXIgaG9tZSBkaXJlY3RvcnkgdW5kZXIgLm0yL3JlcG9zaXRvcnkKKworVG8gaW5jbHVkZSBUaHJpZnQgaW4geW91ciBhcHBsaWNhdGlvbnMgc2ltcGx5IGFkZCBsaWJ0aHJpZnQuamFyIHRvIHlvdXIKK2NsYXNzcGF0aCwgb3IgaW5zdGFsbCBpZiBpbiB5b3VyIGRlZmF1bHQgc3lzdGVtIGNsYXNzcGF0aCBvZiBjaG9pY2UuCisKKworQnVpbGQgVGhyaWZ0IGJlaGluZCBhIHByb3h5OgorCisgICAgLi9ncmFkbGV3IC1EaHR0cC5wcm94eUhvc3Q9bXlwcm94eWhvc3QgLURodHRwLnByb3h5UG9ydD04MDgwIC1EaHR0cC5wcm94eVVzZXI9dGhyaWZ0dXNlciAtRGh0dHAucHJveHlQYXNzd29yZD10b3BzZWNyZXQKKworb3IgdmlhCisKKyAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtamF2YSBHUkFETEVfT1BUUz0nLURodHRwLnByb3h5SG9zdD1teXByb3h5aG9zdCAtRGh0dHAucHJveHlQb3J0PTgwODAgLURodHRwLnByb3h5VXNlcj10aHJpZnR1c2VyIC1EaHR0cC5wcm94eVBhc3N3b3JkPXRvcHNlY3JldCcKKworCitVbml0IFRlc3QgSFRNTCBSZXBvcnRzCis9PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBidWlsZCB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYW4gSFRNTCBVbml0IFRlc3QgcmVwb3J0LiBUaGlzIGNhbiBiZSBmb3VuZAordW5kZXIgYnVpbGQvcmVwb3J0cy90ZXN0cy90ZXN0L2luZGV4Lmh0bWwuIEl0IGNhbiBiZSB2aWV3ZWQgd2l0aCBhIGJyb3dzZXIKK2RpcmVjdGx5IGZyb20gdGhhdCBsb2NhdGlvbi4KKworCitDbG92ZXIgQ29kZSBDb3ZlcmFnZSBmb3IgVGhyaWZ0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBidWlsZCB3aWxsIG9wdGlvbmFsbHkgZ2VuZXJhdGUgQ2xvdmVyIENvZGUgY292ZXJhZ2UgaWYgdGhlIEdyYWRsZSBwcm9wZXJ0eQorYGNsb3ZlckVuYWJsZWQ9dHJ1ZWAgaXMgc2V0IGluIH4vLmdyYWRsZS9ncmFkbGUucHJvcGVydGllcyBvciBvbiB0aGUgY29tbWFuZCBsaW5lCit2aWEgYC1QY2xvdmVyRW5hYmxlZD10cnVlYC4gVGhlIGdlbmVyYXRlZCByZXBvcnQgY2FuIGJlIGZvdW5kIHVuZGVyIHRoZSBsb2NhdGlvbgorYnVpbGQvcmVwb3J0cy9jbG92ZXIvaHRtbC9pbmRleC5odG1sLiBJdCBjYW4gYmUgdmlld2VkIHdpdGggYSBicm93c2VyCitkaXJlY3RseSBmcm9tIHRoYXQgbG9jYXRpb24uIEFkZGl0aW9uYWxseSwgYSBQREYgcmVwb3J0IGlzIGdlbmVyYXRlZCBhbmQgaXMgZm91bmQKK3VuZGVyIHRoZSBsb2NhdGlvbiBidWlsZC9yZXBvcnRzL2Nsb3Zlci9jbG92ZXIucGRmLgorCitUaGUgZm9sbG93aW5nIGNvbW1hbmQgd2lsbCBidWlsZCwgdW5pdCB0ZXN0LCBhbmQgZ2VuZXJhdGUgQ2xvdmVyIHJlcG9ydHM6CisKKyAgICAuL2dyYWRsZXcgLVBjbG92ZXJFbmFibGVkPXRydWUKKworCitQdWJsaXNoaW5nIE1hdmVuIEFydGlmYWN0cyB0byBNYXZlbiBDZW50cmFsCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBBdXRvbWFrZSBidWlsZCBnZW5lcmF0ZXMgYSBNYWtlZmlsZSB0aGF0IHByb3ZpZGVzIHRoZSBjb3JyZWN0IHBhcmFtZXRlcnMKK3doZW4geW91IHJ1biB0aGUgYnVpbGQgcHJvdmlkZWQgdGhlIGNvbmZpZ3VyZS5hYyBoYXMgYmVlbiBzZXQgd2l0aCB0aGUgY29ycmVjdAordmVyc2lvbiBudW1iZXIuIFRoZSBHcmFkbGUgYnVpbGQgd2lsbCByZWNlaXZlIHRoZSBjb3JyZWN0IHZhbHVlIGZvciB0aGUgYnVpbGQuCitUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSBDTWFrZSBidWlsZCwgdGhlIHZhbHVlIGZyb20gdGhlIGNvbmZpZ3VyZS5hYyBmaWxlIHdpbGwKK2JlIHVzZWQgaWYgeW91IGV4ZWN1dGUgdGhlc2UgY29tbWFuZHM6CisKKyAgICBtYWtlIG1hdmVuLXB1Ymxpc2ggICAtLSBUaGlzIGlzIGZvciBhbiBBdXRvbWFrZSBMaW51eCBidWlsZAorICAgIG1ha2UgTWF2ZW5QdWJsaXNoICAgIC0tIFRoaXMgaXMgZm9yIGEgQ01ha2UgZ2VuZXJhdGVkIGJ1aWxkCisKK1RoZSB1cGxvYWRBcmNoaXZlcyB0YXNrIGluIEdyYWRsZSBpcyBwcmVjb25maWd1cmVkIHdpdGggYWxsIG5lY2Vzc2FyeSBkZXRhaWxzCit0byBzaWduIGFuZCBwdWJsaXNoIHRoZSBhcnRpZmFjdHMgZnJvbSB0aGUgYnVpbGQgdG8gdGhlIEFwYWNoZSBNYXZlbiBzdGFnaW5nCityZXBvc2l0b3J5LiBUaGUgdGFzayByZXF1aXJlcyB0aGUgZm9sbG93aW5nIGV4dGVybmFsbHkgcHJvdmlkZWQgcHJvcGVydGllcyB0bworYXV0aGVudGljYXRlIHRvIHRoZSByZXBvc2l0b3J5IGFuZCBzaWduIHRoZSBhcnRpZmFjdHMuIFRoZSBwcmVmZXJyZWQgYXBwcm9hY2gKK2lzIHRvIGNyZWF0ZSBvciBlZGl0IHRoZSB+Ly5ncmFkbGUvZ3JhZGxlLnByb3BlcnRpZXMgZmlsZSBhbmQgYWRkIHRoZSBmb2xsb3dpbmcKK3Byb3BlcnRpZXMgdG8gaXQuCisKKyAgICAjIFNpZ25pbmcga2V5IGluZm9ybWF0aW9uIGZvciBhcnRpZmFjdHMgUEdQIHNpZ25hdHVyZSAodmFsdWVzIGFyZSBleGFtcGxlcykKKyAgICBzaWduaW5nLmtleUlkPTI0ODc1RDczCisgICAgc2lnbmluZy5wYXNzd29yZD1zZWNyZXQKKyAgICBzaWduaW5nLnNlY3JldEtleVJpbmdGaWxlPS9Vc2Vycy9tZS8uZ251cGcvc2VjcmluZy5ncGcKKworICAgICMgQXBhY2hlIE1hdmVuIHN0YWdpbmcgcmVwb3NpdG9yeSB1c2VyIGNyZWRlbnRpYWxzCisgICAgbWF2ZW5Vc2VyPW1lTXlzZWxmQW5kSQorICAgIG1hdmVuUGFzc3dvcmQ9TXlTdXBlckF3ZXNvbWVTZWNyZXRQYXNzd29yZAorCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIG1hbnVhbGx5IHB1Ymxpc2ggdXNpbmcgdGhlIEdyYWRsZSBidWlsZCBkaXJlY3RseS4KK1dpdGggdGhlIGtleSBpbmZvcm1hdGlvbiBhbmQgY3JlZGVudGlhbHMgaW4gcGxhY2UgdGhlIGZvbGxvd2luZyB3aWxsIGdlbmVyYXRlCitpZiBuZWVkZWQgdGhlIGJ1aWxkIGFydGlmYWN0cyBhbmQgcHJvY2VlZCB0byBwdWJsaXNoIHRoZSByZXN1bHRzLgorCisgICAgLi9ncmFkbGV3IC1QcmVsZWFzZT10cnVlIC1QdGhyaWZ0LnZlcnNpb249MC4xMS4wIHVwbG9hZEFyY2hpdmVzCisKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gb3ZlcnJpZGUgdGhlIHRhcmdldCByZXBvc2l0b3J5IGZvciB0aGUgTWF2ZW4gUHVibGljYXRpb24KK2J5IHVzaW5nIGEgR3JhZGxlIHByb3BlcnR5LCBmb3IgZXhhbXBsZSB5b3UgY2FuIHB1Ymxpc2ggc2lnbmVkIEpBUiBmaWxlcyB0byB5b3VyCitjb21wYW55IGludGVybmFsIHNlcnZlciBpZiB5b3UgYWRkIHRoaXMgdG8gdGhlIGNvbW1hbmQgbGluZSBvciBpbiB0aGUKK34vLmdyYWRsZS9ncmFkbGUucHJvcGVydGllcyBmaWxlLiBUaGUgVVJMIGJlbG93IGFzc3VtZXMgYSBOZXh1cyBSZXBvc2l0b3J5LgorCisgICAgbWF2ZW4tcmVwb3NpdG9yeS11cmw9aHR0cHM6Ly9teS5jb21wYW55LmNvbS9zZXJ2aWNlL2xvY2FsL3N0YWdpbmcvZGVwbG95L21hdmVuMgorCitPciB0aGUgc2FtZSBvbiB0aGUgY29tbWFuZCBsaW5lOgorCisgICAgLi9ncmFkbGV3IC1QbWF2ZW4tcmVwb3NpdG9yeS11cmw9aHR0cHM6Ly9teS5jb21wYW55LmNvbS9zZXJ2aWNlL2xvY2FsL3N0YWdpbmcvZGVwbG95L21hdmVuMiAtUHJlbGVhc2U9dHJ1ZSAtUHRocmlmdC52ZXJzaW9uPTAuMTEuMCB1cGxvYWRBcmNoaXZlcworCisKK0RlcGVuZGVuY2llcworPT09PT09PT09PT09CisKK0dyYWRsZQoraHR0cDovL2dyYWRsZS5vcmcvCisKKyMgQnJlYWtpbmcgQ2hhbmdlcworCisjIyAwLjEyLjAKKworVGhlIGFjY2VzcyBtb2RpZmllciBvZiB0aGUgQXV0b0V4cGFuZGluZ0J1ZmZlciBjbGFzcyBoYXMgYmVlbiBjaGFuZ2VkIGZyb20KK3B1YmxpYyB0byBkZWZhdWx0IChwYWNrYWdlKSBhbmQgd2lsbCBubyBsb25nZXIgYmUgYWNjZXNzaWJsZSBieSB0aGlyZC1wYXJ0eQorbGlicmFyaWVzLgorCitUaGUgYWNjZXNzIG1vZGlmaWVyIG9mIHRoZSBTaG9ydFN0YWNrIGNsYXNzIGhhcyBiZWVuIGNoYW5nZWQgZnJvbQorcHVibGljIHRvIGRlZmF1bHQgKHBhY2thZ2UpIGFuZCB3aWxsIG5vIGxvbmdlciBiZSBhY2Nlc3NpYmxlIGJ5IHRoaXJkLXBhcnR5CitsaWJyYXJpZXMuCisKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2FuZHJvaWQvYnVpbGQuZ3JhZGxlIGIvbGliL2phdmEvYW5kcm9pZC9idWlsZC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk5ODQyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2FuZHJvaWQvYnVpbGQuZ3JhZGxlCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworYXBwbHkgcGx1Z2luOiAnY29tLmFuZHJvaWQubGlicmFyeScKKworYW5kcm9pZCB7CisgICAgY29tcGlsZVNka1ZlcnNpb24gMjMKKyAgICBidWlsZFRvb2xzVmVyc2lvbiAiMjMuMC4xIgorICAgIHVzZUxpYnJhcnkgJ29yZy5hcGFjaGUuaHR0cC5sZWdhY3knCisgICAgc291cmNlU2V0cy5tYWluLmphdmEgeworICAgICAgICBzcmNEaXIgJy4uL3NyYycKKyAgICAgICAgZXhjbHVkZSAnb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsQ2xpZW50VHJhbnNwb3J0LmphdmEnCisgICAgICAgIGV4Y2x1ZGUgJ29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFNlcnZlclRyYW5zcG9ydC5qYXZhJworICAgICAgICBleGNsdWRlICdvcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnQuamF2YScKKyAgICB9Cit9CisKK3JlcG9zaXRvcmllcyB7CisgICAgbWF2ZW5DZW50cmFsKCkKK30KK2RlcGVuZGVuY2llcyB7CisgICAgY29tcGlsZSAnb3JnLnNsZjRqOnNsZjRqLWFwaToxLjcuMTMnCisgICAgY29tcGlsZSAnamF2YXguc2VydmxldDpzZXJ2bGV0LWFwaToyLjUnCisgICAgY29tcGlsZSAnb3JnLmFwYWNoZS5odHRwY29tcG9uZW50czpodHRwY29yZTo0LjQuNCcKK30KKworYnVpbGRzY3JpcHQgeworICAgIHJlcG9zaXRvcmllcyB7CisgICAgICAgIG1hdmVuQ2VudHJhbCgpCisgICAgfQorICAgIGRlcGVuZGVuY2llcyB7CisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjEuNS4wJworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2FuZHJvaWQvc2V0dGluZ3MuZ3JhZGxlIGIvbGliL2phdmEvYW5kcm9pZC9zZXR0aW5ncy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVlOTdiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2FuZHJvaWQvc2V0dGluZ3MuZ3JhZGxlCkBAIC0wLDAgKzEgQEAKK3Jvb3RQcm9qZWN0Lm5hbWU9J3RocmlmdCcKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2FuZHJvaWQvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2xpYi9qYXZhL2FuZHJvaWQvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2FiZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvYW5kcm9pZC9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCBwYWNrYWdlPSJvcmcuYXBhY2hlLnRocmlmdCI+CisgIDxhcHBsaWNhdGlvbiAvPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2J1aWxkLmdyYWRsZSBiL2xpYi9qYXZhL2J1aWxkLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzAyZjc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvYnVpbGQuZ3JhZGxlCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVXNpbmcgdGhlIGxlZ2FjeSBwbHVnaW4gY2xhc3NwYXRoIGZvciBDbG92ZXIgc28gaXQgY2FuIGJlIGxvYWRlZCBvcHRpb25hbGx5CitidWlsZHNjcmlwdCB7CisgICAgcmVwb3NpdG9yaWVzIHsKKyAgICAgICAgZ29vZ2xlKCkKKyAgICAgICAgamNlbnRlcigpCisgICAgICAgIGdyYWRsZVBsdWdpblBvcnRhbCgpCisgICAgfQorCisgICAgZGVwZW5kZW5jaWVzIHsKKyAgICAgICAgY2xhc3NwYXRoICdjb20uYm11c2Noa286Z3JhZGxlLWNsb3Zlci1wbHVnaW46Mi4yLjAnCisgICAgfQorfQorCitwbHVnaW5zIHsKKyAgICBpZCAnamF2YScKKyAgICBpZCAnbWF2ZW4nCisgICAgaWQgJ3NpZ25pbmcnCisgICAgaWQgJ2NvbS5naXRodWIuam9obnJlbmdlbG1hbi5zaGFkb3cnIHZlcnNpb24gJzIuMC4yJworfQorCitkZXNjcmlwdGlvbiA9ICdBcGFjaGUgVGhyaWZ0IEphdmEgTGlicmFyeScKKworZGVmYXVsdFRhc2tzICdidWlsZCcKKworLy8gVmVyc2lvbiBjb21wb25lbnRzIGZvciB0aGlzIHByb2plY3QKK2dyb3VwID0gcHJvcGVydHkoJ3RocmlmdC5ncm91cGlkJykKKworLy8gRHJvcCB0aGUgLWRldiBzdWZmaXgsIHdlIHVzZSB0aGUgU05BUFNIT1Qgc3VmZml4IGZvciBub24tcmVsZWFzZSB2ZXJzaW9ucworZGVmIHBhcnNlZFZlcnNpb24gPSBwcm9wZXJ0eSgndGhyaWZ0LnZlcnNpb24nKS50b1N0cmluZygpLnJlcGxhY2UoJy1kZXYnLCAnJykKK2lmIChCb29sZWFuLnBhcnNlQm9vbGVhbihwcm9qZWN0LnJlbGVhc2UpKSB7CisgICAgdmVyc2lvbiA9IHBhcnNlZFZlcnNpb24KK30gZWxzZSB7CisgICAgdmVyc2lvbiA9IHBhcnNlZFZlcnNpb24gKyAnLVNOQVBTSE9UJworfQorCisvLyBLZWVwaW5nIHRoZSByZXN0IG9mIHRoZSBidWlsZCBsb2dpYyBpbiBmdW5jdGlvbmFsIG5hbWVkIHNjcmlwdHMgZm9yIGNsYXJpdHkKK2FwcGx5IGZyb206ICdncmFkbGUvZW52aXJvbm1lbnQuZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS9zb3VyY2VDb25maWd1cmF0aW9uLmdyYWRsZScKK2FwcGx5IGZyb206ICdncmFkbGUvYWRkaXRpb25hbEFydGlmYWN0cy5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL2dlbmVyYXRlVGVzdFRocmlmdC5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL3VuaXRUZXN0cy5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL2Nsb3ZlckNvdmVyYWdlLmdyYWRsZScKK2FwcGx5IGZyb206ICdncmFkbGUvZnVuY3Rpb25hbFRlc3RzLmdyYWRsZScKK2FwcGx5IGZyb206ICdncmFkbGUvcHVibGlzaGluZy5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL2NvZGVRdWFsaXR5Q2hlY2tzLmdyYWRsZScKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2J1aWxkLnByb3BlcnRpZXMgYi9saWIvamF2YS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGIwN2M1Li4wMDAwMDAwCi0tLSBhL2xpYi9qYXZhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi10aHJpZnQudmVyc2lvbj0wLjcuMAotcmVsZWFzZT10cnVlCi10aHJpZnQuZ3JvdXBpZD1vcmcuYXBhY2hlLnRocmlmdAotCi0jIEphciBWZXJzaW9ucyAKLW12bi5hbnQudGFzay52ZXJzaW9uPTIuMS4zCi0KLSMgTG9jYWwgSW5zdGFsbCBwYXRocwotaW5zdGFsbC5wYXRoPS91c3IvbG9jYWwvbGliCi1pbnN0YWxsLmphdmFkb2MucGF0aD0ke2luc3RhbGwucGF0aH0KLQotIyBNYXZlbiBkZXBlbmRlbmN5IGRvd25sb2FkIGxvY2F0aW9ucwotbXZuLnJlcG89aHR0cDovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIKLWFwYWNoZS5yZXBvPWh0dHBzOi8vcmVwb3NpdG9yeS5hcGFjaGUub3JnL2NvbnRlbnQvcmVwb3NpdG9yaWVzL3JlbGVhc2VzCi1tdm4uYW50LnRhc2sudXJsPSR7bXZuLnJlcG99L29yZy9hcGFjaGUvbWF2ZW4vbWF2ZW4tYW50LXRhc2tzLyR7bXZuLmFudC50YXNrLnZlcnNpb259Ci1tdm4uYW50LnRhc2suamFyPW1hdmVuLWFudC10YXNrcy0ke212bi5hbnQudGFzay52ZXJzaW9ufS5qYXIKLQotIyBBcGFjaGUgTWF2ZW4gcHVibGlzaCAKLWxpY2Vuc2U9aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dCIKLW1hdmVuLXJlcG9zaXRvcnktdXJsPWh0dHBzOi8vcmVwb3NpdG9yeS5hcGFjaGUub3JnL3NlcnZpY2UvbG9jYWwvc3RhZ2luZy9kZXBsb3kvbWF2ZW4yCi1tYXZlbi1yZXBvc2l0b3J5LWlkPWFwYWNoZS5yZWxlYXNlcy5odHRwcwotCi0jIEphciBWZXJzaW9ucyAKLW12bi5hbnQudGFzay52ZXJzaW9uPTIuMS4zCi0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2J1aWxkLnhtbCBiL2xpYi9qYXZhL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0ZThkZC4uMDAwMDAwMAotLS0gYS9saWIvamF2YS9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIAotIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIAotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotPHByb2plY3QgbmFtZT0ibGlidGhyaWZ0IiBkZWZhdWx0PSJkaXN0IiBiYXNlZGlyPSIuIgotICB4bWxuczphcnRpZmFjdD0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50Ij4KLSAgCi0gIDxkZXNjcmlwdGlvbj5UaHJpZnQgQnVpbGQgRmlsZTwvZGVzY3JpcHRpb24+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQucm9vdCIgbG9jYXRpb249Ii4uLy4uLyIvPgotICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmFydGlmYWN0aWQiIHZhbHVlPSJsaWJ0aHJpZnQiLz4KLQotICA8IS0tIEluY2x1ZGUgdGhlIGJhc2UgcHJvcGVydGllcyBmaWxlIC0tPgotICA8cHJvcGVydHkgZmlsZT0iJHtiYXNlZGlyfS9idWlsZC5wcm9wZXJ0aWVzIiAvPgotCi0gIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+Ci0KLSAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idmVyc2lvbiIgdmFsdWU9IiR7dGhyaWZ0LnZlcnNpb259Ij4KLSAgICA8aXNzZXQgcHJvcGVydHk9InJlbGVhc2UiLz4KLSAgPC9jb25kaXRpb24+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiB2YWx1ZT0iJHt0aHJpZnQudmVyc2lvbn0tc25hcHNob3QiLz4gCi0KLSAgPHByb3BlcnR5IG5hbWU9ImZpbmFsLm5hbWUiIHZhbHVlPSIke3RocmlmdC5hcnRpZmFjdGlkfS0ke3ZlcnNpb259Ii8+Ci0KLSAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249IiR7YmFzZWRpcn0vc3JjIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9L2J1aWxkIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5saWIuZGlyIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L2xpYiIvPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQudG9vbHMuZGlyIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L3Rvb2xzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzcmMudGVzdCIgbG9jYXRpb249InRlc3QiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImphdmFkb2MuZGlyIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L2phdmFkb2MiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRlc3QuZGlyIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L3Rlc3QiLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3QudGhyaWZ0LmhvbWUiIGxvY2F0aW9uPSIke3RocmlmdC5yb290fS90ZXN0Ii8+Ci0KLSAgPHByb3BlcnR5IG5hbWU9ImdlbiIgbG9jYXRpb249Imdlbi1qYXZhIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJnZW5iZWFuIiBsb2NhdGlvbj0iZ2VuLWphdmFiZWFuIi8+Ci0KLSAgPHByb3BlcnR5IG5hbWU9Imphci5maWxlIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9LyR7ZmluYWwubmFtZX0uamFyIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Lmphci5maWxlIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9LyR7ZmluYWwubmFtZX0tdGVzdC5qYXIiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImphdmFkb2MuamFyLmZpbGUiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vJHtmaW5hbC5uYW1lfS1qYXZhZG9jLmphciIvPgotICA8cHJvcGVydHkgbmFtZT0ic291cmNlLnRhci5neiIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS8ke2ZpbmFsLm5hbWV9LXNyYy50YXIuZ3oiLz4KLQotICA8IS0tIEp1bml0IHByb3BlcnRpZXMgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Lmp1bml0Lm91dHB1dC5mb3JtYXQiIHZhbHVlPSJwbGFpbiIvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC50aW1lb3V0IiB2YWx1ZT0iMjAwMDAwMCIvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC5zcmMuZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS90ZXN0Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LmxvZy5kaXIiIHZhbHVlPSIke2J1aWxkLnRlc3QuZGlyfS9sb2ciLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3QucG9ydCIgdmFsdWU9IjkwOTAiLz4gCi0KLSAgPCEtLSBtYXZlbiBwcm9wZXJ0aWVzIC0tPgotICA8cHJvcGVydHkgbmFtZT0icG9tLnhtbCIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS8ke2ZpbmFsLm5hbWV9LnBvbSIvPgotCi0gIDxwYXRoIGlkPSJjb21waWxlLmNsYXNzcGF0aCI+Ci0gICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmxpYi5kaXJ9Ij4gCi0gICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIvPgotICAgIDwvZmlsZXNldD4KLSAgPC9wYXRoPgotCi0gIDxwYXRoIGlkPSJ0ZXN0LmNsYXNzcGF0aCI+Ci0gICAgPHBhdGggcmVmaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIi8+Ci0gICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7ZW52LkNMQVNTUEFUSH0iLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQudGVzdC5kaXJ9Ii8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2phci5maWxlfSIvPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0Lmphci5maWxlfSIvPgotICA8L3BhdGg+Ci0KLSAgPCEtLSBUYXNrcyAtLT4gCi0gIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0ic2V0dXAuaW5pdCxtdm4uaW5pdCIgdW5sZXNzPSJpbml0LmZpbmlzaGVkIj4KLSAgICA8cHJvcGVydHkgbmFtZT0iaW5pdC5maW5pc2hlZCIgdmFsdWU9InRydWUiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJzZXR1cC5pbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iLz4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmxpYi5kaXJ9Ii8+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC50b29scy5kaXJ9Ii8+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC50ZXN0LmRpcn0iLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8amF2YWMgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGQuZGlyfSIgc291cmNlPSIxLjUiIHRhcmdldD0iMS41IiAKLSAgICBkZWJ1Zz0idHJ1ZSIgY2xhc3NwYXRocmVmPSJjb21waWxlLmNsYXNzcGF0aCIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iamF2YWRvYyIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGphdmFkb2Mgc291cmNlcGF0aD0iJHtzcmN9IiBkZXN0ZGlyPSIke2phdmFkb2MuZGlyfSIKLSAgICAgIHZlcnNpb249InRydWUiIHdpbmRvd3RpdGxlPSJUaHJpZnQgSmF2YSBBUEkiIGRvY3RpdGxlPSJUaHJpZnQgSmF2YSBBUEkiCi0gICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIj4KLSAgICA8L2phdmFkb2M+Ci0gICAgPGphciBqYXJmaWxlPSIke2phdmFkb2MuamFyLmZpbGV9IiBiYXNlZGlyPSIke2phdmFkb2MuZGlyfSI+Ci0gICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tVmVyc2lvbiIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KLSAgICAgIDwvbWFuaWZlc3Q+Ci0gICAgPC9qYXI+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9L01FVEEtSU5GIi8+Ci0gICAgPGNvcHkgZmlsZT0iJHt0aHJpZnQucm9vdH0vTElDRU5TRSIgdG9maWxlPSIke2J1aWxkLmRpcn0vTUVUQS1JTkYvTElDRU5TRS50eHQiLz4KLSAgICA8Y29weSBmaWxlPSIke3RocmlmdC5yb290fS9OT1RJQ0UiIHRvZmlsZT0iJHtidWlsZC5kaXJ9L01FVEEtSU5GL05PVElDRS50eHQiLz4KLSAgICA8amFyIGphcmZpbGU9IiR7amFyLmZpbGV9Ij4KLSAgICAgIDxtYW5pZmVzdD4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJbXBsZW1lbnRhdGlvbi1WZXJzaW9uIiB2YWx1ZT0iJHt2ZXJzaW9ufSIvPgotICAgICAgPC9tYW5pZmVzdD4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5kaXJ9Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS90aHJpZnQvKiovKi5jbGFzcyIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qLnR4dCIvPgotICAgICAgPC9maWxlc2V0PgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2phcj4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJwYWNrLnNyYyI+Ci0gICAgPHRhciBkZXN0ZmlsZT0iJHtzb3VyY2UudGFyLmd6fSIgYmFzZWRpcj0iJHtzcmN9IiBjb21wcmVzc2lvbj0iZ3ppcCIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwiIGRlcGVuZHM9ImRpc3QsamF2YWRvYyI+Ci0gICAgPGNvcHkgdG9kaXI9IiR7aW5zdGFsbC5wYXRofSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZGlyfSIgaW5jbHVkZXM9IiouamFyIi8+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQubGliLmRpcn0iIGluY2x1ZGVzPSIqLmphciIvPgotICAgIDwvY29weT4KLSAgICA8Y29weSB0b2Rpcj0iJHtpbnN0YWxsLmphdmFkb2MucGF0aH0iPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2phdmFkb2MuZGlyfSIgaW5jbHVkZXM9IioqLyoiLz4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgotICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtnZW59Ii8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7Z2VuYmVhbn0iLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlLXRlc3QiIGRlc2NyaXB0aW9uPSJCdWlsZCB0aGUgdGVzdCBzdWl0ZSBjbGFzc2VzIiBkZXBlbmRzPSJnZW5lcmF0ZSxkaXN0Ij4KLSAgICA8amF2YWMgZGVidWc9InRydWUiIHNyY2Rpcj0iJHtnZW59IiBkZXN0ZGlyPSIke2J1aWxkLnRlc3QuZGlyfSIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIi8+Ci0gICAgPGphdmFjIGRlYnVnPSJ0cnVlIiBzcmNkaXI9IiR7Z2VuYmVhbn0iIGRlc3RkaXI9IiR7YnVpbGQudGVzdC5kaXJ9IiBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiLz4KLSAgICA8amF2YWMgZGVidWc9InRydWUiIHNyY2Rpcj0iJHtzcmMudGVzdH0iIGRlc3RkaXI9IiR7YnVpbGQudGVzdC5kaXJ9IiBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiLz4KLSAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC50ZXN0LmRpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy50ZXN0fSIgaW5jbHVkZXM9ImxvZzRqLnByb3BlcnRpZXMiLz4KLSAgICA8L2NvcHk+Ci0gICAgPGphciBqYXJmaWxlPSIke3Rlc3QuamFyLmZpbGV9IiBiYXNlZGlyPSIke2J1aWxkLnRlc3QuZGlyfSIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Imp1bml0LXRlc3QiIGRlc2NyaXB0aW9uPSJSdW4gdGhlIEpVbml0IHRlc3Qgc3VpdGUiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdCI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0LmxvZy5kaXJ9Ii8+Ci0gICAgPGp1bml0IHByaW50c3VtbWFyeT0idHJ1ZSIgc2hvd291dHB1dD0iJHt0ZXN0Lm91dHB1dH0iIHRpbWVvdXQ9IiR7dGVzdC50aW1lb3V0fSIgCi0gICAgICBoYWx0b25mYWlsdXJlPSJ0cnVlIiBlcnJvclByb3BlcnR5PSJ0ZXN0cy5mYWlsZWQiIGZhaWx1cmVQcm9wZXJ0eT0idGVzdHMuZmFpbGVkIgotICAgICAgZm9yaz0idHJ1ZSIgZm9ya21vZGU9InBlclRlc3QiIG1heG1lbW9yeT0iNTEybSIKLSAgICA+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJidWlsZC50ZXN0IiB2YWx1ZT0iJHtidWlsZC50ZXN0LmRpcn0iLz4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9InRlc3QucG9ydCIgdmFsdWU9IiR7dGVzdC5wb3J0fSIvPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIiB2YWx1ZT0iJHtzcmMudGVzdH0vLnRydXN0c3RvcmUiLz4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkIiB2YWx1ZT0idGhyaWZ0Ii8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJqYXZheC5uZXQuc3NsLmtleVN0b3JlIiB2YWx1ZT0iJHtzcmMudGVzdH0vLmtleXN0b3JlIi8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQiIHZhbHVlPSJ0aHJpZnQiLz4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgICA8Zm9ybWF0dGVyIHR5cGU9IiR7dGVzdC5qdW5pdC5vdXRwdXQuZm9ybWF0fSIvPgotICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHt0ZXN0LmxvZy5kaXJ9IiB1bmxlc3M9InRlc3RjYXNlIj4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3Quc3JjLmRpcn0iPgotICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL1Rlc3QqLmphdmEiLz4KLSAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9UZXN0Q2xpZW50LmphdmEiLz4KLSAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9UZXN0U2VydmVyLmphdmEiLz4KLSAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YSIvPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICA8L2JhdGNodGVzdD4KLSAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdC5sb2cuZGlyfSIgaWY9InRlc3RjYXNlIj4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3Quc3JjLmRpcn0iIGluY2x1ZGVzPSIqKi8ke3Rlc3RjYXNlfS5qYXZhIi8+Ci0gICAgICA8L2JhdGNodGVzdD4KLSAgICA8L2p1bml0PgotICAgIDxmYWlsIGlmPSJ0ZXN0cy5mYWlsZWQiPlRlc3RzIGZhaWxlZCE8L2ZhaWw+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZGVwcmVjYXRlZC10ZXN0IiBkZXNjcmlwdGlvbj0iUnVuIHRoZSBub24tSlVuaXQgdGVzdCBzdWl0ZSIgZGVwZW5kcz0iY29tcGlsZS10ZXN0Ij4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuRXF1YWxpdHlUZXN0IiBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSIvPgotICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50aHJpZnQudGVzdC5KYXZhQmVhbnNUZXN0IiBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlc2NyaXB0aW9uPSJSdW4gdGhlIGZ1bGwgdGVzdCBzdWl0ZSIgZGVwZW5kcz0ianVuaXQtdGVzdCxkZXByZWNhdGVkLXRlc3QiLz4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3RjbGllbnQiIGRlc2NyaXB0aW9uPSJSdW4gYSB0ZXN0IGNsaWVudCIgZGVwZW5kcz0iY29tcGlsZS10ZXN0Ij4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuVGVzdENsaWVudCIKLSAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iJHt0ZXN0YXJnc30iLz4KLSAgICA8L2phdmE+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdHNlcnZlciIgZGVzY3JpcHRpb249IlJ1biBhIHRlc3Qgc2VydmVyIiBkZXBlbmRzPSJjb21waWxlLXRlc3QiPgotICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50aHJpZnQudGVzdC5UZXN0U2VydmVyIgotICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSIke3Rlc3RhcmdzfSIvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0bm9uYmxvY2tpbmdzZXJ2ZXIiIGRlc2NyaXB0aW9uPSJSdW4gYSB0ZXN0IG5vbmJsb2NraW5nIHNlcnZlciIgZGVwZW5kcz0iY29tcGlsZS10ZXN0Ij4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuVGVzdE5vbmJsb2NraW5nU2VydmVyIgotICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSIke3Rlc3RhcmdzfSIvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZSI+Ci0gICAgPCEtLSBHZW5lcmF0ZSB0aGUgdGhyaWZ0IGdlbi1qYXZhIHNvdXJjZSAtLT4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmE6aGFzaGNvZGUgJHt0ZXN0LnRocmlmdC5ob21lfS9UaHJpZnRUZXN0LnRocmlmdCIvPgotICAgIDwvZXhlYz4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmE6aGFzaGNvZGUgJHt0ZXN0LnRocmlmdC5ob21lfS9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQiLz4KLSAgICA8L2V4ZWM+Ci0gICAgPGV4ZWMgZXhlY3V0YWJsZT0iLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSItLWdlbiBqYXZhOmhhc2hjb2RlICR7dGVzdC50aHJpZnQuaG9tZX0vT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0Ii8+Ci0gICAgPC9leGVjPgotICAgIDxleGVjIGV4ZWN1dGFibGU9Ii4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iLS1nZW4gamF2YTpiZWFucyxub2NhbWVsICR7dGVzdC50aHJpZnQuaG9tZX0vSmF2YUJlYW5zVGVzdC50aHJpZnQiLz4KLSAgICA8L2V4ZWM+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0icHJveHkiIGlmPSJwcm94eS5lbmFibGVkIj4KLSAgICA8c2V0cHJveHkgcHJveHlob3N0PSIke3Byb3h5Lmhvc3R9IiBwcm94eXBvcnQ9IiR7cHJveHkucG9ydH0iCi0gICAgICBwcm94eXVzZXI9IiR7cHJveHkudXNlcn0iIHByb3h5cGFzc3dvcmQ9IiR7cHJveHkucGFzc30iLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJtdm4uYW50LnRhc2tzLmRvd25sb2FkIiBkZXBlbmRzPSJzZXR1cC5pbml0LG12bi5hbnQudGFza3MuY2hlY2sscHJveHkiIHVubGVzcz0ibXZuLmFudC50YXNrcy5mb3VuZCI+Ci0gICAgPGdldCBzcmM9IiR7bXZuLmFudC50YXNrLnVybH0vJHttdm4uYW50LnRhc2suamFyfSIgZGVzdD0iJHtidWlsZC50b29scy5kaXJ9LyR7bXZuLmFudC50YXNrLmphcn0iIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Im12bi5hbnQudGFza3MuY2hlY2siPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im12bi5hbnQudGFza3MuZm91bmQiPgotICAgICAgPHR5cGVmb3VuZCB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCIgbmFtZT0iYXJ0aWZhY3QiLz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgPC90YXJnZXQ+IAotCi0gIDx0YXJnZXQgbmFtZT0ibXZuLmluaXQiIGRlcGVuZHM9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIHVubGVzcz0ibXZuLmZpbmlzaGVkIj4KLSAgICA8IS0tIERvd25sb2FkIG12biBhbnQgdGFza3MsIGRvd25sb2FkIGRlcGVuZGVuY2llcywgYW5kIHNldHVwIHBvbSBmaWxlIC0tPgotICAgIDx0eXBlZGVmIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBjbGFzc3BhdGg9IiR7YnVpbGQudG9vbHMuZGlyfS8ke212bi5hbnQudGFzay5qYXJ9Ii8+Ci0KLSAgICA8IS0tIHJlbW90ZSByZXBvc2l0b3JpZXMgdXNlZCB0byBkb3dubG9hZCBkZXBlbmRlbmNpZXMgZnJvbSAtLT4KLSAgICA8YXJ0aWZhY3Q6cmVtb3RlUmVwb3NpdG9yeSBpZD0iY2VudHJhbCIgdXJsPSIke212bi5yZXBvfSIvPgotICAgIDxhcnRpZmFjdDpyZW1vdGVSZXBvc2l0b3J5IGlkPSJhcGFjaGUiIHVybD0iJHthcGFjaGUucmVwb30iLz4KLQotICAgIDwhLS0gUG9tIGZpbGUgaW5mb3JtYXRpb24gLS0+Ci0gICAgPGFydGlmYWN0OnBvbSBpZD0icG9tIiAKLSAgICAgIGdyb3VwSWQ9IiR7dGhyaWZ0Lmdyb3VwaWR9IiAKLSAgICAgIGFydGlmYWN0SWQ9IiR7dGhyaWZ0LmFydGlmYWN0aWR9IgotICAgICAgdmVyc2lvbj0iJHt2ZXJzaW9ufSIgCi0gICAgICB1cmw9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKLSAgICAgIG5hbWU9IkFwYWNoZSBUaHJpZnQiCi0gICAgICBkZXNjcmlwdGlvbj0iVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcyBkZXZlbG9wbWVudC4iCi0gICAgICBwYWNrYWdpbmc9InBvbSIKLSAgICA+Ci0gICAgICA8cmVtb3RlUmVwb3NpdG9yeSByZWZpZD0iY2VudHJhbCIvPgotICAgICAgPHJlbW90ZVJlcG9zaXRvcnkgcmVmaWQ9ImFwYWNoZSIvPgotICAgICAgPGxpY2Vuc2UgbmFtZT0iVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCIgdXJsPSIke2xpY2Vuc2V9Ii8+Ci0gICAgICA8c2NtIGNvbm5lY3Rpb249InNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQvdHJ1bmsvIiAKLSAgICAgICAgZGV2ZWxvcGVyQ29ubmVjdGlvbj0ic2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC90cnVuay8iCi0gICAgICAgIHVybD0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL3RocmlmdCIKLSAgICAgIC8+Ci0gICAgICA8IS0tIFRocmlmdCBEZXZlbG9wZXJzIC0tPgotICAgICAgPGRldmVsb3BlciBpZD0ibWNzbGVlIiBuYW1lPSJNYXJrIFNsZWUiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImRyZWlzcyIgbmFtZT0iRGF2aWQgUmVpc3MiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImFkaXR5YSIgbmFtZT0iQWRpdHlhIEFnYXJ3YWwiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9Im1hcmNrIiBuYW1lPSJNYXJjIEt3aWF0a293c2tpIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJqd2FuZyIgbmFtZT0iSmFtZXMgV2FuZyIvPgotICAgICAgPGRldmVsb3BlciBpZD0iY3Bpcm8iIG5hbWU9IkNocmlzIFBpcm8iLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImJtYXVyZXIiIG5hbWU9IkJlbiBNYXVyZXIiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImtjbGFyayIgbmFtZT0iS2V2aW4gQ2xhcmsiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9Impha2UiIG5hbWU9Ikpha2UgTHVjaWFuaSIvPgotICAgICAgPGRldmVsb3BlciBpZD0iYnJ5YW5kdXhidXJ5IiBuYW1lPSJCcnlhbiBEdXhidXJ5Ii8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJlc3RldmUiIG5hbWU9IkVzdGV2ZSBGZXJuYW5kZXoiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9InRvZGQiIG5hbWU9IlRvZGQgTGlwY29uIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJnZWVjaG9yYW1hIiBuYW1lPSJBbmRyZXcgTWNHZWFjaGllIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJtb2xpbmFybyIgbmFtZT0iQW50aG9ueSBNb2xpbmFybyIvPgotICAgICAgPGRldmVsb3BlciBpZD0icm9nZXIiIG5hbWU9IlJvZ2VyIE1laWVyIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJqZmFycmVsbCIgbmFtZT0iSmFrZSBGYXJyZWxsIi8+Ci0KLSAgICAgIDwhLS0gVGhyaWZ0IGRlcGVuZGVuY2llcyBsaXN0IC0tPgotICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLnNsZjRqIiBhcnRpZmFjdElkPSJzbGY0ai1hcGkiIHZlcnNpb249IjEuNS44Ii8+Ci0gICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb21tb25zLWxhbmciIGFydGlmYWN0SWQ9ImNvbW1vbnMtbGFuZyIgdmVyc2lvbj0iMi41Ii8+Ci0gICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJqYXZheC5zZXJ2bGV0IiBhcnRpZmFjdElkPSJzZXJ2bGV0LWFwaSIgdmVyc2lvbj0iMi41Ii8+Ci0gICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzIiBhcnRpZmFjdElkPSJodHRwY2xpZW50IiB2ZXJzaW9uPSI0LjAuMSIvPgotICAgIDwvYXJ0aWZhY3Q6cG9tPgotCi0gICAgPCEtLSBHZW5lcmF0ZSB0aGUgcG9tIGZpbGUgLS0+Ci0gICAgPGFydGlmYWN0OndyaXRlcG9tIHBvbVJlZklkPSJwb20iIGZpbGU9IiR7cG9tLnhtbH0iLz4KLQotICAgIDwhLS0gRG93bmxvYWQgdGhlIGRlcGVuZGVuY2llcyAtLT4KLSAgICA8YXJ0aWZhY3Q6ZGVwZW5kZW5jaWVzIGZpbGVzZXRJZD0iYnVpbGQtZGVwZW5kZW5jeS1qYXJzIiBwb21SZWZJZD0icG9tIi8+Ci0KLSAgICA8IS0tIENvcHkgdGhlIGRlcGVuZGVuY2llcyB0byB0aGUgYnVpbGQvbGliIGRpciAtLT4KLSAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5kaXJ9L2xpYiI+Ci0gICAgICA8ZmlsZXNldCByZWZpZD0iYnVpbGQtZGVwZW5kZW5jeS1qYXJzIi8+Ci0gICAgICA8bWFwcGVyIHR5cGU9ImZsYXR0ZW4iLz4KLSAgICA8L2NvcHk+Ci0KLSAgICA8IS0tIERlcGVuZGVuY2llcyBuZWVkZWQgZm9yIHRlc3RpbmcgLS0+Ci0gICAgPGFydGlmYWN0OmRlcGVuZGVuY2llcyBmaWxlc2V0SWQ9InRlc3QtZGVwZW5kZW5jeS1qYXJzIiB1c2VTY29wZT0icnVudGltZSI+Ci0gICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuc2xmNGoiIGFydGlmYWN0SWQ9InNsZjRqLWxvZzRqMTIiIHZlcnNpb249IjEuNS44Ii8+Ci0gICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJqdW5pdCIgYXJ0aWZhY3RJZD0ianVuaXQiIHZlcnNpb249IjQuNCIvPgotICAgIDwvYXJ0aWZhY3Q6ZGVwZW5kZW5jaWVzPgotCi0gICAgPCEtLSBDb3B5IHRoZSB0ZXN0IGRlcGVuZGVuY2llcyB0byB0aGUgYnVpbGQvbGliIGRpciAtLT4KLSAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5kaXJ9L2xpYiI+Ci0gICAgICA8ZmlsZXNldCByZWZpZD0idGVzdC1kZXBlbmRlbmN5LWphcnMiLz4KLSAgICAgIDxtYXBwZXIgdHlwZT0iZmxhdHRlbiIvPgotICAgIDwvY29weT4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJtdm4uZmluaXNoZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDxtYWNyb2RlZiBuYW1lPSJzaWduQW5kRGVwbG95Ij4KLSAgICA8IS0tIFNpZ24gYW5kIGRlcGxveSBqYXJzIHRvIGFwYWNoZSByZXBvIC0tPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NpZmllciIgZGVmYXVsdD0iIi8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJwYWNrYWdpbmciIGRlZmF1bHQ9ImphciIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9tIiBkZWZhdWx0PSIiLz4KLSAgICA8c2VxdWVudGlhbD4KLSAgICAgIDxhcnRpZmFjdDptdm4gZm9yaz0idHJ1ZSI+Ci0gICAgICAgIDxhcmcgdmFsdWU9Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1ncGctcGx1Z2luOjEuMTpzaWduLWFuZC1kZXBsb3ktZmlsZSIvPgotICAgICAgICA8YXJnIHZhbHVlPSItRHJlcG9zaXRvcnlJZD0ke21hdmVuLXJlcG9zaXRvcnktaWR9Ii8+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii1EdXJsPSR7bWF2ZW4tcmVwb3NpdG9yeS11cmx9Ii8+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii1EcG9tRmlsZT1Ae3BvbX0iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iLURmaWxlPUB7ZmlsZX0iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iLURjbGFzc2lmaWVyPUB7Y2xhc3NpZmllcn0iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iLURwYWNrYWdpbmc9QHtwYWNrYWdpbmd9Ii8+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii1QZ3BnIi8+Ci0gICAgICA8L2FydGlmYWN0Om12bj4KLSAgICA8L3NlcXVlbnRpYWw+Ci0gIDwvbWFjcm9kZWY+Ci0KLSAgPHRhcmdldCBuYW1lPSJwdWJsaXNoIiBkZXBlbmRzPSJjbGVhbixpbml0LHRlc3QsZGlzdCxqYXZhZG9jLHBhY2suc3JjIj4KLSAgICA8IS0tIENvbXBpbGUsIHBhY2thZ2UsIHRlc3QgYW5kIHRoZW4gc2VuZCByZWxlYXNlIHRvIGFwYWNoZSBtYXZlbiByZXBvIC0tPgotICAgIDwhLS0gcnVuIHdpdGg6IGFudCAtRHJlbGVhc2U9dHJ1ZSBwdWJsaXNoLS0+Ci0gICAgPHNpZ25BbmREZXBsb3kgZmlsZT0iJHtwb20ueG1sfSIgcGFja2FnaW5nPSJwb20iIGNsYXNzaWZpZXI9IiIgcG9tPSIke3BvbS54bWx9Ii8+Ci0gICAgPHNpZ25BbmREZXBsb3kgZmlsZT0iJHtqYXIuZmlsZX0iIHBhY2thZ2luZz0iamFyIiBjbGFzc2lmaWVyPSIiIHBvbT0iJHtwb20ueG1sfSIvPgotICAgIDxzaWduQW5kRGVwbG95IGZpbGU9IiR7amF2YWRvYy5qYXIuZmlsZX0iIHBhY2thZ2luZz0iamFyIiBjbGFzc2lmaWVyPSJqYXZhZG9jIiBwb209IiR7cG9tLnhtbH0iLz4KLSAgICA8c2lnbkFuZERlcGxveSBmaWxlPSIke3NvdXJjZS50YXIuZ3p9IiBwYWNrYWdpbmc9InNyYyIgY2xhc3NpZmllcj0idGFyLmd6IiBwb209IiR7cG9tLnhtbH0iLz4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvamF2YS9jb2RlX3F1YWxpdHlfdG9vbHMvZmluZGJ1Z3MtZmlsdGVyLnhtbCBiL2xpYi9qYXZhL2NvZGVfcXVhbGl0eV90b29scy9maW5kYnVncy1maWx0ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOTNiMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9jb2RlX3F1YWxpdHlfdG9vbHMvZmluZGJ1Z3MtZmlsdGVyLnhtbApAQCAtMCwwICsxLDUxIEBACis8RmluZEJ1Z3NGaWx0ZXI+CisgICAgPCEtLQorICAgICAgICBUaGlzIGZpbGUgY29udHJvbHMgZmlsdGVyaW5nIHNvbWUgb2YgdGhlIG1vcmUgb2Jub3hpb3VzIGZpbmRidWdzIHJlcG9ydHMuCisgICAgICAgIFNvbWUgbWF5IGJlIHdvcnRoeSBvZiBleGFtaW5hdGlvbiBhbmQgcmVzb2x1dGlvbiwgb3RoZXJzIGFyZSB0b28gbml0LXBpY2t5LgorICAgIC0tPgorICAgIDxNYXRjaD4KKyAgICAgICAgPE9yPgorICAgICAgICAgICAgPCEtLSBGaWx0ZXIgdGhlIG1pc3Npbmcgc2VyaWFsVmVyc2lvblVJRCBlcnJvcnMgLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlNuVkkiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBNYWxpY2lvdXMgY29kZSB2dWxuZXJhYmlsaXR5IFdhcm5pbmdzIC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJFSSxFSTIiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBVbmNoZWNrZWQvdW5jb25maXJtZWQgY2FzdCAtLT4KKyAgICAgICAgICAgIDxCdWcgY29kZT0iQkMiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBTaG91bGQgcmV0dXJuIGEgemVybyBsZW5ndGggYXJyYXkgcmF0aGVyIHRoYW4gbnVsbD8gLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlBaTEEiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBSZWR1bmRhbnQgbnVsbGNoZWNrIC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJSQ04iIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBFeGNlcHRpb24gaXMgY2F1Z2h0IHdoZW4gRXhjZXB0aW9uIGlzIG5vdCB0aHJvd24gLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlJFQyIgLz4KKyAgICAgICAgICAgIDwhLS0gRmlsdGVyIFN3aXRjaCBzdGF0ZW1lbnQgZm91bmQgd2hlcmUgZGVmYXVsdCBjYXNlIGlzIG1pc3NpbmcgLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlNGIiAvPgorICAgICAgICAgICAgPCEtLSBGaWx0ZXIgVW5yZWFkIHB1YmxpYy9wcm90ZWN0ZWQgZmllbGQgLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlVyRiIgLz4KKyAgICAgICAgICAgIDwhLS0gRmlsdGVyIEZpZWxkIG5vdCBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvciBhbmQgZGVyZWZlcmVuY2VkIC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJVd0YiIC8+CisgICAgICAgIDwvT3I+CisgICAgPC9NYXRjaD4KKyAgICAgPE1hdGNoPgorICAgICAgICA8IS0tIEZpbHRlciBtZXRob2QgaW52b2tlcyBTeXN0ZW0uZXhpdCguLi4pLCB3aGljaCBzaHV0cyBkb3duIHRoZSBlbnRpcmUgdmlydHVhbCBtYWNoaW5lIC0tPgorICAgICAgICA8Q2xhc3MgbmFtZT0ib3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGaWxlVHJhbnNwb3J0IiAvPgorICAgICAgICA8TWV0aG9kIG5hbWU9InByaW50VXNhZ2UiIC8+CisgICAgICAgIDxCdWcgY29kZT0iRG0iIC8+CisgICAgIDwvTWF0Y2g+CisgICAgIDxNYXRjaD4KKyAgICAgICAgPCEtLSBGaWx0ZXIgbWV0aG9kIG1pZ2h0IGlnbm9yZSBqYXZhLmxhbmcuRXhjZXB0aW9uIC0tPgorICAgICAgIDxDbGFzcyBuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNpbXBsZUZpbGVUcmFuc3BvcnQiIC8+CisgICAgICAgPE1ldGhvZCBuYW1lPSJjbG9zZSIgLz4KKyAgICAgICA8QnVnIGNvZGU9IkRFIiAvPgorICAgICA8L01hdGNoPgorICAgICA8TWF0Y2g+CisgICAgICAgIDwhLS0gRmlsdGVyIG1ldGhvZCBtaWdodCBpZ25vcmUgamF2YS5sYW5nLkV4Y2VwdGlvbiAtLT4KKyAgICAgICA8Q2xhc3MgbmFtZT0ib3JnLmFwYWNoZS50aHJpZnQuVE5vbmJsb2NraW5nTXVsdGlGZXRjaENsaWVudCRNdWx0aUZldGNoIiAvPgorICAgICAgIDxNZXRob2QgbmFtZT0icnVuIiAvPgorICAgICAgIDxCdWcgY29kZT0iREUiIC8+CisgICAgIDwvTWF0Y2g+CisgICAgIDxNYXRjaD4KKyAgICAgICAgPCEtLSBGaWx0ZXIgQ2xhc3MgZGVmaW5lcyBub24tdHJhbnNpZW50IG5vbi1zZXJpYWxpemFibGUgaW5zdGFuY2UgZmllbGQgLS0+CisgICAgICAgPENsYXNzIG5hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UU2VydmxldCIgLz4KKyAgICAgICA8QnVnIGNvZGU9IlNlIiAvPgorICAgICA8L01hdGNoPgorPC9GaW5kQnVnc0ZpbHRlcj4KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvamF2YS9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlLnByb3BlcnRpZXMgYi9saWIvamF2YS9ncmFkbGUucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTZhOTZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzMyBAQAorIyBUaGlzIGZpbGUgaXMgc2hhcmVkIGN1cnJlbnRseSBiZXR3ZWVuIHRoaXMgR3JhZGxlIGJ1aWxkIGFuZCB0aGUKKyMgQW50IGJ1aWxkcyBmb3IgZmQzMDMgYW5kIEphdmFTY3JpcHQuIEtlZXAgdGhlIGRvdHRlZCBub3RhdGlvbiBmb3IKKyMgdGhlIHByb3BlcnRpZXMgdG8gbWluaW1pemUgdGhlIGNoYW5nZXMgaW4gdGhlIGRlcGVuZGVuY2llcy4KK3RocmlmdC52ZXJzaW9uPTEuMC4wCit0aHJpZnQuZ3JvdXBpZD1vcmcuYXBhY2hlLnRocmlmdAorcmVsZWFzZT10cnVlCisKKyMgTG9jYWwgSW5zdGFsbCBwYXRocworaW5zdGFsbC5wYXRoPS91c3IvbG9jYWwvbGliCitpbnN0YWxsLmphdmFkb2MucGF0aD0vdXNyL2xvY2FsL2xpYgorCisjIFRlc3QgZXhlY3V0aW9uIHByb3BlcnRpZXMKK3Rlc3RQb3J0PTkwOTAKKworIyBUZXN0IHdpdGggQ2xvdmVyIENvZGUgY292ZXJhZ2UgKGRpc2FibGVkIGJ5IGRlZmF1bHQpCitjbG92ZXJFbmFibGVkPWZhbHNlCisKKyMgTWF2ZW4gZGVwZW5kZW5jeSBkb3dubG9hZCBsb2NhdGlvbnMKK212bi5yZXBvPWh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yCithcGFjaGUucmVwbz1odHRwczovL3JlcG9zaXRvcnkuYXBhY2hlLm9yZy9jb250ZW50L3JlcG9zaXRvcmllcy9yZWxlYXNlcworCisjIEFwYWNoZSBNYXZlbiBwdWJsaXNoCitsaWNlbnNlPWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQKK21hdmVuLXJlcG9zaXRvcnktdXJsPWh0dHBzOi8vcmVwb3NpdG9yeS5hcGFjaGUub3JnL3NlcnZpY2UvbG9jYWwvc3RhZ2luZy9kZXBsb3kvbWF2ZW4yCittYXZlbi1yZXBvc2l0b3J5LWlkPWFwYWNoZS5yZWxlYXNlcy5odHRwcworCisjIERlcGVuZGVuY3kgdmVyc2lvbnMKK2h0dHBjbGllbnQudmVyc2lvbj00LjQuMQoraHR0cGNvcmUudmVyc2lvbj00LjQuMQorc2xmNGoudmVyc2lvbj0xLjcuMTIKK3NlcnZsZXQudmVyc2lvbj0yLjUKK2p1bml0LnZlcnNpb249NC4xMgorbW9ja2l0by52ZXJzaW9uPTEuOS41CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvYWRkaXRpb25hbEFydGlmYWN0cy5ncmFkbGUgYi9saWIvamF2YS9ncmFkbGUvYWRkaXRpb25hbEFydGlmYWN0cy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxNDY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS9hZGRpdGlvbmFsQXJ0aWZhY3RzLmdyYWRsZQpAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKwordGFzayBzb3VyY2VzSmFyKHR5cGU6IEphciwgZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdBc3NlbWJsZXMgYSBqYXIgYXJjaGl2ZSBjb250YWluaW5nIHRoZSBtYWluIEphdmEgc291cmNlcy4nCisKKyAgICBjbGFzc2lmaWVyICdzb3VyY2VzJworICAgIGZyb20gc291cmNlU2V0cy5tYWluLmFsbFNvdXJjZQorfQorCit0YXNrIGphdmFkb2NKYXIodHlwZTogSmFyLCBkZXBlbmRzT246IGphdmFkb2MsIGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnQXNzZW1ibGVzIGEgamFyIGFyY2hpdmUgY29udGFpbmluZyB0aGUgSmF2YURvYy4nCisKKyAgICBjbGFzc2lmaWVyICdqYXZhZG9jJworICAgIGZyb20gamF2YWRvYy5kZXN0aW5hdGlvbkRpcgorfQorCithcnRpZmFjdHMgeworICAgIGFyY2hpdmVzIHNvdXJjZXNKYXIKKyAgICBhcmNoaXZlcyBqYXZhZG9jSmFyCit9CisKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS9jbG92ZXJDb3ZlcmFnZS5ncmFkbGUgYi9saWIvamF2YS9ncmFkbGUvY2xvdmVyQ292ZXJhZ2UuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZjBlNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvY2xvdmVyQ292ZXJhZ2UuZ3JhZGxlCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRm9sbG93aW5nIEdyYWRsZSBiZXN0IHByYWN0aWNlcyB0byBrZWVwIGJ1aWxkIGxvZ2ljIG9yZ2FuaXplZAorCisvLyBLZWVwIHRoaXMgYXMgYW4gb3B0aW9uYWwgZmVhdHVyZSBmb3Igbm93LCBkaXNhYmxlZCBieSBkZWZhdWx0CitpZiAoQm9vbGVhbi5wYXJzZUJvb2xlYW4ocHJvamVjdC5jbG92ZXJFbmFibGVkKSkgeworICAgIGFwcGx5IHBsdWdpbjogJ2NvbS5ibXVzY2hrby5jbG92ZXInCisKKyAgICBkZXBlbmRlbmNpZXMgeworICAgICAgICBjbG92ZXIgJ29yZy5vcGVuY2xvdmVyOmNsb3Zlcjo0LjIuKycKKyAgICB9CisKKyAgICBjbG92ZXIgeworCisgICAgICAgIHRlc3RJbmNsdWRlcyA9IFsnKiovVGVzdCouamF2YSddCisgICAgICAgIC8vIEV4Y2x1ZGUgdGhlIGdlbmVyYXRlZCB0ZXN0IGNvZGUgZnJvbSBjb2RlIGNvdmVyYWdlCisgICAgICAgIHRlc3RFeGNsdWRlcyA9IFsndGhyaWZ0L3Rlc3QvVGVzdCouamF2YSddCisKKyAgICAgICAgY29tcGlsZXIgeworICAgICAgICAgICAgZW5jb2RpbmcgPSAnVVRGLTgnCisgICAgICAgICAgICBkZWJ1ZyA9IHRydWUKKyAgICAgICAgfQorCisgICAgICAgIHJlcG9ydCB7CisgICAgICAgICAgICBodG1sID0gdHJ1ZQorICAgICAgICAgICAgcGRmID0gdHJ1ZQorICAgICAgICB9CisgICAgfQorCisgICAgYnVpbGQuZGVwZW5kc09uIGNsb3ZlckdlbmVyYXRlUmVwb3J0Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvY29kZVF1YWxpdHlDaGVja3MuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL2NvZGVRdWFsaXR5Q2hlY2tzLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmYxYzI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL2NvZGVRdWFsaXR5Q2hlY2tzLmdyYWRsZQpAQCAtMCwwICsxLDM5IEBACisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb25maWd1cmUgdGhlIEdyYWRsZSBjb2RlIHF1YWxpdHkgcGx1Z2lucyBoZXJlLgorLy8KKworYXBwbHkgcGx1Z2luOiAnZmluZGJ1Z3MnCisKK2ZpbmRidWdzIHsKKyAgICBpZ25vcmVGYWlsdXJlcyA9IHRydWUKKyAgICB0b29sVmVyc2lvbiA9ICczLjAuMScKKyAgICBzb3VyY2VTZXRzID0gWyBzb3VyY2VTZXRzLm1haW4gXQorICAgIGVmZm9ydCA9ICdtYXgnCisgICAgcmVwb3J0TGV2ZWwgPSAnbG93JworICAgIGV4Y2x1ZGVGaWx0ZXIgPSBmaWxlKCdjb2RlX3F1YWxpdHlfdG9vbHMvZmluZGJ1Z3MtZmlsdGVyLnhtbCcpCit9CisKK3Rhc2tzLndpdGhUeXBlKEZpbmRCdWdzKSB7CisgICAgcmVwb3J0cyB7CisgICAgICAgIHRleHQuZW5hYmxlZCA9IGZhbHNlCisgICAgICAgIGh0bWwuZW5hYmxlZCA9IHRydWUKKyAgICAgICAgeG1sLmVuYWJsZWQgPSBmYWxzZQorICAgIH0KK30KKworYXBwbHkgcGx1Z2luOiAncG1kJworCitwbWQgeworICAgIGlnbm9yZUZhaWx1cmVzID0gdHJ1ZQorICAgIHRvb2xWZXJzaW9uID0gJzYuMC4wJworICAgIHNvdXJjZVNldHMgPSBbIHNvdXJjZVNldHMubWFpbiBdCisgICAgcnVsZVNldHMgPSBbICdqYXZhLWJhc2ljJyBdCit9CisKK3Rhc2tzLndpdGhUeXBlKFBtZCkgeworICAgIHJlcG9ydHMgeworICAgICAgICBodG1sLmVuYWJsZWQgPSB0cnVlCisgICAgICAgIHhtbC5lbmFibGVkID0gZmFsc2UKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvZW52aXJvbm1lbnQuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL2Vudmlyb25tZW50LmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjdlYjFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL2Vudmlyb25tZW50LmdyYWRsZQpAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKworLy8gT3ZlcnJpZGUgdGhlIGJ1aWxkIGRpcmVjdG9yeSBpZiBDTWFrZSBpcyB1c2VkIChhbGxvd3MgZm9yIG91dC1vZi10cmVlLWJ1aWxkcykKK2lmIChoYXNQcm9wZXJ0eSgnYnVpbGQuZGlyJykpIHsKKyAgICBidWlsZERpciA9IGZpbGUocHJvcGVydHkoJ2J1aWxkLmRpcicpKQorfQorCisvLyBJbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIG90aGVyIEFudCBiYXNlZCBidWlsZHMgaW4gdGhlIHN5c3RlbQorLy8gd2UgY29udmVydCB0aGUgZ3JhZGxlLnByb3BlcnRpZXMgaW50byBEU0wgZnJpZW5kbHkgY2FtZWxDYXNlZCBwcm9wZXJ0aWVzCitleHQuaW5zdGFsbFBhdGggPSBwcm9wZXJ0eSgnaW5zdGFsbC5wYXRoJykKK2V4dC5pbnN0YWxsSmF2YWRvY1BhdGggPSBwcm9wZXJ0eSgnaW5zdGFsbC5qYXZhZG9jLnBhdGgnKQorCitleHQudGhyaWZ0Um9vdCA9IGZpbGUoJy4uLy4uJykKKworaWYgKGhhc1Byb3BlcnR5KCd0aHJpZnQuY29tcGlsZXInKSkgeworICAgIGV4dC50aHJpZnRDb21waWxlciA9IHByb3BlcnR5KCd0aHJpZnQuY29tcGlsZXInKQorfSBlbHNlIHsKKyAgICBleHQudGhyaWZ0Q29tcGlsZXIgPSAiJHRocmlmdFJvb3QvY29tcGlsZXIvY3BwL3RocmlmdCIKK30KKworZXh0Lm12blJlcG8gPSBwcm9wZXJ0eSgnbXZuLnJlcG8nKQorZXh0LmFwYWNoZVJlcG8gPSBwcm9wZXJ0eSgnYXBhY2hlLnJlcG8nKQorZXh0Lm1hdmVuUmVwb3NpdG9yeVVybCA9IHByb3BlcnR5KCdtYXZlbi1yZXBvc2l0b3J5LXVybCcpCisKKy8vIFZlcnNpb25zIHVzZWQgaW4gdGhpcyBwcm9qZWN0CitleHQuaHR0cGNsaWVudFZlcnNpb24gPSBwcm9wZXJ0eSgnaHR0cGNsaWVudC52ZXJzaW9uJykKK2V4dC5odHRwY29yZVZlcnNpb24gPSBwcm9wZXJ0eSgnaHR0cGNvcmUudmVyc2lvbicpCitleHQuc2VydmxldFZlcnNpb24gPSBwcm9wZXJ0eSgnc2VydmxldC52ZXJzaW9uJykKK2V4dC5zbGY0alZlcnNpb24gPSBwcm9wZXJ0eSgnc2xmNGoudmVyc2lvbicpCitleHQuanVuaXRWZXJzaW9uID0gcHJvcGVydHkoJ2p1bml0LnZlcnNpb24nKQorZXh0Lm1vY2tpdG9WZXJzaW9uID0gcHJvcGVydHkoJ21vY2tpdG8udmVyc2lvbicpCisKKy8vIEluIHRoaXMgc2VjdGlvbiB5b3UgZGVjbGFyZSB3aGVyZSB0byBmaW5kIHRoZSBkZXBlbmRlbmNpZXMgb2YgeW91ciBwcm9qZWN0CityZXBvc2l0b3JpZXMgeworICAgIG1hdmVuIHsKKyAgICAgICAgbmFtZSAnTWF2ZW4gQ2VudHJhbCBSZXBvc2l0b3J5JworICAgICAgICB1cmwgbXZuUmVwbworICAgIH0KKyAgICBtYXZlbiB7CisgICAgICAgIG5hbWUgJ0FwYWNoZSBNYXZlbiBSZXBvc2l0b3J5JworICAgICAgICB1cmwgYXBhY2hlUmVwbworICAgIH0KK30KKworZGVwZW5kZW5jaWVzIHsKKyAgICBjb21waWxlICJvcmcuc2xmNGo6c2xmNGotYXBpOiR7c2xmNGpWZXJzaW9ufSIKKyAgICBjb21waWxlICJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzOmh0dHBjbGllbnQ6JHtodHRwY2xpZW50VmVyc2lvbn0iCisgICAgY29tcGlsZSAib3JnLmFwYWNoZS5odHRwY29tcG9uZW50czpodHRwY29yZToke2h0dHBjb3JlVmVyc2lvbn0iCisgICAgY29tcGlsZSAiamF2YXguc2VydmxldDpzZXJ2bGV0LWFwaToke3NlcnZsZXRWZXJzaW9ufSIKKworICAgIHRlc3RDb21waWxlICJqdW5pdDpqdW5pdDoke2p1bml0VmVyc2lvbn0iCisgICAgdGVzdENvbXBpbGUgIm9yZy5tb2NraXRvOm1vY2tpdG8tYWxsOiR7bW9ja2l0b1ZlcnNpb259IgorICAgIHRlc3RSdW50aW1lICJvcmcuc2xmNGo6c2xmNGotbG9nNGoxMjoke3NsZjRqVmVyc2lvbn0iCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvZnVuY3Rpb25hbFRlc3RzLmdyYWRsZSBiL2xpYi9qYXZhL2dyYWRsZS9mdW5jdGlvbmFsVGVzdHMuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MjBkMTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvZnVuY3Rpb25hbFRlc3RzLmdyYWRsZQpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBGb2xsb3dpbmcgR3JhZGxlIGJlc3QgcHJhY3RpY2VzIHRvIGtlZXAgYnVpbGQgbG9naWMgb3JnYW5pemVkCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZ1bmN0aW9uYWwgdGVzdGluZyBoYXJuZXNzIGNyZWF0aW9uLiBUaGlzIGhlbHBzIHJ1biB0aGUgY3Jvc3MtY2hlY2sgdGVzdHMuCisvLyBUaGUgTWFrZWZpbGUgcHJlY3Jvc3MgdGFyZ2V0IGludm9rZXMgdGhlIHNoYWRvd0phciB0YXNrIGFuZCB0aGUgdGVzdHMuanNvbgorLy8gY29kZSBpcyBjaGFuZ2VkIHRvIGNhbGwgcnVuY2xpZW50IG9yIHJ1bnNlcnZlciBhcyBuZWVkZWQuCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENyb3NzIFRlc3Qgc291cmNlcyBhcmUgc2VwYXJhdGVkIGluIHRoZWlyIG93biBzb3VyY2VTZXQKKy8vCitzb3VyY2VTZXRzIHsKKyAgICBjcm9zc1Rlc3QgeworICAgICAgICBqYXZhIHsKKyAgICAgICAgICAgIHNyY0RpciAndGVzdCcKKyAgICAgICAgICAgIGluY2x1ZGUgJyoqL3Rlc3QvVGVzdENsaWVudC5qYXZhJworICAgICAgICAgICAgaW5jbHVkZSAnKiovdGVzdC9UZXN0U2VydmVyLmphdmEnCisgICAgICAgICAgICBpbmNsdWRlICcqKi90ZXN0L1Rlc3ROb25ibG9ja2luZ1NlcnZlci5qYXZhJworICAgICAgICB9CisgICAgfQorfQorCitjb25maWd1cmF0aW9ucyB7CisgICAgY3Jvc3NUZXN0Q29tcGlsZSB7IGV4dGVuZHNGcm9tIHRlc3RDb21waWxlIH0KKyAgICBjcm9zc1Rlc3RSdW50aW1lIHsgZXh0ZW5kc0Zyb20gY3Jvc3NUZXN0Q29tcGlsZSwgdGVzdFJ1bnRpbWUgfQorfQorCitkZXBlbmRlbmNpZXMgeworICAgIGNyb3NzVGVzdENvbXBpbGUgc291cmNlU2V0cy5tYWluLm91dHB1dAorICAgIGNyb3NzVGVzdENvbXBpbGUgc291cmNlU2V0cy50ZXN0Lm91dHB1dAorfQorCisvLyBJIGFtIHVzaW5nIHNoYWRvdyBwbHVnaW4gdG8gbWFrZSBhIHNlbGYgY29udGFpbmVkIGZ1bmN0aW9uYWwgdGVzdCBVYmVyIEpBUiB0aGF0CisvLyBlbGltaW5hdGVzIHN0YXJ0dXAgcHJvYmxlbXMgd2l0aCB3cmFwcGluZyB0aGUgY3Jvc3MtY2hlY2sgaGFybmVzcyBpbiBHcmFkbGUuCisvLyBUaGlzIGlzIHVzZWQgYnkgdGhlIHJ1bm5lciBzY3JpcHRzIGFzIHRoZSBzaW5nbGUgY2xhc3NwYXRoIGVudHJ5IHdoaWNoCisvLyBhbGxvd3MgdGhlIHByb2Nlc3MgdG8gYmUgYXMgbGlnaHR3ZWlnaHQgYXMgaXQgY2FuLgorc2hhZG93SmFyIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdBc3NlbWJsZSBhIHRlc3QgSkFSIGZpbGUgZm9yIGNyb3NzLWNoZWNrIGV4ZWN1dGlvbicKKyAgICAvLyBtYWtlIHN1cmUgdGhlIHJ1bm5lcnMgYXJlIGNyZWF0ZWQgd2hlbiB0aGlzIHJ1bnMKKyAgICBkZXBlbmRzT24gJ2dlbmVyYXRlUnVubmVyU2NyaXB0Rm9yQ2xpZW50JywgJ2dlbmVyYXRlUnVubmVyU2NyaXB0Rm9yU2VydmVyJywgJ2dlbmVyYXRlUnVubmVyU2NyaXB0Rm9yTm9uYmxvY2tpbmdTZXJ2ZXInCisKKyAgICBiYXNlTmFtZSA9ICdmdW5jdGlvbmFsVGVzdCcKKyAgICBkZXN0aW5hdGlvbkRpciA9IGZpbGUoIiRidWlsZERpci9mdW5jdGlvbmFsVGVzdEphciIpCisgICAgY2xhc3NpZmllciA9IG51bGwKKworICAgIC8vIFdlIGRvIG5vdCBuZWVkIGEgdmVyc2lvbiBudW1iZXIgZm9yIHRoaXMgaW50ZXJuYWwgamFyCisgICAgdmVyc2lvbiA9IG51bGwKKworICAgIC8vIEJ1bmRsZSB0aGUgY29tcGxldGUgc2V0IG9mIHVuaXQgdGVzdCBjbGFzc2VzIGluY2x1ZGluZyBnZW5lcmF0ZWQgY29kZQorICAgIC8vIGFuZCB0aGUgcnVudGltZSBkZXBlbmRlbmNpZXMgaW4gb25lIEpBUiB0byBleHBlZGl0ZSBleGVjdXRpb24uCisgICAgZnJvbSBzb3VyY2VTZXRzLnRlc3Qub3V0cHV0CisgICAgZnJvbSBzb3VyY2VTZXRzLmNyb3NzVGVzdC5vdXRwdXQKKyAgICBjb25maWd1cmF0aW9ucyA9IFtwcm9qZWN0LmNvbmZpZ3VyYXRpb25zLnRlc3RSdW50aW1lXQorfQorCisvLyBDb21tb24gc2NyaXB0IHJ1bm5lciBjb25maWd1cmF0aW9uIGVsZW1lbnRzCitkZWYgc2NyaXB0RXh0ID0gJycKK2RlZiBleGVjRXh0ID0gJycKK2RlZiBzY3JpcHRIZWFkID0gJyMhL2Jpbi9iYXNoJworZGVmIGFyZ3MgPSAnJConCisKKy8vIEFsdGhvdWdoIHRoaXMgaXMgbWFya2VkIGludGVybmFsIGl0IGlzIGFuIGF2YWlsYWJsZSBhbmQgc3RhYmxlIGludGVyZmFjZQoraWYgKG9yZy5ncmFkbGUuaW50ZXJuYWwub3MuT3BlcmF0aW5nU3lzdGVtLmN1cnJlbnQoKS53aW5kb3dzKSB7CisgICAgc2NyaXB0RXh0ID0gJy5iYXQnCisgICAgZXhlY0V4dCA9ICcuZXhlJworICAgIHNjcmlwdEhlYWQgPSAnQGVjaG8gb2ZmJworICAgIGFyZ3MgPSAnJSonCit9CisKKy8vIFRoZSBKYXZhIGV4ZWN1dGFibGUgdG8gdXNlIHdpdGggdGhlIHJ1bm5lciBzY3JpcHRzCitkZWYgamF2YUV4ZSA9IGZpbGUoIiR7U3lzdGVtLmdldFByb3BlcnR5KCdqYXZhLmhvbWUnKX0vYmluL2phdmEke2V4ZWNFeHR9IikuY2Fub25pY2FsUGF0aAorLy8gVGhlIGNvbW1vbiBVYmVyIGphciBwYXRoCitkZWYgamFyUGF0aCA9IHNoYWRvd0phci5hcmNoaXZlUGF0aC5jYW5vbmljYWxQYXRoCitkZWYgdHJ1c3RTdG9yZSA9IGZpbGUoJ3Rlc3QvLnRydXN0c3RvcmUnKS5jYW5vbmljYWxQYXRoCitkZWYga2V5U3RvcmUgPSBmaWxlKCd0ZXN0Ly5rZXlzdG9yZScpLmNhbm9uaWNhbFBhdGgKKwordGFzayBnZW5lcmF0ZVJ1bm5lclNjcmlwdEZvckNsaWVudChncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIGEgcnVubmVyIHNjcmlwdCBmb3IgY3Jvc3MtY2hlY2sgdGVzdHMgd2l0aCBUZXN0Q2xpZW50JworCisgICAgZGVmIGNsaWVudEZpbGUgPSBmaWxlKCIkYnVpbGREaXIvcnVuY2xpZW50JHtzY3JpcHRFeHR9IikKKworICAgIGRlZiBydW5DbGllbnRUZXh0ID0gIiIiXAorJHtzY3JpcHRIZWFkfQorCisiJHtqYXZhRXhlfSIgLWNwICIkamFyUGF0aCIgIi1EamF2YXgubmV0LnNzbC50cnVzdFN0b3JlPSR0cnVzdFN0b3JlIiAtRGphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkPXRocmlmdCBvcmcuYXBhY2hlLnRocmlmdC50ZXN0LlRlc3RDbGllbnQgJGFyZ3MKKyIiIgorICAgIGlucHV0cy5wcm9wZXJ0eSAncnVuQ2xpZW50VGV4dCcsIHJ1bkNsaWVudFRleHQKKyAgICBvdXRwdXRzLmZpbGUgY2xpZW50RmlsZQorCisgICAgZG9MYXN0IHsKKyAgICAgICAgY2xpZW50RmlsZS5wYXJlbnRGaWxlLm1rZGlycygpCisgICAgICAgIGNsaWVudEZpbGUudGV4dCA9IHJ1bkNsaWVudFRleHQKKyAgICAgICAgY2xpZW50RmlsZS5zZXRFeGVjdXRhYmxlKHRydWUsIGZhbHNlKQorICAgIH0KK30KKwordGFzayBnZW5lcmF0ZVJ1bm5lclNjcmlwdEZvclNlcnZlcihncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIGEgcnVubmVyIHNjcmlwdCBmb3IgY3Jvc3MtY2hlY2sgdGVzdHMgd2l0aCBUZXN0U2VydmVyJworCisgICAgZGVmIHNlcnZlckZpbGUgPSBmaWxlKCIkYnVpbGREaXIvcnVuc2VydmVyJHtzY3JpcHRFeHR9IikKKworICAgIGRlZiBydW5TZXJ2ZXJUZXh0ID0gIiIiXAorJHtzY3JpcHRIZWFkfQorCisiJHtqYXZhRXhlfSIgLWNwICIkamFyUGF0aCIgIi1EamF2YXgubmV0LnNzbC5rZXlTdG9yZT0ka2V5U3RvcmUiIC1EamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkPXRocmlmdCBvcmcuYXBhY2hlLnRocmlmdC50ZXN0LlRlc3RTZXJ2ZXIgJGFyZ3MKKyIiIgorCisgICAgaW5wdXRzLnByb3BlcnR5ICdydW5TZXJ2ZXJUZXh0JywgcnVuU2VydmVyVGV4dAorICAgIG91dHB1dHMuZmlsZSBzZXJ2ZXJGaWxlCisKKyAgICBkb0xhc3QgeworICAgICAgICBzZXJ2ZXJGaWxlLnBhcmVudEZpbGUubWtkaXJzKCkKKyAgICAgICAgc2VydmVyRmlsZS50ZXh0ID0gcnVuU2VydmVyVGV4dAorICAgICAgICBzZXJ2ZXJGaWxlLnNldEV4ZWN1dGFibGUodHJ1ZSwgZmFsc2UpCisgICAgfQorfQorCit0YXNrIGdlbmVyYXRlUnVubmVyU2NyaXB0Rm9yTm9uYmxvY2tpbmdTZXJ2ZXIoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSBhIHJ1bm5lciBzY3JpcHQgZm9yIGNyb3NzLWNoZWNrIHRlc3RzIHdpdGggVGVzdE5vbmJsb2NraW5nU2VydmVyJworCisgICAgZGVmIHNlcnZlckZpbGUgPSBmaWxlKCIkYnVpbGREaXIvcnVubm9uYmxvY2tpbmdzZXJ2ZXIke3NjcmlwdEV4dH0iKQorCisgICAgZGVmIHJ1blNlcnZlclRleHQgPSAiIiJcCiske3NjcmlwdEhlYWR9CisKKyIke2phdmFFeGV9IiAtY3AgIiRqYXJQYXRoIiAiLURqYXZheC5uZXQuc3NsLmtleVN0b3JlPSRrZXlTdG9yZSIgLURqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQ9dGhyaWZ0IG9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuVGVzdE5vbmJsb2NraW5nU2VydmVyICRhcmdzCisiIiIKKworICAgIGlucHV0cy5wcm9wZXJ0eSAncnVuU2VydmVyVGV4dCcsIHJ1blNlcnZlclRleHQKKyAgICBvdXRwdXRzLmZpbGUgc2VydmVyRmlsZQorCisgICAgZG9MYXN0IHsKKyAgICAgICAgc2VydmVyRmlsZS5wYXJlbnRGaWxlLm1rZGlycygpCisgICAgICAgIHNlcnZlckZpbGUudGV4dCA9IHJ1blNlcnZlclRleHQKKyAgICAgICAgc2VydmVyRmlsZS5zZXRFeGVjdXRhYmxlKHRydWUsIGZhbHNlKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS9nZW5lcmF0ZVRlc3RUaHJpZnQuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL2dlbmVyYXRlVGVzdFRocmlmdC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI1MzczOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS9nZW5lcmF0ZVRlc3RUaHJpZnQuZ3JhZGxlCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKworLy8gR2VuZXJhdGVkIGNvZGUgbG9jYXRpb25zIGZvciBVbml0IHRlc3RzCitleHQuZ2VuU3JjID0gZmlsZSgiJGJ1aWxkRGlyL2dlbi1qYXZhIikKK2V4dC5nZW5CZWFuU3JjID0gZmlsZSgiJGJ1aWxkRGlyL2dlbi1qYXZhYmVhbiIpCitleHQuZ2VuUmV1c2VTcmMgPSBmaWxlKCIkYnVpbGREaXIvZ2VuLWphdmFyZXVzZSIpCitleHQuZ2VuRnVsbENhbWVsU3JjID0gZmlsZSgiJGJ1aWxkRGlyL2dlbi1mdWxsY2FtZWwiKQorZXh0LmdlblVuc2FmZVNyYyA9IGZpbGUoIiRidWlsZERpci9nZW4tdW5zYWZlIikKKworLy8gQWRkIHRoZSBnZW5lcmF0ZWQgY29kZSBkaXJlY3RvcmllcyB0byB0aGUgdGVzdCBzb3VyY2Ugc2V0Citzb3VyY2VTZXRzIHsKKyAgICB0ZXN0LmphdmEuc3JjRGlycyBnZW5TcmMsIGdlbkJlYW5TcmMsIGdlblJldXNlU3JjLCBnZW5GdWxsQ2FtZWxTcmMsIGdlblVuc2FmZVNyYworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGdlbmVyYXRpb24gZm9yIFVuaXQgVGVzdGluZworCisvLyBBIGNhbGxhYmxlIGNsb3N1cmUgdG8gbWFrZSB0aGlzIGVhc2llcgorZXh0LnRocmlmdENvbXBpbGUgPSB7IFRhc2sgdGFzaywgU3RyaW5nIHRocmlmdEZpbGVOYW1lLCBTdHJpbmcgZ2VuZXJhdG9yID0gJ2phdmEnLCBGaWxlIG91dHB1dERpciA9IGdlblNyYyAtPgorICAgIGRlZiB0aHJpZnRGaWxlID0gZmlsZSgiJHRocmlmdFJvb3QvdGVzdC8kdGhyaWZ0RmlsZU5hbWUiKQorICAgIGFzc2VydCB0aHJpZnRGaWxlLmV4aXN0cygpCisKKyAgICB0YXNrLmlucHV0cy5maWxlIHRocmlmdEZpbGUKKyAgICB0YXNrLm91dHB1dHMuZGlyIG91dHB1dERpcgorCisgICAgdGFzay5kb0xhc3QgeworICAgICAgICBvdXRwdXREaXIubWtkaXJzKCkKKyAgICAgICAgZGVmIHJlc3VsdCA9IGV4ZWMgeworICAgICAgICAgICAgZXhlY3V0YWJsZSBmaWxlKHRocmlmdENvbXBpbGVyKQorICAgICAgICAgICAgYXJncyAnLS1nZW4nLCBnZW5lcmF0b3IKKyAgICAgICAgICAgIGFyZ3MgJy1vdXQnLCBvdXRwdXREaXIKKyAgICAgICAgICAgIGFyZ3MgdGhyaWZ0RmlsZQorICAgICAgICAgICAgc3RhbmRhcmRPdXRwdXQgPSB0YXNrLm91dHB1dEJ1ZmZlcgorICAgICAgICAgICAgZXJyb3JPdXRwdXQgPSB0YXNrLm91dHB1dEJ1ZmZlcgorICAgICAgICAgICAgaWdub3JlRXhpdFZhbHVlID0gdHJ1ZQorICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQuZXhpdFZhbHVlICE9IDApIHsKKyAgICAgICAgICAgIC8vIE9ubHkgc2hvdyB0aGUgVGhyaWZ0IGNvbXBpbGVyIG91dHB1dCBvbiBmYWlsdXJlcywgY3V0cyBkb3duIG9uIG5vaXNlIQorICAgICAgICAgICAgcHJpbnRsbiB0YXNrLm91dHB1dEJ1ZmZlci50b1N0cmluZygpCisgICAgICAgICAgICByZXN1bHQucmV0aHJvd0ZhaWx1cmUoKQorICAgICAgICB9CisgICAgfQorfQorCit0YXNrIGdlbmVyYXRlKGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgYWxsIHVuaXQgdGVzdCBUaHJpZnQgc291cmNlcycKKyAgICBjb21waWxlVGVzdEphdmEuZGVwZW5kc09uIGl0Cit9CisKK3Rhc2sgZ2VuZXJhdGVKYXZhKGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgdGhlIHRocmlmdCBnZW4tamF2YSBzb3VyY2UnCisgICAgZ2VuZXJhdGUuZGVwZW5kc09uIGl0CisKKyAgICBleHQub3V0cHV0QnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCisKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnVGhyaWZ0VGVzdC50aHJpZnQnKQorICAgIHRocmlmdENvbXBpbGUoaXQsICdKYXZhVHlwZXMudGhyaWZ0JykKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnRGVidWdQcm90b1Rlc3QudGhyaWZ0JykKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQnKQorICAgIHRocmlmdENvbXBpbGUoaXQsICdPcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQnKQorICAgIHRocmlmdENvbXBpbGUoaXQsICdNYW55T3B0aW9uYWxzLnRocmlmdCcpCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ0phdmFEZWVwQ29weVRlc3QudGhyaWZ0JykKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnRW51bUNvbnRhaW5lcnNUZXN0LnRocmlmdCcpCit9CisKK3Rhc2sgZ2VuZXJhdGVCZWFuSmF2YShncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIHRoZSB0aHJpZnQgZ2VuLWphdmFiZWFuIHNvdXJjZScKKyAgICBnZW5lcmF0ZS5kZXBlbmRzT24gaXQKKworICAgIGV4dC5vdXRwdXRCdWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkKKworICAgIHRocmlmdENvbXBpbGUoaXQsICdKYXZhQmVhbnNUZXN0LnRocmlmdCcsICdqYXZhOmJlYW5zLG5vY2FtZWwnLCBnZW5CZWFuU3JjKQorfQorCit0YXNrIGdlbmVyYXRlUmV1c2VKYXZhKGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgdGhlIHRocmlmdCBnZW4tamF2YXJldXNlIHNvdXJjZScKKyAgICBnZW5lcmF0ZS5kZXBlbmRzT24gaXQKKworICAgIGV4dC5vdXRwdXRCdWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkKKworICAgIHRocmlmdENvbXBpbGUoaXQsICdGdWxsQ2FtZWxUZXN0LnRocmlmdCcsICdqYXZhOmZ1bGxjYW1lbCcsIGdlbkZ1bGxDYW1lbFNyYykKK30KKwordGFzayBnZW5lcmF0ZUZ1bGxDYW1lbEphdmEoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSB0aGUgdGhyaWZ0IGdlbi1mdWxsY2FtZWwgc291cmNlJworICAgIGdlbmVyYXRlLmRlcGVuZHNPbiBpdAorCisgICAgZXh0Lm91dHB1dEJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKQorCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ1JldXNlT2JqZWN0cy50aHJpZnQnLCAnamF2YTpyZXVzZS1vYmplY3RzJywgZ2VuUmV1c2VTcmMpCit9CisKK3Rhc2sgZ2VuZXJhdGVVbnNhZmVCaW5hcmllc0phdmEoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSB0aGUgdGhyaWZ0IGdlbi11bnNhZmViaW5hcmllcyBzb3VyY2UnCisgICAgZ2VuZXJhdGUuZGVwZW5kc09uIGl0CisKKyAgICBleHQub3V0cHV0QnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCisKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnVW5zYWZlVHlwZXMudGhyaWZ0JywgJ2phdmE6dW5zYWZlX2JpbmFyaWVzJywgZ2VuVW5zYWZlU3JjKQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlL3B1Ymxpc2hpbmcuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL3B1Ymxpc2hpbmcuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMDQwNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvcHVibGlzaGluZy5ncmFkbGUKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRm9sbG93aW5nIEdyYWRsZSBiZXN0IHByYWN0aWNlcyB0byBrZWVwIGJ1aWxkIGxvZ2ljIG9yZ2FuaXplZAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnN0YWxsYXRpb24gc3VidGFza3MsIG5vdCB1c2VkIGN1cnJlbnRseSwgd2UgdXNlICJtYWtlIGluc3RhbGwvZmFzdCIKK3Rhc2sgaW5zdGFsbERpc3QodHlwZTogQ29weSwgZ3JvdXA6ICdJbnN0YWxsJykgeworICAgIGRlc2NyaXB0aW9uID0gIkNvcHkgVGhyaWZ0IEpBUiBhbmQgZGVwZW5kZW5jaWVzIGludG8gJGluc3RhbGxQYXRoIGxvY2F0aW9uIgorCisgICAgZGVzdGluYXRpb25EaXIgPSBmaWxlKGluc3RhbGxQYXRoKQorCisgICAgZnJvbSBqYXIKKyAgICBmcm9tIGNvbmZpZ3VyYXRpb25zLmNvbXBpbGUKK30KKwordGFzayBpbnN0YWxsSmF2YWRvYyh0eXBlOiBDb3B5LCBncm91cDogJ0luc3RhbGwnLCBkZXBlbmRzT246IGphdmFkb2MpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICJJbnN0YWxsIFRocmlmdCBKYXZhRG9jIGludG8gJGluc3RhbGxKYXZhZG9jUGF0aCBsb2NhdGlvbiIKKworICAgIGRlc3RpbmF0aW9uRGlyID0gZmlsZShpbnN0YWxsSmF2YWRvY1BhdGgpCisKKyAgICBmcm9tIGphdmFkb2MuZGVzdGluYXRpb25EaXIKK30KKworLy8gVGhpcyBpcyBub3QgbmVlZGVkIGJ5IEdyYWRsZSBidWlsZHMgYnV0IHRoZSByZW1haW5pbmcgQW50IGJ1aWxkcyBzZWVtIHRvCisvLyBuZWVkIGFjY2VzcyB0byB0aGUgZ2VuZXJhdGVkIHRlc3QgY2xhc3NlcyBmb3IgVGhyaWZ0IHVuaXQgdGVzdHMgc28gd2UKKy8vIGFzc2lzdCB0aGVtIHRvIHVzZSBpdCB0aGlzIHdheS4KK3Rhc2sgY29weURlcGVuZGVuY2llcyh0eXBlOiBDb3B5LCBncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0NvcHkgcnVudGltZSBkZXBlbmRlbmNpZXMgaW4gYSBjb21tb24gbG9jYXRpb24gZm9yIG90aGVyIEFudCBiYXNlZCBwcm9qZWN0cycKKyAgICBwcm9qZWN0LmFzc2VtYmxlLmRlcGVuZHNPbiBpdAorCisgICAgZGVzdGluYXRpb25EaXIgPSBmaWxlKCIkYnVpbGREaXIvZGVwcyIpCisgICAgZnJvbSBjb25maWd1cmF0aW9ucy50ZXN0UnVudGltZQorICAgIC8vIGV4Y2x1ZGUgc29tZSB2ZXJ5IHNwZWNpZmljIHVuaXQgdGVzdCBkZXBlbmRlbmNpZXMKKyAgICBleGNsdWRlICcqKi9qdW5pdCouamFyJywgJyoqL21vY2tpdG8qLmphcicsICcqKi9oYW1jcmVzdCouamFyJworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBbGxvdyB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gYmUgc2hhcmVkIGJldHdlZW4gaW5zdGFsbCBhbmQgdXBsb2FkQXJjaGl2ZXMgdGFza3MKK2RlZiBjb25maWd1cmVQb20ocG9tKSB7CisgICAgcG9tLnByb2plY3QgeworICAgICAgICBuYW1lICdBcGFjaGUgVGhyaWZ0JworICAgICAgICBkZXNjcmlwdGlvbiAnVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcyBkZXZlbG9wbWVudC4nCisgICAgICAgIHBhY2thZ2luZyAnamFyJworICAgICAgICB1cmwgJ2h0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZycKKworICAgICAgICBzY20geworICAgICAgICAgICAgdXJsICdodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQnCisgICAgICAgICAgICBjb25uZWN0aW9uICdzY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCcKKyAgICAgICAgICAgIGRldmVsb3BlckNvbm5lY3Rpb24gJ3NjbTpnaXQ6aHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0JworICAgICAgICB9CisKKyAgICAgICAgbGljZW5zZXMgeworICAgICAgICAgICAgbGljZW5zZSB7CisgICAgICAgICAgICAgICAgbmFtZSAnVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCcKKyAgICAgICAgICAgICAgICB1cmwgIiR7cHJvamVjdC5saWNlbnNlfSIKKyAgICAgICAgICAgICAgICBkaXN0cmlidXRpb24gJ3JlcG8nCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkZXZlbG9wZXJzIHsKKyAgICAgICAgICAgIGRldmVsb3BlciB7CisgICAgICAgICAgICAgICAgaWQgJ2RldicKKyAgICAgICAgICAgICAgICBuYW1lICdBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMnCisgICAgICAgICAgICAgICAgZW1haWwgJ2RldkB0aHJpZnQuYXBhY2hlLm9yZycKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHBvbS53aGVuQ29uZmlndXJlZCB7CisgICAgICAgIC8vIEZpeHVwIHRoZSBzY29wZSBmb3Igc2VydmxldC1hcGkgdG8gYmUgJ3Byb3ZpZGVkJyBpbnN0ZWFkIG9mICdjb21waWxlJworICAgICAgICBkZXBlbmRlbmNpZXMuZmluZCB7IGRlcCAtPiBkZXAuZ3JvdXBJZCA9PSAnamF2YXguc2VydmxldCcgJiYgZGVwLmFydGlmYWN0SWQgPT0gJ3NlcnZsZXQtYXBpJyB9LndpdGggeworICAgICAgICAgICAgLy8gaXQub3B0aW9uYWwgPSB0cnVlCisgICAgICAgICAgICBpdC5zY29wZSA9ICdwcm92aWRlZCcKKyAgICAgICAgfQorICAgIH0KK30KKworaW5zdGFsbCB7CisgICAgcmVwb3NpdG9yaWVzLm1hdmVuSW5zdGFsbGVyIHsKKyAgICAgICAgY29uZmlndXJlUG9tKHBvbSkKKyAgICB9Cit9CisKK3VwbG9hZEFyY2hpdmVzIHsKKyAgICBkZXBlbmRzT24gdGVzdCAvLyBtYWtlIHN1cmUgd2UgcnVuIHVuaXQgdGVzdHMgd2hlbiBwdWJsaXNoaW5nCisgICAgcmVwb3NpdG9yaWVzLm1hdmVuRGVwbG95ZXIgeworICAgICAgICAvLyBzaWduUG9tIHdpbGwgc2lsZW50bHkgZG8gbm90aGluZyB3aGVuIG5vIHNpZ25pbmcgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQKKyAgICAgICAgYmVmb3JlRGVwbG95bWVudCB7IE1hdmVuRGVwbG95bWVudCBkZXBsb3ltZW50IC0+IHNpZ25pbmcuc2lnblBvbShkZXBsb3ltZW50KSB9CisgICAgICAgIHJlcG9zaXRvcnkodXJsOiBwcm9qZWN0Lm1hdmVuUmVwb3NpdG9yeVVybCkgeworICAgICAgICAgICAgaWYgKHByb2plY3QuaGFzUHJvcGVydHkoJ21hdmVuVXNlcicpICYmIHByb2plY3QuaGFzUHJvcGVydHkoJ21hdmVuUGFzc3dvcmQnKSkgeworICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uKHVzZXJOYW1lOiBtYXZlblVzZXIsIHBhc3N3b3JkOiBtYXZlblBhc3N3b3JkKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbmZpZ3VyZVBvbShwb20pCisgICAgfQorfQorCisvLyBTaWduaW5nIGNvbmZpZ3VyYXRpb24sIG9wdGlvbmFsLCBvbmx5IHdoZW4gcmVsZWFzZSBhbmQgdXBsb2FkQXJjaGl2ZXMgaXMgYWN0aXZhdGVkCitzaWduaW5nIHsKKyAgICByZXF1aXJlZCB7ICF2ZXJzaW9uLmVuZHNXaXRoKCJTTkFQU0hPVCIpICYmIGdyYWRsZS50YXNrR3JhcGguaGFzVGFzaygidXBsb2FkQXJjaGl2ZXMiKSB9CisgICAgc2lnbiBjb25maWd1cmF0aW9ucy5hcmNoaXZlcworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlL3NvdXJjZUNvbmZpZ3VyYXRpb24uZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL3NvdXJjZUNvbmZpZ3VyYXRpb24uZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZDAzMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvc291cmNlQ29uZmlndXJhdGlvbi5ncmFkbGUKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBGb2xsb3dpbmcgR3JhZGxlIGJlc3QgcHJhY3RpY2VzIHRvIGtlZXAgYnVpbGQgbG9naWMgb3JnYW5pemVkCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHNvdXJjZSBzZXRzIGZvciBtYWluIGFuZCB0ZXN0IHNvdXJjZXMKK3NvdXJjZVNldHMgeworICAgIG1haW4geworICAgICAgICBqYXZhIHsKKyAgICAgICAgICAgIHNyY0RpciAnc3JjJworICAgICAgICB9CisgICAgfQorICAgIHRlc3QgeworICAgICAgICBqYXZhIHsKKyAgICAgICAgICAgIHNyY0RpciAndGVzdCcKKyAgICAgICAgICAgIC8vIHNlZSBmdW5jdGlvbmFsVGVzdHMuZ3JhZGxlIGZvciB0aGVzZSBmaWxlcworICAgICAgICAgICAgZXhjbHVkZSAnKiovdGVzdC9UZXN0Q2xpZW50LmphdmEnCisgICAgICAgICAgICBleGNsdWRlICcqKi90ZXN0L1Rlc3RTZXJ2ZXIuamF2YScKKyAgICAgICAgICAgIGV4Y2x1ZGUgJyoqL3Rlc3QvVGVzdE5vbmJsb2NraW5nU2VydmVyLmphdmEnCisgICAgICAgIH0KKyAgICAgICAgcmVzb3VyY2VzIHsKKyAgICAgICAgICAgIHNyY0RpciAndGVzdCcKKyAgICAgICAgICAgIGluY2x1ZGUgJ2xvZzRqLnByb3BlcnRpZXMnCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbXBpbGVyIGNvbmZpZ3VyYXRpb24gZGV0YWlscworCitzb3VyY2VDb21wYXRpYmlsaXR5ID0gJzEuOCcKK3RhcmdldENvbXBhdGliaWxpdHkgPSAnMS44JworCit0YXNrcy53aXRoVHlwZShKYXZhQ29tcGlsZSkgeworICAgIG9wdGlvbnMuZW5jb2RpbmcgPSAnVVRGLTgnCisgICAgb3B0aW9ucy5kZWJ1ZyA9IHRydWUKKyAgICBvcHRpb25zLmRlcHJlY2F0aW9uID0gdHJ1ZQorICAgIC8vIG9wdGlvbnMuY29tcGlsZXJBcmdzLmFkZEFsbCgnLVhsaW50OnVuY2hlY2tlZCcpCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEphciBwYWNrYWdpbmcgZGV0YWlscworcHJvY2Vzc1Jlc291cmNlcyB7CisgICAgaW50bygnTUVUQS1JTkYnKSB7CisgICAgICAgIGZyb20gIiR0aHJpZnRSb290L0xJQ0VOU0UiCisgICAgICAgIGZyb20gIiR0aHJpZnRSb290L05PVElDRSIKKyAgICAgICAgcmVuYW1lKCcoLispJywgJyQxLnR4dCcpCisgICAgfQorfQorCitqYXIgeworICAgIHByb2plY3QudGVzdC5kZXBlbmRzT24gaXQKKyAgICBtYW5pZmVzdCB7CisgICAgICAgIGF0dHJpYnV0ZXMoWworICAgICAgICAgICAgIkltcGxlbWVudGF0aW9uLVZlcnNpb24iOiAiJHtwcm9qZWN0LnZlcnNpb259IiwKKyAgICAgICAgICAgICJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIjogIjIiLAorICAgICAgICAgICAgIkJ1bmRsZS1TeW1ib2xpY05hbWUiOiAiJHtwcm9qZWN0Lmdyb3VwfSIsCisgICAgICAgICAgICAiQnVuZGxlLU5hbWUiOiAiQXBhY2hlIFRocmlmdCIsCisgICAgICAgICAgICAiQnVuZGxlLVZlcnNpb24iOiAiJHtwcm9qZWN0LnZlcnNpb259IiwKKyAgICAgICAgICAgICJCdW5kbGUtRGVzY3JpcHRpb24iOiAiQXBhY2hlIFRocmlmdCBsaWJyYXJ5IiwKKyAgICAgICAgICAgICJCdW5kbGUtTGljZW5zZSI6ICIke3Byb2plY3QubGljZW5zZX0iLAorICAgICAgICAgICAgIkJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5IjogImxhenkiLAorICAgICAgICAgICAgIkV4cG9ydC1QYWNrYWdlIjogIiR7cHJvamVjdC5ncm91cH0uYXN5bmM7dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sLCR7cHJvamVjdC5ncm91cH0udHJhbnNwb3J0LG9yZy5zbGY0aiwke3Byb2plY3QuZ3JvdXB9XCI7dmVyc2lvbj1cIiR7dmVyc2lvbn1cIiwke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sO3VzZXM6PVwiJHtwcm9qZWN0Lmdyb3VwfS50cmFuc3BvcnQsJHtwcm9qZWN0Lmdyb3VwfSwke3Byb2plY3QuZ3JvdXB9LnNjaGVtZVwiO3ZlcnNpb249XCIke3ZlcnNpb259XCIsJHtwcm9qZWN0Lmdyb3VwfS5zZXJ2ZXI7dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9LnRyYW5zcG9ydCwke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sLCR7cHJvamVjdC5ncm91cH0sb3JnLnNsZjRqLGphdmF4LnNlcnZsZXQsamF2YXguc2VydmxldC5odHRwXCI7dmVyc2lvbj1cIiR7dmVyc2lvbn1cIiwke3Byb2plY3QuZ3JvdXB9LnRyYW5zcG9ydDt1c2VzOj1cIiR7cHJvamVjdC5ncm91cH0ucHJvdG9jb2wsJHtwcm9qZWN0Lmdyb3VwfSxvcmcuYXBhY2hlLmh0dHAuY2xpZW50LG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMsb3JnLmFwYWNoZS5odHRwLmVudGl0eSxvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMsb3JnLmFwYWNoZS5odHRwLG9yZy5zbGY0aixqYXZheC5uZXQuc3NsLGphdmF4Lm5ldCxqYXZheC5zZWN1cml0eS5zYXNsLGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2tcIjt2ZXJzaW9uPVwiJHt2ZXJzaW9ufVwiLCR7cHJvamVjdC5ncm91cH07dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sLCR7cHJvamVjdC5ncm91cH0uYXN5bmMsJHtwcm9qZWN0Lmdyb3VwfS5zZXJ2ZXIsJHtwcm9qZWN0Lmdyb3VwfS50cmFuc3BvcnQsb3JnLnNsZjRqLG9yZy5hcGFjaGUubG9nNGosJHtwcm9qZWN0Lmdyb3VwfS5zY2hlbWVcIjt2ZXJzaW9uPVwiJHt2ZXJzaW9ufVwiLCR7cHJvamVjdC5ncm91cH0ubWV0YV9kYXRhO3VzZXM6PVwiJHtwcm9qZWN0Lmdyb3VwfVwiO3ZlcnNpb249XCIke3ZlcnNpb259XCIsJHtwcm9qZWN0Lmdyb3VwfS5zY2hlbWU7dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sLCR7cHJvamVjdC5ncm91cH1cIjt2ZXJzaW9uPVwiJHt2ZXJzaW9ufVwiIiwKKyAgICAgICAgICAgICJJbXBvcnQtUGFja2FnZSI6ICJqYXZheC5uZXQsamF2YXgubmV0LnNzbCxqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLGphdmF4LnNlY3VyaXR5LnNhc2wsamF2YXguc2VydmxldDtyZXNvbHV0aW9uOj1vcHRpb25hbCxqYXZheC5zZXJ2bGV0Lmh0dHA7cmVzb2x1dGlvbjo9b3B0aW9uYWwsb3JnLnNsZjRqO3Jlc29sdXRpb246PW9wdGlvbmFsO3ZlcnNpb249XCJbMS40LDIpXCIsb3JnLmFwYWNoZS5odHRwLmNsaWVudDtyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuYXBhY2hlLmh0dHAucGFyYW1zO3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy5hcGFjaGUuaHR0cC5lbnRpdHk7cmVzb2x1dGlvbjo9b3B0aW9uYWwsb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzO3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy5hcGFjaGUuaHR0cDtyZXNvbHV0aW9uOj1vcHRpb25hbCIKKyAgICAgICAgXSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvdW5pdFRlc3RzLmdyYWRsZSBiL2xpYi9qYXZhL2dyYWRsZS91bml0VGVzdHMuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZjJmYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvdW5pdFRlc3RzLmdyYWRsZQpAQCAtMCwwICsxLDgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKworLy8gQnVuZGxlIHRoZSB0ZXN0IGNsYXNzZXMgaW4gYSBKQVIgZm9yIG90aGVyIEFudCBiYXNlZCBidWlsZHMKK3Rhc2sgdGVzdEphcih0eXBlOiBKYXIsIGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnQXNzZW1ibGVzIGEgamFyIGFyY2hpdmUgY29udGFpbmluZyB0aGUgdGVzdCBjbGFzc2VzLicKKyAgICBwcm9qZWN0LnRlc3QuZGVwZW5kc09uIGl0CisKKyAgICBjbGFzc2lmaWVyICd0ZXN0JworICAgIGZyb20gc291cmNlU2V0cy50ZXN0Lm91dHB1dAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVbml0IHRlc3QgdGFza3MgYW5kIGNvbmZpZ3VyYXRpb25zCisKKy8vIEhlbHAgdGhlIHVwIHRvIGRhdGUgYWxnb3JpdGhtIHRvIG1ha2UgdGhlc2UgdGVzdHMgZG9uZQorZXh0Lm1hcmtUYXNrRG9uZSA9IHsgdGFzayAtPgorICAgIGRlZiBidWlsZEZpbGUgPSBmaWxlKCIkYnVpbGREaXIvJHt0YXNrLm5hbWV9LmZsYWciKQorICAgIHRhc2suaW5wdXRzLmZpbGVzIHRhc2suY2xhc3NwYXRoCisgICAgdGFzay5vdXRwdXRzLmZpbGUgYnVpbGRGaWxlCisgICAgdGFzay5kb0xhc3QgeworICAgICAgICBidWlsZEZpbGUudGV4dCA9ICdQYXNzZWQhJworICAgIH0KK30KKwordGFzayBkZXByZWNhdGVkRXF1YWxpdHlUZXN0KHR5cGU6IEphdmFFeGVjLCBncm91cDogJ1ZlcmlmaWNhdGlvbicpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdSdW4gdGhlIG5vbi1KVW5pdCB0ZXN0IHN1aXRlICcKKyAgICBjbGFzc3BhdGggPSBzb3VyY2VTZXRzLnRlc3QucnVudGltZUNsYXNzcGF0aAorICAgIG1haW4gJ29yZy5hcGFjaGUudGhyaWZ0LnRlc3QuRXF1YWxpdHlUZXN0JworICAgIG1hcmtUYXNrRG9uZShpdCkKK30KKwordGFzayBkZXByZWNhdGVkSmF2YUJlYW5zVGVzdCh0eXBlOiBKYXZhRXhlYywgZ3JvdXA6ICdWZXJpZmljYXRpb24nKSB7CisgICAgZGVzY3JpcHRpb24gPSAnUnVuIHRoZSBub24tSlVuaXQgdGVzdCBzdWl0ZSAnCisgICAgY2xhc3NwYXRoID0gc291cmNlU2V0cy50ZXN0LnJ1bnRpbWVDbGFzc3BhdGgKKyAgICBtYWluICdvcmcuYXBhY2hlLnRocmlmdC50ZXN0LkphdmFCZWFuc1Rlc3QnCisgICAgbWFya1Rhc2tEb25lKGl0KQorfQorCisvLyBNYWluIFVuaXQgVGVzdCB0YXNrIGNvbmZpZ3VyYXRpb24KK3Rlc3QgeworICAgIGRlc2NyaXB0aW9uPSJSdW4gdGhlIGZ1bGwgdGVzdCBzdWl0ZSIKKyAgICBkZXBlbmRzT24gZGVwcmVjYXRlZEVxdWFsaXR5VGVzdCwgZGVwcmVjYXRlZEphdmFCZWFuc1Rlc3QKKworICAgIC8vIEFsbG93IHJlcGVhdGluZyB0ZXN0cyBldmVuIGFmdGVyIHN1Y2Nlc3NmdWwgZXhlY3V0aW9uCisgICAgaWYgKHByb2plY3QuaGFzUHJvcGVydHkoJ3JlcnVuVGVzdHMnKSkgeworICAgICAgICBvdXRwdXRzLnVwVG9EYXRlV2hlbiB7IGZhbHNlIH0KKyAgICB9CisKKyAgICBpbmNsdWRlICcqKi9UZXN0Ki5jbGFzcycKKyAgICBleGNsdWRlICcqKi9UZXN0KlwkKi5jbGFzcycKKworICAgIG1heEhlYXBTaXplID0gJzUxMm0nCisgICAgZm9ya0V2ZXJ5ID0gMQorCisgICAgc3lzdGVtUHJvcGVydGllcyA9IFsKKyAgICAgICAgJ2J1aWxkLnRlc3QnOiAiJHtjb21waWxlVGVzdEphdmEuZGVzdGluYXRpb25EaXJ9IiwKKyAgICAgICAgJ3Rlc3QucG9ydCc6ICIke3Rlc3RQb3J0fSIsCisgICAgICAgICdqYXZheC5uZXQuc3NsLnRydXN0U3RvcmUnOiAiJHtwcm9qZWN0RGlyfS90ZXN0Ly50cnVzdHN0b3JlIiwKKyAgICAgICAgJ2phdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkJzogJ3RocmlmdCcsCisgICAgICAgICdqYXZheC5uZXQuc3NsLmtleVN0b3JlJzogIiR7cHJvamVjdERpcn0vdGVzdC8ua2V5c3RvcmUiLAorICAgICAgICAnamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkJzogJ3RocmlmdCcKKyAgICBdCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIgYi9saWIvamF2YS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzNDBiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzIGIvbGliL2phdmEvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzJiYmU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDUgQEAKK2Rpc3RyaWJ1dGlvbkJhc2U9R1JBRExFX1VTRVJfSE9NRQorZGlzdHJpYnV0aW9uUGF0aD13cmFwcGVyL2Rpc3RzCit6aXBTdG9yZUJhc2U9R1JBRExFX1VTRVJfSE9NRQoremlwU3RvcmVQYXRoPXdyYXBwZXIvZGlzdHMKK2Rpc3RyaWJ1dGlvblVybD1odHRwc1w6Ly9zZXJ2aWNlcy5ncmFkbGUub3JnL2Rpc3RyaWJ1dGlvbnMvZ3JhZGxlLTQuNC4xLWJpbi56aXAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZXcgYi9saWIvamF2YS9ncmFkbGV3Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNjY2RkM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGV3CkBAIC0wLDAgKzEsMTcyIEBACisjIS91c3IvYmluL2VudiBzaAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjCisjIyAgR3JhZGxlIHN0YXJ0IHVwIHNjcmlwdCBmb3IgVU4qWAorIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEF0dGVtcHQgdG8gc2V0IEFQUF9IT01FCisjIFJlc29sdmUgbGlua3M6ICQwIG1heSBiZSBhIGxpbmsKK1BSRz0iJDAiCisjIE5lZWQgdGhpcyBmb3IgcmVsYXRpdmUgc3ltbGlua3MuCit3aGlsZSBbIC1oICIkUFJHIiBdIDsgZG8KKyAgICBscz1gbHMgLWxkICIkUFJHImAKKyAgICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgICAgaWYgZXhwciAiJGxpbmsiIDogJy8uKicgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgUFJHPSIkbGluayIKKyAgICBlbHNlCisgICAgICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgIi8kbGluayIKKyAgICBmaQorZG9uZQorU0FWRUQ9ImBwd2RgIgorY2QgImBkaXJuYW1lIFwiJFBSR1wiYC8iID4vZGV2L251bGwKK0FQUF9IT01FPSJgcHdkIC1QYCIKK2NkICIkU0FWRUQiID4vZGV2L251bGwKKworQVBQX05BTUU9IkdyYWRsZSIKK0FQUF9CQVNFX05BTUU9YGJhc2VuYW1lICIkMCJgCisKKyMgQWRkIGRlZmF1bHQgSlZNIG9wdGlvbnMgaGVyZS4gWW91IGNhbiBhbHNvIHVzZSBKQVZBX09QVFMgYW5kIEdSQURMRV9PUFRTIHRvIHBhc3MgSlZNIG9wdGlvbnMgdG8gdGhpcyBzY3JpcHQuCitERUZBVUxUX0pWTV9PUFRTPSIiCisKKyMgVXNlIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSwgb3Igc2V0IE1BWF9GRCAhPSAtMSB0byB1c2UgdGhhdCB2YWx1ZS4KK01BWF9GRD0ibWF4aW11bSIKKword2FybiAoKSB7CisgICAgZWNobyAiJCoiCit9CisKK2RpZSAoKSB7CisgICAgZWNobworICAgIGVjaG8gIiQqIgorICAgIGVjaG8KKyAgICBleGl0IDEKK30KKworIyBPUyBzcGVjaWZpYyBzdXBwb3J0IChtdXN0IGJlICd0cnVlJyBvciAnZmFsc2UnKS4KK2N5Z3dpbj1mYWxzZQorbXN5cz1mYWxzZQorZGFyd2luPWZhbHNlCitub25zdG9wPWZhbHNlCitjYXNlICJgdW5hbWVgIiBpbgorICBDWUdXSU4qICkKKyAgICBjeWd3aW49dHJ1ZQorICAgIDs7CisgIERhcndpbiogKQorICAgIGRhcndpbj10cnVlCisgICAgOzsKKyAgTUlOR1cqICkKKyAgICBtc3lzPXRydWUKKyAgICA7OworICBOT05TVE9QKiApCisgICAgbm9uc3RvcD10cnVlCisgICAgOzsKK2VzYWMKKworQ0xBU1NQQVRIPSRBUFBfSE9NRS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKKworIyBEZXRlcm1pbmUgdGhlIEphdmEgY29tbWFuZCB0byB1c2UgdG8gc3RhcnQgdGhlIEpWTS4KK2lmIFsgLW4gIiRKQVZBX0hPTUUiIF0gOyB0aGVuCisgICAgaWYgWyAteCAiJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIgXSA7IHRoZW4KKyAgICAgICAgIyBJQk0ncyBKREsgb24gQUlYIHVzZXMgc3RyYW5nZSBsb2NhdGlvbnMgZm9yIHRoZSBleGVjdXRhYmxlcworICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIgorICAgIGVsc2UKKyAgICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9iaW4vamF2YSIKKyAgICBmaQorICAgIGlmIFsgISAteCAiJEpBVkFDTUQiIF0gOyB0aGVuCisgICAgICAgIGRpZSAiRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICRKQVZBX0hPTUUKKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKKyAgICBmaQorZWxzZQorICAgIEpBVkFDTUQ9ImphdmEiCisgICAgd2hpY2ggamF2YSA+L2Rldi9udWxsIDI+JjEgfHwgZGllICJFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4KKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKK2ZpCisKKyMgSW5jcmVhc2UgdGhlIG1heGltdW0gZmlsZSBkZXNjcmlwdG9ycyBpZiB3ZSBjYW4uCitpZiBbICIkY3lnd2luIiA9ICJmYWxzZSIgLWEgIiRkYXJ3aW4iID0gImZhbHNlIiAtYSAiJG5vbnN0b3AiID0gImZhbHNlIiBdIDsgdGhlbgorICAgIE1BWF9GRF9MSU1JVD1gdWxpbWl0IC1IIC1uYAorICAgIGlmIFsgJD8gLWVxIDAgXSA7IHRoZW4KKyAgICAgICAgaWYgWyAiJE1BWF9GRCIgPSAibWF4aW11bSIgLW8gIiRNQVhfRkQiID0gIm1heCIgXSA7IHRoZW4KKyAgICAgICAgICAgIE1BWF9GRD0iJE1BWF9GRF9MSU1JVCIKKyAgICAgICAgZmkKKyAgICAgICAgdWxpbWl0IC1uICRNQVhfRkQKKyAgICAgICAgaWYgWyAkPyAtbmUgMCBdIDsgdGhlbgorICAgICAgICAgICAgd2FybiAiQ291bGQgbm90IHNldCBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRCIKKyAgICAgICAgZmkKKyAgICBlbHNlCisgICAgICAgIHdhcm4gIkNvdWxkIG5vdCBxdWVyeSBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRF9MSU1JVCIKKyAgICBmaQorZmkKKworIyBGb3IgRGFyd2luLCBhZGQgb3B0aW9ucyB0byBzcGVjaWZ5IGhvdyB0aGUgYXBwbGljYXRpb24gYXBwZWFycyBpbiB0aGUgZG9jaworaWYgJGRhcndpbjsgdGhlbgorICAgIEdSQURMRV9PUFRTPSIkR1JBRExFX09QVFMgXCItWGRvY2s6bmFtZT0kQVBQX05BTUVcIiBcIi1YZG9jazppY29uPSRBUFBfSE9NRS9tZWRpYS9ncmFkbGUuaWNuc1wiIgorZmkKKworIyBGb3IgQ3lnd2luLCBzd2l0Y2ggcGF0aHMgdG8gV2luZG93cyBmb3JtYXQgYmVmb3JlIHJ1bm5pbmcgamF2YQoraWYgJGN5Z3dpbiA7IHRoZW4KKyAgICBBUFBfSE9NRT1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJEFQUF9IT01FImAKKyAgICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRDTEFTU1BBVEgiYAorICAgIEpBVkFDTUQ9YGN5Z3BhdGggLS11bml4ICIkSkFWQUNNRCJgCisKKyAgICAjIFdlIGJ1aWxkIHRoZSBwYXR0ZXJuIGZvciBhcmd1bWVudHMgdG8gYmUgY29udmVydGVkIHZpYSBjeWdwYXRoCisgICAgUk9PVERJUlNSQVc9YGZpbmQgLUwgLyAtbWF4ZGVwdGggMSAtbWluZGVwdGggMSAtdHlwZSBkIDI+L2Rldi9udWxsYAorICAgIFNFUD0iIgorICAgIGZvciBkaXIgaW4gJFJPT1RESVJTUkFXIDsgZG8KKyAgICAgICAgUk9PVERJUlM9IiRST09URElSUyRTRVAkZGlyIgorICAgICAgICBTRVA9InwiCisgICAgZG9uZQorICAgIE9VUkNZR1BBVFRFUk49IiheKCRST09URElSUykpIgorICAgICMgQWRkIGEgdXNlci1kZWZpbmVkIHBhdHRlcm4gdG8gdGhlIGN5Z3BhdGggYXJndW1lbnRzCisgICAgaWYgWyAiJEdSQURMRV9DWUdQQVRURVJOIiAhPSAiIiBdIDsgdGhlbgorICAgICAgICBPVVJDWUdQQVRURVJOPSIkT1VSQ1lHUEFUVEVSTnwoJEdSQURMRV9DWUdQQVRURVJOKSIKKyAgICBmaQorICAgICMgTm93IGNvbnZlcnQgdGhlIGFyZ3VtZW50cyAtIGtsdWRnZSB0byBsaW1pdCBvdXJzZWx2ZXMgdG8gL2Jpbi9zaAorICAgIGk9MAorICAgIGZvciBhcmcgaW4gIiRAIiA7IGRvCisgICAgICAgIENIRUNLPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiJE9VUkNZR1BBVFRFUk4iIC1gCisgICAgICAgIENIRUNLMj1gZWNobyAiJGFyZyJ8ZWdyZXAgLWMgIl4tImAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMgRGV0ZXJtaW5lIGlmIGFuIG9wdGlvbgorCisgICAgICAgIGlmIFsgJENIRUNLIC1uZSAwIF0gJiYgWyAkQ0hFQ0syIC1lcSAwIF0gOyB0aGVuICAgICAgICAgICAgICAgICAgICAjIyMgQWRkZWQgYSBjb25kaXRpb24KKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD1gY3lncGF0aCAtLXBhdGggLS1pZ25vcmUgLS1taXhlZCAiJGFyZyJgCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD0iXCIkYXJnXCIiCisgICAgICAgIGZpCisgICAgICAgIGk9JCgoaSsxKSkKKyAgICBkb25lCisgICAgY2FzZSAkaSBpbgorICAgICAgICAoMCkgc2V0IC0tIDs7CisgICAgICAgICgxKSBzZXQgLS0gIiRhcmdzMCIgOzsKKyAgICAgICAgKDIpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiA7OworICAgICAgICAoMykgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiIDs7CisgICAgICAgICg0KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgOzsKKyAgICAgICAgKDUpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiA7OworICAgICAgICAoNikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiIDs7CisgICAgICAgICg3KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgOzsKKyAgICAgICAgKDgpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiAiJGFyZ3M3IiA7OworICAgICAgICAoOSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciICIkYXJnczgiIDs7CisgICAgZXNhYworZmkKKworIyBFc2NhcGUgYXBwbGljYXRpb24gYXJncworc2F2ZSAoKSB7CisgICAgZm9yIGkgZG8gcHJpbnRmICVzXFxuICIkaSIgfCBzZWQgInMvJy8nXFxcXCcnL2c7MXMvXi8nLztcJHMvXCQvJyBcXFxcLyIgOyBkb25lCisgICAgZWNobyAiICIKK30KK0FQUF9BUkdTPSQoc2F2ZSAiJEAiKQorCisjIENvbGxlY3QgYWxsIGFyZ3VtZW50cyBmb3IgdGhlIGphdmEgY29tbWFuZCwgZm9sbG93aW5nIHRoZSBzaGVsbCBxdW90aW5nIGFuZCBzdWJzdGl0dXRpb24gcnVsZXMKK2V2YWwgc2V0IC0tICRERUZBVUxUX0pWTV9PUFRTICRKQVZBX09QVFMgJEdSQURMRV9PUFRTICJcIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSRBUFBfQkFTRV9OQU1FXCIiIC1jbGFzc3BhdGggIlwiJENMQVNTUEFUSFwiIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gIiRBUFBfQVJHUyIKKworIyBieSBkZWZhdWx0IHdlIHNob3VsZCBiZSBpbiB0aGUgY29ycmVjdCBwcm9qZWN0IGRpciwgYnV0IHdoZW4gcnVuIGZyb20gRmluZGVyIG9uIE1hYywgdGhlIGN3ZCBpcyB3cm9uZworaWYgWyAiJCh1bmFtZSkiID0gIkRhcndpbiIgXSAmJiBbICIkSE9NRSIgPSAiJFBXRCIgXTsgdGhlbgorICBjZCAiJChkaXJuYW1lICIkMCIpIgorZmkKKworZXhlYyAiJEpBVkFDTUQiICIkQCIKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZXcuYmF0IGIvbGliL2phdmEvZ3JhZGxldy5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk1NTMxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZXcuYmF0CkBAIC0wLDAgKzEsODQgQEAKK0BpZiAiJURFQlVHJSIgPT0gIiIgQGVjaG8gb2ZmCitAcmVtICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitAcmVtCitAcmVtICBHcmFkbGUgc3RhcnR1cCBzY3JpcHQgZm9yIFdpbmRvd3MKK0ByZW0KK0ByZW0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQHJlbSBTZXQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsCitpZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBzZXRsb2NhbAorCitzZXQgRElSTkFNRT0lfmRwMAoraWYgIiVESVJOQU1FJSIgPT0gIiIgc2V0IERJUk5BTUU9Lgorc2V0IEFQUF9CQVNFX05BTUU9JX5uMAorc2V0IEFQUF9IT01FPSVESVJOQU1FJQorCitAcmVtIEFkZCBkZWZhdWx0IEpWTSBvcHRpb25zIGhlcmUuIFlvdSBjYW4gYWxzbyB1c2UgSkFWQV9PUFRTIGFuZCBHUkFETEVfT1BUUyB0byBwYXNzIEpWTSBvcHRpb25zIHRvIHRoaXMgc2NyaXB0Lgorc2V0IERFRkFVTFRfSlZNX09QVFM9CisKK0ByZW0gRmluZCBqYXZhLmV4ZQoraWYgZGVmaW5lZCBKQVZBX0hPTUUgZ290byBmaW5kSmF2YUZyb21KYXZhSG9tZQorCitzZXQgSkFWQV9FWEU9amF2YS5leGUKKyVKQVZBX0VYRSUgLXZlcnNpb24gPk5VTCAyPiYxCitpZiAiJUVSUk9STEVWRUwlIiA9PSAiMCIgZ290byBpbml0CisKK2VjaG8uCitlY2hvIEVSUk9SOiBKQVZBX0hPTUUgaXMgbm90IHNldCBhbmQgbm8gJ2phdmEnIGNvbW1hbmQgY291bGQgYmUgZm91bmQgaW4geW91ciBQQVRILgorZWNoby4KK2VjaG8gUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitlY2hvIGxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uCisKK2dvdG8gZmFpbAorCis6ZmluZEphdmFGcm9tSmF2YUhvbWUKK3NldCBKQVZBX0hPTUU9JUpBVkFfSE9NRToiPSUKK3NldCBKQVZBX0VYRT0lSkFWQV9IT01FJS9iaW4vamF2YS5leGUKKworaWYgZXhpc3QgIiVKQVZBX0VYRSUiIGdvdG8gaW5pdAorCitlY2hvLgorZWNobyBFUlJPUjogSkFWQV9IT01FIGlzIHNldCB0byBhbiBpbnZhbGlkIGRpcmVjdG9yeTogJUpBVkFfSE9NRSUKK2VjaG8uCitlY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQorZWNobyBsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLgorCitnb3RvIGZhaWwKKworOmluaXQKK0ByZW0gR2V0IGNvbW1hbmQtbGluZSBhcmd1bWVudHMsIGhhbmRsaW5nIFdpbmRvd3MgdmFyaWFudHMKKworaWYgbm90ICIlT1MlIiA9PSAiV2luZG93c19OVCIgZ290byB3aW45eE1FX2FyZ3MKKworOndpbjl4TUVfYXJncworQHJlbSBTbHVycCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KK3NldCBDTURfTElORV9BUkdTPQorc2V0IF9TS0lQPTIKKworOndpbjl4TUVfYXJnc19zbHVycAoraWYgInglfjEiID09ICJ4IiBnb3RvIGV4ZWN1dGUKKworc2V0IENNRF9MSU5FX0FSR1M9JSoKKworOmV4ZWN1dGUKK0ByZW0gU2V0dXAgdGhlIGNvbW1hbmQgbGluZQorCitzZXQgQ0xBU1NQQVRIPSVBUFBfSE9NRSVcZ3JhZGxlXHdyYXBwZXJcZ3JhZGxlLXdyYXBwZXIuamFyCisKK0ByZW0gRXhlY3V0ZSBHcmFkbGUKKyIlSkFWQV9FWEUlIiAlREVGQVVMVF9KVk1fT1BUUyUgJUpBVkFfT1BUUyUgJUdSQURMRV9PUFRTJSAiLURvcmcuZ3JhZGxlLmFwcG5hbWU9JUFQUF9CQVNFX05BTUUlIiAtY2xhc3NwYXRoICIlQ0xBU1NQQVRIJSIgb3JnLmdyYWRsZS53cmFwcGVyLkdyYWRsZVdyYXBwZXJNYWluICVDTURfTElORV9BUkdTJQorCis6ZW5kCitAcmVtIEVuZCBsb2NhbCBzY29wZSBmb3IgdGhlIHZhcmlhYmxlcyB3aXRoIHdpbmRvd3MgTlQgc2hlbGwKK2lmICIlRVJST1JMRVZFTCUiPT0iMCIgZ290byBtYWluRW5kCisKKzpmYWlsCityZW0gU2V0IHZhcmlhYmxlIEdSQURMRV9FWElUX0NPTlNPTEUgaWYgeW91IG5lZWQgdGhlIF9zY3JpcHRfIHJldHVybiBjb2RlIGluc3RlYWQgb2YKK3JlbSB0aGUgX2NtZC5leGUgL2NfIHJldHVybiBjb2RlIQoraWYgIG5vdCAiIiA9PSAiJUdSQURMRV9FWElUX0NPTlNPTEUlIiBleGl0IDEKK2V4aXQgL2IgMQorCis6bWFpbkVuZAoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgZW5kbG9jYWwKKworOm9tZWdhCmRpZmYgLS1naXQgYS9saWIvamF2YS9zZXR0aW5ncy5ncmFkbGUgYi9saWIvamF2YS9zZXR0aW5ncy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliZDhiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NldHRpbmdzLmdyYWRsZQpAQCAtMCwwICsxLDIwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3Jvb3RQcm9qZWN0Lm5hbWUgPSAnbGlidGhyaWZ0JwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0FzeW5jUHJvY2Vzc0Z1bmN0aW9uLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQXN5bmNQcm9jZXNzRnVuY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODNjOGQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0FzeW5jUHJvY2Vzc0Z1bmN0aW9uLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgVCBleHRlbmRzIFRCYXNlLCBSPiB7CisgICAgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWU7CisKKyAgICBwdWJsaWMgQXN5bmNQcm9jZXNzRnVuY3Rpb24oU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICAgICAgdGhpcy5tZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc09uZXdheSgpOworCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnQoSSBpZmFjZSwgVCBhcmdzLCBBc3luY01ldGhvZENhbGxiYWNrPFI+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uOworCisgICAgcHVibGljIGFic3RyYWN0IFQgZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBBc3luY01ldGhvZENhbGxiYWNrPFI+IGdldFJlc3VsdEhhbmRsZXIoZmluYWwgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5Bc3luY0ZyYW1lQnVmZmVyIGZiLCBpbnQgc2VxaWQpOworCisgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKCkgeworICAgICAgICByZXR1cm4gbWV0aG9kTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZW5kUmVzcG9uc2UoZmluYWwgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5Bc3luY0ZyYW1lQnVmZmVyIGZiLCBmaW5hbCBUU2VyaWFsaXphYmxlIHJlc3VsdCwgZmluYWwgYnl0ZSB0eXBlLCBmaW5hbCBpbnQgc2VxaWQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgVFByb3RvY29sIG9wcm90ID0gZmIuZ2V0T3V0cHV0UHJvdG9jb2woKTsKKworICAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoZ2V0TWV0aG9kTmFtZSgpLCB0eXBlLCBzZXFpZCkpOworICAgICAgICByZXN1bHQud3JpdGUob3Byb3QpOworICAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgICAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKKworICAgICAgICBmYi5yZXNwb25zZVJlYWR5KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0VuY29kaW5nVXRpbHMuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9FbmNvZGluZ1V0aWxzLmphdmEKaW5kZXggMDcyZGU5My4uYmYxNGVmNSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0VuY29kaW5nVXRpbHMuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvRW5jb2RpbmdVdGlscy5qYXZhCkBAIC04Miw0ICs4Miw2NyBAQAogICAgICAgICB8ICgoYnVmW29mZnNldCArIDJdICYgMHhmZikgPDwgOCkgfCAoKGJ1ZltvZmZzZXQgKyAzXSAmIDB4ZmYpKTsKICAgfQogCisgIC8qKgorICAgKiBCaXRmaWVsZCB1dGlsaXRpZXMuCisgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYml0IGF0IHBvc2l0aW9uIGlzIHNldCBpbiB2LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHRlc3RCaXQoYnl0ZSB2LCBpbnQgcG9zaXRpb24pIHsKKyAgICByZXR1cm4gdGVzdEJpdCgoaW50KXYsIHBvc2l0aW9uKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB0ZXN0Qml0KHNob3J0IHYsIGludCBwb3NpdGlvbikgeworICAgIHJldHVybiB0ZXN0Qml0KChpbnQpdiwgcG9zaXRpb24pOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHRlc3RCaXQoaW50IHYsIGludCBwb3NpdGlvbikgeworICAgIHJldHVybiAodiAmICgxIDw8IHBvc2l0aW9uKSkgIT0gMDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB0ZXN0Qml0KGxvbmcgdiwgaW50IHBvc2l0aW9uKSB7CisgICAgcmV0dXJuICh2ICYgKDFMIDw8IHBvc2l0aW9uKSkgIT0gMEw7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB2LCB3aXRoIHRoZSBiaXQgYXQgcG9zaXRpb24gc2V0IHRvIHplcm8uCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgY2xlYXJCaXQoYnl0ZSB2LCBpbnQgcG9zaXRpb24pIHsKKyAgICByZXR1cm4gKGJ5dGUpY2xlYXJCaXQoKGludCl2LCBwb3NpdGlvbik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IGNsZWFyQml0KHNob3J0IHYsIGludCBwb3NpdGlvbikgeworICAgIHJldHVybiAoc2hvcnQpY2xlYXJCaXQoKGludCl2LCBwb3NpdGlvbik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjbGVhckJpdChpbnQgdiwgaW50IHBvc2l0aW9uKSB7CisgICAgcmV0dXJuIHYgJiB+KDEgPDwgcG9zaXRpb24pOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIGNsZWFyQml0KGxvbmcgdiwgaW50IHBvc2l0aW9uKSB7CisgICAgcmV0dXJuIHYgJiB+KDFMIDw8IHBvc2l0aW9uKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHYsIHdpdGggdGhlIGJpdCBhdCBwb3NpdGlvbiBzZXQgdG8gMSBvciAwIGRlcGVuZGluZyBvbiB2YWx1ZS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBzZXRCaXQoYnl0ZSB2LCBpbnQgcG9zaXRpb24sIGJvb2xlYW4gdmFsdWUpIHsKKyAgICByZXR1cm4gKGJ5dGUpc2V0Qml0KChpbnQpdiwgcG9zaXRpb24sIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgc2V0Qml0KHNob3J0IHYsIGludCBwb3NpdGlvbiwgYm9vbGVhbiB2YWx1ZSkgeworICAgIHJldHVybiAoc2hvcnQpc2V0Qml0KChpbnQpdiwgcG9zaXRpb24sIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNldEJpdChpbnQgdiwgaW50IHBvc2l0aW9uLCBib29sZWFuIHZhbHVlKSB7CisgICAgaWYodmFsdWUpCisgICAgICByZXR1cm4gdiB8ICgxIDw8IHBvc2l0aW9uKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gY2xlYXJCaXQodiwgcG9zaXRpb24pOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIHNldEJpdChsb25nIHYsIGludCBwb3NpdGlvbiwgYm9vbGVhbiB2YWx1ZSkgeworICAgIGlmKHZhbHVlKQorICAgICAgcmV0dXJuIHYgfCAoMUwgPDwgcG9zaXRpb24pOworICAgIGVsc2UKKyAgICAgIHJldHVybiBjbGVhckJpdCh2LCBwb3NpdGlvbik7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9PcHRpb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9PcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWNkMzA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L09wdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIE9wdGlvbiB0eXBlIHBhdHRlcm4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE9wdGlvbjxUPiB7CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9wdGlvbiBOT05FID0gbmV3IE5vbmUoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIE9wdGlvbiBpcyBkZWZpbmVkIG9yIG5vdAorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgICAgIHRydWUgaWYgdGhlIE9wdGlvbiBpcyBkZWZpbmVkIChvZiB0eXBlIFNvbWUpCisgICAgICogICAgICAgICBmYWxzZSBpZiB0aGUgT3B0aW9uIGlzIG5vdCBkZWZpbmVkIChvZiB0eXBlIE5vbmUpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNEZWZpbmVkKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBPcHRpb24gKGlmIGl0IGlzIGRlZmluZWQpCisgICAgICogQHJldHVybiB0aGUgdmFsdWUKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBjYWxsZWQgb24gYSBOb25lCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFQgZ2V0KCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbnRhaW5lZCB2YWx1ZSAoaWYgZGVmaW5lZCkgb3IgZWxzZSByZXR1cm4gYSBkZWZhdWx0IHZhbHVlCisgICAgICogQHBhcmFtIG90aGVyIHdoYXQgdG8gcmV0dXJuIGlmIHRoZSB2YWx1ZSBpcyBub3QgZGVmaW5lZCAoYSBOb25lKQorICAgICAqIEByZXR1cm4gZWl0aGVyIHRoZSB2YWx1ZSwgb3Igb3RoZXIgaWYgdGhlIHZhbHVlIGlzIG5vdCBkZWZpbmVkCisgICAgICovCisgICAgcHVibGljIFQgb3IoVCBvdGhlcikgeworICAgICAgICBpZiAoaXNEZWZpbmVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBvdGhlcjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBUaGUgTm9uZSB0eXBlLCByZXByZXNlbnRpbmcgYW4gYWJzZW50IHZhbHVlIChpbnN0ZWFkIG9mICJudWxsIikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vbmU8VD4gZXh0ZW5kcyBPcHRpb248VD4geworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmluZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVCBnZXQoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgY2FsbCBnZXQoKSBvbiBOb25lIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJOb25lIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBTb21lIHR5cGUsIHJlcHJlc2VudGluZyBhbiBleGlzdGVuY2Ugb2Ygc29tZSB2YWx1ZQorICAgICAqIEBwYXJhbSA8VD4gVGhlIHR5cGUgb2YgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNvbWU8VD4gZXh0ZW5kcyBPcHRpb248VD4geworICAgICAgICBwcml2YXRlIGZpbmFsIFQgdmFsdWU7CisgICAgICAgIHB1YmxpYyBTb21lKFQgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGVmaW5lZCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFQgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiU29tZSgiICsgdmFsdWUgKyAiKSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcmFwcyB2YWx1ZSBpbiBhbiBPcHRpb24gdHlwZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IHZhbHVlIGlzIG51bGwKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiBAcGFyYW0gPFQ+IHR5cGUgb2YgdmFsdWUKKyAgICAgKiBAcmV0dXJuIFNvbWUodmFsdWUpIGlmIHZhbHVlIGlzIG5vdCBudWxsLCBOb25lIGlmIHZhbHVlIGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBPcHRpb248VD4gZnJvbU51bGxhYmxlKFQgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBzb21lKHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBub25lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcmFwIHZhbHVlIGluIGEgU29tZSB0eXBlIChOQiEgdmFsdWUgbXVzdCBub3QgYmUgbnVsbCEpCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogQHBhcmFtIDxUPiB0eXBlIG9mIHZhbHVlCisgICAgICogQHJldHVybiBhIG5ldyBTb21lKHZhbHVlKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFNvbWU8VD4gc29tZShUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBuZXcgU29tZTxUPih2YWx1ZSk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHN0YXRpYyA8VD4gTm9uZTxUPiBub25lKCkgeworICAgICAgICByZXR1cm4gKE5vbmU8VD4pIE5PTkU7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Qcm9jZXNzRnVuY3Rpb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Qcm9jZXNzRnVuY3Rpb24uamF2YQppbmRleCBlMGNkYzdiLi5lNjIxM2RmIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvUHJvY2Vzc0Z1bmN0aW9uLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1Byb2Nlc3NGdW5jdGlvbi5qYXZhCkBAIC0xLDE2ICsxLDE4IEBACi0vKioKLSAqIAotICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIFByb2Nlc3NGdW5jdGlvbjxJLCBUIGV4dGVuZHMgVEJhc2U+IHsKICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZTsKIAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUHJvY2Vzc0Z1bmN0aW9uLmNsYXNzLmdldE5hbWUoKSk7CisKICAgcHVibGljIFByb2Nlc3NGdW5jdGlvbihTdHJpbmcgbWV0aG9kTmFtZSkgewogICAgIHRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7CiAgIH0KQEAgLTI5LDE4ICszMSw1OCBAQAogICAgICAgcmV0dXJuOwogICAgIH0KICAgICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOwotICAgIFRCYXNlIHJlc3VsdCA9IGdldFJlc3VsdChpZmFjZSwgYXJncyk7Ci0gICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKGdldE1ldGhvZE5hbWUoKSwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkpOwotICAgIHJlc3VsdC53cml0ZShvcHJvdCk7Ci0gICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7Ci0gICAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKKyAgICBUU2VyaWFsaXphYmxlIHJlc3VsdCA9IG51bGw7CisgICAgYnl0ZSBtc2dUeXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZOworCisgICAgdHJ5IHsKKyAgICAgIHJlc3VsdCA9IGdldFJlc3VsdChpZmFjZSwgYXJncyk7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBleCkgeworICAgICAgTE9HR0VSLmVycm9yKCJUcmFuc3BvcnQgZXJyb3Igd2hpbGUgcHJvY2Vzc2luZyAiICsgZ2V0TWV0aG9kTmFtZSgpLCBleCk7CisgICAgICB0aHJvdyBleDsKKyAgICB9IGNhdGNoIChUQXBwbGljYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgIExPR0dFUi5lcnJvcigiSW50ZXJuYWwgYXBwbGljYXRpb24gZXJyb3IgcHJvY2Vzc2luZyAiICsgZ2V0TWV0aG9kTmFtZSgpLCBleCk7CisgICAgICByZXN1bHQgPSBleDsKKyAgICAgIG1zZ1R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgTE9HR0VSLmVycm9yKCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgKyBnZXRNZXRob2ROYW1lKCksIGV4KTsKKyAgICAgIGlmKHJldGhyb3dVbmhhbmRsZWRFeGNlcHRpb25zKCkpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSwgZXgpOworICAgICAgaWYoIWlzT25ld2F5KCkpIHsKKyAgICAgICAgcmVzdWx0ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsCisgICAgICAgICAgICAiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiICsgZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgICAgbXNnVHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT047CisgICAgICB9CisgICAgfQorCisgICAgaWYoIWlzT25ld2F5KCkpIHsKKyAgICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShnZXRNZXRob2ROYW1lKCksIG1zZ1R5cGUsIHNlcWlkKSk7CisgICAgICByZXN1bHQud3JpdGUob3Byb3QpOworICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOworICAgIH0KICAgfQogCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBUQmFzZSBnZXRSZXN1bHQoSSBpZmFjZSwgVCBhcmdzKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKyAgcHJpdmF0ZSB2b2lkIGhhbmRsZUV4Y2VwdGlvbihpbnQgc2VxaWQsIFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGlmICghaXNPbmV3YXkoKSkgeworICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwKKyAgICAgICAgIkludGVybmFsIGVycm9yIHByb2Nlc3NpbmcgIiArIGdldE1ldGhvZE5hbWUoKSk7CisgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoZ2V0TWV0aG9kTmFtZSgpLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOworICAgICAgeC53cml0ZShvcHJvdCk7CisgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7CisgICAgfQorICB9CiAKLSAgcHJvdGVjdGVkIGFic3RyYWN0IFQgZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKTsKKyAgcHJvdGVjdGVkIGJvb2xlYW4gcmV0aHJvd1VuaGFuZGxlZEV4Y2VwdGlvbnMoKXsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc09uZXdheSgpOworCisgIHB1YmxpYyBhYnN0cmFjdCBUQmFzZSBnZXRSZXN1bHQoSSBpZmFjZSwgVCBhcmdzKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3QgVCBnZXRFbXB0eUFyZ3NJbnN0YW5jZSgpOwogCiAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZSgpIHsKICAgICByZXR1cm4gbWV0aG9kTmFtZTsKICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9TaG9ydFN0YWNrLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvU2hvcnRTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTU3ZDFjLi4wMDAwMDAwCi0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9TaG9ydFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwotCi0vKioKLSAqIFNob3J0U3RhY2sgaXMgYSBzaG9ydC1zcGVjaWZpYyBTdGFjayBpbXBsZW1lbnRhdGlvbiB3cml0dGVuIGZvciB0aGUgZXhwcmVzcwotICogcHVycG9zZSBvZiB2ZXJ5IGZhc3Qgb3BlcmF0aW9ucyBvbiBUQ29tcGFjdFByb3RvY29sJ3MgZmllbGQgaWQgc3RhY2suIFRoaXMKLSAqIGltcGxlbWVudGF0aW9uIHBlcmZvcm1zIGF0IGxlYXN0IDEweCBmYXN0ZXIgdGhhbiBqYXZhLnV0aWwuU3RhY2suCi0gKi8KLXB1YmxpYyBjbGFzcyBTaG9ydFN0YWNrIHsKLQotICBwcml2YXRlIHNob3J0W10gdmVjdG9yOwotICBwcml2YXRlIGludCB0b3AgPSAtMTsKLQotICBwdWJsaWMgU2hvcnRTdGFjayhpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0gICAgdmVjdG9yID0gbmV3IHNob3J0W2luaXRpYWxDYXBhY2l0eV07Ci0gIH0KLQotICBwdWJsaWMgc2hvcnQgcG9wKCkgewotICAgIHJldHVybiB2ZWN0b3JbdG9wLS1dOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcHVzaChzaG9ydCBwdXNoZWQpIHsKLSAgICBpZiAodmVjdG9yLmxlbmd0aCA9PSB0b3AgKyAxKSB7Ci0gICAgICBncm93KCk7Ci0gICAgfQotICAgIHZlY3RvclsrK3RvcF0gPSBwdXNoZWQ7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZ3JvdygpIHsKLSAgICBzaG9ydFtdIG5ld1ZlY3RvciA9IG5ldyBzaG9ydFt2ZWN0b3IubGVuZ3RoICogMl07Ci0gICAgU3lzdGVtLmFycmF5Y29weSh2ZWN0b3IsIDAsIG5ld1ZlY3RvciwgMCwgdmVjdG9yLmxlbmd0aCk7Ci0gICAgdmVjdG9yID0gbmV3VmVjdG9yOwotICB9Ci0KLSAgcHVibGljIHNob3J0IHBlZWsoKSB7Ci0gICAgcmV0dXJuIHZlY3Rvclt0b3BdOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgdG9wID0gLTE7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICBzYi5hcHBlbmQoIjxTaG9ydFN0YWNrIHZlY3RvcjpbIik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWN0b3IubGVuZ3RoOyBpKyspIHsKLSAgICAgIGlmIChpICE9IDApIHsKLSAgICAgICAgc2IuYXBwZW5kKCIgIik7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpID09IHRvcCkgewotICAgICAgICBzYi5hcHBlbmQoIj4+Iik7Ci0gICAgICB9Ci0KLSAgICAgIHNiLmFwcGVuZCh2ZWN0b3JbaV0pOwotCi0gICAgICBpZiAoaSA9PSB0b3ApIHsKLSAgICAgICAgc2IuYXBwZW5kKCI8PCIpOwotICAgICAgfQotICAgIH0KLSAgICBzYi5hcHBlbmQoIl0+Iik7Ci0gICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uamF2YQppbmRleCBjMjk0ZmMzLi40ZDY5M2Q5IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0yOSw3ICsyOSw3IEBACiAgKiBBcHBsaWNhdGlvbiBsZXZlbCBleGNlcHRpb24KICAqCiAgKi8KLXB1YmxpYyBjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIHsKK3B1YmxpYyBjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIGltcGxlbWVudHMgVFNlcmlhbGl6YWJsZSB7CiAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVFN0cnVjdCBUQVBQTElDQVRJT05fRVhDRVBUSU9OX1NUUlVDVCA9IG5ldyBUU3RydWN0KCJUQXBwbGljYXRpb25FeGNlcHRpb24iKTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVEZpZWxkIE1FU1NBR0VfRklFTEQgPSBuZXcgVEZpZWxkKCJtZXNzYWdlIiwgVFR5cGUuU1RSSU5HLCAoc2hvcnQpMSk7CkBAIC00NSw4ICs0NSwxMiBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSVNTSU5HX1JFU1VMVCA9IDU7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkFMX0VSUk9SID0gNjsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVE9DT0xfRVJST1IgPSA3OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1RSQU5TRk9STSA9IDg7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUFJPVE9DT0wgPSA5OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwOwogCiAgIHByb3RlY3RlZCBpbnQgdHlwZV8gPSBVTktOT1dOOworICBwcml2YXRlIFN0cmluZyBtZXNzYWdlXyA9IG51bGw7CiAKICAgcHVibGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIHsKICAgICBzdXBlcigpOwpAQCAtNzAsNyArNzQsMTggQEAKICAgICByZXR1cm4gdHlwZV87CiAgIH0KIAotICBwdWJsaWMgc3RhdGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiByZWFkKFRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgIGlmIChtZXNzYWdlXyA9PSBudWxsKSB7CisgICAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZSgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHJldHVybiBtZXNzYWdlXzsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkKFRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24KKyAgewogICAgIFRGaWVsZCBmaWVsZDsKICAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKIApAQCAtODMsMzIgKzk4LDQzIEBACiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgc3dpdGNoIChmaWVsZC5pZCkgewotICAgICAgY2FzZSAxOgotICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVFJJTkcpIHsKLSAgICAgICAgICBtZXNzYWdlID0gaXByb3QucmVhZFN0cmluZygpOwotICAgICAgICB9IGVsc2UgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgICBtZXNzYWdlID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkkzMikgeworICAgICAgICAgICAgdHlwZSA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTMyKSB7Ci0gICAgICAgICAgdHlwZSA9IGlwcm90LnJlYWRJMzIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKLSAgICAgICAgYnJlYWs7CisgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKICAgICB9CiAgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOwotCi0gICAgcmV0dXJuIG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24odHlwZSwgbWVzc2FnZSk7CisgICAgdHlwZV8gPSB0eXBlOworICAgIG1lc3NhZ2VfID0gbWVzc2FnZTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAvKioKKyAgICogQ29udmVuaWVuY2UgZmFjdG9yeSBtZXRob2QgZm9yIGNvbnN0cnVjdGluZyBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBnaXZlbiBhIFRQcm90b2NvbCBpbnB1dAorICAgKi8KKyAgcHVibGljIHN0YXRpYyBUQXBwbGljYXRpb25FeGNlcHRpb24gcmVhZEZyb20oVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbgorICB7CisgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHJlc3VsdCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oKTsKKyAgICByZXN1bHQucmVhZChpcHJvdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24KKyAgewogICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oVEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9TVFJVQ1QpOwogICAgIGlmIChnZXRNZXNzYWdlKCkgIT0gbnVsbCkgewogICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKE1FU1NBR0VfRklFTEQpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBc3luY1Byb2Nlc3Nvci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBc3luY1Byb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzM2U3NGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFzeW5jUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLkFzeW5jRnJhbWVCdWZmZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgVEFzeW5jUHJvY2Vzc29yIHsKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbnMgbXVzdCBjYWxsIGZiLnJlc3BvbnNlUmVhZHkoKSBvbmNlIHByb2Nlc3NpbmcgaXMgY29tcGxldGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzKGZpbmFsIEFzeW5jRnJhbWVCdWZmZXIgZmIpIHRocm93cyBURXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2UuamF2YQppbmRleCBiM2VkMWJjLi5lMTQ4OWQ1IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2UuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2UuamF2YQpAQCAtMjcsMjEgKzI3LDcgQEAKICAqIEdlbmVyaWMgYmFzZSBpbnRlcmZhY2UgZm9yIGdlbmVyYXRlZCBUaHJpZnQgb2JqZWN0cy4KICAqCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgVEJhc2U8VCBleHRlbmRzIFRCYXNlPD8sPz4sIEYgZXh0ZW5kcyBURmllbGRJZEVudW0+IGV4dGVuZHMgQ29tcGFyYWJsZTxUPiwgIFNlcmlhbGl6YWJsZSB7Ci0KLSAgLyoqCi0gICAqIFJlYWRzIHRoZSBUT2JqZWN0IGZyb20gdGhlIGdpdmVuIGlucHV0IHByb3RvY29sLgotICAgKgotICAgKiBAcGFyYW0gaXByb3QgSW5wdXQgcHJvdG9jb2wKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogV3JpdGVzIHRoZSBvYmplY3RzIG91dCB0byB0aGUgcHJvdG9jb2wKLSAgICoKLSAgICogQHBhcmFtIG9wcm90IE91dHB1dCBwcm90b2NvbAotICAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsKK3B1YmxpYyBpbnRlcmZhY2UgVEJhc2U8VCBleHRlbmRzIFRCYXNlPFQsRj4sIEYgZXh0ZW5kcyBURmllbGRJZEVudW0+IGV4dGVuZHMgQ29tcGFyYWJsZTxUPiwgIFRTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZSB7CiAKICAgLyoqCiAgICAqIEdldCB0aGUgRiBpbnN0YW5jZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGZpZWxkSWQuCkBAIC01Niw3ICs0Miw3IEBACiAgIHB1YmxpYyBib29sZWFuIGlzU2V0KEYgZmllbGQpOwogCiAgIC8qKgotICAgKiBHZXQgYSBmaWVsZCdzIHZhbHVlIGJ5IGZpZWxkIHZhcmlhYmxlLiBQcmltaXRpdmUgdHlwZXMgd2lsbCBiZSB3cmFwcGVkIGluIAorICAgKiBHZXQgYSBmaWVsZCdzIHZhbHVlIGJ5IGZpZWxkIHZhcmlhYmxlLiBQcmltaXRpdmUgdHlwZXMgd2lsbCBiZSB3cmFwcGVkIGluCiAgICAqIHRoZSBhcHByb3ByaWF0ZSAiYm94ZWQiIHR5cGVzLgogICAgKgogICAgKiBAcGFyYW0gZmllbGQKQEAgLTcxLDcgKzU3LDcgQEAKICAgICovCiAgIHB1YmxpYyB2b2lkIHNldEZpZWxkVmFsdWUoRiBmaWVsZCwgT2JqZWN0IHZhbHVlKTsKIAotICBwdWJsaWMgVEJhc2U8VCwgRj4gZGVlcENvcHkoKTsKKyAgcHVibGljIFQgZGVlcENvcHkoKTsKIAogICAvKioKICAgICogUmV0dXJuIHRvIHRoZSBzdGF0ZSBvZiBoYXZpbmcganVzdCBiZWVuIGluaXRpYWxpemVkLCBhcyB0aG91Z2ggeW91IGhhZCBqdXN0CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VBc3luY1Byb2Nlc3Nvci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlQXN5bmNQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWIxODI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlQXN5bmNQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLio7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgVEJhc2VBc3luY1Byb2Nlc3NvcjxJPiBpbXBsZW1lbnRzIFRBc3luY1Byb2Nlc3NvciwgVFByb2Nlc3NvciB7CisgICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7CisKKyAgICBmaW5hbCBJIGlmYWNlOworICAgIGZpbmFsIE1hcDxTdHJpbmcsQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzIFRCYXNlLD8+PiBwcm9jZXNzTWFwOworCisgICAgcHVibGljIFRCYXNlQXN5bmNQcm9jZXNzb3IoSSBpZmFjZSwgTWFwPFN0cmluZywgQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzIFRCYXNlLD8+PiBwcm9jZXNzTWFwKSB7CisgICAgICAgIHRoaXMuaWZhY2UgPSBpZmFjZTsKKyAgICAgICAgdGhpcy5wcm9jZXNzTWFwID0gcHJvY2Vzc01hcDsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFwPFN0cmluZyxBc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgVEJhc2UsPz4+IGdldFByb2Nlc3NNYXBWaWV3KCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHByb2Nlc3NNYXApOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3MoZmluYWwgQXN5bmNGcmFtZUJ1ZmZlciBmYikgdGhyb3dzIFRFeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIFRQcm90b2NvbCBpbiA9IGZiLmdldElucHV0UHJvdG9jb2woKTsKKyAgICAgICAgZmluYWwgVFByb3RvY29sIG91dCA9IGZiLmdldE91dHB1dFByb3RvY29sKCk7CisKKyAgICAgICAgLy9GaW5kIHByb2Nlc3NpbmcgZnVuY3Rpb24KKyAgICAgICAgZmluYWwgVE1lc3NhZ2UgbXNnID0gaW4ucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgICBBc3luY1Byb2Nlc3NGdW5jdGlvbiBmbiA9IHByb2Nlc3NNYXAuZ2V0KG1zZy5uYW1lKTsKKyAgICAgICAgaWYgKGZuID09IG51bGwpIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpbiwgVFR5cGUuU1RSVUNUKTsKKyAgICAgICAgICAgIGluLnJlYWRNZXNzYWdlRW5kKCk7CisKKyAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uVU5LTk9XTl9NRVRIT0QsCisgICAgICAgICAgICAgICAgIkludmFsaWQgbWV0aG9kIG5hbWU6ICciICsgbXNnLm5hbWUgKyAiJyIpOworICAgICAgICAgICAgTE9HR0VSLmRlYnVnKCJJbnZhbGlkIG1ldGhvZCBuYW1lIiwgeCk7CisKKyAgICAgICAgICAgIC8vIHRoaXMgbWVhbnMgaXQgaXMgYSB0d28td2F5IHJlcXVlc3QsIHNvIHdlIGNhbiBzZW5kIGEgcmVwbHkKKyAgICAgICAgICAgIGlmIChtc2cudHlwZSA9PSBUTWVzc2FnZVR5cGUuQ0FMTCkgeworICAgICAgICAgICAgICBvdXQud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtc2cuc2VxaWQpKTsKKyAgICAgICAgICAgICAgeC53cml0ZShvdXQpOworICAgICAgICAgICAgICBvdXQud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICAgICAgICAgIG91dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmIucmVzcG9uc2VSZWFkeSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvL0dldCBBcmdzCisgICAgICAgIFRCYXNlIGFyZ3MgPSBmbi5nZXRFbXB0eUFyZ3NJbnN0YW5jZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhcmdzLnJlYWQoaW4pOworICAgICAgICB9IGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaW4ucmVhZE1lc3NhZ2VFbmQoKTsKKworICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBMT0dHRVIuZGVidWcoIkNvdWxkIG5vdCByZXRyaWV2ZSBmdW5jdGlvbiBhcmd1bWVudHMiLCB4KTsKKworICAgICAgICAgICAgaWYgKCFmbi5pc09uZXdheSgpKSB7CisgICAgICAgICAgICAgIG91dC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1zZy5zZXFpZCkpOworICAgICAgICAgICAgICB4LndyaXRlKG91dCk7CisgICAgICAgICAgICAgIG91dC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgICAgICAgICAgb3V0LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmYi5yZXNwb25zZVJlYWR5KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpbi5yZWFkTWVzc2FnZUVuZCgpOworCisgICAgICAgIGlmIChmbi5pc09uZXdheSgpKSB7CisgICAgICAgICAgZmIucmVzcG9uc2VSZWFkeSgpOworICAgICAgICB9CisKKyAgICAgICAgLy9zdGFydCBvZmYgcHJvY2Vzc2luZyBmdW5jdGlvbgorICAgICAgICBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIgPSBmbi5nZXRSZXN1bHRIYW5kbGVyKGZiLCBtc2cuc2VxaWQpOworICAgICAgICB0cnkgeworICAgICAgICAgIGZuLnN0YXJ0KGlmYWNlLCBhcmdzLCByZXN1bHRIYW5kbGVyKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBMT0dHRVIuZGVidWcoIkV4Y2VwdGlvbiBoYW5kbGluZyBmdW5jdGlvbiIsIGUpOworICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25FcnJvcihlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzKFRQcm90b2NvbCBpbiwgVFByb3RvY29sIG91dCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlSGVscGVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VIZWxwZXIuamF2YQppbmRleCA1ODk4ZDViLi42ZjZjNmViIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VIZWxwZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VIZWxwZXIuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwogCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CkBAIC0yNCw5ICsyNSwxMSBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7CiBpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIAogcHVibGljIGZpbmFsIGNsYXNzIFRCYXNlSGVscGVyIHsKIApAQCAtNTEsNTcgKzU0LDI3IEBACiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oYm9vbGVhbiBhLCBib29sZWFuIGIpIHsKLSAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGEpLmNvbXBhcmVUbyhiKTsKKyAgICByZXR1cm4gQm9vbGVhbi5jb21wYXJlKGEsIGIpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGJ5dGUgYSwgYnl0ZSBiKSB7Ci0gICAgaWYgKGEgPCBiKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChiIDwgYSkgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gQnl0ZS5jb21wYXJlKGEsIGIpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKHNob3J0IGEsIHNob3J0IGIpIHsKLSAgICBpZiAoYSA8IGIpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYgKGIgPCBhKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiBTaG9ydC5jb21wYXJlKGEsYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oaW50IGEsIGludCBiKSB7Ci0gICAgaWYgKGEgPCBiKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChiIDwgYSkgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gSW50ZWdlci5jb21wYXJlKGEsIGIpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGxvbmcgYSwgbG9uZyBiKSB7Ci0gICAgaWYgKGEgPCBiKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChiIDwgYSkgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gTG9uZy5jb21wYXJlKGEsIGIpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGRvdWJsZSBhLCBkb3VibGUgYikgewotICAgIGlmIChhIDwgYikgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0gZWxzZSBpZiAoYiA8IGEpIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgcmV0dXJuIERvdWJsZS5jb21wYXJlKGEsIGIpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKFN0cmluZyBhLCBTdHJpbmcgYikgewpAQCAtMTA5LDE3ICs4MiwxNiBAQAogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGJ5dGVbXSBhLCBieXRlW10gYikgewotICAgIGludCBzaXplQ29tcGFyZSA9IGNvbXBhcmVUbyhhLmxlbmd0aCwgYi5sZW5ndGgpOwotICAgIGlmIChzaXplQ29tcGFyZSAhPSAwKSB7Ci0gICAgICByZXR1cm4gc2l6ZUNvbXBhcmU7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgewotICAgICAgaW50IGJ5dGVDb21wYXJlID0gY29tcGFyZVRvKGFbaV0sIGJbaV0pOwotICAgICAgaWYgKGJ5dGVDb21wYXJlICE9IDApIHsKLSAgICAgICAgcmV0dXJuIGJ5dGVDb21wYXJlOworICAgIGludCBjb21wYXJlID0gY29tcGFyZVRvKGEubGVuZ3RoLCBiLmxlbmd0aCk7CisgICAgaWYgKGNvbXBhcmUgPT0gMCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGNvbXBhcmUgPSBjb21wYXJlVG8oYVtpXSwgYltpXSk7CisgICAgICAgIGlmIChjb21wYXJlICE9IDApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gY29tcGFyZTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhDb21wYXJhYmxlIGEsIENvbXBhcmFibGUgYikgewpAQCAtMTI3LDQxICs5OSwzOSBAQAogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKExpc3QgYSwgTGlzdCBiKSB7Ci0gICAgaW50IGxhc3RDb21wYXJpc29uID0gY29tcGFyZVRvKGEuc2l6ZSgpLCBiLnNpemUoKSk7Ci0gICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKLSAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLnNpemUoKTsgaSsrKSB7Ci0gICAgICBsYXN0Q29tcGFyaXNvbiA9IGNvbXBhcmF0b3IuY29tcGFyZShhLmdldChpKSwgYi5nZXQoaSkpOwotICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKLSAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIGludCBjb21wYXJlID0gY29tcGFyZVRvKGEuc2l6ZSgpLCBiLnNpemUoKSk7CisgICAgaWYgKGNvbXBhcmUgPT0gMCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbXBhcmUgPSBjb21wYXJhdG9yLmNvbXBhcmUoYS5nZXQoaSksIGIuZ2V0KGkpKTsKKyAgICAgICAgaWYgKGNvbXBhcmUgIT0gMCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICAgIHJldHVybiAwOworICAgIHJldHVybiBjb21wYXJlOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKFNldCBhLCBTZXQgYikgewotICAgIGludCBsYXN0Q29tcGFyaXNvbiA9IGNvbXBhcmVUbyhhLnNpemUoKSwgYi5zaXplKCkpOwotICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7Ci0gICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247Ci0gICAgfQotICAgIFNvcnRlZFNldCBzb3J0ZWRBID0gbmV3IFRyZWVTZXQoY29tcGFyYXRvcik7Ci0gICAgc29ydGVkQS5hZGRBbGwoYSk7Ci0gICAgU29ydGVkU2V0IHNvcnRlZEIgPSBuZXcgVHJlZVNldChjb21wYXJhdG9yKTsKLSAgICBzb3J0ZWRCLmFkZEFsbChiKTsKKyAgICBpbnQgY29tcGFyZSA9IGNvbXBhcmVUbyhhLnNpemUoKSwgYi5zaXplKCkpOworICAgIGlmIChjb21wYXJlID09IDApIHsKKyAgICAgIEFycmF5TGlzdCBzb3J0ZWRBID0gbmV3IEFycmF5TGlzdChhKTsKKyAgICAgIEFycmF5TGlzdCBzb3J0ZWRCID0gbmV3IEFycmF5TGlzdChiKTsKIAotICAgIEl0ZXJhdG9yIGl0ZXJBID0gc29ydGVkQS5pdGVyYXRvcigpOwotICAgIEl0ZXJhdG9yIGl0ZXJCID0gc29ydGVkQi5pdGVyYXRvcigpOworICAgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWRBLCBjb21wYXJhdG9yKTsKKyAgICAgIENvbGxlY3Rpb25zLnNvcnQoc29ydGVkQiwgY29tcGFyYXRvcik7CiAKLSAgICAvLyBDb21wYXJlIGVhY2ggaXRlbS4KLSAgICB3aGlsZSAoaXRlckEuaGFzTmV4dCgpICYmIGl0ZXJCLmhhc05leHQoKSkgewotICAgICAgbGFzdENvbXBhcmlzb24gPSBjb21wYXJhdG9yLmNvbXBhcmUoaXRlckEubmV4dCgpLCBpdGVyQi5uZXh0KCkpOwotICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKLSAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgSXRlcmF0b3IgaXRlckEgPSBzb3J0ZWRBLml0ZXJhdG9yKCk7CisgICAgICBJdGVyYXRvciBpdGVyQiA9IHNvcnRlZEIuaXRlcmF0b3IoKTsKKworICAgICAgLy8gQ29tcGFyZSBlYWNoIGl0ZW0uCisgICAgICB3aGlsZSAoaXRlckEuaGFzTmV4dCgpICYmIGl0ZXJCLmhhc05leHQoKSkgeworICAgICAgICBjb21wYXJlID0gY29tcGFyYXRvci5jb21wYXJlKGl0ZXJBLm5leHQoKSwgaXRlckIubmV4dCgpKTsKKyAgICAgICAgaWYgKGNvbXBhcmUgIT0gMCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQotCi0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGNvbXBhcmU7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oTWFwIGEsIE1hcCBiKSB7CkBAIC0xOTgsNyArMTY4LDcgQEAKICAgLyoqCiAgICAqIENvbXBhcmF0b3IgdG8gY29tcGFyZSBpdGVtcyBpbnNpZGUgYSBzdHJ1Y3R1cmUgKGUuZy4gYSBsaXN0LCBzZXQsIG9yIG1hcCkuCiAgICAqLwotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOZXN0ZWRTdHJ1Y3R1cmVDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7CisgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5lc3RlZFN0cnVjdHVyZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yLCBTZXJpYWxpemFibGUgewogICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgb0EsIE9iamVjdCBvQikgewogICAgICAgaWYgKG9BID09IG51bGwgJiYgb0IgPT0gbnVsbCkgewogICAgICAgICByZXR1cm4gMDsKQEAgLTIyMCwxNSArMTkwLDM1IEBACiAgICAgfQogICB9CiAKKyAgcHVibGljIHN0YXRpYyB2b2lkIHRvU3RyaW5nKENvbGxlY3Rpb248Qnl0ZUJ1ZmZlcj4gYmJzLCBTdHJpbmdCdWlsZGVyIHNiKSB7CisgICAgSXRlcmF0b3I8Qnl0ZUJ1ZmZlcj4gaXQgPSBiYnMuaXRlcmF0b3IoKTsKKyAgICBpZiAoIWl0Lmhhc05leHQoKSkgeworICAgICAgc2IuYXBwZW5kKCJbXSIpOworICAgIH0gZWxzZSB7CisgICAgICBzYi5hcHBlbmQoIlsiKTsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBpdC5uZXh0KCk7CisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLnRvU3RyaW5nKGJiLCBzYik7CisgICAgICAgIGlmICghaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0b1N0cmluZyhCeXRlQnVmZmVyIGJiLCBTdHJpbmdCdWlsZGVyIHNiKSB7CiAgICAgYnl0ZVtdIGJ1ZiA9IGJiLmFycmF5KCk7CiAKICAgICBpbnQgYXJyYXlPZmZzZXQgPSBiYi5hcnJheU9mZnNldCgpOwotICAgIGludCBvcmlnTGltaXQgPSBiYi5saW1pdCgpOwotICAgIGludCBsaW1pdCA9IChvcmlnTGltaXQgLSBhcnJheU9mZnNldCA+IDEyOCkgPyBhcnJheU9mZnNldCArIDEyOCA6IG9yaWdMaW1pdDsKKyAgICBpbnQgb2Zmc2V0ID0gYXJyYXlPZmZzZXQgKyBiYi5wb3NpdGlvbigpOworICAgIGludCBvcmlnTGltaXQgPSBhcnJheU9mZnNldCArIGJiLmxpbWl0KCk7CisgICAgaW50IGxpbWl0ID0gKG9yaWdMaW1pdCAtIG9mZnNldCA+IDEyOCkgPyBvZmZzZXQgKyAxMjggOiBvcmlnTGltaXQ7CiAKLSAgICBmb3IgKGludCBpID0gYXJyYXlPZmZzZXQ7IGkgPCBsaW1pdDsgaSsrKSB7Ci0gICAgICBpZiAoaSA+IGFycmF5T2Zmc2V0KSB7CisgICAgZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IGxpbWl0OyBpKyspIHsKKyAgICAgIGlmIChpID4gb2Zmc2V0KSB7CiAgICAgICAgIHNiLmFwcGVuZCgiICIpOwogICAgICAgfQogICAgICAgc2IuYXBwZW5kKHBhZGRlZEJ5dGVTdHJpbmcoYnVmW2ldKSk7CkBAIC0yOTQsMTIgKzI4NCwxNCBAQAogICB9CiAKICAgcHVibGljIHN0YXRpYyBieXRlW10gY29weUJpbmFyeShmaW5hbCBieXRlW10gb3JpZykgewotICAgIGlmIChvcmlnID09IG51bGwpIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KKyAgICByZXR1cm4gKG9yaWcgPT0gbnVsbCkgPyBudWxsIDogQXJyYXlzLmNvcHlPZihvcmlnLCBvcmlnLmxlbmd0aCk7CisgIH0KIAotICAgIGJ5dGVbXSBjb3B5ID0gbmV3IGJ5dGVbb3JpZy5sZW5ndGhdOwotICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZywgMCwgY29weSwgMCwgb3JpZy5sZW5ndGgpOwotICAgIHJldHVybiBjb3B5OworICBwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShsb25nIHZhbHVlKSB7CisgICAgcmV0dXJuIExvbmcuaGFzaENvZGUodmFsdWUpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoZG91YmxlIHZhbHVlKSB7CisgICAgcmV0dXJuIERvdWJsZS5oYXNoQ29kZSh2YWx1ZSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZVByb2Nlc3Nvci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlUHJvY2Vzc29yLmphdmEKaW5kZXggZjkzYjEzMy4uZjlhOWE5ZSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlUHJvY2Vzc29yLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlUHJvY2Vzc29yLmphdmEKQEAgLTEsNSArMSw2IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwogCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZTsKQEAgLTE3LDYgKzE4LDEwIEBACiAgICAgdGhpcy5wcm9jZXNzTWFwID0gcHJvY2Vzc0Z1bmN0aW9uTWFwOwogICB9CiAKKyAgcHVibGljIE1hcDxTdHJpbmcsUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyBUQmFzZT4+IGdldFByb2Nlc3NNYXBWaWV3KCkgeworICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAocHJvY2Vzc01hcCk7CisgIH0KKwogICBAT3ZlcnJpZGUKICAgcHVibGljIGJvb2xlYW4gcHJvY2VzcyhUUHJvdG9jb2wgaW4sIFRQcm90b2NvbCBvdXQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBUTWVzc2FnZSBtc2cgPSBpbi5yZWFkTWVzc2FnZUJlZ2luKCk7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQppbmRleCA5ZWQ4M2MwLi4zYTJkNTZjIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiAKIC8qKgogICogQ2xhc3MgdGhhdCBhbGxvd3MgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIGJ1ZiB3aXRob3V0IGRvaW5nIGRlZXAKQEAgLTI3LDE5ICsyOCwzNCBAQAogICoKICAqLwogcHVibGljIGNsYXNzIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXh0ZW5kcyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0geworCisgIHByaXZhdGUgZmluYWwgaW50IGluaXRpYWxTaXplOworCiAgIHB1YmxpYyBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGludCBzaXplKSB7CiAgICAgc3VwZXIoc2l6ZSk7CisgICAgdGhpcy5pbml0aWFsU2l6ZSA9IHNpemU7CiAgIH0KIAogICBwdWJsaWMgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpIHsKLSAgICBzdXBlcigpOworICAgIHRoaXMoMzIpOwogICB9CiAKICAgcHVibGljIGJ5dGVbXSBnZXQoKSB7CiAgICAgcmV0dXJuIGJ1ZjsKICAgfQogCisgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgIHN1cGVyLnJlc2V0KCk7CisgICAgaWYgKGJ1Zi5sZW5ndGggPiBpbml0aWFsU2l6ZSkgeworICAgICAgYnVmID0gbmV3IGJ5dGVbaW5pdGlhbFNpemVdOworICAgIH0KKyAgfQorCiAgIHB1YmxpYyBpbnQgbGVuKCkgewogICAgIHJldHVybiBjb3VudDsKICAgfQorCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoQ2hhcnNldCBjaGFyc2V0KSB7CisgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmLCAwLCBjb3VudCwgY2hhcnNldCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URGVzZXJpYWxpemVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVERlc2VyaWFsaXplci5qYXZhCmluZGV4IDgwM2Q5YzYuLmQxZDM5NjYgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URGVzZXJpYWxpemVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1REZXNlcmlhbGl6ZXIuamF2YQpAQCAtNjQsOCArNjQsMjAgQEAKICAgICogQHBhcmFtIGJ5dGVzIFRoZSBhcnJheSB0byByZWFkIGZyb20KICAgICovCiAgIHB1YmxpYyB2b2lkIGRlc2VyaWFsaXplKFRCYXNlIGJhc2UsIGJ5dGVbXSBieXRlcykgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgZGVzZXJpYWxpemUoYmFzZSwgYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7CisgIH0KKworICAvKioKKyAgICogRGVzZXJpYWxpemUgdGhlIFRocmlmdCBvYmplY3QgZnJvbSBhIGJ5dGUgYXJyYXkuCisgICAqCisgICAqIEBwYXJhbSBiYXNlIFRoZSBvYmplY3QgdG8gcmVhZCBpbnRvCisgICAqIEBwYXJhbSBieXRlcyBUaGUgYXJyYXkgdG8gcmVhZCBmcm9tCisgICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBpbnRvIHtAY29kZSBieXRlc30KKyAgICogQHBhcmFtIGxlbmd0aCBUaGUgbGVuZ3RoIHRvIHJlYWQgZnJvbSB7QGNvZGUgYnl0ZXN9CisgICAqLworICBwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZShUQmFzZSBiYXNlLCBieXRlW10gYnl0ZXMsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB0cnkgewotICAgICAgdHJhbnNfLnJlc2V0KGJ5dGVzKTsKKyAgICAgIHRyYW5zXy5yZXNldChieXRlcywgb2Zmc2V0LCBsZW5ndGgpOwogICAgICAgYmFzZS5yZWFkKHByb3RvY29sXyk7CiAgICAgfSBmaW5hbGx5IHsKICAgICAgIHRyYW5zXy5jbGVhcigpOwpAQCAtMjM5LDQ4ICsyNTEsMzEgQEAKICAgICB0cnkgewogICAgICAgVEZpZWxkIGZpZWxkID0gbG9jYXRlRmllbGQoYnl0ZXMsIGZpZWxkSWRQYXRoRmlyc3QsIGZpZWxkSWRQYXRoUmVzdCk7CiAgICAgICBpZiAoZmllbGQgIT0gbnVsbCkgewotICAgICAgICAvLyBpZiB0aGlzIHBvaW50IGlzIHJlYWNoZWQsIGlwcm90IHdpbGwgYmUgcG9zaXRpb25lZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpZWxkLgotICAgICAgICBzd2l0Y2godHR5cGUpeworICAgICAgICBpZiAodHR5cGUgPT0gZmllbGQudHlwZSkgeworICAgICAgICAgIC8vIGlmIHRoaXMgcG9pbnQgaXMgcmVhY2hlZCwgaXByb3Qgd2lsbCBiZSBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZgorICAgICAgICAgIC8vIHRoZSBmaWVsZAorICAgICAgICAgIHN3aXRjaCAodHR5cGUpIHsKICAgICAgICAgICBjYXNlIFRUeXBlLkJPT0w6Ci0gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5CT09MKXsKLSAgICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkQm9vbCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRCb29sKCk7CiAgICAgICAgICAgY2FzZSBUVHlwZS5CWVRFOgotICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuQllURSkgewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRCeXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEJ5dGUoKTsKICAgICAgICAgICBjYXNlIFRUeXBlLkRPVUJMRToKLSAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkRPVUJMRSkgewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWREb3VibGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkRG91YmxlKCk7CiAgICAgICAgICAgY2FzZSBUVHlwZS5JMTY6Ci0gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5JMTYpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkSTE2KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEkxNigpOwogICAgICAgICAgIGNhc2UgVFR5cGUuSTMyOgotICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTMyKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEkzMigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRJMzIoKTsKICAgICAgICAgICBjYXNlIFRUeXBlLkk2NDoKLSAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkk2NCkgewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRJNjQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkSTY0KCk7CiAgICAgICAgICAgY2FzZSBUVHlwZS5TVFJJTkc6Ci0gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVFJJTkcpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDEwMDogLy8gaGFjayB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gc3RyaW5nIGFuZCBiaW5hcnkKLSAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUUklORykgewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRCaW5hcnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBoYWNrIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBzdHJpbmcgYW5kIGJpbmFyeQorICAgICAgICBpZiAodHR5cGUgPT0gMTAwICYmIGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkQmluYXJ5KCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIHJldHVybiBudWxsOwpAQCAtMjk1LDExICsyOTAsOSBAQAogICBwcml2YXRlIFRGaWVsZCBsb2NhdGVGaWVsZChieXRlW10gYnl0ZXMsIFRGaWVsZElkRW51bSBmaWVsZElkUGF0aEZpcnN0LCBURmllbGRJZEVudW0gLi4uIGZpZWxkSWRQYXRoUmVzdCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHRyYW5zXy5yZXNldChieXRlcyk7CiAKLSAgICBURmllbGRJZEVudW1bXSBmaWVsZElkUGF0aD0gbmV3IFRGaWVsZElkRW51bVtmaWVsZElkUGF0aFJlc3QubGVuZ3RoICsgMV07CisgICAgVEZpZWxkSWRFbnVtW10gZmllbGRJZFBhdGggPSBuZXcgVEZpZWxkSWRFbnVtW2ZpZWxkSWRQYXRoUmVzdC5sZW5ndGggKyAxXTsKICAgICBmaWVsZElkUGF0aFswXSA9IGZpZWxkSWRQYXRoRmlyc3Q7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZElkUGF0aFJlc3QubGVuZ3RoOyBpKyspewotICAgICAgZmllbGRJZFBhdGhbaSArIDFdID0gZmllbGRJZFBhdGhSZXN0W2ldOwotICAgIH0KKyAgICBTeXN0ZW0uYXJyYXljb3B5KGZpZWxkSWRQYXRoUmVzdCwgMCwgZmllbGRJZFBhdGgsIDEsIGZpZWxkSWRQYXRoUmVzdC5sZW5ndGgpOwogCiAgICAgLy8gaW5kZXggaW50byBmaWVsZCBJRCBwYXRoIGJlaW5nIGN1cnJlbnRseSBzZWFyY2hlZCBmb3IKICAgICBpbnQgY3VyUGF0aEluZGV4ID0gMDsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URW51bUhlbHBlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFbnVtSGVscGVyLmphdmEKaW5kZXggYzE3ZDY2MS4uZmJjNzc4NyAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFbnVtSGVscGVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFbnVtSGVscGVyLmphdmEKQEAgLTE5LDcgKzE5LDYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKIAotaW1wb3J0IGphdmEubGFuZy5JbnN0YW50aWF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubGFuZy5Ob1N1Y2hNZXRob2RFeGNlcHRpb247CiBpbXBvcnQgamF2YS5sYW5nLklsbGVnYWxBY2Nlc3NFeGNlcHRpb247CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGM1NjAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgKiA8Y29kZT5UTXVsdGlwbGV4ZWRQcm9jZXNzb3I8L2NvZGU+IGlzIGEgPGNvZGU+VFByb2Nlc3NvcjwvY29kZT4gYWxsb3dpbmcKKyAqIGEgc2luZ2xlIDxjb2RlPlRTZXJ2ZXI8L2NvZGU+IHRvIHByb3ZpZGUgbXVsdGlwbGUgc2VydmljZXMuCisgKgorICogPHA+VG8gZG8gc28sIHlvdSBpbnN0YW50aWF0ZSB0aGUgcHJvY2Vzc29yIGFuZCB0aGVuIHJlZ2lzdGVyIGFkZGl0aW9uYWwKKyAqIHByb2Nlc3NvcnMgd2l0aCBpdCwgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOjwvcD4KKyAqCisgKiA8YmxvY2txdW90ZT48Y29kZT4KKyAqICAgICBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICoKKyAqICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgKiAgICAgICAgICJDYWxjdWxhdG9yIiwKKyAqICAgICAgICAgbmV3IENhbGN1bGF0b3IuUHJvY2Vzc29yKG5ldyBDYWxjdWxhdG9ySGFuZGxlcigpKSk7CisgKgorICogICAgIHByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigKKyAqICAgICAgICAgIldlYXRoZXJSZXBvcnQiLAorICogICAgICAgICBuZXcgV2VhdGhlclJlcG9ydC5Qcm9jZXNzb3IobmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKTsKKyAqCisgKiAgICAgVFNlcnZlclRyYW5zcG9ydCB0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCk7CisgKiAgICAgVFNpbXBsZVNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHQpOworICoKKyAqICAgICBzZXJ2ZXIuc2VydmUoKTsKKyAqIDwvY29kZT48L2Jsb2NrcXVvdGU+CisgKi8KK3B1YmxpYyBjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgaW1wbGVtZW50cyBUUHJvY2Vzc29yIHsKKworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZyxUUHJvY2Vzc29yPiBTRVJWSUNFX1BST0NFU1NPUl9NQVAKKyAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLFRQcm9jZXNzb3I+KCk7CisgICAgcHJpdmF0ZSBUUHJvY2Vzc29yIGRlZmF1bHRQcm9jZXNzb3I7CisKKyAgICAvKioKKyAgICAgKiAnUmVnaXN0ZXInIGEgc2VydmljZSB3aXRoIHRoaXMgPGNvZGU+VE11bHRpcGxleGVkUHJvY2Vzc29yPC9jb2RlPi4gIFRoaXMKKyAgICAgKiBhbGxvd3MgdXMgdG8gYnJva2VyIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UKKyAgICAgKiBuYW1lIHRvIHNlbGVjdCB0aGVtIGF0IHJlcXVlc3QgdGltZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBOYW1lIG9mIGEgc2VydmljZSwgaGFzIHRvIGJlIGlkZW50aWNhbCB0byB0aGUgbmFtZQorICAgICAqIGRlY2xhcmVkIGluIHRoZSBUaHJpZnQgSURMLCBlLmcuICJXZWF0aGVyUmVwb3J0Ii4KKyAgICAgKiBAcGFyYW0gcHJvY2Vzc29yIEltcGxlbWVudGF0aW9uIG9mIGEgc2VydmljZSwgdXN1YWxseSByZWZlcnJlZCB0bworICAgICAqIGFzICJoYW5kbGVycyIsIGUuZy4gV2VhdGhlclJlcG9ydEhhbmRsZXIgaW1wbGVtZW50aW5nIFdlYXRoZXJSZXBvcnQuSWZhY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJQcm9jZXNzb3IoU3RyaW5nIHNlcnZpY2VOYW1lLCBUUHJvY2Vzc29yIHByb2Nlc3NvcikgeworICAgICAgICBTRVJWSUNFX1BST0NFU1NPUl9NQVAucHV0KHNlcnZpY2VOYW1lLCBwcm9jZXNzb3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgc2VydmljZSB0byBiZSBjYWxsZWQgdG8gcHJvY2VzcyBxdWVyaWVzIHdpdGhvdXQgc2VydmljZSBuYW1lCisgICAgICogQHBhcmFtIHByb2Nlc3NvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGVmYXVsdChUUHJvY2Vzc29yIHByb2Nlc3NvcikgeworICAgICAgICBkZWZhdWx0UHJvY2Vzc29yID0gcHJvY2Vzc29yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+cHJvY2VzczwvY29kZT4gcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKyAgICAgKgorICAgICAqIDxvbD4KKyAgICAgKiAgICAgPGxpPlJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZS48L2xpPgorICAgICAqICAgICA8bGk+RXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIG1lc3NhZ2UuPC9saT4KKyAgICAgKiAgICAgPGxpPlVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IuPC9saT4KKyAgICAgKiAgICAgPGxpPkRpc3BhdGNoIHRvIHRoZSBwcm9jZXNzb3IsIHdpdGggYSBkZWNvcmF0ZWQgaW5zdGFuY2Ugb2YgVFByb3RvY29sCisgICAgICogICAgICAgICB0aGF0IGFsbG93cyByZWFkTWVzc2FnZUJlZ2luKCkgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCBUTWVzc2FnZS48L2xpPgorICAgICAqIDwvb2w+CisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gSWYgdGhlIG1lc3NhZ2UgdHlwZSBpcyBub3QgQ0FMTCBvciBPTkVXQVksIGlmCisgICAgICogdGhlIHNlcnZpY2UgbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBtZXNzYWdlLCBvciBpZiB0aGUgc2VydmljZQorICAgICAqIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgc2VydmljZSBtYXAuICBZb3UgY2FsbGVkIHtAbGluayAjcmVnaXN0ZXJQcm9jZXNzb3IoU3RyaW5nLCBUUHJvY2Vzc29yKSByZWdpc3RlclByb2Nlc3Nvcn0KKyAgICAgKiBkdXJpbmcgaW5pdGlhbGl6YXRpb24sIHJpZ2h0PyA6KQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3MoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgLyoKKyAgICAgICAgICAgIFVzZSB0aGUgYWN0dWFsIHVuZGVybHlpbmcgcHJvdG9jb2wgKGUuZy4gVEJpbmFyeVByb3RvY29sKSB0byByZWFkIHRoZQorICAgICAgICAgICAgbWVzc2FnZSBoZWFkZXIuICBUaGlzIHB1bGxzIHRoZSBtZXNzYWdlICJvZmYgdGhlIHdpcmUiLCB3aGljaCB3ZSdsbAorICAgICAgICAgICAgZGVhbCB3aXRoIGF0IHRoZSBlbmQgb2YgdGhpcyBtZXRob2QuCisgICAgICAgICovCisgICAgICAgIFRNZXNzYWdlIG1lc3NhZ2UgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7CisKKyAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPSBUTWVzc2FnZVR5cGUuQ0FMTCAmJiBtZXNzYWdlLnR5cGUgIT0gVE1lc3NhZ2VUeXBlLk9ORVdBWSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlRoaXMgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkIT8iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZQorICAgICAgICBpbnQgaW5kZXggPSBtZXNzYWdlLm5hbWUuaW5kZXhPZihUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IpOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgaWYgKGRlZmF1bHRQcm9jZXNzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIERpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFByb2Nlc3Nvci5wcm9jZXNzKG5ldyBTdG9yZWRNZXNzYWdlUHJvdG9jb2woaXByb3QsIG1lc3NhZ2UpLCBvcHJvdCk7CisgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiAiICsgbWVzc2FnZS5uYW1lICsgIi4gIERpZCB5b3UgIiArCisgICAgICAgICAgICAgICAgICAgICJmb3JnZXQgdG8gdXNlIGEgVE11bHRpcGxleFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgY29uc3VtZWQgYnkgYW55IFRQcm90b2NvbAorICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBtZXNzYWdlLm5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgICAgVFByb2Nlc3NvciBhY3R1YWxQcm9jZXNzb3IgPSBTRVJWSUNFX1BST0NFU1NPUl9NQVAuZ2V0KHNlcnZpY2VOYW1lKTsKKyAgICAgICAgaWYgKGFjdHVhbFByb2Nlc3NvciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogIiArIHNlcnZpY2VOYW1lICsgIi4gIERpZCB5b3UgZm9yZ2V0ICIgKworICAgICAgICAgICAgICAgICAgICAidG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCByZW1vdmluZyB0aGUgc2VydmljZSBuYW1lCisgICAgICAgIFRNZXNzYWdlIHN0YW5kYXJkTWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBtZXNzYWdlLm5hbWUuc3Vic3RyaW5nKHNlcnZpY2VOYW1lLmxlbmd0aCgpK1RNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUi5sZW5ndGgoKSksCisgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlLAorICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VxaWQKKyAgICAgICAgKTsKKworICAgICAgICAvLyBEaXNwYXRjaCBwcm9jZXNzaW5nIHRvIHRoZSBzdG9yZWQgcHJvY2Vzc29yCisgICAgICAgIHJldHVybiBhY3R1YWxQcm9jZXNzb3IucHJvY2VzcyhuZXcgU3RvcmVkTWVzc2FnZVByb3RvY29sKGlwcm90LCBzdGFuZGFyZE1lc3NhZ2UpLCBvcHJvdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogIE91ciBnb2FsIHdhcyB0byB3b3JrIHdpdGggYW55IHByb3RvY29sLiAgSW4gb3JkZXIgdG8gZG8gdGhhdCwgd2UgbmVlZGVkCisgICAgICogIHRvIGFsbG93IHRoZW0gdG8gY2FsbCByZWFkTWVzc2FnZUJlZ2luKCkgYW5kIGdldCBhIFRNZXNzYWdlIGluIGV4YWN0bHkKKyAgICAgKiAgdGhlIHN0YW5kYXJkIGZvcm1hdCwgd2l0aG91dCB0aGUgc2VydmljZSBuYW1lIHByZXBlbmRlZCB0byBUTWVzc2FnZS5uYW1lLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbERlY29yYXRvciB7CisgICAgICAgIFRNZXNzYWdlIG1lc3NhZ2VCZWdpbjsKKyAgICAgICAgcHVibGljIFN0b3JlZE1lc3NhZ2VQcm90b2NvbChUUHJvdG9jb2wgcHJvdG9jb2wsIFRNZXNzYWdlIG1lc3NhZ2VCZWdpbikgeworICAgICAgICAgICAgc3VwZXIocHJvdG9jb2wpOworICAgICAgICAgICAgdGhpcy5tZXNzYWdlQmVnaW4gPSBtZXNzYWdlQmVnaW47CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VCZWdpbjsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1ROb25ibG9ja2luZ011bHRpRmV0Y2hDbGllbnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UTm9uYmxvY2tpbmdNdWx0aUZldGNoQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyZDk3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UTm9uYmxvY2tpbmdNdWx0aUZldGNoQ2xpZW50LmphdmEKQEAgLTAsMCArMSwzOTkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmVUYXNrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CisKKworLyoqCisgKiBUaGlzIGNsYXNzIHVzZXMgYSBzaW5nbGUgdGhyZWFkIHRvIHNldCB1cCBub24tYmxvY2tpbmcgc29ja2V0cyB0byBhIHNldAorICogb2YgcmVtb3RlIHNlcnZlcnMgKGhvc3RuYW1lIGFuZCBwb3J0IHBhaXJzKSwgYW5kIHNlbmRzIGEgc2FtZSByZXF1ZXN0IHRvCisgKiBhbGwgdGhlc2Ugc2VydmVycy4gSXQgdGhlbiBmZXRjaGVzIHJlc3BvbnNlcyBmcm9tIHNlcnZlcnMuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgaW50IG1heFJlY3ZCdWZCeXRlc1BlclNlcnZlciAtIGFuIHVwcGVyIGxpbWl0IGZvciByZWNlaXZlIGJ1ZmZlciBzaXplCisgKiBwZXIgc2VydmVyIChpbiBieXRlKS4gSWYgYSByZXNwb25zZSBmcm9tIGEgc2VydmVyIGV4Y2VlZHMgdGhpcyBsaW1pdCwgdGhlCisgKiBjbGllbnQgd2lsbCBub3QgYWxsb2NhdGUgbWVtb3J5IG9yIHJlYWQgcmVzcG9uc2UgZGF0YSBmb3IgaXQuCisgKgorICogICBpbnQgZmV0Y2hUaW1lb3V0U2Vjb25kcyAtIHRpbWUgbGltaXQgZm9yIGZldGNoaW5nIHJlc3BvbnNlcyBmcm9tIGFsbAorICogc2VydmVycyAoaW4gc2Vjb25kKS4gQWZ0ZXIgdGhlIHRpbWVvdXQsIHRoZSBmZXRjaCBqb2IgaXMgc3RvcHBlZCBhbmQKKyAqIGF2YWlsYWJsZSByZXNwb25zZXMgYXJlIHJldHVybmVkLgorICoKKyAqICAgQnl0ZUJ1ZmZlciByZXF1ZXN0QnVmIC0gcmVxdWVzdCBtZXNzYWdlIHRoYXQgaXMgc2VudCB0byBhbGwgc2VydmVycy4KKyAqCisgKiBPdXRwdXQ6CisgKiAgIFJlc3BvbnNlcyBhcmUgc3RvcmVkIGluIGFuIGFycmF5IG9mIEJ5dGVCdWZmZXJzLiBJbmRleCBvZiBlbGVtZW50cyBpbgorICogdGhpcyBhcnJheSBjb3JyZXNwb25kcyB0byBpbmRleCBvZiBzZXJ2ZXJzIGluIHRoZSBzZXJ2ZXIgbGlzdC4gQ29udGVudCBpbgorICogYSBCeXRlQnVmZmVyIG1heSBiZSBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtczoKKyAqICAgMS4gRmlyc3QgNCBieXRlcyBmb3JtIGFuIGludGVnZXIgaW5kaWNhdGluZyBsZW5ndGggb2YgZm9sbG93aW5nIGRhdGEsCisgKiB0aGVuIGZvbGxvd2VkIGJ5IHRoZSBkYXRhLgorICogICAyLiBGaXJzdCA0IGJ5dGVzIGZvcm0gYW4gaW50ZWdlciBpbmRpY2F0aW5nIGxlbmd0aCBvZiBmb2xsb3dpbmcgZGF0YSwKKyAqIHRoZW4gZm9sbG93ZWQgYnkgbm90aGluZyAtIHRoaXMgaGFwcGVucyB3aGVuIHRoZSByZXNwb25zZSBkYXRhIHNpemUKKyAqIGV4Y2VlZHMgbWF4UmVjdkJ1ZkJ5dGVzUGVyU2VydmVyLCBhbmQgdGhlIGNsaWVudCB3aWxsIG5vdCByZWFkIGFueQorICogcmVzcG9uc2UgZGF0YS4KKyAqICAgMy4gTm8gZGF0YSBpbiB0aGUgQnl0ZUJ1ZmZlciAtIHRoaXMgaGFwcGVucyB3aGVuIHRoZSBzZXJ2ZXIgZG9lcyBub3QKKyAqIHJldHVybiBhbnkgcmVzcG9uc2Ugd2l0aGluIGZldGNoVGltZW91dFNlY29uZHMuCisgKgorICogICBJbiBzb21lIHNwZWNpYWwgY2FzZXMgKG5vIHNlcnZlcnMgYXJlIGdpdmVuLCBmZXRjaFRpbWVvdXRTZWNvbmRzIGxlc3MKKyAqIHRoYW4gb3IgZXF1YWwgdG8gMCwgcmVxdWVzdEJ1ZiBpcyBudWxsKSwgdGhlIHJldHVybiBpcyBudWxsLgorICoKKyAqIE5vdGU6CisgKiAgIEl0IGFzc3VtZXMgYWxsIHJlbW90ZSBzZXJ2ZXJzIGFyZSBUTm9uYmxvY2tpbmdTZXJ2ZXJzIGFuZCB1c2UKKyAqIFRGcmFtZWRUcmFuc3BvcnQuCisgKgorICovCitwdWJsaWMgY2xhc3MgVE5vbmJsb2NraW5nTXVsdGlGZXRjaENsaWVudCB7CisgIAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoCisgICAgVE5vbmJsb2NraW5nTXVsdGlGZXRjaENsaWVudC5jbGFzcy5nZXROYW1lKCkKKyAgKTsKKworICAvLyBpZiB0aGUgc2l6ZSBvZiB0aGUgcmVzcG9uc2UgbXNnIGV4Y2VlZHMgdGhpcyBsaW1pdCAoaW4gYnl0ZSksIHdlIHdpbGwKKyAgLy8gbm90IHJlYWQgdGhlIG1zZworICBwcml2YXRlIGludCBtYXhSZWN2QnVmQnl0ZXNQZXJTZXJ2ZXI7CisKKyAgLy8gdGltZSBsaW1pdCBmb3IgZmV0Y2hpbmcgZGF0YSBmcm9tIGFsbCBzZXJ2ZXJzIChpbiBzZWNvbmQpCisgIHByaXZhdGUgaW50IGZldGNoVGltZW91dFNlY29uZHM7CisKKyAgLy8gc3RvcmUgcmVxdWVzdCB0aGF0IHdpbGwgYmUgc2VudCB0byBzZXJ2ZXJzICAKKyAgcHJpdmF0ZSBCeXRlQnVmZmVyIHJlcXVlc3RCdWY7CisgIHByaXZhdGUgQnl0ZUJ1ZmZlciByZXF1ZXN0QnVmRHVwbGljYXRpb247CisKKyAgLy8gYSBsaXN0IG9mIHJlbW90ZSBzZXJ2ZXJzCisgIHByaXZhdGUgTGlzdDxJbmV0U29ja2V0QWRkcmVzcz4gc2VydmVyczsKKworICAvLyBzdG9yZSBmZXRjaCByZXN1bHRzCisgIHByaXZhdGUgVE5vbmJsb2NraW5nTXVsdGlGZXRjaFN0YXRzIHN0YXRzOworICBwcml2YXRlIEJ5dGVCdWZmZXJbXSByZWN2QnVmOworCisgIHB1YmxpYyBUTm9uYmxvY2tpbmdNdWx0aUZldGNoQ2xpZW50KGludCBtYXhSZWN2QnVmQnl0ZXNQZXJTZXJ2ZXIsCisgICAgaW50IGZldGNoVGltZW91dFNlY29uZHMsIEJ5dGVCdWZmZXIgcmVxdWVzdEJ1ZiwKKyAgICBMaXN0PEluZXRTb2NrZXRBZGRyZXNzPiBzZXJ2ZXJzKSB7CisgICAgdGhpcy5tYXhSZWN2QnVmQnl0ZXNQZXJTZXJ2ZXIgPSBtYXhSZWN2QnVmQnl0ZXNQZXJTZXJ2ZXI7CisgICAgdGhpcy5mZXRjaFRpbWVvdXRTZWNvbmRzID0gZmV0Y2hUaW1lb3V0U2Vjb25kczsKKyAgICB0aGlzLnJlcXVlc3RCdWYgPSByZXF1ZXN0QnVmOworICAgIHRoaXMuc2VydmVycyA9IHNlcnZlcnM7CisgICAgICAKKyAgICBzdGF0cyA9IG5ldyBUTm9uYmxvY2tpbmdNdWx0aUZldGNoU3RhdHMoKTsKKyAgICByZWN2QnVmID0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldE1heFJlY3ZCdWZCeXRlc1BlclNlcnZlcigpIHsKKyAgICByZXR1cm4gbWF4UmVjdkJ1ZkJ5dGVzUGVyU2VydmVyOworICB9CisKKyAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0RmV0Y2hUaW1lb3V0U2Vjb25kcygpIHsKKyAgICByZXR1cm4gZmV0Y2hUaW1lb3V0U2Vjb25kczsKKyAgfQorCisgIC8qKgorICAgKiByZXR1cm4gYSBkdXBsaWNhdGlvbiBvZiByZXF1ZXN0QnVmLCBzbyB0aGF0IHJlcXVlc3RCdWYgd2lsbCBub3QKKyAgICogYmUgbW9kaWZpZWQgYnkgb3RoZXJzLgorICAgKi8KKyAgcHVibGljIHN5bmNocm9uaXplZCBCeXRlQnVmZmVyIGdldFJlcXVlc3RCdWYoKSB7CisgICAgaWYgKHJlcXVlc3RCdWYgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChyZXF1ZXN0QnVmRHVwbGljYXRpb24gPT0gbnVsbCkgeworICAgICAgICByZXF1ZXN0QnVmRHVwbGljYXRpb24gPSByZXF1ZXN0QnVmLmR1cGxpY2F0ZSgpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlcXVlc3RCdWZEdXBsaWNhdGlvbjsgIAorICAgIH0KKyAgfQorCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdDxJbmV0U29ja2V0QWRkcmVzcz4gZ2V0U2VydmVyTGlzdCgpIHsKKyAgICBpZiAoc2VydmVycyA9PSBudWxsKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3Qoc2VydmVycyk7CisgIH0KKworICBwdWJsaWMgc3luY2hyb25pemVkIFROb25ibG9ja2luZ011bHRpRmV0Y2hTdGF0cyBnZXRGZXRjaFN0YXRzKCkgeworICAgIHJldHVybiBzdGF0czsKKyAgfQorCisgIC8qKgorICAgKiBtYWluIGVudHJ5IGZ1bmN0aW9uIGZvciBmZXRjaGluZyBmcm9tIHNlcnZlcnMKKyAgICovCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQnl0ZUJ1ZmZlcltdIGZldGNoKCkgeworICAgIC8vIGNsZWFyIHByZXZpb3VzIHJlc3VsdHMKKyAgICByZWN2QnVmID0gbnVsbDsKKyAgICBzdGF0cy5jbGVhcigpOworCisgICAgaWYgKHNlcnZlcnMgPT0gbnVsbCB8fCBzZXJ2ZXJzLnNpemUoKSA9PSAwIHx8CisgICAgICAgIHJlcXVlc3RCdWYgPT0gbnVsbCB8fCBmZXRjaFRpbWVvdXRTZWNvbmRzIDw9IDApIHsKKyAgICAgIHJldHVybiByZWN2QnVmOworICAgIH0KKworICAgIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpOworICAgIE11bHRpRmV0Y2ggbXVsdGlGZXRjaCA9IG5ldyBNdWx0aUZldGNoKCk7CisgICAgRnV0dXJlVGFzazw/PiB0YXNrID0gbmV3IEZ1dHVyZVRhc2sobXVsdGlGZXRjaCwgbnVsbCk7CisgICAgZXhlY3V0b3IuZXhlY3V0ZSh0YXNrKTsKKyAgICB0cnkgeworICAgICAgdGFzay5nZXQoZmV0Y2hUaW1lb3V0U2Vjb25kcywgVGltZVVuaXQuU0VDT05EUyk7CisgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgLy8gYXR0ZW1wdCB0byBjYW5jZWwgZXhlY3V0aW9uIG9mIHRoZSB0YXNrLgorICAgICAgdGFzay5jYW5jZWwodHJ1ZSk7CisgICAgICBMT0dHRVIuZXJyb3IoImludGVycnVwdGVkIGR1cmluZyBmZXRjaDogIitpZS50b1N0cmluZygpKTsKKyAgICB9IGNhdGNoKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlZSkgeworICAgICAgLy8gYXR0ZW1wdCB0byBjYW5jZWwgZXhlY3V0aW9uIG9mIHRoZSB0YXNrLgorICAgICAgdGFzay5jYW5jZWwodHJ1ZSk7CisgICAgICBMT0dHRVIuZXJyb3IoImV4Y2VwdGlvbiBkdXJpbmcgZmV0Y2g6ICIrZWUudG9TdHJpbmcoKSk7CisgICAgfSBjYXRjaChUaW1lb3V0RXhjZXB0aW9uIHRlKSB7CisgICAgICAvLyBhdHRlbXB0IHRvIGNhbmNlbCBleGVjdXRpb24gb2YgdGhlIHRhc2suICAKKyAgICAgIHRhc2suY2FuY2VsKHRydWUpOworICAgICAgTE9HR0VSLmVycm9yKCJ0aW1lb3V0IGZvciBmZXRjaDogIit0ZS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBleGVjdXRvci5zaHV0ZG93bk5vdygpOworICAgIG11bHRpRmV0Y2guY2xvc2UoKTsKKyAgICByZXR1cm4gcmVjdkJ1ZjsKKyAgfQorCisgIC8qKgorICAgKiBQcml2YXRlIGNsYXNzIHRoYXQgZG9lcyByZWFsIGZldGNoIGpvYi4KKyAgICogVXNlcnMgYXJlIG5vdCBhbGxvd2VkIHRvIGRpcmVjdGx5IHVzZSB0aGlzIGNsYXNzLCBhcyBpdHMgcnVuKCkKKyAgICogZnVuY3Rpb24gbWF5IHJ1biBmb3JldmVyLgorICAgKi8KKyAgcHJpdmF0ZSBjbGFzcyBNdWx0aUZldGNoIGltcGxlbWVudHMgUnVubmFibGUgeworICAgIHByaXZhdGUgU2VsZWN0b3Igc2VsZWN0b3I7CisKKyAgICAvKioKKyAgICAgKiBtYWluIGVudHJ5IGZ1bmN0aW9uIGZvciBmZXRjaGluZy4KKyAgICAgKgorICAgICAqIFNlcnZlciByZXNwb25zZXMgYXJlIHN0b3JlZCBpbiBUTm9uYmxvY2luZ011bHRpRmV0Y2hDbGllbnQucmVjdkJ1ZiwKKyAgICAgKiBhbmQgZmV0Y2ggc3RhdGlzdGljcyBpcyBpbiBUTm9uYmxvY2tpbmdNdWx0aUZldGNoQ2xpZW50LnN0YXRzLgorICAgICAqCisgICAgICogU2FuaXR5IGNoZWNrIGZvciBwYXJhbWV0ZXJzIGhhcyBiZWVuIGRvbmUgaW4KKyAgICAgKiBUTm9uYmxvY2tpbmdNdWx0aUZldGNoQ2xpZW50IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgbG9uZyB0MSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICBpbnQgbnVtVG90YWxTZXJ2ZXJzID0gc2VydmVycy5zaXplKCk7CisgICAgICBzdGF0cy5zZXROdW1Ub3RhbFNlcnZlcnMobnVtVG90YWxTZXJ2ZXJzKTsKKworICAgICAgLy8gYnVmZmVyIGZvciByZWNlaXZpbmcgcmVzcG9uc2UgZnJvbSBzZXJ2ZXJzCisgICAgICByZWN2QnVmICAgICAgICAgICAgICAgICAgICAgPSBuZXcgQnl0ZUJ1ZmZlcltudW1Ub3RhbFNlcnZlcnNdOworICAgICAgLy8gYnVmZmVyIGZvciBzZW5kaW5nIHJlcXVlc3QKKyAgICAgIEJ5dGVCdWZmZXIgc2VuZEJ1ZltdICAgICAgICA9IG5ldyBCeXRlQnVmZmVyW251bVRvdGFsU2VydmVyc107CisgICAgICBsb25nIG51bUJ5dGVzUmVhZFtdICAgICAgICAgPSBuZXcgbG9uZ1tudW1Ub3RhbFNlcnZlcnNdOworICAgICAgaW50IGZyYW1lU2l6ZVtdICAgICAgICAgICAgID0gbmV3IGludFtudW1Ub3RhbFNlcnZlcnNdOworICAgICAgYm9vbGVhbiBoYXNSZWFkRnJhbWVTaXplW10gID0gbmV3IGJvb2xlYW5bbnVtVG90YWxTZXJ2ZXJzXTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgc2VsZWN0b3IgPSBTZWxlY3Rvci5vcGVuKCk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIExPR0dFUi5lcnJvcigic2VsZWN0b3Igb3BlbnMgZXJyb3I6ICIrZS50b1N0cmluZygpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVRvdGFsU2VydmVyczsgaSsrKSB7CisgICAgICAgIC8vIGNyZWF0ZSBidWZmZXIgdG8gc2VuZCByZXF1ZXN0IHRvIHNlcnZlci4KKyAgICAgICAgc2VuZEJ1ZltpXSA9IHJlcXVlc3RCdWYuZHVwbGljYXRlKCk7CisgICAgICAgIC8vIGNyZWF0ZSBidWZmZXIgdG8gcmVhZCByZXNwb25zZSdzIGZyYW1lIHNpemUgZnJvbSBzZXJ2ZXIKKyAgICAgICAgcmVjdkJ1ZltpXSA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoNCk7CisgICAgICAgIHN0YXRzLmluY1RvdGFsUmVjdkJ1ZkJ5dGVzKDQpOworCisgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIHNlcnZlciA9IHNlcnZlcnMuZ2V0KGkpOworICAgICAgICBTb2NrZXRDaGFubmVsIHMgPSBudWxsOworICAgICAgICBTZWxlY3Rpb25LZXkga2V5ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzID0gU29ja2V0Q2hhbm5lbC5vcGVuKCk7CisgICAgICAgICAgcy5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7CisgICAgICAgICAgLy8gbm93IHRoaXMgbWV0aG9kIGlzIG5vbi1ibG9ja2luZworICAgICAgICAgIHMuY29ubmVjdChzZXJ2ZXIpOworICAgICAgICAgIGtleSA9IHMucmVnaXN0ZXIoc2VsZWN0b3IsIHMudmFsaWRPcHMoKSk7CisgICAgICAgICAgLy8gYXR0YWNoIGluZGV4IG9mIHRoZSBrZXkKKyAgICAgICAgICBrZXkuYXR0YWNoKGkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIHN0YXRzLmluY051bUNvbm5lY3RFcnJvclNlcnZlcnMoKTsgIAorICAgICAgICAgIFN0cmluZyBlcnIgPSBTdHJpbmcuZm9ybWF0KCJzZXQgdXAgc29ja2V0IHRvIHNlcnZlciAlcyBlcnJvcjogJXMiLAorICAgICAgICAgICAgc2VydmVyLnRvU3RyaW5nKCksIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgTE9HR0VSLmVycm9yKGVycik7CisgICAgICAgICAgLy8gZnJlZSByZXNvdXJjZQorICAgICAgICAgIGlmIChzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7cy5jbG9zZSgpO30gY2F0Y2ggKEV4Y2VwdGlvbiBleCkge30KKyAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7CisgICAgICAgICAgICAga2V5LmNhbmNlbCgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyB3YWl0IGZvciBldmVudHMKKyAgICAgIHdoaWxlIChzdGF0cy5nZXROdW1SZWFkQ29tcGxldGVkU2VydmVycygpICsKKyAgICAgICAgc3RhdHMuZ2V0TnVtQ29ubmVjdEVycm9yU2VydmVycygpIDwgc3RhdHMuZ2V0TnVtVG90YWxTZXJ2ZXJzKCkpIHsKKyAgICAgICAgLy8gaWYgdGhlIHRocmVhZCBpcyBpbnRlcnJ1cHRlZCAoZS5nLiwgdGFzayBpcyBjYW5jZWxsZWQpICAKKyAgICAgICAgaWYgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaXNJbnRlcnJ1cHRlZCgpKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5eworICAgICAgICAgIHNlbGVjdG9yLnNlbGVjdCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIExPR0dFUi5lcnJvcigic2VsZWN0b3Igc2VsZWN0cyBlcnJvcjogIitlLnRvU3RyaW5nKCkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgSXRlcmF0b3I8U2VsZWN0aW9uS2V5PiBpdCA9IHNlbGVjdG9yLnNlbGVjdGVkS2V5cygpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICBTZWxlY3Rpb25LZXkgc2VsS2V5ID0gaXQubmV4dCgpOworICAgICAgICAgIGl0LnJlbW92ZSgpOworCisgICAgICAgICAgLy8gZ2V0IHByZXZpb3VzbHkgYXR0YWNoZWQgaW5kZXgKKyAgICAgICAgICBpbnQgaW5kZXggPSAoSW50ZWdlcilzZWxLZXkuYXR0YWNobWVudCgpOworCisgICAgICAgICAgaWYgKHNlbEtleS5pc1ZhbGlkKCkgJiYgc2VsS2V5LmlzQ29ubmVjdGFibGUoKSkgeworICAgICAgICAgICAgLy8gaWYgdGhpcyBzb2NrZXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiAoZS5nLiwgY29ubmVjdGlvbiByZWZ1c2VkKSwKKyAgICAgICAgICAgIC8vIHByaW50IGVycm9yIG1zZyBhbmQgc2tpcCBpdC4KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIFNvY2tldENoYW5uZWwgc0NoYW5uZWwgPSAoU29ja2V0Q2hhbm5lbClzZWxLZXkuY2hhbm5lbCgpOworICAgICAgICAgICAgICBzQ2hhbm5lbC5maW5pc2hDb25uZWN0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICBzdGF0cy5pbmNOdW1Db25uZWN0RXJyb3JTZXJ2ZXJzKCk7CisgICAgICAgICAgICAgIFN0cmluZyBlcnIgPSBTdHJpbmcuZm9ybWF0KCJzb2NrZXQgJWQgY29ubmVjdHMgdG8gc2VydmVyICVzICIgKworICAgICAgICAgICAgICAgICJlcnJvcjogJXMiLAorICAgICAgICAgICAgICAgIGluZGV4LCBzZXJ2ZXJzLmdldChpbmRleCkudG9TdHJpbmcoKSwgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgTE9HR0VSLmVycm9yKGVycik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHNlbEtleS5pc1ZhbGlkKCkgJiYgc2VsS2V5LmlzV3JpdGFibGUoKSkgeworICAgICAgICAgICAgaWYgKHNlbmRCdWZbaW5kZXhdLmhhc1JlbWFpbmluZygpKSB7CisgICAgICAgICAgICAgIC8vIGlmIHRoaXMgc29ja2V0IHRocm93cyBhbiBleGNlcHRpb24sIHByaW50IGVycm9yIG1zZyBhbmQKKyAgICAgICAgICAgICAgLy8gc2tpcCBpdC4KKyAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTb2NrZXRDaGFubmVsIHNDaGFubmVsID0gKFNvY2tldENoYW5uZWwpc2VsS2V5LmNoYW5uZWwoKTsKKyAgICAgICAgICAgICAgICBzQ2hhbm5lbC53cml0ZShzZW5kQnVmW2luZGV4XSk7CisgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGVyciA9IFN0cmluZy5mb3JtYXQoInNvY2tldCAlZCB3cml0ZXMgdG8gc2VydmVyICVzICIgKworICAgICAgICAgICAgICAgICAgImVycm9yOiAlcyIsCisgICAgICAgICAgICAgICAgICBpbmRleCwgc2VydmVycy5nZXQoaW5kZXgpLnRvU3RyaW5nKCksIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgTE9HR0VSLmVycm9yKGVycik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoc2VsS2V5LmlzVmFsaWQoKSAmJiBzZWxLZXkuaXNSZWFkYWJsZSgpKSB7CisgICAgICAgICAgICAvLyBpZiB0aGlzIHNvY2tldCB0aHJvd3MgYW4gZXhjZXB0aW9uLCBwcmludCBlcnJvciBtc2cgYW5kCisgICAgICAgICAgICAvLyBza2lwIGl0LgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgU29ja2V0Q2hhbm5lbCBzQ2hhbm5lbCA9IChTb2NrZXRDaGFubmVsKXNlbEtleS5jaGFubmVsKCk7CisgICAgICAgICAgICAgIGludCBieXRlc1JlYWQgPSBzQ2hhbm5lbC5yZWFkKHJlY3ZCdWZbaW5kZXhdKTsKKworICAgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkID4gMCkgeworICAgICAgICAgICAgICAgIG51bUJ5dGVzUmVhZFtpbmRleF0gKz0gYnl0ZXNSZWFkOworCisgICAgICAgICAgICAgICAgaWYgKCFoYXNSZWFkRnJhbWVTaXplW2luZGV4XSAmJgorICAgICAgICAgICAgICAgICAgICByZWN2QnVmW2luZGV4XS5yZW1haW5pbmcoKT09MCkgeworICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZyYW1lIHNpemUgaGFzIGJlZW4gcmVhZCBjb21wbGV0ZWx5LCB0aGVuIHByZXBhcmUKKyAgICAgICAgICAgICAgICAgIC8vIHRvIHJlYWQgdGhlIGFjdHVhbCBmcmFtZS4KKyAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZVtpbmRleF0gPSByZWN2QnVmW2luZGV4XS5nZXRJbnQoMCk7CisKKyAgICAgICAgICAgICAgICAgIGlmIChmcmFtZVNpemVbaW5kZXhdIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHMuaW5jTnVtSW52YWxpZEZyYW1lU2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXJyID0gU3RyaW5nLmZvcm1hdCgiUmVhZCBhbiBpbnZhbGlkIGZyYW1lIHNpemUgJWQiCisgICAgICAgICAgICAgICAgICAgICAgKyAiIGZyb20gJXMuIERvZXMgdGhlIHNlcnZlciB1c2UgVEZyYW1lZFRyYW5zcG9ydD8gIiwKKyAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemVbaW5kZXhdLCBzZXJ2ZXJzLmdldChpbmRleCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5lcnJvcihlcnIpOworICAgICAgICAgICAgICAgICAgICBzQ2hhbm5lbC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lU2l6ZVtpbmRleF0gKyA0ID4gc3RhdHMuZ2V0TWF4UmVzcG9uc2VCeXRlcygpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRzLnNldE1heFJlc3BvbnNlQnl0ZXMoZnJhbWVTaXplW2luZGV4XSs0KTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lU2l6ZVtpbmRleF0gKyA0ID4gbWF4UmVjdkJ1ZkJ5dGVzUGVyU2VydmVyKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRzLmluY051bU92ZXJmbG93ZWRSZWN2QnVmKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnIgPSBTdHJpbmcuZm9ybWF0KCJSZWFkIGZyYW1lIHNpemUgJWQgZnJvbSAlcywiCisgICAgICAgICAgICAgICAgICAgICAgKyAiIHRvdGFsIGJ1ZmZlciBzaXplIHdvdWxkIGV4Y2VlZCBsaW1pdCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplW2luZGV4XSwgc2VydmVycy5nZXQoaW5kZXgpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgbWF4UmVjdkJ1ZkJ5dGVzUGVyU2VydmVyKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmVycm9yKGVycik7ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBzQ2hhbm5lbC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgLy8gcmVhbGxvY2F0ZSBidWZmZXIgZm9yIGFjdHVhbCBmcmFtZSBkYXRhCisgICAgICAgICAgICAgICAgICByZWN2QnVmW2luZGV4XSA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoZnJhbWVTaXplW2luZGV4XSArIDQpOworICAgICAgICAgICAgICAgICAgcmVjdkJ1ZltpbmRleF0ucHV0SW50KGZyYW1lU2l6ZVtpbmRleF0pOworCisgICAgICAgICAgICAgICAgICBzdGF0cy5pbmNUb3RhbFJlY3ZCdWZCeXRlcyhmcmFtZVNpemVbaW5kZXhdKTsKKyAgICAgICAgICAgICAgICAgIGhhc1JlYWRGcmFtZVNpemVbaW5kZXhdID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaGFzUmVhZEZyYW1lU2l6ZVtpbmRleF0gJiYKKyAgICAgICAgICAgICAgICAgIG51bUJ5dGVzUmVhZFtpbmRleF0gPj0gZnJhbWVTaXplW2luZGV4XSs0KSB7CisgICAgICAgICAgICAgICAgICAvLyBoYXMgcmVhZCBhbGwgZGF0YQorICAgICAgICAgICAgICAgICAgc0NoYW5uZWwuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgIHN0YXRzLmluY051bVJlYWRDb21wbGV0ZWRTZXJ2ZXJzKCk7CisgICAgICAgICAgICAgICAgICBsb25nIHQyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgICBzdGF0cy5zZXRSZWFkVGltZSh0Mi10MSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICBTdHJpbmcgZXJyID0gU3RyaW5nLmZvcm1hdCgic29ja2V0ICVkIHJlYWRzIGZyb20gc2VydmVyICVzICIgKworICAgICAgICAgICAgICAgICJlcnJvcjogJXMiLAorICAgICAgICAgICAgICAgIGluZGV4LCBzZXJ2ZXJzLmdldChpbmRleCkudG9TdHJpbmcoKSwgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgTE9HR0VSLmVycm9yKGVycik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZGlzcG9zZSBhbnkgcmVzb3VyY2UgYWxsb2NhdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICB0cnkgeworICAgICAgICBpZiAoc2VsZWN0b3IuaXNPcGVuKCkpIHsKKyAgICAgICAgICBJdGVyYXRvcjxTZWxlY3Rpb25LZXk+IGl0ID0gc2VsZWN0b3Iua2V5cygpLml0ZXJhdG9yKCk7CisgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgU2VsZWN0aW9uS2V5IHNlbEtleSA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIFNvY2tldENoYW5uZWwgc0NoYW5uZWwgPSAoU29ja2V0Q2hhbm5lbClzZWxLZXkuY2hhbm5lbCgpOworICAgICAgICAgICAgc0NoYW5uZWwuY2xvc2UoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzZWxlY3Rvci5jbG9zZSgpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIExPR0dFUi5lcnJvcigiZnJlZSByZXNvdXJjZSBlcnJvcjogIitlLnRvU3RyaW5nKCkpOworICAgICAgfQorICAgIH0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UTm9uYmxvY2tpbmdNdWx0aUZldGNoU3RhdHMuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UTm9uYmxvY2tpbmdNdWx0aUZldGNoU3RhdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGI4NjIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1ROb25ibG9ja2luZ011bHRpRmV0Y2hTdGF0cy5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGtlZXBzIHRyYWNrIG9mIHN0YXRpc3RpY3MgZm9yIFROb25ibG9ja2luTXVsdGlGZXRjaENsaWVudC4KKyAqLworcHVibGljIGNsYXNzIFROb25ibG9ja2luZ011bHRpRmV0Y2hTdGF0cyB7CisgIHByaXZhdGUgaW50ICAgIG51bVRvdGFsU2VydmVyczsKKyAgcHJpdmF0ZSBpbnQgICAgbnVtUmVhZENvbXBsZXRlZFNlcnZlcnM7CisgIHByaXZhdGUgaW50ICAgIG51bUNvbm5lY3RFcnJvclNlcnZlcnM7CisgIHByaXZhdGUgaW50ICAgIHRvdGFsUmVjdkJ1ZkJ5dGVzOworICBwcml2YXRlIGludCAgICBtYXhSZXNwb25zZUJ5dGVzOworICBwcml2YXRlIGludCAgICBudW1PdmVyZmxvd2VkUmVjdkJ1ZjsKKyAgcHJpdmF0ZSBpbnQgICAgbnVtSW52YWxpZEZyYW1lU2l6ZTsKKyAgLy8gdGltZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgZmV0Y2goKSBmdW5jdGlvbiB0byB0aGUgcmVhZGluZyBmaW5pc2gKKyAgLy8gdGltZSBvZiB0aGUgbGFzdCBzb2NrZXQgKGluIG1pbGxpLXNlY29uZCkKKyAgcHJpdmF0ZSBsb25nICAgcmVhZFRpbWU7CisKKyAgcHVibGljIFROb25ibG9ja2luZ011bHRpRmV0Y2hTdGF0cygpIHsKKyAgICBjbGVhcigpOworICB9CisKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgbnVtVG90YWxTZXJ2ZXJzID0gMDsKKyAgICBudW1SZWFkQ29tcGxldGVkU2VydmVycyA9IDA7CisgICAgbnVtQ29ubmVjdEVycm9yU2VydmVycyA9IDA7CisgICAgdG90YWxSZWN2QnVmQnl0ZXMgPSAwOworICAgIG1heFJlc3BvbnNlQnl0ZXMgPSAwOworICAgIG51bU92ZXJmbG93ZWRSZWN2QnVmID0gMDsKKyAgICBudW1JbnZhbGlkRnJhbWVTaXplID0gMDsKKyAgICByZWFkVGltZSA9IDA7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIFN0cmluZyBzdGF0cyA9IFN0cmluZy5mb3JtYXQoIm51bVRvdGFsU2VydmVycz0lZCwgIiArCisgICAgICAibnVtUmVhZENvbXBsZXRlZFNlcnZlcnM9JWQsIG51bUNvbm5lY3RFcnJvclNlcnZlcnM9JWQsICIgKworICAgICAgIm51bVVucmVzcG9uc2l2ZVNlcnZlcnM9JWQsIHRvdGFsUmVjdkJ1ZkJ5dGVzPSVmTSwgIiArCisgICAgICAibWF4UmVzcG9uc2VCeXRlcz0lZCwgbnVtT3ZlcmZsb3dlZFJlY3ZCdWY9JWQsICIgKworICAgICAgIm51bUludmFsaWRGcmFtZVNpemU9JWQsIHJlYWRUaW1lPSVkbXMiLAorICAgICAgbnVtVG90YWxTZXJ2ZXJzLCBudW1SZWFkQ29tcGxldGVkU2VydmVycywgbnVtQ29ubmVjdEVycm9yU2VydmVycywKKyAgICAgIChudW1Ub3RhbFNlcnZlcnMtbnVtUmVhZENvbXBsZXRlZFNlcnZlcnMtbnVtQ29ubmVjdEVycm9yU2VydmVycyksCisgICAgICB0b3RhbFJlY3ZCdWZCeXRlcy8xMDI0LjAvMTAyNCwgbWF4UmVzcG9uc2VCeXRlcywgbnVtT3ZlcmZsb3dlZFJlY3ZCdWYsCisgICAgICBudW1JbnZhbGlkRnJhbWVTaXplLCByZWFkVGltZSk7CisgICAgcmV0dXJuIHN0YXRzOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0TnVtVG90YWxTZXJ2ZXJzKGludCB2YWwpICAgIHsgbnVtVG90YWxTZXJ2ZXJzID0gdmFsOyB9CisgIHB1YmxpYyB2b2lkIHNldE1heFJlc3BvbnNlQnl0ZXMoaW50IHZhbCkgICB7IG1heFJlc3BvbnNlQnl0ZXMgPSB2YWw7IH0KKyAgcHVibGljIHZvaWQgc2V0UmVhZFRpbWUobG9uZyB2YWwpICAgICAgICAgIHsgcmVhZFRpbWUgPSB2YWw7IH0KKyAgcHVibGljIHZvaWQgaW5jTnVtUmVhZENvbXBsZXRlZFNlcnZlcnMoKSAgIHsgbnVtUmVhZENvbXBsZXRlZFNlcnZlcnMrKzsgfQorICBwdWJsaWMgdm9pZCBpbmNOdW1Db25uZWN0RXJyb3JTZXJ2ZXJzKCkgICAgeyBudW1Db25uZWN0RXJyb3JTZXJ2ZXJzKys7IH0KKyAgcHVibGljIHZvaWQgaW5jTnVtT3ZlcmZsb3dlZFJlY3ZCdWYoKSAgICAgIHsgbnVtT3ZlcmZsb3dlZFJlY3ZCdWYrKzsgfQorICBwdWJsaWMgdm9pZCBpbmNUb3RhbFJlY3ZCdWZCeXRlcyhpbnQgdmFsKSAgeyB0b3RhbFJlY3ZCdWZCeXRlcyArPSB2YWw7IH0KKyAgcHVibGljIHZvaWQgaW5jTnVtSW52YWxpZEZyYW1lU2l6ZSgpICAgICAgIHsgbnVtSW52YWxpZEZyYW1lU2l6ZSsrOyB9CisKKyAgcHVibGljIGludCBnZXRNYXhSZXNwb25zZUJ5dGVzKCkgICAgICAgIHsgcmV0dXJuIG1heFJlc3BvbnNlQnl0ZXM7IH0KKyAgcHVibGljIGludCBnZXROdW1SZWFkQ29tcGxldGVkU2VydmVycygpIHsgcmV0dXJuIG51bVJlYWRDb21wbGV0ZWRTZXJ2ZXJzOyB9CisgIHB1YmxpYyBpbnQgZ2V0TnVtQ29ubmVjdEVycm9yU2VydmVycygpICB7IHJldHVybiBudW1Db25uZWN0RXJyb3JTZXJ2ZXJzOyB9CisgIHB1YmxpYyBpbnQgZ2V0TnVtVG90YWxTZXJ2ZXJzKCkgICAgICAgICB7IHJldHVybiBudW1Ub3RhbFNlcnZlcnM7IH0KKyAgcHVibGljIGludCBnZXROdW1PdmVyZmxvd2VkUmVjdkJ1ZigpICAgIHsgcmV0dXJuIG51bU92ZXJmbG93ZWRSZWN2QnVmO30KKyAgcHVibGljIGludCBnZXRUb3RhbFJlY3ZCdWZCeXRlcygpICAgICAgIHsgcmV0dXJuIHRvdGFsUmVjdkJ1ZkJ5dGVzO30KKyAgcHVibGljIGludCBnZXROdW1JbnZhbGlkRnJhbWVTaXplKCkgICAgIHsgcmV0dXJuIG51bUludmFsaWRGcmFtZVNpemU7IH0KKyAgcHVibGljIGxvbmcgZ2V0UmVhZFRpbWUoKSAgICAgICAgICAgICAgIHsgcmV0dXJuIHJlYWRUaW1lOyB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFByb2Nlc3NvckZhY3RvcnkuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UUHJvY2Vzc29yRmFjdG9yeS5qYXZhCmluZGV4IGJjZDhhMzguLjgxOTMzYTIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UUHJvY2Vzc29yRmFjdG9yeS5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UUHJvY2Vzc29yRmFjdG9yeS5qYXZhCkBAIC0zNiw0ICszNiw4IEBACiAgIHB1YmxpYyBUUHJvY2Vzc29yIGdldFByb2Nlc3NvcihUVHJhbnNwb3J0IHRyYW5zKSB7CiAgICAgcmV0dXJuIHByb2Nlc3Nvcl87CiAgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc0FzeW5jUHJvY2Vzc29yKCkgeworICAgICAgcmV0dXJuIHByb2Nlc3Nvcl8gaW5zdGFuY2VvZiBUQXN5bmNQcm9jZXNzb3I7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VyaWFsaXphYmxlLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcmlhbGl6YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMDAyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcmlhbGl6YWJsZS5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKKworLyoqCisgKiBHZW5lcmljIGJhc2UgaW50ZXJmYWNlIGZvciBnZW5lcmF0ZWQgVGhyaWZ0IG9iamVjdHMuCisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIFRTZXJpYWxpemFibGUgeworCisgIC8qKgorICAgKiBSZWFkcyB0aGUgVE9iamVjdCBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbC4KKyAgICoKKyAgICogQHBhcmFtIGlwcm90IElucHV0IHByb3RvY29sCisgICAqLworICBwdWJsaWMgdm9pZCByZWFkKFRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgLyoqCisgICAqIFdyaXRlcyB0aGUgb2JqZWN0cyBvdXQgdG8gdGhlIHByb3RvY29sCisgICAqCisgICAqIEBwYXJhbSBvcHJvdCBPdXRwdXQgcHJvdG9jb2wKKyAgICovCisgIHB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb247CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VydmljZUNsaWVudC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJ2aWNlQ2xpZW50LmphdmEKaW5kZXggYzcwZTY2Zi4uMDBhMzZlZSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJ2aWNlQ2xpZW50LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJ2aWNlQ2xpZW50LmphdmEKQEAgLTQ0LDcgKzQ0LDcgQEAKIAogICAvKioKICAgICogR2V0IHRoZSBUUHJvdG9jb2wgYmVpbmcgdXNlZCBhcyB0aGUgaW5wdXQgKHJlYWQpIHByb3RvY29sLgotICAgKiBAcmV0dXJuCisgICAqIEByZXR1cm4gdGhlIFRQcm90b2NvbCBiZWluZyB1c2VkIGFzIHRoZSBpbnB1dCAocmVhZCkgcHJvdG9jb2wuCiAgICAqLwogICBwdWJsaWMgVFByb3RvY29sIGdldElucHV0UHJvdG9jb2woKSB7CiAgICAgcmV0dXJuIHRoaXMuaXByb3RfOwpAQCAtNTIsMjggKzUyLDM4IEBACiAKICAgLyoqCiAgICAqIEdldCB0aGUgVFByb3RvY29sIGJlaW5nIHVzZWQgYXMgdGhlIG91dHB1dCAod3JpdGUpIHByb3RvY29sLgotICAgKiBAcmV0dXJuCisgICAqIEByZXR1cm4gdGhlIFRQcm90b2NvbCBiZWluZyB1c2VkIGFzIHRoZSBvdXRwdXQgKHdyaXRlKSBwcm90b2NvbC4KICAgICovCiAgIHB1YmxpYyBUUHJvdG9jb2wgZ2V0T3V0cHV0UHJvdG9jb2woKSB7CiAgICAgcmV0dXJuIHRoaXMub3Byb3RfOwogICB9CiAKLSAgcHJvdGVjdGVkIHZvaWQgc2VuZEJhc2UoU3RyaW5nIG1ldGhvZE5hbWUsIFRCYXNlIGFyZ3MpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBvcHJvdF8ud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1ldGhvZE5hbWUsIFRNZXNzYWdlVHlwZS5DQUxMLCArK3NlcWlkXykpOworICBwcm90ZWN0ZWQgdm9pZCBzZW5kQmFzZShTdHJpbmcgbWV0aG9kTmFtZSwgVEJhc2U8Pyw/PiBhcmdzKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgc2VuZEJhc2UobWV0aG9kTmFtZSwgYXJncywgVE1lc3NhZ2VUeXBlLkNBTEwpOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgc2VuZEJhc2VPbmV3YXkoU3RyaW5nIG1ldGhvZE5hbWUsIFRCYXNlPD8sPz4gYXJncykgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHNlbmRCYXNlKG1ldGhvZE5hbWUsIGFyZ3MsIFRNZXNzYWdlVHlwZS5PTkVXQVkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHNlbmRCYXNlKFN0cmluZyBtZXRob2ROYW1lLCBUQmFzZTw/LD8+IGFyZ3MsIGJ5dGUgdHlwZSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIG9wcm90Xy53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobWV0aG9kTmFtZSwgdHlwZSwgKytzZXFpZF8pKTsKICAgICBhcmdzLndyaXRlKG9wcm90Xyk7CiAgICAgb3Byb3RfLndyaXRlTWVzc2FnZUVuZCgpOwogICAgIG9wcm90Xy5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOwogICB9CiAKLSAgcHJvdGVjdGVkIHZvaWQgcmVjZWl2ZUJhc2UoVEJhc2UgcmVzdWx0LCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIFRFeGNlcHRpb24geworICBwcm90ZWN0ZWQgdm9pZCByZWNlaXZlQmFzZShUQmFzZTw/LD8+IHJlc3VsdCwgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBUTWVzc2FnZSBtc2cgPSBpcHJvdF8ucmVhZE1lc3NhZ2VCZWdpbigpOwogICAgIGlmIChtc2cudHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OKSB7Ci0gICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5yZWFkKGlwcm90Xyk7CisgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oKTsKKyAgICAgIHgucmVhZChpcHJvdF8pOwogICAgICAgaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7CiAgICAgICB0aHJvdyB4OwogICAgIH0KICAgICBpZiAobXNnLnNlcWlkICE9IHNlcWlkXykgewotICAgICAgdGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uQkFEX1NFUVVFTkNFX0lELCBtZXRob2ROYW1lICsgIiBmYWlsZWQ6IG91dCBvZiBzZXF1ZW5jZSByZXNwb25zZSIpOworICAgICAgdGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uQkFEX1NFUVVFTkNFX0lELAorICAgICAgICAgIFN0cmluZy5mb3JtYXQoIiVzIGZhaWxlZDogb3V0IG9mIHNlcXVlbmNlIHJlc3BvbnNlOiBleHBlY3RlZCAlZCBidXQgZ290ICVkIiwgbWV0aG9kTmFtZSwgc2VxaWRfLCBtc2cuc2VxaWQpKTsKICAgICB9CiAgICAgcmVzdWx0LnJlYWQoaXByb3RfKTsKICAgICBpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VydmljZUNsaWVudEZhY3RvcnkuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VydmljZUNsaWVudEZhY3RvcnkuamF2YQppbmRleCA4MDhkNWU2Li45ODhlNjU1IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcnZpY2VDbGllbnRGYWN0b3J5LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJ2aWNlQ2xpZW50RmFjdG9yeS5qYXZhCkBAIC0zMCw3ICszMCw3IEBACiAgIC8qKgogICAgKiBHZXQgYSBicmFuZC1uZXcgVCB1c2luZyA8aT5wcm90PC9pPiBhcyBib3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29sLgogICAgKiBAcGFyYW0gcHJvdAotICAgKiBAcmV0dXJuCisgICAqIEByZXR1cm4gQSBicmFuZC1uZXcgVCB1c2luZyA8aT5wcm90PC9pPiBhcyBib3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29sLgogICAgKi8KICAgcHVibGljIFQgZ2V0Q2xpZW50KFRQcm90b2NvbCBwcm90KTsKIApAQCAtMzksNyArMzksNyBAQAogICAgKiBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29scyBtYXkgYmUgdGhlIHNhbWUgaW5zdGFuY2UuCiAgICAqIEBwYXJhbSBpcHJvdAogICAgKiBAcGFyYW0gb3Byb3QKLSAgICogQHJldHVybgorICAgKiBAcmV0dXJuIGEgYnJhbmQgbmV3IFQgdXNpbmcgdGhlIHNwZWNpZmllZCBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29scwogICAgKi8KICAgcHVibGljIFQgZ2V0Q2xpZW50KFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UVW5pb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UVW5pb24uamF2YQppbmRleCAxOTYyYzgwLi4xZWYxMWRmIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFVuaW9uLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RVbmlvbi5qYXZhCkBAIC0xNywyMCArMTcsMjQgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKIAoraW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLklTY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlNjaGVtZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlN0YW5kYXJkU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5UdXBsZVNjaGVtZTsKIAotcHVibGljIGFic3RyYWN0IGNsYXNzIFRVbmlvbjxUIGV4dGVuZHMgVFVuaW9uPD8sPz4sIEYgZXh0ZW5kcyBURmllbGRJZEVudW0+IGltcGxlbWVudHMgVEJhc2U8VCwgRj4geworcHVibGljIGFic3RyYWN0IGNsYXNzIFRVbmlvbjxUIGV4dGVuZHMgVFVuaW9uPFQsRj4sIEYgZXh0ZW5kcyBURmllbGRJZEVudW0+IGltcGxlbWVudHMgVEJhc2U8VCwgRj4gewogCiAgIHByb3RlY3RlZCBPYmplY3QgdmFsdWVfOwogICBwcm90ZWN0ZWQgRiBzZXRGaWVsZF87CkBAIC0zOSw2ICs0MywxMiBAQAogICAgIHNldEZpZWxkXyA9IG51bGw7CiAgICAgdmFsdWVfID0gbnVsbDsKICAgfQorICAKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4gc2NoZW1lcyA9IG5ldyBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4oKTsKKyAgc3RhdGljIHsKKyAgICBzY2hlbWVzLnB1dChTdGFuZGFyZFNjaGVtZS5jbGFzcywgbmV3IFRVbmlvblN0YW5kYXJkU2NoZW1lRmFjdG9yeSgpKTsKKyAgICBzY2hlbWVzLnB1dChUdXBsZVNjaGVtZS5jbGFzcywgbmV3IFRVbmlvblR1cGxlU2NoZW1lRmFjdG9yeSgpKTsKKyAgfQogCiAgIHByb3RlY3RlZCBUVW5pb24oRiBzZXRGaWVsZCwgT2JqZWN0IHZhbHVlKSB7CiAgICAgc2V0RmllbGRWYWx1ZShzZXRGaWVsZCwgdmFsdWUpOwpAQCAtNjksNyArNzksNyBAQAogICB9CiAKICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGRlZXBDb3B5TWFwKE1hcDxPYmplY3QsIE9iamVjdD4gbWFwKSB7Ci0gICAgTWFwIGNvcHkgPSBuZXcgSGFzaE1hcCgpOworICAgIE1hcCBjb3B5ID0gbmV3IEhhc2hNYXAobWFwLnNpemUoKSk7CiAgICAgZm9yIChNYXAuRW50cnk8T2JqZWN0LCBPYmplY3Q+IGVudHJ5IDogbWFwLmVudHJ5U2V0KCkpIHsKICAgICAgIGNvcHkucHV0KGRlZXBDb3B5T2JqZWN0KGVudHJ5LmdldEtleSgpKSwgZGVlcENvcHlPYmplY3QoZW50cnkuZ2V0VmFsdWUoKSkpOwogICAgIH0KQEAgLTc3LDcgKzg3LDcgQEAKICAgfQogCiAgIHByaXZhdGUgc3RhdGljIFNldCBkZWVwQ29weVNldChTZXQgc2V0KSB7Ci0gICAgU2V0IGNvcHkgPSBuZXcgSGFzaFNldCgpOworICAgIFNldCBjb3B5ID0gbmV3IEhhc2hTZXQoc2V0LnNpemUoKSk7CiAgICAgZm9yIChPYmplY3QgbyA6IHNldCkgewogICAgICAgY29weS5hZGQoZGVlcENvcHlPYmplY3QobykpOwogICAgIH0KQEAgLTEyNSwyNCArMTM1LDcgQEAKICAgfQogCiAgIHB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgc2V0RmllbGRfID0gbnVsbDsKLSAgICB2YWx1ZV8gPSBudWxsOwotCi0gICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7Ci0KLSAgICBURmllbGQgZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOwotCi0gICAgdmFsdWVfID0gcmVhZFZhbHVlKGlwcm90LCBmaWVsZCk7Ci0gICAgaWYgKHZhbHVlXyAhPSBudWxsKSB7Ci0gICAgICBzZXRGaWVsZF8gPSBlbnVtRm9ySWQoZmllbGQuaWQpOwotICAgIH0KLQotICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOwotICAgIC8vIHRoaXMgaXMgc28gdGhhdCB3ZSB3aWxsIGVhdCB0aGUgc3RvcCBieXRlLiB3ZSBjb3VsZCBwdXQgYSBjaGVjayBoZXJlIHRvCi0gICAgLy8gbWFrZSBzdXJlIHRoYXQgaXQgYWN0dWFsbHkgKmlzKiB0aGUgc3RvcCBieXRlLCBidXQgaXQncyBmYXN0ZXIgdG8gZG8gaXQKLSAgICAvLyB0aGlzIHdheS4KLSAgICBpcHJvdC5yZWFkRmllbGRCZWdpbigpOwotICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICBzY2hlbWVzLmdldChpcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkucmVhZChpcHJvdCwgdGhpcyk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKEYgZmllbGRJZCwgT2JqZWN0IHZhbHVlKSB7CkBAIC0xNTYsMTUgKzE0OSw3IEBACiAgIH0KIAogICBwdWJsaWMgdm9pZCB3cml0ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBudWxsIHx8IGdldEZpZWxkVmFsdWUoKSA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJDYW5ub3Qgd3JpdGUgYSBUVW5pb24gd2l0aCBubyBzZXQgdmFsdWUhIik7Ci0gICAgfQotICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oZ2V0U3RydWN0RGVzYygpKTsKLSAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oZ2V0RmllbGREZXNjKHNldEZpZWxkXykpOwotICAgIHdyaXRlVmFsdWUob3Byb3QpOwotICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKLSAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOwotICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgICAgc2NoZW1lcy5nZXQob3Byb3QuZ2V0U2NoZW1lKCkpLmdldFNjaGVtZSgpLndyaXRlKG9wcm90LCB0aGlzKTsKICAgfQogCiAgIC8qKgpAQCAtMTc5LDExICsxNjQsMTMgQEAKICAgICogSW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIGdlbmVyYXRlZCB0byByZWFkIHRoZSByaWdodCBzdHVmZiBmcm9tIHRoZSB3aXJlIAogICAgKiBiYXNlZCBvbiB0aGUgZmllbGQgaGVhZGVyLiAKICAgICogQHBhcmFtIGZpZWxkCi0gICAqIEByZXR1cm4KKyAgICogQHJldHVybiByZWFkIE9iamVjdCBiYXNlZCBvbiB0aGUgZmllbGQgaGVhZGVyLCBhcyBzcGVjaWZpZWQgYnkgdGhlIGFyZ3VtZW50LgogICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCByZWFkVmFsdWUoVFByb3RvY29sIGlwcm90LCBURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uOwotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHdyaXRlVmFsdWUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsKKyAgcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBzdGFuZGFyZFNjaGVtZVJlYWRWYWx1ZShUUHJvdG9jb2wgaXByb3QsIFRGaWVsZCBmaWVsZCkgdGhyb3dzIFRFeGNlcHRpb247CisgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHN0YW5kYXJkU2NoZW1lV3JpdGVWYWx1ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uOworICAKKyAgcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCB0dXBsZVNjaGVtZVJlYWRWYWx1ZShUUHJvdG9jb2wgaXByb3QsIHNob3J0IGZpZWxkSUQpIHRocm93cyBURXhjZXB0aW9uOworICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB0dXBsZVNjaGVtZVdyaXRlVmFsdWUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsKIAogICBwcm90ZWN0ZWQgYWJzdHJhY3QgVFN0cnVjdCBnZXRTdHJ1Y3REZXNjKCk7CiAKQEAgLTIxNiw0ICsyMDMsNzcgQEAKICAgICB0aGlzLnNldEZpZWxkXyA9IG51bGw7CiAgICAgdGhpcy52YWx1ZV8gPSBudWxsOwogICB9CisgIAorICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUVW5pb25TdGFuZGFyZFNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICBwdWJsaWMgVFVuaW9uU3RhbmRhcmRTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgcmV0dXJuIG5ldyBUVW5pb25TdGFuZGFyZFNjaGVtZSgpOworICAgIH0KKyAgfQorICAKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVFVuaW9uU3RhbmRhcmRTY2hlbWUgZXh0ZW5kcyBTdGFuZGFyZFNjaGVtZTxUVW5pb24+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90LCBUVW5pb24gc3RydWN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBzdHJ1Y3Quc2V0RmllbGRfID0gbnVsbDsKKyAgICAgIHN0cnVjdC52YWx1ZV8gPSBudWxsOworCisgICAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKworICAgICAgVEZpZWxkIGZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsKKworICAgICAgc3RydWN0LnZhbHVlXyA9IHN0cnVjdC5zdGFuZGFyZFNjaGVtZVJlYWRWYWx1ZShpcHJvdCwgZmllbGQpOworICAgICAgaWYgKHN0cnVjdC52YWx1ZV8gIT0gbnVsbCkgeworICAgICAgICBzdHJ1Y3Quc2V0RmllbGRfID0gc3RydWN0LmVudW1Gb3JJZChmaWVsZC5pZCk7CisgICAgICB9CisKKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOworICAgICAgLy8gdGhpcyBpcyBzbyB0aGF0IHdlIHdpbGwgZWF0IHRoZSBzdG9wIGJ5dGUuIHdlIGNvdWxkIHB1dCBhIGNoZWNrIGhlcmUgdG8KKyAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGl0IGFjdHVhbGx5ICppcyogdGhlIHN0b3AgYnl0ZSwgYnV0IGl0J3MgZmFzdGVyIHRvIGRvIGl0CisgICAgICAvLyB0aGlzIHdheS4KKyAgICAgIGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90LCBUVW5pb24gc3RydWN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBpZiAoc3RydWN0LmdldFNldEZpZWxkKCkgPT0gbnVsbCB8fCBzdHJ1Y3QuZ2V0RmllbGRWYWx1ZSgpID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiQ2Fubm90IHdyaXRlIGEgVFVuaW9uIHdpdGggbm8gc2V0IHZhbHVlISIpOworICAgICAgfQorICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Y3QuZ2V0U3RydWN0RGVzYygpKTsKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihzdHJ1Y3QuZ2V0RmllbGREZXNjKHN0cnVjdC5zZXRGaWVsZF8pKTsKKyAgICAgIHN0cnVjdC5zdGFuZGFyZFNjaGVtZVdyaXRlVmFsdWUob3Byb3QpOworICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgICAgfQorICB9CisgIAorICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUVW5pb25UdXBsZVNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICBwdWJsaWMgVFVuaW9uVHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgcmV0dXJuIG5ldyBUVW5pb25UdXBsZVNjaGVtZSgpOworICAgIH0KKyAgfQorICAKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVFVuaW9uVHVwbGVTY2hlbWUgZXh0ZW5kcyBUdXBsZVNjaGVtZTxUVW5pb24+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90LCBUVW5pb24gc3RydWN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBzdHJ1Y3Quc2V0RmllbGRfID0gbnVsbDsKKyAgICAgIHN0cnVjdC52YWx1ZV8gPSBudWxsOworICAgICAgc2hvcnQgZmllbGRJRCA9IGlwcm90LnJlYWRJMTYoKTsKKyAgICAgIHN0cnVjdC52YWx1ZV8gPSBzdHJ1Y3QudHVwbGVTY2hlbWVSZWFkVmFsdWUoaXByb3QsIGZpZWxkSUQpOworICAgICAgaWYgKHN0cnVjdC52YWx1ZV8gIT0gbnVsbCkgeworICAgICAgICBzdHJ1Y3Quc2V0RmllbGRfID0gc3RydWN0LmVudW1Gb3JJZChmaWVsZElEKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShUUHJvdG9jb2wgb3Byb3QsIFRVbmlvbiBzdHJ1Y3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIGlmIChzdHJ1Y3QuZ2V0U2V0RmllbGQoKSA9PSBudWxsIHx8IHN0cnVjdC5nZXRGaWVsZFZhbHVlKCkgPT0gbnVsbCkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJDYW5ub3Qgd3JpdGUgYSBUVW5pb24gd2l0aCBubyBzZXQgdmFsdWUhIik7CisgICAgICB9CisgICAgICBvcHJvdC53cml0ZUkxNihzdHJ1Y3Quc2V0RmllbGRfLmdldFRocmlmdEZpZWxkSWQoKSk7CisgICAgICBzdHJ1Y3QudHVwbGVTY2hlbWVXcml0ZVZhbHVlKG9wcm90KTsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hbm5vdGF0aW9uL051bGxhYmxlLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYW5ub3RhdGlvbi9OdWxsYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNGIwMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYW5ub3RhdGlvbi9OdWxsYWJsZS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5hbm5vdGF0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworCisvKioKKyAqIEFubm90YXRpb24gaW5kaWNhdGluZyBhIGZpZWxkLCBtZXRob2QgcmV0dXJuLCBvciBtZXRob2QgcGFyYW1ldGVyIG1heSBiZSB7QGNvZGUgbnVsbH0uCisgKiBXZSBwYWNrYWdlIG91ciBvd24gYW5ub3RhdGlvbiB0byBhdm9pZCBhIG1hbmRhdG9yeSB0aGlyZC1wYXJ0eSBkZXBlbmRlbmN5LgorICovCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5DTEFTUykKK3B1YmxpYyBAaW50ZXJmYWNlIE51bGxhYmxlIHsKKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL0FzeW5jTWV0aG9kQ2FsbGJhY2suamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9Bc3luY01ldGhvZENhbGxiYWNrLmphdmEKaW5kZXggMDAwMDRiNy4uNGViZGUwNyAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL0FzeW5jTWV0aG9kQ2FsbGJhY2suamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvQXN5bmNNZXRob2RDYWxsYmFjay5qYXZhCkBAIC0xOCwyMiArMTgsMzQgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5hc3luYzsKIAotCisvKioKKyAqIEEgaGFuZGxlciBpbnRlcmZhY2UgYXN5bmNocm9ub3VzIGNsaWVudHMgY2FuIGltcGxlbWVudCB0byByZWNlaXZlIGZ1dHVyZQorICogbm90aWNlIG9mIHRoZSByZXN1bHRzIG9mIGFuIGFzeW5jaHJvbm91cyBtZXRob2QgY2FsbC4KKyAqCisgKiBAcGFyYW0gPFQ+IFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgYXN5bmNocm9ub3VzbHkgaW52b2tlZCBtZXRob2QuCisgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQXN5bmNNZXRob2RDYWxsYmFjazxUPiB7CiAgIC8qKgogICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSByZW1vdGUgc2lkZSBoYXMgY29tcGxldGVkIGludm9raW5nCi0gICAqIHlvdXIgbWV0aG9kIGNhbGwgYW5kIHRoZSByZXN1bHQgaXMgZnVsbHkgcmVhZC4gRm9yIG9uZXdheSBtZXRob2QgY2FsbHMsCi0gICAqIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGFzIHNvb24gYXMgd2UgaGF2ZSBjb21wbGV0ZWQgd3JpdGluZyBvdXQgdGhlCi0gICAqIHJlcXVlc3QuCi0gICAqIEBwYXJhbSByZXNwb25zZQorICAgKiB5b3VyIG1ldGhvZCBjYWxsIGFuZCB0aGUgcmVzdWx0IGlzIGZ1bGx5IHJlYWQuIEZvciB7QGNvZGUgb25ld2F5fSBtZXRob2QKKyAgICogY2FsbHMsIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGFzIHNvb24gYXMgd2UgaGF2ZSBjb21wbGV0ZWQgd3JpdGluZyBvdXQKKyAgICogdGhlIHJlcXVlc3QuCisgICAqCisgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBhc3luY2hyb25vdXNseSBpbnZva2VkIG1ldGhvZDsKKyAgICogICAgICAgICAgICAgICAgIHtAY29kZSBudWxsfSBmb3Igdm9pZCBtZXRob2RzIHdoaWNoIGluY2x1ZGVzCisgICAqICAgICAgICAgICAgICAgICB7QGNvZGUgb25ld2F5fSBtZXRob2RzLgogICAgKi8KLSAgcHVibGljIHZvaWQgb25Db21wbGV0ZShUIHJlc3BvbnNlKTsKKyAgdm9pZCBvbkNvbXBsZXRlKFQgcmVzcG9uc2UpOwogCiAgIC8qKgotICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGFuIHVuZXhwZWN0ZWQgY2xpZW50c2lkZQotICAgKiBleGNlcHRpb24uIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBhcHBsaWNhdGlvbi1kZWZpbmVkIGV4Y2VwdGlvbnMgdGhhdAotICAgKiBhcHBlYXIgaW4gdGhlIElETCwgYnV0IHJhdGhlciB0aGluZ3MgbGlrZSBJT0V4Y2VwdGlvbnMuCi0gICAqIEBwYXJhbSBleGNlcHRpb24KKyAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGVyZSBpcyBlaXRoZXIgYW4gdW5leHBlY3RlZCBjbGllbnQtc2lkZQorICAgKiBleGNlcHRpb24gbGlrZSBhbiBJT0V4Y2VwdGlvbiBvciBlbHNlIHdoZW4gdGhlIHJlbW90ZSBtZXRob2QgcmFpc2VzIGFuCisgICAqIGV4Y2VwdGlvbiwgZWl0aGVyIGRlY2xhcmVkIGluIHRoZSBJREwgb3IgZHVlIHRvIGFuIHVuZXhwZWN0ZWQgc2VydmVyLXNpZGUKKyAgICogZXJyb3IuCisgICAqCisgICAqIEBwYXJhbSBleGNlcHRpb24gVGhlIGV4Y2VwdGlvbiBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIHRoZSB0aGUgYXN5bmNocm9ub3VzCisgICAqICAgICAgICAgICAgICAgICAgbWV0aG9kIGNhbGwsIG1heSBiZSBhIGxvY2FsIGV4Y2VwdGlvbiBvciBhbiB1bm1hcnNoYWxsZWQKKyAgICogICAgICAgICAgICAgICAgICByZW1vdGUgZXhjZXB0aW9uLgogICAgKi8KLSAgcHVibGljIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZXhjZXB0aW9uKTsKKyAgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBleGNlcHRpb24pOwogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY0NsaWVudC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY0NsaWVudC5qYXZhCmluZGV4IGQzYjAwOWEuLjAwNTAxOGEgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNDbGllbnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jQ2xpZW50LmphdmEKQEAgLTU4LDcgKzU4LDcgQEAKIAogICAvKioKICAgICogSXMgdGhlIGNsaWVudCBpbiBhbiBlcnJvciBzdGF0ZT8KLSAgICogQHJldHVybgorICAgKiBAcmV0dXJuIElmIGNsaWVudCBpbiBhbiBlcnJvciBzdGF0ZT8KICAgICovCiAgIHB1YmxpYyBib29sZWFuIGhhc0Vycm9yKCkgewogICAgIHJldHVybiBfX19lcnJvciAhPSBudWxsOwpAQCAtNjYsNyArNjYsNyBAQAogCiAgIC8qKgogICAgKiBHZXQgdGhlIGNsaWVudCdzIGVycm9yIC0gcmV0dXJucyBudWxsIGlmIG5vIGVycm9yCi0gICAqIEByZXR1cm4KKyAgICogQHJldHVybiBHZXQgdGhlIGNsaWVudCdzIGVycm9yLiA8cD4gcmV0dXJucyBudWxsIGlmIG5vIGVycm9yCiAgICAqLwogICBwdWJsaWMgRXhjZXB0aW9uIGdldEVycm9yKCkgewogICAgIHJldHVybiBfX19lcnJvcjsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNDbGllbnRNYW5hZ2VyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jQ2xpZW50TWFuYWdlci5qYXZhCmluZGV4IDk4ZjcxOTQuLmMwN2NjZDUgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNDbGllbnRNYW5hZ2VyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY0NsaWVudE1hbmFnZXIuamF2YQpAQCAtMTksNiArMTksNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5hc3luYzsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQ2xvc2VkU2VsZWN0b3JFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOwpAQCAtMTE2LDYgKzExNywxMiBAQAogICAgICAgICAgIExPR0dFUi5lcnJvcigiSWdub3JpbmcgdW5jYXVnaHQgZXhjZXB0aW9uIGluIFNlbGVjdFRocmVhZCIsIGV4Y2VwdGlvbik7CiAgICAgICAgIH0KICAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgc2VsZWN0b3IuY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIExPR0dFUi53YXJuKCJDb3VsZCBub3QgY2xvc2Ugc2VsZWN0b3IuIFRoaXMgbWF5IHJlc3VsdCBpbiBsZWFrZWQgcmVzb3VyY2VzISIsIGV4KTsKKyAgICAgIH0KICAgICB9CiAKICAgICAvLyBUcmFuc2l0aW9uIG1ldGhvZHMgZm9yIHJlYWR5IGtleXMKQEAgLTE4Miw3ICsxODksNyBAQAogICB9CiAKICAgLyoqIENvbXBhcmF0b3IgdXNlZCBpbiBUcmVlU2V0ICovCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIFRBc3luY01ldGhvZENhbGxUaW1lb3V0Q29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8VEFzeW5jTWV0aG9kQ2FsbD4geworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUQXN5bmNNZXRob2RDYWxsVGltZW91dENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yPFRBc3luY01ldGhvZENhbGw+LCBTZXJpYWxpemFibGUgewogICAgIHB1YmxpYyBpbnQgY29tcGFyZShUQXN5bmNNZXRob2RDYWxsIGxlZnQsIFRBc3luY01ldGhvZENhbGwgcmlnaHQpIHsKICAgICAgIGlmIChsZWZ0LmdldFRpbWVvdXRUaW1lc3RhbXAoKSA9PSByaWdodC5nZXRUaW1lb3V0VGltZXN0YW1wKCkpIHsKICAgICAgICAgcmV0dXJuIChpbnQpKGxlZnQuZ2V0U2VxdWVuY2VJZCgpIC0gcmlnaHQuZ2V0U2VxdWVuY2VJZCgpKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNNZXRob2RDYWxsLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jTWV0aG9kQ2FsbC5qYXZhCmluZGV4IGZjZDUwZWEuLjNiZjE3NDcgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNNZXRob2RDYWxsLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY01ldGhvZENhbGwuamF2YQpAQCAtMzMsMTEgKzMzLDE1IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247CiAKIC8qKgotICogRW5jYXBzdWxhdGVzIGFuIGFzeW5jIG1ldGhvZCBjYWxsCisgKiBFbmNhcHN1bGF0ZXMgYW4gYXN5bmMgbWV0aG9kIGNhbGwuCisgKiA8cD4KICAqIE5lZWQgdG8gZ2VuZXJhdGU6Ci0gKiAgIC0gcHJpdmF0ZSB2b2lkIHdyaXRlX2FyZ3MoVFByb3RvY29sIHByb3RvY29sKQotICogICAtIHB1YmxpYyBUIGdldFJlc3VsdCgpIHRocm93cyA8RXhjZXB0aW9uXzE+LCA8RXhjZXB0aW9uXzI+LCAuLi4KLSAqIEBwYXJhbSA8VD4KKyAqIDx1bD4KKyAqICAgPGxpPnByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHdyaXRlX2FyZ3MoVFByb3RvY29sIHByb3RvY29sKTwvbGk+CisgKiAgIDxsaT5wcm90ZWN0ZWQgYWJzdHJhY3QgVCBnZXRSZXN1bHQoKSB0aHJvd3MgJmx0O0V4Y2VwdGlvbl8xJmd0OywgJmx0O0V4Y2VwdGlvbl8yJmd0OywgLi4uPC9saT4KKyAqIDwvdWw+CisgKgorICogQHBhcmFtIDxUPiBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGVuY2Fwc3VsYXRlZCBtZXRob2QgY2FsbC4KICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFRBc3luY01ldGhvZENhbGw8VD4gewogCkBAIC02NSw3ICs2OSw4IEBACiAgIHByaXZhdGUgZmluYWwgQXN5bmNNZXRob2RDYWxsYmFjazxUPiBjYWxsYmFjazsKICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzT25ld2F5OwogICBwcml2YXRlIGxvbmcgc2VxdWVuY2VJZDsKLSAgCisgIHByaXZhdGUgZmluYWwgbG9uZyB0aW1lb3V0OworCiAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBzaXplQnVmZmVyOwogICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBzaXplQnVmZmVyQXJyYXkgPSBuZXcgYnl0ZVs0XTsKICAgcHJpdmF0ZSBCeXRlQnVmZmVyIGZyYW1lQnVmZmVyOwpAQCAtNzksNiArODQsNyBAQAogICAgIHRoaXMuY2xpZW50ID0gY2xpZW50OwogICAgIHRoaXMuaXNPbmV3YXkgPSBpc09uZXdheTsKICAgICB0aGlzLnNlcXVlbmNlSWQgPSBUQXN5bmNNZXRob2RDYWxsLnNlcXVlbmNlSWRDb3VudGVyLmdldEFuZEluY3JlbWVudCgpOworICAgIHRoaXMudGltZW91dCA9IGNsaWVudC5nZXRUaW1lb3V0KCk7CiAgIH0KIAogICBwcm90ZWN0ZWQgU3RhdGUgZ2V0U3RhdGUoKSB7CkBAIC0xMDIsMTUgKzEwOCwxNyBAQAogICB9CiAgIAogICBwdWJsaWMgYm9vbGVhbiBoYXNUaW1lb3V0KCkgewotICAgIHJldHVybiBjbGllbnQuaGFzVGltZW91dCgpOworICAgIHJldHVybiB0aW1lb3V0ID4gMDsKICAgfQogICAKICAgcHVibGljIGxvbmcgZ2V0VGltZW91dFRpbWVzdGFtcCgpIHsKLSAgICByZXR1cm4gY2xpZW50LmdldFRpbWVvdXQoKSArIHN0YXJ0VGltZTsKKyAgICByZXR1cm4gdGltZW91dCArIHN0YXJ0VGltZTsKICAgfQogCiAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHdyaXRlX2FyZ3MoVFByb3RvY29sIHByb3RvY29sKSB0aHJvd3MgVEV4Y2VwdGlvbjsKIAorICBwcm90ZWN0ZWQgYWJzdHJhY3QgVCBnZXRSZXN1bHQoKSB0aHJvd3MgRXhjZXB0aW9uOworCiAgIC8qKgogICAgKiBJbml0aWFsaXplIGJ1ZmZlcnMuCiAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBpZiBidWZmZXIgaW5pdGlhbGl6YXRpb24gZmFpbHMKQEAgLTE2NSw3ICsxNzMsNyBAQAogICAgKiBzZWxlY3QgaW50ZXJlc3RzIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgY29uY3VycmVuY3kuCiAgICAqIEBwYXJhbSBrZXkKICAgICovCi0gIHByb3RlY3RlZCB2b2lkIHRyYW5zaXRpb24oU2VsZWN0aW9uS2V5IGtleSkgeworICB2b2lkIHRyYW5zaXRpb24oU2VsZWN0aW9uS2V5IGtleSkgewogICAgIC8vIEVuc3VyZSBrZXkgaXMgdmFsaWQKICAgICBpZiAoIWtleS5pc1ZhbGlkKCkpIHsKICAgICAgIGtleS5jYW5jZWwoKTsKQEAgLTIyMyw4ICsyMzEsMTQgQEAKICAgICBrZXkuaW50ZXJlc3RPcHMoMCk7CiAgICAgLy8gdGhpcyBlbnN1cmVzIHRoYXQgdGhlIFRBc3luY01ldGhvZCBpbnN0YW5jZSBkb2Vzbid0IGhhbmcgYXJvdW5kCiAgICAga2V5LmF0dGFjaChudWxsKTsKLSAgICBjbGllbnQub25Db21wbGV0ZSgpOwotICAgIGNhbGxiYWNrLm9uQ29tcGxldGUoKFQpdGhpcyk7CisgICAgdHJ5IHsKKyAgICAgIFQgcmVzdWx0ID0gdGhpcy5nZXRSZXN1bHQoKTsKKyAgICAgIGNsaWVudC5vbkNvbXBsZXRlKCk7CisgICAgICBjYWxsYmFjay5vbkNvbXBsZXRlKHJlc3VsdCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGtleS5jYW5jZWwoKTsKKyAgICAgIG9uRXJyb3IoZSk7CisgICAgfQogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGRvUmVhZGluZ1Jlc3BvbnNlU2l6ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRNZXRhRGF0YS5qYXZhCmluZGV4IGI2MzQyOTEuLjQ0NWY3ZTQgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRNZXRhRGF0YS5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRNZXRhRGF0YS5qYXZhCkBAIC00NSw3ICs0NSw3IEBACiAgICAgdGhpcy52YWx1ZU1ldGFEYXRhID0gdk1ldGFEYXRhOwogICB9CiAgIAotICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkU3RydWN0TWV0YURhdGFNYXAoQ2xhc3M8PyBleHRlbmRzIFRCYXNlPiBzQ2xhc3MsIE1hcDw/IGV4dGVuZHMgVEZpZWxkSWRFbnVtLCBGaWVsZE1ldGFEYXRhPiBtYXApeworICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFN0cnVjdE1ldGFEYXRhTWFwKENsYXNzPD8gZXh0ZW5kcyBUQmFzZT4gc0NsYXNzLCBNYXA8PyBleHRlbmRzIFRGaWVsZElkRW51bSwgRmllbGRNZXRhRGF0YT4gbWFwKXsKICAgICBzdHJ1Y3RNYXAucHV0KHNDbGFzcywgbWFwKTsKICAgfQogCkBAIC01NSw3ICs1NSw3IEBACiAgICAqCiAgICAqIEBwYXJhbSBzQ2xhc3MgVGhlIFRCYXNlIGNsYXNzIGZvciB3aGljaCB0aGUgbWV0YWRhdGEgbWFwIGlzIHJlcXVlc3RlZAogICAgKi8KLSAgcHVibGljIHN0YXRpYyBNYXA8PyBleHRlbmRzIFRGaWVsZElkRW51bSwgRmllbGRNZXRhRGF0YT4gZ2V0U3RydWN0TWV0YURhdGFNYXAoQ2xhc3M8PyBleHRlbmRzIFRCYXNlPiBzQ2xhc3MpeworICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBNYXA8PyBleHRlbmRzIFRGaWVsZElkRW51bSwgRmllbGRNZXRhRGF0YT4gZ2V0U3RydWN0TWV0YURhdGFNYXAoQ2xhc3M8PyBleHRlbmRzIFRCYXNlPiBzQ2xhc3MpewogICAgIGlmICghc3RydWN0TWFwLmNvbnRhaW5zS2V5KHNDbGFzcykpeyAvLyBMb2FkIGNsYXNzIGlmIGl0IGhhc24ndCBiZWVuIGxvYWRlZAogICAgICAgdHJ5ewogICAgICAgICBzQ2xhc3MubmV3SW5zdGFuY2UoKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9TaG9ydFN0YWNrLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvU2hvcnRTdGFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNjU5MzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvU2hvcnRTdGFjay5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCisvKioKKyAqIFNob3J0U3RhY2sgaXMgYSBzaG9ydC1zcGVjaWZpYyBTdGFjayBpbXBsZW1lbnRhdGlvbiB3cml0dGVuIGZvciB0aGUgZXhwcmVzcworICogcHVycG9zZSBvZiB2ZXJ5IGZhc3Qgb3BlcmF0aW9ucyBvbiBUQ29tcGFjdFByb3RvY29sJ3MgZmllbGQgaWQgc3RhY2suIFRoaXMKKyAqIGltcGxlbWVudGF0aW9uIHBlcmZvcm1zIGF0IGxlYXN0IDEweCBmYXN0ZXIgdGhhbiBqYXZhLnV0aWwuU3RhY2suCisgKi8KK2NsYXNzIFNob3J0U3RhY2sgeworCisgIHByaXZhdGUgc2hvcnRbXSB2ZWN0b3I7CisKKyAgLyoqIEFsd2F5cyBwb2ludHMgdG8gdGhlIG5leHQgbG9jYXRpb24gKi8KKyAgcHJpdmF0ZSBpbnQgdG9wID0gMDsKKworICBwdWJsaWMgU2hvcnRTdGFjayhpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisgICAgdmVjdG9yID0gbmV3IHNob3J0W2luaXRpYWxDYXBhY2l0eV07CisgIH0KKworICBwdWJsaWMgc2hvcnQgcG9wKCkgeworICAgIHJldHVybiB2ZWN0b3JbLS10b3BdOworICB9CisKKyAgcHVibGljIHZvaWQgcHVzaChzaG9ydCBwdXNoZWQpIHsKKyAgICBpZiAodmVjdG9yLmxlbmd0aCA9PSB0b3ApIHsKKyAgICAgIGdyb3coKTsKKyAgICB9CisgICAgdmVjdG9yW3RvcCsrXSA9IHB1c2hlZDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBncm93KCkgeworICAgIHZlY3RvciA9IEFycmF5cy5jb3B5T2YodmVjdG9yLCB2ZWN0b3IubGVuZ3RoIDw8IDEpOworICB9CisKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgdG9wID0gMDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIHNiLmFwcGVuZCgiPFNob3J0U3RhY2sgdmVjdG9yOlsiKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlY3Rvci5sZW5ndGg7IGkrKykgeworICAgICAgYm9vbGVhbiBpc1RvcCA9IChpID09ICh0b3AgLSAxKSk7CisgICAgICBzaG9ydCB2YWx1ZSA9IHZlY3RvcltpXTsKKyAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgc2IuYXBwZW5kKCcgJyk7CisgICAgICB9CisgICAgICBpZiAoaXNUb3ApIHsKKyAgICAgICAgc2IuYXBwZW5kKCI+PiIpLmFwcGVuZCh2YWx1ZSkuYXBwZW5kKCI8PCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisgICAgc2IuYXBwZW5kKCJdPiIpOworICAgIHJldHVybiBzYi50b1N0cmluZygpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmphdmEKaW5kZXggMzdhOWZkOS4uYWJmYzk2NSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuamF2YQpAQCAtNTYsMjQgKzU2LDIzIEBACiAgICAgaWYgKGxlbiA9PSAzKSB7CiAgICAgICBkc3RbZHN0T2ZmICsgMV0gPQogICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEUuY2hhckF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjW3NyY09mZl0gPDwgNCkgKyAoc3JjW3NyY09mZisxXSA+PiA0KSkgJiAweDNGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCkgfCAoKHNyY1tzcmNPZmYrMV0gPj4gNCkgJiAweDBGKSk7CiAgICAgICBkc3RbZHN0T2ZmICsgMl0gPQogICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEUuY2hhckF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjW3NyY09mZisxXSA8PCAyKSArIChzcmNbc3JjT2ZmKzJdID4+IDYpKSAmIDB4M0YpOworICAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjW3NyY09mZisxXSA8PCAyKSAmIDB4M0MpIHwgKChzcmNbc3JjT2ZmKzJdID4+IDYpICYgMHgwMykpOwogICAgICAgZHN0W2RzdE9mZiArIDNdID0KICAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFLmNoYXJBdChzcmNbc3JjT2ZmKzJdICYgMHgzRik7CiAgICAgfQogICAgIGVsc2UgaWYgKGxlbiA9PSAyKSB7CiAgICAgICBkc3RbZHN0T2ZmKzFdID0KICAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFLmNoYXJBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKChzcmNbc3JjT2ZmXSA8PCA0KSArIChzcmNbc3JjT2ZmKzFdID4+IDQpKSAmIDB4M0YpOworICAgICAgICAgICAgICAgICAgICAgICAgICAoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCkgfCAoKHNyY1tzcmNPZmYrMV0gPj4gNCkgJiAweDBGKSk7CiAgICAgICBkc3RbZHN0T2ZmICsgMl0gPQotICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEUuY2hhckF0KChzcmNbc3JjT2ZmKzFdIDw8IDIpICYgMHgzRik7Ci0KKyAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFLmNoYXJBdCgoc3JjW3NyY09mZisxXSA8PCAyKSAmIDB4M0MpOwogICAgIH0KICAgICBlbHNlIHsgLy8gbGVuID09IDEpIHsKICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9Ci0gICAgICAgIChieXRlKUVOQ09ERV9UQUJMRS5jaGFyQXQoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzRik7CisgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRS5jaGFyQXQoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCk7CiAgICAgfQogICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuamF2YQppbmRleCBkMGQ5OTNiLi43OTI0ZTJmIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5qYXZhCkBAIC0xOSw4ICsxOSw4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CiAKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OwpAQCAtMzEsNDQgKzMxLDU5IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBUQmluYXJ5UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUU3RydWN0IEFOT05ZTU9VU19TVFJVQ1QgPSBuZXcgVFN0cnVjdCgpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE5PX0xFTkdUSF9MSU1JVCA9IC0xOwogCiAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDA7CiAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7CiAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0UmVhZF8gPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0V3JpdGVfID0gdHJ1ZTsKKyAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIHRyYW5zcG9ydCBmb3IKKyAgICogdmFyaWFibGUtbGVuZ3RoIGZpZWxkcyAoc3VjaCBhcyBzdHJpbmdzIG9yIGJpbmFyeSkgb3Ige0BsaW5rICNOT19MRU5HVEhfTElNSVR9IGZvcgorICAgKiB1bmxpbWl0ZWQuCisgICAqLworICBwcml2YXRlIGZpbmFsIGxvbmcgc3RyaW5nTGVuZ3RoTGltaXRfOwogCi0gIHByb3RlY3RlZCBpbnQgcmVhZExlbmd0aF87Ci0gIHByb3RlY3RlZCBib29sZWFuIGNoZWNrUmVhZExlbmd0aF8gPSBmYWxzZTsKKyAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyB0byByZWFkIGZyb20gdGhlIG5ldHdvcmsgZm9yCisgICAqIGNvbnRhaW5lcnMgKG1hcHMsIHNldHMsIGxpc3RzKSwgb3Ige0BsaW5rICNOT19MRU5HVEhfTElNSVR9IGZvciB1bmxpbWl0ZWQuCisgICAqLworICBwcml2YXRlIGZpbmFsIGxvbmcgY29udGFpbmVyTGVuZ3RoTGltaXRfOworCisgIHByb3RlY3RlZCBib29sZWFuIHN0cmljdFJlYWRfOworICBwcm90ZWN0ZWQgYm9vbGVhbiBzdHJpY3RXcml0ZV87CisKKyAgcHJpdmF0ZSBmaW5hbCBieXRlW10gaW5vdXRUZW1wID0gbmV3IGJ5dGVbOF07CiAKICAgLyoqCiAgICAqIEZhY3RvcnkKICAgICovCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkgewotICAgIHByb3RlY3RlZCBib29sZWFuIHN0cmljdFJlYWRfID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0V3JpdGVfID0gdHJ1ZTsKLSAgICBwcm90ZWN0ZWQgaW50IHJlYWRMZW5ndGhfOworICAgIHByb3RlY3RlZCBsb25nIHN0cmluZ0xlbmd0aExpbWl0XzsKKyAgICBwcm90ZWN0ZWQgbG9uZyBjb250YWluZXJMZW5ndGhMaW1pdF87CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0UmVhZF87CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0V3JpdGVfOwogCiAgICAgcHVibGljIEZhY3RvcnkoKSB7CiAgICAgICB0aGlzKGZhbHNlLCB0cnVlKTsKICAgICB9CiAKICAgICBwdWJsaWMgRmFjdG9yeShib29sZWFuIHN0cmljdFJlYWQsIGJvb2xlYW4gc3RyaWN0V3JpdGUpIHsKLSAgICAgIHRoaXMoc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUsIDApOworICAgICAgdGhpcyhzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSwgTk9fTEVOR1RIX0xJTUlULCBOT19MRU5HVEhfTElNSVQpOwogICAgIH0KIAotICAgIHB1YmxpYyBGYWN0b3J5KGJvb2xlYW4gc3RyaWN0UmVhZCwgYm9vbGVhbiBzdHJpY3RXcml0ZSwgaW50IHJlYWRMZW5ndGgpIHsKKyAgICBwdWJsaWMgRmFjdG9yeShsb25nIHN0cmluZ0xlbmd0aExpbWl0LCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0KSB7CisgICAgICB0aGlzKGZhbHNlLCB0cnVlLCBzdHJpbmdMZW5ndGhMaW1pdCwgY29udGFpbmVyTGVuZ3RoTGltaXQpOworICAgIH0KKworICAgIHB1YmxpYyBGYWN0b3J5KGJvb2xlYW4gc3RyaWN0UmVhZCwgYm9vbGVhbiBzdHJpY3RXcml0ZSwgbG9uZyBzdHJpbmdMZW5ndGhMaW1pdCwgbG9uZyBjb250YWluZXJMZW5ndGhMaW1pdCkgeworICAgICAgc3RyaW5nTGVuZ3RoTGltaXRfID0gc3RyaW5nTGVuZ3RoTGltaXQ7CisgICAgICBjb250YWluZXJMZW5ndGhMaW1pdF8gPSBjb250YWluZXJMZW5ndGhMaW1pdDsKICAgICAgIHN0cmljdFJlYWRfID0gc3RyaWN0UmVhZDsKICAgICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOwotICAgICAgcmVhZExlbmd0aF8gPSByZWFkTGVuZ3RoOwogICAgIH0KIAogICAgIHB1YmxpYyBUUHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgewotICAgICAgVEJpbmFyeVByb3RvY29sIHByb3RvID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucywgc3RyaWN0UmVhZF8sIHN0cmljdFdyaXRlXyk7Ci0gICAgICBpZiAocmVhZExlbmd0aF8gIT0gMCkgewotICAgICAgICBwcm90by5zZXRSZWFkTGVuZ3RoKHJlYWRMZW5ndGhfKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBwcm90bzsKKyAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zLCBzdHJpbmdMZW5ndGhMaW1pdF8sIGNvbnRhaW5lckxlbmd0aExpbWl0Xywgc3RyaWN0UmVhZF8sIHN0cmljdFdyaXRlXyk7CiAgICAgfQogICB9CiAKQEAgLTgwLDExICs5NSwyMiBAQAogICB9CiAKICAgcHVibGljIFRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zLCBib29sZWFuIHN0cmljdFJlYWQsIGJvb2xlYW4gc3RyaWN0V3JpdGUpIHsKKyAgICB0aGlzKHRyYW5zLCBOT19MRU5HVEhfTElNSVQsIE5PX0xFTkdUSF9MSU1JVCwgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpOworICB9CisKKyAgcHVibGljIFRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zLCBsb25nIHN0cmluZ0xlbmd0aExpbWl0LCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0KSB7CisgICAgdGhpcyh0cmFucywgc3RyaW5nTGVuZ3RoTGltaXQsIGNvbnRhaW5lckxlbmd0aExpbWl0LCBmYWxzZSwgdHJ1ZSk7CisgIH0KKworICBwdWJsaWMgVEJpbmFyeVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMsIGxvbmcgc3RyaW5nTGVuZ3RoTGltaXQsIGxvbmcgY29udGFpbmVyTGVuZ3RoTGltaXQsIGJvb2xlYW4gc3RyaWN0UmVhZCwgYm9vbGVhbiBzdHJpY3RXcml0ZSkgewogICAgIHN1cGVyKHRyYW5zKTsKKyAgICBzdHJpbmdMZW5ndGhMaW1pdF8gPSBzdHJpbmdMZW5ndGhMaW1pdDsKKyAgICBjb250YWluZXJMZW5ndGhMaW1pdF8gPSBjb250YWluZXJMZW5ndGhMaW1pdDsKICAgICBzdHJpY3RSZWFkXyA9IHN0cmljdFJlYWQ7CiAgICAgc3RyaWN0V3JpdGVfID0gc3RyaWN0V3JpdGU7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGlmIChzdHJpY3RXcml0ZV8pIHsKICAgICAgIGludCB2ZXJzaW9uID0gVkVSU0lPTl8xIHwgbWVzc2FnZS50eXBlOwpAQCAtOTgsOTggKzEyNCwxMTAgQEAKICAgICB9CiAgIH0KIAotICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAotICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWN0KSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAotICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUJ5dGUoZmllbGQudHlwZSk7CiAgICAgd3JpdGVJMTYoZmllbGQuaWQpOwogICB9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKFRUeXBlLlNUT1ApOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUJ5dGUobWFwLmtleVR5cGUpOwogICAgIHdyaXRlQnl0ZShtYXAudmFsdWVUeXBlKTsKICAgICB3cml0ZUkzMihtYXAuc2l6ZSk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCB3cml0ZU1hcEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZU1hcEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUJ5dGUobGlzdC5lbGVtVHlwZSk7CiAgICAgd3JpdGVJMzIobGlzdC5zaXplKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlTGlzdEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKHNldC5lbGVtVHlwZSk7CiAgICAgd3JpdGVJMzIoc2V0LnNpemUpOwogICB9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVTZXRFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUJvb2woYm9vbGVhbiBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKGIgPyAoYnl0ZSkxIDogKGJ5dGUpMCk7CiAgIH0KIAotICBwcml2YXRlIGJ5dGUgW10gYm91dCA9IG5ldyBieXRlWzFdOworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVCeXRlKGJ5dGUgYikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJvdXRbMF0gPSBiOwotICAgIHRyYW5zXy53cml0ZShib3V0LCAwLCAxKTsKKyAgICBpbm91dFRlbXBbMF0gPSBiOworICAgIHRyYW5zXy53cml0ZShpbm91dFRlbXAsIDAsIDEpOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlW10gaTE2b3V0ID0gbmV3IGJ5dGVbMl07CisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUkxNihzaG9ydCBpMTYpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBpMTZvdXRbMF0gPSAoYnl0ZSkoMHhmZiAmIChpMTYgPj4gOCkpOwotICAgIGkxNm91dFsxXSA9IChieXRlKSgweGZmICYgKGkxNikpOwotICAgIHRyYW5zXy53cml0ZShpMTZvdXQsIDAsIDIpOworICAgIGlub3V0VGVtcFswXSA9IChieXRlKSgweGZmICYgKGkxNiA+PiA4KSk7CisgICAgaW5vdXRUZW1wWzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTE2KSk7CisgICAgdHJhbnNfLndyaXRlKGlub3V0VGVtcCwgMCwgMik7CiAgIH0KIAotICBwcml2YXRlIGJ5dGVbXSBpMzJvdXQgPSBuZXcgYnl0ZVs0XTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBpMzJvdXRbMF0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gMjQpKTsKLSAgICBpMzJvdXRbMV0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gMTYpKTsKLSAgICBpMzJvdXRbMl0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gOCkpOwotICAgIGkzMm91dFszXSA9IChieXRlKSgweGZmICYgKGkzMikpOwotICAgIHRyYW5zXy53cml0ZShpMzJvdXQsIDAsIDQpOworICAgIGlub3V0VGVtcFswXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiAyNCkpOworICAgIGlub3V0VGVtcFsxXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiAxNikpOworICAgIGlub3V0VGVtcFsyXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiA4KSk7CisgICAgaW5vdXRUZW1wWzNdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyKSk7CisgICAgdHJhbnNfLndyaXRlKGlub3V0VGVtcCwgMCwgNCk7CiAgIH0KIAotICBwcml2YXRlIGJ5dGVbXSBpNjRvdXQgPSBuZXcgYnl0ZVs4XTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlSTY0KGxvbmcgaTY0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgaTY0b3V0WzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDU2KSk7Ci0gICAgaTY0b3V0WzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDQ4KSk7Ci0gICAgaTY0b3V0WzJdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDQwKSk7Ci0gICAgaTY0b3V0WzNdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDMyKSk7Ci0gICAgaTY0b3V0WzRdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDI0KSk7Ci0gICAgaTY0b3V0WzVdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDE2KSk7Ci0gICAgaTY0b3V0WzZdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDgpKTsKLSAgICBpNjRvdXRbN10gPSAoYnl0ZSkoMHhmZiAmIChpNjQpKTsKLSAgICB0cmFuc18ud3JpdGUoaTY0b3V0LCAwLCA4KTsKKyAgICBpbm91dFRlbXBbMF0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNTYpKTsKKyAgICBpbm91dFRlbXBbMV0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNDgpKTsKKyAgICBpbm91dFRlbXBbMl0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNDApKTsKKyAgICBpbm91dFRlbXBbM10gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMzIpKTsKKyAgICBpbm91dFRlbXBbNF0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMjQpKTsKKyAgICBpbm91dFRlbXBbNV0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMTYpKTsKKyAgICBpbm91dFRlbXBbNl0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gOCkpOworICAgIGlub3V0VGVtcFs3XSA9IChieXRlKSgweGZmICYgKGk2NCkpOworICAgIHRyYW5zXy53cml0ZShpbm91dFRlbXAsIDAsIDgpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkdWIpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUk2NChEb3VibGUuZG91YmxlVG9Mb25nQml0cyhkdWIpKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBkYXQgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICB3cml0ZUkzMihkYXQubGVuZ3RoKTsKLSAgICAgIHRyYW5zXy53cml0ZShkYXQsIDAsIGRhdC5sZW5ndGgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgYnl0ZVtdIGRhdCA9IHN0ci5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB3cml0ZUkzMihkYXQubGVuZ3RoKTsKKyAgICB0cmFuc18ud3JpdGUoZGF0LCAwLCBkYXQubGVuZ3RoKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUJpbmFyeShCeXRlQnVmZmVyIGJpbikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBsZW5ndGggPSBiaW4ubGltaXQoKSAtIGJpbi5wb3NpdGlvbigpOwogICAgIHdyaXRlSTMyKGxlbmd0aCk7CkBAIC0yMDAsNiArMjM4LDcgQEAKICAgICogUmVhZGluZyBtZXRob2RzLgogICAgKi8KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IHNpemUgPSByZWFkSTMyKCk7CiAgICAgaWYgKHNpemUgPCAwKSB7CkBAIC0yMTYsNTggKzI1NSw3NiBAQAogICAgIH0KICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRNZXNzYWdlRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAotICBwdWJsaWMgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcmV0dXJuIEFOT05ZTU9VU19TVFJVQ1Q7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkU3RydWN0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGJ5dGUgdHlwZSA9IHJlYWRCeXRlKCk7CiAgICAgc2hvcnQgaWQgPSB0eXBlID09IFRUeXBlLlNUT1AgPyAwIDogcmVhZEkxNigpOwogICAgIHJldHVybiBuZXcgVEZpZWxkKCIiLCB0eXBlLCBpZCk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkRmllbGRFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZEZpZWxkRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRNYXAgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHJldHVybiBuZXcgVE1hcChyZWFkQnl0ZSgpLCByZWFkQnl0ZSgpLCByZWFkSTMyKCkpOworICAgIFRNYXAgbWFwID0gbmV3IFRNYXAocmVhZEJ5dGUoKSwgcmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKKyAgICBjaGVja0NvbnRhaW5lclJlYWRMZW5ndGgobWFwLnNpemUpOworICAgIHJldHVybiBtYXA7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkTWFwRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVExpc3QgcmVhZExpc3RCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICByZXR1cm4gbmV3IFRMaXN0KHJlYWRCeXRlKCksIHJlYWRJMzIoKSk7CisgICAgVExpc3QgbGlzdCA9IG5ldyBUTGlzdChyZWFkQnl0ZSgpLCByZWFkSTMyKCkpOworICAgIGNoZWNrQ29udGFpbmVyUmVhZExlbmd0aChsaXN0LnNpemUpOworICAgIHJldHVybiBsaXN0OwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZExpc3RFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZExpc3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVFNldCByZWFkU2V0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIG5ldyBUU2V0KHJlYWRCeXRlKCksIHJlYWRJMzIoKSk7CisgICAgVFNldCBzZXQgPSBuZXcgVFNldChyZWFkQnl0ZSgpLCByZWFkSTMyKCkpOworICAgIGNoZWNrQ29udGFpbmVyUmVhZExlbmd0aChzZXQuc2l6ZSk7CisgICAgcmV0dXJuIHNldDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRTZXRFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZFNldEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBib29sZWFuIHJlYWRCb29sKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHJldHVybiAocmVhZEJ5dGUoKSA9PSAxKTsKICAgfQogCi0gIHByaXZhdGUgYnl0ZVtdIGJpbiA9IG5ldyBieXRlWzFdOworICBAT3ZlcnJpZGUKICAgcHVibGljIGJ5dGUgcmVhZEJ5dGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gMSkgewogICAgICAgYnl0ZSBiID0gdHJhbnNfLmdldEJ1ZmZlcigpW3RyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpXTsKICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKDEpOwogICAgICAgcmV0dXJuIGI7CiAgICAgfQotICAgIHJlYWRBbGwoYmluLCAwLCAxKTsKLSAgICByZXR1cm4gYmluWzBdOworICAgIHJlYWRBbGwoaW5vdXRUZW1wLCAwLCAxKTsKKyAgICByZXR1cm4gaW5vdXRUZW1wWzBdOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlW10gaTE2cmQgPSBuZXcgYnl0ZVsyXTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBzaG9ydCByZWFkSTE2KCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJ5dGVbXSBidWYgPSBpMTZyZDsKKyAgICBieXRlW10gYnVmID0gaW5vdXRUZW1wOwogICAgIGludCBvZmYgPSAwOwogCiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gMikgewpAQCAtMjc1LDcgKzMzMiw3IEBACiAgICAgICBvZmYgPSB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKTsKICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKDIpOwogICAgIH0gZWxzZSB7Ci0gICAgICByZWFkQWxsKGkxNnJkLCAwLCAyKTsKKyAgICAgIHJlYWRBbGwoaW5vdXRUZW1wLCAwLCAyKTsKICAgICB9CiAKICAgICByZXR1cm4KQEAgLTI4NCw5ICszNDEsOSBAQAogICAgICAgICgoYnVmW29mZisxXSAmIDB4ZmYpKSk7CiAgIH0KIAotICBwcml2YXRlIGJ5dGVbXSBpMzJyZCA9IG5ldyBieXRlWzRdOworICBAT3ZlcnJpZGUKICAgcHVibGljIGludCByZWFkSTMyKCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJ5dGVbXSBidWYgPSBpMzJyZDsKKyAgICBieXRlW10gYnVmID0gaW5vdXRUZW1wOwogICAgIGludCBvZmYgPSAwOwogCiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gNCkgewpAQCAtMjk0LDcgKzM1MSw3IEBACiAgICAgICBvZmYgPSB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKTsKICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKDQpOwogICAgIH0gZWxzZSB7Ci0gICAgICByZWFkQWxsKGkzMnJkLCAwLCA0KTsKKyAgICAgIHJlYWRBbGwoaW5vdXRUZW1wLCAwLCA0KTsKICAgICB9CiAgICAgcmV0dXJuCiAgICAgICAoKGJ1ZltvZmZdICYgMHhmZikgPDwgMjQpIHwKQEAgLTMwMyw5ICszNjAsOSBAQAogICAgICAgKChidWZbb2ZmKzNdICYgMHhmZikpOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlW10gaTY0cmQgPSBuZXcgYnl0ZVs4XTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBsb25nIHJlYWRJNjQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgYnl0ZVtdIGJ1ZiA9IGk2NHJkOworICAgIGJ5dGVbXSBidWYgPSBpbm91dFRlbXA7CiAgICAgaW50IG9mZiA9IDA7CiAKICAgICBpZiAodHJhbnNfLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSA+PSA4KSB7CkBAIC0zMTMsNyArMzcwLDcgQEAKICAgICAgIG9mZiA9IHRyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpOwogICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIoOCk7CiAgICAgfSBlbHNlIHsKLSAgICAgIHJlYWRBbGwoaTY0cmQsIDAsIDgpOworICAgICAgcmVhZEFsbChpbm91dFRlbXAsIDAsIDgpOwogICAgIH0KIAogICAgIHJldHVybgpAQCAtMzI3LDQwICszODQsMzkgQEAKICAgICAgICgobG9uZykoYnVmW29mZis3XSAmIDB4ZmYpKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgZG91YmxlIHJlYWREb3VibGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcmV0dXJuIERvdWJsZS5sb25nQml0c1RvRG91YmxlKHJlYWRJNjQoKSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBzaXplID0gcmVhZEkzMigpOwogCisgICAgY2hlY2tTdHJpbmdSZWFkTGVuZ3RoKHNpemUpOworCiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gc2l6ZSkgewotICAgICAgdHJ5IHsKLSAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKHRyYW5zXy5nZXRCdWZmZXIoKSwgdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCksIHNpemUsICJVVEYtOCIpOwotICAgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcihzaXplKTsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgICB9CisgICAgICBTdHJpbmcgcyA9IG5ldyBTdHJpbmcodHJhbnNfLmdldEJ1ZmZlcigpLCB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKSwKKyAgICAgICAgICBzaXplLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKHNpemUpOworICAgICAgcmV0dXJuIHM7CiAgICAgfQogCiAgICAgcmV0dXJuIHJlYWRTdHJpbmdCb2R5KHNpemUpOwogICB9CiAKICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nQm9keShpbnQgc2l6ZSkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICBjaGVja1JlYWRMZW5ndGgoc2l6ZSk7Ci0gICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07Ci0gICAgICB0cmFuc18ucmVhZEFsbChidWYsIDAsIHNpemUpOwotICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmLCAiVVRGLTgiKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIGNoZWNrU3RyaW5nUmVhZExlbmd0aChzaXplKTsKKyAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgdHJhbnNfLnJlYWRBbGwoYnVmLCAwLCBzaXplKTsKKyAgICByZXR1cm4gbmV3IFN0cmluZyhidWYsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBCeXRlQnVmZmVyIHJlYWRCaW5hcnkoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IHNpemUgPSByZWFkSTMyKCk7Ci0gICAgY2hlY2tSZWFkTGVuZ3RoKHNpemUpOworCisgICAgY2hlY2tTdHJpbmdSZWFkTGVuZ3RoKHNpemUpOwogCiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gc2l6ZSkgewogICAgICAgQnl0ZUJ1ZmZlciBiYiA9IEJ5dGVCdWZmZXIud3JhcCh0cmFuc18uZ2V0QnVmZmVyKCksIHRyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpLCBzaXplKTsKQEAgLTM3MywyNiArNDI5LDI5IEBACiAgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChidWYpOwogICB9CiAKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrU3RyaW5nUmVhZExlbmd0aChpbnQgbGVuZ3RoKSB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICBpZiAobGVuZ3RoIDwgMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZ2F0aXZlIGxlbmd0aDogIiArIGxlbmd0aCk7CisgICAgfQorICAgIGlmIChzdHJpbmdMZW5ndGhMaW1pdF8gIT0gTk9fTEVOR1RIX0xJTUlUICYmIGxlbmd0aCA+IHN0cmluZ0xlbmd0aExpbWl0XykgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlbmd0aCBleGNlZWRlZCBtYXggYWxsb3dlZDogIiArIGxlbmd0aCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrQ29udGFpbmVyUmVhZExlbmd0aChpbnQgbGVuZ3RoKSB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICBpZiAobGVuZ3RoIDwgMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZ2F0aXZlIGxlbmd0aDogIiArIGxlbmd0aCk7CisgICAgfQorICAgIGlmIChjb250YWluZXJMZW5ndGhMaW1pdF8gIT0gTk9fTEVOR1RIX0xJTUlUICYmIGxlbmd0aCA+IGNvbnRhaW5lckxlbmd0aExpbWl0XykgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlbmd0aCBleGNlZWRlZCBtYXggYWxsb3dlZDogIiArIGxlbmd0aCk7CisgICAgfQorICB9CisKICAgcHJpdmF0ZSBpbnQgcmVhZEFsbChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgY2hlY2tSZWFkTGVuZ3RoKGxlbik7CiAgICAgcmV0dXJuIHRyYW5zXy5yZWFkQWxsKGJ1Ziwgb2ZmLCBsZW4pOwogICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVhZExlbmd0aChpbnQgcmVhZExlbmd0aCkgewotICAgIHJlYWRMZW5ndGhfID0gcmVhZExlbmd0aDsKLSAgICBjaGVja1JlYWRMZW5ndGhfID0gdHJ1ZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNoZWNrUmVhZExlbmd0aChpbnQgbGVuZ3RoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgaWYgKGxlbmd0aCA8IDApIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOZWdhdGl2ZSBsZW5ndGg6ICIgKyBsZW5ndGgpOwotICAgIH0KLSAgICBpZiAoY2hlY2tSZWFkTGVuZ3RoXykgewotICAgICAgcmVhZExlbmd0aF8gLT0gbGVuZ3RoOwotICAgICAgaWYgKHJlYWRMZW5ndGhfIDwgMCkgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTWVzc2FnZSBsZW5ndGggZXhjZWVkZWQ6ICIgKyBsZW5ndGgpOwotICAgICAgfQotICAgIH0KLSAgfQotCiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGQzYjE2MzYuLmVlMDU4NjkKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5qYXZhCkBAIC0yMiwyMSArMjIsMjUgQEAKIAogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIAotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlNob3J0U3RhY2s7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKIAogLyoqCiAgKiBUQ29tcGFjdFByb3RvY29sMiBpcyB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcGFjdCBwcm90b2NvbCBzcGVjaWZpZWQKLSAqIGluIFRIUklGVC0xMTAuIFRoZSBmdW5kYW1lbnRhbCBhcHByb2FjaCB0byByZWR1Y2luZyB0aGUgb3ZlcmhlYWQgb2YgCisgKiBpbiBUSFJJRlQtMTEwLiBUaGUgZnVuZGFtZW50YWwgYXBwcm9hY2ggdG8gcmVkdWNpbmcgdGhlIG92ZXJoZWFkIG9mCiAgKiBzdHJ1Y3R1cmVzIGlzIGEpIHVzZSB2YXJpYWJsZS1sZW5ndGggaW50ZWdlcnMgYWxsIG92ZXIgdGhlIHBsYWNlIGFuZCBiKSBtYWtlCi0gKiB1c2Ugb2YgdW51c2VkIGJpdHMgd2hlcmV2ZXIgcG9zc2libGUuIFlvdXIgc2F2aW5ncyB3aWxsIG9idmlvdXNseSB2YXJ5IAotICogYmFzZWQgb24gdGhlIHNwZWNpZmljIG1ha2V1cCBvZiB5b3VyIHN0cnVjdHMsIGJ1dCBpbiBnZW5lcmFsLCB0aGUgbW9yZSAKKyAqIHVzZSBvZiB1bnVzZWQgYml0cyB3aGVyZXZlciBwb3NzaWJsZS4gWW91ciBzYXZpbmdzIHdpbGwgb2J2aW91c2x5IHZhcnkKKyAqIGJhc2VkIG9uIHRoZSBzcGVjaWZpYyBtYWtldXAgb2YgeW91ciBzdHJ1Y3RzLCBidXQgaW4gZ2VuZXJhbCwgdGhlIG1vcmUKICAqIGZpZWxkcywgbmVzdGVkIHN0cnVjdHVyZXMsIHNob3J0IHN0cmluZ3MgYW5kIGNvbGxlY3Rpb25zLCBhbmQgbG93LXZhbHVlIGkzMgogICogYW5kIGk2NCBmaWVsZHMgeW91IGhhdmUsIHRoZSBtb3JlIGJlbmVmaXQgeW91J2xsIHNlZS4KICAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRDb21wYWN0UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgeworcHVibGljIGNsYXNzIFRDb21wYWN0UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgeworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gRU1QVFlfQllURVMgPSBuZXcgYnl0ZVswXTsKKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQnl0ZUJ1ZmZlciBFTVBUWV9CVUZGRVIgPSBCeXRlQnVmZmVyLndyYXAoRU1QVFlfQllURVMpOworCisgIHByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgTk9fTEVOR1RIX0xJTUlUID0gLTE7CiAKICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVFN0cnVjdCBBTk9OWU1PVVNfU1RSVUNUID0gbmV3IFRTdHJ1Y3QoIiIpOwogICBwcml2YXRlIGZpbmFsIHN0YXRpYyBURmllbGQgVFNUT1AgPSBuZXcgVEZpZWxkKCIiLCBUVHlwZS5TVE9QLCAoc2hvcnQpMCk7CkBAIC02MiwxMCArNjYsMjQgQEAKICAgICogVFByb3RvY29sRmFjdG9yeSB0aGF0IHByb2R1Y2VzIFRDb21wYWN0UHJvdG9jb2xzLgogICAgKi8KICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7Ci0gICAgcHVibGljIEZhY3RvcnkoKSB7fQorICAgIHByaXZhdGUgZmluYWwgbG9uZyBzdHJpbmdMZW5ndGhMaW1pdF87CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0XzsKKworICAgIHB1YmxpYyBGYWN0b3J5KCkgeworICAgICAgdGhpcyhOT19MRU5HVEhfTElNSVQsIE5PX0xFTkdUSF9MSU1JVCk7CisgICAgfQorCisgICAgcHVibGljIEZhY3RvcnkobG9uZyBzdHJpbmdMZW5ndGhMaW1pdCkgeworICAgICAgdGhpcyhzdHJpbmdMZW5ndGhMaW1pdCwgTk9fTEVOR1RIX0xJTUlUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmFjdG9yeShsb25nIHN0cmluZ0xlbmd0aExpbWl0LCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0KSB7CisgICAgICB0aGlzLmNvbnRhaW5lckxlbmd0aExpbWl0XyA9IGNvbnRhaW5lckxlbmd0aExpbWl0OworICAgICAgdGhpcy5zdHJpbmdMZW5ndGhMaW1pdF8gPSBzdHJpbmdMZW5ndGhMaW1pdDsKKyAgICB9CiAKICAgICBwdWJsaWMgVFByb3RvY29sIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpIHsKLSAgICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFucyk7CisgICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnMsIHN0cmluZ0xlbmd0aExpbWl0XywgY29udGFpbmVyTGVuZ3RoTGltaXRfKTsKICAgICB9CiAgIH0KIApAQCAtNzMsNiArOTEsNyBAQAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFZFUlNJT04gPSAxOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFZFUlNJT05fTUFTSyA9IDB4MWY7IC8vIDAwMDEgMTExMQogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFRZUEVfTUFTSyA9IChieXRlKTB4RTA7IC8vIDExMTAgMDAwMAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFRZUEVfQklUUyA9IDB4MDc7IC8vIDAwMDAgMDExMQogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgIFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKIAogICAvKioKQEAgLTkzLDcgKzExMiw3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNUUlVDVCAgICAgICAgID0gMHgwQzsKICAgfQogCi0gIC8qKiAKKyAgLyoqCiAgICAqIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBmaWVsZCBmb3IgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0cnVjdHMsCiAgICAqIHNvIHdlIGNhbiBkbyB0aGUgZGVsdGEgc3R1ZmYuCiAgICAqLwpAQCAtMTAyLDI0ICsxMjEsNzEgQEAKICAgcHJpdmF0ZSBzaG9ydCBsYXN0RmllbGRJZF8gPSAwOwogCiAgIC8qKgotICAgKiBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZSBzbyBpdCBjYW4gCisgICAqIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlIHNvIGl0IGNhbgogICAgKiBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCiAgICAqLwogICBwcml2YXRlIFRGaWVsZCBib29sZWFuRmllbGRfID0gbnVsbDsKIAogICAvKioKLSAgICogSWYgd2UgcmVhZCBhIGZpZWxkIGhlYWRlciwgYW5kIGl0J3MgYSBib29sZWFuIGZpZWxkLCBzYXZlIHRoZSBib29sZWFuIAorICAgKiBJZiB3ZSByZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4KICAgICogdmFsdWUgaGVyZSBzbyB0aGF0IHJlYWRCb29sIGNhbiB1c2UgaXQuCiAgICAqLwogICBwcml2YXRlIEJvb2xlYW4gYm9vbFZhbHVlXyA9IG51bGw7CiAKICAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIHRyYW5zcG9ydCBmb3IKKyAgICogdmFyaWFibGUtbGVuZ3RoIGZpZWxkcyAoc3VjaCBhcyBzdHJpbmdzIG9yIGJpbmFyeSkgb3Ige0BsaW5rICNOT19MRU5HVEhfTElNSVR9IGZvcgorICAgKiB1bmxpbWl0ZWQuCisgICAqLworICBwcml2YXRlIGZpbmFsIGxvbmcgc3RyaW5nTGVuZ3RoTGltaXRfOworCisgIC8qKgorICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmVhZCBmcm9tIHRoZSBuZXR3b3JrIGZvcgorICAgKiBjb250YWluZXJzIChtYXBzLCBzZXRzLCBsaXN0cyksIG9yIHtAbGluayAjTk9fTEVOR1RIX0xJTUlUfSBmb3IgdW5saW1pdGVkLgorICAgKi8KKyAgcHJpdmF0ZSBmaW5hbCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0XzsKKworICAvKioKKyAgICogVGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGZvciB2YXJpb3VzIG9wZXJhdGlvbnMgdGhhdCB3b3VsZCBvdGhlcndpc2UgcmVxdWlyZSBhCisgICAqIHNtYWxsIGFsbG9jYXRpb24uCisgICAqLworICBwcml2YXRlIGZpbmFsIGJ5dGVbXSB0ZW1wID0gbmV3IGJ5dGVbMTBdOworCisgIC8qKgorICAgKiBDcmVhdGUgYSBUQ29tcGFjdFByb3RvY29sLgorICAgKgorICAgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSBUVHJhbnNwb3J0IG9iamVjdCB0byByZWFkIGZyb20gb3Igd3JpdGUgdG8uCisgICAqIEBwYXJhbSBzdHJpbmdMZW5ndGhMaW1pdCB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmb3IKKyAgICogICAgIHZhcmlhYmxlLWxlbmd0aCBmaWVsZHMuCisgICAqIEBwYXJhbSBjb250YWluZXJMZW5ndGhMaW1pdCB0aGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmVhZAorICAgKiAgICAgZm9yIGNvbnRhaW5lcnMuCisgICAqLworICBwdWJsaWMgVENvbXBhY3RQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCwgbG9uZyBzdHJpbmdMZW5ndGhMaW1pdCwgbG9uZyBjb250YWluZXJMZW5ndGhMaW1pdCkgeworICAgIHN1cGVyKHRyYW5zcG9ydCk7CisgICAgdGhpcy5zdHJpbmdMZW5ndGhMaW1pdF8gPSBzdHJpbmdMZW5ndGhMaW1pdDsKKyAgICB0aGlzLmNvbnRhaW5lckxlbmd0aExpbWl0XyA9IGNvbnRhaW5lckxlbmd0aExpbWl0OworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIFRDb21wYWN0UHJvdG9jb2wuCisgICAqCisgICAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIFRUcmFuc3BvcnQgb2JqZWN0IHRvIHJlYWQgZnJvbSBvciB3cml0ZSB0by4KKyAgICogQHBhcmFtIHN0cmluZ0xlbmd0aExpbWl0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZvcgorICAgKiAgICAgdmFyaWFibGUtbGVuZ3RoIGZpZWxkcy4KKyAgICogQGRlcHJlY2F0ZWQgVXNlIGNvbnN0cnVjdG9yIHNwZWNpZnlpbmcgYm90aCBzdHJpbmcgbGltaXQgYW5kIGNvbnRhaW5lciBsaW1pdCBpbnN0ZWFkCisgICAqLworICBARGVwcmVjYXRlZAorICBwdWJsaWMgVENvbXBhY3RQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCwgbG9uZyBzdHJpbmdMZW5ndGhMaW1pdCkgeworICAgIHRoaXModHJhbnNwb3J0LCBzdHJpbmdMZW5ndGhMaW1pdCwgTk9fTEVOR1RIX0xJTUlUKTsKKyAgfQorCisgIC8qKgogICAgKiBDcmVhdGUgYSBUQ29tcGFjdFByb3RvY29sLgogICAgKgogICAgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSBUVHJhbnNwb3J0IG9iamVjdCB0byByZWFkIGZyb20gb3Igd3JpdGUgdG8uCiAgICAqLwogICBwdWJsaWMgVENvbXBhY3RQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgewotICAgIHN1cGVyKHRyYW5zcG9ydCk7CisgICAgdGhpcyh0cmFuc3BvcnQsIE5PX0xFTkdUSF9MSU1JVCwgTk9fTEVOR1RIX0xJTUlUKTsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtMTM2LDYgKzIwMiw3IEBACiAgICAqIFdyaXRlIGEgbWVzc2FnZSBoZWFkZXIgdG8gdGhlIHdpcmUuIENvbXBhY3QgUHJvdG9jb2wgbWVzc2FnZXMgY29udGFpbiB0aGUKICAgICogcHJvdG9jb2wgdmVyc2lvbiBzbyB3ZSBjYW4gbWlncmF0ZSBmb3J3YXJkcyBpbiB0aGUgZnV0dXJlIGlmIG5lZWQgYmUuCiAgICAqLworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZURpcmVjdChQUk9UT0NPTF9JRCk7CiAgICAgd3JpdGVCeXRlRGlyZWN0KChWRVJTSU9OICYgVkVSU0lPTl9NQVNLKSB8ICgobWVzc2FnZS50eXBlIDw8IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfTUFTSykpOwpAQCAtMTQ0LDEwICsyMTEsMTEgQEAKICAgfQogCiAgIC8qKgotICAgKiBXcml0ZSBhIHN0cnVjdCBiZWdpbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UgCisgICAqIFdyaXRlIGEgc3RydWN0IGJlZ2luLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZQogICAgKiB1c2UgaXQgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQKICAgICogc3RhY2sgc28gd2UgY2FuIGdldCB0aGUgZmllbGQgaWQgZGVsdGFzIGNvcnJlY3QuCiAgICAqLworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGxhc3RGaWVsZF8ucHVzaChsYXN0RmllbGRJZF8pOwogICAgIGxhc3RGaWVsZElkXyA9IDA7CkBAIC0xNjQsMTAgKzIzMiwxMCBAQAogCiAgIC8qKgogICAgKiBXcml0ZSBhIGZpZWxkIGhlYWRlciBjb250YWluaW5nIHRoZSBmaWVsZCBpZCBhbmQgZmllbGQgdHlwZS4gSWYgdGhlCi0gICAqIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICg8IDE1KSwKKyAgICogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IGZpZWxkIGlkIGFuZCB0aGUgbGFzdCBvbmUgaXMgc21hbGwgKCZsdDsgMTUpLAogICAgKiB0aGVuIHRoZSBmaWVsZCBpZCB3aWxsIGJlIGVuY29kZWQgaW4gdGhlIDQgTVNCIGFzIGEgZGVsdGEuIE90aGVyd2lzZSwgdGhlCiAgICAqIGZpZWxkIGlkIHdpbGwgZm9sbG93IHRoZSB0eXBlIGhlYWRlciBhcyBhIHppZ3phZyB2YXJpbnQuCi0gICAqLyAKKyAgICovCiAgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5CT09MKSB7CiAgICAgICAvLyB3ZSB3YW50IHRvIHBvc3NpYmx5IGluY2x1ZGUgdGhlIHZhbHVlLCBzbyB3ZSdsbCB3YWl0LgpAQCAtMTc4LDggKzI0Niw4IEBACiAgIH0KIAogICAvKioKLSAgICogVGhlIHdvcmtob3JzZSBvZiB3cml0ZUZpZWxkQmVnaW4uIEl0IGhhcyB0aGUgb3B0aW9uIG9mIGRvaW5nIGEgCi0gICAqICd0eXBlIG92ZXJyaWRlJyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlIAorICAgKiBUaGUgd29ya2hvcnNlIG9mIHdyaXRlRmllbGRCZWdpbi4gSXQgaGFzIHRoZSBvcHRpb24gb2YgZG9pbmcgYQorICAgKiAndHlwZSBvdmVycmlkZScgb2YgdGhlIHR5cGUgaGVhZGVyLiBUaGlzIGlzIHVzZWQgc3BlY2lmaWNhbGx5IGluIHRoZQogICAgKiBib29sZWFuIGZpZWxkIGNhc2UuCiAgICAqLwogICBwcml2YXRlIHZvaWQgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoVEZpZWxkIGZpZWxkLCBieXRlIHR5cGVPdmVycmlkZSkgdGhyb3dzIFRFeGNlcHRpb24gewpAQCAtMjEwLDcgKzI3OCw3IEBACiAgIH0KIAogICAvKioKLSAgICogV3JpdGUgYSBtYXAgaGVhZGVyLiBJZiB0aGUgbWFwIGlzIGVtcHR5LCBvbWl0IHRoZSBrZXkgYW5kIHZhbHVlIHR5cGUgCisgICAqIFdyaXRlIGEgbWFwIGhlYWRlci4gSWYgdGhlIG1hcCBpcyBlbXB0eSwgb21pdCB0aGUga2V5IGFuZCB2YWx1ZSB0eXBlCiAgICAqIGhlYWRlcnMsIGFzIHdlIGRvbid0IG5lZWQgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gc2tpcCBpdC4KICAgICovCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTIyMSw4ICsyODksOCBAQAogICAgICAgd3JpdGVCeXRlRGlyZWN0KGdldENvbXBhY3RUeXBlKG1hcC5rZXlUeXBlKSA8PCA0IHwgZ2V0Q29tcGFjdFR5cGUobWFwLnZhbHVlVHlwZSkpOwogICAgIH0KICAgfQotICAKLSAgLyoqIAorCisgIC8qKgogICAgKiBXcml0ZSBhIGxpc3QgaGVhZGVyLgogICAgKi8KICAgcHVibGljIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgdGhyb3dzIFRFeGNlcHRpb24gewpAQCAtMjM3LDkgKzMwNSw5IEBACiAgIH0KIAogICAvKioKLSAgICogV3JpdGUgYSBib29sZWFuIHZhbHVlLiBQb3RlbnRpYWxseSwgdGhpcyBjb3VsZCBiZSBhIGJvb2xlYW4gZmllbGQsIGluIAorICAgKiBXcml0ZSBhIGJvb2xlYW4gdmFsdWUuIFBvdGVudGlhbGx5LCB0aGlzIGNvdWxkIGJlIGEgYm9vbGVhbiBmaWVsZCwgaW4KICAgICogd2hpY2ggY2FzZSB0aGUgZmllbGQgaGVhZGVyIGluZm8gaXNuJ3Qgd3JpdHRlbiB5ZXQuIElmIHNvLCBkZWNpZGUgd2hhdCB0aGUKLSAgICogcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiB3cml0ZSB0aGUgZmllbGQgaGVhZGVyLiAKKyAgICogcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiB3cml0ZSB0aGUgZmllbGQgaGVhZGVyLgogICAgKiBPdGhlcndpc2UsIHdyaXRlIGEgc2luZ2xlIGJ5dGUuCiAgICAqLwogICBwdWJsaWMgdm9pZCB3cml0ZUJvb2woYm9vbGVhbiBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CkBAIC0yNTMsNyArMzIxLDcgQEAKICAgICB9CiAgIH0KIAotICAvKiogCisgIC8qKgogICAgKiBXcml0ZSBhIGJ5dGUuIE5vdGhpbmcgdG8gc2VlIGhlcmUhCiAgICAqLwogICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGUoYnl0ZSBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CkBAIC0yODMsMjcgKzM1MSwyMiBAQAogCiAgIC8qKgogICAgKiBXcml0ZSBhIGRvdWJsZSB0byB0aGUgd2lyZSBhcyA4IGJ5dGVzLgotICAgKi8gCisgICAqLwogICBwdWJsaWMgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtdezAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwotICAgIGZpeGVkTG9uZ1RvQnl0ZXMoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoZHViKSwgZGF0YSwgMCk7Ci0gICAgdHJhbnNfLndyaXRlKGRhdGEpOworICAgIGZpeGVkTG9uZ1RvQnl0ZXMoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoZHViKSwgdGVtcCwgMCk7CisgICAgdHJhbnNfLndyaXRlKHRlbXAsIDAsIDgpOwogICB9CiAKICAgLyoqCiAgICAqIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSB3aXJlIHdpdGggYSB2YXJpbnQgc2l6ZSBwcmVjZWRpbmcuCiAgICAqLwogICBwdWJsaWMgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBieXRlcyA9IHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHdyaXRlQmluYXJ5KGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlVURi04IG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgfQorICAgIGJ5dGVbXSBieXRlcyA9IHN0ci5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB3cml0ZUJpbmFyeShieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKICAgfQogCiAgIC8qKgotICAgKiBXcml0ZSBhIGJ5dGUgYXJyYXksIHVzaW5nIGEgdmFyaW50IGZvciB0aGUgc2l6ZS4gCisgICAqIFdyaXRlIGEgYnl0ZSBhcnJheSwgdXNpbmcgYSB2YXJpbnQgZm9yIHRoZSBzaXplLgogICAgKi8KICAgcHVibGljIHZvaWQgd3JpdGVCaW5hcnkoQnl0ZUJ1ZmZlciBiaW4pIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbnQgbGVuZ3RoID0gYmluLmxpbWl0KCkgLSBiaW4ucG9zaXRpb24oKTsKQEAgLTMxNiw5ICszNzksOSBAQAogICB9CiAKICAgLy8KLSAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIGJ5IHN0cnVjdHMsIGJ1dCBkb24ndCBhY3R1YWxseSBoYXZlIGFueSB3aXJlIAorICAvLyBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgYnkgc3RydWN0cywgYnV0IGRvbid0IGFjdHVhbGx5IGhhdmUgYW55IHdpcmUKICAgLy8gb3V0cHV0IG9yIHB1cnBvc2UuCi0gIC8vIAorICAvLwogCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAgIHB1YmxpYyB2b2lkIHdyaXRlTWFwRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KQEAgLTMzMSw3ICszOTQsNyBAQAogICAvLwogCiAgIC8qKgotICAgKiBBYnN0cmFjdCBtZXRob2QgZm9yIHdyaXRpbmcgdGhlIHN0YXJ0IG9mIGxpc3RzIGFuZCBzZXRzLiBMaXN0IGFuZCBzZXRzIG9uIAorICAgKiBBYnN0cmFjdCBtZXRob2QgZm9yIHdyaXRpbmcgdGhlIHN0YXJ0IG9mIGxpc3RzIGFuZCBzZXRzLiBMaXN0IGFuZCBzZXRzIG9uCiAgICAqIHRoZSB3aXJlIGRpZmZlciBvbmx5IGJ5IHRoZSB0eXBlIGluZGljYXRvci4KICAgICovCiAgIHByb3RlY3RlZCB2b2lkIHdyaXRlQ29sbGVjdGlvbkJlZ2luKGJ5dGUgZWxlbVR5cGUsIGludCBzaXplKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CkBAIC0zNDcsNDQgKzQxMCw0MiBAQAogICAgKiBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgogICAgKiBUT0RPOiBtYWtlIGEgcGVybWFuZW50IGJ1ZmZlciBsaWtlIHdyaXRlVmFyaW50NjQ/CiAgICAqLwotICBieXRlW10gaTMyYnVmID0gbmV3IGJ5dGVbNV07CiAgIHByaXZhdGUgdm9pZCB3cml0ZVZhcmludDMyKGludCBuKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IGlkeCA9IDA7CiAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgIGlmICgobiAmIH4weDdGKSA9PSAwKSB7Ci0gICAgICAgIGkzMmJ1ZltpZHgrK10gPSAoYnl0ZSluOworICAgICAgICB0ZW1wW2lkeCsrXSA9IChieXRlKW47CiAgICAgICAgIC8vIHdyaXRlQnl0ZURpcmVjdCgoYnl0ZSluKTsKICAgICAgICAgYnJlYWs7CiAgICAgICAgIC8vIHJldHVybjsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGkzMmJ1ZltpZHgrK10gPSAoYnl0ZSkoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgICB0ZW1wW2lkeCsrXSA9IChieXRlKSgobiAmIDB4N0YpIHwgMHg4MCk7CiAgICAgICAgIC8vIHdyaXRlQnl0ZURpcmVjdCgoYnl0ZSkoKG4gJiAweDdGKSB8IDB4ODApKTsKICAgICAgICAgbiA+Pj49IDc7CiAgICAgICB9CiAgICAgfQotICAgIHRyYW5zXy53cml0ZShpMzJidWYsIDAsIGlkeCk7CisgICAgdHJhbnNfLndyaXRlKHRlbXAsIDAsIGlkeCk7CiAgIH0KIAogICAvKioKICAgICogV3JpdGUgYW4gaTY0IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIHdpcmUuCiAgICAqLwotICBieXRlW10gdmFyaW50NjRvdXQgPSBuZXcgYnl0ZVsxMF07CiAgIHByaXZhdGUgdm9pZCB3cml0ZVZhcmludDY0KGxvbmcgbikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBpZHggPSAwOwogICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICBpZiAoKG4gJiB+MHg3RkwpID09IDApIHsKLSAgICAgICAgdmFyaW50NjRvdXRbaWR4KytdID0gKGJ5dGUpbjsKKyAgICAgICAgdGVtcFtpZHgrK10gPSAoYnl0ZSluOwogICAgICAgICBicmVhazsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhcmludDY0b3V0W2lkeCsrXSA9ICgoYnl0ZSkoKG4gJiAweDdGKSB8IDB4ODApKTsKKyAgICAgICAgdGVtcFtpZHgrK10gPSAoKGJ5dGUpKChuICYgMHg3RikgfCAweDgwKSk7CiAgICAgICAgIG4gPj4+PSA3OwogICAgICAgfQogICAgIH0KLSAgICB0cmFuc18ud3JpdGUodmFyaW50NjRvdXQsIDAsIGlkeCk7CisgICAgdHJhbnNfLndyaXRlKHRlbXAsIDAsIGlkeCk7CiAgIH0KIAogICAvKioKLSAgICogQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZSAKKyAgICogQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQogICAgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCiAgICAqLwogICBwcml2YXRlIGxvbmcgbG9uZ1RvWmlnemFnKGxvbmcgbCkgewpAQCAtMzkyLDcgKzQ1Myw3IEBACiAgIH0KIAogICAvKioKLSAgICogQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlIAorICAgKiBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBpbnQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKICAgICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgogICAgKi8KICAgcHJpdmF0ZSBpbnQgaW50VG9aaWdaYWcoaW50IG4pIHsKQEAgLTQwMCw3ICs0NjEsNyBAQAogICB9CiAKICAgLyoqCi0gICAqIENvbnZlcnQgYSBsb25nIGludG8gbGl0dGxlLWVuZGlhbiBieXRlcyBpbiBidWYgc3RhcnRpbmcgYXQgb2ZmIGFuZCBnb2luZyAKKyAgICogQ29udmVydCBhIGxvbmcgaW50byBsaXR0bGUtZW5kaWFuIGJ5dGVzIGluIGJ1ZiBzdGFydGluZyBhdCBvZmYgYW5kIGdvaW5nCiAgICAqIHVudGlsIG9mZis3LgogICAgKi8KICAgcHJpdmF0ZSB2b2lkIGZpeGVkTG9uZ1RvQnl0ZXMobG9uZyBuLCBieXRlW10gYnVmLCBpbnQgb2ZmKSB7CkBAIC00MTQsMTcgKzQ3NSwxNiBAQAogICAgIGJ1ZltvZmYrN10gPSAoYnl0ZSkoKG4gPj4gNTYpICYgMHhmZik7CiAgIH0KIAotICAvKiogCi0gICAqIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLiAKKyAgLyoqCisgICAqIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgogICAgKiBVc2VkIGludGVybmFsbHkgYnkgb3RoZXIgd3JpdGluZyBtZXRob2RzIHRoYXQga25vdyB0aGV5IG5lZWQgdG8gd3JpdGUgYSBieXRlLgogICAgKi8KLSAgcHJpdmF0ZSBieXRlW10gYnl0ZURpcmVjdEJ1ZmZlciA9IG5ldyBieXRlWzFdOwogICBwcml2YXRlIHZvaWQgd3JpdGVCeXRlRGlyZWN0KGJ5dGUgYikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJ5dGVEaXJlY3RCdWZmZXJbMF0gPSBiOwotICAgIHRyYW5zXy53cml0ZShieXRlRGlyZWN0QnVmZmVyKTsKKyAgICB0ZW1wWzBdID0gYjsKKyAgICB0cmFuc18ud3JpdGUodGVtcCwgMCwgMSk7CiAgIH0KIAotICAvKiogCisgIC8qKgogICAgKiBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KICAgICovCiAgIHByaXZhdGUgdm9pZCB3cml0ZUJ5dGVEaXJlY3QoaW50IG4pIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTQzMiwxMiArNDkyLDEyIEBACiAgIH0KIAogCi0gIC8vIAorICAvLwogICAvLyBSZWFkaW5nIG1ldGhvZHMuCi0gIC8vIAorICAvLwogCiAgIC8qKgotICAgKiBSZWFkIGEgbWVzc2FnZSBoZWFkZXIuIAorICAgKiBSZWFkIGEgbWVzc2FnZSBoZWFkZXIuCiAgICAqLwogICBwdWJsaWMgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBieXRlIHByb3RvY29sSWQgPSByZWFkQnl0ZSgpOwpAQCAtNDQ5LDcgKzUwOSw3IEBACiAgICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTikgewogICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiRXhwZWN0ZWQgdmVyc2lvbiAiICsgVkVSU0lPTiArICIgYnV0IGdvdCAiICsgdmVyc2lvbik7CiAgICAgfQotICAgIGJ5dGUgdHlwZSA9IChieXRlKSgodmVyc2lvbkFuZFR5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgMHgwMyk7CisgICAgYnl0ZSB0eXBlID0gKGJ5dGUpKCh2ZXJzaW9uQW5kVHlwZSA+PiBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX0JJVFMpOwogICAgIGludCBzZXFpZCA9IHJlYWRWYXJpbnQzMigpOwogICAgIFN0cmluZyBtZXNzYWdlTmFtZSA9IHJlYWRTdHJpbmcoKTsKICAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG1lc3NhZ2VOYW1lLCB0eXBlLCBzZXFpZCk7CkBAIC00NjYsMTYgKzUyNiwxNiBAQAogICB9CiAKICAgLyoqCi0gICAqIERvZXNuJ3QgYWN0dWFsbHkgY29uc3VtZSBhbnkgd2lyZSBkYXRhLCBqdXN0IHJlbW92ZXMgdGhlIGxhc3QgZmllbGQgZm9yIAorICAgKiBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvcgogICAgKiB0aGlzIHN0cnVjdCBmcm9tIHRoZSBmaWVsZCBzdGFjay4KICAgICovCiAgIHB1YmxpYyB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gY29uc3VtZSB0aGUgbGFzdCBmaWVsZCB3ZSByZWFkIG9mZiB0aGUgd2lyZS4KICAgICBsYXN0RmllbGRJZF8gPSBsYXN0RmllbGRfLnBvcCgpOwogICB9Ci0gIAorCiAgIC8qKgotICAgKiBSZWFkIGEgZmllbGQgaGVhZGVyIG9mZiB0aGUgd2lyZS4gCisgICAqIFJlYWQgYSBmaWVsZCBoZWFkZXIgb2ZmIHRoZSB3aXJlLgogICAgKi8KICAgcHVibGljIFRGaWVsZCByZWFkRmllbGRCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBieXRlIHR5cGUgPSByZWFkQnl0ZSgpOwpAQCAtNTAzLDI2ICs1NjMsMjcgQEAKICAgICBpZiAoaXNCb29sVHlwZSh0eXBlKSkgewogICAgICAgLy8gc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBpbiBhIHNwZWNpYWwgaW5zdGFuY2UgdmFyaWFibGUuCiAgICAgICBib29sVmFsdWVfID0gKGJ5dGUpKHR5cGUgJiAweDBmKSA9PSBUeXBlcy5CT09MRUFOX1RSVUUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgIH0gCisgICAgfQogCiAgICAgLy8gcHVzaCB0aGUgbmV3IGZpZWxkIG9udG8gdGhlIGZpZWxkIHN0YWNrIHNvIHdlIGNhbiBrZWVwIHRoZSBkZWx0YXMgZ29pbmcuCiAgICAgbGFzdEZpZWxkSWRfID0gZmllbGQuaWQ7CiAgICAgcmV0dXJuIGZpZWxkOwogICB9CiAKLSAgLyoqIAorICAvKioKICAgICogUmVhZCBhIG1hcCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2l6ZSBpcyB6ZXJvLCBza2lwIHJlYWRpbmcgdGhlIGtleQogICAgKiBhbmQgdmFsdWUgdHlwZS4gVGhpcyBtZWFucyB0aGF0IDAtbGVuZ3RoIG1hcHMgd2lsbCB5aWVsZCBUTWFwcyB3aXRob3V0IHRoZQogICAgKiAiY29ycmVjdCIgdHlwZXMuCiAgICAqLwogICBwdWJsaWMgVE1hcCByZWFkTWFwQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IHNpemUgPSByZWFkVmFyaW50MzIoKTsKKyAgICBjaGVja0NvbnRhaW5lclJlYWRMZW5ndGgoc2l6ZSk7CiAgICAgYnl0ZSBrZXlBbmRWYWx1ZVR5cGUgPSBzaXplID09IDAgPyAwIDogcmVhZEJ5dGUoKTsKICAgICByZXR1cm4gbmV3IFRNYXAoZ2V0VFR5cGUoKGJ5dGUpKGtleUFuZFZhbHVlVHlwZSA+PiA0KSksIGdldFRUeXBlKChieXRlKShrZXlBbmRWYWx1ZVR5cGUgJiAweGYpKSwgc2l6ZSk7CiAgIH0KIAogICAvKioKLSAgICogUmVhZCBhIGxpc3QgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIGxpc3Qgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsIAorICAgKiBSZWFkIGEgbGlzdCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgbGlzdCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKICAgICogYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgbGlzdCwgdGhlIDQgTVNCCiAgICAqIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKICAgICogdHJ1ZSBzaXplLgpAQCAtNTMzLDEyICs1OTQsMTMgQEAKICAgICBpZiAoc2l6ZSA9PSAxNSkgewogICAgICAgc2l6ZSA9IHJlYWRWYXJpbnQzMigpOwogICAgIH0KKyAgICBjaGVja0NvbnRhaW5lclJlYWRMZW5ndGgoc2l6ZSk7CiAgICAgYnl0ZSB0eXBlID0gZ2V0VFR5cGUoc2l6ZV9hbmRfdHlwZSk7CiAgICAgcmV0dXJuIG5ldyBUTGlzdCh0eXBlLCBzaXplKTsKICAgfQogCiAgIC8qKgotICAgKiBSZWFkIGEgc2V0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzZXQgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsIAorICAgKiBSZWFkIGEgc2V0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzZXQgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCiAgICAqIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIHNldCwgdGhlIDQgTVNCCiAgICAqIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKICAgICogdHJ1ZSBzaXplLgpAQCAtNTYxLDcgKzYyMyw2IEBACiAgICAgcmV0dXJuIHJlYWRCeXRlKCkgPT0gVHlwZXMuQk9PTEVBTl9UUlVFOwogICB9CiAKLSAgYnl0ZVtdIGJ5dGVSYXdCdWYgPSBuZXcgYnl0ZVsxXTsKICAgLyoqCiAgICAqIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KICAgICovCkBAIC01NzEsOCArNjMyLDggQEAKICAgICAgIGIgPSB0cmFuc18uZ2V0QnVmZmVyKClbdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCldOwogICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIoMSk7CiAgICAgfSBlbHNlIHsKLSAgICAgIHRyYW5zXy5yZWFkQWxsKGJ5dGVSYXdCdWYsIDAsIDEpOwotICAgICAgYiA9IGJ5dGVSYXdCdWZbMF07CisgICAgICB0cmFuc18ucmVhZEFsbCh0ZW1wLCAwLCAxKTsKKyAgICAgIGIgPSB0ZW1wWzBdOwogICAgIH0KICAgICByZXR1cm4gYjsKICAgfQpAQCAtNjAyLDkgKzY2Myw4IEBACiAgICAqIE5vIG1hZ2ljIGhlcmUgLSBqdXN0IHJlYWQgYSBkb3VibGUgb2ZmIHRoZSB3aXJlLgogICAgKi8KICAgcHVibGljIGRvdWJsZSByZWFkRG91YmxlKCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJ5dGVbXSBsb25nQml0cyA9IG5ldyBieXRlWzhdOwotICAgIHRyYW5zXy5yZWFkQWxsKGxvbmdCaXRzLCAwLCA4KTsKLSAgICByZXR1cm4gRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUoYnl0ZXNUb0xvbmcobG9uZ0JpdHMpKTsKKyAgICB0cmFuc18ucmVhZEFsbCh0ZW1wLCAwLCA4KTsKKyAgICByZXR1cm4gRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUoYnl0ZXNUb0xvbmcodGVtcCkpOwogICB9CiAKICAgLyoqCkBAIC02MTIsMzAgKzY3MiwzNiBAQAogICAgKi8KICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBsZW5ndGggPSByZWFkVmFyaW50MzIoKTsKKyAgICBjaGVja1N0cmluZ1JlYWRMZW5ndGgobGVuZ3RoKTsKIAogICAgIGlmIChsZW5ndGggPT0gMCkgewogICAgICAgcmV0dXJuICIiOwogICAgIH0KIAotICAgIHRyeSB7Ci0gICAgICBpZiAodHJhbnNfLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSA+PSBsZW5ndGgpIHsKLSAgICAgICAgU3RyaW5nIHN0ciA9IG5ldyBTdHJpbmcodHJhbnNfLmdldEJ1ZmZlcigpLCB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKSwgbGVuZ3RoLCAiVVRGLTgiKTsKLSAgICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIobGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHN0cjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKHJlYWRCaW5hcnkobGVuZ3RoKSwgIlVURi04Iik7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiVVRGLTggbm90IHN1cHBvcnRlZCEiKTsKKyAgICBmaW5hbCBTdHJpbmcgc3RyOworICAgIGlmICh0cmFuc18uZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpID49IGxlbmd0aCkgeworICAgICAgc3RyID0gbmV3IFN0cmluZyh0cmFuc18uZ2V0QnVmZmVyKCksIHRyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpLAorICAgICAgICAgIGxlbmd0aCwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcihsZW5ndGgpOworICAgIH0gZWxzZSB7CisgICAgICBzdHIgPSBuZXcgU3RyaW5nKHJlYWRCaW5hcnkobGVuZ3RoKSwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgICAgfQorICAgIHJldHVybiBzdHI7CiAgIH0KIAogICAvKioKLSAgICogUmVhZCBhIGJ5dGVbXSBmcm9tIHRoZSB3aXJlLiAKKyAgICogUmVhZCBhIGJ5dGVbXSBmcm9tIHRoZSB3aXJlLgogICAgKi8KICAgcHVibGljIEJ5dGVCdWZmZXIgcmVhZEJpbmFyeSgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbnQgbGVuZ3RoID0gcmVhZFZhcmludDMyKCk7Ci0gICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlWzBdKTsKKyAgICBjaGVja1N0cmluZ1JlYWRMZW5ndGgobGVuZ3RoKTsKKyAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBFTVBUWV9CVUZGRVI7CisKKyAgICBpZiAodHJhbnNfLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSA+PSBsZW5ndGgpIHsKKyAgICAgIEJ5dGVCdWZmZXIgYmIgPSBCeXRlQnVmZmVyLndyYXAodHJhbnNfLmdldEJ1ZmZlcigpLCB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKSwgbGVuZ3RoKTsKKyAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKGxlbmd0aCk7CisgICAgICByZXR1cm4gYmI7CisgICAgfQogCiAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW2xlbmd0aF07CiAgICAgdHJhbnNfLnJlYWRBbGwoYnVmLCAwLCBsZW5ndGgpOwpAQCAtNjQzLDE4ICs3MDksNDAgQEAKICAgfQogCiAgIC8qKgotICAgKiBSZWFkIGEgYnl0ZVtdIG9mIGEga25vd24gbGVuZ3RoIGZyb20gdGhlIHdpcmUuIAorICAgKiBSZWFkIGEgYnl0ZVtdIG9mIGEga25vd24gbGVuZ3RoIGZyb20gdGhlIHdpcmUuCiAgICAqLwogICBwcml2YXRlIGJ5dGVbXSByZWFkQmluYXJ5KGludCBsZW5ndGgpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBuZXcgYnl0ZVswXTsKKyAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBFTVBUWV9CWVRFUzsKIAogICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtsZW5ndGhdOwogICAgIHRyYW5zXy5yZWFkQWxsKGJ1ZiwgMCwgbGVuZ3RoKTsKICAgICByZXR1cm4gYnVmOwogICB9CiAKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrU3RyaW5nUmVhZExlbmd0aChpbnQgbGVuZ3RoKSB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICBpZiAobGVuZ3RoIDwgMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZ2F0aXZlIGxlbmd0aDogIiArIGxlbmd0aCk7CisgICAgfQorICAgIGlmIChzdHJpbmdMZW5ndGhMaW1pdF8gIT0gTk9fTEVOR1RIX0xJTUlUICYmIGxlbmd0aCA+IHN0cmluZ0xlbmd0aExpbWl0XykgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlbmd0aCBleGNlZWRlZCBtYXggYWxsb3dlZDogIiArIGxlbmd0aCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrQ29udGFpbmVyUmVhZExlbmd0aChpbnQgbGVuZ3RoKSB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICBpZiAobGVuZ3RoIDwgMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZ2F0aXZlIGxlbmd0aDogIiArIGxlbmd0aCk7CisgICAgfQorICAgIGlmIChjb250YWluZXJMZW5ndGhMaW1pdF8gIT0gTk9fTEVOR1RIX0xJTUlUICYmIGxlbmd0aCA+IGNvbnRhaW5lckxlbmd0aExpbWl0XykgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlbmd0aCBleGNlZWRlZCBtYXggYWxsb3dlZDogIiArIGxlbmd0aCk7CisgICAgfQorICB9CisKICAgLy8KLSAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgaGVyZSBmb3IgdGhlIHN0cnVjdCB0byBjYWxsLCBidXQgZG9uJ3QgaGF2ZSBhbnkgd2lyZSAKKyAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgaGVyZSBmb3IgdGhlIHN0cnVjdCB0byBjYWxsLCBidXQgZG9uJ3QgaGF2ZSBhbnkgd2lyZQogICAvLyBlbmNvZGluZy4KICAgLy8KICAgcHVibGljIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQpAQCAtNjk4LDcgKzc4Niw3IEBACiAgIH0KIAogICAvKioKLSAgICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldCAKKyAgICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAogICAgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDEwIGJ5dGVzLgogICAgKi8KICAgcHJpdmF0ZSBsb25nIHJlYWRWYXJpbnQ2NCgpIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTczOCw3ICs4MjYsNyBAQAogICAgIHJldHVybiAobiA+Pj4gMSkgXiAtKG4gJiAxKTsKICAgfQogCi0gIC8qKiAKKyAgLyoqCiAgICAqIENvbnZlcnQgZnJvbSB6aWd6YWcgbG9uZyB0byBsb25nLgogICAgKi8KICAgcHJpdmF0ZSBsb25nIHppZ3phZ1RvTG9uZyhsb25nIG4pIHsKQEAgLTc0Niw3ICs4MzQsNyBAQAogICB9CiAKICAgLyoqCi0gICAqIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBsb25nIGxpdGVyYWxzLCAKKyAgICogTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG1hc2sgYnl0ZXMgYXJlIGxvbmcgbGl0ZXJhbHMsCiAgICAqIG90aGVyd2lzZSB0aGV5J2xsIGRlZmF1bHQgdG8gaW50cywgYW5kIHdoZW4geW91IHNoaWZ0IGFuIGludCBsZWZ0IDU2IGJpdHMsCiAgICAqIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBpbnQuCiAgICAqLwpAQCAtNzcyLDcgKzg2MCw3IEBACiAgIH0KIAogICAvKioKLSAgICogR2l2ZW4gYSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nIAorICAgKiBHaXZlbiBhIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQsIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcKICAgICogVFR5cGUgdmFsdWUuCiAgICAqLwogICBwcml2YXRlIGJ5dGUgZ2V0VFR5cGUoYnl0ZSB0eXBlKSB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9URmllbGQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9URmllbGQuamF2YQppbmRleCAwM2FmZmRhLi4zMTMzMWJiIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEZpZWxkLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RGaWVsZC5qYXZhCkBAIC00Miw3ICs0MiwyNSBAQAogICAgIHJldHVybiAiPFRGaWVsZCBuYW1lOiciICsgbmFtZSArICInIHR5cGU6IiArIHR5cGUgKyAiIGZpZWxkLWlkOiIgKyBpZCArICI+IjsKICAgfQogCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhURmllbGQgb3RoZXJGaWVsZCkgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICBmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKyAgICBpbnQgcmVzdWx0ID0gMTsKKyAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIGlkOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChuYW1lID09IG51bGwpID8gMCA6IG5hbWUuaGFzaENvZGUoKSk7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyB0eXBlOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICBpZiAodGhpcyA9PSBvYmopCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAob2JqID09IG51bGwpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgVEZpZWxkIG90aGVyRmllbGQgPSAoVEZpZWxkKSBvYmo7CiAgICAgcmV0dXJuIHR5cGUgPT0gb3RoZXJGaWVsZC50eXBlICYmIGlkID09IG90aGVyRmllbGQuaWQ7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhCmluZGV4IDEwYWY1YzcuLmQzN2M0OTMgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuamF2YQpAQCAtMTksOCArMTksMTAgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKIAotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlN0YWNrOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKQEAgLTQyLDkgKzQ0LDE2IEBACiAgICAqIEZhY3RvcnkgZm9yIEpTT04gcHJvdG9jb2wgb2JqZWN0cwogICAgKi8KICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZmllbGROYW1lc0FzU3RyaW5nXyA9IGZhbHNlOworCisgICAgcHVibGljIEZhY3RvcnkoKSB7fQorCisgICAgcHVibGljIEZhY3RvcnkoYm9vbGVhbiBmaWVsZE5hbWVzQXNTdHJpbmcpIHsKKyAgICAgIGZpZWxkTmFtZXNBc1N0cmluZ18gPSBmaWVsZE5hbWVzQXNTdHJpbmc7CisgICAgfQogCiAgICAgcHVibGljIFRQcm90b2NvbCBnZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKSB7Ci0gICAgICByZXR1cm4gbmV3IFRKU09OUHJvdG9jb2wodHJhbnMpOworICAgICAgcmV0dXJuIG5ldyBUSlNPTlByb3RvY29sKHRyYW5zLCBmaWVsZE5hbWVzQXNTdHJpbmdfKTsKICAgICB9CiAKICAgfQpAQCAtNzAsMTAgKzc5LDEwIEBACiAgICAgMSwgIDEsJyInLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgLy8gMgogICB9OwogCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFU0NBUEVfQ0hBUlMgPSAiXCJcXGJmbnJ0IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVTQ0FQRV9DSEFSUyA9ICJcIlxcL2JmbnJ0IjsKIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gRVNDQVBFX0NIQVJfVkFMUyA9IHsKLSAgICAnIicsICdcXCcsICdcYicsICdcZicsICdcbicsICdccicsICdcdCcsCisgICAgJyInLCAnXFwnLCAnLycsICdcYicsICdcZicsICdcbicsICdccicsICdcdCcsCiAgIH07CiAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICBERUZfU1RSSU5HX1NJWkUgPSAxNjsKQEAgLTI4NSw2ICsyOTQsOSBAQAogICAvLyBSZWFkZXIgdGhhdCBtYW5hZ2VzIGEgMS1ieXRlIGJ1ZmZlcgogICBwcml2YXRlIExvb2thaGVhZFJlYWRlciByZWFkZXJfID0gbmV3IExvb2thaGVhZFJlYWRlcigpOwogCisgIC8vIFdyaXRlIG91dCB0aGUgVEZpZWxkIG5hbWVzIGFzIGEgc3RyaW5nIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgaW50ZWdlciB2YWx1ZQorICBwcml2YXRlIGJvb2xlYW4gZmllbGROYW1lc0FzU3RyaW5nXyA9IGZhbHNlOworCiAgIC8vIFB1c2ggYSBuZXcgSlNPTiBjb250ZXh0IG9udG8gdGhlIHN0YWNrLgogICBwcml2YXRlIHZvaWQgcHVzaENvbnRleHQoSlNPTkJhc2VDb250ZXh0IGMpIHsKICAgICBjb250ZXh0U3RhY2tfLnB1c2goY29udGV4dF8pOwpAQCAtMjk2LDYgKzMwOCwxMyBAQAogICAgIGNvbnRleHRfID0gY29udGV4dFN0YWNrXy5wb3AoKTsKICAgfQogCisgIC8vIFJlc2V0IHRoZSBjb250ZXh0IHN0YWNrIHRvIGl0cyBpbml0aWFsIHN0YXRlCisgIHByaXZhdGUgdm9pZCByZXNldENvbnRleHQoKSB7CisgICAgd2hpbGUgKCFjb250ZXh0U3RhY2tfLmlzRW1wdHkoKSkgeworICAgICAgcG9wQ29udGV4dCgpOworICAgIH0KKyAgfQorCiAgIC8qKgogICAgKiBDb25zdHJ1Y3RvcgogICAgKi8KQEAgLTMwMyw2ICszMjIsMTEgQEAKICAgICBzdXBlcih0cmFucyk7CiAgIH0KIAorICBwdWJsaWMgVEpTT05Qcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zLCBib29sZWFuIGZpZWxkTmFtZXNBc1N0cmluZykgeworICAgIHN1cGVyKHRyYW5zKTsKKyAgICBmaWVsZE5hbWVzQXNTdHJpbmdfID0gZmllbGROYW1lc0FzU3RyaW5nOworICB9CisKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewogICAgIGNvbnRleHRTdGFja18uY2xlYXIoKTsKQEAgLTMzMSw3ICszNTUsNyBAQAogICAgICAgcmV0dXJuIChieXRlKSgoY2hhciljaCAtICcwJyk7CiAgICAgfQogICAgIGVsc2UgaWYgKChjaCA+PSAnYScpICYmIChjaCA8PSAnZicpKSB7Ci0gICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKWNoIC0gJ2EnKTsKKyAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpY2ggLSAnYScgKyAxMCk7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLApAQCAtMzQ2LDcgKzM3MCw3IEBACiAgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKXZhbCArICcwJyk7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgcmV0dXJuIChieXRlKSgoY2hhcil2YWwgKyAnYScpOworICAgICAgcmV0dXJuIChieXRlKSgoY2hhcikodmFsIC0gMTApICsgJ2EnKTsKICAgICB9CiAgIH0KIApAQCAtMzk0LDEyICs0MTgsOCBAQAogICAgIGlmIChlc2NhcGVOdW0pIHsKICAgICAgIHRyYW5zXy53cml0ZShRVU9URSk7CiAgICAgfQotICAgIHRyeSB7Ci0gICAgICBieXRlW10gYnVmID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgdHJhbnNfLndyaXRlKGJ1Zik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICBieXRlW10gYnVmID0gc3RyLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgIHRyYW5zXy53cml0ZShidWYpOwogICAgIGlmIChlc2NhcGVOdW0pIHsKICAgICAgIHRyYW5zXy53cml0ZShRVU9URSk7CiAgICAgfQpAQCAtNDIxLDE4ICs0NDEsMTYgQEAKICAgICAgICAgc3BlY2lhbCA9IHRydWU7CiAgICAgICB9CiAgICAgICBicmVhazsKLSAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CiAKICAgICBib29sZWFuIGVzY2FwZU51bSA9IHNwZWNpYWwgfHwgY29udGV4dF8uZXNjYXBlTnVtKCk7CiAgICAgaWYgKGVzY2FwZU51bSkgewogICAgICAgdHJhbnNfLndyaXRlKFFVT1RFKTsKICAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBiID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgdHJhbnNfLndyaXRlKGIsIDAsIGIubGVuZ3RoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIGJ5dGVbXSBiID0gc3RyLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgIHRyYW5zXy53cml0ZShiLCAwLCBiLmxlbmd0aCk7CiAgICAgaWYgKGVzY2FwZU51bSkgewogICAgICAgdHJhbnNfLndyaXRlKFFVT1RFKTsKICAgICB9CkBAIC00ODQsMTQgKzUwMiwxMSBAQAogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVzZXRDb250ZXh0KCk7IC8vIFRIUklGVC0zNzQzCiAgICAgd3JpdGVKU09OQXJyYXlTdGFydCgpOwogICAgIHdyaXRlSlNPTkludGVnZXIoVkVSU0lPTik7Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBiID0gbWVzc2FnZS5uYW1lLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgd3JpdGVKU09OU3RyaW5nKGIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgYnl0ZVtdIGIgPSBtZXNzYWdlLm5hbWUuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgd3JpdGVKU09OU3RyaW5nKGIpOwogICAgIHdyaXRlSlNPTkludGVnZXIobWVzc2FnZS50eXBlKTsKICAgICB3cml0ZUpTT05JbnRlZ2VyKG1lc3NhZ2Uuc2VxaWQpOwogICB9CkBAIC01MTMsNyArNTI4LDExIEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB3cml0ZUpTT05JbnRlZ2VyKGZpZWxkLmlkKTsKKyAgICBpZiAoZmllbGROYW1lc0FzU3RyaW5nXykgeworICAgICAgd3JpdGVTdHJpbmcoZmllbGQubmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlSlNPTkludGVnZXIoZmllbGQuaWQpOworICAgIH0KICAgICB3cml0ZUpTT05PYmplY3RTdGFydCgpOwogICAgIHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRChmaWVsZC50eXBlKSk7CiAgIH0KQEAgLTU5NywxMiArNjE2LDggQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICBieXRlW10gYiA9IHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHdyaXRlSlNPTlN0cmluZyhiKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIGJ5dGVbXSBiID0gc3RyLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgIHdyaXRlSlNPTlN0cmluZyhiKTsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtNjE5LDYgKzYzNCw3IEBACiAgIHByaXZhdGUgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSByZWFkSlNPTlN0cmluZyhib29sZWFuIHNraXBDb250ZXh0KQogICAgIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFyciA9IG5ldyBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtKERFRl9TVFJJTkdfU0laRSk7CisgICAgQXJyYXlMaXN0PENoYXJhY3Rlcj4gY29kZXVuaXRzID0gbmV3IEFycmF5TGlzdDxDaGFyYWN0ZXI+KCk7CiAgICAgaWYgKCFza2lwQ29udGV4dCkgewogICAgICAgY29udGV4dF8ucmVhZCgpOwogICAgIH0KQEAgLTYzMSwxMCArNjQ3LDQxIEBACiAgICAgICBpZiAoY2ggPT0gRVNDU0VRWzBdKSB7CiAgICAgICAgIGNoID0gcmVhZGVyXy5yZWFkKCk7CiAgICAgICAgIGlmIChjaCA9PSBFU0NTRVFbMV0pIHsKLSAgICAgICAgICByZWFkSlNPTlN5bnRheENoYXIoWkVSTyk7Ci0gICAgICAgICAgcmVhZEpTT05TeW50YXhDaGFyKFpFUk8pOwotICAgICAgICAgIHRyYW5zXy5yZWFkQWxsKHRtcGJ1Zl8sIDAsIDIpOwotICAgICAgICAgIGNoID0gKGJ5dGUpKChoZXhWYWwoKGJ5dGUpdG1wYnVmX1swXSkgPDwgNCkgKyBoZXhWYWwodG1wYnVmX1sxXSkpOworICAgICAgICAgIHRyYW5zXy5yZWFkQWxsKHRtcGJ1Zl8sIDAsIDQpOworICAgICAgICAgIHNob3J0IGN1ID0gKHNob3J0KSgKKyAgICAgICAgICAgICAgKChzaG9ydCloZXhWYWwodG1wYnVmX1swXSkgPDwgMTIpICsKKyAgICAgICAgICAgICAgKChzaG9ydCloZXhWYWwodG1wYnVmX1sxXSkgPDwgOCkgKworICAgICAgICAgICAgICAoKHNob3J0KWhleFZhbCh0bXBidWZfWzJdKSA8PCA0KSArCisgICAgICAgICAgICAgIChzaG9ydCloZXhWYWwodG1wYnVmX1szXSkpOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzSGlnaFN1cnJvZ2F0ZSgoY2hhciljdSkpIHsKKyAgICAgICAgICAgICAgaWYgKGNvZGV1bml0cy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY29kZXVuaXRzLmFkZCgoY2hhciljdSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChDaGFyYWN0ZXIuaXNMb3dTdXJyb2dhdGUoKGNoYXIpY3UpKSB7CisgICAgICAgICAgICAgIGlmIChjb2RldW5pdHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBoaWdoIHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjb2RldW5pdHMuYWRkKChjaGFyKWN1KTsKKyAgICAgICAgICAgICAgYXJyLndyaXRlKAorICAgICAgICAgICAgICAgICAgKG5ldyBTdHJpbmcobmV3IGludFtdIHsgY29kZXVuaXRzLmdldCgwKSwgY29kZXVuaXRzLmdldCgxKSB9LAorICAgICAgICAgICAgICAgICAgICAgIDAsIDIpKS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CisgICAgICAgICAgICAgIGNvZGV1bml0cy5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIGFyci53cml0ZSgobmV3IFN0cmluZyhuZXcgaW50W10geyBjdSB9LCAwLCAxKSkKKyAgICAgICAgICAgICAgICAgIC5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICJJbnZhbGlkIHVuaWNvZGUgc2VxdWVuY2UiKTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgaW50IG9mZiA9IEVTQ0FQRV9DSEFSUy5pbmRleE9mKGNoKTsKQEAgLTcxMiwxOSArNzU5LDE0IEBACiAgICAgY29udGV4dF8ucmVhZCgpOwogICAgIGlmIChyZWFkZXJfLnBlZWsoKSA9PSBRVU9URVswXSkgewogICAgICAgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhcnIgPSByZWFkSlNPTlN0cmluZyh0cnVlKTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGRvdWJsZSBkdWIgPSBEb3VibGUudmFsdWVPZihhcnIudG9TdHJpbmcoIlVURi04IikpOwotICAgICAgICBpZiAoIWNvbnRleHRfLmVzY2FwZU51bSgpICYmICFEb3VibGUuaXNOYU4oZHViKSAmJgotICAgICAgICAgICAgIURvdWJsZS5pc0luZmluaXRlKGR1YikpIHsKLSAgICAgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiB0aGlzIGNhc2UKLSAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZHViOworICAgICAgZG91YmxlIGR1YiA9IERvdWJsZS52YWx1ZU9mKGFyci50b1N0cmluZyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CisgICAgICBpZiAoIWNvbnRleHRfLmVzY2FwZU51bSgpICYmICFEb3VibGUuaXNOYU4oZHViKQorICAgICAgICAgICYmICFEb3VibGUuaXNJbmZpbml0ZShkdWIpKSB7CisgICAgICAgIC8vIFRocm93IGV4Y2VwdGlvbiAtLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluIHRoaXMgY2FzZQorICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQiKTsKICAgICAgIH0KLSAgICAgIGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgICAgfQorICAgICAgcmV0dXJuIGR1YjsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICBpZiAoY29udGV4dF8uZXNjYXBlTnVtKCkpIHsKQEAgLTc0OCw2ICs3OTAsMTEgQEAKICAgICBpbnQgbGVuID0gYXJyLmxlbigpOwogICAgIGludCBvZmYgPSAwOwogICAgIGludCBzaXplID0gMDsKKyAgICAvLyBJZ25vcmUgcGFkZGluZworICAgIGludCBib3VuZCA9IGxlbiA+PSAyID8gbGVuIC0gMiA6IDA7CisgICAgZm9yIChpbnQgaSA9IGxlbiAtIDE7IGkgPj0gYm91bmQgJiYgYltpXSA9PSAnPSc7IC0taSkgeworICAgICAgLS1sZW47CisgICAgfQogICAgIHdoaWxlIChsZW4gPj0gNCkgewogICAgICAgLy8gRGVjb2RlIDQgYnl0ZXMgYXQgYSB0aW1lCiAgICAgICBUQmFzZTY0VXRpbHMuZGVjb2RlKGIsIG9mZiwgNCwgYiwgc2l6ZSk7IC8vIE5COiBkZWNvZGVkIGluIHBsYWNlCkBAIC03OTIsMTggKzgzOSwxMyBAQAogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZXNldENvbnRleHQoKTsgLy8gVEhSSUZULTM3NDMKICAgICByZWFkSlNPTkFycmF5U3RhcnQoKTsKICAgICBpZiAocmVhZEpTT05JbnRlZ2VyKCkgIT0gVkVSU0lPTikgewogICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKTsKICAgICB9Ci0gICAgU3RyaW5nIG5hbWU7Ci0gICAgdHJ5IHsKLSAgICAgIG5hbWUgPSByZWFkSlNPTlN0cmluZyhmYWxzZSkudG9TdHJpbmcoIlVURi04Iik7Ci0gICAgfQotICAgIGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgU3RyaW5nIG5hbWUgPSByZWFkSlNPTlN0cmluZyhmYWxzZSkudG9TdHJpbmcoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgICAgYnl0ZSB0eXBlID0gKGJ5dGUpIHJlYWRKU09OSW50ZWdlcigpOwogICAgIGludCBzZXFpZCA9IChpbnQpIHJlYWRKU09OSW50ZWdlcigpOwogICAgIHJldHVybiBuZXcgVE1lc3NhZ2UobmFtZSwgdHlwZSwgc2VxaWQpOwpAQCAtOTIwLDEyICs5NjIsNyBAQAogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgU3RyaW5nIHJlYWRTdHJpbmcoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiByZWFkSlNPTlN0cmluZyhmYWxzZSkudG9TdHJpbmcoIlVURi04Iik7Ci0gICAgfQotICAgIGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgcmV0dXJuIHJlYWRKU09OU3RyaW5nKGZhbHNlKS50b1N0cmluZyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgfQogCiAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1lc3NhZ2UuamF2YQppbmRleCAxNDM4YjExLi5mMTNiOGNhIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1lc3NhZ2UuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1lc3NhZ2UuamF2YQpAQCAtNDQsMTQgKzQ0LDMzIEBACiAgIH0KIAogICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewotICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIFRNZXNzYWdlKSB7Ci0gICAgICByZXR1cm4gZXF1YWxzKChUTWVzc2FnZSkgb3RoZXIpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgZmluYWwgaW50IHByaW1lID0gMzE7CisgICAgaW50IHJlc3VsdCA9IDE7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKG5hbWUgPT0gbnVsbCkgPyAwIDogbmFtZS5oYXNoQ29kZSgpKTsKKyAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIHNlcWlkOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgdHlwZTsKKyAgICByZXR1cm4gcmVzdWx0OwogICB9CiAKLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFRNZXNzYWdlIG90aGVyKSB7Ci0gICAgcmV0dXJuIG5hbWUuZXF1YWxzKG90aGVyLm5hbWUpICYmIHR5cGUgPT0gb3RoZXIudHlwZSAmJiBzZXFpZCA9PSBvdGhlci5zZXFpZDsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgaWYgKHRoaXMgPT0gb2JqKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIFRNZXNzYWdlIG90aGVyID0gKFRNZXNzYWdlKSBvYmo7CisgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgaWYgKG90aGVyLm5hbWUgIT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoIW5hbWUuZXF1YWxzKG90aGVyLm5hbWUpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChzZXFpZCAhPSBvdGhlci5zZXFpZCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAodHlwZSAhPSBvdGhlci50eXBlKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYTU2NmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworCisvKioKKyAqIDxjb2RlPlRNdWx0aXBsZXhlZFByb3RvY29sPC9jb2RlPiBpcyBhIHByb3RvY29sLWluZGVwZW5kZW50IGNvbmNyZXRlIGRlY29yYXRvcgorICogdGhhdCBhbGxvd3MgYSBUaHJpZnQgY2xpZW50IHRvIGNvbW11bmljYXRlIHdpdGggYSBtdWx0aXBsZXhpbmcgVGhyaWZ0IHNlcnZlciwKKyAqIGJ5IHByZXBlbmRpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSBkdXJpbmcgZnVuY3Rpb24gY2FsbHMuCisgKgorICogPHA+Tk9URTogVEhJUyBJUyBOT1QgVVNFRCBCWSBTRVJWRVJTLiAgT24gdGhlIHNlcnZlciwgdXNlIHtAbGluayBvcmcuYXBhY2hlLnRocmlmdC5UTXVsdGlwbGV4ZWRQcm9jZXNzb3IgVE11bHRpcGxleGVkUHJvY2Vzc29yfSB0byBoYW5kbGUgcmVxdWVzdHMKKyAqIGZyb20gYSBtdWx0aXBsZXhpbmcgY2xpZW50LgorICoKKyAqIDxwPlRoaXMgZXhhbXBsZSB1c2VzIGEgc2luZ2xlIHNvY2tldCB0cmFuc3BvcnQgdG8gaW52b2tlIHR3byBzZXJ2aWNlczoKKyAqCisgKiA8cHJlPgorICoge0Bjb2RlCisgKiAgICAgVFNvY2tldCB0cmFuc3BvcnQgPSBuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCk7CisgKiAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKyAqCisgKiAgICAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICoKKyAqICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIkNhbGN1bGF0b3IiKTsKKyAqICAgICBDYWxjdWxhdG9yLkNsaWVudCBzZXJ2aWNlID0gbmV3IENhbGN1bGF0b3IuQ2xpZW50KG1wKTsKKyAqCisgKiAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAyID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiV2VhdGhlclJlcG9ydCIpOworICogICAgIFdlYXRoZXJSZXBvcnQuQ2xpZW50IHNlcnZpY2UyID0gbmV3IFdlYXRoZXJSZXBvcnQuQ2xpZW50KG1wMik7CisgKgorICogICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZXJ2aWNlLmFkZCgyLDIpKTsKKyAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZTIuZ2V0VGVtcGVyYXR1cmUoKSk7CisgKiB9CisgKiA8L3ByZT4KKyAqCisgKiBAc2VlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbERlY29yYXRvcgorICovCitwdWJsaWMgY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2xEZWNvcmF0b3IgeworCisgICAgLyoqIFVzZWQgdG8gZGVsaW1pdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIGZ1bmN0aW9uIG5hbWUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVBBUkFUT1IgPSAiOiI7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBTRVJWSUNFX05BTUU7CisKKyAgICAvKioKKyAgICAgKiBXcmFwIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wsIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBhCisgICAgICogbXVsdGlwbGV4aW5nIHNlcnZlci4gIFRoZSA8Y29kZT5zZXJ2aWNlTmFtZTwvY29kZT4gaXMgcmVxdWlyZWQgYXMgaXQgaXMKKyAgICAgKiBwcmVwZW5kZWQgdG8gdGhlIG1lc3NhZ2UgaGVhZGVyIHNvIHRoYXQgdGhlIG11bHRpcGxleGluZyBzZXJ2ZXIgY2FuIGJyb2tlcgorICAgICAqIHRoZSBmdW5jdGlvbiBjYWxsIHRvIHRoZSBwcm9wZXIgc2VydmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm90b2NvbCBZb3VyIGNvbW11bmljYXRpb24gcHJvdG9jb2wgb2YgY2hvaWNlLCBlLmcuIDxjb2RlPlRCaW5hcnlQcm90b2NvbDwvY29kZT4uCisgICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIFRoZSBzZXJ2aWNlIG5hbWUgb2YgdGhlIHNlcnZpY2UgY29tbXVuaWNhdGluZyB2aWEgdGhpcyBwcm90b2NvbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVE11bHRpcGxleGVkUHJvdG9jb2woVFByb3RvY29sIHByb3RvY29sLCBTdHJpbmcgc2VydmljZU5hbWUpIHsKKyAgICAgICAgc3VwZXIocHJvdG9jb2wpOworICAgICAgICBTRVJWSUNFX05BTUUgPSBzZXJ2aWNlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmVwZW5kcyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lLCBzZXBhcmF0ZWQgYnkgVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SLgorICAgICAqCisgICAgICogQHBhcmFtIHRNZXNzYWdlIFRoZSBvcmlnaW5hbCBtZXNzYWdlLgorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBQYXNzZWQgdGhyb3VnaCBmcm9tIHdyYXBwZWQgPGNvZGU+VFByb3RvY29sPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSB0TWVzc2FnZSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBpZiAodE1lc3NhZ2UudHlwZSA9PSBUTWVzc2FnZVR5cGUuQ0FMTCB8fCB0TWVzc2FnZS50eXBlID09IFRNZXNzYWdlVHlwZS5PTkVXQVkpIHsKKyAgICAgICAgICAgIHN1cGVyLndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgU0VSVklDRV9OQU1FICsgU0VQQVJBVE9SICsgdE1lc3NhZ2UubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdE1lc3NhZ2UudHlwZSwKKyAgICAgICAgICAgICAgICAgICAgdE1lc3NhZ2Uuc2VxaWQKKyAgICAgICAgICAgICkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VwZXIud3JpdGVNZXNzYWdlQmVnaW4odE1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5qYXZhCmluZGV4IDE2ZmFjNjQuLjBlOTYzNjggMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmphdmEKQEAgLTIyLDYgKzIyLDggQEAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuSVNjaGVtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU3RhbmRhcmRTY2hlbWU7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CiAKIC8qKgpAQCAtMTUwLDQgKzE1MiwxMSBAQAogICAgKiBiZSBpbXBsZW1lbnRlZCBmb3Igc3RhdGVmdWwgcHJvdG9jb2xzLgogICAgKi8KICAgcHVibGljIHZvaWQgcmVzZXQoKSB7fQorICAKKyAgLyoqCisgICAqIFNjaGVtZSBhY2Nlc3NvcgorICAgKi8KKyAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiBnZXRTY2hlbWUoKSB7CisgICAgcmV0dXJuIFN0YW5kYXJkU2NoZW1lLmNsYXNzOworICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyOWNkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuamF2YQpAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKKy8qKgorICogPGNvZGU+VFByb3RvY29sRGVjb3JhdG9yPC9jb2RlPiBmb3J3YXJkcyBhbGwgcmVxdWVzdHMgdG8gYW4gZW5jbG9zZWQKKyAqIDxjb2RlPlRQcm90b2NvbDwvY29kZT4gaW5zdGFuY2UsIHByb3ZpZGluZyBhIHdheSB0byBhdXRob3IgY29uY2lzZQorICogY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuICBXaGlsZSBpdCBoYXMgbm8gYWJzdHJhY3QgbWV0aG9kcywgaXQKKyAqIGlzIG1hcmtlZCBhYnN0cmFjdCBhcyBhIHJlbWluZGVyIHRoYXQgYnkgaXRzZWxmLCBpdCBkb2VzIG5vdCBtb2RpZnkKKyAqIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGVuY2xvc2VkIDxjb2RlPlRQcm90b2NvbDwvY29kZT4uCisgKgorICogPHA+U2VlIHAuMTc1IG9mIERlc2lnbiBQYXR0ZXJucyAoYnkgR2FtbWEgZXQgYWwuKTwvcD4KKyAqIAorICogQHNlZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yIGV4dGVuZHMgVFByb3RvY29sIHsKKworICAgIHByaXZhdGUgZmluYWwgVFByb3RvY29sIGNvbmNyZXRlUHJvdG9jb2w7CisKKyAgICAvKioKKyAgICAgKiBFbmNsb3NlcyB0aGUgc3BlY2lmaWVkIHByb3RvY29sLgorICAgICAqIEBwYXJhbSBwcm90b2NvbCBBbGwgb3BlcmF0aW9ucyB3aWxsIGJlIGZvcndhcmQgdG8gdGhpcyBwcm90b2NvbC4gIE11c3QgYmUgbm9uLW51bGwuCisgICAgICovCisgICAgcHVibGljIFRQcm90b2NvbERlY29yYXRvcihUUHJvdG9jb2wgcHJvdG9jb2wpIHsKKyAgICAgICAgc3VwZXIocHJvdG9jb2wuZ2V0VHJhbnNwb3J0KCkpOworICAgICAgICBjb25jcmV0ZVByb3RvY29sID0gcHJvdG9jb2w7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgdE1lc3NhZ2UpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbih0TWVzc2FnZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCB0U3RydWN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVTdHJ1Y3RCZWdpbih0U3RydWN0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZVN0cnVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgdEZpZWxkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVGaWVsZEJlZ2luKHRGaWVsZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVGaWVsZFN0b3AoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgdE1hcCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlTWFwQmVnaW4odE1hcCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVNYXBFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCB0TGlzdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlTGlzdEJlZ2luKHRMaXN0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVMaXN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHRTZXQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZVNldEJlZ2luKHRTZXQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlU2V0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlU2V0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVCb29sKGJvb2xlYW4gYikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlQm9vbChiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGUoYnl0ZSBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVCeXRlKGIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlSTE2KHNob3J0IGkpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZUkxNihpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUkzMihpbnQgaSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlSTMyKGkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlSTY0KGxvbmcgbCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlSTY0KGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSB2KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVEb3VibGUodik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHMpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZVN0cmluZyhzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUJpbmFyeShCeXRlQnVmZmVyIGJ1ZikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlQmluYXJ5KGJ1Zik7CisgICAgfQorCisgICAgcHVibGljIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVhZFN0cnVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC5yZWFkU3RydWN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIFRGaWVsZCByZWFkRmllbGRCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZEZpZWxkQmVnaW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWFkRmllbGRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wucmVhZEZpZWxkRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIFRNYXAgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkTWFwQmVnaW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWFkTWFwRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLnJlYWRNYXBFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVExpc3QgcmVhZExpc3RCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZExpc3RCZWdpbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLnJlYWRMaXN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIFRTZXQgcmVhZFNldEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkU2V0QmVnaW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWFkU2V0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLnJlYWRTZXRFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZWFkQm9vbCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZEJvb2woKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZSByZWFkQnl0ZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZEJ5dGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgcmVhZEkxNigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZEkxNigpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgcmVhZEkzMigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZEkzMigpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIHJlYWRJNjQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnJlYWRJNjQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIHJlYWREb3VibGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnJlYWREb3VibGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHJlYWRTdHJpbmcoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnJlYWRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciByZWFkQmluYXJ5KCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkQmluYXJ5KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5qYXZhCmluZGV4IDI0ODgxNWIuLjg3MGYxYjkgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmphdmEKQEAgLTM1LDYgKzM1LDcgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9MSU1JVCA9IDM7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBRF9WRVJTSU9OID0gNDsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX0lNUExFTUVOVEVEID0gNTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVQVEhfTElNSVQgPSA2OwogCiAgIHByb3RlY3RlZCBpbnQgdHlwZV8gPSBVTktOT1dOOwogCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuamF2YQppbmRleCA3NTI1MjBhLi5jZGFhMzBiIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmphdmEKQEAgLTE0MSw3ICsxNDEsOCBAQAogICAgICAgICBicmVhazsKIAogICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCB0eXBlICIgKyB0eXBlKTsKICAgICB9CiAgIH0KIApAQCAtMTUyLDcgKzE1Myw3IEBACiAgICAqIEluIHNvbWUgY2FzZXMsIG5vIGd1ZXNzIGNhbiBiZSBkb25lLCBpbiB0aGF0IGNhc2Ugd2UgcmV0dXJuIHRoZQogICAgKiBmYWxsYmFjayBUUHJvdG9jb2xGYWN0b3J5LgogICAgKiBUbyBiZSBjZXJ0YWluIHRvIGNvcnJlY3RseSBkZXRlY3QgdGhlIHByb3RvY29sLCB0aGUgZmlyc3QgZW5jb2RlZAotICAgKiBmaWVsZCBzaG91bGQgaGF2ZSBhIGZpZWxkIGlkIDwgMjU2CisgICAqIGZpZWxkIHNob3VsZCBoYXZlIGEgZmllbGQgaWQgJmx0OyAyNTYKICAgICoKICAgICogQHBhcmFtIGRhdGEgVGhlIHNlcmlhbGl6ZWQgZGF0YSB0byBndWVzcyB0aGUgcHJvdG9jb2wgZm9yLgogICAgKiBAcGFyYW0gZmFsbGJhY2sgVGhlIFRQcm90b2NvbCB0byByZXR1cm4gaWYgbm8gZ3Vlc3MgY2FuIGJlIG1hZGUuCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2wuamF2YQppbmRleCAzM2NhZDI0Li5lYjdlMjNiIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLmphdmEKQEAgLTE5LDggKzE5LDggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKIAotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwpAQCAtNDUsMTMgKzQ1LDEzIEBACiAgICAgfQogICB9CiAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gQ09NTUEgPSBuZXcgYnl0ZVtdIHsnLCd9OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBDT0xPTiA9IG5ldyBieXRlW10geyc6J307Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIExCUkFDRSA9IG5ldyBieXRlW10geyd7J307Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIFJCUkFDRSA9IG5ldyBieXRlW10geyd9J307Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIExCUkFDS0VUID0gbmV3IGJ5dGVbXSB7J1snfTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gUkJSQUNLRVQgPSBuZXcgYnl0ZVtdIHsnXSd9OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgUVVPVEUgPSAnIic7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBDT01NQSA9IG5ldyBieXRlW10geycsJ307CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBDT0xPTiA9IG5ldyBieXRlW10geyc6J307CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBMQlJBQ0UgPSBuZXcgYnl0ZVtdIHsneyd9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gUkJSQUNFID0gbmV3IGJ5dGVbXSB7J30nfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIExCUkFDS0VUID0gbmV3IGJ5dGVbXSB7J1snfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIFJCUkFDS0VUID0gbmV3IGJ5dGVbXSB7J10nfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBRVU9URSA9ICciJzsKIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUU3RydWN0IEFOT05ZTU9VU19TVFJVQ1QgPSBuZXcgVFN0cnVjdCgpOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBURmllbGQgQU5PTllNT1VTX0ZJRUxEID0gbmV3IFRGaWVsZCgpOwpAQCAtNTksOSArNTksMTcgQEAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVFNldCBFTVBUWV9TRVQgPSBuZXcgVFNldCgpOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUTGlzdCBFTVBUWV9MSVNUID0gbmV3IFRMaXN0KCk7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRNYXAgRU1QVFlfTUFQID0gbmV3IFRNYXAoKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1QgPSAibGlzdCI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVQgPSAic2V0IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUCA9ICJtYXAiOwogCiAgIHByb3RlY3RlZCBjbGFzcyBDb250ZXh0IHsKICAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZSgpIHRocm93cyBURXhjZXB0aW9uIHt9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgYSBrZXkgaW4gYSBtYXAKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc01hcEtleSgpIHsgcmV0dXJuICBmYWxzZTsgfQogICB9CiAKICAgcHJvdGVjdGVkIGNsYXNzIExpc3RDb250ZXh0IGV4dGVuZHMgQ29udGV4dCB7CkBAIC05MSw2ICs5OSwyMiBAQAogICAgIH0KICAgfQogCisgIHByb3RlY3RlZCBjbGFzcyBNYXBDb250ZXh0IGV4dGVuZHMgU3RydWN0Q29udGV4dCB7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNLZXkgPSB0cnVlOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBzdXBlci53cml0ZSgpOworICAgICAgaXNLZXkgPSAhaXNLZXk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNNYXBLZXkoKSB7CisgICAgICAvLyB3ZSB3YW50IHRvIGNvZXJjZSBtYXAga2V5cyB0byBqc29uIHN0cmluZ3MgcmVnYXJkbGVzcworICAgICAgLy8gb2YgdGhlaXIgdHlwZQorICAgICAgcmV0dXJuIGlzS2V5OworICAgIH0KKyAgfQorCiAgIHByb3RlY3RlZCBmaW5hbCBDb250ZXh0IEJBU0VfQ09OVEVYVCA9IG5ldyBDb250ZXh0KCk7CiAKICAgLyoqCkBAIC0xMTksMTMgKzE0MywzMyBAQAogICB9CiAKICAgLyoqCisgICAqIFJlc2V0IHRoZSB3cml0ZSBjb250ZXh0IHN0YWNrIHRvIGl0cyBpbml0aWFsIHN0YXRlLgorICAgKi8KKyAgcHJvdGVjdGVkIHZvaWQgcmVzZXRXcml0ZUNvbnRleHQoKSB7CisgICAgd2hpbGUgKCF3cml0ZUNvbnRleHRTdGFja18uaXNFbXB0eSgpKSB7CisgICAgICBwb3BXcml0ZUNvbnRleHQoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogVXNlZCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBhcmUgbm90IGVuY291bnRlcmluZyBhIG1hcCB3aG9zZSBrZXlzIGFyZSBjb250YWluZXJzCisgICAqLworICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRDb250ZXh0SXNOb3RNYXBLZXkoU3RyaW5nIGludmFsaWRLZXlUeXBlKSB0aHJvd3MgQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbiB7CisgICAgaWYgKHdyaXRlQ29udGV4dF8uaXNNYXBLZXkoKSkgeworICAgICAgdGhyb3cgbmV3IENvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24oIkNhbm5vdCBzZXJpYWxpemUgYSBtYXAgd2l0aCBrZXlzIHRoYXQgYXJlIG9mIHR5cGUgIiArIGludmFsaWRLZXlUeXBlKTsKKyAgICB9CisgIH0KKworICAvKioKICAgICogQ29uc3RydWN0b3IKICAgICovCiAgIHB1YmxpYyBUU2ltcGxlSlNPTlByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpIHsKICAgICBzdXBlcih0cmFucyk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlc2V0V3JpdGVDb250ZXh0KCk7IC8vIFRIUklGVC0zNzQzCiAgICAgdHJhbnNfLndyaXRlKExCUkFDS0VUKTsKICAgICBwdXNoV3JpdGVDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgpKTsKICAgICB3cml0ZVN0cmluZyhtZXNzYWdlLm5hbWUpOwpAQCAtMTMzLDEwMyArMTc3LDEzMyBAQAogICAgIHdyaXRlSTMyKG1lc3NhZ2Uuc2VxaWQpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBwb3BXcml0ZUNvbnRleHQoKTsKICAgICB0cmFuc18ud3JpdGUoUkJSQUNLRVQpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7CiAgICAgdHJhbnNfLndyaXRlKExCUkFDRSk7CiAgICAgcHVzaFdyaXRlQ29udGV4dChuZXcgU3RydWN0Q29udGV4dCgpKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBwb3BXcml0ZUNvbnRleHQoKTsKICAgICB0cmFuc18ud3JpdGUoUkJSQUNFKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gTm90ZSB0aGF0IGV4dHJhIHR5cGUgaW5mb3JtYXRpb24gaXMgb21pdHRlZCBpbiBKU09OIQogICAgIHdyaXRlU3RyaW5nKGZpZWxkLm5hbWUpOwogICB9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAotICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBhc3NlcnRDb250ZXh0SXNOb3RNYXBLZXkoTUFQKTsKICAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7CiAgICAgdHJhbnNfLndyaXRlKExCUkFDRSk7Ci0gICAgcHVzaFdyaXRlQ29udGV4dChuZXcgU3RydWN0Q29udGV4dCgpKTsKKyAgICBwdXNoV3JpdGVDb250ZXh0KG5ldyBNYXBDb250ZXh0KCkpOwogICAgIC8vIE5vIG1ldGFkYXRhIQogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWFwRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHBvcFdyaXRlQ29udGV4dCgpOwogICAgIHRyYW5zXy53cml0ZShSQlJBQ0UpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBhc3NlcnRDb250ZXh0SXNOb3RNYXBLZXkoTElTVCk7CiAgICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOwogICAgIHRyYW5zXy53cml0ZShMQlJBQ0tFVCk7CiAgICAgcHVzaFdyaXRlQ29udGV4dChuZXcgTGlzdENvbnRleHQoKSk7CiAgICAgLy8gTm8gbWV0YWRhdGEhCiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHBvcFdyaXRlQ29udGV4dCgpOwogICAgIHRyYW5zXy53cml0ZShSQlJBQ0tFVCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGFzc2VydENvbnRleHRJc05vdE1hcEtleShTRVQpOwogICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKICAgICB0cmFuc18ud3JpdGUoTEJSQUNLRVQpOwogICAgIHB1c2hXcml0ZUNvbnRleHQobmV3IExpc3RDb250ZXh0KCkpOwogICAgIC8vIE5vIG1ldGFkYXRhIQogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU2V0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHBvcFdyaXRlQ29udGV4dCgpOwogICAgIHRyYW5zXy53cml0ZShSQlJBQ0tFVCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVCb29sKGJvb2xlYW4gYikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZShiID8gKGJ5dGUpMSA6IChieXRlKTApOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZShieXRlIGIpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUkzMihiKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUkxNihzaG9ydCBpMTYpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUkzMihpMTYpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7Ci0gICAgX3dyaXRlU3RyaW5nRGF0YShJbnRlZ2VyLnRvU3RyaW5nKGkzMikpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgX3dyaXRlU3RyaW5nRGF0YShTdHJpbmcgcykgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICBieXRlW10gYiA9IHMuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICB0cmFuc18ud3JpdGUoYik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOworICAgIGlmKHdyaXRlQ29udGV4dF8uaXNNYXBLZXkoKSkgeworICAgICAgd3JpdGVTdHJpbmcoSW50ZWdlci50b1N0cmluZyhpMzIpKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOworICAgICAgX3dyaXRlU3RyaW5nRGF0YShJbnRlZ2VyLnRvU3RyaW5nKGkzMikpOwogICAgIH0KICAgfQogCisgIHB1YmxpYyB2b2lkIF93cml0ZVN0cmluZ0RhdGEoU3RyaW5nIHMpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBieXRlW10gYiA9IHMuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgdHJhbnNfLndyaXRlKGIpOworICB9CisKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlSTY0KGxvbmcgaTY0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOwotICAgIF93cml0ZVN0cmluZ0RhdGEoTG9uZy50b1N0cmluZyhpNjQpKTsKKyAgICBpZih3cml0ZUNvbnRleHRfLmlzTWFwS2V5KCkpIHsKKyAgICAgIHdyaXRlU3RyaW5nKExvbmcudG9TdHJpbmcoaTY0KSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKKyAgICAgIF93cml0ZVN0cmluZ0RhdGEoTG9uZy50b1N0cmluZyhpNjQpKTsKKyAgICB9CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGR1YikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKLSAgICBfd3JpdGVTdHJpbmdEYXRhKERvdWJsZS50b1N0cmluZyhkdWIpKTsKKyAgICBpZih3cml0ZUNvbnRleHRfLmlzTWFwS2V5KCkpIHsKKyAgICAgIHdyaXRlU3RyaW5nKERvdWJsZS50b1N0cmluZyhkdWIpKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOworICAgICAgX3dyaXRlU3RyaW5nRGF0YShEb3VibGUudG9TdHJpbmcoZHViKSk7CisgICAgfQogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7CiAgICAgaW50IGxlbmd0aCA9IHN0ci5sZW5ndGgoKTsKQEAgLTI4Myw5MCArMzU3LDEwOCBAQAogICAgIF93cml0ZVN0cmluZ0RhdGEoZXNjYXBlLnRvU3RyaW5nKCkpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlQmluYXJ5KEJ5dGVCdWZmZXIgYmluKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIC8vIFRPRE8obWNzbGVlKTogRml4IHRoaXMKLSAgICAgIHdyaXRlU3RyaW5nKG5ldyBTdHJpbmcoYmluLmFycmF5KCksIGJpbi5wb3NpdGlvbigpICsgYmluLmFycmF5T2Zmc2V0KCksIGJpbi5saW1pdCgpIC0gYmluLnBvc2l0aW9uKCkgLSBiaW4uYXJyYXlPZmZzZXQoKSwgIlVURi04IikpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgLy8gVE9ETyhtY3NsZWUpOiBGaXggdGhpcworICAgIHdyaXRlU3RyaW5nKG5ldyBTdHJpbmcoYmluLmFycmF5KCksIGJpbi5wb3NpdGlvbigpICsgYmluLmFycmF5T2Zmc2V0KCksCisgICAgICAgIGJpbi5saW1pdCgpIC0gYmluLnBvc2l0aW9uKCkgLSBiaW4uYXJyYXlPZmZzZXQoKSwKKyAgICAgICAgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOwogICB9CiAKICAgLyoqCiAgICAqIFJlYWRpbmcgbWV0aG9kcy4KICAgICovCiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEVNUFRZX01FU1NBR0U7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKLSAgcHVibGljIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEFOT05ZTU9VU19TVFJVQ1Q7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkU3RydWN0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEFOT05ZTU9VU19GSUVMRDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRGaWVsZEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkRmllbGRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVE1hcCByZWFkTWFwQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gRU1QVFlfTUFQOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZE1hcEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkTWFwRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gRU1QVFlfTElTVDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRTZXQgcmVhZFNldEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEVNUFRZX1NFVDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRTZXRFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZFNldEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBib29sZWFuIHJlYWRCb29sKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHJldHVybiAocmVhZEJ5dGUoKSA9PSAxKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgYnl0ZSByZWFkQnl0ZSgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiAwOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBzaG9ydCByZWFkSTE2KCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIDA7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGludCByZWFkSTMyKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIDA7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGxvbmcgcmVhZEk2NCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiAwOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiAwOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiAiIjsKQEAgLTM3Nyw5ICs0NjksMTUgQEAKICAgICByZXR1cm4gIiI7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIEJ5dGVCdWZmZXIgcmVhZEJpbmFyeSgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbMF0pOwogICB9CiAKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBDb2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7CisgICAgcHVibGljIENvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RUdXBsZVByb3RvY29sLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFR1cGxlUHJvdG9jb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGY1MjI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RUdXBsZVByb3RvY29sLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5JU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5UdXBsZVNjaGVtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworcHVibGljIGZpbmFsIGNsYXNzIFRUdXBsZVByb3RvY29sIGV4dGVuZHMgVENvbXBhY3RQcm90b2NvbCB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkgeworICAgIHB1YmxpYyBGYWN0b3J5KCkge30KKworICAgIHB1YmxpYyBUUHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgeworICAgICAgcmV0dXJuIG5ldyBUVHVwbGVQcm90b2NvbCh0cmFucyk7CisgICAgfQorICB9CisKKyAgcHVibGljIFRUdXBsZVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgc3VwZXIodHJhbnNwb3J0KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIElTY2hlbWU+IGdldFNjaGVtZSgpIHsKKyAgICByZXR1cm4gVHVwbGVTY2hlbWUuY2xhc3M7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUJpdFNldChCaXRTZXQgYnMsIGludCB2ZWN0b3JXaWR0aCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGJ5dGVbXSBieXRlcyA9IHRvQnl0ZUFycmF5KGJzLCB2ZWN0b3JXaWR0aCk7CisgICAgZm9yIChieXRlIGIgOiBieXRlcykgeworICAgICAgd3JpdGVCeXRlKGIpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBCaXRTZXQgcmVhZEJpdFNldChpbnQgaSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGludCBsZW5ndGggPSAoaW50KSBNYXRoLmNlaWwoaS84LjApOworICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7IGorKykgeworICAgICAgYnl0ZXNbal0gPSByZWFkQnl0ZSgpOworICAgIH0KKyAgICBCaXRTZXQgYnMgPSBmcm9tQnl0ZUFycmF5KGJ5dGVzKTsKKyAgICByZXR1cm4gYnM7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhIGJpdHNldCBjb250YWluaW5nIHRoZSB2YWx1ZXMgaW4gYnl0ZXMuIFRoZSBieXRlLW9yZGVyaW5nIG11c3QgYmUKKyAgICogYmlnLWVuZGlhbi4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQml0U2V0IGZyb21CeXRlQXJyYXkoYnl0ZVtdIGJ5dGVzKSB7CisgICAgQml0U2V0IGJpdHMgPSBuZXcgQml0U2V0KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGggKiA4OyBpKyspIHsKKyAgICAgIGlmICgoYnl0ZXNbYnl0ZXMubGVuZ3RoIC0gaSAvIDggLSAxXSAmICgxIDw8IChpICUgOCkpKSA+IDApIHsKKyAgICAgICAgYml0cy5zZXQoaSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBiaXRzOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgYSBieXRlIGFycmF5IG9mIGF0IGxlYXN0IGxlbmd0aCAxLiBUaGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaW4gdGhlCisgICAqIHJlc3VsdCBpcyBndWFyYW50ZWVkIG5vdCB0byBiZSBhIDEgKHNpbmNlIEJpdFNldCBkb2VzIG5vdCBzdXBwb3J0IHNpZ24KKyAgICogZXh0ZW5zaW9uKS4gVGhlIGJ5dGUtb3JkZXJpbmcgb2YgdGhlIHJlc3VsdCBpcyBiaWctZW5kaWFuIHdoaWNoIG1lYW5zIHRoZQorICAgKiBtb3N0IHNpZ25pZmljYW50IGJpdCBpcyBpbiBlbGVtZW50IDAuIFRoZSBiaXQgYXQgaW5kZXggMCBvZiB0aGUgYml0IHNldCBpcworICAgKiBhc3N1bWVkIHRvIGJlIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuCisgICAqIAorICAgKiBAcGFyYW0gYml0cworICAgKiBAcGFyYW0gdmVjdG9yV2lkdGggCisgICAqIEByZXR1cm4gYSBieXRlIGFycmF5IG9mIGF0IGxlYXN0IGxlbmd0aCAxCisgICAqLworICBwdWJsaWMgc3RhdGljIGJ5dGVbXSB0b0J5dGVBcnJheShCaXRTZXQgYml0cywgaW50IHZlY3RvcldpZHRoKSB7CisgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbKGludCkgTWF0aC5jZWlsKHZlY3RvcldpZHRoLzguMCldOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYml0cy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICBpZiAoYml0cy5nZXQoaSkpIHsKKyAgICAgICAgYnl0ZXNbYnl0ZXMubGVuZ3RoIC0gaSAvIDggLSAxXSB8PSAxIDw8IChpICUgOCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBieXRlczsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL0lTY2hlbWUuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zY2hlbWUvSVNjaGVtZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMzU1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL0lTY2hlbWUuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlOworCitwdWJsaWMgaW50ZXJmYWNlIElTY2hlbWU8VCBleHRlbmRzIFRCYXNlPiB7CisKKyAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3RvLCBUIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisKKyAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90bywgVCBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1NjaGVtZUZhY3RvcnkuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zY2hlbWUvU2NoZW1lRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNmE2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1NjaGVtZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZTsKKworcHVibGljIGludGVyZmFjZSBTY2hlbWVGYWN0b3J5IHsKKworICBwdWJsaWMgPFMgZXh0ZW5kcyBJU2NoZW1lPiBTIGdldFNjaGVtZSgpOworCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1N0YW5kYXJkU2NoZW1lLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1N0YW5kYXJkU2NoZW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZhYjA0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zY2hlbWUvU3RhbmRhcmRTY2hlbWUuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RhbmRhcmRTY2hlbWU8VCBleHRlbmRzIFRCYXNlPiBpbXBsZW1lbnRzIElTY2hlbWU8VD4geworCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1R1cGxlU2NoZW1lLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1R1cGxlU2NoZW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY1MjQyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zY2hlbWUvVHVwbGVTY2hlbWUuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHVwbGVTY2hlbWU8VCBleHRlbmRzIFRCYXNlPiBpbXBsZW1lbnRzIElTY2hlbWU8VD4geworCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL0Fic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMjA2ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL0Fic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDYxOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRBc3luY1Byb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRNZW1vcnlJbnB1dFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuc3BpLlNlbGVjdG9yUHJvdmlkZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKKworLyoqCisgKiBQcm92aWRlcyBjb21tb24gbWV0aG9kcyBhbmQgY2xhc3NlcyB1c2VkIGJ5IG5vbmJsb2NraW5nIFRTZXJ2ZXIKKyAqIGltcGxlbWVudGF0aW9ucy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIgZXh0ZW5kcyBUU2VydmVyIHsKKyAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7CisKKyAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJnczxUIGV4dGVuZHMgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlckFyZ3M8VD4+IGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBcmdzPFQ+IHsKKyAgICBwdWJsaWMgbG9uZyBtYXhSZWFkQnVmZmVyQnl0ZXMgPSAyNTYgKiAxMDI0ICogMTAyNDsKKworICAgIHB1YmxpYyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJncyhUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgICBzdXBlcih0cmFuc3BvcnQpOworICAgICAgdHJhbnNwb3J0RmFjdG9yeShuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHdlIHdpbGwgYWxsb2NhdGUgdG8gY2xpZW50IElPIGJ1ZmZlcnMgYXQgYQorICAgKiB0aW1lLiBXaXRob3V0IHRoaXMgbGltaXQsIHRoZSBzZXJ2ZXIgd2lsbCBnbGFkbHkgYWxsb2NhdGUgY2xpZW50IGJ1ZmZlcnMKKyAgICogcmlnaHQgaW50byBhbiBvdXQgb2YgbWVtb3J5IGV4Y2VwdGlvbiwgcmF0aGVyIHRoYW4gd2FpdGluZy4KKyAgICovCisgIGZpbmFsIGxvbmcgTUFYX1JFQURfQlVGRkVSX0JZVEVTOworCisgIC8qKgorICAgKiBIb3cgbWFueSBieXRlcyBhcmUgY3VycmVudGx5IGFsbG9jYXRlZCB0byByZWFkIGJ1ZmZlcnMuCisgICAqLworICBmaW5hbCBBdG9taWNMb25nIHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZCA9IG5ldyBBdG9taWNMb25nKDApOworCisgIHB1YmxpYyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyKEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzIGFyZ3MpIHsKKyAgICBzdXBlcihhcmdzKTsKKyAgICBNQVhfUkVBRF9CVUZGRVJfQllURVMgPSBhcmdzLm1heFJlYWRCdWZmZXJCeXRlczsKKyAgfQorCisgIC8qKgorICAgKiBCZWdpbiBhY2NlcHRpbmcgY29ubmVjdGlvbnMgYW5kIHByb2Nlc3NpbmcgaW52b2NhdGlvbnMuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXJ2ZSgpIHsKKyAgICAvLyBzdGFydCBhbnkgSU8gdGhyZWFkcworICAgIGlmICghc3RhcnRUaHJlYWRzKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBzdGFydCBsaXN0ZW5pbmcsIG9yIGV4aXQKKyAgICBpZiAoIXN0YXJ0TGlzdGVuaW5nKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzZXRTZXJ2aW5nKHRydWUpOworCisgICAgLy8gdGhpcyB3aWxsIGJsb2NrIHdoaWxlIHdlIHNlcnZlCisgICAgd2FpdEZvclNodXRkb3duKCk7CisKKyAgICBzZXRTZXJ2aW5nKGZhbHNlKTsKKworICAgIC8vIGRvIGEgbGl0dGxlIGNsZWFudXAKKyAgICBzdG9wTGlzdGVuaW5nKCk7CisgIH0KKworICAvKioKKyAgICogU3RhcnRzIGFueSB0aHJlYWRzIHJlcXVpcmVkIGZvciBzZXJ2aW5nLgorICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWYgZXZlcnl0aGluZyB3ZW50IG9rLCBmYWxzZSBpZiB0aHJlYWRzIGNvdWxkIG5vdCBiZSBzdGFydGVkLgorICAgKi8KKyAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc3RhcnRUaHJlYWRzKCk7CisKKyAgLyoqCisgICAqIEEgbWV0aG9kIHRoYXQgd2lsbCBibG9jayB1bnRpbCB3aGVuIHRocmVhZHMgaGFuZGxpbmcgdGhlIHNlcnZpbmcgaGF2ZSBiZWVuCisgICAqIHNodXQgZG93bi4KKyAgICovCisgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHdhaXRGb3JTaHV0ZG93bigpOworCisgIC8qKgorICAgKiBIYXZlIHRoZSBzZXJ2ZXIgdHJhbnNwb3J0IHN0YXJ0IGFjY2VwdGluZyBjb25uZWN0aW9ucy4KKyAgICoKKyAgICogQHJldHVybiB0cnVlIGlmIHdlIHN0YXJ0ZWQgbGlzdGVuaW5nIHN1Y2Nlc3NmdWxseSwgZmFsc2UgaWYgc29tZXRoaW5nIHdlbnQKKyAgICogICAgICAgICB3cm9uZy4KKyAgICovCisgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0TGlzdGVuaW5nKCkgeworICAgIHRyeSB7CisgICAgICBzZXJ2ZXJUcmFuc3BvcnRfLmxpc3RlbigpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgIExPR0dFUi5lcnJvcigiRmFpbGVkIHRvIHN0YXJ0IGxpc3RlbmluZyBvbiBzZXJ2ZXIgc29ja2V0ISIsIHR0eCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFN0b3AgbGlzdGVuaW5nIGZvciBjb25uZWN0aW9ucy4KKyAgICovCisgIHByb3RlY3RlZCB2b2lkIHN0b3BMaXN0ZW5pbmcoKSB7CisgICAgc2VydmVyVHJhbnNwb3J0Xy5jbG9zZSgpOworICB9CisKKyAgLyoqCisgICAqIFBlcmZvcm0gYW4gaW52b2NhdGlvbi4gVGhpcyBtZXRob2QgY291bGQgYmVoYXZlIHNldmVyYWwgZGlmZmVyZW50IHdheXMgLQorICAgKiBpbnZva2UgaW1tZWRpYXRlbHkgaW5saW5lLCBxdWV1ZSBmb3Igc2VwYXJhdGUgZXhlY3V0aW9uLCBldGMuCisgICAqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiBpbnZvY2F0aW9uIHdhcyBzdWNjZXNzZnVsbHkgcmVxdWVzdGVkLCB3aGljaCBpcyBub3QgYQorICAgKiAgICAgICAgIGd1YXJhbnRlZSB0aGF0IGludm9jYXRpb24gaGFzIGNvbXBsZXRlZC4gRmFsc2UgaWYgdGhlIHJlcXVlc3QKKyAgICogICAgICAgICBmYWlsZWQuCisgICAqLworICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiByZXF1ZXN0SW52b2tlKEZyYW1lQnVmZmVyIGZyYW1lQnVmZmVyKTsKKworICAvKioKKyAgICogQW4gYWJzdHJhY3QgdGhyZWFkIHRoYXQgaGFuZGxlcyBzZWxlY3Rpbmcgb24gYSBzZXQgb2YgdHJhbnNwb3J0cyBhbmQKKyAgICoge0BsaW5rIEZyYW1lQnVmZmVyIEZyYW1lQnVmZmVyc30gYXNzb2NpYXRlZCB3aXRoIHNlbGVjdGVkIGtleXMKKyAgICogY29ycmVzcG9uZGluZyB0byByZXF1ZXN0cy4KKyAgICovCisgIHByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlbGVjdFRocmVhZCBleHRlbmRzIFRocmVhZCB7CisgICAgcHJvdGVjdGVkIFNlbGVjdG9yIHNlbGVjdG9yOworCisgICAgLy8gTGlzdCBvZiBGcmFtZUJ1ZmZlcnMgdGhhdCB3YW50IHRvIGNoYW5nZSB0aGVpciBzZWxlY3Rpb24gaW50ZXJlc3RzLgorICAgIHByb3RlY3RlZCBmaW5hbCBTZXQ8RnJhbWVCdWZmZXI+IHNlbGVjdEludGVyZXN0Q2hhbmdlcyA9IG5ldyBIYXNoU2V0PEZyYW1lQnVmZmVyPigpOworCisgICAgcHVibGljIEFic3RyYWN0U2VsZWN0VGhyZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHRoaXMuc2VsZWN0b3IgPSBTZWxlY3RvclByb3ZpZGVyLnByb3ZpZGVyKCkub3BlblNlbGVjdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIHNlbGVjdG9yIGlzIGJsb2NrZWQsIHdha2UgaXQgdXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd2FrZXVwU2VsZWN0b3IoKSB7CisgICAgICBzZWxlY3Rvci53YWtldXAoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgRnJhbWVCdWZmZXIgdG8gdGhlIGxpc3Qgb2Ygc2VsZWN0IGludGVyZXN0IGNoYW5nZXMgYW5kIHdha2UgdXAgdGhlCisgICAgICogc2VsZWN0b3IgaWYgaXQncyBibG9ja2VkLiBXaGVuIHRoZSBzZWxlY3QoKSBjYWxsIGV4aXRzLCBpdCdsbCBnaXZlIHRoZQorICAgICAqIEZyYW1lQnVmZmVyIGEgY2hhbmNlIHRvIGNoYW5nZSBpdHMgaW50ZXJlc3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZShGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlcikgeworICAgICAgc3luY2hyb25pemVkIChzZWxlY3RJbnRlcmVzdENoYW5nZXMpIHsKKyAgICAgICAgc2VsZWN0SW50ZXJlc3RDaGFuZ2VzLmFkZChmcmFtZUJ1ZmZlcik7CisgICAgICB9CisgICAgICAvLyB3YWtldXAgdGhlIHNlbGVjdG9yLCBpZiBpdCdzIGN1cnJlbnRseSBibG9ja2VkLgorICAgICAgc2VsZWN0b3Iud2FrZXVwKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgRnJhbWVCdWZmZXJzIHRoYXQgaGF2ZSBzd2l0Y2hlZCB0aGVpcgorICAgICAqIGludGVyZXN0IHR5cGUgZnJvbSByZWFkIHRvIHdyaXRlIG9yIHZpY2UgdmVyc2EuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0ludGVyZXN0Q2hhbmdlcygpIHsKKyAgICAgIHN5bmNocm9uaXplZCAoc2VsZWN0SW50ZXJlc3RDaGFuZ2VzKSB7CisgICAgICAgIGZvciAoRnJhbWVCdWZmZXIgZmIgOiBzZWxlY3RJbnRlcmVzdENoYW5nZXMpIHsKKyAgICAgICAgICBmYi5jaGFuZ2VTZWxlY3RJbnRlcmVzdHMoKTsKKyAgICAgICAgfQorICAgICAgICBzZWxlY3RJbnRlcmVzdENoYW5nZXMuY2xlYXIoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEbyB0aGUgd29yayByZXF1aXJlZCB0byByZWFkIGZyb20gYSByZWFkYWJsZSBjbGllbnQuIElmIHRoZSBmcmFtZSBpcworICAgICAqIGZ1bGx5IHJlYWQsIHRoZW4gaW52b2tlIHRoZSBtZXRob2QgY2FsbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWFkKFNlbGVjdGlvbktleSBrZXkpIHsKKyAgICAgIEZyYW1lQnVmZmVyIGJ1ZmZlciA9IChGcmFtZUJ1ZmZlcikga2V5LmF0dGFjaG1lbnQoKTsKKyAgICAgIGlmICghYnVmZmVyLnJlYWQoKSkgeworICAgICAgICBjbGVhbnVwU2VsZWN0aW9uS2V5KGtleSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgLy8gaWYgdGhlIGJ1ZmZlcidzIGZyYW1lIHJlYWQgaXMgY29tcGxldGUsIGludm9rZSB0aGUgbWV0aG9kLgorICAgICAgaWYgKGJ1ZmZlci5pc0ZyYW1lRnVsbHlSZWFkKCkpIHsKKyAgICAgICAgaWYgKCFyZXF1ZXN0SW52b2tlKGJ1ZmZlcikpIHsKKyAgICAgICAgICBjbGVhbnVwU2VsZWN0aW9uS2V5KGtleSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMZXQgYSB3cml0YWJsZSBjbGllbnQgZ2V0IHdyaXR0ZW4sIGlmIHRoZXJlJ3MgZGF0YSB0byBiZSB3cml0dGVuLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVdyaXRlKFNlbGVjdGlvbktleSBrZXkpIHsKKyAgICAgIEZyYW1lQnVmZmVyIGJ1ZmZlciA9IChGcmFtZUJ1ZmZlcikga2V5LmF0dGFjaG1lbnQoKTsKKyAgICAgIGlmICghYnVmZmVyLndyaXRlKCkpIHsKKyAgICAgICAgY2xlYW51cFNlbGVjdGlvbktleShrZXkpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERvIGNvbm5lY3Rpb24tY2xvc2UgY2xlYW51cCBvbiBhIGdpdmVuIFNlbGVjdGlvbktleS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjbGVhbnVwU2VsZWN0aW9uS2V5KFNlbGVjdGlvbktleSBrZXkpIHsKKyAgICAgIC8vIHJlbW92ZSB0aGUgcmVjb3JkcyBmcm9tIHRoZSB0d28gbWFwcworICAgICAgRnJhbWVCdWZmZXIgYnVmZmVyID0gKEZyYW1lQnVmZmVyKSBrZXkuYXR0YWNobWVudCgpOworICAgICAgaWYgKGJ1ZmZlciAhPSBudWxsKSB7CisgICAgICAgIC8vIGNsb3NlIHRoZSBidWZmZXIKKyAgICAgICAgYnVmZmVyLmNsb3NlKCk7CisgICAgICB9CisgICAgICAvLyBjYW5jZWwgdGhlIHNlbGVjdGlvbiBrZXkKKyAgICAgIGtleS5jYW5jZWwoKTsKKyAgICB9CisgIH0gLy8gU2VsZWN0VGhyZWFkCisKKyAgLyoqCisgICAqIFBvc3NpYmxlIHN0YXRlcyBmb3IgdGhlIEZyYW1lQnVmZmVyIHN0YXRlIG1hY2hpbmUuCisgICAqLworICBwcml2YXRlIGVudW0gRnJhbWVCdWZmZXJTdGF0ZSB7CisgICAgLy8gaW4gdGhlIG1pZHN0IG9mIHJlYWRpbmcgdGhlIGZyYW1lIHNpemUgb2ZmIHRoZSB3aXJlCisgICAgUkVBRElOR19GUkFNRV9TSVpFLAorICAgIC8vIHJlYWRpbmcgdGhlIGFjdHVhbCBmcmFtZSBkYXRhIG5vdywgYnV0IG5vdCBhbGwgdGhlIHdheSBkb25lIHlldAorICAgIFJFQURJTkdfRlJBTUUsCisgICAgLy8gY29tcGxldGVseSByZWFkIHRoZSBmcmFtZSwgc28gYW4gaW52b2NhdGlvbiBjYW4gbm93IGhhcHBlbgorICAgIFJFQURfRlJBTUVfQ09NUExFVEUsCisgICAgLy8gd2FpdGluZyB0byBnZXQgc3dpdGNoZWQgdG8gbGlzdGVuaW5nIGZvciB3cml0ZSBldmVudHMKKyAgICBBV0FJVElOR19SRUdJU1RFUl9XUklURSwKKyAgICAvLyBzdGFydGVkIHdyaXRpbmcgcmVzcG9uc2UgZGF0YSwgbm90IGZ1bGx5IGNvbXBsZXRlIHlldAorICAgIFdSSVRJTkcsCisgICAgLy8gYW5vdGhlciB0aHJlYWQgd2FudHMgdGhpcyBmcmFtZWJ1ZmZlciB0byBnbyBiYWNrIHRvIHJlYWRpbmcKKyAgICBBV0FJVElOR19SRUdJU1RFUl9SRUFELAorICAgIC8vIHdlIHdhbnQgb3VyIHRyYW5zcG9ydCBhbmQgc2VsZWN0aW9uIGtleSBpbnZhbGlkYXRlZCBpbiB0aGUgc2VsZWN0b3IKKyAgICAvLyB0aHJlYWQKKyAgICBBV0FJVElOR19DTE9TRQorICB9CisKKyAgLyoqCisgICAqIENsYXNzIHRoYXQgaW1wbGVtZW50cyBhIHNvcnQgb2Ygc3RhdGUgbWFjaGluZSBhcm91bmQgdGhlIGludGVyYWN0aW9uIHdpdGggYQorICAgKiBjbGllbnQgYW5kIGFuIGludm9rZXIuIEl0IG1hbmFnZXMgcmVhZGluZyB0aGUgZnJhbWUgc2l6ZSBhbmQgZnJhbWUgZGF0YSwKKyAgICogZ2V0dGluZyBpdCBoYW5kZWQgb2ZmIGFzIHdyYXBwZWQgdHJhbnNwb3J0cywgYW5kIHRoZW4gdGhlIHdyaXRpbmcgb2YKKyAgICogcmVzcG9uc2UgZGF0YSBiYWNrIHRvIHRoZSBjbGllbnQuIEluIHRoZSBwcm9jZXNzIGl0IG1hbmFnZXMgZmxpcHBpbmcgdGhlCisgICAqIHJlYWQgYW5kIHdyaXRlIGJpdHMgb24gdGhlIHNlbGVjdGlvbiBrZXkgZm9yIGl0cyBjbGllbnQuCisgICAqLworICAgcHVibGljIGNsYXNzIEZyYW1lQnVmZmVyIHsKKyAgICBwcml2YXRlIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7CisKKyAgICAvLyB0aGUgYWN0dWFsIHRyYW5zcG9ydCBob29rZWQgdXAgdG8gdGhlIGNsaWVudC4KKyAgICBwcm90ZWN0ZWQgZmluYWwgVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zXzsKKworICAgIC8vIHRoZSBTZWxlY3Rpb25LZXkgdGhhdCBjb3JyZXNwb25kcyB0byBvdXIgdHJhbnNwb3J0CisgICAgcHJvdGVjdGVkIGZpbmFsIFNlbGVjdGlvbktleSBzZWxlY3Rpb25LZXlfOworCisgICAgLy8gdGhlIFNlbGVjdFRocmVhZCB0aGF0IG93bnMgdGhlIHJlZ2lzdHJhdGlvbiBvZiBvdXIgdHJhbnNwb3J0CisgICAgcHJvdGVjdGVkIGZpbmFsIEFic3RyYWN0U2VsZWN0VGhyZWFkIHNlbGVjdFRocmVhZF87CisKKyAgICAvLyB3aGVyZSBpbiB0aGUgcHJvY2VzcyBvZiByZWFkaW5nL3dyaXRpbmcgYXJlIHdlPworICAgIHByb3RlY3RlZCBGcmFtZUJ1ZmZlclN0YXRlIHN0YXRlXyA9IEZyYW1lQnVmZmVyU3RhdGUuUkVBRElOR19GUkFNRV9TSVpFOworCisgICAgLy8gdGhlIEJ5dGVCdWZmZXIgd2UnbGwgYmUgdXNpbmcgdG8gd3JpdGUgYW5kIHJlYWQsIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUKKyAgICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciBidWZmZXJfOworCisgICAgcHJvdGVjdGVkIGZpbmFsIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVzcG9uc2VfOworCisgICAgLy8gdGhlIGZyYW1lIHRoYXQgdGhlIFRUcmFuc3BvcnQgc2hvdWxkIHdyYXAuCisgICAgcHJvdGVjdGVkIGZpbmFsIFRNZW1vcnlJbnB1dFRyYW5zcG9ydCBmcmFtZVRyYW5zXzsKKworICAgIC8vIHRoZSB0cmFuc3BvcnQgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBjb25uZWN0IHRvIGNsaWVudHMKKyAgICBwcm90ZWN0ZWQgZmluYWwgVFRyYW5zcG9ydCBpblRyYW5zXzsKKworICAgIHByb3RlY3RlZCBmaW5hbCBUVHJhbnNwb3J0IG91dFRyYW5zXzsKKworICAgIC8vIHRoZSBpbnB1dCBwcm90b2NvbCB0byB1c2Ugb24gZnJhbWVzCisgICAgcHJvdGVjdGVkIGZpbmFsIFRQcm90b2NvbCBpblByb3RfOworCisgICAgLy8gdGhlIG91dHB1dCBwcm90b2NvbCB0byB1c2Ugb24gZnJhbWVzCisgICAgcHJvdGVjdGVkIGZpbmFsIFRQcm90b2NvbCBvdXRQcm90XzsKKworICAgIC8vIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29ubmVjdGlvbgorICAgIHByb3RlY3RlZCBmaW5hbCBTZXJ2ZXJDb250ZXh0IGNvbnRleHRfOworCisgICAgcHVibGljIEZyYW1lQnVmZmVyKGZpbmFsIFROb25ibG9ja2luZ1RyYW5zcG9ydCB0cmFucywKKyAgICAgICAgZmluYWwgU2VsZWN0aW9uS2V5IHNlbGVjdGlvbktleSwKKyAgICAgICAgZmluYWwgQWJzdHJhY3RTZWxlY3RUaHJlYWQgc2VsZWN0VGhyZWFkKSB7CisgICAgICB0cmFuc18gPSB0cmFuczsKKyAgICAgIHNlbGVjdGlvbktleV8gPSBzZWxlY3Rpb25LZXk7CisgICAgICBzZWxlY3RUaHJlYWRfID0gc2VsZWN0VGhyZWFkOworICAgICAgYnVmZmVyXyA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoNCk7CisKKyAgICAgIGZyYW1lVHJhbnNfID0gbmV3IFRNZW1vcnlJbnB1dFRyYW5zcG9ydCgpOworICAgICAgcmVzcG9uc2VfID0gbmV3IFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgIGluVHJhbnNfID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQoZnJhbWVUcmFuc18pOworICAgICAgb3V0VHJhbnNfID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KG5ldyBUSU9TdHJlYW1UcmFuc3BvcnQocmVzcG9uc2VfKSk7CisgICAgICBpblByb3RfID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKGluVHJhbnNfKTsKKyAgICAgIG91dFByb3RfID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChvdXRUcmFuc18pOworCisgICAgICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBudWxsKSB7CisgICAgICAgIGNvbnRleHRfID0gZXZlbnRIYW5kbGVyXy5jcmVhdGVDb250ZXh0KGluUHJvdF8sIG91dFByb3RfKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnRleHRfICA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZSB0aGlzIEZyYW1lQnVmZmVyIGEgY2hhbmNlIHRvIHJlYWQuIFRoZSBzZWxlY3RvciBsb29wIHNob3VsZCBoYXZlCisgICAgICogcmVjZWl2ZWQgYSByZWFkIGV2ZW50IGZvciB0aGlzIEZyYW1lQnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIHNob3VsZCBsaXZlIG9uLCBmYWxzZSBpZiBpdCBzaG91bGQgYmUKKyAgICAgKiAgICAgICAgIGNsb3NlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlYWQoKSB7CisgICAgICBpZiAoc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuUkVBRElOR19GUkFNRV9TSVpFKSB7CisgICAgICAgIC8vIHRyeSB0byByZWFkIHRoZSBmcmFtZSBzaXplIGNvbXBsZXRlbHkKKyAgICAgICAgaWYgKCFpbnRlcm5hbFJlYWQoKSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHRoZSBmcmFtZSBzaXplIGhhcyBiZWVuIHJlYWQgY29tcGxldGVseSwgdGhlbiBwcmVwYXJlIHRvIHJlYWQgdGhlCisgICAgICAgIC8vIGFjdHVhbCBmcmFtZS4KKyAgICAgICAgaWYgKGJ1ZmZlcl8ucmVtYWluaW5nKCkgPT0gMCkgeworICAgICAgICAgIC8vIHB1bGwgb3V0IHRoZSBmcmFtZSBzaXplIGFzIGFuIGludGVnZXIuCisgICAgICAgICAgaW50IGZyYW1lU2l6ZSA9IGJ1ZmZlcl8uZ2V0SW50KDApOworICAgICAgICAgIGlmIChmcmFtZVNpemUgPD0gMCkgeworICAgICAgICAgICAgTE9HR0VSLmVycm9yKCJSZWFkIGFuIGludmFsaWQgZnJhbWUgc2l6ZSBvZiAiICsgZnJhbWVTaXplCisgICAgICAgICAgICAgICAgKyAiLiBBcmUgeW91IHVzaW5nIFRGcmFtZWRUcmFuc3BvcnQgb24gdGhlIGNsaWVudCBzaWRlPyIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIGlmIHRoaXMgZnJhbWUgd2lsbCBhbHdheXMgYmUgdG9vIGxhcmdlIGZvciB0aGlzIHNlcnZlciwgbG9nIHRoZQorICAgICAgICAgIC8vIGVycm9yIGFuZCBjbG9zZSB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgICBpZiAoZnJhbWVTaXplID4gTUFYX1JFQURfQlVGRkVSX0JZVEVTKSB7CisgICAgICAgICAgICBMT0dHRVIuZXJyb3IoIlJlYWQgYSBmcmFtZSBzaXplIG9mICIgKyBmcmFtZVNpemUKKyAgICAgICAgICAgICAgICArICIsIHdoaWNoIGlzIGJpZ2dlciB0aGFuIHRoZSBtYXhpbXVtIGFsbG93YWJsZSBidWZmZXIgc2l6ZSBmb3IgQUxMIGNvbm5lY3Rpb25zLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIGlmIHRoaXMgZnJhbWUgd2lsbCBwdXNoIHVzIG92ZXIgdGhlIG1lbW9yeSBsaW1pdCwgdGhlbiByZXR1cm4uCisgICAgICAgICAgLy8gd2l0aCBsdWNrLCBtb3JlIG1lbW9yeSB3aWxsIGZyZWUgdXAgdGhlIG5leHQgdGltZSBhcm91bmQuCisgICAgICAgICAgaWYgKHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZC5nZXQoKSArIGZyYW1lU2l6ZSA+IE1BWF9SRUFEX0JVRkZFUl9CWVRFUykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gaW5jcmVtZW50IHRoZSBhbW91bnQgb2YgbWVtb3J5IGFsbG9jYXRlZCB0byByZWFkIGJ1ZmZlcnMKKyAgICAgICAgICByZWFkQnVmZmVyQnl0ZXNBbGxvY2F0ZWQuYWRkQW5kR2V0KGZyYW1lU2l6ZSArIDQpOworCisgICAgICAgICAgLy8gcmVhbGxvY2F0ZSB0aGUgcmVhZGJ1ZmZlciBhcyBhIGZyYW1lLXNpemVkIGJ1ZmZlcgorICAgICAgICAgIGJ1ZmZlcl8gPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGZyYW1lU2l6ZSArIDQpOworICAgICAgICAgIGJ1ZmZlcl8ucHV0SW50KGZyYW1lU2l6ZSk7CisKKyAgICAgICAgICBzdGF0ZV8gPSBGcmFtZUJ1ZmZlclN0YXRlLlJFQURJTkdfRlJBTUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gdGhpcyBza2lwcyB0aGUgY2hlY2sgb2YgUkVBRElOR19GUkFNRSBzdGF0ZSBiZWxvdywgc2luY2Ugd2UgY2FuJ3QKKyAgICAgICAgICAvLyBwb3NzaWJseSBnbyBvbiB0byB0aGF0IHN0YXRlIGlmIHRoZXJlJ3MgZGF0YSBsZWZ0IHRvIGJlIHJlYWQgYXQKKyAgICAgICAgICAvLyB0aGlzIG9uZS4KKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBpdCBpcyBwb3NzaWJsZSB0byBmYWxsIHRocm91Z2ggZnJvbSB0aGUgUkVBRElOR19GUkFNRV9TSVpFIHNlY3Rpb24KKyAgICAgIC8vIHRvIFJFQURJTkdfRlJBTUUgaWYgdGhlcmUncyBhbHJlYWR5IHNvbWUgZnJhbWUgZGF0YSBhdmFpbGFibGUgb25jZQorICAgICAgLy8gUkVBRElOR19GUkFNRV9TSVpFIGlzIGNvbXBsZXRlLgorCisgICAgICBpZiAoc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuUkVBRElOR19GUkFNRSkgeworICAgICAgICBpZiAoIWludGVybmFsUmVhZCgpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2luY2Ugd2UncmUgYWxyZWFkeSBpbiB0aGUgc2VsZWN0IGxvb3AgaGVyZSBmb3Igc3VyZSwgd2UgY2FuIGp1c3QKKyAgICAgICAgLy8gbW9kaWZ5IG91ciBzZWxlY3Rpb24ga2V5IGRpcmVjdGx5LgorICAgICAgICBpZiAoYnVmZmVyXy5yZW1haW5pbmcoKSA9PSAwKSB7CisgICAgICAgICAgLy8gZ2V0IHJpZCBvZiB0aGUgcmVhZCBzZWxlY3QgaW50ZXJlc3RzCisgICAgICAgICAgc2VsZWN0aW9uS2V5Xy5pbnRlcmVzdE9wcygwKTsKKyAgICAgICAgICBzdGF0ZV8gPSBGcmFtZUJ1ZmZlclN0YXRlLlJFQURfRlJBTUVfQ09NUExFVEU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgLy8gaWYgd2UgZmFsbCB0aHJvdWdoIHRvIHRoaXMgcG9pbnQsIHRoZW4gdGhlIHN0YXRlIG11c3QgYmUgaW52YWxpZC4KKyAgICAgIExPR0dFUi5lcnJvcigiUmVhZCB3YXMgY2FsbGVkIGJ1dCBzdGF0ZSBpcyBpbnZhbGlkICgiICsgc3RhdGVfICsgIikiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlIHRoaXMgRnJhbWVCdWZmZXIgYSBjaGFuY2UgdG8gd3JpdGUgaXRzIG91dHB1dCB0byB0aGUgZmluYWwgY2xpZW50LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHdyaXRlKCkgeworICAgICAgaWYgKHN0YXRlXyA9PSBGcmFtZUJ1ZmZlclN0YXRlLldSSVRJTkcpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpZiAodHJhbnNfLndyaXRlKGJ1ZmZlcl8pIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIExPR0dFUi53YXJuKCJHb3QgYW4gSU9FeGNlcHRpb24gZHVyaW5nIHdyaXRlISIsIGUpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdlJ3JlIGRvbmUgd3JpdGluZy4gbm93IHdlIG5lZWQgdG8gc3dpdGNoIGJhY2sgdG8gcmVhZGluZy4KKyAgICAgICAgaWYgKGJ1ZmZlcl8ucmVtYWluaW5nKCkgPT0gMCkgeworICAgICAgICAgIHByZXBhcmVSZWFkKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIExPR0dFUi5lcnJvcigiV3JpdGUgd2FzIGNhbGxlZCwgYnV0IHN0YXRlIGlzIGludmFsaWQgKCIgKyBzdGF0ZV8gKyAiKSIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmUgdGhpcyBGcmFtZUJ1ZmZlciBhIGNoYW5jZSB0byBzZXQgaXRzIGludGVyZXN0IHRvIHdyaXRlLCBvbmNlIGRhdGEKKyAgICAgKiBoYXMgY29tZSBpbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjaGFuZ2VTZWxlY3RJbnRlcmVzdHMoKSB7CisgICAgICBzd2l0Y2ggKHN0YXRlXykgeworICAgICAgY2FzZSBBV0FJVElOR19SRUdJU1RFUl9XUklURToKKyAgICAgICAgLy8gc2V0IHRoZSBPUF9XUklURSBpbnRlcmVzdAorICAgICAgICBzZWxlY3Rpb25LZXlfLmludGVyZXN0T3BzKFNlbGVjdGlvbktleS5PUF9XUklURSk7CisgICAgICAgIHN0YXRlXyA9IEZyYW1lQnVmZmVyU3RhdGUuV1JJVElORzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFXQUlUSU5HX1JFR0lTVEVSX1JFQUQ6CisgICAgICAgIHByZXBhcmVSZWFkKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBV0FJVElOR19DTE9TRToKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgc2VsZWN0aW9uS2V5Xy5jYW5jZWwoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBMT0dHRVIuZXJyb3IoCisgICAgICAgICAgICAiY2hhbmdlU2VsZWN0SW50ZXJlc3Qgd2FzIGNhbGxlZCwgYnV0IHN0YXRlIGlzIGludmFsaWQgKHt9KSIsCisgICAgICAgICAgICBzdGF0ZV8pOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNodXQgdGhlIGNvbm5lY3Rpb24gZG93bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgIC8vIGlmIHdlJ3JlIGJlaW5nIGNsb3NlZCBkdWUgdG8gYW4gZXJyb3IsIHdlIG1pZ2h0IGhhdmUgYWxsb2NhdGVkIGEKKyAgICAgIC8vIGJ1ZmZlciB0aGF0IHdlIG5lZWQgdG8gc3VidHJhY3QgZm9yIG91ciBtZW1vcnkgYWNjb3VudGluZy4KKyAgICAgIGlmIChzdGF0ZV8gPT0gRnJhbWVCdWZmZXJTdGF0ZS5SRUFESU5HX0ZSQU1FIHx8CisgICAgICAgICAgc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuUkVBRF9GUkFNRV9DT01QTEVURSB8fAorICAgICAgICAgIHN0YXRlXyA9PSBGcmFtZUJ1ZmZlclN0YXRlLkFXQUlUSU5HX0NMT1NFKSB7CisgICAgICAgIHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZC5hZGRBbmRHZXQoLWJ1ZmZlcl8uYXJyYXkoKS5sZW5ndGgpOworICAgICAgfQorICAgICAgdHJhbnNfLmNsb3NlKCk7CisgICAgICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBudWxsKSB7CisgICAgICAgIGV2ZW50SGFuZGxlcl8uZGVsZXRlQ29udGV4dChjb250ZXh0XywgaW5Qcm90Xywgb3V0UHJvdF8pOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoaXMgRnJhbWVCdWZmZXIgaGFzIGEgZnVsbCBmcmFtZSByZWFkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRnJhbWVGdWxseVJlYWQoKSB7CisgICAgICByZXR1cm4gc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuUkVBRF9GUkFNRV9DT01QTEVURTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZnRlciB0aGUgcHJvY2Vzc29yIGhhcyBwcm9jZXNzZWQgdGhlIGludm9jYXRpb24sIHdoYXRldmVyIHRocmVhZCBpcworICAgICAqIG1hbmFnaW5nIGludm9jYXRpb25zIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIG9uIHRoaXMgRnJhbWVCdWZmZXIgc28gd2UKKyAgICAgKiBrbm93IGl0J3MgdGltZSB0byBzdGFydCB0cnlpbmcgdG8gd3JpdGUgYWdhaW4uIEFsc28sIGlmIGl0IHR1cm5zIG91dCB0aGF0CisgICAgICogdGhlcmUgYWN0dWFsbHkgaXNuJ3QgYW55IGRhdGEgaW4gdGhlIHJlc3BvbnNlIGJ1ZmZlciwgd2UnbGwgc2tpcCB0cnlpbmcKKyAgICAgKiB0byB3cml0ZSBhbmQgaW5zdGVhZCBnbyBiYWNrIHRvIHJlYWRpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzcG9uc2VSZWFkeSgpIHsKKyAgICAgIC8vIHRoZSByZWFkIGJ1ZmZlciBpcyBkZWZpbml0ZWx5IG5vIGxvbmdlciBpbiB1c2UsIHNvIHdlIHdpbGwgZGVjcmVtZW50CisgICAgICAvLyBvdXIgcmVhZCBidWZmZXIgY291bnQuIHdlIGRvIHRoaXMgaGVyZSBhcyB3ZWxsIGFzIGluIGNsb3NlIGJlY2F1c2UKKyAgICAgIC8vIHdlJ2QgbGlrZSB0byBmcmVlIHRoaXMgcmVhZCBtZW1vcnkgdXAgYXMgcXVpY2tseSBhcyBwb3NzaWJsZSBmb3Igb3RoZXIKKyAgICAgIC8vIGNsaWVudHMuCisgICAgICByZWFkQnVmZmVyQnl0ZXNBbGxvY2F0ZWQuYWRkQW5kR2V0KC1idWZmZXJfLmFycmF5KCkubGVuZ3RoKTsKKworICAgICAgaWYgKHJlc3BvbnNlXy5sZW4oKSA9PSAwKSB7CisgICAgICAgIC8vIGdvIHN0cmFpZ2h0IHRvIHJlYWRpbmcgYWdhaW4uIHRoaXMgd2FzIHByb2JhYmx5IGFuIG9uZXdheSBtZXRob2QKKyAgICAgICAgc3RhdGVfID0gRnJhbWVCdWZmZXJTdGF0ZS5BV0FJVElOR19SRUdJU1RFUl9SRUFEOworICAgICAgICBidWZmZXJfID0gbnVsbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZmZlcl8gPSBCeXRlQnVmZmVyLndyYXAocmVzcG9uc2VfLmdldCgpLCAwLCByZXNwb25zZV8ubGVuKCkpOworCisgICAgICAgIC8vIHNldCBzdGF0ZSB0aGF0IHdlJ3JlIHdhaXRpbmcgdG8gYmUgc3dpdGNoZWQgdG8gd3JpdGUuIHdlIGRvIHRoaXMKKyAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgdGhyb3VnaCByZXF1ZXN0U2VsZWN0SW50ZXJlc3RDaGFuZ2UoKSBiZWNhdXNlIHRoZXJlIGlzCisgICAgICAgIC8vIGEgcG9zc2liaWxpdHkgdGhhdCB3ZSdyZSBub3QgaW4gdGhlIG1haW4gdGhyZWFkLCBhbmQgdGh1cyBjdXJyZW50bHkKKyAgICAgICAgLy8gYmxvY2tlZCBpbiBzZWxlY3QoKS4gKHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBpbiBwbGFjZSBmb3IgdGhlIHNha2Ugb2YKKyAgICAgICAgLy8gdGhlIEhzSGEgc2VydmVyLikKKyAgICAgICAgc3RhdGVfID0gRnJhbWVCdWZmZXJTdGF0ZS5BV0FJVElOR19SRUdJU1RFUl9XUklURTsKKyAgICAgIH0KKyAgICAgIHJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjdHVhbGx5IGludm9rZSB0aGUgbWV0aG9kIHNpZ25pZmllZCBieSB0aGlzIEZyYW1lQnVmZmVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZSgpIHsKKyAgICAgIGZyYW1lVHJhbnNfLnJlc2V0KGJ1ZmZlcl8uYXJyYXkoKSk7CisgICAgICByZXNwb25zZV8ucmVzZXQoKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gbnVsbCkgeworICAgICAgICAgIGV2ZW50SGFuZGxlcl8ucHJvY2Vzc0NvbnRleHQoY29udGV4dF8sIGluVHJhbnNfLCBvdXRUcmFuc18pOworICAgICAgICB9CisgICAgICAgIHByb2Nlc3NvckZhY3RvcnlfLmdldFByb2Nlc3NvcihpblRyYW5zXykucHJvY2VzcyhpblByb3RfLCBvdXRQcm90Xyk7CisgICAgICAgIHJlc3BvbnNlUmVhZHkoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgICBMT0dHRVIud2FybigiRXhjZXB0aW9uIHdoaWxlIGludm9raW5nISIsIHRlKTsKKyAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgIExPR0dFUi5lcnJvcigiVW5leHBlY3RlZCB0aHJvd2FibGUgd2hpbGUgaW52b2tpbmchIiwgdCk7CisgICAgICB9CisgICAgICAvLyBUaGlzIHdpbGwgb25seSBiZSByZWFjaGVkIHdoZW4gdGhlcmUgaXMgYSB0aHJvd2FibGUuCisgICAgICBzdGF0ZV8gPSBGcmFtZUJ1ZmZlclN0YXRlLkFXQUlUSU5HX0NMT1NFOworICAgICAgcmVxdWVzdFNlbGVjdEludGVyZXN0Q2hhbmdlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybSBhIHJlYWQgaW50byBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWQgc3VjY2VlZGVkLCBmYWxzZSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igb3IgdGhlCisgICAgICogICAgICAgICBjb25uZWN0aW9uIGNsb3NlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaW50ZXJuYWxSZWFkKCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKHRyYW5zXy5yZWFkKGJ1ZmZlcl8pIDwgMCkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTE9HR0VSLndhcm4oIkdvdCBhbiBJT0V4Y2VwdGlvbiBpbiBpbnRlcm5hbFJlYWQhIiwgZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXZSdyZSBkb25lIHdyaXRpbmcsIHNvIHJlc2V0IG91ciBpbnRlcmVzdCBvcHMgYW5kIGNoYW5nZSBzdGF0ZQorICAgICAqIGFjY29yZGluZ2x5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwcmVwYXJlUmVhZCgpIHsKKyAgICAgIC8vIHdlIGNhbiBzZXQgb3VyIGludGVyZXN0IGRpcmVjdGx5IHdpdGhvdXQgdXNpbmcgdGhlIHF1ZXVlIGJlY2F1c2UKKyAgICAgIC8vIHdlJ3JlIGluIHRoZSBzZWxlY3QgdGhyZWFkLgorICAgICAgc2VsZWN0aW9uS2V5Xy5pbnRlcmVzdE9wcyhTZWxlY3Rpb25LZXkuT1BfUkVBRCk7CisgICAgICAvLyBnZXQgcmVhZHkgZm9yIGFub3RoZXIgZ28tYXJvdW5kCisgICAgICBidWZmZXJfID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg0KTsKKyAgICAgIHN0YXRlXyA9IEZyYW1lQnVmZmVyU3RhdGUuUkVBRElOR19GUkFNRV9TSVpFOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZW4gdGhpcyBGcmFtZUJ1ZmZlciBuZWVkcyB0byBjaGFuZ2UgaXRzIHNlbGVjdCBpbnRlcmVzdHMgYW5kIGV4ZWN1dGlvbgorICAgICAqIG1pZ2h0IG5vdCBiZSBpbiBpdHMgc2VsZWN0IHRocmVhZCwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIG1ha2Ugc3VyZSB0aGUKKyAgICAgKiBpbnRlcmVzdCBjaGFuZ2UgZ2V0cyBkb25lIHdoZW4gdGhlIHNlbGVjdCB0aHJlYWQgd2FrZXMgYmFjayB1cC4gV2hlbiB0aGUKKyAgICAgKiBjdXJyZW50IHRocmVhZCBpcyB0aGlzIEZyYW1lQnVmZmVyJ3Mgc2VsZWN0IHRocmVhZCwgdGhlbiBpdCBqdXN0IGRvZXMgdGhlCisgICAgICogaW50ZXJlc3QgY2hhbmdlIGltbWVkaWF0ZWx5LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZSgpIHsKKyAgICAgIGlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpID09IHRoaXMuc2VsZWN0VGhyZWFkXykgeworICAgICAgICBjaGFuZ2VTZWxlY3RJbnRlcmVzdHMoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuc2VsZWN0VGhyZWFkXy5yZXF1ZXN0U2VsZWN0SW50ZXJlc3RDaGFuZ2UodGhpcyk7CisgICAgICB9CisgICAgfQorICB9IC8vIEZyYW1lQnVmZmVyCisKKyAgcHVibGljIGNsYXNzIEFzeW5jRnJhbWVCdWZmZXIgZXh0ZW5kcyBGcmFtZUJ1ZmZlciB7CisgICAgcHVibGljIEFzeW5jRnJhbWVCdWZmZXIoVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zLCBTZWxlY3Rpb25LZXkgc2VsZWN0aW9uS2V5LCBBYnN0cmFjdFNlbGVjdFRocmVhZCBzZWxlY3RUaHJlYWQpIHsKKyAgICAgIHN1cGVyKHRyYW5zLCBzZWxlY3Rpb25LZXksIHNlbGVjdFRocmVhZCk7CisgICAgfQorCisgICAgcHVibGljIFRQcm90b2NvbCBnZXRJbnB1dFByb3RvY29sKCkgeworICAgICAgcmV0dXJuICBpblByb3RfOworICAgIH0KKworICAgIHB1YmxpYyBUUHJvdG9jb2wgZ2V0T3V0cHV0UHJvdG9jb2woKSB7CisgICAgICByZXR1cm4gb3V0UHJvdF87CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBpbnZva2UoKSB7CisgICAgICBmcmFtZVRyYW5zXy5yZXNldChidWZmZXJfLmFycmF5KCkpOworICAgICAgcmVzcG9uc2VfLnJlc2V0KCk7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKKyAgICAgICAgICBldmVudEhhbmRsZXJfLnByb2Nlc3NDb250ZXh0KGNvbnRleHRfLCBpblRyYW5zXywgb3V0VHJhbnNfKTsKKyAgICAgICAgfQorICAgICAgICAoKFRBc3luY1Byb2Nlc3Nvcilwcm9jZXNzb3JGYWN0b3J5Xy5nZXRQcm9jZXNzb3IoaW5UcmFuc18pKS5wcm9jZXNzKHRoaXMpOworICAgICAgICByZXR1cm47CisgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIHRlKSB7CisgICAgICAgIExPR0dFUi53YXJuKCJFeGNlcHRpb24gd2hpbGUgaW52b2tpbmchIiwgdGUpOworICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgTE9HR0VSLmVycm9yKCJVbmV4cGVjdGVkIHRocm93YWJsZSB3aGlsZSBpbnZva2luZyEiLCB0KTsKKyAgICAgIH0KKyAgICAgIC8vIFRoaXMgd2lsbCBvbmx5IGJlIHJlYWNoZWQgd2hlbiB0aGVyZSBpcyBhIHRocm93YWJsZS4KKyAgICAgIHN0YXRlXyA9IEZyYW1lQnVmZmVyU3RhdGUuQVdBSVRJTkdfQ0xPU0U7CisgICAgICByZXF1ZXN0U2VsZWN0SW50ZXJlc3RDaGFuZ2UoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvSW52b2NhdGlvbi5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9JbnZvY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyMTBmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvSW52b2NhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLkFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuRnJhbWVCdWZmZXI7CisKKy8qKgorICogQW4gSW52b2NhdGlvbiByZXByZXNlbnRzIGEgbWV0aG9kIGNhbGwgdGhhdCBpcyBwcmVwYXJlZCB0byBleGVjdXRlLCBnaXZlbgorICogYW4gaWRsZSB3b3JrZXIgdGhyZWFkLiBJdCBjb250YWlucyB0aGUgaW5wdXQgYW5kIG91dHB1dCBwcm90b2NvbHMgdGhlCisgKiB0aHJlYWQncyBwcm9jZXNzb3Igc2hvdWxkIHVzZSB0byBwZXJmb3JtIHRoZSB1c3VhbCBUaHJpZnQgaW52b2NhdGlvbi4KKyAqLworY2xhc3MgSW52b2NhdGlvbiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgcHJpdmF0ZSBmaW5hbCBGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlcjsKKworICBwdWJsaWMgSW52b2NhdGlvbihmaW5hbCBGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlcikgeworICAgIHRoaXMuZnJhbWVCdWZmZXIgPSBmcmFtZUJ1ZmZlcjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICBmcmFtZUJ1ZmZlci5pbnZva2UoKTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvU2VydmVyQ29udGV4dC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9TZXJ2ZXJDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIwYjk5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvU2VydmVyQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIHN0b3Jpbmcgc2VydmVyJ3MgY29ubmVjdGlvbiBjb250ZXh0CisgKi8KKyAKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOworCitwdWJsaWMgaW50ZXJmYWNlIFNlcnZlckNvbnRleHQge30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEV4dGVuc2libGVTZXJ2bGV0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RFeHRlbnNpYmxlU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MDgyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RFeHRlbnNpYmxlU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCisvKioKKyAqIFNlcnZsZXQgaW1wbGVtZW50YXRpb24gY2xhc3MgVGhyaWZ0U2VydmVyLCB0aGF0IGFsbG93cyB7QGxpbmsgVFByb2Nlc3Nvcn0gYW5kCisgKiB7QGxpbmsgVFByb3RvY29sRmFjdG9yeX0gdG8gYmUgc3VwcGxpZWQgYWZ0ZXIgdGhlIHtAbGluayAjaW5pdCgpfSBtZXRob2QgaGFzCisgKiBmaW5pc2hlZC4gPGJyPgorICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgYWJzdHJhY3QgbWV0aG9kcyB0aGF0IHJldHVybiB0aGUgVFByb2Nlc3NvciBhbmQKKyAqIHR3byBUUHJvdG9jb2xGYWN0b3J5LiBUaG9zZSBtZXRob2RzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UsCisgKiBhbmQgdGhhdCB7QGxpbmsgU2VydmxldENvbnRleHR9IGlzIGF2YWlsYWJsZS4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRFeHRlbnNpYmxlU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgcHJpdmF0ZSBUUHJvY2Vzc29yIHByb2Nlc3NvcjsKKworICBwcml2YXRlIFRQcm90b2NvbEZhY3RvcnkgaW5GYWN0b3J5OworCisgIHByaXZhdGUgVFByb3RvY29sRmFjdG9yeSBvdXRGYWN0b3J5OworCisgIHByaXZhdGUgQ29sbGVjdGlvbjxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBjdXN0b21IZWFkZXJzOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSB7QGxpbmsgVFByb2Nlc3Nvcn0uIFRoaXMgd2lsbCBiZSBjYWxsZWQgPGI+b25jZTwvYj4ganVzdAorICAgKiBhZnRlciB0aGUge0BsaW5rICNpbml0KCl9IG1ldGhvZAorICAgKiAKKyAgICogQHJldHVybiB0aGUgYXBwcm9wcmlhdGUge0BsaW5rIFRQcm9jZXNzb3J9CisgICAqLworICBwcm90ZWN0ZWQgYWJzdHJhY3QgVFByb2Nlc3NvciBnZXRQcm9jZXNzb3IoKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgaW4ge0BsaW5rIFRQcm90b2NvbEZhY3Rvcnl9LiBUaGlzIHdpbGwgYmUgY2FsbGVkCisgICAqIDxiPm9uY2U8L2I+IGp1c3QgYWZ0ZXIgdGhlIHtAbGluayAjaW5pdCgpfSBtZXRob2QKKyAgICogCisgICAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGluIHtAbGluayBUUHJvdG9jb2xGYWN0b3J5fQorICAgKi8KKyAgcHJvdGVjdGVkIGFic3RyYWN0IFRQcm90b2NvbEZhY3RvcnkgZ2V0SW5Qcm90b2NvbEZhY3RvcnkoKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgb3V0IHtAbGluayBUUHJvdG9jb2xGYWN0b3J5fS4gVGhpcyB3aWxsIGJlIGNhbGxlZAorICAgKiA8Yj5vbmNlPC9iPiBqdXN0IGFmdGVyIHRoZSB7QGxpbmsgI2luaXQoKX0gbWV0aG9kCisgICAqIAorICAgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBvdXQge0BsaW5rIFRQcm90b2NvbEZhY3Rvcnl9CisgICAqLworICBwcm90ZWN0ZWQgYWJzdHJhY3QgVFByb3RvY29sRmFjdG9yeSBnZXRPdXRQcm90b2NvbEZhY3RvcnkoKTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGZpbmFsIHZvaWQgaW5pdChTZXJ2bGV0Q29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgIHN1cGVyLmluaXQoY29uZmlnKTsgLy9uby1hcmdzIGluaXQoKSBoYXBwZW5zIGhlcmUKKyAgICB0aGlzLnByb2Nlc3NvciA9IGdldFByb2Nlc3NvcigpOworICAgIHRoaXMuaW5GYWN0b3J5ID0gZ2V0SW5Qcm90b2NvbEZhY3RvcnkoKTsKKyAgICB0aGlzLm91dEZhY3RvcnkgPSBnZXRPdXRQcm90b2NvbEZhY3RvcnkoKTsKKyAgICB0aGlzLmN1c3RvbUhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+KCk7CisKKyAgICBpZiAocHJvY2Vzc29yID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJwcm9jZXNzb3IgbXVzdCBiZSBzZXQiKTsKKyAgICB9CisgICAgaWYgKGluRmFjdG9yeSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigiaW5GYWN0b3J5IG11c3QgYmUgc2V0Iik7CisgICAgfQorICAgIGlmIChvdXRGYWN0b3J5ID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJvdXRGYWN0b3J5IG11c3QgYmUgc2V0Iik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEBzZWUgSHR0cFNlcnZsZXQjZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlCisgICAqICAgICAgcmVzcG9uc2UpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBUVHJhbnNwb3J0IGluVHJhbnNwb3J0ID0gbnVsbDsKKyAgICBUVHJhbnNwb3J0IG91dFRyYW5zcG9ydCA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL3gtdGhyaWZ0Iik7CisKKyAgICAgIGlmIChudWxsICE9IHRoaXMuY3VzdG9tSGVhZGVycykgeworCWZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBoZWFkZXIgOiB0aGlzLmN1c3RvbUhlYWRlcnMpIHsKKwkgIHJlc3BvbnNlLmFkZEhlYWRlcihoZWFkZXIuZ2V0S2V5KCksIGhlYWRlci5nZXRWYWx1ZSgpKTsKKwl9CisgICAgICB9CisKKyAgICAgIElucHV0U3RyZWFtIGluID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpOworCisgICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG5ldyBUSU9TdHJlYW1UcmFuc3BvcnQoaW4sIG91dCk7CisgICAgICBpblRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICAgIG91dFRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKworICAgICAgVFByb3RvY29sIGluUHJvdG9jb2wgPSBpbkZhY3RvcnkuZ2V0UHJvdG9jb2woaW5UcmFuc3BvcnQpOworICAgICAgVFByb3RvY29sIG91dFByb3RvY29sID0gaW5GYWN0b3J5LmdldFByb3RvY29sKG91dFRyYW5zcG9ydCk7CisKKyAgICAgIHByb2Nlc3Nvci5wcm9jZXNzKGluUHJvdG9jb2wsIG91dFByb3RvY29sKTsKKyAgICAgIG91dC5mbHVzaCgpOworICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gdGUpIHsKKyAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKHRlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQHNlZSBIdHRwU2VydmxldCNkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZQorICAgKiAgICAgIHJlc3BvbnNlKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKKyAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgZG9Qb3N0KHJlcSwgcmVzcCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRDdXN0b21IZWFkZXIoZmluYWwgU3RyaW5nIGtleSwgZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgdGhpcy5jdXN0b21IZWFkZXJzLmFkZChuZXcgTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPigpIHsKKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCXJldHVybiBrZXk7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJcmV0dXJuIHZhbHVlOworICAgICAgfQorCisgICAgICBwdWJsaWMgU3RyaW5nIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworCXJldHVybiBudWxsOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0Q3VzdG9tSGVhZGVycyhDb2xsZWN0aW9uPE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGhlYWRlcnMpIHsKKyAgICB0aGlzLmN1c3RvbUhlYWRlcnMuY2xlYXIoKTsKKyAgICB0aGlzLmN1c3RvbUhlYWRlcnMuYWRkQWxsKGhlYWRlcnMpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RIc0hhU2VydmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RIc0hhU2VydmVyLmphdmEKaW5kZXggZjNkZmQwYS4uNGM1ZDdiNSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9USHNIYVNlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEhzSGFTZXJ2ZXIuamF2YQpAQCAtMjcsMTkgKzI3LDE2IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0OwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIC8qKgogICogQW4gZXh0ZW5zaW9uIG9mIHRoZSBUTm9uYmxvY2tpbmdTZXJ2ZXIgdG8gYSBIYWxmLVN5bmMvSGFsZi1Bc3luYyBzZXJ2ZXIuCiAgKiBMaWtlIFROb25ibG9ja2luZ1NlcnZlciwgaXQgcmVsaWVzIG9uIHRoZSB1c2Ugb2YgVEZyYW1lZFRyYW5zcG9ydC4KICAqLwogcHVibGljIGNsYXNzIFRIc0hhU2VydmVyIGV4dGVuZHMgVE5vbmJsb2NraW5nU2VydmVyIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9Ci0gICAgTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVEhzSGFTZXJ2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIEFyZ3MgZXh0ZW5kcyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJnczxBcmdzPiB7Ci0gICAgcHJpdmF0ZSBpbnQgd29ya2VyVGhyZWFkcyA9IDU7CisgICAgcHVibGljIGludCBtaW5Xb3JrZXJUaHJlYWRzID0gNTsKKyAgICBwdWJsaWMgaW50IG1heFdvcmtlclRocmVhZHMgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKICAgICBwcml2YXRlIGludCBzdG9wVGltZW91dFZhbCA9IDYwOwogICAgIHByaXZhdGUgVGltZVVuaXQgc3RvcFRpbWVvdXRVbml0ID0gVGltZVVuaXQuU0VDT05EUzsKICAgICBwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UgPSBudWxsOwpAQCAtNDgsMTMgKzQ1LDQ0IEBACiAgICAgICBzdXBlcih0cmFuc3BvcnQpOwogICAgIH0KIAotICAgIHB1YmxpYyBBcmdzIHdvcmtlclRocmVhZHMoaW50IGkpIHsKLSAgICAgIHdvcmtlclRocmVhZHMgPSBpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWluIGFuZCBtYXggdGhyZWFkcy4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI21pbldvcmtlclRocmVhZHMoaW50KX0gYW5kIHtAbGluayAjbWF4V29ya2VyVGhyZWFkcyhpbnQpfSAgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBBcmdzIHdvcmtlclRocmVhZHMoaW50IG4pIHsKKyAgICAgIG1pbldvcmtlclRocmVhZHMgPSBuOworICAgICAgbWF4V29ya2VyVGhyZWFkcyA9IG47CiAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHdoYXQgdGhlIG1pbiB0aHJlYWRzIHdhcyBzZXQgdG8uCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0TWluV29ya2VyVGhyZWFkcygpfSBhbmQge0BsaW5rICNnZXRNYXhXb3JrZXJUaHJlYWRzKCl9IGluc3RlYWQuCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgaW50IGdldFdvcmtlclRocmVhZHMoKSB7Ci0gICAgICByZXR1cm4gd29ya2VyVGhyZWFkczsKKyAgICAgIHJldHVybiBtaW5Xb3JrZXJUaHJlYWRzOworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIG1pbldvcmtlclRocmVhZHMoaW50IG4pIHsKKyAgICAgIG1pbldvcmtlclRocmVhZHMgPSBuOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEFyZ3MgbWF4V29ya2VyVGhyZWFkcyhpbnQgbikgeworICAgICAgbWF4V29ya2VyVGhyZWFkcyA9IG47CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1pbldvcmtlclRocmVhZHMoKSB7CisgICAgICByZXR1cm4gbWluV29ya2VyVGhyZWFkczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1heFdvcmtlclRocmVhZHMoKSB7CisgICAgICByZXR1cm4gbWF4V29ya2VyVGhyZWFkczsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGdldFN0b3BUaW1lb3V0VmFsKCkgewpAQCAtODUsNjMgKzExMyw1MiBAQAogICAgIH0KICAgfQogCisKICAgLy8gVGhpcyB3cmFwcyBhbGwgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgcXVldWVpbmcgYW5kIHRocmVhZCBwb29sIG1hbmFnZW1lbnQKICAgLy8gZm9yIHRoZSBwYXNzaW5nIG9mIEludm9jYXRpb25zIGZyb20gdGhlIFNlbGVjdG9yIHRvIHdvcmtlcnMuCi0gIHByaXZhdGUgRXhlY3V0b3JTZXJ2aWNlIGludm9rZXI7CisgIHByaXZhdGUgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGludm9rZXI7CisKKyAgcHJpdmF0ZSBmaW5hbCBBcmdzIGFyZ3M7CiAKICAgLyoqCi0gICAqIENyZWF0ZSBzZXJ2ZXIgd2l0aCBldmVyeSBvcHRpb24gZnVsbHkgc3BlY2lmaWVkLCBhbmQgd2l0aCBhbiBpbmplY3RlZAotICAgKiBFeGVjdXRvclNlcnZpY2UKKyAgICogQ3JlYXRlIHRoZSBzZXJ2ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIEFyZ3MgY29uZmlndXJhdGlvbgogICAgKi8KICAgcHVibGljIFRIc0hhU2VydmVyKEFyZ3MgYXJncykgewogICAgIHN1cGVyKGFyZ3MpOwogCiAgICAgaW52b2tlciA9IGFyZ3MuZXhlY3V0b3JTZXJ2aWNlID09IG51bGwgPyBjcmVhdGVJbnZva2VyUG9vbChhcmdzKSA6IGFyZ3MuZXhlY3V0b3JTZXJ2aWNlOworICAgIHRoaXMuYXJncyA9IGFyZ3M7CiAgIH0KIAotICAvKiogQGluaGVyaXREb2MgKi8KKyAgLyoqCisgICAqIHtAaW5oZXJpdERvY30KKyAgICovCiAgIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBzZXJ2ZSgpIHsKLSAgICAvLyBzdGFydCBsaXN0ZW5pbmcsIG9yIGV4aXQKLSAgICBpZiAoIXN0YXJ0TGlzdGVuaW5nKCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBzdGFydCB0aGUgc2VsZWN0b3IsIG9yIGV4aXQKLSAgICBpZiAoIXN0YXJ0U2VsZWN0b3JUaHJlYWQoKSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNldFNlcnZpbmcodHJ1ZSk7Ci0KLSAgICAvLyB0aGlzIHdpbGwgYmxvY2sgd2hpbGUgd2Ugc2VydmUKKyAgcHJvdGVjdGVkIHZvaWQgd2FpdEZvclNodXRkb3duKCkgewogICAgIGpvaW5TZWxlY3RvcigpOwotCiAgICAgZ3JhY2VmdWxseVNodXRkb3duSW52b2tlclBvb2woKTsKLQotICAgIHNldFNlcnZpbmcoZmFsc2UpOwotCi0gICAgLy8gZG8gYSBsaXR0bGUgY2xlYW51cAotICAgIHN0b3BMaXN0ZW5pbmcoKTsKLQotICAgIC8vIHVuZ3JhY2VmdWxseSBzaHV0IGRvd24gdGhlIGludm9rZXIgcG9vbD8KICAgfQogCiAgIC8qKgogICAgKiBIZWxwZXIgdG8gY3JlYXRlIGFuIGludm9rZXIgcG9vbAogICAgKi8KICAgcHJvdGVjdGVkIHN0YXRpYyBFeGVjdXRvclNlcnZpY2UgY3JlYXRlSW52b2tlclBvb2woQXJncyBvcHRpb25zKSB7Ci0gICAgaW50IHdvcmtlclRocmVhZHMgPSBvcHRpb25zLndvcmtlclRocmVhZHM7CisgICAgaW50IG1pbldvcmtlclRocmVhZHMgPSBvcHRpb25zLm1pbldvcmtlclRocmVhZHM7CisgICAgaW50IG1heFdvcmtlclRocmVhZHMgPSBvcHRpb25zLm1heFdvcmtlclRocmVhZHM7CiAgICAgaW50IHN0b3BUaW1lb3V0VmFsID0gb3B0aW9ucy5zdG9wVGltZW91dFZhbDsKICAgICBUaW1lVW5pdCBzdG9wVGltZW91dFVuaXQgPSBvcHRpb25zLnN0b3BUaW1lb3V0VW5pdDsKIAogICAgIExpbmtlZEJsb2NraW5nUXVldWU8UnVubmFibGU+IHF1ZXVlID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8UnVubmFibGU+KCk7Ci0gICAgRXhlY3V0b3JTZXJ2aWNlIGludm9rZXIgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKHdvcmtlclRocmVhZHMsIHdvcmtlclRocmVhZHMsCi0gICAgICBzdG9wVGltZW91dFZhbCwgc3RvcFRpbWVvdXRVbml0LCBxdWV1ZSk7CisgICAgRXhlY3V0b3JTZXJ2aWNlIGludm9rZXIgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKG1pbldvcmtlclRocmVhZHMsCisgICAgICBtYXhXb3JrZXJUaHJlYWRzLCBzdG9wVGltZW91dFZhbCwgc3RvcFRpbWVvdXRVbml0LCBxdWV1ZSk7CiAKICAgICByZXR1cm4gaW52b2tlcjsKICAgfQogCisgIHByb3RlY3RlZCBFeGVjdXRvclNlcnZpY2UgZ2V0SW52b2tlcigpIHsKKyAgICByZXR1cm4gaW52b2tlcjsKKyAgfQorCiAgIHByb3RlY3RlZCB2b2lkIGdyYWNlZnVsbHlTaHV0ZG93bkludm9rZXJQb29sKCkgewogICAgIC8vIHRyeSB0byBncmFjZWZ1bGx5IHNodXQgZG93biB0aGUgZXhlY3V0b3Igc2VydmljZQogICAgIGludm9rZXIuc2h1dGRvd24oKTsKQEAgLTE1MCw3ICsxNjcsNyBAQAogICAgIC8vIGV4Y2VwdGlvbi4gSWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlbiB3ZSdsbCBzaHV0IGRvd24gcHJlbWF0dXJlbHkuIFdlIHdhbnQKICAgICAvLyB0byBsZXQgdGhlIGV4ZWN1dG9yU2VydmljZSBjbGVhciBpdCdzIHRhc2sgcXVldWUsIGNsb3NpbmcgY2xpZW50IHNvY2tldHMKICAgICAvLyBhcHByb3ByaWF0ZWx5LgotICAgIGxvbmcgdGltZW91dE1TID0gMTAwMDA7CisgICAgbG9uZyB0aW1lb3V0TVMgPSBhcmdzLnN0b3BUaW1lb3V0VW5pdC50b01pbGxpcyhhcmdzLnN0b3BUaW1lb3V0VmFsKTsKICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgIHdoaWxlICh0aW1lb3V0TVMgPj0gMCkgewogICAgICAgdHJ5IHsKQEAgLTE2Niw3ICsxODMsOCBAQAogCiAgIC8qKgogICAgKiBXZSBvdmVycmlkZSB0aGUgc3RhbmRhcmQgaW52b2tlIG1ldGhvZCBoZXJlIHRvIHF1ZXVlIHRoZSBpbnZvY2F0aW9uIGZvcgotICAgKiBpbnZva2VyIHNlcnZpY2UgaW5zdGVhZCBvZiBpbW1lZGlhdGVseSBpbnZva2luZy4gVGhlIHRocmVhZCBwb29sIHRha2VzIGNhcmUgb2YgdGhlIHJlc3QuCisgICAqIGludm9rZXIgc2VydmljZSBpbnN0ZWFkIG9mIGltbWVkaWF0ZWx5IGludm9raW5nLiBUaGUgdGhyZWFkIHBvb2wgdGFrZXMgY2FyZQorICAgKiBvZiB0aGUgcmVzdC4KICAgICovCiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgYm9vbGVhbiByZXF1ZXN0SW52b2tlKEZyYW1lQnVmZmVyIGZyYW1lQnVmZmVyKSB7CkBAIC0xODEsMjQgKzE5OSw2IEBACiAgIH0KIAogICBwcm90ZWN0ZWQgUnVubmFibGUgZ2V0UnVubmFibGUoRnJhbWVCdWZmZXIgZnJhbWVCdWZmZXIpewotCXJldHVybiBuZXcgSW52b2NhdGlvbihmcmFtZUJ1ZmZlcik7Ci0gIH0KLQotICAvKioKLSAgICogQW4gSW52b2NhdGlvbiByZXByZXNlbnRzIGEgbWV0aG9kIGNhbGwgdGhhdCBpcyBwcmVwYXJlZCB0byBleGVjdXRlLCBnaXZlbgotICAgKiBhbiBpZGxlIHdvcmtlciB0aHJlYWQuIEl0IGNvbnRhaW5zIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29scyB0aGUKLSAgICogdGhyZWFkJ3MgcHJvY2Vzc29yIHNob3VsZCB1c2UgdG8gcGVyZm9ybSB0aGUgdXN1YWwgVGhyaWZ0IGludm9jYXRpb24uCi0gICAqLwotICBwcml2YXRlIGNsYXNzIEludm9jYXRpb24gaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEZyYW1lQnVmZmVyIGZyYW1lQnVmZmVyOwotCi0gICAgcHVibGljIEludm9jYXRpb24oZmluYWwgRnJhbWVCdWZmZXIgZnJhbWVCdWZmZXIpIHsKLSAgICAgIHRoaXMuZnJhbWVCdWZmZXIgPSBmcmFtZUJ1ZmZlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICBmcmFtZUJ1ZmZlci5pbnZva2UoKTsKLSAgICB9CisgICAgcmV0dXJuIG5ldyBJbnZvY2F0aW9uKGZyYW1lQnVmZmVyKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmphdmEKaW5kZXggZDQ0ZDQ2MC4uZmUwMzY1YSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5qYXZhCkBAIC0yMCwyOCArMjAsMTMgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXI7CiAKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5SW5wdXRUcmFuc3BvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiAKIC8qKgogICogQSBub25ibG9ja2luZyBUU2VydmVyIGltcGxlbWVudGF0aW9uLiBUaGlzIGFsbG93cyBmb3IgZmFpcm5lc3MgYW1vbmdzdCBhbGwKQEAgLTU0LDkgKzM5LDcgQEAKICAqIHRyYW5zcG9ydCwgb3RoZXJ3aXNlIHRoaXMgc2VydmVyIHdpbGwgYmUgdW5hYmxlIHRvIGRldGVybWluZSB3aGVuIGEgd2hvbGUKICAqIG1ldGhvZCBjYWxsIGhhcyBiZWVuIHJlYWQgb2ZmIHRoZSB3aXJlLiBDbGllbnRzIG11c3QgYWxzbyB1c2UgVEZyYW1lZFRyYW5zcG9ydC4KICAqLwotcHVibGljIGNsYXNzIFROb25ibG9ja2luZ1NlcnZlciBleHRlbmRzIFRTZXJ2ZXIgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0KLSAgICBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUTm9uYmxvY2tpbmdTZXJ2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKK3B1YmxpYyBjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXIgZXh0ZW5kcyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyIHsKIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIEFyZ3MgZXh0ZW5kcyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJnczxBcmdzPiB7CiAgICAgcHVibGljIEFyZ3MoVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHRyYW5zcG9ydCkgewpAQCAtNjQsOTcgKzQ3LDI1IEBACiAgICAgfQogICB9CiAKLSAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJnczxUIGV4dGVuZHMgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlckFyZ3M8VD4+IGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBcmdzPFQ+IHsKLSAgICBwdWJsaWMgbG9uZyBtYXhSZWFkQnVmZmVyQnl0ZXMgPSBMb25nLk1BWF9WQUxVRTsKLQotICAgIHB1YmxpYyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJncyhUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgdHJhbnNwb3J0KSB7Ci0gICAgICBzdXBlcih0cmFuc3BvcnQpOwotICAgICAgdHJhbnNwb3J0RmFjdG9yeShuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCkpOwotICAgIH0KLSAgfQotCi0gIC8vIEZsYWcgZm9yIHN0b3BwaW5nIHRoZSBzZXJ2ZXIKLSAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHN0b3BwZWRfID0gdHJ1ZTsKLQotICBwcml2YXRlIFNlbGVjdFRocmVhZCBzZWxlY3RUaHJlYWRfOwotCi0gIC8qKgotICAgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHdlIHdpbGwgYWxsb2NhdGUgdG8gY2xpZW50IElPIGJ1ZmZlcnMgYXQgYQotICAgKiB0aW1lLiBXaXRob3V0IHRoaXMgbGltaXQsIHRoZSBzZXJ2ZXIgd2lsbCBnbGFkbHkgYWxsb2NhdGUgY2xpZW50IGJ1ZmZlcnMKLSAgICogcmlnaHQgaW50byBhbiBvdXQgb2YgbWVtb3J5IGV4Y2VwdGlvbiwgcmF0aGVyIHRoYW4gd2FpdGluZy4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgbG9uZyBNQVhfUkVBRF9CVUZGRVJfQllURVM7Ci0KLSAgLyoqCi0gICAqIEhvdyBtYW55IGJ5dGVzIGFyZSBjdXJyZW50bHkgYWxsb2NhdGVkIHRvIHJlYWQgYnVmZmVycy4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgQXRvbWljTG9uZyByZWFkQnVmZmVyQnl0ZXNBbGxvY2F0ZWQgPSBuZXcgQXRvbWljTG9uZygwKTsKKyAgcHJpdmF0ZSBTZWxlY3RBY2NlcHRUaHJlYWQgc2VsZWN0QWNjZXB0VGhyZWFkXzsKIAogICBwdWJsaWMgVE5vbmJsb2NraW5nU2VydmVyKEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzIGFyZ3MpIHsKICAgICBzdXBlcihhcmdzKTsKLSAgICBNQVhfUkVBRF9CVUZGRVJfQllURVMgPSBhcmdzLm1heFJlYWRCdWZmZXJCeXRlczsKICAgfQogCi0gIC8qKgotICAgKiBCZWdpbiBhY2NlcHRpbmcgY29ubmVjdGlvbnMgYW5kIHByb2Nlc3NpbmcgaW52b2NhdGlvbnMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXJ2ZSgpIHsKLSAgICAvLyBzdGFydCBsaXN0ZW5pbmcsIG9yIGV4aXQKLSAgICBpZiAoIXN0YXJ0TGlzdGVuaW5nKCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBzdGFydCB0aGUgc2VsZWN0b3IsIG9yIGV4aXQKLSAgICBpZiAoIXN0YXJ0U2VsZWN0b3JUaHJlYWQoKSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNldFNlcnZpbmcodHJ1ZSk7Ci0KLSAgICAvLyB0aGlzIHdpbGwgYmxvY2sgd2hpbGUgd2Ugc2VydmUKLSAgICBqb2luU2VsZWN0b3IoKTsKLQotICAgIHNldFNlcnZpbmcoZmFsc2UpOwotCi0gICAgLy8gZG8gYSBsaXR0bGUgY2xlYW51cAotICAgIHN0b3BMaXN0ZW5pbmcoKTsKLSAgfQogCiAgIC8qKgotICAgKiBIYXZlIHRoZSBzZXJ2ZXIgdHJhbnNwb3J0IHN0YXJ0IGFjY2VwdGluZyBjb25uZWN0aW9ucy4KLSAgICoKLSAgICogQHJldHVybiB0cnVlIGlmIHdlIHN0YXJ0ZWQgbGlzdGVuaW5nIHN1Y2Nlc3NmdWxseSwgZmFsc2UgaWYgc29tZXRoaW5nIHdlbnQKLSAgICogd3JvbmcuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydExpc3RlbmluZygpIHsKLSAgICB0cnkgewotICAgICAgc2VydmVyVHJhbnNwb3J0Xy5saXN0ZW4oKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7Ci0gICAgICBMT0dHRVIuZXJyb3IoIkZhaWxlZCB0byBzdGFydCBsaXN0ZW5pbmcgb24gc2VydmVyIHNvY2tldCEiLCB0dHgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTdG9wIGxpc3RlbmluZyBmb3IgY29ubmVjdGlvbnMuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzdG9wTGlzdGVuaW5nKCkgewotICAgIHNlcnZlclRyYW5zcG9ydF8uY2xvc2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGFydCB0aGUgc2VsZWN0b3IgdGhyZWFkIHJ1bm5pbmcgdG8gZGVhbCB3aXRoIGNsaWVudHMuCisgICAqIFN0YXJ0IHRoZSBzZWxlY3RvciB0aHJlYWQgdG8gZGVhbCB3aXRoIGFjY2VwdHMgYW5kIGNsaWVudCBtZXNzYWdlcy4KICAgICoKICAgICogQHJldHVybiB0cnVlIGlmIGV2ZXJ5dGhpbmcgd2VudCBvaywgZmFsc2UgaWYgd2UgY291bGRuJ3Qgc3RhcnQgZm9yIHNvbWUKICAgICogcmVhc29uLgogICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRTZWxlY3RvclRocmVhZCgpIHsKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0VGhyZWFkcygpIHsKICAgICAvLyBzdGFydCB0aGUgc2VsZWN0b3IKICAgICB0cnkgewotICAgICAgc2VsZWN0VGhyZWFkXyA9IG5ldyBTZWxlY3RUaHJlYWQoKFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydClzZXJ2ZXJUcmFuc3BvcnRfKTsKLSAgICAgIHN0b3BwZWRfID0gZmFsc2U7Ci0gICAgICBzZWxlY3RUaHJlYWRfLnN0YXJ0KCk7CisgICAgICBzZWxlY3RBY2NlcHRUaHJlYWRfID0gbmV3IFNlbGVjdEFjY2VwdFRocmVhZCgoVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0KXNlcnZlclRyYW5zcG9ydF8pOworICAgICAgc2VsZWN0QWNjZXB0VGhyZWFkXy5zdGFydCgpOwogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgTE9HR0VSLmVycm9yKCJGYWlsZWQgdG8gc3RhcnQgc2VsZWN0b3IgdGhyZWFkISIsIGUpOwpAQCAtMTYyLDEzICs3MywxOCBAQAogICAgIH0KICAgfQogCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCB3YWl0Rm9yU2h1dGRvd24oKSB7CisgICAgam9pblNlbGVjdG9yKCk7CisgIH0KKwogICAvKioKLSAgICogQmxvY2sgdW50aWwgdGhlIHNlbGVjdG9yIGV4aXRzLgorICAgKiBCbG9jayB1bnRpbCB0aGUgc2VsZWN0b3IgdGhyZWFkIGV4aXRzLgogICAgKi8KICAgcHJvdGVjdGVkIHZvaWQgam9pblNlbGVjdG9yKCkgewogICAgIC8vIHdhaXQgdW50aWwgdGhlIHNlbGVjdG9yIHRocmVhZCBleGl0cwogICAgIHRyeSB7Ci0gICAgICBzZWxlY3RUaHJlYWRfLmpvaW4oKTsKKyAgICAgIHNlbGVjdEFjY2VwdFRocmVhZF8uam9pbigpOwogICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKICAgICAgIC8vIGZvciBub3csIGp1c3Qgc2lsZW50bHkgaWdub3JlLiB0ZWNobmljYWxseSB0aGlzIG1lYW5zIHdlJ2xsIGhhdmUgbGVzcyBvZgogICAgICAgLy8gYSBncmFjZWZ1bCBzaHV0ZG93biBhcyBhIHJlc3VsdC4KQEAgLTE3OCwxMCArOTQsMTEgQEAKICAgLyoqCiAgICAqIFN0b3Agc2VydmluZyBhbmQgc2h1dCBldmVyeXRoaW5nIGRvd24uCiAgICAqLworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgc3RvcCgpIHsKICAgICBzdG9wcGVkXyA9IHRydWU7Ci0gICAgaWYgKHNlbGVjdFRocmVhZF8gIT0gbnVsbCkgewotICAgICAgc2VsZWN0VGhyZWFkXy53YWtldXBTZWxlY3RvcigpOworICAgIGlmIChzZWxlY3RBY2NlcHRUaHJlYWRfICE9IG51bGwpIHsKKyAgICAgIHNlbGVjdEFjY2VwdFRocmVhZF8ud2FrZXVwU2VsZWN0b3IoKTsKICAgICB9CiAgIH0KIApAQCAtMTg5LDQzICsxMDYsMzMgQEAKICAgICogUGVyZm9ybSBhbiBpbnZvY2F0aW9uLiBUaGlzIG1ldGhvZCBjb3VsZCBiZWhhdmUgc2V2ZXJhbCBkaWZmZXJlbnQgd2F5cwogICAgKiAtIGludm9rZSBpbW1lZGlhdGVseSBpbmxpbmUsIHF1ZXVlIGZvciBzZXBhcmF0ZSBleGVjdXRpb24sIGV0Yy4KICAgICovCisgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgYm9vbGVhbiByZXF1ZXN0SW52b2tlKEZyYW1lQnVmZmVyIGZyYW1lQnVmZmVyKSB7CiAgICAgZnJhbWVCdWZmZXIuaW52b2tlKCk7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAotICAvKioKLSAgICogQSBGcmFtZUJ1ZmZlciB3YW50cyB0byBjaGFuZ2UgaXRzIHNlbGVjdGlvbiBwcmVmZXJlbmNlcywgYnV0IG1pZ2h0IG5vdCBiZQotICAgKiBpbiB0aGUgc2VsZWN0IHRocmVhZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZShGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlcikgewotICAgIHNlbGVjdFRocmVhZF8ucmVxdWVzdFNlbGVjdEludGVyZXN0Q2hhbmdlKGZyYW1lQnVmZmVyKTsKLSAgfQogCiAgIHB1YmxpYyBib29sZWFuIGlzU3RvcHBlZCgpIHsKLSAgICByZXR1cm4gc2VsZWN0VGhyZWFkXy5pc1N0b3BwZWQoKTsKKyAgICByZXR1cm4gc2VsZWN0QWNjZXB0VGhyZWFkXy5pc1N0b3BwZWQoKTsKICAgfQogCiAgIC8qKgogICAgKiBUaGUgdGhyZWFkIHRoYXQgd2lsbCBiZSBkb2luZyBhbGwgdGhlIHNlbGVjdGluZywgbWFuYWdpbmcgbmV3IGNvbm5lY3Rpb25zCiAgICAqIGFuZCB0aG9zZSB0aGF0IHN0aWxsIG5lZWQgdG8gYmUgcmVhZC4KICAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBTZWxlY3RUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworICBwcm90ZWN0ZWQgY2xhc3MgU2VsZWN0QWNjZXB0VGhyZWFkIGV4dGVuZHMgQWJzdHJhY3RTZWxlY3RUaHJlYWQgewogCisgICAgLy8gVGhlIHNlcnZlciB0cmFuc3BvcnQgb24gd2hpY2ggbmV3IGNsaWVudCB0cmFuc3BvcnRzIHdpbGwgYmUgYWNjZXB0ZWQKICAgICBwcml2YXRlIGZpbmFsIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZWxlY3RvciBzZWxlY3RvcjsKLQotICAgIC8vIExpc3Qgb2YgRnJhbWVCdWZmZXJzIHRoYXQgd2FudCB0byBjaGFuZ2UgdGhlaXIgc2VsZWN0aW9uIGludGVyZXN0cy4KLSAgICBwcml2YXRlIGZpbmFsIFNldDxGcmFtZUJ1ZmZlcj4gc2VsZWN0SW50ZXJlc3RDaGFuZ2VzID0KLSAgICAgIG5ldyBIYXNoU2V0PEZyYW1lQnVmZmVyPigpOwogCiAgICAgLyoqCi0gICAgICogU2V0IHVwIHRoZSBTZWxlY3RvclRocmVhZC4KKyAgICAgKiBTZXQgdXAgdGhlIHRocmVhZCB0aGF0IHdpbGwgaGFuZGxlIHRoZSBub24tYmxvY2tpbmcgYWNjZXB0cywgcmVhZHMsIGFuZAorICAgICAqIHdyaXRlcy4KICAgICAgKi8KLSAgICBwdWJsaWMgU2VsZWN0VGhyZWFkKGZpbmFsIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgcHVibGljIFNlbGVjdEFjY2VwdFRocmVhZChmaW5hbCBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQogICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICB0aGlzLnNlcnZlclRyYW5zcG9ydCA9IHNlcnZlclRyYW5zcG9ydDsKLSAgICAgIHRoaXMuc2VsZWN0b3IgPSBTZWxlY3RvclByb3ZpZGVyLnByb3ZpZGVyKCkub3BlblNlbGVjdG9yKCk7CiAgICAgICBzZXJ2ZXJUcmFuc3BvcnQucmVnaXN0ZXJTZWxlY3RvcihzZWxlY3Rvcik7CiAgICAgfQogCkBAIC0yMzksMzggKzE0NiwzMCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgIHRyeSB7CisgICAgICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKKyAgICAgICAgICBldmVudEhhbmRsZXJfLnByZVNlcnZlKCk7CisgICAgICAgIH0KKwogICAgICAgICB3aGlsZSAoIXN0b3BwZWRfKSB7CiAgICAgICAgICAgc2VsZWN0KCk7CiAgICAgICAgICAgcHJvY2Vzc0ludGVyZXN0Q2hhbmdlcygpOwogICAgICAgICB9CisgICAgICAgIGZvciAoU2VsZWN0aW9uS2V5IHNlbGVjdGlvbktleSA6IHNlbGVjdG9yLmtleXMoKSkgeworICAgICAgICAgIGNsZWFudXBTZWxlY3Rpb25LZXkoc2VsZWN0aW9uS2V5KTsKKyAgICAgICAgfQogICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKICAgICAgICAgTE9HR0VSLmVycm9yKCJydW4oKSBleGl0aW5nIGR1ZSB0byB1bmNhdWdodCBlcnJvciIsIHQpOwogICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzZWxlY3Rvci5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgTE9HR0VSLmVycm9yKCJHb3QgYW4gSU9FeGNlcHRpb24gd2hpbGUgY2xvc2luZyBzZWxlY3RvciEiLCBlKTsKKyAgICAgICAgfQogICAgICAgICBzdG9wcGVkXyA9IHRydWU7CiAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSWYgdGhlIHNlbGVjdG9yIGlzIGJsb2NrZWQsIHdha2UgaXQgdXAuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2FrZXVwU2VsZWN0b3IoKSB7Ci0gICAgICBzZWxlY3Rvci53YWtldXAoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgRnJhbWVCdWZmZXIgdG8gdGhlIGxpc3Qgb2Ygc2VsZWN0IGludGVyZXN0IGNoYW5nZXMgYW5kIHdha2UgdXAgdGhlCi0gICAgICogc2VsZWN0b3IgaWYgaXQncyBibG9ja2VkLiBXaGVuIHRoZSBzZWxlY3QoKSBjYWxsIGV4aXRzLCBpdCdsbCBnaXZlIHRoZQotICAgICAqIEZyYW1lQnVmZmVyIGEgY2hhbmNlIHRvIGNoYW5nZSBpdHMgaW50ZXJlc3RzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZShGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlcikgewotICAgICAgc3luY2hyb25pemVkIChzZWxlY3RJbnRlcmVzdENoYW5nZXMpIHsKLSAgICAgICAgc2VsZWN0SW50ZXJlc3RDaGFuZ2VzLmFkZChmcmFtZUJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICAvLyB3YWtldXAgdGhlIHNlbGVjdG9yLCBpZiBpdCdzIGN1cnJlbnRseSBibG9ja2VkLgotICAgICAgc2VsZWN0b3Iud2FrZXVwKCk7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogU2VsZWN0IGFuZCBwcm9jZXNzIElPIGV2ZW50cyBhcHByb3ByaWF0ZWx5OgogICAgICAqIElmIHRoZXJlIGFyZSBjb25uZWN0aW9ucyB0byBiZSBhY2NlcHRlZCwgYWNjZXB0IHRoZW0uCiAgICAgICogSWYgdGhlcmUgYXJlIGV4aXN0aW5nIGNvbm5lY3Rpb25zIHdpdGggZGF0YSB3YWl0aW5nIHRvIGJlIHJlYWQsIHJlYWQgaXQsCkBAIC0yOTEsNyArMTkwLDcgQEAKIAogICAgICAgICAgIC8vIHNraXAgaWYgbm90IHZhbGlkCiAgICAgICAgICAgaWYgKCFrZXkuaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICBjbGVhbnVwU2VsZWN0aW9ua2V5KGtleSk7CisgICAgICAgICAgICBjbGVhbnVwU2VsZWN0aW9uS2V5KGtleSk7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICB9CiAKQEAgLTMxNCwxNyArMjEzLDEyIEBACiAgICAgICB9CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgRnJhbWVCdWZmZXJzIHRoYXQgaGF2ZSBzd2l0Y2hlZCB0aGVpcgotICAgICAqIGludGVyZXN0IHR5cGUgZnJvbSByZWFkIHRvIHdyaXRlIG9yIHZpY2UgdmVyc2EuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbnRlcmVzdENoYW5nZXMoKSB7Ci0gICAgICBzeW5jaHJvbml6ZWQgKHNlbGVjdEludGVyZXN0Q2hhbmdlcykgewotICAgICAgICBmb3IgKEZyYW1lQnVmZmVyIGZiIDogc2VsZWN0SW50ZXJlc3RDaGFuZ2VzKSB7Ci0gICAgICAgICAgZmIuY2hhbmdlU2VsZWN0SW50ZXJlc3RzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2VsZWN0SW50ZXJlc3RDaGFuZ2VzLmNsZWFyKCk7Ci0gICAgICB9CisgICAgcHJvdGVjdGVkIEZyYW1lQnVmZmVyIGNyZWF0ZUZyYW1lQnVmZmVyKGZpbmFsIFROb25ibG9ja2luZ1RyYW5zcG9ydCB0cmFucywKKyAgICAgICAgZmluYWwgU2VsZWN0aW9uS2V5IHNlbGVjdGlvbktleSwKKyAgICAgICAgZmluYWwgQWJzdHJhY3RTZWxlY3RUaHJlYWQgc2VsZWN0VGhyZWFkKSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzb3JGYWN0b3J5Xy5pc0FzeW5jUHJvY2Vzc29yKCkgPworICAgICAgICAgICAgICAgICAgbmV3IEFzeW5jRnJhbWVCdWZmZXIodHJhbnMsIHNlbGVjdGlvbktleSwgc2VsZWN0VGhyZWFkKSA6CisgICAgICAgICAgICAgICAgICBuZXcgRnJhbWVCdWZmZXIodHJhbnMsIHNlbGVjdGlvbktleSwgc2VsZWN0VGhyZWFkKTsKICAgICB9CiAKICAgICAvKioKQEAgLTMzOSwzNjggKzIzMywxNiBAQAogICAgICAgICBjbGllbnRLZXkgPSBjbGllbnQucmVnaXN0ZXJTZWxlY3RvcihzZWxlY3RvciwgU2VsZWN0aW9uS2V5Lk9QX1JFQUQpOwogCiAgICAgICAgIC8vIGFkZCB0aGlzIGtleSB0byB0aGUgbWFwCi0gICAgICAgIEZyYW1lQnVmZmVyIGZyYW1lQnVmZmVyID0gbmV3IEZyYW1lQnVmZmVyKGNsaWVudCwgY2xpZW50S2V5KTsKLSAgICAgICAgY2xpZW50S2V5LmF0dGFjaChmcmFtZUJ1ZmZlcik7CisgICAgICAgICAgRnJhbWVCdWZmZXIgZnJhbWVCdWZmZXIgPSBjcmVhdGVGcmFtZUJ1ZmZlcihjbGllbnQsIGNsaWVudEtleSwgU2VsZWN0QWNjZXB0VGhyZWFkLnRoaXMpOworCisgICAgICAgICAgY2xpZW50S2V5LmF0dGFjaChmcmFtZUJ1ZmZlcik7CiAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0ZSkgewogICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZyBhY2NlcHRpbmcuCiAgICAgICAgIExPR0dFUi53YXJuKCJFeGNlcHRpb24gdHJ5aW5nIHRvIGFjY2VwdCEiLCB0dGUpOwogICAgICAgICB0dGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIGlmIChjbGllbnRLZXkgIT0gbnVsbCkgY2xlYW51cFNlbGVjdGlvbmtleShjbGllbnRLZXkpOworICAgICAgICBpZiAoY2xpZW50S2V5ICE9IG51bGwpIGNsZWFudXBTZWxlY3Rpb25LZXkoY2xpZW50S2V5KTsKICAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSBjbGllbnQuY2xvc2UoKTsKICAgICAgIH0KICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEbyB0aGUgd29yayByZXF1aXJlZCB0byByZWFkIGZyb20gYSByZWFkYWJsZSBjbGllbnQuIElmIHRoZSBmcmFtZSBpcwotICAgICAqIGZ1bGx5IHJlYWQsIHRoZW4gaW52b2tlIHRoZSBtZXRob2QgY2FsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlUmVhZChTZWxlY3Rpb25LZXkga2V5KSB7Ci0gICAgICBGcmFtZUJ1ZmZlciBidWZmZXIgPSAoRnJhbWVCdWZmZXIpa2V5LmF0dGFjaG1lbnQoKTsKLSAgICAgIGlmICghYnVmZmVyLnJlYWQoKSkgewotICAgICAgICBjbGVhbnVwU2VsZWN0aW9ua2V5KGtleSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgLy8gaWYgdGhlIGJ1ZmZlcidzIGZyYW1lIHJlYWQgaXMgY29tcGxldGUsIGludm9rZSB0aGUgbWV0aG9kLgotICAgICAgaWYgKGJ1ZmZlci5pc0ZyYW1lRnVsbHlSZWFkKCkpIHsKLSAgICAgICAgaWYgKCFyZXF1ZXN0SW52b2tlKGJ1ZmZlcikpIHsKLSAgICAgICAgICBjbGVhbnVwU2VsZWN0aW9ua2V5KGtleSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMZXQgYSB3cml0YWJsZSBjbGllbnQgZ2V0IHdyaXR0ZW4sIGlmIHRoZXJlJ3MgZGF0YSB0byBiZSB3cml0dGVuLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVXcml0ZShTZWxlY3Rpb25LZXkga2V5KSB7Ci0gICAgICBGcmFtZUJ1ZmZlciBidWZmZXIgPSAoRnJhbWVCdWZmZXIpa2V5LmF0dGFjaG1lbnQoKTsKLSAgICAgIGlmICghYnVmZmVyLndyaXRlKCkpIHsKLSAgICAgICAgY2xlYW51cFNlbGVjdGlvbmtleShrZXkpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvIGNvbm5lY3Rpb24tY2xvc2UgY2xlYW51cCBvbiBhIGdpdmVuIFNlbGVjdGlvbktleS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2xlYW51cFNlbGVjdGlvbmtleShTZWxlY3Rpb25LZXkga2V5KSB7Ci0gICAgICAvLyByZW1vdmUgdGhlIHJlY29yZHMgZnJvbSB0aGUgdHdvIG1hcHMKLSAgICAgIEZyYW1lQnVmZmVyIGJ1ZmZlciA9IChGcmFtZUJ1ZmZlcilrZXkuYXR0YWNobWVudCgpOwotICAgICAgaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0gICAgICAgIC8vIGNsb3NlIHRoZSBidWZmZXIKLSAgICAgICAgYnVmZmVyLmNsb3NlKCk7Ci0gICAgICB9Ci0gICAgICAvLyBjYW5jZWwgdGhlIHNlbGVjdGlvbiBrZXkKLSAgICAgIGtleS5jYW5jZWwoKTsKLSAgICB9Ci0gIH0gLy8gU2VsZWN0b3JUaHJlYWQKLQotICAvKioKLSAgICogQ2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgc29ydCBvZiBzdGF0ZSBtYWNoaW5lIGFyb3VuZCB0aGUgaW50ZXJhY3Rpb24gd2l0aAotICAgKiBhIGNsaWVudCBhbmQgYW4gaW52b2tlci4gSXQgbWFuYWdlcyByZWFkaW5nIHRoZSBmcmFtZSBzaXplIGFuZCBmcmFtZSBkYXRhLAotICAgKiBnZXR0aW5nIGl0IGhhbmRlZCBvZmYgYXMgd3JhcHBlZCB0cmFuc3BvcnRzLCBhbmQgdGhlbiB0aGUgd3JpdGluZyBvZgotICAgKiByZXNwb25zZSBkYXRhIGJhY2sgdG8gdGhlIGNsaWVudC4gSW4gdGhlIHByb2Nlc3MgaXQgbWFuYWdlcyBmbGlwcGluZyB0aGUKLSAgICogcmVhZCBhbmQgd3JpdGUgYml0cyBvbiB0aGUgc2VsZWN0aW9uIGtleSBmb3IgaXRzIGNsaWVudC4KLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBGcmFtZUJ1ZmZlciB7Ci0gICAgLy8KLSAgICAvLyBQb3NzaWJsZSBzdGF0ZXMgZm9yIHRoZSBGcmFtZUJ1ZmZlciBzdGF0ZSBtYWNoaW5lLgotICAgIC8vCi0gICAgLy8gaW4gdGhlIG1pZHN0IG9mIHJlYWRpbmcgdGhlIGZyYW1lIHNpemUgb2ZmIHRoZSB3aXJlCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQURJTkdfRlJBTUVfU0laRSA9IDE7Ci0gICAgLy8gcmVhZGluZyB0aGUgYWN0dWFsIGZyYW1lIGRhdGEgbm93LCBidXQgbm90IGFsbCB0aGUgd2F5IGRvbmUgeWV0Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQURJTkdfRlJBTUUgPSAyOwotICAgIC8vIGNvbXBsZXRlbHkgcmVhZCB0aGUgZnJhbWUsIHNvIGFuIGludm9jYXRpb24gY2FuIG5vdyBoYXBwZW4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVBRF9GUkFNRV9DT01QTEVURSA9IDM7Ci0gICAgLy8gd2FpdGluZyB0byBnZXQgc3dpdGNoZWQgdG8gbGlzdGVuaW5nIGZvciB3cml0ZSBldmVudHMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVdBSVRJTkdfUkVHSVNURVJfV1JJVEUgPSA0OwotICAgIC8vIHN0YXJ0ZWQgd3JpdGluZyByZXNwb25zZSBkYXRhLCBub3QgZnVsbHkgY29tcGxldGUgeWV0Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdSSVRJTkcgPSA2OwotICAgIC8vIGFub3RoZXIgdGhyZWFkIHdhbnRzIHRoaXMgZnJhbWVidWZmZXIgdG8gZ28gYmFjayB0byByZWFkaW5nCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFXQUlUSU5HX1JFR0lTVEVSX1JFQUQgPSA3OwotICAgIC8vIHdlIHdhbnQgb3VyIHRyYW5zcG9ydCBhbmQgc2VsZWN0aW9uIGtleSBpbnZhbGlkYXRlZCBpbiB0aGUgc2VsZWN0b3IgdGhyZWFkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFXQUlUSU5HX0NMT1NFID0gODsKLQotICAgIC8vCi0gICAgLy8gSW5zdGFuY2UgdmFyaWFibGVzCi0gICAgLy8KLQotICAgIC8vIHRoZSBhY3R1YWwgdHJhbnNwb3J0IGhvb2tlZCB1cCB0byB0aGUgY2xpZW50LgotICAgIHB1YmxpYyBmaW5hbCBUTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnNfOwotCi0gICAgLy8gdGhlIFNlbGVjdGlvbktleSB0aGF0IGNvcnJlc3BvbmRzIHRvIG91ciB0cmFuc3BvcnQKLSAgICBwcml2YXRlIGZpbmFsIFNlbGVjdGlvbktleSBzZWxlY3Rpb25LZXlfOwotCi0gICAgLy8gd2hlcmUgaW4gdGhlIHByb2Nlc3Mgb2YgcmVhZGluZy93cml0aW5nIGFyZSB3ZT8KLSAgICBwcml2YXRlIGludCBzdGF0ZV8gPSBSRUFESU5HX0ZSQU1FX1NJWkU7Ci0KLSAgICAvLyB0aGUgQnl0ZUJ1ZmZlciB3ZSdsbCBiZSB1c2luZyB0byB3cml0ZSBhbmQgcmVhZCwgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZQotICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBidWZmZXJfOwotCi0gICAgcHJpdmF0ZSBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlc3BvbnNlXzsKLQotICAgIHB1YmxpYyBGcmFtZUJ1ZmZlciggZmluYWwgVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2VsZWN0aW9uS2V5IHNlbGVjdGlvbktleSkgewotICAgICAgdHJhbnNfID0gdHJhbnM7Ci0gICAgICBzZWxlY3Rpb25LZXlfID0gc2VsZWN0aW9uS2V5OwotICAgICAgYnVmZmVyXyA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoNCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2l2ZSB0aGlzIEZyYW1lQnVmZmVyIGEgY2hhbmNlIHRvIHJlYWQuIFRoZSBzZWxlY3RvciBsb29wIHNob3VsZCBoYXZlCi0gICAgICogcmVjZWl2ZWQgYSByZWFkIGV2ZW50IGZvciB0aGlzIEZyYW1lQnVmZmVyLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIHNob3VsZCBsaXZlIG9uLCBmYWxzZSBpZiBpdCBzaG91bGQgYmUKLSAgICAgKiBjbG9zZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZWFkKCkgewotICAgICAgaWYgKHN0YXRlXyA9PSBSRUFESU5HX0ZSQU1FX1NJWkUpIHsKLSAgICAgICAgLy8gdHJ5IHRvIHJlYWQgdGhlIGZyYW1lIHNpemUgY29tcGxldGVseQotICAgICAgICBpZiAoIWludGVybmFsUmVhZCgpKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgdGhlIGZyYW1lIHNpemUgaGFzIGJlZW4gcmVhZCBjb21wbGV0ZWx5LCB0aGVuIHByZXBhcmUgdG8gcmVhZCB0aGUKLSAgICAgICAgLy8gYWN0dWFsIGZyYW1lLgotICAgICAgICBpZiAoYnVmZmVyXy5yZW1haW5pbmcoKSA9PSAwKSB7Ci0gICAgICAgICAgLy8gcHVsbCBvdXQgdGhlIGZyYW1lIHNpemUgYXMgYW4gaW50ZWdlci4KLSAgICAgICAgICBpbnQgZnJhbWVTaXplID0gYnVmZmVyXy5nZXRJbnQoMCk7Ci0gICAgICAgICAgaWYgKGZyYW1lU2l6ZSA8PSAwKSB7Ci0gICAgICAgICAgICBMT0dHRVIuZXJyb3IoIlJlYWQgYW4gaW52YWxpZCBmcmFtZSBzaXplIG9mICIgKyBmcmFtZVNpemUKLSAgICAgICAgICAgICAgKyAiLiBBcmUgeW91IHVzaW5nIFRGcmFtZWRUcmFuc3BvcnQgb24gdGhlIGNsaWVudCBzaWRlPyIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIGlmIHRoaXMgZnJhbWUgd2lsbCBhbHdheXMgYmUgdG9vIGxhcmdlIGZvciB0aGlzIHNlcnZlciwgbG9nIHRoZQotICAgICAgICAgIC8vIGVycm9yIGFuZCBjbG9zZSB0aGUgY29ubmVjdGlvbi4KLSAgICAgICAgICBpZiAoZnJhbWVTaXplID4gTUFYX1JFQURfQlVGRkVSX0JZVEVTKSB7Ci0gICAgICAgICAgICBMT0dHRVIuZXJyb3IoIlJlYWQgYSBmcmFtZSBzaXplIG9mICIgKyBmcmFtZVNpemUKLSAgICAgICAgICAgICAgKyAiLCB3aGljaCBpcyBiaWdnZXIgdGhhbiB0aGUgbWF4aW11bSBhbGxvd2FibGUgYnVmZmVyIHNpemUgZm9yIEFMTCBjb25uZWN0aW9ucy4iKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBpZiB0aGlzIGZyYW1lIHdpbGwgcHVzaCB1cyBvdmVyIHRoZSBtZW1vcnkgbGltaXQsIHRoZW4gcmV0dXJuLgotICAgICAgICAgIC8vIHdpdGggbHVjaywgbW9yZSBtZW1vcnkgd2lsbCBmcmVlIHVwIHRoZSBuZXh0IHRpbWUgYXJvdW5kLgotICAgICAgICAgIGlmIChyZWFkQnVmZmVyQnl0ZXNBbGxvY2F0ZWQuZ2V0KCkgKyBmcmFtZVNpemUgPiBNQVhfUkVBRF9CVUZGRVJfQllURVMpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIGluY3JlbWVudCB0aGUgYW1vdW50IG9mIG1lbW9yeSBhbGxvY2F0ZWQgdG8gcmVhZCBidWZmZXJzCi0gICAgICAgICAgcmVhZEJ1ZmZlckJ5dGVzQWxsb2NhdGVkLmFkZEFuZEdldChmcmFtZVNpemUpOwotCi0gICAgICAgICAgLy8gcmVhbGxvY2F0ZSB0aGUgcmVhZGJ1ZmZlciBhcyBhIGZyYW1lLXNpemVkIGJ1ZmZlcgotICAgICAgICAgIGJ1ZmZlcl8gPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICBzdGF0ZV8gPSBSRUFESU5HX0ZSQU1FOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIHRoaXMgc2tpcHMgdGhlIGNoZWNrIG9mIFJFQURJTkdfRlJBTUUgc3RhdGUgYmVsb3csIHNpbmNlIHdlIGNhbid0Ci0gICAgICAgICAgLy8gcG9zc2libHkgZ28gb24gdG8gdGhhdCBzdGF0ZSBpZiB0aGVyZSdzIGRhdGEgbGVmdCB0byBiZSByZWFkIGF0Ci0gICAgICAgICAgLy8gdGhpcyBvbmUuCi0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gaXQgaXMgcG9zc2libGUgdG8gZmFsbCB0aHJvdWdoIGZyb20gdGhlIFJFQURJTkdfRlJBTUVfU0laRSBzZWN0aW9uCi0gICAgICAvLyB0byBSRUFESU5HX0ZSQU1FIGlmIHRoZXJlJ3MgYWxyZWFkeSBzb21lIGZyYW1lIGRhdGEgYXZhaWxhYmxlIG9uY2UKLSAgICAgIC8vIFJFQURJTkdfRlJBTUVfU0laRSBpcyBjb21wbGV0ZS4KLQotICAgICAgaWYgKHN0YXRlXyA9PSBSRUFESU5HX0ZSQU1FKSB7Ci0gICAgICAgIGlmICghaW50ZXJuYWxSZWFkKCkpIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzaW5jZSB3ZSdyZSBhbHJlYWR5IGluIHRoZSBzZWxlY3QgbG9vcCBoZXJlIGZvciBzdXJlLCB3ZSBjYW4ganVzdAotICAgICAgICAvLyBtb2RpZnkgb3VyIHNlbGVjdGlvbiBrZXkgZGlyZWN0bHkuCi0gICAgICAgIGlmIChidWZmZXJfLnJlbWFpbmluZygpID09IDApIHsKLSAgICAgICAgICAvLyBnZXQgcmlkIG9mIHRoZSByZWFkIHNlbGVjdCBpbnRlcmVzdHMKLSAgICAgICAgICBzZWxlY3Rpb25LZXlfLmludGVyZXN0T3BzKDApOwotICAgICAgICAgIHN0YXRlXyA9IFJFQURfRlJBTUVfQ09NUExFVEU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgLy8gaWYgd2UgZmFsbCB0aHJvdWdoIHRvIHRoaXMgcG9pbnQsIHRoZW4gdGhlIHN0YXRlIG11c3QgYmUgaW52YWxpZC4KLSAgICAgIExPR0dFUi5lcnJvcigiUmVhZCB3YXMgY2FsbGVkIGJ1dCBzdGF0ZSBpcyBpbnZhbGlkICgiICsgc3RhdGVfICsgIikiKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlIHRoaXMgRnJhbWVCdWZmZXIgYSBjaGFuY2UgdG8gd3JpdGUgaXRzIG91dHB1dCB0byB0aGUgZmluYWwgY2xpZW50LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHdyaXRlKCkgewotICAgICAgaWYgKHN0YXRlXyA9PSBXUklUSU5HKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgaWYgKHRyYW5zXy53cml0ZShidWZmZXJfKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICBMT0dHRVIud2FybigiR290IGFuIElPRXhjZXB0aW9uIGR1cmluZyB3cml0ZSEiLCBlKTsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB3ZSdyZSBkb25lIHdyaXRpbmcuIG5vdyB3ZSBuZWVkIHRvIHN3aXRjaCBiYWNrIHRvIHJlYWRpbmcuCi0gICAgICAgIGlmIChidWZmZXJfLnJlbWFpbmluZygpID09IDApIHsKLSAgICAgICAgICBwcmVwYXJlUmVhZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotCi0gICAgICBMT0dHRVIuZXJyb3IoIldyaXRlIHdhcyBjYWxsZWQsIGJ1dCBzdGF0ZSBpcyBpbnZhbGlkICgiICsgc3RhdGVfICsgIikiKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlIHRoaXMgRnJhbWVCdWZmZXIgYSBjaGFuY2UgdG8gc2V0IGl0cyBpbnRlcmVzdCB0byB3cml0ZSwgb25jZSBkYXRhCi0gICAgICogaGFzIGNvbWUgaW4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2hhbmdlU2VsZWN0SW50ZXJlc3RzKCkgewotICAgICAgaWYgKHN0YXRlXyA9PSBBV0FJVElOR19SRUdJU1RFUl9XUklURSkgewotICAgICAgICAvLyBzZXQgdGhlIE9QX1dSSVRFIGludGVyZXN0Ci0gICAgICAgIHNlbGVjdGlvbktleV8uaW50ZXJlc3RPcHMoU2VsZWN0aW9uS2V5Lk9QX1dSSVRFKTsKLSAgICAgICAgc3RhdGVfID0gV1JJVElORzsKLSAgICAgIH0gZWxzZSBpZiAoc3RhdGVfID09IEFXQUlUSU5HX1JFR0lTVEVSX1JFQUQpIHsKLSAgICAgICAgcHJlcGFyZVJlYWQoKTsKLSAgICAgIH0gZWxzZSBpZiAoc3RhdGVfID09IEFXQUlUSU5HX0NMT1NFKXsKLSAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgc2VsZWN0aW9uS2V5Xy5jYW5jZWwoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR0dFUi5lcnJvcigKLSAgICAgICAgICAiY2hhbmdlU2VsZWN0SW50ZXJlc3Qgd2FzIGNhbGxlZCwgYnV0IHN0YXRlIGlzIGludmFsaWQgKCIKLSAgICAgICAgICArIHN0YXRlXyArICIpIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2h1dCB0aGUgY29ubmVjdGlvbiBkb3duLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgLy8gaWYgd2UncmUgYmVpbmcgY2xvc2VkIGR1ZSB0byBhbiBlcnJvciwgd2UgbWlnaHQgaGF2ZSBhbGxvY2F0ZWQgYQotICAgICAgLy8gYnVmZmVyIHRoYXQgd2UgbmVlZCB0byBzdWJ0cmFjdCBmb3Igb3VyIG1lbW9yeSBhY2NvdW50aW5nLgotICAgICAgaWYgKHN0YXRlXyA9PSBSRUFESU5HX0ZSQU1FIHx8IHN0YXRlXyA9PSBSRUFEX0ZSQU1FX0NPTVBMRVRFKSB7Ci0gICAgICAgIHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZC5hZGRBbmRHZXQoLWJ1ZmZlcl8uYXJyYXkoKS5sZW5ndGgpOwotICAgICAgfQotICAgICAgdHJhbnNfLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaWYgdGhpcyBGcmFtZUJ1ZmZlciBoYXMgYSBmdWxsIGZyYW1lIHJlYWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNGcmFtZUZ1bGx5UmVhZCgpIHsKLSAgICAgIHJldHVybiBzdGF0ZV8gPT0gUkVBRF9GUkFNRV9DT01QTEVURTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZnRlciB0aGUgcHJvY2Vzc29yIGhhcyBwcm9jZXNzZWQgdGhlIGludm9jYXRpb24sIHdoYXRldmVyIHRocmVhZCBpcwotICAgICAqIG1hbmFnaW5nIGludm9jYXRpb25zIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIG9uIHRoaXMgRnJhbWVCdWZmZXIgc28gd2UKLSAgICAgKiBrbm93IGl0J3MgdGltZSB0byBzdGFydCB0cnlpbmcgdG8gd3JpdGUgYWdhaW4uIEFsc28sIGlmIGl0IHR1cm5zIG91dAotICAgICAqIHRoYXQgdGhlcmUgYWN0dWFsbHkgaXNuJ3QgYW55IGRhdGEgaW4gdGhlIHJlc3BvbnNlIGJ1ZmZlciwgd2UnbGwgc2tpcAotICAgICAqIHRyeWluZyB0byB3cml0ZSBhbmQgaW5zdGVhZCBnbyBiYWNrIHRvIHJlYWRpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzcG9uc2VSZWFkeSgpIHsKLSAgICAgIC8vIHRoZSByZWFkIGJ1ZmZlciBpcyBkZWZpbml0ZWx5IG5vIGxvbmdlciBpbiB1c2UsIHNvIHdlIHdpbGwgZGVjcmVtZW50Ci0gICAgICAvLyBvdXIgcmVhZCBidWZmZXIgY291bnQuIHdlIGRvIHRoaXMgaGVyZSBhcyB3ZWxsIGFzIGluIGNsb3NlIGJlY2F1c2UKLSAgICAgIC8vIHdlJ2QgbGlrZSB0byBmcmVlIHRoaXMgcmVhZCBtZW1vcnkgdXAgYXMgcXVpY2tseSBhcyBwb3NzaWJsZSBmb3Igb3RoZXIKLSAgICAgIC8vIGNsaWVudHMuCi0gICAgICByZWFkQnVmZmVyQnl0ZXNBbGxvY2F0ZWQuYWRkQW5kR2V0KC1idWZmZXJfLmFycmF5KCkubGVuZ3RoKTsKLQotICAgICAgaWYgKHJlc3BvbnNlXy5sZW4oKSA9PSAwKSB7Ci0gICAgICAgIC8vIGdvIHN0cmFpZ2h0IHRvIHJlYWRpbmcgYWdhaW4uIHRoaXMgd2FzIHByb2JhYmx5IGFuIG9uZXdheSBtZXRob2QKLSAgICAgICAgc3RhdGVfID0gQVdBSVRJTkdfUkVHSVNURVJfUkVBRDsKLSAgICAgICAgYnVmZmVyXyA9IG51bGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBidWZmZXJfID0gQnl0ZUJ1ZmZlci53cmFwKHJlc3BvbnNlXy5nZXQoKSwgMCwgcmVzcG9uc2VfLmxlbigpKTsKLQotICAgICAgICAvLyBzZXQgc3RhdGUgdGhhdCB3ZSdyZSB3YWl0aW5nIHRvIGJlIHN3aXRjaGVkIHRvIHdyaXRlLiB3ZSBkbyB0aGlzCi0gICAgICAgIC8vIGFzeW5jaHJvbm91c2x5IHRocm91Z2ggcmVxdWVzdFNlbGVjdEludGVyZXN0Q2hhbmdlKCkgYmVjYXVzZSB0aGVyZSBpcyBhCi0gICAgICAgIC8vIHBvc3NpYmlsaXR5IHRoYXQgd2UncmUgbm90IGluIHRoZSBtYWluIHRocmVhZCwgYW5kIHRodXMgY3VycmVudGx5Ci0gICAgICAgIC8vIGJsb2NrZWQgaW4gc2VsZWN0KCkuICh0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgaW4gcGxhY2UgZm9yIHRoZSBzYWtlIG9mCi0gICAgICAgIC8vIHRoZSBIc0hhIHNlcnZlci4pCi0gICAgICAgIHN0YXRlXyA9IEFXQUlUSU5HX1JFR0lTVEVSX1dSSVRFOwotICAgICAgfQotICAgICAgcmVxdWVzdFNlbGVjdEludGVyZXN0Q2hhbmdlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWN0dWFsbHkgaW52b2tlIHRoZSBtZXRob2Qgc2lnbmlmaWVkIGJ5IHRoaXMgRnJhbWVCdWZmZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW52b2tlKCkgewotICAgICAgVFRyYW5zcG9ydCBpblRyYW5zID0gZ2V0SW5wdXRUcmFuc3BvcnQoKTsKLSAgICAgIFRQcm90b2NvbCBpblByb3QgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2woaW5UcmFucyk7Ci0gICAgICBUUHJvdG9jb2wgb3V0UHJvdCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2woZ2V0T3V0cHV0VHJhbnNwb3J0KCkpOwotCi0gICAgICB0cnkgewotICAgICAgICBwcm9jZXNzb3JGYWN0b3J5Xy5nZXRQcm9jZXNzb3IoaW5UcmFucykucHJvY2VzcyhpblByb3QsIG91dFByb3QpOwotICAgICAgICByZXNwb25zZVJlYWR5KCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gdGUpIHsKLSAgICAgICAgTE9HR0VSLndhcm4oIkV4Y2VwdGlvbiB3aGlsZSBpbnZva2luZyEiLCB0ZSk7Ci0gICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICBMT0dHRVIuZXJyb3IoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdoaWxlIGludm9raW5nISIsIGUpOwotICAgICAgfQotICAgICAgLy8gVGhpcyB3aWxsIG9ubHkgYmUgcmVhY2hlZCB3aGVuIHRoZXJlIGlzIGFuIGV4Y2VwdGlvbi4KLSAgICAgIHN0YXRlXyA9IEFXQUlUSU5HX0NMT1NFOwotICAgICAgcmVxdWVzdFNlbGVjdEludGVyZXN0Q2hhbmdlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JhcCB0aGUgcmVhZCBidWZmZXIgaW4gYSBtZW1vcnktYmFzZWQgdHJhbnNwb3J0IHNvIGEgcHJvY2Vzc29yIGNhbiByZWFkCi0gICAgICogdGhlIGRhdGEgaXQgbmVlZHMgdG8gaGFuZGxlIGFuIGludm9jYXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBUVHJhbnNwb3J0IGdldElucHV0VHJhbnNwb3J0KCkgewotICAgICAgcmV0dXJuIG5ldyBUTWVtb3J5SW5wdXRUcmFuc3BvcnQoYnVmZmVyXy5hcnJheSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHRyYW5zcG9ydCB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBpbnZva2VyIGZvciByZXNwb25kaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgVFRyYW5zcG9ydCBnZXRPdXRwdXRUcmFuc3BvcnQoKSB7Ci0gICAgICByZXNwb25zZV8gPSBuZXcgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgcmV0dXJuIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLmdldFRyYW5zcG9ydChuZXcgVElPU3RyZWFtVHJhbnNwb3J0KHJlc3BvbnNlXykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm0gYSByZWFkIGludG8gYnVmZmVyLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkIHN1Y2NlZWRlZCwgZmFsc2UgaWYgdGhlcmUgd2FzIGFuIGVycm9yIG9yIHRoZQotICAgICAqIGNvbm5lY3Rpb24gY2xvc2VkLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpbnRlcm5hbFJlYWQoKSB7Ci0gICAgICB0cnkgewotICAgICAgICBpZiAodHJhbnNfLnJlYWQoYnVmZmVyXykgPCAwKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICBMT0dHRVIud2FybigiR290IGFuIElPRXhjZXB0aW9uIGluIGludGVybmFsUmVhZCEiLCBlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdlJ3JlIGRvbmUgd3JpdGluZywgc28gcmVzZXQgb3VyIGludGVyZXN0IG9wcyBhbmQgY2hhbmdlIHN0YXRlIGFjY29yZGluZ2x5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcmVwYXJlUmVhZCgpIHsKLSAgICAgIC8vIHdlIGNhbiBzZXQgb3VyIGludGVyZXN0IGRpcmVjdGx5IHdpdGhvdXQgdXNpbmcgdGhlIHF1ZXVlIGJlY2F1c2UKLSAgICAgIC8vIHdlJ3JlIGluIHRoZSBzZWxlY3QgdGhyZWFkLgotICAgICAgc2VsZWN0aW9uS2V5Xy5pbnRlcmVzdE9wcyhTZWxlY3Rpb25LZXkuT1BfUkVBRCk7Ci0gICAgICAvLyBnZXQgcmVhZHkgZm9yIGFub3RoZXIgZ28tYXJvdW5kCi0gICAgICBidWZmZXJfID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg0KTsKLSAgICAgIHN0YXRlXyA9IFJFQURJTkdfRlJBTUVfU0laRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIHRoaXMgRnJhbWVCdWZmZXIgbmVlZHMgdG8gY2hhbmdlIGl0J3Mgc2VsZWN0IGludGVyZXN0cyBhbmQgZXhlY3V0aW9uCi0gICAgICogbWlnaHQgbm90IGJlIGluIHRoZSBzZWxlY3QgdGhyZWFkLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgbWFrZSBzdXJlIHRoZQotICAgICAqIGludGVyZXN0IGNoYW5nZSBnZXRzIGRvbmUgd2hlbiB0aGUgc2VsZWN0IHRocmVhZCB3YWtlcyBiYWNrIHVwLiBXaGVuIHRoZQotICAgICAqIGN1cnJlbnQgdGhyZWFkIGlzIHRoZSBzZWxlY3QgdGhyZWFkLCB0aGVuIGl0IGp1c3QgZG9lcyB0aGUgaW50ZXJlc3QgY2hhbmdlCi0gICAgICogaW1tZWRpYXRlbHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZSgpIHsKLSAgICAgIGlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpID09IHNlbGVjdFRocmVhZF8pIHsKLSAgICAgICAgY2hhbmdlU2VsZWN0SW50ZXJlc3RzKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXIudGhpcy5yZXF1ZXN0U2VsZWN0SW50ZXJlc3RDaGFuZ2UodGhpcyk7Ci0gICAgICB9Ci0gICAgfQotICB9IC8vIEZyYW1lQnVmZmVyCisgIH0gLy8gU2VsZWN0QWNjZXB0VGhyZWFkCiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5qYXZhCmluZGV4IDBhZjY2ZDMuLmJhYzA2YjIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5qYXZhCkBAIC0xMjMsNyArMTIzLDEzIEBACiAgICAqLwogICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOwogCi0gIHByaXZhdGUgYm9vbGVhbiBpc1NlcnZpbmc7CisgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBpc1NlcnZpbmc7CisKKyAgcHJvdGVjdGVkIFRTZXJ2ZXJFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyXzsKKworICAvLyBGbGFnIGZvciBzdG9wcGluZyB0aGUgc2VydmVyCisgIC8vIFBsZWFzZSBzZWUgVEhSSUZULTE3OTUgZm9yIHRoZSB1c2FnZSBvZiB0aGlzIGZsYWcKKyAgcHJvdGVjdGVkIHZvbGF0aWxlIGJvb2xlYW4gc3RvcHBlZF8gPSBmYWxzZTsKIAogICBwcm90ZWN0ZWQgVFNlcnZlcihBYnN0cmFjdFNlcnZlckFyZ3MgYXJncykgewogICAgIHByb2Nlc3NvckZhY3RvcnlfID0gYXJncy5wcm9jZXNzb3JGYWN0b3J5OwpAQCAtMTUyLDQgKzE1OCwyMCBAQAogICBwcm90ZWN0ZWQgdm9pZCBzZXRTZXJ2aW5nKGJvb2xlYW4gc2VydmluZykgewogICAgIGlzU2VydmluZyA9IHNlcnZpbmc7CiAgIH0KKworICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJFdmVudEhhbmRsZXIoVFNlcnZlckV2ZW50SGFuZGxlciBldmVudEhhbmRsZXIpIHsKKyAgICBldmVudEhhbmRsZXJfID0gZXZlbnRIYW5kbGVyOworICB9CisKKyAgcHVibGljIFRTZXJ2ZXJFdmVudEhhbmRsZXIgZ2V0RXZlbnRIYW5kbGVyKCkgeworICAgIHJldHVybiBldmVudEhhbmRsZXJfOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gZ2V0U2hvdWxkU3RvcCgpIHsKKyAgICByZXR1cm4gdGhpcy5zdG9wcGVkXzsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFNob3VsZFN0b3AoYm9vbGVhbiBzaG91bGRTdG9wKSB7CisgICAgdGhpcy5zdG9wcGVkXyA9IHNob3VsZFN0b3A7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA2OWI5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKy8qKgorICogSW50ZXJmYWNlIHRoYXQgY2FuIGhhbmRsZSBldmVudHMgZnJvbSB0aGUgc2VydmVyIGNvcmUuIFRvCisgKiB1c2UgdGhpcyB5b3Ugc2hvdWxkIHN1YmNsYXNzIGl0IGFuZCBpbXBsZW1lbnQgdGhlIG1ldGhvZHMgdGhhdCB5b3UgY2FyZQorICogYWJvdXQuIFlvdXIgc3ViY2xhc3MgY2FuIGFsc28gc3RvcmUgbG9jYWwgZGF0YSB0aGF0IHlvdSBtYXkgY2FyZSBhYm91dCwKKyAqIHN1Y2ggYXMgYWRkaXRpb25hbCAiYXJndW1lbnRzIiB0byB0aGVzZSBtZXRob2RzIChzdG9yZWQgaW4gdGhlIG9iamVjdAorICogaW5zdGFuY2UncyBzdGF0ZSkuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVFNlcnZlckV2ZW50SGFuZGxlciB7CisKKyAgLyoqCisgICAqIENhbGxlZCBiZWZvcmUgdGhlIHNlcnZlciBiZWdpbnMuCisgICAqLworICB2b2lkIHByZVNlcnZlKCk7CisKKyAgLyoqCisgICAqIENhbGxlZCB3aGVuIGEgbmV3IGNsaWVudCBoYXMgY29ubmVjdGVkIGFuZCBpcyBhYm91dCB0byBiZWluZyBwcm9jZXNzaW5nLgorICAgKi8KKyAgU2VydmVyQ29udGV4dCBjcmVhdGVDb250ZXh0KFRQcm90b2NvbCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbCBvdXRwdXQpOworCisgIC8qKgorICAgKiBDYWxsZWQgd2hlbiBhIGNsaWVudCBoYXMgZmluaXNoZWQgcmVxdWVzdC1oYW5kbGluZyB0byBkZWxldGUgc2VydmVyCisgICAqIGNvbnRleHQuCisgICAqLworICB2b2lkIGRlbGV0ZUNvbnRleHQoU2VydmVyQ29udGV4dCBzZXJ2ZXJDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2wgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbCBvdXRwdXQpOworCisgIC8qKgorICAgKiBDYWxsZWQgd2hlbiBhIGNsaWVudCBpcyBhYm91dCB0byBjYWxsIHRoZSBwcm9jZXNzb3IuCisgICAqLworICB2b2lkIHByb2Nlc3NDb250ZXh0KFNlcnZlckNvbnRleHQgc2VydmVyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQsIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0KTsKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmphdmEKaW5kZXggZWYxYjEwYS4uZTgxNWIyYyAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmphdmEKQEAgLTM1LDE0ICszNSwxMSBAQAogCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUU2ltcGxlU2VydmVyLmNsYXNzLmdldE5hbWUoKSk7CiAKLSAgcHJpdmF0ZSBib29sZWFuIHN0b3BwZWRfID0gZmFsc2U7Ci0KICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoQWJzdHJhY3RTZXJ2ZXJBcmdzIGFyZ3MpIHsKICAgICBzdXBlcihhcmdzKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHNlcnZlKCkgewotICAgIHN0b3BwZWRfID0gZmFsc2U7CiAgICAgdHJ5IHsKICAgICAgIHNlcnZlclRyYW5zcG9ydF8ubGlzdGVuKCk7CiAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKQEAgLTUwLDYgKzQ3LDExIEBACiAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgLy8gUnVuIHRoZSBwcmVTZXJ2ZSBldmVudAorICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKKyAgICAgIGV2ZW50SGFuZGxlcl8ucHJlU2VydmUoKTsKKyAgICB9CisKICAgICBzZXRTZXJ2aW5nKHRydWUpOwogCiAgICAgd2hpbGUgKCFzdG9wcGVkXykgewpAQCAtNTksNiArNjEsNyBAQAogICAgICAgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOwogICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOwogICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgIFNlcnZlckNvbnRleHQgY29ubmVjdGlvbkNvbnRleHQgPSBudWxsOwogICAgICAgdHJ5IHsKICAgICAgICAgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0Xy5hY2NlcHQoKTsKICAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7CkBAIC02Nyw3ICs3MCwxNyBAQAogICAgICAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLmdldFRyYW5zcG9ydChjbGllbnQpOwogICAgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOwogICAgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOwotICAgICAgICAgIHdoaWxlIChwcm9jZXNzb3IucHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpIHt9CisgICAgICAgICAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gbnVsbCkgeworICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBldmVudEhhbmRsZXJfLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworICAgICAgICAgIH0KKyAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gbnVsbCkgeworICAgICAgICAgICAgICBldmVudEhhbmRsZXJfLnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFRyYW5zcG9ydCwgb3V0cHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCFwcm9jZXNzb3IucHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgewogICAgICAgICAvLyBDbGllbnQgZGllZCwganVzdCBtb3ZlIG9uCkBAIC04MSw2ICs5NCwxMCBAQAogICAgICAgICB9CiAgICAgICB9CiAKKyAgICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKKyAgICAgICAgZXZlbnRIYW5kbGVyXy5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisgICAgICB9CisKICAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKSB7CiAgICAgICAgIGlucHV0VHJhbnNwb3J0LmNsb3NlKCk7CiAgICAgICB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmphdmEKaW5kZXggODU1MzdiZi4uMTY5N2FkNiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuamF2YQpAQCAtMTksNyArMTksOSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKIAoraW1wb3J0IGphdmEudXRpbC5SYW5kb207CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlN5bmNocm9ub3VzUXVldWU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwpAQCAtMjcsNiArMjksNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTYXNsVHJhbnNwb3J0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU2VydmVyVHJhbnNwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOwpAQCAtNDUsOCArNDgsMTMgQEAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBBcmdzIGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBcmdzPEFyZ3M+IHsKICAgICBwdWJsaWMgaW50IG1pbldvcmtlclRocmVhZHMgPSA1OwogICAgIHB1YmxpYyBpbnQgbWF4V29ya2VyVGhyZWFkcyA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgIHB1YmxpYyBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlOwogICAgIHB1YmxpYyBpbnQgc3RvcFRpbWVvdXRWYWwgPSA2MDsKICAgICBwdWJsaWMgVGltZVVuaXQgc3RvcFRpbWVvdXRVbml0ID0gVGltZVVuaXQuU0VDT05EUzsKKyAgICBwdWJsaWMgaW50IHJlcXVlc3RUaW1lb3V0ID0gMjA7CisgICAgcHVibGljIFRpbWVVbml0IHJlcXVlc3RUaW1lb3V0VW5pdCA9IFRpbWVVbml0LlNFQ09ORFM7CisgICAgcHVibGljIGludCBiZUJhY2tvZmZTbG90TGVuZ3RoID0gMTAwOworICAgIHB1YmxpYyBUaW1lVW5pdCBiZUJhY2tvZmZTbG90TGVuZ3RoVW5pdCA9IFRpbWVVbml0Lk1JTExJU0VDT05EUzsKIAogICAgIHB1YmxpYyBBcmdzKFRTZXJ2ZXJUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CiAgICAgICBzdXBlcih0cmFuc3BvcnQpOwpAQCAtNjEsNTEgKzY5LDE2MSBAQAogICAgICAgbWF4V29ya2VyVGhyZWFkcyA9IG47CiAgICAgICByZXR1cm4gdGhpczsKICAgICB9CisKKyAgICBwdWJsaWMgQXJncyBzdG9wVGltZW91dFZhbChpbnQgbikgeworICAgICAgc3RvcFRpbWVvdXRWYWwgPSBuOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEFyZ3Mgc3RvcFRpbWVvdXRVbml0KFRpbWVVbml0IHR1KSB7CisgICAgICBzdG9wVGltZW91dFVuaXQgPSB0dTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIHJlcXVlc3RUaW1lb3V0KGludCBuKSB7CisgICAgICByZXF1ZXN0VGltZW91dCA9IG47CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyByZXF1ZXN0VGltZW91dFVuaXQoVGltZVVuaXQgdHUpIHsKKyAgICAgIHJlcXVlc3RUaW1lb3V0VW5pdCA9IHR1OworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIC8vQmluYXJ5IGV4cG9uZW50aWFsIGJhY2tvZmYgc2xvdCBsZW5ndGgKKyAgICBwdWJsaWMgQXJncyBiZUJhY2tvZmZTbG90TGVuZ3RoKGludCBuKSB7CisgICAgICBiZUJhY2tvZmZTbG90TGVuZ3RoID0gbjsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8vQmluYXJ5IGV4cG9uZW50aWFsIGJhY2tvZmYgc2xvdCB0aW1lIHVuaXQKKyAgICBwdWJsaWMgQXJncyBiZUJhY2tvZmZTbG90TGVuZ3RoVW5pdChUaW1lVW5pdCB0dSkgeworICAgICAgYmVCYWNrb2ZmU2xvdExlbmd0aFVuaXQgPSB0dTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIGV4ZWN1dG9yU2VydmljZShFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlKSB7CisgICAgICB0aGlzLmV4ZWN1dG9yU2VydmljZSA9IGV4ZWN1dG9yU2VydmljZTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KICAgfQogCiAgIC8vIEV4ZWN1dG9yIHNlcnZpY2UgZm9yIGhhbmRsaW5nIGNsaWVudCBjb25uZWN0aW9ucwogICBwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2VfOwogCi0gIC8vIEZsYWcgZm9yIHN0b3BwaW5nIHRoZSBzZXJ2ZXIKLSAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHN0b3BwZWRfOwotCiAgIHByaXZhdGUgZmluYWwgVGltZVVuaXQgc3RvcFRpbWVvdXRVbml0OwogCiAgIHByaXZhdGUgZmluYWwgbG9uZyBzdG9wVGltZW91dFZhbDsKIAorICBwcml2YXRlIGZpbmFsIFRpbWVVbml0IHJlcXVlc3RUaW1lb3V0VW5pdDsKKworICBwcml2YXRlIGZpbmFsIGxvbmcgcmVxdWVzdFRpbWVvdXQ7CisKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIGJlQmFja29mZlNsb3RJbk1pbGxpczsKKworICBwcml2YXRlIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKwogICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoQXJncyBhcmdzKSB7CiAgICAgc3VwZXIoYXJncyk7CiAKLSAgICBTeW5jaHJvbm91c1F1ZXVlPFJ1bm5hYmxlPiBleGVjdXRvclF1ZXVlID0KLSAgICAgIG5ldyBTeW5jaHJvbm91c1F1ZXVlPFJ1bm5hYmxlPigpOwotCiAgICAgc3RvcFRpbWVvdXRVbml0ID0gYXJncy5zdG9wVGltZW91dFVuaXQ7CiAgICAgc3RvcFRpbWVvdXRWYWwgPSBhcmdzLnN0b3BUaW1lb3V0VmFsOworICAgIHJlcXVlc3RUaW1lb3V0VW5pdCA9IGFyZ3MucmVxdWVzdFRpbWVvdXRVbml0OworICAgIHJlcXVlc3RUaW1lb3V0ID0gYXJncy5yZXF1ZXN0VGltZW91dDsKKyAgICBiZUJhY2tvZmZTbG90SW5NaWxsaXMgPSBhcmdzLmJlQmFja29mZlNsb3RMZW5ndGhVbml0LnRvTWlsbGlzKGFyZ3MuYmVCYWNrb2ZmU2xvdExlbmd0aCk7CiAKLSAgICBleGVjdXRvclNlcnZpY2VfID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcihhcmdzLm1pbldvcmtlclRocmVhZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5tYXhXb3JrZXJUaHJlYWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0LlNFQ09ORFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3JRdWV1ZSk7CisgICAgZXhlY3V0b3JTZXJ2aWNlXyA9IGFyZ3MuZXhlY3V0b3JTZXJ2aWNlICE9IG51bGwgPworICAgICAgICBhcmdzLmV4ZWN1dG9yU2VydmljZSA6IGNyZWF0ZURlZmF1bHRFeGVjdXRvclNlcnZpY2UoYXJncyk7CiAgIH0KIAorICBwcml2YXRlIHN0YXRpYyBFeGVjdXRvclNlcnZpY2UgY3JlYXRlRGVmYXVsdEV4ZWN1dG9yU2VydmljZShBcmdzIGFyZ3MpIHsKKyAgICBTeW5jaHJvbm91c1F1ZXVlPFJ1bm5hYmxlPiBleGVjdXRvclF1ZXVlID0KKyAgICAgIG5ldyBTeW5jaHJvbm91c1F1ZXVlPFJ1bm5hYmxlPigpOworICAgIHJldHVybiBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKGFyZ3MubWluV29ya2VyVGhyZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLm1heFdvcmtlclRocmVhZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5zdG9wVGltZW91dFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnN0b3BUaW1lb3V0VW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvclF1ZXVlKTsKKyAgfQogCi0gIHB1YmxpYyB2b2lkIHNlcnZlKCkgewotICAgIHRyeSB7CisgIHByb3RlY3RlZCBFeGVjdXRvclNlcnZpY2UgZ2V0RXhlY3V0b3JTZXJ2aWNlKCkgeworICAgIHJldHVybiBleGVjdXRvclNlcnZpY2VfOworICB9CisgIAorICBwcm90ZWN0ZWQgYm9vbGVhbiBwcmVTZXJ2ZSgpIHsKKyAgCXRyeSB7CiAgICAgICBzZXJ2ZXJUcmFuc3BvcnRfLmxpc3RlbigpOwogICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CiAgICAgICBMT0dHRVIuZXJyb3IoIkVycm9yIG9jY3VycmVkIGR1cmluZyBsaXN0ZW5pbmcuIiwgdHR4KTsKLSAgICAgIHJldHVybjsKKyAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICAvLyBSdW4gdGhlIHByZVNlcnZlIGV2ZW50CisgICAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gbnVsbCkgeworICAgICAgZXZlbnRIYW5kbGVyXy5wcmVTZXJ2ZSgpOworICAgIH0KICAgICBzdG9wcGVkXyA9IGZhbHNlOwogICAgIHNldFNlcnZpbmcodHJ1ZSk7CisgICAgCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXJ2ZSgpIHsKKyAgCWlmICghcHJlU2VydmUoKSkgeworICAJCXJldHVybjsKKyAgCX0KKworICAJZXhlY3V0ZSgpOworICAJd2FpdEZvclNodXRkb3duKCk7CisgICAgCisgICAgc2V0U2VydmluZyhmYWxzZSk7CisgIH0KKyAgCisgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoKSB7CisgICAgaW50IGZhaWx1cmVDb3VudCA9IDA7CiAgICAgd2hpbGUgKCFzdG9wcGVkXykgewotICAgICAgaW50IGZhaWx1cmVDb3VudCA9IDA7CiAgICAgICB0cnkgewogICAgICAgICBUVHJhbnNwb3J0IGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydF8uYWNjZXB0KCk7CiAgICAgICAgIFdvcmtlclByb2Nlc3Mgd3AgPSBuZXcgV29ya2VyUHJvY2VzcyhjbGllbnQpOwotICAgICAgICBleGVjdXRvclNlcnZpY2VfLmV4ZWN1dGUod3ApOworCisgICAgICAgIGludCByZXRyeUNvdW50ID0gMDsKKyAgICAgICAgbG9uZyByZW1haW5UaW1lSW5NaWxsaXMgPSByZXF1ZXN0VGltZW91dFVuaXQudG9NaWxsaXMocmVxdWVzdFRpbWVvdXQpOworICAgICAgICB3aGlsZSh0cnVlKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4ZWN1dG9yU2VydmljZV8uZXhlY3V0ZSh3cCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IGNhdGNoKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIFJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgIHJldHJ5Q291bnQrKzsKKyAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluVGltZUluTWlsbGlzID4gMCkgeworICAgICAgICAgICAgICAgICAgLy9kbyBhIHRydW5jYXRlZCAyMCBiaW5hcnkgZXhwb25lbnRpYWwgYmFja29mZiBzbGVlcAorICAgICAgICAgICAgICAgICAgbG9uZyBzbGVlcFRpbWVJbk1pbGxpcyA9ICgobG9uZykgKHJhbmRvbS5uZXh0RG91YmxlKCkgKgorICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCBNYXRoLm1pbihyZXRyeUNvdW50LCAyMCkpKSkgKiBiZUJhY2tvZmZTbG90SW5NaWxsaXM7CisgICAgICAgICAgICAgICAgICBzbGVlcFRpbWVJbk1pbGxpcyA9IE1hdGgubWluKHNsZWVwVGltZUluTWlsbGlzLCByZW1haW5UaW1lSW5NaWxsaXMpOworICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTLnNsZWVwKHNsZWVwVGltZUluTWlsbGlzKTsKKyAgICAgICAgICAgICAgICAgIHJlbWFpblRpbWVJbk1pbGxpcyA9IHJlbWFpblRpbWVJbk1pbGxpcyAtIHNsZWVwVGltZUluTWlsbGlzOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgIHdwID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgIExPR0dFUi53YXJuKCJUYXNrIGhhcyBiZWVuIHJlamVjdGVkIGJ5IEV4ZWN1dG9yU2VydmljZSAiICsgcmV0cnlDb3VudAorICAgICAgICAgICAgICAgICAgICAgICsgIiB0aW1lcyB0aWxsIHRpbWVkb3V0LCByZWFzb246ICIgKyB0KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExPR0dFUi53YXJuKCJJbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIHRvIHBsYWNlIGNsaWVudCBvbiBleGVjdXRvciBxdWV1ZS4iKTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHQgaW5zdGFuY2VvZiBFcnJvcikgeworICAgICAgICAgICAgICBMT0dHRVIuZXJyb3IoIkV4ZWN1dG9yU2VydmljZSB0aHJldyBlcnJvcjogIiArIHQsIHQpOworICAgICAgICAgICAgICB0aHJvdyAoRXJyb3IpdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8vZm9yIG90aGVyIHBvc3NpYmxlIHJ1bnRpbWUgZXJyb3JzIGZyb20gRXhlY3V0b3JTZXJ2aWNlLCBzaG91bGQgYWxzbyBub3Qga2lsbCBzZXJ2ZQorICAgICAgICAgICAgICBMT0dHRVIud2FybigiRXhlY3V0b3JTZXJ2aWNlIHRocmV3IGVycm9yOiAiICsgdCwgdCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKICAgICAgICAgaWYgKCFzdG9wcGVkXykgewogICAgICAgICAgICsrZmFpbHVyZUNvdW50OwpAQCAtMTEzLDggKzIzMSwxMCBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgfQotCi0gICAgZXhlY3V0b3JTZXJ2aWNlXy5zaHV0ZG93bigpOworICB9CisgIAorICBwcm90ZWN0ZWQgdm9pZCB3YWl0Rm9yU2h1dGRvd24oKSB7CisgIAlleGVjdXRvclNlcnZpY2VfLnNodXRkb3duKCk7CiAKICAgICAvLyBMb29wIHVudGlsIGF3YWl0VGVybWluYXRpb24gZmluYWxseSBkb2VzIHJldHVybiB3aXRob3V0IGEgaW50ZXJydXB0ZWQKICAgICAvLyBleGNlcHRpb24uIElmIHdlIGRvbid0IGRvIHRoaXMsIHRoZW4gd2UnbGwgc2h1dCBkb3duIHByZW1hdHVyZWx5LiBXZSB3YW50CkBAIC0xMzIsNyArMjUyLDYgQEAKICAgICAgICAgbm93ID0gbmV3bm93OwogICAgICAgfQogICAgIH0KLSAgICBzZXRTZXJ2aW5nKGZhbHNlKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CkBAIC0xNjUsMjkgKzI4NCw2MiBAQAogICAgICAgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOwogICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOwogICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKKworICAgICAgVFNlcnZlckV2ZW50SGFuZGxlciBldmVudEhhbmRsZXIgPSBudWxsOworICAgICAgU2VydmVyQ29udGV4dCBjb25uZWN0aW9uQ29udGV4dCA9IG51bGw7CisKICAgICAgIHRyeSB7CiAgICAgICAgIHByb2Nlc3NvciA9IHByb2Nlc3NvckZhY3RvcnlfLmdldFByb2Nlc3NvcihjbGllbnRfKTsKICAgICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfLmdldFRyYW5zcG9ydChjbGllbnRfKTsKICAgICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KGNsaWVudF8pOwogICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKICAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CisKKyAgICAgICAgZXZlbnRIYW5kbGVyID0gZ2V0RXZlbnRIYW5kbGVyKCk7CisgICAgICAgIGlmIChldmVudEhhbmRsZXIgIT0gbnVsbCkgeworICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gZXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworICAgICAgICB9CiAgICAgICAgIC8vIHdlIGNoZWNrIHN0b3BwZWRfIGZpcnN0IHRvIG1ha2Ugc3VyZSB3ZSdyZSBub3Qgc3VwcG9zZWQgdG8gYmUgc2h1dHRpbmcKICAgICAgICAgLy8gZG93bi4gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIGdyYWNlZnVsIHNodXRkb3duLgotICAgICAgICB3aGlsZSAoIXN0b3BwZWRfICYmIHByb2Nlc3Nvci5wcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkge30KLSAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7Ci0gICAgICAgIC8vIEFzc3VtZSB0aGUgY2xpZW50IGRpZWQgYW5kIGNvbnRpbnVlIHNpbGVudGx5CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisKKyAgICAgICAgICAgIGlmIChldmVudEhhbmRsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICBldmVudEhhbmRsZXIucHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0LCBvdXRwdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihzdG9wcGVkXyB8fCAhcHJvY2Vzc29yLnByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIHR4KSB7CiAgICAgICAgIExPR0dFUi5lcnJvcigiVGhyaWZ0IGVycm9yIG9jY3VycmVkIGR1cmluZyBwcm9jZXNzaW5nIG9mIG1lc3NhZ2UuIiwgdHgpOwogICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKLSAgICAgICAgTE9HR0VSLmVycm9yKCJFcnJvciBvY2N1cnJlZCBkdXJpbmcgcHJvY2Vzc2luZyBvZiBtZXNzYWdlLiIsIHgpOwotICAgICAgfQotCi0gICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gbnVsbCkgewotICAgICAgICBpbnB1dFRyYW5zcG9ydC5jbG9zZSgpOwotICAgICAgfQotCi0gICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IG51bGwpIHsKLSAgICAgICAgb3V0cHV0VHJhbnNwb3J0LmNsb3NlKCk7CisgICAgICAgIC8vIFdlJ2xsIHVzdWFsbHkgcmVjZWl2ZSBSdW50aW1lRXhjZXB0aW9uIHR5cGVzIGhlcmUKKyAgICAgICAgLy8gTmVlZCB0byB1bndyYXAgdG8gYXNjZXJ0YWluIHJlYWwgY2F1c2luZyBleGNlcHRpb24gYmVmb3JlIHdlIGNob29zZSB0byBpZ25vcmUKKyAgICAgICAgVGhyb3dhYmxlIHJlYWxDYXVzZSA9IHguZ2V0Q2F1c2UoKTsKKyAgICAgICAgLy8gSWdub3JlIGVyci1sb2dnaW5nIGFsbCB0cmFuc3BvcnQtbGV2ZWwvdHlwZSBleGNlcHRpb25zCisgICAgICAgIGlmICgocmVhbENhdXNlICE9IG51bGwgJiYgcmVhbENhdXNlIGluc3RhbmNlb2YgVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHx8ICh4IGluc3RhbmNlb2YgVFRyYW5zcG9ydEV4Y2VwdGlvbikpIHsKKyAgICAgICAgICBMT0dHRVIuZGVidWcoCisgICAgICAgICAgICAgICJSZWNlaXZlZCBUVHJhbnNwb3J0RXhjZXB0aW9uIGR1cmluZyBwcm9jZXNzaW5nIG9mIG1lc3NhZ2UuIElnbm9yaW5nLiIsCisgICAgICAgICAgICAgIHgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIExvZyB0aGUgZXhjZXB0aW9uIGF0IGVycm9yIGxldmVsIGFuZCBjb250aW51ZQorICAgICAgICAgIExPR0dFUi5lcnJvcigiRXJyb3Igb2NjdXJyZWQgZHVyaW5nIHByb2Nlc3Npbmcgb2YgbWVzc2FnZS4iLCB4KTsKKyAgICAgICAgfQorICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgaWYgKGV2ZW50SGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgZXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gbnVsbCkgeworICAgICAgICAgIGlucHV0VHJhbnNwb3J0LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBudWxsKSB7CisgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsaWVudF8uaXNPcGVuKCkpIHsKKyAgICAgICAgICBjbGllbnRfLmNsb3NlKCk7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzg1MDdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZWxlY3RvclNlcnZlci5qYXZhCkBAIC0wLDAgKzEsNzQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZENoYW5uZWxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0YWJsZUNoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5SZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiBBIEhhbGYtU3luYy9IYWxmLUFzeW5jIHNlcnZlciB3aXRoIGEgc2VwYXJhdGUgcG9vbCBvZiB0aHJlYWRzIHRvIGhhbmRsZQorICogbm9uLWJsb2NraW5nIEkvTy4gQWNjZXB0cyBhcmUgaGFuZGxlZCBvbiBhIHNpbmdsZSB0aHJlYWQsIGFuZCBhIGNvbmZpZ3VyYWJsZQorICogbnVtYmVyIG9mIG5vbmJsb2NraW5nIHNlbGVjdG9yIHRocmVhZHMgbWFuYWdlIHJlYWRpbmcgYW5kIHdyaXRpbmcgb2YgY2xpZW50CisgKiBjb25uZWN0aW9ucy4gQSBzeW5jaHJvbm91cyB3b3JrZXIgdGhyZWFkIHBvb2wgaGFuZGxlcyBwcm9jZXNzaW5nIG9mIHJlcXVlc3RzLgorICoKKyAqIFBlcmZvcm1zIGJldHRlciB0aGFuIFROb25ibG9ja2luZ1NlcnZlci9USHNIYVNlcnZlciBpbiBtdWx0aS1jb3JlCisgKiBlbnZpcm9ubWVudHMgd2hlbiB0aGUgdGhlIGJvdHRsZW5lY2sgaXMgQ1BVIG9uIHRoZSBzaW5nbGUgc2VsZWN0b3IgdGhyZWFkCisgKiBoYW5kbGluZyBJL08uIEluIGFkZGl0aW9uLCBiZWNhdXNlIHRoZSBhY2NlcHQgaGFuZGxpbmcgaXMgZGVjb3VwbGVkIGZyb20KKyAqIHJlYWRzL3dyaXRlcyBhbmQgaW52b2NhdGlvbiwgdGhlIHNlcnZlciBoYXMgYmV0dGVyIGFiaWxpdHkgdG8gaGFuZGxlIGJhY2stCisgKiBwcmVzc3VyZSBmcm9tIG5ldyBjb25uZWN0aW9ucyAoZS5nLiBzdG9wIGFjY2VwdGluZyB3aGVuIGJ1c3kpLgorICoKKyAqIExpa2UgVE5vbmJsb2NraW5nU2VydmVyLCBpdCByZWxpZXMgb24gdGhlIHVzZSBvZiBURnJhbWVkVHJhbnNwb3J0LgorICovCitwdWJsaWMgY2xhc3MgVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIgZXh0ZW5kcyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBBcmdzIGV4dGVuZHMgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlckFyZ3M8QXJncz4geworCisgICAgLyoqIFRoZSBudW1iZXIgb2YgdGhyZWFkcyBmb3Igc2VsZWN0aW5nIG9uIGFscmVhZHktYWNjZXB0ZWQgY29ubmVjdGlvbnMgKi8KKyAgICBwdWJsaWMgaW50IHNlbGVjdG9yVGhyZWFkcyA9IDI7CisgICAgLyoqCisgICAgICogVGhlIHNpemUgb2YgdGhlIGV4ZWN1dG9yIHNlcnZpY2UgKGlmIG5vbmUgaXMgc3BlY2lmaWVkKSB0aGF0IHdpbGwgaGFuZGxlCisgICAgICogaW52b2NhdGlvbnMuIFRoaXMgbWF5IGJlIHNldCB0byAwLCBpbiB3aGljaCBjYXNlIGludm9jYXRpb25zIHdpbGwgYmUKKyAgICAgKiBoYW5kbGVkIGRpcmVjdGx5IG9uIHRoZSBzZWxlY3RvciB0aHJlYWRzIChhcyBpcyBpbiBUTm9uYmxvY2tpbmdTZXJ2ZXIpCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgd29ya2VyVGhyZWFkcyA9IDU7CisgICAgLyoqIFRpbWUgdG8gd2FpdCBmb3Igc2VydmVyIHRvIHN0b3AgZ3JhY2VmdWxseSAqLworICAgIHByaXZhdGUgaW50IHN0b3BUaW1lb3V0VmFsID0gNjA7CisgICAgcHJpdmF0ZSBUaW1lVW5pdCBzdG9wVGltZW91dFVuaXQgPSBUaW1lVW5pdC5TRUNPTkRTOworICAgIC8qKiBUaGUgRXhlY3V0b3JTZXJ2aWNlIGZvciBoYW5kbGluZyBkaXNwYXRjaGVkIHJlcXVlc3RzICovCisgICAgcHJpdmF0ZSBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0gbnVsbDsKKyAgICAvKioKKyAgICAgKiBUaGUgc2l6ZSBvZiB0aGUgYmxvY2tpbmcgcXVldWUgcGVyIHNlbGVjdG9yIHRocmVhZCBmb3IgcGFzc2luZyBhY2NlcHRlZAorICAgICAqIGNvbm5lY3Rpb25zIHRvIHRoZSBzZWxlY3RvciB0aHJlYWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBhY2NlcHRRdWV1ZVNpemVQZXJUaHJlYWQgPSA0OworCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyB0aGUgc3RyYXRlZ3kgZm9yIGhhbmRsaW5nIG5ldyBhY2NlcHRlZCBjb25uZWN0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGVudW0gQWNjZXB0UG9saWN5IHsKKyAgICAgIC8qKgorICAgICAgICogUmVxdWlyZSBhY2NlcHRlZCBjb25uZWN0aW9uIHJlZ2lzdHJhdGlvbiB0byBiZSBoYW5kbGVkIGJ5IHRoZSBleGVjdXRvci4KKyAgICAgICAqIElmIHRoZSB3b3JrZXIgcG9vbCBpcyBzYXR1cmF0ZWQsIGZ1cnRoZXIgYWNjZXB0cyB3aWxsIGJlIGNsb3NlZAorICAgICAgICogaW1tZWRpYXRlbHkuIFNsaWdodGx5IGluY3JlYXNlcyBsYXRlbmN5IGR1ZSB0byBhbiBleHRyYSBzY2hlZHVsaW5nLgorICAgICAgICovCisgICAgICBGQUlSX0FDQ0VQVCwKKyAgICAgIC8qKgorICAgICAgICogSGFuZGxlIHRoZSBhY2NlcHRzIGFzIGZhc3QgYXMgcG9zc2libGUsIGRpc3JlZ2FyZGluZyB0aGUgc3RhdHVzIG9mIHRoZQorICAgICAgICogZXhlY3V0b3Igc2VydmljZS4KKyAgICAgICAqLworICAgICAgRkFTVF9BQ0NFUFQKKyAgICB9CisKKyAgICBwcml2YXRlIEFjY2VwdFBvbGljeSBhY2NlcHRQb2xpY3kgPSBBY2NlcHRQb2xpY3kuRkFTVF9BQ0NFUFQ7CisKKyAgICBwdWJsaWMgQXJncyhUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgICBzdXBlcih0cmFuc3BvcnQpOworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIHNlbGVjdG9yVGhyZWFkcyhpbnQgaSkgeworICAgICAgc2VsZWN0b3JUaHJlYWRzID0gaTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0b3JUaHJlYWRzKCkgeworICAgICAgcmV0dXJuIHNlbGVjdG9yVGhyZWFkczsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyB3b3JrZXJUaHJlYWRzKGludCBpKSB7CisgICAgICB3b3JrZXJUaHJlYWRzID0gaTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0V29ya2VyVGhyZWFkcygpIHsKKyAgICAgIHJldHVybiB3b3JrZXJUaHJlYWRzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U3RvcFRpbWVvdXRWYWwoKSB7CisgICAgICByZXR1cm4gc3RvcFRpbWVvdXRWYWw7CisgICAgfQorCisgICAgcHVibGljIEFyZ3Mgc3RvcFRpbWVvdXRWYWwoaW50IHN0b3BUaW1lb3V0VmFsKSB7CisgICAgICB0aGlzLnN0b3BUaW1lb3V0VmFsID0gc3RvcFRpbWVvdXRWYWw7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgVGltZVVuaXQgZ2V0U3RvcFRpbWVvdXRVbml0KCkgeworICAgICAgcmV0dXJuIHN0b3BUaW1lb3V0VW5pdDsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyBzdG9wVGltZW91dFVuaXQoVGltZVVuaXQgc3RvcFRpbWVvdXRVbml0KSB7CisgICAgICB0aGlzLnN0b3BUaW1lb3V0VW5pdCA9IHN0b3BUaW1lb3V0VW5pdDsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBFeGVjdXRvclNlcnZpY2UgZ2V0RXhlY3V0b3JTZXJ2aWNlKCkgeworICAgICAgcmV0dXJuIGV4ZWN1dG9yU2VydmljZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyBleGVjdXRvclNlcnZpY2UoRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSkgeworICAgICAgdGhpcy5leGVjdXRvclNlcnZpY2UgPSBleGVjdXRvclNlcnZpY2U7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEFjY2VwdFF1ZXVlU2l6ZVBlclRocmVhZCgpIHsKKyAgICAgIHJldHVybiBhY2NlcHRRdWV1ZVNpemVQZXJUaHJlYWQ7CisgICAgfQorCisgICAgcHVibGljIEFyZ3MgYWNjZXB0UXVldWVTaXplUGVyVGhyZWFkKGludCBhY2NlcHRRdWV1ZVNpemVQZXJUaHJlYWQpIHsKKyAgICAgIHRoaXMuYWNjZXB0UXVldWVTaXplUGVyVGhyZWFkID0gYWNjZXB0UXVldWVTaXplUGVyVGhyZWFkOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEFjY2VwdFBvbGljeSBnZXRBY2NlcHRQb2xpY3koKSB7CisgICAgICByZXR1cm4gYWNjZXB0UG9saWN5OworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIGFjY2VwdFBvbGljeShBY2NlcHRQb2xpY3kgYWNjZXB0UG9saWN5KSB7CisgICAgICB0aGlzLmFjY2VwdFBvbGljeSA9IGFjY2VwdFBvbGljeTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgeworICAgICAgaWYgKHNlbGVjdG9yVGhyZWFkcyA8PSAwKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yVGhyZWFkcyBtdXN0IGJlIHBvc2l0aXZlLiIpOworICAgICAgfQorICAgICAgaWYgKHdvcmtlclRocmVhZHMgPCAwKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIndvcmtlclRocmVhZHMgbXVzdCBiZSBub24tbmVnYXRpdmUuIik7CisgICAgICB9CisgICAgICBpZiAoYWNjZXB0UXVldWVTaXplUGVyVGhyZWFkIDw9IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWNjZXB0UXVldWVTaXplUGVyVGhyZWFkIG11c3QgYmUgcG9zaXRpdmUuIik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gVGhlIHRocmVhZCBoYW5kbGluZyBhbGwgYWNjZXB0cworICBwcml2YXRlIEFjY2VwdFRocmVhZCBhY2NlcHRUaHJlYWQ7CisKKyAgLy8gVGhyZWFkcyBoYW5kbGluZyBldmVudHMgb24gY2xpZW50IHRyYW5zcG9ydHMKKyAgcHJpdmF0ZSBmaW5hbCBTZXQ8U2VsZWN0b3JUaHJlYWQ+IHNlbGVjdG9yVGhyZWFkcyA9IG5ldyBIYXNoU2V0PFNlbGVjdG9yVGhyZWFkPigpOworCisgIC8vIFRoaXMgd3JhcHMgYWxsIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHF1ZXVlaW5nIGFuZCB0aHJlYWQgcG9vbCBtYW5hZ2VtZW50CisgIC8vIGZvciB0aGUgcGFzc2luZyBvZiBJbnZvY2F0aW9ucyBmcm9tIHRoZSBzZWxlY3RvciB0aHJlYWQocykgdG8gdGhlIHdvcmtlcnMKKyAgLy8gKGlmIGFueSkuCisgIHByaXZhdGUgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGludm9rZXI7CisKKyAgcHJpdmF0ZSBmaW5hbCBBcmdzIGFyZ3M7CisKKyAgLyoqCisgICAqIENyZWF0ZSB0aGUgc2VydmVyIHdpdGggdGhlIHNwZWNpZmllZCBBcmdzIGNvbmZpZ3VyYXRpb24KKyAgICovCisgIHB1YmxpYyBUVGhyZWFkZWRTZWxlY3RvclNlcnZlcihBcmdzIGFyZ3MpIHsKKyAgICBzdXBlcihhcmdzKTsKKyAgICBhcmdzLnZhbGlkYXRlKCk7CisgICAgaW52b2tlciA9IGFyZ3MuZXhlY3V0b3JTZXJ2aWNlID09IG51bGwgPyBjcmVhdGVEZWZhdWx0RXhlY3V0b3IoYXJncykgOiBhcmdzLmV4ZWN1dG9yU2VydmljZTsKKyAgICB0aGlzLmFyZ3MgPSBhcmdzOworICB9CisKKyAgLyoqCisgICAqIFN0YXJ0IHRoZSBhY2NlcHQgYW5kIHNlbGVjdG9yIHRocmVhZHMgcnVubmluZyB0byBkZWFsIHdpdGggY2xpZW50cy4KKyAgICoKKyAgICogQHJldHVybiB0cnVlIGlmIGV2ZXJ5dGhpbmcgd2VudCBvaywgZmFsc2UgaWYgd2UgY291bGRuJ3Qgc3RhcnQgZm9yIHNvbWUKKyAgICogICAgICAgICByZWFzb24uCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRUaHJlYWRzKCkgeworICAgIHRyeSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3Muc2VsZWN0b3JUaHJlYWRzOyArK2kpIHsKKyAgICAgICAgc2VsZWN0b3JUaHJlYWRzLmFkZChuZXcgU2VsZWN0b3JUaHJlYWQoYXJncy5hY2NlcHRRdWV1ZVNpemVQZXJUaHJlYWQpKTsKKyAgICAgIH0KKyAgICAgIGFjY2VwdFRocmVhZCA9IG5ldyBBY2NlcHRUaHJlYWQoKFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCkgc2VydmVyVHJhbnNwb3J0XywKKyAgICAgICAgY3JlYXRlU2VsZWN0b3JUaHJlYWRMb2FkQmFsYW5jZXIoc2VsZWN0b3JUaHJlYWRzKSk7CisgICAgICBmb3IgKFNlbGVjdG9yVGhyZWFkIHRocmVhZCA6IHNlbGVjdG9yVGhyZWFkcykgeworICAgICAgICB0aHJlYWQuc3RhcnQoKTsKKyAgICAgIH0KKyAgICAgIGFjY2VwdFRocmVhZC5zdGFydCgpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgTE9HR0VSLmVycm9yKCJGYWlsZWQgdG8gc3RhcnQgdGhyZWFkcyEiLCBlKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogSm9pbnMgdGhlIGFjY2VwdCBhbmQgc2VsZWN0b3IgdGhyZWFkcyBhbmQgc2h1dHMgZG93biB0aGUgZXhlY3V0b3Igc2VydmljZS4KKyAgICovCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCB3YWl0Rm9yU2h1dGRvd24oKSB7CisgICAgdHJ5IHsKKyAgICAgIGpvaW5UaHJlYWRzKCk7CisgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgLy8gTm9uLWdyYWNlZnVsIHNodXRkb3duIG9jY3VycmVkCisgICAgICBMT0dHRVIuZXJyb3IoIkludGVycnVwdGVkIHdoaWxlIGpvaW5pbmcgdGhyZWFkcyEiLCBlKTsKKyAgICB9CisgICAgZ3JhY2VmdWxseVNodXRkb3duSW52b2tlclBvb2woKTsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIGpvaW5UaHJlYWRzKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAvLyB3YWl0IHVudGlsIHRoZSBpbyB0aHJlYWRzIGV4aXQKKyAgICBhY2NlcHRUaHJlYWQuam9pbigpOworICAgIGZvciAoU2VsZWN0b3JUaHJlYWQgdGhyZWFkIDogc2VsZWN0b3JUaHJlYWRzKSB7CisgICAgICB0aHJlYWQuam9pbigpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBTdG9wIHNlcnZpbmcgYW5kIHNodXQgZXZlcnl0aGluZyBkb3duLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgc3RvcHBlZF8gPSB0cnVlOworCisgICAgLy8gU3RvcCBxdWV1aW5nIGNvbm5lY3QgYXR0ZW1wdHMgYXNhcAorICAgIHN0b3BMaXN0ZW5pbmcoKTsKKworICAgIGlmIChhY2NlcHRUaHJlYWQgIT0gbnVsbCkgeworICAgICAgYWNjZXB0VGhyZWFkLndha2V1cFNlbGVjdG9yKCk7CisgICAgfQorICAgIGlmIChzZWxlY3RvclRocmVhZHMgIT0gbnVsbCkgeworICAgICAgZm9yIChTZWxlY3RvclRocmVhZCB0aHJlYWQgOiBzZWxlY3RvclRocmVhZHMpIHsKKyAgICAgICAgaWYgKHRocmVhZCAhPSBudWxsKQorICAgICAgICAgIHRocmVhZC53YWtldXBTZWxlY3RvcigpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIGdyYWNlZnVsbHlTaHV0ZG93bkludm9rZXJQb29sKCkgeworICAgIC8vIHRyeSB0byBncmFjZWZ1bGx5IHNodXQgZG93biB0aGUgZXhlY3V0b3Igc2VydmljZQorICAgIGludm9rZXIuc2h1dGRvd24oKTsKKworICAgIC8vIExvb3AgdW50aWwgYXdhaXRUZXJtaW5hdGlvbiBmaW5hbGx5IGRvZXMgcmV0dXJuIHdpdGhvdXQgYSBpbnRlcnJ1cHRlZAorICAgIC8vIGV4Y2VwdGlvbi4gSWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlbiB3ZSdsbCBzaHV0IGRvd24gcHJlbWF0dXJlbHkuIFdlIHdhbnQKKyAgICAvLyB0byBsZXQgdGhlIGV4ZWN1dG9yU2VydmljZSBjbGVhciBpdCdzIHRhc2sgcXVldWUsIGNsb3NpbmcgY2xpZW50IHNvY2tldHMKKyAgICAvLyBhcHByb3ByaWF0ZWx5LgorICAgIGxvbmcgdGltZW91dE1TID0gYXJncy5zdG9wVGltZW91dFVuaXQudG9NaWxsaXMoYXJncy5zdG9wVGltZW91dFZhbCk7CisgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICB3aGlsZSAodGltZW91dE1TID49IDApIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGludm9rZXIuYXdhaXRUZXJtaW5hdGlvbih0aW1lb3V0TVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIGJyZWFrOworICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaXgpIHsKKyAgICAgICAgbG9uZyBuZXdub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgdGltZW91dE1TIC09IChuZXdub3cgLSBub3cpOworICAgICAgICBub3cgPSBuZXdub3c7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFdlIG92ZXJyaWRlIHRoZSBzdGFuZGFyZCBpbnZva2UgbWV0aG9kIGhlcmUgdG8gcXVldWUgdGhlIGludm9jYXRpb24gZm9yCisgICAqIGludm9rZXIgc2VydmljZSBpbnN0ZWFkIG9mIGltbWVkaWF0ZWx5IGludm9raW5nLiBJZiB0aGVyZSBpcyBubyB0aHJlYWQKKyAgICogcG9vbCwgaGFuZGxlIHRoZSBpbnZvY2F0aW9uIGlubGluZSBvbiB0aGlzIHRocmVhZAorICAgKi8KKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBib29sZWFuIHJlcXVlc3RJbnZva2UoRnJhbWVCdWZmZXIgZnJhbWVCdWZmZXIpIHsKKyAgICBSdW5uYWJsZSBpbnZvY2F0aW9uID0gZ2V0UnVubmFibGUoZnJhbWVCdWZmZXIpOworICAgIGlmIChpbnZva2VyICE9IG51bGwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGludm9rZXIuZXhlY3V0ZShpbnZvY2F0aW9uKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGNhdGNoIChSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbiByeCkgeworICAgICAgICBMT0dHRVIud2FybigiRXhlY3V0b3JTZXJ2aWNlIHJlamVjdGVkIGV4ZWN1dGlvbiEiLCByeCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gSW52b2tlIG9uIHRoZSBjYWxsZXIncyB0aHJlYWQKKyAgICAgIGludm9jYXRpb24ucnVuKCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICBwcm90ZWN0ZWQgUnVubmFibGUgZ2V0UnVubmFibGUoRnJhbWVCdWZmZXIgZnJhbWVCdWZmZXIpIHsKKyAgICByZXR1cm4gbmV3IEludm9jYXRpb24oZnJhbWVCdWZmZXIpOworICB9CisKKyAgLyoqCisgICAqIEhlbHBlciB0byBjcmVhdGUgdGhlIGludm9rZXIgaWYgb25lIGlzIG5vdCBzcGVjaWZpZWQKKyAgICovCisgIHByb3RlY3RlZCBzdGF0aWMgRXhlY3V0b3JTZXJ2aWNlIGNyZWF0ZURlZmF1bHRFeGVjdXRvcihBcmdzIG9wdGlvbnMpIHsKKyAgICByZXR1cm4gKG9wdGlvbnMud29ya2VyVGhyZWFkcyA+IDApID8gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbChvcHRpb25zLndvcmtlclRocmVhZHMpIDogbnVsbDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEJsb2NraW5nUXVldWU8VE5vbmJsb2NraW5nVHJhbnNwb3J0PiBjcmVhdGVEZWZhdWx0QWNjZXB0UXVldWUoaW50IHF1ZXVlU2l6ZSkgeworICAgIGlmIChxdWV1ZVNpemUgPT0gMCkgeworICAgICAgLy8gVW5ib3VuZGVkIHF1ZXVlCisgICAgICByZXR1cm4gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8VE5vbmJsb2NraW5nVHJhbnNwb3J0PigpOworICAgIH0KKyAgICByZXR1cm4gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxUTm9uYmxvY2tpbmdUcmFuc3BvcnQ+KHF1ZXVlU2l6ZSk7CisgIH0KKworICAvKioKKyAgICogVGhlIHRocmVhZCB0aGF0IHNlbGVjdHMgb24gdGhlIHNlcnZlciB0cmFuc3BvcnQgKGxpc3RlbiBzb2NrZXQpIGFuZCBhY2NlcHRzCisgICAqIG5ldyBjb25uZWN0aW9ucyB0byBoYW5kIG9mZiB0byB0aGUgSU8gc2VsZWN0b3IgdGhyZWFkcworICAgKi8KKyAgcHJvdGVjdGVkIGNsYXNzIEFjY2VwdFRocmVhZCBleHRlbmRzIFRocmVhZCB7CisKKyAgICAvLyBUaGUgbGlzdGVuIHNvY2tldCB0byBhY2NlcHQgb24KKyAgICBwcml2YXRlIGZpbmFsIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTZWxlY3RvciBhY2NlcHRTZWxlY3RvcjsKKworICAgIHByaXZhdGUgZmluYWwgU2VsZWN0b3JUaHJlYWRMb2FkQmFsYW5jZXIgdGhyZWFkQ2hvb3NlcjsKKworICAgIC8qKgorICAgICAqIFNldCB1cCB0aGUgQWNjZXB0VGhlYWQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgQWNjZXB0VGhyZWFkKFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgIFNlbGVjdG9yVGhyZWFkTG9hZEJhbGFuY2VyIHRocmVhZENob29zZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICB0aGlzLnNlcnZlclRyYW5zcG9ydCA9IHNlcnZlclRyYW5zcG9ydDsKKyAgICAgIHRoaXMudGhyZWFkQ2hvb3NlciA9IHRocmVhZENob29zZXI7CisgICAgICB0aGlzLmFjY2VwdFNlbGVjdG9yID0gU2VsZWN0b3JQcm92aWRlci5wcm92aWRlcigpLm9wZW5TZWxlY3RvcigpOworICAgICAgdGhpcy5zZXJ2ZXJUcmFuc3BvcnQucmVnaXN0ZXJTZWxlY3RvcihhY2NlcHRTZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHdvcmsgbG9vcC4gU2VsZWN0cyBvbiB0aGUgc2VydmVyIHRyYW5zcG9ydCBhbmQgYWNjZXB0cy4gSWYgdGhlcmUgd2FzCisgICAgICogYSBzZXJ2ZXIgdHJhbnNwb3J0IHRoYXQgaGFkIGJsb2NraW5nIGFjY2VwdHMsIGFuZCByZXR1cm5lZCBvbiBibG9ja2luZworICAgICAqIGNsaWVudCB0cmFuc3BvcnRzLCB0aGF0IHNob3VsZCBiZSB1c2VkIGluc3RlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICB0cnkgeworICAgICAgICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBudWxsKSB7CisgICAgICAgICAgZXZlbnRIYW5kbGVyXy5wcmVTZXJ2ZSgpOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKCFzdG9wcGVkXykgeworICAgICAgICAgIHNlbGVjdCgpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICBMT0dHRVIuZXJyb3IoInJ1bigpIG9uIEFjY2VwdFRocmVhZCBleGl0aW5nIGR1ZSB0byB1bmNhdWdodCBlcnJvciIsIHQpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBhY2NlcHRTZWxlY3Rvci5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgTE9HR0VSLmVycm9yKCJHb3QgYW4gSU9FeGNlcHRpb24gd2hpbGUgY2xvc2luZyBhY2NlcHQgc2VsZWN0b3IhIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhpcyB3aWxsIHdha2UgdXAgdGhlIHNlbGVjdG9yIHRocmVhZHMKKyAgICAgICAgVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIudGhpcy5zdG9wKCk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIHNlbGVjdG9yIGlzIGJsb2NrZWQsIHdha2UgaXQgdXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd2FrZXVwU2VsZWN0b3IoKSB7CisgICAgICBhY2NlcHRTZWxlY3Rvci53YWtldXAoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgYW5kIHByb2Nlc3MgSU8gZXZlbnRzIGFwcHJvcHJpYXRlbHk6IElmIHRoZXJlIGFyZSBjb25uZWN0aW9ucyB0bworICAgICAqIGJlIGFjY2VwdGVkLCBhY2NlcHQgdGhlbS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2VsZWN0KCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgLy8gd2FpdCBmb3IgY29ubmVjdCBldmVudHMuCisgICAgICAgIGFjY2VwdFNlbGVjdG9yLnNlbGVjdCgpOworCisgICAgICAgIC8vIHByb2Nlc3MgdGhlIGlvIGV2ZW50cyB3ZSByZWNlaXZlZAorICAgICAgICBJdGVyYXRvcjxTZWxlY3Rpb25LZXk+IHNlbGVjdGVkS2V5cyA9IGFjY2VwdFNlbGVjdG9yLnNlbGVjdGVkS2V5cygpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlICghc3RvcHBlZF8gJiYgc2VsZWN0ZWRLZXlzLmhhc05leHQoKSkgeworICAgICAgICAgIFNlbGVjdGlvbktleSBrZXkgPSBzZWxlY3RlZEtleXMubmV4dCgpOworICAgICAgICAgIHNlbGVjdGVkS2V5cy5yZW1vdmUoKTsKKworICAgICAgICAgIC8vIHNraXAgaWYgbm90IHZhbGlkCisgICAgICAgICAgaWYgKCFrZXkuaXNWYWxpZCgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoa2V5LmlzQWNjZXB0YWJsZSgpKSB7CisgICAgICAgICAgICBoYW5kbGVBY2NlcHQoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HR0VSLndhcm4oIlVuZXhwZWN0ZWQgc3RhdGUgaW4gc2VsZWN0ISAiICsga2V5LmludGVyZXN0T3BzKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBMT0dHRVIud2FybigiR290IGFuIElPRXhjZXB0aW9uIHdoaWxlIHNlbGVjdGluZyEiLCBlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY2NlcHQgYSBuZXcgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlQWNjZXB0KCkgeworICAgICAgZmluYWwgVE5vbmJsb2NraW5nVHJhbnNwb3J0IGNsaWVudCA9IGRvQWNjZXB0KCk7CisgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKKyAgICAgICAgLy8gUGFzcyB0aGlzIGNvbm5lY3Rpb24gdG8gYSBzZWxlY3RvciB0aHJlYWQKKyAgICAgICAgZmluYWwgU2VsZWN0b3JUaHJlYWQgdGFyZ2V0VGhyZWFkID0gdGhyZWFkQ2hvb3Nlci5uZXh0VGhyZWFkKCk7CisKKyAgICAgICAgaWYgKGFyZ3MuYWNjZXB0UG9saWN5ID09IEFyZ3MuQWNjZXB0UG9saWN5LkZBU1RfQUNDRVBUIHx8IGludm9rZXIgPT0gbnVsbCkgeworICAgICAgICAgIGRvQWRkQWNjZXB0KHRhcmdldFRocmVhZCwgY2xpZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBGQUlSX0FDQ0VQVAorICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnZva2VyLnN1Ym1pdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBkb0FkZEFjY2VwdCh0YXJnZXRUaHJlYWQsIGNsaWVudCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0gY2F0Y2ggKFJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uIHJ4KSB7CisgICAgICAgICAgICBMT0dHRVIud2FybigiRXhlY3V0b3JTZXJ2aWNlIHJlamVjdGVkIGFjY2VwdCByZWdpc3RyYXRpb24hIiwgcngpOworICAgICAgICAgICAgLy8gY2xvc2UgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgIGNsaWVudC5jbG9zZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgVE5vbmJsb2NraW5nVHJhbnNwb3J0IGRvQWNjZXB0KCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIChUTm9uYmxvY2tpbmdUcmFuc3BvcnQpIHNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKTsKKyAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHRlKSB7CisgICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nIGFjY2VwdGluZy4KKyAgICAgICAgTE9HR0VSLndhcm4oIkV4Y2VwdGlvbiB0cnlpbmcgdG8gYWNjZXB0ISIsIHR0ZSk7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb0FkZEFjY2VwdChTZWxlY3RvclRocmVhZCB0aHJlYWQsIFROb25ibG9ja2luZ1RyYW5zcG9ydCBjbGllbnQpIHsKKyAgICAgIGlmICghdGhyZWFkLmFkZEFjY2VwdGVkQ29ubmVjdGlvbihjbGllbnQpKSB7CisgICAgICAgIGNsaWVudC5jbG9zZSgpOworICAgICAgfQorICAgIH0KKyAgfSAvLyBBY2NlcHRUaHJlYWQKKworICAvKioKKyAgICogVGhlIFNlbGVjdG9yVGhyZWFkKHMpIHdpbGwgYmUgZG9pbmcgYWxsIHRoZSBzZWxlY3Rpbmcgb24gYWNjZXB0ZWQgYWN0aXZlCisgICAqIGNvbm5lY3Rpb25zLgorICAgKi8KKyAgcHJvdGVjdGVkIGNsYXNzIFNlbGVjdG9yVGhyZWFkIGV4dGVuZHMgQWJzdHJhY3RTZWxlY3RUaHJlYWQgeworCisgICAgLy8gQWNjZXB0ZWQgY29ubmVjdGlvbnMgYWRkZWQgYnkgdGhlIGFjY2VwdCB0aHJlYWQuCisgICAgcHJpdmF0ZSBmaW5hbCBCbG9ja2luZ1F1ZXVlPFROb25ibG9ja2luZ1RyYW5zcG9ydD4gYWNjZXB0ZWRRdWV1ZTsKKyAgICBwcml2YXRlIGludCBTRUxFQ1RPUl9BVVRPX1JFQlVJTERfVEhSRVNIT0xEID0gNTEyOworICAgIHByaXZhdGUgbG9uZyBNT05JVE9SX1BFUklPRCA9IDEwMDBMOworICAgIHByaXZhdGUgaW50IGp2bUJ1ZyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdXAgdGhlIFNlbGVjdG9yVGhyZWFkIHdpdGggYW4gdW5ib3VuZGVkIHF1ZXVlIGZvciBpbmNvbWluZyBhY2NlcHRzLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICBpZiBhIHNlbGVjdG9yIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICovCisgICAgcHVibGljIFNlbGVjdG9yVGhyZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHRoaXMobmV3IExpbmtlZEJsb2NraW5nUXVldWU8VE5vbmJsb2NraW5nVHJhbnNwb3J0PigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdXAgdGhlIFNlbGVjdG9yVGhyZWFkIHdpdGggYW4gYm91bmRlZCBxdWV1ZSBmb3IgaW5jb21pbmcgYWNjZXB0cy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgaWYgYSBzZWxlY3RvciBjYW5ub3QgYmUgY3JlYXRlZAorICAgICAqLworICAgIHB1YmxpYyBTZWxlY3RvclRocmVhZChpbnQgbWF4UGVuZGluZ0FjY2VwdHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICB0aGlzKGNyZWF0ZURlZmF1bHRBY2NlcHRRdWV1ZShtYXhQZW5kaW5nQWNjZXB0cykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB1cCB0aGUgU2VsZWN0b3JUaHJlYWQgd2l0aCBhIHNwZWNpZmllZCBxdWV1ZSBmb3IgY29ubmVjdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWNjZXB0ZWRRdWV1ZQorICAgICAqICAgICAgICAgIFRoZSBCbG9ja2luZ1F1ZXVlIGltcGxlbWVudGF0aW9uIGZvciBob2xkaW5nIGluY29taW5nIGFjY2VwdGVkCisgICAgICogICAgICAgICAgY29ubmVjdGlvbnMuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICBpZiBhIHNlbGVjdG9yIGNhbm5vdCBiZSBjcmVhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBTZWxlY3RvclRocmVhZChCbG9ja2luZ1F1ZXVlPFROb25ibG9ja2luZ1RyYW5zcG9ydD4gYWNjZXB0ZWRRdWV1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHRoaXMuYWNjZXB0ZWRRdWV1ZSA9IGFjY2VwdGVkUXVldWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFuZHMgb2ZmIGFuIGFjY2VwdGVkIGNvbm5lY3Rpb24gdG8gYmUgaGFuZGxlZCBieSB0aGlzIHRocmVhZC4gVGhpcworICAgICAqIG1ldGhvZCB3aWxsIGJsb2NrIGlmIHRoZSBxdWV1ZSBmb3IgbmV3IGNvbm5lY3Rpb25zIGlzIGF0IGNhcGFjaXR5LgorICAgICAqCisgICAgICogQHBhcmFtIGFjY2VwdGVkCisgICAgICogICAgICAgICAgVGhlIGNvbm5lY3Rpb24gdGhhdCBoYXMgYmVlbiBhY2NlcHRlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFkZEFjY2VwdGVkQ29ubmVjdGlvbihUTm9uYmxvY2tpbmdUcmFuc3BvcnQgYWNjZXB0ZWQpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGFjY2VwdGVkUXVldWUucHV0KGFjY2VwdGVkKTsKKyAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTE9HR0VSLndhcm4oIkludGVycnVwdGVkIHdoaWxlIGFkZGluZyBhY2NlcHRlZCBjb25uZWN0aW9uISIsIGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBzZWxlY3Rvci53YWtldXAoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB3b3JrIGxvb3AuIEhhbmRsZXMgc2VsZWN0aW5nIChyZWFkL3dyaXRlIElPKSwgZGlzcGF0Y2hpbmcsIGFuZAorICAgICAqIG1hbmFnaW5nIHRoZSBzZWxlY3Rpb24gcHJlZmVyZW5jZXMgb2YgYWxsIGV4aXN0aW5nIGNvbm5lY3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHdoaWxlICghc3RvcHBlZF8pIHsKKyAgICAgICAgICBzZWxlY3QoKTsKKyAgICAgICAgICBwcm9jZXNzQWNjZXB0ZWRDb25uZWN0aW9ucygpOworICAgICAgICAgIHByb2Nlc3NJbnRlcmVzdENoYW5nZXMoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFNlbGVjdGlvbktleSBzZWxlY3Rpb25LZXkgOiBzZWxlY3Rvci5rZXlzKCkpIHsKKyAgICAgICAgICBjbGVhbnVwU2VsZWN0aW9uS2V5KHNlbGVjdGlvbktleSk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgIExPR0dFUi5lcnJvcigicnVuKCkgb24gU2VsZWN0b3JUaHJlYWQgZXhpdGluZyBkdWUgdG8gdW5jYXVnaHQgZXJyb3IiLCB0KTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc2VsZWN0b3IuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIExPR0dFUi5lcnJvcigiR290IGFuIElPRXhjZXB0aW9uIHdoaWxlIGNsb3Npbmcgc2VsZWN0b3IhIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhpcyB3aWxsIHdha2UgdXAgdGhlIGFjY2VwdCB0aHJlYWQgYW5kIHRoZSBvdGhlciBzZWxlY3RvciB0aHJlYWRzCisgICAgICAgIFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyLnRoaXMuc3RvcCgpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbGVjdCBhbmQgcHJvY2VzcyBJTyBldmVudHMgYXBwcm9wcmlhdGVseTogSWYgdGhlcmUgYXJlIGV4aXN0aW5nCisgICAgICogY29ubmVjdGlvbnMgd2l0aCBkYXRhIHdhaXRpbmcgdG8gYmUgcmVhZCwgcmVhZCBpdCwgYnVmZmVyaW5nIHVudGlsIGEKKyAgICAgKiB3aG9sZSBmcmFtZSBoYXMgYmVlbiByZWFkLiBJZiB0aGVyZSBhcmUgYW55IHBlbmRpbmcgcmVzcG9uc2VzLCBidWZmZXIKKyAgICAgKiB0aGVtIHVudGlsIHRoZWlyIHRhcmdldCBjbGllbnQgaXMgYXZhaWxhYmxlLCBhbmQgdGhlbiBzZW5kIHRoZSBkYXRhLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZWxlY3QoKSB7CisgICAgICB0cnkgeworCisgICAgICAgIGRvU2VsZWN0KCk7CisKKyAgICAgICAgLy8gcHJvY2VzcyB0aGUgaW8gZXZlbnRzIHdlIHJlY2VpdmVkCisgICAgICAgIEl0ZXJhdG9yPFNlbGVjdGlvbktleT4gc2VsZWN0ZWRLZXlzID0gc2VsZWN0b3Iuc2VsZWN0ZWRLZXlzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKCFzdG9wcGVkXyAmJiBzZWxlY3RlZEtleXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgU2VsZWN0aW9uS2V5IGtleSA9IHNlbGVjdGVkS2V5cy5uZXh0KCk7CisgICAgICAgICAgc2VsZWN0ZWRLZXlzLnJlbW92ZSgpOworCisgICAgICAgICAgLy8gc2tpcCBpZiBub3QgdmFsaWQKKyAgICAgICAgICBpZiAoIWtleS5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIGNsZWFudXBTZWxlY3Rpb25LZXkoa2V5KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChrZXkuaXNSZWFkYWJsZSgpKSB7CisgICAgICAgICAgICAvLyBkZWFsIHdpdGggcmVhZHMKKyAgICAgICAgICAgIGhhbmRsZVJlYWQoa2V5KTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGtleS5pc1dyaXRhYmxlKCkpIHsKKyAgICAgICAgICAgIC8vIGRlYWwgd2l0aCB3cml0ZXMKKyAgICAgICAgICAgIGhhbmRsZVdyaXRlKGtleSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0dFUi53YXJuKCJVbmV4cGVjdGVkIHN0YXRlIGluIHNlbGVjdCEgIiArIGtleS5pbnRlcmVzdE9wcygpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTE9HR0VSLndhcm4oIkdvdCBhbiBJT0V4Y2VwdGlvbiB3aGlsZSBzZWxlY3RpbmchIiwgZSk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRG8gc2VsZWN0IGFuZCBqdWRnZSBlcG9sbCBidWcgaGFwcGVuLgorICAgICAqIFNlZSA6IGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQyNTEKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZG9TZWxlY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgbG9uZyBiZWZvcmVTZWxlY3QgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgIGludCBzZWxlY3RlZE51bXMgPSBzZWxlY3Rvci5zZWxlY3QoKTsKKyAgICAgIGxvbmcgYWZ0ZXJTZWxlY3QgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgaWYgKHNlbGVjdGVkTnVtcyA9PSAwKSB7CisgICAgICAgIGp2bUJ1ZysrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAganZtQnVnID0gMDsKKyAgICAgIH0KKworICAgICAgbG9uZyBzZWxlY3RlZFRpbWUgPSBhZnRlclNlbGVjdCAtIGJlZm9yZVNlbGVjdDsKKyAgICAgIGlmIChzZWxlY3RlZFRpbWUgPj0gTU9OSVRPUl9QRVJJT0QpIHsKKyAgICAgICAganZtQnVnID0gMDsKKyAgICAgIH0gZWxzZSBpZiAoanZtQnVnID4gU0VMRUNUT1JfQVVUT19SRUJVSUxEX1RIUkVTSE9MRCkgeworICAgICAgICBMT0dHRVIud2FybigiSW4ge30gbXMgaGFwcGVuIHt9IHRpbWVzIGp2bSBidWc7IHJlYnVpbGRpbmcgc2VsZWN0b3IuIiwgTU9OSVRPUl9QRVJJT0QsIGp2bUJ1Zyk7CisgICAgICAgIHJlYnVpbGRTZWxlY3RvcigpOworICAgICAgICBzZWxlY3Rvci5zZWxlY3ROb3coKTsKKyAgICAgICAganZtQnVnID0gMDsKKyAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcGxhY2VzIHRoZSBjdXJyZW50IFNlbGVjdG9yIG9mIHRoaXMgU2VsZWN0b3JUaHJlYWQgd2l0aCBuZXdseSBjcmVhdGVkIFNlbGVjdG9yIHRvIHdvcmsKKyAgICAgKiBhcm91bmQgdGhlIGluZmFtb3VzIGVwb2xsIDEwMCUgQ1BVIGJ1Zy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJlYnVpbGRTZWxlY3RvcigpIHsKKyAgICAgIGZpbmFsIFNlbGVjdG9yIG9sZFNlbGVjdG9yID0gc2VsZWN0b3I7CisgICAgICBpZiAob2xkU2VsZWN0b3IgPT0gbnVsbCkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBTZWxlY3RvciBuZXdTZWxlY3RvciA9IG51bGw7CisgICAgICB0cnkgeworICAgICAgICBuZXdTZWxlY3RvciA9IFNlbGVjdG9yLm9wZW4oKTsKKyAgICAgICAgTE9HR0VSLndhcm4oIkNyZWF0ZWQgbmV3IFNlbGVjdG9yLiIpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBMT0dHRVIuZXJyb3IoIkNyZWF0ZSBuZXcgU2VsZWN0b3IgZXJyb3IuIiwgZSk7CisgICAgICB9CisKKyAgICAgIGZvciAoU2VsZWN0aW9uS2V5IGtleSA6IG9sZFNlbGVjdG9yLnNlbGVjdGVkS2V5cygpKSB7CisgICAgICAgIGlmICgha2V5LmlzVmFsaWQoKSAmJiBrZXkucmVhZHlPcHMoKSA9PSAwKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBTZWxlY3RhYmxlQ2hhbm5lbCBjaGFubmVsID0ga2V5LmNoYW5uZWwoKTsKKyAgICAgICAgT2JqZWN0IGF0dGFjaG1lbnQgPSBrZXkuYXR0YWNobWVudCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgaWYgKGF0dGFjaG1lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgY2hhbm5lbC5yZWdpc3RlcihuZXdTZWxlY3Rvciwga2V5LnJlYWR5T3BzKCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFubmVsLnJlZ2lzdGVyKG5ld1NlbGVjdG9yLCBrZXkucmVhZHlPcHMoKSwgYXR0YWNobWVudCk7CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChDbG9zZWRDaGFubmVsRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBMT0dHRVIuZXJyb3IoIlJlZ2lzdGVyIG5ldyBzZWxlY3RvciBrZXkgZXJyb3IuIiwgZSk7CisgICAgICAgIH0KKworICAgICAgfQorCisgICAgICBzZWxlY3RvciA9IG5ld1NlbGVjdG9yOworICAgICAgdHJ5IHsKKyAgICAgICAgb2xkU2VsZWN0b3IuY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTE9HR0VSLmVycm9yKCJDbG9zZSBvbGQgc2VsZWN0b3IgZXJyb3IuIiwgZSk7CisgICAgICB9CisgICAgICBMT0dHRVIud2FybigiUmVwbGFjZSBuZXcgc2VsZWN0b3Igc3VjY2Vzcy4iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0FjY2VwdGVkQ29ubmVjdGlvbnMoKSB7CisgICAgICAvLyBSZWdpc3RlciBhY2NlcHRlZCBjb25uZWN0aW9ucworICAgICAgd2hpbGUgKCFzdG9wcGVkXykgeworICAgICAgICBUTm9uYmxvY2tpbmdUcmFuc3BvcnQgYWNjZXB0ZWQgPSBhY2NlcHRlZFF1ZXVlLnBvbGwoKTsKKyAgICAgICAgaWYgKGFjY2VwdGVkID09IG51bGwpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZWdpc3RlckFjY2VwdGVkKGFjY2VwdGVkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRnJhbWVCdWZmZXIgY3JlYXRlRnJhbWVCdWZmZXIoZmluYWwgVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zLAorICAgICAgICBmaW5hbCBTZWxlY3Rpb25LZXkgc2VsZWN0aW9uS2V5LAorICAgICAgICBmaW5hbCBBYnN0cmFjdFNlbGVjdFRocmVhZCBzZWxlY3RUaHJlYWQpIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NvckZhY3RvcnlfLmlzQXN5bmNQcm9jZXNzb3IoKSA/CisgICAgICAgICAgICAgICAgICBuZXcgQXN5bmNGcmFtZUJ1ZmZlcih0cmFucywgc2VsZWN0aW9uS2V5LCBzZWxlY3RUaHJlYWQpIDoKKyAgICAgICAgICAgICAgICAgIG5ldyBGcmFtZUJ1ZmZlcih0cmFucywgc2VsZWN0aW9uS2V5LCBzZWxlY3RUaHJlYWQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckFjY2VwdGVkKFROb25ibG9ja2luZ1RyYW5zcG9ydCBhY2NlcHRlZCkgeworICAgICAgU2VsZWN0aW9uS2V5IGNsaWVudEtleSA9IG51bGw7CisgICAgICB0cnkgeworICAgICAgICBjbGllbnRLZXkgPSBhY2NlcHRlZC5yZWdpc3RlclNlbGVjdG9yKHNlbGVjdG9yLCBTZWxlY3Rpb25LZXkuT1BfUkVBRCk7CisKKyAgICAgICAgRnJhbWVCdWZmZXIgZnJhbWVCdWZmZXIgPSBjcmVhdGVGcmFtZUJ1ZmZlcihhY2NlcHRlZCwgY2xpZW50S2V5LCBTZWxlY3RvclRocmVhZC50aGlzKTsKKworICAgICAgICBjbGllbnRLZXkuYXR0YWNoKGZyYW1lQnVmZmVyKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTE9HR0VSLndhcm4oIkZhaWxlZCB0byByZWdpc3RlciBhY2NlcHRlZCBjb25uZWN0aW9uIHRvIHNlbGVjdG9yISIsIGUpOworICAgICAgICBpZiAoY2xpZW50S2V5ICE9IG51bGwpIHsKKyAgICAgICAgICBjbGVhbnVwU2VsZWN0aW9uS2V5KGNsaWVudEtleSk7CisgICAgICAgIH0KKyAgICAgICAgYWNjZXB0ZWQuY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9CisgIH0gLy8gU2VsZWN0b3JUaHJlYWQKKworICAvKioKKyAgICogQ3JlYXRlcyBhIFNlbGVjdG9yVGhyZWFkTG9hZEJhbGFuY2VyIHRvIGJlIHVzZWQgYnkgdGhlIGFjY2VwdCB0aHJlYWQgZm9yCisgICAqIGFzc2lnbmluZyBuZXdseSBhY2NlcHRlZCBjb25uZWN0aW9ucyBhY3Jvc3MgdGhlIHRocmVhZHMuCisgICAqLworICBwcm90ZWN0ZWQgU2VsZWN0b3JUaHJlYWRMb2FkQmFsYW5jZXIgY3JlYXRlU2VsZWN0b3JUaHJlYWRMb2FkQmFsYW5jZXIoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2VsZWN0b3JUaHJlYWQ+IHRocmVhZHMpIHsKKyAgICByZXR1cm4gbmV3IFNlbGVjdG9yVGhyZWFkTG9hZEJhbGFuY2VyKHRocmVhZHMpOworICB9CisKKyAgLyoqCisgICAqIEEgcm91bmQgcm9iaW4gbG9hZCBiYWxhbmNlciBmb3IgY2hvb3Npbmcgc2VsZWN0b3IgdGhyZWFkcyBmb3IgbmV3CisgICAqIGNvbm5lY3Rpb25zLgorICAgKi8KKyAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBTZWxlY3RvclRocmVhZExvYWRCYWxhbmNlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTZWxlY3RvclRocmVhZD4gdGhyZWFkczsKKyAgICBwcml2YXRlIEl0ZXJhdG9yPD8gZXh0ZW5kcyBTZWxlY3RvclRocmVhZD4gbmV4dFRocmVhZEl0ZXJhdG9yOworCisgICAgcHVibGljIDxUIGV4dGVuZHMgU2VsZWN0b3JUaHJlYWQ+IFNlbGVjdG9yVGhyZWFkTG9hZEJhbGFuY2VyKENvbGxlY3Rpb248VD4gdGhyZWFkcykgeworICAgICAgaWYgKHRocmVhZHMuaXNFbXB0eSgpKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkF0IGxlYXN0IG9uZSBzZWxlY3RvciB0aHJlYWQgaXMgcmVxdWlyZWQiKTsKKyAgICAgIH0KKyAgICAgIHRoaXMudGhyZWFkcyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobmV3IEFycmF5TGlzdDxUPih0aHJlYWRzKSk7CisgICAgICBuZXh0VGhyZWFkSXRlcmF0b3IgPSB0aGlzLnRocmVhZHMuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VsZWN0b3JUaHJlYWQgbmV4dFRocmVhZCgpIHsKKyAgICAgIC8vIENob29zZSBhIHNlbGVjdG9yIHRocmVhZCAocm91bmQgcm9iaW4pCisgICAgICBpZiAoIW5leHRUaHJlYWRJdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgbmV4dFRocmVhZEl0ZXJhdG9yID0gdGhyZWFkcy5pdGVyYXRvcigpOworICAgICAgfQorICAgICAgcmV0dXJuIG5leHRUaHJlYWRJdGVyYXRvci5uZXh0KCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCmluZGV4IGIwMjkwNWYuLmZjM2FhOTIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCkBAIC0xOCw2ICsxOCw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKwogLyoqCiAgKiBIZWxwZXIgY2xhc3MgdGhhdCB3cmFwcyBhIGJ5dGVbXSBzbyB0aGF0IGl0IGNhbiBleHBhbmQgYW5kIGJlIHJldXNlZC4gVXNlcnMKICAqIHNob3VsZCBjYWxsIHJlc2l6ZUlmTmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSB0aGUgYnVmZmVyIGhhcyBzdWl0YWJsZSBjYXBhY2l0eSwKQEAgLTI1LDI4ICsyNywyNCBAQAogICogcmF0ZSBzbGlnaHRseSBmYXN0ZXIgdGhhbiB0aGUgcmVxdWVzdGVkIGNhcGFjaXR5IHdpdGggdGhlICh1bnRlc3RlZCkKICAqIG9iamVjdGl2ZSBvZiBhdm9pZGluZyBleHBlbnNpdmUgYnVmZmVyIGFsbG9jYXRpb25zIGFuZCBjb3BpZXMuCiAgKi8KLXB1YmxpYyBjbGFzcyBBdXRvRXhwYW5kaW5nQnVmZmVyIHsKK2NsYXNzIEF1dG9FeHBhbmRpbmdCdWZmZXIgewogICBwcml2YXRlIGJ5dGVbXSBhcnJheTsKIAotICBwcml2YXRlIGZpbmFsIGRvdWJsZSBncm93dGhDb2VmZmljaWVudDsKLQotICBwdWJsaWMgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbnQgaW5pdGlhbENhcGFjaXR5LCBkb3VibGUgZ3Jvd3RoQ29lZmZpY2llbnQpIHsKLSAgICBpZiAoZ3Jvd3RoQ29lZmZpY2llbnQgPCAxLjApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdyb3d0aCBjb2VmZmljaWVudCBtdXN0IGJlID49IDEuMCIpOwotICAgIH0KLSAgICBhcnJheSA9IG5ldyBieXRlW2luaXRpYWxDYXBhY2l0eV07Ci0gICAgdGhpcy5ncm93dGhDb2VmZmljaWVudCA9IGdyb3d0aENvZWZmaWNpZW50OworICBwdWJsaWMgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisgICAgdGhpcy5hcnJheSA9IG5ldyBieXRlW2luaXRpYWxDYXBhY2l0eV07CiAgIH0KIAogICBwdWJsaWMgdm9pZCByZXNpemVJZk5lY2Vzc2FyeShpbnQgc2l6ZSkgewotICAgIGlmIChhcnJheS5sZW5ndGggPCBzaXplKSB7Ci0gICAgICBieXRlW10gbmV3QnVmID0gbmV3IGJ5dGVbKGludCkoc2l6ZSAqIGdyb3d0aENvZWZmaWNpZW50KV07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCBuZXdCdWYsIDAsIGFycmF5Lmxlbmd0aCk7Ci0gICAgICBhcnJheSA9IG5ld0J1ZjsKKyAgICBmaW5hbCBpbnQgY3VycmVudENhcGFjaXR5ID0gdGhpcy5hcnJheS5sZW5ndGg7CisgICAgaWYgKGN1cnJlbnRDYXBhY2l0eSA8IHNpemUpIHsKKyAgICAgIC8vIEluY3JlYXNlIGJ5IGEgZmFjdG9yIG9mIDEuNXgKKyAgICAgIGludCBncm93Q2FwYWNpdHkgPSBjdXJyZW50Q2FwYWNpdHkgKyAoY3VycmVudENhcGFjaXR5ID4+IDEpOworICAgICAgaW50IG5ld0NhcGFjaXR5ID0gTWF0aC5tYXgoZ3Jvd0NhcGFjaXR5LCBzaXplKTsKKyAgICAgIHRoaXMuYXJyYXkgPSBBcnJheXMuY29weU9mKGFycmF5LCBuZXdDYXBhY2l0eSk7CiAgICAgfQogICB9CiAKICAgcHVibGljIGJ5dGVbXSBhcnJheSgpIHsKLSAgICByZXR1cm4gYXJyYXk7CisgICAgcmV0dXJuIHRoaXMuYXJyYXk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YQppbmRleCBkMjlkNjBiLi5hMjhkMjU0IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydC5qYXZhCkBAIC0xOCw4ICsxOCw2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuTm90SW1wbGVtZW50ZWRFeGNlcHRpb247Ci0KIC8qKgogICogVFRyYW5zcG9ydCBmb3IgcmVhZGluZyBmcm9tIGFuIEF1dG9FeHBhbmRpbmdCdWZmZXIuCiAgKi8KQEAgLTMwLDggKzI4LDggQEAKICAgcHJpdmF0ZSBpbnQgcG9zID0gMDsKICAgcHJpdmF0ZSBpbnQgbGltaXQgPSAwOwogCi0gIHB1YmxpYyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydChpbnQgaW5pdGlhbENhcGFjaXR5LCBkb3VibGUgb3Zlcmdyb3d0aENvZWZmaWNpZW50KSB7Ci0gICAgdGhpcy5idWYgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbml0aWFsQ2FwYWNpdHksIG92ZXJncm93dGhDb2VmZmljaWVudCk7CisgIHB1YmxpYyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydChpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisgICAgdGhpcy5idWYgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbml0aWFsQ2FwYWNpdHkpOwogICB9CiAKICAgcHVibGljIHZvaWQgZmlsbChUVHJhbnNwb3J0IGluVHJhbnMsIGludCBsZW5ndGgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKQEAgLTYwLDcgKzU4LDcgQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewotICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICB9CiAKICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQuamF2YQppbmRleCAyMzc2Y2YzLi5lYzdlN2Q0IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEKQEAgLTE4LDggKzE4LDYgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbjsKLQogLyoqCiAgKiBUVHJhbnNwb3J0IGZvciB3cml0aW5nIHRvIGFuIEF1dG9FeHBhbmRpbmdCdWZmZXIuCiAgKi8KQEAgLTI3LDEwICsyNSwyOSBAQAogCiAgIHByaXZhdGUgZmluYWwgQXV0b0V4cGFuZGluZ0J1ZmZlciBidWY7CiAgIHByaXZhdGUgaW50IHBvczsKKyAgcHJpdmF0ZSBpbnQgcmVzOwogCi0gIHB1YmxpYyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoaW50IGluaXRpYWxDYXBhY2l0eSwgZG91YmxlIGdyb3d0aENvZWZmaWNpZW50KSB7Ci0gICAgdGhpcy5idWYgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbml0aWFsQ2FwYWNpdHksIGdyb3d0aENvZWZmaWNpZW50KTsKLSAgICB0aGlzLnBvcyA9IDA7CisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSB0aGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGUgYnVmZmVyCisgICAqIEBwYXJhbSBmcm9udFJlc2VydmUgc3BhY2UsIGlmIGFueSwgdG8gcmVzZXJ2ZSBhdCB0aGUgYmVnaW5uaW5nIHN1Y2gKKyAgICogICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZSBmaXJzdCB3cml0ZSBpcyBhZnRlciB0aGlzIHJlc2VydmUuCisgICAqICAgICAgICAgICAgICAgICAgICAgVGhpcyBhbGxvd3MgZnJhbWVkIHRyYW5zcG9ydCB0byByZXNlcnZlIHNwYWNlCisgICAqICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBmcmFtZSBidWZmZXIgbGVuZ3RoLgorICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBpbml0aWFsQ2FwYWNpdHkgaXMgbGVzcyB0aGFuIG9uZQorICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBmcm9udFJlc2VydmUgaXMgbGVzcyB0aGFuIHplcm8KKyAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZnJvbnRSZXNlcnZlIGlzIGdyZWF0ZXIgdGhhbiBpbml0aWFsQ2FwYWNpdHkKKyAgICovCisgIHB1YmxpYyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoaW50IGluaXRpYWxDYXBhY2l0eSwgaW50IGZyb250UmVzZXJ2ZSkgeworICAgIGlmIChpbml0aWFsQ2FwYWNpdHkgPCAxKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbml0aWFsQ2FwYWNpdHkiKTsKKyAgICB9CisgICAgaWYgKGZyb250UmVzZXJ2ZSA8IDAgfHwgaW5pdGlhbENhcGFjaXR5IDwgZnJvbnRSZXNlcnZlKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmcm9udFJlc2VydmUiKTsKKyAgICB9CisgICAgdGhpcy5idWYgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbml0aWFsQ2FwYWNpdHkpOworICAgIHRoaXMucG9zID0gZnJvbnRSZXNlcnZlOworICAgIHRoaXMucmVzID0gZnJvbnRSZXNlcnZlOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC00NCw3ICs2MSw3IEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTU4LDExICs3NSwxNCBAQAogICAgIHJldHVybiBidWY7CiAgIH0KIAotICBwdWJsaWMgaW50IGdldFBvcygpIHsKKyAgLyoqCisgICAqIEByZXR1cm4gbGVuZ3RoIG9mIHRoZSBidWZmZXIsIGluY2x1ZGluZyBhbnkgZnJvbnQgcmVzZXJ2ZQorICAgKi8KKyAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7CiAgICAgcmV0dXJuIHBvczsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgIHBvcyA9IDA7CisgICAgcG9zID0gcmVzOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RCeXRlQnVmZmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RCeXRlQnVmZmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiMDY1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ5dGVCdWZmZXIuamF2YQpAQCAtMCwwICsxLDg3IEBACitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEubmlvLkJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCisvKioKKyAqIEJ5dGVCdWZmZXItYmFja2VkIGltcGxlbWVudGF0aW9uIG9mIFRUcmFuc3BvcnQuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUQnl0ZUJ1ZmZlciBleHRlbmRzIFRUcmFuc3BvcnQgeworICBwcml2YXRlIGZpbmFsIEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlcjsKKworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyBUQnl0ZUJ1ZmZlciB3cmFwcGluZyBhIGdpdmVuIE5JTyBCeXRlQnVmZmVyLgorICAgKi8KKyAgcHVibGljIFRCeXRlQnVmZmVyKEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlcikgeworICAgIHRoaXMuYnl0ZUJ1ZmZlciA9IGJ5dGVCdWZmZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9wZW4oKSB7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBmaW5hbCBpbnQgbiA9IE1hdGgubWluKGJ5dGVCdWZmZXIucmVtYWluaW5nKCksIGxlbik7CisgICAgaWYgKG4gPiAwKSB7CisgICAgICB0cnkgeworICAgICAgICBieXRlQnVmZmVyLmdldChidWYsIG9mZiwgbik7CisgICAgICB9IGNhdGNoIChCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQgYnVmZmVyIiwgZSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBuOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgYnl0ZUJ1ZmZlci5wdXQoYnVmLCBvZmYsIGxlbik7CisgICAgfSBjYXRjaCAoQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIk5vdCBlbm91Z2ggcm9vbSBpbiBvdXRwdXQgYnVmZmVyIiwgZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgdW5kZXJseWluZyBOSU8gQnl0ZUJ1ZmZlci4KKyAgICovCisgIHB1YmxpYyBCeXRlQnVmZmVyIGdldEJ5dGVCdWZmZXIoKSB7CisgICAgcmV0dXJuIGJ5dGVCdWZmZXI7CisgIH0KKworICAvKioKKyAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNhbGwgY2xlYXIoKSBvbiB0aGUgdW5kZXJseWluZyBOSU8gQnl0ZUJ1ZmZlci4KKyAgICovCisgIHB1YmxpYyBUQnl0ZUJ1ZmZlciBjbGVhcigpIHsKKyAgICBieXRlQnVmZmVyLmNsZWFyKCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNhbGwgZmxpcCgpIG9uIHRoZSB1bmRlcmx5aW5nIE5JTyBCeXRlQnVmZmVyLgorICAgICAqLworICBwdWJsaWMgVEJ5dGVCdWZmZXIgZmxpcCgpIHsKKyAgICBieXRlQnVmZmVyLmZsaXAoKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY29udmVydCB0aGUgdW5kZXJseWluZyBOSU8gQnl0ZUJ1ZmZlciB0byBhCisgICAqIHBsYWluIG9sZCBieXRlIGFycmF5LgorICAgKi8KKyAgcHVibGljIGJ5dGVbXSB0b0J5dGVBcnJheSgpIHsKKyAgICBmaW5hbCBieXRlW10gZGF0YSA9IG5ldyBieXRlW2J5dGVCdWZmZXIucmVtYWluaW5nKCldOworICAgIGJ5dGVCdWZmZXIuc2xpY2UoKS5nZXQoZGF0YSk7CisgICAgcmV0dXJuIGRhdGE7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZhc3RGcmFtZWRUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZhc3RGcmFtZWRUcmFuc3BvcnQuamF2YQppbmRleCAyYTFmMWRhLi5hMWZkMjQ5IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmFzdEZyYW1lZFRyYW5zcG9ydC5qYXZhCkBAIC0xOSwxMiArMTksMTIgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCiAvKioKLSAqIFRoaXMgdHJhbnNwb3J0IGlzIHdpcmUgY29tcGF0aWJsZSB3aXRoIHtAbGluayBURnJhbWVkVHJhbnNwb3J0fSwgYnV0IG1ha2VzIAorICogVGhpcyB0cmFuc3BvcnQgaXMgd2lyZSBjb21wYXRpYmxlIHdpdGgge0BsaW5rIFRGcmFtZWRUcmFuc3BvcnR9LCBidXQgbWFrZXMKICAqIHVzZSBvZiByZXVzYWJsZSwgZXhwYW5kaW5nIHJlYWQgYW5kIHdyaXRlIGJ1ZmZlcnMgaW4gb3JkZXIgdG8gYXZvaWQKICAqIGFsbG9jYXRpbmcgbmV3IGJ5dGVbXXMgYWxsIHRoZSB0aW1lLiBTaW5jZSB0aGUgYnVmZmVycyBvbmx5IGV4cGFuZCwgeW91CiAgKiBzaG91bGQgcHJvYmFibHkgb25seSB1c2UgdGhpcyB0cmFuc3BvcnQgaWYgeW91ciBtZXNzYWdlcyBhcmUgbm90IHRvbyB2YXJpYWJseQogICogbGFyZ2UsIHVubGVzcyB0aGUgcGVyc2lzdGVudCBtZW1vcnkgY29zdCBpcyBub3QgYW4gaXNzdWUuCi0gKiAKKyAqCiAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIE5PVCB0aHJlYWRzYWZlLgogICovCiBwdWJsaWMgY2xhc3MgVEZhc3RGcmFtZWRUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKQEAgLTU5LDEzICs1OSwxNCBAQAogICAgKi8KICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZfQ0FQQUNJVFkgPSAxMDI0OwogICAvKioKLSAgICogSG93IGJpZyBpcyB0aGUgbGFyZ2VzdCBhbGxvd2FibGUgZnJhbWU/IERlZmF1bHRzIHRvIEludGVnZXIuTUFYX1ZBTFVFLgorICAgKiBIb3cgYmlnIGlzIHRoZSBsYXJnZXN0IGFsbG93YWJsZSBmcmFtZT8gRGVmYXVsdHMgdG8gMTZNQi4KICAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX0xFTkdUSCA9IEludGVnZXIuTUFYX1ZBTFVFOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BWF9MRU5HVEggPSAxNjM4NDAwMDsKIAogICBwcml2YXRlIGZpbmFsIFRUcmFuc3BvcnQgdW5kZXJseWluZzsKICAgcHJpdmF0ZSBmaW5hbCBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQgd3JpdGVCdWZmZXI7Ci0gIHByaXZhdGUgZmluYWwgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQgcmVhZEJ1ZmZlcjsKKyAgcHJpdmF0ZSBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydCByZWFkQnVmZmVyOworICBwcml2YXRlIGZpbmFsIGludCBpbml0aWFsQnVmZmVyQ2FwYWNpdHk7CiAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGkzMmJ1ZiA9IG5ldyBieXRlWzRdOwogICBwcml2YXRlIGZpbmFsIGludCBtYXhMZW5ndGg7CiAKQEAgLTkxLDcgKzkyLDcgQEAKICAgfQogCiAgIC8qKgotICAgKiAKKyAgICoKICAgICogQHBhcmFtIHVuZGVybHlpbmcgVHJhbnNwb3J0IHRoYXQgcmVhbCByZWFkcyBhbmQgd3JpdGVzIHdpbGwgZ28gdGhyb3VnaCB0by4KICAgICogQHBhcmFtIGluaXRpYWxCdWZmZXJDYXBhY2l0eSBUaGUgaW5pdGlhbCBzaXplIG9mIHRoZSByZWFkIGFuZCB3cml0ZSBidWZmZXJzLgogICAgKiBJbiBwcmFjdGljZSwgaXQncyBub3QgY3JpdGljYWwgdG8gc2V0IHRoaXMgdW5sZXNzIHlvdSBrbm93IGluIGFkdmFuY2UgdGhhdApAQCAtMTA0LDggKzEwNSw5IEBACiAgIHB1YmxpYyBURmFzdEZyYW1lZFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmcsIGludCBpbml0aWFsQnVmZmVyQ2FwYWNpdHksIGludCBtYXhMZW5ndGgpIHsKICAgICB0aGlzLnVuZGVybHlpbmcgPSB1bmRlcmx5aW5nOwogICAgIHRoaXMubWF4TGVuZ3RoID0gbWF4TGVuZ3RoOwotICAgIHdyaXRlQnVmZmVyID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydChpbml0aWFsQnVmZmVyQ2FwYWNpdHksIDEuNSk7Ci0gICAgcmVhZEJ1ZmZlciA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydChpbml0aWFsQnVmZmVyQ2FwYWNpdHksIDEuNSk7CisgICAgdGhpcy5pbml0aWFsQnVmZmVyQ2FwYWNpdHkgPSBpbml0aWFsQnVmZmVyQ2FwYWNpdHk7CisgICAgcmVhZEJ1ZmZlciA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydChpbml0aWFsQnVmZmVyQ2FwYWNpdHkpOworICAgIHdyaXRlQnVmZmVyID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydChpbml0aWFsQnVmZmVyQ2FwYWNpdHksIDQpOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC0xNDEsMTEgKzE0MywxNCBAQAogICAgIGludCBzaXplID0gVEZyYW1lZFRyYW5zcG9ydC5kZWNvZGVGcmFtZVNpemUoaTMyYnVmKTsKIAogICAgIGlmIChzaXplIDwgMCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlJlYWQgYSBuZWdhdGl2ZSBmcmFtZSBzaXplICgiICsgc2l6ZSArICIpISIpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uQ09SUlVQVEVEX0RBVEEsICJSZWFkIGEgbmVnYXRpdmUgZnJhbWUgc2l6ZSAoIiArIHNpemUgKyAiKSEiKTsKICAgICB9CiAKICAgICBpZiAoc2l6ZSA+IG1heExlbmd0aCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkZyYW1lIHNpemUgKCIgKyBzaXplICsgIikgbGFyZ2VyIHRoYW4gbWF4IGxlbmd0aCAoIiArIG1heExlbmd0aCArICIpISIpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uQ09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgIkZyYW1lIHNpemUgKCIgKyBzaXplICsgIikgbGFyZ2VyIHRoYW4gbWF4IGxlbmd0aCAoIiArIG1heExlbmd0aCArICIpISIpOwogICAgIH0KIAogICAgIHJlYWRCdWZmZXIuZmlsbCh1bmRlcmx5aW5nLCBzaXplKTsKQEAgLTE2MSwxMiArMTY2LDE5IEBACiAgICAgcmVhZEJ1ZmZlci5jb25zdW1lQnVmZmVyKGxlbik7CiAgIH0KIAorICAvKioKKyAgICogT25seSBjbGVhcnMgdGhlIHJlYWQgYnVmZmVyIQorICAgKi8KKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgcmVhZEJ1ZmZlciA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydChpbml0aWFsQnVmZmVyQ2FwYWNpdHkpOworICB9CisKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewotICAgIGludCBsZW5ndGggPSB3cml0ZUJ1ZmZlci5nZXRQb3MoKTsKLSAgICBURnJhbWVkVHJhbnNwb3J0LmVuY29kZUZyYW1lU2l6ZShsZW5ndGgsIGkzMmJ1Zik7Ci0gICAgdW5kZXJseWluZy53cml0ZShpMzJidWYsIDAsIDQpOwotICAgIHVuZGVybHlpbmcud3JpdGUod3JpdGVCdWZmZXIuZ2V0QnVmKCkuYXJyYXkoKSwgMCwgbGVuZ3RoKTsKKyAgICBpbnQgcGF5bG9hZExlbmd0aCA9IHdyaXRlQnVmZmVyLmdldExlbmd0aCgpIC0gNDsgICAgICAgIAorICAgIGJ5dGVbXSBkYXRhID0gd3JpdGVCdWZmZXIuZ2V0QnVmKCkuYXJyYXkoKTsKKyAgICBURnJhbWVkVHJhbnNwb3J0LmVuY29kZUZyYW1lU2l6ZShwYXlsb2FkTGVuZ3RoLCBkYXRhKTsKKyAgICB1bmRlcmx5aW5nLndyaXRlKGRhdGEsIDAsIHBheWxvYWRMZW5ndGggKyA0KTsKICAgICB3cml0ZUJ1ZmZlci5yZXNldCgpOwogICAgIHVuZGVybHlpbmcuZmx1c2goKTsKICAgfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVByb2Nlc3Nvci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVByb2Nlc3Nvci5qYXZhCmluZGV4IDdhNThlZWEuLjk2MDg3ZDEgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVQcm9jZXNzb3IuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGaWxlUHJvY2Vzc29yLmphdmEKQEAgLTI0LDIxICsyNCw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7CiAKLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCiAvKioKICAqIEZpbGVQcm9jZXNzb3I6IGhlbHBzIGluIHByb2Nlc3NpbmcgZmlsZXMgZ2VuZXJhdGVkIGJ5IFRGaWxlVHJhbnNwb3J0LgogICogUG9ydCBvZiBvcmlnaW5hbCBjcHAgaW1wbGVtZW50YXRpb24KLSAqCi0gKiBAYXV0aG9yIEpveWRlZXAgU2VuIFNhcm1hIDxqc3Nhcm1hQGZhY2Vib29rLmNvbT4KICAqLwogcHVibGljIGNsYXNzIFRGaWxlUHJvY2Vzc29yIHsKIApAQCAtOTUsNyArODMsNyBAQAogICAgKiBQcm9jZXNzIGZyb20gc3RhcnQgdG8gbGFzdCBjaHVuayBib3RoIGluY2x1c2l2ZSB3aGVyZSBjaHVua3MgYmVnaW4gZnJvbSAwCiAKICAgICogQHBhcmFtIHN0YXJ0Q2h1bmtOdW0gZmlyc3QgY2h1bmsgdG8gYmUgcHJvY2Vzc2VkCi0gICAqIEBwYXJhbSBsYXN0Q2h1bmtOdW0gbGFzdCBjaHVuayB0byBiZSBwcm9jZXNzZWQKKyAgICogQHBhcmFtIGVuZENodW5rTnVtIGxhc3QgY2h1bmsgdG8gYmUgcHJvY2Vzc2VkCiAgICAqLwogICBwdWJsaWMgdm9pZCBwcm9jZXNzQ2h1bmsoaW50IHN0YXJ0Q2h1bmtOdW0sIGludCBlbmRDaHVua051bSkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBudW1DaHVua3MgPSBpbnB1dFRyYW5zcG9ydF8uZ2V0TnVtQ2h1bmtzKCk7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmphdmEKaW5kZXggMjRhODg0Zi4uYzAxMWM1MiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuamF2YQpAQCAtMzMsMTkgKzMzLDE3IEBACiAgKiBJdCBtYXkgbWFrZSBiZXR0ZXIgc2Vuc2UgdG8gcHJvdmlkZSBhIGJhc2ljIHN0cmVhbSBhY2Nlc3Mgb24gdG9wIG9mIHRoZSBmcmFtZWQgZmlsZSBmb3JtYXQKICAqIFRoZSBGaWxlVHJhbnNwb3J0IGNhbiB0aGVuIGJlIGEgdXNlciBvZiB0aGlzIGZyYW1lZCBmaWxlIGZvcm1hdCB3aXRoIHNvbWUgYWRkaXRpb25hbCBsb2dpYwogICogZm9yIGNodW5raW5nLgotICoKLSAqIEBhdXRob3IgSm95ZGVlcCBTZW4gU2FybWEgPGpzc2FybWFAZmFjZWJvb2suY29tPgogICovCiBwdWJsaWMgY2xhc3MgVEZpbGVUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKIAotICBwdWJsaWMgc3RhdGljIGNsYXNzIHRydW5jYWJsZUJ1ZmZlcmVkSW5wdXRTdHJlYW0gZXh0ZW5kcyBCdWZmZXJlZElucHV0U3RyZWFtIHsKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBUcnVuY2FibGVCdWZmZXJlZElucHV0U3RyZWFtIGV4dGVuZHMgQnVmZmVyZWRJbnB1dFN0cmVhbSB7CiAgICAgcHVibGljIHZvaWQgdHJ1bmMoKSB7CiAgICAgICBwb3MgPSBjb3VudCA9IDA7CiAgICAgfSAgICAgICAgCi0gICAgcHVibGljIHRydW5jYWJsZUJ1ZmZlcmVkSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHsKKyAgICBwdWJsaWMgVHJ1bmNhYmxlQnVmZmVyZWRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbikgewogICAgICAgc3VwZXIoaW4pOwogICAgIH0KLSAgICBwdWJsaWMgdHJ1bmNhYmxlQnVmZmVyZWRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbiwgaW50IHNpemUpIHsKKyAgICBwdWJsaWMgVHJ1bmNhYmxlQnVmZmVyZWRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbiwgaW50IHNpemUpIHsKICAgICAgIHN1cGVyKGluLCBzaXplKTsKICAgICB9CiAgIH0KQEAgLTg3LDcgKzg1LDcgQEAKICAgICB9CiAgIH07CiAKLSAgcHVibGljIHN0YXRpYyBjbGFzcyBjaHVua1N0YXRlIHsKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBDaHVua1N0YXRlIHsKICAgICAvKioKICAgICAgKiBDaHVuayBTaXplLiBNdXN0IGJlIHNhbWUgYWNyb3NzIGFsbCBpbXBsZW1lbnRhdGlvbnMKICAgICAgKi8KQEAgLTk2LDggKzk0LDggQEAKICAgICBwcml2YXRlIGludCBjaHVua19zaXplXyA9IERFRkFVTFRfQ0hVTktfU0laRTsKICAgICBwcml2YXRlIGxvbmcgb2Zmc2V0XyA9IDA7CiAKLSAgICBwdWJsaWMgY2h1bmtTdGF0ZSgpIHt9Ci0gICAgcHVibGljIGNodW5rU3RhdGUoaW50IGNodW5rX3NpemUpIHsgY2h1bmtfc2l6ZV8gPSBjaHVua19zaXplOyB9CisgICAgcHVibGljIENodW5rU3RhdGUoKSB7fQorICAgIHB1YmxpYyBDaHVua1N0YXRlKGludCBjaHVua19zaXplKSB7IGNodW5rX3NpemVfID0gY2h1bmtfc2l6ZTsgfQogCiAgICAgcHVibGljIHZvaWQgc2tpcChpbnQgc2l6ZSkge29mZnNldF8gKz0gc2l6ZTsgfQogICAgIHB1YmxpYyB2b2lkIHNlZWsobG9uZyBvZmZzZXQpIHtvZmZzZXRfID0gb2Zmc2V0O30KQEAgLTEwOCw3ICsxMDYsNyBAQAogICAgIHB1YmxpYyBsb25nIGdldE9mZnNldCgpIHsgcmV0dXJuIChvZmZzZXRfKTt9CiAgIH0KIAotICBwdWJsaWMgc3RhdGljIGVudW0gdGFpbFBvbGljeSB7CisgIHB1YmxpYyBzdGF0aWMgZW51bSBUYWlsUG9saWN5IHsKIAogICAgIE5PV0FJVCgwLCAwKSwKICAgICAgIFdBSVRfRk9SRVZFUig1MDAsIC0xKTsKQEAgLTEzMyw3ICsxMzEsNyBAQAogICAgICAqIEBwYXJhbSByZXRyaWVzIG51bWJlciBvZiByZXRyaWVzCiAgICAgICovCiAKLSAgICB0YWlsUG9saWN5KGludCB0aW1lb3V0LCBpbnQgcmV0cmllcykgeworICAgIFRhaWxQb2xpY3koaW50IHRpbWVvdXQsIGludCByZXRyaWVzKSB7CiAgICAgICB0aW1lb3V0XyA9IHRpbWVvdXQ7CiAgICAgICByZXRyaWVzXyA9IHJldHJpZXM7CiAgICAgfQpAQCAtMTQyLDcgKzE0MCw3IEBACiAgIC8qKgogICAgKiBDdXJyZW50IHRhaWxpbmcgcG9saWN5CiAgICAqLwotICB0YWlsUG9saWN5IGN1cnJlbnRQb2xpY3lfID0gdGFpbFBvbGljeS5OT1dBSVQ7CisgIFRhaWxQb2xpY3kgY3VycmVudFBvbGljeV8gPSBUYWlsUG9saWN5Lk5PV0FJVDsKIAogCiAgIC8qKiAKQEAgLTE2OSwxMiArMTY3LDcgQEAKICAgLyoqCiAgICAqIGN1cnJlbnQgQ2h1bmsgc3RhdGUKICAgICovCi0gIGNodW5rU3RhdGUgY3MgPSBudWxsOwotCi0gIC8qKgotICAgKiBSZWFkIHRpbWVvdXQKLSAgICovCi0gIHByaXZhdGUgaW50IHJlYWRUaW1lb3V0XyA9IDA7CisgIENodW5rU3RhdGUgY3MgPSBudWxsOwogCiAgIC8qKgogICAgKiBpcyByZWFkIG9ubHk/CkBAIC0xODYsNyArMTc5LDcgQEAKICAgICogCiAgICAqIEByZXR1cm4gY3VycmVudCByZWFkIHBvbGljeQogICAgKi8KLSAgcHVibGljIHRhaWxQb2xpY3kgZ2V0VGFpbFBvbGljeSgpIHsKKyAgcHVibGljIFRhaWxQb2xpY3kgZ2V0VGFpbFBvbGljeSgpIHsKICAgICByZXR1cm4gKGN1cnJlbnRQb2xpY3lfKTsKICAgfQogCkBAIC0xOTYsOCArMTg5LDggQEAKICAgICogQHBhcmFtIHBvbGljeSBOZXcgcG9saWN5IHRvIHNldAogICAgKiBAcmV0dXJuIE9sZCBwb2xpY3kKICAgICovCi0gIHB1YmxpYyB0YWlsUG9saWN5IHNldFRhaWxQb2xpY3kodGFpbFBvbGljeSBwb2xpY3kpIHsKLSAgICB0YWlsUG9saWN5IG9sZCA9IGN1cnJlbnRQb2xpY3lfOworICBwdWJsaWMgVGFpbFBvbGljeSBzZXRUYWlsUG9saWN5KFRhaWxQb2xpY3kgcG9saWN5KSB7CisgICAgVGFpbFBvbGljeSBvbGQgPSBjdXJyZW50UG9saWN5XzsKICAgICBjdXJyZW50UG9saWN5XyA9IHBvbGljeTsKICAgICByZXR1cm4gKG9sZCk7CiAgIH0KQEAgLTIxMiwxMCArMjA1LDEwIEBACiAgICAgSW5wdXRTdHJlYW0gaXM7CiAgICAgdHJ5IHsKICAgICAgIGlmKGlucHV0U3RyZWFtXyAhPSBudWxsKSB7Ci0gICAgICAgICgodHJ1bmNhYmxlQnVmZmVyZWRJbnB1dFN0cmVhbSlpbnB1dFN0cmVhbV8pLnRydW5jKCk7CisgICAgICAgICgoVHJ1bmNhYmxlQnVmZmVyZWRJbnB1dFN0cmVhbSlpbnB1dFN0cmVhbV8pLnRydW5jKCk7CiAgICAgICAgIGlzID0gaW5wdXRTdHJlYW1fOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgaXMgPSBuZXcgdHJ1bmNhYmxlQnVmZmVyZWRJbnB1dFN0cmVhbShpbnB1dEZpbGVfLmdldElucHV0U3RyZWFtKCkpOworICAgICAgICBpcyA9IG5ldyBUcnVuY2FibGVCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0RmlsZV8uZ2V0SW5wdXRTdHJlYW0oKSk7CiAgICAgICB9CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7CiAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImNyZWF0ZUlucHV0U3RyZWFtOiAiK2lveC5nZXRNZXNzYWdlKCkpOwpAQCAtMjM2LDcgKzIyOSw3IEBACiAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHJlYWQKICAgICovCiAgIHByaXZhdGUgaW50IHRhaWxSZWFkKElucHV0U3RyZWFtIGlzLCBieXRlW10gYnVmLCAKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZiwgaW50IGxlbiwgdGFpbFBvbGljeSB0cCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2ZmLCBpbnQgbGVuLCBUYWlsUG9saWN5IHRwKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAgICAgaW50IG9yaWdfbGVuID0gbGVuOwogICAgIHRyeSB7CiAgICAgICBpbnQgcmV0cmllcyA9IDA7CkBAIC0zNjksMTEgKzM2MiwxMSBAQAogCiAgICAgdHJ5IHsKICAgICAgIGlucHV0U3RyZWFtXyA9IGNyZWF0ZUlucHV0U3RyZWFtKCk7Ci0gICAgICBjcyA9IG5ldyBjaHVua1N0YXRlKCk7CisgICAgICBjcyA9IG5ldyBDaHVua1N0YXRlKCk7CiAgICAgICBjdXJyZW50RXZlbnRfID0gbmV3IEV2ZW50KG5ldyBieXRlIFsyNTZdKTsKIAogICAgICAgaWYoIXJlYWRPbmx5XykKLSAgICAgICAgb3V0cHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShpbnB1dEZpbGVfLmdldE91dHB1dFN0cmVhbSgpLCA4MTkyKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShpbnB1dEZpbGVfLmdldE91dHB1dFN0cmVhbSgpKTsKICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIGlveCk7CiAgICAgfQpAQCAtNDE4LDcgKzQxMSw3IEBACiAgIC8qKgogICAgKiBGaWxlIFRyYW5zcG9ydCBjdG9yCiAgICAqCi0gICAqIEBwYXJhbSBpbnB1dEZpbGVfIG9wZW4gVFNlZWthYmxlRmlsZSB0byByZWFkL3dyaXRlIGZyb20KKyAgICogQHBhcmFtIGlucHV0RmlsZSBvcGVuIFRTZWVrYWJsZUZpbGUgdG8gcmVhZC93cml0ZSBmcm9tCiAgICAqIEBwYXJhbSByZWFkT25seSBXaGV0aGVyIHRoaXMgaXMgYSByZWFkLW9ubHkgdHJhbnNwb3J0CiAgICAqLwogICBwdWJsaWMgVEZpbGVUcmFuc3BvcnQoVFNlZWthYmxlRmlsZSBpbnB1dEZpbGUsIGJvb2xlYW4gcmVhZE9ubHkpIHsKQEAgLTU0NSw3ICs1MzgsNyBAQAogICAgIGlmKHNlZWtUb0VuZCkgewogICAgICAgLy8gd2FpdGluZyBmb3JldmVyIGhlcmUgLSBvdGhlcndpc2Ugd2UgY2FuIGhpdCBFT0YgYW5kIGVuZCB1cAogICAgICAgLy8gaGF2aW5nIGNvbnN1bWVkIHBhcnRpYWwgZGF0YSBmcm9tIHRoZSBkYXRhIHN0cmVhbS4KLSAgICAgIHRhaWxQb2xpY3kgb2xkID0gc2V0VGFpbFBvbGljeSh0YWlsUG9saWN5LldBSVRfRk9SRVZFUik7CisgICAgICBUYWlsUG9saWN5IG9sZCA9IHNldFRhaWxQb2xpY3koVGFpbFBvbGljeS5XQUlUX0ZPUkVWRVIpOwogICAgICAgd2hpbGUoY3MuZ2V0T2Zmc2V0KCkgPCBlb2ZPZmZzZXQpIHsgcmVhZEV2ZW50KCk7IH0KICAgICAgIGN1cnJlbnRFdmVudF8uc2V0QXZhaWxhYmxlKDApOwogICAgICAgc2V0VGFpbFBvbGljeShvbGQpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuamF2YQppbmRleCBlYjViMGMyLi5hMDA2YzNhIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuamF2YQpAQCAtMjcsNyArMjcsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgVEZyYW1lZFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgewogCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX0xFTkdUSCA9IDB4N0ZGRkZGRkY7CisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX0xFTkdUSCA9IDE2Mzg0MDAwOwogCiAgIHByaXZhdGUgaW50IG1heExlbmd0aF87CiAKQEAgLTQ1LDcgKzQ1LDggQEAKICAgLyoqCiAgICAqIEJ1ZmZlciBmb3IgaW5wdXQKICAgICovCi0gIHByaXZhdGUgVE1lbW9yeUlucHV0VHJhbnNwb3J0IHJlYWRCdWZmZXJfID0gbmV3IFRNZW1vcnlJbnB1dFRyYW5zcG9ydChuZXcgYnl0ZVswXSk7CisgIHByaXZhdGUgZmluYWwgVE1lbW9yeUlucHV0VHJhbnNwb3J0IHJlYWRCdWZmZXJfID0KKyAgICBuZXcgVE1lbW9yeUlucHV0VHJhbnNwb3J0KG5ldyBieXRlWzBdKTsKIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgZXh0ZW5kcyBUVHJhbnNwb3J0RmFjdG9yeSB7CiAgICAgcHJpdmF0ZSBpbnQgbWF4TGVuZ3RoXzsKQEAgLTY1LDE2ICs2NiwyNSBAQAogICB9CiAKICAgLyoqCisgICAqIFNvbWV0aGluZyB0byBmaWxsIGluIHRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIHRoZSBidWZmZXIKKyAgICogdG8gbWFrZSByb29tIGZvciB0aGUgZnJhbWUgc2l6ZS4gIFRoaXMgYWxsb3dzIHRoZQorICAgKiBpbXBsZW1lbnRhdGlvbiB0byB3cml0ZSBvbmNlIGluc3RlYWQgb2YgdHdpY2UuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gc2l6ZUZpbGxlcl8gPSBuZXcgYnl0ZVtdIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCisgIC8qKgogICAgKiBDb25zdHJ1Y3RvciB3cmFwcyBhcm91bmQgYW5vdGhlciB0cmFuc3BvcnQKICAgICovCiAgIHB1YmxpYyBURnJhbWVkVHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnNwb3J0LCBpbnQgbWF4TGVuZ3RoKSB7CiAgICAgdHJhbnNwb3J0XyA9IHRyYW5zcG9ydDsKICAgICBtYXhMZW5ndGhfID0gbWF4TGVuZ3RoOworICAgIHdyaXRlQnVmZmVyXy53cml0ZShzaXplRmlsbGVyXywgMCwgNCk7CiAgIH0KIAogICBwdWJsaWMgVEZyYW1lZFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgewogICAgIHRyYW5zcG9ydF8gPSB0cmFuc3BvcnQ7CiAgICAgbWF4TGVuZ3RoXyA9IFRGcmFtZWRUcmFuc3BvcnQuREVGQVVMVF9NQVhfTEVOR1RIOworICAgIHdyaXRlQnVmZmVyXy53cml0ZShzaXplRmlsbGVyXywgMCwgNCk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewpAQCAtOTAsMTEgKzEwMCw5IEBACiAgIH0KIAogICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewotICAgIGlmIChyZWFkQnVmZmVyXyAhPSBudWxsKSB7Ci0gICAgICBpbnQgZ290ID0gcmVhZEJ1ZmZlcl8ucmVhZChidWYsIG9mZiwgbGVuKTsKLSAgICAgIGlmIChnb3QgPiAwKSB7Ci0gICAgICAgIHJldHVybiBnb3Q7Ci0gICAgICB9CisgICAgaW50IGdvdCA9IHJlYWRCdWZmZXJfLnJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgaWYgKGdvdCA+IDApIHsKKyAgICAgIHJldHVybiBnb3Q7CiAgICAgfQogCiAgICAgLy8gUmVhZCBhbm90aGVyIGZyYW1lIG9mIGRhdGEKQEAgLTEyMyw2ICsxMzEsMTAgQEAKICAgICByZWFkQnVmZmVyXy5jb25zdW1lQnVmZmVyKGxlbik7CiAgIH0KIAorICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICByZWFkQnVmZmVyXy5jbGVhcigpOworICB9CisKICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gaTMyYnVmID0gbmV3IGJ5dGVbNF07CiAKICAgcHJpdmF0ZSB2b2lkIHJlYWRGcmFtZSgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKQEAgLTEzMCwxMSArMTQyLDE0IEBACiAgICAgaW50IHNpemUgPSBkZWNvZGVGcmFtZVNpemUoaTMyYnVmKTsKIAogICAgIGlmIChzaXplIDwgMCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlJlYWQgYSBuZWdhdGl2ZSBmcmFtZSBzaXplICgiICsgc2l6ZSArICIpISIpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uQ09SUlVQVEVEX0RBVEEsICJSZWFkIGEgbmVnYXRpdmUgZnJhbWUgc2l6ZSAoIiArIHNpemUgKyAiKSEiKTsKICAgICB9CiAKICAgICBpZiAoc2l6ZSA+IG1heExlbmd0aF8pIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJGcmFtZSBzaXplICgiICsgc2l6ZSArICIpIGxhcmdlciB0aGFuIG1heCBsZW5ndGggKCIgKyBtYXhMZW5ndGhfICsgIikhIik7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5DT1JSVVBURURfREFUQSwKKyAgICAgICAgICAiRnJhbWUgc2l6ZSAoIiArIHNpemUgKyAiKSBsYXJnZXIgdGhhbiBtYXggbGVuZ3RoICgiICsgbWF4TGVuZ3RoXyArICIpISIpOwogICAgIH0KIAogICAgIGJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbc2l6ZV07CkBAIC0xNDksMTIgKzE2NCwxMiBAQAogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAgICAgYnl0ZVtdIGJ1ZiA9IHdyaXRlQnVmZmVyXy5nZXQoKTsKLSAgICBpbnQgbGVuID0gd3JpdGVCdWZmZXJfLmxlbigpOworICAgIGludCBsZW4gPSB3cml0ZUJ1ZmZlcl8ubGVuKCkgLSA0OyAgICAgICAvLyBhY2NvdW50IGZvciB0aGUgcHJlcGVuZGVkIGZyYW1lIHNpemUKICAgICB3cml0ZUJ1ZmZlcl8ucmVzZXQoKTsKKyAgICB3cml0ZUJ1ZmZlcl8ud3JpdGUoc2l6ZUZpbGxlcl8sIDAsIDQpOyAgLy8gbWFrZSByb29tIGZvciB0aGUgbmV4dCBmcmFtZSdzIHNpemUgZGF0YQogCi0gICAgZW5jb2RlRnJhbWVTaXplKGxlbiwgaTMyYnVmKTsKLSAgICB0cmFuc3BvcnRfLndyaXRlKGkzMmJ1ZiwgMCwgNCk7Ci0gICAgdHJhbnNwb3J0Xy53cml0ZShidWYsIDAsIGxlbik7CisgICAgZW5jb2RlRnJhbWVTaXplKGxlbiwgYnVmKTsgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIGZyYW1lIGxlbmd0aCB3aXRob3V0IHRoZSBmaWxsZXIKKyAgICB0cmFuc3BvcnRfLndyaXRlKGJ1ZiwgMCwgbGVuICsgNCk7ICAgICAgLy8gd2UgaGF2ZSB0byB3cml0ZSB0aGUgZnJhbWUgc2l6ZSBhbmQgZnJhbWUgZGF0YQogICAgIHRyYW5zcG9ydF8uZmx1c2goKTsKICAgfQogCkBAIC0xNjYsNyArMTgxLDcgQEAKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGRlY29kZUZyYW1lU2l6ZShmaW5hbCBieXRlW10gYnVmKSB7Ci0gICAgcmV0dXJuIAorICAgIHJldHVybgogICAgICAgKChidWZbMF0gJiAweGZmKSA8PCAyNCkgfAogICAgICAgKChidWZbMV0gJiAweGZmKSA8PCAxNikgfAogICAgICAgKChidWZbMl0gJiAweGZmKSA8PCAgOCkgfApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5qYXZhCmluZGV4IGIxNmRhNjguLmMzMDYzZmUgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmphdmEKQEAgLTI5LDYgKzI5LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHk7CiBpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0OwogaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7CkBAIC0xOTYsNiArMTk3LDIyIEBACiAgICAgcmVxdWVzdEJ1ZmZlcl8ud3JpdGUoYnVmLCBvZmYsIGxlbik7CiAgIH0KIAorICAvKioKKyAgICogY29weSBmcm9tIG9yZy5hcGFjaGUuaHR0cC51dGlsLkVudGl0eVV0aWxzI2NvbnN1bWUuIEFuZHJvaWQgaGFzIGl0J3Mgb3duIGh0dHBjb3JlCisgICAqIHRoYXQgZG9lc24ndCBoYXZlIGEgY29uc3VtZS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIHZvaWQgY29uc3VtZShmaW5hbCBIdHRwRW50aXR5IGVudGl0eSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGlmIChlbnRpdHkgPT0gbnVsbCkgeworICAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmIChlbnRpdHkuaXNTdHJlYW1pbmcoKSkgeworICAgICAgICAgIElucHV0U3RyZWFtIGluc3RyZWFtID0gZW50aXR5LmdldENvbnRlbnQoKTsKKyAgICAgICAgICBpZiAoaW5zdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICBpbnN0cmVhbS5jbG9zZSgpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgfQorCiAgIHByaXZhdGUgdm9pZCBmbHVzaFVzaW5nSHR0cENsaWVudCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKICAgICAKICAgICBpZiAobnVsbCA9PSB0aGlzLmNsaWVudCkgewpAQCAtMjY1LDcgKzI4Miw3IEBACiAgICAgICAKICAgICAgIHRyeSB7CiAgICAgICAgIC8vIEluZGljYXRlIHdlJ3JlIGRvbmUgd2l0aCB0aGUgY29udGVudC4KLSAgICAgICAgcmVzcG9uc2UuZ2V0RW50aXR5KCkuY29uc3VtZUNvbnRlbnQoKTsKKyAgICAgICAgY29uc3VtZShyZXNwb25zZS5nZXRFbnRpdHkoKSk7CiAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgLy8gV2UgaWdub3JlIHRoaXMgZXhjZXB0aW9uLCBpdCBtaWdodCBvbmx5IG1lYW4gdGhlIHNlcnZlciBoYXMgbm8KICAgICAgICAgLy8ga2VlcC1hbGl2ZSBjYXBhYmlsaXR5LgpAQCAtMjg3LDYgKzMwNCw5IEBACiAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW9lKTsKICAgICAgICAgfQogICAgICAgfQorICAgICAgaWYgKHBvc3QgIT0gbnVsbCkgeworICAgICAgICBwb3N0LnJlbGVhc2VDb25uZWN0aW9uKCk7CisgICAgICB9CiAgICAgfQogICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmphdmEKaW5kZXggNTMzNTRhZi4uYjE5YWM4NiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmphdmEKQEAgLTIwLDcgKzIwLDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwogCiAvKioKICAqIE1lbW9yeSBidWZmZXItYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgpAQCAtMzAsNiArMzAsOCBAQAogICAgKiBDcmVhdGUgYSBUTWVtb3J5QnVmZmVyIHdpdGggYW4gaW5pdGlhbCBidWZmZXIgc2l6ZSBvZiA8aT5zaXplPC9pPi4gVGhlCiAgICAqIGludGVybmFsIGJ1ZmZlciB3aWxsIGdyb3cgYXMgbmVjZXNzYXJ5IHRvIGFjY29tbW9kYXRlIHRoZSBzaXplIG9mIHRoZSBkYXRhCiAgICAqIGJlaW5nIHdyaXR0ZW4gdG8gaXQuCisgICAqCisgICAqIEBwYXJhbSBzaXplIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIGJ1ZmZlcgogICAgKi8KICAgcHVibGljIFRNZW1vcnlCdWZmZXIoaW50IHNpemUpIHsKICAgICBhcnJfID0gbmV3IFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oc2l6ZSk7CkBAIC02OSwyMCArNzEsMjAgQEAKICAgLyoqCiAgICAqIE91dHB1dCB0aGUgY29udGVudHMgb2YgdGhlIG1lbW9yeSBidWZmZXIgYXMgYSBTdHJpbmcsIHVzaW5nIHRoZSBzdXBwbGllZAogICAgKiBlbmNvZGluZwotICAgKiBAcGFyYW0gZW5jICB0aGUgZW5jb2RpbmcgdG8gdXNlCisgICAqIEBwYXJhbSBjaGFyc2V0IHRoZSBlbmNvZGluZyB0byB1c2UKICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIG1lbW9yeSBidWZmZXIgYXMgYSBTdHJpbmcKICAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoU3RyaW5nIGVuYykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgIHJldHVybiBhcnJfLnRvU3RyaW5nKGVuYyk7CisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoQ2hhcnNldCBjaGFyc2V0KSB7CisgICAgcmV0dXJuIGFycl8udG9TdHJpbmcoY2hhcnNldCk7CiAgIH0KIAogICBwdWJsaWMgU3RyaW5nIGluc3BlY3QoKSB7Ci0gICAgU3RyaW5nIGJ1ZiA9ICIiOworICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICBieXRlW10gYnl0ZXMgPSBhcnJfLnRvQnl0ZUFycmF5KCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgewotICAgICAgYnVmICs9IChwb3NfID09IGkgPyAiPT0+IiA6ICIiICkgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGJ5dGVzW2ldICYgMHhmZikgKyAiICI7CisgICAgICBidWYuYXBwZW5kKHBvc18gPT0gaSA/ICI9PT4iIDogIiIgKS5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhieXRlc1tpXSAmIDB4ZmYpKS5hcHBlbmQoIiAiKTsKICAgICB9Ci0gICAgcmV0dXJuIGJ1ZjsKKyAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CiAgIH0KIAogICAvLyBUaGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmphdmEKaW5kZXggMjViNDg3ZS4uZWY4MmFjMiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5qYXZhCkBAIC0zNyw3ICszNyw3IEBACiAgKiBXcmFwcGVyIGFyb3VuZCBTZXJ2ZXJTb2NrZXRDaGFubmVsCiAgKi8KIHB1YmxpYyBjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgZXh0ZW5kcyBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0LmNsYXNzLmdldE5hbWUoKSk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuY2xhc3MuZ2V0TmFtZSgpKTsKIAogICAvKioKICAgICogVGhpcyBjaGFubmVsIGlzIHdoZXJlIGFsbCB0aGUgbm9uYmxvY2tpbmcgbWFnaWMgaGFwcGVucy4KQEAgLTU0LDYgKzU0LDkgQEAKICAgICovCiAgIHByaXZhdGUgaW50IGNsaWVudFRpbWVvdXRfID0gMDsKIAorICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vbmJsb2NraW5nQWJzdHJhY3RTZXJ2ZXJTb2NrZXRBcmdzIGV4dGVuZHMKKyAgICAgIEFic3RyYWN0U2VydmVyVHJhbnNwb3J0QXJnczxOb25ibG9ja2luZ0Fic3RyYWN0U2VydmVyU29ja2V0QXJncz4ge30KKwogICAvKioKICAgICogQ3JlYXRlcyBqdXN0IGEgcG9ydCBsaXN0ZW5pbmcgc2VydmVyIHNvY2tldAogICAgKi8KQEAgLTY1LDcgKzY4LDcgQEAKICAgICogQ3JlYXRlcyBqdXN0IGEgcG9ydCBsaXN0ZW5pbmcgc2VydmVyIHNvY2tldAogICAgKi8KICAgcHVibGljIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICB0aGlzKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhwb3J0KSwgY2xpZW50VGltZW91dCk7CisgICAgdGhpcyhuZXcgTm9uYmxvY2tpbmdBYnN0cmFjdFNlcnZlclNvY2tldEFyZ3MoKS5wb3J0KHBvcnQpLmNsaWVudFRpbWVvdXQoY2xpZW50VGltZW91dCkpOwogICB9CiAKICAgcHVibGljIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChJbmV0U29ja2V0QWRkcmVzcyBiaW5kQWRkcikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewpAQCAtNzMsNyArNzYsMTEgQEAKICAgfQogCiAgIHB1YmxpYyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoSW5ldFNvY2tldEFkZHJlc3MgYmluZEFkZHIsIGludCBjbGllbnRUaW1lb3V0KSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0gICAgY2xpZW50VGltZW91dF8gPSBjbGllbnRUaW1lb3V0OworICAgIHRoaXMobmV3IE5vbmJsb2NraW5nQWJzdHJhY3RTZXJ2ZXJTb2NrZXRBcmdzKCkuYmluZEFkZHIoYmluZEFkZHIpLmNsaWVudFRpbWVvdXQoY2xpZW50VGltZW91dCkpOworICB9CisKKyAgcHVibGljIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChOb25ibG9ja2luZ0Fic3RyYWN0U2VydmVyU29ja2V0QXJncyBhcmdzKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgY2xpZW50VGltZW91dF8gPSBhcmdzLmNsaWVudFRpbWVvdXQ7CiAgICAgdHJ5IHsKICAgICAgIHNlcnZlclNvY2tldENoYW5uZWwgPSBTZXJ2ZXJTb2NrZXRDaGFubmVsLm9wZW4oKTsKICAgICAgIHNlcnZlclNvY2tldENoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOwpAQCAtODMsMTAgKzkwLDEwIEBACiAgICAgICAvLyBQcmV2ZW50IDJNU0wgZGVsYXkgcHJvYmxlbSBvbiBzZXJ2ZXIgcmVzdGFydHMKICAgICAgIHNlcnZlclNvY2tldF8uc2V0UmV1c2VBZGRyZXNzKHRydWUpOwogICAgICAgLy8gQmluZCB0byBsaXN0ZW5pbmcgcG9ydAotICAgICAgc2VydmVyU29ja2V0Xy5iaW5kKGJpbmRBZGRyKTsKKyAgICAgIHNlcnZlclNvY2tldF8uYmluZChhcmdzLmJpbmRBZGRyLCBhcmdzLmJhY2tsb2cpOwogICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewogICAgICAgc2VydmVyU29ja2V0XyA9IG51bGw7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gYWRkcmVzcyAiICsgYmluZEFkZHIudG9TdHJpbmcoKSArICIuIik7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gYWRkcmVzcyAiICsgYXJncy5iaW5kQWRkci50b1N0cmluZygpICsgIi4iLCBpb2UpOwogICAgIH0KICAgfQogCkBAIC0xNDcsNCArMTU0LDEwIEBACiAgICAgY2xvc2UoKTsKICAgfQogCisgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKKyAgICBpZiAoc2VydmVyU29ja2V0XyA9PSBudWxsKQorICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBzZXJ2ZXJTb2NrZXRfLmdldExvY2FsUG9ydCgpOworICB9CisKIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU29ja2V0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NvY2tldC5qYXZhCmluZGV4IDQ4MmJkMTQuLmY4NmE0OGIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU29ja2V0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTb2NrZXQuamF2YQpAQCAtNTUsNyArNTUsNiBAQAogICAgKiBDcmVhdGUgYSBuZXcgbm9uYmxvY2tpbmcgc29ja2V0IHRyYW5zcG9ydCB0aGF0IHdpbGwgYmUgY29ubmVjdGVkIHRvIGhvc3Q6cG9ydC4KICAgICogQHBhcmFtIGhvc3QKICAgICogQHBhcmFtIHBvcnQKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCiAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICovCiAgIHB1YmxpYyBUTm9uYmxvY2tpbmdTb2NrZXQoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBpbnQgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTg1LDYgKzg0LDcgQEAKICAgICBTb2NrZXQgc29ja2V0ID0gc29ja2V0Q2hhbm5lbC5zb2NrZXQoKTsKICAgICBzb2NrZXQuc2V0U29MaW5nZXIoZmFsc2UsIDApOwogICAgIHNvY2tldC5zZXRUY3BOb0RlbGF5KHRydWUpOworICAgIHNvY2tldC5zZXRLZWVwQWxpdmUodHJ1ZSk7CiAgICAgc2V0VGltZW91dCh0aW1lb3V0KTsKICAgfQogCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEKaW5kZXggMWUxYzRjOS4uMjIzMmEzMSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNTTFRyYW5zcG9ydEZhY3RvcnkuamF2YQpAQCAtMjAsOCArMjAsMTQgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogCiBpbXBvcnQgamF2YXgubmV0LnNzbC5LZXlNYW5hZ2VyRmFjdG9yeTsKIGltcG9ydCBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQ7CkBAIC0zMiw3ICszOCw3IEBACiBpbXBvcnQgamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXJGYWN0b3J5OwogCiAvKioKLSAqICBBIEZhY3RvcnkgZm9yIHByb3ZpZGluZyBhbmQgc2V0dGluZyB1cCBDbGllbnQgYW5kIFNlcnZlciBTU0wgd3JhcHBlZCAKKyAqICBBIEZhY3RvcnkgZm9yIHByb3ZpZGluZyBhbmQgc2V0dGluZyB1cCBDbGllbnQgYW5kIFNlcnZlciBTU0wgd3JhcHBlZAogICogIFRTb2NrZXQgYW5kIFRTZXJ2ZXJTb2NrZXQKICAqLwogcHVibGljIGNsYXNzIFRTU0xUcmFuc3BvcnRGYWN0b3J5IHsKQEAgLTQxLDI0ICs0NywyNCBAQAogICAgKiBHZXQgYSBTU0wgd3JhcHBlZCBUU2VydmVyU29ja2V0IGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgcG9ydC4gSW4gdGhpcwogICAgKiBjb25maWd1cmF0aW9uIHRoZSBkZWZhdWx0IHNldHRpbmdzIGFyZSB1c2VkLiBEZWZhdWx0IHNldHRpbmdzIGFyZSByZXRyaWV2ZWQKICAgICogZnJvbSBTeXN0ZW0gcHJvcGVydGllcyB0aGF0IGFyZSBzZXQuCi0gICAqIAorICAgKgogICAgKiBFeGFtcGxlIHN5c3RlbSBwcm9wZXJ0aWVzOgotICAgKiAtRGphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZT08dHJ1c3RzdG9yZSBsb2NhdGlvbj4KKyAgICogLURqYXZheC5uZXQuc3NsLnRydXN0U3RvcmU9Jmx0O3RydXN0c3RvcmUgbG9jYXRpb24mZ3Q7CiAgICAqIC1EamF2YXgubmV0LnNzbC50cnVzdFN0b3JlUGFzc3dvcmQ9cGFzc3dvcmQKLSAgICogLURqYXZheC5uZXQuc3NsLmtleVN0b3JlPTxrZXlzdG9yZSBsb2NhdGlvbj4KKyAgICogLURqYXZheC5uZXQuc3NsLmtleVN0b3JlPSZsdDtrZXlzdG9yZSBsb2NhdGlvbiZndDsKICAgICogLURqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQ9cGFzc3dvcmQKLSAgICogCisgICAqCiAgICAqIEBwYXJhbSBwb3J0CiAgICAqIEByZXR1cm4gQSBTU0wgd3JhcHBlZCBUU2VydmVyU29ja2V0CiAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgogICAgKi8KICAgcHVibGljIHN0YXRpYyBUU2VydmVyU29ja2V0IGdldFNlcnZlclNvY2tldChpbnQgcG9ydCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewotICAgIHJldHVybiBnZXRTZXJ2ZXJTb2NrZXQocG9ydCwgMCk7IAorICAgIHJldHVybiBnZXRTZXJ2ZXJTb2NrZXQocG9ydCwgMCk7CiAgIH0KIAogICAvKioKICAgICogR2V0IGEgZGVmYXVsdCBTU0wgd3JhcHBlZCBUU2VydmVyU29ja2V0IGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgcG9ydAotICAgKiAKKyAgICoKICAgICogQHBhcmFtIHBvcnQKICAgICogQHBhcmFtIGNsaWVudFRpbWVvdXQKICAgICogQHJldHVybiBBIFNTTCB3cmFwcGVkIFRTZXJ2ZXJTb2NrZXQKQEAgLTcwLDcgKzc2LDcgQEAKIAogICAvKioKICAgICogR2V0IGEgZGVmYXVsdCBTU0wgd3JhcHBlZCBUU2VydmVyU29ja2V0IGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgcG9ydCBhbmQgaW50ZXJmYWNlCi0gICAqIAorICAgKgogICAgKiBAcGFyYW0gcG9ydAogICAgKiBAcGFyYW0gY2xpZW50VGltZW91dAogICAgKiBAcGFyYW0gaWZBZGRyZXNzCkBAIC03OSwxNCArODUsMTQgQEAKICAgICovCiAgIHB1YmxpYyBzdGF0aWMgVFNlcnZlclNvY2tldCBnZXRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBjbGllbnRUaW1lb3V0LCBib29sZWFuIGNsaWVudEF1dGgsIEluZXRBZGRyZXNzIGlmQWRkcmVzcykgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewogICAgIFNTTFNlcnZlclNvY2tldEZhY3RvcnkgZmFjdG9yeSA9IChTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5KSBTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5LmdldERlZmF1bHQoKTsKLSAgICByZXR1cm4gY3JlYXRlU2VydmVyKGZhY3RvcnksIHBvcnQsIGNsaWVudFRpbWVvdXQsIGNsaWVudEF1dGgsIGlmQWRkcmVzcywgbnVsbCk7IAorICAgIHJldHVybiBjcmVhdGVTZXJ2ZXIoZmFjdG9yeSwgcG9ydCwgY2xpZW50VGltZW91dCwgY2xpZW50QXV0aCwgaWZBZGRyZXNzLCBudWxsKTsKICAgfQogCiAgIC8qKgotICAgKiBHZXQgYSBjb25maWd1cmVkIFNTTCB3cmFwcGVkIFRTZXJ2ZXJTb2NrZXQgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBwb3J0IGFuZCBpbnRlcmZhY2UuIAotICAgKiBIZXJlIHRoZSBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBhcmUgdXNlZCB0byBzZXQgdGhlIHZhbHVlcyBmb3IgdGhlIGFsZ29yaXRobXMsIGtleXN0b3JlLCAKKyAgICogR2V0IGEgY29uZmlndXJlZCBTU0wgd3JhcHBlZCBUU2VydmVyU29ja2V0IGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgcG9ydCBhbmQgaW50ZXJmYWNlLgorICAgKiBIZXJlIHRoZSBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBhcmUgdXNlZCB0byBzZXQgdGhlIHZhbHVlcyBmb3IgdGhlIGFsZ29yaXRobXMsIGtleXN0b3JlLAogICAgKiB0cnVzdHN0b3JlIGFuZCBvdGhlciBzZXR0aW5ncwotICAgKiAKKyAgICoKICAgICogQHBhcmFtIHBvcnQKICAgICogQHBhcmFtIGNsaWVudFRpbWVvdXQKICAgICogQHBhcmFtIGlmQWRkcmVzcwpAQCAtMTEyLDcgKzExOCw4IEBACiAgICAgICBpZiAocGFyYW1zICE9IG51bGwgJiYgcGFyYW1zLmNpcGhlclN1aXRlcyAhPSBudWxsKSB7CiAgICAgICAgIHNlcnZlclNvY2tldC5zZXRFbmFibGVkQ2lwaGVyU3VpdGVzKHBhcmFtcy5jaXBoZXJTdWl0ZXMpOwogICAgICAgfQotICAgICAgcmV0dXJuIG5ldyBUU2VydmVyU29ja2V0KHNlcnZlclNvY2tldCk7CisgICAgICByZXR1cm4gbmV3IFRTZXJ2ZXJTb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQuU2VydmVyU29ja2V0VHJhbnNwb3J0QXJncygpLgorICAgICAgICBzZXJ2ZXJTb2NrZXQoc2VydmVyU29ja2V0KS5jbGllbnRUaW1lb3V0KHRpbWVvdXQpKTsKICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBiaW5kIHRvIHBvcnQgIiArIHBvcnQsIGUpOwogICAgIH0KQEAgLTEyMCw5ICsxMjcsOSBAQAogCiAgIC8qKgogICAgKiBHZXQgYSBkZWZhdWx0IFNTTCB3cmFwcGVkIFRTb2NrZXQgY29ubmVjdGVkIHRvIHRoZSBzcGVjaWZpZWQgaG9zdCBhbmQgcG9ydC4gQWxsCi0gICAqIHRoZSBjbGllbnQgbWV0aG9kcyByZXR1cm4gYSBib3VuZCBjb25uZWN0aW9uLiBTbyB0aGVyZSBpcyBubyBuZWVkIHRvIGNhbGwgb3BlbigpIG9uIHRoZSAKKyAgICogdGhlIGNsaWVudCBtZXRob2RzIHJldHVybiBhIGJvdW5kIGNvbm5lY3Rpb24uIFNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2FsbCBvcGVuKCkgb24gdGhlCiAgICAqIFRUcmFuc3BvcnQuCi0gICAqIAorICAgKgogICAgKiBAcGFyYW0gaG9zdAogICAgKiBAcGFyYW0gcG9ydAogICAgKiBAcGFyYW0gdGltZW91dApAQCAtMTM2LDcgKzE0Myw3IEBACiAKICAgLyoqCiAgICAqIEdldCBhIGRlZmF1bHQgU1NMIHdyYXBwZWQgVFNvY2tldCBjb25uZWN0ZWQgdG8gdGhlIHNwZWNpZmllZCBob3N0IGFuZCBwb3J0LgotICAgKiAKKyAgICoKICAgICogQHBhcmFtIGhvc3QKICAgICogQHBhcmFtIHBvcnQKICAgICogQHJldHVybiBBIFNTTCB3cmFwcGVkIFRTb2NrZXQKQEAgLTE0Nyw5ICsxNTQsOSBAQAogICB9CiAKICAgLyoqCi0gICAqIEdldCBhIGN1c3RvbSBjb25maWd1cmVkIFNTTCB3cmFwcGVkIFRTb2NrZXQuIFRoZSBTU0wgc2V0dGluZ3MgYXJlIG9idGFpbmVkIGZyb20gdGhlIAorICAgKiBHZXQgYSBjdXN0b20gY29uZmlndXJlZCBTU0wgd3JhcHBlZCBUU29ja2V0LiBUaGUgU1NMIHNldHRpbmdzIGFyZSBvYnRhaW5lZCBmcm9tIHRoZQogICAgKiBwYXNzZWQgaW4gVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMuCi0gICAqIAorICAgKgogICAgKiBAcGFyYW0gaG9zdAogICAgKiBAcGFyYW0gcG9ydAogICAgKiBAcGFyYW0gdGltZW91dApAQCAtMTY4LDYgKzE3NSw5IEBACiAKICAgcHJpdmF0ZSBzdGF0aWMgU1NMQ29udGV4dCBjcmVhdGVTU0xDb250ZXh0KFRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewogICAgIFNTTENvbnRleHQgY3R4OworICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKKyAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisKICAgICB0cnkgewogICAgICAgY3R4ID0gU1NMQ29udGV4dC5nZXRJbnN0YW5jZShwYXJhbXMucHJvdG9jb2wpOwogICAgICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeSB0bWYgPSBudWxsOwpAQCAtMTc2LDE0ICsxODYsMjUgQEAKICAgICAgIGlmIChwYXJhbXMuaXNUcnVzdFN0b3JlU2V0KSB7CiAgICAgICAgIHRtZiA9IFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UocGFyYW1zLnRydXN0TWFuYWdlclR5cGUpOwogICAgICAgICBLZXlTdG9yZSB0cyA9IEtleVN0b3JlLmdldEluc3RhbmNlKHBhcmFtcy50cnVzdFN0b3JlVHlwZSk7Ci0gICAgICAgIHRzLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShwYXJhbXMudHJ1c3RTdG9yZSksIHBhcmFtcy50cnVzdFBhc3MudG9DaGFyQXJyYXkoKSk7CisgICAgICAgIGlmIChwYXJhbXMudHJ1c3RTdG9yZVN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgaW4gPSBwYXJhbXMudHJ1c3RTdG9yZVN0cmVhbTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbiA9IGdldFN0b3JlQXNTdHJlYW0ocGFyYW1zLnRydXN0U3RvcmUpOworICAgICAgICB9CisgICAgICAgIHRzLmxvYWQoaW4sCisgICAgICAgICAgICAgICAgKHBhcmFtcy50cnVzdFBhc3MgIT0gbnVsbCA/IHBhcmFtcy50cnVzdFBhc3MudG9DaGFyQXJyYXkoKSA6IG51bGwpKTsKICAgICAgICAgdG1mLmluaXQodHMpOwogICAgICAgfQogCiAgICAgICBpZiAocGFyYW1zLmlzS2V5U3RvcmVTZXQpIHsKICAgICAgICAga21mID0gS2V5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UocGFyYW1zLmtleU1hbmFnZXJUeXBlKTsKICAgICAgICAgS2V5U3RvcmUga3MgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShwYXJhbXMua2V5U3RvcmVUeXBlKTsKLSAgICAgICAga3MubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKHBhcmFtcy5rZXlTdG9yZSksIHBhcmFtcy5rZXlQYXNzLnRvQ2hhckFycmF5KCkpOworICAgICAgICBpZiAocGFyYW1zLmtleVN0b3JlU3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgCWlzID0gcGFyYW1zLmtleVN0b3JlU3RyZWFtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAJaXMgPSBnZXRTdG9yZUFzU3RyZWFtKHBhcmFtcy5rZXlTdG9yZSk7CisgICAgICAgIH0KKyAgICAgICAga3MubG9hZChpcywgcGFyYW1zLmtleVBhc3MudG9DaGFyQXJyYXkoKSk7CiAgICAgICAgIGttZi5pbml0KGtzLCBwYXJhbXMua2V5UGFzcy50b0NoYXJBcnJheSgpKTsKICAgICAgIH0KIApAQCAtMTk5LDEwICsyMjAsNTAgQEAKIAogICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiRXJyb3IgY3JlYXRpbmcgdGhlIHRyYW5zcG9ydCIsIGUpOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoaW4gIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoaXMgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICB9CiAgICAgfQorCiAgICAgcmV0dXJuIGN0eDsKICAgfQogCisgIHByaXZhdGUgc3RhdGljIElucHV0U3RyZWFtIGdldFN0b3JlQXNTdHJlYW0oU3RyaW5nIHN0b3JlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShzdG9yZSk7CisgICAgfSBjYXRjaChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgIH0KKworICAgIElucHV0U3RyZWFtIHN0b3JlU3RyZWFtID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgc3RvcmVTdHJlYW0gPSBuZXcgVVJMKHN0b3JlKS5vcGVuU3RyZWFtKCk7CisgICAgICBpZiAoc3RvcmVTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gc3RvcmVTdHJlYW07CisgICAgICB9CisgICAgfSBjYXRjaChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgIH0KKworICAgIHN0b3JlU3RyZWFtID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHN0b3JlKTsKKworICAgIGlmIChzdG9yZVN0cmVhbSAhPSBudWxsKSB7CisgICAgICByZXR1cm4gc3RvcmVTdHJlYW07CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ291bGQgbm90IGxvYWQgZmlsZTogIiArIHN0b3JlKTsKKyAgICB9CisgIH0KKwogICBwcml2YXRlIHN0YXRpYyBUU29ja2V0IGNyZWF0ZUNsaWVudChTU0xTb2NrZXRGYWN0b3J5IGZhY3RvcnksIFN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKICAgICB0cnkgewogICAgICAgU1NMU29ja2V0IHNvY2tldCA9IChTU0xTb2NrZXQpIGZhY3RvcnkuY3JlYXRlU29ja2V0KGhvc3QsIHBvcnQpOwpAQCAtMjIwLDEyICsyODEsMTQgQEAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyB7CiAgICAgcHJvdGVjdGVkIFN0cmluZyBwcm90b2NvbCA9ICJUTFMiOwogICAgIHByb3RlY3RlZCBTdHJpbmcga2V5U3RvcmU7CisgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGtleVN0b3JlU3RyZWFtOwogICAgIHByb3RlY3RlZCBTdHJpbmcga2V5UGFzczsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGtleU1hbmFnZXJUeXBlID0gIlN1blg1MDkiOworICAgIHByb3RlY3RlZCBTdHJpbmcga2V5TWFuYWdlclR5cGUgPSBLZXlNYW5hZ2VyRmFjdG9yeS5nZXREZWZhdWx0QWxnb3JpdGhtKCk7CiAgICAgcHJvdGVjdGVkIFN0cmluZyBrZXlTdG9yZVR5cGUgPSAiSktTIjsKICAgICBwcm90ZWN0ZWQgU3RyaW5nIHRydXN0U3RvcmU7CisgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIHRydXN0U3RvcmVTdHJlYW07CiAgICAgcHJvdGVjdGVkIFN0cmluZyB0cnVzdFBhc3M7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyB0cnVzdE1hbmFnZXJUeXBlID0gIlN1blg1MDkiOworICAgIHByb3RlY3RlZCBTdHJpbmcgdHJ1c3RNYW5hZ2VyVHlwZSA9IFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0RGVmYXVsdEFsZ29yaXRobSgpOwogICAgIHByb3RlY3RlZCBTdHJpbmcgdHJ1c3RTdG9yZVR5cGUgPSAiSktTIjsKICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gY2lwaGVyU3VpdGVzOwogICAgIHByb3RlY3RlZCBib29sZWFuIGNsaWVudEF1dGggPSBmYWxzZTsKQEAgLTIzNiw3ICsyOTksNyBAQAogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIHBhcmFtZXRlcnMgc3BlY2lmeWluZyB0aGUgcHJvdG9jb2wgYW5kIGNpcGhlciBzdWl0ZXMKLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBwcm90b2NvbCBUaGUgc3BlY2lmaWMgcHJvdG9jb2wgKFRMUy9TU0wpIGNhbiBiZSBzcGVjaWZpZWQgd2l0aCB2ZXJzaW9ucwogICAgICAqIEBwYXJhbSBjaXBoZXJTdWl0ZXMKICAgICAgKi8KQEAgLTI0Nyw3ICszMTAsNyBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZSBwYXJhbWV0ZXJzIHNwZWNpZnlpbmcgdGhlIHByb3RvY29sLCBjaXBoZXIgc3VpdGVzIGFuZCBpZiBjbGllbnQgYXV0aGVudGljYXRpb24KICAgICAgKiBpcyByZXF1aXJlZAotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHByb3RvY29sIFRoZSBzcGVjaWZpYyBwcm90b2NvbCAoVExTL1NTTCkgY2FuIGJlIHNwZWNpZmllZCB3aXRoIHZlcnNpb25zCiAgICAgICogQHBhcmFtIGNpcGhlclN1aXRlcwogICAgICAqIEBwYXJhbSBjbGllbnRBdXRoCkBAIC0yNTYsMTMgKzMxOSwxMyBAQAogICAgICAgaWYgKHByb3RvY29sICE9IG51bGwpIHsKICAgICAgICAgdGhpcy5wcm90b2NvbCA9IHByb3RvY29sOwogICAgICAgfQotICAgICAgdGhpcy5jaXBoZXJTdWl0ZXMgPSBjaXBoZXJTdWl0ZXM7CisgICAgICB0aGlzLmNpcGhlclN1aXRlcyA9IGNpcGhlclN1aXRlcyAhPSBudWxsID8gQXJyYXlzLmNvcHlPZihjaXBoZXJTdWl0ZXMsIGNpcGhlclN1aXRlcy5sZW5ndGgpIDogbnVsbDsKICAgICAgIHRoaXMuY2xpZW50QXV0aCA9IGNsaWVudEF1dGg7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBrZXlzdG9yZSwgcGFzc3dvcmQsIGNlcnRpZmljYXRlIHR5cGUgYW5kIHRoZSBzdG9yZSB0eXBlCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0ga2V5U3RvcmUgTG9jYXRpb24gb2YgdGhlIEtleXN0b3JlIG9uIGRpc2sKICAgICAgKiBAcGFyYW0ga2V5UGFzcyBLZXlzdG9yZSBwYXNzd29yZAogICAgICAqIEBwYXJhbSBrZXlNYW5hZ2VyVHlwZSBUaGUgZGVmYXVsdCBpcyBYNTA5CkBAIC0yNzksMjAgKzM0Miw0MyBAQAogICAgICAgfQogICAgICAgaXNLZXlTdG9yZVNldCA9IHRydWU7CiAgICAgfQotCisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBrZXlzdG9yZSwgcGFzc3dvcmQsIGNlcnRpZmljYXRlIHR5cGUgYW5kIHRoZSBzdG9yZSB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5U3RvcmVTdHJlYW0gS2V5c3RvcmUgY29udGVudCBpbnB1dCBzdHJlYW0KKyAgICAgKiBAcGFyYW0ga2V5UGFzcyBLZXlzdG9yZSBwYXNzd29yZAorICAgICAqIEBwYXJhbSBrZXlNYW5hZ2VyVHlwZSBUaGUgZGVmYXVsdCBpcyBYNTA5CisgICAgICogQHBhcmFtIGtleVN0b3JlVHlwZSBUaGUgZGVmYXVsdCBpcyBKS1MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRLZXlTdG9yZShJbnB1dFN0cmVhbSBrZXlTdG9yZVN0cmVhbSwgU3RyaW5nIGtleVBhc3MsIFN0cmluZyBrZXlNYW5hZ2VyVHlwZSwgU3RyaW5nIGtleVN0b3JlVHlwZSkgeworICAgIAl0aGlzLmtleVN0b3JlU3RyZWFtID0ga2V5U3RvcmVTdHJlYW07CisgICAgCXNldEtleVN0b3JlKCIiLCBrZXlQYXNzLCBrZXlNYW5hZ2VyVHlwZSwga2V5U3RvcmVUeXBlKTsKKyAgICB9CisgICAgCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBrZXlzdG9yZSBhbmQgcGFzc3dvcmQKLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBrZXlTdG9yZSBMb2NhdGlvbiBvZiB0aGUgS2V5c3RvcmUgb24gZGlzawogICAgICAqIEBwYXJhbSBrZXlQYXNzIEtleXN0b3JlIHBhc3N3b3JkCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0S2V5U3RvcmUoU3RyaW5nIGtleVN0b3JlLCBTdHJpbmcga2V5UGFzcykgewogICAgICAgc2V0S2V5U3RvcmUoa2V5U3RvcmUsIGtleVBhc3MsIG51bGwsIG51bGwpOwogICAgIH0KLQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUga2V5c3RvcmUgYW5kIHBhc3N3b3JkCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5U3RvcmVTdHJlYW0gS2V5c3RvcmUgY29udGVudCBpbnB1dCBzdHJlYW0KKyAgICAgKiBAcGFyYW0ga2V5UGFzcyBLZXlzdG9yZSBwYXNzd29yZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEtleVN0b3JlKElucHV0U3RyZWFtIGtleVN0b3JlU3RyZWFtLCBTdHJpbmcga2V5UGFzcykgeworICAgICAgc2V0S2V5U3RvcmUoa2V5U3RvcmVTdHJlYW0sIGtleVBhc3MsIG51bGwsIG51bGwpOworICAgIH0KKyAgICAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIHRydXN0c3RvcmUsIHBhc3N3b3JkLCBjZXJ0aWZpY2F0ZSB0eXBlIGFuZCB0aGUgc3RvcmUgdHlwZQotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHRydXN0U3RvcmUgTG9jYXRpb24gb2YgdGhlIFRydXN0c3RvcmUgb24gZGlzawogICAgICAqIEBwYXJhbSB0cnVzdFBhc3MgVHJ1c3RzdG9yZSBwYXNzd29yZAogICAgICAqIEBwYXJhbSB0cnVzdE1hbmFnZXJUeXBlIFRoZSBkZWZhdWx0IGlzIFg1MDkKQEAgLTMwOSwyNCArMzk1LDQ3IEBACiAgICAgICB9CiAgICAgICBpc1RydXN0U3RvcmVTZXQgPSB0cnVlOwogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRydXN0c3RvcmUsIHBhc3N3b3JkLCBjZXJ0aWZpY2F0ZSB0eXBlIGFuZCB0aGUgc3RvcmUgdHlwZQorICAgICAqCisgICAgICogQHBhcmFtIHRydXN0U3RvcmVTdHJlYW0gVHJ1c3RzdG9yZSBjb250ZW50IGlucHV0IHN0cmVhbQorICAgICAqIEBwYXJhbSB0cnVzdFBhc3MgVHJ1c3RzdG9yZSBwYXNzd29yZAorICAgICAqIEBwYXJhbSB0cnVzdE1hbmFnZXJUeXBlIFRoZSBkZWZhdWx0IGlzIFg1MDkKKyAgICAgKiBAcGFyYW0gdHJ1c3RTdG9yZVR5cGUgVGhlIGRlZmF1bHQgaXMgSktTCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJ1c3RTdG9yZShJbnB1dFN0cmVhbSB0cnVzdFN0b3JlU3RyZWFtLCBTdHJpbmcgdHJ1c3RQYXNzLCBTdHJpbmcgdHJ1c3RNYW5hZ2VyVHlwZSwgU3RyaW5nIHRydXN0U3RvcmVUeXBlKSB7CisgICAgICB0aGlzLnRydXN0U3RvcmVTdHJlYW0gPSB0cnVzdFN0b3JlU3RyZWFtOworICAgICAgc2V0VHJ1c3RTdG9yZSgiIiwgdHJ1c3RQYXNzLCB0cnVzdE1hbmFnZXJUeXBlLCB0cnVzdFN0b3JlVHlwZSk7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSB0cnVzdHN0b3JlIGFuZCBwYXNzd29yZAotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHRydXN0U3RvcmUgTG9jYXRpb24gb2YgdGhlIFRydXN0c3RvcmUgb24gZGlzawogICAgICAqIEBwYXJhbSB0cnVzdFBhc3MgVHJ1c3RzdG9yZSBwYXNzd29yZAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRydXN0U3RvcmUoU3RyaW5nIHRydXN0U3RvcmUsIFN0cmluZyB0cnVzdFBhc3MpIHsKICAgICAgIHNldFRydXN0U3RvcmUodHJ1c3RTdG9yZSwgdHJ1c3RQYXNzLCBudWxsLCBudWxsKTsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0cnVzdHN0b3JlIGFuZCBwYXNzd29yZAorICAgICAqCisgICAgICogQHBhcmFtIHRydXN0U3RvcmVTdHJlYW0gVHJ1c3RzdG9yZSBjb250ZW50IGlucHV0IHN0cmVhbQorICAgICAqIEBwYXJhbSB0cnVzdFBhc3MgVHJ1c3RzdG9yZSBwYXNzd29yZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRydXN0U3RvcmUoSW5wdXRTdHJlYW0gdHJ1c3RTdG9yZVN0cmVhbSwgU3RyaW5nIHRydXN0UGFzcykgeworICAgICAgc2V0VHJ1c3RTdG9yZSh0cnVzdFN0b3JlU3RyZWFtLCB0cnVzdFBhc3MsIG51bGwsIG51bGwpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFNldCBpZiBjbGllbnQgYXV0aGVudGljYXRpb24gaXMgcmVxdWlyZWQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXV0aAorICAgICAqCisgICAgICogQHBhcmFtIGNsaWVudEF1dGgKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZXF1aXJlQ2xpZW50QXV0aChib29sZWFuIGNsaWVudEF1dGgpIHsKICAgICAgIHRoaXMuY2xpZW50QXV0aCA9IGNsaWVudEF1dGg7Ci0gICAgfQotICB9CisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsQ2xpZW50VHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsQ2xpZW50VHJhbnNwb3J0LmphdmEKaW5kZXggNWFhMGNjZC4uNGIxY2EwYSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbENsaWVudFRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xDbGllbnRUcmFuc3BvcnQuamF2YQpAQCAtMTksNiArMTksNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAoraW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXI7CkBAIC05Niw3ICs5Nyw3IEBACiAgICAgTE9HR0VSLmRlYnVnKCJTZW5kaW5nIG1lY2hhbmlzbSBuYW1lIHt9IGFuZCBpbml0aWFsIHJlc3BvbnNlIG9mIGxlbmd0aCB7fSIsIG1lY2hhbmlzbSwKICAgICAgICAgaW5pdGlhbFJlc3BvbnNlLmxlbmd0aCk7CiAKLSAgICBieXRlW10gbWVjaGFuaXNtQnl0ZXMgPSBtZWNoYW5pc20uZ2V0Qnl0ZXMoKTsKKyAgICBieXRlW10gbWVjaGFuaXNtQnl0ZXMgPSBtZWNoYW5pc20uZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgICAgc2VuZFNhc2xNZXNzYWdlKE5lZ290aWF0aW9uU3RhdHVzLlNUQVJULAogICAgICAgICAgICAgICAgICAgICBtZWNoYW5pc21CeXRlcyk7CiAgICAgLy8gU2VuZCBpbml0aWFsIHJlc3BvbnNlCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsU2VydmVyVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsU2VydmVyVHJhbnNwb3J0LmphdmEKaW5kZXggOGFiY2YzNi4uMzliODFjYSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFNlcnZlclRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xTZXJ2ZXJUcmFuc3BvcnQuamF2YQpAQCAtMTksNiArMTksOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAoraW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC0xMjUsMTYgKzEyNywxNiBAQAogCiAgICAgTE9HR0VSLmRlYnVnKCJSZWNlaXZlZCBzdGFydCBtZXNzYWdlIHdpdGggc3RhdHVzIHt9IiwgbWVzc2FnZS5zdGF0dXMpOwogICAgIGlmIChtZXNzYWdlLnN0YXR1cyAhPSBOZWdvdGlhdGlvblN0YXR1cy5TVEFSVCkgewotICAgICAgc2VuZEFuZFRocm93TWVzc2FnZShOZWdvdGlhdGlvblN0YXR1cy5FUlJPUiwgIkV4cGVjdGluZyBTVEFSVCBzdGF0dXMsIHJlY2VpdmVkICIgKyBtZXNzYWdlLnN0YXR1cyk7CisgICAgICB0aHJvdyBzZW5kQW5kVGhyb3dNZXNzYWdlKE5lZ290aWF0aW9uU3RhdHVzLkVSUk9SLCAiRXhwZWN0aW5nIFNUQVJUIHN0YXR1cywgcmVjZWl2ZWQgIiArIG1lc3NhZ2Uuc3RhdHVzKTsKICAgICB9CiAKICAgICAvLyBHZXQgdGhlIG1lY2hhbmlzbSBuYW1lLgotICAgIFN0cmluZyBtZWNoYW5pc21OYW1lID0gbmV3IFN0cmluZyhtZXNzYWdlLnBheWxvYWQpOworICAgIFN0cmluZyBtZWNoYW5pc21OYW1lID0gbmV3IFN0cmluZyhtZXNzYWdlLnBheWxvYWQsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICAgIFRTYXNsU2VydmVyRGVmaW5pdGlvbiBzZXJ2ZXJEZWZpbml0aW9uID0gc2VydmVyRGVmaW5pdGlvbk1hcC5nZXQobWVjaGFuaXNtTmFtZSk7CiAgICAgTE9HR0VSLmRlYnVnKCJSZWNlaXZlZCBtZWNoYW5pc20gbmFtZSAne30nIiwgbWVjaGFuaXNtTmFtZSk7CiAKICAgICBpZiAoc2VydmVyRGVmaW5pdGlvbiA9PSBudWxsKSB7Ci0gICAgICBzZW5kQW5kVGhyb3dNZXNzYWdlKE5lZ290aWF0aW9uU3RhdHVzLkJBRCwgIlVuc3VwcG9ydGVkIG1lY2hhbmlzbSB0eXBlICIgKyBtZWNoYW5pc21OYW1lKTsKKyAgICAgIHRocm93IHNlbmRBbmRUaHJvd01lc3NhZ2UoTmVnb3RpYXRpb25TdGF0dXMuQkFELCAiVW5zdXBwb3J0ZWQgbWVjaGFuaXNtIHR5cGUgIiArIG1lY2hhbmlzbU5hbWUpOwogICAgIH0KICAgICBTYXNsU2VydmVyIHNhc2xTZXJ2ZXIgPSBTYXNsLmNyZWF0ZVNhc2xTZXJ2ZXIoc2VydmVyRGVmaW5pdGlvbi5tZWNoYW5pc20sCiAgICAgICAgIHNlcnZlckRlZmluaXRpb24ucHJvdG9jb2wsIHNlcnZlckRlZmluaXRpb24uc2VydmVyTmFtZSwgc2VydmVyRGVmaW5pdGlvbi5wcm9wcywKQEAgLTE0NCw3ICsxNDYsNyBAQAogCiAgIC8qKgogICAgKiA8Y29kZT5UVHJhbnNwb3J0RmFjdG9yeTwvY29kZT4gdG8gY3JlYXRlCi0gICAqIDxjb2RlPlRTYXNsU2VydmVyVHJhbnNwb3J0czxjL29kZT4uIEVuc3VyZXMgdGhhdCBhIGdpdmVuCisgICAqIDxjb2RlPlRTYXNsU2VydmVyVHJhbnNwb3J0czwvY29kZT4uIEVuc3VyZXMgdGhhdCBhIGdpdmVuCiAgICAqIHVuZGVybHlpbmcgPGNvZGU+VFRyYW5zcG9ydDwvY29kZT4gaW5zdGFuY2UgcmVjZWl2ZXMgdGhlIHNhbWUKICAgICogPGNvZGU+VFNhc2xTZXJ2ZXJUcmFuc3BvcnQ8L2NvZGU+LiBUaGlzIGlzIGtpbmQgb2YgYW4gYXdmdWwgaGFjayB0byB3b3JrCiAgICAqIGFyb3VuZCB0aGUgZmFjdCB0aGF0IFRocmlmdCBpcyBkZXNpZ25lZCBhc3N1bWluZyB0aGF0CkBAIC0xNTgsOCArMTYwLDggQEAKICAgICAgKiBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYXdmdWwgaGFjayBkZXNjcmliZWQgYWJvdmUuCiAgICAgICogPGNvZGU+V2Vha0hhc2hNYXA8L2NvZGU+IGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgd2UgZG9uJ3QgbGVhayBtZW1vcnkuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFRUcmFuc3BvcnQsIFRTYXNsU2VydmVyVHJhbnNwb3J0PiB0cmFuc3BvcnRNYXAgPQotICAgICAgQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBXZWFrSGFzaE1hcDxUVHJhbnNwb3J0LCBUU2FzbFNlcnZlclRyYW5zcG9ydD4oKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFRUcmFuc3BvcnQsIFdlYWtSZWZlcmVuY2U8VFNhc2xTZXJ2ZXJUcmFuc3BvcnQ+PiB0cmFuc3BvcnRNYXAgPQorICAgICAgQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBXZWFrSGFzaE1hcDxUVHJhbnNwb3J0LCBXZWFrUmVmZXJlbmNlPFRTYXNsU2VydmVyVHJhbnNwb3J0Pj4oKSk7CiAKICAgICAvKioKICAgICAgKiBNYXBwaW5nIGZyb20gU0FTTCBtZWNoYW5pc20gbmFtZSAtPiBhbGwgdGhlIHBhcmFtZXRlcnMgcmVxdWlyZWQgdG8KQEAgLTIwNywyMSArMjA5LDIyIEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgYmFzZSkgewotICAgICAgVFNhc2xTZXJ2ZXJUcmFuc3BvcnQgcmV0ID0gdHJhbnNwb3J0TWFwLmdldChiYXNlKTsKLSAgICAgIGlmIChyZXQgPT0gbnVsbCkgeworICAgICAgV2Vha1JlZmVyZW5jZTxUU2FzbFNlcnZlclRyYW5zcG9ydD4gcmV0ID0gdHJhbnNwb3J0TWFwLmdldChiYXNlKTsKKyAgICAgIGlmIChyZXQgPT0gbnVsbCB8fCByZXQuZ2V0KCkgPT0gbnVsbCkgewogICAgICAgICBMT0dHRVIuZGVidWcoInRyYW5zcG9ydCBtYXAgZG9lcyBub3QgY29udGFpbiBrZXkiLCBiYXNlKTsKLSAgICAgICAgcmV0ID0gbmV3IFRTYXNsU2VydmVyVHJhbnNwb3J0KHNlcnZlckRlZmluaXRpb25NYXAsIGJhc2UpOworICAgICAgICByZXQgPSBuZXcgV2Vha1JlZmVyZW5jZTxUU2FzbFNlcnZlclRyYW5zcG9ydD4obmV3IFRTYXNsU2VydmVyVHJhbnNwb3J0KHNlcnZlckRlZmluaXRpb25NYXAsIGJhc2UpKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICByZXQub3BlbigpOworICAgICAgICAgIHJldC5nZXQoKS5vcGVuKCk7CiAgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgewogICAgICAgICAgIExPR0dFUi5kZWJ1ZygiZmFpbGVkIHRvIG9wZW4gc2VydmVyIHRyYW5zcG9ydCIsIGUpOwogICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9Ci0gICAgICAgIHRyYW5zcG9ydE1hcC5wdXQoYmFzZSwgcmV0KTsKKyAgICAgICAgdHJhbnNwb3J0TWFwLnB1dChiYXNlLCByZXQpOyAvLyBObyBuZWVkIGZvciBwdXRJZkFic2VudCgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbmN1cnJlbnQgY2FsbHMgdG8gZ2V0VHJhbnNwb3J0KCkgd2lsbCBwYXNzIGluIGRpZmZlcmVudCBUVHJhbnNwb3J0cy4KICAgICAgIH0gZWxzZSB7CiAgICAgICAgIExPR0dFUi5kZWJ1ZygidHJhbnNwb3J0IG1hcCBkb2VzIGNvbnRhaW4ga2V5IHt9IiwgYmFzZSk7CiAgICAgICB9Ci0gICAgICByZXR1cm4gcmV0OworICAgICAgcmV0dXJuIHJldC5nZXQoKTsKICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnQuamF2YQppbmRleCAwYzY0ODUwLi5iZWQzYjM5IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFRyYW5zcG9ydC5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCkBAIC0zNSw3ICszNSw3IEBACiAKIC8qKgogICogQSBzdXBlcmNsYXNzIGZvciBTQVNMIGNsaWVudC9zZXJ2ZXIgdGhyaWZ0IHRyYW5zcG9ydHMuIEEgc3ViY2xhc3MgbmVlZCBvbmx5Ci0gKiBpbXBsZW1lbnQgdGhlIDxjb2RlPm9wZW48L29wZW4+IG1ldGhvZC4KKyAqIGltcGxlbWVudCB0aGUgPGNvZGU+b3BlbjwvY29kZT4gbWV0aG9kLgogICovCiBhYnN0cmFjdCBjbGFzcyBUU2FzbFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgewogCkBAIC0xMTMsNyArMTEzLDcgQEAKICAgLyoqCiAgICAqIENyZWF0ZSBhIFRTYXNsVHJhbnNwb3J0LiBJdCdzIGFzc3VtZWQgdGhhdCBzZXRTYXNsU2VydmVyIHdpbGwgYmUgY2FsbGVkCiAgICAqIGxhdGVyIHRvIGluaXRpYWxpemUgdGhlIFNBU0wgZW5kcG9pbnQgdW5kZXJseWluZyB0aGlzIHRyYW5zcG9ydC4KLSAgICogCisgICAqCiAgICAqIEBwYXJhbSB1bmRlcmx5aW5nVHJhbnNwb3J0CiAgICAqICAgICAgICAgIFRoZSB0aHJpZnQgdHJhbnNwb3J0IHdoaWNoIHRoaXMgdHJhbnNwb3J0IGlzIHdyYXBwaW5nLgogICAgKi8KQEAgLTEyMyw3ICsxMjMsNyBAQAogCiAgIC8qKgogICAgKiBDcmVhdGUgYSBUU2FzbFRyYW5zcG9ydCB3aGljaCBhY3RzIGFzIGEgY2xpZW50LgotICAgKiAKKyAgICoKICAgICogQHBhcmFtIHNhc2xDbGllbnQKICAgICogICAgICAgICAgVGhlIDxjb2RlPlNhc2xDbGllbnQ8L2NvZGU+IHdoaWNoIHRoaXMgdHJhbnNwb3J0IHdpbGwgdXNlIGZvciBTQVNMCiAgICAqICAgICAgICAgIG5lZ290aWF0aW9uLgpAQCAtMTQ0LDcgKzE0NCw3IEBACiAKICAgLyoqCiAgICAqIFNlbmQgYSBjb21wbGV0ZSBUaHJpZnQgU0FTTCBtZXNzYWdlLgotICAgKiAKKyAgICoKICAgICogQHBhcmFtIHN0YXR1cwogICAgKiAgICAgICAgICBUaGUgc3RhdHVzIHRvIHNlbmQuCiAgICAqIEBwYXJhbSBwYXlsb2FkCkBAIC0xNTgsOSArMTU4LDkgQEAKICAgICBtZXNzYWdlSGVhZGVyWzBdID0gc3RhdHVzLmdldFZhbHVlKCk7CiAgICAgRW5jb2RpbmdVdGlscy5lbmNvZGVCaWdFbmRpYW4ocGF5bG9hZC5sZW5ndGgsIG1lc3NhZ2VIZWFkZXIsIFNUQVRVU19CWVRFUyk7CiAKLSAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICBMT0dHRVIuZGVidWcoZ2V0Um9sZSgpICsgIjogV3JpdGluZyBtZXNzYWdlIHdpdGggc3RhdHVzIHt9IGFuZCBwYXlsb2FkIGxlbmd0aCB7fSIsCi0gICAgICAgICAgICAgICAgICAgc3RhdHVzLCBwYXlsb2FkLmxlbmd0aCk7CisgICAgTE9HR0VSLmRlYnVnKCJ7fTogV3JpdGluZyBtZXNzYWdlIHdpdGggc3RhdHVzIHt9IGFuZCBwYXlsb2FkIGxlbmd0aCB7fSIsCisgICAgICAgIGdldFJvbGUoKSwgc3RhdHVzLCBwYXlsb2FkLmxlbmd0aCk7CisKICAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LndyaXRlKG1lc3NhZ2VIZWFkZXIpOwogICAgIHVuZGVybHlpbmdUcmFuc3BvcnQud3JpdGUocGF5bG9hZCk7CiAgICAgdW5kZXJseWluZ1RyYW5zcG9ydC5mbHVzaCgpOwpAQCAtMTY4LDcgKzE2OCw3IEBACiAKICAgLyoqCiAgICAqIFJlYWQgYSBjb21wbGV0ZSBUaHJpZnQgU0FTTCBtZXNzYWdlLgotICAgKiAKKyAgICoKICAgICogQHJldHVybiBUaGUgU0FTTCBzdGF0dXMgYW5kIHBheWxvYWQgZnJvbSB0aGlzIG1lc3NhZ2UuCiAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgogICAgKiAgICAgICAgICAgVGhyb3duIGlmIHRoZXJlIGlzIGEgZmFpbHVyZSByZWFkaW5nIGZyb20gdGhlIHVuZGVybHlpbmcKQEAgLTE3OCwyNCArMTc4LDI3IEBACiAgICAgdW5kZXJseWluZ1RyYW5zcG9ydC5yZWFkQWxsKG1lc3NhZ2VIZWFkZXIsIDAsIG1lc3NhZ2VIZWFkZXIubGVuZ3RoKTsKIAogICAgIGJ5dGUgc3RhdHVzQnl0ZSA9IG1lc3NhZ2VIZWFkZXJbMF07Ci0gICAgYnl0ZVtdIHBheWxvYWQgPSBuZXcgYnl0ZVtFbmNvZGluZ1V0aWxzLmRlY29kZUJpZ0VuZGlhbihtZXNzYWdlSGVhZGVyLCBTVEFUVVNfQllURVMpXTsKLSAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LnJlYWRBbGwocGF5bG9hZCwgMCwgcGF5bG9hZC5sZW5ndGgpOwogCiAgICAgTmVnb3RpYXRpb25TdGF0dXMgc3RhdHVzID0gTmVnb3RpYXRpb25TdGF0dXMuYnlWYWx1ZShzdGF0dXNCeXRlKTsKICAgICBpZiAoc3RhdHVzID09IG51bGwpIHsKLSAgICAgIHNlbmRBbmRUaHJvd01lc3NhZ2UoTmVnb3RpYXRpb25TdGF0dXMuRVJST1IsICJJbnZhbGlkIHN0YXR1cyAiICsgc3RhdHVzQnl0ZSk7Ci0gICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gTmVnb3RpYXRpb25TdGF0dXMuQkFEIHx8IHN0YXR1cyA9PSBOZWdvdGlhdGlvblN0YXR1cy5FUlJPUikgewotICAgICAgdHJ5IHsKLSAgICAgICAgU3RyaW5nIHJlbW90ZU1lc3NhZ2UgPSBuZXcgU3RyaW5nKHBheWxvYWQsICJVVEYtOCIpOwotICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUGVlciBpbmRpY2F0ZWQgZmFpbHVyZTogIiArIHJlbW90ZU1lc3NhZ2UpOwotICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGUpOwotICAgICAgfQorICAgICAgdGhyb3cgc2VuZEFuZFRocm93TWVzc2FnZShOZWdvdGlhdGlvblN0YXR1cy5FUlJPUiwgIkludmFsaWQgc3RhdHVzICIgKyBzdGF0dXNCeXRlKTsKICAgICB9CiAKLSAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICBMT0dHRVIuZGVidWcoZ2V0Um9sZSgpICsgIjogUmVjZWl2ZWQgbWVzc2FnZSB3aXRoIHN0YXR1cyB7fSBhbmQgcGF5bG9hZCBsZW5ndGgge30iLAotICAgICAgICAgICAgICAgICAgIHN0YXR1cywgcGF5bG9hZC5sZW5ndGgpOworICAgIGludCBwYXlsb2FkQnl0ZXMgPSBFbmNvZGluZ1V0aWxzLmRlY29kZUJpZ0VuZGlhbihtZXNzYWdlSGVhZGVyLCBTVEFUVVNfQllURVMpOworICAgIGlmIChwYXlsb2FkQnl0ZXMgPCAwIHx8IHBheWxvYWRCeXRlcyA+IDEwNDg1NzYwMCAvKiAxMDAgTUIgKi8pIHsKKyAgICAgIHRocm93IHNlbmRBbmRUaHJvd01lc3NhZ2UoCisgICAgICAgIE5lZ290aWF0aW9uU3RhdHVzLkVSUk9SLCAiSW52YWxpZCBwYXlsb2FkIGhlYWRlciBsZW5ndGg6ICIgKyBwYXlsb2FkQnl0ZXMpOworICAgIH0KKworICAgIGJ5dGVbXSBwYXlsb2FkID0gbmV3IGJ5dGVbcGF5bG9hZEJ5dGVzXTsKKyAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LnJlYWRBbGwocGF5bG9hZCwgMCwgcGF5bG9hZC5sZW5ndGgpOworCisgICAgaWYgKHN0YXR1cyA9PSBOZWdvdGlhdGlvblN0YXR1cy5CQUQgfHwgc3RhdHVzID09IE5lZ290aWF0aW9uU3RhdHVzLkVSUk9SKSB7CisgICAgICBTdHJpbmcgcmVtb3RlTWVzc2FnZSA9IG5ldyBTdHJpbmcocGF5bG9hZCwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUGVlciBpbmRpY2F0ZWQgZmFpbHVyZTogIiArIHJlbW90ZU1lc3NhZ2UpOworICAgIH0KKyAgICBMT0dHRVIuZGVidWcoInt9OiBSZWNlaXZlZCBtZXNzYWdlIHdpdGggc3RhdHVzIHt9IGFuZCBwYXlsb2FkIGxlbmd0aCB7fSIsCisgICAgICAgIGdldFJvbGUoKSwgc3RhdHVzLCBwYXlsb2FkLmxlbmd0aCk7CiAgICAgcmV0dXJuIG5ldyBTYXNsUmVzcG9uc2Uoc3RhdHVzLCBwYXlsb2FkKTsKICAgfQogCkBAIC0yMDMsMTcgKzIwNiwxOSBAQAogICAgKiBTZW5kIGEgVGhyaWZ0IFNBU0wgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBzdGF0dXMgKHVzdWFsbHkgQkFEIG9yIEVSUk9SKSBhbmQKICAgICogc3RyaW5nIG1lc3NhZ2UsIGFuZCB0aGVuIHRocm93IGEgVFRyYW5zcG9ydEV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbgogICAgKiBtZXNzYWdlLgotICAgKiAKKyAgICoKICAgICogQHBhcmFtIHN0YXR1cwogICAgKiAgICAgICAgICBUaGUgVGhyaWZ0IFNBU0wgc3RhdHVzIGNvZGUgdG8gc2VuZC4gVXN1YWxseSBCQUQgb3IgRVJST1IuCiAgICAqIEBwYXJhbSBtZXNzYWdlCiAgICAqICAgICAgICAgIFRoZSBvcHRpb25hbCBtZXNzYWdlIHRvIHNlbmQgdG8gdGhlIG90aGVyIHNpZGUuCiAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgogICAgKiAgICAgICAgICAgQWx3YXlzIHRocm93biB3aXRoIHRoZSBtZXNzYWdlIHByb3ZpZGVkLgorICAgKiBAcmV0dXJuIGFsd2F5cyB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBidXQgZGVjbGFyZXMgcmV0dXJuIHR5cGUgdG8gYWxsb3cKKyAgICogICAgICAgICAgdGhyb3cgc2VuZEFuZFRocm93TWVzc2FnZSguLi4pIHRvIGluZm9ybSBjb21waWxlciBjb250cm9sIGZsb3cKICAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNlbmRBbmRUaHJvd01lc3NhZ2UoTmVnb3RpYXRpb25TdGF0dXMgc3RhdHVzLCBTdHJpbmcgbWVzc2FnZSkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICBwcm90ZWN0ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiBzZW5kQW5kVGhyb3dNZXNzYWdlKE5lZ290aWF0aW9uU3RhdHVzIHN0YXR1cywgU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKICAgICB0cnkgewotICAgICAgc2VuZFNhc2xNZXNzYWdlKHN0YXR1cywgbWVzc2FnZS5nZXRCeXRlcygpKTsKKyAgICAgIHNlbmRTYXNsTWVzc2FnZShzdGF0dXMsIG1lc3NhZ2UuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOwogICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICBMT0dHRVIud2FybigiQ291bGQgbm90IHNlbmQgZmFpbHVyZSByZXNwb25zZSIsIGUpOwogICAgICAgbWVzc2FnZSArPSAiXG5BbHNvLCBjb3VsZCBub3Qgc2VuZCByZXNwb25zZTogIiArIGUudG9TdHJpbmcoKTsKQEAgLTIyNSw3ICsyMzAsNyBAQAogICAgKiBJbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzIHRvIHN0YXJ0IHRoZSBUaHJpZnQgU0FTTCBoYW5kc2hha2UgcHJvY2Vzcy4gV2hlbgogICAgKiB0aGlzIG1ldGhvZCBjb21wbGV0ZXMsIHRoZSA8Y29kZT5TYXNsUGFydGljaXBhbnQ8L2NvZGU+IGluIHRoaXMgY2xhc3MgaXMKICAgICogYXNzdW1lZCB0byBiZSBpbml0aWFsaXplZC4KLSAgICogCisgICAqCiAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgogICAgKiBAdGhyb3dzIFNhc2xFeGNlcHRpb24KICAgICovCkBAIC0yNDAsNiArMjQ1LDEzIEBACiAgICAqLwogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICAvKgorICAgICAqIHJlYWRTYXNsSGVhZGVyIGlzIHVzZWQgdG8gdGFnIHdoZXRoZXIgdGhlIFNBU0wgaGVhZGVyIGhhcyBiZWVuIHJlYWQgcHJvcGVybHkuCisgICAgICogSWYgdGhlcmUgaXMgYSBwcm9ibGVtIGluIHJlYWRpbmcgdGhlIGhlYWRlciwgdGhlcmUgbWlnaHQgbm90IGJlIGFueQorICAgICAqIGRhdGEgaW4gdGhlIHN0cmVhbSwgcG9zc2libHkgYSBUQ1AgaGVhbHRoIGNoZWNrIGZyb20gbG9hZCBiYWxhbmNlci4KKyAgICAgKi8KKyAgICBib29sZWFuIHJlYWRTYXNsSGVhZGVyID0gZmFsc2U7CisKICAgICBMT0dHRVIuZGVidWcoIm9wZW5pbmcgdHJhbnNwb3J0IHt9IiwgdGhpcyk7CiAgICAgaWYgKHNhc2wgIT0gbnVsbCAmJiBzYXNsLmlzQ29tcGxldGUoKSkKICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJTQVNMIHRyYW5zcG9ydCBhbHJlYWR5IG9wZW4iKTsKQEAgLTI1MSw2ICsyNjMsNyBAQAogICAgICAgLy8gTmVnb3RpYXRlIGEgU0FTTCBtZWNoYW5pc20uIFRoZSBjbGllbnQgYWxzbyBzZW5kcyBpdHMKICAgICAgIC8vIGluaXRpYWwgcmVzcG9uc2UsIG9yIGFuIGVtcHR5IG9uZS4KICAgICAgIGhhbmRsZVNhc2xTdGFydE1lc3NhZ2UoKTsKKyAgICAgIHJlYWRTYXNsSGVhZGVyID0gdHJ1ZTsKICAgICAgIExPR0dFUi5kZWJ1Zygie306IFN0YXJ0IG1lc3NhZ2UgaGFuZGxlZCIsIGdldFJvbGUoKSk7CiAKICAgICAgIFNhc2xSZXNwb25zZSBtZXNzYWdlID0gbnVsbDsKQEAgLTI2OCw3ICsyODEsNyBAQAogICAgICAgICBpZiAobWVzc2FnZS5zdGF0dXMgPT0gTmVnb3RpYXRpb25TdGF0dXMuQ09NUExFVEUgJiYKICAgICAgICAgICAgIGdldFJvbGUoKSA9PSBTYXNsUm9sZS5DTElFTlQpIHsKICAgICAgICAgICBMT0dHRVIuZGVidWcoInt9OiBBbGwgZG9uZSEiLCBnZXRSb2xlKCkpOwotICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKICAgICAgICAgc2VuZFNhc2xNZXNzYWdlKHNhc2wuaXNDb21wbGV0ZSgpID8gTmVnb3RpYXRpb25TdGF0dXMuQ09NUExFVEUgOiBOZWdvdGlhdGlvblN0YXR1cy5PSywKQEAgLTI3Niw4ICsyODksNiBAQAogICAgICAgfQogICAgICAgTE9HR0VSLmRlYnVnKCJ7fTogTWFpbiBuZWdvdGlhdGlvbiBsb29wIGNvbXBsZXRlIiwgZ2V0Um9sZSgpKTsKIAotICAgICAgYXNzZXJ0IHNhc2wuaXNDb21wbGV0ZSgpOwotCiAgICAgICAvLyBJZiB3ZSdyZSB0aGUgY2xpZW50LCBhbmQgd2UncmUgY29tcGxldGUsIGJ1dCB0aGUgc2VydmVyIGlzbid0CiAgICAgICAvLyBjb21wbGV0ZSB5ZXQsIHdlIG5lZWQgdG8gd2FpdCBmb3IgaXRzIHJlc3BvbnNlLiBUaGlzIHdpbGwgb2NjdXIKICAgICAgIC8vIHdpdGggQU5PTllNT1VTIGF1dGgsIGZvciBleGFtcGxlLCB3aGVyZSB3ZSBzZW5kIGFuIGluaXRpYWwgcmVzcG9uc2UKQEAgLTI5MywxMCArMzA0LDIyIEBACiAgICAgICB9CiAgICAgfSBjYXRjaCAoU2FzbEV4Y2VwdGlvbiBlKSB7CiAgICAgICB0cnkgewotICAgICAgICBzZW5kQW5kVGhyb3dNZXNzYWdlKE5lZ290aWF0aW9uU3RhdHVzLkJBRCwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICBMT0dHRVIuZXJyb3IoIlNBU0wgbmVnb3RpYXRpb24gZmFpbHVyZSIsIGUpOworICAgICAgICB0aHJvdyBzZW5kQW5kVGhyb3dNZXNzYWdlKE5lZ290aWF0aW9uU3RhdHVzLkJBRCwgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgdW5kZXJseWluZ1RyYW5zcG9ydC5jbG9zZSgpOwogICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgLyoKKyAgICAgICAqIElmIHRoZXJlIGlzIG5vLWRhdGEgb3Igbm8tc2FzbCBoZWFkZXIgaW4gdGhlIHN0cmVhbSwgdGhyb3cgYSBkaWZmZXJlbnQKKyAgICAgICAqIHR5cGUgb2YgZXhjZXB0aW9uIHNvIHdlIGNhbiBoYW5kbGUgdGhpcyBzY2VuYXJpbyBkaWZmZXJlbnRseS4KKyAgICAgICAqLworICAgICAgaWYgKCFyZWFkU2FzbEhlYWRlciAmJiBlLmdldFR5cGUoKSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFKSB7CisgICAgICAgIHVuZGVybHlpbmdUcmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgICAgTE9HR0VSLmRlYnVnKCJObyBkYXRhIG9yIG5vIHNhc2wgZGF0YSBpbiB0aGUgc3RyZWFtIik7CisgICAgICAgIHRocm93IG5ldyBUU2FzbFRyYW5zcG9ydEV4Y2VwdGlvbigiTm8gZGF0YSBvciBubyBzYXNsIGRhdGEgaW4gdGhlIHN0cmVhbSIpOworICAgICAgfQorICAgICAgdGhyb3cgZTsKICAgICB9CiAKICAgICBTdHJpbmcgcW9wID0gKFN0cmluZykgc2FzbC5nZXROZWdvdGlhdGVkUHJvcGVydHkoU2FzbC5RT1ApOwpAQCAtMzA2LDcgKzMyOSw3IEBACiAKICAgLyoqCiAgICAqIEdldCB0aGUgdW5kZXJseWluZyA8Y29kZT5TYXNsQ2xpZW50PC9jb2RlPi4KLSAgICogCisgICAqCiAgICAqIEByZXR1cm4gVGhlIDxjb2RlPlNhc2xDbGllbnQ8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHRyYW5zcG9ydAogICAgKiAgICAgICAgIGlzIGJhY2tlZCBieSBhIDxjb2RlPlNhc2xTZXJ2ZXI8L2NvZGU+LgogICAgKi8KQEAgLTMyNCw3ICszNDcsNyBAQAogCiAgIC8qKgogICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgPGNvZGU+U2FzbFNlcnZlcjwvY29kZT4uCi0gICAqIAorICAgKgogICAgKiBAcmV0dXJuIFRoZSA8Y29kZT5TYXNsU2VydmVyPC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyB0cmFuc3BvcnQKICAgICogICAgICAgICBpcyBiYWNrZWQgYnkgYSA8Y29kZT5TYXNsQ2xpZW50PC9jb2RlPi4KICAgICovCkBAIC0zMzUsNyArMzU4LDcgQEAKICAgLyoqCiAgICAqIFJlYWQgYSA0LWJ5dGUgd29yZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBhbmQgaW50ZXJwcmV0IGl0IGFzIGFuCiAgICAqIGludGVnZXIuCi0gICAqIAorICAgKgogICAgKiBAcmV0dXJuIFRoZSBsZW5ndGggcHJlZml4IG9mIHRoZSBuZXh0IFNBU0wgbWVzc2FnZSB0byByZWFkLgogICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KICAgICogICAgICAgICAgIFRocm93biBpZiByZWFkaW5nIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGZhaWxzLgpAQCAtMzQ4LDcgKzM3MSw3IEBACiAKICAgLyoqCiAgICAqIFdyaXRlIHRoZSBnaXZlbiBpbnRlZ2VyIGFzIDQgYnl0ZXMgdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgotICAgKiAKKyAgICoKICAgICogQHBhcmFtIGxlbmd0aAogICAgKiAgICAgICAgICBUaGUgbGVuZ3RoIHByZWZpeCBvZiB0aGUgbmV4dCBTQVNMIG1lc3NhZ2UgdG8gd3JpdGUuCiAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgpAQCAtNDEyLDcgKzQzNSw3IEBACiAgIC8qKgogICAgKiBSZWFkIGEgc2luZ2xlIGZyYW1lIG9mIGRhdGEgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQsIHVud3JhcHBpbmcgaWYKICAgICogbmVjZXNzYXJ5LgotICAgKiAKKyAgICoKICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCiAgICAqICAgICAgICAgICBUaHJvd24gaWYgdGhlcmUncyBhbiBlcnJvciByZWFkaW5nIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgogICAgKiBAdGhyb3dzIFNhc2xFeGNlcHRpb24KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnRFeGNlcHRpb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDE4OWY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFRyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKKy8qCisgKiBUaGlzIGV4Y2VwdGlvbiBpcyB1c2VkIHRvIHRyYWNrIGV4Y2VwdGlvbnMgaW4gVFNhc2xUcmFuc3BvcnQKKyAqIHRoYXQgZG9lcyBub3QgaGF2ZSBTYXNsIHNpZ25hdHVyZSBpbiB0aGVpciBzdHJlYW0uCisgKi8KK3B1YmxpYyBjbGFzcyBUU2FzbFRyYW5zcG9ydEV4Y2VwdGlvbiBleHRlbmRzIFRUcmFuc3BvcnRFeGNlcHRpb24geworCisgIHB1YmxpYyBUU2FzbFRyYW5zcG9ydEV4Y2VwdGlvbigpIHsKKyAgICBzdXBlcigpOworICB9CisKKyAgcHVibGljIFRTYXNsVHJhbnNwb3J0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgc3VwZXIobWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgVFNhc2xUcmFuc3BvcnRFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgc3VwZXIoY2F1c2UpOworICB9CisKKyAgcHVibGljIFRTYXNsVHJhbnNwb3J0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmphdmEKaW5kZXggMTQ3MDc0YS4uNzlmN2I3ZiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmphdmEKQEAgLTQ2LDE5ICs0NiwyNyBAQAogICAgKi8KICAgcHJpdmF0ZSBpbnQgY2xpZW50VGltZW91dF8gPSAwOwogCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VydmVyU29ja2V0VHJhbnNwb3J0QXJncyBleHRlbmRzIEFic3RyYWN0U2VydmVyVHJhbnNwb3J0QXJnczxTZXJ2ZXJTb2NrZXRUcmFuc3BvcnRBcmdzPiB7CisgICAgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldDsKKworICAgIHB1YmxpYyBTZXJ2ZXJTb2NrZXRUcmFuc3BvcnRBcmdzIHNlcnZlclNvY2tldChTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0KSB7CisgICAgICB0aGlzLnNlcnZlclNvY2tldCA9IHNlcnZlclNvY2tldDsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgfQorCiAgIC8qKgogICAgKiBDcmVhdGVzIGEgc2VydmVyIHNvY2tldCBmcm9tIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdAogICAgKi8KLSAgcHVibGljIFRTZXJ2ZXJTb2NrZXQoU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCkgeworICBwdWJsaWMgVFNlcnZlclNvY2tldChTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0KSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAgICAgdGhpcyhzZXJ2ZXJTb2NrZXQsIDApOwogICB9CiAKICAgLyoqCiAgICAqIENyZWF0ZXMgYSBzZXJ2ZXIgc29ja2V0IGZyb20gdW5kZXJseWluZyBzb2NrZXQgb2JqZWN0CiAgICAqLwotICBwdWJsaWMgVFNlcnZlclNvY2tldChTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0LCBpbnQgY2xpZW50VGltZW91dCkgewotICAgIHNlcnZlclNvY2tldF8gPSBzZXJ2ZXJTb2NrZXQ7Ci0gICAgY2xpZW50VGltZW91dF8gPSBjbGllbnRUaW1lb3V0OworICBwdWJsaWMgVFNlcnZlclNvY2tldChTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0LCBpbnQgY2xpZW50VGltZW91dCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIHRoaXMobmV3IFNlcnZlclNvY2tldFRyYW5zcG9ydEFyZ3MoKS5zZXJ2ZXJTb2NrZXQoc2VydmVyU29ja2V0KS5jbGllbnRUaW1lb3V0KGNsaWVudFRpbWVvdXQpKTsKICAgfQogCiAgIC8qKgpAQCAtODAsMjIgKzg4LDMwIEBACiAgIH0KIAogICBwdWJsaWMgVFNlcnZlclNvY2tldChJbmV0U29ja2V0QWRkcmVzcyBiaW5kQWRkciwgaW50IGNsaWVudFRpbWVvdXQpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICBjbGllbnRUaW1lb3V0XyA9IGNsaWVudFRpbWVvdXQ7CisgICAgdGhpcyhuZXcgU2VydmVyU29ja2V0VHJhbnNwb3J0QXJncygpLmJpbmRBZGRyKGJpbmRBZGRyKS5jbGllbnRUaW1lb3V0KGNsaWVudFRpbWVvdXQpKTsKKyAgfQorCisgIHB1YmxpYyBUU2VydmVyU29ja2V0KFNlcnZlclNvY2tldFRyYW5zcG9ydEFyZ3MgYXJncykgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGNsaWVudFRpbWVvdXRfID0gYXJncy5jbGllbnRUaW1lb3V0OworICAgIGlmIChhcmdzLnNlcnZlclNvY2tldCAhPSBudWxsKSB7CisgICAgICB0aGlzLnNlcnZlclNvY2tldF8gPSBhcmdzLnNlcnZlclNvY2tldDsKKyAgICAgIHJldHVybjsKKyAgICB9CiAgICAgdHJ5IHsKICAgICAgIC8vIE1ha2Ugc2VydmVyIHNvY2tldAogICAgICAgc2VydmVyU29ja2V0XyA9IG5ldyBTZXJ2ZXJTb2NrZXQoKTsKICAgICAgIC8vIFByZXZlbnQgMk1TTCBkZWxheSBwcm9ibGVtIG9uIHNlcnZlciByZXN0YXJ0cwogICAgICAgc2VydmVyU29ja2V0Xy5zZXRSZXVzZUFkZHJlc3ModHJ1ZSk7CiAgICAgICAvLyBCaW5kIHRvIGxpc3RlbmluZyBwb3J0Ci0gICAgICBzZXJ2ZXJTb2NrZXRfLmJpbmQoYmluZEFkZHIpOworICAgICAgc2VydmVyU29ja2V0Xy5iaW5kKGFyZ3MuYmluZEFkZHIsIGFyZ3MuYmFja2xvZyk7CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICBzZXJ2ZXJTb2NrZXRfID0gbnVsbDsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBhZGRyZXNzICIgKyBiaW5kQWRkci50b1N0cmluZygpICsgIi4iKTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gYWRkcmVzcyAiICsgYXJncy5iaW5kQWRkci50b1N0cmluZygpICsgIi4iLCBpb2UpOwogICAgIH0KICAgfQogCiAgIHB1YmxpYyB2b2lkIGxpc3RlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGJsb2NrIG9uIGFjY2VwdAorICAgIC8vIE1ha2Ugc3VyZSB0byBibG9jayBvbiBhY2NlcHQKICAgICBpZiAoc2VydmVyU29ja2V0XyAhPSBudWxsKSB7CiAgICAgICB0cnkgewogICAgICAgICBzZXJ2ZXJTb2NrZXRfLnNldFNvVGltZW91dCgwKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmphdmEKaW5kZXggMTdmZjg2Yi4uNDI0ZTRmYSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmphdmEKQEAgLTE5LDExICsxOSw0MCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAoraW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworCiAvKioKICAqIFNlcnZlciB0cmFuc3BvcnQuIE9iamVjdCB3aGljaCBwcm92aWRlcyBjbGllbnQgdHJhbnNwb3J0cy4KICAqCiAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUU2VydmVyVHJhbnNwb3J0IHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUU2VydmVyVHJhbnNwb3J0IGltcGxlbWVudHMgQ2xvc2VhYmxlIHsKKworICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VydmVyVHJhbnNwb3J0QXJnczxUIGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJUcmFuc3BvcnRBcmdzPFQ+PiB7CisgICAgaW50IGJhY2tsb2cgPSAwOyAvLyBBIHZhbHVlIG9mIDAgbWVhbnMgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSB1c2VkIChjdXJyZW50bHkgc2V0IGF0IDUwKQorICAgIGludCBjbGllbnRUaW1lb3V0ID0gMDsKKyAgICBJbmV0U29ja2V0QWRkcmVzcyBiaW5kQWRkcjsKKworICAgIHB1YmxpYyBUIGJhY2tsb2coaW50IGJhY2tsb2cpIHsKKyAgICAgIHRoaXMuYmFja2xvZyA9IGJhY2tsb2c7CisgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFQgY2xpZW50VGltZW91dChpbnQgY2xpZW50VGltZW91dCkgeworICAgICAgdGhpcy5jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKKyAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgVCBwb3J0KGludCBwb3J0KSB7CisgICAgICB0aGlzLmJpbmRBZGRyID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKHBvcnQpOworICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBUIGJpbmRBZGRyKEluZXRTb2NrZXRBZGRyZXNzIGJpbmRBZGRyKSB7CisgICAgICB0aGlzLmJpbmRBZGRyID0gYmluZEFkZHI7CisgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorICB9CiAKICAgcHVibGljIGFic3RyYWN0IHZvaWQgbGlzdGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb247CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjEwMmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5qYXZhCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOworCisKKy8qKgorICogQmFzaWMgZmlsZSBzdXBwb3J0IGZvciB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRTaW1wbGVGaWxlVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CisKKyAgcHJpdmF0ZSBSYW5kb21BY2Nlc3NGaWxlIGZpbGUgPSBudWxsOyAgIAorICBwcml2YXRlIGJvb2xlYW4gcmVhZGFibGU7ICAgICAgICAgICAgICAgCisgIHByaXZhdGUgYm9vbGVhbiB3cml0YWJsZTsgICAgICAgICAgICAgICAKKyAgcHJpdmF0ZSBTdHJpbmcgcGF0aF87ICAgICAgICAgICAgICAgCisKKworICAvKioKKyAgICogQ3JlYXRlIGEgdHJhbnNwb3J0IGJhY2tlZCBieSBhIHNpbXBsZSBmaWxlIAorICAgKiAKKyAgICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gdGhlIGZpbGUgdG8gb3Blbi9jcmVhdGUKKyAgICogQHBhcmFtIHJlYWQgdHJ1ZSB0byBzdXBwb3J0IHJlYWQgb3BlcmF0aW9ucworICAgKiBAcGFyYW0gd3JpdGUgdHJ1ZSB0byBzdXBwb3J0IHdyaXRlIG9wZXJhdGlvbnMKKyAgICogQHBhcmFtIG9wZW5GaWxlIHRydWUgdG8gb3BlbiB0aGUgZmlsZSBvbiBjb25zdHJ1Y3Rpb24KKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGZpbGUgb3BlbiBmYWlscworICAgKi8KKyAgcHVibGljIFRTaW1wbGVGaWxlVHJhbnNwb3J0KFN0cmluZyBwYXRoLCBib29sZWFuIHJlYWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB3cml0ZSwgYm9vbGVhbiBvcGVuRmlsZSkKKyAgICAgICAgICB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaWYgKHBhdGgubGVuZ3RoKCkgPD0gMCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIk5vIHBhdGggc3BlY2lmaWVkIik7CisgICAgfQorICAgIGlmICghcmVhZCAmJiAhd3JpdGUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJOZWl0aGVyIFJFQUQgbm9yIFdSSVRFIHNwZWNpZmllZCIpOworICAgIH0KKyAgICByZWFkYWJsZSA9IHJlYWQ7CisgICAgd3JpdGFibGUgPSB3cml0ZTsKKyAgICBwYXRoXyA9IHBhdGg7CisgICAgaWYgKG9wZW5GaWxlKSB7CisgICAgICBvcGVuKCk7CisgICAgfQorICB9CisgIAorICAvKioKKyAgICogQ3JlYXRlIGEgdHJhbnNwb3J0IGJhY2tlZCBieSBhIHNpbXBsZSBmaWxlIAorICAgKiBJbXBsaWNpdGx5IG9wZW5zIGZpbGUgdG8gY29uZm9ybSB0byBDKysgYmVoYXZpb3IuCisgICAqIAorICAgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0aGUgZmlsZSB0byBvcGVuL2NyZWF0ZQorICAgKiBAcGFyYW0gcmVhZCB0cnVlIHRvIHN1cHBvcnQgcmVhZCBvcGVyYXRpb25zCisgICAqIEBwYXJhbSB3cml0ZSB0cnVlIHRvIHN1cHBvcnQgd3JpdGUgb3BlcmF0aW9ucworICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgZmlsZSBvcGVuIGZhaWxzCisgICAqLworICBwdWJsaWMgVFNpbXBsZUZpbGVUcmFuc3BvcnQoU3RyaW5nIHBhdGgsIGJvb2xlYW4gcmVhZCwgYm9vbGVhbiB3cml0ZSkKKyAgICAgICAgICB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgdGhpcyhwYXRoLCByZWFkLCB3cml0ZSwgdHJ1ZSk7CisgIH0KKyAgCisgIC8qKgorICAgKiBDcmVhdGUgYSB0cmFuc3BvcnQgYmFja2VkIGJ5IGEgc2ltcGxlIHJlYWQgb25seSBkaXNrIGZpbGUgKGltcGxpY2l0bHkgb3BlbnMKKyAgICogZmlsZSkKKyAgICoKKyAgICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gdGhlIGZpbGUgdG8gb3Blbi9jcmVhdGUKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGZpbGUgb3BlbiBmYWlscworICAgKi8KKyAgcHVibGljIFRTaW1wbGVGaWxlVHJhbnNwb3J0KFN0cmluZyBwYXRoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgdGhpcyhwYXRoLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgIH0KKworICAvKioKKyAgICogVGVzdCBmaWxlIHN0YXR1cworICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWYgb3Blbiwgb3RoZXJ3aXNlIGZhbHNlCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgeworICAgIHJldHVybiAoZmlsZSAhPSBudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBPcGVuIGZpbGUgaWYgbm90IHByZXZpb3VzbHkgb3BlbmVkLiAKKyAgICoKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIG9wZW4gZmFpbHMKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGlmIChmaWxlID09IG51bGwpeworICAgICAgdHJ5IHsKKyAgICAgICAgU3RyaW5nIGFjY2VzcyA9ICJyIjsgICAgICAgLy9SYW5kb21BY2Nlc3NGaWxlIG9iamVjdHMgbXVzdCBiZSByZWFkYWJsZQorICAgICAgICBpZiAod3JpdGFibGUpIHsKKyAgICAgICAgICBhY2Nlc3MgKz0gInciOworICAgICAgICB9CisgICAgICAgIGZpbGUgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShwYXRoXywgYWNjZXNzKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICBmaWxlID0gbnVsbDsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW9lLmdldE1lc3NhZ2UoKSk7CisgICAgICB9ICAgICAgCisgICAgfQorICB9CisKKyAgLyoqCisgICAqIENsb3NlIGZpbGUsIHN1YnNlcXVlbnQgcmVhZC93cml0ZSBhY3Rpdml0eSB3aWxsIHRocm93IGV4Y2VwdGlvbnMKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAoZmlsZSAhPSBudWxsKSB7CisgICAgICB0cnkgeworICAgICAgICBmaWxlLmNsb3NlKCk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAvL05vdGhpbmcgdG8gZG8KKyAgICAgIH0KKyAgICAgIGZpbGUgPSBudWxsOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZWFkIHVwIHRvIGxlbiBtYW55IGJ5dGVzIGludG8gYnVmIGF0IG9mZnNldCAKKyAgICoKKyAgICogQHBhcmFtIGJ1ZiBob3VzZXMgYnl0ZXMgcmVhZAorICAgKiBAcGFyYW0gb2ZmIG9mZnNldCBpbnRvIGJ1ZmYgdG8gYmVnaW4gd3JpdGluZyB0bworICAgKiBAcGFyYW0gbGVuIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAgICogQHJldHVybiBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZAorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gb24gcmVhZCBmYWlsdXJlCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZiAoIXJlYWRhYmxlKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUmVhZCBvcGVyYXRpb24gb24gd3JpdGUgb25seSBmaWxlIik7CisgICAgfQorICAgIGludCBpQnl0ZXNSZWFkID0gMDsKKyAgICB0cnkgeworICAgICAgaUJ5dGVzUmVhZCA9IGZpbGUucmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgIGZpbGUgPSBudWxsOworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW9lLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICAgIHJldHVybiBpQnl0ZXNSZWFkOworICB9CisKKyAgLyoqCisgICAqIFdyaXRlIGxlbiBtYW55IGJ5dGVzIGZyb20gYnVmZiBzdGFydGluZyBhdCBvZmZzZXQgCisgICAqCisgICAqIEBwYXJhbSBidWYgYnVmZmVyIGNvbnRhaW5pbmcgYnl0ZXMgdG8gd3JpdGUKKyAgICogQHBhcmFtIG9mZiBvZmZzZXQgaW50byBidWZmZXIgdG8gYmVnaW4gd3JpdGluZyBmcm9tCisgICAqIEBwYXJhbSBsZW4gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBvbiB3cml0ZSBmYWlsdXJlCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBmaWxlLndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgZmlsZSA9IG51bGw7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihpb2UuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogTW92ZSBmaWxlIHBvaW50ZXIgdG8gc3BlY2lmaWVkIG9mZnNldCwgbmV3IHJlYWQvd3JpdGUgY2FsbHMgd2lsbCBhY3QgaGVyZQorICAgKgorICAgKiBAcGFyYW0gb2Zmc2V0IGJ5dGVzIGZyb20gYmVnaW5uaW5nIG9mIGZpbGUgdG8gbW92ZSBwb2ludGVyIHRvCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpcyBzZWVrIGZhaWxzCisgICAqLworICBwdWJsaWMgdm9pZCBzZWVrKGxvbmcgb2Zmc2V0KSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIGZpbGUuc2VlayhvZmZzZXQpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZmlsZSBpbiBieXRlcworICAgKgorICAgKiBAcmV0dXJuIGxlbmd0aCBvZiB0aGUgZmlsZSBpbiBieXRlcworICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgZmlsZSBhY2Nlc3MgZmFpbHMKKyAgICovCisgIHB1YmxpYyBsb25nIGxlbmd0aCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGZpbGUubGVuZ3RoKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJldHVybiBjdXJyZW50IGZpbGUgcG9pbnRlciBwb3NpdGlvbiBpbiBieXRlcyBmcm9tIGJlZ2lubmluZyBvZiBmaWxlCisgICAqCisgICAqIEByZXR1cm4gZmlsZSBwb2ludGVyIHBvc2l0aW9uCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBmaWxlIGFjY2VzcyBmYWlscworICAgKi8KKyAgcHVibGljIGxvbmcgZ2V0RmlsZVBvaW50ZXIoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBmaWxlLmdldEZpbGVQb2ludGVyKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuamF2YQppbmRleCA2ZGQ5ZWZhLi5iMjBiMzJiIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuamF2YQpAQCAtMTksMTQgKzE5LDE2IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CiBpbXBvcnQgamF2YS5uZXQuU29ja2V0OwogaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKIAotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KIC8qKgogICogU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4gVG8gYmUgY29tbWVudGVkIHNvb24hCiAgKgpAQCAtMzgsMjIgKzQwLDI3IEBACiAgIC8qKgogICAgKiBXcmFwcGVkIFNvY2tldCBvYmplY3QKICAgICovCi0gIHByaXZhdGUgU29ja2V0IHNvY2tldF8gPSBudWxsOworICBwcml2YXRlIFNvY2tldCBzb2NrZXRfOwogCiAgIC8qKgogICAgKiBSZW1vdGUgaG9zdAogICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgaG9zdF8gID0gbnVsbDsKKyAgcHJpdmF0ZSBTdHJpbmcgaG9zdF87CiAKICAgLyoqCiAgICAqIFJlbW90ZSBwb3J0CiAgICAqLwotICBwcml2YXRlIGludCBwb3J0XyA9IDA7CisgIHByaXZhdGUgaW50IHBvcnRfOwogCiAgIC8qKgotICAgKiBTb2NrZXQgdGltZW91dAorICAgKiBTb2NrZXQgdGltZW91dCAtIHJlYWQgdGltZW91dCBvbiB0aGUgc29ja2V0CiAgICAqLwotICBwcml2YXRlIGludCB0aW1lb3V0XyA9IDA7CisgIHByaXZhdGUgaW50IHNvY2tldFRpbWVvdXRfOworCisgIC8qKgorICAgKiBDb25uZWN0aW9uIHRpbWVvdXQKKyAgICovCisgIHByaXZhdGUgaW50IGNvbm5lY3RUaW1lb3V0XzsKIAogICAvKioKICAgICogQ29uc3RydWN0b3IgdGhhdCB0YWtlcyBhbiBhbHJlYWR5IGNyZWF0ZWQgc29ja2V0LgpAQCAtNjYsMTQgKzczLDE1IEBACiAgICAgdHJ5IHsKICAgICAgIHNvY2tldF8uc2V0U29MaW5nZXIoZmFsc2UsIDApOwogICAgICAgc29ja2V0Xy5zZXRUY3BOb0RlbGF5KHRydWUpOworICAgICAgc29ja2V0Xy5zZXRLZWVwQWxpdmUodHJ1ZSk7CiAgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIHN4KSB7CiAgICAgICBMT0dHRVIud2FybigiQ291bGQgbm90IGNvbmZpZ3VyZSBzb2NrZXQuIiwgc3gpOwogICAgIH0KIAogICAgIGlmIChpc09wZW4oKSkgewogICAgICAgdHJ5IHsKLSAgICAgICAgaW5wdXRTdHJlYW1fID0gc29ja2V0Xy5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICBvdXRwdXRTdHJlYW1fID0gc29ja2V0Xy5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgaW5wdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc29ja2V0Xy5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShzb2NrZXRfLmdldE91dHB1dFN0cmVhbSgpKTsKICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewogICAgICAgICBjbG9zZSgpOwogICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCBpb3gpOwpAQCAtOTgsMTIgKzEwNiwyNyBAQAogICAgKgogICAgKiBAcGFyYW0gaG9zdCAgICBSZW1vdGUgaG9zdAogICAgKiBAcGFyYW0gcG9ydCAgICBSZW1vdGUgcG9ydAotICAgKiBAcGFyYW0gdGltZW91dCBTb2NrZXQgdGltZW91dAorICAgKiBAcGFyYW0gdGltZW91dCBTb2NrZXQgdGltZW91dCBhbmQgY29ubmVjdGlvbiB0aW1lb3V0CiAgICAqLwogICBwdWJsaWMgVFNvY2tldChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIGludCB0aW1lb3V0KSB7CisgICAgdGhpcyhob3N0LCBwb3J0LCB0aW1lb3V0LCB0aW1lb3V0KTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IHVuY29ubmVjdGVkIHNvY2tldCB0aGF0IHdpbGwgY29ubmVjdCB0byB0aGUgZ2l2ZW4gaG9zdAorICAgKiBvbiB0aGUgZ2l2ZW4gcG9ydCwgd2l0aCBhIHNwZWNpZmljIGNvbm5lY3Rpb24gdGltZW91dCBhbmQgYQorICAgKiBzcGVjaWZpYyBzb2NrZXQgdGltZW91dC4KKyAgICoKKyAgICogQHBhcmFtIGhvc3QgICAgICAgICAgICBSZW1vdGUgaG9zdAorICAgKiBAcGFyYW0gcG9ydCAgICAgICAgICAgIFJlbW90ZSBwb3J0CisgICAqIEBwYXJhbSBzb2NrZXRUaW1lb3V0ICAgU29ja2V0IHRpbWVvdXQKKyAgICogQHBhcmFtIGNvbm5lY3RUaW1lb3V0ICBDb25uZWN0aW9uIHRpbWVvdXQKKyAgICovCisgIHB1YmxpYyBUU29ja2V0KFN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHNvY2tldFRpbWVvdXQsIGludCBjb25uZWN0VGltZW91dCkgewogICAgIGhvc3RfID0gaG9zdDsKICAgICBwb3J0XyA9IHBvcnQ7Ci0gICAgdGltZW91dF8gPSB0aW1lb3V0OworICAgIHNvY2tldFRpbWVvdXRfID0gc29ja2V0VGltZW91dDsKKyAgICBjb25uZWN0VGltZW91dF8gPSBjb25uZWN0VGltZW91dDsKICAgICBpbml0U29ja2V0KCk7CiAgIH0KIApAQCAtMTE1LDE5ICsxMzgsMzkgQEAKICAgICB0cnkgewogICAgICAgc29ja2V0Xy5zZXRTb0xpbmdlcihmYWxzZSwgMCk7CiAgICAgICBzb2NrZXRfLnNldFRjcE5vRGVsYXkodHJ1ZSk7Ci0gICAgICBzb2NrZXRfLnNldFNvVGltZW91dCh0aW1lb3V0Xyk7CisgICAgICBzb2NrZXRfLnNldEtlZXBBbGl2ZSh0cnVlKTsKKyAgICAgIHNvY2tldF8uc2V0U29UaW1lb3V0KHNvY2tldFRpbWVvdXRfKTsKICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gc3gpIHsKICAgICAgIExPR0dFUi5lcnJvcigiQ291bGQgbm90IGNvbmZpZ3VyZSBzb2NrZXQuIiwgc3gpOwogICAgIH0KICAgfQogCiAgIC8qKgorICAgKiBTZXRzIHRoZSBzb2NrZXQgdGltZW91dCBhbmQgY29ubmVjdGlvbiB0aW1lb3V0LgorICAgKgorICAgKiBAcGFyYW0gdGltZW91dCBNaWxsaXNlY29uZHMgdGltZW91dAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0VGltZW91dChpbnQgdGltZW91dCkgeworICAgIHRoaXMuc2V0Q29ubmVjdFRpbWVvdXQodGltZW91dCk7CisgICAgdGhpcy5zZXRTb2NrZXRUaW1lb3V0KHRpbWVvdXQpOworICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIHRpbWUgYWZ0ZXIgd2hpY2ggdGhlIGNvbm5lY3Rpb24gYXR0ZW1wdCB3aWxsIHRpbWUgb3V0CisgICAqCisgICAqIEBwYXJhbSB0aW1lb3V0IE1pbGxpc2Vjb25kcyB0aW1lb3V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0VGltZW91dChpbnQgdGltZW91dCkgeworICAgIGNvbm5lY3RUaW1lb3V0XyA9IHRpbWVvdXQ7CisgIH0KKworICAvKioKICAgICogU2V0cyB0aGUgc29ja2V0IHRpbWVvdXQKICAgICoKICAgICogQHBhcmFtIHRpbWVvdXQgTWlsbGlzZWNvbmRzIHRpbWVvdXQKICAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKLSAgICB0aW1lb3V0XyA9IHRpbWVvdXQ7CisgIHB1YmxpYyB2b2lkIHNldFNvY2tldFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKKyAgICBzb2NrZXRUaW1lb3V0XyA9IHRpbWVvdXQ7CiAgICAgdHJ5IHsKICAgICAgIHNvY2tldF8uc2V0U29UaW1lb3V0KHRpbWVvdXQpOwogICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkgewpAQCAtMTYzLDExICsyMDYsMTEgQEAKICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uQUxSRUFEWV9PUEVOLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkLiIpOwogICAgIH0KIAotICAgIGlmIChob3N0Xy5sZW5ndGgoKSA9PSAwKSB7CisgICAgaWYgKGhvc3RfID09IG51bGwgfHwgaG9zdF8ubGVuZ3RoKCkgPT0gMCkgewogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIkNhbm5vdCBvcGVuIG51bGwgaG9zdC4iKTsKICAgICB9Ci0gICAgaWYgKHBvcnRfIDw9IDApIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJDYW5ub3Qgb3BlbiB3aXRob3V0IHBvcnQuIik7CisgICAgaWYgKHBvcnRfIDw9IDAgfHwgcG9ydF8gPiA2NTUzNSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIkludmFsaWQgcG9ydCAiICsgcG9ydF8pOwogICAgIH0KIAogICAgIGlmIChzb2NrZXRfID09IG51bGwpIHsKQEAgLTE3NSw5ICsyMTgsOSBAQAogICAgIH0KIAogICAgIHRyeSB7Ci0gICAgICBzb2NrZXRfLmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKGhvc3RfLCBwb3J0XyksIHRpbWVvdXRfKTsKLSAgICAgIGlucHV0U3RyZWFtXyA9IHNvY2tldF8uZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgIG91dHB1dFN0cmVhbV8gPSBzb2NrZXRfLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgc29ja2V0Xy5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhob3N0XywgcG9ydF8pLCBjb25uZWN0VGltZW91dF8pOworICAgICAgaW5wdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc29ja2V0Xy5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgIG91dHB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oc29ja2V0Xy5nZXRPdXRwdXRTdHJlYW0oKSk7CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7CiAgICAgICBjbG9zZSgpOwogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgaW94KTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmphdmEKaW5kZXggYzlmM2U5My4uNzNhZDczMCAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmphdmEKQEAgLTE5LDEyICsxOSwxNCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAoraW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworCiAvKioKICAqIEdlbmVyaWMgY2xhc3MgdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIEkvTyBsYXllci4gVGhpcyBpcyBiYXNpY2FsbHkgYSB0aGluCiAgKiB3cmFwcGVyIGFyb3VuZCB0aGUgY29tYmluZWQgZnVuY3Rpb25hbGl0eSBvZiBKYXZhIGlucHV0L291dHB1dCBzdHJlYW1zLgogICoKICAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRUcmFuc3BvcnQgeworcHVibGljIGFic3RyYWN0IGNsYXNzIFRUcmFuc3BvcnQgaW1wbGVtZW50cyBDbG9zZWFibGUgewogCiAgIC8qKgogICAgKiBRdWVyaWVzIHdoZXRoZXIgdGhlIHRyYW5zcG9ydCBpcyBvcGVuLgpAQCAtMTI3LDcgKzEyOSw3IEBACiAgIC8qKgogICAgKiBBY2Nlc3MgdGhlIHByb3RvY29sJ3MgdW5kZXJseWluZyBidWZmZXIgZGlyZWN0bHkuIElmIHRoaXMgaXMgbm90IGEKICAgICogYnVmZmVyZWQgdHJhbnNwb3J0LCByZXR1cm4gbnVsbC4KLSAgICogQHJldHVybgorICAgKiBAcmV0dXJuIHByb3RvY29sJ3MgVW5kZXJseWluZyBidWZmZXIKICAgICovCiAgIHB1YmxpYyBieXRlW10gZ2V0QnVmZmVyKCkgewogICAgIHJldHVybiBudWxsOwpAQCAtMTM2LDcgKzEzOCw4IEBACiAgIC8qKgogICAgKiBSZXR1cm4gdGhlIGluZGV4IHdpdGhpbiB0aGUgdW5kZXJseWluZyBidWZmZXIgdGhhdCBzcGVjaWZpZXMgdGhlIG5leHQgc3BvdAogICAgKiB0aGF0IHNob3VsZCBiZSByZWFkIGZyb20uCi0gICAqIEByZXR1cm4KKyAgICogQHJldHVybiBpbmRleCB3aXRoaW4gdGhlIHVuZGVybHlpbmcgYnVmZmVyIHRoYXQgc3BlY2lmaWVzIHRoZSBuZXh0IHNwb3QKKyAgICogdGhhdCBzaG91bGQgYmUgcmVhZCBmcm9tCiAgICAqLwogICBwdWJsaWMgaW50IGdldEJ1ZmZlclBvc2l0aW9uKCkgewogICAgIHJldHVybiAwOwpAQCAtMTQ1LDcgKzE0OCw4IEBACiAgIC8qKgogICAgKiBHZXQgdGhlIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgaW4gdGhlIHVuZGVybHlpbmcgYnVmZmVyLiBSZXR1cm5zIC0xIGlmCiAgICAqIHRoaXMgaXMgYSBub24tYnVmZmVyZWQgdHJhbnNwb3J0LgotICAgKiBAcmV0dXJuCisgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgaW4gdGhlIHVuZGVybHlpbmcgYnVmZmVyLiA8YnI+IFJldHVybnMgLTEgaWYKKyAgICogdGhpcyBpcyBhIG5vbi1idWZmZXJlZCB0cmFuc3BvcnQuCiAgICAqLwogICBwdWJsaWMgaW50IGdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSB7CiAgICAgcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uamF2YQppbmRleCBkMDhmM2IwLi5iODg2YmMyIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uamF2YQpAQCAtMzQsNiArMzQsNyBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTFJFQURZX09QRU4gPSAyOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSU1FRF9PVVQgPSAzOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkRfT0ZfRklMRSA9IDQ7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPUlJVUFRFRF9EQVRBID0gNTsKIAogICBwcm90ZWN0ZWQgaW50IHR5cGVfID0gVU5LTk9XTjsKIApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NTVhYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuRGVmbGF0ZXI7CitpbXBvcnQgamF2YS51dGlsLnppcC5EZWZsYXRlck91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkluZmxhdGVyOworaW1wb3J0IGphdmEudXRpbC56aXAuSW5mbGF0ZXJJbnB1dFN0cmVhbTsKKworLyoqCisgKiBUWmxpYlRyYW5zcG9ydCBkZWZsYXRlcyBvbiB3cml0ZSBhbmQgaW5mbGF0ZXMgb24gcmVhZC4KKyAqLworcHVibGljIGNsYXNzIFRabGliVHJhbnNwb3J0IGV4dGVuZHMgVElPU3RyZWFtVHJhbnNwb3J0IHsKKworICAgIHByaXZhdGUgVFRyYW5zcG9ydCB0cmFuc3BvcnRfID0gbnVsbDsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBleHRlbmRzIFRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAgICAgcHVibGljIEZhY3RvcnkoKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgYmFzZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUWmxpYlRyYW5zcG9ydChiYXNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgVFpsaWJUcmFuc3BvcnQgaW5zdGFuY2UuCisgICAgICogQHBhcmFtICB0cmFuc3BvcnQgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHRvIHJlYWQgZnJvbSBhbmQgd3JpdGUgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgVFpsaWJUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICAgICAgdGhpcyh0cmFuc3BvcnQsIERlZmxhdGVyLkJFU1RfQ09NUFJFU1NJT04pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgVFpsaWJUcmFuc3BvcnQgaW5zdGFuY2UuCisgICAgICogQHBhcmFtICB0cmFuc3BvcnQgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHRvIHJlYWQgZnJvbSBhbmQgd3JpdGUgdG8KKyAgICAgKiBAcGFyYW0gIGNvbXByZXNzaW9uTGV2ZWwgMCBmb3Igbm8gY29tcHJlc3Npb24sIDkgZm9yIG1heGltdW0gY29tcHJlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgVFpsaWJUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQsIGludCBjb21wcmVzc2lvbkxldmVsKSB7CisgICAgICAgIHRyYW5zcG9ydF8gPSB0cmFuc3BvcnQ7CisgICAgICAgIGlucHV0U3RyZWFtXyA9IG5ldyBJbmZsYXRlcklucHV0U3RyZWFtKG5ldyBUVHJhbnNwb3J0SW5wdXRTdHJlYW0odHJhbnNwb3J0XyksIG5ldyBJbmZsYXRlcigpKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtXyA9IG5ldyBEZWZsYXRlck91dHB1dFN0cmVhbShuZXcgVFRyYW5zcG9ydE91dHB1dFN0cmVhbSh0cmFuc3BvcnRfKSwgbmV3IERlZmxhdGVyKGNvbXByZXNzaW9uTGV2ZWwsIGZhbHNlKSwgdHJ1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgeworICAgICAgICByZXR1cm4gdHJhbnNwb3J0Xy5pc09wZW4oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgICAgICB0cmFuc3BvcnRfLm9wZW4oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgc3VwZXIuY2xvc2UoKTsKKyAgICAgICAgaWYgKHRyYW5zcG9ydF8uaXNPcGVuKCkpIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydF8uY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworY2xhc3MgVFRyYW5zcG9ydElucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0geworCisgICAgcHJpdmF0ZSBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG51bGw7CisKKyAgICBwdWJsaWMgVFRyYW5zcG9ydElucHV0U3RyZWFtKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMV07CisgICAgICAgICAgICB0cmFuc3BvcnQucmVhZChidWYsIDAsIDEpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZlswXTsKKyAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0LnJlYWQoYiwgb2ZmLCBsZW4pOworICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworY2xhc3MgVFRyYW5zcG9ydE91dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7CisKKyAgICBwcml2YXRlIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbnVsbDsKKworICAgIHB1YmxpYyBUVHJhbnNwb3J0T3V0cHV0U3RyZWFtKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJhbnNwb3J0LndyaXRlKG5ldyBieXRlW117KGJ5dGUpIGJ9KTsKKyAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC53cml0ZShiLCBvZmYsIGxlbik7CisgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJhbnNwb3J0LmZsdXNoKCk7CisgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0Ly5rZXlzdG9yZSBiL2xpYi9qYXZhL3Rlc3QvLmtleXN0b3JlCmluZGV4IDBjODUxMTEuLjRkZDY2YWMgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3QvLmtleXN0b3JlCisrKyBiL2xpYi9qYXZhL3Rlc3QvLmtleXN0b3JlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3QvLnRydXN0c3RvcmUgYi9saWIvamF2YS90ZXN0Ly50cnVzdHN0b3JlCmluZGV4IGMyNGI0YTIuLjI2ZmJkMTkgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3QvLnRydXN0c3RvcmUKKysrIGIvbGliL2phdmEvdGVzdC8udHJ1c3RzdG9yZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L2xvZzRqLnByb3BlcnRpZXMgYi9saWIvamF2YS90ZXN0L2xvZzRqLnByb3BlcnRpZXMKaW5kZXggODc4YjJmYy4uYWI5YmViYSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9sb2c0ai5wcm9wZXJ0aWVzCisrKyBiL2xpYi9qYXZhL3Rlc3QvbG9nNGoucHJvcGVydGllcwpAQCAtMSw2ICsxLDYgQEAKICMgbG9nNGogY29uZmlndXJhdGlvbiB1c2VkIGR1cmluZyBidWlsZCBhbmQgdW5pdCB0ZXN0cwogbG9nNGoucm9vdExvZ2dlcj1kZWJ1ZyxzdGRvdXQKLWxvZzRqLnRocmVzaGhvbGQ9QUxMCitsb2c0ai50aHJlc2hvbGQ9QUxMCiBsb2c0ai5hcHBlbmRlci5zdGRvdXQ9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKIGxvZzRqLmFwcGVuZGVyLnN0ZG91dC5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0CiBsb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVke0lTTzg2MDF9ICUtNXAgJWN7Mn0gKCVGOiVNKCVMKSkgLSAlbSVuCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L0ZpeHR1cmVzLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L0ZpeHR1cmVzLmphdmEKaW5kZXggZDc1OWJiMC4uNjFmNDBhNSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9GaXh0dXJlcy5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvRml4dHVyZXMuamF2YQpAQCAtMTcsMTAgKzE3LDEwIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CiAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwpAQCAtMzcsOTQgKzM3LDMwNCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIE5lc3RpbmcgbmVzdGluZzsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBIb2x5TW9sZXkgaG9seU1vbGV5OwogICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QgY29tcGFjdFByb3RvVGVzdFN0cnVjdDsKLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBrVW5pY29kZUJ5dGVzID0gewotICAgIChieXRlKTB4ZDMsIChieXRlKTB4ODAsIChieXRlKTB4ZTIsIChieXRlKTB4ODUsIChieXRlKTB4YWUsIChieXRlKTB4Y2UsCi0gICAgKGJ5dGUpMHg5ZCwgKGJ5dGUpMHgyMCwgKGJ5dGUpMHhkMCwgKGJ5dGUpMHg5ZCwgKGJ5dGUpMHhjZSwgKGJ5dGUpMHhiZiwKLSAgICAoYnl0ZSkweGUyLCAoYnl0ZSkweDg1LCAoYnl0ZSkweGJmLCAoYnl0ZSkweGQwLCAoYnl0ZSkweGJlLCAoYnl0ZSkweGM5LAotICAgIChieXRlKTB4YTEsIChieXRlKTB4ZDAsIChieXRlKTB4YjMsIChieXRlKTB4ZDAsIChieXRlKTB4YjAsIChieXRlKTB4Y2YsCi0gICAgKGJ5dGUpMHg4MSwgKGJ5dGUpMHhlMiwgKGJ5dGUpMHg4NCwgKGJ5dGUpMHg4ZSwgKGJ5dGUpMHgyMCwgKGJ5dGUpMHhjZSwKLSAgICAoYnl0ZSkweDkxLCAoYnl0ZSkweDc0LCAoYnl0ZSkweDc0LCAoYnl0ZSkweGNlLCAoYnl0ZSkweGIxLCAoYnl0ZSkweGUyLAotICAgIChieXRlKTB4ODUsIChieXRlKTB4YmQsIChieXRlKTB4Y2UsIChieXRlKTB4YmEsIChieXRlKTB4ODMsIChieXRlKTB4ZTIsCi0gICAgKGJ5dGUpMHg4MCwgKGJ5dGUpMHhiYwotICB9OworCisgIC8vIFRoZXNlIGJ5dGUgYXJyYXlzIGFyZSBzZXJpYWxpemVkIHZlcnNpb25zIG9mIHRoZSBhYm92ZSBzdHJ1Y3RzLgorICAvLyBUaGV5IHdlcmUgc2VyaWFsaXplZCBpbiBiaW5hcnkgcHJvdG9jb2wgdXNpbmcgdGhyaWZ0IDAuNi54IGFuZCBhcmUgdXNlZCB0bworICAvLyB0ZXN0IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggcmVzcGVjdCB0byB0aGUgc3RhbmRhcmQgc2NoZW1lLgorICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBwZXJzaXN0ZW50Qnl0ZXNPbmVPZkVhY2ggPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4RDYsCisgICAgKGJ5dGUpIDB4MDYsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNCwgKGJ5dGUpIDB4NjksIChieXRlKSAweDc4LAorICAgIChieXRlKSAweDA4LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDUsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBBLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDYsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDY1LAorICAgIChieXRlKSAweEEwLCAoYnl0ZSkgMHhCQywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA0LCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwNywgKGJ5dGUpIDB4NDAsIChieXRlKSAweDA5LCAoYnl0ZSkgMHgyMSwgKGJ5dGUpIDB4RkIsCisgICAgKGJ5dGUpIDB4NTQsIChieXRlKSAweDQ0LCAoYnl0ZSkgMHgyRCwgKGJ5dGUpIDB4MTgsIChieXRlKSAweDBCLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwRCwgKGJ5dGUpIDB4NEEsIChieXRlKSAweDUzLCAoYnl0ZSkgMHg0RiwgKGJ5dGUpIDB4NEUsCisgICAgKGJ5dGUpIDB4MjAsIChieXRlKSAweDU0LCAoYnl0ZSkgMHg0OCwgKGJ5dGUpIDB4NDksIChieXRlKSAweDUzLAorICAgIChieXRlKSAweDIxLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4MjIsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwQiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDksIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MkUsIChieXRlKSAweEQzLCAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4RTIsIChieXRlKSAweDg1LAorICAgIChieXRlKSAweEFFLCAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4OUQsIChieXRlKSAweDIwLCAoYnl0ZSkgMHhEMCwKKyAgICAoYnl0ZSkgMHg5RCwgKGJ5dGUpIDB4Q0UsIChieXRlKSAweEJGLCAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODUsCisgICAgKGJ5dGUpIDB4QkYsIChieXRlKSAweEQwLCAoYnl0ZSkgMHhCRSwgKGJ5dGUpIDB4QzksIChieXRlKSAweEExLAorICAgIChieXRlKSAweEQwLCAoYnl0ZSkgMHhCMywgKGJ5dGUpIDB4RDAsIChieXRlKSAweEIwLCAoYnl0ZSkgMHhDRiwKKyAgICAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4RTIsIChieXRlKSAweDg0LCAoYnl0ZSkgMHg4RSwgKGJ5dGUpIDB4MjAsCisgICAgKGJ5dGUpIDB4Q0UsIChieXRlKSAweDkxLCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4NzQsIChieXRlKSAweENFLAorICAgIChieXRlKSAweEIxLCAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODUsIChieXRlKSAweEJELCAoYnl0ZSkgMHhDRSwKKyAgICAoYnl0ZSkgMHhCQSwgKGJ5dGUpIDB4RUYsIChieXRlKSAweEJGLCAoYnl0ZSkgMHhCRCwgKGJ5dGUpIDB4RTIsCisgICAgKGJ5dGUpIDB4ODAsIChieXRlKSAweEJDLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBBLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA2LCAoYnl0ZSkgMHg2MiwgKGJ5dGUpIDB4NjEsCisgICAgKGJ5dGUpIDB4NzMsIChieXRlKSAweDY1LCAoYnl0ZSkgMHgzNiwgKGJ5dGUpIDB4MzQsIChieXRlKSAweDBGLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQywgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDMsCisgICAgKGJ5dGUpIDB4MEYsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwRCwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MEYsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBFLCAoYnl0ZSkgMHgwQSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAwIH07CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIHBlcnNpc3RlbnRCeXRlc05lc3RpbmcgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4MEMsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4N0EsIChieXRlKSAweDY5LCAoYnl0ZSkgMHgwQiwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDEzLAorICAgIChieXRlKSAweDQ5LCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NjEsIChieXRlKSAweDZELCAoYnl0ZSkgMHgyMCwKKyAgICAoYnl0ZSkgMHg2MSwgKGJ5dGUpIDB4MjAsIChieXRlKSAweDYyLCAoYnl0ZSkgMHg2RiwgKGJ5dGUpIDB4NkUsCisgICAgKGJ5dGUpIDB4NkIsIChieXRlKSAweDJFLCAoYnl0ZSkgMHgyRSwgKGJ5dGUpIDB4MkUsIChieXRlKSAweDIwLAorICAgIChieXRlKSAweDc4LCAoYnl0ZSkgMHg2RiwgKGJ5dGUpIDB4NzIsIChieXRlKSAweDIxLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwQywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAyLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHhENiwKKyAgICAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA0LCAoYnl0ZSkgMHg2OSwgKGJ5dGUpIDB4NzgsCisgICAgKGJ5dGUpIDB4MDgsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4NjUsCisgICAgKGJ5dGUpIDB4QTAsIChieXRlKSAweEJDLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDQsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDA3LCAoYnl0ZSkgMHg0MCwgKGJ5dGUpIDB4MDksIChieXRlKSAweDIxLCAoYnl0ZSkgMHhGQiwKKyAgICAoYnl0ZSkgMHg1NCwgKGJ5dGUpIDB4NDQsIChieXRlKSAweDJELCAoYnl0ZSkgMHgxOCwgKGJ5dGUpIDB4MEIsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA4LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDBELCAoYnl0ZSkgMHg0QSwgKGJ5dGUpIDB4NTMsIChieXRlKSAweDRGLCAoYnl0ZSkgMHg0RSwKKyAgICAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NTQsIChieXRlKSAweDQ4LCAoYnl0ZSkgMHg0OSwgKGJ5dGUpIDB4NTMsCisgICAgKGJ5dGUpIDB4MjEsIChieXRlKSAweDIwLCAoYnl0ZSkgMHgyMiwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDBCLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgyRSwgKGJ5dGUpIDB4RDMsIChieXRlKSAweDgwLCAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODUsCisgICAgKGJ5dGUpIDB4QUUsIChieXRlKSAweENFLCAoYnl0ZSkgMHg5RCwgKGJ5dGUpIDB4MjAsIChieXRlKSAweEQwLAorICAgIChieXRlKSAweDlELCAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4QkYsIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4NSwKKyAgICAoYnl0ZSkgMHhCRiwgKGJ5dGUpIDB4RDAsIChieXRlKSAweEJFLCAoYnl0ZSkgMHhDOSwgKGJ5dGUpIDB4QTEsCisgICAgKGJ5dGUpIDB4RDAsIChieXRlKSAweEIzLCAoYnl0ZSkgMHhEMCwgKGJ5dGUpIDB4QjAsIChieXRlKSAweENGLAorICAgIChieXRlKSAweDgxLCAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODQsIChieXRlKSAweDhFLCAoYnl0ZSkgMHgyMCwKKyAgICAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4OTEsIChieXRlKSAweDc0LCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4Q0UsCisgICAgKGJ5dGUpIDB4QjEsIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4NSwgKGJ5dGUpIDB4QkQsIChieXRlKSAweENFLAorICAgIChieXRlKSAweEJBLCAoYnl0ZSkgMHhFRiwgKGJ5dGUpIDB4QkYsIChieXRlKSAweEJELCAoYnl0ZSkgMHhFMiwKKyAgICAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4QkMsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEEsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEIsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDYyLCAoYnl0ZSkgMHg2MSwKKyAgICAoYnl0ZSkgMHg3MywgKGJ5dGUpIDB4NjUsIChieXRlKSAweDM2LCAoYnl0ZSkgMHgzNCwgKGJ5dGUpIDB4MEYsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBDLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMywKKyAgICAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBELCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwRiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEUsIChieXRlKSAweDBBLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwIH07CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIHBlcnNpc3RlbnRCeXRlc0hvbHlNb2xleSA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDBDLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMSwKKyAgICAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgyMywgKGJ5dGUpIDB4MDYsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDA0LCAoYnl0ZSkgMHg2OSwgKGJ5dGUpIDB4NzgsIChieXRlKSAweDA4LCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MEEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4NjUsIChieXRlKSAweEEwLCAoYnl0ZSkgMHhCQywKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDQsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNywgKGJ5dGUpIDB4NDAsCisgICAgKGJ5dGUpIDB4MDksIChieXRlKSAweDIxLCAoYnl0ZSkgMHhGQiwgKGJ5dGUpIDB4NTQsIChieXRlKSAweDQ0LAorICAgIChieXRlKSAweDJELCAoYnl0ZSkgMHgxOCwgKGJ5dGUpIDB4MEIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwOCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwRCwgKGJ5dGUpIDB4NEEsCisgICAgKGJ5dGUpIDB4NTMsIChieXRlKSAweDRGLCAoYnl0ZSkgMHg0RSwgKGJ5dGUpIDB4MjAsIChieXRlKSAweDU0LAorICAgIChieXRlKSAweDQ4LCAoYnl0ZSkgMHg0OSwgKGJ5dGUpIDB4NTMsIChieXRlKSAweDIxLCAoYnl0ZSkgMHgyMCwKKyAgICAoYnl0ZSkgMHgyMiwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDksCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MkUsIChieXRlKSAweEQzLAorICAgIChieXRlKSAweDgwLCAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODUsIChieXRlKSAweEFFLCAoYnl0ZSkgMHhDRSwKKyAgICAoYnl0ZSkgMHg5RCwgKGJ5dGUpIDB4MjAsIChieXRlKSAweEQwLCAoYnl0ZSkgMHg5RCwgKGJ5dGUpIDB4Q0UsCisgICAgKGJ5dGUpIDB4QkYsIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4NSwgKGJ5dGUpIDB4QkYsIChieXRlKSAweEQwLAorICAgIChieXRlKSAweEJFLCAoYnl0ZSkgMHhDOSwgKGJ5dGUpIDB4QTEsIChieXRlKSAweEQwLCAoYnl0ZSkgMHhCMywKKyAgICAoYnl0ZSkgMHhEMCwgKGJ5dGUpIDB4QjAsIChieXRlKSAweENGLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4RTIsCisgICAgKGJ5dGUpIDB4ODQsIChieXRlKSAweDhFLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4Q0UsIChieXRlKSAweDkxLAorICAgIChieXRlKSAweDc0LCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4Q0UsIChieXRlKSAweEIxLCAoYnl0ZSkgMHhFMiwKKyAgICAoYnl0ZSkgMHg4NSwgKGJ5dGUpIDB4QkQsIChieXRlKSAweENFLCAoYnl0ZSkgMHhCQSwgKGJ5dGUpIDB4RUYsCisgICAgKGJ5dGUpIDB4QkYsIChieXRlKSAweEJELCAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODAsIChieXRlKSAweEJDLAorICAgIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDYsIChieXRlKSAweDYyLCAoYnl0ZSkgMHg2MSwgKGJ5dGUpIDB4NzMsIChieXRlKSAweDY1LAorICAgIChieXRlKSAweDM2LCAoYnl0ZSkgMHgzNCwgKGJ5dGUpIDB4MEYsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQywKKyAgICAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsCisgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MEYsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDBELCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDIsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBFLAorICAgIChieXRlKSAweDBBLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDMsIChieXRlKSAweEQ2LCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA0LAorICAgIChieXRlKSAweDY5LCAoYnl0ZSkgMHg3OCwgKGJ5dGUpIDB4MDgsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNSwKKyAgICAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEEsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAxLCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4QTAsIChieXRlKSAweEJDLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwNCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA3LCAoYnl0ZSkgMHg0MCwgKGJ5dGUpIDB4MDksCisgICAgKGJ5dGUpIDB4MjEsIChieXRlKSAweEZCLCAoYnl0ZSkgMHg1NCwgKGJ5dGUpIDB4NDQsIChieXRlKSAweDJELAorICAgIChieXRlKSAweDE4LCAoYnl0ZSkgMHgwQiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA4LCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBELCAoYnl0ZSkgMHg0QSwgKGJ5dGUpIDB4NTMsCisgICAgKGJ5dGUpIDB4NEYsIChieXRlKSAweDRFLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NTQsIChieXRlKSAweDQ4LAorICAgIChieXRlKSAweDQ5LCAoYnl0ZSkgMHg1MywgKGJ5dGUpIDB4MjEsIChieXRlKSAweDIwLCAoYnl0ZSkgMHgyMiwKKyAgICAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MEIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgyRSwgKGJ5dGUpIDB4RDMsIChieXRlKSAweDgwLAorICAgIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4NSwgKGJ5dGUpIDB4QUUsIChieXRlKSAweENFLCAoYnl0ZSkgMHg5RCwKKyAgICAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4RDAsIChieXRlKSAweDlELCAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4QkYsCisgICAgKGJ5dGUpIDB4RTIsIChieXRlKSAweDg1LCAoYnl0ZSkgMHhCRiwgKGJ5dGUpIDB4RDAsIChieXRlKSAweEJFLAorICAgIChieXRlKSAweEM5LCAoYnl0ZSkgMHhBMSwgKGJ5dGUpIDB4RDAsIChieXRlKSAweEIzLCAoYnl0ZSkgMHhEMCwKKyAgICAoYnl0ZSkgMHhCMCwgKGJ5dGUpIDB4Q0YsIChieXRlKSAweDgxLCAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODQsCisgICAgKGJ5dGUpIDB4OEUsIChieXRlKSAweDIwLCAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4OTEsIChieXRlKSAweDc0LAorICAgIChieXRlKSAweDc0LCAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4QjEsIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4NSwKKyAgICAoYnl0ZSkgMHhCRCwgKGJ5dGUpIDB4Q0UsIChieXRlKSAweEJBLCAoYnl0ZSkgMHhFRiwgKGJ5dGUpIDB4QkYsCisgICAgKGJ5dGUpIDB4QkQsIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4QkMsIChieXRlKSAweDAyLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwQiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDYsCisgICAgKGJ5dGUpIDB4NjIsIChieXRlKSAweDYxLCAoYnl0ZSkgMHg3MywgKGJ5dGUpIDB4NjUsIChieXRlKSAweDM2LAorICAgIChieXRlKSAweDM0LCAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBDLCAoYnl0ZSkgMHgwMywKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDEsCisgICAgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBELAorICAgIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDMsIChieXRlKSAweDBGLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEUsIChieXRlKSAweDBBLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBFLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MEYsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4NzQsIChieXRlKSAweDY4LCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4NkUsCisgICAgKGJ5dGUpIDB4MjAsIChieXRlKSAweDYxLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NkYsIChieXRlKSAweDZFLAorICAgIChieXRlKSAweDY1LCAoYnl0ZSkgMHgyQywgKGJ5dGUpIDB4MjAsIChieXRlKSAweDc0LCAoYnl0ZSkgMHg3NywKKyAgICAoYnl0ZSkgMHg2RiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDYsCisgICAgKGJ5dGUpIDB4NzQsIChieXRlKSAweDY4LCAoYnl0ZSkgMHg3MiwgKGJ5dGUpIDB4NjUsIChieXRlKSAweDY1LAorICAgIChieXRlKSAweDIxLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNiwKKyAgICAoYnl0ZSkgMHg0NiwgKGJ5dGUpIDB4NEYsIChieXRlKSAweDU1LCAoYnl0ZSkgMHg1MiwgKGJ5dGUpIDB4MjEsCisgICAgKGJ5dGUpIDB4MjEsIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwOSwKKyAgICAoYnl0ZSkgMHg2MSwgKGJ5dGUpIDB4NkUsIChieXRlKSAweDY0LCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NjEsCisgICAgKGJ5dGUpIDB4MjAsIChieXRlKSAweDZGLCAoYnl0ZSkgMHg2RSwgKGJ5dGUpIDB4NjUsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDksIChieXRlKSAweDYxLCAoYnl0ZSkgMHg2RSwKKyAgICAoYnl0ZSkgMHg2NCwgKGJ5dGUpIDB4MjAsIChieXRlKSAweDYxLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NzQsCisgICAgKGJ5dGUpIDB4NzcsIChieXRlKSAweDZGLCAoYnl0ZSkgMHgwRCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLAorICAgIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsCisgICAgKGJ5dGUpIDB4NzQsIChieXRlKSAweDc3LCAoYnl0ZSkgMHg2RiwgKGJ5dGUpIDB4MEMsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDA4LCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsCisgICAgKGJ5dGUpIDB4MEIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4NTcsIChieXRlKSAweDYxLCAoYnl0ZSkgMHg2OSwKKyAgICAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4MkUsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAyLAorICAgIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDUsIChieXRlKSAweDU3LCAoYnl0ZSkgMHg2OCwgKGJ5dGUpIDB4NjEsCisgICAgKGJ5dGUpIDB4NzQsIChieXRlKSAweDNGLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4NzQsIChieXRlKSAweDY4LCAoYnl0ZSkgMHg3MiwKKyAgICAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4NjUsIChieXRlKSAweDBDLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDA0LCAoYnl0ZSkgMHg3QSwgKGJ5dGUpIDB4NjUsIChieXRlKSAweDcyLCAoYnl0ZSkgMHg2RiwKKyAgICAoYnl0ZSkgMHgwQywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAgfTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10ga1VuaWNvZGVCeXRlcyA9IHsgKGJ5dGUpIDB4ZDMsIChieXRlKSAweDgwLAorICAgICAgKGJ5dGUpIDB4ZTIsIChieXRlKSAweDg1LCAoYnl0ZSkgMHhhZSwgKGJ5dGUpIDB4Y2UsIChieXRlKSAweDlkLAorICAgICAgKGJ5dGUpIDB4MjAsIChieXRlKSAweGQwLCAoYnl0ZSkgMHg5ZCwgKGJ5dGUpIDB4Y2UsIChieXRlKSAweGJmLAorICAgICAgKGJ5dGUpIDB4ZTIsIChieXRlKSAweDg1LCAoYnl0ZSkgMHhiZiwgKGJ5dGUpIDB4ZDAsIChieXRlKSAweGJlLAorICAgICAgKGJ5dGUpIDB4YzksIChieXRlKSAweGExLCAoYnl0ZSkgMHhkMCwgKGJ5dGUpIDB4YjMsIChieXRlKSAweGQwLAorICAgICAgKGJ5dGUpIDB4YjAsIChieXRlKSAweGNmLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4ZTIsIChieXRlKSAweDg0LAorICAgICAgKGJ5dGUpIDB4OGUsIChieXRlKSAweDIwLCAoYnl0ZSkgMHhjZSwgKGJ5dGUpIDB4OTEsIChieXRlKSAweDc0LAorICAgICAgKGJ5dGUpIDB4NzQsIChieXRlKSAweGNlLCAoYnl0ZSkgMHhiMSwgKGJ5dGUpIDB4ZTIsIChieXRlKSAweDg1LAorICAgICAgKGJ5dGUpIDB4YmQsIChieXRlKSAweGNlLCAoYnl0ZSkgMHhiYSwgKGJ5dGUpIDB4ODMsIChieXRlKSAweGUyLAorICAgICAgKGJ5dGUpIDB4ODAsIChieXRlKSAweGJjIH07CiAKICAgc3RhdGljIHsKICAgICB0cnkgewogICAgICAgb25lT2ZFYWNoID0gbmV3IE9uZU9mRWFjaCgpOwotICAgICAgb25lT2ZFYWNoLmltX3RydWUgPSB0cnVlOwotICAgICAgb25lT2ZFYWNoLmltX2ZhbHNlID0gZmFsc2U7Ci0gICAgICBvbmVPZkVhY2guYV9iaXRlID0gKGJ5dGUpIDB4ZDY7Ci0gICAgICBvbmVPZkVhY2guaW50ZWdlcjE2ID0gMjcwMDA7Ci0gICAgICBvbmVPZkVhY2guaW50ZWdlcjMyID0gMSA8PCAyNDsKLSAgICAgIG9uZU9mRWFjaC5pbnRlZ2VyNjQgPSAobG9uZykgNjAwMCAqIDEwMDAgKiAxMDAwOwotICAgICAgb25lT2ZFYWNoLmRvdWJsZV9wcmVjaXNpb24gPSBNYXRoLlBJOwotICAgICAgb25lT2ZFYWNoLnNvbWVfY2hhcmFjdGVycyA9ICJKU09OIFRISVMhIFwiXDEiOwotICAgICAgb25lT2ZFYWNoLnpvbWdfdW5pY29kZSA9IG5ldyBTdHJpbmcoa1VuaWNvZGVCeXRlcywgIlVURi04Iik7Ci0gICAgICBvbmVPZkVhY2guYmFzZTY0ID0gQnl0ZUJ1ZmZlci53cmFwKCJiYXNlNjQiLmdldEJ5dGVzKCkpOworICAgICAgb25lT2ZFYWNoLnNldEltX3RydWUodHJ1ZSk7CisgICAgICBvbmVPZkVhY2guc2V0SW1fZmFsc2UoZmFsc2UpOworICAgICAgb25lT2ZFYWNoLnNldEFfYml0ZSgoYnl0ZSkgMHhkNik7CisgICAgICBvbmVPZkVhY2guc2V0SW50ZWdlcjE2KChzaG9ydCkgMjcwMDApOworICAgICAgb25lT2ZFYWNoLnNldEludGVnZXIzMigxIDw8IDI0KTsKKyAgICAgIG9uZU9mRWFjaC5zZXRJbnRlZ2VyNjQoKGxvbmcpIDYwMDAgKiAxMDAwICogMTAwMCk7CisgICAgICBvbmVPZkVhY2guc2V0RG91YmxlX3ByZWNpc2lvbihNYXRoLlBJKTsKKyAgICAgIG9uZU9mRWFjaC5zZXRTb21lX2NoYXJhY3RlcnMoIkpTT04gVEhJUyEgXCJcMSIpOworICAgICAgb25lT2ZFYWNoLnNldFpvbWdfdW5pY29kZShuZXcgU3RyaW5nKGtVbmljb2RlQnl0ZXMsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKyAgICAgIG9uZU9mRWFjaC5zZXRCYXNlNjQoQnl0ZUJ1ZmZlci53cmFwKCJiYXNlNjQiLmdldEJ5dGVzKCkpKTsKICAgICAgIC8vIGJ5dGUsIGkxNiwgYW5kIGk2NCBsaXN0cyBhcmUgcG9wdWxhdGVkIGJ5IGRlZmF1bHQgY29uc3RydWN0b3IKIAogICAgICAgQm9uayBib25rID0gbmV3IEJvbmsoKTsKLSAgICAgIGJvbmsudHlwZSA9IDMxMzM3OwotICAgICAgYm9uay5tZXNzYWdlID0gIkkgYW0gYSBib25rLi4uIHhvciEiOworICAgICAgYm9uay5zZXRUeXBlKDMxMzM3KTsKKyAgICAgIGJvbmsuc2V0TWVzc2FnZSgiSSBhbSBhIGJvbmsuLi4geG9yISIpOwogICAgICAgbmVzdGluZyA9IG5ldyBOZXN0aW5nKGJvbmssIG9uZU9mRWFjaCk7CiAKICAgICAgIGhvbHlNb2xleSA9IG5ldyBIb2x5TW9sZXkoKTsKLSAgICAgIGhvbHlNb2xleS5iaWcgPSBuZXcgQXJyYXlMaXN0PE9uZU9mRWFjaD4oKTsKLSAgICAgIGhvbHlNb2xleS5iaWcuYWRkKG5ldyBPbmVPZkVhY2gob25lT2ZFYWNoKSk7Ci0gICAgICBob2x5TW9sZXkuYmlnLmFkZChuZXN0aW5nLm15X29vZSk7Ci0gICAgICBob2x5TW9sZXkuYmlnLmdldCgwKS5hX2JpdGUgPSAoYnl0ZSkgMHgyMjsKLSAgICAgIGhvbHlNb2xleS5iaWcuZ2V0KDEpLmFfYml0ZSA9IChieXRlKSAweDIzOworICAgICAgTGlzdDxPbmVPZkVhY2g+IGJpZyA9IG5ldyBBcnJheUxpc3Q8T25lT2ZFYWNoPigpOworICAgICAgYmlnLmFkZChuZXcgT25lT2ZFYWNoKG9uZU9mRWFjaCkpOworICAgICAgYmlnLmFkZChuZXN0aW5nLm15X29vZSk7CisgICAgICBob2x5TW9sZXkuc2V0QmlnKGJpZyk7CisgICAgICBob2x5TW9sZXkuZ2V0QmlnKCkuZ2V0KDApLnNldEFfYml0ZSgoYnl0ZSkgMHgyMik7CisgICAgICBob2x5TW9sZXkuZ2V0QmlnKCkuZ2V0KDApLnNldEFfYml0ZSgoYnl0ZSkgMHgyMyk7CiAKLSAgICAgIGhvbHlNb2xleS5jb250YWluID0gbmV3IEhhc2hTZXQ8TGlzdDxTdHJpbmc+PigpOworICAgICAgaG9seU1vbGV5LnNldENvbnRhaW4obmV3IEhhc2hTZXQ8TGlzdDxTdHJpbmc+PigpKTsKICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHN0YWdlMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigyKTsKICAgICAgIHN0YWdlMS5hZGQoImFuZCBhIG9uZSIpOwogICAgICAgc3RhZ2UxLmFkZCgiYW5kIGEgdHdvIik7Ci0gICAgICBob2x5TW9sZXkuY29udGFpbi5hZGQoc3RhZ2UxKTsKKyAgICAgIGhvbHlNb2xleS5nZXRDb250YWluKCkuYWRkKHN0YWdlMSk7CiAgICAgICBzdGFnZTEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMyk7CiAgICAgICBzdGFnZTEuYWRkKCJ0aGVuIGEgb25lLCB0d28iKTsKICAgICAgIHN0YWdlMS5hZGQoInRocmVlISIpOwogICAgICAgc3RhZ2UxLmFkZCgiRk9VUiEhIik7Ci0gICAgICBob2x5TW9sZXkuY29udGFpbi5hZGQoc3RhZ2UxKTsKKyAgICAgIGhvbHlNb2xleS5nZXRDb250YWluKCkuYWRkKHN0YWdlMSk7CiAgICAgICBzdGFnZTEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMCk7Ci0gICAgICBob2x5TW9sZXkuY29udGFpbi5hZGQoc3RhZ2UxKTsKKyAgICAgIGhvbHlNb2xleS5nZXRDb250YWluKCkuYWRkKHN0YWdlMSk7CiAKICAgICAgIEFycmF5TGlzdDxCb25rPiBzdGFnZTIgPSBuZXcgQXJyYXlMaXN0PEJvbms+KCk7Ci0gICAgICBob2x5TW9sZXkuYm9ua3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8Qm9uaz4+KCk7CisgICAgICBob2x5TW9sZXkuc2V0Qm9ua3MobmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PEJvbms+PigpKTsKICAgICAgIC8vIG9uZSBlbXB0eQotICAgICAgaG9seU1vbGV5LmJvbmtzLnB1dCgiemVybyIsIHN0YWdlMik7Ci0gICAgICAKKyAgICAgIGhvbHlNb2xleS5nZXRCb25rcygpLnB1dCgiemVybyIsIHN0YWdlMik7CisKICAgICAgIC8vIG9uZSB3aXRoIHR3bwogICAgICAgc3RhZ2UyID0gbmV3IEFycmF5TGlzdDxCb25rPigpOwogICAgICAgQm9uayBiID0gbmV3IEJvbmsoKTsKLSAgICAgIGIudHlwZSA9IDE7Ci0gICAgICBiLm1lc3NhZ2UgPSAiV2FpdC4iOworICAgICAgYi5zZXRUeXBlKDEpOworICAgICAgYi5zZXRNZXNzYWdlKCJXYWl0LiIpOwogICAgICAgc3RhZ2UyLmFkZChiKTsKICAgICAgIGIgPSBuZXcgQm9uaygpOwotICAgICAgYi50eXBlID0gMjsKLSAgICAgIGIubWVzc2FnZSA9ICJXaGF0PyI7Ci0gICAgICBzdGFnZTIuYWRkKGIpOyAgICAgIAotICAgICAgaG9seU1vbGV5LmJvbmtzLnB1dCgidHdvIiwgc3RhZ2UyKTsKLSAgICAgIAorICAgICAgYi5zZXRUeXBlKDIpOworICAgICAgYi5zZXRNZXNzYWdlKCJXaGF0PyIpOworICAgICAgc3RhZ2UyLmFkZChiKTsKKyAgICAgIGhvbHlNb2xleS5nZXRCb25rcygpLnB1dCgidHdvIiwgc3RhZ2UyKTsKKwogICAgICAgLy8gb25lIHdpdGggdGhyZWUKICAgICAgIHN0YWdlMiA9IG5ldyBBcnJheUxpc3Q8Qm9uaz4oKTsKICAgICAgIGIgPSBuZXcgQm9uaygpOwotICAgICAgYi50eXBlID0gMzsKLSAgICAgIGIubWVzc2FnZSA9ICJxdW90aCI7CisgICAgICBiLnNldFR5cGUoMyk7CisgICAgICBiLnNldE1lc3NhZ2UoInF1b3RoIik7CiAgICAgICBiID0gbmV3IEJvbmsoKTsKLSAgICAgIGIudHlwZSA9IDQ7Ci0gICAgICBiLm1lc3NhZ2UgPSAidGhlIHJhdmVuIjsKKyAgICAgIGIuc2V0VHlwZSg0KTsKKyAgICAgIGIuc2V0TWVzc2FnZSgidGhlIHJhdmVuIik7CiAgICAgICBiID0gbmV3IEJvbmsoKTsKLSAgICAgIGIudHlwZSA9IDU7Ci0gICAgICBiLm1lc3NhZ2UgPSAibmV2ZXJtb3JlIjsKLSAgICAgIGhvbHlNb2xleS5ib25rcy5wdXQoInRocmVlIiwgc3RhZ2UyKTsKKyAgICAgIGIuc2V0VHlwZSg1KTsKKyAgICAgIGIuc2V0TWVzc2FnZSgibmV2ZXJtb3JlIik7CisgICAgICBob2x5TW9sZXkuZ2V0Qm9ua3MoKS5wdXQoInRocmVlIiwgc3RhZ2UyKTsKIAogICAgICAgLy8gc3VwZXJodWdlIGNvbXBhY3QgcHJvdG8gdGVzdCBzdHJ1Y3QKLSAgICAgIGNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QgPSBuZXcgQ29tcGFjdFByb3RvVGVzdFN0cnVjdCh0aHJpZnQudGVzdC5Db25zdGFudHMuQ09NUEFDVF9URVNUKTsKLSAgICAgIGNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QuYV9iaW5hcnkgPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbXXswLDEsMiwzLDQsNSw2LDcsOH0pOworICAgICAgY29tcGFjdFByb3RvVGVzdFN0cnVjdCA9IG5ldyBDb21wYWN0UHJvdG9UZXN0U3RydWN0KAorICAgICAgICAgIHRocmlmdC50ZXN0LkRlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVCk7CisgICAgICBjb21wYWN0UHJvdG9UZXN0U3RydWN0LnNldEFfYmluYXJ5KEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdIHsgMCwgMSwgMiwKKyAgICAgICAgICAzLCA0LCA1LCA2LCA3LCA4IH0pKTsKICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgfQogICB9Ci0gIAogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RGVlcENvcHkuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdERlZXBDb3B5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhZmFlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdERlZXBDb3B5LmphdmEKQEAgLTAsMCArMSwzNCBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCB0aHJpZnQudGVzdC5EZWVwQ29weUJhcjsKK2ltcG9ydCB0aHJpZnQudGVzdC5EZWVwQ29weUZvbzsKKworcHVibGljIGNsYXNzIFRlc3REZWVwQ29weSBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwdWJsaWMgdm9pZCB0ZXN0RGVlcENvcHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBEZWVwQ29weUZvbyBmb28gPSBuZXcgRGVlcENvcHlGb28oKTsKKworICAgIGZvby5hZGRUb0wobmV3IERlZXBDb3B5QmFyKCkpOworICAgIGZvby5hZGRUb1MobmV3IERlZXBDb3B5QmFyKCkpOworICAgIGZvby5wdXRUb00oInRlc3QgMyIsIG5ldyBEZWVwQ29weUJhcigpKTsKKworICAgIGZvby5hZGRUb0xpKG5ldyB0aHJpZnQudGVzdC5PYmplY3QoKSk7CisgICAgZm9vLmFkZFRvU2kobmV3IHRocmlmdC50ZXN0Lk9iamVjdCgpKTsKKyAgICBmb28ucHV0VG9NaSgidGVzdCAzIiwgbmV3IHRocmlmdC50ZXN0Lk9iamVjdCgpKTsKKworICAgIGZvby5zZXRCYXIobmV3IERlZXBDb3B5QmFyKCkpOworCisgICAgZmluYWwgRGVlcENvcHlGb28gZGVlcENvcHlGb28gPSBmb28uZGVlcENvcHkoKTsKKworICAgIGFzc2VydE5vdFNhbWUoZm9vLmdldEJhcigpLCBkZWVwQ29weUZvby5nZXRCYXIoKSk7CisKKyAgICBhc3NlcnROb3RTYW1lKGZvby5nZXRMKCkuZ2V0KDApLCAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcENvcHlGb28uZ2V0TCgpLmdldCgwKSk7CisgICAgYXNzZXJ0Tm90U2FtZShmb28uZ2V0UygpLnRvQXJyYXkobmV3IERlZXBDb3B5QmFyWzBdKVswXSwgIGRlZXBDb3B5Rm9vLmdldFMoKS50b0FycmF5KG5ldyBEZWVwQ29weUJhclswXSlbMF0pOworICAgIGFzc2VydE5vdFNhbWUoZm9vLmdldE0oKS5nZXQoInRlc3QgMyIpLCAgICAgICAgICAgICAgICAgICBkZWVwQ29weUZvby5nZXRNKCkuZ2V0KCJ0ZXN0IDMiKSk7CisKKyAgICBhc3NlcnROb3RTYW1lKGZvby5nZXRMaSgpLmdldCgwKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQ29weUZvby5nZXRMaSgpLmdldCgwKSk7CisgICAgYXNzZXJ0Tm90U2FtZShmb28uZ2V0U2koKS50b0FycmF5KG5ldyB0aHJpZnQudGVzdC5PYmplY3RbMF0pWzBdLCAgZGVlcENvcHlGb28uZ2V0U2koKS50b0FycmF5KG5ldyB0aHJpZnQudGVzdC5PYmplY3RbMF0pWzBdKTsKKyAgICBhc3NlcnROb3RTYW1lKGZvby5nZXRNaSgpLmdldCgidGVzdCAzIiksICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQ29weUZvby5nZXRNaSgpLmdldCgidGVzdCAzIikpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RFbnVtQ29udGFpbmVycy5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RW51bUNvbnRhaW5lcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODMyNDZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RW51bUNvbnRhaW5lcnMuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgdGhyaWZ0LnRlc3QuZW51bWNvbnRhaW5lcnMuRW51bUNvbnRhaW5lcnNUZXN0Q29uc3RhbnRzOworaW1wb3J0IHRocmlmdC50ZXN0LmVudW1jb250YWluZXJzLkdvZEJlYW47CitpbXBvcnQgdGhyaWZ0LnRlc3QuZW51bWNvbnRhaW5lcnMuR3JlZWtHb2RHb2RkZXNzOworCitpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CisKK3B1YmxpYyBjbGFzcyBUZXN0RW51bUNvbnRhaW5lcnMgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW51bUNvbnRhaW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgR29kQmVhbiBiMSA9IG5ldyBHb2RCZWFuKCk7CisgICAgICAgIGIxLmFkZFRvR29kZGVzcyhHcmVla0dvZEdvZGRlc3MuSEVSQSk7CisgICAgICAgIGIxLmdldEdvZGRlc3MoKS5hZGQoR3JlZWtHb2RHb2RkZXNzLkFQSFJPRElURSk7CisgICAgICAgIGIxLnB1dFRvUG93ZXIoR3JlZWtHb2RHb2RkZXNzLlpFVVMsIDEwMDApOworICAgICAgICBiMS5nZXRQb3dlcigpLnB1dChHcmVla0dvZEdvZGRlc3MuSEVSQSwgMzMzKTsKKyAgICAgICAgYjEucHV0VG9CeUFsaWFzKCJNci4gWiIsIEdyZWVrR29kR29kZGVzcy5aRVVTKTsKKyAgICAgICAgYjEuYWRkVG9JbWFnZXMoIkJhdGhzIG9mIEFwaHJvZGl0ZSAwMS5qcGVnIik7CisKKyAgICAgICAgZmluYWwgR29kQmVhbiBiMiA9IG5ldyBHb2RCZWFuKGIxKTsKKworICAgICAgICBmaW5hbCBHb2RCZWFuIGIzID0gbmV3IEdvZEJlYW4oKTsKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgVFNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBUU2VyaWFsaXplcigpOworICAgICAgICAgICAgZmluYWwgVERlc2VyaWFsaXplciBkZXNlcmlhbGl6ZXIgPSBuZXcgVERlc2VyaWFsaXplcigpOworCisgICAgICAgICAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShiMSk7CisgICAgICAgICAgICBkZXNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoYjMsIGJ5dGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRydWUoYjEuZ2V0R29kZGVzcygpICE9IGIyLmdldEdvZGRlc3MoKSk7CisgICAgICAgIGFzc2VydFRydWUoYjEuZ2V0UG93ZXIoKSAhPSBiMi5nZXRQb3dlcigpKTsKKworICAgICAgICBhc3NlcnRUcnVlKGIxLmdldEdvZGRlc3MoKSAhPSBiMy5nZXRHb2RkZXNzKCkpOworICAgICAgICBhc3NlcnRUcnVlKGIxLmdldFBvd2VyKCkgIT0gYjMuZ2V0UG93ZXIoKSk7CisKKyAgICAgICAgZm9yIChHb2RCZWFuIGVhY2ggOiBuZXcgR29kQmVhbltde2IxLCBiMiwgYjN9KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGVhY2guZ2V0R29kZGVzcygpLmNvbnRhaW5zKEdyZWVrR29kR29kZGVzcy5IRVJBKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShlYWNoLmdldEdvZGRlc3MoKS5jb250YWlucyhHcmVla0dvZEdvZGRlc3MuUE9TRUlET04pKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZWFjaC5nZXRHb2RkZXNzKCkgaW5zdGFuY2VvZiBFbnVtU2V0KTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMDAwKSwgZWFjaC5nZXRQb3dlcigpLmdldChHcmVla0dvZEdvZGRlc3MuWkVVUykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigzMzMpLCBlYWNoLmdldFBvd2VyKCkuZ2V0KEdyZWVrR29kR29kZGVzcy5IRVJBKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGVhY2guZ2V0UG93ZXIoKSBpbnN0YW5jZW9mIEVudW1NYXApOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKGVhY2guZ2V0QnlBbGlhcygpIGluc3RhbmNlb2YgSGFzaE1hcCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGVhY2guZ2V0SW1hZ2VzKCkgaW5zdGFuY2VvZiBIYXNoU2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbnVtQ29uc3RhbnRzKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImxpZ2h0bmluZyBib2x0IiwgRW51bUNvbnRhaW5lcnNUZXN0Q29uc3RhbnRzLkFUVFJJQlVURVMuZ2V0KEdyZWVrR29kR29kZGVzcy5aRVVTKSk7CisgICAgICAgIGFzc2VydFRydWUoRW51bUNvbnRhaW5lcnNUZXN0Q29uc3RhbnRzLkFUVFJJQlVURVMgaW5zdGFuY2VvZiBFbnVtTWFwKTsKKworICAgICAgICBhc3NlcnRUcnVlKEVudW1Db250YWluZXJzVGVzdENvbnN0YW50cy5CRUFVVFkuY29udGFpbnMoR3JlZWtHb2RHb2RkZXNzLkFQSFJPRElURSkpOworICAgICAgICBhc3NlcnRUcnVlKEVudW1Db250YWluZXJzVGVzdENvbnN0YW50cy5CRUFVVFkgaW5zdGFuY2VvZiBFbnVtU2V0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RGdWxsQ2FtZWwuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdEZ1bGxDYW1lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjOTg4OTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RGdWxsQ2FtZWwuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZTsKKworaW1wb3J0IHRocmlmdC50ZXN0LmZ1bGxjYW1lbC5PbmVPZkVhY2haWjsKK2ltcG9ydCB0aHJpZnQudGVzdC5mdWxsY2FtZWwuVW5kZXJzY29yZVNydjsKKworLy8gU2FuaXR5IGNoZWNrIGZvciB0aGUgY29kZSBnZW5lcmF0ZWQgYnkgJ2Z1bGxjYW1lbCcuCisvLworcHVibGljIGNsYXNzIFRlc3RGdWxsQ2FtZWwgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHVibGljIHZvaWQgdGVzdENhbWVsQ2FzZVN5bnRheCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRTZXJpYWxpemVyICAgYmluYXJ5U2VyaWFsaXplciAgID0gbmV3ICAgVFNlcmlhbGl6ZXIobmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCkpOworICAgIFREZXNlcmlhbGl6ZXIgYmluYXJ5RGVzZXJpYWxpemVyID0gbmV3IFREZXNlcmlhbGl6ZXIobmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCkpOworCisgICAgT25lT2ZFYWNoWlogb2JqID0gbmV3IE9uZU9mRWFjaFpaKCk7CisgICAgb2JqLnNldEFCaXRlKChieXRlKSAweGFlKTsKKyAgICBvYmouc2V0SW1GYWxzZSh0cnVlKTsKKyAgICBieXRlW10gc2VyQnl0ZXMgPSBiaW5hcnlTZXJpYWxpemVyLnNlcmlhbGl6ZShvYmopOworICAgIGJpbmFyeURlc2VyaWFsaXplci5kZXNlcmlhbGl6ZShvYmosIHNlckJ5dGVzKTsKKyAgICBhc3NlcnRUcnVlKCBvYmouZ2V0QUJpdGUoKSA9PSAoYnl0ZSkgMHhhZSApOworICAgIGFzc2VydFRydWUoIG9iai5pc0ltRmFsc2UoKSA9PSB0cnVlICk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q2FtZWxDYXNlUnBjTWV0aG9kcygpIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIFVuZGVyc2NvcmVTcnYuSWZhY2Ugc3J2ID0gbmV3IFVuZGVyc2NvcmVTcnYuSWZhY2UoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBsb25nIHNvbWVScGNDYWxsKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHJldHVybiAxbDsKKyAgICAgIH0KKyAgICB9OworICAgIGFzc2VydFRydWUoMWwgPT0gc3J2LnNvbWVScGNDYWxsKCJ0ZXN0IikpOworICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdE11bHRpcGxleGVkUHJvY2Vzc29yLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RNdWx0aXBsZXhlZFByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNzc2Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RNdWx0aXBsZXhlZFByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5NYXRjaGVycy5hbnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIFRlc3RNdWx0aXBsZXhlZFByb2Nlc3NvciB7CisgIHByaXZhdGUgVE11bHRpcGxleGVkUHJvY2Vzc29yIG1wOworICBwcml2YXRlIFRQcm90b2NvbCBpcHJvdDsKKyAgcHJpdmF0ZSBUUHJvdG9jb2wgb3Byb3Q7CisKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIG1wID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICAgIGlwcm90ID0gbW9jayhUUHJvdG9jb2wuY2xhc3MpOworICAgIG9wcm90ID0gbW9jayhUUHJvdG9jb2wuY2xhc3MpOworICB9CisKKyAgQFRlc3QoZXhwZWN0ZWQgPSBURXhjZXB0aW9uLmNsYXNzKQorICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdNZXNzYWdlVHlwZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3aGVuIChpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkpLnRoZW5SZXR1cm4obmV3IFRNZXNzYWdlKCJzZXJ2aWNlOmZ1bmMiLCBUTWVzc2FnZVR5cGUuUkVQTFksIDQyKSk7CisgICAgbXAucHJvY2VzcyhpcHJvdCwgb3Byb3QpOworICB9CisKKyAgQFRlc3QoZXhwZWN0ZWQgPSBURXhjZXB0aW9uLmNsYXNzKQorICBwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoU2VydmljZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3aGVuKGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSkudGhlblJldHVybihuZXcgVE1lc3NhZ2UoInNlcnZpY2U6ZnVuYyIsIFRNZXNzYWdlVHlwZS5DQUxMLCA0MikpOworCisgICAgbXAucHJvY2VzcyhpcHJvdCwgb3Byb3QpOworICB9CisKKyAgc3RhdGljIGNsYXNzIFN0dWJQcm9jZXNzb3IgaW1wbGVtZW50cyBUUHJvY2Vzc29yIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzKFRQcm90b2NvbCBpbiwgVFByb3RvY29sIG91dCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgVE1lc3NhZ2UgbXNnID0gaW4ucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgaWYgKCEiZnVuYyIuZXF1YWxzKG1zZy5uYW1lKSB8fCBtc2cudHlwZSE9VE1lc3NhZ2VUeXBlLkNBTEwgfHwgbXNnLnNlcWlkIT00MikgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiaW5jb3JyZWN0IHBhcmFtZXRlcnMiKTsKKyAgICAgIH0KKyAgICAgIG91dC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoImZ1bmMiLCBUTWVzc2FnZVR5cGUuUkVQTFksIDQyKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0RXhpc3RpbmdTZXJ2aWNlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdoZW4oaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpKS50aGVuUmV0dXJuKG5ldyBUTWVzc2FnZSgic2VydmljZTpmdW5jIiwgVE1lc3NhZ2VUeXBlLkNBTEwsIDQyKSk7CisgICAgbXAucmVnaXN0ZXJQcm9jZXNzb3IoInNlcnZpY2UiLCBuZXcgU3R1YlByb2Nlc3NvcigpKTsKKyAgICBtcC5wcm9jZXNzKGlwcm90LCBvcHJvdCk7CisgICAgdmVyaWZ5KG9wcm90KS53cml0ZU1lc3NhZ2VCZWdpbihhbnkoVE1lc3NhZ2UuY2xhc3MpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0U2VydmljZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3aGVuKGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSkudGhlblJldHVybihuZXcgVE1lc3NhZ2UoImZ1bmMiLCBUTWVzc2FnZVR5cGUuQ0FMTCwgNDIpKTsKKyAgICBtcC5yZWdpc3RlckRlZmF1bHQobmV3IFN0dWJQcm9jZXNzb3IoKSk7CisgICAgbXAucHJvY2VzcyhpcHJvdCwgb3Byb3QpOworICAgIHZlcmlmeShvcHJvdCkud3JpdGVNZXNzYWdlQmVnaW4oYW55KFRNZXNzYWdlLmNsYXNzKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0T3B0aW9uVHlwZS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0T3B0aW9uVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MDI4NWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RPcHRpb25UeXBlLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lk9wdGlvbjsKKworLy8gVGVzdHMgYW5kIGRvY3VtZW50cyBiZWhhdmlvciBmb3IgdGhlICJPcHRpb248VD4iIHR5cGUKK3B1YmxpYyBjbGFzcyBUZXN0T3B0aW9uVHlwZSBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U29tZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgbmFtZSA9ICJDaHVjayBOb3JyaXMiOworICAgICAgICBPcHRpb248U3RyaW5nPiBvcHRpb24gPSBPcHRpb24uZnJvbU51bGxhYmxlKG5hbWUpOworCisgICAgICAgIGFzc2VydFRydWUob3B0aW9uIGluc3RhbmNlb2YgT3B0aW9uLlNvbWUpOworICAgICAgICBhc3NlcnRUcnVlKG9wdGlvbi5pc0RlZmluZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiU29tZShDaHVjayBOb3JyaXMpIiwgb3B0aW9uLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMob3B0aW9uLm9yKCJkZWZhdWx0IHZhbHVlIiksICJDaHVjayBOb3JyaXMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9wdGlvbi5nZXQoKSwiQ2h1Y2sgTm9ycmlzIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICBPcHRpb248U3RyaW5nPiBvcHRpb24gPSBPcHRpb24uZnJvbU51bGxhYmxlKG5hbWUpOworCisgICAgICAgIGFzc2VydFRydWUob3B0aW9uIGluc3RhbmNlb2YgT3B0aW9uLk5vbmUpOworICAgICAgICBhc3NlcnRGYWxzZShvcHRpb24uaXNEZWZpbmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk5vbmUiLCBvcHRpb24udG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhvcHRpb24ub3IoImRlZmF1bHQgdmFsdWUiKSwgImRlZmF1bHQgdmFsdWUiKTsKKyAgICAgICAgLy8gRXhwZWN0IGV4Y2VwdGlvbgorICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gb3B0aW9uLmdldCgpOworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBnb3Qgbm8gZXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworCisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIGdvdCBzb21lIG90aGVyIGV4Y2VwdGlvbjogIitleC50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNYWtlU29tZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBPcHRpb248U3RyaW5nPiBzb21lID0gT3B0aW9uLnNvbWUoIndlZSIpOworICAgICAgICBhc3NlcnRUcnVlKHNvbWUgaW5zdGFuY2VvZiBPcHRpb24uU29tZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1ha2VOb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE9wdGlvbjxJbnRlZ2VyPiBub25lID0gT3B0aW9uLm5vbmUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShub25lIGluc3RhbmNlb2YgT3B0aW9uLk5vbmUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdE9wdGlvbmFscy5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0T3B0aW9uYWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1OTFlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdE9wdGlvbmFscy5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IHRocmlmdC50ZXN0Lk9wdDQ7CitpbXBvcnQgdGhyaWZ0LnRlc3QuT3B0MzA7CitpbXBvcnQgdGhyaWZ0LnRlc3QuT3B0NjQ7CitpbXBvcnQgdGhyaWZ0LnRlc3QuT3B0ODA7CisKKy8vIEV4ZXJjaXNlcyB0aGUgaXNTZXQgbWV0aG9kcyB1c2luZyBzdHJ1Y3RzIGZyb20gZnJvbSBNYW55T3B0aW9uYWxzLnRocmlmdAorcHVibGljIGNsYXNzIFRlc3RPcHRpb25hbHMgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGluZ1V0aWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkweDgsIEVuY29kaW5nVXRpbHMuc2V0Qml0KChzaG9ydCkwLCAzLCB0cnVlKSk7CisgICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkwLCBFbmNvZGluZ1V0aWxzLnNldEJpdCgoc2hvcnQpMHg4LCAzLCBmYWxzZSkpOworICAgIGFzc2VydEVxdWFscyh0cnVlLCBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoKHNob3J0KTB4OCwgMykpOworICAgIGFzc2VydEVxdWFscyhmYWxzZSwgRW5jb2RpbmdVdGlscy50ZXN0Qml0KChzaG9ydCkweDgsIDQpKTsKKworICAgIGFzc2VydEVxdWFscygoc2hvcnQpU2hvcnQuTUlOX1ZBTFVFLCBFbmNvZGluZ1V0aWxzLnNldEJpdCgoc2hvcnQpMCwgMTUsIHRydWUpKTsKKyAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTAsIEVuY29kaW5nVXRpbHMuc2V0Qml0KChzaG9ydClTaG9ydC5NSU5fVkFMVUUsIDE1LCBmYWxzZSkpOworICAgIGFzc2VydEVxdWFscyh0cnVlLCBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoU2hvcnQuTUlOX1ZBTFVFLCAxNSkpOworICAgIGFzc2VydEVxdWFscyhmYWxzZSwgRW5jb2RpbmdVdGlscy50ZXN0Qml0KFNob3J0Lk1JTl9WQUxVRSwgMTQpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RPcHQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgT3B0NCB4ID0gbmV3IE9wdDQoKTsKKyAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHguaXNTZXREZWYxKCkpOworICAgIHguc2V0RGVmMSgzKTsKKyAgICBhc3NlcnRFcXVhbHModHJ1ZSwgeC5pc1NldERlZjEoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB4LmlzU2V0RGVmMigpKTsKKworICAgIE9wdDQgY29weSA9IG5ldyBPcHQ0KHgpOworICAgIGFzc2VydEVxdWFscyh0cnVlLCBjb3B5LmlzU2V0RGVmMSgpKTsKKyAgICBjb3B5LnVuc2V0RGVmMSgpOworICAgIGFzc2VydEVxdWFscyhmYWxzZSwgY29weS5pc1NldERlZjEoKSk7CisgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHguaXNTZXREZWYxKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE9wdDMwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgT3B0MzAgeCA9IG5ldyBPcHQzMCgpOworICAgIGFzc2VydEVxdWFscyhmYWxzZSwgeC5pc1NldERlZjEoKSk7CisgICAgeC5zZXREZWYxKDMpOworICAgIGFzc2VydEVxdWFscyh0cnVlLCB4LmlzU2V0RGVmMSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHguaXNTZXREZWYyKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE9wdDY0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgT3B0NjQgeCA9IG5ldyBPcHQ2NCgpOworICAgIGFzc2VydEVxdWFscyhmYWxzZSwgeC5pc1NldERlZjEoKSk7CisgICAgeC5zZXREZWYxKDMpOworICAgIGFzc2VydEVxdWFscyh0cnVlLCB4LmlzU2V0RGVmMSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHguaXNTZXREZWYyKCkpOworICAgIHguc2V0RGVmNjQoMjIpOworICAgIGFzc2VydEVxdWFscyh0cnVlLCB4LmlzU2V0RGVmNjQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB4LmlzU2V0RGVmNjMoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0T3B0ODAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBPcHQ4MCB4ID0gbmV3IE9wdDgwKCk7CisgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB4LmlzU2V0RGVmMSgpKTsKKyAgICB4LnNldERlZjEoMyk7CisgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHguaXNTZXREZWYxKCkpOworICAgIGFzc2VydEVxdWFscyhmYWxzZSwgeC5pc1NldERlZjIoKSk7CisKKyAgICBPcHQ4MCBjb3B5ID0gbmV3IE9wdDgwKHgpOworICAgIGNvcHkudW5zZXREZWYxKCk7CisgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBjb3B5LmlzU2V0RGVmMSgpKTsKKyAgICBhc3NlcnRFcXVhbHModHJ1ZSwgeC5pc1NldERlZjEoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OTFmZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCB0aHJpZnQudGVzdC5Eb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzOworCitwdWJsaWMgY2xhc3MgVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzIGV4dGVuZHMgVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBFUFNJTE9OID0gMC4wMDAwMDAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUID0KKyAgICAgICAgImZhaWxlZCB0byB2ZXJpZnkgYSBkb3VibGUgY29uc3RhbnQgZ2VuZXJhdGVkIGJ5IFRocmlmdCAoZXhwZWN0ZWQgPSAlZiwgZ290ID0gJWYpIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9MSVNUX1RFU1QgPQorICAgICAgICAiZmFpbGVkIHRvIHZlcmlmeSBhIGxpc3QgaXRlbSBieSBUaHJpZnQgKGV4cGVjdGVkID0gJWYsIGdvdCA9ICVmKSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyA9CisgICAgICAgICJ0aGUgcmVuZGVyZWQgdmFyaWFibGUgd2l0aCBuYW1lICVzIGlzIG5vdCBvZiBkb3VibGUgdHlwZSI7CisKKyAgICAvLyB0byBtYWtlIHN1cmUgbGlzdHMgY29udGFpbmluZyBkb3VibGVzIGFyZSBnZW5lcmF0ZWQgY29ycmVjdGx5CisgICAgcHVibGljIHZvaWQgdGVzdFJlbmRlcmVkRG91YmxlTGlzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBkb3VibGVbXSBFWFBFQ1RFRF9MSVNUID0KKyAgICAgICAgICAgIHsxZCwtMTAwZCwxMDBkLDkyMjMzNzIwMzY4NTQ3NzU4MDdkLC05MjIzMzcyMDM2ODU0Nzc1ODA3ZCwzLjE0MTU5MjY1MzU5LDEwMDAwMDAuMSwtMTAwMDAwMC4xLDEuN2UrMzA4LAorICAgICAgICAgICAgIC0xLjdlKzMwOCw5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzLC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzfTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX0xJU1QubGVuZ3RoLCBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9MSVNUX1RFU1Quc2l6ZSgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFWFBFQ1RFRF9MSVNULmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9MSVNUX1RFU1QsCisgICAgICAgICAgICAgICAgICAgIEVYUEVDVEVEX0xJU1RbaV0sCisgICAgICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0xJU1RfVEVTVC5nZXQoaSkpLAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0xJU1RbaV0sIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0xJU1RfVEVTVC5nZXQoaSksIEVQU0lMT04pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gdG8gbWFrZSBzdXJlIHRoZSB2YXJpYWJsZXMgaW5zaWRlIFRocmlmdCBmaWxlcyBhcmUgZ2VuZXJhdGVkIGNvcnJlY3RseQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCA9IDEuMDsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQgPSAtMTAwLjA7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3LjA7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDcuMDsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTID0gMy4xNDE1OTI2NTM1OTsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSA9IDEwMDAwMDAuMTsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSA9IC0xMDAwMDAwLjE7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFID0gMS43ZSszMDg7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgPSA5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzOworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSA9IC0xLjdlKzMwODsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgPSAtOTIyMzM3MjAzNjg1NDc3NTgxNi40MzsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTLAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFLAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUKSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNUKSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUKSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUKSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSk7CisgICAgICAgIC8vYXNzZXJ0VHJ1ZSgKKyAgICAgICAgLy8gICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QiKSwKKyAgICAgICAgLy8gICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKTsKKyAgICAgICAgLy9hc3NlcnRUcnVlKAorICAgICAgICAvLyAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCIpLAorICAgICAgICAvLyAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0UmV1c2UuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFJldXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ0YWJkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFJldXNlLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2w7CisKK2ltcG9ydCB0aHJpZnQudGVzdC5SZXVzZTsKKworLy8gVGVzdHMgcmV1c2luZyBvYmplY3RzIGZvciBkZXNlcmlhbGl6YXRpb24uCisvLworcHVibGljIGNsYXNzIFRlc3RSZXVzZSBleHRlbmRzIFRlc3RTdHJ1Y3QgeworCisgIHB1YmxpYyB2b2lkIHRlc3RSZXVzZU9iamVjdCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRTZXJpYWxpemVyICAgYmluYXJ5U2VyaWFsaXplciAgID0gbmV3ICAgVFNlcmlhbGl6ZXIobmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCkpOworICAgIFREZXNlcmlhbGl6ZXIgYmluYXJ5RGVzZXJpYWxpemVyID0gbmV3IFREZXNlcmlhbGl6ZXIobmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCkpOworCisgICAgUmV1c2UgcnUxID0gbmV3IFJldXNlKCk7CisgICAgSGFzaFNldDxTdHJpbmc+IGhzMSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBieXRlW10gc2VyQnl0ZXM7ICAgIAorICAgIFN0cmluZyBzdDEgPSBuZXcgU3RyaW5nKCJzdHJpbmcxIik7CisgICAgU3RyaW5nIHN0MiA9IG5ldyBTdHJpbmcoInN0cmluZzIiKTsKKworICAgIHJ1MS5zZXRWYWwxKDExKTsKKyAgICBydTEuc2V0VmFsMihoczEpOworICAgIHJ1MS5hZGRUb1ZhbDIoc3QxKTsKKyAgICAKKyAgICBzZXJCeXRlcyA9IGJpbmFyeVNlcmlhbGl6ZXIuc2VyaWFsaXplKHJ1MSk7CisKKyAgICAvLyB1cGRhdGUgaGFzaCBzZXQgYWZ0ZXIgc2VyaWFsaXphdGlvbgorICAgIGhzMS5hZGQoc3QyKTsKKworICAgIGJpbmFyeURlc2VyaWFsaXplci5kZXNlcmlhbGl6ZShydTEsIHNlckJ5dGVzKTsKKyAgIAorICAgIGFzc2VydFRydWUoIHJ1MS5nZXRWYWwyKCkgPT0gaHMxICk7CisgICAgYXNzZXJ0VHJ1ZSggaHMxLnNpemUoKSA9PSAyICk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0U2hvcnRTdGFjay5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0U2hvcnRTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzgzMWU1Li4wMDAwMDAwCi0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFNob3J0U3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwotCi1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgVGVzdFNob3J0U3RhY2sgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fVFJJQUxTID0gNTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9SRVBTID0gMTAwMDAwMDA7Ci0KLSAgcHVibGljIHZvaWQgdGVzdE9wcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFNob3J0U3RhY2sgcyA9IG5ldyBTaG9ydFN0YWNrKDEwKTsKLSAgICBzLnB1c2goKHNob3J0KTEwKTsKLSAgICBzLnB1c2goKHNob3J0KTExKTsKLSAgICBzLnB1c2goKHNob3J0KTEyKTsKLSAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTEyLCBzLnBlZWsoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMiwgcy5wZWVrKCkpOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTIsIHMucG9wKCkpOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTEsIHMucG9wKCkpOwotICAgIHMucHVzaCgoc2hvcnQpNDApOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpNDAsIHMucGVlaygpKTsKLSAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTQwLCBzLnBvcCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTEwLCBzLnBlZWsoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMCwgcy5wb3AoKSk7Ci0gICAgdHJ5IHsKLSAgICAgIHMucGVlaygpOwotICAgICAgZmFpbCgic2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiEiKTsKLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgLy8geWF5Ci0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIHMucG9wKCk7Ci0gICAgICBmYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uISIpOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyB5YXkKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0R3JvdygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFNob3J0U3RhY2sgcyA9IG5ldyBTaG9ydFN0YWNrKDEpOwotICAgIHMucHVzaCgoc2hvcnQpMSk7Ci0gICAgcy5wdXNoKChzaG9ydCkxKTsKLSAgICBzLnB1c2goKHNob3J0KTEpOwotICAgIHMucHVzaCgoc2hvcnQpMSk7Ci0gICAgcy5wdXNoKChzaG9ydCkxKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgIGZvciAoaW50IHRyaWFsID0gMDsgdHJpYWwgPCBOVU1fVFJJQUxTOyB0cmlhbCsrKSB7Ci0gICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICBTaG9ydFN0YWNrIHMgPSBuZXcgU2hvcnRTdGFjaygxMCk7Ci0gICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCBOVU1fUkVQUzsgcmVwKyspIHsKLSAgICAgICAgcy5wdXNoKChzaG9ydCkxKTsKLSAgICAgICAgcy5wdXNoKChzaG9ydCkxMSk7Ci0gICAgICAgIHMucHVzaCgoc2hvcnQpMTExKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wdXNoKChzaG9ydCkxMik7Ci0gICAgICAgIHMucHVzaCgoc2hvcnQpMTIxKTsKLSAgICAgICAgcy5wdXNoKChzaG9ydCkxMjExKTsKLSAgICAgICAgcy5wdXNoKChzaG9ydCkxMjExMSk7Ci0gICAgICAgIHMucG9wKCk7Ci0gICAgICAgIHMucG9wKCk7Ci0gICAgICAgIHMucG9wKCk7Ci0gICAgICAgIHMucG9wKCk7Ci0gICAgICAgIHMucHVzaCgoc2hvcnQpNSk7Ci0gICAgICAgIHMucG9wKCk7Ci0gICAgICAgIHMucG9wKCk7Ci0gICAgICB9Ci0gICAgICBsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTaG9ydFN0YWNrOiAiICsgKGVuZC1zdGFydCkpOwotCi0gICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgU3RhY2s8U2hvcnQ+IHN0ZFN0YWNrID0gbmV3IFN0YWNrPFNob3J0PigpOwotICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgTlVNX1JFUFM7IHJlcCsrKSB7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTEpOwotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCkxMSk7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTExMSk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgICBzdGRTdGFjay5wb3AoKTsKLSAgICAgICAgc3RkU3RhY2sucHVzaCgoc2hvcnQpMTIpOwotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCkxMjEpOwotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCkxMjExKTsKLSAgICAgICAgc3RkU3RhY2sucHVzaCgoc2hvcnQpMTIxMTEpOwotICAgICAgICBzdGRTdGFjay5wb3AoKTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgICBzdGRTdGFjay5wb3AoKTsKLSAgICAgICAgc3RkU3RhY2sucHVzaCgoc2hvcnQpNSk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgICBzdGRTdGFjay5wb3AoKTsKLSAgICAgIH0KLSAgICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJCdWlsdC1pbiBzdGFjazogIiArIChlbmQtc3RhcnQpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFN0cnVjdC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0U3RydWN0LmphdmEKaW5kZXggNjExNjJkOS4uMzM3OWVkMSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0U3RydWN0LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0U3RydWN0LmphdmEKQEAgLTIyLDcgKzIyLDYgQEAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtNDUsNiArNDQsOCBAQAogaW1wb3J0IHRocmlmdC50ZXN0Lk5lc3Rpbmc7CiBpbXBvcnQgdGhyaWZ0LnRlc3QuTnVtYmVyejsKIGltcG9ydCB0aHJpZnQudGVzdC5PbmVPZkVhY2g7CitpbXBvcnQgdGhyaWZ0LnRlc3QuU3RydWN0QTsKK2ltcG9ydCB0aHJpZnQudGVzdC5TdHJ1Y3RCOwogaW1wb3J0IHRocmlmdC50ZXN0Llh0cnVjdDsKIAogcHVibGljIGNsYXNzIFRlc3RTdHJ1Y3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CkBAIC0zMDcsMTIgKzMwOCw0MCBAQAogICAgICAgICBvYmplY3QudG9TdHJpbmcoKSk7CiAgIH0KIAorICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEFycmF5RXF1YWxzKGJ5dGVbXSBleHBlY3RlZCwgYnl0ZVtdIGFjdHVhbCkgeworICAgIGlmICghamF2YS51dGlsLkFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpIHsKKyAgICAgIGZhaWwoIkV4cGVjdGVkIGJ5dGUgYXJyYXkgZGlkIG5vdCBtYXRjaCBhY3R1YWwuIik7CisgICAgfQorICB9CisKICAgcHVibGljIHZvaWQgdGVzdEJ5dGVzQnVmZmVyRmVhdHVyZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBKYXZhVGVzdEhlbHBlciBvID0gbmV3IEphdmFUZXN0SGVscGVyKCk7CisgICAgCisgICAgZmluYWwgU3RyaW5nIHRlc3RTdHJpbmcgPSAidGVzdEJ5dGVzQnVmZmVyRmVhdHVyZXMiOworICAgIGZpbmFsIEphdmFUZXN0SGVscGVyIG8gPSBuZXcgSmF2YVRlc3RIZWxwZXIoKTsKKwogICAgIG8uc2V0UmVxX2JpbigoQnl0ZUJ1ZmZlciludWxsKTsKICAgICBhc3NlcnROdWxsKG8uZ2V0UmVxX2JpbigpKTsKKworICAgIG8uc2V0UmVxX2JpbihCeXRlQnVmZmVyLndyYXAodGVzdFN0cmluZy5nZXRCeXRlcygpKSk7CisgICAgYXNzZXJ0QXJyYXlFcXVhbHModGVzdFN0cmluZy5nZXRCeXRlcygpLCBvLmdldFJlcV9iaW4oKSk7CisKICAgICBvLnNldFJlcV9iaW4oKGJ5dGVbXSludWxsKTsKICAgICBhc3NlcnROdWxsKG8uZ2V0UmVxX2JpbigpKTsKKworICAgIG8uc2V0UmVxX2Jpbih0ZXN0U3RyaW5nLmdldEJ5dGVzKCkpOworICAgIGFzc2VydEFycmF5RXF1YWxzKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSwgby5nZXRSZXFfYmluKCkpOworCisgICAgby5zZXRGaWVsZFZhbHVlKEphdmFUZXN0SGVscGVyLl9GaWVsZHMuUkVRX0JJTiwgbnVsbCk7CisgICAgYXNzZXJ0TnVsbChvLmdldFJlcV9iaW4oKSk7CisKKyAgICBvLnNldEZpZWxkVmFsdWUoSmF2YVRlc3RIZWxwZXIuX0ZpZWxkcy5SRVFfQklOLCB0ZXN0U3RyaW5nLmdldEJ5dGVzKCkpOworICAgIGFzc2VydEFycmF5RXF1YWxzKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSwgby5nZXRSZXFfYmluKCkpOworCisgICAgby5zZXRGaWVsZFZhbHVlKEphdmFUZXN0SGVscGVyLl9GaWVsZHMuUkVRX0JJTiwgbnVsbCk7CisgICAgYXNzZXJ0TnVsbChvLmdldFJlcV9iaW4oKSk7CisKKyAgICBvLnNldEZpZWxkVmFsdWUoSmF2YVRlc3RIZWxwZXIuX0ZpZWxkcy5SRVFfQklOLCBCeXRlQnVmZmVyLndyYXAodGVzdFN0cmluZy5nZXRCeXRlcygpKSk7CisgICAgYXNzZXJ0QXJyYXlFcXVhbHModGVzdFN0cmluZy5nZXRCeXRlcygpLCBvLmdldFJlcV9iaW4oKSk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCB0ZXN0SmF2YVNlcmlhbGl6YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMzMyLDQgKzM2MSwzNiBAQAogCiAgICAgYXNzZXJ0RXF1YWxzKG9vZSwgb29lMik7CiAgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U3ViU3RydWN0VmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgIFN0cnVjdEEgdmFsaWQgPSBuZXcgU3RydWN0QSgidmFsaWQiKTsKKyAgICBTdHJ1Y3RBIGludmFsaWQgPSBuZXcgU3RydWN0QSgpOworCisgICAgU3RydWN0QiBiID0gbmV3IFN0cnVjdEIoKTsKKyAgICB0cnkgeworICAgICAgYi52YWxpZGF0ZSgpOworICAgICAgZmFpbCgpOworICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgeworICAgICAgLy8gZXhwZWN0ZWQKKyAgICB9CisKKyAgICBiID0gbmV3IFN0cnVjdEIoKS5zZXRBYih2YWxpZCk7CisgICAgYi52YWxpZGF0ZSgpOworCisgICAgYiA9IG5ldyBTdHJ1Y3RCKCkuc2V0QWIoaW52YWxpZCk7CisgICAgdHJ5IHsKKyAgICAgIGIudmFsaWRhdGUoKTsKKyAgICAgIGZhaWwoKTsKKyAgICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIGV4cGVjdGVkCisgICAgfQorCisgICAgYiA9IG5ldyBTdHJ1Y3RCKCkuc2V0QWIodmFsaWQpLnNldEFhKGludmFsaWQpOworICAgIHRyeSB7CisgICAgICBiLnZhbGlkYXRlKCk7CisgICAgICBmYWlsKCk7CisgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBleHBlY3RlZAorICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0VEJhc2VIZWxwZXIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFRCYXNlSGVscGVyLmphdmEKaW5kZXggNjM3ODUyNC4uOGIwODU1NSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0VEJhc2VIZWxwZXIuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RUQmFzZUhlbHBlci5qYXZhCkBAIC0xNTUsNiArMTU1LDIzIEBACiAgICAgYXNzZXJ0TnVsbChUQmFzZUhlbHBlci5yaWdodFNpemUobnVsbCkpOwogICB9CiAKKyAgcHVibGljIHZvaWQgdGVzdEJ5dGVCdWZmZXJUb1N0cmluZygpIHsKKyAgICBieXRlW10gYXJyYXkgPSBuZXcgYnl0ZVtdezEsIDIsIDN9OworICAgIEJ5dGVCdWZmZXIgYmIgPSBCeXRlQnVmZmVyLndyYXAoYXJyYXksIDEsIDIpOworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIFRCYXNlSGVscGVyLnRvU3RyaW5nKGJiLCBzYik7CisgICAgYXNzZXJ0RXF1YWxzKCIwMiAwMyIsIHNiLnRvU3RyaW5nKCkpOworICAgIGJiID0gQnl0ZUJ1ZmZlci53cmFwKGFycmF5LCAwLCBhcnJheS5sZW5ndGgpOworICAgIGJiLnBvc2l0aW9uKDEpOworICAgIGJiID0gYmIuc2xpY2UoKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgYmIuYXJyYXlPZmZzZXQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIGJiLnBvc2l0aW9uKCkpOworICAgIGFzc2VydEVxdWFscygyLCBiYi5saW1pdCgpKTsKKyAgICBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgVEJhc2VIZWxwZXIudG9TdHJpbmcoYmIsIHNiKTsKKyAgICBhc3NlcnRFcXVhbHMoIjAyIDAzIiwgc2IudG9TdHJpbmcoKSk7CisgIH0KKwogICBwdWJsaWMgdm9pZCB0ZXN0Q29weUJpbmFyeVdpdGhCeXRlQnVmZmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbXXswLCAxLCAyLCAzLCA0LCA1fTsKICAgICBCeXRlQnVmZmVyIGIgPSBCeXRlQnVmZmVyLndyYXAoYnl0ZXMpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0VFVuaW9uLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RUVW5pb24uamF2YQppbmRleCBiM2QyOTY4Li5mMWU2ZjBlIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RUVW5pb24uamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RUVW5pb24uamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKQEAgLTMzLDYgKzM0LDcgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR1cGxlUHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRNZW1vcnlCdWZmZXI7CiAKIGltcG9ydCB0aHJpZnQudGVzdC5Db21wYXJhYmxlVW5pb247CkBAIC0xNTIsNiArMTU0LDcgQEAKIAogICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgIFRlc3RVbmlvbiB1bmlvbiA9IG5ldyBUZXN0VW5pb24oVGVzdFVuaW9uLl9GaWVsZHMuSTMyX0ZJRUxELCAyNSk7CisgICAgdW5pb24uc2V0STMyX3NldChDb2xsZWN0aW9ucy5zaW5nbGV0b24oNDIpKTsKIAogICAgIFRNZW1vcnlCdWZmZXIgYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoMCk7CiAgICAgVFByb3RvY29sIHByb3RvID0gbmV3IFRCaW5hcnlQcm90b2NvbChidWYpOwpAQCAtMTgzLDYgKzE4Niw0MSBAQAogICAgIHN3YXUud3JpdGUocHJvdG8pOwogICAgIG5ldyBFbXB0eSgpLnJlYWQocHJvdG8pOwogICB9CisgIAorICBwdWJsaWMgdm9pZCB0ZXN0VHVwbGVQcm90b2NvbFNlcmlhbGl6YXRpb24gKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdFVuaW9uIHVuaW9uID0gbmV3IFRlc3RVbmlvbihUZXN0VW5pb24uX0ZpZWxkcy5JMzJfRklFTEQsIDI1KTsKKyAgICB1bmlvbi5zZXRJMzJfc2V0KENvbGxlY3Rpb25zLnNpbmdsZXRvbig0MikpOworCisgICAgVE1lbW9yeUJ1ZmZlciBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcigwKTsKKyAgICBUUHJvdG9jb2wgcHJvdG8gPSBuZXcgVFR1cGxlUHJvdG9jb2woYnVmKTsKKworICAgIHVuaW9uLndyaXRlKHByb3RvKTsKKworICAgIFRlc3RVbmlvbiB1MiA9IG5ldyBUZXN0VW5pb24oKTsKKworICAgIHUyLnJlYWQocHJvdG8pOworCisgICAgYXNzZXJ0RXF1YWxzKHUyLCB1bmlvbik7CisKKyAgICBTdHJ1Y3RXaXRoQVVuaW9uIHN3YXUgPSBuZXcgU3RydWN0V2l0aEFVbmlvbih1Mik7CisKKyAgICBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcigwKTsKKyAgICBwcm90byA9IG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmKTsKKworICAgIHN3YXUud3JpdGUocHJvdG8pOworCisgICAgU3RydWN0V2l0aEFVbmlvbiBzd2F1MiA9IG5ldyBTdHJ1Y3RXaXRoQVVuaW9uKCk7CisgICAgYXNzZXJ0RmFsc2Uoc3dhdTIuZXF1YWxzKHN3YXUpKTsKKyAgICBzd2F1Mi5yZWFkKHByb3RvKTsKKyAgICBhc3NlcnRFcXVhbHMoc3dhdTIsIHN3YXUpOworCisgICAgLy8gdGhpcyBzaG91bGQgTk9UIHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgICBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcigwKTsKKyAgICBwcm90byA9IG5ldyBUVHVwbGVQcm90b2NvbChidWYpOworCisgICAgc3dhdS53cml0ZShwcm90byk7CisgICAgbmV3IEVtcHR5KCkucmVhZChwcm90byk7CisgIH0KIAogICBwdWJsaWMgdm9pZCB0ZXN0U2tpcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgIFRlc3RVbmlvbiB0dSA9IFRlc3RVbmlvbi5zdHJpbmdfZmllbGQoInN0cmluZyIpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0VW5zYWZlQmluYXJpZXMuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFVuc2FmZUJpbmFyaWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFmYzIxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFVuc2FmZUJpbmFyaWVzLmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IHRocmlmdC50ZXN0LlNhZmVCeXRlczsKK2ltcG9ydCB0aHJpZnQudGVzdC5VbnNhZmVCeXRlczsKKworLy8gIHRlc3QgZ2VuZXJhdGluZyB0eXBlcyB3aXRoIHVuLWNvcGllZCBieXRlW10vQnl0ZUJ1ZmZlciBpbnB1dC9vdXRwdXQKKy8vCitwdWJsaWMgY2xhc3MgVGVzdFVuc2FmZUJpbmFyaWVzIGV4dGVuZHMgVGVzdFN0cnVjdCB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGlucHV0KCkgeworICAgIHJldHVybiBuZXcgYnl0ZVtdezEsIDF9OworICB9CisKKyAgLy8KKyAgLy8gIHZlcmlmeSB0aGF0IHRoZSB1bnNhZmVfYmluYXJpZXMgb3B0aW9uIG1vZGlmaWVzIGJlaGF2aW9yCisgIC8vCisKKyAgLy8gIGNvbnN0cnVjdG9yIGRvZXNuJ3QgY29weQorICBwdWJsaWMgdm9pZCB0ZXN0VW5zYWZlQ29uc3RydWN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgIGJ5dGVbXSBpbnB1dCA9IGlucHV0KCk7CisgICAgVW5zYWZlQnl0ZXMgc3RydWN0ID0gbmV3IFVuc2FmZUJ5dGVzKEJ5dGVCdWZmZXIud3JhcChpbnB1dCkpOworCisgICAgaW5wdXRbMF0gPSAyOworCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICBuZXcgYnl0ZVtdezIsIDF9LAorICAgICAgICBzdHJ1Y3QuZ2V0Qnl0ZXMoKSkKKyAgICApOworCisgIH0KKworICAvLyAgZ2V0dGVyIGRvZXNuJ3QgY29weQorICAvLyAgbm90ZTogdGhpcyBiZWhhdmlvciBpcyB0aGUgc2FtZSB3aXRoL3dpdGhvdXQgdGhlIGZsYWcsIGJ1dCBpZiB0aGlzIGRlZmF1bHQgZXZlciBjaGFuZ2VzLCB0aGUgY3VycmVudCBiZWhhdmlvcgorICAvLyAgICAgICAgc2hvdWxkIGJlIHJldGFpbmVkIHdoZW4gdXNpbmcgdGhpcyBmbGFnCisgIHB1YmxpYyB2b2lkIHRlc3RVbnNhZmVHZXR0ZXIoKXsKKyAgICBVbnNhZmVCeXRlcyBzdHJ1Y3QgPSBuZXcgVW5zYWZlQnl0ZXMoQnl0ZUJ1ZmZlci53cmFwKGlucHV0KCkpKTsKKworICAgIGJ5dGVbXSB2YWwgPSBzdHJ1Y3QuZ2V0Qnl0ZXMoKTsKKyAgICB2YWxbMF0gPSAyOworCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICBuZXcgYnl0ZVtdezIsIDF9LAorICAgICAgICBzdHJ1Y3QuZ2V0Qnl0ZXMoKSkKKyAgICApOworCisgIH0KKworICAvLyAgc2V0dGVyIGRvZXNuJ3QgY29weQorICBwdWJsaWMgdm9pZCB0ZXN0VW5zYWZlU2V0dGVyKCl7CisgICAgVW5zYWZlQnl0ZXMgc3RydWN0ID0gbmV3IFVuc2FmZUJ5dGVzKCk7CisKKyAgICBieXRlW10gdmFsID0gaW5wdXQoKTsKKyAgICBzdHJ1Y3Quc2V0Qnl0ZXModmFsKTsKKworICAgIHZhbFswXSA9IDI7CisKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCisgICAgICAgIG5ldyBieXRlW117MiwgMX0sCisgICAgICAgIHN0cnVjdC5nZXRCeXRlcygpKQorICAgICk7CisKKyAgfQorCisgIC8vICBidWZmZXIgZG9lbnMndCBjb3B5CisgIHB1YmxpYyB2b2lkIHRlc3RVbnNhZmVCdWZmZXJGb3IoKXsKKyAgICBVbnNhZmVCeXRlcyBzdHJ1Y3QgPSBuZXcgVW5zYWZlQnl0ZXMoQnl0ZUJ1ZmZlci53cmFwKGlucHV0KCkpKTsKKworICAgIEJ5dGVCdWZmZXIgdmFsID0gc3RydWN0LmJ1ZmZlckZvckJ5dGVzKCk7CisgICAgdmFsLmFycmF5KClbMF0gPSAyOworCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICBuZXcgYnl0ZVtdezIsIDF9LAorICAgICAgICBzdHJ1Y3QuZ2V0Qnl0ZXMoKSkKKyAgICApOworCisgIH0KKworICAvLworICAvLyAgdmVyaWZ5IHRoYXQgdGhlIGRlZmF1bHQgZ2VuZXJhdG9yIGRvZXMgbm90IGNoYW5nZSBiZWhhdmlvcgorICAvLworCisgIHB1YmxpYyB2b2lkIHRlc3RTYWZlQ29uc3RydWN0b3IoKSB7CisKKyAgICBieXRlW10gaW5wdXQgPSBpbnB1dCgpOworICAgIFNhZmVCeXRlcyBzdHJ1Y3QgPSBuZXcgU2FmZUJ5dGVzKEJ5dGVCdWZmZXIud3JhcChpbnB1dCkpOworCisgICAgaW5wdXRbMF0gPSAyOworCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICBuZXcgYnl0ZVtdezEsIDF9LAorICAgICAgICBzdHJ1Y3QuZ2V0Qnl0ZXMoKSkKKyAgICApOworCisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2FmZVNldHRlcigpIHsKKworICAgIGJ5dGVbXSBpbnB1dCA9IGlucHV0KCk7CisgICAgU2FmZUJ5dGVzIHN0cnVjdCA9IG5ldyBTYWZlQnl0ZXMoQnl0ZUJ1ZmZlci53cmFwKGlucHV0KSk7CisKKyAgICBpbnB1dFswXSA9IDI7CisKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCisgICAgICAgIG5ldyBieXRlW117MSwgMX0sCisgICAgICAgIHN0cnVjdC5nZXRCeXRlcygpKQorICAgICk7CisKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTYWZlQnVmZmVyRm9yKCl7CisgICAgU2FmZUJ5dGVzIHN0cnVjdCA9IG5ldyBTYWZlQnl0ZXMoQnl0ZUJ1ZmZlci53cmFwKGlucHV0KCkpKTsKKworICAgIEJ5dGVCdWZmZXIgdmFsID0gc3RydWN0LmJ1ZmZlckZvckJ5dGVzKCk7CisgICAgdmFsLmFycmF5KClbMF0gPSAyOworCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICBuZXcgYnl0ZVtdezEsIDF9LAorICAgICAgICBzdHJ1Y3QuZ2V0Qnl0ZXMoKSkKKyAgICApOworCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UZXN0VEFzeW5jQ2xpZW50TWFuYWdlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UZXN0VEFzeW5jQ2xpZW50TWFuYWdlci5qYXZhCmluZGV4IGQ4OGI4YTUuLmM0ODNjZjIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVGVzdFRBc3luY0NsaWVudE1hbmFnZXIuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1Rlc3RUQXN5bmNDbGllbnRNYW5hZ2VyLmphdmEKQEAgLTIyLDExICsyMiwxMyBAQAogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKQEAgLTM5LDEyICs0MSw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1NvY2tldDsKIAogaW1wb3J0IHRocmlmdC50ZXN0LkNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Q7CitpbXBvcnQgdGhyaWZ0LnRlc3QuRXhjZXB0aW9uV2l0aEFNYXA7CiBpbXBvcnQgdGhyaWZ0LnRlc3QuU3J2OwogaW1wb3J0IHRocmlmdC50ZXN0LlNydi5JZmFjZTsKLWltcG9ydCB0aHJpZnQudGVzdC5TcnYuQXN5bmNDbGllbnQuSmFua3lfY2FsbDsKLWltcG9ydCB0aHJpZnQudGVzdC5TcnYuQXN5bmNDbGllbnQub25ld2F5TWV0aG9kX2NhbGw7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuU3J2LkFzeW5jQ2xpZW50LnByaW1pdGl2ZU1ldGhvZF9jYWxsOwotaW1wb3J0IHRocmlmdC50ZXN0LlNydi5Bc3luY0NsaWVudC52b2lkTWV0aG9kX2NhbGw7CiAKIHB1YmxpYyBjbGFzcyBUZXN0VEFzeW5jQ2xpZW50TWFuYWdlciBleHRlbmRzIFRlc3RDYXNlIHsKIApAQCAtNTMsNyArNTIsOSBAQAogICBwcml2YXRlIFRBc3luY0NsaWVudE1hbmFnZXIgY2xpZW50TWFuYWdlcl87CiAKICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBzZXJ2ZXJfID0gbmV3IFRIc0hhU2VydmVyKG5ldyBBcmdzKG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoU2VydmVyVGVzdEJhc2UuUE9SVCkpLnByb2Nlc3NvcihuZXcgU3J2LlByb2Nlc3NvcihuZXcgU3J2SGFuZGxlcigpKSkpOworICAgIHNlcnZlcl8gPSBuZXcgVEhzSGFTZXJ2ZXIobmV3IEFyZ3MobmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldCgKKyAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuTm9uYmxvY2tpbmdBYnN0cmFjdFNlcnZlclNvY2tldEFyZ3MoKS5wb3J0KFNlcnZlclRlc3RCYXNlLlBPUlQpKSkuCisgICAgICBwcm9jZXNzb3IobmV3IFNydi5Qcm9jZXNzb3IobmV3IFNydkhhbmRsZXIoKSkpKTsKICAgICBzZXJ2ZXJUaHJlYWRfID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CiAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgIHNlcnZlcl8uc2VydmUoKTsKQEAgLTc5LDgyICs4MCwxMzYgQEAKICAgICBTcnYuQXN5bmNDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CiAgICAgY2xpZW50LnNldFRpbWVvdXQoNTAwMCk7CiAgICAgYmFzaWNDYWxsKGNsaWVudCk7Ci0gIH0gCi0gIAorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRXJyb3JDYWxsVGVzdDxDIGV4dGVuZHMgVEFzeW5jQ2xpZW50LCBSPiB7CisgICAgZmluYWwgdm9pZCBydW5UZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxFeGNlcHRpb24+IGVycm9yID0gbmV3IEF0b21pY1JlZmVyZW5jZTxFeGNlcHRpb24+KCk7CisgICAgICBDIGNsaWVudCA9IGV4ZWN1dGVFcnJvcmluZ0NhbGwobmV3IEFzeW5jTWV0aG9kQ2FsbGJhY2s8Uj4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKFIgcmVzcG9uc2UpIHsKKyAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICBlcnJvci5zZXQoZXhjZXB0aW9uKTsKKyAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBsYXRjaC5hd2FpdCgyLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgIGFzc2VydFRydWUoY2xpZW50Lmhhc0Vycm9yKCkpOworICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IGVycm9yLmdldCgpOworICAgICAgYXNzZXJ0Tm90TnVsbChleGNlcHRpb24pOworICAgICAgYXNzZXJ0U2FtZShleGNlcHRpb24sIGNsaWVudC5nZXRFcnJvcigpKTsKKyAgICAgIHZhbGlkYXRlRXJyb3IoY2xpZW50LCBleGNlcHRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIGEgY2FsbCB0aGF0IGlzIGV4cGVjdGVkIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgdGVzdGluZyBjYWxsYmFjayB0aGF0IHNob3VsZCBiZSBpbnN0YWxsZWQuCisgICAgICogQHJldHVybiBUaGUgY2xpZW50IHRoZSBjYWxsIHdhcyBtYWRlIGFnYWluc3QuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGEgcHJvYmxlbSBzZXR0aW5nIHVwIHRoZSBjbGllbnQgb3IgbWFraW5nIHRoZSBjYWxsLgorICAgICAqLworICAgIGFic3RyYWN0IEMgZXhlY3V0ZUVycm9yaW5nQ2FsbChBc3luY01ldGhvZENhbGxiYWNrPFI+IGNhbGxiYWNrKSB0aHJvd3MgRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogRnVydGhlciB2YWxpZGF0ZXMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGVycm9yIHJhaXNlZCBpbiB0aGUgcmVtb3RlIGNhbGwgYW5kIHRoZSBzdGF0ZSBvZiB0aGUKKyAgICAgKiBjbGllbnQgYWZ0ZXIgdGhhdCBjYWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGNsaWVudCBUaGUgY2xpZW50IHJldHVybmVkIGZyb20ge0BsaW5rICNleGVjdXRlRXJyb3JpbmdDYWxsKEFzeW5jTWV0aG9kQ2FsbGJhY2spfS4KKyAgICAgKiBAcGFyYW0gZXJyb3IgVGhlIGV4Y2VwdGlvbiByYWlzZWQgYnkgdGhlIHJlbW90ZSBjYWxsLgorICAgICAqLworICAgIGFic3RyYWN0IHZvaWQgdmFsaWRhdGVFcnJvcihDIGNsaWVudCwgRXhjZXB0aW9uIGVycm9yKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RVbmV4cGVjdGVkUmVtb3RlRXhjZXB0aW9uQ2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIG5ldyBFcnJvckNhbGxUZXN0PFNydi5Bc3luY0NsaWVudCwgQm9vbGVhbj4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIFNydi5Bc3luY0NsaWVudCBleGVjdXRlRXJyb3JpbmdDYWxsKEFzeW5jTWV0aG9kQ2FsbGJhY2s8Qm9vbGVhbj4gY2FsbGJhY2spIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTcnYuQXN5bmNDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CisgICAgICAgIGNsaWVudC5kZWNsYXJlZEV4Y2VwdGlvbk1ldGhvZChmYWxzZSwgY2FsbGJhY2spOworICAgICAgICByZXR1cm4gY2xpZW50OworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHZvaWQgdmFsaWRhdGVFcnJvcihTcnYuQXN5bmNDbGllbnQgY2xpZW50LCBFeGNlcHRpb24gZXJyb3IpIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc1RpbWVvdXQoKSk7CisgICAgICAgIGFzc2VydFRydWUoZXJyb3IgaW5zdGFuY2VvZiBURXhjZXB0aW9uKTsKKyAgICAgIH0KKyAgICB9LnJ1blRlc3QoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REZWNsYXJlZFJlbW90ZUV4Y2VwdGlvbkNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBuZXcgRXJyb3JDYWxsVGVzdDxTcnYuQXN5bmNDbGllbnQsIEJvb2xlYW4+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBTcnYuQXN5bmNDbGllbnQgZXhlY3V0ZUVycm9yaW5nQ2FsbChBc3luY01ldGhvZENhbGxiYWNrPEJvb2xlYW4+IGNhbGxiYWNrKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOworICAgICAgICBjbGllbnQuZGVjbGFyZWRFeGNlcHRpb25NZXRob2QodHJ1ZSwgY2FsbGJhY2spOworICAgICAgICByZXR1cm4gY2xpZW50OworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHZvaWQgdmFsaWRhdGVFcnJvcihTcnYuQXN5bmNDbGllbnQgY2xpZW50LCBFeGNlcHRpb24gZXJyb3IpIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc1RpbWVvdXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhFeGNlcHRpb25XaXRoQU1hcC5jbGFzcywgZXJyb3IuZ2V0Q2xhc3MoKSk7CisgICAgICAgIEV4Y2VwdGlvbldpdGhBTWFwIGV4Y2VwdGlvbldpdGhBTWFwID0gKEV4Y2VwdGlvbldpdGhBTWFwKSBlcnJvcjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJibGFoIiwgZXhjZXB0aW9uV2l0aEFNYXAuZ2V0QmxhaCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpLCBleGNlcHRpb25XaXRoQU1hcC5nZXRNYXBfZmllbGQoKSk7CisgICAgICB9CisgICAgfS5ydW5UZXN0KCk7CisgIH0KKwogICBwdWJsaWMgdm9pZCB0ZXN0VGltZW91dENhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKLSAgICBTcnYuQXN5bmNDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7Ci0gICAgY2xpZW50LnNldFRpbWVvdXQoMTAwKTsKLSAgICBjbGllbnQucHJpbWl0aXZlTWV0aG9kKG5ldyBBc3luY01ldGhvZENhbGxiYWNrPHByaW1pdGl2ZU1ldGhvZF9jYWxsPigpIHsKKyAgICBuZXcgRXJyb3JDYWxsVGVzdDxTcnYuQXN5bmNDbGllbnQsIEludGVnZXI+KCkgewogICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBpZiAoIShleGNlcHRpb24gaW5zdGFuY2VvZiBUaW1lb3V0RXhjZXB0aW9uKSkgewotICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHNpbmsgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICBleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzaW5rLCB0cnVlKSk7Ci0gICAgICAgICAgICBmYWlsKCJleHBlY3RlZCBUaW1lb3V0RXhjZXB0aW9uIGJ1dCBnb3QgIiArIHNpbmsudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwotICAgICAgICB9CisgICAgICBTcnYuQXN5bmNDbGllbnQgZXhlY3V0ZUVycm9yaW5nQ2FsbChBc3luY01ldGhvZENhbGxiYWNrPEludGVnZXI+IGNhbGxiYWNrKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOworICAgICAgICBjbGllbnQuc2V0VGltZW91dCgxMDApOworICAgICAgICBjbGllbnQucHJpbWl0aXZlTWV0aG9kKGNhbGxiYWNrKTsKKyAgICAgICAgcmV0dXJuIGNsaWVudDsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUocHJpbWl0aXZlTWV0aG9kX2NhbGwgcmVzcG9uc2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBmYWlsKCJTaG91bGQgbm90IGhhdmUgZmluaXNoZWQgdGltZWQgb3V0IGNhbGwuIik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgbGF0Y2guY291bnREb3duKCk7Ci0gICAgICAgIH0KKyAgICAgIHZvaWQgdmFsaWRhdGVFcnJvcihTcnYuQXN5bmNDbGllbnQgY2xpZW50LCBFeGNlcHRpb24gZXJyb3IpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjbGllbnQuaGFzVGltZW91dCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlcnJvciBpbnN0YW5jZW9mIFRpbWVvdXRFeGNlcHRpb24pOwogICAgICAgfQotICAgIH0pOwotICAgIGxhdGNoLmF3YWl0KDIsIFRpbWVVbml0LlNFQ09ORFMpOwotICAgIGFzc2VydFRydWUoY2xpZW50Lmhhc0Vycm9yKCkpOwotICAgIGFzc2VydFRydWUoY2xpZW50LmdldEVycm9yKCkgaW5zdGFuY2VvZiBUaW1lb3V0RXhjZXB0aW9uKTsKLSAgfSAKLSAgCisgICAgfS5ydW5UZXN0KCk7CisgIH0KKwogICBwdWJsaWMgdm9pZCB0ZXN0Vm9pZENhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKICAgICBmaW5hbCBBdG9taWNCb29sZWFuIHJldHVybmVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOwogICAgIFNydi5Bc3luY0NsaWVudCBjbGllbnQgPSBnZXRDbGllbnQoKTsKLSAgICBjbGllbnQudm9pZE1ldGhvZChuZXcgRmFpbHVyZUxlc3NDYWxsYmFjazxTcnYuQXN5bmNDbGllbnQudm9pZE1ldGhvZF9jYWxsPigpIHsKKyAgICBjbGllbnQudm9pZE1ldGhvZChuZXcgRmFpbHVyZUxlc3NDYWxsYmFjazxWb2lkPigpIHsKICAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZSh2b2lkTWV0aG9kX2NhbGwgcmVzcG9uc2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICByZXNwb25zZS5nZXRSZXN1bHQoKTsKLSAgICAgICAgICByZXR1cm5lZC5zZXQodHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgewotICAgICAgICAgIGZhaWwoZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgbGF0Y2guY291bnREb3duKCk7Ci0gICAgICAgIH0KKyAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoVm9pZCByZXNwb25zZSkgeworICAgICAgICByZXR1cm5lZC5zZXQodHJ1ZSk7CisgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwogICAgICAgfQogICAgIH0pOwogICAgIGxhdGNoLmF3YWl0KDEsIFRpbWVVbml0LlNFQ09ORFMpOwogICAgIGFzc2VydFRydWUocmV0dXJuZWQuZ2V0KCkpOwotICB9IAotICAKKyAgfQorCiAgIHB1YmxpYyB2b2lkIHRlc3RPbmV3YXlDYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CiAgICAgZmluYWwgQXRvbWljQm9vbGVhbiByZXR1cm5lZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKICAgICBTcnYuQXN5bmNDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7Ci0gICAgY2xpZW50Lm9uZXdheU1ldGhvZChuZXcgRmFpbHVyZUxlc3NDYWxsYmFjazxvbmV3YXlNZXRob2RfY2FsbD4oKSB7CisgICAgY2xpZW50Lm9uZXdheU1ldGhvZChuZXcgRmFpbHVyZUxlc3NDYWxsYmFjazxWb2lkPigpIHsKICAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShvbmV3YXlNZXRob2RfY2FsbCByZXNwb25zZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgIHJlc3BvbnNlLmdldFJlc3VsdCgpOwotICAgICAgICAgIHJldHVybmVkLnNldCh0cnVlKTsKLSAgICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgZmFpbChlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgfQorICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShWb2lkIHJlc3BvbnNlKSB7CisgICAgICAgIHJldHVybmVkLnNldCh0cnVlKTsKKyAgICAgICAgbGF0Y2guY291bnREb3duKCk7CiAgICAgICB9CiAgICAgfSk7CiAgICAgbGF0Y2guYXdhaXQoMSwgVGltZVVuaXQuU0VDT05EUyk7CiAgICAgYXNzZXJ0VHJ1ZShyZXR1cm5lZC5nZXQoKSk7Ci0gIH0gCi0gIAorICB9CisKICAgcHVibGljIHZvaWQgdGVzdFBhcmFsbGVsQ2FsbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAvLyBtYWtlIG11bHRpcGxlIGNhbGxzIHdpdGggZGVzZXJpYWxpemF0aW9uIGluIHRoZSBzZWxlY3RvciB0aHJlYWQgKHJlcHJvIEVyaWMncyBpc3N1ZSkKICAgICBpbnQgbnVtVGhyZWFkcyA9IDUwOwpAQCAtMTc2LDI5ICsyMzEsMjQgQEAKICAgICAgIG51bVN1Y2Nlc3NlcyArPSBydW5uYWJsZS5nZXROdW1TdWNjZXNzZXMoKTsKICAgICB9CiAgICAgYXNzZXJ0RXF1YWxzKG51bVRocmVhZHMgKiBudW1DYWxsc1BlclRocmVhZCwgbnVtU3VjY2Vzc2VzKTsKLSAgfSAgCi0gIAorICB9CisKICAgcHJpdmF0ZSBTcnYuQXN5bmNDbGllbnQgZ2V0Q2xpZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICBUTm9uYmxvY2tpbmdTb2NrZXQgY2xpZW50U29ja2V0ID0gbmV3IFROb25ibG9ja2luZ1NvY2tldChTZXJ2ZXJUZXN0QmFzZS5IT1NULCBTZXJ2ZXJUZXN0QmFzZS5QT1JUKTsKICAgICByZXR1cm4gbmV3IFNydi5Bc3luY0NsaWVudChuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgY2xpZW50TWFuYWdlcl8sIGNsaWVudFNvY2tldCk7CiAgIH0KLSAgCisKICAgcHJpdmF0ZSB2b2lkIGJhc2ljQ2FsbChTcnYuQXN5bmNDbGllbnQgY2xpZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKICAgICBmaW5hbCBBdG9taWNCb29sZWFuIHJldHVybmVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOwotICAgIGNsaWVudC5KYW5reSgxLCBuZXcgRmFpbHVyZUxlc3NDYWxsYmFjazxTcnYuQXN5bmNDbGllbnQuSmFua3lfY2FsbD4oKSB7CisgICAgY2xpZW50Lkphbmt5KDEsIG5ldyBGYWlsdXJlTGVzc0NhbGxiYWNrPEludGVnZXI+KCkgewogICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKEphbmt5X2NhbGwgcmVzcG9uc2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzcG9uc2UuZ2V0UmVzdWx0KCkpOwotICAgICAgICAgIHJldHVybmVkLnNldCh0cnVlKTsKLSAgICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgZmFpbChlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgfQorICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShJbnRlZ2VyIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydEVxdWFscygzLCByZXNwb25zZS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuZWQuc2V0KHRydWUpOworICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewogICAgICAgICB0cnkgewpAQCAtMjEzLDcgKzI2Myw3IEBACiAgICAgbGF0Y2guYXdhaXQoMTAwLCBUaW1lVW5pdC5TRUNPTkRTKTsKICAgICBhc3NlcnRUcnVlKHJldHVybmVkLmdldCgpKTsKICAgfQotICAKKwogICBwdWJsaWMgY2xhc3MgU3J2SGFuZGxlciBpbXBsZW1lbnRzIElmYWNlIHsKICAgICAvLyBVc2UgdGhpcyBtZXRob2QgZm9yIGEgc3RhbmRhcmQgY2FsbCB0ZXN0aW5nCiAgICAgQE92ZXJyaWRlCkBAIC0yMzIsNyArMjgyLDcgQEAKICAgICAgIH0KICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICAKKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG1ldGhvZFdpdGhEZWZhdWx0QXJncyhpbnQgc29tZXRoaW5nKSB0aHJvd3MgVEV4Y2VwdGlvbiB7IH0KIApAQCAtMjQ4LDIxICsyOTgsMzAgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbmV3YXlNZXRob2QoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZGVjbGFyZWRFeGNlcHRpb25NZXRob2QoYm9vbGVhbiBzaG91bGRUaHJvd0RlY2xhcmVkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBpZiAoc2hvdWxkVGhyb3dEZWNsYXJlZCkgeworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uV2l0aEFNYXAoImJsYWgiLCBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCEiKTsKKyAgICAgIH0KKyAgICB9CiAgIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIEZhaWx1cmVMZXNzQ2FsbGJhY2s8VCBleHRlbmRzIFRBc3luY01ldGhvZENhbGw+IGltcGxlbWVudHMgQXN5bmNNZXRob2RDYWxsYmFjazxUPiB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRmFpbHVyZUxlc3NDYWxsYmFjazxUPiBpbXBsZW1lbnRzIEFzeW5jTWV0aG9kQ2FsbGJhY2s8VD4gewogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewogICAgICAgZmFpbChleGNlcHRpb24pOwogICAgIH0KICAgfQotICAKKwogICBwcml2YXRlIHN0YXRpYyB2b2lkIGZhaWwoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewogICAgIFN0cmluZ1dyaXRlciBzaW5rID0gbmV3IFN0cmluZ1dyaXRlcigpOwogICAgIGV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHNpbmssIHRydWUpKTsKICAgICBmYWlsKCJ1bmV4cGVjdGVkIGVycm9yICIgKyBzaW5rLnRvU3RyaW5nKCkpOwogICB9Ci0gIAorCiAgIHByaXZhdGUgY2xhc3MgSmFua3lSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKICAgICBwcml2YXRlIGludCBudW1DYWxsc187CiAgICAgcHJpdmF0ZSBpbnQgbnVtU3VjY2Vzc2VzXyA9IDA7CkBAIC0yODUsMTggKzM0NCwxMyBAQAogICAgICAgICAgIC8vIGNvbm5lY3QgYW4gYXN5bmMgY2xpZW50CiAgICAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CiAgICAgICAgICAgZmluYWwgQXRvbWljQm9vbGVhbiByZXR1cm5lZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKLSAgICAgICAgICBjbGllbnRfLkphbmt5KDEsIG5ldyBBc3luY01ldGhvZENhbGxiYWNrPFNydi5Bc3luY0NsaWVudC5KYW5reV9jYWxsPigpIHsKLSAgICAgICAgICAgIAorICAgICAgICAgIGNsaWVudF8uSmFua3koMSwgbmV3IEFzeW5jTWV0aG9kQ2FsbGJhY2s8SW50ZWdlcj4oKSB7CisKICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShKYW5reV9jYWxsIHJlc3BvbnNlKSB7Ci0gICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJlc3BvbnNlLmdldFJlc3VsdCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5lZC5zZXQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7Ci0gICAgICAgICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwotICAgICAgICAgICAgICAgIGZhaWwoZSk7Ci0gICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoSW50ZWdlciByZXN1bHQpIHsKKyAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJlc3VsdC5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgcmV0dXJuZWQuc2V0KHRydWUpOworICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQE92ZXJyaWRlCkBAIC0zMjEsNCArMzc1LDQgQEAKICAgICAgIH0KICAgICB9CiAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL0JlbmNobWFya1Byb3RvY29scy5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9CZW5jaG1hcmtQcm90b2NvbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODgxNjA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9CZW5jaG1hcmtQcm90b2NvbHMuamF2YQpAQCAtMCwwICsxLDg4IEBACitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuRml4dHVyZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcjsKKworcHVibGljIGNsYXNzIEJlbmNobWFya1Byb3RvY29scyB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFRQcm90b2NvbEZhY3Rvcnk+IEZBQ1RPUklFUyA9IG5ldyBMaW5rZWRIYXNoU2V0PFRQcm90b2NvbEZhY3Rvcnk+KCl7eworICAgIGFkZChuZXcgVFR1cGxlUHJvdG9jb2wuRmFjdG9yeSgpKTsKKyAgICBhZGQobmV3IFRDb21wYWN0UHJvdG9jb2wuRmFjdG9yeSgpKTsKKyAgICBhZGQobmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCkpOworICB9fTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1JFUFMgPSAxMDAwMDA7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fVFJJQUxTID0gMTA7CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFRFeGNlcHRpb24geworICAgIE1hcDxUUHJvdG9jb2xGYWN0b3J5LCBMaXN0PExvbmc+PiB0aW1lc0J5RmFjdG9yeSA9IG5ldyBIYXNoTWFwPFRQcm90b2NvbEZhY3RvcnksIExpc3Q8TG9uZz4+KCk7CisKKyAgICBmb3IgKGludCB0cmlhbCA9IDA7IHRyaWFsIDwgTlVNX1RSSUFMUzsgdHJpYWwrKykgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIFN5c3RlbS5nYygpOworICAgICAgfQorLy8gICAgICBUUHJvdG9jb2wgcHJvdG8gPSBmYWN0b3J5LmdldFByb3RvY29sKG5ldyBUVHJhbnNwb3J0KCkgeworLy8gICAgICAgIEBPdmVycmlkZQorLy8gICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKy8vICAgICAgICB9CisvLworLy8gICAgICAgIEBPdmVycmlkZQorLy8gICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisvLyAgICAgICAgICByZXR1cm4gMDsKKy8vICAgICAgICB9CisvLworLy8gICAgICAgIEBPdmVycmlkZQorLy8gICAgICAgIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisvLyAgICAgICAgfQorLy8KKy8vICAgICAgICBAT3ZlcnJpZGUKKy8vICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisvLyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKy8vICAgICAgICB9CisvLworLy8gICAgICAgIEBPdmVycmlkZQorLy8gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworLy8gICAgICAgIH0KKy8vICAgICAgfSk7CisKKworICAgICAgZm9yIChUUHJvdG9jb2xGYWN0b3J5IGZhY3RvcnkgOiBGQUNUT1JJRVMpIHsKKyAgICAgICAgaWYgKHRpbWVzQnlGYWN0b3J5LmdldChmYWN0b3J5KSA9PSBudWxsKSB7CisgICAgICAgICAgdGltZXNCeUZhY3RvcnkucHV0KGZhY3RvcnksIG5ldyBBcnJheUxpc3Q8TG9uZz4oKSk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IE5VTV9SRVBTOyByZXArKykgeworICAgICAgICAgIFRQcm90b2NvbCBwcm90byA9IGZhY3RvcnkuZ2V0UHJvdG9jb2wobmV3IFRNZW1vcnlCdWZmZXIoMTI4KjEwMjQpKTsKKyAgICAgICAgICBGaXh0dXJlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0LndyaXRlKHByb3RvKTsKKyAgICAgICAgICBGaXh0dXJlcy5uZXN0aW5nLndyaXRlKHByb3RvKTsKKyAgICAgICAgfQorICAgICAgICBsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB0aW1lc0J5RmFjdG9yeS5nZXQoZmFjdG9yeSkuYWRkKGVuZC1zdGFydCk7CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChUUHJvdG9jb2xGYWN0b3J5IGZhY3RvcnkgOiBGQUNUT1JJRVMpIHsKKyAgICAgIExpc3Q8TG9uZz4gdGltZXMgPSB0aW1lc0J5RmFjdG9yeS5nZXQoZmFjdG9yeSk7CisvLyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmF3IHRpbWVzIHByZS1kcm9wOiAiICsgdGltZXMgKTsKKyAgICAgIHRpbWVzLnJlbW92ZShDb2xsZWN0aW9ucy5tYXgodGltZXMpKTsKKyAgICAgIGxvbmcgdG90YWwgPSAwOworICAgICAgZm9yIChsb25nIHQgOiB0aW1lcykgeworICAgICAgICB0b3RhbCArPSB0OworICAgICAgfQorICAgICAgQ29sbGVjdGlvbnMuc29ydCh0aW1lcyk7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZmFjdG9yeS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYXZlcmFnZSB0aW1lOiAiICsgKHRvdGFsIC8gdGltZXMuc2l6ZSgpKSArICJtcyIpOworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyYXcgdGltZXM6ICIgKyB0aW1lcyk7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvUHJvdG9jb2xUZXN0QmFzZS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9Qcm90b2NvbFRlc3RCYXNlLmphdmEKaW5kZXggZWYyYTM5Mi4uMDM4NmQ4MyAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9Qcm90b2NvbFRlc3RCYXNlLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9Qcm90b2NvbFRlc3RCYXNlLmphdmEKQEAgLTc0LDcgKzc0LDEzIEBACiAgIH0KIAogICBwdWJsaWMgdm9pZCB0ZXN0QmluYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgZm9yIChieXRlW10gYiA6IEFycmF5cy5hc0xpc3QobmV3IGJ5dGVbMF0sIG5ldyBieXRlW117MCwxLDIsMyw0LDUsNiw3LDgsOSwxMH0sIG5ldyBieXRlW117MCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNH0sIG5ldyBieXRlWzEyOF0pKSB7CisgICAgZm9yIChieXRlW10gYiA6IEFycmF5cy5hc0xpc3QobmV3IGJ5dGVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGJ5dGVbXXswLDEsMiwzLDQsNSw2LDcsOCw5LDEwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgYnl0ZVtdezAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBieXRlW117MHg1RH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGJ5dGVbXXsoYnl0ZSkweEQ1LChieXRlKTB4NUR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBieXRlW117KGJ5dGUpMHhGRiwoYnl0ZSkweEQ1LChieXRlKTB4NUR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBieXRlWzEyOF0pKSB7CiAgICAgICBpZiAoY2FuQmVVc2VkTmFrZWQoKSkgewogICAgICAgICBpbnRlcm5hbFRlc3ROYWtlZEJpbmFyeShiKTsKICAgICAgIH0KQEAgLTMyMSw2ICszMjcsMTEgQEAKICAgICAgIEBPdmVycmlkZQogICAgICAgcHVibGljIHZvaWQgb25ld2F5TWV0aG9kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBib29sZWFuIGRlY2xhcmVkRXhjZXB0aW9uTWV0aG9kKGJvb2xlYW4gc2hvdWxkVGhyb3cpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHNob3VsZFRocm93OworICAgICAgfQogICAgIH07CiAKICAgICBTcnYuUHJvY2Vzc29yIHRlc3RQcm9jZXNzb3IgPSBuZXcgU3J2LlByb2Nlc3NvcihoYW5kbGVyKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFNob3J0U3RhY2suamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFNob3J0U3RhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGU3OGVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0U2hvcnRTdGFjay5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0U2hvcnRTdGFjayBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwdWJsaWMgdm9pZCB0ZXN0T3BzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU2hvcnRTdGFjayBzID0gbmV3IFNob3J0U3RhY2soMSk7CisgICAgcy5wdXNoKChzaG9ydCkxMCk7CisgICAgcy5wdXNoKChzaG9ydCkxMSk7CisgICAgcy5wdXNoKChzaG9ydCkxMik7CisgICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMiwgcy5wb3AoKSk7CisgICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMSwgcy5wb3AoKSk7CisgICAgcy5wdXNoKChzaG9ydCk0MCk7CisgICAgYXNzZXJ0RXF1YWxzKChzaG9ydCk0MCwgcy5wb3AoKSk7CisgICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMCwgcy5wb3AoKSk7CisgICAgdHJ5IHsKKyAgICAgIHMucG9wKCk7CisgICAgICBmYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uISIpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyB5YXkKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRCaW5hcnlQcm90b2NvbC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VEJpbmFyeVByb3RvY29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZmQ5MzcuLjAwMDAwMDAKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VEJpbmFyeVByb3RvY29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0VEJpbmFyeVByb3RvY29sIGV4dGVuZHMgUHJvdG9jb2xUZXN0QmFzZSB7Ci0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBnZXRGYWN0b3J5KCkgewotICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5CZVVzZWROYWtlZCgpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VENvbXBhY3RQcm90b2NvbC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VENvbXBhY3RQcm90b2NvbC5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZjBkNzg5NS4uYjRjMDg4OAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUQ29tcGFjdFByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VENvbXBhY3RQcm90b2NvbC5qYXZhCkBAIC0yMCw2ICsyMCwxMCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOwogCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVERlc2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuQm9uazsKIAogcHVibGljIGNsYXNzIFRlc3RUQ29tcGFjdFByb3RvY29sIGV4dGVuZHMgUHJvdG9jb2xUZXN0QmFzZSB7CiAgIEBPdmVycmlkZQpAQCAtMzIsNiArMzYsMjAgQEAKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCisgIHB1YmxpYyB2b2lkIHRlc3RPT01EZW5pYWxPZlNlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBTdHJ1Y3QgaGVhZGVyLCBJbnRlZ2VyLk1BWF9WQUxVRSBsZW5ndGgsIGFuZCBvbmx5IG9uZSByZWFsCisgICAgLy8gYnl0ZSBvZiBkYXRhCisgICAgYnl0ZSBbXSBieXRlcyA9IHsyNCwgLTEsIC0xLCAtMSwgLTE3LCA0OX07CisgICAgVERlc2VyaWFsaXplciBkZXNlciA9IG5ldyBURGVzZXJpYWxpemVyKG5ldyBUQ29tcGFjdFByb3RvY29sCisJCQkJCSAgICAuRmFjdG9yeSgxMDAwKSk7CisgICAgQm9uayBib25rID0gbmV3IEJvbmsoKTsKKyAgICB0cnkgeworCWRlc2VyLmRlc2VyaWFsaXplKGJvbmssIGJ5dGVzKTsKKyAgICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKKwkvLyBJZ25vcmUgYXMgd2UgYXJlIG9ubHkgY2hlY2tpbmcgZm9yIE9PTSBpbiB0aGUgZmFpbHVyZSBjYXNlCisgICAgfQorICB9CisKICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgbmV3IFRlc3RUQ29tcGFjdFByb3RvY29sKCkuYmVuY2htYXJrKCk7CiAgIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRKU09OUHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRKU09OUHJvdG9jb2wuamF2YQppbmRleCBkNzM3NmFjLi5jMmNhMWZhIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUSlNPTlByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VEpTT05Qcm90b2NvbC5qYXZhCkBAIC0xOCw2ICsxOCwxMiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOwogCitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5USlNPTlByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyOworCiBwdWJsaWMgY2xhc3MgVGVzdFRKU09OUHJvdG9jb2wgZXh0ZW5kcyBQcm90b2NvbFRlc3RCYXNlIHsKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCBUUHJvdG9jb2xGYWN0b3J5IGdldEZhY3RvcnkoKSB7CkBAIC0yOCw0ICszNCwxNSBAQAogICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5CZVVzZWROYWtlZCgpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RXNjYXBlZFVuaWNvZGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIGpzb25TdHJpbmcgPSAiXCJoZWxsbyB1bmljb2RlIFxcdTBlMDFcXHVkODM0XFx1ZGQxZSB3b3JsZFwiIjsKKyAgICBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcgPSAiaGVsbG8gdW5pY29kZSBcdTBlMDFcdWQ4MzRcdWRkMWUgd29ybGQiOworCisgICAgVE1lbW9yeUJ1ZmZlciBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcigxMDAwKTsKKyAgICBUSlNPTlByb3RvY29sIHByb3RvY29sID0gbmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKTsKKyAgICBidWZmZXIud3JpdGUoanNvblN0cmluZy5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CisKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHByb3RvY29sLnJlYWRTdHJpbmcoKSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRQcm90b2NvbFV0aWwuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRQcm90b2NvbFV0aWwuamF2YQppbmRleCAxOTljNzA3Li44OWNmNTM2IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUUHJvdG9jb2xVdGlsLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFByb3RvY29sVXRpbC5qYXZhCkBAIC0xOCwyNCArMTgsMTAgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKIAotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LkZpeHR1cmVzOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlREZXNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcjsKIAotaW1wb3J0IHRocmlmdC50ZXN0LkNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Q7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuSG9seU1vbGV5OwotaW1wb3J0IHRocmlmdC50ZXN0Lk5lc3Rpbmc7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuT25lT2ZFYWNoOwotaW1wb3J0IHRocmlmdC50ZXN0LlNydjsKIGltcG9ydCB0aHJpZnQudGVzdC5HdWVzc1Byb3RvY29sU3RydWN0OwogCiBwdWJsaWMgY2xhc3MgVGVzdFRQcm90b2NvbFV0aWwgZXh0ZW5kcyBUZXN0Q2FzZSB7CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUU2ltcGxlSlNPTlByb3RvY29sLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUU2ltcGxlSlNPTlByb3RvY29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQxMjViMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRTaW1wbGVKU09OUHJvdG9jb2wuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuRml4dHVyZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcjsKKworaW1wb3J0IHRocmlmdC50ZXN0LkNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Q7CitpbXBvcnQgdGhyaWZ0LnRlc3QuSG9seU1vbGV5OworCitwdWJsaWMgY2xhc3MgVGVzdFRTaW1wbGVKU09OUHJvdG9jb2wgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHByaXZhdGUgVE1lbW9yeUJ1ZmZlciBidWY7CisgIHByaXZhdGUgVFNpbXBsZUpTT05Qcm90b2NvbCBwcm90bzsKKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcigxMDAwKTsKKyAgICBwcm90byA9IG5ldyBUU2ltcGxlSlNPTlByb3RvY29sKGJ1Zik7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBidWZUb1N0cmluZygpIHsKKyAgICByZXR1cm4gYnVmLnRvU3RyaW5nKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEhvbHlNb2xleSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBmaW5hbCBIb2x5TW9sZXkgaG9seU1vbGV5ID0gRml4dHVyZXMuaG9seU1vbGV5LmRlZXBDb3B5KCk7CisgICAgLy8gdW5zZXQgc2V0cyB0aGF0IHByb2R1Y2UgaW5jb25zaXN0ZW50IG9yZGVyaW5nIGJldHdlZW4gSkRLNy84CisgICAgaG9seU1vbGV5LnVuc2V0Qm9ua3MoKTsKKyAgICBob2x5TW9sZXkudW5zZXRDb250YWluKCk7CisgICAgaG9seU1vbGV5LndyaXRlKHByb3RvKTsKKyAgICBhc3NlcnRFcXVhbHMoIntcImJpZ1wiOlt7XCJpbV90cnVlXCI6MSxcImltX2ZhbHNlXCI6MCxcImFfYml0ZVwiOjM1LFwiaW50ZWdlcjE2XCI6MjcwMDAsXCJpbnRlZ2VyMzJcIjoxNjc3NzIxNixcImludGVnZXI2NFwiOjYwMDAwMDAwMDAsXCJkb3VibGVfcHJlY2lzaW9uXCI6My4xNDE1OTI2NTM1ODk3OTMsXCJzb21lX2NoYXJhY3RlcnNcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIixcInpvbWdfdW5pY29kZVwiOlwi04Diha7OnSDQnc6/4oW/0L7JodCz0LDPgeKEjiDOkXR0zrHihb3Ouu+/veKAvFwiLFwid2hhdF93aG9cIjowLFwiYmFzZTY0XCI6XCJiYXNlNjRcIixcImJ5dGVfbGlzdFwiOlsxLDIsM10sXCJpMTZfbGlzdFwiOlsxLDIsM10sXCJpNjRfbGlzdFwiOlsxLDIsM119LHtcImltX3RydWVcIjoxLFwiaW1fZmFsc2VcIjowLFwiYV9iaXRlXCI6LTQyLFwiaW50ZWdlcjE2XCI6MjcwMDAsXCJpbnRlZ2VyMzJcIjoxNjc3NzIxNixcImludGVnZXI2NFwiOjYwMDAwMDAwMDAsXCJkb3VibGVfcHJlY2lzaW9uXCI6My4xNDE1OTI2NTM1ODk3OTMsXCJzb21lX2NoYXJhY3RlcnNcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIixcInpvbWdfdW5pY29kZVwiOlwi04Diha7OnSDQnc6/4oW/0L7JodCz0LDPgeKEjiDOkXR0zrHihb3Ouu+/veKAvFwiLFwid2hhdF93aG9cIjowLFwiYmFzZTY0XCI6XCJiYXNlNjRcIixcImJ5dGVfbGlzdFwiOlsxLDIsM10sXCJpMTZfbGlzdFwiOlsxLDIsM10sXCJpNjRfbGlzdFwiOlsxLDIsM119XX0iLCBidWZUb1N0cmluZygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3ROZXN0aW5nKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIEZpeHR1cmVzLm5lc3Rpbmcud3JpdGUocHJvdG8pOworICAgIGFzc2VydEVxdWFscygie1wibXlfYm9ua1wiOntcInR5cGVcIjozMTMzNyxcIm1lc3NhZ2VcIjpcIkkgYW0gYSBib25rLi4uIHhvciFcIn0sXCJteV9vb2VcIjp7XCJpbV90cnVlXCI6MSxcImltX2ZhbHNlXCI6MCxcImFfYml0ZVwiOi00MixcImludGVnZXIxNlwiOjI3MDAwLFwiaW50ZWdlcjMyXCI6MTY3NzcyMTYsXCJpbnRlZ2VyNjRcIjo2MDAwMDAwMDAwLFwiZG91YmxlX3ByZWNpc2lvblwiOjMuMTQxNTkyNjUzNTg5NzkzLFwic29tZV9jaGFyYWN0ZXJzXCI6XCJKU09OIFRISVMhIFxcXCJcXHUwMDAxXCIsXCJ6b21nX3VuaWNvZGVcIjpcItOA4oWuzp0g0J3Ov+KFv9C+yaHQs9Cwz4HihI4gzpF0dM6x4oW9zrrvv73igLxcIixcIndoYXRfd2hvXCI6MCxcImJhc2U2NFwiOlwiYmFzZTY0XCIsXCJieXRlX2xpc3RcIjpbMSwyLDNdLFwiaTE2X2xpc3RcIjpbMSwyLDNdLFwiaTY0X2xpc3RcIjpbMSwyLDNdfX0iLCBidWZUb1N0cmluZygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RPbmVPZkVhY2goKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgRml4dHVyZXMub25lT2ZFYWNoLndyaXRlKHByb3RvKTsKKyAgICBhc3NlcnRFcXVhbHMoIntcImltX3RydWVcIjoxLFwiaW1fZmFsc2VcIjowLFwiYV9iaXRlXCI6LTQyLFwiaW50ZWdlcjE2XCI6MjcwMDAsXCJpbnRlZ2VyMzJcIjoxNjc3NzIxNixcImludGVnZXI2NFwiOjYwMDAwMDAwMDAsXCJkb3VibGVfcHJlY2lzaW9uXCI6My4xNDE1OTI2NTM1ODk3OTMsXCJzb21lX2NoYXJhY3RlcnNcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIixcInpvbWdfdW5pY29kZVwiOlwi04Diha7OnSDQnc6/4oW/0L7JodCz0LDPgeKEjiDOkXR0zrHihb3Ouu+/veKAvFwiLFwid2hhdF93aG9cIjowLFwiYmFzZTY0XCI6XCJiYXNlNjRcIixcImJ5dGVfbGlzdFwiOlsxLDIsM10sXCJpMTZfbGlzdFwiOlsxLDIsM10sXCJpNjRfbGlzdFwiOlsxLDIsM119IiwgYnVmVG9TdHJpbmcoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2FuZVBhcnRzT2ZDb21wYWN0UHJvdG9UZXN0U3RydWN0KCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIC8vIHVuc2V0IGFsbCB0aGUgbWFwcyB3aXRoIGNvbnRhaW5lciBrZXlzCisgICAgQ29tcGFjdFByb3RvVGVzdFN0cnVjdCBzdHJ1Y3QgPSBGaXh0dXJlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0LmRlZXBDb3B5KCk7CisgICAgc3RydWN0LnVuc2V0TGlzdF9ieXRlX21hcCgpOworICAgIHN0cnVjdC51bnNldFNldF9ieXRlX21hcCgpOworICAgIHN0cnVjdC51bnNldE1hcF9ieXRlX21hcCgpOworICAgIC8vIHVuc2V0IHNldHMgYW5kIG1hcHMgdGhhdCBwcm9kdWNlIGluY29uc2lzdGVudCBvcmRlcmluZyBiZXR3ZWVuIEpESzcvOAorICAgIHN0cnVjdC51bnNldEJ5dGVfc2V0KCk7CisgICAgc3RydWN0LnVuc2V0STE2X3NldCgpOworICAgIHN0cnVjdC51bnNldEk2NF9zZXQoKTsKKyAgICBzdHJ1Y3QudW5zZXREb3VibGVfc2V0KCk7CisgICAgc3RydWN0LnVuc2V0U3RyaW5nX3NldCgpOworICAgIHN0cnVjdC51bnNldEkxNl9ieXRlX21hcCgpOworICAgIHN0cnVjdC51bnNldEkzMl9ieXRlX21hcCgpOworICAgIHN0cnVjdC51bnNldEk2NF9ieXRlX21hcCgpOworICAgIHN0cnVjdC51bnNldERvdWJsZV9ieXRlX21hcCgpOworICAgIHN0cnVjdC51bnNldFN0cmluZ19ieXRlX21hcCgpOworICAgIHN0cnVjdC53cml0ZShwcm90byk7CisgICAgYXNzZXJ0RXF1YWxzKCJ7XCJhX2J5dGVcIjoxMjcsXCJhX2kxNlwiOjMyMDAwLFwiYV9pMzJcIjoxMDAwMDAwMDAwLFwiYV9pNjRcIjoxMDk5NTExNjI3Nzc1LFwiYV9kb3VibGVcIjo1LjY3ODksXCJhX3N0cmluZ1wiOlwibXkgc3RyaW5nXCIsXCJhX2JpbmFyeVwiOlwiXFx1MDAwMFxcdTAwMDFcXHUwMDAyXFx1MDAwM1xcdTAwMDRcXHUwMDA1XFx1MDAwNlxcdTAwMDdcXGJcIixcInRydWVfZmllbGRcIjoxLFwiZmFsc2VfZmllbGRcIjowLFwiZW1wdHlfc3RydWN0X2ZpZWxkXCI6e30sXCJieXRlX2xpc3RcIjpbLTEyNywtMSwwLDEsMTI3XSxcImkxNl9saXN0XCI6Wy0xLDAsMSwzMjc2N10sXCJpMzJfbGlzdFwiOlstMSwwLDI1NSw2NTUzNSwxNjc3NzIxNSwyMTQ3NDgzNjQ3XSxcImk2NF9saXN0XCI6Wy0xLDAsMjU1LDY1NTM1LDE2Nzc3MjE1LDQyOTQ5NjcyOTUsMTA5OTUxMTYyNzc3NSwyODE0NzQ5NzY3MTA2NTUsNzIwNTc1OTQwMzc5Mjc5MzUsOTIyMzM3MjAzNjg1NDc3NTgwN10sXCJkb3VibGVfbGlzdFwiOlswLjEsMC4yLDAuM10sXCJzdHJpbmdfbGlzdFwiOltcImZpcnN0XCIsXCJzZWNvbmRcIixcInRoaXJkXCJdLFwiYm9vbGVhbl9saXN0XCI6WzEsMSwxLDAsMCwwXSxcInN0cnVjdF9saXN0XCI6W3t9LHt9XSxcImkzMl9zZXRcIjpbMSwyLDNdLFwiYm9vbGVhbl9zZXRcIjpbMCwxXSxcInN0cnVjdF9zZXRcIjpbe31dLFwiYnl0ZV9ieXRlX21hcFwiOntcIjFcIjoyfSxcImJvb2xlYW5fYnl0ZV9tYXBcIjp7XCIwXCI6MCxcIjFcIjoxfSxcImJ5dGVfaTE2X21hcFwiOntcIjFcIjoxLFwiMlwiOi0xLFwiM1wiOjMyNzY3fSxcImJ5dGVfaTMyX21hcFwiOntcIjFcIjoxLFwiMlwiOi0xLFwiM1wiOjIxNDc0ODM2NDd9LFwiYnl0ZV9pNjRfbWFwXCI6e1wiMVwiOjEsXCIyXCI6LTEsXCIzXCI6OTIyMzM3MjAzNjg1NDc3NTgwN30sXCJieXRlX2RvdWJsZV9tYXBcIjp7XCIxXCI6MC4xLFwiMlwiOi0wLjEsXCIzXCI6MTAwMDAwMC4xfSxcImJ5dGVfc3RyaW5nX21hcFwiOntcIjFcIjpcIlwiLFwiMlwiOlwiYmxhaFwiLFwiM1wiOlwibG9vb29vb29vb29vb29vbmcgc3RyaW5nXCJ9LFwiYnl0ZV9ib29sZWFuX21hcFwiOntcIjFcIjoxLFwiMlwiOjB9LFwiYnl0ZV9tYXBfbWFwXCI6e1wiMFwiOnt9LFwiMVwiOntcIjFcIjoxfSxcIjJcIjp7XCIxXCI6MSxcIjJcIjoyfX0sXCJieXRlX3NldF9tYXBcIjp7XCIwXCI6W10sXCIxXCI6WzFdLFwiMlwiOlsxLDJdfSxcImJ5dGVfbGlzdF9tYXBcIjp7XCIwXCI6W10sXCIxXCI6WzFdLFwiMlwiOlsxLDJdfX0iLCBidWZUb1N0cmluZygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RUaHJvd3NPbkNvbGxlY3Rpb25LZXlzKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBGaXh0dXJlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0LndyaXRlKHByb3RvKTsKKyAgICAgIGZhaWwoInRoaXMgc2hvdWxkIHRocm93IGEgQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbiIpOworICAgIH0gY2F0Y2ggKFRTaW1wbGVKU09OUHJvdG9jb2wuQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAvLworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFR1cGxlUHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRUdXBsZVByb3RvY29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY1NGRiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRUdXBsZVByb3RvY29sLmphdmEKQEAgLTAsMCArMSwyNyBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlREZXNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFNlcmlhbGl6ZXI7CisKK2ltcG9ydCB0aHJpZnQudGVzdC5UdXBsZVByb3RvY29sVGVzdFN0cnVjdDsKKworCitwdWJsaWMgY2xhc3MgVGVzdFRUdXBsZVByb3RvY29sIGV4dGVuZHMgUHJvdG9jb2xUZXN0QmFzZSB7CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBib29sZWFuIGNhbkJlVXNlZE5ha2VkKCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBnZXRGYWN0b3J5KCkgeworICAgIHJldHVybiBuZXcgVFR1cGxlUHJvdG9jb2wuRmFjdG9yeSgpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEJpdHNldExlbmd0aElzc3VlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgVHVwbGVQcm90b2NvbFRlc3RTdHJ1Y3QgdDEgPSBuZXcgVHVwbGVQcm90b2NvbFRlc3RTdHJ1Y3QoKTsKKyAgICB0MS5zZXRGaWVsZDEoMCk7CisgICAgdDEuc2V0RmllbGQyKDEyKTsKKyAgICBuZXcgVERlc2VyaWFsaXplcihuZXcgVFR1cGxlUHJvdG9jb2wuRmFjdG9yeSgpKS5kZXNlcmlhbGl6ZShuZXcgVHVwbGVQcm90b2NvbFRlc3RTdHJ1Y3QoKSwgbmV3IFRTZXJpYWxpemVyKG5ldyBUVHVwbGVQcm90b2NvbC5GYWN0b3J5KCkpLnNlcmlhbGl6ZSh0MSkpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NjaGVtZS9UZXN0U3RhbmRhcmRTY2hlbWUuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1Rlc3RTdGFuZGFyZFNjaGVtZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZjIyOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NjaGVtZS9UZXN0U3RhbmRhcmRTY2hlbWUuamF2YQpAQCAtMCwwICsxLDQwIEBACitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LkZpeHR1cmVzOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlREZXNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UU2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCitpbXBvcnQgdGhyaWZ0LnRlc3QuSG9seU1vbGV5OworaW1wb3J0IHRocmlmdC50ZXN0Lk5lc3Rpbmc7CitpbXBvcnQgdGhyaWZ0LnRlc3QuT25lT2ZFYWNoOworCitwdWJsaWMgY2xhc3MgVGVzdFN0YW5kYXJkU2NoZW1lIGV4dGVuZHMgVGVzdENhc2UgeworICBUU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IFRTZXJpYWxpemVyKCk7CisgIFREZXNlcmlhbGl6ZXIgZGVzZXJpYWxpemVyID0gbmV3IFREZXNlcmlhbGl6ZXIoKTsKKworICAvKioKKyAgICogVGhpcyB0ZXN0cyB3aGV0aGVyIHRoZSBTdGFuZGFyZCBTY2hlbWUgcHJvcGVybHkgcmVhZHMgc3RydWN0cyBzZXJpYWxpemVkCisgICAqIHVzaW5nIGFuIG9sZGVyIHZlcnNpb24gb2YgdGhyaWZ0LgorICAgKi8KKyAgcHVibGljIHZvaWQgdGVzdFBlcnNpc3RlbnRTdHJ1Y3RzKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRBbmRDb21wYXJlKG5ldyBPbmVPZkVhY2goKSwgRml4dHVyZXMub25lT2ZFYWNoLCBGaXh0dXJlcy5wZXJzaXN0ZW50Qnl0ZXNPbmVPZkVhY2gpOworICAgIHJlYWRBbmRDb21wYXJlKG5ldyBIb2x5TW9sZXkoKSwgRml4dHVyZXMuaG9seU1vbGV5LCBGaXh0dXJlcy5wZXJzaXN0ZW50Qnl0ZXNIb2x5TW9sZXkpOworICAgIHJlYWRBbmRDb21wYXJlKG5ldyBOZXN0aW5nKCksIEZpeHR1cmVzLm5lc3RpbmcsIEZpeHR1cmVzLnBlcnNpc3RlbnRCeXRlc05lc3RpbmcpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZEFuZENvbXBhcmUoVEJhc2Ugc3RydWN0LCBUQmFzZSBmaXh0dXJlLCBieXRlW10gaW5wdXRCeXRlcykgdGhyb3dzIFRFeGNlcHRpb24geworICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBuZXcgVE1lbW9yeUJ1ZmZlcigwKTsKKyAgICB0cmFucy53cml0ZShpbnB1dEJ5dGVzLCAwLCBpbnB1dEJ5dGVzLmxlbmd0aCk7CisgICAgVFByb3RvY29sIGlwcm90ID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucyk7CisgICAgc3RydWN0LnJlYWQoaXByb3QpOworICAgIGFzc2VydEVxdWFscyhmaXh0dXJlLCBzdHJ1Y3QpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9TZXJ2ZXJUZXN0QmFzZS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvU2VydmVyVGVzdEJhc2UuamF2YQppbmRleCBiOTk3NGM0Li4xZGVlMjJkIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9TZXJ2ZXJUZXN0QmFzZS5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1NlcnZlclRlc3RCYXNlLmphdmEKQEAgLTI2LDU1ICsyNiw4MiBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAoraW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UUHJvY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTb2NrZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0LkZhY3Rvcnk7CiAKLWltcG9ydCB0aHJpZnQudGVzdC4qOworaW1wb3J0IHRocmlmdC50ZXN0Lkluc2FuaXR5OworaW1wb3J0IHRocmlmdC50ZXN0Lk51bWJlcno7CitpbXBvcnQgdGhyaWZ0LnRlc3QuVGhyaWZ0VGVzdDsKK2ltcG9ydCB0aHJpZnQudGVzdC5YY2VwdGlvbjsKK2ltcG9ydCB0aHJpZnQudGVzdC5YY2VwdGlvbjI7CitpbXBvcnQgdGhyaWZ0LnRlc3QuWHRydWN0OworaW1wb3J0IHRocmlmdC50ZXN0Llh0cnVjdDI7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2ZXJUZXN0QmFzZSBleHRlbmRzIFRlc3RDYXNlIHsKIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RIYW5kbGVyIGltcGxlbWVudHMgVGhyaWZ0VGVzdC5JZmFjZSB7Ci0gIAorCiAgICAgcHVibGljIFRlc3RIYW5kbGVyKCkge30KLSAgCisKICAgICBwdWJsaWMgdm9pZCB0ZXN0Vm9pZCgpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RWb2lkKClcbiIpOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgU3RyaW5nIHRlc3RTdHJpbmcoU3RyaW5nIHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0U3RyaW5nKFwiIiArIHRoaW5nICsgIlwiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKworICAgIHB1YmxpYyBib29sZWFuIHRlc3RCb29sKGJvb2xlYW4gdGhpbmcpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RCb29sKCIgKyB0aGluZyArICIpXG4iKTsKKyAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKICAgICBwdWJsaWMgYnl0ZSB0ZXN0Qnl0ZShieXRlIHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Qnl0ZSgiICsgdGhpbmcgKyAiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBpbnQgdGVzdEkzMihpbnQgdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RJMzIoIiArIHRoaW5nICsgIilcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgbG9uZyB0ZXN0STY0KGxvbmcgdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RJNjQoIiArIHRoaW5nICsgIilcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgZG91YmxlIHRlc3REb3VibGUoZG91YmxlIHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RG91YmxlKCIgKyB0aGluZyArICIpXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCisgICAgcHVibGljIEJ5dGVCdWZmZXIgdGVzdEJpbmFyeShCeXRlQnVmZmVyIHRoaW5nKSB7CisgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIodGhpbmcucmVtYWluaW5nKCkgKiAzKTsKKyAgICAgIHRoaW5nLm1hcmsoKTsKKyAgICAgIHdoaWxlICh0aGluZy5yZW1haW5pbmcoKSA+IDApIHsKKyAgICAgICAgc2IuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiUwMlggIiwgdGhpbmcuZ2V0KCkpKTsKKyAgICAgIH0KKyAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RCaW5hcnkoIiArIHNiLnRvU3RyaW5nKCkgKyAiKVxuIik7CisgICAgICB0aGluZy5yZXNldCgpOworICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKwogICAgIHB1YmxpYyBYdHJ1Y3QgdGVzdFN0cnVjdChYdHJ1Y3QgdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RTdHJ1Y3QoeyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgdGhpbmcuc3RyaW5nX3RoaW5nICsgIlwiLCAiICsKQEAgLTgzLDcgKzExMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLmk2NF90aGluZyArICJ9KVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBYdHJ1Y3QyIHRlc3ROZXN0KFh0cnVjdDIgbmVzdCkgewogICAgICAgWHRydWN0IHRoaW5nID0gbmVzdC5zdHJ1Y3RfdGhpbmc7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0TmVzdCh7IiArCkBAIC05NSw3ICsxMjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBuZXN0LmkzMl90aGluZyArICJ9KVxuIik7CiAgICAgICByZXR1cm4gbmVzdDsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIE1hcDxJbnRlZ2VyLEludGVnZXI+IHRlc3RNYXAoTWFwPEludGVnZXIsSW50ZWdlcj4gdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RNYXAoeyIpOwogICAgICAgU3lzdGVtLm91dC5wcmludCh0aGluZyk7CkBAIC0xMDksNyArMTM2LDcgQEAKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0pXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIFNldDxJbnRlZ2VyPiB0ZXN0U2V0KFNldDxJbnRlZ2VyPiB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdFNldCh7Iik7CiAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKQEAgLTEyNCw3ICsxNTEsNyBAQAogICAgICAgU3lzdGVtLm91dC5wcmludCgifSlcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgTGlzdDxJbnRlZ2VyPiB0ZXN0TGlzdChMaXN0PEludGVnZXI+IHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0TGlzdCh7Iik7CiAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKQEAgLTEzOSw3OCArMTY2LDU4IEBACiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9KVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBOdW1iZXJ6IHRlc3RFbnVtKE51bWJlcnogdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RFbnVtKCIgKyB0aGluZyArICIpXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIGxvbmcgdGVzdFR5cGVkZWYobG9uZyB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdFR5cGVkZWYoIiArIHRoaW5nICsgIilcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgTWFwPEludGVnZXIsTWFwPEludGVnZXIsSW50ZWdlcj4+IHRlc3RNYXBNYXAoaW50IGhlbGxvKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0TWFwTWFwKCIgKyBoZWxsbyArICIpXG4iKTsKICAgICAgIE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+PiBtYXBtYXAgPQogICAgICAgICBuZXcgSGFzaE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+PigpOwotICAKKwogICAgICAgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+IHBvcyA9IG5ldyBIYXNoTWFwPEludGVnZXIsSW50ZWdlcj4oKTsKICAgICAgIEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPiBuZWcgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+KCk7CiAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykgewogICAgICAgICBwb3MucHV0KGksIGkpOwogICAgICAgICBuZWcucHV0KC1pLCAtaSk7CiAgICAgICB9Ci0gIAorCiAgICAgICBtYXBtYXAucHV0KDQsIHBvcyk7CiAgICAgICBtYXBtYXAucHV0KC00LCBuZWcpOwotICAKKwogICAgICAgcmV0dXJuIG1hcG1hcDsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIE1hcDxMb25nLCBNYXA8TnVtYmVyeixJbnNhbml0eT4+IHRlc3RJbnNhbml0eShJbnNhbml0eSBhcmd1bWVudCkgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEluc2FuaXR5KClcbiIpOwotICAKLSAgICAgIFh0cnVjdCBoZWxsbyA9IG5ldyBYdHJ1Y3QoKTsKLSAgICAgIGhlbGxvLnN0cmluZ190aGluZyA9ICJIZWxsbzIiOwotICAgICAgaGVsbG8uYnl0ZV90aGluZyA9IDI7Ci0gICAgICBoZWxsby5pMzJfdGhpbmcgPSAyOwotICAgICAgaGVsbG8uaTY0X3RoaW5nID0gMjsKLSAgCi0gICAgICBYdHJ1Y3QgZ29vZGJ5ZSA9IG5ldyBYdHJ1Y3QoKTsKLSAgICAgIGdvb2RieWUuc3RyaW5nX3RoaW5nID0gIkdvb2RieWU0IjsKLSAgICAgIGdvb2RieWUuYnl0ZV90aGluZyA9IChieXRlKTQ7Ci0gICAgICBnb29kYnllLmkzMl90aGluZyA9IDQ7Ci0gICAgICBnb29kYnllLmk2NF90aGluZyA9IChsb25nKTQ7Ci0gIAotICAgICAgSW5zYW5pdHkgY3JhenkgPSBuZXcgSW5zYW5pdHkoKTsKLSAgICAgIGNyYXp5LnVzZXJNYXAgPSBuZXcgSGFzaE1hcDxOdW1iZXJ6LCBMb25nPigpOwotICAgICAgY3JhenkudXNlck1hcC5wdXQoTnVtYmVyei5FSUdIVCwgKGxvbmcpOCk7Ci0gICAgICBjcmF6eS51c2VyTWFwLnB1dChOdW1iZXJ6LkZJVkUsIChsb25nKTUpOwotICAgICAgY3JhenkueHRydWN0cyA9IG5ldyBBcnJheUxpc3Q8WHRydWN0PigpOwotICAgICAgY3JhenkueHRydWN0cy5hZGQoZ29vZGJ5ZSk7Ci0gICAgICBjcmF6eS54dHJ1Y3RzLmFkZChoZWxsbyk7Ci0gIAorCiAgICAgICBIYXNoTWFwPE51bWJlcnosSW5zYW5pdHk+IGZpcnN0X21hcCA9IG5ldyBIYXNoTWFwPE51bWJlcnosIEluc2FuaXR5PigpOwogICAgICAgSGFzaE1hcDxOdW1iZXJ6LEluc2FuaXR5PiBzZWNvbmRfbWFwID0gbmV3IEhhc2hNYXA8TnVtYmVyeiwgSW5zYW5pdHk+KCk7OwotICAKLSAgICAgIGZpcnN0X21hcC5wdXQoTnVtYmVyei5UV08sIGNyYXp5KTsKLSAgICAgIGZpcnN0X21hcC5wdXQoTnVtYmVyei5USFJFRSwgY3JhenkpOwotICAKKworICAgICAgZmlyc3RfbWFwLnB1dChOdW1iZXJ6LlRXTywgYXJndW1lbnQpOworICAgICAgZmlyc3RfbWFwLnB1dChOdW1iZXJ6LlRIUkVFLCBhcmd1bWVudCk7CisKICAgICAgIEluc2FuaXR5IGxvb25leSA9IG5ldyBJbnNhbml0eSgpOwogICAgICAgc2Vjb25kX21hcC5wdXQoTnVtYmVyei5TSVgsIGxvb25leSk7Ci0gIAorCiAgICAgICBNYXA8TG9uZyxNYXA8TnVtYmVyeixJbnNhbml0eT4+IGluc2FuZSA9CiAgICAgICAgIG5ldyBIYXNoTWFwPExvbmcsIE1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4oKTsKICAgICAgIGluc2FuZS5wdXQoKGxvbmcpMSwgZmlyc3RfbWFwKTsKICAgICAgIGluc2FuZS5wdXQoKGxvbmcpMiwgc2Vjb25kX21hcCk7Ci0gIAorCiAgICAgICByZXR1cm4gaW5zYW5lOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgWHRydWN0IHRlc3RNdWx0aShieXRlIGFyZzAsIGludCBhcmcxLCBsb25nIGFyZzIsIE1hcDxTaG9ydCxTdHJpbmc+IGFyZzMsIE51bWJlcnogYXJnNCwgbG9uZyBhcmc1KSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0TXVsdGkoKVxuIik7Ci0gIAorCiAgICAgICBYdHJ1Y3QgaGVsbG8gPSBuZXcgWHRydWN0KCk7OwogICAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CiAgICAgICBoZWxsby5ieXRlX3RoaW5nID0gYXJnMDsKQEAgLTIxOCwyMyArMjI1LDI0IEBACiAgICAgICBoZWxsby5pNjRfdGhpbmcgPSBhcmcyOwogICAgICAgcmV0dXJuIGhlbGxvOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKFN0cmluZyBhcmcpIHRocm93cyBYY2VwdGlvbiwgVEV4Y2VwdGlvbiB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RXhjZXB0aW9uKCIrYXJnKyIpXG4iKTsKLSAgICAgIGlmIChhcmcuZXF1YWxzKCJYY2VwdGlvbiIpKSB7CisgICAgICBpZiAoIlhjZXB0aW9uIi5lcXVhbHMoYXJnKSkgewogICAgICAgICBYY2VwdGlvbiB4ID0gbmV3IFhjZXB0aW9uKCk7CiAgICAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKICAgICAgICAgeC5tZXNzYWdlID0gYXJnOwogICAgICAgICB0aHJvdyB4OwotICAgICAgfSBlbHNlIGlmIChhcmcuZXF1YWxzKCJBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpKSB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKGFyZyk7CisgICAgICB9IGVsc2UgaWYgKCJURXhjZXB0aW9uIi5lcXVhbHMoYXJnKSkgeworICAgICAgICAvLyBVbnNwZWNpZmllZCBleGNlcHRpb24gc2hvdWxkIHlpZWxkIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIG9uIGNsaWVudCBzaWRlCisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGFyZyk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBYdHJ1Y3QgcmVzdWx0ID0gbmV3IFh0cnVjdCgpOwogICAgICAgICByZXN1bHQuc3RyaW5nX3RoaW5nID0gYXJnOwogICAgICAgfQogICAgICAgcmV0dXJuOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgWHRydWN0IHRlc3RNdWx0aUV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHRocm93cyBYY2VwdGlvbiwgWGNlcHRpb24yIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RNdWx0aUV4Y2VwdGlvbigiICsgYXJnMCArICIsICIgKyBhcmcxICsgIilcbiIpOwogICAgICAgaWYgKGFyZzAuZXF1YWxzKCJYY2VwdGlvbiIpKSB7CkBAIC0yNDksMTcgKzI1NywxNyBAQAogICAgICAgICB4LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiOwogICAgICAgICB0aHJvdyB4OwogICAgICAgfQotICAKKwogICAgICAgWHRydWN0IHJlc3VsdCA9IG5ldyBYdHJ1Y3QoKTsKICAgICAgIHJlc3VsdC5zdHJpbmdfdGhpbmcgPSBhcmcxOwogICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIHZvaWQgdGVzdE9uZXdheShpbnQgc2xlZXBGb3IpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdE9uZXdheSgiICsgSW50ZWdlci50b1N0cmluZyhzbGVlcEZvcikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICIpID0+IHNsZWVwaW5nLi4uIik7CiAgICAgICB0cnkgewotICAgICAgICBUaHJlYWQuc2xlZXAoc2xlZXBGb3IgKiAxMDAwKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKHNsZWVwRm9yICogU0xFRVBfREVMQVkpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUgc2xlZXBpbmchIik7CiAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewogICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpZSk7CkBAIC0yNzQsMTYgKzI4MiwyOCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIT1NUID0gImxvY2FsaG9zdCI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPUlQgPSBJbnRlZ2VyLnZhbHVlT2YoCiAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0LnBvcnQiLCAiOTA5MCIpKTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU09DS0VUX1RJTUVPVVQgPSAxMDAwOworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTTEVFUF9ERUxBWSA9IDEwMDA7CisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNPQ0tFVF9USU1FT1VUID0gMTUwMDsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWHRydWN0IFhTVFJVQ1QgPSBuZXcgWHRydWN0KCJaZXJvIiwgKGJ5dGUpIDEsIC0zLCAtNSk7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFh0cnVjdDIgWFNUUlVDVDIgPSBuZXcgWHRydWN0MigoYnl0ZSkxLCBYU1RSVUNULCA1KTsKIAotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnkpIHRocm93cyBFeGNlcHRpb247CisgIHB1YmxpYyB2b2lkIHN0YXJ0U2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICBzdGFydFNlcnZlcihwcm9jZXNzb3IsIHByb3RvRmFjdG9yeSwgbnVsbCk7CisgIH0KKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnksIFRUcmFuc3BvcnRGYWN0b3J5IGZhY3RvcnkpIHRocm93cyBFeGNlcHRpb247CiAKICAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RvcFNlcnZlcigpIHRocm93cyBFeGNlcHRpb247CiAKICAgcHVibGljIGFic3RyYWN0IFRUcmFuc3BvcnQgZ2V0Q2xpZW50VHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZ1RyYW5zcG9ydCkgdGhyb3dzIEV4Y2VwdGlvbjsKIAorICBwcml2YXRlIHZvaWQgdGVzdEJvb2woVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGJvb2xlYW4gdCA9IHRlc3RDbGllbnQudGVzdEJvb2wodHJ1ZSk7CisgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHQpOworICAgIGJvb2xlYW4gZiA9IHRlc3RDbGllbnQudGVzdEJvb2woZmFsc2UpOworICAgIGFzc2VydEVxdWFscyhmYWxzZSwgZik7CisgIH0KKwogICBwcml2YXRlIHZvaWQgdGVzdEJ5dGUoVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGJ5dGUgaTggPSB0ZXN0Q2xpZW50LnRlc3RCeXRlKChieXRlKTEpOwogICAgIGFzc2VydEVxdWFscygxLCBpOCk7CkBAIC0zMTUsNyArMzM1LDcgQEAKICAgLy8gdG9kbzogYWRkIGFzc2VydGlvbnMKICAgcHJpdmF0ZSB2b2lkIHRlc3RJbnNhbml0eShUaHJpZnRUZXN0LkNsaWVudCB0ZXN0Q2xpZW50KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgSW5zYW5pdHkgaW5zYW5lOwotICAKKwogICAgIGluc2FuZSA9IG5ldyBJbnNhbml0eSgpOwogICAgIGluc2FuZS51c2VyTWFwID0gbmV3IEhhc2hNYXA8TnVtYmVyeiwgTG9uZz4oKTsKICAgICBpbnNhbmUudXNlck1hcC5wdXQoTnVtYmVyei5GSVZFLCAobG9uZyk1MDAwKTsKQEAgLTMzMyw3ICszNTMsNyBAQAogICAgIGZvciAobG9uZyBrZXkgOiB3aG9hLmtleVNldCgpKSB7CiAgICAgICBNYXA8TnVtYmVyeixJbnNhbml0eT4gdmFsID0gd2hvYS5nZXQoa2V5KTsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoa2V5ICsgIiA9PiB7Iik7Ci0gIAorCiAgICAgICBmb3IgKE51bWJlcnogazIgOiB2YWwua2V5U2V0KCkpIHsKICAgICAgICAgSW5zYW5pdHkgdjIgPSB2YWwuZ2V0KGsyKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludChrMiArICIgPT4geyIpOwpAQCAtMzQ1LDcgKzM2NSw3IEBACiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0sICIpOwotICAKKwogICAgICAgICBMaXN0PFh0cnVjdD4geHRydWN0cyA9IHYyLnh0cnVjdHM7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInsiKTsKICAgICAgICAgaWYgKHh0cnVjdHMgIT0gbnVsbCkgewpAQCAtMzU0LDcgKzM3NCw3IEBACiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0iKTsKLSAgCisKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7CiAgICAgICB9CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKQEAgLTM2MiwxMSArMzgyLDE0IEBACiAgICAgU3lzdGVtLm91dC5wcmludCgifVxuIik7CiAgIH0KIAorICBwdWJsaWMgYm9vbGVhbiB1c2VBc3luY1Byb2Nlc3NvcigpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIHB1YmxpYyB2b2lkIHRlc3RJdCgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgZm9yIChUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSA6IGdldFByb3RvY29scygpKSB7Ci0gICAgICBUZXN0SGFuZGxlciBoYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCk7Ci0gICAgICBUaHJpZnRUZXN0LlByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IoaGFuZGxlcik7CisgICAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciA9IHVzZUFzeW5jUHJvY2Vzc29yKCkgPyBuZXcgVGhyaWZ0VGVzdC5Bc3luY1Byb2Nlc3NvcjxBc3luY1Rlc3RIYW5kbGVyPihuZXcgQXN5bmNUZXN0SGFuZGxlcigpKSA6IG5ldyBUaHJpZnRUZXN0LlByb2Nlc3NvcjxUZXN0SGFuZGxlcj4obmV3IFRlc3RIYW5kbGVyKCkpOwogCiAgICAgICBzdGFydFNlcnZlcihwcm9jZXNzb3IsIHByb3RvRmFjdG9yeSk7CiAKQEAgLTM4MCw2ICs0MDMsNyBAQAogICAgICAgb3Blbih0cmFuc3BvcnQpOwogICAgICAgdGVzdFZvaWQodGVzdENsaWVudCk7CiAgICAgICB0ZXN0U3RyaW5nKHRlc3RDbGllbnQpOworICAgICAgdGVzdEJvb2wodGVzdENsaWVudCk7CiAgICAgICB0ZXN0Qnl0ZSh0ZXN0Q2xpZW50KTsKICAgICAgIHRlc3RJMzIodGVzdENsaWVudCk7CiAgICAgICB0ZXN0STY0KHRlc3RDbGllbnQpOwpAQCAtMzk0LDkgKzQxOCwxMSBAQAogICAgICAgdGVzdFR5cGVkZWYodGVzdENsaWVudCk7CiAgICAgICB0ZXN0TmVzdGVkTWFwKHRlc3RDbGllbnQpOwogICAgICAgdGVzdEluc2FuaXR5KHRlc3RDbGllbnQpOwotICAgICAgdGVzdE9uZXdheSh0ZXN0Q2xpZW50KTsKICAgICAgIHRlc3RFeGNlcHRpb24odGVzdENsaWVudCk7CisgICAgICB0ZXN0T25ld2F5KHRlc3RDbGllbnQpOworICAgICAgdGVzdEkzMih0ZXN0Q2xpZW50KTsKICAgICAgIHRyYW5zcG9ydC5jbG9zZSgpOworICAgICAgc29ja2V0LmNsb3NlKCk7CiAKICAgICAgIHN0b3BTZXJ2ZXIoKTsKICAgICB9CkBAIC00MDcsNyArNDMzLDcgQEAKICAgfQogCiAgIHB1YmxpYyBMaXN0PFRQcm90b2NvbEZhY3Rvcnk+IGdldFByb3RvY29scygpIHsKLSAgICByZXR1cm4gUFJPVE9DT0xTOyAgCisgICAgcmV0dXJuIFBST1RPQ09MUzsKICAgfQogCiAgIHByaXZhdGUgdm9pZCB0ZXN0TGlzdChUaHJpZnRUZXN0LkNsaWVudCB0ZXN0Q2xpZW50KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CkBAIC00NDMsMTQgKzQ2OSwxNCBAQAogICAgICAgdGVzdENsaWVudC50ZXN0TWFwTWFwKDEpOwogICAgIE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+PiBtYXBtYXAgPQogICAgICAgbmV3IEhhc2hNYXA8SW50ZWdlcixNYXA8SW50ZWdlcixJbnRlZ2VyPj4oKTsKLSAgCisKICAgICBIYXNoTWFwPEludGVnZXIsSW50ZWdlcj4gcG9zID0gbmV3IEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPigpOwogICAgIEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPiBuZWcgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+KCk7CiAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA1OyBpKyspIHsKICAgICAgIHBvcy5wdXQoaSwgaSk7CiAgICAgICBuZWcucHV0KC1pLCAtaSk7CiAgICAgfQotICAKKwogICAgIG1hcG1hcC5wdXQoNCwgcG9zKTsKICAgICBtYXBtYXAucHV0KC00LCBuZWcpOwogICAgIGFzc2VydEVxdWFscyhtYXBtYXAsIG1tKTsKQEAgLTQ2Miw3ICs0ODgsMTAgQEAKICAgfQogCiAgIHByaXZhdGUgdm9pZCB0ZXN0T25ld2F5KFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQpIHRocm93cyBFeGNlcHRpb24gewotICAgIHRlc3RDbGllbnQudGVzdE9uZXdheSgzKTsKKyAgICBsb25nIGJlZ2luID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgdGVzdENsaWVudC50ZXN0T25ld2F5KDEpOworICAgIGxvbmcgZWxhcHNlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gYmVnaW47CisgICAgYXNzZXJ0VHJ1ZShlbGFwc2VkIDwgNTAwKTsKICAgfQogCiAgIHByaXZhdGUgdm9pZCB0ZXN0U2V0KFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQpIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTQ5MSwxOSArNTIwLDE5MiBAQAogICAgIHRlc3RDbGllbnQudGVzdFZvaWQoKTsKICAgfQogCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIENhbGxDb3VudGluZ1RyYW5zcG9ydEZhY3RvcnkgZXh0ZW5kcyBUVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgcHVibGljIGludCBjb3VudCA9IDA7CisgICAgcHJpdmF0ZSBmaW5hbCBGYWN0b3J5IGZhY3Rvcnk7CisKKyAgICBwdWJsaWMgQ2FsbENvdW50aW5nVHJhbnNwb3J0RmFjdG9yeShGYWN0b3J5IGZhY3RvcnkpIHsKKyAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnMpIHsKKyAgICAgIGNvdW50Kys7CisgICAgICByZXR1cm4gZmFjdG9yeS5nZXRUcmFuc3BvcnQodHJhbnMpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc3BvcnRGYWN0b3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZm9yIChUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSA6IGdldFByb3RvY29scygpKSB7CisgICAgICBUZXN0SGFuZGxlciBoYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCk7CisgICAgICBUaHJpZnRUZXN0LlByb2Nlc3NvcjxUZXN0SGFuZGxlcj4gcHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yPFRlc3RIYW5kbGVyPihoYW5kbGVyKTsKKworICAgICAgZmluYWwgQ2FsbENvdW50aW5nVHJhbnNwb3J0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IENhbGxDb3VudGluZ1RyYW5zcG9ydEZhY3RvcnkobmV3IFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSgpKTsKKworICAgICAgc3RhcnRTZXJ2ZXIocHJvY2Vzc29yLCBwcm90b0ZhY3RvcnksIGZhY3RvcnkpOworICAgICAgYXNzZXJ0RXF1YWxzKDAsIGZhY3RvcnkuY291bnQpOworCisgICAgICBUU29ja2V0IHNvY2tldCA9IG5ldyBUU29ja2V0KEhPU1QsIFBPUlQpOworICAgICAgc29ja2V0LnNldFRpbWVvdXQoU09DS0VUX1RJTUVPVVQpOworICAgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQgPSBnZXRDbGllbnRUcmFuc3BvcnQoc29ja2V0KTsKKyAgICAgIG9wZW4odHJhbnNwb3J0KTsKKworICAgICAgVFByb3RvY29sIHByb3RvY29sID0gcHJvdG9GYWN0b3J5LmdldFByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICBUaHJpZnRUZXN0LkNsaWVudCB0ZXN0Q2xpZW50ID0gbmV3IFRocmlmdFRlc3QuQ2xpZW50KHByb3RvY29sKTsKKyAgICAgIGFzc2VydEVxdWFscygwLCB0ZXN0Q2xpZW50LnRlc3RCeXRlKChieXRlKSAwKSk7CisgICAgICBhc3NlcnRFcXVhbHMoMiwgZmFjdG9yeS5jb3VudCk7CisgICAgICBzb2NrZXQuY2xvc2UoKTsKKyAgICAgIHN0b3BTZXJ2ZXIoKTsKKyAgICB9CisgIH0KKwogICBwcml2YXRlIHZvaWQgdGVzdEV4Y2VwdGlvbihUaHJpZnRUZXN0LkNsaWVudCB0ZXN0Q2xpZW50KSB0aHJvd3MgVEV4Y2VwdGlvbiwgWGNlcHRpb24gewotICAgIC8vQFRPRE8gdGVzdEV4Y2VwdGlvbgotICAgIC8vdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iKTsKLSAgICAvKnRyeSB7Ci0gICAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKKyAgICB0cnkgeworICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpOworICAgICAgYXNzZXJ0IGZhbHNlOwogICAgIH0gY2F0Y2goWGNlcHRpb24gZSkgewotICAgIAlhc3NlcnRFcXVhbHMoZS5tZXNzYWdlLCAiWGNlcHRpb24iKTsKLSAgICB9Ki8KLSAgICAvKnRyeSB7Ci0gICAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiQXBwbGljYXRpb25FeGNlcHRpb24iKTsKKyAgICAgIGFzc2VydEVxdWFscyhlLm1lc3NhZ2UsICJYY2VwdGlvbiIpOworICAgICAgYXNzZXJ0RXF1YWxzKGUuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpOworICAgICAgYXNzZXJ0IGZhbHNlOwogICAgIH0gY2F0Y2goVEV4Y2VwdGlvbiBlKSB7Ci0gICAgCWFzc2VydEVxdWFscyhlLm1lc3NhZ2UsICJBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpOwotICAgIH0qLworICAgIH0KKyAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oIm5vIEV4Y2VwdGlvbiIpOworICB9CisKKworICBwdWJsaWMgc3RhdGljIGNsYXNzIEFzeW5jVGVzdEhhbmRsZXIgaW1wbGVtZW50cyBUaHJpZnRUZXN0LkFzeW5jSWZhY2UgeworCisgICAgVGVzdEhhbmRsZXIgaGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdFZvaWQoQXN5bmNNZXRob2RDYWxsYmFjazxWb2lkPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUobnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZyhTdHJpbmcgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8U3RyaW5nPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0U3RyaW5nKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEJvb2woYm9vbGVhbiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxCb29sZWFuPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0Qm9vbCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RCeXRlKGJ5dGUgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8Qnl0ZT4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEJ5dGUodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0STMyKGludCB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxJbnRlZ2VyPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0STMyKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEk2NChsb25nIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPExvbmc+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RJNjQodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlKGRvdWJsZSB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxEb3VibGU+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3REb3VibGUodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmluYXJ5KEJ5dGVCdWZmZXIgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8Qnl0ZUJ1ZmZlcj4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEJpbmFyeSh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3QoWHRydWN0IHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPFh0cnVjdD4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdFN0cnVjdCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0KFh0cnVjdDIgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8WHRydWN0Mj4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdE5lc3QodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFwKE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxNYXA8SW50ZWdlciwgSW50ZWdlcj4+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RNYXAodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nTWFwKE1hcDxTdHJpbmcsIFN0cmluZz4gdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TWFwPFN0cmluZywgU3RyaW5nPj4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdFN0cmluZ01hcCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXQoU2V0PEludGVnZXI+IHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPFNldDxJbnRlZ2VyPj4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdFNldCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0KExpc3Q8SW50ZWdlcj4gdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TGlzdDxJbnRlZ2VyPj4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdExpc3QodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW51bShOdW1iZXJ6IHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPE51bWJlcno+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RFbnVtKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdFR5cGVkZWYobG9uZyB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxMb25nPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0VHlwZWRlZih0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXBNYXAoaW50IGhlbGxvLCBBc3luY01ldGhvZENhbGxiYWNrPE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+Pj4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdE1hcE1hcChoZWxsbykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnNhbml0eShJbnNhbml0eSBhcmd1bWVudCwgQXN5bmNNZXRob2RDYWxsYmFjazxNYXA8TG9uZywgTWFwPE51bWJlcnosSW5zYW5pdHk+Pj4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEluc2FuaXR5KGFyZ3VtZW50KSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpKGJ5dGUgYXJnMCwgaW50IGFyZzEsIGxvbmcgYXJnMiwgTWFwPFNob3J0LCBTdHJpbmc+IGFyZzMsIE51bWJlcnogYXJnNCwgbG9uZyBhcmc1LCBBc3luY01ldGhvZENhbGxiYWNrPFh0cnVjdD4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdE11bHRpKGFyZzAsYXJnMSxhcmcyLGFyZzMsYXJnNCxhcmc1KSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbihTdHJpbmcgYXJnLCBBc3luY01ldGhvZENhbGxiYWNrPFZvaWQ+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RFeGNlcHRpb24oIithcmcrIilcbiIpOworICAgICAgaWYgKCJYY2VwdGlvbiIuZXF1YWxzKGFyZykpIHsKKyAgICAgICAgWGNlcHRpb24geCA9IG5ldyBYY2VwdGlvbigpOworICAgICAgICB4LmVycm9yQ29kZSA9IDEwMDE7CisgICAgICAgIHgubWVzc2FnZSA9IGFyZzsKKyAgICAgICAgLy8gdGhyb3cgYW5kIG9uRXJyb3IgeWllbGQgdGhlIHNhbWUgcmVzdWx0LgorICAgICAgICAvLyB0aHJvdyB4OworICAgICAgICByZXN1bHRIYW5kbGVyLm9uRXJyb3IoeCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0gZWxzZSBpZiAoIlRFeGNlcHRpb24iLmVxdWFscyhhcmcpKSB7CisgICAgICAgIC8vIHRocm93IGFuZCBvbkVycm9yIHlpZWxkIHRoZSBzYW1lIHJlc3VsdC4KKyAgICAgICAgLy8gcmVzdWx0SGFuZGxlci5vbkVycm9yKG5ldyBURXhjZXB0aW9uKGFyZykpOworICAgICAgICAvLyByZXR1cm47CisgICAgICAgIC8vIFVuc3BlY2lmaWVkIGV4Y2VwdGlvbiBzaG91bGQgeWllbGQgYSBUQXBwbGljYXRpb25FeGNlcHRpb24gb24gY2xpZW50IHNpZGUKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oYXJnKTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlFeGNlcHRpb24oU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBBc3luY01ldGhvZENhbGxiYWNrPFh0cnVjdD4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgLy9UbyBjaGFuZ2UgYm9keSBvZiBpbXBsZW1lbnRlZCBtZXRob2RzIHVzZSBGaWxlIHwgU2V0dGluZ3MgfCBGaWxlIFRlbXBsYXRlcy4KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25ld2F5KGludCBzZWNvbmRzVG9TbGVlcCwgQXN5bmNNZXRob2RDYWxsYmFjazxWb2lkPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBoYW5kbGVyLnRlc3RPbmV3YXkoc2Vjb25kc1RvU2xlZXApOworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKG51bGwpOworICAgIH0KICAgfQogCiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UZXN0QXN5bmNTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1Rlc3RBc3luY1NlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YzU0Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UZXN0QXN5bmNTZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKKworcHVibGljIGNsYXNzIFRlc3RBc3luY1NlcnZlciBleHRlbmRzIFRlc3ROb25ibG9ja2luZ1NlcnZlciB7CisKKyAgIEBPdmVycmlkZQorICAgcHVibGljIGJvb2xlYW4gdXNlQXN5bmNQcm9jZXNzb3IoKXsKKyAgICAgICByZXR1cm4gdHJ1ZTsKKyAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVGVzdE5vbmJsb2NraW5nU2VydmVyLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YQppbmRleCA1MmI2MmMzLi4zZGYzYmQ4IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YQpAQCAtMjAsMzEgKzIwLDQyIEBACiAKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlROb25ibG9ja2luZ1NlcnZlci5BcmdzOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTb2NrZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRGYWN0b3J5OworCitpbXBvcnQgdGhyaWZ0LnRlc3QuVGhyaWZ0VGVzdDsKIAogcHVibGljIGNsYXNzIFRlc3ROb25ibG9ja2luZ1NlcnZlciBleHRlbmRzIFNlcnZlclRlc3RCYXNlIHsKIAogICBwcml2YXRlIFRocmVhZCBzZXJ2ZXJUaHJlYWQ7CiAgIHByaXZhdGUgVFNlcnZlciBzZXJ2ZXI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fUVVFUklFUyA9IDEwMDA7CiAKLSAgcHJvdGVjdGVkIFRTZXJ2ZXIgZ2V0U2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgc29ja2V0LCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSkgewotICAgIHJldHVybiBuZXcgVE5vbmJsb2NraW5nU2VydmVyKG5ldyBBcmdzKHNvY2tldCkucHJvY2Vzc29yKHByb2Nlc3NvcikucHJvdG9jb2xGYWN0b3J5KHByb3RvRmFjdG9yeSkpOworICBwcm90ZWN0ZWQgVFNlcnZlciBnZXRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFROb25ibG9ja2luZ1NlcnZlclNvY2tldCBzb2NrZXQsIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9GYWN0b3J5LCBUVHJhbnNwb3J0RmFjdG9yeSBmYWN0b3J5KSB7CisgICAgZmluYWwgQXJncyBhcmdzID0gbmV3IEFyZ3Moc29ja2V0KS5wcm9jZXNzb3IocHJvY2Vzc29yKS5wcm90b2NvbEZhY3RvcnkocHJvdG9GYWN0b3J5KTsKKyAgICBpZiAoZmFjdG9yeSAhPSBudWxsKSB7CisgICAgICBhcmdzLnRyYW5zcG9ydEZhY3RvcnkoZmFjdG9yeSk7CisgICAgfQorICAgIHJldHVybiBuZXcgVE5vbmJsb2NraW5nU2VydmVyKGFyZ3MpOwogICB9CiAKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHN0YXJ0U2VydmVyKGZpbmFsIFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBmaW5hbCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgIHB1YmxpYyB2b2lkIHN0YXJ0U2VydmVyKGZpbmFsIFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBmaW5hbCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSwgZmluYWwgVFRyYW5zcG9ydEZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgc2VydmVyVGhyZWFkID0gbmV3IFRocmVhZCgpIHsKICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAvLyBUcmFuc3BvcnQKICAgICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgdFNlcnZlclNvY2tldCA9Ci0gICAgICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KFBPUlQpOworICAgICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Lk5vbmJsb2NraW5nQWJzdHJhY3RTZXJ2ZXJTb2NrZXRBcmdzKCkucG9ydChQT1JUKSk7CiAKLSAgICAgICAgICBzZXJ2ZXIgPSBnZXRTZXJ2ZXIocHJvY2Vzc29yLCB0U2VydmVyU29ja2V0LCBwcm90b0ZhY3RvcnkpOworICAgICAgICAgIHNlcnZlciA9IGdldFNlcnZlcihwcm9jZXNzb3IsIHRTZXJ2ZXJTb2NrZXQsIHByb3RvRmFjdG9yeSwgZmFjdG9yeSk7CiAKICAgICAgICAgICAvLyBSdW4gaXQKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIgb24gcG9ydCAiICsgUE9SVCArICIuLi4iKTsKQEAgLTcxLDQgKzgyLDQyIEBACiAgIHB1YmxpYyBUVHJhbnNwb3J0IGdldENsaWVudFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmdUcmFuc3BvcnQpIHRocm93cyBFeGNlcHRpb24gewogICAgIHJldHVybiBuZXcgVEZyYW1lZFRyYW5zcG9ydCh1bmRlcmx5aW5nVHJhbnNwb3J0KTsKICAgfQorCisKKyAgcHVibGljIHZvaWQgdGVzdENsZWFudXBBbGxTZWxlY3Rpb25LZXlzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZm9yIChUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSA6IGdldFByb3RvY29scygpKSB7CisgICAgICBUZXN0SGFuZGxlciBoYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCk7CisgICAgICBUaHJpZnRUZXN0LlByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IoaGFuZGxlcik7CisKKyAgICAgIHN0YXJ0U2VydmVyKHByb2Nlc3NvciwgcHJvdG9GYWN0b3J5KTsKKworICAgICAgVFNvY2tldCBzb2NrZXQgPSBuZXcgVFNvY2tldChIT1NULCBQT1JUKTsKKyAgICAgIHNvY2tldC5zZXRUaW1lb3V0KFNPQ0tFVF9USU1FT1VUKTsKKyAgICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gZ2V0Q2xpZW50VHJhbnNwb3J0KHNvY2tldCk7CisKKyAgICAgIFRQcm90b2NvbCBwcm90b2NvbCA9IHByb3RvRmFjdG9yeS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCA9IG5ldyBUaHJpZnRUZXN0LkNsaWVudChwcm90b2NvbCk7CisKKyAgICAgIG9wZW4odHJhbnNwb3J0KTsKKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fUVVFUklFUzsgKytpKSB7CisgICAgICAgIHRlc3RDbGllbnQudGVzdEkzMigxKTsKKyAgICAgIH0KKyAgICAgIHNlcnZlci5zdG9wKCk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9RVUVSSUVTOyArK2kpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICB0ZXN0Q2xpZW50LnRlc3RJMzIoMSk7CisgICAgICAgIH0gY2F0Y2goVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUpOworICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgaWYgKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIGphdmEubmV0LlNvY2tldFRpbWVvdXRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIGZhaWwoInRpbWVkIG91dCB3aGVuIGl0IHNob3VsZCBoYXZlIHRocm93biBhbm90aGVyIGtpbmQgb2YgZXJyb3IhIik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRyYW5zcG9ydC5jbG9zZSgpOworICAgICAgc3RvcFNlcnZlcigpOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVGVzdFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1Rlc3RUaHJlYWRlZFNlbGVjdG9yU2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3MjlhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1Rlc3RUaHJlYWRlZFNlbGVjdG9yU2VydmVyLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UUHJvY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRUaHJlYWRlZFNlbGVjdG9yU2VydmVyLkFyZ3M7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1NlcnZlclNvY2tldDsKKworcHVibGljIGNsYXNzIFRlc3RUaHJlYWRlZFNlbGVjdG9yU2VydmVyIGV4dGVuZHMgVGVzdE5vbmJsb2NraW5nU2VydmVyIHsKKyAgcHJvdGVjdGVkIFRTZXJ2ZXIgZ2V0U2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgc29ja2V0LCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSkgeworICAgIHJldHVybiBuZXcgVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIobmV3IEFyZ3Moc29ja2V0KS5wcm9jZXNzb3IocHJvY2Vzc29yKS5wcm90b2NvbEZhY3RvcnkocHJvdG9GYWN0b3J5KSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0Q2xpZW50LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdENsaWVudC5qYXZhCmluZGV4IGFlZTNiYmYuLmZlYWE5NzIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0Q2xpZW50LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RDbGllbnQuamF2YQpAQCAtMTksMjUgKzE5LDQwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudGVzdDsKIAotLy8gR2VuZXJhdGVkIGNvZGUKLWltcG9ydCB0aHJpZnQudGVzdC4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU29ja2V0OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USHR0cENsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNpbXBsZUpTT05Qcm90b2NvbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UU2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5USlNPTlByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU2ltcGxlSlNPTlByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5URmFzdEZyYW1lZFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEh0dHBDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTU0xUcmFuc3BvcnRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU29ja2V0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOworCisvLyBHZW5lcmF0ZWQgY29kZQoraW1wb3J0IHRocmlmdC50ZXN0Lkluc2FuaXR5OworaW1wb3J0IHRocmlmdC50ZXN0Lk51bWJlcno7CitpbXBvcnQgdGhyaWZ0LnRlc3QuU2Vjb25kU2VydmljZTsKK2ltcG9ydCB0aHJpZnQudGVzdC5UaHJpZnRUZXN0OworaW1wb3J0IHRocmlmdC50ZXN0LlhjZXB0aW9uOworaW1wb3J0IHRocmlmdC50ZXN0LlhjZXB0aW9uMjsKK2ltcG9ydCB0aHJpZnQudGVzdC5YdHJ1Y3Q7CitpbXBvcnQgdGhyaWZ0LnRlc3QuWHRydWN0MjsKIAogLyoqCiAgKiBUZXN0IEphdmEgY2xpZW50IGZvciB0aHJpZnQuIEVzc2VudGlhbGx5IGp1c3QgYSBjb3B5IG9mIHRoZSBDKysgdmVyc2lvbiwKQEAgLTQ2LDcwICs2MSwxNTEgQEAKICAqCiAgKi8KIHB1YmxpYyBjbGFzcyBUZXN0Q2xpZW50IHsKKworICBwcml2YXRlIHN0YXRpYyBpbnQgRVJSX0JBU0VUWVBFUyA9IDE7CisgIHByaXZhdGUgc3RhdGljIGludCBFUlJfU1RSVUNUUyA9IDI7CisgIHByaXZhdGUgc3RhdGljIGludCBFUlJfQ09OVEFJTkVSUyA9IDQ7CisgIHByaXZhdGUgc3RhdGljIGludCBFUlJfRVhDRVBUSU9OUyA9IDg7CisgIHByaXZhdGUgc3RhdGljIGludCBFUlJfUFJPVE9DT0xTID0gMTY7CisgIHByaXZhdGUgc3RhdGljIGludCBFUlJfVU5LTk9XTiA9IDY0OworCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7CisgICAgU3RyaW5nIGhvc3QgPSAibG9jYWxob3N0IjsKKyAgICBpbnQgcG9ydCA9IDkwOTA7CisgICAgaW50IG51bVRlc3RzID0gMTsKKyAgICBTdHJpbmcgcHJvdG9jb2xfdHlwZSA9ICJiaW5hcnkiOworICAgIFN0cmluZyB0cmFuc3BvcnRfdHlwZSA9ICJidWZmZXJlZCI7CisgICAgYm9vbGVhbiBzc2wgPSBmYWxzZTsKKworICAgIGludCBzb2NrZXRUaW1lb3V0ID0gMTAwMDsKKwogICAgIHRyeSB7Ci0gICAgICBTdHJpbmcgaG9zdCA9ICJsb2NhbGhvc3QiOwotICAgICAgaW50IHBvcnQgPSA5MDkwOwotICAgICAgU3RyaW5nIHVybCA9IG51bGw7Ci0gICAgICBpbnQgbnVtVGVzdHMgPSAxOwotICAgICAgYm9vbGVhbiBmcmFtZWQgPSBmYWxzZTsKLQotICAgICAgaW50IHNvY2tldFRpbWVvdXQgPSAxMDAwOwotCi0gICAgICB0cnkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi1oIikpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGhvc3Rwb3J0ID0gKGFyZ3NbKytpXSkuc3BsaXQoIjoiKTsKLSAgICAgICAgICAgIGhvc3QgPSBob3N0cG9ydFswXTsKLSAgICAgICAgICAgIHBvcnQgPSBJbnRlZ2VyLnZhbHVlT2YoaG9zdHBvcnRbMV0pOwotICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1mIikgfHwgYXJnc1tpXS5lcXVhbHMoIi1mcmFtZWQiKSkgewotICAgICAgICAgICAgZnJhbWVkID0gdHJ1ZTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItdSIpKSB7Ci0gICAgICAgICAgICB1cmwgPSBhcmdzWysraV07Ci0gICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLW4iKSkgewotICAgICAgICAgICAgbnVtVGVzdHMgPSBJbnRlZ2VyLnZhbHVlT2YoYXJnc1srK2ldKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItdGltZW91dCIpKSB7Ci0gICAgICAgICAgICBzb2NrZXRUaW1lb3V0ID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbKytpXSk7Ci0gICAgICAgICAgfQorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgKytpKSB7CisgICAgICAgIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0taG9zdCIpKSB7CisgICAgICAgICAgaG9zdCA9IGFyZ3NbaV0uc3BsaXQoIj0iKVsxXTsKKyAgICAgICAgICBob3N0LnRyaW0oKTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tcG9ydCIpKSB7CisgICAgICAgICAgcG9ydCA9IEludGVnZXIudmFsdWVPZihhcmdzW2ldLnNwbGl0KCI9IilbMV0pOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1uIikgfHwKKyAgICAgICAgICAgIGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS10ZXN0bG9vcHMiKSl7CisgICAgICAgICAgbnVtVGVzdHMgPSBJbnRlZ2VyLnZhbHVlT2YoYXJnc1tpXS5zcGxpdCgiPSIpWzFdKTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS10aW1lb3V0IikpIHsKKyAgICAgICAgICBzb2NrZXRUaW1lb3V0ID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbaV0uc3BsaXQoIj0iKVsxXSk7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItLXByb3RvY29sIikpIHsKKyAgICAgICAgICBwcm90b2NvbF90eXBlID0gYXJnc1tpXS5zcGxpdCgiPSIpWzFdOworICAgICAgICAgIHByb3RvY29sX3R5cGUudHJpbSgpOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS10cmFuc3BvcnQiKSkgeworICAgICAgICAgIHRyYW5zcG9ydF90eXBlID0gYXJnc1tpXS5zcGxpdCgiPSIpWzFdOworICAgICAgICAgIHRyYW5zcG9ydF90eXBlLnRyaW0oKTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1zc2wiKSkgeworICAgICAgICAgIHNzbCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0taGVscCIpKSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBbGxvd2VkIG9wdGlvbnM6Iik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0taGVscFx0XHRcdFByb2R1Y2UgaGVscCBtZXNzYWdlIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0taG9zdD1hcmcgKD0iICsgaG9zdCArICIpXHRIb3N0IHRvIGNvbm5lY3QiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1wb3J0PWFyZyAoPSIgKyBwb3J0ICsgIilcdFBvcnQgbnVtYmVyIHRvIGNvbm5lY3QiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS10cmFuc3BvcnQ9YXJnICg9IiArIHRyYW5zcG9ydF90eXBlICsgIilcblx0XHRcdFx0VHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBmYXN0ZnJhbWVkLCBodHRwIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tcHJvdG9jb2w9YXJnICg9IiArIHByb3RvY29sX3R5cGUgKyAiKVx0UHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbiwgbXVsdGksIG11bHRpYywgbXVsdGlqIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tc3NsXHRcdFx0RW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS10ZXN0bG9vcHNbLS1uXT1hcmcgKD0iICsgbnVtVGVzdHMgKyAiKVx0TnVtYmVyIG9mIFRlc3RzIik7CisgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CiAgICAgICAgIH0KLSAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7Ci0gICAgICAgIHgucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICB9CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2FuIG5vdCBwYXJzZSBhcmd1bWVudHMhIFNlZSAtLWhlbHAiKTsKKyAgICAgIFN5c3RlbS5leGl0KEVSUl9VTktOT1dOKTsKKyAgICB9CiAKLSAgICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0OworICAgIHRyeSB7CisgICAgICBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImJpbmFyeSIpKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJjb21wYWN0IikpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImpzb24iKSkgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGkiKSkgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGljIikpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpaiIpKSB7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVbmtub3duIHByb3RvY29sIHR5cGUhICIgKyBwcm90b2NvbF90eXBlKTsKKyAgICAgIH0KKyAgICAgIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImJ1ZmZlcmVkIikpIHsKKyAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUuZXF1YWxzKCJmcmFtZWQiKSkgeworICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImZhc3RmcmFtZWQiKSkgeworICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImh0dHAiKSkgeworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5rbm93biB0cmFuc3BvcnQgdHlwZSEgIiArIHRyYW5zcG9ydF90eXBlKTsKKyAgICAgIH0KKyAgICAgIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImh0dHAiKSAmJiBzc2wgPT0gdHJ1ZSkgeworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJTU0wgaXMgbm90IHN1cHBvcnRlZCBvdmVyIGh0dHAuIik7CisgICAgICB9CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICBTeXN0ZW0uZXhpdChFUlJfVU5LTk9XTik7CisgICAgfQogCi0gICAgICBpZiAodXJsICE9IG51bGwpIHsKKyAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgaWYgKHRyYW5zcG9ydF90eXBlLmVxdWFscygiaHR0cCIpKSB7CisgICAgICAgIFN0cmluZyB1cmwgPSAiaHR0cDovLyIgKyBob3N0ICsgIjoiICsgcG9ydCArICIvc2VydmljZSI7CiAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUSHR0cENsaWVudCh1cmwpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgVFNvY2tldCBzb2NrZXQgPSBuZXcgVFNvY2tldChob3N0LCBwb3J0KTsKKyAgICAgICAgVFNvY2tldCBzb2NrZXQgPSBudWxsOworICAgICAgICBpZiAoc3NsID09IHRydWUpIHsKKyAgICAgICAgICBzb2NrZXQgPSBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRDbGllbnRTb2NrZXQoaG9zdCwgcG9ydCwgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc29ja2V0ID0gbmV3IFRTb2NrZXQoaG9zdCwgcG9ydCk7CisgICAgICAgIH0KICAgICAgICAgc29ja2V0LnNldFRpbWVvdXQoc29ja2V0VGltZW91dCk7CiAgICAgICAgIHRyYW5zcG9ydCA9IHNvY2tldDsKLSAgICAgICAgaWYgKGZyYW1lZCkgeworICAgICAgICBpZiAodHJhbnNwb3J0X3R5cGUuZXF1YWxzKCJidWZmZXJlZCIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUuZXF1YWxzKCJmcmFtZWQiKSkgewogICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zcG9ydCk7CisgICAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUuZXF1YWxzKCJmYXN0ZnJhbWVkIikpIHsKKyAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVEZhc3RGcmFtZWRUcmFuc3BvcnQodHJhbnNwb3J0KTsKICAgICAgICAgfQogICAgICAgfQorICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICB4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgU3lzdGVtLmV4aXQoRVJSX1VOS05PV04pOworICAgIH0KIAotICAgICAgVEJpbmFyeVByb3RvY29sIGJpbmFyeVByb3RvY29sID0KLSAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOwotICAgICAgVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCA9Ci0gICAgICAgIG5ldyBUaHJpZnRUZXN0LkNsaWVudChiaW5hcnlQcm90b2NvbCk7Ci0gICAgICBJbnNhbml0eSBpbnNhbmUgPSBuZXcgSW5zYW5pdHkoKTsKKyAgICBUUHJvdG9jb2wgdFByb3RvY29sID0gbnVsbDsKKyAgICBUUHJvdG9jb2wgdFByb3RvY29sMiA9IG51bGw7CisgICAgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJqc29uIikgfHwgcHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpaiIpKSB7CisgICAgICB0UHJvdG9jb2wgPSBuZXcgVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImNvbXBhY3QiKSB8fCBwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGljIikpIHsKKyAgICAgIHRQcm90b2NvbCA9IG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRQcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICB9CiAKLSAgICAgIGxvbmcgdGltZU1pbiA9IDA7Ci0gICAgICBsb25nIHRpbWVNYXggPSAwOwotICAgICAgbG9uZyB0aW1lVG90ID0gMDsKKyAgICBpZiAocHJvdG9jb2xfdHlwZS5zdGFydHNXaXRoKCJtdWx0aSIpKSB7CisgICAgICB0UHJvdG9jb2wyID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHRQcm90b2NvbCwgIlNlY29uZFNlcnZpY2UiKTsKKyAgICAgIHRQcm90b2NvbCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbCh0UHJvdG9jb2wsICJUaHJpZnRUZXN0Iik7CisgICAgfQogCi0gICAgICBmb3IgKGludCB0ZXN0ID0gMDsgdGVzdCA8IG51bVRlc3RzOyArK3Rlc3QpIHsKKyAgICBUaHJpZnRUZXN0LkNsaWVudCB0ZXN0Q2xpZW50ID0gbmV3IFRocmlmdFRlc3QuQ2xpZW50KHRQcm90b2NvbCk7CisgICAgSW5zYW5pdHkgaW5zYW5lID0gbmV3IEluc2FuaXR5KCk7CiAKKyAgICBsb25nIHRpbWVNaW4gPSAwOworICAgIGxvbmcgdGltZU1heCA9IDA7CisgICAgbG9uZyB0aW1lVG90ID0gMDsKKworICAgIGludCByZXR1cm5Db2RlID0gMDsKKyAgICBmb3IgKGludCB0ZXN0ID0gMDsgdGVzdCA8IG51bVRlc3RzOyArK3Rlc3QpIHsKKyAgICAgIHRyeSB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBDT05ORUNUIFRFU1QKICAgICAgICAgICovCiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCAjIiArICh0ZXN0KzEpICsgIiwgIiArICJjb25uZWN0ICIgKyBob3N0ICsgIjoiICsgcG9ydCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKLSAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbm5lY3QgZmFpbGVkOiAiICsgdHR4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKHRyYW5zcG9ydC5pc09wZW4oKSA9PSBmYWxzZSkgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cmFuc3BvcnQub3BlbigpOworICAgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICAgICAgICB0dHgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbm5lY3QgZmFpbGVkOiAiICsgdHR4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdChFUlJfVU5LTk9XTik7CisgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpOwpAQCAtMTIzLDYgKzIxOSw3IEBACiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gdm9pZFxuIik7CiAgICAgICAgIH0gY2F0Y2ggKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB0YXgpIHsKICAgICAgICAgICB0YXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0xMzEsMTMgKzIyOCwzNCBAQAogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0U3RyaW5nKFwiVGVzdFwiKSIpOwogICAgICAgICBTdHJpbmcgcyA9IHRlc3RDbGllbnQudGVzdFN0cmluZygiVGVzdCIpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSBcIiIgKyBzICsgIlwiXG4iKTsKKyAgICAgICAgaWYgKCFzLmVxdWFscygiVGVzdCIpKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBNdWx0aXBsZXhlZCB0ZXN0CisgICAgICAgICAqLworICAgICAgICBpZiAocHJvdG9jb2xfdHlwZS5zdGFydHNXaXRoKCJtdWx0aSIpKSB7CisgICAgICAgICAgU2Vjb25kU2VydmljZS5DbGllbnQgc2Vjb25kQ2xpZW50ID0gbmV3IFNlY29uZFNlcnZpY2UuQ2xpZW50KHRQcm90b2NvbDIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInNlY29uZHRlc3RTdHJpbmcoXCJUZXN0MlwiKSIpOworICAgICAgICAgIHMgPSBzZWNvbmRDbGllbnQuc2Vjb25kdGVzdFN0cmluZygiVGVzdDIiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSBcIiIgKyBzICsgIlwiXG4iKTsKKyAgICAgICAgICBpZiAoIXMuZXF1YWxzKCJ0ZXN0U3RyaW5nKFwiVGVzdDJcIikiKSkgeworICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfUFJPVE9DT0xTOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKioKICAgICAgICAgICogQllURSBURVNUCiAgICAgICAgICAqLwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Qnl0ZSgxKSIpOwogICAgICAgICBieXRlIGk4ID0gdGVzdENsaWVudC50ZXN0Qnl0ZSgoYnl0ZSkxKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIGk4ICsgIlxuIik7CisgICAgICAgIGlmIChpOCAhPSAxKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJMzIgVEVTVApAQCAtMTQ1LDYgKzI2MywxMCBAQAogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0STMyKC0xKSIpOwogICAgICAgICBpbnQgaTMyID0gdGVzdENsaWVudC50ZXN0STMyKC0xKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIGkzMiArICJcbiIpOworICAgICAgICBpZiAoaTMyICE9IC0xKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJNjQgVEVTVApAQCAtMTUyLDEzICsyNzQsNTIgQEAKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7CiAgICAgICAgIGxvbmcgaTY0ID0gdGVzdENsaWVudC50ZXN0STY0KC0zNDM1OTczODM2OEwpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgaTY0ICsgIlxuIik7CisgICAgICAgIGlmIChpNjQgIT0gLTM0MzU5NzM4MzY4TCkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogRE9VQkxFIFRFU1QKICAgICAgICAgICovCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3REb3VibGUoNS4zMjUwOTgyMzUpIik7Ci0gICAgICAgIGRvdWJsZSBkdWIgPSB0ZXN0Q2xpZW50LnRlc3REb3VibGUoNS4zMjUwOTgyMzUpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RG91YmxlKC01LjMyNTA5ODIzNSkiKTsKKyAgICAgICAgZG91YmxlIGR1YiA9IHRlc3RDbGllbnQudGVzdERvdWJsZSgtNS4zMjUwOTgyMzUpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgZHViICsgIlxuIik7CisgICAgICAgIGlmIChNYXRoLmFicyhkdWIgLSAoLTUuMzI1MDk4MjM1KSkgPiAwLjAwMSkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQklOQVJZIFRFU1QKKyAgICAgICAgICovCisgICAgICAgIHRyeSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEJpbmFyeSgtMTI4Li4uMTI3KSA9ICIpOworICAgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbXSB7LTEyOCwgLTEyNywgLTEyNiwgLTEyNSwgLTEyNCwgLTEyMywgLTEyMiwgLTEyMSwgLTEyMCwgLTExOSwgLTExOCwgLTExNywgLTExNiwgLTExNSwgLTExNCwgLTExMywgLTExMiwgLTExMSwgLTExMCwgLTEwOSwgLTEwOCwgLTEwNywgLTEwNiwgLTEwNSwgLTEwNCwgLTEwMywgLTEwMiwgLTEwMSwgLTEwMCwgLTk5LCAtOTgsIC05NywgLTk2LCAtOTUsIC05NCwgLTkzLCAtOTIsIC05MSwgLTkwLCAtODksIC04OCwgLTg3LCAtODYsIC04NSwgLTg0LCAtODMsIC04MiwgLTgxLCAtODAsIC03OSwgLTc4LCAtNzcsIC03NiwgLTc1LCAtNzQsIC03MywgLTcyLCAtNzEsIC03MCwgLTY5LCAtNjgsIC02NywgLTY2LCAtNjUsIC02NCwgLTYzLCAtNjIsIC02MSwgLTYwLCAtNTksIC01OCwgLTU3LCAtNTYsIC01NSwgLTU0LCAtNTMsIC01MiwgLTUxLCAtNTAsIC00OSwgLTQ4LCAtNDcsIC00NiwgLTQ1LCAtNDQsIC00MywgLTQyLCAtNDEsIC00MCwgLTM5LCAtMzgsIC0zNywgLTM2LCAtMzUsIC0zNCwgLTMzLCAtMzIsIC0zMSwgLTMwLCAtMjksIC0yOCwgLTI3LCAtMjYsIC0yNSwgLTI0LCAtMjMsIC0yMiwgLTIxLCAtMjAsIC0xOSwgLTE4LCAtMTcsIC0xNiwgLTE1LCAtMTQsIC0xMywgLTEyLCAtMTEsIC0xMCwgLTksIC04LCAtNywgLTYsIC01LCAtNCwgLTMsIC0yLCAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjQsIDY1LCA2NiwgNjcsIDY4LCA2OSwgNzAsIDcxLCA3MiwgNzMsIDc0LCA3NSwgNzYsIDc3LCA3OCwgNzksIDgwLCA4MSwgODIsIDgzLCA4NCwgODUsIDg2LCA4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3fTsKKyAgICAgICAgICBCeXRlQnVmZmVyIGJpbiA9IHRlc3RDbGllbnQudGVzdEJpbmFyeShCeXRlQnVmZmVyLndyYXAoZGF0YSkpOworICAgICAgICAgIGJpbi5tYXJrKCk7CisgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbYmluLmxpbWl0KCkgLSBiaW4ucG9zaXRpb24oKV07CisgICAgICAgICAgYmluLmdldChieXRlcyk7CisgICAgICAgICAgYmluLnJlc2V0KCk7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieyIpOworICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLCAiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoYnl0ZXNbaV0pOworICAgICAgICAgIH0KKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIn0iKTsKKyAgICAgICAgICBpZiAoIUJ5dGVCdWZmZXIud3JhcChkYXRhKS5lcXVhbHMoYmluKSkgeworICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG4qKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKyAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBTVFJVQ1QgVEVTVApAQCAtMTcwLDcgKzMzMSwxNSBAQAogICAgICAgICBvdXQuaTMyX3RoaW5nID0gLTM7CiAgICAgICAgIG91dC5pNjRfdGhpbmcgPSAtNTsKICAgICAgICAgWHRydWN0IGluID0gdGVzdENsaWVudC50ZXN0U3RydWN0KG91dCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHsiICsgIlwiIiArIGluLnN0cmluZ190aGluZyArICJcIiwgIiArIGluLmJ5dGVfdGhpbmcgKyAiLCAiICsgaW4uaTMyX3RoaW5nICsgIiwgIiArIGluLmk2NF90aGluZyArICJ9XG4iKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0geyIgKyAiXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbi5zdHJpbmdfdGhpbmcgKyAiXCIsIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgaW4uYnl0ZV90aGluZyArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGluLmkzMl90aGluZyArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGluLmk2NF90aGluZyArICJ9XG4iKTsKKyAgICAgICAgaWYgKCFpbi5lcXVhbHMob3V0KSkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB9CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIE5FU1RFRCBTVFJVQ1QgVEVTVApAQCAtMTgyLDcgKzM1MSwxNiBAQAogICAgICAgICBvdXQyLmkzMl90aGluZyA9IDU7CiAgICAgICAgIFh0cnVjdDIgaW4yID0gdGVzdENsaWVudC50ZXN0TmVzdChvdXQyKTsKICAgICAgICAgaW4gPSBpbjIuc3RydWN0X3RoaW5nOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSB7IiArIGluMi5ieXRlX3RoaW5nICsgIiwgeyIgKyAiXCIiICsgaW4uc3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaW4uYnl0ZV90aGluZyArICIsICIgKyBpbi5pMzJfdGhpbmcgKyAiLCAiICsgaW4uaTY0X3RoaW5nICsgIn0sICIgKyBpbjIuaTMyX3RoaW5nICsgIn1cbiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSB7IiArIGluMi5ieXRlX3RoaW5nICsgIiwgeyIgKyAiXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbi5zdHJpbmdfdGhpbmcgKyAiXCIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGluLmJ5dGVfdGhpbmcgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbi5pMzJfdGhpbmcgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbi5pNjRfdGhpbmcgKyAifSwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgaW4yLmkzMl90aGluZyArICJ9XG4iKTsKKyAgICAgICAgaWYgKCFpbjIuZXF1YWxzKG91dDIpKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogTUFQIFRFU1QKQEAgLTIxNCw2ICszOTIsNDkgQEAKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGtleSArICIgPT4gIiArIG1hcG91dC5nZXQoa2V5KSk7CiAgICAgICAgIH0KICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifVxuIik7CisgICAgICAgIGlmICghbWFwb3V0LmVxdWFscyhtYXBpbikpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTVFJJTkcgTUFQIFRFU1QKKyAgICAgICAgICovCisgICAgICAgIHRyeSB7CisgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBzbWFwb3V0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgICAgc21hcG91dC5wdXQoImEiLCAiMiIpOworICAgICAgICAgIHNtYXBvdXQucHV0KCJiIiwgImJsYWgiKTsKKyAgICAgICAgICBzbWFwb3V0LnB1dCgic29tZSIsICJ0aGluZyIpOworICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IHNtYXBvdXQua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoa2V5ICsgIiA9PiAiICsgc21hcG91dC5nZXQoa2V5KSk7CisgICAgICAgICAgfQorICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0pIik7CisgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBzbWFwaW4gPSB0ZXN0Q2xpZW50LnRlc3RTdHJpbmdNYXAoc21hcG91dCk7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0geyIpOworICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBzbWFwaW4ua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoa2V5ICsgIiA9PiAiICsgc21hcG91dC5nZXQoa2V5KSk7CisgICAgICAgICAgfQorICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOworICAgICAgICAgIGlmICghc21hcG91dC5lcXVhbHMoc21hcGluKSkgeworICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKyAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBTRVQgVEVTVApAQCAtMjQ1LDYgKzQ2NiwxMCBAQAogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoZWxlbSk7CiAgICAgICAgIH0KICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifVxuIik7CisgICAgICAgIGlmICghc2V0b3V0LmVxdWFscyhzZXRpbikpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBMSVNUIFRFU1QKQEAgLTI3Niw2ICs1MDEsMTAgQEAKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGVsZW0pOwogICAgICAgICB9CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOworICAgICAgICBpZiAoIWxpc3RvdXQuZXF1YWxzKGxpc3RpbikpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBFTlVNIFRFU1QKQEAgLTI4MywyMiArNTEyLDQyIEBACiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RFbnVtKE9ORSkiKTsKICAgICAgICAgTnVtYmVyeiByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcnouT05FKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIHJldCArICJcbiIpOworICAgICAgICBpZiAocmV0ICE9IE51bWJlcnouT05FKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KIAogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RW51bShUV08pIik7CiAgICAgICAgIHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oTnVtYmVyei5UV08pOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgcmV0ICsgIlxuIik7CisgICAgICAgIGlmIChyZXQgIT0gTnVtYmVyei5UV08pIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQogCiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RFbnVtKFRIUkVFKSIpOwogICAgICAgICByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcnouVEhSRUUpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgcmV0ICsgIlxuIik7CisgICAgICAgIGlmIChyZXQgIT0gTnVtYmVyei5USFJFRSkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB9CiAKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEVudW0oRklWRSkiKTsKICAgICAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6LkZJVkUpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgcmV0ICsgIlxuIik7CisgICAgICAgIGlmIChyZXQgIT0gTnVtYmVyei5GSVZFKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KIAogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RW51bShFSUdIVCkiKTsKICAgICAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6LkVJR0hUKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIHJldCArICJcbiIpOworICAgICAgICBpZiAocmV0ICE9IE51bWJlcnouRUlHSFQpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUWVBFREVGIFRFU1QKQEAgLTMwNiw2ICs1NTUsMTAgQEAKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSIpOwogICAgICAgICBsb25nIHVpZCA9IHRlc3RDbGllbnQudGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzTCk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9ICIgKyB1aWQgKyAiXG4iKTsKKyAgICAgICAgaWYgKHVpZCAhPSAzMDk4NTgyMzUwODI1MjNMKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBORVNURUQgTUFQIFRFU1QKQEAgLTMyMyw2NCArNTc2LDE4NyBAQAogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0sICIpOwogICAgICAgICB9CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOworICAgICAgICBpZiAobW0uc2l6ZSgpICE9IDIgfHwgIW1tLmNvbnRhaW5zS2V5KDQpIHx8ICFtbS5jb250YWluc0tleSgtNCkpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gbTEgPSBtbS5nZXQoNCk7CisgICAgICAgICAgTWFwPEludGVnZXIsIEludGVnZXI+IG0yID0gbW0uZ2V0KC00KTsKKyAgICAgICAgICBpZiAobTEuZ2V0KDEpICE9IDEgfHwgbTEuZ2V0KDIpICE9IDIgfHwgbTEuZ2V0KDMpICE9IDMgfHwgbTEuZ2V0KDQpICE9IDQgfHwKKyAgICAgICAgICAgICAgbTIuZ2V0KC0xKSAhPSAtMSB8fCBtMi5nZXQoLTIpICE9IC0yIHx8IG0yLmdldCgtMykgIT0gLTMgfHwgbTIuZ2V0KC00KSAhPSAtNCkgeworICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogSU5TQU5JVFkgVEVTVAogICAgICAgICAgKi8KLSAgICAgICAgaW5zYW5lID0gbmV3IEluc2FuaXR5KCk7Ci0gICAgICAgIGluc2FuZS51c2VyTWFwID0gbmV3IEhhc2hNYXA8TnVtYmVyeiwgTG9uZz4oKTsKLSAgICAgICAgaW5zYW5lLnVzZXJNYXAucHV0KE51bWJlcnouRklWRSwgKGxvbmcpNTAwMCk7Ci0gICAgICAgIFh0cnVjdCB0cnVjayA9IG5ldyBYdHJ1Y3QoKTsKLSAgICAgICAgdHJ1Y2suc3RyaW5nX3RoaW5nID0gIlRydWNrIjsKLSAgICAgICAgdHJ1Y2suYnl0ZV90aGluZyA9IChieXRlKTg7Ci0gICAgICAgIHRydWNrLmkzMl90aGluZyA9IDg7Ci0gICAgICAgIHRydWNrLmk2NF90aGluZyA9IDg7Ci0gICAgICAgIGluc2FuZS54dHJ1Y3RzID0gbmV3IEFycmF5TGlzdDxYdHJ1Y3Q+KCk7Ci0gICAgICAgIGluc2FuZS54dHJ1Y3RzLmFkZCh0cnVjayk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RJbnNhbml0eSgpIik7Ci0gICAgICAgIE1hcDxMb25nLE1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gd2hvYSA9Ci0gICAgICAgICAgdGVzdENsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5lKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0geyIpOwotICAgICAgICBmb3IgKGxvbmcga2V5IDogd2hvYS5rZXlTZXQoKSkgewotICAgICAgICAgIE1hcDxOdW1iZXJ6LEluc2FuaXR5PiB2YWwgPSB3aG9hLmdldChrZXkpOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoa2V5ICsgIiA9PiB7Iik7CiAKLSAgICAgICAgICBmb3IgKE51bWJlcnogazIgOiB2YWwua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIEluc2FuaXR5IHYyID0gdmFsLmdldChrMik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGsyICsgIiA9PiB7Iik7Ci0gICAgICAgICAgICBNYXA8TnVtYmVyeiwgTG9uZz4gdXNlck1hcCA9IHYyLnVzZXJNYXA7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ7Iik7Ci0gICAgICAgICAgICBpZiAodXNlck1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIGZvciAoTnVtYmVyeiBrMyA6IHVzZXJNYXAua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGszICsgIiA9PiAiICsgdXNlck1hcC5nZXQoazMpICsgIiwgIik7CisgICAgICAgIGJvb2xlYW4gaW5zYW5pdHlGYWlsZWQgPSB0cnVlOworICAgICAgICB0cnkgeworICAgICAgICAgIFh0cnVjdCBoZWxsbyA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKKyAgICAgICAgICBoZWxsby5ieXRlX3RoaW5nID0gMjsKKyAgICAgICAgICBoZWxsby5pMzJfdGhpbmcgPSAyOworICAgICAgICAgIGhlbGxvLmk2NF90aGluZyA9IDI7CisKKyAgICAgICAgICBYdHJ1Y3QgZ29vZGJ5ZSA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgICBnb29kYnllLnN0cmluZ190aGluZyA9ICJHb29kYnllNCI7CisgICAgICAgICAgZ29vZGJ5ZS5ieXRlX3RoaW5nID0gKGJ5dGUpNDsKKyAgICAgICAgICBnb29kYnllLmkzMl90aGluZyA9IDQ7CisgICAgICAgICAgZ29vZGJ5ZS5pNjRfdGhpbmcgPSAobG9uZyk0OworCisgICAgICAgICAgaW5zYW5lLnVzZXJNYXAgPSBuZXcgSGFzaE1hcDxOdW1iZXJ6LCBMb25nPigpOworICAgICAgICAgIGluc2FuZS51c2VyTWFwLnB1dChOdW1iZXJ6LkVJR0hULCAobG9uZyk4KTsKKyAgICAgICAgICBpbnNhbmUudXNlck1hcC5wdXQoTnVtYmVyei5GSVZFLCAobG9uZyk1KTsKKyAgICAgICAgICBpbnNhbmUueHRydWN0cyA9IG5ldyBBcnJheUxpc3Q8WHRydWN0PigpOworICAgICAgICAgIGluc2FuZS54dHJ1Y3RzLmFkZChnb29kYnllKTsKKyAgICAgICAgICBpbnNhbmUueHRydWN0cy5hZGQoaGVsbG8pOworCisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEluc2FuaXR5KCkiKTsKKyAgICAgICAgICBNYXA8TG9uZyxNYXA8TnVtYmVyeixJbnNhbml0eT4+IHdob2EgPQorICAgICAgICAgICAgdGVzdENsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5lKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSB7Iik7CisgICAgICAgICAgZm9yIChsb25nIGtleSA6IHdob2Eua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIE1hcDxOdW1iZXJ6LEluc2FuaXR5PiB2YWwgPSB3aG9hLmdldChrZXkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChrZXkgKyAiID0+IHsiKTsKKworICAgICAgICAgICAgZm9yIChOdW1iZXJ6IGsyIDogdmFsLmtleVNldCgpKSB7CisgICAgICAgICAgICAgIEluc2FuaXR5IHYyID0gdmFsLmdldChrMik7CisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoazIgKyAiID0+IHsiKTsKKyAgICAgICAgICAgICAgTWFwPE51bWJlcnosIExvbmc+IHVzZXJNYXAgPSB2Mi51c2VyTWFwOworICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ7Iik7CisgICAgICAgICAgICAgIGlmICh1c2VyTWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKE51bWJlcnogazMgOiB1c2VyTWFwLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGszICsgIiA9PiAiICsgdXNlck1hcC5nZXQoazMpICsgIiwgIik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7CiAKLSAgICAgICAgICAgIExpc3Q8WHRydWN0PiB4dHJ1Y3RzID0gdjIueHRydWN0czsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInsiKTsKLSAgICAgICAgICAgIGlmICh4dHJ1Y3RzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgZm9yIChYdHJ1Y3QgeCA6IHh0cnVjdHMpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ7IiArICJcIiIgKyB4LnN0cmluZ190aGluZyArICJcIiwgIiArIHguYnl0ZV90aGluZyArICIsICIgKyB4LmkzMl90aGluZyArICIsICIrIHguaTY0X3RoaW5nICsgIn0sICIpOworICAgICAgICAgICAgICBMaXN0PFh0cnVjdD4geHRydWN0cyA9IHYyLnh0cnVjdHM7CisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInsiKTsKKyAgICAgICAgICAgICAgaWYgKHh0cnVjdHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoWHRydWN0IHggOiB4dHJ1Y3RzKSB7CisgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ7IiArICJcIiIgKyB4LnN0cmluZ190aGluZyArICJcIiwgIiArIHguYnl0ZV90aGluZyArICIsICIgKyB4LmkzMl90aGluZyArICIsICIrIHguaTY0X3RoaW5nICsgIn0sICIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSIpOworICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9Iik7CiAKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKICAgICAgICAgICB9Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifVxuIik7CisgICAgICAgICAgaWYgKHdob2Euc2l6ZSgpID09IDIgJiYgd2hvYS5jb250YWluc0tleSgxTCkgJiYgd2hvYS5jb250YWluc0tleSgyTCkpIHsKKyAgICAgICAgICAgIE1hcDxOdW1iZXJ6LCBJbnNhbml0eT4gZmlyc3RfbWFwID0gd2hvYS5nZXQoMUwpOworICAgICAgICAgICAgTWFwPE51bWJlcnosIEluc2FuaXR5PiBzZWNvbmRfbWFwID0gd2hvYS5nZXQoMkwpOworICAgICAgICAgICAgaWYgKGZpcnN0X21hcC5zaXplKCkgPT0gMiAmJgorICAgICAgICAgICAgICAgIGZpcnN0X21hcC5jb250YWluc0tleShOdW1iZXJ6LlRXTykgJiYKKyAgICAgICAgICAgICAgICBmaXJzdF9tYXAuY29udGFpbnNLZXkoTnVtYmVyei5USFJFRSkgJiYKKyAgICAgICAgICAgICAgICBzZWNvbmRfbWFwLnNpemUoKSA9PSAxICYmCisgICAgICAgICAgICAgICAgc2Vjb25kX21hcC5jb250YWluc0tleShOdW1iZXJ6LlNJWCkgJiYKKyAgICAgICAgICAgICAgICBpbnNhbmUuZXF1YWxzKGZpcnN0X21hcC5nZXQoTnVtYmVyei5UV08pKSAmJgorICAgICAgICAgICAgICAgIGluc2FuZS5lcXVhbHMoZmlyc3RfbWFwLmdldChOdW1iZXJ6LlRIUkVFKSkpIHsKKyAgICAgICAgICAgICAgSW5zYW5pdHkgc2l4ID1zZWNvbmRfbWFwLmdldChOdW1iZXJ6LlNJWCk7CisgICAgICAgICAgICAgIC8vIENhbm5vdCB1c2UgIm5ldyBJbnNhbml0eSgpLmVxdWFscyhzaXgpIiBiZWNhdXNlIGFzIG9mIG5vdywgc3RydWN0L2NvbnRhaW5lcgorICAgICAgICAgICAgICAvLyBmaWVsZHMgd2l0aCBkZWZhdWx0IHJlcXVpcmVkbmVzcyBoYXZlIGlzc2V0PWZhbHNlIGZvciBsb2NhbCBpbnN0YW5jZXMgYW5kIHlldAorICAgICAgICAgICAgICAvLyByZWNlaXZlZCBlbXB0eSB2YWx1ZXMgZnJvbSBvdGhlciBsYW5ndWFnZXMgbGlrZSBDKysgaGF2ZSBpc3NldD10cnVlIC4KKyAgICAgICAgICAgICAgaWYgKHNpeC5nZXRVc2VyTWFwU2l6ZSgpID09IDAgJiYgc2l4LmdldFh0cnVjdHNTaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIE9LCisgICAgICAgICAgICAgICAgaW5zYW5pdHlGYWlsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOworICAgICAgICAgIGluc2FuaXR5RmFpbGVkID0gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludCgifVxuIik7CisgICAgICAgIGlmIChpbnNhbml0eUZhaWxlZCkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB9CiAKLSAgICAgICAgLy8gVGVzdCBvbmV3YXkKKyAgICAgICAgLyoqCisgICAgICAgICAqIEVYRUNQVElPTiBURVNUCisgICAgICAgICAqLworICAgICAgICB0cnkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcIlhjZXB0aW9uXCIpID0+Iik7CisgICAgICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAgdm9pZFxuKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9FWENFUFRJT05TOworICAgICAgICB9IGNhdGNoKFhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICB7JWQsIFwiJXNcIn1cbiIsIGUuZXJyb3JDb2RlLCBlLm1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oXCJURXhjZXB0aW9uXCIpID0+Iik7CisgICAgICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICB2b2lkXG4qKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CisgICAgICAgIH0gY2F0Y2goVEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAge1wiJXNcIn1cbiIsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwic3VjY2Vzc1wiKSA9PiIpOworICAgICAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigic3VjY2VzcyIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAgdm9pZFxuIik7CisgICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIGV4Y2VwdGlvblxuKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9FWENFUFRJT05TOworICAgICAgICB9CisKKworICAgICAgICAvKioKKyAgICAgICAgICogTVVMVEkgRVhDRVBUSU9OIFRFU1QKKyAgICAgICAgICovCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvblwiLCBcInRlc3QgMVwiKSA9PiIpOworICAgICAgICAgIHRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbiIsICJ0ZXN0IDEiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIHJlc3VsdFxuKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9FWENFUFRJT05TOworICAgICAgICB9IGNhdGNoKFhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICB7JWQsIFwiJXNcIn1cbiIsIGUuZXJyb3JDb2RlLCBlLm1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvbjJcIiwgXCJ0ZXN0IDJcIikgPT4iKTsKKyAgICAgICAgICB0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbigiWGNlcHRpb24yIiwgInRlc3QgMiIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAgcmVzdWx0XG4qKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CisgICAgICAgIH0gY2F0Y2goWGNlcHRpb24yIGUpIHsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICB7JWQsIHtcIiVzXCJ9fVxuIiwgZS5lcnJvckNvZGUsIGUuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwic3VjY2Vzc1wiLCBcInRlc3QgM1wiKSA9PiIpOworICAgICAgICAgIFh0cnVjdCByZXN1bHQ7CisgICAgICAgICAgcmVzdWx0ID0gdGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oInN1Y2Nlc3MiLCAidGVzdCAzIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAge3tcIiVzXCJ9fVxuIiwgcmVzdWx0LnN0cmluZ190aGluZyk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICBleGNlcHRpb25cbioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKKyAgICAgICAgfQorCisKKworICAgICAgICAvKioKKyAgICAgICAgICogT05FV0FZIFRFU1QKKyAgICAgICAgICovCiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RPbmV3YXkoMykuLi4iKTsKICAgICAgICAgbG9uZyBzdGFydE9uZXdheSA9IFN5c3RlbS5uYW5vVGltZSgpOwogICAgICAgICB0ZXN0Q2xpZW50LnRlc3RPbmV3YXkoMyk7CiAgICAgICAgIGxvbmcgb25ld2F5RWxhcHNlZE1pbGxpcyA9IChTeXN0ZW0ubmFub1RpbWUoKSAtIHN0YXJ0T25ld2F5KSAvIDEwMDAwMDA7CiAgICAgICAgIGlmIChvbmV3YXlFbGFwc2VkTWlsbGlzID4gMjAwKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiT25ld2F5IHRlc3QgZmFpbGVkOiB0b29rICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy50b1N0cmluZyhvbmV3YXlFbGFwc2VkTWlsbGlzKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXMiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9uZXdheSB0ZXN0IGZhaWxlZDogdG9vayAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy50b1N0cmluZyhvbmV3YXlFbGFwc2VkTWlsbGlzKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtcyIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN1Y2Nlc3MgLSB0b29rICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nLnRvU3RyaW5nKG9uZXdheUVsYXBzZWRNaWxsaXMpICsKQEAgLTQwMiwyMiArNzc4LDI5IEBACiAgICAgICAgIHRpbWVUb3QgKz0gdG90OwogCiAgICAgICAgIHRyYW5zcG9ydC5jbG9zZSgpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIHgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1VOS05PV047CiAgICAgICB9Ci0KLSAgICAgIGxvbmcgdGltZUF2ZyA9IHRpbWVUb3QgLyBudW1UZXN0czsKLQotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNaW4gdGltZTogIiArIHRpbWVNaW4vMTAwMCArICJ1cyIpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNYXggdGltZTogIiArIHRpbWVNYXgvMTAwMCArICJ1cyIpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBdmcgdGltZTogIiArIHRpbWVBdmcvMTAwMCArICJ1cyIpOwotCi0gICAgICBTdHJpbmcganNvbiA9IChuZXcgVFNlcmlhbGl6ZXIobmV3IFRTaW1wbGVKU09OUHJvdG9jb2wuRmFjdG9yeSgpKSkudG9TdHJpbmcoaW5zYW5lKTsKLQotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbkZvciBnb29kIG1lYXVzcmUgaGVyZSBpcyBzb21lIEpTT046XG4iICsganNvbik7Ci0KLSAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgewotICAgICAgeC5wcmludFN0YWNrVHJhY2UoKTsKICAgICB9CiAKLSAgfQorICAgIGxvbmcgdGltZUF2ZyA9IHRpbWVUb3QgLyBudW1UZXN0czsKIAorICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWluIHRpbWU6ICIgKyB0aW1lTWluLzEwMDAgKyAidXMiKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1heCB0aW1lOiAiICsgdGltZU1heC8xMDAwICsgInVzIik7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJBdmcgdGltZTogIiArIHRpbWVBdmcvMTAwMCArICJ1cyIpOworCisgICAgdHJ5IHsKKyAgICAgIFN0cmluZyBqc29uID0gKG5ldyBUU2VyaWFsaXplcihuZXcgVFNpbXBsZUpTT05Qcm90b2NvbC5GYWN0b3J5KCkpKS50b1N0cmluZyhpbnNhbmUpOworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNhbXBsZSBUU2ltcGxlSlNPTlByb3RvY29sIG91dHB1dDpcbiIgKyBqc29uKTsKKyAgICB9IGNhdGNoIChURXhjZXB0aW9uIHgpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqIik7CisgICAgICB4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgIH0KKworCisgICAgU3lzdGVtLmV4aXQocmV0dXJuQ29kZSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YQppbmRleCAxODM0M2IwLi40MWM0YjY1IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdE5vbmJsb2NraW5nU2VydmVyLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3ROb25ibG9ja2luZ1NlcnZlci5qYXZhCkBAIC01Miw3ICs1Miw3IEBACiAKICAgICAgIC8vIFRyYW5zcG9ydAogICAgICAgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IHRTZXJ2ZXJTb2NrZXQgPQotICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpOworICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuTm9uYmxvY2tpbmdBYnN0cmFjdFNlcnZlclNvY2tldEFyZ3MoKS5wb3J0KHBvcnQpKTsKIAogICAgICAgVFNlcnZlciBzZXJ2ZXJFbmdpbmU7CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0U2VydmVyLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdFNlcnZlci5qYXZhCmluZGV4IGU2NTc1NmQuLjFmM2U1NTUgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0U2VydmVyLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RTZXJ2ZXIuamF2YQpAQCAtMjYsMTYgKzI2LDMyIEBACiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRKU09OUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlNlcnZlckNvbnRleHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRTZXJ2ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRTZXJ2ZXIuQXJnczsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVFNpbXBsZVNlcnZlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVFRocmVhZFBvb2xTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTZXJ2ZXJTb2NrZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlNlcnZlclRlc3RCYXNlLlRlc3RIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UU2VydmVyRXZlbnRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UVGhyZWFkZWRTZWxlY3RvclNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVE5vbmJsb2NraW5nU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5URmFzdEZyYW1lZFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNlcnZlclNvY2tldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNTTFRyYW5zcG9ydEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVE11bHRpcGxleGVkUHJvY2Vzc29yOwogCiBpbXBvcnQgdGhyaWZ0LnRlc3QuSW5zYW5pdHk7CiBpbXBvcnQgdGhyaWZ0LnRlc3QuTnVtYmVyejsKK2ltcG9ydCB0aHJpZnQudGVzdC5TZWNvbmRTZXJ2aWNlOwogaW1wb3J0IHRocmlmdC50ZXN0LlRocmlmdFRlc3Q7CiBpbXBvcnQgdGhyaWZ0LnRlc3QuWGNlcHRpb247CiBpbXBvcnQgdGhyaWZ0LnRlc3QuWGNlcHRpb24yOwpAQCAtNDQsMzggKzYwLDI0NiBAQAogCiBwdWJsaWMgY2xhc3MgVGVzdFNlcnZlciB7CiAKKyAgLy8gTXVsdGlwbGV4ZWQgUHJvdG9jb2wgU3VwcG9ydCBEZXRhaWxzOgorICAvLworICAvLyBGb3IgbXVsdGlwbGV4ZWQgdGVzdGluZyB3ZSBhbHdheXMgdXNlIGJpbmFyeSBwcm90b2NvbCB1bmRlcm5lYXRoLgorICAvLworICAvLyAiVGhyaWZ0VGVzdCIgbmFtZWQgc2VydmljZSBpbXBsZW1lbnRzICJUaHJpZnRUZXN0IiBmcm9tIFRocmlmdFRlc3QudGhyaWZ0CisgIC8vICJTZWNvbmRTZXJ2aWNlIiBuYW1lZCBzZXJ2aWNlIGltcGxlbWVudHMgIlNlY29uZFNlcnZpY2UiIGZyb20gVGhyaWZ0VGVzdC50aHJpZnQKKyAgLy8gSW4gYWRkaXRpb24sIHRvIHN1cHBvcnQgb2xkZXIgbm9uLW11bHRpcGxleGVkIGNsaWVudHMgdXNpbmcgdGhlIHNhbWUgY29uY3JldGUgcHJvdG9jb2wKKyAgLy8gdGhlIG11bHRpcGxleGVkIHByb2Nlc3NvciBpcyB0YXVnaHQgdG8gdXNlICJUaHJpZnRUZXN0IiBpZiB0aGUgaW5jb21pbmcgcmVxdWVzdCBoYXMgbm8KKyAgLy8gbXVsdGlwbGV4ZWQgY2FsbCBuYW1lIGRlY29yYXRpb24uCisKKyAgc3RhdGljIGNsYXNzIFNlY29uZEhhbmRsZXIgaW1wbGVtZW50cyB0aHJpZnQudGVzdC5TZWNvbmRTZXJ2aWNlLklmYWNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHNlY29uZHRlc3RTdHJpbmcoamF2YS5sYW5nLlN0cmluZyB0aGluZykgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24KKyAgICB7IHJldHVybiAidGVzdFN0cmluZyhcIiIgKyB0aGluZyArICJcIikiOyB9CisKKyAgfQorCisgIHN0YXRpYyBjbGFzcyBUZXN0U2VydmVyQ29udGV4dCBpbXBsZW1lbnRzIFNlcnZlckNvbnRleHQgeworCisgICAgICAgIGludCBjb25uZWN0aW9uSWQ7CisKKyAgICAgICAgcHVibGljIFRlc3RTZXJ2ZXJDb250ZXh0KGludCBjb25uZWN0aW9uSWQpIHsKKyAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uSWQoKSB7CisgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbklkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbklkKGludCBjb25uZWN0aW9uSWQpIHsKKyAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICB9CisKKyAgfQorCisgIHN0YXRpYyBjbGFzcyBUZXN0U2VydmVyRXZlbnRIYW5kbGVyIGltcGxlbWVudHMgVFNlcnZlckV2ZW50SGFuZGxlciB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgbmV4dENvbm5lY3Rpb25JZCA9IDE7CisKKyAgICAgICAgcHVibGljIHZvaWQgcHJlU2VydmUoKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRTZXJ2ZXJFdmVudEhhbmRsZXIucHJlU2VydmUgLSBjYWxsZWQgb25seSBvbmNlIGJlZm9yZSBzZXJ2ZXIgc3RhcnRzIGFjY2VwdGluZyBjb25uZWN0aW9ucyIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNlcnZlckNvbnRleHQgY3JlYXRlQ29udGV4dChUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQpIHsKKyAgICAgICAgICAgIC8vd2UgY2FuIGNyZWF0ZSBzb21lIGNvbm5lY3Rpb24gbGV2ZWwgZGF0YSB3aGljaCBpcyBzdG9yZWQgd2hpbGUgY29ubmVjdGlvbiBpcyBhbGl2ZSAmIHNlcnZlZAorICAgICAgICAgICAgVGVzdFNlcnZlckNvbnRleHQgY3R4ID0gbmV3IFRlc3RTZXJ2ZXJDb250ZXh0KG5leHRDb25uZWN0aW9uSWQrKyk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRTZXJ2ZXJFdmVudEhhbmRsZXIuY3JlYXRlQ29udGV4dCAtIGNvbm5lY3Rpb24gIyIrY3R4LmdldENvbm5lY3Rpb25JZCgpKyIgZXN0YWJsaXNoZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBjdHg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBkZWxldGVDb250ZXh0KFNlcnZlckNvbnRleHQgc2VydmVyQ29udGV4dCwgVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0KSB7CisgICAgICAgICAgICBUZXN0U2VydmVyQ29udGV4dCBjdHggPSAoVGVzdFNlcnZlckNvbnRleHQpc2VydmVyQ29udGV4dDsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVFNlcnZlckV2ZW50SGFuZGxlci5kZWxldGVDb250ZXh0IC0gY29ubmVjdGlvbiAjIitjdHguZ2V0Q29ubmVjdGlvbklkKCkrIiB0ZXJtaW5hdGVkIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzQ29udGV4dChTZXJ2ZXJDb250ZXh0IHNlcnZlckNvbnRleHQsIFRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQsIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0KSB7CisgICAgICAgICAgICBUZXN0U2VydmVyQ29udGV4dCBjdHggPSAoVGVzdFNlcnZlckNvbnRleHQpc2VydmVyQ29udGV4dDsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVFNlcnZlckV2ZW50SGFuZGxlci5wcm9jZXNzQ29udGV4dCAtIGNvbm5lY3Rpb24gIyIrY3R4LmdldENvbm5lY3Rpb25JZCgpKyIgaXMgcmVhZHkgdG8gcHJvY2VzcyBuZXh0IHJlcXVlc3QiKTsKKyAgICAgICAgfQorCisgIH0KKwogICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewogICAgIHRyeSB7CiAgICAgICBpbnQgcG9ydCA9IDkwOTA7Ci0gICAgICBpZiAoYXJncy5sZW5ndGggPiAxKSB7Ci0gICAgICAgIHBvcnQgPSBJbnRlZ2VyLnZhbHVlT2YoYXJnc1swXSk7CisgICAgICBib29sZWFuIHNzbCA9IGZhbHNlOworICAgICAgU3RyaW5nIHRyYW5zcG9ydF90eXBlID0gImJ1ZmZlcmVkIjsKKyAgICAgIFN0cmluZyBwcm90b2NvbF90eXBlID0gImJpbmFyeSI7CisgICAgICBTdHJpbmcgc2VydmVyX3R5cGUgPSAidGhyZWFkLXBvb2wiOworICAgICAgU3RyaW5nIGRvbWFpbl9zb2NrZXQgPSAiIjsKKyAgICAgIGludCBzdHJpbmdfbGltaXQgPSAtMTsKKyAgICAgIGludCBjb250YWluZXJfbGltaXQgPSAtMTsKKyAgICAgIHRyeSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tcG9ydCIpKSB7CisgICAgICAgICAgICBwb3J0ID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbaV0uc3BsaXQoIj0iKVsxXSk7CisgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tc2VydmVyLXR5cGUiKSkgeworICAgICAgICAgICAgc2VydmVyX3R5cGUgPSBhcmdzW2ldLnNwbGl0KCI9IilbMV07CisgICAgICAgICAgICBzZXJ2ZXJfdHlwZS50cmltKCk7CisgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tcG9ydCIpKSB7CisgICAgICAgICAgICBwb3J0PUludGVnZXIucGFyc2VJbnQoYXJnc1tpXS5zcGxpdCgiPSIpWzFdKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1wcm90b2NvbCIpKSB7CisgICAgICAgICAgICBwcm90b2NvbF90eXBlID0gYXJnc1tpXS5zcGxpdCgiPSIpWzFdOworICAgICAgICAgICAgcHJvdG9jb2xfdHlwZS50cmltKCk7CisgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tdHJhbnNwb3J0IikpIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydF90eXBlID0gYXJnc1tpXS5zcGxpdCgiPSIpWzFdOworICAgICAgICAgICAgdHJhbnNwb3J0X3R5cGUudHJpbSgpOworICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tc3NsIikpIHsKKyAgICAgICAgICAgIHNzbCA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tc3RyaW5nLWxpbWl0IikpIHsKKyAgICAgICAgICAgIHN0cmluZ19saW1pdCA9IEludGVnZXIudmFsdWVPZihhcmdzW2ldLnNwbGl0KCI9IilbMV0pOworICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItLWNvbnRhaW5lci1saW1pdCIpKSB7CisgICAgICAgICAgICBjb250YWluZXJfbGltaXQgPSBJbnRlZ2VyLnZhbHVlT2YoYXJnc1tpXS5zcGxpdCgiPSIpWzFdKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLWhlbHAiKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBbGxvd2VkIG9wdGlvbnM6Iik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1oZWxwXHRcdFx0UHJvZHVjZSBoZWxwIG1lc3NhZ2UiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXBvcnQ9YXJnICg9IiArIHBvcnQgKyAiKVx0UG9ydCBudW1iZXIgdG8gY29ubmVjdCIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tdHJhbnNwb3J0PWFyZyAoPSIgKyB0cmFuc3BvcnRfdHlwZSArICIpXG5cdFx0XHRcdFRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgZmFzdGZyYW1lZCIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tcHJvdG9jb2w9YXJnICg9IiArIHByb3RvY29sX3R5cGUgKyAiKVx0UHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbiwgbXVsdGksIG11bHRpYywgbXVsdGlqIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1zc2xcdFx0XHRFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTCIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tc2VydmVyLXR5cGU9YXJnICg9IiArIHNlcnZlcl90eXBlICsiKVxuXHRcdFx0XHRUeXBlIG9mIHNlcnZlcjogc2ltcGxlLCB0aHJlYWQtcG9vbCwgbm9uYmxvY2tpbmcsIHRocmVhZGVkLXNlbGVjdG9yIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1zdHJpbmctbGltaXQ9YXJnICg9IiArIHN0cmluZ19saW1pdCArICIpXHRTdHJpbmcgcmVhZCBsZW5ndGggbGltaXQiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLWNvbnRhaW5lci1saW1pdD1hcmcgKD0iICsgY29udGFpbmVyX2xpbWl0ICsgIilcdENvbnRhaW5lciByZWFkIGxlbmd0aCBsaW1pdCIpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNhbiBub3QgcGFyc2UgYXJndW1lbnRzISBTZWUgLS1oZWxwIik7CisgICAgICAgIFN5c3RlbS5leGl0KDEpOwogICAgICAgfQotICAgICAgLy9AVE9ETyBhZGQgb3RoZXIgcHJvdG9jb2wgYW5kIHRyYW5zcG9ydCB0eXBlcwogCi0gICAgICAvLyBQcm9jZXNzb3IKLSAgICAgIFRlc3RIYW5kbGVyIHRlc3RIYW5kbGVyID0KLSAgICAgICAgbmV3IFRlc3RIYW5kbGVyKCk7Ci0gICAgICBUaHJpZnRUZXN0LlByb2Nlc3NvciB0ZXN0UHJvY2Vzc29yID0KLSAgICAgICAgbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKHRlc3RIYW5kbGVyKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGlmIChzZXJ2ZXJfdHlwZS5lcXVhbHMoInNpbXBsZSIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAoc2VydmVyX3R5cGUuZXF1YWxzKCJ0aHJlYWQtcG9vbCIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAoc2VydmVyX3R5cGUuZXF1YWxzKCJub25ibG9ja2luZyIpKSB7CisgICAgICAgICAgaWYgKHNzbCA9PSB0cnVlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJTU0wgaXMgbm90IHN1cHBvcnRlZCBvdmVyIG5vbmJsb2NraW5nIHNlcnZlcnMhIik7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlLmVxdWFscygidGhyZWFkZWQtc2VsZWN0b3IiKSkgeworICAgICAgICAgIGlmIChzc2wgPT0gdHJ1ZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiU1NMIGlzIG5vdCBzdXBwb3J0ZWQgb3ZlciBub25ibG9ja2luZyBzZXJ2ZXJzISIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVbmtub3duIHNlcnZlciB0eXBlISAiICsgc2VydmVyX3R5cGUpOworICAgICAgICB9CisgICAgICAgIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygiYmluYXJ5IikpIHsKKyAgICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygiY29tcGFjdCIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImpzb24iKSkgeworICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aSIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpYyIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpaiIpKSB7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5rbm93biBwcm90b2NvbCB0eXBlISAiICsgcHJvdG9jb2xfdHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyYW5zcG9ydF90eXBlLmVxdWFscygiYnVmZmVyZWQiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlLmVxdWFscygiZnJhbWVkIikpIHsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImZhc3RmcmFtZWQiKSkgeworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVua25vd24gdHJhbnNwb3J0IHR5cGUhICIgKyB0cmFuc3BvcnRfdHlwZSk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgfQogCi0gICAgICAvLyBUcmFuc3BvcnQKLSAgICAgIFRTZXJ2ZXJTb2NrZXQgdFNlcnZlclNvY2tldCA9Ci0gICAgICAgIG5ldyBUU2VydmVyU29ja2V0KHBvcnQpOworICAgICAgLy8gUHJvY2Vzc29ycworICAgICAgVGVzdEhhbmRsZXIgdGVzdEhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKKyAgICAgIFRocmlmdFRlc3QuUHJvY2Vzc29yIHRlc3RQcm9jZXNzb3IgPSBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IodGVzdEhhbmRsZXIpOworCisgICAgICBTZWNvbmRIYW5kbGVyIHNlY29uZEhhbmRsZXIgPSBuZXcgU2Vjb25kSGFuZGxlcigpOworICAgICAgU2Vjb25kU2VydmljZS5Qcm9jZXNzb3Igc2Vjb25kUHJvY2Vzc29yID0gbmV3IFNlY29uZFNlcnZpY2UuUHJvY2Vzc29yKHNlY29uZEhhbmRsZXIpOwogCiAgICAgICAvLyBQcm90b2NvbCBmYWN0b3J5Ci0gICAgICBUUHJvdG9jb2xGYWN0b3J5IHRQcm90b2NvbEZhY3RvcnkgPQotICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgIFRQcm90b2NvbEZhY3RvcnkgdFByb3RvY29sRmFjdG9yeSA9IG51bGw7CisgICAgICBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImpzb24iKSB8fCBwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGlqIikpIHsKKyAgICAgICAgdFByb3RvY29sRmFjdG9yeSA9IG5ldyBUSlNPTlByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImNvbXBhY3QiKSB8fCBwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGljIikpIHsKKyAgICAgICAgdFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3Rvcnkoc3RyaW5nX2xpbWl0LCBjb250YWluZXJfbGltaXQpOworICAgICAgfSBlbHNlIHsgLy8gYWxzbyBjb3ZlcnMgbXVsdGkKKyAgICAgICAgdFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeShzdHJpbmdfbGltaXQsIGNvbnRhaW5lcl9saW1pdCk7CisgICAgICB9CiAKLSAgICAgIFRTZXJ2ZXIgc2VydmVyRW5naW5lOworICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdFRyYW5zcG9ydEZhY3RvcnkgPSBudWxsOwogCi0gICAgICAvLyBTaW1wbGUgU2VydmVyCi0gICAgICAvL3NlcnZlckVuZ2luZSA9IG5ldyBUU2ltcGxlU2VydmVyKG5ldyBBcmdzKHRTZXJ2ZXJTb2NrZXQpLnByb2Nlc3Nvcih0ZXN0UHJvY2Vzc29yKSk7CisgICAgICBpZiAodHJhbnNwb3J0X3R5cGUuZXF1YWxzKCJmcmFtZWQiKSkgeworICAgICAgICB0VHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBURnJhbWVkVHJhbnNwb3J0LkZhY3RvcnkoKTsKKyAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUuZXF1YWxzKCJmYXN0ZnJhbWVkIikpIHsKKyAgICAgICAgdFRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEZhc3RGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSgpOworICAgICAgfSBlbHNlIHsgLy8gLmVxdWFscygiYnVmZmVyZWQiKSA9PiBkZWZhdWx0IHZhbHVlCisgICAgICAgIHRUcmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCk7CisgICAgICB9CiAKLSAgICAgIC8vIFRocmVhZFBvb2wgU2VydmVyCi0gICAgICBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIobmV3IFRUaHJlYWRQb29sU2VydmVyLkFyZ3ModFNlcnZlclNvY2tldCkucHJvY2Vzc29yKHRlc3RQcm9jZXNzb3IpLnByb3RvY29sRmFjdG9yeSh0UHJvdG9jb2xGYWN0b3J5KSk7CisgICAgICBUU2VydmVyIHNlcnZlckVuZ2luZSA9IG51bGw7CisKKyAgICAgIC8vIElmIHdlIGFyZSBtdWx0aXBsZXhpbmcgc2VydmljZXMgaW4gb25lIHNlcnZlci4uLgorICAgICAgVE11bHRpcGxleGVkUHJvY2Vzc29yIG11bHRpcGxleGVkUHJvY2Vzc29yID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICAgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3IucmVnaXN0ZXJEZWZhdWx0ICAodGVzdFByb2Nlc3Nvcik7CisgICAgICBtdWx0aXBsZXhlZFByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigiVGhyaWZ0VGVzdCIsIHRlc3RQcm9jZXNzb3IpOworICAgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoIlNlY29uZFNlcnZpY2UiLCBzZWNvbmRQcm9jZXNzb3IpOworCisgICAgICBpZiAoc2VydmVyX3R5cGUuZXF1YWxzKCJub25ibG9ja2luZyIpIHx8CisgICAgICAgICAgc2VydmVyX3R5cGUuZXF1YWxzKCJ0aHJlYWRlZC1zZWxlY3RvciIpKSB7CisgICAgICAgIC8vIE5vbmJsb2NraW5nIHNlcnZlcnMKKyAgICAgICAgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IHROb25ibG9ja2luZ1NlcnZlclNvY2tldCA9CisgICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Lk5vbmJsb2NraW5nQWJzdHJhY3RTZXJ2ZXJTb2NrZXRBcmdzKCkucG9ydChwb3J0KSk7CisKKyAgICAgICAgaWYgKHNlcnZlcl90eXBlLmNvbnRhaW5zKCJub25ibG9ja2luZyIpKSB7CisgICAgICAgICAgLy8gTm9uYmxvY2tpbmcgU2VydmVyCisgICAgICAgICAgVE5vbmJsb2NraW5nU2VydmVyLkFyZ3MgdE5vbmJsb2NraW5nU2VydmVyQXJncworICAgICAgICAgICAgICA9IG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIuQXJncyh0Tm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQpOworICAgICAgICAgIHROb25ibG9ja2luZ1NlcnZlckFyZ3MucHJvY2Vzc29yKHByb3RvY29sX3R5cGUuc3RhcnRzV2l0aCgibXVsdGkiKSA/IG11bHRpcGxleGVkUHJvY2Vzc29yIDogdGVzdFByb2Nlc3Nvcik7CisgICAgICAgICAgdE5vbmJsb2NraW5nU2VydmVyQXJncy5wcm90b2NvbEZhY3RvcnkodFByb3RvY29sRmFjdG9yeSk7CisgICAgICAgICAgdE5vbmJsb2NraW5nU2VydmVyQXJncy50cmFuc3BvcnRGYWN0b3J5KHRUcmFuc3BvcnRGYWN0b3J5KTsKKyAgICAgICAgICBzZXJ2ZXJFbmdpbmUgPSBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHROb25ibG9ja2luZ1NlcnZlckFyZ3MpOworICAgICAgICB9IGVsc2UgeyAvLyBzZXJ2ZXJfdHlwZS5lcXVhbHMoInRocmVhZGVkLXNlbGVjdG9yIikKKyAgICAgICAgICAvLyBUaHJlYWRlZFNlbGVjdG9yIFNlcnZlcgorICAgICAgICAgIFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyLkFyZ3MgdFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXJBcmdzCisgICAgICAgICAgICAgID0gbmV3IFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyLkFyZ3ModE5vbmJsb2NraW5nU2VydmVyU29ja2V0KTsKKyAgICAgICAgICB0VGhyZWFkZWRTZWxlY3RvclNlcnZlckFyZ3MucHJvY2Vzc29yKHByb3RvY29sX3R5cGUuc3RhcnRzV2l0aCgibXVsdGkiKSA/IG11bHRpcGxleGVkUHJvY2Vzc29yIDogdGVzdFByb2Nlc3Nvcik7CisgICAgICAgICAgdFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXJBcmdzLnByb3RvY29sRmFjdG9yeSh0UHJvdG9jb2xGYWN0b3J5KTsKKyAgICAgICAgICB0VGhyZWFkZWRTZWxlY3RvclNlcnZlckFyZ3MudHJhbnNwb3J0RmFjdG9yeSh0VHJhbnNwb3J0RmFjdG9yeSk7CisgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyKHRUaHJlYWRlZFNlbGVjdG9yU2VydmVyQXJncyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEJsb2NraW5nIHNlcnZlcnMKKworICAgICAgICAvLyBTU0wgc29ja2V0CisgICAgICAgIFRTZXJ2ZXJTb2NrZXQgdFNlcnZlclNvY2tldCA9IG51bGw7CisgICAgICAgIGlmIChzc2wpIHsKKyAgICAgICAgICB0U2VydmVyU29ja2V0ID0gVFNTTFRyYW5zcG9ydEZhY3RvcnkuZ2V0U2VydmVyU29ja2V0KHBvcnQsIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRTZXJ2ZXJTb2NrZXQgPSBuZXcgVFNlcnZlclNvY2tldChuZXcgVFNlcnZlclNvY2tldC5TZXJ2ZXJTb2NrZXRUcmFuc3BvcnRBcmdzKCkucG9ydChwb3J0KSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VydmVyX3R5cGUuZXF1YWxzKCJzaW1wbGUiKSkgeworICAgICAgICAgIC8vIFNpbXBsZSBTZXJ2ZXIKKyAgICAgICAgICBUU2VydmVyLkFyZ3MgdFNlcnZlckFyZ3MgPSBuZXcgVFNlcnZlci5BcmdzKHRTZXJ2ZXJTb2NrZXQpOworICAgICAgICAgIHRTZXJ2ZXJBcmdzLnByb2Nlc3Nvcihwcm90b2NvbF90eXBlLnN0YXJ0c1dpdGgoIm11bHRpIikgPyBtdWx0aXBsZXhlZFByb2Nlc3NvciA6IHRlc3RQcm9jZXNzb3IpOworICAgICAgICAgIHRTZXJ2ZXJBcmdzLnByb3RvY29sRmFjdG9yeSh0UHJvdG9jb2xGYWN0b3J5KTsKKyAgICAgICAgICB0U2VydmVyQXJncy50cmFuc3BvcnRGYWN0b3J5KHRUcmFuc3BvcnRGYWN0b3J5KTsKKyAgICAgICAgICBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFNpbXBsZVNlcnZlcih0U2VydmVyQXJncyk7CisgICAgICAgIH0gZWxzZSB7IC8vIHNlcnZlcl90eXBlLmVxdWFscygidGhyZWFkcG9vbCIpCisgICAgICAgICAgLy8gVGhyZWFkUG9vbCBTZXJ2ZXIKKyAgICAgICAgICBUVGhyZWFkUG9vbFNlcnZlci5BcmdzIHRUaHJlYWRQb29sU2VydmVyQXJncworICAgICAgICAgICAgICA9IG5ldyBUVGhyZWFkUG9vbFNlcnZlci5BcmdzKHRTZXJ2ZXJTb2NrZXQpOworICAgICAgICAgIHRUaHJlYWRQb29sU2VydmVyQXJncy5wcm9jZXNzb3IocHJvdG9jb2xfdHlwZS5zdGFydHNXaXRoKCJtdWx0aSIpID8gbXVsdGlwbGV4ZWRQcm9jZXNzb3IgOiB0ZXN0UHJvY2Vzc29yKTsKKyAgICAgICAgICB0VGhyZWFkUG9vbFNlcnZlckFyZ3MucHJvdG9jb2xGYWN0b3J5KHRQcm90b2NvbEZhY3RvcnkpOworICAgICAgICAgIHRUaHJlYWRQb29sU2VydmVyQXJncy50cmFuc3BvcnRGYWN0b3J5KHRUcmFuc3BvcnRGYWN0b3J5KTsKKyAgICAgICAgICBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIodFRocmVhZFBvb2xTZXJ2ZXJBcmdzKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBTZXQgc2VydmVyIGV2ZW50IGhhbmRsZXIKKyAgICAgIHNlcnZlckVuZ2luZS5zZXRTZXJ2ZXJFdmVudEhhbmRsZXIobmV3IFRlc3RTZXJ2ZXJFdmVudEhhbmRsZXIoKSk7CiAKICAgICAgIC8vIFJ1biBpdAotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyB0aGUgc2VydmVyIG9uIHBvcnQgIiArIHBvcnQgKyAiLi4uIik7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIHRoZSAiICsgKHNzbCA/ICJzc2wgc2VydmVyIiA6ICJzZXJ2ZXIiKSArCisgICAgICAgICIgWyIgKyBwcm90b2NvbF90eXBlICsgIi8iICsgdHJhbnNwb3J0X3R5cGUgKyAiLyIgKyBzZXJ2ZXJfdHlwZSArICJdIG9uICIgKworICAgICAgICAoKGRvbWFpbl9zb2NrZXQgPT0gIiIpID8gKCJwb3J0ICIgKyBwb3J0KSA6ICgidW5peCBzb2NrZXQgIiArIGRvbWFpbl9zb2NrZXQpKSk7CiAgICAgICBzZXJ2ZXJFbmdpbmUuc2VydmUoKTsKIAogICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9SZWFkQ291bnRpbmdUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1JlYWRDb3VudGluZ1RyYW5zcG9ydC5qYXZhCmluZGV4IDg0NzQxODguLjNjNzQ5ZjkgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1JlYWRDb3VudGluZ1RyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1JlYWRDb3VudGluZ1RyYW5zcG9ydC5qYXZhCkBAIC0yMiwyNiArMjIsNDAgQEAKIHB1YmxpYyBjbGFzcyBSZWFkQ291bnRpbmdUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKICAgcHVibGljIGludCByZWFkQ291bnQgPSAwOwogICBwcml2YXRlIFRUcmFuc3BvcnQgdHJhbnM7CisgIHByaXZhdGUgYm9vbGVhbiBvcGVuID0gdHJ1ZTsKIAogICBwdWJsaWMgUmVhZENvdW50aW5nVHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZykgewogICAgIHRyYW5zID0gdW5kZXJseWluZzsKICAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBjbG9zZSgpIHt9CisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgIG9wZW4gPSBmYWxzZTsKKyAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7cmV0dXJuIHRydWU7fQorICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisgICAgcmV0dXJuIG9wZW47CisgIH0KIAogICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHt9CisgIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgb3BlbiA9IHRydWU7CisgIH0KIAogICBAT3ZlcnJpZGUKICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZiAoIWlzT3BlbigpKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCAiVHJhbnNwb3J0IGlzIGNsb3NlZCIpOworICAgIH0KICAgICByZWFkQ291bnQrKzsKICAgICByZXR1cm4gdHJhbnMucmVhZChidWYsIG9mZiwgbGVuKTsKICAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7fQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGlmICghaXNPcGVuKCkpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJUcmFuc3BvcnQgaXMgY2xvc2VkIik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXIuamF2YQppbmRleCAzMzdkY2Y4Li5jMzUzNDg5IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyLmphdmEKQEAgLTIzLDcgKzIzLDcgQEAKIHB1YmxpYyBjbGFzcyBUZXN0QXV0b0V4cGFuZGluZ0J1ZmZlciBleHRlbmRzIFRlc3RDYXNlIHsKICAgcHVibGljIHZvaWQgdGVzdEV4cGFuZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAvLyBoYXMgZXhwZWN0ZWQgaW5pdGlhbCBjYXBhY2l0eQotICAgIEF1dG9FeHBhbmRpbmdCdWZmZXIgYiA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyKDEwLCAxLjUpOworICAgIEF1dG9FeHBhbmRpbmdCdWZmZXIgYiA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyKDEwKTsKICAgICBhc3NlcnRFcXVhbHMoMTAsIGIuYXJyYXkoKS5sZW5ndGgpOwogCiAgICAgLy8gZG9lc24ndCBzaHJpbmsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEKaW5kZXggMmUxZjk0Ny4uODNlYmMyZCAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEKQEAgLTMyLDcgKzMyLDcgQEAKICAgfQogCiAgIHB1YmxpYyB2b2lkIHRlc3RJdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0IHQgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoMTUwLCAxLjUpOworICAgIEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0IHQgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoMTUwKTsKIAogICAgIFRNZW1vcnlJbnB1dFRyYW5zcG9ydCBtZW1idWYgPSBuZXcgVE1lbW9yeUlucHV0VHJhbnNwb3J0KEhVTkRSRURfQllURVMpOwogCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEKaW5kZXggZDVmMjM5ZC4uODZiNWIwZCAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQuamF2YQpAQCAtMTksMjYgKzE5LDUxIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK3B1YmxpYyBjbGFzcyBUZXN0QXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IHsKIAotcHVibGljIGNsYXNzIFRlc3RBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KKyAgQFRlc3QKICAgcHVibGljIHZvaWQgdGVzdEl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IHQgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KDEsIDEuNSk7CisgICAgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IHQgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KDEsIDApOworICAgIGFzc2VydEVxdWFscygwLCB0LmdldExlbmd0aCgpKTsKICAgICBhc3NlcnRFcXVhbHMoMSwgdC5nZXRCdWYoKS5hcnJheSgpLmxlbmd0aCk7CiAgICAgYnl0ZVtdIGIxID0gbmV3IGJ5dGVbXXsxLDIsM307CiAgICAgdC53cml0ZShiMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIHQuZ2V0UG9zKCkpOworICAgIGFzc2VydEVxdWFscygzLCB0LmdldExlbmd0aCgpKTsKICAgICBhc3NlcnRUcnVlKHQuZ2V0QnVmKCkuYXJyYXkoKS5sZW5ndGggPj0gMyk7CiAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXIud3JhcChiMSksIEJ5dGVCdWZmZXIud3JhcCh0LmdldEJ1ZigpLmFycmF5KCksIDAsIDMpKTsKIAogICAgIHQucmVzZXQoKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgdC5nZXRMZW5ndGgoKSk7CiAgICAgYXNzZXJ0VHJ1ZSh0LmdldEJ1ZigpLmFycmF5KCkubGVuZ3RoID49IDMpOwotICAgIGFzc2VydEVxdWFscygwLCB0LmdldFBvcygpKTsKICAgICBieXRlW10gYjIgPSBuZXcgYnl0ZVtdezQsNX07CiAgICAgdC53cml0ZShiMik7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIHQuZ2V0UG9zKCkpOworICAgIGFzc2VydEVxdWFscygyLCB0LmdldExlbmd0aCgpKTsKICAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlci53cmFwKGIyKSwgQnl0ZUJ1ZmZlci53cmFwKHQuZ2V0QnVmKCkuYXJyYXkoKSwgMCwgMikpOworCisgICAgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IHV1dCA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoOCwgNCk7CisgICAgYXNzZXJ0RXF1YWxzKDQsIHV1dC5nZXRMZW5ndGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDgsIHV1dC5nZXRCdWYoKS5hcnJheSgpLmxlbmd0aCk7CisgICAgdXV0LndyaXRlKGIxKTsKKyAgICBhc3NlcnRFcXVhbHMoNywgdXV0LmdldExlbmd0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoOCwgdXV0LmdldEJ1ZigpLmFycmF5KCkubGVuZ3RoKTsKKyAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlci53cmFwKGIxKSwgQnl0ZUJ1ZmZlci53cmFwKHV1dC5nZXRCdWYoKS5hcnJheSgpLCA0LCAzKSk7CisgIH0KKworICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgcHVibGljIHZvaWQgdGVzdEJhZEluaXRpYWxTaXplKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydCgwLCAwKTsKKyAgfQorCisgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICBwdWJsaWMgdm9pZCB0ZXN0QmFkRnJvbnRSZXNlcnZlU2l6ZSgpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgIG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoNCwgLTEpOworICB9CisKKyAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgIHB1YmxpYyB2b2lkIHRlc3RUb29TbWFsbEZyb250UmVzZXJ2ZVNpemUoKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KDQsIDUpOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEJ5dGVCdWZmZXIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUQnl0ZUJ1ZmZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MzA3NWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEJ5dGVCdWZmZXIuamF2YQpAQCAtMCwwICsxLDM2IEBACitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuQ2hhcnNldHM7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKK3B1YmxpYyBjbGFzcyBUZXN0VEJ5dGVCdWZmZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHB1YmxpYyB2b2lkIHRlc3RSZWFkV3JpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBUQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gbmV3IFRCeXRlQnVmZmVyKEJ5dGVCdWZmZXIuYWxsb2NhdGUoMTYpKTsKKyAgICBieXRlQnVmZmVyLndyaXRlKCJIZWxsbyBXb3JsZCIuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIFdvcmxkIiwgbmV3IFN0cmluZyhieXRlQnVmZmVyLmZsaXAoKS50b0J5dGVBcnJheSgpLCBDaGFyc2V0cy5VVEZfOCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJldXNlUmVhZFdyaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgVEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciA9IG5ldyBUQnl0ZUJ1ZmZlcihCeXRlQnVmZmVyLmFsbG9jYXRlKDE2KSk7CisgICAgYnl0ZUJ1ZmZlci53cml0ZSgiSGVsbG8gV29ybGQiLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KSk7CisgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyBXb3JsZCIsIG5ldyBTdHJpbmcoYnl0ZUJ1ZmZlci5mbGlwKCkudG9CeXRlQXJyYXkoKSwgQ2hhcnNldHMuVVRGXzgpKTsKKworICAgIGJ5dGVCdWZmZXIuY2xlYXIoKTsKKworICAgIGJ5dGVCdWZmZXIud3JpdGUoIkdvb2RieWUgSG9yc2VzIi5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCkpOworICAgIGFzc2VydEVxdWFscygiR29vZGJ5ZSBIb3JzZXMiLCBuZXcgU3RyaW5nKGJ5dGVCdWZmZXIuZmxpcCgpLnRvQnl0ZUFycmF5KCksIENoYXJzZXRzLlVURl84KSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcmZsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBUQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gbmV3IFRCeXRlQnVmZmVyKEJ5dGVCdWZmZXIuYWxsb2NhdGUoNCkpOworICAgIHRyeSB7CisgICAgICBieXRlQnVmZmVyLndyaXRlKCJIZWxsbyBXb3JsZCIuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpKTsKKyAgICAgIGZhaWwoIkV4cGVjdGVkIHdyaXRlIG9wZXJhdGlvbiB0byBmYWlsIHdpdGggVFRyYW5zcG9ydEV4Y2VwdGlvbiIpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgYXNzZXJ0RXF1YWxzKCJOb3QgZW5vdWdoIHJvb20gaW4gb3V0cHV0IGJ1ZmZlciIsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RURmFzdEZyYW1lZFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEKaW5kZXggZTAyNDA0OS4uMDZlZTIwNiAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEKQEAgLTE5LDggKzE5LDE1IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAogcHVibGljIGNsYXNzIFRlc3RURmFzdEZyYW1lZFRyYW5zcG9ydCBleHRlbmRzIFRlc3RURnJhbWVkVHJhbnNwb3J0IHsKKyAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgSU5JVElBTF9DQVBBQ0lUWSA9IDUwOworCiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgVFRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nKSB7Ci0gICAgcmV0dXJuIG5ldyBURmFzdEZyYW1lZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCA1MCwgMTAgKiAxMDI0ICogMTAyNCk7CisgICAgcmV0dXJuIG5ldyBURmFzdEZyYW1lZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCBJTklUSUFMX0NBUEFDSVRZLCAxMCAqIDEwMjQgKiAxMDI0KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgVFRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nLCBpbnQgbWF4TGVuZ3RoKSB7CisgICAgcmV0dXJuIG5ldyBURmFzdEZyYW1lZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCBJTklUSUFMX0NBUEFDSVRZLCBtYXhMZW5ndGgpOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEZyYW1lZFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGcmFtZWRUcmFuc3BvcnQuamF2YQppbmRleCA3OGY1OGVjLi5lMzBkNzRiIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEZyYW1lZFRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RURnJhbWVkVHJhbnNwb3J0LmphdmEKQEAgLTM0LDYgKzM0LDEwIEBACiAgICAgcmV0dXJuIG5ldyBURnJhbWVkVHJhbnNwb3J0KHVuZGVybHlpbmcpOwogICB9CiAKKyAgcHJvdGVjdGVkIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZywgaW50IG1heExlbmd0aCkgeworICAgIHJldHVybiBuZXcgVEZyYW1lZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCBtYXhMZW5ndGgpOworICB9CisKICAgcHVibGljIHN0YXRpYyBieXRlW10gYnl0ZVNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgewogICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtlbmQtc3RhcnQrMV07CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gKGVuZC1zdGFydCk7IGkrKykgewpAQCAtNzUsNiArNzksNDAgQEAKICAgICBhc3NlcnRFcXVhbHMoNCwgY291bnRUcmFucy5yZWFkQ291bnQpOwogICB9CiAKKyAgcHVibGljIHZvaWQgdGVzdEludmFsaWRGcmFtZVNpemUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGludCBtYXhMZW5ndGggPSAxMjg7CisKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBEYXRhT3V0cHV0U3RyZWFtIGRvcyA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKGJhb3MpOworICAgIGRvcy53cml0ZUludCgxMzApOworICAgIGRvcy53cml0ZShieXRlU2VxdWVuY2UoMCwgMTI5KSk7CisKKyAgICBUTWVtb3J5QnVmZmVyIG1lbWJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKDApOworICAgIG1lbWJ1Zi53cml0ZShiYW9zLnRvQnl0ZUFycmF5KCkpOworCisgICAgUmVhZENvdW50aW5nVHJhbnNwb3J0IGNvdW50VHJhbnMgPSBuZXcgUmVhZENvdW50aW5nVHJhbnNwb3J0KG1lbWJ1Zik7CisgICAgVFRyYW5zcG9ydCB0cmFucyA9IGdldFRyYW5zcG9ydChjb3VudFRyYW5zLCBtYXhMZW5ndGgpOworCisgICAgYnl0ZVtdIHJlYWRCdWYgPSBuZXcgYnl0ZVsxMF07CisgICAgdHJ5IHsKKyAgICAgIHRyYW5zLnJlYWQocmVhZEJ1ZiwgMCwgNCk7CisgICAgICBmYWlsKCJFeHBlY3RlZCBhIFRUcmFuc3BvcnRFeGNlcHRpb24iKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbiBiZWNhdXNlIHRoZSBmcmFtZSB3ZSdyZSB0cnlpbmcgdG8gcmVhZCBpcyBsYXJnZXIgdGhhbiBvdXIgbWF4IGZyYW1lIGxlbmd0aAorICAgICAgYXNzZXJ0RXF1YWxzKFRUcmFuc3BvcnRFeGNlcHRpb24uQ09SUlVQVEVEX0RBVEEsIGUuZ2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICBhc3NlcnRGYWxzZSh0cmFucy5pc09wZW4oKSk7CisKKyAgICB0cnkgeworICAgICAgdHJhbnMucmVhZChyZWFkQnVmLCAwLCA0KTsKKyAgICAgIGZhaWwoIkV4cGVjdGVkIGEgVFRyYW5zcG9ydEV4Y2VwdGlvbiIpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgLy8gVGhpcyB0aW1lIHdlIGdldCBhbiBleGNlcHRpb24gaW5kaWNhdGluZyB0aGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkCisgICAgICBhc3NlcnRFcXVhbHMoVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgZS5nZXRUeXBlKCkpOworICAgIH0KKyAgfQorCiAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZSgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgV3JpdGVDb3VudGluZ1RyYW5zcG9ydCBjb3VudGluZ1RyYW5zID0gbmV3IFdyaXRlQ291bnRpbmdUcmFuc3BvcnQobmV3IFRJT1N0cmVhbVRyYW5zcG9ydChuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oYmFvcykpKTsKQEAgLTg3LDExICsxMjUsMTEgQEAKICAgICBhc3NlcnRFcXVhbHMoMCwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKIAogICAgIHRyYW5zLmZsdXNoKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIGNvdW50aW5nVHJhbnMud3JpdGVDb3VudCk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50aW5nVHJhbnMud3JpdGVDb3VudCk7CiAKICAgICB0cmFucy53cml0ZShieXRlU2VxdWVuY2UoMCwgMjQ1KSk7CiAgICAgdHJhbnMuZmx1c2goKTsKLSAgICBhc3NlcnRFcXVhbHMoNCwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKIAogICAgIERhdGFJbnB1dFN0cmVhbSBkaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKICAgICBhc3NlcnRFcXVhbHMoMjU2LCBkaW4ucmVhZEludCgpKTsKQEAgLTE0NSw0ICsxODMsMzIgQEAKICAgICBhc3NlcnRFcXVhbHMoNjUsIHRyYW5zLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSk7CiAgICAgYXNzZXJ0RXF1YWxzKDEwLCB0cmFucy5nZXRCdWZmZXJQb3NpdGlvbigpKTsKICAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHRocm93cyBJT0V4Y2VwdGlvbiwgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgRGF0YU91dHB1dFN0cmVhbSBkb3MgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShiYW9zKTsKKyAgICBkb3Mud3JpdGVJbnQoMjIwKTsKKyAgICBkb3Mud3JpdGUoYnl0ZVNlcXVlbmNlKDAsIDIxOSkpOworCisgICAgVE1lbW9yeUJ1ZmZlciBtZW1idWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcigwKTsKKyAgICBtZW1idWYud3JpdGUoYmFvcy50b0J5dGVBcnJheSgpKTsKKworICAgIFJlYWRDb3VudGluZ1RyYW5zcG9ydCBjb3VudFRyYW5zID0gbmV3IFJlYWRDb3VudGluZ1RyYW5zcG9ydChtZW1idWYpOworICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBnZXRUcmFuc3BvcnQoY291bnRUcmFucyk7CisKKyAgICBieXRlW10gcmVhZEJ1ZiA9IG5ldyBieXRlWzIyMF07CisgICAgdHJhbnMucmVhZChyZWFkQnVmLCAwLCAyMjApOworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZWFkQnVmLCBieXRlU2VxdWVuY2UoMCwyMTkpKSk7CisKKyAgICBhc3NlcnRUcnVlKHRyYW5zIGluc3RhbmNlb2YgVEZyYW1lZFRyYW5zcG9ydCB8fCB0cmFucyBpbnN0YW5jZW9mIFRGYXN0RnJhbWVkVHJhbnNwb3J0KTsKKyAgICBpZiAodHJhbnMgaW5zdGFuY2VvZiBURnJhbWVkVHJhbnNwb3J0KSB7CisgICAgICBhc3NlcnRUcnVlKHRyYW5zLmdldEJ1ZmZlcigpICE9IG51bGwgJiYgdHJhbnMuZ2V0QnVmZmVyKCkubGVuZ3RoID4gMCk7CisgICAgICAoKFRGcmFtZWRUcmFuc3BvcnQpIHRyYW5zKS5jbGVhcigpOworICAgICAgYXNzZXJ0VHJ1ZSh0cmFucy5nZXRCdWZmZXIoKSA9PSBudWxsKTsKKyAgICB9IGVsc2UgaWYgKHRyYW5zIGluc3RhbmNlb2YgVEZhc3RGcmFtZWRUcmFuc3BvcnQpIHsKKyAgICAgIGFzc2VydFRydWUodHJhbnMuZ2V0QnVmZmVyKCkubGVuZ3RoID4gVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0LklOSVRJQUxfQ0FQQUNJVFkpOworICAgICAgKChURmFzdEZyYW1lZFRyYW5zcG9ydCkgdHJhbnMpLmNsZWFyKCk7CisgICAgICBhc3NlcnRUcnVlKHRyYW5zLmdldEJ1ZmZlcigpLmxlbmd0aCA9PSBUZXN0VEZhc3RGcmFtZWRUcmFuc3BvcnQuSU5JVElBTF9DQVBBQ0lUWSk7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnkuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhCmluZGV4IDRiYmE0NTEuLjAzMmMyZWIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhCkBAIC00NSwxNyArNDUsMjIgQEAKICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgcmV0dXJuIFRTU0xUcmFuc3BvcnRGYWN0b3J5LmdldENsaWVudFNvY2tldChIT1NULCBQT1JUKTsKICAgfQorICAKKyAgcHJvdGVjdGVkIFRTZXJ2ZXJTb2NrZXQgZ2V0U2VydmVyVHJhbnNwb3J0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIFRTU0xUcmFuc3BvcnRGYWN0b3J5LmdldFNlcnZlclNvY2tldChQT1JUKTsKKyAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBzdGFydFNlcnZlcihmaW5hbCBUUHJvY2Vzc29yIHByb2Nlc3NvciwgZmluYWwgVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnkpCisgIHB1YmxpYyB2b2lkIHN0YXJ0U2VydmVyKGZpbmFsIFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBmaW5hbCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSwgZmluYWwgVFRyYW5zcG9ydEZhY3RvcnkgZmFjdG9yeSkKICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgc2VydmVyVGhyZWFkID0gbmV3IFRocmVhZCgpIHsKICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCA9IFRTU0xUcmFuc3BvcnRGYWN0b3J5LmdldFNlcnZlclNvY2tldChQT1JUKTsKLSAgICAgICAgICBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihuZXcgQXJncyhzZXJ2ZXJUcmFuc3BvcnQpLnByb2Nlc3Nvcihwcm9jZXNzb3IpKTsKKyAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCA9IGdldFNlcnZlclRyYW5zcG9ydCgpOworICAgICAgICAgIGZpbmFsIEFyZ3MgYXJncyA9IG5ldyBBcmdzKHNlcnZlclRyYW5zcG9ydCkucHJvY2Vzc29yKHByb2Nlc3Nvcik7CisgICAgICAgICAgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoYXJncyk7CiAgICAgICAgICAgc2VydmVyLnNlcnZlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgYXNzZXJ0IGZhbHNlOwogICAgICAgICB9CkBAIC02Myw3ICs2OCw3IEBACiAgICAgfTsKIAogICAgIHNlcnZlclRocmVhZC5zdGFydCgpOwotICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICBUaHJlYWQuc2xlZXAoU0xFRVBfREVMQVkpOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC03OSw0ICs4NCw5IEBACiAgIHB1YmxpYyBMaXN0PFRQcm90b2NvbEZhY3Rvcnk+IGdldFByb3RvY29scygpIHsKICAgICByZXR1cm4gcHJvdG9jb2xzOwogICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc3BvcnRGYWN0b3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gdGhpcyB0ZXN0IGRvZXNuJ3QgcmVhbGx5IGFwcGx5IHRvIHRoaXMgc3VpdGUsIHNvIGxldCdzIHNraXAgaXQuCisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeUN1c3RvbUNsaWVudDEuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeUN1c3RvbUNsaWVudDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTE2NTlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5Q3VzdG9tQ2xpZW50MS5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK3B1YmxpYyBjbGFzcyBUZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlDdXN0b21DbGllbnQxIGV4dGVuZHMgVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5IHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFRUcmFuc3BvcnQgZ2V0Q2xpZW50VHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZ1RyYW5zcG9ydCkKKyAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMgcGFyYW1zID0gbmV3CisgICAgICBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycygpOworCisgICAgcGFyYW1zLnNldFRydXN0U3RvcmUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmUiKSwKKyAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlUGFzc3dvcmQiKSk7CisKKyAgICByZXR1cm4gVFNTTFRyYW5zcG9ydEZhY3RvcnkuZ2V0Q2xpZW50U29ja2V0KEhPU1QsIFBPUlQsIDAvKnRpbWVvdXQqLywgcGFyYW1zKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5Q3VzdG9tQ2xpZW50Mi5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5Q3VzdG9tQ2xpZW50Mi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZWQ0NjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlDdXN0b21DbGllbnQyLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworcHVibGljIGNsYXNzIFRlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeUN1c3RvbUNsaWVudDIgZXh0ZW5kcyBUZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnkgeworCisgIEBPdmVycmlkZQorICBwdWJsaWMgVFRyYW5zcG9ydCBnZXRDbGllbnRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nVHJhbnNwb3J0KQorICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBwYXJhbXMgPSBuZXcKKyAgICAgIFRTU0xUcmFuc3BvcnRGYWN0b3J5LlRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzKCk7CisKKyAgICBwYXJhbXMuc2V0VHJ1c3RTdG9yZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZSIpLCBudWxsKTsKKworICAgIHJldHVybiBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRDbGllbnRTb2NrZXQoSE9TVCwgUE9SVCwgMC8qdGltZW91dCovLCBwYXJhbXMpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlTdHJlYW1lZFN0b3JlLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlTdHJlYW1lZFN0b3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViZjVjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeVN0cmVhbWVkU3RvcmUuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CisKK3B1YmxpYyBjbGFzcyBUZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlTdHJlYW1lZFN0b3JlIGV4dGVuZHMgVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5IHsKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGtleVN0b3JlTG9jYXRpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wua2V5U3RvcmUiKTsKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRydXN0U3RvcmVMb2NhdGlvbiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIik7CisgIAorICBwdWJsaWMgVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5U3RyZWFtZWRTdG9yZSgpIHsKKyAgICBzdXBlcigpOworICAgIAorICAgIC8qKgorICAgICAqICBPdmVycmlkZSBzeXN0ZW0gcHJvcGVydGllcyB0byBiZSBhYmxlIHRvIHRlc3QgcGFzc2luZworICAgICAqICB0aGUgdHJ1c3RTdG9yZSBhbmQga2V5U3RvcmUgYXMgaW5wdXQgc3RyZWFtCisgICAgICovCisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmUiLCAiIik7CisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLmtleVN0b3JlIiwgIiIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBUVHJhbnNwb3J0IGdldENsaWVudFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmdUcmFuc3BvcnQpCisgIHRocm93cyBFeGNlcHRpb24geworICAgIFRTU0xUcmFuc3BvcnRGYWN0b3J5LlRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldworICAgICAgVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMoKTsKKworICAgIHBhcmFtcy5zZXRUcnVzdFN0b3JlKG5ldyBGaWxlSW5wdXRTdHJlYW0odHJ1c3RTdG9yZUxvY2F0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkIikpOworICAgIAorICAgIHJldHVybiBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRDbGllbnRTb2NrZXQoSE9TVCwgUE9SVCwgMC8qdGltZW91dCovLCBwYXJhbXMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBUU2VydmVyU29ja2V0IGdldFNlcnZlclRyYW5zcG9ydCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRTU0xUcmFuc3BvcnRGYWN0b3J5LlRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldworICAgICAgICBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycygpOworICAgIAorICAgIHBhcmFtcy5zZXRLZXlTdG9yZShuZXcgRmlsZUlucHV0U3RyZWFtKGtleVN0b3JlTG9jYXRpb24pLCAKKyAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQiKSk7CisgICAgCisgICAgcmV0dXJuIFRTU0xUcmFuc3BvcnRGYWN0b3J5LmdldFNlcnZlclNvY2tldChQT1JULCAwLyp0aW1lb3V0Ki8sIEluZXRBZGRyZXNzLmdldEJ5TmFtZShIT1NUKSwgcGFyYW1zKTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU2FzbFRyYW5zcG9ydHMuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU2FzbFRyYW5zcG9ydHMuamF2YQppbmRleCBlMTJkNmZlLi4zNmEwNmU5IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNhc2xUcmFuc3BvcnRzLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTYXNsVHJhbnNwb3J0cy5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKQEAgLTczLDcgKzc0LDcgQEAKICAgICAgICsgInNjb3JlIGFuZCBzZXZlbiB5ZWFycyBhZ28gb3VyIGZhdGhlcnMgYnJvdWdodCBmb3J0aCBvbiB0aGlzICIKICAgICAgICsgImNvbnRpbmVudCBhIG5ldyBuYXRpb24sIGNvbmNlaXZlZCBpbiBsaWJlcnR5LCBhbmQgZGVkaWNhdGVkIHRvIHRoZSAiCiAgICAgICArICJwcm9wb3NpdGlvbiB0aGF0IGFsbCBtZW4gYXJlIGNyZWF0ZWQgZXF1YWwuIjsKLSAgCisKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRlc3RNZXNzYWdlMiA9ICJJIGhhdmUgYSBkcmVhbSB0aGF0IG9uZSBkYXkgIgogICAgICAgKyAidGhpcyBuYXRpb24gd2lsbCByaXNlIHVwIGFuZCBsaXZlIG91dCB0aGUgdHJ1ZSBtZWFuaW5nIG9mIGl0cyBjcmVlZDogIgogICAgICAgKyAiJ1dlIGhvbGQgdGhlc2UgdHJ1dGhzIHRvIGJlIHNlbGYtZXZpZGVudCwgdGhhdCBhbGwgbWVuIGFyZSBjcmVhdGVkIGVxdWFsLiciOwpAQCAtMTIzLDcgKzEyNCw5IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGludGVybmFsUnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICBUU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IG5ldyBUU2VydmVyU29ja2V0KFNlcnZlclRlc3RCYXNlLlBPUlQpOworICAgICAgVFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQgPSBuZXcgVFNlcnZlclNvY2tldCgKKyAgICAgICAgbmV3IFRTZXJ2ZXJTb2NrZXQuU2VydmVyU29ja2V0VHJhbnNwb3J0QXJncygpLgorICAgICAgICAgIHBvcnQoU2VydmVyVGVzdEJhc2UuUE9SVCkpOwogICAgICAgdHJ5IHsKICAgICAgICAgYWNjZXB0QW5kV3JpdGUoc2VydmVyU29ja2V0KTsKICAgICAgIH0gZmluYWxseSB7CkBAIC0yNzUsMTIgKzI3OCwxMiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2VydmVyKGZpbmFsIFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBmaW5hbCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgc3RhcnRTZXJ2ZXIoZmluYWwgVFByb2Nlc3NvciBwcm9jZXNzb3IsIGZpbmFsIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9GYWN0b3J5LCBmaW5hbCBUVHJhbnNwb3J0RmFjdG9yeSBmYWN0b3J5KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgIHNlcnZlclRocmVhZCA9IG5ldyBUaHJlYWQoKSB7CiAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gVHJhbnNwb3J0Ci0gICAgICAgICAgICBUU2VydmVyU29ja2V0IHNvY2tldCA9IG5ldyBUU2VydmVyU29ja2V0KFBPUlQpOworICAgICAgICAgICAgVFNlcnZlclNvY2tldCBzb2NrZXQgPSBuZXcgVFNlcnZlclNvY2tldChuZXcgVFNlcnZlclNvY2tldC5TZXJ2ZXJTb2NrZXRUcmFuc3BvcnRBcmdzKCkucG9ydChQT1JUKSk7CiAKICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGZhY3RvcnkgPSBuZXcgVFNhc2xTZXJ2ZXJUcmFuc3BvcnQuRmFjdG9yeSgKICAgICAgICAgICAgICAgV1JBUFBFRF9NRUNIQU5JU00sIFNFUlZJQ0UsIEhPU1QsIFdSQVBQRURfUFJPUFMsCkBAIC0zMzAsMTIgKzMzMyw4IEBACiAgICAgICAgIHRocm93IG5ldyBTYXNsRXhjZXB0aW9uKCJBbHJlYWR5IGNvbXBsZXRlISIpOwogICAgICAgfQogCi0gICAgICB0cnkgewotICAgICAgICBoYXNQcm92aWRlZEluaXRpYWxSZXNwb25zZSA9IHRydWU7Ci0gICAgICAgIHJldHVybiB1c2VybmFtZS5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFNhc2xFeGNlcHRpb24oZS50b1N0cmluZygpKTsKLSAgICAgIH0KKyAgICAgIGhhc1Byb3ZpZGVkSW5pdGlhbFJlc3BvbnNlID0gdHJ1ZTsKKyAgICAgIHJldHVybiB1c2VybmFtZS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgICB9CiAgICAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsgcmV0dXJuIGhhc1Byb3ZpZGVkSW5pdGlhbFJlc3BvbnNlOyB9CiAgICAgcHVibGljIGJ5dGVbXSB1bndyYXAoYnl0ZVtdIGluY29taW5nLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB7CkBAIC0zNTIsMTEgKzM1MSw3IEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgdXNlcjsKICAgICBwdWJsaWMgU3RyaW5nIGdldE1lY2hhbmlzbU5hbWUoKSB7IHJldHVybiAiQU5PTllNT1VTIjsgfQogICAgIHB1YmxpYyBieXRlW10gZXZhbHVhdGVSZXNwb25zZShieXRlW10gcmVzcG9uc2UpIHRocm93cyBTYXNsRXhjZXB0aW9uIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIHRoaXMudXNlciA9IG5ldyBTdHJpbmcocmVzcG9uc2UsICJVVEYtOCIpOwotICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgU2FzbEV4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotICAgICAgfQorICAgICAgdGhpcy51c2VyID0gbmV3IFN0cmluZyhyZXNwb25zZSwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAgICAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsgcmV0dXJuIHVzZXIgIT0gbnVsbDsgfQpAQCAtNDEwLDQgKzQwNSw2NyBAQAogICAgICAgcHV0KCJTYXNsU2VydmVyRmFjdG9yeS5BTk9OWU1PVVMiLCBTYXNsQW5vbnltb3VzRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOwogICAgIH0KICAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1vY2tUVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CisKKyAgICBieXRlW10gYmFkSGVhZGVyID0gbnVsbDsKKyAgICBwcml2YXRlIFRNZW1vcnlJbnB1dFRyYW5zcG9ydCByZWFkQnVmZmVyID0gbmV3IFRNZW1vcnlJbnB1dFRyYW5zcG9ydCgpOworCisgICAgcHVibGljIE1vY2tUVHJhbnNwb3J0KGludCBtb2RlKSB7CisgICAgICBpZiAobW9kZT09MSkgeworICAgICAgICAvLyBJbnZhbGlkIHN0YXR1cyBieXRlCisgICAgICAgIGJhZEhlYWRlciA9IG5ldyBieXRlW10geyAoYnl0ZSkweEZGLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDA1IH07CisgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gMikgeworICAgICAgICAvLyBWYWxpZCBzdGF0dXMgYnl0ZSwgbmVnYXRpdmUgcGF5bG9hZCBsZW5ndGgKKyAgICAgICAgYmFkSGVhZGVyID0gbmV3IGJ5dGVbXSB7IChieXRlKTB4MDEsIChieXRlKTB4RkYsIChieXRlKTB4RkYsIChieXRlKTB4RkYsIChieXRlKTB4RkYgfTsKKyAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSAzKSB7CisgICAgICAgIC8vIFZhbGlkIHN0YXR1cyBieXRlLCBleGNlc3NpdmVseSBsYXJnZSwgYm9ndXMgcGF5bG9hZCBsZW5ndGgKKyAgICAgICAgYmFkSGVhZGVyID0gbmV3IGJ5dGVbXSB7IChieXRlKTB4MDEsIChieXRlKTB4NjQsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MDAgfTsKKyAgICAgIH0KKyAgICAgIHJlYWRCdWZmZXIucmVzZXQoYmFkSGVhZGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24ge30KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkge30KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gcmVhZEJ1ZmZlci5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHt9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0QmFkSGVhZGVyKCkgeworICAgIFRTYXNsVHJhbnNwb3J0IHNhc2xUcmFuc3BvcnQgPSBuZXcgVFNhc2xTZXJ2ZXJUcmFuc3BvcnQobmV3IE1vY2tUVHJhbnNwb3J0KDEpKTsKKyAgICB0cnkgeworICAgICAgc2FzbFRyYW5zcG9ydC5yZWNlaXZlU2FzbE1lc3NhZ2UoKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGdvdHRlbiBhbiBlcnJvciBkdWUgdG8gaW5jb3JyZWN0IHN0YXR1cyBieXRlIHZhbHVlLiIpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgYXNzZXJ0RXF1YWxzKGUuZ2V0TWVzc2FnZSgpLCAiSW52YWxpZCBzdGF0dXMgLTEiKTsKKyAgICB9CisgICAgc2FzbFRyYW5zcG9ydCA9IG5ldyBUU2FzbFNlcnZlclRyYW5zcG9ydChuZXcgTW9ja1RUcmFuc3BvcnQoMikpOworICAgIHRyeSB7CisgICAgICBzYXNsVHJhbnNwb3J0LnJlY2VpdmVTYXNsTWVzc2FnZSgpOworICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIGFuIGVycm9yIGR1ZSB0byBuZWdhdGl2ZSBwYXlsb2FkIGxlbmd0aC4iKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgIGFzc2VydEVxdWFscyhlLmdldE1lc3NhZ2UoKSwgIkludmFsaWQgcGF5bG9hZCBoZWFkZXIgbGVuZ3RoOiAtMSIpOworICAgIH0KKyAgICBzYXNsVHJhbnNwb3J0ID0gbmV3IFRTYXNsU2VydmVyVHJhbnNwb3J0KG5ldyBNb2NrVFRyYW5zcG9ydCgzKSk7CisgICAgdHJ5IHsKKyAgICAgIHNhc2xUcmFuc3BvcnQucmVjZWl2ZVNhc2xNZXNzYWdlKCk7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gYW4gZXJyb3IgZHVlIHRvIGJvZ3VzIChsYXJnZSkgcGF5bG9hZCBsZW5ndGguIik7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICBhc3NlcnRFcXVhbHMoZS5nZXRNZXNzYWdlKCksICJJbnZhbGlkIHBheWxvYWQgaGVhZGVyIGxlbmd0aDogMTY3NzcyMTYwMCIpOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTaW1wbGVGaWxlVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNpbXBsZUZpbGVUcmFuc3BvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjg4MGY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTaW1wbGVGaWxlVHJhbnNwb3J0LmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFRlc3RUU2ltcGxlRmlsZVRyYW5zcG9ydCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHVibGljIHZvaWQgdGVzdEZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy9UZXN0IHdyaXRlIHNpZGUKKyAgICBQYXRoIHRlbXBGaWxlUGF0aE5hbWUgPSBGaWxlcy5jcmVhdGVUZW1wRmlsZSgiVFNpbXBsZUZpbGVUcmFuc3BvcnRUZXN0IiwgbnVsbCk7CisgICAgRmlsZXMuZGVsZXRlKHRlbXBGaWxlUGF0aE5hbWUpOworICAgIGJ5dGVbXSBpbnB1dF9idWYgPSBuZXcgYnl0ZVtdezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwfTsKKyAgICBUU2ltcGxlRmlsZVRyYW5zcG9ydCB0cmFuc193cml0ZSA9IG5ldyBUU2ltcGxlRmlsZVRyYW5zcG9ydCh0ZW1wRmlsZVBhdGhOYW1lLnRvU3RyaW5nKCksZmFsc2UsIHRydWUsIGZhbHNlKTsKKyAgICBhc3NlcnQgKCF0cmFuc193cml0ZS5pc09wZW4oKSk7CisgICAgdHJhbnNfd3JpdGUub3BlbigpOworICAgIGFzc2VydCh0cmFuc193cml0ZS5pc09wZW4oKSk7CisgICAgdHJhbnNfd3JpdGUud3JpdGUoaW5wdXRfYnVmKTsKKyAgICB0cmFuc193cml0ZS53cml0ZShpbnB1dF9idWYsMiwyKTsKKyAgICB0cmFuc193cml0ZS5mbHVzaCgpOworICAgIHRyYW5zX3dyaXRlLmNsb3NlKCk7CisKKyAgICAvL1Rlc3QgcmVhZCBzaWRlCisgICAgVFNpbXBsZUZpbGVUcmFuc3BvcnQgdHJhbnMgPSBuZXcgVFNpbXBsZUZpbGVUcmFuc3BvcnQodGVtcEZpbGVQYXRoTmFtZS50b1N0cmluZygpLHRydWUsIGZhbHNlKTsKKyAgICBhc3NlcnQodHJhbnMuaXNPcGVuKCkpOworCisgICAgLy9TaW1wbGUgZmlsZSB0cmFucyBwcm92aWRlcyBubyBidWZmZXIgYWNjZXNzCisgICAgYXNzZXJ0KDAgPT0gdHJhbnMuZ2V0QnVmZmVyUG9zaXRpb24oKSk7CisgICAgYXNzZXJ0KG51bGwgPT0gdHJhbnMuZ2V0QnVmZmVyKCkpOworICAgIGFzc2VydCgtMSA9PSB0cmFucy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkpOworCisgICAgLy9UZXN0IGZpbGUgcG9pbnRlciBvcGVyYXRpb25zCisgICAgYXNzZXJ0KDAgPT0gdHJhbnMuZ2V0RmlsZVBvaW50ZXIoKSk7CisgICAgYXNzZXJ0KDEyID09IHRyYW5zLmxlbmd0aCgpKTsKKworICAgIGZpbmFsIGludCBCVUZTSVogPSA0OworICAgIGJ5dGVbXSBidWYxID0gbmV3IGJ5dGVbQlVGU0laXTsKKyAgICB0cmFucy5yZWFkQWxsKGJ1ZjEsIDAsIEJVRlNJWik7CisgICAgYXNzZXJ0KEJVRlNJWiA9PSB0cmFucy5nZXRGaWxlUG9pbnRlcigpKTsKKyAgICBhc3NlcnQoQXJyYXlzLmVxdWFscyhuZXcgYnl0ZVtdezEsIDIsIDMsIDR9LCBidWYxKSk7CisKKyAgICBpbnQgYnl0ZXNSZWFkID0gdHJhbnMucmVhZChidWYxLCAwLCBCVUZTSVopOworICAgIGFzc2VydChieXRlc1JlYWQgPiAwKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzUmVhZDsgKytpKSB7CisgICAgICBhc3NlcnQoYnVmMVtpXSA9PSBpKzUpOworICAgIH0KKworICAgIHRyYW5zLnNlZWsoMCk7CisgICAgYXNzZXJ0KDAgPT0gdHJhbnMuZ2V0RmlsZVBvaW50ZXIoKSk7CisgICAgdHJhbnMucmVhZEFsbChidWYxLCAwLCBCVUZTSVopOworICAgIGFzc2VydChBcnJheXMuZXF1YWxzKG5ldyBieXRlW117MSwgMiwgMywgNH0sIGJ1ZjEpKTsKKyAgICBhc3NlcnQoQlVGU0laID09IHRyYW5zLmdldEZpbGVQb2ludGVyKCkpOworICAgIHRyYW5zLmNsb3NlKCk7CisgICAgRmlsZXMuZGVsZXRlKHRlbXBGaWxlUGF0aE5hbWUpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFpsaWJUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUWmxpYlRyYW5zcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkN2Y5YzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFpsaWJUcmFuc3BvcnQuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkRhdGFGb3JtYXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLnppcC5EZWZsYXRlck91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkluZmxhdGVySW5wdXRTdHJlYW07CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0VFpsaWJUcmFuc3BvcnQgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHJvdGVjdGVkIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZykgeworICAgIHJldHVybiBuZXcgVFpsaWJUcmFuc3BvcnQodW5kZXJseWluZyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBieXRlU2VxdWVuY2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2VuZC1zdGFydCsxXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8PSAoZW5kLXN0YXJ0KTsgaSsrKSB7CisgICAgICByZXN1bHRbaV0gPSAoYnl0ZSkoc3RhcnQraSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2UoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgV3JpdGVDb3VudGluZ1RyYW5zcG9ydCBjb3VudGluZ1RyYW5zID0gbmV3IFdyaXRlQ291bnRpbmdUcmFuc3BvcnQobmV3IFRJT1N0cmVhbVRyYW5zcG9ydChuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0KKyAgICAgICAgKGJhb3MpKSk7CisgICAgVFRyYW5zcG9ydCB0cmFucyA9IGdldFRyYW5zcG9ydChjb3VudGluZ1RyYW5zKTsKKyAgICB0cmFucy53cml0ZShieXRlU2VxdWVuY2UoMCwgMjQ1KSk7CisgICAgY291bnRpbmdUcmFucy5jbG9zZSgpOworICAgIHRyYW5zLmNsb3NlKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VPcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBnZXRUcmFuc3BvcnQobmV3IFRJT1N0cmVhbVRyYW5zcG9ydChiYW9zKSk7CisgICAgYnl0ZVtdIHVuY29tcHJlc3NlZCA9IGJ5dGVTZXF1ZW5jZSgwLCAyNDUpOworICAgIHRyYW5zLndyaXRlKHVuY29tcHJlc3NlZCk7CisgICAgdHJhbnMuY2xvc2UoKTsKKyAgICBmaW5hbCBieXRlW10gY29tcHJlc3NlZCA9IGJhb3MudG9CeXRlQXJyYXkoKTsKKworICAgIGZpbmFsIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsyNTVdOworICAgIFRUcmFuc3BvcnQgdHJhbnNSZWFkID0gZ2V0VHJhbnNwb3J0KG5ldyBUSU9TdHJlYW1UcmFuc3BvcnQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbXByZXNzZWQpKSk7CisgICAgaW50IHJlYWRCeXRlcyA9IHRyYW5zUmVhZC5yZWFkKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CisgICAgYXNzZXJ0RXF1YWxzKHVuY29tcHJlc3NlZC5sZW5ndGgsIHJlYWRCeXRlcyk7CisgICAgdHJhbnNSZWFkLmNsb3NlKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgRGVmbGF0ZXJPdXRwdXRTdHJlYW0gZGVmbGF0ZXJPdXRwdXRTdHJlYW0gPSBuZXcgRGVmbGF0ZXJPdXRwdXRTdHJlYW0oYmFvcyk7CisgICAgRGF0YU91dHB1dFN0cmVhbSBkb3MgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShkZWZsYXRlck91dHB1dFN0cmVhbSk7CisgICAgZG9zLndyaXRlKGJ5dGVTZXF1ZW5jZSgwLCA0OSkpOworICAgIGRvcy53cml0ZShieXRlU2VxdWVuY2UoMCwgMjE5KSk7CisKKyAgICBkZWZsYXRlck91dHB1dFN0cmVhbS5maW5pc2goKTsKKworICAgIFRNZW1vcnlCdWZmZXIgbWVtYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoMCk7CisgICAgbWVtYnVmLndyaXRlKGJhb3MudG9CeXRlQXJyYXkoKSk7CisKKyAgICBSZWFkQ291bnRpbmdUcmFuc3BvcnQgY291bnRUcmFucyA9IG5ldyBSZWFkQ291bnRpbmdUcmFuc3BvcnQobWVtYnVmKTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zID0gZ2V0VHJhbnNwb3J0KGNvdW50VHJhbnMpOworCisgICAgYnl0ZVtdIHJlYWRCdWYgPSBuZXcgYnl0ZVsxMF07CisgICAgdHJhbnMucmVhZChyZWFkQnVmLCAwLCAxMCk7CisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlYWRCdWYsIGJ5dGVTZXF1ZW5jZSgwLDkpKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50VHJhbnMucmVhZENvdW50KTsKKworICAgIHRyYW5zLnJlYWQocmVhZEJ1ZiwgMCwgMTApOworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZWFkQnVmLCBieXRlU2VxdWVuY2UoMTAsMTkpKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50VHJhbnMucmVhZENvdW50KTsKKworICAgIGFzc2VydEVxdWFscygzMCwgdHJhbnMucmVhZChuZXcgYnl0ZVszMF0sIDAsIDMwKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50VHJhbnMucmVhZENvdW50KTsKKworICAgIHJlYWRCdWYgPSBuZXcgYnl0ZVsyMjBdOworICAgIGFzc2VydEVxdWFscygyMjAsIHRyYW5zLnJlYWQocmVhZEJ1ZiwgMCwgMjIwKSk7CisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlYWRCdWYsIGJ5dGVTZXF1ZW5jZSgwLCAyMTkpKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50VHJhbnMucmVhZENvdW50KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZSgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgRGF0YUZvcm1hdEV4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgV3JpdGVDb3VudGluZ1RyYW5zcG9ydCBjb3VudGluZ1RyYW5zID0gbmV3IFdyaXRlQ291bnRpbmdUcmFuc3BvcnQobmV3IFRJT1N0cmVhbVRyYW5zcG9ydChuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oYmFvcykpKTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zID0gZ2V0VHJhbnNwb3J0KGNvdW50aW5nVHJhbnMpOworCisgICAgdHJhbnMud3JpdGUoYnl0ZVNlcXVlbmNlKDAsIDEwMCkpOworICAgIGFzc2VydEVxdWFscygxLCBjb3VudGluZ1RyYW5zLndyaXRlQ291bnQpOworICAgIHRyYW5zLndyaXRlKGJ5dGVTZXF1ZW5jZSgxMDEsIDIwMCkpOworICAgIHRyYW5zLndyaXRlKGJ5dGVTZXF1ZW5jZSgyMDEsIDI1NSkpOworICAgIGFzc2VydEVxdWFscygxLCBjb3VudGluZ1RyYW5zLndyaXRlQ291bnQpOworCisgICAgdHJhbnMuZmx1c2goKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKKworICAgIHRyYW5zLndyaXRlKGJ5dGVTZXF1ZW5jZSgwLCAyNDUpKTsKKyAgICB0cmFucy5mbHVzaCgpOworICAgIGFzc2VydEVxdWFscygzLCBjb3VudGluZ1RyYW5zLndyaXRlQ291bnQpOworCisgICAgRGF0YUlucHV0U3RyZWFtIGRpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEluZmxhdGVySW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpKTsKKyAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMjU2XTsKKyAgICBpbnQgbiA9IGRpbi5yZWFkKGJ1ZiwgMCwgMjU2KTsKKyAgICBhc3NlcnRFcXVhbHMobiwgMjU2KTsKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYnl0ZVNlcXVlbmNlKDAsIDI1NSksIGJ1ZikpOworCisgICAgYnVmID0gbmV3IGJ5dGVbMjQ2XTsKKyAgICBuID0gZGluLnJlYWQoYnVmLCAwLCAyNDYpOworICAgIGFzc2VydEVxdWFscyhuLCAyNDYpOworICAgIGZvciAoaW50IGkgPSAwOyBpPGJ1Zi5sZW5ndGg7IGkrKykgeworICAgICAgYXNzZXJ0RXF1YWxzKCJmb3IgIitpLCBieXRlU2VxdWVuY2UoMCwyNDUpW2ldLCBidWZbaV0pOworICAgIH0KKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhieXRlU2VxdWVuY2UoMCwyNDUpLCBidWYpKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvamF2YW1lL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmphdmEKaW5kZXggZGU5YTE2Mi4uMmY4NjEyYSAxMDA2NDQKLS0tIGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmphdmEKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmphdmEKQEAgLTQxLDcgKzQxLDkgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlTU0lOR19SRVNVTFQgPSA1OwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5BTF9FUlJPUiA9IDY7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1RPQ09MX0VSUk9SID0gNzsKLQorICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1RSQU5TRk9STSA9IDg7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUFJPVE9DT0wgPSA5OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwOwogCiAgIHByb3RlY3RlZCBpbnQgdHlwZV8gPSBVTktOT1dOOwogCmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRNZXRhRGF0YS5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuamF2YQppbmRleCAxMWE1YTA4Li5iY2UwMmM3IDEwMDY0NAotLS0gYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRNZXRhRGF0YS5qYXZhCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZE1ldGFEYXRhLmphdmEKQEAgLTYzLDcgKzYzLDcgQEAKICAgICB0aGlzLnZhbHVlTWV0YURhdGEgPSB2TWV0YURhdGE7CiAgIH0KICAgCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRTdHJ1Y3RNZXRhRGF0YU1hcChDbGFzcyBzQ2xhc3MsIEhhc2h0YWJsZSBtYXApeworICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFN0cnVjdE1ldGFEYXRhTWFwKENsYXNzIHNDbGFzcywgSGFzaHRhYmxlIG1hcCl7CiAgICAgc3RydWN0TWFwLnB1dChzQ2xhc3MsIG1hcCk7CiAgIH0KIApAQCAtNzMsNyArNzMsNyBAQAogICAgKgogICAgKiBAcGFyYW0gc0NsYXNzIFRoZSBUQmFzZSBjbGFzcyBmb3Igd2hpY2ggdGhlIG1ldGFkYXRhIG1hcCBpcyByZXF1ZXN0ZWQKICAgICovCi0gIHB1YmxpYyBzdGF0aWMgSGFzaHRhYmxlIGdldFN0cnVjdE1ldGFEYXRhTWFwKENsYXNzIHNDbGFzcyl7CisgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEhhc2h0YWJsZSBnZXRTdHJ1Y3RNZXRhRGF0YU1hcChDbGFzcyBzQ2xhc3MpewogICAgIGlmICghc3RydWN0TWFwLmNvbnRhaW5zS2V5KHNDbGFzcykpeyAvLyBMb2FkIGNsYXNzIGlmIGl0IGhhc24ndCBiZWVuIGxvYWRlZAogICAgICAgdHJ5ewogICAgICAgICBzQ2xhc3MubmV3SW5zdGFuY2UoKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmphdmEKaW5kZXggMzdhOWZkOS4uYWJmYzk2NSAxMDA2NDQKLS0tIGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmphdmEKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmphdmEKQEAgLTU2LDI0ICs1NiwyMyBAQAogICAgIGlmIChsZW4gPT0gMykgewogICAgICAgZHN0W2RzdE9mZiArIDFdID0KICAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFLmNoYXJBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAoKHNyY1tzcmNPZmZdIDw8IDQpICsgKHNyY1tzcmNPZmYrMV0gPj4gNCkpICYgMHgzRik7CisgICAgICAgICAgICAgICAgICAgICAgICAgKChzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzApIHwgKChzcmNbc3JjT2ZmKzFdID4+IDQpICYgMHgwRikpOwogICAgICAgZHN0W2RzdE9mZiArIDJdID0KICAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFLmNoYXJBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAoKHNyY1tzcmNPZmYrMV0gPDwgMikgKyAoc3JjW3NyY09mZisyXSA+PiA2KSkgJiAweDNGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKHNyY1tzcmNPZmYrMV0gPDwgMikgJiAweDNDKSB8ICgoc3JjW3NyY09mZisyXSA+PiA2KSAmIDB4MDMpKTsKICAgICAgIGRzdFtkc3RPZmYgKyAzXSA9CiAgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRS5jaGFyQXQoc3JjW3NyY09mZisyXSAmIDB4M0YpOwogICAgIH0KICAgICBlbHNlIGlmIChsZW4gPT0gMikgewogICAgICAgZHN0W2RzdE9mZisxXSA9CiAgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRS5jaGFyQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjW3NyY09mZl0gPDwgNCkgKyAoc3JjW3NyY09mZisxXSA+PiA0KSkgJiAweDNGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzApIHwgKChzcmNbc3JjT2ZmKzFdID4+IDQpICYgMHgwRikpOwogICAgICAgZHN0W2RzdE9mZiArIDJdID0KLSAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFLmNoYXJBdCgoc3JjW3NyY09mZisxXSA8PCAyKSAmIDB4M0YpOwotCisgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRS5jaGFyQXQoKHNyY1tzcmNPZmYrMV0gPDwgMikgJiAweDNDKTsKICAgICB9CiAgICAgZWxzZSB7IC8vIGxlbiA9PSAxKSB7CiAgICAgICBkc3RbZHN0T2ZmICsgMV0gPQotICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEUuY2hhckF0KChzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4M0YpOworICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEUuY2hhckF0KChzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzApOwogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5qYXZhCmluZGV4IDFkMTY4ODkuLmY2ZmU3NjUgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5qYXZhCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5qYXZhCkBAIC0xLDQgKzEsNCBAQAotLyoKKyAvKgogICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKICAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCkBAIC0zNiw5ICszNiw2IEBACiAgIHByb3RlY3RlZCBib29sZWFuIHN0cmljdFJlYWRfID0gZmFsc2U7CiAgIHByb3RlY3RlZCBib29sZWFuIHN0cmljdFdyaXRlXyA9IHRydWU7CiAKLSAgcHJvdGVjdGVkIGludCByZWFkTGVuZ3RoXzsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tSZWFkTGVuZ3RoXyA9IGZhbHNlOwotCiAgIC8qKgogICAgKiBGYWN0b3J5CiAgICAqLwpAQCAtMzExLDcgKzMwOCw2IEBACiAKICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nQm9keShpbnQgc2l6ZSkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHRyeSB7Ci0gICAgICBjaGVja1JlYWRMZW5ndGgoc2l6ZSk7CiAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07CiAgICAgICB0cmFuc18ucmVhZEFsbChidWYsIDAsIHNpemUpOwogICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmLCAiVVRGLTgiKTsKQEAgLTMyMiwyOSArMzE4LDEyIEBACiAKICAgcHVibGljIGJ5dGVbXSByZWFkQmluYXJ5KCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBzaXplID0gcmVhZEkzMigpOwotICAgIGNoZWNrUmVhZExlbmd0aChzaXplKTsKICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07CiAgICAgdHJhbnNfLnJlYWRBbGwoYnVmLCAwLCBzaXplKTsKICAgICByZXR1cm4gYnVmOwogICB9CiAKICAgcHJpdmF0ZSBpbnQgcmVhZEFsbChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgY2hlY2tSZWFkTGVuZ3RoKGxlbik7CiAgICAgcmV0dXJuIHRyYW5zXy5yZWFkQWxsKGJ1Ziwgb2ZmLCBsZW4pOwogICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVhZExlbmd0aChpbnQgcmVhZExlbmd0aCkgewotICAgIHJlYWRMZW5ndGhfID0gcmVhZExlbmd0aDsKLSAgICBjaGVja1JlYWRMZW5ndGhfID0gdHJ1ZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNoZWNrUmVhZExlbmd0aChpbnQgbGVuZ3RoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgaWYgKGNoZWNrUmVhZExlbmd0aF8pIHsKLSAgICAgIHJlYWRMZW5ndGhfIC09IGxlbmd0aDsKLSAgICAgIGlmIChyZWFkTGVuZ3RoXyA8IDApIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk1lc3NhZ2UgbGVuZ3RoIGV4Y2VlZGVkOiAiICsgbGVuZ3RoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTE2ODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmphdmEKQEAgLTAsMCArMSw5NzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworLyoqCisgKiBKU09OIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciB0aHJpZnQuCisgKiBUaGlzIGlzIGEgZnVsbC1mZWF0dXJlZCBwcm90b2NvbCBzdXBwb3J0aW5nIHdyaXRlIGFuZCByZWFkLgorICogUGxlYXNlIHNlZSB0aGUgQysrIGNsYXNzIGhlYWRlciBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUKKyAqIHByb3RvY29sJ3Mgd2lyZSBmb3JtYXQuCisgKi8KK3B1YmxpYyBjbGFzcyBUSlNPTlByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sIHsKKworICAvKioKKyAgICogRmFjdG9yeSBmb3IgSlNPTiBwcm90b2NvbCBvYmplY3RzCisgICAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5IHsKKworICAgIHB1YmxpYyBUUHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgeworICAgICAgcmV0dXJuIG5ldyBUSlNPTlByb3RvY29sKHRyYW5zKTsKKyAgICB9CisKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgQ09NTUEgICAgICAgICAgICA9IG5ldyBieXRlW10geyAnLCcgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBDT0xPTiAgICAgICAgICAgID0gbmV3IGJ5dGVbXSB7ICc6JyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIExCUkFDRSAgICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ3snIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgUkJSQUNFICAgICAgICAgICA9IG5ldyBieXRlW10geyAnfScgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBMQlJBQ0tFVCAgICAgICAgID0gbmV3IGJ5dGVbXSB7ICdbJyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIFJCUkFDS0VUICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ10nIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgUVVPVEUgICAgICAgICAgICA9IG5ldyBieXRlW10geyAnIicgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBCQUNLU0xBU0ggICAgICAgID0gbmV3IGJ5dGVbXSB7ICdcXCcgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBaRVJPICAgICAgICAgICAgID0gbmV3IGJ5dGVbXSB7ICcwJyB9OworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgRVNDU0VRICAgICAgICAgICA9IG5ldyBieXRlW10geyAnXFwnLCAndScsICcwJywgJzAnIH07CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyAgICBWRVJTSU9OICAgICAgICAgID0gMTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIEpTT05fQ0hBUl9UQUJMRSAgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwIDEgMiAzIDQgNSA2IDcgOCA5IEEgQiBDIEQgRSBGICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAnYicsICd0JywgJ24nLCAwLCAnZicsICdyJywgMCwgMCwgLy8gMAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gMQorICAgICAgMSwgMSwgJyInLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyAgRVNDQVBFX0NIQVJTICAgICA9ICJcIlxcL2JmbnJ0IjsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIEVTQ0FQRV9DSEFSX1ZBTFMgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIicsICdcXCcsICcvJywgJ1xiJywgJ1xmJywgJ1xuJywgJ1xyJywgJ1x0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICAgICBERUZfU1RSSU5HX1NJWkUgID0gMTY7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBOQU1FX0JPT0wgICAgICAgID0gbmV3IGJ5dGVbXSB7ICd0JywgJ2YnIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgTkFNRV9CWVRFICAgICAgICA9IG5ldyBieXRlW10geyAnaScsICc4JyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfSTE2ICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ2knLCAnMScsICc2JyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfSTMyICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ2knLCAnMycsICcyJyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfSTY0ICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ2knLCAnNicsICc0JyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfRE9VQkxFICAgICAgPSBuZXcgYnl0ZVtdIHsgJ2QnLCAnYicsICdsJyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfU1RSVUNUICAgICAgPSBuZXcgYnl0ZVtdIHsgJ3InLCAnZScsICdjJyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfU1RSSU5HICAgICAgPSBuZXcgYnl0ZVtdIHsgJ3MnLCAndCcsICdyJyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfTUFQICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ20nLCAnYScsICdwJyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfTElTVCAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ2wnLCAncycsICd0JyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfU0VUICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ3MnLCAnZScsICd0JyB9OworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRTdHJ1Y3QgQU5PTllNT1VTX1NUUlVDVCA9IG5ldyBUU3RydWN0KCk7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIGdldFR5cGVOYW1lRm9yVHlwZUlEKGJ5dGUgdHlwZUlEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHN3aXRjaCAodHlwZUlEKSB7CisgICAgY2FzZSBUVHlwZS5CT09MOgorICAgICAgcmV0dXJuIE5BTUVfQk9PTDsKKyAgICBjYXNlIFRUeXBlLkJZVEU6CisgICAgICByZXR1cm4gTkFNRV9CWVRFOworICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgcmV0dXJuIE5BTUVfSTE2OworICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgcmV0dXJuIE5BTUVfSTMyOworICAgIGNhc2UgVFR5cGUuSTY0OgorICAgICAgcmV0dXJuIE5BTUVfSTY0OworICAgIGNhc2UgVFR5cGUuRE9VQkxFOgorICAgICAgcmV0dXJuIE5BTUVfRE9VQkxFOworICAgIGNhc2UgVFR5cGUuU1RSSU5HOgorICAgICAgcmV0dXJuIE5BTUVfU1RSSU5HOworICAgIGNhc2UgVFR5cGUuU1RSVUNUOgorICAgICAgcmV0dXJuIE5BTUVfU1RSVUNUOworICAgIGNhc2UgVFR5cGUuTUFQOgorICAgICAgcmV0dXJuIE5BTUVfTUFQOworICAgIGNhc2UgVFR5cGUuU0VUOgorICAgICAgcmV0dXJuIE5BTUVfU0VUOworICAgIGNhc2UgVFR5cGUuTElTVDoKKyAgICAgIHJldHVybiBOQU1FX0xJU1Q7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLk5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAiVW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIGdldFR5cGVJREZvclR5cGVOYW1lKGJ5dGVbXSBuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBieXRlIHJlc3VsdCA9IFRUeXBlLlNUT1A7CisgICAgaWYgKG5hbWUubGVuZ3RoID4gMSkgeworICAgICAgc3dpdGNoIChuYW1lWzBdKSB7CisgICAgICBjYXNlICdkJzoKKyAgICAgICAgcmVzdWx0ID0gVFR5cGUuRE9VQkxFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ2knOgorICAgICAgICBzd2l0Y2ggKG5hbWVbMV0pIHsKKyAgICAgICAgY2FzZSAnOCc6CisgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuQllURTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnMSc6CisgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuSTE2OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICczJzoKKyAgICAgICAgICByZXN1bHQgPSBUVHlwZS5JMzI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzYnOgorICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkk2NDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ2wnOgorICAgICAgICByZXN1bHQgPSBUVHlwZS5MSVNUOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ20nOgorICAgICAgICByZXN1bHQgPSBUVHlwZS5NQVA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAncic6CisgICAgICAgIHJlc3VsdCA9IFRUeXBlLlNUUlVDVDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdzJzoKKyAgICAgICAgaWYgKG5hbWVbMV0gPT0gJ3QnKSB7CisgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuU1RSSU5HOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG5hbWVbMV0gPT0gJ2UnKSB7CisgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuU0VUOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAndCc6CisgICAgICAgIHJlc3VsdCA9IFRUeXBlLkJPT0w7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAocmVzdWx0ID09IFRUeXBlLlNUT1ApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLk5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAiVW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8vIEJhc2UgY2xhc3MgZm9yIHRyYWNraW5nIEpTT04gY29udGV4dHMgdGhhdCBtYXkgcmVxdWlyZSBpbnNlcnRpbmcvcmVhZGluZworICAvLyBhZGRpdGlvbmFsIEpTT04gc3ludGF4IGNoYXJhY3RlcnMKKyAgLy8gVGhpcyBiYXNlIGNvbnRleHQgZG9lcyBub3RoaW5nLgorICBwcm90ZWN0ZWQgY2xhc3MgSlNPTkJhc2VDb250ZXh0IHsKKyAgICAvKioKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZSgpIHRocm93cyBURXhjZXB0aW9uIHt9CisKKyAgICAvKioKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZWFkKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KKworICAgIHByb3RlY3RlZCBib29sZWFuIGVzY2FwZU51bSgpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICAvLyBDb250ZXh0IGZvciBKU09OIGxpc3RzLiBXaWxsIGluc2VydC9yZWFkIGNvbW1hcyBiZWZvcmUgZWFjaCBpdGVtIGV4Y2VwdAorICAvLyBmb3IgdGhlIGZpcnN0IG9uZQorICBwcm90ZWN0ZWQgY2xhc3MgSlNPTkxpc3RDb250ZXh0IGV4dGVuZHMgSlNPTkJhc2VDb250ZXh0IHsKKyAgICBwcml2YXRlIGJvb2xlYW4gZmlyc3RfID0gdHJ1ZTsKKworICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgaWYgKGZpcnN0XykgeworICAgICAgICBmaXJzdF8gPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRyYW5zXy53cml0ZShDT01NQSk7CisgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcmVhZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIGlmIChmaXJzdF8pIHsKKyAgICAgICAgZmlyc3RfID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZWFkSlNPTlN5bnRheENoYXIoQ09NTUEpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIENvbnRleHQgZm9yIEpTT04gcmVjb3Jkcy4gV2lsbCBpbnNlcnQvcmVhZCBjb2xvbnMgYmVmb3JlIHRoZSB2YWx1ZSBwb3J0aW9uCisgIC8vIG9mIGVhY2ggcmVjb3JkIHBhaXIsIGFuZCBjb21tYXMgYmVmb3JlIGVhY2gga2V5IGV4Y2VwdCB0aGUgZmlyc3QuIEluCisgIC8vIGFkZGl0aW9uLCB3aWxsIGluZGljYXRlIHRoYXQgbnVtYmVycyBpbiB0aGUga2V5IHBvc2l0aW9uIG5lZWQgdG8gYmUKKyAgLy8gZXNjYXBlZCBpbiBxdW90ZXMgKHNpbmNlIEpTT04ga2V5cyBtdXN0IGJlIHN0cmluZ3MpLgorICBwcm90ZWN0ZWQgY2xhc3MgSlNPTlBhaXJDb250ZXh0IGV4dGVuZHMgSlNPTkJhc2VDb250ZXh0IHsKKyAgICBwcml2YXRlIGJvb2xlYW4gZmlyc3RfID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gY29sb25fID0gdHJ1ZTsKKworICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgaWYgKGZpcnN0XykgeworICAgICAgICBmaXJzdF8gPSBmYWxzZTsKKyAgICAgICAgY29sb25fID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRyYW5zXy53cml0ZShjb2xvbl8gPyBDT0xPTiA6IENPTU1BKTsKKyAgICAgICAgY29sb25fID0gIWNvbG9uXzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCByZWFkKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgaWYgKGZpcnN0XykgeworICAgICAgICBmaXJzdF8gPSBmYWxzZTsKKyAgICAgICAgY29sb25fID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlYWRKU09OU3ludGF4Q2hhcihjb2xvbl8gPyBDT0xPTiA6IENPTU1BKTsKKyAgICAgICAgY29sb25fID0gIWNvbG9uXzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlc2NhcGVOdW0oKSB7CisgICAgICByZXR1cm4gY29sb25fOworICAgIH0KKyAgfQorCisgIC8vIEhvbGRzIHVwIHRvIG9uZSBieXRlIGZyb20gdGhlIHRyYW5zcG9ydAorICBwcm90ZWN0ZWQgY2xhc3MgTG9va2FoZWFkUmVhZGVyIHsKKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNEYXRhXzsKKyAgICBwcml2YXRlIGJ5dGVbXSAgZGF0YV8gPSBuZXcgYnl0ZVsxXTsKKworICAgIC8vIFJldHVybiBhbmQgY29uc3VtZSB0aGUgbmV4dCBieXRlIHRvIGJlIHJlYWQsIGVpdGhlciB0YWtpbmcgaXQgZnJvbSB0aGUKKyAgICAvLyBkYXRhIGJ1ZmZlciBpZiBwcmVzZW50IG9yIGdldHRpbmcgaXQgZnJvbSB0aGUgdHJhbnNwb3J0IG90aGVyd2lzZS4KKyAgICBwcm90ZWN0ZWQgYnl0ZSByZWFkKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgaWYgKGhhc0RhdGFfKSB7CisgICAgICAgIGhhc0RhdGFfID0gZmFsc2U7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgdHJhbnNfLnJlYWRBbGwoZGF0YV8sIDAsIDEpOworICAgICAgfQorICAgICAgcmV0dXJuIGRhdGFfWzBdOworICAgIH0KKworICAgIC8vIFJldHVybiB0aGUgbmV4dCBieXRlIHRvIGJlIHJlYWQgd2l0aG91dCBjb25zdW1pbmcsIGZpbGxpbmcgdGhlIGRhdGEKKyAgICAvLyBidWZmZXIgaWYgaXQgaGFzIG5vdCBiZWVuIGZpbGxlZCBhbHJlYWR5LgorICAgIHByb3RlY3RlZCBieXRlIHBlZWsoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBpZiAoIWhhc0RhdGFfKSB7CisgICAgICAgIHRyYW5zXy5yZWFkQWxsKGRhdGFfLCAwLCAxKTsKKyAgICAgIH0KKyAgICAgIGhhc0RhdGFfID0gdHJ1ZTsKKyAgICAgIHJldHVybiBkYXRhX1swXTsKKyAgICB9CisgIH0KKworICAvLyBTdGFjayBvZiBuZXN0ZWQgY29udGV4dHMgb2YgdHlwZSBKU09OQmFzZUNvbnRleHQgdGhhdCB3ZSBtYXkgYmUgaW4KKyAgcHJpdmF0ZSBTdGFjayAgICAgICAgICAgY29udGV4dFN0YWNrXyA9IG5ldyBTdGFjaygpOworCisgIC8vIEN1cnJlbnQgY29udGV4dCB0aGF0IHdlIGFyZSBpbgorICBwcml2YXRlIEpTT05CYXNlQ29udGV4dCBjb250ZXh0XyAgICAgID0gbmV3IEpTT05CYXNlQ29udGV4dCgpOworCisgIC8vIFJlYWRlciB0aGF0IG1hbmFnZXMgYSAxLWJ5dGUgYnVmZmVyCisgIHByaXZhdGUgTG9va2FoZWFkUmVhZGVyIHJlYWRlcl8gICAgICAgPSBuZXcgTG9va2FoZWFkUmVhZGVyKCk7CisKKyAgLy8gUHVzaCBhIG5ldyBKU09OIGNvbnRleHQgb250byB0aGUgc3RhY2suCisgIHByaXZhdGUgdm9pZCBwdXNoQ29udGV4dChKU09OQmFzZUNvbnRleHQgYykgeworICAgIGNvbnRleHRTdGFja18ucHVzaChjb250ZXh0Xyk7CisgICAgY29udGV4dF8gPSBjOworICB9CisKKyAgLy8gUG9wIHRoZSBsYXN0IEpTT04gY29udGV4dCBvZmYgdGhlIHN0YWNrCisgIHByaXZhdGUgdm9pZCBwb3BDb250ZXh0KCkgeworICAgIGNvbnRleHRfID0gKEpTT05CYXNlQ29udGV4dCljb250ZXh0U3RhY2tfLnBvcCgpOworICB9CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yCisgICAqLworICBwdWJsaWMgVEpTT05Qcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKSB7CisgICAgc3VwZXIodHJhbnMpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgY29udGV4dFN0YWNrXy5jbGVhcigpOworICAgIGNvbnRleHRfID0gbmV3IEpTT05CYXNlQ29udGV4dCgpOworICAgIHJlYWRlcl8gPSBuZXcgTG9va2FoZWFkUmVhZGVyKCk7CisgIH0KKworICAvLyBUZW1wb3JhcnkgYnVmZmVyIHVzZWQgYnkgc2V2ZXJhbCBtZXRob2RzCisgIHByaXZhdGUgYnl0ZVtdIHRtcGJ1Zl8gPSBuZXcgYnl0ZVs0XTsKKworICAvLyBSZWFkIGEgYnl0ZSB0aGF0IG11c3QgbWF0Y2ggYlswXTsgb3RoZXJ3aXNlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgIC8vIE1hcmtlZCBwcm90ZWN0ZWQgdG8gYXZvaWQgc3ludGhldGljIGFjY2Vzc29yIGluIEpTT05MaXN0Q29udGV4dC5yZWFkCisgIC8vIGFuZCBKU09OUGFpckNvbnRleHQucmVhZAorICBwcm90ZWN0ZWQgdm9pZCByZWFkSlNPTlN5bnRheENoYXIoYnl0ZVtdIGIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBieXRlIGNoID0gcmVhZGVyXy5yZWFkKCk7CisgICAgaWYgKGNoICE9IGJbMF0pIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAiVW5leHBlY3RlZCBjaGFyYWN0ZXI6IiArIChjaGFyKWNoKTsKKyAgICB9CisgIH0KKworICAvLyBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IGNoYXIgKCcwJy0nOScgb3IgJ2EnLSdmJykgaW50byBpdHMKKyAgLy8gY29ycmVzcG9uZGluZyBoZXggdmFsdWUKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBoZXhWYWwoYnl0ZSBjaCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGlmICgoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKSkgeworICAgICAgcmV0dXJuIChieXRlKSgoY2hhciljaCAtICcwJyk7CisgICAgfQorICAgIGVsc2UgaWYgKChjaCA+PSAnYScpICYmIChjaCA8PSAnZicpKSB7CisgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKWNoIC0gJ2EnICsgMTApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAiRXhwZWN0ZWQgaGV4IGNoYXJhY3RlciIpOworICAgIH0KKyAgfQorCisgIC8vIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggdmFsdWUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgaGV4IGNoYXJhY3RlcgorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIGhleENoYXIoYnl0ZSB2YWwpIHsKKyAgICB2YWwgJj0gMHgwRjsKKyAgICBpZiAodmFsIDwgMTApIHsKKyAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpdmFsICsgJzAnKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKSh2YWwgLSAxMCkgKyAnYScpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNIaWdoU3Vycm9nYXRlKGNoYXIgYykgeworICAgIHJldHVybiBjID49ICdcdUQ4MDAnICYmIGMgPD0gJ1x1REJGRic7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTG93U3Vycm9nYXRlKGNoYXIgYykgeworICAgIHJldHVybiBjID49ICdcdURDMDAnICYmIGMgPD0gJ1x1REZGRic7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBieXRlW10gdG9VVEY4KGludCBjb2RlcG9pbnQpIHsKKyAgICBmaW5hbCBpbnRbXSBGSVJTVF9CWVRFX01BU0sgPSB7IDAsIDB4YzAsIDB4ZTAsIDB4ZjAgfTsKKyAgICBpbnQgbGVuZ3RoID0gMDsKKyAgICBpZiAoY29kZXBvaW50IDw9IDB4N2YpIGxlbmd0aCA9IDE7CisgICAgZWxzZSBpZiAoY29kZXBvaW50IDw9IDB4N2ZmKSBsZW5ndGggPSAyOworICAgIGVsc2UgaWYgKGNvZGVwb2ludCA8PSAweGZmZmYpIGxlbmd0aCA9IDM7CisgICAgZWxzZSBpZiAoY29kZXBvaW50IDw9IDB4MWZmZmZmKSBsZW5ndGggPSA0OworICAgIGVsc2UgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvZGUgcG9pbnQgb3ZlciBVKzFGRkZGRiBpcyBub3Qgc3VwcG9ydGVkIik7CisKKyAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgIHN3aXRjaCAobGVuZ3RoKSB7CisgICAgY2FzZSA0OgorICAgICAgYnl0ZXNbM10gPSAoYnl0ZSkoKGNvZGVwb2ludCAmIDB4M2YpIHwgMHg4MCk7CisgICAgICBjb2RlcG9pbnQgPj49IDY7CisgICAgY2FzZSAzOgorICAgICAgYnl0ZXNbMl0gPSAoYnl0ZSkoKGNvZGVwb2ludCAmIDB4M2YpIHwgMHg4MCk7CisgICAgICBjb2RlcG9pbnQgPj49IDY7CisgICAgY2FzZSAyOgorICAgICAgYnl0ZXNbMV0gPSAoYnl0ZSkoKGNvZGVwb2ludCAmIDB4M2YpIHwgMHg4MCk7CisgICAgICBjb2RlcG9pbnQgPj49IDY7CisgICAgY2FzZSAxOgorICAgICAgYnl0ZXNbMF0gPSAoYnl0ZSkoY29kZXBvaW50IHwgRklSU1RfQllURV9NQVNLW2xlbmd0aCAtIDFdKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnl0ZXM7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBieXRlW10gdG9VVEY4KGludCBoaWdoLCBpbnQgbG93KSB7CisgICAgaW50IGNvZGVwb2ludCA9ICgxIDw8IDE2KSArICgoaGlnaCAmIDB4M2ZmKSA8PCAxMCk7CisgICAgY29kZXBvaW50ICs9IGxvdyAmIDB4M2ZmOworICAgIHJldHVybiB0b1VURjgoY29kZXBvaW50KTsKKyAgfQorCisgIC8vIFdyaXRlIHRoZSBieXRlcyBpbiBhcnJheSBidWYgYXMgYSBKU09OIGNoYXJhY3RlcnMsIGVzY2FwaW5nIGFzIG5lZWRlZAorICBwcml2YXRlIHZvaWQgd3JpdGVKU09OU3RyaW5nKGJ5dGVbXSBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgY29udGV4dF8ud3JpdGUoKTsKKyAgICB0cmFuc18ud3JpdGUoUVVPVEUpOworICAgIGludCBsZW4gPSBiLmxlbmd0aDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICBpZiAoKGJbaV0gJiAweDAwRkYpID49IDB4MzApIHsKKyAgICAgICAgaWYgKGJbaV0gPT0gQkFDS1NMQVNIWzBdKSB7CisgICAgICAgICAgdHJhbnNfLndyaXRlKEJBQ0tTTEFTSCk7CisgICAgICAgICAgdHJhbnNfLndyaXRlKEJBQ0tTTEFTSCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgdHJhbnNfLndyaXRlKGIsIGksIDEpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgdG1wYnVmX1swXSA9IEpTT05fQ0hBUl9UQUJMRVtiW2ldXTsKKyAgICAgICAgaWYgKHRtcGJ1Zl9bMF0gPT0gMSkgeworICAgICAgICAgIHRyYW5zXy53cml0ZShiLCBpLCAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0bXBidWZfWzBdID4gMSkgeworICAgICAgICAgIHRyYW5zXy53cml0ZShCQUNLU0xBU0gpOworICAgICAgICAgIHRyYW5zXy53cml0ZSh0bXBidWZfLCAwLCAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICB0cmFuc18ud3JpdGUoRVNDU0VRKTsKKyAgICAgICAgICB0bXBidWZfWzBdID0gaGV4Q2hhcigoYnl0ZSkoYltpXSA+PiA0KSk7CisgICAgICAgICAgdG1wYnVmX1sxXSA9IGhleENoYXIoYltpXSk7CisgICAgICAgICAgdHJhbnNfLndyaXRlKHRtcGJ1Zl8sIDAsIDIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHRyYW5zXy53cml0ZShRVU9URSk7CisgIH0KKworICAvLyBXcml0ZSBvdXQgbnVtYmVyIGFzIGEgSlNPTiB2YWx1ZS4gSWYgdGhlIGNvbnRleHQgZGljdGF0ZXMgc28sIGl0IHdpbGwgYmUKKyAgLy8gd3JhcHBlZCBpbiBxdW90ZXMgdG8gb3V0cHV0IGFzIGEgSlNPTiBzdHJpbmcuCisgIHByaXZhdGUgdm9pZCB3cml0ZUpTT05JbnRlZ2VyKGxvbmcgbnVtKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgY29udGV4dF8ud3JpdGUoKTsKKyAgICBTdHJpbmcgc3RyID0gTG9uZy50b1N0cmluZyhudW0pOworICAgIGJvb2xlYW4gZXNjYXBlTnVtID0gY29udGV4dF8uZXNjYXBlTnVtKCk7CisgICAgaWYgKGVzY2FwZU51bSkgeworICAgICAgdHJhbnNfLndyaXRlKFFVT1RFKTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIGJ5dGVbXSBidWYgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7CisgICAgICB0cmFuc18ud3JpdGUoYnVmKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgeworICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7CisgICAgfQorICAgIGlmIChlc2NhcGVOdW0pIHsKKyAgICAgIHRyYW5zXy53cml0ZShRVU9URSk7CisgICAgfQorICB9CisKKyAgLy8gV3JpdGUgb3V0IGEgZG91YmxlIGFzIGEgSlNPTiB2YWx1ZS4gSWYgaXQgaXMgTmFOIG9yIGluZmluaXR5IG9yIGlmIHRoZQorICAvLyBjb250ZXh0IGRpY3RhdGVzIGVzY2FwaW5nLCB3cml0ZSBvdXQgYXMgSlNPTiBzdHJpbmcuCisgIHByaXZhdGUgdm9pZCB3cml0ZUpTT05Eb3VibGUoZG91YmxlIG51bSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGNvbnRleHRfLndyaXRlKCk7CisgICAgU3RyaW5nIHN0ciA9IERvdWJsZS50b1N0cmluZyhudW0pOworICAgIGJvb2xlYW4gc3BlY2lhbCA9IGZhbHNlOworICAgIHN3aXRjaCAoc3RyLmNoYXJBdCgwKSkgeworICAgIGNhc2UgJ04nOiAvLyBOYU4KKyAgICBjYXNlICdJJzogLy8gSW5maW5pdHkKKyAgICAgIHNwZWNpYWwgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnLSc6CisgICAgICBpZiAoc3RyLmNoYXJBdCgxKSA9PSAnSScpIHsgLy8gLUluZmluaXR5CisgICAgICAgIHNwZWNpYWwgPSB0cnVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYm9vbGVhbiBlc2NhcGVOdW0gPSBzcGVjaWFsIHx8IGNvbnRleHRfLmVzY2FwZU51bSgpOworICAgIGlmIChlc2NhcGVOdW0pIHsKKyAgICAgIHRyYW5zXy53cml0ZShRVU9URSk7CisgICAgfQorICAgIHRyeSB7CisgICAgICBieXRlW10gYiA9IHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKKyAgICAgIHRyYW5zXy53cml0ZShiLCAwLCBiLmxlbmd0aCk7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKKyAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOworICAgIH0KKyAgICBpZiAoZXNjYXBlTnVtKSB7CisgICAgICB0cmFuc18ud3JpdGUoUVVPVEUpOworICAgIH0KKyAgfQorCisgIC8vIFdyaXRlIG91dCBjb250ZW50cyBvZiBieXRlIGFycmF5IGIgYXMgYSBKU09OIHN0cmluZyB3aXRoIGJhc2UtNjQgZW5jb2RlZAorICAvLyBkYXRhCisgIHByaXZhdGUgdm9pZCB3cml0ZUpTT05CYXNlNjQoYnl0ZVtdIGIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBjb250ZXh0Xy53cml0ZSgpOworICAgIHRyYW5zXy53cml0ZShRVU9URSk7CisgICAgaW50IGxlbiA9IGxlbmd0aDsKKyAgICBpbnQgb2ZmID0gb2Zmc2V0OworICAgIHdoaWxlIChsZW4gPj0gMykgeworICAgICAgLy8gRW5jb2RlIDMgYnl0ZXMgYXQgYSB0aW1lCisgICAgICBUQmFzZTY0VXRpbHMuZW5jb2RlKGIsIG9mZiwgMywgdG1wYnVmXywgMCk7CisgICAgICB0cmFuc18ud3JpdGUodG1wYnVmXywgMCwgNCk7CisgICAgICBvZmYgKz0gMzsKKyAgICAgIGxlbiAtPSAzOworICAgIH0KKyAgICBpZiAobGVuID4gMCkgeworICAgICAgLy8gRW5jb2RlIHJlbWFpbmRlcgorICAgICAgVEJhc2U2NFV0aWxzLmVuY29kZShiLCBvZmYsIGxlbiwgdG1wYnVmXywgMCk7CisgICAgICB0cmFuc18ud3JpdGUodG1wYnVmXywgMCwgbGVuICsgMSk7CisgICAgfQorICAgIHRyYW5zXy53cml0ZShRVU9URSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVKU09OT2JqZWN0U3RhcnQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgY29udGV4dF8ud3JpdGUoKTsKKyAgICB0cmFuc18ud3JpdGUoTEJSQUNFKTsKKyAgICBwdXNoQ29udGV4dChuZXcgSlNPTlBhaXJDb250ZXh0KCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHdyaXRlSlNPTk9iamVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBwb3BDb250ZXh0KCk7CisgICAgdHJhbnNfLndyaXRlKFJCUkFDRSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVKU09OQXJyYXlTdGFydCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBjb250ZXh0Xy53cml0ZSgpOworICAgIHRyYW5zXy53cml0ZShMQlJBQ0tFVCk7CisgICAgcHVzaENvbnRleHQobmV3IEpTT05MaXN0Q29udGV4dCgpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB3cml0ZUpTT05BcnJheUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBwb3BDb250ZXh0KCk7CisgICAgdHJhbnNfLndyaXRlKFJCUkFDS0VUKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgd3JpdGVKU09OSW50ZWdlcihWRVJTSU9OKTsKKyAgICB0cnkgeworICAgICAgYnl0ZVtdIGIgPSBtZXNzYWdlLm5hbWUuZ2V0Qnl0ZXMoIlVURi04Iik7CisgICAgICB3cml0ZUpTT05TdHJpbmcoYik7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKKyAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOworICAgIH0KKyAgICB3cml0ZUpTT05JbnRlZ2VyKG1lc3NhZ2UudHlwZSk7CisgICAgd3JpdGVKU09OSW50ZWdlcihtZXNzYWdlLnNlcWlkKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05BcnJheUVuZCgpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05PYmplY3RFbmQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05JbnRlZ2VyKGZpZWxkLmlkKTsKKyAgICB3cml0ZUpTT05PYmplY3RTdGFydCgpOworICAgIHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRChmaWVsZC50eXBlKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTk9iamVjdEVuZCgpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7fQorCisgIHB1YmxpYyB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKG1hcC5rZXlUeXBlKSk7CisgICAgd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKG1hcC52YWx1ZVR5cGUpKTsKKyAgICB3cml0ZUpTT05JbnRlZ2VyKG1hcC5zaXplKTsKKyAgICB3cml0ZUpTT05PYmplY3RTdGFydCgpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OT2JqZWN0RW5kKCk7CisgICAgd3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKGxpc3QuZWxlbVR5cGUpKTsKKyAgICB3cml0ZUpTT05JbnRlZ2VyKGxpc3Quc2l6ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKHNldC5lbGVtVHlwZSkpOworICAgIHdyaXRlSlNPTkludGVnZXIoc2V0LnNpemUpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlQm9vbChib29sZWFuIGIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05JbnRlZ2VyKGIgPyAobG9uZykxIDogKGxvbmcpMCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGUoYnl0ZSBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OSW50ZWdlcihiKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlSTE2KHNob3J0IGkxNikgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTkludGVnZXIoaTE2KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05JbnRlZ2VyKGkzMik7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUk2NChsb25nIGk2NCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTkludGVnZXIoaTY0KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkdWIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05Eb3VibGUoZHViKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgYnl0ZVtdIGIgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7CisgICAgICB3cml0ZUpTT05TdHJpbmcoYik7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKKyAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlQmluYXJ5KGJ5dGVbXSBiaW4pIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05CYXNlNjQoYmluLCAwLCBiaW4ubGVuZ3RoKTsKKyAgfQorCisgIC8qKgorICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAqLworCisgIC8vIFJlYWQgaW4gYSBKU09OIHN0cmluZywgdW5lc2NhcGluZyBhcyBhcHByb3ByaWF0ZS4uIFNraXAgcmVhZGluZyBmcm9tIHRoZQorICAvLyBjb250ZXh0IGlmIHNraXBDb250ZXh0IGlzIHRydWUuCisgIHByaXZhdGUgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSByZWFkSlNPTlN0cmluZyhib29sZWFuIHNraXBDb250ZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhcnIgPSBuZXcgVEJ5dGVBcnJheU91dHB1dFN0cmVhbShERUZfU1RSSU5HX1NJWkUpOworICAgIGludCBoaWdoU3Vycm9nYXRlID0gMDsKKyAgICBpZiAoIXNraXBDb250ZXh0KSB7CisgICAgICBjb250ZXh0Xy5yZWFkKCk7CisgICAgfQorICAgIHJlYWRKU09OU3ludGF4Q2hhcihRVU9URSk7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGJ5dGUgY2ggPSByZWFkZXJfLnJlYWQoKTsKKyAgICAgIGlmIChjaCA9PSBRVU9URVswXSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChjaCA9PSBFU0NTRVFbMF0pIHsKKyAgICAgICAgY2ggPSByZWFkZXJfLnJlYWQoKTsKKyAgICAgICAgaWYgKGNoID09IEVTQ1NFUVsxXSkgeworICAgICAgICAgIHRyYW5zXy5yZWFkQWxsKHRtcGJ1Zl8sIDAsIDQpOworICAgICAgICAgIHNob3J0IGN1ID0gKHNob3J0KSgKKyAgICAgICAgICAgICAgKChzaG9ydCloZXhWYWwodG1wYnVmX1swXSkgPDwgMTIpICsKKyAgICAgICAgICAgICAgKChzaG9ydCloZXhWYWwodG1wYnVmX1sxXSkgPDwgOCkgKworICAgICAgICAgICAgICAoKHNob3J0KWhleFZhbCh0bXBidWZfWzJdKSA8PCA0KSArCisgICAgICAgICAgICAgIChzaG9ydCloZXhWYWwodG1wYnVmX1szXSkpOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoaXNIaWdoU3Vycm9nYXRlKChjaGFyKWN1KSkgeworICAgICAgICAgICAgICBpZiAoaGlnaFN1cnJvZ2F0ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaGlnaFN1cnJvZ2F0ZSA9IGN1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoaXNMb3dTdXJyb2dhdGUoKGNoYXIpY3UpKSB7CisgICAgICAgICAgICAgIGlmIChoaWdoU3Vycm9nYXRlID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBoaWdoIHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBhcnIud3JpdGUodG9VVEY4KGhpZ2hTdXJyb2dhdGUsIGN1KSk7CisgICAgICAgICAgICAgIGhpZ2hTdXJyb2dhdGUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIGFyci53cml0ZSh0b1VURjgoY3UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICJKVk0gZG9lcyBub3Qgc3VwcG9ydCBVVEYtOCIpOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAiSW52YWxpZCB1bmljb2RlIHNlcXVlbmNlIik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGludCBvZmYgPSBFU0NBUEVfQ0hBUlMuaW5kZXhPZihjaCk7CisgICAgICAgICAgaWYgKG9mZiA9PSAtMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICJFeHBlY3RlZCBjb250cm9sIGNoYXIiKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY2ggPSBFU0NBUEVfQ0hBUl9WQUxTW29mZl07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGFyci53cml0ZShjaCk7CisgICAgfQorCisgICAgaWYgKGhpZ2hTdXJyb2dhdGUgIT0gMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXIiKTsKKyAgICB9CisgICAgcmV0dXJuIGFycjsKKyAgfQorCisgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBieXRlIGNvdWxkIGJlIGEgdmFsaWQgcGFydCBvZiBhIEpTT04gbnVtYmVyLgorICBwcml2YXRlIGJvb2xlYW4gaXNKU09OTnVtZXJpYyhieXRlIGIpIHsKKyAgICBzd2l0Y2ggKGIpIHsKKyAgICBjYXNlICcrJzoKKyAgICBjYXNlICctJzoKKyAgICBjYXNlICcuJzoKKyAgICBjYXNlICcwJzoKKyAgICBjYXNlICcxJzoKKyAgICBjYXNlICcyJzoKKyAgICBjYXNlICczJzoKKyAgICBjYXNlICc0JzoKKyAgICBjYXNlICc1JzoKKyAgICBjYXNlICc2JzoKKyAgICBjYXNlICc3JzoKKyAgICBjYXNlICc4JzoKKyAgICBjYXNlICc5JzoKKyAgICBjYXNlICdFJzoKKyAgICBjYXNlICdlJzoKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBSZWFkIGluIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB0aGF0IGFyZSBhbGwgdmFsaWQgaW4gSlNPTiBudW1iZXJzLiBEb2VzCisgIC8vIG5vdCBkbyBhIGNvbXBsZXRlIHJlZ2V4IGNoZWNrIHRvIHZhbGlkYXRlIHRoYXQgdGhpcyBpcyBhY3R1YWxseSBhIG51bWJlci4KKyAgcHJpdmF0ZSBTdHJpbmcgcmVhZEpTT05OdW1lcmljQ2hhcnMoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nQnVmZmVyIHN0cmJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgYnl0ZSBjaCA9IHJlYWRlcl8ucGVlaygpOworICAgICAgaWYgKCFpc0pTT05OdW1lcmljKGNoKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHN0cmJ1Zi5hcHBlbmQoKGNoYXIpcmVhZGVyXy5yZWFkKCkpOworICAgIH0KKyAgICByZXR1cm4gc3RyYnVmLnRvU3RyaW5nKCk7CisgIH0KKworICAvLyBSZWFkIGluIGEgSlNPTiBudW1iZXIuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzLCByZWFkIGluIGVuY2xvc2luZyBxdW90ZXMuCisgIHByaXZhdGUgbG9uZyByZWFkSlNPTkludGVnZXIoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgY29udGV4dF8ucmVhZCgpOworICAgIGlmIChjb250ZXh0Xy5lc2NhcGVOdW0oKSkgeworICAgICAgcmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKTsKKyAgICB9CisgICAgU3RyaW5nIHN0ciA9IHJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisgICAgaWYgKGNvbnRleHRfLmVzY2FwZU51bSgpKSB7CisgICAgICByZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpOworICAgIH0KKyAgICB0cnkgeworICAgICAgcmV0dXJuIExvbmcudmFsdWVPZihzdHIpLmxvbmdWYWx1ZSgpOworICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIik7CisgICAgfQorICB9CisKKyAgLy8gUmVhZCBpbiBhIEpTT04gZG91YmxlIHZhbHVlLiBUaHJvdyBpZiB0aGUgdmFsdWUgaXMgbm90IHdyYXBwZWQgaW4gcXVvdGVzCisgIC8vIHdoZW4gZXhwZWN0ZWQgb3IgaWYgd3JhcHBlZCBpbiBxdW90ZXMgd2hlbiBub3QgZXhwZWN0ZWQuCisgIHByaXZhdGUgZG91YmxlIHJlYWRKU09ORG91YmxlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGNvbnRleHRfLnJlYWQoKTsKKyAgICBpZiAocmVhZGVyXy5wZWVrKCkgPT0gUVVPVEVbMF0pIHsKKyAgICAgIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyID0gcmVhZEpTT05TdHJpbmcodHJ1ZSk7CisgICAgICB0cnkgeworICAgICAgICBkb3VibGUgZHViID0gRG91YmxlLnZhbHVlT2YoYXJyLnRvU3RyaW5nKCJVVEYtOCIpKS5kb3VibGVWYWx1ZSgpOworICAgICAgICBpZiAoIWNvbnRleHRfLmVzY2FwZU51bSgpICYmICFEb3VibGUuaXNOYU4oZHViKSAmJgorICAgICAgICAgICAgIURvdWJsZS5pc0luZmluaXRlKGR1YikpIHsKKyAgICAgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiB0aGlzIGNhc2UKKyAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkdWI7CisgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmIChjb250ZXh0Xy5lc2NhcGVOdW0oKSkgeworICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgLSB3ZSBzaG91bGQgaGF2ZSBoYWQgYSBxdW90ZSBpZiBlc2NhcGVOdW0gPT0gdHJ1ZQorICAgICAgICByZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpOworICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIERvdWJsZS52YWx1ZU9mKHJlYWRKU09OTnVtZXJpY0NoYXJzKCkpLmRvdWJsZVZhbHVlKCk7CisgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBSZWFkIGluIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBiYXNlLTY0IGVuY29kZWQgZGF0YSBhbmQgZGVjb2RlIGl0LgorICBwcml2YXRlIGJ5dGVbXSByZWFkSlNPTkJhc2U2NCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFyciA9IHJlYWRKU09OU3RyaW5nKGZhbHNlKTsKKyAgICBieXRlW10gYiA9IGFyci5nZXQoKTsKKyAgICBpbnQgbGVuID0gYXJyLmxlbigpOworICAgIGludCBvZmYgPSAwOworICAgIGludCBzaXplID0gMDsKKyAgICAvLyBJZ25vcmUgcGFkZGluZworICAgIGludCBib3VuZCA9IGxlbiA+PSAyID8gbGVuIC0gMiA6IDA7CisgICAgZm9yIChpbnQgaSA9IGxlbiAtIDE7IGkgPj0gYm91bmQgJiYgYltpXSA9PSAnPSc7IC0taSkgeworICAgICAgLS1sZW47CisgICAgfQorICAgIHdoaWxlIChsZW4gPj0gNCkgeworICAgICAgLy8gRGVjb2RlIDQgYnl0ZXMgYXQgYSB0aW1lCisgICAgICBUQmFzZTY0VXRpbHMuZGVjb2RlKGIsIG9mZiwgNCwgYiwgc2l6ZSk7IC8vIE5COiBkZWNvZGVkIGluIHBsYWNlCisgICAgICBvZmYgKz0gNDsKKyAgICAgIGxlbiAtPSA0OworICAgICAgc2l6ZSArPSAzOworICAgIH0KKyAgICAvLyBEb24ndCBkZWNvZGUgaWYgd2UgaGl0IHRoZSBlbmQgb3IgZ290IGEgc2luZ2xlIGxlZnRvdmVyIGJ5dGUgKGludmFsaWQKKyAgICAvLyBiYXNlNjQgYnV0IGxlZ2FsIGZvciBza2lwIG9mIHJlZ3VsYXIgc3RyaW5nIHR5cGUpCisgICAgaWYgKGxlbiA+IDEpIHsKKyAgICAgIC8vIERlY29kZSByZW1haW5kZXIKKyAgICAgIFRCYXNlNjRVdGlscy5kZWNvZGUoYiwgb2ZmLCBsZW4sIGIsIHNpemUpOyAvLyBOQjogZGVjb2RlZCBpbiBwbGFjZQorICAgICAgc2l6ZSArPSBsZW4gLSAxOworICAgIH0KKyAgICAvLyBTYWRseSB3ZSBtdXN0IGNvcHkgdGhlIGJ5dGVbXSAoYW55IHdheSBhcm91bmQgdGhpcz8pCisgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW3NpemVdOworICAgIFN5c3RlbS5hcnJheWNvcHkoYiwgMCwgcmVzdWx0LCAwLCBzaXplKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlYWRKU09OT2JqZWN0U3RhcnQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgY29udGV4dF8ucmVhZCgpOworICAgIHJlYWRKU09OU3ludGF4Q2hhcihMQlJBQ0UpOworICAgIHB1c2hDb250ZXh0KG5ldyBKU09OUGFpckNvbnRleHQoKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVhZEpTT05PYmplY3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEpTT05TeW50YXhDaGFyKFJCUkFDRSk7CisgICAgcG9wQ29udGV4dCgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlYWRKU09OQXJyYXlTdGFydCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBjb250ZXh0Xy5yZWFkKCk7CisgICAgcmVhZEpTT05TeW50YXhDaGFyKExCUkFDS0VUKTsKKyAgICBwdXNoQ29udGV4dChuZXcgSlNPTkxpc3RDb250ZXh0KCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlYWRKU09OQXJyYXlFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEpTT05TeW50YXhDaGFyKFJCUkFDS0VUKTsKKyAgICBwb3BDb250ZXh0KCk7CisgIH0KKworICBwdWJsaWMgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICBpZiAocmVhZEpTT05JbnRlZ2VyKCkgIT0gVkVSU0lPTikgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCisgICAgICAgICAgIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiIpOworICAgIH0KKyAgICBTdHJpbmcgbmFtZTsKKyAgICB0cnkgeworICAgICAgbmFtZSA9IHJlYWRKU09OU3RyaW5nKGZhbHNlKS50b1N0cmluZygiVVRGLTgiKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKKyAgICB9CisgICAgYnl0ZSB0eXBlID0gKGJ5dGUpcmVhZEpTT05JbnRlZ2VyKCk7CisgICAgaW50IHNlcWlkID0gKGludClyZWFkSlNPTkludGVnZXIoKTsKKyAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG5hbWUsIHR5cGUsIHNlcWlkKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRKU09OQXJyYXlFbmQoKTsKKyAgfQorCisgIHB1YmxpYyBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgcmV0dXJuIEFOT05ZTU9VU19TVFJVQ1Q7CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkU3RydWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRKU09OT2JqZWN0RW5kKCk7CisgIH0KKworICBwdWJsaWMgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGJ5dGUgY2ggPSByZWFkZXJfLnBlZWsoKTsKKyAgICBieXRlIHR5cGU7CisgICAgc2hvcnQgaWQgPSAwOworICAgIGlmIChjaCA9PSBSQlJBQ0VbMF0pIHsKKyAgICAgIHR5cGUgPSBUVHlwZS5TVE9QOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlkID0gKHNob3J0KXJlYWRKU09OSW50ZWdlcigpOworICAgICAgcmVhZEpTT05PYmplY3RTdGFydCgpOworICAgICAgdHlwZSA9IGdldFR5cGVJREZvclR5cGVOYW1lKHJlYWRKU09OU3RyaW5nKGZhbHNlKS5nZXQoKSk7CisgICAgfQorICAgIHJldHVybiBuZXcgVEZpZWxkKCIiLCB0eXBlLCBpZCk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkRmllbGRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEpTT05PYmplY3RFbmQoKTsKKyAgfQorCisgIHB1YmxpYyBUTWFwIHJlYWRNYXBCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICBieXRlIGtleVR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZShyZWFkSlNPTlN0cmluZyhmYWxzZSkuZ2V0KCkpOworICAgIGJ5dGUgdmFsdWVUeXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUocmVhZEpTT05TdHJpbmcoZmFsc2UpLmdldCgpKTsKKyAgICBpbnQgc2l6ZSA9IChpbnQpcmVhZEpTT05JbnRlZ2VyKCk7CisgICAgcmVhZEpTT05PYmplY3RTdGFydCgpOworICAgIHJldHVybiBuZXcgVE1hcChrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZE1hcEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkSlNPTk9iamVjdEVuZCgpOworICAgIHJlYWRKU09OQXJyYXlFbmQoKTsKKyAgfQorCisgIHB1YmxpYyBUTGlzdCByZWFkTGlzdEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRKU09OQXJyYXlTdGFydCgpOworICAgIGJ5dGUgZWxlbVR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZShyZWFkSlNPTlN0cmluZyhmYWxzZSkuZ2V0KCkpOworICAgIGludCBzaXplID0gKGludClyZWFkSlNPTkludGVnZXIoKTsKKyAgICByZXR1cm4gbmV3IFRMaXN0KGVsZW1UeXBlLCBzaXplKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRKU09OQXJyYXlFbmQoKTsKKyAgfQorCisgIHB1YmxpYyBUU2V0IHJlYWRTZXRCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICBieXRlIGVsZW1UeXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUocmVhZEpTT05TdHJpbmcoZmFsc2UpLmdldCgpKTsKKyAgICBpbnQgc2l6ZSA9IChpbnQpcmVhZEpTT05JbnRlZ2VyKCk7CisgICAgcmV0dXJuIG5ldyBUU2V0KGVsZW1UeXBlLCBzaXplKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWRTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEpTT05BcnJheUVuZCgpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gcmVhZEJvb2woKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIChyZWFkSlNPTkludGVnZXIoKSA9PSAwID8gZmFsc2UgOiB0cnVlKTsKKyAgfQorCisgIHB1YmxpYyBieXRlIHJlYWRCeXRlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJldHVybiAoYnl0ZSlyZWFkSlNPTkludGVnZXIoKTsKKyAgfQorCisgIHB1YmxpYyBzaG9ydCByZWFkSTE2KCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJldHVybiAoc2hvcnQpcmVhZEpTT05JbnRlZ2VyKCk7CisgIH0KKworICBwdWJsaWMgaW50IHJlYWRJMzIoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIChpbnQpcmVhZEpTT05JbnRlZ2VyKCk7CisgIH0KKworICBwdWJsaWMgbG9uZyByZWFkSTY0KCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJldHVybiByZWFkSlNPTkludGVnZXIoKTsKKyAgfQorCisgIHB1YmxpYyBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZXR1cm4gcmVhZEpTT05Eb3VibGUoKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIHJlYWRKU09OU3RyaW5nKGZhbHNlKS50b1N0cmluZygiVVRGLTgiKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgYnl0ZVtdIHJlYWRCaW5hcnkoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHJlYWRKU09OQmFzZTY0KCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuamF2YQppbmRleCA0NTFhMmU1Li5lNmZmYmE0IDEwMDY0NAotLS0gYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuamF2YQorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuamF2YQpAQCAtNDIsNiArNDIsOCBAQAogCiAgIHByaXZhdGUgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW1fID0gbnVsbDsKIAorICBwcml2YXRlIEh0dHBDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBudWxsOworCiAgIHByaXZhdGUgaW50IGNvbm5lY3RUaW1lb3V0XyA9IDA7CiAKICAgcHJpdmF0ZSBpbnQgcmVhZFRpbWVvdXRfID0gMDsKQEAgLTQ5LDcgKzUxLDcgQEAKICAgcHJpdmF0ZSBIYXNodGFibGUgY3VzdG9tSGVhZGVyc18gPSBudWxsOwogCiAgIHB1YmxpYyBUSHR0cENsaWVudChTdHJpbmcgdXJsKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgdXJsXyA9IHVybDsKKyAgICB1cmxfID0gdXJsOwogICB9CiAKICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKQEAgLTgxLDYgKzgzLDE0IEBACiAgICAgICB9CiAgICAgICBpbnB1dFN0cmVhbV8gPSBudWxsOwogICAgIH0KKworICAgIGlmIChjb25uZWN0aW9uICE9IG51bGwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGNvbm5lY3Rpb24uY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgfQorICAgICAgY29ubmVjdGlvbiA9IG51bGw7CisgICAgfQogICB9CiAKICAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgewpAQCAtMTA2LDYyICsxMTYsNDggQEAKICAgICByZXF1ZXN0QnVmZmVyXy53cml0ZShidWYsIG9mZiwgbGVuKTsKICAgfQogICAKLSAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAgICAgLy8gRXh0cmFjdCByZXF1ZXN0IGFuZCByZXNldCBidWZmZXIKLSAgICAgICAgYnl0ZVtdIGRhdGEgPSByZXF1ZXN0QnVmZmVyXy50b0J5dGVBcnJheSgpOwotICAgICAgICByZXF1ZXN0QnVmZmVyXy5yZXNldCgpOworICAgIGJ5dGVbXSBkYXRhID0gcmVxdWVzdEJ1ZmZlcl8udG9CeXRlQXJyYXkoKTsKKyAgICByZXF1ZXN0QnVmZmVyXy5yZXNldCgpOwogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgY29ubmVjdGlvbiBvYmplY3QKLSAgICAgICAgICAgIEh0dHBDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSAoSHR0cENvbm5lY3Rpb24pQ29ubmVjdG9yLm9wZW4odXJsXyk7Ci0gICAgCi0gICAgICAgICAgICAvLyBUaW1lb3V0cywgb25seSBpZiBleHBsaWNpdGx5IHNldAotICAgICAgICAgICAgaWYgKGNvbm5lY3RUaW1lb3V0XyA+IDApIHsKLSAgICAgICAgICAgIC8vICBYWFg6IG5vdCBhdmFpbGFibGUKLSAgICAgICAgICAgIC8vICBjb25uZWN0aW9uLnNldENvbm5lY3RUaW1lb3V0KGNvbm5lY3RUaW1lb3V0Xyk7Ci0gICAgICAgICAgICB9ICAgCi0gICAgICAgICAgICBpZiAocmVhZFRpbWVvdXRfID4gMCkgewotICAgICAgICAgICAgLy8gIFhYWDogbm90IGF2YWlsYWJsZQotICAgICAgICAgICAgLy8gIGNvbm5lY3Rpb24uc2V0UmVhZFRpbWVvdXQocmVhZFRpbWVvdXRfKTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIC8vIE1ha2UgdGhlIHJlcXVlc3QKLSAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdE1ldGhvZCgiUE9TVCIpOwotICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpOwotICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkFjY2VwdCIsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpOwotICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIlVzZXItQWdlbnQiLCAiSmF2YU1FL1RIdHRwQ2xpZW50Iik7CisgICAgdHJ5IHsKKyAgICAgIC8vIENyZWF0ZSBjb25uZWN0aW9uIG9iamVjdAorICAgICAgY29ubmVjdGlvbiA9IChIdHRwQ29ubmVjdGlvbilDb25uZWN0b3Iub3Blbih1cmxfKTsKKyAgCisgICAgICAvLyBNYWtlIHRoZSByZXF1ZXN0CisgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RNZXRob2QoIlBPU1QiKTsKKyAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKTsKKyAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJBY2NlcHQiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKTsKKyAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJVc2VyLUFnZW50IiwgIkphdmFNRS9USHR0cENsaWVudCIpOwogCi0gICAgICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29ubmVjdGlvbiIsICJLZWVwLUFsaXZlIik7Ci0gICAgICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiS2VlcC1BbGl2ZSIsICI1MDAwIik7Ci0gICAgICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiSHR0cC12ZXJzaW9uIiwgIkhUVFAvMS4xIik7Ci0gICAgICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ2FjaGUtQ29udHJvbCIsICJuby10cmFuc2Zvcm0iKTsKKyAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJDb25uZWN0aW9uIiwgIktlZXAtQWxpdmUiKTsKKyAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJLZWVwLUFsaXZlIiwgIjUwMDAiKTsKKyAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJIdHRwLXZlcnNpb24iLCAiSFRUUC8xLjEiKTsKKyAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJDYWNoZS1Db250cm9sIiwgIm5vLXRyYW5zZm9ybSIpOwogCi0KLSAgICAgICAgICAgIGlmIChjdXN0b21IZWFkZXJzXyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gY3VzdG9tSGVhZGVyc18ua2V5cygpIDsgZS5oYXNNb3JlRWxlbWVudHMoKSA7KSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZyljdXN0b21IZWFkZXJzXy5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY29ubmVjdGlvbi5zZXREb091dHB1dCh0cnVlKTsKLSAgICAgICAgICAgIC8vICBjb25uZWN0aW9uLmNvbm5lY3QoKTsKLSAgICAKLSAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IGNvbm5lY3Rpb24ub3Blbk91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgb3Mud3JpdGUoZGF0YSk7Ci0gICAgICAgICAgICBvcy5jbG9zZSgpOwotCi0gICAgICAgICAgICBpbnQgcmVzcG9uc2VDb2RlID0gY29ubmVjdGlvbi5nZXRSZXNwb25zZUNvZGUoKTsKLSAgICAgICAgICAgIGlmIChyZXNwb25zZUNvZGUgIT0gSHR0cENvbm5lY3Rpb24uSFRUUF9PSykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJIVFRQIFJlc3BvbnNlIGNvZGU6ICIgKyByZXNwb25zZUNvZGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSZWFkIHRoZSByZXNwb25zZXMKLSAgICAgICAgICAgIGlucHV0U3RyZWFtXyA9IGNvbm5lY3Rpb24ub3BlbklucHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaW94LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW94KTsKKyAgICAgIGlmIChjdXN0b21IZWFkZXJzXyAhPSBudWxsKSB7CisgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGN1c3RvbUhlYWRlcnNfLmtleXMoKSA7IGUuaGFzTW9yZUVsZW1lbnRzKCkgOykgeworICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKWN1c3RvbUhlYWRlcnNfLmdldChrZXkpOworICAgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KGtleSwgdmFsdWUpOwogICAgICAgICB9CisgICAgICB9CisgIAorICAgICAgT3V0cHV0U3RyZWFtIG9zID0gY29ubmVjdGlvbi5vcGVuT3V0cHV0U3RyZWFtKCk7CisgICAgICBvcy53cml0ZShkYXRhKTsKKyAgICAgIG9zLmNsb3NlKCk7CisKKyAgICAgIGludCByZXNwb25zZUNvZGUgPSBjb25uZWN0aW9uLmdldFJlc3BvbnNlQ29kZSgpOworICAgICAgaWYgKHJlc3BvbnNlQ29kZSAhPSBIdHRwQ29ubmVjdGlvbi5IVFRQX09LKSB7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJIVFRQIFJlc3BvbnNlIGNvZGU6ICIgKyByZXNwb25zZUNvZGUpOworICAgICAgfQorCisgICAgICAvLyBSZWFkIHRoZSByZXNwb25zZXMKKyAgICAgIGlucHV0U3RyZWFtXyA9IGNvbm5lY3Rpb24ub3BlbklucHV0U3RyZWFtKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaW94LnRvU3RyaW5nKCkpOworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW94KTsKICAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZTFhYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKKworLyoqCisgKiBNZW1vcnkgYnVmZmVyLWJhc2VkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KKyAqLworcHVibGljIGNsYXNzIFRNZW1vcnlCdWZmZXIgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKKyAgLyoqCisgICAqIENyZWF0ZSBhIFRNZW1vcnlCdWZmZXIgd2l0aCBhbiBpbml0aWFsIGJ1ZmZlciBzaXplIG9mIDxpPnNpemU8L2k+LiBUaGUKKyAgICogaW50ZXJuYWwgYnVmZmVyIHdpbGwgZ3JvdyBhcyBuZWNlc3NhcnkgdG8gYWNjb21tb2RhdGUgdGhlIHNpemUgb2YgdGhlIGRhdGEKKyAgICogYmVpbmcgd3JpdHRlbiB0byBpdC4KKyAgICovCisgIHB1YmxpYyBUTWVtb3J5QnVmZmVyKGludCBzaXplKSB7CisgICAgYXJyXyA9IG5ldyBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtKHNpemUpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcHVibGljIHZvaWQgb3BlbigpIHsKKyAgICAvKiBEbyBub3RoaW5nICovCisgIH0KKworICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAvKiBEbyBub3RoaW5nICovCisgIH0KKworICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgeworICAgIGJ5dGVbXSBzcmMgPSBhcnJfLmdldCgpOworICAgIGludCBhbXRUb1JlYWQgPSAobGVuID4gYXJyXy5sZW4oKSAtIHBvc18gPyBhcnJfLmxlbigpIC0gcG9zXyA6IGxlbik7CisgICAgaWYgKGFtdFRvUmVhZCA+IDApIHsKKyAgICAgIFN5c3RlbS5hcnJheWNvcHkoc3JjLCBwb3NfLCBidWYsIG9mZiwgYW10VG9SZWFkKTsKKyAgICAgIHBvc18gKz0gYW10VG9SZWFkOworICAgIH0KKyAgICByZXR1cm4gYW10VG9SZWFkOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgeworICAgIGFycl8ud3JpdGUoYnVmLCBvZmYsIGxlbik7CisgIH0KKworICAvKioKKyAgICogT3V0cHV0IHRoZSBjb250ZW50cyBvZiB0aGUgbWVtb3J5IGJ1ZmZlciBhcyBhIFN0cmluZywgdXNpbmcgdGhlIHN1cHBsaWVkCisgICAqIGVuY29kaW5nCisgICAqIAorICAgKiBAcGFyYW0gZW5jIHRoZSBlbmNvZGluZyB0byB1c2UKKyAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIG1lbW9yeSBidWZmZXIgYXMgYSBTdHJpbmcKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoU3RyaW5nIGVuYykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIHJldHVybiBhcnJfLnRvU3RyaW5nKGVuYyk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGluc3BlY3QoKSB7CisgICAgU3RyaW5nIGJ1ZiA9ICIiOworICAgIGJ5dGVbXSBieXRlcyA9IGFycl8udG9CeXRlQXJyYXkoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICBidWYgKz0gKHBvc18gPT0gaSA/ICI9PT4iIDogIiIpICsgSW50ZWdlci50b0hleFN0cmluZyhieXRlc1tpXSAmIDB4ZmYpICsgIiAiOworICAgIH0KKyAgICByZXR1cm4gYnVmOworICB9CisKKyAgLy8gVGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIKKyAgcHJpdmF0ZSBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFycl87CisKKyAgLy8gUG9zaXRpb24gdG8gcmVhZCBuZXh0IGJ5dGUgZnJvbQorICBwcml2YXRlIGludCAgICAgICAgICAgICAgICAgICAgcG9zXzsKKworICBwdWJsaWMgaW50IGxlbmd0aCgpIHsKKyAgICByZXR1cm4gYXJyXy5zaXplKCk7CisgIH0KKworICBwdWJsaWMgYnl0ZVtdIGdldEFycmF5KCkgeworICAgIHJldHVybiBhcnJfLmdldCgpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvanMvR3J1bnRmaWxlLmpzIGIvbGliL2pzL0dydW50ZmlsZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzJhMDE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL0dydW50ZmlsZS5qcwpAQCAtMCwwICsxLDI5MyBAQAorLy9UbyBidWlsZCBkaXN0L3RocmlmdC5qcywgZGlzdC90aHJpZnQubWluLmpzIGFuZCBkb2MvKgorLy9ydW4gZ3J1bnQgYXQgdGhlIGNvbW1hbmQgbGluZSBpbiB0aGlzIGRpcmVjdG9yeS4KKy8vUHJlcmVxdWlzaXRlczoKKy8vIE5vZGUgU2V0dXAgLSAgIG5vZGVqcy5vcmcKKy8vIEdydW50IFNldHVwIC0gIG5wbSBpbnN0YWxsICAvL3JlYWRzIHRoZSAuL3BhY2thZ2UuanNvbiBhbmQgaW5zdGFsbHMgcHJvamVjdCBkZXBlbmRlbmNpZXMKKy8vIFJ1biBncnVudCAtICAgIG5weCBncnVudCAgLy8gdXNlcyBwcm9qZWN0LWxvY2FsIGluc3RhbGxlZCB2ZXJzaW9uIG9mIGdydW50IChmcm9tIHBhY2thZ2UuanNvbikKKworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihncnVudCkgeworICAndXNlIHN0cmljdCc7CisKKyAgZ3J1bnQuaW5pdENvbmZpZyh7CisgICAgcGtnOiBncnVudC5maWxlLnJlYWRKU09OKCdwYWNrYWdlLmpzb24nKSwKKyAgICBjb25jYXQ6IHsKKyAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgc2VwYXJhdG9yOiAnOycKKyAgICAgIH0sCisgICAgICBkaXN0OiB7CisgICAgICAgIHNyYzogWydzcmMvKiovKi5qcyddLAorICAgICAgICBkZXN0OiAnZGlzdC88JT0gcGtnLm5hbWUgJT4uanMnCisgICAgICB9CisgICAgfSwKKyAgICBqc2RvYyA6IHsKKyAgICAgICAgZGlzdCA6IHsKKyAgICAgICAgICAgIHNyYzogWydzcmMvKi5qcycsICcuL1JFQURNRS5tZCddLAorICAgICAgICAgICAgb3B0aW9uczogeworICAgICAgICAgICAgICBkZXN0aW5hdGlvbjogJ2RvYycKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0sCisgICAgdWdsaWZ5OiB7CisgICAgICBvcHRpb25zOiB7CisgICAgICAgIGJhbm5lcjogJy8qISA8JT0gcGtnLm5hbWUgJT4gPCU9IGdydW50LnRlbXBsYXRlLnRvZGF5KCJkZC1tbS15eXl5IikgJT4gKi9cbicKKyAgICAgIH0sCisgICAgICBkaXN0OiB7CisgICAgICAgIGZpbGVzOiB7CisgICAgICAgICAgJ2Rpc3QvPCU9IHBrZy5uYW1lICU+Lm1pbi5qcyc6IFsnPCU9IGNvbmNhdC5kaXN0LmRlc3QgJT4nXQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICBzaGVsbDogeworICAgICAgSW5zdGFsbFRocmlmdEpTOiB7CisgICAgICAgIGNvbW1hbmQ6ICdta2RpciAtcCB0ZXN0L2J1aWxkL2pzL2xpYjsgY3Agc3JjL3RocmlmdC5qcyB0ZXN0L2J1aWxkL2pzL3RocmlmdC5qcycKKyAgICAgIH0sCisgICAgICBJbnN0YWxsVGhyaWZ0Tm9kZUpTRGVwOiB7CisgICAgICAgIGNvbW1hbmQ6ICdjZCAuLi8uLjsgbnBtIGluc3RhbGwnCisgICAgICB9LAorICAgICAgSW5zdGFsbFRlc3RMaWJzOiB7CisgICAgICAgIGNvbW1hbmQ6ICdjZCB0ZXN0OyBhbnQgZG93bmxvYWRfanNsaWJzJworICAgICAgfSwKKyAgICAgIFRocmlmdEdlbjogeworICAgICAgICBjb21tYW5kOiBbCisgICAgICAgICAgJ21rZGlyIC1wIHRlc3QvZ2VuLWpzJywKKyAgICAgICAgICAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzIC0tb3V0IHRlc3QvZ2VuLWpzIC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQnLAorICAgICAgICAgICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganMgLS1vdXQgdGVzdC9nZW4tanMgLi4vLi4vdGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0JywKKyAgICAgICAgICAnbWtkaXIgLXAgdGVzdC9nZW4tanMtanF1ZXJ5JywKKyAgICAgICAgICAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzOmpxdWVyeSAtLW91dCB0ZXN0L2dlbi1qcy1qcXVlcnkgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCcsCisgICAgICAgICAgJ21rZGlyIC1wIHRlc3QvZ2VuLW5vZGVqcycsCisgICAgICAgICAgJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqczpub2RlIC0tb3V0IHRlc3QvZ2VuLW5vZGVqcyAuLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0JywKKyAgICAgICAgICAnbWtkaXIgLXAgdGVzdC9nZW4tanMtZXM2JywKKyAgICAgICAgICAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzOmVzNiAtLW91dCB0ZXN0L2dlbi1qcy1lczYgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCcsCisgICAgICAgICAgJ21rZGlyIC1wIHRlc3QvZ2VuLW5vZGVqcy1lczYnLAorICAgICAgICAgICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganM6bm9kZSxlczYgLS1vdXQgLi90ZXN0L2dlbi1ub2RlanMtZXM2IC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQnLAorICAgICAgICBdLmpvaW4oJyAmJiAnKQorICAgICAgfSwKKyAgICAgIFRocmlmdEdlbkpROiB7CisgICAgICAgIGNvbW1hbmQ6ICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganM6anF1ZXJ5IC1nZW4ganM6bm9kZSAtbyB0ZXN0IC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQnCisgICAgICB9LAorICAgICAgVGhyaWZ0R2VuRGVlcENvbnN0cnVjdG9yOiB7CisgICAgICAgIGNvbW1hbmQ6ICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganMgLW8gdGVzdCAuLi8uLi90ZXN0L0pzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQnCisgICAgICB9LAorICAgICAgVGhyaWZ0R2VuRG91YmxlQ29uc3RhbnRzOiB7CisgICAgICAgIGNvbW1hbmQ6ICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganMgLW8gdGVzdCAuLi8uLi90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0JworICAgICAgfSwKKyAgICAgIFRocmlmdFRlc3RTZXJ2ZXI6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIGFzeW5jOiB0cnVlLAorICAgICAgICAgIGV4ZWNPcHRpb25zOiB7CisgICAgICAgICAgICBjd2Q6ICIuL3Rlc3QiLAorICAgICAgICAgICAgZW52OiB7Tk9ERV9QQVRIOiAiLi4vLi4vbm9kZWpzL2xpYjouLi8uLi8uLi9ub2RlX21vZHVsZXMifQorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgY29tbWFuZDogIm5vZGUgc2VydmVyX2h0dHAuanMiLAorICAgICAgfSwKKyAgICAgIFRocmlmdFRlc3RTZXJ2ZXJFUzY6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIGFzeW5jOiB0cnVlLAorICAgICAgICAgIGV4ZWNPcHRpb25zOiB7CisgICAgICAgICAgICBjd2Q6ICIuL3Rlc3QiLAorICAgICAgICAgICAgZW52OiB7Tk9ERV9QQVRIOiAiLi4vLi4vbm9kZWpzL2xpYjouLi8uLi8uLi9ub2RlX21vZHVsZXMifQorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgY29tbWFuZDogIm5vZGUgc2VydmVyX2h0dHAuanMgLS1lczYiLAorICAgICAgfSwKKyAgICAgIFRocmlmdFRlc3RTZXJ2ZXJfVExTOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICBhc3luYzogdHJ1ZSwKKyAgICAgICAgICBleGVjT3B0aW9uczogeworICAgICAgICAgICAgY3dkOiAiLi90ZXN0IiwKKyAgICAgICAgICAgIGVudjoge05PREVfUEFUSDogIi4uLy4uL25vZGVqcy9saWI6Li4vLi4vLi4vbm9kZV9tb2R1bGVzIn0KKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIGNvbW1hbmQ6ICJub2RlIHNlcnZlcl9odHRwcy5qcyIsCisgICAgICB9LAorICAgICAgVGhyaWZ0VGVzdFNlcnZlckVTNl9UTFM6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIGFzeW5jOiB0cnVlLAorICAgICAgICAgIGV4ZWNPcHRpb25zOiB7CisgICAgICAgICAgICBjd2Q6ICIuL3Rlc3QiLAorICAgICAgICAgICAgZW52OiB7Tk9ERV9QQVRIOiAiLi4vLi4vbm9kZWpzL2xpYjouLi8uLi8uLi9ub2RlX21vZHVsZXMifQorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgY29tbWFuZDogIm5vZGUgc2VydmVyX2h0dHBzLmpzIC0tZXM2IiwKKyAgICAgIH0sCisgICAgfSwKKyAgICBxdW5pdDogeworICAgICAgVGhyaWZ0SlM6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODkvdGVzdC1ub2pxLmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0SlNKUTogeworICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgdXJsczogWworICAgICAgICAgICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4OS90ZXN0Lmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0SlNfRG91YmxlUmVuZGVyaW5nOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICB1cmxzOiBbCisgICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg5L3Rlc3QtZG91YmxlLXJlbmRlcmluZy5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgICBpZ25vcmVIVFRQU0Vycm9yczogdHJ1ZSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0V1M6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODkvdGVzdHdzLmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0SlNfVExTOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICB1cmxzOiBbCisgICAgICAgICAgICAnaHR0cHM6Ly9sb2NhbGhvc3Q6ODA5MS90ZXN0LW5vanEuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgICAgaWdub3JlSFRUUFNFcnJvcnM6IHRydWUsCisgICAgICAgICAgfSwKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIFRocmlmdEpTSlFfVExTOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICB1cmxzOiBbCisgICAgICAgICAgICAnaHR0cHM6Ly9sb2NhbGhvc3Q6ODA5MS90ZXN0Lmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICAgIGlnbm9yZUhUVFBTRXJyb3JzOiB0cnVlLAorICAgICAgICAgIH0sCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBUaHJpZnRXU19UTFM6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwczovL2xvY2FsaG9zdDo4MDkxL3Rlc3R3cy5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgICBpZ25vcmVIVFRQU0Vycm9yczogdHJ1ZSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0RGVlcENvbnN0cnVjdG9yOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICB1cmxzOiBbCisgICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg5L3Rlc3QtZGVlcC1jb25zdHJ1Y3Rvci5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgfSwKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIFRocmlmdFdTRVM2OiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICB1cmxzOiBbCisgICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg4L3Rlc3QtZXM2Lmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICBqc2hpbnQ6IHsKKyAgICAgIC8vIFRoZSBtYWluIHRocmlmdCBsaWJyYXJ5IGZpbGUuIG5vdCBlczYgeWV0IDooCisgICAgICBsaWI6IHsKKyAgICAgICAgc3JjOiBbJ3NyYy8qKi8qLmpzJ10sCisgICAgICB9LAorICAgICAgLy8gVGhlIHRlc3QgZmlsZXMgdXNlIGVzNgorICAgICAgdGVzdDogeworICAgICAgICBzcmM6IFsnR3J1bnRmaWxlLmpzJywgJ3Rlc3QvKi5qcyddLAorICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgZXN2ZXJzaW9uOiA2LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgZ2VuX2pzX2NvZGU6IHsKKyAgICAgICAgc3JjOiBbJ3Rlc3QvZ2VuLWpzLyouanMnLCAndGVzdC9nZW4tanMtanF1ZXJ5LyouanMnXSwKKyAgICAgIH0sCisgICAgICBnZW5fZXM2X2NvZGU6IHsKKyAgICAgICAgc3JjOiBbJ3Rlc3QvZ2VuLWpzLWVzNi8qLmpzJ10sCisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICBlc3ZlcnNpb246IDYsCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBnZW5fbm9kZV9jb2RlOiB7CisgICAgICAgIHNyYzogWyd0ZXN0L2dlbi1ub2RlanMvKi5qcyddLAorICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgbm9kZTogdHJ1ZSwKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIGdlbl9ub2RlX2VzNl9jb2RlOiB7CisgICAgICAgIHNyYzogWyd0ZXN0L2dlbi1ub2RlanMtZXM2LyouanMnXSwKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIG5vZGU6IHRydWUsCisgICAgICAgICAgZXN2ZXJzaW9uOiA2LAorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgfSk7CisKKyAgZ3J1bnQubG9hZE5wbVRhc2tzKCdncnVudC1jb250cmliLXVnbGlmeScpOworICBncnVudC5sb2FkTnBtVGFza3MoJ2dydW50LWNvbnRyaWItanNoaW50Jyk7CisgIGdydW50LmxvYWROcG1UYXNrcygnZ3J1bnQtY29udHJpYi1xdW5pdCcpOworICBncnVudC5sb2FkTnBtVGFza3MoJ2dydW50LWNvbnRyaWItY29uY2F0Jyk7CisgIGdydW50LmxvYWROcG1UYXNrcygnZ3J1bnQtanNkb2MnKTsKKyAgZ3J1bnQubG9hZE5wbVRhc2tzKCdncnVudC1zaGVsbC1zcGF3bicpOworCisgIGdydW50LnJlZ2lzdGVyVGFzaygnd2FpdCcsICdXYWl0IGp1c3Qgb25lIHNlY29uZCBmb3Igc2VydmVyIHRvIHN0YXJ0JywgZnVuY3Rpb24gKCkgeworICAgIHZhciBkb25lID0gdGhpcy5hc3luYygpOworICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAgICBkb25lKHRydWUpOworICAgIH0sIDEwMDApOworICB9KTsKKworICBncnVudC5yZWdpc3RlclRhc2soJ2luc3RhbGxBbmRHZW5lcmF0ZScsIFsKKyAgICAnc2hlbGw6SW5zdGFsbFRocmlmdEpTJywgJ3NoZWxsOkluc3RhbGxUaHJpZnROb2RlSlNEZXAnLCAnc2hlbGw6VGhyaWZ0R2VuJywKKyAgICAnc2hlbGw6VGhyaWZ0R2VuRGVlcENvbnN0cnVjdG9yJywgJ3NoZWxsOlRocmlmdEdlbkRvdWJsZUNvbnN0YW50cycsCisgICAgJ3NoZWxsOkluc3RhbGxUZXN0TGlicycsCisgIF0pOworCisgIGdydW50LnJlZ2lzdGVyVGFzaygndGVzdCcsIFsKKyAgICAnaW5zdGFsbEFuZEdlbmVyYXRlJywKKyAgICAnanNoaW50JywKKyAgICAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlcicsICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyX1RMUycsCisgICAgJ3NoZWxsOlRocmlmdFRlc3RTZXJ2ZXJFUzYnLCAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlckVTNl9UTFMnLAorICAgICd3YWl0JywKKyAgICAncXVuaXQ6VGhyaWZ0RGVlcENvbnN0cnVjdG9yJywKKyAgICAncXVuaXQ6VGhyaWZ0SlMnLCAncXVuaXQ6VGhyaWZ0SlNfVExTJywKKyAgICAncXVuaXQ6VGhyaWZ0SlNfRG91YmxlUmVuZGVyaW5nJywKKyAgICAncXVuaXQ6VGhyaWZ0V1MnLAorICAgICdxdW5pdDpUaHJpZnRKU0pRJywgJ3F1bml0OlRocmlmdEpTSlFfVExTJywKKyAgICAncXVuaXQ6VGhyaWZ0V1NFUzYnLAorICAgICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyOmtpbGwnLCAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlcl9UTFM6a2lsbCcsCisgICAgJ3NoZWxsOlRocmlmdFRlc3RTZXJ2ZXJFUzY6a2lsbCcsICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyRVM2X1RMUzpraWxsJywKKyAgXSk7CisgIGdydW50LnJlZ2lzdGVyVGFzaygnZGVmYXVsdCcsIFsndGVzdCcsICdjb25jYXQnLCAndWdsaWZ5JywgJ2pzZG9jJ10pOworfTsKZGlmZiAtLWdpdCBhL2xpYi9qcy9NYWtlZmlsZS5hbSBiL2xpYi9qcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWEyMGE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBhbnQgaXMgbm90IGNvbmZpZ3VyZWQuCisjIFdlIGNhbGwgaW5zdGFsbCB0d2ljZSB0byB3b3JrIGFyb3VuZCBucG0gaXNzdWVzCisjCitpZiBIQVZFX05QTQorU1VCRElSUyA9IHRlc3QKKworY2hlY2stbG9jYWw6IGFsbAorCSQoTlBNKSBpbnN0YWxsIHx8ICQoTlBNKSBpbnN0YWxsCisJJChOUE0pIGxpc3QKKwkuL25vZGVfbW9kdWxlcy8uYmluL2dydW50CitlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2pzL1JFQURNRSBiL2xpYi9qcy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZmRjNDMuLjAwMDAwMDAKLS0tIGEvbGliL2pzL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLVRocmlmdCBKYXZhc2NyaXB0IExpYnJhcnkKLQotTGljZW5zZQotPT09PT09PQotCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLQotVXNpbmcgVGhyaWZ0IHdpdGggSmF2YXNjcmlwdAotPT09PT09PT09PT09PT09PT09PT09Ci0KLUFsbG93cyBqYXZhc2NyaXB0IGNsaWVudCBpbnRlcmZhY2VzIHRvIFRocmlmdCBzZXJ2aWNlcy4KLVRoaXMgaXMgZ2VhcmVkIGZvciB1c2UgaW4gYSB3ZWIgYnJvd3Nlci4KLQotVGhpcyBjbGllbnQgY2FuIG9ubHkgc3BlYWsgdGhlIEpTT04gUHJvdG9jb2wgYW5kIHRoZSBvbmx5IHN1cHBvcnRlZAotdHJhbnNwb3J0IGlzIEFKQVguCi0KLVRoZXJlIGlzIGEgdGVzdCBodHRwZCBzZXJ2aWNlIGluIHRoZSB0ZXN0IGRpciB0aGF0IHJlcXVpcmVzCi1odHRwOi8vaGMuYXBhY2hlLm9yZyB1bmRlciB0ZXN0IGRpcgotCi1EZXBlbmRlbmNpZXMKLT09PT09PT09PT09PQotQSBKYXZhU2NyaXB0IGVuYWJsZWQgYnJvd3Nlci4gVGVzdGVkIHdpdGg6Ci0gKklFIDYsNyw4Ci0gKkZGIDIsMwotICpTYWZhcmkgMyAmIDQKZGlmZiAtLWdpdCBhL2xpYi9qcy9SRUFETUUubWQgYi9saWIvanMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNTFlMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTQwIEBACitUaHJpZnQgSmF2YXNjcmlwdCBMaWJyYXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09CitUaGlzIGJyb3dzZXIgYmFzZWQgQXBhY2hlIFRocmlmdCBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cworUlBDIGNsaWVudHMgdXNpbmcgdGhlIEpTT04gcHJvdG9jb2wgb3ZlciBIdHRwW3NdIHdpdGggWEhSCithbmQgV2ViU29ja2V0LgorCitMaWNlbnNlCistLS0tLS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworR3J1bnQgQnVpbGQKKy0tLS0tLS0tLS0tLQorVGhpcyBpcyB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IEphdmFTY3JpcHQKK2xpYnJhcnkuIFRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGEgR3J1bnRmaWxlLmpzIGFuZCBhCitwYWNrYWdlLmpzb24uIE1hbnkgb2YgdGhlIGJ1aWxkIGFuZCB0ZXN0IHRvb2xzIHVzZWQgaGVyZQorcmVxdWlyZSBhIHJlY2VudCB2ZXJzaW9uIG9mIE5vZGUuanMgdG8gYmUgaW5zdGFsbGVkLiBUbyAKK2luc3RhbGwgdGhlIHN1cHBvcnQgZmlsZXMgZm9yIHRoZSBHcnVudCBidWlsZCB0b29sIGV4ZWN1dGUKK3RoZSBjb21tYW5kOgorCisgICAgbnBtIGluc3RhbGwKKyAgICAKK1RoaXMgcmVhZHMgdGhlIHBhY2thZ2UuanNvbiBhbmQgcHVsbHMgaW4gdGhlIGFwcHJvcHJpYXRlCitzb3VyY2VzIGZyb20gdGhlIGludGVybmV0LiBUbyBidWlsZCB0aGUgSmF2YVNjcmlwdCBicmFuY2gKK29mIEFwYWNoZSBUaHJpZnQgZXhlY3V0ZSB0aGUgY29tbWFuZDoKKworICAgIG5weCBncnVudAorICAgIAorVGhpcyBydW5zIHRoZSBncnVudCBidWlsZCB0b29sIChmcm9tIHdpdGhpbiBgLi9ub2RlX21vZHVsZXMvLmJpbi9gKSwKK2xpbnRpbmcgYWxsIG9mIHRoZSBzb3VyY2UgZmlsZXMsIHNldHRpbmcgdXAgYW5kIHJ1bm5pbmcgdGhlCit0ZXN0cywgY29uY2F0ZW5hdGluZyBhbmQgbWluaWZ5aW5nIHRoZSBtYWluIGxpYnJhcmllcyBhbmQKK2dlbmVyYXRpbmcgdGhlIGh0bWwgZG9jdW1lbnRhdGlvbi4KKworVHJlZQorLS0tLQorVGhlIGZvbGxvd2luZyBkaXJlY3RvcmllcyBhcmUgcHJlc2VudCAoc29tZSBvbmx5IGFmdGVyIHRoZQorZ3J1bnQgYnVpbGQpOgorICAvc3JjICAtIFRoZSBKYXZhU2NyaXB0IEFwYWNoZSBUaHJpZnQgc291cmNlCisgIC9kb2MgIC0gSFRNTCBkb2N1bWVudGF0aW9uCisgIC9kaXN0IC0gRGlzdHJpYnV0aW9uIGZpbGVzICh0aHJpZnQuanMgYW5kIHRocmlmdC5taW4uanMpCisgIC90ZXN0IC0gVmFyaW91cyB0ZXN0cywgdGhpcyBpcyBhIGdvb2QgcGxhY2UgdG8gbG9vayBmb3IKKyAgICAgICAgICBleGFtcGxlIGNvZGUKKyAgL25vZGVfbW9kdWxlcyAtIEJ1aWxkIHN1cHBvcnQgZmlsZXMgaW5zdGFsbGVkIGJ5IG5wbQorCisKK0V4YW1wbGUgSmF2YVNjcmlwdCBDbGllbnQgYW5kIFNlcnZlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgbGlzdGluZyBiZWxvdyBkZW1vbnN0cmF0ZXMgYSBzaW1wbGUgYnJvd3NlciBiYXNlZCBKYXZhU2NyaXB0CitUaHJpZnQgY2xpZW50IGFuZCBOb2RlLmpzIEphdmFTY3JpcHQgc2VydmVyIGZvciB0aGUgaGVsbG9fc3ZjIAorc2VydmljZS4gCisKKyMjIyBoZWxsby50aHJpZnQgLSBTZXJ2aWNlIElETCAKKyMjIyBidWlsZCB3aXRoOiAkIHRocmlmdCAtZ2VuIGpzIC1nZW4ganM6bm9kZSBoZWxsby50aHJpZnQKKyAgICBzZXJ2aWNlIGhlbGxvX3N2YyB7CisgICAgICBzdHJpbmcgZ2V0X21lc3NhZ2UoMTogc3RyaW5nIG5hbWUpCisgICAgfQorCisjIyMgaGVsbG8uaHRtbCAtIEJyb3dzZXIgQ2xpZW50CisgICAgPCFET0NUWVBFIGh0bWw+CisgICAgPGh0bWwgbGFuZz0iZW4iPgorICAgICAgPGhlYWQ+CisgICAgICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KKyAgICAgICAgPHRpdGxlPkhlbGxvIFRocmlmdDwvdGl0bGU+CisgICAgICA8L2hlYWQ+CisgICAgICA8Ym9keT4KKyAgICAgICAgTmFtZTogPGlucHV0IHR5cGU9InRleHQiIGlkPSJuYW1lX2luIj4KKyAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgaWQ9ImdldF9tc2ciIHZhbHVlPSJHZXQgTWVzc2FnZSIgPgorICAgICAgICA8ZGl2IGlkPSJvdXRwdXQiPjwvZGl2PgorICAKKyAgICAgICAgPHNjcmlwdCBzcmM9InRocmlmdC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgc3JjPSJnZW4tanMvaGVsbG9fc3ZjLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdD4KKyAgICAgICAgICAoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UWEhSVHJhbnNwb3J0KCIvaGVsbG8iKTsKKyAgICAgICAgICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlRKU09OUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgIHZhciBjbGllbnQgICAgPSBuZXcgaGVsbG9fc3ZjQ2xpZW50KHByb3RvY29sKTsKKyAgICAgICAgICAgIHZhciBuYW1lRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJuYW1lX2luIik7CisgICAgICAgICAgICB2YXIgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdXRwdXQiKTsKKyAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnZXRfbXNnIikKKyAgICAgICAgICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24oKXsKKyAgICAgICAgICAgICAgICBjbGllbnQuZ2V0X21lc3NhZ2UobmFtZUVsZW1lbnQudmFsdWUsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgb3V0cHV0RWxlbWVudC5pbm5lckhUTUwgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIH0pOworICAgICAgICAgIH0pKCk7CisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKworIyMjIGhlbGxvLmpzIC0gTm9kZSBTZXJ2ZXIKKyAgICB2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7CisgICAgdmFyIGhlbGxvX3N2YyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9oZWxsb19zdmMuanMnKTsKKyAgICAKKyAgICB2YXIgaGVsbG9faGFuZGxlciA9IHsKKyAgICAgIGdldF9tZXNzYWdlOiBmdW5jdGlvbihuYW1lLCByZXN1bHQpIHsKKyAgICAgICAgdmFyIG1zZyA9ICJIZWxsbyAiICsgbmFtZSArICIhIjsKKyAgICAgICAgcmVzdWx0KG51bGwsIG1zZyk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIHZhciBoZWxsb19zdmNfb3B0ID0geworICAgICAgdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorICAgICAgcHJvdG9jb2w6IHRocmlmdC5USlNPTlByb3RvY29sLAorICAgICAgcHJvY2Vzc29yOiBoZWxsb19zdmMsCisgICAgICBoYW5kbGVyOiBoZWxsb19oYW5kbGVyCisgICAgfTsKKyAgICAKKyAgICB2YXIgc2VydmVyX29wdCA9IHsKKyAgICAgIHN0YXRpY0ZpbGVQYXRoOiAiLiIsCisgICAgICBzZXJ2aWNlczogeworICAgICAgICAiL2hlbGxvIjogaGVsbG9fc3ZjX29wdAorICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2YXIgc2VydmVyID0gVGhyaWZ0LmNyZWF0ZVdlYlNlcnZlcihzZXJ2ZXJfb3B0KTsKKyAgICB2YXIgcG9ydCA9IDkwOTk7CisgICAgc2VydmVyLmxpc3Rlbihwb3J0KTsKKyAgICBjb25zb2xlLmxvZygiSHR0cC9UaHJpZnQgU2VydmVyIHJ1bm5pbmcgb24gcG9ydDogIiArIHBvcnQpOworCisKK1R5cGVTY3JpcHQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVHlwZVNjcmlwdCBkZWZpbml0aW9uIGZpbGVzIGNhbiBhbHNvIGJlIGdlbmVyYXRlZCBieSBydW5uaW5nOgorCisgICAgdGhyaWZ0IC0tZ2VuIGpzOnRzIGZpbGUudGhyaWZ0CisKZGlmZiAtLWdpdCBhL2xpYi9qcy9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2pzL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2pzL3BhY2thZ2UtbG9jay5qc29uIGIvbGliL2pzL3BhY2thZ2UtbG9jay5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZDgxYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvcGFja2FnZS1sb2NrLmpzb24KQEAgLTAsMCArMSwzNzc3IEBACit7CisgICJuYW1lIjogInRocmlmdCIsCisgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgImxvY2tmaWxlVmVyc2lvbiI6IDEsCisgICJyZXF1aXJlcyI6IHRydWUsCisgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgImFiYnJldiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hYmJyZXYvLS9hYmJyZXYtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW5uZTkvSWlRL2h6SWhZNnBkRG5iQnR6N0RqUFRLclkwMFAvenZQU201cE9Ga2w2eHVHckduWG4vVnRUTk5mTnRBZlo5LzFSdGVoa3N6VTlxY1RpaTBRPT0iCisgICAgfSwKKyAgICAiYWdlbnQtYmFzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hZ2VudC1iYXNlLy0vYWdlbnQtYmFzZS00LjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItSlZ3WE1yOW5IWVRVWHNCRktVcWhKd3ZsY1lVL2JscmVPRVVraE5SMmVYWkl2d2QrYytvNVY0TWdEUEtXbk1TLzU2YXdOM1RSeklQK0tvUG4rcm9RdGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzNi1wcm9taXNpZnkiOiAiXjUuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImFqdiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuNS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hanYvLS9hanYtNS41LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jN1h1eWorclpUNDlQNVFpczBHdFFpQmR5V1U9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvIjogIl40LjYuMCIsCisgICAgICAgICJmYXN0LWRlZXAtZXF1YWwiOiAiXjEuMC4wIiwKKyAgICAgICAgImZhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5IjogIl4yLjAuMCIsCisgICAgICAgICJqc29uLXNjaGVtYS10cmF2ZXJzZSI6ICJeMC4zLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYWxpZ24tdGV4dCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbGlnbi10ZXh0Ly0vYWxpZ24tdGV4dC0wLjEuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUROa0tWaENUODEwS21TVnNJcmNHbERQNjBSYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogIl4zLjAuMiIsCisgICAgICAgICJsb25nZXN0IjogIl4xLjAuMSIsCisgICAgICAgICJyZXBlYXQtc3RyaW5nIjogIl4xLjUuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTMuMi4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLU1lb2hwelM2dWJ1dzh5Um0ySk91cFI1S1BHUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImFuc2ktcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1yZWdleC8tL2Fuc2ktcmVnZXgtMi4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13N002dGU0MkRZYmc1aWp3Um9ybjd5ZldWTjg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYW5zaS1zdHlsZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1zdHlsZXMvLS9hbnNpLXN0eWxlcy0zLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVlQwWkk2a1pSZFRoOFl5SnczU01iWW0vdStOcWZzQXhFcFdPMFBmOXNxOC9lOTRXeHhPcFBLeDlGUjFGbHlDdE9WRE5PUSs4bnRscUZ4aVJjK3I1cUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbG9yLWNvbnZlcnQiOiAiXjEuOS4wIgorICAgICAgfQorICAgIH0sCisgICAgImFyZ3BhcnNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEwIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcmdwYXJzZS8tL2FyZ3BhcnNlLTEuMC4xMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbzVSb3k2dE5HNFNML0ZPa0NBTjZSemppYWtaUzI1UkxZRnJjTXR0SnFiZGQ4QldybkErZkd6NTdpTjVQYjA2cHZCR3ZsNWdRMEI0OGRKbHNsWHZvVGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNwcmludGYtanMiOiAifjEuMC4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJzcHJpbnRmLWpzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3ByaW50Zi1qcy8tL3NwcmludGYtanMtMS4wLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQk9hU2IyWW9sVFZQUGRBVklEWXp1RmNwZml3PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImFyci1kaWZmIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fyci1kaWZmLy0vYXJyLWRpZmYtNC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0xa1lRZFA2LzdISG40VkkxZGhveW1sM0h4U0E9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyLWZsYXR0ZW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyLWZsYXR0ZW4vLS9hcnItZmxhdHRlbi0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTDNoS1Y1Ui9wNW84MVI3TzAySUdud3BEbWtwNkU5ODJYaHRidXdTZTNPNHFPdE1NTXRvZGljQVNBMUNueTJVK2FDWGNOcG1sK200ZFBzdnNKM2phdGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFyci11bmlvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnItdW5pb24vLS9hcnItdW5pb24tMy4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS00NXNKcnFuZStHYW84Z2JpaUs5amtadXVPY1E9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyYXktZWFjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnJheS1lYWNoLy0vYXJyYXktZWFjaC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXA1U3ZEQVdyRjFLRWJ1ZFRvZklSb0Z1Z3hFOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnJheS1maW5kLWluZGV4IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LWZpbmQtaW5kZXgvLS9hcnJheS1maW5kLWluZGV4LTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtM3dFS29TaCtGa3U5cHZseU93cVdvZXhCaDZFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFycmF5LXNsaWNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LXNsaWNlLy0vYXJyYXktc2xpY2UtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUIxcU1EM1JCUDdPOG8wSDJLYnJYRHlCMEljY2VqTUYxNSs4N0x2bG9yMTJPTlBSSFA2Z1RqWE1Oa3QvZDNadU9HYkFlNjZoRm1hQ2ZFQ0kyNFVmcDZ3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnJheS11bmlxdWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyYXktdW5pcXVlLy0vYXJyYXktdW5pcXVlLTAuMy4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcUpTM1hVdkU5czFubnZNa1NwL1k5R3JpMUNnPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzbjEiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXNuMS8tL2FzbjEtMC4yLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWp4d3pRcExRalNtV1hnd2FDWkU5TnorZ2xBRzAxeUYxUW5XZ2JoR3dISTVBNkZSSUVZNklWcXRIaEllcEhxSTcva3lFeVFFYWdCQzVtQkVGbElZdmRnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2FmZXItYnVmZmVyIjogIn4yLjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJhc3NlcnQtcGx1cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3NlcnQtcGx1cy8tL2Fzc2VydC1wbHVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOFM0UFBGMTNzTEhOMlJScFF1VHBiQjVOMVNVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzc2lnbi1zeW1ib2xzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fzc2lnbi1zeW1ib2xzLy0vYXNzaWduLXN5bWJvbHMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XV1ovUWZyZFR5RE12Q3U1YTQxUGYzanNBMmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXN5bmMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy8tL2FzeW5jLTEuNS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtN0dwaHJsWklEQXc4c2tISlZoamlDSkw1WnlvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzeW5jLWxpbWl0ZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXN5bmMtbGltaXRlci8tL2FzeW5jLWxpbWl0ZXItMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpwL3VGbm9vT2lPK0wyMTFlWk9vU3l6cE9JVE1YeDFyQklUYXVZeWtHM0JSWVB1OGgwVWN4c1BOQjA0UlI1dm80VHl6MytheTE3dFI2SlZmOXF6WVdnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhc3luY2tpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luY2tpdC8tL2FzeW5ja2l0LTAuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEteDU3WmYzODB5NDhyb2J5WGtMekRaa2RMUzNrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJhdG9iIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2F0b2IvLS9hdG9iLTIuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1XbTZ1a29hT0dKaS83M3AvY2wyR3ZMalRJNUpNMWsvTzE0aXNENzNZTUw4U3RySC83L2xSRmdtZzhuSUNaZ0QzYlpadmp3Q0d4dE1PRDN3V05BdThjZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXdzLXNpZ24yIjogeworICAgICAgInZlcnNpb24iOiAiMC43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2F3cy1zaWduMi8tL2F3cy1zaWduMi0wLjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRHNkpDVFNwV1I4dEwyK0cxK2FwOGJQK2RxZz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiYXdzNCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuOC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hd3M0Ly0vYXdzNC0xLjguMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUmVaeHZOSElPdjg4RmxUN3J4Y1hJSUMwZlB0NEtacVpiT2xpdnlXdFhMdDhFU3g4NHpkM2tNQzZpSzVqVmVTMnF0K2c3ZnRTN3llNGZpMDZYNXJ0UlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJiYWJ5bG9uIjogeworICAgICAgInZlcnNpb24iOiAiNy4wLjAtYmV0YS4xOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmFieWxvbi8tL2JhYnlsb24tNy4wLjAtYmV0YS4xOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVmcwQzlzL1JFWDYvV0lYTjM3VUtwdjVaaFJpNkE0cGpIbHBrRTM0KzgvYTZjMlcxUTY5Mm4zaG1jK1NaRzVsS1JuYUV4TFVieHRKMVNWVCtLYUNRL0E9PSIKKyAgICB9LAorICAgICJiYWxhbmNlZC1tYXRjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iYWxhbmNlZC1tYXRjaC8tL2JhbGFuY2VkLW1hdGNoLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaWJUUm1hc3I3a25lRms2Z0s0bk9SaTF4dDJjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJhc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjExLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Jhc2UvLS9iYXNlLTAuMTEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNVQ2UDR4UGdwcDBZREZ2U1d3RVo0Tm9FM2FNNFFCUVhEem1WYnJhQ2tGajh6SE0rbWJhOFN5cUI1RGJaV3lSN21ZSG82WTdCZFFvM01vQTRtMFRlUWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNhY2hlLWJhc2UiOiAiXjEuMC4xIiwKKyAgICAgICAgImNsYXNzLXV0aWxzIjogIl4wLjMuNSIsCisgICAgICAgICJjb21wb25lbnQtZW1pdHRlciI6ICJeMS4yLjEiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4xLjAuMCIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjEiLAorICAgICAgICAibWl4aW4tZGVlcCI6ICJeMS4yLjAiLAorICAgICAgICAicGFzY2FsY2FzZSI6ICJeMC4xLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1kcDY2cno5S1k2clRyNTZOTUV5YnZubS9zT1k9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3IvLS9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItbTVobkhUa2NWc1BmcXgzQUtseXR0SVBiN0orWHlrSHZKUDJCOWJaRGpsaExJb0VxNFhvSzY0Vmc3Ym9abFZXWUs2TFVZOTRkWVBFRTdMaDBaa1pLY1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRhdGEtZGVzY3JpcHRvci8tL2lzLWRhdGEtZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpiUlh5MUZtdEFvQ2pRa1ZtSVZZd3V1cURGVWJhT2VEam1lZDF0T0dQcnNNaHRKQTRyRDl0a2dBMEYxcUozZ1JGUlhjSFlWa2RlYVA1MFE1ckUvakxRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGVzY3JpcHRvci8tL2lzLWRlc2NyaXB0b3ItMS4wLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0yZWlzNVdxUUdWN3Blb29EeUxtTkVQVXJwczkrU1hYNWM5cEwzeEVCKzRlOUhuR3VEYTdtQjdrSHhIdzRDYnFTOWsxVDJoT0gzbWlMOG44V3RpWVZ0Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4yIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImJjcnlwdC1wYmtkZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iY3J5cHQtcGJrZGYvLS9iY3J5cHQtcGJrZGYtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1wREFkT0p0cVEvbTJmL1BLRWFQMlkzNDJEcDQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInR3ZWV0bmFjbCI6ICJeMC4xNC4zIgorICAgICAgfQorICAgIH0sCisgICAgImJsdWViaXJkIjogeworICAgICAgInZlcnNpb24iOiAiMy41LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JsdWViaXJkLy0vYmx1ZWJpcmQtMy41LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWRoSFRXTUk3a014NXdoTVFudGw3VnI5QzZCdlYxMGxGWERBYXNucW5yTVloWFZDenprNklPOUZvMkw3NWpYSFQwN1dyT25nTDFXRFhPcCt5WVM5MVlnPT0iCisgICAgfSwKKyAgICAiYnJhY2UtZXhwYW5zaW9uIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjExIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9icmFjZS1leHBhbnNpb24vLS9icmFjZS1leHBhbnNpb24tMS4xLjExLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1pQ3VQSERGZ3JIWDdIMnZFSS81eHB6MDd6U0hCMDBUcHVncWhtWXRWbU1PNjUxOG1DdVJNb09ZRmxkRUJsMGcxODd1Zm96ZGFIZ1dLY1lGYjYxcUdpQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYmFsYW5jZWQtbWF0Y2giOiAiXjEuMC4wIiwKKyAgICAgICAgImNvbmNhdC1tYXAiOiAiMC4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiYnJhY2VzIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JyYWNlcy8tL2JyYWNlcy0yLjMuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYU5kYm5qOVA4UGpkWFU0eWJhV0xLMklGM2pjL0VvRFliQzdBYXpXNnRvM1RSc2ZYeHNjQzlVWE9CNWlEaUVRcmt5SWJXcDJTTFFkYTQrUUFhN25jM3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFyci1mbGF0dGVuIjogIl4xLjEuMCIsCisgICAgICAgICJhcnJheS11bmlxdWUiOiAiXjAuMy4yIiwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4yLjAuMSIsCisgICAgICAgICJmaWxsLXJhbmdlIjogIl40LjAuMCIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjEiLAorICAgICAgICAicmVwZWF0LWVsZW1lbnQiOiAiXjEuMS4yIiwKKyAgICAgICAgInNuYXBkcmFnb24iOiAiXjAuOC4xIiwKKyAgICAgICAgInNuYXBkcmFnb24tbm9kZSI6ICJeMi4wLjEiLAorICAgICAgICAic3BsaXQtc3RyaW5nIjogIl4zLjAuMiIsCisgICAgICAgICJ0by1yZWdleCI6ICJeMy4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VYTk5WVVyWnFmWVE2aHV2dTVpZGF4eFdpUTg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiYnJvd3NlcmlmeS16bGliIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Jyb3dzZXJpZnktemxpYi8tL2Jyb3dzZXJpZnktemxpYi0wLjEuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXV6WDRwUm4yQU9ENmE0U0ZKQnlYblFGQit5MD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwYWtvIjogIn4wLjIuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJidWZmZXItZnJvbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXItZnJvbS8tL2J1ZmZlci1mcm9tLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1NUWNYRVViQ0t0RW83YmhxRXM2NTYwSHlkNFhhb3ZabE8vazlWM2hqVlVGL3p3VzdLQlZkU0s0Z0l0L2J6d1M5TWJSNXFvYitGNWp1c1pzYjBZUUsyQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYnVmZmVyLXNoaW1zIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2J1ZmZlci1zaGltcy8tL2J1ZmZlci1zaGltcy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1Yak9NWE9JeGttdGg1TUNqRFIzN3dSS2kxRT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJidWlsdGluLW1vZHVsZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnVpbHRpbi1tb2R1bGVzLy0vYnVpbHRpbi1tb2R1bGVzLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSnc4SGJGcHl3QzliWmFSOStVeGY0Nko0aVM4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNhY2hlLWJhc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2FjaGUtYmFzZS8tL2NhY2hlLWJhc2UtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUFLY2RUbkZTV0FUZDUvR0NQUnhyMkNod0lKODVDZXlyRXlqUkhsS3hRNTZkNFhKTUd5bTB1QWlLbjB4YkxPR09sMyt5UnBPVGk0ODRkVkNFYzVBVXpRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb2xsZWN0aW9uLXZpc2l0IjogIl4xLjAuMCIsCisgICAgICAgICJjb21wb25lbnQtZW1pdHRlciI6ICJeMS4yLjEiLAorICAgICAgICAiZ2V0LXZhbHVlIjogIl4yLjAuNiIsCisgICAgICAgICJoYXMtdmFsdWUiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMSIsCisgICAgICAgICJzZXQtdmFsdWUiOiAiXjIuMC4wIiwKKyAgICAgICAgInRvLW9iamVjdC1wYXRoIjogIl4wLjMuMCIsCisgICAgICAgICJ1bmlvbi12YWx1ZSI6ICJeMS4wLjAiLAorICAgICAgICAidW5zZXQtdmFsdWUiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImNhbWVsY2FzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYW1lbGNhc2UvLS9jYW1lbGNhc2UtMi4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1mQjBXMW5taHUrV2NvQ3lzN1BzQkhpQWZXaDg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2FtZWxjYXNlLWtleXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYW1lbGNhc2Uta2V5cy8tL2NhbWVsY2FzZS1rZXlzLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTUl2dXIvM3lnUmtGSHZvZGt5SVR5UnVQa3VjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNhbWVsY2FzZSI6ICJeMi4wLjAiLAorICAgICAgICAibWFwLW9iaiI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2FzZWxlc3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEyLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Nhc2VsZXNzLy0vY2FzZWxlc3MtMC4xMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRzJnY0lmK0VBenlDWlVNSkJvbENEUmh4VWR3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJjYXRoYXJzaXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjguOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2F0aGFyc2lzLy0vY2F0aGFyc2lzLTAuOC45LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbU15SkRLWlMzUzd3NXdzM2tsTVEvNTZRL0lzPSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlLWNvbnRyaWIiOiAifjAuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImNlbnRlci1hbGlnbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jZW50ZXItYWxpZ24vLS9jZW50ZXItYWxpZ24tMC4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xZzB5WXB0dTZYSWdCQkhMMUVZY2tIdkN0NjA9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWxpZ24tdGV4dCI6ICJeMC4xLjMiLAorICAgICAgICAibGF6eS1jYWNoZSI6ICJeMS4wLjMiCisgICAgICB9CisgICAgfSwKKyAgICAiY2hhbGsiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhbGsvLS9jaGFsay0yLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItT2JONmgxdjJmVEpTbVVYb1Mzbk1ROTJMYkRLOWJlNFRWKzZHK29tUWxHSkZkY1VYNWhlS2kxTFoxWW5STUlnd1RMRWozRTI0YlQ2dFluaTUwcmxDZlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktc3R5bGVzIjogIl4zLjIuMSIsCisgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjUiLAorICAgICAgICAic3VwcG9ydHMtY29sb3IiOiAiXjUuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImNsYXNzLXV0aWxzIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NsYXNzLXV0aWxzLy0vY2xhc3MtdXRpbHMtMC4zLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXFPaFBhL0ZqN3M2VFk4SDhlc0d1NVFOcE1NUXh6NzloK3VyenJOWU42bW4rOUJueGxER2Y1UVorWGVDRHN4U2pQcXNTUjU2WE9aT0ptcGV1cm5MTWVnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnItdW5pb24iOiAiXjMuMS4wIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMC4yLjUiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4wIiwKKyAgICAgICAgInN0YXRpYy1leHRlbmQiOiAiXjAuMS4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMC4yLjUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzFzZStSanNQSmtQbWx2RmUrQktyT3hjZ1JZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImNsaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jbGkvLS9jbGktMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Jb0YxTlBKTCtrbFF3MDFUTFVqc3ZHSWJqQlE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhpdCI6ICIwLjEuMiIsCisgICAgICAgICJnbG9iIjogIl43LjEuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZ2xvYiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI3LjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2IvLS9nbG9iLTcuMS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdmNmdWlJeG9nTFY0RGxHQkhJVU93STBJYnJKOEhXUGM0TVU3SHp2aUdlTmhvL1VKRGZpNkI1cDNzSGVXSVEwS0dJVTBKcHhpNVpIeGVtUWZMa2tBd1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImZzLnJlYWxwYXRoIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICIyIiwKKyAgICAgICAgICAgICJtaW5pbWF0Y2giOiAiXjMuMC40IiwKKyAgICAgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiY2xpdWkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2xpdWkvLS9jbGl1aS0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVMwZFhZUCtBSmt4MkxEb1hHUU11a2NmK29ORT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjZW50ZXItYWxpZ24iOiAiXjAuMS4xIiwKKyAgICAgICAgInJpZ2h0LWFsaWduIjogIl4wLjEuMSIsCisgICAgICAgICJ3b3Jkd3JhcCI6ICIwLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJjbyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jby8tL2NvLTQuNi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYnFhOTg5aFRybFRNdU9SNytndnorUU1mc1lRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJjb2ZmZWVzY3JpcHQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEwLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvZmZlZXNjcmlwdC8tL2NvZmZlZXNjcmlwdC0xLjEwLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS01NnFEQVpGKzlpR3pYWW81ODBqYzNSMjM0ejQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29sbGVjdGlvbi12aXNpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xsZWN0aW9uLXZpc2l0Ly0vY29sbGVjdGlvbi12aXNpdC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVM4QTNQQlpMd3lrYlRUYU1ncHp4cUFwWjNLQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtYXAtdmlzaXQiOiAiXjEuMC4wIiwKKyAgICAgICAgIm9iamVjdC12aXNpdCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY29sb3ItY29udmVydCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuOS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xvci1jb252ZXJ0Ly0vY29sb3ItY29udmVydC0xLjkuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUWZBVXRkK3ZGZEF0RlFjQzhDQ3lZdDFmWVd4U3FBaUsyY1NENnpEQjhOM2Nwc0VCQXZSeHA5ek9HZzZHL1NISEpZQVQ4OC9hei9JdURHQUxzTlZiR2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbG9yLW5hbWUiOiAiMS4xLjMiCisgICAgICB9CisgICAgfSwKKyAgICAiY29sb3ItbmFtZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xvci1uYW1lLy0vY29sb3ItbmFtZS0xLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXA5QlZpOWljUXZlVjNVSXlqM1FJTWNwVHZDVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb2xvcnMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29sb3JzLy0vY29sb3JzLTEuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRm9wSEFYVnJhbjlSb1N6Z3lYdjZLTUNFN1dNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbWJpbmVkLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb21iaW5lZC1zdHJlYW0vLS9jb21iaW5lZC1zdHJlYW0tMS4wLjcudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWJyV2w5eTZ2T0IxeFlQWmNwWmRlM045ekRCeVhUb3NBZU1EbzRwMXd6bzZVTU9YNHZ1bUIrVFAxUlo3NnNmRTZNZDY4UTBOSlNyRS9nYmV6ZDRVbCt3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWxheWVkLXN0cmVhbSI6ICJ+MS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY29tcG9uZW50LWVtaXR0ZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29tcG9uZW50LWVtaXR0ZXIvLS9jb21wb25lbnQtZW1pdHRlci0xLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUUza1kxdGVDZy9mZmVtdDhXbVBoUU9hVUplWT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb25jYXQtbWFwIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbmNhdC1tYXAvLS9jb25jYXQtbWFwLTAuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMktscjEzL1dqZmQ1T25NRGFqdWcxVUJkUjNzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbmNhdC1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29uY2F0LXN0cmVhbS8tL2NvbmNhdC1zdHJlYW0tMS42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTI3SEJnaEp4amladElrM1ljdm4vNGtiSmsvMXVadUpGZnVQRW5zNkxhRXZwdkcxZjBoVGVhOGxpbHJvdXlvOW1WYzJHV2RjRVo4T0xvR21TQURsckN3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJidWZmZXItZnJvbSI6ICJeMS4wLjAiLAorICAgICAgICAiaW5oZXJpdHMiOiAiXjIuMC4zIiwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6ICJeMi4yLjIiLAorICAgICAgICAidHlwZWRhcnJheSI6ICJeMC4wLjYiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjMuNiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhZGFibGUtc3RyZWFtLy0vcmVhZGFibGUtc3RyZWFtLTIuMy42LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdFF0S0E5V0lBaEJGMytWTEFzZXlNcVplQmpXMEFISm94T3RZcVNVWk5KeGF1RXJtTGJWbTJGVzF5K0ovWUE5ZFVyQUMzOUlUZWpsWldoVkl3YXdrS3c9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImNvcmUtdXRpbC1pcyI6ICJ+MS4wLjAiLAorICAgICAgICAgICAgImluaGVyaXRzIjogIn4yLjAuMyIsCisgICAgICAgICAgICAiaXNhcnJheSI6ICJ+MS4wLjAiLAorICAgICAgICAgICAgInByb2Nlc3MtbmV4dGljay1hcmdzIjogIn4yLjAuMCIsCisgICAgICAgICAgICAic2FmZS1idWZmZXIiOiAifjUuMS4xIiwKKyAgICAgICAgICAgICJzdHJpbmdfZGVjb2RlciI6ICJ+MS4xLjEiLAorICAgICAgICAgICAgInV0aWwtZGVwcmVjYXRlIjogIn4xLjAuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdHJpbmdfZGVjb2RlciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmluZ19kZWNvZGVyLy0vc3RyaW5nX2RlY29kZXItMS4xLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1uL1NobnZEaTZGSGJiVmZ2aXJvK1dvamlGenYrczhNUE1IQmN6VmVQZlVwREpMd29MVDBodDFsNFl3QkNiaThwSkF2ZUVFZG5rSHlQeVRQL216UmZ3Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAic2FmZS1idWZmZXIiOiAifjUuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImNvbnNvbGUtYnJvd3NlcmlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb25zb2xlLWJyb3dzZXJpZnkvLS9jb25zb2xlLWJyb3dzZXJpZnktMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04Q1FjUlhNS244WXlPeUJ0dnpqdHgwSFF1eEE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGF0ZS1ub3ciOiAiXjAuMS40IgorICAgICAgfQorICAgIH0sCisgICAgImNvcHktZGVzY3JpcHRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb3B5LWRlc2NyaXB0b3IvLS9jb3B5LWRlc2NyaXB0b3ItMC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1aMjl1czhPWmw4THVHc09wSlAxaEpIU1BWNDA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29yZS11dGlsLWlzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvcmUtdXRpbC1pcy8tL2NvcmUtdXRpbC1pcy0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRmMVVJZ3FpdkZxMWVxdHhRTWxBZFVVRHdhYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjcm9zcy1zcGF3biI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jcm9zcy1zcGF3bi8tL2Nyb3NzLXNwYXduLTYuMC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lVFZMckJTdDdmamJEeWd6ODA1cE1uc3RJczJWVEJOa1JtMHF4WmQrTTdBNVhEZHhWUldPNU14R0JYWmhqWTRjcUxZTGR0ckdxUmY4bUJQbXp3U3BXUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibmljZS10cnkiOiAiXjEuMC40IiwKKyAgICAgICAgInBhdGgta2V5IjogIl4yLjAuMSIsCisgICAgICAgICJzZW12ZXIiOiAiXjUuNS4wIiwKKyAgICAgICAgInNoZWJhbmctY29tbWFuZCI6ICJeMS4yLjAiLAorICAgICAgICAid2hpY2giOiAiXjEuMi45IgorICAgICAgfQorICAgIH0sCisgICAgImN1cnJlbnRseS11bmhhbmRsZWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY3VycmVudGx5LXVuaGFuZGxlZC8tL2N1cnJlbnRseS11bmhhbmRsZWQtMC40LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tSTN6UCtxeGtlOTVtbUUybmRkc0Y2MzVWK289IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyYXktZmluZC1pbmRleCI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiY3ljbGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY3ljbGUvLS9jeWNsZS0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUllZ0xLK2hZRDVpMGFQTjVRd1ppc0ViRFN0ST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiZGFzaGRhc2giOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjE0LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Rhc2hkYXNoLy0vZGFzaGRhc2gtMS4xNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaFR6NkQzeStMKzFkNGdNbXVOMVlFRFgyNHZBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NlcnQtcGx1cyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZGF0ZS1ub3ciOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGF0ZS1ub3cvLS9kYXRlLW5vdy0wLjEuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTZ2UTUvVTFJU0sxMDVjeDl2dklBWnl1ZU5Gcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkYXRlZm9ybWF0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEyIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kYXRlZm9ybWF0Ly0vZGF0ZWZvcm1hdC0xLjAuMTIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ueEpMWjFsTWszLzNCcE11U21Rc3lvMjcvdWs9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2V0LXN0ZGluIjogIl40LjAuMSIsCisgICAgICAgICJtZW93IjogIl4zLjMuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJkZWJ1ZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWJ1Zy8tL2RlYnVnLTIuNi45LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1iQzdFbHJkSmFKblBiQVArMUVvdFl2cVpzYjNlY2w1d2k2QmZpNkJKVFVjTm93cDZjdnNwZzBqWHpuUlRLRGptL0U3QWRnRkJWZUFQVk1OY0tHc0hNQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibXMiOiAiMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZGVjYW1lbGl6ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWNhbWVsaXplLy0vZGVjYW1lbGl6ZS0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTlsTk5GUlNDYWJJRFV1ZSs0bTlRSDVvWkVwQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkZWNvZGUtdXJpLWNvbXBvbmVudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWNvZGUtdXJpLWNvbXBvbmVudC8tL2RlY29kZS11cmktY29tcG9uZW50LTAuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNnprVE16UllkMXk0VE5HaCt1QmlFR3U0ZFVVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMi4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWp3SzJVVjRjblBwYmNHNytWUkFSS1RaUFVXb3d3WEE4YnpINU5QNnVkMG9lQXh5WVB1R1pVQUM3aE11Z3BDZHo0QmVTWmwyRGw5azY2Q0hKLzQ2WllRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4xLjAuMiIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLy0vaXMtYWNjZXNzb3ItZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW01aG5IVGtjVnNQZnF4M0FLbHl0dElQYjdKK1h5a0h2SlAyQjliWkRqbGhMSW9FcTRYb0s2NFZnN2JvWmxWV1lLNkxVWTk0ZFlQRUU3TGgwWmtaS2NRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kYXRhLWRlc2NyaXB0b3IvLS9pcy1kYXRhLWRlc2NyaXB0b3ItMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qYlJYeTFGbXRBb0NqUWtWbUlWWXd1dXFERlViYU9lRGptZWQxdE9HUHJzTWh0SkE0ckQ5dGtnQTBGMXFKM2dSRlJYY0hZVmtkZWFQNTBRNXJFL2pMUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRlc2NyaXB0b3IvLS9pcy1kZXNjcmlwdG9yLTEuMC4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItMmVpczVXcVFHVjdwZW9vRHlMbU5FUFVycHM5K1NYWDVjOXBMM3hFQis0ZTlIbkd1RGE3bUI3a0h4SHc0Q2JxUzlrMVQyaE9IM21pTDhuOFd0aVlWdGc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMiIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJkZWxheWVkLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWxheWVkLXN0cmVhbS8tL2RlbGF5ZWQtc3RyZWFtLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtM3pyaG1heXQrMzFFQ3FyZ3NwNGljckpPeGhrPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRldGVjdC1maWxlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RldGVjdC1maWxlLy0vZGV0ZWN0LWZpbGUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04Tlp0QTJjcWdseXh0enZiUCtZakVNamxVcmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZG9tLXNlcmlhbGl6ZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9tLXNlcmlhbGl6ZXIvLS9kb20tc2VyaWFsaXplci0wLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUJ6eHBkVWJPQjRET0k3NUtLT0tUNUF2RERJST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkb21lbGVtZW50dHlwZSI6ICJ+MS4xLjEiLAorICAgICAgICAiZW50aXRpZXMiOiAifjEuMS4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkb21lbGVtZW50dHlwZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RvbWVsZW1lbnR0eXBlLy0vZG9tZWxlbWVudHR5cGUtMS4xLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdlNoM1BpWkNpQnJzVVZSSkpDbWNYTmdpR0ZzPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImVudGl0aWVzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZW50aXRpZXMvLS9lbnRpdGllcy0xLjEuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ibHd0Q2xZaHRkcmE3TytBdVE3ZnRjMTNjdkE9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZG9tZWxlbWVudHR5cGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9tZWxlbWVudHR5cGUvLS9kb21lbGVtZW50dHlwZS0xLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXNYcnRndWlyV2VVdDJjR2JGMWJnL0JoeUJNST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkb21oYW5kbGVyIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RvbWhhbmRsZXIvLS9kb21oYW5kbGVyLTIuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTGVXYUNDTFZBbityLzI4RExDc2xvcWlyNXpnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRvbWVsZW1lbnR0eXBlIjogIjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZG9tdXRpbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjUuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9tdXRpbHMvLS9kb211dGlscy0xLjUuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTNOaElpaWIxWTlZUWVlU01uM3QrTWpjMmdzOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkb20tc2VyaWFsaXplciI6ICIwIiwKKyAgICAgICAgImRvbWVsZW1lbnR0eXBlIjogIjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZWNjLWpzYm4iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZWNjLWpzYm4vLS9lY2MtanNibi0wLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU9vT3BCT1ZEVXloNGRNVmt0MVNUaG9TYW1Naz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAianNibiI6ICJ+MC4xLjAiLAorICAgICAgICAic2FmZXItYnVmZmVyIjogIl4yLjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJlbnRpdGllcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lbnRpdGllcy8tL2VudGl0aWVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtc3BoNm80SVRSL3plWkNzay9meWVUN2NTdnlZPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVycm9yLWV4IjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Vycm9yLWV4Ly0vZXJyb3ItZXgtMS4zLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTdkRkhObXFlRlNFdDJaQnNDcmlvcktubjNaMnBqK2ZkOWttSTZRb1d3NC8vREwraWNFQmZjMFU3cUpDaXNxclRzS1RqdzRmTkZ5MnBXOU9xU3REODRnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1hcnJheWlzaCI6ICJeMC4yLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZXM2LXByb21pc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjIuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXM2LXByb21pc2UvLS9lczYtcHJvbWlzZS00LjIuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbjZ3dnBkRTQzVkZ0SnErbFVEWURCRlV3VjhUWmJ1R1hMVjRENndLYWZnMTNsZHpuS3N5RXZhdHVibm1VZTMxemN2ZWxTek9IRitYYmFUK0JsOU9iRGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVzNi1wcm9taXNpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lczYtcHJvbWlzaWZ5Ly0vZXM2LXByb21pc2lmeS01LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVVRbldMejVXNnBaOFMyTlFXdThJS1J5S1VnTT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlczYtcHJvbWlzZSI6ICJeNC4wLjMiCisgICAgICB9CisgICAgfSwKKyAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNjYXBlLXN0cmluZy1yZWdleHAvLS9lc2NhcGUtc3RyaW5nLXJlZ2V4cC0xLjAuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUcySEFWaUdRcU4vMnJqdXl6d0lBeWhNTGh0UT0iCisgICAgfSwKKyAgICAiZXNwcmltYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNy4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3ByaW1hLy0vZXNwcmltYS0yLjcuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWx1TzNEVmQ1OXExSnpRTW1jOUhERW5aN3BZRT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJldmVudGVtaXR0ZXIyIjogeworICAgICAgInZlcnNpb24iOiAiMC40LjE0IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2V2ZW50ZW1pdHRlcjIvLS9ldmVudGVtaXR0ZXIyLTAuNC4xNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWoyRzNYTjRCS3k2ZXNvVFVWRldEdFdRN1lhcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJleGl0IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4aXQvLS9leGl0LTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQmpKamo0MkhmTWdoQjlNS0QvOGFGOHVoelF3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV4cGFuZC1icmFja2V0cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHBhbmQtYnJhY2tldHMvLS9leHBhbmQtYnJhY2tldHMtMi4xLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10M2MxNHhYT01QYTI3L0Q0T3dRVkdpSkVsaUk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVidWciOiAiXjIuMy4zIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMC4yLjUiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjIuMC4xIiwKKyAgICAgICAgInBvc2l4LWNoYXJhY3Rlci1jbGFzc2VzIjogIl4wLjEuMCIsCisgICAgICAgICJyZWdleC1ub3QiOiAiXjEuMC4wIiwKKyAgICAgICAgInNuYXBkcmFnb24iOiAiXjAuOC4xIiwKKyAgICAgICAgInRvLXJlZ2V4IjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMi41IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTAuMi41LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXcxc2UrUmpzUEprUG1sdkZlK0JLck94Y2dSWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVWE5OVlVclpxZllRNmh1dnU1aWRheHhXaVE4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImV4cGFuZC10aWxkZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHBhbmQtdGlsZGUvLS9leHBhbmQtdGlsZGUtMi4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sK2dCcWdVdDhDUlUza2F3Sy9ZaFpDemNoUUk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaG9tZWRpci1wb2x5ZmlsbCI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZXh0ZW5kIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC8tL2V4dGVuZC0zLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZmpxdUM1OWNEN0N5VzZ1ck5YSzBGQnVma1pjb2lHRzgwd1R1UHVqWDU5MGNCNVR0bG4yMEUyVUI0Uy9XQVJWcWhYZmZabDJMTmdTK2dRZFBJSWltL2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMy4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1KcWNhcndjN09mc2hKeGNuUmhNY0p3UUNqYmc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNzaWduLXN5bWJvbHMiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjEuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJpcy1leHRlbmRhYmxlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZXh0ZW5kYWJsZS8tL2lzLWV4dGVuZGFibGUtMS4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1hcm5YTXhUMWhob0tvOWsxTFpkbWxOeUpkRERmeTJ2MGZYakZsbW9rNCtpOHVsLzZXbGJWZ2U5YmhNNzRPcE5QUVBNR1VUb0R0eitLWGExUG5lSnhPQT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtcGxhaW4tb2JqZWN0IjogIl4yLjAuNCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJleHRnbG9iIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGdsb2IvLS9leHRnbG9iLTIuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ObWI2UVhrRUxzdUJyMjRDSlNraWxvNlVISGdiZWtLNVVpWmdmRTZVSEQzRWIyN1lDNm9EK2JoY1QrdEo2Y2w4ZG1zZ2RReG5XbGNyeThrc0JJQkxwdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyYXktdW5pcXVlIjogIl4wLjMuMiIsCisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjEuMC4wIiwKKyAgICAgICAgImV4cGFuZC1icmFja2V0cyI6ICJeMi4xLjQiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjIuMC4xIiwKKyAgICAgICAgImZyYWdtZW50LWNhY2hlIjogIl4wLjIuMSIsCisgICAgICAgICJyZWdleC1ub3QiOiAiXjEuMC4wIiwKKyAgICAgICAgInNuYXBkcmFnb24iOiAiXjAuOC4xIiwKKyAgICAgICAgInRvLXJlZ2V4IjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWRwNjZyejlLWTZyVHI1Nk5NRXlidm5tL3NPWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVWE5OVlVclpxZllRNmh1dnU1aWRheHhXaVE4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLy0vaXMtYWNjZXNzb3ItZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW01aG5IVGtjVnNQZnF4M0FLbHl0dElQYjdKK1h5a0h2SlAyQjliWkRqbGhMSW9FcTRYb0s2NFZnN2JvWmxWV1lLNkxVWTk0ZFlQRUU3TGgwWmtaS2NRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kYXRhLWRlc2NyaXB0b3IvLS9pcy1kYXRhLWRlc2NyaXB0b3ItMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qYlJYeTFGbXRBb0NqUWtWbUlWWXd1dXFERlViYU9lRGptZWQxdE9HUHJzTWh0SkE0ckQ5dGtnQTBGMXFKM2dSRlJYY0hZVmtkZWFQNTBRNXJFL2pMUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRlc2NyaXB0b3IvLS9pcy1kZXNjcmlwdG9yLTEuMC4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItMmVpczVXcVFHVjdwZW9vRHlMbU5FUFVycHM5K1NYWDVjOXBMM3hFQis0ZTlIbkd1RGE3bUI3a0h4SHc0Q2JxUzlrMVQyaE9IM21pTDhuOFd0aVlWdGc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMiIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJleHRyYWN0LXppcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNi43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRyYWN0LXppcC8tL2V4dHJhY3QtemlwLTEuNi43LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcUVDMHVLOWtBeVpNamJWL1R4cDBNejc0SCtrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbmNhdC1zdHJlYW0iOiAiMS42LjIiLAorICAgICAgICAiZGVidWciOiAiMi42LjkiLAorICAgICAgICAibWtkaXJwIjogIjAuNS4xIiwKKyAgICAgICAgInlhdXpsIjogIjIuNC4xIgorICAgICAgfQorICAgIH0sCisgICAgImV4dHNwcmludGYiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0c3ByaW50Zi8tL2V4dHNwcmludGYtMS4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1scEdFUU9NRUducEJUNHhTNDhWMDZ6dytIZ1U9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXllcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS44IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leWVzLy0vZXllcy0wLjEuOC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVlzOFNBalRHZzNoZGtDTklxQUR2UGd6Q0M4QT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiZmFzdC1kZWVwLWVxdWFsIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zhc3QtZGVlcC1lcXVhbC8tL2Zhc3QtZGVlcC1lcXVhbC0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXdGTkhlQmZJYTFIYXFGUElIZ1diY3owQ05oUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkvLS9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeS0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTFSUXNESzdtc1JpZmg5T25ZUkVHVDRiSXUvST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiZmQtc2xpY2VyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZkLXNsaWNlci8tL2ZkLXNsaWNlci0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWkxdkwyZXd5ZkZCQnY1cXdJLzFuVVBFWGZtVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwZW5kIjogIn4xLjIuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJmaWd1cmVzIjogeworICAgICAgInZlcnNpb24iOiAiMS43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpZ3VyZXMvLS9maWd1cmVzLTEuNy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEteStIanIvenh6VVM0REszKzBvM0hrNmx3SFM0PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuNSIsCisgICAgICAgICJvYmplY3QtYXNzaWduIjogIl40LjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJmaWxsLXJhbmdlIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpbGwtcmFuZ2UvLS9maWxsLXJhbmdlLTQuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMVVTQkhVS1BtT3NHcGozRUF0SkFQREtNT1BjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4yLjAuMSIsCisgICAgICAgICJpcy1udW1iZXIiOiAiXjMuMC4wIiwKKyAgICAgICAgInJlcGVhdC1zdHJpbmciOiAiXjEuNi4xIiwKKyAgICAgICAgInRvLXJlZ2V4LXJhbmdlIjogIl4yLjEuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJmaW5kLXVwIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpbmQtdXAvLS9maW5kLXVwLTEuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYXk2WUlyR2l6Z3BncTJUV0VPeksxVHl5VFE4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBhdGgtZXhpc3RzIjogIl4yLjAuMCIsCisgICAgICAgICJwaW5raWUtcHJvbWlzZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZmluZHVwLXN5bmMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmluZHVwLXN5bmMvLS9maW5kdXAtc3luYy0wLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU41TUtwZGdXdDNmQU5FWGhsbXpHZVFwTUN4WT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnbG9iIjogIn41LjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZ2xvYiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI1LjAuMTUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iLy0vZ2xvYi01LjAuMTUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRzhrMnVlQXZTbUEvekNJdXozWXowd3VMazdFPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImluZmxpZ2h0IjogIl4xLjAuNCIsCisgICAgICAgICAgICAiaW5oZXJpdHMiOiAiMiIsCisgICAgICAgICAgICAibWluaW1hdGNoIjogIjIgfHwgMyIsCisgICAgICAgICAgICAib25jZSI6ICJeMS4zLjAiLAorICAgICAgICAgICAgInBhdGgtaXMtYWJzb2x1dGUiOiAiXjEuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImZpbmVkIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpbmVkLy0vZmluZWQtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1zMzNJUkxkcUwxNXdnZWlFOThDdU5FOFZOSFk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhwYW5kLXRpbGRlIjogIl4yLjAuMiIsCisgICAgICAgICJpcy1wbGFpbi1vYmplY3QiOiAiXjIuMC4zIiwKKyAgICAgICAgIm9iamVjdC5kZWZhdWx0cyI6ICJeMS4xLjAiLAorICAgICAgICAib2JqZWN0LnBpY2siOiAiXjEuMi4wIiwKKyAgICAgICAgInBhcnNlLWZpbGVwYXRoIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJmbGFnZ2VkLXJlc3Bhd24iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmxhZ2dlZC1yZXNwYXduLy0vZmxhZ2dlZC1yZXNwYXduLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVG5tdW15NnppL2hyTzdWcjgrQ2xhcVg4cTljPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZvci1pbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mb3ItaW4vLS9mb3ItaW4tMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1nUWFOS1ZxQlF1d0t4eWJHNGlBTU1QdHRYb0E9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZm9yLW93biI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mb3Itb3duLy0vZm9yLW93bi0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXhqTXk5QlhPM0VzRTIvNXd6NE5rbE1VOHRFcz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmb3ItaW4iOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImZvcmV2ZXItYWdlbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjYuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZm9yZXZlci1hZ2VudC8tL2ZvcmV2ZXItYWdlbnQtMC42LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0rOGNmREVHdDZ6ZjViRmQ2MGUxQzJQMnN5cEU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImZvcm0tZGF0YSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mb3JtLWRhdGEvLS9mb3JtLWRhdGEtMi4zLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTFsTEtCMk11M2FHUDFRLzJlQ094MGZOYlJNZTdYZHdrdHdPcnVoZnFxZDBySUpXd040RGgrRTNoclBTbERDWG5TUjdVdFoxTjM4clZYbSs2K01FaEpRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXN5bmNraXQiOiAiXjAuNC4wIiwKKyAgICAgICAgImNvbWJpbmVkLXN0cmVhbSI6ICJeMS4wLjYiLAorICAgICAgICAibWltZS10eXBlcyI6ICJeMi4xLjEyIgorICAgICAgfQorICAgIH0sCisgICAgImZyYWdtZW50LWNhY2hlIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZyYWdtZW50LWNhY2hlLy0vZnJhZ21lbnQtY2FjaGUtMC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1RcEQ2MG44VDZKdm44emVaeHJ4YUNyLy9EUms9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWFwLWNhY2hlIjogIl4wLjIuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJmcy1leHRyYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mcy1leHRyYS8tL2ZzLWV4dHJhLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtelR6bDkrZkxZVVdJUDhyakdSNllkL2hZZVZBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjIiLAorICAgICAgICAianNvbmZpbGUiOiAiXjIuMS4wIiwKKyAgICAgICAgImtsYXciOiAiXjEuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJrbGF3IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2xhdy8tL2tsYXctMS4zLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUUloRE8wYXpzYm9sblhoNFhZNlc5enVnSkRrPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiZ3JhY2VmdWwtZnMiOiAiXjQuMS45IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImZzLnJlYWxwYXRoIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZzLnJlYWxwYXRoLy0vZnMucmVhbHBhdGgtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1GUVN0SlNNVmpLcEEyMG9uaDhzQlFSbVU2azg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ2V0LXN0ZGluIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dldC1zdGRpbi8tL2dldC1zdGRpbi00LjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXVXakdzS0JEaERKSkF1aS9HbDN6Slhta1VQND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnZXQtdmFsdWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2V0LXZhbHVlLy0vZ2V0LXZhbHVlLTIuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtM0JYS0hHY2poOHAydlRlc0NqbGJvZ1FxTENnPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImdldG9iamVjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nZXRvYmplY3QvLS9nZXRvYmplY3QtMC4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1CSHBFbDRuNkZnMEJqMVNHN1pFeUMyN0hpRnc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ2V0cGFzcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nZXRwYXNzLy0vZ2V0cGFzcy0wLjEuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVh2K09QbWhOVnBya3l5c1NnbUJPaTZZaFNmbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNzZXJ0LXBsdXMiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImdsb2IiOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYi8tL2dsb2ItNy4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JUnV2cjBubEpiak5reVlORktzVFlWS3o5WG89IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZnMucmVhbHBhdGgiOiAiXjEuMC4wIiwKKyAgICAgICAgImluZmxpZ2h0IjogIl4xLjAuNCIsCisgICAgICAgICJpbmhlcml0cyI6ICIyIiwKKyAgICAgICAgIm1pbmltYXRjaCI6ICJeMy4wLjIiLAorICAgICAgICAib25jZSI6ICJeMS4zLjAiLAorICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZ2xvYmFsLW1vZHVsZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYmFsLW1vZHVsZXMvLS9nbG9iYWwtbW9kdWxlcy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItc0t6cEVrZjExR3BPRnV3MFp6anptdDRCNFVad2pPY0c3NTdQUHZyZmh4Y0xGYnEwd3BzZ3BPcXhweHR4RmlDRzREdEc5M002WFJWYkYyb0dkZXY3Ymc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdsb2JhbC1wcmVmaXgiOiAiXjEuMC4xIiwKKyAgICAgICAgImlzLXdpbmRvd3MiOiAiXjEuMC4xIiwKKyAgICAgICAgInJlc29sdmUtZGlyIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJnbG9iYWwtcHJlZml4IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2JhbC1wcmVmaXgvLS9nbG9iYWwtcHJlZml4LTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMi9kRHhzRkprbGs4WlZWb3kyYnRNc0FTTHI0PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImV4cGFuZC10aWxkZSI6ICJeMi4wLjIiLAorICAgICAgICAiaG9tZWRpci1wb2x5ZmlsbCI6ICJeMS4wLjEiLAorICAgICAgICAiaW5pIjogIl4xLjMuNCIsCisgICAgICAgICJpcy13aW5kb3dzIjogIl4xLjAuMSIsCisgICAgICAgICJ3aGljaCI6ICJeMS4yLjE0IgorICAgICAgfQorICAgIH0sCisgICAgImdyYWNlZnVsLWZzIjogeworICAgICAgInZlcnNpb24iOiAiNC4xLjExIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncmFjZWZ1bC1mcy8tL2dyYWNlZnVsLWZzLTQuMS4xMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLURvdmY1TkhkdUlWTlpPQk9wOEFPS2dKdVZsZz0iCisgICAgfSwKKyAgICAiZ3J1bnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQvLS9ncnVudC0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItL0p6bVpOUGZLb3JsQ3JybXhXcVFPNEpWb2RPK0RWZDVYWDREa29jTC8xV2xMbEtWTEU5K1NkRUllbXBPQXhEaFdQeXNMbGU2YWZ2bi9oZzdDazJrOWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvZmZlZXNjcmlwdCI6ICJ+MS4xMC4wIiwKKyAgICAgICAgImRhdGVmb3JtYXQiOiAifjEuMC4xMiIsCisgICAgICAgICJldmVudGVtaXR0ZXIyIjogIn4wLjQuMTMiLAorICAgICAgICAiZXhpdCI6ICJ+MC4xLjEiLAorICAgICAgICAiZmluZHVwLXN5bmMiOiAifjAuMy4wIiwKKyAgICAgICAgImdsb2IiOiAifjcuMC4wIiwKKyAgICAgICAgImdydW50LWNsaSI6ICJ+MS4yLjAiLAorICAgICAgICAiZ3J1bnQta25vd24tb3B0aW9ucyI6ICJ+MS4xLjAiLAorICAgICAgICAiZ3J1bnQtbGVnYWN5LWxvZyI6ICJ+Mi4wLjAiLAorICAgICAgICAiZ3J1bnQtbGVnYWN5LXV0aWwiOiAifjEuMS4xIiwKKyAgICAgICAgImljb252LWxpdGUiOiAifjAuNC4xMyIsCisgICAgICAgICJqcy15YW1sIjogIn4zLjUuMiIsCisgICAgICAgICJtaW5pbWF0Y2giOiAifjMuMC4yIiwKKyAgICAgICAgIm1rZGlycCI6ICJ+MC41LjEiLAorICAgICAgICAibm9wdCI6ICJ+My4wLjYiLAorICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJ+MS4wLjAiLAorICAgICAgICAicmltcmFmIjogIn4yLjYuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZ3J1bnQtY2xpIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtY2xpLy0vZ3J1bnQtY2xpLTEuMi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVZpc1JucnNHbmR0R1NzNG9SVkFiNlhzMXRxZz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJmaW5kdXAtc3luYyI6ICJ+MC4zLjAiLAorICAgICAgICAgICAgImdydW50LWtub3duLW9wdGlvbnMiOiAifjEuMS4wIiwKKyAgICAgICAgICAgICJub3B0IjogIn4zLjAuNiIsCisgICAgICAgICAgICAicmVzb2x2ZSI6ICJ+MS4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAibm9wdCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjAuNiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vcHQvLS9ub3B0LTMuMC42LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXhrWmR2d2lyelUyeldURi9lYXhvcGtheWovaz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJhYmJyZXYiOiAiMSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1jbGkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtY2xpLy0vZ3J1bnQtY2xpLTEuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1Vd0JSdS9RcEFqRGM1M0RSTEVreWlsRmRMMHplbnB4dStmZGRUSWxzRi9LSnFkTmNIYVFtdnl1MVczY0Rlc1o5cnFxWmRLSzVBOCtRREl5TFVFV29aUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ3J1bnQta25vd24tb3B0aW9ucyI6ICJ+MS4xLjAiLAorICAgICAgICAiaW50ZXJwcmV0IjogIn4xLjEuMCIsCisgICAgICAgICJsaWZ0b2ZmIjogIn4yLjUuMCIsCisgICAgICAgICJub3B0IjogIn40LjAuMSIsCisgICAgICAgICJ2OGZsYWdzIjogIn4zLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1jb250cmliLWNvbmNhdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1jb250cmliLWNvbmNhdC8tL2dydW50LWNvbnRyaWItY29uY2F0LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWVZDWVl3aE9oeDEraHQ1SXdCVWxudGwzUmIwPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNoYWxrIjogIl4xLjAuMCIsCisgICAgICAgICJzb3VyY2UtbWFwIjogIl4wLjUuMyIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYW5zaS1zdHlsZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4yLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXN0eWxlcy8tL2Fuc2ktc3R5bGVzLTIuMi4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXRETGRNMWkyTk05MTRlUm1RMmdrQlRQQjNiND0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJjaGFsayI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhbGsvLS9jaGFsay0xLjEuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xQkZjVmVTbkF2NU5GUXE5T0hLQ0tuNEovSmc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYW5zaS1zdHlsZXMiOiAiXjIuMi4xIiwKKyAgICAgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjIiLAorICAgICAgICAgICAgImhhcy1hbnNpIjogIl4yLjAuMCIsCisgICAgICAgICAgICAic3RyaXAtYW5zaSI6ICJeMy4wLjAiLAorICAgICAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogIl4yLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItMi4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVTEwRVhPYTJOaitrQVJjSVJpbVpYcDN6Sk1jPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWNvbnRyaWItanNoaW50IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtY29udHJpYi1qc2hpbnQvLS9ncnVudC1jb250cmliLWpzaGludC0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU5wMlFteVdUeEE2TDU1bEFzaE5BaFF4NU9hdz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaGFsayI6ICJeMS4xLjEiLAorICAgICAgICAiaG9va2VyIjogIl4wLjIuMyIsCisgICAgICAgICJqc2hpbnQiOiAifjIuOS40IgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJhbnNpLXN0eWxlcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjIuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktc3R5bGVzLy0vYW5zaS1zdHlsZXMtMi4yLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdERMZE0xaTJOTTkxNGVSbVEyZ2tCVFBCM2I0PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImNoYWxrIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaGFsay8tL2NoYWxrLTEuMS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXFCRmNWZVNuQXY1TkZRcTlPSEtDS240Si9KZz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJhbnNpLXN0eWxlcyI6ICJeMi4yLjEiLAorICAgICAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuMiIsCisgICAgICAgICAgICAiaGFzLWFuc2kiOiAiXjIuMC4wIiwKKyAgICAgICAgICAgICJzdHJpcC1hbnNpIjogIl4zLjAuMCIsCisgICAgICAgICAgICAic3VwcG9ydHMtY29sb3IiOiAiXjIuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3VwcG9ydHMtY29sb3IvLS9zdXBwb3J0cy1jb2xvci0yLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VMTBFWE9hMk5qK2tBUmNJUmltWlhwM3pKTWM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZ3J1bnQtY29udHJpYi1xdW5pdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1jb250cmliLXF1bml0Ly0vZ3J1bnQtY29udHJpYi1xdW5pdC0zLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItczk5NCtpcEt3YytvVVVJV2FHSXcxc295SUQ0cEV4U0dNZC9jSFFONWgwcDhLYklqUjFMZTNaQzNnaVNEREtYdFpGRTBpK09iZjB1SWpOdmpmdFgyQ3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImV2ZW50ZW1pdHRlcjIiOiAiXjUuMC4xIiwKKyAgICAgICAgInAtZWFjaC1zZXJpZXMiOiAiXjEuMC4wIiwKKyAgICAgICAgInB1cHBldGVlciI6ICIxLjcuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXZlbnRlbWl0dGVyMiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI1LjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V2ZW50ZW1pdHRlcjIvLS9ldmVudGVtaXR0ZXIyLTUuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVlaZWdsZFg3YTFmb2xDOXYxK3F0WTZDY2xGST0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1jb250cmliLXVnbGlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWNvbnRyaWItdWdsaWZ5Ly0vZ3J1bnQtY29udHJpYi11Z2xpZnktMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ybWVrYjVGVDdkVExFWUU2VmV0cHh3MTlzdnM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhbGsiOiAiXjEuMC4wIiwKKyAgICAgICAgImxvZGFzaCI6ICJeNC4wLjEiLAorICAgICAgICAibWF4bWluIjogIl4xLjEuMCIsCisgICAgICAgICJ1Z2xpZnktanMiOiAifjIuNi4yIiwKKyAgICAgICAgInVyaS1wYXRoIjogIl4xLjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYW5zaS1zdHlsZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4yLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXN0eWxlcy8tL2Fuc2ktc3R5bGVzLTIuMi4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXRETGRNMWkyTk05MTRlUm1RMmdrQlRQQjNiND0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJjaGFsayI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhbGsvLS9jaGFsay0xLjEuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xQkZjVmVTbkF2NU5GUXE5T0hLQ0tuNEovSmc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYW5zaS1zdHlsZXMiOiAiXjIuMi4xIiwKKyAgICAgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjIiLAorICAgICAgICAgICAgImhhcy1hbnNpIjogIl4yLjAuMCIsCisgICAgICAgICAgICAic3RyaXAtYW5zaSI6ICJeMy4wLjAiLAorICAgICAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogIl4yLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItMi4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVTEwRVhPYTJOaitrQVJjSVJpbVpYcDN6Sk1jPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWpzZG9jIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWpzZG9jLy0vZ3J1bnQtanNkb2MtMi4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWdDNjZUQ1JYZVFNajNISXlxVlNCSm04emRVejQzZTV2YUcvUExPLzYyN0ExZWRiSm56eGhKVjduRjBLcUx3TU0wUkROdTFpc3RDNmZ2Zm5ZcUZLaTN3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjcm9zcy1zcGF3biI6ICJeNi4wLjUiLAorICAgICAgICAianNkb2MiOiAifjMuNS41IiwKKyAgICAgICAgIm1hcmtlZCI6ICJeMC41LjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgIm1hcmtlZCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjUuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21hcmtlZC8tL21hcmtlZC0wLjUuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWlVa0JaZWdDWm91NEFkd2JLVHdTVy9sTkRjejVPdVJTbDNxZGNsMzFJYTBCMlFQRzBKbit0S2JsaC85L2VQOS82KzRoMjd2cG9oOHdlbC92UU9WMHZ3PT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1rbm93bi1vcHRpb25zIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWtub3duLW9wdGlvbnMvLS9ncnVudC1rbm93bi1vcHRpb25zLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jSHdzTHFvaWdocHU3VHVZajVSb25uRXV4R1ZGbnp0Y1VxVHFwNXJYRkdZTDRPdVBGb2Z3QzRZY2c3bjlmWXd2SzZGNVdiWWdlVk93cGg5Q3JzMmZzUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ3J1bnQtbGVnYWN5LWxvZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1sZWdhY3ktbG9nLy0vZ3J1bnQtbGVnYWN5LWxvZy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMW0zKzVRdkRZZlIxbHRyOGhqaWFpTmpkZHhHZFFXY0gwcncxaUtLaVFuRjAreHRnVGF6aXJTVEd1NjhSY2hQeWgxT0JuZzFiQlVqTG1YOHE5TnBvQ3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbG9ycyI6ICJ+MS4xLjIiLAorICAgICAgICAiZ3J1bnQtbGVnYWN5LWxvZy11dGlscyI6ICJ+Mi4wLjAiLAorICAgICAgICAiaG9va2VyIjogIn4wLjIuMyIsCisgICAgICAgICJsb2Rhc2giOiAifjQuMTcuNSIKKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1sZWdhY3ktbG9nLXV0aWxzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWxlZ2FjeS1sb2ctdXRpbHMvLS9ncnVudC1sZWdhY3ktbG9nLXV0aWxzLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1vN3VIeU8vSitpMnRYRzhyMmJaTmxWazIwdmxJRko5SUVZeUhNQ1FHZldZcnU4SnYzd1RxS1p6dlYzMFlXOXJXRWpxMGVQM2NmbFExcVdvakllOVZGQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhbGsiOiAifjIuNC4xIiwKKyAgICAgICAgImxvZGFzaCI6ICJ+NC4xNy4xMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1sZWdhY3ktdXRpbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1sZWdhY3ktdXRpbC8tL2dydW50LWxlZ2FjeS11dGlsLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi05enlBMjl3L2ZCZTZCSWZqR0VObmR3b2UxVXkzMUJJWHhUSDNzOG1nYTBaNUJ6MlNwNFVDamtleXYydEk0NDl5bWt4M3gyNkIrNDZGVjRmWEVkZGw1QT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXN5bmMiOiAifjEuNS4yIiwKKyAgICAgICAgImV4aXQiOiAifjAuMS4xIiwKKyAgICAgICAgImdldG9iamVjdCI6ICJ+MC4xLjAiLAorICAgICAgICAiaG9va2VyIjogIn4wLjIuMyIsCisgICAgICAgICJsb2Rhc2giOiAifjQuMTcuMTAiLAorICAgICAgICAidW5kZXJzY29yZS5zdHJpbmciOiAifjMuMy40IiwKKyAgICAgICAgIndoaWNoIjogIn4xLjMuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1zaGVsbC1zcGF3biI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4xMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtc2hlbGwtc3Bhd24vLS9ncnVudC1zaGVsbC1zcGF3bi0wLjMuMTAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1nYnVOUlg3RWZUR0NxSDFqQ08rRVhkKzVTSTg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ3J1bnQiOiAiPj0wLjQueCIsCisgICAgICAgICJzeW5jLWV4ZWMiOiAifjAuNi4yIgorICAgICAgfQorICAgIH0sCisgICAgImd6aXAtc2l6ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nemlwLXNpemUvLS9nemlwLXNpemUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1acytMRUJCSEludVZ1czV1b2RvTUYzN1Z3aTg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYnJvd3NlcmlmeS16bGliIjogIl4wLjEuNCIsCisgICAgICAgICJjb25jYXQtc3RyZWFtIjogIl4xLjQuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJoYXItc2NoZW1hIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhci1zY2hlbWEvLS9oYXItc2NoZW1hLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcVV3aUpPdkt3RWVDb05rRFZTSHlSelczN0pJPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJoYXItdmFsaWRhdG9yIjogeworICAgICAgInZlcnNpb24iOiAiNS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhci12YWxpZGF0b3IvLS9oYXItdmFsaWRhdG9yLTUuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0rcW5tTmpJNE9mSDJpcFE5VlFPdzIzYkJkL2lidGZiVmRLMmZZYlk0YWNURHFLVFcvWURwOU1jaW1aZERiRzhpVjlmWml6VXFRTUQ1eHZyaUIxNDZUQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFqdiI6ICJeNS4zLjAiLAorICAgICAgICAiaGFyLXNjaGVtYSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaGFzLWFuc2kiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLWFuc2kvLS9oYXMtYW5zaS0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU5QVUVuT0hzM3lzR1NhOCs4azVGN1RWQmJaRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhbnNpLXJlZ2V4IjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJoYXMtZmxhZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtZmxhZy8tL2hhcy1mbGFnLTMuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdGRSVTNDR1pyaUpXbWZOR2Zsb0g4N2xWdXYwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImhhcy12YWx1ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtdmFsdWUvLS9oYXMtdmFsdWUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HTEtCMmxoYkhGeFIzdkpNa3c3U21ndm1zWGM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2V0LXZhbHVlIjogIl4yLjAuNiIsCisgICAgICAgICJoYXMtdmFsdWVzIjogIl4xLjAuMCIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaGFzLXZhbHVlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtdmFsdWVzLy0vaGFzLXZhbHVlcy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWxiQzJQK3doUm1HYWIrVi81MVlvMWFPZS9rOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1udW1iZXIiOiAiXjMuMC4wIiwKKyAgICAgICAgImtpbmQtb2YiOiAiXjQuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjQuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtNC4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSUlFOTg5Y1Nrb3NnYzNocEdrVUdiNjV5M1ZjPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWJ1ZmZlciI6ICJeMS4xLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiaGFzaGEiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzaGEvLS9oYXNoYS0yLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWVOZkwvQjV0WmpBLzU1ZzNObG1FVVhzdmJ1RT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtc3RyZWFtIjogIl4xLjAuMSIsCisgICAgICAgICJwaW5raWUtcHJvbWlzZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaG9tZWRpci1wb2x5ZmlsbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ob21lZGlyLXBvbHlmaWxsLy0vaG9tZWRpci1wb2x5ZmlsbC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVRDdThpbldKbVA3cjllMW9XQTkyMUdkb3RMdz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwYXJzZS1wYXNzd2QiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImhvb2tlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ob29rZXIvLS9ob29rZXItMC4yLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS11RFQzSTh4S0pDcW1XV05GbmZiWmhNWFQyVms9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaG9zdGVkLWdpdC1pbmZvIjogeworICAgICAgInZlcnNpb24iOiAiMi43LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hvc3RlZC1naXQtaW5mby8tL2hvc3RlZC1naXQtaW5mby0yLjcuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItN1QvQnhIMTl6YmNDVGE4WGtNbGJLNWxUbzFXdGdrRmkzR3ZkV0V5TnVjNFZleDcvOURxYm5wc2Y0Sk15ZGNmajlIQ2c0elVXRlRMM1phNmxhcGc1L3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImh0bWxwYXJzZXIyIjogeworICAgICAgInZlcnNpb24iOiAiMy44LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2h0bWxwYXJzZXIyLy0vaHRtbHBhcnNlcjItMy44LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tV3dvc1pGUmFvdm9aUUduMTVkWDVjY01FR2c9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZG9tZWxlbWVudHR5cGUiOiAiMSIsCisgICAgICAgICJkb21oYW5kbGVyIjogIjIuMyIsCisgICAgICAgICJkb211dGlscyI6ICIxLjUiLAorICAgICAgICAiZW50aXRpZXMiOiAiMS4wIiwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6ICIxLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaHR0cC1zaWduYXR1cmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaHR0cC1zaWduYXR1cmUvLS9odHRwLXNpZ25hdHVyZS0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW11elpKUkZIY3ZQWlcyV21DcnVQZkJqN3JPRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNzZXJ0LXBsdXMiOiAiXjEuMC4wIiwKKyAgICAgICAgImpzcHJpbSI6ICJeMS4yLjIiLAorICAgICAgICAic3NocGsiOiAiXjEuNy4wIgorICAgICAgfQorICAgIH0sCisgICAgImh0dHBzLXByb3h5LWFnZW50IjogeworICAgICAgInZlcnNpb24iOiAiMi4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2h0dHBzLXByb3h5LWFnZW50Ly0vaHR0cHMtcHJveHktYWdlbnQtMi4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUhQQ1RTMUxXNTFiY3lNWWJ4VUlPTzRIRU9sUTEvMXFSYUZXY3l4dndhcVVTOVRZODhhb0V1SFVZMzNrdUFoMVloVlZhRFFoTFpzblBkK1hOQVJXWmxRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhZ2VudC1iYXNlIjogIl40LjEuMCIsCisgICAgICAgICJkZWJ1ZyI6ICJeMy4xLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlYnVnIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi42IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVidWcvLS9kZWJ1Zy0zLjIuNi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1lbCtqZjducnRFbDVQbjFReDQ2ekFSWEtEcEJidnplenNlN3A3THFJTm1kb0lrOFBZUDVTeVNheEVtWXY2VFowSnlFS0ExaHNDSWQ2REloZ0lUdFdRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJtcyI6ICJeMi4xLjEiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAibXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tcy8tL21zLTIuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdGdwK2RsNWNHazI4dXRZa3RCc3JGcUE3SEtncmhnUHNnNlovRWZoV0k0Z2wxSHdxOEIvR21ZLzBvWFo2bkY4aERWZXNTL0ZwbllhRC9rT1doWVF2eWc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImljb252LWxpdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ljb252LWxpdGUvLS9pY29udi1saXRlLTAuNC4yNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItdjNNWG5aQWN2bnl3a1RVRVpvbUlBY3RsZTdSWFhlZWRPUjMxd3dsN1ZseW9YTzRRaTlhcnZTZW5OUVduZTFUY1J3aENMMUh3TEkyMWJFcWRwajgvckE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNhZmVyLWJ1ZmZlciI6ICI+PSAyLjEuMiA8IDMiCisgICAgICB9CisgICAgfSwKKyAgICAiaW5kZW50LXN0cmluZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbmRlbnQtc3RyaW5nLy0vaW5kZW50LXN0cmluZy0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWppMUlOSWRDRWh0S2doaTNvVGZwcFNCSjNJQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJyZXBlYXRpbmciOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImluZmxpZ2h0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2luZmxpZ2h0Ly0vaW5mbGlnaHQtMS4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1TYjFqTWRmUUxRd0p2SkVLRUhXNmdXVzFiZms9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib25jZSI6ICJeMS4zLjAiLAorICAgICAgICAid3JhcHB5IjogIjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaW5oZXJpdHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5oZXJpdHMvLS9pbmhlcml0cy0yLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVl6d3NnK1BhUXFVQzlTUm1BaVNBOUNDQ1lkND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpbmkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5pLy0vaW5pLTEuMy41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SWlk1aHVJS0NNUldEVXFabEVpNzJmL2xtWEtNdnVzemNNQmR1bGlRM25uV2J4OVgvWkJRTzdEaWpNRVlTOUVoSEJiMnFhY1JVTXRDN3N2THdlMGxjdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaW50ZXJwcmV0IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ludGVycHJldC8tL2ludGVycHJldC0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZ0R3hRUXhxRGc5NHo1WFR1RVFNWS9lTGhoUT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1hYnNvbHV0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1hYnNvbHV0ZS8tL2lzLWFic29sdXRlLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1kT1dvcWZsdmN5ZEFSYTM2MEd2djE4RFovZ1J1SEtpMk5VL3dVNVgxWkZ6ZFlmSDI5bmtpTlpzRjNtcDRPSjNINHlvOU14OEEvdUFHTnpwelBOM3lCQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtcmVsYXRpdmUiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzLXdpbmRvd3MiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtYWNjZXNzb3ItZGVzY3JpcHRvci8tL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3ItMC4xLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xZUVzczY2TmgyY243dTg0US9pZ2lYdGNtTlk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeMy4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1hcnJheWlzaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1hcnJheWlzaC8tL2lzLWFycmF5aXNoLTAuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZDhtWVFGSjZxT3l4cUxwcGU0QmtXbnFTYXAwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLWJ1ZmZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1idWZmZXIvLS9pcy1idWZmZXItMS4xLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU5jZEFMd3BYa1RtNVp2dmJrN293T1VTdlZ2QktEZ0tQNS9ld2ZYRXpubVFGZnM0WlJtYW5PZUtCVGpSVmprYTNRRm9ONlhKKzlGM1VTcWZIcVRhVTV3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1idWlsdGluLW1vZHVsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWJ1aWx0aW4tbW9kdWxlLy0vaXMtYnVpbHRpbi1tb2R1bGUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1WQVZ5MDA5Nnd4R2ZqM2JEREx3YkhnTjYvNzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYnVpbHRpbi1tb2R1bGVzIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGF0YS1kZXNjcmlwdG9yLy0vaXMtZGF0YS1kZXNjcmlwdG9yLTAuMS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQzE3bVNEaU9MSVlDZ3VlVDhZVnY3RDh3RzFZPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiAiXjMuMC4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtMy4yLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTWVvaHB6UzZ1YnV3OHlSbTJKT3VwUjVLUEdRPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWJ1ZmZlciI6ICJeMS4xLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiaXMtZGVzY3JpcHRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kZXNjcmlwdG9yLy0vaXMtZGVzY3JpcHRvci0wLjEuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYXZEWXIwU0IzRHdPOXpzTW92MGdLQ0VTRllxQ25FNGhxLzR6M1RkVWx1a0V5NXQ5QzBZUnE3SExyc041Mk5BY3FYS2FlcGVDRDBuK0IwYXJuVkczSGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiAiXjAuMS42IiwKKyAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6ICJeMC4xLjQiLAorICAgICAgICAia2luZC1vZiI6ICJeNS4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiNS4xLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi01LjEuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU5HRUVybkg2RjJ2VXVYRGgrT2xiY0tXNy93T2NmZFJIYVo3Vld0cUN6dGZIcmkvKytZS21QNTFPZFdlR1B1cUNPYmE2a2syT1RlNWQwMlZtVEI4MFB3PT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1leHRlbmRhYmxlIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWV4dGVuZGFibGUvLS9pcy1leHRlbmRhYmxlLTAuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWXJFUTRvbWtjVUdPUHNOcVlYMUhMakFkL0lrPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLWV4dGdsb2IiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZXh0Z2xvYi8tL2lzLWV4dGdsb2ItMi4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xSXdDVTFlUjhDN1RmSGFodWVxWGM4Z3orTUk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtZmluaXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWZpbml0ZS8tL2lzLWZpbml0ZS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXpHWjNhVllDdmxVTzhSNkxTcVl3VTBLMjBLbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJudW1iZXItaXMtbmFuIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1nbG9iIjogeworICAgICAgInZlcnNpb24iOiAiMy4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWdsb2IvLS9pcy1nbG9iLTMuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZTZXdUpDRjRCS3h3Y0h1V2tpVm5TR3pENkVvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWV4dGdsb2IiOiAiXjIuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgImlzLW51bWJlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1udW1iZXIvLS9pcy1udW1iZXItMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1KUDFpQWFSNExQVUZZY2dRSjJyOGZSTFhFWlU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeMy4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1wbGFpbi1vYmplY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtcGxhaW4tb2JqZWN0Ly0vaXMtcGxhaW4tb2JqZWN0LTIuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1oNVBwZ1hrV2l0YzM4QkJNWWF3VFlNV0pIRlpKVm5CcXVGRTU3eEZwakI4cEpGaUY2Z1orYlUrV3lJL3lxWGlGUjVtZExzZ1lOYVBlOHVhbzZVdjlPZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImlzLXJlbGF0aXZlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXJlbGF0aXZlLy0vaXMtcmVsYXRpdmUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUt3L1JlSzBpcXdLZXUwTUlUTEZ1ajBqYlBBbUVpT3NJd3lJWHZ2YmZhNlFmbU45cGtEMU0rOHBkazdSbC9kVEtiSDM0L1hCRk1iZ0Q0aU1KaExRYkdBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy11bmMtcGF0aCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXN0cmVhbS8tL2lzLXN0cmVhbS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUV0U2ozVTVvNExlYzY0MjhoQmM2NkEyUnlrUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtdHlwZWRhcnJheSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy10eXBlZGFycmF5Ly0vaXMtdHlwZWRhcnJheS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTVIbklDRmpmREJzUjNkcHBRUGxnRWZ6YVNwbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtdW5jLXBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtdW5jLXBhdGgvLS9pcy11bmMtcGF0aC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbXJHcFZkMGZzN1dXTGZWc1N0dmdGNmlFSm5iakRGWmg5L2VtaFJEY0dXVGR1VGZOSGQ5Q0hlVXdIM2dZSWpkYndvNE9uNmh1bmt6dHdPYUF3MHlsbFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuYy1wYXRoLXJlZ2V4IjogIl4wLjEuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy11dGY4IjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXV0ZjgvLS9pcy11dGY4LTAuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtU3cyaFJDRUUwYk0yTkE2QWVYNkdYUE9mZlhJPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLXdpbmRvd3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtd2luZG93cy8tL2lzLXdpbmRvd3MtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVYSzFVSW5xMmJQbWp5WDZlM1ZISXpNTG9iYzRKOTRpNEFXbitIcHEzT1U1S2tyUkM5Nk9BY1IzUFJKL3BHdTZtOFRSbkJIUDlka1hRVnNUL0NPVklBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpc2FycmF5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzYXJyYXkvLS9pc2FycmF5LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdTVOZFNGZ3N1aGFNQm9OSlY2VktQZ2NTVHhFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzZXhlIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzZXhlLy0vaXNleGUtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS02UHZ6ZE54VmIvaVVlaERjc0ZjdFl6OHMraEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXNvYmplY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNvYmplY3QvLS9pc29iamVjdC0zLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVRrTWVrckVhbHpGamFxSDV5TkhNdlAycmVOOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpc3N0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pc3N0cmVhbS8tL2lzc3RyZWFtLTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUitZL2V2VmErbStTNFZBT2FRNjR1RktjQ1pvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImpzLXlhbWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjUuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanMteWFtbC8tL2pzLXlhbWwtMy41LjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1BM2ZEZ0JmS3ZITWlzTkg3elNXa2tXUWZMNzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJncGFyc2UiOiAiXjEuMC4yIiwKKyAgICAgICAgImVzcHJpbWEiOiAiXjIuNi4wIgorICAgICAgfQorICAgIH0sCisgICAgImpzMnhtbHBhcnNlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qczJ4bWxwYXJzZXIvLS9qczJ4bWxwYXJzZXItMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QN1lPcWdpY1ZFRDVNWjlSZGd6TkIrSkpsek09IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInhtbGNyZWF0ZSI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAianNibiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc2JuLy0vanNibi0wLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXBlWlV3dVdpM3JYeUFkbHM3N3lvREE3eTlSTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJqc2RvYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNS41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc2RvYy8tL2pzZG9jLTMuNS41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi02UHhCNjVUQVU0V08wV3p5ci80L1lobEdvdlhsMEVWWWZwS2JwU3JvU2owcUJ4VDQveG9kL2w0ME9wa20zOGRSSFJkUWdkZVk4MzZNMHVWbkpRRzdrZz09IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJhYnlsb24iOiAiNy4wLjAtYmV0YS4xOSIsCisgICAgICAgICJibHVlYmlyZCI6ICJ+My41LjAiLAorICAgICAgICAiY2F0aGFyc2lzIjogIn4wLjguOSIsCisgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJ+MS4wLjUiLAorICAgICAgICAianMyeG1scGFyc2VyIjogIn4zLjAuMCIsCisgICAgICAgICJrbGF3IjogIn4yLjAuMCIsCisgICAgICAgICJtYXJrZWQiOiAifjAuMy42IiwKKyAgICAgICAgIm1rZGlycCI6ICJ+MC41LjEiLAorICAgICAgICAicmVxdWl6emxlIjogIn4wLjIuMSIsCisgICAgICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogIn4yLjAuMSIsCisgICAgICAgICJ0YWZmeWRiIjogIjIuNi4yIiwKKyAgICAgICAgInVuZGVyc2NvcmUiOiAifjEuOC4zIgorICAgICAgfQorICAgIH0sCisgICAgImpzaGludCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuOS42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc2hpbnQvLS9qc2hpbnQtMi45LjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUtPOVNJQUtUbEpRT000bEU2NEdRVXRHQlJwVE91dmJyUnJTWnczQWhVeE1ORzI2Nm5YOWhLMmNLQTRTQmhYT2owaXJKR3lOeUdTTFQ2MkhHT1ZERU9BPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjbGkiOiAifjEuMC4wIiwKKyAgICAgICAgImNvbnNvbGUtYnJvd3NlcmlmeSI6ICIxLjEueCIsCisgICAgICAgICJleGl0IjogIjAuMS54IiwKKyAgICAgICAgImh0bWxwYXJzZXIyIjogIjMuOC54IiwKKyAgICAgICAgImxvZGFzaCI6ICJ+NC4xNy4xMCIsCisgICAgICAgICJtaW5pbWF0Y2giOiAifjMuMC4yIiwKKyAgICAgICAgInBoYW50b20iOiAifjQuMC4xIiwKKyAgICAgICAgInBoYW50b21qcy1wcmVidWlsdCI6ICJ+Mi4xLjciLAorICAgICAgICAic2hlbGxqcyI6ICIwLjMueCIsCisgICAgICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogIjEuMC54IiwKKyAgICAgICAgInVuaWNvZGUtNS4yLjAiOiAiXjAuNy41IgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC40IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaXAtanNvbi1jb21tZW50cy8tL3N0cmlwLWpzb24tY29tbWVudHMtMS4wLjQudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSGhYN3lzbDlQdW1iOHRjN1RHVnJDQ3U2KzVFPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImpzbGludCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMTIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNsaW50Ly0vanNsaW50LTAuMTIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUm9Dc3lJQ2NLQSs2VEZzYnlzOURwS1RmUFZhQzcxTW01UVNqdnJXQTBsRFZOK0xJdng2YXBhNDJGRmlzTXFtQ1R2SjhEeGtjb1FHSjBqN20za1RWb3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImV4aXQiOiAifjAuMS4yIiwKKyAgICAgICAgImdsb2IiOiAifjcuMS4yIiwKKyAgICAgICAgIm5vcHQiOiAifjMuMC4xIiwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6ICJ+Mi4xLjUiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImdsb2IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiNy4xLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iLy0vZ2xvYi03LjEuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXZjZnVpSXhvZ0xWNERsR0JISVVPd0kwSWJySjhIV1BjNE1VN0h6dmlHZU5oby9VSkRmaTZCNXAzc0hlV0lRMEtHSVUwSnB4aTVaSHhlbVFmTGtrQXdRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJmcy5yZWFscGF0aCI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImluZmxpZ2h0IjogIl4xLjAuNCIsCisgICAgICAgICAgICAiaW5oZXJpdHMiOiAiMiIsCisgICAgICAgICAgICAibWluaW1hdGNoIjogIl4zLjAuNCIsCisgICAgICAgICAgICAib25jZSI6ICJeMS4zLjAiLAorICAgICAgICAgICAgInBhdGgtaXMtYWJzb2x1dGUiOiAiXjEuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgIm5vcHQiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4wLjYiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ub3B0Ly0vbm9wdC0zLjAuNi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS14a1pkdndpcnpVMnpXVEYvZWF4b3BrYXlqL2s9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYWJicmV2IjogIjEiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjciLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wcm9jZXNzLW5leHRpY2stYXJncy8tL3Byb2Nlc3MtbmV4dGljay1hcmdzLTEuMC43LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLUZRNGd0MVpaQ3RQNUVKUHlXazhxMkwvekM2TT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJyZWFkYWJsZS1zdHJlYW0iOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4xLjUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWRhYmxlLXN0cmVhbS8tL3JlYWRhYmxlLXN0cmVhbS0yLjEuNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1adnFMY2c0VU9MTmthQjhxMGFZOFlZUkl5ZEE9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYnVmZmVyLXNoaW1zIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiY29yZS11dGlsLWlzIjogIn4xLjAuMCIsCisgICAgICAgICAgICAiaW5oZXJpdHMiOiAifjIuMC4xIiwKKyAgICAgICAgICAgICJpc2FycmF5IjogIn4xLjAuMCIsCisgICAgICAgICAgICAicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOiAifjEuMC42IiwKKyAgICAgICAgICAgICJzdHJpbmdfZGVjb2RlciI6ICJ+MC4xMC54IiwKKyAgICAgICAgICAgICJ1dGlsLWRlcHJlY2F0ZSI6ICJ+MS4wLjEiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAianNvbi1zY2hlbWEiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNvbi1zY2hlbWEvLS9qc29uLXNjaGVtYS0wLjIuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRJRElrdVdhTHdXVlRPY252VDhxVG9ndm5oTT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAianNvbi1zY2hlbWEtdHJhdmVyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNvbi1zY2hlbWEtdHJhdmVyc2UvLS9qc29uLXNjaGVtYS10cmF2ZXJzZS0wLjMuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU5KcHRSTVU2VWQ2SnRBZ0Z4ZFhsbTBGOU0wQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAianNvbi1zdHJpbmdpZnktc2FmZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uLXN0cmluZ2lmeS1zYWZlLy0vanNvbi1zdHJpbmdpZnktc2FmZS01LjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUVwYWkxWS9VWHhtZzlzNEIxbGNCNHNjMXR1cz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAianNvbmZpbGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uZmlsZS8tL2pzb25maWxlLTIuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTnphaXRDaTRlNzJneklPMVA2UFdNNk5jS3VnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjYiCisgICAgICB9CisgICAgfSwKKyAgICAianNwcmltIjogeworICAgICAgInZlcnNpb24iOiAiMS40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzcHJpbS8tL2pzcHJpbS0xLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU1UNW12QjVjd0c1RGk4RzNTWnd1WEZhc3RxST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNzZXJ0LXBsdXMiOiAiMS4wLjAiLAorICAgICAgICAiZXh0c3ByaW50ZiI6ICIxLjMuMCIsCisgICAgICAgICJqc29uLXNjaGVtYSI6ICIwLjIuMyIsCisgICAgICAgICJ2ZXJyb3IiOiAiMS4xMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImtldyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9rZXcvLS9rZXctMC43LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lZGs5TFRNMlBXL2RLWEN6TmRrVUd0V1IxNXM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImtpbmQtb2YiOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtNi4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXM1a0xPY25IMFhxRE8rRnZ1YUxYOEREaloxOENHRms3VnlnSDQwUW9LUFVRaFc0ZTJydk0wcndVcTB0OElRRE93WVNlTEswMVU5ME9qekJUbWUyUXFBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJrbGF3IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tsYXcvLS9rbGF3LTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV2NFbzROeGM1QkFnRVZFWlR1dWN2NFdHVVBZPSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjkiCisgICAgICB9CisgICAgfSwKKyAgICAibGF6eS1jYWNoZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sYXp5LWNhY2hlLy0vbGF6eS1jYWNoZS0xLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW9kZVB3NlVFZE11QWhGMDdPMjRkcEpwRWJvND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJsaWZ0b2ZmIjogeworICAgICAgInZlcnNpb24iOiAiMi41LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xpZnRvZmYvLS9saWZ0b2ZmLTIuNS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSUFrcEc3TWM2b1lidnhDbndWb295dmRjTWV3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImV4dGVuZCI6ICJeMy4wLjAiLAorICAgICAgICAiZmluZHVwLXN5bmMiOiAiXjIuMC4wIiwKKyAgICAgICAgImZpbmVkIjogIl4xLjAuMSIsCisgICAgICAgICJmbGFnZ2VkLXJlc3Bhd24iOiAiXjEuMC4wIiwKKyAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjQiLAorICAgICAgICAib2JqZWN0Lm1hcCI6ICJeMS4wLjAiLAorICAgICAgICAicmVjaG9pciI6ICJeMC42LjIiLAorICAgICAgICAicmVzb2x2ZSI6ICJeMS4xLjciCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImZpbmR1cC1zeW5jIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmluZHVwLXN5bmMvLS9maW5kdXAtc3luYy0yLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1reWF4U0l3aTBhWUlobENvYVFHeTJha0tMTHc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiZGV0ZWN0LWZpbGUiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJpcy1nbG9iIjogIl4zLjEuMCIsCisgICAgICAgICAgICAibWljcm9tYXRjaCI6ICJeMy4wLjQiLAorICAgICAgICAgICAgInJlc29sdmUtZGlyIjogIl4xLjAuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJsb2FkLWpzb24tZmlsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2xvYWQtanNvbi1maWxlLy0vbG9hZC1qc29uLWZpbGUtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sV2tGY0kxWXRMcTB3aVliQlBXZk1jbVRkTUE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ3JhY2VmdWwtZnMiOiAiXjQuMS4yIiwKKyAgICAgICAgInBhcnNlLWpzb24iOiAiXjIuMi4wIiwKKyAgICAgICAgInBpZnkiOiAiXjIuMC4wIiwKKyAgICAgICAgInBpbmtpZS1wcm9taXNlIjogIl4yLjAuMCIsCisgICAgICAgICJzdHJpcC1ib20iOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImxvZGFzaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMTcuMTEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xvZGFzaC8tL2xvZGFzaC00LjE3LjExLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jUUtoOGlnbzVRVWhaN2xnMzhEWVdBeE12alNBS0cwQTh3R1NWaW1QMDdTSVVFSzJVTythclNSS2JSWld0ZWxNdE41VjBIa3doNXJ5T3RvL1NzaFlJZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibG9uZ2VzdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sb25nZXN0Ly0vbG9uZ2VzdC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU1LQ3kyamozTjNEb0tVb05JdVppWHRkOUFKYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJsb3VkLXJlamVjdGlvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sb3VkLXJlamVjdGlvbi8tL2xvdWQtcmVqZWN0aW9uLTEuNi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVzBiNEFVZnQ3bGVJY1BDRzBFZ2h6NW1PVlI4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImN1cnJlbnRseS11bmhhbmRsZWQiOiAiXjAuNC4xIiwKKyAgICAgICAgInNpZ25hbC1leGl0IjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJtYWtlLWl0ZXJhdG9yIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21ha2UtaXRlcmF0b3IvLS9tYWtlLWl0ZXJhdG9yLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1weGl1WGgwaVZFcTdWTTdLTUloczVneHNmeEN1eDJVUnB0VVFhWG80aVpaSnhCQXpUUE9MRTJCdW1PNWRiZlZZcS9oQkpGQlIvYTFtRkRtT3g1QUdtdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeNi4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAibWFwLWNhY2hlIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21hcC1jYWNoZS8tL21hcC1jYWNoZS0wLjIuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXd5cTlDOVpTWFpzRkZrVzdUeWFzWGNtS0RiOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtYXAtb2JqIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21hcC1vYmovLS9tYXAtb2JqLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMlRQT3VTQmRncjNQU0liMmRDdmNLMDNxRkcwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm1hcC12aXNpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYXAtdmlzaXQvLS9tYXAtdmlzaXQtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03TnlvOFRGRTVtRHh0YjFCOFM4MGVkbU4rNDg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib2JqZWN0LXZpc2l0IjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJtYXJrZWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMTkiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWFya2VkLy0vbWFya2VkLTAuMy4xOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZWEyZUdXT3FOeFBjWHY4ZHlFUmRTci82Rm16dld3empNeHBmR0Ivc2JNY2NYb2N0K3hZK1l1a1BEK1FUVVp3eXZLN0Jad2NyNG0yMVdCT1c0MXBBa2c9PSIKKyAgICB9LAorICAgICJtYXhtaW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWF4bWluLy0vbWF4bWluLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtY1RaZWhLbWQyUGl6OTlYOTR2QU5Ibjl6dm1FPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNoYWxrIjogIl4xLjAuMCIsCisgICAgICAgICJmaWd1cmVzIjogIl4xLjAuMSIsCisgICAgICAgICJnemlwLXNpemUiOiAiXjEuMC4wIiwKKyAgICAgICAgInByZXR0eS1ieXRlcyI6ICJeMS4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImFuc2ktc3R5bGVzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMi4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1zdHlsZXMvLS9hbnNpLXN0eWxlcy0yLjIuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10RExkTTFpMk5NOTE0ZVJtUTJna0JUUEIzYjQ9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiY2hhbGsiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2NoYWxrLy0vY2hhbGstMS4xLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcUJGY1ZlU25BdjVORlFxOU9IS0NLbjRKL0pnPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImFuc2ktc3R5bGVzIjogIl4yLjIuMSIsCisgICAgICAgICAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiAiXjEuMC4yIiwKKyAgICAgICAgICAgICJoYXMtYW5zaSI6ICJeMi4wLjAiLAorICAgICAgICAgICAgInN0cmlwLWFuc2kiOiAiXjMuMC4wIiwKKyAgICAgICAgICAgICJzdXBwb3J0cy1jb2xvciI6ICJeMi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic3VwcG9ydHMtY29sb3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdXBwb3J0cy1jb2xvci8tL3N1cHBvcnRzLWNvbG9yLTIuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVUxMEVYT2EyTmora0FSY0lSaW1aWHAzekpNYz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJtZW93IjogeworICAgICAgInZlcnNpb24iOiAiMy43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWVvdy8tL21lb3ctMy43LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jc3RtaTBKU0tDa0t1L3FGYUpKWWN3aW9BZnM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2FtZWxjYXNlLWtleXMiOiAiXjIuMC4wIiwKKyAgICAgICAgImRlY2FtZWxpemUiOiAiXjEuMS4yIiwKKyAgICAgICAgImxvdWQtcmVqZWN0aW9uIjogIl4xLjAuMCIsCisgICAgICAgICJtYXAtb2JqIjogIl4xLjAuMSIsCisgICAgICAgICJtaW5pbWlzdCI6ICJeMS4xLjMiLAorICAgICAgICAibm9ybWFsaXplLXBhY2thZ2UtZGF0YSI6ICJeMi4zLjQiLAorICAgICAgICAib2JqZWN0LWFzc2lnbiI6ICJeNC4wLjEiLAorICAgICAgICAicmVhZC1wa2ctdXAiOiAiXjEuMC4xIiwKKyAgICAgICAgInJlZGVudCI6ICJeMS4wLjAiLAorICAgICAgICAidHJpbS1uZXdsaW5lcyI6ICJeMS4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgIm1pbmltaXN0IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWlzdC8tL21pbmltaXN0LTEuMi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLW8xQUlzZzlCT0Q3c0g3a1U5TTFkOTVvbVFvUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJtaWNyb21hdGNoIjogeworICAgICAgInZlcnNpb24iOiAiMy4xLjEwIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taWNyb21hdGNoLy0vbWljcm9tYXRjaC0zLjEuMTAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU1XaWtnbDluOU0zdyticHNZM0hlOEwrdzllRjkzMzh4Umw4SUFPNXZpRGl6d1N6emlGRXlVem8yeHJybG9CNjRBRGJUZjh1QTh2UnFxdHREVE9tY2NnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnItZGlmZiI6ICJeNC4wLjAiLAorICAgICAgICAiYXJyYXktdW5pcXVlIjogIl4wLjMuMiIsCisgICAgICAgICJicmFjZXMiOiAiXjIuMy4xIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMi4wLjIiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjMuMC4yIiwKKyAgICAgICAgImV4dGdsb2IiOiAiXjIuMC40IiwKKyAgICAgICAgImZyYWdtZW50LWNhY2hlIjogIl4wLjIuMSIsCisgICAgICAgICJraW5kLW9mIjogIl42LjAuMiIsCisgICAgICAgICJuYW5vbWF0Y2giOiAiXjEuMi45IiwKKyAgICAgICAgIm9iamVjdC5waWNrIjogIl4xLjMuMCIsCisgICAgICAgICJyZWdleC1ub3QiOiAiXjEuMC4wIiwKKyAgICAgICAgInNuYXBkcmFnb24iOiAiXjAuOC4xIiwKKyAgICAgICAgInRvLXJlZ2V4IjogIl4zLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJtaW1lIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pbWUvLS9taW1lLTIuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PRVVsbGNWb3lkQkhHTjF6ODR5ZlFEaW1uNThwWk5OTlhnWmxIWFNib3hNbEZ2Z0k2TVhTV3BXS3BGUnJhN0gxSHhwVmhIVGtyZ2hmUlc0OWs2eWplZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWltZS1kYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMzcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWltZS1kYi8tL21pbWUtZGItMS4zNy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SM0M0ZGI2YmdRaGxJaFBVNDhmVXRkVm1LbmZscStoUmRhZDdJeUtodEZqMDZWUE5WZGsyUmhpWUwzVWpRSWxzbzhMK1l4QXRGa29iVDBWSytTL3liZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWltZS10eXBlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4yMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWltZS10eXBlcy8tL21pbWUtdHlwZXMtMi4xLjIxLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0zaUw2RGJ3cHlMempSM3hIU0ZORmViOU56L004V0RrWDMzdDFHRlFuRk9sbFdrOHBPcmgvTFNyQjVPWGxubFc1UDlMSDczWDZsb1cvZW9nYytGNWxKZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWltZS1kYiI6ICJ+MS4zNy4wIgorICAgICAgfQorICAgIH0sCisgICAgIm1pbmltYXRjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWF0Y2gvLS9taW5pbWF0Y2gtMy4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXlKSFZRRWh5cVBMVVRndDlCODNQWHU2VzNyeDRNdnZIdlNVdlRvb2dwd29HRE9VUSt5RHJSMEhSb3QreU9DZENPN3U0aFgzcFdmdDZrV0JCY3FoMFVBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJicmFjZS1leHBhbnNpb24iOiAiXjEuMS43IgorICAgICAgfQorICAgIH0sCisgICAgIm1pbmltaXN0IjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1pc3QvLS9taW5pbWlzdC0wLjAuOC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWhYL0t2OE01ZlNZbHVDS0NZdWhxcDZBUnNGMD0iCisgICAgfSwKKyAgICAibWl4aW4tZGVlcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taXhpbi1kZWVwLy0vbWl4aW4tZGVlcC0xLjMuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItOFpJdExIZUVnYXFFdmQ1bFlCWGZtNEVaU0ZDWDI5SmI5SytsQUhoREt6UmVLQlFLajNSKzdOT0Y2dGpxWWk5dDRvSThWVWZhV0lUSlFtODZ3blhHTlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZvci1pbiI6ICJeMS4wLjIiLAorICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMS4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImlzLWV4dGVuZGFibGUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1leHRlbmRhYmxlLy0vaXMtZXh0ZW5kYWJsZS0xLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWFyblhNeFQxaGhvS285azFMWmRtbE55SmRERGZ5MnYwZlhqRmxtb2s0K2k4dWwvNldsYlZnZTliaE03NE9wTlBRUE1HVVRvRHR6K0tYYTFQbmVKeE9BPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1wbGFpbi1vYmplY3QiOiAiXjIuMC40IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIm1rZGlycCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21rZGlycC8tL21rZGlycC0wLjUuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU1BVjBPT3JHejMrTVIyZnpoa2pXYVgxMXlRTT0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWluaW1pc3QiOiAiMC4wLjgiCisgICAgICB9CisgICAgfSwKKyAgICAibXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbXMvLS9tcy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVZnaXVyZndBdm13cEFkOWZtR0Y0amVEVmw4Zz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJuYW5vbWF0Y2giOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMTMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25hbm9tYXRjaC8tL25hbm9tYXRjaC0xLjIuMTMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWZwb2UyVDBSYkh3QlRCVU9mdEFmQlBhREVpMDZ1ZmFVYWkwbUU2WW4xa2FjYzNTblRFcmZiL2grWDk0Vlh6STY0cktGSFlJbVhTdmR3R0dDbXdPcUNBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnItZGlmZiI6ICJeNC4wLjAiLAorICAgICAgICAiYXJyYXktdW5pcXVlIjogIl4wLjMuMiIsCisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjIuMC4yIiwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4zLjAuMiIsCisgICAgICAgICJmcmFnbWVudC1jYWNoZSI6ICJeMC4yLjEiLAorICAgICAgICAiaXMtd2luZG93cyI6ICJeMS4wLjIiLAorICAgICAgICAia2luZC1vZiI6ICJeNi4wLjIiLAorICAgICAgICAib2JqZWN0LnBpY2siOiAiXjEuMy4wIiwKKyAgICAgICAgInJlZ2V4LW5vdCI6ICJeMS4wLjAiLAorICAgICAgICAic25hcGRyYWdvbiI6ICJeMC44LjEiLAorICAgICAgICAidG8tcmVnZXgiOiAiXjMuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgIm5pY2UtdHJ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25pY2UtdHJ5Ly0vbmljZS10cnktMS4wLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTFuaDQ1ZGVlYjVvbE5ZN2VYODJCa1BPN1NTeFI1U1NZSmlQVHJUZEZVVll3QWw4Q0tNQTVOOVBqVFlrSGlSamlzVmN4Y1ExSFhkTGh4MnF4eEp6TE5RPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJub3B0IjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vcHQvLS9ub3B0LTQuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtME5Sb1d2MVVGUms4akhVRllDME5GODFrUjAwPSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhYmJyZXYiOiAiMSIsCisgICAgICAgICJvc2VudiI6ICJeMC4xLjQiCisgICAgICB9CisgICAgfSwKKyAgICAibm9ybWFsaXplLXBhY2thZ2UtZGF0YSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ub3JtYWxpemUtcGFja2FnZS1kYXRhLy0vbm9ybWFsaXplLXBhY2thZ2UtZGF0YS0yLjQuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItOWpqVUZiVFBmRXkzUi9hZC8yb05iS3RXOUhnb3ZsNU8xRnZGV0trS2JsTlhvTi9Pb3U2KzkrS0tvaFBLMTNZYzMvVHl1bnlXaEpwNmd2Uk5SL1BQQXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhvc3RlZC1naXQtaW5mbyI6ICJeMi4xLjQiLAorICAgICAgICAiaXMtYnVpbHRpbi1tb2R1bGUiOiAiXjEuMC4wIiwKKyAgICAgICAgInNlbXZlciI6ICIyIHx8IDMgfHwgNCB8fCA1IiwKKyAgICAgICAgInZhbGlkYXRlLW5wbS1wYWNrYWdlLWxpY2Vuc2UiOiAiXjMuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgIm51bWJlci1pcy1uYW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbnVtYmVyLWlzLW5hbi8tL251bWJlci1pcy1uYW4tMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1DWHRnSzFOQ0tsSXNHdnVIa0RHRE5wUWFBUjA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib2F1dGgtc2lnbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuOS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYXV0aC1zaWduLy0vb2F1dGgtc2lnbi0wLjkuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZmV4aFVGRlBUR1Y4eWJBdFNJR2JWNmdPa1N2OFV0UmJEQm5BeUxRdzRRUEtrZ05sc0gyQnlQR3RNVXFkV2tvczZZQ1JtQXFWaXdnWnJKYy9tUkR6WlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJvYmplY3QtYXNzaWduIjogeworICAgICAgInZlcnNpb24iOiAiNC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC1hc3NpZ24vLS9vYmplY3QtYXNzaWduLTQuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSVFtdHg1WlloOC9BWEx2VVFzckl2N3MyQ0dNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm9iamVjdC1jb3B5IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC1jb3B5Ly0vb2JqZWN0LWNvcHktMC4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1mbjJGaTNnYjE4bVJwQnVwZGUwNEVuVk9tWXc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29weS1kZXNjcmlwdG9yIjogIl4wLjEuMCIsCisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjAuMi41IiwKKyAgICAgICAgImtpbmQtb2YiOiAiXjMuMC4zIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMC4yLjUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzFzZStSanNQSmtQbWx2RmUrQktyT3hjZ1JZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJvYmplY3QtdmlzaXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LXZpc2l0Ly0vb2JqZWN0LXZpc2l0LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOTV4RWs2OE1VM2UxbitPZE9WNUJCQzNRUmJzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJvYmplY3QuZGVmYXVsdHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LmRlZmF1bHRzLy0vb2JqZWN0LmRlZmF1bHRzLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtT24rR2d6UzBCOTZnYmFGdGlOWE5LZVExL3M4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFycmF5LWVhY2giOiAiXjEuMC4xIiwKKyAgICAgICAgImFycmF5LXNsaWNlIjogIl4xLjAuMCIsCisgICAgICAgICJmb3Itb3duIjogIl4xLjAuMCIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAib2JqZWN0Lm1hcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QubWFwLy0vb2JqZWN0Lm1hcC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXo0UGxuY2o4d0sxZlFsRGg5NHM3Z2IyQUhUYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmb3Itb3duIjogIl4xLjAuMCIsCisgICAgICAgICJtYWtlLWl0ZXJhdG9yIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJvYmplY3QucGljayI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QucGljay8tL29iamVjdC5waWNrLTEuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaDZFS3hNRnBTOUxoeS9VMWthWmhRZnRkMTBjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJvbmNlIjogeworICAgICAgInZlcnNpb24iOiAiMS40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29uY2UvLS9vbmNlLTEuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV0RzYXAzV1dIVXNST3NGOW5GQzY3NTNYYTlFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIndyYXBweSI6ICIxIgorICAgICAgfQorICAgIH0sCisgICAgIm9zLWhvbWVkaXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb3MtaG9tZWRpci8tL29zLWhvbWVkaXItMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0vN3hKaUROdURvTTk0TUZveCs4VklTR3FmN009IgorICAgIH0sCisgICAgIm9zLXRtcGRpciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vcy10bXBkaXIvLS9vcy10bXBkaXItMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS11K1owQnNlYXFGeGMvc2RtL2xjMFZWMzZFblE9IgorICAgIH0sCisgICAgIm9zZW52IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29zZW52Ly0vb3NlbnYtMC4xLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTBDV2NDRUNkTVZjMlJ3M1U1dzlaanFYNmdhNnViazF4RFZLeHRCUVBLN3dpcy8wRjJyOVQ2azR5ZEdZaGVjbDdZVUJ4QlZ4aEw1b2lzUHNOeEFQZTJnPT0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib3MtaG9tZWRpciI6ICJeMS4wLjAiLAorICAgICAgICAib3MtdG1wZGlyIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJwLWVhY2gtc2VyaWVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3AtZWFjaC1zZXJpZXMvLS9wLWVhY2gtc2VyaWVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEta3c4OUV0MGZVT2REUkZlaUxOYndTc2F0ZjNFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInAtcmVkdWNlIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJwLXJlZHVjZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wLXJlZHVjZS8tL3AtcmVkdWNlLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtR01LdzNaTnFScENsS2ZnakgxaWcvYmFrZmZvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBha28iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGFrby8tL3Bha28tMC4yLjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04L2RTTDA3M2dqU05xQlliclo3UDFSdjRPblU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGFyc2UtZmlsZXBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGFyc2UtZmlsZXBhdGgvLS9wYXJzZS1maWxlcGF0aC0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXBqSVNmMU9xODlGWWR2V0hMei82eDJQV3lKRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1hYnNvbHV0ZSI6ICJeMS4wLjAiLAorICAgICAgICAibWFwLWNhY2hlIjogIl4wLjIuMCIsCisgICAgICAgICJwYXRoLXJvb3QiOiAiXjAuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgInBhcnNlLWpzb24iOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGFyc2UtanNvbi8tL3BhcnNlLWpzb24tMi4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05SUQwQkRUdmdIUWZoR2tKbjQzcUdQVmFUY2s9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXJyb3ItZXgiOiAiXjEuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgInBhcnNlLXBhc3N3ZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXJzZS1wYXNzd2QvLS9wYXJzZS1wYXNzd2QtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1iVnVUU2tWcGs3STlOL1FLT0MxdkZtYW81Y1k9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGFzY2FsY2FzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXNjYWxjYXNlLy0vcGFzY2FsY2FzZS0wLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXMyUGxYb0FHeW0vaUY0VFMyeUs5RmRlUmZ4UT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLWV4aXN0cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXRoLWV4aXN0cy8tL3BhdGgtZXhpc3RzLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRCt0c1pQRDhVWTJhZFUzVjc3WXNjQ0oySDBzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBpbmtpZS1wcm9taXNlIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJwYXRoLWlzLWFic29sdXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtaXMtYWJzb2x1dGUvLS9wYXRoLWlzLWFic29sdXRlLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRjB1U2FITlZOUCs4ZXM1cjlUcGFuaHRjWDE4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhdGgta2V5IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgta2V5Ly0vcGF0aC1rZXktMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1RUnl0dFhURm9VRFRwTEdSRFVEWURNbjBDMEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGF0aC1yb290IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtcm9vdC8tL3BhdGgtcm9vdC0wLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1rcG9GTXJCd00xek5ncVY4eUNEeU9wSFJiYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwYXRoLXJvb3QtcmVnZXgiOiAiXjAuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInBhdGgtcm9vdC1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXRoLXJvb3QtcmVnZXgvLS9wYXRoLXJvb3QtcmVnZXgtMC4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS12OHpjamZXeExjVXNpMFBzT05HTmNzQkxxVzA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGF0aC10eXBlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtdHlwZS8tL3BhdGgtdHlwZS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdjUlBmdVNSMm5CTnBCWGFXa0J3dWsrUDVFRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjIiLAorICAgICAgICAicGlmeSI6ICJeMi4wLjAiLAorICAgICAgICAicGlua2llLXByb21pc2UiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInBlbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGVuZC8tL3BlbmQtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lbGZyVlFwbmcva1JVekg4OUdZOVhJNEFlbEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGVyZm9ybWFuY2Utbm93IjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BlcmZvcm1hbmNlLW5vdy8tL3BlcmZvcm1hbmNlLW5vdy0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVl3bjA0T1g2a1Q3QnhwTUhyalpMU3pkOG5ucz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAicGhhbnRvbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4xMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGhhbnRvbS8tL3BoYW50b20tNC4wLjEyLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1UejgyWGh0UG13Q2sxRkZQbWVjeTd5UkdaRzJidHB6WTJLSTlmY29QVDd6VDlkZXQwQ2NNeWZCRlBwMVM4RHF6c25Rbm04WllFZmR5NTI4bXdWdGtzQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBoYW50b21qcy1wcmVidWlsdCI6ICJeMi4xLjE2IiwKKyAgICAgICAgInNwbGl0IjogIl4xLjAuMSIsCisgICAgICAgICJ3aW5zdG9uIjogIl4yLjQuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJwaGFudG9tanMtcHJlYnVpbHQiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMTYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BoYW50b21qcy1wcmVidWlsdC8tL3BoYW50b21qcy1wcmVidWlsdC0yLjEuMTYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03OUlTcEtPV2JUWkhhRTZvdW5pRlNiNHE3Kzg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzNi1wcm9taXNlIjogIl40LjAuMyIsCisgICAgICAgICJleHRyYWN0LXppcCI6ICJeMS42LjUiLAorICAgICAgICAiZnMtZXh0cmEiOiAiXjEuMC4wIiwKKyAgICAgICAgImhhc2hhIjogIl4yLjIuMCIsCisgICAgICAgICJrZXciOiAiXjAuNy4wIiwKKyAgICAgICAgInByb2dyZXNzIjogIl4xLjEuOCIsCisgICAgICAgICJyZXF1ZXN0IjogIl4yLjgxLjAiLAorICAgICAgICAicmVxdWVzdC1wcm9ncmVzcyI6ICJeMi4wLjEiLAorICAgICAgICAid2hpY2giOiAiXjEuMi4xMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJwaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BpZnkvLS9waWZ5LTIuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtN1JRYWFzQkRxRW5xV0lTWTU5eW9zVk13NlF3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBpbmtpZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9waW5raWUvLS9waW5raWUtMi4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jbFZyZ00rZzFJcVhUb0RuY2tqb0R0VDMrSEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGlua2llLXByb21pc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGlua2llLXByb21pc2UvLS9waW5raWUtcHJvbWlzZS0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlUWFczNmVqV01CcHJKc1hoM1lvZ2loRkQvbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwaW5raWUiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInBvc2l4LWNoYXJhY3Rlci1jbGFzc2VzIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Bvc2l4LWNoYXJhY3Rlci1jbGFzc2VzLy0vcG9zaXgtY2hhcmFjdGVyLWNsYXNzZXMtMC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1BZXJBL2p0YTl4b3FiQUwrcTdqQi92ZmdEcXM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHJldHR5LWJ5dGVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ByZXR0eS1ieXRlcy8tL3ByZXR0eS1ieXRlcy0xLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUNpTG9JUVlKclRWVUw0eU5YU0Zaci9CMUhJUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnZXQtc3RkaW4iOiAiXjQuMC4xIiwKKyAgICAgICAgIm1lb3ciOiAiXjMuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInByb2Nlc3MtbmV4dGljay1hcmdzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2Nlc3MtbmV4dGljay1hcmdzLy0vcHJvY2Vzcy1uZXh0aWNrLWFyZ3MtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU10RUMxVHFOMEVVNW5lcGhhSjRyQXRUaEh0Qzg2ZE5OOXFDdUVodHNodnBWQmtBVzVaTzdCQVNOOVJFbkY5ZW9YR2NSdWIrcEZ1S0VwT0hFK0hiRU13PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwcm9ncmVzcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS44IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2dyZXNzLy0vcHJvZ3Jlc3MtMS4xLjgudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS00bURIajJGaHpkbXc1V3pENEtoZDRYeDZWNzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInByb3h5LWZyb20tZW52IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb3h5LWZyb20tZW52Ly0vcHJveHktZnJvbS1lbnYtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NOFVEbVBjT3ArdVcwaDk3Z1hZd3BWZVJ4KzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHNsIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjI5IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wc2wvLS9wc2wtMS4xLjI5LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1BZVVtUTBvTE4wMmZsVkhYV2g5c1NKRjdtY2RGcTBwcGlkL0prRXJ1ZmMzaEdJVi9BTWE4Rm85VmdEby9jVDJqRmRPV29GdkhwOTBxcUJINTRXK2dqUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInB1bnljb2RlIjogeworICAgICAgInZlcnNpb24iOiAiMS40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3B1bnljb2RlLy0vcHVueWNvZGUtMS40LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13TldtT3ljWWdBclk0ZXNQcFNhY2hOMUJoRjQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInB1cHBldGVlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wdXBwZXRlZXIvLS9wdXBwZXRlZXItMS43LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWYrMUR4S0hQcWNlNkNYVUJ6MmVWTzJXY0FUZVZlUVNPUEc5R1lhR09iRVpEQ2lDRVV3Rytnb2dqTXNydm43aGUyd0hUcU5WYjVwNlJVcndtcjhYRkJBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWJ1ZyI6ICJeMy4xLjAiLAorICAgICAgICAiZXh0cmFjdC16aXAiOiAiXjEuNi42IiwKKyAgICAgICAgImh0dHBzLXByb3h5LWFnZW50IjogIl4yLjIuMSIsCisgICAgICAgICJtaW1lIjogIl4yLjAuMyIsCisgICAgICAgICJwcm9ncmVzcyI6ICJeMi4wLjAiLAorICAgICAgICAicHJveHktZnJvbS1lbnYiOiAiXjEuMC4wIiwKKyAgICAgICAgInJpbXJhZiI6ICJeMi42LjEiLAorICAgICAgICAid3MiOiAiXjUuMS4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWJ1ZyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuNiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlYnVnLy0vZGVidWctMy4yLjYudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tZWwramY3bnJ0RWw1UG4xUXg0NnpBUlhLRHBCYnZ6ZXpzZTdwN0xxSU5tZG9JazhQWVA1U3lTYXhFbVl2NlRaMEp5RUtBMWhzQ0lkNkRJaGdJVHRXUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAibXMiOiAiXjIuMS4xIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgIm1zIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbXMvLS9tcy0yLjEuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXRncCtkbDVjR2syOHV0WWt0QnNyRnFBN0hLZ3JoZ1BzZzZaL0VmaFdJNGdsMUh3cThCL0dtWS8wb1haNm5GOGhEVmVzUy9GcG5ZYUQva09XaFlRdnlnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJwcm9ncmVzcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2dyZXNzLy0vcHJvZ3Jlc3MtMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PRSthNnZ6cWF6YytLNkx4SnJYNVVQeUtGdkduTDVDWW1xMmpGR05JQldIcGM0UXlFNDkvWU91bWNycFFGSnBmZWptdlJ0Ykp6Z08xelBtTUNxbGJCZz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAicXMiOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcXMvLS9xcy02LjUuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTjVaQVg0L0x4Sm1GKzd3Tjc0cFVENnFBaDkvd252ZFFjanE5VFpqZXZ2WHpTVW83YmZtdzkxc2FxTWp6R1MyeHE5MS9vZE4yZFcvV09sN3FRSE5ER0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJyZWFkLXBrZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWFkLXBrZy8tL3JlYWQtcGtnLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOWYrcVhzMHB5ekhBUjB2S2ZYVnJhN0tlUHlnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImxvYWQtanNvbi1maWxlIjogIl4xLjAuMCIsCisgICAgICAgICJub3JtYWxpemUtcGFja2FnZS1kYXRhIjogIl4yLjMuMiIsCisgICAgICAgICJwYXRoLXR5cGUiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlYWQtcGtnLXVwIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWQtcGtnLXVwLy0vcmVhZC1wa2ctdXAtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1uV1BCTW5iQVpaR05WL0FDcFg5QW9iWkQrd0k9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZmluZC11cCI6ICJeMS4wLjAiLAorICAgICAgICAicmVhZC1wa2ciOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlYWRhYmxlLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWFkYWJsZS1zdHJlYW0vLS9yZWFkYWJsZS1zdHJlYW0tMS4xLjE0LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZlBURlR2Wkk0NEV3aE1ZMjNTQjU0V2JBZ2RrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvcmUtdXRpbC1pcyI6ICJ+MS4wLjAiLAorICAgICAgICAiaW5oZXJpdHMiOiAifjIuMC4xIiwKKyAgICAgICAgImlzYXJyYXkiOiAiMC4wLjEiLAorICAgICAgICAic3RyaW5nX2RlY29kZXIiOiAifjAuMTAueCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiaXNhcnJheSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzYXJyYXkvLS9pc2FycmF5LTAuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWloaXMvS21vOUJkK0NhdjhZRGlUbXdYUjd0OD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJyZWNob2lyIjogeworICAgICAgInZlcnNpb24iOiAiMC42LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlY2hvaXIvLS9yZWNob2lyLTAuNi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaFNCTFZOdW9MVmRDNG95V2RXNzBPdlVPTTRRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInJlc29sdmUiOiAiXjEuMS42IgorICAgICAgfQorICAgIH0sCisgICAgInJlZGVudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWRlbnQvLS9yZWRlbnQtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS16NUZxc2YxZkh4YmZzZ2dpM1c3SDl6RENyOTQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaW5kZW50LXN0cmluZyI6ICJeMi4xLjAiLAorICAgICAgICAic3RyaXAtaW5kZW50IjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZWdleC1ub3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVnZXgtbm90Ly0vcmVnZXgtbm90LTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1KNlNEalVnRHhRajVOdXNuT3RkRnhEd04vK0hXeWtSOEdFTHdjdEo3bWRxaGN5eTF4RWM0U1JGSFVYdnhUcDY2MVlhVktBamZSTFo5Y0NxUzZ0bjMyQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjMuMC4yIiwKKyAgICAgICAgInNhZmUtcmVnZXgiOiAiXjEuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlcGVhdC1lbGVtZW50IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcGVhdC1lbGVtZW50Ly0vcmVwZWF0LWVsZW1lbnQtMS4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWFoR3EwWm5WNW01WHRaTE1iK3ZQNzZrY0FNNW5rTHFrMGxwcUF1b2pTS0dnUXRuNGVSaTRaWkdtMm9sbzJ6S0ZIK3NNc1dhcU9DVzFkcUFuT3J1NzJnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyZXBlYXQtc3RyaW5nIjogeworICAgICAgInZlcnNpb24iOiAiMS42LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcGVhdC1zdHJpbmcvLS9yZXBlYXQtc3RyaW5nLTEuNi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtamNya2NPSElpcnd0WUEvL1NuZGlodHAxNWpjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInJlcGVhdGluZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXBlYXRpbmcvLS9yZXBlYXRpbmctMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VaFRGT3BKdE5WSndkU2Y3cTBGZHZBalFiZG89IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtZmluaXRlIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZXF1ZXN0IjogeworICAgICAgInZlcnNpb24iOiAiMi44OC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXF1ZXN0Ly0vcmVxdWVzdC0yLjg4LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU5BcUJTcmlqR0xaZE0wV1pOc0luTEpwa0pva0w3MlhZalVwbkIwaXdzUmd4aDdkQjZDT3JIblRCTndOMEUrbEhEQUp6dTdrTEFrRGVZMDh6Mi9BMGhnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXdzLXNpZ24yIjogIn4wLjcuMCIsCisgICAgICAgICJhd3M0IjogIl4xLjguMCIsCisgICAgICAgICJjYXNlbGVzcyI6ICJ+MC4xMi4wIiwKKyAgICAgICAgImNvbWJpbmVkLXN0cmVhbSI6ICJ+MS4wLjYiLAorICAgICAgICAiZXh0ZW5kIjogIn4zLjAuMiIsCisgICAgICAgICJmb3JldmVyLWFnZW50IjogIn4wLjYuMSIsCisgICAgICAgICJmb3JtLWRhdGEiOiAifjIuMy4yIiwKKyAgICAgICAgImhhci12YWxpZGF0b3IiOiAifjUuMS4wIiwKKyAgICAgICAgImh0dHAtc2lnbmF0dXJlIjogIn4xLjIuMCIsCisgICAgICAgICJpcy10eXBlZGFycmF5IjogIn4xLjAuMCIsCisgICAgICAgICJpc3N0cmVhbSI6ICJ+MC4xLjIiLAorICAgICAgICAianNvbi1zdHJpbmdpZnktc2FmZSI6ICJ+NS4wLjEiLAorICAgICAgICAibWltZS10eXBlcyI6ICJ+Mi4xLjE5IiwKKyAgICAgICAgIm9hdXRoLXNpZ24iOiAifjAuOS4wIiwKKyAgICAgICAgInBlcmZvcm1hbmNlLW5vdyI6ICJeMi4xLjAiLAorICAgICAgICAicXMiOiAifjYuNS4yIiwKKyAgICAgICAgInNhZmUtYnVmZmVyIjogIl41LjEuMiIsCisgICAgICAgICJ0b3VnaC1jb29raWUiOiAifjIuNC4zIiwKKyAgICAgICAgInR1bm5lbC1hZ2VudCI6ICJeMC42LjAiLAorICAgICAgICAidXVpZCI6ICJeMy4zLjIiCisgICAgICB9CisgICAgfSwKKyAgICAicmVxdWVzdC1wcm9ncmVzcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXF1ZXN0LXByb2dyZXNzLy0vcmVxdWVzdC1wcm9ncmVzcy0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVhUYTdWNVljWnpxbHQ0amJ5QlFmM3lPMFRnZz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidGhyb3R0bGVpdCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVxdWl6emxlIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcXVpenpsZS8tL3JlcXVpenpsZS0wLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWFVUERVd3hObW41RzhjM2RVY0ZZL0djTTI5ND0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidW5kZXJzY29yZSI6ICJ+MS42LjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS42LjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLy0vdW5kZXJzY29yZS0xLjYuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1peml4REt6ZTlqTTN1TEpPVC9odFJhNmxLYWc9IgorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAicmVzb2x2ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXNvbHZlLy0vcmVzb2x2ZS0xLjEuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlERVUyQ3JTeGUyZWpnUVJzNU1vZGVpSjZYcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyZXNvbHZlLWRpciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXNvbHZlLWRpci8tL3Jlc29sdmUtZGlyLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZWFRR1JNTml2b0x5YnYvbk9jbTdVNElFYjBNPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImV4cGFuZC10aWxkZSI6ICJeMi4wLjAiLAorICAgICAgICAiZ2xvYmFsLW1vZHVsZXMiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlc29sdmUtdXJsIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc29sdmUtdXJsLy0vcmVzb2x2ZS11cmwtMC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1MR04vNTN5Sk92MHFaai9pR3FrSUFHamlCU289IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicmV0IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjE1IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXQvLS9yZXQtMC4xLjE1LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1UVGxZcGErT0wrdk1NTkcyNHhTbFFHRUozQi9SekVmVWxMY3Q3YjVHL3l0YXYrd1BycGxDcFZNRnV3elhia2VjSnJiNklZbzFpRmIwUzl2Mzc3NTRtZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicmlnaHQtYWxpZ24iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmlnaHQtYWxpZ24vLS9yaWdodC1hbGlnbi0wLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVlUT2JjaS9tbzFGV2lTRU5KT0ZNbGhTR0UrOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhbGlnbi10ZXh0IjogIl4wLjEuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJyaW1yYWYiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmltcmFmLy0vcmltcmFmLTIuNi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1scmVld0xLL0JsZ2hteHRmSDM2WVlWZzFpOElBY2U0VEk3b2FvNzVJMWcyNDUrNkJjdHFUVlFpQlAzWVVKOUM2RFFPWEpta1lSOVg5ZkNMdENPSmM1dz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2xvYiI6ICJeNy4wLjUiCisgICAgICB9CisgICAgfSwKKyAgICAic2FmZS1idWZmZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2FmZS1idWZmZXIvLS9zYWZlLWJ1ZmZlci01LjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItR2QyVVpCSkRrWGxZN0diSnhmc0U4L252S2tVRVUxRzM4YzFzaU42UVA2YTlQVDlNbUhCOEducHNjU21NSlNvRjhMT0lydDh1ZC93UHRvanlzNEc2K2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNhZmUtcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2FmZS1yZWdleC8tL3NhZmUtcmVnZXgtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1RS05tbnpzSGZSNlVQVVJpbmhWOTFJQWp2eTQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicmV0IjogIn4wLjEuMTAiCisgICAgICB9CisgICAgfSwKKyAgICAic2FmZXItYnVmZmVyIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NhZmVyLWJ1ZmZlci8tL3NhZmVyLWJ1ZmZlci0yLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItWVpvM0s4MlNEN1JpeWkwRTFFUVBvakx6N2twZXBuU1FJOUl5UGJISGcxWFhYZXZiNWRKSTd0cHlOMkFEeEdjUWJIRzd2Y3lSSGswY2J3cWNRcmlVdGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNlbXZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zZW12ZXIvLS9zZW12ZXItNS42LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJTOVI2UjM1TllnUW4rK2ZrRFdhT21xR29qNEVrOWdHcytEUHhOVVpLdXdFMTgzeGpKcm9LdnlvMUl6VkZlWHZVcnZtQUx5NkZXRDV4cmRKVDI1Z01nPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzZXQtdmFsdWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2V0LXZhbHVlLy0vc2V0LXZhbHVlLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1odzB5eGs5R1QvSHI1eUpFWW5ITktZWGtJQThtVkpnZDlkaXRZWkNlMTZaY3pjYUVMWVljZnZhWGVzTkFDazJPOE8wblRpUFFjUWhHVVFqOEpMemVlZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjIuMC4xIiwKKyAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4xIiwKKyAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjMiLAorICAgICAgICAic3BsaXQtc3RyaW5nIjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJzaGViYW5nLWNvbW1hbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2hlYmFuZy1jb21tYW5kLy0vc2hlYmFuZy1jb21tYW5kLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUktyR1cybGJBem1KYU1PZk5qL3VYZXI5OGVvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNoZWJhbmctcmVnZXgiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInNoZWJhbmctcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2hlYmFuZy1yZWdleC8tL3NoZWJhbmctcmVnZXgtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0ya0wwbDBEQXRDMnl5cGNvVnh5eGtNbU8vcU09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2hlbGxqcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaGVsbGpzLy0vc2hlbGxqcy0wLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU5aYm1NSHA0RlVUMWtmTjlwaGcyRHpIYlY3RT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzaWduYWwtZXhpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaWduYWwtZXhpdC8tL3NpZ25hbC1leGl0LTMuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdGYzQWp4S0g2aEY0WW81QlhpVVRLM05rYkcwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNuYXBkcmFnb24iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjguMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc25hcGRyYWdvbi8tL3NuYXBkcmFnb24tMC44LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUZ0eU9uV04vd0NIVFZYT013dlN2MjZkK2tvNXZXbElERDZ6b1VKN0xXOHZoK1pCQzhRZGxqdmVSUCtjck5ydEJ3aW9FVVd5LzRkTXRiQmpBNGlvTmxnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJiYXNlIjogIl4wLjExLjEiLAorICAgICAgICAiZGVidWciOiAiXjIuMi4wIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMC4yLjUiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjIuMC4xIiwKKyAgICAgICAgIm1hcC1jYWNoZSI6ICJeMC4yLjIiLAorICAgICAgICAic291cmNlLW1hcCI6ICJeMC41LjYiLAorICAgICAgICAic291cmNlLW1hcC1yZXNvbHZlIjogIl4wLjUuMCIsCisgICAgICAgICJ1c2UiOiAiXjMuMS4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMC4yLjUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzFzZStSanNQSmtQbWx2RmUrQktyT3hjZ1JZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VYTk5WVVyWnFmWVE2aHV2dTVpZGF4eFdpUTg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAic25hcGRyYWdvbi1ub2RlIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NuYXBkcmFnb24tbm9kZS8tL3NuYXBkcmFnb24tbm9kZS0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTzI3bDR4YU1ZdC9SU1E1VFIzdnBXQ0FCNUtiL2N6SWNxVUZPTS9DNGZZY0xuYlpVYzFQa2pUQU1qb2YycEJXYVNUd09VZDZxVUhjRkdWR2o3YUl3bnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMS4wLjAiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4wIiwKKyAgICAgICAgInNuYXBkcmFnb24tdXRpbCI6ICJeMy4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1kcDY2cno5S1k2clRyNTZOTUV5YnZubS9zT1k9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3IvLS9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItbTVobkhUa2NWc1BmcXgzQUtseXR0SVBiN0orWHlrSHZKUDJCOWJaRGpsaExJb0VxNFhvSzY0Vmc3Ym9abFZXWUs2TFVZOTRkWVBFRTdMaDBaa1pLY1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRhdGEtZGVzY3JpcHRvci8tL2lzLWRhdGEtZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpiUlh5MUZtdEFvQ2pRa1ZtSVZZd3V1cURGVWJhT2VEam1lZDF0T0dQcnNNaHRKQTRyRDl0a2dBMEYxcUozZ1JGUlhjSFlWa2RlYVA1MFE1ckUvakxRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGVzY3JpcHRvci8tL2lzLWRlc2NyaXB0b3ItMS4wLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0yZWlzNVdxUUdWN3Blb29EeUxtTkVQVXJwczkrU1hYNWM5cEwzeEVCKzRlOUhuR3VEYTdtQjdrSHhIdzRDYnFTOWsxVDJoT0gzbWlMOG44V3RpWVZ0Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4yIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInNuYXBkcmFnb24tdXRpbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zbmFwZHJhZ29uLXV0aWwvLS9zbmFwZHJhZ29uLXV0aWwtMy4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1iS2tNZFFLc2pYNEJBTDRiUllUajIxZWRPZjhjTjdYSGRZVUpFZStabjk5aFZFWWNNdktQY3QxSXFOZTcrQVpQaXJuOEJDRE9RQkhRWmtucW1LbFpRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogIl4zLjIuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTMuMi4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLU1lb2hwelM2dWJ1dzh5Um0ySk91cFI1S1BHUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInNvdXJjZS1tYXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjUuNyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc291cmNlLW1hcC8tL3NvdXJjZS1tYXAtMC41LjcudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1pZ09kTFJBaDBpMGVvVXlBMk9wR2k2THZQOHc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic291cmNlLW1hcC1yZXNvbHZlIjogeworICAgICAgInZlcnNpb24iOiAiMC41LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NvdXJjZS1tYXAtcmVzb2x2ZS8tL3NvdXJjZS1tYXAtcmVzb2x2ZS0wLjUuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTWpxc3ZOd3l6MXMwazgxR296Lzl2UkJlOVNaZEIwOUJkdysvell5TyszQ3VQazZmb3VUYXhzY0hrZ3RFOGpLdmYwMWtWZmw4cmlIekVSUS9rZWZhU0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImF0b2IiOiAiXjIuMS4xIiwKKyAgICAgICAgImRlY29kZS11cmktY29tcG9uZW50IjogIl4wLjIuMCIsCisgICAgICAgICJyZXNvbHZlLXVybCI6ICJeMC4yLjEiLAorICAgICAgICAic291cmNlLW1hcC11cmwiOiAiXjAuNC4wIiwKKyAgICAgICAgInVyaXgiOiAiXjAuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInNvdXJjZS1tYXAtdXJsIjogeworICAgICAgInZlcnNpb24iOiAiMC40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NvdXJjZS1tYXAtdXJsLy0vc291cmNlLW1hcC11cmwtMC40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QcE5kZmQxell4dVhaWmxXMVZFbzZIdFFoS009IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3BkeC1jb3JyZWN0IjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwZHgtY29ycmVjdC8tL3NwZHgtY29ycmVjdC0zLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcTloZWR0enlYSHI1UzBBMXZFUG9LLzdsOE5wZmtGWVRxNmlDWStQbm8yWmJkWlI2V2V4WkZ0cWVWR2tHeFczVEVKTU45MTRaNTVFbkFHTW1lbmxJUVE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNwZHgtZXhwcmVzc2lvbi1wYXJzZSI6ICJeMy4wLjAiLAorICAgICAgICAic3BkeC1saWNlbnNlLWlkcyI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3BkeC1leGNlcHRpb25zIjogeworICAgICAgInZlcnNpb24iOiAiMi4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwZHgtZXhjZXB0aW9ucy8tL3NwZHgtZXhjZXB0aW9ucy0yLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMlhRQUNmRWxLaTlTbFZiMUNZYWRLRFh2b2FqUGdCVlBuL2dPUUxyVHZIZEVsYVZocjdaRWJxSmFSbkpMVk5lYUk0Y01FQWdWQ2VCTUtGNk1XUkRDUkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNwZHgtZXhwcmVzc2lvbi1wYXJzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcGR4LWV4cHJlc3Npb24tcGFyc2UvLS9zcGR4LWV4cHJlc3Npb24tcGFyc2UtMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVlnNkQzWHBSRDRra09tVHBkZ2JVaUVKRktnaEpIMDNmaUMxT1BsbDVoLzBzTzZuZWgyanFSRFZIT1E0by9MTWVhMHRnQ2tiTWdlYTVpcC9lK01rV3lnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzcGR4LWV4Y2VwdGlvbnMiOiAiXjIuMS4wIiwKKyAgICAgICAgInNwZHgtbGljZW5zZS1pZHMiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInNwZHgtbGljZW5zZS1pZHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3BkeC1saWNlbnNlLWlkcy8tL3NwZHgtbGljZW5zZS1pZHMtMy4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVRmT2ZQY1lHQkI1c0R1UG4zZGVCeXhQaG1mZWdBaHBEWUtTT1haUU44MU95cnJpZjhaQ29kT0x6SzNBZXNFTG5DeDAza2lraHlEd2gwcGZ2dlF2Rjh3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzcGxpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcGxpdC8tL3NwbGl0LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tVHlPb1Bicml2dFhud25JeFpSRllSclBOdEVGS2xwQjJmdmpTbkNRVWlBQTZxQVp6cXduYTVlbnZLNHVrNk9JZVAxN0NzZEYzclNCR1lWQnNVMFRrZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInRocm91Z2giOiAiMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJzcGxpdC1zdHJpbmciOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3BsaXQtc3RyaW5nLy0vc3BsaXQtc3RyaW5nLTMuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1Oek5WaEpEWXB3Y2VWVmlpOC9IdTZES2ZEMkcrTnJRSGxTL1YvcWd2NzYzRVl1ZFZ3RWNNUU54ZDJsaCswVnJVQnlYTi9vSmtsNWdyT2hZV3ZRVVlpdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInNwcmludGYtanMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3ByaW50Zi1qcy8tL3NwcmludGYtanMtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1OcjU0TWdyK1dBSDJ6cVB1ZUxibHFybEE2Z3c9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3NocGsiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjE1LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NzaHBrLy0vc3NocGstMS4xNS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tU2RnTlVhaWRrK2RSVTVNaFl0Tjl6ZWJkekYyaUcwY05QV3k4SEcrVzh5K2ZUMUpuU2toMGZ6enBqT2EwTDdQOGkxUnNjejM4dDBoNGdQY0t6NDN4QT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzbjEiOiAifjAuMi4zIiwKKyAgICAgICAgImFzc2VydC1wbHVzIjogIl4xLjAuMCIsCisgICAgICAgICJiY3J5cHQtcGJrZGYiOiAiXjEuMC4wIiwKKyAgICAgICAgImRhc2hkYXNoIjogIl4xLjEyLjAiLAorICAgICAgICAiZWNjLWpzYm4iOiAifjAuMS4xIiwKKyAgICAgICAgImdldHBhc3MiOiAiXjAuMS4xIiwKKyAgICAgICAgImpzYm4iOiAifjAuMS4wIiwKKyAgICAgICAgInNhZmVyLWJ1ZmZlciI6ICJeMi4wLjIiLAorICAgICAgICAidHdlZXRuYWNsIjogIn4wLjE0LjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3RhY2stdHJhY2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuMTAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0YWNrLXRyYWNlLy0vc3RhY2stdHJhY2UtMC4wLjEwLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVkh4d3MwZm8weXRPRUk2aG9xRlo1ZjNlR2NBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJzdGF0aWMtZXh0ZW5kIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0YXRpYy1leHRlbmQvLS9zdGF0aWMtZXh0ZW5kLTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWUlDY09jdi9WVE55SnYxZUMxSVBOQjhmdGNZPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMC4yLjUiLAorICAgICAgICAib2JqZWN0LWNvcHkiOiAiXjAuMS4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMC4yLjUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzFzZStSanNQSmtQbWx2RmUrQktyT3hjZ1JZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInN0cmluZ19kZWNvZGVyIjogeworICAgICAgInZlcnNpb24iOiAiMC4xMC4zMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nX2RlY29kZXIvLS9zdHJpbmdfZGVjb2Rlci0wLjEwLjMxLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWXVJRHZFRjJiR3dveWZ5RU1CMnJIRk1RK3BRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInN0cmlwLWFuc2kiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpcC1hbnNpLy0vc3RyaXAtYW5zaS0zLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWFqaGZ1SVU5bFMxZjhGME9pcStVSjQzR1BjOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhbnNpLXJlZ2V4IjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJpcC1ib20iOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaXAtYm9tLy0vc3RyaXAtYm9tLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWWhtb1ZoWlNCSkh6VjRpOXZ4UkhxWngrYXc0PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLXV0ZjgiOiAiXjAuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmlwLWluZGVudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpcC1pbmRlbnQvLS9zdHJpcC1pbmRlbnQtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ESGxpcHEzdnA3dlVyRFprWUtZNFZTcmhvS0k9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2V0LXN0ZGluIjogIl40LjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWpzb24tY29tbWVudHMvLS9zdHJpcC1qc29uLWNvbW1lbnRzLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUEZNWlF1a0l3bWw4RHNORWhZd29iSHlncGdvPSIKKyAgICB9LAorICAgICJzdXBwb3J0cy1jb2xvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuNS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdXBwb3J0cy1jb2xvci8tL3N1cHBvcnRzLWNvbG9yLTUuNS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1RalZqd2RYSXQ0MDhNSWlBcUNYNG9VS3NnVTJFcUFHenMyUHBrbTRhUVliam0rWkVXRWNXNFNmRk5UcjR1TU5abWEwZXk0ZjVsZ0xya0IwYVgwUU1vdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaGFzLWZsYWciOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInN5bmMtZXhlYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zeW5jLWV4ZWMvLS9zeW5jLWV4ZWMtMC42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jWDBpekZQd3poM3ZWWlEyTHpxSm91dTVFUVU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidGFmZnlkYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90YWZmeWRiLy0vdGFmZnlkYi0yLjYuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZMeTJTMW9VRzJvdS9DeGRMR2UwNFZDeW9tZz0iCisgICAgfSwKKyAgICAidGhyb3R0bGVpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90aHJvdHRsZWl0Ly0vdGhyb3R0bGVpdC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW5uaFlOdHIwWjBNVVdsbUV0aWFOZ29Vb3JHdz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAidGhyb3VnaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy44IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3Rocm91Z2gvLS90aHJvdWdoLTIuMy44LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRGRUSi82cThOWGxnc2Jja0VWMStEb2FpNGZVPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJ0by1vYmplY3QtcGF0aCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90by1vYmplY3QtcGF0aC8tL3RvLW9iamVjdC1wYXRoLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtS1hXSXQ3RG40S3dJNEU1bkw0WEI5Sm1lRjY4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiAiXjMuMC4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtMy4yLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTWVvaHB6UzZ1YnV3OHlSbTJKT3VwUjVLUEdRPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWJ1ZmZlciI6ICJeMS4xLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidG8tcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdG8tcmVnZXgvLS90by1yZWdleC0zLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItRld0bGVOQXRaL0tpMnF0cWVqMkNYVE9heU9IOWJIRFFGK1E0OFZwV3lEWGpiWXhBNFl6OGlEQjMxelhPQlVsT0hIS2lkRGJxR1ZyVFV2UU1QbUJHQnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMi4wLjIiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjMuMC4yIiwKKyAgICAgICAgInJlZ2V4LW5vdCI6ICJeMS4wLjIiLAorICAgICAgICAic2FmZS1yZWdleCI6ICJeMS4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAidG8tcmVnZXgtcmFuZ2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdG8tcmVnZXgtcmFuZ2UvLS90by1yZWdleC1yYW5nZS0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZJREJlNTMrdmxtZUp6WitEVTNWV1FGQjJ6Zz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1udW1iZXIiOiAiXjMuMC4wIiwKKyAgICAgICAgInJlcGVhdC1zdHJpbmciOiAiXjEuNi4xIgorICAgICAgfQorICAgIH0sCisgICAgInRvdWdoLWNvb2tpZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90b3VnaC1jb29raWUvLS90b3VnaC1jb29raWUtMi40LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVE1c3JrLzR2RE01NFdKc0ppbzNYTm42SzJzQ0crQ1E4RzVXejZiWmhSWm9BZS8rVHhqV0IvR2xGQW5ZRWJrWVZsT045Rk1rL2ZFM2gyUkxwUFhvNGxRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicHNsIjogIl4xLjEuMjQiLAorICAgICAgICAicHVueWNvZGUiOiAiXjEuNC4xIgorICAgICAgfQorICAgIH0sCisgICAgInRyaW0tbmV3bGluZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHJpbS1uZXdsaW5lcy8tL3RyaW0tbmV3bGluZXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XSWVXYTdXQ3BGQTZRZXRTVDMwMUFSZ1ZwaE09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidHVubmVsLWFnZW50IjogeworICAgICAgInZlcnNpb24iOiAiMC42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3R1bm5lbC1hZ2VudC8tL3R1bm5lbC1hZ2VudC0wLjYuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUo2WGVvR3Myc0VvS21XWjNTeWtJYVBEOFFQMD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2FmZS1idWZmZXIiOiAiXjUuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInR3ZWV0bmFjbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMTQuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHdlZXRuYWNsLy0vdHdlZXRuYWNsLTAuMTQuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVd1YUJkL0dTMUVWaWFkRUlyNmsvK0hRL1QyUT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0eXBlZGFycmF5IjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3R5cGVkYXJyYXkvLS90eXBlZGFycmF5LTAuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaG5ySFRqaGtHSHNkUFVmWmxxZU94Y2lEQjNjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVnbGlmeS1qcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3VnbGlmeS1qcy8tL3VnbGlmeS1qcy0yLjYuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVplb3Zzd1djazVScEx4WCsySHdyTnNGcm10OD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luYyI6ICJ+MC4yLjYiLAorICAgICAgICAic291cmNlLW1hcCI6ICJ+MC41LjEiLAorICAgICAgICAidWdsaWZ5LXRvLWJyb3dzZXJpZnkiOiAifjEuMC4wIiwKKyAgICAgICAgInlhcmdzIjogIn4zLjEwLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImFzeW5jIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMi4xMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXN5bmMvLS9hc3luYy0wLjIuMTAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdHJ2Z3NHZExuWEdYQ01vNDNvd2pmTFVtdzlFPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInVnbGlmeS10by1icm93c2VyaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VnbGlmeS10by1icm93c2VyaWZ5Ly0vdWdsaWZ5LXRvLWJyb3dzZXJpZnktMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1iZ2trMXIybXRhL2pTZU9hYldNb1VLRDRncmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidW5jLXBhdGgtcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5jLXBhdGgtcmVnZXgvLS91bmMtcGF0aC1yZWdleC0wLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTV6M1QxN0RYeGUyRys2eHJDdWZZeHFhZFVQbz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1bmRlcnNjb3JlIjogeworICAgICAgInZlcnNpb24iOiAiMS44LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuZGVyc2NvcmUvLS91bmRlcnNjb3JlLTEuOC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVHorMU94QnVZSmY4K2N0QkNmS2w2YjM2VUNJPSIKKyAgICB9LAorICAgICJ1bmRlcnNjb3JlLWNvbnRyaWIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS1jb250cmliLy0vdW5kZXJzY29yZS1jb250cmliLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWmx0bXdrZUQrUG9yR01uNHk3RGl4OVNNSnNjPSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlIjogIjEuNi4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuNi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS8tL3VuZGVyc2NvcmUtMS42LjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaXppeERLemU5ak0zdUxKT1QvaHRSYTZsS2FnPSIKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInVuZGVyc2NvcmUuc3RyaW5nIjogeworICAgICAgInZlcnNpb24iOiAiMy4zLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuZGVyc2NvcmUuc3RyaW5nLy0vdW5kZXJzY29yZS5zdHJpbmctMy4zLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWcrZHBtZ24rWEJuZUxtWFhvK3NHbFc1eFFFdDRFcmtTM21nZU4yR0ZicmVtWWVNQlNKS3I5V2YyS0pwbFFWYWlQWS9mN0ZONmF0b3NXWU5tOW92cllnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzcHJpbnRmLWpzIjogIl4xLjAuMyIsCisgICAgICAgICJ1dGlsLWRlcHJlY2F0ZSI6ICJeMS4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAidW5pY29kZS01LjIuMCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNy41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmljb2RlLTUuMi4wLy0vdW5pY29kZS01LjIuMC0wLjcuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItS1ZHTFcxQnJpMzB4MDB5djRITk04a0J4b3FGWHIwU2JvNTU3MzVudnJsc3g0UFlCWm9sM1V0b1dnTzQ5MmZTd21zZXR6UEVaenk3M3JiVThPR1hKY0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVuaW9uLXZhbHVlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuaW9uLXZhbHVlLy0vdW5pb24tdmFsdWUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1YSEhEVExXNjFkenI0K29NMElJSHVscWhycVE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyLXVuaW9uIjogIl4zLjEuMCIsCisgICAgICAgICJnZXQtdmFsdWUiOiAiXjIuMC42IiwKKyAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4xIiwKKyAgICAgICAgInNldC12YWx1ZSI6ICJeMC40LjMiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VYTk5WVVyWnFmWVE2aHV2dTVpZGF4eFdpUTg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic2V0LXZhbHVlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuNC4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2V0LXZhbHVlLy0vc2V0LXZhbHVlLTAuNC4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWZiQ1BuVDBpM0g5NDVUcnp3NzlHWnV6ZnpQRT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMi4wLjEiLAorICAgICAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4xIiwKKyAgICAgICAgICAgICJpcy1wbGFpbi1vYmplY3QiOiAiXjIuMC4xIiwKKyAgICAgICAgICAgICJ0by1vYmplY3QtcGF0aCI6ICJeMC4zLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidW5zZXQtdmFsdWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5zZXQtdmFsdWUvLS91bnNldC12YWx1ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWczYUhQMzBqTlJlZit4NXZ3Nmp0RGZ5S3RWaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJoYXMtdmFsdWUiOiAiXjAuMy4xIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiaGFzLXZhbHVlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMy4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLXZhbHVlLy0vaGFzLXZhbHVlLTAuMy4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWV4OVl1dHBpeW9KK3dLSUhnQ1ZsU0VXWlhoOD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJnZXQtdmFsdWUiOiAiXjIuMC4zIiwKKyAgICAgICAgICAgICJoYXMtdmFsdWVzIjogIl4wLjEuNCIsCisgICAgICAgICAgICAiaXNvYmplY3QiOiAiXjIuMC4wIgorICAgICAgICAgIH0sCisgICAgICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgICAgICJpc29iamVjdCI6IHsKKyAgICAgICAgICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNvYmplY3QvLS9pc29iamVjdC0yLjEuMC50Z3oiLAorICAgICAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOEdWV0VKYWo4ZG91OUdKeStCWElRTmgrRElrPSIsCisgICAgICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAgICAgImlzYXJyYXkiOiAiMS4wLjAiCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJoYXMtdmFsdWVzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMS40IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLXZhbHVlcy8tL2hhcy12YWx1ZXMtMC4xLjQudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYldIZWxka2QvS201b0NDSnJUaEwvNDlpdDNFPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInVyaS1wYXRoIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VyaS1wYXRoLy0vdXJpLXBhdGgtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sMGZ3R0RXSk04TWQ0UHpQMkMwVGptY21Makk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidXJpeCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91cml4Ly0vdXJpeC0wLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTJwTi9lbUxpSCt3ZjBZMUpzMXdwTlFaNmJIST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1c2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXNlLy0vdXNlLTMuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jd0VTVlhsTzN1cmw5WVdsRlcvVEE5Y3NoQ0VodHU3SUtKL3A1c29KL2dHcGo3dmJ2RnJBWS9lSWlvUTZEdzIzS2paaFlnaUlvOEhPczFuUTJ2ci9vUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidXRpbC1kZXByZWNhdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXRpbC1kZXByZWNhdGUvLS91dGlsLWRlcHJlY2F0ZS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVJRMU55ZnB3M25Nbll2dlMxS0tKZ1VHYURNOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1dWlkIjogeworICAgICAgInZlcnNpb24iOiAiMy4zLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3V1aWQvLS91dWlkLTMuMy4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15WEptZU5hdzNEbm5LQU9LSkU1MXNML1phWWZXSlJsMXBLOWRyMTlZRkN1ME9iUzIzMUFCMS9MYnFUS1JBUTVrdzhBOTByQTZmcjRyaU9VcFRadlFaQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInY4ZmxhZ3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdjhmbGFncy8tL3Y4ZmxhZ3MtMy4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTZzZ1NLb0Z3MVVwVVBkM2NGZEY3UUduckg2dERlQmdXMUYzdjlneThnTFkwbWxiaUJYcThzb3k4YVFwWTZ4ZWVDakg1SytKdkM2MkFjcDdndGw3d1dBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJob21lZGlyLXBvbHlmaWxsIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJ2YWxpZGF0ZS1ucG0tcGFja2FnZS1saWNlbnNlIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ZhbGlkYXRlLW5wbS1wYWNrYWdlLWxpY2Vuc2UvLS92YWxpZGF0ZS1ucG0tcGFja2FnZS1saWNlbnNlLTMuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1EcEttMlVpL3hONy9IUUtDdHBaeG9SV0JoWjlaMGtxdHlnRzhYQ2dOUThabERueHVRbVdoajU2Nmo4Zk40Q3UzL0ptYmhzRG83ZmNBSnE0czloMjdFdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic3BkeC1jb3JyZWN0IjogIl4zLjAuMCIsCisgICAgICAgICJzcGR4LWV4cHJlc3Npb24tcGFyc2UiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInZlcnJvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdmVycm9yLy0vdmVycm9yLTEuMTAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU9oQmNvWEJUcjFYVzRuREIrQ2lHZ3VHTnBBQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNzZXJ0LXBsdXMiOiAiXjEuMC4wIiwKKyAgICAgICAgImNvcmUtdXRpbC1pcyI6ICIxLjAuMiIsCisgICAgICAgICJleHRzcHJpbnRmIjogIl4xLjIuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ3aGljaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93aGljaC8tL3doaWNoLTEuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1IeEpkWVdxMU1USVFiSjNudzBjcXNzSG9UTlUyNjdLbHJEdUdaMVdZbHhEU3RVdEtVaE9hSm1oMTEyL1RabUh4eFVmdUpxUFhTT203dER5YXMwT1NJUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXNleGUiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIndpbmRvdy1zaXplIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dpbmRvdy1zaXplLy0vd2luZG93LXNpemUtMC4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1WRGpOTHFrN0lDNzZPaG4raUlldTU4bFBuSjA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid2luc3RvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93aW5zdG9uLy0vd2luc3Rvbi0yLjQuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTkJvMlBlcG40aEs0VjAxVWZjV2NEbG1pVlRzN1ZUQjFoN2JnbkIwcmdQMTQ2YlloTXhYMHlwQ3ozbEJPZk54Q080WnVlazd5ZVQreS96TTFPZk13NFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luYyI6ICJ+MS4wLjAiLAorICAgICAgICAiY29sb3JzIjogIjEuMC54IiwKKyAgICAgICAgImN5Y2xlIjogIjEuMC54IiwKKyAgICAgICAgImV5ZXMiOiAiMC4xLngiLAorICAgICAgICAiaXNzdHJlYW0iOiAiMC4xLngiLAorICAgICAgICAic3RhY2stdHJhY2UiOiAiMC4wLngiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImFzeW5jIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy8tL2FzeW5jLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLStQd0V5am9UZUVyZW5oWkJyNWhYalB2V1I2az0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImNvbG9ycyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbG9ycy8tL2NvbG9ycy0xLjAuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1CRFAwVFlDV2dQM3JZTzBtRHhzTUppNkNwQXM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ3b3Jkd3JhcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93b3Jkd3JhcC8tL3dvcmR3cmFwLTAuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdDVacHUwTHN0QW40UFZnOHJWTEtGK3FoWkQ4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIndyYXBweSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93cmFwcHkvLS93cmFwcHktMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10U1E5ano3QnFqWHhOa1lGdkEwUU51TUt0cDg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid3MiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd3MvLS93cy01LjIuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItamFIRkQ2UEZ2NlVnb0lWZGE2cVpsbHB0UXNNbERFSmtUUWN5Ynp6WERZTTFYTzlZOGVtNjkxRkdNUG1NNDZXR3lMVTR6OUtNZ1FOK3FydXgvbmhsSEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzeW5jLWxpbWl0ZXIiOiAifjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInhtbGNyZWF0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy94bWxjcmVhdGUvLS94bWxjcmVhdGUtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0rbXYzWXFZS1FUK3ozWTlMQThXeWFTT05NSTg9IgorICAgIH0sCisgICAgInlhcmdzIjogeworICAgICAgInZlcnNpb24iOiAiMy4xMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3lhcmdzLy0veWFyZ3MtMy4xMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOSs1NzJGZmRmQjB0T01EblR2dldnZEZESDlFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNhbWVsY2FzZSI6ICJeMS4wLjIiLAorICAgICAgICAiY2xpdWkiOiAiXjIuMS4wIiwKKyAgICAgICAgImRlY2FtZWxpemUiOiAiXjEuMC4wIiwKKyAgICAgICAgIndpbmRvdy1zaXplIjogIjAuMS4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJjYW1lbGNhc2UiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYW1lbGNhc2UvLS9jYW1lbGNhc2UtMS4yLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbTdVd1RTNExWbW1MTEhXTENLUHFxZHFsaWprPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInlhdXpsIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3lhdXpsLy0veWF1emwtMi40LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sU2owUXRxeHNpaE9XTFEzbTdHVTRpNE1RQVU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZmQtc2xpY2VyIjogIn4xLjAuMSIKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qcy9wYWNrYWdlLmpzb24gYi9saWIvanMvcGFja2FnZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OWNkYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvcGFja2FnZS5qc29uCkBAIC0wLDAgKzEsMTkgQEAKK3sKKyAgIm5hbWUiOiAidGhyaWZ0IiwKKyAgInZlcnNpb24iOiAiMS4wLjAiLAorICAiZGV2RGVwZW5kZW5jaWVzIjogeworICAgICJncnVudCI6ICJeMS4wLjIiLAorICAgICJncnVudC1jbGkiOiAiXjEuMi4wIiwKKyAgICAiZ3J1bnQtY29udHJpYi1jb25jYXQiOiAiXjEuMC4xIiwKKyAgICAiZ3J1bnQtY29udHJpYi1qc2hpbnQiOiAiXjEuMC4wIiwKKyAgICAiZ3J1bnQtY29udHJpYi1xdW5pdCI6ICJeMy4wLjEiLAorICAgICJncnVudC1jb250cmliLXVnbGlmeSI6ICJeMS4wLjEiLAorICAgICJncnVudC1qc2RvYyI6ICJeMi4yLjEiLAorICAgICJncnVudC1zaGVsbC1zcGF3biI6ICJeMC4zLjEwIiwKKyAgICAianNsaW50IjogIl4wLjEyLjAiCisgIH0sCisgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgImpzZG9jIjogIl4zLjUuNSIsCisgICAgIm5vcHQiOiAiXjQuMC4xIgorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvanMvc3JjL3RocmlmdC5qcyBiL2xpYi9qcy9zcmMvdGhyaWZ0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZjgxMjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvc3JjL3RocmlmdC5qcwpAQCAtMCwwICsxLDE1NjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLypqc2hpbnQgZXZpbDp0cnVlKi8KKworLyoqCisgKiBUaGUgVGhyaWZ0IG5hbWVzcGFjZSBob3VzZXMgdGhlIEFwYWNoZSBUaHJpZnQgSmF2YVNjcmlwdCBsaWJyYXJ5CisgKiBlbGVtZW50cyBwcm92aWRpbmcgSmF2YVNjcmlwdCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDCisgKiBzeXN0ZW0uIEVuZCB1c2VycyB3aWxsIHR5cGljYWxseSBvbmx5IGRpcmVjdGx5IG1ha2UgdXNlIG9mIHRoZQorICogVHJhbnNwb3J0IChUWEhSVHJhbnNwb3J0L1RXZWJTb2NrZXRUcmFuc3BvcnQpIGFuZCBQcm90b2NvbAorICogKFRKU09OUFJvdG9jb2wvVEJpbmFyeVByb3RvY29sKSBjb25zdHJ1Y3RvcnMuCisgKgorICogT2JqZWN0IG1ldGhvZHMgYmVnaW5uaW5nIHdpdGggYSBfXyAoZS5nLiBfX29uT3BlbigpKSBhcmUgaW50ZXJuYWwKKyAqIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBvdXRzaWRlIG9mIHRoZSBvYmplY3QncyBvd24gbWV0aG9kcy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgY3JlYXRlcyBvbmUgZ2xvYmFsIG9iamVjdDogVGhyaWZ0CisgKiBDb2RlIGluIHRoaXMgbGlicmFyeSBtdXN0IG5ldmVyIGNyZWF0ZSBhZGRpdGlvbmFsIGdsb2JhbCBpZGVudGlmaWVycywKKyAqIGFsbCBmZWF0dXJlcyBtdXN0IGJlIHNjb3BlZCB3aXRoaW4gdGhlIFRocmlmdCBuYW1lc3BhY2UuCisgKiBAbmFtZXNwYWNlCisgKiBAZXhhbXBsZQorICogICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgnaHR0cDovL2xvY2FsaG9zdDo4NTg1Jyk7CisgKiAgICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAqICAgICB2YXIgY2xpZW50ID0gbmV3IE15VGhyaWZ0U3ZjQ2xpZW50KHByb3RvY29sKTsKKyAqICAgICB2YXIgcmVzdWx0ID0gY2xpZW50Lk15TWV0aG9kKCk7CisgKi8KK3ZhciBUaHJpZnQgPSB7CisgICAgLyoqCisgICAgICogVGhyaWZ0IEphdmFTY3JpcHQgbGlicmFyeSB2ZXJzaW9uLgorICAgICAqIEByZWFkb25seQorICAgICAqIEBjb25zdCB7c3RyaW5nfSBWZXJzaW9uCisgICAgICogQG1lbWJlcm9mIFRocmlmdAorICAgICAqLworICAgIFZlcnNpb246ICcxLjAuMCcsCisKKyAgICAvKioKKyAgICAgKiBUaHJpZnQgSURMIHR5cGUgc3RyaW5nIHRvIElkIG1hcHBpbmcuCisgICAgICogQHJlYWRvbmx5CisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBTVE9QICAgLSBFbmQgb2YgYSBzZXQgb2YgZmllbGRzLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVk9JRCAgIC0gTm8gdmFsdWUgKG9ubHkgbGVnYWwgZm9yIHJldHVybiB0eXBlcykuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBCT09MICAgLSBUcnVlL0ZhbHNlIGludGVnZXIuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBCWVRFICAgLSBTaWduZWQgOCBiaXQgaW50ZWdlci4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIEkwOCAgICAtIFNpZ25lZCA4IGJpdCBpbnRlZ2VyLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgRE9VQkxFIC0gNjQgYml0IElFRUUgODU0IGZsb2F0aW5nIHBvaW50LgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSTE2ICAgIC0gU2lnbmVkIDE2IGJpdCBpbnRlZ2VyLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSTMyICAgIC0gU2lnbmVkIDMyIGJpdCBpbnRlZ2VyLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSTY0ICAgIC0gU2lnbmVkIDY0IGJpdCBpbnRlZ2VyLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgU1RSSU5HIC0gQXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBVVEY3ICAgLSBBcnJheSBvZiBieXRlcyByZXByZXNlbnRpbmcgYSBzdHJpbmcgb2YgVVRGNyBlbmNvZGVkIGNoYXJhY3RlcnMuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBTVFJVQ1QgLSBBIG11bHRpZmllbGQgdHlwZS4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIE1BUCAgICAtIEEgY29sbGVjdGlvbiB0eXBlIChtYXAvYXNzb2NpYXRpdmUtYXJyYXkvZGljdGlvbmFyeSkuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBTRVQgICAgLSBBIGNvbGxlY3Rpb24gdHlwZSAodW5vcmRlcmVkIGFuZCB3aXRob3V0IHJlcGVhdGVkIHZhbHVlcykuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBMSVNUICAgLSBBIGNvbGxlY3Rpb24gdHlwZSAodW5vcmRlcmVkKS4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIFVURjggICAtIEFycmF5IG9mIGJ5dGVzIHJlcHJlc2VudGluZyBhIHN0cmluZyBvZiBVVEY4IGVuY29kZWQgY2hhcmFjdGVycy4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIFVURjE2ICAtIEFycmF5IG9mIGJ5dGVzIHJlcHJlc2VudGluZyBhIHN0cmluZyBvZiBVVEYxNiBlbmNvZGVkIGNoYXJhY3RlcnMuCisgICAgICovCisgICAgVHlwZTogeworICAgICAgICBTVE9QOiAwLAorICAgICAgICBWT0lEOiAxLAorICAgICAgICBCT09MOiAyLAorICAgICAgICBCWVRFOiAzLAorICAgICAgICBJMDg6IDMsCisgICAgICAgIERPVUJMRTogNCwKKyAgICAgICAgSTE2OiA2LAorICAgICAgICBJMzI6IDgsCisgICAgICAgIEk2NDogMTAsCisgICAgICAgIFNUUklORzogMTEsCisgICAgICAgIFVURjc6IDExLAorICAgICAgICBTVFJVQ1Q6IDEyLAorICAgICAgICBNQVA6IDEzLAorICAgICAgICBTRVQ6IDE0LAorICAgICAgICBMSVNUOiAxNSwKKyAgICAgICAgVVRGODogMTYsCisgICAgICAgIFVURjE2OiAxNworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBUaHJpZnQgUlBDIG1lc3NhZ2UgdHlwZSBzdHJpbmcgdG8gSWQgbWFwcGluZy4KKyAgICAgKiBAcmVhZG9ubHkKKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIENBTEwgICAgICAtIFJQQyBjYWxsIHNlbnQgZnJvbSBjbGllbnQgdG8gc2VydmVyLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgUkVQTFkgICAgIC0gUlBDIGNhbGwgbm9ybWFsIHJlc3BvbnNlIGZyb20gc2VydmVyIHRvIGNsaWVudC4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIEVYQ0VQVElPTiAtIFJQQyBjYWxsIGV4Y2VwdGlvbiByZXNwb25zZSBmcm9tIHNlcnZlciB0byBjbGllbnQuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBPTkVXQVkgICAgLSBPbmV3YXkgUlBDIGNhbGwgZnJvbSBjbGllbnQgdG8gc2VydmVyIHdpdGggbm8gcmVzcG9uc2UuCisgICAgICovCisgICAgTWVzc2FnZVR5cGU6IHsKKyAgICAgICAgQ0FMTDogMSwKKyAgICAgICAgUkVQTFk6IDIsCisgICAgICAgIEVYQ0VQVElPTjogMywKKyAgICAgICAgT05FV0FZOiA0CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb3VudCBvZiBhbiBvYmplY3QncyBvd24gcHJvcGVydGllcy4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gb2JqIC0gT2JqZWN0IHRvIHRlc3QuCisgICAgICogQHJldHVybnMge251bWJlcn0gbnVtYmVyIG9mIG9iamVjdCdzIG93biBwcm9wZXJ0aWVzCisgICAgICovCisgICAgb2JqZWN0TGVuZ3RoOiBmdW5jdGlvbihvYmopIHsKKyAgICAgICAgdmFyIGxlbmd0aCA9IDA7CisgICAgICAgIGZvciAodmFyIGsgaW4gb2JqKSB7CisgICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGspKSB7CisgICAgICAgICAgICAgICAgbGVuZ3RoKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBmdW5jdGlvbiB0byBlc3RhYmxpc2ggcHJvdG90eXBlIGluaGVyaXRhbmNlLgorICAgICAqIEBzZWUge0BsaW5rIGh0dHA6Ly9qYXZhc2NyaXB0LmNyb2NrZm9yZC5jb20vcHJvdG90eXBhbC5odG1sfFByb3RvdHlwYWwgSW5oZXJpdGFuY2V9CisgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY29uc3RydWN0b3IgLSBDb250c3RydWN0b3IgZnVuY3Rpb24gdG8gc2V0IGFzIGRlcml2ZWQuCisgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDb25zdHJ1Y3RvciAtIENvbnRzdHJ1Y3RvciBmdW5jdGlvbiB0byBzZXQgYXMgYmFzZS4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdIC0gVHlwZSBuYW1lIHRvIHNldCBhcyBuYW1lIHByb3BlcnR5IGluIGRlcml2ZWQgcHJvdG90eXBlLgorICAgICAqLworICAgIGluaGVyaXRzOiBmdW5jdGlvbihjb25zdHJ1Y3Rvciwgc3VwZXJDb25zdHJ1Y3RvciwgbmFtZSkgeworICAgICAgZnVuY3Rpb24gRigpIHt9CisgICAgICBGLnByb3RvdHlwZSA9IHN1cGVyQ29uc3RydWN0b3IucHJvdG90eXBlOworICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlID0gbmV3IEYoKTsKKyAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZS5uYW1lID0gbmFtZSB8fCAnJzsKKyAgICB9Cit9OworCisvKioKKyAqIEluaXRpYWxpemVzIGEgVGhyaWZ0IFRFeGNlcHRpb24gaW5zdGFuY2UuCisgKiBAY29uc3RydWN0b3IKKyAqIEBhdWdtZW50cyBFcnJvcgorICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBUaGUgVEV4Y2VwdGlvbiBtZXNzYWdlIChkaXN0aW5jdCBmcm9tIHRoZSBFcnJvciBtZXNzYWdlKS4KKyAqIEBjbGFzc2Rlc2MgVEV4Y2VwdGlvbiBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIFRocmlmdCBleGNlcHRpb25zIHR5cGVzLgorICovCitUaHJpZnQuVEV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKKyAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworfTsKK1RocmlmdC5pbmhlcml0cyhUaHJpZnQuVEV4Y2VwdGlvbiwgRXJyb3IsICdURXhjZXB0aW9uJyk7CisKKy8qKgorICogUmV0dXJucyB0aGUgbWVzc2FnZSBzZXQgb24gdGhlIGV4Y2VwdGlvbi4KKyAqIEByZWFkb25seQorICogQHJldHVybnMge3N0cmluZ30gZXhjZXB0aW9uIG1lc3NhZ2UKKyAqLworVGhyaWZ0LlRFeGNlcHRpb24ucHJvdG90eXBlLmdldE1lc3NhZ2UgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5tZXNzYWdlOworfTsKKworLyoqCisgKiBUaHJpZnQgQXBwbGljYXRpb24gRXhjZXB0aW9uIHR5cGUgc3RyaW5nIHRvIElkIG1hcHBpbmcuCisgKiBAcmVhZG9ubHkKKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVU5LTk9XTiAgICAgICAgICAgICAgICAgLSBVbmtub3duL3VuZGVmaW5lZC4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVU5LTk9XTl9NRVRIT0QgICAgICAgICAgLSBDbGllbnQgYXR0ZW1wdGVkIHRvIGNhbGwgYSBtZXRob2QgdW5rbm93biB0byB0aGUgc2VydmVyLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBJTlZBTElEX01FU1NBR0VfVFlQRSAgICAtIENsaWVudCBwYXNzZWQgYW4gdW5rbm93bi91bnN1cHBvcnRlZCBNZXNzYWdlVHlwZS4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgV1JPTkdfTUVUSE9EX05BTUUgICAgICAgLSBVbnVzZWQuCisgKiBAcHJvcGVydHkge251bWJlcn0gIEJBRF9TRVFVRU5DRV9JRCAgICAgICAgIC0gVW51c2VkIGluIFRocmlmdCBSUEMsIHVzZWQgdG8gZmxhZyBwcm9wcmlldGFyeSBzZXF1ZW5jZSBudW1iZXIgZXJyb3JzLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBNSVNTSU5HX1JFU1VMVCAgICAgICAgICAtIFJhaXNlZCBieSBhIHNlcnZlciBwcm9jZXNzb3IgaWYgYSBoYW5kbGVyIGZhaWxzIHRvIHN1cHBseSB0aGUgcmVxdWlyZWQgcmV0dXJuIHJlc3VsdC4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSU5URVJOQUxfRVJST1IgICAgICAgICAgLSBTb21ldGhpbmcgYmFkIGhhcHBlbmVkLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBQUk9UT0NPTF9FUlJPUiAgICAgICAgICAtIFRoZSBwcm90b2NvbCBsYXllciBmYWlsZWQgdG8gc2VyaWFsaXplIG9yIGRlc2VyaWFsaXplIGRhdGEuCisgKiBAcHJvcGVydHkge251bWJlcn0gIElOVkFMSURfVFJBTlNGT1JNICAgICAgIC0gVW51c2VkLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBJTlZBTElEX1BST1RPQ09MICAgICAgICAtIFRoZSBwcm90b2NvbCAob3IgdmVyc2lvbikgaXMgbm90IHN1cHBvcnRlZC4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgLSBVbnVzZWQuCisgKi8KK1RocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlID0geworICAgIFVOS05PV046IDAsCisgICAgVU5LTk9XTl9NRVRIT0Q6IDEsCisgICAgSU5WQUxJRF9NRVNTQUdFX1RZUEU6IDIsCisgICAgV1JPTkdfTUVUSE9EX05BTUU6IDMsCisgICAgQkFEX1NFUVVFTkNFX0lEOiA0LAorICAgIE1JU1NJTkdfUkVTVUxUOiA1LAorICAgIElOVEVSTkFMX0VSUk9SOiA2LAorICAgIFBST1RPQ09MX0VSUk9SOiA3LAorICAgIElOVkFMSURfVFJBTlNGT1JNOiA4LAorICAgIElOVkFMSURfUFJPVE9DT0w6IDksCisgICAgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEU6IDEwCit9OworCisvKioKKyAqIEluaXRpYWxpemVzIGEgVGhyaWZ0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBpbnN0YW5jZS4KKyAqIEBjb25zdHJ1Y3RvcgorICogQGF1Z21lbnRzIFRocmlmdC5URXhjZXB0aW9uCisgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFRoZSBUQXBwbGljYXRpb25FeGNlcHRpb24gbWVzc2FnZSAoZGlzdGluY3QgZnJvbSB0aGUgRXJyb3IgbWVzc2FnZSkuCisgKiBAcGFyYW0ge1RocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlfSBbY29kZV0gLSBUaGUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSBjb2RlLgorICogQGNsYXNzZGVzYyBUQXBwbGljYXRpb25FeGNlcHRpb24gaXMgdGhlIGV4Y2VwdGlvbiBjbGFzcyB1c2VkIHRvIHByb3BhZ2F0ZSBleGNlcHRpb25zIGZyb20gYW4gUlBDIHNlcnZlciBiYWNrIHRvIGEgY2FsbGluZyBjbGllbnQuCisqLworVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UsIGNvZGUpIHsKKyAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIHRoaXMuY29kZSA9IHR5cGVvZiBjb2RlID09PSAnbnVtYmVyJyA/IGNvZGUgOiAwOworfTsKK1RocmlmdC5pbmhlcml0cyhUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBUaHJpZnQuVEV4Y2VwdGlvbiwgJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOworCisvKioKKyAqIFJlYWQgYSBUQXBwbGljYXRpb25FeGNlcHRpb24gZnJvbSB0aGUgc3VwcGxpZWQgcHJvdG9jb2wuCisgKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBUaGUgaW5wdXQgcHJvdG9jb2wgdG8gcmVhZCBmcm9tLgorICovCitUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24oaW5wdXQpIHsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICB2YXIgcmV0ID0gaW5wdXQucmVhZEZpZWxkQmVnaW4oKTsKKworICAgICAgICBpZiAocmV0LmZ0eXBlID09IFRocmlmdC5UeXBlLlNUT1ApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGZpZCA9IHJldC5maWQ7CisKKyAgICAgICAgc3dpdGNoIChmaWQpIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBpZiAocmV0LmZ0eXBlID09IFRocmlmdC5UeXBlLlNUUklORykgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBpbnB1dC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IHJldC52YWx1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBpbnB1dC5za2lwKHJldC5mdHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGlmIChyZXQuZnR5cGUgPT0gVGhyaWZ0LlR5cGUuSTMyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnJlYWRJMzIoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2RlID0gcmV0LnZhbHVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnNraXAocmV0LmZ0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0ID0gaW5wdXQuc2tpcChyZXQuZnR5cGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaW5wdXQucmVhZEZpZWxkRW5kKCk7CisgICAgfQorCisgICAgaW5wdXQucmVhZFN0cnVjdEVuZCgpOworfTsKKworLyoqCisgKiBXaXRlIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHRvIHRoZSBzdXBwbGllZCBwcm90b2NvbC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBvdXRwdXQgLSBUaGUgb3V0cHV0IHByb3RvY29sIHRvIHdyaXRlIHRvLgorICovCitUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKG91dHB1dCkgeworICAgIG91dHB1dC53cml0ZVN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKKworICAgIGlmICh0aGlzLm1lc3NhZ2UpIHsKKyAgICAgICAgb3V0cHV0LndyaXRlRmllbGRCZWdpbignbWVzc2FnZScsIFRocmlmdC5UeXBlLlNUUklORywgMSk7CisgICAgICAgIG91dHB1dC53cml0ZVN0cmluZyh0aGlzLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIG91dHB1dC53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgaWYgKHRoaXMuY29kZSkgeworICAgICAgICBvdXRwdXQud3JpdGVGaWVsZEJlZ2luKCd0eXBlJywgVGhyaWZ0LlR5cGUuSTMyLCAyKTsKKyAgICAgICAgb3V0cHV0LndyaXRlSTMyKHRoaXMuY29kZSk7CisgICAgICAgIG91dHB1dC53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgb3V0cHV0LndyaXRlRmllbGRTdG9wKCk7CisgICAgb3V0cHV0LndyaXRlU3RydWN0RW5kKCk7Cit9OworCisvKioKKyAqIFJldHVybnMgdGhlIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiBjb2RlIHNldCBvbiB0aGUgZXhjZXB0aW9uLgorICogQHJlYWRvbmx5CisgKiBAcmV0dXJucyB7VGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGV9IGV4Y2VwdGlvbiBjb2RlCisgKi8KK1RocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ucHJvdG90eXBlLmdldENvZGUgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5jb2RlOworfTsKKworVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUgPSB7CisgICAgVU5LTk9XTjogMCwKKyAgICBJTlZBTElEX0RBVEE6IDEsCisgICAgTkVHQVRJVkVfU0laRTogMiwKKyAgICBTSVpFX0xJTUlUOiAzLAorICAgIEJBRF9WRVJTSU9OOiA0LAorICAgIE5PVF9JTVBMRU1FTlRFRDogNSwKKyAgICBERVBUSF9MSU1JVDogNgorfTsKKworVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbiA9IGZ1bmN0aW9uIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlLCBtZXNzYWdlKSB7CisgICAgRXJyb3IuY2FsbCh0aGlzKTsKKyAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTsKKyAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworfTsKK1RocmlmdC5pbmhlcml0cyhUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uLCBUaHJpZnQuVEV4Y2VwdGlvbiwgJ1RQcm90b2NvbEV4Y2VwdGlvbicpOworCisvKioKKyAqIENvbnN0cnVjdG9yIEZ1bmN0aW9uIGZvciB0aGUgWEhSIHRyYW5zcG9ydC4KKyAqIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIHVybCB0aGVuIHlvdSBtdXN0IGhhbmRsZSBYSFIgb3BlcmF0aW9ucyBvbgorICogeW91ciBvd24uIFRoaXMgdHlwZSBjYW4gYWxzbyBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgVHJhbnNwb3J0IGFsaWFzCisgKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIFVSTCB0byBjb25uZWN0IHRvLgorICogQGNsYXNzZGVzYyBUaGUgQXBhY2hlIFRocmlmdCBUcmFuc3BvcnQgbGF5ZXIgcGVyZm9ybXMgYnl0ZSBsZXZlbCBJL08KKyAqIGJldHdlZW4gUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuIFRoZSBKYXZhU2NyaXB0IFRYSFJUcmFuc3BvcnQgb2JqZWN0CisgKiB1c2VzIEh0dHBbc10vWEhSLiBUYXJnZXQgc2VydmVycyBtdXN0IGltcGxlbWVudCB0aGUgaHR0cFtzXSB0cmFuc3BvcnQKKyAqIChzZWU6IG5vZGUuanMgZXhhbXBsZSBzZXJ2ZXJfaHR0cC5qcykuCisgKiBAZXhhbXBsZQorICogICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRYSFJUcmFuc3BvcnQoImh0dHA6Ly9sb2NhbGhvc3Q6ODU4NSIpOworICovCitUaHJpZnQuVHJhbnNwb3J0ID0gVGhyaWZ0LlRYSFJUcmFuc3BvcnQgPSBmdW5jdGlvbih1cmwsIG9wdGlvbnMpIHsKKyAgICB0aGlzLnVybCA9IHVybDsKKyAgICB0aGlzLndwb3MgPSAwOworICAgIHRoaXMucnBvcyA9IDA7CisgICAgdGhpcy51c2VDT1JTID0gKG9wdGlvbnMgJiYgb3B0aW9ucy51c2VDT1JTKTsKKyAgICB0aGlzLmN1c3RvbUhlYWRlcnMgPSBvcHRpb25zID8gKG9wdGlvbnMuY3VzdG9tSGVhZGVycyA/IG9wdGlvbnMuY3VzdG9tSGVhZGVycyA6IHt9KToge307CisgICAgdGhpcy5zZW5kX2J1ZiA9ICcnOworICAgIHRoaXMucmVjdl9idWYgPSAnJzsKK307CisKK1RocmlmdC5UWEhSVHJhbnNwb3J0LnByb3RvdHlwZSA9IHsKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBicm93c2VyIHNwZWNpZmljIFhtbEh0dHBSZXF1ZXN0IE9iamVjdC4KKyAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSB0aGUgYnJvd3NlciBYSFIgaW50ZXJmYWNlIG9iamVjdAorICAgICAqLworICAgIGdldFhtbEh0dHBSZXF1ZXN0T2JqZWN0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgdHJ5IHsgcmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpOyB9IGNhdGNoIChlMSkgeyB9CisgICAgICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTXN4bWwyLlhNTEhUVFAnKTsgfSBjYXRjaCAoZTIpIHsgfQorICAgICAgICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01pY3Jvc29mdC5YTUxIVFRQJyk7IH0gY2F0Y2ggKGUzKSB7IH0KKworICAgICAgICB0aHJvdyAiWW91ciBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBYSFIuIjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2VuZHMgdGhlIGN1cnJlbnQgWFJIIHJlcXVlc3QgaWYgdGhlIHRyYW5zcG9ydCB3YXMgY3JlYXRlZCB3aXRoIGEgVVJMCisgICAgICogYW5kIHRoZSBhc3luYyBwYXJhbWV0ZXIgaXMgZmFsc2UuIElmIHRoZSB0cmFuc3BvcnQgd2FzIG5vdCBjcmVhdGVkIHdpdGgKKyAgICAgKiBhIFVSTCwgb3IgdGhlIGFzeW5jIHBhcmFtZXRlciBpcyBUcnVlIGFuZCBubyBjYWxsYmFjayBpcyBwcm92aWRlZCwgb3IKKyAgICAgKiB0aGUgVVJMIGlzIGFuIGVtcHR5IHN0cmluZywgdGhlIGN1cnJlbnQgc2VuZCBidWZmZXIgaXMgcmV0dXJuZWQuCisgICAgICogQHBhcmFtIHtvYmplY3R9IGFzeW5jIC0gSWYgdHJ1ZSB0aGUgY3VycmVudCBzZW5kIGJ1ZmZlciBpcyByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gY2FsbGJhY2sgLSBPcHRpb25hbCBhc3luYyBjb21wbGV0aW9uIGNhbGxiYWNrCisgICAgICogQHJldHVybnMge3VuZGVmaW5lZHxzdHJpbmd9IE5vdGhpbmcgb3IgdGhlIGN1cnJlbnQgc2VuZCBidWZmZXIuCisgICAgICogQHRocm93cyB7c3RyaW5nfSBJZiBYSFIgZmFpbHMuCisgICAgICovCisgICAgZmx1c2g6IGZ1bmN0aW9uKGFzeW5jLCBjYWxsYmFjaykgeworICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgICAgIGlmICgoYXN5bmMgJiYgIWNhbGxiYWNrKSB8fCB0aGlzLnVybCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMudXJsID09PSAnJykgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZF9idWY7CisgICAgICAgIH0KKworICAgICAgICB2YXIgeHJlcSA9IHRoaXMuZ2V0WG1sSHR0cFJlcXVlc3RPYmplY3QoKTsKKworICAgICAgICBpZiAoeHJlcS5vdmVycmlkZU1pbWVUeXBlKSB7CisgICAgICAgICAgICB4cmVxLm92ZXJyaWRlTWltZVR5cGUoJ2FwcGxpY2F0aW9uL3ZuZC5hcGFjaGUudGhyaWZ0Lmpzb247IGNoYXJzZXQ9dXRmLTgnKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjYWxsYmFjaykgeworICAgICAgICAgICAgLy9JZ25vcmUgWEhSIGNhbGxiYWNrcyB1bnRpbCB0aGUgZGF0YSBhcnJpdmVzLCB0aGVuIGNhbGwgdGhlCisgICAgICAgICAgICAvLyAgY2xpZW50J3MgY2FsbGJhY2sKKyAgICAgICAgICAgIHhyZXEub25yZWFkeXN0YXRlY2hhbmdlID0KKyAgICAgICAgICAgICAgKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gNCAmJiB0aGlzLnN0YXR1cyA9PSAyMDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRSZWN2QnVmZmVyKHRoaXMucmVzcG9uc2VUZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICB9KCkpOworCisgICAgICAgICAgICAvLyBkZXRlY3QgbmV0OjpFUlJfQ09OTkVDVElPTl9SRUZVU0VEIGFuZCBjYWxsIHRoZSBjYWxsYmFjay4KKyAgICAgICAgICAgIHhyZXEub25lcnJvciA9CisgICAgICAgICAgICAgICAgKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgfSgpKTsKKworICAgICAgICB9CisKKyAgICAgICAgeHJlcS5vcGVuKCdQT1NUJywgdGhpcy51cmwsICEhYXN5bmMpOworCisgICAgICAgIC8vIGFkZCBjdXN0b20gaGVhZGVycworICAgICAgICBPYmplY3Qua2V5cyhzZWxmLmN1c3RvbUhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24ocHJvcCkgeworICAgICAgICAgICAgeHJlcS5zZXRSZXF1ZXN0SGVhZGVyKHByb3AsIHNlbGYuY3VzdG9tSGVhZGVyc1twcm9wXSk7CisgICAgICAgIH0pOworCisgICAgICAgIGlmICh4cmVxLnNldFJlcXVlc3RIZWFkZXIpIHsKKyAgICAgICAgICAgIHhyZXEuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL3ZuZC5hcGFjaGUudGhyaWZ0Lmpzb247IGNoYXJzZXQ9dXRmLTgnKTsKKyAgICAgICAgICAgIHhyZXEuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3ZuZC5hcGFjaGUudGhyaWZ0Lmpzb247IGNoYXJzZXQ9dXRmLTgnKTsKKyAgICAgICAgfQorCisgICAgICAgIHhyZXEuc2VuZCh0aGlzLnNlbmRfYnVmKTsKKyAgICAgICAgaWYgKGFzeW5jICYmIGNhbGxiYWNrKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoeHJlcS5yZWFkeVN0YXRlICE9IDQpIHsKKyAgICAgICAgICAgIHRocm93ICdlbmNvdW50ZXJlZCBhbiB1bmtub3duIGFqYXggcmVhZHkgc3RhdGU6ICcgKyB4cmVxLnJlYWR5U3RhdGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoeHJlcS5zdGF0dXMgIT0gMjAwKSB7CisgICAgICAgICAgICB0aHJvdyAnZW5jb3VudGVyZWQgYSB1bmtub3duIHJlcXVlc3Qgc3RhdHVzOiAnICsgeHJlcS5zdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnJlY3ZfYnVmID0geHJlcS5yZXNwb25zZVRleHQ7CisgICAgICAgIHRoaXMucmVjdl9idWZfc3ogPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aDsKKyAgICAgICAgdGhpcy53cG9zID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGg7CisgICAgICAgIHRoaXMucnBvcyA9IDA7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBqUXVlcnkgWEhSIG9iamVjdCB0byBiZSB1c2VkIGZvciBhIFRocmlmdCBzZXJ2ZXIgY2FsbC4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gY2xpZW50IC0gVGhlIFRocmlmdCBTZXJ2aWNlIGNsaWVudCBvYmplY3QgZ2VuZXJhdGVkIGJ5IHRoZSBJREwgY29tcGlsZXIuCisgICAgICogQHBhcmFtIHtvYmplY3R9IHBvc3REYXRhIC0gVGhlIG1lc3NhZ2UgdG8gc2VuZCB0byB0aGUgc2VydmVyLgorICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGFyZ3MgLSBUaGUgb3JpZ2luYWwgY2FsbCBhcmd1bWVudHMgd2l0aCB0aGUgc3VjY2VzcyBjYWxsIGJhY2sgYXQgdGhlIGVuZC4KKyAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSByZWN2X21ldGhvZCAtIFRoZSBUaHJpZnQgU2VydmljZSBDbGllbnQgcmVjZWl2ZSBtZXRob2QgZm9yIHRoZSBjYWxsLgorICAgICAqIEByZXR1cm5zIHtvYmplY3R9IEEgbmV3IGpRdWVyeSBYSFIgb2JqZWN0LgorICAgICAqIEB0aHJvd3Mge3N0cmluZ30gSWYgdGhlIGpRdWVyeSB2ZXJzaW9uIGlzIHByaW9yIHRvIDEuNSBvciBpZiBqUXVlcnkgaXMgbm90IGZvdW5kLgorICAgICAqLworICAgIGpxUmVxdWVzdDogZnVuY3Rpb24oY2xpZW50LCBwb3N0RGF0YSwgYXJncywgcmVjdl9tZXRob2QpIHsKKyAgICAgICAgaWYgKHR5cGVvZiBqUXVlcnkgPT09ICd1bmRlZmluZWQnIHx8CisgICAgICAgICAgICB0eXBlb2YgalF1ZXJ5LkRlZmVycmVkID09PSAndW5kZWZpbmVkJykgeworICAgICAgICAgICAgdGhyb3cgJ1RocmlmdC5qcyByZXF1aXJlcyBqUXVlcnkgMS41KyB0byB1c2UgYXN5bmNocm9ub3VzIHJlcXVlc3RzJzsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB0aHJpZnRUcmFuc3BvcnQgPSB0aGlzOworCisgICAgICAgIHZhciBqcVhIUiA9IGpRdWVyeS5hamF4KHsKKyAgICAgICAgICAgIHVybDogdGhpcy51cmwsCisgICAgICAgICAgICBkYXRhOiBwb3N0RGF0YSwKKyAgICAgICAgICAgIHR5cGU6ICdQT1NUJywKKyAgICAgICAgICAgIGNhY2hlOiBmYWxzZSwKKyAgICAgICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vdm5kLmFwYWNoZS50aHJpZnQuanNvbjsgY2hhcnNldD11dGYtOCcsCisgICAgICAgICAgICBkYXRhVHlwZTogJ3RleHQgdGhyaWZ0JywKKyAgICAgICAgICAgIGNvbnZlcnRlcnM6IHsKKyAgICAgICAgICAgICAgICAndGV4dCB0aHJpZnQnIDogZnVuY3Rpb24ocmVzcG9uc2VEYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmlmdFRyYW5zcG9ydC5zZXRSZWN2QnVmZmVyKHJlc3BvbnNlRGF0YSk7CisgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHJlY3ZfbWV0aG9kLmNhbGwoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBjb250ZXh0OiBjbGllbnQsCisgICAgICAgICAgICBzdWNjZXNzOiBqUXVlcnkubWFrZUFycmF5KGFyZ3MpLnBvcCgpCisgICAgICAgIH0pOworCisgICAgICAgIHJldHVybiBqcVhIUjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYnVmZmVyIHRvIHByb3ZpZGUgdGhlIHByb3RvY29sIHdoZW4gZGVzZXJpYWxpemluZy4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzdXBwbHkgdGhlIHByb3RvY29sLgorICAgICAqLworICAgIHNldFJlY3ZCdWZmZXI6IGZ1bmN0aW9uKGJ1ZikgeworICAgICAgICB0aGlzLnJlY3ZfYnVmID0gYnVmOworICAgICAgICB0aGlzLnJlY3ZfYnVmX3N6ID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGg7CisgICAgICAgIHRoaXMud3BvcyA9IHRoaXMucmVjdl9idWYubGVuZ3RoOworICAgICAgICB0aGlzLnJwb3MgPSAwOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuLCBYSFIgYWx3YXlzIHJldHVybnMgdHJ1ZS4KKyAgICAgKiBAcmVhZG9ubHkKKyAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQWx3YXlzIFRydWUuCisgICAgICovCisgICAgaXNPcGVuOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIE9wZW5zIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbiwgd2l0aCBYSFIgdGhpcyBpcyBhIG5vcC4KKyAgICAgKi8KKyAgICBvcGVuOiBmdW5jdGlvbigpIHt9LAorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbiwgd2l0aCBYSFIgdGhpcyBpcyBhIG5vcC4KKyAgICAgKi8KKyAgICBjbG9zZTogZnVuY3Rpb24oKSB7fSwKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSByZXNwb25zZQorICAgICAqIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuIC0gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJldHVybi4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaGFyYWN0ZXJzIHNlbnQgYnkgdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICByZWFkOiBmdW5jdGlvbihsZW4pIHsKKyAgICAgICAgdmFyIGF2YWlsID0gdGhpcy53cG9zIC0gdGhpcy5ycG9zOworCisgICAgICAgIGlmIChhdmFpbCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuICcnOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGdpdmUgPSBsZW47CisKKyAgICAgICAgaWYgKGF2YWlsIDwgbGVuKSB7CisgICAgICAgICAgICBnaXZlID0gYXZhaWw7CisgICAgICAgIH0KKworICAgICAgICB2YXIgcmV0ID0gdGhpcy5yZWFkX2J1Zi5zdWJzdHIodGhpcy5ycG9zLCBnaXZlKTsKKyAgICAgICAgdGhpcy5ycG9zICs9IGdpdmU7CisKKyAgICAgICAgLy9jbGVhciBidWYgd2hlbiBjb21wbGV0ZT8KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZW50aXJlIHJlc3BvbnNlIGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaGFyYWN0ZXJzIHNlbnQgYnkgdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICByZWFkQWxsOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVjdl9idWY7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNlbmQgYnVmZmVyIHRvIGJ1Zi4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzZW5kLgorICAgICAqLworICAgIHdyaXRlOiBmdW5jdGlvbihidWYpIHsKKyAgICAgICAgdGhpcy5zZW5kX2J1ZiA9IGJ1ZjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2VuZCBidWZmZXIuCisgICAgICogQHJlYWRvbmx5CisgICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIHNlbmQgYnVmZmVyLgorICAgICAqLworICAgIGdldFNlbmRCdWZmZXI6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zZW5kX2J1ZjsKKyAgICB9CisKK307CisKKworLyoqCisgKiBDb25zdHJ1Y3RvciBGdW5jdGlvbiBmb3IgdGhlIFdlYlNvY2tldCB0cmFuc3BvcnQuCisgKiBAY29uc3RydWN0b3IKKyAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBVUkwgdG8gY29ubmVjdCB0by4KKyAqIEBjbGFzc2Rlc2MgVGhlIEFwYWNoZSBUaHJpZnQgVHJhbnNwb3J0IGxheWVyIHBlcmZvcm1zIGJ5dGUgbGV2ZWwgSS9PCisgKiBiZXR3ZWVuIFJQQyBjbGllbnRzIGFuZCBzZXJ2ZXJzLiBUaGUgSmF2YVNjcmlwdCBUV2ViU29ja2V0VHJhbnNwb3J0IG9iamVjdAorICogdXNlcyB0aGUgV2ViU29ja2V0IHByb3RvY29sLiBUYXJnZXQgc2VydmVycyBtdXN0IGltcGxlbWVudCBXZWJTb2NrZXQuCisgKiAoc2VlOiBub2RlLmpzIGV4YW1wbGUgc2VydmVyX2h0dHAuanMpLgorICogQGV4YW1wbGUKKyAqICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVFdlYlNvY2tldFRyYW5zcG9ydCgiaHR0cDovL2xvY2FsaG9zdDo4NTg1Iik7CisgKi8KK1RocmlmdC5UV2ViU29ja2V0VHJhbnNwb3J0ID0gZnVuY3Rpb24odXJsKSB7CisgICAgdGhpcy5fX3Jlc2V0KHVybCk7Cit9OworCitUaHJpZnQuVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUgPSB7CisgICAgX19yZXNldDogZnVuY3Rpb24odXJsKSB7CisgICAgICB0aGlzLnVybCA9IHVybDsgICAgICAgICAgICAgLy9XaGVyZSB0byBjb25uZWN0CisgICAgICB0aGlzLnNvY2tldCA9IG51bGw7ICAgICAgICAgLy9UaGUgd2ViIHNvY2tldAorICAgICAgdGhpcy5jYWxsYmFja3MgPSBbXTsgICAgICAgIC8vUGVuZGluZyBjYWxsYmFja3MKKyAgICAgIHRoaXMuc2VuZF9wZW5kaW5nID0gW107ICAgICAvL0J1ZmZlcnMvQ2FsbGJhY2sgcGFpcnMgd2FpdGluZyB0byBiZSBzZW50CisgICAgICB0aGlzLnNlbmRfYnVmID0gJyc7ICAgICAgICAgLy9PdXRib3VuZCBkYXRhLCBpbW11dGFibGUgdW50aWwgc2VudAorICAgICAgdGhpcy5yZWN2X2J1ZiA9ICcnOyAgICAgICAgIC8vSW5ib3VuZCBkYXRhCisgICAgICB0aGlzLnJiX3dwb3MgPSAwOyAgICAgICAgICAgLy9OZXR3b3JrIHdyaXRlIHBvc2l0aW9uIGluIHJlY2VpdmUgYnVmZmVyCisgICAgICB0aGlzLnJiX3Jwb3MgPSAwOyAgICAgICAgICAgLy9DbGllbnQgcmVhZCBwb3NpdGlvbiBpbiByZWNlaXZlIGJ1ZmZlcgorICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZW5kcyB0aGUgY3VycmVudCBXUyByZXF1ZXN0IGFuZCByZWdpc3RlcnMgY2FsbGJhY2suIFRoZSBhc3luYworICAgICAqIHBhcmFtZXRlciBpcyBpZ25vcmVkIChXUyBmbHVzaCBpcyBhbHdheXMgYXN5bmMpIGFuZCB0aGUgY2FsbGJhY2sKKyAgICAgKiBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuCisgICAgICogQHBhcmFtIHtvYmplY3R9IGFzeW5jIC0gSWdub3JlZC4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gY2FsbGJhY2sgLSBUaGUgY2xpZW50IGNvbXBsZXRpb24gY2FsbGJhY2suCisgICAgICogQHJldHVybnMge3VuZGVmaW5lZHxzdHJpbmd9IE5vdGhpbmcgKHVuZGVmaW5lZCkKKyAgICAgKi8KKyAgICBmbHVzaDogZnVuY3Rpb24oYXN5bmMsIGNhbGxiYWNrKSB7CisgICAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgICBpZiAodGhpcy5pc09wZW4oKSkgeworICAgICAgICAvL1NlbmQgZGF0YSBhbmQgcmVnaXN0ZXIgYSBjYWxsYmFjayB0byBpbnZva2UgdGhlIGNsaWVudCBjYWxsYmFjaworICAgICAgICB0aGlzLnNvY2tldC5zZW5kKHRoaXMuc2VuZF9idWYpOworICAgICAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKChmdW5jdGlvbigpIHsKKyAgICAgICAgICB2YXIgY2xpZW50Q2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgICByZXR1cm4gZnVuY3Rpb24obXNnKSB7CisgICAgICAgICAgICBzZWxmLnNldFJlY3ZCdWZmZXIobXNnKTsKKyAgICAgICAgICAgIGlmIChjbGllbnRDYWxsYmFjaykgeworICAgICAgICAgICAgICAgIGNsaWVudENhbGxiYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfTsKKyAgICAgICAgfSgpKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvL1F1ZXVlIHRoZSBzZW5kIHRvIGdvIG91dCBfX29uT3BlbgorICAgICAgICB0aGlzLnNlbmRfcGVuZGluZy5wdXNoKHsKKyAgICAgICAgICBidWY6IHRoaXMuc2VuZF9idWYsCisgICAgICAgICAgY2I6IGNhbGxiYWNrCisgICAgICAgIH0pOworICAgICAgfQorICAgIH0sCisKKyAgICBfX29uT3BlbjogZnVuY3Rpb24oKSB7CisgICAgICAgdmFyIHNlbGYgPSB0aGlzOworICAgICAgIGlmICh0aGlzLnNlbmRfcGVuZGluZy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgLy9JZiB0aGUgdXNlciBtYWRlIGNhbGxzIGJlZm9yZSB0aGUgY29ubmVjdGlvbiB3YXMgZnVsbHkKKyAgICAgICAgICAvL29wZW4sIHNlbmQgdGhlbSBub3cKKyAgICAgICAgICB0aGlzLnNlbmRfcGVuZGluZy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW0pIHsKKyAgICAgICAgICAgICBzZWxmLnNvY2tldC5zZW5kKGVsZW0uYnVmKTsKKyAgICAgICAgICAgICBzZWxmLmNhbGxiYWNrcy5wdXNoKChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGVsZW0uY2I7CisgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24obXNnKSB7CisgICAgICAgICAgICAgICAgICBzZWxmLnNldFJlY3ZCdWZmZXIobXNnKTsKKyAgICAgICAgICAgICAgICAgIGNsaWVudENhbGxiYWNrKCk7CisgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgIH0oKSkpOworICAgICAgICAgIH0pOworICAgICAgICAgIHRoaXMuc2VuZF9wZW5kaW5nID0gW107CisgICAgICAgfQorICAgIH0sCisKKyAgICBfX29uQ2xvc2U6IGZ1bmN0aW9uKGV2dCkgeworICAgICAgdGhpcy5fX3Jlc2V0KHRoaXMudXJsKTsKKyAgICB9LAorCisgICAgX19vbk1lc3NhZ2U6IGZ1bmN0aW9uKGV2dCkgeworICAgICAgaWYgKHRoaXMuY2FsbGJhY2tzLmxlbmd0aCkgeworICAgICAgICB0aGlzLmNhbGxiYWNrcy5zaGlmdCgpKGV2dC5kYXRhKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgX19vbkVycm9yOiBmdW5jdGlvbihldnQpIHsKKyAgICAgIGNvbnNvbGUubG9nKCdUaHJpZnQgV2ViU29ja2V0IEVycm9yOiAnICsgZXZ0LnRvU3RyaW5nKCkpOworICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYnVmZmVyIHRvIHVzZSB3aGVuIHJlY2VpdmluZyBzZXJ2ZXIgcmVzcG9uc2VzLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHJlY2VpdmUgc2VydmVyIHJlc3BvbnNlcy4KKyAgICAgKi8KKyAgICBzZXRSZWN2QnVmZmVyOiBmdW5jdGlvbihidWYpIHsKKyAgICAgICAgdGhpcy5yZWN2X2J1ZiA9IGJ1ZjsKKyAgICAgICAgdGhpcy5yZWN2X2J1Zl9zeiA9IHRoaXMucmVjdl9idWYubGVuZ3RoOworICAgICAgICB0aGlzLndwb3MgPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aDsKKyAgICAgICAgdGhpcy5ycG9zID0gMDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0cmFuc3BvcnQgaXMgb3BlbgorICAgICAqIEByZWFkb25seQorICAgICAqIEByZXR1cm5zIHtib29sZWFufQorICAgICAqLworICAgIGlzT3BlbjogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09IHRoaXMuc29ja2V0Lk9QRU47CisgICAgfSwKKworICAgIC8qKgorICAgICAqIE9wZW5zIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbgorICAgICAqLworICAgIG9wZW46IGZ1bmN0aW9uKCkgeworICAgICAgLy9JZiBPUEVOL0NPTk5FQ1RJTkcvQ0xPU0lORyBpZ25vcmUgYWRkaXRpb25hbCBvcGVucworICAgICAgaWYgKHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT0gdGhpcy5zb2NrZXQuQ0xPU0VEKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIC8vSWYgdGhlcmUgaXMgbm8gc29ja2V0IG9yIHRoZSBzb2NrZXQgaXMgY2xvc2VkOgorICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KHRoaXMudXJsKTsKKyAgICAgIHRoaXMuc29ja2V0Lm9ub3BlbiA9IHRoaXMuX19vbk9wZW4uYmluZCh0aGlzKTsKKyAgICAgIHRoaXMuc29ja2V0Lm9ubWVzc2FnZSA9IHRoaXMuX19vbk1lc3NhZ2UuYmluZCh0aGlzKTsKKyAgICAgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSB0aGlzLl9fb25FcnJvci5iaW5kKHRoaXMpOworICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IHRoaXMuX19vbkNsb3NlLmJpbmQodGhpcyk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24KKyAgICAgKi8KKyAgICBjbG9zZTogZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgcmVzcG9uc2UKKyAgICAgKiBidWZmZXIuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IGxlbiAtIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZXR1cm4uCisgICAgICogQHJldHVybnMge3N0cmluZ30gQ2hhcmFjdGVycyBzZW50IGJ5IHRoZSBzZXJ2ZXIuCisgICAgICovCisgICAgcmVhZDogZnVuY3Rpb24obGVuKSB7CisgICAgICAgIHZhciBhdmFpbCA9IHRoaXMud3BvcyAtIHRoaXMucnBvczsKKworICAgICAgICBpZiAoYXZhaWwgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAnJzsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBnaXZlID0gbGVuOworCisgICAgICAgIGlmIChhdmFpbCA8IGxlbikgeworICAgICAgICAgICAgZ2l2ZSA9IGF2YWlsOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHJldCA9IHRoaXMucmVhZF9idWYuc3Vic3RyKHRoaXMucnBvcywgZ2l2ZSk7CisgICAgICAgIHRoaXMucnBvcyArPSBnaXZlOworCisgICAgICAgIC8vY2xlYXIgYnVmIHdoZW4gY29tcGxldGU/CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVudGlyZSByZXNwb25zZSBidWZmZXIuCisgICAgICogQHJldHVybnMge3N0cmluZ30gQ2hhcmFjdGVycyBzZW50IGJ5IHRoZSBzZXJ2ZXIuCisgICAgICovCisgICAgcmVhZEFsbDogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlY3ZfYnVmOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzZW5kIGJ1ZmZlciB0byBidWYuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IGJ1ZiAtIFRoZSBidWZmZXIgdG8gc2VuZC4KKyAgICAgKi8KKyAgICB3cml0ZTogZnVuY3Rpb24oYnVmKSB7CisgICAgICAgIHRoaXMuc2VuZF9idWYgPSBidWY7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNlbmQgYnVmZmVyLgorICAgICAqIEByZWFkb25seQorICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzZW5kIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBnZXRTZW5kQnVmZmVyOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2VuZF9idWY7CisgICAgfQorCit9OworCisvKioKKyAqIEluaXRpYWxpemVzIGEgVGhyaWZ0IEpTT04gcHJvdG9jb2wgaW5zdGFuY2UuCisgKiBAY29uc3RydWN0b3IKKyAqIEBwYXJhbSB7VGhyaWZ0LlRyYW5zcG9ydH0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCB0byBzZXJpYWxpemUgdG8vZnJvbS4KKyAqIEBjbGFzc2Rlc2MgQXBhY2hlIFRocmlmdCBQcm90b2NvbHMgcGVyZm9ybSBzZXJpYWxpemF0aW9uIHdoaWNoIGVuYWJsZXMgY3Jvc3MKKyAqIGxhbmd1YWdlIFJQQy4gVGhlIFByb3RvY29sIHR5cGUgaXMgdGhlIEphdmFTY3JpcHQgYnJvd3NlciBpbXBsZW1lbnRhdGlvbgorICogb2YgdGhlIEFwYWNoZSBUaHJpZnQgVEpTT05Qcm90b2NvbC4KKyAqIEBleGFtcGxlCisgKiAgICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAqLworVGhyaWZ0LlRKU09OUHJvdG9jb2wgPSBUaHJpZnQuUHJvdG9jb2wgPSBmdW5jdGlvbih0cmFuc3BvcnQpIHsKKyAgICB0aGlzLnRzdGFjayA9IFtdOworICAgIHRoaXMudHBvcyA9IFtdOworICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworfTsKKworLyoqCisgKiBUaHJpZnQgSURMIHR5cGUgSWQgdG8gc3RyaW5nIG1hcHBpbmcuCisgKiBAcmVhZG9ubHkKKyAqIEBzZWUge0BsaW5rIFRocmlmdC5UeXBlfQorICovCitUaHJpZnQuUHJvdG9jb2wuVHlwZSA9IHt9OworVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuQk9PTF0gPSAnInRmIic7CitUaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5CWVRFXSA9ICciaTgiJzsKK1RocmlmdC5Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLkkxNl0gPSAnImkxNiInOworVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuSTMyXSA9ICciaTMyIic7CitUaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5JNjRdID0gJyJpNjQiJzsKK1RocmlmdC5Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLkRPVUJMRV0gPSAnImRibCInOworVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuU1RSVUNUXSA9ICcicmVjIic7CitUaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5TVFJJTkddID0gJyJzdHIiJzsKK1RocmlmdC5Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLk1BUF0gPSAnIm1hcCInOworVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuTElTVF0gPSAnImxzdCInOworVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuU0VUXSA9ICcic2V0Iic7CisKKy8qKgorICogVGhyaWZ0IElETCB0eXBlIHN0cmluZyB0byBJZCBtYXBwaW5nLgorICogQHJlYWRvbmx5CisgKiBAc2VlIHtAbGluayBUaHJpZnQuVHlwZX0KKyAqLworVGhyaWZ0LlByb3RvY29sLlJUeXBlID0ge307CitUaHJpZnQuUHJvdG9jb2wuUlR5cGUudGYgPSBUaHJpZnQuVHlwZS5CT09MOworVGhyaWZ0LlByb3RvY29sLlJUeXBlLmk4ID0gVGhyaWZ0LlR5cGUuQllURTsKK1RocmlmdC5Qcm90b2NvbC5SVHlwZS5pMTYgPSBUaHJpZnQuVHlwZS5JMTY7CitUaHJpZnQuUHJvdG9jb2wuUlR5cGUuaTMyID0gVGhyaWZ0LlR5cGUuSTMyOworVGhyaWZ0LlByb3RvY29sLlJUeXBlLmk2NCA9IFRocmlmdC5UeXBlLkk2NDsKK1RocmlmdC5Qcm90b2NvbC5SVHlwZS5kYmwgPSBUaHJpZnQuVHlwZS5ET1VCTEU7CitUaHJpZnQuUHJvdG9jb2wuUlR5cGUucmVjID0gVGhyaWZ0LlR5cGUuU1RSVUNUOworVGhyaWZ0LlByb3RvY29sLlJUeXBlLnN0ciA9IFRocmlmdC5UeXBlLlNUUklORzsKK1RocmlmdC5Qcm90b2NvbC5SVHlwZS5tYXAgPSBUaHJpZnQuVHlwZS5NQVA7CitUaHJpZnQuUHJvdG9jb2wuUlR5cGUubHN0ID0gVGhyaWZ0LlR5cGUuTElTVDsKK1RocmlmdC5Qcm90b2NvbC5SVHlwZS5zZXQgPSBUaHJpZnQuVHlwZS5TRVQ7CisKKy8qKgorICogVGhlIFRKU09OUHJvdG9jb2wgdmVyc2lvbiBudW1iZXIuCisgKiBAcmVhZG9ubHkKKyAqIEBjb25zdCB7bnVtYmVyfSBWZXJzaW9uCisgKiBAbWVtYmVyb2YgVGhyaWZ0LlByb3RvY29sCisgKi8KKyBUaHJpZnQuUHJvdG9jb2wuVmVyc2lvbiA9IDE7CisKK1RocmlmdC5Qcm90b2NvbC5wcm90b3R5cGUgPSB7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgICAgICogQHJlYWRvbmx5CisgICAgICogQHJldHVybnMge1RocmlmdC5UcmFuc3BvcnR9IFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICAgKi8KKyAgICBnZXRUcmFuc3BvcnQ6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQ7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBSUEMgbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBzZXJ2aWNlIG1ldGhvZCB0byBjYWxsLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0Lk1lc3NhZ2VUeXBlfSBtZXNzYWdlVHlwZSAtIFRoZSB0eXBlIG9mIG1ldGhvZCBjYWxsLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzZXFpZCAtIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhpcyBjYWxsIChhbHdheXMgMCBpbiBBcGFjaGUgVGhyaWZ0KS4KKyAgICAgKi8KKyAgICB3cml0ZU1lc3NhZ2VCZWdpbjogZnVuY3Rpb24obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKSB7CisgICAgICAgIHRoaXMudHN0YWNrID0gW107CisgICAgICAgIHRoaXMudHBvcyA9IFtdOworCisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goW1RocmlmdC5Qcm90b2NvbC5WZXJzaW9uLCAnIicgKworICAgICAgICAgICAgbmFtZSArICciJywgbWVzc2FnZVR5cGUsIHNlcWlkXSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIFRocmlmdCBSUEMgbWVzc2FnZS4KKyAgICAgKi8KKyAgICB3cml0ZU1lc3NhZ2VFbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgb2JqID0gdGhpcy50c3RhY2sucG9wKCk7CisKKyAgICAgICAgdGhpcy53b2JqID0gdGhpcy50c3RhY2sucG9wKCk7CisgICAgICAgIHRoaXMud29iai5wdXNoKG9iaik7CisKKyAgICAgICAgdGhpcy53YnVmID0gJ1snICsgdGhpcy53b2JqLmpvaW4oJywnKSArICddJzsKKworICAgICAgICB0aGlzLnRyYW5zcG9ydC53cml0ZSh0aGlzLndidWYpOworICAgICB9LAorCisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJ1Y3QuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgc3RydWN0LgorICAgICAqLworICAgIHdyaXRlU3RydWN0QmVnaW46IGZ1bmN0aW9uKG5hbWUpIHsKKyAgICAgICAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKKyAgICAgICAgdGhpcy50c3RhY2sucHVzaCh7fSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIHN0cnVjdC4KKyAgICAgKi8KKyAgICB3cml0ZVN0cnVjdEVuZDogZnVuY3Rpb24oKSB7CisKKyAgICAgICAgdmFyIHAgPSB0aGlzLnRwb3MucG9wKCk7CisgICAgICAgIHZhciBzdHJ1Y3QgPSB0aGlzLnRzdGFja1twXTsKKyAgICAgICAgdmFyIHN0ciA9ICd7JzsKKyAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yICh2YXIga2V5IGluIHN0cnVjdCkgeworICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RyICs9ICcsJzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RyICs9IGtleSArICc6JyArIHN0cnVjdFtrZXldOworICAgICAgICB9CisKKyAgICAgICAgc3RyICs9ICd9JzsKKyAgICAgICAgdGhpcy50c3RhY2tbcF0gPSBzdHI7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIHN0cnVjdCBmaWVsZC4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5Qcm90b2NvbC5UeXBlfSBmaWVsZFR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBmaWVsZC4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gZmllbGRJZCAtIFRoZSBmaWVsZCdzIHVuaXF1ZSBpZGVudGlmaWVyLgorICAgICAqLworICAgIHdyaXRlRmllbGRCZWdpbjogZnVuY3Rpb24obmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKSB7CisgICAgICAgIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCk7CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goeyAnZmllbGRJZCc6ICciJyArCisgICAgICAgICAgICBmaWVsZElkICsgJyInLCAnZmllbGRUeXBlJzogVGhyaWZ0LlByb3RvY29sLlR5cGVbZmllbGRUeXBlXQorICAgICAgICB9KTsKKworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBmaWVsZC4KKyAgICAgKi8KKyAgICB3cml0ZUZpZWxkRW5kOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHZhbHVlID0gdGhpcy50c3RhY2sucG9wKCk7CisgICAgICAgIHZhciBmaWVsZEluZm8gPSB0aGlzLnRzdGFjay5wb3AoKTsKKworICAgICAgICB0aGlzLnRzdGFja1t0aGlzLnRzdGFjay5sZW5ndGggLSAxXVtmaWVsZEluZm8uZmllbGRJZF0gPSAneycgKworICAgICAgICAgICAgZmllbGRJbmZvLmZpZWxkVHlwZSArICc6JyArIHZhbHVlICsgJ30nOworICAgICAgICB0aGlzLnRwb3MucG9wKCk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiB0aGUgc2V0IG9mIGZpZWxkcyBmb3IgYSBzdHJ1Y3QuCisgICAgICovCisgICAgd3JpdGVGaWVsZFN0b3A6IGZ1bmN0aW9uKCkgeworICAgICAgICAvL25hCisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIG1hcCBjb2xsZWN0aW9uLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlR5cGV9IGtleVR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBrZXkuCisgICAgICogQHBhcmFtIHtUaHJpZnQuVHlwZX0gdmFsVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhbHVlLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZV0gLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBtYXAgKGlnbm9yZWQpLgorICAgICAqLworICAgIHdyaXRlTWFwQmVnaW46IGZ1bmN0aW9uKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpIHsKKyAgICAgICAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKKyAgICAgICAgdGhpcy50c3RhY2sucHVzaChbVGhyaWZ0LlByb3RvY29sLlR5cGVba2V5VHlwZV0sCisgICAgICAgICAgICBUaHJpZnQuUHJvdG9jb2wuVHlwZVt2YWxUeXBlXSwgMF0pOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBtYXAuCisgICAgICovCisgICAgd3JpdGVNYXBFbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKTsKKworICAgICAgICBpZiAocCA9PSB0aGlzLnRzdGFjay5sZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgodGhpcy50c3RhY2subGVuZ3RoIC0gcCAtIDEpICUgMiAhPT0gMCkgeworICAgICAgICAgICAgdGhpcy50c3RhY2sucHVzaCgnJyk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgc2l6ZSA9ICh0aGlzLnRzdGFjay5sZW5ndGggLSBwIC0gMSkgLyAyOworCisgICAgICAgIHRoaXMudHN0YWNrW3BdW3RoaXMudHN0YWNrW3BdLmxlbmd0aCAtIDFdID0gc2l6ZTsKKworICAgICAgICB2YXIgbWFwID0gJ30nOworICAgICAgICB2YXIgZmlyc3QgPSB0cnVlOworICAgICAgICB3aGlsZSAodGhpcy50c3RhY2subGVuZ3RoID4gcCArIDEpIHsKKyAgICAgICAgICAgIHZhciB2ID0gdGhpcy50c3RhY2sucG9wKCk7CisgICAgICAgICAgICB2YXIgayA9IHRoaXMudHN0YWNrLnBvcCgpOworICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWFwID0gJywnICsgbWFwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoISBpc05hTihrKSkgeyBrID0gJyInICsgayArICciJzsgfSAvL2pzb24gImtleXMiIG5lZWQgdG8gYmUgc3RyaW5ncworICAgICAgICAgICAgbWFwID0gayArICc6JyArIHYgKyBtYXA7CisgICAgICAgIH0KKyAgICAgICAgbWFwID0gJ3snICsgbWFwOworCisgICAgICAgIHRoaXMudHN0YWNrW3BdLnB1c2gobWFwKTsKKyAgICAgICAgdGhpcy50c3RhY2tbcF0gPSAnWycgKyB0aGlzLnRzdGFja1twXS5qb2luKCcsJykgKyAnXSc7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGxpc3QgY29sbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSBlbGVtVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGVsZW1lbnRzLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdC4KKyAgICAgKi8KKyAgICB3cml0ZUxpc3RCZWdpbjogZnVuY3Rpb24oZWxlbVR5cGUsIHNpemUpIHsKKyAgICAgICAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKKyAgICAgICAgdGhpcy50c3RhY2sucHVzaChbVGhyaWZ0LlByb3RvY29sLlR5cGVbZWxlbVR5cGVdLCBzaXplXSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGxpc3QuCisgICAgICovCisgICAgd3JpdGVMaXN0RW5kOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHAgPSB0aGlzLnRwb3MucG9wKCk7CisKKyAgICAgICAgd2hpbGUgKHRoaXMudHN0YWNrLmxlbmd0aCA+IHAgKyAxKSB7CisgICAgICAgICAgICB2YXIgdG1wVmFsID0gdGhpcy50c3RhY2tbcCArIDFdOworICAgICAgICAgICAgdGhpcy50c3RhY2suc3BsaWNlKHAgKyAxLCAxKTsKKyAgICAgICAgICAgIHRoaXMudHN0YWNrW3BdLnB1c2godG1wVmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMudHN0YWNrW3BdID0gJ1snICsgdGhpcy50c3RhY2tbcF0uam9pbignLCcpICsgJ10nOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZXQgY29sbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSBlbGVtVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGVsZW1lbnRzLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdC4KKyAgICAgKi8KKyAgICB3cml0ZVNldEJlZ2luOiBmdW5jdGlvbihlbGVtVHlwZSwgc2l6ZSkgeworICAgICAgICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpOworICAgICAgICB0aGlzLnRzdGFjay5wdXNoKFtUaHJpZnQuUHJvdG9jb2wuVHlwZVtlbGVtVHlwZV0sIHNpemVdKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc2V0LgorICAgICAqLworICAgIHdyaXRlU2V0RW5kOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHAgPSB0aGlzLnRwb3MucG9wKCk7CisKKyAgICAgICAgd2hpbGUgKHRoaXMudHN0YWNrLmxlbmd0aCA+IHAgKyAxKSB7CisgICAgICAgICAgICB2YXIgdG1wVmFsID0gdGhpcy50c3RhY2tbcCArIDFdOworICAgICAgICAgICAgdGhpcy50c3RhY2suc3BsaWNlKHAgKyAxLCAxKTsKKyAgICAgICAgICAgIHRoaXMudHN0YWNrW3BdLnB1c2godG1wVmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMudHN0YWNrW3BdID0gJ1snICsgdGhpcy50c3RhY2tbcF0uam9pbignLCcpICsgJ10nOworICAgIH0sCisKKyAgICAvKiogU2VyaWFsaXplcyBhIGJvb2xlYW4gKi8KKyAgICB3cml0ZUJvb2w6IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2godmFsdWUgPyAxIDogMCk7CisgICAgfSwKKworICAgIC8qKiBTZXJpYWxpemVzIGEgbnVtYmVyICovCisgICAgd3JpdGVCeXRlOiBmdW5jdGlvbihpOCkgeworICAgICAgICB0aGlzLnRzdGFjay5wdXNoKGk4KTsKKyAgICB9LAorCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KKyAgICB3cml0ZUkxNjogZnVuY3Rpb24oaTE2KSB7CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goaTE2KTsKKyAgICB9LAorCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KKyAgICB3cml0ZUkzMjogZnVuY3Rpb24oaTMyKSB7CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goaTMyKTsKKyAgICB9LAorCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KKyAgICB3cml0ZUk2NDogZnVuY3Rpb24oaTY0KSB7CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goaTY0KTsKKyAgICB9LAorCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KKyAgICB3cml0ZURvdWJsZTogZnVuY3Rpb24oZGJsKSB7CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goZGJsKTsKKyAgICB9LAorCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBzdHJpbmcgKi8KKyAgICB3cml0ZVN0cmluZzogZnVuY3Rpb24oc3RyKSB7CisgICAgICAgIC8vIFdlIGRvIG5vdCBlbmNvZGUgdXJpIGNvbXBvbmVudHMgZm9yIHdpcmUgdHJhbnNmZXI6CisgICAgICAgIGlmIChzdHIgPT09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMudHN0YWNrLnB1c2gobnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBjb25jYXQgbWF5IGJlIHNsb3dlciB0aGFuIGJ1aWxkaW5nIGEgYnl0ZSBidWZmZXIKKyAgICAgICAgICAgIHZhciBlc2NhcGVkU3RyaW5nID0gJyc7CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHZhciBjaCA9IHN0ci5jaGFyQXQoaSk7ICAgICAgLy8gYSBzaW5nbGUgZG91YmxlIHF1b3RlOiAiCisgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXCInKSB7CisgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcXCInOyAvLyB3cml0ZSBvdXQgYXM6IFwiCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xcJykgeyAgICAvLyBhIHNpbmdsZSBiYWNrc2xhc2gKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxcXCc7IC8vIHdyaXRlIG91dCBhcyBkb3VibGUgYmFja3NsYXNoCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xiJykgeyAgICAvLyBhIHNpbmdsZSBiYWNrc3BhY2U6IGludmlzaWJsZQorICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXGInOyAgLy8gd3JpdGUgb3V0IGFzOiBcYiIKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXGYnKSB7ICAgIC8vIGEgc2luZ2xlIGZvcm1mZWVkOiBpbnZpc2libGUKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxmJzsgIC8vIHdyaXRlIG91dCBhczogXGYiCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xuJykgeyAgICAvLyBhIHNpbmdsZSBuZXdsaW5lOiBpbnZpc2libGUKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxuJzsgIC8vIHdyaXRlIG91dCBhczogXG4iCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xyJykgeyAgICAvLyBhIHNpbmdsZSByZXR1cm46IGludmlzaWJsZQorICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXHInOyAgLy8gd3JpdGUgb3V0IGFzOiBcciIKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXHQnKSB7ICAgIC8vIGEgc2luZ2xlIHRhYjogaW52aXNpYmxlCisgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcdCc7ICAvLyB3cml0ZSBvdXQgYXM6IFx0IgorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gY2g7ICAgICAvLyBFbHNlIGl0IG5lZWQgbm90IGJlIGVzY2FwZWQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLnRzdGFjay5wdXNoKCciJyArIGVzY2FwZWRTdHJpbmcgKyAnIicpOworICAgICAgICB9CisgICAgfSwKKworICAgIC8qKiBTZXJpYWxpemVzIGEgc3RyaW5nICovCisgICAgd3JpdGVCaW5hcnk6IGZ1bmN0aW9uKGJpbmFyeSkgeworICAgICAgICB2YXIgc3RyID0gJyc7CisgICAgICAgIGlmICh0eXBlb2YgYmluYXJ5ID09ICdzdHJpbmcnKSB7CisgICAgICAgICAgICBzdHIgPSBiaW5hcnk7CisgICAgICAgIH0gZWxzZSBpZiAoYmluYXJ5IGluc3RhbmNlb2YgVWludDhBcnJheSkgeworICAgICAgICAgICAgdmFyIGFyciA9IGJpbmFyeTsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYXJyW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3dyaXRlQmluYXJ5IG9ubHkgYWNjZXB0cyBTdHJpbmcgb3IgVWludDhBcnJheS4nKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnRzdGFjay5wdXNoKCciJyArIGJ0b2Eoc3RyKSArICciJyk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgIEBjbGFzcworICAgICAgIEBuYW1lIEFub25SZWFkTWVzc2FnZUJlZ2luUmV0dXJuCisgICAgICAgQHByb3BlcnR5IHtzdHJpbmd9IGZuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgbWV0aG9kLgorICAgICAgIEBwcm9wZXJ0eSB7VGhyaWZ0Lk1lc3NhZ2VUeXBlfSBtdHlwZSAtIFRoZSB0eXBlIG9mIG1lc3NhZ2UgY2FsbC4KKyAgICAgICBAcHJvcGVydHkge251bWJlcn0gcnNlcWlkIC0gVGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgbWVzc2FnZSAoMCBpbiBUaHJpZnQgUlBDKS4KKyAgICAgKi8KKyAgICAvKioKKyAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIG1lc3NhZ2UuCisgICAgICogQHJldHVybnMge0Fub25SZWFkTWVzc2FnZUJlZ2luUmV0dXJufQorICAgICAqLworICAgIHJlYWRNZXNzYWdlQmVnaW46IGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLnJzdGFjayA9IFtdOworICAgICAgICB0aGlzLnJwb3MgPSBbXTsKKworICAgICAgICBpZiAodHlwZW9mIEpTT04gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBKU09OLnBhcnNlID09PSAnZnVuY3Rpb24nKSB7CisgICAgICAgICAgICB0aGlzLnJvYmogPSBKU09OLnBhcnNlKHRoaXMudHJhbnNwb3J0LnJlYWRBbGwoKSk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGpRdWVyeSAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgICAgIHRoaXMucm9iaiA9IGpRdWVyeS5wYXJzZUpTT04odGhpcy50cmFuc3BvcnQucmVhZEFsbCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMucm9iaiA9IGV2YWwodGhpcy50cmFuc3BvcnQucmVhZEFsbCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciByID0ge307CisgICAgICAgIHZhciB2ZXJzaW9uID0gdGhpcy5yb2JqLnNoaWZ0KCk7CisKKyAgICAgICAgaWYgKHZlcnNpb24gIT0gVGhyaWZ0LlByb3RvY29sLlZlcnNpb24pIHsKKyAgICAgICAgICAgIHRocm93ICdXcm9uZyB0aHJpZnQgcHJvdG9jb2wgdmVyc2lvbjogJyArIHZlcnNpb247CisgICAgICAgIH0KKworICAgICAgICByLmZuYW1lID0gdGhpcy5yb2JqLnNoaWZ0KCk7CisgICAgICAgIHIubXR5cGUgPSB0aGlzLnJvYmouc2hpZnQoKTsKKyAgICAgICAgci5yc2VxaWQgPSB0aGlzLnJvYmouc2hpZnQoKTsKKworCisgICAgICAgIC8vZ2V0IHRvIHRoZSBtYWluIG9iagorICAgICAgICB0aGlzLnJzdGFjay5wdXNoKHRoaXMucm9iai5zaGlmdCgpKTsKKworICAgICAgICByZXR1cm4gcjsKKyAgICB9LAorCisgICAgLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbWVzc2FnZS4gKi8KKyAgICByZWFkTWVzc2FnZUVuZDogZnVuY3Rpb24oKSB7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3RydWN0LgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV0gLSBUaGUgbmFtZSBvZiB0aGUgc3RydWN0IChpZ25vcmVkKQorICAgICAqIEByZXR1cm5zIHtvYmplY3R9IC0gQW4gb2JqZWN0IHdpdGggYW4gZW1wdHkgc3RyaW5nIGZuYW1lIHByb3BlcnR5CisgICAgICovCisgICAgcmVhZFN0cnVjdEJlZ2luOiBmdW5jdGlvbihuYW1lKSB7CisgICAgICAgIHZhciByID0ge307CisgICAgICAgIHIuZm5hbWUgPSAnJzsKKworICAgICAgICAvL2luY2FzZSB0aGlzIGlzIGFuIGFycmF5IG9mIHN0cnVjdHMKKyAgICAgICAgaWYgKHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgQXJyYXkpIHsKKyAgICAgICAgICAgIHRoaXMucnN0YWNrLnB1c2godGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0uc2hpZnQoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcjsKKyAgICB9LAorCisgICAgLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc3RydWN0LiAqLworICAgIHJlYWRTdHJ1Y3RFbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICBpZiAodGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMl0gaW5zdGFuY2VvZiBBcnJheSkgeworICAgICAgICAgICAgdGhpcy5yc3RhY2sucG9wKCk7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICAgQGNsYXNzCisgICAgICAgQG5hbWUgQW5vblJlYWRGaWVsZEJlZ2luUmV0dXJuCisgICAgICAgQHByb3BlcnR5IHtzdHJpbmd9IGZuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkIChhbHdheXMgJycpLgorICAgICAgIEBwcm9wZXJ0eSB7VGhyaWZ0LlR5cGV9IGZ0eXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZmllbGQuCisgICAgICAgQHByb3BlcnR5IHtudW1iZXJ9IGZpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZmllbGQuCisgICAgICovCisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBmaWVsZC4KKyAgICAgKiBAcmV0dXJucyB7QW5vblJlYWRGaWVsZEJlZ2luUmV0dXJufQorICAgICAqLworICAgIHJlYWRGaWVsZEJlZ2luOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHIgPSB7fTsKKworICAgICAgICB2YXIgZmlkID0gLTE7CisgICAgICAgIHZhciBmdHlwZSA9IFRocmlmdC5UeXBlLlNUT1A7CisKKyAgICAgICAgLy9nZXQgYSBmaWVsZElkCisgICAgICAgIGZvciAodmFyIGYgaW4gKHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdKSkgeworICAgICAgICAgICAgaWYgKGYgPT09IG51bGwpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpZCA9IHBhcnNlSW50KGYsIDEwKTsKKyAgICAgICAgICAgIHRoaXMucnBvcy5wdXNoKHRoaXMucnN0YWNrLmxlbmd0aCk7CisKKyAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdW2ZpZF07CisKKyAgICAgICAgICAgIC8vcmVtb3ZlIHNvIHdlIGRvbid0IHNlZSBpdCBhZ2FpbgorICAgICAgICAgICAgZGVsZXRlIHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdW2ZpZF07CisKKyAgICAgICAgICAgIHRoaXMucnN0YWNrLnB1c2goZmllbGQpOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWQgIT0gLTEpIHsKKworICAgICAgICAgICAgLy9zaG91bGQgb25seSBiZSAxIG9mIHRoZXNlIGJ1dCB0aGlzIGlzIHRoZSBvbmx5CisgICAgICAgICAgICAvL3dheSB0byBtYXRjaCBhIGtleQorICAgICAgICAgICAgZm9yICh2YXIgaSBpbiAodGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0pKSB7CisgICAgICAgICAgICAgICAgaWYgKFRocmlmdC5Qcm90b2NvbC5SVHlwZVtpXSA9PT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmdHlwZSA9IFRocmlmdC5Qcm90b2NvbC5SVHlwZVtpXTsKKyAgICAgICAgICAgICAgICB0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXSA9CisgICAgICAgICAgICAgICAgICAgIHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgci5mbmFtZSA9ICcnOworICAgICAgICByLmZ0eXBlID0gZnR5cGU7CisgICAgICAgIHIuZmlkID0gZmlkOworCisgICAgICAgIHJldHVybiByOworICAgIH0sCisKKyAgICAvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBmaWVsZC4gKi8KKyAgICByZWFkRmllbGRFbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgcG9zID0gdGhpcy5ycG9zLnBvcCgpOworCisgICAgICAgIC8vZ2V0IGJhY2sgdG8gdGhlIHJpZ2h0IHBsYWNlIGluIHRoZSBzdGFjaworICAgICAgICB3aGlsZSAodGhpcy5yc3RhY2subGVuZ3RoID4gcG9zKSB7CisgICAgICAgICAgICB0aGlzLnJzdGFjay5wb3AoKTsKKyAgICAgICAgfQorCisgICAgfSwKKworICAgIC8qKgorICAgICAgIEBjbGFzcworICAgICAgIEBuYW1lIEFub25SZWFkTWFwQmVnaW5SZXR1cm4KKyAgICAgICBAcHJvcGVydHkge1RocmlmdC5UeXBlfSBrdHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGtleS4KKyAgICAgICBAcHJvcGVydHkge1RocmlmdC5UeXBlfSB2dHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhbHVlLgorICAgICAgIEBwcm9wZXJ0eSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbWFwLgorICAgICAqLworICAgIC8qKgorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWFwLgorICAgICAqIEByZXR1cm5zIHtBbm9uUmVhZE1hcEJlZ2luUmV0dXJufQorICAgICAqLworICAgIHJlYWRNYXBCZWdpbjogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBtYXAgPSB0aGlzLnJzdGFjay5wb3AoKTsKKyAgICAgICAgdmFyIGZpcnN0ID0gbWFwLnNoaWZ0KCk7CisgICAgICAgIGlmIChmaXJzdCBpbnN0YW5jZW9mIEFycmF5KSB7CisgICAgICAgICAgdGhpcy5yc3RhY2sucHVzaChtYXApOworICAgICAgICAgIG1hcCA9IGZpcnN0OworICAgICAgICAgIGZpcnN0ID0gbWFwLnNoaWZ0KCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgciA9IHt9OworICAgICAgICByLmt0eXBlID0gVGhyaWZ0LlByb3RvY29sLlJUeXBlW2ZpcnN0XTsKKyAgICAgICAgci52dHlwZSA9IFRocmlmdC5Qcm90b2NvbC5SVHlwZVttYXAuc2hpZnQoKV07CisgICAgICAgIHIuc2l6ZSA9IG1hcC5zaGlmdCgpOworCisKKyAgICAgICAgdGhpcy5ycG9zLnB1c2godGhpcy5yc3RhY2subGVuZ3RoKTsKKyAgICAgICAgdGhpcy5yc3RhY2sucHVzaChtYXAuc2hpZnQoKSk7CisKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfSwKKworICAgIC8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIG1hcC4gKi8KKyAgICByZWFkTWFwRW5kOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy5yZWFkRmllbGRFbmQoKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICAgQGNsYXNzCisgICAgICAgQG5hbWUgQW5vblJlYWRDb2xCZWdpblJldHVybgorICAgICAgIEBwcm9wZXJ0eSB7VGhyaWZ0LlR5cGV9IGV0eXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZWxlbWVudC4KKyAgICAgICBAcHJvcGVydHkge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBsaXN0LgorICAgICAqIEByZXR1cm5zIHtBbm9uUmVhZENvbEJlZ2luUmV0dXJufQorICAgICAqLworICAgIHJlYWRMaXN0QmVnaW46IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgbGlzdCA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdOworCisgICAgICAgIHZhciByID0ge307CisgICAgICAgIHIuZXR5cGUgPSBUaHJpZnQuUHJvdG9jb2wuUlR5cGVbbGlzdC5zaGlmdCgpXTsKKyAgICAgICAgci5zaXplID0gbGlzdC5zaGlmdCgpOworCisgICAgICAgIHRoaXMucnBvcy5wdXNoKHRoaXMucnN0YWNrLmxlbmd0aCk7CisgICAgICAgIHRoaXMucnN0YWNrLnB1c2gobGlzdC5zaGlmdCgpKTsKKworICAgICAgICByZXR1cm4gcjsKKyAgICB9LAorCisgICAgLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbGlzdC4gKi8KKyAgICByZWFkTGlzdEVuZDogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBwb3MgPSB0aGlzLnJwb3MucG9wKCkgLSAyOworICAgICAgICB2YXIgc3QgPSB0aGlzLnJzdGFjazsKKyAgICAgICAgc3QucG9wKCk7CisgICAgICAgIGlmIChzdCBpbnN0YW5jZW9mIEFycmF5ICYmIHN0Lmxlbmd0aCA+IHBvcyAmJiBzdFtwb3NdLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICBzdC5wdXNoKHN0W3Bvc10uc2hpZnQoKSk7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZXQuCisgICAgICogQHJldHVybnMge0Fub25SZWFkQ29sQmVnaW5SZXR1cm59CisgICAgICovCisgICAgcmVhZFNldEJlZ2luOiBmdW5jdGlvbihlbGVtVHlwZSwgc2l6ZSkgeworICAgICAgICByZXR1cm4gdGhpcy5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgICB9LAorCisgICAgLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc2V0LiAqLworICAgIHJlYWRTZXRFbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZWFkTGlzdEVuZCgpOworICAgIH0sCisKKyAgICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0bworICAgICAqICBGYWxzZSB1bmxlc3MgdGhlIG5leHQgbnVtYmVyIGluIHRoZSBwcm90b2NvbCBidWZmZXIKKyAgICAgKiAgaXMgMSwgaW4gd2hpY2ggY2FzZSB0aGUgdmFsdWUgcHJvcGVydHkgaXMgVHJ1ZSAqLworICAgIHJlYWRCb29sOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRJMzIoKTsKKworICAgICAgICBpZiAociAhPT0gbnVsbCAmJiByLnZhbHVlID09ICcxJykgeworICAgICAgICAgICAgci52YWx1ZSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByLnZhbHVlID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcjsKKyAgICB9LAorCisgICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQorICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KKyAgICByZWFkQnl0ZTogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKKyAgICB9LAorCisgICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQorICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KKyAgICByZWFkSTE2OiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVhZEkzMigpOworICAgIH0sCisKKyAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlCisgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLworICAgIHJlYWRJMzI6IGZ1bmN0aW9uKGYpIHsKKyAgICAgICAgaWYgKGYgPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgZiA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHIgPSB7fTsKKworICAgICAgICBpZiAoZiBpbnN0YW5jZW9mIEFycmF5KSB7CisgICAgICAgICAgICBpZiAoZi5sZW5ndGggPT09IDApIHsKKyAgICAgICAgICAgICAgICByLnZhbHVlID0gdW5kZWZpbmVkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIWYuaXNSZXZlcnNlZCkgeworICAgICAgICAgICAgICAgICAgICBmLnJldmVyc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZi5pc1JldmVyc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgci52YWx1ZSA9IGYucG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZiBpbnN0YW5jZW9mIE9iamVjdCkgeworICAgICAgICAgICBmb3IgKHZhciBpIGluIGYpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMucnN0YWNrLnB1c2goZltpXSk7CisgICAgICAgICAgICAgICAgZGVsZXRlIGZbaV07CisKKyAgICAgICAgICAgICAgICByLnZhbHVlID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgci52YWx1ZSA9IGY7CisgICAgICAgICAgICB0aGlzLnJzdGFjay5wb3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByOworICAgIH0sCisKKyAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlCisgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLworICAgIHJlYWRJNjQ6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZWFkSTMyKCk7CisgICAgfSwKKworICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUKKyAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyICovCisgICAgcmVhZERvdWJsZTogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKKyAgICB9LAorCisgICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQorICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KKyAgICByZWFkU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRJMzIoKTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfSwKKworICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUKKyAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyICovCisgICAgcmVhZEJpbmFyeTogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciByID0gdGhpcy5yZWFkSTMyKCk7CisgICAgICAgIHIudmFsdWUgPSBhdG9iKHIudmFsdWUpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogTWV0aG9kIHRvIGFyYml0cmFyaWx5IHNraXAgb3ZlciBkYXRhICovCisgICAgc2tpcDogZnVuY3Rpb24odHlwZSkgeworICAgICAgICB2YXIgcmV0LCBpOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVGhyaWZ0LlR5cGUuU1RPUDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgY2FzZSBUaHJpZnQuVHlwZS5CT09MOgorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRCb29sKCk7CisKKyAgICAgICAgICAgIGNhc2UgVGhyaWZ0LlR5cGUuQllURToKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkQnl0ZSgpOworCisgICAgICAgICAgICBjYXNlIFRocmlmdC5UeXBlLkkxNjoKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkSTE2KCk7CisKKyAgICAgICAgICAgIGNhc2UgVGhyaWZ0LlR5cGUuSTMyOgorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKKworICAgICAgICAgICAgY2FzZSBUaHJpZnQuVHlwZS5JNjQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVhZEk2NCgpOworCisgICAgICAgICAgICBjYXNlIFRocmlmdC5UeXBlLkRPVUJMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkRG91YmxlKCk7CisKKyAgICAgICAgICAgIGNhc2UgVGhyaWZ0LlR5cGUuU1RSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRTdHJpbmcoKTsKKworICAgICAgICAgICAgY2FzZSBUaHJpZnQuVHlwZS5TVFJVQ1Q6CisgICAgICAgICAgICAgICAgdGhpcy5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSB0aGlzLnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQuZnR5cGUgPT0gVGhyaWZ0LlR5cGUuU1RPUCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwKHJldC5mdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMucmVhZEZpZWxkRW5kKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMucmVhZFN0cnVjdEVuZCgpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBjYXNlIFRocmlmdC5UeXBlLk1BUDoKKyAgICAgICAgICAgICAgICByZXQgPSB0aGlzLnJlYWRNYXBCZWdpbigpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByZXQuc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucnN0YWNrLmxlbmd0aCA+IHRoaXMucnBvc1t0aGlzLnJwb3MubGVuZ3RoIC0gMV0gKyAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwKHJldC5rdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcChyZXQudnR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLnJlYWRNYXBFbmQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgY2FzZSBUaHJpZnQuVHlwZS5TRVQ6CisgICAgICAgICAgICAgICAgcmV0ID0gdGhpcy5yZWFkU2V0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmV0LnNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXAocmV0LmV0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy5yZWFkU2V0RW5kKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIGNhc2UgVGhyaWZ0LlR5cGUuTElTVDoKKyAgICAgICAgICAgICAgICByZXQgPSB0aGlzLnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmV0LnNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXAocmV0LmV0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy5yZWFkTGlzdEVuZCgpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLklOVkFMSURfREFUQSk7CisgICAgICAgIH0KKyAgICB9Cit9OworCisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBNdXRpbHBsZXhQcm90b2NvbCBJbXBsZW1lbnRhdGlvbiBhcyBhIFdyYXBwZXIgZm9yIFRocmlmdC5Qcm90b2NvbAorICogQGNvbnN0cnVjdG9yCisgKi8KK1RocmlmdC5NdWx0aXBsZXhQcm90b2NvbCA9IGZ1bmN0aW9uKHNydk5hbWUsIHRyYW5zLCBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSkgeworICAgIFRocmlmdC5Qcm90b2NvbC5jYWxsKHRoaXMsIHRyYW5zLCBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSk7CisgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNydk5hbWU7Cit9OworVGhyaWZ0LmluaGVyaXRzKFRocmlmdC5NdWx0aXBsZXhQcm90b2NvbCwgVGhyaWZ0LlByb3RvY29sLCAnbXVsdGlwbGV4UHJvdG9jb2wnKTsKKworLyoqIE92ZXJyaWRlIHdyaXRlTWVzc2FnZUJlZ2luIG1ldGhvZCBvZiBwcm90b3R5cGUqLworVGhyaWZ0Lk11bHRpcGxleFByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIHNlcWlkKSB7CisKKyAgICBpZiAodHlwZSA9PT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLkNBTEwgfHwgdHlwZSA9PT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLk9ORVdBWSkgeworICAgICAgICBUaHJpZnQuUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luLmNhbGwodGhpcywgdGhpcy5zZXJ2aWNlTmFtZSArICc6JyArIG5hbWUsIHR5cGUsIHNlcWlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUaHJpZnQuUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luLmNhbGwodGhpcywgbmFtZSwgdHlwZSwgc2VxaWQpOworICAgIH0KK307CisKK1RocmlmdC5NdWx0aXBsZXhlciA9IGZ1bmN0aW9uKCkgeworICAgIHRoaXMuc2VxaWQgPSAwOworfTsKKworLyoqIEluc3RhbnRpYXRlcyBhIG11bHRpcGxleGVkIGNsaWVudCBmb3IgYSBzcGVjaWZpYyBzZXJ2aWNlCisgKiBAY29uc3RydWN0b3IKKyAqIEBwYXJhbSB7U3RyaW5nfSBzZXJ2aWNlTmFtZSAtIFRoZSB0cmFuc3BvcnQgdG8gc2VyaWFsaXplIHRvL2Zyb20uCisgKiBAcGFyYW0ge1RocmlmdC5TZXJ2aWNlQ2xpZW50fSBTQ2wgLSBUaGUgU2VydmljZSBDbGllbnQgQ2xhc3MKKyAqIEBwYXJhbSB7VGhyaWZ0LlRyYW5zcG9ydH0gdHJhbnNwb3J0IC0gVGhyaWZ0LlRyYW5zcG9ydCBpbnN0YW5jZSB3aGljaCBwcm92aWRlcyByZW1vdGUgaG9zdDpwb3J0CisgKiBAZXhhbXBsZQorICogICAgdmFyIG1wID0gbmV3IFRocmlmdC5NdWx0aXBsZXhlcigpOworICogICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCJodHRwOi8vbG9jYWxob3N0OjkwOTAvZm9vLnRocmlmdCIpOworICogICAgdmFyIHByb3RvY29sID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICogICAgdmFyIGNsaWVudCA9IG1wLmNyZWF0ZUNsaWVudCgnQXV0aFNlcnZpY2UnLCBBdXRoU2VydmljZUNsaWVudCwgdHJhbnNwb3J0KTsKKyovCitUaHJpZnQuTXVsdGlwbGV4ZXIucHJvdG90eXBlLmNyZWF0ZUNsaWVudCA9IGZ1bmN0aW9uKHNlcnZpY2VOYW1lLCBTQ2wsIHRyYW5zcG9ydCkgeworICAgIGlmIChTQ2wuQ2xpZW50KSB7CisgICAgICAgIFNDbCA9IFNDbC5DbGllbnQ7CisgICAgfQorICAgIHZhciBzZWxmID0gdGhpczsKKyAgICBTQ2wucHJvdG90eXBlLm5ld19zZXFpZCA9IGZ1bmN0aW9uKCkgeworICAgICAgICBzZWxmLnNlcWlkICs9IDE7CisgICAgICAgIHJldHVybiBzZWxmLnNlcWlkOworICAgIH07CisgICAgdmFyIGNsaWVudCA9IG5ldyBTQ2wobmV3IFRocmlmdC5NdWx0aXBsZXhQcm90b2NvbChzZXJ2aWNlTmFtZSwgdHJhbnNwb3J0KSk7CisKKyAgICByZXR1cm4gY2xpZW50OworfTsKKworCisKK3ZhciBjb3B5TGlzdCwgY29weU1hcDsKKworY29weUxpc3QgPSBmdW5jdGlvbihsc3QsIHR5cGVzKSB7CisKKyAgaWYgKCFsc3QpIHtyZXR1cm4gbHN0OyB9CisKKyAgdmFyIHR5cGU7CisKKyAgaWYgKHR5cGVzLnNoaWZ0ID09PSB1bmRlZmluZWQpIHsKKyAgICB0eXBlID0gdHlwZXM7CisgIH0KKyAgZWxzZSB7CisgICAgdHlwZSA9IHR5cGVzWzBdOworICB9CisgIHZhciBUeXBlID0gdHlwZTsKKworICB2YXIgbGVuID0gbHN0Lmxlbmd0aCwgcmVzdWx0ID0gW10sIGksIHZhbDsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgdmFsID0gbHN0W2ldOworICAgIGlmICh0eXBlID09PSBudWxsKSB7CisgICAgICByZXN1bHQucHVzaCh2YWwpOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlID09PSBjb3B5TWFwIHx8IHR5cGUgPT09IGNvcHlMaXN0KSB7CisgICAgICByZXN1bHQucHVzaCh0eXBlKHZhbCwgdHlwZXMuc2xpY2UoMSkpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICByZXN1bHQucHVzaChuZXcgVHlwZSh2YWwpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK307CisKK2NvcHlNYXAgPSBmdW5jdGlvbihvYmosIHR5cGVzKSB7CisKKyAgaWYgKCFvYmopIHtyZXR1cm4gb2JqOyB9CisKKyAgdmFyIHR5cGU7CisKKyAgaWYgKHR5cGVzLnNoaWZ0ID09PSB1bmRlZmluZWQpIHsKKyAgICB0eXBlID0gdHlwZXM7CisgIH0KKyAgZWxzZSB7CisgICAgdHlwZSA9IHR5cGVzWzBdOworICB9CisgIHZhciBUeXBlID0gdHlwZTsKKworICB2YXIgcmVzdWx0ID0ge30sIHZhbDsKKyAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHsKKyAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7CisgICAgICB2YWwgPSBvYmpbcHJvcF07CisgICAgICBpZiAodHlwZSA9PT0gbnVsbCkgeworICAgICAgICByZXN1bHRbcHJvcF0gPSB2YWw7CisgICAgICB9CisgICAgICBlbHNlIGlmICh0eXBlID09PSBjb3B5TWFwIHx8IHR5cGUgPT09IGNvcHlMaXN0KSB7CisgICAgICAgIHJlc3VsdFtwcm9wXSA9IHR5cGUodmFsLCB0eXBlcy5zbGljZSgxKSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcmVzdWx0W3Byb3BdID0gbmV3IFR5cGUodmFsKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK307CisKK1RocmlmdC5jb3B5TWFwID0gY29weU1hcDsKK1RocmlmdC5jb3B5TGlzdCA9IGNvcHlMaXN0OwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvUkVBRE1FLm1kIGIvbGliL2pzL3Rlc3QvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZDE0MGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC9SRUFETUUubWQKQEAgLTAsMCArMSw2OCBAQAorVGhyaWZ0IEphdmFzY3JpcHQgTGlicmFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PQorVGhpcyBicm93c2VyIGJhc2VkIEFwYWNoZSBUaHJpZnQgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMKK1JQQyBjbGllbnRzIHVzaW5nIHRoZSBKU09OIHByb3RvY29sIG92ZXIgSHR0cFtzXSB3aXRoIFhIUgorYW5kIFdlYlNvY2tldC4KKworTGljZW5zZQorLS0tLS0tLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKK1Rlc3QgU2VydmVycworLS0tLS0tLS0tLS0tCitkcnd4ci14ci14IDIgcmFuZHkgcmFuZHkgIDQwOTYgRmViICA4IDE1OjQ0IHNlYworLXJ3LXItLXItLSAxIHJhbmR5IHJhbmR5ICAyMTgzIEZlYiAgOSAwNDowMSBzZXJ2ZXJfaHR0cC5qcworLXJ3LXItLXItLSAxIHJhbmR5IHJhbmR5ICAyMzg2IEZlYiAgOSAwNTozOSBzZXJ2ZXJfaHR0cHMuanMKKworc2VydmVyX2h0dHAuanMgaXMgYSBOb2RlLmpzIHdlYiBzZXJ2ZXIgd2hpY2ggc3VwcG9ydCB0aGUKK3N0YW5kYXJkIEFwYWNoZSBUaHJpZnQgdGVzdCBzdWl0ZSAodGhyaWZ0L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQpLgorVGhlIHNlcnZlciBzdXBwb3J0cyBBcGFjaGUgVGhyaWZ0IFhIUiBhbmQgV2ViU29ja2V0IGNsaWVudHMuCisKK3NlcnZlcl9odHRwcy5qcyBpcyB0aGUgc2FtZSBidXQgdXNlcyBTU0wvVExTLiBUaGUgc2VydmVyIGtleSAKK2FuZCBjZXJ0IGFyZSBwdWxsZWQgZnJvbSB0aGUgdGhyaWZ0L3Rlc3Qva2V5cyBmb2xkZXIuCisKK0JvdGggb2YgdGhlc2Ugc2VydmVycyBzdXBwb3J0IFdlYlNvY2tldCAodGhlIGh0dHA6IHN1cHBvcnRzIHdzOiwKK2FuZCB0aGUgaHR0cHM6IHN1cHBvcnQgd3NzOikuCisKK1RvIHJ1biB0aGUgY2xpZW50IHRlc3Qgd2l0aCB0aGUgSmF2YSB0ZXN0IHNlcnZlciB1c2U6IAorJCBtYWtlIGNoZWNrIChyZXF1aXJlcyB0aGUgQXBhY2hlIFRocmlmdCBKYXZhIGJyYW5jaCAKK2FuZCBtYWtlIGNoZWNrIG11c3QgaGF2ZSBiZWVuIHJ1biBpbiB0aHJpZnQvbGliL2phdmEgCitwcmV2aW91c2x5KS4KKworVG8gcnVuIHRoZSBjbGllbnQgdGVzdHMgd2l0aCB0aGUgTm9kZSBzZXJ2ZXJzIHJ1biB0aGUgZ3J1bnQKKyBidWlsZCBpbiB0aGUgcGFyZW50IGpzIGRpcmVjdG9yeSAoc2VlIFJFQURNRSB0aGVyZSkuCisgCitUZXN0IENsaWVudHMKKy0tLS0tLS0tLS0tLQorLXJ3LXItLXItLSAxIHJhbmR5IHJhbmR5IDEzNTU4IEZlYiAgOSAwNzoxOCB0ZXN0LWFzeW5jLmpzCistcnctci0tci0tIDEgcmFuZHkgcmFuZHkgIDU3MjQgRmViICA5IDAzOjQ1IHRlc3RfaGFuZGxlci5qcworLXJ3eHIteHIteCAxIHJhbmR5IHJhbmR5ICAyNzE5IEZlYiAgOSAwNjowNCB0ZXN0Lmh0bWwKKy1ydy1yLS1yLS0gMSByYW5keSByYW5keSAgNDYxMSBGZWIgIDkgMDY6MDUgdGVzdC1qcS5qcworLXJ3eHIteHIteCAxIHJhbmR5IHJhbmR5IDEyMTUzIEZlYiAgOSAwNjowNCB0ZXN0LmpzCistcnctci0tci0tIDEgcmFuZHkgcmFuZHkgIDI1OTMgRmViICA5IDA2OjE2IHRlc3Qtbm9qcS5odG1sCistcnctci0tci0tIDEgcmFuZHkgcmFuZHkgIDE0NTAgRmViICA5IDA2OjE0IHRlc3Qtbm9qcS5qcworLXJ3LXItLXItLSAxIHJhbmR5IHJhbmR5ICAyODQ3IEZlYiAgOSAwNjozMSB0ZXN0d3MuaHRtbAorCitUaGVyZSBhcmUgdGhyZWUgaHRtbCB0ZXN0IGRyaXZlciBmaWxlcywgYWxsIG9mIHdoaWNoIGFyZQorUVVuaXQgYmFzZWQuIHRlc3QuaHRtbCB0ZXN0cyB0aGUgQXBhY2hlIFRocmlmdCBqUXVlcnkKK2dlbmVyYXRlZCBjb2RlICh0aHJpZnQgLWdlbiBqczpqcXVlcnkpLiBUaGUgdGVzdC1ub2pxLmh0bWwKK3J1bnMgYWxtb3N0IGlkZW50aWNhbCB0ZXN0cyBhZ2FpbnN0IG5vcm1hbCBKYXZhU2NyaXB0IGJ1aWxkcworKHRocmlmdCAtZ2VuIGpzKS4gQm90aCBvZiB0aGUgcHJldmlvdXMgdGVzdHMgdXNlIHRoZSBYSFIgCit0cmFuc3BvcnQuIFRoZSB0ZXN0d3MuaHRtbCBydW5zIHNpbWlsYXIgdGVzdHMgdXNpbmcgdGhlCitXZWJTb2NrZXQgdHJhbnNwb3J0LiBUaGUgdGVzdCouanMgZmlsZXMgYXJlIGxvYWRlZCBieSB0aGUKK2h0bWwgZHJpdmVycyBhbmQgY29udGFpbiB0aGUgYWN0dWFsIEFwYWNoZSBUaHJpZnQgdGVzdHMuCmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9idWlsZC5wcm9wZXJ0aWVzIGIvbGliL2pzL3Rlc3QvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDYzNjY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDUgQEAKKyMgTWF2ZW4gQW50IHRhc2tzIEphciBkZXRhaWxzCittdm4uYW50LnRhc2sudmVyc2lvbj0yLjEuMworbXZuLnJlcG89aHR0cDovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIKK212bi5hbnQudGFzay51cmw9JHttdm4ucmVwb30vb3JnL2FwYWNoZS9tYXZlbi9tYXZlbi1hbnQtdGFza3MvJHttdm4uYW50LnRhc2sudmVyc2lvbn0KK212bi5hbnQudGFzay5qYXI9bWF2ZW4tYW50LXRhc2tzLSR7bXZuLmFudC50YXNrLnZlcnNpb259LmphcgpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvYnVpbGQueG1sIGIvbGliL2pzL3Rlc3QvYnVpbGQueG1sCmluZGV4IDg2YWIyNzYuLjA0YzEzNjAgMTAwNzU1Ci0tLSBhL2xpYi9qcy90ZXN0L2J1aWxkLnhtbAorKysgYi9saWIvanMvdGVzdC9idWlsZC54bWwKQEAgLTMxLDE3ICszMSwyMSBAQAogICA8IS0tIHRoZSByb290IGRpcmVjdG9yeSwgd2hlcmUgeW91IHVucGFjayB0aHJpZnQgZGlzdGlidXRpb24gKGUuZy4gdGhyaWZ0LTAueC54LnRhci5neikgLS0+CiAgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuZGlyIiBsb2NhdGlvbj0iLi4vLi4vLi4vIiAvPgogICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmphdmEuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQuZGlyfS9saWIvamF2YSIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRvb2xzLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC90b29scy8iLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7YmFzZWRpcn0vYnVpbGQucHJvcGVydGllcyIvPgogCiAgIDwhLS0gSW5jbHVkZSB0aGUgYmFzZSBqYXZhIHByb3BlcnRpZXMgZmlsZSAtLT4KLSAgPHByb3BlcnR5IGZpbGU9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC5wcm9wZXJ0aWVzIiAvPgorICA8cHJvcGVydHkgZmlsZT0iJHt0aHJpZnQuamF2YS5kaXJ9L2dyYWRsZS5wcm9wZXJ0aWVzIiAvPgogCiAgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuY29tcGlsZXIiIGxvY2F0aW9uPSIke3RocmlmdC5kaXJ9L2NvbXBpbGVyL2NwcC90aHJpZnQiIC8+CiAKICAgPHBhdGggaWQ9ImxpYnMuY2xhc3NwYXRoIj4KLSAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC8iPgotICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+CisgICAgPGZpbGVzZXQgZGlyPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvbGlicyI+CisgICAgICA8aW5jbHVkZSBuYW1lPSJsaWJ0aHJpZnQqLmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpqYXZhZG9jLmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpzb3VyY2VzLmphciIgLz4KICAgICA8L2ZpbGVzZXQ+Ci0gICAgPGZpbGVzZXQgZGlyPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvbGliIj4KKyAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9kZXBzIj4KICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgogICAgIDwvZmlsZXNldD4KICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGR9L2xpYiI+CkBAIC01OSwxNSArNjMsMTYgQEAKICAgICAgIDxjb25kaXRpb24+CiAgICAgICAgIDxub3Q+CiAgICAgICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjIiPgotICAgICAgICAgICAgPGZpbGVzZXQgaWQ9ImZzIiBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZCI+CisgICAgICAgICAgICA8ZmlsZXNldCBpZD0iZnMiIGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2xpYnMiPgogICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJsaWJ0aHJpZnQqLmphciIgLz4KICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KmphdmFkb2MuamFyIiAvPgorICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqc291cmNlcy5qYXIiIC8+CiAgICAgICAgICAgICA8L2ZpbGVzZXQ+CiAgICAgICAgICAgPC9yZXNvdXJjZWNvdW50PgogICAgICAgICA8L25vdD4KICAgICAgIDwvY29uZGl0aW9uPgogICAgICAgWW91IG5lZWQgbGlidGhyaWZ0Ki5qYXIgYW5kIGxpYnRocmlmdCp0ZXN0LmphciBsb2NhdGVkIGF0Ci0gICAgICAke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQKKyAgICAgICR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9saWJzCiAgICAgICBEaWQgeW91IGNvbXBpbGUgVGhyaWZ0IEphdmEgbGlicmFyeSBhbmQgaXRzIHRlc3Qgc3VpdGUgYnkgImFudCBjb21waWxlLXRlc3QiPwogICAgIDwvZmFpbD4KICAgICA8ZmFpbD4KQEAgLTg0LDYgKzg5LDcgQEAKIAogICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9ImRlcGVuZGVuY2llcyI+CiAgICAgPHRzdGFtcCAvPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGQudG9vbHMuZGlyfSIvPgogICAgIDxta2RpciBkaXI9IiR7YnVpbGR9Ii8+CiAgICAgPG1rZGlyIGRpcj0iJHtidWlsZH0vanMvbGliIi8+CiAgICAgPG1rZGlyIGRpcj0iJHtidWlsZH0vbGliIi8+CkBAIC05MiwyMSArOTgsMTkgQEAKICAgICA8bWtkaXIgZGlyPSIke2J1aWxkfS90ZXN0L2xvZyIvPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9ImpzbGlicyIgZGVwZW5kcz0iaW5pdCwgcHJveHkiPgotICAgIDxnZXQgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjUuMi5qcyIgZGVzdD0iJHtidWlsZH0vanMvbGliIiB1c2V0aW1lc3RhbXA9InRydWUiLz4KLSAgICA8Z2V0IHNyYz0iaHR0cDovL2pzLXRlc3QtZHJpdmVyLmdvb2dsZWNvZGUuY29tL3N2bi90cnVuay9Kc1Rlc3REcml2ZXIvY29udHJpYi9xdW5pdC9zcmMvZXF1aXYuanMiIGRlc3Q9IiR7YnVpbGR9L2pzL2xpYiIgdXNldGltZXN0YW1wPSJ0cnVlIi8+Ci0gICAgPGdldCBzcmM9Imh0dHA6Ly9qcy10ZXN0LWRyaXZlci5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsvSnNUZXN0RHJpdmVyL2NvbnRyaWIvcXVuaXQvc3JjL1FVbml0QWRhcHRlci5qcyIgZGVzdD0iJHtidWlsZH0vanMvbGliIiB1c2V0aW1lc3RhbXA9InRydWUiLz4KKyAgPHRhcmdldCBuYW1lPSJkb3dubG9hZF9qc2xpYnMiPgorICAgIDxnZXQgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjExLjMubWluLmpzIiBkZXN0PSIke2J1aWxkfS9qcy9saWIvanF1ZXJ5LmpzIiB1c2V0aW1lc3RhbXA9InRydWUiLz4KKyAgICA8Z2V0IHNyYz0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9xdW5pdC9xdW5pdC0yLjYuMi5qcyIgZGVzdD0iJHtidWlsZH0vanMvbGliL3F1bml0LmpzIiB1c2V0aW1lc3RhbXA9InRydWUiLz4KKyAgICA8Z2V0IHNyYz0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9xdW5pdC9xdW5pdC0yLjYuMi5jc3MiIGRlc3Q9IiR7YnVpbGR9L2pzL2xpYi9xdW5pdC5jc3MiIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgorICA8L3RhcmdldD4KIAotICAgIDxnZXQgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL3F1bml0L2dpdC9xdW5pdC5qcyIgZGVzdD0iJHtidWlsZH0vanMvbGliIiB1c2V0aW1lc3RhbXA9InRydWUiLz4KLSAgICA8Z2V0IHNyYz0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9xdW5pdC9naXQvcXVuaXQuY3NzIiBkZXN0PSIke2J1aWxkfS9qcy9saWIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgotICAgIDwhLS0ganMtdGVzdC1kcml2ZXIgaGFzIGlzc3VlcyB3aXRoIHJlbGF0aXZlIHBhdGguLi5zbyB3ZSBuZWVkIGEgY29weSAtLT4KLSAgICA8Y29weSBmaWxlPSIuLi90aHJpZnQuanMiIHRvZGlyPSIke2J1aWxkfS9qcy8iLz4KKyAgPHRhcmdldCBuYW1lPSJqc2xpYnMiIGRlcGVuZHM9ImluaXQsIHByb3h5LCBkb3dubG9hZF9qc2xpYnMiPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJjb21waWxlIHRoZSB0ZXN0IHN1aXRlIiBkZXBlbmRzPSJpbml0LCBnZW5lcmF0ZSwgcmVzb2x2ZSI+CiAgICAgPCEtLSAvL1RPRE8gZW5hYmxlIDxjb21waWxlcmFyZyB2YWx1ZT0iLVhsaW50Ii8+LS0+Ci0gICAgPGphdmFjIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke2dlbmphdmF9IiBkZXN0ZGlyPSIke2J1aWxkfS90ZXN0IiBjbGFzc3BhdGhyZWY9ImxpYnMuY2xhc3NwYXRoIi8+Ci0gICAgPGphdmFjIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGR9L3Rlc3QiIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiLz4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7Z2VuamF2YX0iIGRlc3RkaXI9IiR7YnVpbGR9L3Rlc3QiIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiLz4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7c3JjfSIgZGVzdGRpcj0iJHtidWlsZH0vdGVzdCIgY2xhc3NwYXRocmVmPSJsaWJzLmNsYXNzcGF0aCIvPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImpzdGVzdCIgZGVzY3JpcHRpb249ImNyZWF0ZSB0aGUgdGVzdCBzdWl0ZSBqYXIgZmlsZSIgZGVwZW5kcz0iY29tcGlsZSI+CkBAIC0xNDQsNyArMTQ4LDcgQEAKICAgICAgIDxleGVjIGV4ZWN1dGFibGU9Ilh2ZmIiIHNwYXduPSJ0cnVlIiBmYWlsb25lcnJvcj0iZmFsc2UiPgogICAgICAgICA8YXJnIGxpbmU9Ijo5OSIgLz4KICAgICAgIDwvZXhlYz4KLSAgICAgIDxqYXZhIGNsYXNzbmFtZT0idGVzdC5IdHRwZCIgZm9yaz0idHJ1ZSIgdGltZW91dD0iNTAwMCIKKyAgICAgIDxqYXZhIGNsYXNzbmFtZT0idGVzdC5IdHRwZCIgZm9yaz0idHJ1ZSIgdGltZW91dD0iMTAwMDAiCiAgICAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJmYWxzZSIgb3V0cHV0PSIke2J1aWxkfS9sb2cvdW5pdHRlc3QubG9nIj4KICAgICAgICAgPGFyZyB2YWx1ZT0iLi4vIiAvPgogICAgICAgPC9qYXZhPgpAQCAtMTU5LDQxICsxNjMsNiBAQAogICAgIDwvcGFyYWxsZWw+CiAgIDwvdGFyZ2V0PgogCi0gIDx0YXJnZXQgbmFtZT0ianN0ZXN0ZHJpdmVyLXNlcnZlciIgZGVzY3JpcHRpb249InN0YXJ0IHRoZSBqcy10ZXN0LWRyaXZlciBzZXJ2ZXIiIGRlcGVuZHM9ImluaXQsIHJlc29sdmUiPgotICAgIDxlY2hvPlN0YXJ0aW5nIGpzLXRlc3QtZHJpdmVyIFNlcnZlci4uLjwvZWNobz4KLSAgICA8amF2YSBqYXI9IiR7YnVpbGR9L2xpYi9qc3Rlc3Rkcml2ZXItMS4zLjIuamFyIiBkaXI9Ii4iIGZvcms9InRydWUiCi0gICAgICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSIgb3V0cHV0PSIke2J1aWxkfS9sb2cvanN0ZXN0ZHJpdmVyLXNlcnZlci5sb2ciPgotICAgICAgPGFyZyBsaW5lPSItLXBvcnQgOTg3NiIvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJqc3Rlc3Rkcml2ZXIiIGRlc2NyaXB0aW9uPSJkbyB1bml0IHRlc3RzIHdpdGgganMtdGVzdC1kcml2ZXIiIGRlcGVuZHM9ImluaXQsIGpzdGVzdCwganNsaWJzIj4KLSAgICA8cGFyYWxsZWw+Ci0gICAgICA8amF2YSBjbGFzc25hbWU9InRlc3QuSHR0cGQiIGZvcms9InRydWUiIHRpbWVvdXQ9IjEwMDAwIgotICAgICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0iZmFsc2UiIG91dHB1dD0iJHtidWlsZH0vbG9nL3VuaXR0ZXN0LmxvZyI+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii4uLyIgLz4KLSAgICAgIDwvamF2YT4KLSAgICAgIDxzZXF1ZW50aWFsPgotICAgICAgICA8c2xlZXAgc2Vjb25kcz0iMiIvPgotICAgICAgICA8ZWNobz5SdW5uaW5nIFVuaXQgVGVzdHMgd2l0aCBqcy10ZXN0LWRyaXZlcjwvZWNobz4KLSAgICAgICAgICA8amF2YSBqYXI9IiR7YnVpbGR9L2xpYi9qc3Rlc3Rkcml2ZXItMS4zLjIuamFyIiBkaXI9Ii4iIGZvcms9InRydWUiIAotICAgICAgICAgICAgZmFpbG9uZXJyb3I9InRydWUiIG91dHB1dD0iJHtidWlsZH0vbG9nL2pzdGVzdGRyaXZlci5sb2ciPgotICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1jb25maWciIC8+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSJqc1Rlc3REcml2ZXIuY29uZiIgLz4KLQotICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1yZXNldCIgLz4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tdmVyYm9zZSIgLz4KLQotICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS10ZXN0cyIgLz4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9ImFsbCIgLz4KLQotICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS10ZXN0T3V0cHV0IiAvPgotICAgICAgICAgICAgPGFyZyB2YWx1ZT0iJHtidWlsZH0vdGVzdC9sb2cvIiAvPgotICAgICAgICA8L2phdmE+Ci0gICAgICA8L3NlcXVlbnRpYWw+Ci0gICAgPC9wYXJhbGxlbD4KLSAgPC90YXJnZXQ+Ci0KICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZSI+CiAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0aHJpZnQuY29tcGlsZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSI+CiAgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmEgJHt0aHJpZnQuZGlyfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IiAvPgpAQCAtMjAxLDYgKzE3MCw5IEBACiAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0aHJpZnQuY29tcGlsZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSI+CiAgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGpzOmpxdWVyeSAke3RocmlmdC5kaXJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiIC8+CiAgICAgPC9leGVjPgorICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7dGhyaWZ0LmNvbXBpbGVyfSIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyBsaW5lPSItLWdlbiBqczpqcXVlcnkgJHt0aHJpZnQuZGlyfS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IiAvPgorICAgIDwvZXhlYz4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0icnVuIHRlc3Qgc3VpdGUgKGxpbnQsIHVuaXR0ZXN0KSIgZGVwZW5kcz0ibGludCwgdW5pdHRlc3QiLz4KQEAgLTIxNiw3ICsxODgsNyBAQAogICAgIDxqc2w6anNsaW50IG9wdGlvbnM9ImV2aWwsZm9yaW4sYnJvd3NlcixiaXR3aXNlLHJlZ2V4cCxuZXdjYXAsaW1tZWQiIGVuY29kaW5nPSJVVEYtOCI+CiAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InBsYWluIiAvPgogICAgICAgPGZpbGVzZXQgZGlyPSIke2dlbmpzfSIgaW5jbHVkZXM9IioqLyouanMiIC8+Ci0gICAgICA8ZmlsZXNldCBkaXI9Ii4uIiBpbmNsdWRlcz0idGhyaWZ0LmpzIiAvPgorICAgICAgPGZpbGVzZXQgZGlyPSIuLi9zcmMiIGluY2x1ZGVzPSJ0aHJpZnQuanMiIC8+CiAKICAgICAgIDwhLS0gaXNzdWVzIHdpdGggdW5zYWZlIGNoYXJhY3RlciAtLT4KICAgICAgIDwhLS0gZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSIqdGVzdCouanMiIC8+IC0tPgpAQCAtMjM0LDcgKzIwNiw3IEBACiAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iZ2pzbGludCIgZmFpbGlmZXhlY3V0aW9uZmFpbHM9Im5vIj4KICAgICAgIDxhcmcgbGluZT0iLS1ub2pzZG9jIi8+CiAgICAgICA8YXJnIGxpbmU9IiR7Z2VuanN9LyouanMiLz4KLSAgICAgIDxhcmcgbGluZT0iLi4vdGhyaWZ0LmpzIi8+CisgICAgICA8YXJnIGxpbmU9Ii4uL3NyYy90aHJpZnQuanMiLz4KIAogICAgICAgPCEtLSBpc3N1ZXMgd2l0aCB1bnNhZmUgY2hhcmFjdGVyLCBldGMuIC0tPgogICAgICAgPCEtLSA8YXJnIGxpbmU9Iip0ZXN0Ki5qcyIvPiAtLT4KQEAgLTI0NywxNSArMjE5LDIzIEBACiAgICAgPGRlbGV0ZSBkaXI9IiR7Z2VuanN9IiAvPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9InJlc29sdmUiIHVubGVzcz0ibXZuLmZpbmlzaGVkIj4KKyAgPHRhcmdldCBuYW1lPSJtdm4uYW50LnRhc2tzLmRvd25sb2FkIiBkZXBlbmRzPSJpbml0LG12bi5hbnQudGFza3MuY2hlY2siIHVubGVzcz0ibXZuLmFudC50YXNrcy5mb3VuZCI+CisgICAgPGdldCBzcmM9IiR7bXZuLmFudC50YXNrLnVybH0vJHttdm4uYW50LnRhc2suamFyfSIgZGVzdD0iJHtidWlsZC50b29scy5kaXJ9LyR7bXZuLmFudC50YXNrLmphcn0iIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im12bi5hbnQudGFza3MuY2hlY2siPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im12bi5hbnQudGFza3MuZm91bmQiPgorICAgICAgPHR5cGVmb3VuZCB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCIgbmFtZT0iYXJ0aWZhY3QiLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJyZXNvbHZlIiBkZXBlbmRzPSJtdm4uYW50LnRhc2tzLmRvd25sb2FkIiB1bmxlc3M9Im12bi5maW5pc2hlZCI+CiAgICAgPHR5cGVkZWYgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiIGNsYXNzcGF0aD0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL3Rvb2xzLyR7bXZuLmFudC50YXNrLmphcn0iLz4KIAogICAgIDxhcnRpZmFjdDpkZXBlbmRlbmNpZXMgZmlsZXNldElkPSJqcy50ZXN0LmRlcGVuZGVuY3kuamFycyI+CiAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzIiBhcnRpZmFjdElkPSJodHRwY2xpZW50IiB2ZXJzaW9uPSI0LjAuMSIvPgogICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdvb2dsZWNvZGUuanNsaW50NGphdmEiIGFydGlmYWN0SWQ9ImpzbGludDRqYXZhLWFudCIgdmVyc2lvbj0iMS40LjYiLz4KLSAgICAgIDwhLS0gZ2V0IGpzdGVzdGRyaXZlci5qYXIgdmlhIG1hdmVuLS0+Ci0gICAgICA8cmVtb3RlUmVwb3NpdG9yeSBpZD0ianN0ZC1tYXZlbi1wbHVnaW4gZ29vZ2xlIGNvZGUgcmVwbyIgdXJsPSJodHRwOi8vanN0ZC1tYXZlbi1wbHVnaW4uZ29vZ2xlY29kZS5jb20vc3ZuL21hdmVuMiIvPgotICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdvb2dsZS5qc3Rlc3Rkcml2ZXIiIGFydGlmYWN0SWQ9Im1hdmVuLWpzdGVzdGRyaXZlci1wbHVnaW4iIHZlcnNpb249IjEuMy4yLjMiLz4KKyAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImV1Lm1lZHNlYS5taW1ldXRpbCIgYXJ0aWZhY3RJZD0ibWltZS11dGlsIiB2ZXJzaW9uPSIyLjEuMyIvPgogICAgIDwvYXJ0aWZhY3Q6ZGVwZW5kZW5jaWVzPgogCiAgICAgPCEtLSBDb3B5IHRoZSBkZXBlbmRlbmNpZXMgdG8gdGhlIGJ1aWxkL2xpYiBkaXIgLS0+CkBAIC0yNjMsOCArMjQzLDcgQEAKICAgICAgIDxmaWxlc2V0IHJlZmlkPSJqcy50ZXN0LmRlcGVuZGVuY3kuamFycyIvPgogICAgICAgPG1hcHBlciB0eXBlPSJmbGF0dGVuIi8+CiAgICAgPC9jb3B5PgotICAgIAorCiAgICAgPHByb3BlcnR5IG5hbWU9Im12bi5maW5pc2hlZCIgdmFsdWU9InRydWUiLz4KICAgPC90YXJnZXQ+CiA8L3Byb2plY3Q+Ci0KZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L2RlZXAtY29uc3RydWN0b3IudGVzdC5qcyBiL2xpYi9qcy90ZXN0L2RlZXAtY29uc3RydWN0b3IudGVzdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmQzYTFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzCkBAIC0wLDAgKzEsMjEzIEBACitmdW5jdGlvbiBzZXJpYWxpemUoZGF0YSkgeworICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgnL3NlcnZpY2UnKTsKKyAgY29uc3QgcHJvdG9jb2wgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CisgIHByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKCcnLCAwLCAwKTsKKyAgZGF0YS53cml0ZShwcm90b2NvbCk7CisgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworICByZXR1cm4gdHJhbnNwb3J0LnNlbmRfYnVmOworfQorCitmdW5jdGlvbiBkZXNlcmlhbGl6ZShzZXJpYWxpemVkLCB0eXBlKSB7CisgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCcvc2VydmljZScpOworICB0cmFuc3BvcnQuc2V0UmVjdkJ1ZmZlcihzZXJpYWxpemVkKTsKKyAgY29uc3QgcHJvdG9jb2wgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CisgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgY29uc3QgZGF0YSA9IG5ldyB0eXBlKCk7CisgIGRhdGEucmVhZChwcm90b2NvbCk7CisgIHByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCk7CisgIHJldHVybiBkYXRhOworfQorCisKK2Z1bmN0aW9uIGNyZWF0ZVRocmlmdE9iaigpIHsKKworICByZXR1cm4gbmV3IENvbXBsZXgoeworCisgICAgc3RydWN0X2ZpZWxkOiBuZXcgU2ltcGxlKHt2YWx1ZTogJ2EnfSksCisKKyAgICBzdHJ1Y3RfbGlzdF9maWVsZDogWworICAgICAgbmV3IFNpbXBsZSh7dmFsdWU6ICdiJ30pLAorICAgICAgbmV3IFNpbXBsZSh7dmFsdWU6ICdjJ30pCisgICAgXSwKKworICAgIHN0cnVjdF9zZXRfZmllbGQ6IFsKKyAgICAgIG5ldyBTaW1wbGUoe3ZhbHVlOiAnZCd9KSwKKyAgICAgIG5ldyBTaW1wbGUoe3ZhbHVlOiAnZSd9KQorICAgIF0sCisKKyAgICBzdHJ1Y3RfbWFwX2ZpZWxkOiB7CisgICAgICBBOiBuZXcgU2ltcGxlKHt2YWx1ZTogJ2YnfSksCisgICAgICBCOiBuZXcgU2ltcGxlKHt2YWx1ZTogJ2cnfSkKKyAgICB9LAorCisgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkOiBbCisgICAgICBbCisgICAgICAgIHsKKyAgICAgICAgICBDOiBbCisgICAgICAgICAgICBuZXcgU2ltcGxlKHt2YWx1ZTogJ2gnfSksCisgICAgICAgICAgICBuZXcgU2ltcGxlKHt2YWx1ZTogJ2knfSkKKyAgICAgICAgICBdCisgICAgICAgIH0KKyAgICAgIF0KKyAgICBdLAorCisKKyAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyOiB7CisgICAgICBEOiBbCisgICAgICAgIHsKKyAgICAgICAgICBEQTogbmV3IFNpbXBsZSh7dmFsdWU6ICdqJ30pCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICBEQjogbmV3IFNpbXBsZSh7dmFsdWU6ICdrJ30pCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorCisgICAgbGlzdF9vZl9saXN0X2ZpZWxkOiBbCisgICAgICAgWydvbmUnLCAndHdvJ10sCisgICAgICAgWyd0aHJlZScsICdmb3VyJ10sCisgICAgICAgWydmaXZlJywgJ3NpeCddCisgICAgXQorICB9CisgICk7Cit9CisKKworZnVuY3Rpb24gY3JlYXRlSnNPYmooKSB7CisKKyAgcmV0dXJuIHsKKworICAgIHN0cnVjdF9maWVsZDoge3ZhbHVlOiAnYSd9LAorCisgICAgc3RydWN0X2xpc3RfZmllbGQ6IFsKKyAgICAgIHt2YWx1ZTogJ2InfSwKKyAgICAgIHt2YWx1ZTogJ2MnfQorICAgIF0sCisKKyAgICBzdHJ1Y3Rfc2V0X2ZpZWxkOiBbCisgICAgICB7dmFsdWU6ICdkJ30sCisgICAgICB7dmFsdWU6ICdlJ30KKyAgICBdLAorCisgICAgc3RydWN0X21hcF9maWVsZDogeworICAgICAgQToge3ZhbHVlOiAnZid9LAorICAgICAgQjoge3ZhbHVlOiAnZyd9CisgICAgfSwKKworICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDogWworICAgICAgWworICAgICAgICB7CisgICAgICAgICAgQzogWworICAgICAgICAgICAge3ZhbHVlOiAnaCd9LAorICAgICAgICAgICAge3ZhbHVlOiAnaSd9CisgICAgICAgICAgXQorICAgICAgICB9CisgICAgICBdCisgICAgXSwKKworICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDI6IHsKKyAgICAgIEQ6IFsKKyAgICAgICAgeworICAgICAgICAgIERBOiB7dmFsdWU6ICdqJ30KKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgIERCOiB7dmFsdWU6ICdrJ30KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisKKyAgICBsaXN0X29mX2xpc3RfZmllbGQ6IFsKKyAgICAgIFsnb25lJywgJ3R3byddLAorICAgICAgWyd0aHJlZScsICdmb3VyJ10sCisgICAgICBbJ2ZpdmUnLCAnc2l4J10KKyAgIF0KKyAgfTsKK30KKworCitmdW5jdGlvbiBhc3NlcnRWYWx1ZXMob2JqLCBhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9maWVsZC52YWx1ZSwgJ2EnKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9saXN0X2ZpZWxkWzBdLnZhbHVlLCAnYicpOworICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X2xpc3RfZmllbGRbMV0udmFsdWUsICdjJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5zdHJ1Y3Rfc2V0X2ZpZWxkWzBdLnZhbHVlLCAnZCcpOworICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X3NldF9maWVsZFsxXS52YWx1ZSwgJ2UnKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9tYXBfZmllbGQuQS52YWx1ZSwgJ2YnKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9tYXBfZmllbGQuQi52YWx1ZSwgJ2cnKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzBdLnZhbHVlLCAnaCcpOworICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkWzBdWzBdLkNbMV0udmFsdWUsICdpJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMF0uREEudmFsdWUsICdqJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMV0uREIudmFsdWUsICdrJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5saXN0X29mX2xpc3RfZmllbGRbMF1bMF0sICdvbmUnKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFswXVsxXSwgJ3R3bycpOworICAgIGFzc2VydC5lcXVhbChvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzFdWzBdLCAndGhyZWUnKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsxXVsxXSwgJ2ZvdXInKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsyXVswXSwgJ2ZpdmUnKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsyXVsxXSwgJ3NpeCcpOworfQorCitjb25zdCBjYXNlcyA9IHsKKworICAnU2VyaWFsaXplL2Rlc2VyaWFsaXplIHNpbXBsZSBzdHJ1Y3Qgc2hvdWxkIHJldHVybiBlcXVhbCBvYmplY3QnOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCB0T2JqID0gbmV3IFNpbXBsZSh7dmFsdWU6ICdhJ30pOworICAgIGNvbnN0IHJlY2VpdmVkID0gZGVzZXJpYWxpemUoc2VyaWFsaXplKHRPYmopLCBTaW1wbGUpOworICAgIGFzc2VydC5vayh0T2JqICE9PSByZWNlaXZlZCk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbChyZWNlaXZlZCwgdE9iaik7CisgIH0sCisKKworICAnU2VyaWFsaXplL2Rlc2VyaWFsaXplIHNob3VsZCByZXR1cm4gZXF1YWwgb2JqZWN0JzogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgdE9iaiA9IGNyZWF0ZVRocmlmdE9iaigpOworICAgIGNvbnN0IHJlY2VpdmVkID0gZGVzZXJpYWxpemUoc2VyaWFsaXplKHRPYmopLCBDb21wbGV4KTsKKyAgICBhc3NlcnQub2sodE9iaiAhPT0gcmVjZWl2ZWQpOworICAgIGFzc2VydC5kZWVwRXF1YWwocmVjZWl2ZWQsIHRPYmopOworICB9LAorCisgICdOZXN0ZWQgc3RydWN0cyBhbmQgY29udGFpbmVycyBpbml0aWFsaXplZCBmcm9tIHBsYWluIGpzIG9iamVjdHMgc2hvdWxkIHNlcmlhbGl6ZSBzYW1lIGFzIGlmIGluaXRpYWxpemVkIGZyb20gdGhyaWZ0IG9iamVjdHMnOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCB0T2JqMSA9IGNyZWF0ZVRocmlmdE9iaigpOworICAgIGNvbnN0IHRPYmoyID0gbmV3IENvbXBsZXgoY3JlYXRlSnNPYmooKSk7CisgICAgYXNzZXJ0VmFsdWVzKHRPYmoyLCBhc3NlcnQpOworICAgIGFzc2VydC5lcXVhbChzZXJpYWxpemUodE9iajIpLCBzZXJpYWxpemUodE9iajEpKTsKKyAgfSwKKworICAnTW9kaWZpY2F0aW9ucyB0byBhcmdzIG9iamVjdCBzaG91bGQgbm90IGFmZmVjdCBjb25zdHJ1Y3RlZCBUaHJpZnQgb2JqZWN0JzogZnVuY3Rpb24oYXNzZXJ0KSB7CisKKyAgICBjb25zdCBhcmdzID0gY3JlYXRlSnNPYmooKTsKKyAgICBhc3NlcnRWYWx1ZXMoYXJncywgYXNzZXJ0KTsKKworICAgIGNvbnN0IHRPYmogPSBuZXcgQ29tcGxleChhcmdzKTsKKyAgICBhc3NlcnRWYWx1ZXModE9iaiwgYXNzZXJ0KTsKKworICAgIGFyZ3Muc3RydWN0X2ZpZWxkLnZhbHVlID0gJ1paWic7CisgICAgYXJncy5zdHJ1Y3RfbGlzdF9maWVsZFswXS52YWx1ZSA9ICdaWlonOworICAgIGFyZ3Muc3RydWN0X2xpc3RfZmllbGRbMV0udmFsdWUgPSAnWlpaJzsKKyAgICBhcmdzLnN0cnVjdF9zZXRfZmllbGRbMF0udmFsdWUgPSAnWlpaJzsKKyAgICBhcmdzLnN0cnVjdF9zZXRfZmllbGRbMV0udmFsdWUgPSAnWlpaJzsKKyAgICBhcmdzLnN0cnVjdF9tYXBfZmllbGQuQS52YWx1ZSA9ICdaWlonOworICAgIGFyZ3Muc3RydWN0X21hcF9maWVsZC5CLnZhbHVlID0gJ1paWic7CisgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1swXSA9ICdaWlonOworICAgIGFyZ3Muc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkWzBdWzBdLkNbMV0gPSAnWlpaJzsKKyAgICBhcmdzLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIuRFswXS5EQSA9ICdaWlonOworICAgIGFyZ3Muc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzBdLkRCID0gJ1paWic7CisKKyAgICBhc3NlcnRWYWx1ZXModE9iaiwgYXNzZXJ0KTsKKyAgfSwKKworICAnbnVsbHMgYXJlIG9rJzogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgdE9iaiA9IG5ldyBDb21wbGV4KHsKKyAgICAgIHN0cnVjdF9maWVsZDogbnVsbCwKKyAgICAgIHN0cnVjdF9saXN0X2ZpZWxkOiBudWxsLAorICAgICAgc3RydWN0X3NldF9maWVsZDogbnVsbCwKKyAgICAgIHN0cnVjdF9tYXBfZmllbGQ6IG51bGwsCisgICAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQ6IG51bGwsCisgICAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyOiBudWxsCisgICAgfSk7CisgICAgY29uc3QgcmVjZWl2ZWQgPSBkZXNlcmlhbGl6ZShzZXJpYWxpemUodE9iaiksIENvbXBsZXgpOworICAgIGFzc2VydC5vayh0T2JqICE9PSByZWNlaXZlZCk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCh0T2JqLCByZWNlaXZlZCk7CisgIH0KKworfTsKKworT2JqZWN0LmtleXMoY2FzZXMpLmZvckVhY2goZnVuY3Rpb24oY2FzZU5hbWUpIHsKKyAgUVVuaXQudGVzdChjYXNlTmFtZSwgY2FzZXNbY2FzZU5hbWVdKTsKK30pOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvanNUZXN0RHJpdmVyLmNvbmYgYi9saWIvanMvdGVzdC9qc1Rlc3REcml2ZXIuY29uZgppbmRleCAyMmU2MmVhLi5lYjE1ODhjIDEwMDc1NQotLS0gYS9saWIvanMvdGVzdC9qc1Rlc3REcml2ZXIuY29uZgorKysgYi9saWIvanMvdGVzdC9qc1Rlc3REcml2ZXIuY29uZgpAQCAtNSw4ICs1LDkgQEAKICAgLSBidWlsZC9qcy9saWIvZXF1aXYuanMKICAgLSBidWlsZC9qcy9saWIvUVVuaXRBZGFwdGVyLmpzCiAjIGRlcGVuZGVuY2llcwotICAtIGJ1aWxkL2pzL2xpYi9qcXVlcnktMS41LjIuanMKKyAgLSBidWlsZC9qcy9saWIvanF1ZXJ5LmpzCiAgIC0gYnVpbGQvanMvdGhyaWZ0LmpzCisgIC0gZ2VuLWpzL0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLmpzCiAgIC0gZ2VuLWpzL1RocmlmdFRlc3RfdHlwZXMuanMKICAgLSBnZW4tanMvVGhyaWZ0VGVzdC5qcwogIyB0aGUgdGVzdCBzdWl0ZQpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvcGhhbnRvbS1jbGllbnQuanMgYi9saWIvanMvdGVzdC9waGFudG9tLWNsaWVudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTE3ZTcxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvcGhhbnRvbS1jbGllbnQuanMKQEAgLTAsMCArMSwzODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyAvKiBqc2hpbnQgLVcxMDAgKi8KKworKGZ1bmN0aW9uKCkgeworICAndXNlIHN0cmljdCc7CisKKyAgLy8gUnVkaW1lbnRhcnkgdGVzdCBoZWxwZXIgZnVuY3Rpb25zCisgIC8vIFRPRE86IFJldHVybiBlcnJvciBjb2RlIGJhc2VkIG9uIGtpbmQgb2YgZXJyb3JzIHJhdGhlciB0aGFuIHRocm93CisgIHZhciBvayA9IGZ1bmN0aW9uKHQsIG1zZykgeworICAgIGlmICghdCkgeworICAgICAgY29uc29sZS5sb2coJyoqKiBGQUlMRUQgKioqJyk7CisgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTsKKyAgICB9CisgIH07CisgIHZhciBlcXVhbCA9IGZ1bmN0aW9uKGEsIGIpIHsKKyAgICBpZiAoYSAhPT0gYikgeworICAgICAgY29uc29sZS5sb2coJyoqKiBGQUlMRUQgKioqJyk7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKKyAgICB9CisgIH07CisgIHZhciB0ZXN0ID0gZnVuY3Rpb24obmFtZSwgZikgeworICAgIGNvbnNvbGUubG9nKCdURVNUIDogJyArIG5hbWUpOworICAgIGYoKTsKKyAgICBjb25zb2xlLmxvZygnT0tcbicpOworICB9OworCisgIHZhciBwYXJzZUFyZ3MgPSBmdW5jdGlvbihhcmdzKSB7CisgICAgdmFyIHNraXBzID0gWworICAgICAgJy0tdHJhbnNwb3J0PWh0dHAnLAorICAgICAgJy0tcHJvdG9jb2w9anNvbicKKyAgICBdOworICAgIHZhciBvcHRzID0geworICAgICAgcG9ydDogJzkwOTAnCisgICAgICAvLyBwcm90b2NvbDogJ2pzb24nLAorICAgIH07CisgICAgdmFyIGtleXMgPSB7fTsKKyAgICBmb3IgKHZhciBrZXkgaW4gb3B0cykgeworICAgICAga2V5c1snLS0nICsga2V5ICsgJz0nXSA9IGtleTsKKyAgICB9CisgICAgZm9yICh2YXIgaSBpbiBhcmdzKSB7CisgICAgICB2YXIgYXJnID0gYXJnc1tpXTsKKyAgICAgIGlmIChza2lwcy5pbmRleE9mKGFyZykgIT0gLTEpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB2YXIgaGl0ID0gZmFsc2U7CisgICAgICBmb3IgKHZhciBrIGluIGtleXMpIHsKKyAgICAgICAgaWYgKGFyZy5zbGljZSgwLCBrLmxlbmd0aCkgPT09IGspIHsKKyAgICAgICAgICBvcHRzW2tleXNba11dID0gYXJnLnNsaWNlKGsubGVuZ3RoKTsKKyAgICAgICAgICBoaXQgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIWhpdCkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gYXJndW1lbnQ6ICcgKyBhcmcpOworICAgICAgfQorICAgIH0KKyAgICBvcHRzLnBvcnQgPSBwYXJzZUludChvcHRzLnBvcnQsIDEwKTsKKyAgICBpZiAoIW9wdHMucG9ydCB8fCBvcHRzLnBvcnQgPCAxIHx8IG9wdHMucG9ydCA+IDY1NTM1KSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcG9ydCBudW1iZXInKTsKKyAgICB9CisgICAgcmV0dXJuIG9wdHM7CisgIH07CisKKyAgdmFyIGV4ZWN1dGUgPSBmdW5jdGlvbigpIHsKKyAgICBjb25zb2xlLmxvZygnIyMjIEFwYWNoZSBUaHJpZnQgSmF2YXNjcmlwdCBzdGFuZGFsb25lIHRlc3QgY2xpZW50Jyk7CisgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpOworCisgICAgcGhhbnRvbS5wYWdlLmluamVjdEpzKCdzcmMvdGhyaWZ0LmpzJyk7CisgICAgcGhhbnRvbS5wYWdlLmluamVjdEpzKCd0ZXN0L2dlbi1qcy9UaHJpZnRUZXN0X3R5cGVzLmpzJyk7CisgICAgcGhhbnRvbS5wYWdlLmluamVjdEpzKCd0ZXN0L2dlbi1qcy9UaHJpZnRUZXN0LmpzJyk7CisKKyAgICB2YXIgc3lzdGVtID0gcmVxdWlyZSgnc3lzdGVtJyk7CisgICAgdmFyIG9wdHMgPSBwYXJzZUFyZ3Moc3lzdGVtLmFyZ3Muc2xpY2UoMSkpOworICAgIHZhciBwb3J0ID0gb3B0cy5wb3J0OworICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgnaHR0cDovL2xvY2FsaG9zdDonICsgcG9ydCArICcvc2VydmljZScpOworICAgIHZhciBwcm90b2NvbCA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICB2YXIgY2xpZW50ID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CisKKworICAgIC8vIFRPRE86IFJlbW92ZSBkdXBsaWNhdGUgY29kZSB3aXRoIHRlc3QuanMuCisgICAgLy8gYWxsIExhbmd1YWdlcyBpbiBVVEYtOAorICAgIHZhciBzdHJpbmdUZXN0ID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOworCisgICAgZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVseShtYXAxLCBtYXAyKSB7CisgICAgICBpZiAodHlwZW9mIG1hcDEgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG1hcDIgIT09ICdmdW5jdGlvbicpIHsKKyAgICAgICAgaWYgKCFtYXAxIHx8IHR5cGVvZiBtYXAxICE9PSAnb2JqZWN0JykgeworICAgICAgICAgIGVxdWFsKG1hcDEsIG1hcDIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAodmFyIGtleSBpbiBtYXAxKSB7CisgICAgICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB0ZXN0KCdWb2lkJywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdFZvaWQoKSwgdW5kZWZpbmVkKTsKKyAgICB9KTsKKyAgICB0ZXN0KCdCaW5hcnkgKFN0cmluZyknLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBiaW5hcnkgPSAnJzsKKyAgICAgIGZvciAodmFyIHYgPSAyNTU7IHYgPj0gMDsgLS12KSB7CisgICAgICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHYpOworICAgICAgfQorICAgICAgZXF1YWwoY2xpZW50LnRlc3RCaW5hcnkoYmluYXJ5KSwgYmluYXJ5KTsKKyAgICB9KTsKKyAgICB0ZXN0KCdCaW5hcnkgKFVpbnQ4QXJyYXkpJywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgYmluYXJ5ID0gJyc7CisgICAgICBmb3IgKHZhciB2ID0gMjU1OyB2ID49IDA7IC0tdikgeworICAgICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh2KTsKKyAgICAgIH0KKyAgICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheShiaW5hcnkubGVuZ3RoKTsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmluYXJ5Lmxlbmd0aDsgKytpKSB7CisgICAgICAgIGFycltpXSA9IGJpbmFyeVtpXS5jaGFyQ29kZUF0KCk7CisgICAgICB9CisgICAgICBlcXVhbChjbGllbnQudGVzdEJpbmFyeShhcnIpLCBiaW5hcnkpOworICAgIH0pOworICAgIHRlc3QoJ1N0cmluZycsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoJycpLCAnJyk7CisgICAgICBlcXVhbChjbGllbnQudGVzdFN0cmluZyhzdHJpbmdUZXN0KSwgc3RyaW5nVGVzdCk7CisKKyAgICAgIHZhciBzcGVjaWFsQ2hhcmFjdGVycyA9ICdxdW90ZTogXCIgYmFja3NsYXNoOicgKworICAgICAgICAnIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcLyAnICsKKyAgICAgICAgICAnIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAnICsKKyAgICAgICAgICAgICcgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiAiXFxcL1xiXG5cclx0JyArCisgICAgICAgICAgICAgICcgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCc7CisgICAgICAgICAgICAgIGVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKHNwZWNpYWxDaGFyYWN0ZXJzKSwgc3BlY2lhbENoYXJhY3RlcnMpOworICAgIH0pOworICAgIHRlc3QoJ0RvdWJsZScsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWwoY2xpZW50LnRlc3REb3VibGUoMCksIDApOworICAgICAgZXF1YWwoY2xpZW50LnRlc3REb3VibGUoLTEpLCAtMSk7CisgICAgICBlcXVhbChjbGllbnQudGVzdERvdWJsZSgzLjE0KSwgMy4xNCk7CisgICAgICBlcXVhbChjbGllbnQudGVzdERvdWJsZShNYXRoLnBvdygyLCA2MCkpLCBNYXRoLnBvdygyLCA2MCkpOworICAgIH0pOworICAgIHRlc3QoJ0Jvb2wnLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0Qm9vbCh0cnVlKSwgdHJ1ZSk7CisgICAgICBlcXVhbChjbGllbnQudGVzdEJvb2woZmFsc2UpLCBmYWxzZSk7CisgICAgfSk7CisgICAgdGVzdCgnSTgnLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0Qnl0ZSgwKSwgMCk7CisgICAgICBlcXVhbChjbGllbnQudGVzdEJ5dGUoMHgwMSksIDB4MDEpOworICAgIH0pOworICAgIHRlc3QoJ0kzMicsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWwoY2xpZW50LnRlc3RJMzIoMCksIDApOworICAgICAgZXF1YWwoY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwgMzApKSwgTWF0aC5wb3coMiwgMzApKTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0STMyKC1NYXRoLnBvdygyLCAzMCkpLCAtTWF0aC5wb3coMiwgMzApKTsKKyAgICB9KTsKKyAgICB0ZXN0KCdJNjQnLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0STY0KDApLCAwKTsKKyAgICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsIDUyKSksIE1hdGgucG93KDIsIDUyKSk7CisgICAgICBlcXVhbChjbGllbnQudGVzdEk2NCgtTWF0aC5wb3coMiwgNTIpKSwgLU1hdGgucG93KDIsIDUyKSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdTdHJ1Y3QnLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBzdHJ1Y3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKKyAgICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICAgIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKKyAgICAgIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAzMCk7CisgICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOworCisgICAgICB2YXIgc3RydWN0VGVzdE91dHB1dCA9IGNsaWVudC50ZXN0U3RydWN0KHN0cnVjdFRlc3RJbnB1dCk7CisKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuc3RyaW5nX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nKTsKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuYnl0ZV90aGluZywgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOworICAgICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5pMzJfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworICAgICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOworCisgICAgICBlcXVhbChKU09OLnN0cmluZ2lmeShzdHJ1Y3RUZXN0T3V0cHV0KSwgSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdElucHV0KSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdOZXN0JywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgeHRyVGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgICAgICB4dHJUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CisgICAgICB4dHJUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgICB4dHJUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOworICAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgICAgeHRyVGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgICAgdmFyIG5lc3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QyKCk7CisgICAgICBuZXN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAyOworICAgICAgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcgPSB4dHJUZXN0SW5wdXQ7CisgICAgICBuZXN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDE1KTsKKworICAgICAgdmFyIG5lc3RUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3ROZXN0KG5lc3RUZXN0SW5wdXQpOworCisgICAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOworICAgICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nKTsKKyAgICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nKTsKKyAgICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZyk7CisgICAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcpOworICAgICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LmkzMl90aGluZyk7CisKKyAgICAgIGVxdWFsKEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0T3V0cHV0KSwgSlNPTi5zdHJpbmdpZnkobmVzdFRlc3RJbnB1dCkpOworICAgIH0pOworCisgICAgdGVzdCgnTWFwJywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgbWFwVGVzdElucHV0ID0gezc6IDc3LCA4OiA4OCwgOTogOTl9OworCisgICAgICB2YXIgbWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TWFwKG1hcFRlc3RJbnB1dCk7CisKKyAgICAgIGZvciAodmFyIGtleSBpbiBtYXBUZXN0T3V0cHV0KSB7CisgICAgICAgIGVxdWFsKG1hcFRlc3RPdXRwdXRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOworICAgICAgfQorICAgIH0pOworCisgICAgdGVzdCgnU3RyaW5nTWFwJywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgbWFwVGVzdElucHV0ID0geworICAgICAgICAnYSc6ICcxMjMnLCAnYSBiJzogJ3dpdGggc3BhY2VzICcsICdzYW1lJzogJ3NhbWUnLCAnMCc6ICdudW1lcmljIGtleScsCisgICAgICAgICdsb25nVmFsdWUnOiBzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiAnbG9uZyBrZXknCisgICAgICB9OworCisgICAgICB2YXIgbWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0U3RyaW5nTWFwKG1hcFRlc3RJbnB1dCk7CisKKyAgICAgIGZvciAodmFyIGtleSBpbiBtYXBUZXN0T3V0cHV0KSB7CisgICAgICAgIGVxdWFsKG1hcFRlc3RPdXRwdXRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOworICAgICAgfQorICAgIH0pOworCisgICAgdGVzdCgnU2V0JywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgc2V0VGVzdElucHV0ID0gWzEsIDIsIDNdOworICAgICAgb2soY2xpZW50LnRlc3RTZXQoc2V0VGVzdElucHV0KSwgc2V0VGVzdElucHV0KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ0xpc3QnLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBsaXN0VGVzdElucHV0ID0gWzEsIDIsIDNdOworICAgICAgb2soY2xpZW50LnRlc3RMaXN0KGxpc3RUZXN0SW5wdXQpLCBsaXN0VGVzdElucHV0KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ0VudW0nLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0RW51bShUaHJpZnRUZXN0Lk51bWJlcnouT05FKSwgVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUeXBlRGVmJywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdFR5cGVkZWYoNjkpLCA2OSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdTa2lwJywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgc3RydWN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgICAgICB2YXIgbW9kaWZpZWRDbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKworICAgICAgbW9kaWZpZWRDbGllbnQucmVjdl90ZXN0U3RydWN0ID0gZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBpbnB1dCA9IG1vZGlmaWVkQ2xpZW50LmlucHV0OworICAgICAgICB2YXIgeHRydWN0MyA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDMoKTsKKworICAgICAgICBpbnB1dC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICAgIGlucHV0LnJlYWRTdHJ1Y3RCZWdpbigpOworCisgICAgICAgIC8vIHJlYWQgWHRydWN0IGRhdGEgd2l0aCBYdHJ1Y3QzCisgICAgICAgIGlucHV0LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIHh0cnVjdDMucmVhZChpbnB1dCk7CisgICAgICAgIGlucHV0LnJlYWRGaWVsZEVuZCgpOworICAgICAgICAvLyByZWFkIFRocmlmdC5UeXBlLlNUT1AgbWVzc2FnZQorICAgICAgICBpbnB1dC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICBpbnB1dC5yZWFkRmllbGRFbmQoKTsKKworICAgICAgICBpbnB1dC5yZWFkU3RydWN0RW5kKCk7CisgICAgICAgIGlucHV0LnJlYWRNZXNzYWdlRW5kKCk7CisKKyAgICAgICAgcmV0dXJuIHh0cnVjdDM7CisgICAgICB9OworCisgICAgICBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CisgICAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgICBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOworICAgICAgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgICAgdmFyIHN0cnVjdFRlc3RPdXRwdXQgPSBtb2RpZmllZENsaWVudC50ZXN0U3RydWN0KHN0cnVjdFRlc3RJbnB1dCk7CisKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQgaW5zdGFuY2VvZiBUaHJpZnRUZXN0Llh0cnVjdDMsIHRydWUpOworICAgICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5zdHJpbmdfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcpOworICAgICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5jaGFuZ2VkLCBudWxsKTsKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTY0X3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ01hcE1hcCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCA9IHsKKyAgICAgICAgJzQnOiB7JzEnOiAxLCAnMic6IDIsICczJzogMywgJzQnOiA0fSwKKyAgICAgICAgJy00JzogeyctNCc6IC00LCAnLTMnOiAtMywgJy0yJzogLTIsICctMSc6IC0xfQorICAgICAgfTsKKworICAgICAgdmFyIG1hcE1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdE1hcE1hcCgxKTsKKworCisgICAgICBmb3IgKHZhciBrZXkgaW4gbWFwTWFwVGVzdE91dHB1dCkgeworICAgICAgICBmb3IgKHZhciBrZXkyIGluIG1hcE1hcFRlc3RPdXRwdXRba2V5XSkgeworICAgICAgICAgIGVxdWFsKG1hcE1hcFRlc3RPdXRwdXRba2V5XVtrZXkyXSwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0W2tleV1ba2V5Ml0pOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkobWFwTWFwVGVzdE91dHB1dCwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1hjZXB0aW9uJywgZnVuY3Rpb24oKSB7CisgICAgICB0cnkgeworICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKTsKKyAgICAgICAgb2soZmFsc2UpOworICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICBlcXVhbChlLmVycm9yQ29kZSwgMTAwMSk7CisgICAgICAgIGVxdWFsKGUubWVzc2FnZSwgJ1hjZXB0aW9uJyk7CisgICAgICB9CisgICAgfSk7CisKKyAgICB0ZXN0KCdubyBFeGNlcHRpb24nLCBmdW5jdGlvbigpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdubyBFeGNlcHRpb24nKTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgb2soZmFsc2UpOworICAgICAgfQorICAgIH0pOworCisgICAgdGVzdCgnVEV4Y2VwdGlvbicsIGZ1bmN0aW9uKCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1RFeGNlcHRpb24nKTsKKyAgICAgICAgb2soZmFsc2UpOworICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICBvayhvayk7CisgICAgICB9CisgICAgfSk7CisKKyAgICB2YXIgY3JhenkgPSB7CisgICAgICAndXNlck1hcCc6IHsgJzUnOiA1LCAnOCc6IDggfSwKKyAgICAgICd4dHJ1Y3RzJzogW3sKKyAgICAgICAgJ3N0cmluZ190aGluZyc6ICdHb29kYnllNCcsCisgICAgICAgICdieXRlX3RoaW5nJzogNCwKKyAgICAgICAgJ2kzMl90aGluZyc6IDQsCisgICAgICAgICdpNjRfdGhpbmcnOiA0CisgICAgICB9LAorICAgICAgeworICAgICAgICAnc3RyaW5nX3RoaW5nJzogJ0hlbGxvMicsCisgICAgICAgICdieXRlX3RoaW5nJzogMiwKKyAgICAgICAgJ2kzMl90aGluZyc6IDIsCisgICAgICAgICdpNjRfdGhpbmcnOiAyCisgICAgICB9XQorICAgIH07CisgICAgdGVzdCgnSW5zYW5pdHknLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBpbnNhbml0eSA9IHsKKyAgICAgICAgJzEnOiB7CisgICAgICAgICAgJzInOiBjcmF6eSwKKyAgICAgICAgICAnMyc6IGNyYXp5CisgICAgICAgIH0sCisgICAgICAgICcyJzogeyAnNic6IHsgJ3VzZXJNYXAnOiBudWxsLCAneHRydWN0cyc6IG51bGwgfSB9CisgICAgICB9OworICAgICAgdmFyIHJlcyA9IGNsaWVudC50ZXN0SW5zYW5pdHkobmV3IFRocmlmdFRlc3QuSW5zYW5pdHkoY3JhenkpKTsKKyAgICAgIG9rKHJlcywgSlNPTi5zdHJpbmdpZnkocmVzKSk7CisgICAgICBvayhpbnNhbml0eSwgSlNPTi5zdHJpbmdpZnkoaW5zYW5pdHkpKTsKKworICAgICAgY2hlY2tSZWN1cnNpdmVseShyZXMsIGluc2FuaXR5KTsKKyAgICB9KTsKKworICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTsKKyAgICBjb25zb2xlLmxvZygnIyMjIEFsbCB0ZXN0cyBzdWNjZWVkZWQuJyk7CisgICAgcmV0dXJuIDA7CisgIH07CisKKyAgdHJ5IHsKKyAgICB2YXIgcmV0ID0gZXhlY3V0ZSgpOworICAgIHBoYW50b20uZXhpdChyZXQpOworICB9IGNhdGNoIChlcnIpIHsKKyAgICAvLyBDYXRjaCBhbGwgYW5kIGV4aXQgdG8gYXZvaWQgaGFuZy4KKyAgICBjb25zb2xlLmVycm9yKGVycik7CisgICAgcGhhbnRvbS5leGl0KDEpOworICB9Cit9KSgpOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvcGhhbnRvbWpzLXF1bml0LmpzIGIvbGliL2pzL3Rlc3QvcGhhbnRvbWpzLXF1bml0LmpzCmluZGV4IGQ1MmI1MjIuLmMxZDdhNWIgMTAwNzU1Ci0tLSBhL2xpYi9qcy90ZXN0L3BoYW50b21qcy1xdW5pdC5qcworKysgYi9saWIvanMvdGVzdC9waGFudG9tanMtcXVuaXQuanMKQEAgLTEsMyArMSw1IEBACisvKmpzaGludCBldmlsOnRydWUqLworCiAvKiBUaGlzIGZpbGUgaXMgb25seSB1c2VkIGJ5IHRoZSB0ZXN0IHN1aXRlLgogICoKICAqIE9yaWdpbjogIGh0dHBzOi8vZ2l0aHViLmNvbS9hcml5YS9waGFudG9tanMvYmxvYi9tYXN0ZXIvZXhhbXBsZXMvcnVuLXF1bml0LmpzCkBAIC02LDYgKzgsOCBAQAogICogSW5jbHVzaW9uIGludG8gQXBhY2hlIHByb2R1Y3RzIGlzIGFsbG93ZWQgYWNjb3JkaW5nIHRvIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9sZWdhbC8zcGFydHkuaHRtbAogICovCiAKK3ZhciBzeXN0ZW0gPSByZXF1aXJlKCdzeXN0ZW0nKTsKKwogCiAvKioKICAqIFdhaXQgdW50aWwgdGhlIHRlc3QgY29uZGl0aW9uIGlzIHRydWUgb3IgYSB0aW1lb3V0IG9jY3Vycy4gVXNlZnVsIGZvciB3YWl0aW5nCkBAIC0yNCwyNiArMjgsMzAgQEAKICAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKICAgICAgICAgY29uZGl0aW9uID0gZmFsc2UsCiAgICAgICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICBpZiAoIChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0IDwgbWF4dGltZU91dE1pbGxpcykgJiYgIWNvbmRpdGlvbiApIHsKKyAgICAgICAgICAgIGlmICgobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydCA8IG1heHRpbWVPdXRNaWxsaXMpICYmICFjb25kaXRpb24pIHsKICAgICAgICAgICAgICAgICAvLyBJZiBub3QgdGltZS1vdXQgeWV0IGFuZCBjb25kaXRpb24gbm90IHlldCBmdWxmaWxsZWQKLSAgICAgICAgICAgICAgICBjb25kaXRpb24gPSAodHlwZW9mKHRlc3RGeCkgPT09ICJzdHJpbmciID8gZXZhbCh0ZXN0RngpIDogdGVzdEZ4KCkpOyAvLzwgZGVmZW5zaXZlIGNvZGUKKyAgICAgICAgICAgICAgICBjb25kaXRpb24gPSAodHlwZW9mKHRlc3RGeCkgPT09ICdzdHJpbmcnID8gZXZhbCh0ZXN0RngpIDogdGVzdEZ4KCkpOyAvLzwgZGVmZW5zaXZlIGNvZGUKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYoIWNvbmRpdGlvbikgeworICAgICAgICAgICAgICAgIGlmICghY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIElmIGNvbmRpdGlvbiBzdGlsbCBub3QgZnVsZmlsbGVkICh0aW1lb3V0IGJ1dCBjb25kaXRpb24gaXMgJ2ZhbHNlJykKICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIid3YWl0Rm9yKCknIHRpbWVvdXQiKTsKICAgICAgICAgICAgICAgICAgICAgcGhhbnRvbS5leGl0KDEpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIENvbmRpdGlvbiBmdWxmaWxsZWQgKHRpbWVvdXQgYW5kL29yIGNvbmRpdGlvbiBpcyAndHJ1ZScpCi0gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCInd2FpdEZvcigpJyBmaW5pc2hlZCBpbiAiICsgKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQpICsgIm1zLiIpOwotICAgICAgICAgICAgICAgICAgICB0eXBlb2Yob25SZWFkeSkgPT09ICJzdHJpbmciID8gZXZhbChvblJlYWR5KSA6IG9uUmVhZHkoKTsgLy88IERvIHdoYXQgaXQncyBzdXBwb3NlZCB0byBkbyBvbmNlIHRoZSBjb25kaXRpb24gaXMgZnVsZmlsbGVkCisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCInd2FpdEZvcigpJyBmaW5pc2hlZCBpbiAiICsgKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQpICsgJ21zLicpOworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKG9uUmVhZHkpID09PSAnc3RyaW5nJykgeworICAgICAgICAgICAgICAgICAgICAgICAgZXZhbChvblJlYWR5KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uUmVhZHkoKTsgLy88IERvIHdoYXQgaXQncyBzdXBwb3NlZCB0byBkbyBvbmNlIHRoZSBjb25kaXRpb24gaXMgZnVsZmlsbGVkCisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7IC8vPCBTdG9wIHRoaXMgaW50ZXJ2YWwKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0sIDEwMCk7IC8vPCByZXBlYXQgY2hlY2sgZXZlcnkgMjUwbXMKLX07Cit9CiAKIAotaWYgKHBoYW50b20uYXJncy5sZW5ndGggPT09IDAgfHwgcGhhbnRvbS5hcmdzLmxlbmd0aCA+IDIpIHsKK2lmIChzeXN0ZW0uYXJncy5sZW5ndGggPT09IDEgfHwgc3lzdGVtLmFyZ3MubGVuZ3RoID4gMykgewogICAgIGNvbnNvbGUubG9nKCdVc2FnZTogcGhhbnRvbWpzIHBoYW50b21qcy1xdW5pdC5qcyBVUkwnKTsKICAgICBwaGFudG9tLmV4aXQoMSk7CiB9CkBAIC01NSwyMSArNjMsMjEgQEAKICAgICBjb25zb2xlLmxvZyhtc2cpOwogfTsKIAotcGFnZS5vcGVuKHBoYW50b20uYXJnc1swXSwgZnVuY3Rpb24oc3RhdHVzKXsKLSAgICBpZiAoc3RhdHVzICE9PSAic3VjY2VzcyIpIHsKLSAgICAgICAgY29uc29sZS5sb2coIlVuYWJsZSB0byBhY2Nlc3MgbmV0d29yayIpOworcGFnZS5vcGVuKHN5c3RlbS5hcmdzWzFdLCBmdW5jdGlvbihzdGF0dXMpIHsKKyAgICBpZiAoc3RhdHVzICE9PSAnc3VjY2VzcycpIHsKKyAgICAgICAgY29uc29sZS5sb2coJ1VuYWJsZSB0byBhY2Nlc3MgbmV0d29yaycpOwogICAgICAgICBwaGFudG9tLmV4aXQoMSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgd2FpdEZvcihmdW5jdGlvbigpewotICAgICAgICAgICAgcmV0dXJuIHBhZ2UuZXZhbHVhdGUoZnVuY3Rpb24oKXsKKyAgICAgICAgd2FpdEZvcihmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBwYWdlLmV2YWx1YXRlKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdW5pdC10ZXN0cmVzdWx0Jyk7CiAgICAgICAgICAgICAgICAgaWYgKGVsICYmIGVsLmlubmVyVGV4dC5tYXRjaCgnY29tcGxldGVkJykpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0pOwotICAgICAgICB9LCBmdW5jdGlvbigpewotICAgICAgICAgICAgdmFyIGZhaWxlZE51bSA9IHBhZ2UuZXZhbHVhdGUoZnVuY3Rpb24oKXsKKyAgICAgICAgfSwgZnVuY3Rpb24oKSB7CisgICAgICAgICAgICB2YXIgZmFpbGVkTnVtID0gcGFnZS5ldmFsdWF0ZShmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVuaXQtdGVzdHJlc3VsdCcpOwogICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVsLmlubmVyVGV4dCk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3NlcnZlcl9odHRwLmpzIGIvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHAuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM4MGMzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3NlcnZlcl9odHRwLmpzCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gIFRoaXMgSFRUUCBzZXJ2ZXIgaXMgZGVzaWduZWQgdG8gc2VydmUgdGhlIHRlc3QuaHRtbCBicm93c2VyCisvLyAgYmFzZWQgSmF2YVNjcmlwdCB0ZXN0IHBhZ2UgKHdoaWNoIG11c3QgYmUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5KS4KKy8vICBUaGlzIHNlcnZlciBhbHNvIHN1cHBsaWVzIHRoZSBUaHJpZnQgYmFzZWQgdGVzdCBzZXJ2aWNlLCB3aGljaCBkZXBlbmRzCisvLyAgb24gdGhlIHN0YW5kYXJkIFRocmlmdFRlc3QudGhyaWZ0IElETCBzZXJ2aWNlICh3aGljaCBtdXN0IGJlIGNvbXBpbGVkCisvLyAgZm9yIE5vZGUgYW5kIGJyb3dzZXIgYmFzZWQgSmF2YVNjcmlwdCBpbiAuL2dlbi1ub2RlanMgYW5kIC4vZ2VuLWpzCisvLyAgcmVzcGVjdGl2ZWx5KS4KKy8vCisvLyAgVXNpbmcgdGhlIGNvbW1hbmQgZmxhZyAtLWVzNiwgdGhpcyBzZXJ2ZXIgY2FuIGJlIHJ1biB1c2luZyBub2RlanMgY29kZSBidWlsdAorLy8gIGZvciB0aGUgZXM2IGVudmlyb25tZW50IG9yIGZvciBwcmUtZXM2IGVudmlyb25tZW50LgorLy8KKworY29uc3QgdGhyaWZ0ID0gcmVxdWlyZSgnLi4vLi4vbm9kZWpzL2xpYi90aHJpZnQnKTsKK2NvbnN0IGVzNk1vZGUgPSBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tZXM2Jyk7Citjb25zdCBnZW5Gb2xkZXIgPSBlczZNb2RlID8gJ2dlbi1ub2RlanMtZXM2JyA6ICdnZW4tbm9kZWpzJzsKK2NvbnN0IFRocmlmdFRlc3RTdmMgPSByZXF1aXJlKGAuLyR7Z2VuRm9sZGVyfS9UaHJpZnRUZXN0LmpzYCk7Citjb25zdCBUaHJpZnRUZXN0SGFuZGxlciA9IHJlcXVpcmUoJy4vdGVzdF9oYW5kbGVyJykuVGhyaWZ0VGVzdEhhbmRsZXI7CisKK2NvbnN0IFRocmlmdFRlc3RTdmNPcHQgPSB7CisJdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorCXByb3RvY29sOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKKwlwcm9jZXNzb3I6IFRocmlmdFRlc3RTdmMsCisJaGFuZGxlcjogVGhyaWZ0VGVzdEhhbmRsZXIKK307CisKK2NvbnN0IFRocmlmdFdlYlNlcnZlck9wdGlvbnMgPSB7CisJZmlsZXM6IF9fZGlybmFtZSwKKwlzZXJ2aWNlczogeworCQknL3NlcnZpY2UnOiBUaHJpZnRUZXN0U3ZjT3B0CisJfQorfTsKKworY29uc3Qgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVdlYlNlcnZlcihUaHJpZnRXZWJTZXJ2ZXJPcHRpb25zKTsKK2NvbnN0IHBvcnQgPSBlczZNb2RlID8gODA4OCA6IDgwODk7CitzZXJ2ZXIubGlzdGVuKHBvcnQpOworY29uc29sZS5sb2coYFNlcnZpbmcgZmlsZXMgZnJvbTogJHtfX2Rpcm5hbWV9YCk7Citjb25zb2xlLmxvZyhgSHR0cC9UaHJpZnQgU2VydmVyIChFUzYgbW9kZSAke2VzNk1vZGV9KSBydW5uaW5nIG9uIHBvcnQ6ICR7cG9ydH1gKTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3NlcnZlcl9odHRwcy5qcyBiL2xpYi9qcy90ZXN0L3NlcnZlcl9odHRwcy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTE3MWRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHBzLmpzCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9UaGlzIEhUVFAgc2VydmVyIGlzIGRlc2lnbmVkIHRvIHNlcnZlciB0aGUgdGVzdC5odG1sIGJyb3dzZXIKKy8vICBiYXNlZCBKYXZhU2NyaXB0IHRlc3QgcGFnZSAod2hpY2ggbXVzdCBiZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkpLgorLy8gIFRoaXMgc2VydmVyIGFsc28gc3VwcGxpZXMgdGhlIFRocmlmdCBiYXNlZCB0ZXN0IHNlcnZpY2UsIHdoaWNoIGRlcGVuZHMKKy8vICBvbiB0aGUgc3RhbmRhcmQgVGhyaWZ0VGVzdC50aHJpZnQgSURMIHNlcnZpY2UgKHdoaWNoIG11c3QgYmUgY29tcGlsZWQKKy8vICBmb3IgTm9kZSBhbmQgYnJvd3NlciBiYXNlZCBKYXZhU2NyaXB0IGluIC4vZ2VuLW5vZGVqcyBhbmQgLi9nZW4tanMKKy8vICByZXNwZWN0aXZlbHkpLiBUaGUgY3VycmVudCBkaXJlY3RvcnkgbXVzdCBhbHNvIGluY2x1ZGUgdGhlIGJyb3dzZXIKKy8vICBzdXBwb3J0IGxpYnJhcmllcyBmb3IgdGVzdC5odG1sIChqcXVlcnkuanMsIHF1bml0LmpzIGFuZCBxdW5pdC5jc3MKKy8vICBpbiAuL2J1aWxkL2pzL2xpYikuCisKK2NvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTsKK2NvbnN0IHRocmlmdCA9IHJlcXVpcmUoJy4uLy4uL25vZGVqcy9saWIvdGhyaWZ0Jyk7Citjb25zdCBlczZNb2RlID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLWVzNicpOworY29uc3QgZ2VuRm9sZGVyID0gZXM2TW9kZSA/ICdnZW4tbm9kZWpzLWVzNicgOiAnZ2VuLW5vZGVqcyc7Citjb25zdCBUaHJpZnRUZXN0U3ZjID0gcmVxdWlyZShgLi8ke2dlbkZvbGRlcn0vVGhyaWZ0VGVzdC5qc2ApOworY29uc3QgVGhyaWZ0VGVzdEhhbmRsZXIgPSByZXF1aXJlKCcuL3Rlc3RfaGFuZGxlcicpLlRocmlmdFRlc3RIYW5kbGVyOworCisvL1NldHVwIHRoZSBJL08gc3RhY2sgb3B0aW9ucyBmb3IgdGhlIFRocmlmdFRlc3Qgc2VydmljZQorY29uc3QgVGhyaWZ0VGVzdFN2Y09wdCA9IHsKKyAgdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorICBwcm90b2NvbDogdGhyaWZ0LlRKU09OUHJvdG9jb2wsCisgIHByb2Nlc3NvcjogVGhyaWZ0VGVzdFN2YywKKyAgaGFuZGxlcjogVGhyaWZ0VGVzdEhhbmRsZXIKK307CisKK2NvbnN0IFRocmlmdFdlYlNlcnZlck9wdGlvbnMgPSB7CisgIGZpbGVzOiBfX2Rpcm5hbWUsCisgIHRsczogeworICAgICBrZXk6IGZzLnJlYWRGaWxlU3luYygnLi4vLi4vLi4vdGVzdC9rZXlzL3NlcnZlci5rZXknKSwKKyAgICAgY2VydDogZnMucmVhZEZpbGVTeW5jKCcuLi8uLi8uLi90ZXN0L2tleXMvc2VydmVyLmNydCcpCisgIH0sCisgIHNlcnZpY2VzOiB7CisgICAgJy9zZXJ2aWNlJzogVGhyaWZ0VGVzdFN2Y09wdAorICB9Cit9OworCitjb25zdCBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlV2ViU2VydmVyKFRocmlmdFdlYlNlcnZlck9wdGlvbnMpOworY29uc3QgcG9ydCA9IGVzNk1vZGUgPyA4MDkwIDogODA5MTsKK3NlcnZlci5saXN0ZW4ocG9ydCk7Citjb25zb2xlLmxvZyhgU2VydmluZyBmaWxlcyBmcm9tOiAke19fZGlybmFtZX1gKTsKK2NvbnNvbGUubG9nKGBIdHRwL1RocmlmdCBTZXJ2ZXIgKEVTNiBtb2RlICR7ZXM2TW9kZX0pIHJ1bm5pbmcgb24gcG9ydDogJHtwb3J0fWApOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3Qvc3JjL3Rlc3QvSHR0cGQuamF2YSBiL2xpYi9qcy90ZXN0L3NyYy90ZXN0L0h0dHBkLmphdmEKaW5kZXggMGVkMDUxZS4uZTRmYzBjYyAxMDA2NDQKLS0tIGEvbGliL2pzL3Rlc3Qvc3JjL3Rlc3QvSHR0cGQuamF2YQorKysgYi9saWIvanMvdGVzdC9zcmMvdGVzdC9IdHRwZC5qYXZhCkBAIC03Miw2ICs3MiwxMiBAQAogaW1wb3J0IHRocmlmdC50ZXN0LlRocmlmdFRlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlNlcnZlclRlc3RCYXNlLlRlc3RIYW5kbGVyOwogCitpbXBvcnQgZXUubWVkc2VhLm1pbWV1dGlsLmRldGVjdG9yLkV4dGVuc2lvbk1pbWVEZXRlY3RvcjsKK2ltcG9ydCBldS5tZWRzZWEubWltZXV0aWwuTWltZVV0aWwyOworaW1wb3J0IGV1Lm1lZHNlYS5taW1ldXRpbC5NaW1lVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKIC8qKgogICogQmFzaWMsIHlldCBmdWxseSBmdW5jdGlvbmFsIGFuZCBzcGVjIGNvbXBsaWFudCwgSFRUUC8xLjEgZmlsZSBzZXJ2ZXIuCiAgKiA8cD4KQEAgLTE3Nyw4ICsxODMsMjIgQEAKIAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7CisgICAgICAgICAgICAgICAgICAgIE1pbWVVdGlsMiBtaW1lVXRpbCA9IG5ldyBNaW1lVXRpbDIoKTsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW1lVXRpbC5yZWdpc3Rlck1pbWVEZXRlY3RvcihFeHRlbnNpb25NaW1lRGV0ZWN0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPE1pbWVUeXBlPiBjb2xsZWN0aW9uID0gbWltZVV0aWwuZ2V0TWltZVR5cGVzKGZpbGUpOworICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxNaW1lVHlwZT4gaXRlcmF0b3IgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTWltZVR5cGUgbXQgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZSA9ICBtdC5nZXRNZWRpYVR5cGUoKSArICIvIiArIG10LmdldFN1YlR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzQ29kZShIdHRwU3RhdHVzLlNDX09LKTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZUVudGl0eSBib2R5ID0gbmV3IEZpbGVFbnRpdHkoZmlsZSwgInRleHQvaHRtbCIpOworICAgICAgICAgICAgICAgICAgICBGaWxlRW50aXR5IGJvZHkgPSBuZXcgRmlsZUVudGl0eShmaWxlLCBtaW1lVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmFkZEhlYWRlcigiQ29udGVudC1UeXBlIiwgbWltZVR5cGUpOwogICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRFbnRpdHkoYm9keSk7CiAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VydmluZyBmaWxlICIgKyBmaWxlLmdldFBhdGgoKSk7CiAKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QtYXN5bmMuanMgYi9saWIvanMvdGVzdC90ZXN0LWFzeW5jLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNmIxM2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC90ZXN0LWFzeW5jLmpzCkBAIC0wLDAgKzEsMzcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisgLyoganNoaW50IC1XMTAwICovCisKKy8qCisgKiBGdWxseSBBc3luYyBKYXZhU2NyaXB0IHRlc3Qgc3VpdGUgZm9yIFRocmlmdFRlc3QudGhyaWZ0LgorICogVGhlc2UgdGVzdHMgYXJlIGRlc2lnbmVkIHRvIGV4ZXJjaXNlIHRoZSBXZWJTb2NrZXQgdHJhbnNwb3J0CisgKiAod2hpY2ggaXMgZXhjbHVzaXZlbHkgYXN5bmMpLgorICoKKyAqIFRvIGNvbXBpbGUgY2xpZW50IGNvZGUgZm9yIHRoaXMgdGVzdCB1c2U6CisgKiAgICAgICQgdGhyaWZ0IC1nZW4ganMgVGhyaWZ0VGVzdC50aHJpZnQKKyAqLworCisKKworLy8gYWxsIExhbmd1YWdlcyBpbiBVVEYtOAorY29uc3Qgc3RyaW5nVGVzdCA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsINCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwg4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCBDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsIEJhaGFzYSBNZWxheXUsINmF2KfYstmQ2LHZiNmG24wsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIC8gUGl0a2VybiwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7Egywg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIjsKKworZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcDEsIG1hcDIpIHsKKyAgaWYgKHR5cGVvZiBtYXAxICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtYXAyICE9PSAnZnVuY3Rpb24nKSB7CisgICAgaWYgKCFtYXAxIHx8IHR5cGVvZiBtYXAxICE9PSAnb2JqZWN0JykgeworICAgICAgICBhc3NlcnQuZXF1YWwobWFwMSwgbWFwMik7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAobGV0IGtleSBpbiBtYXAxKSB7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCBtYXAxW2tleV0sIG1hcDJba2V5XSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK1FVbml0Lm1vZHVsZSgnQmFzZSBUeXBlcycpOworCisgIFFVbml0LnRlc3QoJ1ZvaWQnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdFZvaWQoZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCB1bmRlZmluZWQpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworCisgIFFVbml0LnRlc3QoJ1N0cmluZycsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygzKTsKKyAgICBjbGllbnQudGVzdFN0cmluZygnJywgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgJycpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdFN0cmluZyhzdHJpbmdUZXN0LCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBzdHJpbmdUZXN0KTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisKKyAgICBjb25zdCBzcGVjaWFsQ2hhcmFjdGVycyA9ICdxdW90ZTogXCIgYmFja3NsYXNoOicgKworICAgICAgICAgICcgZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFwvICcgKworICAgICAgICAgICcgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICcgKworICAgICAgICAgICcgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiAiXFxcL1xiXG5cclx0JyArCisgICAgICAgICAgJyBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48JzsKKyAgICBjbGllbnQudGVzdFN0cmluZyhzcGVjaWFsQ2hhcmFjdGVycywgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgc3BlY2lhbENoYXJhY3RlcnMpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ0RvdWJsZScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoNCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYyg0KTsKKyAgICBjbGllbnQudGVzdERvdWJsZSgwLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAwKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3REb3VibGUoLTEsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIC0xKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3REb3VibGUoMy4xNCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMy4xNCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0RG91YmxlKE1hdGgucG93KDIsIDYwKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgNjApKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworICAvLyBUT0RPOiBhZGQgdGVzdEJpbmFyeSgpCisgIFFVbml0LnRlc3QoJ0J5dGUnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMik7CisgICAgY2xpZW50LnRlc3RCeXRlKDAsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdEJ5dGUoMHgwMSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMHgwMSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKyAgUVVuaXQudGVzdCgnSTMyJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0STMyKDAsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLCAzMCksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDMwKSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0STMyKC1NYXRoLnBvdygyLCAzMCksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIC1NYXRoLnBvdygyLCAzMCkpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ0k2NCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygzKTsKKyAgICBjbGllbnQudGVzdEk2NCgwLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAwKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgIGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsIDUyKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgNTIpKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3RJNjQoLU1hdGgucG93KDIsIDUyKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgLU1hdGgucG93KDIsIDUyKSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworCisKKworUVVuaXQubW9kdWxlKCdTdHJ1Y3R1cmVkIFR5cGVzJyk7CisKKyAgUVVuaXQudGVzdCgnU3RydWN0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCg1KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY29uc3Qgc3RydWN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgICAgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOworICAgIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOworCisgICAgY2xpZW50LnRlc3RTdHJ1Y3Qoc3RydWN0VGVzdElucHV0LCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RyaW5nX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuYnl0ZV90aGluZywgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5pMzJfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKEpTT04uc3RyaW5naWZ5KHJlc3VsdCksIEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RJbnB1dCkpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdOZXN0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCg3KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY29uc3QgeHRyVGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgICAgeHRyVGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOworICAgIHh0clRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKKyAgICB4dHJUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICB4dHJUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOworCisgICAgY29uc3QgbmVzdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDIoKTsKKyAgICBuZXN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAyOworICAgIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nID0geHRyVGVzdElucHV0OworICAgIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMTUpOworCisgICAgY2xpZW50LnRlc3ROZXN0KG5lc3RUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKEpTT04uc3RyaW5naWZ5KHJlc3VsdCksIEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0SW5wdXQpKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnTWFwJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY29uc3QgbWFwVGVzdElucHV0ID0gezc6IDc3LCA4OiA4OCwgOTogOTl9OworCisgICAgY2xpZW50LnRlc3RNYXAobWFwVGVzdElucHV0LCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGZvciAobGV0IGtleSBpbiByZXN1bHQpIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdFtrZXldLCBtYXBUZXN0SW5wdXRba2V5XSk7CisgICAgICB9CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1N0cmluZ01hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoNik7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNvbnN0IG1hcFRlc3RJbnB1dCA9IHsKKyAgICAgICdhJzogJzEyMycsICdhIGInOiAnd2l0aCBzcGFjZXMgJywgJ3NhbWUnOiAnc2FtZScsICcwJzogJ251bWVyaWMga2V5JywKKyAgICAgICdsb25nVmFsdWUnOiBzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiAnbG9uZyBrZXknCisgICAgfTsKKworICAgIGNsaWVudC50ZXN0U3RyaW5nTWFwKG1hcFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBmb3IgKGxldCBrZXkgaW4gcmVzdWx0KSB7CisgICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOworICAgICAgfQorICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdTZXQnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjb25zdCBzZXRUZXN0SW5wdXQgPSBbMSwgMiwgM107CisgICAgY2xpZW50LnRlc3RTZXQoc2V0VGVzdElucHV0LCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5vayhyZXN1bHQsIHNldFRlc3RJbnB1dCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ0xpc3QnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjb25zdCBsaXN0VGVzdElucHV0ID0gWzEsIDIsIDNdOworICAgIGNsaWVudC50ZXN0TGlzdChsaXN0VGVzdElucHV0LCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5vayhyZXN1bHQsIGxpc3RUZXN0SW5wdXQpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdFbnVtJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RFbnVtKFRocmlmdFRlc3QuTnVtYmVyei5PTkUsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1R5cGVEZWYnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdFR5cGVkZWYoNjksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgNjkpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworCitRVW5pdC5tb2R1bGUoJ2RlZXBlciEnKTsKKworICBRVW5pdC50ZXN0KCdNYXBNYXAnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDE2KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY29uc3QgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0ID0geworICAgICAgJzQnOiB7JzEnOiAxLCAnMic6IDIsICczJzogMywgJzQnOiA0fSwKKyAgICAgICctNCc6IHsnLTQnOiAtNCwgJy0zJzogLTMsICctMic6IC0yLCAnLTEnOiAtMX0KKyAgICB9OworCisgICAgY2xpZW50LnRlc3RNYXBNYXAoMSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBmb3IgKGxldCBrZXkgaW4gcmVzdWx0KSB7CisgICAgICAgIGZvciAobGV0IGtleTIgaW4gcmVzdWx0W2tleV0pIHsKKyAgICAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0W2tleV1ba2V5Ml0sIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdFtrZXldW2tleTJdKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIHJlc3VsdCwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKworUVVuaXQubW9kdWxlKCdFeGNlcHRpb24nKTsKKworICBRVW5pdC50ZXN0KCdYY2VwdGlvbicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicsIGZ1bmN0aW9uKGUpIHsKKyAgICAgIGFzc2VydC5lcXVhbChlLmVycm9yQ29kZSwgMTAwMSk7CisgICAgICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAnWGNlcHRpb24nKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnbm8gRXhjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ25vIEV4Y2VwdGlvbicsIGZ1bmN0aW9uKGUpIHsKKyAgICAgIGFzc2VydC5vayghZSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCitRVW5pdC5tb2R1bGUoJ0luc2FuaXR5Jyk7CisKKyAgUVVuaXQudGVzdCgndGVzdEluc2FuaXR5JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyNCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNvbnN0IGluc2FuaXR5ID0geworICAgICAgJzEnOiB7CisgICAgICAgICcyJzogeworICAgICAgICAgICd1c2VyTWFwJzogeyAnNSc6IDUsICc4JzogOCB9LAorICAgICAgICAgICd4dHJ1Y3RzJzogW3sKKyAgICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdHb29kYnllNCcsCisgICAgICAgICAgICAgICdieXRlX3RoaW5nJzogNCwKKyAgICAgICAgICAgICAgJ2kzMl90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpNjRfdGhpbmcnOiA0CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJzogJ0hlbGxvMicsCisgICAgICAgICAgICAgICdieXRlX3RoaW5nJzogMiwKKyAgICAgICAgICAgICAgJ2kzMl90aGluZyc6IDIsCisgICAgICAgICAgICAgICdpNjRfdGhpbmcnOiAyCisgICAgICAgICAgICB9CisgICAgICAgICAgXQorICAgICAgICB9LAorICAgICAgICAnMyc6IHsKKyAgICAgICAgICAndXNlck1hcCc6IHsgJzUnOiA1LCAnOCc6IDggfSwKKyAgICAgICAgICAneHRydWN0cyc6IFt7CisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnR29vZGJ5ZTQnLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogNAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdIZWxsbzInLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDIsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogMgorICAgICAgICAgICAgfQorICAgICAgICAgIF0KKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgICcyJzogeyAnNic6IHsgJ3VzZXJNYXAnOiBudWxsLCAneHRydWN0cyc6IG51bGwgfSB9CisgICAgfTsKKyAgICBjbGllbnQudGVzdEluc2FuaXR5KG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KCksIGZ1bmN0aW9uKHJlcykgeworICAgICAgYXNzZXJ0Lm9rKHJlcywgSlNPTi5zdHJpbmdpZnkocmVzKSk7CisgICAgICBhc3NlcnQub2soaW5zYW5pdHksIEpTT04uc3RyaW5naWZ5KGluc2FuaXR5KSk7CisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgcmVzLCBpbnNhbml0eSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCitRVW5pdC5tb2R1bGUoJ09uZXdheScpOworCisgIFFVbml0LnRlc3QoJ3Rlc3RPbmV3YXknLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdE9uZXdheSgxLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIHVuZGVmaW5lZCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1kZWVwLWNvbnN0cnVjdG9yLmh0bWwgYi9saWIvanMvdGVzdC90ZXN0LWRlZXAtY29uc3RydWN0b3IuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZmMwZGE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1kZWVwLWNvbnN0cnVjdG9yLmh0bWwKQEAgLTAsMCArMSw0OSBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CisgIDx0aXRsZT5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0PC90aXRsZT4KKworICA8c2NyaXB0IHNyYz0iYnVpbGQvanMvdGhyaWZ0LmpzIiAgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzL0pzRGVlcENvbnN0cnVjdG9yVGVzdF90eXBlcy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDwhLS0galF1ZXJ5IC0tPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvanF1ZXJ5LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisKKyAgPCEtLSBRVW5pdCBUZXN0IGZyYW1ld29yay0tPgorCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9xdW5pdC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYnVpbGQvanMvbGliL3F1bml0LmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIC8+CisKKyAgPCEtLSB0aGUgVGVzdCBTdWl0ZS0tPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJkZWVwLWNvbnN0cnVjdG9yLnRlc3QuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorICA8aDEgaWQ9InF1bml0LWhlYWRlciI+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IERlZXAgQ29uc3RydWN0b3IgVGVzdCAoPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvdGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0Ij5Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0PC9hPik8L2gxPgorICA8aDIgaWQ9InF1bml0LWJhbm5lciI+PC9oMj4KKyAgPGRpdiBpZD0icXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIj48L2Rpdj4KKyAgPGgyIGlkPSJxdW5pdC11c2VyQWdlbnQiPjwvaDI+CisgIDxvbCBpZD0icXVuaXQtdGVzdHMiPjxsaT48IS0tIGdldCB2YWxpZCB4aHRtbCBzdHJpY3QtLT48L2xpPjwvb2w+CisgIDxwPgorICAgICAgPGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2svcmVmZXJlciI+PGltZworICAgICAgICAgIHNyYz0iaHR0cDovL3d3dy53My5vcmcvSWNvbnMvdmFsaWQteGh0bWwxMCIKKyAgICAgICAgICBhbHQ9IlZhbGlkIFhIVE1MIDEuMCEiIGhlaWdodD0iMzEiIHdpZHRoPSI4OCIgLz48L2E+CisgIDwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QtZG91YmxlLXJlbmRlcmluZy5odG1sIGIvbGliL2pzL3Rlc3QvdGVzdC1kb3VibGUtcmVuZGVyaW5nLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E0MzBhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QtZG91YmxlLXJlbmRlcmluZy5odG1sCkBAIC0wLDAgKzEsNTUgQEAKKys8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CisgICAgICA8dGl0bGU+UmVuZGVyaW5nIERvdWJsZSBDb25zdGFudHMgaW4gSlM6IFVuaXQgVGVzdDwvdGl0bGU+CisKKyAgICAgIDxzY3JpcHQgc3JjPSJidWlsZC9qcy90aHJpZnQuanMiICAgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgICAgICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RocmlmdFRlc3RfdHlwZXMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICAgICAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0LmpzIiAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgICAgIDwhLS0gZG91YmxlIGNvbnN0YW50cyB0byBjaGVjayAtLT4KKyAgICAgIDxzY3JpcHQgc3JjPSJnZW4tanMvRG91YmxlQ29uc3RhbnRzVGVzdF90eXBlcy5qcyIgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKworICAgICAgPCEtLSBqUXVlcnkgLS0+CisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvanF1ZXJ5LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisKKyAgICAgIDwhLS0gUVVuaXQgVGVzdCBmcmFtZXdvcmstLT4KKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9xdW5pdC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJidWlsZC9qcy9saWIvcXVuaXQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4KKworICAgICAgPCEtLSB0aGUgVGVzdCBTdWl0ZS0tPgorICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC1kb3VibGUtcmVuZGVyaW5nLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgICAgPC9oZWFkPgorPGJvZHk+CisgIDxoMSBpZD0icXVuaXQtaGVhZGVyIj5SZW5kZXJpbmcgRG91YmxlIENvbnN0YW50cyBpbiBKUzogVW5pdCBUZXN0PC9oMT4KKyAgPGgyIGlkPSJxdW5pdC1iYW5uZXIiPjwvaDI+CisgIDxkaXYgaWQ9InF1bml0LXRlc3RydW5uZXItdG9vbGJhciI+PC9kaXY+CisgIDxoMiBpZD0icXVuaXQtdXNlckFnZW50Ij48L2gyPgorICA8b2wgaWQ9InF1bml0LXRlc3RzIj48bGk+PCEtLSBnZXQgdmFsaWQgeGh0bWwgc3RyaWN0LS0+PC9saT48L29sPgorICA8IS0tIFVuY29tbWVudCB0aGlzIHRvIGNoZWNrIHRoZSB2YWxpZGl0eS4gVGhpcyBzaWduaWZpY2FudGx5IHNsb3dzIGRvd24gdGhlIHRlc3QuCisgIDxwPgorICAgICAgPGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2svcmVmZXJlciI+PGltZworICAgICAgICAgIHNyYz0iaHR0cDovL3d3dy53My5vcmcvSWNvbnMvdmFsaWQteGh0bWwxMCIKKyAgICAgICAgICBhbHQ9IlZhbGlkIFhIVE1MIDEuMCEiIGhlaWdodD0iMzEiIHdpZHRoPSI4OCIgLz48L2E+CisgIDwvcD4KKyAgLS0+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LWRvdWJsZS1yZW5kZXJpbmcuanMgYi9saWIvanMvdGVzdC90ZXN0LWRvdWJsZS1yZW5kZXJpbmcuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5MGMxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QtZG91YmxlLXJlbmRlcmluZy5qcwpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworIC8qIGpzaGludCAtVzEwMCAqLworCisvKgorICogSmF2YVNjcmlwdCB0ZXN0IHN1aXRlIGZvciBkb3VibGUgY29uc3RhbnRzIGluc2lkZQorICogRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQuIFRoZXNlIHRlc3RzIHdpbGwgcnVuIGFnYWluc3QgTm9ybWFsICgtZ2VuIGpzKQorICogQXBhY2hlIFRocmlmdCBpbnRlcmZhY2VzLgorICoKKyAqIFRvIGNvbXBpbGUgY2xpZW50IGNvZGUgZm9yIHRoaXMgdGVzdCB1c2U6CisgKiAgICAgICQgdGhyaWZ0IC1nZW4ganMgRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQKKyAqLworCisvLyBkb3VibGUgYXNzZXJ0aW9uIHRocmVzaG9sZAorY29uc3QgRVBTSUxPTiA9IDAuMDAwMDAwMTsKKworLy8gV29yayBhcm91bmQgZm9yIG9sZCBBUEkgdXNlZCBieSBRVW5pdEFkYXB0ZXIgb2YganNUZXN0RHJpdmVyCitpZiAodHlwZW9mIFFVbml0LmxvZyA9PSAnZnVuY3Rpb24nKSB7CisgIC8vIFdoZW4gdXNpbmcgcmVhbCBRVW5pdCAoZnJvbiBQaGFudG9tSlMpIGxvZyBmYWlsdXJlcyB0byBjb25zb2xlCisgIFFVbml0LmxvZyhmdW5jdGlvbihkZXRhaWxzKSB7CisgICAgaWYgKCFkZXRhaWxzLnJlc3VsdCkgeworICAgICAgY29uc29sZS5sb2coJz09PT09PT09IEZBSUwgPT09PT09PT0nKTsKKyAgICAgIGNvbnNvbGUubG9nKCdUZXN0TmFtZTogJyArIGRldGFpbHMubmFtZSk7CisgICAgICBpZiAoZGV0YWlscy5tZXNzYWdlKSBjb25zb2xlLmxvZyhkZXRhaWxzLm1lc3NhZ2UpOworICAgICAgY29uc29sZS5sb2coJ0V4cGVjdGVkOiAnICsgZGV0YWlscy5leHBlY3RlZCk7CisgICAgICBjb25zb2xlLmxvZygnQWN0dWFsICA6ICcgKyBkZXRhaWxzLmFjdHVhbCk7CisgICAgICBjb25zb2xlLmxvZygnPT09PT09PT09PT09PT09PT09PT09PScpOworICAgIH0KKyAgfSk7Cit9CisKK1FVbml0Lm1vZHVsZSgnRG91YmxlIHJlbmRlcmluZycpOworCisgIFFVbml0LnRlc3QoJ0RvdWJsZSAocmVuZGVyaW5nKScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnNvbGUubG9nKCdEb3VibGUgcmVuZGVyaW5nIHRlc3QgLS0gc3RhcnRzJyk7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCA9IDE7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCA9IC0xMDA7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UID0gOTIyMzM3MjAzNjg1NDc3NTgwNzsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDc7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMgPSAzLjE0MTU5MjY1MzU5OworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSA9IDEwMDAwMDAuMTsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUgPSAtMTAwMDAwMC4xOworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUgPSAxLjdlKzMwODsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgPSA5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzOworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUgPSAtMS43ZSszMDg7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCAtIERPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicygKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQgLQorICAgICAgICAgICAgRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCAtCisgICAgICAgICAgICBET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUyAtCisgICAgICAgICAgICBET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSAtCisgICAgICAgICAgICBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgLQorICAgICAgICAgICAgRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicygKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgLQorICAgICAgICAgICAgRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNULCAnbnVtYmVyJyk7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNULCAnbnVtYmVyJyk7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNULCAnbnVtYmVyJyk7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsICdudW1iZXInKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsICdudW1iZXInKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCAnbnVtYmVyJyk7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0xJU1QgPQorICAgICAgICBbMSwtMTAwLDEwMCw5MjIzMzcyMDM2ODU0Nzc1ODA3LC05MjIzMzcyMDM2ODU0Nzc1ODA3LDMuMTQxNTkyNjUzNTksMTAwMDAwMC4xLC0xMDAwMDAwLjEsMS43ZSszMDgsLTEuN2UrMzA4LAorICAgICAgICAgICAgOTIyMzM3MjAzNjg1NDc3NTgxNi40MywtOTIyMzM3MjAzNjg1NDc3NTgxNi40M107CisgICAgYXNzZXJ0LmVxdWFsKERPVUJMRV9MSVNUX1RFU1QubGVuZ3RoLCBFWFBFQ1RFRF9ET1VCTEVfTElTVC5sZW5ndGgpOworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRVhQRUNURURfRE9VQkxFX0xJU1QubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgYXNzZXJ0Lm9rKE1hdGguYWJzKEVYUEVDVEVEX0RPVUJMRV9MSVNUW2ldIC0gRE9VQkxFX0xJU1RfVEVTVFtpXSkgPD0gRVBTSUxPTik7CisgICAgfQorICAgIGNvbnNvbGUubG9nKCdEb3VibGUgcmVuZGVyaW5nIHRlc3QgLS0gZW5kcycpOworICB9KTsKKwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1lczYuaHRtbCBiL2xpYi9qcy90ZXN0L3Rlc3QtZXM2Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwNDkwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QtZXM2Lmh0bWwKQEAgLTAsMCArMSw2MiBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CisgIDx0aXRsZT5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0PC90aXRsZT4KKworICA8c2NyaXB0IHNyYz0iYnVpbGQvanMvdGhyaWZ0LmpzIiAgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzLWVzNi9UaHJpZnRUZXN0X3R5cGVzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy1lczYvVGhyaWZ0VGVzdC5qcyIgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisKKyAgPCEtLSBqUXVlcnkgLS0+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9qcXVlcnkuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKworICA8IS0tIFFVbml0IFRlc3QgZnJhbWV3b3JrLS0+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9xdW5pdC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImJ1aWxkL2pzL2xpYi9xdW5pdC5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgorCisgIDwhLS0gdGhlIFRlc3QgU3VpdGUtLT4KKyAgPHNjcmlwdD4KKyAgICBjb25zdCBsb2MgPSB3aW5kb3cubG9jYXRpb247CisgICAgY29uc3Qgd3NfdXJpID0gKChsb2MucHJvdG9jb2wgPT09ICJodHRwczoiKSA/ICJ3c3M6Ly8iIDogIndzOi8vIikgKworICAgICAgICAgICAgICAgICAgIGxvYy5ob3N0bmFtZSArICI6IiArIGxvYy5wb3J0ICsgbG9jLnBhdGhuYW1lOworICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVFdlYlNvY2tldFRyYW5zcG9ydCh3c191cmkpOworICAgIGNvbnN0IHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICBjb25zdCBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKyAgICB0cmFuc3BvcnQub3BlbigpOworICA8L3NjcmlwdD4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC1lczYuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorICA8aDEgaWQ9InF1bml0LWhlYWRlciI+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdCAoPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCI+VGhyaWZ0VGVzdC50aHJpZnQ8L2E+KTwvaDE+CisgIDxoMiBpZD0icXVuaXQtYmFubmVyIj48L2gyPgorICA8ZGl2IGlkPSJxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIiPjwvZGl2PgorICA8aDIgaWQ9InF1bml0LXVzZXJBZ2VudCI+PC9oMj4KKyAgPG9sIGlkPSJxdW5pdC10ZXN0cyI+PGxpPjwhLS0gZ2V0IHZhbGlkIHhodG1sIHN0cmljdC0tPjwvbGk+PC9vbD4KKyAgPCEtLSBVbmNvbW1lbnQgdGhpcyB0byBjaGVjayB0aGUgdmFsaWRpdHkuIFRoaXMgc2lnbmlmaWNhbnRseSBzbG93cyBkb3duIHRoZSB0ZXN0LgorICA8cD4KKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly92YWxpZGF0b3IudzMub3JnL2NoZWNrL3JlZmVyZXIiPjxpbWcKKyAgICAgICAgICBzcmM9Imh0dHA6Ly93d3cudzMub3JnL0ljb25zL3ZhbGlkLXhodG1sMTAiCisgICAgICAgICAgYWx0PSJWYWxpZCBYSFRNTCAxLjAhIiBoZWlnaHQ9IjMxIiB3aWR0aD0iODgiIC8+PC9hPgorICA8L3A+CisgIC0tPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1lczYuanMgYi9saWIvanMvdGVzdC90ZXN0LWVzNi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDUxNzFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1lczYuanMKQEAgLTAsMCArMSwzNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyAvKiBqc2hpbnQgLVcxMDAgKi8KKworLyoKKyAqIEZ1bGx5IEFzeW5jIEphdmFTY3JpcHQgdGVzdCBzdWl0ZSBmb3IgVGhyaWZ0VGVzdC50aHJpZnQuCisgKiBUaGVzZSB0ZXN0cyBhcmUgZGVzaWduZWQgdG8gZXhlcmNpc2UgdGhlIFdlYlNvY2tldCB0cmFuc3BvcnQKKyAqICh3aGljaCBpcyBleGNsdXNpdmVseSBhc3luYykuCisgKgorICogVG8gY29tcGlsZSBjbGllbnQgY29kZSBmb3IgdGhpcyB0ZXN0IHVzZToKKyAqICAgICAgJCB0aHJpZnQgLWdlbiBqczplczYgVGhyaWZ0VGVzdC50aHJpZnQKKyAqLworCisKKworLy8gYWxsIExhbmd1YWdlcyBpbiBVVEYtOAorCitjb25zdCBzdHJpbmdUZXN0ID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOworCitmdW5jdGlvbiBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgbWFwMSwgbWFwMikgeworICBpZiAodHlwZW9mIG1hcDEgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG1hcDIgIT09ICdmdW5jdGlvbicpIHsKKyAgICBpZiAoIW1hcDEgfHwgdHlwZW9mIG1hcDEgIT09ICdvYmplY3QnKSB7CisgICAgICAgIGFzc2VydC5lcXVhbChtYXAxLCBtYXAyKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yICh2YXIga2V5IGluIG1hcDEpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworUVVuaXQubW9kdWxlKCdCYXNlIFR5cGVzJyk7CisKKyAgUVVuaXQudGVzdCgnVm9pZCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RWb2lkKCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIHVuZGVmaW5lZCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1N0cmluZycsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0U3RyaW5nKCcnKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsICcnKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3RTdHJpbmcoc3RyaW5nVGVzdCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBzdHJpbmdUZXN0KTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgdmFyIHNwZWNpYWxDaGFyYWN0ZXJzID0gJ3F1b3RlOiBcIiBiYWNrc2xhc2g6JyArCisgICAgICAgICAgJyBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXC8gJyArCisgICAgICAgICAgJyBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogJyArCisgICAgICAgICAgJyBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6ICJcXFwvXGJcblxyXHQnICsKKyAgICAgICAgICAnIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwnOworICAgIGNsaWVudC50ZXN0U3RyaW5nKHNwZWNpYWxDaGFyYWN0ZXJzKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIHNwZWNpYWxDaGFyYWN0ZXJzKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ0RvdWJsZScsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCg0KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDQpOworICAgIGNsaWVudC50ZXN0RG91YmxlKDApLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0RG91YmxlKC0xKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIC0xKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3REb3VibGUoMy4xNCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAzLjE0KTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3REb3VibGUoTWF0aC5wb3coMiwgNjApKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDYwKSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKyAgLy8gVE9ETzogYWRkIHRlc3RCaW5hcnkoKQorICBRVW5pdC50ZXN0KCdCeXRlJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMik7CisgICAgY2xpZW50LnRlc3RCeXRlKDApLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0Qnl0ZSgweDAxKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDB4MDEpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ0kzMicsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0STMyKDApLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsIDMwKSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCAzMCkpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdEkzMigtTWF0aC5wb3coMiwgMzApKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIC1NYXRoLnBvdygyLCAzMCkpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ0k2NCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0STY0KDApLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLCA1MikpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgNTIpKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3RJNjQoLU1hdGgucG93KDIsIDUyKSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAtTWF0aC5wb3coMiwgNTIpKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisKK1FVbml0Lm1vZHVsZSgnU3RydWN0dXJlZCBUeXBlcycpOworCisgIFFVbml0LnRlc3QoJ1N0cnVjdCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCg1KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgIGNsaWVudC50ZXN0U3RydWN0KHN0cnVjdFRlc3RJbnB1dCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RyaW5nX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuYnl0ZV90aGluZywgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5pMzJfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKEpTT04uc3RyaW5naWZ5KHJlc3VsdCksIEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RJbnB1dCkpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdOZXN0JywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDcpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB2YXIgeHRyVGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgICAgeHRyVGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOworICAgIHh0clRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKKyAgICB4dHJUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICB4dHJUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOworCisgICAgdmFyIG5lc3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QyKCk7CisgICAgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMjsKKyAgICBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZyA9IHh0clRlc3RJbnB1dDsKKyAgICBuZXN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDE1KTsKKworICAgIGNsaWVudC50ZXN0TmVzdChuZXN0VGVzdElucHV0KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKEpTT04uc3RyaW5naWZ5KHJlc3VsdCksIEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0SW5wdXQpKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnTWFwJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDMpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB2YXIgbWFwVGVzdElucHV0ID0gezc6IDc3LCA4OiA4OCwgOTogOTl9OworCisgICAgY2xpZW50LnRlc3RNYXAobWFwVGVzdElucHV0KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgZm9yICh2YXIga2V5IGluIHJlc3VsdCkgeworICAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICAgIH0KKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnU3RyaW5nTWFwJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDYpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB2YXIgbWFwVGVzdElucHV0ID0geworICAgICAgJ2EnOiAnMTIzJywgJ2EgYic6ICd3aXRoIHNwYWNlcyAnLCAnc2FtZSc6ICdzYW1lJywgJzAnOiAnbnVtZXJpYyBrZXknLAorICAgICAgJ2xvbmdWYWx1ZSc6IHN0cmluZ1Rlc3QsIHN0cmluZ1Rlc3Q6ICdsb25nIGtleScKKyAgICB9OworCisgICAgY2xpZW50LnRlc3RTdHJpbmdNYXAobWFwVGVzdElucHV0KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgZm9yICh2YXIga2V5IGluIHJlc3VsdCkgeworICAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICAgIH0KKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnU2V0JywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB2YXIgc2V0VGVzdElucHV0ID0gWzEsIDIsIDNdOworICAgIGNsaWVudC50ZXN0U2V0KHNldFRlc3RJbnB1dCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5vayhyZXN1bHQsIHNldFRlc3RJbnB1dCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ0xpc3QnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIHZhciBsaXN0VGVzdElucHV0ID0gWzEsIDIsIDNdOworICAgIGNsaWVudC50ZXN0TGlzdChsaXN0VGVzdElucHV0KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0Lm9rKHJlc3VsdCwgbGlzdFRlc3RJbnB1dCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ0VudW0nLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RW51bShUaHJpZnRUZXN0Lk51bWJlcnouT05FKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1R5cGVEZWYnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0VHlwZWRlZig2OSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDY5KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKworUVVuaXQubW9kdWxlKCdkZWVwZXIhJyk7CisKKyAgUVVuaXQudGVzdCgnTWFwTWFwJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDE2KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCA9IHsKKyAgICAgICc0JzogeycxJzogMSwgJzInOiAyLCAnMyc6IDMsICc0JzogNH0sCisgICAgICAnLTQnOiB7Jy00JzogLTQsICctMyc6IC0zLCAnLTInOiAtMiwgJy0xJzogLTF9CisgICAgfTsKKworICAgIGNsaWVudC50ZXN0TWFwTWFwKDEpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBmb3IgKHZhciBrZXkgaW4gcmVzdWx0KSB7CisgICAgICAgIGZvciAodmFyIGtleTIgaW4gcmVzdWx0W2tleV0pIHsKKyAgICAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0W2tleV1ba2V5Ml0sIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdFtrZXldW2tleTJdKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIHJlc3VsdCwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKworUVVuaXQubW9kdWxlKCdFeGNlcHRpb24nKTsKKworICBRVW5pdC50ZXN0KCdYY2VwdGlvbicsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJykudGhlbihmdW5jdGlvbihyZXMpIHsKKyAgICAgIGFzc2VydC5vayhmYWxzZSk7CisgICAgfSkuY2F0Y2goZnVuY3Rpb24oZSkgeworCisgICAgICBjb25zb2xlLmxvZyhgRXhjZXB0aW9uIGV4Y2VwdGlvbiBlYCk7CisgICAgICBjb25zb2xlLmxvZyhlKTsKKyAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGUsIG51bGwsIDIpKTsKKworICAgICAgYXNzZXJ0LmVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICdYY2VwdGlvbicpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdubyBFeGNlcHRpb24nLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdubyBFeGNlcHRpb24nKS50aGVuKGZ1bmN0aW9uKGUpIHsKKyAgICAgIGFzc2VydC5vayghZSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCitRVW5pdC5tb2R1bGUoJ0luc2FuaXR5Jyk7CisKKyAgUVVuaXQudGVzdCgndGVzdEluc2FuaXR5JywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDI0KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIGluc2FuaXR5ID0geworICAgICAgJzEnOiB7CisgICAgICAgICcyJzogeworICAgICAgICAgICd1c2VyTWFwJzogeyAnNSc6IDUsICc4JzogOCB9LAorICAgICAgICAgICd4dHJ1Y3RzJzogW3sKKyAgICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdHb29kYnllNCcsCisgICAgICAgICAgICAgICdieXRlX3RoaW5nJzogNCwKKyAgICAgICAgICAgICAgJ2kzMl90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpNjRfdGhpbmcnOiA0CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJzogJ0hlbGxvMicsCisgICAgICAgICAgICAgICdieXRlX3RoaW5nJzogMiwKKyAgICAgICAgICAgICAgJ2kzMl90aGluZyc6IDIsCisgICAgICAgICAgICAgICdpNjRfdGhpbmcnOiAyCisgICAgICAgICAgICB9CisgICAgICAgICAgXQorICAgICAgICB9LAorICAgICAgICAnMyc6IHsKKyAgICAgICAgICAndXNlck1hcCc6IHsgJzUnOiA1LCAnOCc6IDggfSwKKyAgICAgICAgICAneHRydWN0cyc6IFt7CisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnR29vZGJ5ZTQnLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogNAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdIZWxsbzInLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDIsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogMgorICAgICAgICAgICAgfQorICAgICAgICAgIF0KKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgICcyJzogeyAnNic6IHsgJ3VzZXJNYXAnOiBudWxsLCAneHRydWN0cyc6IG51bGwgfSB9CisgICAgfTsKKyAgICBjbGllbnQudGVzdEluc2FuaXR5KG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KCkpLnRoZW4oZnVuY3Rpb24ocmVzKSB7CisgICAgICBhc3NlcnQub2socmVzLCBKU09OLnN0cmluZ2lmeShyZXMpKTsKKyAgICAgIGFzc2VydC5vayhpbnNhbml0eSwgSlNPTi5zdHJpbmdpZnkoaW5zYW5pdHkpKTsKKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCByZXMsIGluc2FuaXR5KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKK1FVbml0Lm1vZHVsZSgnT25ld2F5Jyk7CisgIFFVbml0LnRlc3QoJ3Rlc3RPbmV3YXknLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0T25ld2F5KDEpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCB1bmRlZmluZWQpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QtanEuanMgYi9saWIvanMvdGVzdC90ZXN0LWpxLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MmJiOTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC90ZXN0LWpxLmpzCkBAIC0wLDAgKzEsMTU5IEBACivvu78vKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisgLyoganNoaW50IC1XMTAwICovCisKKy8qCisgKiBKYXZhU2NyaXB0IHRlc3Qgc3VpdGUgZm9yIFRocmlmdFRlc3QudGhyaWZ0LiBUaGVzZSB0ZXN0cworICogd2lsbCBydW4gb25seSB3aXRoIGpRdWVyeSAoLWdlbiBqczpqcXVlcnkpIEFwYWNoZSBUaHJpZnQKKyAqIGludGVyZmFjZXMuIFRvIGNyZWF0ZSBjbGllbnQgY29kZToKKyAqICAgICAgJCB0aHJpZnQgLWdlbiBqczpqcXVlcnkgVGhyaWZ0VGVzdC50aHJpZnQKKyAqCisgKiBTZWUgYWxzbzoKKyAqICsrIHRlc3QuanMgZm9yIGdlbmVyaWMgdGVzdHMKKyAqICsrIHRlc3Qtbm9qcS5qcyBmb3IgIi1nZW4ganMiIG9ubHkgdGVzdHMKKyAqLworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8valF1ZXJ5IGFzeW5jaHJvbm91cyB0ZXN0cworalF1ZXJ5LmFqYXhTZXR1cCh7IHRpbWVvdXQ6IDAgfSk7CisKK1FVbml0Lm1vZHVsZSgnalEgQXN5bmMgTWFudWFsJyk7CisKKyAgUVVuaXQudGVzdCgndGVzdEkzMicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygyKTsKKworICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCk7CisgICAgY29uc3QgcHJvdG9jb2wgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgY29uc3QgY2xpZW50ID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CisKKyAgICBjb25zdCBqcXhociA9IGpRdWVyeS5hamF4KHsKKyAgICAgIHVybDogJy9zZXJ2aWNlJywKKyAgICAgIGRhdGE6IGNsaWVudC5zZW5kX3Rlc3RJMzIoTWF0aC5wb3coLTIsIDMxKSksCisgICAgICB0eXBlOiAnUE9TVCcsCisgICAgICBjYWNoZTogZmFsc2UsCisgICAgICBkYXRhVHlwZTogJ3RleHQnLAorICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzKSB7CisgICAgICAgIHRyYW5zcG9ydC5zZXRSZWN2QnVmZmVyKHJlcyk7CisgICAgICAgIGFzc2VydC5lcXVhbChjbGllbnQucmVjdl90ZXN0STMyKCksIE1hdGgucG93KC0yLCAzMSkpOworICAgICAgICBkb25lKCk7CisgICAgICB9LAorICAgICAgZXJyb3I6IGZ1bmN0aW9uKCkgeyBhc3NlcnQub2soZmFsc2UpOyB9LAorICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCkgeworICAgICAgICBhc3NlcnQub2sodHJ1ZSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgndGVzdEk2NCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygyKTsKKworICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCk7CisgICAgY29uc3QgcHJvdG9jb2wgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgY29uc3QgY2xpZW50ID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CisKKyAgICBqUXVlcnkuYWpheCh7CisgICAgICB1cmw6ICcvc2VydmljZScsCisgICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYxIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgICBkYXRhOiBjbGllbnQuc2VuZF90ZXN0STY0KE1hdGgucG93KC0yLCA1MikpLAorICAgICAgdHlwZTogJ1BPU1QnLAorICAgICAgY2FjaGU6IGZhbHNlLAorICAgICAgZGF0YVR5cGU6ICd0ZXh0JywKKyAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlcykgeworICAgICAgICB0cmFuc3BvcnQuc2V0UmVjdkJ1ZmZlcihyZXMpOworICAgICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYxIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgICAgIGFzc2VydC5lcXVhbChjbGllbnQucmVjdl90ZXN0STY0KCksIE1hdGgucG93KC0yLCA1MikpOworICAgICAgICBkb25lKCk7CisgICAgICB9LAorICAgICAgZXJyb3I6IGZ1bmN0aW9uKCkgeyBhc3NlcnQub2soZmFsc2UpOyB9LAorICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCkgeworICAgICAgICBhc3NlcnQub2sodHJ1ZSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfSk7CisKKworUVVuaXQubW9kdWxlKCdqUSBBc3luYycpOworICBRVW5pdC50ZXN0KCdJMzInLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDMpOworCisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygzKTsKKyAgICBjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLCAzMCksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgMzApKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKworICAgIGNvbnN0IGpxeGhyID0gY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coLTIsIDMxKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygtMiwgMzEpKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKworICAgIGpxeGhyLnN1Y2Nlc3MoZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygtMiwgMzEpKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnSTY0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCg0KTsKKworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoNCk7CisgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgIGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsIDUyKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCA1MikpOworICAgICAgZG9uZSgpOworICAgIH0pOworCisgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgIGNsaWVudC50ZXN0STY0KE1hdGgucG93KC0yLCA1MiksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsIDUyKSk7CisgICAgICBkb25lKCk7CisgICAgfSkKKyAgICAuZXJyb3IoZnVuY3Rpb24oeGhyLCBzdGF0dXMsIGUpIHsgYXNzZXJ0Lm9rKGZhbHNlLCBlLm1lc3NhZ2UpOyB9KQorICAgIC5zdWNjZXNzKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsIDUyKSk7CisgICAgICBkb25lKCk7CisgICAgfSkKKyAgICAuY29tcGxldGUoZnVuY3Rpb24oKSB7CisgICAgICBhc3NlcnQub2sodHJ1ZSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1hjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMik7CisKKyAgICBjb25zdCBkZmQgPSBjbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5vayhmYWxzZSk7CisgICAgICBkb25lKCk7CisgICAgfSkKKyAgICAuZXJyb3IoZnVuY3Rpb24oeGhyLCBzdGF0dXMsIGUpIHsKKyAgICAgIGFzc2VydC5lcXVhbChlLmVycm9yQ29kZSwgMTAwMSk7CisgICAgICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAnWGNlcHRpb24nKTsKKyAgICAgIGRvbmUoKTsKKyAgICAgICQoZG9jdW1lbnQpLmFqYXhFcnJvciggZnVuY3Rpb24oKSB7IGRvbmUoKTsgfSApOworICAgIH0pOworICB9KTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3Qtbm9qcS5odG1sIGIvbGliL2pzL3Rlc3QvdGVzdC1ub2pxLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA4NDI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3Qtbm9qcS5odG1sCkBAIC0wLDAgKzEsNTIgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+CisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICA8dGl0bGU+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdDwvdGl0bGU+CisKKyAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL3RocmlmdC5qcyIgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0X3R5cGVzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0LmpzIiAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKworICA8IS0tIFFVbml0IFRlc3QgZnJhbWV3b3JrLS0+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9xdW5pdC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImJ1aWxkL2pzL2xpYi9xdW5pdC5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgorCisgIDwhLS0gdGhlIFRlc3QgU3VpdGUtLT4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0ZXN0LW5vanEuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorICA8aDEgaWQ9InF1bml0LWhlYWRlciI+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdCAoPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCI+VGhyaWZ0VGVzdC50aHJpZnQ8L2E+KTwvaDE+CisgIDxoMiBpZD0icXVuaXQtYmFubmVyIj48L2gyPgorICA8ZGl2IGlkPSJxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIiPjwvZGl2PgorICA8aDIgaWQ9InF1bml0LXVzZXJBZ2VudCI+PC9oMj4KKyAgPG9sIGlkPSJxdW5pdC10ZXN0cyI+PGxpPjwhLS0gZ2V0IHZhbGlkIHhodG1sIHN0cmljdC0tPjwvbGk+PC9vbD4KKyAgPCEtLSBVbmNvbW1lbnQgdGhpcyB0byBjaGVjayB0aGUgdmFsaWRpdHkuIFRoaXMgc2lnbmlmaWNhbnRseSBzbG93cyBkb3duIHRoZSB0ZXN0LgorICA8cD4KKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly92YWxpZGF0b3IudzMub3JnL2NoZWNrL3JlZmVyZXIiPjxpbWcKKyAgICAgICAgICBzcmM9Imh0dHA6Ly93d3cudzMub3JnL0ljb25zL3ZhbGlkLXhodG1sMTAiCisgICAgICAgICAgYWx0PSJWYWxpZCBYSFRNTCAxLjAhIiBoZWlnaHQ9IjMxIiB3aWR0aD0iODgiIC8+PC9hPgorICA8L3A+CisgIC0tPgorPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LW5vanEuanMgYi9saWIvanMvdGVzdC90ZXN0LW5vanEuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4MDFkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3Qtbm9qcS5qcwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisgLyoganNoaW50IC1XMTAwICovCisKKy8qCisgKiBKYXZhU2NyaXB0IHRlc3Qgc3VpdGUgZm9yIFRocmlmdFRlc3QudGhyaWZ0LiBUaGVzZSB0ZXN0cworICogd2lsbCBydW4gb25seSB3aXRoIG5vcm1hbCAiLWdlbiBqcyIgQXBhY2hlIFRocmlmdCBpbnRlcmZhY2VzLgorICogVG8gY3JlYXRlIGNsaWVudCBjb2RlOgorICogICAgICAkIHRocmlmdCAtZ2VuIGpzIFRocmlmdFRlc3QudGhyaWZ0CisgKgorICogU2VlIGFsc286CisgKiArKyB0ZXN0LmpzIGZvciBnZW5lcmljIHRlc3RzCisgKiArKyB0ZXN0LWpxLmpzIGZvciAiLWdlbiBqczpqcXVlcnkiIG9ubHkgdGVzdHMKKyAqLworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vQXN5bmMgZXhjZXB0aW9uIHRlc3RzCisKK1FVbml0Lm1vZHVsZSgnTm9qUSBBc3luYycpOworCitRVW5pdC50ZXN0KCdYY2VwdGlvbicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworCisgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJywgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmVycm9yQ29kZSwgMTAwMSk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0Lm1lc3NhZ2UsICdYY2VwdGlvbicpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC5odG1sIGIvbGliL2pzL3Rlc3QvdGVzdC5odG1sCmluZGV4IGMzZmQwYjEuLjhiNjcwMTQgMTAwNzU1Ci0tLSBhL2xpYi9qcy90ZXN0L3Rlc3QuaHRtbAorKysgYi9saWIvanMvdGVzdC90ZXN0Lmh0bWwKQEAgLTEsNCArMSw0IEBACi3vu788IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+CiA8IS0tCiAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTIyLDMwICsyMiwzMyBAQAogICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KICAgPHRpdGxlPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3Q8L3RpdGxlPgogCi0gIDxzY3JpcHQgc3JjPSIvdGhyaWZ0LmpzIiAgICAgICAgICAgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgotICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RocmlmdFRlc3RfdHlwZXMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgotICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RocmlmdFRlc3QuanMiICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iYnVpbGQvanMvdGhyaWZ0LmpzIiAgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzLWpxdWVyeS9UaHJpZnRUZXN0X3R5cGVzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy1qcXVlcnkvVGhyaWZ0VGVzdC5qcyIgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CiAKICAgPCEtLSBqUXVlcnkgLS0+Ci0gIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9qcXVlcnktMS41LjIuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KLSAgCisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9qcXVlcnkuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKwogICA8IS0tIFFVbml0IFRlc3QgZnJhbWV3b3JrLS0+CiAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9xdW5pdC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgogICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImJ1aWxkL2pzL2xpYi9xdW5pdC5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgotICAKKwogICA8IS0tIHRoZSBUZXN0IFN1aXRlLS0+CiAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InRlc3QuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC1qcS5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgogPC9oZWFkPgogPGJvZHk+Ci0gIDxoMSBpZD0icXVuaXQtaGVhZGVyIj5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0ICg8YSBocmVmPSJodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQvdHJ1bmsvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCI+VGhyaWZ0VGVzdC50aHJpZnQ8L2E+KTwvaDE+CisgIDxoMSBpZD0icXVuaXQtaGVhZGVyIj5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0ICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iL21hc3Rlci90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ij5UaHJpZnRUZXN0LnRocmlmdDwvYT4pPC9oMT4KICAgPGgyIGlkPSJxdW5pdC1iYW5uZXIiPjwvaDI+Ci0gIDxkaXYgaWQ9InF1bml0LXRlc3RydW5uZXItdG9vbGJhciI+PC9kaXY+IAorICA8ZGl2IGlkPSJxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIiPjwvZGl2PgogICA8aDIgaWQ9InF1bml0LXVzZXJBZ2VudCI+PC9oMj4KICAgPG9sIGlkPSJxdW5pdC10ZXN0cyI+PGxpPjwhLS0gZ2V0IHZhbGlkIHhodG1sIHN0cmljdC0tPjwvbGk+PC9vbD4KKyAgPCEtLSBVbmNvbW1lbnQgdGhpcyB0byBjaGVjayB0aGUgdmFsaWRpdHkuIFRoaXMgc2lnbmlmaWNhbnRseSBzbG93cyBkb3duIHRoZSB0ZXN0LgogICA8cD4KICAgICAgIDxhIGhyZWY9Imh0dHA6Ly92YWxpZGF0b3IudzMub3JnL2NoZWNrL3JlZmVyZXIiPjxpbWcKICAgICAgICAgICBzcmM9Imh0dHA6Ly93d3cudzMub3JnL0ljb25zL3ZhbGlkLXhodG1sMTAiCiAgICAgICAgICAgYWx0PSJWYWxpZCBYSFRNTCAxLjAhIiBoZWlnaHQ9IjMxIiB3aWR0aD0iODgiIC8+PC9hPgogICA8L3A+CisgIC0tPgogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC5qcyBiL2xpYi9qcy90ZXN0L3Rlc3QuanMKaW5kZXggY2FmMzRhMi4uYTg2YTUwOSAxMDA3NTUKLS0tIGEvbGliL2pzL3Rlc3QvdGVzdC5qcworKysgYi9saWIvanMvdGVzdC90ZXN0LmpzCkBAIC0xNiwzNzEgKzE2LDQwMCBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLSAKLSAKKyAvKiBqc2hpbnQgLVcxMDAgKi8KKwogLyoKLSAqIEphdmFTY3JpcHQgdGVzdCBzdWl0ZQorICogSmF2YVNjcmlwdCB0ZXN0IHN1aXRlIGZvciBUaHJpZnRUZXN0LnRocmlmdC4gVGhlc2UgdGVzdHMKKyAqIHdpbGwgcnVuIGFnYWluc3QgTm9ybWFsICgtZ2VuIGpzKSBhbmQgalF1ZXJ5ICgtZ2VuIGpzOmpxdWVyeSkKKyAqIEFwYWNoZSBUaHJpZnQgaW50ZXJmYWNlcy4KKyAqCisgKiBTeW5jaHJvbm91cyBibG9ja2luZyBjYWxscyBzaG91bGQgYmUgaWRlbnRpY2FsIGluIGJvdGgKKyAqIE5vcm1hbCBhbmQgalF1ZXJ5IGludGVyZmFjZXMuIEFsbCBzeW5jaHJvbm91cyB0ZXN0cyBiZWxvbmcKKyAqIGhlcmUuCisgKgorICogQXN5bmNocm9ub3VzIHN1Y2Nlc3MgY2FsbGJhY2tzIHBhc3NlZCBhcyB0aGUgbGFzdCBwYXJhbWV0ZXIKKyAqIG9mIGFuIFJQQyBjYWxsIHNob3VsZCBiZSBpZGVudGljYWwgaW4gYm90aCBOb3JtYWwgYW5kIGpRdWVyeQorICogaW50ZXJmYWNlcy4gQXN5bmMgc3VjY2VzcyB0ZXN0cyBiZWxvbmcgaGVyZS4KKyAqCisgKiBBc3luY2hyb25vdXMgZXhjZXB0aW9uIHByb2Nlc3NpbmcgaXMgZGlmZmVyZW50IGluIE5vcm1hbAorICogYW5kIGpRdWVyeSBpbnRlcmZhY2VzLiBTdWNoIHRlc3RzIGJlbG9uZyBpbiB0aGUgdGVzdC1ub2pxLmpzCisgKiBvciB0ZXN0LWpxLmpzIGZpbGVzIHJlc3BlY3RpdmVseS4galF1ZXJ5IHNwZWNpZmljIFhIUiBvYmplY3QKKyAqIHRlc3RzIGFsc28gYmVsb25nIGluIHRlc3QtanEuanMuIERvIG5vdCBjcmVhdGUgYW55IGpRdWVyeQorICogZGVwZW5kZW5jaWVzIGluIHRoaXMgZmlsZSBvciBpbiB0ZXN0LW5vanEuanMKKyAqCisgKiBUbyBjb21waWxlIGNsaWVudCBjb2RlIGZvciB0aGlzIHRlc3QgdXNlOgorICogICAgICAkIHRocmlmdCAtZ2VuIGpzIFRocmlmdFRlc3QudGhyaWZ0CisgKiAgICAgIC0tIG9yIC0tCisgKiAgICAgICQgdGhyaWZ0IC1nZW4ganM6anF1ZXJ5IFRocmlmdFRlc3QudGhyaWZ0CisgKgorICogU2VlIGFsc286CisgKiArKyB0ZXN0LW5vanEuanMgZm9yICItZ2VuIGpzIiBvbmx5IHRlc3RzCisgKiArKyB0ZXN0LWpxLmpzIGZvciAiLWdlbiBqczpqcXVlcnkiIG9ubHkgdGVzdHMKICAqLwogCi12YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoIi9zZXJ2aWNlIik7Ci12YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOwotdmFyIGNsaWVudCAgICA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworY29uc3QgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoJy9zZXJ2aWNlJyk7Citjb25zdCBwcm90b2NvbCA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKK2NvbnN0IGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworCisvLyBXb3JrIGFyb3VuZCBmb3Igb2xkIEFQSSB1c2VkIGJ5IFFVbml0QWRhcHRlciBvZiBqc1Rlc3REcml2ZXIKK2lmICh0eXBlb2YgUVVuaXQubG9nID09ICdmdW5jdGlvbicpIHsKKyAgLy8gV2hlbiB1c2luZyByZWFsIFFVbml0IChmcm9uIFBoYW50b21KUykgbG9nIGZhaWx1cmVzIHRvIGNvbnNvbGUKKyAgUVVuaXQubG9nKGZ1bmN0aW9uKGRldGFpbHMpIHsKKyAgICBpZiAoIWRldGFpbHMucmVzdWx0KSB7CisgICAgICBjb25zb2xlLmxvZygnPT09PT09PT0gRkFJTCA9PT09PT09PScpOworICAgICAgY29uc29sZS5sb2coJ1Rlc3ROYW1lOiAnICsgZGV0YWlscy5uYW1lKTsKKyAgICAgIGlmIChkZXRhaWxzLm1lc3NhZ2UpIGNvbnNvbGUubG9nKGRldGFpbHMubWVzc2FnZSk7CisgICAgICBjb25zb2xlLmxvZygnRXhwZWN0ZWQ6ICcgKyBkZXRhaWxzLmV4cGVjdGVkKTsKKyAgICAgIGNvbnNvbGUubG9nKCdBY3R1YWwgIDogJyArIGRldGFpbHMuYWN0dWFsKTsKKyAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09PT09PT09PT09PT09PT09Jyk7CisgICAgfQorICB9KTsKK30KIAogLy8gYWxsIExhbmd1YWdlcyBpbiBVVEYtOAotdmFyIHN0cmluZ1Rlc3QgPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCBBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCBCYWhhc2EgTWVsYXl1LCDZhdin2LLZkNix2YjZhtuMLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayAvIFBpdGtlcm4sIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csIFTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniI7Citjb25zdCBzdHJpbmdUZXN0ID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOwogCitmdW5jdGlvbiBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgbWFwMSwgbWFwMikgeworICBpZiAodHlwZW9mIG1hcDEgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG1hcDIgIT09ICdmdW5jdGlvbicpIHsKKyAgICBpZiAoIW1hcDEgfHwgdHlwZW9mIG1hcDEgIT09ICdvYmplY3QnKSB7CisgICAgICAgIGFzc2VydC5lcXVhbChtYXAxLCBtYXAyKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yIChsZXQga2V5IGluIG1hcDEpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KIAotbW9kdWxlKCJCYXNlIFR5cGVzIik7CitRVW5pdC5tb2R1bGUoJ0Jhc2UgVHlwZXMnKTsKIAotICB0ZXN0KCJWb2lkIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXF1YWxzKGNsaWVudC50ZXN0Vm9pZCgpLCB1bmRlZmluZWQpOworICBRVW5pdC50ZXN0KCdWb2lkJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0Vm9pZCgpLCB1bmRlZmluZWQpOwogICB9KTsKLSAgdGVzdCgiU3RyaW5nIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXF1YWxzKGNsaWVudC50ZXN0U3RyaW5nKHN0cmluZ1Rlc3QpLCBzdHJpbmdUZXN0KTsKKyAgUVVuaXQudGVzdCgnQmluYXJ5IChTdHJpbmcpJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgbGV0IGJpbmFyeSA9ICcnOworICAgIGZvciAobGV0IHYgPSAyNTU7IHYgPj0gMDsgLS12KSB7CisgICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh2KTsKKyAgICB9CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0QmluYXJ5KGJpbmFyeSksIGJpbmFyeSk7CisgIH0pOworICBRVW5pdC50ZXN0KCdCaW5hcnkgKFVpbnQ4QXJyYXkpJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgbGV0IGJpbmFyeSA9ICcnOworICAgIGZvciAobGV0IHYgPSAyNTU7IHYgPj0gMDsgLS12KSB7CisgICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh2KTsKKyAgICB9CisgICAgY29uc3QgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5Lmxlbmd0aCk7CisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaW5hcnkubGVuZ3RoOyArK2kpIHsKKyAgICAgIGFycltpXSA9IGJpbmFyeVtpXS5jaGFyQ29kZUF0KCk7CisgICAgfQorICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEJpbmFyeShhcnIpLCBiaW5hcnkpOworICB9KTsKKyAgUVVuaXQudGVzdCgnU3RyaW5nJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKCcnKSwgJycpOworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdFN0cmluZyhzdHJpbmdUZXN0KSwgc3RyaW5nVGVzdCk7CiAKLSAgICB2YXIgc3BlY2lhbENoYXJhY3RlcnMgPSAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKKyAgICBjb25zdCBzcGVjaWFsQ2hhcmFjdGVycyA9ICdxdW90ZTogXCIgYmFja3NsYXNoOicgKwogICAgICAgICAgICcgZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFwvICcgKwogICAgICAgICAgICcgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICcgKwogICAgICAgICAgICcgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiAiXFxcL1xiXG5cclx0JyArCiAgICAgICAgICAgJyBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48JzsKLSAgICBlcXVhbHMoY2xpZW50LnRlc3RTdHJpbmcoc3BlY2lhbENoYXJhY3RlcnMpLHNwZWNpYWxDaGFyYWN0ZXJzKTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoc3BlY2lhbENoYXJhY3RlcnMpLCBzcGVjaWFsQ2hhcmFjdGVycyk7CiAgIH0pOwotICB0ZXN0KCJEb3VibGUiLCBmdW5jdGlvbigpIHsKLSAgICBlcXVhbHMoY2xpZW50LnRlc3REb3VibGUoMy4xNCksIDMuMTQpOworICBRVW5pdC50ZXN0KCdEb3VibGUnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3REb3VibGUoMCksIDApOworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdERvdWJsZSgtMSksIC0xKTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3REb3VibGUoMy4xNCksIDMuMTQpOworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdERvdWJsZShNYXRoLnBvdygyLCA2MCkpLCBNYXRoLnBvdygyLCA2MCkpOwogICB9KTsKLSAgdGVzdCgiQnl0ZSIsIGZ1bmN0aW9uKCkgewotICAgIGVxdWFscyhjbGllbnQudGVzdEJ5dGUoMHgwMSksIDB4MDEpOworICBRVW5pdC50ZXN0KCdCeXRlJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0Qnl0ZSgwKSwgMCk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0Qnl0ZSgweDAxKSwgMHgwMSk7CiAgIH0pOwotICB0ZXN0KCJJMzIiLCBmdW5jdGlvbigpIHsKLSAgICBlcXVhbHMoY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwzMCkpLCBNYXRoLnBvdygyLDMwKSk7CisgIFFVbml0LnRlc3QoJ0kzMicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEkzMigwKSwgMCk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsIDMwKSksIE1hdGgucG93KDIsIDMwKSk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STMyKC1NYXRoLnBvdygyLCAzMCkpLCAtTWF0aC5wb3coMiwgMzApKTsKICAgfSk7Ci0gIHRlc3QoIkk2NCIsIGZ1bmN0aW9uKCkgewotICAgIGVxdWFscyhjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLDYwKSksIE1hdGgucG93KDIsNjApKTsKKyAgUVVuaXQudGVzdCgnSTY0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STY0KDApLCAwKTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsIDUyKSksIE1hdGgucG93KDIsIDUyKSk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STY0KC1NYXRoLnBvdygyLCA1MikpLCAtTWF0aC5wb3coMiwgNTIpKTsKICAgfSk7CiAKIAotbW9kdWxlKCJTdHJ1Y3R1cmVkIFR5cGVzIik7CitRVW5pdC5tb2R1bGUoJ1N0cnVjdHVyZWQgVHlwZXMnKTsKIAotICB0ZXN0KCJTdHJ1Y3QiLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgc3RydWN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgIFFVbml0LnRlc3QoJ1N0cnVjdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOwogICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKICAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7Ci0gICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsMzApOwotICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLDYwKTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOwogCi0gICAgdmFyIHN0cnVjdFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpOworICAgIGNvbnN0IHN0cnVjdFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpOwogCi0gICAgZXF1YWxzKHN0cnVjdFRlc3RPdXRwdXQuc3RyaW5nX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nKTsKLSAgICBlcXVhbHMoc3RydWN0VGVzdE91dHB1dC5ieXRlX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7Ci0gICAgZXF1YWxzKHN0cnVjdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKLSAgICBlcXVhbHMoc3RydWN0VGVzdE91dHB1dC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOwotICAgIAotICAgIGVxdWFscyhKU09OLnN0cmluZ2lmeShzdHJ1Y3RUZXN0T3V0cHV0KSwgSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdElucHV0KSk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuc3RyaW5nX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwoc3RydWN0VGVzdE91dHB1dC5ieXRlX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwoc3RydWN0VGVzdE91dHB1dC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOworCisgICAgYXNzZXJ0LmVxdWFsKEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RPdXRwdXQpLCBKU09OLnN0cmluZ2lmeShzdHJ1Y3RUZXN0SW5wdXQpKTsKICAgfSk7CiAKLSAgdGVzdCgiTmVzdCIsIGZ1bmN0aW9uKCkgewotICAgIHZhciB4dHJUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKKyAgUVVuaXQudGVzdCgnTmVzdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHh0clRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOwogICAgIHh0clRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKICAgICB4dHJUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7Ci0gICAgeHRyVGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsMzApOwotICAgIHh0clRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLDYwKTsKLSAgICAKLSAgICB2YXIgbmVzdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDIoKTsKKyAgICB4dHJUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICB4dHJUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOworCisgICAgY29uc3QgbmVzdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDIoKTsKICAgICBuZXN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAyOwogICAgIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nID0geHRyVGVzdElucHV0OwotICAgIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwxNSk7Ci0gICAgCi0gICAgdmFyIG5lc3RUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3ROZXN0KG5lc3RUZXN0SW5wdXQpOwotICAgIAotICAgIGVxdWFscyhuZXN0VGVzdE91dHB1dC5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOwotICAgIGVxdWFscyhuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcpOwotICAgIGVxdWFscyhuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZyk7Ci0gICAgZXF1YWxzKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZyk7Ci0gICAgZXF1YWxzKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZyk7Ci0gICAgZXF1YWxzKG5lc3RUZXN0T3V0cHV0LmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcpOwotICAgIAotICAgIGVxdWFscyhKU09OLnN0cmluZ2lmeShuZXN0VGVzdE91dHB1dCksIEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0SW5wdXQpKTsKKyAgICBuZXN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDE1KTsKKworICAgIGNvbnN0IG5lc3RUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3ROZXN0KG5lc3RUZXN0SW5wdXQpOworCisgICAgYXNzZXJ0LmVxdWFsKG5lc3RUZXN0T3V0cHV0LmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LmkzMl90aGluZyk7CisKKyAgICBhc3NlcnQuZXF1YWwoSlNPTi5zdHJpbmdpZnkobmVzdFRlc3RPdXRwdXQpLCBKU09OLnN0cmluZ2lmeShuZXN0VGVzdElucHV0KSk7CiAgIH0pOwogCi0gIHRlc3QoIk1hcCIsIGZ1bmN0aW9uKCkgewotICAgIHZhciBtYXBUZXN0SW5wdXQgPSB7Nzo3NywgODo4OCwgOTo5OX07CisgIFFVbml0LnRlc3QoJ01hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IG1hcFRlc3RJbnB1dCA9IHs3OiA3NywgODogODgsIDk6IDk5fTsKIAotICAgIHZhciBtYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RNYXAobWFwVGVzdElucHV0KTsKKyAgICBjb25zdCBtYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RNYXAobWFwVGVzdElucHV0KTsKIAotICAgIGZvciAodmFyIGtleSBpbiBtYXBUZXN0T3V0cHV0KSB7Ci0gICAgICBlcXVhbHMobWFwVGVzdE91dHB1dFtrZXldLCBtYXBUZXN0SW5wdXRba2V5XSk7CisgICAgZm9yIChsZXQga2V5IGluIG1hcFRlc3RPdXRwdXQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKICAgICB9CiAgIH0pOwogCi0gIHRlc3QoIlN0cmluZ01hcCIsIGZ1bmN0aW9uKCkgewotICAgIHZhciBtYXBUZXN0SW5wdXQgPSB7Ci0gICAgICAiYSI6IjEyMyIsICJhIGIiOiJ3aXRoIHNwYWNlcyAiLCAic2FtZSI6InNhbWUiLCAiMCI6Im51bWVyaWMga2V5IiwKLSAgICAgICJsb25nVmFsdWUiOnN0cmluZ1Rlc3QsIHN0cmluZ1Rlc3Q6Imxvbmcga2V5IgorICBRVW5pdC50ZXN0KCdTdHJpbmdNYXAnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCBtYXBUZXN0SW5wdXQgPSB7CisgICAgICAnYSc6ICcxMjMnLCAnYSBiJzogJ3dpdGggc3BhY2VzICcsICdzYW1lJzogJ3NhbWUnLCAnMCc6ICdudW1lcmljIGtleScsCisgICAgICAnbG9uZ1ZhbHVlJzogc3RyaW5nVGVzdCwgc3RyaW5nVGVzdDogJ2xvbmcga2V5JwogICAgIH07CiAKLSAgICB2YXIgbWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0U3RyaW5nTWFwKG1hcFRlc3RJbnB1dCk7CisgICAgY29uc3QgbWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0U3RyaW5nTWFwKG1hcFRlc3RJbnB1dCk7CiAKLSAgICBmb3IgKHZhciBrZXkgaW4gbWFwVGVzdE91dHB1dCkgewotICAgICAgZXF1YWxzKG1hcFRlc3RPdXRwdXRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOworICAgIGZvciAobGV0IGtleSBpbiBtYXBUZXN0T3V0cHV0KSB7CisgICAgICBhc3NlcnQuZXF1YWwobWFwVGVzdE91dHB1dFtrZXldLCBtYXBUZXN0SW5wdXRba2V5XSk7CiAgICAgfQogICB9KTsKIAotICB0ZXN0KCJTZXQiLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgc2V0VGVzdElucHV0ID0gWzEsMiwzXTsKLSAgICBvayhjbGllbnQudGVzdFNldChzZXRUZXN0SW5wdXQpLCBzZXRUZXN0SW5wdXQpOworICBRVW5pdC50ZXN0KCdTZXQnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCBzZXRUZXN0SW5wdXQgPSBbMSwgMiwgM107CisgICAgYXNzZXJ0Lm9rKGNsaWVudC50ZXN0U2V0KHNldFRlc3RJbnB1dCksIHNldFRlc3RJbnB1dCk7CiAgIH0pOwogCi0gIHRlc3QoIkxpc3QiLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgbGlzdFRlc3RJbnB1dCA9IFsxLDIsM107Ci0gICAgb2soY2xpZW50LnRlc3RMaXN0KGxpc3RUZXN0SW5wdXQpLCBsaXN0VGVzdElucHV0KTsKKyAgUVVuaXQudGVzdCgnTGlzdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IGxpc3RUZXN0SW5wdXQgPSBbMSwgMiwgM107CisgICAgYXNzZXJ0Lm9rKGNsaWVudC50ZXN0TGlzdChsaXN0VGVzdElucHV0KSwgbGlzdFRlc3RJbnB1dCk7CiAgIH0pOwogCi0gIHRlc3QoIkVudW0iLCBmdW5jdGlvbigpIHsKLSAgICBlcXVhbHMoY2xpZW50LnRlc3RFbnVtKFRocmlmdFRlc3QuTnVtYmVyei5PTkUpLCBUaHJpZnRUZXN0Lk51bWJlcnouT05FKTsKKyAgUVVuaXQudGVzdCgnRW51bScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEVudW0oVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSksIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOwogICB9KTsKIAotICB0ZXN0KCJUeXBlRGVmIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXF1YWxzKGNsaWVudC50ZXN0VHlwZWRlZig2OSksIDY5KTsKKyAgUVVuaXQudGVzdCgnVHlwZURlZicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdFR5cGVkZWYoNjkpLCA2OSk7CiAgIH0pOwogCisgIFFVbml0LnRlc3QoJ1NraXAnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCBzdHJ1Y3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKKyAgICBjb25zdCBtb2RpZmllZENsaWVudCA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOwogCi1tb2R1bGUoImRlZXBlciEiKTsKKyAgICBtb2RpZmllZENsaWVudC5yZWN2X3Rlc3RTdHJ1Y3QgPSBmdW5jdGlvbigpIHsKKyAgICAgIGNvbnN0IGlucHV0ID0gbW9kaWZpZWRDbGllbnQuaW5wdXQ7CisgICAgICBjb25zdCB4dHJ1Y3QzID0gbmV3IFRocmlmdFRlc3QuWHRydWN0MygpOwogCi0gIHRlc3QoIk1hcE1hcCIsIGZ1bmN0aW9uKCkgewotICAgIHZhciBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQgPSB7Ci0gICAgICAiNCI6eyIxIjoxLCIyIjoyLCIzIjozLCI0Ijo0fSwKLSAgICAgICItNCI6eyItNCI6LTQsICItMyI6LTMsICItMiI6LTIsICItMSI6LTF9CisgICAgICBpbnB1dC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICBpbnB1dC5yZWFkU3RydWN0QmVnaW4oKTsKKworICAgICAgLy8gcmVhZCBYdHJ1Y3QgZGF0YSB3aXRoIFh0cnVjdDMKKyAgICAgIGlucHV0LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICB4dHJ1Y3QzLnJlYWQoaW5wdXQpOworICAgICAgaW5wdXQucmVhZEZpZWxkRW5kKCk7CisgICAgICAvLyByZWFkIFRocmlmdC5UeXBlLlNUT1AgbWVzc2FnZQorICAgICAgaW5wdXQucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgIGlucHV0LnJlYWRGaWVsZEVuZCgpOworCisgICAgICBpbnB1dC5yZWFkU3RydWN0RW5kKCk7CisgICAgICBpbnB1dC5yZWFkTWVzc2FnZUVuZCgpOworCisgICAgICByZXR1cm4geHRydWN0MzsKICAgICB9OwogCi0gICAgdmFyIG1hcE1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdE1hcE1hcCgxKTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CisgICAgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOworICAgIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAzMCk7CisgICAgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgIGNvbnN0IHN0cnVjdFRlc3RPdXRwdXQgPSBtb2RpZmllZENsaWVudC50ZXN0U3RydWN0KHN0cnVjdFRlc3RJbnB1dCk7CisKKyAgICBhc3NlcnQuZXF1YWwoc3RydWN0VGVzdE91dHB1dCBpbnN0YW5jZW9mIFRocmlmdFRlc3QuWHRydWN0MywgdHJ1ZSk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuc3RyaW5nX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwoc3RydWN0VGVzdE91dHB1dC5jaGFuZ2VkLCBudWxsKTsKKyAgICBhc3NlcnQuZXF1YWwoc3RydWN0VGVzdE91dHB1dC5pMzJfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0Lmk2NF90aGluZywgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyk7CisgIH0pOwogCiAKLSAgICBmb3IgKHZhciBrZXkgaW4gbWFwTWFwVGVzdE91dHB1dCkgewotICAgICAgZm9yICh2YXIga2V5MiBpbiBtYXBNYXBUZXN0T3V0cHV0W2tleV0pIHsKLSAgICAgICAgZXF1YWxzKG1hcE1hcFRlc3RPdXRwdXRba2V5XVtrZXkyXSwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0W2tleV1ba2V5Ml0pOworUVVuaXQubW9kdWxlKCdkZWVwZXIhJyk7CisKKyAgUVVuaXQudGVzdCgnTWFwTWFwJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0ID0geworICAgICAgJzQnOiB7JzEnOiAxLCAnMic6IDIsICczJzogMywgJzQnOiA0fSwKKyAgICAgICctNCc6IHsnLTQnOiAtNCwgJy0zJzogLTMsICctMic6IC0yLCAnLTEnOiAtMX0KKyAgICB9OworCisgICAgY29uc3QgbWFwTWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TWFwTWFwKDEpOworCisKKyAgICBmb3IgKGxldCBrZXkgaW4gbWFwTWFwVGVzdE91dHB1dCkgeworICAgICAgZm9yIChsZXQga2V5MiBpbiBtYXBNYXBUZXN0T3V0cHV0W2tleV0pIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKG1hcE1hcFRlc3RPdXRwdXRba2V5XVtrZXkyXSwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0W2tleV1ba2V5Ml0pOwogICAgICAgfQogICAgIH0KLSAgICAKLSAgICBlcXVhbHMoSlNPTi5zdHJpbmdpZnkobWFwTWFwVGVzdE91dHB1dCksIEpTT04uc3RyaW5naWZ5KG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCkpOworCisgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcE1hcFRlc3RPdXRwdXQsIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCk7CiAgIH0pOwogCiAKLW1vZHVsZSgiRXhjZXB0aW9uIik7CitRVW5pdC5tb2R1bGUoJ0V4Y2VwdGlvbicpOwogCi0gIHRlc3QoIlhjZXB0aW9uIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KDIpOwotICAgIHRyeXsKLSAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpOwotICAgIH1jYXRjaChlKXsKLSAgICAgIGVxdWFscyhlLmVycm9yQ29kZSwgMTAwMSk7Ci0gICAgICBlcXVhbHMoZS5tZXNzYWdlLCAiWGNlcHRpb24iKTsKKyAgUVVuaXQudGVzdCgnWGNlcHRpb24nLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB0cnkgeworICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJyk7CisgICAgICBhc3NlcnQub2soZmFsc2UpOworICAgIH1jYXRjaCAoZSkgeworICAgICAgYXNzZXJ0LmVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICdYY2VwdGlvbicpOworICAgICAgZG9uZSgpOwogICAgIH0KICAgfSk7CiAKLSAgdGVzdCgibm8gRXhjZXB0aW9uIiwgZnVuY3Rpb24oKSB7Ci0gICAgdHJ5ewotICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIm5vIEV4Y2VwdGlvbiIpOwotICAgIH1jYXRjaChlKXsKLSAgICAgIG9rKGZhbHNlKTsKKyAgUVVuaXQudGVzdCgnbm8gRXhjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICB0cnkgeworICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ25vIEV4Y2VwdGlvbicpOworICAgICAgYXNzZXJ0Lm9rKHRydWUpOworICAgIH1jYXRjaCAoZSkgeworICAgICAgYXNzZXJ0Lm9rKGZhbHNlKTsKICAgICB9CiAgIH0pOwogCi0gIHRlc3QoInVuZXhwZWN0ZWQgQXBwbGljYXRpb24gRXhjZXB0aW9uIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KDEpOwotICAgIHRyeXsKLSAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpOwotICAgIH0gY2F0Y2goZSkgewotICAgICAgb2sodHJ1ZSk7IC8vQEhBQ0s6IGlnbm9yZSBmYXVsdHkgamF2YSBzZXJ2ZXIgcmVzcG9uc2UgZm9yIGV4Y2VwdGlvbnMKLSAgICAgIC8vZXF1YWxzKGUubWVzc2FnZSwgIkFwcGxpY2F0aW9uRXhjZXB0aW9uIik7CisgIFFVbml0LnRlc3QoJ1RFeGNlcHRpb24nLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAvL1RocmlmdFRlc3QgZG9lcyBub3QgbGlzdCBURXhjZXB0aW9uIGFzIGEgbGVnYWwgZXhjZXB0aW9uIHNvIGl0IHdpbGwKKyAgICAvLyBnZW5lcmF0ZSBhbiBleGNlcHRpb24gb24gdGhlIHNlcnZlciB0aGF0IGRvZXMgbm90IHByb3BhZ2F0ZSBiYWNrIHRvCisgICAgLy8gdGhlIGNsaWVudC4gVGhpcyB0ZXN0IGhhcyBiZWVuIG1vZGlmaWVkIHRvIGVxdWF0ZSB0byAibm8gZXhjZXB0aW9uIgorICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgdHJ5IHsKKyAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdURXhjZXB0aW9uJyk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgLy9hc3NlcnQub2soZmFsc2UpOwogICAgIH0KKyAgICBhc3NlcnQub2sodHJ1ZSk7CiAgIH0pOwogCiAKLW1vZHVsZSgiSW5zYW5pdHkiKTsKK1FVbml0Lm1vZHVsZSgnSW5zYW5pdHknKTsKIAotICB0ZXN0KCJ0ZXN0SW5zYW5pdHkiLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgaW5zYW5pdHkgPSB7Ci0gICAgICAiMSI6ewotICAgICAgICAiMyI6ewotICAgICAgICAgICJ1c2VyTWFwIjp7ICI4Ijo4LCAiNSI6NSB9LAotICAgICAgICAgICJ4dHJ1Y3RzIjpbewotICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIjoiR29vZGJ5ZTQiLAotICAgICAgICAgICAgICAiYnl0ZV90aGluZyI6NCwKLSAgICAgICAgICAgICAgImkzMl90aGluZyI6NCwKLSAgICAgICAgICAgICAgImk2NF90aGluZyI6NAotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgInN0cmluZ190aGluZyI6IkhlbGxvMiIsCi0gICAgICAgICAgICAgICJieXRlX3RoaW5nIjoyLAotICAgICAgICAgICAgICAiaTMyX3RoaW5nIjoyLAotICAgICAgICAgICAgICAiaTY0X3RoaW5nIjoyCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgXQotICAgICAgICB9LAotICAgICAgICAiMiI6ewotICAgICAgICAgICJ1c2VyTWFwIjp7ICI4Ijo4LCAiNSI6NSB9LAotICAgICAgICAgICJ4dHJ1Y3RzIjpbewotICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIjoiR29vZGJ5ZTQiLAotICAgICAgICAgICAgICAiYnl0ZV90aGluZyI6NCwKLSAgICAgICAgICAgICAgImkzMl90aGluZyI6NCwKLSAgICAgICAgICAgICAgImk2NF90aGluZyI6NAotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgInN0cmluZ190aGluZyI6IkhlbGxvMiIsCi0gICAgICAgICAgICAgICJieXRlX3RoaW5nIjoyLAotICAgICAgICAgICAgICAiaTMyX3RoaW5nIjoyLAotICAgICAgICAgICAgICAiaTY0X3RoaW5nIjoyCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgXQotICAgICAgICB9CisgIGNvbnN0IGNyYXp5ID0geworICAgICd1c2VyTWFwJzogeyAnNSc6IDUsICc4JzogOCB9LAorICAgICd4dHJ1Y3RzJzogW3sKKyAgICAgICdzdHJpbmdfdGhpbmcnOiAnR29vZGJ5ZTQnLAorICAgICAgJ2J5dGVfdGhpbmcnOiA0LAorICAgICAgJ2kzMl90aGluZyc6IDQsCisgICAgICAnaTY0X3RoaW5nJzogNAorICAgIH0sCisgICAgeworICAgICAgJ3N0cmluZ190aGluZyc6ICdIZWxsbzInLAorICAgICAgJ2J5dGVfdGhpbmcnOiAyLAorICAgICAgJ2kzMl90aGluZyc6IDIsCisgICAgICAnaTY0X3RoaW5nJzogMgorICAgIH1dCisgIH07CisgIFFVbml0LnRlc3QoJ3Rlc3RJbnNhbml0eScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IGluc2FuaXR5ID0geworICAgICAgJzEnOiB7CisgICAgICAgICcyJzogY3JhenksCisgICAgICAgICczJzogY3JhenkKICAgICAgIH0sCi0gICAgICAiMiI6eyAiNiI6eyAidXNlck1hcCI6bnVsbCwgInh0cnVjdHMiOm51bGwgfSB9CisgICAgICAnMic6IHsgJzYnOiB7ICd1c2VyTWFwJzogbnVsbCwgJ3h0cnVjdHMnOiBudWxsIH0gfQogICAgIH07Ci0gICAgdmFyIHJlcyA9IGNsaWVudC50ZXN0SW5zYW5pdHkoIiIpOwotICAgIG9rKHJlcywgSlNPTi5zdHJpbmdpZnkocmVzKSk7Ci0gICAgb2soaW5zYW5pdHksIEpTT04uc3RyaW5naWZ5KGluc2FuaXR5KSk7Ci0gICAgZXF1YWxzKEpTT04uc3RyaW5naWZ5KHJlcyksIEpTT04uc3RyaW5naWZ5KGluc2FuaXR5KSk7IC8vVE9ETzogcmVhZCBhbmQgY29tcGFyZSBtYXBzIHJlY3Vyc2l2ZWx5CisgICAgY29uc3QgcmVzID0gY2xpZW50LnRlc3RJbnNhbml0eShuZXcgVGhyaWZ0VGVzdC5JbnNhbml0eShjcmF6eSkpOworICAgIGFzc2VydC5vayhyZXMsIEpTT04uc3RyaW5naWZ5KHJlcykpOworICAgIGFzc2VydC5vayhpbnNhbml0eSwgSlNPTi5zdHJpbmdpZnkoaW5zYW5pdHkpKTsKKworICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCByZXMsIGluc2FuaXR5KTsKICAgfSk7CiAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy9SdW4gc2FtZSB0ZXN0cyBhc3luY2hyb25vdXNseQotalF1ZXJ5LmFqYXhTZXR1cCh7IHRpbWVvdXQ6IDAgfSk7Ci0kKGRvY3VtZW50KS5hamF4RXJyb3IoIGZ1bmN0aW9uKCkgeyBRVW5pdC5zdGFydCgpOyB9ICk7CiAKLW1vZHVsZSgiQXN5bmMgTWFudWFsIik7CitRVW5pdC5tb2R1bGUoJ0FzeW5jJyk7CiAKLSAgdGVzdCgidGVzdEkzMiIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMiApOwotICAgIFFVbml0LnN0b3AoKTsKKyAgUVVuaXQudGVzdCgnRG91YmxlJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKIAotICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgpOwotICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7Ci0gICAgdmFyIGNsaWVudCAgICA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOwotCi0gICAgdmFyIGpxeGhyID0galF1ZXJ5LmFqYXgoewotICAgICAgdXJsOiAiL3NlcnZpY2UiLAotICAgICAgZGF0YTogY2xpZW50LnNlbmRfdGVzdEkzMihNYXRoLnBvdygtMiwzMSkpLAotICAgICAgdHlwZTogIlBPU1QiLAotICAgICAgY2FjaGU6IGZhbHNlLAotICAgICAgZGF0YVR5cGU6ICJ0ZXh0IiwKLSAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlcyl7Ci0gICAgICAgIHRyYW5zcG9ydC5zZXRSZWN2QnVmZmVyKCByZXMgKTsKLSAgICAgICAgZXF1YWxzKGNsaWVudC5yZWN2X3Rlc3RJMzIoKSwgTWF0aC5wb3coLTIsMzEpKTsKLSAgICAgIH0sCi0gICAgICBlcnJvcjogZnVuY3Rpb24oKSB7IG9rKGZhbHNlKTsgfSwKLSAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHsKLSAgICAgICAgb2sodHJ1ZSk7Ci0gICAgICAgIFFVbml0LnN0YXJ0KCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0pOwotCi0KLSAgdGVzdCgidGVzdEk2NCIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMiApOwotICAgIFFVbml0LnN0b3AoKTsKLQotICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgpOwotICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7Ci0gICAgdmFyIGNsaWVudCAgICA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOwotCi0gICAgalF1ZXJ5LmFqYXgoewotICAgICAgdXJsOiAiL3NlcnZpY2UiLAotICAgICAgZGF0YTogY2xpZW50LnNlbmRfdGVzdEk2NChNYXRoLnBvdygtMiw2MSkpLAotICAgICAgdHlwZTogIlBPU1QiLAotICAgICAgY2FjaGU6IGZhbHNlLAotICAgICAgZGF0YVR5cGU6ICJ0ZXh0IiwKLSAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlcyl7Ci0gICAgICAgIHRyYW5zcG9ydC5zZXRSZWN2QnVmZmVyKCByZXMgKTsKLSAgICAgICAgZXF1YWxzKGNsaWVudC5yZWN2X3Rlc3RJNjQoKSwgTWF0aC5wb3coLTIsNjEpKTsKLSAgICAgIH0sCi0gICAgICBlcnJvcjogZnVuY3Rpb24oKSB7IG9rKGZhbHNlKTsgfSwKLSAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHsKLSAgICAgICAgb2sodHJ1ZSk7Ci0gICAgICAgIFFVbml0LnN0YXJ0KCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0pOwotCi0KLW1vZHVsZSgiQXN5bmMiKTsKLQotICB0ZXN0KCJEb3VibGUiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDEgKTsKLQotICAgIFFVbml0LnN0b3AoKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CiAgICAgY2xpZW50LnRlc3REb3VibGUoMy4xNDE1OTI2NSwgZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICBlcXVhbHMocmVzdWx0LCAzLjE0MTU5MjY1KTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAzLjE0MTU5MjY1KTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgdGVzdCgiQnl0ZSIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMSApOworICBRVW5pdC50ZXN0KCdCeXRlJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKIAotICAgIFFVbml0LnN0b3AoKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CiAgICAgY2xpZW50LnRlc3RCeXRlKDB4MDEsIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWxzKHJlc3VsdCwgMHgwMSk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMHgwMSk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwogCi0gIHRlc3QoIkkzMiIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMyApOworICBRVW5pdC50ZXN0KCdJMzInLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOwogCi0gICAgUVVuaXQuc3RvcCgpOwotICAgIGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsMzApLCBmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIGVxdWFscyhyZXN1bHQsIE1hdGgucG93KDIsMzApKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygyKTsKKyAgICBjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLCAzMCksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgMzApKTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKIAotICAgIFFVbml0LnN0b3AoKTsKLSAgICB2YXIganF4aHIgPSBjbGllbnQudGVzdEkzMihNYXRoLnBvdygtMiwzMSksIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWxzKHJlc3VsdCwgTWF0aC5wb3coLTIsMzEpKTsKLSAgICB9KTsKLQotICAgIGpxeGhyLnN1Y2Nlc3MoZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICBlcXVhbHMocmVzdWx0LCBNYXRoLnBvdygtMiwzMSkpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdEkzMihNYXRoLnBvdygtMiwgMzEpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLCAzMSkpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAotICB0ZXN0KCJJNjQiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDQgKTsKKyAgUVVuaXQudGVzdCgnSTY0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKIAotICAgIFFVbml0LnN0b3AoKTsKLSAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLDYwKSwgZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICBlcXVhbHMocmVzdWx0LCBNYXRoLnBvdygyLDYwKSk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMik7CisgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgIGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsIDUyKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCA1MikpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogCi0gICAgUVVuaXQuc3RvcCgpOwotICAgIGNsaWVudC50ZXN0STY0KE1hdGgucG93KC0yLDYxKSwgZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICBlcXVhbHMocmVzdWx0LCBNYXRoLnBvdygtMiw2MSkpOwotICAgIH0pCi0gICAgLmVycm9yKCBmdW5jdGlvbihlKSB7ICBvayhmYWxzZSk7IH0gKQotICAgIC5zdWNjZXNzKGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWxzKHJlc3VsdCwgTWF0aC5wb3coLTIsNjEpKTsKLSAgICB9KQotICAgIC5jb21wbGV0ZShmdW5jdGlvbigpIHsKLSAgICAgIG9rKHRydWUpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKLSAgICB9KTsKLSAgfSk7Ci0KLSAgdGVzdCgiWGNlcHRpb24iLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDIgKTsKLQotICAgIFFVbml0LnN0b3AoKTsKLQotICAgIHZhciBkZmQgPSBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iLCBmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIG9rKGZhbHNlKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7Ci0gICAgfSkKLSAgICAuZXJyb3IoZnVuY3Rpb24oZSl7Ci0gICAgICBlcXVhbHMoZS5lcnJvckNvZGUsIDEwMDEpOwotICAgICAgZXF1YWxzKGUubWVzc2FnZSwgIlhjZXB0aW9uIik7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygtMiwgNTIpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLCA1MikpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3RfaGFuZGxlci5qcyBiL2xpYi9qcy90ZXN0L3Rlc3RfaGFuZGxlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjVmN2JkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdF9oYW5kbGVyLmpzCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vVGhpcyBpcyB0aGUgc2VydmVyIHNpZGUgTm9kZSB0ZXN0IGhhbmRsZXIgZm9yIHRoZSBzdGFuZGFyZAorLy8gIEFwYWNoZSBUaHJpZnQgdGVzdCBzZXJ2aWNlLgorCitjb25zdCBlczZNb2RlID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLWVzNicpOworY29uc3QgZ2VuRm9sZGVyID0gZXM2TW9kZSA/ICdnZW4tbm9kZWpzLWVzNicgOiAnZ2VuLW5vZGVqcyc7Citjb25zdCB0dHlwZXMgPSByZXF1aXJlKGAuLyR7Z2VuRm9sZGVyfS9UaHJpZnRUZXN0X3R5cGVzYCk7Citjb25zdCBURXhjZXB0aW9uID0gcmVxdWlyZSgnLi4vLi4vbm9kZWpzL2xpYi90aHJpZnQnKS5URXhjZXB0aW9uOworCitleHBvcnRzLlRocmlmdFRlc3RIYW5kbGVyID0geworICB0ZXN0Vm9pZDogZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RWb2lkKCknKTsKKyAgICByZXN1bHQobnVsbCk7CisgIH0sCisgIHRlc3RTdHJpbmc6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdFN0cmluZyhcJycgKyB0aGluZyArICdcJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0Qnl0ZTogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0Qnl0ZSgnICsgdGhpbmcgKyAnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RJMzI6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdEkzMignICsgdGhpbmcgKyAnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RJNjQ6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdEk2NCgnICsgdGhpbmcgKyAnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3REb3VibGU6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdERvdWJsZSgnICsgdGhpbmcgKyAnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RCaW5hcnk6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdEJpbmFyeShcJycgKyB0aGluZyArICdcJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0U3RydWN0OiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RTdHJ1Y3QoJyk7CisgICAgY29uc29sZS5sb2codGhpbmcpOworICAgIGNvbnNvbGUubG9nKCcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdE5lc3Q6IGZ1bmN0aW9uKG5lc3QsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0TmVzdCgnKTsKKyAgICBjb25zb2xlLmxvZyhuZXN0KTsKKyAgICBjb25zb2xlLmxvZygnKScpOworICAgIHJlc3VsdChudWxsLCBuZXN0KTsKKyAgfSwKKyAgdGVzdE1hcDogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0TWFwKCcpOworICAgIGNvbnNvbGUubG9nKHRoaW5nKTsKKyAgICBjb25zb2xlLmxvZygnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RTdHJpbmdNYXA6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdFN0cmluZ01hcCgnKTsKKyAgICBjb25zb2xlLmxvZyh0aGluZyk7CisgICAgY29uc29sZS5sb2coJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0U2V0OiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RTZXQoJyk7CisgICAgY29uc29sZS5sb2codGhpbmcpOworICAgIGNvbnNvbGUubG9nKCcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdExpc3Q6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdExpc3QoJyk7CisgICAgY29uc29sZS5sb2codGhpbmcpOworICAgIGNvbnNvbGUubG9nKCcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdEVudW06IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdEVudW0oJyArIHRoaW5nICsgJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0VHlwZWRlZjogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0VHlwZWRlZignICsgdGhpbmcgKyAnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RNYXBNYXA6IGZ1bmN0aW9uKGhlbGxvLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdE1hcE1hcCgnICsgaGVsbG8gKyAnKScpOworCisgICAgY29uc3QgbWFwbWFwID0gW107CisgICAgY29uc3QgcG9zID0gW107CisgICAgY29uc3QgbmVnID0gW107CisgICAgZm9yIChsZXQgaSA9IDE7IGkgPCA1OyBpKyspIHsKKyAgICAgIHBvc1tpXSA9IGk7CisgICAgICBuZWdbLWldID0gLWk7CisgICAgfQorICAgIG1hcG1hcFs0XSA9IHBvczsKKyAgICBtYXBtYXBbLTRdID0gbmVnOworCisgICAgcmVzdWx0KG51bGwsIG1hcG1hcCk7CisgIH0sCisgIHRlc3RJbnNhbml0eTogZnVuY3Rpb24oYXJndW1lbnQsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0SW5zYW5pdHkoJyk7CisgICAgY29uc29sZS5sb2coYXJndW1lbnQpOworICAgIGNvbnNvbGUubG9nKCcpJyk7CisKKyAgICBjb25zdCBoZWxsbyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gJ0hlbGxvMic7CisgICAgaGVsbG8uYnl0ZV90aGluZyA9IDI7CisgICAgaGVsbG8uaTMyX3RoaW5nID0gMjsKKyAgICBoZWxsby5pNjRfdGhpbmcgPSAyOworCisgICAgY29uc3QgZ29vZGJ5ZSA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgZ29vZGJ5ZS5zdHJpbmdfdGhpbmcgPSAnR29vZGJ5ZTQnOworICAgIGdvb2RieWUuYnl0ZV90aGluZyA9IDQ7CisgICAgZ29vZGJ5ZS5pMzJfdGhpbmcgPSA0OworICAgIGdvb2RieWUuaTY0X3RoaW5nID0gNDsKKworICAgIGNvbnN0IGNyYXp5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSgpOworICAgIGNyYXp5LnVzZXJNYXAgPSBbXTsKKyAgICBjcmF6eS51c2VyTWFwW3R0eXBlcy5OdW1iZXJ6LkVJR0hUXSA9IDg7CisgICAgY3JhenkudXNlck1hcFt0dHlwZXMuTnVtYmVyei5GSVZFXSA9IDU7CisgICAgY3JhenkueHRydWN0cyA9IFtnb29kYnllLCBoZWxsb107CisKKyAgICBjb25zdCBmaXJzdF9tYXAgPSBbXTsKKyAgICBjb25zdCBzZWNvbmRfbWFwID0gW107CisKKyAgICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVFdPXSA9IGNyYXp5OworICAgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5USFJFRV0gPSBjcmF6eTsKKworICAgIGNvbnN0IGxvb25leSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoKTsKKyAgICBzZWNvbmRfbWFwW3R0eXBlcy5OdW1iZXJ6LlNJWF0gPSBsb29uZXk7CisKKyAgICBjb25zdCBpbnNhbmUgPSBbXTsKKyAgICBpbnNhbmVbMV0gPSBmaXJzdF9tYXA7CisgICAgaW5zYW5lWzJdID0gc2Vjb25kX21hcDsKKworICAgIGNvbnNvbGUubG9nKCdpbnNhbmUgcmVzdWx0OicpOworICAgIGNvbnNvbGUubG9nKGluc2FuZSk7CisgICAgcmVzdWx0KG51bGwsIGluc2FuZSk7CisgIH0sCisgIHRlc3RNdWx0aTogZnVuY3Rpb24oYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RNdWx0aSgpJyk7CisKKyAgICBjb25zdCBoZWxsbyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gJ0hlbGxvMic7CisgICAgaGVsbG8uYnl0ZV90aGluZyA9IGFyZzA7CisgICAgaGVsbG8uaTMyX3RoaW5nID0gYXJnMTsKKyAgICBoZWxsby5pNjRfdGhpbmcgPSBhcmcyOworICAgIHJlc3VsdChudWxsLCBoZWxsbyk7CisgIH0sCisgIHRlc3RFeGNlcHRpb246IGZ1bmN0aW9uKGFyZywgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RFeGNlcHRpb24oJyArIGFyZyArICcpJyk7CisgICAgaWYgKGFyZyA9PT0gJ1hjZXB0aW9uJykgeworICAgICAgY29uc3QgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgIHgubWVzc2FnZSA9IGFyZzsKKyAgICAgIHJlc3VsdCh4KTsKKyAgICB9IGVsc2UgaWYgKGFyZyA9PT0gJ1RFeGNlcHRpb24nKSB7CisgICAgICByZXN1bHQobmV3IFRFeGNlcHRpb24oYXJnKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdChudWxsKTsKKyAgICB9CisgIH0sCisgIHRlc3RNdWx0aUV4Y2VwdGlvbjogZnVuY3Rpb24oYXJnMCwgYXJnMSwgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RNdWx0aUV4Y2VwdGlvbignICsgYXJnMCArICcsICcgKyBhcmcxICsgJyknKTsKKyAgICBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbicpKSB7CisgICAgICBjb25zdCB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgICAgeC5tZXNzYWdlID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24nOworICAgICAgcmVzdWx0KHgpOworICAgIH0gZWxzZSBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbjInKSkgeworICAgICAgY29uc3QgeDIgPSBuZXcgdHR5cGVzLlhjZXB0aW9uMigpOworICAgICAgeDIuZXJyb3JDb2RlID0gMjAwMjsKKyAgICAgIHgyLnN0cnVjdF90aGluZyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgICB4Mi5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24yJzsKKyAgICAgIHJlc3VsdCh4Mik7CisgICAgfQorCisgICAgY29uc3QgcmVzID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICByZXMuc3RyaW5nX3RoaW5nID0gYXJnMTsKKyAgICByZXN1bHQobnVsbCwgcmVzKTsKKyAgfSwKKyAgdGVzdE9uZXdheTogZnVuY3Rpb24oc2xlZXBGb3IsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0T25ld2F5KCcgKyBzbGVlcEZvciArICcpID0+IEphdmFTY3JpcHQgKGxpa2UgUnVzdCkgbmV2ZXIgc2xlZXBzIScpOworICB9Cit9OyAgIC8vVGhyaWZ0VGVzdFN2Y0hhbmRsZXIKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3R3cy5odG1sIGIvbGliL2pzL3Rlc3QvdGVzdHdzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg0NTAwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3R3cy5odG1sCkBAIC0wLDAgKzEsNjIgQEAKK++7vzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+CisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICA8dGl0bGU+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdDwvdGl0bGU+CisKKyAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL3RocmlmdC5qcyIgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0X3R5cGVzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0LmpzIiAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKworICA8IS0tIGpRdWVyeSAtLT4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYnVpbGQvanMvbGliL2pxdWVyeS5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorCisgIDwhLS0gUVVuaXQgVGVzdCBmcmFtZXdvcmstLT4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYnVpbGQvanMvbGliL3F1bml0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYnVpbGQvanMvbGliL3F1bml0LmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIC8+CisKKyAgPCEtLSB0aGUgVGVzdCBTdWl0ZS0tPgorICA8c2NyaXB0PgorICAgIGNvbnN0IGxvYyA9IHdpbmRvdy5sb2NhdGlvbjsKKyAgICBjb25zdCB3c191cmkgPSAoKGxvYy5wcm90b2NvbCA9PT0gImh0dHBzOiIpID8gIndzczovLyIgOiAid3M6Ly8iKSArCisgICAgICAgICAgICAgICAgICAgbG9jLmhvc3RuYW1lICsgIjoiICsgbG9jLnBvcnQgKyBsb2MucGF0aG5hbWU7CisgICAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UV2ViU29ja2V0VHJhbnNwb3J0KHdzX3VyaSk7CisgICAgY29uc3QgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgIGNvbnN0IGNsaWVudCAgICA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgIDwvc2NyaXB0PgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0ZXN0LWFzeW5jLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiPlRocmlmdFRlc3QudGhyaWZ0PC9hPik8L2gxPgorICA8aDIgaWQ9InF1bml0LWJhbm5lciI+PC9oMj4KKyAgPGRpdiBpZD0icXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIj48L2Rpdj4KKyAgPGgyIGlkPSJxdW5pdC11c2VyQWdlbnQiPjwvaDI+CisgIDxvbCBpZD0icXVuaXQtdGVzdHMiPjxsaT48IS0tIGdldCB2YWxpZCB4aHRtbCBzdHJpY3QtLT48L2xpPjwvb2w+CisgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gY2hlY2sgdGhlIHZhbGlkaXR5LiBUaGlzIHNpZ25pZmljYW50bHkgc2xvd3MgZG93biB0aGUgdGVzdC4KKyAgPHA+CisgICAgICA8YSBocmVmPSJodHRwOi8vdmFsaWRhdG9yLnczLm9yZy9jaGVjay9yZWZlcmVyIj48aW1nCisgICAgICAgICAgc3JjPSJodHRwOi8vd3d3LnczLm9yZy9JY29ucy92YWxpZC14aHRtbDEwIgorICAgICAgICAgIGFsdD0iVmFsaWQgWEhUTUwgMS4wISIgaGVpZ2h0PSIzMSIgd2lkdGg9Ijg4IiAvPjwvYT4KKyAgPC9wPgorICAtLT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2xpYi9qcy90aHJpZnQuanMgYi9saWIvanMvdGhyaWZ0LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTg3OTZkLi4wMDAwMDAwCi0tLSBhL2xpYi9qcy90aHJpZnQuanMKKysrIC9kZXYvbnVsbApAQCAtMSw3OTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotdmFyIFRocmlmdCA9IHsKLSAgICBWZXJzaW9uOiAnMC43LjAnLAotLyoKLSAgICBEZXNjcmlwdGlvbjogJ0phdmFTY3JpcHQgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0nLAotICAgIExpY2Vuc2U6ICdodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAnLAotICAgIEhvbWVwYWdlOiAnaHR0cDovL3RocmlmdC5hcGFjaGUub3JnJywKLSAgICBCdWdSZXBvcnRzOiAnaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQnLAotICAgIE1haW50YWluZXI6ICdkZXZAdGhyaWZ0LmFwYWNoZS5vcmcnLAotKi8KLQotICAgIFR5cGU6IHsKLSAgICAgICAgJ1NUT1AnIDogMCwKLSAgICAgICAgJ1ZPSUQnIDogMSwKLSAgICAgICAgJ0JPT0wnIDogMiwKLSAgICAgICAgJ0JZVEUnIDogMywKLSAgICAgICAgJ0kwOCcgOiAzLAotICAgICAgICAnRE9VQkxFJyA6IDQsCi0gICAgICAgICdJMTYnIDogNiwKLSAgICAgICAgJ0kzMicgOiA4LAotICAgICAgICAnSTY0JyA6IDEwLAotICAgICAgICAnU1RSSU5HJyA6IDExLAotICAgICAgICAnVVRGNycgOiAxMSwKLSAgICAgICAgJ1NUUlVDVCcgOiAxMiwKLSAgICAgICAgJ01BUCcgOiAxMywKLSAgICAgICAgJ1NFVCcgOiAxNCwKLSAgICAgICAgJ0xJU1QnIDogMTUsCi0gICAgICAgICdVVEY4JyA6IDE2LAotICAgICAgICAnVVRGMTYnIDogMTcKLSAgICB9LAotCi0gICAgTWVzc2FnZVR5cGU6IHsKLSAgICAgICAgJ0NBTEwnIDogMSwKLSAgICAgICAgJ1JFUExZJyA6IDIsCi0gICAgICAgICdFWENFUFRJT04nIDogMwotICAgIH0sCi0KLSAgICBvYmplY3RMZW5ndGg6IGZ1bmN0aW9uKG9iaikgewotICAgICAgICB2YXIgbGVuZ3RoID0gMDsKLSAgICAgICAgZm9yICh2YXIgayBpbiBvYmopIHsKLSAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpIHsKLSAgICAgICAgICAgICAgICBsZW5ndGgrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsZW5ndGg7Ci0gICAgfSwKLQotICAgIGluaGVyaXRzOiBmdW5jdGlvbihjb25zdHJ1Y3Rvciwgc3VwZXJDb25zdHJ1Y3RvcikgewotICAgICAgLy9Qcm90b3R5cGFsIEluaGVyaXRhbmNlIGh0dHA6Ly9qYXZhc2NyaXB0LmNyb2NrZm9yZC5jb20vcHJvdG90eXBhbC5odG1sCi0gICAgICBmdW5jdGlvbiBGKCkge30KLSAgICAgIEYucHJvdG90eXBlID0gc3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5cGU7Ci0gICAgICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBuZXcgRigpOwotICAgIH0KLX07Ci0KLQotCi1UaHJpZnQuVEV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKLSAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotfTsKLVRocmlmdC5pbmhlcml0cyhUaHJpZnQuVEV4Y2VwdGlvbiwgRXJyb3IpOwotVGhyaWZ0LlRFeGNlcHRpb24ucHJvdG90eXBlLm5hbWUgPSAnVEV4Y2VwdGlvbic7Ci0KLVRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlID0gewotICAgICdVTktOT1dOJyA6IDAsCi0gICAgJ1VOS05PV05fTUVUSE9EJyA6IDEsCi0gICAgJ0lOVkFMSURfTUVTU0FHRV9UWVBFJyA6IDIsCi0gICAgJ1dST05HX01FVEhPRF9OQU1FJyA6IDMsCi0gICAgJ0JBRF9TRVFVRU5DRV9JRCcgOiA0LAotICAgICdNSVNTSU5HX1JFU1VMVCcgOiA1LAotICAgICdJTlRFUk5BTF9FUlJPUicgOiA2LAotICAgICdQUk9UT0NPTF9FUlJPUicgOiA3Ci19OwotCi1UaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uID0gZnVuY3Rpb24obWVzc2FnZSwgY29kZSkgewotICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgdGhpcy5jb2RlID0gKGNvZGUgPT09IG51bGwpID8gMCA6IGNvZGU7Ci19OwotVGhyaWZ0LmluaGVyaXRzKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24sIFRocmlmdC5URXhjZXB0aW9uKTsKLVRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ucHJvdG90eXBlLm5hbWUgPSAnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJzsKLQotVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKGlucHV0KSB7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgdmFyIHJldCA9IGlucHV0LnJlYWRGaWVsZEJlZ2luKCk7Ci0KLSAgICAgICAgaWYgKHJldC5mdHlwZSA9PSBUaHJpZnQuVHlwZS5TVE9QKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHZhciBmaWQgPSByZXQuZmlkOwotCi0gICAgICAgIHN3aXRjaCAoZmlkKSB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgaWYgKHJldC5mdHlwZSA9PSBUaHJpZnQuVHlwZS5TVFJJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gaW5wdXQucmVhZFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSByZXQudmFsdWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gaW5wdXQuc2tpcChyZXQuZnR5cGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICBpZiAocmV0LmZ0eXBlID09IFRocmlmdC5UeXBlLkkzMikgewotICAgICAgICAgICAgICAgICAgICByZXQgPSBpbnB1dC5yZWFkSTMyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY29kZSA9IHJldC52YWx1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXQgPSBpbnB1dC5za2lwKHJldC5mdHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnNraXAocmV0LmZ0eXBlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlucHV0LnJlYWRGaWVsZEVuZCgpOwotICAgIH0KLQotICAgIGlucHV0LnJlYWRTdHJ1Y3RFbmQoKTsKLX07Ci0KLVRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24ob3V0cHV0KSB7Ci0gICAgdmFyIHhmZXIgPSAwOwotCi0gICAgb3V0cHV0LndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOwotCi0gICAgaWYgKHRoaXMubWVzc2FnZSkgewotICAgICAgICBvdXRwdXQud3JpdGVGaWVsZEJlZ2luKCdtZXNzYWdlJywgVGhyaWZ0LlR5cGUuU1RSSU5HLCAxKTsKLSAgICAgICAgb3V0cHV0LndyaXRlU3RyaW5nKHRoaXMuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgb3V0cHV0LndyaXRlRmllbGRFbmQoKTsKLSAgICB9Ci0KLSAgICBpZiAodGhpcy5jb2RlKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUaHJpZnQuVHlwZS5JMzIsIDIpOwotICAgICAgICBvdXRwdXQud3JpdGVJMzIodGhpcy5jb2RlKTsKLSAgICAgICAgb3V0cHV0LndyaXRlRmllbGRFbmQoKTsKLSAgICB9Ci0KLSAgICBvdXRwdXQud3JpdGVGaWVsZFN0b3AoKTsKLSAgICBvdXRwdXQud3JpdGVTdHJ1Y3RFbmQoKTsKLX07Ci0KLVRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ucHJvdG90eXBlLmdldENvZGUgPSBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5jb2RlOwotfTsKLQotVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5wcm90b3R5cGUuZ2V0TWVzc2FnZSA9IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzLm1lc3NhZ2U7Ci19OwotCi0vKioKLSAqSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgdXJsIHRoZW4geW91IG11c3QgaGFuZGxlIGFqYXggb24geW91ciBvd24uCi0gKlRoaXMgaXMgaG93IHRvIHVzZSBqcyBiaW5kaW5ncyBpbiBhIGFzeW5jIGZhc2hpb24uCi0gKi8KLVRocmlmdC5UcmFuc3BvcnQgPSBmdW5jdGlvbih1cmwpIHsKLSAgICB0aGlzLnVybCA9IHVybDsKLSAgICB0aGlzLndwb3MgPSAwOwotICAgIHRoaXMucnBvcyA9IDA7Ci0KLSAgICB0aGlzLnNlbmRfYnVmID0gJyc7Ci0gICAgdGhpcy5yZWN2X2J1ZiA9ICcnOwotfTsKLQotVGhyaWZ0LlRyYW5zcG9ydC5wcm90b3R5cGUgPSB7Ci0KLSAgICAvL0dldHMgdGhlIGJyb3dzZXIgc3BlY2lmaWMgWG1sSHR0cFJlcXVlc3QgT2JqZWN0Ci0gICAgZ2V0WG1sSHR0cFJlcXVlc3RPYmplY3Q6IGZ1bmN0aW9uKCkgewotICAgICAgICB0cnkgeyByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7IH0gY2F0Y2ggKGUxKSB7IH0KLSAgICAgICAgdHJ5IHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNc3htbDIuWE1MSFRUUCcpOyB9IGNhdGNoIChlMikgeyB9Ci0gICAgICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTEhUVFAnKTsgfSBjYXRjaCAoZTMpIHsgfQotCi0gICAgICAgIHRocm93ICJZb3VyIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IHRoZSBYbWxIdHRwUmVxdWVzdCBvYmplY3QuIjsKLSAgICB9LAotCi0gICAgZmx1c2g6IGZ1bmN0aW9uKGFzeW5jKSB7Ci0gICAgICAgIC8vYXN5bmMgbW9kZQotICAgICAgICBpZiAoYXN5bmMgfHwgdGhpcy51cmwgPT09IHVuZGVmaW5lZCB8fCB0aGlzLnVybCA9PT0gJycpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRfYnVmOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFyIHhyZXEgPSB0aGlzLmdldFhtbEh0dHBSZXF1ZXN0T2JqZWN0KCk7Ci0KLSAgICAgICAgaWYgKHhyZXEub3ZlcnJpZGVNaW1lVHlwZSkgewotICAgICAgICAgICAgeHJlcS5vdmVycmlkZU1pbWVUeXBlKCdhcHBsaWNhdGlvbi9qc29uJyk7Ci0gICAgICAgIH0KLQotICAgICAgICB4cmVxLm9wZW4oJ1BPU1QnLCB0aGlzLnVybCwgZmFsc2UpOwotICAgICAgICB4cmVxLnNlbmQodGhpcy5zZW5kX2J1Zik7Ci0KLSAgICAgICAgaWYgKHhyZXEucmVhZHlTdGF0ZSAhPSA0KSB7Ci0gICAgICAgICAgICB0aHJvdyAnZW5jb3VudGVyZWQgYW4gdW5rbm93biBhamF4IHJlYWR5IHN0YXRlOiAnICsgeHJlcS5yZWFkeVN0YXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHhyZXEuc3RhdHVzICE9IDIwMCkgewotICAgICAgICAgICAgdGhyb3cgJ2VuY291bnRlcmVkIGEgdW5rbm93biByZXF1ZXN0IHN0YXR1czogJyArIHhyZXEuc3RhdHVzOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5yZWN2X2J1ZiA9IHhyZXEucmVzcG9uc2VUZXh0OwotICAgICAgICB0aGlzLnJlY3ZfYnVmX3N6ID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGg7Ci0gICAgICAgIHRoaXMud3BvcyA9IHRoaXMucmVjdl9idWYubGVuZ3RoOwotICAgICAgICB0aGlzLnJwb3MgPSAwOwotICAgIH0sCi0KLSAgICBqcVJlcXVlc3Q6IGZ1bmN0aW9uKGNsaWVudCwgcG9zdERhdGEsIGFyZ3MsIHJlY3ZfbWV0aG9kKSB7Ci0gICAgICAgIGlmICh0eXBlb2YgalF1ZXJ5ID09PSAndW5kZWZpbmVkJyB8fAotICAgICAgICAgICAgdHlwZW9mIGpRdWVyeS5EZWZlcnJlZCA9PT0gJ3VuZGVmaW5lZCcpIHsKLSAgICAgICAgICAgIHRocm93ICdUaHJpZnQuanMgcmVxdWlyZXMgalF1ZXJ5IDEuNSsgdG8gdXNlIGFzeW5jaHJvbm91cyByZXF1ZXN0cyc7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEZWZlcnJlZHMKLSAgICAgICAgdmFyIGRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCk7Ci0gICAgICAgIHZhciBjb21wbGV0ZURmZCA9IGpRdWVyeS5fRGVmZXJyZWQoKTsKLSAgICAgICAgdmFyIGRmZCA9IGRlZmVycmVkLnByb21pc2UoKTsKLSAgICAgICAgZGZkLnN1Y2Nlc3MgPSBkZmQuZG9uZTsKLSAgICAgICAgZGZkLmVycm9yID0gZGZkLmZhaWw7Ci0gICAgICAgIGRmZC5jb21wbGV0ZSA9IGNvbXBsZXRlRGZkLmRvbmU7Ci0KLSAgICAgICAgdmFyIGpxWEhSID0galF1ZXJ5LmFqYXgoewotICAgICAgICAgICAgdXJsOiB0aGlzLnVybCwKLSAgICAgICAgICAgIGRhdGE6IHBvc3REYXRhLAotICAgICAgICAgICAgdHlwZTogJ1BPU1QnLAotICAgICAgICAgICAgY2FjaGU6IGZhbHNlLAotICAgICAgICAgICAgZGF0YVR5cGU6ICd0ZXh0JywKLSAgICAgICAgICAgIGNvbnRleHQ6IHRoaXMsCi0gICAgICAgICAgICBzdWNjZXNzOiB0aGlzLmpxUmVzcG9uc2UsCi0gICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24oeGhyLCBzdGF0dXMsIGUpIHsKLSAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3RXaXRoKGNsaWVudCwgalF1ZXJ5Lm1lcmdlKFtlXSwgeGhyLnRBcmdzKSk7Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKHhociwgc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgY29tcGxldGVEZmQucmVzb2x2ZVdpdGgoY2xpZW50LCBbeGhyLCBzdGF0dXNdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZGVmZXJyZWQuZG9uZShqUXVlcnkubWFrZUFycmF5KGFyZ3MpLnBvcCgpKTsgLy9wb3AgY2FsbGJhY2sgZnJvbSBhcmdzCi0gICAgICAgIGpxWEhSLnRBcmdzID0gYXJnczsKLSAgICAgICAganFYSFIudENsaWVudCA9IGNsaWVudDsKLSAgICAgICAganFYSFIudFJlY3ZGbiA9IHJlY3ZfbWV0aG9kOwotICAgICAgICBqcVhIUi50RGZkID0gZGVmZXJyZWQ7Ci0gICAgICAgIHJldHVybiBkZmQ7Ci0gICAgfSwKLQotICAgIGpxUmVzcG9uc2U6IGZ1bmN0aW9uKHJlc3BvbnNlRGF0YSwgdGV4dFN0YXR1cywganFYSFIpIHsKLSAgICAgIHRoaXMuc2V0UmVjdkJ1ZmZlcihyZXNwb25zZURhdGEpOwotICAgICAgdHJ5IHsKLSAgICAgICAgICB2YXIgdmFsdWUgPSBqcVhIUi50UmVjdkZuLmNhbGwoanFYSFIudENsaWVudCk7Ci0gICAgICAgICAganFYSFIudERmZC5yZXNvbHZlV2l0aChqcVhIUiwgalF1ZXJ5Lm1lcmdlKFt2YWx1ZV0sIGpxWEhSLnRBcmdzKSk7Ci0gICAgICB9IGNhdGNoIChleCkgewotICAgICAgICAgIGpxWEhSLnREZmQucmVqZWN0V2l0aChqcVhIUiwgalF1ZXJ5Lm1lcmdlKFtleF0sIGpxWEhSLnRBcmdzKSk7Ci0gICAgICB9Ci0gICAgfSwKLQotICAgIHNldFJlY3ZCdWZmZXI6IGZ1bmN0aW9uKGJ1ZikgewotICAgICAgICB0aGlzLnJlY3ZfYnVmID0gYnVmOwotICAgICAgICB0aGlzLnJlY3ZfYnVmX3N6ID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGg7Ci0gICAgICAgIHRoaXMud3BvcyA9IHRoaXMucmVjdl9idWYubGVuZ3RoOwotICAgICAgICB0aGlzLnJwb3MgPSAwOwotICAgIH0sCi0KLSAgICBpc09wZW46IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9LAotCi0gICAgb3BlbjogZnVuY3Rpb24oKSB7fSwKLQotICAgIGNsb3NlOiBmdW5jdGlvbigpIHt9LAotCi0gICAgcmVhZDogZnVuY3Rpb24obGVuKSB7Ci0gICAgICAgIHZhciBhdmFpbCA9IHRoaXMud3BvcyAtIHRoaXMucnBvczsKLQotICAgICAgICBpZiAoYXZhaWwgPT09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAnJzsKLSAgICAgICAgfQotCi0gICAgICAgIHZhciBnaXZlID0gbGVuOwotCi0gICAgICAgIGlmIChhdmFpbCA8IGxlbikgewotICAgICAgICAgICAgZ2l2ZSA9IGF2YWlsOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFyIHJldCA9IHRoaXMucmVhZF9idWYuc3Vic3RyKHRoaXMucnBvcywgZ2l2ZSk7Ci0gICAgICAgIHRoaXMucnBvcyArPSBnaXZlOwotCi0gICAgICAgIC8vY2xlYXIgYnVmIHdoZW4gY29tcGxldGU/Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfSwKLQotICAgIHJlYWRBbGw6IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5yZWN2X2J1ZjsKLSAgICB9LAotCi0gICAgd3JpdGU6IGZ1bmN0aW9uKGJ1ZikgewotICAgICAgICB0aGlzLnNlbmRfYnVmID0gYnVmOwotICAgIH0sCi0KLSAgICBnZXRTZW5kQnVmZmVyOiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc2VuZF9idWY7Ci0gICAgfQotCi19OwotCi0KLQotVGhyaWZ0LlByb3RvY29sID0gZnVuY3Rpb24odHJhbnNwb3J0KSB7Ci0gICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7Ci19OwotCi1UaHJpZnQuUHJvdG9jb2wuVHlwZSA9IHt9OwotVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuQk9PTF0gPSAnInRmIic7Ci1UaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5CWVRFXSA9ICciaTgiJzsKLVRocmlmdC5Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLkkxNl0gPSAnImkxNiInOwotVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuSTMyXSA9ICciaTMyIic7Ci1UaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5JNjRdID0gJyJpNjQiJzsKLVRocmlmdC5Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLkRPVUJMRV0gPSAnImRibCInOwotVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuU1RSVUNUXSA9ICcicmVjIic7Ci1UaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5TVFJJTkddID0gJyJzdHIiJzsKLVRocmlmdC5Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLk1BUF0gPSAnIm1hcCInOwotVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuTElTVF0gPSAnImxzdCInOwotVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuU0VUXSA9ICcic2V0Iic7Ci0KLQotVGhyaWZ0LlByb3RvY29sLlJUeXBlID0ge307Ci1UaHJpZnQuUHJvdG9jb2wuUlR5cGUudGYgPSBUaHJpZnQuVHlwZS5CT09MOwotVGhyaWZ0LlByb3RvY29sLlJUeXBlLmk4ID0gVGhyaWZ0LlR5cGUuQllURTsKLVRocmlmdC5Qcm90b2NvbC5SVHlwZS5pMTYgPSBUaHJpZnQuVHlwZS5JMTY7Ci1UaHJpZnQuUHJvdG9jb2wuUlR5cGUuaTMyID0gVGhyaWZ0LlR5cGUuSTMyOwotVGhyaWZ0LlByb3RvY29sLlJUeXBlLmk2NCA9IFRocmlmdC5UeXBlLkk2NDsKLVRocmlmdC5Qcm90b2NvbC5SVHlwZS5kYmwgPSBUaHJpZnQuVHlwZS5ET1VCTEU7Ci1UaHJpZnQuUHJvdG9jb2wuUlR5cGUucmVjID0gVGhyaWZ0LlR5cGUuU1RSVUNUOwotVGhyaWZ0LlByb3RvY29sLlJUeXBlLnN0ciA9IFRocmlmdC5UeXBlLlNUUklORzsKLVRocmlmdC5Qcm90b2NvbC5SVHlwZS5tYXAgPSBUaHJpZnQuVHlwZS5NQVA7Ci1UaHJpZnQuUHJvdG9jb2wuUlR5cGUubHN0ID0gVGhyaWZ0LlR5cGUuTElTVDsKLVRocmlmdC5Qcm90b2NvbC5SVHlwZS5zZXQgPSBUaHJpZnQuVHlwZS5TRVQ7Ci0KLVRocmlmdC5Qcm90b2NvbC5WZXJzaW9uID0gMTsKLQotVGhyaWZ0LlByb3RvY29sLnByb3RvdHlwZSA9IHsKLQotICAgIGdldFRyYW5zcG9ydDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnRyYW5zcG9ydDsKLSAgICB9LAotCi0gICAgLy9Xcml0ZSBmdW5jdGlvbnMKLSAgICB3cml0ZU1lc3NhZ2VCZWdpbjogZnVuY3Rpb24obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKSB7Ci0gICAgICAgIHRoaXMudHN0YWNrID0gW107Ci0gICAgICAgIHRoaXMudHBvcyA9IFtdOwotCi0gICAgICAgIHRoaXMudHN0YWNrLnB1c2goW1RocmlmdC5Qcm90b2NvbC5WZXJzaW9uLCAnIicgKwotICAgICAgICAgICAgbmFtZSArICciJywgbWVzc2FnZVR5cGUsIHNlcWlkXSk7Ci0gICAgfSwKLQotICAgIHdyaXRlTWVzc2FnZUVuZDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHZhciBvYmogPSB0aGlzLnRzdGFjay5wb3AoKTsKLQotICAgICAgICB0aGlzLndvYmogPSB0aGlzLnRzdGFjay5wb3AoKTsKLSAgICAgICAgdGhpcy53b2JqLnB1c2gob2JqKTsKLQotICAgICAgICB0aGlzLndidWYgPSAnWycgKyB0aGlzLndvYmouam9pbignLCcpICsgJ10nOwotCi0gICAgICAgIHRoaXMudHJhbnNwb3J0LndyaXRlKHRoaXMud2J1Zik7Ci0gICAgIH0sCi0KLQotICAgIHdyaXRlU3RydWN0QmVnaW46IGZ1bmN0aW9uKG5hbWUpIHsKLSAgICAgICAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKLSAgICAgICAgdGhpcy50c3RhY2sucHVzaCh7fSk7Ci0gICAgfSwKLQotICAgIHdyaXRlU3RydWN0RW5kOiBmdW5jdGlvbigpIHsKLQotICAgICAgICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKTsKLSAgICAgICAgdmFyIHN0cnVjdCA9IHRoaXMudHN0YWNrW3BdOwotICAgICAgICB2YXIgc3RyID0gJ3snOwotICAgICAgICB2YXIgZmlyc3QgPSB0cnVlOwotICAgICAgICBmb3IgKHZhciBrZXkgaW4gc3RydWN0KSB7Ci0gICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHIgKz0gJywnOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdHIgKz0ga2V5ICsgJzonICsgc3RydWN0W2tleV07Ci0gICAgICAgIH0KLQotICAgICAgICBzdHIgKz0gJ30nOwotICAgICAgICB0aGlzLnRzdGFja1twXSA9IHN0cjsKLSAgICB9LAotCi0gICAgd3JpdGVGaWVsZEJlZ2luOiBmdW5jdGlvbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpIHsKLSAgICAgICAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKLSAgICAgICAgdGhpcy50c3RhY2sucHVzaCh7ICdmaWVsZElkJzogJyInICsKLSAgICAgICAgICAgIGZpZWxkSWQgKyAnIicsICdmaWVsZFR5cGUnOiBUaHJpZnQuUHJvdG9jb2wuVHlwZVtmaWVsZFR5cGVdCi0gICAgICAgIH0pOwotCi0gICAgfSwKLQotICAgIHdyaXRlRmllbGRFbmQ6IGZ1bmN0aW9uKCkgewotICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnRzdGFjay5wb3AoKTsKLSAgICAgICAgdmFyIGZpZWxkSW5mbyA9IHRoaXMudHN0YWNrLnBvcCgpOwotCi0gICAgICAgIHRoaXMudHN0YWNrW3RoaXMudHN0YWNrLmxlbmd0aCAtIDFdW2ZpZWxkSW5mby5maWVsZElkXSA9ICd7JyArCi0gICAgICAgICAgICBmaWVsZEluZm8uZmllbGRUeXBlICsgJzonICsgdmFsdWUgKyAnfSc7Ci0gICAgICAgIHRoaXMudHBvcy5wb3AoKTsKLSAgICB9LAotCi0gICAgd3JpdGVGaWVsZFN0b3A6IGZ1bmN0aW9uKCkgewotICAgICAgICAvL25hCi0gICAgfSwKLQotICAgIHdyaXRlTWFwQmVnaW46IGZ1bmN0aW9uKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpIHsKLSAgICAgICAgLy9zaXplIGlzIGludmFsaWQsIHdlJ2xsIHNldCBpdCBvbiBlbmQuCi0gICAgICAgIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCk7Ci0gICAgICAgIHRoaXMudHN0YWNrLnB1c2goW1RocmlmdC5Qcm90b2NvbC5UeXBlW2tleVR5cGVdLAotICAgICAgICAgICAgVGhyaWZ0LlByb3RvY29sLlR5cGVbdmFsVHlwZV0sIDBdKTsKLSAgICB9LAotCi0gICAgd3JpdGVNYXBFbmQ6IGZ1bmN0aW9uKCkgewotICAgICAgICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKTsKLQotICAgICAgICBpZiAocCA9PSB0aGlzLnRzdGFjay5sZW5ndGgpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgodGhpcy50c3RhY2subGVuZ3RoIC0gcCAtIDEpICUgMiAhPT0gMCkgewotICAgICAgICAgICAgdGhpcy50c3RhY2sucHVzaCgnJyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgc2l6ZSA9ICh0aGlzLnRzdGFjay5sZW5ndGggLSBwIC0gMSkgLyAyOwotCi0gICAgICAgIHRoaXMudHN0YWNrW3BdW3RoaXMudHN0YWNrW3BdLmxlbmd0aCAtIDFdID0gc2l6ZTsKLQotICAgICAgICB2YXIgbWFwID0gJ30nOwotICAgICAgICB2YXIgZmlyc3QgPSB0cnVlOwotICAgICAgICB3aGlsZSAodGhpcy50c3RhY2subGVuZ3RoID4gcCArIDEpIHsKLSAgICAgICAgICAgIHZhciB2ID0gdGhpcy50c3RhY2sucG9wKCk7Ci0gICAgICAgICAgICB2YXIgayA9IHRoaXMudHN0YWNrLnBvcCgpOwotICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWFwID0gJywnICsgbWFwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoISBpc05hTihrKSkgeyBrID0gJyInICsgayArICciJzsgfSAvL2pzb24gImtleXMiIG5lZWQgdG8gYmUgc3RyaW5ncwotICAgICAgICAgICAgbWFwID0gayArICc6JyArIHYgKyBtYXA7Ci0gICAgICAgIH0KLSAgICAgICAgbWFwID0gJ3snICsgbWFwOwotCi0gICAgICAgIHRoaXMudHN0YWNrW3BdLnB1c2gobWFwKTsKLSAgICAgICAgdGhpcy50c3RhY2tbcF0gPSAnWycgKyB0aGlzLnRzdGFja1twXS5qb2luKCcsJykgKyAnXSc7Ci0gICAgfSwKLQotICAgIHdyaXRlTGlzdEJlZ2luOiBmdW5jdGlvbihlbGVtVHlwZSwgc2l6ZSkgewotICAgICAgICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpOwotICAgICAgICB0aGlzLnRzdGFjay5wdXNoKFtUaHJpZnQuUHJvdG9jb2wuVHlwZVtlbGVtVHlwZV0sIHNpemVdKTsKLSAgICB9LAotCi0gICAgd3JpdGVMaXN0RW5kOiBmdW5jdGlvbigpIHsKLSAgICAgICAgdmFyIHAgPSB0aGlzLnRwb3MucG9wKCk7Ci0KLSAgICAgICAgd2hpbGUgKHRoaXMudHN0YWNrLmxlbmd0aCA+IHAgKyAxKSB7Ci0gICAgICAgICAgICB2YXIgdG1wVmFsID0gdGhpcy50c3RhY2tbcCArIDFdOwotICAgICAgICAgICAgdGhpcy50c3RhY2suc3BsaWNlKHAgKyAxLCAxKTsKLSAgICAgICAgICAgIHRoaXMudHN0YWNrW3BdLnB1c2godG1wVmFsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMudHN0YWNrW3BdID0gJ1snICsgdGhpcy50c3RhY2tbcF0uam9pbignLCcpICsgJ10nOwotICAgIH0sCi0KLSAgICB3cml0ZVNldEJlZ2luOiBmdW5jdGlvbihlbGVtVHlwZSwgc2l6ZSkgewotICAgICAgICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpOwotICAgICAgICB0aGlzLnRzdGFjay5wdXNoKFtUaHJpZnQuUHJvdG9jb2wuVHlwZVtlbGVtVHlwZV0sIHNpemVdKTsKLSAgICB9LAotCi0gICAgd3JpdGVTZXRFbmQ6IGZ1bmN0aW9uKCkgewotICAgICAgICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKTsKLQotICAgICAgICB3aGlsZSAodGhpcy50c3RhY2subGVuZ3RoID4gcCArIDEpIHsKLSAgICAgICAgICAgIHZhciB0bXBWYWwgPSB0aGlzLnRzdGFja1twICsgMV07Ci0gICAgICAgICAgICB0aGlzLnRzdGFjay5zcGxpY2UocCArIDEsIDEpOwotICAgICAgICAgICAgdGhpcy50c3RhY2tbcF0ucHVzaCh0bXBWYWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy50c3RhY2tbcF0gPSAnWycgKyB0aGlzLnRzdGFja1twXS5qb2luKCcsJykgKyAnXSc7Ci0gICAgfSwKLQotICAgIHdyaXRlQm9vbDogZnVuY3Rpb24odmFsdWUpIHsKLSAgICAgICAgdGhpcy50c3RhY2sucHVzaCh2YWx1ZSA/IDEgOiAwKTsKLSAgICB9LAotCi0gICAgd3JpdGVCeXRlOiBmdW5jdGlvbihpOCkgewotICAgICAgICB0aGlzLnRzdGFjay5wdXNoKGk4KTsKLSAgICB9LAotCi0gICAgd3JpdGVJMTY6IGZ1bmN0aW9uKGkxNikgewotICAgICAgICB0aGlzLnRzdGFjay5wdXNoKGkxNik7Ci0gICAgfSwKLQotICAgIHdyaXRlSTMyOiBmdW5jdGlvbihpMzIpIHsKLSAgICAgICAgdGhpcy50c3RhY2sucHVzaChpMzIpOwotICAgIH0sCi0KLSAgICB3cml0ZUk2NDogZnVuY3Rpb24oaTY0KSB7Ci0gICAgICAgIHRoaXMudHN0YWNrLnB1c2goaTY0KTsKLSAgICB9LAotCi0gICAgd3JpdGVEb3VibGU6IGZ1bmN0aW9uKGRibCkgewotICAgICAgICB0aGlzLnRzdGFjay5wdXNoKGRibCk7Ci0gICAgfSwKLQotICAgIHdyaXRlU3RyaW5nOiBmdW5jdGlvbihzdHIpIHsKLSAgICAgICAgLy8gV2UgZG8gbm90IGVuY29kZSB1cmkgY29tcG9uZW50cyBmb3Igd2lyZSB0cmFuc2ZlcjoKLSAgICAgICAgaWYgKHN0ciA9PT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy50c3RhY2sucHVzaChudWxsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGNvbmNhdCBtYXkgYmUgc2xvd2VyIHRoYW4gYnVpbGRpbmcgYSBieXRlIGJ1ZmZlcgotICAgICAgICAgICAgdmFyIGVzY2FwZWRTdHJpbmcgPSAnJzsKLSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdmFyIGNoID0gc3RyLmNoYXJBdChpKTsgICAgICAvLyBhIHNpbmdsZSBkb3VibGUgcXVvdGU6ICIKLSAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcIicpIHsKLSAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxcIic7IC8vIHdyaXRlIG91dCBhczogXCIKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXFwnKSB7ICAgIC8vIGEgc2luZ2xlIGJhY2tzbGFzaDogXAotICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXFxcJzsgLy8gd3JpdGUgb3V0IGFzOiBcXAotICAgICAgICAgICAgICAgIC8qIEN1cnJlbnRseSBlc2NhcGVkIGZvcndhcmQgc2xhc2hlcyBicmVhayBUSlNPTlByb3RvY29sLgotICAgICAgICAgICAgICAgICAqIEFzIGl0IHN0YW5kcywgd2UgY2FuIHNpbXBseSBwYXNzIGZvcndhcmQgc2xhc2hlcyBpbnRvCi0gICAgICAgICAgICAgICAgICogb3VyIHN0cmluZ3MgYWNyb3NzIHRoZSB3aXJlIHdpdGhvdXQgYmVpbmcgZXNjYXBlZC4KLSAgICAgICAgICAgICAgICAgKiBJIHRoaW5rIHRoaXMgaXMgdGhlIHByb3RvY29sJ3MgYnVnLCBub3QgdGhyaWZ0LmpzCi0gICAgICAgICAgICAgICAgICogfSBlbHNlIGlmKGNoID09PSAnLycpIHsgICAvLyBhIHNpbmdsZSBmb3J3YXJkIHNsYXNoOiAvCi0gICAgICAgICAgICAgICAgICogIGVzY2FwZWRTdHJpbmcgKz0gJ1xcLyc7ICAvLyB3cml0ZSBvdXQgYXMgXC8KLSAgICAgICAgICAgICAgICAgKiB9Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xiJykgeyAgICAvLyBhIHNpbmdsZSBiYWNrc3BhY2U6IGludmlzaWJsZQotICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXGInOyAgLy8gd3JpdGUgb3V0IGFzOiBcYiIKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXGYnKSB7ICAgIC8vIGEgc2luZ2xlIGZvcm1mZWVkOiBpbnZpc2libGUKLSAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxmJzsgIC8vIHdyaXRlIG91dCBhczogXGYiCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xuJykgeyAgICAvLyBhIHNpbmdsZSBuZXdsaW5lOiBpbnZpc2libGUKLSAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxuJzsgIC8vIHdyaXRlIG91dCBhczogXG4iCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xyJykgeyAgICAvLyBhIHNpbmdsZSByZXR1cm46IGludmlzaWJsZQotICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXHInOyAgLy8gd3JpdGUgb3V0IGFzOiBcciIKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXHQnKSB7ICAgIC8vIGEgc2luZ2xlIHRhYjogaW52aXNpYmxlCi0gICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcdCc7ICAvLyB3cml0ZSBvdXQgYXM6IFx0IgotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gY2g7ICAgICAvLyBFbHNlIGl0IG5lZWQgbm90IGJlIGVzY2FwZWQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLnRzdGFjay5wdXNoKCciJyArIGVzY2FwZWRTdHJpbmcgKyAnIicpOwotICAgICAgICB9Ci0gICAgfSwKLQotICAgIHdyaXRlQmluYXJ5OiBmdW5jdGlvbihzdHIpIHsKLSAgICAgICAgdGhpcy53cml0ZVN0cmluZyhzdHIpOwotICAgIH0sCi0KLQotCi0gICAgLy8gUmVhZGluZyBmdW5jdGlvbnMKLSAgICByZWFkTWVzc2FnZUJlZ2luOiBmdW5jdGlvbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpIHsKLSAgICAgICAgdGhpcy5yc3RhY2sgPSBbXTsKLSAgICAgICAgdGhpcy5ycG9zID0gW107Ci0KLSAgICAgICAgaWYgKHR5cGVvZiBqUXVlcnkgIT09ICd1bmRlZmluZWQnKSB7Ci0gICAgICAgICAgICB0aGlzLnJvYmogPSBqUXVlcnkucGFyc2VKU09OKHRoaXMudHJhbnNwb3J0LnJlYWRBbGwoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnJvYmogPSBldmFsKHRoaXMudHJhbnNwb3J0LnJlYWRBbGwoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgciA9IHt9OwotICAgICAgICB2YXIgdmVyc2lvbiA9IHRoaXMucm9iai5zaGlmdCgpOwotCi0gICAgICAgIGlmICh2ZXJzaW9uICE9IFRocmlmdC5Qcm90b2NvbC5WZXJzaW9uKSB7Ci0gICAgICAgICAgICB0aHJvdyAnV3JvbmcgdGhyaWZ0IHByb3RvY29sIHZlcnNpb246ICcgKyB2ZXJzaW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgci5mbmFtZSA9IHRoaXMucm9iai5zaGlmdCgpOwotICAgICAgICByLm10eXBlID0gdGhpcy5yb2JqLnNoaWZ0KCk7Ci0gICAgICAgIHIucnNlcWlkID0gdGhpcy5yb2JqLnNoaWZ0KCk7Ci0KLQotICAgICAgICAvL2dldCB0byB0aGUgbWFpbiBvYmoKLSAgICAgICAgdGhpcy5yc3RhY2sucHVzaCh0aGlzLnJvYmouc2hpZnQoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgfSwKLQotICAgIHJlYWRNZXNzYWdlRW5kOiBmdW5jdGlvbigpIHsKLSAgICB9LAotCi0gICAgcmVhZFN0cnVjdEJlZ2luOiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgICAgIHZhciByID0ge307Ci0gICAgICAgIHIuZm5hbWUgPSAnJzsKLQotICAgICAgICAvL2luY2FzZSB0aGlzIGlzIGFuIGFycmF5IG9mIHN0cnVjdHMKLSAgICAgICAgaWYgKHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgQXJyYXkpIHsKLSAgICAgICAgICAgIHRoaXMucnN0YWNrLnB1c2godGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0uc2hpZnQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcjsKLSAgICB9LAotCi0gICAgcmVhZFN0cnVjdEVuZDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIGlmICh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAyXSBpbnN0YW5jZW9mIEFycmF5KSB7Ci0gICAgICAgICAgICB0aGlzLnJzdGFjay5wb3AoKTsKLSAgICAgICAgfQotICAgIH0sCi0KLSAgICByZWFkRmllbGRCZWdpbjogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHZhciByID0ge307Ci0KLSAgICAgICAgdmFyIGZpZCA9IC0xOwotICAgICAgICB2YXIgZnR5cGUgPSBUaHJpZnQuVHlwZS5TVE9QOwotCi0gICAgICAgIC8vZ2V0IGEgZmllbGRJZAotICAgICAgICBmb3IgKHZhciBmIGluICh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXSkpIHsKLSAgICAgICAgICAgIGlmIChmID09PSBudWxsKSB7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaWQgPSBwYXJzZUludChmLCAxMCk7Ci0gICAgICAgICAgICB0aGlzLnJwb3MucHVzaCh0aGlzLnJzdGFjay5sZW5ndGgpOwotCi0gICAgICAgICAgICB2YXIgZmllbGQgPSB0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXVtmaWRdOwotCi0gICAgICAgICAgICAvL3JlbW92ZSBzbyB3ZSBkb24ndCBzZWUgaXQgYWdhaW4KLSAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXVtmaWRdOwotCi0gICAgICAgICAgICB0aGlzLnJzdGFjay5wdXNoKGZpZWxkKTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmlkICE9IC0xKSB7Ci0KLSAgICAgICAgICAgIC8vc2hvdWxkIG9ubHkgYmUgMSBvZiB0aGVzZSBidXQgdGhpcyBpcyB0aGUgb25seQotICAgICAgICAgICAgLy93YXkgdG8gbWF0Y2ggYSBrZXkKLSAgICAgICAgICAgIGZvciAodmFyIGkgaW4gKHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdKSkgewotICAgICAgICAgICAgICAgIGlmIChUaHJpZnQuUHJvdG9jb2wuUlR5cGVbaV0gPT09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZnR5cGUgPSBUaHJpZnQuUHJvdG9jb2wuUlR5cGVbaV07Ci0gICAgICAgICAgICAgICAgdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0gPQotICAgICAgICAgICAgICAgICAgICB0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXVtpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHIuZm5hbWUgPSAnJzsKLSAgICAgICAgci5mdHlwZSA9IGZ0eXBlOwotICAgICAgICByLmZpZCA9IGZpZDsKLQotICAgICAgICByZXR1cm4gcjsKLSAgICB9LAotCi0gICAgcmVhZEZpZWxkRW5kOiBmdW5jdGlvbigpIHsKLSAgICAgICAgdmFyIHBvcyA9IHRoaXMucnBvcy5wb3AoKTsKLQotICAgICAgICAvL2dldCBiYWNrIHRvIHRoZSByaWdodCBwbGFjZSBpbiB0aGUgc3RhY2sKLSAgICAgICAgd2hpbGUgKHRoaXMucnN0YWNrLmxlbmd0aCA+IHBvcykgewotICAgICAgICAgICAgdGhpcy5yc3RhY2sucG9wKCk7Ci0gICAgICAgIH0KLQotICAgIH0sCi0KLSAgICByZWFkTWFwQmVnaW46IGZ1bmN0aW9uKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpIHsKLSAgICAgICAgdmFyIG1hcCA9IHRoaXMucnN0YWNrLnBvcCgpOwotCi0gICAgICAgIHZhciByID0ge307Ci0gICAgICAgIHIua3R5cGUgPSBUaHJpZnQuUHJvdG9jb2wuUlR5cGVbbWFwLnNoaWZ0KCldOwotICAgICAgICByLnZ0eXBlID0gVGhyaWZ0LlByb3RvY29sLlJUeXBlW21hcC5zaGlmdCgpXTsKLSAgICAgICAgci5zaXplID0gbWFwLnNoaWZ0KCk7Ci0KLQotICAgICAgICB0aGlzLnJwb3MucHVzaCh0aGlzLnJzdGFjay5sZW5ndGgpOwotICAgICAgICB0aGlzLnJzdGFjay5wdXNoKG1hcC5zaGlmdCgpKTsKLQotICAgICAgICByZXR1cm4gcjsKLSAgICB9LAotCi0gICAgcmVhZE1hcEVuZDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHRoaXMucmVhZEZpZWxkRW5kKCk7Ci0gICAgfSwKLQotICAgIHJlYWRMaXN0QmVnaW46IGZ1bmN0aW9uKGVsZW1UeXBlLCBzaXplKSB7Ci0gICAgICAgIHZhciBsaXN0ID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV07Ci0KLSAgICAgICAgdmFyIHIgPSB7fTsKLSAgICAgICAgci5ldHlwZSA9IFRocmlmdC5Qcm90b2NvbC5SVHlwZVtsaXN0LnNoaWZ0KCldOwotICAgICAgICByLnNpemUgPSBsaXN0LnNoaWZ0KCk7Ci0KLSAgICAgICAgdGhpcy5ycG9zLnB1c2godGhpcy5yc3RhY2subGVuZ3RoKTsKLSAgICAgICAgdGhpcy5yc3RhY2sucHVzaChsaXN0KTsKLQotICAgICAgICByZXR1cm4gcjsKLSAgICB9LAotCi0gICAgcmVhZExpc3RFbmQ6IGZ1bmN0aW9uKCkgewotICAgICAgICB0aGlzLnJlYWRGaWVsZEVuZCgpOwotICAgIH0sCi0KLSAgICByZWFkU2V0QmVnaW46IGZ1bmN0aW9uKGVsZW1UeXBlLCBzaXplKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlYWRMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOwotICAgIH0sCi0KLSAgICByZWFkU2V0RW5kOiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVhZExpc3RFbmQoKTsKLSAgICB9LAotCi0gICAgcmVhZEJvb2w6IGZ1bmN0aW9uKCkgewotICAgICAgICB2YXIgciA9IHRoaXMucmVhZEkzMigpOwotCi0gICAgICAgIGlmIChyICE9PSBudWxsICYmIHIudmFsdWUgPT0gJzEnKSB7Ci0gICAgICAgICAgICByLnZhbHVlID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHIudmFsdWUgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByOwotICAgIH0sCi0KLSAgICByZWFkQnl0ZTogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKLSAgICB9LAotCi0gICAgcmVhZEkxNjogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKLSAgICB9LAotCi0gICAgcmVhZEkzMjogZnVuY3Rpb24oZikgewotICAgICAgICBpZiAoZiA9PT0gdW5kZWZpbmVkKSB7Ci0gICAgICAgICAgICBmID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV07Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgciA9IHt9OwotCi0gICAgICAgIGlmIChmIGluc3RhbmNlb2YgQXJyYXkpIHsKLSAgICAgICAgICAgIGlmIChmLmxlbmd0aCA9PT0gMCkgewotICAgICAgICAgICAgICAgIHIudmFsdWUgPSB1bmRlZmluZWQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHIudmFsdWUgPSBmLnNoaWZ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZiBpbnN0YW5jZW9mIE9iamVjdCkgewotICAgICAgICAgICBmb3IgKHZhciBpIGluIGYpIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMucnN0YWNrLnB1c2goZltpXSk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIGZbaV07Ci0KLSAgICAgICAgICAgICAgICByLnZhbHVlID0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgci52YWx1ZSA9IGY7Ci0gICAgICAgICAgICB0aGlzLnJzdGFjay5wb3AoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByOwotICAgIH0sCi0KLSAgICByZWFkSTY0OiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVhZEkzMigpOwotICAgIH0sCi0KLSAgICByZWFkRG91YmxlOiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVhZEkzMigpOwotICAgIH0sCi0KLSAgICByZWFkU3RyaW5nOiBmdW5jdGlvbigpIHsKLSAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRJMzIoKTsKLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgfSwKLQotICAgIHJlYWRCaW5hcnk6IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5yZWFkU3RyaW5nKCk7Ci0gICAgfSwKLQotCi0gICAgLy9NZXRob2QgdG8gYXJiaXRyYXJpbHkgc2tpcCBvdmVyIGRhdGEuCi0gICAgc2tpcDogZnVuY3Rpb24odHlwZSkgewotICAgICAgICB0aHJvdyAnc2tpcCBub3Qgc3VwcG9ydGVkIHlldCc7Ci0gICAgfQotfTsKZGlmZiAtLWdpdCBhL2xpYi9qc29uL01ha2VmaWxlLmFtIGIvbGliL2pzb24vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA1MWI5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qc29uL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0KKworaWYgV0lUSF9KQVZBCisjIFNjaGVtYSB2YWxpZGF0aW9uIHRlc3QgZGVwZW5kcyBvbiBqYXZhCitTVUJESVJTICs9IHRlc3QKK2VuZGlmCisKK0VYVFJBX0RJU1QgPSBcCisgICAgc2NoZW1hLmpzb24gXAorICAgIHRlc3QKZGlmZiAtLWdpdCBhL2xpYi9qc29uL3NjaGVtYS5qc29uIGIvbGliL2pzb24vc2NoZW1hLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1OGE3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qc29uL3NjaGVtYS5qc29uCkBAIC0wLDAgKzEsMzQ0IEBACit7CisgICIkc2NoZW1hIjogImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyIsCisKKyAgImlkIjogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9zY2hlbWEuanNvbiMiLAorICAiZGVzY3JpcHRpb24iOiAiU2NoZW1hIGZvciBBcGFjaGUgVGhyaWZ0IHByb3RvY29sIGRlc2NyaXB0b3JzIiwKKworICAiZGVmaW5pdGlvbnMiOiB7CisgICAgInR5cGUtaWQiOiB7CisgICAgICAidGl0bGUiOiAiQW55IHR5cGUgaWQgKG5hbWUpIiwKKyAgICAgICJlbnVtIjogWworICAgICAgICAidm9pZCIsCisgICAgICAgICJzdHJpbmciLAorICAgICAgICAiYm9vbCIsCisgICAgICAgICJieXRlIiwKKyAgICAgICAgImk4IiwKKyAgICAgICAgImkxNiIsCisgICAgICAgICJpMzIiLAorICAgICAgICAiaTY0IiwKKyAgICAgICAgImRvdWJsZSIsCisgICAgICAgICJsaXN0IiwKKyAgICAgICAgInNldCIsCisgICAgICAgICJtYXAiLAorICAgICAgICAidW5pb24iLAorICAgICAgICAic3RydWN0IiwKKyAgICAgICAgImJpbmFyeSIKKyAgICAgIF0KKyAgICB9LAorICAgICJiYXNlLXR5cGUiOiB7CisgICAgICAidGl0bGUiOiAiQmFzZSB0eXBlIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICJ0eXBlSWQiOiB7CisgICAgICAgICAgImVudW0iOiBbInZvaWQiLCAic3RyaW5nIiwgImJvb2wiLCAiYnl0ZSIsICJpOCIsICJpMTYiLCAiaTMyIiwgImk2NCIsICJkb3VibGUiLCAiYmluYXJ5IiBdCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICAicmVxdWlyZWQiOiBbICJ0eXBlSWQiIF0KKyAgICB9LAorICAgICJsaXN0LXR5cGUiOiB7CisgICAgICAidGl0bGUiOiAiTGlzdCBhbmQgc2V0IHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICJ0eXBlSWQiOiB7CisgICAgICAgICAgImVudW0iOiBbICJsaXN0IiwgInNldCIgXQorICAgICAgICB9LAorICAgICAgICAiZWxlbVR5cGVJZCI6ICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1pZCIgfSwKKyAgICAgICAgImVsZW1UeXBlIjogICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtZGVzYyIgfQorICAgICAgfSwKKyAgICAgICJyZXF1aXJlZCI6IFsgInR5cGVJZCIsICJlbGVtVHlwZUlkIiBdCisgICAgfSwKKyAgICAibWFwLXR5cGUiOiB7CisgICAgICAidGl0bGUiOiAiTWFwIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICJ0eXBlSWQiOiB7CisgICAgICAgICAgImVudW0iOiBbICJtYXAiIF0KKyAgICAgICAgfSwKKyAgICAgICAgImtleVR5cGVJZCI6ICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtaWQiIH0sCisgICAgICAgICJrZXlUeXBlIjogICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWRlc2MiIH0sCisgICAgICAgICJ2YWx1ZVR5cGVJZCI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWlkIiB9LAorICAgICAgICAidmFsdWVUeXBlIjogICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1kZXNjIiB9CisgICAgICB9LAorICAgICAgInJlcXVpcmVkIjogWyAidHlwZUlkIiwgImtleVR5cGVJZCIsICJ2YWx1ZVR5cGVJZCIgXQorICAgIH0sCisgICAgInN0cnVjdC10eXBlIjogeworICAgICAgInRpdGxlIjogIlN0cnVjdCwgdW5pb24gYW5kIGV4Y2VwdGlvbiBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAidHlwZUlkIjogeworICAgICAgICAgICJlbnVtIjogWyAidW5pb24iLCAic3RydWN0IiwgImV4Y2VwdGlvbiIgXQorICAgICAgICB9CisgICAgICB9LAorICAgICAgInJlcXVpcmVkIjogWyAidHlwZUlkIiwgImNsYXNzIiBdCisgICAgfSwKKyAgICAidHlwZS1kZXNjIjogeworICAgICAgInRpdGxlIjogIlR5cGUgZGVzY3JpcHRvciBzY2hlbWEiLAorICAgICAgImFsbE9mIjogWworICAgICAgICB7CisgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAgICAgInR5cGVJZCI6ICAgICAgeyAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgICAgICAgImNsYXNzIjogICAgICAgeyAidHlwZSI6ICJzdHJpbmciIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJvbmVPZiI6CisgICAgICAgICAgWworICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2Jhc2UtdHlwZSIgfSwKKyAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9saXN0LXR5cGUiIH0sCisgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbWFwLXR5cGUiIH0sCisgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc3RydWN0LXR5cGUiIH0KKyAgICAgICAgICBdCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJuYW1lLWFuZC1kb2MiOiB7CisgICAgICAidGl0bGUiOiAiTmFtZSBhbmQgZG9jdW1lbnRhdGlvbiBzdWItc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgIm5hbWUiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgImRvYyI6IHsgInR5cGUiOiAic3RyaW5nIiB9CisgICAgICB9LAorICAgICAgInJlcXVpcmVkIjogWyAibmFtZSIgXQorICAgIH0sCisgICAgImVudW0iOiB7CisgICAgICAidGl0bGUiOiAiVGhyaWZ0ICdlbnVtJyBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgImFsbE9mIjogWworICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbmFtZS1hbmQtZG9jIiB9LAorICAgICAgICB7CisgICAgICAgICAgInJlcXVpcmVkIjogWyAibWVtYmVycyIgXSwKKyAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJtZW1iZXJzIjogeworICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAgICAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgICAgICAgIm5hbWUiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHsgInR5cGUiOiAiaW50ZWdlciIgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyAibmFtZSIsICJ2YWx1ZSIgXQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidHlwZWRlZiI6IHsKKyAgICAgICJ0aXRsZSI6ICJUaHJpZnQgdHlwZWRlZiBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgImFsbE9mIjogWworICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbmFtZS1hbmQtZG9jIiB9LAorICAgICAgICB7CisgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAidHlwZUlkIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtaWQiIH0sCisgICAgICAgICAgICAidHlwZSI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWRlc2MiIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICJyZXF1aXJlZCI6IFsgInR5cGVJZCIgXQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiY29uc3RhbnQiOiB7CisgICAgICAidGl0bGUiOiAiVGhyaWZ0IGNvbnN0YW50IGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWxsT2YiOiBbCisgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCisgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWRlc2MiIH0sCisgICAgICAgIHsKKyAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJ2YWx1ZSI6IHsKKyAgICAgICAgICAgICAgIm9uZU9mIjogWworICAgICAgICAgICAgICAgIHsgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAgICAgICAgIHsgInR5cGUiOiAibnVtYmVyIiB9LAorICAgICAgICAgICAgICAgIHsgInR5cGUiOiAiYXJyYXkiIH0sCisgICAgICAgICAgICAgICAgeyAidHlwZSI6ICJvYmplY3QiIH0KKyAgICAgICAgICAgICAgXQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisgICAgICAgICAgInJlcXVpcmVkIjogWyAidmFsdWUiIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgImZpZWxkIjogeworICAgICAgInRpdGxlIjogIlRocmlmdCBzdHJ1Y3QgZmllbGQgZGVmaW5pdGlvbiBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhbGxPZiI6IFsKKyAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25hbWUtYW5kLWRvYyIgfSwKKyAgICAgICAgeworICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgImtleSI6IHsKKyAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCisgICAgICAgICAgICAgICJtaW5pbXVtIjogMSwKKyAgICAgICAgICAgICAgIm1heGltdW0iOiA2NTUzNQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJyZXF1aXJlZCI6IHsKKyAgICAgICAgICAgICAgImVudW0iOiBbICJyZXF1aXJlZCIsICJvcHRpb25hbCIsICJyZXFfb3V0IiBdCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInR5cGVJZCI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWlkIiB9LAorICAgICAgICAgICAgInR5cGUiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1kZXNjIiB9LAorICAgICAgICAgICAgImRlZmF1bHQiOiB7CisgICAgICAgICAgICAgICJvbmVPZiI6IFsKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogIm51bWJlciIgfSwKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogImFycmF5IiB9LAorICAgICAgICAgICAgICAgIHsgInR5cGUiOiAib2JqZWN0IiB9CisgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICJyZXF1aXJlZCI6IFsgImtleSIsICJyZXF1aXJlZCIgXQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAic3RydWN0IjogeworICAgICAgInRpdGxlIjogIlRocmlmdCBzdHJ1Y3QgZGVmaW5pdGlvbiBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhbGxPZiI6IFsKKyAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25hbWUtYW5kLWRvYyIgfSwKKyAgICAgICAgeworICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgImlzRXhjZXB0aW9uIjogeyAidHlwZSI6ICJib29sZWFuIiB9LAorICAgICAgICAgICAgImlzVW5pb24iOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCisgICAgICAgICAgICAiZmllbGRzIjogeworICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAgICAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2ZpZWxkIgorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSwKKyAgICAgICAgICAicmVxdWlyZWQiOiBbICJpc0V4Y2VwdGlvbiIsICJpc1VuaW9uIiwgImZpZWxkcyIgXQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidW5pb24iOiB7CisgICAgICAidGl0bGUiOiAiVGhyaWZ0IHVuaW9uIGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc3RydWN0IgorICAgIH0sCisgICAgImV4Y2VwdGlvbiI6IHsKKyAgICAgICJ0aXRsZSI6ICJUaHJpZnQgZXhjZXB0aW9uIGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgImtleSI6IHsKKyAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIiwKKyAgICAgICAgICAibWluaW11bSI6IDEsCisgICAgICAgICAgIm1heGltdW0iOiA2NTUzNQorICAgICAgICB9LAorICAgICAgICAibmFtZSI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAidHlwZUlkIjogeyAiZW51bSI6IFsgImV4Y2VwdGlvbiIgXSB9LAorICAgICAgICAidHlwZSI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9zdHJ1Y3QtdHlwZSIgfQorICAgICAgfSwKKyAgICAgICJyZXF1aXJlZCI6IFsgImtleSIsICJuYW1lIiwgInR5cGVJZCIgXQorICAgIH0sCisgICAgImZ1bmN0aW9uIjogeworICAgICAgInRpdGxlIjogIlRocmlmdCBzZXJ2aWNlIGZ1bmN0aW9uIGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWxsT2YiOiBbCisgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCisgICAgICAgIHsKKyAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJvbmV3YXkiOiB7CisgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInJldHVyblR5cGUiOiB7CisgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1kZXNjIgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJhcmd1bWVudHMiOiB7CisgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICAgICAgICAgIml0ZW1zIjogeworICAgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZmllbGQiCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiZXhjZXB0aW9ucyI6IHsKKyAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgICAgICAgICAiaXRlbXMiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZXhjZXB0aW9uIiB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSwKKyAgICAgICAgICAicmVxdWlyZWQiOiBbICJvbmV3YXkiLCAiYXJndW1lbnRzIiwgImV4Y2VwdGlvbnMiIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInNlcnZpY2UiOiB7CisgICAgICAidGl0bGUiOiAiVGhyaWZ0IHNlcnZpY2UgZGVmaW5pdGlvbiBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhbGxPZiI6IFsKKyAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25hbWUtYW5kLWRvYyIgfSwKKyAgICAgICAgeworICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgImZ1bmN0aW9ucyI6IHsKKyAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgICAgICAgICAiaXRlbXMiOiB7CisgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9mdW5jdGlvbiIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisgICAgICAgICAgInJlcXVpcmVkIjogWyAiZnVuY3Rpb25zIiBdCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJhbm5vdGF0aW9ucyI6IHsKKyAgICAgICJ0aXRsZSI6ICJNYXAgb2YgYW5ub3RhdGlvbiBuYW1lcyB0byB2YWx1ZXMiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKKyAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgfQorICAgIH0KKyAgfSwKKworICAidHlwZSI6ICJvYmplY3QiLAorICAicmVxdWlyZWQiOiBbCisgICAgIm5hbWUiLAorICAgICJlbnVtcyIsCisgICAgInR5cGVkZWZzIiwKKyAgICAic3RydWN0cyIsCisgICAgImNvbnN0YW50cyIsCisgICAgInNlcnZpY2VzIgorICBdLAorICAicHJvcGVydGllcyI6IHsKKyAgICAibmFtZSI6IHsKKyAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICB9LAorICAgICJpbmNsdWRlcyI6IHsKKyAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgfSwKKyAgICAgICJ1bmlxdWVJdGVtcyI6IHRydWUKKyAgICB9LAorICAgICJuYW1lc3BhY2VzIjogeworICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKKyAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgfQorICAgIH0sCisgICAgImVudW1zIjogeworICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgIml0ZW1zIjogeworICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2VudW0iCisgICAgICB9CisgICAgfSwKKyAgICAidHlwZWRlZnMiOiB7CisgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAiaXRlbXMiOiB7CisgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZWRlZiIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJ1Y3RzIjogeworICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgIml0ZW1zIjogeworICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3N0cnVjdCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb25zdGFudHMiOiB7CisgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAiaXRlbXMiOiB7CisgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvY29uc3RhbnQiCisgICAgICB9CisgICAgfSwKKyAgICAic2VydmljZXMiOiB7CisgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAiaXRlbXMiOiB7CisgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc2VydmljZSIKKyAgICAgIH0KKyAgICB9CisgIH0sCisgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlCit9CmRpZmYgLS1naXQgYS9saWIvanNvbi90ZXN0L01ha2VmaWxlLmFtIGIvbGliL2pzb24vdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjg3YTUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzb24vdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworY2hlY2s6CisJJChBTlQpICQoQU5UX0ZMQUdTKSB0ZXN0CisKKyMgTWFrZSBzdXJlIHRoaXMgZG9lc24ndCBmYWlsIGlmIGFudCBpcyBub3QgY29uZmlndXJlZC4KK2NsZWFuLWxvY2FsOgorCUFOVD0kKEFOVCkgOyBpZiB0ZXN0IC16ICIkJEFOVCIgOyB0aGVuIEFOVD06IDsgZmkgOyBcCisJJCRBTlQgJChBTlRfRkxBR1MpIGNsZWFuCmRpZmYgLS1naXQgYS9saWIvanNvbi90ZXN0L2J1aWxkLnByb3BlcnRpZXMgYi9saWIvanNvbi90ZXN0L2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc1ZjY0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qc29uL3Rlc3QvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDEwIEBACisjIEphciB2ZXJzaW9ucworbXZuLmFudC50YXNrLnZlcnNpb249Mi4xLjMKKworIyBEZXBlbmRlbmN5IHZlcnNpb25zCitqc29uLXNjaGVtYS12YWxpZGF0b3IudmVyc2lvbj0yLjIuNgorCisjIE1hdmVuIGRlcGVuZGVuY3kgZG93bmxvYWQgbG9jYXRpb25zCittdm4ucmVwbz1odHRwOi8vcmVwbzEubWF2ZW4ub3JnL21hdmVuMgorbXZuLmFudC50YXNrLnVybD0ke212bi5yZXBvfS9vcmcvYXBhY2hlL21hdmVuL21hdmVuLWFudC10YXNrcy8ke212bi5hbnQudGFzay52ZXJzaW9ufQorbXZuLmFudC50YXNrLmphcj1tYXZlbi1hbnQtdGFza3MtJHttdm4uYW50LnRhc2sudmVyc2lvbn0uamFyCmRpZmYgLS1naXQgYS9saWIvanNvbi90ZXN0L2J1aWxkLnhtbCBiL2xpYi9qc29uL3Rlc3QvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NmEyMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanNvbi90ZXN0L2J1aWxkLnhtbApAQCAtMCwwICsxLDE0NCBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9IkpTT04gU2NoZW1hIFRlc3QiIGRlZmF1bHQ9InRlc3QiIGJhc2VkaXI9Ii4iCisgIHhtbG5zOmFydGlmYWN0PSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiPgorCisgIDxkZXNjcmlwdGlvbj5KU09OIFNjaGVtYSBWYWxpZGF0aW9uIFRlc3Q8L2Rlc2NyaXB0aW9uPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9L2J1aWxkIiAvPgorICA8cHJvcGVydHkgbmFtZT0ianNvbi5kaXIiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uIiAvPgorICA8cHJvcGVydHkgbmFtZT0iZ2VuLmpzb24uZGlyIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L2dlbi1qc29uIiAvPgorICA8cHJvcGVydHkgbmFtZT0ianNvbi5zY2hlbWEiIGxvY2F0aW9uPSIke2pzb24uZGlyfS9zY2hlbWEuanNvbiIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRvb2xzLmRpciIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS90b29scyIvPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQubGliLmRpciIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9saWIiLz4KKworICA8IS0tIHRoZSByb290IGRpcmVjdG9yeSwgd2hlcmUgeW91IHVucGFjayB0aHJpZnQgZGlzdGlidXRpb24gKGUuZy4gdGhyaWZ0LTAueC54LnRhci5neikgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuZGlyIiBsb2NhdGlvbj0iLi4vLi4vLi4vIiAvPgorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LnRlc3QuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQuZGlyfS90ZXN0IiAvPgorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmNvbXBpbGVyIiBsb2NhdGlvbj0iJHt0aHJpZnQuZGlyfS9jb21waWxlci9jcHAvdGhyaWZ0IiAvPgorCisgIDwhLS0gR2V0IG1hdmVuIGRlcGVuZGVuY3kgdmVyc2lvbnMgZnJvbSBoZXJlIC0tPgorICA8cHJvcGVydHkgZmlsZT0iJHtiYXNlZGlyfS9idWlsZC5wcm9wZXJ0aWVzIiAvPgorCisgIDxwYXRoIGlkPSJ0ZXN0LmNsYXNzcGF0aCI+CisgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmxpYi5kaXJ9Ij4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgorICAgIDwvZmlsZXNldD4KKyAgPC9wYXRoPgorCisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZXIuY2hlY2siPgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iMSI+CisgICAgICAgICAgICA8ZmlsZXNldCBpZD0iZnMiIGZpbGU9IiR7dGhyaWZ0LmNvbXBpbGVyfSIvPgorICAgICAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICAgIFRocmlmdCBjb21waWxlciBpcyBtaXNzaW5nICEKKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0iY29tcGlsZXIuY2hlY2ssIG1rZGlycywgbXZuLmluaXQiPgorICAgIDx0c3RhbXAgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJta2RpcnMiPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfSIvPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGliLmRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLnRvb2xzLmRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2dlbi5qc29uLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0aHJpZnQuY29tcGlsZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGpzb24iLz4KKyAgICAgIDxhcmcgbGluZT0iLW91dCAke2dlbi5qc29uLmRpcn0iLz4KKyAgICAgIDxhcmcgbGluZT0iJHt0aHJpZnQudGVzdC5kaXJ9L1RocmlmdFRlc3QudGhyaWZ0Ii8+CisgICAgPC9leGVjPgorICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7dGhyaWZ0LmNvbXBpbGVyfSIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyBsaW5lPSItLWdlbiBqc29uOm1lcmdlIi8+CisgICAgICA8YXJnIGxpbmU9Ii1vdXQgJHtnZW4uanNvbi5kaXJ9Ii8+CisgICAgICA8YXJnIGxpbmU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9JbmNsdWRlLnRocmlmdCIvPgorICAgIDwvZXhlYz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0icnVuIHNjaGVtYSB2YWxpZGF0aW9uIgorICAgICAgICAgIGRlcGVuZHM9InZhbGlkYXRlLXNjaGVtYSwgdmFsaWRhdGUtZ2VuZXJhdGVkLWpzb24iLz4KKworICA8dGFyZ2V0IG5hbWU9InZhbGlkYXRlLXNjaGVtYSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uZ2l0aHViLmZnZS5qc29uc2NoZW1hLm1haW4uY2xpLk1haW4iCisgICAgICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyB2YWx1ZT0iLS1zeW50YXgiLz4KKyAgICAgIDxhcmcgdmFsdWU9IiR7anNvbi5zY2hlbWF9Ii8+CisgICAgPC9qYXZhPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InZhbGlkYXRlLWdlbmVyYXRlZC1qc29uIiBkZXBlbmRzPSJpbml0LCBnZW5lcmF0ZSI+CisgICAgPHZhbGlkYXRlLWpzb24gZmlsZT0iJHtnZW4uanNvbi5kaXJ9L1RocmlmdFRlc3QuanNvbiIvPgorICAgIDx2YWxpZGF0ZS1qc29uIGZpbGU9IiR7Z2VuLmpzb24uZGlyfS9JbmNsdWRlLmpzb24iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIgLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtnZW4uanNvbi5kaXJ9IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIGRlcGVuZHM9Im1rZGlycyxtdm4uYW50LnRhc2tzLmNoZWNrIiB1bmxlc3M9Im12bi5hbnQudGFza3MuZm91bmQiPgorICAgIDxnZXQgc3JjPSIke212bi5hbnQudGFzay51cmx9LyR7bXZuLmFudC50YXNrLmphcn0iIGRlc3Q9IiR7YnVpbGQudG9vbHMuZGlyfS8ke212bi5hbnQudGFzay5qYXJ9IiB1c2V0aW1lc3RhbXA9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtdm4uYW50LnRhc2tzLmNoZWNrIj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJtdm4uYW50LnRhc2tzLmZvdW5kIj4KKyAgICAgIDx0eXBlZm91bmQgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiIG5hbWU9ImFydGlmYWN0Ii8+CisgICAgPC9jb25kaXRpb24+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibXZuLmluaXQiIGRlcGVuZHM9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIHVubGVzcz0ibXZuLmZpbmlzaGVkIj4KKyAgICA8dHlwZWRlZiB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCIgY2xhc3NwYXRoPSIke2J1aWxkLnRvb2xzLmRpcn0vJHttdm4uYW50LnRhc2suamFyfSIvPgorCisgICAgPGFydGlmYWN0OmRlcGVuZGVuY2llcyBmaWxlc2V0SWQ9InRlc3QuZGVwZW5kZW5jeS5qYXJzIj4KKyAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5naXRodWIuZmdlIiBhcnRpZmFjdElkPSJqc29uLXNjaGVtYS12YWxpZGF0b3IiIHZlcnNpb249IiR7anNvbi1zY2hlbWEtdmFsaWRhdG9yLnZlcnNpb259Ii8+CisgICAgPC9hcnRpZmFjdDpkZXBlbmRlbmNpZXM+CisKKyAgICA8IS0tIENvcHkgdGhlIGRlcGVuZGVuY2llcyB0byB0aGUgYnVpbGQvbGliIGRpciAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5saWIuZGlyfSI+CisgICAgICA8ZmlsZXNldCByZWZpZD0idGVzdC5kZXBlbmRlbmN5LmphcnMiLz4KKyAgICAgIDxtYXBwZXIgdHlwZT0iZmxhdHRlbiIvPgorICAgIDwvY29weT4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJtdm4uZmluaXNoZWQiIHZhbHVlPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDxtYWNyb2RlZiBuYW1lPSJ2YWxpZGF0ZS1qc29uIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIGRlZmF1bHQ9IiIvPgorICAgIDxzZXF1ZW50aWFsPgorICAgICAgPGphdmEgZmFpbG9uZXJyb3I9InRydWUiCisgICAgICAgICAgICBmb3JrPSJ0cnVlIgorICAgICAgICAgICAgZGlyPSIke2pzb24uZGlyfSIKKyAgICAgICAgICAgIGNsYXNzbmFtZT0iY29tLmdpdGh1Yi5mZ2UuanNvbnNjaGVtYS5tYWluLmNsaS5NYWluIgorICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCI+CisgICAgICAgIDxhcmcgbGluZT0iLS1mYWtlcm9vdCBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvIi8+CisgICAgICAgIDxhcmcgdmFsdWU9IiR7anNvbi5zY2hlbWF9Ii8+CisgICAgICAgIDxhcmcgdmFsdWU9IkB7ZmlsZX0iLz4KKyAgICAgIDwvamF2YT4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9sdWEvTWFrZWZpbGUuYW0gYi9saWIvbHVhL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMGYxN2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNzMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMKKworU1VCRElSUyA9IC4KKworbGliX0xUTElCUkFSSUVTID0gXAorCQkJbGlibHVhc29ja2V0LmxhIFwKKwkJCWxpYmx1YWxvbmdudW1iZXIubGEgXAorCQkJbGlibHVhYnBhY2subGEgXAorCQkJbGlibHVhYml0d2lzZS5sYQorCitsaWJsdWFzb2NrZXRfbGFfU09VUkNFUyA9IFwKKwkJCXNyYy9sdWFzb2NrZXQuYyBcCisJCQlzcmMvdXNvY2tldC5jCisKK25vYmFzZV9pbmNsdWRlX0hFQURFUlMgPSBzcmMvc29ja2V0LmgKKworbGlibHVhc29ja2V0X2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChMVUFfSU5DTFVERSkgLURMVUFfQ09NUEFUX01PRFVMRQorbGlibHVhc29ja2V0X2xhX0xERkxBR1MgPSAkKEFNX0xERkxBR1MpCitsaWJsdWFzb2NrZXRfbGFfTElCQUREID0gJChMVUFfTElCKSAtbG0KKworbGlibHVhYnBhY2tfbGFfU09VUkNFUyA9IHNyYy9sdWFicGFjay5jCisKK2xpYmx1YWJwYWNrX2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChMVUFfSU5DTFVERSkgLURMVUFfQ09NUEFUX01PRFVMRQorbGlibHVhYnBhY2tfbGFfTERGTEFHUyA9ICQoQU1fTERGTEFHUykKK2xpYmx1YWJwYWNrX2xhX0xJQkFERCA9IGxpYmx1YWxvbmdudW1iZXIubGEgJChMVUFfTElCKSAtbG0KKworbGlibHVhYml0d2lzZV9sYV9TT1VSQ0VTID0gc3JjL2x1YWJpdHdpc2UuYworCitsaWJsdWFiaXR3aXNlX2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChMVUFfSU5DTFVERSkgLURMVUFfQ09NUEFUX01PRFVMRQorbGlibHVhYml0d2lzZV9sYV9MREZMQUdTID0gJChBTV9MREZMQUdTKQorbGlibHVhYml0d2lzZV9sYV9MSUJBREQgPSAkKExVQV9MSUIpIC1sbQorCitsaWJsdWFsb25nbnVtYmVyX2xhX1NPVVJDRVMgPSBcCisJCXNyYy9sdWFsb25nbnVtYmVyLmMgXAorCQlzcmMvbG9uZ251bWJlcnV0aWxzLmMKKworbGlibHVhbG9uZ251bWJlcl9sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoTFVBX0lOQ0xVREUpIC1ETFVBX0NPTVBBVF9NT0RVTEUKK2xpYmx1YWxvbmdudW1iZXJfbGFfTERGTEFHUyA9ICQoQU1fTERGTEFHUykKK2xpYmx1YWxvbmdudW1iZXJfbGFfTElCQUREID0gJChMVUFfTElCKSAtbG0KKworRVhUUkFfRElTVCA9IFwKKwkJY29kaW5nX3N0YW5kYXJkcy5tZCBcCisJCVRCaW5hcnlQcm90b2NvbC5sdWEgXAorCQlUQnVmZmVyZWRUcmFuc3BvcnQubHVhIFwKKwkJVENvbXBhY3RQcm90b2NvbC5sdWEgXAorCQlURnJhbWVkVHJhbnNwb3J0Lmx1YSBcCisJCVRocmlmdC5sdWEgXAorCQlUSHR0cFRyYW5zcG9ydC5sdWEgXAorCQlUSnNvblByb3RvY29sLmx1YSBcCisJCVRNZW1vcnlCdWZmZXIubHVhIFwKKwkJVFByb3RvY29sLmx1YSBcCisJCVRTZXJ2ZXIubHVhIFwKKwkJVFNvY2tldC5sdWEgXAorCQlUVHJhbnNwb3J0Lmx1YQpkaWZmIC0tZ2l0IGEvbGliL2x1YS9UQmluYXJ5UHJvdG9jb2wubHVhIGIvbGliL2x1YS9UQmluYXJ5UHJvdG9jb2wubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOGU5OGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL1RCaW5hcnlQcm90b2NvbC5sdWEKQEAgLTAsMCArMSwyNjQgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUUHJvdG9jb2wnCityZXF1aXJlICdsaWJsdWFicGFjaycKK3JlcXVpcmUgJ2xpYmx1YWJpdHdpc2UnCisKK1RCaW5hcnlQcm90b2NvbCA9IF9fVE9iamVjdC5uZXcoVFByb3RvY29sQmFzZSwgeworICBfX3R5cGUgPSAnVEJpbmFyeVByb3RvY29sJywKKyAgVkVSU0lPTl9NQVNLID0gLTY1NTM2LCAtLSAweGZmZmYwMDAwCisgIFZFUlNJT05fMSAgICA9IC0yMTQ3NDE4MTEyLCAtLSAweDgwMDEwMDAwCisgIFRZUEVfTUFTSyAgICA9IDB4MDAwMDAwZmYsCisgIHN0cmljdFJlYWQgICA9IGZhbHNlLAorICBzdHJpY3RXcml0ZSAgPSB0cnVlCit9KQorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgdHR5cGUsIHNlcWlkKQorICBpZiBzZWxmLnN0cmljdFdyaXRlIHRoZW4KKyAgICBzZWxmOndyaXRlSTMyKGxpYmx1YWJpdHdpc2UuYm9yKFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OXzEsIHR0eXBlKSkKKyAgICBzZWxmOndyaXRlU3RyaW5nKG5hbWUpCisgICAgc2VsZjp3cml0ZUkzMihzZXFpZCkKKyAgZWxzZQorICAgIHNlbGY6d3JpdGVTdHJpbmcobmFtZSkKKyAgICBzZWxmOndyaXRlQnl0ZSh0dHlwZSkKKyAgICBzZWxmOndyaXRlSTMyKHNlcWlkKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6d3JpdGVNZXNzYWdlRW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6d3JpdGVTdHJ1Y3RCZWdpbihuYW1lKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZVN0cnVjdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlRmllbGRCZWdpbihuYW1lLCB0dHlwZSwgaWQpCisgIHNlbGY6d3JpdGVCeXRlKHR0eXBlKQorICBzZWxmOndyaXRlSTE2KGlkKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZUZpZWxkRW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6d3JpdGVGaWVsZFN0b3AoKQorICBzZWxmOndyaXRlQnl0ZShUVHlwZS5TVE9QKTsKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6d3JpdGVNYXBCZWdpbihrdHlwZSwgdnR5cGUsIHNpemUpCisgIHNlbGY6d3JpdGVCeXRlKGt0eXBlKQorICBzZWxmOndyaXRlQnl0ZSh2dHlwZSkKKyAgc2VsZjp3cml0ZUkzMihzaXplKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZU1hcEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlTGlzdEJlZ2luKGV0eXBlLCBzaXplKQorICBzZWxmOndyaXRlQnl0ZShldHlwZSkKKyAgc2VsZjp3cml0ZUkzMihzaXplKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZUxpc3RFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZVNldEJlZ2luKGV0eXBlLCBzaXplKQorICBzZWxmOndyaXRlQnl0ZShldHlwZSkKKyAgc2VsZjp3cml0ZUkzMihzaXplKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZVNldEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlQm9vbChib29sKQorICBpZiBib29sIHRoZW4KKyAgICBzZWxmOndyaXRlQnl0ZSgxKQorICBlbHNlCisgICAgc2VsZjp3cml0ZUJ5dGUoMCkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlQnl0ZShieXRlKQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ2MnLCBieXRlKQorICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlSTE2KGkxNikKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdzJywgaTE2KQorICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlSTMyKGkzMikKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdpJywgaTMyKQorICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlSTY0KGk2NCkKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdsJywgaTY0KQorICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlRG91YmxlKGR1YikKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdkJywgZHViKQorICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlU3RyaW5nKHN0cikKKyAgLS0gU2hvdWxkIGJlIHV0Zi04CisgIHNlbGY6d3JpdGVJMzIoc3RyaW5nLmxlbihzdHIpKQorICBzZWxmLnRyYW5zOndyaXRlKHN0cikKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6cmVhZE1lc3NhZ2VCZWdpbigpCisgIGxvY2FsIHN6LCB0dHlwZSwgbmFtZSwgc2VxaWQgPSBzZWxmOnJlYWRJMzIoKQorICBpZiBzeiA8IDAgdGhlbgorICAgIGxvY2FsIHZlcnNpb24gPSBsaWJsdWFiaXR3aXNlLmJhbmQoc3osIFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OX01BU0spCisgICAgaWYgdmVyc2lvbiB+PSBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl8xIHRoZW4KKyAgICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3eworICAgICAgICBtZXNzYWdlID0gJ0JhZCB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW46ICcgLi4gc3oKKyAgICAgIH0pCisgICAgZW5kCisgICAgdHR5cGUgPSBsaWJsdWFiaXR3aXNlLmJhbmQoc3osIFRCaW5hcnlQcm90b2NvbC5UWVBFX01BU0spCisgICAgbmFtZSA9IHNlbGY6cmVhZFN0cmluZygpCisgICAgc2VxaWQgPSBzZWxmOnJlYWRJMzIoKQorICBlbHNlCisgICAgaWYgc2VsZi5zdHJpY3RSZWFkIHRoZW4KKyAgICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3e21lc3NhZ2UgPSAnTm8gcHJvdG9jb2wgdmVyc2lvbiBoZWFkZXInfSkKKyAgICBlbmQKKyAgICBuYW1lID0gc2VsZi50cmFuczpyZWFkQWxsKHN6KQorICAgIHR0eXBlID0gc2VsZjpyZWFkQnl0ZSgpCisgICAgc2VxaWQgPSBzZWxmOnJlYWRJMzIoKQorICBlbmQKKyAgcmV0dXJuIG5hbWUsIHR0eXBlLCBzZXFpZAorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkTWVzc2FnZUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRTdHJ1Y3RCZWdpbigpCisgIHJldHVybiBuaWwKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6cmVhZFN0cnVjdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRGaWVsZEJlZ2luKCkKKyAgbG9jYWwgdHR5cGUgPSBzZWxmOnJlYWRCeXRlKCkKKyAgaWYgdHR5cGUgPT0gVFR5cGUuU1RPUCB0aGVuCisgICAgcmV0dXJuIG5pbCwgdHR5cGUsIDAKKyAgZW5kCisgIGxvY2FsIGlkID0gc2VsZjpyZWFkSTE2KCkKKyAgcmV0dXJuIG5pbCwgdHR5cGUsIGlkCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRGaWVsZEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRNYXBCZWdpbigpCisgIGxvY2FsIGt0eXBlID0gc2VsZjpyZWFkQnl0ZSgpCisgIGxvY2FsIHZ0eXBlID0gc2VsZjpyZWFkQnl0ZSgpCisgIGxvY2FsIHNpemUgPSBzZWxmOnJlYWRJMzIoKQorICByZXR1cm4ga3R5cGUsIHZ0eXBlLCBzaXplCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRNYXBFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkTGlzdEJlZ2luKCkKKyAgbG9jYWwgZXR5cGUgPSBzZWxmOnJlYWRCeXRlKCkKKyAgbG9jYWwgc2l6ZSA9IHNlbGY6cmVhZEkzMigpCisgIHJldHVybiBldHlwZSwgc2l6ZQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkTGlzdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRTZXRCZWdpbigpCisgIGxvY2FsIGV0eXBlID0gc2VsZjpyZWFkQnl0ZSgpCisgIGxvY2FsIHNpemUgPSBzZWxmOnJlYWRJMzIoKQorICByZXR1cm4gZXR5cGUsIHNpemUKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6cmVhZFNldEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRCb29sKCkKKyAgbG9jYWwgYnl0ZSA9IHNlbGY6cmVhZEJ5dGUoKQorICBpZiBieXRlID09IDAgdGhlbgorICAgIHJldHVybiBmYWxzZQorICBlbmQKKyAgcmV0dXJuIHRydWUKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6cmVhZEJ5dGUoKQorICBsb2NhbCBidWZmID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2MnLCBidWZmKQorICByZXR1cm4gdmFsCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRJMTYoKQorICBsb2NhbCBidWZmID0gc2VsZi50cmFuczpyZWFkQWxsKDIpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ3MnLCBidWZmKQorICByZXR1cm4gdmFsCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRJMzIoKQorICBsb2NhbCBidWZmID0gc2VsZi50cmFuczpyZWFkQWxsKDQpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2knLCBidWZmKQorICByZXR1cm4gdmFsCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRJNjQoKQorICBsb2NhbCBidWZmID0gc2VsZi50cmFuczpyZWFkQWxsKDgpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2wnLCBidWZmKQorICByZXR1cm4gdmFsCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWREb3VibGUoKQorICBsb2NhbCBidWZmID0gc2VsZi50cmFuczpyZWFkQWxsKDgpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2QnLCBidWZmKQorICByZXR1cm4gdmFsCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRTdHJpbmcoKQorICBsb2NhbCBsZW4gPSBzZWxmOnJlYWRJMzIoKQorICBsb2NhbCBzdHIgPSBzZWxmLnRyYW5zOnJlYWRBbGwobGVuKQorICByZXR1cm4gc3RyCitlbmQKKworVEJpbmFyeVByb3RvY29sRmFjdG9yeSA9IFRQcm90b2NvbEZhY3Rvcnk6bmV3eworICBfX3R5cGUgPSAnVEJpbmFyeVByb3RvY29sRmFjdG9yeScsCisgIHN0cmljdFJlYWQgPSBmYWxzZQorfQorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5OmdldFByb3RvY29sKHRyYW5zKQorICAtLSBUT0RPIEVuZm9yY2UgdGhhdCB0aGlzIG11c3QgYmUgYSB0cmFuc3BvcnQgY2xhc3MgKGllIG5vdCBhIGJvb2wpCisgIGlmIG5vdCB0cmFucyB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7CisgICAgICBtZXNzYWdlID0gJ011c3Qgc3VwcGx5IGEgdHJhbnNwb3J0IHRvICcgLi4gdHR5cGUoc2VsZikKKyAgICB9KQorICBlbmQKKyAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbDpuZXd7CisgICAgdHJhbnMgPSB0cmFucywKKyAgICBzdHJpY3RSZWFkID0gc2VsZi5zdHJpY3RSZWFkLAorICAgIHN0cmljdFdyaXRlID0gdHJ1ZQorICB9CitlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVEJ1ZmZlcmVkVHJhbnNwb3J0Lmx1YSBiL2xpYi9sdWEvVEJ1ZmZlcmVkVHJhbnNwb3J0Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWVmNGIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9UQnVmZmVyZWRUcmFuc3BvcnQubHVhCkBAIC0wLDAgKzEsOTEgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUVHJhbnNwb3J0JworCitUQnVmZmVyZWRUcmFuc3BvcnQgPSBUVHJhbnNwb3J0QmFzZTpuZXd7CisgIF9fdHlwZSA9ICdUQnVmZmVyZWRUcmFuc3BvcnQnLAorICByQnVmU2l6ZSA9IDIwNDgsCisgIHdCdWZTaXplID0gMjA0OCwKKyAgd0J1ZiA9ICcnLAorICByQnVmID0gJycKK30KKworZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0Om5ldyhvYmopCisgIGlmIHR0eXBlKG9iaikgfj0gJ3RhYmxlJyB0aGVuCisgICAgZXJyb3IodHR5cGUoc2VsZikgLi4gJ211c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIHRhYmxlJykKKyAgZW5kCisKKyAgLS0gRW5zdXJlIGEgdHJhbnNwb3J0IGlzIHByb3ZpZGVkCisgIGlmIG5vdCBvYmoudHJhbnMgdGhlbgorICAgIGVycm9yKCdZb3UgbXVzdCBwcm92aWRlICcgLi4gdHR5cGUoc2VsZikgLi4gJyB3aXRoIGEgdHJhbnMnKQorICBlbmQKKworICByZXR1cm4gVFRyYW5zcG9ydEJhc2UubmV3KHNlbGYsIG9iaikKK2VuZAorCitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnQ6aXNPcGVuKCkKKyAgcmV0dXJuIHNlbGYudHJhbnM6aXNPcGVuKCkKK2VuZAorCitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnQ6b3BlbigpCisgIHJldHVybiBzZWxmLnRyYW5zOm9wZW4oKQorZW5kCisKK2Z1bmN0aW9uIFRCdWZmZXJlZFRyYW5zcG9ydDpjbG9zZSgpCisgIHJldHVybiBzZWxmLnRyYW5zOmNsb3NlKCkKK2VuZAorCitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnQ6cmVhZChsZW4pCisgIHJldHVybiBzZWxmLnRyYW5zOnJlYWQobGVuKQorZW5kCisKK2Z1bmN0aW9uIFRCdWZmZXJlZFRyYW5zcG9ydDpyZWFkQWxsKGxlbikKKyAgcmV0dXJuIHNlbGYudHJhbnM6cmVhZEFsbChsZW4pCitlbmQKKworZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0OndyaXRlKGJ1ZikKKyAgc2VsZi53QnVmID0gc2VsZi53QnVmIC4uIGJ1ZgorICBpZiBzdHJpbmcubGVuKHNlbGYud0J1ZikgPj0gc2VsZi53QnVmU2l6ZSB0aGVuCisgICAgc2VsZi50cmFuczp3cml0ZShzZWxmLndCdWYpCisgICAgc2VsZi53QnVmID0gJycKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0OmZsdXNoKCkKKyAgaWYgc3RyaW5nLmxlbihzZWxmLndCdWYpID4gMCB0aGVuCisgICAgc2VsZi50cmFuczp3cml0ZShzZWxmLndCdWYpCisgICAgc2VsZi53QnVmID0gJycKKyAgZW5kCitlbmQKKworVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSA9IFRUcmFuc3BvcnRGYWN0b3J5QmFzZTpuZXd7CisgIF9fdHlwZSA9ICdUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5JworfQorCitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OmdldFRyYW5zcG9ydCh0cmFucykKKyAgaWYgbm90IHRyYW5zIHRoZW4KKyAgICB0ZXJyb3IoVFRyYW5zcG9ydEV4Y2VwdGlvbjpuZXd7CisgICAgICBtZXNzYWdlID0gJ011c3Qgc3VwcGx5IGEgdHJhbnNwb3J0IHRvICcgLi4gdHR5cGUoc2VsZikKKyAgICB9KQorICBlbmQKKyAgcmV0dXJuIFRCdWZmZXJlZFRyYW5zcG9ydDpuZXd7CisgICAgdHJhbnMgPSB0cmFucworICB9CitlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVENvbXBhY3RQcm90b2NvbC5sdWEgYi9saWIvbHVhL1RDb21wYWN0UHJvdG9jb2wubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NzU5NWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL1RDb21wYWN0UHJvdG9jb2wubHVhCkBAIC0wLDAgKzEsNDU3IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworcmVxdWlyZSAnVFByb3RvY29sJworcmVxdWlyZSAnbGlibHVhYnBhY2snCityZXF1aXJlICdsaWJsdWFiaXR3aXNlJworcmVxdWlyZSAnbGlibHVhbG9uZ251bWJlcicKKworVENvbXBhY3RQcm90b2NvbCA9IF9fVE9iamVjdC5uZXcoVFByb3RvY29sQmFzZSwgeworICBfX3R5cGUgPSAnVENvbXBhY3RQcm90b2NvbCcsCisgIENPTVBBQ1RfUFJPVE9DT0xfSUQgICAgICAgPSAweDgyLAorICBDT01QQUNUX1ZFUlNJT04gICAgICAgICAgID0gMSwKKyAgQ09NUEFDVF9WRVJTSU9OX01BU0sgICAgICA9IDB4MWYsCisgIENPTVBBQ1RfVFlQRV9NQVNLICAgICAgICAgPSAweEUwLAorICBDT01QQUNUX1RZUEVfQklUUyAgICAgICAgID0gMHgwNywKKyAgQ09NUEFDVF9UWVBFX1NISUZUX0FNT1VOVCA9IDUsCisKKyAgLS0gVXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IGZpZWxkIGZvciB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgc3RydWN0cywKKyAgLS0gc28gd2UgY2FuIGRvIHRoZSBkZWx0YSBzdHVmZi4KKyAgbGFzdEZpZWxkID0ge30sCisgIGxhc3RGaWVsZElkID0gMCwKKyAgbGFzdEZpZWxkSW5kZXggPSAxLAorCisgIC0tIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlIHNvIGl0IGNhbgorICAtLSBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCisgIGJvb2xlYW5GaWVsZE5hbWUgICAgPSAiIiwKKyAgYm9vbGVhbkZpZWxkSWQgICAgICA9IDAsCisgIGJvb2xlYW5GaWVsZFBlbmRpbmcgPSBmYWxzZSwKKworICAtLSBJZiB3ZSByZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4KKyAgLS0gdmFsdWUgaGVyZSBzbyB0aGF0IHJlYWRCb29sIGNhbiB1c2UgaXQuCisgIGJvb2xWYWx1ZSAgICAgICAgICA9IGZhbHNlLAorICBib29sVmFsdWVJc05vdE51bGwgPSBmYWxzZSwKK30pCisKK1RDb21wYWN0VHlwZSA9IHsKKyAgQ09NUEFDVF9CT09MRUFOX1RSVUUgID0gMHgwMSwKKyAgQ09NUEFDVF9CT09MRUFOX0ZBTFNFID0gMHgwMiwKKyAgQ09NUEFDVF9CWVRFICAgICAgICAgID0gMHgwMywKKyAgQ09NUEFDVF9JMTYgICAgICAgICAgID0gMHgwNCwKKyAgQ09NUEFDVF9JMzIgICAgICAgICAgID0gMHgwNSwKKyAgQ09NUEFDVF9JNjQgICAgICAgICAgID0gMHgwNiwKKyAgQ09NUEFDVF9ET1VCTEUgICAgICAgID0gMHgwNywKKyAgQ09NUEFDVF9CSU5BUlkgICAgICAgID0gMHgwOCwKKyAgQ09NUEFDVF9MSVNUICAgICAgICAgID0gMHgwOSwKKyAgQ09NUEFDVF9TRVQgICAgICAgICAgID0gMHgwQSwKKyAgQ09NUEFDVF9NQVAgICAgICAgICAgID0gMHgwQiwKKyAgQ09NUEFDVF9TVFJVQ1QgICAgICAgID0gMHgwQworfQorCitUVHlwZVRvQ29tcGFjdFR5cGUgPSB7fQorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLlNUT1BdICAgPSBUVHlwZS5TVE9QCitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuQk9PTF0gICA9IFRDb21wYWN0VHlwZS5DT01QQUNUX0JPT0xFQU5fVFJVRQorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLkJZVEVdICAgPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9CWVRFCitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuSTE2XSAgICA9IFRDb21wYWN0VHlwZS5DT01QQUNUX0kxNgorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLkkzMl0gICAgPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9JMzIKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5JNjRdICAgID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfSTY0CitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuRE9VQkxFXSA9IFRDb21wYWN0VHlwZS5DT01QQUNUX0RPVUJMRQorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLlNUUklOR10gPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9CSU5BUlkKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5MSVNUXSAgID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfTElTVAorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLlNFVF0gICAgPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9TRVQKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5NQVBdICAgID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfTUFQCitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuU1RSVUNUXSA9IFRDb21wYWN0VHlwZS5DT01QQUNUX1NUUlVDVAorCitDb21wYWN0VHlwZVRvVFR5cGUgPSB7fQorQ29tcGFjdFR5cGVUb1RUeXBlW1RUeXBlLlNUT1BdICAgICAgICAgICAgICAgICAgICAgICAgPSBUVHlwZS5TVE9QCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfQk9PTEVBTl9UUlVFXSA9IFRUeXBlLkJPT0wKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9CT09MRUFOX0ZBTFNFXSA9IFRUeXBlLkJPT0wKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9CWVRFXSAgICAgICAgID0gVFR5cGUuQllURQorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX0kxNl0gICAgICAgICAgPSBUVHlwZS5JMTYKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9JMzJdICAgICAgICAgID0gVFR5cGUuSTMyCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfSTY0XSAgICAgICAgICA9IFRUeXBlLkk2NAorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX0RPVUJMRV0gICAgICAgPSBUVHlwZS5ET1VCTEUKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9CSU5BUlldICAgICAgID0gVFR5cGUuU1RSSU5HCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfTElTVF0gICAgICAgICA9IFRUeXBlLkxJU1QKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9TRVRdICAgICAgICAgID0gVFR5cGUuU0VUCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfTUFQXSAgICAgICAgICA9IFRUeXBlLk1BUAorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX1NUUlVDVF0gICAgICAgPSBUVHlwZS5TVFJVQ1QKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZXNldExhc3RGaWVsZCgpCisgIHNlbGYubGFzdEZpZWxkID0ge30KKyAgc2VsZi5sYXN0RmllbGRJZCA9IDAKKyAgc2VsZi5sYXN0RmllbGRJbmRleCA9IDEKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnBhY2tDb21wYWN0VHlwZShrdHlwZSwgdnR5cGUpCisgIHJldHVybiBsaWJsdWFiaXR3aXNlLmJvcihsaWJsdWFiaXR3aXNlLnNoaWZ0bChrdHlwZSwgNCksIHZ0eXBlKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgdHR5cGUsIHNlcWlkKQorICBzZWxmOndyaXRlQnl0ZShUQ29tcGFjdFByb3RvY29sLkNPTVBBQ1RfUFJPVE9DT0xfSUQpCisgIHNlbGY6d3JpdGVCeXRlKGxpYmx1YWJwYWNrLnBhY2tNZXNnVHlwZShUQ29tcGFjdFByb3RvY29sLkNPTVBBQ1RfVkVSU0lPTiwKKyAgICBUQ29tcGFjdFByb3RvY29sLkNPTVBBQ1RfVkVSU0lPTl9NQVNLLHR0eXBlLAorICAgIFRDb21wYWN0UHJvdG9jb2wuQ09NUEFDVF9UWVBFX1NISUZUX0FNT1VOVCwKKyAgICBUQ29tcGFjdFByb3RvY29sLkNPTVBBQ1RfVFlQRV9NQVNLKSkKKyAgc2VsZjp3cml0ZVZhcmludDMyKHNlcWlkKQorICBzZWxmOndyaXRlU3RyaW5nKG5hbWUpCisgIHNlbGY6cmVzZXRMYXN0RmllbGQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVNZXNzYWdlRW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlU3RydWN0QmVnaW4obmFtZSkKKyAgc2VsZi5sYXN0RmllbGRJbmRleCA9IHNlbGYubGFzdEZpZWxkSW5kZXggKyAxCisgIHNlbGYubGFzdEZpZWxkW3NlbGYubGFzdEZpZWxkSW5kZXhdID0gc2VsZi5sYXN0RmllbGRJZAorICBzZWxmLmxhc3RGaWVsZElkID0gMAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVTdHJ1Y3RFbmQoKQorICBzZWxmLmxhc3RGaWVsZEluZGV4ID0gc2VsZi5sYXN0RmllbGRJbmRleCAtIDEKKyAgc2VsZi5sYXN0RmllbGRJZCA9IHNlbGYubGFzdEZpZWxkW3NlbGYubGFzdEZpZWxkSW5kZXhdCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUZpZWxkQmVnaW4obmFtZSwgdHR5cGUsIGlkKQorICBpZiB0dHlwZSA9PSBUVHlwZS5CT09MIHRoZW4KKyAgICBzZWxmLmJvb2xlYW5GaWVsZE5hbWUgPSBuYW1lCisgICAgc2VsZi5ib29sZWFuRmllbGRJZCAgID0gaWQKKyAgICBzZWxmLmJvb2xlYW5GaWVsZFBlbmRpbmcgPSB0cnVlCisgIGVsc2UKKyAgICBzZWxmOndyaXRlRmllbGRCZWdpbkludGVybmFsKG5hbWUsIHR0eXBlLCBpZCwgLTEpCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVGaWVsZEVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUZpZWxkU3RvcCgpCisgIHNlbGY6d3JpdGVCeXRlKFRUeXBlLlNUT1ApOworZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVNYXBCZWdpbihrdHlwZSwgdnR5cGUsIHNpemUpCisgIGlmIHNpemUgPT0gMCB0aGVuCisgICAgc2VsZjp3cml0ZUJ5dGUoMCkKKyAgZWxzZQorICAgIHNlbGY6d3JpdGVWYXJpbnQzMihzaXplKQorICAgIHNlbGY6d3JpdGVCeXRlKHNlbGY6cGFja0NvbXBhY3RUeXBlKFRUeXBlVG9Db21wYWN0VHlwZVtrdHlwZV0sIFRUeXBlVG9Db21wYWN0VHlwZVt2dHlwZV0pKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlTWFwRW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlTGlzdEJlZ2luKGV0eXBlLCBzaXplKQorICBzZWxmOndyaXRlQ29sbGVjdGlvbkJlZ2luKGV0eXBlLCBzaXplKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVMaXN0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlU2V0QmVnaW4oZXR5cGUsIHNpemUpCisgIHNlbGY6d3JpdGVDb2xsZWN0aW9uQmVnaW4oZXR5cGUsIHNpemUpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZVNldEVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUJvb2woYm9vbCkKKyAgbG9jYWwgdmFsdWUgPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9CT09MRUFOX0ZBTFNFCisgIGlmIGJvb2wgdGhlbgorICAgIHZhbHVlID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfQk9PTEVBTl9UUlVFCisgIGVuZAorICBwcmludCh2YWx1ZSxzZWxmLmJvb2xlYW5GaWVsZFBlbmRpbmcsc2VsZi5ib29sZWFuRmllbGRJZCkKKyAgaWYgc2VsZi5ib29sZWFuRmllbGRQZW5kaW5nIHRoZW4KKyAgICBzZWxmOndyaXRlRmllbGRCZWdpbkludGVybmFsKHNlbGYuYm9vbGVhbkZpZWxkTmFtZSwgVFR5cGUuQk9PTCwgc2VsZi5ib29sZWFuRmllbGRJZCwgdmFsdWUpCisgICAgc2VsZi5ib29sZWFuRmllbGRQZW5kaW5nID0gZmFsc2UKKyAgZWxzZQorICAgIHNlbGY6d3JpdGVCeXRlKHZhbHVlKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlQnl0ZShieXRlKQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ2MnLCBieXRlKQorICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUkxNihpMTYpCisgIHNlbGY6d3JpdGVWYXJpbnQzMihsaWJsdWFicGFjay5pMzJUb1ppZ3phZyhpMTYpKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVJMzIoaTMyKQorICBzZWxmOndyaXRlVmFyaW50MzIobGlibHVhYnBhY2suaTMyVG9aaWd6YWcoaTMyKSkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlSTY0KGk2NCkKKyAgc2VsZjp3cml0ZVZhcmludDY0KGxpYmx1YWJwYWNrLmk2NFRvWmlnemFnKGk2NCkpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZURvdWJsZShkdWIpCisgIGxvY2FsIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnZCcsIGR1YikKKyAgc2VsZi50cmFuczp3cml0ZShidWZmKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVTdHJpbmcoc3RyKQorICAtLSBTaG91bGQgYmUgdXRmLTgKKyAgc2VsZjp3cml0ZUJpbmFyeShzdHIpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUJpbmFyeShzdHIpCisgIC0tIFNob3VsZCBiZSB1dGYtOAorICBzZWxmOndyaXRlVmFyaW50MzIoc3RyaW5nLmxlbihzdHIpKQorICBzZWxmLnRyYW5zOndyaXRlKHN0cikKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlRmllbGRCZWdpbkludGVybmFsKG5hbWUsIHR0eXBlLCBpZCwgdHlwZU92ZXJyaWRlKQorICBpZiB0eXBlT3ZlcnJpZGUgPT0gLTEgdGhlbgorICAgIHR5cGVPdmVycmlkZSA9IFRUeXBlVG9Db21wYWN0VHlwZVt0dHlwZV0KKyAgZW5kCisgIGxvY2FsIG9mZnNldCA9IGlkIC0gc2VsZi5sYXN0RmllbGRJZAorICBpZiBpZCA+IHNlbGYubGFzdEZpZWxkSWQgYW5kIG9mZnNldCA8PSAxNSB0aGVuCisgICAgc2VsZjp3cml0ZUJ5dGUobGlibHVhYml0d2lzZS5ib3IobGlibHVhYml0d2lzZS5zaGlmdGwob2Zmc2V0LCA0KSwgdHlwZU92ZXJyaWRlKSkKKyAgZWxzZQorICAgIHNlbGY6d3JpdGVCeXRlKHR5cGVPdmVycmlkZSkKKyAgICBzZWxmOndyaXRlSTE2KGlkKQorICBlbmQKKyAgc2VsZi5sYXN0RmllbGRJZCA9IGlkCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUNvbGxlY3Rpb25CZWdpbihldHlwZSwgc2l6ZSkKKyAgaWYgc2l6ZSA8PSAxNCB0aGVuCisgICAgc2VsZjp3cml0ZUJ5dGUobGlibHVhYml0d2lzZS5ib3IobGlibHVhYml0d2lzZS5zaGlmdGwoc2l6ZSwgNCksIFRUeXBlVG9Db21wYWN0VHlwZVtldHlwZV0pKQorICBlbHNlCisgICAgc2VsZjp3cml0ZUJ5dGUobGlibHVhYml0d2lzZS5ib3IoMHhmMCwgVFR5cGVUb0NvbXBhY3RUeXBlW2V0eXBlXSkpCisgICAgc2VsZjp3cml0ZVZhcmludDMyKHNpemUpCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVWYXJpbnQzMihpMzIpCisgIC0tIFNob3VsZCBiZSB1dGYtOAorICBsb2NhbCBzdHIgPSBsaWJsdWFicGFjay50b1ZhcmludDMyKGkzMikKKyAgc2VsZi50cmFuczp3cml0ZShzdHIpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZVZhcmludDY0KGk2NCkKKyAgLS0gU2hvdWxkIGJlIHV0Zi04CisgIGxvY2FsIHN0ciA9IGxpYmx1YWJwYWNrLnRvVmFyaW50NjQoaTY0KQorICBzZWxmLnRyYW5zOndyaXRlKHN0cikKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRNZXNzYWdlQmVnaW4oKQorICBsb2NhbCBwcm90b2NvbElkID0gc2VsZjpyZWFkU2lnbkJ5dGUoKQorICBpZiBwcm90b2NvbElkIH49IHNlbGYuQ09NUEFDVF9QUk9UT0NPTF9JRCB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7CisgICAgICBtZXNzYWdlID0gIkV4cGVjdGVkIHByb3RvY29sIGlkICIgLi4gc2VsZi5DT01QQUNUX1BST1RPQ09MX0lEIC4uICIgYnV0IGdvdCAiIC4uIHByb3RvY29sSWR9KQorICBlbmQKKyAgbG9jYWwgdmVyc2lvbkFuZFR5cGUgPSBzZWxmOnJlYWRTaWduQnl0ZSgpCisgIGxvY2FsIHZlcnNpb24gPSBsaWJsdWFiaXR3aXNlLmJhbmQodmVyc2lvbkFuZFR5cGUsIHNlbGYuQ09NUEFDVF9WRVJTSU9OX01BU0spCisgIGxvY2FsIHR0eXBlID0gbGlibHVhYml0d2lzZS5iYW5kKGxpYmx1YWJpdHdpc2Uuc2hpZnRyKHZlcnNpb25BbmRUeXBlLAorICAgIHNlbGYuQ09NUEFDVF9UWVBFX1NISUZUX0FNT1VOVCksIHNlbGYuQ09NUEFDVF9UWVBFX0JJVFMpCisgIGlmIHZlcnNpb24gfj0gc2VsZi5DT01QQUNUX1ZFUlNJT04gdGhlbgorICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3eworICAgICAgbWVzc2FnZSA9ICJFeHBlY3RlZCB2ZXJzaW9uICIgLi4gc2VsZi5DT01QQUNUX1ZFUlNJT04gLi4gIiBidXQgZ290ICIgLi4gdmVyc2lvbn0pCisgIGVuZAorICBsb2NhbCBzZXFpZCA9IHNlbGY6cmVhZFZhcmludDMyKCkKKyAgbG9jYWwgbmFtZSA9IHNlbGY6cmVhZFN0cmluZygpCisgIHJldHVybiBuYW1lLCB0dHlwZSwgc2VxaWQKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRNZXNzYWdlRW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRTdHJ1Y3RCZWdpbigpCisgIHNlbGYubGFzdEZpZWxkW3NlbGYubGFzdEZpZWxkSW5kZXhdID0gc2VsZi5sYXN0RmllbGRJZAorICBzZWxmLmxhc3RGaWVsZEluZGV4ID0gc2VsZi5sYXN0RmllbGRJbmRleCArIDEKKyAgc2VsZi5sYXN0RmllbGRJZCA9IDAKKyAgcmV0dXJuIG5pbAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZFN0cnVjdEVuZCgpCisgIHNlbGYubGFzdEZpZWxkSW5kZXggPSBzZWxmLmxhc3RGaWVsZEluZGV4IC0gMQorICBzZWxmLmxhc3RGaWVsZElkID0gc2VsZi5sYXN0RmllbGRbc2VsZi5sYXN0RmllbGRJbmRleF0KK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRGaWVsZEJlZ2luKCkKKyAgbG9jYWwgZmllbGRfYW5kX3R0eXBlID0gc2VsZjpyZWFkU2lnbkJ5dGUoKQorICBsb2NhbCB0dHlwZSA9IHNlbGY6Z2V0VFR5cGUoZmllbGRfYW5kX3R0eXBlKQorICBpZiB0dHlwZSA9PSBUVHlwZS5TVE9QIHRoZW4KKyAgICByZXR1cm4gbmlsLCB0dHlwZSwgMAorICBlbmQKKyAgLS0gbWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSB0eXBlIGhlYWRlci4gaXQgY291bGQgY29udGFpbiBhIGZpZWxkIGlkIGRlbHRhLgorICBsb2NhbCBtb2RpZmllciA9IGxpYmx1YWJpdHdpc2Uuc2hpZnRyKGxpYmx1YWJpdHdpc2UuYmFuZChmaWVsZF9hbmRfdHR5cGUsIDB4ZjApLCA0KQorICBsb2NhbCBpZCA9IDAKKyAgaWYgbW9kaWZpZXIgPT0gMCB0aGVuCisgICAgaWQgPSBzZWxmOnJlYWRJMTYoKQorICBlbHNlCisgICAgaWQgPSBzZWxmLmxhc3RGaWVsZElkICsgbW9kaWZpZXIKKyAgZW5kCisgIGlmIHR0eXBlID09IFRUeXBlLkJPT0wgdGhlbgorICAgIGJvb2xWYWx1ZSA9IGxpYmx1YWJpdHdpc2UuYmFuZChmaWVsZF9hbmRfdHR5cGUsIDB4MGYpID09IFRDb21wYWN0VHlwZS5DT01QQUNUX0JPT0xFQU5fVFJVRQorICAgIGJvb2xWYWx1ZUlzTm90TnVsbCA9IHRydWUKKyAgZW5kCisgIHNlbGYubGFzdEZpZWxkSWQgPSBpZAorICByZXR1cm4gbmlsLCB0dHlwZSwgaWQKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRGaWVsZEVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkTWFwQmVnaW4oKQorICBsb2NhbCBzaXplID0gc2VsZjpyZWFkVmFyaW50MzIoKQorICBpZiBzaXplIDwgMCB0aGVuCisgICAgcmV0dXJuIG5pbCxuaWwsbmlsCisgIGVuZAorICBsb2NhbCBrdnR5cGUgPSBzZWxmOnJlYWRTaWduQnl0ZSgpCisgIGxvY2FsIGt0eXBlID0gc2VsZjpnZXRUVHlwZShsaWJsdWFiaXR3aXNlLnNoaWZ0cihrdnR5cGUsIDQpKQorICBsb2NhbCB2dHlwZSA9IHNlbGY6Z2V0VFR5cGUoa3Z0eXBlKQorICByZXR1cm4ga3R5cGUsIHZ0eXBlLCBzaXplCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkTWFwRW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRMaXN0QmVnaW4oKQorICBsb2NhbCBzaXplX2FuZF90eXBlID0gc2VsZjpyZWFkU2lnbkJ5dGUoKQorICBsb2NhbCBzaXplID0gbGlibHVhYml0d2lzZS5iYW5kKGxpYmx1YWJpdHdpc2Uuc2hpZnRyKHNpemVfYW5kX3R5cGUsIDQpLCAweDBmKQorICBpZiBzaXplID09IDE1IHRoZW4KKyAgICBzaXplID0gc2VsZjpyZWFkVmFyaW50MzIoKQorICBlbmQKKyAgaWYgc2l6ZSA8IDAgdGhlbgorICAgIHJldHVybiBuaWwsbmlsCisgIGVuZAorICBsb2NhbCBldHlwZSA9IHNlbGY6Z2V0VFR5cGUobGlibHVhYml0d2lzZS5iYW5kKHNpemVfYW5kX3R5cGUsIDB4MGYpKQorICByZXR1cm4gZXR5cGUsIHNpemUKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRMaXN0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRTZXRCZWdpbigpCisgIHJldHVybiBzZWxmOnJlYWRMaXN0QmVnaW4oKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZFNldEVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkQm9vbCgpCisgIGlmIGJvb2xWYWx1ZUlzTm90TnVsbCB0aGVuCisgICAgYm9vbFZhbHVlSXNOb3ROdWxsID0gdHJ1ZQorICAgIHJldHVybiBib29sVmFsdWUKKyAgZW5kCisgIGxvY2FsIHZhbCA9IHNlbGY6cmVhZFNpZ25CeXRlKCkKKyAgaWYgdmFsID09IFRDb21wYWN0VHlwZS5DT01QQUNUX0JPT0xFQU5fVFJVRSB0aGVuCisgICAgcmV0dXJuIHRydWUKKyAgZW5kCisgIHJldHVybiBmYWxzZQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZEJ5dGUoKQorICBsb2NhbCBidWZmID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2MnLCBidWZmKQorICByZXR1cm4gdmFsCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkU2lnbkJ5dGUoKQorICBsb2NhbCBidWZmID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ0MnLCBidWZmKQorICByZXR1cm4gdmFsCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkSTE2KCkKKyAgcmV0dXJuIHNlbGY6cmVhZEkzMigpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkSTMyKCkKKyAgbG9jYWwgdiA9IHNlbGY6cmVhZFZhcmludDMyKCkKKyAgbG9jYWwgdmFsdWUgPSBsaWJsdWFicGFjay56aWd6YWdUb0kzMih2KQorICByZXR1cm4gdmFsdWUKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRJNjQoKQorICBsb2NhbCB2YWx1ZSA9IHNlbGY6cmVhZFZhcmludDY0KCkKKyAgcmV0dXJuIHZhbHVlCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkRG91YmxlKCkKKyAgbG9jYWwgYnVmZiA9IHNlbGYudHJhbnM6cmVhZEFsbCg4KQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdkJywgYnVmZikKKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZFN0cmluZygpCisgIHJldHVybiBzZWxmOnJlYWRCaW5hcnkoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZEJpbmFyeSgpCisgIGxvY2FsIHNpemUgPSBzZWxmOnJlYWRWYXJpbnQzMigpCisgIGlmIHNpemUgPD0gMCB0aGVuCisgICAgcmV0dXJuICIiCisgIGVuZAorICByZXR1cm4gc2VsZi50cmFuczpyZWFkQWxsKHNpemUpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkVmFyaW50MzIoKQorICBsb2NhbCBzaGlmdGwgPSAwCisgIGxvY2FsIHJlc3VsdCA9IDAKKyAgd2hpbGUgdHJ1ZSBkbworICAgIGIgPSBzZWxmOnJlYWRCeXRlKCkKKyAgICByZXN1bHQgPSBsaWJsdWFiaXR3aXNlLmJvcihyZXN1bHQsCisgICAgICAgICAgICAgbGlibHVhYml0d2lzZS5zaGlmdGwobGlibHVhYml0d2lzZS5iYW5kKGIsIDB4N2YpLCBzaGlmdGwpKQorICAgIGlmIGxpYmx1YWJpdHdpc2UuYmFuZChiLCAweDgwKSB+PSAweDgwIHRoZW4KKyAgICAgIGJyZWFrCisgICAgZW5kCisgICAgc2hpZnRsID0gc2hpZnRsICsgNworICBlbmQKKyAgcmV0dXJuIHJlc3VsdAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZFZhcmludDY0KCkKKyAgbG9jYWwgcmVzdWx0ID0gbGlibHVhbG9uZ251bWJlci5uZXcKKyAgbG9jYWwgZGF0YSA9IHJlc3VsdCgwKQorICBsb2NhbCBzaGlmdGwgPSAwCisgIHdoaWxlIHRydWUgZG8KKyAgICBiID0gc2VsZjpyZWFkQnl0ZSgpCisgICAgZW5kRmxhZywgZGF0YSA9IGxpYmx1YWJwYWNrLmZyb21WYXJpbnQ2NChiLCBzaGlmdGwsIGRhdGEpCisgICAgc2hpZnRsID0gc2hpZnRsICsgNworICAgIGlmIGVuZEZsYWcgPT0gMCB0aGVuCisgICAgICBicmVhaworICAgIGVuZAorICBlbmQKKyAgcmV0dXJuIGRhdGEKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOmdldFRUeXBlKGN0eXBlKQorICByZXR1cm4gQ29tcGFjdFR5cGVUb1RUeXBlW2xpYmx1YWJpdHdpc2UuYmFuZChjdHlwZSwgMHgwZildCitlbmQKKworVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgPSBUUHJvdG9jb2xGYWN0b3J5Om5ld3sKKyAgX190eXBlID0gJ1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5JywKK30KKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEZhY3Rvcnk6Z2V0UHJvdG9jb2wodHJhbnMpCisgIC0tIFRPRE8gRW5mb3JjZSB0aGF0IHRoaXMgbXVzdCBiZSBhIHRyYW5zcG9ydCBjbGFzcyAoaWUgbm90IGEgYm9vbCkKKyAgaWYgbm90IHRyYW5zIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3sKKyAgICAgIG1lc3NhZ2UgPSAnTXVzdCBzdXBwbHkgYSB0cmFuc3BvcnQgdG8gJyAuLiB0dHlwZShzZWxmKQorICAgIH0pCisgIGVuZAorICByZXR1cm4gVENvbXBhY3RQcm90b2NvbDpuZXd7CisgICAgdHJhbnMgPSB0cmFucworICB9CitlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVEZyYW1lZFRyYW5zcG9ydC5sdWEgYi9saWIvbHVhL1RGcmFtZWRUcmFuc3BvcnQubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OGUyZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL1RGcmFtZWRUcmFuc3BvcnQubHVhCkBAIC0wLDAgKzEsMTE4IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworcmVxdWlyZSAnVFRyYW5zcG9ydCcKK3JlcXVpcmUgJ2xpYmx1YWJwYWNrJworCitURnJhbWVkVHJhbnNwb3J0ID0gVFRyYW5zcG9ydEJhc2U6bmV3eworICBfX3R5cGUgPSAnVEZyYW1lZFRyYW5zcG9ydCcsCisgIGRvUmVhZCA9IHRydWUsCisgIGRvV3JpdGUgPSB0cnVlLAorICB3QnVmID0gJycsCisgIHJCdWYgPSAnJworfQorCitmdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0Om5ldyhvYmopCisgIGlmIHR0eXBlKG9iaikgfj0gJ3RhYmxlJyB0aGVuCisgICAgZXJyb3IodHR5cGUoc2VsZikgLi4gJ211c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIHRhYmxlJykKKyAgZW5kCisKKyAgLS0gRW5zdXJlIGEgdHJhbnNwb3J0IGlzIHByb3ZpZGVkCisgIGlmIG5vdCBvYmoudHJhbnMgdGhlbgorICAgIGVycm9yKCdZb3UgbXVzdCBwcm92aWRlICcgLi4gdHR5cGUoc2VsZikgLi4gJyB3aXRoIGEgdHJhbnMnKQorICBlbmQKKworICByZXR1cm4gVFRyYW5zcG9ydEJhc2UubmV3KHNlbGYsIG9iaikKK2VuZAorCitmdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0OmlzT3BlbigpCisgIHJldHVybiBzZWxmLnRyYW5zOmlzT3BlbigpCitlbmQKKworZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydDpvcGVuKCkKKyAgcmV0dXJuIHNlbGYudHJhbnM6b3BlbigpCitlbmQKKworZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydDpjbG9zZSgpCisgIHJldHVybiBzZWxmLnRyYW5zOmNsb3NlKCkKK2VuZAorCitmdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0OnJlYWQobGVuKQorICBpZiBzdHJpbmcubGVuKHNlbGYuckJ1ZikgPT0gMCB0aGVuCisgICAgc2VsZjpfX3JlYWRGcmFtZSgpCisgIGVuZAorCisgIGlmIHNlbGYuZG9SZWFkID09IGZhbHNlIHRoZW4KKyAgICByZXR1cm4gc2VsZi50cmFuczpyZWFkKGxlbikKKyAgZW5kCisKKyAgaWYgbGVuID4gc3RyaW5nLmxlbihzZWxmLnJCdWYpIHRoZW4KKyAgICBsb2NhbCB2YWwgPSBzZWxmLnJCdWYKKyAgICBzZWxmLnJCdWYgPSAnJworICAgIHJldHVybiB2YWwKKyAgZW5kCisKKyAgbG9jYWwgdmFsID0gc3RyaW5nLnN1YihzZWxmLnJCdWYsIDAsIGxlbikKKyAgc2VsZi5yQnVmID0gc3RyaW5nLnN1YihzZWxmLnJCdWYsIGxlbisxKQorICByZXR1cm4gdmFsCitlbmQKKworZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydDpfX3JlYWRGcmFtZSgpCisgIGxvY2FsIGJ1ZiA9IHNlbGYudHJhbnM6cmVhZEFsbCg0KQorICBsb2NhbCBmcmFtZV9sZW4gPSBsaWJsdWFicGFjay5idW5wYWNrKCdpJywgYnVmKQorICBzZWxmLnJCdWYgPSBzZWxmLnRyYW5zOnJlYWRBbGwoZnJhbWVfbGVuKQorZW5kCisKKworZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydDp3cml0ZShidWYsIGxlbikKKyAgaWYgc2VsZi5kb1dyaXRlID09IGZhbHNlIHRoZW4KKyAgICByZXR1cm4gc2VsZi50cmFuczp3cml0ZShidWYsIGxlbikKKyAgZW5kCisKKyAgaWYgbGVuIGFuZCBsZW4gPCBzdHJpbmcubGVuKGJ1ZikgdGhlbgorICAgIGJ1ZiA9IHN0cmluZy5zdWIoYnVmLCAwLCBsZW4pCisgIGVuZAorICBzZWxmLndCdWYgPSBzZWxmLndCdWYgLi4gYnVmCitlbmQKKworZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydDpmbHVzaCgpCisgIGlmIHNlbGYuZG9Xcml0ZSA9PSBmYWxzZSB0aGVuCisgICAgcmV0dXJuIHNlbGYudHJhbnM6Zmx1c2goKQorICBlbmQKKworICAtLSBJZiB0aGUgd3JpdGUgZmFpbHMgd2Ugc3RpbGwgd2FudCB3QnVmIHRvIGJlIGNsZWFyCisgIGxvY2FsIHRtcCA9IHNlbGYud0J1ZgorICBzZWxmLndCdWYgPSAnJworICBsb2NhbCBmcmFtZV9sZW5fYnVmID0gbGlibHVhYnBhY2suYnBhY2soImkiLCBzdHJpbmcubGVuKHRtcCkpCisgIHRtcCA9IGZyYW1lX2xlbl9idWYgLi4gdG1wCisgIHNlbGYudHJhbnM6d3JpdGUodG1wKQorICBzZWxmLnRyYW5zOmZsdXNoKCkKK2VuZAorCitURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSA9IFRUcmFuc3BvcnRGYWN0b3J5QmFzZTpuZXd7CisgIF9fdHlwZSA9ICdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeScKK30KK2Z1bmN0aW9uIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5OmdldFRyYW5zcG9ydCh0cmFucykKKyAgaWYgbm90IHRyYW5zIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3sKKyAgICAgIG1lc3NhZ2UgPSAnTXVzdCBzdXBwbHkgYSB0cmFuc3BvcnQgdG8gJyAuLiB0dHlwZShzZWxmKQorICAgIH0pCisgIGVuZAorICByZXR1cm4gVEZyYW1lZFRyYW5zcG9ydDpuZXd7dHJhbnMgPSB0cmFuc30KK2VuZApkaWZmIC0tZ2l0IGEvbGliL2x1YS9USHR0cFRyYW5zcG9ydC5sdWEgYi9saWIvbHVhL1RIdHRwVHJhbnNwb3J0Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTUxZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9USHR0cFRyYW5zcG9ydC5sdWEKQEAgLTAsMCArMSwxODIgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUVHJhbnNwb3J0JworCitUSHR0cFRyYW5zcG9ydCA9IFRUcmFuc3BvcnRCYXNlOm5ld3sKKyAgX190eXBlID0gJ1RIdHRwVHJhbnNwb3J0JywKKyAgcGF0aCA9ICcvJywKKyAgd0J1ZiA9ICcnLAorICByQnVmID0gJycsCisgIENSTEYgPSAnXHJcbicsCisgIFZFUlNJT04gPSB2ZXJzaW9uLAorICBpc1NlcnZlciA9IHRydWUKK30KKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6bmV3KG9iaikKKyAgaWYgdHR5cGUob2JqKSB+PSAndGFibGUnIHRoZW4KKyAgICBlcnJvcih0dHlwZShzZWxmKSAuLiAnbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGEgdGFibGUnKQorICBlbmQKKworICAtLSBFbnN1cmUgYSB0cmFuc3BvcnQgaXMgcHJvdmlkZWQKKyAgaWYgbm90IG9iai50cmFucyB0aGVuCisgICAgZXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgJyAuLiB0dHlwZShzZWxmKSAuLiAnIHdpdGggYSB0cmFucycpCisgIGVuZAorCisgIHJldHVybiBUVHJhbnNwb3J0QmFzZS5uZXcoc2VsZiwgb2JqKQorZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0OmlzT3BlbigpCisgIHJldHVybiBzZWxmLnRyYW5zOmlzT3BlbigpCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6b3BlbigpCisgIHJldHVybiBzZWxmLnRyYW5zOm9wZW4oKQorZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0OmNsb3NlKCkKKyAgcmV0dXJuIHNlbGYudHJhbnM6Y2xvc2UoKQorZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0OnJlYWRBbGwobGVuKQorICByZXR1cm4gc2VsZjpyZWFkKGxlbikKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDpyZWFkKGxlbikKKyAgaWYgc3RyaW5nLmxlbihzZWxmLnJCdWYpID09IDAgdGhlbgorICAgIHNlbGY6X3JlYWRNc2coKQorICBlbmQKKyAgaWYgbGVuID4gc3RyaW5nLmxlbihzZWxmLnJCdWYpIHRoZW4KKyAgICBsb2NhbCB2YWwgPSBzZWxmLnJCdWYKKyAgICBzZWxmLnJCdWYgPSAnJworICAgIHJldHVybiB2YWwKKyAgZW5kCisKKyAgbG9jYWwgdmFsID0gc3RyaW5nLnN1YihzZWxmLnJCdWYsIDAsIGxlbikKKyAgc2VsZi5yQnVmID0gc3RyaW5nLnN1YihzZWxmLnJCdWYsIGxlbisxKQorICByZXR1cm4gdmFsCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6X3JlYWRNc2coKQorICB3aGlsZSB0cnVlIGRvCisgICAgc2VsZi5yQnVmID0gc2VsZi5yQnVmIC4uIHNlbGYudHJhbnM6cmVhZCg0KQorICAgIGlmIHN0cmluZy5maW5kKHNlbGYuckJ1Ziwgc2VsZi5DUkxGIC4uIHNlbGYuQ1JMRikgdGhlbgorICAgICAgYnJlYWsKKyAgICBlbmQKKyAgZW5kCisgIGlmIG5vdCBzZWxmLnJCdWYgdGhlbgorICAgIHNlbGYuckJ1ZiA9ICIiCisgICAgcmV0dXJuCisgIGVuZAorICBzZWxmOmdldExpbmUoKQorICBsb2NhbCBoZWFkZXJzID0gc2VsZjpfcGFyc2VIZWFkZXJzKCkKKyAgaWYgbm90IGhlYWRlcnMgdGhlbgorICAgIHNlbGYuckJ1ZiA9ICIiCisgICAgcmV0dXJuCisgIGVuZAorCisgIGxvY2FsIGxlbmd0aCA9IHRvbnVtYmVyKGhlYWRlcnNbIkNvbnRlbnQtTGVuZ3RoIl0pCisgIGlmIGxlbmd0aCB0aGVuCisgICAgbGVuZ3RoID0gbGVuZ3RoIC0gc3RyaW5nLmxlbihzZWxmLnJCdWYpCisgICAgc2VsZi5yQnVmID0gc2VsZi5yQnVmIC4uIHNlbGYudHJhbnM6cmVhZEFsbChsZW5ndGgpCisgIGVuZAorICBpZiBzZWxmLnJCdWYgPT0gbmlsIHRoZW4KKyAgICBzZWxmLnJCdWYgPSAiIgorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDpnZXRMaW5lKCkKKyAgbG9jYWwgYSxiID0gc3RyaW5nLmZpbmQoc2VsZi5yQnVmLCBzZWxmLkNSTEYpCisgIGxvY2FsIGxpbmUgPSAiIgorICBpZiBhIGFuZCBiIHRoZW4KKyAgICBsaW5lID0gc3RyaW5nLnN1YihzZWxmLnJCdWYsIDAsIGEtMSkKKyAgICBzZWxmLnJCdWYgPSBzdHJpbmcuc3ViKHNlbGYuckJ1ZiwgYisxKQorICBlbmQKKyAgcmV0dXJuIGxpbmUKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDpfcGFyc2VIZWFkZXJzKCkKKyAgbG9jYWwgaGVhZGVycyA9IHt9CisKKyAgcmVwZWF0CisgICAgbG9jYWwgbGluZSA9IHNlbGY6Z2V0TGluZSgpCisgICAgZm9yIGtleSwgdmFsIGluIHN0cmluZy5nbWF0Y2gobGluZSwgIihbJXclLV0rKSVzKjolcyooLispIikgZG8KKyAgICAgIGlmIGhlYWRlcnNba2V5XSB0aGVuCisgICAgICAgIGxvY2FsIGRlbGltaXRlciA9ICIsICIKKyAgICAgICAgaWYga2V5ID09ICJTZXQtQ29va2llIiB0aGVuCisgICAgICAgICAgZGVsaW1pdGVyID0gIjsgIgorICAgICAgICBlbmQKKyAgICAgICAgaGVhZGVyc1trZXldID0gaGVhZGVyc1trZXldIC4uIGRlbGltaXRlciAuLiB0b3N0cmluZyh2YWwpCisgICAgICBlbHNlCisgICAgICAgIGhlYWRlcnNba2V5XSA9IHRvc3RyaW5nKHZhbCkKKyAgICAgIGVuZAorICAgIGVuZAorICB1bnRpbCBzdHJpbmcuZmluZChsaW5lLCAiXiVzKiQiKQorCisgIHJldHVybiBoZWFkZXJzCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6d3JpdGUoYnVmLCBsZW4pCisgIGlmIGxlbiBhbmQgbGVuIDwgc3RyaW5nLmxlbihidWYpIHRoZW4KKyAgICBidWYgPSBzdHJpbmcuc3ViKGJ1ZiwgMCwgbGVuKQorICBlbmQKKyAgc2VsZi53QnVmID0gc2VsZi53QnVmIC4uIGJ1ZgorZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0OndyaXRlSHR0cEhlYWRlcihjb250ZW50X2xlbikKKyAgaWYgc2VsZi5pc1NlcnZlciB0aGVuCisgICAgbG9jYWwgaGVhZGVyID0gICJIVFRQLzEuMSAyMDAgT0siIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIlNlcnZlcjogVGhyaWZ0LyIgLi4gc2VsZi5WRVJTSU9OIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKiIgLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCIgLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQ29udGVudC1MZW5ndGg6ICIgLi4gY29udGVudF9sZW4gLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQ29ubmVjdGlvbjogS2VlcC1BbGl2ZSIgLi4gc2VsZi5DUkxGIC4uIHNlbGYuQ1JMRgorICAgIHNlbGYudHJhbnM6d3JpdGUoaGVhZGVyKQorICBlbHNlCisgICAgbG9jYWwgaGVhZGVyID0gIlBPU1QgIiAuLiBzZWxmLnBhdGggLi4gIiBIVFRQLzEuMSIgLi4gc2VsZi5DUkxGCisgICAgICAuLiAiSG9zdDogIiAuLiBzZWxmLnRyYW5zLmhvc3QgLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCIgLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQ29udGVudC1MZW5ndGg6ICIgLi4gY29udGVudF9sZW4gLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQWNjZXB0OiBhcHBsaWNhdGlvbi94LXRocmlmdCAiIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIlVzZXItQWdlbnQ6IFRocmlmdC8iIC4uIHNlbGYuVkVSU0lPTiAuLiAiIChMdWEvVEh0dHBDbGllbnQpIgorICAgICAgLi4gc2VsZi5DUkxGIC4uIHNlbGYuQ1JMRgorICAgIHNlbGYudHJhbnM6d3JpdGUoaGVhZGVyKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDpmbHVzaCgpCisgIC0tIElmIHRoZSB3cml0ZSBmYWlscyB3ZSBzdGlsbCB3YW50IHdCdWYgdG8gYmUgY2xlYXIKKyAgbG9jYWwgdG1wID0gc2VsZi53QnVmCisgIHNlbGYud0J1ZiA9ICcnCisgIHNlbGY6d3JpdGVIdHRwSGVhZGVyKHN0cmluZy5sZW4odG1wKSkKKyAgc2VsZi50cmFuczp3cml0ZSh0bXApCisgIHNlbGYudHJhbnM6Zmx1c2goKQorZW5kCisKK1RIdHRwVHJhbnNwb3J0RmFjdG9yeSA9IFRUcmFuc3BvcnRGYWN0b3J5QmFzZTpuZXd7CisgIF9fdHlwZSA9ICdUSHR0cFRyYW5zcG9ydEZhY3RvcnknCit9CitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydEZhY3Rvcnk6Z2V0VHJhbnNwb3J0KHRyYW5zKQorICBpZiBub3QgdHJhbnMgdGhlbgorICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3eworICAgICAgbWVzc2FnZSA9ICdNdXN0IHN1cHBseSBhIHRyYW5zcG9ydCB0byAnIC4uIHR0eXBlKHNlbGYpCisgICAgfSkKKyAgZW5kCisgIHJldHVybiBUSHR0cFRyYW5zcG9ydDpuZXd7dHJhbnMgPSB0cmFuc30KK2VuZApkaWZmIC0tZ2l0IGEvbGliL2x1YS9USnNvblByb3RvY29sLmx1YSBiL2xpYi9sdWEvVEpzb25Qcm90b2NvbC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIwOGVlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvVEpzb25Qcm90b2NvbC5sdWEKQEAgLTAsMCArMSw3MjcgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKSwgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUUHJvdG9jb2wnCityZXF1aXJlICdsaWJsdWFicGFjaycKK3JlcXVpcmUgJ2xpYmx1YWJpdHdpc2UnCisKK1RKU09OUHJvdG9jb2wgPSBfX1RPYmplY3QubmV3KFRQcm90b2NvbEJhc2UsIHsKKyAgX190eXBlID0gJ1RKU09OUHJvdG9jb2wnLAorICBUSFJJRlRfSlNPTl9QUk9UT0NPTF9WRVJTSU9OID0gMSwKKyAganNvbkNvbnRleHQgPSB7fSwKKyAganNvbkNvbnRleHRWYWwgPSB7Zmlyc3QgPSB0cnVlLCBjb2xvbiA9IHRydWUsIHR0eXBlID0gMiwgbnVsbCA9IHRydWV9LAorICBqc29uQ29udGV4dEluZGV4ID0gMSwKKyAgaGFzUmVhZEJ5dGUgPSAiIgorfSkKKworVFR5cGVUb1N0cmluZyA9IHt9CitUVHlwZVRvU3RyaW5nW1RUeXBlLkJPT0xdICAgPSAidGYiCitUVHlwZVRvU3RyaW5nW1RUeXBlLkJZVEVdICAgPSAiaTgiCitUVHlwZVRvU3RyaW5nW1RUeXBlLkkxNl0gICAgPSAiaTE2IgorVFR5cGVUb1N0cmluZ1tUVHlwZS5JMzJdICAgID0gImkzMiIKK1RUeXBlVG9TdHJpbmdbVFR5cGUuSTY0XSAgICA9ICJpNjQiCitUVHlwZVRvU3RyaW5nW1RUeXBlLkRPVUJMRV0gPSAiZGJsIgorVFR5cGVUb1N0cmluZ1tUVHlwZS5TVFJJTkddID0gInN0ciIKK1RUeXBlVG9TdHJpbmdbVFR5cGUuU1RSVUNUXSA9ICJyZWMiCitUVHlwZVRvU3RyaW5nW1RUeXBlLkxJU1RdICAgPSAibHN0IgorVFR5cGVUb1N0cmluZ1tUVHlwZS5TRVRdICAgID0gInNldCIKK1RUeXBlVG9TdHJpbmdbVFR5cGUuTUFQXSAgICA9ICJtYXAiCisKK1N0cmluZ1RvVFR5cGUgPSB7CisgIHRmICA9IFRUeXBlLkJPT0wsCisgIGk4ICA9IFRUeXBlLkJZVEUsCisgIGkxNiA9IFRUeXBlLkkxNiwKKyAgaTMyID0gVFR5cGUuSTMyLAorICBpNjQgPSBUVHlwZS5JNjQsCisgIGRibCA9IFRUeXBlLkRPVUJMRSwKKyAgc3RyID0gVFR5cGUuU1RSSU5HLAorICByZWMgPSBUVHlwZS5TVFJVQ1QsCisgIG1hcCA9IFRUeXBlLk1BUCwKKyAgc2V0ID0gVFR5cGUuU0VULAorICBsc3QgPSBUVHlwZS5MSVNUCit9CisKK0pTT05Ob2RlID0geworICBPYmplY3RCZWdpbiA9ICd7JywKKyAgT2JqZWN0RW5kID0gJ30nLAorICBBcnJheUJlZ2luID0gJ1snLAorICBBcnJheUVuZCA9ICddJywKKyAgUGFpclNlcGFyYXRvciA9ICc6JywKKyAgRWxlbVNlcGFyYXRvciA9ICcsJywKKyAgQmFja3NsYXNoID0gJ1xcJywKKyAgU3RyaW5nRGVsaW1pdGVyID0gJyInLAorICBaZXJvQ2hhciA9ICcwJywKKyAgRXNjYXBlQ2hhciA9ICd1JywKKyAgTmFuID0gJ05hTicsCisgIEluZmluaXR5ID0gJ0luZmluaXR5JywKKyAgTmVnYXRpdmVJbmZpbml0eSA9ICctSW5maW5pdHknLAorICBFc2NhcGVDaGFycyA9ICJcIlxcYmZucnQiLAorICBFc2NhcGVQcmVmaXggPSAiXFx1MDAiCit9CisKK0VzY2FwZUNoYXJWYWxzID0geworICAnIicsICdcXCcsICdcYicsICdcZicsICdcbicsICdccicsICdcdCcKK30KKworSlNPTkNoYXJUYWJsZSA9IHsKKyAgLS0wICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICAgQSAgIEIgICBDICAgRCAgIEUgICBGCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDk4LDExNiwxMTAsICAwLDEwMiwxMTQsICAwLCAgMCwKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgIDEsICAxLDM0LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKK30KKworLS0gY2hhcmFjdGVyIHRhYmxlIHN0cmluZworbG9jYWwgYj0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLycKKworLS0gZW5jb2RpbmcKK2Z1bmN0aW9uIGJhc2U2NF9lbmNvZGUoZGF0YSkKKyAgICByZXR1cm4gKChkYXRhOmdzdWIoJy4nLCBmdW5jdGlvbih4KSAKKyAgICAgICAgbG9jYWwgcixiPScnLHg6Ynl0ZSgpCisgICAgICAgIGZvciBpPTgsMSwtMSBkbyByPXIuLihiJTJeaS1iJTJeKGktMSk+MCBhbmQgJzEnIG9yICcwJykgZW5kCisgICAgICAgIHJldHVybiByOworICAgIGVuZCkuLicwMDAwJyk6Z3N1YignJWQlZCVkPyVkPyVkPyVkPycsIGZ1bmN0aW9uKHgpCisgICAgICAgIGlmICgjeCA8IDYpIHRoZW4gcmV0dXJuICcnIGVuZAorICAgICAgICBsb2NhbCBjPTAKKyAgICAgICAgZm9yIGk9MSw2IGRvIGM9YysoeDpzdWIoaSxpKT09JzEnIGFuZCAyXig2LWkpIG9yIDApIGVuZAorICAgICAgICByZXR1cm4gYjpzdWIoYysxLGMrMSkKKyAgICBlbmQpLi4oeyAnJywgJz09JywgJz0nIH0pWyNkYXRhJTMrMV0pCitlbmQKKworLS0gZGVjb2RpbmcKK2Z1bmN0aW9uIGJhc2U2NF9kZWNvZGUoZGF0YSkKKyAgICBkYXRhID0gc3RyaW5nLmdzdWIoZGF0YSwgJ1teJy4uYi4uJz1dJywgJycpCisgICAgcmV0dXJuIChkYXRhOmdzdWIoJy4nLCBmdW5jdGlvbih4KQorICAgICAgICBpZiAoeCA9PSAnPScpIHRoZW4gcmV0dXJuICcnIGVuZAorICAgICAgICBsb2NhbCByLGY9JycsKGI6ZmluZCh4KS0xKQorICAgICAgICBmb3IgaT02LDEsLTEgZG8gcj1yLi4oZiUyXmktZiUyXihpLTEpPjAgYW5kICcxJyBvciAnMCcpIGVuZAorICAgICAgICByZXR1cm4gcjsKKyAgICBlbmQpOmdzdWIoJyVkJWQlZD8lZD8lZD8lZD8lZD8lZD8nLCBmdW5jdGlvbih4KQorICAgICAgICBpZiAoI3ggfj0gOCkgdGhlbiByZXR1cm4gJycgZW5kCisgICAgICAgIGxvY2FsIGM9MAorICAgICAgICBmb3IgaT0xLDggZG8gYz1jKyh4OnN1YihpLGkpPT0nMScgYW5kIDJeKDgtaSkgb3IgMCkgZW5kCisgICAgICAgIHJldHVybiBzdHJpbmcuY2hhcihjKQorICAgIGVuZCkpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZXNldENvbnRleHQoKQorICBzZWxmLmpzb25Db250ZXh0ID0ge30KKyAgc2VsZi5qc29uQ29udGV4dFZhbCA9IHtmaXJzdCA9IHRydWUsIGNvbG9uID0gdHJ1ZSwgdHR5cGUgPSAyLCBudWxsID0gdHJ1ZX0KKyAgc2VsZi5qc29uQ29udGV4dEluZGV4ID0gMQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6Y29udGV4dFB1c2goY29udGV4dCkKKyAgc2VsZi5qc29uQ29udGV4dEluZGV4ID0gc2VsZi5qc29uQ29udGV4dEluZGV4ICsgMQorICBzZWxmLmpzb25Db250ZXh0W3NlbGYuanNvbkNvbnRleHRJbmRleF0gPSBzZWxmLmpzb25Db250ZXh0VmFsCisgIHNlbGYuanNvbkNvbnRleHRWYWwgPSBjb250ZXh0CitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpjb250ZXh0UG9wKCkKKyAgc2VsZi5qc29uQ29udGV4dFZhbCA9IHNlbGYuanNvbkNvbnRleHRbc2VsZi5qc29uQ29udGV4dEluZGV4XQorICBzZWxmLmpzb25Db250ZXh0SW5kZXggPSBzZWxmLmpzb25Db250ZXh0SW5kZXggLSAxCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDplc2NhcGVOdW0oKQorICBpZiBzZWxmLmpzb25Db250ZXh0VmFsLnR0eXBlID09IDEgdGhlbgorICAgIHJldHVybiBzZWxmLmpzb25Db250ZXh0VmFsLmNvbG9uCisgIGVsc2UKKyAgICByZXR1cm4gZmFsc2UKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUVsZW1TZXBhcmF0b3IoKQorICBpZiBzZWxmLmpzb25Db250ZXh0VmFsLm51bGwgdGhlbgorICAgIHJldHVybgorICBlbmQKKyAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC5maXJzdCB0aGVuCisgICAgc2VsZi5qc29uQ29udGV4dFZhbC5maXJzdCA9IGZhbHNlCisgIGVsc2UKKyAgICBpZiBzZWxmLmpzb25Db250ZXh0VmFsLnR0eXBlID09IDEgdGhlbgorICAgICAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC5jb2xvbiB0aGVuCisgICAgICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuUGFpclNlcGFyYXRvcikKKyAgICAgICAgc2VsZi5qc29uQ29udGV4dFZhbC5jb2xvbiA9IGZhbHNlCisgICAgICBlbHNlCisgICAgICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuRWxlbVNlcGFyYXRvcikKKyAgICAgICAgc2VsZi5qc29uQ29udGV4dFZhbC5jb2xvbiA9IHRydWUKKyAgICAgIGVuZAorICAgIGVsc2UKKyAgICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuRWxlbVNlcGFyYXRvcikKKyAgICBlbmQKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpoZXhDaGFyKHZhbCkKKyAgdmFsID0gbGlibHVhYml0d2lzZS5iYW5kKHZhbCwgMHgwZikKKyAgaWYgdmFsIDwgMTAgdGhlbgorICAgIHJldHVybiB2YWwgKyA0OAorICBlbHNlCisgICAgcmV0dXJuIHZhbCArIDg3CisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVKU09ORXNjYXBlQ2hhcihjaCkKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5Fc2NhcGVQcmVmaXgpCisgIGxvY2FsIG91dENoID0gaGV4Q2hhcihsaWJsdWFiaXR3aXNlLnNoaWZ0cihjaCwgNCkpCisgIGxvY2FsIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnYycsIG91dENoKQorICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCisgIG91dENoID0gaGV4Q2hhcihjaCkKKyAgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdjJywgb3V0Q2gpCisgIHNlbGYudHJhbnM6d3JpdGUoYnVmZikKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTkNoYXIoYnl0ZSkKKyAgY2ggPSBzdHJpbmcuYnl0ZShieXRlKQorICBpZiBjaCA+PSAweDMwIHRoZW4KKyAgICBpZiBjaCA9PSBKU09OTm9kZS5CYWNrc2xhc2ggdGhlbgorICAgICAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5CYWNrc2xhc2gpCisgICAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLkJhY2tzbGFzaCkKKyAgICBlbHNlCisgICAgICBzZWxmLnRyYW5zOndyaXRlKGJ5dGUpCisgICAgZW5kCisgIGVsc2UKKyAgICBsb2NhbCBvdXRDaCA9IEpTT05DaGFyVGFibGVbY2grMV0KKyAgICBpZiBvdXRDaCA9PSAxIHRoZW4KKyAgICAgIHNlbGYudHJhbnM6d3JpdGUoYnl0ZSkKKyAgICBlbHNlaWYgb3V0Q2ggPiAxIHRoZW4KKyAgICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuQmFja3NsYXNoKQorICAgICAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdjJywgb3V0Q2gpCisgICAgICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCisgICAgZWxzZQorICAgICAgc2VsZjp3cml0ZUpTT05Fc2NhcGVDaGFyKGNoKQorICAgIGVuZAorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTlN0cmluZyhzdHIpCisgIHNlbGY6d3JpdGVFbGVtU2VwYXJhdG9yKCkKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCisgIC0tIFRPRE8gZXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycworICBsb2NhbCBsZW5ndGggPSBzdHJpbmcubGVuKHN0cikKKyAgbG9jYWwgaWkgPSAxCisgIHdoaWxlIGlpIDw9IGxlbmd0aCBkbworICAgIHNlbGY6d3JpdGVKU09OQ2hhcihzdHJpbmcuc3ViKHN0ciwgaWksIGlpKSkKKyAgICBpaSA9IGlpICsgMQorICBlbmQKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05CYXNlNjQoc3RyKQorICBzZWxmOndyaXRlRWxlbVNlcGFyYXRvcigpCisgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICBsb2NhbCBsZW5ndGggPSBzdHJpbmcubGVuKHN0cikKKyAgbG9jYWwgb2Zmc2V0ID0gMQorICB3aGlsZSBsZW5ndGggPj0gMyBkbworICAgIC0tIEVuY29kZSAzIGJ5dGVzIGF0IGEgdGltZQorICAgIGxvY2FsIGJ5dGVzID0gYmFzZTY0X2VuY29kZShzdHJpbmcuc3ViKHN0ciwgb2Zmc2V0LCBvZmZzZXQrMykpCisgICAgc2VsZi50cmFuczp3cml0ZShieXRlcykKKyAgICBsZW5ndGggPSBsZW5ndGggLSAzCisgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgMworICBlbmQKKyAgaWYgbGVuZ3RoID4gMCB0aGVuCisgICAgbG9jYWwgYnl0ZXMgPSBiYXNlNjRfZW5jb2RlKHN0cmluZy5zdWIoc3RyLCBvZmZzZXQsIG9mZnNldCtsZW5ndGgpKQorICAgIHNlbGYudHJhbnM6d3JpdGUoYnl0ZXMpCisgIGVuZAorICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTkludGVnZXIobnVtKQorICBzZWxmOndyaXRlRWxlbVNlcGFyYXRvcigpCisgIGlmIHNlbGY6ZXNjYXBlTnVtKCkgdGhlbgorICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICBlbmQKKyAgbG9jYWwgbnVtc3RyID0gIiIgLi4gbnVtCisgIG51bXN0ciA9IHN0cmluZy5zdWIobnVtc3RyLCBzdHJpbmcuZmluZChudW1zdHIsICJeWystXT8lZCsiKSkKKyAgc2VsZi50cmFuczp3cml0ZShudW1zdHIpCisgIGlmIHNlbGY6ZXNjYXBlTnVtKCkgdGhlbgorICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTkRvdWJsZShkdWIpCisgIHNlbGY6d3JpdGVFbGVtU2VwYXJhdG9yKCkKKyAgbG9jYWwgdmFsID0gIiIgLi4gZHViCisgIGxvY2FsIHByZWZpeCA9IHN0cmluZy5zdWIodmFsLCAxLCAxKQorICBsb2NhbCBzcGVjaWFsID0gZmFsc2UKKyAgaWYgcHJlZml4ID09ICdOJyBvciBwcmVmaXggPT0gJ24nIHRoZW4KKyAgICB2YWwgPSBKU09OTm9kZS5OYW4KKyAgICBzcGVjaWFsID0gdHJ1ZQorICBlbHNlaWYgcHJlZml4ID09ICdJJyBvciBwcmVmaXggPT0gJ2knIHRoZW4KKyAgICB2YWwgPSBKU09OTm9kZS5JbmZpbml0eQorICAgIHNwZWNpYWwgPSB0cnVlCisgIGVsc2VpZiBwcmVmaXggPT0gJy0nIHRoZW4KKyAgICBsb2NhbCBzZWNvbmRCeXRlID0gc3RyaW5nLnN1Yih2YWwsIDIsIDIpCisgICAgaWYgc2Vjb25kQnl0ZSA9PSAnSScgb3Igc2Vjb25kQnl0ZSA9PSAnaScgdGhlbgorICAgICAgdmFsID0gSlNPTk5vZGUuTmVnYXRpdmVJbmZpbml0eQorICAgICAgc3BlY2lhbCA9IHRydWUKKyAgICBlbmQKKyAgZW5kCisKKyAgaWYgc3BlY2lhbCBvciBzZWxmOmVzY2FwZU51bSgpIHRoZW4KKyAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgZW5kCisgIHNlbGYudHJhbnM6d3JpdGUodmFsKQorICBpZiBzcGVjaWFsIG9yIHNlbGY6ZXNjYXBlTnVtKCkgdGhlbgorICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTk9iamVjdEJlZ2luKCkKKyAgc2VsZjp3cml0ZUVsZW1TZXBhcmF0b3IoKQorICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLk9iamVjdEJlZ2luKQorICBzZWxmOmNvbnRleHRQdXNoKHtmaXJzdCA9IHRydWUsIGNvbG9uID0gdHJ1ZSwgdHR5cGUgPSAxLCBudWxsID0gZmFsc2V9KQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVKU09OT2JqZWN0RW5kKCkKKyAgc2VsZjpjb250ZXh0UG9wKCkKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5PYmplY3RFbmQpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05BcnJheUJlZ2luKCkKKyAgc2VsZjp3cml0ZUVsZW1TZXBhcmF0b3IoKQorICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLkFycmF5QmVnaW4pCisgIHNlbGY6Y29udGV4dFB1c2goe2ZpcnN0ID0gdHJ1ZSwgY29sb24gPSB0cnVlLCB0dHlwZSA9IDIsIG51bGwgPSBmYWxzZX0pCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05BcnJheUVuZCgpCisgIHNlbGY6Y29udGV4dFBvcCgpCisgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuQXJyYXlFbmQpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0dHlwZSwgc2VxaWQpCisgIHNlbGY6cmVzZXRDb250ZXh0KCkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUJlZ2luKCkKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKFRKU09OUHJvdG9jb2wuVEhSSUZUX0pTT05fUFJPVE9DT0xfVkVSU0lPTikKKyAgc2VsZjp3cml0ZUpTT05TdHJpbmcobmFtZSkKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKHR0eXBlKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIoc2VxaWQpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZU1lc3NhZ2VFbmQoKQorICBzZWxmOndyaXRlSlNPTkFycmF5RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlU3RydWN0QmVnaW4obmFtZSkKKyAgc2VsZjp3cml0ZUpTT05PYmplY3RCZWdpbigpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZVN0cnVjdEVuZCgpCisgIHNlbGY6d3JpdGVKU09OT2JqZWN0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlRmllbGRCZWdpbihuYW1lLCB0dHlwZSwgaWQpCisgIHNlbGY6d3JpdGVKU09OSW50ZWdlcihpZCkKKyAgc2VsZjp3cml0ZUpTT05PYmplY3RCZWdpbigpCisgIHNlbGY6d3JpdGVKU09OU3RyaW5nKFRUeXBlVG9TdHJpbmdbdHR5cGVdKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVGaWVsZEVuZCgpCisgIHNlbGY6d3JpdGVKU09OT2JqZWN0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlRmllbGRTdG9wKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlTWFwQmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKQorICBzZWxmOndyaXRlSlNPTkFycmF5QmVnaW4oKQorICBzZWxmOndyaXRlSlNPTlN0cmluZyhUVHlwZVRvU3RyaW5nW2t0eXBlXSkKKyAgc2VsZjp3cml0ZUpTT05TdHJpbmcoVFR5cGVUb1N0cmluZ1t2dHlwZV0pCisgIHNlbGY6d3JpdGVKU09OSW50ZWdlcihzaXplKQorICByZXR1cm4gc2VsZjp3cml0ZUpTT05PYmplY3RCZWdpbigpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZU1hcEVuZCgpCisgIHNlbGY6d3JpdGVKU09OT2JqZWN0RW5kKCkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUxpc3RCZWdpbihldHlwZSwgc2l6ZSkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUJlZ2luKCkKKyAgc2VsZjp3cml0ZUpTT05TdHJpbmcoVFR5cGVUb1N0cmluZ1tldHlwZV0pCisgIHNlbGY6d3JpdGVKU09OSW50ZWdlcihzaXplKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVMaXN0RW5kKCkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZVNldEJlZ2luKGV0eXBlLCBzaXplKQorICBzZWxmOndyaXRlSlNPTkFycmF5QmVnaW4oKQorICBzZWxmOndyaXRlSlNPTlN0cmluZyhUVHlwZVRvU3RyaW5nW2V0eXBlXSkKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKHNpemUpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZVNldEVuZCgpCisgIHNlbGY6d3JpdGVKU09OQXJyYXlFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVCb29sKGJvb2wpCisgIGlmIGJvb2wgdGhlbgorICAgIHNlbGY6d3JpdGVKU09OSW50ZWdlcigxKQorICBlbHNlCisgICAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKDApCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVCeXRlKGJ5dGUpCisgIGxvY2FsIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnYycsIGJ5dGUpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2MnLCBidWZmKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIodmFsKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVJMTYoaTE2KQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ3MnLCBpMTYpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ3MnLCBidWZmKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIodmFsKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVJMzIoaTMyKQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ2knLCBpMzIpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2knLCBidWZmKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIodmFsKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVJNjQoaTY0KQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ2wnLCBpNjQpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2wnLCBidWZmKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIodG9zdHJpbmcodmFsKSkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlRG91YmxlKGR1YikKKyAgc2VsZjp3cml0ZUpTT05Eb3VibGUoc3RyaW5nLmZvcm1hdCgiJS4xNmYiLCBkdWIpKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVTdHJpbmcoc3RyKQorICBzZWxmOndyaXRlSlNPTlN0cmluZyhzdHIpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUJpbmFyeShzdHIpCisgIC0tIFNob3VsZCBiZSB1dGYtOAorICBzZWxmOndyaXRlSlNPTkJhc2U2NChzdHIpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTlN5bnRheENoYXIoY2gpCisgIGxvY2FsIGNoMiA9ICIiCisgIGlmIHNlbGYuaGFzUmVhZEJ5dGUgfj0gIiIgdGhlbgorICAgIGNoMiA9IHNlbGYuaGFzUmVhZEJ5dGUKKyAgICBzZWxmLmhhc1JlYWRCeXRlID0gIiIKKyAgZWxzZQorICAgIGNoMiA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICBlbmQKKyAgaWYgY2gyIH49IGNoIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3ttZXNzYWdlID0gIkV4cGVjdGVkICIuLiBjaCAuLiAiLCBnb3QgIiAuLiBjaDJ9KQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRFbGVtU2VwYXJhdG9yKCkKKyAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC5udWxsIHRoZW4KKyAgICByZXR1cm4KKyAgZW5kCisgIGlmIHNlbGYuanNvbkNvbnRleHRWYWwuZmlyc3QgdGhlbgorICAgIHNlbGYuanNvbkNvbnRleHRWYWwuZmlyc3QgPSBmYWxzZQorICBlbHNlCisgICAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC50dHlwZSA9PSAxIHRoZW4KKyAgICAgIGlmIHNlbGYuanNvbkNvbnRleHRWYWwuY29sb24gdGhlbgorICAgICAgICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5QYWlyU2VwYXJhdG9yKQorICAgICAgICBzZWxmLmpzb25Db250ZXh0VmFsLmNvbG9uID0gZmFsc2UKKyAgICAgIGVsc2UKKyAgICAgICAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuRWxlbVNlcGFyYXRvcikKKyAgICAgICAgc2VsZi5qc29uQ29udGV4dFZhbC5jb2xvbiA9IHRydWUKKyAgICAgIGVuZAorICAgIGVsc2UKKyAgICAgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLkVsZW1TZXBhcmF0b3IpCisgICAgZW5kCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6aGV4VmFsKGNoKQorICBsb2NhbCB2YWwgPSBzdHJpbmcuYnl0ZShjaCkKKyAgaWYgdmFsID49IDQ4IGFuZCB2YWwgPD0gNTcgdGhlbgorICAgIHJldHVybiB2YWwgLSA0OAorICBlbHNlaWYgdmFsID49IDk3IGFuZCB2YWwgPD0gMTAyIHRoZW4KKyAgICByZXR1cm4gdmFsIC0gODcKKyAgZWxzZQorICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3e21lc3NhZ2UgPSAiRXhwZWN0ZWQgaGV4IHZhbCAoWzAtOWEtZl0pOyBnb3QgIiAuLiBjaH0pCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05Fc2NhcGVDaGFyKGNoKQorICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5aZXJvQ2hhcikKKyAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuWmVyb0NoYXIpCisgIGxvY2FsIGIxID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgIGxvY2FsIGIyID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgIHJldHVybiBsaWJsdWFiaXR3aXNlLnNoaWZ0bChzZWxmOmhleFZhbChiMSksIDQpICsgc2VsZjpoZXhWYWwoYjIpCitlbmQKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRKU09OU3RyaW5nKCkKKyAgc2VsZjpyZWFkRWxlbVNlcGFyYXRvcigpCisgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgbG9jYWwgcmVzdWx0ID0gIiIKKyAgd2hpbGUgdHJ1ZSBkbworICAgIGxvY2FsIGNoID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgICAgaWYgY2ggPT0gSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyIHRoZW4KKyAgICAgIGJyZWFrCisgICAgZW5kCisgICAgaWYgY2ggPT0gSlNPTk5vZGUuQmFja3NsYXNoIHRoZW4KKyAgICAgIGNoID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgICAgICBpZiBjaCA9PSBKU09OTm9kZS5Fc2NhcGVDaGFyIHRoZW4KKyAgICAgICAgc2VsZjpyZWFkSlNPTkVzY2FwZUNoYXIoY2gpCisgICAgICBlbHNlCisgICAgICAgIGxvY2FsIHBvcywgXyA9IHN0cmluZy5maW5kKEpTT05Ob2RlLkVzY2FwZUNoYXJzLCBjaCkKKyAgICAgICAgaWYgcG9zID09IG5pbCB0aGVuCisgICAgICAgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7bWVzc2FnZSA9ICJFeHBlY3RlZCBjb250cm9sIGNoYXIsIGdvdCAiIC4uIGNofSkKKyAgICAgICAgZW5kCisgICAgICAgIGNoID0gRXNjYXBlQ2hhclZhbHNbcG9zXQorICAgICAgZW5kCisgICAgZW5kCisgICAgcmVzdWx0ID0gcmVzdWx0IC4uIGNoCisgIGVuZAorICByZXR1cm4gcmVzdWx0CitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTkJhc2U2NCgpCisgIGxvY2FsIHJlc3VsdCA9IHNlbGY6cmVhZEpTT05TdHJpbmcoKQorICBsb2NhbCBsZW5ndGggPSBzdHJpbmcubGVuKHJlc3VsdCkKKyAgbG9jYWwgc3RyID0gIiIKKyAgbG9jYWwgb2Zmc2V0ID0gMQorICB3aGlsZSBsZW5ndGggPj0gNCBkbworICAgIGxvY2FsIGJ5dGVzID0gc3RyaW5nLnN1YihyZXN1bHQsIG9mZnNldCwgb2Zmc2V0KzQpCisgICAgc3RyID0gc3RyIC4uIGJhc2U2NF9kZWNvZGUoYnl0ZXMpCisgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgNAorICAgIGxlbmd0aCA9IGxlbmd0aCAtIDQKKyAgZW5kCisgIGlmIGxlbmd0aCA+PSAwIHRoZW4KKyAgICBzdHIgPSBzdHIgLi4gYmFzZTY0X2RlY29kZShzdHJpbmcuc3ViKHJlc3VsdCwgb2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpKQorICBlbmQKKyAgcmV0dXJuIHN0cgorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICBsb2NhbCByZXN1bHQgPSAiIgorICB3aGlsZSB0cnVlIGRvCisgICAgbG9jYWwgY2ggPSBzZWxmLnRyYW5zOnJlYWRBbGwoMSkKKyAgICBpZiBzdHJpbmcuZmluZChjaCwgJ1stKzAtOS5FZV0nKSB0aGVuCisgICAgICByZXN1bHQgPSByZXN1bHQgLi4gY2gKKyAgICBlbHNlCisgICAgICBzZWxmLmhhc1JlYWRCeXRlID0gY2gKKyAgICAgIGJyZWFrCisgICAgZW5kCisgIGVuZAorICByZXR1cm4gcmVzdWx0CitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTkxvbmdJbnRlZ2VyKCkKKyAgc2VsZjpyZWFkRWxlbVNlcGFyYXRvcigpCisgIGlmIHNlbGY6ZXNjYXBlTnVtKCkgdGhlbgorICAgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgZW5kCisgIGxvY2FsIHJlc3VsdCA9IHNlbGY6cmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICBpZiBzZWxmOmVzY2FwZU51bSgpIHRoZW4KKyAgICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCisgIGVuZAorICByZXR1cm4gcmVzdWx0CitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTkludGVnZXIoKQorICByZXR1cm4gdG9udW1iZXIoc2VsZjpyZWFkSlNPTkxvbmdJbnRlZ2VyKCkpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTkRvdWJsZSgpCisgIHNlbGY6cmVhZEVsZW1TZXBhcmF0b3IoKQorICBsb2NhbCBkZWxpbWl0ZXIgPSBzZWxmLnRyYW5zOnJlYWRBbGwoMSkKKyAgbG9jYWwgbnVtID0gMC4wCisgIGlmIGRlbGltaXRlciA9PSBKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIgdGhlbgorICAgIGxvY2FsIHN0ciA9IHNlbGY6cmVhZEpTT05TdHJpbmcoKQorICAgIGlmIHN0ciA9PSBKU09OTm9kZS5OYW4gdGhlbgorICAgICAgbnVtID0gMS4wCisgICAgZWxzZWlmIHN0ciA9PSBKU09OTm9kZS5JbmZpbml0eSB0aGVuCisgICAgICBudW0gPSBtYXRoLm1heGludGVnZXIKKyAgICBlbHNlaWYgc3RyID09IEpTT05Ob2RlLk5lZ2F0aXZlSW5maW5pdHkgdGhlbgorICAgICAgbnVtID0gbWF0aC5taW5pbnRlZ2VyCisgICAgZWxzZQorICAgICAgbnVtID0gdG9udW1iZXIoc3RyKQorICAgIGVuZAorICBlbHNlCisgICAgaWYgc2VsZjplc2NhcGVOdW0oKSB0aGVuCisgICAgICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCisgICAgZW5kCisgICAgbG9jYWwgcmVzdWx0ID0gc2VsZjpyZWFkSlNPTk51bWVyaWNDaGFycygpCisgICAgbnVtID0gdG9udW1iZXIoZGVsaW1pdGVyLi4gcmVzdWx0KQorICBlbmQKKyAgcmV0dXJuIG51bQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05PYmplY3RCZWdpbigpCisgIHNlbGY6cmVhZEVsZW1TZXBhcmF0b3IoKQorICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5PYmplY3RCZWdpbikKKyAgc2VsZjpjb250ZXh0UHVzaCh7Zmlyc3QgPSB0cnVlLCBjb2xvbiA9IHRydWUsIHR0eXBlID0gMSwgbnVsbCA9IGZhbHNlfSkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRKU09OT2JqZWN0RW5kKCkKKyAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuT2JqZWN0RW5kKQorICBzZWxmOmNvbnRleHRQb3AoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05BcnJheUJlZ2luKCkKKyAgc2VsZjpyZWFkRWxlbVNlcGFyYXRvcigpCisgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLkFycmF5QmVnaW4pCisgIHNlbGY6Y29udGV4dFB1c2goe2ZpcnN0ID0gdHJ1ZSwgY29sb24gPSB0cnVlLCB0dHlwZSA9IDIsIG51bGwgPSBmYWxzZX0pCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTkFycmF5RW5kKCkKKyAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuQXJyYXlFbmQpCisgIHNlbGY6Y29udGV4dFBvcCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkTWVzc2FnZUJlZ2luKCkKKyAgc2VsZjpyZXNldENvbnRleHQoKQorICBzZWxmOnJlYWRKU09OQXJyYXlCZWdpbigpCisgIGxvY2FsIHZlcnNpb24gPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIGlmIHZlcnNpb24gfj0gc2VsZi5USFJJRlRfSlNPTl9QUk9UT0NPTF9WRVJTSU9OIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3ttZXNzYWdlID0gIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiJ9KQorICBlbmQKKyAgbG9jYWwgbmFtZSA9IHNlbGY6cmVhZEpTT05TdHJpbmcoKQorICBsb2NhbCB0dHlwZSA9IHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKKyAgbG9jYWwgc2VxaWQgPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIHJldHVybiBuYW1lLCB0dHlwZSwgc2VxaWQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRNZXNzYWdlRW5kKCkKKyAgc2VsZjpyZWFkSlNPTkFycmF5RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRTdHJ1Y3RCZWdpbigpCisgIHNlbGY6cmVhZEpTT05PYmplY3RCZWdpbigpCisgIHJldHVybiBuaWwKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRTdHJ1Y3RFbmQoKQorICBzZWxmOnJlYWRKU09OT2JqZWN0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRGaWVsZEJlZ2luKCkKKyAgbG9jYWwgdHR5cGUgPSBUVHlwZS5TVE9QCisgIGxvY2FsIGlkID0gMAorICBsb2NhbCBjaCA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICBzZWxmLmhhc1JlYWRCeXRlID0gY2gKKyAgaWYgY2ggfj0gSlNPTk5vZGUuT2JqZWN0RW5kIHRoZW4KKyAgICBpZCA9IHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKKyAgICBzZWxmOnJlYWRKU09OT2JqZWN0QmVnaW4oKQorICAgIGxvY2FsIHR5cGVOYW1lID0gc2VsZjpyZWFkSlNPTlN0cmluZygpCisgICAgdHR5cGUgPSBTdHJpbmdUb1RUeXBlW3R5cGVOYW1lXQorICBlbmQKKyAgcmV0dXJuIG5pbCwgdHR5cGUsIGlkCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkRmllbGRFbmQoKQorICBzZWxmOnJlYWRKU09OT2JqZWN0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRNYXBCZWdpbigpCisgIHNlbGY6cmVhZEpTT05BcnJheUJlZ2luKCkKKyAgbG9jYWwgdHlwZU5hbWUgPSBzZWxmOnJlYWRKU09OU3RyaW5nKCkKKyAgbG9jYWwga3R5cGUgPSBTdHJpbmdUb1RUeXBlW3R5cGVOYW1lXQorICB0eXBlTmFtZSA9IHNlbGY6cmVhZEpTT05TdHJpbmcoKQorICBsb2NhbCB2dHlwZSA9IFN0cmluZ1RvVFR5cGVbdHlwZU5hbWVdCisgIGxvY2FsIHNpemUgPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIHNlbGY6cmVhZEpTT05PYmplY3RCZWdpbigpCisgIHJldHVybiBrdHlwZSwgdnR5cGUsIHNpemUKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRNYXBFbmQoKQorICBzZWxmOnJlYWRKU09OT2JqZWN0RW5kKCkKKyAgc2VsZjpyZWFkSlNPTkFycmF5RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRMaXN0QmVnaW4oKQorICBzZWxmOnJlYWRKU09OQXJyYXlCZWdpbigpCisgIGxvY2FsIHR5cGVOYW1lID0gc2VsZjpyZWFkSlNPTlN0cmluZygpCisgIGxvY2FsIGV0eXBlID0gU3RyaW5nVG9UVHlwZVt0eXBlTmFtZV0KKyAgbG9jYWwgc2l6ZSA9IHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKKyAgcmV0dXJuIGV0eXBlLCBzaXplCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkTGlzdEVuZCgpCisgIHJldHVybiBzZWxmOnJlYWRKU09OQXJyYXlFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZFNldEJlZ2luKCkKKyAgcmV0dXJuIHNlbGY6cmVhZExpc3RCZWdpbigpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkU2V0RW5kKCkKKyAgcmV0dXJuIHNlbGY6cmVhZEpTT05BcnJheUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkQm9vbCgpCisgIGxvY2FsIHJlc3VsdCA9IHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKKyAgaWYgcmVzdWx0ID09IDEgdGhlbgorICAgIHJldHVybiB0cnVlCisgIGVsc2UKKyAgICByZXR1cm4gZmFsc2UKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkQnl0ZSgpCisgIGxvY2FsIHJlc3VsdCA9IHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKKyAgaWYgcmVzdWx0ID49IDI1NiB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7bWVzc2FnZSA9ICJVbkV4cGVjdGVkIEJ5dGUgIiAuLiByZXN1bHR9KQorICBlbmQKKyAgcmV0dXJuIHJlc3VsdAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEkxNigpCisgIHJldHVybiBzZWxmOnJlYWRKU09OSW50ZWdlcigpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSTMyKCkKKyAgcmV0dXJuIHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRJNjQoKQorICBsb2NhbCBsb25nID0gbGlibHVhbG9uZ251bWJlci5uZXcKKyAgcmV0dXJuIGxvbmcoc2VsZjpyZWFkSlNPTkxvbmdJbnRlZ2VyKCkpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkRG91YmxlKCkKKyAgcmV0dXJuIHNlbGY6cmVhZEpTT05Eb3VibGUoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZFN0cmluZygpCisgIHJldHVybiBzZWxmOnJlYWRKU09OU3RyaW5nKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRCaW5hcnkoKQorICByZXR1cm4gc2VsZjpyZWFkSlNPTkJhc2U2NCgpCitlbmQKKworVEpTT05Qcm90b2NvbEZhY3RvcnkgPSBUUHJvdG9jb2xGYWN0b3J5Om5ld3sKKyAgX190eXBlID0gJ1RKU09OUHJvdG9jb2xGYWN0b3J5JywKK30KKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEZhY3Rvcnk6Z2V0UHJvdG9jb2wodHJhbnMpCisgIC0tIFRPRE8gRW5mb3JjZSB0aGF0IHRoaXMgbXVzdCBiZSBhIHRyYW5zcG9ydCBjbGFzcyAoaWUgbm90IGEgYm9vbCkKKyAgaWYgbm90IHRyYW5zIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3sKKyAgICAgIG1lc3NhZ2UgPSAnTXVzdCBzdXBwbHkgYSB0cmFuc3BvcnQgdG8gJyAuLiB0dHlwZShzZWxmKQorICAgIH0pCisgIGVuZAorICByZXR1cm4gVEpTT05Qcm90b2NvbDpuZXd7CisgICAgdHJhbnMgPSB0cmFucworICB9CitlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVE1lbW9yeUJ1ZmZlci5sdWEgYi9saWIvbHVhL1RNZW1vcnlCdWZmZXIubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YjJmNWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL1RNZW1vcnlCdWZmZXIubHVhCkBAIC0wLDAgKzEsOTEgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUVHJhbnNwb3J0JworCitUTWVtb3J5QnVmZmVyID0gVFRyYW5zcG9ydEJhc2U6bmV3eworICBfX3R5cGUgPSAnVE1lbW9yeUJ1ZmZlcicsCisgIGJ1ZmZlciA9ICcnLAorICBidWZmZXJTaXplID0gMTAyNCwKKyAgd1BvcyA9IDAsCisgIHJQb3MgPSAwCit9CitmdW5jdGlvbiBUTWVtb3J5QnVmZmVyOmlzT3BlbigpCisgIHJldHVybiAxCitlbmQKK2Z1bmN0aW9uIFRNZW1vcnlCdWZmZXI6b3BlbigpIGVuZAorZnVuY3Rpb24gVE1lbW9yeUJ1ZmZlcjpjbG9zZSgpIGVuZAorCitmdW5jdGlvbiBUTWVtb3J5QnVmZmVyOnBlYWsoKQorICByZXR1cm4gc2VsZi5yUG9zIDwgc2VsZi53UG9zCitlbmQKKworZnVuY3Rpb24gVE1lbW9yeUJ1ZmZlcjpnZXRCdWZmZXIoKQorICByZXR1cm4gc2VsZi5idWZmZXIKK2VuZAorCitmdW5jdGlvbiBUTWVtb3J5QnVmZmVyOnJlc2V0QnVmZmVyKGJ1ZikKKyAgaWYgYnVmIHRoZW4KKyAgICBzZWxmLmJ1ZmZlciA9IGJ1ZgorICAgIHNlbGYuYnVmZmVyU2l6ZSA9IHN0cmluZy5sZW4oYnVmKQorICBlbHNlCisgICAgc2VsZi5idWZmZXIgPSAnJworICAgIHNlbGYuYnVmZmVyU2l6ZSA9IDEwMjQKKyAgZW5kCisgIHNlbGYud1BvcyA9IHN0cmluZy5sZW4oYnVmKQorICBzZWxmLnJQb3MgPSAwCitlbmQKKworZnVuY3Rpb24gVE1lbW9yeUJ1ZmZlcjphdmFpbGFibGUoKQorICByZXR1cm4gc2VsZi53UG9zIC0gc2VsZi5yUG9zCitlbmQKKworZnVuY3Rpb24gVE1lbW9yeUJ1ZmZlcjpyZWFkKGxlbikKKyAgbG9jYWwgYXZhaWwgPSBzZWxmOmF2YWlsYWJsZSgpCisgIGlmIGF2YWlsID09IDAgdGhlbgorICAgIHJldHVybiAnJworICBlbmQKKworICBpZiBhdmFpbCA8IGxlbiB0aGVuCisgICAgbGVuID0gYXZhaWwKKyAgZW5kCisKKyAgbG9jYWwgdmFsID0gc3RyaW5nLnN1YihzZWxmLmJ1ZmZlciwgc2VsZi5yUG9zICsgMSwgc2VsZi5yUG9zICsgbGVuKQorICBzZWxmLnJQb3MgPSBzZWxmLnJQb3MgKyBsZW4KKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRNZW1vcnlCdWZmZXI6cmVhZEFsbChsZW4pCisgIGxvY2FsIGF2YWlsID0gc2VsZjphdmFpbGFibGUoKQorCisgIGlmIGF2YWlsIDwgbGVuIHRoZW4KKyAgICBsb2NhbCBtc2cgPSBzdHJpbmcuZm9ybWF0KCdBdHRlbXB0IHRvIHJlYWRBbGwoJWQpIGZvdW5kIG9ubHkgJWQgYXZhaWxhYmxlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgYXZhaWwpCisgICAgdGVycm9yKFRUcmFuc3BvcnRFeGNlcHRpb246bmV3e21lc3NhZ2UgPSBtc2d9KQorICBlbmQKKyAgLS0gcmVhZCBzaG91bGQgYmxvY2sgc28gd2UgZG9uJ3QgbmVlZCBhIGxvb3AgaGVyZQorICByZXR1cm4gc2VsZjpyZWFkKGxlbikKK2VuZAorCitmdW5jdGlvbiBUTWVtb3J5QnVmZmVyOndyaXRlKGJ1ZikKKyAgc2VsZi5idWZmZXIgPSBzZWxmLmJ1ZmZlciAuLiBidWYKKyAgc2VsZi53UG9zID0gc2VsZi53UG9zICsgc3RyaW5nLmxlbihidWYpCitlbmQKKworZnVuY3Rpb24gVE1lbW9yeUJ1ZmZlcjpmbHVzaCgpIGVuZApkaWZmIC0tZ2l0IGEvbGliL2x1YS9UUHJvdG9jb2wubHVhIGIvbGliL2x1YS9UUHJvdG9jb2wubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNmUxNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL1RQcm90b2NvbC5sdWEKQEAgLTAsMCArMSwxNjIgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUaHJpZnQnCisKK1RQcm90b2NvbEV4Y2VwdGlvbiA9IFRFeGNlcHRpb246bmV3IHsKKyAgVU5LTk9XTiAgICAgICAgICA9IDAsCisgIElOVkFMSURfREFUQSAgICAgPSAxLAorICBORUdBVElWRV9TSVpFICAgID0gMiwKKyAgU0laRV9MSU1JVCAgICAgICA9IDMsCisgIEJBRF9WRVJTSU9OICAgICAgPSA0LAorICBJTlZBTElEX1BST1RPQ09MID0gNSwKKyAgREVQVEhfTElNSVQgICAgICA9IDYsCisgIGVycm9yQ29kZSAgICAgICAgPSAwLAorICBfX3R5cGUgPSAnVFByb3RvY29sRXhjZXB0aW9uJworfQorZnVuY3Rpb24gVFByb3RvY29sRXhjZXB0aW9uOl9fZXJyb3JDb2RlVG9TdHJpbmcoKQorICBpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLklOVkFMSURfREFUQSB0aGVuCisgICAgcmV0dXJuICdJbnZhbGlkIGRhdGEnCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLk5FR0FUSVZFX1NJWkUgdGhlbgorICAgIHJldHVybiAnTmVnYXRpdmUgc2l6ZScKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuU0laRV9MSU1JVCB0aGVuCisgICAgcmV0dXJuICdTaXplIGxpbWl0JworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5CQURfVkVSU0lPTiB0aGVuCisgICAgcmV0dXJuICdCYWQgdmVyc2lvbicKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuSU5WQUxJRF9QUk9UT0NPTCB0aGVuCisgICAgcmV0dXJuICdJbnZhbGlkIHByb3RvY29sJworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5ERVBUSF9MSU1JVCB0aGVuCisgICAgcmV0dXJuICdFeGNlZWRlZCBzaXplIGxpbWl0JworICBlbHNlCisgICAgcmV0dXJuICdEZWZhdWx0ICh1bmtub3duKScKKyAgZW5kCitlbmQKKworVFByb3RvY29sQmFzZSA9IF9fVE9iamVjdDpuZXd7CisgIF9fdHlwZSA9ICdUUHJvdG9jb2xCYXNlJywKKyAgdHJhbnMKK30KKworZnVuY3Rpb24gVFByb3RvY29sQmFzZTpuZXcob2JqKQorICBpZiB0dHlwZShvYmopIH49ICd0YWJsZScgdGhlbgorICAgIGVycm9yKHR0eXBlKHNlbGYpIC4uICdtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYSB0YWJsZScpCisgIGVuZAorCisgIC0tIEVuc3VyZSBhIHRyYW5zcG9ydCBpcyBwcm92aWRlZAorICBpZiBub3Qgb2JqLnRyYW5zIHRoZW4KKyAgICBlcnJvcignWW91IG11c3QgcHJvdmlkZSAnIC4uIHR0eXBlKHNlbGYpIC4uICcgd2l0aCBhIHRyYW5zJykKKyAgZW5kCisKKyAgcmV0dXJuIF9fVE9iamVjdC5uZXcoc2VsZiwgb2JqKQorZW5kCisKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgdHR5cGUsIHNlcWlkKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVNZXNzYWdlRW5kKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlU3RydWN0QmVnaW4obmFtZSkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlU3RydWN0RW5kKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlRmllbGRCZWdpbihuYW1lLCB0dHlwZSwgaWQpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZUZpZWxkRW5kKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlRmllbGRTdG9wKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlTWFwQmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVNYXBFbmQoKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVMaXN0QmVnaW4odHR5cGUsIHNpemUpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZUxpc3RFbmQoKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVTZXRCZWdpbih0dHlwZSwgc2l6ZSkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlU2V0RW5kKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlQm9vbChib29sKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVCeXRlKGJ5dGUpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZUkxNihpMTYpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZUkzMihpMzIpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZUk2NChpNjQpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZURvdWJsZShkdWIpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZVN0cmluZyhzdHIpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkTWVzc2FnZUJlZ2luKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRNZXNzYWdlRW5kKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRTdHJ1Y3RCZWdpbigpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkU3RydWN0RW5kKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRGaWVsZEJlZ2luKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRGaWVsZEVuZCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkTWFwQmVnaW4oKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6cmVhZE1hcEVuZCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkTGlzdEJlZ2luKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRMaXN0RW5kKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRTZXRCZWdpbigpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkU2V0RW5kKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRCb29sKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRCeXRlKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRJMTYoKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6cmVhZEkzMigpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkSTY0KCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWREb3VibGUoKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6cmVhZFN0cmluZygpIGVuZAorCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnNraXAodHR5cGUpCisgIGlmIHR5cGUgPT0gVFR5cGUuU1RPUCB0aGVuCisgICAgcmV0dXJuCisgIGVsc2VpZiB0dHlwZSA9PSBUVHlwZS5CT09MIHRoZW4KKyAgICBzZWxmOnJlYWRCb29sKCkKKyAgZWxzZWlmIHR0eXBlID09IFRUeXBlLkJZVEUgdGhlbgorICAgIHNlbGY6cmVhZEJ5dGUoKQorICBlbHNlaWYgdHR5cGUgPT0gVFR5cGUuSTE2IHRoZW4KKyAgICBzZWxmOnJlYWRJMTYoKQorICBlbHNlaWYgdHR5cGUgPT0gVFR5cGUuSTMyIHRoZW4KKyAgICBzZWxmOnJlYWRJMzIoKQorICBlbHNlaWYgdHR5cGUgPT0gVFR5cGUuSTY0IHRoZW4KKyAgICBzZWxmOnJlYWRJNjQoKQorICBlbHNlaWYgdHR5cGUgPT0gVFR5cGUuRE9VQkxFIHRoZW4KKyAgICBzZWxmOnJlYWREb3VibGUoKQorICBlbHNlaWYgdHR5cGUgPT0gVFR5cGUuU1RSSU5HIHRoZW4KKyAgICBzZWxmOnJlYWRTdHJpbmcoKQorICBlbHNlaWYgdHR5cGUgPT0gVFR5cGUuU1RSVUNUIHRoZW4KKyAgICBsb2NhbCBuYW1lID0gc2VsZjpyZWFkU3RydWN0QmVnaW4oKQorICAgIHdoaWxlIHRydWUgZG8KKyAgICAgIGxvY2FsIG5hbWUsIHR0eXBlLCBpZCA9IHNlbGY6cmVhZEZpZWxkQmVnaW4oKQorICAgICAgaWYgdHR5cGUgPT0gVFR5cGUuU1RPUCB0aGVuCisgICAgICAgIGJyZWFrCisgICAgICBlbmQKKyAgICAgIHNlbGY6c2tpcCh0dHlwZSkKKyAgICAgIHNlbGY6cmVhZEZpZWxkRW5kKCkKKyAgICBlbmQKKyAgICBzZWxmOnJlYWRTdHJ1Y3RFbmQoKQorICBlbHNlaWYgdHR5cGUgPT0gVFR5cGUuTUFQIHRoZW4KKyAgICBsb2NhbCBrdHR5cGUsIHZ0dHlwZSwgc2l6ZSA9IHNlbGY6cmVhZE1hcEJlZ2luKCkKKyAgICBmb3IgaSA9IDEsIHNpemUsIDEgZG8KKyAgICAgIHNlbGY6c2tpcChrdHR5cGUpCisgICAgICBzZWxmOnNraXAodnR0eXBlKQorICAgIGVuZAorICAgIHNlbGY6cmVhZE1hcEVuZCgpCisgIGVsc2VpZiB0dHlwZSA9PSBUVHlwZS5TRVQgdGhlbgorICAgIGxvY2FsIGV0dHlwZSwgc2l6ZSA9IHNlbGY6cmVhZFNldEJlZ2luKCkKKyAgICBmb3IgaSA9IDEsIHNpemUsIDEgZG8KKyAgICAgIHNlbGY6c2tpcChldHR5cGUpCisgICAgZW5kCisgICAgc2VsZjpyZWFkU2V0RW5kKCkKKyAgZWxzZWlmIHR0eXBlID09IFRUeXBlLkxJU1QgdGhlbgorICAgIGxvY2FsIGV0dHlwZSwgc2l6ZSA9IHNlbGY6cmVhZExpc3RCZWdpbigpCisgICAgZm9yIGkgPSAxLCBzaXplLCAxIGRvCisgICAgICBzZWxmOnNraXAoZXR0eXBlKQorICAgIGVuZAorICAgIHNlbGY6cmVhZExpc3RFbmQoKQorICBlbmQKK2VuZAorCitUUHJvdG9jb2xGYWN0b3J5ID0gX19UT2JqZWN0Om5ld3sKKyAgX190eXBlID0gJ1RQcm90b2NvbEZhY3RvcnknLAorfQorZnVuY3Rpb24gVFByb3RvY29sRmFjdG9yeTpnZXRQcm90b2NvbCh0cmFucykgZW5kCmRpZmYgLS1naXQgYS9saWIvbHVhL1RTZXJ2ZXIubHVhIGIvbGliL2x1YS9UU2VydmVyLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTM3ZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9UU2VydmVyLmx1YQpAQCAtMCwwICsxLDE0MCBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK3JlcXVpcmUgJ1RocmlmdCcKK3JlcXVpcmUgJ1RGcmFtZWRUcmFuc3BvcnQnCityZXF1aXJlICdUQmluYXJ5UHJvdG9jb2wnCisKKy0tIFRTZXJ2ZXIKK1RTZXJ2ZXIgPSBfX1RPYmplY3Q6bmV3eworICBfX3R5cGUgPSAnVFNlcnZlcicKK30KKworLS0gMiBwb3NzaWJsZSBjb25zdHJ1Y3RvcnMKKy0tICAgMS4ge3Byb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0fQorLS0gICAyLiB7cHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeX0KK2Z1bmN0aW9uIFRTZXJ2ZXI6bmV3KGFyZ3MpCisgIGlmIHR0eXBlKGFyZ3MpIH49ICd0YWJsZScgdGhlbgorICAgIGVycm9yKCdUU2VydmVyIG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIHRhYmxlJykKKyAgZW5kCisgIGlmIGFyZ3MucHJvY2Vzc29yID09IG5pbCB0aGVuCisgICAgdGVycm9yKCdZb3UgbXVzdCBwcm92aWRlICcgLi4gdHR5cGUoc2VsZikgLi4gJyB3aXRoIGEgcHJvY2Vzc29yJykKKyAgZW5kCisgIGlmIGFyZ3Muc2VydmVyVHJhbnNwb3J0ID09IG5pbCB0aGVuCisgICAgdGVycm9yKCdZb3UgbXVzdCBwcm92aWRlICcgLi4gdHR5cGUoc2VsZikgLi4gJyB3aXRoIGEgc2VydmVyVHJhbnNwb3J0JykKKyAgZW5kCisKKyAgLS0gQ3JlYXRlIHRoZSBvYmplY3QKKyAgbG9jYWwgb2JqID0gX19UT2JqZWN0Lm5ldyhzZWxmLCBhcmdzKQorCisgIGlmIG9iai50cmFuc3BvcnRGYWN0b3J5IHRoZW4KKyAgICBvYmouaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gb2JqLnRyYW5zcG9ydEZhY3RvcnkKKyAgICBvYmoub3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG9iai50cmFuc3BvcnRGYWN0b3J5CisgICAgb2JqLnRyYW5zcG9ydEZhY3RvcnkgPSBuaWwKKyAgZWxzZQorICAgIG9iai5pbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeTpuZXd7fQorICAgIG9iai5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5ID0gb2JqLmlucHV0VHJhbnNwb3J0RmFjdG9yeQorICBlbmQKKworICBpZiBvYmoucHJvdG9jb2xGYWN0b3J5IHRoZW4KKyAgICBvYmouaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBvYmoucHJvdG9jb2xGYWN0b3J5CisgICAgb2JqLm91dHB1dFByb3RvY29sRmFjdG9yeSA9IG9iai5wcm90b2NvbEZhY3RvcnkKKyAgICBvYmoucHJvdG9jb2xGYWN0b3J5ID0gbmlsCisgIGVsc2UKKyAgICBvYmouaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5Om5ld3t9CisgICAgb2JqLm91dHB1dFByb3RvY29sRmFjdG9yeSA9IG9iai5pbnB1dFByb3RvY29sRmFjdG9yeQorICBlbmQKKworICAtLSBTZXQgdGhlIF9fc2VydmVyIHZhcmlhYmxlIGluIHRoZSBoYW5kbGVyIHNvIHdlIGNhbiBzdG9wIHRoZSBzZXJ2ZXIKKyAgb2JqLnByb2Nlc3Nvci5oYW5kbGVyLl9fc2VydmVyID0gc2VsZgorCisgIHJldHVybiBvYmoKK2VuZAorCitmdW5jdGlvbiBUU2VydmVyOnNldFNlcnZlckV2ZW50SGFuZGxlcihoYW5kbGVyKQorICBzZWxmLnNlcnZlckV2ZW50SGFuZGxlciA9IGhhbmRsZXIKK2VuZAorCitmdW5jdGlvbiBUU2VydmVyOl9jbGllbnRCZWdpbihjb250ZW50LCBpcHJvdCwgb3Byb3QpCisgIGlmIHNlbGYuc2VydmVyRXZlbnRIYW5kbGVyIGFuZAorICAgIHR5cGUoc2VsZi5zZXJ2ZXJFdmVudEhhbmRsZXIuY2xpZW50QmVnaW4pID09ICdmdW5jdGlvbicgdGhlbgorICAgIHNlbGYuc2VydmVyRXZlbnRIYW5kbGVyOmNsaWVudEJlZ2luKGlwcm90LCBvcHJvdCkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVFNlcnZlcjpfcHJlU2VydmUoKQorICBpZiBzZWxmLnNlcnZlckV2ZW50SGFuZGxlciBhbmQKKyAgICB0eXBlKHNlbGYuc2VydmVyRXZlbnRIYW5kbGVyLnByZVNlcnZlKSA9PSAnZnVuY3Rpb24nIHRoZW4KKyAgICBzZWxmLnNlcnZlckV2ZW50SGFuZGxlcjpwcmVTZXJ2ZShzZWxmLnNlcnZlclRyYW5zcG9ydDpnZXRTb2NrZXRJbmZvKCkpCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRTZXJ2ZXI6X2hhbmRsZUV4Y2VwdGlvbihlcnIpCisgIGlmIHN0cmluZy5maW5kKGVyciwgJ1RUcmFuc3BvcnRFeGNlcHRpb24nKSA9PSBuaWwgdGhlbgorICAgIHByaW50KGVycikKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVFNlcnZlcjpzZXJ2ZSgpIGVuZAorZnVuY3Rpb24gVFNlcnZlcjpoYW5kbGUoY2xpZW50KQorICBsb2NhbCBpdHJhbnMsIG90cmFucyA9CisgICAgc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3Rvcnk6Z2V0VHJhbnNwb3J0KGNsaWVudCksCisgICAgc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5OmdldFRyYW5zcG9ydChjbGllbnQpCisgIGxvY2FsIGlwcm90LCBvcHJvdCA9CisgICAgc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeTpnZXRQcm90b2NvbChpdHJhbnMpLAorICAgIHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5OmdldFByb3RvY29sKG90cmFucykKKworICBzZWxmOl9jbGllbnRCZWdpbihpcHJvdCwgb3Byb3QpCisgIHdoaWxlIHRydWUgZG8KKyAgICBsb2NhbCByZXQsIGVyciA9IHBjYWxsKHNlbGYucHJvY2Vzc29yLnByb2Nlc3MsIHNlbGYucHJvY2Vzc29yLCBpcHJvdCwgb3Byb3QpCisgICAgaWYgcmV0ID09IGZhbHNlIGFuZCBlcnIgdGhlbgorICAgICAgaWYgbm90IHN0cmluZy5maW5kKGVyciwgIlRUcmFuc3BvcnRFeGNlcHRpb24iKSB0aGVuCisgICAgICAgIHNlbGY6X2hhbmRsZUV4Y2VwdGlvbihlcnIpCisgICAgICBlbmQKKyAgICAgIGJyZWFrCisgICAgZW5kCisgIGVuZAorICBpdHJhbnM6Y2xvc2UoKQorICBvdHJhbnM6Y2xvc2UoKQorZW5kCisKK2Z1bmN0aW9uIFRTZXJ2ZXI6Y2xvc2UoKQorICBzZWxmLnNlcnZlclRyYW5zcG9ydDpjbG9zZSgpCitlbmQKKworLS0gVFNpbXBsZVNlcnZlcgorLS0gIFNpbmdsZSB0aHJlYWRlZCBzZXJ2ZXIgdGhhdCBoYW5kbGVzIG9uZSB0cmFuc3BvcnQgKGNvbm5lY3Rpb24pCitUU2ltcGxlU2VydmVyID0gX19UT2JqZWN0Om5ldyhUU2VydmVyLCB7CisgIF9fdHlwZSA9ICdUU2ltcGxlU2VydmVyJywKKyAgX19zdG9wID0gZmFsc2UKK30pCisKK2Z1bmN0aW9uIFRTaW1wbGVTZXJ2ZXI6c2VydmUoKQorICBzZWxmLnNlcnZlclRyYW5zcG9ydDpsaXN0ZW4oKQorICBzZWxmOl9wcmVTZXJ2ZSgpCisgIHdoaWxlIG5vdCBzZWxmLl9fc3RvcCBkbworICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0OmFjY2VwdCgpCisgICAgc2VsZjpoYW5kbGUoY2xpZW50KQorICBlbmQKKyAgc2VsZjpjbG9zZSgpCitlbmQKKworZnVuY3Rpb24gVFNpbXBsZVNlcnZlcjpzdG9wKCkKKyAgc2VsZi5fX3N0b3AgPSB0cnVlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVFNvY2tldC5sdWEgYi9saWIvbHVhL1RTb2NrZXQubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MWZjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL1RTb2NrZXQubHVhCkBAIC0wLDAgKzEsMTMyIEBACistLS0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK3JlcXVpcmUgJ1RUcmFuc3BvcnQnCityZXF1aXJlICdsaWJsdWFzb2NrZXQnCisKKy0tIFRTb2NrZXRCYXNlCitUU29ja2V0QmFzZSA9IFRUcmFuc3BvcnRCYXNlOm5ld3sKKyAgX190eXBlID0gJ1RTb2NrZXRCYXNlJywKKyAgdGltZW91dCA9IDEwMDAsCisgIGhvc3QgPSAnbG9jYWxob3N0JywKKyAgcG9ydCA9IDkwOTAsCisgIGhhbmRsZQorfQorCitmdW5jdGlvbiBUU29ja2V0QmFzZTpjbG9zZSgpCisgIGlmIHNlbGYuaGFuZGxlIHRoZW4KKyAgICBzZWxmLmhhbmRsZTpkZXN0cm95KCkKKyAgICBzZWxmLmhhbmRsZSA9IG5pbAorICBlbmQKK2VuZAorCistLSBSZXR1cm5zIGEgdGFibGUgd2l0aCB0aGUgZmllbGRzIGhvc3QgYW5kIHBvcnQKK2Z1bmN0aW9uIFRTb2NrZXRCYXNlOmdldFNvY2tldEluZm8oKQorICBpZiBzZWxmLmhhbmRsZSB0aGVuCisgICAgcmV0dXJuIHNlbGYuaGFuZGxlOmdldHNvY2tpbmZvKCkKKyAgZW5kCisgIHRlcnJvcihUVHJhbnNwb3J0RXhjZXB0aW9uOm5ld3tlcnJvckNvZGUgPSBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOfSkKK2VuZAorCitmdW5jdGlvbiBUU29ja2V0QmFzZTpzZXRUaW1lb3V0KHRpbWVvdXQpCisgIGlmIHRpbWVvdXQgYW5kIHR0eXBlKHRpbWVvdXQpID09ICdudW1iZXInIHRoZW4KKyAgICBpZiBzZWxmLmhhbmRsZSB0aGVuCisgICAgICBzZWxmLmhhbmRsZTpzZXR0aW1lb3V0KHRpbWVvdXQpCisgICAgZW5kCisgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dAorICBlbmQKK2VuZAorCistLSBUU29ja2V0CitUU29ja2V0ID0gVFNvY2tldEJhc2U6bmV3eworICBfX3R5cGUgPSAnVFNvY2tldCcsCisgIGhvc3QgPSAnbG9jYWxob3N0JywKKyAgcG9ydCA9IDkwOTAKK30KKworZnVuY3Rpb24gVFNvY2tldDppc09wZW4oKQorICBpZiBzZWxmLmhhbmRsZSB0aGVuCisgICAgcmV0dXJuIHRydWUKKyAgZW5kCisgIHJldHVybiBmYWxzZQorZW5kCisKK2Z1bmN0aW9uIFRTb2NrZXQ6b3BlbigpCisgIGlmIHNlbGYuaGFuZGxlIHRoZW4KKyAgICBzZWxmOmNsb3NlKCkKKyAgZW5kCisKKyAgLS0gQ3JlYXRlIGxvY2FsIGhhbmRsZQorICBsb2NhbCBzb2NrLCBlcnIgPSBsdWFzb2NrZXQuY3JlYXRlX2FuZF9jb25uZWN0KAorICAgIHNlbGYuaG9zdCwgc2VsZi5wb3J0LCBzZWxmLnRpbWVvdXQpCisgIGlmIGVyciA9PSBuaWwgdGhlbgorICAgIHNlbGYuaGFuZGxlID0gc29jaworICBlbmQKKworICBpZiBlcnIgdGhlbgorICAgIHRlcnJvcihUVHJhbnNwb3J0RXhjZXB0aW9uOm5ld3sKKyAgICAgIG1lc3NhZ2UgPSAnQ291bGQgbm90IGNvbm5lY3QgdG8gJyAuLiBzZWxmLmhvc3QgLi4gJzonIC4uIHNlbGYucG9ydAorICAgICAgICAuLiAnICgnIC4uIGVyciAuLiAnKScKKyAgICB9KQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUU29ja2V0OnJlYWQobGVuKQorICBsb2NhbCBidWYgPSBzZWxmLmhhbmRsZTpyZWNlaXZlKHNlbGYuaGFuZGxlLCBsZW4pCisgIGlmIG5vdCBidWYgb3Igc3RyaW5nLmxlbihidWYpIH49IGxlbiB0aGVuCisgICAgdGVycm9yKFRUcmFuc3BvcnRFeGNlcHRpb246bmV3e2Vycm9yQ29kZSA9IFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTn0pCisgIGVuZAorICByZXR1cm4gYnVmCitlbmQKKworZnVuY3Rpb24gVFNvY2tldDp3cml0ZShidWYpCisgIHNlbGYuaGFuZGxlOnNlbmQoc2VsZi5oYW5kbGUsIGJ1ZikKK2VuZAorCitmdW5jdGlvbiBUU29ja2V0OmZsdXNoKCkKK2VuZAorCistLSBUU2VydmVyU29ja2V0CitUU2VydmVyU29ja2V0ID0gVFNvY2tldEJhc2U6bmV3eworICBfX3R5cGUgPSAnVFNlcnZlclNvY2tldCcsCisgIGhvc3QgPSAnbG9jYWxob3N0JywKKyAgcG9ydCA9IDkwOTAKK30KKworZnVuY3Rpb24gVFNlcnZlclNvY2tldDpsaXN0ZW4oKQorICBpZiBzZWxmLmhhbmRsZSB0aGVuCisgICAgc2VsZjpjbG9zZSgpCisgIGVuZAorCisgIGxvY2FsIHNvY2ssIGVyciA9IGx1YXNvY2tldC5jcmVhdGUoc2VsZi5ob3N0LCBzZWxmLnBvcnQpCisgIGlmIG5vdCBlcnIgdGhlbgorICAgIHNlbGYuaGFuZGxlID0gc29jaworICBlbHNlCisgICAgdGVycm9yKGVycikKKyAgZW5kCisgIHNlbGYuaGFuZGxlOnNldHRpbWVvdXQoc2VsZi50aW1lb3V0KQorICBzZWxmLmhhbmRsZTpsaXN0ZW4oKQorZW5kCisKK2Z1bmN0aW9uIFRTZXJ2ZXJTb2NrZXQ6YWNjZXB0KCkKKyAgbG9jYWwgY2xpZW50LCBlcnIgPSBzZWxmLmhhbmRsZTphY2NlcHQoKQorICBpZiBlcnIgdGhlbgorICAgIHRlcnJvcihlcnIpCisgIGVuZAorICByZXR1cm4gVFNvY2tldDpuZXcoe2hhbmRsZSA9IGNsaWVudH0pCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVFRyYW5zcG9ydC5sdWEgYi9saWIvbHVhL1RUcmFuc3BvcnQubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYzdlNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL1RUcmFuc3BvcnQubHVhCkBAIC0wLDAgKzEsOTMgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUaHJpZnQnCisKK1RUcmFuc3BvcnRFeGNlcHRpb24gPSBURXhjZXB0aW9uOm5ldyB7CisgIFVOS05PV04gICAgICAgICAgICAgPSAwLAorICBOT1RfT1BFTiAgICAgICAgICAgID0gMSwKKyAgQUxSRUFEWV9PUEVOICAgICAgICA9IDIsCisgIFRJTUVEX09VVCAgICAgICAgICAgPSAzLAorICBFTkRfT0ZfRklMRSAgICAgICAgID0gNCwKKyAgSU5WQUxJRF9GUkFNRV9TSVpFICA9IDUsCisgIElOVkFMSURfVFJBTlNGT1JNICAgPSA2LAorICBJTlZBTElEX0NMSUVOVF9UWVBFID0gNywKKyAgZXJyb3JDb2RlICAgICAgICA9IDAsCisgIF9fdHlwZSA9ICdUVHJhbnNwb3J0RXhjZXB0aW9uJworfQorCitmdW5jdGlvbiBUVHJhbnNwb3J0RXhjZXB0aW9uOl9fZXJyb3JDb2RlVG9TdHJpbmcoKQorICBpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLk5PVF9PUEVOIHRoZW4KKyAgICByZXR1cm4gJ1RyYW5zcG9ydCBub3Qgb3BlbicKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuQUxSRUFEWV9PUEVOIHRoZW4KKyAgICByZXR1cm4gJ1RyYW5zcG9ydCBhbHJlYWR5IG9wZW4nCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLlRJTUVEX09VVCB0aGVuCisgICAgcmV0dXJuICdUcmFuc3BvcnQgdGltZWQgb3V0JworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5FTkRfT0ZfRklMRSB0aGVuCisgICAgcmV0dXJuICdFbmQgb2YgZmlsZScKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuSU5WQUxJRF9GUkFNRV9TSVpFIHRoZW4KKyAgICByZXR1cm4gJ0ludmFsaWQgZnJhbWUgc2l6ZScKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuSU5WQUxJRF9UUkFOU0ZPUk0gdGhlbgorICAgIHJldHVybiAnSW52YWxpZCB0cmFuc2Zvcm0nCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLklOVkFMSURfQ0xJRU5UX1RZUEUgdGhlbgorICAgIHJldHVybiAnSW52YWxpZCBjbGllbnQgdHlwZScKKyAgZWxzZQorICAgIHJldHVybiAnRGVmYXVsdCAodW5rbm93biknCisgIGVuZAorZW5kCisKK1RUcmFuc3BvcnRCYXNlID0gX19UT2JqZWN0Om5ld3sKKyAgX190eXBlID0gJ1RUcmFuc3BvcnRCYXNlJworfQorCitmdW5jdGlvbiBUVHJhbnNwb3J0QmFzZTppc09wZW4oKSBlbmQKK2Z1bmN0aW9uIFRUcmFuc3BvcnRCYXNlOm9wZW4oKSBlbmQKK2Z1bmN0aW9uIFRUcmFuc3BvcnRCYXNlOmNsb3NlKCkgZW5kCitmdW5jdGlvbiBUVHJhbnNwb3J0QmFzZTpyZWFkKGxlbikgZW5kCitmdW5jdGlvbiBUVHJhbnNwb3J0QmFzZTpyZWFkQWxsKGxlbikKKyAgbG9jYWwgYnVmLCBoYXZlLCBjaHVuayA9ICcnLCAwCisgIHdoaWxlIGhhdmUgPCBsZW4gZG8KKyAgICBjaHVuayA9IHNlbGY6cmVhZChsZW4gLSBoYXZlKQorICAgIGhhdmUgPSBoYXZlICsgc3RyaW5nLmxlbihjaHVuaykKKyAgICBidWYgPSBidWYgLi4gY2h1bmsKKworICAgIGlmIHN0cmluZy5sZW4oY2h1bmspID09IDAgdGhlbgorICAgICAgdGVycm9yKFRUcmFuc3BvcnRFeGNlcHRpb246bmV3eworICAgICAgICBlcnJvckNvZGUgPSBUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFCisgICAgICB9KQorICAgIGVuZAorICBlbmQKKyAgcmV0dXJuIGJ1ZgorZW5kCitmdW5jdGlvbiBUVHJhbnNwb3J0QmFzZTp3cml0ZShidWYpIGVuZAorZnVuY3Rpb24gVFRyYW5zcG9ydEJhc2U6Zmx1c2goKSBlbmQKKworVFNlcnZlclRyYW5zcG9ydEJhc2UgPSBfX1RPYmplY3Q6bmV3eworICBfX3R5cGUgPSAnVFNlcnZlclRyYW5zcG9ydEJhc2UnCit9CitmdW5jdGlvbiBUU2VydmVyVHJhbnNwb3J0QmFzZTpsaXN0ZW4oKSBlbmQKK2Z1bmN0aW9uIFRTZXJ2ZXJUcmFuc3BvcnRCYXNlOmFjY2VwdCgpIGVuZAorZnVuY3Rpb24gVFNlcnZlclRyYW5zcG9ydEJhc2U6Y2xvc2UoKSBlbmQKKworVFRyYW5zcG9ydEZhY3RvcnlCYXNlID0gX19UT2JqZWN0Om5ld3sKKyAgX190eXBlID0gJ1RUcmFuc3BvcnRGYWN0b3J5QmFzZScKK30KK2Z1bmN0aW9uIFRUcmFuc3BvcnRGYWN0b3J5QmFzZTpnZXRUcmFuc3BvcnQodHJhbnMpCisgIHJldHVybiB0cmFucworZW5kCmRpZmYgLS1naXQgYS9saWIvbHVhL1RocmlmdC5sdWEgYi9saWIvbHVhL1RocmlmdC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkNGJhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvVGhyaWZ0Lmx1YQpAQCAtMCwwICsxLDI4MSBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKKy0tLS0gbmFtZXNwYWNlIHRocmlmdAorLS10aHJpZnQgPSB7fQorLS1zZXRtZXRhdGFibGUodGhyaWZ0LCB7X19pbmRleCA9IF9HfSkgLS0+IHBlcmYgaGl0IGZvciBhY2Nlc3NpbmcgZ2xvYmFsIG1ldGhvZHMKKy0tc2V0ZmVudigxLCB0aHJpZnQpCisKK3BhY2thZ2UuY3BhdGggPSBwYWNrYWdlLmNwYXRoIC4uICc7YmluLz8uc28nIC0tIFRPRE8gRklYCitmdW5jdGlvbiB0dHlwZShvYmopCisgIGlmIHR5cGUob2JqKSA9PSAndGFibGUnIGFuZAorICAgIG9iai5fX3R5cGUgYW5kCisgICAgdHlwZShvYmouX190eXBlKSA9PSAnc3RyaW5nJyB0aGVuCisgICAgICByZXR1cm4gb2JqLl9fdHlwZQorICBlbmQKKyAgcmV0dXJuIHR5cGUob2JqKQorZW5kCisKK2Z1bmN0aW9uIHRlcnJvcihlKQorICBpZiBlIGFuZCBlLl9fdG9zdHJpbmcgdGhlbgorICAgIGVycm9yKGU6X190b3N0cmluZygpKQorICAgIHJldHVybgorICBlbmQKKyAgZXJyb3IoZSkKK2VuZAorCitmdW5jdGlvbiB0dGFibGVfc2l6ZSh0KQorICBsb2NhbCBjb3VudCA9IDAKKyAgZm9yIGssIHYgaW4gcGFpcnModCkgZG8KKyAgICBjb3VudCA9IGNvdW50ICsgMQorICBlbmQKKyAgcmV0dXJuIGNvdW50CitlbmQKKwordmVyc2lvbiA9ICcxLjAuMCcKKworVFR5cGUgPSB7CisgIFNUT1AgICA9IDAsCisgIFZPSUQgICA9IDEsCisgIEJPT0wgICA9IDIsCisgIEJZVEUgICA9IDMsCisgIEkwOCAgICA9IDMsCisgIERPVUJMRSA9IDQsCisgIEkxNiAgICA9IDYsCisgIEkzMiAgICA9IDgsCisgIEk2NCAgICA9IDEwLAorICBTVFJJTkcgPSAxMSwKKyAgVVRGNyAgID0gMTEsCisgIFNUUlVDVCA9IDEyLAorICBNQVAgICAgPSAxMywKKyAgU0VUICAgID0gMTQsCisgIExJU1QgICA9IDE1LAorICBVVEY4ICAgPSAxNiwKKyAgVVRGMTYgID0gMTcKK30KKworVE1lc3NhZ2VUeXBlID0geworICBDQUxMICA9IDEsCisgIFJFUExZID0gMiwKKyAgRVhDRVBUSU9OID0gMywKKyAgT05FV0FZID0gNAorfQorCistLSBSZWN1cnNpdmUgX19pbmRleCBmdW5jdGlvbiB0byBhY2hpZXZlIGluaGVyaXRhbmNlCitmdW5jdGlvbiBfX3RvYmpfaW5kZXgoc2VsZiwga2V5KQorICBsb2NhbCB2ID0gcmF3Z2V0KHNlbGYsIGtleSkKKyAgaWYgdiB+PSBuaWwgdGhlbgorICAgIHJldHVybiB2CisgIGVuZAorCisgIGxvY2FsIHAgPSByYXdnZXQoc2VsZiwgJ19fcGFyZW50JykKKyAgaWYgcCB0aGVuCisgICAgcmV0dXJuIF9fdG9ial9pbmRleChwLCBrZXkpCisgIGVuZAorCisgIHJldHVybiBuaWwKK2VuZAorCistLSBCYXNpYyBUaHJpZnQtTHVhIE9iamVjdAorX19UT2JqZWN0ID0geworICBfX3R5cGUgPSAnX19UT2JqZWN0JywKKyAgX19tdCA9IHsKKyAgICBfX2luZGV4ID0gX190b2JqX2luZGV4CisgIH0KK30KK2Z1bmN0aW9uIF9fVE9iamVjdDpuZXcoaW5pdF9vYmopCisgIGxvY2FsIG9iaiA9IHt9CisgIGlmIHR0eXBlKG9iaikgPT0gJ3RhYmxlJyB0aGVuCisgICAgb2JqID0gaW5pdF9vYmoKKyAgZW5kCisKKyAgLS0gVXNlIHRoZSBfX3BhcmVudCBrZXkgYW5kIHRoZSBfX2luZGV4IGZ1bmN0aW9uIHRvIGFjaGlldmUgaW5oZXJpdGFuY2UKKyAgb2JqLl9fcGFyZW50ID0gc2VsZgorICBzZXRtZXRhdGFibGUob2JqLCBfX1RPYmplY3QuX19tdCkKKyAgcmV0dXJuIG9iagorZW5kCisKKy0tIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbnkgbHVhIHZhcmlhYmxlCitmdW5jdGlvbiB0aHJpZnRfcHJpbnRfcih0KQorICBsb2NhbCByZXQgPSAnJworICBsb2NhbCBsdHlwZSA9IHR5cGUodCkKKyAgaWYgKGx0eXBlID09ICd0YWJsZScpIHRoZW4KKyAgICByZXQgPSByZXQgLi4gJ3sgJworICAgIGZvciBrZXksdmFsdWUgaW4gcGFpcnModCkgZG8KKyAgICAgIHJldCA9IHJldCAuLiB0b3N0cmluZyhrZXkpIC4uICc9JyAuLiB0aHJpZnRfcHJpbnRfcih2YWx1ZSkgLi4gJyAnCisgICAgZW5kCisgICAgcmV0ID0gcmV0IC4uICd9JworICBlbHNlaWYgbHR5cGUgPT0gJ3N0cmluZycgdGhlbgorICAgIHJldCA9IHJldCAuLiAiJyIgLi4gdG9zdHJpbmcodCkgLi4gIiciCisgIGVsc2UKKyAgICByZXQgPSByZXQgLi4gdG9zdHJpbmcodCkKKyAgZW5kCisgIHJldHVybiByZXQKK2VuZAorCistLSBCYXNpYyBFeGNlcHRpb24KK1RFeGNlcHRpb24gPSBfX1RPYmplY3Q6bmV3eworICBtZXNzYWdlLAorICBlcnJvckNvZGUsCisgIF9fdHlwZSA9ICdURXhjZXB0aW9uJworfQorZnVuY3Rpb24gVEV4Y2VwdGlvbjpfX3Rvc3RyaW5nKCkKKyAgaWYgc2VsZi5tZXNzYWdlIHRoZW4KKyAgICByZXR1cm4gc3RyaW5nLmZvcm1hdCgnJXM6ICVzJywgc2VsZi5fX3R5cGUsIHNlbGYubWVzc2FnZSkKKyAgZWxzZQorICAgIGxvY2FsIG1lc3NhZ2UKKyAgICBpZiBzZWxmLmVycm9yQ29kZSBhbmQgc2VsZi5fX2Vycm9yQ29kZVRvU3RyaW5nIHRoZW4KKyAgICAgIG1lc3NhZ2UgPSBzdHJpbmcuZm9ybWF0KCclZDogJXMnLCBzZWxmLmVycm9yQ29kZSwgc2VsZjpfX2Vycm9yQ29kZVRvU3RyaW5nKCkpCisgICAgZWxzZQorICAgICAgbWVzc2FnZSA9IHRocmlmdF9wcmludF9yKHNlbGYpCisgICAgZW5kCisgICAgcmV0dXJuIHN0cmluZy5mb3JtYXQoJyVzOiVzJywgc2VsZi5fX3R5cGUsIG1lc3NhZ2UpCisgIGVuZAorZW5kCisKK1RBcHBsaWNhdGlvbkV4Y2VwdGlvbiA9IFRFeGNlcHRpb246bmV3eworICBVTktOT1dOICAgICAgICAgICAgICAgICA9IDAsCisgIFVOS05PV05fTUVUSE9EICAgICAgICAgID0gMSwKKyAgSU5WQUxJRF9NRVNTQUdFX1RZUEUgICAgPSAyLAorICBXUk9OR19NRVRIT0RfTkFNRSAgICAgICA9IDMsCisgIEJBRF9TRVFVRU5DRV9JRCAgICAgICAgID0gNCwKKyAgTUlTU0lOR19SRVNVTFQgICAgICAgICAgPSA1LAorICBJTlRFUk5BTF9FUlJPUiAgICAgICAgICA9IDYsCisgIFBST1RPQ09MX0VSUk9SICAgICAgICAgID0gNywKKyAgSU5WQUxJRF9UUkFOU0ZPUk0gICAgICAgPSA4LAorICBJTlZBTElEX1BST1RPQ09MICAgICAgICA9IDksCisgIFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0gMTAsCisgIGVycm9yQ29kZSAgICAgICAgICAgICAgID0gMCwKKyAgX190eXBlID0gJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicKK30KKworZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uOl9fZXJyb3JDb2RlVG9TdHJpbmcoKQorICBpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLlVOS05PV05fTUVUSE9EIHRoZW4KKyAgICByZXR1cm4gJ1Vua25vd24gbWV0aG9kJworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5JTlZBTElEX01FU1NBR0VfVFlQRSB0aGVuCisgICAgcmV0dXJuICdJbnZhbGlkIG1lc3NhZ2UgdHlwZScKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuV1JPTkdfTUVUSE9EX05BTUUgdGhlbgorICAgIHJldHVybiAnV3JvbmcgbWV0aG9kIG5hbWUnCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLkJBRF9TRVFVRU5DRV9JRCB0aGVuCisgICAgcmV0dXJuICdCYWQgc2VxdWVuY2UgSUQnCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLk1JU1NJTkdfUkVTVUxUIHRoZW4KKyAgICByZXR1cm4gJ01pc3NpbmcgcmVzdWx0JworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5JTlRFUk5BTF9FUlJPUiB0aGVuCisgICAgcmV0dXJuICdJbnRlcm5hbCBlcnJvcicKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuUFJPVE9DT0xfRVJST1IgdGhlbgorICAgIHJldHVybiAnUHJvdG9jb2wgZXJyb3InCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLklOVkFMSURfVFJBTlNGT1JNIHRoZW4KKyAgICByZXR1cm4gJ0ludmFsaWQgdHJhbnNmb3JtJworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5JTlZBTElEX1BST1RPQ09MIHRoZW4KKyAgICByZXR1cm4gJ0ludmFsaWQgcHJvdG9jb2wnCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLlVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFIHRoZW4KKyAgICByZXR1cm4gJ1Vuc3VwcG9ydGVkIGNsaWVudCB0eXBlJworICBlbHNlCisgICAgcmV0dXJuICdEZWZhdWx0ICh1bmtub3duKScKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEV4Y2VwdGlvbjpyZWFkKGlwcm90KQorICBpcHJvdDpyZWFkU3RydWN0QmVnaW4oKQorICB3aGlsZSB0cnVlIGRvCisgICAgbG9jYWwgZm5hbWUsIGZ0eXBlLCBmaWQgPSBpcHJvdDpyZWFkRmllbGRCZWdpbigpCisgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUCB0aGVuCisgICAgICBicmVhaworICAgIGVsc2VpZiBmaWQgPT0gMSB0aGVuCisgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkcgdGhlbgorICAgICAgICBzZWxmLm1lc3NhZ2UgPSBpcHJvdDpyZWFkU3RyaW5nKCkKKyAgICAgIGVsc2UKKyAgICAgICAgaXByb3Q6c2tpcChmdHlwZSkKKyAgICAgIGVuZAorICAgIGVsc2VpZiBmaWQgPT0gMiB0aGVuCisgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzIgdGhlbgorICAgICAgICBzZWxmLmVycm9yQ29kZSA9IGlwcm90OnJlYWRJMzIoKQorICAgICAgZWxzZQorICAgICAgICBpcHJvdDpza2lwKGZ0eXBlKQorICAgICAgZW5kCisgICAgZWxzZQorICAgICAgaXByb3Q6c2tpcChmdHlwZSkKKyAgICBlbmQKKyAgICBpcHJvdDpyZWFkRmllbGRFbmQoKQorICBlbmQKKyAgaXByb3Q6cmVhZFN0cnVjdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEV4Y2VwdGlvbjp3cml0ZShvcHJvdCkKKyAgb3Byb3Q6d3JpdGVTdHJ1Y3RCZWdpbignVEFwcGxpY2F0aW9uRXhjZXB0aW9uJykKKyAgaWYgc2VsZi5tZXNzYWdlIHRoZW4KKyAgICBvcHJvdDp3cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUVHlwZS5TVFJJTkcsIDEpCisgICAgb3Byb3Q6d3JpdGVTdHJpbmcoc2VsZi5tZXNzYWdlKQorICAgIG9wcm90OndyaXRlRmllbGRFbmQoKQorICBlbmQKKyAgaWYgc2VsZi5lcnJvckNvZGUgdGhlbgorICAgIG9wcm90OndyaXRlRmllbGRCZWdpbigndHlwZScsIFRUeXBlLkkzMiwgMikKKyAgICBvcHJvdDp3cml0ZUkzMihzZWxmLmVycm9yQ29kZSkKKyAgICBvcHJvdDp3cml0ZUZpZWxkRW5kKCkKKyAgZW5kCisgIG9wcm90OndyaXRlRmllbGRTdG9wKCkKKyAgb3Byb3Q6d3JpdGVTdHJ1Y3RFbmQoKQorZW5kCisKKy0tIEJhc2ljIENsaWVudCAodXNlZCBpbiBnZW5lcmF0ZWQgbHVhIGNvZGUpCitfX1RDbGllbnQgPSBfX1RPYmplY3Q6bmV3eworICBfX3R5cGUgPSAnX19UQ2xpZW50JywKKyAgX3NlcWlkID0gMAorfQorZnVuY3Rpb24gX19UQ2xpZW50Om5ldyhvYmopCisgIGlmIHR0eXBlKG9iaikgfj0gJ3RhYmxlJyB0aGVuCisgICAgZXJyb3IoJ1RDbGllbnQgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGEgdGFibGUnKQorICBlbmQKKworICAtLSBTZXQgaXByb3QgJiBvcHJvdAorICBpZiBvYmoucHJvdG9jb2wgdGhlbgorICAgIG9iai5pcHJvdCA9IG9iai5wcm90b2NvbAorICAgIG9iai5vcHJvdCA9IG9iai5wcm90b2NvbAorICAgIG9iai5wcm90b2NvbCA9IG5pbAorICBlbHNlaWYgbm90IG9iai5pcHJvdCB0aGVuCisgICAgZXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgJyAuLiB0dHlwZShzZWxmKSAuLiAnIHdpdGggYW4gaXByb3QnKQorICBlbmQKKyAgaWYgbm90IG9iai5vcHJvdCB0aGVuCisgICAgb2JqLm9wcm90ID0gb2JqLmlwcm90CisgIGVuZAorCisgIHJldHVybiBfX1RPYmplY3QubmV3KHNlbGYsIG9iaikKK2VuZAorCitmdW5jdGlvbiBfX1RDbGllbnQ6Y2xvc2UoKQorICBzZWxmLmlwcm90LnRyYW5zOmNsb3NlKCkKKyAgc2VsZi5vcHJvdC50cmFuczpjbG9zZSgpCitlbmQKKworLS0gQmFzaWMgUHJvY2Vzc29yICh1c2VkIGluIGdlbmVyYXRlZCBsdWEgY29kZSkKK19fVFByb2Nlc3NvciA9IF9fVE9iamVjdDpuZXd7CisgIF9fdHlwZSA9ICdfX1RQcm9jZXNzb3InCit9CitmdW5jdGlvbiBfX1RQcm9jZXNzb3I6bmV3KG9iaikKKyAgaWYgdHR5cGUob2JqKSB+PSAndGFibGUnIHRoZW4KKyAgICBlcnJvcignVFByb2Nlc3NvciBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYSB0YWJsZScpCisgIGVuZAorCisgIC0tIEVuc3VyZSBhIGhhbmRsZXIgaXMgcHJvdmlkZWQKKyAgaWYgbm90IG9iai5oYW5kbGVyIHRoZW4KKyAgICBlcnJvcignWW91IG11c3QgcHJvdmlkZSAnIC4uIHR0eXBlKHNlbGYpIC4uICcgd2l0aCBhIGhhbmRsZXInKQorICBlbmQKKworICByZXR1cm4gX19UT2JqZWN0Lm5ldyhzZWxmLCBvYmopCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9sdWEvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2x1YS9zcmMvbG9uZ251bWJlcnV0aWxzLmMgYi9saWIvbHVhL3NyYy9sb25nbnVtYmVydXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmM2Nzg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9zcmMvbG9uZ251bWJlcnV0aWxzLmMKQEAgLTAsMCArMSw0NyBAQAorLy8KKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKKyNpbmNsdWRlIDxsdWEuaD4KKyNpbmNsdWRlIDxsYXV4bGliLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworY29uc3QgY2hhciAqIExPTkdfTlVNX1RZUEUgPSAiX190aHJpZnRfbG9uZ251bWJlciI7CitpbnQ2NF90IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KSB7CisgIHN3aXRjaCAobHVhX3R5cGUoTCwgaW5kZXgpKSB7CisgICAgY2FzZSBMVUFfVE5VTUJFUjoKKyAgICAgIHJldHVybiAoaW50NjRfdClsdWFfdG9udW1iZXIoTCwgaW5kZXgpOworICAgIGNhc2UgTFVBX1RTVFJJTkc6CisgICAgICByZXR1cm4gYXRvbGwobHVhX3Rvc3RyaW5nKEwsIGluZGV4KSk7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAqKChpbnQ2NF90ICopbHVhTF9jaGVja3VkYXRhKEwsIGluZGV4LCBMT05HX05VTV9UWVBFKSk7CisgIH0KK30KKworLy8gQ3JlYXRlcyBhIG5ldyBsb25nbnVtYmVyIGFuZCBwdXNoZXMgaXQgb250byB0aGUgc3RhdGNrCitpbnQ2NF90ICogbHVhbG9uZ251bWJlcl9wdXNobG9uZyhsdWFfU3RhdGUgKkwsIGludDY0X3QgKnZhbCkgeworICBpbnQ2NF90ICpkYXRhID0gKGludDY0X3QgKilsdWFfbmV3dXNlcmRhdGEoTCwgc2l6ZW9mKGludDY0X3QpKTsgLy8gbG9uZ251bQorICBsdWFMX2dldG1ldGF0YWJsZShMLCBMT05HX05VTV9UWVBFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9uZ251bSwgbXQKKyAgbHVhX3NldG1ldGF0YWJsZShMLCAtMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvbmdudW0KKyAgaWYgKHZhbCkgeworICAgICpkYXRhID0gKnZhbDsKKyAgfQorICByZXR1cm4gZGF0YTsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2x1YS9zcmMvbHVhYml0d2lzZS5jIGIvbGliL2x1YS9zcmMvbHVhYml0d2lzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMDdlMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL3NyYy9sdWFiaXR3aXNlLmMKQEAgLTAsMCArMSw4MyBAQAorLy8KKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKKyNpbmNsdWRlIDxsdWEuaD4KKyNpbmNsdWRlIDxsYXV4bGliLmg+CisKK3N0YXRpYyBpbnQgbF9ub3QobHVhX1N0YXRlICpMKSB7CisgIGludCBhID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMSk7CisgIGEgPSB+YTsKKyAgbHVhX3B1c2hudW1iZXIoTCwgYSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGxfeG9yKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgYSA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDEpOworICBpbnQgYiA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDIpOworICBhIF49IGI7CisgIGx1YV9wdXNobnVtYmVyKEwsIGEpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBsX2FuZChsdWFfU3RhdGUgKkwpIHsKKyAgaW50IGEgPSBsdWFMX2NoZWNraW50ZWdlcihMLCAxKTsKKyAgaW50IGIgPSBsdWFMX2NoZWNraW50ZWdlcihMLCAyKTsKKyAgYSAmPSBiOworICBsdWFfcHVzaG51bWJlcihMLCBhKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbF9vcihsdWFfU3RhdGUgKkwpIHsKKyAgaW50IGEgPSBsdWFMX2NoZWNraW50ZWdlcihMLCAxKTsKKyAgaW50IGIgPSBsdWFMX2NoZWNraW50ZWdlcihMLCAyKTsKKyAgYSB8PSBiOworICBsdWFfcHVzaG51bWJlcihMLCBhKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbF9zaGlmdHIobHVhX1N0YXRlICpMKSB7CisgIGludCBhID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMSk7CisgIGludCBiID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMik7CisgIGEgPSBhID4+IGI7CisgIGx1YV9wdXNobnVtYmVyKEwsIGEpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBsX3NoaWZ0bChsdWFfU3RhdGUgKkwpIHsKKyAgaW50IGEgPSBsdWFMX2NoZWNraW50ZWdlcihMLCAxKTsKKyAgaW50IGIgPSBsdWFMX2NoZWNraW50ZWdlcihMLCAyKTsKKyAgYSA9IGEgPDwgYjsKKyAgbHVhX3B1c2hudW1iZXIoTCwgYSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGx1YUxfUmVnIGZ1bmNzW10gPSB7CisgIHsiYmFuZCIsIGxfYW5kfSwKKyAgeyJib3IiLCBsX29yfSwKKyAgeyJieG9yIiwgbF94b3J9LAorICB7ImJub3QiLCBsX25vdH0sCisgIHsic2hpZnRsIiwgbF9zaGlmdGx9LAorICB7InNoaWZ0ciIsIGxfc2hpZnRyfSwKKyAge05VTEwsIE5VTEx9Cit9OworCitpbnQgbHVhb3Blbl9saWJsdWFiaXR3aXNlKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX3JlZ2lzdGVyKEwsICJsaWJsdWFiaXR3aXNlIiwgZnVuY3MpOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYi9sdWEvc3JjL2x1YWJwYWNrLmMgYi9saWIvbHVhL3NyYy9sdWFicGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3N2I2YWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL3NyYy9sdWFicGFjay5jCkBAIC0wLDAgKzEsMzA4IEBACisvLworLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworI2luY2x1ZGUgPGx1YS5oPgorI2luY2x1ZGUgPGxhdXhsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworZXh0ZXJuIGludDY0X3QgbHVhbG9uZ251bWJlcl9jaGVja2xvbmcobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOworZXh0ZXJuIGludDY0X3QgbHVhbG9uZ251bWJlcl9wdXNobG9uZyhsdWFfU3RhdGUgKkwsIGludDY0X3QgKnZhbCk7CisKKy8vIGhvc3Qgb3JkZXIgdG8gbmV0d29yayBvcmRlciAoNjQtYml0KQorc3RhdGljIGludDY0X3QgVF9odG9ubGwodWludDY0X3QgZGF0YSkgeworICB1aW50MzJfdCBkMSA9IGh0b25sKCh1aW50MzJfdClkYXRhKTsKKyAgdWludDMyX3QgZDIgPSBodG9ubCgodWludDMyX3QpKGRhdGEgPj4gMzIpKTsKKyAgcmV0dXJuICgodWludDY0X3QpZDEgPDwgMzIpICsgKHVpbnQ2NF90KWQyOworfQorCisvLyBuZXR3b3JrIG9yZGVyIHRvIGhvc3Qgb3JkZXIgKDY0LWJpdCkKK3N0YXRpYyBpbnQ2NF90IFRfbnRvaGxsKHVpbnQ2NF90IGRhdGEpIHsKKyAgdWludDMyX3QgZDEgPSBudG9obCgodWludDMyX3QpZGF0YSk7CisgIHVpbnQzMl90IGQyID0gbnRvaGwoKHVpbnQzMl90KShkYXRhID4+IDMyKSk7CisgIHJldHVybiAoKHVpbnQ2NF90KWQxIDw8IDMyKSArICh1aW50NjRfdClkMjsKK30KKworLyoqCisgKiBicGFjayh0eXBlLCBkYXRhKQorICogIGMgLSBTaWduZWQgQnl0ZQorICogIHMgLSBTaWduZWQgU2hvcnQKKyAqICBpIC0gU2lnbmVkIEludAorICogIGwgLSBTaWduZWQgTG9uZworICogIGQgLSBEb3VibGUKKyAqLworc3RhdGljIGludCBsX2JwYWNrKGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBjaGFyICpjb2RlID0gbHVhTF9jaGVja3N0cmluZyhMLCAxKTsKKyAgbHVhTF9hcmdjaGVjayhMLCBjb2RlWzFdID09ICdcMCcsIDAsICJGb3JtYXQgY29kZSBtdXN0IGJlIG9uZSBjaGFyYWN0ZXIuIik7CisgIGx1YUxfQnVmZmVyIGJ1ZjsKKyAgbHVhTF9idWZmaW5pdChMLCAmYnVmKTsKKworICBzd2l0Y2ggKGNvZGVbMF0pIHsKKyAgICBjYXNlICdjJzogeworICAgICAgaW50OF90IGRhdGEgPSBsdWFMX2NoZWNrbnVtYmVyKEwsIDIpOworICAgICAgbHVhTF9hZGRsc3RyaW5nKCZidWYsICh2b2lkKikmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlICdzJzogeworICAgICAgaW50MTZfdCBkYXRhID0gbHVhTF9jaGVja251bWJlcihMLCAyKTsKKyAgICAgIGRhdGEgPSAoaW50MTZfdClodG9ucyhkYXRhKTsKKyAgICAgIGx1YUxfYWRkbHN0cmluZygmYnVmLCAodm9pZCopJmRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAnaSc6IHsKKyAgICAgIGludDMyX3QgZGF0YSA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDIpOworICAgICAgZGF0YSA9IChpbnQzMl90KWh0b25sKGRhdGEpOworICAgICAgbHVhTF9hZGRsc3RyaW5nKCZidWYsICh2b2lkKikmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlICdsJzogeworICAgICAgaW50NjRfdCBkYXRhID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMik7CisgICAgICBkYXRhID0gKGludDY0X3QpVF9odG9ubGwoZGF0YSk7CisgICAgICBsdWFMX2FkZGxzdHJpbmcoJmJ1ZiwgKHZvaWQqKSZkYXRhLCBzaXplb2YoZGF0YSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgJ2QnOiB7CisgICAgICBkb3VibGUgZGF0YSA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMik7CisgICAgICBsdWFMX2FkZGxzdHJpbmcoJmJ1ZiwgKHZvaWQqKSZkYXRhLCBzaXplb2YoZGF0YSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBsdWFMX2FyZ2NoZWNrKEwsIDAsIDAsICJJbnZhbGlkIGZvcm1hdCBjb2RlLiIpOworICB9CisKKyAgbHVhTF9wdXNocmVzdWx0KCZidWYpOworICByZXR1cm4gMTsKK30KKworLyoqCisgKiBidW5wYWNrKHR5cGUsIGRhdGEpCisgKiAgYyAtIFNpZ25lZCBCeXRlCisgKiAgQyAtIFVuc2lnbmVkIEJ5dGUKKyAqICBzIC0gU2lnbmVkIFNob3J0CisgKiAgaSAtIFNpZ25lZCBJbnQKKyAqICBsIC0gU2lnbmVkIExvbmcKKyAqICBkIC0gRG91YmxlCisgKi8KK3N0YXRpYyBpbnQgbF9idW5wYWNrKGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBjaGFyICpjb2RlID0gbHVhTF9jaGVja3N0cmluZyhMLCAxKTsKKyAgbHVhTF9hcmdjaGVjayhMLCBjb2RlWzFdID09ICdcMCcsIDAsICJGb3JtYXQgY29kZSBtdXN0IGJlIG9uZSBjaGFyYWN0ZXIuIik7CisgIGNvbnN0IGNoYXIgKmRhdGEgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDIpOworI2lmIExVQV9WRVJTSU9OX05VTSA+PSA1MDIKKyAgc2l6ZV90IGxlbiA9IGx1YV9yYXdsZW4oTCwgMik7CisjZWxzZQorICBzaXplX3QgbGVuID0gbHVhX29iamxlbihMLCAyKTsKKyNlbmRpZgorCisgIHN3aXRjaCAoY29kZVswXSkgeworICAgIGNhc2UgJ2MnOiB7CisgICAgICBpbnQ4X3QgdmFsOworICAgICAgbHVhTF9hcmdjaGVjayhMLCBsZW4gPT0gc2l6ZW9mKHZhbCksIDEsICJJbnZhbGlkIGlucHV0IHN0cmluZyBzaXplLiIpOworICAgICAgbWVtY3B5KCZ2YWwsIGRhdGEsIHNpemVvZih2YWwpKTsKKyAgICAgIGx1YV9wdXNobnVtYmVyKEwsIHZhbCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLyoqCisgICAgICogdW5wYWNrIHVuc2lnbmVkIEJ5dGUuCisgICAgICovCisgICAgY2FzZSAnQyc6IHsKKyAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgbHVhTF9hcmdjaGVjayhMLCBsZW4gPT0gc2l6ZW9mKHZhbCksIDEsICJJbnZhbGlkIGlucHV0IHN0cmluZyBzaXplLiIpOworICAgICAgbWVtY3B5KCZ2YWwsIGRhdGEsIHNpemVvZih2YWwpKTsKKyAgICAgIGx1YV9wdXNobnVtYmVyKEwsIHZhbCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAncyc6IHsKKyAgICAgIGludDE2X3QgdmFsOworICAgICAgbHVhTF9hcmdjaGVjayhMLCBsZW4gPT0gc2l6ZW9mKHZhbCksIDEsICJJbnZhbGlkIGlucHV0IHN0cmluZyBzaXplLiIpOworICAgICAgbWVtY3B5KCZ2YWwsIGRhdGEsIHNpemVvZih2YWwpKTsKKyAgICAgIHZhbCA9IChpbnQxNl90KW50b2hzKHZhbCk7CisgICAgICBsdWFfcHVzaG51bWJlcihMLCB2YWwpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgJ2knOiB7CisgICAgICBpbnQzMl90IHZhbDsKKyAgICAgIGx1YUxfYXJnY2hlY2soTCwgbGVuID09IHNpemVvZih2YWwpLCAxLCAiSW52YWxpZCBpbnB1dCBzdHJpbmcgc2l6ZS4iKTsKKyAgICAgIG1lbWNweSgmdmFsLCBkYXRhLCBzaXplb2YodmFsKSk7CisgICAgICB2YWwgPSAoaW50MzJfdCludG9obCh2YWwpOworICAgICAgbHVhX3B1c2hudW1iZXIoTCwgdmFsKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlICdsJzogeworICAgICAgaW50NjRfdCB2YWw7CisgICAgICBsdWFMX2FyZ2NoZWNrKEwsIGxlbiA9PSBzaXplb2YodmFsKSwgMSwgIkludmFsaWQgaW5wdXQgc3RyaW5nIHNpemUuIik7CisgICAgICBtZW1jcHkoJnZhbCwgZGF0YSwgc2l6ZW9mKHZhbCkpOworICAgICAgdmFsID0gKGludDY0X3QpVF9udG9obGwodmFsKTsKKyAgICAgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJnZhbCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAnZCc6IHsKKyAgICAgIGRvdWJsZSB2YWw7CisgICAgICBsdWFMX2FyZ2NoZWNrKEwsIGxlbiA9PSBzaXplb2YodmFsKSwgMSwgIkludmFsaWQgaW5wdXQgc3RyaW5nIHNpemUuIik7CisgICAgICBtZW1jcHkoJnZhbCwgZGF0YSwgc2l6ZW9mKHZhbCkpOworICAgICAgbHVhX3B1c2hudW1iZXIoTCwgdmFsKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgbHVhTF9hcmdjaGVjayhMLCAwLCAwLCAiSW52YWxpZCBmb3JtYXQgY29kZS4iKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworLyoqCisgKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgKi8KK3N0YXRpYyBpbnQgbF9pNjRUb1ppZ3phZyhsdWFfU3RhdGUgKkwpIHsKKyAgaW50NjRfdCBuID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMSk7CisgIGludDY0X3QgcmVzdWx0ID0gKG4gPDwgMSkgXiAobiA+PiA2Myk7CisgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJnJlc3VsdCk7CisgIHJldHVybiAxOworfQorLyoqCisgKiBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBpbnQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAqLworc3RhdGljIGludCBsX2kzMlRvWmlnemFnKGx1YV9TdGF0ZSAqTCkgeworICBpbnQzMl90IG4gPSBsdWFMX2NoZWNraW50ZWdlcihMLCAxKTsKKyAgdWludDMyX3QgcmVzdWx0ID0gKHVpbnQzMl90KShuIDw8IDEpIF4gKG4gPj4gMzEpOworICBsdWFfcHVzaG51bWJlcihMLCByZXN1bHQpOworICByZXR1cm4gMTsKK30KKworLyoqCisgKiBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCisgKi8KK3N0YXRpYyBpbnQgbF96aWd6YWdUb0kzMihsdWFfU3RhdGUgKkwpIHsKKyAgdWludDMyX3QgbiA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDEpOworICBpbnQzMl90IHJlc3VsdCA9IChpbnQzMl90KShuID4+IDEpIF4gKHVpbnQzMl90KSgtKGludDMyX3QpKG4gJiAxKSk7CisgIGx1YV9wdXNobnVtYmVyKEwsIHJlc3VsdCk7CisgIHJldHVybiAxOworfQorCisvKioKKyAqIENvbnZlcnQgZnJvbSB6aWd6YWcgbG9uZyB0byBsb25nLgorICovCitzdGF0aWMgaW50IGxfemlnemFnVG9JNjQobHVhX1N0YXRlICpMKSB7CisgIGludDY0X3QgbiA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDEpOworICBpbnQ2NF90IHJlc3VsdCA9IChpbnQ2NF90KShuID4+IDEpIF4gKHVpbnQ2NF90KSgtKGludDY0X3QpKG4gJiAxKSk7CisgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJnJlc3VsdCk7CisgIHJldHVybiAxOworfQorCisvKioKKyAqIENvbnZlcnQgYW4gaTMyIHRvIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgYnVmZmVyLgorICovCitzdGF0aWMgaW50IGxfdG9WYXJpbnQzMihsdWFfU3RhdGUgKkwpIHsKKyAgdWludDhfdCBidWZbNV07CisgIHVpbnQzMl90IG4gPSBsdWFMX2NoZWNraW50ZWdlcihMLCAxKTsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworCisgIHdoaWxlICgxKSB7CisgICAgaWYgKChuICYgfjB4N0YpID09IDApIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9IChpbnQ4X3QpbjsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KSgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICBuID4+PSA3OworICAgIH0KKyAgfQorICBsdWFfcHVzaGxzdHJpbmcoTCwgYnVmLCB3c2l6ZSk7CisgIHJldHVybiAxOworfQorCisvKioKKyAqIENvbnZlcnQgYW4gaTY0IHRvIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIGJ1ZmZlci4KKyAqLworc3RhdGljIGludCBsX3RvVmFyaW50NjQobHVhX1N0YXRlICpMKSB7CisgIHVpbnQ4X3QgZGF0YVsxMF07CisgIHVpbnQ2NF90IG4gPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKTsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworICBsdWFMX0J1ZmZlciBidWY7CisgIGx1YUxfYnVmZmluaXQoTCwgJmJ1Zik7CisKKyAgd2hpbGUgKDEpIHsKKyAgICBpZiAoKG4gJiB+MHg3RkwpID09IDApIHsKKyAgICAgIGRhdGFbd3NpemUrK10gPSAoaW50OF90KW47CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgZGF0YVt3c2l6ZSsrXSA9IChpbnQ4X3QpKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG4gPj49IDc7CisgICAgfQorICB9CisKKyAgbHVhTF9hZGRsc3RyaW5nKCZidWYsICh2b2lkKikmZGF0YSwgd3NpemUpOworICBsdWFMX3B1c2hyZXN1bHQoJmJ1Zik7CisgIHJldHVybiAxOworfQorCisvKioKKyAqIENvbnZlcnQgYSB2YXJpbnQgdG8gaTY0LgorICovCitzdGF0aWMgaW50IGxfZnJvbVZhcmludDY0KGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IHJlc3VsdDsKKyAgdWludDhfdCBieXRlID0gbHVhTF9jaGVja251bWJlcihMLCAxKTsKKyAgaW50MzJfdCBzaGlmdCA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMik7CisgIHVpbnQ2NF90IG4gPSAodWludDY0X3QpbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMyk7CisgIG4gfD0gKHVpbnQ2NF90KShieXRlICYgMHg3ZikgPDwgc2hpZnQ7CisKKyAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7CisgICAgcmVzdWx0ID0gKGludDY0X3QpKG4gPj4gMSkgXiAodWludDY0X3QpKC0oaW50NjRfdCkobiAmIDEpKTsKKyAgICBsdWFfcHVzaG51bWJlcihMLCAwKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSBuOworICAgIGx1YV9wdXNobnVtYmVyKEwsIDEpOworICB9CisgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJnJlc3VsdCk7CisgIHJldHVybiAyOworfQorCisvKioKKyAqIFRvIHBhY2sgbWVzc2FnZSB0eXBlIG9mIGNvbXBhY3QgcHJvdG9jb2wuCisgKi8KK3N0YXRpYyBpbnQgbF9wYWNrTWVzZ1R5cGUobHVhX1N0YXRlICpMKSB7CisgIGludDMyX3QgdmVyc2lvbl9uID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMSk7CisgIGludDMyX3QgdmVyc2lvbl9tYXNrID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMik7CisgIGludDMyX3QgbWVzc2FnZXR5cGUgPSBsdWFMX2NoZWNraW50ZWdlcihMLCAzKTsKKyAgaW50MzJfdCB0eXBlX3NoaWZ0X2Ftb3VudCA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDQpOworICBpbnQzMl90IHR5cGVfbWFzayA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDUpOworICBpbnQzMl90IHRvX21lc2dfdHlwZSA9ICh2ZXJzaW9uX24gJiB2ZXJzaW9uX21hc2spIHwKKyAgICAoKChpbnQzMl90KW1lc3NhZ2V0eXBlIDw8IHR5cGVfc2hpZnRfYW1vdW50KSAmIHR5cGVfbWFzayk7CisgIGx1YV9wdXNobnVtYmVyKEwsIHRvX21lc2dfdHlwZSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGx1YUxfUmVnIGx1YV9icGFja1tdID0geworICB7ImJwYWNrIiwgbF9icGFja30sCisgIHsiYnVucGFjayIsIGxfYnVucGFja30sCisgIHsiaTMyVG9aaWd6YWciLCBsX2kzMlRvWmlnemFnfSwKKyAgeyJpNjRUb1ppZ3phZyIsIGxfaTY0VG9aaWd6YWd9LAorICB7InppZ3phZ1RvSTMyIiwgbF96aWd6YWdUb0kzMn0sCisgIHsiemlnemFnVG9JNjQiLCBsX3ppZ3phZ1RvSTY0fSwKKyAgeyJ0b1ZhcmludDMyIiwgbF90b1ZhcmludDMyfSwKKyAgeyJ0b1ZhcmludDY0IiwgbF90b1ZhcmludDY0fSwKKyAgeyJmcm9tVmFyaW50NjQiLCBsX2Zyb21WYXJpbnQ2NH0sCisgIHsicGFja01lc2dUeXBlIiwgbF9wYWNrTWVzZ1R5cGV9LAorICB7TlVMTCwgTlVMTH0KK307CisKK2ludCBsdWFvcGVuX2xpYmx1YWJwYWNrKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX3JlZ2lzdGVyKEwsICJsaWJsdWFicGFjayIsIGx1YV9icGFjayk7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvbGliL2x1YS9zcmMvbHVhbG9uZ251bWJlci5jIGIvbGliL2x1YS9zcmMvbHVhbG9uZ251bWJlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMDFlNGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL3NyYy9sdWFsb25nbnVtYmVyLmMKQEAgLTAsMCArMSwyMjggQEAKKy8vCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLworCisjaW5jbHVkZSA8bHVhLmg+CisjaW5jbHVkZSA8bGF1eGxpYi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitleHRlcm4gY29uc3QgY2hhciAqIExPTkdfTlVNX1RZUEU7CitleHRlcm4gaW50NjRfdCBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7CitleHRlcm4gaW50NjRfdCBsdWFsb25nbnVtYmVyX3B1c2hsb25nKGx1YV9TdGF0ZSAqTCwgaW50NjRfdCAqdmFsKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQgbF9zZXJpYWxpemUoY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQ2NF90IHZhbCkgeworICBzbnByaW50ZihidWYsIGxlbiwgIiUiUFJJZDY0LCB2YWwpOworfQorCitzdGF0aWMgaW50NjRfdCBsX2Rlc2VyaWFsaXplKGNvbnN0IGNoYXIgKmJ1ZikgeworICBpbnQ2NF90IGRhdGE7CisgIGludCBydjsKKyAgLy8gU3VwcG9ydCBoZXggcHJlZml4ZWQgd2l0aCAnMHgnCisgIGlmIChzdHJzdHIoYnVmLCAiMHgiKSA9PSBidWYpIHsKKyAgICBydiA9IHNzY2FuZihidWYsICIlIlBSSXg2NCwgJmRhdGEpOworICB9IGVsc2UgeworICAgIHJ2ID0gc3NjYW5mKGJ1ZiwgIiUiUFJJZDY0LCAmZGF0YSk7CisgIH0KKyAgaWYgKHJ2ID09IDEpIHsKKyAgICByZXR1cm4gZGF0YTsKKyAgfQorICByZXR1cm4gMDsgLy8gRmFpbGVkCit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBpbnQgbF9uZXcobHVhX1N0YXRlICpMKSB7CisgIGludDY0X3QgdmFsOworICBjb25zdCBjaGFyICpzdHIgPSBOVUxMOworICBpZiAobHVhX3R5cGUoTCwgMSkgPT0gTFVBX1RTVFJJTkcpIHsKKyAgICBzdHIgPSBsdWFfdG9zdHJpbmcoTCwgMSk7CisgICAgdmFsID0gbF9kZXNlcmlhbGl6ZShzdHIpOworICB9IGVsc2UgaWYgKGx1YV90eXBlKEwsIDEpID09IExVQV9UTlVNQkVSKSB7CisgICAgdmFsID0gKGludDY0X3QpbHVhX3RvbnVtYmVyKEwsIDEpOworICAgIHN0ciA9IChjb25zdCBjaGFyICopMTsKKyAgfQorICBsdWFsb25nbnVtYmVyX3B1c2hsb25nKEwsIChzdHIgPyAmdmFsIDogTlVMTCkpOworICByZXR1cm4gMTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gYSArIGIKK3N0YXRpYyBpbnQgbF9hZGQobHVhX1N0YXRlICpMKSB7CisgIGludDY0X3QgYSwgYiwgYzsKKyAgYSA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDEpOworICBiID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMik7CisgIGMgPSBhICsgYjsKKyAgbHVhbG9uZ251bWJlcl9wdXNobG9uZyhMLCAmYyk7CisgIHJldHVybiAxOworfQorCisvLyBhIC8gYgorc3RhdGljIGludCBsX2RpdihsdWFfU3RhdGUgKkwpIHsKKyAgaW50NjRfdCBhLCBiLCBjOworICBhID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMSk7CisgIGIgPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAyKTsKKyAgYyA9IGEgLyBiOworICBsdWFsb25nbnVtYmVyX3B1c2hsb25nKEwsICZjKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIGEgPT0gYiAoYm90aCBhIGFuZCBiIGFyZSBsdWFsb25nbnVtYmVyJ3MpCitzdGF0aWMgaW50IGxfZXEobHVhX1N0YXRlICpMKSB7CisgIGludDY0X3QgYSwgYjsKKyAgYSA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDEpOworICBiID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMik7CisgIGx1YV9wdXNoYm9vbGVhbihMLCAoYSA9PSBiID8gMSA6IDApKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIGdhcmJhZ2UgY29sbGVjdGlvbgorc3RhdGljIGludCBsX2djKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfcHVzaG5pbChMKTsKKyAgbHVhX3NldG1ldGF0YWJsZShMLCAxKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIGEgPCBiCitzdGF0aWMgaW50IGxfbHQobHVhX1N0YXRlICpMKSB7CisgIGludDY0X3QgYSwgYjsKKyAgYSA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDEpOworICBiID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMik7CisgIGx1YV9wdXNoYm9vbGVhbihMLCAoYSA8IGIgPyAxIDogMCkpOworICByZXR1cm4gMTsKK30KKworLy8gYSA8PSBiCitzdGF0aWMgaW50IGxfbGUobHVhX1N0YXRlICpMKSB7CisgIGludDY0X3QgYSwgYjsKKyAgYSA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDEpOworICBiID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMik7CisgIGx1YV9wdXNoYm9vbGVhbihMLCAoYSA8PSBiID8gMSA6IDApKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIGEgJSBiCitzdGF0aWMgaW50IGxfbW9kKGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IGEsIGIsIGM7CisgIGEgPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKTsKKyAgYiA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDIpOworICBjID0gYSAlIGI7CisgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJmMpOworICByZXR1cm4gMTsKK30KKworLy8gYSAqIGIKK3N0YXRpYyBpbnQgbF9tdWwobHVhX1N0YXRlICpMKSB7CisgIGludDY0X3QgYSwgYiwgYzsKKyAgYSA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDEpOworICBiID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMik7CisgIGMgPSBhICogYjsKKyAgbHVhbG9uZ251bWJlcl9wdXNobG9uZyhMLCAmYyk7CisgIHJldHVybiAxOworfQorCisvLyBhIF4gYgorc3RhdGljIGludCBsX3BvdyhsdWFfU3RhdGUgKkwpIHsKKyAgbG9uZyBkb3VibGUgYSwgYjsKKyAgaW50NjRfdCBjOworICBhID0gKGxvbmcgZG91YmxlKWx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDEpOworICBiID0gKGxvbmcgZG91YmxlKWx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDIpOworICBjID0gKGludDY0X3QpcG93KGEsIGIpOworICBsdWFsb25nbnVtYmVyX3B1c2hsb25nKEwsICZjKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIGEgLSBiCitzdGF0aWMgaW50IGxfc3ViKGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IGEsIGIsIGM7CisgIGEgPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKTsKKyAgYiA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDIpOworICBjID0gYSAtIGI7CisgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJmMpOworICByZXR1cm4gMTsKK30KKworLy8gdG9zdHJpbmcoKQorc3RhdGljIGludCBsX3Rvc3RyaW5nKGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IGE7CisgIGNoYXIgc3RyWzI1Nl07CisgIGxfc2VyaWFsaXplKHN0ciwgMjU2LCBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKSk7CisgIGx1YV9wdXNoc3RyaW5nKEwsIHN0cik7CisgIHJldHVybiAxOworfQorCisvLyAtYQorc3RhdGljIGludCBsX3VubShsdWFfU3RhdGUgKkwpIHsKKyAgaW50NjRfdCBhLCBjOworICBhID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMSk7CisgIGMgPSAtYTsKKyAgbHVhbG9uZ251bWJlcl9wdXNobG9uZyhMLCAmYyk7CisgIHJldHVybiAxOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgY29uc3QgbHVhTF9SZWcgbWV0aG9kc1tdID0geworICB7Il9fYWRkIiwgbF9hZGR9LAorICB7Il9fZGl2IiwgbF9kaXZ9LAorICB7Il9fZXEiLCBsX2VxfSwKKyAgeyJfX2djIiwgbF9nY30sCisgIHsiX19sdCIsIGxfbHR9LAorICB7Il9fbGUiLCBsX2xlfSwKKyAgeyJfX21vZCIsIGxfbW9kfSwKKyAgeyJfX211bCIsIGxfbXVsfSwKKyAgeyJfX3BvdyIsIGxfcG93fSwKKyAgeyJfX3N1YiIsIGxfc3VifSwKKyAgeyJfX3Rvc3RyaW5nIiwgbF90b3N0cmluZ30sCisgIHsiX191bm0iLCBsX3VubX0sCisgIHtOVUxMLCBOVUxMfSwKK307CisKK3N0YXRpYyBjb25zdCBsdWFMX1JlZyBmdW5jc1tdID0geworICB7Im5ldyIsIGxfbmV3fSwKKyAge05VTEwsIE5VTEx9Cit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCBzZXRfbWV0aG9kcyhsdWFfU3RhdGUgKkwsCisgIGNvbnN0IGNoYXIgKm1ldGF0YWJsZW5hbWUsCisgIGNvbnN0IHN0cnVjdCBsdWFMX1JlZyAqbWV0aG9kcykgeworICBsdWFMX2dldG1ldGF0YWJsZShMLCBtZXRhdGFibGVuYW1lKTsgICAvLyBtdAorICAvLyBObyBuZWVkIGZvciBhIF9faW5kZXggdGFibGUgc2luY2UgZXZlcnl0aGluZyBpcyBfXyoKKyAgZm9yICg7IG1ldGhvZHMtPm5hbWU7IG1ldGhvZHMrKykgeworICAgIGx1YV9wdXNoc3RyaW5nKEwsIG1ldGhvZHMtPm5hbWUpOyAgICAvLyBtdCwgIm5hbWUiCisgICAgbHVhX3B1c2hjZnVuY3Rpb24oTCwgbWV0aG9kcy0+ZnVuYyk7IC8vIG10LCAibmFtZSIsIGZ1bmMKKyAgICBsdWFfcmF3c2V0KEwsIC0zKTsgICAgICAgICAgICAgICAgICAgLy8gbXQKKyAgfQorICBsdWFfcG9wKEwsIDEpOworfQorCitMVUFMSUJfQVBJIGludCBsdWFvcGVuX2xpYmx1YWxvbmdudW1iZXIobHVhX1N0YXRlICpMKSB7CisgIGx1YUxfbmV3bWV0YXRhYmxlKEwsIExPTkdfTlVNX1RZUEUpOworICBsdWFfcG9wKEwsIDEpOworICBzZXRfbWV0aG9kcyhMLCBMT05HX05VTV9UWVBFLCBtZXRob2RzKTsKKworICBsdWFMX3JlZ2lzdGVyKEwsICJsaWJsdWFsb25nbnVtYmVyIiwgZnVuY3MpOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYi9sdWEvc3JjL2x1YXNvY2tldC5jIGIvbGliL2x1YS9zcmMvbHVhc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ4MzUxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvc3JjL2x1YXNvY2tldC5jCkBAIC0wLDAgKzEsMzgwIEBACisvLworLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworI2luY2x1ZGUgPGx1YS5oPgorI2luY2x1ZGUgPGxhdXhsaWIuaD4KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgInN0cmluZy5oIgorI2luY2x1ZGUgInNvY2tldC5oIgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgY29uc3QgY2hhciAqU09DS0VUX0FOWSAgICAgPSAiX190aHJpZnRfc29ja2V0X2FueSI7CitzdGF0aWMgY29uc3QgY2hhciAqU09DS0VUX0NPTk4gICAgPSAiX190aHJpZnRfc29ja2V0X2Nvbm5lY3RlZCI7CisKK3N0YXRpYyBjb25zdCBjaGFyICpTT0NLRVRfR0VORVJJQyA9ICJfX3RocmlmdF9zb2NrZXRfZ2VuZXJpYyI7CitzdGF0aWMgY29uc3QgY2hhciAqU09DS0VUX0NMSUVOVCAgPSAiX190aHJpZnRfc29ja2V0X2NsaWVudCI7CitzdGF0aWMgY29uc3QgY2hhciAqU09DS0VUX1NFUlZFUiAgPSAiX190aHJpZnRfc29ja2V0X3NlcnZlciI7CisKK3N0YXRpYyBjb25zdCBjaGFyICpERUZBVUxUX0hPU1QgICA9ICJsb2NhbGhvc3QiOworCit0eXBlZGVmIHN0cnVjdCBfX3RfdGNwIHsKKyAgdF9zb2NrZXQgc29jazsKKyAgaW50IHRpbWVvdXQ7IC8vIE1pbGxpc2Vjb25kcworfSB0X3RjcDsKK3R5cGVkZWYgdF90Y3AgKnBfdGNwOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVXRpbAorCitzdGF0aWMgdm9pZCB0aHJvd19hcmdlcnJvcihsdWFfU3RhdGUgKkwsIGludCBpbmRleCwgY29uc3QgY2hhciAqZXhwZWN0ZWQpIHsKKyAgY2hhciBtc2dbMjU2XTsKKyAgc3ByaW50Zihtc2csICIlcyBleHBlY3RlZCwgZ290ICVzIiwgZXhwZWN0ZWQsIGx1YUxfdHlwZW5hbWUoTCwgaW5kZXgpKTsKKyAgbHVhTF9hcmdlcnJvcihMLCBpbmRleCwgbXNnKTsKK30KKworc3RhdGljIHZvaWQgKmNoZWNrZ3JvdXAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKmdyb3VwbmFtZSkgeworICBpZiAoIWx1YV9nZXRtZXRhdGFibGUoTCwgaW5kZXgpKSB7CisgICAgdGhyb3dfYXJnZXJyb3IoTCwgaW5kZXgsIGdyb3VwbmFtZSk7CisgIH0KKworICBsdWFfcHVzaHN0cmluZyhMLCBncm91cG5hbWUpOworICBsdWFfcmF3Z2V0KEwsIC0yKTsKKyAgaWYgKGx1YV9pc25pbChMLCAtMSkpIHsKKyAgICBsdWFfcG9wKEwsIDIpOworICAgIHRocm93X2FyZ2Vycm9yKEwsIGluZGV4LCBncm91cG5hbWUpOworICB9IGVsc2UgeworICAgIGx1YV9wb3AoTCwgMik7CisgICAgcmV0dXJuIGx1YV90b3VzZXJkYXRhKEwsIGluZGV4KTsKKyAgfQorICByZXR1cm4gTlVMTDsgLy8gTm90IHJlYWNoYWJsZQorfQorCitzdGF0aWMgdm9pZCAqY2hlY2t0eXBlKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4LCBjb25zdCBjaGFyICp0eXBlbmFtZSkgeworICBpZiAoc3RyY21wKHR5cGVuYW1lLCBTT0NLRVRfQU5ZKSA9PSAwIHx8CisgICAgICBzdHJjbXAodHlwZW5hbWUsIFNPQ0tFVF9DT05OKSA9PSAwKSB7CisgICAgcmV0dXJuIGNoZWNrZ3JvdXAoTCwgaW5kZXgsIHR5cGVuYW1lKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbHVhTF9jaGVja3VkYXRhKEwsIGluZGV4LCB0eXBlbmFtZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgc2V0dHlwZShsdWFfU3RhdGUgKkwsIGludCBpbmRleCwgY29uc3QgY2hhciAqdHlwZW5hbWUpIHsKKyAgbHVhTF9nZXRtZXRhdGFibGUoTCwgdHlwZW5hbWUpOworICBsdWFfc2V0bWV0YXRhYmxlKEwsIGluZGV4KTsKK30KKworI2RlZmluZSBMVUFfU1VDQ0VTU19SRVRVUk4oTCkgXAorICBsdWFfcHVzaG51bWJlcihMLCAxKTsgXAorICByZXR1cm4gMQorCisjZGVmaW5lIExVQV9DSEVDS19SRVRVUk4oTCwgZXJyKSBcCisgIGlmIChlcnIpIHsgXAorICAgIGx1YV9wdXNobmlsKEwpOyBcCisgICAgbHVhX3B1c2hzdHJpbmcoTCwgZXJyKTsgXAorICAgIHJldHVybiAyOyBcCisgIH0gXAorICBMVUFfU1VDQ0VTU19SRVRVUk4oTCkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGludCBsX3NvY2tldF9jcmVhdGUobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbF9zb2NrZXRfZGVzdHJveShsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBsX3NvY2tldF9zZXR0aW1lb3V0KGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IGxfc29ja2V0X2dldHNvY2tpbmZvKGx1YV9TdGF0ZSAqTCk7CisKK3N0YXRpYyBpbnQgbF9zb2NrZXRfYWNjZXB0KGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IGxfc29ja2V0X2xpc3RlbihsdWFfU3RhdGUgKkwpOworCitzdGF0aWMgaW50IGxfc29ja2V0X2NyZWF0ZV9hbmRfY29ubmVjdChsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBsX3NvY2tldF9jb25uZWN0KGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IGxfc29ja2V0X3NlbmQobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbF9zb2NrZXRfcmVjZWl2ZShsdWFfU3RhdGUgKkwpOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGx1YUxfUmVnIG1ldGhvZHNfZ2VuZXJpY1tdID0geworICB7ImRlc3Ryb3kiLCAgICAgbF9zb2NrZXRfZGVzdHJveX0sCisgIHsic2V0dGltZW91dCIsICBsX3NvY2tldF9zZXR0aW1lb3V0fSwKKyAgeyJnZXRzb2NraW5mbyIsIGxfc29ja2V0X2dldHNvY2tpbmZvfSwKKyAgeyJsaXN0ZW4iLCAgICAgIGxfc29ja2V0X2xpc3Rlbn0sCisgIHsiY29ubmVjdCIsICAgICBsX3NvY2tldF9jb25uZWN0fSwKKyAge05VTEwsIE5VTEx9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGx1YUxfUmVnIG1ldGhvZHNfc2VydmVyW10gPSB7CisgIHsiZGVzdHJveSIsICAgICBsX3NvY2tldF9kZXN0cm95fSwKKyAgeyJnZXRzb2NraW5mbyIsIGxfc29ja2V0X2dldHNvY2tpbmZvfSwKKyAgeyJhY2NlcHQiLCAgICAgIGxfc29ja2V0X2FjY2VwdH0sCisgIHsic2VuZCIsICAgICAgICBsX3NvY2tldF9zZW5kfSwKKyAgeyJyZWNlaXZlIiwgICAgIGxfc29ja2V0X3JlY2VpdmV9LAorICB7TlVMTCwgTlVMTH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbHVhTF9SZWcgbWV0aG9kc19jbGllbnRbXSA9IHsKKyAgeyJkZXN0cm95IiwgICAgIGxfc29ja2V0X2Rlc3Ryb3l9LAorICB7InNldHRpbWVvdXQiLCAgbF9zb2NrZXRfc2V0dGltZW91dH0sCisgIHsiZ2V0c29ja2luZm8iLCBsX3NvY2tldF9nZXRzb2NraW5mb30sCisgIHsic2VuZCIsICAgICAgICBsX3NvY2tldF9zZW5kfSwKKyAgeyJyZWNlaXZlIiwgICAgIGxfc29ja2V0X3JlY2VpdmV9LAorICB7TlVMTCwgTlVMTH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbHVhTF9SZWcgZnVuY3NfbHVhc29ja2V0W10gPSB7CisgIHsiY3JlYXRlIiwgICAgICAgICAgICAgbF9zb2NrZXRfY3JlYXRlfSwKKyAgeyJjcmVhdGVfYW5kX2Nvbm5lY3QiLCBsX3NvY2tldF9jcmVhdGVfYW5kX2Nvbm5lY3R9LAorICB7TlVMTCwgTlVMTH0KK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIENoZWNrL2VuZm9yY2UgaW5oZXJpdGFuY2UKK3N0YXRpYyB2b2lkIGFkZF90b19ncm91cChsdWFfU3RhdGUgKkwsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZXRhdGFibGVuYW1lLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZ3JvdXBuYW1lKSB7CisgIGx1YUxfZ2V0bWV0YXRhYmxlKEwsIG1ldGF0YWJsZW5hbWUpOyAvLyBtdAorICBsdWFfcHVzaHN0cmluZyhMLCBncm91cG5hbWUpOyAgICAgICAgLy8gbXQsICJuYW1lIgorICBsdWFfcHVzaGJvb2xlYW4oTCwgMSk7ICAgICAgICAgICAgICAgLy8gbXQsICJuYW1lIiwgdHJ1ZQorICBsdWFfcmF3c2V0KEwsIC0zKTsgICAgICAgICAgICAgICAgICAgLy8gbXQKKyAgbHVhX3BvcChMLCAxKTsKK30KKworc3RhdGljIHZvaWQgc2V0X21ldGhvZHMobHVhX1N0YXRlICpMLAorICBjb25zdCBjaGFyICptZXRhdGFibGVuYW1lLAorICBjb25zdCBzdHJ1Y3QgbHVhTF9SZWcgKm1ldGhvZHMpIHsKKyAgbHVhTF9nZXRtZXRhdGFibGUoTCwgbWV0YXRhYmxlbmFtZSk7ICAgLy8gbXQKKyAgLy8gQ3JlYXRlIHRoZSBfX2luZGV4IHRhYmxlCisgIGx1YV9wdXNoc3RyaW5nKEwsICJfX2luZGV4Iik7ICAgICAgICAgIC8vIG10LCAiX19pbmRleCIKKyAgbHVhX25ld3RhYmxlKEwpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gbXQsICJfX2luZGV4IiwgdAorICBmb3IgKDsgbWV0aG9kcy0+bmFtZTsgbWV0aG9kcysrKSB7CisgICAgbHVhX3B1c2hzdHJpbmcoTCwgbWV0aG9kcy0+bmFtZSk7ICAgIC8vIG10LCAiX19pbmRleCIsIHQsICJuYW1lIgorICAgIGx1YV9wdXNoY2Z1bmN0aW9uKEwsIG1ldGhvZHMtPmZ1bmMpOyAvLyBtdCwgIl9faW5kZXgiLCB0LCAibmFtZSIsIGZ1bmMKKyAgICBsdWFfcmF3c2V0KEwsIC0zKTsgICAgICAgICAgICAgICAgICAgLy8gbXQsICJfX2luZGV4IiwgdAorICB9CisgIGx1YV9yYXdzZXQoTCwgLTMpOyAgICAgICAgICAgICAgICAgICAgIC8vIG10CisgIGx1YV9wb3AoTCwgMSk7Cit9CisKK2ludCBsdWFvcGVuX2xpYmx1YXNvY2tldChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhTF9uZXdtZXRhdGFibGUoTCwgU09DS0VUX0dFTkVSSUMpOworICBsdWFMX25ld21ldGF0YWJsZShMLCBTT0NLRVRfQ0xJRU5UKTsKKyAgbHVhTF9uZXdtZXRhdGFibGUoTCwgU09DS0VUX1NFUlZFUik7CisgIGx1YV9wb3AoTCwgMyk7CisgIGFkZF90b19ncm91cChMLCBTT0NLRVRfR0VORVJJQywgU09DS0VUX0FOWSk7CisgIGFkZF90b19ncm91cChMLCBTT0NLRVRfQ0xJRU5ULCBTT0NLRVRfQU5ZKTsKKyAgYWRkX3RvX2dyb3VwKEwsIFNPQ0tFVF9TRVJWRVIsIFNPQ0tFVF9BTlkpOworICBhZGRfdG9fZ3JvdXAoTCwgU09DS0VUX0NMSUVOVCwgU09DS0VUX0NPTk4pOworICBhZGRfdG9fZ3JvdXAoTCwgU09DS0VUX1NFUlZFUiwgU09DS0VUX0NPTk4pOworICBzZXRfbWV0aG9kcyhMLCBTT0NLRVRfR0VORVJJQywgbWV0aG9kc19nZW5lcmljKTsKKyAgc2V0X21ldGhvZHMoTCwgU09DS0VUX0NMSUVOVCwgbWV0aG9kc19jbGllbnQpOworICBzZXRfbWV0aG9kcyhMLCBTT0NLRVRfU0VSVkVSLCBtZXRob2RzX3NlcnZlcik7CisKKyAgbHVhTF9yZWdpc3RlcihMLCAibHVhc29ja2V0IiwgZnVuY3NfbHVhc29ja2V0KTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBHZW5lcmFsCisKKy8vIHNvY2ssZXJyIGNyZWF0ZShiaW5kX2hvc3QsIGJpbmRfcG9ydCkKKy8vIHNvY2ssZXJyIGNyZWF0ZShiaW5kX2hvc3QpIC0+IGFueSBwb3J0CisvLyBzb2NrLGVyciBjcmVhdGUoKSAtPiBhbnkgcG9ydCBvbiBsb2NhbGhvc3QKK3N0YXRpYyBpbnQgbF9zb2NrZXRfY3JlYXRlKGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBjaGFyICplcnI7CisgIHRfc29ja2V0IHNvY2s7CisgIGNvbnN0IGNoYXIgKmFkZHIgPSBsdWFfdG9zdHJpbmcoTCwgMSk7CisgIGlmICghYWRkcikgeworICAgIGFkZHIgPSBERUZBVUxUX0hPU1Q7CisgIH0KKyAgdW5zaWduZWQgc2hvcnQgcG9ydCA9IGx1YV90b251bWJlcihMLCAyKTsKKyAgZXJyID0gdGNwX2NyZWF0ZSgmc29jayk7CisgIGlmICghZXJyKSB7CisgICAgZXJyID0gdGNwX2JpbmQoJnNvY2ssIGFkZHIsIHBvcnQpOyAvLyBiaW5kIG9uIGNyZWF0ZQorICAgIGlmIChlcnIpIHsKKyAgICAgIHRjcF9kZXN0cm95KCZzb2NrKTsKKyAgICB9IGVsc2UgeworICAgICAgcF90Y3AgdGNwID0gKHBfdGNwKSBsdWFfbmV3dXNlcmRhdGEoTCwgc2l6ZW9mKHRfdGNwKSk7CisgICAgICBzZXR0eXBlKEwsIC0yLCBTT0NLRVRfR0VORVJJQyk7CisgICAgICBzb2NrZXRfc2V0bm9uYmxvY2tpbmcoJnNvY2spOworICAgICAgdGNwLT5zb2NrID0gc29jazsKKyAgICAgIHRjcC0+dGltZW91dCA9IDA7CisgICAgICByZXR1cm4gMTsgLy8gUmV0dXJuIHVzZXJkYXRhCisgICAgfQorICB9CisgIExVQV9DSEVDS19SRVRVUk4oTCwgZXJyKTsKK30KKworLy8gZGVzdHJveSgpCitzdGF0aWMgaW50IGxfc29ja2V0X2Rlc3Ryb3kobHVhX1N0YXRlICpMKSB7CisgIHBfdGNwIHRjcCA9IChwX3RjcCkgY2hlY2t0eXBlKEwsIDEsIFNPQ0tFVF9BTlkpOworICBjb25zdCBjaGFyICplcnIgPSB0Y3BfZGVzdHJveSgmdGNwLT5zb2NrKTsKKyAgTFVBX0NIRUNLX1JFVFVSTihMLCBlcnIpOworfQorCisvLyBzZW5kKHNvY2tldCwgZGF0YSkKK3N0YXRpYyBpbnQgbF9zb2NrZXRfc2VuZChsdWFfU3RhdGUgKkwpIHsKKyAgcF90Y3Agc2VsZiA9IChwX3RjcCkgY2hlY2t0eXBlKEwsIDEsIFNPQ0tFVF9DT05OKTsKKyAgcF90Y3AgdGNwID0gKHBfdGNwKSBjaGVja3R5cGUoTCwgMiwgU09DS0VUX0NPTk4pOworICBzaXplX3QgbGVuOworICBjb25zdCBjaGFyICpkYXRhID0gbHVhTF9jaGVja2xzdHJpbmcoTCwgMywgJmxlbik7CisgIGNvbnN0IGNoYXIgKmVyciA9CisgICAgdGNwX3NlbmQoJnRjcC0+c29jaywgZGF0YSwgbGVuLCB0Y3AtPnRpbWVvdXQpOworICBMVUFfQ0hFQ0tfUkVUVVJOKEwsIGVycik7Cit9CisKKyNkZWZpbmUgTFVBX1JFQURfU1RFUCA4MTkyCitzdGF0aWMgaW50IGxfc29ja2V0X3JlY2VpdmUobHVhX1N0YXRlICpMKSB7CisgIHBfdGNwIHNlbGYgPSAocF90Y3ApIGNoZWNrdHlwZShMLCAxLCBTT0NLRVRfQ09OTik7CisgIHBfdGNwIGhhbmRsZSA9IChwX3RjcCkgY2hlY2t0eXBlKEwsIDIsIFNPQ0tFVF9DT05OKTsKKyAgc2l6ZV90IGxlbiA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMyk7CisgIGNoYXIgYnVmW0xVQV9SRUFEX1NURVBdOworICBjb25zdCBjaGFyICplcnIgPSBOVUxMOworICBpbnQgcmVjZWl2ZWQ7CisgIHNpemVfdCBnb3QgPSAwLCBzdGVwID0gMDsKKyAgbHVhTF9CdWZmZXIgYjsKKworICBsdWFMX2J1ZmZpbml0KEwsICZiKTsKKyAgZG8geworICAgIHN0ZXAgPSAoTFVBX1JFQURfU1RFUCA8IGxlbiAtIGdvdCA/IExVQV9SRUFEX1NURVAgOiBsZW4gLSBnb3QpOworICAgIGVyciA9IHRjcF9yYXdfcmVjZWl2ZSgmaGFuZGxlLT5zb2NrLCBidWYsIHN0ZXAsIHNlbGYtPnRpbWVvdXQsICZyZWNlaXZlZCk7CisgICAgaWYgKGVyciA9PSBOVUxMKSB7CisgICAgICBsdWFMX2FkZGxzdHJpbmcoJmIsIGJ1ZiwgcmVjZWl2ZWQpOworICAgICAgZ290ICs9IHJlY2VpdmVkOworICAgIH0KKyAgfSB3aGlsZSAoZXJyID09IE5VTEwgJiYgZ290IDwgbGVuKTsKKworICBpZiAoZXJyKSB7CisgICAgbHVhX3B1c2huaWwoTCk7CisgICAgbHVhX3B1c2hzdHJpbmcoTCwgZXJyKTsKKyAgICByZXR1cm4gMjsKKyAgfQorICBsdWFMX3B1c2hyZXN1bHQoJmIpOworICByZXR1cm4gMTsKK30KKworLy8gc2V0dGltZW91dCh0aW1lb3V0KQorc3RhdGljIGludCBsX3NvY2tldF9zZXR0aW1lb3V0KGx1YV9TdGF0ZSAqTCkgeworICBwX3RjcCBzZWxmID0gKHBfdGNwKSBjaGVja3R5cGUoTCwgMSwgU09DS0VUX0FOWSk7CisgIGludCB0aW1lb3V0ID0gbHVhTF9jaGVja251bWJlcihMLCAyKTsKKyAgc2VsZi0+dGltZW91dCA9IHRpbWVvdXQ7CisgIExVQV9TVUNDRVNTX1JFVFVSTihMKTsKK30KKworLy8gdGFibGUgZ2V0c29ja2luZm8oKQorc3RhdGljIGludCBsX3NvY2tldF9nZXRzb2NraW5mbyhsdWFfU3RhdGUgKkwpIHsKKyAgY2hhciBidWZbMjU2XTsKKyAgc2hvcnQgcG9ydCA9IDA7CisgIHBfdGNwIHRjcCA9IChwX3RjcCkgY2hlY2t0eXBlKEwsIDEsIFNPQ0tFVF9BTlkpOworICBpZiAoc29ja2V0X2dldF9pbmZvKCZ0Y3AtPnNvY2ssICZwb3J0LCBidWYsIDI1NikgPT0gU1VDQ0VTUykgeworICAgIGx1YV9uZXd0YWJsZShMKTsgICAgICAgICAgICAgICAgICAgIC8vIHQKKyAgICBsdWFfcHVzaHN0cmluZyhMLCAiaG9zdCIpOyAgICAgICAgICAvLyB0LCAiaG9zdCIKKyAgICBsdWFfcHVzaHN0cmluZyhMLCBidWYpOyAgICAgICAgICAgICAvLyB0LCAiaG9zdCIsIGJ1ZgorICAgIGx1YV9yYXdzZXQoTCwgLTMpOyAgICAgICAgICAgICAgICAgIC8vIHQKKyAgICBsdWFfcHVzaHN0cmluZyhMLCAicG9ydCIpOyAgICAgICAgICAvLyB0LCAicG9ydCIKKyAgICBsdWFfcHVzaG51bWJlcihMLCBwb3J0KTsgICAgICAgICAgICAvLyB0LCAicG9ydCIsIHBvcnQKKyAgICBsdWFfcmF3c2V0KEwsIC0zKTsgICAgICAgICAgICAgICAgICAvLyB0CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTZXJ2ZXIKKworLy8gYWNjZXB0KCkKK3N0YXRpYyBpbnQgbF9zb2NrZXRfYWNjZXB0KGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBjaGFyICplcnI7CisgIHBfdGNwIHNlbGYgPSAocF90Y3ApIGNoZWNrdHlwZShMLCAxLCBTT0NLRVRfU0VSVkVSKTsKKyAgdF9zb2NrZXQgc29jazsKKyAgZXJyID0gdGNwX2FjY2VwdCgmc2VsZi0+c29jaywgJnNvY2ssIHNlbGYtPnRpbWVvdXQpOworICBpZiAoIWVycikgeyAvLyBTdWNjZXNzCisgICAgLy8gQ3JlYXRlIGEgcmVmZXJlbmNlIHRvIHRoZSBjbGllbnQKKyAgICBwX3RjcCBjbGllbnQgPSAocF90Y3ApIGx1YV9uZXd1c2VyZGF0YShMLCBzaXplb2YodF90Y3ApKTsKKyAgICBzZXR0eXBlKEwsIDIsIFNPQ0tFVF9DTElFTlQpOworICAgIHNvY2tldF9zZXRub25ibG9ja2luZygmc29jayk7CisgICAgY2xpZW50LT5zb2NrID0gc29jazsKKyAgICBjbGllbnQtPnRpbWVvdXQgPSBzZWxmLT50aW1lb3V0OworICAgIHJldHVybiAxOworICB9CisgIExVQV9DSEVDS19SRVRVUk4oTCwgZXJyKTsKK30KKworc3RhdGljIGludCBsX3NvY2tldF9saXN0ZW4obHVhX1N0YXRlICpMKSB7CisgIGNvbnN0IGNoYXIqIGVycjsKKyAgcF90Y3AgdGNwID0gKHBfdGNwKSBjaGVja3R5cGUoTCwgMSwgU09DS0VUX0dFTkVSSUMpOworICBpbnQgYmFja2xvZyA9IDEwOworICBlcnIgPSB0Y3BfbGlzdGVuKCZ0Y3AtPnNvY2ssIGJhY2tsb2cpOworICBpZiAoIWVycikgeworICAgIC8vIFNldCB0aGUgY3VycmVudCBhcyBhIHNlcnZlcgorICAgIHNldHR5cGUoTCwgMSwgU09DS0VUX1NFUlZFUik7IC8vIE5vdyBhIHNlcnZlcgorICB9CisgIExVQV9DSEVDS19SRVRVUk4oTCwgZXJyKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENsaWVudAorCisvLyBjcmVhdGVfYW5kX2Nvbm5lY3QoaG9zdCwgcG9ydCwgdGltZW91dCkKK2V4dGVybiBkb3VibGUgX19nZXR0aW1lKCk7CitzdGF0aWMgaW50IGxfc29ja2V0X2NyZWF0ZV9hbmRfY29ubmVjdChsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciogZXJyID0gTlVMTDsKKyAgZG91YmxlIGVuZDsKKyAgdF9zb2NrZXQgc29jazsKKyAgY29uc3QgY2hhciAqaG9zdCA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMSk7CisgIHVuc2lnbmVkIHNob3J0IHBvcnQgPSBsdWFMX2NoZWNrbnVtYmVyKEwsIDIpOworICBpbnQgdGltZW91dCA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMyk7CisKKyAgLy8gQ3JlYXRlIGFuZCBjb25uZWN0IGxvb3AgZm9yIHRpbWVvdXQgbWlsbGlzZWNvbmRzCisgIGVuZCA9IF9fZ2V0dGltZSgpICsgdGltZW91dC8xMDAwOworICBkbyB7CisgICAgLy8gQ3JlYXRlIHRoZSBzb2NrZXQKKyAgICBlcnIgPSB0Y3BfY3JlYXRlKCZzb2NrKTsKKyAgICBpZiAoIWVycikgeworICAgICAgICAvLyBDb25uZWN0CisgICAgICAgIGVyciA9IHRjcF9jb25uZWN0KCZzb2NrLCBob3N0LCBwb3J0LCB0aW1lb3V0KTsKKyAgICAgICAgaWYgKGVycikgeworICAgICAgICAgIHRjcF9kZXN0cm95KCZzb2NrKTsKKyAgICAgICAgICB1c2xlZXAoMTAwMDAwKTsgLy8gc2xlZXAgZm9yIDEwMG1zCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcF90Y3AgdGNwID0gKHBfdGNwKSBsdWFfbmV3dXNlcmRhdGEoTCwgc2l6ZW9mKHRfdGNwKSk7CisgICAgICAgICAgc2V0dHlwZShMLCAtMiwgU09DS0VUX0NMSUVOVCk7CisgICAgICAgICAgc29ja2V0X3NldG5vbmJsb2NraW5nKCZzb2NrKTsKKyAgICAgICAgICB0Y3AtPnNvY2sgPSBzb2NrOworICAgICAgICAgIHRjcC0+dGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgICAgcmV0dXJuIDE7IC8vIFJldHVybiB1c2VyZGF0YQorICAgICAgICB9CisgICAgfQorICB9IHdoaWxlIChlcnIgJiYgX19nZXR0aW1lKCkgPCBlbmQpOworCisgIExVQV9DSEVDS19SRVRVUk4oTCwgZXJyKTsKK30KKworLy8gY29ubmVjdChob3N0LCBwb3J0KQorc3RhdGljIGludCBsX3NvY2tldF9jb25uZWN0KGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBjaGFyICplcnI7CisgIHBfdGNwIHRjcCA9IChwX3RjcCkgY2hlY2t0eXBlKEwsIDEsIFNPQ0tFVF9HRU5FUklDKTsKKyAgY29uc3QgY2hhciAqaG9zdCA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMik7CisgIHVuc2lnbmVkIHNob3J0IHBvcnQgPSBsdWFMX2NoZWNrbnVtYmVyKEwsIDMpOworICBlcnIgPSB0Y3BfY29ubmVjdCgmdGNwLT5zb2NrLCBob3N0LCBwb3J0LCB0Y3AtPnRpbWVvdXQpOworICBpZiAoIWVycikgeworICAgIHNldHR5cGUoTCwgMSwgU09DS0VUX0NMSUVOVCk7IC8vIE5vdyBhIGNsaWVudAorICB9CisgIExVQV9DSEVDS19SRVRVUk4oTCwgZXJyKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9sdWEvc3JjL3NvY2tldC5oIGIvbGliL2x1YS9zcmMvc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZiODI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvc3JjL3NvY2tldC5oCkBAIC0wLDAgKzEsNzggQEAKKy8vCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLworCisjaWZuZGVmIExVQV9USFJJRlRfU09DS0VUX0gKKyNkZWZpbmUgTFVBX1RIUklGVF9TT0NLRVRfSAorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaWZkZWYgX1dJTjMyCisvLyBTT0wKKyNlbHNlCit0eXBlZGVmIGludCB0X3NvY2tldDsKK3R5cGVkZWYgdF9zb2NrZXQqIHBfc29ja2V0OworI2VuZGlmCisKKy8vIEVycm9yIENvZGVzCitlbnVtIHsKKyAgU1VDQ0VTUyA9IDAsCisgIFRJTUVPVVQgPSAtMSwKKyAgQ0xPU0VEID0gLTIsCit9OwordHlwZWRlZiBpbnQgVF9FUlJDT0RFOworCitzdGF0aWMgY29uc3QgY2hhciAqIFRJTUVPVVRfTVNHID0gIlRpbWVvdXQiOworc3RhdGljIGNvbnN0IGNoYXIgKiBDTE9TRURfTVNHID0gIkNvbm5lY3Rpb24gQ2xvc2VkIjsKKwordHlwZWRlZiBzdHJ1Y3Qgc29ja2FkZHIgdF9zYTsKK3R5cGVkZWYgdF9zYSAqIHBfc2E7CisKK1RfRVJSQ09ERSBzb2NrZXRfY3JlYXRlKHBfc29ja2V0IHNvY2ssIGludCBkb21haW4sIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpOworVF9FUlJDT0RFIHNvY2tldF9kZXN0cm95KHBfc29ja2V0IHNvY2spOworVF9FUlJDT0RFIHNvY2tldF9iaW5kKHBfc29ja2V0IHNvY2ssIHBfc2EgYWRkciwgaW50IGFkZHJfbGVuKTsKK1RfRVJSQ09ERSBzb2NrZXRfZ2V0X2luZm8ocF9zb2NrZXQgc29jaywgc2hvcnQgKnBvcnQsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CitUX0VSUkNPREUgc29ja2V0X3NlbmQocF9zb2NrZXQgc29jaywgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwgaW50IHRpbWVvdXQpOworVF9FUlJDT0RFIHNvY2tldF9yZWN2KHBfc29ja2V0IHNvY2ssIGNoYXIgKmRhdGEsIHNpemVfdCBsZW4sIGludCB0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgIGludCAqcmVjZWl2ZWQpOworCitUX0VSUkNPREUgc29ja2V0X3NldGJsb2NraW5nKHBfc29ja2V0IHNvY2spOworVF9FUlJDT0RFIHNvY2tldF9zZXRub25ibG9ja2luZyhwX3NvY2tldCBzb2NrKTsKKworVF9FUlJDT0RFIHNvY2tldF9hY2NlcHQocF9zb2NrZXQgc29jaywgcF9zb2NrZXQgc2libGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfc2EgYWRkciwgc29ja2xlbl90ICphZGRyX2xlbiwgaW50IHRpbWVvdXQpOworVF9FUlJDT0RFIHNvY2tldF9saXN0ZW4ocF9zb2NrZXQgc29jaywgaW50IGJhY2tsb2cpOworCitUX0VSUkNPREUgc29ja2V0X2Nvbm5lY3QocF9zb2NrZXQgc29jaywgcF9zYSBhZGRyLCBpbnQgYWRkcl9sZW4sIGludCB0aW1lb3V0KTsKKworY29uc3QgY2hhciAqIHRjcF9jcmVhdGUocF9zb2NrZXQgc29jayk7Citjb25zdCBjaGFyICogdGNwX2Rlc3Ryb3kocF9zb2NrZXQgc29jayk7Citjb25zdCBjaGFyICogdGNwX2JpbmQocF9zb2NrZXQgc29jaywgY29uc3QgY2hhciAqaG9zdCwgdW5zaWduZWQgc2hvcnQgcG9ydCk7Citjb25zdCBjaGFyICogdGNwX3NlbmQocF9zb2NrZXQgc29jaywgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lb3V0KTsKK2NvbnN0IGNoYXIgKiB0Y3BfcmVjZWl2ZShwX3NvY2tldCBzb2NrLCBjaGFyICpkYXRhLCBzaXplX3Qgcl9sZW4sIGludCB0aW1lb3V0KTsKK2NvbnN0IGNoYXIgKiB0Y3BfcmF3X3JlY2VpdmUocF9zb2NrZXQgc29jaywgY2hhciAqIGRhdGEsIHNpemVfdCByX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVvdXQsIGludCAqcmVjZWl2ZWQpOworCitjb25zdCBjaGFyICogdGNwX2xpc3RlbihwX3NvY2tldCBzb2NrLCBpbnQgYmFja2xvZyk7Citjb25zdCBjaGFyICogdGNwX2FjY2VwdChwX3NvY2tldCBzb2NrLCBwX3NvY2tldCBjbGllbnQsIGludCB0aW1lb3V0KTsKKworY29uc3QgY2hhciAqIHRjcF9jb25uZWN0KHBfc29ja2V0IHNvY2ssIGNvbnN0IGNoYXIgKmhvc3QsIHVuc2lnbmVkIHNob3J0IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVvdXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9sdWEvc3JjL3Vzb2NrZXQuYyBiL2xpYi9sdWEvc3JjL3Vzb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTFiNTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9zcmMvdXNvY2tldC5jCkBAIC0wLDAgKzEsMzc2IEBACisvLworLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPiAvLyBUT0RPIFJFTU9WRQorCisjaW5jbHVkZSAic29ja2V0LmgiCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQcml2YXRlCisKKy8vIE51bSBzZWNvbmRzIHNpbmNlIEphbiAxIDE5NzAgKFVUQykKKyNpZmRlZiBfV0lOMzIKKy8vIFNPTAorI2Vsc2UKKyAgZG91YmxlIF9fZ2V0dGltZSgpIHsKKyAgICBzdHJ1Y3QgdGltZXZhbCB2OworICAgIGdldHRpbWVvZmRheSgmdiwgKHN0cnVjdCB0aW1lem9uZSopIE5VTEwpOworICAgIHJldHVybiB2LnR2X3NlYyArIHYudHZfdXNlYy8xLjBlNjsKKyAgfQorI2VuZGlmCisKKyNkZWZpbmUgV0FJVF9NT0RFX1IgIDEKKyNkZWZpbmUgV0FJVF9NT0RFX1cgIDIKKyNkZWZpbmUgV0FJVF9NT0RFX0MgIChXQUlUX01PREVfUnxXQUlUX01PREVfVykKK1RfRVJSQ09ERSBzb2NrZXRfd2FpdChwX3NvY2tldCBzb2NrLCBpbnQgbW9kZSwgaW50IHRpbWVvdXQpIHsKKyAgaW50IHJldCA9IDA7CisgIGZkX3NldCByZmRzLCB3ZmRzOworICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgZG91YmxlIGVuZCwgdDsKKyAgaWYgKCF0aW1lb3V0KSB7CisgICAgcmV0dXJuIFRJTUVPVVQ7CisgIH0KKworICBlbmQgPSBfX2dldHRpbWUoKSArIHRpbWVvdXQvMTAwMDsKKyAgZG8geworICAgIEZEX1pFUk8oJnJmZHMpOworICAgIEZEX1pFUk8oJndmZHMpOworCisgICAgLy8gU3BlY2lmeSB3aGF0IEkvTyBvcGVyYXRpb25zIHdlIGNhcmUgYWJvdXQKKyAgICBpZiAobW9kZSAmIFdBSVRfTU9ERV9SKSB7CisgICAgICBGRF9TRVQoKnNvY2ssICZyZmRzKTsKKyAgICB9CisgICAgaWYgKG1vZGUgJiBXQUlUX01PREVfVykgeworICAgICAgRkRfU0VUKCpzb2NrLCAmd2Zkcyk7CisgICAgfQorCisgICAgLy8gQ2hlY2sgZm9yIHRpbWVvdXQKKyAgICB0ID0gZW5kIC0gX19nZXR0aW1lKCk7CisgICAgaWYgKHQgPCAwLjApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIFdhaXQKKyAgICB0di50dl9zZWMgPSAoaW50KXQ7CisgICAgdHYudHZfdXNlYyA9IChpbnQpKCh0IC0gdHYudHZfc2VjKSAqIDEuMGU2KTsKKyAgICByZXQgPSBzZWxlY3QoKnNvY2srMSwgJnJmZHMsICZ3ZmRzLCBOVUxMLCAmdHYpOworICB9IHdoaWxlIChyZXQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOworICBpZiAocmV0ID09IC0xKSB7CisgICAgcmV0dXJuIGVycm5vOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIHRpbWVvdXQKKyAgaWYgKHJldCA9PSAwKSB7CisgICAgcmV0dXJuIFRJTUVPVVQ7CisgIH0KKworICAvLyBWZXJpZnkgdGhhdCB3ZSBjYW4gYWN0dWFsbHkgcmVhZCBmcm9tIHRoZSByZW1vdGUgaG9zdAorICBpZiAobW9kZSAmIFdBSVRfTU9ERV9DICYmIEZEX0lTU0VUKCpzb2NrLCAmcmZkcykgJiYKKyAgICAgIHJlY3YoKnNvY2ssIChjaGFyKikgJnJmZHMsIDAsIDApICE9IDApIHsKKyAgICByZXR1cm4gZXJybm87CisgIH0KKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEdlbmVyYWwKKworVF9FUlJDT0RFIHNvY2tldF9jcmVhdGUocF9zb2NrZXQgc29jaywgaW50IGRvbWFpbiwgaW50IHR5cGUsIGludCBwcm90b2NvbCkgeworICAqc29jayA9IHNvY2tldChkb21haW4sIHR5cGUsIHByb3RvY29sKTsKKyAgaWYgKCpzb2NrID4gMCkgeworICAgIHJldHVybiBTVUNDRVNTOworICB9IGVsc2UgeworICAgIHJldHVybiBlcnJubzsKKyAgfQorfQorCitUX0VSUkNPREUgc29ja2V0X2Rlc3Ryb3kocF9zb2NrZXQgc29jaykgeworICAvLyBUT0RPIEZpZ3VyZSBvdXQgaWYgSSBzaG91bGQgYmUgZnJlZS1pbmcgdGhpcworICBpZiAoKnNvY2sgPiAwKSB7CisgICAgKHZvaWQpc29ja2V0X3NldGJsb2NraW5nKHNvY2spOworICAgIGNsb3NlKCpzb2NrKTsKKyAgICAqc29jayA9IC0xOworICB9CisgIHJldHVybiBTVUNDRVNTOworfQorCitUX0VSUkNPREUgc29ja2V0X2JpbmQocF9zb2NrZXQgc29jaywgcF9zYSBhZGRyLCBpbnQgYWRkcl9sZW4pIHsKKyAgaW50IHJldCA9IHNvY2tldF9zZXRibG9ja2luZyhzb2NrKTsKKyAgaWYgKHJldCAhPSBTVUNDRVNTKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICBpZiAoYmluZCgqc29jaywgYWRkciwgYWRkcl9sZW4pKSB7CisgICAgcmV0ID0gZXJybm87CisgIH0KKyAgaW50IHJldDIgPSBzb2NrZXRfc2V0bm9uYmxvY2tpbmcoc29jayk7CisgIHJldHVybiByZXQgPT0gU1VDQ0VTUyA/IHJldDIgOiByZXQ7Cit9CisKK1RfRVJSQ09ERSBzb2NrZXRfZ2V0X2luZm8ocF9zb2NrZXQgc29jaywgc2hvcnQgKnBvcnQsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikgeworICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzYTsKKyAgbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7CisgIHNvY2tsZW5fdCBhZGRybGVuID0gc2l6ZW9mKHNhKTsKKyAgaW50IHJjID0gZ2V0c29ja25hbWUoKnNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIqKSZzYSwgJmFkZHJsZW4pOworICBpZiAoIXJjKSB7CisgICAgaWYgKHNhLnNzX2ZhbWlseSA9PSBBRl9JTkVUNikgeworICAgICAgc3RydWN0IHNvY2thZGRyX2luNiogc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYqKSgmc2EpOworICAgICAgaWYgKCFpbmV0X250b3AoQUZfSU5FVDYsICZzaW4tPnNpbjZfYWRkciwgYnVmLCBsZW4pKSB7CisgICAgICAgIHJldHVybiBlcnJubzsKKyAgICAgIH0KKyAgICAgICpwb3J0ID0gbnRvaHMoc2luLT5zaW42X3BvcnQpOworICAgIH0gZWxzZSB7CisgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4qIHNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4qKSgmc2EpOworICAgICAgaWYgKCFpbmV0X250b3AoQUZfSU5FVCwgJnNpbi0+c2luX2FkZHIsIGJ1ZiwgbGVuKSkgeworICAgICAgICByZXR1cm4gZXJybm87CisgICAgICB9CisgICAgICAqcG9ydCA9IG50b2hzKHNpbi0+c2luX3BvcnQpOworICAgIH0KKyAgICByZXR1cm4gU1VDQ0VTUzsKKyAgfQorICByZXR1cm4gZXJybm87Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTZXJ2ZXIKKworVF9FUlJDT0RFIHNvY2tldF9hY2NlcHQocF9zb2NrZXQgc29jaywgcF9zb2NrZXQgY2xpZW50LAorICAgICAgICAgICAgICAgICAgcF9zYSBhZGRyLCBzb2NrbGVuX3QgKmFkZHJsZW4sIGludCB0aW1lb3V0KSB7CisgIGludCBlcnI7CisgIGlmICgqc29jayA8IDApIHsKKyAgICByZXR1cm4gQ0xPU0VEOworICB9CisgIGRvIHsKKyAgICAqY2xpZW50ID0gYWNjZXB0KCpzb2NrLCBhZGRyLCBhZGRybGVuKTsKKyAgICBpZiAoKmNsaWVudCA+IDApIHsKKyAgICAgIHJldHVybiBTVUNDRVNTOworICAgIH0KKyAgfSB3aGlsZSAoKGVyciA9IGVycm5vKSA9PSBFSU5UUik7CisKKyAgaWYgKGVyciA9PSBFQUdBSU4gfHwgZXJyID09IEVDT05OQUJPUlRFRCkgeworICAgIHJldHVybiBzb2NrZXRfd2FpdChzb2NrLCBXQUlUX01PREVfUiwgdGltZW91dCk7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCitUX0VSUkNPREUgc29ja2V0X2xpc3RlbihwX3NvY2tldCBzb2NrLCBpbnQgYmFja2xvZykgeworICBpbnQgcmV0ID0gc29ja2V0X3NldGJsb2NraW5nKHNvY2spOworICBpZiAocmV0ICE9IFNVQ0NFU1MpIHsKKyAgICByZXR1cm4gcmV0OworICB9CisgIGlmIChsaXN0ZW4oKnNvY2ssIGJhY2tsb2cpKSB7CisgICAgcmV0ID0gZXJybm87CisgIH0KKyAgaW50IHJldDIgPSBzb2NrZXRfc2V0bm9uYmxvY2tpbmcoc29jayk7CisgIHJldHVybiByZXQgPT0gU1VDQ0VTUyA/IHJldDIgOiByZXQ7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDbGllbnQKKworVF9FUlJDT0RFIHNvY2tldF9jb25uZWN0KHBfc29ja2V0IHNvY2ssIHBfc2EgYWRkciwgaW50IGFkZHJfbGVuLCBpbnQgdGltZW91dCkgeworICBpbnQgZXJyOworICBpZiAoKnNvY2sgPCAwKSB7CisgICAgcmV0dXJuIENMT1NFRDsKKyAgfQorCisgIGRvIHsKKyAgICBpZiAoY29ubmVjdCgqc29jaywgYWRkciwgYWRkcl9sZW4pID09IDApIHsKKyAgICAgIHJldHVybiBTVUNDRVNTOworICAgIH0KKyAgfSB3aGlsZSAoKGVyciA9IGVycm5vKSA9PSBFSU5UUik7CisgIGlmIChlcnIgIT0gRUlOUFJPR1JFU1MgJiYgZXJyICE9IEVBR0FJTikgeworICAgIHJldHVybiBlcnI7CisgIH0KKyAgcmV0dXJuIHNvY2tldF93YWl0KHNvY2ssIFdBSVRfTU9ERV9DLCB0aW1lb3V0KTsKK30KKworVF9FUlJDT0RFIHNvY2tldF9zZW5kKAorICBwX3NvY2tldCBzb2NrLCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLCBpbnQgdGltZW91dCkgeworICBpbnQgZXJyLCBwdXQgPSAwOworICBpZiAoKnNvY2sgPCAwKSB7CisgICAgcmV0dXJuIENMT1NFRDsKKyAgfQorICBkbyB7CisgICAgcHV0ID0gc2VuZCgqc29jaywgZGF0YSwgbGVuLCAwKTsKKyAgICBpZiAocHV0ID4gMCkgeworICAgICAgcmV0dXJuIFNVQ0NFU1M7CisgICAgfQorICB9IHdoaWxlICgoZXJyID0gZXJybm8pID09IEVJTlRSKTsKKworICBpZiAoZXJyID09IEVBR0FJTikgeworICAgIHJldHVybiBzb2NrZXRfd2FpdChzb2NrLCBXQUlUX01PREVfVywgdGltZW91dCk7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCitUX0VSUkNPREUgc29ja2V0X3JlY3YoCisgIHBfc29ja2V0IHNvY2ssIGNoYXIgKmRhdGEsIHNpemVfdCBsZW4sIGludCB0aW1lb3V0LCBpbnQgKnJlY2VpdmVkKSB7CisgIGludCBlcnIsIGdvdCA9IDA7CisgIGlmICgqc29jayA8IDApIHsKKyAgICByZXR1cm4gQ0xPU0VEOworICB9CisgICpyZWNlaXZlZCA9IDA7CisKKyAgZG8geworICAgIGdvdCA9IHJlY3YoKnNvY2ssIGRhdGEsIGxlbiwgMCk7CisgICAgaWYgKGdvdCA+IDApIHsKKyAgICAgICpyZWNlaXZlZCA9IGdvdDsKKyAgICAgIHJldHVybiBTVUNDRVNTOworICAgIH0KKyAgICBlcnIgPSBlcnJubzsKKworICAgIC8vIENvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkIGJ5IHBlZXIKKyAgICBpZiAoZ290ID09IDApIHsKKyAgICAgIHJldHVybiBDTE9TRUQ7CisgICAgfQorICB9IHdoaWxlIChlcnIgPT0gRUlOVFIpOworCisgIGlmIChlcnIgPT0gRUFHQUlOKSB7CisgICAgcmV0dXJuIHNvY2tldF93YWl0KHNvY2ssIFdBSVRfTU9ERV9SLCB0aW1lb3V0KTsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVdGlsCisKK1RfRVJSQ09ERSBzb2NrZXRfc2V0bm9uYmxvY2tpbmcocF9zb2NrZXQgc29jaykgeworICBpbnQgZmxhZ3MgPSBmY250bCgqc29jaywgRl9HRVRGTCwgMCk7CisgIGZsYWdzIHw9IE9fTk9OQkxPQ0s7CisgIHJldHVybiBmY250bCgqc29jaywgRl9TRVRGTCwgZmxhZ3MpICE9IC0xID8gU1VDQ0VTUyA6IGVycm5vOworfQorCitUX0VSUkNPREUgc29ja2V0X3NldGJsb2NraW5nKHBfc29ja2V0IHNvY2spIHsKKyAgaW50IGZsYWdzID0gZmNudGwoKnNvY2ssIEZfR0VURkwsIDApOworICBmbGFncyAmPSAofihPX05PTkJMT0NLKSk7CisgIHJldHVybiBmY250bCgqc29jaywgRl9TRVRGTCwgZmxhZ3MpICE9IC0xID8gU1VDQ0VTUyA6IGVycm5vOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVENQCisKKyNkZWZpbmUgRVJST1JTVFJfUkVUVVJOKGVycikgXAorICBpZiAoZXJyID09IFNVQ0NFU1MpIHsgXAorICAgIHJldHVybiBOVUxMOyBcCisgIH0gZWxzZSBpZiAoZXJyID09IFRJTUVPVVQpIHsgXAorICAgIHJldHVybiBUSU1FT1VUX01TRzsgXAorICB9IGVsc2UgaWYgKGVyciA9PSBDTE9TRUQpIHsgXAorICAgIHJldHVybiBDTE9TRURfTVNHOyBcCisgIH0gXAorICByZXR1cm4gc3RyZXJyb3IoZXJyKQorCitjb25zdCBjaGFyICogdGNwX2NyZWF0ZShwX3NvY2tldCBzb2NrKSB7CisgIGludCBlcnIgPSBzb2NrZXRfY3JlYXRlKHNvY2ssIEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgRVJST1JTVFJfUkVUVVJOKGVycik7Cit9CisKK2NvbnN0IGNoYXIgKiB0Y3BfZGVzdHJveShwX3NvY2tldCBzb2NrKSB7CisgIGludCBlcnIgPSBzb2NrZXRfZGVzdHJveShzb2NrKTsKKyAgRVJST1JTVFJfUkVUVVJOKGVycik7Cit9CisKK2NvbnN0IGNoYXIgKiB0Y3BfYmluZChwX3NvY2tldCBzb2NrLCBjb25zdCBjaGFyICpob3N0LCB1bnNpZ25lZCBzaG9ydCBwb3J0KSB7CisgIGludCBlcnI7CisgIHN0cnVjdCBob3N0ZW50ICpoOworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbG9jYWw7CisgIG1lbXNldCgmbG9jYWwsIDAsIHNpemVvZihsb2NhbCkpOworICBsb2NhbC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgbG9jYWwuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7CisgIGxvY2FsLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisgIGlmIChzdHJjbXAoaG9zdCwgIioiKSAmJiAhaW5ldF9hdG9uKGhvc3QsICZsb2NhbC5zaW5fYWRkcikpIHsKKyAgICBoID0gZ2V0aG9zdGJ5bmFtZShob3N0KTsKKyAgICBpZiAoIWgpIHsKKyAgICAgIHJldHVybiBoc3RyZXJyb3IoaF9lcnJubyk7CisgICAgfQorICAgIG1lbWNweSgmbG9jYWwuc2luX2FkZHIsCisgICAgICAgICAgIChzdHJ1Y3QgaW5fYWRkciAqKWgtPmhfYWRkcl9saXN0WzBdLAorICAgICAgICAgICBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKyAgfQorICBlcnIgPSBzb2NrZXRfYmluZChzb2NrLCAocF9zYSkgJmxvY2FsLCBzaXplb2YobG9jYWwpKTsKKyAgRVJST1JTVFJfUkVUVVJOKGVycik7Cit9CisKK2NvbnN0IGNoYXIgKiB0Y3BfbGlzdGVuKHBfc29ja2V0IHNvY2ssIGludCBiYWNrbG9nKSB7CisgIGludCBlcnIgPSBzb2NrZXRfbGlzdGVuKHNvY2ssIGJhY2tsb2cpOworICBFUlJPUlNUUl9SRVRVUk4oZXJyKTsKK30KKworY29uc3QgY2hhciAqIHRjcF9hY2NlcHQocF9zb2NrZXQgc29jaywgcF9zb2NrZXQgY2xpZW50LCBpbnQgdGltZW91dCkgeworICBpbnQgZXJyID0gc29ja2V0X2FjY2VwdChzb2NrLCBjbGllbnQsIE5VTEwsIE5VTEwsIHRpbWVvdXQpOworICBFUlJPUlNUUl9SRVRVUk4oZXJyKTsKK30KKworY29uc3QgY2hhciAqIHRjcF9jb25uZWN0KHBfc29ja2V0IHNvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lb3V0KSB7CisgIGludCBlcnI7CisgIHN0cnVjdCBob3N0ZW50ICpoOworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcmVtb3RlOworICBtZW1zZXQoJnJlbW90ZSwgMCwgc2l6ZW9mKHJlbW90ZSkpOworICByZW1vdGUuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIHJlbW90ZS5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworICBpZiAoc3RyY21wKGhvc3QsICIqIikgJiYgIWluZXRfYXRvbihob3N0LCAmcmVtb3RlLnNpbl9hZGRyKSkgeworICAgIGggPSBnZXRob3N0YnluYW1lKGhvc3QpOworICAgIGlmICghaCkgeworICAgICAgcmV0dXJuIGhzdHJlcnJvcihoX2Vycm5vKTsKKyAgICB9CisgICAgbWVtY3B5KCZyZW1vdGUuc2luX2FkZHIsCisgICAgICAgICAgIChzdHJ1Y3QgaW5fYWRkciAqKWgtPmhfYWRkcl9saXN0WzBdLAorICAgICAgICAgICBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKyAgfQorICBlcnIgPSBzb2NrZXRfY29ubmVjdChzb2NrLCAocF9zYSkgJnJlbW90ZSwgc2l6ZW9mKHJlbW90ZSksIHRpbWVvdXQpOworICBFUlJPUlNUUl9SRVRVUk4oZXJyKTsKK30KKworI2RlZmluZSBXUklURV9TVEVQIDgxOTIKK2NvbnN0IGNoYXIgKiB0Y3Bfc2VuZCgKKyAgcF9zb2NrZXQgc29jaywgY29uc3QgY2hhciAqIGRhdGEsIHNpemVfdCB3X2xlbiwgaW50IHRpbWVvdXQpIHsKKyAgaW50IGVycjsKKyAgc2l6ZV90IHB1dCA9IDAsIHN0ZXA7CisgIGlmICghd19sZW4pIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGRvIHsKKyAgICBzdGVwID0gKFdSSVRFX1NURVAgPCB3X2xlbiAtIHB1dCA/IFdSSVRFX1NURVAgOiB3X2xlbiAtIHB1dCk7CisgICAgZXJyID0gc29ja2V0X3NlbmQoc29jaywgZGF0YSArIHB1dCwgc3RlcCwgdGltZW91dCk7CisgICAgcHV0ICs9IHN0ZXA7CisgIH0gd2hpbGUgKGVyciA9PSBTVUNDRVNTICYmIHB1dCA8IHdfbGVuKTsKKyAgRVJST1JTVFJfUkVUVVJOKGVycik7Cit9CisKK2NvbnN0IGNoYXIgKiB0Y3BfcmF3X3JlY2VpdmUoCisgIHBfc29ja2V0IHNvY2ssIGNoYXIgKiBkYXRhLCBzaXplX3Qgcl9sZW4sIGludCB0aW1lb3V0LCBpbnQgKnJlY2VpdmVkKSB7CisgIGludCBlcnIgPSBzb2NrZXRfcmVjdihzb2NrLCBkYXRhLCByX2xlbiwgdGltZW91dCwgcmVjZWl2ZWQpOworICBFUlJPUlNUUl9SRVRVUk4oZXJyKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL01ha2VmaWxlLmFtIGIvbGliL25ldGNvcmUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FmM2YzNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0gLiAKKworYWxsLWxvY2FsOgorCSQoRE9UTkVUQ09SRSkgYnVpbGQKKworY2hlY2stbG9jYWw6CisJJChET1RORVRDT1JFKSB0ZXN0IFRlc3RzL1RocmlmdC5UZXN0cy9UaHJpZnQuVGVzdHMuY3Nwcm9qCisJJHtET1RORVRDT1JFfSB0ZXN0IFRlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzLmNzcHJvagorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBUaHJpZnQvYmluCisJJChSTSkgLXIgVGhyaWZ0L29iagorCitFWFRSQV9ESVNUID0gXAorCVJFQURNRS5tZCBcCisJVGVzdHMgXAorCVRocmlmdCBcCisJVGhyaWZ0LnNsbiBcCisJYnVpbGQuY21kIFwKKwlidWlsZC5zaCBcCisJcnVudGVzdHMuY21kIFwKKwlydW50ZXN0cy5zaApkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvUkVBRE1FLm1kIGIvbGliL25ldGNvcmUvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YjA0N2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9SRUFETUUubWQKQEAgLTAsMCArMSwyNCBAQAorIyBBcGFjaGUgVGhyaWZ0IG5ldGNvcmUKKworVGhyaWZ0IGNsaWVudCBsaWJyYXJ5IHBvcnRlZCB0byBNaWNyb3NvZnQgLk5ldCBDb3JlIAorCisjIENvbnRlbnQKKy0gVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cyAtIHByb2plY3QgZm9yIGNoZWNraW5nIHB1YmxpYyBpbnRlcmZhY2VzIGR1cmluZyBhZGRpbmcgY2hhbmdlcyB0byBUaHJpZnQgbGlicmFyeQorLSBUaHJpZnQgLSBUaHJpZnQgbGlicmFyeSAKKworIyBSZXVzZWQgY29tcG9uZW50cyAKKy0gLk5FVCBTdGFuZGFyZCAxLjYgKFNESyAyLjAuMCkKKworIyBIb3cgdG8gYnVpbGQgb24gV2luZG93cworLSBHZXQgVGhyaWZ0IElETCBjb21waWxlciBleGVjdXRhYmxlLCBhZGQgdG8gc29tZSBmb2xkZXIgYW5kIGFkZCBwYXRoIHRvIHRoaXMgZm9sZGVyIGludG8gUEFUSCB2YXJpYWJsZQorLSBPcGVuIHRoZSBUaHJpZnQuc2xuIHByb2plY3Qgd2l0aCBWaXN1YWwgU3R1ZGlvIGFuZCBidWlsZC4KK29yIAorLSBCdWlsZCB3aXRoIHNjcmlwdHMKKworIyBIb3cgdG8gYnVpbGQgb24gVW5peAorLSBFbnN1cmUgeW91IGhhdmUgLk5FVCBDb3JlIDIuMC4wIFNESyBpbnN0YWxsZWQgb3IgdXNlIHRoZSBVYnVudHUgWGVuaWFsIGRvY2tlciBpbWFnZQorLSBGb2xsb3cgY29tbW9uIGJ1aWxkIHByYWN0aWNlIGZvciBUaHJpZnQ6IGJvb3RzdHJhcCwgY29uZmlndXJlLCBhbmQgbWFrZQorCisjIEtub3duIGlzc3VlcworLSBJbiB0cmFjZSBsb2dnaW5nIG1vZGUgeW91IGNhbiBzZWUgc29tZSBub3QgaW1wb3J0YW50IGludGVybmFsIGV4Y2VwdGlvbnMKKwpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvLmdpdGlnbm9yZSBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI1NGMzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACisjIGlnbm9yZSBmb3IgYXV0b2dlbmVyYXRlZCBmaWxlcworL0FwYWNoZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvUHJvdG9jb2xzL1Byb3RvY29sc09wZXJhdGlvbnNUZXN0cy5jcyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzL1Byb3RvY29scy9Qcm90b2NvbHNPcGVyYXRpb25zVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0YWZhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzL1Byb3RvY29scy9Qcm90b2NvbHNPcGVyYXRpb25zVGVzdHMuY3MKQEAgLTAsMCArMSw1MDIgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIEtlbGxlcm1hblNvZnR3YXJlLkNvbXBhcmVOZXRPYmplY3RzOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudDsKKworbmFtZXNwYWNlIFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzLlByb3RvY29scworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFByb3RvY29sc09wZXJhdGlvbnNUZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBDb21wYXJlTG9naWMgX2NvbXBhcmVMb2dpYyA9IG5ldyBDb21wYXJlTG9naWMoKTsKKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuQ2FsbCldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5PbmV3YXkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLlJlcGx5KV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuQ2FsbCldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbildCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLk9uZXdheSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLlJlcGx5KV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuQ2FsbCldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbildCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLk9uZXdheSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLlJlcGx5KV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkTWVzc2FnZV9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlLCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5ldyBUTWVzc2FnZShuYW1lb2YoVE1lc3NhZ2UpLCBtZXNzYWdlVHlwZSwgMSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlTWVzc2FnZUVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbE1lc3NhZ2UgPSBhd2FpdCBwcm90b2NvbC5SZWFkTWVzc2FnZUJlZ2luQXN5bmMoKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZE1lc3NhZ2VFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbE1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWRTdHJ1Y3RfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gbmV3IFRTdHJ1Y3QobmFtZW9mKFRTdHJ1Y3QpKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZVN0cnVjdEJlZ2luQXN5bmMoZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZVN0cnVjdEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkU3RydWN0QmVnaW5Bc3luYygpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkU3RydWN0RW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZEZpZWxkX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5ldyBURmllbGQobmFtZW9mKFRGaWVsZCksIFRUeXBlLlN0cmluZywgMSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUZpZWxkRW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRGaWVsZEJlZ2luQXN5bmMoKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZEZpZWxkRW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWRNYXBfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gbmV3IFRNYXAoVFR5cGUuU3RyaW5nLCBUVHlwZS5TdHJpbmcsIDEpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlTWFwQmVnaW5Bc3luYyhleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlTWFwRW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRNYXBCZWdpbkFzeW5jKCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRNYXBFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkTGlzdF9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuZXcgVExpc3QoVFR5cGUuU3RyaW5nLCAxKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUxpc3RCZWdpbkFzeW5jKGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVMaXN0RW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRMaXN0QmVnaW5Bc3luYygpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkTGlzdEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkU2V0X1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5ldyBUU2V0KFRUeXBlLlN0cmluZywgMSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVTZXRCZWdpbkFzeW5jKGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVTZXRFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZFNldEJlZ2luQXN5bmMoKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZFNldEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkQm9vbF9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSB0cnVlOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlQm9vbEFzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRCb29sQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWRCeXRlX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IHNieXRlLk1heFZhbHVlOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlQnl0ZUFzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRCeXRlQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWRJMTZfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gc2hvcnQuTWF4VmFsdWU7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVJMTZBc3luYyhleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkSTE2QXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWRJMzJfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gaW50Lk1heFZhbHVlOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlSTMyQXN5bmMoZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZEkzMkFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkSTY0X1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IGxvbmcuTWF4VmFsdWU7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVJNjRBc3luYyhleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkSTY0QXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWREb3VibGVfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gZG91YmxlLk1heFZhbHVlOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlRG91YmxlQXN5bmMoZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZERvdWJsZUFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkU3RyaW5nX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5hbWVvZihTdHJpbmcpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlU3RyaW5nQXN5bmMoZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZFN0cmluZ0FzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkQmluYXJ5X1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IEVuY29kaW5nLlVURjguR2V0Qnl0ZXMobmFtZW9mKFN0cmluZykpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlQmluYXJ5QXN5bmMoZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZEJpbmFyeUFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBUdXBsZTxTdHJlYW0sIFRQcm90b2NvbD4gR2V0UHJvdG9jb2xJbnN0YW5jZShUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG1lbW9yeVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIHZhciBzdHJlYW1DbGllbnRUcmFuc3BvcnQgPSBuZXcgVFN0cmVhbUNsaWVudFRyYW5zcG9ydChtZW1vcnlTdHJlYW0sIG1lbW9yeVN0cmVhbSk7CisgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSAoVFByb3RvY29sKSBBY3RpdmF0b3IuQ3JlYXRlSW5zdGFuY2UocHJvdG9jb2xUeXBlLCBzdHJlYW1DbGllbnRUcmFuc3BvcnQpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBUdXBsZTxTdHJlYW0sIFRQcm90b2NvbD4obWVtb3J5U3RyZWFtLCBwcm90b2NvbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5jc3Byb2ogYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI1ZGFjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzLmNzcHJvagpAQCAtMCwwICsxLDI5IEBACivvu788UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXRjb3JlYXBwMi4wPC9UYXJnZXRGcmFtZXdvcms+CisgICAgPEFzc2VtYmx5TmFtZT5UaHJpZnQuSW50ZWdyYXRpb25UZXN0czwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+VGhyaWZ0LkludGVncmF0aW9uVGVzdHM8L1BhY2thZ2VJZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVRpdGxlQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlEZXNjcmlwdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iQ29tcGFyZU5FVE9iamVjdHMiIFZlcnNpb249IjQuMy4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5ORVQuVGVzdC5TZGsiIFZlcnNpb249IjE1LjUuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNU1Rlc3QuVGVzdEFkYXB0ZXIiIFZlcnNpb249IjEuMi4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1TVGVzdC5UZXN0RnJhbWV3b3JrIiBWZXJzaW9uPSIxLjIuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uU2VydmljZU1vZGVsLlByaW1pdGl2ZXMiIFZlcnNpb249IjQuNC4wIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxUaHJpZnRcVGhyaWZ0LmNzcHJvaiIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFNlcnZpY2UgSW5jbHVkZT0iezgyYTdmNDhkLTNiNTAtNGIxZS1iODJlLTNhZGE4MjEwYzM1OH0iIC8+CisgIDwvSXRlbUdyb3VwPgorCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy8uZ2l0aWdub3JlIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOTI5YTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzLy5naXRpZ25vcmUKQEAgLTAsMCArMSw0IEBACisjIGlnbm9yZSBmb3IgYXV0b2dlbmVyYXRlZCBmaWxlcworL1RocmlmdFRlc3QKKy9BcGFjaGUKKy9GYWNlYm9vawpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy9DYXNzYW5kcmFUZXN0LnRocmlmdCBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvQ2Fzc2FuZHJhVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI5MjcyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvQ2Fzc2FuZHJhVGVzdC50aHJpZnQKQEAgLTAsMCArMSw3MDUgQEAKKyMhL3Vzci9sb2NhbC9iaW4vdGhyaWZ0IC0tamF2YSAtLXBocCAtLXB5CisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorIyAqKiogUExFQVNFIFJFTUVNQkVSIFRPIEVESVQgVEhFIFZFUlNJT04gQ09OU1RBTlQgV0hFTiBNQUtJTkcgQ0hBTkdFUyAqKioKKyMgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKKyMKKyMgSW50ZXJmYWNlIGRlZmluaXRpb24gZm9yIENhc3NhbmRyYSBTZXJ2aWNlCisjCisKK25hbWVzcGFjZSBuZXRjb3JlIEFwYWNoZS5DYXNzYW5kcmEuVGVzdAorCisjIFRocmlmdC5yYiBoYXMgYSBidWcgd2hlcmUgdG9wLWxldmVsIG1vZHVsZXMgdGhhdCBpbmNsdWRlIG1vZHVsZXMgCisjIHdpdGggdGhlIHNhbWUgbmFtZSBhcmUgbm90IHByb3Blcmx5IHJlZmVyZW5jZWQsIHNvIHdlIGNhbid0IGRvCisjIENhc3NhbmRyYTo6Q2Fzc2FuZHJhOjpDbGllbnQuCituYW1lc3BhY2UgcmIgQ2Fzc2FuZHJhVGhyaWZ0CisKKyMgVGhlIEFQSSB2ZXJzaW9uIChOT1QgdGhlIHByb2R1Y3QgdmVyc2lvbiksIGNvbXBvc2VkIGFzIGEgZG90IGRlbGltaXRlZAorIyBzdHJpbmcgd2l0aCBtYWpvciwgbWlub3IsIGFuZCBwYXRjaCBsZXZlbCBjb21wb25lbnRzLgorIworIyAgLSBNYWpvcjogSW5jcmVtZW50ZWQgZm9yIGJhY2t3YXJkIGluY29tcGF0aWJsZSBjaGFuZ2VzLiBBbiBleGFtcGxlIHdvdWxkCisjICAgICAgICAgICBiZSBjaGFuZ2VzIHRvIHRoZSBudW1iZXIgb3IgZGlzcG9zaXRpb24gb2YgbWV0aG9kIGFyZ3VtZW50cy4KKyMgIC0gTWlub3I6IEluY3JlbWVudGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmxlIGNoYW5nZXMuIEFuIGV4YW1wbGUgd291bGQKKyMgICAgICAgICAgIGJlIHRoZSBhZGRpdGlvbiBvZiBhIG5ldyAob3B0aW9uYWwpIG1ldGhvZC4KKyMgIC0gUGF0Y2g6IEluY3JlbWVudGVkIGZvciBidWcgZml4ZXMuIFRoZSBwYXRjaCBsZXZlbCBzaG91bGQgYmUgaW5jcmVhc2VkCisjICAgICAgICAgICBmb3IgZXZlcnkgZWRpdCB0aGF0IGRvZXNuJ3QgcmVzdWx0IGluIGEgY2hhbmdlIHRvIG1ham9yL21pbm9yLgorIworIyBTZWUgdGhlIFNlbWFudGljIFZlcnNpb25pbmcgU3BlY2lmaWNhdGlvbiAoU2VtVmVyKSBodHRwOi8vc2VtdmVyLm9yZy4KK2NvbnN0IHN0cmluZyBWRVJTSU9OID0gIjE5LjI0LjAiCisKKworIworIyBkYXRhIHN0cnVjdHVyZXMKKyMKKworLyoqIEJhc2ljIHVuaXQgb2YgZGF0YSB3aXRoaW4gYSBDb2x1bW5GYW1pbHkuCisgKiBAcGFyYW0gbmFtZSwgdGhlIG5hbWUgYnkgd2hpY2ggdGhpcyBjb2x1bW4gaXMgc2V0IGFuZCByZXRyaWV2ZWQuICBNYXhpbXVtIDY0S0IgbG9uZy4KKyAqIEBwYXJhbSB2YWx1ZS4gVGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lLiAgTWF4aW11bSAyR0IgbG9uZywgYnV0IGluIHByYWN0aWNlIHlvdSBzaG91bGQgbGltaXQgaXQgdG8gc21hbGwgbnVtYmVycyBvZiBNQiAoc2luY2UgVGhyaWZ0IG11c3QgcmVhZCB0aGUgZnVsbCB2YWx1ZSBpbnRvIG1lbW9yeSB0byBvcGVyYXRlIG9uIGl0KS4KKyAqIEBwYXJhbSB0aW1lc3RhbXAuIFRoZSB0aW1lc3RhbXAgaXMgdXNlZCBmb3IgY29uZmxpY3QgZGV0ZWN0aW9uL3Jlc29sdXRpb24gd2hlbiB0d28gY29sdW1ucyB3aXRoIHNhbWUgbmFtZSBuZWVkIHRvIGJlIGNvbXBhcmVkLgorICogQHBhcmFtIHR0bC4gQW4gb3B0aW9uYWwsIHBvc2l0aXZlIGRlbGF5IChpbiBzZWNvbmRzKSBhZnRlciB3aGljaCB0aGUgY29sdW1uIHdpbGwgYmUgYXV0b21hdGljYWxseSBkZWxldGVkLiAKKyAqLworc3RydWN0IENvbHVtbiB7CisgICAxOiByZXF1aXJlZCBiaW5hcnkgbmFtZSwKKyAgIDI6IG9wdGlvbmFsIGJpbmFyeSB2YWx1ZSwKKyAgIDM6IG9wdGlvbmFsIGk2NCB0aW1lc3RhbXAsCisgICA0OiBvcHRpb25hbCBpMzIgdHRsLAorfQorCisvKiogQSBuYW1lZCBsaXN0IG9mIGNvbHVtbnMuCisgKiBAcGFyYW0gbmFtZS4gc2VlIENvbHVtbi5uYW1lLgorICogQHBhcmFtIGNvbHVtbnMuIEEgY29sbGVjdGlvbiBvZiBzdGFuZGFyZCBDb2x1bW5zLiAgVGhlIGNvbHVtbnMgd2l0aGluIGEgc3VwZXIgY29sdW1uIGFyZSBkZWZpbmVkIGluIGFuIGFkaG9jIG1hbm5lci4KKyAqICAgICAgICAgICAgICAgICBDb2x1bW5zIHdpdGhpbiBhIHN1cGVyIGNvbHVtbiBkbyBub3QgaGF2ZSB0byBoYXZlIG1hdGNoaW5nIHN0cnVjdHVyZXMgKHNpbWlsYXJseSBuYW1lZCBjaGlsZCBjb2x1bW5zKS4KKyAqLworc3RydWN0IFN1cGVyQ29sdW1uIHsKKyAgIDE6IHJlcXVpcmVkIGJpbmFyeSBuYW1lLAorICAgMjogcmVxdWlyZWQgbGlzdDxDb2x1bW4+IGNvbHVtbnMsCit9CisKK3N0cnVjdCBDb3VudGVyQ29sdW1uIHsKKyAgICAxOiByZXF1aXJlZCBiaW5hcnkgbmFtZSwKKyAgICAyOiByZXF1aXJlZCBpNjQgdmFsdWUKK30KKworc3RydWN0IENvdW50ZXJTdXBlckNvbHVtbiB7CisgICAgMTogcmVxdWlyZWQgYmluYXJ5IG5hbWUsCisgICAgMjogcmVxdWlyZWQgbGlzdDxDb3VudGVyQ29sdW1uPiBjb2x1bW5zCit9CisKKy8qKgorICAgIE1ldGhvZHMgZm9yIGZldGNoaW5nIHJvd3MvcmVjb3JkcyBmcm9tIENhc3NhbmRyYSB3aWxsIHJldHVybiBlaXRoZXIgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgQ29sdW1uT3JTdXBlckNvbHVtbiBvciBhIGxpc3QKKyAgICBvZiBDb2x1bW5PclN1cGVyQ29sdW1ucyAoZ2V0X3NsaWNlKCkpLiBJZiB5b3UncmUgbG9va2luZyB1cCBhIFN1cGVyQ29sdW1uIChvciBsaXN0IG9mIFN1cGVyQ29sdW1ucykgdGhlbiB0aGUgcmVzdWx0aW5nCisgICAgaW5zdGFuY2VzIG9mIENvbHVtbk9yU3VwZXJDb2x1bW4gd2lsbCBoYXZlIHRoZSByZXF1ZXN0ZWQgU3VwZXJDb2x1bW4gaW4gdGhlIGF0dHJpYnV0ZSBzdXBlcl9jb2x1bW4uIEZvciBxdWVyaWVzIHJlc3VsdGluZworICAgIGluIENvbHVtbnMsIHRob3NlIHZhbHVlcyB3aWxsIGJlIGluIHRoZSBhdHRyaWJ1dGUgY29sdW1uLiBUaGlzIGNoYW5nZSB3YXMgbWFkZSBiZXR3ZWVuIDAuMyBhbmQgMC40IHRvIHN0YW5kYXJkaXplIG9uCisgICAgc2luZ2xlIHF1ZXJ5IG1ldGhvZHMgdGhhdCBtYXkgcmV0dXJuIGVpdGhlciBhIFN1cGVyQ29sdW1uIG9yIENvbHVtbi4KKworICAgIElmIHRoZSBxdWVyeSB3YXMgb24gYSBjb3VudGVyIGNvbHVtbiBmYW1pbHksIHlvdSB3aWxsIGVpdGhlciBnZXQgYSBjb3VudGVyX2NvbHVtbiAoaW5zdGVhZCBvZiBhIGNvbHVtbikgb3IgYSAKKyAgICBjb3VudGVyX3N1cGVyX2NvbHVtbiAoaW5zdGVhZCBvZiBhIHN1cGVyX2NvbHVtbikKKworICAgIEBwYXJhbSBjb2x1bW4uIFRoZSBDb2x1bW4gcmV0dXJuZWQgYnkgZ2V0KCkgb3IgZ2V0X3NsaWNlKCkuCisgICAgQHBhcmFtIHN1cGVyX2NvbHVtbi4gVGhlIFN1cGVyQ29sdW1uIHJldHVybmVkIGJ5IGdldCgpIG9yIGdldF9zbGljZSgpLgorICAgIEBwYXJhbSBjb3VudGVyX2NvbHVtbi4gVGhlIENvdW50ZXJvbHVtbiByZXR1cm5lZCBieSBnZXQoKSBvciBnZXRfc2xpY2UoKS4KKyAgICBAcGFyYW0gY291bnRlcl9zdXBlcl9jb2x1bW4uIFRoZSBDb3VudGVyU3VwZXJDb2x1bW4gcmV0dXJuZWQgYnkgZ2V0KCkgb3IgZ2V0X3NsaWNlKCkuCisgKi8KK3N0cnVjdCBDb2x1bW5PclN1cGVyQ29sdW1uIHsKKyAgICAxOiBvcHRpb25hbCBDb2x1bW4gY29sdW1uLAorICAgIDI6IG9wdGlvbmFsIFN1cGVyQ29sdW1uIHN1cGVyX2NvbHVtbiwKKyAgICAzOiBvcHRpb25hbCBDb3VudGVyQ29sdW1uIGNvdW50ZXJfY29sdW1uLAorICAgIDQ6IG9wdGlvbmFsIENvdW50ZXJTdXBlckNvbHVtbiBjb3VudGVyX3N1cGVyX2NvbHVtbgorfQorCisKKyMKKyMgRXhjZXB0aW9ucworIyAobm90ZSB0aGF0IGludGVybmFsIHNlcnZlciBlcnJvcnMgd2lsbCByYWlzZSBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgY291cnRlc3kgb2YgVGhyaWZ0KQorIworCisvKiogQSBzcGVjaWZpYyBjb2x1bW4gd2FzIHJlcXVlc3RlZCB0aGF0IGRvZXMgbm90IGV4aXN0LiAqLworZXhjZXB0aW9uIE5vdEZvdW5kRXhjZXB0aW9uIHsKK30KKworLyoqIEludmFsaWQgcmVxdWVzdCBjb3VsZCBtZWFuIGtleXNwYWNlIG9yIGNvbHVtbiBmYW1pbHkgZG9lcyBub3QgZXhpc3QsIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlIG1pc3NpbmcsIG9yIGEgcGFyYW1ldGVyIGlzIG1hbGZvcm1lZC4gCisgICAgd2h5IGNvbnRhaW5zIGFuIGFzc29jaWF0ZWQgZXJyb3IgbWVzc2FnZS4KKyovCitleGNlcHRpb24gSW52YWxpZFJlcXVlc3RFeGNlcHRpb24geworICAgIDE6IHJlcXVpcmVkIHN0cmluZyB3aHkKK30KKworLyoqIE5vdCBhbGwgdGhlIHJlcGxpY2FzIHJlcXVpcmVkIGNvdWxkIGJlIGNyZWF0ZWQgYW5kL29yIHJlYWQuICovCitleGNlcHRpb24gVW5hdmFpbGFibGVFeGNlcHRpb24geworfQorCisvKiogUlBDIHRpbWVvdXQgd2FzIGV4Y2VlZGVkLiAgZWl0aGVyIGEgbm9kZSBmYWlsZWQgbWlkLW9wZXJhdGlvbiwgb3IgbG9hZCB3YXMgdG9vIGhpZ2gsIG9yIHRoZSByZXF1ZXN0ZWQgb3Agd2FzIHRvbyBsYXJnZS4gKi8KK2V4Y2VwdGlvbiBUaW1lZE91dEV4Y2VwdGlvbiB7Cit9CisKKy8qKiBpbnZhbGlkIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgKGludmFsaWQga2V5c3BhY2UsIHVzZXIgZG9lcyBub3QgZXhpc3QsIG9yIGNyZWRlbnRpYWxzIGludmFsaWQpICovCitleGNlcHRpb24gQXV0aGVudGljYXRpb25FeGNlcHRpb24geworICAgIDE6IHJlcXVpcmVkIHN0cmluZyB3aHkKK30KKworLyoqIGludmFsaWQgYXV0aG9yaXphdGlvbiByZXF1ZXN0ICh1c2VyIGRvZXMgbm90IGhhdmUgYWNjZXNzIHRvIGtleXNwYWNlKSAqLworZXhjZXB0aW9uIEF1dGhvcml6YXRpb25FeGNlcHRpb24geworICAgIDE6IHJlcXVpcmVkIHN0cmluZyB3aHkKK30KKworLyoqIHNjaGVtYXMgYXJlIG5vdCBpbiBhZ3JlZW1lbnQgYWNyb3NzIGFsbCBub2RlcyAqLworZXhjZXB0aW9uIFNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiB7Cit9CisKKworIworIyBzZXJ2aWNlIGFwaQorIworLyoqIAorICogVGhlIENvbnNpc3RlbmN5TGV2ZWwgaXMgYW4gZW51bSB0aGF0IGNvbnRyb2xzIGJvdGggcmVhZCBhbmQgd3JpdGUKKyAqIGJlaGF2aW9yIGJhc2VkIG9uIHRoZSBSZXBsaWNhdGlvbkZhY3RvciBvZiB0aGUga2V5c3BhY2UuICBUaGUKKyAqIGRpZmZlcmVudCBjb25zaXN0ZW5jeSBsZXZlbHMgaGF2ZSBkaWZmZXJlbnQgbWVhbmluZ3MsIGRlcGVuZGluZyBvbgorICogaWYgeW91J3JlIGRvaW5nIGEgd3JpdGUgb3IgcmVhZCBvcGVyYXRpb24uIAorICoKKyAqIElmIFcgKyBSID4gUmVwbGljYXRpb25GYWN0b3IsIHdoZXJlIFcgaXMgdGhlIG51bWJlciBvZiBub2RlcyB0bworICogYmxvY2sgZm9yIG9uIHdyaXRlLCBhbmQgUiB0aGUgbnVtYmVyIHRvIGJsb2NrIGZvciBvbiByZWFkcywgeW91CisgKiB3aWxsIGhhdmUgc3Ryb25nbHkgY29uc2lzdGVudCBiZWhhdmlvcjsgdGhhdCBpcywgcmVhZGVycyB3aWxsCisgKiBhbHdheXMgc2VlIHRoZSBtb3N0IHJlY2VudCB3cml0ZS4gT2YgdGhlc2UsIHRoZSBtb3N0IGludGVyZXN0aW5nIGlzCisgKiB0byBkbyBRVU9SVU0gcmVhZHMgYW5kIHdyaXRlcywgd2hpY2ggZ2l2ZXMgeW91IGNvbnNpc3RlbmN5IHdoaWxlCisgKiBzdGlsbCBhbGxvd2luZyBhdmFpbGFiaWxpdHkgaW4gdGhlIGZhY2Ugb2Ygbm9kZSBmYWlsdXJlcyB1cCB0byBoYWxmCisgKiBvZiA8UmVwbGljYXRpb25GYWN0b3I+LiBPZiBjb3Vyc2UgaWYgbGF0ZW5jeSBpcyBtb3JlIGltcG9ydGFudCB0aGFuCisgKiBjb25zaXN0ZW5jeSB0aGVuIHlvdSBjYW4gdXNlIGxvd2VyIHZhbHVlcyBmb3IgZWl0aGVyIG9yIGJvdGguCisgKiAKKyAqIFNvbWUgQ29uc2lzdGVuY3lMZXZlbHMgKE9ORSwgVFdPLCBUSFJFRSkgcmVmZXIgdG8gYSBzcGVjaWZpYyBudW1iZXIKKyAqIG9mIHJlcGxpY2FzIHJhdGhlciB0aGFuIGEgbG9naWNhbCBjb25jZXB0IHRoYXQgYWRqdXN0cworICogYXV0b21hdGljYWxseSB3aXRoIHRoZSByZXBsaWNhdGlvbiBmYWN0b3IuICBPZiB0aGVzZSwgb25seSBPTkUgaXMKKyAqIGNvbW1vbmx5IHVzZWQ7IFRXTyBhbmQgKGV2ZW4gbW9yZSByYXJlbHkpIFRIUkVFIGFyZSBvbmx5IHVzZWZ1bAorICogd2hlbiB5b3UgY2FyZSBtb3JlIGFib3V0IGd1YXJhbnRlZWluZyBhIGNlcnRhaW4gbGV2ZWwgb2YKKyAqIGR1cmFiaWxpdHksIHRoYW4gY29uc2lzdGVuY3kuCisgKiAKKyAqIFdyaXRlIGNvbnNpc3RlbmN5IGxldmVscyBtYWtlIHRoZSBmb2xsb3dpbmcgZ3VhcmFudGVlcyBiZWZvcmUgcmVwb3J0aW5nIHN1Y2Nlc3MgdG8gdGhlIGNsaWVudDoKKyAqICAgQU5ZICAgICAgICAgIEVuc3VyZSB0aGF0IHRoZSB3cml0ZSBoYXMgYmVlbiB3cml0dGVuIG9uY2Ugc29tZXdoZXJlLCBpbmNsdWRpbmcgcG9zc2libHkgYmVpbmcgaGludGVkIGluIGEgbm9uLXRhcmdldCBub2RlLgorICogICBPTkUgICAgICAgICAgRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGhhcyBiZWVuIHdyaXR0ZW4gdG8gYXQgbGVhc3QgMSBub2RlJ3MgY29tbWl0IGxvZyBhbmQgbWVtb3J5IHRhYmxlCisgKiAgIFRXTyAgICAgICAgICBFbnN1cmUgdGhhdCB0aGUgd3JpdGUgaGFzIGJlZW4gd3JpdHRlbiB0byBhdCBsZWFzdCAyIG5vZGUncyBjb21taXQgbG9nIGFuZCBtZW1vcnkgdGFibGUKKyAqICAgVEhSRUUgICAgICAgIEVuc3VyZSB0aGF0IHRoZSB3cml0ZSBoYXMgYmVlbiB3cml0dGVuIHRvIGF0IGxlYXN0IDMgbm9kZSdzIGNvbW1pdCBsb2cgYW5kIG1lbW9yeSB0YWJsZQorICogICBRVU9SVU0gICAgICAgRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGhhcyBiZWVuIHdyaXR0ZW4gdG8gPFJlcGxpY2F0aW9uRmFjdG9yPiAvIDIgKyAxIG5vZGVzCisgKiAgIExPQ0FMX1FVT1JVTSBFbnN1cmUgdGhhdCB0aGUgd3JpdGUgaGFzIGJlZW4gd3JpdHRlbiB0byA8UmVwbGljYXRpb25GYWN0b3I+IC8gMiArIDEgbm9kZXMsIHdpdGhpbiB0aGUgbG9jYWwgZGF0YWNlbnRlciAocmVxdWlyZXMgTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3kpCisgKiAgIEVBQ0hfUVVPUlVNICBFbnN1cmUgdGhhdCB0aGUgd3JpdGUgaGFzIGJlZW4gd3JpdHRlbiB0byA8UmVwbGljYXRpb25GYWN0b3I+IC8gMiArIDEgbm9kZXMgaW4gZWFjaCBkYXRhY2VudGVyIChyZXF1aXJlcyBOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneSkKKyAqICAgQUxMICAgICAgICAgIEVuc3VyZSB0aGF0IHRoZSB3cml0ZSBpcyB3cml0dGVuIHRvIDxjb2RlPiZsdDtSZXBsaWNhdGlvbkZhY3RvciZndDs8L2NvZGU+IG5vZGVzIGJlZm9yZSByZXNwb25kaW5nIHRvIHRoZSBjbGllbnQuCisgKiAKKyAqIFJlYWQgY29uc2lzdGVuY3kgbGV2ZWxzIG1ha2UgdGhlIGZvbGxvd2luZyBndWFyYW50ZWVzIGJlZm9yZSByZXR1cm5pbmcgc3VjY2Vzc2Z1bCByZXN1bHRzIHRvIHRoZSBjbGllbnQ6CisgKiAgIEFOWSAgICAgICAgICBOb3Qgc3VwcG9ydGVkLiBZb3UgcHJvYmFibHkgd2FudCBPTkUgaW5zdGVhZC4KKyAqICAgT05FICAgICAgICAgIFJldHVybnMgdGhlIHJlY29yZCBvYnRhaW5lZCBmcm9tIGEgc2luZ2xlIHJlcGxpY2EuCisgKiAgIFRXTyAgICAgICAgICBSZXR1cm5zIHRoZSByZWNvcmQgd2l0aCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIG9uY2UgdHdvIHJlcGxpY2FzIGhhdmUgcmVwbGllZC4KKyAqICAgVEhSRUUgICAgICAgIFJldHVybnMgdGhlIHJlY29yZCB3aXRoIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgb25jZSB0aHJlZSByZXBsaWNhcyBoYXZlIHJlcGxpZWQuCisgKiAgIFFVT1JVTSAgICAgICBSZXR1cm5zIHRoZSByZWNvcmQgd2l0aCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIG9uY2UgYSBtYWpvcml0eSBvZiByZXBsaWNhcyBoYXZlIHJlcGxpZWQuCisgKiAgIExPQ0FMX1FVT1JVTSBSZXR1cm5zIHRoZSByZWNvcmQgd2l0aCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIG9uY2UgYSBtYWpvcml0eSBvZiByZXBsaWNhcyB3aXRoaW4gdGhlIGxvY2FsIGRhdGFjZW50ZXIgaGF2ZSByZXBsaWVkLgorICogICBFQUNIX1FVT1JVTSAgUmV0dXJucyB0aGUgcmVjb3JkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBvbmNlIGEgbWFqb3JpdHkgb2YgcmVwbGljYXMgd2l0aGluIGVhY2ggZGF0YWNlbnRlciBoYXZlIHJlcGxpZWQuCisgKiAgIEFMTCAgICAgICAgICBSZXR1cm5zIHRoZSByZWNvcmQgd2l0aCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIG9uY2UgYWxsIHJlcGxpY2FzIGhhdmUgcmVwbGllZCAoaW1wbGllcyBubyByZXBsaWNhIG1heSBiZSBkb3duKS4uCisqLworZW51bSBDb25zaXN0ZW5jeUxldmVsIHsKKyAgICBPTkUgPSAxLAorICAgIFFVT1JVTSA9IDIsCisgICAgTE9DQUxfUVVPUlVNID0gMywKKyAgICBFQUNIX1FVT1JVTSA9IDQsCisgICAgQUxMID0gNSwKKyAgICBBTlkgPSA2LAorICAgIFRXTyA9IDcsCisgICAgVEhSRUUgPSA4LAorfQorCisvKioKKyAgICBDb2x1bW5QYXJlbnQgaXMgdXNlZCB3aGVuIHNlbGVjdGluZyBncm91cHMgb2YgY29sdW1ucyBmcm9tIHRoZSBzYW1lIENvbHVtbkZhbWlseS4gSW4gZGlyZWN0b3J5IHN0cnVjdHVyZSB0ZXJtcywgaW1hZ2luZQorICAgIENvbHVtblBhcmVudCBhcyBDb2x1bW5QYXRoICsgJy8uLi8nLgorCisgICAgU2VlIGFsc28gPGEgaHJlZj0iY2Fzc2FuZHJhLmh0bWwjU3RydWN0X0NvbHVtblBhdGgiPkNvbHVtblBhdGg8L2E+CisgKi8KK3N0cnVjdCBDb2x1bW5QYXJlbnQgeworICAgIDM6IHJlcXVpcmVkIHN0cmluZyBjb2x1bW5fZmFtaWx5LAorICAgIDQ6IG9wdGlvbmFsIGJpbmFyeSBzdXBlcl9jb2x1bW4sCit9CisKKy8qKiBUaGUgQ29sdW1uUGF0aCBpcyB0aGUgcGF0aCB0byBhIHNpbmdsZSBjb2x1bW4gaW4gQ2Fzc2FuZHJhLiBJdCBtaWdodCBtYWtlIHNlbnNlIHRvIHRoaW5rIG9mIENvbHVtblBhdGggYW5kCisgKiBDb2x1bW5QYXJlbnQgaW4gdGVybXMgb2YgYSBkaXJlY3Rvcnkgc3RydWN0dXJlLgorICoKKyAqIENvbHVtblBhdGggaXMgdXNlZCB0byBsb29raW5nIHVwIGEgc2luZ2xlIGNvbHVtbi4KKyAqCisgKiBAcGFyYW0gY29sdW1uX2ZhbWlseS4gVGhlIG5hbWUgb2YgdGhlIENGIG9mIHRoZSBjb2x1bW4gYmVpbmcgbG9va2VkIHVwLgorICogQHBhcmFtIHN1cGVyX2NvbHVtbi4gVGhlIHN1cGVyIGNvbHVtbiBuYW1lLgorICogQHBhcmFtIGNvbHVtbi4gVGhlIGNvbHVtbiBuYW1lLgorICovCitzdHJ1Y3QgQ29sdW1uUGF0aCB7CisgICAgMzogcmVxdWlyZWQgc3RyaW5nIGNvbHVtbl9mYW1pbHksCisgICAgNDogb3B0aW9uYWwgYmluYXJ5IHN1cGVyX2NvbHVtbiwKKyAgICA1OiBvcHRpb25hbCBiaW5hcnkgY29sdW1uLAorfQorCisvKioKKyAgICBBIHNsaWNlIHJhbmdlIGlzIGEgc3RydWN0dXJlIHRoYXQgc3RvcmVzIGJhc2ljIHJhbmdlLCBvcmRlcmluZyBhbmQgbGltaXQgaW5mb3JtYXRpb24gZm9yIGEgcXVlcnkgdGhhdCB3aWxsIHJldHVybgorICAgIG11bHRpcGxlIGNvbHVtbnMuIEl0IGNvdWxkIGJlIHRob3VnaHQgb2YgYXMgQ2Fzc2FuZHJhJ3MgdmVyc2lvbiBvZiBMSU1JVCBhbmQgT1JERVIgQlkKKworICAgIEBwYXJhbSBzdGFydC4gVGhlIGNvbHVtbiBuYW1lIHRvIHN0YXJ0IHRoZSBzbGljZSB3aXRoLiBUaGlzIGF0dHJpYnV0ZSBpcyBub3QgcmVxdWlyZWQsIHRob3VnaCB0aGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgYW5kIGNhbiBiZSBzYWZlbHkgc2V0IHRvICcnLCBpLmUuLCBhbiBlbXB0eSBieXRlIGFycmF5LCB0byBzdGFydCB3aXRoIHRoZSBmaXJzdCBjb2x1bW4gbmFtZS4gT3RoZXJ3aXNlLCBpdAorICAgICAgICAgICAgICAgICAgbXVzdCBhIHZhbGlkIHZhbHVlIHVuZGVyIHRoZSBydWxlcyBvZiB0aGUgQ29tcGFyYXRvciBkZWZpbmVkIGZvciB0aGUgZ2l2ZW4gQ29sdW1uRmFtaWx5LgorICAgIEBwYXJhbSBmaW5pc2guIFRoZSBjb2x1bW4gbmFtZSB0byBzdG9wIHRoZSBzbGljZSBhdC4gVGhpcyBhdHRyaWJ1dGUgaXMgbm90IHJlcXVpcmVkLCB0aG91Z2ggdGhlcmUgaXMgbm8gZGVmYXVsdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICBhbmQgY2FuIGJlIHNhZmVseSBzZXQgdG8gYW4gZW1wdHkgYnl0ZSBhcnJheSB0byBub3Qgc3RvcCB1bnRpbCAnY291bnQnIHJlc3VsdHMgYXJlIHNlZW4uIE90aGVyd2lzZSwgaXQKKyAgICAgICAgICAgICAgICAgICBtdXN0IGFsc28gYmUgYSB2YWxpZCB2YWx1ZSB0byB0aGUgQ29sdW1uRmFtaWx5IENvbXBhcmF0b3IuCisgICAgQHBhcmFtIHJldmVyc2VkLiBXaGV0aGVyIHRoZSByZXN1bHRzIHNob3VsZCBiZSBvcmRlcmVkIGluIHJldmVyc2VkIG9yZGVyLiBTaW1pbGFyIHRvIE9SREVSIEJZIGJsYWggREVTQyBpbiBTUUwuCisgICAgQHBhcmFtIGNvdW50LiBIb3cgbWFueSBjb2x1bW5zIHRvIHJldHVybi4gU2ltaWxhciB0byBMSU1JVCBpbiBTUUwuIE1heSBiZSBhcmJpdHJhcmlseSBsYXJnZSwgYnV0IFRocmlmdCB3aWxsCisgICAgICAgICAgICAgICAgICBtYXRlcmlhbGl6ZSB0aGUgd2hvbGUgcmVzdWx0IGludG8gbWVtb3J5IGJlZm9yZSByZXR1cm5pbmcgaXQgdG8gdGhlIGNsaWVudCwgc28gYmUgYXdhcmUgdGhhdCB5b3UgbWF5CisgICAgICAgICAgICAgICAgICBiZSBiZXR0ZXIgc2VydmVkIGJ5IGl0ZXJhdGluZyB0aHJvdWdoIHNsaWNlcyBieSBwYXNzaW5nIHRoZSBsYXN0IHZhbHVlIG9mIG9uZSBjYWxsIGluIGFzIHRoZSAnc3RhcnQnCisgICAgICAgICAgICAgICAgICBvZiB0aGUgbmV4dCBpbnN0ZWFkIG9mIGluY3JlYXNpbmcgJ2NvdW50JyBhcmJpdHJhcmlseSBsYXJnZS4KKyAqLworc3RydWN0IFNsaWNlUmFuZ2UgeworICAgIDE6IHJlcXVpcmVkIGJpbmFyeSBzdGFydCwKKyAgICAyOiByZXF1aXJlZCBiaW5hcnkgZmluaXNoLAorICAgIDM6IHJlcXVpcmVkIGJvb2wgcmV2ZXJzZWQ9MCwKKyAgICA0OiByZXF1aXJlZCBpMzIgY291bnQ9MTAwLAorfQorCisvKioKKyAgICBBIFNsaWNlUHJlZGljYXRlIGlzIHNpbWlsYXIgdG8gYSBtYXRoZW1hdGljIHByZWRpY2F0ZSAoc2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUHJlZGljYXRlXyhtYXRoZW1hdGljYWxfbG9naWMpKSwKKyAgICB3aGljaCBpcyBkZXNjcmliZWQgYXMgImEgcHJvcGVydHkgdGhhdCB0aGUgZWxlbWVudHMgb2YgYSBzZXQgaGF2ZSBpbiBjb21tb24uIgorCisgICAgU2xpY2VQcmVkaWNhdGUncyBpbiBDYXNzYW5kcmEgYXJlIGRlc2NyaWJlZCB3aXRoIGVpdGhlciBhIGxpc3Qgb2YgY29sdW1uX25hbWVzIG9yIGEgU2xpY2VSYW5nZS4gIElmIGNvbHVtbl9uYW1lcyBpcworICAgIHNwZWNpZmllZCwgc2xpY2VfcmFuZ2UgaXMgaWdub3JlZC4KKworICAgIEBwYXJhbSBjb2x1bW5fbmFtZS4gQSBsaXN0IG9mIGNvbHVtbiBuYW1lcyB0byByZXRyaWV2ZS4gVGhpcyBjYW4gYmUgdXNlZCBzaW1pbGFyIHRvIE1lbWNhY2hlZCdzICJtdWx0aS1nZXQiIGZlYXR1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvIGZldGNoIE4ga25vd24gY29sdW1uIG5hbWVzLiBGb3IgaW5zdGFuY2UsIGlmIHlvdSBrbm93IHlvdSB3aXNoIHRvIGZldGNoIGNvbHVtbnMgJ0pvZScsICdKYWNrJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCAnSmltJyB5b3UgY2FuIHBhc3MgdGhvc2UgY29sdW1uIG5hbWVzIGFzIGEgbGlzdCB0byBmZXRjaCBhbGwgdGhyZWUgYXQgb25jZS4KKyAgICBAcGFyYW0gc2xpY2VfcmFuZ2UuIEEgU2xpY2VSYW5nZSBkZXNjcmliaW5nIGhvdyB0byByYW5nZSwgb3JkZXIsIGFuZC9vciBsaW1pdCB0aGUgc2xpY2UuCisgKi8KK3N0cnVjdCBTbGljZVByZWRpY2F0ZSB7CisgICAgMTogb3B0aW9uYWwgbGlzdDxiaW5hcnk+IGNvbHVtbl9uYW1lcywKKyAgICAyOiBvcHRpb25hbCBTbGljZVJhbmdlICAgc2xpY2VfcmFuZ2UsCit9CisKK2VudW0gSW5kZXhPcGVyYXRvciB7CisgICAgRVEsCisgICAgR1RFLAorICAgIEdULAorICAgIExURSwKKyAgICBMVAorfQorCitzdHJ1Y3QgSW5kZXhFeHByZXNzaW9uIHsKKyAgICAxOiByZXF1aXJlZCBiaW5hcnkgY29sdW1uX25hbWUsCisgICAgMjogcmVxdWlyZWQgSW5kZXhPcGVyYXRvciBvcCwKKyAgICAzOiByZXF1aXJlZCBiaW5hcnkgdmFsdWUsCit9CisKK3N0cnVjdCBJbmRleENsYXVzZSB7CisgICAgMTogcmVxdWlyZWQgbGlzdDxJbmRleEV4cHJlc3Npb24+IGV4cHJlc3Npb25zCisgICAgMjogcmVxdWlyZWQgYmluYXJ5IHN0YXJ0X2tleSwKKyAgICAzOiByZXF1aXJlZCBpMzIgY291bnQ9MTAwLAorfQorCisvKioKK1RoZSBzZW1hbnRpY3Mgb2Ygc3RhcnQga2V5cyBhbmQgdG9rZW5zIGFyZSBzbGlnaHRseSBkaWZmZXJlbnQuCitLZXlzIGFyZSBzdGFydC1pbmNsdXNpdmU7IHRva2VucyBhcmUgc3RhcnQtZXhjbHVzaXZlLiAgVG9rZW4KK3JhbmdlcyBtYXkgYWxzbyB3cmFwIC0tIHRoYXQgaXMsIHRoZSBlbmQgdG9rZW4gbWF5IGJlIGxlc3MKK3RoYW4gdGhlIHN0YXJ0IG9uZS4gIFRodXMsIGEgcmFuZ2UgZnJvbSBrZXlYIHRvIGtleVggaXMgYQorb25lLWVsZW1lbnQgcmFuZ2UsIGJ1dCBhIHJhbmdlIGZyb20gdG9rZW5ZIHRvIHRva2VuWSBpcyB0aGUKK2Z1bGwgcmluZy4KKyovCitzdHJ1Y3QgS2V5UmFuZ2UgeworICAgIDE6IG9wdGlvbmFsIGJpbmFyeSBzdGFydF9rZXksCisgICAgMjogb3B0aW9uYWwgYmluYXJ5IGVuZF9rZXksCisgICAgMzogb3B0aW9uYWwgc3RyaW5nIHN0YXJ0X3Rva2VuLAorICAgIDQ6IG9wdGlvbmFsIHN0cmluZyBlbmRfdG9rZW4sCisgICAgNTogcmVxdWlyZWQgaTMyIGNvdW50PTEwMAorfQorCisvKioKKyAgICBBIEtleVNsaWNlIGlzIGtleSBmb2xsb3dlZCBieSB0aGUgZGF0YSBpdCBtYXBzIHRvLiBBIGNvbGxlY3Rpb24gb2YgS2V5U2xpY2UgaXMgcmV0dXJuZWQgYnkgdGhlIGdldF9yYW5nZV9zbGljZSBvcGVyYXRpb24uCisKKyAgICBAcGFyYW0ga2V5LiBhIHJvdyBrZXkKKyAgICBAcGFyYW0gY29sdW1ucy4gTGlzdCBvZiBkYXRhIHJlcHJlc2VudGVkIGJ5IHRoZSBrZXkuIFR5cGljYWxseSwgdGhlIGxpc3QgaXMgcGFyZWQgZG93biB0byBvbmx5IHRoZSBjb2x1bW5zIHNwZWNpZmllZCBieQorICAgICAgICAgICAgICAgICAgICBhIFNsaWNlUHJlZGljYXRlLgorICovCitzdHJ1Y3QgS2V5U2xpY2UgeworICAgIDE6IHJlcXVpcmVkIGJpbmFyeSBrZXksCisgICAgMjogcmVxdWlyZWQgbGlzdDxDb2x1bW5PclN1cGVyQ29sdW1uPiBjb2x1bW5zLAorfQorCitzdHJ1Y3QgS2V5Q291bnQgeworICAgIDE6IHJlcXVpcmVkIGJpbmFyeSBrZXksCisgICAgMjogcmVxdWlyZWQgaTMyIGNvdW50Cit9CisKKy8qKgorICogTm90ZSB0aGF0IHRoZSB0aW1lc3RhbXAgaXMgb25seSBvcHRpb25hbCBpbiBjYXNlIG9mIGNvdW50ZXIgZGVsZXRpb24uCisgKi8KK3N0cnVjdCBEZWxldGlvbiB7CisgICAgMTogb3B0aW9uYWwgaTY0IHRpbWVzdGFtcCwKKyAgICAyOiBvcHRpb25hbCBiaW5hcnkgc3VwZXJfY29sdW1uLAorICAgIDM6IG9wdGlvbmFsIFNsaWNlUHJlZGljYXRlIHByZWRpY2F0ZSwKK30KKworLyoqCisgICAgQSBNdXRhdGlvbiBpcyBlaXRoZXIgYW4gaW5zZXJ0IChyZXByZXNlbnRlZCBieSBmaWxsaW5nIGNvbHVtbl9vcl9zdXBlcmNvbHVtbikgb3IgYSBkZWxldGlvbiAocmVwcmVzZW50ZWQgYnkgZmlsbGluZyB0aGUgZGVsZXRpb24gYXR0cmlidXRlKS4KKyAgICBAcGFyYW0gY29sdW1uX29yX3N1cGVyY29sdW1uLiBBbiBpbnNlcnQgdG8gYSBjb2x1bW4gb3Igc3VwZXJjb2x1bW4gKHBvc3NpYmx5IGNvdW50ZXIgY29sdW1uIG9yIHN1cGVyY29sdW1uKQorICAgIEBwYXJhbSBkZWxldGlvbi4gQSBkZWxldGlvbiBvZiBhIGNvbHVtbiBvciBzdXBlcmNvbHVtbgorKi8KK3N0cnVjdCBNdXRhdGlvbiB7CisgICAgMTogb3B0aW9uYWwgQ29sdW1uT3JTdXBlckNvbHVtbiBjb2x1bW5fb3Jfc3VwZXJjb2x1bW4sCisgICAgMjogb3B0aW9uYWwgRGVsZXRpb24gZGVsZXRpb24sCit9CisKK3N0cnVjdCBFbmRwb2ludERldGFpbHMgeworICAgIDE6IHN0cmluZyBob3N0LAorICAgIDI6IHN0cmluZyBkYXRhY2VudGVyLAorICAgIDM6IG9wdGlvbmFsIHN0cmluZyByYWNrCit9CisKKy8qKgorICAgIEEgVG9rZW5SYW5nZSBkZXNjcmliZXMgcGFydCBvZiB0aGUgQ2Fzc2FuZHJhIHJpbmcsIGl0IGlzIGEgbWFwcGluZyBmcm9tIGEgcmFuZ2UgdG8KKyAgICBlbmRwb2ludHMgcmVzcG9uc2libGUgZm9yIHRoYXQgcmFuZ2UuCisgICAgQHBhcmFtIHN0YXJ0X3Rva2VuIFRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgcmFuZ2UKKyAgICBAcGFyYW0gZW5kX3Rva2VuIFRoZSBsYXN0IHRva2VuIGluIHRoZSByYW5nZQorICAgIEBwYXJhbSBlbmRwb2ludHMgVGhlIGVuZHBvaW50cyByZXNwb25zaWJsZSBmb3IgdGhlIHJhbmdlIChsaXN0ZWQgYnkgdGhlaXIgY29uZmlndXJlZCBsaXN0ZW5fYWRkcmVzcykKKyAgICBAcGFyYW0gcnBjX2VuZHBvaW50cyBUaGUgZW5kcG9pbnRzIHJlc3BvbnNpYmxlIGZvciB0aGUgcmFuZ2UgKGxpc3RlZCBieSB0aGVpciBjb25maWd1cmVkIHJwY19hZGRyZXNzKQorKi8KK3N0cnVjdCBUb2tlblJhbmdlIHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcgc3RhcnRfdG9rZW4sCisgICAgMjogcmVxdWlyZWQgc3RyaW5nIGVuZF90b2tlbiwKKyAgICAzOiByZXF1aXJlZCBsaXN0PHN0cmluZz4gZW5kcG9pbnRzLAorICAgIDQ6IG9wdGlvbmFsIGxpc3Q8c3RyaW5nPiBycGNfZW5kcG9pbnRzCisgICAgNTogb3B0aW9uYWwgbGlzdDxFbmRwb2ludERldGFpbHM+IGVuZHBvaW50X2RldGFpbHMsCit9CisKKy8qKgorICAgIEF1dGhlbnRpY2F0aW9uIHJlcXVlc3RzIGNhbiBjb250YWluIGFueSBkYXRhLCBkZXBlbmRlbnQgb24gdGhlIElBdXRoZW50aWNhdG9yIHVzZWQKKyovCitzdHJ1Y3QgQXV0aGVudGljYXRpb25SZXF1ZXN0IHsKKyAgICAxOiByZXF1aXJlZCBtYXA8c3RyaW5nLCBzdHJpbmc+IGNyZWRlbnRpYWxzCit9CisKK2VudW0gSW5kZXhUeXBlIHsKKyAgICBLRVlTLAorICAgIENVU1RPTQorfQorCisvKiBkZXNjcmliZXMgYSBjb2x1bW4gaW4gYSBjb2x1bW4gZmFtaWx5LiAqLworc3RydWN0IENvbHVtbkRlZiB7CisgICAgMTogcmVxdWlyZWQgYmluYXJ5IG5hbWUsCisgICAgMjogcmVxdWlyZWQgc3RyaW5nIHZhbGlkYXRpb25fY2xhc3MsCisgICAgMzogb3B0aW9uYWwgSW5kZXhUeXBlIGluZGV4X3R5cGUsCisgICAgNDogb3B0aW9uYWwgc3RyaW5nIGluZGV4X25hbWUsCisgICAgNTogb3B0aW9uYWwgbWFwPHN0cmluZyxzdHJpbmc+IGluZGV4X29wdGlvbnMKK30KKworCisvKiBkZXNjcmliZXMgYSBjb2x1bW4gZmFtaWx5LiAqLworc3RydWN0IENmRGVmIHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcga2V5c3BhY2UsCisgICAgMjogcmVxdWlyZWQgc3RyaW5nIG5hbWUsCisgICAgMzogb3B0aW9uYWwgc3RyaW5nIGNvbHVtbl90eXBlPSJTdGFuZGFyZCIsCisgICAgNTogb3B0aW9uYWwgc3RyaW5nIGNvbXBhcmF0b3JfdHlwZT0iQnl0ZXNUeXBlIiwKKyAgICA2OiBvcHRpb25hbCBzdHJpbmcgc3ViY29tcGFyYXRvcl90eXBlLAorICAgIDg6IG9wdGlvbmFsIHN0cmluZyBjb21tZW50LAorICAgIDEyOiBvcHRpb25hbCBkb3VibGUgcmVhZF9yZXBhaXJfY2hhbmNlPTEuMCwKKyAgICAxMzogb3B0aW9uYWwgbGlzdDxDb2x1bW5EZWY+IGNvbHVtbl9tZXRhZGF0YSwKKyAgICAxNDogb3B0aW9uYWwgaTMyIGdjX2dyYWNlX3NlY29uZHMsCisgICAgMTU6IG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3ZhbGlkYXRpb25fY2xhc3MsCisgICAgMTY6IG9wdGlvbmFsIGkzMiBpZCwKKyAgICAxNzogb3B0aW9uYWwgaTMyIG1pbl9jb21wYWN0aW9uX3RocmVzaG9sZCwKKyAgICAxODogb3B0aW9uYWwgaTMyIG1heF9jb21wYWN0aW9uX3RocmVzaG9sZCwKKyAgICAyNDogb3B0aW9uYWwgYm9vbCByZXBsaWNhdGVfb25fd3JpdGUsCisgICAgMjU6IG9wdGlvbmFsIGRvdWJsZSBtZXJnZV9zaGFyZHNfY2hhbmNlLAorICAgIDI2OiBvcHRpb25hbCBzdHJpbmcga2V5X3ZhbGlkYXRpb25fY2xhc3MsCisgICAgMjg6IG9wdGlvbmFsIGJpbmFyeSBrZXlfYWxpYXMsCisgICAgMjk6IG9wdGlvbmFsIHN0cmluZyBjb21wYWN0aW9uX3N0cmF0ZWd5LAorICAgIDMwOiBvcHRpb25hbCBtYXA8c3RyaW5nLHN0cmluZz4gY29tcGFjdGlvbl9zdHJhdGVneV9vcHRpb25zLAorICAgIDMyOiBvcHRpb25hbCBtYXA8c3RyaW5nLHN0cmluZz4gY29tcHJlc3Npb25fb3B0aW9ucywKKyAgICAzMzogb3B0aW9uYWwgZG91YmxlIGJsb29tX2ZpbHRlcl9mcF9jaGFuY2UsCit9CisKKy8qIGRlc2NyaWJlcyBhIGtleXNwYWNlLiAqLworc3RydWN0IEtzRGVmIHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcgbmFtZSwKKyAgICAyOiByZXF1aXJlZCBzdHJpbmcgc3RyYXRlZ3lfY2xhc3MsCisgICAgMzogb3B0aW9uYWwgbWFwPHN0cmluZyxzdHJpbmc+IHN0cmF0ZWd5X29wdGlvbnMsCisKKyAgICAvKiogQGRlcHJlY2F0ZWQgKi8KKyAgICA0OiBvcHRpb25hbCBpMzIgcmVwbGljYXRpb25fZmFjdG9yLCAKKworICAgIDU6IHJlcXVpcmVkIGxpc3Q8Q2ZEZWY+IGNmX2RlZnMsCisgICAgNjogb3B0aW9uYWwgYm9vbCBkdXJhYmxlX3dyaXRlcz0xLAorfQorCisvKiogQ1FMIHF1ZXJ5IGNvbXByZXNzaW9uICovCitlbnVtIENvbXByZXNzaW9uIHsKKyAgICBHWklQID0gMSwKKyAgICBOT05FID0gMgorfQorCitlbnVtIENxbFJlc3VsdFR5cGUgeworICAgIFJPV1MgPSAxLAorICAgIFZPSUQgPSAyLAorICAgIElOVCA9IDMKK30KKworLyoqIFJvdyByZXR1cm5lZCBmcm9tIGEgQ1FMIHF1ZXJ5ICovCitzdHJ1Y3QgQ3FsUm93IHsKKyAgICAxOiByZXF1aXJlZCBiaW5hcnkga2V5LAorICAgIDI6IHJlcXVpcmVkIGxpc3Q8Q29sdW1uPiBjb2x1bW5zCit9CisKK3N0cnVjdCBDcWxNZXRhZGF0YSB7CisgICAgMTogcmVxdWlyZWQgbWFwPGJpbmFyeSxzdHJpbmc+IG5hbWVfdHlwZXMsCisgICAgMjogcmVxdWlyZWQgbWFwPGJpbmFyeSxzdHJpbmc+IHZhbHVlX3R5cGVzLAorICAgIDM6IHJlcXVpcmVkIHN0cmluZyBkZWZhdWx0X25hbWVfdHlwZSwKKyAgICA0OiByZXF1aXJlZCBzdHJpbmcgZGVmYXVsdF92YWx1ZV90eXBlCit9CisKK3N0cnVjdCBDcWxSZXN1bHQgeworICAgIDE6IHJlcXVpcmVkIENxbFJlc3VsdFR5cGUgdHlwZSwKKyAgICAyOiBvcHRpb25hbCBsaXN0PENxbFJvdz4gcm93cywKKyAgICAzOiBvcHRpb25hbCBpMzIgbnVtLAorICAgIDQ6IG9wdGlvbmFsIENxbE1ldGFkYXRhIHNjaGVtYQorfQorCitzdHJ1Y3QgQ3FsUHJlcGFyZWRSZXN1bHQgeworICAgIDE6IHJlcXVpcmVkIGkzMiBpdGVtSWQsCisgICAgMjogcmVxdWlyZWQgaTMyIGNvdW50Cit9CisKKworc2VydmljZSBDYXNzYW5kcmEgeworICAjIGF1dGggbWV0aG9kcworICB2b2lkIGxvZ2luKDE6IHJlcXVpcmVkIEF1dGhlbnRpY2F0aW9uUmVxdWVzdCBhdXRoX3JlcXVlc3QpIHRocm93cyAoMTpBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiBhdXRobngsIDI6QXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBhdXRoengpLAorIAorICAjIHNldCBrZXlzcGFjZQorICB2b2lkIHNldF9rZXlzcGFjZSgxOiByZXF1aXJlZCBzdHJpbmcga2V5c3BhY2UpIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUpLAorICAKKyAgIyByZXRyaWV2YWwgbWV0aG9kcworCisgIC8qKgorICAgIEdldCB0aGUgQ29sdW1uIG9yIFN1cGVyQ29sdW1uIGF0IHRoZSBnaXZlbiBjb2x1bW5fcGF0aC4gSWYgbm8gdmFsdWUgaXMgcHJlc2VudCwgTm90Rm91bmRFeGNlcHRpb24gaXMgdGhyb3duLiAoVGhpcyBpcworICAgIHRoZSBvbmx5IG1ldGhvZCB0aGF0IGNhbiB0aHJvdyBhbiBleGNlcHRpb24gdW5kZXIgbm9uLWZhaWx1cmUgY29uZGl0aW9ucy4pCisgICAqLworICBDb2x1bW5PclN1cGVyQ29sdW1uIGdldCgxOnJlcXVpcmVkIGJpbmFyeSBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgQ29sdW1uUGF0aCBjb2x1bW5fcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMzpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgICAgICAgICAgICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6Tm90Rm91bmRFeGNlcHRpb24gbmZlLCAzOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCA0OlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKioKKyAgICBHZXQgdGhlIGdyb3VwIG9mIGNvbHVtbnMgY29udGFpbmVkIGJ5IGNvbHVtbl9wYXJlbnQgKGVpdGhlciBhIENvbHVtbkZhbWlseSBuYW1lIG9yIGEgQ29sdW1uRmFtaWx5L1N1cGVyQ29sdW1uIG5hbWUKKyAgICBwYWlyKSBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIFNsaWNlUHJlZGljYXRlLiBJZiBubyBtYXRjaGluZyB2YWx1ZXMgYXJlIGZvdW5kLCBhbiBlbXB0eSBsaXN0IGlzIHJldHVybmVkLgorICAgKi8KKyAgbGlzdDxDb2x1bW5PclN1cGVyQ29sdW1uPiBnZXRfc2xpY2UoMTpyZXF1aXJlZCBiaW5hcnkga2V5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjpyZXF1aXJlZCBDb2x1bW5QYXJlbnQgY29sdW1uX3BhcmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgU2xpY2VQcmVkaWNhdGUgcHJlZGljYXRlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgIC8qKgorICAgIHJldHVybnMgdGhlIG51bWJlciBvZiBjb2x1bW5zIG1hdGNoaW5nIDxjb2RlPnByZWRpY2F0ZTwvY29kZT4gZm9yIGEgcGFydGljdWxhciA8Y29kZT5rZXk8L2NvZGU+LCAKKyAgICA8Y29kZT5Db2x1bW5GYW1pbHk8L2NvZGU+IGFuZCBvcHRpb25hbGx5IDxjb2RlPlN1cGVyQ29sdW1uPC9jb2RlPi4KKyAgKi8KKyAgaTMyIGdldF9jb3VudCgxOnJlcXVpcmVkIGJpbmFyeSBrZXksIAorICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgQ29sdW1uUGFyZW50IGNvbHVtbl9wYXJlbnQsIAorICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgU2xpY2VQcmVkaWNhdGUgcHJlZGljYXRlLAorICAgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgIC8qKgorICAgIFBlcmZvcm1zIGEgZ2V0X3NsaWNlIGZvciBjb2x1bW5fcGFyZW50IGFuZCBwcmVkaWNhdGUgZm9yIHRoZSBnaXZlbiBrZXlzIGluIHBhcmFsbGVsLgorICAqLworICBtYXA8YmluYXJ5LGxpc3Q8Q29sdW1uT3JTdXBlckNvbHVtbj4+IG11bHRpZ2V0X3NsaWNlKDE6cmVxdWlyZWQgbGlzdDxiaW5hcnk+IGtleXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgQ29sdW1uUGFyZW50IGNvbHVtbl9wYXJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgU2xpY2VQcmVkaWNhdGUgcHJlZGljYXRlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqCisgICAgUGVyZm9ybSBhIGdldF9jb3VudCBpbiBwYXJhbGxlbCBvbiB0aGUgZ2l2ZW4gbGlzdDxiaW5hcnk+IGtleXMuIFRoZSByZXR1cm4gdmFsdWUgbWFwcyBrZXlzIHRvIHRoZSBjb3VudCBmb3VuZC4KKyAgKi8KKyAgbWFwPGJpbmFyeSwgaTMyPiBtdWx0aWdldF9jb3VudCgxOnJlcXVpcmVkIGxpc3Q8YmluYXJ5PiBrZXlzLAorICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgQ29sdW1uUGFyZW50IGNvbHVtbl9wYXJlbnQsCisgICAgICAgICAgICAgICAgMzpyZXF1aXJlZCBTbGljZVByZWRpY2F0ZSBwcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgNDpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqCisgICByZXR1cm5zIGEgc3Vic2V0IG9mIGNvbHVtbnMgZm9yIGEgY29udGlndW91cyByYW5nZSBvZiBrZXlzLgorICAqLworICBsaXN0PEtleVNsaWNlPiBnZXRfcmFuZ2Vfc2xpY2VzKDE6cmVxdWlyZWQgQ29sdW1uUGFyZW50IGNvbHVtbl9wYXJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgU2xpY2VQcmVkaWNhdGUgcHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgS2V5UmFuZ2UgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgICAgICAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKiogUmV0dXJucyB0aGUgc3Vic2V0IG9mIGNvbHVtbnMgc3BlY2lmaWVkIGluIFNsaWNlUHJlZGljYXRlIGZvciB0aGUgcm93cyBtYXRjaGluZyB0aGUgSW5kZXhDbGF1c2UgKi8KKyAgbGlzdDxLZXlTbGljZT4gZ2V0X2luZGV4ZWRfc2xpY2VzKDE6cmVxdWlyZWQgQ29sdW1uUGFyZW50IGNvbHVtbl9wYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIEluZGV4Q2xhdXNlIGluZGV4X2NsYXVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgU2xpY2VQcmVkaWNhdGUgY29sdW1uX3ByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICAgICAgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgIyBtb2RpZmljYXRpb24gbWV0aG9kcworCisgIC8qKgorICAgKiBJbnNlcnQgYSBDb2x1bW4gYXQgdGhlIGdpdmVuIGNvbHVtbl9wYXJlbnQuY29sdW1uX2ZhbWlseSBhbmQgb3B0aW9uYWwgY29sdW1uX3BhcmVudC5zdXBlcl9jb2x1bW4uCisgICAqLworICB2b2lkIGluc2VydCgxOnJlcXVpcmVkIGJpbmFyeSBrZXksIAorICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LAorICAgICAgICAgICAgICAzOnJlcXVpcmVkIENvbHVtbiBjb2x1bW4sCisgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKioKKyAgICogSW5jcmVtZW50IG9yIGRlY3JlbWVudCBhIGNvdW50ZXIuCisgICAqLworICB2b2lkIGFkZCgxOnJlcXVpcmVkIGJpbmFyeSBrZXksCisgICAgICAgICAgIDI6cmVxdWlyZWQgQ29sdW1uUGFyZW50IGNvbHVtbl9wYXJlbnQsCisgICAgICAgICAgIDM6cmVxdWlyZWQgQ291bnRlckNvbHVtbiBjb2x1bW4sCisgICAgICAgICAgIDQ6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKioKKyAgICBSZW1vdmUgZGF0YSBmcm9tIHRoZSByb3cgc3BlY2lmaWVkIGJ5IGtleSBhdCB0aGUgZ3JhbnVsYXJpdHkgc3BlY2lmaWVkIGJ5IGNvbHVtbl9wYXRoLCBhbmQgdGhlIGdpdmVuIHRpbWVzdGFtcC4gTm90ZQorICAgIHRoYXQgYWxsIHRoZSB2YWx1ZXMgaW4gY29sdW1uX3BhdGggYmVzaWRlcyBjb2x1bW5fcGF0aC5jb2x1bW5fZmFtaWx5IGFyZSB0cnVseSBvcHRpb25hbDogeW91IGNhbiByZW1vdmUgdGhlIGVudGlyZQorICAgIHJvdyBieSBqdXN0IHNwZWNpZnlpbmcgdGhlIENvbHVtbkZhbWlseSwgb3IgeW91IGNhbiByZW1vdmUgYSBTdXBlckNvbHVtbiBvciBhIHNpbmdsZSBDb2x1bW4gYnkgc3BlY2lmeWluZyB0aG9zZSBsZXZlbHMgdG9vLgorICAgKi8KKyAgdm9pZCByZW1vdmUoMTpyZXF1aXJlZCBiaW5hcnkga2V5LAorICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhdGggY29sdW1uX3BhdGgsCisgICAgICAgICAgICAgIDM6cmVxdWlyZWQgaTY0IHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgNDpDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgIC8qKgorICAgKiBSZW1vdmUgYSBjb3VudGVyIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uCisgICAqIE5vdGUgdGhhdCBjb3VudGVycyBoYXZlIGxpbWl0ZWQgc3VwcG9ydCBmb3IgZGVsZXRlczogaWYgeW91IHJlbW92ZSBhIGNvdW50ZXIsIHlvdSBtdXN0IHdhaXQgdG8gaXNzdWUgYW55IGZvbGxvd2luZyB1cGRhdGUKKyAgICogdW50aWwgdGhlIGRlbGV0ZSBoYXMgcmVhY2hlZCBhbGwgdGhlIG5vZGVzIGFuZCBhbGwgb2YgdGhlbSBoYXZlIGJlZW4gZnVsbHkgY29tcGFjdGVkLgorICAgKi8KKyAgdm9pZCByZW1vdmVfY291bnRlcigxOnJlcXVpcmVkIGJpbmFyeSBrZXksCisgICAgICAgICAgICAgICAgICAgICAgMjpyZXF1aXJlZCBDb2x1bW5QYXRoIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgMzpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKworICAvKioKKyAgICBNdXRhdGUgbWFueSBjb2x1bW5zIG9yIHN1cGVyIGNvbHVtbnMgZm9yIG1hbnkgcm93IGtleXMuIFNlZSBhbHNvOiBNdXRhdGlvbi4KKworICAgIG11dGF0aW9uX21hcCBtYXBzIGtleSB0byBjb2x1bW4gZmFtaWx5IHRvIGEgbGlzdCBvZiBNdXRhdGlvbiBvYmplY3RzIHRvIHRha2UgcGxhY2UgYXQgdGhhdCBzY29wZS4KKyAgKiovCisgIHZvaWQgYmF0Y2hfbXV0YXRlKDE6cmVxdWlyZWQgbWFwPGJpbmFyeSwgbWFwPHN0cmluZywgbGlzdDxNdXRhdGlvbj4+PiBtdXRhdGlvbl9tYXAsCisgICAgICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKyAgICAgICAKKyAgLyoqCisgICBUcnVuY2F0ZSB3aWxsIG1hcmsgYW5kIGVudGlyZSBjb2x1bW4gZmFtaWx5IGFzIGRlbGV0ZWQuCisgICBGcm9tIHRoZSB1c2VyJ3MgcGVyc3BlY3RpdmUgYSBzdWNjZXNzZnVsIGNhbGwgdG8gdHJ1bmNhdGUgd2lsbCByZXN1bHQgY29tcGxldGUgZGF0YSBkZWxldGlvbiBmcm9tIGNmbmFtZS4KKyAgIEludGVybmFsbHksIGhvd2V2ZXIsIGRpc2sgc3BhY2Ugd2lsbCBub3QgYmUgaW1tZWRpYXRpbHkgcmVsZWFzZWQsIGFzIHdpdGggYWxsIGRlbGV0ZXMgaW4gY2Fzc2FuZHJhLCB0aGlzIG9uZQorICAgb25seSBtYXJrcyB0aGUgZGF0YSBhcyBkZWxldGVkLgorICAgVGhlIG9wZXJhdGlvbiBzdWNjZWVkcyBvbmx5IGlmIGFsbCBob3N0cyBpbiB0aGUgY2x1c3RlciBhdCBhdmFpbGFibGUgYW5kIHdpbGwgdGhyb3cgYW4gVW5hdmFpbGFibGVFeGNlcHRpb24gaWYgCisgICBzb21lIGhvc3RzIGFyZSBkb3duLgorICAqLworICB2b2lkIHRydW5jYXRlKDE6cmVxdWlyZWQgc3RyaW5nIGNmbmFtZSkKKyAgICAgICB0aHJvd3MgKDE6IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjogVW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6IFRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworCisgICAgCisgIC8vIE1ldGEtQVBJcyAtLSBBUElzIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbm9kZSBvciBjbHVzdGVyLAorICAvLyByYXRoZXIgdGhhbiB1c2VyIGRhdGEuICBUaGUgbm9kZXByb2JlIHByb2dyYW0gcHJvdmlkZXMgdXNhZ2UgZXhhbXBsZXMuCisgIAorICAvKiogCisgICAqIGZvciBlYWNoIHNjaGVtYSB2ZXJzaW9uIHByZXNlbnQgaW4gdGhlIGNsdXN0ZXIsIHJldHVybnMgYSBsaXN0IG9mIG5vZGVzIGF0IHRoYXQgdmVyc2lvbi4KKyAgICogaG9zdHMgdGhhdCBkbyBub3QgcmVzcG9uZCB3aWxsIGJlIHVuZGVyIHRoZSBrZXkgRGF0YWJhc2VEZXNjcmlwdG9yLklOSVRJQUxfVkVSU0lPTi4gCisgICAqIHRoZSBjbHVzdGVyIGlzIGFsbCBvbiB0aGUgc2FtZSB2ZXJzaW9uIGlmIHRoZSBzaXplIG9mIHRoZSBtYXAgaXMgMS4gCisgICAqLworICBtYXA8c3RyaW5nLCBsaXN0PHN0cmluZz4+IGRlc2NyaWJlX3NjaGVtYV92ZXJzaW9ucygpCisgICAgICAgdGhyb3dzICgxOiBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUpLAorCisgIC8qKiBsaXN0IHRoZSBkZWZpbmVkIGtleXNwYWNlcyBpbiB0aGlzIGNsdXN0ZXIgKi8KKyAgbGlzdDxLc0RlZj4gZGVzY3JpYmVfa2V5c3BhY2VzKCkKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlKSwKKworICAvKiogZ2V0IHRoZSBjbHVzdGVyIG5hbWUgKi8KKyAgc3RyaW5nIGRlc2NyaWJlX2NsdXN0ZXJfbmFtZSgpLAorCisgIC8qKiBnZXQgdGhlIHRocmlmdCBhcGkgdmVyc2lvbiAqLworICBzdHJpbmcgZGVzY3JpYmVfdmVyc2lvbigpLAorCisgIC8qKiBnZXQgdGhlIHRva2VuIHJpbmc6IGEgbWFwIG9mIHJhbmdlcyB0byBob3N0IGFkZHJlc3NlcywKKyAgICAgIHJlcHJlc2VudGVkIGFzIGEgc2V0IG9mIFRva2VuUmFuZ2UgaW5zdGVhZCBvZiBhIG1hcCBmcm9tIHJhbmdlCisgICAgICB0byBsaXN0IG9mIGVuZHBvaW50cywgYmVjYXVzZSB5b3UgY2FuJ3QgdXNlIFRocmlmdCBzdHJ1Y3RzIGFzCisgICAgICBtYXAga2V5czoKKyAgICAgIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2MiAKKworICAgICAgZm9yIHRoZSBzYW1lIHJlYXNvbiwgd2UgY2FuJ3QgcmV0dXJuIGEgc2V0IGhlcmUsIGV2ZW4gdGhvdWdoCisgICAgICBvcmRlciBpcyBuZWl0aGVyIGltcG9ydGFudCBub3IgcHJlZGljdGFibGUuICovCisgIGxpc3Q8VG9rZW5SYW5nZT4gZGVzY3JpYmVfcmluZygxOnJlcXVpcmVkIHN0cmluZyBrZXlzcGFjZSkKKyAgICAgICAgICAgICAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlKSwKKworICAvKiogcmV0dXJucyB0aGUgcGFydGl0aW9uZXIgdXNlZCBieSB0aGlzIGNsdXN0ZXIgKi8KKyAgc3RyaW5nIGRlc2NyaWJlX3BhcnRpdGlvbmVyKCksCisKKyAgLyoqIHJldHVybnMgdGhlIHNuaXRjaCB1c2VkIGJ5IHRoaXMgY2x1c3RlciAqLworICBzdHJpbmcgZGVzY3JpYmVfc25pdGNoKCksCisKKyAgLyoqIGRlc2NyaWJlIHNwZWNpZmllZCBrZXlzcGFjZSAqLworICBLc0RlZiBkZXNjcmliZV9rZXlzcGFjZSgxOnJlcXVpcmVkIHN0cmluZyBrZXlzcGFjZSkKKyAgICB0aHJvd3MgKDE6Tm90Rm91bmRFeGNlcHRpb24gbmZlLCAyOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSksCisKKyAgLyoqIGV4cGVyaW1lbnRhbCBBUEkgZm9yIGhhZG9vcC9wYXJhbGxlbCBxdWVyeSBzdXBwb3J0LiAgCisgICAgICBtYXkgY2hhbmdlIHZpb2xlbnRseSBhbmQgd2l0aG91dCB3YXJuaW5nLiAKKworICAgICAgcmV0dXJucyBsaXN0IG9mIHRva2VuIHN0cmluZ3Mgc3VjaCB0aGF0IGZpcnN0IHN1YnJhbmdlIGlzIChsaXN0WzBdLCBsaXN0WzFdXSwKKyAgICAgIG5leHQgaXMgKGxpc3RbMV0sIGxpc3RbMl1dLCBldGMuICovCisgIGxpc3Q8c3RyaW5nPiBkZXNjcmliZV9zcGxpdHMoMTpyZXF1aXJlZCBzdHJpbmcgY2ZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgc3RyaW5nIHN0YXJ0X3Rva2VuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIHN0cmluZyBlbmRfdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDpyZXF1aXJlZCBpMzIga2V5c19wZXJfc3BsaXQpCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSksCisKKyAgLyoqIGFkZHMgYSBjb2x1bW4gZmFtaWx5LiByZXR1cm5zIHRoZSBuZXcgc2NoZW1hIGlkLiAqLworICBzdHJpbmcgc3lzdGVtX2FkZF9jb2x1bW5fZmFtaWx5KDE6cmVxdWlyZWQgQ2ZEZWYgY2ZfZGVmKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSksCisgICAgCisgIC8qKiBkcm9wcyBhIGNvbHVtbiBmYW1pbHkuIHJldHVybnMgdGhlIG5ldyBzY2hlbWEgaWQuICovCisgIHN0cmluZyBzeXN0ZW1fZHJvcF9jb2x1bW5fZmFtaWx5KDE6cmVxdWlyZWQgc3RyaW5nIGNvbHVtbl9mYW1pbHkpCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpTY2hlbWFEaXNhZ3JlZW1lbnRFeGNlcHRpb24gc2RlKSwgCisgIAorICAvKiogYWRkcyBhIGtleXNwYWNlIGFuZCBhbnkgY29sdW1uIGZhbWlsaWVzIHRoYXQgYXJlIHBhcnQgb2YgaXQuIHJldHVybnMgdGhlIG5ldyBzY2hlbWEgaWQuICovCisgIHN0cmluZyBzeXN0ZW1fYWRkX2tleXNwYWNlKDE6cmVxdWlyZWQgS3NEZWYga3NfZGVmKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSksCisgIAorICAvKiogZHJvcHMgYSBrZXlzcGFjZSBhbmQgYW55IGNvbHVtbiBmYW1pbGllcyB0aGF0IGFyZSBwYXJ0IG9mIGl0LiByZXR1cm5zIHRoZSBuZXcgc2NoZW1hIGlkLiAqLworICBzdHJpbmcgc3lzdGVtX2Ryb3Bfa2V5c3BhY2UoMTpyZXF1aXJlZCBzdHJpbmcga2V5c3BhY2UpCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpTY2hlbWFEaXNhZ3JlZW1lbnRFeGNlcHRpb24gc2RlKSwKKyAgCisgIC8qKiB1cGRhdGVzIHByb3BlcnRpZXMgb2YgYSBrZXlzcGFjZS4gcmV0dXJucyB0aGUgbmV3IHNjaGVtYSBpZC4gKi8KKyAgc3RyaW5nIHN5c3RlbV91cGRhdGVfa2V5c3BhY2UoMTpyZXF1aXJlZCBLc0RlZiBrc19kZWYpCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpTY2hlbWFEaXNhZ3JlZW1lbnRFeGNlcHRpb24gc2RlKSwKKyAgICAgICAgCisgIC8qKiB1cGRhdGVzIHByb3BlcnRpZXMgb2YgYSBjb2x1bW4gZmFtaWx5LiByZXR1cm5zIHRoZSBuZXcgc2NoZW1hIGlkLiAqLworICBzdHJpbmcgc3lzdGVtX3VwZGF0ZV9jb2x1bW5fZmFtaWx5KDE6cmVxdWlyZWQgQ2ZEZWYgY2ZfZGVmKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSksCisgIAorICAvKioKKyAgICogRXhlY3V0ZXMgYSBDUUwgKENhc3NhbmRyYSBRdWVyeSBMYW5ndWFnZSkgc3RhdGVtZW50IGFuZCByZXR1cm5zIGEKKyAgICogQ3FsUmVzdWx0IGNvbnRhaW5pbmcgdGhlIHJlc3VsdHMuCisgICAqLworICBDcWxSZXN1bHQgZXhlY3V0ZV9jcWxfcXVlcnkoMTpyZXF1aXJlZCBiaW5hcnkgcXVlcnksIDI6cmVxdWlyZWQgQ29tcHJlc3Npb24gY29tcHJlc3Npb24pCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwKKyAgICAgICAgICAgIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsCisgICAgICAgICAgICAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlLAorICAgICAgICAgICAgNDpTY2hlbWFEaXNhZ3JlZW1lbnRFeGNlcHRpb24gc2RlKQorICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgLyoqCisgICAqIFByZXBhcmUgYSBDUUwgKENhc3NhbmRyYSBRdWVyeSBMYW5ndWFnZSkgc3RhdGVtZW50IGJ5IGNvbXBpbGluZyBhbmQgcmV0dXJuaW5nCisgICAqIC0gdGhlIHR5cGUgb2YgQ1FMIHN0YXRlbWVudAorICAgKiAtIGFuIGlkIHRva2VuIG9mIHRoZSBjb21waWxlZCBDUUwgc3RvcmVkIG9uIHRoZSBzZXJ2ZXIgc2lkZS4KKyAgICogLSBhIGNvdW50IG9mIHRoZSBkaXNjb3ZlcmVkIGJvdW5kIG1hcmtlcnMgaW4gdGhlIHN0YXRlbWVudCAKKyAgICovCisgIENxbFByZXBhcmVkUmVzdWx0IHByZXBhcmVfY3FsX3F1ZXJ5KDE6cmVxdWlyZWQgYmluYXJ5IHF1ZXJ5LCAyOnJlcXVpcmVkIENvbXByZXNzaW9uIGNvbXByZXNzaW9uKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUpCisKKyAgICAgICAgICAgICAKKyAgLyoqCisgICAqIEV4ZWN1dGVzIGEgcHJlcGFyZWQgQ1FMIChDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UpIHN0YXRlbWVudCBieSBwYXNzaW5nIGFuIGlkIHRva2VuIGFuZCAgYSBsaXN0IG9mIHZhcmlhYmxlcworICAgKiB0byBiaW5kIGFuZCByZXR1cm5zIGEgQ3FsUmVzdWx0IGNvbnRhaW5pbmcgdGhlIHJlc3VsdHMuCisgICAqLworICBDcWxSZXN1bHQgZXhlY3V0ZV9wcmVwYXJlZF9jcWxfcXVlcnkoMTpyZXF1aXJlZCBpMzIgaXRlbUlkLCAyOnJlcXVpcmVkIGxpc3Q8c3RyaW5nPiB2YWx1ZXMpCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwKKyAgICAgICAgICAgIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsCisgICAgICAgICAgICAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlLAorICAgICAgICAgICAgNDpTY2hlbWFEaXNhZ3JlZW1lbnRFeGNlcHRpb24gc2RlKQorICAgICAgICAgICAKKworfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiNDYwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw0MCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KKworW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCisKK1thc3NlbWJseTogR3VpZCgiZDBkMzcwNmItZmVkNS00Y2Y1LWI5ODQtMDRmNDQ4ZGU5ZDdiIildClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzLmNzcHJvaiBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhODRhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy5jc3Byb2oKQEAgLTAsMCArMSwzNiBAQAorPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisKKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXRjb3JlYXBwMi4wPC9UYXJnZXRGcmFtZXdvcms+CisgICAgPEFzc2VtYmx5TmFtZT5UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzPC9Bc3NlbWJseU5hbWU+CisgICAgPFBhY2thZ2VJZD5UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzPC9QYWNrYWdlSWQ+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uLy4uL1RocmlmdC9UaHJpZnQuY3Nwcm9qIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5TZXJ2aWNlTW9kZWwuUHJpbWl0aXZlcyIgVmVyc2lvbj0iWzQuMS4wLCkiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxUYXJnZXQgTmFtZT0iUHJlQnVpbGQiIEJlZm9yZVRhcmdldHM9Il9HZW5lcmF0ZVJlc3RvcmVQcm9qZWN0U3BlYztSZXN0b3JlO0NvbXBpbGUiPgorICAgIDxFeGVjIENvbmRpdGlvbj0iJyQoT1MpJyA9PSAnV2luZG93c19OVCciIENvbW1hbmQ9IndoZXJlIHRocmlmdCIgQ29uc29sZVRvTVNCdWlsZD0idHJ1ZSI+CisgICAgICA8T3V0cHV0IFRhc2tQYXJhbWV0ZXI9IkNvbnNvbGVPdXRwdXQiIFByb3BlcnR5TmFtZT0iUGF0aFRvVGhyaWZ0IiAvPgorICAgIDwvRXhlYz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnJChQYXRoVG9UaHJpZnQpJykiIENvbW1hbmQ9IiQoUGF0aFRvVGhyaWZ0KSAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi9DYXNzYW5kcmFUZXN0LnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygndGhyaWZ0JykiIENvbW1hbmQ9InRocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi9DYXNzYW5kcmFUZXN0LnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0JykiIENvbW1hbmQ9IiQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi9DYXNzYW5kcmFUZXN0LnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnJChQYXRoVG9UaHJpZnQpJykiIENvbW1hbmQ9IiQoUGF0aFRvVGhyaWZ0KSAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCd0aHJpZnQnKSIgQ29tbWFuZD0idGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCcpIiBDb21tYW5kPSIkKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnJChQYXRoVG9UaHJpZnQpJykiIENvbW1hbmQ9IiQoUGF0aFRvVGhyaWZ0KSAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi8uLi8uLi9jb250cmliL2ZiMzAzL2lmL2ZiMzAzLnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygndGhyaWZ0JykiIENvbW1hbmQ9InRocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi8uLi8uLi9jb250cmliL2ZiMzAzL2lmL2ZiMzAzLnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0JykiIENvbW1hbmQ9IiQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi8uLi8uLi9jb250cmliL2ZiMzAzL2lmL2ZiMzAzLnRocmlmdCIgLz4KKyAgPC9UYXJnZXQ+CisKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnNUZXN0cy5jcyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnNUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmU5OWI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9uc1Rlc3RzLmNzCkBAIC0wLDAgKzEsODMgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKKworbmFtZXNwYWNlIFRocmlmdC5UZXN0cy5Db2xsZWN0aW9ucworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgVENvbGxlY3Rpb25zVGVzdHMKKyAgICB7CisgICAgICAgIC8vVE9ETzogQWRkIHRlc3RzIGZvciBJRW51bWVyYWJsZSB3aXRoIG9iamVjdHMgYW5kIHByaW1pdGl2ZSB2YWx1ZXMgaW5zaWRlCisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRDb2xsZWN0aW9uX0VxdWFsc19QcmltaXRpdmVfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMSA9IG5ldyBMaXN0PGludD4gezEsMiwzfTsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMiA9IG5ldyBMaXN0PGludD4gezEsMiwzfTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFRDb2xsZWN0aW9ucy5FcXVhbHMoY29sbGVjdGlvbjEsIGNvbGxlY3Rpb24yKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRDb2xsZWN0aW9uX0VxdWFsc19QcmltaXRpdmVfRGlmZmVyZW50X1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY29sbGVjdGlvbjEgPSBuZXcgTGlzdDxpbnQ+IHsgMSwgMiwgMyB9OworICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24yID0gbmV3IExpc3Q8aW50PiB7IDEsIDIgfTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFRDb2xsZWN0aW9ucy5FcXVhbHMoY29sbGVjdGlvbjEsIGNvbGxlY3Rpb24yKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUQ29sbGVjdGlvbl9FcXVhbHNfT2JqZWN0c19UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24xID0gbmV3IExpc3Q8RXhhbXBsZUNsYXNzPiB7IG5ldyBFeGFtcGxlQ2xhc3MgeyBYID0gMSB9LCBuZXcgRXhhbXBsZUNsYXNzIHsgWCA9IDIgfSB9OworICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24yID0gbmV3IExpc3Q8RXhhbXBsZUNsYXNzPiB7IG5ldyBFeGFtcGxlQ2xhc3MgeyBYID0gMSB9LCBuZXcgRXhhbXBsZUNsYXNzIHsgWCA9IDIgfSB9OworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gVENvbGxlY3Rpb25zLkVxdWFscyhjb2xsZWN0aW9uMSwgY29sbGVjdGlvbjIpOworCisgICAgICAgICAgICAvLyByZWZlcmVuY2VzIHRvIGRpZmZlcmVudCBjb2xsZWN0aW9ucworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUQ29sbGVjdGlvbl9FcXVhbHNfT25lQW5kVGhlU2FtZU9iamVjdF9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24xID0gbmV3IExpc3Q8RXhhbXBsZUNsYXNzPiB7IG5ldyBFeGFtcGxlQ2xhc3MgeyBYID0gMSB9LCBuZXcgRXhhbXBsZUNsYXNzIHsgWCA9IDIgfSB9OworICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24yID0gY29sbGVjdGlvbjE7CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBUQ29sbGVjdGlvbnMuRXF1YWxzKGNvbGxlY3Rpb24xLCBjb2xsZWN0aW9uMik7CisKKyAgICAgICAgICAgIC8vIHJlZmVyZW5jZXMgdG8gb25lIGFuZCB0aGUgc2FtZSBjb2xsZWN0aW9uCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIEV4YW1wbGVDbGFzcworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgaW50IFggeyBnZXQ7IHNldDsgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL0NvbGxlY3Rpb25zL1RIYXNoU2V0VGVzdHMuY3MgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvQ29sbGVjdGlvbnMvVEhhc2hTZXRUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGU1NzNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL0NvbGxlY3Rpb25zL1RIYXNoU2V0VGVzdHMuY3MKQEAgLTAsMCArMSw3MSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7CisKK25hbWVzcGFjZSBUaHJpZnQuVGVzdHMuQ29sbGVjdGlvbnMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFRIYXNoU2V0VGVzdHMKKyAgICB7CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUSGFzaFNldF9FcXVhbHNfUHJpbWl0aXZlX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBpbnQgdmFsdWUgPSAxOworCisgICAgICAgICAgICB2YXIgaGFzaFNldCA9IG5ldyBUSGFzaFNldDxpbnQ+IHt2YWx1ZX07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoaGFzaFNldC5Db250YWlucyh2YWx1ZSkpOworCisgICAgICAgICAgICBoYXNoU2V0LlJlbW92ZSh2YWx1ZSk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoaGFzaFNldC5Db3VudCA9PSAwKTsKKworICAgICAgICAgICAgaGFzaFNldC5BZGQodmFsdWUpOworCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGhhc2hTZXQuQ29udGFpbnModmFsdWUpKTsKKworICAgICAgICAgICAgaGFzaFNldC5DbGVhcigpOworCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGhhc2hTZXQuQ291bnQgPT0gMCk7CisKKyAgICAgICAgICAgIHZhciBuZXdBcnIgPSBuZXcgaW50WzFdOworICAgICAgICAgICAgaGFzaFNldC5BZGQodmFsdWUpOworICAgICAgICAgICAgaGFzaFNldC5Db3B5VG8obmV3QXJyLCAwKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShuZXdBcnIuQ29udGFpbnModmFsdWUpKTsKKworICAgICAgICAgICAgdmFyIGVuID0gaGFzaFNldC5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgICAgICBlbi5Nb3ZlTmV4dCgpOworCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChpbnQpZW4uQ3VycmVudCA9PSB2YWx1ZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHVzaW5nICh2YXIgaWVuID0gKChJRW51bWVyYWJsZTxpbnQ+KWhhc2hTZXQpLkdldEVudW1lcmF0b3IoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZW4uTW92ZU5leHQoKTsKKworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoaWVuLkN1cnJlbnQgPT0gdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL1Byb3RvY29scy9USnNvblByb3RvY29sSGVscGVyVGVzdHMuY3MgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvUHJvdG9jb2xzL1RKc29uUHJvdG9jb2xIZWxwZXJUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGM4MzE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL1Byb3RvY29scy9USnNvblByb3RvY29sSGVscGVyVGVzdHMuY3MKQEAgLTAsMCArMSwxNzIgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5VdGlsaXRpZXM7CisKK25hbWVzcGFjZSBUaHJpZnQuVGVzdHMuUHJvdG9jb2xzCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgVEpTT05Qcm90b2NvbEhlbHBlclRlc3RzCisgICAgeworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0VHlwZU5hbWVGb3JUeXBlSWRfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlucHV0L291dHB1dAorICAgICAgICAgICAgdmFyIHNldHMgPSBuZXcgTGlzdDxUdXBsZTxUVHlwZSwgYnl0ZVtdPj4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuQm9vbCwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUJvb2wpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5CeXRlLCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lQnl0ZSksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkkxNiwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUkxNiksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkkzMiwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUkzMiksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkk2NCwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUk2NCksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkRvdWJsZSwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZURvdWJsZSksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLlN0cmluZywgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZVN0cmluZyksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLlN0cnVjdCwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZVN0cnVjdCksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLk1hcCwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZU1hcCksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLlNldCwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZVNldCksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkxpc3QsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVMaXN0KSwKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIHNldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVOYW1lRm9yVHlwZUlkKHQuSXRlbTEpID09IHQuSXRlbTIsICQiV3JvbmcgbWFwcGluZyBvZiBUeXBlTmFtZSB7dC5JdGVtMn0gdG8gVFR5cGU6IHt0Lkl0ZW0xfSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoVFByb3RvY29sRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEdldFR5cGVOYW1lRm9yVHlwZUlkX1RTdG9wX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVOYW1lRm9yVHlwZUlkKFRUeXBlLlN0b3ApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoVFByb3RvY29sRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEdldFR5cGVOYW1lRm9yVHlwZUlkX05vbkV4aXN0aW5nVFR5cGVfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZU5hbWVGb3JUeXBlSWQoKFRUeXBlKTEwMCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0VHlwZUlkRm9yVHlwZU5hbWVfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlucHV0L291dHB1dAorICAgICAgICAgICAgdmFyIHNldHMgPSBuZXcgTGlzdDxUdXBsZTxUVHlwZSwgYnl0ZVtdPj4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuQm9vbCwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUJvb2wpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5CeXRlLCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lQnl0ZSksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkkxNiwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUkxNiksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkkzMiwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUkzMiksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkk2NCwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUk2NCksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkRvdWJsZSwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZURvdWJsZSksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLlN0cmluZywgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZVN0cmluZyksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLlN0cnVjdCwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZVN0cnVjdCksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLk1hcCwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZU1hcCksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLlNldCwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZVNldCksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkxpc3QsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVMaXN0KSwKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIHNldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVJZEZvclR5cGVOYW1lKHQuSXRlbTIpID09IHQuSXRlbTEsICQiV3JvbmcgbWFwcGluZyBvZiBUeXBlTmFtZSB7dC5JdGVtMn0gdG8gVFR5cGU6IHt0Lkl0ZW0xfSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoVFByb3RvY29sRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEdldFR5cGVJZEZvclR5cGVOYW1lX1RTdG9wVHlwZU5hbWVfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZUlkRm9yVHlwZU5hbWUobmV3IFtdeyhieXRlKVRUeXBlLlN0b3AsIChieXRlKVRUeXBlLlN0b3B9KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFRQcm90b2NvbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRUeXBlSWRGb3JUeXBlTmFtZV9Ob25FeGlzdGluZ1R5cGVOYW1lX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVJZEZvclR5cGVOYW1lKG5ldyBieXRlW117MTAwfSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihUUHJvdG9jb2xFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0VHlwZUlkRm9yVHlwZU5hbWVfRW1wdHlOYW1lX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVJZEZvclR5cGVOYW1lKG5ldyBieXRlW10ge30pOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIElzSnNvbk51bWVyaWNfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlucHV0L291dHB1dAorICAgICAgICAgICAgdmFyIGNvcnJlY3RKc29uTnVtZXJpYyA9ICIrLS4wMTIzNDU2Nzg5RWUiOworICAgICAgICAgICAgdmFyIGluY29ycmVjdEpzb25OdW1lcmljID0gIkFhQmNEZC8qXFwiOworCisgICAgICAgICAgICB2YXIgc2V0cyA9IGNvcnJlY3RKc29uTnVtZXJpYy5TZWxlY3QoY2ggPT4gbmV3IFR1cGxlPGJ5dGUsIGJvb2w+KChieXRlKSBjaCwgdHJ1ZSkpLlRvTGlzdCgpOworICAgICAgICAgICAgc2V0cy5BZGRSYW5nZShpbmNvcnJlY3RKc29uTnVtZXJpYy5TZWxlY3QoY2ggPT4gbmV3IFR1cGxlPGJ5dGUsIGJvb2w+KChieXRlKSBjaCwgZmFsc2UpKSk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIHNldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShUSlNPTlByb3RvY29sSGVscGVyLklzSnNvbk51bWVyaWModC5JdGVtMSkgPT0gdC5JdGVtMiwgJCJXcm9uZyBtYXBwaW5nIG9mIENoYXIge3QuSXRlbTF9IHRvIGJvb2w6IHt0Lkl0ZW0yfSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRvSGV4VmFsX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQKKyAgICAgICAgICAgIHZhciBjaGFycyA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZEhleFZhbHVlcyA9IG5ldyBieXRlW10gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTV9OworCisgICAgICAgICAgICB2YXIgc2V0cyA9IGNoYXJzLlNlbGVjdCgoY2gsIGkpID0+IG5ldyBUdXBsZTxjaGFyLCBieXRlPihjaCwgZXhwZWN0ZWRIZXhWYWx1ZXNbaV0pKS5Ub0xpc3QoKTsKKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gc2V0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYWN0dWFsUmVzdWx0ID0gVEpTT05Qcm90b2NvbEhlbHBlci5Ub0hleFZhbCgoYnl0ZSl0Lkl0ZW0xKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGFjdHVhbFJlc3VsdCA9PSB0Lkl0ZW0yLCAkIldyb25nIG1hcHBpbmcgb2YgY2hhciBieXRlIHt0Lkl0ZW0xfSB0byBpdCBleHBlY3RlZCBoZXggdmFsdWU6IHt0Lkl0ZW0yfS4gQWN0dWFsIGhleCB2YWx1ZToge2FjdHVhbFJlc3VsdH0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFRQcm90b2NvbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBUb0hleFZhbF9Xcm9uZ0lucHV0Q2hhcl9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVEpTT05Qcm90b2NvbEhlbHBlci5Ub0hleFZhbCgoYnl0ZSkncycpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRvSGV4Q2hhcl9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0CisgICAgICAgICAgICB2YXIgaGV4VmFsdWVzID0gbmV3IGJ5dGVbXSB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUgfTsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZENoYXJzID0gIjAxMjM0NTY3ODlhYmNkZWYiOworICAgICAgICAgICAgCisKKyAgICAgICAgICAgIHZhciBzZXRzID0gaGV4VmFsdWVzLlNlbGVjdCgoaHYsIGkpID0+IG5ldyBUdXBsZTxieXRlLCBjaGFyPihodiwgZXhwZWN0ZWRDaGFyc1tpXSkpLlRvTGlzdCgpOworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiBzZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBhY3R1YWxSZXN1bHQgPSBUSlNPTlByb3RvY29sSGVscGVyLlRvSGV4Q2hhcih0Lkl0ZW0xKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGFjdHVhbFJlc3VsdCA9PSB0Lkl0ZW0yLCAkIldyb25nIG1hcHBpbmcgb2YgaGV4IHZhbHVlIHt0Lkl0ZW0xfSB0byBpdCBleHBlY3RlZCBjaGFyOiB7dC5JdGVtMn0uIEFjdHVhbCBoZXggdmFsdWU6IHthY3R1YWxSZXN1bHR9Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL1Byb3RvY29scy9USnNvblByb3RvY29sVGVzdHMuY3MgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvUHJvdG9jb2xzL1RKc29uUHJvdG9jb2xUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjM3MzYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL1Byb3RvY29scy9USnNvblByb3RvY29sVGVzdHMuY3MKQEAgLTAsMCArMSw2NyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBOU3Vic3RpdHV0ZTsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuVGVzdHMuUHJvdG9jb2xzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBUSlNPTlByb3RvY29sVGVzdHMKKyAgICB7CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUSlNPTlByb3RvY29sX0Nhbl9DcmVhdGVfSW5zdGFuY2VfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBodHRwQ2xpZW50VHJhbnNwb3J0ID0gU3Vic3RpdHV0ZS5Gb3I8VEh0dHBDbGllbnRUcmFuc3BvcnQ+KG5ldyBVcmkoImh0dHA6Ly9sb2NhbGhvc3QiKSwgbnVsbCk7CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgVEpTT05Qcm90b2NvbFdyYXBwZXIoaHR0cENsaWVudFRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwocmVzdWx0KTsKKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwocmVzdWx0LldyYXBwZWRDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwocmVzdWx0LldyYXBwZWRSZWFkZXIpOworICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChyZXN1bHQuVHJhbnNwb3J0KTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LldyYXBwZWRSZWN1cnNpb25EZXB0aCA9PSAwKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LldyYXBwZWRSZWN1cnNpb25MaW1pdCA9PSBUUHJvdG9jb2wuRGVmYXVsdFJlY3Vyc2lvbkRlcHRoKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuVHJhbnNwb3J0LkVxdWFscyhodHRwQ2xpZW50VHJhbnNwb3J0KSk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5XcmFwcGVkQ29udGV4dC5HZXRUeXBlKCkuTmFtZS5FcXVhbHMoIkpTT05CYXNlQ29udGV4dCIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LldyYXBwZWRSZWFkZXIuR2V0VHlwZSgpLk5hbWUuRXF1YWxzKCJMb29rYWhlYWRSZWFkZXIiLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIFRKU09OUHJvdG9jb2xXcmFwcGVyIDogVEpzb25Qcm90b2NvbAorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgVEpTT05Qcm90b2NvbFdyYXBwZXIoVENsaWVudFRyYW5zcG9ydCB0cmFucykgOiBiYXNlKHRyYW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb2JqZWN0IFdyYXBwZWRDb250ZXh0ID0+IENvbnRleHQ7CisgICAgICAgICAgICBwdWJsaWMgb2JqZWN0IFdyYXBwZWRSZWFkZXIgPT4gUmVhZGVyOworICAgICAgICAgICAgcHVibGljIGludCBXcmFwcGVkUmVjdXJzaW9uRGVwdGggPT4gUmVjdXJzaW9uRGVwdGg7CisgICAgICAgICAgICBwdWJsaWMgaW50IFdyYXBwZWRSZWN1cnNpb25MaW1pdCA9PiBSZWN1cnNpb25MaW1pdDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9UaHJpZnQuVGVzdHMuY3Nwcm9qIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL1RocmlmdC5UZXN0cy5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ2ZjE2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9UaHJpZnQuVGVzdHMuY3Nwcm9qCkBAIC0wLDAgKzEsMTggQEAKK++7vzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldGNvcmVhcHAyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IkNvbXBhcmVORVRPYmplY3RzIiBWZXJzaW9uPSI0LjMuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuTkVULlRlc3QuU2RrIiBWZXJzaW9uPSIxNS41LjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTVNUZXN0LlRlc3RBZGFwdGVyIiBWZXJzaW9uPSIxLjIuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNU1Rlc3QuVGVzdEZyYW1ld29yayIgVmVyc2lvbj0iMS4yLjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTlN1YnN0aXR1dGUiIFZlcnNpb249IjMuMS4wIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxUaHJpZnRcVGhyaWZ0LmNzcHJvaiIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFNlcnZpY2UgSW5jbHVkZT0iezgyYTdmNDhkLTNiNTAtNGIxZS1iODJlLTNhZGE4MjEwYzM1OH0iIC8+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC5zbG4gYi9saWIvbmV0Y29yZS9UaHJpZnQuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMzBhYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQuc2xuCkBAIC0wLDAgKzEsODUgQEAKK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEyLjAwCisjIFZpc3VhbCBTdHVkaW8gMTUKK1Zpc3VhbFN0dWRpb1ZlcnNpb24gPSAxNS4wLjI2NzMwLjEyCitNaW5pbXVtVmlzdWFsU3R1ZGlvVmVyc2lvbiA9IDEwLjAuNDAyMTkuMQorUHJvamVjdCgiezIxNTBFMzMzLThGREMtNDJBMy05NDc0LTFBMzk1NkQ0NkRFOH0iKSA9ICJUZXN0cyIsICJUZXN0cyIsICJ7RjUxRkM0REEtQ0FDMC00OEIxLUEwNjktQjE3MTJCQ0FBNUJFfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiVGhyaWZ0IiwgIlRocmlmdFxUaHJpZnQuY3Nwcm9qIiwgIntEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJUaHJpZnQuSW50ZWdyYXRpb25UZXN0cyIsICJUZXN0c1xUaHJpZnQuSW50ZWdyYXRpb25UZXN0c1xUaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5jc3Byb2oiLCAiezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlRocmlmdC5UZXN0cyIsICJUZXN0c1xUaHJpZnQuVGVzdHNcVGhyaWZ0LlRlc3RzLmNzcHJvaiIsICJ7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cyIsICJUZXN0c1xUaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzXFRocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMuY3Nwcm9qIiwgIntBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUKKwkJRGVidWd8eDY0ID0gRGVidWd8eDY0CisJCURlYnVnfHg4NiA9IERlYnVnfHg4NgorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKKwkJUmVsZWFzZXx4NjQgPSBSZWxlYXNlfHg2NAorCQlSZWxlYXNlfHg4NiA9IFJlbGVhc2V8eDg2CisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihOZXN0ZWRQcm9qZWN0cykgPSBwcmVTb2x1dGlvbgorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fSA9IHtGNTFGQzREQS1DQUMwLTQ4QjEtQTA2OS1CMTcxMkJDQUE1QkV9CisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9ID0ge0Y1MUZDNERBLUNBQzAtNDhCMS1BMDY5LUIxNzEyQkNBQTVCRX0KKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30gPSB7RjUxRkM0REEtQ0FDMC00OEIxLUEwNjktQjE3MTJCQ0FBNUJFfQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlHbG9iYWxzKSA9IHBvc3RTb2x1dGlvbgorCQlTb2x1dGlvbkd1aWQgPSB7RkQyMEJDNEEtMDEwOS00MUQ4LThDMEMtODkzRTc4NEQ3RUY5fQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9ucy5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3YmZjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnMuY3MKQEAgLTAsMCArMSwxMDEgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKKworbmFtZXNwYWNlIFRocmlmdC5Db2xsZWN0aW9ucworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRDb2xsZWN0aW9ucworICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFRoaXMgd2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgdHdvIGNvbGxlY3Rpb25zIGFyZSB2YWx1ZS13aXNlIHRoZSBzYW1lLgorICAgICAgICAvLy8gICAgIElmIHRoZSBjb2xsZWN0aW9uIGNvbnRhaW5zIGEgY29sbGVjdGlvbiwgdGhlIGNvbGxlY3Rpb25zIHdpbGwgYmUgY29tcGFyZWQgdXNpbmcgdGhpcyBtZXRob2QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBFcXVhbHMoSUVudW1lcmFibGUgZmlyc3QsIElFbnVtZXJhYmxlIHNlY29uZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpcnN0ID09IG51bGwgJiYgc2Vjb25kID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmaXJzdCA9PSBudWxsIHx8IHNlY29uZCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGZpdGVyID0gZmlyc3QuR2V0RW51bWVyYXRvcigpOworICAgICAgICAgICAgdmFyIHNpdGVyID0gc2Vjb25kLkdldEVudW1lcmF0b3IoKTsKKworICAgICAgICAgICAgdmFyIGZuZXh0ID0gZml0ZXIuTW92ZU5leHQoKTsKKyAgICAgICAgICAgIHZhciBzbmV4dCA9IHNpdGVyLk1vdmVOZXh0KCk7CisKKyAgICAgICAgICAgIHdoaWxlIChmbmV4dCAmJiBzbmV4dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZmVudW0gPSBmaXRlci5DdXJyZW50IGFzIElFbnVtZXJhYmxlOworICAgICAgICAgICAgICAgIHZhciBzZW51bSA9IHNpdGVyLkN1cnJlbnQgYXMgSUVudW1lcmFibGU7CisKKyAgICAgICAgICAgICAgICBpZiAoZmVudW0gIT0gbnVsbCAmJiBzZW51bSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFFcXVhbHMoZmVudW0sIHNlbnVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZlbnVtID09IG51bGwgXiBzZW51bSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICghRXF1YWxzKGZpdGVyLkN1cnJlbnQsIHNpdGVyLkN1cnJlbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZuZXh0ID0gZml0ZXIuTW92ZU5leHQoKTsKKyAgICAgICAgICAgICAgICBzbmV4dCA9IHNpdGVyLk1vdmVOZXh0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmbmV4dCA9PSBzbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBUaGlzIHJldHVybnMgYSBoYXNoY29kZSBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhlIGVudW1lcmFibGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEdldEhhc2hDb2RlKElFbnVtZXJhYmxlIGVudW1lcmFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlbnVtZXJhYmxlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBoYXNoY29kZSA9IDA7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBvYmogaW4gZW51bWVyYWJsZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZW51bTIgPSBvYmogYXMgSUVudW1lcmFibGU7CisgICAgICAgICAgICAgICAgdmFyIG9iakhhc2ggPSBlbnVtMiA9PSBudWxsID8gb2JqLkdldEhhc2hDb2RlKCkgOiBHZXRIYXNoQ29kZShlbnVtMik7CisKKyAgICAgICAgICAgICAgICB1bmNoZWNrZWQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhhc2hjb2RlID0gKGhhc2hjb2RlKjM5NykgXiAob2JqSGFzaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gaGFzaGNvZGU7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L0NvbGxlY3Rpb25zL1RIYXNoU2V0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L0NvbGxlY3Rpb25zL1RIYXNoU2V0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMWYwYTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvQ29sbGVjdGlvbnMvVEhhc2hTZXQuY3MKQEAgLTAsMCArMSw2NyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK25hbWVzcGFjZSBUaHJpZnQuQ29sbGVjdGlvbnMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUSGFzaFNldDxUPiA6IElDb2xsZWN0aW9uPFQ+CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEhhc2hTZXQ8VD4gX3NldCA9IG5ldyBIYXNoU2V0PFQ+KCk7CisKKyAgICAgICAgcHVibGljIGludCBDb3VudCA9PiBfc2V0LkNvdW50OworCisgICAgICAgIHB1YmxpYyBib29sIElzUmVhZE9ubHkgPT4gZmFsc2U7CisKKyAgICAgICAgcHVibGljIHZvaWQgQWRkKFQgaXRlbSkKKyAgICAgICAgeworICAgICAgICAgICAgX3NldC5BZGQoaXRlbSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBDbGVhcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zZXQuQ2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIENvbnRhaW5zKFQgaXRlbSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9zZXQuQ29udGFpbnMoaXRlbSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBDb3B5VG8oVFtdIGFycmF5LCBpbnQgYXJyYXlJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgX3NldC5Db3B5VG8oYXJyYXksIGFycmF5SW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElFbnVtZXJhdG9yIEdldEVudW1lcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3NldC5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBJRW51bWVyYXRvcjxUPiBJRW51bWVyYWJsZTxUPi5HZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICgoSUVudW1lcmFibGU8VD4pIF9zZXQpLkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIFJlbW92ZShUIGl0ZW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfc2V0LlJlbW92ZShpdGVtKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvSVRBc3luY1Byb2Nlc3Nvci5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9JVEFzeW5jUHJvY2Vzc29yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOGU0MGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvSVRBc3luY1Byb2Nlc3Nvci5jcwpAQCAtMCwwICsxLDI5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICBwdWJsaWMgaW50ZXJmYWNlIElUQXN5bmNQcm9jZXNzb3IKKyAgICB7CisgICAgICAgIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KTsKKyAgICAgICAgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L0lUUHJvY2Vzc29yRmFjdG9yeS5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9JVFByb2Nlc3NvckZhY3RvcnkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEzM2U1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9JVFByb2Nlc3NvckZhY3RvcnkuY3MKQEAgLTAsMCArMSwyOCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgaW50ZXJmYWNlIElUUHJvY2Vzc29yRmFjdG9yeQorICAgIHsKKyAgICAgICAgSVRBc3luY1Byb2Nlc3NvciBHZXRBc3luY1Byb2Nlc3NvcihUQ2xpZW50VHJhbnNwb3J0IHRyYW5zLCBUQmFzZVNlcnZlciBiYXNlU2VydmVyID0gbnVsbCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQxNzIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNTYgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCJDIyAuTkVUIENvcmUgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0iKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisvL0BUT0RPIHdoZXJlIHRvIHB1dCBMaWNlbnNlIGluZm9ybWF0aW9uPworCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgZXhUeXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCBleFR5cGUuCisKK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorCitbYXNzZW1ibHk6IEd1aWQoImRmM2Y4ZWYwLWUwYTMtNGM4Ni1hNjViLThlYzg0ZTAxNmIxZCIpXQorCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgorCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RGaWVsZC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVEZpZWxkLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMTE1MzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RGaWVsZC5jcwpAQCAtMCwwICsxLDM3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllcworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIHN0cnVjdCBURmllbGQKKyAgICB7CisgICAgICAgIHB1YmxpYyBURmllbGQoc3RyaW5nIG5hbWUsIFRUeXBlIHR5cGUsIHNob3J0IGlkKQorICAgICAgICB7CisgICAgICAgICAgICBOYW1lID0gbmFtZTsKKyAgICAgICAgICAgIFR5cGUgPSB0eXBlOworICAgICAgICAgICAgSUQgPSBpZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgcHVibGljIFRUeXBlIFR5cGUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nIC0gZG8gbm90IHJlbmFtZSAtIGl0IHVzZWQgZm9yIGdlbmVyYXRpb24gCisgICAgICAgIHB1YmxpYyBzaG9ydCBJRCB7IGdldDsgc2V0OyB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVExpc3QuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RMaXN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMjMyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RMaXN0LmNzCkBAIC0wLDAgKzEsMzMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgc3RydWN0IFRMaXN0CisgICAgeworICAgICAgICBwdWJsaWMgVExpc3QoVFR5cGUgZWxlbWVudFR5cGUsIGludCBjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICAgICAgICAgIENvdW50ID0gY291bnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFR5cGUgRWxlbWVudFR5cGUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQgeyBnZXQ7IHNldDsgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RNYXAuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RNYXAuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE5NTU5MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVE1hcC5jcwpAQCAtMCwwICsxLDM2IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllcworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIHN0cnVjdCBUTWFwCisgICAgeworICAgICAgICBwdWJsaWMgVE1hcChUVHlwZSBrZXlUeXBlLCBUVHlwZSB2YWx1ZVR5cGUsIGludCBjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgS2V5VHlwZSA9IGtleVR5cGU7CisgICAgICAgICAgICBWYWx1ZVR5cGUgPSB2YWx1ZVR5cGU7CisgICAgICAgICAgICBDb3VudCA9IGNvdW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUeXBlIEtleVR5cGUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBUVHlwZSBWYWx1ZVR5cGUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQgeyBnZXQ7IHNldDsgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RNZXNzYWdlLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWVzc2FnZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2Y0OTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWVzc2FnZS5jcwpAQCAtMCwwICsxLDM3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllcworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIHN0cnVjdCBUTWVzc2FnZQorICAgIHsKKyAgICAgICAgcHVibGljIFRNZXNzYWdlKHN0cmluZyBuYW1lLCBUTWVzc2FnZVR5cGUgdHlwZSwgaW50IHNlcWlkKQorICAgICAgICB7CisgICAgICAgICAgICBOYW1lID0gbmFtZTsKKyAgICAgICAgICAgIFR5cGUgPSB0eXBlOworICAgICAgICAgICAgU2VxSUQgPSBzZXFpZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgcHVibGljIFRNZXNzYWdlVHlwZSBUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZyAtIGRvIG5vdCByZW5hbWUgLSBpdCB1c2VkIGZvciBnZW5lcmF0aW9uIAorICAgICAgICBwdWJsaWMgaW50IFNlcUlEIHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWVzc2FnZVR5cGUuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RNZXNzYWdlVHlwZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2I5YTIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWVzc2FnZVR5cGUuY3MKQEAgLTAsMCArMSwyOCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBlbnVtIFRNZXNzYWdlVHlwZQorICAgIHsKKyAgICAgICAgQ2FsbCA9IDEsCisgICAgICAgIFJlcGx5ID0gMiwKKyAgICAgICAgRXhjZXB0aW9uID0gMywKKyAgICAgICAgT25ld2F5ID0gNAorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RTZXQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RTZXQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU4M2I1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVFNldC5jcwpAQCAtMCwwICsxLDM4IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllcworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIHN0cnVjdCBUU2V0CisgICAgeworICAgICAgICBwdWJsaWMgVFNldChUVHlwZSBlbGVtZW50VHlwZSwgaW50IGNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBFbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOworICAgICAgICAgICAgQ291bnQgPSBjb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2V0KFRMaXN0IGxpc3QpCisgICAgICAgICAgICA6IHRoaXMobGlzdC5FbGVtZW50VHlwZSwgbGlzdC5Db3VudCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUeXBlIEVsZW1lbnRUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgaW50IENvdW50IHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UU3RydWN0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UU3RydWN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOGRjYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RTdHJ1Y3QuY3MKQEAgLTAsMCArMSwzMCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVFN0cnVjdAorICAgIHsKKyAgICAgICAgcHVibGljIFRTdHJ1Y3Qoc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIE5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBOYW1lIHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UVHlwZS5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVFR5cGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlNzgxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVFR5cGUuY3MKQEAgLTAsMCArMSwzNyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBlbnVtIFRUeXBlIDogYnl0ZQorICAgIHsKKyAgICAgICAgU3RvcCA9IDAsCisgICAgICAgIFZvaWQgPSAxLAorICAgICAgICBCb29sID0gMiwKKyAgICAgICAgQnl0ZSA9IDMsCisgICAgICAgIERvdWJsZSA9IDQsCisgICAgICAgIEkxNiA9IDYsCisgICAgICAgIEkzMiA9IDgsCisgICAgICAgIEk2NCA9IDEwLAorICAgICAgICBTdHJpbmcgPSAxMSwKKyAgICAgICAgU3RydWN0ID0gMTIsCisgICAgICAgIE1hcCA9IDEzLAorICAgICAgICBTZXQgPSAxNCwKKyAgICAgICAgTGlzdCA9IDE1CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvSVRQcm90b2NvbEZhY3RvcnkuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0lUUHJvdG9jb2xGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYzVjYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0lUUHJvdG9jb2xGYWN0b3J5LmNzCkBAIC0wLDAgKzEsMjcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGludGVyZmFjZSBJVFByb3RvY29sRmFjdG9yeQorICAgIHsKKyAgICAgICAgVFByb3RvY29sIEdldFByb3RvY29sKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RBYnN0cmFjdEJhc2UuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RBYnN0cmFjdEJhc2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUxODY4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVEFic3RyYWN0QmFzZS5jcwpAQCAtMCwwICsxLDI4IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBpbnRlcmZhY2UgVEFic3RyYWN0QmFzZQorICAgIHsKKyAgICAgICAgVGFzayBXcml0ZUFzeW5jKFRQcm90b2NvbCB0UHJvdG9jb2wsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQmFzZS5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVEJhc2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE0ZTFhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVEJhc2UuY3MKQEAgLTAsMCArMSwyOCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRCYXNlIDogVEFic3RyYWN0QmFzZQorICAgIHsKKyAgICAgICAgVGFzayBSZWFkQXN5bmMoVFByb3RvY29sIHRQcm90b2NvbCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RCaW5hcnlQcm90b2NvbC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVEJpbmFyeVByb3RvY29sLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZWM4NWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RCaW5hcnlQcm90b2NvbC5jcwpAQCAtMCwwICsxLDYxMyBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUQmluYXJ5UHJvdG9jb2wgOiBUUHJvdG9jb2wKKyAgICB7CisgICAgICAgIC8vVE9ETzogVW5pdCB0ZXN0cworICAgICAgICAvL1RPRE86IExvY2FsaXphdGlvbgorICAgICAgICAvL1RPRE86IHByYWdtYQorCisgICAgICAgIHByb3RlY3RlZCBjb25zdCB1aW50IFZlcnNpb25NYXNrID0gMHhmZmZmMDAwMDsKKyAgICAgICAgcHJvdGVjdGVkIGNvbnN0IHVpbnQgVmVyc2lvbjEgPSAweDgwMDEwMDAwOworCisgICAgICAgIHByb3RlY3RlZCBib29sIFN0cmljdFJlYWQ7CisgICAgICAgIHByb3RlY3RlZCBib29sIFN0cmljdFdyaXRlOworCisgICAgICAgIHB1YmxpYyBUQmluYXJ5UHJvdG9jb2woVENsaWVudFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIDogdGhpcyh0cmFucywgZmFsc2UsIHRydWUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUQmluYXJ5UHJvdG9jb2woVENsaWVudFRyYW5zcG9ydCB0cmFucywgYm9vbCBzdHJpY3RSZWFkLCBib29sIHN0cmljdFdyaXRlKQorICAgICAgICAgICAgOiBiYXNlKHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpY3RSZWFkID0gc3RyaWN0UmVhZDsKKyAgICAgICAgICAgIFN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKFRNZXNzYWdlIG1lc3NhZ2UsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoU3RyaWN0V3JpdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHZlcnNpb24gPSBWZXJzaW9uMSB8ICh1aW50KSBtZXNzYWdlLlR5cGU7CisgICAgICAgICAgICAgICAgYXdhaXQgV3JpdGVJMzJBc3luYygoaW50KSB2ZXJzaW9uLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgYXdhaXQgV3JpdGVTdHJpbmdBc3luYyhtZXNzYWdlLk5hbWUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBXcml0ZUkzMkFzeW5jKG1lc3NhZ2UuU2VxSUQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBXcml0ZVN0cmluZ0FzeW5jKG1lc3NhZ2UuTmFtZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKChzYnl0ZSkgbWVzc2FnZS5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgYXdhaXQgV3JpdGVJMzJBc3luYyhtZXNzYWdlLlNlcUlELCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RydWN0QmVnaW5Bc3luYyhUU3RydWN0IEBzdHJ1Y3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRCZWdpbkFzeW5jKFRGaWVsZCBmaWVsZCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKChzYnl0ZSkgZmllbGQuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVJMTZBc3luYyhmaWVsZC5JRCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVGaWVsZFN0b3BBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVCeXRlQXN5bmMoKHNieXRlKSBUVHlwZS5TdG9wLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1hcEJlZ2luQXN5bmMoVE1hcCBtYXAsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBXcml0ZUJ5dGVBc3luYygoc2J5dGUpIG1hcC5LZXlUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUJ5dGVBc3luYygoc2J5dGUpIG1hcC5WYWx1ZVR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSTMyQXN5bmMobWFwLkNvdW50LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVMaXN0QmVnaW5Bc3luYyhUTGlzdCBsaXN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVCeXRlQXN5bmMoKHNieXRlKSBsaXN0LkVsZW1lbnRUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUkzMkFzeW5jKGxpc3QuQ291bnQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRCZWdpbkFzeW5jKFRTZXQgc2V0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVCeXRlQXN5bmMoKHNieXRlKSBzZXQuRWxlbWVudFR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSTMyQXN5bmMoc2V0LkNvdW50LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCb29sQXN5bmMoYm9vbCBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVCeXRlQXN5bmMoYiA/IChzYnl0ZSkgMSA6IChzYnl0ZSkgMCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIHN0YXRpYyBieXRlW10gQ3JlYXRlV3JpdGVCeXRlKHNieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBib3V0ID0gbmV3IGJ5dGVbMV07CisKKyAgICAgICAgICAgIGJvdXRbMF0gPSAoYnl0ZSkgYjsKKworICAgICAgICAgICAgcmV0dXJuIGJvdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJ5dGVBc3luYyhzYnl0ZSBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJvdXQgPSBDcmVhdGVXcml0ZUJ5dGUoYik7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJvdXQsIDAsIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBzdGF0aWMgYnl0ZVtdIENyZWF0ZVdyaXRlSTE2KHNob3J0IHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpMTZPdXQgPSBuZXcgYnl0ZVsyXTsKKworICAgICAgICAgICAgaTE2T3V0WzBdID0gKGJ5dGUpICgweGZmICYgKHMgPj4gOCkpOworICAgICAgICAgICAgaTE2T3V0WzFdID0gKGJ5dGUpICgweGZmICYgcyk7CisKKyAgICAgICAgICAgIHJldHVybiBpMTZPdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUkxNkFzeW5jKHNob3J0IGkxNiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBpMTZPdXQgPSBDcmVhdGVXcml0ZUkxNihpMTYpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhpMTZPdXQsIDAsIDIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBzdGF0aWMgYnl0ZVtdIENyZWF0ZVdyaXRlSTMyKGludCBpMzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpMzJPdXQgPSBuZXcgYnl0ZVs0XTsKKworICAgICAgICAgICAgaTMyT3V0WzBdID0gKGJ5dGUpICgweGZmICYgKGkzMiA+PiAyNCkpOworICAgICAgICAgICAgaTMyT3V0WzFdID0gKGJ5dGUpICgweGZmICYgKGkzMiA+PiAxNikpOworICAgICAgICAgICAgaTMyT3V0WzJdID0gKGJ5dGUpICgweGZmICYgKGkzMiA+PiA4KSk7CisgICAgICAgICAgICBpMzJPdXRbM10gPSAoYnl0ZSkgKDB4ZmYgJiBpMzIpOworCisgICAgICAgICAgICByZXR1cm4gaTMyT3V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMzJBc3luYyhpbnQgaTMyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGkzMk91dCA9IENyZWF0ZVdyaXRlSTMyKGkzMik7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGkzMk91dCwgMCwgNCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIHN0YXRpYyBieXRlW10gQ3JlYXRlV3JpdGVJNjQobG9uZyBpNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpNjRPdXQgPSBuZXcgYnl0ZVs4XTsKKworICAgICAgICAgICAgaTY0T3V0WzBdID0gKGJ5dGUpICgweGZmICYgKGk2NCA+PiA1NikpOworICAgICAgICAgICAgaTY0T3V0WzFdID0gKGJ5dGUpICgweGZmICYgKGk2NCA+PiA0OCkpOworICAgICAgICAgICAgaTY0T3V0WzJdID0gKGJ5dGUpICgweGZmICYgKGk2NCA+PiA0MCkpOworICAgICAgICAgICAgaTY0T3V0WzNdID0gKGJ5dGUpICgweGZmICYgKGk2NCA+PiAzMikpOworICAgICAgICAgICAgaTY0T3V0WzRdID0gKGJ5dGUpICgweGZmICYgKGk2NCA+PiAyNCkpOworICAgICAgICAgICAgaTY0T3V0WzVdID0gKGJ5dGUpICgweGZmICYgKGk2NCA+PiAxNikpOworICAgICAgICAgICAgaTY0T3V0WzZdID0gKGJ5dGUpICgweGZmICYgKGk2NCA+PiA4KSk7CisgICAgICAgICAgICBpNjRPdXRbN10gPSAoYnl0ZSkgKDB4ZmYgJiBpNjQpOworCisgICAgICAgICAgICByZXR1cm4gaTY0T3V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJNjRBc3luYyhsb25nIGk2NCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBpNjRPdXQgPSBDcmVhdGVXcml0ZUk2NChpNjQpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhpNjRPdXQsIDAsIDgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRG91YmxlQXN5bmMoZG91YmxlIGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBXcml0ZUk2NEFzeW5jKEJpdENvbnZlcnRlci5Eb3VibGVUb0ludDY0Qml0cyhkKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCaW5hcnlBc3luYyhieXRlW10gYnl0ZXMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBXcml0ZUkzMkFzeW5jKGJ5dGVzLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhieXRlcywgMCwgYnl0ZXMuTGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUTWVzc2FnZT4gUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRNZXNzYWdlPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRNZXNzYWdlKCk7CisgICAgICAgICAgICB2YXIgc2l6ZSA9IGF3YWl0IFJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHZlcnNpb24gPSAodWludCkgc2l6ZSAmIFZlcnNpb25NYXNrOworICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IFZlcnNpb24xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAkIkJhZCB2ZXJzaW9uIGluIFJlYWRNZXNzYWdlQmVnaW46IHt2ZXJzaW9ufSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZXNzYWdlLlR5cGUgPSAoVE1lc3NhZ2VUeXBlKSAoc2l6ZSAmIDB4MDAwMDAwZmYpOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuTmFtZSA9IGF3YWl0IFJlYWRTdHJpbmdBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5TZXFJRCA9IGF3YWl0IFJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFN0cmljdFJlYWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIHZlcnNpb24gaW4gUmVhZE1lc3NhZ2VCZWdpbiwgb2xkIGNsaWVudD8iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVzc2FnZS5OYW1lID0gYXdhaXQgUmVhZFN0cmluZ0JvZHlBc3luYyhzaXplLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5UeXBlID0gKFRNZXNzYWdlVHlwZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5TZXFJRCA9IGF3YWl0IFJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUU3RydWN0PiBSZWFkU3RydWN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9UT0RPOiBubyByZWFkIGZyb20gaW50ZXJuYWwgdHJhbnNwb3J0PworICAgICAgICAgICAgcmV0dXJuIG5ldyBUU3RydWN0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxURmllbGQ+IFJlYWRGaWVsZEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VEZpZWxkPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBmaWVsZCA9IG5ldyBURmllbGQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUeXBlID0gKFRUeXBlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgIT0gVFR5cGUuU3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWVsZC5JRCA9IGF3YWl0IFJlYWRJMTZBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1hcD4gUmVhZE1hcEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VE1hcD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgbWFwID0gbmV3IFRNYXAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBLZXlUeXBlID0gKFRUeXBlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSwKKyAgICAgICAgICAgICAgICBWYWx1ZVR5cGUgPSAoVFR5cGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pLAorICAgICAgICAgICAgICAgIENvdW50ID0gYXdhaXQgUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgcmV0dXJuIG1hcDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRMaXN0PiBSZWFkTGlzdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VExpc3Q+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGxpc3QgPSBuZXcgVExpc3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50VHlwZSA9IChUVHlwZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbiksCisgICAgICAgICAgICAgICAgQ291bnQgPSBhd2FpdCBSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICByZXR1cm4gbGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUU2V0PiBSZWFkU2V0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUU2V0PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBzZXQgPSBuZXcgVFNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVsZW1lbnRUeXBlID0gKFRUeXBlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSwKKyAgICAgICAgICAgICAgICBDb3VudCA9IGF3YWl0IFJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHJldHVybiBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkU2V0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxib29sPiBSZWFkQm9vbEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGJvb2w+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pID09IDE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzYnl0ZT4gUmVhZEJ5dGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxzYnl0ZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYmluID0gbmV3IGJ5dGVbMV07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoYmluLCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7IC8vVE9ETzogd2h5IHJlYWRhbGwgPworICAgICAgICAgICAgcmV0dXJuIChzYnl0ZSkgYmluWzBdOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c2hvcnQ+IFJlYWRJMTZBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxzaG9ydD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaTE2SW4gPSBuZXcgYnl0ZVsyXTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLlJlYWRBbGxBc3luYyhpMTZJbiwgMCwgMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IChzaG9ydCkgKCgoaTE2SW5bMF0gJiAweGZmKSA8PCA4KSB8IGkxNkluWzFdICYgMHhmZik7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkSTMyQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8aW50PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBpMzJJbiA9IG5ldyBieXRlWzRdOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuUmVhZEFsbEFzeW5jKGkzMkluLCAwLCA0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSAKKyAgICAgICAgICAgICAgICAoKGkzMkluWzBdICYgMHhmZikgPDwgMjQpIHwgCisgICAgICAgICAgICAgICAgKChpMzJJblsxXSAmIDB4ZmYpIDw8IDE2KSB8IAorICAgICAgICAgICAgICAgICgoaTMySW5bMl0gJiAweGZmKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgaTMySW5bM10gJiAweGZmOworCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDY3NQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBsb25nIENyZWF0ZVJlYWRJNjQoYnl0ZVtdIGJ1ZikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9CisgICAgICAgICAgICAgICAgKChsb25nKSAoYnVmWzBdICYgMHhmZikgPDwgNTYpIHwKKyAgICAgICAgICAgICAgICAoKGxvbmcpIChidWZbMV0gJiAweGZmKSA8PCA0OCkgfAorICAgICAgICAgICAgICAgICgobG9uZykgKGJ1ZlsyXSAmIDB4ZmYpIDw8IDQwKSB8CisgICAgICAgICAgICAgICAgKChsb25nKSAoYnVmWzNdICYgMHhmZikgPDwgMzIpIHwKKyAgICAgICAgICAgICAgICAoKGxvbmcpIChidWZbNF0gJiAweGZmKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICgobG9uZykgKGJ1Zls1XSAmIDB4ZmYpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgKChsb25nKSAoYnVmWzZdICYgMHhmZikgPDwgOCkgfAorICAgICAgICAgICAgICAgIGJ1Zls3XSAmIDB4ZmY7CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworI3ByYWdtYSB3YXJuaW5nIHJlc3RvcmUgNjc1CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8bG9uZz4gUmVhZEk2NEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGxvbmc+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGk2NEluID0gbmV3IGJ5dGVbOF07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoaTY0SW4sIDAsIDgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZWFkSTY0KGk2NEluKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGRvdWJsZT4gUmVhZERvdWJsZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGRvdWJsZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZCA9IGF3YWl0IFJlYWRJNjRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLkludDY0Qml0c1RvRG91YmxlKGQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkQmluYXJ5QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8Ynl0ZVtdPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBzaXplID0gYXdhaXQgUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHZhciBidWYgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLlJlYWRBbGxBc3luYyhidWYsIDAsIHNpemUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2s8c3RyaW5nPiBSZWFkU3RyaW5nQm9keUFzeW5jKGludCBzaXplLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPHN0cmluZz4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoYnVmLCAwLCBzaXplLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogSVRQcm90b2NvbEZhY3RvcnkKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2wgU3RyaWN0UmVhZDsKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sIFN0cmljdFdyaXRlOworCisgICAgICAgICAgICBwdWJsaWMgRmFjdG9yeSgpCisgICAgICAgICAgICAgICAgOiB0aGlzKGZhbHNlLCB0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgRmFjdG9yeShib29sIHN0cmljdFJlYWQsIGJvb2wgc3RyaWN0V3JpdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaWN0UmVhZCA9IHN0cmljdFJlYWQ7CisgICAgICAgICAgICAgICAgU3RyaWN0V3JpdGUgPSBzdHJpY3RXcml0ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRQcm90b2NvbCBHZXRQcm90b2NvbChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zLCBTdHJpY3RSZWFkLCBTdHJpY3RXcml0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQ29tcGFjdFByb3RvY29sLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQ29tcGFjdFByb3RvY29sLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlY2RmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RDb21wYWN0UHJvdG9jb2wuY3MKQEAgLTAsMCArMSw5MjIgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMKK3sKKyAgICAvL1RPRE86IGltcGxlbWVudGF0aW9uIG9mIFRQcm90b2NvbAorCisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVENvbXBhY3RQcm90b2NvbCA6IFRQcm90b2NvbAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBieXRlIFByb3RvY29sSWQgPSAweDgyOworICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVmVyc2lvbiA9IDE7CisgICAgICAgIHByaXZhdGUgY29uc3QgYnl0ZSBWZXJzaW9uTWFzayA9IDB4MWY7IC8vIDAwMDEgMTExMQorICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVHlwZU1hc2sgPSAweEUwOyAvLyAxMTEwIDAwMDAKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBieXRlIFR5cGVCaXRzID0gMHgwNzsgLy8gMDAwMCAwMTExCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IFR5cGVTaGlmdEFtb3VudCA9IDU7CisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRTdHJ1Y3QgQW5vbnltb3VzU3RydWN0ID0gbmV3IFRTdHJ1Y3Qoc3RyaW5nLkVtcHR5KTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEZpZWxkIFRzdG9wID0gbmV3IFRGaWVsZChzdHJpbmcuRW1wdHksIFRUeXBlLlN0b3AsIDApOworCisgICAgICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBUVHlwZVRvQ29tcGFjdFR5cGUgPSBuZXcgYnl0ZVsxNl07CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBmaWVsZCBmb3IgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0cnVjdHMsIHNvIHdlIGNhbiBkbyB0aGUgZGVsdGEgc3R1ZmYuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU3RhY2s8c2hvcnQ+IF9sYXN0RmllbGQgPSBuZXcgU3RhY2s8c2hvcnQ+KDE1KTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUgc28gaXQgY2FuIGhhdmUgdGhlIHZhbHVlIGluY29ycG9yYXRlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBURmllbGQ/IF9ib29sZWFuRmllbGQ7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIElmIHdlIFJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBoZXJlIHNvIHRoYXQgUmVhZEJvb2wgY2FuIHVzZSBpdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBib29sPyBfYm9vbFZhbHVlOworCisgICAgICAgIHByaXZhdGUgc2hvcnQgX2xhc3RGaWVsZElkOworCisgICAgICAgIHB1YmxpYyBUQ29tcGFjdFByb3RvY29sKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICA6IGJhc2UodHJhbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5TdG9wXSA9IFR5cGVzLlN0b3A7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuQm9vbF0gPSBUeXBlcy5Cb29sZWFuVHJ1ZTsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5CeXRlXSA9IFR5cGVzLkJ5dGU7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuSTE2XSA9IFR5cGVzLkkxNjsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5JMzJdID0gVHlwZXMuSTMyOworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLkk2NF0gPSBUeXBlcy5JNjQ7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuRG91YmxlXSA9IFR5cGVzLkRvdWJsZTsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5TdHJpbmddID0gVHlwZXMuQmluYXJ5OworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLkxpc3RdID0gVHlwZXMuTGlzdDsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5TZXRdID0gVHlwZXMuU2V0OworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLk1hcF0gPSBUeXBlcy5NYXA7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuU3RydWN0XSA9IFR5cGVzLlN0cnVjdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFJlc2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgX2xhc3RGaWVsZC5DbGVhcigpOworICAgICAgICAgICAgX2xhc3RGaWVsZElkID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWVzc2FnZUJlZ2luQXN5bmMoVE1lc3NhZ2UgbWVzc2FnZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMobmV3W10ge1Byb3RvY29sSWR9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdAorICAgICAgICAgICAgICAgIFRyYW5zLldyaXRlQXN5bmMoCisgICAgICAgICAgICAgICAgICAgIG5ld1tdIHsoYnl0ZSkgKChWZXJzaW9uICYgVmVyc2lvbk1hc2spIHwgKCgodWludCkgbWVzc2FnZS5UeXBlIDw8IFR5cGVTaGlmdEFtb3VudCkgJiBUeXBlTWFzaykpfSwKKyAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICB2YXIgYnVmZmVyVHVwbGUgPSBDcmVhdGVXcml0ZVZhckludDMyKCh1aW50KSBtZXNzYWdlLlNlcUlEKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnVmZmVyVHVwbGUuSXRlbTEsIDAsIGJ1ZmZlclR1cGxlLkl0ZW0yLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlU3RyaW5nQXN5bmMobWVzc2FnZS5OYW1lLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBXcml0ZSBhIHN0cnVjdCBiZWdpbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UKKyAgICAgICAgLy8vICAgICB1c2UgaXQgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQKKyAgICAgICAgLy8vICAgICBzdGFjayBzbyB3ZSBjYW4gZ2V0IHRoZSBmaWVsZCBpZCBkZWx0YXMgY29ycmVjdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKFRTdHJ1Y3QgQHN0cnVjdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9sYXN0RmllbGQuUHVzaChfbGFzdEZpZWxkSWQpOworICAgICAgICAgICAgX2xhc3RGaWVsZElkID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9sYXN0RmllbGRJZCA9IF9sYXN0RmllbGQuUG9wKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWxBc3luYyhURmllbGQgZmllbGQsIGJ5dGUgdHlwZU92ZXJyaWRlLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlmIHRoZXJlJ3MgYSBleFR5cGUgb3ZlcnJpZGUsIHVzZSB0aGF0LgorICAgICAgICAgICAgdmFyIHR5cGVUb1dyaXRlID0gdHlwZU92ZXJyaWRlID09IDB4RkYgPyBHZXRDb21wYWN0VHlwZShmaWVsZC5UeXBlKSA6IHR5cGVPdmVycmlkZTsKKworICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgY2FuIHVzZSBkZWx0YSBlbmNvZGluZyBmb3IgdGhlIGZpZWxkIGlkCisgICAgICAgICAgICBpZiAoKGZpZWxkLklEID4gX2xhc3RGaWVsZElkKSAmJiAoZmllbGQuSUQgLSBfbGFzdEZpZWxkSWQgPD0gMTUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBiID0gKGJ5dGUpICgoKGZpZWxkLklEIC0gX2xhc3RGaWVsZElkKSA8PCA0KSB8IHR5cGVUb1dyaXRlKTsKKyAgICAgICAgICAgICAgICAvLyBXcml0ZSB0aGVtIHRvZ2V0aGVyCisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7Yn0sIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBXcml0ZSB0aGVtIHNlcGFyYXRlCisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7dHlwZVRvV3JpdGV9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgYXdhaXQgV3JpdGVJMTZBc3luYyhmaWVsZC5JRCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfbGFzdEZpZWxkSWQgPSBmaWVsZC5JRDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRCZWdpbkFzeW5jKFRGaWVsZCBmaWVsZCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlID09IFRUeXBlLkJvb2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2Jvb2xlYW5GaWVsZCA9IGZpZWxkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFdyaXRlRmllbGRCZWdpbkludGVybmFsQXN5bmMoZmllbGQsIDB4RkYsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRTdG9wQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMobmV3W10ge1R5cGVzLlN0b3B9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYXN5bmMgVGFzayBXcml0ZUNvbGxlY3Rpb25CZWdpbkFzeW5jKFRUeXBlIGVsZW1UeXBlLCBpbnQgc2l6ZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBBYnN0cmFjdCBtZXRob2QgZm9yIHdyaXRpbmcgdGhlIHN0YXJ0IG9mIGxpc3RzIGFuZCBzZXRzLiBMaXN0IGFuZCBzZXRzIG9uCisgICAgICAgICAgICAgdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIGV4VHlwZSBpbmRpY2F0b3IuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICBpZiAoc2l6ZSA8PSAxNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKG5ld1tdIHsoYnl0ZSkgKChzaXplIDw8IDQpIHwgR2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKX0sIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKG5ld1tdIHsoYnl0ZSkgKDB4ZjAgfCBHZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpfSwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICAgICAgdmFyIGJ1ZmZlclR1cGxlID0gQ3JlYXRlV3JpdGVWYXJJbnQzMigodWludCkgc2l6ZSk7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTGlzdEJlZ2luQXN5bmMoVExpc3QgbGlzdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQ29sbGVjdGlvbkJlZ2luQXN5bmMobGlzdC5FbGVtZW50VHlwZSwgbGlzdC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVNldEJlZ2luQXN5bmMoVFNldCBzZXQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBXcml0ZUNvbGxlY3Rpb25CZWdpbkFzeW5jKHNldC5FbGVtZW50VHlwZSwgc2V0LkNvdW50LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCb29sQXN5bmMoYm9vbCBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIFdyaXRlIGEgYm9vbGVhbiB2YWx1ZS4gUG90ZW50aWFsbHksIHRoaXMgY291bGQgYmUgYSBib29sZWFuIGZpZWxkLCBpbgorICAgICAgICAgICAgd2hpY2ggY2FzZSB0aGUgZmllbGQgaGVhZGVyIGluZm8gaXNuJ3Qgd3JpdHRlbiB5ZXQuIElmIHNvLCBkZWNpZGUgd2hhdCB0aGUKKyAgICAgICAgICAgIHJpZ2h0IGV4VHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiBXcml0ZSB0aGUgZmllbGQgaGVhZGVyLgorICAgICAgICAgICAgT3RoZXJ3aXNlLCBXcml0ZSBhIHNpbmdsZSBieXRlLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgaWYgKF9ib29sZWFuRmllbGQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKKyAgICAgICAgICAgICAgICBhd2FpdAorICAgICAgICAgICAgICAgICAgICBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbEFzeW5jKF9ib29sZWFuRmllbGQuVmFsdWUsIGIgPyBUeXBlcy5Cb29sZWFuVHJ1ZSA6IFR5cGVzLkJvb2xlYW5GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBfYm9vbGVhbkZpZWxkID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IFdyaXRlIHRoZSB2YWx1ZS4KKyAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKG5ld1tdIHtiID8gVHlwZXMuQm9vbGVhblRydWUgOiBUeXBlcy5Cb29sZWFuRmFsc2V9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJ5dGVBc3luYyhzYnl0ZSBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7KGJ5dGUpIGJ9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUkxNkFzeW5jKHNob3J0IGkxNiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBidWZmZXJUdXBsZSA9IENyZWF0ZVdyaXRlVmFySW50MzIoSW50VG9aaWd6YWcoaTE2KSk7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ1ZmZlclR1cGxlLkl0ZW0xLCAwLCBidWZmZXJUdXBsZS5JdGVtMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIFR1cGxlPGJ5dGVbXSwgaW50PiBDcmVhdGVXcml0ZVZhckludDMyKHVpbnQgbikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LlJlc3VsdHMgaW4gMSAtIDUgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAgICAgICAgICB2YXIgaTMyQnVmID0gbmV3IGJ5dGVbNV07CisgICAgICAgICAgICB2YXIgaWR4ID0gMDsKKworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChuICYgfjB4N0YpID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpMzJCdWZbaWR4KytdID0gKGJ5dGUpIG47CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGkzMkJ1ZltpZHgrK10gPSAoYnl0ZSkgKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgICAgICAgICAgICBuID4+PSA3OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IFR1cGxlPGJ5dGVbXSwgaW50PihpMzJCdWYsIGlkeCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUkzMkFzeW5jKGludCBpMzIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmZmVyVHVwbGUgPSBDcmVhdGVXcml0ZVZhckludDMyKEludFRvWmlnemFnKGkzMikpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBUdXBsZTxieXRlW10sIGludD4gQ3JlYXRlV3JpdGVWYXJJbnQ2NCh1bG9uZyBuKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICAgICAgICAgIHZhciBidWYgPSBuZXcgYnl0ZVsxMF07CisgICAgICAgICAgICB2YXIgaWR4ID0gMDsKKworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChuICYgfih1bG9uZykgMHg3RkwpID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBidWZbaWR4KytdID0gKGJ5dGUpIG47CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWZbaWR4KytdID0gKGJ5dGUpICgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgICAgICAgICAgbiA+Pj0gNzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBUdXBsZTxieXRlW10sIGludD4oYnVmLCBpZHgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJNjRBc3luYyhsb25nIGk2NCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBidWZmZXJUdXBsZSA9IENyZWF0ZVdyaXRlVmFySW50NjQoTG9uZ1RvWmlnemFnKGk2NCkpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRG91YmxlQXN5bmMoZG91YmxlIGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZGF0YSA9IG5ldyBieXRlWzhdOworICAgICAgICAgICAgRml4ZWRMb25nVG9CeXRlcyhCaXRDb252ZXJ0ZXIuRG91YmxlVG9JbnQ2NEJpdHMoZCksIGRhdGEsIDApOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhkYXRhLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cmluZ0FzeW5jKHN0cmluZyBzdHIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnl0ZXMgPSBFbmNvZGluZy5VVEY4LkdldEJ5dGVzKHN0cik7CisKKyAgICAgICAgICAgIHZhciBidWZmZXJUdXBsZSA9IENyZWF0ZVdyaXRlVmFySW50MzIoKHVpbnQpIGJ5dGVzLkxlbmd0aCk7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ1ZmZlclR1cGxlLkl0ZW0xLCAwLCBidWZmZXJUdXBsZS5JdGVtMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhieXRlcywgMCwgYnl0ZXMuTGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJpbmFyeUFzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBidWZmZXJUdXBsZSA9IENyZWF0ZVdyaXRlVmFySW50MzIoKHVpbnQpIGJ5dGVzLkxlbmd0aCk7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ1ZmZlclR1cGxlLkl0ZW0xLCAwLCBidWZmZXJUdXBsZS5JdGVtMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhieXRlcywgMCwgYnl0ZXMuTGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1hcEJlZ2luQXN5bmMoVE1hcCBtYXAsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobWFwLkNvdW50ID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7KGJ5dGUpIDB9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGJ1ZmZlclR1cGxlID0gQ3JlYXRlV3JpdGVWYXJJbnQzMigodWludCkgbWFwLkNvdW50KTsKKyAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ1ZmZlclR1cGxlLkl0ZW0xLCAwLCBidWZmZXJUdXBsZS5JdGVtMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGF3YWl0CisgICAgICAgICAgICAgICAgICAgIFRyYW5zLldyaXRlQXN5bmMoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdbXSB7KGJ5dGUpICgoR2V0Q29tcGFjdFR5cGUobWFwLktleVR5cGUpIDw8IDQpIHwgR2V0Q29tcGFjdFR5cGUobWFwLlZhbHVlVHlwZSkpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUTWVzc2FnZT4gUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRNZXNzYWdlPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBwcm90b2NvbElkID0gKGJ5dGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKHByb3RvY29sSWQgIT0gUHJvdG9jb2xJZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCQiRXhwZWN0ZWQgcHJvdG9jb2wgaWQge1Byb3RvY29sSWQ6WH0gYnV0IGdvdCB7cHJvdG9jb2xJZDpYfSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgdmVyc2lvbkFuZFR5cGUgPSAoYnl0ZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB2YXIgdmVyc2lvbiA9IChieXRlKSAodmVyc2lvbkFuZFR5cGUgJiBWZXJzaW9uTWFzayk7CisKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IFZlcnNpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigkIkV4cGVjdGVkIHZlcnNpb24ge1ZlcnNpb259IGJ1dCBnb3Qge3ZlcnNpb259Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciB0eXBlID0gKGJ5dGUpICgodmVyc2lvbkFuZFR5cGUgPj4gVHlwZVNoaWZ0QW1vdW50KSAmIFR5cGVCaXRzKTsKKyAgICAgICAgICAgIHZhciBzZXFpZCA9IChpbnQpIGF3YWl0IFJlYWRWYXJJbnQzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHZhciBtZXNzYWdlTmFtZSA9IGF3YWl0IFJlYWRTdHJpbmdBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVE1lc3NhZ2UobWVzc2FnZU5hbWUsIChUTWVzc2FnZVR5cGUpIHR5cGUsIHNlcWlkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUU3RydWN0PiBSZWFkU3RydWN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUU3RydWN0PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNvbWUgbWFnaWMgaXMgaGVyZSApCisKKyAgICAgICAgICAgIF9sYXN0RmllbGQuUHVzaChfbGFzdEZpZWxkSWQpOworICAgICAgICAgICAgX2xhc3RGaWVsZElkID0gMDsKKworICAgICAgICAgICAgcmV0dXJuIEFub255bW91c1N0cnVjdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIERvZXNuJ3QgYWN0dWFsbHkgY29uc3VtZSBhbnkgd2lyZSBkYXRhLCBqdXN0IHJlbW92ZXMgdGhlIGxhc3QgZmllbGQgZm9yCisgICAgICAgICAgICB0aGlzIHN0cnVjdCBmcm9tIHRoZSBmaWVsZCBzdGFjay4KKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIC8vIGNvbnN1bWUgdGhlIGxhc3QgZmllbGQgd2UgUmVhZCBvZmYgdGhlIHdpcmUuCisgICAgICAgICAgICBfbGFzdEZpZWxkSWQgPSBfbGFzdEZpZWxkLlBvcCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VEZpZWxkPiBSZWFkRmllbGRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBSZWFkIGEgZmllbGQgaGVhZGVyIG9mZiB0aGUgd2lyZS4KKyAgICAgICAgICAgIHZhciB0eXBlID0gKGJ5dGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgLy8gaWYgaXQncyBhIHN0b3AsIHRoZW4gd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseSwgYXMgdGhlIHN0cnVjdCBpcyBvdmVyLgorICAgICAgICAgICAgaWYgKHR5cGUgPT0gVHlwZXMuU3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVHN0b3A7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNob3J0IGZpZWxkSWQ7CisgICAgICAgICAgICAvLyBtYXNrIG9mZiB0aGUgNCBNU0Igb2YgdGhlIGV4VHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KKyAgICAgICAgICAgIHZhciBtb2RpZmllciA9IChzaG9ydCkgKCh0eXBlICYgMHhmMCkgPj4gNCk7CisgICAgICAgICAgICBpZiAobW9kaWZpZXIgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWVsZElkID0gYXdhaXQgUmVhZEkxNkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWVsZElkID0gKHNob3J0KSAoX2xhc3RGaWVsZElkICsgbW9kaWZpZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZmllbGQgPSBuZXcgVEZpZWxkKHN0cmluZy5FbXB0eSwgR2V0VFR5cGUoKGJ5dGUpICh0eXBlICYgMHgwZikpLCBmaWVsZElkKTsKKyAgICAgICAgICAgIC8vIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSBleFR5cGUKKyAgICAgICAgICAgIGlmIChJc0Jvb2xUeXBlKHR5cGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9ib29sVmFsdWUgPSAoYnl0ZSkgKHR5cGUgJiAweDBmKSA9PSBUeXBlcy5Cb29sZWFuVHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcHVzaCB0aGUgbmV3IGZpZWxkIG9udG8gdGhlIGZpZWxkIHN0YWNrIHNvIHdlIGNhbiBrZWVwIHRoZSBkZWx0YXMgZ29pbmcuCisgICAgICAgICAgICBfbGFzdEZpZWxkSWQgPSBmaWVsZC5JRDsKKyAgICAgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1hcD4gUmVhZE1hcEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUTWFwPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBSZWFkIGEgbWFwIGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzaXplIGlzIHplcm8sIHNraXAgUmVhZGluZyB0aGUga2V5CisgICAgICAgICAgICBhbmQgdmFsdWUgZXhUeXBlLiBUaGlzIG1lYW5zIHRoYXQgMC1sZW5ndGggbWFwcyB3aWxsIHlpZWxkIFRNYXBzIHdpdGhvdXQgdGhlCisgICAgICAgICAgICAiY29ycmVjdCIgdHlwZXMuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICB2YXIgc2l6ZSA9IChpbnQpIGF3YWl0IFJlYWRWYXJJbnQzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHZhciBrZXlBbmRWYWx1ZVR5cGUgPSBzaXplID09IDAgPyAoYnl0ZSkgMCA6IChieXRlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVE1hcChHZXRUVHlwZSgoYnl0ZSkgKGtleUFuZFZhbHVlVHlwZSA+PiA0KSksIEdldFRUeXBlKChieXRlKSAoa2V5QW5kVmFsdWVUeXBlICYgMHhmKSksIHNpemUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZE1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFNldD4gUmVhZFNldEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBSZWFkIGEgc2V0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzZXQgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisgICAgICAgICAgICBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCBleFR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIHNldCwgdGhlIDQgTVNCCisgICAgICAgICAgICBvZiB0aGUgZWxlbWVudCBleFR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKKyAgICAgICAgICAgIHRydWUgc2l6ZS4KKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVFNldChhd2FpdCBSZWFkTGlzdEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGJvb2w+IFJlYWRCb29sQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8Ym9vbD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgUmVhZCBhIGJvb2xlYW4gb2ZmIHRoZSB3aXJlLiBJZiB0aGlzIGlzIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIHNob3VsZAorICAgICAgICAgICAgYWxyZWFkeSBoYXZlIGJlZW4gUmVhZCBkdXJpbmcgUmVhZEZpZWxkQmVnaW4sIHNvIHdlJ2xsIGp1c3QgY29uc3VtZSB0aGUKKyAgICAgICAgICAgIHByZS1zdG9yZWQgdmFsdWUuIE90aGVyd2lzZSwgUmVhZCBhIGJ5dGUuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICBpZiAoX2Jvb2xWYWx1ZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfYm9vbFZhbHVlLlZhbHVlOworICAgICAgICAgICAgICAgIF9ib29sVmFsdWUgPSBudWxsOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSA9PSBUeXBlcy5Cb29sZWFuVHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPHNieXRlPiBSZWFkQnl0ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPHNieXRlPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KKyAgICAgICAgICAgIHZhciBidWYgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLlJlYWRBbGxBc3luYyhidWYsIDAsIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiAoc2J5dGUpIGJ1ZlswXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPHNob3J0PiBSZWFkSTE2QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8c2hvcnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIChzaG9ydCkgWmlnemFnVG9JbnQoYXdhaXQgUmVhZFZhckludDMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEkzMkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGludD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gWmlnemFnVG9JbnQoYXdhaXQgUmVhZFZhckludDMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGxvbmc+IFJlYWRJNjRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxsb25nPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBaaWd6YWdUb0xvbmcoYXdhaXQgUmVhZFZhckludDY0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGRvdWJsZT4gUmVhZERvdWJsZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGRvdWJsZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgbG9uZ0JpdHMgPSBuZXcgYnl0ZVs4XTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLlJlYWRBbGxBc3luYyhsb25nQml0cywgMCwgOCwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLkludDY0Qml0c1RvRG91YmxlKEJ5dGVzVG9Mb25nKGxvbmdCaXRzKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzdHJpbmc+IFJlYWRTdHJpbmdBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPHN0cmluZz4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWFkcyBhIGJ5dGVbXSAodmlhIFJlYWRCaW5hcnkpLCBhbmQgdGhlbiBVVEYtOCBkZWNvZGVzIGl0LgorICAgICAgICAgICAgdmFyIGxlbmd0aCA9IChpbnQpIGF3YWl0IFJlYWRWYXJJbnQzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBidWYgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuUmVhZEFsbEFzeW5jKGJ1ZiwgMCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIHJldHVybiBFbmNvZGluZy5VVEY4LkdldFN0cmluZyhidWYpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkQmluYXJ5QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8Ynl0ZVtdPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlYWQgYSBieXRlW10gZnJvbSB0aGUgd2lyZS4KKyAgICAgICAgICAgIHZhciBsZW5ndGggPSAoaW50KSBhd2FpdCBSZWFkVmFySW50MzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAobGVuZ3RoID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBieXRlWzBdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLlJlYWRBbGxBc3luYyhidWYsIDAsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRMaXN0PiBSZWFkTGlzdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUTGlzdD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgUmVhZCBhIGxpc3QgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIGxpc3Qgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisgICAgICAgICAgICBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCBleFR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIGxpc3QsIHRoZSA0IE1TQgorICAgICAgICAgICAgb2YgdGhlIGVsZW1lbnQgZXhUeXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisgICAgICAgICAgICB0cnVlIHNpemUuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICB2YXIgc2l6ZUFuZFR5cGUgPSAoYnl0ZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB2YXIgc2l6ZSA9IChzaXplQW5kVHlwZSA+PiA0KSAmIDB4MGY7CisgICAgICAgICAgICBpZiAoc2l6ZSA9PSAxNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaXplID0gKGludCkgYXdhaXQgUmVhZFZhckludDMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgdHlwZSA9IEdldFRUeXBlKHNpemVBbmRUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVExpc3QodHlwZSwgc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZFNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZSBHZXRDb21wYWN0VHlwZShUVHlwZSB0dHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gR2l2ZW4gYSBUVHlwZSB2YWx1ZSwgZmluZCB0aGUgYXBwcm9wcmlhdGUgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudC4KKyAgICAgICAgICAgIHJldHVybiBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgdHR5cGVdOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2s8dWludD4gUmVhZFZhckludDMyQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8dWludD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAgICAgICAgICBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDUgYnl0ZXMuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICB1aW50IHJlc3VsdCA9IDA7CisgICAgICAgICAgICB2YXIgc2hpZnQgPSAwOworCisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYiA9IChieXRlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgfD0gKHVpbnQpIChiICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgICAgICAgICAgICAgaWYgKChiICYgMHg4MCkgIT0gMHg4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzaGlmdCArPSA3OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrPHVsb25nPiBSZWFkVmFySW50NjRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDx1aW50PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgcHJvcGVyIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAgICAgICAgICBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDEwIGJ5dGVzLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgdmFyIHNoaWZ0ID0gMDsKKyAgICAgICAgICAgIHVsb25nIHJlc3VsdCA9IDA7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYiA9IChieXRlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgfD0gKHVsb25nKSAoYiAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgICAgICAgICAgIGlmICgoYiAmIDB4ODApICE9IDB4ODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2hpZnQgKz0gNzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBaaWd6YWdUb0ludCh1aW50IG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSAobiA+PiAxKSBeIC0oaW50KSAobiAmIDEpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBaaWd6YWdUb0xvbmcodWxvbmcgbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChsb25nKSAobiA+PiAxKSBeIC0obG9uZykgKG4gJiAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGxvbmcgQnl0ZXNUb0xvbmcoYnl0ZVtdIGJ5dGVzKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG1hc2sgYnl0ZXMgYXJlIGxvbmcgbGl0ZXJhbHMsCisgICAgICAgICAgICBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBpbnQgbGVmdCA1NiBiaXRzLAorICAgICAgICAgICAgeW91IGp1c3QgZ2V0IGEgbWVzc2VkIHVwIGludC4KKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICgoYnl0ZXNbN10gJiAweGZmTCkgPDwgNTYpIHwKKyAgICAgICAgICAgICAgICAoKGJ5dGVzWzZdICYgMHhmZkwpIDw8IDQ4KSB8CisgICAgICAgICAgICAgICAgKChieXRlc1s1XSAmIDB4ZmZMKSA8PCA0MCkgfAorICAgICAgICAgICAgICAgICgoYnl0ZXNbNF0gJiAweGZmTCkgPDwgMzIpIHwKKyAgICAgICAgICAgICAgICAoKGJ5dGVzWzNdICYgMHhmZkwpIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgKChieXRlc1syXSAmIDB4ZmZMKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICgoYnl0ZXNbMV0gJiAweGZmTCkgPDwgOCkgfAorICAgICAgICAgICAgICAgIChieXRlc1swXSAmIDB4ZmZMKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgSXNCb29sVHlwZShieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBsb3dlck5pYmJsZSA9IGIgJiAweDBmOworICAgICAgICAgICAgcmV0dXJuIChsb3dlck5pYmJsZSA9PSBUeXBlcy5Cb29sZWFuVHJ1ZSkgfHwgKGxvd2VyTmliYmxlID09IFR5cGVzLkJvb2xlYW5GYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBUVHlwZSBHZXRUVHlwZShieXRlIHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEdpdmVuIGEgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudCwgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZyBUVHlwZSB2YWx1ZS4KKyAgICAgICAgICAgIHN3aXRjaCAoKGJ5dGUpICh0eXBlICYgMHgwZikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5TdG9wOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuU3RvcDsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJvb2xlYW5GYWxzZToKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJvb2xlYW5UcnVlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuQm9vbDsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJ5dGU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5CeXRlOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuSTE2OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuSTE2OworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuSTMyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuSTMyOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuSTY0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuSTY0OworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuRG91YmxlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuRG91YmxlOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuQmluYXJ5OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuU3RyaW5nOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuTGlzdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkxpc3Q7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5TZXQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5TZXQ7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5NYXA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5NYXA7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5TdHJ1Y3Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5TdHJ1Y3Q7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigkIkRvbid0IGtub3cgd2hhdCBleFR5cGU6IHsoYnl0ZSkgKHR5cGUgJiAweDBmKX0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHVsb25nIExvbmdUb1ppZ3phZyhsb25nIG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUgcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50CisgICAgICAgICAgICByZXR1cm4gKHVsb25nKSAobiA8PCAxKSBeICh1bG9uZykgKG4gPj4gNjMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdWludCBJbnRUb1ppZ3phZyhpbnQgbikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludAorICAgICAgICAgICAgcmV0dXJuICh1aW50KSAobiA8PCAxKSBeICh1aW50KSAobiA+PiAzMSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEZpeGVkTG9uZ1RvQnl0ZXMobG9uZyBuLCBieXRlW10gYnVmLCBpbnQgb2ZmKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDb252ZXJ0IGEgbG9uZyBpbnRvIGxpdHRsZS1lbmRpYW4gYnl0ZXMgaW4gYnVmIHN0YXJ0aW5nIGF0IG9mZiBhbmQgZ29pbmcgdW50aWwgb2ZmKzcuCisgICAgICAgICAgICBidWZbb2ZmICsgMF0gPSAoYnl0ZSkgKG4gJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyAxXSA9IChieXRlKSAoKG4gPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyAyXSA9IChieXRlKSAoKG4gPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgM10gPSAoYnl0ZSkgKChuID4+IDI0KSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDRdID0gKGJ5dGUpICgobiA+PiAzMikgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyA1XSA9IChieXRlKSAoKG4gPj4gNDApICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgNl0gPSAoYnl0ZSkgKChuID4+IDQ4KSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDddID0gKGJ5dGUpICgobiA+PiA1NikgJiAweGZmKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogSVRQcm90b2NvbEZhY3RvcnkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFRQcm90b2NvbCBHZXRQcm90b2NvbChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFucyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgQWxsIG9mIHRoZSBvbi13aXJlIGV4VHlwZSBjb2Rlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHlwZXMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgU3RvcCA9IDB4MDA7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBCb29sZWFuVHJ1ZSA9IDB4MDE7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBCb29sZWFuRmFsc2UgPSAweDAyOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgQnl0ZSA9IDB4MDM7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBJMTYgPSAweDA0OworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgSTMyID0gMHgwNTsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEk2NCA9IDB4MDY7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBEb3VibGUgPSAweDA3OworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgQmluYXJ5ID0gMHgwODsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIExpc3QgPSAweDA5OworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgU2V0ID0gMHgwQTsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIE1hcCA9IDB4MEI7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBTdHJ1Y3QgPSAweDBDOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVEpTT05Qcm90b2NvbC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVEpTT05Qcm90b2NvbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDMzZjAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9USlNPTlByb3RvY29sLmNzCkBAIC0wLDAgKzEsOTgxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuVXRpbGl0aWVzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAgICAgSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgorICAgIC8vLyAgICAgVGhpcyBpcyBhIGZ1bGwtZmVhdHVyZWQgcHJvdG9jb2wgc3VwcG9ydGluZyBXcml0ZSBhbmQgUmVhZC4KKyAgICAvLy8gICAgIFBsZWFzZSBzZWUgdGhlIEMrKyBjbGFzcyBoZWFkZXIgZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlCisgICAgLy8vICAgICBwcm90b2NvbCdzIHdpcmUgZm9ybWF0LgorICAgIC8vLyAgICAgQWRhcHRlZCBmcm9tIHRoZSBKYXZhIHZlcnNpb24uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUSnNvblByb3RvY29sIDogVFByb3RvY29sCisgICAgeworICAgICAgICBwcml2YXRlIGNvbnN0IGxvbmcgVmVyc2lvbiA9IDE7CisKKyAgICAgICAgLy8gVGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGJ5IHNldmVyYWwgbWV0aG9kcworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJ5dGVbXSBfdGVtcEJ1ZmZlciA9IG5ldyBieXRlWzRdOworCisgICAgICAgIC8vIEN1cnJlbnQgY29udGV4dCB0aGF0IHdlIGFyZSBpbgorICAgICAgICBwcm90ZWN0ZWQgSlNPTkJhc2VDb250ZXh0IENvbnRleHQ7CisKKyAgICAgICAgLy8gU3RhY2sgb2YgbmVzdGVkIGNvbnRleHRzIHRoYXQgd2UgbWF5IGJlIGluCisgICAgICAgIHByb3RlY3RlZCBTdGFjazxKU09OQmFzZUNvbnRleHQ+IENvbnRleHRTdGFjayA9IG5ldyBTdGFjazxKU09OQmFzZUNvbnRleHQ+KCk7CisKKyAgICAgICAgLy8gUmVhZGVyIHRoYXQgbWFuYWdlcyBhIDEtYnl0ZSBidWZmZXIKKyAgICAgICAgcHJvdGVjdGVkIExvb2thaGVhZFJlYWRlciBSZWFkZXI7CisKKyAgICAgICAgLy8gRGVmYXVsdCBlbmNvZGluZworICAgICAgICBwcm90ZWN0ZWQgRW5jb2RpbmcgVXRmOEVuY29kaW5nID0gRW5jb2RpbmcuVVRGODsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgVEpzb25Qcm90b2NvbCBDb25zdHJ1Y3RvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgVEpzb25Qcm90b2NvbChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgOiBiYXNlKHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICBDb250ZXh0ID0gbmV3IEpTT05CYXNlQ29udGV4dCh0aGlzKTsKKyAgICAgICAgICAgIFJlYWRlciA9IG5ldyBMb29rYWhlYWRSZWFkZXIodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgUHVzaCBhIG5ldyBKU09OIGNvbnRleHQgb250byB0aGUgc3RhY2suCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCB2b2lkIFB1c2hDb250ZXh0KEpTT05CYXNlQ29udGV4dCBjKQorICAgICAgICB7CisgICAgICAgICAgICBDb250ZXh0U3RhY2suUHVzaChDb250ZXh0KTsKKyAgICAgICAgICAgIENvbnRleHQgPSBjOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFBvcCB0aGUgbGFzdCBKU09OIGNvbnRleHQgb2ZmIHRoZSBzdGFjaworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBQb3BDb250ZXh0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29udGV4dCA9IENvbnRleHRTdGFjay5Qb3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBSZWFkIGEgYnl0ZSB0aGF0IG11c3QgbWF0Y2ggYlswXTsgb3RoZXJ3aXNlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICAgIC8vLyAgICAgTWFya2VkIHByb3RlY3RlZCB0byBhdm9pZCBzeW50aGV0aWMgYWNjZXNzb3IgaW4gSlNPTkxpc3RDb250ZXh0LlJlYWQKKyAgICAgICAgLy8vICAgICBhbmQgSlNPTlBhaXJDb250ZXh0LlJlYWQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIGFzeW5jIFRhc2sgUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoYnl0ZVtdIGJ5dGVzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNoID0gYXdhaXQgUmVhZGVyLlJlYWRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoY2ggIT0gYnl0ZXNbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAkIlVuZXhwZWN0ZWQgY2hhcmFjdGVyOiB7KGNoYXIpIGNofSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFdyaXRlIHRoZSBieXRlcyBpbiBhcnJheSBidWYgYXMgYSBKU09OIGNoYXJhY3RlcnMsIGVzY2FwaW5nIGFzIG5lZWRlZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVKc29uU3RyaW5nQXN5bmMoYnl0ZVtdIGJ5dGVzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5Xcml0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICB2YXIgbGVuID0gYnl0ZXMuTGVuZ3RoOworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKGJ5dGVzW2ldICYgMHgwMEZGKSA+PSAweDMwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzW2ldID09IFRKU09OUHJvdG9jb2xDb25zdGFudHMuQmFja3NsYXNoWzBdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuQmFja3NsYXNoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuQmFja3NsYXNoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ5dGVzLlRvQXJyYXkoKSwgaSwgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF90ZW1wQnVmZmVyWzBdID0gVEpTT05Qcm90b2NvbENvbnN0YW50cy5Kc29uQ2hhclRhYmxlW2J5dGVzW2ldXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF90ZW1wQnVmZmVyWzBdID09IDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnl0ZXMsIGksIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChfdGVtcEJ1ZmZlclswXSA+IDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5CYWNrc2xhc2gsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoX3RlbXBCdWZmZXIsIDAsIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5Fc2NTZXF1ZW5jZXMsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF90ZW1wQnVmZmVyWzBdID0gVEpTT05Qcm90b2NvbEhlbHBlci5Ub0hleENoYXIoKGJ5dGUpIChieXRlc1tpXSA+PiA0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfdGVtcEJ1ZmZlclsxXSA9IFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhDaGFyKGJ5dGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoX3RlbXBCdWZmZXIsIDAsIDIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFdyaXRlIG91dCBudW1iZXIgYXMgYSBKU09OIHZhbHVlLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcyBzbywgaXQgd2lsbCBiZQorICAgICAgICAvLy8gICAgIHdyYXBwZWQgaW4gcXVvdGVzIHRvIG91dHB1dCBhcyBhIEpTT04gc3RyaW5nLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVKc29uSW50ZWdlckFzeW5jKGxvbmcgbnVtLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5Xcml0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHZhciBzdHIgPSBudW0uVG9TdHJpbmcoKTsKKworICAgICAgICAgICAgdmFyIGVzY2FwZU51bSA9IENvbnRleHQuRXNjYXBlTnVtYmVycygpOworICAgICAgICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ5dGVzID0gVXRmOEVuY29kaW5nLkdldEJ5dGVzKHN0cik7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ5dGVzLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIGlmIChlc2NhcGVOdW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgV3JpdGUgb3V0IGEgZG91YmxlIGFzIGEgSlNPTiB2YWx1ZS4gSWYgaXQgaXMgTmFOIG9yIGluZmluaXR5IG9yIGlmIHRoZQorICAgICAgICAvLy8gICAgIGNvbnRleHQgZGljdGF0ZXMgZXNjYXBpbmcsIFdyaXRlIG91dCBhcyBKU09OIHN0cmluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlSnNvbkRvdWJsZUFzeW5jKGRvdWJsZSBudW0sIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBDb250ZXh0LldyaXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgdmFyIHN0ciA9IG51bS5Ub1N0cmluZygiRzE3IiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICB2YXIgc3BlY2lhbCA9IGZhbHNlOworCisgICAgICAgICAgICBzd2l0Y2ggKHN0clswXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICdOJzogLy8gTmFOCisgICAgICAgICAgICAgICAgY2FzZSAnSSc6IC8vIEluZmluaXR5CisgICAgICAgICAgICAgICAgICAgIHNwZWNpYWwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICctJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0clsxXSA9PSAnSScpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIC1JbmZpbml0eQorICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBlc2NhcGVOdW0gPSBzcGVjaWFsIHx8IENvbnRleHQuRXNjYXBlTnVtYmVycygpOworCisgICAgICAgICAgICBpZiAoZXNjYXBlTnVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFV0ZjhFbmNvZGluZy5HZXRCeXRlcyhzdHIpLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIGlmIChlc2NhcGVOdW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgV3JpdGUgb3V0IGNvbnRlbnRzIG9mIGJ5dGUgYXJyYXkgYiBhcyBhIEpTT04gc3RyaW5nIHdpdGggYmFzZS02NCBlbmNvZGVkCisgICAgICAgIC8vLyAgICAgZGF0YQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVKc29uQmFzZTY0QXN5bmMoYnl0ZVtdIGJ5dGVzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5Xcml0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICB2YXIgbGVuID0gYnl0ZXMuTGVuZ3RoOworICAgICAgICAgICAgdmFyIG9mZiA9IDA7CisKKyAgICAgICAgICAgIHdoaWxlIChsZW4gPj0gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBFbmNvZGUgMyBieXRlcyBhdCBhIHRpbWUKKyAgICAgICAgICAgICAgICBUQmFzZTY0SGVscGVyLkVuY29kZShieXRlcywgb2ZmLCAzLCBfdGVtcEJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhfdGVtcEJ1ZmZlciwgMCwgNCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIG9mZiArPSAzOworICAgICAgICAgICAgICAgIGxlbiAtPSAzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGVuID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBFbmNvZGUgcmVtYWluZGVyCisgICAgICAgICAgICAgICAgVEJhc2U2NEhlbHBlci5FbmNvZGUoYnl0ZXMsIG9mZiwgbGVuLCBfdGVtcEJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhfdGVtcEJ1ZmZlciwgMCwgbGVuICsgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBXcml0ZUpzb25PYmplY3RTdGFydEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBDb250ZXh0LldyaXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkxlZnRCcmFjZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05QYWlyQ29udGV4dCh0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVKc29uT2JqZWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5SaWdodEJyYWNlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVKc29uQXJyYXlTdGFydEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBDb250ZXh0LldyaXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkxlZnRCcmFja2V0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBQdXNoQ29udGV4dChuZXcgSlNPTkxpc3RDb250ZXh0KHRoaXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBXcml0ZUpzb25BcnJheUVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUmlnaHRCcmFja2V0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKFRNZXNzYWdlIG1lc3NhZ2UsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25BcnJheVN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKFZlcnNpb24sIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgdmFyIGIgPSBVdGY4RW5jb2RpbmcuR2V0Qnl0ZXMobWVzc2FnZS5OYW1lKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvblN0cmluZ0FzeW5jKGIsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKChsb25nKSBtZXNzYWdlLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkludGVnZXJBc3luYyhtZXNzYWdlLlNlcUlELCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEJlZ2luQXN5bmMoVFN0cnVjdCBAc3RydWN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uT2JqZWN0U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25PYmplY3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkQmVnaW5Bc3luYyhURmllbGQgZmllbGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMoZmllbGQuSUQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbk9iamVjdFN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uU3RyaW5nQXN5bmMoVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlTmFtZUZvclR5cGVJZChmaWVsZC5UeXBlKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25PYmplY3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkU3RvcEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNYXBCZWdpbkFzeW5jKFRNYXAgbWFwLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvblN0cmluZ0FzeW5jKFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZU5hbWVGb3JUeXBlSWQobWFwLktleVR5cGUpLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25TdHJpbmdBc3luYyhUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVOYW1lRm9yVHlwZUlkKG1hcC5WYWx1ZVR5cGUpLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMobWFwLkNvdW50LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25PYmplY3RTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbk9iamVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkFycmF5RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVMaXN0QmVnaW5Bc3luYyhUTGlzdCBsaXN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvblN0cmluZ0FzeW5jKFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZU5hbWVGb3JUeXBlSWQobGlzdC5FbGVtZW50VHlwZSksIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkludGVnZXJBc3luYyhsaXN0LkNvdW50LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUxpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVNldEJlZ2luQXN5bmMoVFNldCBzZXQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25BcnJheVN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uU3RyaW5nQXN5bmMoVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlTmFtZUZvclR5cGVJZChzZXQuRWxlbWVudFR5cGUpLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMoc2V0LkNvdW50LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25BcnJheUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQm9vbEFzeW5jKGJvb2wgYiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkludGVnZXJBc3luYyhiID8gMSA6IDAsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQnl0ZUFzeW5jKHNieXRlIGIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMoYiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMTZBc3luYyhzaG9ydCBpMTYsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMoaTE2LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUkzMkFzeW5jKGludCBpMzIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMoaTMyLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUk2NEFzeW5jKGxvbmcgaTY0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKGk2NCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVEb3VibGVBc3luYyhkb3VibGUgZCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkRvdWJsZUFzeW5jKGQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RyaW5nQXN5bmMoc3RyaW5nIHMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYiA9IFV0ZjhFbmNvZGluZy5HZXRCeXRlcyhzKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvblN0cmluZ0FzeW5jKGIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQmluYXJ5QXN5bmMoYnl0ZVtdIGJ5dGVzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQmFzZTY0QXN5bmMoYnl0ZXMsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBSZWFkIGluIGEgSlNPTiBzdHJpbmcsIHVuZXNjYXBpbmcgYXMgYXBwcm9wcmlhdGUuLiBTa2lwIFJlYWRpbmcgZnJvbSB0aGUKKyAgICAgICAgLy8vICAgICBjb250ZXh0IGlmIHNraXBDb250ZXh0IGlzIHRydWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzazxieXRlW10+IFJlYWRKc29uU3RyaW5nQXN5bmMoYm9vbCBza2lwQ29udGV4dCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgYnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjb2RldW5pdHMgPSBuZXcgTGlzdDxjaGFyPigpOworCisKKyAgICAgICAgICAgICAgICBpZiAoIXNraXBDb250ZXh0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNoID0gYXdhaXQgUmVhZGVyLlJlYWRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlWzBdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGVzY2FwZWQ/CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCAhPSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLkVzY1NlcXVlbmNlc1swXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYnVmZmVyLldyaXRlQXN5bmMobmV3W10ge2NofSwgMCwgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBkaXN0aW5ndWlzaCBiZXR3ZWVuIFx1WFhYWCBhbmQgXD8KKyAgICAgICAgICAgICAgICAgICAgY2ggPSBhd2FpdCBSZWFkZXIuUmVhZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9IFRKU09OUHJvdG9jb2xDb25zdGFudHMuRXNjU2VxdWVuY2VzWzFdKSAvLyBjb250cm9sIGNoYXJzIGxpa2UgXG4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9mZiA9IEFycmF5LkluZGV4T2YoVEpTT05Qcm90b2NvbENvbnN0YW50cy5Fc2NhcGVDaGFycywgKGNoYXIpIGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmYgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgY29udHJvbCBjaGFyIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFRKU09OUHJvdG9jb2xDb25zdGFudHMuRXNjYXBlQ2hhclZhbHVlc1tvZmZdOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYnVmZmVyLldyaXRlQXN5bmMobmV3W10ge2NofSwgMCwgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIFx1WFhYWAorICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoX3RlbXBCdWZmZXIsIDAsIDQsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgd2NoID0gKHNob3J0KSAoKFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhWYWwoX3RlbXBCdWZmZXJbMF0pIDw8IDEyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVEpTT05Qcm90b2NvbEhlbHBlci5Ub0hleFZhbChfdGVtcEJ1ZmZlclsxXSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhWYWwoX3RlbXBCdWZmZXJbMl0pIDw8IDQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhWYWwoX3RlbXBCdWZmZXJbM10pKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY2hhci5Jc0hpZ2hTdXJyb2dhdGUoKGNoYXIpIHdjaCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RldW5pdHMuQ291bnQgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY29kZXVuaXRzLkFkZCgoY2hhcikgd2NoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGFyLklzTG93U3Vycm9nYXRlKChjaGFyKSB3Y2gpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLkNvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgaGlnaCBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RldW5pdHMuQWRkKChjaGFyKSB3Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRtcCA9IFV0ZjhFbmNvZGluZy5HZXRCeXRlcyhjb2RldW5pdHMuVG9BcnJheSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGJ1ZmZlci5Xcml0ZUFzeW5jKHRtcCwgMCwgdG1wLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgY29kZXVuaXRzLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG1wID0gVXRmOEVuY29kaW5nLkdldEJ5dGVzKG5ld1tdIHsoY2hhcikgd2NofSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBidWZmZXIuV3JpdGVBc3luYyh0bXAsIDAsIHRtcC5MZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChjb2RldW5pdHMuQ291bnQgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5Ub0FycmF5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgUmVhZCBpbiBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgYWxsIHZhbGlkIGluIEpTT04gbnVtYmVycy4gRG9lcworICAgICAgICAvLy8gICAgIG5vdCBkbyBhIGNvbXBsZXRlIHJlZ2V4IGNoZWNrIHRvIHZhbGlkYXRlIHRoYXQgdGhpcyBpcyBhY3R1YWxseSBhIG51bWJlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrPHN0cmluZz4gUmVhZEpzb25OdW1lcmljQ2hhcnNBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHN0cmJsZCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL1RPRE86IHdvcmthcm91bmQgZm9yIHByaW1pdGl2ZSB0eXBlcyB3aXRoIFRKc29uUHJvdG9jb2wsIHRoaW5rIC0gaG93IHRvIHJld3JpdGUgaW50byBtb3JlIGVhc3kgZm9ybSB3aXRob3V0IGV4Y2VwdGlvbnMKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBjaCA9IGF3YWl0IFJlYWRlci5QZWVrQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBpZiAoIVRKU09OUHJvdG9jb2xIZWxwZXIuSXNKc29uTnVtZXJpYyhjaCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZhciBjID0gKGNoYXIpYXdhaXQgUmVhZGVyLlJlYWRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIHN0cmJsZC5BcHBlbmQoYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0cmJsZC5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFJlYWQgaW4gYSBKU09OIG51bWJlci4gSWYgdGhlIGNvbnRleHQgZGljdGF0ZXMsIFJlYWQgaW4gZW5jbG9zaW5nIHF1b3Rlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrPGxvbmc+IFJlYWRKc29uSW50ZWdlckFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBDb250ZXh0LlJlYWRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoQ29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgc3RyID0gYXdhaXQgUmVhZEpzb25OdW1lcmljQ2hhcnNBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoQ29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9uZy5QYXJzZShzdHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgUmVhZCBpbiBhIEpTT04gZG91YmxlIHZhbHVlLiBUaHJvdyBpZiB0aGUgdmFsdWUgaXMgbm90IHdyYXBwZWQgaW4gcXVvdGVzCisgICAgICAgIC8vLyAgICAgd2hlbiBleHBlY3RlZCBvciBpZiB3cmFwcGVkIGluIHF1b3RlcyB3aGVuIG5vdCBleHBlY3RlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrPGRvdWJsZT4gUmVhZEpzb25Eb3VibGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKGF3YWl0IFJlYWRlci5QZWVrQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pID09IFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGVbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGFyciA9IGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmModHJ1ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIHZhciBkdWIgPSBkb3VibGUuUGFyc2UoVXRmOEVuY29kaW5nLkdldFN0cmluZyhhcnIsIDAsIGFyci5MZW5ndGgpLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKworICAgICAgICAgICAgICAgIGlmICghQ29udGV4dC5Fc2NhcGVOdW1iZXJzKCkgJiYgIWRvdWJsZS5Jc05hTihkdWIpICYmICFkb3VibGUuSXNJbmZpbml0eShkdWIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uIC0tIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGR1YjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKENvbnRleHQuRXNjYXBlTnVtYmVycygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyAtIHdlIHNob3VsZCBoYXZlIGhhZCBhIHF1b3RlIGlmIGVzY2FwZU51bSA9PSB0cnVlCisgICAgICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZG91YmxlLlBhcnNlKGF3YWl0IFJlYWRKc29uTnVtZXJpY0NoYXJzQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChGb3JtYXRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFJlYWQgaW4gYSBKU09OIHN0cmluZyBjb250YWluaW5nIGJhc2UtNjQgZW5jb2RlZCBkYXRhIGFuZCBkZWNvZGUgaXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzazxieXRlW10+IFJlYWRKc29uQmFzZTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBiID0gYXdhaXQgUmVhZEpzb25TdHJpbmdBc3luYyhmYWxzZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgdmFyIGxlbiA9IGIuTGVuZ3RoOworICAgICAgICAgICAgdmFyIG9mZiA9IDA7CisgICAgICAgICAgICB2YXIgc2l6ZSA9IDA7CisKKyAgICAgICAgICAgIC8vIHJlZHVjZSBsZW4gdG8gaWdub3JlIGZpbGwgYnl0ZXMKKyAgICAgICAgICAgIHdoaWxlICgobGVuID4gMCkgJiYgKGJbbGVuIC0gMV0gPT0gJz0nKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAtLWxlbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcmVhZCAmIGRlY29kZSBmdWxsIGJ5dGUgdHJpcGxldHMgPSA0IHNvdXJjZSBieXRlcworICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRGVjb2RlIDQgYnl0ZXMgYXQgYSB0aW1lCisgICAgICAgICAgICAgICAgVEJhc2U2NEhlbHBlci5EZWNvZGUoYiwgb2ZmLCA0LCBiLCBzaXplKTsgLy8gTkI6IGRlY29kZWQgaW4gcGxhY2UKKyAgICAgICAgICAgICAgICBvZmYgKz0gNDsKKyAgICAgICAgICAgICAgICBsZW4gLT0gNDsKKyAgICAgICAgICAgICAgICBzaXplICs9IDM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIERvbid0IGRlY29kZSBpZiB3ZSBoaXQgdGhlIGVuZCBvciBnb3QgYSBzaW5nbGUgbGVmdG92ZXIgYnl0ZSAoaW52YWxpZAorICAgICAgICAgICAgLy8gYmFzZTY0IGJ1dCBsZWdhbCBmb3Igc2tpcCBvZiByZWd1bGFyIHN0cmluZyBleFR5cGUpCisgICAgICAgICAgICBpZiAobGVuID4gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBEZWNvZGUgcmVtYWluZGVyCisgICAgICAgICAgICAgICAgVEJhc2U2NEhlbHBlci5EZWNvZGUoYiwgb2ZmLCBsZW4sIGIsIHNpemUpOyAvLyBOQjogZGVjb2RlZCBpbiBwbGFjZQorICAgICAgICAgICAgICAgIHNpemUgKz0gbGVuIC0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2FkbHkgd2UgbXVzdCBjb3B5IHRoZSBieXRlW10gKGFueSB3YXkgYXJvdW5kIHRoaXM/KQorICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBieXRlW3NpemVdOworICAgICAgICAgICAgQXJyYXkuQ29weShiLCAwLCByZXN1bHQsIDAsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBSZWFkSnNvbk9iamVjdFN0YXJ0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuUmVhZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuTGVmdEJyYWNlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBQdXNoQ29udGV4dChuZXcgSlNPTlBhaXJDb250ZXh0KHRoaXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBSZWFkSnNvbk9iamVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvblN5bnRheENoYXJBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlJpZ2h0QnJhY2UsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBSZWFkSnNvbkFycmF5U3RhcnRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5MZWZ0QnJhY2tldCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05MaXN0Q29udGV4dCh0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgUmVhZEpzb25BcnJheUVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvblN5bnRheENoYXJBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlJpZ2h0QnJhY2tldCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgUG9wQ29udGV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1lc3NhZ2U+IFJlYWRNZXNzYWdlQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uQXJyYXlTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGlmIChhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbikgIT0gVmVyc2lvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwgIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmID0gYXdhaXQgUmVhZEpzb25TdHJpbmdBc3luYyhmYWxzZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgbWVzc2FnZS5OYW1lID0gVXRmOEVuY29kaW5nLkdldFN0cmluZyhidWYsIDAsIGJ1Zi5MZW5ndGgpOworICAgICAgICAgICAgbWVzc2FnZS5UeXBlID0gKFRNZXNzYWdlVHlwZSkgYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgbWVzc2FnZS5TZXFJRCA9IChpbnQpIGF3YWl0IFJlYWRKc29uSW50ZWdlckFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZE1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25BcnJheUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRTdHJ1Y3Q+IFJlYWRTdHJ1Y3RCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbk9iamVjdFN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgcmV0dXJuIG5ldyBUU3RydWN0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uT2JqZWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VEZpZWxkPiBSZWFkRmllbGRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZmllbGQgPSBuZXcgVEZpZWxkKCk7CisgICAgICAgICAgICB2YXIgY2ggPSBhd2FpdCBSZWFkZXIuUGVla0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGlmIChjaCA9PSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlJpZ2h0QnJhY2VbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGQuVHlwZSA9IFRUeXBlLlN0b3A7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGQuSUQgPSAoc2hvcnQpIGF3YWl0IFJlYWRKc29uSW50ZWdlckFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbk9iamVjdFN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGZpZWxkLlR5cGUgPSBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVJZEZvclR5cGVOYW1lKGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmMoZmFsc2UsIGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25PYmplY3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUTWFwPiBSZWFkTWFwQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBUTWFwKCk7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbkFycmF5U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBtYXAuS2V5VHlwZSA9IFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZUlkRm9yVHlwZU5hbWUoYXdhaXQgUmVhZEpzb25TdHJpbmdBc3luYyhmYWxzZSwgY2FuY2VsbGF0aW9uVG9rZW4pKTsKKyAgICAgICAgICAgIG1hcC5WYWx1ZVR5cGUgPSBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVJZEZvclR5cGVOYW1lKGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmMoZmFsc2UsIGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgICAgICBtYXAuQ291bnQgPSAoaW50KSBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbk9iamVjdFN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgcmV0dXJuIG1hcDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25PYmplY3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbkFycmF5RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VExpc3Q+IFJlYWRMaXN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGxpc3QgPSBuZXcgVExpc3QoKTsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uQXJyYXlTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGxpc3QuRWxlbWVudFR5cGUgPSBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVJZEZvclR5cGVOYW1lKGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmMoZmFsc2UsIGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgICAgICBsaXN0LkNvdW50ID0gKGludCkgYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbkFycmF5RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFNldD4gUmVhZFNldEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzZXQgPSBuZXcgVFNldCgpOworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25BcnJheVN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgc2V0LkVsZW1lbnRUeXBlID0gVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKGZhbHNlLCBjYW5jZWxsYXRpb25Ub2tlbikpOworICAgICAgICAgICAgc2V0LkNvdW50ID0gKGludCkgYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgcmV0dXJuIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25BcnJheUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGJvb2w+IFJlYWRCb29sQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbikgIT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPHNieXRlPiBSZWFkQnl0ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKHNieXRlKSBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzaG9ydD4gUmVhZEkxNkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKHNob3J0KSBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRJMzJBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChpbnQpIGF3YWl0IFJlYWRKc29uSW50ZWdlckFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGxvbmc+IFJlYWRJNjRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRKc29uSW50ZWdlckFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGRvdWJsZT4gUmVhZERvdWJsZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEpzb25Eb3VibGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzdHJpbmc+IFJlYWRTdHJpbmdBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJ1ZiA9IGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmMoZmFsc2UsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBVdGY4RW5jb2RpbmcuR2V0U3RyaW5nKGJ1ZiwgMCwgYnVmLkxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxieXRlW10+IFJlYWRCaW5hcnlBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRKc29uQmFzZTY0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIEZhY3RvcnkgZm9yIEpTT04gcHJvdG9jb2wgb2JqZWN0cworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IElUUHJvdG9jb2xGYWN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVENsaWVudFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRKc29uUHJvdG9jb2wodHJhbnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIEJhc2UgY2xhc3MgZm9yIHRyYWNraW5nIEpTT04gY29udGV4dHMgdGhhdCBtYXkgcmVxdWlyZQorICAgICAgICAvLy8gICAgIGluc2VydGluZy9SZWFkaW5nIGFkZGl0aW9uYWwgSlNPTiBzeW50YXggY2hhcmFjdGVycworICAgICAgICAvLy8gICAgIFRoaXMgYmFzZSBjb250ZXh0IGRvZXMgbm90aGluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIGNsYXNzIEpTT05CYXNlQ29udGV4dAorICAgICAgICB7CisgICAgICAgICAgICBwcm90ZWN0ZWQgVEpzb25Qcm90b2NvbCBQcm90bzsKKworICAgICAgICAgICAgcHVibGljIEpTT05CYXNlQ29udGV4dChUSnNvblByb3RvY29sIHByb3RvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFByb3RvID0gcHJvdG87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFJlYWRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCBib29sIEVzY2FwZU51bWJlcnMoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBDb250ZXh0IGZvciBKU09OIGxpc3RzLiBXaWxsIGluc2VydC9SZWFkIGNvbW1hcyBiZWZvcmUgZWFjaCBpdGVtIGV4Y2VwdAorICAgICAgICAvLy8gICAgIGZvciB0aGUgZmlyc3Qgb25lCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCBjbGFzcyBKU09OTGlzdENvbnRleHQgOiBKU09OQmFzZUNvbnRleHQKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSBib29sIF9maXJzdCA9IHRydWU7CisKKyAgICAgICAgICAgIHB1YmxpYyBKU09OTGlzdENvbnRleHQoVEpzb25Qcm90b2NvbCBwcm90b2NvbCkKKyAgICAgICAgICAgICAgICA6IGJhc2UocHJvdG9jb2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9maXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9maXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm90by5UcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuQ29tbWEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2ZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb3RvLlJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuQ29tbWEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgQ29udGV4dCBmb3IgSlNPTiByZWNvcmRzLiBXaWxsIGluc2VydC9SZWFkIGNvbG9ucyBiZWZvcmUgdGhlIHZhbHVlIHBvcnRpb24KKyAgICAgICAgLy8vICAgICBvZiBlYWNoIHJlY29yZCBwYWlyLCBhbmQgY29tbWFzIGJlZm9yZSBlYWNoIGtleSBleGNlcHQgdGhlIGZpcnN0LiBJbgorICAgICAgICAvLy8gICAgIGFkZGl0aW9uLCB3aWxsIGluZGljYXRlIHRoYXQgbnVtYmVycyBpbiB0aGUga2V5IHBvc2l0aW9uIG5lZWQgdG8gYmUKKyAgICAgICAgLy8vICAgICBlc2NhcGVkIGluIHF1b3RlcyAoc2luY2UgSlNPTiBrZXlzIG11c3QgYmUgc3RyaW5ncykuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgICAgIHByb3RlY3RlZCBjbGFzcyBKU09OUGFpckNvbnRleHQgOiBKU09OQmFzZUNvbnRleHQKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSBib29sIF9jb2xvbiA9IHRydWU7CisKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBfZmlyc3QgPSB0cnVlOworCisgICAgICAgICAgICBwdWJsaWMgSlNPTlBhaXJDb250ZXh0KFRKc29uUHJvdG9jb2wgcHJvdG8pCisgICAgICAgICAgICAgICAgOiBiYXNlKHByb3RvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgX2NvbG9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvdG8uVHJhbnMuV3JpdGVBc3luYyhfY29sb24gPyBUSlNPTlByb3RvY29sQ29uc3RhbnRzLkNvbG9uIDogVEpTT05Qcm90b2NvbENvbnN0YW50cy5Db21tYSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBfY29sb24gPSAhX2NvbG9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgX2NvbG9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvdG8uUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoX2NvbG9uID8gVEpTT05Qcm90b2NvbENvbnN0YW50cy5Db2xvbiA6IFRKU09OUHJvdG9jb2xDb25zdGFudHMuQ29tbWEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgX2NvbG9uID0gIV9jb2xvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVzY2FwZU51bWJlcnMoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfY29sb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgSG9sZHMgdXAgdG8gb25lIGJ5dGUgZnJvbSB0aGUgdHJhbnNwb3J0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCBjbGFzcyBMb29rYWhlYWRSZWFkZXIKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBieXRlW10gX2RhdGEgPSBuZXcgYnl0ZVsxXTsKKworICAgICAgICAgICAgcHJpdmF0ZSBib29sIF9oYXNEYXRhOworICAgICAgICAgICAgcHJvdGVjdGVkIFRKc29uUHJvdG9jb2wgUHJvdG87CisKKyAgICAgICAgICAgIHB1YmxpYyBMb29rYWhlYWRSZWFkZXIoVEpzb25Qcm90b2NvbCBwcm90bykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQcm90byA9IHByb3RvOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgICAgICAvLy8gICAgIFJldHVybiBhbmQgY29uc3VtZSB0aGUgbmV4dCBieXRlIHRvIGJlIFJlYWQsIGVpdGhlciB0YWtpbmcgaXQgZnJvbSB0aGUKKyAgICAgICAgICAgIC8vLyAgICAgZGF0YSBidWZmZXIgaWYgcHJlc2VudCBvciBnZXR0aW5nIGl0IGZyb20gdGhlIHRyYW5zcG9ydCBvdGhlcndpc2UuCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8Ynl0ZT4gUmVhZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxieXRlPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKF9oYXNEYXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2hhc0RhdGEgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBtb3JlIGVhc3kgd2F5IHRvIGF2b2lkIGV4Y2VwdGlvbiBvbiByZWFkaW5nIHByaW1pdGl2ZSB0eXBlcworICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm90by5UcmFucy5SZWFkQWxsQXN5bmMoX2RhdGEsIDAsIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9kYXRhWzBdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgICAgICAvLy8gICAgIFJldHVybiB0aGUgbmV4dCBieXRlIHRvIGJlIFJlYWQgd2l0aG91dCBjb25zdW1pbmcsIGZpbGxpbmcgdGhlIGRhdGEKKyAgICAgICAgICAgIC8vLyAgICAgYnVmZmVyIGlmIGl0IGhhcyBub3QgYmVlbiBmaWxsZWQgYWxSZWFkeS4KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxieXRlPiBQZWVrQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGJ5dGU+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIV9oYXNEYXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBtb3JlIGVhc3kgd2F5IHRvIGF2b2lkIGV4Y2VwdGlvbiBvbiByZWFkaW5nIHByaW1pdGl2ZSB0eXBlcworICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm90by5UcmFucy5SZWFkQWxsQXN5bmMoX2RhdGEsIDAsIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX2hhc0RhdGEgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBfZGF0YVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVE11bHRpcGxleGVkUHJvdG9jb2wuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RNdWx0aXBsZXhlZFByb3RvY29sLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2N2U0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RNdWx0aXBsZXhlZFByb3RvY29sLmNzCkBAIC0wLDAgKzEsOTEgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMKK3sKKyAgICAvKioKKyAgICAqIFRNdWx0aXBsZXhlZFByb3RvY29sIGlzIGEgcHJvdG9jb2wtaW5kZXBlbmRlbnQgY29uY3JldGUgZGVjb3JhdG9yIHRoYXQgYWxsb3dzIGEgVGhyaWZ0CisgICAgKiBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG11bHRpcGxleGluZyBUaHJpZnQgc2VydmVyLCBieSBwcmVwZW5kaW5nIHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAqIHRvIHRoZSBmdW5jdGlvbiBuYW1lIGR1cmluZyBmdW5jdGlvbiBjYWxscy4KKyAgICAqCisgICAgKiBOT1RFOiBUSElTIElTIE5PVCBUTyBCRSBVU0VEIEJZIFNFUlZFUlMuCisgICAgKiBPbiB0aGUgc2VydmVyLCB1c2UgVE11bHRpcGxleGVkUHJvY2Vzc29yIHRvIGhhbmRsZSByZXF1ZXN0cyBmcm9tIGEgbXVsdGlwbGV4aW5nIGNsaWVudC4KKyAgICAqCisgICAgKiBUaGlzIGV4YW1wbGUgdXNlcyBhIHNpbmdsZSBzb2NrZXQgdHJhbnNwb3J0IHRvIGludm9rZSB0d28gc2VydmljZXM6CisgICAgKgorICAgICogICAgIFRTb2NrZXRDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbmV3IFRTb2NrZXRDbGllbnRUcmFuc3BvcnQoImxvY2FsaG9zdCIsIDkwOTApOworICAgICogICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgICAgKgorICAgICogICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAqCisgICAgKiAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJDYWxjdWxhdG9yIik7CisgICAgKiAgICAgQ2FsY3VsYXRvci5DbGllbnQgc2VydmljZSA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChtcCk7CisgICAgKgorICAgICogICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wMiA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIldlYXRoZXJSZXBvcnQiKTsKKyAgICAqICAgICBXZWF0aGVyUmVwb3J0LkNsaWVudCBzZXJ2aWNlMiA9IG5ldyBXZWF0aGVyUmVwb3J0LkNsaWVudChtcDIpOworICAgICoKKyAgICAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZS5hZGQoMiwyKSk7CisgICAgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UyLmdldFRlbXBlcmF0dXJlKCkpOworICAgICoKKyAgICAqLworCisgICAgLy9UT0RPOiBpbXBsZW1lbnRhdGlvbiBvZiBUUHJvdG9jb2wKKworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRNdWx0aXBsZXhlZFByb3RvY29sIDogVFByb3RvY29sRGVjb3JhdG9yCisgICAgeworICAgICAgICAvKiogVXNlZCB0byBkZWxpbWl0IHRoZSBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgZnVuY3Rpb24gbmFtZSAqLworICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIFNlcGFyYXRvciA9ICI6IjsKKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfc2VydmljZU5hbWU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyYXAgdGhlIHNwZWNpZmllZCBwcm90b2NvbCwgYWxsb3dpbmcgaXQgdG8gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGEKKyAgICAgICAgICogbXVsdGlwbGV4aW5nIHNlcnZlci4gIFRoZSA8Y29kZT5zZXJ2aWNlTmFtZTwvY29kZT4gaXMgcmVxdWlyZWQgYXMgaXQgaXMKKyAgICAgICAgICogcHJlcGVuZGVkIHRvIHRoZSBtZXNzYWdlIGhlYWRlciBzbyB0aGF0IHRoZSBtdWx0aXBsZXhpbmcgc2VydmVyIGNhbiBicm9rZXIKKyAgICAgICAgICogdGhlIGZ1bmN0aW9uIGNhbGwgdG8gdGhlIHByb3BlciBzZXJ2aWNlLgorICAgICAgICAgKgorICAgICAgICAgKiBBcmdzOgorICAgICAgICAgKiAgcHJvdG9jb2wgICAgICAgIFlvdXIgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBvZiBjaG9pY2UsIGUuZy4gVEJpbmFyeVByb3RvY29sCisgICAgICAgICAqICBzZXJ2aWNlTmFtZSAgICAgVGhlIHNlcnZpY2UgbmFtZSBvZiB0aGUgc2VydmljZSBjb21tdW5pY2F0aW5nIHZpYSB0aGlzIHByb3RvY29sLgorICAgICAgICAgKi8KKworICAgICAgICBwdWJsaWMgVE11bHRpcGxleGVkUHJvdG9jb2woVFByb3RvY29sIHByb3RvY29sLCBzdHJpbmcgc2VydmljZU5hbWUpCisgICAgICAgICAgICA6IGJhc2UocHJvdG9jb2wpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhUTWVzc2FnZSBtZXNzYWdlLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLlR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBUTWVzc2FnZVR5cGUuQ2FsbDoKKyAgICAgICAgICAgICAgICBjYXNlIFRNZXNzYWdlVHlwZS5PbmV3YXk6CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IGJhc2UuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhuZXcgVE1lc3NhZ2UoJCJ7X3NlcnZpY2VOYW1lfXtTZXBhcmF0b3J9e21lc3NhZ2UuTmFtZX0iLCBtZXNzYWdlLlR5cGUsIG1lc3NhZ2UuU2VxSUQpLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IGJhc2UuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhtZXNzYWdlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UUHJvdG9jb2wuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RQcm90b2NvbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWUwMDlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UUHJvdG9jb2wuY3MKQEAgLTAsMCArMSwzNzYgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sIDogSURpc3Bvc2FibGUKKyAgICB7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdFJlY3Vyc2lvbkRlcHRoID0gNjQ7CisgICAgICAgIHByaXZhdGUgYm9vbCBfaXNEaXNwb3NlZDsKKyAgICAgICAgcHJvdGVjdGVkIGludCBSZWN1cnNpb25EZXB0aDsKKworICAgICAgICBwcm90ZWN0ZWQgVENsaWVudFRyYW5zcG9ydCBUcmFuczsKKworICAgICAgICBwcm90ZWN0ZWQgVFByb3RvY29sKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYW5zID0gdHJhbnM7CisgICAgICAgICAgICBSZWN1cnNpb25MaW1pdCA9IERlZmF1bHRSZWN1cnNpb25EZXB0aDsKKyAgICAgICAgICAgIFJlY3Vyc2lvbkRlcHRoID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUQ2xpZW50VHJhbnNwb3J0IFRyYW5zcG9ydCA9PiBUcmFuczsKKworICAgICAgICBwcm90ZWN0ZWQgaW50IFJlY3Vyc2lvbkxpbWl0IHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgdm9pZCBEaXNwb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgRGlzcG9zZSh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFJlY3Vyc2lvbkRlcHRoIDwgUmVjdXJzaW9uTGltaXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKytSZWN1cnNpb25EZXB0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5ERVBUSF9MSU1JVCwgIkRlcHRoIGxpbWl0IGV4Y2VlZGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC0tUmVjdXJzaW9uRGVwdGg7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIChUcmFucyBhcyBJRGlzcG9zYWJsZSk/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlTWVzc2FnZUJlZ2luQXN5bmMoVE1lc3NhZ2UgbWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhtZXNzYWdlLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlTWVzc2FnZUJlZ2luQXN5bmMoVE1lc3NhZ2UgbWVzc2FnZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlRW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZU1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlTWVzc2FnZUVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlU3RydWN0QmVnaW5Bc3luYyhUU3RydWN0IEBzdHJ1Y3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlU3RydWN0QmVnaW5Bc3luYyhAc3RydWN0LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlU3RydWN0QmVnaW5Bc3luYyhUU3RydWN0IEBzdHJ1Y3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlU3RydWN0RW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZVN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUZpZWxkQmVnaW5Bc3luYyhURmllbGQgZmllbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlRmllbGRCZWdpbkFzeW5jKGZpZWxkLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlRmllbGRCZWdpbkFzeW5jKFRGaWVsZCBmaWVsZCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVGaWVsZEVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlRmllbGRTdG9wQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUZpZWxkU3RvcEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVGaWVsZFN0b3BBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZU1hcEJlZ2luQXN5bmMoVE1hcCBtYXApCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlTWFwQmVnaW5Bc3luYyhtYXAsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVNYXBCZWdpbkFzeW5jKFRNYXAgbWFwLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZU1hcEVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVMaXN0QmVnaW5Bc3luYyhUTGlzdCBsaXN0KQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUxpc3RCZWdpbkFzeW5jKGxpc3QsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVMaXN0QmVnaW5Bc3luYyhUTGlzdCBsaXN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUxpc3RFbmRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVTZXRCZWdpbkFzeW5jKFRTZXQgc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZVNldEJlZ2luQXN5bmMoc2V0LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlU2V0QmVnaW5Bc3luYyhUU2V0IHNldCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVTZXRFbmRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlU2V0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZVNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlQm9vbEFzeW5jKGJvb2wgYikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVCb29sQXN5bmMoYiwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUJvb2xBc3luYyhib29sIGIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlQnl0ZUFzeW5jKHNieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKGIsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVCeXRlQXN5bmMoc2J5dGUgYiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVJMTZBc3luYyhzaG9ydCBpMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSTE2QXN5bmMoaTE2LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlSTE2QXN5bmMoc2hvcnQgaTE2LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUkzMkFzeW5jKGludCBpMzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSTMyQXN5bmMoaTMyLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlSTMyQXN5bmMoaW50IGkzMiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVJNjRBc3luYyhsb25nIGk2NCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVJNjRBc3luYyhpNjQsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVJNjRBc3luYyhsb25nIGk2NCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVEb3VibGVBc3luYyhkb3VibGUgZCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVEb3VibGVBc3luYyhkLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlRG91YmxlQXN5bmMoZG91YmxlIGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlU3RyaW5nQXN5bmMoc3RyaW5nIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlU3RyaW5nQXN5bmMocywgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlU3RyaW5nQXN5bmMoc3RyaW5nIHMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYnl0ZXMgPSBFbmNvZGluZy5VVEY4LkdldEJ5dGVzKHMpOworICAgICAgICAgICAgYXdhaXQgV3JpdGVCaW5hcnlBc3luYyhieXRlcywgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUJpbmFyeUFzeW5jKGJ5dGVbXSBieXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVCaW5hcnlBc3luYyhieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUJpbmFyeUFzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8VE1lc3NhZ2U+IFJlYWRNZXNzYWdlQmVnaW5Bc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkTWVzc2FnZUJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxUTWVzc2FnZT4gUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFJlYWRNZXNzYWdlRW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkTWVzc2FnZUVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgUmVhZE1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxUU3RydWN0PiBSZWFkU3RydWN0QmVnaW5Bc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkU3RydWN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrPFRTdHJ1Y3Q+IFJlYWRTdHJ1Y3RCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFJlYWRTdHJ1Y3RFbmRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFJlYWRTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxURmllbGQ+IFJlYWRGaWVsZEJlZ2luQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEZpZWxkQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrPFRGaWVsZD4gUmVhZEZpZWxkQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkRmllbGRFbmRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgUmVhZEZpZWxkRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8VE1hcD4gUmVhZE1hcEJlZ2luQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZE1hcEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxUTWFwPiBSZWFkTWFwQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkTWFwRW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBSZWFkTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8VExpc3Q+IFJlYWRMaXN0QmVnaW5Bc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkTGlzdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxUTGlzdD4gUmVhZExpc3RCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFJlYWRMaXN0RW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgUmVhZExpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxUU2V0PiBSZWFkU2V0QmVnaW5Bc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkU2V0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrPFRTZXQ+IFJlYWRTZXRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFJlYWRTZXRFbmRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFJlYWRTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxib29sPiBSZWFkQm9vbEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRCb29sQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxib29sPiBSZWFkQm9vbEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPHNieXRlPiBSZWFkQnl0ZUFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRCeXRlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxzYnl0ZT4gUmVhZEJ5dGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxzaG9ydD4gUmVhZEkxNkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRJMTZBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrPHNob3J0PiBSZWFkSTE2QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8aW50PiBSZWFkSTMyQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEkzMkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8aW50PiBSZWFkSTMyQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8bG9uZz4gUmVhZEk2NEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRJNjRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrPGxvbmc+IFJlYWRJNjRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxkb3VibGU+IFJlYWREb3VibGVBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkRG91YmxlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxkb3VibGU+IFJlYWREb3VibGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxzdHJpbmc+IFJlYWRTdHJpbmdBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkU3RyaW5nQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPHN0cmluZz4gUmVhZFN0cmluZ0FzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYnVmID0gYXdhaXQgUmVhZEJpbmFyeUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBFbmNvZGluZy5VVEY4LkdldFN0cmluZyhidWYsIDAsIGJ1Zi5MZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxieXRlW10+IFJlYWRCaW5hcnlBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQmluYXJ5QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxieXRlW10+IFJlYWRCaW5hcnlBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVFByb3RvY29sRGVjb3JhdG9yLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UUHJvdG9jb2xEZWNvcmF0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyMjc1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVFByb3RvY29sRGVjb3JhdG9yLmNzCkBAIC0wLDAgKzEsMjQ3IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICAgICBUUHJvdG9jb2xEZWNvcmF0b3IgZm9yd2FyZHMgYWxsIHJlcXVlc3RzIHRvIGFuIGVuY2xvc2VkIFRQcm90b2NvbCBpbnN0YW5jZSwKKyAgICAvLy8gICAgIHByb3ZpZGluZyBhIHdheSB0byBhdXRob3IgY29uY2lzZSBjb25jcmV0ZSBkZWNvcmF0b3Igc3ViY2xhc3Nlcy5XaGlsZSBpdCBoYXMKKyAgICAvLy8gICAgIG5vIGFic3RyYWN0IG1ldGhvZHMsIGl0IGlzIG1hcmtlZCBhYnN0cmFjdCBhcyBhIHJlbWluZGVyIHRoYXQgYnkgaXRzZWxmLAorICAgIC8vLyAgICAgaXQgZG9lcyBub3QgbW9kaWZ5IHRoZSBiZWhhdmlvdXIgb2YgdGhlIGVuY2xvc2VkIFRQcm90b2NvbC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3IgOiBUUHJvdG9jb2wKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVFByb3RvY29sIF93cmFwcGVkUHJvdG9jb2w7CisKKyAgICAgICAgcHJvdGVjdGVkIFRQcm90b2NvbERlY29yYXRvcihUUHJvdG9jb2wgcHJvdG9jb2wpCisgICAgICAgICAgICA6IGJhc2UocHJvdG9jb2wuVHJhbnNwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICBfd3JhcHBlZFByb3RvY29sID0gcHJvdG9jb2wgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YocHJvdG9jb2wpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWVzc2FnZUJlZ2luQXN5bmMoVE1lc3NhZ2UgbWVzc2FnZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhtZXNzYWdlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZU1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEJlZ2luQXN5bmMoVFN0cnVjdCBAc3RydWN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZVN0cnVjdEJlZ2luQXN5bmMoQHN0cnVjdCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZVN0cnVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRCZWdpbkFzeW5jKFRGaWVsZCBmaWVsZCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZmllbGQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZUZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVGaWVsZFN0b3BBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZUZpZWxkU3RvcEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWFwQmVnaW5Bc3luYyhUTWFwIG1hcCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVNYXBCZWdpbkFzeW5jKG1hcCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZU1hcEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTGlzdEJlZ2luQXN5bmMoVExpc3QgbGlzdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVMaXN0QmVnaW5Bc3luYyhsaXN0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUxpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZUxpc3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVNldEJlZ2luQXN5bmMoVFNldCBzZXQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlU2V0QmVnaW5Bc3luYyhzZXQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU2V0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVTZXRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJvb2xBc3luYyhib29sIGIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlQm9vbEFzeW5jKGIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQnl0ZUFzeW5jKHNieXRlIGIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlQnl0ZUFzeW5jKGIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTE2QXN5bmMoc2hvcnQgaTE2LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZUkxNkFzeW5jKGkxNiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMzJBc3luYyhpbnQgaTMyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZUkzMkFzeW5jKGkzMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJNjRBc3luYyhsb25nIGk2NCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVJNjRBc3luYyhpNjQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRG91YmxlQXN5bmMoZG91YmxlIGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlRG91YmxlQXN5bmMoZCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJpbmdBc3luYyhzdHJpbmcgcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJpbmdBc3luYyhzLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJpbmFyeUFzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVCaW5hcnlBc3luYyhieXRlcywgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1lc3NhZ2U+IFJlYWRNZXNzYWdlQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZE1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUU3RydWN0PiBSZWFkU3RydWN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZFN0cnVjdEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZFN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxURmllbGQ+IFJlYWRGaWVsZEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRGaWVsZEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZEZpZWxkRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZEZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1hcD4gUmVhZE1hcEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRNYXBCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkTWFwRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VExpc3Q+IFJlYWRMaXN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZExpc3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZExpc3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUU2V0PiBSZWFkU2V0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZFNldEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZFNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRTZXRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxib29sPiBSZWFkQm9vbEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkQm9vbEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPHNieXRlPiBSZWFkQnl0ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPHNob3J0PiBSZWFkSTE2QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRJMTZBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRJMzJBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGxvbmc+IFJlYWRJNjRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZEk2NEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGRvdWJsZT4gUmVhZERvdWJsZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkRG91YmxlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c3RyaW5nPiBSZWFkU3RyaW5nQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRTdHJpbmdBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxieXRlW10+IFJlYWRCaW5hcnlBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZEJpbmFyeUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RQcm90b2NvbEV4Y2VwdGlvbi5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVFByb3RvY29sRXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNjdjM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RQcm90b2NvbEV4Y2VwdGlvbi5jcwpAQCAtMCwwICsxLDU5IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBSZVNoYXJwZXIgZGlzYWJsZSBJbmNvbnNpc3RlbnROYW1pbmcKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgcHVibGljIGNsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIGRvIG5vdCByZW5hbWUgcHVibGljIGNvbnN0YW50cyAtIHRoZXkgdXNlZCBpbiBnZW5lcmF0ZWQgZmlsZXMKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBVTktOT1dOID0gMDsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBJTlZBTElEX0RBVEEgPSAxOworICAgICAgICBwdWJsaWMgY29uc3QgaW50IE5FR0FUSVZFX1NJWkUgPSAyOworICAgICAgICBwdWJsaWMgY29uc3QgaW50IFNJWkVfTElNSVQgPSAzOworICAgICAgICBwdWJsaWMgY29uc3QgaW50IEJBRF9WRVJTSU9OID0gNDsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBOT1RfSU1QTEVNRU5URUQgPSA1OworICAgICAgICBwdWJsaWMgY29uc3QgaW50IERFUFRIX0xJTUlUID0gNjsKKworICAgICAgICBwcm90ZWN0ZWQgaW50IFR5cGUgPSBVTktOT1dOOworCisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKGludCB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oaW50IHR5cGUsIHN0cmluZyBtZXNzYWdlKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIFR5cGUgPSB0eXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IEdldEV4Y2VwdGlvblR5cGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVHlwZTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1V0aWxpdGllcy9UQmFzZTY0SGVscGVyLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEJhc2U2NEhlbHBlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWZmNWUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEJhc2U2NEhlbHBlci5jcwpAQCAtMCwwICsxLDEwMSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5VdGlsaXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBUQmFzZTY0SGVscGVyCisgICAgeworICAgICAgICAvL1RPRE86IENvbnN0YW50cworICAgICAgICAvL1RPRE86IENoZWNrIGZvciBhcmdzCisgICAgICAgIC8vVE9ETzogVW5pdGVzdHMKKworICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgRW5jb2RlVGFibGUgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgaW50W10gRGVjb2RlVGFibGUgPQorICAgICAgICB7CisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA2MiwgLTEsIC0xLCAtMSwgNjMsCisgICAgICAgICAgICA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsCisgICAgICAgICAgICAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLAorICAgICAgICAgICAgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xCisgICAgICAgIH07CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgRW5jb2RlKGJ5dGVbXSBzcmMsIGludCBzcmNPZmYsIGludCBsZW4sIGJ5dGVbXSBkc3QsIGludCBkc3RPZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzcmMgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihzcmMpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0W2RzdE9mZl0gPSAoYnl0ZSkgRW5jb2RlVGFibGVbKHNyY1tzcmNPZmZdID4+IDIpICYgMHgzRl07CisKKyAgICAgICAgICAgIGlmIChsZW4gPT0gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMV0gPSAoYnl0ZSkgRW5jb2RlVGFibGVbKChzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzApIHwgKChzcmNbc3JjT2ZmICsgMV0gPj4gNCkgJiAweDBGKV07CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDJdID0gKGJ5dGUpIEVuY29kZVRhYmxlWygoc3JjW3NyY09mZiArIDFdIDw8IDIpICYgMHgzQykgfCAoKHNyY1tzcmNPZmYgKyAyXSA+PiA2KSAmIDB4MDMpXTsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgM10gPSAoYnl0ZSkgRW5jb2RlVGFibGVbc3JjW3NyY09mZiArIDJdICYgMHgzRl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsZW4gPT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMV0gPSAoYnl0ZSkgRW5jb2RlVGFibGVbKChzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzApIHwgKChzcmNbc3JjT2ZmICsgMV0gPj4gNCkgJiAweDBGKV07CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDJdID0gKGJ5dGUpIEVuY29kZVRhYmxlWyhzcmNbc3JjT2ZmICsgMV0gPDwgMikgJiAweDNDXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBsZW4gPT0gMQorICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoc3JjW3NyY09mZl0gPDwgNCkgJiAweDMwXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIERlY29kZShieXRlW10gc3JjLCBpbnQgc3JjT2ZmLCBpbnQgbGVuLCBieXRlW10gZHN0LCBpbnQgZHN0T2ZmKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3JjID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2Yoc3JjKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRzdFtkc3RPZmZdID0gKGJ5dGUpICgoRGVjb2RlVGFibGVbc3JjW3NyY09mZl0gJiAweDBGRl0gPDwgMikgfCAoRGVjb2RlVGFibGVbc3JjW3NyY09mZiArIDFdICYgMHgwRkZdID4+IDQpKTsKKworICAgICAgICAgICAgaWYgKGxlbiA+IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpCisgICAgICAgICAgICAgICAgICAgICgoKERlY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAxXSAmIDB4MEZGXSA8PCA0KSAmIDB4RjApIHwgKERlY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAyXSAmIDB4MEZGXSA+PiAyKSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMl0gPQorICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGUpCisgICAgICAgICAgICAgICAgICAgICAgICAoKChEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgMl0gJiAweDBGRl0gPDwgNikgJiAweEMwKSB8IERlY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAzXSAmIDB4MEZGXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RCYXNlNjRVdGlscy5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RCYXNlNjRVdGlscy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWZkNDVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEJhc2U2NFV0aWxzLmNzCkBAIC0wLDAgKzEsMTAxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLlV0aWxpdGllcworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgaW50ZXJuYWwgc3RhdGljIGNsYXNzIFRCYXNlNjRVdGlscworICAgIHsKKyAgICAgICAgLy9UT0RPOiBDb25zdGFudHMKKyAgICAgICAgLy9UT0RPOiBDaGVjayBmb3IgYXJncworICAgICAgICAvL1RPRE86IFVuaXRlc3RzCisKKyAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEVuY29kZVRhYmxlID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGludFtdIERlY29kZVRhYmxlID0KKyAgICAgICAgeworICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNjIsIC0xLCAtMSwgLTEsIDYzLAorICAgICAgICAgICAgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LAorICAgICAgICAgICAgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwKKyAgICAgICAgICAgIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMQorICAgICAgICB9OworCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIEVuY29kZShieXRlW10gc3JjLCBpbnQgc3JjT2ZmLCBpbnQgbGVuLCBieXRlW10gZHN0LCBpbnQgZHN0T2ZmKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3JjID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2Yoc3JjKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRzdFtkc3RPZmZdID0gKGJ5dGUpIEVuY29kZVRhYmxlWyhzcmNbc3JjT2ZmXSA+PiAyKSAmIDB4M0ZdOworCisgICAgICAgICAgICBpZiAobGVuID09IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0gKGJ5dGUpIEVuY29kZVRhYmxlWygoc3JjW3NyY09mZl0gPDwgNCkgJiAweDMwKSB8ICgoc3JjW3NyY09mZiArIDFdID4+IDQpICYgMHgwRildOworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAyXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoKHNyY1tzcmNPZmYgKyAxXSA8PCAyKSAmIDB4M0MpIHwgKChzcmNbc3JjT2ZmICsgMl0gPj4gNikgJiAweDAzKV07CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDNdID0gKGJ5dGUpIEVuY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAyXSAmIDB4M0ZdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobGVuID09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0gKGJ5dGUpIEVuY29kZVRhYmxlWygoc3JjW3NyY09mZl0gPDwgNCkgJiAweDMwKSB8ICgoc3JjW3NyY09mZiArIDFdID4+IDQpICYgMHgwRildOworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAyXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoc3JjW3NyY09mZiArIDFdIDw8IDIpICYgMHgzQ107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbGVuID09IDEKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMV0gPSAoYnl0ZSkgRW5jb2RlVGFibGVbKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBEZWNvZGUoYnl0ZVtdIHNyYywgaW50IHNyY09mZiwgaW50IGxlbiwgYnl0ZVtdIGRzdCwgaW50IGRzdE9mZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNyYyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKHNyYykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3RbZHN0T2ZmXSA9IChieXRlKSAoKERlY29kZVRhYmxlW3NyY1tzcmNPZmZdICYgMHgwRkZdIDw8IDIpIHwgKERlY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAxXSAmIDB4MEZGXSA+PiA0KSk7CisKKyAgICAgICAgICAgIGlmIChsZW4gPiAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9CisgICAgICAgICAgICAgICAgICAgIChieXRlKQorICAgICAgICAgICAgICAgICAgICAoKChEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgMV0gJiAweDBGRl0gPDwgNCkgJiAweEYwKSB8IChEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgMl0gJiAweDBGRl0gPj4gMikpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPiAzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDJdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChieXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgKCgoRGVjb2RlVGFibGVbc3JjW3NyY09mZiArIDJdICYgMHgwRkZdIDw8IDYpICYgMHhDMCkgfCBEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgM10gJiAweDBGRl0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1V0aWxpdGllcy9USnNvblByb3RvY29sQ29uc3RhbnRzLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEpzb25Qcm90b2NvbENvbnN0YW50cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2VmZjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEpzb25Qcm90b2NvbENvbnN0YW50cy5jcwpAQCAtMCwwICsxLDYxIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5VdGlsaXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVEpTT05Qcm90b2NvbENvbnN0YW50cworICAgIHsKKyAgICAgICAgLy9UT0RPIENoZWNrIGZvciBwZXJmb3JtYW5jZSBmb3IgcmV1c2luZyBJbW11dGFibGVBcnJheSBmcm9tIFN5c3RlbS5Db2xsZWN0aW9ucy5JbW11dGFibGUgKGh0dHBzOi8vYmxvZ3MubXNkbi5taWNyb3NvZnQuY29tL2RvdG5ldC8yMDEzLzA2LzI0L3BsZWFzZS13ZWxjb21lLWltbXV0YWJsZWFycmF5dC8pCisgICAgICAgIC8vIGNhbiBiZSBwb3NzaWJsZSB0byBnZXQgYmV0dGVyIHBlcmZvcm1hbmNlIGFuZCBhbHNvIGJldHRlciBHQworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIENvbW1hID0geyhieXRlKSAnLCd9OworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBDb2xvbiA9IHsoYnl0ZSkgJzonfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTGVmdEJyYWNlID0geyhieXRlKSAneyd9OworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBSaWdodEJyYWNlID0geyhieXRlKSAnfSd9OworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBMZWZ0QnJhY2tldCA9IHsoYnl0ZSkgJ1snfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gUmlnaHRCcmFja2V0ID0geyhieXRlKSAnXSd9OworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBRdW90ZSA9IHsoYnl0ZSkgJyInfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gQmFja3NsYXNoID0geyhieXRlKSAnXFwnfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBKc29uQ2hhclRhYmxlID0KKyAgICAgICAgeworICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgKGJ5dGUpICdiJywgKGJ5dGUpICd0JywgKGJ5dGUpICduJywgMCwgKGJ5dGUpICdmJywgKGJ5dGUpICdyJywgMCwgMCwKKyAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAxLCAxLCAoYnl0ZSkgJyInLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxCisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBjaGFyW10gRXNjYXBlQ2hhcnMgPSAiXCJcXC9iZm5ydCIuVG9DaGFyQXJyYXkoKTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gRXNjYXBlQ2hhclZhbHVlcyA9IHsoYnl0ZSkgJyInLCAoYnl0ZSkgJ1xcJywgKGJ5dGUpICcvJywgKGJ5dGUpICdcYicsIChieXRlKSAnXGYnLCAoYnl0ZSkgJ1xuJywgKGJ5dGUpICdccicsIChieXRlKSAnXHQnfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gRXNjU2VxdWVuY2VzID0geyhieXRlKSAnXFwnLCAoYnl0ZSkgJ3UnLCAoYnl0ZSkgJzAnLCAoYnl0ZSkgJzAnfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFR5cGVOYW1lcworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBOYW1lQm9vbCA9IHsgKGJ5dGUpJ3QnLCAoYnl0ZSknZicgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVCeXRlID0geyAoYnl0ZSknaScsIChieXRlKSc4JyB9OworICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTmFtZUkxNiA9IHsgKGJ5dGUpJ2knLCAoYnl0ZSknMScsIChieXRlKSc2JyB9OworICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTmFtZUkzMiA9IHsgKGJ5dGUpJ2knLCAoYnl0ZSknMycsIChieXRlKScyJyB9OworICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTmFtZUk2NCA9IHsgKGJ5dGUpJ2knLCAoYnl0ZSknNicsIChieXRlKSc0JyB9OworICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTmFtZURvdWJsZSA9IHsgKGJ5dGUpJ2QnLCAoYnl0ZSknYicsIChieXRlKSdsJyB9OworICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTmFtZVN0cnVjdCA9IHsgKGJ5dGUpJ3InLCAoYnl0ZSknZScsIChieXRlKSdjJyB9OworICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTmFtZVN0cmluZyA9IHsgKGJ5dGUpJ3MnLCAoYnl0ZSkndCcsIChieXRlKSdyJyB9OworICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTmFtZU1hcCA9IHsgKGJ5dGUpJ20nLCAoYnl0ZSknYScsIChieXRlKSdwJyB9OworICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTmFtZUxpc3QgPSB7IChieXRlKSdsJywgKGJ5dGUpJ3MnLCAoYnl0ZSkndCcgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVTZXQgPSB7IChieXRlKSdzJywgKGJ5dGUpJ2UnLCAoYnl0ZSkndCcgfTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1V0aWxpdGllcy9USnNvblByb3RvY29sSGVscGVyLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEpzb25Qcm90b2NvbEhlbHBlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGMyNmE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEpzb25Qcm90b2NvbEhlbHBlci5jcwpAQCAtMCwwICsxLDE3NiBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuVXRpbGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRKU09OUHJvdG9jb2xIZWxwZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIEdldFR5cGVOYW1lRm9yVHlwZUlkKFRUeXBlIHR5cGVJZCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh0eXBlSWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5Cb29sOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUJvb2w7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5CeXRlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUJ5dGU7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JMTY6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lSTE2OworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUkzMjsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJNjQ7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5Eb3VibGU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lRG91YmxlOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU3RyaW5nOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZVN0cmluZzsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlN0cnVjdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJ1Y3Q7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5NYXA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lTWFwOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU2V0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZVNldDsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkxpc3Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lTGlzdDsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5OT1RfSU1QTEVNRU5URUQsICJVbnJlY29nbml6ZWQgZXhUeXBlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFRUeXBlIEdldFR5cGVJZEZvclR5cGVOYW1lKGJ5dGVbXSBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gVFR5cGUuU3RvcDsKKyAgICAgICAgICAgIGlmIChuYW1lLkxlbmd0aCA+IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChuYW1lWzBdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJ2QnOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuRG91YmxlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdpJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobmFtZVsxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAnOCc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkJ5dGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICcxJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuSTE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAnMyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkkzMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJzYnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5JNjQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdsJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkxpc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJ20nOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuTWFwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdyJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLlN0cnVjdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAncyc6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZVsxXSA9PSAoYnl0ZSkgJ3QnKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLlN0cmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVbMV0gPT0gKGJ5dGUpICdlJykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5TZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJ3QnOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuQm9vbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gVFR5cGUuU3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5OT1RfSU1QTEVNRU5URUQsICJVbnJlY29nbml6ZWQgZXhUeXBlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBieXRlIGNvdWxkIGJlIGEgdmFsaWQgcGFydCBvZiBhIEpTT04gbnVtYmVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgSXNKc29uTnVtZXJpYyhieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKScrJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSctJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKScuJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKScwJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKScxJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKScyJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSczJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc0JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc1JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc2JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc3JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc4JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc5JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSdFJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSdlJzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggY2hhciAoJzAnLSc5JyBvciAnYSctJ2YnKSBpbnRvIGl0cworICAgICAgICAvLy8gICAgIGNvcnJlc3BvbmRpbmcgaGV4IHZhbHVlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZSBUb0hleFZhbChieXRlIGNoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKWNoIC0gJzAnKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2ggKz0gMTA7CisgICAgICAgICAgICAgICAgcmV0dXJuIChieXRlKSgoY2hhciljaCAtICdhJyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGhleCBjaGFyYWN0ZXIiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IHZhbHVlIHRvIGl0cyBjb3JyZXNwb25kaW5nIGhleCBjaGFyYWN0ZXIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0YXRpYyBieXRlIFRvSGV4Q2hhcihieXRlIHZhbCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsICY9IDB4MEY7CisgICAgICAgICAgICBpZiAodmFsIDwgMTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChieXRlKSgoY2hhcil2YWwgKyAnMCcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsIC09IDEwOworICAgICAgICAgICAgcmV0dXJuIChieXRlKSgoY2hhcil2YWwgKyAnYScpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RQcm90b2NvbFV0aWwuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1V0aWxpdGllcy9UUHJvdG9jb2xVdGlsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYjAzODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1V0aWxpdGllcy9UUHJvdG9jb2xVdGlsLmNzCkBAIC0wLDAgKzEsMTEwIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLlV0aWxpdGllcworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUUHJvdG9jb2xVdGlsCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIFRhc2sgU2tpcEFzeW5jKFRQcm90b2NvbCBwcm90b2NvbCwgVFR5cGUgdHlwZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb3RvY29sLkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkJvb2w6CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkQm9vbEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkJ5dGU6CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRJMTZBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JMzI6CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTY0OgorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZEk2NEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkRvdWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWREb3VibGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TdHJpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCB0cnkgdG8gZGVjb2RlIHRoZSBzdHJpbmcsIGp1c3Qgc2tpcCBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRCaW5hcnlBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TdHJ1Y3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkU3RydWN0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBhd2FpdCBwcm90b2NvbC5SZWFkRmllbGRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFNraXBBc3luYyhwcm90b2NvbCwgZmllbGQuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5NYXA6CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWFwID0gYXdhaXQgcHJvdG9jb2wuUmVhZE1hcEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXAuQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBTa2lwQXN5bmMocHJvdG9jb2wsIG1hcC5LZXlUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgU2tpcEFzeW5jKHByb3RvY29sLCBtYXAuVmFsdWVUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkTWFwRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU2V0OgorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNldCA9IGF3YWl0IHByb3RvY29sLlJlYWRTZXRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2V0LkNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgU2tpcEFzeW5jKHByb3RvY29sLCBzZXQuRWxlbWVudFR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRTZXRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5MaXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3QgPSBhd2FpdCBwcm90b2NvbC5SZWFkTGlzdEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0LkNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgU2tpcEFzeW5jKHByb3RvY29sLCBsaXN0LkVsZW1lbnRUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkTGlzdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiVW5rbm93biBkYXRhIHR5cGUgIiArIHR5cGUuVG9TdHJpbmcoImQiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByb3RvY29sLkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvU2VydmVyL0FzeW5jQmFzZVNlcnZlci5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9TZXJ2ZXIvQXN5bmNCYXNlU2VydmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNWMzOWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvU2VydmVyL0FzeW5jQmFzZVNlcnZlci5jcwpAQCAtMCwwICsxLDE4MyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOworCituYW1lc3BhY2UgVGhyaWZ0LlNlcnZlcgoreworICAgIC8vVE9ETzogdW5oYW5kbGVkIGV4Y2VwdGlvbnMsIGV0Yy4KKworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIEFzeW5jQmFzZVNlcnZlciA6IFRCYXNlU2VydmVyCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfY2xpZW50V2FpdGluZ0RlbGF5OworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIFRhc2sgX3NlcnZlclRhc2s7CisKKyAgICAgICAgcHVibGljIEFzeW5jQmFzZVNlcnZlcihJVEFzeW5jUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICBJVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwgSVRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgSUxvZ2dlckZhY3RvcnkgbG9nZ2VyRmFjdG9yeSwgaW50IGNsaWVudFdhaXRpbmdEZWxheSA9IDEwKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBTaW5nbGV0b25UUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgbG9nZ2VyRmFjdG9yeS5DcmVhdGVMb2dnZXIobmFtZW9mKEFzeW5jQmFzZVNlcnZlcikpLCBjbGllbnRXYWl0aW5nRGVsYXkpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBc3luY0Jhc2VTZXJ2ZXIoSVRQcm9jZXNzb3JGYWN0b3J5IGl0UHJvY2Vzc29yRmFjdG9yeSwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICBJVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwgSVRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgSUxvZ2dlciBsb2dnZXIsIGludCBjbGllbnRXYWl0aW5nRGVsYXkgPSAxMCkKKyAgICAgICAgICAgIDogYmFzZShpdFByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksIGxvZ2dlcikKKyAgICAgICAgeworICAgICAgICAgICAgX2NsaWVudFdhaXRpbmdEZWxheSA9IGNsaWVudFdhaXRpbmdEZWxheTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFNlcnZlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGNhbmNlbGF0aW9uIHRva2VuCisgICAgICAgICAgICAgICAgX3NlcnZlclRhc2sgPSBUYXNrLkZhY3RvcnkuU3RhcnROZXcoKCkgPT4gU3RhcnRMaXN0ZW5pbmcoY2FuY2VsbGF0aW9uVG9rZW4pLCBUYXNrQ3JlYXRpb25PcHRpb25zLkxvbmdSdW5uaW5nKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBfc2VydmVyVGFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0Vycm9yKGV4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFN0YXJ0TGlzdGVuaW5nKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBTZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCk7CisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dUcmFjZSgiU3RhcnRlZCBsaXN0ZW5pbmcgYXQgc2VydmVyIik7CisKKyAgICAgICAgICAgIGlmIChTZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBTZXJ2ZXJFdmVudEhhbmRsZXIuUHJlU2VydmVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlICghY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFNlcnZlclRyYW5zcG9ydC5Jc0NsaWVudFBlbmRpbmcoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dUcmFjZSgiV2FpdGluZyBmb3IgY2xpZW50IGNvbm5lY3Rpb24iKTsKKworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsaWVudCA9IGF3YWl0IFNlcnZlclRyYW5zcG9ydC5BY2NlcHRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZhY3RvcnkuU3RhcnROZXcoKCkgPT4gRXhlY3V0ZShjbGllbnQsIGNhbmNlbGxhdGlvblRva2VuKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ1RyYWNlKCQiVHJhbnNwb3J0IGV4Y2VwdGlvbjoge3R0eH0iKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR0eC5UeXBlICE9IFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIuTG9nRXJyb3IodHR4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkRlbGF5KFRpbWVTcGFuLkZyb21NaWxsaXNlY29uZHMoX2NsaWVudFdhaXRpbmdEZWxheSksIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaChUYXNrQ2FuY2VsZWRFeGNlcHRpb24pIHsgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7CisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dUcmFjZSgiQ29tcGxldGVkIGxpc3RlbmluZyBhdCBzZXJ2ZXIiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFN0b3AoKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgRXhlY3V0ZShUQ2xpZW50VHJhbnNwb3J0IGNsaWVudCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIExvZ2dlci5Mb2dUcmFjZSgiU3RhcnRlZCBjbGllbnQgcmVxdWVzdCBwcm9jZXNzaW5nIik7CisKKyAgICAgICAgICAgIHZhciBwcm9jZXNzb3IgPSBJdFByb2Nlc3NvckZhY3RvcnkuR2V0QXN5bmNQcm9jZXNzb3IoY2xpZW50LCB0aGlzKTsKKworICAgICAgICAgICAgVENsaWVudFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICBUQ2xpZW50VHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgb2JqZWN0IGNvbm5lY3Rpb25Db250ZXh0ID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnQgPSBJbnB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gT3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKKworICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wgPSBJbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBPdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKKworICAgICAgICAgICAgICAgIGlmIChTZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gYXdhaXQgU2VydmVyRXZlbnRIYW5kbGVyLkNyZWF0ZUNvbnRleHRBc3luYyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlICghY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWF3YWl0IGlucHV0VHJhbnNwb3J0LlBlZWtBc3luYyhjYW5jZWxsYXRpb25Ub2tlbikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKFNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBTZXJ2ZXJFdmVudEhhbmRsZXIuUHJvY2Vzc0NvbnRleHRBc3luYyhjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRUcmFuc3BvcnQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICghYXdhaXQgcHJvY2Vzc29yLlByb2Nlc3NBc3luYyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nVHJhY2UoJCJUcmFuc3BvcnQgZXhjZXB0aW9uOiB7dHR4fSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dFcnJvcigkIkVycm9yOiB7eH0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKFNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFNlcnZlckV2ZW50SGFuZGxlci5EZWxldGVDb250ZXh0QXN5bmMoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0Py5DbG9zZSgpOworICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0Py5DbG9zZSgpOworCisgICAgICAgICAgICBMb2dnZXIuTG9nVHJhY2UoIkNvbXBsZXRlZCBjbGllbnQgcmVxdWVzdCBwcm9jZXNzaW5nIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvU2VydmVyL1RCYXNlU2VydmVyLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9UQmFzZVNlcnZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDFkZDVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9UQmFzZVNlcnZlci5jcwpAQCAtMCwwICsxLDc5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIE1pY3Jvc29mdC5FeHRlbnNpb25zLkxvZ2dpbmc7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7CisKK25hbWVzcGFjZSBUaHJpZnQuU2VydmVyCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVEJhc2VTZXJ2ZXIKKyAgICB7CisgICAgICAgIHByb3RlY3RlZCByZWFkb25seSBJTG9nZ2VyIExvZ2dlcjsKKyAgICAgICAgcHJvdGVjdGVkIElUUHJvdG9jb2xGYWN0b3J5IElucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgVFRyYW5zcG9ydEZhY3RvcnkgSW5wdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgSVRQcm9jZXNzb3JGYWN0b3J5IEl0UHJvY2Vzc29yRmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIElUUHJvdG9jb2xGYWN0b3J5IE91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIFRUcmFuc3BvcnRGYWN0b3J5IE91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7CisKKyAgICAgICAgcHJvdGVjdGVkIFRTZXJ2ZXJFdmVudEhhbmRsZXIgU2VydmVyRXZlbnRIYW5kbGVyOworICAgICAgICBwcm90ZWN0ZWQgVFNlcnZlclRyYW5zcG9ydCBTZXJ2ZXJUcmFuc3BvcnQ7CisKKyAgICAgICAgcHJvdGVjdGVkIFRCYXNlU2VydmVyKElUUHJvY2Vzc29yRmFjdG9yeSBpdFByb2Nlc3NvckZhY3RvcnksIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgSVRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksIElUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIElMb2dnZXIgbG9nZ2VyKQorICAgICAgICB7CisgICAgICAgICAgICBJdFByb2Nlc3NvckZhY3RvcnkgPSBpdFByb2Nlc3NvckZhY3RvcnkgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YoaXRQcm9jZXNzb3JGYWN0b3J5KSk7CisgICAgICAgICAgICBTZXJ2ZXJUcmFuc3BvcnQgPSBzZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICAgICAgICBJbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YoaW5wdXRUcmFuc3BvcnRGYWN0b3J5KSk7CisgICAgICAgICAgICBPdXRwdXRUcmFuc3BvcnRGYWN0b3J5ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KSk7CisgICAgICAgICAgICBJbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGlucHV0UHJvdG9jb2xGYWN0b3J5KSk7CisgICAgICAgICAgICBPdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2Yob3V0cHV0UHJvdG9jb2xGYWN0b3J5KSk7CisgICAgICAgICAgICBMb2dnZXIgPSBsb2dnZXIgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YobG9nZ2VyKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBTZXRFdmVudEhhbmRsZXIoVFNlcnZlckV2ZW50SGFuZGxlciBzZWgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcnZlckV2ZW50SGFuZGxlciA9IHNlaDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyRXZlbnRIYW5kbGVyIEdldEV2ZW50SGFuZGxlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTZXJ2ZXJFdmVudEhhbmRsZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBTdG9wKCk7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTdGFydCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgU2VydmVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvU2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvU2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzYmI0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9TZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5jcwpAQCAtMCwwICsxLDU0IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKKworbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKK3sKKyAgICAvL1RPRE86IHJlcGxhY2VtZW50IGJ5IGV2ZW50PworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAgICAgSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHNlcnZlciB1c2VycyB0byBoYW5kbGUgZXZlbnRzIGZyb20gdGhlIHNlcnZlcgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRTZXJ2ZXJFdmVudEhhbmRsZXIKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBDYWxsZWQgYmVmb3JlIHRoZSBzZXJ2ZXIgYmVnaW5zICovCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFRhc2sgUHJlU2VydmVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIENhbGxlZCB3aGVuIGEgbmV3IGNsaWVudCBoYXMgY29ubmVjdGVkIGFuZCBpcyBhYm91dCB0byBiZWluZyBwcm9jZXNzaW5nICovCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFRhc2s8b2JqZWN0PiBDcmVhdGVDb250ZXh0QXN5bmMoVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIENhbGxlZCB3aGVuIGEgY2xpZW50IGhhcyBmaW5pc2hlZCByZXF1ZXN0LWhhbmRsaW5nIHRvIGRlbGV0ZSBzZXJ2ZXIgY29udGV4dCAqLworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBUYXNrIERlbGV0ZUNvbnRleHRBc3luYyhvYmplY3Qgc2VydmVyQ29udGV4dCwgVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0LAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBDYWxsZWQgd2hlbiBhIGNsaWVudCBpcyBhYm91dCB0byBjYWxsIHRoZSBwcm9jZXNzb3IgKi8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgVGFzayBQcm9jZXNzQ29udGV4dEFzeW5jKG9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUQ2xpZW50VHJhbnNwb3J0IHRyYW5zcG9ydCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvU2luZ2xldG9uVFByb2Nlc3NvckZhY3RvcnkuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvU2luZ2xldG9uVFByb2Nlc3NvckZhY3RvcnkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM1MTIzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9TaW5nbGV0b25UUHJvY2Vzc29yRmFjdG9yeS5jcwpAQCAtMCwwICsxLDM4IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBTaW5nbGV0b25UUHJvY2Vzc29yRmFjdG9yeSA6IElUUHJvY2Vzc29yRmFjdG9yeQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJVEFzeW5jUHJvY2Vzc29yIF90QXN5bmNQcm9jZXNzb3I7CisKKyAgICAgICAgcHVibGljIFNpbmdsZXRvblRQcm9jZXNzb3JGYWN0b3J5KElUQXN5bmNQcm9jZXNzb3IgdEFzeW5jUHJvY2Vzc29yKQorICAgICAgICB7CisgICAgICAgICAgICBfdEFzeW5jUHJvY2Vzc29yID0gdEFzeW5jUHJvY2Vzc29yOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElUQXN5bmNQcm9jZXNzb3IgR2V0QXN5bmNQcm9jZXNzb3IoVENsaWVudFRyYW5zcG9ydCB0cmFucywgVEJhc2VTZXJ2ZXIgYmFzZVNlcnZlciA9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfdEFzeW5jUHJvY2Vzc29yOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYzE0NWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsMTUwIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5VdGlsaXRpZXM7CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gOiBURXhjZXB0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgZW51bSBFeGNlcHRpb25UeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIFVua25vd24sCisgICAgICAgICAgICBVbmtub3duTWV0aG9kLAorICAgICAgICAgICAgSW52YWxpZE1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgV3JvbmdNZXRob2ROYW1lLAorICAgICAgICAgICAgQmFkU2VxdWVuY2VJZCwKKyAgICAgICAgICAgIE1pc3NpbmdSZXN1bHQsCisgICAgICAgICAgICBJbnRlcm5hbEVycm9yLAorICAgICAgICAgICAgUHJvdG9jb2xFcnJvciwKKyAgICAgICAgICAgIEludmFsaWRUcmFuc2Zvcm0sCisgICAgICAgICAgICBJbnZhbGlkUHJvdG9jb2wsCisgICAgICAgICAgICBVbnN1cHBvcnRlZENsaWVudFR5cGUKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IE1lc3NhZ2VUeXBlRmllbGRJZCA9IDE7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEV4VHlwZUZpZWxkSWQgPSAyOworCisgICAgICAgIHByb3RlY3RlZCBFeGNlcHRpb25UeXBlIFR5cGU7CisKKyAgICAgICAgcHVibGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlLCBzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgVGFzazxUQXBwbGljYXRpb25FeGNlcHRpb24+IFJlYWRBc3luYyhUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBtZXNzYWdlID0gbnVsbDsKKyAgICAgICAgICAgIHZhciB0eXBlID0gRXhjZXB0aW9uVHlwZS5Vbmtub3duOworCisgICAgICAgICAgICBhd2FpdCBpbnB1dFByb3RvY29sLlJlYWRTdHJ1Y3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IGF3YWl0IGlucHV0UHJvdG9jb2wuUmVhZEZpZWxkQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGQuSUQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE1lc3NhZ2VUeXBlRmllbGRJZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYXdhaXQgaW5wdXRQcm90b2NvbC5SZWFkU3RyaW5nQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlucHV0UHJvdG9jb2wsIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEV4VHlwZUZpZWxkSWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5JMzIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IChFeGNlcHRpb25UeXBlKSBhd2FpdCBpbnB1dFByb3RvY29sLlJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVFByb3RvY29sVXRpbC5Ta2lwQXN5bmMoaW5wdXRQcm90b2NvbCwgZmllbGQuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUUHJvdG9jb2xVdGlsLlNraXBBc3luYyhpbnB1dFByb3RvY29sLCBmaWVsZC5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhd2FpdCBpbnB1dFByb3RvY29sLlJlYWRGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgaW5wdXRQcm90b2NvbC5SZWFkU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICByZXR1cm4gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbih0eXBlLCBtZXNzYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlQXN5bmMoVFByb3RvY29sIG91dHB1dFByb3RvY29sLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIG1lc3NhZ2VUeXBlRmllbGROYW1lID0gIm1lc3NhZ2UiOworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIGV4VHlwZUZpZWxkTmFtZSA9ICJleFR5cGUiOworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIHN0cnVjdEFwcGxpY2F0aW9uRXhjZXB0aW9uTmFtZSA9ICJUQXBwbGljYXRpb25FeGNlcHRpb24iOworCisgICAgICAgICAgICB2YXIgc3RydWMgPSBuZXcgVFN0cnVjdChzdHJ1Y3RBcHBsaWNhdGlvbkV4Y2VwdGlvbk5hbWUpOworICAgICAgICAgICAgdmFyIGZpZWxkID0gbmV3IFRGaWVsZCgpOworCisgICAgICAgICAgICBhd2FpdCBvdXRwdXRQcm90b2NvbC5Xcml0ZVN0cnVjdEJlZ2luQXN5bmMoc3RydWMsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShNZXNzYWdlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWVsZC5OYW1lID0gbWVzc2FnZVR5cGVGaWVsZE5hbWU7CisgICAgICAgICAgICAgICAgZmllbGQuVHlwZSA9IFRUeXBlLlN0cmluZzsKKyAgICAgICAgICAgICAgICBmaWVsZC5JRCA9IE1lc3NhZ2VUeXBlRmllbGRJZDsKKyAgICAgICAgICAgICAgICBhd2FpdCBvdXRwdXRQcm90b2NvbC5Xcml0ZUZpZWxkQmVnaW5Bc3luYyhmaWVsZCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGF3YWl0IG91dHB1dFByb3RvY29sLldyaXRlU3RyaW5nQXN5bmMoTWVzc2FnZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGF3YWl0IG91dHB1dFByb3RvY29sLldyaXRlRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpZWxkLk5hbWUgPSBleFR5cGVGaWVsZE5hbWU7CisgICAgICAgICAgICBmaWVsZC5UeXBlID0gVFR5cGUuSTMyOworICAgICAgICAgICAgZmllbGQuSUQgPSBFeFR5cGVGaWVsZElkOworCisgICAgICAgICAgICBhd2FpdCBvdXRwdXRQcm90b2NvbC5Xcml0ZUZpZWxkQmVnaW5Bc3luYyhmaWVsZCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVJMzJBc3luYygoaW50KSBUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBvdXRwdXRQcm90b2NvbC5Xcml0ZUZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVGaWVsZFN0b3BBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBvdXRwdXRQcm90b2NvbC5Xcml0ZVN0cnVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVEJhc2VDbGllbnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVEJhc2VDbGllbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAxOTI1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UQmFzZUNsaWVudC5jcwpAQCAtMCwwICsxLDkxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gICAgIFRCYXNlQ2xpZW50LgorICAgIC8vLyAgICAgQmFzZSBjbGllbnQgZm9yIGdlbmVyYXRlZCBjbGllbnRzLgorICAgIC8vLyAgICAgRG8gbm90IGNoYW5nZSB0aGlzIGNsYXNzIHdpdGhvdXQgY2hlY2tpbmcgZ2VuZXJhdGVkIGNvZGUgKG5hbWluZ3MsIGV0Yy4pCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVEJhc2VDbGllbnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVFByb3RvY29sIF9pbnB1dFByb3RvY29sOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRQcm90b2NvbCBfb3V0cHV0UHJvdG9jb2w7CisgICAgICAgIHByaXZhdGUgYm9vbCBfaXNEaXNwb3NlZDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgX3NlcUlkOworICAgICAgICBwdWJsaWMgcmVhZG9ubHkgR3VpZCBDbGllbnRJZCA9IEd1aWQuTmV3R3VpZCgpOworCisgICAgICAgIHByb3RlY3RlZCBUQmFzZUNsaWVudChUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCwgVFByb3RvY29sIG91dHB1dFByb3RvY29sKQorICAgICAgICB7CisgICAgICAgICAgICBfaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2wgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YoaW5wdXRQcm90b2NvbCkpOworICAgICAgICAgICAgX291dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2wgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2Yob3V0cHV0UHJvdG9jb2wpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgSW5wdXRQcm90b2NvbCA9PiBfaW5wdXRQcm90b2NvbDsKKworICAgICAgICBwdWJsaWMgVFByb3RvY29sIE91dHB1dFByb3RvY29sID0+IF9vdXRwdXRQcm90b2NvbDsKKworICAgICAgICBwdWJsaWMgaW50IFNlcUlkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiArK19zZXFJZDsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBPcGVuVHJhbnNwb3J0QXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBPcGVuVHJhbnNwb3J0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIE9wZW5UcmFuc3BvcnRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaW5wdXRQcm90b2NvbC5UcmFuc3BvcnQuSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IF9pbnB1dFByb3RvY29sLlRyYW5zcG9ydC5PcGVuQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIV9pbnB1dFByb3RvY29sLlRyYW5zcG9ydC5Jc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgX291dHB1dFByb3RvY29sLlRyYW5zcG9ydC5PcGVuQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIERpc3Bvc2UodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9pbnB1dFByb3RvY29sPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIF9vdXRwdXRQcm90b2NvbD8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RFeGNlcHRpb24uY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVEV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWE1ODhkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RFeGNlcHRpb24uY3MKQEAgLTAsMCArMSwzNCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEV4Y2VwdGlvbiA6IEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIFRFeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQwZTc0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MKQEAgLTAsMCArMSwxNDMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRNdWx0aXBsZXhlZFByb2Nlc3NvciA6IElUQXN5bmNQcm9jZXNzb3IKKyAgICB7CisgICAgICAgIC8vVE9ETzogTG9jYWxpemF0aW9uCisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBEaWN0aW9uYXJ5PHN0cmluZywgSVRBc3luY1Byb2Nlc3Nvcj4gX3NlcnZpY2VQcm9jZXNzb3JNYXAgPQorICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBJVEFzeW5jUHJvY2Vzc29yPigpOworCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFByb2Nlc3NBc3luYyhpcHJvdCwgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxib29sPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gYXdhaXQgaXByb3QuUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgIGlmICgobWVzc2FnZS5UeXBlICE9IFRNZXNzYWdlVHlwZS5DYWxsKSAmJiAobWVzc2FnZS5UeXBlICE9IFRNZXNzYWdlVHlwZS5PbmV3YXkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgRmFpbEFzeW5jKG9wcm90LCBtZXNzYWdlLCBUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnZhbGlkTWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSBleFR5cGUgQ0FMTCBvciBPTkVXQVkgZXhwZWN0ZWQiLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBtZXNzYWdlLk5hbWUuSW5kZXhPZihUTXVsdGlwbGV4ZWRQcm90b2NvbC5TZXBhcmF0b3IsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbCk7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IEZhaWxBc3luYyhvcHJvdCwgbWVzc2FnZSwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW52YWxpZFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgJCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZToge21lc3NhZ2UuTmFtZX0uIERpZCB5b3UgZm9yZ2V0IHRvIHVzZSBhIFRNdWx0aXBsZXhQcm90b2NvbCBpbiB5b3VyIGNsaWVudD8iLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgY29uc3VtZWQgYnkgYW55IFRQcm90b2NvbAorICAgICAgICAgICAgICAgIHZhciBzZXJ2aWNlTmFtZSA9IG1lc3NhZ2UuTmFtZS5TdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICAgICAgICAgIElUQXN5bmNQcm9jZXNzb3IgYWN0dWFsUHJvY2Vzc29yOworICAgICAgICAgICAgICAgIGlmICghX3NlcnZpY2VQcm9jZXNzb3JNYXAuVHJ5R2V0VmFsdWUoc2VydmljZU5hbWUsIG91dCBhY3R1YWxQcm9jZXNzb3IpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgRmFpbEFzeW5jKG9wcm90LCBtZXNzYWdlLCBUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcm5hbEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgJCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kOiB7c2VydmljZU5hbWV9LiBEaWQgeW91IGZvcmdldCB0byBjYWxsIFJlZ2lzdGVyUHJvY2Vzc29yKCk/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBUTWVzc2FnZSwgcmVtb3ZpbmcgdGhlIHNlcnZpY2UgbmFtZQorICAgICAgICAgICAgICAgIHZhciBuZXdNZXNzYWdlID0gbmV3IFRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLk5hbWUuU3Vic3RyaW5nKHNlcnZpY2VOYW1lLkxlbmd0aCArIFRNdWx0aXBsZXhlZFByb3RvY29sLlNlcGFyYXRvci5MZW5ndGgpLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlR5cGUsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQpOworCisgICAgICAgICAgICAgICAgLy8gRGlzcGF0Y2ggcHJvY2Vzc2luZyB0byB0aGUgc3RvcmVkIHByb2Nlc3NvcgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICBhd2FpdAorICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsUHJvY2Vzc29yLlByb2Nlc3NBc3luYyhuZXcgU3RvcmVkTWVzc2FnZVByb3RvY29sKGlwcm90LCBuZXdNZXNzYWdlKSwgb3Byb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gc2ltaWxhciB0byBhbGwgb3RoZXIgcHJvY2Vzc29ycworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgUmVnaXN0ZXJQcm9jZXNzb3Ioc3RyaW5nIHNlcnZpY2VOYW1lLCBJVEFzeW5jUHJvY2Vzc29yIHByb2Nlc3NvcikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9zZXJ2aWNlUHJvY2Vzc29yTWFwLkNvbnRhaW5zS2V5KHNlcnZpY2VOYW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJCJQcm9jZXNzb3IgbWFwIGFscmVhZHkgY29udGFpbnMgcHJvY2Vzc29yIHdpdGggbmFtZTogJ3tzZXJ2aWNlTmFtZX0nIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9zZXJ2aWNlUHJvY2Vzc29yTWFwLkFkZChzZXJ2aWNlTmFtZSwgcHJvY2Vzc29yKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBGYWlsQXN5bmMoVFByb3RvY29sIG9wcm90LCBUTWVzc2FnZSBtZXNzYWdlLCBUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZSBleHR5cGUsCisgICAgICAgICAgICBzdHJpbmcgZXR4dCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBhcHBleCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oZXh0eXBlLCBldHh0KTsKKworICAgICAgICAgICAgdmFyIG5ld01lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UobWVzc2FnZS5OYW1lLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBtZXNzYWdlLlNlcUlEKTsKKworICAgICAgICAgICAgYXdhaXQgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhuZXdNZXNzYWdlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBhcHBleC5Xcml0ZUFzeW5jKG9wcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBvcHJvdC5UcmFuc3BvcnQuRmx1c2hBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbCA6IFRQcm90b2NvbERlY29yYXRvcgorICAgICAgICB7CisgICAgICAgICAgICByZWFkb25seSBUTWVzc2FnZSBfbXNnQmVnaW47CisKKyAgICAgICAgICAgIHB1YmxpYyBTdG9yZWRNZXNzYWdlUHJvdG9jb2woVFByb3RvY29sIHByb3RvY29sLCBUTWVzc2FnZSBtZXNzYWdlQmVnaW4pCisgICAgICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9tc2dCZWdpbiA9IG1lc3NhZ2VCZWdpbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1lc3NhZ2U+IFJlYWRNZXNzYWdlQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VE1lc3NhZ2U+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX21zZ0JlZ2luOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UaHJpZnQuY3Nwcm9qIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RocmlmdC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgwNmZlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UaHJpZnQuY3Nwcm9qCkBAIC0wLDAgKzEsMzEgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorCisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0c3RhbmRhcmQyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgICA8QXNzZW1ibHlOYW1lPlRocmlmdDwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+VGhyaWZ0PC9QYWNrYWdlSWQ+CisgICAgPEF1dG9HZW5lcmF0ZUJpbmRpbmdSZWRpcmVjdHM+dHJ1ZTwvQXV0b0dlbmVyYXRlQmluZGluZ1JlZGlyZWN0cz4KKyAgICA8R2VuZXJhdGVCaW5kaW5nUmVkaXJlY3RzT3V0cHV0VHlwZT50cnVlPC9HZW5lcmF0ZUJpbmRpbmdSZWRpcmVjdHNPdXRwdXRUeXBlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5VGl0bGVBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlWZXJzaW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5VmVyc2lvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUZpbGVWZXJzaW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5RmlsZVZlcnNpb25BdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5Bc3BOZXRDb3JlIiBWZXJzaW9uPSJbMi4wLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkV4dGVuc2lvbnMuTG9nZ2luZyIgVmVyc2lvbj0iWzIuMCwpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5FeHRlbnNpb25zLkxvZ2dpbmcuQ29uc29sZSIgVmVyc2lvbj0iWzIuMCwpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5FeHRlbnNpb25zLkxvZ2dpbmcuRGVidWciIFZlcnNpb249IlsyLjAsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uSU8uUGlwZXMiIFZlcnNpb249Ils0LjMsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lkh0dHAuV2luSHR0cEhhbmRsZXIiIFZlcnNpb249IjQuNC4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5OZXQuTmFtZVJlc29sdXRpb24iIFZlcnNpb249Ils0LjMsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0LlJlcXVlc3RzIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLk5ldC5TZWN1cml0eSIgVmVyc2lvbj0iWzQuMywpIiAvPgorICA8L0l0ZW1Hcm91cD4KKworPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RCdWZmZXJlZENsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UQnVmZmVyZWRDbGllbnRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYxZjFhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UQnVmZmVyZWRDbGllbnRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwyMDYgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEJ1ZmZlcmVkQ2xpZW50VHJhbnNwb3J0IDogVENsaWVudFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX2J1ZlNpemU7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIF9pbnB1dEJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oMCk7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIF9vdXRwdXRCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKDApOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRDbGllbnRUcmFuc3BvcnQgX3RyYW5zcG9ydDsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9pc0Rpc3Bvc2VkOworCisgICAgICAgIC8vVE9ETzogc2hvdWxkIHN1cHBvcnQgb25seSBzcGVjaWZpZWQgaW5wdXQgdHJhbnNwb3J0PworICAgICAgICBwdWJsaWMgVEJ1ZmZlcmVkQ2xpZW50VHJhbnNwb3J0KFRDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0LCBpbnQgYnVmU2l6ZSA9IDEwMjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChidWZTaXplIDw9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbihuYW1lb2YoYnVmU2l6ZSksICJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfdHJhbnNwb3J0ID0gdHJhbnNwb3J0ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgX2J1ZlNpemUgPSBidWZTaXplOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRDbGllbnRUcmFuc3BvcnQgVW5kZXJseWluZ1RyYW5zcG9ydAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX3RyYW5zcG9ydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiA9PiAhX2lzRGlzcG9zZWQgJiYgX3RyYW5zcG9ydC5Jc09wZW47CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuT3BlbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBfdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vVE9ETzogaW52ZXN0aWdhdGUgaG93IGl0IHNob3VsZCB3b3JrIGNvcnJlY3RseQorICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9pbnB1dEJ1ZmZlci5DYXBhY2l0eSA8IF9idWZTaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9pbnB1dEJ1ZmZlci5DYXBhY2l0eSA9IF9idWZTaXplOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZ290ID0gYXdhaXQgX2lucHV0QnVmZmVyLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoZ290ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ290OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfaW5wdXRCdWZmZXIuU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgIF9pbnB1dEJ1ZmZlci5TZXRMZW5ndGgoX2lucHV0QnVmZmVyLkNhcGFjaXR5KTsKKworICAgICAgICAgICAgQXJyYXlTZWdtZW50PGJ5dGU+IGJ1ZlNlZ21lbnQ7CisgICAgICAgICAgICBfaW5wdXRCdWZmZXIuVHJ5R2V0QnVmZmVyKG91dCBidWZTZWdtZW50KTsKKworICAgICAgICAgICAgLy8gaW52ZXN0aWdhdGUKKyAgICAgICAgICAgIHZhciBmaWxsZWQgPSBhd2FpdCBfdHJhbnNwb3J0LlJlYWRBc3luYyhidWZTZWdtZW50LkFycmF5LCAwLCAoaW50KSBfaW5wdXRCdWZmZXIuTGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBfaW5wdXRCdWZmZXIuU2V0TGVuZ3RoKGZpbGxlZCk7CisKKyAgICAgICAgICAgIGlmIChmaWxsZWQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKCFJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWxhdGl2ZSBvZmZzZXQgZnJvbSAib2ZmIiBhcmd1bWVudAorICAgICAgICAgICAgdmFyIHdyaXR0ZW5Db3VudCA9IDA7CisgICAgICAgICAgICBpZiAoX291dHB1dEJ1ZmZlci5MZW5ndGggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjYXBhID0gKGludCkgKF9vdXRwdXRCdWZmZXIuQ2FwYWNpdHkgLSBfb3V0cHV0QnVmZmVyLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgdmFyIHdyaXRlU2l6ZSA9IGNhcGEgPD0gbGVuZ3RoID8gY2FwYSA6IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBhd2FpdCBfb3V0cHV0QnVmZmVyLldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQsIHdyaXRlU2l6ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICAgICAgd3JpdHRlbkNvdW50ICs9IHdyaXRlU2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAod3JpdGVTaXplID09IGNhcGEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0FycmF5U2VnbWVudDxieXRlPiBidWZTZWdtZW50OworICAgICAgICAgICAgICAgICAgICAvL19vdXRwdXRCdWZmZXIuVHJ5R2V0QnVmZmVyKG91dCBidWZTZWdtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBfb3V0cHV0QnVmZmVyLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgLy9hd2FpdCBfdHJhbnNwb3J0LldyaXRlQXN5bmMoYnVmU2VnbWVudC5BcnJheSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBfdHJhbnNwb3J0LldyaXRlQXN5bmMoZGF0YSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBfb3V0cHV0QnVmZmVyLlNldExlbmd0aCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlIChsZW5ndGggLSB3cml0dGVuQ291bnQgPj0gX2J1ZlNpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgX3RyYW5zcG9ydC5Xcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0ICsgd3JpdHRlbkNvdW50LCBfYnVmU2l6ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIHdyaXR0ZW5Db3VudCArPSBfYnVmU2l6ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHJlbWFpbiA9IGxlbmd0aCAtIHdyaXR0ZW5Db3VudDsKKyAgICAgICAgICAgIGlmIChyZW1haW4gPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfb3V0cHV0QnVmZmVyLkNhcGFjaXR5IDwgX2J1ZlNpemUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfb3V0cHV0QnVmZmVyLkNhcGFjaXR5ID0gX2J1ZlNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGF3YWl0IF9vdXRwdXRCdWZmZXIuV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCArIHdyaXR0ZW5Db3VudCwgcmVtYWluLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBGbHVzaEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9vdXRwdXRCdWZmZXIuTGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL0FycmF5U2VnbWVudDxieXRlPiBidWZTZWdtZW50OworICAgICAgICAgICAgICAgIHZhciBkYXRhID0gX291dHB1dEJ1ZmZlci5Ub0FycmF5KCk7IC8vIFRyeUdldEJ1ZmZlcihvdXQgYnVmU2VnbWVudCk7CisKKyAgICAgICAgICAgICAgICBhd2FpdCBfdHJhbnNwb3J0LldyaXRlQXN5bmMoZGF0YSAvKmJ1ZlNlZ21lbnQuQXJyYXkqLywgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIF9vdXRwdXRCdWZmZXIuU2V0TGVuZ3RoKDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBfdHJhbnNwb3J0LkZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIENoZWNrTm90RGlzcG9zZWQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uKG5hbWVvZihfdHJhbnNwb3J0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfaW5wdXRCdWZmZXI/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgX291dHB1dEJ1ZmZlcj8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBfdHJhbnNwb3J0Py5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9URnJhbWVkQ2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RGcmFtZWRDbGllbnRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDExYmI5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9URnJhbWVkQ2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMjAxIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudAoreworICAgIC8vVE9ETzogY2hlY2sgZm9yIGNvcnJlY3QgaW1wbGVtZW50YXRpb24gCisKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBURnJhbWVkQ2xpZW50VHJhbnNwb3J0IDogVENsaWVudFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgSGVhZGVyU2l6ZSA9IDQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYnl0ZVtdIF9oZWFkZXJCdWYgPSBuZXcgYnl0ZVtIZWFkZXJTaXplXTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZW1vcnlTdHJlYW0gX3JlYWRCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKDEwMjQpOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRDbGllbnRUcmFuc3BvcnQgX3RyYW5zcG9ydDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZW1vcnlTdHJlYW0gX3dyaXRlQnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgxMDI0KTsKKworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisKKyAgICAgICAgcHVibGljIFRGcmFtZWRDbGllbnRUcmFuc3BvcnQoVENsaWVudFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF90cmFuc3BvcnQgPSB0cmFuc3BvcnQgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YodHJhbnNwb3J0KSk7CisKKyAgICAgICAgICAgIEluaXRXcml0ZUJ1ZmZlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuID0+ICFfaXNEaXNwb3NlZCAmJiBfdHJhbnNwb3J0LklzT3BlbjsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKworICAgICAgICAgICAgYXdhaXQgX3RyYW5zcG9ydC5PcGVuQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgIF90cmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCisgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGdvdCA9IGF3YWl0IF9yZWFkQnVmZmVyLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoZ290ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ290OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWFkIGFub3RoZXIgZnJhbWUgb2YgZGF0YQorICAgICAgICAgICAgYXdhaXQgUmVhZEZyYW1lQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlYWRCdWZmZXIuUmVhZEFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBSZWFkRnJhbWVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3RyYW5zcG9ydC5SZWFkQWxsQXN5bmMoX2hlYWRlckJ1ZiwgMCwgSGVhZGVyU2l6ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICB2YXIgc2l6ZSA9IERlY29kZUZyYW1lU2l6ZShfaGVhZGVyQnVmKTsKKworICAgICAgICAgICAgX3JlYWRCdWZmZXIuU2V0TGVuZ3RoKHNpemUpOworICAgICAgICAgICAgX3JlYWRCdWZmZXIuU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgQXJyYXlTZWdtZW50PGJ5dGU+IGJ1ZlNlZ21lbnQ7CisgICAgICAgICAgICBfcmVhZEJ1ZmZlci5UcnlHZXRCdWZmZXIob3V0IGJ1ZlNlZ21lbnQpOworCisgICAgICAgICAgICB2YXIgYnVmZiA9IGJ1ZlNlZ21lbnQuQXJyYXk7CisKKyAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuUmVhZEFsbEFzeW5jKGJ1ZmYsIDAsIHNpemUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfd3JpdGVCdWZmZXIuTGVuZ3RoICsgbGVuZ3RoID4gaW50Lk1heFZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IEZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBfd3JpdGVCdWZmZXIuV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBGbHVzaEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9BcnJheVNlZ21lbnQ8Ynl0ZT4gYnVmU2VnbWVudDsKKyAgICAgICAgICAgIC8vX3dyaXRlQnVmZmVyLlRyeUdldEJ1ZmZlcihvdXQgYnVmU2VnbWVudCk7CisgICAgICAgICAgICAvL3ZhciBidWYgPSBidWZTZWdtZW50LkFycmF5OworICAgICAgICAgICAgdmFyIGJ1ZiA9IF93cml0ZUJ1ZmZlci5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgIC8vdmFyIGxlbiA9IChpbnQpX3dyaXRlQnVmZmVyLkxlbmd0aDsKKyAgICAgICAgICAgIHZhciBkYXRhTGVuID0gKGludCkgX3dyaXRlQnVmZmVyLkxlbmd0aCAtIEhlYWRlclNpemU7CisgICAgICAgICAgICBpZiAoZGF0YUxlbiA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oKTsgLy8gbG9naWMgZXJyb3IgYWN0dWFsbHkKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSW5qZWN0IG1lc3NhZ2UgaGVhZGVyIGludG8gdGhlIHJlc2VydmVkIGJ1ZmZlciBzcGFjZQorICAgICAgICAgICAgRW5jb2RlRnJhbWVTaXplKGRhdGFMZW4sIGJ1Zik7CisKKyAgICAgICAgICAgIC8vIFNlbmQgdGhlIGVudGlyZSBtZXNzYWdlIGF0IG9uY2UKKyAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuV3JpdGVBc3luYyhidWYsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgSW5pdFdyaXRlQnVmZmVyKCk7CisKKyAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuRmx1c2hBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgSW5pdFdyaXRlQnVmZmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgbWVzc2FnZSBoZWFkZXIgdG8gYmUgcHV0IHJpZ2h0IGJlZm9yZSBzZW5kaW5nIGl0IG91dAorICAgICAgICAgICAgX3dyaXRlQnVmZmVyLlNldExlbmd0aChIZWFkZXJTaXplKTsKKyAgICAgICAgICAgIF93cml0ZUJ1ZmZlci5TZWVrKDAsIFNlZWtPcmlnaW4uRW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRW5jb2RlRnJhbWVTaXplKGludCBmcmFtZVNpemUsIGJ5dGVbXSBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZlswXSA9IChieXRlKSAoMHhmZiAmIChmcmFtZVNpemUgPj4gMjQpKTsKKyAgICAgICAgICAgIGJ1ZlsxXSA9IChieXRlKSAoMHhmZiAmIChmcmFtZVNpemUgPj4gMTYpKTsKKyAgICAgICAgICAgIGJ1ZlsyXSA9IChieXRlKSAoMHhmZiAmIChmcmFtZVNpemUgPj4gOCkpOworICAgICAgICAgICAgYnVmWzNdID0gKGJ5dGUpICgweGZmICYgKGZyYW1lU2l6ZSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IERlY29kZUZyYW1lU2l6ZShieXRlW10gYnVmKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAoKGJ1ZlswXSAmIDB4ZmYpIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgKChidWZbMV0gJiAweGZmKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICgoYnVmWzJdICYgMHhmZikgPDwgOCkgfAorICAgICAgICAgICAgICAgIChidWZbM10gJiAweGZmKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIENoZWNrTm90RGlzcG9zZWQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uKCJURnJhbWVkQ2xpZW50VHJhbnNwb3J0Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfcmVhZEJ1ZmZlcj8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBfd3JpdGVCdWZmZXI/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgX3RyYW5zcG9ydD8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEh0dHBDbGllbnRUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEh0dHBDbGllbnRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk3ZDM4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9USHR0cENsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDIyNiBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5OZXQuSHR0cDsKK3VzaW5nIFN5c3RlbS5OZXQuSHR0cC5IZWFkZXJzOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUSHR0cENsaWVudFRyYW5zcG9ydCA6IFRDbGllbnRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgWDUwOUNlcnRpZmljYXRlW10gX2NlcnRpZmljYXRlczsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBVcmkgX3VyaTsKKworICAgICAgICAvLyBUaW1lb3V0cyBpbiBtaWxsaXNlY29uZHMKKyAgICAgICAgcHJpdmF0ZSBpbnQgX2Nvbm5lY3RUaW1lb3V0ID0gMzAwMDA7CisgICAgICAgIHByaXZhdGUgSHR0cENsaWVudCBfaHR0cENsaWVudDsKKyAgICAgICAgcHJpdmF0ZSBTdHJlYW0gX2lucHV0U3RyZWFtOworCisgICAgICAgIHByaXZhdGUgYm9vbCBfaXNEaXNwb3NlZDsKKyAgICAgICAgcHJpdmF0ZSBNZW1vcnlTdHJlYW0gX291dHB1dFN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKworICAgICAgICBwdWJsaWMgVEh0dHBDbGllbnRUcmFuc3BvcnQoVXJpIHUsIElEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBjdXN0b21IZWFkZXJzKQorICAgICAgICAgICAgOiB0aGlzKHUsIEVudW1lcmFibGUuRW1wdHk8WDUwOUNlcnRpZmljYXRlPigpLCBjdXN0b21IZWFkZXJzKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEh0dHBDbGllbnRUcmFuc3BvcnQoVXJpIHUsIElFbnVtZXJhYmxlPFg1MDlDZXJ0aWZpY2F0ZT4gY2VydGlmaWNhdGVzLAorICAgICAgICAgICAgSURpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IGN1c3RvbUhlYWRlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIF91cmkgPSB1OworICAgICAgICAgICAgX2NlcnRpZmljYXRlcyA9IChjZXJ0aWZpY2F0ZXMgPz8gRW51bWVyYWJsZS5FbXB0eTxYNTA5Q2VydGlmaWNhdGU+KCkpLlRvQXJyYXkoKTsKKyAgICAgICAgICAgIEN1c3RvbUhlYWRlcnMgPSBjdXN0b21IZWFkZXJzOworCisgICAgICAgICAgICAvLyBkdWUgdG8gY3VycmVudCBidWcgd2l0aCBwZXJmb3JtYW5jZSBvZiBEaXNwb3NlIGluIG5ldGNvcmUgaHR0cHM6Ly9naXRodWIuY29tL2RvdG5ldC9jb3JlZngvaXNzdWVzLzg4MDkKKyAgICAgICAgICAgIC8vIHRoaXMgY2FuIGJlIHN3aXRjaGVkIHRvIGRlZmF1bHQgd2F5IChjcmVhdGUgY2xpZW50LT51c2UtPmRpc3Bvc2UgcGVyIGZsdXNoKSBsYXRlcgorICAgICAgICAgICAgX2h0dHBDbGllbnQgPSBDcmVhdGVDbGllbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gQ3VzdG9tSGVhZGVycyB7IGdldDsgfQorCisgICAgICAgIHB1YmxpYyBpbnQgQ29ubmVjdFRpbWVvdXQKKyAgICAgICAgeworICAgICAgICAgICAgc2V0IHsgX2Nvbm5lY3RUaW1lb3V0ID0gdmFsdWU7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiA9PiB0cnVlOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9pbnB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgX2lucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9vdXRwdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfb3V0cHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBfb3V0cHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9odHRwQ2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2h0dHBDbGllbnQuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIF9odHRwQ2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCisgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxpbnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9pbnB1dFN0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiTm8gcmVxdWVzdCBoYXMgYmVlbiBzZW50Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByZXQgPSBhd2FpdCBfaW5wdXRTdHJlYW0uUmVhZEFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuRW5kT2ZGaWxlLCAiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW94KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBpb3guVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBfb3V0cHV0U3RyZWFtLldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBIdHRwQ2xpZW50IENyZWF0ZUNsaWVudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBoYW5kbGVyID0gbmV3IEh0dHBDbGllbnRIYW5kbGVyKCk7CisgICAgICAgICAgICBoYW5kbGVyLkNsaWVudENlcnRpZmljYXRlcy5BZGRSYW5nZShfY2VydGlmaWNhdGVzKTsKKworICAgICAgICAgICAgdmFyIGh0dHBDbGllbnQgPSBuZXcgSHR0cENsaWVudChoYW5kbGVyKTsKKworICAgICAgICAgICAgaWYgKF9jb25uZWN0VGltZW91dCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaHR0cENsaWVudC5UaW1lb3V0ID0gVGltZVNwYW4uRnJvbVNlY29uZHMoX2Nvbm5lY3RUaW1lb3V0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaHR0cENsaWVudC5EZWZhdWx0UmVxdWVzdEhlYWRlcnMuQWNjZXB0LkFkZChuZXcgTWVkaWFUeXBlV2l0aFF1YWxpdHlIZWFkZXJWYWx1ZSgiYXBwbGljYXRpb24veC10aHJpZnQiKSk7CisgICAgICAgICAgICBodHRwQ2xpZW50LkRlZmF1bHRSZXF1ZXN0SGVhZGVycy5Vc2VyQWdlbnQuQWRkKG5ldyBQcm9kdWN0SW5mb0hlYWRlclZhbHVlKCJUSHR0cENsaWVudFRyYW5zcG9ydCIsICIxLjAuMCIpKTsKKworICAgICAgICAgICAgaWYgKEN1c3RvbUhlYWRlcnMgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBDdXN0b21IZWFkZXJzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaHR0cENsaWVudC5EZWZhdWx0UmVxdWVzdEhlYWRlcnMuQWRkKGl0ZW0uS2V5LCBpdGVtLlZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBodHRwQ2xpZW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX291dHB1dFN0cmVhbS5DYW5TZWVrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfb3V0cHV0U3RyZWFtLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1c2luZyAodmFyIG91dFN0cmVhbSA9IG5ldyBTdHJlYW1Db250ZW50KF9vdXRwdXRTdHJlYW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbXNnID0gYXdhaXQgX2h0dHBDbGllbnQuUG9zdEFzeW5jKF91cmksIG91dFN0cmVhbSwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cuRW5zdXJlU3VjY2Vzc1N0YXR1c0NvZGUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9pbnB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2lucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgX2lucHV0U3RyZWFtID0gYXdhaXQgbXNnLkNvbnRlbnQuUmVhZEFzU3RyZWFtQXN5bmMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfaW5wdXRTdHJlYW0uQ2FuU2VlaykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW5wdXRTdHJlYW0uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW94KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sIGlveC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEh0dHBSZXF1ZXN0RXhjZXB0aW9uIHd4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sCisgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgY29ubmVjdCB0byBzZXJ2ZXI6ICIgKyB3eCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9vdXRwdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfaW5wdXRTdHJlYW0/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgX291dHB1dFN0cmVhbT8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBfaHR0cENsaWVudD8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UTWVtb3J5QnVmZmVyQ2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RNZW1vcnlCdWZmZXJDbGllbnRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZhNTVhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UTWVtb3J5QnVmZmVyQ2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsOTcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVE1lbW9yeUJ1ZmZlckNsaWVudFRyYW5zcG9ydCA6IFRDbGllbnRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIF9ieXRlU3RyZWFtOworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisKKyAgICAgICAgcHVibGljIFRNZW1vcnlCdWZmZXJDbGllbnRUcmFuc3BvcnQoKQorICAgICAgICB7CisgICAgICAgICAgICBfYnl0ZVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUTWVtb3J5QnVmZmVyQ2xpZW50VHJhbnNwb3J0KGJ5dGVbXSBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9ieXRlU3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbShidWYpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuID0+IHRydWU7CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICAvKiogZG8gbm90aGluZyAqKi8KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCisgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9ieXRlU3RyZWFtLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfYnl0ZVN0cmVhbS5Xcml0ZUFzeW5jKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX2J5dGVTdHJlYW0uV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBGbHVzaEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJ5dGVbXSBHZXRCdWZmZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2J5dGVTdHJlYW0uVG9BcnJheSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2J5dGVTdHJlYW0/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1ROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWU0YmFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1ROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSw5NSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLklPLlBpcGVzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0IDogVENsaWVudFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBOYW1lZFBpcGVDbGllbnRTdHJlYW0gX2NsaWVudDsKKworICAgICAgICBwdWJsaWMgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydChzdHJpbmcgcGlwZSkgOiB0aGlzKCIuIiwgcGlwZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQoc3RyaW5nIHNlcnZlciwgc3RyaW5nIHBpcGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzZXJ2ZXJOYW1lID0gc3RyaW5nLklzTnVsbE9yV2hpdGVTcGFjZShzZXJ2ZXIpID8gc2VydmVyIDogIi4iOworCisgICAgICAgICAgICBfY2xpZW50ID0gbmV3IE5hbWVkUGlwZUNsaWVudFN0cmVhbShzZXJ2ZXJOYW1lLCBwaXBlLCBQaXBlRGlyZWN0aW9uLkluT3V0LCBQaXBlT3B0aW9ucy5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiA9PiBfY2xpZW50ICE9IG51bGwgJiYgX2NsaWVudC5Jc0Nvbm5lY3RlZDsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgX2NsaWVudC5Db25uZWN0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2NsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jbGllbnQuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIF9jbGllbnQgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2NsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9jbGllbnQuUmVhZEFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfY2xpZW50ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBfY2xpZW50LldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jbGllbnQuRGlzcG9zZSgpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UU29ja2V0Q2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RTb2NrZXRDbGllbnRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc2OWQxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UU29ja2V0Q2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMTM5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLk5ldC5Tb2NrZXRzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0IDogVFN0cmVhbUNsaWVudFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9pc0Rpc3Bvc2VkOworCisgICAgICAgIHB1YmxpYyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KFRjcENsaWVudCBjbGllbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRjcENsaWVudCA9IGNsaWVudCA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihjbGllbnQpKTsKKworICAgICAgICAgICAgaWYgKElzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSA9IGNsaWVudC5HZXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNvY2tldENsaWVudFRyYW5zcG9ydChJUEFkZHJlc3MgaG9zdCwgaW50IHBvcnQpCisgICAgICAgICAgICA6IHRoaXMoaG9zdCwgcG9ydCwgMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTb2NrZXRDbGllbnRUcmFuc3BvcnQoSVBBZGRyZXNzIGhvc3QsIGludCBwb3J0LCBpbnQgdGltZW91dCkKKyAgICAgICAgeworICAgICAgICAgICAgSG9zdCA9IGhvc3Q7CisgICAgICAgICAgICBQb3J0ID0gcG9ydDsKKworICAgICAgICAgICAgVGNwQ2xpZW50ID0gbmV3IFRjcENsaWVudCgpOworICAgICAgICAgICAgVGNwQ2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gVGNwQ2xpZW50LlNlbmRUaW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgICAgIFRjcENsaWVudC5DbGllbnQuTm9EZWxheSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGNwQ2xpZW50IFRjcENsaWVudCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKyAgICAgICAgcHVibGljIElQQWRkcmVzcyBIb3N0IHsgZ2V0OyB9CisgICAgICAgIHB1YmxpYyBpbnQgUG9ydCB7IGdldDsgfQorCisgICAgICAgIHB1YmxpYyBpbnQgVGltZW91dAorICAgICAgICB7CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoVGNwQ2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUY3BDbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSBUY3BDbGllbnQuU2VuZFRpbWVvdXQgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFRjcENsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBUY3BDbGllbnQuQ29ubmVjdGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoUG9ydCA8PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChUY3BDbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiSW52YWxpZCBvciBub3QgaW5pdGlhbGl6ZWQgdGNwIGNsaWVudCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBUY3BDbGllbnQuQ29ubmVjdEFzeW5jKEhvc3QsIFBvcnQpOworCisgICAgICAgICAgICBJbnB1dFN0cmVhbSA9IFRjcENsaWVudC5HZXRTdHJlYW0oKTsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSA9IFRjcENsaWVudC5HZXRTdHJlYW0oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgYmFzZS5DbG9zZSgpOworCisgICAgICAgICAgICBpZiAoVGNwQ2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGNwQ2xpZW50LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBUY3BDbGllbnQgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVGNwQ2xpZW50Py5EaXNwb3NlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgYmFzZS5EaXNwb3NlKGRpc3Bvc2luZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UU3RyZWFtQ2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RTdHJlYW1DbGllbnRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcxNjRmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UU3RyZWFtQ2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMTEwIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRTdHJlYW1DbGllbnRUcmFuc3BvcnQgOiBUQ2xpZW50VHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisKKyAgICAgICAgcHJvdGVjdGVkIFRTdHJlYW1DbGllbnRUcmFuc3BvcnQoKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFN0cmVhbUNsaWVudFRyYW5zcG9ydChTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmVhbSBvdXRwdXRTdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIElucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gPSBvdXRwdXRTdHJlYW07CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgU3RyZWFtIE91dHB1dFN0cmVhbSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgcHJvdGVjdGVkIFN0cmVhbSBJbnB1dFN0cmVhbSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuID0+IHRydWU7CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSW5wdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoT3V0cHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSW5wdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwKKyAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkIGZyb20gbnVsbCBpbnB1dHN0cmVhbSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gYXdhaXQgSW5wdXRTdHJlYW0uUmVhZEFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChPdXRwdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwKKyAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkIGZyb20gbnVsbCBpbnB1dHN0cmVhbSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBPdXRwdXRTdHJlYW0uV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBGbHVzaEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBPdXRwdXRTdHJlYW0uRmx1c2hBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbT8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVFRsc1NvY2tldENsaWVudFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGJlNGVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwyMzcgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uTmV0LlNlY3VyaXR5OwordXNpbmcgU3lzdGVtLk5ldC5Tb2NrZXRzOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkF1dGhlbnRpY2F0aW9uOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQKK3sKKyAgICAvL1RPRE86IGNoZWNrIGZvciBjb3JyZWN0IHdvcmsKKworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQgOiBUU3RyZWFtQ2xpZW50VHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFg1MDlDZXJ0aWZpY2F0ZTIgX2NlcnRpZmljYXRlOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIF9jZXJ0VmFsaWRhdG9yOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElQQWRkcmVzcyBfaG9zdDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sIF9pc1NlcnZlcjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX3BvcnQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU3NsUHJvdG9jb2xzIF9zc2xQcm90b2NvbHM7CisgICAgICAgIHByaXZhdGUgVGNwQ2xpZW50IF9jbGllbnQ7CisgICAgICAgIHByaXZhdGUgU3NsU3RyZWFtIF9zZWN1cmVTdHJlYW07CisgICAgICAgIHByaXZhdGUgaW50IF90aW1lb3V0OworCisgICAgICAgIHB1YmxpYyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0KFRjcENsaWVudCBjbGllbnQsIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUsIGJvb2wgaXNTZXJ2ZXIgPSBmYWxzZSwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRsczEyKQorICAgICAgICB7CisgICAgICAgICAgICBfY2xpZW50ID0gY2xpZW50OworICAgICAgICAgICAgX2NlcnRpZmljYXRlID0gY2VydGlmaWNhdGU7CisgICAgICAgICAgICBfY2VydFZhbGlkYXRvciA9IGNlcnRWYWxpZGF0b3I7CisgICAgICAgICAgICBfbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworICAgICAgICAgICAgX3NzbFByb3RvY29scyA9IHNzbFByb3RvY29sczsKKyAgICAgICAgICAgIF9pc1NlcnZlciA9IGlzU2VydmVyOworCisgICAgICAgICAgICBpZiAoaXNTZXJ2ZXIgJiYgY2VydGlmaWNhdGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIlRUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQgbmVlZHMgY2VydGlmaWNhdGUgdG8gYmUgdXNlZCBmb3Igc2VydmVyIiwKKyAgICAgICAgICAgICAgICAgICAgbmFtZW9mKGNlcnRpZmljYXRlKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQoSVBBZGRyZXNzIGhvc3QsIGludCBwb3J0LCBzdHJpbmcgY2VydGlmaWNhdGVQYXRoLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzMTIpCisgICAgICAgICAgICA6IHRoaXMoaG9zdCwgcG9ydCwgMCwKKyAgICAgICAgICAgICAgICBuZXcgWDUwOUNlcnRpZmljYXRlMihjZXJ0aWZpY2F0ZVBhdGgpLAorICAgICAgICAgICAgICAgIGNlcnRWYWxpZGF0b3IsCisgICAgICAgICAgICAgICAgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrLAorICAgICAgICAgICAgICAgIHNzbFByb3RvY29scykKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQoSVBBZGRyZXNzIGhvc3QsIGludCBwb3J0LAorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlMiBjZXJ0aWZpY2F0ZSA9IG51bGwsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMxMikKKyAgICAgICAgICAgIDogdGhpcyhob3N0LCBwb3J0LCAwLAorICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgIGNlcnRWYWxpZGF0b3IsCisgICAgICAgICAgICAgICAgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrLAorICAgICAgICAgICAgICAgIHNzbFByb3RvY29scykKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQoSVBBZGRyZXNzIGhvc3QsIGludCBwb3J0LCBpbnQgdGltZW91dCwKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMxMikKKyAgICAgICAgeworICAgICAgICAgICAgX2hvc3QgPSBob3N0OworICAgICAgICAgICAgX3BvcnQgPSBwb3J0OworICAgICAgICAgICAgX3RpbWVvdXQgPSB0aW1lb3V0OworICAgICAgICAgICAgX2NlcnRpZmljYXRlID0gY2VydGlmaWNhdGU7CisgICAgICAgICAgICBfY2VydFZhbGlkYXRvciA9IGNlcnRWYWxpZGF0b3I7CisgICAgICAgICAgICBfbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworICAgICAgICAgICAgX3NzbFByb3RvY29scyA9IHNzbFByb3RvY29sczsKKworICAgICAgICAgICAgSW5pdFNvY2tldCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBUaW1lb3V0CisgICAgICAgIHsKKyAgICAgICAgICAgIHNldCB7IF9jbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSBfY2xpZW50LlNlbmRUaW1lb3V0ID0gX3RpbWVvdXQgPSB2YWx1ZTsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRjcENsaWVudCBUY3BDbGllbnQgPT4gX2NsaWVudDsKKworICAgICAgICBwdWJsaWMgSVBBZGRyZXNzIEhvc3QgPT4gX2hvc3Q7CisKKyAgICAgICAgcHVibGljIGludCBQb3J0ID0+IF9wb3J0OworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2NsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBfY2xpZW50LkNvbm5lY3RlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBJbml0U29ja2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgX2NsaWVudCA9IG5ldyBUY3BDbGllbnQoKTsKKyAgICAgICAgICAgIF9jbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSBfY2xpZW50LlNlbmRUaW1lb3V0ID0gX3RpbWVvdXQ7CisgICAgICAgICAgICBfY2xpZW50LkNsaWVudC5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbCBEZWZhdWx0Q2VydGlmaWNhdGVWYWxpZGF0b3Iob2JqZWN0IHNlbmRlciwgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlLCBYNTA5Q2hhaW4gY2hhaW4sCisgICAgICAgICAgICBTc2xQb2xpY3lFcnJvcnMgc3NsVmFsaWRhdGlvbkVycm9ycykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNzbFZhbGlkYXRpb25FcnJvcnMgPT0gU3NsUG9saWN5RXJyb3JzLk5vbmU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfaG9zdCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gbnVsbCBob3N0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfcG9ydCA8PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfY2xpZW50ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5pdFNvY2tldCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX2NsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IF9jbGllbnQuQ29ubmVjdEFzeW5jKF9ob3N0LCBfcG9ydCk7CisgICAgICAgICAgICAgICAgYXdhaXQgU2V0dXBUbHNBc3luYygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgU2V0dXBUbHNBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB2YWxpZGF0b3IgPSBfY2VydFZhbGlkYXRvciA/PyBEZWZhdWx0Q2VydGlmaWNhdGVWYWxpZGF0b3I7CisKKyAgICAgICAgICAgIGlmIChfbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3NlY3VyZVN0cmVhbSA9IG5ldyBTc2xTdHJlYW0oX2NsaWVudC5HZXRTdHJlYW0oKSwgZmFsc2UsIHZhbGlkYXRvciwgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3NlY3VyZVN0cmVhbSA9IG5ldyBTc2xTdHJlYW0oX2NsaWVudC5HZXRTdHJlYW0oKSwgZmFsc2UsIHZhbGlkYXRvcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfaXNTZXJ2ZXIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBTZXJ2ZXIgYXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgYXdhaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIF9zZWN1cmVTdHJlYW0uQXV0aGVudGljYXRlQXNTZXJ2ZXJBc3luYyhfY2VydGlmaWNhdGUsIF9jZXJ0VmFsaWRhdG9yICE9IG51bGwsIF9zc2xQcm90b2NvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIENsaWVudCBhdXRoZW50aWNhdGlvbgorICAgICAgICAgICAgICAgICAgICB2YXIgY2VydHMgPSBfY2VydGlmaWNhdGUgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbiB7X2NlcnRpZmljYXRlfQorICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbigpOworCisgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRIb3N0ID0gX2hvc3QuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgX3NlY3VyZVN0cmVhbS5BdXRoZW50aWNhdGVBc0NsaWVudEFzeW5jKHRhcmdldEhvc3QsIGNlcnRzLCBfc3NsUHJvdG9jb2xzLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENsb3NlKCk7CisgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIElucHV0U3RyZWFtID0gX3NlY3VyZVN0cmVhbTsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSA9IF9zZWN1cmVTdHJlYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2UuQ2xvc2UoKTsKKyAgICAgICAgICAgIGlmIChfY2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NsaWVudC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgX2NsaWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfc2VjdXJlU3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3NlY3VyZVN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgX3NlY3VyZVN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RIdHRwU2VydmVyVHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RIdHRwU2VydmVyVHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMjA2M2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVEh0dHBTZXJ2ZXJUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSw5OCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIE1pY3Jvc29mdC5Bc3BOZXRDb3JlLkh0dHA7Cit1c2luZyBNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudDsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLlNlcnZlcgoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRIdHRwU2VydmVyVHJhbnNwb3J0CisgICAgeworICAgICAgICBwcm90ZWN0ZWQgY29uc3Qgc3RyaW5nIENvbnRlbnRUeXBlID0gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJTG9nZ2VyIF9sb2dnZXI7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgUmVxdWVzdERlbGVnYXRlIF9uZXh0OworICAgICAgICBwcm90ZWN0ZWQgRW5jb2RpbmcgRW5jb2RpbmcgPSBFbmNvZGluZy5VVEY4OworCisgICAgICAgIHByb3RlY3RlZCBJVFByb3RvY29sRmFjdG9yeSBJbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIElUUHJvdG9jb2xGYWN0b3J5IE91dHB1dFByb3RvY29sRmFjdG9yeTsKKworICAgICAgICBwcm90ZWN0ZWQgSVRBc3luY1Byb2Nlc3NvciBQcm9jZXNzb3I7CisKKyAgICAgICAgcHVibGljIFRIdHRwU2VydmVyVHJhbnNwb3J0KElUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yLCBSZXF1ZXN0RGVsZWdhdGUgbmV4dCwgSUxvZ2dlckZhY3RvcnkgbG9nZ2VyRmFjdG9yeSkKKyAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXh0LCBsb2dnZXJGYWN0b3J5KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEh0dHBTZXJ2ZXJUcmFuc3BvcnQoSVRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IsIElUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSwgUmVxdWVzdERlbGVnYXRlIG5leHQsCisgICAgICAgICAgICBJTG9nZ2VyRmFjdG9yeSBsb2dnZXJGYWN0b3J5KQorICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksIG5leHQsIGxvZ2dlckZhY3RvcnkpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUSHR0cFNlcnZlclRyYW5zcG9ydChJVEFzeW5jUHJvY2Vzc29yIHByb2Nlc3NvciwgSVRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICBJVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksIFJlcXVlc3REZWxlZ2F0ZSBuZXh0LCBJTG9nZ2VyRmFjdG9yeSBsb2dnZXJGYWN0b3J5KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobG9nZ2VyRmFjdG9yeSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGxvZ2dlckZhY3RvcnkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUHJvY2Vzc29yID0gcHJvY2Vzc29yID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKHByb2Nlc3NvcikpOworICAgICAgICAgICAgSW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeSA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihpbnB1dFByb3RvY29sRmFjdG9yeSkpOworICAgICAgICAgICAgT3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKG91dHB1dFByb3RvY29sRmFjdG9yeSkpOworCisgICAgICAgICAgICBfbmV4dCA9IG5leHQ7CisgICAgICAgICAgICBfbG9nZ2VyID0gbG9nZ2VyRmFjdG9yeS5DcmVhdGVMb2dnZXI8VEh0dHBTZXJ2ZXJUcmFuc3BvcnQ+KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBJbnZva2UoSHR0cENvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5SZXNwb25zZS5Db250ZW50VHlwZSA9IENvbnRlbnRUeXBlOworICAgICAgICAgICAgYXdhaXQgUHJvY2Vzc1JlcXVlc3RBc3luYyhjb250ZXh0LCBjb250ZXh0LlJlcXVlc3RBYm9ydGVkKTsgLy9UT0RPOiBjaGVjayBmb3IgY29ycmVjdCBsb2dpYworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgUHJvY2Vzc1JlcXVlc3RBc3luYyhIdHRwQ29udGV4dCBjb250ZXh0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUU3RyZWFtQ2xpZW50VHJhbnNwb3J0KGNvbnRleHQuUmVxdWVzdC5Cb2R5LCBjb250ZXh0LlJlc3BvbnNlLkJvZHkpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSBJbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIHZhciBvdXRwdXQgPSBPdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChhd2FpdCBQcm9jZXNzb3IuUHJvY2Vzc0FzeW5jKGlucHV0LCBvdXRwdXQsIGNhbmNlbGxhdGlvblRva2VuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ2xpZW50IGRpZWQsIGp1c3QgbW92ZSBvbgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1ROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg2Nzg2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMTkxIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU8uUGlwZXM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLlNlcnZlcgoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQgOiBUU2VydmVyVHJhbnNwb3J0CisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgVGhpcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgUGlwZSBvbiB0aGUgbG9jYWxob3N0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfcGlwZUFkZHJlc3M7CisKKyAgICAgICAgcHJpdmF0ZSBib29sIF9hc3luY01vZGUgPSB0cnVlOworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2wgX2lzUGVuZGluZyA9IHRydWU7CisKKyAgICAgICAgcHJpdmF0ZSBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0gX3N0cmVhbSA9IG51bGw7CisKKyAgICAgICAgcHVibGljIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQoc3RyaW5nIHBpcGVBZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICBfcGlwZUFkZHJlc3MgPSBwaXBlQWRkcmVzczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIExpc3RlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3N0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBjaGVjayBmb3IgZGlzY29uZWN0aW9uIAorICAgICAgICAgICAgICAgICAgICBfc3RyZWFtLkRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgX3N0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICBfaXNQZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNDbGllbnRQZW5kaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9pc1BlbmRpbmc7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgRW5zdXJlUGlwZUluc3RhbmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9zdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZGlyZWN0aW9uID0gUGlwZURpcmVjdGlvbi5Jbk91dDsKKyAgICAgICAgICAgICAgICB2YXIgbWF4Y29ubiA9IDI1NDsKKyAgICAgICAgICAgICAgICB2YXIgbW9kZSA9IFBpcGVUcmFuc21pc3Npb25Nb2RlLkJ5dGU7CisgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBfYXN5bmNNb2RlID8gUGlwZU9wdGlvbnMuQXN5bmNocm9ub3VzIDogUGlwZU9wdGlvbnMuTm9uZTsKKyAgICAgICAgICAgICAgICB2YXIgaW5idWYgPSA0MDk2OworICAgICAgICAgICAgICAgIHZhciBvdXRidWYgPSA0MDk2OworICAgICAgICAgICAgICAgIC8vIFRPRE86IHNlY3VyaXR5CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zdHJlYW0gPSBuZXcgTmFtZWRQaXBlU2VydmVyU3RyZWFtKF9waXBlQWRkcmVzcywgZGlyZWN0aW9uLCBtYXhjb25uLCBtb2RlLCBvcHRpb25zLCBpbmJ1Ziwgb3V0YnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKSAvLyBNb25vIHN0aWxsIGRvZXMgbm90IHN1cHBvcnQgYXN5bmMsIGZhbGxiYWNrIHRvIHN5bmMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfYXN5bmNNb2RlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zICY9ICh+UGlwZU9wdGlvbnMuQXN5bmNocm9ub3VzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9zdHJlYW0gPSBuZXcgTmFtZWRQaXBlU2VydmVyU3RyZWFtKF9waXBlQWRkcmVzcywgZGlyZWN0aW9uLCBtYXhjb25uLCBtb2RlLCBvcHRpb25zLCBpbmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgX2FzeW5jTW9kZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgVGFzazxUQ2xpZW50VHJhbnNwb3J0PiBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFbnN1cmVQaXBlSW5zdGFuY2UoKTsKKworICAgICAgICAgICAgICAgIGF3YWl0IF9zdHJlYW0uV2FpdEZvckNvbm5lY3Rpb25Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgICAgICB2YXIgdHJhbnMgPSBuZXcgU2VydmVyVHJhbnNwb3J0KF9zdHJlYW0pOworICAgICAgICAgICAgICAgIF9zdHJlYW0gPSBudWxsOyAvLyBwYXNzIG93bmVyc2hpcCB0byBTZXJ2ZXJUcmFuc3BvcnQKKworICAgICAgICAgICAgICAgIC8vX2lzUGVuZGluZyA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbG9zZSgpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCBlLk1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBTZXJ2ZXJUcmFuc3BvcnQgOiBUQ2xpZW50VHJhbnNwb3J0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTmFtZWRQaXBlU2VydmVyU3RyZWFtIF9zdHJlYW07CisKKyAgICAgICAgICAgIHB1YmxpYyBTZXJ2ZXJUcmFuc3BvcnQoTmFtZWRQaXBlU2VydmVyU3RyZWFtIHN0cmVhbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc3RyZWFtID0gc3RyZWFtOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4gPT4gX3N0cmVhbSAhPSBudWxsICYmIF9zdHJlYW0uSXNDb25uZWN0ZWQ7CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3N0cmVhbT8uRGlzcG9zZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfc3RyZWFtID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9zdHJlYW0uUmVhZEFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfc3RyZWFtID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXdhaXQgX3N0cmVhbS5Xcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zdHJlYW0/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVFNlcnZlckZyYW1lZFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UU2VydmVyRnJhbWVkVHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiODZlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVFNlcnZlckZyYW1lZFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDE1MCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50OworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuU2VydmVyCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVFNlcnZlckZyYW1lZFRyYW5zcG9ydCA6IFRTZXJ2ZXJUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9jbGllbnRUaW1lb3V0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfcG9ydDsKKyAgICAgICAgcHJpdmF0ZSBUY3BMaXN0ZW5lciBfc2VydmVyOworCisgICAgICAgIHB1YmxpYyBUU2VydmVyRnJhbWVkVHJhbnNwb3J0KFRjcExpc3RlbmVyIGxpc3RlbmVyKQorICAgICAgICAgICAgOiB0aGlzKGxpc3RlbmVyLCAwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlckZyYW1lZFRyYW5zcG9ydChUY3BMaXN0ZW5lciBsaXN0ZW5lciwgaW50IGNsaWVudFRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zZXJ2ZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgICAgIF9jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyRnJhbWVkVHJhbnNwb3J0KGludCBwb3J0KQorICAgICAgICAgICAgOiB0aGlzKHBvcnQsIDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyRnJhbWVkVHJhbnNwb3J0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCkKKyAgICAgICAgeworICAgICAgICAgICAgX3BvcnQgPSBwb3J0OworICAgICAgICAgICAgX2NsaWVudFRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTWFrZSBzZXJ2ZXIgc29ja2V0CisgICAgICAgICAgICAgICAgX3NlcnZlciA9IG5ldyBUY3BMaXN0ZW5lcihJUEFkZHJlc3MuQW55LCBfcG9ydCk7CisgICAgICAgICAgICAgICAgX3NlcnZlci5TZXJ2ZXIuTm9EZWxheSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBwb3J0ICIgKyBwb3J0ICsgIi4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIExpc3RlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBub3QgdG8gYmxvY2sgb24gYWNjZXB0CisgICAgICAgICAgICBpZiAoX3NlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3NlcnZlci5TdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIHN4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBhY2NlcHQgb24gbGlzdGVuaW5nIHNvY2tldDogIiArIHN4Lk1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzQ2xpZW50UGVuZGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfc2VydmVyLlBlbmRpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBUYXNrPFRDbGllbnRUcmFuc3BvcnQ+IEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VENsaWVudFRyYW5zcG9ydD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX3NlcnZlciA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiTm8gdW5kZXJseWluZyBzZXJ2ZXIgc29ja2V0LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBURnJhbWVkQ2xpZW50VHJhbnNwb3J0IHRTb2NrZXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIHZhciB0Y3BDbGllbnQgPSBhd2FpdCBfc2VydmVyLkFjY2VwdFRjcENsaWVudEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRTb2NrZXRUcmFuc3BvcnQgPSBuZXcgVEZyYW1lZENsaWVudFRyYW5zcG9ydChuZXcgVFNvY2tldENsaWVudFRyYW5zcG9ydCh0Y3BDbGllbnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQgPSBfY2xpZW50VGltZW91dAorICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFNvY2tldFRyYW5zcG9ydDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0U29ja2V0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRTb2NrZXRUcmFuc3BvcnQuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgLy8gIE90aGVyd2lzZSwgY2xlYW4gaXQgdXAgb3Vyc2VsdmVzLgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKElEaXNwb3NhYmxlKSB0Y3BDbGllbnQpLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfc2VydmVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc2VydmVyLlN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJXQVJOSU5HOiBDb3VsZCBub3QgY2xvc2Ugc2VydmVyIHNvY2tldDogIiArIGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX3NlcnZlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVFNlcnZlclNvY2tldFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTlkOGExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwxNzQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudDsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLlNlcnZlcgoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQgOiBUU2VydmVyVHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfY2xpZW50VGltZW91dDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX3BvcnQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBfdXNlQnVmZmVyZWRTb2NrZXRzOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgX3VzZUZyYW1lZFRyYW5zcG9ydDsKKyAgICAgICAgcHJpdmF0ZSBUY3BMaXN0ZW5lciBfc2VydmVyOworCisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KFRjcExpc3RlbmVyIGxpc3RlbmVyKQorICAgICAgICAgICAgOiB0aGlzKGxpc3RlbmVyLCAwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldFRyYW5zcG9ydChUY3BMaXN0ZW5lciBsaXN0ZW5lciwgaW50IGNsaWVudFRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zZXJ2ZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgICAgIF9jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KGludCBwb3J0KQorICAgICAgICAgICAgOiB0aGlzKHBvcnQsIDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCkKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCBjbGllbnRUaW1lb3V0LCBmYWxzZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoaW50IHBvcnQsIGludCBjbGllbnRUaW1lb3V0LCBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cyk6CisgICAgICAgICAgICB0aGlzKHBvcnQsIGNsaWVudFRpbWVvdXQsIHVzZUJ1ZmZlcmVkU29ja2V0cywgZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoaW50IHBvcnQsIGludCBjbGllbnRUaW1lb3V0LCBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cywgYm9vbCB1c2VGcmFtZWRUcmFuc3BvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIF9jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKKyAgICAgICAgICAgIF91c2VCdWZmZXJlZFNvY2tldHMgPSB1c2VCdWZmZXJlZFNvY2tldHM7CisgICAgICAgICAgICBfdXNlRnJhbWVkVHJhbnNwb3J0ID0gdXNlRnJhbWVkVHJhbnNwb3J0OworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTWFrZSBzZXJ2ZXIgc29ja2V0CisgICAgICAgICAgICAgICAgX3NlcnZlciA9IG5ldyBUY3BMaXN0ZW5lcihJUEFkZHJlc3MuQW55LCBfcG9ydCk7CisgICAgICAgICAgICAgICAgX3NlcnZlci5TZXJ2ZXIuTm9EZWxheSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBwb3J0ICIgKyBwb3J0ICsgIi4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIExpc3RlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBub3QgdG8gYmxvY2sgb24gYWNjZXB0CisgICAgICAgICAgICBpZiAoX3NlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3NlcnZlci5TdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIHN4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBhY2NlcHQgb24gbGlzdGVuaW5nIHNvY2tldDogIiArIHN4Lk1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzQ2xpZW50UGVuZGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfc2VydmVyLlBlbmRpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBUYXNrPFRDbGllbnRUcmFuc3BvcnQ+IEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VENsaWVudFRyYW5zcG9ydD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX3NlcnZlciA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiTm8gdW5kZXJseWluZyBzZXJ2ZXIgc29ja2V0LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUQ2xpZW50VHJhbnNwb3J0IHRTb2NrZXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIHZhciB0Y3BDbGllbnQgPSBhd2FpdCBfc2VydmVyLkFjY2VwdFRjcENsaWVudEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRTb2NrZXRUcmFuc3BvcnQgPSBuZXcgVFNvY2tldENsaWVudFRyYW5zcG9ydCh0Y3BDbGllbnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQgPSBfY2xpZW50VGltZW91dAorICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgIGlmIChfdXNlQnVmZmVyZWRTb2NrZXRzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0U29ja2V0VHJhbnNwb3J0ID0gbmV3IFRCdWZmZXJlZENsaWVudFRyYW5zcG9ydCh0U29ja2V0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChfdXNlRnJhbWVkVHJhbnNwb3J0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0U29ja2V0VHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRDbGllbnRUcmFuc3BvcnQodFNvY2tldFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFNvY2tldFRyYW5zcG9ydDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0U29ja2V0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRTb2NrZXRUcmFuc3BvcnQuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgLy8gIE90aGVyd2lzZSwgY2xlYW4gaXQgdXAgb3Vyc2VsdmVzLgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKElEaXNwb3NhYmxlKSB0Y3BDbGllbnQpLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfc2VydmVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc2VydmVyLlN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJXQVJOSU5HOiBDb3VsZCBub3QgY2xvc2Ugc2VydmVyIHNvY2tldDogIiArIGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX3NlcnZlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RUbHNTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTlmZWVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RUbHNTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwxNzcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uTmV0LlNlY3VyaXR5OwordXNpbmcgU3lzdGVtLk5ldC5Tb2NrZXRzOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkF1dGhlbnRpY2F0aW9uOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXIKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBfY2xpZW50Q2VydFZhbGlkYXRvcjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX2NsaWVudFRpbWVvdXQgPSAwOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBfbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfcG9ydDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBYNTA5Q2VydGlmaWNhdGUyIF9zZXJ2ZXJDZXJ0aWZpY2F0ZTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBTc2xQcm90b2NvbHMgX3NzbFByb3RvY29sczsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sIF91c2VCdWZmZXJlZFNvY2tldHM7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBfdXNlRnJhbWVkVHJhbnNwb3J0OworICAgICAgICBwcml2YXRlIFRjcExpc3RlbmVyIF9zZXJ2ZXI7CisKKyAgICAgICAgcHVibGljIFRUbHNTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoaW50IHBvcnQsIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUpCisgICAgICAgICAgICA6IHRoaXMocG9ydCwgZmFsc2UsIGNlcnRpZmljYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydCgKKyAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2xpZW50Q2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzMTIpIAorICAgICAgICAgICAgOiB0aGlzKHBvcnQsIHVzZUJ1ZmZlcmVkU29ja2V0cywgZmFsc2UsIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgIGNsaWVudENlcnRWYWxpZGF0b3IsIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaywgc3NsUHJvdG9jb2xzKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBUVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0KAorICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cywKKyAgICAgICAgICAgIGJvb2wgdXNlRnJhbWVkVHJhbnNwb3J0LAorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlMiBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNsaWVudENlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRsczEyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWNlcnRpZmljYXRlLkhhc1ByaXZhdGVLZXkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sCisgICAgICAgICAgICAgICAgICAgICJZb3VyIHNlcnZlci1jZXJ0aWZpY2F0ZSBuZWVkcyB0byBoYXZlIGEgcHJpdmF0ZSBrZXkiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX3BvcnQgPSBwb3J0OworICAgICAgICAgICAgX3NlcnZlckNlcnRpZmljYXRlID0gY2VydGlmaWNhdGU7CisgICAgICAgICAgICBfdXNlQnVmZmVyZWRTb2NrZXRzID0gdXNlQnVmZmVyZWRTb2NrZXRzOworICAgICAgICAgICAgX3VzZUZyYW1lZFRyYW5zcG9ydCA9IHVzZUZyYW1lZFRyYW5zcG9ydDsKKyAgICAgICAgICAgIF9jbGllbnRDZXJ0VmFsaWRhdG9yID0gY2xpZW50Q2VydFZhbGlkYXRvcjsKKyAgICAgICAgICAgIF9sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2s7CisgICAgICAgICAgICBfc3NsUHJvdG9jb2xzID0gc3NsUHJvdG9jb2xzOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgc2VydmVyIHNvY2tldAorICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBuZXcgVGNwTGlzdGVuZXIoSVBBZGRyZXNzLkFueSwgX3BvcnQpOworICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU2VydmVyLk5vRGVsYXkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkIkNvdWxkIG5vdCBjcmVhdGUgU2VydmVyU29ja2V0IG9uIHBvcnQge3BvcnR9LiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgTGlzdGVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGFjY2VwdCBpcyBub3QgYmxvY2tpbmcKKyAgICAgICAgICAgIGlmIChfc2VydmVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc2VydmVyLlN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChTb2NrZXRFeGNlcHRpb24gc3gpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkIkNvdWxkIG5vdCBhY2NlcHQgb24gbGlzdGVuaW5nIHNvY2tldDoge3N4Lk1lc3NhZ2V9Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNDbGllbnRQZW5kaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9zZXJ2ZXIuUGVuZGluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIFRhc2s8VENsaWVudFRyYW5zcG9ydD4gQWNjZXB0SW1wbGVtZW50YXRpb25Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUQ2xpZW50VHJhbnNwb3J0PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfc2VydmVyID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJObyB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjbGllbnQgPSBhd2FpdCBfc2VydmVyLkFjY2VwdFRjcENsaWVudEFzeW5jKCk7CisgICAgICAgICAgICAgICAgY2xpZW50LlNlbmRUaW1lb3V0ID0gY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gX2NsaWVudFRpbWVvdXQ7CisKKyAgICAgICAgICAgICAgICAvL3dyYXAgdGhlIGNsaWVudCBpbiBhbiBTU0wgU29ja2V0IHBhc3NpbmcgaW4gdGhlIFNTTCBjZXJ0CisgICAgICAgICAgICAgICAgdmFyIHRUbHNTb2NrZXQgPSBuZXcgVFRsc1NvY2tldENsaWVudFRyYW5zcG9ydChjbGllbnQsIF9zZXJ2ZXJDZXJ0aWZpY2F0ZSwgdHJ1ZSwgX2NsaWVudENlcnRWYWxpZGF0b3IsCisgICAgICAgICAgICAgICAgICAgIF9sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2ssIF9zc2xQcm90b2NvbHMpOworCisgICAgICAgICAgICAgICAgYXdhaXQgdFRsc1NvY2tldC5TZXR1cFRsc0FzeW5jKCk7CisKKyAgICAgICAgICAgICAgICBUQ2xpZW50VHJhbnNwb3J0IHRyYW5zID0gdFRsc1NvY2tldDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoX3VzZUJ1ZmZlcmVkU29ja2V0cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRCdWZmZXJlZENsaWVudFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKF91c2VGcmFtZWRUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBURnJhbWVkQ2xpZW50VHJhbnNwb3J0KHRyYW5zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU3RvcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJCJXQVJOSU5HOiBDb3VsZCBub3QgY2xvc2Ugc2VydmVyIHNvY2tldDoge2V4fSIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RDbGllbnRUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZDk2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UQ2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMTc5IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzCit7CisgICAgLy9UT0RPOiB0aGluayBhYm91dCBjbGllbnQgaW5mbyAKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUQ2xpZW50VHJhbnNwb3J0IDogSURpc3Bvc2FibGUKKyAgICB7CisgICAgICAgIC8vVE9ETzogdGhpbmsgaG93IHRvIGF2b2lkIHBlZWsgYnl0ZQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJ5dGVbXSBfcGVla0J1ZmZlciA9IG5ldyBieXRlWzFdOworICAgICAgICBwcml2YXRlIGJvb2wgX2hhc1BlZWtCeXRlOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbCBJc09wZW4geyBnZXQ7IH0KKworICAgICAgICBwdWJsaWMgdm9pZCBEaXNwb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgRGlzcG9zZSh0cnVlKTsKKyAgICAgICAgICAgIEdDLlN1cHByZXNzRmluYWxpemUodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxib29sPiBQZWVrQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vSWYgd2UgYWxyZWFkeSBoYXZlIGEgYnl0ZSByZWFkIGJ1dCBub3QgY29uc3VtZWQsIGRvIG5vdGhpbmcuCisgICAgICAgICAgICBpZiAoX2hhc1BlZWtCeXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0lmIHRyYW5zcG9ydCBjbG9zZWQgd2UgY2FuJ3QgcGVlay4KKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9UcnkgdG8gcmVhZCBvbmUgYnl0ZS4gSWYgc3VjY2VlZHMgd2Ugd2lsbCBuZWVkIHRvIHN0b3JlIGl0IGZvciB0aGUgbmV4dCByZWFkLgorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGJ5dGVzID0gYXdhaXQgUmVhZEFzeW5jKF9wZWVrQnVmZmVyLCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2hhc1BlZWtCeXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBPcGVuQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIENsb3NlKCk7CisKKyAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIFZhbGlkYXRlQnVmZmVyQXJncyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YoYnVmZmVyKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24obmFtZW9mKG9mZnNldCksICJCdWZmZXIgb2Zmc2V0IGlzIHNtYWxsZXIgdGhhbiB6ZXJvLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGVuZ3RoIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKG5hbWVvZihsZW5ndGgpLCAiQnVmZmVyIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gemVyby4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG9mZnNldCArIGxlbmd0aCA+IGJ1ZmZlci5MZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbihuYW1lb2YoYnVmZmVyKSwgIk5vdCBlbm91Z2ggZGF0YS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8aW50PiBSZWFkQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPGludD4gUmVhZEFsbEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQWxsQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPGludD4gUmVhZEFsbEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCisgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworCisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGludD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgcmV0cmlldmVkID0gMDsKKworICAgICAgICAgICAgLy9JZiB3ZSBwcmV2aW91c2x5IHBlZWtlZCBhIGJ5dGUsIHdlIG5lZWQgdG8gdXNlIHRoYXQgZmlyc3QuCisgICAgICAgICAgICBpZiAoX2hhc1BlZWtCeXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQgKyByZXRyaWV2ZWQrK10gPSBfcGVla0J1ZmZlclswXTsKKyAgICAgICAgICAgICAgICBfaGFzUGVla0J5dGUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hpbGUgKHJldHJpZXZlZCA8IGxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8aW50PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIHJldHVybmVkQ291bnQgPSBhd2FpdCBSZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQgKyByZXRyaWV2ZWQsIGxlbmd0aCAtIHJldHJpZXZlZCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGlmIChyZXR1cm5lZENvdW50IDw9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuRW5kT2ZGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkLCBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHJpZXZlZCArPSByZXR1cm5lZENvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldHJpZXZlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUFzeW5jKGJ1ZmZlciwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQXN5bmMoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBGbHVzaEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIEZsdXNoQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UU2VydmVyVHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVFNlcnZlclRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDQ1YTU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVFNlcnZlclRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDU0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgTGlzdGVuKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIENsb3NlKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sIElzQ2xpZW50UGVuZGluZygpOworCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIGFzeW5jIFRhc2s8VENsaWVudFRyYW5zcG9ydD4gQWNjZXB0SW1wbGVtZW50YXRpb25Bc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFRhc2s8VENsaWVudFRyYW5zcG9ydD4gQWNjZXB0SW1wbGVtZW50YXRpb25Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8VENsaWVudFRyYW5zcG9ydD4gQWNjZXB0QXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgQWNjZXB0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxUQ2xpZW50VHJhbnNwb3J0PiBBY2NlcHRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRyYW5zcG9ydCA9IGF3YWl0IEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICBpZiAodHJhbnNwb3J0ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJCJ7bmFtZW9mKEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMpfSBzaG91bGQgbm90IHJldHVybiBudWxsIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQ7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RUcmFuc3BvcnRFeGNlcHRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdjNDJlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RUcmFuc3BvcnRFeGNlcHRpb24uY3MKQEAgLTAsMCArMSw1OCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBlbnVtIEV4Y2VwdGlvblR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgVW5rbm93biwKKyAgICAgICAgICAgIE5vdE9wZW4sCisgICAgICAgICAgICBBbHJlYWR5T3BlbiwKKyAgICAgICAgICAgIFRpbWVkT3V0LAorICAgICAgICAgICAgRW5kT2ZGaWxlLAorICAgICAgICAgICAgSW50ZXJydXB0ZWQKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBFeGNlcHRpb25UeXBlIEV4VHlwZTsKKworICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgZXhUeXBlKQorICAgICAgICAgICAgOiB0aGlzKCkKKyAgICAgICAgeworICAgICAgICAgICAgRXhUeXBlID0gZXhUeXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oRXhjZXB0aW9uVHlwZSBleFR5cGUsIHN0cmluZyBtZXNzYWdlKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4VHlwZSA9IGV4VHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFeGNlcHRpb25UeXBlIFR5cGUgPT4gRXhUeXBlOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UVHJhbnNwb3J0RmFjdG9yeS5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RUcmFuc3BvcnRGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YzNjYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UVHJhbnNwb3J0RmFjdG9yeS5jcwpAQCAtMCwwICsxLDM1IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICAgICBGcm9tIE1hcmsgU2xlZSAmIEFkaXR5YSBBZ2Fyd2FsIG9mIEZhY2Vib29rOgorICAgIC8vLyAgICAgRmFjdG9yeSBjbGFzcyB1c2VkIHRvIGNyZWF0ZSB3cmFwcGVkIGluc3RhbmNlIG9mIFRyYW5zcG9ydHMuCisgICAgLy8vICAgICBUaGlzIGlzIHVzZWQgcHJpbWFyaWx5IGluIHNlcnZlcnMsIHdoaWNoIGdldCBUcmFuc3BvcnRzIGZyb20KKyAgICAvLy8gICAgIGEgU2VydmVyVHJhbnNwb3J0IGFuZCB0aGVuIG1heSB3YW50IHRvIG11dGF0ZSB0aGVtIChpLmUuIGNyZWF0ZQorICAgIC8vLyAgICAgYSBCdWZmZXJlZFRyYW5zcG9ydCBmcm9tIHRoZSB1bmRlcmx5aW5nIGJhc2UgdHJhbnNwb3J0KQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVFRyYW5zcG9ydEZhY3RvcnkKKyAgICB7CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIFRDbGllbnRUcmFuc3BvcnQgR2V0VHJhbnNwb3J0KFRDbGllbnRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9idWlsZC5jbWQgYi9saWIvbmV0Y29yZS9idWlsZC5jbWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzYzRiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL2J1aWxkLmNtZApAQCAtMCwwICsxLDI3IEBACitAZWNobyBvZmYKK3JlbSAvKgorcmVtICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK3JlbSAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorcmVtICAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZW0gICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCityZW0gICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorcmVtICAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3JlbSAgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK3JlbSAgKgorcmVtICAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCityZW0gICoKK3JlbSAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCityZW0gICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KK3JlbSAgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK3JlbSAgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorcmVtICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3JlbSAgKiB1bmRlciB0aGUgTGljZW5zZS4KK3JlbSAgKi8KKworc2V0bG9jYWwKKwordGhyaWZ0IC12ZXJzaW9uCitkb3RuZXQgLS1pbmZvCitkb3RuZXQgYnVpbGQgCisKKzplb2YKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL2J1aWxkLnNoIGIvbGliL25ldGNvcmUvYnVpbGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUxOGJjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL2J1aWxkLnNoCkBAIC0wLDAgKzEsMzIgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyNleGl0IGlmIGFueSBjb21tYW5kIGZhaWxzCisjc2V0IC1lCisKK3RocmlmdCAtLXZlcnNpb24KK2RvdG5ldCAtLWluZm8KK2RvdG5ldCBidWlsZCAKKworI3JldmlzaW9uPSR7VFJBVklTX0pPQl9JRDo9MX0gIAorI3JldmlzaW9uPSQocHJpbnRmICIlMDRkIiAkcmV2aXNpb24pIAorCisjZG90bmV0IHBhY2sgLi9zcmMvUFJPSkVDVF9OQU1FIC1jIFJlbGVhc2UgLW8gLi9hcnRpZmFjdHMgLS12ZXJzaW9uLXN1ZmZpeD0kcmV2aXNpb24gIApkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvcnVudGVzdHMuY21kIGIvbGliL25ldGNvcmUvcnVudGVzdHMuY21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMTRiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9ydW50ZXN0cy5jbWQKQEAgLTAsMCArMSwyOCBAQAorQGVjaG8gb2ZmCityZW0gLyoKK3JlbSAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCityZW0gICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK3JlbSAgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVtICAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorcmVtICAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKK3JlbSAgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCityZW0gICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CityZW0gICoKK3JlbSAgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorcmVtICAqCityZW0gICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorcmVtICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCityZW0gICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCityZW0gICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3JlbSAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCityZW0gICogdW5kZXIgdGhlIExpY2Vuc2UuCityZW0gICovCitzZXRsb2NhbAorCit0aHJpZnQgLXZlcnNpb24KK2RvdG5ldCAtLWluZm8KKworZG90bmV0IHRlc3QgVGVzdHNcVGhyaWZ0LkludGVncmF0aW9uVGVzdHNcVGhyaWZ0LkludGVncmF0aW9uVGVzdHMuY3Nwcm9qCitkb3RuZXQgdGVzdCBUZXN0c1xUaHJpZnQuVGVzdHNcVGhyaWZ0LlRlc3RzLmNzcHJvagorCis6ZW9mCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9ydW50ZXN0cy5zaCBiL2xpYi9uZXRjb3JlL3J1bnRlc3RzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNmNjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9ydW50ZXN0cy5zaApAQCAtMCwwICsxLDI2IEBACisjIS91c3IvYmluL2VudiBiYXNoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit0aHJpZnQgLXZlcnNpb24KK2RvdG5ldCAtLWluZm8KKworZG90bmV0IHRlc3QgVGVzdHNcVGhyaWZ0LkludGVncmF0aW9uVGVzdHNcVGhyaWZ0LkludGVncmF0aW9uVGVzdHMuY3Nwcm9qCitkb3RuZXQgdGVzdCBUZXN0c1xUaHJpZnQuVGVzdHNcVGhyaWZ0LlRlc3RzLmNzcHJvagpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvTWFrZWZpbGUuYW0gYi9saWIvbm9kZWpzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY4ZWEzZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDMgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFdlIGNhbGwgbnBtIHR3aWNlIHRvIHdvcmsgYXJvdW5kIG5wbSBpc3N1ZXMKKworc3R1YnM6ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBqczpub2RlIC1vIHRlc3QvICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCitkZXBzOiAkKHRvcF9zcmNkaXIpL3BhY2thZ2UuanNvbgorCSQoTlBNKSBpbnN0YWxsICQodG9wX3NyY2RpcikvIHx8ICQoTlBNKSBpbnN0YWxsICQodG9wX3NyY2RpcikvCisKK2FsbC1sb2NhbDogZGVwcworCitwcmVjcm9zczogZGVwcyBzdHVicworCisjIFRPRE86IExpbnQgbm9kZWpzIGxpYiBhbmQgZ2VuLWNvZGUgYXMgcGFydCBvZiBidWlsZAorY2hlY2s6IGRlcHMKKwljZCAkKHRvcF9zcmNkaXIpICYmICQoTlBNKSB0ZXN0ICYmICQoTlBNKSBydW4gbGludC10ZXN0cyAmJiBjZCBsaWIvbm9kZWpzCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIHRlc3QvZ2VuLW5vZGVqcworCSQoUk0pIC1yICQodG9wX3NyY2Rpcikvbm9kZV9tb2R1bGVzCisKK0VYVFJBX0RJU1QgPSBcCisJZXhhbXBsZXMgXAorCWxpYiBcCisJdGVzdCBcCisJY29kaW5nX3N0YW5kYXJkcy5tZCBcCisJUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL1JFQURNRS5tZCBiL2xpYi9ub2RlanMvUkVBRE1FLm1kCmluZGV4IDI4MzJjMWIuLjUwYWNmYmQgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvUkVBRE1FLm1kCisrKyBiL2xpYi9ub2RlanMvUkVBRE1FLm1kCkBAIC0xLDI1ICsxLDI4IEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KK1RocmlmdCBOb2RlLmpzIExpYnJhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT0KIAorTGljZW5zZQorLS0tLS0tLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi1OT1RFOiB5b3UgbXVzdCB1c2UgdGhlIGZyYW1lZCB0aHJpZnQgdHJhbnNwb3J0LCBURnJhbWVkVHJhbnNwb3J0IGluIG1vc3QKLWltcGxlbWVudGF0aW9ucywgb24gdGhlIHNlcnZlciBzaWRlLiBVc2luZyBhIHBvcHVsYXIgZXhhbXBsZSwgdGhpcyBpcyBlbmFibGVkCi1ieSBkZWZhdWx0IGluIENhc3NhbmRyYSAwLjcgKGJ1dCBjb25maWd1cmF0aW9uIG11c3QgYmUgY2hhbmdlZCBpbiBDYXNzYW5kcmEKLTAuNi54IGFuZCBlYXJsaWVyKS4KKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworIyMgQ29tcGF0aWJpbGl0eQorCitub2RlIHZlcnNpb24gNiBvciBsYXRlciBpcyByZXF1aXJlZAogCiAjIyBJbnN0YWxsCiAKQEAgLTI3LDcgKzMwLDcgQEAKIAogIyMgVGhyaWZ0IENvbXBpbGVyCiAKLVlvdSBjYW4gY29tcGlsZSBub2RlanMgc291cmNlcyBieSBydW5uaW5nIHRoZSBmb2xsb3dpbmc6CitZb3UgY2FuIGNvbXBpbGUgSURMIHNvdXJjZXMgZm9yIE5vZGUuanMgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CiAKICAgICB0aHJpZnQgLS1nZW4ganM6bm9kZSB0aHJpZnRfZmlsZQogCkBAIC0zNSwyNiArMzgsMzMgQEAKIAogSGVyZSBpcyBhIENhc3NhbmRyYSBleGFtcGxlOgogCi0gICAgdmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpLAotICAgICAgICBDYXNzYW5kcmEgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvQ2Fzc2FuZHJhJykKLSAgICAgICAgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL2Nhc3NhbmRyYV90eXBlcycpOworYGBganMKK3ZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKSwKKyAgICBDYXNzYW5kcmEgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvQ2Fzc2FuZHJhJykKKyAgICB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvY2Fzc2FuZHJhX3R5cGVzJyk7CiAKLSAgICB2YXIgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVDb25uZWN0aW9uKCJsb2NhbGhvc3QiLCA5MTYwKSwKLSAgICAgICAgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUNsaWVudChDYXNzYW5kcmEsIGNvbm5lY3Rpb24pOwordmFyIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlQ29ubmVjdGlvbigibG9jYWxob3N0IiwgOTE2MCksCisgICAgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUNsaWVudChDYXNzYW5kcmEsIGNvbm5lY3Rpb24pOwogCi0gICAgY29ubmVjdGlvbi5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsKLSAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTsKLSAgICB9KTsKK2Nvbm5lY3Rpb24ub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7CisgIGNvbnNvbGUuZXJyb3IoZXJyKTsKK30pOwogCi0gICAgY2xpZW50LmdldF9zbGljZSgiS2V5c3BhY2UiLCAia2V5IiwgbmV3IHR0eXBlcy5Db2x1bW5QYXJlbnQoe2NvbHVtbl9mYW1pbHk6ICJFeGFtcGxlQ0YifSksIG5ldyB0dHlwZXMuU2xpY2VQcmVkaWNhdGUoe3NsaWNlX3JhbmdlOiBuZXcgdHR5cGVzLlNsaWNlUmFuZ2Uoe3N0YXJ0OiAnJywgZmluaXNoOiAnJ30pfSksIHR0eXBlcy5Db25zaXN0ZW5jeUxldmVsLk9ORSwgZnVuY3Rpb24oZXJyLCBkYXRhKSB7Ci0gICAgICBpZiAoZXJyKSB7Ci0gICAgICAgIC8vIGhhbmRsZSBlcnIKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGRhdGEgPT0gW3R0eXBlcy5Db2x1bW5PclN1cGVyQ29sdW1uLCAuLi5dCi0gICAgICB9Ci0gICAgICBjb25uZWN0aW9uLmVuZCgpOwotICAgIH0pOworY2xpZW50LmdldF9zbGljZSgiS2V5c3BhY2UiLCAia2V5IiwgbmV3IHR0eXBlcy5Db2x1bW5QYXJlbnQoe2NvbHVtbl9mYW1pbHk6ICJFeGFtcGxlQ0YifSksIG5ldyB0dHlwZXMuU2xpY2VQcmVkaWNhdGUoe3NsaWNlX3JhbmdlOiBuZXcgdHR5cGVzLlNsaWNlUmFuZ2Uoe3N0YXJ0OiAnJywgZmluaXNoOiAnJ30pfSksIHR0eXBlcy5Db25zaXN0ZW5jeUxldmVsLk9ORSwgZnVuY3Rpb24oZXJyLCBkYXRhKSB7CisgIGlmIChlcnIpIHsKKyAgICAvLyBoYW5kbGUgZXJyCisgIH0gZWxzZSB7CisgICAgLy8gZGF0YSA9PSBbdHR5cGVzLkNvbHVtbk9yU3VwZXJDb2x1bW4sIC4uLl0KKyAgfQorICBjb25uZWN0aW9uLmVuZCgpOworfSk7CitgYGAKIAotIyMgQ3VzdG9tIGNsaWVudCBhbmQgc2VydmVyIGV4YW1wbGUKKzxhIG5hbWU9ImludDY0Ij48L2E+CisjIyBJbnQ2NAogCi1BbiBleGFtcGxlIGJhc2VkIG9uIHRoZSBvbmUgc2hvd24gb24gdGhlIFRocmlmdCBmcm9udCBwYWdlIGlzIGluY2x1ZGVkIGluIHRoZSBleGFtcGxlcy8gZm9sZGVyLgorU2luY2UgSmF2YVNjcmlwdCByZXByZXNlbnRzIGFsbCBudW1iZXJzIGFzIGRvdWJsZXMsIGludDY0IHZhbHVlcyBjYW5ub3QgYmUgYWNjdXJhdGVseSByZXByZXNlbnRlZCBuYXR1cmFsbHkuIFRvIHNvbHZlIHRoaXMsIGludDY0IHZhbHVlcyBpbiByZXNwb25zZXMgd2lsbCBiZSB3cmFwcGVkIHdpdGggVGhyaWZ0LkludDY0IG9iamVjdHMuIFRoZSBJbnQ2NCBpbXBsZW1lbnRhdGlvbiB1c2VkIGlzIFticm9vZmEvbm9kZS1pbnQ2NF0oaHR0cHM6Ly9naXRodWIuY29tL2Jyb29mYS9ub2RlLWludDY0KS4KKworIyMgQ2xpZW50IGFuZCBzZXJ2ZXIgZXhhbXBsZXMKKworU2V2ZXJhbCBleGFtcGxlIGNsaWVudHMgYW5kIHNlcnZlcnMgYXJlIGluY2x1ZGVkIGluIHRoZSB0aHJpZnQvbGliL25vZGVqcy9leGFtcGxlcyBmb2xkZXIgYW5kIHRoZSBjcm9zcyBsYW5ndWFnZSB0dXRvcmlhbCB0aHJpZnQvdHV0b3JpYWwvbm9kZWpzIGZvbGRlci4KZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9ub2RlanMvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9NYWtlZmlsZSBiL2xpYi9ub2RlanMvZXhhbXBsZXMvTWFrZWZpbGUKaW5kZXggMTkzMDI3OS4uODcxNTdkYiAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9leGFtcGxlcy9NYWtlZmlsZQorKysgYi9saWIvbm9kZWpzL2V4YW1wbGVzL01ha2VmaWxlCkBAIC0xNCw1ICsxNCwxMSBAQAogIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgotQUxMOgkKK2FsbDoJCiAJLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBqczpub2RlIHVzZXIudGhyaWZ0CisKK3NlcnZlcjogYWxsCQorCU5PREVfUEFUSD0uLi9saWI6Li4vbGliL3RocmlmdDokKE5PREVfUEFUSCkgbm9kZSBzZXJ2ZXIuanMKKworY2xpZW50OiBhbGwJCisJTk9ERV9QQVRIPS4uL2xpYjouLi9saWIvdGhyaWZ0OiQoTk9ERV9QQVRIKSBub2RlIGNsaWVudC5qcwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9SRUFETUUubWQgYi9saWIvbm9kZWpzL2V4YW1wbGVzL1JFQURNRS5tZAppbmRleCBhODc1ODFmLi43MzUwYzEwIDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2V4YW1wbGVzL1JFQURNRS5tZAorKysgYi9saWIvbm9kZWpzL2V4YW1wbGVzL1JFQURNRS5tZApAQCAtMSwyOSArMSw0MCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jIFJ1bm5pbmcgdGhlIHVzZXIgZXhhbXBsZQorIyBUaHJpZnQgTm9kZS5qcyBFeGFtcGxlcwogCi0jR2VuZXJhdGUgdGhlIGJpbmRpbmdzOgotLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBqczpub2RlIHVzZXIudGhyaWZ0CisjIyBMaWNlbnNlCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSNUbyBydW4gdGhlIHVzZXIgZXhhbXBsZSwgZmlyc3Qgc3RhcnQgdXAgdGhlIHNlcnZlciBpbiBvbmUgdGVybWluYWw6Ci1OT0RFX1BBVEg9Li4vbGliOi4uL2xpYi90aHJpZnQgbm9kZSBzZXJ2ZXIuanMKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKLSNOb3cgcnVuIHRoZSBjbGllbnQ6Ci1OT0RFX1BBVEg9Li4vbGliOi4uL2xpYi90aHJpZnQgbm9kZSBjbGllbnQuanMKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KIAorIyMgUnVubmluZyB0aGUgdXNlciBleGFtcGxlCiAKLSAgICAKK0dlbmVyYXRlIHRoZSBiaW5kaW5nczoKKworICAgIC4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4ganM6bm9kZSB1c2VyLnRocmlmdAorICAgIC4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4ganM6bm9kZSAtLWdlbiBweSBoZWxsby50aHJpZnQKKworVG8gcnVuIHRoZSB1c2VyIGV4YW1wbGUsIGZpcnN0IHN0YXJ0IHVwIHRoZSBzZXJ2ZXIgaW4gb25lIHRlcm1pbmFsOgorCisgICAgTk9ERV9QQVRIPS4uL2xpYjouLi9saWIvdGhyaWZ0IG5vZGUgc2VydmVyLmpzCisKK05vdyBydW4gdGhlIGNsaWVudDoKKworICAgIE5PREVfUEFUSD0uLi9saWI6Li4vbGliL3RocmlmdCBub2RlIGNsaWVudC5qcworCitGb3IgYW4gZXhhbXBsZSB1c2luZyBKYXZhU2NyaXB0IGluIHRoZSBicm93c2VyIHRvIGNvbm5lY3QgdG8KK2Egbm9kZS5qcyBzZXJ2ZXIgbG9vayBhdCBoZWxsby5odG1sLCBoZWxsby5qcyBhbmQgaGVsbG8udGhyaWZ0CisKK0hUVFAgZXhhbXBsZXMgYXJlIHByb3ZpZGVkIGFsc286IGh0dHBDbGllbnQuanMgYW5kIGh0dHBTZXJ2ZXIuanMKK1lvdSBjYW4gdGVzdCBIVFRQIGNyb3NzIHBsYXRmb3JtIHdpdGggdGhlIGh0dHBTZXJ2ZXIucHkgUHl0aG9uIHNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9jbGllbnRfbXVsdGl0cmFuc3BvcnQuanMgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2NsaWVudF9tdWx0aXRyYW5zcG9ydC5qcwppbmRleCA1YzllMTA5Li4xZTM3ZGUzIDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2V4YW1wbGVzL2NsaWVudF9tdWx0aXRyYW5zcG9ydC5qcworKysgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2NsaWVudF9tdWx0aXRyYW5zcG9ydC5qcwpAQCAtMSwzICsxLDIxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCiB2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0JyksCiAgICAgdHRyYW5zcG9ydCA9IHJlcXVpcmUoJ3RocmlmdC90cmFuc3BvcnQnKTsKIApkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9oZWxsby5odG1sIGIvbGliL25vZGVqcy9leGFtcGxlcy9oZWxsby5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlODVhN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2hlbGxvLmh0bWwKQEAgLTAsMCArMSw2NSBAQAorPCEtLQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgaHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KKzxoZWFkPgorICAgIDx0aXRsZT5BcGFjaGUgVGhyaWZ0IEphdmFTY3JpcHQgQnJvd3NlciBDbGllbnQgRGVtbzwvdGl0bGU+CisgICAgPHNjcmlwdCBzcmM9InRocmlmdC5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iZ2VuLWpzL0hlbGxvU3ZjLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJnZW4tanMvVGltZXNUd28uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+QXBhY2hlIFRocmlmdCBKYXZhU2NyaXB0IEJyb3dzZXIgQ2xpZW50IERlbW88L2gxPgorICAgIDxwPlRoaXMgaHRtbCBmaWxlIGRlbW9uc3RyYXRlcyBBcGFjaGUgVGhyaWZ0IEphdmFTY3JwdCBSUEMgYmV0d2VlbiBhIGJyb3dzZXIgY2xpZW50IHRvIGEgbm9kZS5qcyBzZXJ2ZXIuIENsaWNraW5nIHRoZSBidXR0b25zIGJlbG93IHdpbGwgY2FsbCB0aGUgUlBDIGZ1bmN0aW9ucyBob3N0ZWQgYnkgdGhlIEFwYWNoZSBUaHJpZnQgc2VydmVyIGF0IGxvY2FsaG9zdDo4NTg1LiBUaGUgZmlsZSBoZWxsby5qcyBjb250YWlucyB0aGUgSmF2YVNjcmlwdCBub2RlLmpzIHNlcnZlciByZXF1aXJlZC4gSGVyZSBhcmUgdGhlIHN0ZXBzIHRvIGdldCB0aGUgZXhhbXBsZSBydW5uaW5nOjwvcD4KKyAgICA8b2w+CisgICAgICAgIDxsaT5JbnN0YWxsIE5vZGUuanMgPHByZT48YSBocmVmPSJodHRwOi8vbm9kZWpzLm9yZyI+bm9kZWpzLm9yZzwvYT48L3ByZT48L2xpPgorICAgICAgICA8bGk+SW5zdGFsbCBBcGFjaGUgVGhyaWZ0IGZvciBub2RlIChub3RlIHRoYXQgdGhlIG5vZGUgcGFja2FnZSBtYW5hZ2VyIHdpbGwgY3JlYXRlIHRoZSBub2RlX21vZHVsZXMgZm9sZGVyIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBzbyBtYWtlIHN1cmUgdG8gcnVuIG5wbSBmcm9tIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBoZWxsby5qcyBzbyB0aGF0IHRoZSBzZXJ2ZXIgY2FuIGZpbmQgdGhlIFRocmlmdCBsaWJyYXJpZXMuIFRoaXMgZXhhbXBsZSByZXF1aXJlcyBBcGFjaGUgVGhyaWZ0IDAuOS4yKykgPHByZT4kIG5wbSBpbnN0YWxsIHRocmlmdDwvcHJlPjwvbGk+CisgICAgICAgIDxsaT5Db21waWxlIHRoZSBoZWxsby5pZGwgZm9yIEphdmFTY3JpcHQgYW5kIE5vZGUuanMgKHlvdSdsbCBuZWVkIHRvIGhhdmUgdGhlIEFwYWNoZSBUaHJpZnQgY29tcGlsZXIgaW5zdGFsbGVkIGZvciB0aGlzIHN0ZXAuIFRoaXMgYWxzbyBuZWVkcyB0byBiZSBleGVjdXRlZCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgaGVsbG8uanMgYmVjYXVzZSBoZWxsby5qcyBhbmQgaGVsbG8uaHRtbCBsb29rIGZvciB0aGUgZ2VuLW5vZGVqcyBhbmQgZ2VuLWpzIGRpcmVjdG9yaWVzIGhlcmUuKTxwcmU+JCB0aHJpZnQgLWdlbiBqcyAtZ2VuIGpzOm5vZGUgaGVsbG8udGhyaWZ0PC9wcmU+PC9saT4KKyAgICAgICAgPGxpPlJ1biB0aGUgbm9kZSBzZXJ2ZXIgaW4gdGhlIGRpcmVjdG9yeSB3aXRoIHRoZSBoZWxsby5odG1sIGZpbGU8cHJlPiQgbm9kZSBoZWxsby5qczwvcHJlPjwvbGk+CisgICAgICAgIDxsaT5Db3B5IHRoZSBBcGFjaGUgVGhyaWZ0IEphdmFTY3JpcHQgbGlicmFyeSwgdGhyaWZ0LmpzLCBpbnRvIHRoZSBkaXJlY3Rvcnkgd2l0aCB0aGlzIGh0bWwgZmlsZS48cHJlPiQgY3AgLi4uLi4vdGhyaWZ0LmpzIC4gKHlvdSBzaG91bGQgYmUgYWJsZSB0byB1c2UgQm93ZXIgdG8gaW5zdGFsbCB0aGUgYnJvd3NlciBiYXNlZCBBcGFjaGUgVGhyaWZ0IGxpYnJhcnkgaW4gdGhlIG5lYXIgZnV0dXJlLik8L3ByZT4KKyAgICAgICAgPGxpPlJlbG9hZCB0aGlzIHBhZ2UgaW4gYSBicm93c2VyIHRocm91Z2ggdGhlIG5vZGUgc2VydmVyIHVzaW5nIHVzaW5nIHRoZSBVUkw6IDxwcmU+aHR0cDovL2xvY2FsaG9zdDo4NTg1L2hlbGxvLmh0bWw8L3ByZT50aGVuIGNsaWNrIGEgYnV0dG9uIGJlbG93IHRvIG1ha2UgYW4gUlBDIGNhbGw8L2xpPgorICAgIDwvb2w+CisgICAgPGJ1dHRvbiBpZD0iYnRuIj5HZXQgTWVzc2FnZSBmcm9tIE5vZGUgU2VydmVyPC9idXR0b24+CisgICAgPGJ1dHRvbiBpZD0iYnRuRGJsIj5Eb3VibGUgMjU8L2J1dHRvbj4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidG4iKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGdldE1lc3NhZ2UsIGZhbHNlKTsKKworICAgICAgICBmdW5jdGlvbiBnZXRNZXNzYWdlKCkgeworICAgICAgICAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVFhIUlRyYW5zcG9ydCgiaHR0cDovL2xvY2FsaG9zdDo4NTg1L2hlbGxvIik7CisgICAgICAgICAgICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5USlNPTlByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICB2YXIgY2xpZW50ID0gbmV3IEhlbGxvU3ZjQ2xpZW50KHByb3RvY29sKTsKKyAgICAgICAgICAgIHZhciBtc2cgPSBjbGllbnQuaGVsbG9fZnVuYygpOworICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm91dHB1dCIpLmlubmVySFRNTCA9IG1zZzsKKyAgICAgICAgfQorCisgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidG5EYmwiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGRibE1lc3NhZ2UsIGZhbHNlKTsKKworICAgICAgICBmdW5jdGlvbiBkYmxNZXNzYWdlKCkgeworICAgICAgICAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVFhIUlRyYW5zcG9ydCgiaHR0cDovL2xvY2FsaG9zdDo4NTg1L2RibCIpOworICAgICAgICAgICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgdmFyIGNsaWVudCA9IG5ldyBUaW1lc1R3b0NsaWVudChwcm90b2NvbCk7CisgICAgICAgICAgICB2YXIgdmFsID0gY2xpZW50LmRibCgyNSk7CisgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3V0cHV0MiIpLmlubmVySFRNTCA9IHZhbDsKKyAgICAgICAgfQorICAgIDwvc2NyaXB0PgorICAgIDxoMj5TZXJ2ZXIgUmVzcG9uc2U6IDxkaXYgaWQ9Im91dHB1dCI+PC9kaXY+PC9oMj4KKyAgICA8aDI+U2VydmVyIERibDogPGRpdiBpZD0ib3V0cHV0MiI+PC9kaXY+PC9oMj4KKzwvYm9keT4gCis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvZXhhbXBsZXMvaGVsbG8uanMgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2hlbGxvLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiN2M0ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2hlbGxvLmpzCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3ZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTsKK3ZhciBIZWxsb1N2YyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9IZWxsb1N2Yy5qcycpOwordmFyIFRpbWVzVHdvU3ZjID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RpbWVzVHdvLmpzJyk7CisKK3ZhciBoZWxsb0hhbmRsZXIgPSB7CisJaGVsbG9fZnVuYzogZnVuY3Rpb24ocmVzdWx0KSB7CisJCXRoaXMuY2FsbF9jb3VudGVyID0gdGhpcy5jYWxsX2NvdW50ZXIgfHwgMDsKKwkJY29uc29sZS5sb2coIkNsaWVudCBjYWxsOiAiICsgKCsrdGhpcy5jYWxsX2NvdW50ZXIpKTsKKwkJcmVzdWx0KG51bGwsICJIZWxsbyBBcGFjaGUgVGhyaWZ0IGZvciBKYXZhU2NyaXB0ICIgKyB0aGlzLmNhbGxfY291bnRlcik7CisJfQorfQorCit2YXIgdGltZXNUd29IYW5kbGVyID0geworCWRibDogZnVuY3Rpb24odmFsLCByZXN1bHQpIHsKKwkJY29uc29sZS5sb2coIkNsaWVudCBjYWxsOiAiICsgdmFsKTsKKwkJcmVzdWx0KG51bGwsIHZhbCAqIDIpOworCX0KK30KKwordmFyIGhlbGxvU2VydmljZSA9IHsKKwl0cmFuc3BvcnQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCisJcHJvdG9jb2w6IHRocmlmdC5USlNPTlByb3RvY29sLAorCXByb2Nlc3NvcjogSGVsbG9TdmMsCisJaGFuZGxlcjogaGVsbG9IYW5kbGVyCit9OworCit2YXIgZGJsU2VydmljZSA9IHsKKwl0cmFuc3BvcnQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCisJcHJvdG9jb2w6IHRocmlmdC5USlNPTlByb3RvY29sLAorCXByb2Nlc3NvcjogVGltZXNUd29TdmMsCisJaGFuZGxlcjogdGltZXNUd29IYW5kbGVyCit9OworCit2YXIgU2VydmVyT3B0aW9ucyA9IHsKKwlmaWxlczogIi4iLAorCXNlcnZpY2VzOiB7CisJCSIvaGVsbG8iOiBoZWxsb1NlcnZpY2UsCisJCSIvZGJsIjogZGJsU2VydmljZSwKKwl9Cit9CisKK3ZhciBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlV2ViU2VydmVyKFNlcnZlck9wdGlvbnMpOwordmFyIHBvcnQgPSA4NTg1Oworc2VydmVyLmxpc3Rlbihwb3J0KTsKK2NvbnNvbGUubG9nKCJIdHRwL1RocmlmdCBTZXJ2ZXIgcnVubmluZyBvbiBwb3J0OiAiICsgcG9ydCk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL2hlbGxvLnRocmlmdCBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaGVsbG8udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYWY1YTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2hlbGxvLnRocmlmdApAQCAtMCwwICsxLDI3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitzZXJ2aWNlIEhlbGxvU3ZjIHsKKyAgICBzdHJpbmcgaGVsbG9fZnVuYygpLAorfQorCitzZXJ2aWNlIFRpbWVzVHdvIHsKKyAgICBpNjQgZGJsKDE6IGk2NCB2YWwpLAorfQorCisKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cENsaWVudC5qcyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cENsaWVudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWNjMGMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9odHRwQ2xpZW50LmpzCkBAIC0wLDAgKzEsMjMgQEAKK3ZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTsKK3ZhciBoZWxsb1N2YyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9IZWxsb1N2Yy5qcycpOworCit2YXIgb3B0aW9ucyA9IHsKKyAgIHRyYW5zcG9ydDogdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydCwKKyAgIHByb3RvY29sOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKKyAgIHBhdGg6ICIvaGVsbG8iLAorICAgaGVhZGVyczogeyJDb25uZWN0aW9uIjogImNsb3NlIn0sCisgICBodHRwczogZmFsc2UKK307CisKK3ZhciBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUh0dHBDb25uZWN0aW9uKCJsb2NhbGhvc3QiLCA5MDkwLCBvcHRpb25zKTsKK3ZhciBjbGllbnQgPSB0aHJpZnQuY3JlYXRlSHR0cENsaWVudChoZWxsb1N2YywgY29ubmVjdGlvbik7CisKK2Nvbm5lY3Rpb24ub24oImVycm9yIiwgZnVuY3Rpb24oZXJyKSB7CisgICBjb25zb2xlLmxvZygiRXJyb3I6ICIgKyBlcnIpOworfSk7CisKK2NsaWVudC5oZWxsb19mdW5jKGZ1bmN0aW9uKGVycm9yLCByZXN1bHQpIHsKKyAgIGNvbnNvbGUubG9nKCJNc2cgZnJvbSBzZXJ2ZXI6ICIgKyByZXN1bHQpOworfSk7CisKKwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9odHRwU2VydmVyLmpzIGIvbGliL25vZGVqcy9leGFtcGxlcy9odHRwU2VydmVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYWUxMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2h0dHBTZXJ2ZXIuanMKQEAgLTAsMCArMSwzMSBAQAordmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOyAgICAgICAgICAgICAgICAgCQordmFyIGhlbGxvU3ZjID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL0hlbGxvU3ZjJyk7CisKKy8vU2VydmljZUhhbmRsZXI6IEltcGxlbWVudCB0aGUgaGVsbG8gc2VydmljZSAKK3ZhciBoZWxsb0hhbmRsZXIgPSB7CisgIGhlbGxvX2Z1bmM6IGZ1bmN0aW9uIChyZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygiUmVjZWl2ZWQgSGVsbG8gY2FsbCIpOworICAgIHJlc3VsdChudWxsLCAiSGVsbG8gZnJvbSBOb2RlLmpzIik7CisgIH0KK307CisKKy8vU2VydmljZU9wdGlvbnM6IFRoZSBJL08gc3RhY2sgZm9yIHRoZSBzZXJ2aWNlCit2YXIgaGVsbG9TdmNPcHQgPSB7ICAgICAgICAgICAgICAgICAgICAgICAJCQorICAgIGhhbmRsZXI6IGhlbGxvSGFuZGxlciwgICAgICAgICAgICAgICAgICAgICAgCQorICAgIHByb2Nlc3NvcjogaGVsbG9TdmMsICAgICAgICAgICAgICAgICAgICAgICAgIAkKKyAgICBwcm90b2NvbDogdGhyaWZ0LlRKU09OUHJvdG9jb2wsICAgICAgICAgICAgICAgICAKKyAgICB0cmFuc3BvcnQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQgCQkKK307ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisvL1NlcnZlck9wdGlvbnM6IERlZmluZSBzZXJ2ZXIgZmVhdHVyZXMKK3ZhciBzZXJ2ZXJPcHQgPSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAJCisgICBzZXJ2aWNlczogeyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICIvaGVsbG8iOiBoZWxsb1N2Y09wdCAgICAgICAgICAgICAgICAgCisgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKy8vQ3JlYXRlIGFuZCBzdGFydCB0aGUgd2ViIHNlcnZlciAKK3ZhciBwb3J0ID0gOTA5MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkKK3RocmlmdC5jcmVhdGVXZWJTZXJ2ZXIoc2VydmVyT3B0KS5saXN0ZW4ocG9ydCk7ICAgICAgICAgICAgICAgICAgICAgICAgCQkKK2NvbnNvbGUubG9nKCJIdHRwL1RocmlmdCBTZXJ2ZXIgcnVubmluZyBvbiBwb3J0OiAiICsgcG9ydCk7CisKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cFNlcnZlci5weSBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cFNlcnZlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzEyZmNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9odHRwU2VydmVyLnB5CkBAIC0wLDAgKzEsMTggQEAKK2ltcG9ydCBzeXMKK3N5cy5wYXRoLmFwcGVuZCgnZ2VuLXB5JykKKworZnJvbSBoZWxsbyBpbXBvcnQgSGVsbG9TdmMKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUSlNPTlByb3RvY29sCitmcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRIdHRwU2VydmVyCisKK2NsYXNzIEhlbGxvU3ZjSGFuZGxlcjoKKyAgZGVmIGhlbGxvX2Z1bmMoc2VsZik6CisgICAgcHJpbnQoIkhlbGxvIENhbGxlZCIpCisgICAgcmV0dXJuICJoZWxsbyBmcm9tIFB5dGhvbiIKKworcHJvY2Vzc29yID0gSGVsbG9TdmMuUHJvY2Vzc29yKEhlbGxvU3ZjSGFuZGxlcigpKQorcHJvdG9GYWN0b3J5ID0gVEpTT05Qcm90b2NvbC5USlNPTlByb3RvY29sRmFjdG9yeSgpCitwb3J0ID0gOTA5MAorc2VydmVyID0gVEh0dHBTZXJ2ZXIuVEh0dHBTZXJ2ZXIocHJvY2Vzc29yLCAoImxvY2FsaG9zdCIsIHBvcnQpLCBwcm90b0ZhY3RvcnkpCitwcmludCAiUHl0aG9uIHNlcnZlciBydW5uaW5nIG9uIHBvcnQgIiArIHN0cihwb3J0KQorc2VydmVyLnNlcnZlKCkKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvZXhhbXBsZXMvcGFyc2UuanMgYi9saWIvbm9kZWpzL2V4YW1wbGVzL3BhcnNlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OGExYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2V4YW1wbGVzL3BhcnNlLmpzCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorCisgIFRoaXMgaXMgYSBzdGFuZGFsb25lIGRlc2VyaWFsaXplL3BhcnNlIGV4YW1wbGUgaWYgeW91IGp1c3Qgd2FudCB0byBkZXNlcmlhbGl6ZQorICB0aHJpZnQgZGVjb3VwbGVkIGZyb20gY2Fzc2FuZHJhIHNlcnZlcgorCisgIDEuICBhY3F1aXJlIHRocmlmdCB0ZW1wbGF0ZSBzcGVjaWZpY2F0aW9uIGZpbGVzIGZyb20gd2hvIGV2ZXIgYnVpbHQgaXQgKGVnOiBFWEFNUExFLnRocmlmdCkKKworICAyLiAgSW5zdGFsbCB0aHJpZnQgb24gbG9jYWwgbWFjaGluZQorCisgIDMuICBnZW5lcmF0ZSB0aHJpZnQgY2xpZW50cyBmb3Igbm9kZWpzIHVzaW5nIHRlbXBsYXRlIHNwZWNpZmljYXRpb24gZmlsZXMgKCMxKQorICAgICAgdGhyaWZ0IC0tZ2VuIGpzOm5vZGUgc2NoZW1hL0VYQU1QTEUudGhyaWZ0CisKKyAgICAgIFRoaXMgY3JlYXRlcyBjcmVhdGVzIGdlbi1ub2RlLmpzIGRpcmVjdG9yeSBjb250YWluaW5nIGEgbmV3IGZpbGUsIEdFTkVSQVRFRC5qcworCisgIDQuICBJbnNpZGUgR0VORVJBVEVELmpzIGlzIGEgY2xhc3MgeW91IHdpbGwgd2FudCB0byBpbnN0YW5jaWF0ZS4gIEZpbmQgdGhpcyBjbGFzcyBuYW1lIGFuZCBwbHVnIAorICAgICAgaXQgaW50byB0aGUgZXhhbXBsZSBjb2RlIGJlbG93ICAoaWUsICJZT1VSX0NMQVNTX05BTUUiKQorICovCisKK2Z1bmN0aW9uIHBhcnNlVGhyaWZ0KHRocmlmdEVuY29kZWREYXRhLCBjYWxsYmFjaykgeworICB2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7CisgIHZhciB0cmFuc3BvcnQgPSBuZXcgdGhyaWZ0LlRGcmFtZWRUcmFuc3BvcnQodGhyaWZ0RW5jb2RlZERhdGEpOworICB2YXIgcHJvdG9jb2wgID0gbmV3IHRocmlmdC5UQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKworICB2YXIgY2xpZW50Q2xhc3MgPSByZXF1aXJlKCcuLi9nZW4tbm9kZWpzL0dFTkVSQVRFRCcpLllPVVJfQ0xBU1NfTkFNRTsKKyAgdmFyIGNsaWVudCA9IG5ldyBjbGllbnRDbGFzcygpOworICBjbGllbnQucmVhZChwcm90b2NvbCk7CisgIGNhbGxiYWNrKG51bGwsIGNsaWVudCk7Cit9CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL3NlcnZlci5qcyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvc2VydmVyLmpzCmluZGV4IDNiOGMwNDYuLjFjNDgyZmUgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvZXhhbXBsZXMvc2VydmVyLmpzCisrKyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvc2VydmVyLmpzCkBAIC0yNCwxNSArMjQsMTUgQEAKIHZhciB1c2VycyA9IHt9OwogCiB2YXIgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVNlcnZlcihVc2VyU3RvcmFnZSwgewotICBzdG9yZTogZnVuY3Rpb24odXNlciwgc3VjY2VzcykgeworICBzdG9yZTogZnVuY3Rpb24odXNlciwgcmVzdWx0KSB7CiAgICAgY29uc29sZS5sb2coInNlcnZlciBzdG9yZWQ6IiwgdXNlci51aWQpOwogICAgIHVzZXJzW3VzZXIudWlkXSA9IHVzZXI7Ci0gICAgc3VjY2VzcygpOworICAgIHJlc3VsdChudWxsKTsKICAgfSwKIAotICByZXRyaWV2ZTogZnVuY3Rpb24odWlkLCBzdWNjZXNzKSB7CisgIHJldHJpZXZlOiBmdW5jdGlvbih1aWQsIHJlc3VsdCkgewogICAgIGNvbnNvbGUubG9nKCJzZXJ2ZXIgcmV0cmlldmVkOiIsIHVpZCk7Ci0gICAgc3VjY2Vzcyh1c2Vyc1t1aWRdKTsKKyAgICByZXN1bHQobnVsbCwgdXNlcnNbdWlkXSk7CiAgIH0sCiB9KTsKIApkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9zZXJ2ZXJfaHR0cC5qcyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvc2VydmVyX2h0dHAuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyZGM4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvc2VydmVyX2h0dHAuanMKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordmFyIGNvbm5lY3QgPSByZXF1aXJlKCdjb25uZWN0Jyk7Cit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7CisKK3ZhciBVc2VyU3RvcmFnZSA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9Vc2VyU3RvcmFnZScpLAorICAgIHR0eXBlcyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy91c2VyX3R5cGVzJyk7CisKK3ZhciB1c2VycyA9IHt9OworCit2YXIgc3RvcmUgPSBmdW5jdGlvbih1c2VyLCByZXN1bHQpIHsKKyAgY29uc29sZS5sb2coInN0b3JlZDoiLCB1c2VyLnVpZCk7CisgIHVzZXJzW3VzZXIudWlkXSA9IHVzZXI7CisgIHJlc3VsdChudWxsKTsKK307Cit2YXIgcmV0cmlldmUgPSBmdW5jdGlvbih1aWQsIHJlc3VsdCkgeworICBjb25zb2xlLmxvZygicmV0cmlldmVkOiIsIHVpZCk7CisgIHJlc3VsdChudWxsLCB1c2Vyc1t1aWRdKTsKK307CisKK3ZhciBzZXJ2ZXJfaHR0cCA9IHRocmlmdC5jcmVhdGVIdHRwU2VydmVyKFVzZXJTdG9yYWdlLCB7CisgIHN0b3JlOiBzdG9yZSwKKyAgcmV0cmlldmU6IHJldHJpZXZlCit9KTsKK3NlcnZlcl9odHRwLmxpc3Rlbig5MDkwKTsKKwordmFyIHNlcnZlcl9jb25uZWN0ID0gY29ubmVjdCh0aHJpZnQuaHR0cE1pZGRsZXdhcmUoVXNlclN0b3JhZ2UsIHsKKyBzdG9yZTogc3RvcmUsCisgcmV0cmlldmU6IHJldHJpZXZlCit9KSk7CitzZXJ2ZXJfaHR0cC5saXN0ZW4oOTA5MSk7CisKK3ZhciBzZXJ2ZXJfY29ubmVjdF9qc29uID0gY29ubmVjdCh0aHJpZnQuaHR0cE1pZGRsZXdhcmUoVXNlclN0b3JhZ2UsIHsKKyBzdG9yZTogc3RvcmUsCisgcmV0cmlldmU6IHJldHJpZXZlCit9LCB7cHJvdG9jb2w6IHRocmlmdC5USlNPTlByb3RvY29sfSkpOworc2VydmVyX2Nvbm5lY3RfanNvbi5saXN0ZW4oOTA5Mik7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL3NlcnZlcl9tdWx0aXRyYW5zcG9ydC5qcyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvc2VydmVyX211bHRpdHJhbnNwb3J0LmpzCmluZGV4IGU1ZDZkNzYuLmEzNDhlNjggMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvZXhhbXBsZXMvc2VydmVyX211bHRpdHJhbnNwb3J0LmpzCisrKyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvc2VydmVyX211bHRpdHJhbnNwb3J0LmpzCkBAIC0xLDMgKzEsMjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIHZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKSwKICAgICB0dHJhbnNwb3J0ID0gcmVxdWlyZSgndGhyaWZ0L3RyYW5zcG9ydCcpOwogCkBAIC02LDE0ICsyNCwxNCBAQAogCiB2YXIgdXNlcnMgPSB7fTsKIAotdmFyIHN0b3JlID0gZnVuY3Rpb24odXNlciwgc3VjY2VzcykgewordmFyIHN0b3JlID0gZnVuY3Rpb24odXNlciwgcmVzdWx0KSB7CiAgIGNvbnNvbGUubG9nKCJzdG9yZWQ6IiwgdXNlci51aWQpOwogICB1c2Vyc1t1c2VyLnVpZF0gPSB1c2VyOwotICBzdWNjZXNzKCk7CisgIHJlc3VsdChudWxsKTsKIH07Ci12YXIgcmV0cmlldmUgPSBmdW5jdGlvbih1aWQsIHN1Y2Nlc3MpIHsKK3ZhciByZXRyaWV2ZSA9IGZ1bmN0aW9uKHVpZCwgcmVzdWx0KSB7CiAgIGNvbnNvbGUubG9nKCJyZXRyaWV2ZWQ6IiwgdWlkKTsKLSAgc3VjY2Vzcyh1c2Vyc1t1aWRdKTsKKyAgcmVzdWx0KG51bGwsIHVzZXJzW3VpZF0pOwogfTsKIAogdmFyIHNlcnZlcl9mcmFtZWQgPSB0aHJpZnQuY3JlYXRlU2VydmVyKFVzZXJTdG9yYWdlLCB7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL3VzZXIudGhyaWZ0IGIvbGliL25vZGVqcy9leGFtcGxlcy91c2VyLnRocmlmdAppbmRleCBlZTI2MGU1Li5kMDg3ZmQ0IDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2V4YW1wbGVzL3VzZXIudGhyaWZ0CisrKyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvdXNlci50aHJpZnQKQEAgLTE0LDcgKzE0LDcgQEAKICMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KLSAKKwogc3RydWN0IFVzZXJQcm9maWxlIHsKICAgMTogaTMyIHVpZCwKICAgMjogc3RyaW5nIG5hbWUsCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvYmluYXJ5LmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODEzZmZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeS5qcwpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgUE9XXzggPSBNYXRoLnBvdygyLCA4KTsKK3ZhciBQT1dfMTYgPSBNYXRoLnBvdygyLCAxNik7Cit2YXIgUE9XXzI0ID0gTWF0aC5wb3coMiwgMjQpOwordmFyIFBPV18zMiA9IE1hdGgucG93KDIsIDMyKTsKK3ZhciBQT1dfNDAgPSBNYXRoLnBvdygyLCA0MCk7Cit2YXIgUE9XXzQ4ID0gTWF0aC5wb3coMiwgNDgpOwordmFyIFBPV181MiA9IE1hdGgucG93KDIsIDUyKTsKK3ZhciBQT1dfMTAyMiA9IE1hdGgucG93KDIsIDEwMjIpOworCitleHBvcnRzLnJlYWRCeXRlID0gZnVuY3Rpb24oYil7CisJcmV0dXJuIGIgPiAxMjcgPyBiLTI1NiA6IGI7Cit9OworCitleHBvcnRzLnJlYWRJMTYgPSBmdW5jdGlvbihidWZmLCBvZmYpIHsKKyAgb2ZmID0gb2ZmIHx8IDA7CisgIHZhciB2ID0gYnVmZltvZmYgKyAxXTsKKyAgdiArPSBidWZmW29mZl0gPDwgODsKKyAgaWYgKGJ1ZmZbb2ZmXSAmIDEyOCkgeworICAgIHYgLT0gUE9XXzE2OworICB9CisgIHJldHVybiB2OworfTsKKworZXhwb3J0cy5yZWFkSTMyID0gZnVuY3Rpb24oYnVmZiwgb2ZmKSB7CisgIG9mZiA9IG9mZiB8fCAwOworICB2YXIgdiA9IGJ1ZmZbb2ZmICsgM107CisgIHYgKz0gYnVmZltvZmYgKyAyXSA8PCA4OworICB2ICs9IGJ1ZmZbb2ZmICsgMV0gPDwgMTY7CisgIHYgKz0gYnVmZltvZmZdICogUE9XXzI0OworICBpZiAoYnVmZltvZmZdICYgMHg4MCkgeworICAgIHYgLT0gUE9XXzMyOworICB9CisgIHJldHVybiB2OworfTsKKworZXhwb3J0cy53cml0ZUkxNiA9IGZ1bmN0aW9uKGJ1ZmYsIHYpIHsKKyAgYnVmZlsxXSA9IHYgJiAweGZmOworICB2ID4+PSA4OworICBidWZmWzBdID0gdiAmIDB4ZmY7CisgIHJldHVybiBidWZmOworfTsKKworZXhwb3J0cy53cml0ZUkzMiA9IGZ1bmN0aW9uKGJ1ZmYsIHYpIHsKKyAgYnVmZlszXSA9IHYgJiAweGZmOworICB2ID4+PSA4OworICBidWZmWzJdID0gdiAmIDB4ZmY7CisgIHYgPj49IDg7CisgIGJ1ZmZbMV0gPSB2ICYgMHhmZjsKKyAgdiA+Pj0gODsKKyAgYnVmZlswXSA9IHYgJiAweGZmOworICByZXR1cm4gYnVmZjsKK307CisKK2V4cG9ydHMucmVhZERvdWJsZSA9IGZ1bmN0aW9uKGJ1ZmYsIG9mZikgeworICBvZmYgPSBvZmYgfHwgMDsKKyAgdmFyIHNpZ25lZCA9IGJ1ZmZbb2ZmXSAmIDB4ODA7CisgIHZhciBlID0gKGJ1ZmZbb2ZmKzFdICYgMHhGMCkgPj4gNDsKKyAgZSArPSAoYnVmZltvZmZdICYgMHg3RikgPDwgNDsKKworICB2YXIgbSA9IGJ1ZmZbb2ZmKzddOworICBtICs9IGJ1ZmZbb2ZmKzZdIDw8IDg7CisgIG0gKz0gYnVmZltvZmYrNV0gPDwgMTY7CisgIG0gKz0gYnVmZltvZmYrNF0gKiBQT1dfMjQ7CisgIG0gKz0gYnVmZltvZmYrM10gKiBQT1dfMzI7CisgIG0gKz0gYnVmZltvZmYrMl0gKiBQT1dfNDA7CisgIG0gKz0gKGJ1ZmZbb2ZmKzFdICYgMHgwRikgKiBQT1dfNDg7CisKKyAgc3dpdGNoIChlKSB7CisgICAgY2FzZSAwOgorICAgICAgZSA9IC0xMDIyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyMDQ3OgorICAgICAgcmV0dXJuIG0gPyBOYU4gOiAoc2lnbmVkID8gLUluZmluaXR5IDogSW5maW5pdHkpOworICAgIGRlZmF1bHQ6CisgICAgICBtICs9IFBPV181MjsKKyAgICAgIGUgLT0gMTAyMzsKKyAgfQorCisgIGlmIChzaWduZWQpIHsKKyAgICBtICo9IC0xOworICB9CisKKyAgcmV0dXJuIG0gKiBNYXRoLnBvdygyLCBlIC0gNTIpOworfTsKKworLyoKKyAqIEJhc2VkIG9uIGNvZGUgZnJvbSB0aGUganNwYWNrIG1vZHVsZToKKyAqIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9qc3BhY2svCisgKi8KK2V4cG9ydHMud3JpdGVEb3VibGUgPSBmdW5jdGlvbihidWZmLCB2KSB7CisgIHZhciBtLCBlLCBjOworCisgIGJ1ZmZbMF0gPSAodiA8IDAgPyAweDgwIDogMHgwMCk7CisKKyAgdiA9IE1hdGguYWJzKHYpOworICBpZiAodiAhPT0gdikgeworICAgIC8vIE5hTiwgdXNlIFFOYU4gSUVFRSBmb3JtYXQKKyAgICBtID0gMjI1MTc5OTgxMzY4NTI0ODsKKyAgICBlID0gMjA0NzsKKyAgfSBlbHNlIGlmICh2ID09PSBJbmZpbml0eSkgeworICAgIG0gPSAwOworICAgIGUgPSAyMDQ3OworICB9IGVsc2UgeworICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHYpIC8gTWF0aC5MTjIpOworICAgIGMgPSBNYXRoLnBvdygyLCAtZSk7CisgICAgaWYgKHYgKiBjIDwgMSkgeworICAgICAgZS0tOworICAgICAgYyAqPSAyOworICAgIH0KKworICAgIGlmIChlICsgMTAyMyA+PSAyMDQ3KQorICAgIHsKKyAgICAgIC8vIE92ZXJmbG93CisgICAgICBtID0gMDsKKyAgICAgIGUgPSAyMDQ3OworICAgIH0KKyAgICBlbHNlIGlmIChlICsgMTAyMyA+PSAxKQorICAgIHsKKyAgICAgIC8vIE5vcm1hbGl6ZWQgLSB0ZXJtIG9yZGVyIG1hdHRlcnMsIGFzIE1hdGgucG93KDIsIDUyLWUpIGFuZCB2Kk1hdGgucG93KDIsIDUyKSBjYW4gb3ZlcmZsb3cKKyAgICAgIG0gPSAodipjLTEpICogUE9XXzUyOworICAgICAgZSArPSAxMDIzOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLy8gRGVub3JtYWxpemVkIC0gYWxzbyBjYXRjaGVzIHRoZSAnMCcgY2FzZSwgc29tZXdoYXQgYnkgY2hhbmNlCisgICAgICBtID0gKHYgKiBQT1dfMTAyMikgKiBQT1dfNTI7CisgICAgICBlID0gMDsKKyAgICB9CisgIH0KKworICBidWZmWzFdID0gKGUgPDwgNCkgJiAweGYwOworICBidWZmWzBdIHw9IChlID4+IDQpICYgMHg3ZjsKKworICBidWZmWzddID0gbSAmIDB4ZmY7CisgIG0gPSBNYXRoLmZsb29yKG0gLyBQT1dfOCk7CisgIGJ1ZmZbNl0gPSBtICYgMHhmZjsKKyAgbSA9IE1hdGguZmxvb3IobSAvIFBPV184KTsKKyAgYnVmZls1XSA9IG0gJiAweGZmOworICBtID0gTWF0aC5mbG9vcihtIC8gUE9XXzgpOworICBidWZmWzRdID0gbSAmIDB4ZmY7CisgIG0gPj49IDg7CisgIGJ1ZmZbM10gPSBtICYgMHhmZjsKKyAgbSA+Pj0gODsKKyAgYnVmZlsyXSA9IG0gJiAweGZmOworICBtID4+PSA4OworICBidWZmWzFdIHw9IG0gJiAweDBmOworCisgIHJldHVybiBidWZmOworfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9iaW5hcnlfcGFyc2VyLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeV9wYXJzZXIuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZWRhNDYuLjAwMDAwMDAKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeV9wYXJzZXIuanMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotdmFyIHN5cyA9IHJlcXVpcmUoJ3N5cycpOwotdmFyIGNociA9IFN0cmluZy5mcm9tQ2hhckNvZGU7Ci0KLXZhciBwID0gZXhwb3J0cy5CaW5hcnlQYXJzZXIgPSBmdW5jdGlvbiggYmlnRW5kaWFuLCBhbGxvd0V4Y2VwdGlvbnMgKXsKLSAgdGhpcy5iaWdFbmRpYW4gPSBiaWdFbmRpYW4gfHwgdHJ1ZTsKLSAgdGhpcy5hbGxvd0V4Y2VwdGlvbnMgPSBhbGxvd0V4Y2VwdGlvbnM7Ci19OwotcC5iaWdFbmRpYW4gPSB0cnVlOwotCi12YXIgSUJ1ZmZlciA9IGV4cG9ydHMuQmluYXJ5UGFyc2VyLklCdWZmZXIgPSBmdW5jdGlvbiggYmlnRW5kaWFuLCBidWZmZXIgKXsKLSAgdGhpcy5iaWdFbmRpYW4gPSBiaWdFbmRpYW4gfHwgMTsKLSAgdGhpcy5idWZmZXIgPSBbXTsKLSAgdGhpcy5zZXRCdWZmZXIoIGJ1ZmZlciApOwotfTsKLQotSUJ1ZmZlci5wcm90b3R5cGUuc2V0QnVmZmVyID0gZnVuY3Rpb24oIGRhdGEgKXsKLSAgaWYoIGRhdGEgKXsKLSAgICBmb3IoIHZhciBsLCBpID0gbCA9IGRhdGEubGVuZ3RoLCBiID0gdGhpcy5idWZmZXIgPSBuZXcgQXJyYXkoIGwgKTsgaTsgYltsIC0gaV0gPSBkYXRhWy0taV0gKTsKLSAgICB0aGlzLmJpZ0VuZGlhbiAmJiBiLnJldmVyc2UoKTsKLSAgfQotfTsKLQotSUJ1ZmZlci5wcm90b3R5cGUuaGFzTmVlZGVkQml0cyA9IGZ1bmN0aW9uKCBuZWVkZWRCaXRzICl7Ci0gIHJldHVybiB0aGlzLmJ1ZmZlci5sZW5ndGggPj0gLSggLW5lZWRlZEJpdHMgPj4gMyApOwotfTsKLQotSUJ1ZmZlci5wcm90b3R5cGUuY2hlY2tCdWZmZXIgPSBmdW5jdGlvbiggbmVlZGVkQml0cyApewotICBpZiggIXRoaXMuaGFzTmVlZGVkQml0cyggbmVlZGVkQml0cyApICkgewotICAgIGNvbnNvbGUubG9nKCJtaXNzaW5nOiAiICsgbmVlZGVkQml0cyArICIgIiArIHRoaXMuYnVmZmVyLmxlbmd0aCk7Ci0gICAgdGhyb3cgbmV3IEVycm9yKCAiY2hlY2tCdWZmZXI6Om1pc3NpbmcgYnl0ZXMiICk7Ci0gIH0KLX07Ci0KLUlCdWZmZXIucHJvdG90eXBlLnJlYWRCaXRzID0gZnVuY3Rpb24oIHN0YXJ0LCBsZW5ndGggKXsKLSAgLy9zaGwgZml4OiBIZW5yaSBUb3JnZW1hbmUgfjE5OTYgKGNvbXByZXNzZWQgYnkgSm9uYXMgUmFvbmkpCi0gIGZ1bmN0aW9uIHNobCggYSwgYiApewotICAgIGZvciggOyBiLS07IGEgPSAoICggYSAlPSAweDdmZmZmZmZmICsgMSApICYgMHg0MDAwMDAwMCApID09IDB4NDAwMDAwMDAgPyBhICogMiA6ICggYSAtIDB4NDAwMDAwMDAgKSAqIDIgKyAweDdmZmZmZmZmICsgMSApOwotICAgIHJldHVybiBhOwotICB9Ci0gIGlmKCBzdGFydCA8IDAgfHwgbGVuZ3RoIDw9IDAgKQotICAgIHJldHVybiAwOwotICB0aGlzLmNoZWNrQnVmZmVyKCBzdGFydCArIGxlbmd0aCApOwotICBmb3IoIHZhciBvZmZzZXRMZWZ0LCBvZmZzZXRSaWdodCA9IHN0YXJ0ICUgOCwgY3VyQnl0ZSA9IHRoaXMuYnVmZmVyLmxlbmd0aCAtICggc3RhcnQgPj4gMyApIC0gMSwgbGFzdEJ5dGUgPSB0aGlzLmJ1ZmZlci5sZW5ndGggKyAoIC0oIHN0YXJ0ICsgbGVuZ3RoICkgPj4gMyApLCBkaWZmID0gY3VyQnl0ZSAtIGxhc3RCeXRlLCBzdW0gPSAoICggdGhpcy5idWZmZXJbIGN1ckJ5dGUgXSA+PiBvZmZzZXRSaWdodCApICYgKCAoIDEgPDwgKCBkaWZmID8gOCAtIG9mZnNldFJpZ2h0IDogbGVuZ3RoICkgKSAtIDEgKSApICsgKCBkaWZmICYmICggb2Zmc2V0TGVmdCA9ICggc3RhcnQgKyBsZW5ndGggKSAlIDggKSA/ICggdGhpcy5idWZmZXJbIGxhc3RCeXRlKysgXSAmICggKCAxIDw8IG9mZnNldExlZnQgKSAtIDEgKSApIDw8ICggZGlmZi0tIDw8IDMgKSAtIG9mZnNldFJpZ2h0IDogMCApOyBkaWZmOyBzdW0gKz0gc2hsKCB0aGlzLmJ1ZmZlclsgbGFzdEJ5dGUrKyBdLCAoIGRpZmYtLSA8PCAzICkgLSBvZmZzZXRSaWdodCApICk7Ci0gIHJldHVybiBzdW07Ci19OwotICAKLXAud2FybiA9IGZ1bmN0aW9uKCBtc2cgKXsKLSAgaWYoIHRoaXMuYWxsb3dFeGNlcHRpb25zICkKLSAgICB0aHJvdyBuZXcgRXJyb3IoIG1zZyApOwotICByZXR1cm4gMTsKLX07Ci1wLmRlY29kZUZsb2F0ID0gZnVuY3Rpb24oIGRhdGEsIHByZWNpc2lvbkJpdHMsIGV4cG9uZW50Qml0cyApewotICB2YXIgYiA9IG5ldyB0aGlzLklCdWZmZXIoIHRoaXMuYmlnRW5kaWFuLCBkYXRhICk7Ci0gIGIuY2hlY2tCdWZmZXIoIHByZWNpc2lvbkJpdHMgKyBleHBvbmVudEJpdHMgKyAxICk7Ci0gIHZhciBiaWFzID0gTWF0aC5wb3coIDIsIGV4cG9uZW50Qml0cyAtIDEgKSAtIDEsIHNpZ25hbCA9IGIucmVhZEJpdHMoIHByZWNpc2lvbkJpdHMgKyBleHBvbmVudEJpdHMsIDEgKSwgZXhwb25lbnQgPSBiLnJlYWRCaXRzKCBwcmVjaXNpb25CaXRzLCBleHBvbmVudEJpdHMgKSwgc2lnbmlmaWNhbmQgPSAwLAotICBkaXZpc29yID0gMiwgY3VyQnl0ZSA9IGIuYnVmZmVyLmxlbmd0aCArICggLXByZWNpc2lvbkJpdHMgPj4gMyApIC0gMTsKLSAgZG97Ci0gICAgZm9yKCB2YXIgYnl0ZVZhbHVlID0gYi5idWZmZXJbICsrY3VyQnl0ZSBdLCBzdGFydEJpdCA9IHByZWNpc2lvbkJpdHMgJSA4IHx8IDgsIG1hc2sgPSAxIDw8IHN0YXJ0Qml0OyBtYXNrID4+PSAxOyAoIGJ5dGVWYWx1ZSAmIG1hc2sgKSAmJiAoIHNpZ25pZmljYW5kICs9IDEgLyBkaXZpc29yICksIGRpdmlzb3IgKj0gMiApOwotICB9d2hpbGUoIHByZWNpc2lvbkJpdHMgLT0gc3RhcnRCaXQgKTsKLSAgcmV0dXJuIGV4cG9uZW50ID09ICggYmlhcyA8PCAxICkgKyAxID8gc2lnbmlmaWNhbmQgPyBOYU4gOiBzaWduYWwgPyAtSW5maW5pdHkgOiArSW5maW5pdHkgOiAoIDEgKyBzaWduYWwgKiAtMiApICogKCBleHBvbmVudCB8fCBzaWduaWZpY2FuZCA/ICFleHBvbmVudCA/IE1hdGgucG93KCAyLCAtYmlhcyArIDEgKSAqIHNpZ25pZmljYW5kIDogTWF0aC5wb3coIDIsIGV4cG9uZW50IC0gYmlhcyApICogKCAxICsgc2lnbmlmaWNhbmQgKSA6IDAgKTsKLX07Ci1wLmRlY29kZUludCA9IGZ1bmN0aW9uKCBkYXRhLCBiaXRzLCBzaWduZWQsIGZvcmNlQmlnRW5kaWFuICl7Ci0gIC8vY29uc29sZS5sb2coImRlY29kZUludDogIiwgZGF0YSwgYml0cywgc2lnbmVkKTsKLSAgdmFyIGIgPSBuZXcgdGhpcy5JQnVmZmVyKCB0aGlzLmJpZ0VuZGlhbnx8Zm9yY2VCaWdFbmRpYW4sIGRhdGEgKSwgeCA9IGIucmVhZEJpdHMoIDAsIGJpdHMgKSwgbWF4ID0gTWF0aC5wb3coIDIsIGJpdHMgKTsKLSAgcmV0dXJuIHNpZ25lZCAmJiB4ID49IG1heCAvIDIgPyB4IC0gbWF4IDogeDsKLX07Ci1wLmVuY29kZUZsb2F0ID0gZnVuY3Rpb24oIGRhdGEsIHByZWNpc2lvbkJpdHMsIGV4cG9uZW50Qml0cyApewotICB2YXIgYmlhcyA9IE1hdGgucG93KCAyLCBleHBvbmVudEJpdHMgLSAxICkgLSAxLCBtaW5FeHAgPSAtYmlhcyArIDEsIG1heEV4cCA9IGJpYXMsIG1pblVubm9ybUV4cCA9IG1pbkV4cCAtIHByZWNpc2lvbkJpdHMsCi0gIHN0YXR1cyA9IGlzTmFOKCBuID0gcGFyc2VGbG9hdCggZGF0YSApICkgfHwgbiA9PSAtSW5maW5pdHkgfHwgbiA9PSArSW5maW5pdHkgPyBuIDogMCwKLSAgZXhwID0gMCwgbGVuID0gMiAqIGJpYXMgKyAxICsgcHJlY2lzaW9uQml0cyArIDMsIGJpbiA9IG5ldyBBcnJheSggbGVuICksCi0gIHNpZ25hbCA9ICggbiA9IHN0YXR1cyAhPT0gMCA/IDAgOiBuICkgPCAwLCBuID0gTWF0aC5hYnMoIG4gKSwgaW50UGFydCA9IE1hdGguZmxvb3IoIG4gKSwgZmxvYXRQYXJ0ID0gbiAtIGludFBhcnQsCi0gIGksIGxhc3RCaXQsIHJvdW5kZWQsIGosIHJlc3VsdDsKLSAgZm9yKCBpID0gbGVuOyBpOyBiaW5bLS1pXSA9IDAgKTsKLSAgZm9yKCBpID0gYmlhcyArIDI7IGludFBhcnQgJiYgaTsgYmluWy0taV0gPSBpbnRQYXJ0ICUgMiwgaW50UGFydCA9IE1hdGguZmxvb3IoIGludFBhcnQgLyAyICkgKTsKLSAgZm9yKCBpID0gYmlhcyArIDE7IGZsb2F0UGFydCA+IDAgJiYgaTsgKCBiaW5bKytpXSA9ICggKCBmbG9hdFBhcnQgKj0gMiApID49IDEgKSAtIDAgKSAmJiAtLWZsb2F0UGFydCApOwotICBmb3IoIGkgPSAtMTsgKytpIDwgbGVuICYmICFiaW5baV07ICk7Ci0gIGlmKCBiaW5bKCBsYXN0Qml0ID0gcHJlY2lzaW9uQml0cyAtIDEgKyAoIGkgPSAoIGV4cCA9IGJpYXMgKyAxIC0gaSApID49IG1pbkV4cCAmJiBleHAgPD0gbWF4RXhwID8gaSArIDEgOiBiaWFzICsgMSAtICggZXhwID0gbWluRXhwIC0gMSApICkgKSArIDFdICl7Ci0gICAgaWYoICEoIHJvdW5kZWQgPSBiaW5bbGFzdEJpdF0gKSApewotICAgICAgZm9yKCBqID0gbGFzdEJpdCArIDI7ICFyb3VuZGVkICYmIGogPCBsZW47IHJvdW5kZWQgPSBiaW5baisrXSApOwotICAgIH0KLSAgICBmb3IoIGogPSBsYXN0Qml0ICsgMTsgcm91bmRlZCAmJiAtLWogPj0gMDsgKCBiaW5bal0gPSAhYmluW2pdIC0gMCApICYmICggcm91bmRlZCA9IDAgKSApOwotICB9Ci0gIGZvciggaSA9IGkgLSAyIDwgMCA/IC0xIDogaSAtIDM7ICsraSA8IGxlbiAmJiAhYmluW2ldOyApOwotICBpZiggKCBleHAgPSBiaWFzICsgMSAtIGkgKSA+PSBtaW5FeHAgJiYgZXhwIDw9IG1heEV4cCApCi0gICAgKytpOwotICBlbHNlIGlmKCBleHAgPCBtaW5FeHAgKXsKLSAgICBleHAgIT0gYmlhcyArIDEgLSBsZW4gJiYgZXhwIDwgbWluVW5ub3JtRXhwICYmIHRoaXMud2FybiggImVuY29kZUZsb2F0OjpmbG9hdCB1bmRlcmZsb3ciICk7Ci0gICAgaSA9IGJpYXMgKyAxIC0gKCBleHAgPSBtaW5FeHAgLSAxICk7Ci0gIH0KLSAgaWYoIGludFBhcnQgfHwgc3RhdHVzICE9PSAwICl7Ci0gICAgdGhpcy53YXJuKCBpbnRQYXJ0ID8gImVuY29kZUZsb2F0OjpmbG9hdCBvdmVyZmxvdyIgOiAiZW5jb2RlRmxvYXQ6OiIgKyBzdGF0dXMgKTsKLSAgICBleHAgPSBtYXhFeHAgKyAxOwotICAgIGkgPSBiaWFzICsgMjsKLSAgICBpZiggc3RhdHVzID09IC1JbmZpbml0eSApCi0gICAgICBzaWduYWwgPSAxOwotICAgIGVsc2UgaWYoIGlzTmFOKCBzdGF0dXMgKSApCi0gICAgICBiaW5baV0gPSAxOwotICB9Ci0gIGZvciggbiA9IE1hdGguYWJzKCBleHAgKyBiaWFzICksIGogPSBleHBvbmVudEJpdHMgKyAxLCByZXN1bHQgPSAiIjsgLS1qOyByZXN1bHQgPSAoIG4gJSAyICkgKyByZXN1bHQsIG4gPSBuID4+PSAxICk7Ci0gIGZvciggbiA9IDAsIGogPSAwLCBpID0gKCByZXN1bHQgPSAoIHNpZ25hbCA/ICIxIiA6ICIwIiApICsgcmVzdWx0ICsgYmluLnNsaWNlKCBpLCBpICsgcHJlY2lzaW9uQml0cyApLmpvaW4oICIiICkgKS5sZW5ndGgsIHIgPSBbXTsgaTsgaiA9ICggaiArIDEgKSAlIDggKXsKLSAgICBuICs9ICggMSA8PCBqICkgKiByZXN1bHQuY2hhckF0KCAtLWkgKTsKLSAgICBpZiggaiA9PSA3ICl7Ci0gICAgICByW3IubGVuZ3RoXSA9IG47Ci0gICAgICBuID0gMDsKLSAgICB9Ci0gIH0KLSAgaWYgKG4pIHsKLSAgICByW3IubGVuZ3RoXSA9IG47Ci0gIH0KLSAgcmV0dXJuIG5ldyBCdWZmZXIoIHRoaXMuYmlnRW5kaWFuID8gci5yZXZlcnNlKCkgOiByICk7Ci19OwotcC5lbmNvZGVJbnQgPSBmdW5jdGlvbiggZGF0YSwgYml0cywgc2lnbmVkLCBmb3JjZUJpZ0VuZGlhbiApewotICB2YXIgbWF4ID0gTWF0aC5wb3coIDIsIGJpdHMgKTsKLSAgKCBkYXRhID49IG1heCB8fCBkYXRhIDwgLSggbWF4IC8gMiApICkgJiYgdGhpcy53YXJuKCAiZW5jb2RlSW50OjpvdmVyZmxvdyIgKSAmJiAoIGRhdGEgPSAwICk7Ci0gIGRhdGEgPCAwICYmICggZGF0YSArPSBtYXggKTsKLSAgZm9yKCB2YXIgciA9IFtdOyBkYXRhOyByW3IubGVuZ3RoXSA9IGRhdGEgJSAyNTYsIGRhdGEgPSBNYXRoLmZsb29yKCBkYXRhIC8gMjU2ICkgKTsKLSAgZm9yKCBiaXRzID0gLSggLWJpdHMgPj4gMyApIC0gci5sZW5ndGg7IGJpdHMtLTsgcltyLmxlbmd0aF0gPSAwICk7Ci0gICAgICAgIHJldHVybiBuZXcgQnVmZmVyKCh0aGlzLmJpZ0VuZGlhbnx8Zm9yY2VCaWdFbmRpYW4pID8gci5yZXZlcnNlKCkgOiByICk7Ci19OwotcC50b1NtYWxsICAgID0gZnVuY3Rpb24oIGRhdGEgKXsgcmV0dXJuIHRoaXMuZGVjb2RlSW50KCBkYXRhLCAgOCwgdHJ1ZSAgKTsgfTsKLXAuZnJvbVNtYWxsICA9IGZ1bmN0aW9uKCBkYXRhICl7IHJldHVybiB0aGlzLmVuY29kZUludCggZGF0YSwgIDgsIHRydWUgICk7IH07Ci1wLnRvQnl0ZSAgICAgPSBmdW5jdGlvbiggZGF0YSApeyByZXR1cm4gdGhpcy5kZWNvZGVJbnQoIGRhdGEsICA4LCBmYWxzZSApOyB9OwotcC5mcm9tQnl0ZSAgID0gZnVuY3Rpb24oIGRhdGEgKXsgcmV0dXJuIHRoaXMuZW5jb2RlSW50KCBkYXRhLCAgOCwgZmFsc2UgKTsgfTsKLXAudG9TaG9ydCAgICA9IGZ1bmN0aW9uKCBkYXRhICl7IHJldHVybiB0aGlzLmRlY29kZUludCggZGF0YSwgMTYsIHRydWUgICk7IH07Ci1wLmZyb21TaG9ydCAgPSBmdW5jdGlvbiggZGF0YSApeyByZXR1cm4gdGhpcy5lbmNvZGVJbnQoIGRhdGEsIDE2LCB0cnVlICApOyB9OwotcC50b1dvcmQgICAgID0gZnVuY3Rpb24oIGRhdGEgKXsgcmV0dXJuIHRoaXMuZGVjb2RlSW50KCBkYXRhLCAxNiwgZmFsc2UgKTsgfTsKLXAuZnJvbVdvcmQgICA9IGZ1bmN0aW9uKCBkYXRhICl7IHJldHVybiB0aGlzLmVuY29kZUludCggZGF0YSwgMTYsIGZhbHNlICk7IH07Ci1wLnRvSW50ICAgICAgPSBmdW5jdGlvbiggZGF0YSApeyByZXR1cm4gdGhpcy5kZWNvZGVJbnQoIGRhdGEsIDMyLCB0cnVlICApOyB9OwotcC5mcm9tSW50ICAgID0gZnVuY3Rpb24oIGRhdGEgKXsgcmV0dXJuIHRoaXMuZW5jb2RlSW50KCBkYXRhLCAzMiwgdHJ1ZSAgKTsgfTsKLXAudG9Mb25nICAgICA9IGZ1bmN0aW9uKCBkYXRhICl7IHJldHVybiB0aGlzLmRlY29kZUludCggZGF0YSwgNjQsIHRydWUgICk7IH07Ci1wLmZyb21Mb25nICAgPSBmdW5jdGlvbiggZGF0YSApeyByZXR1cm4gdGhpcy5lbmNvZGVJbnQoIGRhdGEsIDY0LCB0cnVlICApOyB9OwotcC50b0RXb3JkICAgID0gZnVuY3Rpb24oIGRhdGEgKXsgcmV0dXJuIHRoaXMuZGVjb2RlSW50KCBkYXRhLCAzMiwgZmFsc2UgKTsgfTsKLXAuZnJvbURXb3JkICA9IGZ1bmN0aW9uKCBkYXRhICl7IHJldHVybiB0aGlzLmVuY29kZUludCggZGF0YSwgMzIsIGZhbHNlICk7IH07Ci1wLnRvUVdvcmQgICAgPSBmdW5jdGlvbiggZGF0YSApeyByZXR1cm4gdGhpcy5kZWNvZGVJbnQoIGRhdGEsIDY0LCB0cnVlICk7IH07Ci1wLmZyb21RV29yZCAgPSBmdW5jdGlvbiggZGF0YSApeyByZXR1cm4gdGhpcy5lbmNvZGVJbnQoIGRhdGEsIDY0LCB0cnVlICk7IH07Ci1wLnRvRmxvYXQgICAgPSBmdW5jdGlvbiggZGF0YSApeyByZXR1cm4gdGhpcy5kZWNvZGVGbG9hdCggZGF0YSwgMjMsIDggICApOyB9OwotcC5mcm9tRmxvYXQgID0gZnVuY3Rpb24oIGRhdGEgKXsgcmV0dXJuIHRoaXMuZW5jb2RlRmxvYXQoIGRhdGEsIDIzLCA4ICAgKTsgfTsKLXAudG9Eb3VibGUgICA9IGZ1bmN0aW9uKCBkYXRhICl7IHJldHVybiB0aGlzLmRlY29kZUZsb2F0KCBkYXRhLCA1MiwgMTEgICk7IH07Ci1wLmZyb21Eb3VibGUgPSBmdW5jdGlvbiggZGF0YSApeyByZXR1cm4gdGhpcy5lbmNvZGVGbG9hdCggZGF0YSwgNTIsIDExICApOyB9OwotCi0vLyBGYWN0b3Igb3V0IHRoZSBlbmNvZGUgc28gaXQgY2FuIGJlIHNoYXJlZCBieSBhZGRfaGVhZGVyIGFuZCBwdXNoX2ludDMyCi1wLmVuY29kZV9pbnQzMiA9IGZ1bmN0aW9uKG51bWJlcikgewotICB2YXIgYSwgYiwgYywgZCwgdW5zaWduZWQ7Ci0gIHVuc2lnbmVkID0gKG51bWJlciA8IDApID8gKG51bWJlciArIDB4MTAwMDAwMDAwKSA6IG51bWJlcjsKLSAgYSA9IE1hdGguZmxvb3IodW5zaWduZWQgLyAweGZmZmZmZik7Ci0gIHVuc2lnbmVkICY9IDB4ZmZmZmZmOwotICBiID0gTWF0aC5mbG9vcih1bnNpZ25lZCAvIDB4ZmZmZik7Ci0gIHVuc2lnbmVkICY9IDB4ZmZmZjsKLSAgYyA9IE1hdGguZmxvb3IodW5zaWduZWQgLyAweGZmKTsKLSAgdW5zaWduZWQgJj0gMHhmZjsKLSAgZCA9IE1hdGguZmxvb3IodW5zaWduZWQpOwotICByZXR1cm4gY2hyKGEpICsgY2hyKGIpICsgY2hyKGMpICsgY2hyKGQpOwotfTsKLQotcC5lbmNvZGVfaW50NjQgPSBmdW5jdGlvbihudW1iZXIpIHsKLSAgdmFyIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIHVuc2lnbmVkOwotICB1bnNpZ25lZCA9IChudW1iZXIgPCAwKSA/IChudW1iZXIgKyAweDEwMDAwMDAwMDAwMDAwMDAwKSA6IG51bWJlcjsKLSAgYSA9IE1hdGguZmxvb3IodW5zaWduZWQgLyAweGZmZmZmZmZmZmZmZmZmKTsKLSAgdW5zaWduZWQgJj0gMHhmZmZmZmZmZmZmZmZmZjsKLSAgYiA9IE1hdGguZmxvb3IodW5zaWduZWQgLyAweGZmZmZmZmZmZmZmZik7Ci0gIHVuc2lnbmVkICY9IDB4ZmZmZmZmZmZmZmZmOwotICBjID0gTWF0aC5mbG9vcih1bnNpZ25lZCAvIDB4ZmZmZmZmZmZmZik7Ci0gIHVuc2lnbmVkICY9IDB4ZmZmZmZmZmZmZjsKLSAgZCA9IE1hdGguZmxvb3IodW5zaWduZWQgLyAweGZmZmZmZmZmKTsKLSAgdW5zaWduZWQgJj0gMHhmZmZmZmZmZjsKLSAgZSA9IE1hdGguZmxvb3IodW5zaWduZWQgLyAweGZmZmZmZik7Ci0gIHVuc2lnbmVkICY9IDB4ZmZmZmZmOwotICBmID0gTWF0aC5mbG9vcih1bnNpZ25lZCAvIDB4ZmZmZik7Ci0gIHVuc2lnbmVkICY9IDB4ZmZmZjsKLSAgZyA9IE1hdGguZmxvb3IodW5zaWduZWQgLyAweGZmKTsKLSAgdW5zaWduZWQgJj0gMHhmZjsKLSAgaCA9IE1hdGguZmxvb3IodW5zaWduZWQpOwotICByZXR1cm4gY2hyKGEpICsgY2hyKGIpICsgY2hyKGMpICsgY2hyKGQpICsgY2hyKGUpICsgY2hyKGYpICsgY2hyKGcpICsgY2hyKGgpOwotfTsKLQotLyoqCi0gIFVURjggbWV0aG9kcwotKiovCi0KLS8vIFRha2UgYSByYXcgYmluYXJ5IHN0cmluZyBhbmQgcmV0dXJuIGEgdXRmOCBzdHJpbmcKLXAuZGVjb2RlX3V0ZjggPSBmdW5jdGlvbihhKSB7Ci0gIHZhciBzdHJpbmcgPSAiIjsKLSAgdmFyIGkgPSAwOwotICB2YXIgYyA9IGMxID0gYzIgPSAwOwotCi0gIHdoaWxlICggaSA8IGEubGVuZ3RoICkgewotICAgIGMgPSBhLmNoYXJDb2RlQXQoaSk7Ci0gICAgaWYgKGMgPCAxMjgpIHsKLSAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpOwotICAgICAgaSsrOwotICAgIH0gZWxzZSBpZigoYyA+IDE5MSkgJiYgKGMgPCAyMjQpKSB7Ci0gICAgICBjMiA9IGEuY2hhckNvZGVBdChpKzEpOwotICAgICAgc3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjICYgMzEpIDw8IDYpIHwgKGMyICYgNjMpKTsKLSAgICAgIGkgKz0gMjsKLSAgICB9IGVsc2UgewotICAgICAgYzIgPSBhLmNoYXJDb2RlQXQoaSsxKTsKLSAgICAgIGMzID0gYS5jaGFyQ29kZUF0KGkrMik7Ci0gICAgICBzdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgJiAxNSkgPDwgMTIpIHwgKChjMiAmIDYzKSA8PCA2KSB8IChjMyAmIDYzKSk7Ci0gICAgICBpICs9IDM7Ci0gICAgfQotICB9Ci0gIHJldHVybiBzdHJpbmc7Ci19OwotCi0vLyBFbmNvZGUgYSBjc3RyaW5nIGNvcnJlY3RseQotcC5lbmNvZGVfY3N0cmluZyA9IGZ1bmN0aW9uKHMpIHsgCi0gIHJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQocykpICsgcC5mcm9tQnl0ZSgwKTsKLX07Ci0KLS8vIFRha2UgYSB1dGY4IHN0cmluZyBhbmQgcmV0dXJuIGEgYmluYXJ5IHN0cmluZwotcC5lbmNvZGVfdXRmOCA9IGZ1bmN0aW9uKHMpIHsKLSAgdmFyIGE9IiI7Ci0gIGZvciAodmFyIG49MDsgbjwgcy5sZW5ndGg7IG4rKykgewotICAgIHZhciBjPXMuY2hhckNvZGVBdChuKTsKLSAgICBpZiAoYzwxMjgpIHsKLSAgICAgIGEgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjKTsKLSAgICB9IGVsc2UgaWYgKChjPjEyNykmJihjPDIwNDgpKSB7Ci0gICAgICBhICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoIChjPj42KSB8IDE5MikgOwotICAgICAgYSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCAoYyY2MykgfCAxMjgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBhICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoIChjPj4xMikgfCAyMjQpOwotICAgICAgYSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCAoKGM+PjYpICYgNjMpIHwgMTI4KTsKLSAgICAgIGEgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSggKGMmNjMpIHwgMTI4KTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGE7Ci19OwotCi1wLmhwcmludCA9IGZ1bmN0aW9uKHMpIHsKLSAgZm9yICh2YXIgaT0wOyBpPHMubGVuZ3RoOyBpKyspIHsKLSAgICBpZiAocy5jaGFyQ29kZUF0KGkpPDMyKSB7Ci0gICAgICB2YXIgbnVtYmVyID0gcy5jaGFyQ29kZUF0KGkpIDw9IDE1ID8gIjAiICsgcy5jaGFyQ29kZUF0KGkpLnRvU3RyaW5nKDE2KSA6IHMuY2hhckNvZGVBdChpKS50b1N0cmluZygxNik7Ci0gICAgICBzeXMuZGVidWcobnVtYmVyKycgOiAnKTt9Ci0gICAgZWxzZSB7Ci0gICAgICB2YXIgbnVtYmVyID0gcy5jaGFyQ29kZUF0KGkpIDw9IDE1ID8gIjAiICsgcy5jaGFyQ29kZUF0KGkpLnRvU3RyaW5nKDE2KSA6IHMuY2hhckNvZGVBdChpKS50b1N0cmluZygxNik7ICAgICAgCi0gICAgICBzeXMuZGVidWcobnVtYmVyKycgOiAnKyBzLmNoYXJBdChpKSk7fQotICB9Ci19OwotCi1wLnRvX2J5dGVfYXJyYXkgPSBmdW5jdGlvbihzKSB7Ci0gIHZhciBhcnJheSA9IFtdOwotICAKLSAgZm9yICh2YXIgaT0wOyBpPHMubGVuZ3RoOyBpKyspIHsKLSAgICBpZiAocy5jaGFyQ29kZUF0KGkpPDMyKSB7YXJyYXkucHVzaChzLmNoYXJDb2RlQXQoaSkpO30KLSAgICBlbHNlIHthcnJheS5wdXNoKHMuY2hhckNvZGVBdChpKSl9ICAgIAotICB9ICAKLSAgCi0gIHN5cy5wdXRzKGFycmF5KTsKLX0KLQotcC5wcHJpbnQgPSBmdW5jdGlvbihzKSB7Ci0gIGZvciAodmFyIGk9MDsgaTxzLmxlbmd0aDsgaSsrKSB7Ci0gICAgaWYgKHMuY2hhckNvZGVBdChpKTwzMikge3N5cy5wdXRzKHMuY2hhckNvZGVBdChpKSsnIDogJyk7fQotICAgIGVsc2Uge3N5cy5wdXRzKHMuY2hhckNvZGVBdChpKSsnIDogJysgcy5jaGFyQXQoaSkpO30KLSAgfQotfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9iaW5hcnlfcHJvdG9jb2wuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvYmluYXJ5X3Byb3RvY29sLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1N2M4YzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvYmluYXJ5X3Byb3RvY29sLmpzCkBAIC0wLDAgKzEsMzY1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciBsb2cgPSByZXF1aXJlKCcuL2xvZycpOwordmFyIGJpbmFyeSA9IHJlcXVpcmUoJy4vYmluYXJ5Jyk7Cit2YXIgSW50NjQgPSByZXF1aXJlKCdub2RlLWludDY0Jyk7Cit2YXIgVGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKK3ZhciBUeXBlID0gVGhyaWZ0LlR5cGU7CisKK21vZHVsZS5leHBvcnRzID0gVEJpbmFyeVByb3RvY29sOworCisvLyBKYXZhU2NyaXB0IHN1cHBvcnRzIG9ubHkgbnVtZXJpYyBkb3VibGVzLCB0aGVyZWZvcmUgZXZlbiBoZXggdmFsdWVzIGFyZSBhbHdheXMgc2lnbmVkLgorLy8gVGhlIGxhcmdlc3QgaW50ZWdlciB2YWx1ZSB3aGljaCBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gSmF2YVNjcmlwdCBpcyArLy0yXjUzLgorLy8gQml0d2lzZSBvcGVyYXRpb25zIGNvbnZlcnQgbnVtYmVycyB0byAzMiBiaXQgaW50ZWdlcnMgYnV0IHBlcmZvcm0gc2lnbiBleHRlbnNpb24KKy8vIHVwb24gYXNzaWduaW5nIHZhbHVlcyBiYWNrIHRvIHZhcmlhYmxlcy4KK3ZhciBWRVJTSU9OX01BU0sgPSAtNjU1MzYsICAgLy8gMHhmZmZmMDAwMAorICAgIFZFUlNJT05fMSA9IC0yMTQ3NDE4MTEyLCAvLyAweDgwMDEwMDAwCisgICAgVFlQRV9NQVNLID0gMHgwMDAwMDBmZjsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sKHRyYW5zLCBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSkgeworICB0aGlzLnRyYW5zID0gdHJhbnM7CisgIHRoaXMuc3RyaWN0UmVhZCA9IChzdHJpY3RSZWFkICE9PSB1bmRlZmluZWQgPyBzdHJpY3RSZWFkIDogZmFsc2UpOworICB0aGlzLnN0cmljdFdyaXRlID0gKHN0cmljdFdyaXRlICE9PSB1bmRlZmluZWQgPyBzdHJpY3RXcml0ZSA6IHRydWUpOworICB0aGlzLl9zZXFpZCA9IG51bGw7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnRyYW5zLmZsdXNoKCk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luID0gZnVuY3Rpb24obmFtZSwgdHlwZSwgc2VxaWQpIHsKKyAgICBpZiAodGhpcy5zdHJpY3RXcml0ZSkgeworICAgICAgdGhpcy53cml0ZUkzMihWRVJTSU9OXzEgfCB0eXBlKTsKKyAgICAgIHRoaXMud3JpdGVTdHJpbmcobmFtZSk7CisgICAgICB0aGlzLndyaXRlSTMyKHNlcWlkKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy53cml0ZVN0cmluZyhuYW1lKTsKKyAgICAgIHRoaXMud3JpdGVCeXRlKHR5cGUpOworICAgICAgdGhpcy53cml0ZUkzMihzZXFpZCk7CisgICAgfQorICAgIC8vIFJlY29yZCBjbGllbnQgc2VxaWQgdG8gZmluZCBjYWxsYmFjayBhZ2FpbgorICAgIGlmICh0aGlzLl9zZXFpZCAhPT0gbnVsbCkgeworICAgICAgbG9nLndhcm5pbmcoJ1NlcUlkIGFscmVhZHkgc2V0JywgeyAnbmFtZSc6IG5hbWUgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuX3NlcWlkID0gc2VxaWQ7CisgICAgICB0aGlzLnRyYW5zLnNldEN1cnJTZXFJZChzZXFpZCk7CisgICAgfQorfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKKyAgICBpZiAodGhpcy5fc2VxaWQgIT09IG51bGwpIHsKKyAgICAgICAgdGhpcy5fc2VxaWQgPSBudWxsOworICAgIH0gZWxzZSB7CisgICAgICAgIGxvZy53YXJuaW5nKCdObyBzZXFpZCB0byB1bnNldCcpOworICAgIH0KK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJ1Y3RCZWdpbiA9IGZ1bmN0aW9uKG5hbWUpIHsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJ1Y3RFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZEJlZ2luID0gZnVuY3Rpb24obmFtZSwgdHlwZSwgaWQpIHsKKyAgdGhpcy53cml0ZUJ5dGUodHlwZSk7CisgIHRoaXMud3JpdGVJMTYoaWQpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkRW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRTdG9wID0gZnVuY3Rpb24oKSB7CisgIHRoaXMud3JpdGVCeXRlKFR5cGUuU1RPUCk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWFwQmVnaW4gPSBmdW5jdGlvbihrdHlwZSwgdnR5cGUsIHNpemUpIHsKKyAgdGhpcy53cml0ZUJ5dGUoa3R5cGUpOworICB0aGlzLndyaXRlQnl0ZSh2dHlwZSk7CisgIHRoaXMud3JpdGVJMzIoc2l6ZSk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWFwRW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTGlzdEJlZ2luID0gZnVuY3Rpb24oZXR5cGUsIHNpemUpIHsKKyAgdGhpcy53cml0ZUJ5dGUoZXR5cGUpOworICB0aGlzLndyaXRlSTMyKHNpemUpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTZXRCZWdpbiA9IGZ1bmN0aW9uKGV0eXBlLCBzaXplKSB7CisgIHRoaXMud3JpdGVCeXRlKGV0eXBlKTsKKyAgdGhpcy53cml0ZUkzMihzaXplKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTZXRFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCb29sID0gZnVuY3Rpb24oYm9vbCkgeworICBpZiAoYm9vbCkgeworICAgIHRoaXMud3JpdGVCeXRlKDEpOworICB9IGVsc2UgeworICAgIHRoaXMud3JpdGVCeXRlKDApOworICB9Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlQnl0ZSA9IGZ1bmN0aW9uKGIpIHsKKyAgdGhpcy50cmFucy53cml0ZShuZXcgQnVmZmVyKFtiXSkpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUkxNiA9IGZ1bmN0aW9uKGkxNikgeworICB0aGlzLnRyYW5zLndyaXRlKGJpbmFyeS53cml0ZUkxNihuZXcgQnVmZmVyKDIpLCBpMTYpKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVJMzIgPSBmdW5jdGlvbihpMzIpIHsKKyAgdGhpcy50cmFucy53cml0ZShiaW5hcnkud3JpdGVJMzIobmV3IEJ1ZmZlcig0KSwgaTMyKSk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlSTY0ID0gZnVuY3Rpb24oaTY0KSB7CisgIGlmIChpNjQuYnVmZmVyKSB7CisgICAgdGhpcy50cmFucy53cml0ZShpNjQuYnVmZmVyKTsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLnRyYW5zLndyaXRlKG5ldyBJbnQ2NChpNjQpLmJ1ZmZlcik7CisgIH0KK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVEb3VibGUgPSBmdW5jdGlvbihkdWIpIHsKKyAgdGhpcy50cmFucy53cml0ZShiaW5hcnkud3JpdGVEb3VibGUobmV3IEJ1ZmZlcig4KSwgZHViKSk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RyaW5nT3JCaW5hcnkgPSBmdW5jdGlvbihuYW1lLCBlbmNvZGluZywgYXJnKSB7CisgIGlmICh0eXBlb2YoYXJnKSA9PT0gJ3N0cmluZycpIHsKKyAgICB0aGlzLndyaXRlSTMyKEJ1ZmZlci5ieXRlTGVuZ3RoKGFyZywgZW5jb2RpbmcpKTsKKyAgICB0aGlzLnRyYW5zLndyaXRlKG5ldyBCdWZmZXIoYXJnLCBlbmNvZGluZykpOworICB9IGVsc2UgaWYgKChhcmcgaW5zdGFuY2VvZiBCdWZmZXIpIHx8CisgICAgICAgICAgICAgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpID09ICdbb2JqZWN0IFVpbnQ4QXJyYXldJykpIHsKKyAgICAvLyBCdWZmZXJzIGluIE5vZGUuanMgdW5kZXIgQnJvd3NlcmlmeSBtYXkgZXh0ZW5kIFVJbnQ4QXJyYXkgaW5zdGVhZCBvZgorICAgIC8vIGRlZmluaW5nIGEgbmV3IG9iamVjdC4gV2UgZGV0ZWN0IHRoZW0gaGVyZSBzbyB3ZSBjYW4gd3JpdGUgdGhlbQorICAgIC8vIGNvcnJlY3RseQorICAgIHRoaXMud3JpdGVJMzIoYXJnLmxlbmd0aCk7CisgICAgdGhpcy50cmFucy53cml0ZShhcmcpOworICB9IGVsc2UgeworICAgIHRocm93IG5ldyBFcnJvcihuYW1lICsgJyBjYWxsZWQgd2l0aG91dCBhIHN0cmluZy9CdWZmZXIgYXJndW1lbnQ6ICcgKyBhcmcpOworICB9Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RyaW5nID0gZnVuY3Rpb24oYXJnKSB7CisgIHRoaXMud3JpdGVTdHJpbmdPckJpbmFyeSgnd3JpdGVTdHJpbmcnLCAndXRmOCcsIGFyZyk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlQmluYXJ5ID0gZnVuY3Rpb24oYXJnKSB7CisgIHRoaXMud3JpdGVTdHJpbmdPckJpbmFyeSgnd3JpdGVCaW5hcnknLCAnYmluYXJ5JywgYXJnKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgc3ogPSB0aGlzLnJlYWRJMzIoKTsKKyAgdmFyIHR5cGUsIG5hbWUsIHNlcWlkOworCisgIGlmIChzeiA8IDApIHsKKyAgICB2YXIgdmVyc2lvbiA9IHN6ICYgVkVSU0lPTl9NQVNLOworICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkgeworICAgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuQkFEX1ZFUlNJT04sICJCYWQgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luOiAiICsgc3opOworICAgIH0KKyAgICB0eXBlID0gc3ogJiBUWVBFX01BU0s7CisgICAgbmFtZSA9IHRoaXMucmVhZFN0cmluZygpOworICAgIHNlcWlkID0gdGhpcy5yZWFkSTMyKCk7CisgIH0gZWxzZSB7CisgICAgaWYgKHRoaXMuc3RyaWN0UmVhZCkgeworICAgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuQkFEX1ZFUlNJT04sICJObyBwcm90b2NvbCB2ZXJzaW9uIGhlYWRlciIpOworICAgIH0KKyAgICBuYW1lID0gdGhpcy50cmFucy5yZWFkKHN6KTsKKyAgICB0eXBlID0gdGhpcy5yZWFkQnl0ZSgpOworICAgIHNlcWlkID0gdGhpcy5yZWFkSTMyKCk7CisgIH0KKyAgcmV0dXJuIHtmbmFtZTogbmFtZSwgbXR5cGU6IHR5cGUsIHJzZXFpZDogc2VxaWR9OworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkTWVzc2FnZUVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RydWN0QmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHtmbmFtZTogJyd9OworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RydWN0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRGaWVsZEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHZhciB0eXBlID0gdGhpcy5yZWFkQnl0ZSgpOworICBpZiAodHlwZSA9PSBUeXBlLlNUT1ApIHsKKyAgICByZXR1cm4ge2ZuYW1lOiBudWxsLCBmdHlwZTogdHlwZSwgZmlkOiAwfTsKKyAgfQorICB2YXIgaWQgPSB0aGlzLnJlYWRJMTYoKTsKKyAgcmV0dXJuIHtmbmFtZTogbnVsbCwgZnR5cGU6IHR5cGUsIGZpZDogaWR9OworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkRmllbGRFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZE1hcEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHZhciBrdHlwZSA9IHRoaXMucmVhZEJ5dGUoKTsKKyAgdmFyIHZ0eXBlID0gdGhpcy5yZWFkQnl0ZSgpOworICB2YXIgc2l6ZSA9IHRoaXMucmVhZEkzMigpOworICByZXR1cm4ge2t0eXBlOiBrdHlwZSwgdnR5cGU6IHZ0eXBlLCBzaXplOiBzaXplfTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZE1hcEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkTGlzdEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHZhciBldHlwZSA9IHRoaXMucmVhZEJ5dGUoKTsKKyAgdmFyIHNpemUgPSB0aGlzLnJlYWRJMzIoKTsKKyAgcmV0dXJuIHtldHlwZTogZXR5cGUsIHNpemU6IHNpemV9OworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkTGlzdEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkU2V0QmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdmFyIGV0eXBlID0gdGhpcy5yZWFkQnl0ZSgpOworICB2YXIgc2l6ZSA9IHRoaXMucmVhZEkzMigpOworICByZXR1cm4ge2V0eXBlOiBldHlwZSwgc2l6ZTogc2l6ZX07Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRTZXRFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEJvb2wgPSBmdW5jdGlvbigpIHsKKyAgdmFyIGIgPSB0aGlzLnJlYWRCeXRlKCk7CisgIGlmIChiID09PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkQnl0ZSA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy50cmFucy5yZWFkQnl0ZSgpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkSTE2ID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnRyYW5zLnJlYWRJMTYoKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEkzMiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy50cmFucy5yZWFkSTMyKCk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRJNjQgPSBmdW5jdGlvbigpIHsKKyAgdmFyIGJ1ZmYgPSB0aGlzLnRyYW5zLnJlYWQoOCk7CisgIHJldHVybiBuZXcgSW50NjQoYnVmZik7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWREb3VibGUgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZERvdWJsZSgpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkQmluYXJ5ID0gZnVuY3Rpb24oKSB7CisgIHZhciBsZW4gPSB0aGlzLnJlYWRJMzIoKTsKKyAgaWYgKGxlbiA9PT0gMCkgeworICAgIHJldHVybiBuZXcgQnVmZmVyKDApOworICB9CisKKyAgaWYgKGxlbiA8IDApIHsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5ORUdBVElWRV9TSVpFLCAiTmVnYXRpdmUgYmluYXJ5IHNpemUiKTsKKyAgfQorICByZXR1cm4gdGhpcy50cmFucy5yZWFkKGxlbik7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJpbmcgPSBmdW5jdGlvbigpIHsKKyAgdmFyIGxlbiA9IHRoaXMucmVhZEkzMigpOworICBpZiAobGVuID09PSAwKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgaWYgKGxlbiA8IDApIHsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5ORUdBVElWRV9TSVpFLCAiTmVnYXRpdmUgc3RyaW5nIHNpemUiKTsKKyAgfQorICByZXR1cm4gdGhpcy50cmFucy5yZWFkU3RyaW5nKGxlbik7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLmdldFRyYW5zcG9ydCA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy50cmFuczsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uKHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUeXBlLlNUT1A6CisgICAgICByZXR1cm47CisgICAgY2FzZSBUeXBlLkJPT0w6CisgICAgICB0aGlzLnJlYWRCb29sKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuQllURToKKyAgICAgIHRoaXMucmVhZEJ5dGUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JMTY6CisgICAgICB0aGlzLnJlYWRJMTYoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JMzI6CisgICAgICB0aGlzLnJlYWRJMzIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JNjQ6CisgICAgICB0aGlzLnJlYWRJNjQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5ET1VCTEU6CisgICAgICB0aGlzLnJlYWREb3VibGUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5TVFJJTkc6CisgICAgICB0aGlzLnJlYWRTdHJpbmcoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5TVFJVQ1Q6CisgICAgICB0aGlzLnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIGlmIChyLmZ0eXBlID09PSBUeXBlLlNUT1ApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnNraXAoci5mdHlwZSk7CisgICAgICAgIHRoaXMucmVhZEZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5NQVA6CisgICAgICB2YXIgbWFwQmVnaW4gPSB0aGlzLnJlYWRNYXBCZWdpbigpOworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXBCZWdpbi5zaXplOyArK2kpIHsKKyAgICAgICAgdGhpcy5za2lwKG1hcEJlZ2luLmt0eXBlKTsKKyAgICAgICAgdGhpcy5za2lwKG1hcEJlZ2luLnZ0eXBlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZE1hcEVuZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLlNFVDoKKyAgICAgIHZhciBzZXRCZWdpbiA9IHRoaXMucmVhZFNldEJlZ2luKCk7CisgICAgICBmb3IgKHZhciBpMiA9IDA7IGkyIDwgc2V0QmVnaW4uc2l6ZTsgKytpMikgeworICAgICAgICB0aGlzLnNraXAoc2V0QmVnaW4uZXR5cGUpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkU2V0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuTElTVDoKKyAgICAgIHZhciBsaXN0QmVnaW4gPSB0aGlzLnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgIGZvciAodmFyIGkzID0gMDsgaTMgPCBsaXN0QmVnaW4uc2l6ZTsgKytpMykgeworICAgICAgICB0aGlzLnNraXAobGlzdEJlZ2luLmV0eXBlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZExpc3RFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBuZXcgIEVycm9yKCJJbnZhbGlkIHR5cGU6ICIgKyB0eXBlKTsKKyAgfQorfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9icm93c2VyLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Jyb3dzZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdjZTg1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9icm93c2VyLmpzCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK2V4cG9ydHMuVGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKKwordmFyIHhockNvbm5lY3Rpb24gPSByZXF1aXJlKCcuL3hocl9jb25uZWN0aW9uJyk7CitleHBvcnRzLlhIUkNvbm5lY3Rpb24gPSB4aHJDb25uZWN0aW9uLlhIUkNvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZVhIUkNvbm5lY3Rpb24gPSB4aHJDb25uZWN0aW9uLmNyZWF0ZVhIUkNvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZVhIUkNsaWVudCA9IHhockNvbm5lY3Rpb24uY3JlYXRlWEhSQ2xpZW50OworCitleHBvcnRzLk11bHRpcGxleGVyID0gcmVxdWlyZSgnLi9tdWx0aXBsZXhlZF9wcm90b2NvbCcpLk11bHRpcGxleGVyOworCitleHBvcnRzLlRXZWJTb2NrZXRUcmFuc3BvcnQgPSByZXF1aXJlKCcuL3dzX3RyYW5zcG9ydCcpOworZXhwb3J0cy5UQnVmZmVyZWRUcmFuc3BvcnQgPSByZXF1aXJlKCcuL2J1ZmZlcmVkX3RyYW5zcG9ydCcpOworZXhwb3J0cy5URnJhbWVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9mcmFtZWRfdHJhbnNwb3J0Jyk7CisKK2V4cG9ydHMuUHJvdG9jb2wgPSBleHBvcnRzLlRKU09OUHJvdG9jb2wgPSByZXF1aXJlKCcuL2pzb25fcHJvdG9jb2wnKTsKK2V4cG9ydHMuVEJpbmFyeVByb3RvY29sID0gcmVxdWlyZSgnLi9iaW5hcnlfcHJvdG9jb2wnKTsKK2V4cG9ydHMuVENvbXBhY3RQcm90b2NvbCA9IHJlcXVpcmUoJy4vY29tcGFjdF9wcm90b2NvbCcpOworCitleHBvcnRzLkludDY0ID0gcmVxdWlyZSgnbm9kZS1pbnQ2NCcpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTllMDA2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnQuanMKQEAgLTAsMCArMSwxODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIGJpbmFyeSA9IHJlcXVpcmUoJy4vYmluYXJ5Jyk7Cit2YXIgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yID0gcmVxdWlyZSgnLi9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3InKTsKKworbW9kdWxlLmV4cG9ydHMgPSBUQnVmZmVyZWRUcmFuc3BvcnQ7CisKK2Z1bmN0aW9uIFRCdWZmZXJlZFRyYW5zcG9ydChidWZmZXIsIGNhbGxiYWNrKSB7CisgIHRoaXMuZGVmYXVsdFJlYWRCdWZmZXJTaXplID0gMTAyNDsKKyAgdGhpcy53cml0ZUJ1ZmZlclNpemUgPSA1MTI7IC8vIFNvZnQgTGltaXQKKyAgdGhpcy5pbkJ1ZiA9IG5ldyBCdWZmZXIodGhpcy5kZWZhdWx0UmVhZEJ1ZmZlclNpemUpOworICB0aGlzLnJlYWRDdXJzb3IgPSAwOworICB0aGlzLndyaXRlQ3Vyc29yID0gMDsgLy8gZm9yIGlucHV0IGJ1ZmZlcgorICB0aGlzLm91dEJ1ZmZlcnMgPSBbXTsKKyAgdGhpcy5vdXRDb3VudCA9IDA7CisgIHRoaXMub25GbHVzaCA9IGNhbGxiYWNrOworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmluQnVmID0gbmV3IEJ1ZmZlcih0aGlzLmRlZmF1bHRSZWFkQnVmZmVyU2l6ZSk7CisgIHRoaXMucmVhZEN1cnNvciA9IDA7CisgIHRoaXMud3JpdGVDdXJzb3IgPSAwOworICB0aGlzLm91dEJ1ZmZlcnMgPSBbXTsKKyAgdGhpcy5vdXRDb3VudCA9IDA7Cit9CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5yZWNlaXZlciA9IGZ1bmN0aW9uKGNhbGxiYWNrLCBzZXFpZCkgeworICB2YXIgcmVhZGVyID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgpOworCisgIHJldHVybiBmdW5jdGlvbihkYXRhKSB7CisgICAgaWYgKHJlYWRlci53cml0ZUN1cnNvciArIGRhdGEubGVuZ3RoID4gcmVhZGVyLmluQnVmLmxlbmd0aCkgeworICAgICAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIocmVhZGVyLndyaXRlQ3Vyc29yICsgZGF0YS5sZW5ndGgpOworICAgICAgcmVhZGVyLmluQnVmLmNvcHkoYnVmLCAwLCAwLCByZWFkZXIud3JpdGVDdXJzb3IpOworICAgICAgcmVhZGVyLmluQnVmID0gYnVmOworICAgIH0KKyAgICBkYXRhLmNvcHkocmVhZGVyLmluQnVmLCByZWFkZXIud3JpdGVDdXJzb3IsIDApOworICAgIHJlYWRlci53cml0ZUN1cnNvciArPSBkYXRhLmxlbmd0aDsKKworICAgIGNhbGxiYWNrKHJlYWRlciwgc2VxaWQpOworICB9OworfTsKKworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLmNvbW1pdFBvc2l0aW9uID0gZnVuY3Rpb24oKXsKKyAgdmFyIHVucmVhZFNpemUgPSB0aGlzLndyaXRlQ3Vyc29yIC0gdGhpcy5yZWFkQ3Vyc29yOworICB2YXIgYnVmU2l6ZSA9ICh1bnJlYWRTaXplICogMiA+IHRoaXMuZGVmYXVsdFJlYWRCdWZmZXJTaXplKSA/CisgICAgdW5yZWFkU2l6ZSAqIDIgOiB0aGlzLmRlZmF1bHRSZWFkQnVmZmVyU2l6ZTsKKyAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoYnVmU2l6ZSk7CisgIGlmICh1bnJlYWRTaXplID4gMCkgeworICAgIHRoaXMuaW5CdWYuY29weShidWYsIDAsIHRoaXMucmVhZEN1cnNvciwgdGhpcy53cml0ZUN1cnNvcik7CisgIH0KKyAgdGhpcy5yZWFkQ3Vyc29yID0gMDsKKyAgdGhpcy53cml0ZUN1cnNvciA9IHVucmVhZFNpemU7CisgIHRoaXMuaW5CdWYgPSBidWY7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLnJvbGxiYWNrUG9zaXRpb24gPSBmdW5jdGlvbigpeworICB0aGlzLnJlYWRDdXJzb3IgPSAwOworfQorCisgIC8vIFRPRE86IEltcGxlbWVudCBvcGVuL2Nsb3NlIHN1cHBvcnQKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUuaXNPcGVuID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0cnVlOworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oKSB7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oKSB7Cit9OworCisgIC8vIFNldCB0aGUgc2VxaWQgb2YgdGhlIG1lc3NhZ2UgaW4gdGhlIGNsaWVudAorICAvLyBTbyB0aGF0IGNhbGxiYWNrcyBjYW4gYmUgZm91bmQKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUuc2V0Q3VyclNlcUlkID0gZnVuY3Rpb24oc2VxaWQpIHsKKyAgdGhpcy5fc2VxaWQgPSBzZXFpZDsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUuZW5zdXJlQXZhaWxhYmxlID0gZnVuY3Rpb24obGVuKSB7CisgIGlmICh0aGlzLnJlYWRDdXJzb3IgKyBsZW4gPiB0aGlzLndyaXRlQ3Vyc29yKSB7CisgICAgdGhyb3cgbmV3IElucHV0QnVmZmVyVW5kZXJydW5FcnJvcigpOworICB9Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihsZW4pIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUobGVuKTsKKyAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIobGVuKTsKKyAgdGhpcy5pbkJ1Zi5jb3B5KGJ1ZiwgMCwgdGhpcy5yZWFkQ3Vyc29yLCB0aGlzLnJlYWRDdXJzb3IgKyBsZW4pOworICB0aGlzLnJlYWRDdXJzb3IgKz0gbGVuOworICByZXR1cm4gYnVmOworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkQnl0ZSA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmVuc3VyZUF2YWlsYWJsZSgxKTsKKyAgcmV0dXJuIGJpbmFyeS5yZWFkQnl0ZSh0aGlzLmluQnVmW3RoaXMucmVhZEN1cnNvcisrXSk7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRJMTYgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUoMik7CisgIHZhciBpMTYgPSBiaW5hcnkucmVhZEkxNih0aGlzLmluQnVmLCB0aGlzLnJlYWRDdXJzb3IpOworICB0aGlzLnJlYWRDdXJzb3IgKz0gMjsKKyAgcmV0dXJuIGkxNjsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUucmVhZEkzMiA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmVuc3VyZUF2YWlsYWJsZSg0KTsKKyAgdmFyIGkzMiA9IGJpbmFyeS5yZWFkSTMyKHRoaXMuaW5CdWYsIHRoaXMucmVhZEN1cnNvcik7CisgIHRoaXMucmVhZEN1cnNvciArPSA0OworICByZXR1cm4gaTMyOworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkRG91YmxlID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKDgpOworICB2YXIgZCA9IGJpbmFyeS5yZWFkRG91YmxlKHRoaXMuaW5CdWYsIHRoaXMucmVhZEN1cnNvcik7CisgIHRoaXMucmVhZEN1cnNvciArPSA4OworICByZXR1cm4gZDsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUucmVhZFN0cmluZyA9IGZ1bmN0aW9uKGxlbikgeworICB0aGlzLmVuc3VyZUF2YWlsYWJsZShsZW4pOworICB2YXIgc3RyID0gdGhpcy5pbkJ1Zi50b1N0cmluZygndXRmOCcsIHRoaXMucmVhZEN1cnNvciwgdGhpcy5yZWFkQ3Vyc29yICsgbGVuKTsKKyAgdGhpcy5yZWFkQ3Vyc29yICs9IGxlbjsKKyAgcmV0dXJuIHN0cjsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUuYm9ycm93ID0gZnVuY3Rpb24oKSB7CisgIHZhciBvYmogPSB7YnVmOiB0aGlzLmluQnVmLCByZWFkSW5kZXg6IHRoaXMucmVhZEN1cnNvciwgd3JpdGVJbmRleDogdGhpcy53cml0ZUN1cnNvcn07CisgIHJldHVybiBvYmo7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLmNvbnN1bWUgPSBmdW5jdGlvbihieXRlc0NvbnN1bWVkKSB7CisgIHRoaXMucmVhZEN1cnNvciArPSBieXRlc0NvbnN1bWVkOworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZikgeworICBpZiAodHlwZW9mKGJ1ZikgPT09ICJzdHJpbmciKSB7CisgICAgYnVmID0gbmV3IEJ1ZmZlcihidWYsICd1dGY4Jyk7CisgIH0KKyAgdGhpcy5vdXRCdWZmZXJzLnB1c2goYnVmKTsKKyAgdGhpcy5vdXRDb3VudCArPSBidWYubGVuZ3RoOworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKCkgeworICAvLyBJZiB0aGUgc2VxaWQgb2YgdGhlIGNhbGxiYWNrIGlzIGF2YWlsYWJsZSBwYXNzIGl0IHRvIHRoZSBvbkZsdXNoCisgIC8vIFRoZW4gcmVtb3ZlIHRoZSBjdXJyZW50IHNlcWlkCisgIHZhciBzZXFpZCA9IHRoaXMuX3NlcWlkOworICB0aGlzLl9zZXFpZCA9IG51bGw7CisKKyAgaWYgKHRoaXMub3V0Q291bnQgPCAxKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdmFyIG1zZyA9IG5ldyBCdWZmZXIodGhpcy5vdXRDb3VudCksCisgICAgICBwb3MgPSAwOworICB0aGlzLm91dEJ1ZmZlcnMuZm9yRWFjaChmdW5jdGlvbihidWYpIHsKKyAgICBidWYuY29weShtc2csIHBvcywgMCk7CisgICAgcG9zICs9IGJ1Zi5sZW5ndGg7CisgIH0pOworCisgIGlmICh0aGlzLm9uRmx1c2gpIHsKKyAgICAvLyBQYXNzaW5nIHNlcWlkIHRocm91Z2ggdGhpcyBjYWxsIHRvIGdldCBpdCB0byB0aGUgY29ubmVjdGlvbgorICAgIHRoaXMub25GbHVzaChtc2csIHNlcWlkKTsKKyAgfQorCisgIHRoaXMub3V0QnVmZmVycyA9IFtdOworICB0aGlzLm91dENvdW50ID0gMDsKK30KZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9jb21wYWN0X3Byb3RvY29sLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2wuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1MzFlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9jb21wYWN0X3Byb3RvY29sLmpzCkBAIC0wLDAgKzEsOTE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciBsb2cgPSByZXF1aXJlKCcuL2xvZycpOwordmFyIEludDY0ID0gcmVxdWlyZSgnbm9kZS1pbnQ2NCcpOwordmFyIFRocmlmdCA9IHJlcXVpcmUoJy4vdGhyaWZ0Jyk7Cit2YXIgVHlwZSA9IFRocmlmdC5UeXBlOworCittb2R1bGUuZXhwb3J0cyA9IFRDb21wYWN0UHJvdG9jb2w7CisKK3ZhciBQT1dfOCA9IE1hdGgucG93KDIsIDgpOwordmFyIFBPV18yNCA9IE1hdGgucG93KDIsIDI0KTsKK3ZhciBQT1dfMzIgPSBNYXRoLnBvdygyLCAzMik7Cit2YXIgUE9XXzQwID0gTWF0aC5wb3coMiwgNDApOwordmFyIFBPV180OCA9IE1hdGgucG93KDIsIDQ4KTsKK3ZhciBQT1dfNTIgPSBNYXRoLnBvdygyLCA1Mik7Cit2YXIgUE9XXzEwMjIgPSBNYXRoLnBvdygyLCAxMDIyKTsKKworLyoqCisgKiBDb25zdHJ1Y3RvciBGdW5jdGlvbiBmb3IgdGhlIENvbXBhY3QgUHJvdG9jb2wuCisgKiBAY29uc3RydWN0b3IKKyAqIEBwYXJhbSB7b2JqZWN0fSBbdHJhbnNdIC0gVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHRvIHJlYWQvd3JpdGUuCisgKiBAY2xhc3NkZXNjIFRoZSBBcGFjaGUgVGhyaWZ0IFByb3RvY29sIGxheWVyIHBlcmZvcm1zIHNlcmlhbGl6YXRpb24KKyAqICAgICBvZiBiYXNlIHR5cGVzLCB0aGUgY29tcGFjdCBwcm90b2NvbCBzZXJpYWxpemVzIGRhdGEgaW4gYmluYXJ5CisgKiAgICAgZm9ybSB3aXRoIG1pbmltYWwgc3BhY2UgdXNlZCBmb3Igc2NhbGFyIHZhbHVlcy4KKyAqLworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbCh0cmFucykgeworICB0aGlzLnRyYW5zID0gdHJhbnM7CisgIHRoaXMubGFzdEZpZWxkXyA9IFtdOworICB0aGlzLmxhc3RGaWVsZElkXyA9IDA7CisgIHRoaXMuc3RyaW5nX2xpbWl0XyA9IDA7CisgIHRoaXMuc3RyaW5nX2J1Zl8gPSBudWxsOworICB0aGlzLnN0cmluZ19idWZfc2l6ZV8gPSAwOworICB0aGlzLmNvbnRhaW5lcl9saW1pdF8gPSAwOworICB0aGlzLmJvb2xlYW5GaWVsZF8gPSB7CisgICAgbmFtZTogbnVsbCwKKyAgICBoYXNCb29sVmFsdWU6IGZhbHNlCisgIH07CisgIHRoaXMuYm9vbFZhbHVlXyA9IHsKKyAgICBoYXNCb29sVmFsdWU6IGZhbHNlLAorICAgIGJvb2xWYWx1ZTogZmFsc2UKKyAgfTsKK307CisKKworLy8KKy8vIENvbXBhY3QgUHJvdG9jb2wgQ29uc3RhbnRzCisvLworCisvKioKKyAgKiBDb21wYWN0IFByb3RvY29sIElEIG51bWJlci4KKyAgKiBAcmVhZG9ubHkKKyAgKiBAY29uc3Qge251bWJlcn0gUFJPVE9DT0xfSUQKKyAgKi8KK1RDb21wYWN0UHJvdG9jb2wuUFJPVE9DT0xfSUQgPSAtMTI2OyAgLy8xMDAwIDAwMTAKKworLyoqCisgICogQ29tcGFjdCBQcm90b2NvbCB2ZXJzaW9uIG51bWJlci4KKyAgKiBAcmVhZG9ubHkKKyAgKiBAY29uc3Qge251bWJlcn0gVkVSU0lPTl9OCisgICovCitUQ29tcGFjdFByb3RvY29sLlZFUlNJT05fTiA9IDE7CisKKy8qKgorICAqIENvbXBhY3QgUHJvdG9jb2wgdmVyc2lvbiBtYXNrIGZvciBjb21iaW5pbmcgcHJvdG9jb2wgdmVyc2lvbiBhbmQgbWVzc2FnZSB0eXBlIGluIG9uZSBieXRlLgorICAqIEByZWFkb25seQorICAqIEBjb25zdCB7bnVtYmVyfSBWRVJTSU9OX01BU0sKKyAgKi8KK1RDb21wYWN0UHJvdG9jb2wuVkVSU0lPTl9NQVNLID0gMHgxZjsgLy8wMDAxIDExMTEKKworLyoqCisgICogQ29tcGFjdCBQcm90b2NvbCBtZXNzYWdlIHR5cGUgbWFzayBmb3IgY29tYmluaW5nIHByb3RvY29sIHZlcnNpb24gYW5kIG1lc3NhZ2UgdHlwZSBpbiBvbmUgYnl0ZS4KKyAgKiBAcmVhZG9ubHkKKyAgKiBAY29uc3Qge251bWJlcn0gVFlQRV9NQVNLCisgICovCitUQ29tcGFjdFByb3RvY29sLlRZUEVfTUFTSyA9IC0zMjsgICAgIC8vMTExMCAwMDAwCisKKy8qKgorICAqIENvbXBhY3QgUHJvdG9jb2wgbWVzc2FnZSB0eXBlIGJpdHMgZm9yIGVuc3VyaW5nIG1lc3NhZ2UgdHlwZSBiaXQgc2l6ZS4KKyAgKiBAcmVhZG9ubHkKKyAgKiBAY29uc3Qge251bWJlcn0gVFlQRV9CSVRTCisgICovCitUQ29tcGFjdFByb3RvY29sLlRZUEVfQklUUyA9IDc7IC8vMDAwMCAwMTExCisKKy8qKgorICAqIENvbXBhY3QgUHJvdG9jb2wgbWVzc2FnZSB0eXBlIHNoaWZ0IGFtb3VudCBmb3IgY29tYmluaW5nIHByb3RvY29sIHZlcnNpb24gYW5kIG1lc3NhZ2UgdHlwZSBpbiBvbmUgYnl0ZS4KKyAgKiBAcmVhZG9ubHkKKyAgKiBAY29uc3Qge251bWJlcn0gVFlQRV9TSElGVF9BTU9VTlQKKyAgKi8KK1RDb21wYWN0UHJvdG9jb2wuVFlQRV9TSElGVF9BTU9VTlQgPSA1OworCisvKioKKyAqIENvbXBhY3QgUHJvdG9jb2wgdHlwZSBJRHMgdXNlZCB0byBrZWVwIHR5cGUgZGF0YSB3aXRoaW4gb25lIG5pYmJsZS4KKyAqIEByZWFkb25seQorICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9TVE9QICAgICAgICAgIC0gRW5kIG9mIGEgc2V0IG9mIGZpZWxkcy4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfQk9PTEVBTl9UUlVFICAtIEZsYWcgZm9yIEJvb2xlYW4gZmllbGQgd2l0aCB0cnVlIHZhbHVlIChwYWNrZWQgZmllbGQgYW5kIHZhbHVlKS4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfQk9PTEVBTl9GQUxTRSAtIEZsYWcgZm9yIEJvb2xlYW4gZmllbGQgd2l0aCBmYWxzZSB2YWx1ZSAocGFja2VkIGZpZWxkIGFuZCB2YWx1ZSkuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0JZVEUgICAgICAgICAgLSBTaWduZWQgOCBiaXQgaW50ZWdlci4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfSTE2ICAgICAgICAgICAtIFNpZ25lZCAxNiBiaXQgaW50ZWdlci4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfSTMyICAgICAgICAgICAtIFNpZ25lZCAzMiBiaXQgaW50ZWdlci4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfSTY0ICAgICAgICAgICAtIFNpZ25lZCA2NCBiaXQgaW50ZWdlciAoMl41MyBtYXggaW4gSmF2YVNjcmlwdCkuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0RPVUJMRSAgICAgICAgLSA2NCBiaXQgSUVFRSA4NTQgZmxvYXRpbmcgcG9pbnQuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0JJTkFSWSAgICAgICAgLSBBcnJheSBvZiBieXRlcyAodXNlZCBmb3Igc3RyaW5ncyBhbHNvKS4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfTElTVCAgICAgICAgICAtIEEgY29sbGVjdGlvbiB0eXBlICh1bm9yZGVyZWQpLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9TRVQgICAgICAgICAgIC0gQSBjb2xsZWN0aW9uIHR5cGUgKHVub3JkZXJlZCBhbmQgd2l0aG91dCByZXBlYXRlZCB2YWx1ZXMpLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9NQVAgICAgICAgICAgIC0gQSBjb2xsZWN0aW9uIHR5cGUgKG1hcC9hc3NvY2lhdGl2ZS1hcnJheS9kaWN0aW9uYXJ5KS4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfU1RSVUNUICAgICAgICAtIEEgbXVsdGlmaWVsZCB0eXBlLgorICovCitUQ29tcGFjdFByb3RvY29sLlR5cGVzID0geworICBDVF9TVE9QOiAgICAgICAgICAgMHgwMCwKKyAgQ1RfQk9PTEVBTl9UUlVFOiAgIDB4MDEsCisgIENUX0JPT0xFQU5fRkFMU0U6ICAweDAyLAorICBDVF9CWVRFOiAgICAgICAgICAgMHgwMywKKyAgQ1RfSTE2OiAgICAgICAgICAgIDB4MDQsCisgIENUX0kzMjogICAgICAgICAgICAweDA1LAorICBDVF9JNjQ6ICAgICAgICAgICAgMHgwNiwKKyAgQ1RfRE9VQkxFOiAgICAgICAgIDB4MDcsCisgIENUX0JJTkFSWTogICAgICAgICAweDA4LAorICBDVF9MSVNUOiAgICAgICAgICAgMHgwOSwKKyAgQ1RfU0VUOiAgICAgICAgICAgIDB4MEEsCisgIENUX01BUDogICAgICAgICAgICAweDBCLAorICBDVF9TVFJVQ1Q6ICAgICAgICAgMHgwQworfTsKKworLyoqCisgKiBBcnJheSBtYXBwaW5nIENvbXBhY3QgdHlwZSBJRHMgdG8gc3RhbmRhcmQgVGhyaWZ0IHR5cGUgSURzLgorICogQHJlYWRvbmx5CisgKi8KK1RDb21wYWN0UHJvdG9jb2wuVFR5cGVUb0NUeXBlID0gWworICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX1NUT1AsICAgICAgICAgLy8gVF9TVE9QCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnVzZWQKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX1RSVUUsIC8vIFRfQk9PTAorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JZVEUsICAgICAgICAgLy8gVF9CWVRFCisgIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfRE9VQkxFLCAgICAgICAvLyBUX0RPVUJMRQorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW51c2VkCisgIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfSTE2LCAgICAgICAgICAvLyBUX0kxNgorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW51c2VkCisgIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfSTMyLCAgICAgICAgICAvLyBUX0kzMgorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW51c2VkCisgIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfSTY0LCAgICAgICAgICAvLyBUX0k2NAorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JJTkFSWSwgICAgICAgLy8gVF9TVFJJTkcKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9TVFJVQ1QsICAgICAgIC8vIFRfU1RSVUNUCisgIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfTUFQLCAgICAgICAgICAvLyBUX01BUAorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX1NFVCwgICAgICAgICAgLy8gVF9TRVQKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9MSVNULCAgICAgICAgIC8vIFRfTElTVAorXTsKKworCisvLworLy8gQ29tcGFjdCBQcm90b2NvbCBVdGlsaXRpZXMKKy8vCisKKy8qKgorICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgbGF5ZXIuCisgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBsYXllci4KKyAqL1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLmdldFRyYW5zcG9ydCA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy50cmFuczsKK307CisKKy8qKgorICogTG9va3VwIGEgQ29tcGFjdCBQcm90b2NvbCBUeXBlIHZhbHVlIGZvciBhIGdpdmVuIFRocmlmdCBUeXBlIHZhbHVlLgorICogTi5CLiBVc2VkIG9ubHkgaW50ZXJuYWxseS4KKyAqIEBwYXJhbSB7bnVtYmVyfSB0dHlwZSAtIFRocmlmdCB0eXBlIHZhbHVlCisgKiBAcmV0dXJucyB7bnVtYmVyfSBDb21wYWN0IHByb3RvY29sIHR5cGUgdmFsdWUKKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUuZ2V0Q29tcGFjdFR5cGUgPSBmdW5jdGlvbih0dHlwZSkgeworICByZXR1cm4gVENvbXBhY3RQcm90b2NvbC5UVHlwZVRvQ1R5cGVbdHR5cGVdOworfTsKKworLyoqCisgKiBMb29rdXAgYSBUaHJpZnQgVHlwZSB2YWx1ZSBmb3IgYSBnaXZlbiBDb21wYWN0IFByb3RvY29sIFR5cGUgdmFsdWUuCisgKiBOLkIuIFVzZWQgb25seSBpbnRlcm5hbGx5LgorICogQHBhcmFtIHtudW1iZXJ9IHR5cGUgLSBDb21wYWN0IFByb3RvY29sIHR5cGUgdmFsdWUKKyAqIEByZXR1cm5zIHtudW1iZXJ9IFRocmlmdCBUeXBlIHZhbHVlCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLmdldFRUeXBlID0gZnVuY3Rpb24odHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFR5cGUuU1RPUDoKKyAgICAgIHJldHVybiBUeXBlLlNUT1A7CisgICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JPT0xFQU5fRkFMU0U6CisgICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JPT0xFQU5fVFJVRToKKyAgICAgIHJldHVybiBUeXBlLkJPT0w7CisgICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JZVEU6CisgICAgICByZXR1cm4gVHlwZS5CWVRFOworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9JMTY6CisgICAgICByZXR1cm4gVHlwZS5JMTY7CisgICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0kzMjoKKyAgICAgIHJldHVybiBUeXBlLkkzMjsKKyAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfSTY0OgorICAgICAgcmV0dXJuIFR5cGUuSTY0OworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9ET1VCTEU6CisgICAgICByZXR1cm4gVHlwZS5ET1VCTEU7CisgICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JJTkFSWToKKyAgICAgIHJldHVybiBUeXBlLlNUUklORzsKKyAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfTElTVDoKKyAgICAgIHJldHVybiBUeXBlLkxJU1Q7CisgICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX1NFVDoKKyAgICAgIHJldHVybiBUeXBlLlNFVDsKKyAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfTUFQOgorICAgICAgcmV0dXJuIFR5cGUuTUFQOworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9TVFJVQ1Q6CisgICAgICByZXR1cm4gVHlwZS5TVFJVQ1Q7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLklOVkFMSURfREFUQSwgIlVua25vd24gdHlwZTogIiArIHR5cGUpOworICB9CisgIHJldHVybiBUeXBlLlNUT1A7Cit9OworCisKKy8vCisvLyBDb21wYWN0IFByb3RvY29sIHdyaXRlIG9wZXJhdGlvbnMKKy8vCisKKy8qKgorICogU2VuZCBhbnkgYnVmZmVyZWQgYnl0ZXMgdG8gdGhlIGVuZCBwb2ludC4KKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnMuZmx1c2goKTsKK307CisKKy8qKgorICogV3JpdGVzIGFuIFJQQyBtZXNzYWdlIGhlYWRlcgorICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbWV0aG9kIG5hbWUgZm9yIHRoZSBtZXNzYWdlLgorICogQHBhcmFtIHtudW1iZXJ9IHR5cGUgLSBUaGUgdHlwZSBvZiBtZXNzYWdlIChDQUxMLCBSRVBMWSwgRVhDRVBUSU9OLCBPTkVXQVkpLgorICogQHBhcmFtIHtudW1iZXJ9IHNlcWlkIC0gVGhlIGNhbGwgc2VxdWVuY2UgbnVtYmVyIChpZiBhbnkpLgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIHNlcWlkKSB7CisgIHRoaXMud3JpdGVCeXRlKFRDb21wYWN0UHJvdG9jb2wuUFJPVE9DT0xfSUQpOworICB0aGlzLndyaXRlQnl0ZSgoVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OX04gJiBUQ29tcGFjdFByb3RvY29sLlZFUlNJT05fTUFTSykgfAorICAgICAgICAgICAgICAgICAgICAgKCh0eXBlIDw8IFRDb21wYWN0UHJvdG9jb2wuVFlQRV9TSElGVF9BTU9VTlQpICYgVENvbXBhY3RQcm90b2NvbC5UWVBFX01BU0spKTsKKyAgdGhpcy53cml0ZVZhcmludDMyKHNlcWlkKTsKKyAgdGhpcy53cml0ZVN0cmluZyhuYW1lKTsKKworICAvLyBSZWNvcmQgY2xpZW50IHNlcWlkIHRvIGZpbmQgY2FsbGJhY2sgYWdhaW4KKyAgaWYgKHRoaXMuX3NlcWlkKSB7CisgICAgbG9nLndhcm5pbmcoJ1NlcUlkIGFscmVhZHkgc2V0JywgeyAnbmFtZSc6IG5hbWUgfSk7CisgIH0gZWxzZSB7CisgICAgdGhpcy5fc2VxaWQgPSBzZXFpZDsKKyAgICB0aGlzLnRyYW5zLnNldEN1cnJTZXFJZChzZXFpZCk7CisgIH0KK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJ1Y3RCZWdpbiA9IGZ1bmN0aW9uKG5hbWUpIHsKKyAgdGhpcy5sYXN0RmllbGRfLnB1c2godGhpcy5sYXN0RmllbGRJZF8pOworICB0aGlzLmxhc3RGaWVsZElkXyA9IDA7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmxhc3RGaWVsZElkXyA9IHRoaXMubGFzdEZpZWxkXy5wb3AoKTsKK307CisKKy8qKgorICogV3JpdGVzIGEgc3RydWN0IGZpZWxkIGhlYWRlcgorICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgZmllbGQgbmFtZSAobm90IHdyaXR0ZW4gd2l0aCB0aGUgY29tcGFjdCBwcm90b2NvbCkuCisgKiBAcGFyYW0ge251bWJlcn0gdHlwZSAtIFRoZSBmaWVsZCBkYXRhIHR5cGUgKGEgbm9ybWFsIFRocmlmdCBmaWVsZCBUeXBlKS4KKyAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIFRoZSBJREwgZmllbGQgSWQuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIGlkKSB7CisgIGlmICh0eXBlICE9IFR5cGUuQk9PTCkgeworICAgIHJldHVybiB0aGlzLndyaXRlRmllbGRCZWdpbkludGVybmFsKG5hbWUsIHR5cGUsIGlkLCAtMSk7CisgIH0KKworICB0aGlzLmJvb2xlYW5GaWVsZF8ubmFtZSA9IG5hbWU7CisgIHRoaXMuYm9vbGVhbkZpZWxkXy5maWVsZFR5cGUgPSB0eXBlOworICB0aGlzLmJvb2xlYW5GaWVsZF8uZmllbGRJZCA9IGlkOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZFN0b3AgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy53cml0ZUJ5dGUoVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9TVE9QKTsKK307CisKKy8qKgorICogV3JpdGVzIGEgbWFwIGNvbGxlY3Rpb24gaGVhZGVyCisgKiBAcGFyYW0ge251bWJlcn0ga2V5VHlwZSAtIFRoZSBUaHJpZnQgdHlwZSBvZiB0aGUgbWFwIGtleXMuCisgKiBAcGFyYW0ge251bWJlcn0gdmFsVHlwZSAtIFRoZSBUaHJpZnQgdHlwZSBvZiB0aGUgbWFwIHZhbHVlcy4KKyAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBrL3YgcGFpcnMgaW4gdGhlIG1hcC4KKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNYXBCZWdpbiA9IGZ1bmN0aW9uKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpIHsKKyAgaWYgKHNpemUgPT09IDApIHsKKyAgICB0aGlzLndyaXRlQnl0ZSgwKTsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLndyaXRlVmFyaW50MzIoc2l6ZSk7CisgICAgdGhpcy53cml0ZUJ5dGUodGhpcy5nZXRDb21wYWN0VHlwZShrZXlUeXBlKSA8PCA0IHwgdGhpcy5nZXRDb21wYWN0VHlwZSh2YWxUeXBlKSk7CisgIH0KK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWFwRW5kID0gZnVuY3Rpb24oKSB7Cit9OworCisvKioKKyAqIFdyaXRlcyBhIGxpc3QgY29sbGVjdGlvbiBoZWFkZXIKKyAqIEBwYXJhbSB7bnVtYmVyfSBlbGVtVHlwZSAtIFRoZSBUaHJpZnQgdHlwZSBvZiB0aGUgbGlzdCBlbGVtZW50cy4KKyAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdC4KKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVMaXN0QmVnaW4gPSBmdW5jdGlvbihlbGVtVHlwZSwgc2l6ZSkgeworICB0aGlzLndyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1UeXBlLCBzaXplKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTGlzdEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworLyoqCisgKiBXcml0ZXMgYSBzZXQgY29sbGVjdGlvbiBoZWFkZXIKKyAqIEBwYXJhbSB7bnVtYmVyfSBlbGVtVHlwZSAtIFRoZSBUaHJpZnQgdHlwZSBvZiB0aGUgc2V0IGVsZW1lbnRzLgorICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBzZXQuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU2V0QmVnaW4gPSBmdW5jdGlvbihlbGVtVHlwZSwgc2l6ZSkgeworICB0aGlzLndyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1UeXBlLCBzaXplKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU2V0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUJvb2wgPSBmdW5jdGlvbih2YWx1ZSkgeworICBpZiAodGhpcy5ib29sZWFuRmllbGRfLm5hbWUgIT09IG51bGwpIHsKKyAgICAvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKKyAgICB0aGlzLndyaXRlRmllbGRCZWdpbkludGVybmFsKHRoaXMuYm9vbGVhbkZpZWxkXy5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ib29sZWFuRmllbGRfLmZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYm9vbGVhbkZpZWxkXy5maWVsZElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlID8gVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX1RSVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX0ZBTFNFKSk7CisgICAgdGhpcy5ib29sZWFuRmllbGRfLm5hbWUgPSBudWxsOworICB9IGVsc2UgeworICAgIC8vIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3Qgd3JpdGUgdGhlIHZhbHVlCisgICAgdGhpcy53cml0ZUJ5dGUoKHZhbHVlID8gVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX1RSVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9GQUxTRSkpOworICB9Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUJ5dGUgPSBmdW5jdGlvbihiKSB7CisgIHRoaXMudHJhbnMud3JpdGUobmV3IEJ1ZmZlcihbYl0pKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlSTE2ID0gZnVuY3Rpb24oaTE2KSB7CisgIHRoaXMud3JpdGVWYXJpbnQzMih0aGlzLmkzMlRvWmlnemFnKGkxNikpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVJMzIgPSBmdW5jdGlvbihpMzIpIHsKKyAgdGhpcy53cml0ZVZhcmludDMyKHRoaXMuaTMyVG9aaWd6YWcoaTMyKSk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUk2NCA9IGZ1bmN0aW9uKGk2NCkgeworICB0aGlzLndyaXRlVmFyaW50NjQodGhpcy5pNjRUb1ppZ3phZyhpNjQpKTsKK307CisKKy8vIExpdHRsZS1lbmRpYW4sIHVubGlrZSBUQmluYXJ5UHJvdG9jb2wKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRG91YmxlID0gZnVuY3Rpb24odikgeworICB2YXIgYnVmZiA9IG5ldyBCdWZmZXIoOCk7CisgIHZhciBtLCBlLCBjOworCisgIGJ1ZmZbN10gPSAodiA8IDAgPyAweDgwIDogMHgwMCk7CisKKyAgdiA9IE1hdGguYWJzKHYpOworICBpZiAodiAhPT0gdikgeworICAgIC8vIE5hTiwgdXNlIFFOYU4gSUVFRSBmb3JtYXQKKyAgICBtID0gMjI1MTc5OTgxMzY4NTI0ODsKKyAgICBlID0gMjA0NzsKKyAgfSBlbHNlIGlmICh2ID09PSBJbmZpbml0eSkgeworICAgIG0gPSAwOworICAgIGUgPSAyMDQ3OworICB9IGVsc2UgeworICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHYpIC8gTWF0aC5MTjIpOworICAgIGMgPSBNYXRoLnBvdygyLCAtZSk7CisgICAgaWYgKHYgKiBjIDwgMSkgeworICAgICAgZS0tOworICAgICAgYyAqPSAyOworICAgIH0KKworICAgIGlmIChlICsgMTAyMyA+PSAyMDQ3KQorICAgIHsKKyAgICAgIC8vIE92ZXJmbG93CisgICAgICBtID0gMDsKKyAgICAgIGUgPSAyMDQ3OworICAgIH0KKyAgICBlbHNlIGlmIChlICsgMTAyMyA+PSAxKQorICAgIHsKKyAgICAgIC8vIE5vcm1hbGl6ZWQgLSB0ZXJtIG9yZGVyIG1hdHRlcnMsIGFzIE1hdGgucG93KDIsIDUyLWUpIGFuZCB2Kk1hdGgucG93KDIsIDUyKSBjYW4gb3ZlcmZsb3cKKyAgICAgIG0gPSAodipjLTEpICogUE9XXzUyOworICAgICAgZSArPSAxMDIzOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLy8gRGVub3JtYWxpemVkIC0gYWxzbyBjYXRjaGVzIHRoZSAnMCcgY2FzZSwgc29tZXdoYXQgYnkgY2hhbmNlCisgICAgICBtID0gKHYgKiBQT1dfMTAyMikgKiBQT1dfNTI7CisgICAgICBlID0gMDsKKyAgICB9CisgIH0KKworICBidWZmWzZdID0gKGUgPDwgNCkgJiAweGYwOworICBidWZmWzddIHw9IChlID4+IDQpICYgMHg3ZjsKKworICBidWZmWzBdID0gbSAmIDB4ZmY7CisgIG0gPSBNYXRoLmZsb29yKG0gLyBQT1dfOCk7CisgIGJ1ZmZbMV0gPSBtICYgMHhmZjsKKyAgbSA9IE1hdGguZmxvb3IobSAvIFBPV184KTsKKyAgYnVmZlsyXSA9IG0gJiAweGZmOworICBtID0gTWF0aC5mbG9vcihtIC8gUE9XXzgpOworICBidWZmWzNdID0gbSAmIDB4ZmY7CisgIG0gPj49IDg7CisgIGJ1ZmZbNF0gPSBtICYgMHhmZjsKKyAgbSA+Pj0gODsKKyAgYnVmZls1XSA9IG0gJiAweGZmOworICBtID4+PSA4OworICBidWZmWzZdIHw9IG0gJiAweDBmOworCisgIHRoaXMudHJhbnMud3JpdGUoYnVmZik7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cmluZ09yQmluYXJ5ID0gZnVuY3Rpb24obmFtZSwgZW5jb2RpbmcsIGFyZykgeworICBpZiAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpIHsKKyAgICB0aGlzLndyaXRlVmFyaW50MzIoQnVmZmVyLmJ5dGVMZW5ndGgoYXJnLCBlbmNvZGluZykpIDsKKyAgICB0aGlzLnRyYW5zLndyaXRlKG5ldyBCdWZmZXIoYXJnLCBlbmNvZGluZykpOworICB9IGVsc2UgaWYgKGFyZyBpbnN0YW5jZW9mIEJ1ZmZlciB8fAorICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpID09ICdbb2JqZWN0IFVpbnQ4QXJyYXldJykgeworICAgIC8vIEJ1ZmZlcnMgaW4gTm9kZS5qcyB1bmRlciBCcm93c2VyaWZ5IG1heSBleHRlbmQgVUludDhBcnJheSBpbnN0ZWFkIG9mCisgICAgLy8gZGVmaW5pbmcgYSBuZXcgb2JqZWN0LiBXZSBkZXRlY3QgdGhlbSBoZXJlIHNvIHdlIGNhbiB3cml0ZSB0aGVtCisgICAgLy8gY29ycmVjdGx5CisgICAgdGhpcy53cml0ZVZhcmludDMyKGFyZy5sZW5ndGgpOworICAgIHRoaXMudHJhbnMud3JpdGUoYXJnKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBuZXcgRXJyb3IobmFtZSArICcgY2FsbGVkIHdpdGhvdXQgYSBzdHJpbmcvQnVmZmVyIGFyZ3VtZW50OiAnICsgYXJnKTsKKyAgfQorfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJpbmcgPSBmdW5jdGlvbihhcmcpIHsKKyAgdGhpcy53cml0ZVN0cmluZ09yQmluYXJ5KCd3cml0ZVN0cmluZycsICd1dGY4JywgYXJnKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlQmluYXJ5ID0gZnVuY3Rpb24oYXJnKSB7CisgIHRoaXMud3JpdGVTdHJpbmdPckJpbmFyeSgnd3JpdGVCaW5hcnknLCAnYmluYXJ5JywgYXJnKTsKK307CisKKworLy8KKy8vIENvbXBhY3QgUHJvdG9jb2wgaW50ZXJuYWwgd3JpdGUgbWV0aG9kcworLy8KKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwgPSBmdW5jdGlvbihuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVPdmVycmlkZSkgeworICAvL0lmIHRoZXJlJ3MgYSB0eXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4KKyAgdmFyIHR5cGVUb1dyaXRlID0gKHR5cGVPdmVycmlkZSA9PSAtMSA/IHRoaXMuZ2V0Q29tcGFjdFR5cGUoZmllbGRUeXBlKSA6IHR5cGVPdmVycmlkZSk7CisgIC8vQ2hlY2sgaWYgd2UgY2FuIGRlbHRhIGVuY29kZSB0aGUgZmllbGQgaWQKKyAgaWYgKGZpZWxkSWQgPiB0aGlzLmxhc3RGaWVsZElkXyAmJiBmaWVsZElkIC0gdGhpcy5sYXN0RmllbGRJZF8gPD0gMTUpIHsKKyAgICAvL0luY2x1ZGUgdGhlIHR5cGUgZGVsdGEgd2l0aCB0aGUgZmllbGQgSUQKKyAgICB0aGlzLndyaXRlQnl0ZSgoZmllbGRJZCAtIHRoaXMubGFzdEZpZWxkSWRfKSA8PCA0IHwgdHlwZVRvV3JpdGUpOworICB9IGVsc2UgeworICAgIC8vV3JpdGUgc2VwYXJhdGUgdHlwZSBhbmQgSUQgdmFsdWVzCisgICAgdGhpcy53cml0ZUJ5dGUodHlwZVRvV3JpdGUpOworICAgIHRoaXMud3JpdGVJMTYoZmllbGRJZCk7CisgIH0KKyAgdGhpcy5sYXN0RmllbGRJZF8gPSBmaWVsZElkOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVDb2xsZWN0aW9uQmVnaW4gPSBmdW5jdGlvbihlbGVtVHlwZSwgc2l6ZSkgeworICBpZiAoc2l6ZSA8PSAxNCkgeworICAgIC8vQ29tYmluZSBzaXplIGFuZCB0eXBlIGluIG9uZSBieXRlIGlmIHBvc3NpYmxlCisgICAgdGhpcy53cml0ZUJ5dGUoc2l6ZSA8PCA0IHwgdGhpcy5nZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpOworICB9IGVsc2UgeworICAgIHRoaXMud3JpdGVCeXRlKDB4ZjAgfCB0aGlzLmdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSk7CisgICAgdGhpcy53cml0ZVZhcmludDMyKHNpemUpOworICB9Cit9OworCisvKioKKyAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlVmFyaW50MzIgPSBmdW5jdGlvbihuKSB7CisgIHZhciBidWYgPSBuZXcgQnVmZmVyKDUpOworICB2YXIgd3NpemUgPSAwOworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICgobiAmIH4weDdGKSA9PT0gMCkgeworICAgICAgYnVmW3dzaXplKytdID0gbjsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBidWZbd3NpemUrK10gPSAoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgbiA9IG4gPj4+IDc7CisgICAgfQorICB9CisgIHZhciB3YnVmID0gbmV3IEJ1ZmZlcih3c2l6ZSk7CisgIGJ1Zi5jb3B5KHdidWYsMCwwLHdzaXplKTsKKyAgdGhpcy50cmFucy53cml0ZSh3YnVmKTsKK307CisKKy8qKgorICogV3JpdGUgYW4gaTY0IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIHdpcmUuCisgKiBOLkIuIG5vZGUtaW50NjQgaXMgYWx3YXlzIGJpZyBlbmRpYW4KKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVWYXJpbnQ2NCA9IGZ1bmN0aW9uKG4pIHsKKyAgaWYgKHR5cGVvZiBuID09PSAibnVtYmVyIil7CisgICAgbiA9IG5ldyBJbnQ2NChuKTsKKyAgfQorICBpZiAoISAobiBpbnN0YW5jZW9mIEludDY0KSkgeworICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIEludDY0IG9yIE51bWJlciwgZm91bmQ6ICIgKyBuKTsKKyAgfQorCisgIHZhciBidWYgPSBuZXcgQnVmZmVyKDEwKTsKKyAgdmFyIHdzaXplID0gMDsKKyAgdmFyIGhpID0gbi5idWZmZXIucmVhZFVJbnQzMkJFKDAsIHRydWUpOworICB2YXIgbG8gPSBuLmJ1ZmZlci5yZWFkVUludDMyQkUoNCwgdHJ1ZSk7CisgIHZhciBtYXNrID0gMDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAoKChsbyAmIH4weDdGKSA9PT0gMCkgJiYgKGhpID09PSAwKSkgeworICAgICAgYnVmW3dzaXplKytdID0gbG87CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgYnVmW3dzaXplKytdID0gKChsbyAmIDB4N0YpIHwgMHg4MCk7CisgICAgICBtYXNrID0gaGkgPDwgMjU7CisgICAgICBsbyA9IGxvID4+PiA3OworICAgICAgaGkgPSBoaSA+Pj4gNzsKKyAgICAgIGxvID0gbG8gfCBtYXNrOworICAgIH0KKyAgfQorICB2YXIgd2J1ZiA9IG5ldyBCdWZmZXIod3NpemUpOworICBidWYuY29weSh3YnVmLDAsMCx3c2l6ZSk7CisgIHRoaXMudHJhbnMud3JpdGUod2J1Zik7Cit9OworCisvKioKKyAqIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUuaTY0VG9aaWd6YWcgPSBmdW5jdGlvbihsKSB7CisgIGlmICh0eXBlb2YgbCA9PT0gJ3N0cmluZycpIHsKKyAgICBsID0gbmV3IEludDY0KHBhcnNlSW50KGwsIDEwKSk7CisgIH0gZWxzZSBpZiAodHlwZW9mIGwgPT09ICdudW1iZXInKSB7CisgICAgbCA9IG5ldyBJbnQ2NChsKTsKKyAgfQorICBpZiAoISAobCBpbnN0YW5jZW9mIEludDY0KSkgeworICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIEludDY0IG9yIE51bWJlciwgZm91bmQ6ICIgKyBsKTsKKyAgfQorICB2YXIgaGkgPSBsLmJ1ZmZlci5yZWFkVUludDMyQkUoMCwgdHJ1ZSk7CisgIHZhciBsbyA9IGwuYnVmZmVyLnJlYWRVSW50MzJCRSg0LCB0cnVlKTsKKyAgdmFyIHNpZ24gPSBoaSA+Pj4gMzE7CisgIGhpID0gKChoaSA8PCAxKSB8IChsbyA+Pj4gMzEpKSBeICgoISFzaWduKSA/IDB4RkZGRkZGRkYgOiAwKTsKKyAgbG8gPSAobG8gPDwgMSkgXiAoKCEhc2lnbikgPyAweEZGRkZGRkZGIDogMCk7CisgIHJldHVybiBuZXcgSW50NjQoaGksIGxvKTsKK307CisKKy8qKgorICogQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLmkzMlRvWmlnemFnID0gZnVuY3Rpb24obikgeworICByZXR1cm4gKG4gPDwgMSkgXiAoKG4gJiAweDgwMDAwMDAwKSA/IDB4RkZGRkZGRkYgOiAwKTsKK307CisKKworLy8KKy8vIENvbXBhY3QgUHJvdG9jb2wgcmVhZCBvcGVyYXRpb25zCisvLworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkTWVzc2FnZUJlZ2luID0gZnVuY3Rpb24oKSB7CisgIC8vUmVhZCBwcm90b2NvbCBJRAorICB2YXIgcHJvdG9jb2xJZCA9IHRoaXMudHJhbnMucmVhZEJ5dGUoKTsKKyAgaWYgKHByb3RvY29sSWQgIT0gVENvbXBhY3RQcm90b2NvbC5QUk9UT0NPTF9JRCkgeworICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLkJBRF9WRVJTSU9OLCAiQmFkIHByb3RvY29sIGlkZW50aWZpZXIgIiArIHByb3RvY29sSWQpOworICB9CisKKyAgLy9SZWFkIFZlcnNpb24gYW5kIFR5cGUKKyAgdmFyIHZlcnNpb25BbmRUeXBlID0gdGhpcy50cmFucy5yZWFkQnl0ZSgpOworICB2YXIgdmVyc2lvbiA9ICh2ZXJzaW9uQW5kVHlwZSAmIFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTl9NQVNLKTsKKyAgaWYgKHZlcnNpb24gIT0gVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OX04pIHsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5CQURfVkVSU0lPTiwgIkJhZCBwcm90b2NvbCB2ZXJzaW9uICIgKyB2ZXJzaW9uKTsKKyAgfQorICB2YXIgdHlwZSA9ICgodmVyc2lvbkFuZFR5cGUgPj4gVENvbXBhY3RQcm90b2NvbC5UWVBFX1NISUZUX0FNT1VOVCkgJiBUQ29tcGFjdFByb3RvY29sLlRZUEVfQklUUyk7CisKKyAgLy9SZWFkIFNlcUlkCisgIHZhciBzZXFpZCA9IHRoaXMucmVhZFZhcmludDMyKCk7CisKKyAgLy9SZWFkIG5hbWUKKyAgdmFyIG5hbWUgPSB0aGlzLnJlYWRTdHJpbmcoKTsKKworICByZXR1cm4ge2ZuYW1lOiBuYW1lLCBtdHlwZTogdHlwZSwgcnNlcWlkOiBzZXFpZH07Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkTWVzc2FnZUVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cnVjdEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHRoaXMubGFzdEZpZWxkXy5wdXNoKHRoaXMubGFzdEZpZWxkSWRfKTsKKyAgdGhpcy5sYXN0RmllbGRJZF8gPSAwOworICByZXR1cm4ge2ZuYW1lOiAnJ307Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RydWN0RW5kID0gZnVuY3Rpb24oKSB7CisgIHRoaXMubGFzdEZpZWxkSWRfID0gdGhpcy5sYXN0RmllbGRfLnBvcCgpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEZpZWxkQmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdmFyIGZpZWxkSWQgPSAwOworICB2YXIgYiA9IHRoaXMudHJhbnMucmVhZEJ5dGUoYik7CisgIHZhciB0eXBlID0gKGIgJiAweDBmKTsKKworICBpZiAodHlwZSA9PSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX1NUT1ApIHsKKyAgICByZXR1cm4ge2ZuYW1lOiBudWxsLCBmdHlwZTogVGhyaWZ0LlR5cGUuU1RPUCwgZmlkOiAwfTsKKyAgfQorCisgIC8vTWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSB0eXBlIGhlYWRlciB0byBjaGVjayBmb3IgZmllbGQgaWQgZGVsdGEuCisgIHZhciBtb2RpZmllciA9ICgoYiAmIDB4MDAwMDAwZjApID4+PiA0KTsKKyAgaWYgKG1vZGlmaWVyID09PSAwKSB7CisgICAgLy9JZiBub3QgYSBkZWx0YSByZWFkIHRoZSBmaWVsZCBpZC4KKyAgICBmaWVsZElkID0gdGhpcy5yZWFkSTE2KCk7CisgIH0gZWxzZSB7CisgICAgLy9SZWNvdmVyIHRoZSBmaWVsZCBpZCBmcm9tIHRoZSBkZWx0YQorICAgIGZpZWxkSWQgPSAodGhpcy5sYXN0RmllbGRJZF8gKyBtb2RpZmllcik7CisgIH0KKyAgdmFyIGZpZWxkVHlwZSA9IHRoaXMuZ2V0VFR5cGUodHlwZSk7CisKKyAgLy9Cb29sZWFuIGFyZSBlbmNvZGVkIHdpdGggdGhlIHR5cGUKKyAgaWYgKHR5cGUgPT0gVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX1RSVUUgfHwKKyAgICAgIHR5cGUgPT0gVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX0ZBTFNFKSB7CisgICAgdGhpcy5ib29sVmFsdWVfLmhhc0Jvb2xWYWx1ZSA9IHRydWU7CisgICAgdGhpcy5ib29sVmFsdWVfLmJvb2xWYWx1ZSA9CisgICAgICAodHlwZSA9PSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JPT0xFQU5fVFJVRSA/IHRydWUgOiBmYWxzZSk7CisgIH0KKworICAvL1NhdmUgdGhlIG5ldyBmaWVsZCBmb3IgdGhlIG5leHQgZGVsdGEgY29tcHV0YXRpb24uCisgIHRoaXMubGFzdEZpZWxkSWRfID0gZmllbGRJZDsKKyAgcmV0dXJuIHtmbmFtZTogbnVsbCwgZnR5cGU6IGZpZWxkVHlwZSwgZmlkOiBmaWVsZElkfTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRGaWVsZEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZE1hcEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHZhciBtc2l6ZSA9IHRoaXMucmVhZFZhcmludDMyKCk7CisgIGlmIChtc2l6ZSA8IDApIHsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5ORUdBVElWRV9TSVpFLCAiTmVnYXRpdmUgbWFwIHNpemUiKTsKKyAgfQorCisgIHZhciBrdlR5cGUgPSAwOworICBpZiAobXNpemUgIT09IDApIHsKKyAgICBrdlR5cGUgPSB0aGlzLnRyYW5zLnJlYWRCeXRlKCk7CisgIH0KKworICB2YXIga2V5VHlwZSA9IHRoaXMuZ2V0VFR5cGUoKGt2VHlwZSAmIDB4ZjApID4+PiA0KTsKKyAgdmFyIHZhbFR5cGUgPSB0aGlzLmdldFRUeXBlKGt2VHlwZSAmIDB4Zik7CisgIHJldHVybiB7a3R5cGU6IGtleVR5cGUsIHZ0eXBlOiB2YWxUeXBlLCBzaXplOiBtc2l6ZX07Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkTWFwRW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkTGlzdEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHZhciBzaXplX2FuZF90eXBlID0gdGhpcy50cmFucy5yZWFkQnl0ZSgpOworCisgIHZhciBsc2l6ZSA9IChzaXplX2FuZF90eXBlID4+PiA0KSAmIDB4MDAwMDAwMGY7CisgIGlmIChsc2l6ZSA9PSAxNSkgeworICAgIGxzaXplID0gdGhpcy5yZWFkVmFyaW50MzIoKTsKKyAgfQorCisgIGlmIChsc2l6ZSA8IDApIHsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5ORUdBVElWRV9TSVpFLCAiTmVnYXRpdmUgbGlzdCBzaXplIik7CisgIH0KKworICB2YXIgZWxlbVR5cGUgPSB0aGlzLmdldFRUeXBlKHNpemVfYW5kX3R5cGUgJiAweDAwMDAwMDBmKTsKKworICByZXR1cm4ge2V0eXBlOiBlbGVtVHlwZSwgc2l6ZTogbHNpemV9OworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZExpc3RFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRTZXRCZWdpbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5yZWFkTGlzdEJlZ2luKCk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkU2V0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkQm9vbCA9IGZ1bmN0aW9uKCkgeworICB2YXIgdmFsdWUgPSBmYWxzZTsKKyAgdmFyIHJzaXplID0gMDsKKyAgaWYgKHRoaXMuYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPT09IHRydWUpIHsKKyAgICB2YWx1ZSA9IHRoaXMuYm9vbFZhbHVlXy5ib29sVmFsdWU7CisgICAgdGhpcy5ib29sVmFsdWVfLmhhc0Jvb2xWYWx1ZSA9IGZhbHNlOworICB9IGVsc2UgeworICAgIHZhciByZXMgPSB0aGlzLnRyYW5zLnJlYWRCeXRlKCk7CisgICAgcnNpemUgPSByZXMucnNpemU7CisgICAgdmFsdWUgPSAocmVzLnZhbHVlID09IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9UUlVFKTsKKyAgfQorICByZXR1cm4gdmFsdWU7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkQnl0ZSA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy50cmFucy5yZWFkQnl0ZSgpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEkxNiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5yZWFkSTMyKCk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkSTMyID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnppZ3phZ1RvSTMyKHRoaXMucmVhZFZhcmludDMyKCkpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEk2NCA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy56aWd6YWdUb0k2NCh0aGlzLnJlYWRWYXJpbnQ2NCgpKTsKK307CisKKy8vIExpdHRsZS1lbmRpYW4sIHVubGlrZSBUQmluYXJ5UHJvdG9jb2wKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWREb3VibGUgPSBmdW5jdGlvbigpIHsKKyAgdmFyIGJ1ZmYgPSB0aGlzLnRyYW5zLnJlYWQoOCk7CisgIHZhciBvZmYgPSAwOworCisgIHZhciBzaWduZWQgPSBidWZmW29mZiArIDddICYgMHg4MDsKKyAgdmFyIGUgPSAoYnVmZltvZmYrNl0gJiAweEYwKSA+PiA0OworICBlICs9IChidWZmW29mZis3XSAmIDB4N0YpIDw8IDQ7CisKKyAgdmFyIG0gPSBidWZmW29mZl07CisgIG0gKz0gYnVmZltvZmYrMV0gPDwgODsKKyAgbSArPSBidWZmW29mZisyXSA8PCAxNjsKKyAgbSArPSBidWZmW29mZiszXSAqIFBPV18yNDsKKyAgbSArPSBidWZmW29mZis0XSAqIFBPV18zMjsKKyAgbSArPSBidWZmW29mZis1XSAqIFBPV180MDsKKyAgbSArPSAoYnVmZltvZmYrNl0gJiAweDBGKSAqIFBPV180ODsKKworICBzd2l0Y2ggKGUpIHsKKyAgICBjYXNlIDA6CisgICAgICBlID0gLTEwMjI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDIwNDc6CisgICAgICByZXR1cm4gbSA/IE5hTiA6IChzaWduZWQgPyAtSW5maW5pdHkgOiBJbmZpbml0eSk7CisgICAgZGVmYXVsdDoKKyAgICAgIG0gKz0gUE9XXzUyOworICAgICAgZSAtPSAxMDIzOworICB9CisKKyAgaWYgKHNpZ25lZCkgeworICAgIG0gKj0gLTE7CisgIH0KKworICByZXR1cm4gbSAqIE1hdGgucG93KDIsIGUgLSA1Mik7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkQmluYXJ5ID0gZnVuY3Rpb24oKSB7CisgIHZhciBzaXplID0gdGhpcy5yZWFkVmFyaW50MzIoKTsKKyAgaWYgKHNpemUgPT09IDApIHsKKyAgICByZXR1cm4gbmV3IEJ1ZmZlcigwKTsKKyAgfQorCisgIGlmIChzaXplIDwgMCkgeworICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLk5FR0FUSVZFX1NJWkUsICJOZWdhdGl2ZSBiaW5hcnkgc2l6ZSIpOworICB9CisgIHJldHVybiB0aGlzLnRyYW5zLnJlYWQoc2l6ZSk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RyaW5nID0gZnVuY3Rpb24oKSB7CisgIHZhciBzaXplID0gdGhpcy5yZWFkVmFyaW50MzIoKTsKKyAgLy8gQ2F0Y2ggZW1wdHkgc3RyaW5nIGNhc2UKKyAgaWYgKHNpemUgPT09IDApIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICAvLyBDYXRjaCBlcnJvciBjYXNlcworICBpZiAoc2l6ZSA8IDApIHsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5ORUdBVElWRV9TSVpFLCAiTmVnYXRpdmUgc3RyaW5nIHNpemUiKTsKKyAgfQorICByZXR1cm4gdGhpcy50cmFucy5yZWFkU3RyaW5nKHNpemUpOworfTsKKworCisvLworLy8gQ29tcGFjdCBQcm90b2NvbCBpbnRlcm5hbCByZWFkIG9wZXJhdGlvbnMKKy8vCisKKy8qKgorICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDUgYnl0ZXMuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRWYXJpbnQzMiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5yZWFkVmFyaW50NjQoKS50b051bWJlcigpOworfTsKKworLyoqCisgKiBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgcHJvcGVyIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDEwIGJ5dGVzLgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkVmFyaW50NjQgPSBmdW5jdGlvbigpIHsKKyAgdmFyIHJzaXplID0gMDsKKyAgdmFyIGxvID0gMDsKKyAgdmFyIGhpID0gMDsKKyAgdmFyIHNoaWZ0ID0gMDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICB2YXIgYiA9IHRoaXMudHJhbnMucmVhZEJ5dGUoKTsKKyAgICByc2l6ZSArKzsKKyAgICBpZiAoc2hpZnQgPD0gMjUpIHsKKyAgICAgIGxvID0gbG8gfCAoKGIgJiAweDdmKSA8PCBzaGlmdCk7CisgICAgfSBlbHNlIGlmICgyNSA8IHNoaWZ0ICYmIHNoaWZ0IDwgMzIpIHsKKyAgICAgIGxvID0gbG8gfCAoKGIgJiAweDdmKSA8PCBzaGlmdCk7CisgICAgICBoaSA9IGhpIHwgKChiICYgMHg3ZikgPj4+ICgzMi1zaGlmdCkpOworICAgIH0gZWxzZSB7CisgICAgICBoaSA9IGhpIHwgKChiICYgMHg3ZikgPDwgKHNoaWZ0LTMyKSk7CisgICAgfQorICAgIHNoaWZ0ICs9IDc7CisgICAgaWYgKCEoYiAmIDB4ODApKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHJzaXplID49IDEwKSB7CisgICAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5JTlZBTElEX0RBVEEsICJWYXJpYWJsZS1sZW5ndGggaW50IG92ZXIgMTAgYnl0ZXMuIik7CisgICAgfQorICB9CisgIHJldHVybiBuZXcgSW50NjQoaGksIGxvKTsKK307CisKKy8qKgorICogQ29udmVydCBmcm9tIHppZ3phZyBpbnQgdG8gaW50LgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS56aWd6YWdUb0kzMiA9IGZ1bmN0aW9uKG4pIHsKKyAgcmV0dXJuIChuID4+PiAxKSBeICgtMSAqIChuICYgMSkpOworfTsKKworLyoqCisgKiBDb252ZXJ0IGZyb20gemlnemFnIGxvbmcgdG8gbG9uZy4KKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUuemlnemFnVG9JNjQgPSBmdW5jdGlvbihuKSB7CisgIHZhciBoaSA9IG4uYnVmZmVyLnJlYWRVSW50MzJCRSgwLCB0cnVlKTsKKyAgdmFyIGxvID0gbi5idWZmZXIucmVhZFVJbnQzMkJFKDQsIHRydWUpOworCisgIHZhciBuZWcgPSBuZXcgSW50NjQoaGkgJiAwLCBsbyAmIDEpOworICBuZWcuXzJzY29tcCgpOworICB2YXIgaGlfbmVnID0gbmVnLmJ1ZmZlci5yZWFkVUludDMyQkUoMCwgdHJ1ZSk7CisgIHZhciBsb19uZWcgPSBuZWcuYnVmZmVyLnJlYWRVSW50MzJCRSg0LCB0cnVlKTsKKworICB2YXIgaGlfbG8gPSAoaGkgPDwgMzEpOworICBoaSA9IChoaSA+Pj4gMSkgXiAoaGlfbmVnKTsKKyAgbG8gPSAoKGxvID4+PiAxKSB8IGhpX2xvKSBeIChsb19uZWcpOworICByZXR1cm4gbmV3IEludDY0KGhpLCBsbyk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5za2lwID0gZnVuY3Rpb24odHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFR5cGUuU1RPUDoKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFR5cGUuQk9PTDoKKyAgICAgIHRoaXMucmVhZEJvb2woKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5CWVRFOgorICAgICAgdGhpcy5yZWFkQnl0ZSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkkxNjoKKyAgICAgIHRoaXMucmVhZEkxNigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkkzMjoKKyAgICAgIHRoaXMucmVhZEkzMigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkk2NDoKKyAgICAgIHRoaXMucmVhZEk2NCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkRPVUJMRToKKyAgICAgIHRoaXMucmVhZERvdWJsZSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLlNUUklORzoKKyAgICAgIHRoaXMucmVhZFN0cmluZygpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLlNUUlVDVDoKKyAgICAgIHRoaXMucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICB2YXIgciA9IHRoaXMucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgaWYgKHIuZnR5cGUgPT09IFR5cGUuU1RPUCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRoaXMuc2tpcChyLmZ0eXBlKTsKKyAgICAgICAgdGhpcy5yZWFkRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZFN0cnVjdEVuZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLk1BUDoKKyAgICAgIHZhciBtYXBCZWdpbiA9IHRoaXMucmVhZE1hcEJlZ2luKCk7CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcEJlZ2luLnNpemU7ICsraSkgeworICAgICAgICB0aGlzLnNraXAobWFwQmVnaW4ua3R5cGUpOworICAgICAgICB0aGlzLnNraXAobWFwQmVnaW4udnR5cGUpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkTWFwRW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuU0VUOgorICAgICAgdmFyIHNldEJlZ2luID0gdGhpcy5yZWFkU2V0QmVnaW4oKTsKKyAgICAgIGZvciAodmFyIGkyID0gMDsgaTIgPCBzZXRCZWdpbi5zaXplOyArK2kyKSB7CisgICAgICAgIHRoaXMuc2tpcChzZXRCZWdpbi5ldHlwZSk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRTZXRFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5MSVNUOgorICAgICAgdmFyIGxpc3RCZWdpbiA9IHRoaXMucmVhZExpc3RCZWdpbigpOworICAgICAgZm9yICh2YXIgaTMgPSAwOyBpMyA8IGxpc3RCZWdpbi5zaXplOyArK2kzKSB7CisgICAgICAgIHRoaXMuc2tpcChsaXN0QmVnaW4uZXR5cGUpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkTGlzdEVuZCgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IG5ldyAgRXJyb3IoIkludmFsaWQgdHlwZTogIiArIHR5cGUpOworICB9Cit9OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Nvbm5lY3Rpb24uanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29ubmVjdGlvbi5qcwppbmRleCAzNTMwMjI3Li45ZTVjMDYzIDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29ubmVjdGlvbi5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29ubmVjdGlvbi5qcwpAQCAtMTYsMjcgKzE2LDU2IEBACiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotdmFyIHN5cyA9IHJlcXVpcmUoJ3N5cycpLAotICAgIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoImV2ZW50cyIpLkV2ZW50RW1pdHRlciwKLSAgICBuZXQgPSByZXF1aXJlKCduZXQnKSwKLSAgICB0dHJhbnNwb3J0ID0gcmVxdWlyZSgnLi90cmFuc3BvcnQnKSwKLSAgICB0cHJvdG9jb2wgPSByZXF1aXJlKCcuL3Byb3RvY29sJyk7Cit2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTsKK3ZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7Cit2YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnY29uc3RhbnRzJyk7Cit2YXIgbmV0ID0gcmVxdWlyZSgnbmV0Jyk7Cit2YXIgdGxzID0gcmVxdWlyZSgndGxzJyk7Cit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKK3ZhciBsb2cgPSByZXF1aXJlKCcuL2xvZycpOwogCi12YXIgQmluYXJ5UGFyc2VyID0gcmVxdWlyZSgnLi9iaW5hcnlfcGFyc2VyJykuQmluYXJ5UGFyc2VyOwotQmluYXJ5UGFyc2VyLmJpZ0VuZGlhbiA9IHRydWU7Cit2YXIgVEJ1ZmZlcmVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9idWZmZXJlZF90cmFuc3BvcnQnKTsKK3ZhciBUQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL2JpbmFyeV9wcm90b2NvbCcpOwordmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CisKK3ZhciBjcmVhdGVDbGllbnQgPSByZXF1aXJlKCcuL2NyZWF0ZV9jbGllbnQnKTsKKwordmFyIGJpbmFyeSA9IHJlcXVpcmUoJy4vYmluYXJ5Jyk7CiAKIHZhciBDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uID0gZnVuY3Rpb24oc3RyZWFtLCBvcHRpb25zKSB7CiAgIHZhciBzZWxmID0gdGhpczsKICAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7CiAKKyAgdGhpcy5zZXFJZDJTZXJ2aWNlID0ge307CiAgIHRoaXMuY29ubmVjdGlvbiA9IHN0cmVhbTsKKyAgdGhpcy5zc2wgPSAoc3RyZWFtLmVuY3J5cHRlZCk7CiAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307Ci0gIHRoaXMudHJhbnNwb3J0ID0gdGhpcy5vcHRpb25zLnRyYW5zcG9ydCB8fCB0dHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQ7Ci0gIHRoaXMucHJvdG9jb2wgPSB0aGlzLm9wdGlvbnMucHJvdG9jb2wgfHwgdHByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKKyAgdGhpcy50cmFuc3BvcnQgPSB0aGlzLm9wdGlvbnMudHJhbnNwb3J0IHx8IFRCdWZmZXJlZFRyYW5zcG9ydDsKKyAgdGhpcy5wcm90b2NvbCA9IHRoaXMub3B0aW9ucy5wcm90b2NvbCB8fCBUQmluYXJ5UHJvdG9jb2w7CiAgIHRoaXMub2ZmbGluZV9xdWV1ZSA9IFtdOwogICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlOworICB0aGlzLmluaXRpYWxpemVfcmV0cnlfdmFycygpOwogCi0gIHRoaXMuY29ubmVjdGlvbi5hZGRMaXN0ZW5lcigiY29ubmVjdCIsIGZ1bmN0aW9uKCkgeworICB0aGlzLl9kZWJ1ZyA9IHRoaXMub3B0aW9ucy5kZWJ1ZyB8fCBmYWxzZTsKKyAgaWYgKHRoaXMub3B0aW9ucy5tYXhfYXR0ZW1wdHMgJiYKKyAgICAgICFpc05hTih0aGlzLm9wdGlvbnMubWF4X2F0dGVtcHRzKSAmJgorICAgICAgdGhpcy5vcHRpb25zLm1heF9hdHRlbXB0cyA+IDApIHsKKyAgICAgdGhpcy5tYXhfYXR0ZW1wdHMgPSArdGhpcy5vcHRpb25zLm1heF9hdHRlbXB0czsKKyAgfQorICB0aGlzLnJldHJ5X21heF9kZWxheSA9IG51bGw7CisgIGlmICh0aGlzLm9wdGlvbnMucmV0cnlfbWF4X2RlbGF5ICE9PSB1bmRlZmluZWQgJiYKKyAgICAgICFpc05hTih0aGlzLm9wdGlvbnMucmV0cnlfbWF4X2RlbGF5KSAmJgorICAgICAgdGhpcy5vcHRpb25zLnJldHJ5X21heF9kZWxheSA+IDApIHsKKyAgICAgdGhpcy5yZXRyeV9tYXhfZGVsYXkgPSB0aGlzLm9wdGlvbnMucmV0cnlfbWF4X2RlbGF5OworICB9CisgIHRoaXMuY29ubmVjdF90aW1lb3V0ID0gZmFsc2U7CisgIGlmICh0aGlzLm9wdGlvbnMuY29ubmVjdF90aW1lb3V0ICYmCisgICAgICAhaXNOYU4odGhpcy5vcHRpb25zLmNvbm5lY3RfdGltZW91dCkgJiYKKyAgICAgIHRoaXMub3B0aW9ucy5jb25uZWN0X3RpbWVvdXQgPiAwKSB7CisgICAgIHRoaXMuY29ubmVjdF90aW1lb3V0ID0gK3RoaXMub3B0aW9ucy5jb25uZWN0X3RpbWVvdXQ7CisgIH0KKworICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIodGhpcy5zc2wgPyAic2VjdXJlQ29ubmVjdCIgOiAiY29ubmVjdCIsIGZ1bmN0aW9uKCkgewogICAgIHNlbGYuY29ubmVjdGVkID0gdHJ1ZTsKIAogICAgIHRoaXMuc2V0VGltZW91dChzZWxmLm9wdGlvbnMudGltZW91dCB8fCAwKTsKQEAgLTQ0LDYgKzczLDcgQEAKICAgICB0aGlzLmZyYW1lTGVmdCA9IDA7CiAgICAgdGhpcy5mcmFtZVBvcyA9IDA7CiAgICAgdGhpcy5mcmFtZSA9IG51bGw7CisgICAgc2VsZi5pbml0aWFsaXplX3JldHJ5X3ZhcnMoKTsKIAogICAgIHNlbGYub2ZmbGluZV9xdWV1ZS5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgIHNlbGYuY29ubmVjdGlvbi53cml0ZShkYXRhKTsKQEAgLTUzLDYgKzgzLDI0MCBAQAogICB9KTsKIAogICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIoImVycm9yIiwgZnVuY3Rpb24oZXJyKSB7CisgICAgLy8gT25seSBlbWl0IHRoZSBlcnJvciBpZiBuby1vbmUgZWxzZSBpcyBsaXN0ZW5pbmcgb24gdGhlIGNvbm5lY3Rpb24KKyAgICAvLyBvciBpZiBzb21lb25lIGlzIGxpc3RlbmluZyBvbiB1cywgYmVjYXVzZSBOb2RlIHR1cm5zIHVuaGFuZGxlZAorICAgIC8vICdlcnJvcicgZXZlbnRzIGludG8gZXhjZXB0aW9ucy4KKyAgICBpZiAoc2VsZi5jb25uZWN0aW9uLmxpc3RlbmVycygnZXJyb3InKS5sZW5ndGggPT09IDEgfHwKKyAgICAgICAgc2VsZi5saXN0ZW5lcnMoJ2Vycm9yJykubGVuZ3RoID4gMCkgeworICAgICAgc2VsZi5lbWl0KCJlcnJvciIsIGVycik7CisgICAgfQorICB9KTsKKworICAvLyBBZGQgYSBjbG9zZSBsaXN0ZW5lcgorICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIoImNsb3NlIiwgZnVuY3Rpb24oKSB7CisgICAgc2VsZi5jb25uZWN0aW9uX2dvbmUoKTsgLy8gaGFuZGxlIGNsb3NlIGV2ZW50LiB0cnkgdG8gcmVjb25uZWN0CisgIH0pOworCisgIHRoaXMuY29ubmVjdGlvbi5hZGRMaXN0ZW5lcigidGltZW91dCIsIGZ1bmN0aW9uKCkgeworICAgIHNlbGYuZW1pdCgidGltZW91dCIpOworICB9KTsKKworICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIoImRhdGEiLCBzZWxmLnRyYW5zcG9ydC5yZWNlaXZlcihmdW5jdGlvbih0cmFuc3BvcnRfd2l0aF9kYXRhKSB7CisgICAgdmFyIG1lc3NhZ2UgPSBuZXcgc2VsZi5wcm90b2NvbCh0cmFuc3BvcnRfd2l0aF9kYXRhKTsKKyAgICB0cnkgeworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgdmFyIGhlYWRlciA9IG1lc3NhZ2UucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgICB2YXIgZHVtbXlfc2VxaWQgPSBoZWFkZXIucnNlcWlkICogLTE7CisgICAgICAgIHZhciBjbGllbnQgPSBzZWxmLmNsaWVudDsKKyAgICAgICAgLy9UaGUgTXVsdGlwbGV4ZWQgUHJvdG9jb2wgc3RvcmVzIGEgaGFzaCBvZiBzZXFpZCB0byBzZXJ2aWNlIG5hbWVzCisgICAgICAgIC8vICBpbiBzZXFJZDJTZXJ2aWNlLiBJZiB0aGUgU2VxSWQgaXMgZm91bmQgaW4gdGhlIGhhc2ggd2UgbmVlZCB0bworICAgICAgICAvLyAgbG9va3VwIHRoZSBhcHByb3ByaWF0ZSBjbGllbnQgZm9yIHRoaXMgY2FsbC4KKyAgICAgICAgLy8gIFRoZSBjb25uZWN0aW9uLmNsaWVudCBvYmplY3QgaXMgYSBzaW5nbGUgY2xpZW50IG9iamVjdCB3aGVuIG5vdAorICAgICAgICAvLyAgbXVsdGlwbGV4aW5nLCB3aGVuIHVzaW5nIG11bHRpcGxleGluZyBpdCBpcyBhIHNlcnZpY2UgbmFtZSBrZXllZAorICAgICAgICAvLyAgaGFzaCBvZiBjbGllbnQgb2JqZWN0cy4KKyAgICAgICAgLy9OT1RFOiBUaGUgMiB3YXkgaW50ZXJkZXBlbmRlbmNpZXMgYmV0d2VlbiBwcm90b2NvbHMsIHRyYW5zcG9ydHMsCisgICAgICAgIC8vICBjb25uZWN0aW9ucyBhbmQgY2xpZW50cyBpbiB0aGUgTm9kZS5qcyBpbXBsZW1lbnRhdGlvbiBhcmUgaXJyZWd1bGFyCisgICAgICAgIC8vICBhbmQgbWFrZSB0aGUgaW1wbGVtZW50YXRpb24gZGlmZmljdWx0IHRvIGV4dGVuZCBhbmQgbWFpbnRhaW4uIFdlCisgICAgICAgIC8vICBzaG91bGQgYnJpbmcgdGhpcyBzdHVmZiBpbmxpbmUgd2l0aCB0eXBpY2FsIHRocmlmdCBJL08gc3RhY2sKKyAgICAgICAgLy8gIG9wZXJhdGlvbiBzb29uLgorICAgICAgICAvLyAgLS1yYQorICAgICAgICB2YXIgc2VydmljZV9uYW1lID0gc2VsZi5zZXFJZDJTZXJ2aWNlW2hlYWRlci5yc2VxaWRdOworICAgICAgICBpZiAoc2VydmljZV9uYW1lKSB7CisgICAgICAgICAgY2xpZW50ID0gc2VsZi5jbGllbnRbc2VydmljZV9uYW1lXTsKKyAgICAgICAgfQorICAgICAgICAvKmpzaGludCAtVzA4MyAqLworICAgICAgICBjbGllbnQuX3JlcXNbZHVtbXlfc2VxaWRdID0gZnVuY3Rpb24oZXJyLCBzdWNjZXNzKXsKKyAgICAgICAgICB0cmFuc3BvcnRfd2l0aF9kYXRhLmNvbW1pdFBvc2l0aW9uKCk7CisKKyAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBjbGllbnQuX3JlcXNbaGVhZGVyLnJzZXFpZF07CisgICAgICAgICAgZGVsZXRlIGNsaWVudC5fcmVxc1toZWFkZXIucnNlcWlkXTsKKyAgICAgICAgICBpZiAoc2VydmljZV9uYW1lKSB7CisgICAgICAgICAgICBkZWxldGUgc2VsZi5zZXFJZDJTZXJ2aWNlW2hlYWRlci5yc2VxaWRdOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKKyAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgc3VjY2Vzcyk7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICAvKmpzaGludCArVzA4MyAqLworCisgICAgICAgIGlmKGNsaWVudFsncmVjdl8nICsgaGVhZGVyLmZuYW1lXSkgeworICAgICAgICAgIGNsaWVudFsncmVjdl8nICsgaGVhZGVyLmZuYW1lXShtZXNzYWdlLCBoZWFkZXIubXR5cGUsIGR1bW15X3NlcWlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkZWxldGUgY2xpZW50Ll9yZXFzW2R1bW15X3NlcWlkXTsKKyAgICAgICAgICBzZWxmLmVtaXQoImVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuV1JPTkdfTUVUSE9EX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWNlaXZlZCBhIHJlc3BvbnNlIHRvIGFuIHVua25vd24gUlBDIGZ1bmN0aW9uIikpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGNhdGNoIChlKSB7CisgICAgICBpZiAoZSBpbnN0YW5jZW9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvcikgeworICAgICAgICB0cmFuc3BvcnRfd2l0aF9kYXRhLnJvbGxiYWNrUG9zaXRpb24oKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZSk7CisgICAgICB9CisgICAgfQorICB9KSk7Cit9OwordXRpbC5pbmhlcml0cyhDb25uZWN0aW9uLCBFdmVudEVtaXR0ZXIpOworCitDb25uZWN0aW9uLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5jb25uZWN0aW9uLmVuZCgpOworfTsKKworQ29ubmVjdGlvbi5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmNvbm5lY3Rpb24uZGVzdHJveSgpOworfTsKKworQ29ubmVjdGlvbi5wcm90b3R5cGUuaW5pdGlhbGl6ZV9yZXRyeV92YXJzID0gZnVuY3Rpb24gKCkgeworICB0aGlzLnJldHJ5X3RpbWVyID0gbnVsbDsKKyAgdGhpcy5yZXRyeV90b3RhbHRpbWUgPSAwOworICB0aGlzLnJldHJ5X2RlbGF5ID0gMTUwOworICB0aGlzLnJldHJ5X2JhY2tvZmYgPSAxLjc7CisgIHRoaXMuYXR0ZW1wdHMgPSAwOworfTsKKworQ29ubmVjdGlvbi5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihkYXRhKSB7CisgIGlmICghdGhpcy5jb25uZWN0ZWQpIHsKKyAgICB0aGlzLm9mZmxpbmVfcXVldWUucHVzaChkYXRhKTsKKyAgICByZXR1cm47CisgIH0KKyAgdGhpcy5jb25uZWN0aW9uLndyaXRlKGRhdGEpOworfTsKKworQ29ubmVjdGlvbi5wcm90b3R5cGUuY29ubmVjdGlvbl9nb25lID0gZnVuY3Rpb24gKCkgeworICB2YXIgc2VsZiA9IHRoaXM7CisgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7CisKKyAgLy8gSWYgYSByZXRyeSBpcyBhbHJlYWR5IGluIHByb2dyZXNzLCBqdXN0IGxldCB0aGF0IGhhcHBlbgorICBpZiAodGhpcy5yZXRyeV90aW1lcikgeworICAgIHJldHVybjsKKyAgfQorICAvLyBXZSBjYW5ub3QgcmVjb25uZWN0IGEgc2VjdXJlIHNvY2tldC4KKyAgaWYgKCF0aGlzLm1heF9hdHRlbXB0cyB8fCB0aGlzLnNzbCkgeworICAgIHNlbGYuZW1pdCgiY2xvc2UiKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAodGhpcy5yZXRyeV9tYXhfZGVsYXkgIT09IG51bGwgJiYgdGhpcy5yZXRyeV9kZWxheSA+PSB0aGlzLnJldHJ5X21heF9kZWxheSkgeworICAgIHRoaXMucmV0cnlfZGVsYXkgPSB0aGlzLnJldHJ5X21heF9kZWxheTsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLnJldHJ5X2RlbGF5ID0gTWF0aC5mbG9vcih0aGlzLnJldHJ5X2RlbGF5ICogdGhpcy5yZXRyeV9iYWNrb2ZmKTsKKyAgfQorCisgIGxvZy5kZWJ1ZygiUmV0cnkgY29ubmVjdGlvbiBpbiAiICsgdGhpcy5yZXRyeV9kZWxheSArICIgbXMiKTsKKworICBpZiAodGhpcy5tYXhfYXR0ZW1wdHMgJiYgdGhpcy5hdHRlbXB0cyA+PSB0aGlzLm1heF9hdHRlbXB0cykgeworICAgIHRoaXMucmV0cnlfdGltZXIgPSBudWxsOworICAgIGNvbnNvbGUuZXJyb3IoInRocmlmdDogQ291bGRuJ3QgZ2V0IHRocmlmdCBjb25uZWN0aW9uIGFmdGVyICIgKyB0aGlzLm1heF9hdHRlbXB0cyArICIgYXR0ZW1wdHMuIik7CisgICAgc2VsZi5lbWl0KCJjbG9zZSIpOworICAgIHJldHVybjsKKyAgfQorCisgIHRoaXMuYXR0ZW1wdHMgKz0gMTsKKyAgdGhpcy5lbWl0KCJyZWNvbm5lY3RpbmciLCB7CisgICAgZGVsYXk6IHNlbGYucmV0cnlfZGVsYXksCisgICAgYXR0ZW1wdDogc2VsZi5hdHRlbXB0cworICB9KTsKKworICB0aGlzLnJldHJ5X3RpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CisgICAgaWYgKHNlbGYuY29ubmVjdGlvbi5kZXN0cm95ZWQpIHsKKyAgICAgIHNlbGYucmV0cnlfdGltZXIgPSBudWxsOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGxvZy5kZWJ1ZygiUmV0cnlpbmcgY29ubmVjdGlvbi4uLiIpOworCisgICAgc2VsZi5yZXRyeV90b3RhbHRpbWUgKz0gc2VsZi5yZXRyeV9kZWxheTsKKworICAgIGlmIChzZWxmLmNvbm5lY3RfdGltZW91dCAmJiBzZWxmLnJldHJ5X3RvdGFsdGltZSA+PSBzZWxmLmNvbm5lY3RfdGltZW91dCkgeworICAgICAgIHNlbGYucmV0cnlfdGltZXIgPSBudWxsOworICAgICAgIGNvbnNvbGUuZXJyb3IoInRocmlmdDogQ291bGRuJ3QgZ2V0IHRocmlmdCBjb25uZWN0aW9uIGFmdGVyICIgKyBzZWxmLnJldHJ5X3RvdGFsdGltZSArICJtcy4iKTsKKyAgICAgICBzZWxmLmVtaXQoImNsb3NlIik7CisgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChzZWxmLnBhdGggIT09IHVuZGVmaW5lZCkgeworICAgICAgc2VsZi5jb25uZWN0aW9uLmNvbm5lY3Qoc2VsZi5wYXRoKTsKKyAgICB9IGVsc2UgeworICAgICAgc2VsZi5jb25uZWN0aW9uLmNvbm5lY3Qoc2VsZi5wb3J0LCBzZWxmLmhvc3QpOworICAgIH0KKyAgICBzZWxmLnJldHJ5X3RpbWVyID0gbnVsbDsKKyAgfSwgdGhpcy5yZXRyeV9kZWxheSk7Cit9OworCitleHBvcnRzLmNyZWF0ZUNvbm5lY3Rpb24gPSBmdW5jdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKSB7CisgIHZhciBzdHJlYW0gPSBuZXQuY3JlYXRlQ29ubmVjdGlvbihwb3J0LCBob3N0KTsKKyAgdmFyIGNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbihzdHJlYW0sIG9wdGlvbnMpOworICBjb25uZWN0aW9uLmhvc3QgPSBob3N0OworICBjb25uZWN0aW9uLnBvcnQgPSBwb3J0OworCisgIHJldHVybiBjb25uZWN0aW9uOworfTsKKworZXhwb3J0cy5jcmVhdGVVRFNDb25uZWN0aW9uID0gZnVuY3Rpb24ocGF0aCwgb3B0aW9ucykgeworICB2YXIgc3RyZWFtID0gbmV0LmNyZWF0ZUNvbm5lY3Rpb24ocGF0aCk7CisgIHZhciBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oc3RyZWFtLCBvcHRpb25zKTsKKyAgY29ubmVjdGlvbi5wYXRoID0gcGF0aDsKKworICByZXR1cm4gY29ubmVjdGlvbjsKK307CisKK2V4cG9ydHMuY3JlYXRlU1NMQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpIHsKKyAgaWYgKCEoJ3NlY3VyZVByb3RvY29sJyBpbiBvcHRpb25zKSAmJiAhKCdzZWN1cmVPcHRpb25zJyBpbiBvcHRpb25zKSkgeworICAgIG9wdGlvbnMuc2VjdXJlUHJvdG9jb2wgPSAiU1NMdjIzX21ldGhvZCI7CisgICAgb3B0aW9ucy5zZWN1cmVPcHRpb25zID0gY29uc3RhbnRzLlNTTF9PUF9OT19TU0x2MiB8IGNvbnN0YW50cy5TU0xfT1BfTk9fU1NMdjM7CisgIH0KKworICB2YXIgc3RyZWFtID0gdGxzLmNvbm5lY3QocG9ydCwgaG9zdCwgb3B0aW9ucyk7CisgIHZhciBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oc3RyZWFtLCBvcHRpb25zKTsKKyAgY29ubmVjdGlvbi5ob3N0ID0gaG9zdDsKKyAgY29ubmVjdGlvbi5wb3J0ID0gcG9ydDsKKworICByZXR1cm4gY29ubmVjdGlvbjsKK307CisKKworZXhwb3J0cy5jcmVhdGVDbGllbnQgPSBjcmVhdGVDbGllbnQ7CisKK3ZhciBjaGlsZF9wcm9jZXNzID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpOwordmFyIFN0ZElPQ29ubmVjdGlvbiA9IGV4cG9ydHMuU3RkSU9Db25uZWN0aW9uID0gZnVuY3Rpb24oY29tbWFuZCwgb3B0aW9ucykgeworICB2YXIgY29tbWFuZF9wYXJ0cyA9IGNvbW1hbmQuc3BsaXQoJyAnKTsKKyAgY29tbWFuZCA9IGNvbW1hbmRfcGFydHNbMF07CisgIHZhciBhcmdzID0gY29tbWFuZF9wYXJ0cy5zcGxpY2UoMSxjb21tYW5kX3BhcnRzLmxlbmd0aCAtMSk7CisgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGQgPSBjaGlsZF9wcm9jZXNzLnNwYXduKGNvbW1hbmQsYXJncyk7CisKKyAgdmFyIHNlbGYgPSB0aGlzOworICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTsKKworICB0aGlzLmNvbm5lY3Rpb24gPSBjaGlsZC5zdGRpbjsKKyAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKKyAgdGhpcy50cmFuc3BvcnQgPSB0aGlzLm9wdGlvbnMudHJhbnNwb3J0IHx8IFRCdWZmZXJlZFRyYW5zcG9ydDsKKyAgdGhpcy5wcm90b2NvbCA9IHRoaXMub3B0aW9ucy5wcm90b2NvbCB8fCBUQmluYXJ5UHJvdG9jb2w7CisgIHRoaXMub2ZmbGluZV9xdWV1ZSA9IFtdOworCisgIGlmIChsb2cuZ2V0TG9nTGV2ZWwoKSA9PT0gJ2RlYnVnJykgeworICAgIHRoaXMuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGVycikgeworICAgICAgbG9nLmRlYnVnKGVyci50b1N0cmluZygpLCAnQ0hJTEQgRVJST1InKTsKKyAgICB9KTsKKworICAgIHRoaXMuY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSxzaWduYWwpIHsKKyAgICAgIGxvZy5kZWJ1Zyhjb2RlICsgJzonICsgc2lnbmFsLCAnQ0hJTEQgRVhJVEVEJyk7CisgICAgfSk7CisgIH0KKworICB0aGlzLmZyYW1lTGVmdCA9IDA7CisgIHRoaXMuZnJhbWVQb3MgPSAwOworICB0aGlzLmZyYW1lID0gbnVsbDsKKyAgdGhpcy5jb25uZWN0ZWQgPSB0cnVlOworCisgIHNlbGYub2ZmbGluZV9xdWV1ZS5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgIHNlbGYuY29ubmVjdGlvbi53cml0ZShkYXRhKTsKKyAgfSk7CisKKworICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIoImVycm9yIiwgZnVuY3Rpb24oZXJyKSB7CiAgICAgc2VsZi5lbWl0KCJlcnJvciIsIGVycik7CiAgIH0pOwogCkBAIC02MSwxMSArMzI1LDcgQEAKICAgICBzZWxmLmVtaXQoImNsb3NlIik7CiAgIH0pOwogCi0gIHRoaXMuY29ubmVjdGlvbi5hZGRMaXN0ZW5lcigidGltZW91dCIsIGZ1bmN0aW9uKCkgewotICAgIHNlbGYuZW1pdCgidGltZW91dCIpOwotICB9KTsKLQotICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIoImRhdGEiLCBzZWxmLnRyYW5zcG9ydC5yZWNlaXZlcihmdW5jdGlvbih0cmFuc3BvcnRfd2l0aF9kYXRhKSB7CisgIGNoaWxkLnN0ZG91dC5hZGRMaXN0ZW5lcigiZGF0YSIsIHNlbGYudHJhbnNwb3J0LnJlY2VpdmVyKGZ1bmN0aW9uKHRyYW5zcG9ydF93aXRoX2RhdGEpIHsKICAgICB2YXIgbWVzc2FnZSA9IG5ldyBzZWxmLnByb3RvY29sKHRyYW5zcG9ydF93aXRoX2RhdGEpOwogICAgIHRyeSB7CiAgICAgICB2YXIgaGVhZGVyID0gbWVzc2FnZS5yZWFkTWVzc2FnZUJlZ2luKCk7CkBAIC04Myw3ICszNDMsNyBAQAogICAgICAgY2xpZW50WydyZWN2XycgKyBoZWFkZXIuZm5hbWVdKG1lc3NhZ2UsIGhlYWRlci5tdHlwZSwgZHVtbXlfc2VxaWQpOwogICAgIH0KICAgICBjYXRjaCAoZSkgewotICAgICAgaWYgKGUgaW5zdGFuY2VvZiB0dHJhbnNwb3J0LklucHV0QnVmZmVyVW5kZXJydW5FcnJvcikgeworICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKICAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CiAgICAgICB9CiAgICAgICBlbHNlIHsKQEAgLTkyLDM5ICszNTIsMjMgQEAKICAgICB9CiAgIH0pKTsKIH07Ci1zeXMuaW5oZXJpdHMoQ29ubmVjdGlvbiwgRXZlbnRFbWl0dGVyKTsKIAotQ29ubmVjdGlvbi5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7Cit1dGlsLmluaGVyaXRzKFN0ZElPQ29ubmVjdGlvbiwgRXZlbnRFbWl0dGVyKTsKKworU3RkSU9Db25uZWN0aW9uLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbigpIHsKICAgdGhpcy5jb25uZWN0aW9uLmVuZCgpOwotfQorfTsKIAotQ29ubmVjdGlvbi5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihkYXRhKSB7CitTdGRJT0Nvbm5lY3Rpb24ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oZGF0YSkgewogICBpZiAoIXRoaXMuY29ubmVjdGVkKSB7CiAgICAgdGhpcy5vZmZsaW5lX3F1ZXVlLnB1c2goZGF0YSk7CiAgICAgcmV0dXJuOwogICB9CiAgIHRoaXMuY29ubmVjdGlvbi53cml0ZShkYXRhKTsKLX0KK307CiAKLWV4cG9ydHMuY3JlYXRlQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpIHsKLSAgdmFyIHN0cmVhbSA9IG5ldC5jcmVhdGVDb25uZWN0aW9uKHBvcnQsIGhvc3QpOwotICB2YXIgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKHN0cmVhbSwgb3B0aW9ucyk7Ci0gIGNvbm5lY3Rpb24uaG9zdCA9IGhvc3Q7Ci0gIGNvbm5lY3Rpb24ucG9ydCA9IHBvcnQ7CitleHBvcnRzLmNyZWF0ZVN0ZElPQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKGNvbW1hbmQsb3B0aW9ucyl7CisgIHJldHVybiBuZXcgU3RkSU9Db25uZWN0aW9uKGNvbW1hbmQsb3B0aW9ucyk7Cit9OwogCi0gIHJldHVybiBjb25uZWN0aW9uOwotfQotCi1leHBvcnRzLmNyZWF0ZUNsaWVudCA9IGZ1bmN0aW9uKGNscywgY29ubmVjdGlvbikgewotICBpZiAoY2xzLkNsaWVudCkgewotICAgIGNscyA9IGNscy5DbGllbnQ7Ci0gIH0KLSAgdmFyIGNsaWVudCA9IG5ldyBjbHMobmV3IGNvbm5lY3Rpb24udHJhbnNwb3J0KHVuZGVmaW5lZCwgZnVuY3Rpb24oYnVmKSB7Ci0gICAgY29ubmVjdGlvbi53cml0ZShidWYpOwotICB9KSwgY29ubmVjdGlvbi5wcm90b2NvbCk7Ci0KLSAgLy8gVE9ETyBjbGVhbiB0aGlzIHVwCi0gIGNvbm5lY3Rpb24uY2xpZW50ID0gY2xpZW50OwotCi0gIHJldHVybiBjbGllbnQ7Ci19CitleHBvcnRzLmNyZWF0ZVN0ZElPQ2xpZW50ID0gY3JlYXRlQ2xpZW50OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2NyZWF0ZV9jbGllbnQuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvY3JlYXRlX2NsaWVudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmI3N2E4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2NyZWF0ZV9jbGllbnQuanMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCittb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUNsaWVudDsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IGNsaWVudCBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgVGhyaWZ0IHNlcnZpY2UuCisgKiBAcGFyYW0ge29iamVjdH0gU2VydmljZUNsaWVudCAtIFRoZSBtb2R1bGUgY29udGFpbmluZyB0aGUgZ2VuZXJhdGVkIHNlcnZpY2UgY2xpZW50CisgKiBAcGFyYW0ge0Nvbm5lY3Rpb259IENvbm5lY3Rpb24gLSBUaGUgY29ubmVjdGlvbiB0byB1c2UuCisgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgY2xpZW50IG9iamVjdC4KKyAqLworZnVuY3Rpb24gY3JlYXRlQ2xpZW50KFNlcnZpY2VDbGllbnQsIGNvbm5lY3Rpb24pIHsKKyAgLy8gVE9ETyB2YWxpZGF0ZSByZXF1aXJlZCBvcHRpb25zIGFuZCB0aHJvdyBvdGhlcndpc2UKKyAgaWYgKFNlcnZpY2VDbGllbnQuQ2xpZW50KSB7CisgICAgU2VydmljZUNsaWVudCA9IFNlcnZpY2VDbGllbnQuQ2xpZW50OworICB9CisgIC8vIFRPRE8gZGV0YW5nbGUgdGhlc2UgaW5pdGlhbGl6YXRpb24gY2FsbHMKKyAgLy8gY3JlYXRpbmcgImNsaWVudCIgcmVxdWlyZXMKKyAgLy8gICAtIG5ldyBzZXJ2aWNlIGNsaWVudCBpbnN0YW5jZQorICAvLworICAvLyBOZXcgc2VydmljZSBjbGllbnQgaW5zdGFuY2UgcmVxdWlyZXMKKyAgLy8gICAtIG5ldyB0cmFuc3BvcnQgaW5zdGFuY2UKKyAgLy8gICAtIHByb3RvY29sIGNsYXNzIHJlZmVyZW5jZQorICAvLworICAvLyBOZXcgdHJhbnNwb3J0IGluc3RhbmNlIHJlcXVpcmVzCisgIC8vICAgLSBCdWZmZXIgdG8gdXNlIChvciBub25lKQorICAvLyAgIC0gQ2FsbGJhY2sgdG8gY2FsbCBvbiBmbHVzaAorCisgIC8vIFdyYXAgdGhlIHdyaXRlIG1ldGhvZAorICB2YXIgd3JpdGVDYiA9IGZ1bmN0aW9uKGJ1Ziwgc2VxaWQpIHsKKyAgICBjb25uZWN0aW9uLndyaXRlKGJ1Ziwgc2VxaWQpOworICB9OworICB2YXIgdHJhbnNwb3J0ID0gbmV3IGNvbm5lY3Rpb24udHJhbnNwb3J0KHVuZGVmaW5lZCwgd3JpdGVDYik7CisgIHZhciBjbGllbnQgPSBuZXcgU2VydmljZUNsaWVudCh0cmFuc3BvcnQsIGNvbm5lY3Rpb24ucHJvdG9jb2wpOworICB0cmFuc3BvcnQuY2xpZW50ID0gY2xpZW50OworICBjb25uZWN0aW9uLmNsaWVudCA9IGNsaWVudDsKKyAgcmV0dXJuIGNsaWVudDsKK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9mcmFtZWRfdHJhbnNwb3J0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NDc5MjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydC5qcwpAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgYmluYXJ5ID0gcmVxdWlyZSgnLi9iaW5hcnknKTsKK3ZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOworCittb2R1bGUuZXhwb3J0cyA9IFRGcmFtZWRUcmFuc3BvcnQ7CisKK2Z1bmN0aW9uIFRGcmFtZWRUcmFuc3BvcnQoYnVmZmVyLCBjYWxsYmFjaykgeworICB0aGlzLmluQnVmID0gYnVmZmVyIHx8IG5ldyBCdWZmZXIoMCk7CisgIHRoaXMub3V0QnVmZmVycyA9IFtdOworICB0aGlzLm91dENvdW50ID0gMDsKKyAgdGhpcy5yZWFkUG9zID0gMDsKKyAgdGhpcy5vbkZsdXNoID0gY2FsbGJhY2s7Cit9OworCitURnJhbWVkVHJhbnNwb3J0LnJlY2VpdmVyID0gZnVuY3Rpb24oY2FsbGJhY2ssIHNlcWlkKSB7CisgIHZhciByZXNpZHVhbCA9IG51bGw7CisKKyAgcmV0dXJuIGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAvLyBQcmVwZW5kIGFueSByZXNpZHVhbCBkYXRhIGZyb20gb3VyIHByZXZpb3VzIHJlYWQKKyAgICBpZiAocmVzaWR1YWwpIHsKKyAgICAgIGRhdGEgPSBCdWZmZXIuY29uY2F0KFtyZXNpZHVhbCwgZGF0YV0pOworICAgICAgcmVzaWR1YWwgPSBudWxsOworICAgIH0KKworICAgIC8vIGZyYW1lZCB0cmFuc3BvcnQKKyAgICB3aGlsZSAoZGF0YS5sZW5ndGgpIHsKKyAgICAgIGlmIChkYXRhLmxlbmd0aCA8IDQpIHsKKyAgICAgICAgLy8gTm90IGVub3VnaCBieXRlcyB0byBjb250aW51ZSwgc2F2ZSBhbmQgcmVzdW1lIG9uIG5leHQgcGFja2V0CisgICAgICAgIHJlc2lkdWFsID0gZGF0YTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdmFyIGZyYW1lU2l6ZSA9IGJpbmFyeS5yZWFkSTMyKGRhdGEsIDApOworICAgICAgaWYgKGRhdGEubGVuZ3RoIDwgNCArIGZyYW1lU2l6ZSkgeworICAgICAgICAvLyBOb3QgZW5vdWdoIGJ5dGVzIHRvIGNvbnRpbnVlLCBzYXZlIGFuZCByZXN1bWUgb24gbmV4dCBwYWNrZXQKKyAgICAgICAgcmVzaWR1YWwgPSBkYXRhOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBmcmFtZSA9IGRhdGEuc2xpY2UoNCwgNCArIGZyYW1lU2l6ZSk7CisgICAgICByZXNpZHVhbCA9IGRhdGEuc2xpY2UoNCArIGZyYW1lU2l6ZSk7CisKKyAgICAgIGNhbGxiYWNrKG5ldyBURnJhbWVkVHJhbnNwb3J0KGZyYW1lKSwgc2VxaWQpOworCisgICAgICBkYXRhID0gcmVzaWR1YWw7CisgICAgICByZXNpZHVhbCA9IG51bGw7CisgICAgfQorICB9OworfTsKKworVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUuY29tbWl0UG9zaXRpb24gPSBmdW5jdGlvbigpe30sCitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS5yb2xsYmFja1Bvc2l0aW9uID0gZnVuY3Rpb24oKXt9LAorCisgIC8vIFRPRE86IEltcGxlbWVudCBvcGVuL2Nsb3NlIHN1cHBvcnQKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLmlzT3BlbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdHJ1ZTsKK307CitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oKSB7fTsKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLmNsb3NlID0gIGZ1bmN0aW9uKCkge307CisKKyAgLy8gU2V0IHRoZSBzZXFpZCBvZiB0aGUgbWVzc2FnZSBpbiB0aGUgY2xpZW50CisgIC8vIFNvIHRoYXQgY2FsbGJhY2tzIGNhbiBiZSBmb3VuZAorVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUuc2V0Q3VyclNlcUlkID0gZnVuY3Rpb24oc2VxaWQpIHsKKyAgdGhpcy5fc2VxaWQgPSBzZXFpZDsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLmVuc3VyZUF2YWlsYWJsZSA9IGZ1bmN0aW9uKGxlbikgeworICBpZiAodGhpcy5yZWFkUG9zICsgbGVuID4gdGhpcy5pbkJ1Zi5sZW5ndGgpIHsKKyAgICB0aHJvdyBuZXcgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKCk7CisgIH0KK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihsZW4pIHsgLy8gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgZm9yIGVhY2ggZnJhbWVzLgorICB0aGlzLmVuc3VyZUF2YWlsYWJsZShsZW4pOworICB2YXIgZW5kID0gdGhpcy5yZWFkUG9zICsgbGVuOworCisgIGlmICh0aGlzLmluQnVmLmxlbmd0aCA8IGVuZCkgeworICAgIHRocm93IG5ldyBFcnJvcigncmVhZCgnICsgbGVuICsgJykgZmFpbGVkIC0gbm90IGVub3VnaCBkYXRhJyk7CisgIH0KKworICB2YXIgYnVmID0gdGhpcy5pbkJ1Zi5zbGljZSh0aGlzLnJlYWRQb3MsIGVuZCk7CisgIHRoaXMucmVhZFBvcyA9IGVuZDsKKyAgcmV0dXJuIGJ1ZjsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRCeXRlID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKDEpOworICByZXR1cm4gYmluYXJ5LnJlYWRCeXRlKHRoaXMuaW5CdWZbdGhpcy5yZWFkUG9zKytdKTsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRJMTYgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUoMik7CisgIHZhciBpMTYgPSBiaW5hcnkucmVhZEkxNih0aGlzLmluQnVmLCB0aGlzLnJlYWRQb3MpOworICB0aGlzLnJlYWRQb3MgKz0gMjsKKyAgcmV0dXJuIGkxNjsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRJMzIgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUoNCk7CisgIHZhciBpMzIgPSBiaW5hcnkucmVhZEkzMih0aGlzLmluQnVmLCB0aGlzLnJlYWRQb3MpOworICB0aGlzLnJlYWRQb3MgKz0gNDsKKyAgcmV0dXJuIGkzMjsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWREb3VibGUgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUoOCk7CisgIHZhciBkID0gYmluYXJ5LnJlYWREb3VibGUodGhpcy5pbkJ1ZiwgdGhpcy5yZWFkUG9zKTsKKyAgdGhpcy5yZWFkUG9zICs9IDg7CisgIHJldHVybiBkOworfTsKKworVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUucmVhZFN0cmluZyA9IGZ1bmN0aW9uKGxlbikgeworICB0aGlzLmVuc3VyZUF2YWlsYWJsZShsZW4pOworICB2YXIgc3RyID0gdGhpcy5pbkJ1Zi50b1N0cmluZygndXRmOCcsIHRoaXMucmVhZFBvcywgdGhpcy5yZWFkUG9zICsgbGVuKTsKKyAgdGhpcy5yZWFkUG9zICs9IGxlbjsKKyAgcmV0dXJuIHN0cjsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLmJvcnJvdyA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4geworICAgIGJ1ZjogdGhpcy5pbkJ1ZiwKKyAgICByZWFkSW5kZXg6IHRoaXMucmVhZFBvcywKKyAgICB3cml0ZUluZGV4OiB0aGlzLmluQnVmLmxlbmd0aAorICB9OworfTsKKworVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUuY29uc3VtZSA9IGZ1bmN0aW9uKGJ5dGVzQ29uc3VtZWQpIHsKKyAgdGhpcy5yZWFkUG9zICs9IGJ5dGVzQ29uc3VtZWQ7Cit9OworCitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZiwgZW5jb2RpbmcpIHsKKyAgaWYgKHR5cGVvZihidWYpID09PSAic3RyaW5nIikgeworICAgIGJ1ZiA9IG5ldyBCdWZmZXIoYnVmLCBlbmNvZGluZyB8fCAndXRmOCcpOworICB9CisgIHRoaXMub3V0QnVmZmVycy5wdXNoKGJ1Zik7CisgIHRoaXMub3V0Q291bnQgKz0gYnVmLmxlbmd0aDsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oKSB7CisgIC8vIElmIHRoZSBzZXFpZCBvZiB0aGUgY2FsbGJhY2sgaXMgYXZhaWxhYmxlIHBhc3MgaXQgdG8gdGhlIG9uRmx1c2gKKyAgLy8gVGhlbiByZW1vdmUgdGhlIGN1cnJlbnQgc2VxaWQKKyAgdmFyIHNlcWlkID0gdGhpcy5fc2VxaWQ7CisgIHRoaXMuX3NlcWlkID0gbnVsbDsKKworICB2YXIgb3V0ID0gbmV3IEJ1ZmZlcih0aGlzLm91dENvdW50KSwKKyAgICAgIHBvcyA9IDA7CisgIHRoaXMub3V0QnVmZmVycy5mb3JFYWNoKGZ1bmN0aW9uKGJ1ZikgeworICAgIGJ1Zi5jb3B5KG91dCwgcG9zLCAwKTsKKyAgICBwb3MgKz0gYnVmLmxlbmd0aDsKKyAgfSk7CisKKyAgaWYgKHRoaXMub25GbHVzaCkgeworICAgIC8vIFRPRE86IG9wdGltaXplIHRoaXMgYmV0dGVyLCBhbGxvY2F0ZSBvbmUgYnVmZmVyIGluc3RlYWQgb2YgYm90aDoKKyAgICB2YXIgbXNnID0gbmV3IEJ1ZmZlcihvdXQubGVuZ3RoICsgNCk7CisgICAgYmluYXJ5LndyaXRlSTMyKG1zZywgb3V0Lmxlbmd0aCk7CisgICAgb3V0LmNvcHkobXNnLCA0LCAwLCBvdXQubGVuZ3RoKTsKKyAgICBpZiAodGhpcy5vbkZsdXNoKSB7CisgICAgICAvLyBQYXNzaW5nIHNlcWlkIHRocm91Z2ggdGhpcyBjYWxsIHRvIGdldCBpdCB0byB0aGUgY29ubmVjdGlvbgorICAgICAgdGhpcy5vbkZsdXNoKG1zZywgc2VxaWQpOworICAgIH0KKyAgfQorCisgIHRoaXMub3V0QnVmZmVycyA9IFtdOworICB0aGlzLm91dENvdW50ID0gMDsKK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvaHR0cF9jb25uZWN0aW9uLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2h0dHBfY29ubmVjdGlvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzJhYjBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2h0dHBfY29ubmVjdGlvbi5qcwpAQCAtMCwwICsxLDI2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7Cit2YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKTsKK3ZhciBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7Cit2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyOwordmFyIHRocmlmdCA9IHJlcXVpcmUoJy4vdGhyaWZ0Jyk7CisKK3ZhciBUQnVmZmVyZWRUcmFuc3BvcnQgPSByZXF1aXJlKCcuL2J1ZmZlcmVkX3RyYW5zcG9ydCcpOwordmFyIFRCaW5hcnlQcm90b2NvbCA9IHJlcXVpcmUoJy4vYmluYXJ5X3Byb3RvY29sJyk7Cit2YXIgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yID0gcmVxdWlyZSgnLi9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3InKTsKKwordmFyIGNyZWF0ZUNsaWVudCA9IHJlcXVpcmUoJy4vY3JlYXRlX2NsaWVudCcpOworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgQ29ubmVjdE9wdGlvbnMKKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmFuc3BvcnQgLSBUaGUgVGhyaWZ0IGxheWVyZWQgdHJhbnNwb3J0IHRvIHVzZSAoVEJ1ZmZlcmVkVHJhbnNwb3J0LCBldGMpLgorICogQHByb3BlcnR5IHtzdHJpbmd9IHByb3RvY29sIC0gVGhlIFRocmlmdCBzZXJpYWxpemF0aW9uIHByb3RvY29sIHRvIHVzZSAoVEJpbmFyeVByb3RvY29sLCBldGMuKS4KKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gVGhlIFVSTCBwYXRoIHRvIFBPU1QgdG8gKGUuZy4gIi8iLCAiL215U3ZjIiwgIi90aHJpZnQvcXVvdGVTdmMiLCBldGMuKS4KKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBoZWFkZXJzIC0gQSBzdGFuZGFyZCBOb2RlLmpzIGhlYWRlciBoYXNoLCBhbiBvYmplY3QgaGFzaCBjb250YWluaW5nIGtleS92YWx1ZQorICogICAgICAgIHBhaXJzIHdoZXJlIHRoZSBrZXkgaXMgdGhlIGhlYWRlciBuYW1lIHN0cmluZyBhbmQgdGhlIHZhbHVlIGlzIHRoZSBoZWFkZXIgdmFsdWUgc3RyaW5nLgorICogQHByb3BlcnR5IHtib29sZWFufSBodHRwcyAtIFRydWUgY2F1c2VzIHRoZSBjb25uZWN0aW9uIHRvIHVzZSBodHRwcywgb3RoZXJ3aXNlIGh0dHAgaXMgdXNlZC4KKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBub2RlT3B0aW9ucyAtIE9wdGlvbnMgcGFzc2VkIG9uIHRvIG5vZGUuCisgKiBAZXhhbXBsZQorICogICAgIC8vVXNlIGEgY29ubmVjdGlvbiB0aGF0IHJlcXVpcmVzIHNzbC90bHMsIGNsb3NlcyB0aGUgY29ubmVjdGlvbiBhZnRlciBlYWNoIHJlcXVlc3QsCisgKiAgICAgLy8gIHVzZXMgdGhlIGJ1ZmZlcmVkIHRyYW5zcG9ydCBsYXllciwgdXNlcyB0aGUgSlNPTiBwcm90b2NvbCBhbmQgZGlyZWN0cyBSUEMgdHJhZmZpYworICogICAgIC8vICB0byBodHRwczovL3RocmlmdC5leGFtcGxlLmNvbTo5MDkwL2hlbGxvCisgKiAgICAgdmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOworICogICAgIHZhciBvcHRpb25zID0geworICogICAgICAgIHRyYW5zcG9ydDogdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydCwKKyAqICAgICAgICBwcm90b2NvbDogdGhyaWZ0LlRKU09OUHJvdG9jb2wsCisgKiAgICAgICAgcGF0aDogIi9oZWxsbyIsCisgKiAgICAgICAgaGVhZGVyczogeyJDb25uZWN0aW9uIjogImNsb3NlIn0sCisgKiAgICAgICAgaHR0cHM6IHRydWUKKyAqICAgICB9OworICogICAgIHZhciBjb24gPSB0aHJpZnQuY3JlYXRlSHR0cENvbm5lY3Rpb24oInRocmlmdC5leGFtcGxlLmNvbSIsIDkwOTAsIG9wdGlvbnMpOworICogICAgIHZhciBjbGllbnQgPSB0aHJpZnQuY3JlYXRlSHR0cENsaWVudChteVNlcnZpY2UsIGNvbm5lY3Rpb24pOworICogICAgIGNsaWVudC5teVNlcnZpY2VGdW5jdGlvbigpOworICovCisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBUaHJpZnQgSHR0cENvbm5lY3Rpb24gaW5zdGFuY2UgKHVzZSBjcmVhdGVIdHRwQ29ubmVjdGlvbigpIHJhdGhlciB0aGFuCisgKiAgICBpbnN0YW50aWF0aW5nIGRpcmVjdGx5KS4KKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtDb25uZWN0T3B0aW9uc30gb3B0aW9ucyAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlLgorICogQHRocm93cyB7ZXJyb3J9IEV4Y2VwdGlvbnMgb3RoZXIgdGhhbiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgYXJlIHJldGhyb3duCisgKiBAZXZlbnQge2Vycm9yfSBUaGUgImVycm9yIiBldmVudCBpcyBmaXJlZCB3aGVuIGEgTm9kZS5qcyBlcnJvciBldmVudCBvY2N1cnMgZHVyaW5nCisgKiAgICAgcmVxdWVzdCBvciByZXNwb25zZSBwcm9jZXNzaW5nLCBpbiB3aGljaCBjYXNlIHRoZSBub2RlIGVycm9yIGlzIHBhc3NlZCBvbi4gQW4gImVycm9yIgorICogICAgIGV2ZW50IG1heSBhbHNvIGJlIGZpcmVkIHdoZW4gdGhlIGNvbm5lY3Rpb24gY2FuIG5vdCBtYXAgYSByZXNwb25zZSBiYWNrIHRvIHRoZQorICogICAgIGFwcHJvcHJpYXRlIGNsaWVudCAoYW4gaW50ZXJuYWwgZXJyb3IpLCBnZW5lcmF0aW5nIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLgorICogQGNsYXNzZGVzYyBIdHRwQ29ubmVjdGlvbiBvYmplY3RzIHByb3ZpZGUgVGhyaWZ0IGVuZCBwb2ludCB0cmFuc3BvcnQKKyAqICAgICBzZW1hbnRpY3MgaW1wbGVtZW50ZWQgb3ZlciB0aGUgTm9kZS5qcyBodHRwLnJlcXVlc3QoKSBtZXRob2QuCisgKiBAc2VlIHtAbGluayBjcmVhdGVIdHRwQ29ubmVjdGlvbn0KKyAqLwordmFyIEh0dHBDb25uZWN0aW9uID0gZXhwb3J0cy5IdHRwQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKKyAgLy9Jbml0aWFsaXplIHRoZSBlbWl0dGVyIGJhc2Ugb2JqZWN0CisgIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpOworCisgIC8vU2V0IGNvbmZpZ3VyYXRpb24KKyAgdmFyIHNlbGYgPSB0aGlzOworICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworICB0aGlzLmhvc3QgPSB0aGlzLm9wdGlvbnMuaG9zdDsKKyAgdGhpcy5wb3J0ID0gdGhpcy5vcHRpb25zLnBvcnQ7CisgIHRoaXMuc29ja2V0UGF0aCA9IHRoaXMub3B0aW9ucy5zb2NrZXRQYXRoOworICB0aGlzLmh0dHBzID0gdGhpcy5vcHRpb25zLmh0dHBzIHx8IGZhbHNlOworICB0aGlzLnRyYW5zcG9ydCA9IHRoaXMub3B0aW9ucy50cmFuc3BvcnQgfHwgVEJ1ZmZlcmVkVHJhbnNwb3J0OworICB0aGlzLnByb3RvY29sID0gdGhpcy5vcHRpb25zLnByb3RvY29sIHx8IFRCaW5hcnlQcm90b2NvbDsKKworICAvL1ByZXBhcmUgTm9kZS5qcyBvcHRpb25zCisgIHRoaXMubm9kZU9wdGlvbnMgPSB7CisgICAgaG9zdDogdGhpcy5ob3N0LAorICAgIHBvcnQ6IHRoaXMucG9ydCwKKyAgICBzb2NrZXRQYXRoOiB0aGlzLnNvY2tldFBhdGgsCisgICAgcGF0aDogdGhpcy5vcHRpb25zLnBhdGggfHwgJy8nLAorICAgIG1ldGhvZDogJ1BPU1QnLAorICAgIGhlYWRlcnM6IHRoaXMub3B0aW9ucy5oZWFkZXJzIHx8IHt9LAorICAgIHJlc3BvbnNlVHlwZTogdGhpcy5vcHRpb25zLnJlc3BvbnNlVHlwZSB8fCBudWxsCisgIH07CisgIGZvciAodmFyIGF0dHJuYW1lIGluIHRoaXMub3B0aW9ucy5ub2RlT3B0aW9ucykgeworICAgIHRoaXMubm9kZU9wdGlvbnNbYXR0cm5hbWVdID0gdGhpcy5vcHRpb25zLm5vZGVPcHRpb25zW2F0dHJuYW1lXTsKKyAgfQorICAvKmpzaGludCAtVzA2OSAqLworICBpZiAoISB0aGlzLm5vZGVPcHRpb25zLmhlYWRlcnNbJ0Nvbm5lY3Rpb24nXSkgeworICAgIHRoaXMubm9kZU9wdGlvbnMuaGVhZGVyc1snQ29ubmVjdGlvbiddID0gJ2tlZXAtYWxpdmUnOworICB9CisgIC8qanNoaW50ICtXMDY5ICovCisKKyAgLy9UaGUgc2VxdWVuY2UgbWFwIGlzIHVzZWQgdG8gbWFwIHNlcUlEcyBiYWNrIHRvIHRoZQorICAvLyAgY2FsbGluZyBjbGllbnQgaW4gbXVsdGlwbGV4ZWQgc2NlbmFyaW9zCisgIHRoaXMuc2VxSWQyU2VydmljZSA9IHt9OworCisgIGZ1bmN0aW9uIGRlY29kZUNhbGxiYWNrKHRyYW5zcG9ydF93aXRoX2RhdGEpIHsKKyAgICB2YXIgcHJvdG8gPSBuZXcgc2VsZi5wcm90b2NvbCh0cmFuc3BvcnRfd2l0aF9kYXRhKTsKKyAgICB0cnkgeworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgdmFyIGhlYWRlciA9IHByb3RvLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgICAgdmFyIGR1bW15X3NlcWlkID0gaGVhZGVyLnJzZXFpZCAqIC0xOworICAgICAgICB2YXIgY2xpZW50ID0gc2VsZi5jbGllbnQ7CisgICAgICAgIC8vVGhlIE11bHRpcGxleGVkIFByb3RvY29sIHN0b3JlcyBhIGhhc2ggb2Ygc2VxaWQgdG8gc2VydmljZSBuYW1lcworICAgICAgICAvLyAgaW4gc2VxSWQyU2VydmljZS4gSWYgdGhlIFNlcUlkIGlzIGZvdW5kIGluIHRoZSBoYXNoIHdlIG5lZWQgdG8KKyAgICAgICAgLy8gIGxvb2t1cCB0aGUgYXBwcm9wcmlhdGUgY2xpZW50IGZvciB0aGlzIGNhbGwuCisgICAgICAgIC8vICBUaGUgY2xpZW50IHZhciBpcyBhIHNpbmdsZSBjbGllbnQgb2JqZWN0IHdoZW4gbm90IG11bHRpcGxleGluZywKKyAgICAgICAgLy8gIHdoZW4gdXNpbmcgbXVsdGlwbGV4aW5nIGl0IGlzIGEgc2VydmljZSBuYW1lIGtleWVkIGhhc2ggb2YgY2xpZW50CisgICAgICAgIC8vICBvYmplY3RzLgorICAgICAgICAvL05PVEU6IFRoZSAyIHdheSBpbnRlcmRlcGVuZGVuY2llcyBiZXR3ZWVuIHByb3RvY29scywgdHJhbnNwb3J0cywKKyAgICAgICAgLy8gIGNvbm5lY3Rpb25zIGFuZCBjbGllbnRzIGluIHRoZSBOb2RlLmpzIGltcGxlbWVudGF0aW9uIGFyZSBpcnJlZ3VsYXIKKyAgICAgICAgLy8gIGFuZCBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbiBkaWZmaWN1bHQgdG8gZXh0ZW5kIGFuZCBtYWludGFpbi4gV2UKKyAgICAgICAgLy8gIHNob3VsZCBicmluZyB0aGlzIHN0dWZmIGlubGluZSB3aXRoIHR5cGljYWwgdGhyaWZ0IEkvTyBzdGFjaworICAgICAgICAvLyAgb3BlcmF0aW9uIHNvb24uCisgICAgICAgIC8vICAtLXJhCisgICAgICAgIHZhciBzZXJ2aWNlX25hbWUgPSBzZWxmLnNlcUlkMlNlcnZpY2VbaGVhZGVyLnJzZXFpZF07CisgICAgICAgIGlmIChzZXJ2aWNlX25hbWUpIHsKKyAgICAgICAgICBjbGllbnQgPSBzZWxmLmNsaWVudFtzZXJ2aWNlX25hbWVdOworICAgICAgICAgIGRlbGV0ZSBzZWxmLnNlcUlkMlNlcnZpY2VbaGVhZGVyLnJzZXFpZF07CisgICAgICAgIH0KKyAgICAgICAgLypqc2hpbnQgLVcwODMgKi8KKyAgICAgICAgY2xpZW50Ll9yZXFzW2R1bW15X3NlcWlkXSA9IGZ1bmN0aW9uKGVyciwgc3VjY2Vzcyl7CisgICAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5jb21taXRQb3NpdGlvbigpOworICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGNsaWVudC5fcmVxc1toZWFkZXIucnNlcWlkXTsKKyAgICAgICAgICBkZWxldGUgY2xpZW50Ll9yZXFzW2hlYWRlci5yc2VxaWRdOworICAgICAgICAgIGlmIChjbGllbnRDYWxsYmFjaykgeworICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2soZXJyLCBzdWNjZXNzKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgLypqc2hpbnQgK1cwODMgKi8KKyAgICAgICAgaWYoY2xpZW50WydyZWN2XycgKyBoZWFkZXIuZm5hbWVdKSB7CisgICAgICAgICAgY2xpZW50WydyZWN2XycgKyBoZWFkZXIuZm5hbWVdKHByb3RvLCBoZWFkZXIubXR5cGUsIGR1bW15X3NlcWlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkZWxldGUgY2xpZW50Ll9yZXFzW2R1bW15X3NlcWlkXTsKKyAgICAgICAgICBzZWxmLmVtaXQoImVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLldST05HX01FVEhPRF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgYSByZXNwb25zZSB0byBhbiB1bmtub3duIFJQQyBmdW5jdGlvbiIpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBjYXRjaCAoZSkgeworICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKKyAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZSk7CisgICAgICB9CisgICAgfQorICB9CisKKworICAvL1Jlc3BvbnNlIGhhbmRsZXIKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgdGhpcy5yZXNwb25zZUNhbGxiYWNrID0gZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICB2YXIgZGF0YSA9IFtdOworICAgIHZhciBkYXRhTGVuID0gMDsKKworICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHsKKyAgICAgIHRoaXMuZW1pdCgiZXJyb3IiLCBuZXcgVEhUVFBFeGNlcHRpb24ocmVzcG9uc2UpKTsKKyAgICB9CisKKyAgICByZXNwb25zZS5vbignZXJyb3InLCBmdW5jdGlvbiAoZSkgeworICAgICAgc2VsZi5lbWl0KCJlcnJvciIsIGUpOworICAgIH0pOworCisgICAgLy8gV2hlbiBydW5uaW5nIGRpcmVjdGx5IHVuZGVyIG5vZGUsIGNodW5rIHdpbGwgYmUgYSBidWZmZXIsCisgICAgLy8gaG93ZXZlciwgd2hlbiBydW5uaW5nIGluIGEgQnJvd3NlciAoZS5nLiBCcm93c2VyaWZ5KSwgY2h1bmsKKyAgICAvLyB3aWxsIGJlIGEgc3RyaW5nIG9yIGFuIEFycmF5QnVmZmVyLgorICAgIHJlc3BvbnNlLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7CisgICAgICBpZiAoKHR5cGVvZiBjaHVuayA9PSAnc3RyaW5nJykgfHwKKyAgICAgICAgICAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGNodW5rKSA9PSAnW29iamVjdCBVaW50OEFycmF5XScpKSB7CisgICAgICAgIC8vIFdyYXAgQXJyYXlCdWZmZXIvc3RyaW5nIGluIGEgQnVmZmVyIHNvIGRhdGFbaV0uY29weSB3aWxsIHdvcmsKKyAgICAgICAgZGF0YS5wdXNoKG5ldyBCdWZmZXIoY2h1bmspKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEucHVzaChjaHVuayk7CisgICAgICB9CisgICAgICBkYXRhTGVuICs9IGNodW5rLmxlbmd0aDsKKyAgICB9KTsKKworICAgIHJlc3BvbnNlLm9uKCdlbmQnLCBmdW5jdGlvbigpeworICAgICAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoZGF0YUxlbik7CisgICAgICBmb3IgKHZhciBpPTAsIGxlbj1kYXRhLmxlbmd0aCwgcG9zPTA7IGk8bGVuOyBpKyspIHsKKyAgICAgICAgZGF0YVtpXS5jb3B5KGJ1ZiwgcG9zKTsKKyAgICAgICAgcG9zICs9IGRhdGFbaV0ubGVuZ3RoOworICAgICAgfQorICAgICAgLy9HZXQgdGhlIHJlY2VpdmVyIGZ1bmN0aW9uIGZvciB0aGUgdHJhbnNwb3J0IGFuZAorICAgICAgLy8gIGNhbGwgaXQgd2l0aCB0aGUgYnVmZmVyCisgICAgICBzZWxmLnRyYW5zcG9ydC5yZWNlaXZlcihkZWNvZGVDYWxsYmFjaykoYnVmKTsKKyAgICB9KTsKKyAgfTsKK307Cit1dGlsLmluaGVyaXRzKEh0dHBDb25uZWN0aW9uLCBFdmVudEVtaXR0ZXIpOworCisvKioKKyAqIFdyaXRlcyBUaHJpZnQgbWVzc2FnZSBkYXRhIHRvIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIEEgTm9kZS5qcyBCdWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byB3cml0ZQorICogQHJldHVybnMge3ZvaWR9IE5vIHJldHVybiB2YWx1ZS4KKyAqIEBldmVudCB7ZXJyb3J9IHRoZSAiZXJyb3IiIGV2ZW50IGlzIHJhaXNlZCB1cG9uIHJlcXVlc3QgZmFpbHVyZSBwYXNzaW5nIHRoZQorICogICAgIE5vZGUuanMgZXJyb3Igb2JqZWN0IHRvIHRoZSBsaXN0ZW5lci4KKyAqLworSHR0cENvbm5lY3Rpb24ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oZGF0YSkgeworICB2YXIgc2VsZiA9IHRoaXM7CisgIHZhciBvcHRzID0gc2VsZi5ub2RlT3B0aW9uczsKKyAgb3B0cy5oZWFkZXJzWyJDb250ZW50LWxlbmd0aCJdID0gZGF0YS5sZW5ndGg7CisgIGlmICghb3B0cy5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSkKKyAgICBvcHRzLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdID0gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IjsgIAorICB2YXIgcmVxID0gKHNlbGYuaHR0cHMpID8KKyAgICAgIGh0dHBzLnJlcXVlc3Qob3B0cywgc2VsZi5yZXNwb25zZUNhbGxiYWNrKSA6CisgICAgICBodHRwLnJlcXVlc3Qob3B0cywgc2VsZi5yZXNwb25zZUNhbGxiYWNrKTsKKyAgcmVxLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikgeworICAgIHNlbGYuZW1pdCgiZXJyb3IiLCBlcnIpOworICB9KTsKKyAgcmVxLndyaXRlKGRhdGEpOworICByZXEuZW5kKCk7Cit9OworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgSHR0cENvbm5lY3Rpb24gb2JqZWN0LCB1c2VkIGJ5IFRocmlmdCBjbGllbnRzIHRvIGNvbm5lY3QKKyAqICAgIHRvIFRocmlmdCBIVFRQIGJhc2VkIHNlcnZlcnMuCisgKiBAcGFyYW0ge3N0cmluZ30gaG9zdCAtIFRoZSBob3N0IG5hbWUgb3IgSVAgdG8gY29ubmVjdCB0by4KKyAqIEBwYXJhbSB7bnVtYmVyfSBwb3J0IC0gVGhlIFRDUCBwb3J0IHRvIGNvbm5lY3QgdG8uCisgKiBAcGFyYW0ge0Nvbm5lY3RPcHRpb25zfSBvcHRpb25zIC0gVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UuCisgKiBAcmV0dXJucyB7SHR0cENvbm5lY3Rpb259IFRoZSBjb25uZWN0aW9uIG9iamVjdC4KKyAqIEBzZWUge0BsaW5rIENvbm5lY3RPcHRpb25zfQorICovCitleHBvcnRzLmNyZWF0ZUh0dHBDb25uZWN0aW9uID0gZnVuY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucykgeworICBvcHRpb25zLmhvc3QgPSBob3N0OworICBvcHRpb25zLnBvcnQgPSBwb3J0IHx8IDgwOworICByZXR1cm4gbmV3IEh0dHBDb25uZWN0aW9uKG9wdGlvbnMpOworfTsKKworZXhwb3J0cy5jcmVhdGVIdHRwVURTQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKHBhdGgsIG9wdGlvbnMpIHsKKyAgb3B0aW9ucy5zb2NrZXRQYXRoID0gcGF0aDsKKyAgcmV0dXJuIG5ldyBIdHRwQ29ubmVjdGlvbihvcHRpb25zKTsKK307CisKK2V4cG9ydHMuY3JlYXRlSHR0cENsaWVudCA9IGNyZWF0ZUNsaWVudAorCisKK2Z1bmN0aW9uIFRIVFRQRXhjZXB0aW9uKHJlc3BvbnNlKSB7CisgIHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24uY2FsbCh0aGlzKTsKKyAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CisgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTsKKyAgdGhpcy5zdGF0dXNDb2RlID0gcmVzcG9uc2Uuc3RhdHVzQ29kZTsKKyAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworICB0aGlzLnR5cGUgPSB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5QUk9UT0NPTF9FUlJPUjsKKyAgdGhpcy5tZXNzYWdlID0gIlJlY2VpdmVkIGEgcmVzcG9uc2Ugd2l0aCBhIGJhZCBIVFRQIHN0YXR1cyBjb2RlOiAiICsgcmVzcG9uc2Uuc3RhdHVzQ29kZTsKK30KK3V0aWwuaW5oZXJpdHMoVEhUVFBFeGNlcHRpb24sIHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2luZGV4LmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2luZGV4LmpzCmluZGV4IGY0ZmEzY2QuLmIwOTk1M2QgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbmRleC5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW5kZXguanMKQEAgLTE4LDkgKzE4LDU3IEBACiAgKi8KIGV4cG9ydHMuVGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKIAordmFyIGxvZyA9IHJlcXVpcmUoJy4vbG9nJyk7CitleHBvcnRzLnNldExvZ0Z1bmMgPSBsb2cuc2V0TG9nRnVuYzsKK2V4cG9ydHMuc2V0TG9nTGV2ZWwgPSBsb2cuc2V0TG9nTGV2ZWw7CitleHBvcnRzLmdldExvZ0xldmVsID0gbG9nLmdldExvZ0xldmVsOworCiB2YXIgY29ubmVjdGlvbiA9IHJlcXVpcmUoJy4vY29ubmVjdGlvbicpOwogZXhwb3J0cy5Db25uZWN0aW9uID0gY29ubmVjdGlvbi5Db25uZWN0aW9uOwogZXhwb3J0cy5jcmVhdGVDbGllbnQgPSBjb25uZWN0aW9uLmNyZWF0ZUNsaWVudDsKIGV4cG9ydHMuY3JlYXRlQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb24uY3JlYXRlQ29ubmVjdGlvbjsKK2V4cG9ydHMuY3JlYXRlVURTQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb24uY3JlYXRlVURTQ29ubmVjdGlvbjsKK2V4cG9ydHMuY3JlYXRlU1NMQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb24uY3JlYXRlU1NMQ29ubmVjdGlvbjsKK2V4cG9ydHMuY3JlYXRlU3RkSU9DbGllbnQgPSBjb25uZWN0aW9uLmNyZWF0ZVN0ZElPQ2xpZW50OworZXhwb3J0cy5jcmVhdGVTdGRJT0Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uLmNyZWF0ZVN0ZElPQ29ubmVjdGlvbjsKIAotZXhwb3J0cy5jcmVhdGVTZXJ2ZXIgPSByZXF1aXJlKCcuL3NlcnZlcicpLmNyZWF0ZVNlcnZlcjsKK3ZhciBodHRwQ29ubmVjdGlvbiA9IHJlcXVpcmUoJy4vaHR0cF9jb25uZWN0aW9uJyk7CitleHBvcnRzLkh0dHBDb25uZWN0aW9uID0gaHR0cENvbm5lY3Rpb24uSHR0cENvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZUh0dHBDb25uZWN0aW9uID0gaHR0cENvbm5lY3Rpb24uY3JlYXRlSHR0cENvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZUh0dHBVRFNDb25uZWN0aW9uID0gaHR0cENvbm5lY3Rpb24uY3JlYXRlSHR0cFVEU0Nvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZUh0dHBDbGllbnQgPSBodHRwQ29ubmVjdGlvbi5jcmVhdGVIdHRwQ2xpZW50OworCit2YXIgd3NDb25uZWN0aW9uID0gcmVxdWlyZSgnLi93c19jb25uZWN0aW9uJyk7CitleHBvcnRzLldTQ29ubmVjdGlvbiA9IHdzQ29ubmVjdGlvbi5XU0Nvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZVdTQ29ubmVjdGlvbiA9IHdzQ29ubmVjdGlvbi5jcmVhdGVXU0Nvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZVdTQ2xpZW50ID0gd3NDb25uZWN0aW9uLmNyZWF0ZVdTQ2xpZW50OworCit2YXIgeGhyQ29ubmVjdGlvbiA9IHJlcXVpcmUoJy4veGhyX2Nvbm5lY3Rpb24nKTsKK2V4cG9ydHMuWEhSQ29ubmVjdGlvbiA9IHhockNvbm5lY3Rpb24uWEhSQ29ubmVjdGlvbjsKK2V4cG9ydHMuY3JlYXRlWEhSQ29ubmVjdGlvbiA9IHhockNvbm5lY3Rpb24uY3JlYXRlWEhSQ29ubmVjdGlvbjsKK2V4cG9ydHMuY3JlYXRlWEhSQ2xpZW50ID0geGhyQ29ubmVjdGlvbi5jcmVhdGVYSFJDbGllbnQ7CisKK3ZhciBzZXJ2ZXIgPSByZXF1aXJlKCcuL3NlcnZlcicpOworZXhwb3J0cy5jcmVhdGVTZXJ2ZXIgPSBzZXJ2ZXIuY3JlYXRlU2VydmVyOworZXhwb3J0cy5jcmVhdGVNdWx0aXBsZXhTZXJ2ZXIgPSBzZXJ2ZXIuY3JlYXRlTXVsdGlwbGV4U2VydmVyOworCit2YXIgd2ViX3NlcnZlciA9IHJlcXVpcmUoJy4vd2ViX3NlcnZlcicpOworZXhwb3J0cy5jcmVhdGVXZWJTZXJ2ZXIgPSB3ZWJfc2VydmVyLmNyZWF0ZVdlYlNlcnZlcjsKKworZXhwb3J0cy5JbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKK2V4cG9ydHMuUSA9IHJlcXVpcmUoJ3EnKTsKKwordmFyIG1wcm9jZXNzb3IgPSByZXF1aXJlKCcuL211bHRpcGxleGVkX3Byb2Nlc3NvcicpOwordmFyIG1wcm90b2NvbCA9IHJlcXVpcmUoJy4vbXVsdGlwbGV4ZWRfcHJvdG9jb2wnKTsKK2V4cG9ydHMuTXVsdGlwbGV4ZXIgPSBtcHJvdG9jb2wuTXVsdGlwbGV4ZXI7CitleHBvcnRzLk11bHRpcGxleGVkUHJvY2Vzc29yID0gbXByb2Nlc3Nvci5NdWx0aXBsZXhlZFByb2Nlc3NvcjsKKworLyoKKyAqIEV4cG9ydCB0cmFuc3BvcnQgYW5kIHByb3RvY29sIHNvIHRoZXkgY2FuIGJlIHVzZWQgb3V0c2lkZSBvZiBhCisgKiBjYXNzYW5kcmEvc2VydmVyIGNvbnRleHQKKyAqLworZXhwb3J0cy5URnJhbWVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9mcmFtZWRfdHJhbnNwb3J0Jyk7CitleHBvcnRzLlRCdWZmZXJlZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vYnVmZmVyZWRfdHJhbnNwb3J0Jyk7CitleHBvcnRzLlRCaW5hcnlQcm90b2NvbCA9IHJlcXVpcmUoJy4vYmluYXJ5X3Byb3RvY29sJyk7CitleHBvcnRzLlRKU09OUHJvdG9jb2wgPSByZXF1aXJlKCcuL2pzb25fcHJvdG9jb2wnKTsKK2V4cG9ydHMuVENvbXBhY3RQcm90b2NvbCA9IHJlcXVpcmUoJy4vY29tcGFjdF9wcm90b2NvbCcpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvci5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3IuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI1NTVlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3IuanMKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordmFyIHV0aWwgPSByZXF1aXJlKCJ1dGlsIik7CisKK21vZHVsZS5leHBvcnRzID0gSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yOworCitmdW5jdGlvbiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IobWVzc2FnZSkgeworICBFcnJvci5jYWxsKHRoaXMpOworICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTsKKyAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lOworICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworfTsKKwordXRpbC5pbmhlcml0cyhJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IsIEVycm9yKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbnQ2NF91dGlsLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2ludDY0X3V0aWwuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkNzA3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbnQ2NF91dGlsLmpzCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIEludDY0ID0gcmVxdWlyZSgnbm9kZS1pbnQ2NCcpOworCit2YXIgSW50NjRVdGlsID0gbW9kdWxlLmV4cG9ydHMgPSB7fTsKKwordmFyIFBPVzJfMjQgPSBNYXRoLnBvdygyLCAyNCk7Cit2YXIgUE9XMl8zMSA9IE1hdGgucG93KDIsIDMxKTsKK3ZhciBQT1cyXzMyID0gTWF0aC5wb3coMiwgMzIpOwordmFyIFBPVzEwXzExID0gTWF0aC5wb3coMTAsIDExKTsKKworSW50NjRVdGlsLnRvRGVjaW1hbFN0cmluZyA9IGZ1bmN0aW9uKGk2NCkgeworICB2YXIgYiA9IGk2NC5idWZmZXI7CisgIHZhciBvID0gaTY0Lm9mZnNldDsKKyAgaWYgKCghYltvXSAmJiAhKGJbbyArIDFdICYgMHhlMCkpIHx8CisgICAgICAoIX5iW29dICYmICF+KGJbbyArIDFdICYgMHhlMCkpKSB7CisgICAgLy8gVGhlIG1hZ25pdHVkZSBpcyBzbWFsbCBlbm91Z2guCisgICAgcmV0dXJuIGk2NC50b1N0cmluZygpOworICB9IGVsc2UgeworICAgIHZhciBuZWdhdGl2ZSA9IGJbb10gJiAweDgwOworICAgIGlmIChuZWdhdGl2ZSkgeworICAgICAgLy8gMidzIGNvbXBsZW1lbnQKKyAgICAgIHZhciBpbmNyZW1lbnRlZCA9IGZhbHNlOworICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBCdWZmZXIoOCk7CisgICAgICBmb3IgKHZhciBpID0gNzsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgYnVmZmVyW2ldID0gKH5iW28gKyBpXSArIChpbmNyZW1lbnRlZCA/IDAgOiAxKSkgJiAweGZmOworICAgICAgICBpbmNyZW1lbnRlZCB8PSBiW28gKyBpXTsKKyAgICAgIH0KKyAgICAgIGIgPSBidWZmZXI7CisgICAgfQorICAgIHZhciBoaWdoMiA9IGJbbyArIDFdICsgKGJbb10gPDwgOCk7CisgICAgLy8gTGVzc2VyIDExIGRpZ2l0cyB3aXRoIGV4Y2VlZGluZyB2YWx1ZXMgYnV0IGlzIHVuZGVyIDUzIGJpdHMgY2FwYWNpdHkuCisgICAgdmFyIGxvdyA9IGJbbyArIDddICsgKGJbbyArIDZdIDw8IDgpICsgKGJbbyArIDVdIDw8IDE2KQorICAgICAgICArIGJbbyArIDRdICogUE9XMl8yNCAgLy8gQml0IHNoaWZ0IHJlbmRlcnMgMzJ0aCBiaXQgYXMgc2lnbiwgc28gdXNlIG11bHRpcGxpY2F0aW9uCisgICAgICAgICsgKGJbbyArIDNdICsgKGJbbyArIDJdIDw8IDgpKSAqIFBPVzJfMzIgKyBoaWdoMiAqIDc0OTc2NzEwNjU2OyAgLy8gVGhlIGxpdGVyYWwgaXMgMl40OCAlIDEwXjExCisgICAgLy8gMTJ0aCBkaWdpdCBhbmQgZ3JlYXRlci4KKyAgICB2YXIgaGlnaCA9IE1hdGguZmxvb3IobG93IC8gUE9XMTBfMTEpICsgaGlnaDIgKiAyODE0OyAgLy8gVGhlIGxpdGVyYWwgaXMgMl40OCAvIDEwXjExCisgICAgLy8gTWFrZSBpdCBleGFjdGx5IDExIHdpdGggbGVhZGluZyB6ZXJvcy4KKyAgICBsb3cgPSAoJzAwMDAwMDAwMDAwJyArIFN0cmluZyhsb3cgJSBQT1cxMF8xMSkpLnNsaWNlKC0xMSk7CisgICAgcmV0dXJuIChuZWdhdGl2ZSA/ICctJyA6ICcnKSArIFN0cmluZyhoaWdoKSArIGxvdzsKKyAgfQorfTsKKworSW50NjRVdGlsLmZyb21EZWNpbWFsU3RyaW5nID0gZnVuY3Rpb24odGV4dCkgeworICB2YXIgbmVnYXRpdmUgPSB0ZXh0LmNoYXJBdCgwKSA9PT0gJy0nOworICBpZiAodGV4dC5sZW5ndGggPCAobmVnYXRpdmUgPyAxNyA6IDE2KSkgeworICAgIC8vIFRoZSBtYWduaXR1ZGUgaXMgc21hbGxlciB0aGFuIDJeNTMuCisgICAgcmV0dXJuIG5ldyBJbnQ2NCgrdGV4dCk7CisgIH0gZWxzZSBpZiAodGV4dC5sZW5ndGggPiAobmVnYXRpdmUgPyAyMCA6IDE5KSkgeworICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUb28gbWFueSBkaWdpdHMgZm9yIEludDY0OiAnICsgdGV4dCk7CisgIH0gZWxzZSB7CisgICAgLy8gTW9zdCBzaWduaWZpY2FudCAodXAgdG8gNSkgZGlnaXRzCisgICAgdmFyIGhpZ2g1ID0gK3RleHQuc2xpY2UobmVnYXRpdmUgPyAxIDogMCwgLTE1KTsKKyAgICB2YXIgbG93ID0gK3RleHQuc2xpY2UoLTE1KSArIGhpZ2g1ICogMjc2NDQ3MjMyMDsgIC8vIFRoZSBsaXRlcmFsIGlzIDEwXjE1ICUgMl4zMgorICAgIHZhciBoaWdoID0gTWF0aC5mbG9vcihsb3cgLyBQT1cyXzMyKSArIGhpZ2g1ICogMjMyODMwOyAgLy8gVGhlIGxpdGVyYWwgaXMgMTBeMTUgLyAyXiYzMgorICAgIGxvdyA9IGxvdyAlIFBPVzJfMzI7CisgICAgaWYgKGhpZ2ggPj0gUE9XMl8zMSAmJgorICAgICAgICAhKG5lZ2F0aXZlICYmIGhpZ2ggPT0gUE9XMl8zMSAmJiBsb3cgPT0gMCkgIC8vIEFsbG93IG1pbmltdW0gSW50NjQKKyAgICAgICApIHsKKyAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgbWFnbml0dWRlIGlzIHRvbyBsYXJnZSBmb3IgSW50NjQuJyk7CisgICAgfQorICAgIGlmIChuZWdhdGl2ZSkgeworICAgICAgLy8gMidzIGNvbXBsZW1lbnQKKyAgICAgIGhpZ2ggPSB+aGlnaDsKKyAgICAgIGlmIChsb3cgPT09IDApIHsKKyAgICAgICAgaGlnaCA9IChoaWdoICsgMSkgJiAweGZmZmZmZmZmOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbG93ID0gfmxvdyArIDE7CisgICAgICB9CisgICAgICBoaWdoID0gMHg4MDAwMDAwMCB8IGhpZ2g7CisgICAgfQorICAgIHJldHVybiBuZXcgSW50NjQoaGlnaCwgbG93KTsKKyAgfQorfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3BhcnNlLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2pzb25fcGFyc2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiMGJmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3BhcnNlLmpzCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogSW1wb3J0ZWQgZnJvbSBEb3VnbGFzIENyb2NrZm9yZCdzIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiB3aXRoIG1pbmltdW0gbW9kaWZpY2F0aW9uCisgKiB0byBoYW5kbGUgSW50NjQuCisgKgorICogaHR0cHM6Ly9naXRodWIuY29tL2RvdWdsYXNjcm9ja2ZvcmQvSlNPTi1qcy9ibG9iL2M5ODk0OGFlMTk0NGEyOGUyZThlYmMzNzE3ODk0ZTU4MGFlYWFhMDUvanNvbl9wYXJzZS5qcworICoKKyAqIE9yaWdpbmFsIGxpY2Vuc2UgaGVhZGVyOgorICoKKyAqIGpzb25fcGFyc2UuanMKKyAqIDIwMTUtMDUtMDIKKyAqIFB1YmxpYyBEb21haW4uCisgKiBOTyBXQVJSQU5UWSBFWFBSRVNTRUQgT1IgSU1QTElFRC4gVVNFIEFUIFlPVVIgT1dOIFJJU0suCisgKi8KKworCisvKmpzbGludCBmb3IgKi8KKworLypwcm9wZXJ0eQorICAgIGF0LCBiLCBjYWxsLCBjaGFyQXQsIGYsIGZyb21DaGFyQ29kZSwgaGFzT3duUHJvcGVydHksIG1lc3NhZ2UsIG4sIG5hbWUsCisgICAgcHJvdG90eXBlLCBwdXNoLCByLCB0LCB0ZXh0CisqLworCit2YXIgSW50NjQgPSByZXF1aXJlKCdub2RlLWludDY0Jyk7Cit2YXIgSW50NjRVdGlsID0gcmVxdWlyZSgnLi9pbnQ2NF91dGlsJyk7CisKK3ZhciBqc29uX3BhcnNlID0gbW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKCkgeworICAgICJ1c2Ugc3RyaWN0IjsKKworLy8gVGhpcyBpcyBhIGZ1bmN0aW9uIHRoYXQgY2FuIHBhcnNlIGEgSlNPTiB0ZXh0LCBwcm9kdWNpbmcgYSBKYXZhU2NyaXB0CisvLyBkYXRhIHN0cnVjdHVyZS4gSXQgaXMgYSBzaW1wbGUsIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlci4gSXQgZG9lcyBub3QgdXNlCisvLyBldmFsIG9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIHNvIGl0IGNhbiBiZSB1c2VkIGFzIGEgbW9kZWwgZm9yIGltcGxlbWVudGluZworLy8gYSBKU09OIHBhcnNlciBpbiBvdGhlciBsYW5ndWFnZXMuCisKKy8vIFdlIGFyZSBkZWZpbmluZyB0aGUgZnVuY3Rpb24gaW5zaWRlIG9mIGFub3RoZXIgZnVuY3Rpb24gdG8gYXZvaWQgY3JlYXRpbmcKKy8vIGdsb2JhbCB2YXJpYWJsZXMuCisKKyAgICB2YXIgYXQsICAgICAvLyBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgY2hhcmFjdGVyCisgICAgICAgIGNoLCAgICAgLy8gVGhlIGN1cnJlbnQgY2hhcmFjdGVyCisgICAgICAgIGVzY2FwZWUgPSB7CisgICAgICAgICAgICAnIic6ICciJywKKyAgICAgICAgICAgICdcXCc6ICdcXCcsCisgICAgICAgICAgICAnLyc6ICcvJywKKyAgICAgICAgICAgIGI6ICdcYicsCisgICAgICAgICAgICBmOiAnXGYnLAorICAgICAgICAgICAgbjogJ1xuJywKKyAgICAgICAgICAgIHI6ICdccicsCisgICAgICAgICAgICB0OiAnXHQnCisgICAgICAgIH0sCisgICAgICAgIHRleHQsCisKKyAgICAgICAgZXJyb3IgPSBmdW5jdGlvbiAobSkgeworCisvLyBDYWxsIGVycm9yIHdoZW4gc29tZXRoaW5nIGlzIHdyb25nLgorCisgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IobSk7CisgICAgICAgIH0sCisKKyAgICAgICAgbmV4dCA9IGZ1bmN0aW9uIChjKSB7CisKKy8vIElmIGEgYyBwYXJhbWV0ZXIgaXMgcHJvdmlkZWQsIHZlcmlmeSB0aGF0IGl0IG1hdGNoZXMgdGhlIGN1cnJlbnQgY2hhcmFjdGVyLgorCisgICAgICAgICAgICBpZiAoYyAmJiBjICE9PSBjaCkgeworICAgICAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCAnIiArIGMgKyAiJyBpbnN0ZWFkIG9mICciICsgY2ggKyAiJyIpOworICAgICAgICAgICAgfQorCisvLyBHZXQgdGhlIG5leHQgY2hhcmFjdGVyLiBXaGVuIHRoZXJlIGFyZSBubyBtb3JlIGNoYXJhY3RlcnMsCisvLyByZXR1cm4gdGhlIGVtcHR5IHN0cmluZy4KKworICAgICAgICAgICAgY2ggPSB0ZXh0LmNoYXJBdChhdCk7CisgICAgICAgICAgICBhdCArPSAxOworICAgICAgICAgICAgcmV0dXJuIGNoOworICAgICAgICB9LAorCisgICAgICAgIG51bWJlciA9IGZ1bmN0aW9uICgpIHsKKworLy8gUGFyc2UgYSBudW1iZXIgdmFsdWUuCisKKyAgICAgICAgICAgIHZhciBudW1iZXIsCisgICAgICAgICAgICAgICAgc3RyaW5nID0gJyc7CisKKyAgICAgICAgICAgIGlmIChjaCA9PT0gJy0nKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nID0gJy0nOworICAgICAgICAgICAgICAgIG5leHQoJy0nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOworICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaCA9PT0gJy4nKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nICs9ICcuJzsKKyAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCgpICYmIGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaCA9PT0gJ2UnIHx8IGNoID09PSAnRScpIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7CisgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJy0nIHx8IGNoID09PSAnKycpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOworICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bWJlciA9ICtzdHJpbmc7CisgICAgICAgICAgICBpZiAoIWlzRmluaXRlKG51bWJlcikpIHsKKyAgICAgICAgICAgICAgICBlcnJvcigiQmFkIG51bWJlciIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPj0gSW50NjQuTUFYX0lOVCB8fCBudW1iZXIgPD0gSW50NjQuTUlOX0lOVCkgeworICAgICAgICAgICAgICAgIC8vIFJldHVybiByYXcgc3RyaW5nIGZvciBmdXJ0aGVyIHByb2Nlc3MgaW4gVEpTT05Qcm90b2NvbAorICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgc3RyaW5nID0gZnVuY3Rpb24gKCkgeworCisvLyBQYXJzZSBhIHN0cmluZyB2YWx1ZS4KKworICAgICAgICAgICAgdmFyIGhleCwKKyAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgIHN0cmluZyA9ICcnLAorICAgICAgICAgICAgICAgIHVmZmZmOworCisvLyBXaGVuIHBhcnNpbmcgZm9yIHN0cmluZyB2YWx1ZXMsIHdlIG11c3QgbG9vayBmb3IgIiBhbmQgXCBjaGFyYWN0ZXJzLgorCisgICAgICAgICAgICBpZiAoY2ggPT09ICciJykgeworICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnIicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICd1JykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVmZmZmID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSArPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhleCA9IHBhcnNlSW50KG5leHQoKSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRmluaXRlKGhleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVmZmZmID0gdWZmZmYgKiAxNiArIGhleDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodWZmZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXNjYXBlZVtjaF0gPT09ICdzdHJpbmcnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IGVzY2FwZWVbY2hdOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVycm9yKCJCYWQgc3RyaW5nIik7CisgICAgICAgIH0sCisKKyAgICAgICAgd2hpdGUgPSBmdW5jdGlvbiAoKSB7CisKKy8vIFNraXAgd2hpdGVzcGFjZS4KKworICAgICAgICAgICAgd2hpbGUgKGNoICYmIGNoIDw9ICcgJykgeworICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICB3b3JkID0gZnVuY3Rpb24gKCkgeworCisvLyB0cnVlLCBmYWxzZSwgb3IgbnVsbC4KKworICAgICAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICAgICAgbmV4dCgndCcpOworICAgICAgICAgICAgICAgIG5leHQoJ3InKTsKKyAgICAgICAgICAgICAgICBuZXh0KCd1Jyk7CisgICAgICAgICAgICAgICAgbmV4dCgnZScpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICAgICAgbmV4dCgnZicpOworICAgICAgICAgICAgICAgIG5leHQoJ2EnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdsJyk7CisgICAgICAgICAgICAgICAgbmV4dCgncycpOworICAgICAgICAgICAgICAgIG5leHQoJ2UnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICAgICAgICBuZXh0KCduJyk7CisgICAgICAgICAgICAgICAgbmV4dCgndScpOworICAgICAgICAgICAgICAgIG5leHQoJ2wnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdsJyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnJvcigiVW5leHBlY3RlZCAnIiArIGNoICsgIiciKTsKKyAgICAgICAgfSwKKworICAgICAgICB2YWx1ZSwgIC8vIFBsYWNlIGhvbGRlciBmb3IgdGhlIHZhbHVlIGZ1bmN0aW9uLgorCisgICAgICAgIGFycmF5ID0gZnVuY3Rpb24gKCkgeworCisvLyBQYXJzZSBhbiBhcnJheSB2YWx1ZS4KKworICAgICAgICAgICAgdmFyIGFycmF5ID0gW107CisKKyAgICAgICAgICAgIGlmIChjaCA9PT0gJ1snKSB7CisgICAgICAgICAgICAgICAgbmV4dCgnWycpOworICAgICAgICAgICAgICAgIHdoaXRlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXScpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCgnXScpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7ICAgLy8gZW1wdHkgYXJyYXkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKGNoKSB7CisgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHdoaXRlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ10nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCddJyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmV4dCgnLCcpOworICAgICAgICAgICAgICAgICAgICB3aGl0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVycm9yKCJCYWQgYXJyYXkiKTsKKyAgICAgICAgfSwKKworICAgICAgICBvYmplY3QgPSBmdW5jdGlvbiAoKSB7CisKKy8vIFBhcnNlIGFuIG9iamVjdCB2YWx1ZS4KKworICAgICAgICAgICAgdmFyIGtleSwKKyAgICAgICAgICAgICAgICBvYmplY3QgPSB7fTsKKworICAgICAgICAgICAgaWYgKGNoID09PSAneycpIHsKKyAgICAgICAgICAgICAgICBuZXh0KCd7Jyk7CisgICAgICAgICAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICd9JykgeworICAgICAgICAgICAgICAgICAgICBuZXh0KCd9Jyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7ICAgLy8gZW1wdHkgb2JqZWN0CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlIChjaCkgeworICAgICAgICAgICAgICAgICAgICBrZXkgPSBzdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCgnOicpOworICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRHVwbGljYXRlIGtleSAiJyArIGtleSArICciJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZSgpOworICAgICAgICAgICAgICAgICAgICB3aGl0ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICd9JykgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgnfScpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuZXh0KCcsJyk7CisgICAgICAgICAgICAgICAgICAgIHdoaXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyb3IoIkJhZCBvYmplY3QiKTsKKyAgICAgICAgfTsKKworICAgIHZhbHVlID0gZnVuY3Rpb24gKCkgeworCisvLyBQYXJzZSBhIEpTT04gdmFsdWUuIEl0IGNvdWxkIGJlIGFuIG9iamVjdCwgYW4gYXJyYXksIGEgc3RyaW5nLCBhIG51bWJlciwKKy8vIG9yIGEgd29yZC4KKworICAgICAgICB3aGl0ZSgpOworICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgIGNhc2UgJ3snOgorICAgICAgICAgICAgcmV0dXJuIG9iamVjdCgpOworICAgICAgICBjYXNlICdbJzoKKyAgICAgICAgICAgIHJldHVybiBhcnJheSgpOworICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmcoKTsKKyAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgICByZXR1cm4gbnVtYmVyKCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gY2ggPj0gJzAnICYmIGNoIDw9ICc5JworICAgICAgICAgICAgICAgID8gbnVtYmVyKCkKKyAgICAgICAgICAgICAgICA6IHdvcmQoKTsKKyAgICAgICAgfQorICAgIH07CisKKy8vIFJldHVybiB0aGUganNvbl9wYXJzZSBmdW5jdGlvbi4gSXQgd2lsbCBoYXZlIGFjY2VzcyB0byBhbGwgb2YgdGhlIGFib3ZlCisvLyBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcy4KKworICAgIHJldHVybiBmdW5jdGlvbiAoc291cmNlKSB7CisgICAgICAgIHZhciByZXN1bHQ7CisKKyAgICAgICAgdGV4dCA9IHNvdXJjZTsKKyAgICAgICAgYXQgPSAwOworICAgICAgICBjaCA9ICcgJzsKKyAgICAgICAgcmVzdWx0ID0gdmFsdWUoKTsKKyAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgaWYgKGNoKSB7CisgICAgICAgICAgICBlcnJvcigiU3ludGF4IGVycm9yIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH07Cit9KCkpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2pzb25fcHJvdG9jb2wuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvanNvbl9wcm90b2NvbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjdhM2IyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2pzb25fcHJvdG9jb2wuanMKQEAgLTAsMCArMSw4MDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIEludDY0ID0gcmVxdWlyZSgnbm9kZS1pbnQ2NCcpOwordmFyIFRocmlmdCA9IHJlcXVpcmUoJy4vdGhyaWZ0Jyk7Cit2YXIgVHlwZSA9IFRocmlmdC5UeXBlOwordmFyIHV0aWwgPSByZXF1aXJlKCJ1dGlsIik7CisKK3ZhciBJbnQ2NFV0aWwgPSByZXF1aXJlKCcuL2ludDY0X3V0aWwnKTsKK3ZhciBqc29uX3BhcnNlID0gcmVxdWlyZSgnLi9qc29uX3BhcnNlJyk7CisKK3ZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOworCittb2R1bGUuZXhwb3J0cyA9IFRKU09OUHJvdG9jb2w7CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBUaHJpZnQgSlNPTiBwcm90b2NvbCBpbnN0YW5jZS4KKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtUaHJpZnQuVHJhbnNwb3J0fSB0cmFucyAtIFRoZSB0cmFuc3BvcnQgdG8gc2VyaWFsaXplIHRvL2Zyb20uCisgKiBAY2xhc3NkZXNjIEFwYWNoZSBUaHJpZnQgUHJvdG9jb2xzIHBlcmZvcm0gc2VyaWFsaXphdGlvbiB3aGljaCBlbmFibGVzIGNyb3NzCisgKiBsYW5ndWFnZSBSUEMuIFRoZSBQcm90b2NvbCB0eXBlIGlzIHRoZSBKYXZhU2NyaXB0IGJyb3dzZXIgaW1wbGVtZW50YXRpb24KKyAqIG9mIHRoZSBBcGFjaGUgVGhyaWZ0IFRKU09OUHJvdG9jb2wuCisgKiBAZXhhbXBsZQorICogICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CisgKi8KK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2wodHJhbnMpIHsKKyAgdGhpcy50c3RhY2sgPSBbXTsKKyAgdGhpcy50cG9zID0gW107CisgIHRoaXMudHJhbnMgPSB0cmFuczsKK307CisKKy8qKgorICogVGhyaWZ0IElETCB0eXBlIElkIHRvIHN0cmluZyBtYXBwaW5nLgorICogQHJlYWRvbmx5CisgKiBAc2VlIHtAbGluayBUaHJpZnQuVHlwZX0KKyAqLworVEpTT05Qcm90b2NvbC5UeXBlID0ge307CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5CT09MXSA9ICcidGYiJzsKK1RKU09OUHJvdG9jb2wuVHlwZVtUeXBlLkJZVEVdID0gJyJpOCInOworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuSTE2XSA9ICciaTE2Iic7CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5JMzJdID0gJyJpMzIiJzsKK1RKU09OUHJvdG9jb2wuVHlwZVtUeXBlLkk2NF0gPSAnImk2NCInOworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuRE9VQkxFXSA9ICciZGJsIic7CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5TVFJVQ1RdID0gJyJyZWMiJzsKK1RKU09OUHJvdG9jb2wuVHlwZVtUeXBlLlNUUklOR10gPSAnInN0ciInOworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuTUFQXSA9ICcibWFwIic7CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5MSVNUXSA9ICcibHN0Iic7CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5TRVRdID0gJyJzZXQiJzsKKworLyoqCisgKiBUaHJpZnQgSURMIHR5cGUgc3RyaW5nIHRvIElkIG1hcHBpbmcuCisgKiBAcmVhZG9ubHkKKyAqIEBzZWUge0BsaW5rIFRocmlmdC5UeXBlfQorICovCitUSlNPTlByb3RvY29sLlJUeXBlID0ge307CitUSlNPTlByb3RvY29sLlJUeXBlLnRmID0gVHlwZS5CT09MOworVEpTT05Qcm90b2NvbC5SVHlwZS5pOCA9IFR5cGUuQllURTsKK1RKU09OUHJvdG9jb2wuUlR5cGUuaTE2ID0gVHlwZS5JMTY7CitUSlNPTlByb3RvY29sLlJUeXBlLmkzMiA9IFR5cGUuSTMyOworVEpTT05Qcm90b2NvbC5SVHlwZS5pNjQgPSBUeXBlLkk2NDsKK1RKU09OUHJvdG9jb2wuUlR5cGUuZGJsID0gVHlwZS5ET1VCTEU7CitUSlNPTlByb3RvY29sLlJUeXBlLnJlYyA9IFR5cGUuU1RSVUNUOworVEpTT05Qcm90b2NvbC5SVHlwZS5zdHIgPSBUeXBlLlNUUklORzsKK1RKU09OUHJvdG9jb2wuUlR5cGUubWFwID0gVHlwZS5NQVA7CitUSlNPTlByb3RvY29sLlJUeXBlLmxzdCA9IFR5cGUuTElTVDsKK1RKU09OUHJvdG9jb2wuUlR5cGUuc2V0ID0gVHlwZS5TRVQ7CisKKy8qKgorICogVGhlIFRKU09OUHJvdG9jb2wgdmVyc2lvbiBudW1iZXIuCisgKiBAcmVhZG9ubHkKKyAqIEBjb25zdCB7bnVtYmVyfSBWZXJzaW9uCisgKiBAbWVtYmVyb2YgVGhyaWZ0LlByb3RvY29sCisgKi8KK1RKU09OUHJvdG9jb2wuVmVyc2lvbiA9IDE7CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oKSB7CisgIHRoaXMud3JpdGVUb1RyYW5zcG9ydElmU3RhY2tJc0ZsdXNoYWJsZSgpOworICByZXR1cm4gdGhpcy50cmFucy5mbHVzaCgpOworfTsKKworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVUb1RyYW5zcG9ydElmU3RhY2tJc0ZsdXNoYWJsZSA9IGZ1bmN0aW9uKCkgeworICBpZiAodGhpcy50c3RhY2subGVuZ3RoID09PSAxKSB7CisgICAgdGhpcy50cmFucy53cml0ZSh0aGlzLnRzdGFjay5wb3AoKSk7CisgIH0KK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IFJQQyBtZXNzYWdlLgorICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgc2VydmljZSBtZXRob2QgdG8gY2FsbC4KKyAqIEBwYXJhbSB7VGhyaWZ0Lk1lc3NhZ2VUeXBlfSBtZXNzYWdlVHlwZSAtIFRoZSB0eXBlIG9mIG1ldGhvZCBjYWxsLgorICogQHBhcmFtIHtudW1iZXJ9IHNlcWlkIC0gVGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGlzIGNhbGwgKGFsd2F5cyAwIGluIEFwYWNoZSBUaHJpZnQpLgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCkgeworICB0aGlzLnRzdGFjay5wdXNoKFtUSlNPTlByb3RvY29sLlZlcnNpb24sICciJyArIG5hbWUgKyAnIicsIG1lc3NhZ2VUeXBlLCBzZXFpZF0pOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBUaHJpZnQgUlBDIG1lc3NhZ2UuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUVuZCA9IGZ1bmN0aW9uKCkgeworICB2YXIgb2JqID0gdGhpcy50c3RhY2sucG9wKCk7CisKKyAgdGhpcy53b2JqID0gdGhpcy50c3RhY2sucG9wKCk7CisgIHRoaXMud29iai5wdXNoKG9iaik7CisKKyAgdGhpcy53YnVmID0gJ1snICsgdGhpcy53b2JqLmpvaW4oJywnKSArICddJzsKKworICAvLyB3ZSBhc3N1bWUgdGhlcmUgaXMgbm90aGluZyBtb3JlIHRvIGNvbWUgc28gd2Ugd3JpdGUKKyAgdGhpcy50cmFucy53cml0ZSh0aGlzLndidWYpOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJ1Y3QuCisgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RydWN0QmVnaW4gPSBmdW5jdGlvbihuYW1lKSB7CisgIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCk7CisgIHRoaXMudHN0YWNrLnB1c2goe30pOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBzdHJ1Y3QuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RydWN0RW5kID0gZnVuY3Rpb24oKSB7CisgIHZhciBwID0gdGhpcy50cG9zLnBvcCgpOworICB2YXIgc3RydWN0ID0gdGhpcy50c3RhY2tbcF07CisgIHZhciBzdHIgPSAneyc7CisgIHZhciBmaXJzdCA9IHRydWU7CisgIGZvciAodmFyIGtleSBpbiBzdHJ1Y3QpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ciArPSAnLCc7CisgICAgfQorCisgICAgc3RyICs9IGtleSArICc6JyArIHN0cnVjdFtrZXldOworICB9CisKKyAgc3RyICs9ICd9JzsKKyAgdGhpcy50c3RhY2tbcF0gPSBzdHI7CisKKyAgdGhpcy53cml0ZVRvVHJhbnNwb3J0SWZTdGFja0lzRmx1c2hhYmxlKCk7Cit9OworCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIHN0cnVjdCBmaWVsZC4KKyAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkLgorICogQHBhcmFtIHtUaHJpZnQuUHJvdG9jb2wuVHlwZX0gZmllbGRUeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZmllbGQuCisgKiBAcGFyYW0ge251bWJlcn0gZmllbGRJZCAtIFRoZSBmaWVsZCdzIHVuaXF1ZSBpZGVudGlmaWVyLgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkQmVnaW4gPSBmdW5jdGlvbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpIHsKKyAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKKyAgdGhpcy50c3RhY2sucHVzaCh7ICdmaWVsZElkJzogJyInICsKKyAgICBmaWVsZElkICsgJyInLCAnZmllbGRUeXBlJzogVEpTT05Qcm90b2NvbC5UeXBlW2ZpZWxkVHlwZV0KKyAgfSk7Cit9OworCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGZpZWxkLgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkRW5kID0gZnVuY3Rpb24oKSB7CisgIHZhciB2YWx1ZSA9IHRoaXMudHN0YWNrLnBvcCgpOworICB2YXIgZmllbGRJbmZvID0gdGhpcy50c3RhY2sucG9wKCk7CisKKyAgaWYgKCc6JyArIHZhbHVlID09PSAiOltvYmplY3QgT2JqZWN0XSIpIHsKKyAgICB0aGlzLnRzdGFja1t0aGlzLnRzdGFjay5sZW5ndGggLSAxXVtmaWVsZEluZm8uZmllbGRJZF0gPSAneycgKworICAgICAgZmllbGRJbmZvLmZpZWxkVHlwZSArICc6JyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKSArICd9JzsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLnRzdGFja1t0aGlzLnRzdGFjay5sZW5ndGggLSAxXVtmaWVsZEluZm8uZmllbGRJZF0gPSAneycgKworICAgICAgZmllbGRJbmZvLmZpZWxkVHlwZSArICc6JyArIHZhbHVlICsgJ30nOworICB9CisgIHRoaXMudHBvcy5wb3AoKTsKKworICB0aGlzLndyaXRlVG9UcmFuc3BvcnRJZlN0YWNrSXNGbHVzaGFibGUoKTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIHRoZSBzZXQgb2YgZmllbGRzIGZvciBhIHN0cnVjdC4KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZFN0b3AgPSBmdW5jdGlvbigpIHsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWFwIGNvbGxlY3Rpb24uCisgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSBrZXlUeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUga2V5LgorICogQHBhcmFtIHtUaHJpZnQuVHlwZX0gdmFsVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhbHVlLgorICogQHBhcmFtIHtudW1iZXJ9IFtzaXplXSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG1hcCAoaWdub3JlZCkuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWFwQmVnaW4gPSBmdW5jdGlvbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKSB7CisgIC8vc2l6ZSBpcyBpbnZhbGlkLCB3ZSdsbCBzZXQgaXQgb24gZW5kLgorICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpOworICB0aGlzLnRzdGFjay5wdXNoKFtUSlNPTlByb3RvY29sLlR5cGVba2V5VHlwZV0sIFRKU09OUHJvdG9jb2wuVHlwZVt2YWxUeXBlXSwgMF0pOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBtYXAuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWFwRW5kID0gZnVuY3Rpb24oKSB7CisgIHZhciBwID0gdGhpcy50cG9zLnBvcCgpOworCisgIGlmIChwID09IHRoaXMudHN0YWNrLmxlbmd0aCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmICgodGhpcy50c3RhY2subGVuZ3RoIC0gcCAtIDEpICUgMiAhPT0gMCkgeworICAgIHRoaXMudHN0YWNrLnB1c2goJycpOworICB9CisKKyAgdmFyIHNpemUgPSAodGhpcy50c3RhY2subGVuZ3RoIC0gcCAtIDEpIC8gMjsKKworICB0aGlzLnRzdGFja1twXVt0aGlzLnRzdGFja1twXS5sZW5ndGggLSAxXSA9IHNpemU7CisKKyAgdmFyIG1hcCA9ICd9JzsKKyAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgd2hpbGUgKHRoaXMudHN0YWNrLmxlbmd0aCA+IHAgKyAxKSB7CisgICAgdmFyIHYgPSB0aGlzLnRzdGFjay5wb3AoKTsKKyAgICB2YXIgayA9IHRoaXMudHN0YWNrLnBvcCgpOworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgbWFwID0gJywnICsgbWFwOworICAgIH0KKworICAgIGlmICghIGlzTmFOKGspKSB7IGsgPSAnIicgKyBrICsgJyInOyB9IC8vanNvbiAia2V5cyIgbmVlZCB0byBiZSBzdHJpbmdzCisgICAgbWFwID0gayArICc6JyArIHYgKyBtYXA7CisgIH0KKyAgbWFwID0gJ3snICsgbWFwOworCisgIHRoaXMudHN0YWNrW3BdLnB1c2gobWFwKTsKKyAgdGhpcy50c3RhY2tbcF0gPSAnWycgKyB0aGlzLnRzdGFja1twXS5qb2luKCcsJykgKyAnXSc7CisKKyAgdGhpcy53cml0ZVRvVHJhbnNwb3J0SWZTdGFja0lzRmx1c2hhYmxlKCk7Cit9OworCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGxpc3QgY29sbGVjdGlvbi4KKyAqIEBwYXJhbSB7VGhyaWZ0LlR5cGV9IGVsZW1UeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZWxlbWVudHMuCisgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTGlzdEJlZ2luID0gZnVuY3Rpb24oZWxlbVR5cGUsIHNpemUpIHsKKyAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKKyAgdGhpcy50c3RhY2sucHVzaChbVEpTT05Qcm90b2NvbC5UeXBlW2VsZW1UeXBlXSwgc2l6ZV0pOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBsaXN0LgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RFbmQgPSBmdW5jdGlvbigpIHsKKyAgdmFyIHAgPSB0aGlzLnRwb3MucG9wKCk7CisKKyAgd2hpbGUgKHRoaXMudHN0YWNrLmxlbmd0aCA+IHAgKyAxKSB7CisgICAgdmFyIHRtcFZhbCA9IHRoaXMudHN0YWNrW3AgKyAxXTsKKyAgICB0aGlzLnRzdGFjay5zcGxpY2UocCArIDEsIDEpOworICAgIHRoaXMudHN0YWNrW3BdLnB1c2godG1wVmFsKTsKKyAgfQorCisgIHRoaXMudHN0YWNrW3BdID0gJ1snICsgdGhpcy50c3RhY2tbcF0uam9pbignLCcpICsgJ10nOworCisgIHRoaXMud3JpdGVUb1RyYW5zcG9ydElmU3RhY2tJc0ZsdXNoYWJsZSgpOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZXQgY29sbGVjdGlvbi4KKyAqIEBwYXJhbSB7VGhyaWZ0LlR5cGV9IGVsZW1UeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZWxlbWVudHMuCisgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlU2V0QmVnaW4gPSBmdW5jdGlvbihlbGVtVHlwZSwgc2l6ZSkgeworICAgIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCk7CisgICAgdGhpcy50c3RhY2sucHVzaChbVEpTT05Qcm90b2NvbC5UeXBlW2VsZW1UeXBlXSwgc2l6ZV0pOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBzZXQuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlU2V0RW5kID0gZnVuY3Rpb24oKSB7CisgIHZhciBwID0gdGhpcy50cG9zLnBvcCgpOworCisgIHdoaWxlICh0aGlzLnRzdGFjay5sZW5ndGggPiBwICsgMSkgeworICAgIHZhciB0bXBWYWwgPSB0aGlzLnRzdGFja1twICsgMV07CisgICAgdGhpcy50c3RhY2suc3BsaWNlKHAgKyAxLCAxKTsKKyAgICB0aGlzLnRzdGFja1twXS5wdXNoKHRtcFZhbCk7CisgIH0KKworICB0aGlzLnRzdGFja1twXSA9ICdbJyArIHRoaXMudHN0YWNrW3BdLmpvaW4oJywnKSArICddJzsKKworICB0aGlzLndyaXRlVG9UcmFuc3BvcnRJZlN0YWNrSXNGbHVzaGFibGUoKTsKK307CisKKy8qKiBTZXJpYWxpemVzIGEgYm9vbGVhbiAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVCb29sID0gZnVuY3Rpb24oYm9vbCkgeworICB0aGlzLnRzdGFjay5wdXNoKGJvb2wgPyAxIDogMCk7Cit9OworCisvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVCeXRlID0gZnVuY3Rpb24oYnl0ZSkgeworICB0aGlzLnRzdGFjay5wdXNoKGJ5dGUpOworfTsKKworLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlSTE2ID0gZnVuY3Rpb24oaTE2KSB7CisgIHRoaXMudHN0YWNrLnB1c2goaTE2KTsKK307CisKKy8qKiBTZXJpYWxpemVzIGEgbnVtYmVyICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZUkzMiA9IGZ1bmN0aW9uKGkzMikgeworICB0aGlzLnRzdGFjay5wdXNoKGkzMik7Cit9OworCisvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVJNjQgPSBmdW5jdGlvbihpNjQpIHsKKyAgaWYgKGk2NCBpbnN0YW5jZW9mIEludDY0KSB7CisgICAgdGhpcy50c3RhY2sucHVzaChJbnQ2NFV0aWwudG9EZWNpbWFsU3RyaW5nKGk2NCkpOworICB9IGVsc2UgeworICAgIHRoaXMudHN0YWNrLnB1c2goaTY0KTsKKyAgfQorfTsKKworLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlRG91YmxlID0gZnVuY3Rpb24oZHViKSB7CisgIHRoaXMudHN0YWNrLnB1c2goZHViKTsKK307CisKKy8qKiBTZXJpYWxpemVzIGEgc3RyaW5nICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cmluZyA9IGZ1bmN0aW9uKGFyZykgeworICAvLyBXZSBkbyBub3QgZW5jb2RlIHVyaSBjb21wb25lbnRzIGZvciB3aXJlIHRyYW5zZmVyOgorICBpZiAoYXJnID09PSBudWxsKSB7CisgICAgICB0aGlzLnRzdGFjay5wdXNoKG51bGwpOworICB9IGVsc2UgeworICAgICAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7CisgICAgICAgIHZhciBzdHIgPSBhcmc7CisgICAgICB9IGVsc2UgaWYgKGFyZyBpbnN0YW5jZW9mIEJ1ZmZlcikgeworICAgICAgICB2YXIgc3RyID0gYXJnLnRvU3RyaW5nKCd1dGY4Jyk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dyaXRlU3RyaW5nIGNhbGxlZCB3aXRob3V0IGEgc3RyaW5nL0J1ZmZlciBhcmd1bWVudDogJyArIGFyZyk7CisgICAgICB9CisKKyAgICAgIC8vIGNvbmNhdCBtYXkgYmUgc2xvd2VyIHRoYW4gYnVpbGRpbmcgYSBieXRlIGJ1ZmZlcgorICAgICAgdmFyIGVzY2FwZWRTdHJpbmcgPSAnJzsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgdmFyIGNoID0gc3RyLmNoYXJBdChpKTsgICAgICAvLyBhIHNpbmdsZSBkb3VibGUgcXVvdGU6ICIKKyAgICAgICAgICBpZiAoY2ggPT09ICdcIicpIHsKKyAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxcIic7IC8vIHdyaXRlIG91dCBhczogXCIKKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXFwnKSB7ICAgIC8vIGEgc2luZ2xlIGJhY2tzbGFzaDogXAorICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXFxcJzsgLy8gd3JpdGUgb3V0IGFzOiBcXAorICAgICAgICAgIC8qIEN1cnJlbnRseSBlc2NhcGVkIGZvcndhcmQgc2xhc2hlcyBicmVhayBUSlNPTlByb3RvY29sLgorICAgICAgICAgICAqIEFzIGl0IHN0YW5kcywgd2UgY2FuIHNpbXBseSBwYXNzIGZvcndhcmQgc2xhc2hlcyBpbnRvCisgICAgICAgICAgICogb3VyIHN0cmluZ3MgYWNyb3NzIHRoZSB3aXJlIHdpdGhvdXQgYmVpbmcgZXNjYXBlZC4KKyAgICAgICAgICAgKiBJIHRoaW5rIHRoaXMgaXMgdGhlIHByb3RvY29sJ3MgYnVnLCBub3QgdGhyaWZ0LmpzCisgICAgICAgICAgICogfSBlbHNlIGlmKGNoID09PSAnLycpIHsgICAvLyBhIHNpbmdsZSBmb3J3YXJkIHNsYXNoOiAvCisgICAgICAgICAgICogIGVzY2FwZWRTdHJpbmcgKz0gJ1xcLyc7ICAvLyB3cml0ZSBvdXQgYXMgXC8KKyAgICAgICAgICAgKiB9CisgICAgICAgICAgICovCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xiJykgeyAgICAvLyBhIHNpbmdsZSBiYWNrc3BhY2U6IGludmlzaWJsZQorICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXGInOyAgLy8gd3JpdGUgb3V0IGFzOiBcYiIKKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXGYnKSB7ICAgIC8vIGEgc2luZ2xlIGZvcm1mZWVkOiBpbnZpc2libGUKKyAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxmJzsgIC8vIHdyaXRlIG91dCBhczogXGYiCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xuJykgeyAgICAvLyBhIHNpbmdsZSBuZXdsaW5lOiBpbnZpc2libGUKKyAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxuJzsgIC8vIHdyaXRlIG91dCBhczogXG4iCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xyJykgeyAgICAvLyBhIHNpbmdsZSByZXR1cm46IGludmlzaWJsZQorICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXHInOyAgLy8gd3JpdGUgb3V0IGFzOiBcciIKKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXHQnKSB7ICAgIC8vIGEgc2luZ2xlIHRhYjogaW52aXNpYmxlCisgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcdCc7ICAvLyB3cml0ZSBvdXQgYXM6IFx0IgorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gY2g7ICAgICAvLyBFbHNlIGl0IG5lZWQgbm90IGJlIGVzY2FwZWQKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICB0aGlzLnRzdGFjay5wdXNoKCciJyArIGVzY2FwZWRTdHJpbmcgKyAnIicpOworICB9Cit9OworCisvKiogU2VyaWFsaXplcyBhIHN0cmluZyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVCaW5hcnkgPSBmdW5jdGlvbihhcmcpIHsKKyAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7CisgICAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoYXJnLCAnYmluYXJ5Jyk7CisgIH0gZWxzZSBpZiAoYXJnIGluc3RhbmNlb2YgQnVmZmVyIHx8CisgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZykgPT0gJ1tvYmplY3QgVWludDhBcnJheV0nKSAgeworICAgIHZhciBidWYgPSBhcmc7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgbmV3IEVycm9yKCd3cml0ZUJpbmFyeSBjYWxsZWQgd2l0aG91dCBhIHN0cmluZy9CdWZmZXIgYXJndW1lbnQ6ICcgKyBhcmcpOworICB9CisgIHRoaXMudHN0YWNrLnB1c2goJyInICsgYnVmLnRvU3RyaW5nKCdiYXNlNjQnKSArICciJyk7Cit9OworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgQW5vblJlYWRNZXNzYWdlQmVnaW5SZXR1cm4KKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIG1ldGhvZC4KKyAqIEBwcm9wZXJ0eSB7VGhyaWZ0Lk1lc3NhZ2VUeXBlfSBtdHlwZSAtIFRoZSB0eXBlIG9mIG1lc3NhZ2UgY2FsbC4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSByc2VxaWQgLSBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBtZXNzYWdlICgwIGluIFRocmlmdCBSUEMpLgorICovCisvKioKKyAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWVzc2FnZS4KKyAqIEByZXR1cm5zIHtBbm9uUmVhZE1lc3NhZ2VCZWdpblJldHVybn0KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB0aGlzLnJzdGFjayA9IFtdOworICB0aGlzLnJwb3MgPSBbXTsKKworICAvL0JvcnJvdyB0aGUgaW5ib3VuZCB0cmFuc3BvcnQgYnVmZmVyIGFuZCBlbnN1cmUgZGF0YSBpcyBwcmVzZW50L2NvbnNpc3RlbnQKKyAgdmFyIHRyYW5zQnVmID0gdGhpcy50cmFucy5ib3Jyb3coKTsKKyAgaWYgKHRyYW5zQnVmLnJlYWRJbmRleCA+PSB0cmFuc0J1Zi53cml0ZUluZGV4KSB7CisgICAgdGhyb3cgbmV3IElucHV0QnVmZmVyVW5kZXJydW5FcnJvcigpOworICB9CisgIHZhciBjdXJzb3IgPSB0cmFuc0J1Zi5yZWFkSW5kZXg7CisKKyAgaWYgKHRyYW5zQnVmLmJ1ZltjdXJzb3JdICE9PSAweDVCKSB7IC8vWworICAgIHRocm93IG5ldyBFcnJvcigiTWFsZm9ybWVkIEpTT04gaW5wdXQsIG5vIG9wZW5pbmcgYnJhY2tldCIpOworICB9CisKKyAgLy9QYXJzZSBhIHNpbmdsZSBtZXNzYWdlICh0aGVyZSBtYXkgYmUgc2V2ZXJhbCBpbiB0aGUgYnVmZmVyKQorICAvLyAgVE9ETzogSGFuZGxlIGNoYXJhY3RlcnMgdXNpbmcgbXVsdGlwbGUgY29kZSB1bml0cworICBjdXJzb3IrKzsKKyAgdmFyIG9wZW5CcmFja2V0Q291bnQgPSAxOworICB2YXIgaW5TdHJpbmcgPSBmYWxzZTsKKyAgZm9yICg7IGN1cnNvciA8IHRyYW5zQnVmLndyaXRlSW5kZXg7IGN1cnNvcisrKSB7CisgICAgdmFyIGNociA9IHRyYW5zQnVmLmJ1ZltjdXJzb3JdOworICAgIC8vd2UgdXNlIGhleGEgY2hhcmNvZGUgaGVyZSBiZWNhdXNlIGRhdGFbaV0gcmV0dXJucyBhbiBpbnQgYW5kIG5vdCBhIGNoYXIKKyAgICBpZiAoaW5TdHJpbmcpIHsKKyAgICAgIGlmIChjaHIgPT09IDB4MjIpIHsgLy8iCisgICAgICAgIGluU3RyaW5nID0gZmFsc2U7CisgICAgICB9IGVsc2UgaWYgKGNociA9PT0gMHg1QykgeyAvL1wKKyAgICAgICAgLy9lc2NhcGVkIGNoYXJhY3Rlciwgc2tpcAorICAgICAgICBjdXJzb3IgKz0gMTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGNociA9PT0gMHg1QikgeyAvL1sKKyAgICAgICAgb3BlbkJyYWNrZXRDb3VudCArPSAxOworICAgICAgfSBlbHNlIGlmIChjaHIgPT09IDB4NUQpIHsgLy9dCisgICAgICAgIG9wZW5CcmFja2V0Q291bnQgLT0gMTsKKyAgICAgICAgaWYgKG9wZW5CcmFja2V0Q291bnQgPT09IDApIHsKKyAgICAgICAgICAvL2VuZCBvZiBqc29uIG1lc3NhZ2UgZGV0ZWN0ZWQKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChjaHIgPT09IDB4MjIpIHsgLy8iCisgICAgICAgIGluU3RyaW5nID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAob3BlbkJyYWNrZXRDb3VudCAhPT0gMCkgeworICAgIC8vIE1pc3NpbmcgY2xvc2luZyBicmFja2V0LiBDYW4gYmUgYnVmZmVyIHVuZGVycnVuLgorICAgIHRocm93IG5ldyBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IoKTsKKyAgfQorCisgIC8vUmVjb25zdGl0dXRlIHRoZSBKU09OIG9iamVjdCBhbmQgY29udW1lIHRoZSBuZWNlc3NhcnkgYnl0ZXMKKyAgdGhpcy5yb2JqID0ganNvbl9wYXJzZSh0cmFuc0J1Zi5idWYuc2xpY2UodHJhbnNCdWYucmVhZEluZGV4LCBjdXJzb3IrMSkudG9TdHJpbmcoKSk7CisgIHRoaXMudHJhbnMuY29uc3VtZShjdXJzb3IgKyAxIC0gdHJhbnNCdWYucmVhZEluZGV4KTsKKworICAvL1ZlcmlmeSB0aGUgcHJvdG9jb2wgdmVyc2lvbgorICB2YXIgdmVyc2lvbiA9IHRoaXMucm9iai5zaGlmdCgpOworICBpZiAodmVyc2lvbiAhPSBUSlNPTlByb3RvY29sLlZlcnNpb24pIHsKKyAgICB0aHJvdyBuZXcgRXJyb3IoJ1dyb25nIHRocmlmdCBwcm90b2NvbCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7CisgIH0KKworICAvL09iamVjdGlmeSB0aGUgdGhyaWZ0IG1lc3NhZ2Uge25hbWUvdHlwZS9zZXF1ZW5jZS1udW1iZXJ9IGZvciByZXR1cm4KKyAgLy8gYW5kIHRoZW4gc2F2ZSB0aGUgSlNPTiBvYmplY3QgaW4gcnN0YWNrCisgIHZhciByID0ge307CisgIHIuZm5hbWUgPSB0aGlzLnJvYmouc2hpZnQoKTsKKyAgci5tdHlwZSA9IHRoaXMucm9iai5zaGlmdCgpOworICByLnJzZXFpZCA9IHRoaXMucm9iai5zaGlmdCgpOworICB0aGlzLnJzdGFjay5wdXNoKHRoaXMucm9iai5zaGlmdCgpKTsKKyAgcmV0dXJuIHI7Cit9OworCisvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBtZXNzYWdlLiAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKK307CisKKy8qKgorICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJ1Y3QuCisgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdIC0gVGhlIG5hbWUgb2YgdGhlIHN0cnVjdCAoaWdub3JlZCkKKyAqIEByZXR1cm5zIHtvYmplY3R9IC0gQW4gb2JqZWN0IHdpdGggYW4gZW1wdHkgc3RyaW5nIGZuYW1lIHByb3BlcnR5CisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJ1Y3RCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgciA9IHt9OworICByLmZuYW1lID0gJyc7CisKKyAgLy9pbmNhc2UgdGhpcyBpcyBhbiBhcnJheSBvZiBzdHJ1Y3RzCisgIGlmICh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXSBpbnN0YW5jZW9mIEFycmF5KSB7CisgICAgdGhpcy5yc3RhY2sucHVzaCh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXS5zaGlmdCgpKTsKKyAgfQorCisgIHJldHVybiByOworfTsKKworLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc3RydWN0LiAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgeworICB0aGlzLnJzdGFjay5wb3AoKTsKK307CisKKy8qKgorICogQGNsYXNzCisgKiBAbmFtZSBBbm9uUmVhZEZpZWxkQmVnaW5SZXR1cm4KKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCAoYWx3YXlzICcnKS4KKyAqIEBwcm9wZXJ0eSB7VGhyaWZ0LlR5cGV9IGZ0eXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZmllbGQuCisgKiBAcHJvcGVydHkge251bWJlcn0gZmlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBmaWVsZC4KKyAqLworLyoqCisgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGZpZWxkLgorICogQHJldHVybnMge0Fub25SZWFkRmllbGRCZWdpblJldHVybn0KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZEZpZWxkQmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdmFyIHIgPSB7fTsKKworICB2YXIgZmlkID0gLTE7CisgIHZhciBmdHlwZSA9IFR5cGUuU1RPUDsKKworICAvL2dldCBhIGZpZWxkSWQKKyAgZm9yICh2YXIgZiBpbiAodGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0pKSB7CisgICAgaWYgKGYgPT09IG51bGwpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGZpZCA9IHBhcnNlSW50KGYsIDEwKTsKKyAgICB0aGlzLnJwb3MucHVzaCh0aGlzLnJzdGFjay5sZW5ndGgpOworCisgICAgdmFyIGZpZWxkID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV1bZmlkXTsKKworICAgIC8vcmVtb3ZlIHNvIHdlIGRvbid0IHNlZSBpdCBhZ2FpbgorICAgIGRlbGV0ZSB0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXVtmaWRdOworCisgICAgdGhpcy5yc3RhY2sucHVzaChmaWVsZCk7CisKKyAgICBicmVhazsKKyAgfQorCisgIGlmIChmaWQgIT0gLTEpIHsKKyAgICAvL3Nob3VsZCBvbmx5IGJlIDEgb2YgdGhlc2UgYnV0IHRoaXMgaXMgdGhlIG9ubHkKKyAgICAvL3dheSB0byBtYXRjaCBhIGtleQorICAgIGZvciAodmFyIGkgaW4gKHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdKSkgeworICAgICAgaWYgKFRKU09OUHJvdG9jb2wuUlR5cGVbaV0gPT09IG51bGwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGZ0eXBlID0gVEpTT05Qcm90b2NvbC5SVHlwZVtpXTsKKyAgICAgIHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV1baV07CisgICAgfQorICB9CisKKyAgci5mbmFtZSA9ICcnOworICByLmZ0eXBlID0gZnR5cGU7CisgIHIuZmlkID0gZmlkOworCisgIHJldHVybiByOworfTsKKworLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgZmllbGQuICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkRmllbGRFbmQgPSBmdW5jdGlvbigpIHsKKyAgdmFyIHBvcyA9IHRoaXMucnBvcy5wb3AoKTsKKworICAvL2dldCBiYWNrIHRvIHRoZSByaWdodCBwbGFjZSBpbiB0aGUgc3RhY2sKKyAgd2hpbGUgKHRoaXMucnN0YWNrLmxlbmd0aCA+IHBvcykgeworICAgIHRoaXMucnN0YWNrLnBvcCgpOworICB9Cit9OworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgQW5vblJlYWRNYXBCZWdpblJldHVybgorICogQHByb3BlcnR5IHtUaHJpZnQuVHlwZX0ga3R5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBrZXkuCisgKiBAcHJvcGVydHkge1RocmlmdC5UeXBlfSB2dHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhbHVlLgorICogQHByb3BlcnR5IHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBtYXAuCisgKi8KKy8qKgorICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBtYXAuCisgKiBAcmV0dXJucyB7QW5vblJlYWRNYXBCZWdpblJldHVybn0KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZE1hcEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHZhciBtYXAgPSB0aGlzLnJzdGFjay5wb3AoKTsKKyAgdmFyIGZpcnN0ID0gbWFwLnNoaWZ0KCk7CisgIGlmIChmaXJzdCBpbnN0YW5jZW9mIEFycmF5KSB7CisgICAgdGhpcy5yc3RhY2sucHVzaChtYXApOworICAgIG1hcCA9IGZpcnN0OworICAgIGZpcnN0ID0gbWFwLnNoaWZ0KCk7CisgIH0KKworICB2YXIgciA9IHt9OworICByLmt0eXBlID0gVEpTT05Qcm90b2NvbC5SVHlwZVtmaXJzdF07CisgIHIudnR5cGUgPSBUSlNPTlByb3RvY29sLlJUeXBlW21hcC5zaGlmdCgpXTsKKyAgci5zaXplID0gbWFwLnNoaWZ0KCk7CisKKworICB0aGlzLnJwb3MucHVzaCh0aGlzLnJzdGFjay5sZW5ndGgpOworICB0aGlzLnJzdGFjay5wdXNoKG1hcC5zaGlmdCgpKTsKKworICByZXR1cm4gcjsKK307CisKKy8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIG1hcC4gKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRNYXBFbmQgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5yZWFkRmllbGRFbmQoKTsKK307CisKKy8qKgorICogQGNsYXNzCisgKiBAbmFtZSBBbm9uUmVhZENvbEJlZ2luUmV0dXJuCisgKiBAcHJvcGVydHkge1RocmlmdC5UeXBlfSBldHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGVsZW1lbnQuCisgKiBAcHJvcGVydHkge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24uCisgKi8KKy8qKgorICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBsaXN0LgorICogQHJldHVybnMge0Fub25SZWFkQ29sQmVnaW5SZXR1cm59CisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRMaXN0QmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdmFyIGxpc3QgPSB0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXTsKKworICB2YXIgciA9IHt9OworICByLmV0eXBlID0gVEpTT05Qcm90b2NvbC5SVHlwZVtsaXN0LnNoaWZ0KCldOworICByLnNpemUgPSBsaXN0LnNoaWZ0KCk7CisKKyAgdGhpcy5ycG9zLnB1c2godGhpcy5yc3RhY2subGVuZ3RoKTsKKyAgdGhpcy5yc3RhY2sucHVzaChsaXN0LnNoaWZ0KCkpOworCisgIHJldHVybiByOworfTsKKworLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbGlzdC4gKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRMaXN0RW5kID0gZnVuY3Rpb24oKSB7CisgIHZhciBwb3MgPSB0aGlzLnJwb3MucG9wKCkgLSAyOworICB2YXIgc3QgPSB0aGlzLnJzdGFjazsKKyAgc3QucG9wKCk7CisgIGlmIChzdCBpbnN0YW5jZW9mIEFycmF5ICYmIHN0Lmxlbmd0aCA+IHBvcyAmJiBzdFtwb3NdLmxlbmd0aCA+IDApIHsKKyAgICBzdC5wdXNoKHN0W3Bvc10uc2hpZnQoKSk7CisgIH0KK307CisKKy8qKgorICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZXQuCisgKiBAcmV0dXJucyB7QW5vblJlYWRDb2xCZWdpblJldHVybn0KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZFNldEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRMaXN0QmVnaW4oKTsKK307CisKKy8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIHNldC4gKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRTZXRFbmQgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVhZExpc3RFbmQoKTsKK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRCb29sID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRWYWx1ZSgpID09ICcxJzsKK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRCeXRlID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRJMTYgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVhZEkzMigpOworfTsKKworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZEkzMiA9IGZ1bmN0aW9uKGYpIHsKKyAgcmV0dXJuICt0aGlzLnJlYWRWYWx1ZSgpOworfQorCisvKiogUmV0dXJucyB0aGUgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkVmFsdWUgPSBmdW5jdGlvbihmKSB7CisgIGlmIChmID09PSB1bmRlZmluZWQpIHsKKyAgICBmID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV07CisgIH0KKworICB2YXIgciA9IHt9OworCisgIGlmIChmIGluc3RhbmNlb2YgQXJyYXkpIHsKKyAgICBpZiAoZi5sZW5ndGggPT09IDApIHsKKyAgICAgIHIudmFsdWUgPSB1bmRlZmluZWQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHIudmFsdWUgPSBmLnNoaWZ0KCk7CisgICAgfQorICB9IGVsc2UgaWYgKCEoZiBpbnN0YW5jZW9mIEludDY0KSAmJiBmIGluc3RhbmNlb2YgT2JqZWN0KSB7CisgICAgZm9yICh2YXIgaSBpbiBmKSB7CisgICAgICBpZiAoaSA9PT0gbnVsbCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHRoaXMucnN0YWNrLnB1c2goZltpXSk7CisgICAgICBkZWxldGUgZltpXTsKKworICAgICAgci52YWx1ZSA9IGk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgci52YWx1ZSA9IGY7CisgICAgdGhpcy5yc3RhY2sucG9wKCk7CisgIH0KKworICByZXR1cm4gci52YWx1ZTsKK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRJNjQgPSBmdW5jdGlvbigpIHsKKyAgdmFyIG4gPSB0aGlzLnJlYWRWYWx1ZSgpCisgIGlmICh0eXBlb2YgbiA9PT0gJ3N0cmluZycpIHsKKyAgICAvLyBBc3N1bWluZyBubyBvbmUgaXMgc2VuZGluZyBpbiAxLjExMTExZSszMyBmb3JtYXQKKyAgICByZXR1cm4gSW50NjRVdGlsLmZyb21EZWNpbWFsU3RyaW5nKG4pOworICB9IGVsc2UgeworICAgIHJldHVybiBuZXcgSW50NjQobik7CisgIH0KK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWREb3VibGUgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVhZEkzMigpOworfTsKKworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZEJpbmFyeSA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gbmV3IEJ1ZmZlcih0aGlzLnJlYWRWYWx1ZSgpLCAnYmFzZTY0Jyk7Cit9OworCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RyaW5nID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRWYWx1ZSgpOworfTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAqIEByZWFkb25seQorICogQHJldHVybnMge1RocmlmdC5UcmFuc3BvcnR9IFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUuZ2V0VHJhbnNwb3J0ID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnRyYW5zOworfTsKKworLyoqCisgKiBNZXRob2QgdG8gYXJiaXRyYXJpbHkgc2tpcCBvdmVyIGRhdGEKKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uKHR5cGUpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFR5cGUuU1RPUDoKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFR5cGUuQk9PTDoKKyAgICAgIHRoaXMucmVhZEJvb2woKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5CWVRFOgorICAgICAgdGhpcy5yZWFkQnl0ZSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkkxNjoKKyAgICAgIHRoaXMucmVhZEkxNigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkkzMjoKKyAgICAgIHRoaXMucmVhZEkzMigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkk2NDoKKyAgICAgIHRoaXMucmVhZEk2NCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkRPVUJMRToKKyAgICAgIHRoaXMucmVhZERvdWJsZSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLlNUUklORzoKKyAgICAgIHRoaXMucmVhZFN0cmluZygpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLlNUUlVDVDoKKyAgICAgIHRoaXMucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICB2YXIgciA9IHRoaXMucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgaWYgKHIuZnR5cGUgPT09IFR5cGUuU1RPUCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRoaXMuc2tpcChyLmZ0eXBlKTsKKyAgICAgICAgdGhpcy5yZWFkRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZFN0cnVjdEVuZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLk1BUDoKKyAgICAgIHZhciBtYXBCZWdpbiA9IHRoaXMucmVhZE1hcEJlZ2luKCk7CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcEJlZ2luLnNpemU7ICsraSkgeworICAgICAgICB0aGlzLnNraXAobWFwQmVnaW4ua3R5cGUpOworICAgICAgICB0aGlzLnNraXAobWFwQmVnaW4udnR5cGUpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkTWFwRW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuU0VUOgorICAgICAgdmFyIHNldEJlZ2luID0gdGhpcy5yZWFkU2V0QmVnaW4oKTsKKyAgICAgIGZvciAodmFyIGkyID0gMDsgaTIgPCBzZXRCZWdpbi5zaXplOyArK2kyKSB7CisgICAgICAgIHRoaXMuc2tpcChzZXRCZWdpbi5ldHlwZSk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRTZXRFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5MSVNUOgorICAgICAgdmFyIGxpc3RCZWdpbiA9IHRoaXMucmVhZExpc3RCZWdpbigpOworICAgICAgZm9yICh2YXIgaTMgPSAwOyBpMyA8IGxpc3RCZWdpbi5zaXplOyArK2kzKSB7CisgICAgICAgIHRoaXMuc2tpcChsaXN0QmVnaW4uZXR5cGUpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkTGlzdEVuZCgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IG5ldyAgRXJyb3IoIkludmFsaWQgdHlwZTogIiArIHR5cGUpOworICB9Cit9OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2xvZy5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9sb2cuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUzZTgxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9sb2cuanMKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTsKKwordmFyIGRpc2FibGVkID0gZnVuY3Rpb24gKCkge307Cit2YXIgbG9nRnVuYyA9IGNvbnNvbGUubG9nOwordmFyIGxvZ0xldmVsID0gJ2Vycm9yJzsgLy8gZGVmYXVsdCBsZXZlbAorCitmdW5jdGlvbiBmYWN0b3J5KGxldmVsKSB7CisgIHJldHVybiBmdW5jdGlvbiAoKSB7CisgICAgLy8gYmV0dGVyIHVzZSBzcHJlYWQgc3ludGF4LCBidXQgZHVlIHRvIGNvbXBhdGliaWxpdHksCisgICAgLy8gdXNlIGxlZ2FjeSBtZXRob2QgaGVyZS4KKyAgICB2YXIgYXJncyA9IFsndGhyaWZ0OiBbJyArIGxldmVsICsgJ10gJ10uY29uY2F0KEFycmF5LmZyb20oYXJndW1lbnRzKSk7CisgICAgcmV0dXJuIGxvZ0Z1bmModXRpbC5mb3JtYXQuYXBwbHkobnVsbCwgYXJncykpOworICB9OworfQorCit2YXIgdHJhY2UgPSBkaXNhYmxlZDsKK3ZhciBkZWJ1ZyA9IGRpc2FibGVkOwordmFyIGVycm9yID0gZGlzYWJsZWQ7Cit2YXIgd2FybmluZyA9IGRpc2FibGVkOwordmFyIGluZm8gPSBkaXNhYmxlZDsKKworZXhwb3J0cy5zZXRMb2dGdW5jID0gZnVuY3Rpb24gKGZ1bmMpIHsKKyAgbG9nRnVuYyA9IGZ1bmM7Cit9OworCit2YXIgc2V0TG9nTGV2ZWwgPSBleHBvcnRzLnNldExvZ0xldmVsID0gZnVuY3Rpb24gKGxldmVsKSB7CisgIHRyYWNlID0gZGVidWcgPSBlcnJvciA9IHdhcm5pbmcgPSBpbmZvID0gZGlzYWJsZWQ7CisgIGxvZ0xldmVsID0gbGV2ZWw7CisgIHN3aXRjaCAobG9nTGV2ZWwpIHsKKyAgY2FzZSAndHJhY2UnOgorICAgIHRyYWNlID0gZmFjdG9yeSgnVFJBQ0UnKTsKKyAgY2FzZSAnZGVidWcnOgorICAgIGRlYnVnID0gZmFjdG9yeSgnREVCVUcnKTsKKyAgY2FzZSAnZXJyb3InOgorICAgIGVycm9yID0gZmFjdG9yeSgnRVJST1InKTsKKyAgY2FzZSAnd2FybmluZyc6CisgICAgd2FybmluZyA9IGZhY3RvcnkoJ1dBUk4nKTsKKyAgY2FzZSAnaW5mbyc6CisgICAgaW5mbyA9IGZhY3RvcnkoJ0lORk8nKTsKKyAgfQorfTsKKworLy8gc2V0IGRlZmF1bHQKK3NldExvZ0xldmVsKGxvZ0xldmVsKTsKKworZXhwb3J0cy5nZXRMb2dMZXZlbCA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIGxvZ0xldmVsOworfTsKKworZXhwb3J0cy50cmFjZSA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIHRyYWNlLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7Cit9OworCitleHBvcnRzLmRlYnVnID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gZGVidWcuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKK307CisKK2V4cG9ydHMuZXJyb3IgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiBlcnJvci5hcHBseShudWxsLCBhcmd1bWVudHMpOworfTsKKworZXhwb3J0cy53YXJuaW5nID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gd2FybmluZy5hcHBseShudWxsLCBhcmd1bWVudHMpOworfTsKKworZXhwb3J0cy5pbmZvID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gaW5mby5hcHBseShudWxsLCBhcmd1bWVudHMpOworfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YjYyZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmpzCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3ZhciBUaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOworCitleHBvcnRzLk11bHRpcGxleGVkUHJvY2Vzc29yID0gTXVsdGlwbGV4ZWRQcm9jZXNzb3I7CisKK2Z1bmN0aW9uIE11bHRpcGxleGVkUHJvY2Vzc29yKHN0cmVhbSwgb3B0aW9ucykgeworICB0aGlzLnNlcnZpY2VzID0ge307Cit9OworCitNdWx0aXBsZXhlZFByb2Nlc3Nvci5wcm90b3R5cGUucmVnaXN0ZXJQcm9jZXNzb3IgPSBmdW5jdGlvbihuYW1lLCBoYW5kbGVyKSB7CisgIHRoaXMuc2VydmljZXNbbmFtZV0gPSBoYW5kbGVyOworfTsKKworTXVsdGlwbGV4ZWRQcm9jZXNzb3IucHJvdG90eXBlLnByb2Nlc3MgPSBmdW5jdGlvbihpbnAsIG91dCkgeworICB2YXIgYmVnaW4gPSBpbnAucmVhZE1lc3NhZ2VCZWdpbigpOworCisgIGlmIChiZWdpbi5tdHlwZSAhPSBUaHJpZnQuTWVzc2FnZVR5cGUuQ0FMTCAmJiBiZWdpbi5tdHlwZSAhPSBUaHJpZnQuTWVzc2FnZVR5cGUuT05FV0FZKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5URXhjZXB0aW9uKCdUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6IFVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlJyk7CisgIH0KKworICB2YXIgcCA9IGJlZ2luLmZuYW1lLnNwbGl0KCc6Jyk7CisgIHZhciBzbmFtZSA9IHBbMF07CisgIHZhciBmbmFtZSA9IHBbMV07CisKKyAgaWYgKCEgKHNuYW1lIGluIHRoaXMuc2VydmljZXMpKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5URXhjZXB0aW9uKCdUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6IFVua25vd24gc2VydmljZTogJyArIHNuYW1lKTsKKyAgfQorCisgIC8vY29uc3RydWN0IGEgcHJveHkgb2JqZWN0IHdoaWNoIHN0dWJzIHRoZSByZWFkTWVzc2FnZUJlZ2luCisgIC8vZm9yIHRoZSBzZXJ2aWNlCisgIHZhciBpbnBQcm94eSA9IHt9OworCisgIGZvciAodmFyIGF0dHIgaW4gaW5wKSB7CisgICAgaW5wUHJveHlbYXR0cl0gPSBpbnBbYXR0cl07CisgIH0KKworICBpbnBQcm94eS5yZWFkTWVzc2FnZUJlZ2luID0gZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHsKKyAgICAgIGZuYW1lOiBmbmFtZSwKKyAgICAgIG10eXBlOiBiZWdpbi5tdHlwZSwKKyAgICAgIHJzZXFpZDogYmVnaW4ucnNlcWlkCisgICAgfTsKKyAgfTsKKworICB0aGlzLnNlcnZpY2VzW3NuYW1lXS5wcm9jZXNzKGlucFByb3h5LCBvdXQpOworfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm90b2NvbC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm90b2NvbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDc4YWEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L211bHRpcGxleGVkX3Byb3RvY29sLmpzCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3ZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpOwordmFyIFRocmlmdCA9IHJlcXVpcmUoJy4vdGhyaWZ0Jyk7CisKK2V4cG9ydHMuTXVsdGlwbGV4ZXIgPSBNdWx0aXBsZXhlcjsKKworZnVuY3Rpb24gV3JhcHBlcihzZXJ2aWNlTmFtZSwgcHJvdG9jb2wsIGNvbm5lY3Rpb24pIHsKKworICBmdW5jdGlvbiBNdWx0aXBsZXhQcm90b2NvbCh0cmFucywgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpIHsKKyAgICBwcm90b2NvbC5jYWxsKHRoaXMsIHRyYW5zLCBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSk7CisgIH07CisKKyAgdXRpbC5pbmhlcml0cyhNdWx0aXBsZXhQcm90b2NvbCwgcHJvdG9jb2wpOworCisgIE11bHRpcGxleFByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIHNlcWlkKSB7CisgICAgaWYgKHR5cGUgPT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLkNBTEwgfHwgdHlwZSA9PSBUaHJpZnQuTWVzc2FnZVR5cGUuT05FV0FZKSB7CisgICAgICBjb25uZWN0aW9uLnNlcUlkMlNlcnZpY2Vbc2VxaWRdID0gc2VydmljZU5hbWU7CisgICAgICBNdWx0aXBsZXhQcm90b2NvbC5zdXBlcl8ucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luLmNhbGwodGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSArICI6IiArIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIE11bHRpcGxleFByb3RvY29sLnN1cGVyXy5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4uY2FsbCh0aGlzLCBuYW1lLCB0eXBlLCBzZXFpZCk7CisgICAgfQorICB9OworCisgIHJldHVybiBNdWx0aXBsZXhQcm90b2NvbDsKK307CisKK2Z1bmN0aW9uIE11bHRpcGxleGVyKCkgeworICB0aGlzLnNlcWlkID0gMDsKK307CisKK011bHRpcGxleGVyLnByb3RvdHlwZS5jcmVhdGVDbGllbnQgPSBmdW5jdGlvbihzZXJ2aWNlTmFtZSwgU2VydmljZUNsaWVudCwgY29ubmVjdGlvbikgeworICBpZiAoU2VydmljZUNsaWVudC5DbGllbnQpIHsKKyAgICBTZXJ2aWNlQ2xpZW50ID0gU2VydmljZUNsaWVudC5DbGllbnQ7CisgIH0KKyAgdmFyIHdyaXRlQ2IgPSBmdW5jdGlvbihidWYsIHNlcWlkKSB7CisgICAgY29ubmVjdGlvbi53cml0ZShidWYsc2VxaWQpOworICB9OworICB2YXIgdHJhbnNwb3J0ID0gbmV3IGNvbm5lY3Rpb24udHJhbnNwb3J0KHVuZGVmaW5lZCwgd3JpdGVDYik7CisgIHZhciBwcm90b2NvbFdyYXBwZXIgPSBuZXcgV3JhcHBlcihzZXJ2aWNlTmFtZSwgY29ubmVjdGlvbi5wcm90b2NvbCwgY29ubmVjdGlvbik7CisgIHZhciBjbGllbnQgPSBuZXcgU2VydmljZUNsaWVudCh0cmFuc3BvcnQsIHByb3RvY29sV3JhcHBlcik7CisgIHZhciBzZWxmID0gdGhpczsKKyAgY2xpZW50Lm5ld19zZXFpZCA9IGZ1bmN0aW9uKCkgeworICAgIHNlbGYuc2VxaWQgKz0gMTsKKyAgICByZXR1cm4gc2VsZi5zZXFpZDsKKyAgfTsKKworICBpZiAodHlwZW9mIGNvbm5lY3Rpb24uY2xpZW50ICE9PSAnb2JqZWN0JykgeworICAgIGNvbm5lY3Rpb24uY2xpZW50ID0ge307CisgIH0KKyAgY29ubmVjdGlvbi5jbGllbnRbc2VydmljZU5hbWVdID0gY2xpZW50OworCisgIHJldHVybiBjbGllbnQ7Cit9OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3Byb3RvY29sLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3Byb3RvY29sLmpzCmluZGV4IGYzMzNiYjkuLmE3MGViZTIgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9wcm90b2NvbC5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvcHJvdG9jb2wuanMKQEAgLTE2LDMyMiArMTYsNyBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLXZhciBzeXMgPSByZXF1aXJlKCdzeXMnKSwKLSAgICBUaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpLAotICAgIFR5cGUgPSBUaHJpZnQuVHlwZTsKIAotdmFyIEJpbmFyeVBhcnNlciA9IHJlcXVpcmUoJy4vYmluYXJ5X3BhcnNlcicpLkJpbmFyeVBhcnNlcjsKLUJpbmFyeVBhcnNlci5iaWdFbmRpYW4gPSB0cnVlOwotCi12YXIgVU5LTk9XTiA9IDAsCi0gICAgSU5WQUxJRF9EQVRBID0gMSwKLSAgICBORUdBVElWRV9TSVpFID0gMiwKLSAgICBTSVpFX0xJTUlUID0gMywKLSAgICBCQURfVkVSU0lPTiA9IDQ7Ci0KLXZhciBUUHJvdG9jb2xFeGNlcHRpb24gPSBmdW5jdGlvbih0eXBlLCBtZXNzYWdlKSB7Ci0gIEVycm9yLmNhbGwodGhpcywgbWVzc2FnZSk7Ci0gIHRoaXMubmFtZSA9ICdUUHJvdG9jb2xFeGNlcHRpb24nOwotICB0aGlzLnR5cGUgPSB0eXBlOwotfQotc3lzLmluaGVyaXRzKFRQcm90b2NvbEV4Y2VwdGlvbiwgRXJyb3IpOwotCi12YXIgVEJpbmFyeVByb3RvY29sID0gZXhwb3J0cy5UQmluYXJ5UHJvdG9jb2wgPSBmdW5jdGlvbih0cmFucywgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpIHsKLSAgdGhpcy50cmFucyA9IHRyYW5zOwotICB0aGlzLnN0cmljdFJlYWQgPSAoc3RyaWN0UmVhZCAhPT0gdW5kZWZpbmVkID8gc3RyaWN0UmVhZCA6IGZhbHNlKTsKLSAgdGhpcy5zdHJpY3RXcml0ZSA9IChzdHJpY3RXcml0ZSAhPT0gdW5kZWZpbmVkID8gc3RyaWN0V3JpdGUgOiB0cnVlKTsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy50cmFucy5mbHVzaCgpOwotfQotCi0vLyBOYXN0eUhheHguIEphdmFTY3JpcHQgZm9yY2VzIGhleCBjb25zdGFudHMgdG8gYmUKLS8vIHBvc2l0aXZlLCBjb252ZXJ0aW5nIHRoaXMgaW50byBhIGxvbmcuIElmIHdlIGhhcmRjb2RlIHRoZSBpbnQgdmFsdWUKLS8vIGluc3RlYWQgaXQnbGwgc3RheSBpbiAzMiBiaXQtbGFuZC4KLQotdmFyIFZFUlNJT05fTUFTSyA9IC02NTUzNiwgLy8gMHhmZmZmMDAwMAotICAgIFZFUlNJT05fMSA9IC0yMTQ3NDE4MTEyLCAvLyAweDgwMDEwMDAwCi0gICAgVFlQRV9NQVNLID0gMHgwMDAwMDBmZjsKLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIHNlcWlkKSB7Ci0gICAgaWYgKHRoaXMuc3RyaWN0V3JpdGUpIHsKLSAgICAgIHRoaXMud3JpdGVJMzIoVkVSU0lPTl8xIHwgdHlwZSk7Ci0gICAgICB0aGlzLndyaXRlU3RyaW5nKG5hbWUpOwotICAgICAgdGhpcy53cml0ZUkzMihzZXFpZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMud3JpdGVTdHJpbmcobmFtZSk7Ci0gICAgICB0aGlzLndyaXRlQnl0ZSh0eXBlKTsKLSAgICAgIHRoaXMud3JpdGVJMzIoc2VxaWQpOwotICAgIH0KLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cnVjdEJlZ2luID0gZnVuY3Rpb24obmFtZSkgewotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RydWN0RW5kID0gZnVuY3Rpb24oKSB7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZEJlZ2luID0gZnVuY3Rpb24obmFtZSwgdHlwZSwgaWQpIHsKLSAgdGhpcy53cml0ZUJ5dGUodHlwZSk7Ci0gIHRoaXMud3JpdGVJMTYoaWQpOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRFbmQgPSBmdW5jdGlvbigpIHsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkU3RvcCA9IGZ1bmN0aW9uKCkgewotICB0aGlzLndyaXRlQnl0ZShUeXBlLlNUT1ApOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWFwQmVnaW4gPSBmdW5jdGlvbihrdHlwZSwgdnR5cGUsIHNpemUpIHsKLSAgdGhpcy53cml0ZUJ5dGUoa3R5cGUpOwotICB0aGlzLndyaXRlQnl0ZSh2dHlwZSk7Ci0gIHRoaXMud3JpdGVJMzIoc2l6ZSk7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNYXBFbmQgPSBmdW5jdGlvbigpIHsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RCZWdpbiA9IGZ1bmN0aW9uKGV0eXBlLCBzaXplKSB7Ci0gIHRoaXMud3JpdGVCeXRlKGV0eXBlKTsKLSAgdGhpcy53cml0ZUkzMihzaXplKTsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RFbmQgPSBmdW5jdGlvbigpIHsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVNldEJlZ2luID0gZnVuY3Rpb24oZXR5cGUsIHNpemUpIHsKLSAgY29uc29sZS5sb2coJ3dyaXRlIHNldCcsIGV0eXBlLCBzaXplKTsKLSAgdGhpcy53cml0ZUJ5dGUoZXR5cGUpOwotICB0aGlzLndyaXRlSTMyKHNpemUpOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU2V0RW5kID0gZnVuY3Rpb24oKSB7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCb29sID0gZnVuY3Rpb24oYm9vbCkgewotICBpZiAoYm9vbCkgewotICAgIHRoaXMud3JpdGVCeXRlKDEpOwotICB9IGVsc2UgewotICAgIHRoaXMud3JpdGVCeXRlKDApOwotICB9Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCeXRlID0gZnVuY3Rpb24oYnl0ZSkgewotICB0aGlzLnRyYW5zLndyaXRlKEJpbmFyeVBhcnNlci5mcm9tQnl0ZShieXRlKSk7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVJMTYgPSBmdW5jdGlvbihpMTYpIHsKLSAgdGhpcy50cmFucy53cml0ZShCaW5hcnlQYXJzZXIuZnJvbVNob3J0KGkxNikpOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlSTMyID0gZnVuY3Rpb24oaTMyKSB7Ci0gIHRoaXMudHJhbnMud3JpdGUoQmluYXJ5UGFyc2VyLmZyb21JbnQoaTMyKSk7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVJNjQgPSBmdW5jdGlvbihpNjQpIHsKLSAgdGhpcy50cmFucy53cml0ZShCaW5hcnlQYXJzZXIuZnJvbUxvbmcoaTY0KSk7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVEb3VibGUgPSBmdW5jdGlvbihkdWIpIHsKLSAgdGhpcy50cmFucy53cml0ZShCaW5hcnlQYXJzZXIuZnJvbURvdWJsZShkdWIpKTsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cmluZyA9IGZ1bmN0aW9uKHN0cikgewotICB0aGlzLndyaXRlSTMyKHN0ci5sZW5ndGgpOwotICB0aGlzLnRyYW5zLndyaXRlKHN0cik7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKCkgewotICB2YXIgc3ogPSB0aGlzLnJlYWRJMzIoKTsKLSAgdmFyIHR5cGUsIG5hbWUsIHNlcWlkOwotCi0gIGlmIChzeiA8IDApIHsKLSAgICB2YXIgdmVyc2lvbiA9IHN6ICYgVkVSU0lPTl9NQVNLOwotICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkgewotICAgICAgY29uc29sZS5sb2coIkJBRDogIiArIHZlcnNpb24pOwotICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKEJBRF9WRVJTSU9OLCAiQmFkIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbjogIiArIHN6KTsKLSAgICB9Ci0gICAgdHlwZSA9IHN6ICYgVFlQRV9NQVNLOwotICAgIG5hbWUgPSB0aGlzLnJlYWRTdHJpbmcoKTsKLSAgICBzZXFpZCA9IHRoaXMucmVhZEkzMigpOwotICB9IGVsc2UgewotICAgIGlmICh0aGlzLnN0cmljdFJlYWQpIHsKLSAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihCQURfVkVSU0lPTiwgIk5vIHByb3RvY29sIHZlcnNpb24gaGVhZGVyIik7Ci0gICAgfQotICAgIG5hbWUgPSB0aGlzLnRyYW5zLnJlYWQoc3opOwotICAgIHR5cGUgPSB0aGlzLnJlYWRCeXRlKCk7Ci0gICAgc2VxaWQgPSB0aGlzLnJlYWRJMzIoKTsKLSAgfQotICByZXR1cm4ge2ZuYW1lOiBuYW1lLCBtdHlwZTogdHlwZSwgcnNlcWlkOiBzZXFpZH07Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RydWN0QmVnaW4gPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHtmbmFtZTogJyd9Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgewotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRGaWVsZEJlZ2luID0gZnVuY3Rpb24oKSB7Ci0gIHZhciB0eXBlID0gdGhpcy5yZWFkQnl0ZSgpOwotICBpZiAodHlwZSA9PSBUeXBlLlNUT1ApIHsKLSAgICByZXR1cm4ge2ZuYW1lOiBudWxsLCBmdHlwZTogdHlwZSwgZmlkOiAwfTsKLSAgfQotICB2YXIgaWQgPSB0aGlzLnJlYWRJMTYoKTsKLSAgcmV0dXJuIHtmbmFtZTogbnVsbCwgZnR5cGU6IHR5cGUsIGZpZDogaWR9OwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRGaWVsZEVuZCA9IGZ1bmN0aW9uKCkgewotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRNYXBCZWdpbiA9IGZ1bmN0aW9uKCkgewotICB2YXIga3R5cGUgPSB0aGlzLnJlYWRCeXRlKCk7Ci0gIHZhciB2dHlwZSA9IHRoaXMucmVhZEJ5dGUoKTsKLSAgdmFyIHNpemUgPSB0aGlzLnJlYWRJMzIoKTsKLSAgcmV0dXJuIHtrdHlwZToga3R5cGUsIHZ0eXBlOiB2dHlwZSwgc2l6ZTogc2l6ZX07Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZE1hcEVuZCA9IGZ1bmN0aW9uKCkgewotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRMaXN0QmVnaW4gPSBmdW5jdGlvbigpIHsKLSAgdmFyIGV0eXBlID0gdGhpcy5yZWFkQnl0ZSgpOwotICB2YXIgc2l6ZSA9IHRoaXMucmVhZEkzMigpOwotICByZXR1cm4ge2V0eXBlOiBldHlwZSwgc2l6ZTogc2l6ZX07Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZExpc3RFbmQgPSBmdW5jdGlvbigpIHsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkU2V0QmVnaW4gPSBmdW5jdGlvbigpIHsKLSAgdmFyIGV0eXBlID0gdGhpcy5yZWFkQnl0ZSgpOwotICB2YXIgc2l6ZSA9IHRoaXMucmVhZEkzMigpOwotICByZXR1cm4ge2V0eXBlOiBldHlwZSwgc2l6ZTogc2l6ZX07Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZFNldEVuZCA9IGZ1bmN0aW9uKCkgewotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRCb29sID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBieXRlID0gdGhpcy5yZWFkQnl0ZSgpOwotICBpZiAoYnl0ZSA9PSAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRCeXRlID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBidWZmID0gdGhpcy50cmFucy5yZWFkKDEpOwotICByZXR1cm4gQmluYXJ5UGFyc2VyLnRvQnl0ZShidWZmKTsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkSTE2ID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBidWZmID0gdGhpcy50cmFucy5yZWFkKDIpOwotICByZXR1cm4gQmluYXJ5UGFyc2VyLnRvU2hvcnQoYnVmZik7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEkzMiA9IGZ1bmN0aW9uKCkgewotICB2YXIgYnVmZiA9IHRoaXMudHJhbnMucmVhZCg0KTsKLSAgLy8gY29uc29sZS5sb2coInJlYWQgYnVmOiAiKTsKLSAgLy8gY29uc29sZS5sb2coYnVmZik7Ci0gIC8vIGNvbnNvbGUubG9nKCJyZXN1bHQ6ICIgKyBCaW5hcnlQYXJzZXIudG9JbnQoYnVmZikpOwotICByZXR1cm4gQmluYXJ5UGFyc2VyLnRvSW50KGJ1ZmYpOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRJNjQgPSBmdW5jdGlvbigpIHsKLSAgdmFyIGJ1ZmYgPSB0aGlzLnRyYW5zLnJlYWQoOCk7Ci0gIHJldHVybiBCaW5hcnlQYXJzZXIudG9Mb25nKGJ1ZmYpOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWREb3VibGUgPSBmdW5jdGlvbigpIHsKLSAgdmFyIGJ1ZmYgPSB0aGlzLnRyYW5zLnJlYWQoOCk7Ci0gIHJldHVybiBCaW5hcnlQYXJzZXIudG9GbG9hdChidWZmKTsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkQmluYXJ5ID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBsZW4gPSB0aGlzLnJlYWRJMzIoKTsKLSAgcmV0dXJuIHRoaXMudHJhbnMucmVhZChsZW4pOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJpbmcgPSBmdW5jdGlvbigpIHsKLSAgdmFyIHIgPSB0aGlzLnJlYWRCaW5hcnkoKS50b1N0cmluZygnYmluYXJ5Jyk7Ci0gIC8vIGNvbnNvbGUubG9nKCJyZWFkU3RyaW5nOiAiICsgcik7Ci0gIHJldHVybiByOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLmdldFRyYW5zcG9ydCA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy50cmFuczsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5za2lwID0gZnVuY3Rpb24odHlwZSkgewotICAvLyBjb25zb2xlLmxvZygic2tpcDogIiArIHR5cGUpOwotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIFR5cGUuU1RPUDoKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFR5cGUuQk9PTDoKLSAgICAgIHRoaXMucmVhZEJvb2woKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVHlwZS5CWVRFOgotICAgICAgdGhpcy5yZWFkQnl0ZSgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLkkxNjoKLSAgICAgIHRoaXMucmVhZEkxNigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLkkzMjoKLSAgICAgIHRoaXMucmVhZEkzMigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLkk2NDoKLSAgICAgIHRoaXMucmVhZEk2NCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLkRPVUJMRToKLSAgICAgIHRoaXMucmVhZERvdWJsZSgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLlNUUklORzoKLSAgICAgIHRoaXMucmVhZFN0cmluZygpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLlNUUlVDVDoKLSAgICAgIHRoaXMucmVhZFN0cnVjdEJlZ2luKCk7Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICB2YXIgciA9IHRoaXMucmVhZEZpZWxkQmVnaW4oKTsKLSAgICAgICAgaWYgKHIuZnR5cGUgPT09IFR5cGUuU1RPUCkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuc2tpcChyLmZ0eXBlKTsKLSAgICAgICAgdGhpcy5yZWFkRmllbGRFbmQoKTsKLSAgICAgIH0KLSAgICAgIHRoaXMucmVhZFN0cnVjdEVuZCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLk1BUDoKLSAgICAgIHZhciByID0gdGhpcy5yZWFkTWFwQmVnaW4oKTsKLSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgci5zaXplOyArK2kpIHsKLSAgICAgICAgdGhpcy5za2lwKHIua3R5cGUpOwotICAgICAgICB0aGlzLnNraXAoci52dHlwZSk7Ci0gICAgICB9Ci0gICAgICB0aGlzLnJlYWRNYXBFbmQoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVHlwZS5TRVQ6Ci0gICAgICB2YXIgciA9IHRoaXMucmVhZFNldEJlZ2luKCk7Ci0gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHIuc2l6ZTsgKytpKSB7Ci0gICAgICAgIHRoaXMuc2tpcChyLmV0eXBlKTsKLSAgICAgIH0KLSAgICAgIHRoaXMucmVhZFNldEVuZCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLkxJU1Q6Ci0gICAgICB2YXIgciA9IHRoaXMucmVhZExpc3RCZWdpbigpOwotICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByLnNpemU7ICsraSkgewotICAgICAgICB0aGlzLnNraXAoci5ldHlwZSk7Ci0gICAgICB9Ci0gICAgICB0aGlzLnJlYWRMaXN0RW5kKCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgRXJyb3IoIkludmFsaWQgdHlwZTogIiArIHR5cGUpOwotICB9Ci19Cittb2R1bGUuZXhwb3J0cy5UQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL2JpbmFyeV9wcm90b2NvbCcpOworbW9kdWxlLmV4cG9ydHMuVENvbXBhY3RQcm90b2NvbCA9IHJlcXVpcmUoJy4vY29tcGFjdF9wcm90b2NvbCcpOworbW9kdWxlLmV4cG9ydHMuVEpTT05Qcm90b2NvbCA9IHJlcXVpcmUoJy4vanNvbl9wcm90b2NvbCcpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3NlcnZlci5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9zZXJ2ZXIuanMKaW5kZXggYTczZjIzZS4uZTEyNGFjYyAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3NlcnZlci5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvc2VydmVyLmpzCkBAIC0xNiwzOCArMTYsNjkgQEAKICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi12YXIgc3lzID0gcmVxdWlyZSgnc3lzJyksCi0gICAgbmV0ID0gcmVxdWlyZSgnbmV0Jyk7CiAKLXZhciB0dHJhbnNwb3J0ID0gcmVxdWlyZSgnLi90cmFuc3BvcnQnKTsKLXZhciBCaW5hcnlQYXJzZXIgPSByZXF1aXJlKCcuL2JpbmFyeV9wYXJzZXInKS5CaW5hcnlQYXJzZXIsCi0gICAgVEJpbmFyeVByb3RvY29sID0gcmVxdWlyZSgnLi9wcm90b2NvbCcpLlRCaW5hcnlQcm90b2NvbDsKK3ZhciBjb25zdGFudHMgPSByZXF1aXJlKCdjb25zdGFudHMnKTsKK3ZhciBuZXQgPSByZXF1aXJlKCduZXQnKTsKK3ZhciB0bHMgPSByZXF1aXJlKCd0bHMnKTsKIAotZXhwb3J0cy5jcmVhdGVTZXJ2ZXIgPSBmdW5jdGlvbihjbHMsIGhhbmRsZXIsIG9wdGlvbnMpIHsKLSAgaWYgKGNscy5Qcm9jZXNzb3IpIHsKLSAgICBjbHMgPSBjbHMuUHJvY2Vzc29yOwotICB9Ci0gIHZhciBwcm9jZXNzb3IgPSBuZXcgY2xzKGhhbmRsZXIpOwotICB2YXIgdHJhbnNwb3J0ID0gKG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc3BvcnQpID8gb3B0aW9ucy50cmFuc3BvcnQgOiB0dHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQ7Cit2YXIgVEJ1ZmZlcmVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9idWZmZXJlZF90cmFuc3BvcnQnKTsKK3ZhciBUQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL2JpbmFyeV9wcm90b2NvbCcpOwordmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CisKKy8qKgorICogQ3JlYXRlIGEgVGhyaWZ0IHNlcnZlciB3aGljaCBjYW4gc2VydmUgb25lIG9yIG11bHRpcGxlIHNlcnZpY2VzLgorICogQHBhcmFtIHtvYmplY3R9IHByb2Nlc3NvciAtIEEgbm9ybWFsIG9yIG11bHRpcGxleGVkUHJvY2Vzc29yIChtdXN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgcHJlY29uc3RydWN0ZWQgd2l0aCB0aGUgZGVzaXJlZCBoYW5kbGVyKS4KKyAqIEBwYXJhbSB7U2VydmVyT3B0aW9uc30gb3B0aW9ucyAtIE9wdGlvbmFsIGFkZGl0aW9uYWwgc2VydmVyIGNvbmZpZ3VyYXRpb24uCisgKiBAcmV0dXJucyB7b2JqZWN0fSAtIFRoZSBBcGFjaGUgVGhyaWZ0IE11bHRpcGxleCBTZXJ2ZXIuCisgKi8KK2V4cG9ydHMuY3JlYXRlTXVsdGlwbGV4U2VydmVyID0gZnVuY3Rpb24ocHJvY2Vzc29yLCBvcHRpb25zKSB7CisgIHZhciB0cmFuc3BvcnQgPSAob3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zcG9ydCkgPyBvcHRpb25zLnRyYW5zcG9ydCA6IFRCdWZmZXJlZFRyYW5zcG9ydDsKICAgdmFyIHByb3RvY29sID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5wcm90b2NvbCkgPyBvcHRpb25zLnByb3RvY29sIDogVEJpbmFyeVByb3RvY29sOwogCi0gIHJldHVybiBuZXQuY3JlYXRlU2VydmVyKGZ1bmN0aW9uKHN0cmVhbSkgewotICAgIHN0cmVhbS5vbignZGF0YScsIHRyYW5zcG9ydC5yZWNlaXZlcihmdW5jdGlvbih0cmFuc3BvcnRfd2l0aF9kYXRhKSB7Ci0gICAgICB2YXIgaW5wdXQgPSBuZXcgcHJvdG9jb2wodHJhbnNwb3J0X3dpdGhfZGF0YSk7CisgIGZ1bmN0aW9uIHNlcnZlckltcGwoc3RyZWFtKSB7CisgICAgdmFyIHNlbGYgPSB0aGlzOworICAgIHN0cmVhbS5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsKKyAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7CisgICAgfSk7CisgICAgc3RyZWFtLm9uKCdkYXRhJywgdHJhbnNwb3J0LnJlY2VpdmVyKGZ1bmN0aW9uKHRyYW5zcG9ydFdpdGhEYXRhKSB7CisgICAgICB2YXIgaW5wdXQgPSBuZXcgcHJvdG9jb2wodHJhbnNwb3J0V2l0aERhdGEpOwogICAgICAgdmFyIG91dHB1dCA9IG5ldyBwcm90b2NvbChuZXcgdHJhbnNwb3J0KHVuZGVmaW5lZCwgZnVuY3Rpb24oYnVmKSB7Ci0gICAgICAgIHN0cmVhbS53cml0ZShidWYpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RyZWFtLndyaXRlKGJ1Zik7CisgICAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7CisgICAgICAgICAgICBzdHJlYW0uZW5kKCk7CisgICAgICAgIH0KICAgICAgIH0pKTsKIAogICAgICAgdHJ5IHsKLSAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3MoaW5wdXQsIG91dHB1dCk7Ci0gICAgICAgIHRyYW5zcG9ydF93aXRoX2RhdGEuY29tbWl0UG9zaXRpb24oKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChlKSB7Ci0gICAgICAgIGlmIChlIGluc3RhbmNlb2YgdHRyYW5zcG9ydC5JbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKLSAgICAgICAgICB0cmFuc3BvcnRfd2l0aF9kYXRhLnJvbGxiYWNrUG9zaXRpb24oKTsKKyAgICAgICAgZG8geworICAgICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzKGlucHV0LCBvdXRwdXQpOworICAgICAgICAgIHRyYW5zcG9ydFdpdGhEYXRhLmNvbW1pdFBvc2l0aW9uKCk7CisgICAgICAgIH0gd2hpbGUgKHRydWUpOworICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKKyAgICAgICAgICAvL1RoZSBsYXN0IGRhdGEgaW4gdGhlIGJ1ZmZlciB3YXMgbm90IGEgY29tcGxldGUgbWVzc2FnZSwgd2FpdCBmb3IgdGhlIHJlc3QKKyAgICAgICAgICB0cmFuc3BvcnRXaXRoRGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZXJyLm1lc3NhZ2UgPT09ICJJbnZhbGlkIHR5cGU6IHVuZGVmaW5lZCIpIHsKKyAgICAgICAgICAvL05vIG1vcmUgZGF0YSBpbiB0aGUgYnVmZmVyCisgICAgICAgICAgLy9UaGlzIHRyYXAgaXMgYSBiaXQgaGFja2lzaAorICAgICAgICAgIC8vVGhlIG5leHQgc3RlcCB0byBpbXByb3ZlIHRoZSBub2RlIGJlaGF2aW9yIGhlcmUgaXMgdG8gaGF2ZQorICAgICAgICAgIC8vICB0aGUgY29tcGlsZXIgZ2VuZXJhdGVkIHByb2Nlc3MgbWV0aG9kIHRocm93IGEgbW9yZSBleHBsaWNpdAorICAgICAgICAgIC8vICBlcnJvciB3aGVuIHRoZSBuZXR3b3JrIGJ1ZmZlciBpcyBlbXB0eSAocmVnYXJkbGVzIG9mIHRoZQorICAgICAgICAgIC8vICBwcm90b2NvbC90cmFuc3BvcnQgc3RhY2sgaW4gdXNlKSBhbmQgcmVwbGFjZSB0aGlzIGhldXJpc3RpYy4KKyAgICAgICAgICAvLyAgQWxzbyB0cmFuc3BvcnRzIHNob3VsZCBwcm9iYWJseSBub3QgZm9yY2UgdXBwZXIgbGF5ZXJzIHRvCisgICAgICAgICAgLy8gIG1hbmFnZSB0aGVpciBidWZmZXIgcG9zaXRpb25zIChpLmUuIHJvbGxiYWNrUG9zaXRpb24oKSBhbmQKKyAgICAgICAgICAvLyAgY29tbWl0UG9zaXRpb24oKSBzaG91bGQgYmUgZWxpbWluYXRlZCBpbiBsaWV1IG9mIGEgdHJhbnNwb3J0CisgICAgICAgICAgLy8gIGVuY2Fwc3VsYXRlZCBidWZmZXIgbWFuYWdlbWVudCBzdHJhdGVneS4pCisgICAgICAgICAgdHJhbnNwb3J0V2l0aERhdGEucm9sbGJhY2tQb3NpdGlvbigpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgLy9VbmV4cGVjdGVkIGVycm9yCisgICAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7CisgICAgICAgICAgc3RyZWFtLmVuZCgpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfSkpOwpAQCAtNTUsNSArODYsMjggQEAKICAgICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uKCkgewogICAgICAgc3RyZWFtLmVuZCgpOwogICAgIH0pOwotICB9KTsKKyAgfQorCisgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudGxzKSB7CisgICAgaWYgKCEoJ3NlY3VyZVByb3RvY29sJyBpbiBvcHRpb25zLnRscykgJiYgISgnc2VjdXJlT3B0aW9ucycgaW4gb3B0aW9ucy50bHMpKSB7CisgICAgICBvcHRpb25zLnRscy5zZWN1cmVQcm90b2NvbCA9ICJTU0x2MjNfbWV0aG9kIjsKKyAgICAgIG9wdGlvbnMudGxzLnNlY3VyZU9wdGlvbnMgPSBjb25zdGFudHMuU1NMX09QX05PX1NTTHYyIHwgY29uc3RhbnRzLlNTTF9PUF9OT19TU0x2MzsKKyAgICB9CisgICAgcmV0dXJuIHRscy5jcmVhdGVTZXJ2ZXIob3B0aW9ucy50bHMsIHNlcnZlckltcGwpOworICB9IGVsc2UgeworICAgIHJldHVybiBuZXQuY3JlYXRlU2VydmVyKHNlcnZlckltcGwpOworICB9Cit9OworCisvKioKKyAqIENyZWF0ZSBhIHNpbmdsZSBzZXJ2aWNlIEFwYWNoZSBUaHJpZnQgc2VydmVyLgorICogQHBhcmFtIHtvYmplY3R9IHByb2Nlc3NvciAtIEEgc2VydmljZSBjbGFzcyBvciBwcm9jZXNzb3IgZnVuY3Rpb24uCisgKiBAcGFyYW0ge1NlcnZlck9wdGlvbnN9IG9wdGlvbnMgLSBPcHRpb25hbCBhZGRpdGlvbmFsIHNlcnZlciBjb25maWd1cmF0aW9uLgorICogQHJldHVybnMge29iamVjdH0gLSBUaGUgQXBhY2hlIFRocmlmdCBNdWx0aXBsZXggU2VydmVyLgorICovCitleHBvcnRzLmNyZWF0ZVNlcnZlciA9IGZ1bmN0aW9uKHByb2Nlc3NvciwgaGFuZGxlciwgb3B0aW9ucykgeworICBpZiAocHJvY2Vzc29yLlByb2Nlc3NvcikgeworICAgIHByb2Nlc3NvciA9IHByb2Nlc3Nvci5Qcm9jZXNzb3I7CisgIH0KKyAgcmV0dXJuIGV4cG9ydHMuY3JlYXRlTXVsdGlwbGV4U2VydmVyKG5ldyBwcm9jZXNzb3IoaGFuZGxlciksIG9wdGlvbnMpOwogfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC90aHJpZnQuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvdGhyaWZ0LmpzCmluZGV4IGEwNzkwMDEuLmYyYjI4OTYgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC90aHJpZnQuanMKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3RocmlmdC5qcwpAQCAtMTYsNyArMTYsNyBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLXZhciBzeXMgPSByZXF1aXJlKCdzeXMnKTsKK3ZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpOwogCiB2YXIgVHlwZSA9IGV4cG9ydHMuVHlwZSA9IHsKICAgU1RPUDogMCwKQEAgLTM1LDIxICszNSwyNSBAQAogICBTRVQ6IDE0LAogICBMSVNUOiAxNSwKICAgVVRGODogMTYsCi0gIFVURjE2OiAxNywKLX0KKyAgVVRGMTY6IDE3Cit9OwogCiBleHBvcnRzLk1lc3NhZ2VUeXBlID0gewogICBDQUxMOiAxLAogICBSRVBMWTogMiwKICAgRVhDRVBUSU9OOiAzLAotICBPTkVXQVk6IDQsCi19CisgIE9ORVdBWTogNAorfTsKIAotdmFyIFRFeGNlcHRpb24gPSBleHBvcnRzLlRFeGNlcHRpb24gPSBmdW5jdGlvbihtZXNzYWdlKSB7Ci0gIEVycm9yLmNhbGwodGhpcywgbWVzc2FnZSk7Ci0gIHRoaXMubmFtZSA9ICdURXhjZXB0aW9uJzsKLX0KLXN5cy5pbmhlcml0cyhURXhjZXB0aW9uLCBFcnJvcik7CitleHBvcnRzLlRFeGNlcHRpb24gPSBURXhjZXB0aW9uOworCitmdW5jdGlvbiBURXhjZXB0aW9uKG1lc3NhZ2UpIHsKKyAgRXJyb3IuY2FsbCh0aGlzKTsKKyAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CisgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTsKKyAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKK307Cit1dGlsLmluaGVyaXRzKFRFeGNlcHRpb24sIEVycm9yKTsKIAogdmFyIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgPSBleHBvcnRzLlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgPSB7CiAgIFVOS05PV046IDAsCkBAIC01OSw4MiArNjMsMTcwIEBACiAgIEJBRF9TRVFVRU5DRV9JRDogNCwKICAgTUlTU0lOR19SRVNVTFQ6IDUsCiAgIElOVEVSTkFMX0VSUk9SOiA2LAotICBQUk9UT0NPTF9FUlJPUjogNwotfQorICBQUk9UT0NPTF9FUlJPUjogNywKKyAgSU5WQUxJRF9UUkFOU0ZPUk06IDgsCisgIElOVkFMSURfUFJPVE9DT0w6IDksCisgIFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFOiAxMAorfTsKIAotdmFyIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA9IGV4cG9ydHMuVEFwcGxpY2F0aW9uRXhjZXB0aW9uID0gZnVuY3Rpb24odHlwZSwgbWVzc2FnZSkgewotICBURXhjZXB0aW9uLmNhbGwodGhpcywgbWVzc2FnZSk7CitleHBvcnRzLlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKKworZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKHR5cGUsIG1lc3NhZ2UpIHsKKyAgVEV4Y2VwdGlvbi5jYWxsKHRoaXMpOworICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTsKICAgdGhpcy50eXBlID0gdHlwZSB8fCBUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLlVOS05PV047Ci0gIHRoaXMubmFtZSA9ICdUQXBwbGljYXRpb25FeGNlcHRpb24nOwotfQotc3lzLmluaGVyaXRzKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgVEV4Y2VwdGlvbik7CisgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTsKKyAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKK307Cit1dGlsLmluaGVyaXRzKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgVEV4Y2VwdGlvbik7CiAKIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKGlucHV0KSB7Ci0gIHZhciBmdHlwZQotICB2YXIgZmlkCi0gIHZhciByZXQgPSBpbnB1dC5yZWFkU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpCisgIHZhciBmdHlwZTsKKyAgdmFyIHJldCA9IGlucHV0LnJlYWRTdHJ1Y3RCZWdpbignVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7CiAKICAgd2hpbGUoMSl7Ci0KLSAgICAgIHJldCA9IGlucHV0LnJlYWRGaWVsZEJlZ2luKCkKLQorICAgICAgcmV0ID0gaW5wdXQucmVhZEZpZWxkQmVnaW4oKTsKICAgICAgIGlmKHJldC5mdHlwZSA9PSBUeXBlLlNUT1ApCi0gICAgICAgICAgYnJlYWsKKyAgICAgICAgICBicmVhazsKIAotICAgICAgdmFyIGZpZCA9IHJldC5maWQKLQotICAgICAgc3dpdGNoKGZpZCl7CisgICAgICBzd2l0Y2gocmV0LmZpZCl7CiAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICBpZiggcmV0LmZ0eXBlID09IFR5cGUuU1RSSU5HICl7Ci0gICAgICAgICAgICAgICAgICByZXQgPSBpbnB1dC5yZWFkU3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IHJldAorICAgICAgICAgICAgICAgICAgcmV0ID0gaW5wdXQucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gcmV0OwogICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgcmV0ID0gaW5wdXQuc2tpcChyZXQuZnR5cGUpCisgICAgICAgICAgICAgICAgICByZXQgPSBpbnB1dC5za2lwKHJldC5mdHlwZSk7CiAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgIGlmKCByZXQuZnR5cGUgPT0gVHlwZS5JMzIgKXsKLSAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnJlYWRJMzIoKQotICAgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gcmV0CisgICAgICAgICAgICAgICAgICByZXQgPSBpbnB1dC5yZWFkSTMyKCk7CisgICAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSByZXQ7CiAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICByZXQgICA9IGlucHV0LnNraXAocmV0LmZ0eXBlKQorICAgICAgICAgICAgICAgICAgcmV0ICAgPSBpbnB1dC5za2lwKHJldC5mdHlwZSk7CiAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgYnJlYWsKLQorICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICByZXQgPSBpbnB1dC5za2lwKHJldC5mdHlwZSkKLSAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgcmV0ID0gaW5wdXQuc2tpcChyZXQuZnR5cGUpOworICAgICAgICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIGlucHV0LnJlYWRGaWVsZEVuZCgpCisgICAgICBpbnB1dC5yZWFkRmllbGRFbmQoKTsKICAgfQotCi0gIGlucHV0LnJlYWRTdHJ1Y3RFbmQoKQotfQorICBpbnB1dC5yZWFkU3RydWN0RW5kKCk7Cit9OwogCiBUQXBwbGljYXRpb25FeGNlcHRpb24ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24ob3V0cHV0KXsKICAgb3V0cHV0LndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOwogCiAgIGlmICh0aGlzLm1lc3NhZ2UpIHsKLSAgICAgIG91dHB1dC53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUeXBlLlNUUklORywgMSkKLSAgICAgIG91dHB1dC53cml0ZVN0cmluZyh0aGlzLm1lc3NhZ2UpCi0gICAgICBvdXRwdXQud3JpdGVGaWVsZEVuZCgpCisgICAgICBvdXRwdXQud3JpdGVGaWVsZEJlZ2luKCdtZXNzYWdlJywgVHlwZS5TVFJJTkcsIDEpOworICAgICAgb3V0cHV0LndyaXRlU3RyaW5nKHRoaXMubWVzc2FnZSk7CisgICAgICBvdXRwdXQud3JpdGVGaWVsZEVuZCgpOwogICB9CiAKICAgaWYgKHRoaXMuY29kZSkgewotICAgICAgb3V0cHV0LndyaXRlRmllbGRCZWdpbigndHlwZScsIFR5cGUuSTMyLCAyKQotICAgICAgb3V0cHV0LndyaXRlSTMyKHRoaXMuY29kZSkKLSAgICAgIG91dHB1dC53cml0ZUZpZWxkRW5kKCkKKyAgICAgIG91dHB1dC53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUeXBlLkkzMiwgMik7CisgICAgICBvdXRwdXQud3JpdGVJMzIodGhpcy5jb2RlKTsKKyAgICAgIG91dHB1dC53cml0ZUZpZWxkRW5kKCk7CiAgIH0KIAotICBvdXRwdXQud3JpdGVGaWVsZFN0b3AoKQotICBvdXRwdXQud3JpdGVTdHJ1Y3RFbmQoKQotfQorICBvdXRwdXQud3JpdGVGaWVsZFN0b3AoKTsKKyAgb3V0cHV0LndyaXRlU3RydWN0RW5kKCk7Cit9OworCit2YXIgVFByb3RvY29sRXhjZXB0aW9uVHlwZSA9IGV4cG9ydHMuVFByb3RvY29sRXhjZXB0aW9uVHlwZSA9IHsKKyAgVU5LTk9XTjogMCwKKyAgSU5WQUxJRF9EQVRBOiAxLAorICBORUdBVElWRV9TSVpFOiAyLAorICBTSVpFX0xJTUlUOiAzLAorICBCQURfVkVSU0lPTjogNCwKKyAgTk9UX0lNUExFTUVOVEVEOiA1LAorICBERVBUSF9MSU1JVDogNgorfTsKKworCitleHBvcnRzLlRQcm90b2NvbEV4Y2VwdGlvbiA9IFRQcm90b2NvbEV4Y2VwdGlvbjsKKworZnVuY3Rpb24gVFByb3RvY29sRXhjZXB0aW9uKHR5cGUsIG1lc3NhZ2UpIHsKKyAgRXJyb3IuY2FsbCh0aGlzKTsKKyAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CisgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTsKKyAgdGhpcy50eXBlID0gdHlwZTsKKyAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKK307Cit1dGlsLmluaGVyaXRzKFRQcm90b2NvbEV4Y2VwdGlvbiwgRXJyb3IpOwogCiBleHBvcnRzLm9iamVjdExlbmd0aCA9IGZ1bmN0aW9uKG9iaikgewogICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGg7Ci19Cit9OwogCiBleHBvcnRzLmluaGVyaXRzID0gZnVuY3Rpb24oY29uc3RydWN0b3IsIHN1cGVyQ29uc3RydWN0b3IpIHsKLSAgc3lzLmluaGVyaXRzKGNvbnN0cnVjdG9yLCBzdXBlckNvbnN0cnVjdG9yKTsKLX0KKyAgdXRpbC5pbmhlcml0cyhjb25zdHJ1Y3Rvciwgc3VwZXJDb25zdHJ1Y3Rvcik7Cit9OworCit2YXIgY29weUxpc3QsIGNvcHlNYXA7CisKK2NvcHlMaXN0ID0gZnVuY3Rpb24obHN0LCB0eXBlcykgeworCisgIGlmICghbHN0KSB7cmV0dXJuIGxzdDsgfQorCisgIHZhciB0eXBlOworCisgIGlmICh0eXBlcy5zaGlmdCA9PT0gdW5kZWZpbmVkKSB7CisgICAgdHlwZSA9IHR5cGVzOworICB9CisgIGVsc2UgeworICAgIHR5cGUgPSB0eXBlc1swXTsKKyAgfQorICB2YXIgVHlwZSA9IHR5cGU7CisKKyAgdmFyIGxlbiA9IGxzdC5sZW5ndGgsIHJlc3VsdCA9IFtdLCBpLCB2YWw7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIHZhbCA9IGxzdFtpXTsKKyAgICBpZiAodHlwZSA9PT0gbnVsbCkgeworICAgICAgcmVzdWx0LnB1c2godmFsKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZSA9PT0gY29weU1hcCB8fCB0eXBlID09PSBjb3B5TGlzdCkgeworICAgICAgcmVzdWx0LnB1c2godHlwZSh2YWwsIHR5cGVzLnNsaWNlKDEpKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgcmVzdWx0LnB1c2gobmV3IFR5cGUodmFsKSk7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9OworCitjb3B5TWFwID0gZnVuY3Rpb24ob2JqLCB0eXBlcyl7CisKKyAgaWYgKCFvYmopIHtyZXR1cm4gb2JqOyB9CisKKyAgdmFyIHR5cGU7CisKKyAgaWYgKHR5cGVzLnNoaWZ0ID09PSB1bmRlZmluZWQpIHsKKyAgICB0eXBlID0gdHlwZXM7CisgIH0KKyAgZWxzZSB7CisgICAgdHlwZSA9IHR5cGVzWzBdOworICB9CisgIHZhciBUeXBlID0gdHlwZTsKKworICB2YXIgcmVzdWx0ID0ge30sIHZhbDsKKyAgZm9yKHZhciBwcm9wIGluIG9iaikgeworICAgIGlmKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeworICAgICAgdmFsID0gb2JqW3Byb3BdOworICAgICAgaWYgKHR5cGUgPT09IG51bGwpIHsKKyAgICAgICAgcmVzdWx0W3Byb3BdID0gdmFsOworICAgICAgfQorICAgICAgZWxzZSBpZiAodHlwZSA9PT0gY29weU1hcCB8fCB0eXBlID09PSBjb3B5TGlzdCkgeworICAgICAgICByZXN1bHRbcHJvcF0gPSB0eXBlKHZhbCwgdHlwZXMuc2xpY2UoMSkpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHJlc3VsdFtwcm9wXSA9IG5ldyBUeXBlKHZhbCk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9OworCittb2R1bGUuZXhwb3J0cy5jb3B5TWFwID0gY29weU1hcDsKK21vZHVsZS5leHBvcnRzLmNvcHlMaXN0ID0gY29weUxpc3Q7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvdHJhbnNwb3J0LmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3RyYW5zcG9ydC5qcwppbmRleCBhOTI2YTZkLi41OWRhYTk4IDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvdHJhbnNwb3J0LmpzCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC90cmFuc3BvcnQuanMKQEAgLTE2LDIyNSArMTYsNyBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLXZhciBCaW5hcnlQYXJzZXIgPSByZXF1aXJlKCcuL2JpbmFyeV9wYXJzZXInKS5CaW5hcnlQYXJzZXI7CiAKLXZhciBlbXB0eUJ1ZiA9IG5ldyBCdWZmZXIoMCk7Ci0KLXZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSBleHBvcnRzLklucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IGZ1bmN0aW9uKCkgewotfTsKLQotdmFyIFRGcmFtZWRUcmFuc3BvcnQgPSBleHBvcnRzLlRGcmFtZWRUcmFuc3BvcnQgPSBmdW5jdGlvbihidWZmZXIsIGNhbGxiYWNrKSB7Ci0gIHRoaXMuaW5CdWYgPSBidWZmZXIgfHwgZW1wdHlCdWY7Ci0gIHRoaXMub3V0QnVmZmVycyA9IFtdOwotICB0aGlzLm91dENvdW50ID0gMDsKLSAgdGhpcy5yZWFkUG9zID0gMDsKLSAgdGhpcy5vbkZsdXNoID0gY2FsbGJhY2s7Ci19OwotVEZyYW1lZFRyYW5zcG9ydC5yZWNlaXZlciA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7Ci0gIHZhciBmcmFtZUxlZnQgPSAwLAotICAgICAgZnJhbWVQb3MgPSAwLAotICAgICAgZnJhbWUgPSBudWxsOwotICB2YXIgcmVzaWR1YWwgPSBudWxsOwotCi0gIHJldHVybiBmdW5jdGlvbihkYXRhKSB7Ci0gICAgLy8gUHJlcGVuZCBhbnkgcmVzaWR1YWwgZGF0YSBmcm9tIG91ciBwcmV2aW91cyByZWFkCi0gICAgaWYgKHJlc2lkdWFsKSB7Ci0gICAgICB2YXIgZGF0ID0gbmV3IEJ1ZmZlcihkYXRhLmxlbmd0aCArIHJlc2lkdWFsLmxlbmd0aCk7Ci0gICAgICByZXNpZHVhbC5jb3B5KGRhdCwgMCwgMCk7Ci0gICAgICBkYXRhLmNvcHkoZGF0LCByZXNpZHVhbC5sZW5ndGgsIDApOwotICAgICAgcmVzaWR1YWwgPSBudWxsOwotICAgIH0KLQotICAgIC8vIGZyYW1lZCB0cmFuc3BvcnQKLSAgICB3aGlsZSAoZGF0YS5sZW5ndGgpIHsKLSAgICAgIGlmIChmcmFtZUxlZnQgPT09IDApIHsKLSAgICAgICAgLy8gVE9ETyBhc3N1bWVzIHdlIGhhdmUgYWxsIDQgYnl0ZXMKLSAgICAgICAgaWYgKGRhdGEubGVuZ3RoIDwgNCkgewotICAgICAgICAgIGNvbnNvbGUubG9nKCJFeHBlY3RpbmcgPiA0IGJ5dGVzLCBmb3VuZCBvbmx5ICIgKyBkYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgcmVzaWR1YWwgPSBkYXRhOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIC8vdGhyb3cgRXJyb3IoIkV4cGVjdGluZyA+IDQgYnl0ZXMsIGZvdW5kIG9ubHkgIiArIGRhdGEubGVuZ3RoKTsKLSAgICAgICAgfQotICAgICAgICBmcmFtZUxlZnQgPSBCaW5hcnlQYXJzZXIudG9JbnQoZGF0YS5zbGljZSgwLDQpKTsKLSAgICAgICAgZnJhbWUgPSBuZXcgQnVmZmVyKGZyYW1lTGVmdCk7Ci0gICAgICAgIGZyYW1lUG9zID0gMDsKLSAgICAgICAgZGF0YSA9IGRhdGEuc2xpY2UoNCwgZGF0YS5sZW5ndGgpOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoZGF0YS5sZW5ndGggPj0gZnJhbWVMZWZ0KSB7Ci0gICAgICAgIGRhdGEuY29weShmcmFtZSwgZnJhbWVQb3MsIDAsIGZyYW1lTGVmdCk7Ci0gICAgICAgIGRhdGEgPSBkYXRhLnNsaWNlKGZyYW1lTGVmdCwgZGF0YS5sZW5ndGgpOwotICAgICAgICAKLSAgICAgICAgZnJhbWVMZWZ0ID0gMDsKLSAgICAgICAgY2FsbGJhY2sobmV3IFRGcmFtZWRUcmFuc3BvcnQoZnJhbWUpKTsKLSAgICAgIH0gZWxzZSBpZiAoZGF0YS5sZW5ndGgpIHsKLSAgICAgICAgZGF0YS5jb3B5KGZyYW1lLCBmcmFtZVBvcywgMCwgZGF0YS5sZW5ndGgpOwotICAgICAgICBmcmFtZUxlZnQgLT0gZGF0YS5sZW5ndGg7Ci0gICAgICAgIGZyYW1lUG9zICs9IGRhdGEubGVuZ3RoOwotICAgICAgICBkYXRhID0gZGF0YS5zbGljZShkYXRhLmxlbmd0aCwgZGF0YS5sZW5ndGgpOwotICAgICAgfQotICAgIH0KLSAgfTsKLX07Ci0KLVRGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlID0gewotICBjb21taXRQb3NpdGlvbjogZnVuY3Rpb24oKXt9LAotICByb2xsYmFja1Bvc2l0aW9uOiBmdW5jdGlvbigpe30sCi0KLSAgLy8gVE9ETzogSW1wbGVtZW50IG9wZW4vY2xvc2Ugc3VwcG9ydAotICBpc09wZW46IGZ1bmN0aW9uKCkge3JldHVybiB0cnVlO30sCi0gIG9wZW46IGZ1bmN0aW9uKCkge30sCi0gIGNsb3NlOiBmdW5jdGlvbigpIHt9LAotCi0gIHJlYWQ6IGZ1bmN0aW9uKGxlbikgeyAvLyB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCBmb3IgZWFjaCBmcmFtZXMuCi0gICAgdmFyIGVuZCA9IHRoaXMucmVhZFBvcyArIGxlbjsKLQotICAgIGlmICh0aGlzLmluQnVmLmxlbmd0aCA8IGVuZCkgewotICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZWFkKCcgKyBsZW4gKyAnKSBmYWlsZWQgLSBub3QgZW5vdWdoIGRhdGEnKTsKLSAgICB9Ci0KLSAgICB2YXIgYnVmID0gdGhpcy5pbkJ1Zi5zbGljZSh0aGlzLnJlYWRQb3MsIGVuZCk7Ci0gICAgdGhpcy5yZWFkUG9zID0gZW5kOwotICAgIHJldHVybiBidWY7Ci0gIH0sCi0KLSAgcmVhZEFsbDogZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMuaW5CdWY7Ci0gIH0sCi0KLSAgd3JpdGU6IGZ1bmN0aW9uKGJ1ZiwgZW5jb2RpbmcpIHsKLSAgICBpZiAodHlwZW9mKGJ1ZikgPT09ICJzdHJpbmciKSB7Ci0gICAgICAvLyBEZWZhdWx0aW5nIHRvIGFzY2lpIGVuY29kaW5nIGhlcmUgc2luY2UgdGhhdCdzIG1vcmUgbGlrZSB0aGUgb3JpZ2luYWwKLSAgICAgIC8vIGNvZGUsIGJ1dCBJIGZlZWwgbGlrZSAndXRmOCcgd291bGQgYmUgYSBiZXR0ZXIgY2hvaWNlLgotICAgICAgYnVmID0gbmV3IEJ1ZmZlcihidWYsIGVuY29kaW5nIHx8ICdhc2NpaScpOwotICAgIH0KLSAgICB0aGlzLm91dEJ1ZmZlcnMucHVzaChidWYpOwotICAgIHRoaXMub3V0Q291bnQgKz0gYnVmLmxlbmd0aDsKLSAgfSwKLQotICBmbHVzaDogZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG91dCA9IG5ldyBCdWZmZXIodGhpcy5vdXRDb3VudCksCi0gICAgICAgIHBvcyA9IDA7Ci0gICAgdGhpcy5vdXRCdWZmZXJzLmZvckVhY2goZnVuY3Rpb24oYnVmKSB7Ci0gICAgICBidWYuY29weShvdXQsIHBvcywgMCk7Ci0gICAgICBwb3MgKz0gYnVmLmxlbmd0aDsKLSAgICB9KTsKLSAgICAKLSAgICBpZiAodGhpcy5vbkZsdXNoKSB7Ci0gICAgICAvLyBUT0RPOiBvcHRpbWl6ZSB0aGlzIGJldHRlciwgYWxsb2NhdGUgb25lIGJ1ZmZlciBpbnN0ZWFkIG9mIGJvdGg6Ci0gICAgICB2YXIgbXNnID0gbmV3IEJ1ZmZlcihvdXQubGVuZ3RoICsgNCk7Ci0gICAgICBCaW5hcnlQYXJzZXIuZnJvbUludChvdXQubGVuZ3RoKS5jb3B5KG1zZywgMCwgMCwgNCk7Ci0gICAgICBvdXQuY29weShtc2csIDQsIDAsIG91dC5sZW5ndGgpOwotICAgICAgdGhpcy5vbkZsdXNoKG1zZyk7Ci0gICAgfQotCi0gICAgdGhpcy5vdXRCdWZmZXJzID0gW107Ci0gICAgdGhpcy5vdXRDb3VudCA9IDA7Ci0gIH0KLX07Ci0KLXZhciBUQnVmZmVyZWRUcmFuc3BvcnQgPSBleHBvcnRzLlRCdWZmZXJlZFRyYW5zcG9ydCA9IGZ1bmN0aW9uKGJ1ZmZlciwgY2FsbGJhY2spIHsKLSAgdGhpcy5kZWZhdWx0UmVhZEJ1ZmZlclNpemUgPSAxMDI0OwotICB0aGlzLndyaXRlQnVmZmVyU2l6ZSA9IDUxMjsgLy8gU29mdCBMaW1pdAotICB0aGlzLmluQnVmID0gbmV3IEJ1ZmZlcih0aGlzLmRlZmF1bHRSZWFkQnVmZmVyU2l6ZSk7Ci0gIHRoaXMucmVhZEN1cnNvciA9IDA7Ci0gIHRoaXMud3JpdGVDdXJzb3IgPSAwOyAvLyBmb3IgaW5wdXQgYnVmZmVyCi0gIHRoaXMub3V0QnVmZmVycyA9IFtdOwotICB0aGlzLm91dENvdW50ID0gMDsKLSAgdGhpcy5vbkZsdXNoID0gY2FsbGJhY2s7Ci19OwotVEJ1ZmZlcmVkVHJhbnNwb3J0LnJlY2VpdmVyID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKLSAgdmFyIHJlYWRlciA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoKTsKLQotICByZXR1cm4gZnVuY3Rpb24oZGF0YSkgewotICAgIGlmIChyZWFkZXIud3JpdGVDdXJzb3IgKyBkYXRhLmxlbmd0aCA+IHJlYWRlci5pbkJ1Zi5sZW5ndGgpIHsKLSAgICAgIHZhciBidWYgPSBuZXcgQnVmZmVyKHJlYWRlci53cml0ZUN1cnNvciArIGRhdGEubGVuZ3RoKTsKLSAgICAgIHJlYWRlci5pbkJ1Zi5jb3B5KGJ1ZiwgMCwgMCwgcmVhZGVyLndyaXRlQ3Vyc29yKTsKLSAgICAgIHJlYWRlci5pbkJ1ZiA9IGJ1ZjsKLSAgICB9Ci0gICAgZGF0YS5jb3B5KHJlYWRlci5pbkJ1ZiwgcmVhZGVyLndyaXRlQ3Vyc29yLCAwKTsKLSAgICByZWFkZXIud3JpdGVDdXJzb3IgKz0gZGF0YS5sZW5ndGg7Ci0KLSAgICBjYWxsYmFjayhyZWFkZXIpOwotICB9OwotfTsKLQotVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZSA9IHsKLSAgY29tbWl0UG9zaXRpb246IGZ1bmN0aW9uKCl7Ci0gICAgdmFyIHVucmVhZGVkU2l6ZSA9IHRoaXMud3JpdGVDdXJzb3IgLSB0aGlzLnJlYWRDdXJzb3I7Ci0gICAgdmFyIGJ1ZlNpemUgPSAodW5yZWFkZWRTaXplICogMiA+IHRoaXMuZGVmYXVsdFJlYWRCdWZmZXJTaXplKSA/IHVucmVhZGVkU2l6ZSAqIDIgOiB0aGlzLmRlZmF1bHRSZWFkQnVmZmVyU2l6ZTsKLSAgICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihidWZTaXplKTsKLSAgICBpZiAodW5yZWFkZWRTaXplID4gMCkgewotICAgICAgdGhpcy5pbkJ1Zi5jb3B5KGJ1ZiwgMCwgdGhpcy5yZWFkQ3Vyc29yLCB1bnJlYWRlZFNpemUpOwotICAgIH0KLSAgICB0aGlzLnJlYWRDdXJzb3IgPSAwOwotICAgIHRoaXMud3JpdGVDdXJzb3IgPSB1bnJlYWRlZFNpemU7Ci0gICAgdGhpcy5pbkJ1ZiA9IGJ1ZjsKLSAgfSwKLSAgcm9sbGJhY2tQb3NpdGlvbjogZnVuY3Rpb24oKXsKLSAgICB0aGlzLnJlYWRDdXJzb3IgPSAwOwotICB9LAotCi0gIC8vIFRPRE86IEltcGxlbWVudCBvcGVuL2Nsb3NlIHN1cHBvcnQKLSAgaXNPcGVuOiBmdW5jdGlvbigpIHtyZXR1cm4gdHJ1ZTt9LAotICBvcGVuOiBmdW5jdGlvbigpIHt9LAotICBjbG9zZTogZnVuY3Rpb24oKSB7fSwKLQotICByZWFkOiBmdW5jdGlvbihsZW4pIHsKLSAgICBpZiAodGhpcy5yZWFkQ3Vyc29yICsgbGVuID4gdGhpcy53cml0ZUN1cnNvcikgewotICAgICAgdGhyb3cgbmV3IElucHV0QnVmZmVyVW5kZXJydW5FcnJvcigpOwotICAgIH0KLSAgICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihsZW4pOwotICAgIHRoaXMuaW5CdWYuY29weShidWYsIDAsIHRoaXMucmVhZEN1cnNvciwgdGhpcy5yZWFkQ3Vyc29yICsgbGVuKTsKLSAgICB0aGlzLnJlYWRDdXJzb3IgKz0gbGVuOwotICAgIHJldHVybiBidWY7Ci0gIH0sCi0KLSAgcmVhZEFsbDogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKHRoaXMucmVhZEN1cnNvciA+PSB0aGlzLndyaXRlQ3Vyc29yKSB7Ci0gICAgICB0aHJvdyBuZXcgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKCk7Ci0gICAgfQotICAgIHZhciBidWYgPSBuZXcgQnVmZmVyKHRoaXMud3JpdGVDdXJzb3IgLSB0aGlzLnJlYWRDdXJzb3IpOwotICAgIHRoaXMuaW5CdWYuY29weShidWYsIDAsIHRoaXMucmVhZEN1cnNvciwgdGhpcy53cml0ZUN1cnNvciAtIHRoaXMucmVhZEN1cnNvcik7Ci0gICAgdGhpcy5yZWFkQ3Vyc29yID0gdGhpcy53cml0ZUN1cnNvcjsKLSAgICByZXR1cm4gYnVmOwotICB9LAotCi0gIHdyaXRlOiBmdW5jdGlvbihidWYsIGVuY29kaW5nKSB7Ci0gICAgaWYgKHR5cGVvZihidWYpID09PSAic3RyaW5nIikgewotICAgICAgLy8gRGVmYXVsdGluZyB0byBhc2NpaSBlbmNvZGluZyBoZXJlIHNpbmNlIHRoYXQncyBtb3JlIGxpa2UgdGhlIG9yaWdpbmFsCi0gICAgICAvLyBjb2RlLCBidXQgSSBmZWVsIGxpa2UgJ3V0ZjgnIHdvdWxkIGJlIGEgYmV0dGVyIGNob2ljZS4KLSAgICAgIGJ1ZiA9IG5ldyBCdWZmZXIoYnVmLCBlbmNvZGluZyB8fCAnYXNjaWknKTsKLSAgICB9Ci0gICAgaWYgKHRoaXMub3V0Q291bnQgKyBidWYubGVuZ3RoID4gdGhpcy53cml0ZUJ1ZmZlclNpemUpIHsKLSAgICAgIHRoaXMuZmx1c2goKTsKLSAgICB9Ci0KLSAgICB0aGlzLm91dEJ1ZmZlcnMucHVzaChidWYpOwotICAgIHRoaXMub3V0Q291bnQgKz0gYnVmLmxlbmd0aDsKLQotICAgIGlmICh0aGlzLm91dENvdW50ID49IHRoaXMud3JpdGVCdWZmZXJTaXplKSB7Ci0gICAgICB0aGlzLmZsdXNoKCk7Ci0gICAgfQotICB9LAotCi0gIGZsdXNoOiBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5vdXRDb3VudCA8IDEpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgdmFyIG1zZyA9IG5ldyBCdWZmZXIodGhpcy5vdXRDb3VudCksCi0gICAgICAgIHBvcyA9IDA7Ci0gICAgdGhpcy5vdXRCdWZmZXJzLmZvckVhY2goZnVuY3Rpb24oYnVmKSB7Ci0gICAgICBidWYuY29weShtc2csIHBvcywgMCk7Ci0gICAgICBwb3MgKz0gYnVmLmxlbmd0aDsKLSAgICB9KTsKLSAgICAKLSAgICBpZiAodGhpcy5vbkZsdXNoKSB7Ci0gICAgICB0aGlzLm9uRmx1c2gobXNnKTsKLSAgICB9Ci0KLSAgICB0aGlzLm91dEJ1ZmZlcnMgPSBbXTsKLSAgICB0aGlzLm91dENvdW50ID0gMDsKLSAgfQotfTsKK21vZHVsZS5leHBvcnRzLlRCdWZmZXJlZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vYnVmZmVyZWRfdHJhbnNwb3J0Jyk7Cittb2R1bGUuZXhwb3J0cy5URnJhbWVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9mcmFtZWRfdHJhbnNwb3J0Jyk7Cittb2R1bGUuZXhwb3J0cy5JbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dlYl9zZXJ2ZXIuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvd2ViX3NlcnZlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzNmNDdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dlYl9zZXJ2ZXIuanMKQEAgLTAsMCArMSw1NjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3ZhciBodHRwID0gcmVxdWlyZSgnaHR0cCcpOwordmFyIGh0dHBzID0gcmVxdWlyZSgnaHR0cHMnKTsKK3ZhciB1cmwgPSByZXF1aXJlKCJ1cmwiKTsKK3ZhciBwYXRoID0gcmVxdWlyZSgicGF0aCIpOwordmFyIGZzID0gcmVxdWlyZSgiZnMiKTsKK3ZhciBjcnlwdG8gPSByZXF1aXJlKCJjcnlwdG8iKTsKK3ZhciBsb2cgPSByZXF1aXJlKCcuL2xvZycpOworCit2YXIgTXVsdGlwbGV4ZWRQcm9jZXNzb3IgPSByZXF1aXJlKCcuL211bHRpcGxleGVkX3Byb2Nlc3NvcicpLk11bHRpcGxleGVkUHJvY2Vzc29yOworCit2YXIgVEJ1ZmZlcmVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9idWZmZXJlZF90cmFuc3BvcnQnKTsKK3ZhciBUQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL2JpbmFyeV9wcm90b2NvbCcpOwordmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CisKKy8vIFdTRnJhbWUgY29uc3RydWN0b3IgYW5kIHByb3RvdHlwZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKiBBcGFjaGUgVGhyaWZ0IFJQQyBXZWIgU29ja2V0IFRyYW5zcG9ydAorICogIEZyYW1lIGxheW91dCBjb25mb3JtaW5nIHRvIFJGQyA2NDU1IGNpcmNhIDEyLzIwMTEKKyAqCisgKiBUaGVvcmV0aWNhbCBmcmFtZSBzaXplIGxpbWl0IGlzIDRHQio0R0IsIGhvd2V2ZXIgdGhlIE5vZGUgQnVmZmVyCisgKiBsaW1pdCBpcyAxR0IgYXMgb2YgdjAuMTAuIFRoZSBmcmFtZSBsZW5ndGggZW5jb2RpbmcgaXMgYWxzbworICogY29uZmlndXJlZCBmb3IgYSBtYXggb2YgNEdCIHByZXNlbnRseSBhbmQgbmVlZHMgdG8gYmUgYWRqdXN0ZWQKKyAqIGlmIE5vZGUvQnJvd3NlcnMgYmVjb21lIGNhcGFiaWxlIG9mID4gNEdCIGZyYW1lcy4KKyAqCisgKiAgLSBGSU4gaXMgMSBpZiB0aGUgbWVzc2FnZSBpcyBjb21wbGV0ZQorICogIC0gUlNWMS8yLzMgYXJlIGFsd2F5cyAwCisgKiAgLSBPcGNvZGUgaXMgMShURVhUKSBmb3IgVEpTT05Qcm90b2NvbCBhbmQgMihCSU4pIGZvciBUQmluYXJ5UHJvdG9jb2wKKyAqICAtIE1hc2sgUHJlc2VudCBiaXQgaXMgMSBzZW5kaW5nIHRvLXNlcnZlciBhbmQgMCBzZW5kaW5nIHRvLWNsaWVudAorICogIC0gUGF5bG9hZCBMZW46CisgKiAgICAgICAgKyBJZiA8IDEyNjogdGhlbiByZXByZXNlbnRlZCBkaXJlY3RseQorICogICAgICAgICsgSWYgPj0xMjY6IGJ1dCB3aXRoaW4gcmFuZ2Ugb2YgYW4gdW5zaWduZWQgMTYgYml0IGludGVnZXIKKyAqICAgICAgICAgICAgIHRoZW4gUGF5bG9hZCBMZW4gaXMgMTI2IGFuZCB0aGUgdHdvIGZvbGxvd2luZyBieXRlcyBzdG9yZQorICogICAgICAgICAgICAgdGhlIGxlbmd0aAorICogICAgICAgICsgRWxzZTogUGF5bG9hZCBMZW4gaXMgMTI3IGFuZCB0aGUgZm9sbG93aW5nIDggYnl0ZXMgc3RvcmUgdGhlCisgKiAgICAgICAgICAgICBsZW5ndGggYXMgYW4gdW5zaWduZWQgNjQgYml0IGludGVnZXIKKyAqICAtIE1hc2tpbmcga2V5IGlzIGEgMzIgYml0IGtleSBvbmx5IHByZXNlbnQgd2hlbiBzZW5kaW5nIHRvIHRoZSBzZXJ2ZXIKKyAqICAtIFBheWxvYWQgZm9sbG93cyB0aGUgbWFza2luZyBrZXkgb3IgbGVuZ3RoCisgKgorICogICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAqICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAqICAgICstKy0rLSstKy0tLS0tLS0rLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiAgICB8RnxSfFJ8Unwgb3Bjb2RlfE18IFBheWxvYWQgbGVuIHwgICAgRXh0ZW5kZWQgcGF5bG9hZCBsZW5ndGggICAgfAorICogICAgfEl8U3xTfFN8ICAoNCkgIHxBfCAgICAgKDcpICAgICB8ICAgICAgICAgICAgICgxNi82NCkgICAgICAgICAgIHwKKyAqICAgIHxOfFZ8VnxWfCAgICAgICB8U3wgICAgICAgICAgICAgfCAgIChpZiBwYXlsb2FkIGxlbj09MTI2LzEyNykgICB8CisgKiAgICB8IHwxfDJ8M3wgICAgICAgfEt8ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgKy0rLSstKy0rLS0tLS0tLSstKy0tLS0tLS0tLS0tLS0rIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICsKKyAqICAgIHwgICAgIEV4dGVuZGVkIHBheWxvYWQgbGVuZ3RoIGNvbnRpbnVlZCwgaWYgcGF5bG9hZCBsZW4gPT0gMTI3ICB8CisgKiAgICArIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8TWFza2luZy1rZXksIGlmIE1BU0sgc2V0IHRvIDEgIHwKKyAqICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiAgICB8IE1hc2tpbmcta2V5IChjb250aW51ZWQpICAgICAgIHwgICAgICAgICAgUGF5bG9hZCBEYXRhICAgICAgICAgfAorICogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICsKKyAqICAgIDogICAgICAgICAgICAgICAgICAgICBQYXlsb2FkIERhdGEgY29udGludWVkIC4uLiAgICAgICAgICAgICAgICA6CisgKiAgICArIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKworICogICAgfCAgICAgICAgICAgICAgICAgICAgIFBheWxvYWQgRGF0YSBjb250aW51ZWQgLi4uICAgICAgICAgICAgICAgIHwKKyAqICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKi8KK3ZhciB3c0ZyYW1lID0geworICAvKiogRW5jb2RlcyBhIFdlYlNvY2tldCBmcmFtZQorICAgKgorICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIFRoZSByYXcgZGF0YSB0byBlbmNvZGUKKyAgICogQHBhcmFtIHtCdWZmZXJ9IG1hc2sgLSBUaGUgbWFzayB0byBhcHBseSB3aGVuIHNlbmRpbmcgdG8gc2VydmVyLCBudWxsIGZvciBubyBtYXNrCisgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYmluRW5jb2RpbmcgLSBUcnVlIGZvciBiaW5hcnkgZW5jb2RpbmcsIGZhbHNlIGZvciB0ZXh0IGVuY29kaW5nCisgICAqIEByZXR1cm5zIHtCdWZmZXJ9IC0gVGhlIFdlYlNvY2tldCBmcmFtZSwgcmVhZHkgdG8gc2VuZAorICAgKi8KKyAgZW5jb2RlOiBmdW5jdGlvbihkYXRhLCBtYXNrLCBiaW5FbmNvZGluZykgeworICAgICAgdmFyIGZyYW1lID0gbmV3IEJ1ZmZlcih3c0ZyYW1lLmZyYW1lU2l6ZUZyb21EYXRhKGRhdGEsIG1hc2spKTsKKyAgICAgIC8vQnl0ZSAwIC0gRklOICYgT1BDT0RFCisgICAgICBmcmFtZVswXSA9IHdzRnJhbWUuZmluLkZJTiArCisgICAgICAgICAgKGJpbkVuY29kaW5nID8gd3NGcmFtZS5mcmFtZU9wQ29kZXMuQklOIDogd3NGcmFtZS5mcmFtZU9wQ29kZXMuVEVYVCk7CisgICAgICAvL0J5dGUgMSBvciAxLTMgb3IgMS05IC0gTUFTSyBGTEFHICYgU0laRQorICAgICAgdmFyIHBheWxvYWRPZmZzZXQgPSAyOworICAgICAgaWYgKGRhdGEubGVuZ3RoIDwgMHg3RSkgeworICAgICAgICBmcmFtZVsxXSA9IGRhdGEubGVuZ3RoICsgKG1hc2sgPyB3c0ZyYW1lLm1hc2suVE9fU0VSVkVSIDogd3NGcmFtZS5tYXNrLlRPX0NMSUVOVCk7CisgICAgICB9IGVsc2UgaWYgKGRhdGEubGVuZ3RoIDwgMHhGRkZGKSB7CisgICAgICAgIGZyYW1lWzFdID0gMHg3RSArIChtYXNrID8gd3NGcmFtZS5tYXNrLlRPX1NFUlZFUiA6IHdzRnJhbWUubWFzay5UT19DTElFTlQpOworICAgICAgICBmcmFtZS53cml0ZVVJbnQxNkJFKGRhdGEubGVuZ3RoLCAyLCB0cnVlKTsKKyAgICAgICAgcGF5bG9hZE9mZnNldCA9IDQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBmcmFtZVsxXSA9IDB4N0YgKyAobWFzayA/IHdzRnJhbWUubWFzay5UT19TRVJWRVIgOiB3c0ZyYW1lLm1hc2suVE9fQ0xJRU5UKTsKKyAgICAgICAgZnJhbWUud3JpdGVVSW50MzJCRSgwLCAyLCB0cnVlKTsKKyAgICAgICAgZnJhbWUud3JpdGVVSW50MzJCRShkYXRhLmxlbmd0aCwgNiwgdHJ1ZSk7CisgICAgICAgIHBheWxvYWRPZmZzZXQgPSAxMDsKKyAgICAgIH0KKyAgICAgIC8vTUFTSworICAgICAgaWYgKG1hc2spIHsKKyAgICAgICAgbWFzay5jb3B5KGZyYW1lLCBwYXlsb2FkT2Zmc2V0LCAwLCA0KTsKKyAgICAgICAgcGF5bG9hZE9mZnNldCArPSA0OworICAgICAgfQorICAgICAgLy9QYXlsb2FkCisgICAgICBkYXRhLmNvcHkoZnJhbWUsIHBheWxvYWRPZmZzZXQpOworICAgICAgaWYgKG1hc2spIHsKKyAgICAgICAgd3NGcmFtZS5hcHBseU1hc2soZnJhbWUuc2xpY2UocGF5bG9hZE9mZnNldCksIGZyYW1lLnNsaWNlKHBheWxvYWRPZmZzZXQtNCxwYXlsb2FkT2Zmc2V0KSk7CisgICAgICB9CisgICAgICByZXR1cm4gZnJhbWU7CisgIH0sCisKKyAgLyoqCisgICAqIEBjbGFzcworICAgKiBAbmFtZSBXU0RlY29kZVJlc3VsdAorICAgKiBAcHJvcGVydHkge0J1ZmZlcn0gZGF0YSAtIFRoZSBkZWNvZGVkIGRhdGEgZm9yIHRoZSBmaXJzdCBBVFJQQyBtZXNzYWdlCisgICAqIEBwcm9wZXJ0eSB7QnVmZmVyfSBtYXNrIC0gVGhlIGZyYW1lIG1hc2sKKyAgICogQHByb3BlcnR5IHtCb29sZWFufSBiaW5FbmNvZGluZyAtIFRydWUgaWYgYmluYXJ5IChUQmluYXJ5UHJvdG9jb2wpLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UgaWYgdGV4dCAoVEpTT05Qcm90b2NvbCkKKyAgICogQHByb3BlcnR5IHtCdWZmZXJ9IG5leHRGcmFtZSAtIE11bHRpcGxlIEFUUlBDIG1lc3NhZ2VzIG1heSBiZSBzZW50IGluIGEKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZSBXZWJTb2NrZXQgZnJhbWUsIHRoaXMgQnVmZmVyIGNvbnRhaW5zCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkgYnl0ZXMgcmVtYWluaW5nIHRvIGJlIGRlY29kZWQKKyAgICogQHByb3BlcnR5IHtCb29sZWFufSBGSU4gLSBUcnVlIGlzIHRoZSBtZXNzYWdlIGlzIGNvbXBsZXRlCisgICAqLworCisgICAvKiogRGVjb2RlcyBhIFdlYlNvY2tldCBmcmFtZQorICAgKgorICAgKiBAcGFyYW0ge0J1ZmZlcn0gZnJhbWUgLSBUaGUgcmF3IGluYm91bmQgZnJhbWUsIGlmIHRoaXMgaXMgYSBjb250aW51YXRpb24KKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgaXQgbXVzdCBoYXZlIGEgbWFzayBwcm9wZXJ0eSB3aXRoIHRoZSBtYXNrLgorICAgKiBAcmV0dXJucyB7V1NEZWNvZGVSZXN1bHR9IC0gVGhlIGRlY29kZWQgcGF5bG9hZAorICAgKgorICAgKiBAc2VlIHtAbGluayBXU0RlY29kZVJlc3VsdH0KKyAgICovCisgIGRlY29kZTogZnVuY3Rpb24oZnJhbWUpIHsKKyAgICAgIHZhciByZXN1bHQgPSB7CisgICAgICAgIGRhdGE6IG51bGwsCisgICAgICAgIG1hc2s6IG51bGwsCisgICAgICAgIGJpbkVuY29kaW5nOiBmYWxzZSwKKyAgICAgICAgbmV4dEZyYW1lOiBudWxsLAorICAgICAgICBGSU46IHRydWUKKyAgICAgIH07CisKKyAgICAgIC8vQnl0ZSAwIC0gRklOICYgT1BDT0RFCisgICAgICBpZiAod3NGcmFtZS5maW4uRklOICE9IChmcmFtZVswXSAmIHdzRnJhbWUuZmluLkZJTikpIHsKKyAgICAgICAgcmVzdWx0LkZJTiA9IGZhbHNlOworICAgICAgfQorICAgICAgcmVzdWx0LmJpbkVuY29kaW5nID0gKHdzRnJhbWUuZnJhbWVPcENvZGVzLkJJTiA9PSAoZnJhbWVbMF0gJiB3c0ZyYW1lLmZyYW1lT3BDb2Rlcy5CSU4pKTsKKyAgICAgIC8vQnl0ZSAxIG9yIDEtMyBvciAxLTkgLSBTSVpFCisgICAgICB2YXIgbGVuQnl0ZSA9IChmcmFtZVsxXSAmIDB4MDAwMDAwN0YpOworICAgICAgdmFyIGxlbiA9IGxlbkJ5dGU7CisgICAgICB2YXIgZGF0YU9mZnNldCA9IDI7CisgICAgICBpZiAobGVuQnl0ZSA9PSAweDdFKSB7CisgICAgICAgIGxlbiA9IGZyYW1lLnJlYWRVSW50MTZCRSgyKTsKKyAgICAgICAgZGF0YU9mZnNldCA9IDQ7CisgICAgICB9IGVsc2UgaWYgKGxlbkJ5dGUgPT0gMHg3RikgeworICAgICAgICBsZW4gPSBmcmFtZS5yZWFkVUludDMyQkUoNik7CisgICAgICAgIGRhdGFPZmZzZXQgPSAxMDsKKyAgICAgIH0KKyAgICAgIC8vTUFTSworICAgICAgaWYgKHdzRnJhbWUubWFzay5UT19TRVJWRVIgPT0gKGZyYW1lWzFdICYgd3NGcmFtZS5tYXNrLlRPX1NFUlZFUikpIHsKKyAgICAgICAgcmVzdWx0Lm1hc2sgPSBuZXcgQnVmZmVyKDQpOworICAgICAgICBmcmFtZS5jb3B5KHJlc3VsdC5tYXNrLCAwLCBkYXRhT2Zmc2V0LCBkYXRhT2Zmc2V0ICsgNCk7CisgICAgICAgIGRhdGFPZmZzZXQgKz0gNDsKKyAgICAgIH0KKyAgICAgIC8vUGF5bG9hZAorICAgICAgcmVzdWx0LmRhdGEgPSBuZXcgQnVmZmVyKGxlbik7CisgICAgICBmcmFtZS5jb3B5KHJlc3VsdC5kYXRhLCAwLCBkYXRhT2Zmc2V0LCBkYXRhT2Zmc2V0K2xlbik7CisgICAgICBpZiAocmVzdWx0Lm1hc2spIHsKKyAgICAgICAgd3NGcmFtZS5hcHBseU1hc2socmVzdWx0LmRhdGEsIHJlc3VsdC5tYXNrKTsKKyAgICAgIH0KKyAgICAgIC8vTmV4dCBGcmFtZQorICAgICAgaWYgKGZyYW1lLmxlbmd0aCA+IGRhdGFPZmZzZXQrbGVuKSB7CisgICAgICAgIHJlc3VsdC5uZXh0RnJhbWUgPSBuZXcgQnVmZmVyKGZyYW1lLmxlbmd0aCAtIChkYXRhT2Zmc2V0K2xlbikpOworICAgICAgICBmcmFtZS5jb3B5KHJlc3VsdC5uZXh0RnJhbWUsIDAsIGRhdGFPZmZzZXQrbGVuLCBmcmFtZS5sZW5ndGgpOworICAgICAgfQorICAgICAgLy9Eb24ndCBmb3J3YXJkIGNvbnRyb2wgZnJhbWVzCisgICAgICBpZiAoZnJhbWVbMF0gJiB3c0ZyYW1lLmZyYW1lT3BDb2Rlcy5GSU5DVFJMKSB7CisgICAgICAgIHJlc3VsdC5kYXRhID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgfSwKKworICAvKiogTWFza3MvVW5tYXNrcyBkYXRhCisgICAqCisgICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIC0gZGF0YSB0byBtYXNrL3VubWFzayBpbiBwbGFjZQorICAgKiBAcGFyYW0ge0J1ZmZlcn0gbWFzayAtIHRoZSBtYXNrCisgICAqLworICBhcHBseU1hc2s6IGZ1bmN0aW9uKGRhdGEsIG1hc2speworICAgIC8vVE9ETzogbG9vayBpbnRvIHhvcmluZyB3b3JkcyBhdCBhIHRpbWUKKyAgICB2YXIgZGF0YUxlbiA9IGRhdGEubGVuZ3RoOworICAgIHZhciBtYXNrTGVuID0gbWFzay5sZW5ndGg7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhTGVuOyBpKyspIHsKKyAgICAgIGRhdGFbaV0gPSBkYXRhW2ldIF4gbWFza1tpJW1hc2tMZW5dOworICAgIH0KKyAgfSwKKworICAvKiogQ29tcHV0ZXMgZnJhbWUgc2l6ZSBvbiB0aGUgd2lyZSBmcm9tIGRhdGEgdG8gYmUgc2VudAorICAgKgorICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIGRhdGEubGVuZ3RoIGlzIHRoZSBhc3N1bWVkIHBheWxvYWQgc2l6ZQorICAgKiBAcGFyYW0ge0Jvb2xlYW59IG1hc2sgLSB0cnVlIGlmIGEgbWFzayB3aWxsIGJlIHNlbnQgKFRPX1NFUlZFUikKKyAgICovCisgIGZyYW1lU2l6ZUZyb21EYXRhOiBmdW5jdGlvbihkYXRhLCBtYXNrKSB7CisgICAgdmFyIGhlYWRlclNpemUgPSAxMDsKKyAgICBpZiAoZGF0YS5sZW5ndGggPCAweDdFKSB7CisgICAgICBoZWFkZXJTaXplID0gMjsKKyAgICB9IGVsc2UgaWYgKGRhdGEubGVuZ3RoIDwgMHhGRkZGKSB7CisgICAgICBoZWFkZXJTaXplID0gNDsKKyAgICB9CisgICAgcmV0dXJuIGhlYWRlclNpemUgKyBkYXRhLmxlbmd0aCArIChtYXNrID8gNCA6IDApOworICB9LAorCisgIGZyYW1lT3BDb2RlczogeworICAgIENPTlQ6ICAgICAweDAwLAorICAgIFRFWFQ6ICAgICAweDAxLAorICAgIEJJTjogICAgICAweDAyLAorICAgIENUUkw6ICAgICAweDgwCisgIH0sCisKKyAgbWFzazogeworICAgIFRPX1NFUlZFUjogMHg4MCwKKyAgICBUT19DTElFTlQ6IDB4MDAKKyAgfSwKKworICBmaW46IHsKKyAgICBDT05UOiAweDAwLAorICAgIEZJTjogMHg4MAorICB9Cit9OworCisKKy8vIGNyZWF0ZVdlYlNlcnZlciBjb25zdHJ1Y3RvciBhbmQgb3B0aW9ucworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogQGNsYXNzCisgKiBAbmFtZSBTZXJ2ZXJPcHRpb25zCisgKiBAcHJvcGVydHkge2FycmF5fSBjb3JzIC0gQXJyYXkgb2YgQ09SUyBvcmlnaW4gc3RyaW5ncyB0byBwZXJtaXQgcmVxdWVzdHMgZnJvbS4KKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWxlcyAtIFBhdGggdG8gc2VydmUgc3RhdGljIGZpbGVzIGZyb20sIGlmIGFic2VudCBvciAiIgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGZpbGUgc2VydmljZSBpcyBkaXNhYmxlZC4KKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBoZWFkZXJzIC0gQW4gb2JqZWN0IGhhc2ggbWFwcGluZyBoZWFkZXIgc3RyaW5ncyB0byBoZWFkZXIgdmFsdWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5ncywgdGhlc2UgaGVhZGVycyBhcmUgdHJhbnNtaXR0ZWQgaW4gcmVzcG9uc2UgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGZpbGUgR0VUIG9wZXJhdGlvbnMuCisgKiBAcHJvcGVydHkge29iamVjdH0gc2VydmljZXMgLSBBbiBvYmplY3QgaGFzaCBtYXBwaW5nIHNlcnZpY2UgVVJJIHN0cmluZ3MKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFNlcnZpY2VPcHRpb25zIG9iamVjdHMKKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSB0bHMgLSBOb2RlLmpzIFRMUyBvcHRpb25zIChzZWU6IG5vZGVqcy5vcmcvYXBpL3Rscy5odG1sKSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgcHJlc2VudCBvciBudWxsIHJlZ3VsYXIgaHR0cCBpcyB1c2VkLAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGF0IGxlYXN0IGEga2V5IGFuZCBhIGNlcnQgbXVzdCBiZSBkZWZpbmVkIHRvIHVzZSBTU0wvVExTCisgKiBAc2VlIHtAbGluayBTZXJ2aWNlT3B0aW9uc30KKyAqLworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgU2VydmljZU9wdGlvbnMKKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSB0cmFuc3BvcnQgLSBUaGUgbGF5ZXJlZCB0cmFuc3BvcnQgdG8gdXNlIChkZWZhdWx0cworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRCdWZmZXJlZFRyYW5zcG9ydCkuCisgKiBAcHJvcGVydHkge29iamVjdH0gcHJvdG9jb2wgLSBUaGUgc2VyaWFsaXphdGlvbiBQcm90b2NvbCB0byB1c2UgKGRlZmF1bHRzIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQmluYXJ5UHJvdG9jb2wpLgorICogQHByb3BlcnR5IHtvYmplY3R9IHByb2Nlc3NvciAtIFRoZSBUaHJpZnQgU2VydmljZSBjbGFzcy9wcm9jZXNzb3IgZ2VuZXJhdGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIElETCBDb21waWxlciBmb3IgdGhlIHNlcnZpY2UgKHRoZSAiY2xzIgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSBjYW4gYWxzbyBiZSB1c2VkIGZvciB0aGlzIGF0dHJpYnV0ZSkuCisgKiBAcHJvcGVydHkge29iamVjdH0gaGFuZGxlciAtIFRoZSBoYW5kbGVyIG1ldGhvZHMgZm9yIHRoZSBUaHJpZnQgU2VydmljZS4KKyAqLworCisvKioKKyAqIENyZWF0ZSBhIFRocmlmdCBzZXJ2ZXIgd2hpY2ggY2FuIHNlcnZlIHN0YXRpYyBmaWxlcyBhbmQvb3Igb25lIG9yCisgKiBtb3JlIFRocmlmdCBTZXJ2aWNlcy4KKyAqIEBwYXJhbSB7U2VydmVyT3B0aW9uc30gb3B0aW9ucyAtIFRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KKyAqIEByZXR1cm5zIHtvYmplY3R9IC0gVGhlIEFwYWNoZSBUaHJpZnQgV2ViIFNlcnZlci4KKyAqLworZXhwb3J0cy5jcmVhdGVXZWJTZXJ2ZXIgPSBmdW5jdGlvbihvcHRpb25zKSB7CisgIHZhciBiYXNlRGlyID0gb3B0aW9ucy5maWxlczsKKyAgdmFyIGNvbnRlbnRUeXBlc0J5RXh0ZW5zaW9uID0geworICAgICcudHh0JzogJ3RleHQvcGxhaW4nLAorICAgICcuaHRtbCc6ICd0ZXh0L2h0bWwnLAorICAgICcuY3NzJzogJ3RleHQvY3NzJywKKyAgICAnLnhtbCc6ICdhcHBsaWNhdGlvbi94bWwnLAorICAgICcuanNvbic6ICdhcHBsaWNhdGlvbi9qc29uJywKKyAgICAnLmpzJzogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnLAorICAgICcuanBnJzogJ2ltYWdlL2pwZWcnLAorICAgICcuanBlZyc6ICdpbWFnZS9qcGVnJywKKyAgICAnLmdpZic6ICdpbWFnZS9naWYnLAorICAgICcucG5nJzogJ2ltYWdlL3BuZycsCisgICAgJy5zdmcnOiAnaW1hZ2Uvc3ZnK3htbCcKKyAgfTsKKworICAvL1NldHVwIGFsbCBvZiB0aGUgc2VydmljZXMKKyAgdmFyIHNlcnZpY2VzID0gb3B0aW9ucy5zZXJ2aWNlczsKKyAgZm9yICh2YXIgdXJpIGluIHNlcnZpY2VzKSB7CisgICAgdmFyIHN2Y09iaiA9IHNlcnZpY2VzW3VyaV07CisKKyAgICAvL1NldHVwIHRoZSBwcm9jZXNzb3IKKyAgICBpZiAoc3ZjT2JqLnByb2Nlc3NvciBpbnN0YW5jZW9mIE11bHRpcGxleGVkUHJvY2Vzc29yKSB7CisgICAgICAvL011bHRpcGxleCBwcm9jZXNzb3JzIGhhdmUgcHJlIGVtYmVkZGVkIHByb2Nlc3Nvci9oYW5kbGVyIHBhaXJzLCBzYXZlIGFzIGlzCisgICAgICBzdmNPYmoucHJvY2Vzc29yID0gc3ZjT2JqLnByb2Nlc3NvcjsKKyAgICB9IGVsc2UgeworICAgICAgLy9Gb3IgaGlzdG9yaWNhbCByZWFzb25zIE5vZGUuanMgc3VwcG9ydHMgcHJvY2Vzc29ycyBwYXNzZWQgaW4gZGlyZWN0bHkgb3IgdmlhIHRoZQorICAgICAgLy8gIElETCBDb21waWxlciBnZW5lcmF0ZWQgY2xhc3MgaG91c2luZyB0aGUgcHJvY2Vzc29yLiBBbHNvLCB0aGUgb3B0aW9ucyBwcm9wZXJ0eQorICAgICAgLy8gIGZvciBhIFByb2Nlc3NvciBoYXMgYmVlbiBjYWxsZWQgYm90aCBjbHMgYW5kIHByb2Nlc3NvciBhdCBkaWZmZXJlbnQgdGltZXMuIFdlCisgICAgICAvLyAgc3VwcG9ydCBhbnkgb2YgdGhlIGZvdXIgcG9zc2liaWxpdGllcyBoZXJlLgorICAgICAgdmFyIHByb2Nlc3NvciA9IChzdmNPYmoucHJvY2Vzc29yKSA/IChzdmNPYmoucHJvY2Vzc29yLlByb2Nlc3NvciB8fCBzdmNPYmoucHJvY2Vzc29yKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN2Y09iai5jbHMuUHJvY2Vzc29yIHx8IHN2Y09iai5jbHMpOworICAgICAgLy9Qcm9jZXNzb3JzIGNhbiBiZSBzdXBwbGllZCBhcyBjb25zdHJ1Y3RlZCBvYmplY3RzIHdpdGggaGFuZGxlcnMgYWxyZWFkeSBlbWJlZGRlZCwKKyAgICAgIC8vICBpZiBhIGhhbmRsZXIgaXMgcHJvdmlkZWQgd2UgY29uc3RydWN0IGEgbmV3IHByb2Nlc3NvciwgaWYgbm90IHdlIHVzZSB0aGUgcHJvY2Vzc29yCisgICAgICAvLyAgb2JqZWN0IGRpcmVjdGx5CisgICAgICBpZiAoc3ZjT2JqLmhhbmRsZXIpIHsKKyAgICAgICAgc3ZjT2JqLnByb2Nlc3NvciA9IG5ldyBwcm9jZXNzb3Ioc3ZjT2JqLmhhbmRsZXIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3ZjT2JqLnByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgICAgIH0KKyAgICB9CisgICAgc3ZjT2JqLnRyYW5zcG9ydCA9IHN2Y09iai50cmFuc3BvcnQgPyBzdmNPYmoudHJhbnNwb3J0IDogVEJ1ZmZlcmVkVHJhbnNwb3J0OworICAgIHN2Y09iai5wcm90b2NvbCA9IHN2Y09iai5wcm90b2NvbCA/IHN2Y09iai5wcm90b2NvbCA6IFRCaW5hcnlQcm90b2NvbDsKKyAgfQorCisgIC8vVmVyaWZ5IENPUlMgcmVxdWlyZW1lbnRzCisgIGZ1bmN0aW9uIFZlcmlmeUNPUlNBbmRTZXRIZWFkZXJzKHJlcXVlc3QsIHJlc3BvbnNlKSB7CisgICAgaWYgKHJlcXVlc3QuaGVhZGVycy5vcmlnaW4gJiYgb3B0aW9ucy5jb3JzKSB7CisgICAgICBpZiAob3B0aW9ucy5jb3JzWyIqIl0gfHwgb3B0aW9ucy5jb3JzW3JlcXVlc3QuaGVhZGVycy5vcmlnaW5dKSB7CisgICAgICAgIC8vQWxsb3csIG9yaWdpbiBhbGxvd2VkCisgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiYWNjZXNzLWNvbnRyb2wtYWxsb3ctb3JpZ2luIiwgcmVxdWVzdC5oZWFkZXJzLm9yaWdpbik7CisgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiYWNjZXNzLWNvbnRyb2wtYWxsb3ctbWV0aG9kcyIsICJHRVQsIFBPU1QsIE9QVElPTlMiKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJhY2Nlc3MtY29udHJvbC1hbGxvdy1oZWFkZXJzIiwgImNvbnRlbnQtdHlwZSwgYWNjZXB0Iik7CisgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiYWNjZXNzLWNvbnRyb2wtbWF4LWFnZSIsICI2MCIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vRGlzYWxsb3csIG9yaWdpbiBkZW5pZWQKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICAvL0FsbG93LCBDT1JTIGlzIG5vdCBpbiB1c2UKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisKKyAgLy9IYW5kbGUgT1BUSU9OUyBtZXRob2QgKENPUlMpCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICBmdW5jdGlvbiBwcm9jZXNzT3B0aW9ucyhyZXF1ZXN0LCByZXNwb25zZSkgeworICAgIGlmIChWZXJpZnlDT1JTQW5kU2V0SGVhZGVycyhyZXF1ZXN0LCByZXNwb25zZSkpIHsKKyAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCgiMjA0IiwgIk5vIENvbnRlbnQiLCB7ImNvbnRlbnQtbGVuZ3RoIjogMH0pOworICAgIH0gZWxzZSB7CisgICAgICByZXNwb25zZS53cml0ZUhlYWQoIjQwMyIsICJPcmlnaW4gIiArIHJlcXVlc3QuaGVhZGVycy5vcmlnaW4gKyAiIG5vdCBhbGxvd2VkIiwge30pOworICAgIH0KKyAgICByZXNwb25zZS5lbmQoKTsKKyAgfQorCisKKyAgLy9IYW5kbGUgUE9TVCBtZXRob2RzIChUWEhSVHJhbnNwb3J0KQorICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgZnVuY3Rpb24gcHJvY2Vzc1Bvc3QocmVxdWVzdCwgcmVzcG9uc2UpIHsKKyAgICAvL0xvb2t1cCBzZXJ2aWNlCisgICAgdmFyIHVyaSA9IHVybC5wYXJzZShyZXF1ZXN0LnVybCkucGF0aG5hbWU7CisgICAgdmFyIHN2YyA9IHNlcnZpY2VzW3VyaV07CisgICAgaWYgKCFzdmMpIHsKKyAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCgiNDAzIiwgIk5vIEFwYWNoZSBUaHJpZnQgU2VydmljZSBhdCAiICsgdXJpLCB7fSk7CisgICAgICByZXNwb25zZS5lbmQoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvL1ZlcmlmeSBDT1JTIHJlcXVpcmVtZW50cworICAgIGlmICghVmVyaWZ5Q09SU0FuZFNldEhlYWRlcnMocmVxdWVzdCwgcmVzcG9uc2UpKSB7CisgICAgICByZXNwb25zZS53cml0ZUhlYWQoIjQwMyIsICJPcmlnaW4gIiArIHJlcXVlc3QuaGVhZGVycy5vcmlnaW4gKyAiIG5vdCBhbGxvd2VkIiwge30pOworICAgICAgcmVzcG9uc2UuZW5kKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9Qcm9jZXNzIFhIUiBwYXlsb2FkCisgICAgcmVxdWVzdC5vbignZGF0YScsIHN2Yy50cmFuc3BvcnQucmVjZWl2ZXIoZnVuY3Rpb24odHJhbnNwb3J0V2l0aERhdGEpIHsKKyAgICAgIHZhciBpbnB1dCA9IG5ldyBzdmMucHJvdG9jb2wodHJhbnNwb3J0V2l0aERhdGEpOworICAgICAgdmFyIG91dHB1dCA9IG5ldyBzdmMucHJvdG9jb2wobmV3IHN2Yy50cmFuc3BvcnQodW5kZWZpbmVkLCBmdW5jdGlvbihidWYpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICByZXNwb25zZS53cml0ZUhlYWQoMjAwKTsKKyAgICAgICAgICByZXNwb25zZS5lbmQoYnVmKTsKKyAgICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDUwMCk7CisgICAgICAgICAgcmVzcG9uc2UuZW5kKCk7CisgICAgICAgIH0KKyAgICAgIH0pKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgc3ZjLnByb2Nlc3Nvci5wcm9jZXNzKGlucHV0LCBvdXRwdXQpOworICAgICAgICB0cmFuc3BvcnRXaXRoRGF0YS5jb21taXRQb3NpdGlvbigpOworICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKKyAgICAgICAgICB0cmFuc3BvcnRXaXRoRGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDUwMCk7CisgICAgICAgICAgcmVzcG9uc2UuZW5kKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KSk7CisgIH0KKworCisgIC8vSGFuZGxlIEdFVCBtZXRob2RzIChTdGF0aWMgUGFnZSBTZXJ2ZXIpCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICBmdW5jdGlvbiBwcm9jZXNzR2V0KHJlcXVlc3QsIHJlc3BvbnNlKSB7CisgICAgLy9VbmRlZmluZWQgb3IgZW1wdHkgYmFzZSBkaXJlY3RvcnkgbWVhbnMgZG8gbm90IHNlcnZlIHN0YXRpYyBmaWxlcworICAgIGlmICghYmFzZURpciB8fCAiIiA9PT0gYmFzZURpcikgeworICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDQwNCk7CisgICAgICByZXNwb25zZS5lbmQoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvL1ZlcmlmeSBDT1JTIHJlcXVpcmVtZW50cworICAgIGlmICghVmVyaWZ5Q09SU0FuZFNldEhlYWRlcnMocmVxdWVzdCwgcmVzcG9uc2UpKSB7CisgICAgICByZXNwb25zZS53cml0ZUhlYWQoIjQwMyIsICJPcmlnaW4gIiArIHJlcXVlc3QuaGVhZGVycy5vcmlnaW4gKyAiIG5vdCBhbGxvd2VkIiwge30pOworICAgICAgcmVzcG9uc2UuZW5kKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9Mb2NhdGUgdGhlIGZpbGUgcmVxdWVzdGVkIGFuZCBzZW5kIGl0CisgICAgdmFyIHVyaSA9IHVybC5wYXJzZShyZXF1ZXN0LnVybCkucGF0aG5hbWU7CisgICAgdmFyIGZpbGVuYW1lID0gcGF0aC5yZXNvbHZlKHBhdGguam9pbihiYXNlRGlyLCB1cmkpKTsKKworICAgIC8vRW5zdXJlIHRoZSBiYXNlZGlyIHBhdGggaXMgbm90IGFibGUgdG8gYmUgZXNjYXBlZAorICAgIGlmIChmaWxlbmFtZS5pbmRleE9mKGJhc2VEaXIpICE9IDApIHsKKyAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg0MDAsICJJbnZhbGlkIHJlcXVlc3QgcGF0aCIsIHt9KTsKKyAgICAgIHJlc3BvbnNlLmVuZCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZzLmV4aXN0cyhmaWxlbmFtZSwgZnVuY3Rpb24oZXhpc3RzKSB7CisgICAgICBpZighZXhpc3RzKSB7CisgICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg0MDQpOworICAgICAgICByZXNwb25zZS5lbmQoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAoZnMuc3RhdFN5bmMoZmlsZW5hbWUpLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgZmlsZW5hbWUgKz0gJy9pbmRleC5odG1sJzsKKyAgICAgIH0KKworICAgICAgZnMucmVhZEZpbGUoZmlsZW5hbWUsICJiaW5hcnkiLCBmdW5jdGlvbihlcnIsIGZpbGUpIHsKKyAgICAgICAgaWYgKGVycikgeworICAgICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg1MDApOworICAgICAgICAgIHJlc3BvbnNlLmVuZChlcnIgKyAiXG4iKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdmFyIGhlYWRlcnMgPSB7fTsKKyAgICAgICAgdmFyIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGVzQnlFeHRlbnNpb25bcGF0aC5leHRuYW1lKGZpbGVuYW1lKV07CisgICAgICAgIGlmIChjb250ZW50VHlwZSkgeworICAgICAgICAgIGhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdID0gY29udGVudFR5cGU7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh2YXIgayBpbiBvcHRpb25zLmhlYWRlcnMpIHsKKyAgICAgICAgICBoZWFkZXJzW2tdID0gb3B0aW9ucy5oZWFkZXJzW2tdOworICAgICAgICB9CisgICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCgyMDAsIGhlYWRlcnMpOworICAgICAgICByZXNwb25zZS53cml0ZShmaWxlLCAiYmluYXJ5Iik7CisgICAgICAgIHJlc3BvbnNlLmVuZCgpOworICAgICAgfSk7CisgICAgfSk7CisgIH0KKworCisgIC8vSGFuZGxlIFdlYlNvY2tldCBjYWxscyAoVFdlYlNvY2tldFRyYW5zcG9ydCkKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIGZ1bmN0aW9uIHByb2Nlc3NXUyhkYXRhLCBzb2NrZXQsIHN2YywgYmluRW5jb2RpbmcpIHsKKyAgICBzdmMudHJhbnNwb3J0LnJlY2VpdmVyKGZ1bmN0aW9uKHRyYW5zcG9ydFdpdGhEYXRhKSB7CisgICAgICB2YXIgaW5wdXQgPSBuZXcgc3ZjLnByb3RvY29sKHRyYW5zcG9ydFdpdGhEYXRhKTsKKyAgICAgIHZhciBvdXRwdXQgPSBuZXcgc3ZjLnByb3RvY29sKG5ldyBzdmMudHJhbnNwb3J0KHVuZGVmaW5lZCwgZnVuY3Rpb24oYnVmKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgdmFyIGZyYW1lID0gd3NGcmFtZS5lbmNvZGUoYnVmLCBudWxsLCBiaW5FbmNvZGluZyk7CisgICAgICAgICAgc29ja2V0LndyaXRlKGZyYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgICAgLy9UT0RPOiBBZGQgYmV0dGVyIGVycm9yIHByb2Nlc3NpbmcKKyAgICAgICAgfQorICAgICAgfSkpOworCisgICAgICB0cnkgeworICAgICAgICBzdmMucHJvY2Vzc29yLnByb2Nlc3MoaW5wdXQsIG91dHB1dCk7CisgICAgICAgIHRyYW5zcG9ydFdpdGhEYXRhLmNvbW1pdFBvc2l0aW9uKCk7CisgICAgICB9CisgICAgICBjYXRjaCAoZXJyKSB7CisgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKKyAgICAgICAgICB0cmFuc3BvcnRXaXRoRGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgLy9UT0RPOiBBZGQgYmV0dGVyIGVycm9yIHByb2Nlc3NpbmcKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pKGRhdGEpOworICB9CisKKyAgLy9DcmVhdGUgdGhlIHNlcnZlciAoSFRUUCBvciBIVFRQUykKKyAgdmFyIHNlcnZlciA9IG51bGw7CisgIGlmIChvcHRpb25zLnRscykgeworICAgIHNlcnZlciA9IGh0dHBzLmNyZWF0ZVNlcnZlcihvcHRpb25zLnRscyk7CisgIH0gZWxzZSB7CisgICAgc2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIoKTsKKyAgfQorCisgIC8vV2lyZSB1cCBsaXN0ZW5lcnMgZm9yIHVwZ3JhZGUodG8gV2ViU29ja2V0KSAmIHJlcXVlc3QgbWV0aG9kcyBmb3I6CisgIC8vICAgLSBHRVQgc3RhdGljIGZpbGVzLAorICAvLyAgIC0gUE9TVCBYSFIgVGhyaWZ0IHNlcnZpY2VzCisgIC8vICAgLSBPUFRJT05TIENPUlMgcmVxdWVzdHMKKyAgc2VydmVyLm9uKCdyZXF1ZXN0JywgZnVuY3Rpb24ocmVxdWVzdCwgcmVzcG9uc2UpIHsKKyAgICBpZiAocmVxdWVzdC5tZXRob2QgPT09ICdQT1NUJykgeworICAgICAgcHJvY2Vzc1Bvc3QocmVxdWVzdCwgcmVzcG9uc2UpOworICAgIH0gZWxzZSBpZiAocmVxdWVzdC5tZXRob2QgPT09ICdHRVQnKSB7CisgICAgICBwcm9jZXNzR2V0KHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICB9IGVsc2UgaWYgKHJlcXVlc3QubWV0aG9kID09PSAnT1BUSU9OUycpIHsKKyAgICAgIHByb2Nlc3NPcHRpb25zKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDUwMCk7CisgICAgICByZXNwb25zZS5lbmQoKTsKKyAgICB9CisgIH0pLm9uKCd1cGdyYWRlJywgZnVuY3Rpb24ocmVxdWVzdCwgc29ja2V0LCBoZWFkKSB7CisgICAgLy9Mb29rdXAgc2VydmljZQorICAgIHZhciBzdmM7CisgICAgdHJ5IHsKKyAgICAgIHN2YyA9IHNlcnZpY2VzW09iamVjdC5rZXlzKHNlcnZpY2VzKVswXV07CisgICAgfSBjYXRjaChlKSB7CisgICAgICBzb2NrZXQud3JpdGUoIkhUVFAvMS4xIDQwMyBObyBBcGFjaGUgVGhyaWZ0IFNlcnZpY2UgYXZhaWxhYmxlXHJcblxyXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy9QZXJmb3JtIHVwZ3JhZGUKKyAgICB2YXIgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCJzaGExIik7CisgICAgaGFzaC51cGRhdGUocmVxdWVzdC5oZWFkZXJzWydzZWMtd2Vic29ja2V0LWtleSddICsgIjI1OEVBRkE1LUU5MTQtNDdEQS05NUNBLUM1QUIwREM4NUIxMSIpOworICAgIHNvY2tldC53cml0ZSgiSFRUUC8xLjEgMTAxIFN3aXRjaGluZyBQcm90b2NvbHNcclxuIiArCisgICAgICAgICAgICAgICAgICAgIlVwZ3JhZGU6IHdlYnNvY2tldFxyXG4iICsKKyAgICAgICAgICAgICAgICAgICAiQ29ubmVjdGlvbjogVXBncmFkZVxyXG4iICsKKyAgICAgICAgICAgICAgICAgICAiU2VjLVdlYlNvY2tldC1BY2NlcHQ6ICIgKyBoYXNoLmRpZ2VzdCgiYmFzZTY0IikgKyAiXHJcbiIgKworICAgICAgICAgICAgICAgICAgICJTZWMtV2ViU29ja2V0LU9yaWdpbjogIiArIHJlcXVlc3QuaGVhZGVycy5vcmlnaW4gKyAiXHJcbiIgKworICAgICAgICAgICAgICAgICAgICJTZWMtV2ViU29ja2V0LUxvY2F0aW9uOiB3czovLyIgKyByZXF1ZXN0LmhlYWRlcnMuaG9zdCArIHJlcXVlc3QudXJsICsgIlxyXG4iICsKKyAgICAgICAgICAgICAgICAgICAiXHJcbiIpOworICAgIC8vSGFuZGxlIFdlYlNvY2tldCB0cmFmZmljCisgICAgdmFyIGRhdGEgPSBudWxsOworICAgIHNvY2tldC5vbignZGF0YScsIGZ1bmN0aW9uKGZyYW1lKSB7CisgICAgICB0cnkgeworICAgICAgICB3aGlsZSAoZnJhbWUpIHsKKyAgICAgICAgICB2YXIgcmVzdWx0ID0gd3NGcmFtZS5kZWNvZGUoZnJhbWUpOworICAgICAgICAgIC8vUHJlcGVuZCBhbnkgZXhpc3RpbmcgZGVjb2RlZCBkYXRhCisgICAgICAgICAgaWYgKGRhdGEpIHsKKyAgICAgICAgICAgIGlmIChyZXN1bHQuZGF0YSkgeworICAgICAgICAgICAgICB2YXIgbmV3RGF0YSA9IG5ldyBCdWZmZXIoZGF0YS5sZW5ndGggKyByZXN1bHQuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICBkYXRhLmNvcHkobmV3RGF0YSk7CisgICAgICAgICAgICAgIHJlc3VsdC5kYXRhLmNvcHkobmV3RGF0YSwgZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICByZXN1bHQuZGF0YSA9IG5ld0RhdGE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByZXN1bHQuZGF0YSA9IGRhdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYXRhID0gbnVsbDsKKyAgICAgICAgICB9CisgICAgICAgICAgLy9JZiB0aGlzIGNvbXBsZXRlcyBhIG1lc3NhZ2UgcHJvY2VzcyBpdAorICAgICAgICAgIGlmIChyZXN1bHQuRklOKSB7CisgICAgICAgICAgICBwcm9jZXNzV1MocmVzdWx0LmRhdGEsIHNvY2tldCwgc3ZjLCByZXN1bHQuYmluRW5jb2RpbmcpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhID0gcmVzdWx0LmRhdGE7CisgICAgICAgICAgfQorICAgICAgICAgIC8vUHJlcGFyZSBuZXh0IGZyYW1lIGZvciBkZWNvZGluZyAoaWYgYW55KQorICAgICAgICAgIGZyYW1lID0gcmVzdWx0Lm5leHRGcmFtZTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaChlKSB7CisgICAgICAgIGxvZy5lcnJvcignVFdlYlNvY2tldFRyYW5zcG9ydCBFeGNlcHRpb246ICcgKyBlKTsKKyAgICAgICAgc29ja2V0LmRlc3Ryb3koKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfSk7CisKKyAgLy9SZXR1cm4gdGhlIHNlcnZlcgorICByZXR1cm4gc2VydmVyOworfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC93c19jb25uZWN0aW9uLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dzX2Nvbm5lY3Rpb24uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyY2JkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC93c19jb25uZWN0aW9uLmpzCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTsKK3ZhciBXZWJTb2NrZXQgPSByZXF1aXJlKCd3cycpOwordmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoImV2ZW50cyIpLkV2ZW50RW1pdHRlcjsKK3ZhciB0aHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOwordmFyIHR0cmFuc3BvcnQgPSByZXF1aXJlKCcuL3RyYW5zcG9ydCcpOwordmFyIHRwcm90b2NvbCA9IHJlcXVpcmUoJy4vcHJvdG9jb2wnKTsKKwordmFyIFRCdWZmZXJlZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vYnVmZmVyZWRfdHJhbnNwb3J0Jyk7Cit2YXIgVEpTT05Qcm90b2NvbCA9IHJlcXVpcmUoJy4vanNvbl9wcm90b2NvbCcpOwordmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CisKK3ZhciBjcmVhdGVDbGllbnQgPSByZXF1aXJlKCcuL2NyZWF0ZV9jbGllbnQnKTsKKworZXhwb3J0cy5XU0Nvbm5lY3Rpb24gPSBXU0Nvbm5lY3Rpb247CisKKy8qKgorICogQGNsYXNzCisgKiBAbmFtZSBXU0Nvbm5lY3RPcHRpb25zCisgKiBAcHJvcGVydHkge3N0cmluZ30gdHJhbnNwb3J0IC0gVGhlIFRocmlmdCBsYXllcmVkIHRyYW5zcG9ydCB0byB1c2UgKFRCdWZmZXJlZFRyYW5zcG9ydCwgZXRjKS4KKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm90b2NvbCAtIFRoZSBUaHJpZnQgc2VyaWFsaXphdGlvbiBwcm90b2NvbCB0byB1c2UgKFRKU09OUHJvdG9jb2wsIGV0Yy4pLgorICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBUaGUgVVJMIHBhdGggdG8gY29ubmVjdCB0byAoZS5nLiAiLyIsICIvbXlTdmMiLCAiL3RocmlmdC9xdW90ZVN2YyIsIGV0Yy4pLgorICogQHByb3BlcnR5IHtvYmplY3R9IGhlYWRlcnMgLSBBIHN0YW5kYXJkIE5vZGUuanMgaGVhZGVyIGhhc2gsIGFuIG9iamVjdCBoYXNoIGNvbnRhaW5pbmcga2V5L3ZhbHVlCisgKiAgICAgICAgcGFpcnMgd2hlcmUgdGhlIGtleSBpcyB0aGUgaGVhZGVyIG5hbWUgc3RyaW5nIGFuZCB0aGUgdmFsdWUgaXMgdGhlIGhlYWRlciB2YWx1ZSBzdHJpbmcuCisgKiBAcHJvcGVydHkge2Jvb2xlYW59IHNlY3VyZSAtIFRydWUgY2F1c2VzIHRoZSBjb25uZWN0aW9uIHRvIHVzZSB3c3MsIG90aGVyd2lzZSB3cyBpcyB1c2VkLgorICogQHByb3BlcnR5IHtvYmplY3R9IHdzT3B0aW9ucyAtIE9wdGlvbnMgcGFzc2VkIG9uIHRvIFdlYlNvY2tldC4KKyAqIEBleGFtcGxlCisgKiAgICAgLy9Vc2UgYSBzZWN1cmVkIHdlYnNvY2tldCBjb25uZWN0aW9uCisgKiAgICAgLy8gIHVzZXMgdGhlIGJ1ZmZlcmVkIHRyYW5zcG9ydCBsYXllciwgdXNlcyB0aGUgSlNPTiBwcm90b2NvbCBhbmQgZGlyZWN0cyBSUEMgdHJhZmZpYworICogICAgIC8vICB0byB3c3M6Ly90aHJpZnQuZXhhbXBsZS5jb206OTA5MC9oZWxsbworICogICAgIHZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTsKKyAqICAgICB2YXIgb3B0aW9ucyA9IHsKKyAqICAgICAgICB0cmFuc3BvcnQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCisgKiAgICAgICAgcHJvdG9jb2w6IHRocmlmdC5USlNPTlByb3RvY29sLAorICogICAgICAgIHBhdGg6ICIvaGVsbG8iLAorICogICAgICAgIHNlY3VyZTogdHJ1ZQorICogICAgIH07CisgKiAgICAgdmFyIGNvbiA9IHRocmlmdC5jcmVhdGVXU0Nvbm5lY3Rpb24oInRocmlmdC5leGFtcGxlLmNvbSIsIDkwOTAsIG9wdGlvbnMpOworICogICAgIGNvbi5vcGVuKCkKKyAqICAgICB2YXIgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZVdTQ2xpZW50KG15U2VydmljZSwgY29ubmVjdGlvbik7CisgKiAgICAgY2xpZW50Lm15U2VydmljZUZ1bmN0aW9uKCk7CisgKiAgICAgY29uLmNsb3NlKCkKKyAqLworCisvKioKKyAqIEluaXRpYWxpemVzIGEgVGhyaWZ0IFdTQ29ubmVjdGlvbiBpbnN0YW5jZSAodXNlIGNyZWF0ZVdTQ29ubmVjdGlvbigpIHJhdGhlciB0aGFuCisgKiAgICBpbnN0YW50aWF0aW5nIGRpcmVjdGx5KS4KKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtzdHJpbmd9IGhvc3QgLSBUaGUgaG9zdCBuYW1lIG9yIElQIHRvIGNvbm5lY3QgdG8uCisgKiBAcGFyYW0ge251bWJlcn0gcG9ydCAtIFRoZSBUQ1AgcG9ydCB0byBjb25uZWN0IHRvLgorICogQHBhcmFtIHtXU0Nvbm5lY3RPcHRpb25zfSBvcHRpb25zIC0gVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UuCisgKiBAdGhyb3dzIHtlcnJvcn0gRXhjZXB0aW9ucyBvdGhlciB0aGFuIHR0cmFuc3BvcnQuSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yIGFyZSByZXRocm93bgorICogQGV2ZW50IHtlcnJvcn0gVGhlICJlcnJvciIgZXZlbnQgaXMgZmlyZWQgd2hlbiBhIE5vZGUuanMgZXJyb3IgZXZlbnQgb2NjdXJzIGR1cmluZworICogICAgIHJlcXVlc3Qgb3IgcmVzcG9uc2UgcHJvY2Vzc2luZywgaW4gd2hpY2ggY2FzZSB0aGUgbm9kZSBlcnJvciBpcyBwYXNzZWQgb24uIEFuICJlcnJvciIKKyAqICAgICBldmVudCBtYXkgYWxzbyBiZSBmaXJlZCB3aGVuIHRoZSBjb25uZWN0aXNvbiBjYW4gbm90IG1hcCBhIHJlc3BvbnNlIGJhY2sgdG8gdGhlCisgKiAgICAgYXBwcm9wcmlhdGUgY2xpZW50IChhbiBpbnRlcm5hbCBlcnJvciksIGdlbmVyYXRpbmcgYSBUQXBwbGljYXRpb25FeGNlcHRpb24uCisgKiBAY2xhc3NkZXNjIFdTQ29ubmVjdGlvbiBvYmplY3RzIHByb3ZpZGUgVGhyaWZ0IGVuZCBwb2ludCB0cmFuc3BvcnQKKyAqICAgICBzZW1hbnRpY3MgaW1wbGVtZW50ZWQgdXNpbmcgV2Vic29ja2V0cy4KKyAqIEBzZWUge0BsaW5rIGNyZWF0ZVdTQ29ubmVjdGlvbn0KKyAqLworZnVuY3Rpb24gV1NDb25uZWN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpIHsKKyAgLy9Jbml0aWFsaXplIHRoZSBlbWl0dGVyIGJhc2Ugb2JqZWN0CisgIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpOworCisgIC8vU2V0IGNvbmZpZ3VyYXRpb24KKyAgdmFyIHNlbGYgPSB0aGlzOworICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworICB0aGlzLmhvc3QgPSBob3N0OworICB0aGlzLnBvcnQgPSBwb3J0OworICB0aGlzLnNlY3VyZSA9IHRoaXMub3B0aW9ucy5zZWN1cmUgfHwgZmFsc2U7CisgIHRoaXMudHJhbnNwb3J0ID0gdGhpcy5vcHRpb25zLnRyYW5zcG9ydCB8fCBUQnVmZmVyZWRUcmFuc3BvcnQ7CisgIHRoaXMucHJvdG9jb2wgPSB0aGlzLm9wdGlvbnMucHJvdG9jb2wgfHwgVEpTT05Qcm90b2NvbDsKKyAgdGhpcy5wYXRoID0gdGhpcy5vcHRpb25zLnBhdGg7CisgIHRoaXMuc2VuZF9wZW5kaW5nID0gW107CisKKyAgLy9UaGUgc2VxdWVuY2UgbWFwIGlzIHVzZWQgdG8gbWFwIHNlcUlEcyBiYWNrIHRvIHRoZQorICAvLyAgY2FsbGluZyBjbGllbnQgaW4gbXVsdGlwbGV4ZWQgc2NlbmFyaW9zCisgIHRoaXMuc2VxSWQyU2VydmljZSA9IHt9OworCisgIC8vUHJlcGFyZSBXZWJTb2NrZXQgb3B0aW9ucworICB0aGlzLndzT3B0aW9ucyA9IHsKKyAgICBob3N0OiB0aGlzLmhvc3QsCisgICAgcG9ydDogdGhpcy5wb3J0IHx8IDgwLAorICAgIHBhdGg6IHRoaXMub3B0aW9ucy5wYXRoIHx8ICcvJywKKyAgICBoZWFkZXJzOiB0aGlzLm9wdGlvbnMuaGVhZGVycyB8fCB7fQorICB9OworICBmb3IgKHZhciBhdHRybmFtZSBpbiB0aGlzLm9wdGlvbnMud3NPcHRpb25zKSB7CisgICAgdGhpcy53c09wdGlvbnNbYXR0cm5hbWVdID0gdGhpcy5vcHRpb25zLndzT3B0aW9uc1thdHRybmFtZV07CisgIH0KK307Cit1dGlsLmluaGVyaXRzKFdTQ29ubmVjdGlvbiwgRXZlbnRFbWl0dGVyKTsKKworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5fX3Jlc2V0ID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuc29ja2V0ID0gbnVsbDsgLy9UaGUgd2ViIHNvY2tldAorICB0aGlzLnNlbmRfcGVuZGluZyA9IFtdOyAvL0J1ZmZlcnMvQ2FsbGJhY2sgcGFpcnMgd2FpdGluZyB0byBiZSBzZW50Cit9OworCitXU0Nvbm5lY3Rpb24ucHJvdG90eXBlLl9fb25PcGVuID0gZnVuY3Rpb24oKSB7CisgIHZhciBzZWxmID0gdGhpczsKKyAgdGhpcy5lbWl0KCJvcGVuIik7CisgIGlmICh0aGlzLnNlbmRfcGVuZGluZy5sZW5ndGggPiAwKSB7CisgICAgLy9JZiB0aGUgdXNlciBtYWRlIGNhbGxzIGJlZm9yZSB0aGUgY29ubmVjdGlvbiB3YXMgZnVsbHkKKyAgICAvL29wZW4sIHNlbmQgdGhlbSBub3cKKyAgICB0aGlzLnNlbmRfcGVuZGluZy5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgIHNlbGYuc29ja2V0LnNlbmQoZGF0YSk7CisgICAgfSk7CisgICAgdGhpcy5zZW5kX3BlbmRpbmcgPSBbXTsKKyAgfQorfTsKKworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5fX29uQ2xvc2UgPSBmdW5jdGlvbihldnQpIHsKKyAgdGhpcy5lbWl0KCJjbG9zZSIpOworICB0aGlzLl9fcmVzZXQoKTsKK307CisKK1dTQ29ubmVjdGlvbi5wcm90b3R5cGUuX19kZWNvZGVDYWxsYmFjayA9IGZ1bmN0aW9uKHRyYW5zcG9ydF93aXRoX2RhdGEpIHsKKyAgdmFyIHByb3RvID0gbmV3IHRoaXMucHJvdG9jb2wodHJhbnNwb3J0X3dpdGhfZGF0YSk7CisgIHRyeSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHZhciBoZWFkZXIgPSBwcm90by5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICB2YXIgZHVtbXlfc2VxaWQgPSBoZWFkZXIucnNlcWlkICogLTE7CisgICAgICB2YXIgY2xpZW50ID0gdGhpcy5jbGllbnQ7CisgICAgICAvL1RoZSBNdWx0aXBsZXhlZCBQcm90b2NvbCBzdG9yZXMgYSBoYXNoIG9mIHNlcWlkIHRvIHNlcnZpY2UgbmFtZXMKKyAgICAgIC8vICBpbiBzZXFJZDJTZXJ2aWNlLiBJZiB0aGUgU2VxSWQgaXMgZm91bmQgaW4gdGhlIGhhc2ggd2UgbmVlZCB0bworICAgICAgLy8gIGxvb2t1cCB0aGUgYXBwcm9wcmlhdGUgY2xpZW50IGZvciB0aGlzIGNhbGwuCisgICAgICAvLyAgVGhlIGNsaWVudCB2YXIgaXMgYSBzaW5nbGUgY2xpZW50IG9iamVjdCB3aGVuIG5vdCBtdWx0aXBsZXhpbmcsCisgICAgICAvLyAgd2hlbiB1c2luZyBtdWx0aXBsZXhpbmcgaXQgaXMgYSBzZXJ2aWNlIG5hbWUga2V5ZWQgaGFzaCBvZiBjbGllbnQKKyAgICAgIC8vICBvYmplY3RzLgorICAgICAgLy9OT1RFOiBUaGUgMiB3YXkgaW50ZXJkZXBlbmRlbmNpZXMgYmV0d2VlbiBwcm90b2NvbHMsIHRyYW5zcG9ydHMsCisgICAgICAvLyAgY29ubmVjdGlvbnMgYW5kIGNsaWVudHMgaW4gdGhlIE5vZGUuanMgaW1wbGVtZW50YXRpb24gYXJlIGlycmVndWxhcgorICAgICAgLy8gIGFuZCBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbiBkaWZmaWN1bHQgdG8gZXh0ZW5kIGFuZCBtYWludGFpbi4gV2UKKyAgICAgIC8vICBzaG91bGQgYnJpbmcgdGhpcyBzdHVmZiBpbmxpbmUgd2l0aCB0eXBpY2FsIHRocmlmdCBJL08gc3RhY2sKKyAgICAgIC8vICBvcGVyYXRpb24gc29vbi4KKyAgICAgIC8vICAtLXJhCisgICAgICB2YXIgc2VydmljZV9uYW1lID0gdGhpcy5zZXFJZDJTZXJ2aWNlW2hlYWRlci5yc2VxaWRdOworICAgICAgaWYgKHNlcnZpY2VfbmFtZSkgeworICAgICAgICBjbGllbnQgPSB0aGlzLmNsaWVudFtzZXJ2aWNlX25hbWVdOworICAgICAgICBkZWxldGUgdGhpcy5zZXFJZDJTZXJ2aWNlW2hlYWRlci5yc2VxaWRdOworICAgICAgfQorICAgICAgLypqc2hpbnQgLVcwODMgKi8KKyAgICAgIGNsaWVudC5fcmVxc1tkdW1teV9zZXFpZF0gPSBmdW5jdGlvbihlcnIsIHN1Y2Nlc3MpIHsKKyAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5jb21taXRQb3NpdGlvbigpOworICAgICAgICB2YXIgY2xpZW50Q2FsbGJhY2sgPSBjbGllbnQuX3JlcXNbaGVhZGVyLnJzZXFpZF07CisgICAgICAgIGRlbGV0ZSBjbGllbnQuX3JlcXNbaGVhZGVyLnJzZXFpZF07CisgICAgICAgIGlmIChjbGllbnRDYWxsYmFjaykgeworICAgICAgICAgIGNsaWVudENhbGxiYWNrKGVyciwgc3VjY2Vzcyk7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgICAvKmpzaGludCArVzA4MyAqLworICAgICAgaWYgKGNsaWVudFsncmVjdl8nICsgaGVhZGVyLmZuYW1lXSkgeworICAgICAgICBjbGllbnRbJ3JlY3ZfJyArIGhlYWRlci5mbmFtZV0ocHJvdG8sIGhlYWRlci5tdHlwZSwgZHVtbXlfc2VxaWQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGVsZXRlIGNsaWVudC5fcmVxc1tkdW1teV9zZXFpZF07CisgICAgICAgIHRoaXMuZW1pdCgiZXJyb3IiLAorICAgICAgICAgIG5ldyB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuV1JPTkdfTUVUSE9EX05BTUUsCisgICAgICAgICAgICAiUmVjZWl2ZWQgYSByZXNwb25zZSB0byBhbiB1bmtub3duIFJQQyBmdW5jdGlvbiIpKTsKKyAgICAgIH0KKyAgICB9CisgIH0gY2F0Y2ggKGUpIHsKKyAgICBpZiAoZSBpbnN0YW5jZW9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvcikgeworICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IGU7CisgICAgfQorICB9Cit9OworCitXU0Nvbm5lY3Rpb24ucHJvdG90eXBlLl9fb25EYXRhID0gZnVuY3Rpb24oZGF0YSkgeworICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRhdGEpID09ICJbb2JqZWN0IEFycmF5QnVmZmVyXSIpIHsKKyAgICBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7CisgIH0KKyAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoZGF0YSk7CisgIHRoaXMudHJhbnNwb3J0LnJlY2VpdmVyKHRoaXMuX19kZWNvZGVDYWxsYmFjay5iaW5kKHRoaXMpKShidWYpOworCit9OworCitXU0Nvbm5lY3Rpb24ucHJvdG90eXBlLl9fb25NZXNzYWdlID0gZnVuY3Rpb24oZXZ0KSB7CisgIHRoaXMuX19vbkRhdGEoZXZ0LmRhdGEpOworfTsKKworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5fX29uRXJyb3IgPSBmdW5jdGlvbihldnQpIHsKKyAgdGhpcy5lbWl0KCJlcnJvciIsIGV2dCk7CisgIHRoaXMuc29ja2V0LmNsb3NlKCk7Cit9OworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4KKyAqIEByZWFkb25seQorICogQHJldHVybnMge2Jvb2xlYW59CisgKi8KK1dTQ29ubmVjdGlvbi5wcm90b3R5cGUuaXNPcGVuID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09IHRoaXMuc29ja2V0Lk9QRU47Cit9OworCisvKioKKyAqIE9wZW5zIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbgorICovCitXU0Nvbm5lY3Rpb24ucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbigpIHsKKyAgLy9JZiBPUEVOL0NPTk5FQ1RJTkcvQ0xPU0lORyBpZ25vcmUgYWRkaXRpb25hbCBvcGVucworICBpZiAodGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSAhPSB0aGlzLnNvY2tldC5DTE9TRUQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgLy9JZiB0aGVyZSBpcyBubyBzb2NrZXQgb3IgdGhlIHNvY2tldCBpcyBjbG9zZWQ6CisgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldCh0aGlzLnVyaSgpLCAiIiwgdGhpcy53c09wdGlvbnMpOworICB0aGlzLnNvY2tldC5iaW5hcnlUeXBlID0gJ2FycmF5YnVmZmVyJzsKKyAgdGhpcy5zb2NrZXQub25vcGVuID0gdGhpcy5fX29uT3Blbi5iaW5kKHRoaXMpOworICB0aGlzLnNvY2tldC5vbm1lc3NhZ2UgPSB0aGlzLl9fb25NZXNzYWdlLmJpbmQodGhpcyk7CisgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSB0aGlzLl9fb25FcnJvci5iaW5kKHRoaXMpOworICB0aGlzLnNvY2tldC5vbmNsb3NlID0gdGhpcy5fX29uQ2xvc2UuYmluZCh0aGlzKTsKK307CisKKy8qKgorICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbgorICovCitXU0Nvbm5lY3Rpb24ucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuc29ja2V0LmNsb3NlKCk7Cit9OworCisvKioKKyAqIFJldHVybiBVUkkgZm9yIHRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJucyB7c3RyaW5nfSBVUkkKKyAqLworV1NDb25uZWN0aW9uLnByb3RvdHlwZS51cmkgPSBmdW5jdGlvbigpIHsKKyAgdmFyIHNjaGVtYSA9IHRoaXMuc2VjdXJlID8gJ3dzcycgOiAnd3MnOworICB2YXIgcG9ydCA9ICcnOworICB2YXIgcGF0aCA9IHRoaXMucGF0aCB8fCAnLyc7CisgIHZhciBob3N0ID0gdGhpcy5ob3N0OworCisgIC8vIGF2b2lkIHBvcnQgaWYgZGVmYXVsdCBmb3Igc2NoZW1hCisgIGlmICh0aGlzLnBvcnQgJiYgKCgnd3NzJyA9PSBzY2hlbWEgJiYgdGhpcy5wb3J0ICE9IDQ0MykgfHwKKyAgICAoJ3dzJyA9PSBzY2hlbWEgJiYgdGhpcy5wb3J0ICE9IDgwKSkpIHsKKyAgICBwb3J0ID0gJzonICsgdGhpcy5wb3J0OworICB9CisKKyAgcmV0dXJuIHNjaGVtYSArICc6Ly8nICsgaG9zdCArIHBvcnQgKyBwYXRoOworfTsKKworLyoqCisgKiBXcml0ZXMgVGhyaWZ0IG1lc3NhZ2UgZGF0YSB0byB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgLSBBIE5vZGUuanMgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gd3JpdGUKKyAqIEByZXR1cm5zIHt2b2lkfSBObyByZXR1cm4gdmFsdWUuCisgKiBAZXZlbnQge2Vycm9yfSB0aGUgImVycm9yIiBldmVudCBpcyByYWlzZWQgdXBvbiByZXF1ZXN0IGZhaWx1cmUgcGFzc2luZyB0aGUKKyAqICAgICBOb2RlLmpzIGVycm9yIG9iamVjdCB0byB0aGUgbGlzdGVuZXIuCisgKi8KK1dTQ29ubmVjdGlvbi5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihkYXRhKSB7CisgIGlmICh0aGlzLmlzT3BlbigpKSB7CisgICAgLy9TZW5kIGRhdGEgYW5kIHJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gaW52b2tlIHRoZSBjbGllbnQgY2FsbGJhY2sKKyAgICB0aGlzLnNvY2tldC5zZW5kKGRhdGEpOworICB9IGVsc2UgeworICAgIC8vUXVldWUgdGhlIHNlbmQgdG8gZ28gb3V0IF9fb25PcGVuCisgICAgdGhpcy5zZW5kX3BlbmRpbmcucHVzaChkYXRhKTsKKyAgfQorfTsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IFdTQ29ubmVjdGlvbiBvYmplY3QsIHVzZWQgYnkgVGhyaWZ0IGNsaWVudHMgdG8gY29ubmVjdAorICogICAgdG8gVGhyaWZ0IEhUVFAgYmFzZWQgc2VydmVycy4KKyAqIEBwYXJhbSB7c3RyaW5nfSBob3N0IC0gVGhlIGhvc3QgbmFtZSBvciBJUCB0byBjb25uZWN0IHRvLgorICogQHBhcmFtIHtudW1iZXJ9IHBvcnQgLSBUaGUgVENQIHBvcnQgdG8gY29ubmVjdCB0by4KKyAqIEBwYXJhbSB7V1NDb25uZWN0T3B0aW9uc30gb3B0aW9ucyAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlLgorICogQHJldHVybnMge1dTQ29ubmVjdGlvbn0gVGhlIGNvbm5lY3Rpb24gb2JqZWN0LgorICogQHNlZSB7QGxpbmsgV1NDb25uZWN0T3B0aW9uc30KKyAqLworZXhwb3J0cy5jcmVhdGVXU0Nvbm5lY3Rpb24gPSBmdW5jdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKSB7CisgIHJldHVybiBuZXcgV1NDb25uZWN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpOworfTsKKworZXhwb3J0cy5jcmVhdGVXU0NsaWVudCA9IGNyZWF0ZUNsaWVudDsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC93c190cmFuc3BvcnQuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvd3NfdHJhbnNwb3J0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MTNiODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvd3NfdHJhbnNwb3J0LmpzCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciBsb2cgPSByZXF1aXJlKCcuL2xvZycpOworCittb2R1bGUuZXhwb3J0cyA9IFRXZWJTb2NrZXRUcmFuc3BvcnQ7CisKKy8qKgorICogQ29uc3RydWN0b3IgRnVuY3Rpb24gZm9yIHRoZSBXZWJTb2NrZXQgdHJhbnNwb3J0LgorICogQGNvbnN0cnVjdG9yCisgKiBAcGFyYW0ge3N0cmluZ30gW3VybF0gLSBUaGUgVVJMIHRvIGNvbm5lY3QgdG8uCisgKiBAY2xhc3NkZXNjIFRoZSBBcGFjaGUgVGhyaWZ0IFRyYW5zcG9ydCBsYXllciBwZXJmb3JtcyBieXRlIGxldmVsIEkvTworICogYmV0d2VlbiBSUEMgY2xpZW50cyBhbmQgc2VydmVycy4gVGhlIEphdmFTY3JpcHQgVFdlYlNvY2tldFRyYW5zcG9ydCBvYmplY3QKKyAqIHVzZXMgdGhlIFdlYlNvY2tldCBwcm90b2NvbC4gVGFyZ2V0IHNlcnZlcnMgbXVzdCBpbXBsZW1lbnQgV2ViU29ja2V0LgorICogKHNlZTogbm9kZS5qcyBleGFtcGxlIHNlcnZlcl9odHRwLmpzKS4KKyAqIEBleGFtcGxlCisgKiAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRXZWJTb2NrZXRUcmFuc3BvcnQoImh0dHA6Ly9sb2NhbGhvc3Q6ODU4NSIpOworICovCitmdW5jdGlvbiBUV2ViU29ja2V0VHJhbnNwb3J0KHVybCkgeworICAgIHRoaXMuX19yZXNldCh1cmwpOworfTsKKworCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5fX3Jlc2V0ID0gZnVuY3Rpb24odXJsKSB7CisgIHRoaXMudXJsID0gdXJsOyAgICAgICAgICAgICAvL1doZXJlIHRvIGNvbm5lY3QKKyAgdGhpcy5zb2NrZXQgPSBudWxsOyAgICAgICAgIC8vVGhlIHdlYiBzb2NrZXQKKyAgdGhpcy5jYWxsYmFja3MgPSBbXTsgICAgICAgIC8vUGVuZGluZyBjYWxsYmFja3MKKyAgdGhpcy5zZW5kX3BlbmRpbmcgPSBbXTsgICAgIC8vQnVmZmVycy9DYWxsYmFjayBwYWlycyB3YWl0aW5nIHRvIGJlIHNlbnQKKyAgdGhpcy5zZW5kX2J1ZiA9ICcnOyAgICAgICAgIC8vT3V0Ym91bmQgZGF0YSwgaW1tdXRhYmxlIHVudGlsIHNlbnQKKyAgdGhpcy5yZWN2X2J1ZiA9ICcnOyAgICAgICAgIC8vSW5ib3VuZCBkYXRhCisgIHRoaXMucmJfd3BvcyA9IDA7ICAgICAgICAgICAvL05ldHdvcmsgd3JpdGUgcG9zaXRpb24gaW4gcmVjZWl2ZSBidWZmZXIKKyAgdGhpcy5yYl9ycG9zID0gMDsgICAgICAgICAgIC8vQ2xpZW50IHJlYWQgcG9zaXRpb24gaW4gcmVjZWl2ZSBidWZmZXIKK307CisKKy8qKgorICogU2VuZHMgdGhlIGN1cnJlbnQgV1MgcmVxdWVzdCBhbmQgcmVnaXN0ZXJzIGNhbGxiYWNrLiBUaGUgYXN5bmMKKyAqIHBhcmFtZXRlciBpcyBpZ25vcmVkIChXUyBmbHVzaCBpcyBhbHdheXMgYXN5bmMpIGFuZCB0aGUgY2FsbGJhY2sKKyAqIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyByZXF1aXJlZC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBhc3luYyAtIElnbm9yZWQuCisgKiBAcGFyYW0ge29iamVjdH0gY2FsbGJhY2sgLSBUaGUgY2xpZW50IGNvbXBsZXRpb24gY2FsbGJhY2suCisgKiBAcmV0dXJucyB7dW5kZWZpbmVkfHN0cmluZ30gTm90aGluZyAodW5kZWZpbmVkKQorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKGFzeW5jLCBjYWxsYmFjaykgeworICB2YXIgc2VsZiA9IHRoaXM7CisgIGlmICh0aGlzLmlzT3BlbigpKSB7CisgICAgLy9TZW5kIGRhdGEgYW5kIHJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gaW52b2tlIHRoZSBjbGllbnQgY2FsbGJhY2sKKyAgICB0aGlzLnNvY2tldC5zZW5kKHRoaXMuc2VuZF9idWYpOworICAgIHRoaXMuY2FsbGJhY2tzLnB1c2goKGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICByZXR1cm4gZnVuY3Rpb24obXNnKSB7CisgICAgICAgIHNlbGYuc2V0UmVjdkJ1ZmZlcihtc2cpOworICAgICAgICBjbGllbnRDYWxsYmFjaygpOworICAgICAgfTsKKyAgICB9KCkpKTsKKyAgfSBlbHNlIHsKKyAgICAvL1F1ZXVlIHRoZSBzZW5kIHRvIGdvIG91dCBfX29uT3BlbgorICAgIHRoaXMuc2VuZF9wZW5kaW5nLnB1c2goeworICAgICAgYnVmOiB0aGlzLnNlbmRfYnVmLAorICAgICAgY2I6ICBjYWxsYmFjaworICAgIH0pOworICB9Cit9OworCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5fX29uT3BlbiA9IGZ1bmN0aW9uKCkgeworICAgdmFyIHNlbGYgPSB0aGlzOworICAgaWYgKHRoaXMuc2VuZF9wZW5kaW5nLmxlbmd0aCA+IDApIHsKKyAgICAgIC8vSWYgdGhlIHVzZXIgbWFkZSBjYWxscyBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gd2FzIGZ1bGx5CisgICAgICAvL29wZW4sIHNlbmQgdGhlbSBub3cKKyAgICAgIHRoaXMuc2VuZF9wZW5kaW5nLmZvckVhY2goZnVuY3Rpb24oZWxlbSkgeworICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChlbGVtLmJ1Zik7CisgICAgICAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gZWxlbS5jYjsKKyAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKG1zZykgeworICAgICAgICAgICAgICBzZWxmLnNldFJlY3ZCdWZmZXIobXNnKTsKKyAgICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2soKTsKKyAgICAgICAgICAgfTsKKyAgICAgICAgIH0oKSkpOworICAgICAgfSk7CisgICAgICB0aGlzLnNlbmRfcGVuZGluZyA9IFtdOworICAgfQorfTsKKworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuX19vbkNsb3NlID0gZnVuY3Rpb24oZXZ0KSB7CisgIHRoaXMuX19yZXNldCh0aGlzLnVybCk7Cit9OworCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5fX29uTWVzc2FnZSA9IGZ1bmN0aW9uKGV2dCkgeworICBpZiAodGhpcy5jYWxsYmFja3MubGVuZ3RoKSB7CisgICAgdGhpcy5jYWxsYmFja3Muc2hpZnQoKShldnQuZGF0YSk7CisgIH0KK307CisKK1RXZWJTb2NrZXRUcmFuc3BvcnQucHJvdG90eXBlLl9fb25FcnJvciA9IGZ1bmN0aW9uKGV2dCkgeworICBsb2cuZXJyb3IoJ3dlYnNvY2tldDogJyArIGV2dC50b1N0cmluZygpKTsKKyAgdGhpcy5zb2NrZXQuY2xvc2UoKTsKK307CisKKy8qKgorICogU2V0cyB0aGUgYnVmZmVyIHRvIHVzZSB3aGVuIHJlY2VpdmluZyBzZXJ2ZXIgcmVzcG9uc2VzLgorICogQHBhcmFtIHtzdHJpbmd9IGJ1ZiAtIFRoZSBidWZmZXIgdG8gcmVjZWl2ZSBzZXJ2ZXIgcmVzcG9uc2VzLgorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5zZXRSZWN2QnVmZmVyID0gZnVuY3Rpb24oYnVmKSB7CisgIHRoaXMucmVjdl9idWYgPSBidWY7CisgIHRoaXMucmVjdl9idWZfc3ogPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aDsKKyAgdGhpcy53cG9zID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGg7CisgIHRoaXMucnBvcyA9IDA7Cit9OworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4KKyAqIEByZWFkb25seQorICogQHJldHVybnMge2Jvb2xlYW59CisgKi8KK1RXZWJTb2NrZXRUcmFuc3BvcnQucHJvdG90eXBlLmlzT3BlbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PSB0aGlzLnNvY2tldC5PUEVOOworfTsKKworLyoqCisgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24KKyAqLworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uKCkgeworICAvL0lmIE9QRU4vQ09OTkVDVElORy9DTE9TSU5HIGlnbm9yZSBhZGRpdGlvbmFsIG9wZW5zCisgIGlmICh0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9IHRoaXMuc29ja2V0LkNMT1NFRCkgeworICAgIHJldHVybjsKKyAgfQorICAvL0lmIHRoZXJlIGlzIG5vIHNvY2tldCBvciB0aGUgc29ja2V0IGlzIGNsb3NlZDoKKyAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KHRoaXMudXJsKTsKKyAgdGhpcy5zb2NrZXQub25vcGVuID0gdGhpcy5fX29uT3Blbi5iaW5kKHRoaXMpOworICB0aGlzLnNvY2tldC5vbm1lc3NhZ2UgPSB0aGlzLl9fb25NZXNzYWdlLmJpbmQodGhpcyk7CisgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSB0aGlzLl9fb25FcnJvci5iaW5kKHRoaXMpOworICB0aGlzLnNvY2tldC5vbmNsb3NlID0gdGhpcy5fX29uQ2xvc2UuYmluZCh0aGlzKTsKK307CisKKy8qKgorICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbgorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkgeworICB0aGlzLnNvY2tldC5jbG9zZSgpOworfTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgcmVzcG9uc2UKKyAqIGJ1ZmZlci4KKyAqIEBwYXJhbSB7bnVtYmVyfSBsZW4gLSBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmV0dXJuLgorICogQHJldHVybnMge3N0cmluZ30gQ2hhcmFjdGVycyBzZW50IGJ5IHRoZSBzZXJ2ZXIuCisgKi8KK1RXZWJTb2NrZXRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihsZW4pIHsKKyAgdmFyIGF2YWlsID0gdGhpcy53cG9zIC0gdGhpcy5ycG9zOworCisgIGlmIChhdmFpbCA9PT0gMCkgeworICAgIHJldHVybiAnJzsKKyAgfQorCisgIHZhciBnaXZlID0gbGVuOworCisgIGlmIChhdmFpbCA8IGxlbikgeworICAgIGdpdmUgPSBhdmFpbDsKKyAgfQorCisgIHZhciByZXQgPSB0aGlzLnJlYWRfYnVmLnN1YnN0cih0aGlzLnJwb3MsIGdpdmUpOworICB0aGlzLnJwb3MgKz0gZ2l2ZTsKKworICAvL2NsZWFyIGJ1ZiB3aGVuIGNvbXBsZXRlPworICByZXR1cm4gcmV0OworfTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBlbnRpcmUgcmVzcG9uc2UgYnVmZmVyLgorICogQHJldHVybnMge3N0cmluZ30gQ2hhcmFjdGVycyBzZW50IGJ5IHRoZSBzZXJ2ZXIuCisgKi8KK1RXZWJTb2NrZXRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRBbGwgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVjdl9idWY7Cit9OworCisvKioKKyAqIFNldHMgdGhlIHNlbmQgYnVmZmVyIHRvIGJ1Zi4KKyAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHNlbmQuCisgKi8KK1RXZWJTb2NrZXRUcmFuc3BvcnQucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oYnVmKSB7CisgIHRoaXMuc2VuZF9idWYgPSBidWY7Cit9OworCisvKioKKyAqIFJldHVybnMgdGhlIHNlbmQgYnVmZmVyLgorICogQHJlYWRvbmx5CisgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc2VuZCBidWZmZXIuCisgKi8KK1RXZWJTb2NrZXRUcmFuc3BvcnQucHJvdG90eXBlLmdldFNlbmRCdWZmZXIgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMuc2VuZF9idWY7Cit9OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3hocl9jb25uZWN0aW9uLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3hocl9jb25uZWN0aW9uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NTljOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQveGhyX2Nvbm5lY3Rpb24uanMKQEAgLTAsMCArMSwyODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3ZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpOwordmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoImV2ZW50cyIpLkV2ZW50RW1pdHRlcjsKK3ZhciB0aHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOworCit2YXIgVEJ1ZmZlcmVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9idWZmZXJlZF90cmFuc3BvcnQnKTsKK3ZhciBUSlNPTlByb3RvY29sID0gcmVxdWlyZSgnLi9qc29uX3Byb3RvY29sJyk7Cit2YXIgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yID0gcmVxdWlyZSgnLi9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3InKTsKKwordmFyIGNyZWF0ZUNsaWVudCA9IHJlcXVpcmUoJy4vY3JlYXRlX2NsaWVudCcpOworCitleHBvcnRzLlhIUkNvbm5lY3Rpb24gPSBYSFJDb25uZWN0aW9uOworCisvKioKKyAqIENvbnN0cnVjdG9yIEZ1bmN0aW9uIGZvciB0aGUgWEhSIENvbm5lY3Rpb24uCisgKiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYSBob3N0IGFuZCBwb3J0IHRoZW4gWEhSQ29ubmVjdGlvbiB3aWxsIGRlZmF1bHQgdG8gdGhlCisgKiBob3N0IGFuZCBwb3J0IG9mIHRoZSBwYWdlIGZyb20gd2hpY2ggdGhpcyBqYXZhc2NyaXB0IGlzIHNlcnZlZC4KKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIFVSTCB0byBjb25uZWN0IHRvLgorICogQGNsYXNzZGVzYyBUWEhSQ29ubmVjdGlvbiBvYmplY3RzIHByb3ZpZGUgVGhyaWZ0IGVuZCBwb2ludCB0cmFuc3BvcnQKKyAqICAgICBzZW1hbnRpY3MgaW1wbGVtZW50ZWQgdXNpbmcgWEhSLgorICogQGV4YW1wbGUKKyAqICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UWEhSQ29ubmVjdGlvbignbG9jYWxob3N0JywgOTA5OSwge30pOworICovCitmdW5jdGlvbiBYSFJDb25uZWN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpIHsKKyAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKKyAgdGhpcy53cG9zID0gMDsKKyAgdGhpcy5ycG9zID0gMDsKKyAgdGhpcy51c2VDT1JTID0gKG9wdGlvbnMgJiYgb3B0aW9ucy51c2VDT1JTKTsKKyAgdGhpcy5zZW5kX2J1ZiA9ICcnOworICB0aGlzLnJlY3ZfYnVmID0gJyc7CisgIHRoaXMudHJhbnNwb3J0ID0gb3B0aW9ucy50cmFuc3BvcnQgfHwgVEJ1ZmZlcmVkVHJhbnNwb3J0OworICB0aGlzLnByb3RvY29sID0gb3B0aW9ucy5wcm90b2NvbCB8fCBUSlNPTlByb3RvY29sOworICB0aGlzLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgfHwge307CisKKyAgaG9zdCA9IGhvc3QgfHwgd2luZG93LmxvY2F0aW9uLmhvc3Q7CisgIHBvcnQgPSBwb3J0IHx8IHdpbmRvdy5sb2NhdGlvbi5wb3J0OworICB2YXIgcHJlZml4ID0gb3B0aW9ucy5odHRwcyA/ICdodHRwczovLycgOiAnaHR0cDovLyc7CisgIHZhciBwYXRoID0gb3B0aW9ucy5wYXRoIHx8ICcvJzsKKworICBpZiAocG9ydCA9PT0gJycpIHsKKyAgICBwb3J0ID0gdW5kZWZpbmVkOworICB9CisKKyAgaWYgKCFwb3J0IHx8IHBvcnQgPT09IDgwIHx8IHBvcnQgPT09ICc4MCcpIHsKKyAgICB0aGlzLnVybCA9IHByZWZpeCArIGhvc3QgKyBwYXRoOworICB9IGVsc2UgeworICAgIHRoaXMudXJsID0gcHJlZml4ICsgaG9zdCArICc6JyArIHBvcnQgKyBwYXRoOworICB9CisKKyAgLy9UaGUgc2VxdWVuY2UgbWFwIGlzIHVzZWQgdG8gbWFwIHNlcUlEcyBiYWNrIHRvIHRoZQorICAvLyAgY2FsbGluZyBjbGllbnQgaW4gbXVsdGlwbGV4ZWQgc2NlbmFyaW9zCisgIHRoaXMuc2VxSWQyU2VydmljZSA9IHt9OworfTsKKwordXRpbC5pbmhlcml0cyhYSFJDb25uZWN0aW9uLCBFdmVudEVtaXR0ZXIpOworCisvKioKKyogR2V0cyB0aGUgYnJvd3NlciBzcGVjaWZpYyBYbWxIdHRwUmVxdWVzdCBPYmplY3QuCisqIEByZXR1cm5zIHtvYmplY3R9IHRoZSBicm93c2VyIFhIUiBpbnRlcmZhY2Ugb2JqZWN0CisqLworWEhSQ29ubmVjdGlvbi5wcm90b3R5cGUuZ2V0WG1sSHR0cFJlcXVlc3RPYmplY3QgPSBmdW5jdGlvbigpIHsKKyAgdHJ5IHsgcmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpOyB9IGNhdGNoIChlMSkgeyB9CisgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTXN4bWwyLlhNTEhUVFAnKTsgfSBjYXRjaCAoZTIpIHsgfQorICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01pY3Jvc29mdC5YTUxIVFRQJyk7IH0gY2F0Y2ggKGUzKSB7IH0KKworICB0aHJvdyAiWW91ciBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBYSFIuIjsKK307CisKKy8qKgorICogU2VuZHMgdGhlIGN1cnJlbnQgWFJIIHJlcXVlc3QgaWYgdGhlIHRyYW5zcG9ydCB3YXMgY3JlYXRlZCB3aXRoIGEgVVJMCisgKiBhbmQgdGhlIGFzeW5jIHBhcmFtZXRlciBpcyBmYWxzZS4gSWYgdGhlIHRyYW5zcG9ydCB3YXMgbm90IGNyZWF0ZWQgd2l0aAorICogYSBVUkwsIG9yIHRoZSBhc3luYyBwYXJhbWV0ZXIgaXMgVHJ1ZSBhbmQgbm8gY2FsbGJhY2sgaXMgcHJvdmlkZWQsIG9yCisgKiB0aGUgVVJMIGlzIGFuIGVtcHR5IHN0cmluZywgdGhlIGN1cnJlbnQgc2VuZCBidWZmZXIgaXMgcmV0dXJuZWQuCisgKiBAcGFyYW0ge29iamVjdH0gYXN5bmMgLSBJZiB0cnVlIHRoZSBjdXJyZW50IHNlbmQgYnVmZmVyIGlzIHJldHVybmVkLgorICogQHBhcmFtIHtvYmplY3R9IGNhbGxiYWNrIC0gT3B0aW9uYWwgYXN5bmMgY29tcGxldGlvbiBjYWxsYmFjaworICogQHJldHVybnMge3VuZGVmaW5lZHxzdHJpbmd9IE5vdGhpbmcgb3IgdGhlIGN1cnJlbnQgc2VuZCBidWZmZXIuCisgKiBAdGhyb3dzIHtzdHJpbmd9IElmIFhIUiBmYWlscy4KKyAqLworWEhSQ29ubmVjdGlvbi5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbigpIHsKKyAgdmFyIHNlbGYgPSB0aGlzOworICBpZiAodGhpcy51cmwgPT09IHVuZGVmaW5lZCB8fCB0aGlzLnVybCA9PT0gJycpIHsKKyAgICByZXR1cm4gdGhpcy5zZW5kX2J1ZjsKKyAgfQorCisgIHZhciB4cmVxID0gdGhpcy5nZXRYbWxIdHRwUmVxdWVzdE9iamVjdCgpOworCisgIGlmICh4cmVxLm92ZXJyaWRlTWltZVR5cGUpIHsKKyAgICB4cmVxLm92ZXJyaWRlTWltZVR5cGUoJ2FwcGxpY2F0aW9uL2pzb24nKTsKKyAgfQorCisgIHhyZXEub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CisgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSA0ICYmIHRoaXMuc3RhdHVzID09IDIwMCkgeworICAgICAgc2VsZi5zZXRSZWN2QnVmZmVyKHRoaXMucmVzcG9uc2VUZXh0KTsKKyAgICB9CisgIH07CisKKyAgeHJlcS5vcGVuKCdQT1NUJywgdGhpcy51cmwsIHRydWUpOworCisgIE9iamVjdC5rZXlzKHRoaXMuaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbihoZWFkZXJLZXkpIHsKKyAgICB4cmVxLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyS2V5LCBzZWxmLmhlYWRlcnNbaGVhZGVyS2V5XSk7CisgIH0pOworCisgIHhyZXEuc2VuZCh0aGlzLnNlbmRfYnVmKTsKK307CisKKy8qKgorICogU2V0cyB0aGUgYnVmZmVyIHRvIHByb3ZpZGUgdGhlIHByb3RvY29sIHdoZW4gZGVzZXJpYWxpemluZy4KKyAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHN1cHBseSB0aGUgcHJvdG9jb2wuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLnNldFJlY3ZCdWZmZXIgPSBmdW5jdGlvbihidWYpIHsKKyAgdGhpcy5yZWN2X2J1ZiA9IGJ1ZjsKKyAgdGhpcy5yZWN2X2J1Zl9zeiA9IHRoaXMucmVjdl9idWYubGVuZ3RoOworICB0aGlzLndwb3MgPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aDsKKyAgdGhpcy5ycG9zID0gMDsKKworICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGJ1ZikgPT0gIltvYmplY3QgQXJyYXlCdWZmZXJdIikgeworICAgIHZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTsKKyAgfQorICB2YXIgdGhpbmcgPSBuZXcgQnVmZmVyKGRhdGEgfHwgYnVmKTsKKworICB0aGlzLnRyYW5zcG9ydC5yZWNlaXZlcih0aGlzLl9fZGVjb2RlQ2FsbGJhY2suYmluZCh0aGlzKSkodGhpbmcpOworCit9OworCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS5fX2RlY29kZUNhbGxiYWNrID0gZnVuY3Rpb24odHJhbnNwb3J0X3dpdGhfZGF0YSkgeworICB2YXIgcHJvdG8gPSBuZXcgdGhpcy5wcm90b2NvbCh0cmFuc3BvcnRfd2l0aF9kYXRhKTsKKyAgdHJ5IHsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgdmFyIGhlYWRlciA9IHByb3RvLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIHZhciBkdW1teV9zZXFpZCA9IGhlYWRlci5yc2VxaWQgKiAtMTsKKyAgICAgIHZhciBjbGllbnQgPSB0aGlzLmNsaWVudDsKKyAgICAgIC8vVGhlIE11bHRpcGxleGVkIFByb3RvY29sIHN0b3JlcyBhIGhhc2ggb2Ygc2VxaWQgdG8gc2VydmljZSBuYW1lcworICAgICAgLy8gIGluIHNlcUlkMlNlcnZpY2UuIElmIHRoZSBTZXFJZCBpcyBmb3VuZCBpbiB0aGUgaGFzaCB3ZSBuZWVkIHRvCisgICAgICAvLyAgbG9va3VwIHRoZSBhcHByb3ByaWF0ZSBjbGllbnQgZm9yIHRoaXMgY2FsbC4KKyAgICAgIC8vICBUaGUgY2xpZW50IHZhciBpcyBhIHNpbmdsZSBjbGllbnQgb2JqZWN0IHdoZW4gbm90IG11bHRpcGxleGluZywKKyAgICAgIC8vICB3aGVuIHVzaW5nIG11bHRpcGxleGluZyBpdCBpcyBhIHNlcnZpY2UgbmFtZSBrZXllZCBoYXNoIG9mIGNsaWVudAorICAgICAgLy8gIG9iamVjdHMuCisgICAgICAvL05PVEU6IFRoZSAyIHdheSBpbnRlcmRlcGVuZGVuY2llcyBiZXR3ZWVuIHByb3RvY29scywgdHJhbnNwb3J0cywKKyAgICAgIC8vICBjb25uZWN0aW9ucyBhbmQgY2xpZW50cyBpbiB0aGUgTm9kZS5qcyBpbXBsZW1lbnRhdGlvbiBhcmUgaXJyZWd1bGFyCisgICAgICAvLyAgYW5kIG1ha2UgdGhlIGltcGxlbWVudGF0aW9uIGRpZmZpY3VsdCB0byBleHRlbmQgYW5kIG1haW50YWluLiBXZQorICAgICAgLy8gIHNob3VsZCBicmluZyB0aGlzIHN0dWZmIGlubGluZSB3aXRoIHR5cGljYWwgdGhyaWZ0IEkvTyBzdGFjaworICAgICAgLy8gIG9wZXJhdGlvbiBzb29uLgorICAgICAgLy8gIC0tcmEKKyAgICAgIHZhciBzZXJ2aWNlX25hbWUgPSB0aGlzLnNlcUlkMlNlcnZpY2VbaGVhZGVyLnJzZXFpZF07CisgICAgICBpZiAoc2VydmljZV9uYW1lKSB7CisgICAgICAgIGNsaWVudCA9IHRoaXMuY2xpZW50W3NlcnZpY2VfbmFtZV07CisgICAgICAgIGRlbGV0ZSB0aGlzLnNlcUlkMlNlcnZpY2VbaGVhZGVyLnJzZXFpZF07CisgICAgICB9CisgICAgICAvKmpzaGludCAtVzA4MyAqLworICAgICAgY2xpZW50Ll9yZXFzW2R1bW15X3NlcWlkXSA9IGZ1bmN0aW9uKGVyciwgc3VjY2VzcykgeworICAgICAgICB0cmFuc3BvcnRfd2l0aF9kYXRhLmNvbW1pdFBvc2l0aW9uKCk7CisgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGNsaWVudC5fcmVxc1toZWFkZXIucnNlcWlkXTsKKyAgICAgICAgZGVsZXRlIGNsaWVudC5fcmVxc1toZWFkZXIucnNlcWlkXTsKKyAgICAgICAgaWYgKGNsaWVudENhbGxiYWNrKSB7CisgICAgICAgICAgY2xpZW50Q2FsbGJhY2soZXJyLCBzdWNjZXNzKTsKKyAgICAgICAgfQorICAgICAgfTsKKyAgICAgIC8qanNoaW50ICtXMDgzICovCisgICAgICBpZiAoY2xpZW50WydyZWN2XycgKyBoZWFkZXIuZm5hbWVdKSB7CisgICAgICAgIGNsaWVudFsncmVjdl8nICsgaGVhZGVyLmZuYW1lXShwcm90bywgaGVhZGVyLm10eXBlLCBkdW1teV9zZXFpZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkZWxldGUgY2xpZW50Ll9yZXFzW2R1bW15X3NlcWlkXTsKKyAgICAgICAgdGhpcy5lbWl0KCJlcnJvciIsCisgICAgICAgICAgbmV3IHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5XUk9OR19NRVRIT0RfTkFNRSwKKyAgICAgICAgICAgICJSZWNlaXZlZCBhIHJlc3BvbnNlIHRvIGFuIHVua25vd24gUlBDIGZ1bmN0aW9uIikpOworICAgICAgfQorICAgIH0KKyAgfSBjYXRjaCAoZSkgeworICAgIGlmIChlIGluc3RhbmNlb2YgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKSB7CisgICAgICB0cmFuc3BvcnRfd2l0aF9kYXRhLnJvbGxiYWNrUG9zaXRpb24oKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgZTsKKyAgICB9CisgIH0KK307CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSB0cmFuc3BvcnQgaXMgb3BlbiwgWEhSIGFsd2F5cyByZXR1cm5zIHRydWUuCisgKiBAcmVhZG9ubHkKKyAqIEByZXR1cm5zIHtib29sZWFufSBBbHdheXMgVHJ1ZS4KKyAqLworWEhSQ29ubmVjdGlvbi5wcm90b3R5cGUuaXNPcGVuID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0cnVlOworfTsKKworLyoqCisgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24sIHdpdGggWEhSIHRoaXMgaXMgYSBub3AuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbigpIHt9OworCisvKioKKyAqIENsb3NlcyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24sIHdpdGggWEhSIHRoaXMgaXMgYSBub3AuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oKSB7fTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgcmVzcG9uc2UKKyAqIGJ1ZmZlci4KKyAqIEBwYXJhbSB7bnVtYmVyfSBsZW4gLSBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmV0dXJuLgorICogQHJldHVybnMge3N0cmluZ30gQ2hhcmFjdGVycyBzZW50IGJ5IHRoZSBzZXJ2ZXIuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihsZW4pIHsKKyAgdmFyIGF2YWlsID0gdGhpcy53cG9zIC0gdGhpcy5ycG9zOworCisgIGlmIChhdmFpbCA9PT0gMCkgeworICAgIHJldHVybiAnJzsKKyAgfQorCisgIHZhciBnaXZlID0gbGVuOworCisgIGlmIChhdmFpbCA8IGxlbikgeworICAgIGdpdmUgPSBhdmFpbDsKKyAgfQorCisgIHZhciByZXQgPSB0aGlzLnJlYWRfYnVmLnN1YnN0cih0aGlzLnJwb3MsIGdpdmUpOworICB0aGlzLnJwb3MgKz0gZ2l2ZTsKKworICAvL2NsZWFyIGJ1ZiB3aGVuIGNvbXBsZXRlPworICByZXR1cm4gcmV0OworfTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBlbnRpcmUgcmVzcG9uc2UgYnVmZmVyLgorICogQHJldHVybnMge3N0cmluZ30gQ2hhcmFjdGVycyBzZW50IGJ5IHRoZSBzZXJ2ZXIuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLnJlYWRBbGwgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVjdl9idWY7Cit9OworCisvKioKKyAqIFNldHMgdGhlIHNlbmQgYnVmZmVyIHRvIGJ1Zi4KKyAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHNlbmQuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oYnVmKSB7CisgIHRoaXMuc2VuZF9idWYgPSBidWY7CisgIHRoaXMuZmx1c2goKTsKK307CisKKy8qKgorICogUmV0dXJucyB0aGUgc2VuZCBidWZmZXIuCisgKiBAcmVhZG9ubHkKKyAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzZW5kIGJ1ZmZlci4KKyAqLworWEhSQ29ubmVjdGlvbi5wcm90b3R5cGUuZ2V0U2VuZEJ1ZmZlciA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5zZW5kX2J1ZjsKK307CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBUWEhSVHJhbnNwb3J0IG9iamVjdCwgdXNlZCBieSBUaHJpZnQgY2xpZW50cyB0byBjb25uZWN0CisgKiAgICB0byBUaHJpZnQgSFRUUCBiYXNlZCBzZXJ2ZXJzLgorICogQHBhcmFtIHtzdHJpbmd9IGhvc3QgLSBUaGUgaG9zdCBuYW1lIG9yIElQIHRvIGNvbm5lY3QgdG8uCisgKiBAcGFyYW0ge251bWJlcn0gcG9ydCAtIFRoZSBUQ1AgcG9ydCB0byBjb25uZWN0IHRvLgorICogQHBhcmFtIHtYSFJDb25uZWN0T3B0aW9uc30gb3B0aW9ucyAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlLgorICogQHJldHVybnMge1hIUkNvbm5lY3Rpb259IFRoZSBjb25uZWN0aW9uIG9iamVjdC4KKyAqIEBzZWUge0BsaW5rIFhIUkNvbm5lY3RPcHRpb25zfQorICovCitleHBvcnRzLmNyZWF0ZVhIUkNvbm5lY3Rpb24gPSBmdW5jdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKSB7CisgIHJldHVybiBuZXcgWEhSQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKTsKK307CisKK2V4cG9ydHMuY3JlYXRlWEhSQ2xpZW50ID0gY3JlYXRlQ2xpZW50OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9wYWNrYWdlLmpzb24gYi9saWIvbm9kZWpzL3BhY2thZ2UuanNvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNlZmVjNy4uMDAwMDAwMAotLS0gYS9saWIvbm9kZWpzL3BhY2thZ2UuanNvbgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLXsKLSAgIm5hbWUiOiAidGhyaWZ0IiwKLSAgImRlc2NyaXB0aW9uIjogIm5vZGUuanMgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0iLAotICAiaG9tZXBhZ2UiOiAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnLyIsCi0gICJyZXBvc2l0b3J5IjoKLSAgICB7ICJ0eXBlIiA6ICJzdm4iLAotICAgICAgInVybCIgOiAiaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQvdHJ1bmsvIgotICAgIH0sCi0gICJ2ZXJzaW9uIjogIjAuNy4wLWRldiIsCi0gICJhdXRob3IiOgotICAgIHsgIm5hbWUiOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIiwKLSAgICAgICJlbWFpbCI6ICJkZXZAdGhyaWZ0LmFwYWNoZS5vcmciLAotICAgICAgInVybCI6ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciCi0gICAgfSwKLSAgImxpY2Vuc2VzIjoKLSAgICBbIHsgInR5cGUiOiAiQXBhY2hlLTIuMCIsCi0gICAgICAgICJ1cmwiOiAiaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIgotICAgICAgfQotICAgIF0sCi0gICJidWdzIjoKLSAgICB7ICJtYWlsIjogImRldkB0aHJpZnQuYXBhY2hlLm9yZyIsCi0gICAgICAid2ViIjogImh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUIgotICAgIH0sCi0gICJkaXJlY3RvcmllcyIgOiB7ICJsaWIiIDogIi4vbGliL3RocmlmdCIgfSwKLSAgIm1haW4iOiAiLi9saWIvdGhyaWZ0IiwKLSAgImVuZ2luZXMiOiB7ICJub2RlIjogIj49IDAuMi40IiB9Ci19CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvYmluYXJ5LnRlc3QuanMgYi9saWIvbm9kZWpzL3Rlc3QvYmluYXJ5LnRlc3QuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg3Y2QxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvdGVzdC9iaW5hcnkudGVzdC5qcwpAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjb25zdCB0ZXN0ID0gcmVxdWlyZSgidGFwZSIpOworY29uc3QgYmluYXJ5ID0gcmVxdWlyZSgidGhyaWZ0L2JpbmFyeSIpOworCitjb25zdCBjYXNlcyA9IHsKKyAgIlNob3VsZCByZWFkIHNpZ25lZCBieXRlIjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKDEsIGJpbmFyeS5yZWFkQnl0ZSgweDAxKSk7CisgICAgYXNzZXJ0LmVxdWFsKC0xLCBiaW5hcnkucmVhZEJ5dGUoMHhmZikpOworCisgICAgYXNzZXJ0LmVxdWFsKDEyNywgYmluYXJ5LnJlYWRCeXRlKDB4N2YpKTsKKyAgICBhc3NlcnQuZXF1YWwoLTEyOCwgYmluYXJ5LnJlYWRCeXRlKDB4ODApKTsKKyAgICBhc3NlcnQuZW5kKCk7CisgIH0sCisgICJTaG91bGQgd3JpdGUgYnl0ZSI6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIC8vUHJvdG9jb2wgc2ltcGx5IHdyaXRlcyB0byB0aGUgYnVmZmVyLiBOb3RoaW5nIHRvIHRlc3QuLiB5ZXQuCisgICAgYXNzZXJ0Lm9rKHRydWUpOworICAgIGFzc2VydC5lbmQoKTsKKyAgfSwKKyAgIlNob3VsZCByZWFkIEkxNiI6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbCgwLCBiaW5hcnkucmVhZEkxNihbMHgwMCwgMHgwMF0pKTsKKyAgICBhc3NlcnQuZXF1YWwoMSwgYmluYXJ5LnJlYWRJMTYoWzB4MDAsIDB4MDFdKSk7CisgICAgYXNzZXJ0LmVxdWFsKC0xLCBiaW5hcnkucmVhZEkxNihbMHhmZiwgMHhmZl0pKTsKKworICAgIC8vIE1pbiBJMTYKKyAgICBhc3NlcnQuZXF1YWwoLTMyNzY4LCBiaW5hcnkucmVhZEkxNihbMHg4MCwgMHgwMF0pKTsKKyAgICAvLyBNYXggSTE2CisgICAgYXNzZXJ0LmVxdWFsKDMyNzY3LCBiaW5hcnkucmVhZEkxNihbMHg3ZiwgMHhmZl0pKTsKKyAgICBhc3NlcnQuZW5kKCk7CisgIH0sCisKKyAgIlNob3VsZCB3cml0ZSBJMTYiOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDAwLCAweDAwXSwgYmluYXJ5LndyaXRlSTE2KFtdLCAwKSk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbChbMHgwMCwgMHgwMV0sIGJpbmFyeS53cml0ZUkxNihbXSwgMSkpOworICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4ZmYsIDB4ZmZdLCBiaW5hcnkud3JpdGVJMTYoW10sIC0xKSk7CisKKyAgICAvLyBNaW4gSTE2CisgICAgYXNzZXJ0LmRlZXBFcXVhbChbMHg4MCwgMHgwMF0sIGJpbmFyeS53cml0ZUkxNihbXSwgLTMyNzY4KSk7CisgICAgLy8gTWF4IEkxNgorICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4N2YsIDB4ZmZdLCBiaW5hcnkud3JpdGVJMTYoW10sIDMyNzY3KSk7CisgICAgYXNzZXJ0LmVuZCgpOworICB9LAorCisgICJTaG91bGQgcmVhZCBJMzIiOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoMCwgYmluYXJ5LnJlYWRJMzIoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKSk7CisgICAgYXNzZXJ0LmVxdWFsKDEsIGJpbmFyeS5yZWFkSTMyKFsweDAwLCAweDAwLCAweDAwLCAweDAxXSkpOworICAgIGFzc2VydC5lcXVhbCgtMSwgYmluYXJ5LnJlYWRJMzIoWzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZdKSk7CisKKyAgICAvLyBNaW4gSTMyCisgICAgYXNzZXJ0LmVxdWFsKC0yMTQ3NDgzNjQ4LCBiaW5hcnkucmVhZEkzMihbMHg4MCwgMHgwMCwgMHgwMCwgMHgwMF0pKTsKKyAgICAvLyBNYXggSTMyCisgICAgYXNzZXJ0LmVxdWFsKDIxNDc0ODM2NDcsIGJpbmFyeS5yZWFkSTMyKFsweDdmLCAweGZmLCAweGZmLCAweGZmXSkpOworICAgIGFzc2VydC5lbmQoKTsKKyAgfSwKKworICAiU2hvdWxkIHdyaXRlIEkzMiI6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLCBiaW5hcnkud3JpdGVJMzIoW10sIDApKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDAwLCAweDAwLCAweDAwLCAweDAxXSwgYmluYXJ5LndyaXRlSTMyKFtdLCAxKSk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbChbMHhmZiwgMHhmZiwgMHhmZiwgMHhmZl0sIGJpbmFyeS53cml0ZUkzMihbXSwgLTEpKTsKKworICAgIC8vIE1pbiBJMzIKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4ODAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlSTMyKFtdLCAtMjE0NzQ4MzY0OCkKKyAgICApOworICAgIC8vIE1heCBJMzIKKyAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDdmLCAweGZmLCAweGZmLCAweGZmXSwgYmluYXJ5LndyaXRlSTMyKFtdLCAyMTQ3NDgzNjQ3KSk7CisgICAgYXNzZXJ0LmVuZCgpOworICB9LAorCisgICJTaG91bGQgcmVhZCBkb3VibGVzIjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgMCwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkKKyAgICApOworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIDAsCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAxLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4M2YsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgMiwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkKKyAgICApOworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIC0yLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CisKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICBNYXRoLlBJLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4NDAsIDB4OSwgMHgyMSwgMHhmYiwgMHg1NCwgMHg0NCwgMHgyZCwgMHgxOF0pCisgICAgKTsKKworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIEluZmluaXR5LAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4N2YsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgLUluZmluaXR5LAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4ZmYsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CisKKyAgICBhc3NlcnQub2soCisgICAgICBpc05hTihiaW5hcnkucmVhZERvdWJsZShbMHg3ZiwgMHhmOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pKQorICAgICk7CisKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAxIC8gMywKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDNmLCAweGQ1LCAweDU1LCAweDU1LCAweDU1LCAweDU1LCAweDU1LCAweDU1XSkKKyAgICApOworCisgICAgLy8gTWluIHN1Ym5vcm1hbCBwb3NpdGl2ZSBkb3VibGUKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICA0Ljk0MDY1NjQ1ODQxMjQ2NTRlLTMyNCwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxXSkKKyAgICApOworICAgIC8vIE1pbiBub3JtYWwgcG9zaXRpdmUgZG91YmxlCisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDgsCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKyAgICAvLyBNYXggcG9zaXRpdmUgZG91YmxlCisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgMS43OTc2OTMxMzQ4NjIzMTU3ZTMwOCwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDdmLCAweGVmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmXSkKKyAgICApOworICAgIGFzc2VydC5lbmQoKTsKKyAgfSwKKworICAiU2hvdWxkIHdyaXRlIGRvdWJsZXMiOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAwKQorICAgICk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweDNmLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgMSkKKyAgICApOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIDIpCisgICAgKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAtMikKKyAgICApOworCisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweDQwLCAweDksIDB4MjEsIDB4ZmIsIDB4NTQsIDB4NDQsIDB4MmQsIDB4MThdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCBNYXRoLlBJKQorICAgICk7CisKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4N2YsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCBJbmZpbml0eSkKKyAgICApOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHhmZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIC1JbmZpbml0eSkKKyAgICApOworCisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweDdmLCAweGY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgTmFOKQorICAgICk7CisKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4M2YsIDB4ZDUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTVdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAxIC8gMykKKyAgICApOworCisgICAgLy8gTWluIHN1Ym5vcm1hbCBwb3NpdGl2ZSBkb3VibGUKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDFdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCA0Ljk0MDY1NjQ1ODQxMjQ2NTRlLTMyNCkKKyAgICApOworICAgIC8vIE1pbiBub3JtYWwgcG9zaXRpdmUgZG91YmxlCisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDgpCisgICAgKTsKKyAgICAvLyBNYXggcG9zaXRpdmUgZG91YmxlCisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweDdmLCAweGVmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgMS43OTc2OTMxMzQ4NjIzMTU3ZTMwOCkKKyAgICApOworICAgIGFzc2VydC5lbmQoKTsKKyAgfQorfTsKKworT2JqZWN0LmtleXMoY2FzZXMpLmZvckVhY2goZnVuY3Rpb24oY2FzZU5hbWUpIHsKKyAgdGVzdChjYXNlTmFtZSwgY2FzZXNbY2FzZU5hbWVdKTsKK30pOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L2NlcnRpZmljYXRlcy5SRUFETUUgYi9saWIvbm9kZWpzL3Rlc3QvY2VydGlmaWNhdGVzLlJFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmM1MDdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L2NlcnRpZmljYXRlcy5SRUFETUUKQEAgLTAsMCArMSw3IEBACitzZXJ2ZXIuY3J0IEFORCBzZXJ2ZXIua2V5IEFSRSBQUk9WSURFRCBGT1IgVEVTVCBQVVJQT1NFIEFORCBTSE9VTEQgKk5FVkVSKiBCRSBVU0VEIElOIFBST0RVQ1RJT04KKworCitPcmlnaW4gb2YgdGhlIHRlc3Qga2V5IGFuZCBjZXJ0IGlzIHRoZSBmb2xkZXIgdGVzdC9rZXlzIG9mIEFwYWNoZSBUaHJpZnQgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9uCisKK1dlIG5lZWQgY29waWVzIGZvciBucG0gZGVwbG95bWVudAorCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvY2xpZW50LmpzIGIvbGliL25vZGVqcy90ZXN0L2NsaWVudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWUzYTVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L2NsaWVudC5qcwpAQCAtMCwwICsxLDE3MCBAQAorIyEvdXNyL2Jpbi9lbnYgbm9kZQorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NvbnN0IGFzc2VydCA9IHJlcXVpcmUoImFzc2VydCIpOworY29uc3QgdGhyaWZ0ID0gcmVxdWlyZSgidGhyaWZ0Iik7Citjb25zdCBoZWxwZXJzID0gcmVxdWlyZSgiLi9oZWxwZXJzIik7CisKK2NvbnN0IFRocmlmdFRlc3QgPSByZXF1aXJlKGAuLyR7aGVscGVycy5nZW5QYXRofS9UaHJpZnRUZXN0YCk7Citjb25zdCBUaHJpZnRUZXN0RHJpdmVyID0gcmVxdWlyZSgiLi90ZXN0X2RyaXZlciIpLlRocmlmdFRlc3REcml2ZXI7Citjb25zdCBUaHJpZnRUZXN0RHJpdmVyUHJvbWlzZSA9IHJlcXVpcmUoIi4vdGVzdF9kcml2ZXIiKQorICAuVGhyaWZ0VGVzdERyaXZlclByb21pc2U7Citjb25zdCBTZWNvbmRTZXJ2aWNlID0gcmVxdWlyZShgLi8ke2hlbHBlcnMuZ2VuUGF0aH0vU2Vjb25kU2VydmljZWApOworCitjb25zdCBwcm9ncmFtID0gcmVxdWlyZSgiY29tbWFuZGVyIik7CisKK3Byb2dyYW0KKyAgLm9wdGlvbigKKyAgICAiLXAsIC0tcHJvdG9jb2wgPHByb3RvY29sPiIsCisgICAgIlNldCB0aHJpZnQgcHJvdG9jb2wgKGJpbmFyeXxjb21wYWN0fGpzb24pIFtwcm90b2NvbF0iCisgICkKKyAgLm9wdGlvbigKKyAgICAiLXQsIC0tdHJhbnNwb3J0IDx0cmFuc3BvcnQ+IiwKKyAgICAiU2V0IHRocmlmdCB0cmFuc3BvcnQgKGJ1ZmZlcmVkfGZyYW1lZHxodHRwKSBbdHJhbnNwb3J0XSIKKyAgKQorICAub3B0aW9uKCItLXBvcnQgPHBvcnQ+IiwgIlNldCB0aHJpZnQgc2VydmVyIHBvcnQgbnVtYmVyIHRvIGNvbm5lY3QiLCA5MDkwKQorICAub3B0aW9uKCItLWhvc3QgPGhvc3Q+IiwgIlNldCB0aHJpZnQgc2VydmVyIGhvc3QgdG8gY29ubmVjdCIsICJsb2NhbGhvc3QiKQorICAub3B0aW9uKAorICAgICItLWRvbWFpbi1zb2NrZXQgPHBhdGg+IiwKKyAgICAiU2V0IHRocmlmdCBzZXJ2ZXIgdW5peCBkb21haW4gc29ja2V0IHRvIGNvbm5lY3QiCisgICkKKyAgLm9wdGlvbigiLS1zc2wiLCAidXNlIFNTTCB0cmFuc3BvcnQiKQorICAub3B0aW9uKCItLWNhbGxiYWNrIiwgInRlc3Qgd2l0aCBjYWxsYmFjayBzdHlsZSBmdW5jdGlvbnMiKQorICAub3B0aW9uKAorICAgICItdCwgLS10eXBlIDx0eXBlPiIsCisgICAgIlNlbGVjdCBzZXJ2ZXIgdHlwZSAoaHR0cHxtdWx0aXBsZXh8dGNwfHdlYnNvY2tldCkiLAorICAgICJ0Y3AiCisgICkKKyAgLm9wdGlvbigiLS1lczYiLCAiVXNlIGVzNiBjb2RlIikKKyAgLm9wdGlvbigiLS1lczUiLCAiVXNlIGVzNSBjb2RlIikKKyAgLnBhcnNlKHByb2Nlc3MuYXJndik7CisKK2NvbnN0IGhvc3QgPSBwcm9ncmFtLmhvc3Q7Citjb25zdCBwb3J0ID0gcHJvZ3JhbS5wb3J0OworY29uc3QgZG9tYWluU29ja2V0ID0gcHJvZ3JhbS5kb21haW5Tb2NrZXQ7Citjb25zdCBzc2wgPSBwcm9ncmFtLnNzbDsKK2xldCB0eXBlID0gcHJvZ3JhbS50eXBlOworCisvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGNyb3NzIHRlc3QgaW52b2NhdGlvbiBmb3IgaHR0cCB0cmFuc3BvcnQgdGVzdGluZyAqLworaWYgKHByb2dyYW0udHJhbnNwb3J0ID09PSAiaHR0cCIpIHsKKyAgcHJvZ3JhbS50cmFuc3BvcnQgPSAiYnVmZmVyZWQiOworICB0eXBlID0gImh0dHAiOworfQorCitjb25zdCBvcHRpb25zID0geworICB0cmFuc3BvcnQ6IGhlbHBlcnMudHJhbnNwb3J0c1twcm9ncmFtLnRyYW5zcG9ydF0sCisgIHByb3RvY29sOiBoZWxwZXJzLnByb3RvY29sc1twcm9ncmFtLnByb3RvY29sXQorfTsKKworaWYgKHR5cGUgPT09ICJodHRwIiB8fCB0eXBlID09PSAid2Vic29ja2V0IikgeworICBvcHRpb25zLnBhdGggPSAiL3Rlc3QiOworfQorCitpZiAodHlwZSA9PT0gImh0dHAiKSB7CisgIG9wdGlvbnMuaGVhZGVycyA9IHsgQ29ubmVjdGlvbjogImNsb3NlIiB9OworfQorCitpZiAoc3NsKSB7CisgIGlmICh0eXBlID09PSAidGNwIiB8fCB0eXBlID09PSAibXVsdGlwbGV4IikgeworICAgIG9wdGlvbnMucmVqZWN0VW5hdXRob3JpemVkID0gZmFsc2U7CisgIH0gZWxzZSBpZiAodHlwZSA9PT0gImh0dHAiKSB7CisgICAgb3B0aW9ucy5ub2RlT3B0aW9ucyA9IHsgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZSB9OworICAgIG9wdGlvbnMuaHR0cHMgPSB0cnVlOworICB9IGVsc2UgaWYgKHR5cGUgPT09ICJ3ZWJzb2NrZXQiKSB7CisgICAgb3B0aW9ucy53c09wdGlvbnMgPSB7IHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2UgfTsKKyAgICBvcHRpb25zLnNlY3VyZSA9IHRydWU7CisgIH0KK30KKworbGV0IGNvbm5lY3Rpb247CitsZXQgY2xpZW50OworY29uc3QgdGVzdERyaXZlciA9IHByb2dyYW0uY2FsbGJhY2sKKyAgPyBUaHJpZnRUZXN0RHJpdmVyCisgIDogVGhyaWZ0VGVzdERyaXZlclByb21pc2U7CitpZiAoaGVscGVycy5lY21hTW9kZSA9PT0gImVzNiIgJiYgcHJvZ3JhbS5jYWxsYmFjaykgeworICBjb25zb2xlLmxvZygiRVM2IGRvZXMgbm90IHN1cHBvcnQgY2FsbGJhY2sgc3R5bGUiKTsKKyAgcHJvY2Vzcy5leGl0KDApOworfQorCitpZiAodHlwZSA9PT0gInRjcCIgfHwgdHlwZSA9PT0gIm11bHRpcGxleCIpIHsKKyAgaWYgKGRvbWFpblNvY2tldCkgeworICAgIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlVURTQ29ubmVjdGlvbihkb21haW5Tb2NrZXQsIG9wdGlvbnMpOworICB9IGVsc2UgeworICAgIGNvbm5lY3Rpb24gPSBzc2wKKyAgICAgID8gdGhyaWZ0LmNyZWF0ZVNTTENvbm5lY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucykKKyAgICAgIDogdGhyaWZ0LmNyZWF0ZUNvbm5lY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucyk7CisgIH0KK30gZWxzZSBpZiAodHlwZSA9PT0gImh0dHAiKSB7CisgIGlmIChkb21haW5Tb2NrZXQpIHsKKyAgICBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUh0dHBVRFNDb25uZWN0aW9uKGRvbWFpblNvY2tldCwgb3B0aW9ucyk7CisgIH0gZWxzZSB7CisgICAgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVIdHRwQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKTsKKyAgfQorfSBlbHNlIGlmICh0eXBlID09PSAid2Vic29ja2V0IikgeworICBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZVdTQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKTsKKyAgY29ubmVjdGlvbi5vcGVuKCk7Cit9CisKK2Nvbm5lY3Rpb24ub24oImVycm9yIiwgZnVuY3Rpb24oZXJyKSB7CisgIGFzc2VydChmYWxzZSwgZXJyKTsKK30pOworCitpZiAodHlwZSA9PT0gInRjcCIpIHsKKyAgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUNsaWVudChUaHJpZnRUZXN0LCBjb25uZWN0aW9uKTsKKyAgcnVuVGVzdHMoKTsKK30gZWxzZSBpZiAodHlwZSA9PT0gIm11bHRpcGxleCIpIHsKKyAgY29uc3QgbXAgPSBuZXcgdGhyaWZ0Lk11bHRpcGxleGVyKCk7CisgIGNsaWVudCA9IG1wLmNyZWF0ZUNsaWVudCgiVGhyaWZ0VGVzdCIsIFRocmlmdFRlc3QsIGNvbm5lY3Rpb24pOworICBjb25zdCBzZWNvbmRjbGllbnQgPSBtcC5jcmVhdGVDbGllbnQoCisgICAgIlNlY29uZFNlcnZpY2UiLAorICAgIFNlY29uZFNlcnZpY2UsCisgICAgY29ubmVjdGlvbgorICApOworCisgIGNvbm5lY3Rpb24ub24oImNvbm5lY3QiLCBmdW5jdGlvbigpIHsKKyAgICBzZWNvbmRjbGllbnQuc2Vjb25kdGVzdFN0cmluZygiVGVzdCIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgIGFzc2VydCghZXJyKTsKKyAgICAgIGFzc2VydC5lcXVhbCgndGVzdFN0cmluZygiVGVzdCIpJywgcmVzcG9uc2UpOworICAgIH0pOworCisgICAgcnVuVGVzdHMoKTsKKyAgfSk7Cit9IGVsc2UgaWYgKHR5cGUgPT09ICJodHRwIikgeworICBjbGllbnQgPSB0aHJpZnQuY3JlYXRlSHR0cENsaWVudChUaHJpZnRUZXN0LCBjb25uZWN0aW9uKTsKKyAgcnVuVGVzdHMoKTsKK30gZWxzZSBpZiAodHlwZSA9PT0gIndlYnNvY2tldCIpIHsKKyAgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZVdTQ2xpZW50KFRocmlmdFRlc3QsIGNvbm5lY3Rpb24pOworICBydW5UZXN0cygpOworfQorCitmdW5jdGlvbiBydW5UZXN0cygpIHsKKyAgdGVzdERyaXZlcihjbGllbnQsIGZ1bmN0aW9uKHN0YXR1cykgeworICAgIGNvbnNvbGUubG9nKHN0YXR1cyk7CisgICAgaWYgKHR5cGUgIT09ICJodHRwIiAmJiB0eXBlICE9PSAid2Vic29ja2V0IikgeworICAgICAgY29ubmVjdGlvbi5lbmQoKTsKKyAgICB9CisgICAgaWYgKHR5cGUgIT09ICJtdWx0aXBsZXgiKSB7CisgICAgICBwcm9jZXNzLmV4aXQoMCk7CisgICAgfQorICB9KTsKK30KKworZXhwb3J0cy5leHByZXNzb1Rlc3QgPSBmdW5jdGlvbigpIHt9OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L2RlZXAtY29uc3RydWN0b3IudGVzdC5qcyBiL2xpYi9ub2RlanMvdGVzdC9kZWVwLWNvbnN0cnVjdG9yLnRlc3QuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA0ZGFjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvdGVzdC9kZWVwLWNvbnN0cnVjdG9yLnRlc3QuanMKQEAgLTAsMCArMSwzMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY29uc3QgdHR5cGVzID0gcmVxdWlyZSgiLi9nZW4tbm9kZWpzL0pzRGVlcENvbnN0cnVjdG9yVGVzdF90eXBlcyIpOworY29uc3QgdGhyaWZ0ID0gcmVxdWlyZSgidGhyaWZ0Iik7Citjb25zdCB0ZXN0ID0gcmVxdWlyZSgidGFwZSIpOworY29uc3QgYnVmZmVyRXF1YWxzID0gcmVxdWlyZSgiYnVmZmVyLWVxdWFscyIpOworCitmdW5jdGlvbiBzZXJpYWxpemVCaW5hcnkoZGF0YSkgeworICBsZXQgYnVmZjsKKyAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQobnVsbCwgZnVuY3Rpb24obXNnKSB7CisgICAgYnVmZiA9IG1zZzsKKyAgfSk7CisgIGNvbnN0IHByb3QgPSBuZXcgdGhyaWZ0LlRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICBkYXRhLndyaXRlKHByb3QpOworICBwcm90LmZsdXNoKCk7CisgIHJldHVybiBidWZmOworfQorCitmdW5jdGlvbiBkZXNlcmlhbGl6ZUJpbmFyeShzZXJpYWxpemVkLCB0eXBlKSB7CisgIGNvbnN0IHQgPSBuZXcgdGhyaWZ0LlRGcmFtZWRUcmFuc3BvcnQoc2VyaWFsaXplZCk7CisgIGNvbnN0IHAgPSBuZXcgdGhyaWZ0LlRCaW5hcnlQcm90b2NvbCh0KTsKKyAgY29uc3QgZGF0YSA9IG5ldyB0eXBlKCk7CisgIGRhdGEucmVhZChwKTsKKyAgcmV0dXJuIGRhdGE7Cit9CisKK2Z1bmN0aW9uIHNlcmlhbGl6ZUpTT04oZGF0YSkgeworICBsZXQgYnVmZjsKKyAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQobnVsbCwgZnVuY3Rpb24obXNnKSB7CisgICAgYnVmZiA9IG1zZzsKKyAgfSk7CisgIGNvbnN0IHByb3RvY29sID0gbmV3IHRocmlmdC5USlNPTlByb3RvY29sKHRyYW5zcG9ydCk7CisgIHByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKCIiLCAwLCAwKTsKKyAgZGF0YS53cml0ZShwcm90b2NvbCk7CisgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworICBwcm90b2NvbC5mbHVzaCgpOworICByZXR1cm4gYnVmZjsKK30KKworZnVuY3Rpb24gZGVzZXJpYWxpemVKU09OKHNlcmlhbGl6ZWQsIHR5cGUpIHsKKyAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IHRocmlmdC5URnJhbWVkVHJhbnNwb3J0KHNlcmlhbGl6ZWQpOworICBjb25zdCBwcm90b2NvbCA9IG5ldyB0aHJpZnQuVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOworICBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgIGNvbnN0IGRhdGEgPSBuZXcgdHlwZSgpOworICBkYXRhLnJlYWQocHJvdG9jb2wpOworICBwcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpOworICByZXR1cm4gZGF0YTsKK30KKworZnVuY3Rpb24gY3JlYXRlVGhyaWZ0T2JqKCkgeworICByZXR1cm4gbmV3IHR0eXBlcy5Db21wbGV4KHsKKyAgICBzdHJ1Y3RfZmllbGQ6IG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJhIiB9KSwKKworICAgIHN0cnVjdF9saXN0X2ZpZWxkOiBbCisgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiYiIgfSksCisgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiYyIgfSkKKyAgICBdLAorCisgICAgc3RydWN0X3NldF9maWVsZDogWworICAgICAgbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImQiIH0pLAorICAgICAgbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImUiIH0pCisgICAgXSwKKworICAgIHN0cnVjdF9tYXBfZmllbGQ6IHsKKyAgICAgIEE6IG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJmIiB9KSwKKyAgICAgIEI6IG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJnIiB9KQorICAgIH0sCisKKyAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQ6IFsKKyAgICAgIFsKKyAgICAgICAgeworICAgICAgICAgIEM6IFsKKyAgICAgICAgICAgIG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJoIiB9KSwKKyAgICAgICAgICAgIG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJpIiB9KQorICAgICAgICAgIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIF0sCisKKyAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyOiB7CisgICAgICBEOiBbCisgICAgICAgIHsKKyAgICAgICAgICBEQTogbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImoiIH0pCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICBEQjogbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImsiIH0pCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorCisgICAgbGlzdF9vZl9saXN0X2ZpZWxkOiBbCisgICAgICBbImwwMCIsICJsMDEiLCAibDAyIl0sCisgICAgICBbImwxMCIsICJsMTEiLCAibDEyIl0sCisgICAgICBbImwyMCIsICJsMjEiLCAibDIyIl0KKyAgICBdLAorCisgICAgbGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGQ6IFsKKyAgICAgIFsKKyAgICAgICAgWyJtMDAwIiwgIm0wMDEiLCAibTAwMiJdLAorICAgICAgICBbIm0wMTAiLCAibTAxMSIsICJtMDEyIl0sCisgICAgICAgIFsibTAyMCIsICJtMDIxIiwgIm0wMjIiXQorICAgICAgXSwKKyAgICAgIFsKKyAgICAgICAgWyJtMTAwIiwgIm0xMDEiLCAibTEwMiJdLAorICAgICAgICBbIm0xMTAiLCAibTExMSIsICJtMTEyIl0sCisgICAgICAgIFsibTEyMCIsICJtMTIxIiwgIm0xMjIiXQorICAgICAgXSwKKyAgICAgIFsKKyAgICAgICAgWyJtMjAwIiwgIm0yMDEiLCAibTIwMiJdLAorICAgICAgICBbIm0yMTAiLCAibTIxMSIsICJtMjEyIl0sCisgICAgICAgIFsibTIyMCIsICJtMjIxIiwgIm0yMjIiXQorICAgICAgXQorICAgIF0KKyAgfSk7Cit9CisKK2Z1bmN0aW9uIGNyZWF0ZUpzT2JqKCkgeworICByZXR1cm4geworICAgIHN0cnVjdF9maWVsZDogeyB2YWx1ZTogImEiIH0sCisKKyAgICBzdHJ1Y3RfbGlzdF9maWVsZDogW3sgdmFsdWU6ICJiIiB9LCB7IHZhbHVlOiAiYyIgfV0sCisKKyAgICBzdHJ1Y3Rfc2V0X2ZpZWxkOiBbeyB2YWx1ZTogImQiIH0sIHsgdmFsdWU6ICJlIiB9XSwKKworICAgIHN0cnVjdF9tYXBfZmllbGQ6IHsKKyAgICAgIEE6IHsgdmFsdWU6ICJmIiB9LAorICAgICAgQjogeyB2YWx1ZTogImciIH0KKyAgICB9LAorCisgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkOiBbCisgICAgICBbCisgICAgICAgIHsKKyAgICAgICAgICBDOiBbeyB2YWx1ZTogImgiIH0sIHsgdmFsdWU6ICJpIiB9XQorICAgICAgICB9CisgICAgICBdCisgICAgXSwKKworICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDI6IHsKKyAgICAgIEQ6IFsKKyAgICAgICAgeworICAgICAgICAgIERBOiB7IHZhbHVlOiAiaiIgfQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgREI6IHsgdmFsdWU6ICJrIiB9CisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorCisgICAgbGlzdF9vZl9saXN0X2ZpZWxkOiBbCisgICAgICBbImwwMCIsICJsMDEiLCAibDAyIl0sCisgICAgICBbImwxMCIsICJsMTEiLCAibDEyIl0sCisgICAgICBbImwyMCIsICJsMjEiLCAibDIyIl0KKyAgICBdLAorCisgICAgbGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGQ6IFsKKyAgICAgIFsKKyAgICAgICAgWyJtMDAwIiwgIm0wMDEiLCAibTAwMiJdLAorICAgICAgICBbIm0wMTAiLCAibTAxMSIsICJtMDEyIl0sCisgICAgICAgIFsibTAyMCIsICJtMDIxIiwgIm0wMjIiXQorICAgICAgXSwKKyAgICAgIFsKKyAgICAgICAgWyJtMTAwIiwgIm0xMDEiLCAibTEwMiJdLAorICAgICAgICBbIm0xMTAiLCAibTExMSIsICJtMTEyIl0sCisgICAgICAgIFsibTEyMCIsICJtMTIxIiwgIm0xMjIiXQorICAgICAgXSwKKyAgICAgIFsKKyAgICAgICAgWyJtMjAwIiwgIm0yMDEiLCAibTIwMiJdLAorICAgICAgICBbIm0yMTAiLCAibTIxMSIsICJtMjEyIl0sCisgICAgICAgIFsibTIyMCIsICJtMjIxIiwgIm0yMjIiXQorICAgICAgXQorICAgIF0KKyAgfTsKK30KKworZnVuY3Rpb24gYXNzZXJ0VmFsdWVzKG9iaiwgYXNzZXJ0KSB7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9maWVsZC52YWx1ZSwgImEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X2xpc3RfZmllbGRbMF0udmFsdWUsICJiIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9saXN0X2ZpZWxkWzFdLnZhbHVlLCAiYyIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3Rfc2V0X2ZpZWxkWzBdLnZhbHVlLCAiZCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3Rfc2V0X2ZpZWxkWzFdLnZhbHVlLCAiZSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbWFwX2ZpZWxkLkEudmFsdWUsICJmIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9tYXBfZmllbGQuQi52YWx1ZSwgImciKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkWzBdWzBdLkNbMF0udmFsdWUsICJoIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzFdLnZhbHVlLCAiaSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMF0uREEudmFsdWUsICJqIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIuRFsxXS5EQi52YWx1ZSwgImsiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzBdWzBdLCAibDAwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFswXVsxXSwgImwwMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMF1bMl0sICJsMDIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzFdWzBdLCAibDEwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsxXVsxXSwgImwxMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMV1bMl0sICJsMTIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzJdWzBdLCAibDIwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsyXVsxXSwgImwyMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMl1bMl0sICJsMjIiKTsKKworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVswXVswXSwgIm0wMDAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMF1bMV0sICJtMDAxIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzBdWzJdLCAibTAwMiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVsxXVswXSwgIm0wMTAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMV1bMV0sICJtMDExIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzFdWzJdLCAibTAxMiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVsyXVswXSwgIm0wMjAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMl1bMV0sICJtMDIxIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzJdWzJdLCAibTAyMiIpOworCisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzBdWzBdLCAibTEwMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVswXVsxXSwgIm0xMDEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMF1bMl0sICJtMTAyIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzFdWzBdLCAibTExMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVsxXVsxXSwgIm0xMTEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMV1bMl0sICJtMTEyIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzJdWzBdLCAibTEyMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVsyXVsxXSwgIm0xMjEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMl1bMl0sICJtMTIyIik7CisKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMF1bMF0sICJtMjAwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzBdWzFdLCAibTIwMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVswXVsyXSwgIm0yMDIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMV1bMF0sICJtMjEwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzFdWzFdLCAibTIxMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVsxXVsyXSwgIm0yMTIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMl1bMF0sICJtMjIwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzJdWzFdLCAibTIyMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVsyXVsyXSwgIm0yMjIiKTsKK30KKworZnVuY3Rpb24gY3JlYXRlVGVzdENhc2VzKHNlcmlhbGl6ZSwgZGVzZXJpYWxpemUpIHsKKyAgY29uc3QgY2FzZXMgPSB7CisgICAgIlNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBzaG91bGQgcmV0dXJuIGVxdWFsIG9iamVjdCI6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgICAgY29uc3QgdE9iaiA9IGNyZWF0ZVRocmlmdE9iaigpOworICAgICAgY29uc3QgcmVjZWl2ZWQgPSBkZXNlcmlhbGl6ZShzZXJpYWxpemUodE9iaiksIHR0eXBlcy5Db21wbGV4KTsKKyAgICAgIGFzc2VydC5vayh0T2JqICE9PSByZWNlaXZlZCwgIm5vdCB0aGUgc2FtZSBvYmplY3QiKTsKKyAgICAgIGFzc2VydC5kZWVwRXF1YWwodE9iaiwgcmVjZWl2ZWQpOworICAgICAgYXNzZXJ0LmVuZCgpOworICAgIH0sCisKKyAgICAiTmVzdGVkIHN0cnVjdHMgYW5kIGNvbnRhaW5lcnMgaW5pdGlhbGl6ZWQgZnJvbSBwbGFpbiBqcyBvYmplY3RzIHNob3VsZCBzZXJpYWxpemUgc2FtZSBhcyBpZiBpbml0aWFsaXplZCBmcm9tIHRocmlmdCBvYmplY3RzIjogZnVuY3Rpb24oCisgICAgICBhc3NlcnQKKyAgICApIHsKKyAgICAgIGNvbnN0IHRPYmoxID0gY3JlYXRlVGhyaWZ0T2JqKCk7CisgICAgICBjb25zdCB0T2JqMiA9IG5ldyB0dHlwZXMuQ29tcGxleChjcmVhdGVKc09iaigpKTsKKyAgICAgIGFzc2VydFZhbHVlcyh0T2JqMiwgYXNzZXJ0KTsKKyAgICAgIGNvbnN0IHMxID0gc2VyaWFsaXplKHRPYmoxKTsKKyAgICAgIGNvbnN0IHMyID0gc2VyaWFsaXplKHRPYmoyKTsKKyAgICAgIGFzc2VydC5vayhidWZmZXJFcXVhbHMoczEsIHMyKSk7CisgICAgICBhc3NlcnQuZW5kKCk7CisgICAgfSwKKworICAgICJNb2RpZmljYXRpb25zIHRvIGFyZ3Mgb2JqZWN0IHNob3VsZCBub3QgYWZmZWN0IGNvbnN0cnVjdGVkIFRocmlmdCBvYmplY3QiOiBmdW5jdGlvbigKKyAgICAgIGFzc2VydAorICAgICkgeworICAgICAgY29uc3QgYXJncyA9IGNyZWF0ZUpzT2JqKCk7CisgICAgICBhc3NlcnRWYWx1ZXMoYXJncywgYXNzZXJ0KTsKKworICAgICAgY29uc3QgdE9iaiA9IG5ldyB0dHlwZXMuQ29tcGxleChhcmdzKTsKKyAgICAgIGFzc2VydFZhbHVlcyh0T2JqLCBhc3NlcnQpOworCisgICAgICBhcmdzLnN0cnVjdF9maWVsZC52YWx1ZSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbGlzdF9maWVsZFswXS52YWx1ZSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbGlzdF9maWVsZFsxXS52YWx1ZSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3Rfc2V0X2ZpZWxkWzBdLnZhbHVlID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9zZXRfZmllbGRbMV0udmFsdWUgPSAiWlpaIjsKKyAgICAgIGFyZ3Muc3RydWN0X21hcF9maWVsZC5BLnZhbHVlID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9tYXBfZmllbGQuQi52YWx1ZSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1swXSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1sxXSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMF0uREEgPSAiWlpaIjsKKyAgICAgIGFyZ3Muc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzBdLkRCID0gIlpaWiI7CisKKyAgICAgIGFzc2VydFZhbHVlcyh0T2JqLCBhc3NlcnQpOworICAgICAgYXNzZXJ0LmVuZCgpOworICAgIH0sCisKKyAgICAibnVsbHMgYXJlIG9rIjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgICBjb25zdCB0T2JqID0gbmV3IHR0eXBlcy5Db21wbGV4KHsKKyAgICAgICAgc3RydWN0X2ZpZWxkOiBudWxsLAorICAgICAgICBzdHJ1Y3RfbGlzdF9maWVsZDogbnVsbCwKKyAgICAgICAgc3RydWN0X3NldF9maWVsZDogbnVsbCwKKyAgICAgICAgc3RydWN0X21hcF9maWVsZDogbnVsbCwKKyAgICAgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkOiBudWxsLAorICAgICAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyOiBudWxsCisgICAgICB9KTsKKyAgICAgIGNvbnN0IHJlY2VpdmVkID0gZGVzZXJpYWxpemUoc2VyaWFsaXplKHRPYmopLCB0dHlwZXMuQ29tcGxleCk7CisgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodE9iai5zdHJ1Y3RfZmllbGQsIG51bGwpOworICAgICAgYXNzZXJ0Lm9rKHRPYmogIT09IHJlY2VpdmVkKTsKKyAgICAgIGFzc2VydC5kZWVwRXF1YWwodE9iaiwgcmVjZWl2ZWQpOworICAgICAgYXNzZXJ0LmVuZCgpOworICAgIH0sCisKKyAgICAiQ2FuIG1ha2UgbGlzdCB3aXRoIG9iamVjdHMiOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAgIGNvbnN0IHRPYmogPSBuZXcgdHR5cGVzLkNvbXBsZXhMaXN0KHsKKyAgICAgICAgc3RydWN0X2xpc3RfZmllbGQ6IFtuZXcgdHR5cGVzLkNvbXBsZXgoe30pXQorICAgICAgfSk7CisgICAgICBjb25zdCBpbm5lck9iaiA9IHRPYmouc3RydWN0X2xpc3RfZmllbGRbMF07CisgICAgICBhc3NlcnQub2soaW5uZXJPYmogaW5zdGFuY2VvZiB0dHlwZXMuQ29tcGxleCk7CisgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaW5uZXJPYmouc3RydWN0X2ZpZWxkLCBudWxsKTsKKyAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpbm5lck9iai5zdHJ1Y3RfbGlzdF9maWVsZCwgbnVsbCk7CisgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaW5uZXJPYmouc3RydWN0X3NldF9maWVsZCwgbnVsbCk7CisgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaW5uZXJPYmouc3RydWN0X21hcF9maWVsZCwgbnVsbCk7CisgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaW5uZXJPYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkLCBudWxsKTsKKyAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpbm5lck9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLCBudWxsKTsKKyAgICAgIGFzc2VydC5lbmQoKTsKKyAgICB9CisgIH07CisgIHJldHVybiBjYXNlczsKK30KKworZnVuY3Rpb24gcnVuKG5hbWUsIGNhc2VzKSB7CisgIE9iamVjdC5rZXlzKGNhc2VzKS5mb3JFYWNoKGZ1bmN0aW9uKGNhc2VOYW1lKSB7CisgICAgdGVzdChuYW1lICsgIjogIiArIGNhc2VOYW1lLCBjYXNlc1tjYXNlTmFtZV0pOworICB9KTsKK30KKworcnVuKCJiaW5hcnkiLCBjcmVhdGVUZXN0Q2FzZXMoc2VyaWFsaXplQmluYXJ5LCBkZXNlcmlhbGl6ZUJpbmFyeSkpOworcnVuKCJqc29uIiwgY3JlYXRlVGVzdENhc2VzKHNlcmlhbGl6ZUpTT04sIGRlc2VyaWFsaXplSlNPTikpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L2V4Y2VwdGlvbnMuanMgYi9saWIvbm9kZWpzL3Rlc3QvZXhjZXB0aW9ucy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjI3OThhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L2V4Y2VwdGlvbnMuanMKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworInVzZSBzdHJpY3QiOworY29uc3QgdGVzdCA9IHJlcXVpcmUoInRhcGUiKTsKK2NvbnN0IHRocmlmdCA9IHJlcXVpcmUoIi4uL2xpYi90aHJpZnQvdGhyaWZ0LmpzIik7Citjb25zdCBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCIuLi9saWIvdGhyaWZ0L2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvciIpOworCit0ZXN0KCJUQXBwbGljYXRpb25FeGNlcHRpb24iLCBmdW5jdGlvbiB0KGFzc2VydCkgeworICBjb25zdCBlID0gbmV3IHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oMSwgImZvbyIpOworICBhc3NlcnQub2soCisgICAgZSBpbnN0YW5jZW9mIHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24sCisgICAgImlzIGluc3RhbmNlb2YgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIgorICApOworICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIHRocmlmdC5URXhjZXB0aW9uLCAiaXMgaW5zdGFuY2VvZiBURXhjZXB0aW9uIik7CisgIGFzc2VydC5vayhlIGluc3RhbmNlb2YgRXJyb3IsICJpcyBpbnN0YW5jZW9mIEVycm9yIik7CisgIGFzc2VydC5lcXVhbCh0eXBlb2YgZS5zdGFjaywgInN0cmluZyIsICJoYXMgc3RhY2sgdHJhY2UiKTsKKyAgYXNzZXJ0Lm9rKAorICAgIC9eVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBmb28vLnRlc3QoZS5zdGFjayksCisgICAgIlN0YWNrIHRyYWNlIGhhcyBjb3JyZWN0IGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UiCisgICk7CisgIGFzc2VydC5vaygKKyAgICBlLnN0YWNrLmluZGV4T2YoInRlc3QvZXhjZXB0aW9ucy5qczo3OjExIikgIT09IC0xLAorICAgICJzdGFjayB0cmFjZSBzdGFydHMgb24gY29ycmVjdCBsaW5lIGFuZCBjb2x1bW4iCisgICk7CisgIGFzc2VydC5lcXVhbCgKKyAgICBlLm5hbWUsCisgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsCisgICAgImhhcyBmdW5jdGlvbiBuYW1lIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIKKyAgKTsKKyAgYXNzZXJ0LmVxdWFsKGUubWVzc2FnZSwgImZvbyIsICdoYXMgZXJyb3IgbWVzc2FnZSAiZm9vIicpOworICBhc3NlcnQuZXF1YWwoZS50eXBlLCAxLCAiaGFzIHR5cGUgMSIpOworICBhc3NlcnQuZW5kKCk7Cit9KTsKKwordGVzdCgidW5leHBlY3RlZCBUQXBwbGljYXRpb25FeGNlcHRpb24gIiwgZnVuY3Rpb24gdChhc3NlcnQpIHsKKyAgY29uc3QgZSA9IG5ldyB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKDEsIDEwMCk7CisgIGFzc2VydC5vaygKKyAgICBlIGluc3RhbmNlb2YgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiwKKyAgICAiaXMgaW5zdGFuY2VvZiBUQXBwbGljYXRpb25FeGNlcHRpb24iCisgICk7CisgIGFzc2VydC5vayhlIGluc3RhbmNlb2YgdGhyaWZ0LlRFeGNlcHRpb24sICJpcyBpbnN0YW5jZW9mIFRFeGNlcHRpb24iKTsKKyAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiBFcnJvciwgImlzIGluc3RhbmNlb2YgRXJyb3IiKTsKKyAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBlLnN0YWNrLCAic3RyaW5nIiwgImhhcyBzdGFjayB0cmFjZSIpOworICBhc3NlcnQub2soCisgICAgL15UQXBwbGljYXRpb25FeGNlcHRpb246IDEwMC8udGVzdChlLnN0YWNrKSwKKyAgICAiU3RhY2sgdHJhY2UgaGFzIGNvcnJlY3QgZXJyb3IgbmFtZSBhbmQgbWVzc2FnZSIKKyAgKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUuc3RhY2suaW5kZXhPZigidGVzdC9leGNlcHRpb25zLmpzOjc6MTEiKSAhPT0gLTEsCisgICAgInN0YWNrIHRyYWNlIHN0YXJ0cyBvbiBjb3JyZWN0IGxpbmUgYW5kIGNvbHVtbiIKKyAgKTsKKyAgYXNzZXJ0LmVxdWFsKAorICAgIGUubmFtZSwKKyAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiwKKyAgICAiaGFzIGZ1bmN0aW9uIG5hbWUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIgorICApOworICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAxMDAsICJoYXMgZXJyb3IgbWVzc2FnZSAxMDAiKTsKKyAgYXNzZXJ0LmVxdWFsKGUudHlwZSwgMSwgImhhcyB0eXBlIDEiKTsKKyAgYXNzZXJ0LmVuZCgpOworfSk7CisKK3Rlc3QoIlRFeGNlcHRpb24iLCBmdW5jdGlvbiB0KGFzc2VydCkgeworICBjb25zdCBlID0gbmV3IHRocmlmdC5URXhjZXB0aW9uKCJmb28iKTsKKyAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiB0aHJpZnQuVEV4Y2VwdGlvbiwgImlzIGluc3RhbmNlb2YgVEV4Y2VwdGlvbiIpOworICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIEVycm9yLCAiaXMgaW5zdGFuY2VvZiBFcnJvciIpOworICBhc3NlcnQuZXF1YWwodHlwZW9mIGUuc3RhY2ssICJzdHJpbmciLCAiaGFzIHN0YWNrIHRyYWNlIik7CisgIGFzc2VydC5vaygKKyAgICAvXlRFeGNlcHRpb246IGZvby8udGVzdChlLnN0YWNrKSwKKyAgICAiU3RhY2sgdHJhY2UgaGFzIGNvcnJlY3QgZXJyb3IgbmFtZSBhbmQgbWVzc2FnZSIKKyAgKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUuc3RhY2suaW5kZXhPZigidGVzdC9leGNlcHRpb25zLmpzOjIxOjExIikgIT09IC0xLAorICAgICJzdGFjayB0cmFjZSBzdGFydHMgb24gY29ycmVjdCBsaW5lIGFuZCBjb2x1bW4iCisgICk7CisgIGFzc2VydC5lcXVhbChlLm5hbWUsICJURXhjZXB0aW9uIiwgImhhcyBmdW5jdGlvbiBuYW1lIFRFeGNlcHRpb24iKTsKKyAgYXNzZXJ0LmVxdWFsKGUubWVzc2FnZSwgImZvbyIsICdoYXMgZXJyb3IgbWVzc2FnZSAiZm9vIicpOworICBhc3NlcnQuZW5kKCk7Cit9KTsKKwordGVzdCgiVFByb3RvY29sRXhjZXB0aW9uIiwgZnVuY3Rpb24gdChhc3NlcnQpIHsKKyAgY29uc3QgZSA9IG5ldyB0aHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKDEsICJmb28iKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUgaW5zdGFuY2VvZiB0aHJpZnQuVFByb3RvY29sRXhjZXB0aW9uLAorICAgICJpcyBpbnN0YW5jZW9mIFRQcm90b2NvbEV4Y2VwdGlvbiIKKyAgKTsKKyAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiBFcnJvciwgImlzIGluc3RhbmNlb2YgRXJyb3IiKTsKKyAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBlLnN0YWNrLCAic3RyaW5nIiwgImhhcyBzdGFjayB0cmFjZSIpOworICBhc3NlcnQub2soCisgICAgL15UUHJvdG9jb2xFeGNlcHRpb246IGZvby8udGVzdChlLnN0YWNrKSwKKyAgICAiU3RhY2sgdHJhY2UgaGFzIGNvcnJlY3QgZXJyb3IgbmFtZSBhbmQgbWVzc2FnZSIKKyAgKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUuc3RhY2suaW5kZXhPZigidGVzdC9leGNlcHRpb25zLmpzOjMzOjExIikgIT09IC0xLAorICAgICJzdGFjayB0cmFjZSBzdGFydHMgb24gY29ycmVjdCBsaW5lIGFuZCBjb2x1bW4iCisgICk7CisgIGFzc2VydC5lcXVhbCgKKyAgICBlLm5hbWUsCisgICAgIlRQcm90b2NvbEV4Y2VwdGlvbiIsCisgICAgImhhcyBmdW5jdGlvbiBuYW1lIFRQcm90b2NvbEV4Y2VwdGlvbiIKKyAgKTsKKyAgYXNzZXJ0LmVxdWFsKGUubWVzc2FnZSwgImZvbyIsICdoYXMgZXJyb3IgbWVzc2FnZSAiZm9vIicpOworICBhc3NlcnQuZXF1YWwoZS50eXBlLCAxLCAiaGFzIHR5cGUgMSIpOworICBhc3NlcnQuZW5kKCk7Cit9KTsKKwordGVzdCgiSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yIiwgZnVuY3Rpb24gdChhc3NlcnQpIHsKKyAgY29uc3QgZSA9IG5ldyBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IoImZvbyIpOworICBhc3NlcnQub2soCisgICAgZSBpbnN0YW5jZW9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciwKKyAgICAiaXMgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IiCisgICk7CisgIGFzc2VydC5vayhlIGluc3RhbmNlb2YgRXJyb3IsICJpcyBpbnN0YW5jZW9mIEVycm9yIik7CisgIGFzc2VydC5lcXVhbCh0eXBlb2YgZS5zdGFjaywgInN0cmluZyIsICJoYXMgc3RhY2sgdHJhY2UiKTsKKyAgYXNzZXJ0Lm9rKAorICAgIC9eSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yOiBmb28vLnRlc3QoZS5zdGFjayksCisgICAgIlN0YWNrIHRyYWNlIGhhcyBjb3JyZWN0IGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UiCisgICk7CisgIGFzc2VydC5vaygKKyAgICBlLnN0YWNrLmluZGV4T2YoInRlc3QvZXhjZXB0aW9ucy5qczo0NjoxMSIpICE9PSAtMSwKKyAgICAic3RhY2sgdHJhY2Ugc3RhcnRzIG9uIGNvcnJlY3QgbGluZSBhbmQgY29sdW1uIgorICApOworICBhc3NlcnQuZXF1YWwoCisgICAgZS5uYW1lLAorICAgICJJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IiLAorICAgICJoYXMgZnVuY3Rpb24gbmFtZSBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IiCisgICk7CisgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICJmb28iLCAnaGFzIGVycm9yIG1lc3NhZ2UgImZvbyInKTsKKyAgYXNzZXJ0LmVuZCgpOworfSk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvaGVscGVycy5qcyBiL2xpYi9ub2RlanMvdGVzdC9oZWxwZXJzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZDEyOGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL3Rlc3QvaGVscGVycy5qcwpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyJ1c2Ugc3RyaWN0IjsKK2NvbnN0IHRocmlmdCA9IHJlcXVpcmUoIi4uL2xpYi90aHJpZnQiKTsKKworbW9kdWxlLmV4cG9ydHMudHJhbnNwb3J0cyA9IHsKKyAgYnVmZmVyZWQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCisgIGZyYW1lZDogdGhyaWZ0LlRGcmFtZWRUcmFuc3BvcnQKK307CisKK21vZHVsZS5leHBvcnRzLnByb3RvY29scyA9IHsKKyAganNvbjogdGhyaWZ0LlRKU09OUHJvdG9jb2wsCisgIGJpbmFyeTogdGhyaWZ0LlRCaW5hcnlQcm90b2NvbCwKKyAgY29tcGFjdDogdGhyaWZ0LlRDb21wYWN0UHJvdG9jb2wKK307CisKK21vZHVsZS5leHBvcnRzLmVjbWFNb2RlID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCItLWVzNiIpID8gImVzNiIgOiAiZXM1IjsKK21vZHVsZS5leHBvcnRzLmdlblBhdGggPSBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoIi0tZXM2IikKKyAgPyAiZ2VuLW5vZGVqcy1lczYiCisgIDogImdlbi1ub2RlanMiOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L3NlcnZlci5jcnQgYi9saWIvbm9kZWpzL3Rlc3Qvc2VydmVyLmNydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTVlZjNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L3NlcnZlci5jcnQKQEAgLTAsMCArMSwyNSBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFTnpDQ0F4K2dBd0lCQWdJSkFPWWZZZnc3TkNPY01BMEdDU3FHU0liM0RRRUJCUVVBTUlHeE1Rc3dDUVlECitWUVFHRXdKVlV6RVJNQThHQTFVRUNBd0lUV0Z5ZVd4aGJtUXhGREFTQmdOVkJBY01DMFp2Y21WemRDQklhV3hzCitNU2N3SlFZRFZRUUtEQjVVYUdVZ1FYQmhZMmhsSUZOdlpuUjNZWEpsSUVadmRXNWtZWFJwYjI0eEZqQVVCZ05WCitCQXNNRFVGd1lXTm9aU0JVYUhKcFpuUXhFakFRQmdOVkJBTU1DV3h2WTJGc2FHOXpkREVrTUNJR0NTcUdTSWIzCitEUUVKQVJZVlpHVjJRSFJvY21sbWRDNWhjR0ZqYUdVdWIzSm5NQjRYRFRFME1EUXdOekU0TlRnd01Gb1hEVEl5CitNRFl5TkRFNE5UZ3dNRm93Z2JFeEN6QUpCZ05WQkFZVEFsVlRNUkV3RHdZRFZRUUlEQWhOWVhKNWJHRnVaREVVCitNQklHQTFVRUJ3d0xSbTl5WlhOMElFaHBiR3d4SnpBbEJnTlZCQW9NSGxSb1pTQkJjR0ZqYUdVZ1UyOW1kSGRoCitjbVVnUm05MWJtUmhkR2x2YmpFV01CUUdBMVVFQ3d3TlFYQmhZMmhsSUZSb2NtbG1kREVTTUJBR0ExVUVBd3dKCitiRzlqWVd4b2IzTjBNU1F3SWdZSktvWklodmNOQVFrQkZoVmtaWFpBZEdoeWFXWjBMbUZ3WVdOb1pTNXZjbWN3CitnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDcUU5VEU5d0VYcDVMUnRMUVZEU0dRCitHVjc4KzdadFAvSS9aYUo2UTZaR2xmeERGdlpqRkY3M3NlTmhBdmxLbFltL2pmbElIWUxuTk9DeVNOOEkyWHc2CitMOU1iQytqdndrRUtmUW80ZURveFpuT1pqTkY1SjEvbFp0QmVPb3dNa2hoekJNSDFSZHMzNTEvSGpLTmc2WktnCisyQ2xkZDBqN0hiRHRFaXhPTGdMYlBScEJjYVlyTHJOTWFzZjNIYWwreDgvYjh1ZTI4eDkzSFNRQkdtWm1NSVV3CitBaW5FdS9mTlA0bExHbC8wa1piNzZUbnlScFlTUFlvanRTNkNua0grUUxZbnNSUkVYSll3RDFYa3U2MkxpcGtYCit3Q2tSVG5aNW5Vc0RNWDZGUEtnalFGUUNXRFhHL04wOTYrUFJVUUFDaGhyWHNKK2dGM05xV3REbXRyaFZRRjRuCitBZ01CQUFHalVEQk9NQjBHQTFVZERnUVdCQlFvOHYwd3pRUHgzRUVleEpQR2x4UEsxUHBnS2pBZkJnTlZIU01FCitHREFXZ0JRbzh2MHd6UVB4M0VFZXhKUEdseFBLMVBwZ0tqQU1CZ05WSFJNRUJUQURBUUgvTUEwR0NTcUdTSWIzCitEUUVCQlFVQUE0SUJBUUJHRlJpSnNsY1gwYUprd1pwelR3U1VkZ2NmS2Jwdk5FYkNOdFZvaGZRVlRJNGEvb041CitVK3lxRFpKZzN2T2FPdWlBWnF5SGNJbFo4cXllc0NnUk4zMTRUbDQvSlErK0NXOG1LajFtZVRnbzVZRnhjWlltCitUOXZzSTNDK056bjg0RElOZ0k5bXg2eWt0SXQzUU9LWlJEcHp5UGtVenhzeUo4SjQyN0RhaW1EcmpUUitmVHdECisxRGgwOXhlZU1uU2E1emVWMUhFRHlKVHFDWHV0TGV0d1EvSXlmbU1CaEl4K252QjVmNjdwei9tK0R2NlYwcjNJCitwNEhDY2RuRFVER0piZnF0b3FzQUFUUVFXTytXV3Vzd0I2bU9oRGJ2UFR4aFJwWnE2QWtnV3F2NFMrdTNNMkdPCityNXA5RnJCZ2F2QXc1YktPNTRDMG9RS3BOLzVmdGE1bDZXczAKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9zZXJ2ZXIuanMgYi9saWIvbm9kZWpzL3Rlc3Qvc2VydmVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MDIwOTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL3Rlc3Qvc2VydmVyLmpzCkBAIC0wLDAgKzEsMTM3IEBACisjIS91c3IvYmluL2VudiBub2RlCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY29uc3QgZnMgPSByZXF1aXJlKCJmcyIpOworY29uc3QgcGF0aCA9IHJlcXVpcmUoInBhdGgiKTsKK2NvbnN0IHRocmlmdCA9IHJlcXVpcmUoIi4uL2xpYi90aHJpZnQiKTsKK2NvbnN0IHByb2dyYW0gPSByZXF1aXJlKCJjb21tYW5kZXIiKTsKK2NvbnN0IGhlbHBlcnMgPSByZXF1aXJlKCIuL2hlbHBlcnMiKTsKKworcHJvZ3JhbQorICAub3B0aW9uKAorICAgICItcCwgLS1wcm90b2NvbCA8cHJvdG9jb2w+IiwKKyAgICAiU2V0IHRocmlmdCBwcm90b2NvbCAoYmluYXJ5fGNvbXBhY3R8anNvbikiLAorICAgICJiaW5hcnkiCisgICkKKyAgLm9wdGlvbigKKyAgICAiLXQsIC0tdHJhbnNwb3J0IDx0cmFuc3BvcnQ+IiwKKyAgICAiU2V0IHRocmlmdCB0cmFuc3BvcnQgKGJ1ZmZlcmVkfGZyYW1lZHxodHRwKSIsCisgICAgImJ1ZmZlcmVkIgorICApCisgIC5vcHRpb24oIi0tc3NsIiwgInVzZSBzc2wgdHJhbnNwb3J0IikKKyAgLm9wdGlvbigiLS1wb3J0IDxwb3J0PiIsICJTZXQgdGhyaWZ0IHNlcnZlciBwb3J0IiwgOTA5MCkKKyAgLm9wdGlvbigiLS1kb21haW4tc29ja2V0IDxwYXRoPiIsICJTZXQgdGhpZnQgc2VydmVyIHVuaXggZG9tYWluIHNvY2tldCIpCisgIC5vcHRpb24oCisgICAgIi10LCAtLXR5cGUgPHR5cGU+IiwKKyAgICAiU2VsZWN0IHNlcnZlciB0eXBlIChodHRwfG11bHRpcGxleHx0Y3B8d2Vic29ja2V0KSIsCisgICAgInRjcCIKKyAgKQorICAub3B0aW9uKCItLWNhbGxiYWNrIiwgInRlc3Qgd2l0aCBjYWxsYmFjayBzdHlsZSBmdW5jdGlvbnMiKQorICAub3B0aW9uKCItLWVzNiIsICJVc2UgZXM2IGNvZGUiKQorICAub3B0aW9uKCItLWVzNSIsICJVc2UgZXM1IGNvZGUiKQorICAucGFyc2UocHJvY2Vzcy5hcmd2KTsKKworY29uc3QgVGhyaWZ0VGVzdCA9IHJlcXVpcmUoYC4vJHtoZWxwZXJzLmdlblBhdGh9L1RocmlmdFRlc3RgKTsKK2NvbnN0IFNlY29uZFNlcnZpY2UgPSByZXF1aXJlKGAuLyR7aGVscGVycy5nZW5QYXRofS9TZWNvbmRTZXJ2aWNlYCk7Citjb25zdCB7IFRocmlmdFRlc3RIYW5kbGVyIH0gPSByZXF1aXJlKCIuL3Rlc3RfaGFuZGxlciIpOworCitjb25zdCBwb3J0ID0gcHJvZ3JhbS5wb3J0OworY29uc3QgZG9tYWluU29ja2V0ID0gcHJvZ3JhbS5kb21haW5Tb2NrZXQ7Citjb25zdCBzc2wgPSBwcm9ncmFtLnNzbDsKKworbGV0IHR5cGUgPSBwcm9ncmFtLnR5cGU7CitpZiAocHJvZ3JhbS50cmFuc3BvcnQgPT09ICJodHRwIikgeworICBwcm9ncmFtLnRyYW5zcG9ydCA9ICJidWZmZXJlZCI7CisgIHR5cGUgPSAiaHR0cCI7Cit9CisKK2xldCBvcHRpb25zID0geworICB0cmFuc3BvcnQ6IGhlbHBlcnMudHJhbnNwb3J0c1twcm9ncmFtLnRyYW5zcG9ydF0sCisgIHByb3RvY29sOiBoZWxwZXJzLnByb3RvY29sc1twcm9ncmFtLnByb3RvY29sXQorfTsKKworaWYgKHR5cGUgPT09ICJodHRwIiB8fCB0eXBlID09PSAid2Vic29ja2V0IikgeworICBvcHRpb25zLmhhbmRsZXIgPSBUaHJpZnRUZXN0SGFuZGxlcjsKKyAgb3B0aW9ucy5wcm9jZXNzb3IgPSBUaHJpZnRUZXN0OworCisgIG9wdGlvbnMgPSB7CisgICAgc2VydmljZXM6IHsgIi90ZXN0Ijogb3B0aW9ucyB9LAorICAgIGNvcnM6IHsKKyAgICAgICIqIjogdHJ1ZQorICAgIH0KKyAgfTsKK30KKworbGV0IHByb2Nlc3NvcjsKK2lmICh0eXBlID09PSAibXVsdGlwbGV4IikgeworICBjb25zdCBTZWNvbmRTZXJ2aWNlSGFuZGxlciA9IHsKKyAgICBzZWNvbmR0ZXN0U3RyaW5nOiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7CisgICAgICBjb25zb2xlLmxvZygndGVzdFN0cmluZygiJyArIHRoaW5nICsgJyIpJyk7CisgICAgICByZXN1bHQobnVsbCwgJ3Rlc3RTdHJpbmcoIicgKyB0aGluZyArICciKScpOworICAgIH0KKyAgfTsKKworICBwcm9jZXNzb3IgPSBuZXcgdGhyaWZ0Lk11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisKKyAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICAgICJUaHJpZnRUZXN0IiwKKyAgICBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IoVGhyaWZ0VGVzdEhhbmRsZXIpCisgICk7CisKKyAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICAgICJTZWNvbmRTZXJ2aWNlIiwKKyAgICBuZXcgU2Vjb25kU2VydmljZS5Qcm9jZXNzb3IoU2Vjb25kU2VydmljZUhhbmRsZXIpCisgICk7Cit9CisKK2lmIChzc2wpIHsKKyAgaWYgKAorICAgIHR5cGUgPT09ICJ0Y3AiIHx8CisgICAgdHlwZSA9PT0gIm11bHRpcGxleCIgfHwKKyAgICB0eXBlID09PSAiaHR0cCIgfHwKKyAgICB0eXBlID09PSAid2Vic29ja2V0IgorICApIHsKKyAgICBvcHRpb25zLnRscyA9IHsKKyAgICAgIGtleTogZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICJzZXJ2ZXIua2V5IikpLAorICAgICAgY2VydDogZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICJzZXJ2ZXIuY3J0IikpCisgICAgfTsKKyAgfQorfQorCitsZXQgc2VydmVyOworaWYgKHR5cGUgPT09ICJ0Y3AiKSB7CisgIHNlcnZlciA9IHRocmlmdC5jcmVhdGVTZXJ2ZXIoVGhyaWZ0VGVzdCwgVGhyaWZ0VGVzdEhhbmRsZXIsIG9wdGlvbnMpOworfSBlbHNlIGlmICh0eXBlID09PSAibXVsdGlwbGV4IikgeworICBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlTXVsdGlwbGV4U2VydmVyKHByb2Nlc3Nvciwgb3B0aW9ucyk7Cit9IGVsc2UgaWYgKHR5cGUgPT09ICJodHRwIiB8fCB0eXBlID09PSAid2Vic29ja2V0IikgeworICBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlV2ViU2VydmVyKG9wdGlvbnMpOworfQorCitpZiAoZG9tYWluU29ja2V0KSB7CisgIHNlcnZlci5saXN0ZW4oZG9tYWluU29ja2V0KTsKK30gZWxzZSBpZiAoCisgIHR5cGUgPT09ICJ0Y3AiIHx8CisgIHR5cGUgPT09ICJtdWx0aXBsZXgiIHx8CisgIHR5cGUgPT09ICJodHRwIiB8fAorICB0eXBlID09PSAid2Vic29ja2V0IgorKSB7CisgIHNlcnZlci5saXN0ZW4ocG9ydCk7Cit9CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3Qvc2VydmVyLmtleSBiL2xpYi9ub2RlanMvdGVzdC9zZXJ2ZXIua2V5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2M2NmY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL3Rlc3Qvc2VydmVyLmtleQpAQCAtMCwwICsxLDI4IEBACistLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS0KK01JSUV2QUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktZd2dnU2lBZ0VBQW9JQkFRQ3FFOVRFOXdFWHA1TFIKK3RMUVZEU0dRR1Y3OCs3WnRQL0kvWmFKNlE2WkdsZnhERnZaakZGNzNzZU5oQXZsS2xZbS9qZmxJSFlMbk5PQ3kKK1NOOEkyWHc2TDlNYkMranZ3a0VLZlFvNGVEb3habk9aak5GNUoxL2xadEJlT293TWtoaHpCTUgxUmRzMzUxL0gKK2pLTmc2WktnMkNsZGQwajdIYkR0RWl4T0xnTGJQUnBCY2FZckxyTk1hc2YzSGFsK3g4L2I4dWUyOHg5M0hTUUIKK0dtWm1NSVV3QWluRXUvZk5QNGxMR2wvMGtaYjc2VG55UnBZU1BZb2p0UzZDbmtIK1FMWW5zUlJFWEpZd0QxWGsKK3U2MkxpcGtYd0NrUlRuWjVuVXNETVg2RlBLZ2pRRlFDV0RYRy9OMDk2K1BSVVFBQ2hoclhzSitnRjNOcVd0RG0KK3RyaFZRRjRuQWdNQkFBRUNnZ0VBVy95NTJZWVc2eXBST0diWjk0RFFwRlYwa0xPN3FUOHEwS3N4dzVzUE5hSXQKK2ZFUFJJeW1EYThpa3lIV0pTNU94bXc4NHdvNWpuSlYyNmphTG13ZTJMdXBxN1hmMWxxZWo4ZjVMSnR1djdjUVIKK3hmenAxdk02NUtKRkZKSHA2V3FqR3FKNkhTU1pPcFZEc25RWWNYUWpRQ2RweUFtYVNXZDNwK0ZxWVNaMW1RbUQKK2JGTkk3anFwY3pXU1poVGRvdFE3cDdIbjlUVkNlaGZsUDN5R0lCM2JRK3dDY0NCODVkT0J6MjAxTCtZZ2FJY2sKK1N6NDNBNE52V2FRSVJMUkR3N3M5R1c0alk1VDBKdjI4MldJZUFsVnBWeExJd3U0OHI0UjR5R1RJeDlZZG93dnEKKzU3K1k1aVBQakFYeHUwVjl0MDBvUzNiWXhEYUtoMkRVZmMvNXpvd3E4UUtCZ1FEWU5WUFhtYUcwYUlINHZqUTkKKzdmUmR3L1VEa1ljUWJuNkNuZ2xRT3U3Ny9TOG9nUXpwS0NWSmdKZ2taTnFPVnRRTUVQemVrR0VjTFRiamUxZ1UKKzhCa3kyaytQTDlVd2JGeTBlbW5PVmg0cnFyTlhIc1J2SmNlaE5UL1BSYjVoakYzTVVNRlYvMGlENGIrbmFGYUUKK2pyU1dpWjJaWGoycWZ3QUs1MkdGYnRPdUJRS0JnUURKWVF1R2lZMHIyMkU0d2FKbUNTS2N6b0JUM2N3bFZ6V2oKK1YybGpnQTlSSExOVFZrdk5OWVFMR3UycW5nRnJ0d3BlYVNuc01EZXJWRzR3S0FRV3lDbll6eFZybG5DNHVEckoKK0hYdUZFbHRCV2k5RmZiZ2ZzbmQzNzQ5QVQwb0JQMU5UMnRNbGVndXlmNURGZ2pDUjNWUkpMZHJWYWFaOHJvdy8KK0xxS2NGTXFuT3dLQmdCK09JTzk5bDdFNTg0WTNWRzZaZFNuZU9MdE5tUlhYMnBUN3RjWkU0NjVaZEhHSDdEZDMKK1NZSGh4OUsvK1huK3lESCtwTGxpL3hsYXJBRWxkbVNQNmsyV3VUZmZ0bEM3OEFmVE9mQUlkNXpON0NEUjk3OTEKK0Z4NjdJOVgvaXRxMzN0UzhFSXVabDU3UDZ1WG0vNEdYUmxvV09hOHhwdlJrVnNCQXB1WVBsOHQxQW9HQVRRRFMKK3kyc2xsRE9iQlh6bGdHYlYyV2dOSWdTWjMxMXRvVHYzakppWFFzamF1Vzh5SlJIbG4rbDRIOW16YVdEZ2tpRmMKK2FuZzFrVW9EcUY1azBlRlFQeHRRY1lkaEt3RW5XV2Z3cDMzUmJ6ZnhBMzJEUG51YnV6emJaaGZya0hhS2duSVcKK2N5b3I5dUZZbG0ybDdPRFpMZkplejJSS3lUcGxYbk9Tc21RdzZha0NnWUF6M2RqOUhza3lqK0hWSitodDFPY0UKK2M3YWkvRVNrU0E3VmFqcDB0akpwMEVLalcvenE4RHZVU1hPdGNkbkpna0t5Y0ZsdUx3Ym1uYU40dHhCZHMxQzEKK1FyOFJ0MnNVQ0NCTlplMUw2REhlM1hCZGJrSmU5c2daVk5UanRVU1Fyenk4VWh2c0NxRzRZV2VDdTA3U3pjYmMKK3JkUFVWOS91UWtkeDhWclNoeGxEOEE9PQorLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L3Rlc3QtY2FzZXMuanMgYi9saWIvbm9kZWpzL3Rlc3QvdGVzdC1jYXNlcy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmM1NjZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L3Rlc3QtY2FzZXMuanMKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworInVzZSBzdHJpY3QiOworCitjb25zdCBoZWxwZXJzID0gcmVxdWlyZSgiLi9oZWxwZXJzIik7Citjb25zdCB0dHlwZXMgPSByZXF1aXJlKGAuLyR7aGVscGVycy5nZW5QYXRofS9UaHJpZnRUZXN0X3R5cGVzYCk7Citjb25zdCBJbnQ2NCA9IHJlcXVpcmUoIm5vZGUtaW50NjQiKTsKKworLy9hbGwgTGFuZ3VhZ2VzIGluIFVURi04CisvKmpzaGludCAtVzEwMCAqLworY29uc3Qgc3RyaW5nVGVzdCA9IChtb2R1bGUuZXhwb3J0cy5zdHJpbmdUZXN0ID0KKyAgIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCAiICsKKyAgIkFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCAiICsKKyAgItCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwgIiArCisgICLgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sICIgKworICAiQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCAiICsKKyAgIkRhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgIiArCisgICJFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsICIgKworICAiRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCAiICsKKyAgIkF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksICIgKworICAiS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgIiArCisgICJJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsICIgKworICAi4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCAiICsKKyAgIlJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgIiArCisgICJMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSAiICsKKyAgIkJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsINmF2KfYstmQ2LHZiNmG24wsIEJhaGFzYSAiICsKKyAgIk1lbGF5dSwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqiIgKworICAiTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCAiICsKKyAgIk9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCAiICsKKyAgIk5vcmZ1ayAvIFBpdGtlcm4sIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCAiICsKKyAgItCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgIiArCisgICJFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssICIgKworICAiU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCAiICsKKyAgIlTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssICIgKworICAiV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgIiArCisgICJCw6JuLWzDom0tZ8O6LCDnsrXoqp4iKTsKKy8qanNoaW50ICtXMTAwICovCisKK2NvbnN0IHNwZWNpYWxDaGFyYWN0ZXJzID0gKG1vZHVsZS5leHBvcnRzLnNwZWNpYWxDaGFyYWN0ZXJzID0KKyAgJ3F1b3RlOiAiIGJhY2tzbGFzaDonICsKKyAgIiBmb3J3YXJkc2xhc2gtZXNjYXBlZDogLyAiICsKKyAgIiBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogIiArCisgICcgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiAiXFwvXGJcblxyXHQnICsKKyAgIiBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48IiArCisgICcgY2hhci10by10ZXN0LWpzb24tcGFyc2luZzogXV0gIl1dIFxcIiB9fX17IFtbWyAnKTsKKworY29uc3QgbWFwVGVzdElucHV0ID0gKG1vZHVsZS5leHBvcnRzLm1hcFRlc3RJbnB1dCA9IHsKKyAgYTogIjEyMyIsCisgICJhIGIiOiAid2l0aCBzcGFjZXMgIiwKKyAgc2FtZTogInNhbWUiLAorICAiMCI6ICJudW1lcmljIGtleSIsCisgIGxvbmdWYWx1ZTogc3RyaW5nVGVzdCwKKyAgc3RyaW5nVGVzdDogImxvbmcga2V5IgorfSk7CisKK2NvbnN0IHNpbXBsZSA9IFsKKyAgWyJ0ZXN0Vm9pZCIsIHVuZGVmaW5lZF0sCisgIFsidGVzdFN0cmluZyIsICJUZXN0Il0sCisgIFsidGVzdFN0cmluZyIsICIiXSwKKyAgWyJ0ZXN0U3RyaW5nIiwgc3RyaW5nVGVzdF0sCisgIFsidGVzdFN0cmluZyIsIHNwZWNpYWxDaGFyYWN0ZXJzXSwKKyAgWyJ0ZXN0Qm9vbCIsIHRydWVdLAorICBbInRlc3RCb29sIiwgZmFsc2VdLAorICBbInRlc3RCeXRlIiwgMV0sCisgIFsidGVzdEJ5dGUiLCAwXSwKKyAgWyJ0ZXN0Qnl0ZSIsIC0xXSwKKyAgWyJ0ZXN0Qnl0ZSIsIC0xMjddLAorICBbInRlc3RJMzIiLCAtMV0sCisgIFsidGVzdERvdWJsZSIsIC01LjIwOTg1MjNdLAorICBbInRlc3REb3VibGUiLCA3LjAxMjA1MjE3NTIxNTA0NF0sCisgIFsidGVzdEVudW0iLCB0dHlwZXMuTnVtYmVyei5PTkVdLAorICBbInRlc3RJNjQiLCA1XSwKKyAgWyJ0ZXN0STY0IiwgLTVdLAorICBbInRlc3RJNjQiLCA3MzQzNTk3MzgzNjhdLAorICBbInRlc3RJNjQiLCAtNzM0MzU5NzM4MzY4XSwKKyAgWyJ0ZXN0STY0IiwgbmV3IEludDY0KG5ldyBCdWZmZXIoWzAsIDB4MjAsIDAsIDAsIDAsIDAsIDAsIDFdKSldLCAvLyAyXjUzKzEKKyAgWworICAgICJ0ZXN0STY0IiwKKyAgICBuZXcgSW50NjQobmV3IEJ1ZmZlcihbMHhmZiwgMHhkZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZl0pKQorICBdLCAvLyAtMl41My0xCisgIFsidGVzdFR5cGVkZWYiLCA2OV0KK107CisKK2NvbnN0IG1hcG91dCA9IHt9OworZm9yIChsZXQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgbWFwb3V0W2ldID0gaSAtIDEwOworfQorCitjb25zdCBkZWVwID0gWworICBbCisgICAgInRlc3RMaXN0IiwKKyAgICBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwXQorICBdCitdOworCitjb25zdCBkZWVwVW5vcmRlcmVkID0gWworICBbInRlc3RNYXAiLCBtYXBvdXRdLAorICBbInRlc3RTZXQiLCBbMSwgMiwgM11dLAorICBbInRlc3RTdHJpbmdNYXAiLCBtYXBUZXN0SW5wdXRdCitdOworCitjb25zdCBvdXQgPSBuZXcgdHR5cGVzLlh0cnVjdCh7CisgIHN0cmluZ190aGluZzogIlplcm8iLAorICBieXRlX3RoaW5nOiAxLAorICBpMzJfdGhpbmc6IC0zLAorICBpNjRfdGhpbmc6IDEwMDAwMDAKK30pOworCitjb25zdCBvdXQyID0gbmV3IHR0eXBlcy5YdHJ1Y3QyKCk7CitvdXQyLmJ5dGVfdGhpbmcgPSAxOworb3V0Mi5zdHJ1Y3RfdGhpbmcgPSBvdXQ7CitvdXQyLmkzMl90aGluZyA9IDU7CisKK2NvbnN0IGNyYXp5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSh7CisgIHVzZXJNYXA6IHsgIjUiOiA1LCAiOCI6IDggfSwKKyAgeHRydWN0czogWworICAgIG5ldyB0dHlwZXMuWHRydWN0KHsKKyAgICAgIHN0cmluZ190aGluZzogIkdvb2RieWU0IiwKKyAgICAgIGJ5dGVfdGhpbmc6IDQsCisgICAgICBpMzJfdGhpbmc6IDQsCisgICAgICBpNjRfdGhpbmc6IDQKKyAgICB9KSwKKyAgICBuZXcgdHR5cGVzLlh0cnVjdCh7CisgICAgICBzdHJpbmdfdGhpbmc6ICJIZWxsbzIiLAorICAgICAgYnl0ZV90aGluZzogMiwKKyAgICAgIGkzMl90aGluZzogMiwKKyAgICAgIGk2NF90aGluZzogMgorICAgIH0pCisgIF0KK30pOworCitjb25zdCBjcmF6eTIgPSBuZXcgdHR5cGVzLkluc2FuaXR5KHsKKyAgdXNlck1hcDogeyAiNSI6IDUsICI4IjogOCB9LAorICB4dHJ1Y3RzOiBbCisgICAgeworICAgICAgc3RyaW5nX3RoaW5nOiAiR29vZGJ5ZTQiLAorICAgICAgYnl0ZV90aGluZzogNCwKKyAgICAgIGkzMl90aGluZzogNCwKKyAgICAgIGk2NF90aGluZzogNAorICAgIH0sCisgICAgeworICAgICAgc3RyaW5nX3RoaW5nOiAiSGVsbG8yIiwKKyAgICAgIGJ5dGVfdGhpbmc6IDIsCisgICAgICBpMzJfdGhpbmc6IDIsCisgICAgICBpNjRfdGhpbmc6IDIKKyAgICB9CisgIF0KK30pOworCitjb25zdCBpbnNhbml0eSA9IHsKKyAgIjEiOiB7ICIyIjogY3JhenksICIzIjogY3JhenkgfSwKKyAgIjIiOiB7ICI2IjogeyB1c2VyTWFwOiB7fSwgeHRydWN0czogW10gfSB9Cit9OworCittb2R1bGUuZXhwb3J0cy5zaW1wbGUgPSBzaW1wbGU7Cittb2R1bGUuZXhwb3J0cy5kZWVwID0gZGVlcDsKK21vZHVsZS5leHBvcnRzLmRlZXBVbm9yZGVyZWQgPSBkZWVwVW5vcmRlcmVkOworCittb2R1bGUuZXhwb3J0cy5vdXQgPSBvdXQ7Cittb2R1bGUuZXhwb3J0cy5vdXQyID0gb3V0MjsKK21vZHVsZS5leHBvcnRzLmNyYXp5ID0gY3Jhenk7Cittb2R1bGUuZXhwb3J0cy5jcmF6eTIgPSBjcmF6eTI7Cittb2R1bGUuZXhwb3J0cy5pbnNhbml0eSA9IGluc2FuaXR5OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L3Rlc3RBbGwuc2ggYi9saWIvbm9kZWpzL3Rlc3QvdGVzdEFsbC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNGYxZjJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L3Rlc3RBbGwuc2gKQEAgLTAsMCArMSw5OCBAQAorIyEgL2Jpbi9zaAorCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworaWYgWyAtbiAiJHsxfSIgXTsgdGhlbgorICBDT1ZFUj0kezF9OworZmkKKworRElSPSIkKCBjZCAiJCggZGlybmFtZSAiJDAiICkiICYmIHB3ZCApIgorCitJU1RBTkJVTD0iJERJUi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaXN0YW5idWwvbGliL2NsaS5qcyIKKworUkVQT1JUX1BSRUZJWD0iJHtESVJ9Ly4uL2NvdmVyYWdlL3JlcG9ydCIKKworQ09VTlQ9MAorCitleHBvcnQgTk9ERV9QQVRIPSIke0RJUn06JHtESVJ9Ly4uL2xpYjoke05PREVfUEFUSH0iCisKK3Rlc3RTZXJ2ZXIoKQoreworICBlY2hvICIgIFtFQ01BICQxXSBUZXN0aW5nICQyIENsaWVudC9TZXJ2ZXIgd2l0aCBwcm90b2NvbCAkMyBhbmQgdHJhbnNwb3J0ICQ0ICQ1IjsKKyAgUkVUPTAKKyAgaWYgWyAtbiAiJHtDT1ZFUn0iIF07IHRoZW4KKyAgICAke0lTVEFOQlVMfSBjb3ZlciAke0RJUn0vc2VydmVyLmpzIC0tZGlyICR7UkVQT1JUX1BSRUZJWH0ke0NPVU5UfSAtLWhhbmRsZS1zaWdpbnQgLS0gLS10eXBlICQyIC1wICQzIC10ICQ0ICQ1ICYKKyAgICBDT1VOVD0kKChDT1VOVCsxKSkKKyAgZWxzZQorICAgIG5vZGUgJHtESVJ9L3NlcnZlci5qcyAtLSR7MX0gLS10eXBlICQyIC1wICQzIC10ICQ0ICQ1ICYKKyAgZmkKKyAgU0VSVkVSUElEPSQhCisgIHNsZWVwIDAuMQorICBpZiBbIC1uICIke0NPVkVSfSIgXTsgdGhlbgorICAgICR7SVNUQU5CVUx9IGNvdmVyICR7RElSfS9jbGllbnQuanMgLS1kaXIgJHtSRVBPUlRfUFJFRklYfSR7Q09VTlR9IC0tIC0tJHsxfSAtLXR5cGUgJDIgLXAgJDMgLXQgJDQgJDUgfHwgUkVUPTEKKyAgICBDT1VOVD0kKChDT1VOVCsxKSkKKyAgZWxzZQorICAgIG5vZGUgJHtESVJ9L2NsaWVudC5qcyAtLSR7MX0gLS10eXBlICQyIC1wICQzIC10ICQ0ICQ1IHx8IFJFVD0xCisgIGZpCisgIGtpbGwgLTIgJFNFUlZFUlBJRCB8fCBSRVQ9MQorICB3YWl0ICRTRVJWRVJQSUQKKyAgcmV0dXJuICRSRVQKK30KKworCitURVNUT0s9MAorCisjZ2VuZXJhdGluZyB0aHJpZnQgY29kZQorCiske0RJUn0vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtbyAke0RJUn0gLS1nZW4ganM6bm9kZSAke0RJUn0vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW8gJHtESVJ9IC0tZ2VuIGpzOm5vZGUgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdAorbWtkaXIgJHtESVJ9L2dlbi1ub2RlanMtZXM2Ciske0RJUn0vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtb3V0ICR7RElSfS9nZW4tbm9kZWpzLWVzNiAtLWdlbiBqczpub2RlLGVzNiAke0RJUn0vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW91dCAke0RJUn0vZ2VuLW5vZGVqcy1lczYgLS1nZW4ganM6bm9kZSxlczYgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdAorCisjdW5pdCB0ZXN0cworCitub2RlICR7RElSfS9iaW5hcnkudGVzdC5qcyB8fCBURVNUT0s9MQorbm9kZSAke0RJUn0vZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzIHx8IFRFU1RPSz0xCisKKyNpbnRlZ3JhdGlvbiB0ZXN0cworCitmb3IgdHlwZSBpbiB0Y3AgbXVsdGlwbGV4IHdlYnNvY2tldCBodHRwCitkbworICBmb3IgcHJvdG9jb2wgaW4gY29tcGFjdCBiaW5hcnkganNvbgorICBkbworICAgIGZvciB0cmFuc3BvcnQgaW4gYnVmZmVyZWQgZnJhbWVkCisgICAgZG8KKyAgICAgIGZvciBlY21hX3ZlcnNpb24gaW4gZXM1IGVzNgorICAgICAgZG8KKyAgICAgICAgdGVzdFNlcnZlciAkZWNtYV92ZXJzaW9uICR0eXBlICRwcm90b2NvbCAkdHJhbnNwb3J0IHx8IFRFU1RPSz0xCisgICAgICAgIHRlc3RTZXJ2ZXIgJGVjbWFfdmVyc2lvbiAkdHlwZSAkcHJvdG9jb2wgJHRyYW5zcG9ydCAtLXNzbCB8fCBURVNUT0s9MQorICAgICAgICB0ZXN0U2VydmVyICRlY21hX3ZlcnNpb24gJHR5cGUgJHByb3RvY29sICR0cmFuc3BvcnQgLS1jYWxsYmFjayB8fCBURVNUT0s9MQorICAgICAgZG9uZQorICAgIGRvbmUKKyAgZG9uZQorZG9uZQorCisKK2lmIFsgLW4gIiR7Q09WRVJ9IiBdOyB0aGVuCisgICR7SVNUQU5CVUx9IHJlcG9ydCAtLWRpciAiJHtESVJ9Ly4uL2NvdmVyYWdlIiAtLWluY2x1ZGUgIiR7RElSfS8uLi9jb3ZlcmFnZS9yZXBvcnQqL2NvdmVyYWdlLmpzb24iIGxjb3YgY29iZXJ0dXJhIGh0bWwKKyAgcm0gLXIgJHtESVJ9Ly4uL2NvdmVyYWdlL3JlcG9ydCovKgorICBybWRpciAke0RJUn0vLi4vY292ZXJhZ2UvcmVwb3J0KgorZmkKKworZXhpdCAkVEVTVE9LCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvdGVzdF9kcml2ZXIuanMgYi9saWIvbm9kZWpzL3Rlc3QvdGVzdF9kcml2ZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5YTkxOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvdGVzdC90ZXN0X2RyaXZlci5qcwpAQCAtMCwwICsxLDM2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBUaGlzIGlzIHRoZSBOb2RlLmpzIHRlc3QgZHJpdmVyIGZvciB0aGUgc3RhbmRhcmQgQXBhY2hlIFRocmlmdAorLy8gdGVzdCBzZXJ2aWNlLiBUaGUgZHJpdmVyIGludm9rZXMgZXZlcnkgZnVuY3Rpb24gZGVmaW5lZCBpbiB0aGUKKy8vIFRocmlmdCBUZXN0IHNlcnZpY2Ugd2l0aCBhIHJlcHJlc2VudGF0aXZlIHJhbmdlIG9mIHBhcmFtZXRlcnMuCisvLworLy8gVGhlIFRocmlmdFRlc3REcml2ZXIgZnVuY3Rpb24gcmVxdWlyZXMgYSBjbGllbnQgb2JqZWN0CisvLyBjb25uZWN0ZWQgdG8gYSBzZXJ2ZXIgaG9zdGluZyB0aGUgVGhyaWZ0IFRlc3Qgc2VydmljZSBhbmQKKy8vIHN1cHBvcnRzIGFuIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aXRoCisvLyBhIHN0YXR1cyBtZXNzYWdlIHdoZW4gdGhlIHRlc3QgaXMgY29tcGxldGUuCisKK2NvbnN0IHRlc3QgPSByZXF1aXJlKCJ0YXBlIik7CisKK2NvbnN0IGhlbHBlcnMgPSByZXF1aXJlKCIuL2hlbHBlcnMiKTsKK2NvbnN0IHR0eXBlcyA9IHJlcXVpcmUoYC4vJHtoZWxwZXJzLmdlblBhdGh9L1RocmlmdFRlc3RfdHlwZXNgKTsKK2NvbnN0IFRFeGNlcHRpb24gPSByZXF1aXJlKCJ0aHJpZnQiKS5UaHJpZnQuVEV4Y2VwdGlvbjsKK2NvbnN0IEludDY0ID0gcmVxdWlyZSgibm9kZS1pbnQ2NCIpOworY29uc3QgdGVzdENhc2VzID0gcmVxdWlyZSgiLi90ZXN0LWNhc2VzIik7CisKK2V4cG9ydHMuVGhyaWZ0VGVzdERyaXZlciA9IGZ1bmN0aW9uKGNsaWVudCwgY2FsbGJhY2spIHsKKyAgdGVzdCgKKyAgICAiTm9kZUpTIFN0eWxlIENhbGxiYWNrIENsaWVudCBUZXN0cyIsCisgICAgeyBza2lwOiBoZWxwZXJzLmVjbWFNb2RlID09PSAiZXM2IiB9LAorICAgIGZ1bmN0aW9uKGFzc2VydCkgeworICAgICAgY29uc3QgY2hlY2tSZWN1cnNpdmVseSA9IG1ha2VSZWN1cnNpdmVDaGVjayhhc3NlcnQpOworCisgICAgICBmdW5jdGlvbiBtYWtlQXNzZXJ0ZXIoYXNzZXJ0aW9uRm4pIHsKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGMpIHsKKyAgICAgICAgICBjb25zdCBmbk5hbWUgPSBjWzBdOworICAgICAgICAgIGNvbnN0IGV4cGVjdGVkID0gY1sxXTsKKyAgICAgICAgICBjbGllbnRbZm5OYW1lXShleHBlY3RlZCwgZnVuY3Rpb24oZXJyLCBhY3R1YWwpIHsKKyAgICAgICAgICAgIGFzc2VydC5lcnJvcihlcnIsIGZuTmFtZSArICI6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgICAgICBhc3NlcnRpb25GbihhY3R1YWwsIGV4cGVjdGVkLCBmbk5hbWUpOworICAgICAgICAgIH0pOworICAgICAgICB9OworICAgICAgfQorCisgICAgICB0ZXN0Q2FzZXMuc2ltcGxlLmZvckVhY2goCisgICAgICAgIG1ha2VBc3NlcnRlcihmdW5jdGlvbihhLCBlLCBtKSB7CisgICAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBJbnQ2NCkgeworICAgICAgICAgICAgY29uc3QgZTY0ID0gZSBpbnN0YW5jZW9mIEludDY0ID8gZSA6IG5ldyBJbnQ2NChlKTsKKyAgICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwoYS5idWZmZXIsIGU2NC5idWZmZXIsIG0pOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnQuZXF1YWwoYSwgZSwgbSk7CisgICAgICAgICAgfQorICAgICAgICB9KQorICAgICAgKTsKKyAgICAgIHRlc3RDYXNlcy5kZWVwLmZvckVhY2gobWFrZUFzc2VydGVyKGFzc2VydC5kZWVwRXF1YWwpKTsKKyAgICAgIHRlc3RDYXNlcy5kZWVwVW5vcmRlcmVkLmZvckVhY2goCisgICAgICAgIG1ha2VBc3NlcnRlcihtYWtlVW5vcmRlcmVkRGVlcEVxdWFsKGFzc2VydCkpCisgICAgICApOworCisgICAgICBjb25zdCBhcnIgPSBbXTsKKyAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgICAgYXJyW2ldID0gMjU1IC0gaTsKKyAgICAgIH0KKyAgICAgIGxldCBidWYgPSBuZXcgQnVmZmVyKGFycik7CisgICAgICBjbGllbnQudGVzdEJpbmFyeShidWYsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgInRlc3RCaW5hcnk6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgIGFzc2VydC5lcXVhbChyZXNwb25zZS5sZW5ndGgsIDI1NiwgInRlc3RCaW5hcnkiKTsKKyAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXNwb25zZSwgYnVmLCAidGVzdEJpbmFyeShCdWZmZXIpIik7CisgICAgICB9KTsKKyAgICAgIGJ1ZiA9IG5ldyBCdWZmZXIoYXJyKTsKKyAgICAgIGNsaWVudC50ZXN0QmluYXJ5KGJ1Zi50b1N0cmluZygiYmluYXJ5IiksIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgInRlc3RCaW5hcnk6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgIGFzc2VydC5lcXVhbChyZXNwb25zZS5sZW5ndGgsIDI1NiwgInRlc3RCaW5hcnkiKTsKKyAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXNwb25zZSwgYnVmLCAidGVzdEJpbmFyeShzdHJpbmcpIik7CisgICAgICB9KTsKKworICAgICAgY2xpZW50LnRlc3RNYXBNYXAoNDIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7CisgICAgICAgICAgIjQiOiB7ICIxIjogMSwgIjIiOiAyLCAiMyI6IDMsICI0IjogNCB9LAorICAgICAgICAgICItNCI6IHsgIi00IjogLTQsICItMyI6IC0zLCAiLTIiOiAtMiwgIi0xIjogLTEgfQorICAgICAgICB9OworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdE1hcE1hcDogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChleHBlY3RlZCwgcmVzcG9uc2UsICJ0ZXN0TWFwTWFwIik7CisgICAgICB9KTsKKworICAgICAgY2xpZW50LnRlc3RTdHJ1Y3QodGVzdENhc2VzLm91dCwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdFN0cnVjdDogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMub3V0LCByZXNwb25zZSwgInRlc3RTdHJ1Y3QiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdE5lc3QodGVzdENhc2VzLm91dDIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgInRlc3ROZXN0OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQyLCByZXNwb25zZSwgInRlc3ROZXN0Iik7CisgICAgICB9KTsKKworICAgICAgY2xpZW50LnRlc3RJbnNhbml0eSh0ZXN0Q2FzZXMuY3JhenksIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgInRlc3RJbnNhbml0eTogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMuaW5zYW5pdHksIHJlc3BvbnNlLCAidGVzdEluc2FuaXR5Iik7CisgICAgICB9KTsKKworICAgICAgY2xpZW50LnRlc3RJbnNhbml0eSh0ZXN0Q2FzZXMuY3JhenkyLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0SW5zYW5pdHkyOiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5pbnNhbml0eSwgcmVzcG9uc2UsICJ0ZXN0SW5zYW5pdHkyIik7CisgICAgICB9KTsKKworICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5vaygKKyAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBURXhjZXB0aW9uLAorICAgICAgICAgICJ0ZXN0RXhjZXB0aW9uOiBjb3JyZWN0IGVycm9yIHR5cGUiCisgICAgICAgICk7CisgICAgICAgIGFzc2VydC5vayghcmVzcG9uc2UsICJ0ZXN0RXhjZXB0aW9uOiBubyByZXNwb25zZSIpOworICAgICAgfSk7CisKKyAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0Lm9rKAorICAgICAgICAgIGVyciBpbnN0YW5jZW9mIHR0eXBlcy5YY2VwdGlvbiwKKyAgICAgICAgICAidGVzdEV4Y2VwdGlvbjogY29ycmVjdCBlcnJvciB0eXBlIgorICAgICAgICApOworICAgICAgICBhc3NlcnQub2soIXJlc3BvbnNlLCAidGVzdEV4Y2VwdGlvbjogbm8gcmVzcG9uc2UiKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGVyci5lcnJvckNvZGUsIDEwMDEsICJ0ZXN0RXhjZXB0aW9uOiBjb3JyZWN0IGVycm9yIGNvZGUiKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgICAgICJYY2VwdGlvbiIsCisgICAgICAgICAgZXJyLm1lc3NhZ2UsCisgICAgICAgICAgInRlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgbWVzc2FnZSIKKyAgICAgICAgKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigibm8gRXhjZXB0aW9uIiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdEV4Y2VwdGlvbjogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgYXNzZXJ0Lm9rKCFyZXNwb25zZSwgInRlc3RFeGNlcHRpb246IG5vIHJlc3BvbnNlIik7CisgICAgICB9KTsKKworICAgICAgY2xpZW50LnRlc3RPbmV3YXkoMCwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdE9uZXdheTogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3BvbnNlLCB1bmRlZmluZWQsICJ0ZXN0T25ld2F5OiB2b2lkIHJlc3BvbnNlIik7CisgICAgICB9KTsKKworICAgICAgY2hlY2tPZmZCeU9uZShmdW5jdGlvbihkb25lKSB7CisgICAgICAgIGNsaWVudC50ZXN0STMyKC0xLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgImNoZWNrT2ZmQnlPbmU6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgICAgYXNzZXJ0LmVxdWFsKC0xLCByZXNwb25zZSk7CisgICAgICAgICAgYXNzZXJ0LmVuZCgpOworICAgICAgICAgIGRvbmUoKTsKKyAgICAgICAgfSk7CisgICAgICB9LCBjYWxsYmFjayk7CisgICAgfQorICApOworCisgIC8vIEVTNiBkb2VzIG5vdCBzdXBwb3J0IGNhbGxiYWNrIHN0eWxlCisgIGlmIChoZWxwZXJzLmVjbWFNb2RlID09PSAiZXM2IikgeworICAgIGNoZWNrT2ZmQnlPbmUoZG9uZSA9PiBkb25lKCksIGNhbGxiYWNrKTsKKyAgfQorfTsKKworZXhwb3J0cy5UaHJpZnRUZXN0RHJpdmVyUHJvbWlzZSA9IGZ1bmN0aW9uKGNsaWVudCwgY2FsbGJhY2spIHsKKyAgdGVzdCgiUHJvbWlzZSBDbGllbnQgVGVzdHMiLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCBjaGVja1JlY3Vyc2l2ZWx5ID0gbWFrZVJlY3Vyc2l2ZUNoZWNrKGFzc2VydCk7CisKKyAgICBmdW5jdGlvbiBtYWtlQXNzZXJ0ZXIoYXNzZXJ0aW9uRm4pIHsKKyAgICAgIHJldHVybiBmdW5jdGlvbihjKSB7CisgICAgICAgIGNvbnN0IGZuTmFtZSA9IGNbMF07CisgICAgICAgIGNvbnN0IGV4cGVjdGVkID0gY1sxXTsKKyAgICAgICAgY2xpZW50W2ZuTmFtZV0oZXhwZWN0ZWQpCisgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oYWN0dWFsKSB7CisgICAgICAgICAgICBhc3NlcnRpb25GbihhY3R1YWwsIGV4cGVjdGVkLCBmbk5hbWUpOworICAgICAgICAgIH0pCisgICAgICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJmbk5hbWUiKSk7CisgICAgICB9OworICAgIH0KKworICAgIHRlc3RDYXNlcy5zaW1wbGUuZm9yRWFjaCgKKyAgICAgIG1ha2VBc3NlcnRlcihmdW5jdGlvbihhLCBlLCBtKSB7CisgICAgICAgIGlmIChhIGluc3RhbmNlb2YgSW50NjQpIHsKKyAgICAgICAgICBjb25zdCBlNjQgPSBlIGluc3RhbmNlb2YgSW50NjQgPyBlIDogbmV3IEludDY0KGUpOworICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwoYS5idWZmZXIsIGU2NC5idWZmZXIsIG0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGFzc2VydC5lcXVhbChhLCBlLCBtKTsKKyAgICAgICAgfQorICAgICAgfSkKKyAgICApOworICAgIHRlc3RDYXNlcy5kZWVwLmZvckVhY2gobWFrZUFzc2VydGVyKGFzc2VydC5kZWVwRXF1YWwpKTsKKyAgICB0ZXN0Q2FzZXMuZGVlcFVub3JkZXJlZC5mb3JFYWNoKAorICAgICAgbWFrZUFzc2VydGVyKG1ha2VVbm9yZGVyZWREZWVwRXF1YWwoYXNzZXJ0KSkKKyAgICApOworCisgICAgY2xpZW50CisgICAgICAudGVzdFN0cnVjdCh0ZXN0Q2FzZXMub3V0KQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMub3V0LCByZXNwb25zZSwgInRlc3RTdHJ1Y3QiKTsKKyAgICAgIH0pCisgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoInRlc3RTdHJ1Y3QiKSk7CisKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0TmVzdCh0ZXN0Q2FzZXMub3V0MikKKyAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dDIsIHJlc3BvbnNlLCAidGVzdE5lc3QiKTsKKyAgICAgIH0pCisgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoInRlc3ROZXN0IikpOworCisgICAgY2xpZW50CisgICAgICAudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eSkKKyAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgInRlc3RJbnNhbml0eSIpOworICAgICAgfSkKKyAgICAgIC5jYXRjaCgoKSA9PiBhc3NlcnQuZmFpbCgidGVzdEluc2FuaXR5IikpOworCisgICAgY2xpZW50CisgICAgICAudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eTIpCisgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5pbnNhbml0eSwgcmVzcG9uc2UsICJ0ZXN0SW5zYW5pdHkyIik7CisgICAgICB9KQorICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJ0ZXN0SW5zYW5pdHkyIikpOworCisgICAgY2xpZW50CisgICAgICAudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpCisgICAgICAudGhlbihmdW5jdGlvbigpIHsKKyAgICAgICAgYXNzZXJ0LmZhaWwoInRlc3RFeGNlcHRpb246IFRFeGNlcHRpb24iKTsKKyAgICAgIH0pCisgICAgICAuY2F0Y2goZnVuY3Rpb24oZXJyKSB7CisgICAgICAgIGFzc2VydC5vayhlcnIgaW5zdGFuY2VvZiBURXhjZXB0aW9uKTsKKyAgICAgIH0pOworCisgICAgY2xpZW50CisgICAgICAudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKQorICAgICAgLnRoZW4oZnVuY3Rpb24oKSB7CisgICAgICAgIGFzc2VydC5mYWlsKCJ0ZXN0RXhjZXB0aW9uOiBYY2VwdGlvbiIpOworICAgICAgfSkKKyAgICAgIC5jYXRjaChmdW5jdGlvbihlcnIpIHsKKyAgICAgICAgYXNzZXJ0Lm9rKGVyciBpbnN0YW5jZW9mIHR0eXBlcy5YY2VwdGlvbik7CisgICAgICAgIGFzc2VydC5lcXVhbChlcnIuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKCJYY2VwdGlvbiIsIGVyci5tZXNzYWdlKTsKKyAgICAgIH0pOworCisgICAgY2xpZW50CisgICAgICAudGVzdEV4Y2VwdGlvbigibm8gRXhjZXB0aW9uIikKKyAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcXVhbCh1bmRlZmluZWQsIHJlc3BvbnNlKTsgLy92b2lkCisgICAgICB9KQorICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJ0ZXN0RXhjZXB0aW9uIikpOworCisgICAgY2xpZW50CisgICAgICAudGVzdE9uZXdheSgwKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3BvbnNlLCB1bmRlZmluZWQsICJ0ZXN0T25ld2F5OiB2b2lkIHJlc3BvbnNlIik7CisgICAgICB9KQorICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJ0ZXN0T25ld2F5OiBzaG91bGQgbm90IHJlamVjdCIpKTsKKworICAgIGNoZWNrT2ZmQnlPbmUoZnVuY3Rpb24oZG9uZSkgeworICAgICAgY2xpZW50CisgICAgICAgIC50ZXN0STMyKC0xKQorICAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICAgIGFzc2VydC5lcXVhbCgtMSwgcmVzcG9uc2UpOworICAgICAgICAgIGFzc2VydC5lbmQoKTsKKyAgICAgICAgICBkb25lKCk7CisgICAgICAgIH0pCisgICAgICAgIC5jYXRjaCgoKSA9PiBhc3NlcnQuZmFpbCgiY2hlY2tPZmZCeU9uZSIpKTsKKyAgICB9LCBjYWxsYmFjayk7CisgIH0pOworfTsKKworLy8gSGVscGVyIEZ1bmN0aW9ucworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2Z1bmN0aW9uIG1ha2VSZWN1cnNpdmVDaGVjayhhc3NlcnQpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKG1hcDEsIG1hcDIsIG1zZykgeworICAgIGNvbnN0IGVxdWFsID0gY2hlY2tSZWN1cnNpdmVseShtYXAxLCBtYXAyKTsKKworICAgIGFzc2VydC5vayhlcXVhbCwgbXNnKTsKKworICAgIC8vIGRlZXBFcXVhbCBkb2Vzbid0IHdvcmsgd2l0aCBmaWVsZHMgdXNpbmcgbm9kZS1pbnQ2NAorICAgIGZ1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkobWFwMSwgbWFwMikgeworICAgICAgaWYgKHR5cGVvZiBtYXAxICE9PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBtYXAyICE9PSAiZnVuY3Rpb24iKSB7CisgICAgICAgIGlmICghbWFwMSB8fCB0eXBlb2YgbWFwMSAhPT0gIm9iamVjdCIpIHsKKyAgICAgICAgICAvL0hhbmRsZSBpbnQ2NCB0eXBlcyAod2hpY2ggdXNlIG5vZGUtaW50NjQgaW4gTm9kZS5qcyBKYXZhU2NyaXB0KQorICAgICAgICAgIGlmICgKKyAgICAgICAgICAgIHR5cGVvZiBtYXAxID09PSAibnVtYmVyIiAmJgorICAgICAgICAgICAgdHlwZW9mIG1hcDIgPT09ICJvYmplY3QiICYmCisgICAgICAgICAgICBtYXAyLmJ1ZmZlciAmJgorICAgICAgICAgICAgbWFwMi5idWZmZXIgaW5zdGFuY2VvZiBCdWZmZXIgJiYKKyAgICAgICAgICAgIG1hcDIuYnVmZmVyLmxlbmd0aCA9PT0gOAorICAgICAgICAgICkgeworICAgICAgICAgICAgY29uc3QgbiA9IG5ldyBJbnQ2NChtYXAyLmJ1ZmZlcik7CisgICAgICAgICAgICByZXR1cm4gbWFwMSA9PT0gbi50b051bWJlcigpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbWFwMSA9PSBtYXAyOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMobWFwMSkuZXZlcnkoZnVuY3Rpb24oa2V5KSB7CisgICAgICAgICAgICByZXR1cm4gY2hlY2tSZWN1cnNpdmVseShtYXAxW2tleV0sIG1hcDJba2V5XSk7CisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07Cit9CisKK2Z1bmN0aW9uIGNoZWNrT2ZmQnlPbmUoZG9uZSwgY2FsbGJhY2spIHsKKyAgY29uc3QgcmV0cnlfbGltaXQgPSAzMDsKKyAgY29uc3QgcmV0cnlfaW50ZXJ2YWwgPSAxMDA7CisgIGxldCB0ZXN0X2NvbXBsZXRlID0gZmFsc2U7CisgIGxldCByZXRyeXMgPSAwOworCisgIC8qKgorICAgKiByZWRvIGEgc2ltcGxlIHRlc3QgYWZ0ZXIgdGhlIG9uZXdheSB0byBtYWtlIHN1cmUgd2UgYXJlbid0ICJvZmYgYnkgb25lIiAtLQorICAgKiBpZiB0aGUgc2VydmVyIHRyZWF0ZWQgb25ld2F5IHZvaWQgbGlrZSBub3JtYWwgdm9pZCwgdGhpcyBuZXh0IHRlc3Qgd2lsbAorICAgKiBmYWlsIHNpbmNlIGl0IHdpbGwgZ2V0IHRoZSB2b2lkIGNvbmZpcm1hdGlvbiByYXRoZXIgdGhhbiB0aGUgY29ycmVjdAorICAgKiByZXN1bHQuIEluIHRoaXMgY2lyY3Vtc3RhbmNlLCB0aGUgY2xpZW50IHdpbGwgdGhyb3cgdGhlIGV4Y2VwdGlvbjoKKyAgICoKKyAgICogQmVjYXVzZSB0aGlzIGlzIHRoZSBsYXN0IHRlc3QgYWdhaW5zdCB0aGUgc2VydmVyLCB3aGVuIGl0IGNvbXBsZXRlcworICAgKiB0aGUgZW50aXJlIHN1aXRlIGlzIGNvbXBsZXRlIGJ5IGRlZmluaXRpb24gKHRoZSB0ZXN0cyBydW4gc2VyaWFsbHkpLgorICAgKi8KKyAgZG9uZShmdW5jdGlvbigpIHsKKyAgICB0ZXN0X2NvbXBsZXRlID0gdHJ1ZTsKKyAgfSk7CisKKyAgLy9XZSB3YWl0IHVwIHRvIHJldHJ5X2xpbWl0ICogcmV0cnlfaW50ZXJ2YWwgZm9yIHRoZSB0ZXN0IHN1aXRlIHRvIGNvbXBsZXRlCisgIGZ1bmN0aW9uIFRlc3RGb3JDb21wbGV0aW9uKCkgeworICAgIGlmICh0ZXN0X2NvbXBsZXRlICYmIGNhbGxiYWNrKSB7CisgICAgICBjYWxsYmFjaygiU2VydmVyIHN1Y2Nlc3NmdWxseSB0ZXN0ZWQhIik7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICgrK3JldHJ5cyA8IHJldHJ5X2xpbWl0KSB7CisgICAgICAgIHNldFRpbWVvdXQoVGVzdEZvckNvbXBsZXRpb24sIHJldHJ5X2ludGVydmFsKTsKKyAgICAgIH0gZWxzZSBpZiAoY2FsbGJhY2spIHsKKyAgICAgICAgY2FsbGJhY2soCisgICAgICAgICAgIlNlcnZlciB0ZXN0IGZhaWxlZCB0byBjb21wbGV0ZSBhZnRlciAiICsKKyAgICAgICAgICAgIChyZXRyeV9saW1pdCAqIHJldHJ5X2ludGVydmFsKSAvIDEwMDAgKworICAgICAgICAgICAgIiBzZWNvbmRzIgorICAgICAgICApOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHNldFRpbWVvdXQoVGVzdEZvckNvbXBsZXRpb24sIHJldHJ5X2ludGVydmFsKTsKK30KKworZnVuY3Rpb24gbWFrZVVub3JkZXJlZERlZXBFcXVhbChhc3NlcnQpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQsIG5hbWUpIHsKKyAgICBhc3NlcnQuZXF1YWwoYWN0dWFsLmxlbmd0aCwgZXhwZWN0ZWQubGVuZ3RoLCBuYW1lKTsKKyAgICBmb3IgKGNvbnN0IGsgaW4gYWN0dWFsKSB7CisgICAgICBsZXQgZm91bmQgPSBmYWxzZTsKKyAgICAgIGZvciAoY29uc3QgazIgaW4gZXhwZWN0ZWQpIHsKKyAgICAgICAgaWYgKGFjdHVhbFtrXSA9PT0gZXhwZWN0ZWRbazJdKSB7CisgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgIGFzc2VydC5mYWlsKCJVbmV4cGVjdGVkIHZhbHVlICIgKyBhY3R1YWxba10gKyAiIHdpdGgga2V5ICIgKyBrKTsKKyAgICAgIH0KKyAgICB9CisgIH07Cit9CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvdGVzdF9oYW5kbGVyLmpzIGIvbGliL25vZGVqcy90ZXN0L3Rlc3RfaGFuZGxlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTdhN2M4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L3Rlc3RfaGFuZGxlci5qcwpAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL1RoaXMgaXMgdGhlIHNlcnZlciBzaWRlIE5vZGUgdGVzdCBoYW5kbGVyIGZvciB0aGUgc3RhbmRhcmQKKy8vICBBcGFjaGUgVGhyaWZ0IHRlc3Qgc2VydmljZS4KK2NvbnN0IGhlbHBlcnMgPSByZXF1aXJlKCIuL2hlbHBlcnMiKTsKK2NvbnN0IHR0eXBlcyA9IHJlcXVpcmUoYC4vJHtoZWxwZXJzLmdlblBhdGh9L1RocmlmdFRlc3RfdHlwZXNgKTsKK2NvbnN0IFRFeGNlcHRpb24gPSByZXF1aXJlKCJ0aHJpZnQiKS5UaHJpZnQuVEV4Y2VwdGlvbjsKKworZnVuY3Rpb24gbWFrZVN5bmNIYW5kbGVyKCkgeworICByZXR1cm4gZnVuY3Rpb24odGhpbmcpIHsKKyAgICByZXR1cm4gdGhpbmc7CisgIH07Cit9CisKK2NvbnN0IHN5bmNIYW5kbGVycyA9IHsKKyAgdGVzdFZvaWQ6IHRlc3RWb2lkLAorICB0ZXN0TWFwTWFwOiB0ZXN0TWFwTWFwLAorICB0ZXN0SW5zYW5pdHk6IHRlc3RJbnNhbml0eSwKKyAgdGVzdE11bHRpOiB0ZXN0TXVsdGksCisgIHRlc3RFeGNlcHRpb246IHRlc3RFeGNlcHRpb24sCisgIHRlc3RNdWx0aUV4Y2VwdGlvbjogdGVzdE11bHRpRXhjZXB0aW9uLAorICB0ZXN0T25ld2F5OiB0ZXN0T25ld2F5Cit9OworCitmdW5jdGlvbiBtYWtlQXN5bmNIYW5kbGVyKGxhYmVsKSB7CisgIHJldHVybiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7CisgICAgdGhpbmcgPSBzeW5jSGFuZGxlcnNbbGFiZWxdKHRoaW5nKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9OworfQorCitjb25zdCBhc3luY0hhbmRsZXJzID0geworICB0ZXN0Vm9pZDogdGVzdFZvaWRBc3luYywKKyAgdGVzdE11bHRpOiB0ZXN0TXVsdGlBc3luYywKKyAgdGVzdEV4Y2VwdGlvbjogdGVzdEV4Y2VwdGlvbkFzeW5jLAorICB0ZXN0TXVsdGlFeGNlcHRpb246IHRlc3RNdWx0aUV4Y2VwdGlvbkFzeW5jLAorICB0ZXN0T25ld2F5OiB0ZXN0T25ld2F5QXN5bmMKK307CisKK2NvbnN0IGlkZW50aXR5SGFuZGxlcnMgPSBbCisgICJ0ZXN0U3RyaW5nIiwKKyAgInRlc3RCb29sIiwKKyAgInRlc3RCeXRlIiwKKyAgInRlc3RJMzIiLAorICAidGVzdEk2NCIsCisgICJ0ZXN0RG91YmxlIiwKKyAgInRlc3RCaW5hcnkiLAorICAidGVzdFN0cnVjdCIsCisgICJ0ZXN0TmVzdCIsCisgICJ0ZXN0TWFwIiwKKyAgInRlc3RTdHJpbmdNYXAiLAorICAidGVzdFNldCIsCisgICJ0ZXN0TGlzdCIsCisgICJ0ZXN0RW51bSIsCisgICJ0ZXN0VHlwZWRlZiIKK107CisKK2Z1bmN0aW9uIHRlc3RWb2lkKCkgeworICAvL2NvbnNvbGUubG9nKCd0ZXN0Vm9pZCgpJyk7Cit9CisKK2Z1bmN0aW9uIHRlc3RWb2lkQXN5bmMocmVzdWx0KSB7CisgIHJlc3VsdCh0ZXN0Vm9pZCgpKTsKK30KKworZnVuY3Rpb24gdGVzdE1hcE1hcCgpIHsKKyAgY29uc3QgbWFwbWFwID0gW107CisgIGNvbnN0IHBvcyA9IFtdOworICBjb25zdCBuZWcgPSBbXTsKKyAgZm9yIChsZXQgaSA9IDE7IGkgPCA1OyBpKyspIHsKKyAgICBwb3NbaV0gPSBpOworICAgIG5lZ1staV0gPSAtaTsKKyAgfQorICBtYXBtYXBbNF0gPSBwb3M7CisgIG1hcG1hcFstNF0gPSBuZWc7CisKKyAgcmV0dXJuIG1hcG1hcDsKK30KKworZnVuY3Rpb24gdGVzdEluc2FuaXR5KGFyZ3VtZW50KSB7CisgIC8vY29uc29sZS5sb2coJ3Rlc3RJbnNhbml0eSgnKTsKKyAgLy9jb25zb2xlLmxvZyhhcmd1bWVudCk7CisgIC8vY29uc29sZS5sb2coJyknKTsKKworICBjb25zdCBmaXJzdF9tYXAgPSBbXTsKKyAgY29uc3Qgc2Vjb25kX21hcCA9IFtdOworCisgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5UV09dID0gYXJndW1lbnQ7CisgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5USFJFRV0gPSBhcmd1bWVudDsKKworICBjb25zdCBsb29uZXkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KCk7CisgIHNlY29uZF9tYXBbdHR5cGVzLk51bWJlcnouU0lYXSA9IGxvb25leTsKKworICBjb25zdCBpbnNhbmUgPSBbXTsKKyAgaW5zYW5lWzFdID0gZmlyc3RfbWFwOworICBpbnNhbmVbMl0gPSBzZWNvbmRfbWFwOworCisgIC8vY29uc29sZS5sb2coJ2luc2FuZSByZXN1bHQ6Jyk7CisgIC8vY29uc29sZS5sb2coaW5zYW5lKTsKKyAgcmV0dXJuIGluc2FuZTsKK30KKworZnVuY3Rpb24gdGVzdE11bHRpKGFyZzAsIGFyZzEsIGFyZzIpIHsKKyAgLy9jb25zb2xlLmxvZygndGVzdE11bHRpKCknKTsKKworICBjb25zdCBoZWxsbyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgIGhlbGxvLnN0cmluZ190aGluZyA9ICJIZWxsbzIiOworICBoZWxsby5ieXRlX3RoaW5nID0gYXJnMDsKKyAgaGVsbG8uaTMyX3RoaW5nID0gYXJnMTsKKyAgaGVsbG8uaTY0X3RoaW5nID0gYXJnMjsKKyAgcmV0dXJuIGhlbGxvOworfQorCitmdW5jdGlvbiB0ZXN0TXVsdGlBc3luYyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCByZXN1bHQpIHsKKyAgY29uc3QgaGVsbG8gPSB0ZXN0TXVsdGkoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CisgIHJlc3VsdChudWxsLCBoZWxsbyk7Cit9CisKK2Z1bmN0aW9uIHRlc3RFeGNlcHRpb24oYXJnKSB7CisgIC8vY29uc29sZS5sb2coJ3Rlc3RFeGNlcHRpb24oJythcmcrJyknKTsKKyAgaWYgKGFyZyA9PT0gIlhjZXB0aW9uIikgeworICAgIGNvbnN0IHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgIHgubWVzc2FnZSA9IGFyZzsKKyAgICB0aHJvdyB4OworICB9IGVsc2UgaWYgKGFyZyA9PT0gIlRFeGNlcHRpb24iKSB7CisgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oYXJnKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm47CisgIH0KK30KKworZnVuY3Rpb24gdGVzdEV4Y2VwdGlvbkFzeW5jKGFyZywgcmVzdWx0KSB7CisgIC8vY29uc29sZS5sb2coJ3Rlc3RFeGNlcHRpb24oJythcmcrJyknKTsKKyAgaWYgKGFyZyA9PT0gIlhjZXB0aW9uIikgeworICAgIGNvbnN0IHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgIHgubWVzc2FnZSA9IGFyZzsKKyAgICByZXN1bHQoeCk7CisgIH0gZWxzZSBpZiAoYXJnID09PSAiVEV4Y2VwdGlvbiIpIHsKKyAgICByZXN1bHQobmV3IFRFeGNlcHRpb24oYXJnKSk7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0KG51bGwpOworICB9Cit9CisKK2Z1bmN0aW9uIHRlc3RNdWx0aUV4Y2VwdGlvbihhcmcwLCBhcmcxKSB7CisgIC8vY29uc29sZS5sb2coJ3Rlc3RNdWx0aUV4Y2VwdGlvbignICsgYXJnMCArICcsICcgKyBhcmcxICsgJyknKTsKKyAgaWYgKGFyZzAgPT09ICJYY2VwdGlvbiIpIHsKKyAgICBjb25zdCB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICB4Lm1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiI7CisgICAgdGhyb3cgeDsKKyAgfSBlbHNlIGlmIChhcmcwID09PSAiWGNlcHRpb24yIikgeworICAgIGNvbnN0IHgyID0gbmV3IHR0eXBlcy5YY2VwdGlvbjIoKTsKKyAgICB4Mi5lcnJvckNvZGUgPSAyMDAyOworICAgIHgyLnN0cnVjdF90aGluZyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgeDIuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiI7CisgICAgdGhyb3cgeDI7CisgIH0KKworICBjb25zdCByZXMgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICByZXMuc3RyaW5nX3RoaW5nID0gYXJnMTsKKyAgcmV0dXJuIHJlczsKK30KKworZnVuY3Rpb24gdGVzdE11bHRpRXhjZXB0aW9uQXN5bmMoYXJnMCwgYXJnMSwgcmVzdWx0KSB7CisgIC8vY29uc29sZS5sb2coJ3Rlc3RNdWx0aUV4Y2VwdGlvbignICsgYXJnMCArICcsICcgKyBhcmcxICsgJyknKTsKKyAgaWYgKGFyZzAgPT09ICJYY2VwdGlvbiIpIHsKKyAgICBjb25zdCB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICB4Lm1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiI7CisgICAgcmVzdWx0KHgpOworICB9IGVsc2UgaWYgKGFyZzAgPT09ICJYY2VwdGlvbjIiKSB7CisgICAgY29uc3QgeDIgPSBuZXcgdHR5cGVzLlhjZXB0aW9uMigpOworICAgIHgyLmVycm9yQ29kZSA9IDIwMDI7CisgICAgeDIuc3RydWN0X3RoaW5nID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICB4Mi5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIjsKKyAgICByZXN1bHQoeDIpOworICB9IGVsc2UgeworICAgIGNvbnN0IHJlcyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgcmVzLnN0cmluZ190aGluZyA9IGFyZzE7CisgICAgcmVzdWx0KG51bGwsIHJlcyk7CisgIH0KK30KKworLy9jb25zb2xlLmxvZygndGVzdE9uZXdheSgnICsgc2xlZXBGb3IgKyAnKSA9PiBKYXZhU2NyaXB0IChsaWtlIFJ1c3QpIG5ldmVyIHNsZWVwcyEnKTsKK2Z1bmN0aW9uIHRlc3RPbmV3YXkoKSB7fQorCitmdW5jdGlvbiB0ZXN0T25ld2F5QXN5bmMoc2xlZXBGb3IpIHsKKyAgdGVzdE9uZXdheShzbGVlcEZvcik7Cit9CisKK2lkZW50aXR5SGFuZGxlcnMuZm9yRWFjaChmdW5jdGlvbihsYWJlbCkgeworICBzeW5jSGFuZGxlcnNbbGFiZWxdID0gbWFrZVN5bmNIYW5kbGVyKGxhYmVsKTsKKyAgYXN5bmNIYW5kbGVyc1tsYWJlbF0gPSBtYWtlQXN5bmNIYW5kbGVyKGxhYmVsKTsKK30pOworCitbInRlc3RNYXBNYXAiLCAidGVzdEluc2FuaXR5Il0uZm9yRWFjaChmdW5jdGlvbihsYWJlbCkgeworICBhc3luY0hhbmRsZXJzW2xhYmVsXSA9IG1ha2VBc3luY0hhbmRsZXIobGFiZWwpOworfSk7CisKK2V4cG9ydHMuVGhyaWZ0VGVzdEhhbmRsZXIgPSBhc3luY0hhbmRsZXJzOwpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy8uZ2l0aWdub3JlIGIvbGliL25vZGV0cy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YWJhODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAordGVzdC1jb21waWxlZC8KZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvTWFrZWZpbGUuYW0gYi9saWIvbm9kZXRzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVhNjQwY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDUgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFdlIGNhbGwgbnBtIHR3aWNlIHRvIHdvcmsgYXJvdW5kIG5wbSBpc3N1ZXMKKworc3R1YnM6ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCW1rZGlyIC1wIHRlc3QtY29tcGlsZWQKKwkkKFRIUklGVCkgLS1nZW4ganM6bm9kZSx0cyAtbyB0ZXN0LyAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgJiYgJChUSFJJRlQpIC0tZ2VuIGpzOm5vZGUsdHMgLW8gdGVzdC1jb21waWxlZCAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKwordHMtY29tcGlsZTogc3R1YnMKKwlta2RpciAtcCB0ZXN0LWNvbXBpbGVkCisJLi4vLi4vbm9kZV9tb2R1bGVzL3R5cGVzY3JpcHQvYmluL3RzYyAtLW91dERpciB0ZXN0LWNvbXBpbGVkLyAtLXByb2plY3QgdGVzdC90c2NvbmZpZy5qc29uCisKK2RlcHM6ICQodG9wX3NyY2RpcikvcGFja2FnZS5qc29uCisJJChOUE0pIGluc3RhbGwgJCh0b3Bfc3JjZGlyKS8gfHwgJChOUE0pIGluc3RhbGwgJCh0b3Bfc3JjZGlyKS8KKworYWxsLWxvY2FsOiBkZXBzIHRzLWNvbXBpbGUKKworcHJlY3Jvc3M6IGRlcHMgc3R1YnMgdHMtY29tcGlsZQorCitjaGVjazogZGVwcyB0cy1jb21waWxlCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKE5QTSkgcnVuIHRlc3QtdHMgJiYgY2QgbGliL25vZGV0cworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciB0ZXN0L2dlbi1ub2RlanMKKwkkKFJNKSAtciAkKHRvcF9zcmNkaXIpL25vZGVfbW9kdWxlcworCSQoUk0pIC1yIHRlc3QtY29tcGlsZWQKKworRVhUUkFfRElTVCA9IFwKKwl0ZXN0IFwKKwljb2Rpbmdfc3RhbmRhcmRzLm1kCmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvbm9kZXRzL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC9jbGllbnQudHMgYi9saWIvbm9kZXRzL3Rlc3QvY2xpZW50LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYTNjMjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL3Rlc3QvY2xpZW50LnRzCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IGFzc2VydCA9IHJlcXVpcmUoImFzc2VydCIpOworaW1wb3J0IHRocmlmdCA9IHJlcXVpcmUoInRocmlmdCIpOworaW1wb3J0IFRocmlmdCA9IHRocmlmdC5UaHJpZnQ7CitpbXBvcnQgVGhyaWZ0VGVzdCA9IHJlcXVpcmUoIi4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0Iik7CitpbXBvcnQgdGVzdF9kcml2ZXIgPSByZXF1aXJlKCIuL3Rlc3RfZHJpdmVyIik7CitpbXBvcnQgVGhyaWZ0VGVzdERyaXZlciA9IHRlc3RfZHJpdmVyLlRocmlmdFRlc3REcml2ZXI7CitpbXBvcnQgVGhyaWZ0VGVzdERyaXZlclByb21pc2UgPSB0ZXN0X2RyaXZlci5UaHJpZnRUZXN0RHJpdmVyUHJvbWlzZTsKKworLy8gdmFyIHByb2dyYW0gPSByZXF1aXJlKCJjb21tYW5kZXIiKTsKK2ltcG9ydCAqIGFzIHByb2dyYW0gZnJvbSAiY29tbWFuZGVyIjsKKworcHJvZ3JhbQorICAub3B0aW9uKCItLXBvcnQgPHBvcnQ+IiwgIlNldCB0aHJpZnQgc2VydmVyIHBvcnQgbnVtYmVyIHRvIGNvbm5lY3QiLCA5MDkwKQorICAub3B0aW9uKCItLXByb21pc2UiLCAidGVzdCB3aXRoIHByb21pc2Ugc3R5bGUgZnVuY3Rpb25zIikKKyAgLm9wdGlvbigiLS1wcm90b2NvbCIsICJTZXQgdGhyaWZ0IHByb3RvY29sIChiaW5hcnkpIFtwcm90b2NvbF0iKQorICAucGFyc2UocHJvY2Vzcy5hcmd2KTsKKwordmFyIHBvcnQ6IG51bWJlciA9IHByb2dyYW0ucG9ydDsKK3ZhciBwcm9taXNlID0gcHJvZ3JhbS5wcm9taXNlOworCit2YXIgb3B0aW9ucyA9IHsKKyAgdHJhbnNwb3J0OiBUaHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorICBwcm90b2NvbDogVGhyaWZ0LlRCaW5hcnlQcm90b2NvbAorfTsKKwordmFyIHRlc3REcml2ZXIgPSBwcm9taXNlID8gVGhyaWZ0VGVzdERyaXZlclByb21pc2UgOiBUaHJpZnRUZXN0RHJpdmVyOworCit2YXIgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVDb25uZWN0aW9uKCJsb2NhbGhvc3QiLCBwb3J0LCBvcHRpb25zKTsKKworY29ubmVjdGlvbi5vbigiZXJyb3IiLCBmdW5jdGlvbihlcnI6IHN0cmluZykgeworICAgIGFzc2VydChmYWxzZSwgZXJyKTsKK30pOworCit2YXIgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUNsaWVudChUaHJpZnRUZXN0LkNsaWVudCwgY29ubmVjdGlvbik7CitydW5UZXN0cygpOworCitmdW5jdGlvbiBydW5UZXN0cygpIHsKKyAgdGVzdERyaXZlcihjbGllbnQsIGZ1bmN0aW9uIChzdGF0dXM6IHN0cmluZykgeworICAgIGNvbnNvbGUubG9nKHN0YXR1cyk7CisgICAgcHJvY2Vzcy5leGl0KDApOworICB9KTsKK30KKworZXhwb3J0cy5leHByZXNzb1Rlc3QgPSBmdW5jdGlvbigpIHt9OwpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy90ZXN0L3J1bkNsaWVudC5zaCBiL2xpYi9ub2RldHMvdGVzdC9ydW5DbGllbnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGQ1ZTlhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvdGVzdC9ydW5DbGllbnQuc2gKQEAgLTAsMCArMSwxOCBAQAorIyEgL2Jpbi9zaAorCitESVI9IiQoIGNkICIkKCBkaXJuYW1lICIkMCIgKSIgJiYgcHdkICkiCisKK21rZGlyIC1wICRESVIvLi4vdGVzdC1jb21waWxlZAorCitDT01QSUxFRERJUj0iJChjZCAkRElSICYmIGNkIC4uL3Rlc3QtY29tcGlsZWQgJiYgcHdkKSIKK2V4cG9ydCBOT0RFX1BBVEg9IiR7RElSfToke0RJUn0vLi4vLi4vbm9kZWpzL2xpYjoke05PREVfUEFUSH0iCisKK2NvbXBpbGUoKQoreworICAjZ2VuZXJhdGluZyB0aHJpZnQgY29kZQorICAke0RJUn0vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtbyAke0RJUn0gLS1nZW4ganM6bm9kZSx0cyAke0RJUn0vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICAke0RJUn0vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtbyAke0NPTVBJTEVERElSfSAtLWdlbiBqczpub2RlLHRzICR7RElSfS8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Cit9Citjb21waWxlCisKK25vZGUgJHtDT01QSUxFRERJUn0vY2xpZW50LmpzICQqCmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL3Rlc3QvcnVuU2VydmVyLnNoIGIvbGliL25vZGV0cy90ZXN0L3J1blNlcnZlci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZWVlOTI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L3J1blNlcnZlci5zaApAQCAtMCwwICsxLDIwIEBACisjISAvYmluL3NoCisKK0RJUj0iJCggY2QgIiQoIGRpcm5hbWUgIiQwIiApIiAmJiBwd2QgKSIKKworbWtkaXIgLXAgJERJUi8uLi90ZXN0LWNvbXBpbGVkCisKK0NPTVBJTEVERElSPSIkKGNkICRESVIgJiYgY2QgLi4vdGVzdC1jb21waWxlZCAmJiBwd2QpIgorZXhwb3J0IE5PREVfUEFUSD0iJHtESVJ9OiR7RElSfS8uLi8uLi9ub2RlanMvbGliOiR7Tk9ERV9QQVRIfSIKKworY29tcGlsZSgpCit7CisgICNnZW5lcmF0aW5nIHRocmlmdCBjb2RlCisgICR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vICR7RElSfSAtLWdlbiBqczpub2RlLHRzICR7RElSfS8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgICR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vICR7Q09NUElMRURESVJ9IC0tZ2VuIGpzOm5vZGUsdHMgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKK30KK2NvbXBpbGUKKworbm9kZSAke0NPTVBJTEVERElSfS9zZXJ2ZXIuanMgJCoKKworCmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL3Rlc3Qvc2VydmVyLnRzIGIvbGliL25vZGV0cy90ZXN0L3NlcnZlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGE1M2FlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L3NlcnZlci50cwpAQCAtMCwwICsxLDI2IEBACitpbXBvcnQgdGhyaWZ0ID0gcmVxdWlyZSgidGhyaWZ0Iik7Cit2YXIgcHJvZ3JhbSA9IHJlcXVpcmUoJ2NvbW1hbmRlcicpOworaW1wb3J0IFRocmlmdFRlc3QgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdCcpOworaW1wb3J0IHRlc3RfaGFuZGxlciA9IHJlcXVpcmUoJy4vdGVzdF9oYW5kbGVyJyk7CisKKworcHJvZ3JhbQorICAub3B0aW9uKCctLXBvcnQgPHBvcnQ+JywgJ1NldCB0aHJpZnQgc2VydmVyIHBvcnQnLCA5MDkwKQorICAub3B0aW9uKCctLXByb21pc2UnLCAndGVzdCB3aXRoIHByb21pc2Ugc3R5bGUgZnVuY3Rpb25zJykKKyAgLm9wdGlvbignLS1wcm90b2NvbCcsICciU2V0IHRocmlmdCBwcm90b2NvbCAoYmluYXJ5KSBbcHJvdG9jb2xdIicpCisgIC5wYXJzZShwcm9jZXNzLmFyZ3YpOworCit2YXIgcG9ydDogbnVtYmVyID0gcHJvZ3JhbS5wb3J0OworCit2YXIgb3B0aW9uczogdGhyaWZ0LlNlcnZlck9wdGlvbnMgPSB7CisgIHRyYW5zcG9ydDogdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydCwKKyAgcHJvdG9jb2w6IHRocmlmdC5UQmluYXJ5UHJvdG9jb2wKK307CisKK3ZhciBzZXJ2ZXI6IHRocmlmdC5TZXJ2ZXI7CitpZiAocHJvZ3JhbS5wcm9taXNlKSB7CisgIHNlcnZlciA9IHRocmlmdC5jcmVhdGVTZXJ2ZXIoVGhyaWZ0VGVzdC5Qcm9jZXNzb3IsIG5ldyB0ZXN0X2hhbmRsZXIuQXN5bmNUaHJpZnRUZXN0SGFuZGxlcigpLCBvcHRpb25zKTsKK30gZWxzZSB7CisgIHNlcnZlciA9IHRocmlmdC5jcmVhdGVTZXJ2ZXIoVGhyaWZ0VGVzdC5Qcm9jZXNzb3IsIG5ldyB0ZXN0X2hhbmRsZXIuU3luY1RocmlmdFRlc3RIYW5kbGVyKCksIG9wdGlvbnMpOworfQorc2VydmVyLmxpc3Rlbihwb3J0KTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC90ZXN0LWNhc2VzLnRzIGIvbGliL25vZGV0cy90ZXN0L3Rlc3QtY2FzZXMudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E3NDBlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvdGVzdC90ZXN0LWNhc2VzLnRzCkBAIC0wLDAgKzEsMTEzIEBACisndXNlIHN0cmljdCc7CisKK2ltcG9ydCB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdF90eXBlcycpOworCisvL2FsbCBMYW5ndWFnZXMgaW4gVVRGLTgKKy8qanNoaW50IC1XMTAwICovCitleHBvcnQgdmFyIHN0cmluZ1Rlc3QgPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksICIgKworICAgICJBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwgIiArCisgICAgItCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwgIiArCisgICAgIuCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgIiArCisgICAgIkNlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgIiArCisgICAgIkRhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgIiArCisgICAgIkVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgIiArCisgICAgIkZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgIiArCisgICAgIkF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksICIgKworICAgICJLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCAiICsKKyAgICAiSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCAiICsKKyAgICAi4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCAiICsKKyAgICAiUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCAiICsKKyAgICAiTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgIiArCisgICAgIkJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsINmF2KfYstmQ2LHZiNmG24wsIEJhaGFzYSAiICsKKyAgICAiTWVsYXl1LCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqIiArCisgICAgIk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgIiArCisgICAgIk9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCAiICsKKyAgICAiTm9yZnVrIC8gUGl0a2VybiwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsICIgKworICAgICLQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlICIgKworICAgICJFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssICIgKworICAgICJTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csICIgKworICAgICJUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCAiICsKKyAgICAiV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgIiArCisgICAgIkLDom4tbMOibS1nw7osIOeyteiqniI7CisvKmpzaGludCArVzEwMCAqLworCitleHBvcnQgdmFyIHNwZWNpYWxDaGFyYWN0ZXJzID0gJ3F1b3RlOiBcIiBiYWNrc2xhc2g6JyArCisgICAgJyBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXC8gJyArCisgICAgJyBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogJyArCisgICAgJyBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6ICJcXFwvXGJcblxyXHQnICsKKyAgICAnIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwnICsKKyAgICAnIGNoYXItdG8tdGVzdC1qc29uLXBhcnNpbmc6IF1dIFwiXV0gXFwiIH19fXsgW1tbICc7CisKK2V4cG9ydCB2YXIgbWFwVGVzdElucHV0ID0geworICAiYSI6IjEyMyIsICJhIGIiOiJ3aXRoIHNwYWNlcyAiLCAic2FtZSI6InNhbWUiLCAiMCI6Im51bWVyaWMga2V5IiwKKyAgImxvbmdWYWx1ZSI6c3RyaW5nVGVzdCwgc3RyaW5nVGVzdDoibG9uZyBrZXkiCit9OworCitleHBvcnQgdmFyIHNpbXBsZSA9IFsKKyAgWyd0ZXN0Vm9pZCcsIHVuZGVmaW5lZF0sCisgIFsndGVzdFN0cmluZycsICdUZXN0J10sCisgIFsndGVzdFN0cmluZycsICcnXSwKKyAgWyd0ZXN0U3RyaW5nJywgc3RyaW5nVGVzdF0sCisgIFsndGVzdFN0cmluZycsIHNwZWNpYWxDaGFyYWN0ZXJzXSwKKyAgWyd0ZXN0Qnl0ZScsIDFdLAorICBbJ3Rlc3RCeXRlJywgMF0sCisgIFsndGVzdEJ5dGUnLCAtMV0sCisgIFsndGVzdEJ5dGUnLCAtMTI3XSwKKyAgWyd0ZXN0STMyJywgLTFdLAorICBbJ3Rlc3REb3VibGUnLCAtNS4yMDk4NTIzXSwKKyAgWyd0ZXN0RG91YmxlJywgNy4wMTIwNTIxNzUyMTUwNDRdLAorICBbJ3Rlc3RFbnVtJywgdHR5cGVzLk51bWJlcnouT05FXQorXTsKKworZXhwb3J0IHZhciBzaW1wbGVMb29zZSA9IFsKKyAgWyd0ZXN0STY0JywgNV0sCisgIFsndGVzdEk2NCcsIC01XSwKKyAgWyd0ZXN0STY0JywgNzM0MzU5NzM4MzY4XSwKKyAgWyd0ZXN0STY0JywgLTM0MzU5NzM4MzY4XSwKKyAgWyd0ZXN0STY0JywgLTczNDM1OTczODM2OF0sCisgIFsndGVzdFR5cGVkZWYnLCA2OV0KK10KKwordmFyIG1hcG91dDoge1trZXk6IG51bWJlcl06IG51bWJlcjsgfSA9IHt9OworZm9yICh2YXIgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgbWFwb3V0W2ldID0gaS0xMDsKK30KKworZXhwb3J0IHZhciBkZWVwID0gWworICBbJ3Rlc3RNYXAnLCBtYXBvdXRdLAorICBbJ3Rlc3RTZXQnLCBbMSwyLDNdXSwKKyAgWyd0ZXN0TGlzdCcsIFsxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMF1dLAorICBbJ3Rlc3RTdHJpbmdNYXAnLCBtYXBUZXN0SW5wdXRdCitdOworCitleHBvcnQgdmFyIG91dCA9IG5ldyB0dHlwZXMuWHRydWN0KHsKKyAgc3RyaW5nX3RoaW5nOiAnWmVybycsCisgIGJ5dGVfdGhpbmc6IDEsCisgIGkzMl90aGluZzogLTMsCisgIGk2NF90aGluZzogMTAwMDAwMAorfSk7CisKK2V4cG9ydCB2YXIgb3V0MiA9IG5ldyB0dHlwZXMuWHRydWN0MigpOworb3V0Mi5ieXRlX3RoaW5nID0gMTsKK291dDIuc3RydWN0X3RoaW5nID0gb3V0Oworb3V0Mi5pMzJfdGhpbmcgPSA1OworCitleHBvcnQgdmFyIGNyYXp5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSh7CisgICJ1c2VyTWFwIjp7ICI1Ijo1LCAiOCI6OCB9LAorICAieHRydWN0cyI6W25ldyB0dHlwZXMuWHRydWN0KHsKKyAgICAgICJzdHJpbmdfdGhpbmciOiJHb29kYnllNCIsCisgICAgICAiYnl0ZV90aGluZyI6NCwKKyAgICAgICJpMzJfdGhpbmciOjQsCisgICAgICAiaTY0X3RoaW5nIjo0CisgICAgfSksIG5ldyB0dHlwZXMuWHRydWN0KHsKKyAgICAgICJzdHJpbmdfdGhpbmciOiJIZWxsbzIiLAorICAgICAgImJ5dGVfdGhpbmciOjIsCisgICAgICAiaTMyX3RoaW5nIjoyLAorICAgICAgImk2NF90aGluZyI6MgorICAgIH0pXQorfSk7CisKK2V4cG9ydCB2YXIgaW5zYW5pdHk6IGFueSA9IHsKKyAgIjEiOnsgIjIiOiBjcmF6eSwgIjMiOiBjcmF6eSB9LAorICAiMiI6eyAiNiI6eyAidXNlck1hcCI6e30sICJ4dHJ1Y3RzIjpbXSB9IH0KK307CmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL3Rlc3QvdGVzdEFsbC5zaCBiL2xpYi9ub2RldHMvdGVzdC90ZXN0QWxsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE3YzAwYmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL3Rlc3QvdGVzdEFsbC5zaApAQCAtMCwwICsxLDM4IEBACisjISAvYmluL3NoCisKK0RJUj0iJCggY2QgIiQoIGRpcm5hbWUgIiQwIiApIiAmJiBwd2QgKSIKKworbWtkaXIgLXAgJERJUi8uLi90ZXN0LWNvbXBpbGVkCisKK0NPTVBJTEVERElSPSIkKGNkICRESVIgJiYgY2QgLi4vdGVzdC1jb21waWxlZCAmJiBwd2QpIgorZXhwb3J0IE5PREVfUEFUSD0iJHtESVJ9OiR7RElSfS8uLi8uLi9ub2RlanMvbGliOiR7Tk9ERV9QQVRIfSIKKworY29tcGlsZSgpCit7CisgICNnZW5lcmF0aW5nIHRocmlmdCBjb2RlCisgICR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vICR7RElSfSAtLWdlbiBqczpub2RlLHRzICR7RElSfS8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgICR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vICR7Q09NUElMRURESVJ9IC0tZ2VuIGpzOm5vZGUsdHMgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKworICB0c2MgLS1vdXREaXIgJENPTVBJTEVERElSIC0tcHJvamVjdCAkRElSL3RzY29uZmlnLmpzb24KK30KK2NvbXBpbGUKKwordGVzdFNlcnZlcigpCit7CisgIGVjaG8gInN0YXJ0IHNlcnZlciAkMSIKKyAgUkVUPTAKKyAgbm9kZSAke0NPTVBJTEVERElSfS9zZXJ2ZXIuanMgJDEgJgorICBTRVJWRVJQSUQ9JCEKKyAgc2xlZXAgMQorICBlY2hvICJzdGFydCBjbGllbnQgJDEiCisgIG5vZGUgJHtDT01QSUxFRERJUn0vY2xpZW50LmpzICQxIHx8IFJFVD0xCisgIGtpbGwgLTIgJFNFUlZFUlBJRCB8fCBSRVQ9MQorICByZXR1cm4gJFJFVAorfQorCisjaW50ZWdyYXRpb24gdGVzdHMKKwordGVzdFNlcnZlciB8fCBURVNUT0s9MQordGVzdFNlcnZlciAtLXByb21pc2UgfHwgVEVTVE9LPTEKKworZXhpdCAkVEVTVE9LCmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL3Rlc3QvdGVzdF9kcml2ZXIudHMgYi9saWIvbm9kZXRzL3Rlc3QvdGVzdF9kcml2ZXIudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM0MTUyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvdGVzdC90ZXN0X2RyaXZlci50cwpAQCAtMCwwICsxLDI3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisgLy8gVGhpcyBpcyB0aGUgTm9kZS5qcyB0ZXN0IGRyaXZlciBmb3IgdGhlIHN0YW5kYXJkIEFwYWNoZSBUaHJpZnQKKyAvLyB0ZXN0IHNlcnZpY2UuIFRoZSBkcml2ZXIgaW52b2tlcyBldmVyeSBmdW5jdGlvbiBkZWZpbmVkIGluIHRoZQorIC8vIFRocmlmdCBUZXN0IHNlcnZpY2Ugd2l0aCBhIHJlcHJlc2VudGF0aXZlIHJhbmdlIG9mIHBhcmFtZXRlcnMuCisgLy8KKyAvLyBUaGUgVGhyaWZ0VGVzdERyaXZlciBmdW5jdGlvbiByZXF1aXJlcyBhIGNsaWVudCBvYmplY3QKKyAvLyBjb25uZWN0ZWQgdG8gYSBzZXJ2ZXIgaG9zdGluZyB0aGUgVGhyaWZ0IFRlc3Qgc2VydmljZSBhbmQKKyAvLyBzdXBwb3J0cyBhbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2l0aAorIC8vIGEgc3RhdHVzIG1lc3NhZ2Ugd2hlbiB0aGUgdGVzdCBpcyBjb21wbGV0ZS4KKworaW1wb3J0IHRlc3QgPSByZXF1aXJlKCJ0YXBlIik7CitpbXBvcnQgdHR5cGVzID0gcmVxdWlyZSgiLi9nZW4tbm9kZWpzL1RocmlmdFRlc3RfdHlwZXMiKTsKK2ltcG9ydCBUaHJpZnRUZXN0ID0gcmVxdWlyZSgiLi9nZW4tbm9kZWpzL1RocmlmdFRlc3QiKTsKK2ltcG9ydCB0aHJpZnQgPSByZXF1aXJlKCJ0aHJpZnQiKTsKK2ltcG9ydCBRID0gdGhyaWZ0LlE7CitpbXBvcnQgVEV4Y2VwdGlvbiA9IHRocmlmdC5UaHJpZnQuVEV4Y2VwdGlvbjsKK3ZhciBJbnQ2NCA9IHJlcXVpcmUoIm5vZGUtaW50NjQiKTsKK2ltcG9ydCB0ZXN0Q2FzZXMgPSByZXF1aXJlKCIuL3Rlc3QtY2FzZXMiKTsKKworZXhwb3J0IGZ1bmN0aW9uIFRocmlmdFRlc3REcml2ZXIoY2xpZW50OiBUaHJpZnRUZXN0LkNsaWVudCwgY2FsbGJhY2s6IChzdGF0dXM6IHN0cmluZykgPT4gdm9pZCkgeworCisgIHRlc3QoIk5vZGVKUyBTdHlsZSBDYWxsYmFjayBDbGllbnQgVGVzdHMiLCBmdW5jdGlvbihhc3NlcnQpIHsKKworICAgIHZhciBjaGVja1JlY3Vyc2l2ZWx5ID0gbWFrZVJlY3Vyc2l2ZUNoZWNrKGFzc2VydCk7CisKKyAgICBmdW5jdGlvbiBtYWtlQXNzZXJ0ZXIoYXNzZXJ0aW9uRm46IChhOiBhbnksIGI6IGFueSwgbXNnPzogc3RyaW5nKSA9PiB2b2lkKSB7CisgICAgICByZXR1cm4gZnVuY3Rpb24oYzogKHN0cmluZyB8IGFueSlbXSkgeworICAgICAgICB2YXIgZm5OYW1lID0gY1swXTsKKyAgICAgICAgdmFyIGV4cGVjdGVkID0gY1sxXTsKKyAgICAgICAgKDxhbnk+Y2xpZW50KVtmbk5hbWVdKGV4cGVjdGVkLCBmdW5jdGlvbihlcnI6IGFueSwgYWN0dWFsOiBhbnkpIHsKKyAgICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCBmbk5hbWUgKyAiOiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICAgIGFzc2VydGlvbkZuKGFjdHVhbCwgZXhwZWN0ZWQsIGZuTmFtZSk7CisgICAgICAgIH0pCisgICAgICB9OworICAgIH0KKworICAgIHRlc3RDYXNlcy5zaW1wbGUuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoYXNzZXJ0LmVxdWFsKSk7CisgICAgdGVzdENhc2VzLnNpbXBsZUxvb3NlLmZvckVhY2gobWFrZUFzc2VydGVyKGZ1bmN0aW9uKGEsIGUsIG0peworICAgICAgYXNzZXJ0Lm9rKGEgPT0gZSwgbSk7CisgICAgfSkpOworICAgIHRlc3RDYXNlcy5kZWVwLmZvckVhY2gobWFrZUFzc2VydGVyKGFzc2VydC5kZWVwRXF1YWwpKTsKKworICAgIGNsaWVudC50ZXN0TWFwTWFwKDQyLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICB2YXIgZXhwZWN0ZWQ6IHR5cGVvZiByZXNwb25zZSA9IHsKKyAgICAgICAgIjQiOiB7IjEiOjEsICIyIjoyLCAiMyI6MywgIjQiOjR9LAorICAgICAgICAiLTQiOiB7Ii00IjotNCwgIi0zIjotMywgIi0yIjotMiwgIi0xIjotMX0KKyAgICAgIH07CisgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAndGVzdE1hcE1hcDogbm8gY2FsbGJhY2sgZXJyb3InKTsKKyAgICAgIGFzc2VydC5kZWVwRXF1YWwoZXhwZWN0ZWQsIHJlc3BvbnNlLCAidGVzdE1hcE1hcCIpOworICAgIH0pOworCisgICAgY2xpZW50LnRlc3RTdHJ1Y3QodGVzdENhc2VzLm91dCwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgYXNzZXJ0LmVycm9yKGVyciwgInRlc3RTdHJ1Y3Q6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQsIHJlc3BvbnNlLCAidGVzdFN0cnVjdCIpOworICAgIH0pOworCisgICAgY2xpZW50LnRlc3ROZXN0KHRlc3RDYXNlcy5vdXQyLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdE5lc3Q6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQyLCByZXNwb25zZSwgInRlc3ROZXN0Iik7CisgICAgfSk7CisKKyAgICBjbGllbnQudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgYXNzZXJ0LmVycm9yKGVyciwgInRlc3RJbnNhbml0eTogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgInRlc3RJbnNhbml0eSIpOworICAgIH0pOworCisgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICBhc3NlcnQub2soZXJyIGluc3RhbmNlb2YgVEV4Y2VwdGlvbiwgJ3Rlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgdHlwZScpOworICAgICAgYXNzZXJ0Lm9rKCFCb29sZWFuKHJlc3BvbnNlKSwgJ3Rlc3RFeGNlcHRpb246IG5vIHJlc3BvbnNlJyk7CisgICAgfSk7CisKKyAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICBhc3NlcnQub2soZXJyIGluc3RhbmNlb2YgdHR5cGVzLlhjZXB0aW9uLCAndGVzdEV4Y2VwdGlvbjogY29ycmVjdCBlcnJvciB0eXBlJyk7CisgICAgICBhc3NlcnQub2soIUJvb2xlYW4ocmVzcG9uc2UpLCAndGVzdEV4Y2VwdGlvbjogbm8gcmVzcG9uc2UnKTsKKyAgICAgIGFzc2VydC5lcXVhbChlcnIuZXJyb3JDb2RlLCAxMDAxLCAndGVzdEV4Y2VwdGlvbjogY29ycmVjdCBlcnJvciBjb2RlJyk7CisgICAgICBhc3NlcnQuZXF1YWwoJ1hjZXB0aW9uJywgZXJyLm1lc3NhZ2UsICd0ZXN0RXhjZXB0aW9uOiBjb3JyZWN0IGVycm9yIG1lc3NhZ2UnKTsKKyAgICB9KTsKKworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAndGVzdEV4Y2VwdGlvbjogbm8gY2FsbGJhY2sgZXJyb3InKTsKKyAgICAgIGFzc2VydC5vayghQm9vbGVhbihyZXNwb25zZSksICd0ZXN0RXhjZXB0aW9uOiBubyByZXNwb25zZScpOworICAgIH0pOworCisgICAgY2xpZW50LnRlc3RPbmV3YXkoMCwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgYXNzZXJ0LmVycm9yKGVyciwgJ3Rlc3RPbmV3YXk6IG5vIGNhbGxiYWNrIGVycm9yJyk7CisgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzcG9uc2UsIHVuZGVmaW5lZCwgJ3Rlc3RPbmV3YXk6IHZvaWQgcmVzcG9uc2UnKTsKKyAgICB9KTsKKworICAgIGNoZWNrT2ZmQnlPbmUoZnVuY3Rpb24oZG9uZSkgeworICAgICAgY2xpZW50LnRlc3RJMzIoLTEsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgImNoZWNrT2ZmQnlPbmU6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgIGFzc2VydC5lcXVhbCgtMSwgcmVzcG9uc2UpOworICAgICAgICBhc3NlcnQuZW5kKCk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0pOworICAgIH0sIGNhbGxiYWNrKTsKKworICB9KTsKK307CisKK2V4cG9ydCBmdW5jdGlvbiBUaHJpZnRUZXN0RHJpdmVyUHJvbWlzZShjbGllbnQ6IFRocmlmdFRlc3QuQ2xpZW50LCBjYWxsYmFjazogKHN0YXR1czogc3RyaW5nKSA9PiB2b2lkKSB7CisKKyAgdGVzdCgiUSBQcm9taXNlIENsaWVudCBUZXN0cyIsIGZ1bmN0aW9uKGFzc2VydCkgeworCisgICAgdmFyIGNoZWNrUmVjdXJzaXZlbHkgPSBtYWtlUmVjdXJzaXZlQ2hlY2soYXNzZXJ0KTsKKworICAgIGZ1bmN0aW9uIGZhaWwobXNnOiBzdHJpbmcpIHsKKyAgICAgIHJldHVybiBmdW5jdGlvbihlcnJvciwgcmVzcG9uc2UpIHsKKyAgICAgICAgaWYgKGVycm9yICE9PSBudWxsKSB7CisgICAgICAgICAgYXNzZXJ0LmZhaWwobXNnKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIG1ha2VBc3NlcnRlcihhc3NlcnRpb25GbjogKGE6IGFueSwgYjogYW55LCBtc2c/OiBzdHJpbmcpID0+IHZvaWQpIHsKKyAgICAgIHJldHVybiBmdW5jdGlvbihjOiAoc3RyaW5nIHwgYW55KVtdKSB7CisgICAgICAgIHZhciBmbk5hbWUgPSBjWzBdOworICAgICAgICB2YXIgZXhwZWN0ZWQgPSBjWzFdOworICAgICAgICAoPGFueT5jbGllbnQpW2ZuTmFtZV0oZXhwZWN0ZWQpCisgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oYWN0dWFsOiBhbnkpIHsKKyAgICAgICAgICAgIGFzc2VydGlvbkZuKGFjdHVhbCwgZXhwZWN0ZWQsIGZuTmFtZSk7CisgICAgICAgICAgfSkKKyAgICAgICAgICAuZmFpbChmYWlsKCJmbk5hbWUiKSk7CisgICAgICB9OworICAgIH0KKworICAgIHRlc3RDYXNlcy5zaW1wbGUuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoYXNzZXJ0LmVxdWFsKSk7CisgICAgdGVzdENhc2VzLnNpbXBsZUxvb3NlLmZvckVhY2gobWFrZUFzc2VydGVyKGZ1bmN0aW9uKGEsIGUsIG0peworICAgICAgYXNzZXJ0Lm9rKGEgPT0gZSwgbSk7CisgICAgfSkpOworICAgIHRlc3RDYXNlcy5kZWVwLmZvckVhY2gobWFrZUFzc2VydGVyKGFzc2VydC5kZWVwRXF1YWwpKTsKKworICAgIFEucmVzb2x2ZShjbGllbnQudGVzdFN0cnVjdCh0ZXN0Q2FzZXMub3V0KSkKKyAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dCwgcmVzcG9uc2UsICJ0ZXN0U3RydWN0Iik7CisgICAgICB9KQorICAgICAgLmZhaWwoZmFpbCgidGVzdFN0cnVjdCIpKTsKKworICAgIFEucmVzb2x2ZShjbGllbnQudGVzdE5lc3QodGVzdENhc2VzLm91dDIpKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMub3V0MiwgcmVzcG9uc2UsICJ0ZXN0TmVzdCIpOworICAgICAgfSkKKyAgICAgIC5mYWlsKGZhaWwoInRlc3ROZXN0IikpOworCisgICAgUS5yZXNvbHZlKGNsaWVudC50ZXN0SW5zYW5pdHkodGVzdENhc2VzLmNyYXp5KSkKKyAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgInRlc3RJbnNhbml0eSIpOworICAgICAgfSkKKyAgICAgIC5mYWlsKGZhaWwoInRlc3RJbnNhbml0eSIpKTsKKworICAgIFEucmVzb2x2ZShjbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgZmFpbCgidGVzdEV4Y2VwdGlvbjogVEV4Y2VwdGlvbiIpOworICAgICAgfSkKKyAgICAgIC5mYWlsKGZ1bmN0aW9uKGVycikgeworICAgICAgICBhc3NlcnQub2soZXJyIGluc3RhbmNlb2YgVEV4Y2VwdGlvbik7CisgICAgICB9KTsKKworICAgIFEucmVzb2x2ZShjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKSkKKyAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGZhaWwoInRlc3RFeGNlcHRpb246IFhjZXB0aW9uIik7CisgICAgICB9KQorICAgICAgLmZhaWwoZnVuY3Rpb24oZXJyKSB7CisgICAgICAgIGFzc2VydC5vayhlcnIgaW5zdGFuY2VvZiB0dHlwZXMuWGNlcHRpb24pOworICAgICAgICBhc3NlcnQuZXF1YWwoZXJyLmVycm9yQ29kZSwgMTAwMSk7CisgICAgICAgIGFzc2VydC5lcXVhbCgiWGNlcHRpb24iLCBlcnIubWVzc2FnZSk7CisgICAgICB9KTsKKworICAgIFEucmVzb2x2ZShjbGllbnQudGVzdEV4Y2VwdGlvbigibm8gRXhjZXB0aW9uIikpCisgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXF1YWwodW5kZWZpbmVkLCByZXNwb25zZSk7IC8vdm9pZAorICAgICAgfSkKKyAgICAgIC5mYWlsKGZhaWwoInRlc3RFeGNlcHRpb24iKSk7CisKKyAgICBjbGllbnQudGVzdE9uZXdheSgwLCBmYWlsKCJ0ZXN0T25ld2F5OiBzaG91bGQgbm90IGFuc3dlciIpKTsKKworICAgIGNoZWNrT2ZmQnlPbmUoZnVuY3Rpb24oZG9uZSkgeworICAgICAgUS5yZXNvbHZlKGNsaWVudC50ZXN0STMyKC0xKSkKKyAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgICAgIGFzc2VydC5lcXVhbCgtMSwgcmVzcG9uc2UpOworICAgICAgICAgICAgYXNzZXJ0LmVuZCgpOworICAgICAgICAgICAgZG9uZSgpOworICAgICAgICB9KQorICAgICAgICAuZmFpbChmYWlsKCJjaGVja09mZkJ5T25lIikpOworICAgIH0sIGNhbGxiYWNrKTsKKyAgfSk7Cit9OworCisKKy8vIEhlbHBlciBGdW5jdGlvbnMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitmdW5jdGlvbiBtYWtlUmVjdXJzaXZlQ2hlY2soYXNzZXJ0OiB0ZXN0LlRlc3QpIHsKKworICByZXR1cm4gZnVuY3Rpb24gKG1hcDE6IGFueSwgbWFwMjogYW55LCBtc2c6IHN0cmluZykgeworICAgIHZhciBlcXVhbCA9IHRydWU7CisKKyAgICB2YXIgZXF1YWwgPSBjaGVja1JlY3Vyc2l2ZWx5KG1hcDEsIG1hcDIpOworCisgICAgYXNzZXJ0Lm9rKGVxdWFsLCBtc2cpOworCisgICAgLy8gZGVlcEVxdWFsIGRvZXNuJ3Qgd29yayB3aXRoIGZpZWxkcyB1c2luZyBub2RlLWludDY0CisgICAgZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVseShtYXAxOiBhbnksIG1hcDI6IGFueSkgOiBib29sZWFuIHsKKyAgICAgIGlmICghKHR5cGVvZiBtYXAxICE9PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBtYXAyICE9PSAiZnVuY3Rpb24iKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAoIW1hcDEgfHwgdHlwZW9mIG1hcDEgIT09ICJvYmplY3QiKSB7CisgICAgICAgIC8vSGFuZGxlIGludDY0IHR5cGVzICh3aGljaCB1c2Ugbm9kZS1pbnQ2NCBpbiBOb2RlLmpzIEphdmFTY3JpcHQpCisgICAgICAgIGlmICgodHlwZW9mIG1hcDEgPT09ICJudW1iZXIiKSAmJiAodHlwZW9mIG1hcDIgPT09ICJvYmplY3QiKSAmJgorICAgICAgICAgICAgKG1hcDIuYnVmZmVyKSAmJiAobWFwMi5idWZmZXIgaW5zdGFuY2VvZiBCdWZmZXIpICYmIChtYXAyLmJ1ZmZlci5sZW5ndGggPT09IDgpKSB7CisgICAgICAgICAgdmFyIG4gPSBuZXcgSW50NjQobWFwMi5idWZmZXIpOworICAgICAgICAgIHJldHVybiBtYXAxID09PSBuLnRvTnVtYmVyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIG1hcDEgPT0gbWFwMjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG1hcDEpLmV2ZXJ5KGZ1bmN0aW9uKGtleSkgeworICAgICAgICAgIHJldHVybiBjaGVja1JlY3Vyc2l2ZWx5KG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK2Z1bmN0aW9uIGNoZWNrT2ZmQnlPbmUoZG9uZTogKGNhbGxiYWNrOiAoKSA9PiB2b2lkKSA9PiB2b2lkLCBjYWxsYmFjazogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZCkgeworCisgIHZhciByZXRyeV9saW1pdCA9IDMwOworICB2YXIgcmV0cnlfaW50ZXJ2YWwgPSAxMDA7CisgIHZhciB0ZXN0X2NvbXBsZXRlID0gZmFsc2U7CisgIHZhciByZXRyeXMgPSAwOworCisgIC8qKgorICAgKiByZWRvIGEgc2ltcGxlIHRlc3QgYWZ0ZXIgdGhlIG9uZXdheSB0byBtYWtlIHN1cmUgd2UgYXJlbid0ICJvZmYgYnkgb25lIiAtLQorICAgKiBpZiB0aGUgc2VydmVyIHRyZWF0ZWQgb25ld2F5IHZvaWQgbGlrZSBub3JtYWwgdm9pZCwgdGhpcyBuZXh0IHRlc3Qgd2lsbAorICAgKiBmYWlsIHNpbmNlIGl0IHdpbGwgZ2V0IHRoZSB2b2lkIGNvbmZpcm1hdGlvbiByYXRoZXIgdGhhbiB0aGUgY29ycmVjdAorICAgKiByZXN1bHQuIEluIHRoaXMgY2lyY3Vtc3RhbmNlLCB0aGUgY2xpZW50IHdpbGwgdGhyb3cgdGhlIGV4Y2VwdGlvbjoKKyAgICoKKyAgICogQmVjYXVzZSB0aGlzIGlzIHRoZSBsYXN0IHRlc3QgYWdhaW5zdCB0aGUgc2VydmVyLCB3aGVuIGl0IGNvbXBsZXRlcworICAgKiB0aGUgZW50aXJlIHN1aXRlIGlzIGNvbXBsZXRlIGJ5IGRlZmluaXRpb24gKHRoZSB0ZXN0cyBydW4gc2VyaWFsbHkpLgorICAgKi8KKyAgZG9uZShmdW5jdGlvbigpIHsKKyAgICB0ZXN0X2NvbXBsZXRlID0gdHJ1ZTsKKyAgfSk7CisKKyAgLy9XZSB3YWl0IHVwIHRvIHJldHJ5X2xpbWl0ICogcmV0cnlfaW50ZXJ2YWwgZm9yIHRoZSB0ZXN0IHN1aXRlIHRvIGNvbXBsZXRlCisgIGZ1bmN0aW9uIFRlc3RGb3JDb21wbGV0aW9uKCkgeworICAgIGlmKHRlc3RfY29tcGxldGUgJiYgY2FsbGJhY2spIHsKKyAgICAgIGNhbGxiYWNrKCJTZXJ2ZXIgc3VjY2Vzc2Z1bGx5IHRlc3RlZCEiKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCsrcmV0cnlzIDwgcmV0cnlfbGltaXQpIHsKKyAgICAgICAgc2V0VGltZW91dChUZXN0Rm9yQ29tcGxldGlvbiwgcmV0cnlfaW50ZXJ2YWwpOworICAgICAgfSBlbHNlIGlmIChjYWxsYmFjaykgeworICAgICAgICBjYWxsYmFjaygiU2VydmVyIHRlc3QgZmFpbGVkIHRvIGNvbXBsZXRlIGFmdGVyICIgKworICAgICAgICAgICAgICAgICAocmV0cnlfbGltaXQgKiByZXRyeV9pbnRlcnZhbCAvIDEwMDApICsgIiBzZWNvbmRzIik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc2V0VGltZW91dChUZXN0Rm9yQ29tcGxldGlvbiwgcmV0cnlfaW50ZXJ2YWwpOworfQpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy90ZXN0L3Rlc3RfaGFuZGxlci50cyBiL2xpYi9ub2RldHMvdGVzdC90ZXN0X2hhbmRsZXIudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJjODU1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvdGVzdC90ZXN0X2hhbmRsZXIudHMKQEAgLTAsMCArMSwyOTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9UaGlzIGlzIHRoZSBzZXJ2ZXIgc2lkZSBOb2RlIHRlc3QgaGFuZGxlciBmb3IgdGhlIHN0YW5kYXJkCisvLyAgQXBhY2hlIFRocmlmdCB0ZXN0IHNlcnZpY2UuCisKK2ltcG9ydCB0dHlwZXMgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdF90eXBlcyIpOworaW1wb3J0IHRocmlmdCA9IHJlcXVpcmUoInRocmlmdCIpOworaW1wb3J0IFRocmlmdCA9IHRocmlmdC5UaHJpZnQ7CitpbXBvcnQgUSA9IHJlcXVpcmUoInEiKTsKKworCitleHBvcnQgY2xhc3MgU3luY1RocmlmdFRlc3RIYW5kbGVyIHsKKyAgdGVzdFZvaWQoKTogUS5JUHJvbWlzZTx2b2lkPiB7CisgICAgLy9jb25zb2xlLmxvZygndGVzdFZvaWQoKScpOworICAgIHJldHVybiBRLnJlc29sdmU8dm9pZD4odW5kZWZpbmVkKTsKKyAgfQorICB0ZXN0TWFwTWFwKGhlbGxvOiBudW1iZXIpIHsKKyAgICAvL2NvbnNvbGUubG9nKCd0ZXN0TWFwTWFwKCcgKyBoZWxsbyArICcpJyk7CisKKyAgICB2YXIgbWFwbWFwOiB7W2tleTogbnVtYmVyXToge1trZXk6IG51bWJlcl06IG51bWJlcjsgfX0gPSBbXTsKKyAgICB2YXIgcG9zOiB7W2tleTogbnVtYmVyXTogbnVtYmVyOyB9ID0gW107CisgICAgdmFyIG5lZzoge1trZXk6IG51bWJlcl06IG51bWJlcjsgfSA9IFtdOworICAgIGZvciAodmFyIGkgPSAxOyBpIDwgNTsgaSsrKSB7CisgICAgICBwb3NbaV0gPSBpOworICAgICAgbmVnWy1pXSA9IC1pOworICAgIH0KKyAgICBtYXBtYXBbNF0gPSBwb3M7CisgICAgbWFwbWFwWy00XSA9IG5lZzsKKworICAgIHJldHVybiBRLnJlc29sdmUobWFwbWFwKTsKKyAgfQorICB0ZXN0SW5zYW5pdHkoYXJndW1lbnQ6IHR0eXBlcy5JbnNhbml0eSk6IFEuSVByb21pc2U8eyBbazogbnVtYmVyXTogYW55OyB9PiB7CisgICAgY29uc3QgZmlyc3RfbWFwOiB7IFtrOiBudW1iZXJdOiBhbnk7IH0gPSBbXTsKKyAgICBjb25zdCBzZWNvbmRfbWFwOiB7IFtrOiBudW1iZXJdOiBhbnk7IH0gPSBbXTsKKyAgCisgICAgZmlyc3RfbWFwW3R0eXBlcy5OdW1iZXJ6LlRXT10gPSBhcmd1bWVudDsKKyAgICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVEhSRUVdID0gYXJndW1lbnQ7CisgIAorICAgIGNvbnN0IGxvb25leSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoKTsKKyAgICBzZWNvbmRfbWFwW3R0eXBlcy5OdW1iZXJ6LlNJWF0gPSBsb29uZXk7CisgIAorICAgIGNvbnN0IGluc2FuZTogeyBbazogbnVtYmVyXTogYW55OyB9ID0gW107CisgICAgaW5zYW5lWzFdID0gZmlyc3RfbWFwOworICAgIGluc2FuZVsyXSA9IHNlY29uZF9tYXA7CisKKyAgICByZXR1cm4gUS5yZXNvbHZlKGluc2FuZSk7CisgIH0KKyAgdGVzdE11bHRpKGFyZzA6IGFueSwgYXJnMTogbnVtYmVyLCBhcmcyOiBudW1iZXIsIGFyZzM6IHsgW2s6IG51bWJlcl06IHN0cmluZzsgfSwgYXJnNDogdHR5cGVzLk51bWJlcnosIGFyZzU6IG51bWJlcikgeworICAgIHZhciBoZWxsbyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gJ0hlbGxvMic7CisgICAgaGVsbG8uYnl0ZV90aGluZyA9IGFyZzA7CisgICAgaGVsbG8uaTMyX3RoaW5nID0gYXJnMTsKKyAgICBoZWxsby5pNjRfdGhpbmcgPSBhcmcyOworICAgIHJldHVybiBRLnJlc29sdmUoaGVsbG8pOworICB9CisgIHRlc3RFeGNlcHRpb24oYXJnOiBzdHJpbmcpOiBRLklQcm9taXNlPHZvaWQ+IHsKKyAgICBpZiAoYXJnID09PSAnWGNlcHRpb24nKSB7CisgICAgICB2YXIgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgIHgubWVzc2FnZSA9IGFyZzsKKyAgICAgIHRocm93IHg7CisgICAgfSBlbHNlIGlmIChhcmcgPT09ICdURXhjZXB0aW9uJykgeworICAgICAgdGhyb3cgbmV3IFRocmlmdC5URXhjZXB0aW9uKGFyZyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgICB9CisgIH0KKyAgdGVzdE11bHRpRXhjZXB0aW9uKGFyZzA6IHN0cmluZywgYXJnMTogc3RyaW5nKSB7CisgICAgaWYgKGFyZzAgPT09ICgnWGNlcHRpb24nKSkgeworICAgICAgdmFyIHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgICB4LmVycm9yQ29kZSA9IDEwMDE7CisgICAgICB4Lm1lc3NhZ2UgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbic7CisgICAgICB0aHJvdyB4OworICAgIH0gZWxzZSBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbjInKSkgeworICAgICAgdmFyIHgyID0gbmV3IHR0eXBlcy5YY2VwdGlvbjIoKTsKKyAgICAgIHgyLmVycm9yQ29kZSA9IDIwMDI7CisgICAgICB4Mi5zdHJ1Y3RfdGhpbmcgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgICAgeDIuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uMic7CisgICAgICB0aHJvdyB4MjsKKyAgICB9CisKKyAgICB2YXIgcmVzID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICByZXMuc3RyaW5nX3RoaW5nID0gYXJnMTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHJlcyk7CisgIH0KKyAgdGVzdE9uZXdheShzbGVlcEZvcjogbnVtYmVyKSB7CisgIH0KKworICB0ZXN0U3RyaW5nKHRoaW5nOiBzdHJpbmcpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0Qm9vbCh0aGluZzogYm9vbGVhbikgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RCeXRlKHRoaW5nOiBudW1iZXIpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0STMyKHRoaW5nOiBudW1iZXIpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0STY0KHRoaW5nOiBudW1iZXIpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0RG91YmxlKHRoaW5nOiBudW1iZXIpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0QmluYXJ5KHRoaW5nOiBCdWZmZXIpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0U3RydWN0KHRoaW5nOiB0dHlwZXMuWHRydWN0KSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdE5lc3QodGhpbmc6IHR0eXBlcy5YdHJ1Y3QyKSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdE1hcCh0aGluZzogeyBbazogbnVtYmVyXTogbnVtYmVyOyB9KSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdFN0cmluZ01hcCh0aGluZzogeyBbazogc3RyaW5nXTogc3RyaW5nOyB9KSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdFNldCh0aGluZzogbnVtYmVyW10pIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0TGlzdCh0aGluZzogbnVtYmVyW10pIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0RW51bSh0aGluZzogdHR5cGVzLk51bWJlcnopIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0VHlwZWRlZih0aGluZzogbnVtYmVyKSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KK30KKworZXhwb3J0IGNsYXNzIEFzeW5jVGhyaWZ0VGVzdEhhbmRsZXIgeworICBwcml2YXRlIHN5bmNIYW5kbGVyOiBTeW5jVGhyaWZ0VGVzdEhhbmRsZXI7CisgIGNvbnN0cnVjdG9yKCkgeworICAgIHRoaXMuc3luY0hhbmRsZXIgPSBuZXcgU3luY1RocmlmdFRlc3RIYW5kbGVyKCk7CisgIH0KKworICB0ZXN0Vm9pZChjYWxsYmFjazogKHJlc3VsdDogdm9pZCkgPT4gdm9pZCk6IFEuSVByb21pc2U8dm9pZD4geworICAgIGNhbGxiYWNrKHVuZGVmaW5lZCk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RNYXBNYXAoaGVsbG86IG51bWJlciwKKyAgICBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IHsgW2s6IG51bWJlcl06IHsgW2s6IG51bWJlcl06IG51bWJlcjsgfTsgfSkgPT4gdm9pZCk6CisgICAgIFEuSVByb21pc2U8eyBbazogbnVtYmVyXTogeyBbazogbnVtYmVyXTogbnVtYmVyOyB9OyB9PiB7CisKKyAgICB2YXIgbWFwbWFwOiB7W2tleTogbnVtYmVyXToge1trZXk6IG51bWJlcl06IG51bWJlcjsgfX0gPSBbXTsKKyAgICB2YXIgcG9zOiB7W2tleTogbnVtYmVyXTogbnVtYmVyOyB9ID0gW107CisgICAgdmFyIG5lZzoge1trZXk6IG51bWJlcl06IG51bWJlcjsgfSA9IFtdOworICAgIGZvciAodmFyIGkgPSAxOyBpIDwgNTsgaSsrKSB7CisgICAgICBwb3NbaV0gPSBpOworICAgICAgbmVnWy1pXSA9IC1pOworICAgIH0KKyAgICBtYXBtYXBbNF0gPSBwb3M7CisgICAgbWFwbWFwWy00XSA9IG5lZzsKKworICAgIGNhbGxiYWNrKG51bGwsIG1hcG1hcCk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RJbnNhbml0eShhcmd1bWVudDogdHR5cGVzLkluc2FuaXR5LCBjYWxsYmFjaz86IChlcnI6IGFueSwgcmVzdWx0OiB7IFtrOiBudW1iZXJdOiBhbnk7IH0pID0+IHZvaWQpOiBRLklQcm9taXNlPHsgW2s6IG51bWJlcl06IGFueTsgfT4geworICAgIGNvbnN0IGZpcnN0X21hcDogeyBbazogbnVtYmVyXTogYW55OyB9ID0gW107CisgICAgY29uc3Qgc2Vjb25kX21hcDogeyBbazogbnVtYmVyXTogYW55OyB9ID0gW107CisgIAorICAgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5UV09dID0gYXJndW1lbnQ7CisgICAgZmlyc3RfbWFwW3R0eXBlcy5OdW1iZXJ6LlRIUkVFXSA9IGFyZ3VtZW50OworICAKKyAgICBjb25zdCBsb29uZXkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KCk7CisgICAgc2Vjb25kX21hcFt0dHlwZXMuTnVtYmVyei5TSVhdID0gbG9vbmV5OworICAKKyAgICBjb25zdCBpbnNhbmU6IHsgW2s6IG51bWJlcl06IGFueTsgfSA9IFtdOworICAgIGluc2FuZVsxXSA9IGZpcnN0X21hcDsKKyAgICBpbnNhbmVbMl0gPSBzZWNvbmRfbWFwOworCisgICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQpeworICAgICAgY2FsbGJhY2sobnVsbCwgaW5zYW5lKTsKKyAgICB9CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RNdWx0aShhcmcwOiBhbnksIGFyZzE6IG51bWJlciwgYXJnMjogbnVtYmVyLCBhcmczOiB7IFtrOiBudW1iZXJdOiBzdHJpbmc7IH0sIGFyZzQ6IHR0eXBlcy5OdW1iZXJ6LCBhcmc1OiBudW1iZXIsIHJlc3VsdDogRnVuY3Rpb24pOiBRLklQcm9taXNlPHR0eXBlcy5YdHJ1Y3Q+IHsKKyAgICB2YXIgaGVsbG8gPSB0aGlzLnN5bmNIYW5kbGVyLnRlc3RNdWx0aShhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKKyAgICBoZWxsby50aGVuKGhlbGxvID0+IHJlc3VsdChudWxsLCBoZWxsbykpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0RXhjZXB0aW9uKGFyZzogc3RyaW5nLCByZXN1bHQ6IChlcnI6IGFueSkgPT4gdm9pZCk6IFEuSVByb21pc2U8dm9pZD4geworICAgIGlmIChhcmcgPT09ICdYY2VwdGlvbicpIHsKKyAgICAgIHZhciB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgICAgeC5tZXNzYWdlID0gYXJnOworICAgICAgcmVzdWx0KHgpOworICAgIH0gZWxzZSBpZiAoYXJnID09PSAnVEV4Y2VwdGlvbicpIHsKKyAgICAgIHJlc3VsdChuZXcgVGhyaWZ0LlRFeGNlcHRpb24oYXJnKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdChudWxsKTsKKyAgICB9CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RNdWx0aUV4Y2VwdGlvbihhcmcwOiBzdHJpbmcsIGFyZzE6IHN0cmluZywgcmVzdWx0OiAoZXJyOiBhbnksIHJlcz86IHR0eXBlcy5YdHJ1Y3QpID0+IHZvaWQpOiBRLklQcm9taXNlPHR0eXBlcy5YdHJ1Y3Q+IHsKKyAgICBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbicpKSB7CisgICAgICB2YXIgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgIHgubWVzc2FnZSA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uJzsKKyAgICAgIHJlc3VsdCh4KTsKKyAgICB9IGVsc2UgaWYgKGFyZzAgPT09ICgnWGNlcHRpb24yJykpIHsKKyAgICAgIHZhciB4MiA9IG5ldyB0dHlwZXMuWGNlcHRpb24yKCk7CisgICAgICB4Mi5lcnJvckNvZGUgPSAyMDAyOworICAgICAgeDIuc3RydWN0X3RoaW5nID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICAgIHgyLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbjInOworICAgICAgcmVzdWx0KHgyKTsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIHJlcyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgICByZXMuc3RyaW5nX3RoaW5nID0gYXJnMTsKKyAgICAgIHJlc3VsdChudWxsLCByZXMpOworICAgIH0KKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdE9uZXdheShzbGVlcEZvcjogbnVtYmVyLCByZXN1bHQ6IEZ1bmN0aW9uKSB7CisgICAgdGhpcy5zeW5jSGFuZGxlci50ZXN0T25ld2F5KHNsZWVwRm9yKTsKKyAgfQorICB0ZXN0U3RyaW5nKHRoaW5nOiBzdHJpbmcsIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogc3RyaW5nKSA9PiB2b2lkKTogUS5JUHJvbWlzZTxzdHJpbmc+IHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RCeXRlKHRoaW5nOiBudW1iZXIsIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogbnVtYmVyKSA9PiB2b2lkKTogUS5JUHJvbWlzZTxudW1iZXI+IHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RCb29sKHRoaW5nOiBib29sZWFuLCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IGJvb2xlYW4pID0+IHZvaWQgKTogUS5JUHJvbWlzZTxib29sZWFuPiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0STMyKHRoaW5nOiBudW1iZXIsIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogbnVtYmVyKSA9PiB2b2lkKTogUS5JUHJvbWlzZTxudW1iZXI+ICB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0STY0KHRoaW5nOiBudW1iZXIsIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogbnVtYmVyKSA9PiB2b2lkKTogUS5JUHJvbWlzZTxudW1iZXI+ICB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0RG91YmxlKHRoaW5nOiBudW1iZXIsIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogbnVtYmVyKSA9PiB2b2lkKTogUS5JUHJvbWlzZTxudW1iZXI+ICB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0QmluYXJ5KHRoaW5nOiBCdWZmZXIsIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogQnVmZmVyKSA9PiB2b2lkKTogUS5JUHJvbWlzZTxCdWZmZXI+IHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RTdHJ1Y3QodGhpbmc6IHR0eXBlcy5YdHJ1Y3QsIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogdHR5cGVzLlh0cnVjdCkgPT4gdm9pZCk6IFEuSVByb21pc2U8dHR5cGVzLlh0cnVjdD4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdE5lc3QodGhpbmc6IHR0eXBlcy5YdHJ1Y3QyLCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IHR0eXBlcy5YdHJ1Y3QyKSA9PiB2b2lkKTogUS5JUHJvbWlzZTx0dHlwZXMuWHRydWN0Mj4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdE1hcCh0aGluZzogeyBbazogbnVtYmVyXTogbnVtYmVyOyB9LCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IHsgW2s6IG51bWJlcl06IG51bWJlcjsgfSkgPT4gdm9pZCk6IFEuSVByb21pc2U8eyBbazogbnVtYmVyXTogbnVtYmVyOyB9PiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0U3RyaW5nTWFwKHRoaW5nOiB7IFtrOiBzdHJpbmddOiBzdHJpbmc7IH0sIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogeyBbazogc3RyaW5nXTogc3RyaW5nOyB9KSA9PiB2b2lkKTogUS5JUHJvbWlzZTx7IFtrOiBzdHJpbmddOiBzdHJpbmc7IH0+IHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RTZXQodGhpbmc6IG51bWJlcltdLCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IG51bWJlcltdKSA9PiB2b2lkKTogUS5JUHJvbWlzZTxudW1iZXJbXT4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdExpc3QodGhpbmc6IG51bWJlcltdLCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IG51bWJlcltdKSA9PiB2b2lkKTogUS5JUHJvbWlzZTxudW1iZXJbXT4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdEVudW0odGhpbmc6IHR0eXBlcy5OdW1iZXJ6LCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IHR0eXBlcy5OdW1iZXJ6KSA9PiB2b2lkKTogUS5JUHJvbWlzZTx0dHlwZXMuTnVtYmVyej4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdFR5cGVkZWYodGhpbmc6IG51bWJlciwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBudW1iZXIpID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcj4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC90c2NvbmZpZy5qc29uIGIvbGliL25vZGV0cy90ZXN0L3RzY29uZmlnLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI5ZDA2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvdGVzdC90c2NvbmZpZy5qc29uCkBAIC0wLDAgKzEsMjIgQEAKK3sKKyAgICAiY29tcGlsZXJPcHRpb25zIjogeworICAgICAgICAiYWxsb3dKcyI6IGZhbHNlLAorICAgICAgICAiYWx3YXlzU3RyaWN0IjogdHJ1ZSwKKyAgICAgICAgImJhc2VVcmwiOiAiLiIsCisgICAgICAgICJkZWNsYXJhdGlvbiI6IHRydWUsCisgICAgICAgICJlbWl0RGVjb3JhdG9yTWV0YWRhdGEiOiB0cnVlLAorICAgICAgICAiZXhwZXJpbWVudGFsRGVjb3JhdG9ycyI6IHRydWUsCisgICAgICAgICJtb2R1bGUiOiAiY29tbW9uanMiLAorICAgICAgICAibW9kdWxlUmVzb2x1dGlvbiI6ICJub2RlIiwKKyAgICAgICAgIm5vSW1wbGljaXRUaGlzIjogdHJ1ZSwKKyAgICAgICAgIm5vVW51c2VkTG9jYWxzIjogdHJ1ZSwKKyAgICAgICAgInByZXNlcnZlQ29uc3RFbnVtcyI6IHRydWUsCisgICAgICAgICJyZW1vdmVDb21tZW50cyI6IHRydWUsCisgICAgICAgICJzdHJpY3RGdW5jdGlvblR5cGVzIjogdHJ1ZSwKKyAgICAgICAgInN0cmljdE51bGxDaGVja3MiOiB0cnVlLAorICAgICAgICAidGFyZ2V0IjogImVzNiIsCisgICAgICAgICJwYXRocyI6IHsKKyAgICAgICAgICAgICJ0aHJpZnQiOiBbIi4uLy4uL25vZGVqcy9saWIvdGhyaWZ0Il0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC8uZ2l0aWdub3JlIGIvbGliL29jYW1sLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5YTZhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vY2FtbC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMTEgQEAKK19idWlsZC8KK190YWdzCitjb25maWd1cmUKK3NldHVwLmRhdGEKK3NldHVwLm1sCitteW9jYW1sYnVpbGQubWwKKyovTUVUQQorKi8qLm1sbGliCisqLyoubWxkeWxpYgorTWFrZWZpbGUKK09DYW1sTWFrZWZpbGUKZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9ERVZFTE9QTUVOVCBiL2xpYi9vY2FtbC9ERVZFTE9QTUVOVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDVhMDNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29jYW1sL0RFVkVMT1BNRU5UCkBAIC0wLDAgKzEsNzYgQEAKK1RocmlmdCBPQ2FtbCBEZXZlbG9wbWVudAorPT09PT09PT09PT09PT09PT09PT09PT09CisKK1ByZXJlcXVpc2l0ZXMKKy0tLS0tLS0tLS0tLS0KKworSW4gb3JkZXIgdG8gYnVpbGQgdGhpcyBsaWJyYXJ5LCB5b3UgbXVzdCBoYXZlIHRoZSBmb2xsb3dpbmcgaW5zdGFsbGVkOgorCisgICogVGhlIE9DYW1sIGNvbXBpbGVyLCBwcmVmZXJhYmx5ID40LjAwCisgICogVGhlIE9hc2lzIGJ1aWxkIHRvb2wKKworSW4gYWRkaXRpb24geW91IG1heSB3YW50IHRvIGluc3RhbGwgT1BBTSwgd2hpY2ggd2lsbCBhbGxvdyB5b3UgdG8gc2V0dXAgYW4KK09DYW1sIGRldmVsb3BtZW50IGVudmlyb25tZW50IHRoYXQncyBpc29sYXRlZCBmcm9tIHlvdXIgc3lzdGVtIGluc3RhbGxhdGlvbiwKK211Y2ggbGlrZSB2aXJ1dGFsZW52IGZvciBQeXRob24gb3IgdGhlIG15cmlhZCBzeXN0ZW1zIGF2YWlsYWJsZSBmb3IgUnVieS4gSWYKK3lvdSBoYXZlIE9QQU0gaW5zdGFsbGVkLCB0aGVuIGluc3RhbGxpbmcgT2FzaXMgaXMgYXMgc2ltcGxlIGFzIHJ1bm5pbmc6CisKKyAgJCBvcGFtIGluc3RhbGwgb2FzaXMKKworQnVpbGRpbmcKKy0tLS0tLS0tCisKK09uY2UgYWxsIHRoZSBwcmVyZXF1aXNpdGVzIGhhdmUgYmVlbiBpbnN0YWxsZWQsIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgorCisgICQgb2FzaXMgc2V0dXAKKyAgJCAuL2NvbmZpZ3VyZQorICAkIG1ha2UKKworVGhlIGBvYXNpcyBzZXR1cGAgY29tbWFuZCB3aWxsIGdlbmVyYXRlIHRoZSBjb25maWd1cmUgc2NyaXB0IGFuZCBNYWtlZmlsZSwKK2Fsb25nIHdpdGggb3RoZXIgZmlsZXMgdGhhdCBvcGFtIHdpbGwgdXNlIHRvIGNyZWF0ZSBhbiBpbnN0YWxsYWJsZSBsaWJyYXJ5LgorVGhlIGNvZmlndXJlIHNjcmlwdCB3aWxsIGVuc3VyZSB0aGF0IGFsbCBidWlsZCBkZXBlbmRlbmNpZXMgYXJlIGluc3RhbGxlZCwgYW5kCittYWtlIHdpbGwgYWN0dWFsbHkgYnVpbGQgdGhlIGxpYnJhcnkuCisKK1RvIHJlbW92ZSBmaWxlcyB0aGF0IHRoZSBjb21waWxlciBnZW5lYXRlcywgcnVuOgorCisgICQgbWFrZSBjbGVhbgorCitUbyByZW1vdmUgdGhvc2UgZmlsZXMgX2FzIHdlbGwgYXNfIGZpbGVzIHRoYXQgdGhlIHNldHVwIGFuZCBjb25maWd1cmUgcHJvY2VzcworZ2VuZXJhdGVzLCBydW46CisKKyAgJCBybSBgY2F0IC5naXRpZ25vcmVgCisKK0luc3RhbGxpbmcKKy0tLS0tLS0tLS0KKworSWYgeW91J3JlIHVzaW5nIG9wYW0sIHNpbXBseSBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOgorCisgICQgbWFrZSBpbnN0YWxsCisKK1doaWxlIGRldmVsb3BtZW50LCB5b3UgbWF5IHdhbnQgdG8gaW5zdGFsbCB5b3VyIGxhdGVzdCBidWlsZCBvbiB0aGUgc3lzdGVtIHRvCit0ZXN0IGFnYWluc3Qgb3RoZXIgbGlicmFyaWVzIG9yIHByb2dyYW1zLiBUbyBkbyB0aGlzLCB1c2U6CisKKyAgJCBtYWtlIHJlaW5zdGFsbAorCitEaXN0cmlidXRpb24KKy0tLS0tLS0tLS0tLQorCitUaGUgZGUgZmFjdG8gcHJlZmVycmVkIG1ldGhvZCBmb3IgZGlzdHJpYnV0aW5nIE9DYW1sIGxpYnJhcmllcyBpcyB0aHJvdWdoIHRoZQorT1BBTSBwYWNrYWdlIHJlcG9zaXRvcnkuIFRvIHB1Ymxpc2ggdGhlIGxhdGVzdCBwYWNrYWdlLCBpc3N1ZSBhIHB1bGwgcmVxdWVzdAorYWdhaW5zdCB0aGUgZm9sbG93aW5nIGdpdGh1YiByZXBvc2l0b3J5OgorCisgIGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtLXJlcG9zaXRvcnkKKworVGhlIHB1bGwgcmVxdWVzdGlvbiBzaG91bGQgYWRkIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZSBhbmQgZmlsZXM6CisKKyAgcGFja2FnZQorICAgIHxfX3RocmlmdAorICAgICAgIHxfX3RocmlmdC48VkVSU0lPTj4KKyAgICAgICAgICB8X18gZGVzY3IKKyAgICAgICAgICB8X18gb3BhbQorICAgICAgICAgIHxfXyB1cmwKKworVGVtcGxhdGVzIGZvciB0aGUgZm9sbG93aW5nIGZpbGVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgb3BhbS8gc3ViZGlyZWN0b3J5IG9mCit0aGlzIGxpYnJhcnkncyByb290LCB3aXRoIFhYWCguLi4pIGluZGljYXRpbmcgZmllbGRzIHRoYXQgbmVlZCB0byBiZSBmaWxsZWQKK291dC4gWW91IGNhbiBmaW5kIGZ1cnRoZXIgZG9jdW1lbnRhdGlvbiBoZXJlOgorCisgIGh0dHA6Ly9vcGFtLm9jYW1sLm9yZy9kb2MvUGFja2FnaW5nLmh0bWwKZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9NYWtlZmlsZSBiL2xpYi9vY2FtbC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFiZWVlNy4uMDAwMDAwMAotLS0gYS9saWIvb2NhbWwvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotYWxsOgotCWNkIHNyYzsgbWFrZTsgY2QgLi4KLWNsZWFuOgotCWNkIHNyYzsgbWFrZSBjbGVhbjsgY2QgLi4KZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9PQ2FtbE1ha2VmaWxlIGIvbGliL29jYW1sL09DYW1sTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYjkyNTIuLjAwMDAwMDAKLS0tIGEvbGliL29jYW1sL09DYW1sTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sTWFrZWZpbGUKLSMgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNyAgTWFya3VzIE1vdHRsCi0jCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdXBkYXRlcyBzZWU6Ci0jICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cub2NhbWwuaW5mby9ob21lL29jYW1sX3NvdXJjZXMuaHRtbAotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgTW9kaWZpZWQgYnkgZGFtaWVuIGZvciAuZ2xhZGUubWwgY29tcGlsYXRpb24KLQotIyBTZXQgdGhlc2UgdmFyaWFibGVzIHRvIHRoZSBuYW1lcyBvZiB0aGUgc291cmNlcyB0byBiZSBwcm9jZXNzZWQgYW5kCi0jIHRoZSByZXN1bHQgdmFyaWFibGUuIE9yZGVyIG1hdHRlcnMgZHVyaW5nIGxpbmthZ2UhCi0KLWlmbmRlZiBTT1VSQ0VTCi0gIFNPVVJDRVMgOj0gZm9vLm1sCi1lbmRpZgotZXhwb3J0IFNPVVJDRVMKLQotaWZuZGVmIFJFU19DTElCX1NVRgotICBSRVNfQ0xJQl9TVUYgOj0gX3N0dWJzCi1lbmRpZgotZXhwb3J0IFJFU19DTElCX1NVRgotCi1pZm5kZWYgUkVTVUxUCi0gIFJFU1VMVCA6PSBmb28KLWVuZGlmCi1leHBvcnQgUkVTVUxUIDo9ICQoc3RyaXAgJChSRVNVTFQpKQotCi1leHBvcnQgTElCX1BBQ0tfTkFNRQotCi1pZm5kZWYgRE9DX0ZJTEVTCi0gIERPQ19GSUxFUyA6PSAkKGZpbHRlciAlLm1saSwgJChTT1VSQ0VTKSkKLWVuZGlmCi1leHBvcnQgRE9DX0ZJTEVTCi1GSVJTVF9ET0NfRklMRSA6PSAkKGZpcnN0d29yZCAkKERPQ19GSUxFUykpCi0KLWV4cG9ydCBCQ1NVRkZJWAotZXhwb3J0IE5DU1VGRklYCi0KLWlmbmRlZiBUT1BTVUZGSVgKLSAgVE9QU1VGRklYIDo9IC50b3AKLWVuZGlmCi1leHBvcnQgVE9QU1VGRklYCi0KLSMgRXZlbnR1YWxseSBzZXQgaW5jbHVkZS0gYW5kIGxpYnJhcnktcGF0aHMsIGxpYnJhcmllcyB0byBsaW5rLAotIyBhZGRpdGlvbmFsIGNvbXBpbGF0aW9uLSwgbGluay0gYW5kIG9jYW1seWFjYy1mbGFncwotIyBQYXRoLSBhbmQgbGlicmFyeSBpbmZvcm1hdGlvbiBuZWVkcyBub3QgYmUgd3JpdHRlbiB3aXRoICItSSIgYW5kIHN1Y2guLi4KLSMgRGVmaW5lIFRIUkVBRFMgaWYgeW91IG5lZWQgaXQsIG90aGVyd2lzZSBsZWF2ZSBpdCB1bnNldCAoc2FtZSBmb3IKLSMgVVNFX0NBTUxQNCkhCi0KLWV4cG9ydCBUSFJFQURTCi1leHBvcnQgVk1USFJFQURTCi1leHBvcnQgQU5OT1RBVEUKLWV4cG9ydCBVU0VfQ0FNTFA0Ci0KLWV4cG9ydCBJTkNESVJTCi1leHBvcnQgTElCRElSUwotZXhwb3J0IEVYVExJQkRJUlMKLWV4cG9ydCBSRVNVTFRERVBTCi1leHBvcnQgT0NBTUxfREVGQVVMVF9ESVJTCi0KLWV4cG9ydCBMSUJTCi1leHBvcnQgQ0xJQlMKLWV4cG9ydCBDRlJBTUVXT1JLUwotCi1leHBvcnQgT0NBTUxGTEFHUwotZXhwb3J0IE9DQU1MTkNGTEFHUwotZXhwb3J0IE9DQU1MQkNGTEFHUwotCi1leHBvcnQgT0NBTUxMREZMQUdTCi1leHBvcnQgT0NBTUxOTERGTEFHUwotZXhwb3J0IE9DQU1MQkxERkxBR1MKLQotZXhwb3J0IE9DQU1MTUtMSUJfRkxBR1MKLQotaWZuZGVmIE9DQU1MQ1BGTEFHUwotICBPQ0FNTENQRkxBR1MgOj0gYQotZW5kaWYKLWV4cG9ydCBPQ0FNTENQRkxBR1MKLQotaWZuZGVmIERPQ19ESVIKLSAgRE9DX0RJUiA6PSBkb2MKLWVuZGlmCi1leHBvcnQgRE9DX0RJUgotCi1leHBvcnQgUFBGTEFHUwotCi1leHBvcnQgTEZMQUdTCi1leHBvcnQgWUZMQUdTCi1leHBvcnQgSURMRkxBR1MKLQotZXhwb3J0IE9DQU1MRE9DRkxBR1MKLQotZXhwb3J0IE9DQU1MRklORF9JTlNURkxBR1MKLQotZXhwb3J0IERWSVBTRkxBR1MKLQotZXhwb3J0IFNUQVRJQwotCi0jIEFkZCBhIGxpc3Qgb2Ygb3B0aW9uYWwgdHJhc2ggZmlsZXMgdGhhdCBzaG91bGQgYmUgZGVsZXRlZCBieSAibWFrZSBjbGVhbiIKLWV4cG9ydCBUUkFTSAotCi1FQ0hPIDo9IGVjaG8KLQotaWZkZWYgUkVBTExZX1FVSUVUCi0gIGV4cG9ydCBSRUFMTFlfUVVJRVQKLSAgRUNITyA6PSB0cnVlCi0gIExGTEFHUyA6PSAkKExGTEFHUykgLXEKLSAgWUZMQUdTIDo9ICQoWUZMQUdTKSAtcQotZW5kaWYKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMgIHZhcmlhYmxlcyBkZXBlbmRpbmcgb24geW91ciBPQ2FtbC1pbnN0YWxsYXRpb24KLQotaWZkZWYgTUlOR1cKLSAgZXhwb3J0IE1JTkdXCi0gIFdJTjMyICAgOj0gMQotICBDRkxBR1NfV0lOMzIgOj0gLW1uby1jeWd3aW4KLWVuZGlmCi1pZmRlZiBNU1ZDCi0gIGV4cG9ydCBNU1ZDCi0gIFdJTjMyICAgOj0gMQotICBpZm5kZWYgU1RBVElDCi0gICAgQ1BQRkxBR1NfV0lOMzIgOj0gLURDQU1MX0RMTAotICBlbmRpZgotICBDRkxBR1NfV0lOMzIgKz0gLW5vbG9nbwotICBFWFRfT0JKIDo9IG9iagotICBFWFRfTElCIDo9IGxpYgotICBpZmVxICgkKENDKSxnY2MpCi0gICAgIyB3b3JrIGFyb3VuZCBHTlUgTWFrZSBkZWZhdWx0IHZhbHVlCi0gICAgaWZkZWYgVEhSRUFEUwotICAgICAgQ0MgOj0gY2wgLU1UCi0gICAgZWxzZQotICAgICAgQ0MgOj0gY2wKLSAgICBlbmRpZgotICBlbmRpZgotICBpZmVxICgkKENYWCksZysrKQotICAgICMgd29yayBhcm91bmQgR05VIE1ha2UgZGVmYXVsdCB2YWx1ZQotICAgIENYWCA6PSAkKENDKQotICBlbmRpZgotICBDRkxBR19PIDo9IC1GbwotZW5kaWYKLWlmZGVmIFdJTjMyCi0gIEVYVF9DWFggOj0gY3BwCi0gIEVYRSAgICAgOj0gLmV4ZQotZW5kaWYKLQotaWZuZGVmIEVYVF9PQkoKLSAgRVhUX09CSiA6PSBvCi1lbmRpZgotaWZuZGVmIEVYVF9MSUIKLSAgRVhUX0xJQiA6PSBhCi1lbmRpZgotaWZuZGVmIEVYVF9DWFgKLSAgRVhUX0NYWCA6PSBjYwotZW5kaWYKLWlmbmRlZiBFWEUKLSAgRVhFIDo9ICMgZW1wdHkKLWVuZGlmCi1pZm5kZWYgQ0ZMQUdfTwotICBDRkxBR19PIDo9IC1vICMgZG8gbm90IGRlbGV0ZSB0aGlzIGNvbW1lbnQgKHByZXNlcnZlcyB0cmFpbGluZyB3aGl0ZXNwYWNlKSEKLWVuZGlmCi0KLWV4cG9ydCBDQwotZXhwb3J0IENYWAotZXhwb3J0IENGTEFHUwotZXhwb3J0IENYWEZMQUdTCi1leHBvcnQgTERGTEFHUwotZXhwb3J0IENQUEZMQUdTCi0KLWlmbmRlZiBSUEFUSF9GTEFHCi0gIGlmZGVmIEVMRl9SUEFUSF9GTEFHCi0gICAgUlBBVEhfRkxBRyA6PSAkKEVMRl9SUEFUSF9GTEFHKQotICBlbHNlCi0gICAgUlBBVEhfRkxBRyA6PSAtUgotICBlbmRpZgotZW5kaWYKLWV4cG9ydCBSUEFUSF9GTEFHCi0KLWlmbmRlZiBNU1ZDCi1pZm5kZWYgUElDX0NGTEFHUwotICBQSUNfQ0ZMQUdTIDo9IC1mUElDCi1lbmRpZgotaWZuZGVmIFBJQ19DUFBGTEFHUwotICBQSUNfQ1BQRkxBR1MgOj0gLURQSUMKLWVuZGlmCi1lbmRpZgotCi1leHBvcnQgUElDX0NGTEFHUwotZXhwb3J0IFBJQ19DUFBGTEFHUwotCi1CQ1JFU1VMVCAgOj0gJChhZGRzdWZmaXggJChCQ1NVRkZJWCksICQoUkVTVUxUKSkKLU5DUkVTVUxUICA6PSAkKGFkZHN1ZmZpeCAkKE5DU1VGRklYKSwgJChSRVNVTFQpKQotVE9QUkVTVUxUIDo9ICQoYWRkc3VmZml4ICQoVE9QU1VGRklYKSwgJChSRVNVTFQpKQotCi1pZm5kZWYgT0NBTUxGSU5ECi0gIE9DQU1MRklORCA6PSBvY2FtbGZpbmQKLWVuZGlmCi1leHBvcnQgT0NBTUxGSU5ECi0KLWlmbmRlZiBPQ0FNTEMKLSAgT0NBTUxDIDo9IG9jYW1sYwotZW5kaWYKLWV4cG9ydCBPQ0FNTEMKLQotaWZuZGVmIE9DQU1MT1BUCi0gIE9DQU1MT1BUIDo9IG9jYW1sb3B0Ci1lbmRpZgotZXhwb3J0IE9DQU1MT1BUCi0KLWlmbmRlZiBPQ0FNTE1LVE9QCi0gIE9DQU1MTUtUT1AgOj0gb2NhbWxta3RvcAotZW5kaWYKLWV4cG9ydCBPQ0FNTE1LVE9QCi0KLWlmbmRlZiBPQ0FNTENQCi0gIE9DQU1MQ1AgOj0gb2NhbWxjcAotZW5kaWYKLWV4cG9ydCBPQ0FNTENQCi0KLWlmbmRlZiBPQ0FNTERFUAotICBPQ0FNTERFUCA6PSBvY2FtbGRlcAotZW5kaWYKLWV4cG9ydCBPQ0FNTERFUAotCi1pZm5kZWYgT0NBTUxMRVgKLSAgT0NBTUxMRVggOj0gb2NhbWxsZXgKLWVuZGlmCi1leHBvcnQgT0NBTUxMRVgKLQotaWZuZGVmIE9DQU1MWUFDQwotICBPQ0FNTFlBQ0MgOj0gb2NhbWx5YWNjCi1lbmRpZgotZXhwb3J0IE9DQU1MWUFDQwotCi1pZm5kZWYgT0NBTUxNS0xJQgotICBPQ0FNTE1LTElCIDo9IG9jYW1sbWtsaWIKLWVuZGlmCi1leHBvcnQgT0NBTUxNS0xJQgotCi1pZm5kZWYgT0NBTUxfR0xBREVDQwotICBPQ0FNTF9HTEFERUNDIDo9IGxhYmxnbGFkZWNjMgotZW5kaWYKLWV4cG9ydCBPQ0FNTF9HTEFERUNDCi0KLWlmbmRlZiBPQ0FNTF9HTEFERUNDX0ZMQUdTCi0gIE9DQU1MX0dMQURFQ0NfRkxBR1MgOj0KLWVuZGlmCi1leHBvcnQgT0NBTUxfR0xBREVDQ19GTEFHUwotCi1pZm5kZWYgQ0FNRUxFT05fUkVQT1JUCi0gIENBTUVMRU9OX1JFUE9SVCA6PSByZXBvcnQKLWVuZGlmCi1leHBvcnQgQ0FNRUxFT05fUkVQT1JUCi0KLWlmbmRlZiBDQU1FTEVPTl9SRVBPUlRfRkxBR1MKLSAgQ0FNRUxFT05fUkVQT1JUX0ZMQUdTIDo9Ci1lbmRpZgotZXhwb3J0IENBTUVMRU9OX1JFUE9SVF9GTEFHUwotCi1pZm5kZWYgQ0FNRUxFT05fWk9HR1kKLSAgQ0FNRUxFT05fWk9HR1kgOj0gY2FtbHA0byBwYV96b2cuY21hIHByX28uY21vCi1lbmRpZgotZXhwb3J0IENBTUVMRU9OX1pPR0dZCi0KLWlmbmRlZiBDQU1FTEVPTl9aT0dHWV9GTEFHUwotICBDQU1FTEVPTl9aT0dHWV9GTEFHUyA6PQotZW5kaWYKLWV4cG9ydCBDQU1FTEVPTl9aT0dHWV9GTEFHUwotCi1pZm5kZWYgT1hSSURMCi0gIE9YUklETCA6PSBveHJpZGwKLWVuZGlmCi1leHBvcnQgT1hSSURMCi0KLWlmbmRlZiBDQU1MSURMCi0gIENBTUxJREwgOj0gY2FtbGlkbAotZW5kaWYKLWV4cG9ydCBDQU1MSURMCi0KLWlmbmRlZiBDQU1MSURMRExMCi0gIENBTUxJRExETEwgOj0gY2FtbGlkbGRsbAotZW5kaWYKLWV4cG9ydCBDQU1MSURMRExMCi0KLWlmbmRlZiBOT0lETEhFQURFUgotICBNQVlCRV9JRExfSEVBREVSIDo9IC1oZWFkZXIKLWVuZGlmCi1leHBvcnQgTk9JRExIRUFERVIKLQotZXhwb3J0IE5PX0NVU1RPTQotCi1pZm5kZWYgQ0FNTFA0Ci0gIENBTUxQNCA6PSBjYW1scDQKLWVuZGlmCi1leHBvcnQgQ0FNTFA0Ci0KLWlmbmRlZiBSRUFMX09DQU1MRklORAotICBpZmRlZiBQQUNLUwotICAgIGlmbmRlZiBDUkVBVEVfTElCCi0gICAgICBpZmRlZiBUSFJFQURTCi0JUEFDS1MgKz0gdGhyZWFkcwotICAgICAgZW5kaWYKLSAgICBlbmRpZgotICAgIGVtcHR5IDo9Ci0gICAgc3BhY2UgOj0gJChlbXB0eSkgJChlbXB0eSkKLSAgICBjb21tYSA6PSAsCi0gICAgaWZkZWYgUFJFRFMKLSAgICAgIFBSRV9PQ0FNTF9GSU5EX1BSRURJQ0FURVMgOj0gJChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKFBSRURTKSkKLSAgICAgIFBSRV9PQ0FNTF9GSU5EX1BBQ0tBR0VTIDo9ICQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChQQUNLUykpCi0gICAgICBPQ0FNTF9GSU5EX1BSRURJQ0FURVMgOj0gLXByZWRpY2F0ZXMgJChQUkVfT0NBTUxfRklORF9QUkVESUNBVEVTKQotICAjICAgIE9DQU1MX0RFUF9QUkVESUNBVEVTIDo9IC1zeW50YXggJChQUkVfT0NBTUxfRklORF9QUkVESUNBVEVTKQotICAgICAgT0NBTUxfRklORF9QQUNLQUdFUyA6PSAkKE9DQU1MX0ZJTkRfUFJFRElDQVRFUykgLXBhY2thZ2UgJChQUkVfT0NBTUxfRklORF9QQUNLQUdFUykKLSAgICAgIE9DQU1MX0RFUF9QQUNLQUdFUyA6PSAkKE9DQU1MX0RFUF9QUkVESUNBVEVTKSAtcGFja2FnZSAkKFBSRV9PQ0FNTF9GSU5EX1BBQ0tBR0VTKQotICAgIGVsc2UKLSAgICAgIE9DQU1MX0ZJTkRfUEFDS0FHRVMgOj0gLXBhY2thZ2UgJChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKFBBQ0tTKSkKLSAgICAgIE9DQU1MX0RFUF9QQUNLQUdFUyA6PQotICAgIGVuZGlmCi0gICAgT0NBTUxfRklORF9MSU5LUEtHIDo9IC1saW5rcGtnCi0gICAgUkVBTF9PQ0FNTEZJTkQgOj0gJChPQ0FNTEZJTkQpCi0gIGVuZGlmCi1lbmRpZgotCi1leHBvcnQgT0NBTUxfRklORF9QQUNLQUdFUwotZXhwb3J0IE9DQU1MX0RFUF9QQUNLQUdFUwotZXhwb3J0IE9DQU1MX0ZJTkRfTElOS1BLRwotZXhwb3J0IFJFQUxfT0NBTUxGSU5ECi0KLWlmbmRlZiBPQ0FNTERPQwotICBPQ0FNTERPQyA6PSBvY2FtbGRvYwotZW5kaWYKLWV4cG9ydCBPQ0FNTERPQwotCi1pZm5kZWYgTEFURVgKLSAgTEFURVggOj0gbGF0ZXgKLWVuZGlmCi1leHBvcnQgTEFURVgKLQotaWZuZGVmIERWSVBTCi0gIERWSVBTIDo9IGR2aXBzCi1lbmRpZgotZXhwb3J0IERWSVBTCi0KLWlmbmRlZiBQUzJQREYKLSAgUFMyUERGIDo9IHBzMnBkZgotZW5kaWYKLWV4cG9ydCBQUzJQREYKLQotaWZuZGVmIE9DQU1MTUFLRUZJTEUKLSAgT0NBTUxNQUtFRklMRSA6PSBPQ2FtbE1ha2VmaWxlCi1lbmRpZgotZXhwb3J0IE9DQU1MTUFLRUZJTEUKLQotaWZuZGVmIE9DQU1MTElCUEFUSAotICBPQ0FNTExJQlBBVEggOj0gXAotICAgICQoc2hlbGwgJChPQ0FNTEMpIDI+L2Rldi9udWxsIC13aGVyZSB8fCBlY2hvIC91c3IvbG9jYWwvbGliL29jYW1sKQotZW5kaWYKLWV4cG9ydCBPQ0FNTExJQlBBVEgKLQotaWZuZGVmIE9DQU1MX0xJQl9JTlNUQUxMCi0gIE9DQU1MX0xJQl9JTlNUQUxMIDo9ICQoT0NBTUxMSUJQQVRIKS9jb250cmliCi1lbmRpZgotZXhwb3J0IE9DQU1MX0xJQl9JTlNUQUxMCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyAgY2hhbmdlIGZvbGxvd2luZyBzZWN0aW9ucyBvbmx5IGlmCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyAgICB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCi0KLSMgZGVsZXRlIHRhcmdldCBmaWxlcyB3aGVuIGEgYnVpbGQgY29tbWFuZCBmYWlscwotLlBIT05ZOiAuREVMRVRFX09OX0VSUk9SCi0uREVMRVRFX09OX0VSUk9SOgotCi0jIGZvciBwZWRhbnRzIHVzaW5nICItLXdhcm4tdW5kZWZpbmVkLXZhcmlhYmxlcyIKLWV4cG9ydCBNQVlCRV9JREwKLWV4cG9ydCBSRUFMX1JFU1VMVAotZXhwb3J0IENBTUxJRExGTEFHUwotZXhwb3J0IFRIUkVBRF9GTEFHCi1leHBvcnQgUkVTX0NMSUIKLWV4cG9ydCBNQUtFRExMCi1leHBvcnQgQU5OT1RfRkxBRwotZXhwb3J0IENfT1hSSURMCi1leHBvcnQgU1VCUFJPSlMKLWV4cG9ydCBDRkxBR1NfV0lOMzIKLWV4cG9ydCBDUFBGTEFHU19XSU4zMgotCi1JTkNGTEFHUyA6PQotCi1TSEVMTCA6PSAvYmluL3NoCi0KLU1MREVQRElSIDo9IC5fZAotQkNESURJUiAgOj0gLl9iY2RpCi1OQ0RJRElSICA6PSAuX25jZGkKLQotRklMVEVSX0VYVE5TIDo9ICUubWxpICUubWwgJS5tbGwgJS5tbHkgJS5pZGwgJS5veHJpZGwgJS5jICUubSAlLiQoRVhUX0NYWCkgJS5yZXAgJS56b2cgJS5nbGFkZQotCi1GSUxURVJFRCAgICAgOj0gJChmaWx0ZXIgJChGSUxURVJfRVhUTlMpLCAkKFNPVVJDRVMpKQotU09VUkNFX0RJUlMgIDo9ICQoZmlsdGVyLW91dCAuLywgJChzb3J0ICQoZGlyICQoRklMVEVSRUQpKSkpCi0KLUZJTFRFUkVEX1JFUCA6PSAkKGZpbHRlciAlLnJlcCwgJChGSUxURVJFRCkpCi1ERVBfUkVQICAgICAgOj0gJChGSUxURVJFRF9SRVA6JS5yZXA9JChNTERFUERJUikvJS5kKQotQVVUT19SRVAgICAgIDo9ICQoRklMVEVSRURfUkVQOi5yZXA9Lm1sKQotCi1GSUxURVJFRF9aT0cgOj0gJChmaWx0ZXIgJS56b2csICQoRklMVEVSRUQpKQotREVQX1pPRyAgICAgIDo9ICQoRklMVEVSRURfWk9HOiUuem9nPSQoTUxERVBESVIpLyUuZCkKLUFVVE9fWk9HICAgICA6PSAkKEZJTFRFUkVEX1pPRzouem9nPS5tbCkKLQotRklMVEVSRURfR0xBREUgOj0gJChmaWx0ZXIgJS5nbGFkZSwgJChGSUxURVJFRCkpCi1ERVBfR0xBREUgICAgICA6PSAkKEZJTFRFUkVEX0dMQURFOiUuZ2xhZGU9JChNTERFUERJUikvJS5kKQotQVVUT19HTEFERSAgICAgOj0gJChGSUxURVJFRF9HTEFERTouZ2xhZGU9Lm1sKQotCi1GSUxURVJFRF9NTCAgOj0gJChmaWx0ZXIgJS5tbCwgJChGSUxURVJFRCkpCi1ERVBfTUwgICAgICAgOj0gJChGSUxURVJFRF9NTDolLm1sPSQoTUxERVBESVIpLyUuZCkKLQotRklMVEVSRURfTUxJIDo9ICQoZmlsdGVyICUubWxpLCAkKEZJTFRFUkVEKSkKLURFUF9NTEkgICAgICA6PSAkKEZJTFRFUkVEX01MSToubWxpPS5kaSkKLQotRklMVEVSRURfTUxMIDo9ICQoZmlsdGVyICUubWxsLCAkKEZJTFRFUkVEKSkKLURFUF9NTEwgICAgICA6PSAkKEZJTFRFUkVEX01MTDolLm1sbD0kKE1MREVQRElSKS8lLmQpCi1BVVRPX01MTCAgICAgOj0gJChGSUxURVJFRF9NTEw6Lm1sbD0ubWwpCi0KLUZJTFRFUkVEX01MWSA6PSAkKGZpbHRlciAlLm1seSwgJChGSUxURVJFRCkpCi1ERVBfTUxZICAgICAgOj0gJChGSUxURVJFRF9NTFk6JS5tbHk9JChNTERFUERJUikvJS5kKSAkKEZJTFRFUkVEX01MWToubWx5PS5kaSkKLUFVVE9fTUxZICAgICA6PSAkKEZJTFRFUkVEX01MWToubWx5PS5tbGkpICQoRklMVEVSRURfTUxZOi5tbHk9Lm1sKQotCi1GSUxURVJFRF9JREwgOj0gJChmaWx0ZXIgJS5pZGwsICQoRklMVEVSRUQpKQotREVQX0lETCAgICAgIDo9ICQoRklMVEVSRURfSURMOiUuaWRsPSQoTUxERVBESVIpLyUuZCkgJChGSUxURVJFRF9JREw6LmlkbD0uZGkpCi1DX0lETCAgICAgICAgOj0gJChGSUxURVJFRF9JREw6JS5pZGw9JV9zdHVicy5jKQotaWZuZGVmIE5PSURMSEVBREVSCi0gQ19JREwgKz0gJChGSUxURVJFRF9JREw6LmlkbD0uaCkKLWVuZGlmCi1PQkpfQ19JREwgICAgOj0gJChGSUxURVJFRF9JREw6JS5pZGw9JV9zdHVicy4kKEVYVF9PQkopKQotQVVUT19JREwgICAgIDo9ICQoRklMVEVSRURfSURMOi5pZGw9Lm1saSkgJChGSUxURVJFRF9JREw6LmlkbD0ubWwpICQoQ19JREwpCi0KLUZJTFRFUkVEX09YUklETCA6PSAkKGZpbHRlciAlLm94cmlkbCwgJChGSUxURVJFRCkpCi1ERVBfT1hSSURMICAgICAgOj0gJChGSUxURVJFRF9PWFJJREw6JS5veHJpZGw9JChNTERFUERJUikvJS5kKSAkKEZJTFRFUkVEX09YUklETDoub3hyaWRsPS5kaSkKLUFVVE9fT1hSSURMICAgICA6PSAkKEZJTFRFUkVEX09YUklETDoub3hyaWRsPS5tbGkpICQoRklMVEVSRURfT1hSSURMOi5veHJpZGw9Lm1sKSAkKENfT1hSSURMKQotCi1GSUxURVJFRF9DX0NYWCA6PSAkKGZpbHRlciAlLmMgJS5tICUuJChFWFRfQ1hYKSwgJChGSUxURVJFRCkpCi1PQkpfQ19DWFggICAgICA6PSAkKEZJTFRFUkVEX0NfQ1hYOi5jPS4kKEVYVF9PQkopKQotT0JKX0NfQ1hYICAgICAgOj0gJChPQkpfQ19DWFg6Lm09LiQoRVhUX09CSikpCi1PQkpfQ19DWFggICAgICA6PSAkKE9CSl9DX0NYWDouJChFWFRfQ1hYKT0uJChFWFRfT0JKKSkKLQotUFJFX1RBUkdFVFMgICs9ICQoQVVUT19NTEwpICQoQVVUT19NTFkpICQoQVVUT19JREwpICQoQVVUT19PWFJJREwpICQoQVVUT19aT0cpICQoQVVUT19SRVApICQoQVVUT19HTEFERSkKLQotQUxMX0RFUFMgICAgIDo9ICQoREVQX01MKSAkKERFUF9NTEkpICQoREVQX01MTCkgJChERVBfTUxZKSAkKERFUF9JREwpICQoREVQX09YUklETCkgJChERVBfWk9HKSAkKERFUF9SRVApICQoREVQX0dMQURFKQotCi1NTERFUFMgICAgICAgOj0gJChmaWx0ZXIgJS5kLCAkKEFMTF9ERVBTKSkKLU1MSURFUFMgICAgICA6PSAkKGZpbHRlciAlLmRpLCAkKEFMTF9ERVBTKSkKLUJDREVQSVMgICAgICA6PSAkKE1MSURFUFM6JS5kaT0kKEJDRElESVIpLyUuZGkpCi1OQ0RFUElTICAgICAgOj0gJChNTElERVBTOiUuZGk9JChOQ0RJRElSKS8lLmRpKQotCi1BTExNTCAgICAgICAgOj0gJChmaWx0ZXIgJS5tbGkgJS5tbCAlLm1sbCAlLm1seSAlLmlkbCAlLm94cmlkbCAlLnJlcCAlLnpvZyAlLmdsYWRlLCAkKEZJTFRFUkVEKSkKLQotSU1QTE9fSU5URiAgIDo9ICQoQUxMTUw6JS5tbGk9JS5tbGkuX18pCi1JTVBMT19JTlRGICAgOj0gJChmb3JlYWNoIGZpbGUsICQoSU1QTE9fSU5URiksIFwKLSAgICAgICAgICAgICAgICAgICQoYmFzZW5hbWUgJChmaWxlKSkuY21pICQoYmFzZW5hbWUgJChmaWxlKSkuY21vKQotSU1QTE9fSU5URiAgIDo9ICQoZmlsdGVyLW91dCAlLm1saS5jbW8sICQoSU1QTE9fSU5URikpCi1JTVBMT19JTlRGICAgOj0gJChJTVBMT19JTlRGOiUubWxpLmNtaT0lLmNtaSkKLQotSU1QTFhfSU5URiAgIDo9ICQoSU1QTE9fSU5URjouY21vPS5jbXgpCi0KLUlOVEYgICAgICAgICA6PSAkKGZpbHRlciAlLmNtaSwgJChJTVBMT19JTlRGKSkKLUlNUExfQ01PICAgICA6PSAkKGZpbHRlciAlLmNtbywgJChJTVBMT19JTlRGKSkKLUlNUExfQ01YICAgICA6PSAkKElNUExfQ01POi5jbW89LmNteCkKLUlNUExfQVNNICAgICA6PSAkKElNUExfQ01POi5jbW89LmFzbSkKLUlNUExfUyAgICAgICA6PSAkKElNUExfQ01POi5jbW89LnMpCi0KLU9CSl9MSU5LICAgICA6PSAkKE9CSl9DX0lETCkgJChPQkpfQ19DWFgpCi1PQkpfRklMRVMgICAgOj0gJChJTVBMX0NNTzouY21vPS4kKEVYVF9PQkopKSAkKE9CSl9MSU5LKQotCi1FWEVDUyAgICAgICAgOj0gJChhZGRzdWZmaXggJChFWEUpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzb3J0ICQoVE9QUkVTVUxUKSAkKEJDUkVTVUxUKSAkKE5DUkVTVUxUKSkpCi1pZmRlZiBXSU4zMgotICBFWEVDUyAgICAgICs9ICQoQkNSRVNVTFQpLmRsbCAkKE5DUkVTVUxUKS5kbGwKLWVuZGlmCi0KLUNMSUJfQkFTRSAgICA6PSAkKFJFU1VMVCkkKFJFU19DTElCX1NVRikKLWlmbmVxICgkKHN0cmlwICQoT0JKX0xJTkspKSwpCi0gIFJFU19DTElCICAgICA6PSBsaWIkKENMSUJfQkFTRSkuJChFWFRfTElCKQotZW5kaWYKLQotaWZkZWYgV0lOMzIKLURMTFNPTkFNRSA6PSAkKENMSUJfQkFTRSkuZGxsCi1lbHNlCi1ETExTT05BTUUgOj0gZGxsJChDTElCX0JBU0UpLnNvCi1lbmRpZgotCi1OT05FWEVDUyAgICAgOj0gJChJTlRGKSAkKElNUExfQ01PKSAkKElNUExfQ01YKSAkKElNUExfQVNNKSAkKElNUExfUykgXAotCQkkKE9CSl9GSUxFUykgJChQUkVfVEFSR0VUUykgJChCQ1JFU1VMVCkuY21hICQoTkNSRVNVTFQpLmNteGEgXAotCQkkKE5DUkVTVUxUKS4kKEVYVF9MSUIpICQoQkNSRVNVTFQpLmNtaSAkKEJDUkVTVUxUKS5jbW8gXAotCQkkKE5DUkVTVUxUKS5jbWkgJChOQ1JFU1VMVCkuY214ICQoTkNSRVNVTFQpLm8gXAotCQkkKFJFU19DTElCKSAkKElNUExfQ01POi5jbW89LmFubm90KSBcCi0JCSQoTElCX1BBQ0tfTkFNRSkuY21pICQoTElCX1BBQ0tfTkFNRSkuY21vICQoTElCX1BBQ0tfTkFNRSkuY214ICQoTElCX1BBQ0tfTkFNRSkubwotCi1pZm5kZWYgU1RBVElDCi0gIE5PTkVYRUNTICs9ICQoRExMU09OQU1FKQotZW5kaWYKLQotaWZuZGVmIExJQklOU1RBTExfRklMRVMKLSAgTElCSU5TVEFMTF9GSUxFUyA6PSAkKFJFU1VMVCkubWxpICQoUkVTVUxUKS5jbWkgJChSRVNVTFQpLmNtYSBcCi0JCSAgICAgICQoUkVTVUxUKS5jbXhhICQoUkVTVUxUKS4kKEVYVF9MSUIpICQoUkVTX0NMSUIpCi0gIGlmbmRlZiBTVEFUSUMKLSAgICBpZm5lcSAoJChzdHJpcCAkKE9CSl9MSU5LKSksKQotICAgICAgTElCSU5TVEFMTF9GSUxFUyArPSAkKERMTFNPTkFNRSkKLSAgICBlbmRpZgotICBlbmRpZgotZW5kaWYKLQotZXhwb3J0IExJQklOU1RBTExfRklMRVMKLQotaWZkZWYgV0lOMzIKLSAgIyBzb21lIGV4dHJhIHN0dWZmIGlzIGNyZWF0ZWQgd2hpbGUgbGlua2luZyBETExzCi0gIE5PTkVYRUNTICAgKz0gJChCQ1JFU1VMVCkuJChFWFRfTElCKSAkKEJDUkVTVUxUKS5leHAgJChOQ1JFU1VMVCkuZXhwICQoQ0xJQl9CQVNFKS5leHAgJChDTElCX0JBU0UpLmxpYgotZW5kaWYKLQotVEFSR0VUUyAgICAgIDo9ICQoRVhFQ1MpICQoTk9ORVhFQ1MpCi0KLSMgSWYgdGhlcmUgYXJlIElETC1maWxlcwotaWZuZXEgKCQoc3RyaXAgJChGSUxURVJFRF9JREwpKSwpCi0gIE1BWUJFX0lETCA6PSAtY2NsaWIgLWxjYW1saWRsCi1lbmRpZgotCi1pZmRlZiBVU0VfQ0FNTFA0Ci0gIENBTUxQNFBBVEggOj0gXAotICAgICQoc2hlbGwgJChDQU1MUDQpIC13aGVyZSAyPi9kZXYvbnVsbCB8fCBlY2hvIC91c3IvbG9jYWwvbGliL2NhbWxwNCkKLSAgSU5DRkxBR1MgOj0gLUkgJChDQU1MUDRQQVRIKQotICBDSU5DRkxBR1MgOj0gLUkkKENBTUxQNFBBVEgpCi1lbmRpZgotCi1ESU5DRkxBR1MgOj0gJChJTkNGTEFHUykgJChTT1VSQ0VfRElSUzolPS1JICUpICQoT0NBTUxfREVGQVVMVF9ESVJTOiU9LUkgJSkKLUlOQ0ZMQUdTIDo9ICQoRElOQ0ZMQUdTKSAkKElOQ0RJUlM6JT0tSSAlKQotQ0lOQ0ZMQUdTICs9ICQoU09VUkNFX0RJUlM6JT0tSSUpICQoSU5DRElSUzolPS1JJSkgJChPQ0FNTF9ERUZBVUxUX0RJUlM6JT0tSSUpCi0KLWlmbmRlZiBNU1ZDCi0gIENMSUJGTEFHUyArPSAkKFNPVVJDRV9ESVJTOiU9LUwlKSAkKExJQkRJUlM6JT0tTCUpIFwKLSAgICAgICAgICAgICAgICQoRVhUTElCRElSUzolPS1MJSkgJChPQ0FNTF9ERUZBVUxUX0RJUlM6JT0tTCUpCi0KLSAgaWZlcSAoJChFTEZfUlBBVEgpLCB5ZXMpCi0gICAgQ0xJQkZMQUdTICs9ICQoRVhUTElCRElSUzolPS1XbCwkKFJQQVRIX0ZMQUcpJSkKLSAgZW5kaWYKLWVuZGlmCi0KLWlmbmRlZiBQUk9GSUxJTkcKLSAgSU5URl9PQ0FNTEMgOj0gJChPQ0FNTEMpCi1lbHNlCi0gIGlmbmRlZiBUSFJFQURTCi0gICAgSU5URl9PQ0FNTEMgOj0gJChPQ0FNTENQKSAtcCAkKE9DQU1MQ1BGTEFHUykKLSAgZWxzZQotICAgICMgT0NhbWwgZG9lcyBub3Qgc3VwcG9ydCBwcm9maWxpbmcgYnl0ZSBjb2RlCi0gICAgIyB3aXRoIHRocmVhZHMgKHlldCksIHRoZXJlZm9yZSB3ZSBmb3JjZSBhbiBlcnJvci4KLSAgICBpZm5kZWYgUkVBTF9PQ0FNTEMKLSAgICAgICQoZXJyb3IgUHJvZmlsaW5nIG9mIG11bHRpdGhyZWFkZWQgYnl0ZSBjb2RlIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IE9DYW1sKQotICAgIGVuZGlmCi0gICAgSU5URl9PQ0FNTEMgOj0gJChPQ0FNTEMpCi0gIGVuZGlmCi1lbmRpZgotCi1pZm5kZWYgTVNWQwotICBDT01NT05fTERGTEFHUyA6PSAkKExERkxBR1M6JT0tY2NvcHQgJSkgJChTT1VSQ0VfRElSUzolPS1jY29wdCAtTCUpIFwKLQkJICAgICQoTElCRElSUzolPS1jY29wdCAtTCUpICQoRVhUTElCRElSUzolPS1jY29wdCAtTCUpIFwKLQkJICAgICQoRVhUTElCRElSUzolPS1jY29wdCAtV2wgJChPQ0FNTF9ERUZBVUxUX0RJUlM6JT0tY2NvcHQgLUwlKSkKLQotICBpZmVxICgkKEVMRl9SUEFUSCkseWVzKQotICAgIENPTU1PTl9MREZMQUdTICs9ICQoRVhUTElCRElSUzolPS1jY29wdCAtV2wsJChSUEFUSF9GTEFHKSUpCi0gIGVuZGlmCi1lbHNlCi0gIENPTU1PTl9MREZMQUdTIDo9IC1jY29wdCAiL2xpbmsgLU5PREVGQVVMVExJQjpMSUJDICQoTERGTEFHUzolPSUpICQoU09VUkNFX0RJUlM6JT0tTElCUEFUSDolKSBcCi0JCSAgICAkKExJQkRJUlM6JT0tTElCUEFUSDolKSAkKEVYVExJQkRJUlM6JT0tTElCUEFUSDolKSBcCi0JCSAgICAkKE9DQU1MX0RFRkFVTFRfRElSUzolPS1MSUJQQVRIOiUpICIKLWVuZGlmCi0KLUNMSUJTX09QVFMgOj0gJChDTElCUzolPS1jY2xpYiAtbCUpICQoQ0ZSQU1FV09SS1M6JT0tY2NsaWIgJy1mcmFtZXdvcmsgJScpCi1pZmRlZiBNU1ZDCi0gIGlmbmRlZiBTVEFUSUMKLSAgIyBNU1ZDIGxpYnJhcmllcyBkbyBub3QgaGF2ZSAnbGliJyBwcmVmaXgKLSAgQ0xJQlNfT1BUUyA6PSAkKENMSUJTOiU9LWNjbGliICUubGliKQotICBlbmRpZgotZW5kaWYKLQotaWZuZXEgKCQoc3RyaXAgJChPQkpfTElOSykpLCkKLSAgaWZkZWYgQ1JFQVRFX0xJQgotICAgIE9CSlNfTElCUyA6PSAtY2NsaWIgLWwkKENMSUJfQkFTRSkgJChDTElCU19PUFRTKSAkKE1BWUJFX0lETCkKLSAgZWxzZQotICAgIE9CSlNfTElCUyA6PSAkKE9CSl9MSU5LKSAkKENMSUJTX09QVFMpICQoTUFZQkVfSURMKQotICBlbmRpZgotZWxzZQotICBPQkpTX0xJQlMgOj0gJChDTElCU19PUFRTKSAkKE1BWUJFX0lETCkKLWVuZGlmCi0KLSMgSWYgd2UgaGF2ZSB0byBtYWtlIGJ5dGUtY29kZQotaWZuZGVmIFJFQUxfT0NBTUxDCi0gIEJZVEVfT0NBTUwgOj0geQotCi0gICMgRVhUUkFERVBTIGlzIGFkZGVkIGRlcGVuZGVuY2llcyB3ZSBoYXZlIHRvIGluc2VydCBmb3IgYWxsCi0gICMgZXhlY3V0YWJsZSBmaWxlcyB3ZSBnZW5lcmF0ZS4gIElkZWFsbHkgaXQgc2hvdWxkIGJlIGFsbCBvZiB0aGUKLSAgIyBsaWJyYXJpZXMgd2UgdXNlLCBidXQgaXQncyBoYXJkIHRvIGZpbmQgdGhlIG9uZXMgdGhhdCBnZXQgc2VhcmNoZWQgb24KLSAgIyB0aGUgcGF0aCBzaW5jZSBJIGRvbid0IGtub3cgdGhlIHBhdGhzIGJ1aWx0IGludG8gdGhlIGNvbXBpbGVyLCBzbwotICAjIGp1c3QgaW5jbHVkZSB0aGUgb25lcyB3aXRoIHNsYXNoZXMgaW4gdGhlaXIgbmFtZXMuCi0gIEVYVFJBREVQUyA6PSAkKGFkZHN1ZmZpeCAuY21hLCQoZm9yZWFjaCBpLCQoTElCUyksJChpZiAkKGZpbmRzdHJpbmcgLywkKGkpKSwkKGkpKSkpCi0gIFNQRUNJQUxfT0NBTUxGTEFHUyA6PSAkKE9DQU1MQkNGTEFHUykKLQotICBSRUFMX09DQU1MQyA6PSAkKElOVEZfT0NBTUxDKQotCi0gIFJFQUxfSU1QTCA6PSAkKElNUExfQ01PKQotICBSRUFMX0lNUExfSU5URiA6PSAkKElNUExPX0lOVEYpCi0gIElNUExfU1VGIDo9IC5jbW8KLQotICBERVBGTEFHUyAgOj0KLSAgTUFLRV9ERVBTIDo9ICQoTUxERVBTKSAkKEJDREVQSVMpCi0KLSAgaWZkZWYgQ1JFQVRFX0xJQgotICAgIG92ZXJyaWRlIENGTEFHUyA6PSAkKFBJQ19DRkxBR1MpICQoQ0ZMQUdTKQotICAgIG92ZXJyaWRlIENQUEZMQUdTIDo9ICQoUElDX0NQUEZMQUdTKSAkKENQUEZMQUdTKQotICAgIGlmbmRlZiBTVEFUSUMKLSAgICAgIGlmbmVxICgkKHN0cmlwICQoT0JKX0xJTkspKSwpCi0JTUFLRURMTCA6PSAkKERMTFNPTkFNRSkKLQlBTExfTERGTEFHUyA6PSAtZGxsaWIgJChETExTT05BTUUpCi0gICAgICBlbmRpZgotICAgIGVuZGlmCi0gIGVuZGlmCi0KLSAgaWZuZGVmIE5PX0NVU1RPTQotICAgIGlmbmVxICIkKHN0cmlwICQoT0JKX0xJTkspICQoVEhSRUFEUykgJChNQVlCRV9JREwpICQoQ0xJQlMpICQoQ0ZSQU1FV09SS1MpKSIgIiIKLSAgICAgIEFMTF9MREZMQUdTICs9IC1jdXN0b20KLSAgICBlbmRpZgotICBlbmRpZgotCi0gIEFMTF9MREZMQUdTICs9ICQoSU5DRkxBR1MpICQoT0NBTUxMREZMQUdTKSAkKE9DQU1MQkxERkxBR1MpIFwKLSAgICAgICAgICAgICAgICAgJChDT01NT05fTERGTEFHUykgJChMSUJTOiU9JS5jbWEpCi0gIENBTUxJRExETExGTEFHUyA6PQotCi0gIGlmZGVmIFRIUkVBRFMKLSAgICBpZmRlZiBWTVRIUkVBRFMKLSAgICAgIFRIUkVBRF9GTEFHIDo9IC12bXRocmVhZAotICAgIGVsc2UKLSAgICAgIFRIUkVBRF9GTEFHIDo9IC10aHJlYWQKLSAgICBlbmRpZgotICAgIEFMTF9MREZMQUdTIDo9ICQoVEhSRUFEX0ZMQUcpICQoQUxMX0xERkxBR1MpCi0gICAgaWZuZGVmIENSRUFURV9MSUIKLSAgICAgIGlmbmRlZiBSRUFMX09DQU1MRklORAotICAgICAgICBBTExfTERGTEFHUyA6PSB1bml4LmNtYSB0aHJlYWRzLmNtYSAkKEFMTF9MREZMQUdTKQotICAgICAgZW5kaWYKLSAgICBlbmRpZgotICBlbmRpZgotCi0jIHdlIGhhdmUgdG8gbWFrZSBuYXRpdmUtY29kZQotZWxzZQotICBFWFRSQURFUFMgOj0gJChhZGRzdWZmaXggLmNteGEsJChmb3JlYWNoIGksJChMSUJTKSwkKGlmICQoZmluZHN0cmluZyAvLCQoaSkpLCQoaSkpKSkKLSAgaWZuZGVmIFBST0ZJTElORwotICAgIFNQRUNJQUxfT0NBTUxGTEFHUyA6PSAkKE9DQU1MTkNGTEFHUykKLSAgICBQTERGTEFHUyA6PQotICBlbHNlCi0gICAgU1BFQ0lBTF9PQ0FNTEZMQUdTIDo9IC1wICQoT0NBTUxOQ0ZMQUdTKQotICAgIFBMREZMQUdTIDo9IC1wCi0gIGVuZGlmCi0KLSAgUkVBTF9JTVBMIDo9ICQoSU1QTF9DTVgpCi0gIFJFQUxfSU1QTF9JTlRGIDo9ICQoSU1QTFhfSU5URikKLSAgSU1QTF9TVUYgOj0gLmNteAotCi0gIG92ZXJyaWRlIENQUEZMQUdTIDo9IC1ETkFUSVZFX0NPREUgJChDUFBGTEFHUykKLQotICBERVBGTEFHUyAgOj0gLW5hdGl2ZQotICBNQUtFX0RFUFMgOj0gJChNTERFUFMpICQoTkNERVBJUykKLQotICBBTExfTERGTEFHUyA6PSAkKFBMREZMQUdTKSAkKElOQ0ZMQUdTKSAkKE9DQU1MTERGTEFHUykgXAotICAgICAgICAgICAgICAgICAkKE9DQU1MTkxERkxBR1MpICQoQ09NTU9OX0xERkxBR1MpCi0gIENBTUxJRExETExGTEFHUyA6PSAtb3B0Ci0KLSAgaWZuZGVmIENSRUFURV9MSUIKLSAgICBBTExfTERGTEFHUyArPSAkKExJQlM6JT0lLmNteGEpCi0gIGVsc2UKLSAgICBvdmVycmlkZSBDRkxBR1MgOj0gJChQSUNfQ0ZMQUdTKSAkKENGTEFHUykKLSAgICBvdmVycmlkZSBDUFBGTEFHUyA6PSAkKFBJQ19DUFBGTEFHUykgJChDUFBGTEFHUykKLSAgZW5kaWYKLQotICBpZmRlZiBUSFJFQURTCi0gICAgVEhSRUFEX0ZMQUcgOj0gLXRocmVhZAotICAgIEFMTF9MREZMQUdTIDo9ICQoVEhSRUFEX0ZMQUcpICQoQUxMX0xERkxBR1MpCi0gICAgaWZuZGVmIENSRUFURV9MSUIKLSAgICAgIGlmbmRlZiBSRUFMX09DQU1MRklORAotICAgICAgICBBTExfTERGTEFHUyA6PSB1bml4LmNteGEgdGhyZWFkcy5jbXhhICQoQUxMX0xERkxBR1MpCi0gICAgICBlbmRpZgotICAgIGVuZGlmCi0gIGVuZGlmCi1lbmRpZgotCi1leHBvcnQgTUFLRV9ERVBTCi0KLWlmZGVmIEFOTk9UQVRFCi0gIEFOTk9UX0ZMQUcgOj0gLWR0eXBlcwotZWxzZQotZW5kaWYKLQotQUxMX09DQU1MQ0ZMQUdTIDo9ICQoVEhSRUFEX0ZMQUcpICQoQU5OT1RfRkxBRykgJChPQ0FNTEZMQUdTKSBcCi0gICAgICAgICAgICAgICAgICAgJChJTkNGTEFHUykgJChTUEVDSUFMX09DQU1MRkxBR1MpCi0KLWlmZGVmIG1ha2VfZGVwcwotICAtaW5jbHVkZSAkKE1BS0VfREVQUykKLSAgUFJFX1RBUkdFVFMgOj0KLWVuZGlmCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBVU0VSIFJVTEVTCi0KLSMgQ2FsbCAiT0NhbWxNYWtlZmlsZSBRVUlFVD0iIHRvIGdldCByaWQgb2YgYWxsIG9mIHRoZSBAJ3MuCi1RVUlFVD1ACi0KLSMgZ2VuZXJhdGVzIGJ5dGUtY29kZSAoZGVmYXVsdCkKLWJ5dGUtY29kZToJCSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSAkKEJDUkVTVUxUKSBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoQkNSRVNVTFQpIiBtYWtlX2RlcHM9eWVzCi1iYzoJYnl0ZS1jb2RlCi0KLWJ5dGUtY29kZS1ub2xpbms6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBub2xpbmsgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgbWFrZV9kZXBzPXllcwotYmNubDoJYnl0ZS1jb2RlLW5vbGluawotCi10b3A6CQkJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpICQoVE9QUkVTVUxUKSBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoQkNSRVNVTFQpIiBtYWtlX2RlcHM9eWVzCi0KLSMgZ2VuZXJhdGVzIG5hdGl2ZS1jb2RlCi0KLW5hdGl2ZS1jb2RlOgkJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpICQoTkNSRVNVTFQpIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIFwKLQkJCQlSRUFMX09DQU1MQz0iJChPQ0FNTE9QVCkiIFwKLQkJCQltYWtlX2RlcHM9eWVzCi1uYzoJbmF0aXZlLWNvZGUKLQotbmF0aXZlLWNvZGUtbm9saW5rOgkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgbm9saW5rIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIFwKLQkJCQlSRUFMX09DQU1MQz0iJChPQ0FNTE9QVCkiIFwKLQkJCQltYWtlX2RlcHM9eWVzCi1uY25sOgluYXRpdmUtY29kZS1ub2xpbmsKLQotIyBnZW5lcmF0ZXMgYnl0ZS1jb2RlIGxpYnJhcmllcwotYnl0ZS1jb2RlLWxpYnJhcnk6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBcCi0JCQkJJChSRVNfQ0xJQikgJChCQ1JFU1VMVCkuY21hIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIFwKLQkJCQlDUkVBVEVfTElCPXllcyBcCi0JCQkJbWFrZV9kZXBzPXllcwotYmNsOglieXRlLWNvZGUtbGlicmFyeQotCi0jIGdlbmVyYXRlcyBuYXRpdmUtY29kZSBsaWJyYXJpZXMKLW5hdGl2ZS1jb2RlLWxpYnJhcnk6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBcCi0JCQkJJChSRVNfQ0xJQikgJChOQ1JFU1VMVCkuY214YSBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoTkNSRVNVTFQpIiBcCi0JCQkJUkVBTF9PQ0FNTEM9IiQoT0NBTUxPUFQpIiBcCi0JCQkJQ1JFQVRFX0xJQj15ZXMgXAotCQkJCW1ha2VfZGVwcz15ZXMKLW5jbDoJbmF0aXZlLWNvZGUtbGlicmFyeQotCi1pZmRlZiBXSU4zMgotIyBnZW5lcmF0ZXMgYnl0ZS1jb2RlIGRsbAotYnl0ZS1jb2RlLWRsbDoJCSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBcCi0JCQkJJChSRVNfQ0xJQikgJChCQ1JFU1VMVCkuZGxsIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIFwKLQkJCQltYWtlX2RlcHM9eWVzCi1iY2Q6CWJ5dGUtY29kZS1kbGwKLQotIyBnZW5lcmF0ZXMgbmF0aXZlLWNvZGUgZGxsCi1uYXRpdmUtY29kZS1kbGw6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBcCi0JCQkJJChSRVNfQ0xJQikgJChOQ1JFU1VMVCkuZGxsIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIFwKLQkJCQlSRUFMX09DQU1MQz0iJChPQ0FNTE9QVCkiIFwKLQkJCQltYWtlX2RlcHM9eWVzCi1uY2Q6CW5hdGl2ZS1jb2RlLWRsbAotZW5kaWYKLQotIyBnZW5lcmF0ZXMgYnl0ZS1jb2RlIHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uCi1kZWJ1Zy1jb2RlOgkJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpICQoQkNSRVNVTFQpIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMgXAotCQkJCU9DQU1MRkxBR1M9Ii1nICQoT0NBTUxGTEFHUykiIFwKLQkJCQlPQ0FNTExERkxBR1M9Ii1nICQoT0NBTUxMREZMQUdTKSIKLWRjOglkZWJ1Zy1jb2RlCi0KLWRlYnVnLWNvZGUtbm9saW5rOgkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgbm9saW5rIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMgXAotCQkJCU9DQU1MRkxBR1M9Ii1nICQoT0NBTUxGTEFHUykiIFwKLQkJCQlPQ0FNTExERkxBR1M9Ii1nICQoT0NBTUxMREZMQUdTKSIKLWRjbmw6CWRlYnVnLWNvZGUtbm9saW5rCi0KLSMgZ2VuZXJhdGVzIGJ5dGUtY29kZSB3aXRoIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAobmF0aXZlIGNvZGUpCi1kZWJ1Zy1uYXRpdmUtY29kZToJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpICQoTkNSRVNVTFQpIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCU9DQU1MRkxBR1M9Ii1nICQoT0NBTUxGTEFHUykiIFwKLQkJCQlPQ0FNTExERkxBR1M9Ii1nICQoT0NBTUxMREZMQUdTKSIKLWRuYzoJZGVidWctbmF0aXZlLWNvZGUKLQotZGVidWctbmF0aXZlLWNvZGUtbm9saW5rOgkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgbm9saW5rIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCU9DQU1MRkxBR1M9Ii1nICQoT0NBTUxGTEFHUykiIFwKLQkJCQlPQ0FNTExERkxBR1M9Ii1nICQoT0NBTUxMREZMQUdTKSIKLWRuY25sOglkZWJ1Zy1uYXRpdmUtY29kZS1ub2xpbmsKLQotIyBnZW5lcmF0ZXMgYnl0ZS1jb2RlIGxpYnJhcmllcyB3aXRoIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotZGVidWctY29kZS1saWJyYXJ5OgkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgXAotCQkJCSQoUkVTX0NMSUIpICQoQkNSRVNVTFQpLmNtYSBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoQkNSRVNVTFQpIiBtYWtlX2RlcHM9eWVzIFwKLQkJCQlDUkVBVEVfTElCPXllcyBcCi0JCQkJT0NBTUxGTEFHUz0iLWcgJChPQ0FNTEZMQUdTKSIgXAotCQkJCU9DQU1MTERGTEFHUz0iLWcgJChPQ0FNTExERkxBR1MpIgotZGNsOglkZWJ1Zy1jb2RlLWxpYnJhcnkKLQotIyBnZW5lcmF0ZXMgYnl0ZS1jb2RlIGxpYnJhcmllcyB3aXRoIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAobmF0aXZlIGNvZGUpCi1kZWJ1Zy1uYXRpdmUtY29kZS1saWJyYXJ5OgkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgXAotCQkJCSQoUkVTX0NMSUIpICQoTkNSRVNVTFQpLmNtYSBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoTkNSRVNVTFQpIiBtYWtlX2RlcHM9eWVzIFwKLQkJCQlSRUFMX09DQU1MQz0iJChPQ0FNTE9QVCkiIFwKLQkJCQlDUkVBVEVfTElCPXllcyBcCi0JCQkJT0NBTUxGTEFHUz0iLWcgJChPQ0FNTEZMQUdTKSIgXAotCQkJCU9DQU1MTERGTEFHUz0iLWcgJChPQ0FNTExERkxBR1MpIgotZG5jbDoJZGVidWctbmF0aXZlLWNvZGUtbGlicmFyeQotCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgZm9yIHByb2ZpbGluZwotcHJvZmlsaW5nLWJ5dGUtY29kZToJCSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSAkKEJDUkVTVUxUKSBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoQkNSRVNVTFQpIiBQUk9GSUxJTkc9InkiIFwKLQkJCQltYWtlX2RlcHM9eWVzCi1wYmM6CXByb2ZpbGluZy1ieXRlLWNvZGUKLQotIyBnZW5lcmF0ZXMgbmF0aXZlLWNvZGUKLQotcHJvZmlsaW5nLW5hdGl2ZS1jb2RlOgkJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpICQoTkNSRVNVTFQpIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIFwKLQkJCQlSRUFMX09DQU1MQz0iJChPQ0FNTE9QVCkiIFwKLQkJCQlQUk9GSUxJTkc9InkiIFwKLQkJCQltYWtlX2RlcHM9eWVzCi1wbmM6CXByb2ZpbGluZy1uYXRpdmUtY29kZQotCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgbGlicmFyaWVzCi1wcm9maWxpbmctYnl0ZS1jb2RlLWxpYnJhcnk6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBcCi0JCQkJJChSRVNfQ0xJQikgJChCQ1JFU1VMVCkuY21hIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIFBST0ZJTElORz0ieSIgXAotCQkJCUNSRUFURV9MSUI9eWVzIFwKLQkJCQltYWtlX2RlcHM9eWVzCi1wYmNsOglwcm9maWxpbmctYnl0ZS1jb2RlLWxpYnJhcnkKLQotIyBnZW5lcmF0ZXMgbmF0aXZlLWNvZGUgbGlicmFyaWVzCi1wcm9maWxpbmctbmF0aXZlLWNvZGUtbGlicmFyeToJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKE5DUkVTVUxUKS5jbXhhIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIFBST0ZJTElORz0ieSIgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCUNSRUFURV9MSUI9eWVzIFwKLQkJCQltYWtlX2RlcHM9eWVzCi1wbmNsOglwcm9maWxpbmctbmF0aXZlLWNvZGUtbGlicmFyeQotCi0jIHBhY2tzIGJ5dGUtY29kZSBvYmplY3RzCi1wYWNrLWJ5dGUtY29kZToJCQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChCQ1JFU1VMVCkuY21vIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIFwKLQkJCQlQQUNLX0xJQj15ZXMgbWFrZV9kZXBzPXllcwotcGFiYzoJcGFjay1ieXRlLWNvZGUKLQotIyBwYWNrcyBuYXRpdmUtY29kZSBvYmplY3RzCi1wYWNrLW5hdGl2ZS1jb2RlOgkJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKE5DUkVTVUxUKS5jbXggJChOQ1JFU1VMVCkubyBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoTkNSRVNVTFQpIiBcCi0JCQkJUkVBTF9PQ0FNTEM9IiQoT0NBTUxPUFQpIiBcCi0JCQkJUEFDS19MSUI9eWVzIG1ha2VfZGVwcz15ZXMKLXBhbmM6CXBhY2stbmF0aXZlLWNvZGUKLQotIyBnZW5lcmF0ZXMgSFRNTC1kb2N1bWVudGF0aW9uCi1odGRvYzoJJChET0NfRElSKS8kKFJFU1VMVCkvaHRtbC9pbmRleC5odG1sCi0KLSMgZ2VuZXJhdGVzIExhdGV4LWRvY3VtZW50YXRpb24KLWxhZG9jOgkkKERPQ19ESVIpLyQoUkVTVUxUKS9sYXRleC9kb2MudGV4Ci0KLSMgZ2VuZXJhdGVzIFBvc3RTY3JpcHQtZG9jdW1lbnRhdGlvbgotcHNkb2M6CSQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4L2RvYy5wcwotCi0jIGdlbmVyYXRlcyBQREYtZG9jdW1lbnRhdGlvbgotcGRmZG9jOgkkKERPQ19ESVIpLyQoUkVTVUxUKS9sYXRleC9kb2MucGRmCi0KLSMgZ2VuZXJhdGVzIGFsbCBzdXBwb3J0ZWQgZm9ybXMgb2YgZG9jdW1lbnRhdGlvbgotZG9jOiBodGRvYyBsYWRvYyBwc2RvYyBwZGZkb2MKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIExPVyBMRVZFTCBSVUxFUwotCi0kKFJFQUxfUkVTVUxUKToJCSQoUkVBTF9JTVBMX0lOVEYpICQoT0JKX0xJTkspICQoRVhUUkFERVBTKSAkKFJFU1VMVERFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSBcCi0JCQkJJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAkKE9DQU1MX0ZJTkRfTElOS1BLRykgXAotCQkJCSQoQUxMX0xERkxBR1MpICQoT0JKU19MSUJTKSAtbyAkQCQoRVhFKSBcCi0JCQkJJChSRUFMX0lNUEwpCi0KLW5vbGluazoJCQkkKFJFQUxfSU1QTF9JTlRGKSAkKE9CSl9MSU5LKQotCi1pZmRlZiBXSU4zMgotJChSRUFMX1JFU1VMVCkuZGxsOgkkKFJFQUxfSU1QTF9JTlRGKSAkKE9CSl9MSU5LKQotCQkJJChDQU1MSURMRExMKSAkKENBTUxJRExETExGTEFHUykgJChPQkpfTElOSykgJChDTElCUykgXAotCQkJCS1vICRAICQoUkVBTF9JTVBMKQotZW5kaWYKLQotJSQoVE9QU1VGRklYKToJCSQoUkVBTF9JTVBMX0lOVEYpICQoT0JKX0xJTkspICQoRVhUUkFERVBTKQotCQkJJChSRUFMX09DQU1MRklORCkgJChPQ0FNTE1LVE9QKSBcCi0JCQkJJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAkKE9DQU1MX0ZJTkRfTElOS1BLRykgXAotCQkJCSQoQUxMX0xERkxBR1MpICQoT0JKU19MSUJTKSAtbyAkQCQoRVhFKSBcCi0JCQkJJChSRUFMX0lNUEwpCi0KLS5TVUZGSVhFUzoJCS5tbGkgLm1sIC5jbWkgLmNtbyAuY214IC5jbWEgLmNteGEgLiQoRVhUX09CSikgXAotICAgICAgICAgICAgICAgICAgICAgICAgLm1seSAuZGkgLmQgLiQoRVhUX0xJQikgLmlkbCAlLm94cmlkbCAuYyAubSAuJChFWFRfQ1hYKSAuaCAuc28gXAotICAgICAgICAgICAgICAgICAgICAgICAgLnJlcCAuem9nIC5nbGFkZQotCi1pZm5kZWYgU1RBVElDCi1pZmRlZiBNSU5HVwotJChETExTT05BTUUpOgkJJChPQkpfTElOSykKLQkJCSQoQ0MpICQoQ0ZMQUdTKSAkKENGTEFHU19XSU4zMikgJChPQkpfTElOSykgLXNoYXJlZCAtbyAkQCBcCi0JCQktV2wsLS13aG9sZS1hcmNoaXZlICQod2lsZGNhcmQgJChmb3JlYWNoIGRpciwkKExJQkRJUlMpLCQoQ0xJQlM6JT0kKGRpcikvbGliJS5hKSkpIFwKLQkJCSAkKE9DQU1MTElCUEFUSCkvb2NhbWxydW4uYSBcCi0JCQktV2wsLS1leHBvcnQtYWxsLXN5bWJvbHMgXAotCQkJLVdsLC0tbm8td2hvbGUtYXJjaGl2ZQotZWxzZQotaWZkZWYgTVNWQwotJChETExTT05BTUUpOgkJJChPQkpfTElOSykKLQkJCWxpbmsgL05PTE9HTyAvRExMIC9PVVQ6JEAgJChPQkpfTElOSykgXAotCQkJICQod2lsZGNhcmQgJChmb3JlYWNoIGRpciwkKExJQkRJUlMpLCQoQ0xJQlM6JT0kKGRpcikvJS5saWIpKSkgXAotCQkJICQoT0NBTUxMSUJQQVRIKS9vY2FtbHJ1bi5saWIKLQotZWxzZQotJChETExTT05BTUUpOgkJJChPQkpfTElOSykKLQkJCSQoT0NBTUxNS0xJQikgJChJTkNGTEFHUykgJChDTElCRkxBR1MpIFwKLQkJCQktbyAkKENMSUJfQkFTRSkgJChPQkpfTElOSykgJChDTElCUzolPS1sJSkgJChDRlJBTUVXT1JLUzolPS1mcmFtZXdvcmsgJSkgXAotCQkJCSQoT0NBTUxNS0xJQl9GTEFHUykKLWVuZGlmCi1lbmRpZgotZW5kaWYKLQotaWZuZGVmIExJQl9QQUNLX05BTUUKLSQoUkVTVUxUKS5jbWE6CQkkKFJFQUxfSU1QTF9JTlRGKSAkKE1BS0VETEwpICQoRVhUUkFERVBTKSAkKFJFU1VMVERFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSAtYSAkKEFMTF9MREZMQUdTKSAkKE9CSlNfTElCUykgLW8gJEAgJChSRUFMX0lNUEwpCi0KLSQoUkVTVUxUKS5jbXhhICQoUkVTVUxUKS4kKEVYVF9MSUIpOgkkKFJFQUxfSU1QTF9JTlRGKSAkKEVYVFJBREVQUykgJChSRVNVTFRERVBTKQotCQkJJChSRUFMX09DQU1MRklORCkgJChPQ0FNTE9QVCkgLWEgJChBTExfTERGTEFHUykgJChPQkpTX0xJQlMpIC1vICRAICQoUkVBTF9JTVBMKQotZWxzZQotaWZkZWYgQllURV9PQ0FNTAotJChMSUJfUEFDS19OQU1FKS5jbWkgJChMSUJfUEFDS19OQU1FKS5jbW86ICQoUkVBTF9JTVBMX0lOVEYpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSAtcGFjayAtbyAkKExJQl9QQUNLX05BTUUpLmNtbyAkKE9DQU1MTERGTEFHUykgJChSRUFMX0lNUEwpCi1lbHNlCi0kKExJQl9QQUNLX05BTUUpLmNtaSAkKExJQl9QQUNLX05BTUUpLmNteDogJChSRUFMX0lNUExfSU5URikKLQkJCSQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxPUFQpIC1wYWNrIC1vICQoTElCX1BBQ0tfTkFNRSkuY214ICAkKE9DQU1MTERGTEFHUykgJChSRUFMX0lNUEwpCi1lbmRpZgotCi0kKFJFU1VMVCkuY21hOgkJJChMSUJfUEFDS19OQU1FKS5jbWkgJChMSUJfUEFDS19OQU1FKS5jbW8gJChNQUtFRExMKSAkKEVYVFJBREVQUykgJChSRVNVTFRERVBTKQotCQkJJChSRUFMX09DQU1MRklORCkgJChSRUFMX09DQU1MQykgLWEgJChBTExfTERGTEFHUykgJChPQkpTX0xJQlMpIC1vICRAICQoTElCX1BBQ0tfTkFNRSkuY21vCi0KLSQoUkVTVUxUKS5jbXhhICQoUkVTVUxUKS4kKEVYVF9MSUIpOgkkKExJQl9QQUNLX05BTUUpLmNtaSAkKExJQl9QQUNLX05BTUUpLmNteCAkKEVYVFJBREVQUykgJChSRVNVTFRERVBTKQotCQkJJChSRUFMX09DQU1MRklORCkgJChPQ0FNTE9QVCkgLWEgJChmaWx0ZXItb3V0IC1jdXN0b20sICQoQUxMX0xERkxBR1MpKSAkKE9CSlNfTElCUykgLW8gJEAgJChMSUJfUEFDS19OQU1FKS5jbXgKLWVuZGlmCi0KLSQoUkVTX0NMSUIpOiAJCSQoT0JKX0xJTkspCi1pZm5kZWYgTVNWQwotICBpZm5lcSAoJChzdHJpcCAkKE9CSl9MSU5LKSksKQotCQkgICAgICAkKEFSKSByY3MgJEAgJChPQkpfTElOSykKLSAgZW5kaWYKLWVsc2UKLSAgaWZuZXEgKCQoc3RyaXAgJChPQkpfTElOSykpLCkKLQkJCWxpYiAtbm9sb2dvIC1kZWJ1Z3R5cGU6Y3YgLW91dDokKFJFU19DTElCKSAkKE9CSl9MSU5LKQotICBlbmRpZgotZW5kaWYKLQotLm1saS5jbWk6ICQoRVhUUkFERVBTKQotCQkJJChRVUlFVClwcD1gc2VkIC1uIC1lICcvXiMvZCcgLWUgJ3MvKFwqcHAgXChbXipdKlwpIFwqKS9cMS9wO3EnICQ8YDsgXAotCQkJaWYgWyAteiAiJCRwcCIgXTsgdGhlbiBcCi0JCQkgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChJTlRGX09DQU1MQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSBcCi0JCQkJLWMgJChUSFJFQURfRkxBRykgJChBTk5PVF9GTEFHKSBcCi0JCQkJJChPQ0FNTEZMQUdTKSAkKElOQ0ZMQUdTKSAkPDsgXAotCQkJICAkKFJFQUxfT0NBTUxGSU5EKSAkKElOVEZfT0NBTUxDKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIFwKLQkJCQktYyAkKFRIUkVBRF9GTEFHKSAkKEFOTk9UX0ZMQUcpIFwKLQkJCQkkKE9DQU1MRkxBR1MpICQoSU5DRkxBR1MpICQ8OyBcCi0JCQllbHNlIFwKLQkJCSAgICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoSU5URl9PQ0FNTEMpICQoT0NBTUxfRklORF9QQUNLQUdFUykgXAotCQkJCS1jIC1wcCBcIiQkcHAgJChQUEZMQUdTKVwiICQoVEhSRUFEX0ZMQUcpICQoQU5OT1RfRkxBRykgXAotCQkJCSQoT0NBTUxGTEFHUykgJChJTkNGTEFHUykgJDw7IFwKLQkJCSAgICAkKFJFQUxfT0NBTUxGSU5EKSAkKElOVEZfT0NBTUxDKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIFwKLQkJCQktYyAtcHAgIiQkcHAgJChQUEZMQUdTKSIgJChUSFJFQURfRkxBRykgJChBTk5PVF9GTEFHKSBcCi0JCQkJJChPQ0FNTEZMQUdTKSAkKElOQ0ZMQUdTKSAkPDsgXAotCQkJZmkKLQotLm1sLmNtaSAubWwuJChFWFRfT0JKKSAubWwuY214IC5tbC5jbW86ICQoRVhUUkFERVBTKQotCQkJJChRVUlFVClwcD1gc2VkIC1uIC1lICcvXiMvZCcgLWUgJ3MvKFwqcHAgXChbXipdKlwpIFwqKS9cMS9wO3EnICQ8YDsgXAotCQkJaWYgWyAteiAiJCRwcCIgXTsgdGhlbiBcCi0JCQkgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChSRUFMX09DQU1MQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSBcCi0JCQkJLWMgJChBTExfT0NBTUxDRkxBR1MpICQ8OyBcCi0JCQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoUkVBTF9PQ0FNTEMpICQoT0NBTUxfRklORF9QQUNLQUdFUykgXAotCQkJCS1jICQoQUxMX09DQU1MQ0ZMQUdTKSAkPDsgXAotCQkJZWxzZSBcCi0JCQkgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChSRUFMX09DQU1MQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSBcCi0JCQkJLWMgLXBwIFwiJCRwcCAkKFBQRkxBR1MpXCIgJChBTExfT0NBTUxDRkxBR1MpICQ8OyBcCi0JCQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoUkVBTF9PQ0FNTEMpICQoT0NBTUxfRklORF9QQUNLQUdFUykgXAotCQkJCS1jIC1wcCAiJCRwcCAkKFBQRkxBR1MpIiAkKEFMTF9PQ0FNTENGTEFHUykgJDw7IFwKLQkJCWZpCi0KLWlmZGVmIFBBQ0tfTElCCi0kKFJFQUxfUkVTVUxUKS5jbW8gJChSRUFMX1JFU1VMVCkuY214ICQoUkVBTF9SRVNVTFQpLm86ICQoUkVBTF9JTVBMX0lOVEYpICQoT0JKX0xJTkspICQoRVhUUkFERVBTKQotCQkJJChSRUFMX09DQU1MRklORCkgJChSRUFMX09DQU1MQykgLXBhY2sgJChBTExfTERGTEFHUykgXAotCQkJCSQoT0JKU19MSUJTKSAtbyAkQCAkKFJFQUxfSU1QTCkKLWVuZGlmCi0KLS5QUkVDSU9VUzoJCSUubWwKLSUubWw6CQkJJS5tbGwKLQkJCSQoT0NBTUxMRVgpICQoTEZMQUdTKSAkPAotCi0uUFJFQ0lPVVM6ICAgICAgICAgICAgICAlLm1sICUubWxpCi0lLm1sICUubWxpOiAgICAgICAgICAgICAlLm1seQotCQkJJChPQ0FNTFlBQ0MpICQoWUZMQUdTKSAkPAotCQkJJChRVUlFVClwcD1gc2VkIC1uIC1lICdzLy4qKFwqcHAgXChbXipdKlwpIFwqKS4qL1wxL3A7cScgJDxgOyBcCi0JCQlpZiBbICEgLXogIiQkcHAiIF07IHRoZW4gXAotCQkJICBtdiAkKi5tbCAkKi5tbC50ZW1wb3Jhcnk7IFwKLQkJCSAgZWNobyAiKCpwcCAkJHBwICQoUFBGTEFHUykqKSIgPiAkKi5tbDsgXAotCQkJICBjYXQgJCoubWwudGVtcG9yYXJ5ID4+ICQqLm1sOyBcCi0JCQkgIHJtICQqLm1sLnRlbXBvcmFyeTsgXAotCQkJICBtdiAkKi5tbGkgJCoubWxpLnRlbXBvcmFyeTsgXAotCQkJICBlY2hvICIoKnBwICQkcHAgJChQUEZMQUdTKSopIiA+ICQqLm1saTsgXAotCQkJICBjYXQgJCoubWxpLnRlbXBvcmFyeSA+PiAkKi5tbGk7IFwKLQkJCSAgcm0gJCoubWxpLnRlbXBvcmFyeTsgXAotCQkJZmkKLQotCi0uUFJFQ0lPVVM6CQklLm1sCi0lLm1sOgkJCSUucmVwCi0JCQkkKENBTUVMRU9OX1JFUE9SVCkgJChDQU1FTEVPTl9SRVBPUlRfRkxBR1MpIC1nZW4gJDwKLQotLlBSRUNJT1VTOgkJJS5tbAotJS5tbDoJCQklLnpvZwotCQkJJChDQU1FTEVPTl9aT0dHWSkgICQoQ0FNRUxFT05fWk9HR1lfRkxBR1MpIC1pbXBsICQ8ID4gJEAKLQotLlBSRUNJT1VTOgkJJS5tbAotJS5tbDoJCQklLmdsYWRlCi0JCQkkKE9DQU1MX0dMQURFQ0MpICAkKE9DQU1MX0dMQURFQ0NfRkxBR1MpICQ8ID4gJEAKLQotLlBSRUNJT1VTOgkJJS5tbCAlLm1saQotJS5tbCAlLm1saToJCSUub3hyaWRsCi0JCQkkKE9YUklETCkgJDwKLQotLlBSRUNJT1VTOgkJJS5tbCAlLm1saSAlX3N0dWJzLmMgJS5oCi0lLm1sICUubWxpICVfc3R1YnMuYyAlLmg6CQklLmlkbAotCQkJJChDQU1MSURMKSAkKE1BWUJFX0lETF9IRUFERVIpICQoSURMRkxBR1MpIFwKLQkJCQkkKENBTUxJRExGTEFHUykgJDwKLQkJCSQoUVVJRVQpaWYgWyAkKE5PSURMSEVBREVSKSBdOyB0aGVuIHRvdWNoICQqLmg7IGZpCi0KLS5jLiQoRVhUX09CSik6Ci0JCQkkKE9DQU1MQykgLWMgLWNjICIkKENDKSIgLWNjb3B0ICIkKENGTEFHUykgXAotCQkJCSQoQ1BQRkxBR1MpICQoQ1BQRkxBR1NfV0lOMzIpIFwKLQkJCQkkKENGTEFHU19XSU4zMikgJChDSU5DRkxBR1MpICQoQ0ZMQUdfTykkQCAiICQ8Ci0KLS5tLiQoRVhUX09CSik6Ci0JCQkkKENDKSAtYyAkKENGTEFHUykgJChDSU5DRkxBR1MpICQoQ1BQRkxBR1MpIFwKLQkJCQktSSckKE9DQU1MTElCUEFUSCknIFwKLQkJCQkkPCAkKENGTEFHX08pJEAKLQotLiQoRVhUX0NYWCkuJChFWFRfT0JKKToKLQkJCSQoQ1hYKSAtYyAkKENYWEZMQUdTKSAkKENJTkNGTEFHUykgJChDUFBGTEFHUykgXAotCQkJCS1JJyQoT0NBTUxMSUJQQVRIKScgXAotCQkJCSQ8ICQoQ0ZMQUdfTykkQAotCi0kKE1MREVQRElSKS8lLmQ6CSUubWwKLQkJCSQoUVVJRVQpaWYgWyAhIC1kICQoQEQpIF07IHRoZW4gbWtkaXIgLXAgJChARCk7IGZpCi0JCQkkKFFVSUVUKXBwPWBzZWQgLW4gLWUgJy9eIy9kJyAtZSAncy8oXCpwcCBcKFteKl0qXCkgXCopL1wxL3A7cScgJDxgOyBcCi0JCQlpZiBbIC16ICIkJHBwIiBdOyB0aGVuIFwKLQkJCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MREVQKSAkKE9DQU1MX0RFUF9QQUNLQUdFUykgXAotCQkJCSQoRElOQ0ZMQUdTKSAkPCBcPiAkQDsgXAotCQkJICAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MREVQKSAkKE9DQU1MX0RFUF9QQUNLQUdFUykgXAotCQkJCSQoRElOQ0ZMQUdTKSAkPCA+ICRAOyBcCi0JCQllbHNlIFwKLQkJCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MREVQKSAkKE9DQU1MX0RFUF9QQUNLQUdFUykgXAotCQkJCS1wcCBcIiQkcHAgJChQUEZMQUdTKVwiICQoRElOQ0ZMQUdTKSAkPCBcPiAkQDsgXAotCQkJICAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MREVQKSAkKE9DQU1MX0RFUF9QQUNLQUdFUykgXAotCQkJCS1wcCAiJCRwcCAkKFBQRkxBR1MpIiAkKERJTkNGTEFHUykgJDwgPiAkQDsgXAotCQkJZmkKLQotJChCQ0RJRElSKS8lLmRpICQoTkNESURJUikvJS5kaToJJS5tbGkKLQkJCSQoUVVJRVQpaWYgWyAhIC1kICQoQEQpIF07IHRoZW4gbWtkaXIgLXAgJChARCk7IGZpCi0JCQkkKFFVSUVUKXBwPWBzZWQgLW4gLWUgJy9eIy9kJyAtZSAncy8oXCpwcCBcKFteKl0qXCkgXCopL1wxL3A7cScgJDxgOyBcCi0JCQlpZiBbIC16ICIkJHBwIiBdOyB0aGVuIFwKLQkJCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MREVQKSAkKERFUEZMQUdTKSAkKERJTkNGTEFHUykgJDwgXD4gJEA7IFwKLQkJCSAgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERFUCkgJChERVBGTEFHUykgJChESU5DRkxBR1MpICQ8ID4gJEA7IFwKLQkJCWVsc2UgXAotCQkJICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoREVQRkxBR1MpIFwKLQkJCSAgICAtcHAgXCIkJHBwICQoUFBGTEFHUylcIiAkKERJTkNGTEFHUykgJDwgXD4gJEA7IFwKLQkJCSAgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERFUCkgJChERVBGTEFHUykgXAotCQkJICAgIC1wcCAiJCRwcCAkKFBQRkxBR1MpIiAkKERJTkNGTEFHUykgJDwgPiAkQDsgXAotCQkJZmkKLQotJChET0NfRElSKS8kKFJFU1VMVCkvaHRtbDoKLQlta2RpciAtcCAkQAotCi0kKERPQ19ESVIpLyQoUkVTVUxUKS9odG1sL2luZGV4Lmh0bWw6ICQoRE9DX0RJUikvJChSRVNVTFQpL2h0bWwgJChET0NfRklMRVMpCi0Jcm0gLXJmICQ8LyoKLQkkKFFVSUVUKXBwPWBzZWQgLW4gLWUgJy9eIy9kJyAtZSAncy8oXCpwcCBcKFteKl0qXCkgXCopL1wxL3A7cScgJChGSVJTVF9ET0NfRklMRSlgOyBcCi0JaWYgWyAteiAiJCRwcCIgXTsgdGhlbiBcCi0JICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxET0MpICQoT0NBTUxfRklORF9QQUNLQUdFUykgLWh0bWwgLWQgJDwgJChPQ0FNTERPQ0ZMQUdTKSAkKElOQ0ZMQUdTKSAkKERPQ19GSUxFUyk7IFwKLQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxET0MpICQoT0NBTUxfRklORF9QQUNLQUdFUykgLWh0bWwgLWQgJDwgJChPQ0FNTERPQ0ZMQUdTKSAkKElOQ0ZMQUdTKSAkKERPQ19GSUxFUyk7IFwKLQllbHNlIFwKLQkgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtcHAgXCIkJHBwICQoUFBGTEFHUylcIiAtaHRtbCAtZCAkPCAkKE9DQU1MRE9DRkxBR1MpIFwKLQkgIAkkKElOQ0ZMQUdTKSAkKERPQ19GSUxFUyk7IFwKLQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxET0MpICQoT0NBTUxfRklORF9QQUNLQUdFUykgLXBwICIkJHBwICQoUFBGTEFHUykiIC1odG1sIC1kICQ8ICQoT0NBTUxET0NGTEFHUykgXAotCSAgCSQoSU5DRkxBR1MpICQoRE9DX0ZJTEVTKTsgXAotCWZpCi0KLSQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4OgotCW1rZGlyIC1wICRACi0KLSQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4L2RvYy50ZXg6ICQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4ICQoRE9DX0ZJTEVTKQotCXJtIC1yZiAkPC8qCi0JJChRVUlFVClwcD1gc2VkIC1uIC1lICcvXiMvZCcgLWUgJ3MvKFwqcHAgXChbXipdKlwpIFwqKS9cMS9wO3EnICQoRklSU1RfRE9DX0ZJTEUpYDsgXAotCWlmIFsgLXogIiQkcHAiIF07IHRoZW4gXAotCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MRE9DKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIC1sYXRleCAkKE9DQU1MRE9DRkxBR1MpICQoSU5DRkxBR1MpIFwKLQkgIAkkKERPQ19GSUxFUykgLW8gJEA7IFwKLQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxET0MpICQoT0NBTUxfRklORF9QQUNLQUdFUykgLWxhdGV4ICQoT0NBTUxET0NGTEFHUykgJChJTkNGTEFHUykgJChET0NfRklMRVMpIFwKLQkgIAktbyAkQDsgXAotCWVsc2UgXAotCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MRE9DKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIC1wcCBcIiQkcHAgJChQUEZMQUdTKVwiIC1sYXRleCAkKE9DQU1MRE9DRkxBR1MpIFwKLQkgIAkkKElOQ0ZMQUdTKSAkKERPQ19GSUxFUykgLW8gJEA7IFwKLQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxET0MpICQoT0NBTUxfRklORF9QQUNLQUdFUykgLXBwICIkJHBwICQoUFBGTEFHUykiIC1sYXRleCAkKE9DQU1MRE9DRkxBR1MpIFwKLQkgIAkkKElOQ0ZMQUdTKSAkKERPQ19GSUxFUykgLW8gJEA7IFwKLQlmaQotCi0kKERPQ19ESVIpLyQoUkVTVUxUKS9sYXRleC9kb2MucHM6ICQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4L2RvYy50ZXgKLQljZCAkKERPQ19ESVIpLyQoUkVTVUxUKS9sYXRleCAmJiBcCi0JICAkKExBVEVYKSBkb2MudGV4ICYmIFwKLQkgICQoTEFURVgpIGRvYy50ZXggJiYgXAotCSAgJChEVklQUykgJChEVklQU0ZMQUdTKSBkb2MuZHZpIC1vICQoQEYpCi0KLSQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4L2RvYy5wZGY6ICQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4L2RvYy5wcwotCWNkICQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4ICYmICQoUFMyUERGKSAkKDxGKQotCi1kZWZpbmUgbWFrZV9zdWJwcm9qCi0uUEhPTlk6Ci1zdWJwcm9qXyQoMSk6Ci0JJCQoZXZhbCAkJChjYWxsIFBST0pfJCgxKSkpCi0JJChRVUlFVClpZiBbICIkKFNVQlRBUkdFVCkiICE9ICJhbGwiIF07IHRoZW4gXAotCSAgJChNQUtFKSAtZiAkKE9DQU1MTUFLRUZJTEUpICQoU1VCVEFSR0VUKTsgXAotCWZpCi1lbmRlZgotCi0kKGZvcmVhY2ggc3VicHJvaiwkKFNVQlBST0pTKSwkKGV2YWwgJChjYWxsIG1ha2Vfc3VicHJvaiwkKHN1YnByb2opKSkpCi0KLS5QSE9OWToKLXN1YnByb2pzOiAkKFNVQlBST0pTOiU9c3VicHJval8lKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgKFVOKUlOU1RBTEwgUlVMRVMgRk9SIExJQlJBUklFUwotCi0uUEhPTlk6IGxpYmluc3RhbGwKLWxpYmluc3RhbGw6CWFsbAotCSQoUVVJRVQpcHJpbnRmICJcbkluc3RhbGxpbmcgbGlicmFyeSB3aXRoIG9jYW1sZmluZFxuIgotCSQoT0NBTUxGSU5EKSBpbnN0YWxsICQoT0NBTUxGSU5EX0lOU1RGTEFHUykgJChSRVNVTFQpIE1FVEEgJChMSUJJTlNUQUxMX0ZJTEVTKQotCSQoUVVJRVQpcHJpbnRmICJcbkluc3RhbGxhdGlvbiBzdWNjZXNzZnVsLlxuIgotCi0uUEhPTlk6IGxpYmluc3RhbGwtYnl0ZS1jb2RlCi1saWJpbnN0YWxsLWJ5dGUtY29kZToJYWxsCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGluZyBieXRlLWNvZGUgbGlicmFyeSB3aXRoIG9jYW1sZmluZFxuIgotCSQoT0NBTUxGSU5EKSBpbnN0YWxsICQoT0NBTUxGSU5EX0lOU1RGTEFHUykgJChSRVNVTFQpIE1FVEEgXAotCSAgJChmaWx0ZXItb3V0ICQoUkVTVUxUKS4kKEVYVF9MSUIpICQoUkVTVUxUKS5jbXhhLCAkKExJQklOU1RBTExfRklMRVMpKQotCSQoUVVJRVQpcHJpbnRmICJcbkluc3RhbGxhdGlvbiBzdWNjZXNzZnVsLlxuIgotCi0uUEhPTlk6IGxpYmluc3RhbGwtbmF0aXZlLWNvZGUKLWxpYmluc3RhbGwtbmF0aXZlLWNvZGU6CWFsbAotCSQoUVVJRVQpcHJpbnRmICJcbkluc3RhbGxpbmcgbmF0aXZlLWNvZGUgbGlicmFyeSB3aXRoIG9jYW1sZmluZFxuIgotCSQoT0NBTUxGSU5EKSBpbnN0YWxsICQoT0NBTUxGSU5EX0lOU1RGTEFHUykgJChSRVNVTFQpIE1FVEEgXAotCSAgJChmaWx0ZXItb3V0ICQoRExMU09OQU1FKSAkKFJFU1VMVCkuY21hLCAkKExJQklOU1RBTExfRklMRVMpKQotCSQoUVVJRVQpcHJpbnRmICJcbkluc3RhbGxhdGlvbiBzdWNjZXNzZnVsLlxuIgotCi0uUEhPTlk6IGxpYnVuaW5zdGFsbAotbGlidW5pbnN0YWxsOgotCSQoUVVJRVQpcHJpbnRmICJcblVuaW5zdGFsbGluZyBsaWJyYXJ5IHdpdGggb2NhbWxmaW5kXG4iCi0JJChPQ0FNTEZJTkQpIHJlbW92ZSAkKE9DQU1MRklORF9JTlNURkxBR1MpICQoUkVTVUxUKQotCSQoUVVJRVQpcHJpbnRmICJcblVuaW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWwuXG4iCi0KLS5QSE9OWTogcmF3aW5zdGFsbAotcmF3aW5zdGFsbDoJYWxsCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGluZyBsaWJyYXJ5IHRvOiAkKE9DQU1MX0xJQl9JTlNUQUxMKVxuIgotCS1pbnN0YWxsIC1kICQoT0NBTUxfTElCX0lOU1RBTEwpCi0JZm9yIGkgaW4gJChMSUJJTlNUQUxMX0ZJTEVTKTsgZG8gXAotCSAgaWYgWyAtZiAkJGkgXTsgdGhlbiBcCi0JICAgIGluc3RhbGwgLWMgLW0gMDY0NCAkJGkgJChPQ0FNTF9MSUJfSU5TVEFMTCk7IFwKLQkgIGZpOyBcCi0JZG9uZQotCSQoUVVJRVQpcHJpbnRmICJcbkluc3RhbGxhdGlvbiBzdWNjZXNzZnVsLlxuIgotCi0uUEhPTlk6IHJhd3VuaW5zdGFsbAotcmF3dW5pbnN0YWxsOgotCSQoUVVJRVQpcHJpbnRmICJcblVuaW5zdGFsbGluZyBsaWJyYXJ5IGZyb206ICQoT0NBTUxfTElCX0lOU1RBTEwpXG4iCi0JY2QgJChPQ0FNTF9MSUJfSU5TVEFMTCkgJiYgcm0gJChub3RkaXIgJChMSUJJTlNUQUxMX0ZJTEVTKSkKLQkkKFFVSUVUKXByaW50ZiAiXG5Vbmluc3RhbGxhdGlvbiBzdWNjZXNzZnVsLlxuIgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTUFJTlRFTkFOQ0UgUlVMRVMKLQotLlBIT05ZOgljbGVhbgotY2xlYW46OgotCXJtIC1mICQoVEFSR0VUUykgJChUUkFTSCkKLQlybSAtcmYgJChCQ0RJRElSKSAkKE5DRElESVIpICQoTUxERVBESVIpCi0KLS5QSE9OWToJY2xlYW51cAotY2xlYW51cDo6Ci0Jcm0gLWYgJChOT05FWEVDUykgJChUUkFTSCkKLQlybSAtcmYgJChCQ0RJRElSKSAkKE5DRElESVIpICQoTUxERVBESVIpCi0KLS5QSE9OWTogY2xlYW4tZG9jCi1jbGVhbi1kb2M6OgotCXJtIC1yZiAkKERPQ19ESVIpLyQoUkVTVUxUKQotCi0uUEhPTlk6IGNsZWFuLWFsbAotY2xlYW4tYWxsOjogY2xlYW4gY2xlYW4tZG9jCi0KLS5QSE9OWTogbm9iYWNrdXAKLW5vYmFja3VwOgotCXJtIC1mICouYmFrICp+ICouZHVwCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvUkVBRE1FLU9DYW1sTWFrZWZpbGUgYi9saWIvb2NhbWwvUkVBRE1FLU9DYW1sTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOTdjNjQuLjAwMDAwMDAKLS0tIGEvbGliL29jYW1sL1JFQURNRS1PQ2FtbE1ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNjQzICswLDAgQEAKLU5PVEUgKGJyeWFuZHV4YnVyeSk6IE9DYW1sTWFrZWZpbGUgaXMgc2FmZSB0byBpbmNsdWRlIGluIHRoZSBwcm9qZWN0IGFmdGVyCi1odHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0xFR0FMLTU4LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgRGlzdHJpYnV0aW9uIG9mICJvY2FtbF9tYWtlIgotICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgLSAyMDA2ICBNYXJrdXMgTW90dGwgLSBmcmVlIHRvIGNvcHkgYW5kIG1vZGlmeSEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRSBBVCBZT1VSIE9XTiBSSVNLIQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRVJFUVVJU0lURVMKLQotICAgICAgICAgICAgICoqKiBZT1UgV0lMTCBORUVEIEdOVS1NQUtFIFZFUlNJT04gPjMuODAgKioqCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgIENvbnRlbnRzIG9mIHRoaXMgZGlzdHJpYnV0aW9uCi0KLUNoYW5nZXMgICAgICAgIC0gZ3Vlc3Mgd2hhdD8gOy0pCi0KLU9DYW1sTWFrZWZpbGUgIC0gTWFrZWZpbGUgZm9yIGVhc3kgaGFuZGxpbmcgb2YgY29tcGlsYXRpb24gb2Ygbm90IHNvIGVhc3kKLSAgICAgICAgICAgICAgICAgT0NhbWwtcHJvamVjdHMuICBJdCBnZW5lcmF0ZXMgZGVwZW5kZW5jaWVzIG9mIE9DYW1sLWZpbGVzCi0gICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHksIGlzIGFibGUgdG8gaGFuZGxlICJvY2FtbGxleCItLAotICAgICAgICAgICAgICAgICAib2NhbWx5YWNjIi0sIElETC0gYW5kIEMtZmlsZXMsIGtub3dzIGhvdyB0byBydW4KLSAgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc29ycyBhbmQgZ2VuZXJhdGVzIG5hdGl2ZS0gb3IgYnl0ZS1jb2RlLCBhcwotICAgICAgICAgICAgICAgICBleGVjdXRhYmxlIG9yIGFzIGxpYnJhcnkgLSB3aXRoIHRocmVhZC1zdXBwb3J0IGlmIHlvdQotICAgICAgICAgICAgICAgICB3YW50ISBQcm9maWxpbmcgYW5kIGRlYnVnZ2luZyBzdXBwb3J0IGNhbiBiZSBhZGRlZCBvbgotICAgICAgICAgICAgICAgICB0aGUgZmx5ISAgVGhlcmUgaXMgYWxzbyBzdXBwb3J0IGZvciBpbnN0YWxsaW5nIGxpYnJhcmllcy4KLSAgICAgICAgICAgICAgICAgQWgsIHllcywgYW5kIHlvdSBjYW4gYWxzbyBjcmVhdGUgdG9wbGV2ZWxzIGZyb20gYW55Ci0gICAgICAgICAgICAgICAgIHNvdXJjZXM6IHRoaXMgYWxsb3dzIHlvdSBpbW1lZGlhdGUgaW50ZXJhY3RpdmUgdGVzdGluZy4KLSAgICAgICAgICAgICAgICAgQXV0b21hdGljIGdlbmVyYXRpb24gb2YgZG9jdW1lbnRhdGlvbiBpcyBlYXN5IGR1ZSB0bwotICAgICAgICAgICAgICAgICBpbnRlZ3JhdGlvbiBvZiBzdXBwb3J0IGZvciBPQ2FtbGRvYy4KLQotUkVBRE1FICAgICAgICAgLSB0aGlzIGZpbGUKLQotY2FsYy8gICAgICAgICAgLSBEaXJlY3RvcnkgY29udGFpbmluZyBhIHF1aXRlIGZ1bGx5LWZlYXR1cmVkIGV4YW1wbGUKLSAgICAgICAgICAgICAgICAgb2Ygd2hhdCAiT0NhbWxNYWtlZmlsZSIgY2FuIGRvIGZvciB5b3UuIFRoaXMgZXhhbXBsZQotICAgICAgICAgICAgICAgICBtYWtlcyB1c2Ugb2YgIm9jYW1sbGV4IiwgIm9jYW1seWFjYyIsIElETCArIEMgYW5kCi0gICAgICAgICAgICAgICAgIHRocmVhZHMuCi0KLWNhbWxwNC8gICAgICAgIC0gVGhpcyBzaW1wbGUgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGF1dG9tYXRpY2FsbHkKLSAgICAgICAgICAgICAgICAgcHJlcHJvY2VzcyBmaWxlcyB3aXRoIHRoZSBjYW1scDQtcHJlcHJvY2Vzc29yLgotCi1ndGsvICAgICAgICAgICAtIERlbW9uc3RyYXRpb24gb2YgaG93IHRvIHVzZSBPQ2FtbE1ha2VmaWxlIHdpdGggR1RLCi0gICAgICAgICAgICAgICAgIGFuZCB0aHJlYWRzLiBDb3VydGVzeSBvZiBUaW0gRnJlZW1hbiA8dGltQGZ1bmdpYmxlLmNvbT4uCi0KLWlkbC8gICAgICAgICAgIC0gQ29udGFpbnMgYSB2ZXJ5IHNtYWxsIGV4YW1wbGUgb2YgaG93IHRvIHVzZQotICAgICAgICAgICAgICAgICAiY2FtbGlkbCIgdG9nZXRoZXIgd2l0aCAiT0NhbWxNYWtlZmlsZSIuIEFsc28gaW50ZW5kZWQKLSAgICAgICAgICAgICAgICAgdG8gc2hvdywgaG93IGVhc3kgaXQgaXMgdG8gaW50ZXJmYWNlIE9DYW1sIGFuZCBDLgotCi10aHJlYWRzLyAgICAgICAtIFR3byBleGFtcGxlcyBvZiBob3cgdG8gdXNlIHRocmVhZHMgKG9yaWdpbmFsbHkKLSAgICAgICAgICAgICAgICAgcG9zdGVkIGJ5IFhhdmllciBMZXJveSBzb21lIHRpbWUgYWdvKS4gU2hvd3MgdGhlIHVzZSBvZgotICAgICAgICAgICAgICAgICAiT0NhbWxNYWtlZmlsZSIgaW4gYW4gZW52aXJvbm1lbnQgb2YgbXVsdGlwbGUgY29tcGlsYXRpb24KLSAgICAgICAgICAgICAgICAgdGFyZ2V0cy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICBXaHkgc2hvdWxkIHlvdSB1c2UgaXQ/Ci0KLUZvciBzZXZlcmFsIHJlYXNvbnM6Ci0KLSAgKiBJdCBpcyB3ZWxsLXRlc3RlZCAoSSB1c2UgaXQgaW4gYWxsIG9mIG15IHByb2plY3RzKS4KLQotICAqIEluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgYXBwcm9hY2hlcyBpdCBnZW5lcmF0ZXMgZGVwZW5kZW5jaWVzCi0gICAgY29ycmVjdGx5IGJ5IGVuc3VyaW5nIHRoYXQgYWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIE9DYW1sLWZpbGVzCi0gICAgZXhpc3QgYmVmb3JlIGRlcGVuZGVuY3kgY2FsY3VsYXRpb24uICBUaGlzIGlzIHRoZSBvbmx5IHdheSB0bwotICAgIGd1YXJhbnRlZSB0aGF0ICJvY2FtbGRlcCIgd29ya3MgY29ycmVjdGx5LgotCi0gICogSXQgaXMgZXh0cmVtZWx5IGNvbnZlbmllbnQgKGF0IGxlYXN0IEkgdGhpbmsgc28gOy0pLgotICAgIEV2ZW4gcXVpdGUgY29tcGxleCBjb21waWxhdGlvbiBwcm9jZXNzZXMgKHNlZSBleGFtcGxlICJjYWxjLm1sIikKLSAgICBuZWVkIHZlcnkgbGl0dGxlIGluZm9ybWF0aW9uIHRvIHdvcmsgY29ycmVjdGx5IC0gYWN0dWFsbHkganVzdCBhYm91dAotICAgIHRoZSBtaW5pbXVtIChmaWxlIG5hbWVzIG9mIHNvdXJjZXMpLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgV2hlbiB5b3Ugc2hvdWxkbid0IHVzZSBpdC4uLgotCi1JbiBwcm9qZWN0cyB3aGVyZSBldmVyeSBjb21waWxhdGlvbiB1bml0IG5lZWRzIGRpZmZlcmVudCBmbGFncyAtIGJ1dAotaW4gc3VjaCBjb21wbGljYXRlZCBjYXNlcyB5b3Ugd2lsbCBiZSBvbiB5b3VyIG93biBhbnl3YXkuIEx1Y2tpbHksCi10aGlzIGRvZXNuJ3QgaGFwcGVuIHRvbyBmcmVxdWVudGx5Li4uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgSG93IHRvIHVzZSAiT0NhbWxNYWtlZmlsZSIgaW4geW91ciBvd24gcHJvamVjdAotICAgICAgICAgKFRha2UgYSBsb29rIGF0IHRoZSBleGFtcGxlcyBmb3IgYSBxdWljayBpbnRyb2R1Y3Rpb24hKQotCi1DcmVhdGUgeW91ciBwcm9qZWN0LXNwZWNpZmljICJNYWtlZmlsZSIgaW4gdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yeS4KLQotTm93IHRoZXJlIGFyZSB0d28gd2F5cyBvZiBtYWtpbmcgdXNlIG9mICJPQ2FtbE1ha2VmaWxlIjoKLQotICAxKSBIYXZlIGEgbG9vayBhdCB0aGUgZGVmYXVsdCBzZXR0aW5ncyBpbiAiT0NhbWxNYWtlZmlsZSIgYW5kIHNldAotICAgICB0aGVtIHRvIHRoZSB2YWx1ZXMgdGhhdCBhcmUgdmFpbGQgb24geW91ciBzeXN0ZW0gLSB3aGV0aGVyIHRoZQotICAgICBwYXRoIHRvIHRoZSBzdGFuZGFyZCBsaWJyYXJpZXMgaXMgb2ssIHdoYXQgZXhlY3V0YWJsZXMgc2hhbGwgYmUKLSAgICAgdXNlZCwgZXRjLi4uCi0KLSAgMikgQ29weSBpdCBpbnRvIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIHByb2plY3QgdG8gYmUgY29tcGlsZWQuCi0gICAgIEFkZCAiLWluY2x1ZGUgT0NhbWxNYWtlZmlsZSIgYXMgYSBsYXN0IGxpbmUgb2YgeW91ciAiTWFrZWZpbGUiLgotCi0gIDMpIFB1dCBpdCBzb21ld2hlcmUgZWxzZSBvbiB0aGUgc3lzdGVtLiBJbiB0aGlzIGNhc2UgeW91IHdpbGwgaGF2ZSB0bwotICAgICBzZXQgYSB2YXJpYWJsZSAiT0NBTUxNQUtFRklMRSIgaW4geW91ciBwcm9qZWN0LXNwZWNpZmljICJNYWtlZmlsZSIuCi0gICAgIFRoaXMgaXMgdGhlIHdheSBpbiB3aGljaCB0aGUgZXhhbXBsZXMgYXJlIHdyaXR0ZW46IHNvIHlvdSBuZWVkCi0gICAgIG9ubHkgb25lIHZlcnNpb24gb2YgIk9DYW1sTWFrZWZpbGUiIHRvIG1hbmFnZSBhbGwgeW91ciBwcm9qZWN0cyEKLSAgICAgU2VlIHRoZSBleGFtcGxlcyBmb3IgZGV0YWlscy4KLQotWW91IHNob3VsZCB1c3VhbGx5IHNwZWNpZnkgdHdvIGZ1cnRoZXIgdmFyaWFibGVzIGZvciB5b3VyIHByb2plY3Q6Ci0KLSAgKiBTT1VSQ0VTICAoZGVmYXVsdDogZm9vLm1sKQotICAqIFJFU1VMVCAgIChkZWZhdWx0OiBmb28pCi0KLVB1dCBhbGwgdGhlIHNvdXJjZXMgbmVjZXNzYXJ5IGZvciBhIHRhcmdldCBpbnRvIHZhcmlhYmxlICJTT1VSQ0VTIi4KLVRoZW4gc2V0ICJSRVNVTFQiIHRvIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQuIElmIHlvdSB3YW50IHRvIGdlbmVyYXRlCi1saWJyYXJpZXMsIHlvdSBzaG91bGQgKm5vdCogc3BlY2lmeSB0aGUgc3VmZml4ICgiLmNtYSIsICIuY214YSIsICIuYSIpCi0tIGl0IHdpbGwgYmUgYWRkZWQgYXV0b21hdGljYWxseSBpZiB5b3Ugc3BlY2lmeSB0aGF0IHlvdSB3YW50IHRvIGJ1aWxkCi1hIGxpYnJhcnkuCi0KLSAgICAgICoqICAgICAgRG9uJ3QgZm9yZ2V0IHRvIGFkZCB0aGUgIi5tbGkiLWZpbGVzLCB0b28hICAgICAgICAqKgotICAgICAgKiogIERvbid0IGZvcmdldCB0aGF0IG9yZGVyIG9mIHRoZSBzb3VyY2UgZmlsZXMgbWF0dGVycyEgICoqCi0KLVRoZSBvcmRlciBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgaXQgbWF0dGVycyBkdXJpbmcgbGlua2luZyBhbnl3YXkKLWR1ZSB0byBwb3RlbnRpYWwgc2lkZSBlZmZlY3RzIGNhdXNlZCBhdCBwcm9ncmFtIHN0YXJ0dXAuIFRoaXMgaXMKLXdoeSBPQ2FtbE1ha2VmaWxlIGRvZXMgbm90IGF0dGVtcHQgdG8gcGFydGlhbGx5IG9yZGVyIGRlcGVuZGVuY2llcyBieQotaXRzZWxmLCB3aGljaCBtaWdodCBjb25mdXNlIHVzZXJzIGV2ZW4gbW9yZS4gSXQganVzdCBjb21waWxlcyBhbmQgbGlua3MKLU9DYW1sLXNvdXJjZXMgaW4gdGhlIG9yZGVyIHNwZWNpZmllZCBieSB0aGUgdXNlciwgZXZlbiBpZiBpdCBjb3VsZAotZGV0ZXJtaW5lIGF1dG9tYXRpY2FsbHkgdGhhdCB0aGUgb3JkZXIgY2Fubm90IGJlIGNvcnJlY3QuCi0KLVRoZSBtaW5pbXVtIG9mIHlvdXIgIk1ha2VmaWxlIiBsb29rcyBsaWtlIHRoaXMgKGFzc3VtaW5nIHRoYXQKLSJPQ2FtbE1ha2VmaWxlIiBpcyBpbiB0aGUgc2VhcmNoIHBhdGggb2YgIm1ha2UiKToKLQotICAtaW5jbHVkZSBPQ2FtbE1ha2VmaWxlCi0KLVRoaXMgd2lsbCBhc3N1bWUgdGhhdCB5b3Ugd2FudCB0byBjb21waWxlIGEgZmlsZSAiZm9vLm1sIiB0byBhIGJpbmFyeQotImZvbyIuCi0KLU90aGVyd2lzZSwgeW91ciBNYWtlZmlsZSB3aWxsIHByb2JhYmx5IGNvbnRhaW4gc29tZXRoaW5nIGxpa2UgdGhpczoKLQotICBTT1VSQ0VTID0gZm9vLm1sCi0gIFJFU1VMVCAgPSBmb28KLSAgLWluY2x1ZGUgT0NhbWxNYWtlZmlsZQotCi1CZSBjYXJlZnVsIHdpdGggdGhlIG5hbWVzIHlvdSBwdXQgaW50byB0aGVzZSB2YXJpYWJsZXM6IGlmIHRoZXkgYXJlIHdyb25nLAotYSAibWFrZSBjbGVhbiIgbWlnaHQgZXJhc2UgdGhlIHdyb25nIGZpbGVzIC0gYnV0IEkga25vdyB5b3Ugd2lsbCBub3QgZG8KLXRoYXQgOy0pCi0KLUEgc2ltcGxlICJtYWtlIiB3aWxsIGdlbmVyYXRlIGEgYnl0ZS1jb2RlIGV4ZWN1dGFibGUuIElmIHlvdSB3YW50IHRvCi1jaGFuZ2UgdGhpcywgeW91IG1heSBhZGQgYW4gImFsbCItcnVsZSB0aGF0IGdlbmVyYXRlcyBzb21ldGhpbmcgZWxzZS4KLQotRS5nLjoKLQotICBTT1VSQ0VTID0gZm9vLm1sCi0gIFJFU1VMVCAgPSBmb28KLSAgYWxsOiBuYXRpdmUtY29kZS1saWJyYXJ5Ci0gIC1pbmNsdWRlIE9DYW1sTWFrZWZpbGUKLQotVGhpcyB3aWxsIGJ1aWxkIGEgbmF0aXZlLWNvZGUgbGlicmFyeSAiZm9vLmNteGEiICgrICJmb28uYSIpIGZyb20gZmlsZQotImZvby5tbCIuCi0KLVlvdSBtYXkgZXZlbiBidWlsZCBzZXZlcmFsIHRhcmdldHMgYXQgb25jZS4gVG8gcHJvZHVjZSBieXRlLSBhbmQgbmF0aXZlLWNvZGUKLWV4ZWN1dGFibGVzIHdpdGggb25lICJtYWtlIiwgYWRkIHRoZSBmb2xsb3dpbmcgcnVsZToKLQotICAgIGFsbDogYnl0ZS1jb2RlIG5hdGl2ZS1jb2RlCi0KLVlvdSB3aWxsIHByb2JhYmx5IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IHN1ZmZpeCBmb3IgZWFjaCBvZiB0aGVzZSB0YXJnZXRzCi1zbyB0aGF0IHRoZSByZXN1bHQgd2lsbCBub3QgYmUgb3ZlcndyaXR0ZW4gKHNlZSBvcHRpb25hbCB2YXJpYWJsZXMgYmVsb3cKLWZvciBkZXRhaWxzKS4KLQotWW91IG1heSBhbHNvIHRlbGwgIm1ha2UiIGF0IHRoZSBjb21tYW5kLWxpbmUgd2hhdCBraW5kIG9mIHRhcmdldCB0bwotcHJvZHVjZSAoZS5nLiAibWFrZSBuYyIpLiAgSGVyZSBhbGwgdGhlIHBvc3NpYmlsaXRpZXMgd2l0aCBzaG9ydGN1dHMKLWJldHdlZW4gcGFyZW50aGVzaXM6Ci0KLSAgICogYnl0ZS1jb2RlICAgICAgICAgICAgICAgICAgICAgKGJjKQotICAgKiBieXRlLWNvZGUtbm9saW5rICAgICAgICAgICAgICAoYmNubCkgICAtIG5vIGxpbmtpbmcgc3RhZ2UKLSAgICogYnl0ZS1jb2RlLWxpYnJhcnkgICAgICAgICAgICAgKGJjbCkKLSAgICogbmF0aXZlLWNvZGUgICAgICAgICAgICAgICAgICAgKG5jKQotICAgKiBuYXRpdmUtY29kZS1ub2xpbmsgICAgICAgICAgICAobmNubCkgICAtIG5vIGxpbmtpbmcgc3RhZ2UKLSAgICogbmF0aXZlLWNvZGUtbGlicmFyeSAgICAgICAgICAgKG5jbCkKLSAgICogZGVidWctY29kZSAgICAgICAgICAgICAgICAgICAgKGRjKQotICAgKiBkZWJ1Zy1jb2RlLW5vbGluayAgICAgICAgICAgICAoZGNubCkgICAtIG5vIGxpbmtpbmcgc3RhZ2UKLSAgICogZGVidWctY29kZS1saWJyYXJ5ICAgICAgICAgICAgKGRjbCkKLSAgICogcHJvZmlsaW5nLWJ5dGUtY29kZSAgICAgICAgICAgKHBiYykKLSAgICogcHJvZmlsaW5nLWJ5dGUtY29kZS1saWJyYXJ5ICAgKHBiY2wpCi0gICAqIHByb2ZpbGluZy1uYXRpdmUtY29kZSAgICAgICAgIChwbmMpCi0gICAqIHByb2ZpbGluZy1uYXRpdmUtY29kZS1saWJyYXJ5IChwbmNsKQotICAgKiBieXRlLWNvZGUtZGxsICAgICAgICAgICAgICAgICAoYmNkKQotICAgKiBuYXRpdmUtY29kZS1kbGwgICAgICAgICAgICAgICAobmNkKQotICAgKiBwYWNrLWJ5dGUtY29kZSAgICAgICAgICAgICAgICAocGFiYykKLSAgICogcGFjay1uYXRpdmUtY29kZSAgICAgICAgICAgICAgKHBhbmMpCi0gICAqIHRvcGxldmVsIGludGVycHJldGVyICAgICAgICAgICh0b3ApCi0gICAqIHN1YnByb2pzCi0KLUhlcmUgYSBzaG9ydCBub3RlIGNvbmNlcm5pbmcgYnVpbGRpbmcgYW5kIGxpbmtpbmcgYnl0ZSBjb2RlIGxpYnJhcmllcwotd2l0aCBDLWZpbGVzOgotCi0gIE9DYW1sIGxpbmtzIEMtb2JqZWN0IGZpbGVzIG9ubHkgd2hlbiB0aGV5IGFyZSB1c2VkIGluIGFuIGV4ZWN1dGFibGUuCi0gIEFmdGVyIGNvbXBpbGF0aW9uIHRoZXkgc2hvdWxkIGJlIHBsYWNlZCBpbiBzb21lIGRpcmVjdG9yeSB0aGF0IGlzIGluCi0gIHlvdXIgaW5jbHVkZSBwYXRoIGlmIHlvdSBsaW5rIHlvdXIgbGlicmFyeSBhZ2FpbnN0IGFuIGV4ZWN1dGFibGUuCi0KLSAgSXQgaXMgc29tZXRpbWVzIG1vcmUgY29udmVuaWVudCB0byBsaW5rIGFsbCBDLW9iamVjdCBmaWxlcyBpbnRvIGEKLSAgc2luZ2xlIEMtbGlicmFyeS4gVGhlbiB5b3UgaGF2ZSB0byBvdmVycmlkZSB0aGUgYXV0b21hdGljIGxpbmsgZmxhZ3MKLSAgb2YgeW91ciBsaWJyYXJ5IHVzaW5nICItbm9hdXRvbGluayIgYW5kIGFkZCBhbm90aGVyIGxpbmtmbGFnIHRoYXQKLSAgbGlua3MgaW4geW91ciBDLWxpYnJhcnkgZXhwbGljaXRseS4KLQotV2hhdCBjb25jZXJucyBtYWludGFpbmFuY2U6Ci0KLSAgIm1ha2UgY2xlYW4iIHJlbW92ZXMgYWxsIChhbGwhKSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlcyAtIHNvCi0gIGFnYWluOiBtYWtlIHN1cmUgeW91ciB2YXJpYWJsZXMgYXJlIG9rIQotCi0gICJtYWtlIGNsZWFudXAiIGlzIHNpbWlsYXIgdG8gIm1ha2UgY2xlYW4iIGJ1dCBsZWF2ZXMgZXhlY3V0YWJsZXMuCi0KLUFub3RoZXIgd2F5IHRvIGRlc3Ryb3kgc29tZSBpbXBvcnRhbnQgZmlsZXMgaXMgYnkgaGF2aW5nICJPQ2FtbE1ha2VmaWxlIgotYXV0b21hdGljYWxseSBnZW5lcmF0ZSBmaWxlcyB3aXRoIHRoZSBzYW1lIG5hbWUuIFJlYWQgdGhlIGRvY3VtZW50YXRpb24KLWFib3V0IHRoZSB0b29scyBpbiB0aGUgT0NhbWwtZGlzdHJpYnV0aW9uIHRvIHNlZSB3aGF0IGtpbmQgb2YgZmlsZXMgYXJlCi1nZW5lcmF0ZWQuICJPQ2FtbE1ha2VmaWxlIiBhZGRpdGlvbmFsbHkgZ2VuZXJhdGVzICgnJScgaXMgYmFzZW5hbWUgb2YKLXNvdXJjZSBmaWxlKToKLQotICAlX2lkbC5jICAtICJjYW1saWRsIiBnZW5lcmF0ZXMgYSBmaWxlICIlLmMiIGZyb20gIiUuaWRsIiwgYnV0IHRoaXMgaXMKLSAgICAgICAgICAgICBub3Qgc3VjaCBhIGdvb2QgaWRlYSwgYmVjYXVzZSB3aGVuIGdlbmVyYXRpbmcgbmF0aXZlLWNvZGUsCi0gICAgICAgICAgICAgYm90aCB0aGUgZmlsZSAiJS5jIiBhbmQgIiUubWwiIHdvdWxkIGdlbmVyYXRlIGZpbGVzICIlLm8iCi0gICAgICAgICAgICAgd2hpY2ggd291bGQgb3ZlcndyaXRlIGVhY2ggb3RoZXIuIFRodXMsICJPQ2FtbE1ha2VmaWxlIgotICAgICAgICAgICAgIHJlbmFtZXMgIiUuYyIgdG8gIiVfaWRsLmMiIHRvIHdvcmsgYXJvdW5kIHRoaXMgcHJvYmxlbS4KLQotVGhlIGRlcGVuZGVuY2llcyBhcmUgc3RvcmVkIGluIHRocmVlIGRpZmZlcmVudCBzdWJkaXJlY3RvcmllcyAoZG90IGRpcnMpOgotCi0gIC5fZCAgICAtIGNvbnRhaW5zIGRlcGVuZGVuY2llcyBmb3IgLm1sLWZpbGVzCi0gIC5fYmNkaSAtIGNvbnRhaW5zIGJ5dGUgY29kZSBkZXBlbmRlbmNpZXMgZm9yIC5tbGktZmlsZXMKLSAgLl9uY2RpIC0gY29udGFpbnMgbmF0aXZlIGNvZGUgZGVwZW5kZW5jaWVzIGZvciAubWxpLWZpbGVzCi0KLVRoZSBlbmRpbmdzIG9mIHRoZSBkZXBlbmRlbmN5IGZpbGVzIGFyZTogIiUuZCIgZm9yIHRob3NlIGdlbmVyYXRlZCBmcm9tCi0iJS5tbCItZmlsZXMsICIlLmRpIiBmb3Igb25lcyBkZXJpdmVkIGZyb20gIiUubWxpIi1maWxlcy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnZ2luZwotCi0gIFRoaXMgaXMgZWFzeTogaWYgeW91IGRpc2NvdmVyIGEgYnVnLCBqdXN0IGRvIGEgIm1ha2UgY2xlYW47IG1ha2UgZGMiCi0gIHRvIHJlY29tcGlsZSB5b3VyIHByb2plY3Qgd2l0aCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uIFRoZW4geW91IGNhbgotICBpbW1lZGlhdGVseSBhcHBseSAib2NhbWxkZWJ1ZyIgdG8gdGhlIGV4ZWN1dGFibGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxpbmcKLQotICBGb3IgZ2VuZXJhdGluZyBjb2RlIHRoYXQgY2FuIGJlIHByb2ZpbGVkIHdpdGggIm9jYW1scHJvZiIgKGJ5dGUgY29kZSkKLSAgb3IgImdwcm9mIiAobmF0aXZlIGNvZGUpLCBjb21waWxlIHlvdXIgcHJvamVjdCB3aXRoIG9uZSBvZiB0aGUgcHJvZmlsaW5nCi0gIHRhcmdldHMgKHNlZSB0YXJnZXRzIGFib3ZlKS4gRS5nLjoKLQotICAgICogIm1ha2UgcGJjIiB3aWxsIGJ1aWxkIGJ5dGUgY29kZSB0aGF0IGNhbiBiZSBwcm9maWxlZCB3aXRoCi0gICAgICAib2NhbWxwcm9mIi4KLQotICAgICogIm1ha2UgcG5jIiB3aWxsIGJ1aWxkIG5hdGl2ZSBjb2RlIHRoYXQgY2FuIGJlIHByb2ZpbGVkIHdpdGgKLSAgICAgICJncHJvZiIuCi0KLSAgUGxlYXNlIG5vdGUgdGhhdCBpdCBpcyBub3QgY3VycmVudGx5IHBvc3NpYmxlIHRvIHByb2ZpbGUgYnl0ZSBjb2RlIHdpdGgKLSAgdGhyZWFkcy4gT0NhbWxNYWtlZmlsZSB3aWxsIGZvcmNlIGFuIGVycm9yIGlmIHlvdSB0cnkgdG8gZG8gdGhpcy4KLQotICBBIHNob3J0IGhpbnQgZm9yIERFQyBBbHBoYS11c2VycyAodW5kZXIgRGlnaXRhbCBVbml4KTogeW91IG1heSBhbHNvCi0gIGNvbXBpbGUgeW91ciBzb3VyY2VzIHRvIG5hdGl2ZSBjb2RlIHdpdGhvdXQgYW55IGZ1cnRoZXIgcHJvZmlsaW5nCi0gIG9wdGlvbnMvdGFyZ2V0cy4gVGhlbiBjYWxsICJwaXhpZSBteV9leGVjIiwgIm15X2V4ZWMiIGJlaW5nIHlvdXIKLSAgZXhlY3V0YWJsZS4gVGhpcyB3aWxsIHByb2R1Y2UgKGFtb25nIG90aGVyIGZpbGVzKSBhbiBleGVjdXRhYmxlCi0gICJteV9leGVjLnBpeGllIi4gQ2FsbCBpdCBhbmQgaXQgd2lsbCBwcm9kdWNlIHByb2ZpbGluZyBpbmZvcm1hdGlvbiB3aGljaAotICBjYW4gYmUgYW5hbHlzZWQgdXNpbmcgInByb2YgLXBpeGllIG15X2V4ZWMiLiBUaGUgcmVzdWx0aW5nIGluZm9ybWF0aW9uCi0gIGlzIGV4dHJlbWVseSBkZXRhaWxlZCBhbmQgYWxsb3dzIGFuYWx5c2lzIHVwIHRvIHRoZSBjbG9jayBjeWNsZSBsZXZlbC4uLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2luZyBQcmVwcm9jZXNzb3JzCi0KLSAgQmVjYXVzZSBvbmUgY291bGQgZW1wbG95IGFueSBraW5kIG9mIHByb2dyYW0gdGhhdCByZWFkcyBmcm9tIHN0YW5kYXJkCi0gIGlucHV0IGFuZCBwcmludHMgdG8gc3RhbmRhcmQgb3V0cHV0IGFzIHByZXByb2Nlc3NvciwgdGhlcmUgY2Fubm90IGJlIGFueQotICBkZWZhdWx0IHdheSB0byBoYW5kbGUgYWxsIG9mIHRoZW0gY29ycmVjdGx5IHdpdGhvdXQgZnVydGhlciBrbm93bGVkZ2UuCi0KLSAgVGhlcmVmb3JlIHlvdSBoYXZlIHRvIGNvb3BlcmF0ZSBhIGJpdCB3aXRoIE9DYW1sTWFrZWZpbGUgdG8gbGV0Ci0gIHByZXByb2Nlc3NpbmcgaGFwcGVuIGF1dG9tYXRpY2FsbHkuIEJhc2ljYWxseSwgdGhpcyBvbmx5IHJlcXVpcmVzCi0gIHRoYXQgeW91IHB1dCBhIGNvbW1lbnQgaW50byB0aGUgZmlyc3QgbGluZSBvZiBmaWxlcyB0aGF0IHNob3VsZCBiZQotICBwcmVwcm9jZXNzZWQsIGUuZy46Ci0KLSAgICAoKnBwIGNhdCAqKQotICAgIC4uLiByZXN0IG9mIHByb2dyYW0gLi4uCi0KLSAgT0NhbWxNYWtlZmlsZSBsb29rcyBhdCB0aGUgZmlyc3QgbGluZSBvZiB5b3VyIGZpbGVzLCBhbmQgaWYgaXQgZmluZHMKLSAgYSBjb21tZW50IHRoYXQgc3RhcnRzIHdpdGggIigqcHAiLCB0aGVuIGl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlCi0gIHJlc3Qgb2YgdGhlIGNvbW1lbnQgdGVsbHMgaXQgaG93IHRvIGNvcnJlY3RseSBjYWxsIHRoZSBhcHByb3ByaWF0ZQotICBwcmVwcm9jZXNzb3IuIEluIHRoaXMgY2FzZSB0aGUgcHJvZ3JhbSAiY2F0IiB3aWxsIGJlIGNhbGxlZCwgd2hpY2ggd2lsbCwKLSAgb2YgY291cnNlLCBqdXN0IG91dHB1dCB0aGUgc291cmNlIHRleHQgYWdhaW4gd2l0aG91dCBjaGFuZ2luZyBpdC4KLQotICBJZiB5b3UgYXJlLCBmb3IgZXhhbXBsZSwgYW4gYWR2b2NhdGUgb2YgdGhlIG5ldyAicmV2aXNlZCBzeW50YXgiLAotICB3aGljaCBpcyBzdXBwb3J0ZWQgYnkgdGhlIGNhbWxwNCBwcmVwcm9jZXNzb3IsIHlvdSBjb3VsZCBzaW1wbHkgd3JpdGU6Ci0KLSAgICAoKnBwIGNhbWxwNHIgKikKLSAgICAuLi4gcmVzdCBvZiBwcm9ncmFtIGluIHJldmlzZWQgc3ludGF4IC4uLgotCi0gIFNpbXBsZSwgaXNuJ3QgaXQ/Ci0KLSAgSWYgeW91IHdhbnQgdG8gd3JpdGUgeW91ciBvd24gc3ludGF4IGV4dGVuc2lvbnMsIGp1c3QgdGFrZSBhIGxvb2sgYXQgdGhlCi0gIGV4YW1wbGUgaW4gdGhlIGRpcmVjdG9yeSAiY2FtbHA0IjogaXQgaW1wbGVtZW50cyB0aGUgInJlcGVhdCAuLi4gdW50aWwiCi0gIGV4dGVuc2lvbiBhcyBkZXNjcmliZWQgaW4gdGhlIGNhbWxwNC10dXRvcmlhbC4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgIExpYnJhcnkgKFVuLSlJbnN0YWxsYXRpb24gU3VwcG9ydAotCi0gIE9DYW1sTWFrZWZpbGUgY29udGFpbnMgdHdvIHRhcmdldHMgdXNpbmcgIm9jYW1sZmluZCIgZm9yIHRoaXMgcHVycG9zZToKLQotICAgICogbGliaW5zdGFsbAotICAgICogbGlidW5pbnN0YWxsCi0KLSAgVGhlc2UgdHdvIHRhcmdldHMgcmVxdWlyZSB0aGUgZXhpc3RlbmNlIG9mIHRoZSB2YXJpYWJsZQotICAiTElCSU5TVEFMTF9GSUxFUyIsIHdoaWNoIHNob3VsZCBiZSBzZXQgdG8gYWxsIHRoZSBmaWxlcyB0aGF0IHlvdQotICB3YW50IHRvIGluc3RhbGwgaW4gdGhlIGxpYnJhcnkgZGlyZWN0b3J5ICh1c3VhbGx5ICUubWxpLCAlLmNtaSwgJS5jbWEsCi0gICUuY214YSwgJS5hIGFuZCBwb3NzaWJseSBmdXJ0aGVyIEMtbGlicmFyaWVzKS4gVGhlIHRhcmdldCAibGliaW5zdGFsbCIKLSAgaGFzIHRoZSBkZXBlbmRlbmN5ICJhbGwiIHRvIGZvcmNlIGNvbXBpbGF0aW9uIG9mIHRoZSBsaWJyYXJ5IHNvIG1ha2UKLSAgc3VyZSB5b3UgZGVmaW5lIHRhcmdldCAiYWxsIiBpbiB5b3VyIE1ha2VmaWxlIGFwcHJvcHJpYXRlbHkuCi0KLSAgVGhlIHRhcmdldHMgaW5mb3JtIHRoZSB1c2VyIGFib3V0IHRoZSBjb25maWd1cmVkIGluc3RhbGwgcGF0aCBhbmQgYXNrCi0gIGZvciBjb25maXJtYXRpb24gdG8gKHVuKWluc3RhbGwgdGhlcmUuIElmIHlvdSB3YW50IHRvIHVzZSB0aGVtLCBpdAotICBpcyBvZnRlbiBhIGdvb2QgaWRlYSB0byBqdXN0IGFsaWFzIHRoZW0gaW4geW91ciBNYWtlZmlsZSB0byAiaW5zdGFsbCIKLSAgYW5kICJ1bmluc3RhbGwiIHJlc3BlY3RpdmVseS4KLQotICBUd28gb3RoZXIgdGFyZ2V0cyBhbGxvdyBpbnN0YWxsYXRpb24gb2YgZmlsZXMgaW50byBhIHBhcnRpY3VsYXIKLSAgZGlyZWN0b3J5ICh3aXRob3V0IHVzaW5nIG9jYW1sZmluZCk6Ci0KLSAgICAqIHJhd2luc3RhbGwKLSAgICAqIHJhd3VuaW5zdGFsbAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkaW5nIHRvcGxldmVscwotCi0gIFRoZXJlIGlzIGp1c3Qgb25lIHRhcmdldCBmb3IgdGhpczoKLQotICAgICogdG9wCi0KLSAgVGhlIGdlbmVyYXRlZCBmaWxlIGNhbiBiZSB1c2VkIGltbWVkaWF0ZWx5IGZvciBpbnRlcmFjdGl2ZSBzZXNzaW9ucyAtCi0gIGV2ZW4gd2l0aCBzY2FubmVycywgcGFyc2VycywgQy1maWxlcywgZXRjLiEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0aW5nIGRvY3VtZW50YXRpb24KLQotICBUaGUgZm9sbG93aW5nIHRhcmdldHMgYXJlIHN1cHBvcnRlZDoKLQotICAgKiBodGRvYyAgICAgIC0gZ2VuZXJhdGVzIEhUTUwtZG9jdW1lbnRhdGlvbgotICAgKiBsYWRvYyAgICAgIC0gZ2VuZXJhdGVzIExhdGV4LWRvY3VtZW50YXRpb24KLSAgICogcHNkb2MgICAgICAtIGdlbmVyYXRlcyBQb3N0U2NyaXB0LWRvY3VtZW50YXRpb24KLSAgICogcGRmZG9jICAgICAtIGdlbmVyYXRlcyBQREYtZG9jdW1lbnRhdGlvbgotICAgKiBkb2MgICAgICAgIC0gZ2VuZXJhdGVzIGFsbCBzdXBwb3J0ZWQgZm9ybXMgb2YgZG9jdW1lbnRhdGlvbgotICAgKiBjbGVhbi1kb2MgIC0gZ2VuZXJhdGVzIGFsbCBzdXBwb3J0ZWQgZm9ybXMgb2YgZG9jdW1lbnRhdGlvbgotCi0gIEFsbCBvZiB0aGVtIGdlbmVyYXRlIGEgc3ViLWRpcmVjdG9yeSAiZG9jIi4gTW9yZSBwcmVjaXNlbHksIGZvciBIVE1MIGl0Ci0gIGlzICJkb2MvJChSRVNVTFQpL2h0bWwiIGFuZCBmb3IgTGF0ZXgsIFBvc3RTY3JpcHQgYW5kIFBERiB0aGUgZGlyZWN0b3J5Ci0gICJkb2MvJChSRVNVTFQpL2xhdGV4Ii4gU2VlIHRoZSBPQ2FtbGRvYy1tYW51YWwgZm9yIGRldGFpbHMgYW5kIHRoZQotICBvcHRpb25hbCB2YXJpYWJsZXMgYmVsb3cgZm9yIHNldHRpbmdzIHlvdSBjYW4gY29udHJvbC4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsaW5nIHN1YnByb2plY3RzCi0KLSAgWW91IGNhbiBoYXZlIHNldmVyYWwgdGFyZ2V0cyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYW5kIG1hbmFnZSB0aGVtCi0gIGZyb20gd2l0aGluIGFuIHNpbmdsZSBNYWtlZmlsZS4KLQotICBHaXZlIGVhY2ggc3VicHJvamVjdCBhIG5hbWUsIGUuZy4gInAxIiwgInAyIiwgZXRjLiBUaGVuIHlvdSBleHBvcnQKLSAgc2V0dGluZ3Mgc3BlY2lmaWMgdG8gZWFjaCBwcm9qZWN0IGJ5IHVzaW5nIHZhcmlhYmxlcyBvZiB0aGUgZm9ybQotICAiUFJPSl9wMSIsICJQUk9KX3AyIiwgZXRjLiAgRS5nLjoKLQotICAgIGRlZmluZSBQUk9KX3AxCi0gICAgICBTT1VSQ0VTPSJmb28ubWwgbWFpbi5tbCIKLSAgICAgIFJFU1VMVD0icDEiCi0gICAgICBPQ0FNTEZMQUdTPSItdW5zYWZlIgotICAgIGVuZGVmCi0gICAgZXhwb3J0IFBST0pfcDEKLQotICAgIGRlZmluZSBQUk9KX3AyCi0gICAgICAuLi4KLSAgICBlbmRlZgotICAgIGV4cG9ydCBQUk9KX3AyCi0KLSAgWW91IG1heSBhbHNvIGV4cG9ydCBjb21tb24gc2V0dGluZ3MgdXNlZCBieSBhbGwgcHJvamVjdHMgZGlyZWN0bHksIGUuZy4KLSAgImV4cG9ydCBUSFJFQURTID0geSIuCi0KLSAgTm93IGl0IGlzIGEgZ29vZCBpZGVhIHRvIGRlZmluZSwgd2hpY2ggcHJvamVjdHMgc2hvdWxkIGJlIGFmZmVjdGVkIGJ5Ci0gIGNvbW1hbmRzIGJ5IGRlZmF1bHQuICBFLmcuOgotCi0gICAgaWZuZGVmIFNVQlBST0pTCi0gICAgICBleHBvcnQgU1VCUFJPSlMgPSBwMSBwMgotICAgIGVuZGlmCi0KLSAgVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYSBnaXZlbiB0YXJnZXQgZm9yIGFsbCB0aG9zZQotICBzdWJwcm9qZWN0cyBpZiB0aGlzIHZhcmlhYmxlIGhhcyBub3QgYmVlbiBkZWZpbmVkIGluIHRoZSBzaGVsbAotICBlbnZpcm9ubWVudCBvciBpbiB0aGUgY29tbWFuZCBsaW5lIG9mIHRoZSBtYWtlLWludm9jYXRpb24gYnkgdGhlIHVzZXIuCi0gIEUuZy4sICJtYWtlIGRjIiB3aWxsIGdlbmVyYXRlIGRlYnVnIGNvZGUgZm9yIGFsbCBzdWJwcm9qZWN0cy4KLQotICBUaGVuIHlvdSBuZWVkIHRvIGRlZmluZSBhIGRlZmF1bHQgYWN0aW9uIGZvciB5b3VyIHN1YnByb2plY3RzIGlmICJtYWtlIgotICBoYXMgYmVlbiBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHM6Ci0KLSAgICBhbGw6IGJjCi0KLSAgVGhpcyB3aWxsIGJ1aWxkIGJ5dGUgY29kZSBieSBkZWZhdWx0IGZvciBhbGwgc3VicHJvamVjdHMuCi0KLSAgRmluYWxseSwgeW91J2xsIGhhdmUgdG8gZGVmaW5lIGEgY2F0Y2gtYWxsIHRhcmdldCB0aGF0IHVzZXMgdGhlIHRhcmdldAotICBwcm92aWRlZCBieSB0aGUgdXNlciBmb3IgYWxsIHN1YnByb2plY3RzLiBKdXN0IGFkZCAoYXNzdW1pbmcgdGhhdAotICBPQ0FNTE1BS0VGSUxFIGhhcyBiZWVuIGRlZmluZWQgYXBwcm9wcmlhdGVseSk6Ci0KLSAgICAlOgotICAgICAgICAgICAgQG1ha2UgLWYgJChPQ0FNTE1BS0VGSUxFKSBzdWJwcm9qcyBTVUJUQVJHRVQ9JEAKLQotICBTZWUgdGhlICJ0aHJlYWRzIi1kaXJlY3RvcnkgaW4gdGhlIGRpc3RyaWJ1dGlvbiBmb3IgYSBzaG9ydCBleGFtcGxlIQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgT3B0aW9uYWwgdmFyaWFibGVzIHRoYXQgbWF5IGJlIHBhc3NlZCB0byAiT0NhbWxNYWtlZmlsZSIKLQotICAqIExJQl9QQUNLX05BTUUgLSBwYWNrcyBhbGwgbW9kdWxlcyBvZiBhIGxpYnJhcnkgaW50byBhIG1vZHVsZSB3aG9zZQotICAgICAgICAgICAgICAgICAgICBuYW1lIGlzIGdpdmVuIGluIHZhcmlhYmxlICJMSUJfUEFDS19OQU1FIi4KLQotICAqIFJFU19DTElCX1NVRiAgLSB3aGVuIGJ1aWxkaW5nIGEgbGlicmFyeSB0aGF0IGNvbnRhaW5zIEMtc3R1YnMsIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgY29udHJvbHMgdGhlIHN1ZmZpeCBhcHBlbmRlZCB0byB0aGUgbmFtZQotICAgICAgICAgICAgICAgICAgICBvZiB0aGUgQy1saWJyYXJ5IChkZWZhdWx0OiAiX3N0dWJzIikuCi0KLSAgKiBUSFJFQURTICAgICAgIC0gc2F5ICJUSFJFQURTID0geWVzIiBpZiB5b3UgbmVlZCB0aHJlYWQgc3VwcG9ydCBjb21waWxlZCBpbiwKLSAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIGxlYXZlIGl0IGF3YXkuCi0KLSAgKiBWTVRIUkVBRFMgICAgIC0gc2F5ICJWTVRIUkVBRFMgPSB5ZXMiIGlmIHlvdSB3YW50IHRvIGZvcmNlIFZNLWxldmVsCi0gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxpbmcgb2YgdGhyZWFkcyAoYnl0ZS1jb2RlIG9ubHkpLgotCi0gICogQU5OT1RBVEUgICAgICAtIHNheSAiQU5OT1RBVEUgPSB5ZXMiIHRvIGdlbmVyYXRlIHR5cGUgYW5ub3RhdGlvbiBmaWxlcwotICAgICAgICAgICAgICAgICAgICAoLmFubm90KSB0byBzdXBwb3J0IGRpc3BsYXlpbmcgb2YgdHlwZSBpbmZvcm1hdGlvbgotICAgICAgICAgICAgICAgICAgICBpbiBlZGl0b3JzLgotCi0gICogVVNFX0NBTUxQNCAgICAtIHNheSAiVVNFX0NBTUxQNCA9IHllcyIgaW4geW91ciAiTWFrZWZpbGUiIGlmIHlvdQotICAgICAgICAgICAgICAgICAgICB3YW50IHRvIGluY2x1ZGUgdGhlIGNhbWxwNCBkaXJlY3RvcnkgZHVyaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICBidWlsZCBwcm9jZXNzLCBvdGhlcndpc2UgbGVhdmUgaXQgYXdheS4KLQotICAqIElOQ0RJUlMgICAgICAgLSBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZSBzZWFyY2hlZCBmb3IgIi5jbWkiLSBhbmQKLSAgICAgICAgICAgICAgICAgICAgIi5jbW8iLWZpbGVzLiAgWW91IG5lZWQgbm90IHdyaXRlICItSSAuLi4iIC0ganVzdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgcGxhaW4gbmFtZXMuCi0gICogTElCRElSUyAgICAgICAtIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIGJlIHNlYXJjaGVkIGZvciBsaWJyYXJpZXMKLSAgICAgICAgICAgICAgICAgICAgQWxzbyBqdXN0IHB1dCB0aGUgcGxhaW4gcGF0aHMgaW50byB0aGlzIHZhcmlhYmxlCi0gICogRVhUTElCRElSUyAgICAtIFNhbWUgYXMgIkxJQkRJUlMiLCBidXQgcGF0aHMgaW4gdGhpcyB2YXJpYWJsZSBhcmUKLSAgICAgICAgICAgICAgICAgICAgYWxzbyBhZGRlZCB0byB0aGUgYmluYXJ5IHZpYSB0aGUgIi1SIi1mbGFnIHNvIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgZHluYW1pYyBsaWJyYXJpZXMgaW4gbm9uLXN0YW5kYXJkIHBsYWNlcyBjYW4gYmUgZm91bmQuCi0gICogUkVTVUxUREVQUyAgICAtIFRhcmdldHMgb24gd2hpY2ggcmVzdWx0cyAoZXhlY3V0YWJsZXMgb3IgbGlicmFyaWVzKQotICAgICAgICAgICAgICAgICAgICBzaG91bGQgYWRkaXRpb25hbGx5IGRlcGVuZC4KLQotICAqIFBBQ0tTICAgICAgICAgLSBhZGRzIHBhY2thZ2VzIHVuZGVyIGNvbnRyb2wgb2YgImZpbmRsaWIiLgotCi0gICogUFJFRFMgICAgICAgICAtIHNwZWNpZmllcyAiZmluZGxpYiItcHJlZGljYXRlcy4KLQotICAqIExJQlMgICAgICAgICAgLSBPQ2FtbC1saWJyYXJpZXMgdGhhdCBzaG91bGQgYmUgbGlua2VkIChqdXN0IHBsYWluIG5hbWVzKS4KLSAgICAgICAgICAgICAgICAgICAgRS5nLiBpZiB5b3Ugd2FudCB0byBsaW5rIHRoZSBTdHItbGlicmFyeSwganVzdCB3cml0ZQotICAgICAgICAgICAgICAgICAgICAic3RyIiAod2l0aG91dCBxdW90ZXMpLgotICAgICAgICAgICAgICAgICAgICBUaGUgbmV3IE9DYW1sLWNvbXBpbGVyIGhhbmRsZXMgbGlicmFyaWVzIGluIHN1Y2gKLSAgICAgICAgICAgICAgICAgICAgYSB3YXkgdGhhdCB0aGV5ICJyZW1lbWJlciIgd2hldGhlciB0aGV5IGhhdmUgdG8KLSAgICAgICAgICAgICAgICAgICAgYmUgbGlua2VkIGFnYWluc3QgYSBDLWxpYnJhcnkgYW5kIGl0IGdldHMgbGlua2VkCi0gICAgICAgICAgICAgICAgICAgIGluIGF1dG9tYXRpY2FsbHkuCi0gICAgICAgICAgICAgICAgICAgIElmIHRoZXJlIGlzIGEgc2xhc2ggaW4gdGhlIGxpYnJhcnkgbmFtZSAoc3VjaCBhcwotICAgICAgICAgICAgICAgICAgICAiLi9zdHIiIG9yICJsaWIvZm9vIikgdGhlbiBtYWtlIGlzIHRvbGQgdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkIGZpbGVzIGRlcGVuZCBvbiB0aGUgbGlicmFyeS4gIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgaGVscHMgdG8gZW5zdXJlIHRoYXQgY2hhbmdlcyB0byB5b3VyIGxpYnJhcmllcyBhcmUKLSAgICAgICAgICAgICAgICAgICAgdGFrZW4gaW50byBhY2NvdW50LCB3aGljaCBpcyBpbXBvcnRhbnQgaWYgeW91IGFyZQotICAgICAgICAgICAgICAgICAgICByZWdlbmVyYXRpbmcgeW91ciBsaWJyYXJpZXMgZnJlcXVlbnRseS4KLSAgKiBDTElCUyAgICAgICAgIC0gQy1saWJyYXJpZXMgdGhhdCBzaG91bGQgYmUgbGlua2VkIChqdXN0IHBsYWluIG5hbWVzKS4KLQotICAqIFBSRV9UQVJHRVRTICAgLSBzZXQgdGhpcyB0byBhIGxpc3Qgb2YgdGFyZ2V0IGZpbGVzIHRoYXQgeW91IHdhbnQKLSAgICAgICAgICAgICAgICAgICAgdG8gaGF2ZSBidWlsZHQgYmVmb3JlIGRlcGVuZGVuY3kgY2FsY3VsYXRpb24gYWN0dWFsbHkKLSAgICAgICAgICAgICAgICAgICAgdGFrZXMgcGxhY2UuIEUuZy4gdXNlIHRoaXMgdG8gYXV0b21hdGljYWxseSBjb21waWxlCi0gICAgICAgICAgICAgICAgICAgIG1vZHVsZXMgbmVlZGVkIGJ5IGNhbWxwNCwgd2hpY2ggaGF2ZSB0byBiZSBhdmFpbGFibGUKLSAgICAgICAgICAgICAgICAgICAgYmVmb3JlIG90aGVyIG1vZHVsZXMgY2FuIGJlIHBhcnNlZCBhdCBhbGwuCi0KLSAgICAgICAgICAgICAgICAgICAgKiogV0FSTklORyAqKjogdGhlIGZpbGVzIG1lbnRpb25lZCBpbiB0aGlzIHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcmVtb3ZlZCB3aGVuICJtYWtlIGNsZWFuIiBpcyBleGVjdXRlZCEKLQotICAqIExJQklOU1RBTExfRklMRVMgLSB0aGUgZmlsZXMgb2YgYSBsaWJyYXJ5IHRoYXQgc2hvdWxkIGJlIGluc3RhbGxlZAotICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAiZmluZGxpYiIuIERlZmF1bHQ6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAkKFJFU1VMVCkubWxpICQoUkVTVUxUKS5jbWkgJChSRVNVTFQpLmNtYQotICAgICAgICAgICAgICAgICAgICAgICAgICQoUkVTVUxUKS5jbXhhICQoUkVTVUxUKS5hIGxpYiQoUkVTVUxUKS5hCi0KLSAgKiBPQ0FNTF9MSUJfSU5TVEFMTCAtIHRhcmdldCBkaXJlY3RvcnkgZm9yICJyYXdpbnN0YWxsL3Jhd3VuaW5zdGFsbCIuCi0gICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogJChPQ0FNTExJQlBBVEgpL2NvbnRyaWIpCi0KLSAgKiBET0NfRklMRVMgICAgIC0gbmFtZXMgb2YgZmlsZXMgZnJvbSB3aGljaCBkb2N1bWVudGF0aW9uIGlzIGdlbmVyYXRlZC4KLSAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IGFsbCAubWxpLWZpbGVzIGluIHlvdXIgJChTT1VSQ0VTKSkuCi0KLSAgKiBET0NfRElSICAgICAgIC0gbmFtZSBvZiBkaXJlY3Rvcnkgd2hlcmUgZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgc3RvcmVkLgotCi0gICogT0NBTUxGTEFHUyAgICAtIGZsYWdzIHBhc3NlZCB0byB0aGUgY29tcGlsZXJzCi0gICogT0NBTUxCQ0ZMQUdTICAtIGZsYWdzIHBhc3NlZCB0byB0aGUgYnl0ZSBjb2RlIGNvbXBpbGVyIG9ubHkKLSAgKiBPQ0FNTE5DRkxBR1MgIC0gZmxhZ3MgcGFzc2VkIHRvIHRoZSBuYXRpdmUgY29kZSBjb21waWxlciBvbmx5Ci0KLSAgKiBPQ0FNTExERkxBR1MgIC0gZmxhZ3MgcGFzc2VkIHRvIHRoZSBPQ2FtbC1saW5rZXIKLSAgKiBPQ0FNTEJMREZMQUdTIC0gZmxhZ3MgcGFzc2VkIHRvIHRoZSBPQ2FtbC1saW5rZXIgd2hlbiBsaW5raW5nIGJ5dGUgY29kZQotICAqIE9DQU1MTkxERkxBR1MgLSBmbGFncyBwYXNzZWQgdG8gdGhlIE9DYW1sLWxpbmtlciB3aGVuIGxpbmtpbmcKLSAgICAgICAgICAgICAgICAgICAgbmF0aXZlIGNvZGUKLQotICAqIE9DQU1MTUtMSUJfRkxBR1MgLSBmbGFncyBwYXNzZWQgdG8gdGhlIE9DYW1sIGxpYnJhcnkgdG9vbAotCi0gICogT0NBTUxDUEZMQUdTICAtIHByb2ZpbGluZyBmbGFncyBwYXNzZWQgdG8gIm9jYW1sY3AiIChkZWZhdWx0OiAiYSIpCi0KLSAgKiBQUEZMQUdTICAgICAgIC0gYWRkaXRpb25hbCBmbGFncyBwYXNzZWQgdG8gdGhlIHByZXByb2Nlc3NvciAoZGVmYXVsdDogbm9uZSkKLQotICAqIExGTEFHUyAgICAgICAgLSBmbGFncyBwYXNzZWQgdG8gIm9jYW1sbGV4IgotICAqIFlGTEFHUyAgICAgICAgLSBmbGFncyBwYXNzZWQgdG8gIm9jYW1seWFjYyIKLSAgKiBJRExGTEFHUyAgICAgIC0gZmxhZ3MgcGFzc2VkIHRvICJjYW1saWRsIgotCi0gICogT0NBTUxET0NGTEFHUyAtIGZsYWdzIHBhc3NlZCB0byAib2NhbWxkb2MiCi0KLSAgKiBPQ0FNTEZJTkRfSU5TVEZMQUdTIC0gZmxhZ3MgcGFzc2VkIHRvICJvY2FtbGZpbmQiIGR1cmluZyBpbnN0YWxsYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IG5vbmUpCi0KLSAgKiBEVklQU0ZMQUdTICAgIC0gZmxhZ3MgcGFzc2VkIHRvIGR2aXBzCi0gICAgICAgICAgICAgICAgICAgICh3aGVuIGdlbmVyYXRpbmcgZG9jdW1lbnRhdGlvbiBpbiBQb3N0U2NyaXB0KS4KLQotICAqIFNUQVRJQyAgICAgICAgLSBzZXQgdGhpcyB2YXJpYWJsZSBpZiB5b3Ugd2FudCB0byBmb3JjZSBjcmVhdGlvbgotICAgICAgICAgICAgICAgICAgICBvZiBzdGF0aWMgbGlicmFyaWVzCi0KLSAgKiBDQyAgICAgICAgICAgIC0gdGhlIEMtY29tcGlsZXIgdG8gYmUgdXNlZAotICAqIENYWCAgICAgICAgICAgLSB0aGUgQysrLWNvbXBpbGVyIHRvIGJlIHVzZWQKLQotICAqIENGTEFHUyAgICAgICAgLSBhZGRpdGlvbmFsIGZsYWdzIHBhc3NlZCB0byB0aGUgQy1jb21waWxlci4KLSAgICAgICAgICAgICAgICAgICAgVGhlIGZsYWcgIi1ETkFUSVZFX0NPREUiIHdpbGwgYmUgcGFzc2VkIGF1dG9tYXRpY2FsbHkKLSAgICAgICAgICAgICAgICAgICAgaWYgeW91IGNob29zZSB0byBidWlsZCBuYXRpdmUgY29kZS4gVGhpcyBhbGxvd3MgeW91Ci0gICAgICAgICAgICAgICAgICAgIHRvIGNvbXBpbGUgeW91ciBDLWZpbGVzIGNvbmRpdGlvbmFsbHkuIEJ1dCBwbGVhc2UKLSAgICAgICAgICAgICAgICAgICAgbm90ZTogWW91IHNob3VsZCBkbyBhICJtYWtlIGNsZWFuIiBvciByZW1vdmUgdGhlCi0gICAgICAgICAgICAgICAgICAgIG9iamVjdCBmaWxlcyBtYW51YWxseSBvciB0b3VjaCB0aGUgJS5jLWZpbGVzOgotICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UsIHRoZXkgbWF5IG5vdCBiZSBjb3JyZWN0bHkgcmVjb21waWxlZAotICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIGRpZmZlcmVudCBidWlsZHMuCi0KLSAgKiBDWFhGTEFHUyAgICAgIC0gYWRkaXRpb25hbCBmbGFncyBwYXNzZWQgdG8gdGhlIEMrKy1jb21waWxlci4KLQotICAqIENQUEZMQUdTICAgICAgLSBhZGRpdGlvbmFsIGZsYWdzIHBhc3NlZCB0byB0aGUgQy1wcmVwcm9jZXNzb3IuCi0KLSAgKiBDRlJBTUVXT1JLUyAgIC0gT2JqZWN0aXZlLUMgZnJhbWV3b3JrIHRvIHBhc3MgdG8gbGlua2VyIG9uIE1hY09TIFguCi0KLSAgKiBMREZMQUdTICAgICAgIC0gYWRkaXRpb25hbCBmbGFncyBwYXNzZWQgdG8gdGhlIEMtbGlua2VyCi0KLSAgKiBSUEFUSF9GTEFHICAgIC0gZmxhZyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgQy1saW5rZXIgdG8gc2V0IGEgcGF0aCBmb3IKLSAgICAgICAgICAgICAgICAgICAgZHluYW1pYyBsaWJyYXJpZXMuICBNYXkgbmVlZCB0byBiZSBzZXQgYnkgdXNlciBvbgotICAgICAgICAgICAgICAgICAgICBleG90aWMgcGxhdGZvcm1zLiAgKGRlZmF1bHQ6ICItUiIpLgotCi0gICogRUxGX1JQQVRIX0ZMQUcgLSB0aGlzIGZsYWcgaXMgdXNlZCB0byBzZXQgdGhlIHJwYXRoIG9uIEVMRi1wbGF0Zm9ybXMuCi0gICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogIi1SIikKLQotICAqIEVMRl9SUEFUSCAgICAgLSBpZiB0aGlzIGZsYWcgaXMgInllcyIsIHRoZW4gdGhlIFJQQVRIX0ZMQUcgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICBwYXNzZWQgYnkgIi1XbCIgdG8gdGhlIGxpbmtlciBhcyBub3JtYWwgb24KLSAgICAgICAgICAgICAgICAgICAgRUxGLXBsYXRmb3Jtcy4KLQotICAqIE9DQU1MTElCUEFUSCAgLSBwYXRoIHRvIHRoZSBPQ2FtbC1zdGFuZGFyZC1saWJyYXJpZXMKLSAgICAgICAgICAgICAgICAgICAgKGZpcnN0IGRlZmF1bHQ6IGAkKE9DQU1MQykgLXdoZXJlYCkKLSAgICAgICAgICAgICAgICAgICAgKHNlY29uZCBkZWZhdWx0OiAiL3Vzci9sb2NhbC9saWIvb2NhbWwiKQotCi0gICogT0NBTUxfREVGQVVMVF9ESVJTIC0gYWRkaXRpb25hbCBwYXRoIGluIHdoaWNoIHRoZSB1c2VyIGNhbiBzdXBwbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IGRpcmVjdG9yaWVzIHRvIGhpcyBvd24gY29sbGVjdGlvbiBvZgotICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcy4gIFRoZSBpZGVhIGlzIHRvIHBhc3MgdGhpcyBhcyBhbiBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIHNvIHRoYXQgdGhlIE1ha2VmaWxlcyBkbyBub3QgaGF2ZSB0byBjb250YWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBwYXRoIGFsbCB0aGUgdGltZS4KLQotICAqIE9DQU1MRklORCAgICAgLSBvY2FtbGZpbmQgZnJvbSBmaW5kbGliICAgICAgIChkZWZhdWx0OiAib2NhbWxmaW5kIikKLSAgKiBPQ0FNTEMgICAgICAgIC0gYnl0ZS1jb2RlIGNvbXBpbGVyICAgICAgICAgICAoZGVmYXVsdDogIm9jYW1sYyIpCi0gICogT0NBTUxPUFQgICAgICAtIG5hdGl2ZS1jb2RlIGNvbXBpbGVyICAgICAgICAgKGRlZmF1bHQ6ICJvY2FtbG9wdCIpCi0gICogT0NBTUxNS1RPUCAgICAtIHRvcC1sZXZlbCBjb21waWxlciAgICAgICAgICAgKGRlZmF1bHQ6ICJvY2FtbG1rdG9wIikKLSAgKiBPQ0FNTENQICAgICAgIC0gcHJvZmlsaW5nIGJ5dGUtY29kZSBjb21waWxlciAoZGVmYXVsdDogIm9jYW1sY3AiKQotICAqIE9DQU1MREVQICAgICAgLSBkZXBlbmRlbmN5IGdlbmVyYXRvciAgICAgICAgIChkZWZhdWx0OiAib2NhbWxkZXAiKQotICAqIE9DQU1MTEVYICAgICAgLSBzY2FubmVyIGdlbmVyYXRvciAgICAgICAgICAgIChkZWZhdWx0OiAib2NhbWxsZXgiKQotICAqIE9DQU1MWUFDQyAgICAgLSBwYXJzZXIgZ2VuZXJhdG9yICAgICAgICAgICAgIChkZWZhdWx0OiAib2NhbWx5YWNjIikKLSAgKiBPQ0FNTE1LTElCICAgIC0gdG9vbCB0byBjcmVhdGUgbGlicmFyaWVzICAgICAoZGVmYXVsdDogIm9jYW1sbWtsaWIiKQotICAqIENBTUxJREwgICAgICAgLSBJREwtY29kZSBnZW5lcmF0b3IgICAgICAgICAgIChkZWZhdWx0OiAiY2FtbGlkbCIpCi0gICogQ0FNTElETERMTCAgICAtIElETC11dGlsaXR5ICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6ICJjYW1saWRsZGxsIikKLSAgKiBDQU1MUDQgICAgICAgIC0gY2FtbHA0IHByZXByb2Nlc3NvciAgICAgICAgICAoZGVmYXVsdDogImNhbWxwNCIpCi0gICogT0NBTUxET0MgICAgICAtIE9DYW1sZG9jLWNvbW1hbmQgICAgICAgICAgICAgKGRlZmF1bHQ6ICJvY2FtbGRvYyIpCi0KLSAgKiBMQVRFWCAgICAgICAgIC0gTGF0ZXgtcHJvY2Vzc29yICAgICAgICAgICAgICAoZGVmYXVsdDogImxhdGV4IikKLSAgKiBEVklQUyAgICAgICAgIC0gZHZpcHMtY29tbWFuZCAgICAgICAgICAgICAgICAoZGVmYXVsdDogImR2aXBzIikKLSAgKiBQUzJQREYgICAgICAgIC0gUG9zdFNjcmlwdC10by1QREYgY29udmVydGVyICAoZGVmYXVsdDogInBzMnBkZiIpCi0KLSAgKiBDQU1FTEVPTl9SRVBPUlQgLSByZXBvcnQgdG9vbCBvZiBDYW1lbGVvbiAgKGRlZmF1bHQ6ICJyZXBvcnQiKQotICAqIENBTUVMRU9OX1JFUE9SVF9GTEFHUyAtIGZsYWdzIGZvciB0aGUgcmVwb3J0IHRvb2wgb2YgQ2FtZWxlb24KLQotICAqIENBTUVMRU9OX1pPR0dZIC0gem9nZ3kgdG9vbCBvZiBDYW1lbGVvbgotICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6ICJjYW1scDRvIHBhX3pvZy5jbWEgcHJfby5jbW8iKQotICAqIENBTUVMRU9OX1pPR0dZX0ZMQUdTIC0gZmxhZ3MgZm9yIHRoZSB6b2dneSB0b29sIG9mIENhbWVsZW9uCi0KLSAgKiBPQ0FNTF9HTEFERUNDIC0gR2xhZGUgY29tcGlsZXIgZm9yIE9DYW1sICAgICAoZGVmYXVsdDogImxhYmxnbGFkZWNjMiIpCi0gICogT0NBTUxfR0xBREVDQ19GTEFHUyAtIGZsYWdzIGZvciB0aGUgR2xhZGUgY29tcGlsZXIKLQotICAqIE9YUklETCAgICAgICAgLSBPWFJJREwtZ2VuZXJhdG9yICAoZGVmYXVsdDogIm94cmlkbCIpCi0KLSAgKiBOT0lETEhFQURFUiAgIC0gc2V0IHRvICJ5ZXMiIHRvIHByb2hpYml0ICJPQ2FtbE1ha2VmaWxlIiBmcm9tIHVzaW5nCi0gICAgICAgICAgICAgICAgICAgIHRoZSBkZWZhdWx0IGNhbWxpZGwtZmxhZyAiLWhlYWRlciIuCi0KLSAgKiBOT19DVVNUT00gICAgIC0gUHJldmVudCBsaW5raW5nIGluIGN1c3RvbSBtb2RlLgotCi0gICogUVVJRVQgICAgICAgICAtIHVuc2V0dGluZyB0aGlzIHZhcmlhYmxlIChlLmcuICJtYWtlIFFVSUVUPSIpCi0gICAgICAgICAgICAgICAgICAgIHdpbGwgcHJpbnQgYWxsIGV4ZWN1dGVkIGNvbW1hbmRzLCBpbmNsdWRpbmcKLSAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlIG9uZXMuIFRoaXMgYWxsb3dzIG1vcmUgY29tZm9ydGFibGUKLSAgICAgICAgICAgICAgICAgICAgZGVidWdnaW5nIHdoZW4gdGhpbmdzIGdvIHdyb25nIGR1cmluZyBhIGJ1aWxkLgotCi0gICogUkVBTExZX1FVSUVUICAtIHdoZW4gc2V0IHRoaXMgZmxhZyB0dXJucyBvZmYgb3V0cHV0IGZyb20gc29tZSBjb21tYW5kcy4KLQotICAqIE9DQU1MTUFLRUZJTEUgLSBsb2NhdGlvbiBvZiAoPXBhdGggdG8pIHRoaXMgIk9DYW1sTWFrZWZpbGUiLgotICAgICAgICAgICAgICAgICAgICBCZWNhdXNlIGl0IGNhbGxlcyBpdHNlbGYgcmVjdXJzaXZlbHksIGl0IGhhcyB0bwotICAgICAgICAgICAgICAgICAgICBrbm93IHdoZXJlIGl0IGlzLiAoZGVmYXVsdDogIk9DYW1sTWFrZWZpbGUiID0KLSAgICAgICAgICAgICAgICAgICAgbG9jYWwgZGlyZWN0b3J5KQotCi0gICogQkNTVUZGSVggICAgICAtIFN1ZmZpeCBmb3IgYWxsIGJ5dGUtY29kZSBmaWxlcy4gRS5nLjoKLQotICAgICAgICAgICAgICAgICAgICAgIFJFU1VMVCAgID0gZm9vCi0gICAgICAgICAgICAgICAgICAgICAgQkNTVUZGSVggPSBfYmMKLQotICAgICAgICAgICAgICAgICAgICBUaGlzIHdpbGwgcHJvZHVjZSBieXRlLWNvZGUgZXhlY3V0YWJsZXMvbGlicmFyaWVzCi0gICAgICAgICAgICAgICAgICAgIHdpdGggYmFzZW5hbWUgImZvb19iYyIuCi0KLSAgKiBOQ1NVRkZJWCAgICAgIC0gU2ltaWxhciB0byAiQkNTVUZGSVgiLCBidXQgZm9yIG5hdGl2ZS1jb2RlIGZpbGVzLgotICAqIFRPUFNVRkZJWCAgICAgLSBTdWZmaXggYWRkZWQgdG8gdG9wbGV2ZWwgaW50ZXJwcmV0ZXJzIChkZWZhdWx0OiAiLnRvcCIpCi0KLSAgKiBTVUJQUk9KUyAgICAgIC0gdmFyaWFibGUgY29udGFpbmluZyB0aGUgbmFtZXMgb2Ygc3VicHJvamVjdHMgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgY29tcGlsZWQuCi0KLSAgKiBTVUJUQVJHRVQgICAgIC0gdGFyZ2V0IHRvIGJlIGJ1aWx0IGZvciBhbGwgcHJvamVjdHMgaW4gdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgU1VCUFJPSlMuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIHZhcmlhYmxlcyBmb3IgV2luZG93cyB1c2VycwotCi0gICogTUlOR1cgICAgICAgICAtIHZhcmlhYmxlIHRvIGRldGVjdCB0aGUgTUlOR1ctZW52aXJvbm1lbnQKLSAgKiBNU1ZDICAgICAgICAgIC0gdmFyaWFibGUgdG8gZGV0ZWN0IHRoZSBNU1ZDLWNvbXBpbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1VcC10by1kYXRlIGluZm9ybWF0aW9uIChuZXdlc3QgcmVsZWFzZSBvZiBkaXN0cmlidXRpb24pIGNhbiBhbHdheXMgYmUKLWZvdW5kIGF0OgotCi0gIGh0dHA6Ly93d3cub2NhbWwuaW5mby9ob21lL29jYW1sX3NvdXJjZXMuaHRtbAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRW5qb3khCi0KLU5ldyBZb3JrLCAyMDA3LTA0LTIyCi1NYXJrdXMgTW90dGwKLQotZS1tYWlsOiBtYXJrdXMubW90dGxAZ21haWwuY29tCi1XV1c6ICAgIGh0dHA6Ly93d3cub2NhbWwuaW5mbwpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL1JFQURNRSBiL2xpYi9vY2FtbC9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9vY2FtbC9SRUFETUUKcmVuYW1lIHRvIGxpYi9vY2FtbC9SRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9fb2FzaXMgYi9saWIvb2NhbWwvX29hc2lzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZDkwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb2NhbWwvX29hc2lzCkBAIC0wLDAgKzEsMTkgQEAKK05hbWU6IGxpYnRocmlmdC1vY2FtbAorVmVyc2lvbjogMS4wLjAKK09BU0lTRm9ybWF0OiAwLjMKK1N5bm9wc2lzOiBPQ2FtbCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbQorQXV0aG9yczogQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CitMaWNlbnNlOiBBcGFjaGUtMi4wCitIb21lcGFnZTogaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCitCdWlsZFRvb2xzOiBvY2FtbGJ1aWxkCitQbHVnaW5zOiAgICAgTUVUQSAoMC4zKSwKKyAgRGV2RmlsZXMgKDAuMykKKworTGlicmFyeSAibGlidGhyaWZ0LW9jYW1sIgorICBQYXRoOiBzcmMKKyAgRmluZGxpYk5hbWU6IHRocmlmdAorICBidWlsZFRvb2xzOiBvY2FtbGJ1aWxkCisgIEJ1aWxkRGVwZW5kczogdGhyZWFkcworICBNb2R1bGVzOiBUaHJpZnQsVEJpbmFyeVByb3RvY29sLFRTb2NrZXQsVEZyYW1lZFRyYW5zcG9ydCxUQ2hhbm5lbFRyYW5zcG9ydCxUU2VydmVyLFRTaW1wbGVTZXJ2ZXIsVFNlcnZlclNvY2tldCxUVGhyZWFkZWRTZXJ2ZXIKKyAgWE1FVEFSZXF1aXJlczogdGhyZWFkcworCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9vY2FtbC9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb2NhbWwvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9kZXNjciBiL2xpYi9vY2FtbC9kZXNjcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDE3NDlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29jYW1sL2Rlc2NyCkBAIC0wLDAgKzEgQEAKK09DYW1sIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvb3BhbSBiL2xpYi9vY2FtbC9vcGFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYmMzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb2NhbWwvb3BhbQpAQCAtMCwwICsxLDggQEAKK29wYW0tdmVyc2lvbjogIjEiCittYWludGFpbmVyOiAiWFhYKEZJTEwgTUUgSU4gV0lUSCBFTUFJTCkiCitidWlsZDogWworICBbbWFrZV0KKyAgW21ha2UgImluc3RhbGwiXQorXQorcmVtb3ZlOiBbWyJvY2FtbGZpbmQiICJyZW1vdmUiICJ0aHJpZnQiXV0KK2RlcGVuZHM6IFsib2NhbWxmaW5kIl0KZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9zcmMvVGhyaWZ0Lm1sIGIvbGliL29jYW1sL3NyYy9UaHJpZnQubWwKaW5kZXggYmMyZDJjMy4uZjBkN2E0MiAxMDA2NDQKLS0tIGEvbGliL29jYW1sL3NyYy9UaHJpZnQubWwKKysrIGIvbGliL29jYW1sL3NyYy9UaHJpZnQubWwKQEAgLTI2MSw2ICsyNjEsOCBAQAogICAgICAgfCBORUdBVElWRV9TSVpFCiAgICAgICB8IFNJWkVfTElNSVQKICAgICAgIHwgQkFEX1ZFUlNJT04KKyAgICAgIHwgTk9UX0lNUExFTUVOVEVECisgICAgICB8IERFUFRIX0xJTUlUCiAKICAgZXhjZXB0aW9uIEUgb2YgZXhuX3R5cGUgKiBzdHJpbmc7OwogCkBAIC0yOTQsNiArMjk2LDkgQEAKICAgICAgIHwgTUlTU0lOR19SRVNVTFQKICAgICAgIHwgSU5URVJOQUxfRVJST1IKICAgICAgIHwgUFJPVE9DT0xfRVJST1IKKyAgICAgIHwgSU5WQUxJRF9UUkFOU0ZPUk0KKyAgICAgIHwgSU5WQUxJRF9QUk9UT0NPTAorICAgICAgfCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRQogCiAgIGxldCB0eXBfb2ZfaSA9IGZ1bmN0aW9uCiAgICAgICAwbCAtPiBVTktOT1dOCkBAIC0zMDIsOCArMzA3LDExIEBACiAgICAgfCAzbCAtPiBXUk9OR19NRVRIT0RfTkFNRQogICAgIHwgNGwgLT4gQkFEX1NFUVVFTkNFX0lECiAgICAgfCA1bCAtPiBNSVNTSU5HX1JFU1VMVAotICAgIHwgNjEgLT4gSU5URVJOQUxfRVJST1IKLSAgICB8IDcxIC0+IFBST1RPQ09MX0VSUk9SCisgICAgfCA2bCAtPiBJTlRFUk5BTF9FUlJPUgorICAgIHwgN2wgLT4gUFJPVE9DT0xfRVJST1IKKyAgICB8IDhsIC0+IElOVkFMSURfVFJBTlNGT1JNCisgICAgfCA5bCAtPiBJTlZBTElEX1BST1RPQ09MCisgICAgfCAxMGwgLT4gVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUKICAgICB8IF8gLT4gcmFpc2UgVGhyaWZ0X2Vycm9yOzsKICAgbGV0IHR5cF90b19pID0gZnVuY3Rpb24KICAgICB8IFVOS05PV04gLT4gMGwKQEAgLTMxMiw4ICszMjAsMTEgQEAKICAgICB8IFdST05HX01FVEhPRF9OQU1FIC0+IDNsCiAgICAgfCBCQURfU0VRVUVOQ0VfSUQgLT4gNGwKICAgICB8IE1JU1NJTkdfUkVTVUxUIC0+IDVsCi0gICAgfCBJTlRFUk5BTF9FUlJPUiAtPiA2MQotICAgIHwgUFJPVE9DT0xfRVJST1IgLT4gNzEKKyAgICB8IElOVEVSTkFMX0VSUk9SIC0+IDZsCisgICAgfCBQUk9UT0NPTF9FUlJPUiAtPiA3bAorICAgIHwgSU5WQUxJRF9UUkFOU0ZPUk0gLT4gOGwKKyAgICB8IElOVkFMSURfUFJPVE9DT0wgLT4gOWwKKyAgICB8IFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFIC0+IDEwbAogCiAgIGNsYXNzIHQgPQogICBvYmplY3QgKHNlbGYpCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvdXJsIGIvbGliL29jYW1sL3VybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTRkNjA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29jYW1sL3VybApAQCAtMCwwICsxLDIgQEAKK2FyY2hpdmU6ICJYWFgoRklMTCBNRSBJTiBXSVRIIFVSTCkiCitjaGVja3N1bTogIlhYWChGSUxMIE1FIElOIFdJVEggTUQ1KSIKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL01BTklGRVNULlNLSVAgYi9saWIvcGVybC9NQU5JRkVTVC5TS0lQCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NjNiNDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9NQU5JRkVTVC5TS0lQCkBAIC0wLDAgKzEsMTMgQEAKK2JsaWIvLiokCitidWlsZC1jcGFuLWRpc3Quc2gKK0ZpeHVwRGlzdC5wbAorTUFOSUZFU1QuYmFrCitNQU5JRkVTVC5TS0lQCitNWU1FVEEuanNvbgorTWFrZWZpbGUKK01ha2VmaWxlLmFtCitNYWtlZmlsZS5pbgorcG1fdG9fYmxpYgordGVzdC9NYWtlZmlsZS5hbQordGVzdC9NYWtlZmlsZS5pbgordG9vbHMvRml4dXBEaXN0LnBsCmRpZmYgLS1naXQgYS9saWIvcGVybC9NYWtlZmlsZS5QTCBiL2xpYi9wZXJsL01ha2VmaWxlLlBMCmluZGV4IDk0ZWEzN2MuLmJkZWFhZDIgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL01ha2VmaWxlLlBMCisrKyBiL2xpYi9wZXJsL01ha2VmaWxlLlBMCkBAIC0xNywxMyArMTcsMjAgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCiB1c2UgRXh0VXRpbHM6Ok1ha2VNYWtlcjsKLVdyaXRlTWFrZWZpbGUoICdOQU1FJyA9PiAnVGhyaWZ0JywKLSAgICAgICAgICAgICAgICdWRVJTSU9OX0ZST00nID0+ICdsaWIvVGhyaWZ0LnBtJywKLSAgICAgICAgICAgICAgICdQUkVSRVFfUE0nICAgICAgICAgICAgICA9PiB7Ci0gICAgICAgICAgICAgICAgICAgJ0JpdDo6VmVjdG9yJyA9PiAwLAorCitXcml0ZU1ha2VmaWxlKCBBQlNUUkFDVCA9PiAnQXBhY2hlIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMgZGV2ZWxvcG1lbnQuJywKKyAgICAgICAgICAgICAgIEFVVEhPUiA9PiAnQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPicsCisgICAgICAgICAgICAgICBMSUNFTlNFID0+ICdhcGFjaGVfMl8wJywKKyAgICAgICAgICAgICAgIE1JTl9QRVJMX1ZFUlNJT04gPT4gJzUuMDEwMDAwJywKKyAgICAgICAgICAgICAgIE5BTUUgPT4gJ1RocmlmdCcsCisgICAgICAgICAgICAgICBORUVEU19MSU5LSU5HID0+IDAsCisgICAgICAgICAgICAgICBQUkVSRVFfUE0gPT4geworICAgICAgICAgICAgICAgICAgICdCaXQ6OlZlY3RvcicgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgJ0NsYXNzOjpBY2Nlc3NvcicgPT4gMAogICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICgkXSA+PSA1LjAwNSA/Ci0gKCAgICAgICAgICAgICAgICBBVVRIT1IgICAgID0+ICdUIEpha2UgTHVjaWFuaSA8amFrZXJzQGdtYWlsLmNvbT4nKSA6ICgpKSwKLSAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICBWRVJTSU9OX0ZST00gPT4gJ2xpYi9UaHJpZnQucG0nICk7CmRpZmYgLS1naXQgYS9saWIvcGVybC9NYWtlZmlsZS5hbSBiL2xpYi9wZXJsL01ha2VmaWxlLmFtCmluZGV4IDhlMGNhYWUuLmZhMGYxNmIgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL01ha2VmaWxlLmFtCisrKyBiL2xpYi9wZXJsL01ha2VmaWxlLmFtCkBAIC0yMywzMyArMjMsODYgQEAKIAkkKFBFUkwpIE1ha2VmaWxlLlBMIE1BS0VGSUxFPU1ha2VmaWxlLXBlcmwubWsgSU5TVEFMTERJUlM9JChJTlNUQUxMRElSUykgSU5TVEFMTF9CQVNFPSQoUEVSTF9QUkVGSVgpCiAKIGFsbC1sb2NhbDogTWFrZWZpbGUtcGVybC5tawotCSQoTUFLRSkgLWYgTWFrZWZpbGUtcGVybC5taworCSQoTUFLRSkgLWYgJDwKIAlmaW5kIGJsaWIgLW5hbWUgJ01ha2VmaWxlKicgLWV4ZWMgcm0gLWYge30gXDsKIAotY2hlY2stbG9jYWw6Ci0JJChQRVJMKSAtSWJsaWIvbGliIC1JQGFic19zcmNkaXJAIC1JQGJ1aWxkZGlyQC90ZXN0L2dlbi1wZXJsIFwKLQkJQGFic19zcmNkaXJAL3Rlc3QucGwgQGFic19zcmNkaXJAL3Rlc3QvKi50Ci0KIGluc3RhbGwtZXhlYy1sb2NhbDogTWFrZWZpbGUtcGVybC5tawotCSQoTUFLRSkgLWYgTWFrZWZpbGUtcGVybC5tayBpbnN0YWxsIERFU1RESVI9JChERVNURElSKS8KKwkkKE1BS0UpIC1mICQ8IGluc3RhbGwgREVTVERJUj0kKERFU1RESVIpLwogCiBjbGVhbi1sb2NhbDoKIAlpZiB0ZXN0IC1mIE1ha2VmaWxlLXBlcmwubWsgOyB0aGVuIFwKIAkJJChNQUtFKSAtZiBNYWtlZmlsZS1wZXJsLm1rIGNsZWFuIDsgXAogCWZpCi0Jcm0gLWYgTWFrZWZpbGUtcGVybC5tay5vbGQKKwkkKFJNKSBNYWtlZmlsZS1wZXJsLm1rLm9sZAorCSQoUk0pIC1yIGdlbi1wZXJsIGdlbi1wZXJsMgogCiBFWFRSQV9ESVNUID0gXAorCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCWJ1aWxkLWNwYW4tZGlzdC5zaCBcCiAJTWFrZWZpbGUuUEwgXAogCXRlc3QucGwgXAogCWxpYi9UaHJpZnQucG0gXAogCWxpYi9UaHJpZnQucG0gXAogCWxpYi9UaHJpZnQvQmluYXJ5UHJvdG9jb2wucG0gXAogCWxpYi9UaHJpZnQvQnVmZmVyZWRUcmFuc3BvcnQucG0gXAorCWxpYi9UaHJpZnQvRXhjZXB0aW9uLnBtIFwKIAlsaWIvVGhyaWZ0L0ZyYW1lZFRyYW5zcG9ydC5wbSBcCiAJbGliL1RocmlmdC9IdHRwQ2xpZW50LnBtIFwKIAlsaWIvVGhyaWZ0L01lbW9yeUJ1ZmZlci5wbSBcCisJbGliL1RocmlmdC9NZXNzYWdlVHlwZS5wbSBcCisJbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb2Nlc3Nvci5wbSBcCisJbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb3RvY29sLnBtIFwKIAlsaWIvVGhyaWZ0L1Byb3RvY29sLnBtIFwKKwlsaWIvVGhyaWZ0L1Byb3RvY29sRGVjb3JhdG9yLnBtIFwKIAlsaWIvVGhyaWZ0L1NlcnZlci5wbSBcCisJbGliL1RocmlmdC9TZXJ2ZXJTb2NrZXQucG0gXAogCWxpYi9UaHJpZnQvU29ja2V0LnBtIFwKLQlsaWIvVGhyaWZ0L1RyYW5zcG9ydC5wbQorCWxpYi9UaHJpZnQvU1NMU29ja2V0LnBtIFwKKwlsaWIvVGhyaWZ0L1NTTFNlcnZlclNvY2tldC5wbSBcCisJbGliL1RocmlmdC9Vbml4U2VydmVyU29ja2V0LnBtIFwKKwlsaWIvVGhyaWZ0L1VuaXhTb2NrZXQucG0gXAorCWxpYi9UaHJpZnQvVHlwZS5wbSBcCisJbGliL1RocmlmdC9UcmFuc3BvcnQucG0gXAorCVJFQURNRS5tZAorCitUSFJJRlQgPSBAdG9wX2J1aWxkZGlyQC9jb21waWxlci9jcHAvdGhyaWZ0CitUSFJJRlRfSUYgPSBAdG9wX3NyY2RpckAvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorTkFNRV9CRU5DSE1BUktTRVJWSUNFID0gIEB0b3Bfc3JjZGlyQC9saWIvcmIvYmVuY2htYXJrL0JlbmNobWFyay50aHJpZnQKK05BTUVfQUdHUiA9IEB0b3Bfc3JjZGlyQC9jb250cmliL2FzeW5jLXRlc3QvYWdnci50aHJpZnQKKworVEhSSUZUVEVTVF9HRU4gPSBcCisJZ2VuLXBlcmwvVGhyaWZ0VGVzdC9Db25zdGFudHMucG0gXAorCWdlbi1wZXJsL1RocmlmdFRlc3QvU2Vjb25kU2VydmljZS5wbSBcCisJZ2VuLXBlcmwvVGhyaWZ0VGVzdC9UaHJpZnRUZXN0LnBtIFwKKwlnZW4tcGVybC9UaHJpZnRUZXN0L1R5cGVzLnBtCisKK0JFTkNITUFSS19HRU4gPSBcCisJZ2VuLXBlcmwvQmVuY2htYXJrU2VydmljZS5wbSBcCisJZ2VuLXBlcmwvQ29uc3RhbnRzLnBtIFwKKwlnZW4tcGVybC9UeXBlcy5wbQorCitBR0dSX0dFTiA9IFwKKwlnZW4tcGVybDIvQWdnci5wbSBcCisJZ2VuLXBlcmwyL0NvbnN0YW50cy5wbSBcCisJZ2VuLXBlcmwyL1R5cGVzLnBtCisKK1BFUkxfR0VOID0gXAorCSQoVEhSSUZUVEVTVF9HRU4pIFwKKwkkKEJFTkNITUFSS19HRU4pIFwKKwkkKEFHR1JfR0VOKQorCitCVUlMVF9TT1VSQ0VTID0gJChQRVJMX0dFTikKKworY2hlY2stbG9jYWw6ICQoUEVSTF9HRU4pCisJJChQRVJMKSAtSWJsaWIvbGliIC1JQGFic19zcmNkaXJAIC1JQGJ1aWxkZGlyQC9nZW4tcGVybDIgLUlAYnVpbGRkaXJAL2dlbi1wZXJsIFwKKwkJQGFic19zcmNkaXJAL3Rlc3QucGwgQGFic19zcmNkaXJAL3Rlc3QvKi50CisKKyQoVEhSSUZUVEVTVF9HRU4pOiAkKFRIUklGVF9JRikgJChUSFJJRlQpCisJJChUSFJJRlQpIC0tZ2VuIHBlcmwgJDwKKworJChCRU5DSE1BUktfR0VOKTogJChOQU1FX0JFTkNITUFSS1NFUlZJQ0UpICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtLWdlbiBwZXJsICQ8CisKKyQoQUdHUl9HRU4pOiAkKE5BTUVfQUdHUikgJChUSFJJRlQpCisJJChNS0RJUl9QKSBnZW4tcGVybDIKKwkkKFRIUklGVCkgLW91dCBnZW4tcGVybDIgLS1nZW4gcGVybCAkPApkaWZmIC0tZ2l0IGEvbGliL3BlcmwvUkVBRE1FIGIvbGliL3BlcmwvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTE0ODhiLi4wMDAwMDAwCi0tLSBhL2xpYi9wZXJsL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLVRocmlmdCBQZXJsIFNvZnR3YXJlIExpYnJhcnkKLQotTGljZW5zZQotPT09PT09PQotCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLQotVXNpbmcgVGhyaWZ0IHdpdGggUGVybAotPT09PT09PT09PT09PT09PT09PT09Ci0KLVRocmlmdCByZXF1aXJlcyBQZXJsID49IDUuNi4wCi0KLUV4Y2VwdGlvbnMgYXJlIHRocm93biB3aXRoIGRpZSBzbyBiZSBzdXJlIHRvIHdyYXAgZXZhbHt9IHN0YXRtZW50cwotYXJvdW5kIGFueSBjb2RlIHRoYXQgY29udGFpbnMgZXhjZXB0aW9ucy4KLQotVGhlIDY0Yml0IEludGVnZXJzIHdvcmsgb25seSB1cHRvIDJeNDIgb24gbXkgbWFjaGluZSA6LT8KLU1hdGg6OkJpZ0ludCBpcyBwcm9iYWJseSBuZWVkZWQuCi0KLVBsZWFzZSBzZWUgdHV0b3JhbCBhbmQgdGVzdCBkaXJzIGZvciBleGFtcGxlcy4uLgotCi1EZXBlbmRlbmNpZXMKLT09PT09PT09PT09PQotCi1CaXQ6OlZlY3RvciAgICAgLSBjb21lcyB3aXRoIG1vZGVybiBwZXJsIGluc3RhbGxhdGlvbnMuCi1DbGFzczo6QWNjZXNzb3IKLQpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvUkVBRE1FLm1kIGIvbGliL3BlcmwvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMWU1YjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9SRUFETUUubWQKQEAgLTAsMCArMSwxMjQgQEAKK1RocmlmdCBQZXJsIFNvZnR3YXJlIExpYnJhcnkKKworIyBTdW1tYXJ5CisKK0FwYWNoZSBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzIGRldmVsb3BtZW50LgorSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0byBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsKK2VmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5IGJldHdlZW4gbWFueSBwcm9ncmFtbWluZyBsYW5ndWFnZXMuICBBIGxhbmd1YWdlLW5ldXRyYWwgSURMCitpcyB1c2VkIHRvIGdlbmVyYXRlIGZ1bmN0aW9uaW5nIGNsaWVudCBsaWJyYXJpZXMgYW5kIHNlcnZlci1zaWRlIGhhbmRsaW5nIGZyYW1ld29ya3MuCisKKyMgTGljZW5zZQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworIyBGb3IgTW9yZSBJbmZvcm1hdGlvbgorCitTZWUgdGhlIFtBcGFjaGUgVGhyaWZ0IFdlYiBTaXRlXShodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworIyBVc2luZyBUaHJpZnQgd2l0aCBQZXJsCisKK1RocmlmdCByZXF1aXJlcyBQZXJsID49IDUuMTAuMAorCitVbmV4cGVjdGVkIGV4Y2VwdGlvbnMgaW4gYSBzZXJ2aWNlIGhhbmRsZXIgYXJlIGNvbnZlcnRlZCB0bworVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHdpdGggdHlwZSBJTlRFUk5BTCBFUlJPUiBhbmQgdGhlIHN0cmluZworb2YgdGhlIGV4Y2VwdGlvbiBpcyBkZWxpdmVyZWQgYXMgdGhlIG1lc3NhZ2UuCisKK09uIHRoZSBjbGllbnQgc2lkZSwgZXhjZXB0aW9ucyBhcmUgdGhyb3duIHdpdGggZGllLCBzbyBiZSBzdXJlCit0byB3cmFwIGV2YWx7fSBzdGF0bWVudHMgYXJvdW5kIGFueSBjb2RlIHRoYXQgY29udGFpbnMgZXhjZXB0aW9ucy4KKworUGxlYXNlIHNlZSB0dXRvcmFsIGFuZCB0ZXN0IGRpcnMgZm9yIGV4YW1wbGVzLgorCitUaGUgUGVybCBGb3JraW5nU2VydmVyIGlnbm9yZXMgU0lHQ0hMRCBhbGxvd2luZyB0aGUgZm9ya3MgdG8gYmUKK3JlYXBlZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSBuYXR1cmFsbHkgd2hlbiB0aGV5IGV4aXQuICBUaGlzIG1lYW5zCitvbmUgY2Fubm90IHVzZSBhIGN1c3RvbSBTSUdDSExEIGhhbmRsZXIgaW4gdGhlIGNvbnN1bWluZyBwZXJsCitpbXBsZW1lbnRhdGlvbiB0aGF0IGNhbGxzIHNlcnZlKCkuICBJdCBpcyBhY2NlcHRhYmxlIHRvIHVzZQorYSBjdXN0b20gU0lHQ0hMRCBoYW5kbGVyIHdpdGhpbiBhIHRocmlmdCBoYW5kbGVyIGltcGxlbWVudGF0aW9uCithcyB0aGUgRm9ya2luZ1NlcnZlciByZXNldHMgdGhlIGZvcmtlZCBjaGlsZCBwcm9jZXNzIHRvIHVzZQorZGVmYXVsdCBzaWduYWwgaGFuZGxpbmcuCisKKyMgRGVwZW5kZW5jaWVzCisKK1RoZSBmb2xsb3dpbmcgbW9kdWxlcyBhcmUgbm90IHByb3ZpZGVkIGJ5IFBlcmwgNS4xMC4wIGJ1dCBhcmUgcmVxdWlyZWQKK3RvIHVzZSBUaHJpZnQuCisKKyMjIFJ1bnRpbWUKKworICAqIEJpdDo6VmVjdG9yCisgICogQ2xhc3M6OkFjY2Vzc29yCisKKyMjIyBIdHRwQ2xpZW50IFRyYW5zcG9ydAorCitUaGVzZSBhcmUgb25seSByZXF1aXJlZCBpZiB1c2luZyBUaHJpZnQ6Okh0dHBDbGllbnQ6CisKKyAgKiBIVFRQOjpSZXF1ZXN0CisgICogSU86OlN0cmluZworICAqIExXUDo6VXNlckFnZW50CisKKyMjIyBTU0wvVExTCisKK1RoZXNlIGFyZSBvbmx5IHJlcXVpcmVkIGlmIHVzaW5nIFRocmlmdDo6U1NMU29ja2V0IG9yIFRocmlmdDo6U1NMU2VydmVyU29ja2V0OgorCisgICogSU86OlNvY2tldDo6U1NMCisKKyMgQnJlYWtpbmcgQ2hhbmdlcworCisjIyAwLjEwLjAKKworVGhlIHNvY2tldCBjbGFzc2VzIHdlcmUgcmVmYWN0b3JlZCBpbiAwLjEwLjAgc28gdGhhdCB0aGVyZSBpcyBvbmUgcGFja2FnZSBwZXIKK2ZpbGUuICBUaGlzIG1lYW5zIGB1c2UgU29ja2V0O2Agbm8gbG9uZ2VyIGRlZmluZXMgU1NMU29ja2V0LiAgWW91IGNhbiB1c2UgdGhpcwordGVjaG5pcXVlIHRvIG1ha2UgeW91ciBhcHBsaWNhdGlvbiBydW4gYWdhaW5zdCAwLjEwLjAgYXMgd2VsbCBhcyBlYXJsaWVyIHZlcnNpb25zOgorCitgZXZhbCB7IHJlcXVpcmUgVGhyaWZ0OjpTU0xTb2NrZXQ7IH0gb3IgZG8geyByZXF1aXJlIFRocmlmdDo6U29ja2V0OyB9YAorCisjIyAwLjExLjAKKworICAqIE5hbWVzcGFjZXMgb2YgcGFja2FnZXMgdGhhdCB3ZXJlIG5vdCBzY29wZWQgd2l0aGluIFRocmlmdCBoYXZlIGJlZW4gZml4ZWQuCisgICoqIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBpcyBub3cgVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24KKyAgKiogVEV4Y2VwdGlvbiBpcyBub3cgVGhyaWZ0OjpURXhjZXB0aW9uCisgICoqIFRNZXNzYWdlVHlwZSBpcyBub3cgVGhyaWZ0OjpUTWVzc2FnZVR5cGUKKyAgKiogVFByb3RvY29sRXhjZXB0aW9uIGlzIG5vdyBUaHJpZnQ6OlRQcm90b2NvbEV4Y2VwdGlvbgorICAqKiBUUHJvdG9jb2xGYWN0b3J5IGlzIG5vdyBUaHJpZnQ6OlRQcm90b2NvbEZhY3RvcnkKKyAgKiogVFRyYW5zcG9ydEV4Y2VwdGlvbiBpcyBub3cgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uCisgICoqIFRUeXBlIGlzIG5vdyBUaHJpZnQ6OlRUeXBlCisKK0lmIHlvdSBuZWVkIGEgc2luZ2xlIHZlcnNpb24gb2YgeW91ciBjb2RlIHRvIHdvcmsgd2l0aCBib3RoIG9sZGVyIGFuZCBuZXdlciB0aHJpZnQKK25hbWVzcGFjZSBjaGFuZ2VzLCB5b3UgY2FuIG1ha2UgdGhlIG5ldywgY29ycmVjdCBuYW1lc3BhY2VzIGJlaGF2ZSBsaWtlIHRoZSBvbGQgb25lcworaW4geW91ciBmaWxlcyB3aXRoIHRoaXMgdGVjaG5pcXVlIHRvIGNyZWF0ZSBhbiBhbGlhcywgd2hpY2ggd2lsbCBhbGxvdyB5b3UgY29kZSB0bworcnVuIGFnYWluc3QgZWl0aGVyIHZlcnNpb24gb2YgdGhlIHBlcmwgcnVudGltZSBmb3IgdGhyaWZ0OgorCitgQkVHSU4geypUVHlwZTo6ID0gKlRocmlmdDo6VFR5cGU6On1gCisKKyAgKiBQYWNrYWdlcyBmb3VuZCBpbiBUaHJpZnQucG0gd2VyZSBtb3ZlZCBpbnRvIHRoZSBUaHJpZnQvIGRpcmVjdG9yeSBpbiBzZXBhcmF0ZSBmaWxlczoKKyAgKiogVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24gaXMgbm93IGluIFRocmlmdC9FeGNlcHRpb24ucG0KKyAgKiogVGhyaWZ0OjpURXhjZXB0aW9uIGlzIG5vdyBpbiBUaHJpZnQvRXhjZXB0aW9uLnBtCisgICoqIFRocmlmdDo6VE1lc3NhZ2VUeXBlIGlzIG5vdyBpbiBUaHJpZnQvTWVzc2FnZVR5cGUucG0KKyAgKiogVGhyaWZ0OjpUVHlwZSBpcyBub3cgaW4gVGhyaWZ0L1R5cGUucG0KKworSWYgeW91IG5lZWQgdG8gbW9kaWZ5IHlvdXIgY29kZSB0byB3b3JrIGFnYWluc3QgYm90aCBvbGRlciBvciBuZXdlciB0aHJpZnQgdmVyc2lvbnMsCit5b3UgY2FuIGRlYWwgd2l0aCB0aGVzZSBjaGFuZ2VzIGluIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgd2F5IGluIHlvdXIgcHJvamVjdHMgdXNpbmcgZXZhbDoKKworYGV2YWwgIHsgcmVxdWlyZSBUaHJpZnQ6OkV4Y2VwdGlvbjsgcmVxdWlyZSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlOyByZXF1aXJlIFRocmlmdDo6VHlwZTsgfQorIG9yIGRvIHsgcmVxdWlyZSBUaHJpZnQ7IH1gCisKKyMgRGVwcmVjYXRpb25zCisKKyMjIDAuMTEuMAorCitUaHJpZnQ6Okh0dHBDbGllbnQgc2V0UmVjdlRpbWVvdXQoKSBhbmQgc2V0U2VuZFRpbWVvdXQoKSBhcmUgZGVwcmVjYXRlZC4gCitVc2Ugc2V0VGltZW91dCBpbnN0ZWFkLgorCmRpZmYgLS1naXQgYS9saWIvcGVybC9idWlsZC1jcGFuLWRpc3Quc2ggYi9saWIvcGVybC9idWlsZC1jcGFuLWRpc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWUyMmU3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2J1aWxkLWNwYW4tZGlzdC5zaApAQCAtMCwwICsxLDUzIEBACisjIS9iaW4vYmFzaAorIworIyBUaGlzIHNjcmlwdCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFmdGVyIHRhZ2dpbmcgdGhlIHJlcG9zaXRvcnkgYW5kIHVwZGF0aW5nCisjIHRoZSB2ZXJzaW9uIGZpbGVzIGZvciBhIHJlbGVhc2UuICBJdCB3aWxsIGNyZWF0ZSBhIENQQU4gYXJjaGl2ZS4gIFJ1biB0aGlzCisjIGZyb20gaW5zaWRlIGEgZG9ja2VyIGltYWdlIGxpa2UgdWJ1bnR1LXhlbmlhbC4KKyMKKworc2V0IC1lCisKK3JtIC1mIE1BTklGRVNUCitybSAtcmYgVGhyaWZ0LSoKKworIyBzZXR1cCBjcGFuIHdpdGhvdXQgYSBwcm9tcHQKK2VjaG8gfCBjcGFuCitjcGFuIGluc3RhbGwgSFRUUDo6RGF0ZQorY3BhbiBpbnN0YWxsIENQQU4KK2NwYW4gaW5zdGFsbCBDUEFOOjpNZXRhIEV4dFV0aWxzOjpNYWtlTWFrZXIgSlNPTjo6UFAKKworcGVybCBNYWtlZmlsZS5QTAorcm0gTVlNRVRBLnltbAorbWFrZSBtYW5pZmVzdAorbWFrZSBkaXN0CisKKyMKKyMgV2UgdW5wYWNrIHRoZSBhcmNoaXZlIHNvIHdlIGNhbiBhZGQgdmVyc2lvbiBtZXRhZGF0YSBmb3IgQ1BBTgorIyBzbyB0aGF0IGl0IHByb3Blcmx5IGluZGV4ZXMgVGhyaWZ0IGFuZCByZW1vdmUgdW5uZWNlc3NhcnkgZmlsZXMuCisjCisKK2VjaG8gJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworc2V0IC14CisKK0RJU1RGSUxFPSQobHMgVGhyaWZ0Ki5neikKK05FV0ZJTEU9JHtESVNURklMRS90LXYvdC19CitpZiBbWyAiJERJU1RGSUxFIiAhPSAiJE5FV0ZJTEUiIF1dOyB0aGVuCisgICAgbXYgJERJU1RGSUxFICRORVdGSUxFCisgICAgRElTVEZJTEU9IiRORVdGSUxFIgorZmkKK3RhciB4emYgJERJU1RGSUxFCitybSAkRElTVEZJTEUKK0RJU1RESVI9JChscyAtZCBUaHJpZnQqKQorIyBjcGFuIGRvZXNuJ3QgbGlrZSAiVGhyaWZ0LXYwLm5uLjAgYXMgYSBkaXJlY3RvcnkgbmFtZQorIyBuZWVkcyB0byBiZSBUaHJpZnQtMC5ubi4wCitORVdESVI9JHtESVNURElSL3Qtdi90LX0KK2lmIFtbICIkRElTVERJUiIgIT0gIiRORVdESVIiIF1dOyB0aGVuCisgICAgbXYgJERJU1RESVIgJE5FV0RJUgorICAgIERJU1RESVI9IiRORVdESVIiCitmaQorY2QgJERJU1RESVIKK2NwIC1wIC4uL01ha2VmaWxlLlBMIC4KK3BlcmwgLi4vdG9vbHMvRml4dXBEaXN0LnBsCitjZCAuLgordGFyIGN2emYgJERJU1RGSUxFICRESVNURElSCitybSAtciAkRElTVERJUgpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9wZXJsL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRlODI1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSwyIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkuCitBZGRpdGlvbmFsIHBlcmwgY29kaW5nIHN0YW5kYXJkcyBjYW4gYmUgZm91bmQgaW4gW3BlcmxzdHlsZV0oaHR0cDovL3Blcmxkb2MucGVybC5vcmcvcGVybHN0eWxlLmh0bWwpLgpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQucG0KaW5kZXggNDYzNTgxOS4uYWI0MDkzMCAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0LnBtCkBAIC0xNywxNjMgKzE3LDIwIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1vdXIgJFZFUlNJT04gPSAnMC43LjAnOwotCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKICMKLSMgRGF0YSB0eXBlcyB0aGF0IGNhbiBiZSBzZW50IHZpYSBUaHJpZnQKKyMgVmVyc2lvbmluZwogIwotcGFja2FnZSBUVHlwZTsKLXVzZSBjb25zdGFudCBTVE9QICAgPT4gMDsKLXVzZSBjb25zdGFudCBWT0lEICAgPT4gMTsKLXVzZSBjb25zdGFudCBCT09MICAgPT4gMjsKLXVzZSBjb25zdGFudCBCWVRFICAgPT4gMzsKLXVzZSBjb25zdGFudCBJMDggICAgPT4gMzsKLXVzZSBjb25zdGFudCBET1VCTEUgPT4gNDsKLXVzZSBjb25zdGFudCBJMTYgICAgPT4gNjsKLXVzZSBjb25zdGFudCBJMzIgICAgPT4gODsKLXVzZSBjb25zdGFudCBJNjQgICAgPT4gMTA7Ci11c2UgY29uc3RhbnQgU1RSSU5HID0+IDExOwotdXNlIGNvbnN0YW50IFVURjcgICA9PiAxMTsKLXVzZSBjb25zdGFudCBTVFJVQ1QgPT4gMTI7Ci11c2UgY29uc3RhbnQgTUFQICAgID0+IDEzOwotdXNlIGNvbnN0YW50IFNFVCAgICA9PiAxNDsKLXVzZSBjb25zdGFudCBMSVNUICAgPT4gMTU7Ci11c2UgY29uc3RhbnQgVVRGOCAgID0+IDE2OwotdXNlIGNvbnN0YW50IFVURjE2ICA9PiAxNzsKLTE7Ci0KKyMgRXZlcnkgcGVybCBtb2R1bGUgZm9yIFRocmlmdCB3aWxsIGhhdmUgdGhlIHNhbWUgdmVyc2lvbgorIyBkZWNsYXJhdGlvbi4gIEZvciBhIHByb2R1Y3Rpb24gYnVpbGQsIGNoYW5nZSBpdCBiZWxvdyB0bworIyBzb21ldGhpbmcgbGlrZSAidjAuMTEuMCIgYW5kIGFsbCBvZiB0aGUgcGFja2FnZXMgaW4gYWxsCisjIG9mIHRoZSBmaWxlcyB3aWxsIHBpY2sgaXQgdXAgZnJvbSBoZXJlLgogIwotIyBNZXNzYWdlIHR5cGVzIGZvciBSUEMKLSMKLXBhY2thZ2UgVE1lc3NhZ2VUeXBlOwotdXNlIGNvbnN0YW50IENBTEwgICAgICA9PiAxOwotdXNlIGNvbnN0YW50IFJFUExZICAgICA9PiAyOwotdXNlIGNvbnN0YW50IEVYQ0VQVElPTiA9PiAzOwotdXNlIGNvbnN0YW50IE9ORVdBWSAgICA9PiA0OwotMTsKIAotcGFja2FnZSBUaHJpZnQ6OlRFeGNlcHRpb247Ci0KLXN1YiBuZXcgewotICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKLSAgICBteSAkc2VsZiA9IHttZXNzYWdlID0+IHNoaWZ0LCBjb2RlID0+IHNoaWZ0IHx8IDB9OwotCi0gICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwotfQotMTsKLQotcGFja2FnZSBUQXBwbGljYXRpb25FeGNlcHRpb247Ci11c2UgYmFzZSgnVGhyaWZ0OjpURXhjZXB0aW9uJyk7Ci0KLXVzZSBjb25zdGFudCBVTktOT1dOICAgICAgICAgICAgICA9PiAwOwotdXNlIGNvbnN0YW50IFVOS05PV05fTUVUSE9EICAgICAgID0+IDE7Ci11c2UgY29uc3RhbnQgSU5WQUxJRF9NRVNTQUdFX1RZUEUgPT4gMjsKLXVzZSBjb25zdGFudCBXUk9OR19NRVRIT0RfTkFNRSAgICA9PiAzOwotdXNlIGNvbnN0YW50IEJBRF9TRVFVRU5DRV9JRCAgICAgID0+IDQ7Ci11c2UgY29uc3RhbnQgTUlTU0lOR19SRVNVTFQgICAgICAgPT4gNTsKLXVzZSBjb25zdGFudCBJTlRFUk5BTF9FUlJPUiAgICAgICA9PiA2OwotdXNlIGNvbnN0YW50IFBST1RPQ09MX0VSUk9SICAgICAgID0+IDc7Ci0KLXN1YiBuZXcgewotICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKLQotICAgIG15ICRzZWxmID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygpOwotCi0gICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwotfQotCi1zdWIgcmVhZCB7Ci0gICAgbXkgJHNlbGYgID0gc2hpZnQ7Ci0gICAgbXkgJGlucHV0ID0gc2hpZnQ7Ci0KLSAgICBteSAkeGZlciAgPSAwOwotICAgIG15ICRmbmFtZSA9IHVuZGVmOwotICAgIG15ICRmdHlwZSA9IDA7Ci0gICAgbXkgJGZpZCAgID0gMDsKLQotICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKFwkZm5hbWUpOwotCi0gICAgd2hpbGUgKDEpCi0gICAgewotICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKFwkZm5hbWUsIFwkZnR5cGUsIFwkZmlkKTsKLSAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgewotICAgICAgICAgICAgbGFzdDsgbmV4dDsKLSAgICAgICAgfQotCi0gICAgICBTV0lUQ0g6IGZvcigkZmlkKQotICAgICAgewotICAgICAgICAgIC8xLyAmJiBkb3sKLQotICAgICAgICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVFJJTkcpIHsKLSAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cmluZyhcJHNlbGYtPnttZXNzYWdlfSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIGxhc3Q7Ci0gICAgICAgICAgfTsKLQotICAgICAgICAgIC8yLyAmJiBkb3sKLSAgICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6STMyKSB7Ci0gICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRJMzIoXCRzZWxmLT57Y29kZX0pOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgbGFzdDsKLSAgICAgICAgICB9OwotCi0gICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7Ci0gICAgICB9Ci0KLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7Ci0gICAgfQotICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEVuZCgpOwotCi0gICAgcmV0dXJuICR4ZmVyOwotfQotCi1zdWIgd3JpdGUgewotICAgIG15ICRzZWxmICAgPSBzaGlmdDsKLSAgICBteSAkb3V0cHV0ID0gc2hpZnQ7Ci0KLSAgICBteSAkeGZlciAgID0gMDsKLQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOwotCi0gICAgaWYgKCRzZWxmLT5nZXRNZXNzYWdlKCkpIHsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCdtZXNzYWdlJywgVFR5cGU6OlNUUklORywgMSk7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RyaW5nKCRzZWxmLT5nZXRNZXNzYWdlKCkpOwotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7Ci0gICAgfQotCi0gICAgaWYgKCRzZWxmLT5nZXRDb2RlKCkpIHsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCd0eXBlJywgVFR5cGU6OkkzMiwgMik7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlSTMyKCRzZWxmLT5nZXRDb2RlKCkpOwotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7Ci0gICAgfQotCi0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsKLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOwotCi0gICAgcmV0dXJuICR4ZmVyOwotfQotCi1zdWIgZ2V0TWVzc2FnZQotewotICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0KLSAgICByZXR1cm4gJHNlbGYtPnttZXNzYWdlfTsKLX0KLQotc3ViIGdldENvZGUKLXsKLSAgICBteSAkc2VsZiA9IHNoaWZ0OwotCi0gICAgcmV0dXJuICRzZWxmLT57Y29kZX07Ci19CitwYWNrYWdlIFRocmlmdDsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoInYxLjAuMCIpOwogCiAxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9CaW5hcnlQcm90b2NvbC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvQmluYXJ5UHJvdG9jb2wucG0KaW5kZXggYzYzOGVhZC4uZDYyNTA5YSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9CaW5hcnlQcm90b2NvbC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L0JpbmFyeVByb3RvY29sLnBtCkBAIC0xNywyOCArMTcsMjkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Ci0KK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCi11c2UgdXRmODsKLXVzZSBFbmNvZGU7Ci0KLXVzZSBUaHJpZnQ7Ci11c2UgVGhyaWZ0OjpQcm90b2NvbDsKLQogdXNlIEJpdDo6VmVjdG9yOwordXNlIEVuY29kZTsKK3VzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpFeGNlcHRpb247Cit1c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTsKK3VzZSBUaHJpZnQ6OlByb3RvY29sOwordXNlIFRocmlmdDo6VHlwZTsKK3VzZSB1dGY4OwogCiAjCiAjIEJpbmFyeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyaWZ0IHByb3RvY29sLgogIwogcGFja2FnZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sOwogdXNlIGJhc2UoJ1RocmlmdDo6UHJvdG9jb2wnKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogdXNlIGNvbnN0YW50IFZFUlNJT05fTUFTSyAgID0+IDB4ZmZmZjAwMDA7CiB1c2UgY29uc3RhbnQgVkVSU0lPTl8xICAgICAgPT4gMHg4MDAxMDAwMDsKLXVzZSBjb25zdGFudCBJU19CSUdfRU5ESUFOICA9PiB1bnBhY2soImgqIiwgcGFjaygicyIsIDEpKSA9fiAvMDEvOwordXNlIGNvbnN0YW50IElTX0JJR19FTkRJQU4gID0+IHVucGFjaygnaConLCBwYWNrKCdzJywgMSkpID1+IG0vMDEvOwogCiBzdWIgbmV3CiB7CkBAIC02Niw3ICs2Nyw4IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN1YiB3cml0ZVN0cnVjdEJlZ2lueworc3ViIHdyaXRlU3RydWN0QmVnaW4KK3sKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgIG15ICRuYW1lID0gc2hpZnQ7CiAgICAgcmV0dXJuIDA7CkBAIC05Nyw3ICs5OSw3IEBACiBzdWIgd3JpdGVGaWVsZFN0b3AKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwotICAgIHJldHVybiAkc2VsZi0+d3JpdGVCeXRlKFRUeXBlOjpTVE9QKTsKKyAgICByZXR1cm4gJHNlbGYtPndyaXRlQnl0ZShUaHJpZnQ6OlRUeXBlOjpTVE9QKTsKIH0KIAogc3ViIHdyaXRlTWFwQmVnaW4KQEAgLTI1MiwxNCArMjU0LDE2IEBACiAgICAgbXkgJHJlc3VsdCA9ICRzZWxmLT5yZWFkSTMyKFwkdmVyc2lvbik7CiAgICAgaWYgKCgkdmVyc2lvbiAmIFZFUlNJT05fTUFTSykgPiAwKSB7CiAgICAgICBpZiAoKCR2ZXJzaW9uICYgVkVSU0lPTl9NQVNLKSAhPSBWRVJTSU9OXzEpIHsKLSAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJ01pc3NpbmcgdmVyc2lvbiBpZGVudGlmaWVyJykKKyAgICAgICAgZGllIFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uLT5uZXcoJ01pc3NpbmcgdmVyc2lvbiBpZGVudGlmaWVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OlRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04pOwogICAgICAgfQogICAgICAgJCR0eXBlID0gJHZlcnNpb24gJiAweDAwMDAwMGZmOwogICAgICAgcmV0dXJuCiAgICAgICAgICAgJHJlc3VsdCArCiAgICAgICAgICAgJHNlbGYtPnJlYWRTdHJpbmcoJG5hbWUpICsKICAgICAgICAgICAkc2VsZi0+cmVhZEkzMigkc2VxaWQpOwotICAgIH0gZWxzZSB7ICMgb2xkIGNsaWVudCBzdXBwb3J0IGNvZGUKKyAgICB9CisgICAgZWxzZSB7ICMgb2xkIGNsaWVudCBzdXBwb3J0IGNvZGUKICAgICAgIHJldHVybgogICAgICAgICAkcmVzdWx0ICsKICAgICAgICAgJHNlbGYtPnJlYWRTdHJpbmdCb2R5KCRuYW1lLCAkdmVyc2lvbikgKyAjIHZlcnNpb24gaGVyZSBob2xkcyB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nCkBAIC0yOTcsNyArMzAxLDcgQEAKIAogICAgIG15ICRyZXN1bHQgPSAkc2VsZi0+cmVhZEJ5dGUoJGZpZWxkVHlwZSk7CiAKLSAgICBpZiAoJCRmaWVsZFR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKKyAgICBpZiAoJCRmaWVsZFR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RPUCkgewogICAgICAgJCRmaWVsZElkID0gMDsKICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KQEAgLTQyNSw3ICs0MjksNyBAQAogCiAgICAgbXkgKCRoaSwkbG8pPXVucGFjaygnTk4nLCRkYXRhKTsKIAotICAgIG15ICR2ZWMgPSBuZXcgQml0OjpWZWN0b3IoNjQpOworICAgIG15ICR2ZWMgPSBCaXQ6OlZlY3Rvci0+bmV3KDY0KTsKIAogICAgICR2ZWMtPkNodW5rX1N0b3JlKDMyLDMyLCRoaSk7CiAgICAgJHZlYy0+Q2h1bmtfU3RvcmUoMzIsMCwkbG8pOwpAQCAtNDQ3LDcgKzQ1MSw3IEBACiAgICAgZWxzZSB7CiAgICAgICAkZGF0YSA9IHNjYWxhciByZXZlcnNlKCRzZWxmLT57dHJhbnN9LT5yZWFkQWxsKDgpKTsKICAgICB9Ci0gICAgCisKICAgICBteSBAYXJyID0gdW5wYWNrKCdkJywgJGRhdGEpOwogCiAgICAgJCR2YWx1ZSA9ICRhcnJbMF07CkBAIC00NjUsNyArNDY5LDggQEAKIAogICAgIGlmICgkbGVuKSB7CiAgICAgICAkJHZhbHVlID0gJHNlbGYtPnt0cmFuc30tPnJlYWRBbGwoJGxlbik7Ci0gICAgfSBlbHNlIHsKKyAgICB9CisgICAgZWxzZSB7CiAgICAgICAkJHZhbHVlID0gJyc7CiAgICAgfQogCkBAIC00ODAsNyArNDg1LDggQEAKIAogICAgIGlmICgkbGVuKSB7CiAgICAgICAkJHZhbHVlID0gJHNlbGYtPnt0cmFuc30tPnJlYWRBbGwoJGxlbik7Ci0gICAgfSBlbHNlIHsKKyAgICB9CisgICAgZWxzZSB7CiAgICAgICAkJHZhbHVlID0gJyc7CiAgICAgfQogCkBAIC00OTEsNyArNDk3LDggQEAKICMgQmluYXJ5IFByb3RvY29sIEZhY3RvcnkKICMKIHBhY2thZ2UgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3Rvcnk7Ci11c2UgYmFzZSgnVFByb3RvY29sRmFjdG9yeScpOwordXNlIGJhc2UoJ1RocmlmdDo6VFByb3RvY29sRmFjdG9yeScpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3CiB7CkBAIC01MDUsNyArNTEyLDcgQEAKICAgICBteSAkc2VsZiAgPSBzaGlmdDsKICAgICBteSAkdHJhbnMgPSBzaGlmdDsKIAotICAgIHJldHVybiBuZXcgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbCgkdHJhbnMpOworICAgIHJldHVybiBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLT5uZXcoJHRyYW5zKTsKIH0KIAogMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvQnVmZmVyZWRUcmFuc3BvcnQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L0J1ZmZlcmVkVHJhbnNwb3J0LnBtCmluZGV4IDM4NjhjYTIuLjZiNWJmN2EgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvQnVmZmVyZWRUcmFuc3BvcnQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9CdWZmZXJlZFRyYW5zcG9ydC5wbQpAQCAtMTcsMTUgKzE3LDE3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKIHVzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpFeGNlcHRpb247CiB1c2UgVGhyaWZ0OjpUcmFuc3BvcnQ7CiAKIHBhY2thZ2UgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDsKIHVzZSBiYXNlKCdUaHJpZnQ6OlRyYW5zcG9ydCcpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3CiB7CkBAIC0xMTAsNiArMTEyLDcgQEAKICMgQnVmZmVyZWRUcmFuc3BvcnQgZmFjdG9yeSBjcmVhdGVzIGJ1ZmZlcmVkIHRyYW5zcG9ydCBvYmplY3RzIGZyb20gdHJhbnNwb3J0cwogIwogcGFja2FnZSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9FeGNlcHRpb24ucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDA0MDY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9FeGNlcHRpb24ucG0KQEAgLTAsMCArMSwxNjEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OlR5cGU7CisKK3BhY2thZ2UgVGhyaWZ0OjpURXhjZXB0aW9uOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCit1c2Ugb3ZlcmxvYWQgJyIiJyA9PiBzdWIgeworICAgIHJldHVybgorICAgICAgICBzcHJpbnRmICclcyBlcnJvcjogJXMgKGNvZGUgJXMpJywKKyAgICAgICAgICByZWYoICRfWzBdICksCisgICAgICAgICAgKCAkX1swXS0+e21lc3NhZ2V9IHx8ICdlbXB0eSBtZXNzYWdlJyApLAorICAgICAgICAgICggZGVmaW5lZCAkX1swXS0+e2NvZGV9ID8gJF9bMF0tPntjb2RlfSA6ICd1bmRlZmluZWQnICk7CisgICAgfTsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRzZWxmID0ge21lc3NhZ2UgPT4gc2hpZnQsIGNvZGUgPT4gc2hpZnQgfHwgMH07CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Cit9CisKK3BhY2thZ2UgVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb247Cit1c2UgcGFyZW50IC1ub3JlcXVpcmUsICdUaHJpZnQ6OlRFeGNlcHRpb24nOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCit1c2UgY29uc3RhbnQgVU5LTk9XTiAgICAgICAgICAgICAgICAgPT4gMDsKK3VzZSBjb25zdGFudCBVTktOT1dOX01FVEhPRCAgICAgICAgICA9PiAxOwordXNlIGNvbnN0YW50IElOVkFMSURfTUVTU0FHRV9UWVBFICAgID0+IDI7Cit1c2UgY29uc3RhbnQgV1JPTkdfTUVUSE9EX05BTUUgICAgICAgPT4gMzsKK3VzZSBjb25zdGFudCBCQURfU0VRVUVOQ0VfSUQgICAgICAgICA9PiA0OwordXNlIGNvbnN0YW50IE1JU1NJTkdfUkVTVUxUICAgICAgICAgID0+IDU7Cit1c2UgY29uc3RhbnQgSU5URVJOQUxfRVJST1IgICAgICAgICAgPT4gNjsKK3VzZSBjb25zdGFudCBQUk9UT0NPTF9FUlJPUiAgICAgICAgICA9PiA3OwordXNlIGNvbnN0YW50IElOVkFMSURfVFJBTlNGT1JNICAgICAgID0+IDg7Cit1c2UgY29uc3RhbnQgSU5WQUxJRF9QUk9UT0NPTCAgICAgICAgPT4gOTsKK3VzZSBjb25zdGFudCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9PiAxMDsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworCisgICAgbXkgJHNlbGYgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KEBfKTsKKworICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKK30KKworc3ViIHJlYWQgeworICAgIG15ICRzZWxmICA9IHNoaWZ0OworICAgIG15ICRpbnB1dCA9IHNoaWZ0OworCisgICAgbXkgJHhmZXIgID0gMDsKKyAgICBteSAkZm5hbWUgPSB1bmRlZjsKKyAgICBteSAkZnR5cGUgPSAwOworICAgIG15ICRmaWQgICA9IDA7CisKKyAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RCZWdpbihcJGZuYW1lKTsKKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRCZWdpbihcJGZuYW1lLCBcJGZ0eXBlLCBcJGZpZCk7CisgICAgICAgIGlmICgkZnR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgbGFzdDsgbmV4dDsKKyAgICAgICAgfQorCisgICAgICBTV0lUQ0g6IGZvcigkZmlkKQorICAgICAgeworICAgICAgICAgIC8xLyAmJiBkb3sKKworICAgICAgICAgICAgICBpZiAoJGZ0eXBlID09IFRocmlmdDo6VFR5cGU6OlNUUklORykgeworICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RyaW5nKFwkc2VsZi0+e21lc3NhZ2V9KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICB9OworCisgICAgICAgICAgLzIvICYmIGRveworICAgICAgICAgICAgICBpZiAoJGZ0eXBlID09IFRocmlmdDo6VFR5cGU6OkkzMikgeworICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkSTMyKFwkc2VsZi0+e2NvZGV9KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGxhc3Q7CisgICAgICAgICAgfTsKKworICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOworICAgICAgfQorCisgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEVuZCgpOworICAgIH0KKyAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgIHJldHVybiAkeGZlcjsKK30KKworc3ViIHdyaXRlIHsKKyAgICBteSAkc2VsZiAgID0gc2hpZnQ7CisgICAgbXkgJG91dHB1dCA9IHNoaWZ0OworCisgICAgbXkgJHhmZXIgICA9IDA7CisKKyAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKKworICAgIGlmICgkc2VsZi0+Z2V0TWVzc2FnZSgpKSB7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbignbWVzc2FnZScsIFRocmlmdDo6VFR5cGU6OlNUUklORywgMSk7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RyaW5nKCRzZWxmLT5nZXRNZXNzYWdlKCkpOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgaWYgKCRzZWxmLT5nZXRDb2RlKCkpIHsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCd0eXBlJywgVGhyaWZ0OjpUVHlwZTo6STMyLCAyKTsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVJMzIoJHNlbGYtPmdldENvZGUoKSk7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOworICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7CisKKyAgICByZXR1cm4gJHhmZXI7Cit9CisKK3N1YiBnZXRNZXNzYWdlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e21lc3NhZ2V9OworfQorCitzdWIgZ2V0Q29kZQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb2RlfTsKK30KKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvRnJhbWVkVHJhbnNwb3J0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9GcmFtZWRUcmFuc3BvcnQucG0KaW5kZXggYjc4YjE5OC4uYmE4OWJhMyAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9GcmFtZWRUcmFuc3BvcnQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9GcmFtZWRUcmFuc3BvcnQucG0KQEAgLTE3LDYgKzE3LDcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCkBAIC0zMCw4ICszMSw4IEBACiAjIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKICMKIHBhY2thZ2UgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQ7Ci0KIHVzZSBiYXNlKCdUaHJpZnQ6OlRyYW5zcG9ydCcpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3CiB7CkBAIC02OCw3ICs2OSw5IEBACiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKIAotICAgICRzZWxmLT57dHJhbnNwb3J0fS0+Y2xvc2UoKTsKKyAgICBpZiAoZGVmaW5lZCAkc2VsZi0+e3RyYW5zcG9ydH0pIHsKKyAgICAgICAgJHNlbGYtPnt0cmFuc3BvcnR9LT5jbG9zZSgpOworICAgIH0KIH0KIAogIwpAQCAtMTYxLDQgKzE2NCwzMSBAQAogCiB9CiAKKyMKKyMgRnJhbWVkVHJhbnNwb3J0IGZhY3RvcnkgY3JlYXRlcyBmcmFtZWQgdHJhbnNwb3J0IG9iamVjdHMgZnJvbSB0cmFuc3BvcnRzCisjCitwYWNrYWdlIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0RmFjdG9yeTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRzZWxmICAgICAgPSB7fTsKKworICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7Cit9CisKKyMKKyMgQnVpbGQgYSBmcmFtZWQgdHJhbnNwb3J0IGZyb20gdGhlIGJhc2UgdHJhbnNwb3J0CisjCisjIEByZXR1cm4gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQgdHJhbnNwb3J0CisjCitzdWIgZ2V0VHJhbnNwb3J0Cit7CisgICAgbXkgJHNlbGYgID0gc2hpZnQ7CisgICAgbXkgJHRyYW5zID0gc2hpZnQ7CisKKyAgICBteSAkYnVmZmVyZWQgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC0+bmV3KCR0cmFucyk7CisgICAgcmV0dXJuICRidWZmZXJlZDsKK30KKwogMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvSHR0cENsaWVudC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvSHR0cENsaWVudC5wbQppbmRleCBkNmZjOGJlLi40MGVjOWNlIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L0h0dHBDbGllbnQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9IdHRwQ2xpZW50LnBtCkBAIC0xNywyNiArMTcsMjUgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAordXNlIEhUVFA6OlJlcXVlc3Q7Cit1c2UgSU86OlN0cmluZzsKK3VzZSBMV1A6OlVzZXJBZ2VudDsKIHVzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpFeGNlcHRpb247CiB1c2UgVGhyaWZ0OjpUcmFuc3BvcnQ7CiAKLXVzZSBIVFRQOjpSZXF1ZXN0OwotdXNlIExXUDo6VXNlckFnZW50OwotdXNlIElPOjpTdHJpbmc7Ci0KIHBhY2thZ2UgVGhyaWZ0OjpIdHRwQ2xpZW50OwotCiB1c2UgYmFzZSgnVGhyaWZ0OjpUcmFuc3BvcnQnKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldwogewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKICAgICBteSAkdXJsICAgICAgID0gc2hpZnQgfHwgJ2h0dHA6Ly9sb2NhbGhvc3Q6OTA5MCc7Ci0gICAgbXkgJGRlYnVnSGFuZGxlciA9IHNoaWZ0OwogCiAgICAgbXkgJG91dCA9IElPOjpTdHJpbmctPm5ldzsKICAgICBiaW5tb2RlKCRvdXQpOwpAQCAtNDQsNDQgKzQzLDQ0IEBACiAgICAgbXkgJHNlbGYgPSB7CiAgICAgICAgIHVybCAgICAgICAgICA9PiAkdXJsLAogICAgICAgICBvdXQgICAgICAgICAgPT4gJG91dCwKLSAgICAgICAgZGVidWdIYW5kbGVyID0+ICRkZWJ1Z0hhbmRsZXIsCi0gICAgICAgIGRlYnVnICAgICAgICA9PiAwLAotICAgICAgICBzZW5kVGltZW91dCAgPT4gMTAwLAotICAgICAgICByZWN2VGltZW91dCAgPT4gNzUwLAorICAgICAgICB0aW1lb3V0ICAgICAgPT4gMTAwLAogICAgICAgICBoYW5kbGUgICAgICAgPT4gdW5kZWYsCisgICAgICAgIGhlYWRlcnMgICAgICA9PiB7fSwKICAgICB9OwogCiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwogfQogCitzdWIgc2V0VGltZW91dAoreworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisgICAgbXkgJHRpbWVvdXQgPSBzaGlmdDsKKworICAgICRzZWxmLT57dGltZW91dH0gPSAkdGltZW91dDsKK30KKworc3ViIHNldFJlY3ZUaW1lb3V0Cit7CisgICAgd2FybiAnc2V0UmVjdlRpbWVvdXQgaXMgZGVwcmVjYXRlZCAtIHVzZSBzZXRUaW1lb3V0IGluc3RlYWQnOworICAgICMgbm90ZTogcmVjdlRpbWVvdXQgd2FzIG5ldmVyIHVzZWQgc28gd2UgZG8gbm90IG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZQorfQorCiBzdWIgc2V0U2VuZFRpbWVvdXQKIHsKICAgICBteSAkc2VsZiAgICA9IHNoaWZ0OwogICAgIG15ICR0aW1lb3V0ID0gc2hpZnQ7CiAKLSAgICAkc2VsZi0+e3NlbmRUaW1lb3V0fSA9ICR0aW1lb3V0OworICAgIHdhcm4gJ3NldFNlbmRUaW1lb3V0IGlzIGRlcHJlY2F0ZWQgLSB1c2Ugc2V0VGltZW91dCBpbnN0ZWFkJzsKKworICAgICRzZWxmLT5zZXRUaW1lb3V0KCR0aW1lb3V0KTsKIH0KIAotc3ViIHNldFJlY3ZUaW1lb3V0CitzdWIgc2V0SGVhZGVyCiB7Ci0gICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKLSAgICBteSAkdGltZW91dCA9IHNoaWZ0OworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRuYW1lLCAkdmFsdWUpID0gQF87CiAKLSAgICAkc2VsZi0+e3JlY3ZUaW1lb3V0fSA9ICR0aW1lb3V0OwotfQotCi0KLSMKLSNTZXRzIGRlYnVnZ2luZyBvdXRwdXQgb24gb3Igb2ZmCi0jCi0jIEBwYXJhbSBib29sICRkZWJ1ZwotIwotc3ViIHNldERlYnVnCi17Ci0gICAgbXkgJHNlbGYgID0gc2hpZnQ7Ci0gICAgbXkgJGRlYnVnID0gc2hpZnQ7Ci0KLSAgICAkc2VsZi0+e2RlYnVnfSA9ICRkZWJ1ZzsKKyAgICAkc2VsZi0+e2hlYWRlcnN9LT57JG5hbWV9ID0gJHZhbHVlOwogfQogCiAjCkBAIC0xMDMsOCArMTAyLDggQEAKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgIGlmIChkZWZpbmVkKCRzZWxmLT57aW99KSkgewotICAgICAgY2xvc2UoJHNlbGYtPntpb30pOwotICAgICAgJHNlbGYtPntpb30gPSB1bmRlZjsKKyAgICAgICAgY2xvc2UoJHNlbGYtPntpb30pOworICAgICAgICAkc2VsZi0+e2lvfSA9IHVuZGVmOwogICAgIH0KIH0KIApAQCAtMTIyLDcgKzEyMSw4IEBACiAgICAgbXkgJGJ1ZiA9ICRzZWxmLT5yZWFkKCRsZW4pOwogCiAgICAgaWYgKCFkZWZpbmVkKCRidWYpKSB7Ci0gICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMgZnJvbSBpbnB1dCBidWZmZXInKTsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCJUU29ja2V0OiBDb3VsZCBub3QgcmVhZCAkbGVuIGJ5dGVzIGZyb20gaW5wdXQgYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpOwogICAgIH0KICAgICByZXR1cm4gJGJ1ZjsKIH0KQEAgLTE0MCwxNSArMTQwLDE4IEBACiAgICAgbXkgJGluID0gJHNlbGYtPntpbn07CiAKICAgICBpZiAoIWRlZmluZWQoJGluKSkgewotICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oIlJlc3BvbnNlIGJ1ZmZlciBpcyBlbXB0eSwgbm8gcmVxdWVzdC4iKTsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCdSZXNwb25zZSBidWZmZXIgaXMgZW1wdHksIG5vIHJlcXVlc3QuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpOwogICAgIH0KICAgICBldmFsIHsKLSAgICAgIG15ICRyZXQgPSBzeXNyZWFkKCRpbiwgJGJ1ZiwgJGxlbik7Ci0gICAgICBpZiAoISBkZWZpbmVkKCRyZXQpKSB7Ci0gICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCJObyBtb3JlIGRhdGEgYXZhaWxhYmxlLiIpOwotICAgICAgfQotICAgIH07IGlmKCRAKXsKLSAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCRAKTsKKyAgICAgICAgbXkgJHJldCA9IHN5c3JlYWQoJGluLCAkYnVmLCAkbGVuKTsKKyAgICAgICAgaWYgKCEgZGVmaW5lZCgkcmV0KSkgeworICAgICAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCdObyBtb3JlIGRhdGEgYXZhaWxhYmxlLicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUKTsKKyAgICAgICAgfQorICAgIH07CisgICAgaWYoJEApeworICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoIiRAIiwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOKTsKICAgICB9CiAKICAgICByZXR1cm4gJGJ1ZjsKQEAgLTE3MSw4ICsxNzQsOSBAQAogewogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAKLSAgICBteSAkdWEgPSBMV1A6OlVzZXJBZ2VudC0+bmV3KCd0aW1lb3V0JyA9PiAoJHNlbGYtPntzZW5kVGltZW91dH0gLyAxMDAwKSwKLSAgICAgICdhZ2VudCcgPT4gJ1BlcmwvVEh0dHBDbGllbnQnCisgICAgbXkgJHVhID0gTFdQOjpVc2VyQWdlbnQtPm5ldygKKyAgICAgICAgJ3RpbWVvdXQnID0+ICgkc2VsZi0+e3RpbWVvdXR9IC8gMTAwMCksCisgICAgICAgICdhZ2VudCcgICA9PiAnUGVybC9USHR0cENsaWVudCcKICAgICAgKTsKICAgICAkdWEtPmRlZmF1bHRfaGVhZGVyKCdBY2NlcHQnID0+ICdhcHBsaWNhdGlvbi94LXRocmlmdCcpOwogICAgICR1YS0+ZGVmYXVsdF9oZWFkZXIoJ0NvbnRlbnQtVHlwZScgPT4gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0Jyk7CkBAIC0xODIsNyArMTg2LDcgQEAKICAgICAkb3V0LT5zZXRwb3MoMCk7ICMgcmV3aW5kCiAgICAgbXkgJGJ1ZiA9IGpvaW4oJycsIDwkb3V0Pik7CiAKLSAgICBteSAkcmVxdWVzdCA9IG5ldyBIVFRQOjpSZXF1ZXN0KFBPU1QgPT4gJHNlbGYtPnt1cmx9LCB1bmRlZiwgJGJ1Zik7CisgICAgbXkgJHJlcXVlc3QgPSBIVFRQOjpSZXF1ZXN0LT5uZXcoUE9TVCA9PiAkc2VsZi0+e3VybH0sICgkc2VsZi0+e2hlYWRlcnN9IHx8IHVuZGVmKSwgJGJ1Zik7CiAgICAgbXkgJHJlc3BvbnNlID0gJHVhLT5yZXF1ZXN0KCRyZXF1ZXN0KTsKICAgICBteSAkY29udGVudF9yZWYgPSAkcmVzcG9uc2UtPmNvbnRlbnRfcmVmOwogCmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L01lbW9yeUJ1ZmZlci5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTWVtb3J5QnVmZmVyLnBtCmluZGV4IDBiMjg2ODcuLmJlOTdjZTQgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvTWVtb3J5QnVmZmVyLnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTWVtb3J5QnVmZmVyLnBtCkBAIC0xNyw3ICsxNyw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKQEAgLTI2LDYgKzI2LDcgQEAKIAogcGFja2FnZSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlcjsKIHVzZSBiYXNlKCdUaHJpZnQ6OlRyYW5zcG9ydCcpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3CiB7CkBAIC0zNCwxMCArMzUsMTAgQEAKICAgICBteSAkYnVmZmVyU2l6ZT0gc2hpZnQgfHwgMTAyNDsKIAogICAgIG15ICRzZWxmID0gewotICAgICAgICBidWZmZXIgICAgPT4gJycsCi0gICAgICAgIGJ1ZmZlclNpemU9PiAkYnVmZmVyU2l6ZSwKLSAgICAgICAgd1BvcyAgICAgID0+IDAsCi0gICAgICAgIHJQb3MgICAgICA9PiAwLAorICAgICAgICBidWZmZXIgICAgID0+ICcnLAorICAgICAgICBidWZmZXJTaXplID0+ICRidWZmZXJTaXplLAorICAgICAgICB3UG9zICAgICAgID0+IDAsCisgICAgICAgIHJQb3MgICAgICAgPT4gMCwKICAgICB9OwogCiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwpAQCAtMTE2LDcgKzExNyw4IEBACiAKICAgICBteSAkYXZhaWwgPSAoJHNlbGYtPnt3UG9zfSAtICRzZWxmLT57clBvc30pOwogICAgIGlmICgkYXZhaWwgPCAkbGVuKSB7Ci0gICAgICAgIGRpZSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQXR0ZW1wdCB0byByZWFkQWxsKCRsZW4pIGZvdW5kIG9ubHkgJGF2YWlsIGF2YWlsYWJsZSIpOworICAgICAgICBkaWUgVFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCJBdHRlbXB0IHRvIHJlYWRBbGwoJGxlbikgZm91bmQgb25seSAkYXZhaWwgYXZhaWxhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpOwogICAgIH0KIAogICAgIG15ICRkYXRhID0gJyc7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L01lc3NhZ2VUeXBlLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9NZXNzYWdlVHlwZS5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjVjMmY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9NZXNzYWdlVHlwZS5wbQpAQCAtMCwwICsxLDM3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUaHJpZnQ7CisKKyMKKyMgTWVzc2FnZSB0eXBlcyBmb3IgUlBDCisjCitwYWNrYWdlIFRocmlmdDo6VE1lc3NhZ2VUeXBlOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCit1c2UgY29uc3RhbnQgQ0FMTCAgICAgID0+IDE7Cit1c2UgY29uc3RhbnQgUkVQTFkgICAgID0+IDI7Cit1c2UgY29uc3RhbnQgRVhDRVBUSU9OID0+IDM7Cit1c2UgY29uc3RhbnQgT05FV0FZICAgID0+IDQ7CisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L011bHRpcGxleGVkUHJvY2Vzc29yLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb2Nlc3Nvci5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTkyNWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb2Nlc3Nvci5wbQpAQCAtMCwwICsxLDEzMyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6TWVzc2FnZVR5cGU7Cit1c2UgVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sOwordXNlIFRocmlmdDo6UHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpQcm90b2NvbERlY29yYXRvcjsKKworcGFja2FnZSBUaHJpZnQ6OlN0b3JlZE1lc3NhZ2VQcm90b2NvbDsKK3VzZSBiYXNlIHF3KFRocmlmdDo6UHJvdG9jb2xEZWNvcmF0b3IpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHByb3RvY29sICA9IHNoaWZ0OworICAgIG15ICRmbmFtZSAgPSBzaGlmdDsKKyAgICBteSAkbXR5cGUgID0gc2hpZnQ7CisgICAgbXkgJHJzZXFpZCAgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCRwcm90b2NvbCk7CisKKyAgICAkc2VsZi0+e2ZuYW1lfSA9ICRmbmFtZTsKKyAgICAkc2VsZi0+e210eXBlfSA9ICRtdHlwZTsKKyAgICAkc2VsZi0+e3JzZXFpZH0gPSAkcnNlcWlkOworCisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOworfQorCitzdWIgcmVhZE1lc3NhZ2VCZWdpbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJG5hbWUgPSBzaGlmdDsKKyAgICBteSAkdHlwZSA9IHNoaWZ0OworICAgIG15ICRzZXFpZCA9IHNoaWZ0OworCisgICAgJCRuYW1lID0gJHNlbGYtPntmbmFtZX07CisgICAgJCR0eXBlID0gJHNlbGYtPnttdHlwZX07CisgICAgJCRzZXFpZCA9ICRzZWxmLT57cnNlcWlkfTsKK30KKworcGFja2FnZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvY2Vzc29yOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgICAgICA9IHt9OworCisgICAgJHNlbGYtPntzZXJ2aWNlUHJvY2Vzc29yTWFwfSA9IHt9OworICAgICRzZWxmLT57ZGVmYXVsdFByb2Nlc3Nvcn0gPSB1bmRlZjsKKworICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKK30KKworc3ViIGRlZmF1bHRQcm9jZXNzb3IgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHByb2Nlc3NvciA9IHNoaWZ0OworCisgICAgJHNlbGYtPntkZWZhdWx0UHJvY2Vzc29yfSA9ICRwcm9jZXNzb3I7Cit9CisKK3N1YiByZWdpc3RlclByb2Nlc3NvciB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkc2VydmljZU5hbWUgPSBzaGlmdDsKKyAgICBteSAkcHJvY2Vzc29yID0gc2hpZnQ7CisKKyAgICAgJHNlbGYtPntzZXJ2aWNlUHJvY2Vzc29yTWFwfS0+eyRzZXJ2aWNlTmFtZX0gPSAkcHJvY2Vzc29yOworfQorCitzdWIgcHJvY2VzcyB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkaW5wdXQgPSBzaGlmdDsKKyAgICBteSAkb3V0cHV0ID0gc2hpZnQ7CisKKyAgICAjCisgICAgIyAgVXNlIHRoZSBhY3R1YWwgdW5kZXJseWluZyBwcm90b2NvbCAoZS5nLiBCaW5hcnlQcm90b2NvbCkgdG8gcmVhZCB0aGUKKyAgICAjICBtZXNzYWdlIGhlYWRlci4gVGhpcyBwdWxscyB0aGUgbWVzc2FnZSAib2ZmIHRoZSB3aXJlIiwgd2hpY2ggd2UnbGwKKyAgICAjICBkZWFsIHdpdGggYXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZC4KKyAgICAjCisKKyAgICBteSAoJGZuYW1lLCAkbXR5cGUsICRyc2VxaWQpOworICAgICRpbnB1dC0+cmVhZE1lc3NhZ2VCZWdpbihcJGZuYW1lLCBcJG10eXBlLCBcJHJzZXFpZCk7CisKKyAgICBpZiAoJG10eXBlIG5lIFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpDQUxMICYmICRtdHlwZSBuZSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6T05FV0FZKSB7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRFeGNlcHRpb24tPm5ldygnVGhpcyBzaG91bGQgbm90IGhhdmUgaGFwcGVuZWQhPycpOworICAgIH0KKworICAgICMgRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGFuZCB0aGUgbmV3IE1lc3NhZ2UgbmFtZS4KKyAgICBpZiAoaW5kZXgoJGZuYW1lLCBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2w6OlNFUEFSQVRPUikgPT0gLTEpIHsKKyAgICAgICAgaWYgKGRlZmluZWQgJHNlbGYtPntkZWZhdWx0UHJvY2Vzc29yfSkgeworICAgICAgICAgICAgcmV0dXJuICRzZWxmLT57ZGVmYXVsdFByb2Nlc3Nvcn0tPnByb2Nlc3MoCisgICAgICAgICAgICAgICAgVGhyaWZ0OjpTdG9yZWRNZXNzYWdlUHJvdG9jb2wtPm5ldygkaW5wdXQsICRmbmFtZSwgJG10eXBlLCAkcnNlcWlkKSwgJG91dHB1dAorICAgICAgICAgICAgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRpZSBUaHJpZnQ6OlRFeGNlcHRpb24tPm5ldygiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6IHskZm5hbWV9IGFuZCBubyBkZWZhdWx0IHByb2Nlc3NvciBkZWZpbmVkLiBEaWQgeW91ICIgLgorICAgICAgICAgICAgICAgICdmb3JnZXQgdG8gdXNlIGEgTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/Jyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAobXkgJHNlcnZpY2VOYW1lLCBteSAkbWVzc2FnZU5hbWUpID0gc3BsaXQoJzonLCAkZm5hbWUsIDIpOworCisgICAgaWYgKCFleGlzdHMoJHNlbGYtPntzZXJ2aWNlUHJvY2Vzc29yTWFwfS0+eyRzZXJ2aWNlTmFtZX0pKSB7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRFeGNlcHRpb24tPm5ldygiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogeyRzZXJ2aWNlTmFtZX0uICBEaWQgeW91IGZvcmdldCAiIC4KKyAgICAgICAgICAgICd0byBjYWxsIHJlZ2lzdGVyUHJvY2Vzc29yKCk/Jyk7CisgICAgfQorCisgICAgIyBEaXNwYXRjaCBwcm9jZXNzaW5nIHRvIHRoZSBzdG9yZWQgcHJvY2Vzc29yCisgICAgbXkgJHByb2Nlc3NvciA9ICRzZWxmLT57c2VydmljZVByb2Nlc3Nvck1hcH0tPnskc2VydmljZU5hbWV9OworICAgIHJldHVybiAkcHJvY2Vzc29yLT5wcm9jZXNzKAorICAgICAgICBUaHJpZnQ6OlN0b3JlZE1lc3NhZ2VQcm90b2NvbC0+bmV3KCRpbnB1dCwgJG1lc3NhZ2VOYW1lLCAkbXR5cGUsICRyc2VxaWQpLCAkb3V0cHV0CisgICAgKTsKK30KKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvTXVsdGlwbGV4ZWRQcm90b2NvbC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTXVsdGlwbGV4ZWRQcm90b2NvbC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjViNjBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb3RvY29sLnBtCkBAIC0wLDAgKzEsNjggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlOwordXNlIFRocmlmdDo6UHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpQcm90b2NvbERlY29yYXRvcjsKKworcGFja2FnZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2w7Cit1c2UgYmFzZSBxdyhUaHJpZnQ6OlByb3RvY29sRGVjb3JhdG9yKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKwordXNlIGNvbnN0YW50IFNFUEFSQVRPUiAgPT4gJzonOworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHByb3RvY29sICA9IHNoaWZ0OworICAgIG15ICRzZXJ2aWNlTmFtZSAgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygkcHJvdG9jb2wpOworCisgICAgJHNlbGYtPntzZXJ2aWNlTmFtZX0gPSAkc2VydmljZU5hbWU7CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Cit9CisKKyMKKyMgV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlci4KKyMgUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IE11bHRpcGxleGVkUHJvdG9jb2w6OlNFUEFSQVRPUi4KKyMKKyMgQHBhcmFtIHN0cmluZyAkbmFtZSAgRnVuY3Rpb24gbmFtZS4KKyMgQHBhcmFtIGludCAgICAkdHlwZSAgTWVzc2FnZSB0eXBlLgorIyBAcGFyYW0gaW50ICAgICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlLgorIworc3ViIHdyaXRlTWVzc2FnZUJlZ2luCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJG5hbWUsICR0eXBlLCAkc2VxaWQpID0gQF87CisKKyAgICBpZiAoJHR5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkNBTEwgfHwgJHR5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6Ok9ORVdBWSkgeworICAgICAgICBteSAkbmFtZVdpdGhTZXJ2aWNlID0gJHNlbGYtPntzZXJ2aWNlTmFtZX0uU0VQQVJBVE9SLiRuYW1lOworICAgICAgICAkc2VsZi0+U1VQRVI6OndyaXRlTWVzc2FnZUJlZ2luKCRuYW1lV2l0aFNlcnZpY2UsICR0eXBlLCAkc2VxaWQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYtPlNVUEVSOjp3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7CisgICAgfQorfQorCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvUHJvdG9jb2wucG0KaW5kZXggZTI4MDFmZS4uMjZlZjQ2YSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1Byb3RvY29sLnBtCkBAIC0xNywyMyArMTcsMjggQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogdXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OkV4Y2VwdGlvbjsKK3VzZSBUaHJpZnQ6OlR5cGU7CiAKICMKICMgUHJvdG9jb2wgZXhjZXB0aW9ucwogIwotcGFja2FnZSBUUHJvdG9jb2xFeGNlcHRpb247CitwYWNrYWdlIFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uOwogdXNlIGJhc2UoJ1RocmlmdDo6VEV4Y2VwdGlvbicpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCi11c2UgY29uc3RhbnQgVU5LTk9XTiAgICAgICA9PiAwOwotdXNlIGNvbnN0YW50IElOVkFMSURfREFUQSAgPT4gMTsKLXVzZSBjb25zdGFudCBORUdBVElWRV9TSVpFID0+IDI7Ci11c2UgY29uc3RhbnQgU0laRV9MSU1JVCAgICA9PiAzOwotdXNlIGNvbnN0YW50IEJBRF9WRVJTSU9OICAgPT4gNDsKK3VzZSBjb25zdGFudCBVTktOT1dOICAgICAgICAgPT4gMDsKK3VzZSBjb25zdGFudCBJTlZBTElEX0RBVEEgICAgPT4gMTsKK3VzZSBjb25zdGFudCBORUdBVElWRV9TSVpFICAgPT4gMjsKK3VzZSBjb25zdGFudCBTSVpFX0xJTUlUICAgICAgPT4gMzsKK3VzZSBjb25zdGFudCBCQURfVkVSU0lPTiAgICAgPT4gNDsKK3VzZSBjb25zdGFudCBOT1RfSU1QTEVNRU5URUQgPT4gNTsKK3VzZSBjb25zdGFudCBERVBUSF9MSU1JVCAgICAgPT4gNjsKIAogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwpAQCAtNDcsNiArNTIsNyBAQAogIyBQcm90b2NvbCBiYXNlIGNsYXNzIG1vZHVsZS4KICMKIHBhY2thZ2UgVGhyaWZ0OjpQcm90b2NvbDsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwpAQCAtNzUsMzcgKzgxLDM3IEBACiBzdWIgd3JpdGVNZXNzYWdlQmVnaW4KIHsKICAgICBteSAoJG5hbWUsICR0eXBlLCAkc2VxaWQpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCiAjIENsb3NlIHRoZSBtZXNzYWdlCiAjCiBzdWIgd3JpdGVNZXNzYWdlRW5kIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwogIyBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgogIwogIyBAcGFyYW0gc3RyaW5nICAgICAkbmFtZSBTdHJ1Y3QgbmFtZQotIyBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyMgQHRocm93cyBUUHJvdG9jb2xFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKICMgQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgogIwogc3ViIHdyaXRlU3RydWN0QmVnaW4gewogICAgIG15ICgkbmFtZSk7CiAKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwogIyBDbG9zZSBhIHN0cnVjdC4KICMKLSMgQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisjIEB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCiAjIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KICMKIHN1YiB3cml0ZVN0cnVjdEVuZCB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTExNCw4NSArMTIwLDg1IEBACiAjIEBwYXJhbSBzdHJpbmcgICAgICRuYW1lIEZpZWxkIG5hbWUKICMgQHBhcmFtIGludCAgICAgICAgJHR5cGUgRmllbGQgdHlwZQogIyBAcGFyYW0gaW50ICAgICAgICAkZmlkICBGaWVsZCBpZAotIyBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyMgQHRocm93cyBUUHJvdG9jb2xFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKICMgQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgogIwogc3ViIHdyaXRlRmllbGRCZWdpbiB7CiAgICAgbXkgKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKIAotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVGaWVsZEVuZCB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUZpZWxkU3RvcCB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZU1hcEJlZ2luIHsKICAgICBteSAoJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7CiAKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlTWFwRW5kIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlTGlzdEJlZ2luIHsKICAgICBteSAoJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUxpc3RFbmQgewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVTZXRCZWdpbiB7CiAgICAgbXkgKCRlbGVtVHlwZSwgJHNpemUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVTZXRFbmQgewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVCb29sIHsKICAgICBteSAoJGJvb2wpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVCeXRlIHsKICAgICBteSAoJGJ5dGUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVJMTYgewogICAgIG15ICgkaTE2KTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlSTMyIHsKICAgICBteSAoJGkzMik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUk2NCB7CiAgICAgbXkgKCRpNjQpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVEb3VibGUgewogICAgIG15ICgkZHViKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlU3RyaW5nCiB7CiAgICAgbXkgKCRzdHIpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC0yMDUsNyArMjExLDcgQEAKIHN1YiByZWFkTWVzc2FnZUJlZ2luCiB7CiAgICAgbXkgKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtMjEzLDEwNSArMjE5LDEwNSBAQAogIwogc3ViIHJlYWRNZXNzYWdlRW5kCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkU3RydWN0QmVnaW4KIHsKICAgICBteSgkbmFtZSk7CiAKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRTdHJ1Y3RFbmQKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRGaWVsZEJlZ2luCiB7CiAgICAgbXkgKCRuYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkRmllbGRFbmQKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRNYXBCZWdpbgogewogICAgIG15ICgka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRNYXBFbmQKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRMaXN0QmVnaW4KIHsKICAgICBteSAoJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkTGlzdEVuZAogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZFNldEJlZ2luCiB7CiAgICAgbXkgKCRlbGVtVHlwZSwgJHNpemUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZFNldEVuZAogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZEJvb2wKIHsKICAgICBteSAoJGJvb2wpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZEJ5dGUKIHsKICAgICBteSAoJGJ5dGUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZEkxNgogewogICAgIG15ICgkaTE2KTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRJMzIKIHsKICAgICBteSAoJGkzMik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkSTY0CiB7CiAgICAgbXkgKCRpNjQpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZERvdWJsZQogewogICAgIG15ICgkZHViKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRTdHJpbmcKIHsKICAgICBteSAoJHN0cik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTMyOSwzNiArMzM1LDM2IEBACiAgICAgbXkgJHJlc3VsdDsKICAgICBteSAkaTsKIAotICAgIGlmKCR0eXBlID09IFRUeXBlOjpCT09MKQorICAgIGlmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkJPT0wpCiAgICAgewogICAgICAgICByZXR1cm4gJHNlbGYtPnJlYWRCb29sKFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkJZVEUpeworICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkJZVEUpewogICAgICAgICByZXR1cm4gJHNlbGYtPnJlYWRCeXRlKFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkkxNil7CisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STE2KXsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkSTE2KFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkkzMil7CisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STMyKXsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkSTMyKFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6Okk2NCl7CisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STY0KXsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkSTY0KFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkRPVUJMRSl7CisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6RE9VQkxFKXsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkRG91YmxlKFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OlNUUklORykKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVFJJTkcpCiAgICAgewogICAgICAgICByZXR1cm4gJHNlbGYtPnJlYWRTdHJpbmcoXCRyZWYpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6U1RSVUNUKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OlNUUlVDVCkKICAgICB7CiAgICAgICAgICRyZXN1bHQgPSAkc2VsZi0+cmVhZFN0cnVjdEJlZ2luKFwkcmVmKTsKICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgIG15ICgkZnR5cGUsJGZpZCk7CiAgICAgICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5yZWFkRmllbGRCZWdpbihcJHJlZiwgXCRmdHlwZSwgXCRmaWQpOwotICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVE9QKSB7CiAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICRyZXN1bHQgKz0gJHNlbGYtPnNraXAoJGZ0eXBlKTsKQEAgLTM2Nyw3ICszNzMsNyBAQAogICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5yZWFkU3RydWN0RW5kKCk7CiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6TUFQKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6Ok1BUCkKICAgICB7CiAgICAgICAgIG15KCRrZXlUeXBlLCR2YWxUeXBlLCRzaXplKTsKICAgICAgICAgJHJlc3VsdCA9ICRzZWxmLT5yZWFkTWFwQmVnaW4oXCRrZXlUeXBlLCBcJHZhbFR5cGUsIFwkc2l6ZSk7CkBAIC0zNzgsNyArMzg0LDcgQEAKICAgICAgICAgJHJlc3VsdCArPSAkc2VsZi0+cmVhZE1hcEVuZCgpOwogICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OlNFVCkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTRVQpCiAgICAgewogICAgICAgICBteSAoJGVsZW1UeXBlLCRzaXplKTsKICAgICAgICAgJHJlc3VsdCA9ICRzZWxmLT5yZWFkU2V0QmVnaW4oXCRlbGVtVHlwZSwgXCRzaXplKTsKQEAgLTM4OCw3ICszOTQsNyBAQAogICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5yZWFkU2V0RW5kKCk7CiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6TElTVCkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpMSVNUKQogICAgIHsKICAgICAgICAgbXkgKCRlbGVtVHlwZSwkc2l6ZSk7CiAgICAgICAgICRyZXN1bHQgPSAkc2VsZi0+cmVhZExpc3RCZWdpbihcJGVsZW1UeXBlLCBcJHNpemUpOwpAQCAtMzk5LDcgKzQwNSw4IEBACiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KIAotICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCJUeXBlICR0eXBlIG5vdCByZWNvZ25pc2VkIC0tLSBjb3JydXB0IGRhdGE/Iik7CisgICAgZGllIFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uLT5uZXcoIlR5cGUgJHR5cGUgbm90IHJlY29nbml6ZWQgLS0tIGNvcnJ1cHQgZGF0YT8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CiAKICAgfQogCkBAIC00MTUsMzEgKzQyMiwzMSBAQAogICAgIG15ICRpdHJhbnMgPSBzaGlmdDsKICAgICBteSAkdHlwZSAgID0gc2hpZnQ7CiAKLSAgICBpZigkdHlwZSA9PSBUVHlwZTo6Qk9PTCkKLSAgICB7Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgxKTsKLSAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkJZVEUpCisgICAgaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6Qk9PTCkKICAgICB7CiAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDEpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6STE2KQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkJZVEUpCisgICAgeworICAgICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgxKTsKKyAgICB9CisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STE2KQogICAgIHsKICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpJMzIpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STMyKQogICAgIHsKICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoNCk7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpJNjQpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STY0KQogICAgIHsKICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoOCk7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpET1VCTEUpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6RE9VQkxFKQogICAgIHsKICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoOCk7CiAgICAgfQotICAgIGVsc2lmKCAkdHlwZSA9PSBUVHlwZTo6U1RSSU5HICkKKyAgICBlbHNpZiggJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RSSU5HICkKICAgICB7CiAgICAgICAgIG15IEBsZW4gPSB1bnBhY2soJ04nLCAkaXRyYW5zLT5yZWFkQWxsKDQpKTsKICAgICAgICAgbXkgJGxlbiA9ICRsZW5bMF07CkBAIC00NDgsMjUgKzQ1NSwyNSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiA0ICsgJGl0cmFucy0+cmVhZEFsbCgkbGVuKTsKICAgICB9Ci0gICAgZWxzaWYoICR0eXBlID09IFRUeXBlOjpTVFJVQ1QgKQorICAgIGVsc2lmKCAkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVFJVQ1QgKQogICAgIHsKICAgICAgICAgbXkgJHJlc3VsdCA9IDA7CiAgICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgbXkgJGZ0eXBlID0gMDsKLSAgICAgICAgICBteSAkZmlkID0gMDsKLSAgICAgICAgICBteSAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7Ci0gICAgICAgICAgbXkgQGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKLSAgICAgICAgICAkZnR5cGUgPSAkYXJyWzBdOwotICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKLSAgICAgICAgICAgIGxhc3Q7Ci0gICAgICAgICAgfQotICAgICAgICAgICMgSTE2IGZpZWxkIGlkCi0gICAgICAgICAgJHJlc3VsdCArPSAkaXRyYW5zLT5yZWFkQWxsKDIpOwotICAgICAgICAgICRyZXN1bHQgKz0gJHNlbGYtPnNraXBCaW5hcnkoJGl0cmFucywgJGZ0eXBlKTsKKyAgICAgICAgICAgIG15ICRmdHlwZSA9IDA7CisgICAgICAgICAgICBteSAkZmlkID0gMDsKKyAgICAgICAgICAgIG15ICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKKyAgICAgICAgICAgIG15IEBhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICAgICAkZnR5cGUgPSAkYXJyWzBdOworICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVE9QKSB7CisgICAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICMgSTE2IGZpZWxkIGlkCisgICAgICAgICAgICAkcmVzdWx0ICs9ICRpdHJhbnMtPnJlYWRBbGwoMik7CisgICAgICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5za2lwQmluYXJ5KCRpdHJhbnMsICRmdHlwZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpNQVApCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6TUFQKQogICAgIHsKICAgICAgICAgIyBLdHlwZQogICAgICAgICBteSAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7CkBAIC00OTAsNyArNDk3LDcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OlNFVCB8fCAkdHlwZSA9PSBUVHlwZTo6TElTVCkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTRVQgfHwgJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6TElTVCkKICAgICB7CiAgICAgICAgICMgVnR5cGUKICAgICAgICAgbXkgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwpAQCAtNTEwLDE0ICs1MTcsMTUgQEAKICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQogCi0gICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oIlR5cGUgJHR5cGUgbm90IHJlY29nbmlzZWQgLS0tIGNvcnJ1cHQgZGF0YT8iKTsKKyAgICBkaWUgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb24tPm5ldygiVHlwZSAkdHlwZSBub3QgcmVjb2duaXplZCAtLS0gY29ycnVwdCBkYXRhPyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OlRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKIH0KIAogIwogIyBQcm90b2NvbCBmYWN0b3J5IGNyZWF0ZXMgcHJvdG9jb2wgb2JqZWN0cyBmcm9tIHRyYW5zcG9ydHMKICMKLXBhY2thZ2UgVFByb3RvY29sRmFjdG9yeTsKLQorcGFja2FnZSBUaHJpZnQ6OlRQcm90b2NvbEZhY3Rvcnk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcgewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKQEAgLTUzNCw3ICs1NDIsNyBAQAogc3ViIGdldFByb3RvY29sCiB7CiAgICAgbXkgKCR0cmFucyk7Ci0gICAgZGllICJpbnRlcmZhY2UiOworICAgIGRpZSAnaW50ZXJmYWNlJzsKIH0KIAogCmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1Byb3RvY29sRGVjb3JhdG9yLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbERlY29yYXRvci5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzVjOWRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbERlY29yYXRvci5wbQpAQCAtMCwwICsxLDM2MyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6UHJvdG9jb2w7CisKK3BhY2thZ2UgVGhyaWZ0OjpQcm90b2NvbERlY29yYXRvcjsKK3VzZSBiYXNlIHF3KFRocmlmdDo6UHJvdG9jb2wpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHByb3RvY29sICA9IHNoaWZ0OworICAgIG15ICRzZWxmICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCRwcm90b2NvbC0+Z2V0VHJhbnNwb3J0KCkpOworCisgICAgJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfSA9ICRwcm90b2NvbDsKKworICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKK30KKworIworIyBXcml0ZXMgdGhlIG1lc3NhZ2UgaGVhZGVyCisjCisjIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQorIyBAcGFyYW0gaW50ICR0eXBlIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQorIyBAcGFyYW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisjCitzdWIgd3JpdGVNZXNzYWdlQmVnaW4geworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRuYW1lLCAkdHlwZSwgJHNlcWlkKSA9IEBfOworCisgICAgICByZXR1cm4gICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKK30KKworIworIyBDbG9zZSB0aGUgbWVzc2FnZQorIworc3ViIHdyaXRlTWVzc2FnZUVuZCB7CisgICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlTWVzc2FnZUVuZCgpOworfQorCisjCisjIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCisjCisjIEBwYXJhbSBzdHJpbmcgICAgICRuYW1lIFN0cnVjdCBuYW1lCisjIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorIyBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCisjCitzdWIgd3JpdGVTdHJ1Y3RCZWdpbiB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJG5hbWUpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSk7Cit9CisKKyMKKyMgQ2xvc2UgYSBzdHJ1Y3QuCisjCisjIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorIyBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCisjCitzdWIgd3JpdGVTdHJ1Y3RFbmQgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVTdHJ1Y3RFbmQoKTsKK30KKworIworIyBTdGFydHMgYSBmaWVsZC4KKyMKKyMgQHBhcmFtIHN0cmluZyAgICAgJG5hbWUgRmllbGQgbmFtZQorIyBAcGFyYW0gaW50ICAgICAgICAkdHlwZSBGaWVsZCB0eXBlCisjIEBwYXJhbSBpbnQgICAgICAgICRmaWQgIEZpZWxkIGlkCisjIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorIyBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCisjCitzdWIgd3JpdGVGaWVsZEJlZ2luIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCkgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpOworfQorCitzdWIgd3JpdGVGaWVsZEVuZCB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUZpZWxkRW5kKCk7Cit9CisKK3N1YiB3cml0ZUZpZWxkU3RvcCB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUZpZWxkU3RvcCgpOworfQorCitzdWIgd3JpdGVNYXBCZWdpbiB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZU1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOworfQorCitzdWIgd3JpdGVNYXBFbmQgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVNYXBFbmQoKTsKK30KKworc3ViIHdyaXRlTGlzdEJlZ2luIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkZWxlbVR5cGUsICRzaXplKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworfQorCitzdWIgd3JpdGVMaXN0RW5kIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlTGlzdEVuZCgpOworfQorCitzdWIgd3JpdGVTZXRCZWdpbiB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJGVsZW1UeXBlLCAkc2l6ZSkgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworfQorCitzdWIgd3JpdGVTZXRFbmQgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVMaXN0RW5kKCk7Cit9CisKK3N1YiB3cml0ZUJvb2wgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGJvb2wgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUJvb2woJGJvb2wpOworfQorCitzdWIgd3JpdGVCeXRlIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRieXRlID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVCeXRlKCRieXRlKTsKK30KKworc3ViIHdyaXRlSTE2IHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRpMTYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUkxNigkaTE2KTsKK30KKworc3ViIHdyaXRlSTMyIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkaTMyKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlSTMyKCRpMzIpOworCit9CisKK3N1YiB3cml0ZUk2NCB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkaTY0ID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVJNjQoJGk2NCk7Cit9CisKK3N1YiB3cml0ZURvdWJsZSB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkZHViID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVEb3VibGUoJGR1Yik7Cit9CisKK3N1YiB3cml0ZVN0cmluZyB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkc3RyID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVTdHJpbmcoJHN0cik7Cit9CisKKyMKKyMgUmVhZHMgdGhlIG1lc3NhZ2UgaGVhZGVyCisjCisjIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQorIyBAcGFyYW0gaW50ICR0eXBlIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQorIyBAcGFyZW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisjCitzdWIgcmVhZE1lc3NhZ2VCZWdpbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRuYW1lLCAkdHlwZSwgJHNlcWlkKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOworfQorCisjCisjIFJlYWQgdGhlIGNsb3NlIG9mIG1lc3NhZ2UKKyMKK3N1YiByZWFkTWVzc2FnZUVuZAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZE1lc3NhZ2VFbmQoKTsKK30KKworc3ViIHJlYWRTdHJ1Y3RCZWdpbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJG5hbWUgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkU3RydWN0QmVnaW4oJG5hbWUpOworfQorCitzdWIgcmVhZFN0cnVjdEVuZAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZFN0cnVjdEVuZCgpOworfQorCitzdWIgcmVhZEZpZWxkQmVnaW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkbmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZEZpZWxkQmVnaW4oJG5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKK30KKworc3ViIHJlYWRGaWVsZEVuZAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZEZpZWxkRW5kKCk7Cit9CisKK3N1YiByZWFkTWFwQmVnaW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKK30KKworc3ViIHJlYWRNYXBFbmQKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRNYXBFbmQoKTsKK30KKworc3ViIHJlYWRMaXN0QmVnaW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkZWxlbVR5cGUsICRzaXplKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7Cit9CisKK3N1YiByZWFkTGlzdEVuZAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZExpc3RFbmQoKTsKK30KKworc3ViIHJlYWRTZXRCZWdpbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRlbGVtVHlwZSwgJHNpemUpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZFNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworfQorCitzdWIgcmVhZFNldEVuZAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZFNldEVuZCgpOworfQorCitzdWIgcmVhZEJvb2wKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRib29sID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZEJvb2woJGJvb2wpOworfQorCitzdWIgcmVhZEJ5dGUKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRieXRlID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZEJ5dGUoJGJ5dGUpOworfQorCitzdWIgcmVhZEkxNgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGkxNiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRJMTYoJGkxNik7Cit9CisKK3N1YiByZWFkSTMyCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkaTMyICA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRJMzIoJGkzMik7Cit9CisKK3N1YiByZWFkSTY0Cit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkaTY0ICA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRJNjQoJGk2NCk7Cit9CisKK3N1YiByZWFkRG91YmxlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkZHViICA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWREb3VibGUoJGR1Yik7Cit9CisKK3N1YiByZWFkU3RyaW5nCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkc3RyID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZFN0cmluZygkc3RyKTsKK30KKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU1NMU2VydmVyU29ja2V0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9TU0xTZXJ2ZXJTb2NrZXQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwNjQzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU1NMU2VydmVyU29ja2V0LnBtCkBAIC0wLDAgKzEsNzYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OlNTTFNvY2tldDsKK3VzZSBUaHJpZnQ6OlNlcnZlclNvY2tldDsKKwordXNlIElPOjpTb2NrZXQ6OlNTTDsKKworcGFja2FnZSBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldDsKK3VzZSBiYXNlIHF3KCBUaHJpZnQ6OlNlcnZlclNvY2tldCApOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCisjCisjIENvbnN0cnVjdG9yLgorIyBUYWtlcyBhIGhhc2g6CisjIFNlZSBUaHJpZnQ6OlNvY2tldCBmb3IgYmFzZSBjbGFzcyBwYXJhbWV0ZXJzLgorIyBAcGFyYW1baW5dICBjYSAgICAgY2VydGlmaWNhdGUgYXV0aG9yaXR5IGZpbGVuYW1lIC0gbm90IHJlcXVpcmVkCisjIEBwYXJhbVtpbl0gIGNlcnQgICBjZXJ0aWZpY2F0ZSBmaWxlbmFtZTsgbWF5IGNvbnRhaW4ga2V5IGluIHdoaWNoIGNhc2Uga2V5IGlzIG5vdCByZXF1aXJlZAorIyBAcGFyYW1baW5dICBrZXkgICAgcHJpdmF0ZSBrZXkgZmlsZW5hbWUgZm9yIHRoZSBjZXJ0aWZpY2F0ZSBpZiBpdCBpcyBub3QgaW5zaWRlIHRoZSBjZXJ0IGZpbGUKKyMKK3N1YiBuZXcKK3sKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgICAgICA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoQF8pOworICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7Cit9CisKK3N1YiBfX2NsaWVudAoreworICByZXR1cm4gVGhyaWZ0OjpTU0xTb2NrZXQtPm5ldygpOworfQorCitzdWIgX19saXN0ZW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRvcHRzID0ge0xpc3RlbiAgICAgICAgPT4gJHNlbGYtPntxdWV1ZX0sCisgICAgICAgICAgICAgICAgTG9jYWxBZGRyICAgICA9PiAkc2VsZi0+e2hvc3R9LAorICAgICAgICAgICAgICAgIExvY2FsUG9ydCAgICAgPT4gJHNlbGYtPntwb3J0fSwKKyAgICAgICAgICAgICAgICBQcm90byAgICAgICAgID0+ICd0Y3AnLAorICAgICAgICAgICAgICAgIFJldXNlQWRkciAgICAgPT4gMX07CisKKyAgICBteSAkdmVyaWZ5ID0gSU86OlNvY2tldDo6U1NMOjpTU0xfVkVSSUZZX1BFRVIgfCBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQgfCBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfQ0xJRU5UX09OQ0U7CisKKyAgICAkb3B0cy0+e1NTTF9jYV9maWxlfSAgICAgID0gJHNlbGYtPntjYX0gICAgICBpZiBkZWZpbmVkICRzZWxmLT57Y2F9OworICAgICRvcHRzLT57U1NMX2NlcnRfZmlsZX0gICAgPSAkc2VsZi0+e2NlcnR9ICAgIGlmIGRlZmluZWQgJHNlbGYtPntjZXJ0fTsKKyAgICAkb3B0cy0+e1NTTF9jaXBoZXJfbGlzdH0gID0gJHNlbGYtPntjaXBoZXJzfSBpZiBkZWZpbmVkICRzZWxmLT57Y2lwaGVyc307CisgICAgJG9wdHMtPntTU0xfa2V5X2ZpbGV9ICAgICA9ICRzZWxmLT57a2V5fSAgICAgaWYgZGVmaW5lZCAkc2VsZi0+e2tleX07CisgICAgJG9wdHMtPntTU0xfdXNlX2NlcnR9ICAgICA9IChkZWZpbmVkICRzZWxmLT57Y2VydH0pID8gMSA6IDA7CisgICAgJG9wdHMtPntTU0xfdmVyaWZ5X21vZGV9ICA9IChkZWZpbmVkICRzZWxmLT57Y2F9KSA/ICR2ZXJpZnkgOiBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfTk9ORTsKKyAgICAkb3B0cy0+e1NTTF92ZXJzaW9ufSAgICAgID0gKGRlZmluZWQgJHNlbGYtPnt2ZXJzaW9ufSkgPyAkc2VsZi0+e3ZlcnNpb259IDogJ1NTTHYyMzohU1NMdjM6IVNTTHYyJzsKKworICAgIHJldHVybiBJTzo6U29ja2V0OjpTU0wtPm5ldyglJG9wdHMpOworfQorCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9TU0xTb2NrZXQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1NTTFNvY2tldC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzQ5MjRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9TU0xTb2NrZXQucG0KQEAgLTAsMCArMSwxMjYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OlNvY2tldDsKKwordXNlIElPOjpTb2NrZXQ6OlNTTDsKKworcGFja2FnZSBUaHJpZnQ6OlNTTFNvY2tldDsKK3VzZSBiYXNlIHF3KCBUaHJpZnQ6OlNvY2tldCApOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCisjCisjIENvbnN0cnVjdGlvbiBhbmQgdXNhZ2UKKyMKKyMgbXkgJG9wdHMgPSB7fQorIyBteSAkc29ja2V0ID0gVGhyaWZ0OjpTU0xTb2NrZXQtPm5ldyhcJW9wdHMpOworIworIyBvcHRpb25zOgorIworIyBBbnkgb3B0aW9uIGZyb20gU29ja2V0LnBtIGlzIHZhbGlkLCBhbmQgdGhlbjoKKyMKKyMgY2EgICAgICAgICAgPT4gY2VydGlmaWNhdGUgYXV0aG9yaXR5IGZpbGUgKFBFTSBmaWxlKSB0byBhdXRoZW50aWNhdGUgdGhlCisjICAgICAgICAgICAgICAgIHNlcnZlciBhZ2FpbnN0OyBpZiBub3Qgc3BlY2lmaWVkIHRoZW4gdGhlIHNlcnZlciBpcyBub3QKKyMgICAgICAgICAgICAgICAgYXV0aGVudGljYXRlZAorIyBjZXJ0ICAgICAgICA9PiBjZXJ0aWZpY2F0ZSB0byB1c2UgYXMgdGhlIGNsaWVudDsgaWYgbm90IHNwZWNpZmllZCB0aGVuCisjICAgICAgICAgICAgICAgIHRoZSBjbGllbnQgZG9lcyBub3QgcHJlc2VudCBvbmUgYnV0IHN0aWxsIGNvbm5lY3RzIHVzaW5nCisjICAgICAgICAgICAgICAgIHNlY3VyZSBwcm90b2NvbAorIyBjaXBoZXJzICAgICA9PiBhbGxvd2VkIGNpcGhlciBsaXN0CisjICAgICAgICAgICAgICAgIChzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9kb2NzL2FwcHMvY2lwaGVycy5odG1sI0NJUEhFUl9TVFJJTkdTKQorIyBrZXkgICAgICAgICA9PiBjZXJ0aWZpY2F0ZSBrZXkgZm9yICJjZXJ0IiBvcHRpb24KKyMgdmVyc2lvbiAgICAgPT4gYWNjZXB0YWJsZSBTU0wvVExTIHZlcnNpb25zIC0gaWYgbm90IHNwZWNpZmllZCB0aGVuIHRoZQorIyAgICAgICAgICAgICAgICBkZWZhdWx0IGlzIHRvIHVzZSBTU0x2MjMgaGFuZHNoYWtlIGJ1dCBvbmx5IG5lZ290aWF0ZQorIyAgICAgICAgICAgICAgICBhdCBUTFN2MS4wIG9yIGxhdGVyCisjCisKK3N1YiBuZXcKK3sKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgICAgICA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoQF8pOworCisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCAkY2xhc3NuYW1lKTsKK30KKworc3ViIF9fb3BlbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJG9wdHMgPSB7UGVlckFkZHIgICAgICA9PiAkc2VsZi0+e2hvc3R9LAorICAgICAgICAgICAgICAgIFBlZXJQb3J0ICAgICAgPT4gJHNlbGYtPntwb3J0fSwKKyAgICAgICAgICAgICAgICBQcm90byAgICAgICAgID0+ICd0Y3AnLAorICAgICAgICAgICAgICAgIFRpbWVvdXQgICAgICAgPT4gJHNlbGYtPntzZW5kVGltZW91dH0gLyAxMDAwfTsKKworICAgIG15ICR2ZXJpZnkgPSBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfUEVFUiB8IElPOjpTb2NrZXQ6OlNTTDo6U1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCB8IElPOjpTb2NrZXQ6OlNTTDo6U1NMX1ZFUklGWV9DTElFTlRfT05DRTsKKworICAgICRvcHRzLT57U1NMX2NhX2ZpbGV9ICAgICAgPSAkc2VsZi0+e2NhfSAgICAgIGlmIGRlZmluZWQgJHNlbGYtPntjYX07CisgICAgJG9wdHMtPntTU0xfY2VydF9maWxlfSAgICA9ICRzZWxmLT57Y2VydH0gICAgaWYgZGVmaW5lZCAkc2VsZi0+e2NlcnR9OworICAgICRvcHRzLT57U1NMX2NpcGhlcl9saXN0fSAgPSAkc2VsZi0+e2NpcGhlcnN9IGlmIGRlZmluZWQgJHNlbGYtPntjaXBoZXJzfTsKKyAgICAkb3B0cy0+e1NTTF9rZXlfZmlsZX0gICAgID0gJHNlbGYtPntrZXl9ICAgICBpZiBkZWZpbmVkICRzZWxmLT57a2V5fTsKKyAgICAkb3B0cy0+e1NTTF91c2VfY2VydH0gICAgID0gKGRlZmluZWQgJHNlbGYtPntjZXJ0fSkgPyAxIDogMDsKKyAgICAkb3B0cy0+e1NTTF92ZXJpZnlfbW9kZX0gID0gKGRlZmluZWQgJHNlbGYtPntjYX0pID8gJHZlcmlmeSA6IElPOjpTb2NrZXQ6OlNTTDo6U1NMX1ZFUklGWV9OT05FOworICAgICRvcHRzLT57U1NMX3ZlcnNpb259ICAgICAgPSAoZGVmaW5lZCAkc2VsZi0+e3ZlcnNpb259KSA/ICRzZWxmLT57dmVyc2lvbn0gOiAnU1NMdjIzOiFTU0x2MzohU1NMdjInOworCisgICAgcmV0dXJuIElPOjpTb2NrZXQ6OlNTTC0+bmV3KCUkb3B0cyk7Cit9CisKK3N1YiBfX2Nsb3NlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkc29jayA9ICgkc2VsZi0+e2hhbmRsZX0tPmhhbmRsZXMoKSlbMF07CisgICAgaWYgKCRzb2NrKSB7CisgICAgICAkc29jay0+Y2xvc2UoU1NMX25vX3NodXRkb3duID0+IDEpOworICAgIH0KK30KKworc3ViIF9fcmVjdgoreworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkc29jayA9IHNoaWZ0OworICBteSAkbGVuID0gc2hpZnQ7CisgIG15ICRidWYgPSB1bmRlZjsKKyAgaWYgKCRzb2NrKSB7CisgICAgc3lzcmVhZCgkc29jaywgJGJ1ZiwgJGxlbik7CisgIH0KKyAgcmV0dXJuICRidWY7Cit9CisKK3N1YiBfX3NlbmQKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRzb2NrID0gc2hpZnQ7CisgICAgbXkgJGJ1ZiA9IHNoaWZ0OworICAgIHJldHVybiBzeXN3cml0ZSgkc29jaywgJGJ1Zik7Cit9CisKK3N1YiBfX3dhaXQKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRzb2NrID0gKCRzZWxmLT57aGFuZGxlfS0+aGFuZGxlcygpKVswXTsKKyAgICBpZiAoJHNvY2sgYW5kICRzb2NrLT5wZW5kaW5nKCkgZXEgMCkgeworICAgICAgICByZXR1cm4gJHNlbGYtPlNVUEVSOjpfX3dhaXQoKTsKKyAgICB9CisgICAgcmV0dXJuICRzb2NrOworfQorCisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlci5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyLnBtCmluZGV4IDk2MGZiZDEuLjI4ODIyZTggMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyLnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyLnBtCkBAIC0xNywyNSArMTcsMzEgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogdXNlIFRocmlmdDsKLXVzZSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0OwogdXNlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6OkV4Y2VwdGlvbjsKIAogIwogIyBTZXJ2ZXIgYmFzZSBjbGFzcyBtb2R1bGUKICMKIHBhY2thZ2UgVGhyaWZ0OjpTZXJ2ZXI7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKKyMKICMgMyBwb3NzaWJsZSBjb25zdHJ1Y3RvcnM6CiAjICAgMS4gIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCkKKyMgICAgICAgVXNlcyBhIEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSBhbmQgYSBCaW5hcnlQcm90b2NvbEZhY3RvcnkuCiAjICAgMi4gIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorIyAgICAgICBVc2VzIHRoZSBzYW1lIGZhY3RvcnkgZm9yIGlucHV0IGFuZCBvdXRwdXQgb2YgZWFjaCB0eXBlLgogIyAgIDMuICAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCiAjICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCiAjICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorIwogc3ViIG5ldwogewogICAgIG15ICRjbGFzc25hbWUgICAgPSBzaGlmdDsKQEAgLTQ1LDcgKzUxLDcgQEAKIAogICAgIGlmIChzY2FsYXIgQGFyZ3MgPT0gMikKICAgICB7Ci0gICAgICAkc2VsZiA9IF9pbml0KCRhcmdzWzBdLCAkYXJnc1sxXSwKKyAgICAgICAgJHNlbGYgPSBfaW5pdCgkYXJnc1swXSwgJGFyZ3NbMV0sCiAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5LT5uZXcoKSwKICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnktPm5ldygpLAogICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeS0+bmV3KCksCkBAIC02MSw3ICs2Nyw3IEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICBkaWUgIlRocmlmdDo6U2VydmVyIGV4cGVjdHMgZXhhY3RseSAyLCA0LCBvciA2IGFyZ3MiOworICAgICAgZGllIFRocmlmdDo6VEV4Y2VwdGlvbi0+bmV3KCdUaHJpZnQ6OlNlcnZlciBleHBlY3RzIGV4YWN0bHkgMiwgNCwgb3IgNiBhcmdzJyk7CiAgICAgfQogCiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwpAQCAtODgsNyArOTQsNyBAQAogCiBzdWIgc2VydmUKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIF9jbGllbnRCZWdpbgpAQCAtMTA5LDYyICsxMTUsNjggQEAKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgIG15ICRlICAgID0gc2hpZnQ7CiAKLSAgICBpZiAoJGUgPX4gbS9URXhjZXB0aW9uLyBhbmQgZXhpc3RzICRlLT57bWVzc2FnZX0pIHsKKyAgICBpZiAoJGUtPmlzYSgnVGhyaWZ0OjpURXhjZXB0aW9uJykgYW5kIGV4aXN0cyAkZS0+e21lc3NhZ2V9KSB7CiAgICAgICAgIG15ICRtZXNzYWdlID0gJGUtPnttZXNzYWdlfTsKICAgICAgICAgbXkgJGNvZGUgICAgPSAkZS0+e2NvZGV9OwogICAgICAgICBteSAkb3V0ICAgICA9ICRjb2RlIC4gJzonIC4gJG1lc3NhZ2U7CiAKICAgICAgICAgJG1lc3NhZ2UgPX4gbS9UVHJhbnNwb3J0RXhjZXB0aW9uLyBhbmQgZGllICRvdXQ7Ci0gICAgICAgIGlmICgkbWVzc2FnZSA9fiBtL1RTb2NrZXQvKSB7Ci0gICAgICAgICAgICAjIHN1cHByZXNzIFRTb2NrZXQgbWVzc2FnZXMKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCRtZXNzYWdlID1+IG0vU29ja2V0LykgeworICAgICAgICAgICAgIyBzdXBwcmVzcyBTb2NrZXQgbWVzc2FnZXMKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIHdhcm4gJG91dDsKICAgICAgICAgfQotICAgIH0gZWxzZSB7CisgICAgfQorICAgIGVsc2UgewogICAgICAgICB3YXJuICRlOwogICAgIH0KIH0KIAotCiAjCiAjIFNpbXBsZVNlcnZlciBmcm9tIHRoZSBTZXJ2ZXIgYmFzZSBjbGFzcyB0aGF0IGhhbmRsZXMgb25lIGNvbm5lY3Rpb24gYXQgYSB0aW1lCiAjCiBwYWNrYWdlIFRocmlmdDo6U2ltcGxlU2VydmVyOwotdXNlIGJhc2UgcXcoIFRocmlmdDo6U2VydmVyICk7Cit1c2UgcGFyZW50IC1ub3JlcXVpcmUsICdUaHJpZnQ6OlNlcnZlcic7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7Ci0gICAgbXkgQGFyZ3MgICAgICA9IEBfOwogCi0gICAgbXkgJHNlbGYgICAgICA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoQGFyZ3MpOworICAgIG15ICRzZWxmICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KEBfKTsKKwogICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKIH0KIAogc3ViIHNlcnZlCiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkc3RvcCA9IDA7CiAKICAgICAkc2VsZi0+e3NlcnZlclRyYW5zcG9ydH0tPmxpc3RlbigpOwotICAgIHdoaWxlICgxKQotICAgIHsKKyAgICB3aGlsZSAoISRzdG9wKSB7CiAgICAgICAgIG15ICRjbGllbnQgPSAkc2VsZi0+e3NlcnZlclRyYW5zcG9ydH0tPmFjY2VwdCgpOwotICAgICAgICBteSAkaXRyYW5zID0gJHNlbGYtPntpbnB1dFRyYW5zcG9ydEZhY3Rvcnl9LT5nZXRUcmFuc3BvcnQoJGNsaWVudCk7Ci0gICAgICAgIG15ICRvdHJhbnMgPSAkc2VsZi0+e291dHB1dFRyYW5zcG9ydEZhY3Rvcnl9LT5nZXRUcmFuc3BvcnQoJGNsaWVudCk7Ci0gICAgICAgIG15ICRpcHJvdCAgPSAkc2VsZi0+e2lucHV0UHJvdG9jb2xGYWN0b3J5fS0+Z2V0UHJvdG9jb2woJGl0cmFucyk7Ci0gICAgICAgIG15ICRvcHJvdCAgPSAkc2VsZi0+e291dHB1dFByb3RvY29sRmFjdG9yeX0tPmdldFByb3RvY29sKCRvdHJhbnMpOwotICAgICAgICBldmFsIHsKLSAgICAgICAgICAgICRzZWxmLT5fY2xpZW50QmVnaW4oJGlwcm90LCAkb3Byb3QpOwotICAgICAgICAgICAgd2hpbGUgKDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJHNlbGYtPntwcm9jZXNzb3J9LT5wcm9jZXNzKCRpcHJvdCwgJG9wcm90KTsKKyAgICAgICAgaWYgKGRlZmluZWQgJGNsaWVudCkgeworICAgICAgICAgICAgbXkgJGl0cmFucyA9ICRzZWxmLT57aW5wdXRUcmFuc3BvcnRGYWN0b3J5fS0+Z2V0VHJhbnNwb3J0KCRjbGllbnQpOworICAgICAgICAgICAgbXkgJG90cmFucyA9ICRzZWxmLT57b3V0cHV0VHJhbnNwb3J0RmFjdG9yeX0tPmdldFRyYW5zcG9ydCgkY2xpZW50KTsKKyAgICAgICAgICAgIG15ICRpcHJvdCAgPSAkc2VsZi0+e2lucHV0UHJvdG9jb2xGYWN0b3J5fS0+Z2V0UHJvdG9jb2woJGl0cmFucyk7CisgICAgICAgICAgICBteSAkb3Byb3QgID0gJHNlbGYtPntvdXRwdXRQcm90b2NvbEZhY3Rvcnl9LT5nZXRQcm90b2NvbCgkb3RyYW5zKTsKKyAgICAgICAgICAgIGV2YWwgeworICAgICAgICAgICAgICAgICRzZWxmLT5fY2xpZW50QmVnaW4oJGlwcm90LCAkb3Byb3QpOworICAgICAgICAgICAgICAgIHdoaWxlICgxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntwcm9jZXNzb3J9LT5wcm9jZXNzKCRpcHJvdCwgJG9wcm90KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgaWYoJEApIHsKKyAgICAgICAgICAgICAgICAkc2VsZi0+X2hhbmRsZUV4Y2VwdGlvbigkQCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH07IGlmKCRAKSB7Ci0gICAgICAgICAgICAkc2VsZi0+X2hhbmRsZUV4Y2VwdGlvbigkQCk7CisgICAgICAgICAgICAkaXRyYW5zLT5jbG9zZSgpOworICAgICAgICAgICAgJG90cmFucy0+Y2xvc2UoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRzdG9wID0gMTsKICAgICAgICAgfQotCi0gICAgICAgICRpdHJhbnMtPmNsb3NlKCk7Ci0gICAgICAgICRvdHJhbnMtPmNsb3NlKCk7CiAgICAgfQogfQogCkBAIC0xNzMsOSArMTg1LDkgQEAKICMgRm9ya2luZ1NlcnZlciB0aGF0IGZvcmtzIGEgbmV3IHByb2Nlc3MgZm9yIGVhY2ggcmVxdWVzdAogIwogcGFja2FnZSBUaHJpZnQ6OkZvcmtpbmdTZXJ2ZXI7Ci11c2UgYmFzZSBxdyggVGhyaWZ0OjpTZXJ2ZXIgKTsKLQotdXNlIFBPU0lYICI6c3lzX3dhaXRfaCI7Cit1c2UgcGFyZW50IC1ub3JlcXVpcmUsICdUaHJpZnQ6OlNlcnZlcic7Cit1c2UgUE9TSVggJzpzeXNfd2FpdF9oJzsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldwogewpAQCAtMTkxLDYgKzIwMyw5IEBACiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKIAorICAgICMgVEhSSUZULTM4NDg6IHdpdGhvdXQgaWdub3JpbmcgU0lHQ0hMRCwgcGVybCBGb3JraW5nU2VydmVyIGdvZXMgaW50byBhIHRpZ2h0IGxvb3AKKyAgICAkU0lHe0NITER9ID0gJ0lHTk9SRSc7CisKICAgICAkc2VsZi0+e3NlcnZlclRyYW5zcG9ydH0tPmxpc3RlbigpOwogICAgIHdoaWxlICgxKQogICAgIHsKQEAgLTIxNSwxMyArMjMwLDE1IEBACiAKICAgICAgICAgbXkgJHBpZCA9IGZvcmsoKTsKIAotICAgICAgICBpZiAoJHBpZCkgI3BhcmVudAorICAgICAgICBpZiAoJHBpZCkKICAgICAgICAgewogICAgICAgICAgICAgJHNlbGYtPl9wYXJlbnQoJHBpZCwgJGl0cmFucywgJG90cmFucyk7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAkc2VsZi0+X2NoaWxkKCRpdHJhbnMsICRvdHJhbnMsICRpcHJvdCwgJG9wcm90KTsKICAgICAgICAgfQotICAgIH07IGlmKCRAKSB7CisgICAgfTsKKyAgICBpZigkQCkgewogICAgICAgICAkc2VsZi0+X2hhbmRsZUV4Y2VwdGlvbigkQCk7CiAgICAgfQogfQpAQCAtMjMzLDEwICsyNTAsNiBAQAogICAgIG15ICRpdHJhbnMgPSBzaGlmdDsKICAgICBteSAkb3RyYW5zID0gc2hpZnQ7CiAKLSAgICAjIGFkZCBiZWZvcmUgY29sbGVjdCwgb3RoZXJ3aXNlIHlvdSByYWNlIHcvIHdhaXRwaWQKLSAgICAkc2VsZi0+e2NoaWxkcmVufS0+eyRwaWR9ID0gMTsKLSAgICAkc2VsZi0+X2NvbGxlY3RDaGlsZHJlbigpOwotCiAgICAgIyBQYXJlbnQgbXVzdCBjbG9zZSBzb2NrZXQgb3IgdGhlIGNvbm5lY3Rpb24gbWF5IG5vdCBnZXQgY2xvc2VkIHByb21wdGx5CiAgICAgJHNlbGYtPnRyeUNsb3NlKCRpdHJhbnMpOwogICAgICRzZWxmLT50cnlDbG9zZSgkb3RyYW5zKTsKQEAgLTI1MiwxMSArMjY1LDE0IEBACiAKICAgICBteSAkZWNvZGUgPSAwOwogICAgIGV2YWwgeworICAgICAgICAjIFRIUklGVC00MDY1IGVuc3VyZSBjaGlsZCBwcm9jZXNzIGhhcyBub3JtYWwgc2lnbmFsIGhhbmRsaW5nIGluIGNhc2UgdGhyaWZ0IGhhbmRsZXIgdXNlcyBpdAorICAgICAgICAkU0lHe0NITER9ID0gJ0RFRkFVTFQnOwogICAgICAgICB3aGlsZSAoMSkKICAgICAgICAgewogICAgICAgICAgICAgJHNlbGYtPntwcm9jZXNzb3J9LT5wcm9jZXNzKCRpcHJvdCwgJG9wcm90KTsKICAgICAgICAgfQotICAgIH07IGlmKCRAKSB7CisgICAgfTsKKyAgICBpZigkQCkgewogICAgICAgICAkZWNvZGUgPSAxOwogICAgICAgICAkc2VsZi0+X2hhbmRsZUV4Y2VwdGlvbigkQCk7CiAgICAgfQpAQCAtMjc3LDM3ICsyOTMsMTkgQEAKICAgICAgICAgewogICAgICAgICAgICRmaWxlLT5jbG9zZSgpOwogICAgICAgICB9Ci0gICAgfTsgaWYoJEApIHsKLSAgICAgICAgaWYgKCRAID1+IG0vVEV4Y2VwdGlvbi8gYW5kIGV4aXN0cyAkQC0+e21lc3NhZ2V9KSB7CisgICAgfTsKKyAgICBpZigkQCkgeworICAgICAgICBpZiAoJEAtPmlzYSgnVGhyaWZ0OjpURXhjZXB0aW9uJykgYW5kIGV4aXN0cyAkQC0+e21lc3NhZ2V9KSB7CiAgICAgICAgICAgICBteSAkbWVzc2FnZSA9ICRALT57bWVzc2FnZX07CiAgICAgICAgICAgICBteSAkY29kZSAgICA9ICRALT57Y29kZX07CiAgICAgICAgICAgICBteSAkb3V0ICAgICA9ICRjb2RlIC4gJzonIC4gJG1lc3NhZ2U7CiAKICAgICAgICAgICAgIHdhcm4gJG91dDsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIHdhcm4gJEA7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXN1YiBfY29sbGVjdENoaWxkcmVuCi17Ci0gICAgbXkgJHNlbGYgPSBzaGlmdDsKLQotICAgIHdoaWxlIChzY2FsYXIga2V5cyAleyRzZWxmLT57Y2hpbGRyZW59fSkKLSAgICB7Ci0gICAgICAgIG15ICRwaWQgICAgPSB3YWl0cGlkKC0xLCBXTk9IQU5HKTsKLQotICAgICAgICBpZiAoJHBpZD4wKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWxldGUgJHNlbGYtPntjaGlsZHJlbn0tPnskcGlkfTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxhc3Q7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQogMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyU29ja2V0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9TZXJ2ZXJTb2NrZXQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk3MjY0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyU29ja2V0LnBtCkBAIC0wLDAgKzEsMTI1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBJTzo6U29ja2V0OjpJTkVUOwordXNlIElPOjpTZWxlY3Q7Cit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6VHJhbnNwb3J0OwordXNlIFRocmlmdDo6U29ja2V0OworCitwYWNrYWdlIFRocmlmdDo6U2VydmVyU29ja2V0OwordXNlIGJhc2UgcXcoIFRocmlmdDo6U2VydmVyVHJhbnNwb3J0ICk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKKyMKKyMgQ29uc3RydWN0b3IuCisjIExlZ2FjeSBjb25zdHJ1Y3Rpb24gdGFrZXMgb25lIGFyZ3VtZW50LCBwb3J0IG51bWJlci4KKyMgTmV3IGNvbnN0cnVjdGlvbiB0YWtlcyBhIGhhc2g6CisjIEBwYXJhbVtpbl0gIGhvc3QgICBob3N0IGludGVyZmFjZSB0byBsaXN0ZW4gb24gKHVuZGVmID0gYWxsIGludGVyZmFjZXMpCisjIEBwYXJhbVtpbl0gIHBvcnQgICBwb3J0IG51bWJlciB0byBsaXN0ZW4gb24gKHJlcXVpcmVkKQorIyBAcGFyYW1baW5dICBxdWV1ZSAgdGhlIGxpc3RlbiBxdWV1ZSBzaXplIChkZWZhdWx0IGlmIG5vdCBzcGVjaWZpZWQgaXMgMTI4KQorIyBAZXhhbXBsZSAgICBteSAkc2VydmVyc29jayA9IFRocmlmdDo6U2VydmVyU29ja2V0LT5uZXcoaG9zdCA9PiB1bmRlZiwgcG9ydCA9PiBwb3J0KQorIworc3ViIG5ldworeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkYXJncyAgICAgID0gc2hpZnQ7CisgICAgbXkgJHNlbGY7CisKKyAgICAjIFN1cHBvcnQgYm90aCBvbGQtc3R5bGUgInBvcnQgbnVtYmVyIiBjb25zdHJ1Y3Rpb24gYW5kIG5ld2VyLi4uCisgICAgaWYgKHJlZigkYXJncykgZXEgJ0hBU0gnKSB7CisgICAgICAgICRzZWxmID0gJGFyZ3M7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZiA9IHsgcG9ydCA9PiAkYXJncyB9OworICAgIH0KKworICAgIGlmIChub3QgZGVmaW5lZCAkc2VsZi0+e3F1ZXVlfSkgeworICAgICAgICAkc2VsZi0+e3F1ZXVlfSA9IDEyODsKKyAgICB9CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsICRjbGFzc25hbWUpOworfQorCitzdWIgbGlzdGVuCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRzb2NrID0gJHNlbGYtPl9fbGlzdGVuKCkgfHwgZG8geworICAgICAgICBteSAkZXJyb3IgPSByZWYoJHNlbGYpIC4gJzogQ291bGQgbm90IGJpbmQgdG8gJyAuICcqOicgLiAkc2VsZi0+e3BvcnR9IC4gJyAoJyAuICQhIC4gJyknOworCisgICAgICAgIGlmICgkc2VsZi0+e2RlYnVnfSkgeworICAgICAgICAgICAgJHNlbGYtPntkZWJ1Z0hhbmRsZXJ9LT4oJGVycm9yKTsKKyAgICAgICAgfQorCisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygkZXJyb3IsIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgIH07CisKKyAgICAkc2VsZi0+e2hhbmRsZX0gPSAkc29jazsKK30KKworc3ViIGFjY2VwdAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBpZiAoIGV4aXN0cyAkc2VsZi0+e2hhbmRsZX0gYW5kIGRlZmluZWQgJHNlbGYtPntoYW5kbGV9ICkgeworICAgICAgICBteSAkY2xpZW50ICAgICAgICA9ICRzZWxmLT57aGFuZGxlfS0+YWNjZXB0KCk7CisgICAgICAgIG15ICRyZXN1bHQgICAgICAgID0gJHNlbGYtPl9fY2xpZW50KCk7CisgICAgICAgICRyZXN1bHQtPntoYW5kbGV9ID0gSU86OlNlbGVjdC0+bmV3KCRjbGllbnQpOworICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICB9CisKKyAgICByZXR1cm4gdW5kZWY7Cit9CisKK3N1YiBjbG9zZQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBpZiAoIGV4aXN0cyAkc2VsZi0+e2hhbmRsZX0gYW5kIGRlZmluZWQgJHNlbGYtPntoYW5kbGV9ICkKKyAgICB7CisgICAgICAgICRzZWxmLT57aGFuZGxlfS0+Y2xvc2UoKTsKKyAgICB9Cit9CisKKyMjIworIyMjIE92ZXJyaWRhYmxlIG1ldGhvZHMKKyMjIworCitzdWIgX19jbGllbnQKK3sKKyAgcmV0dXJuIFRocmlmdDo6U29ja2V0LT5uZXcoKTsKK30KKworc3ViIF9fbGlzdGVuCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICByZXR1cm4gSU86OlNvY2tldDo6SU5FVC0+bmV3KExvY2FsQWRkciA9PiAkc2VsZi0+e2hvc3R9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxQb3J0ID0+ICRzZWxmLT57cG9ydH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90byAgICAgPT4gJ3RjcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0ZW4gICAgPT4gJHNlbGYtPntxdWV1ZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXVzZUFkZHIgPT4gMSk7Cit9CisKKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU29ja2V0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9Tb2NrZXQucG0KaW5kZXggN2ViZWEzNS4uYmEwZGI1ZSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9Tb2NrZXQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9Tb2NrZXQucG0KQEAgLTE3LDM3ICsxNyw2MyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCiB1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6RXhjZXB0aW9uOwogdXNlIFRocmlmdDo6VHJhbnNwb3J0OwogCiB1c2UgSU86OlNvY2tldDo6SU5FVDsKIHVzZSBJTzo6U2VsZWN0OwogCiBwYWNrYWdlIFRocmlmdDo6U29ja2V0OwordXNlIGJhc2UgcXcoIFRocmlmdDo6VHJhbnNwb3J0ICk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKLXVzZSBiYXNlKCdUaHJpZnQ6OlRyYW5zcG9ydCcpOworIworIyBDb25zdHJ1Y3Rpb24gYW5kIHVzYWdlCisjCisjIG15ICRvcHRzID0ge30KKyMgbXkgJHNvY2tldCA9IFRocmlmdDo6U29ja2V0LT5uZXcoXCVvcHRzKTsKKyMKKyMgb3B0aW9uczoKKyMKKyMgaG9zdCAgICAgICAgPT4gaG9zdCB0byBjb25uZWN0IHRvCisjIHBvcnQgICAgICAgID0+IHBvcnQgdG8gY29ubmVjdCB0bworIyBzZW5kVGltZW91dCA9PiB0aW1lb3V0IHVzZWQgZm9yIHNlbmQgYW5kIGZvciBjb25uZWN0CisjIHJlY3ZUaW1lb3V0ID0+IHRpbWVvdXQgdXNlZCBmb3IgcmVjdgorIwogCiBzdWIgbmV3CiB7Ci0gICAgbXkgJGNsYXNzbmFtZSAgICA9IHNoaWZ0OwotICAgIG15ICRob3N0ICAgICAgICAgPSBzaGlmdCB8fCAibG9jYWxob3N0IjsKLSAgICBteSAkcG9ydCAgICAgICAgID0gc2hpZnQgfHwgOTA5MDsKLSAgICBteSAkZGVidWdIYW5kbGVyID0gc2hpZnQ7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRvcHRzICAgICAgPSBzaGlmdDsKIAorICAgICMgZGVmYXVsdCBzZXR0aW5nczoKICAgICBteSAkc2VsZiA9IHsKLSAgICAgICAgaG9zdCAgICAgICAgID0+ICRob3N0LAotICAgICAgICBwb3J0ICAgICAgICAgPT4gJHBvcnQsCi0gICAgICAgIGRlYnVnSGFuZGxlciA9PiAkZGVidWdIYW5kbGVyLAotICAgICAgICBkZWJ1ZyAgICAgICAgPT4gMCwKLSAgICAgICAgc2VuZFRpbWVvdXQgID0+IDEwMDAwLAorICAgICAgICBob3N0ICAgICAgICAgPT4gJ2xvY2FsaG9zdCcsCisgICAgICAgIHBvcnQgICAgICAgICA9PiA5MDkwLAogICAgICAgICByZWN2VGltZW91dCAgPT4gMTAwMDAsCi0gICAgICAgIGhhbmRsZSAgICAgICA9PiB1bmRlZiwKKyAgICAgICAgc2VuZFRpbWVvdXQgID0+IDEwMDAwLAorCisgICAgICAgIGhhbmRsZSAgICAgICA9PiB1bmRlZgogICAgIH07CiAKKyAgICBpZiAoZGVmaW5lZCAkb3B0cyBhbmQgcmVmICRvcHRzIGVxIHJlZiB7fSkgeworCisgICAgICAjIGFyZ3VtZW50IGlzIGEgaGFzaCBvZiBvcHRpb25zIHNvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cworICAgICAgJHNlbGYtPnskX30gPSAkb3B0cy0+eyRffSBmb3Iga2V5cyAlJG9wdHM7CisKKyAgICB9IGVsc2UgeworCisgICAgICAjIG9sZGVyIHN0eWxlIGNvbnN0cnVjdG9yIHRha2VzIDMgYXJndW1lbnRzLCBub25lIG9mIHdoaWNoIGFyZSByZXF1aXJlZAorICAgICAgJHNlbGYtPntob3N0fSA9ICRvcHRzIHx8ICdsb2NhbGhvc3QnOworICAgICAgJHNlbGYtPntwb3J0fSA9IHNoaWZ0IHx8IDkwOTA7CisKKyAgICB9CisKICAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7CiB9CiAKQEAgLTcwLDE5ICs5Niw2IEBACiAKIAogIwotI1NldHMgZGVidWdnaW5nIG91dHB1dCBvbiBvciBvZmYKLSMKLSMgQHBhcmFtIGJvb2wgJGRlYnVnCi0jCi1zdWIgc2V0RGVidWcKLXsKLSAgICBteSAkc2VsZiAgPSBzaGlmdDsKLSAgICBteSAkZGVidWcgPSBzaGlmdDsKLQotICAgICRzZWxmLT57ZGVidWd9ID0gJGRlYnVnOwotfQotCi0jCiAjIFRlc3RzIHdoZXRoZXIgdGhpcyBpcyBvcGVuCiAjCiAjIEByZXR1cm4gYm9vbCB0cnVlIGlmIHRoZSBzb2NrZXQgaXMgb3BlbgpAQCAtMTA1LDIzICsxMTgsMTIgQEAKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogCi0gICAgbXkgJHNvY2sgPSBJTzo6U29ja2V0OjpJTkVULT5uZXcoUGVlckFkZHIgPT4gJHNlbGYtPntob3N0fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVlclBvcnQgPT4gJHNlbGYtPntwb3J0fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG8gICAgPT4gJ3RjcCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQgID0+ICRzZWxmLT57c2VuZFRpbWVvdXR9LzEwMDApCi0gICAgICAgIHx8IGRvIHsKLSAgICAgICAgICAgIG15ICRlcnJvciA9ICdUU29ja2V0OiBDb3VsZCBub3QgY29ubmVjdCB0byAnLiRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0uJyAoJy4kIS4nKSc7CisgICAgbXkgJHNvY2sgPSAkc2VsZi0+X19vcGVuKCkgfHwgZG8geworICAgICAgICBteSAkZXJyb3IgPSByZWYoJHNlbGYpLic6IENvdWxkIG5vdCBjb25uZWN0IHRvICcuJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fS4nICgnLiQhLicpJzsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCRlcnJvciwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7CisgICAgfTsKIAotICAgICAgICAgICAgaWYgKCRzZWxmLT57ZGVidWd9KSB7Ci0gICAgICAgICAgICAgICAgJHNlbGYtPntkZWJ1Z0hhbmRsZXJ9LT4oJGVycm9yKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJGVycm9yKTsKLQotICAgICAgICB9OwotCi0KLSAgICAkc2VsZi0+e2hhbmRsZX0gPSBuZXcgSU86OlNlbGVjdCggJHNvY2sgKTsKKyAgICAkc2VsZi0+e2hhbmRsZX0gPSBJTzo6U2VsZWN0LT5uZXcoICRzb2NrICk7CiB9CiAKICMKQEAgLTEzMCw5ICsxMzIsOCBAQAogc3ViIGNsb3NlCiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKLQotICAgIGlmKCBkZWZpbmVkICRzZWxmLT57aGFuZGxlfSApewotICAgICAgICBDT1JFOjpjbG9zZSggKCRzZWxmLT57aGFuZGxlfS0+aGFuZGxlcygpKVswXSApOworICAgIGlmKCBkZWZpbmVkICRzZWxmLT57aGFuZGxlfSApIHsKKyAgICAgICRzZWxmLT5fX2Nsb3NlKCk7CiAgICAgfQogfQogCkBAIC0xNTMsMzAgKzE1NCwyMiBAQAogICAgIG15ICRwcmUgPSAiIjsKICAgICB3aGlsZSAoMSkgewogCi0gICAgICAgICNjaGVjayBmb3IgdGltZW91dAotICAgICAgICBteSBAc29ja2V0cyA9ICRzZWxmLT57aGFuZGxlfS0+Y2FuX3JlYWQoICRzZWxmLT57cmVjdlRpbWVvdXR9IC8gMTAwMCApOwotCi0gICAgICAgIGlmKEBzb2NrZXRzID09IDApewotICAgICAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCByZWFkaW5nICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgbXkgJHNvY2sgPSAkc29ja2V0c1swXTsKLQotICAgICAgICBteSAoJGJ1Ziwkc3opOwotICAgICAgICAkc29jay0+cmVjdigkYnVmLCAkbGVuKTsKKyAgICAgICAgbXkgJHNvY2sgPSAkc2VsZi0+X193YWl0KCk7CisgICAgICAgIG15ICRidWYgPSAkc2VsZi0+X19yZWN2KCRzb2NrLCAkbGVuKTsKIAogICAgICAgICBpZiAoIWRlZmluZWQgJGJ1ZiB8fCAkYnVmIGVxICcnKSB7CiAKLSAgICAgICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcyBmcm9tICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSk7CisgICAgICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcocmVmKCRzZWxmKS4nOiBDb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcyBmcm9tICcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSk7CiAKLSAgICAgICAgfSBlbHNpZiAoKCRzeiA9IGxlbmd0aCgkYnVmKSkgPCAkbGVuKSB7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKChteSAkc3ogPSBsZW5ndGgoJGJ1ZikpIDwgJGxlbikgewogCiAgICAgICAgICAgICAkcHJlIC49ICRidWY7CiAgICAgICAgICAgICAkbGVuIC09ICRzejsKIAotICAgICAgICB9IGVsc2UgeworICAgICAgICB9CisgICAgICAgIGVsc2UgewogICAgICAgICAgICAgcmV0dXJuICRwcmUuJGJ1ZjsKICAgICAgICAgfQogICAgIH0KQEAgLTE5NSwyMyArMTg4LDEzIEBACiAKICAgICByZXR1cm4gdW5sZXNzIGRlZmluZWQgJHNlbGYtPntoYW5kbGV9OwogCi0gICAgI2NoZWNrIGZvciB0aW1lb3V0Ci0gICAgbXkgQHNvY2tldHMgPSAkc2VsZi0+e2hhbmRsZX0tPmNhbl9yZWFkKCAkc2VsZi0+e3JlY3ZUaW1lb3V0fSAvIDEwMDAgKTsKLQotICAgIGlmKEBzb2NrZXRzID09IDApewotICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbignVFNvY2tldDogdGltZWQgb3V0IHJlYWRpbmcgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9KTsKLSAgICB9Ci0KLSAgICBteSAkc29jayA9ICRzb2NrZXRzWzBdOwotCi0gICAgbXkgKCRidWYsJHN6KTsKLSAgICAkc29jay0+cmVjdigkYnVmLCAkbGVuKTsKKyAgICBteSAkc29jayA9ICRzZWxmLT5fX3dhaXQoKTsKKyAgICBteSAkYnVmID0gJHNlbGYtPl9fcmVjdigkc29jaywgJGxlbik7CiAKICAgICBpZiAoIWRlZmluZWQgJGJ1ZiB8fCAkYnVmIGVxICcnKSB7CiAKLSAgICAgICAgZGllIG5ldyBURXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcyBmcm9tICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9KTsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KHJlZigkc2VsZikuJzogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSk7CiAKICAgICB9CiAKQEAgLTIyOSwzMCArMjEyLDI3IEBACiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICBteSAkYnVmICA9IHNoaWZ0OwogCi0KICAgICByZXR1cm4gdW5sZXNzIGRlZmluZWQgJHNlbGYtPntoYW5kbGV9OwogCiAgICAgd2hpbGUgKGxlbmd0aCgkYnVmKSA+IDApIHsKLQotCiAgICAgICAgICNjaGVjayBmb3IgdGltZW91dAogICAgICAgICBteSBAc29ja2V0cyA9ICRzZWxmLT57aGFuZGxlfS0+Y2FuX3dyaXRlKCAkc2VsZi0+e3NlbmRUaW1lb3V0fSAvIDEwMDAgKTsKIAogICAgICAgICBpZihAc29ja2V0cyA9PSAwKXsKLSAgICAgICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCdUU29ja2V0OiB0aW1lZCBvdXQgd3JpdGluZyB0byBieXRlcyBmcm9tICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9KTsKKyAgICAgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldyhyZWYoJHNlbGYpLic6IHRpbWVkIG91dCB3cml0aW5nIHRvIGJ5dGVzIGZyb20gJy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0sIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUKTsKICAgICAgICAgfQogCi0gICAgICAgIG15ICRzb2NrID0gJHNvY2tldHNbMF07CisgICAgICAgIG15ICRzZW50ID0gJHNlbGYtPl9fc2VuZCgkc29ja2V0c1swXSwgJGJ1Zik7CiAKLSAgICAgICAgbXkgJGdvdCA9ICRzb2NrLT5zZW5kKCRidWYpOworICAgICAgICBpZiAoIWRlZmluZWQgJHNlbnQgfHwgJHNlbnQgPT0gMCApIHsKIAotICAgICAgICBpZiAoIWRlZmluZWQgJGdvdCB8fCAkZ290ID09IDAgKSB7Ci0gICAgICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHdyaXRlICcubGVuZ3RoKCRidWYpLicgYnl0ZXMgJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57aG9zdH0pOworICAgICAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KHJlZigkc2VsZikuJzogQ291bGQgbm90IHdyaXRlICcubGVuZ3RoKCRidWYpLicgYnl0ZXMgJy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57aG9zdH0sIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpOworCiAgICAgICAgIH0KIAotICAgICAgICAkYnVmID0gc3Vic3RyKCRidWYsICRnb3QpOworICAgICAgICAkYnVmID0gc3Vic3RyKCRidWYsICRzZW50KTsKICAgICB9CiB9CiAKQEAgLTI2NSw2NSArMjQ1LDgyIEBACiAKICAgICByZXR1cm4gdW5sZXNzIGRlZmluZWQgJHNlbGYtPntoYW5kbGV9OwogCi0gICAgbXkgJHJldCAgPSAoJHNlbGYtPntoYW5kbGV9LT5oYW5kbGVzKCkpWzBdLT5mbHVzaDsKKyAgICBteSAkcmV0ID0gKCRzZWxmLT57aGFuZGxlfS0+aGFuZGxlcygpKVswXS0+Zmx1c2g7CiB9CiAKKyMjIworIyMjIE92ZXJyaWRhYmxlIG1ldGhvZHMKKyMjIwogCiAjCi0jIEJ1aWxkIGEgU2VydmVyU29ja2V0IGZyb20gdGhlIFNlcnZlclRyYW5zcG9ydCBiYXNlIGNsYXNzCisjIE9wZW4gYSBjb25uZWN0aW9uIHRvIGEgc2VydmVyLgogIwotcGFja2FnZSAgVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQ7Ci0KLXVzZSBiYXNlIHF3KCBUaHJpZnQ6OlNvY2tldCBUaHJpZnQ6OlNlcnZlclRyYW5zcG9ydCApOwotCi11c2UgY29uc3RhbnQgTElTVEVOX1FVRVVFX1NJWkUgPT4gMTI4OwotCi1zdWIgbmV3Ci17Ci0gICAgbXkgJGNsYXNzbmFtZSAgID0gc2hpZnQ7Ci0gICAgbXkgJHBvcnQgICAgICAgID0gc2hpZnQ7Ci0KLSAgICBteSAkc2VsZiAgICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KHVuZGVmLCAkcG9ydCwgdW5kZWYpOwotICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKLX0KLQotc3ViIGxpc3Rlbgorc3ViIF9fb3BlbgogewogICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0KLSAgICAjIExpc3RlbiB0byBhIG5ldyBzb2NrZXQKLSAgICBteSAkc29jayA9IElPOjpTb2NrZXQ6OklORVQtPm5ldyhMb2NhbEFkZHIgPT4gdW5kZWYsICMgYW55IGFkZHIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbFBvcnQgPT4gJHNlbGYtPntwb3J0fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90byAgICAgPT4gJ3RjcCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdGVuICAgID0+IExJU1RFTl9RVUVVRV9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldXNlQWRkciA9PiAxKQotICAgICAgICB8fCBkbyB7Ci0gICAgICAgICAgICBteSAkZXJyb3IgPSAnVFNlcnZlclNvY2tldDogQ291bGQgbm90IGJpbmQgdG8gJyAuCi0gICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9IC4gJzonIC4gJHNlbGYtPntwb3J0fSAuICcgKCcgLiAkISAuICcpJzsKLQotICAgICAgICAgICAgaWYgKCRzZWxmLT57ZGVidWd9KSB7Ci0gICAgICAgICAgICAgICAgJHNlbGYtPntkZWJ1Z0hhbmRsZXJ9LT4oJGVycm9yKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJGVycm9yKTsKLSAgICAgICAgfTsKLQotICAgICRzZWxmLT57aGFuZGxlfSA9ICRzb2NrOworICAgIHJldHVybiBJTzo6U29ja2V0OjpJTkVULT5uZXcoUGVlckFkZHIgPT4gJHNlbGYtPntob3N0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlZXJQb3J0ID0+ICRzZWxmLT57cG9ydH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90byAgICA9PiAndGNwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQgID0+ICRzZWxmLT57c2VuZFRpbWVvdXR9IC8gMTAwMCk7CiB9CiAKLXN1YiBhY2NlcHQKKyMKKyMgQ2xvc2UgdGhlIGNvbm5lY3Rpb24KKyMKK3N1YiBfX2Nsb3NlCit7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgQ09SRTo6Y2xvc2UoKCRzZWxmLT57aGFuZGxlfS0+aGFuZGxlcygpKVswXSk7Cit9CisKKyMKKyMgUmVhZCBkYXRhCisjCisjIEBwYXJhbVtpbl0gJHNvY2sgdGhlIHNvY2tldAorIyBAcGFyYW1baW5dICRsZW4gdGhlIGxlbmd0aCB0byByZWFkCisjIEByZXR1cm5zIHRoZSBkYXRhIGJ1ZmZlciB0aGF0IHdhcyByZWFkCisjCitzdWIgX19yZWN2Cit7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICRzb2NrID0gc2hpZnQ7CisgIG15ICRsZW4gPSBzaGlmdDsKKyAgbXkgJGJ1ZiA9IHVuZGVmOworICAkc29jay0+cmVjdigkYnVmLCAkbGVuKTsKKyAgcmV0dXJuICRidWY7Cit9CisKKyMKKyMgU2VuZCBkYXRhCisjCisjIEBwYXJhbVtpbl0gJHNvY2sgdGhlIHNvY2tldAorIyBAcGFyYW1baW5dICRidWYgdGhlIGRhdGEgYnVmZmVyCisjIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbgorIworc3ViIF9fc2VuZAogewogICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHNvY2sgPSBzaGlmdDsKKyAgICBteSAkYnVmID0gc2hpZnQ7CisgICAgcmV0dXJuICRzb2NrLT5zZW5kKCRidWYpOworfQogCi0gICAgaWYgKCBleGlzdHMgJHNlbGYtPntoYW5kbGV9IGFuZCBkZWZpbmVkICRzZWxmLT57aGFuZGxlfSApCi0gICAgewotICAgICAgICBteSAkY2xpZW50ICAgICAgICA9ICRzZWxmLT57aGFuZGxlfS0+YWNjZXB0KCk7Ci0gICAgICAgIG15ICRyZXN1bHQgICAgICAgID0gbmV3IFRocmlmdDo6U29ja2V0OwotICAgICAgICAkcmVzdWx0LT57aGFuZGxlfSA9IG5ldyBJTzo6U2VsZWN0KCRjbGllbnQpOwotICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyMKKyMgV2FpdCBmb3IgZGF0YSB0byBiZSByZWFkYWJsZQorIworIyBAcmV0dXJucyBhIHNvY2tldCB0aGF0IGNhbiBiZSByZWFkCisjCitzdWIgX193YWl0Cit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSBAc29ja2V0cyA9ICRzZWxmLT57aGFuZGxlfS0+Y2FuX3JlYWQoICRzZWxmLT57cmVjdlRpbWVvdXR9IC8gMTAwMCApOworCisgICAgaWYgKEBzb2NrZXRzID09IDApIHsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KHJlZigkc2VsZikuJzogdGltZWQgb3V0IHJlYWRpbmcgZnJvbSAnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9LCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCk7CiAgICAgfQogCi0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuICRzb2NrZXRzWzBdOwogfQogCiAKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHJhbnNwb3J0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9UcmFuc3BvcnQucG0KaW5kZXggNWVjNmZlZS4uNDFiN2UxNSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9UcmFuc3BvcnQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9UcmFuc3BvcnQucG0KQEAgLTE3LDE3ICsxNywxOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCiB1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6RXhjZXB0aW9uOwogCiAjCiAjIFRyYW5zcG9ydCBleGNlcHRpb25zCiAjCi1wYWNrYWdlIFRUcmFuc3BvcnRFeGNlcHRpb247CitwYWNrYWdlIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKIHVzZSBiYXNlKCdUaHJpZnQ6OlRFeGNlcHRpb24nKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogdXNlIGNvbnN0YW50IFVOS05PV04gICAgICA9PiAwOwogdXNlIGNvbnN0YW50IE5PVF9PUEVOICAgICA9PiAxOwpAQCAtMzUsNyArMzcsNyBAQAogdXNlIGNvbnN0YW50IFRJTUVEX09VVCAgICA9PiAzOwogdXNlIGNvbnN0YW50IEVORF9PRl9GSUxFICA9PiA0OwogCi1zdWIgbmV3eworc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwogICAgIG15ICRzZWxmICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KEBfKTsKIApAQCAtNDMsNiArNDUsNyBAQAogfQogCiBwYWNrYWdlIFRocmlmdDo6VHJhbnNwb3J0OwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiAjCiAjIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgb3Blbi4KQEAgLTUxLDcgKzU0LDcgQEAKICMKIHN1YiBpc09wZW4KIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtNjEsNyArNjQsNyBAQAogIwogc3ViIG9wZW4KIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtNjksNyArNzIsNyBAQAogIwogc3ViIGNsb3NlCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTgxLDggKzg0LDcgQEAKICMKIHN1YiByZWFkCiB7Ci0gICAgbXkgKCRsZW4pOwotICAgIGRpZSgiYWJzdHJhY3QiKTsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtMTE0LDggKzExNiw3IEBACiAjCiBzdWIgd3JpdGUKIHsKLSAgICBteSAoJGJ1Zik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTEzMCw2ICsxMzEsNyBAQAogIyBUcmFuc3BvcnRGYWN0b3J5IGNyZWF0ZXMgdHJhbnNwb3J0IG9iamVjdHMgZnJvbSB0cmFuc3BvcnRzCiAjCiBwYWNrYWdlIFRocmlmdDo6VHJhbnNwb3J0RmFjdG9yeTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwpAQCAtMTU2LDIwICsxNTgsMjEgQEAKICMgIFNlcnZlclRyYW5zcG9ydCBiYXNlIGNsYXNzIG1vZHVsZQogIwogcGFja2FnZSBUaHJpZnQ6OlNlcnZlclRyYW5zcG9ydDsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIGxpc3RlbgogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgYWNjZXB0CiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiBjbG9zZQogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHlwZS5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHlwZS5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDhkYTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9UeXBlLnBtCkBAIC0wLDAgKzEsNTAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKKworIworIyBEYXRhIHR5cGVzIHRoYXQgY2FuIGJlIHNlbnQgdmlhIFRocmlmdAorIworcGFja2FnZSBUaHJpZnQ6OlRUeXBlOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCit1c2UgY29uc3RhbnQgU1RPUCAgID0+IDA7Cit1c2UgY29uc3RhbnQgVk9JRCAgID0+IDE7Cit1c2UgY29uc3RhbnQgQk9PTCAgID0+IDI7Cit1c2UgY29uc3RhbnQgQllURSAgID0+IDM7Cit1c2UgY29uc3RhbnQgSTA4ICAgID0+IDM7Cit1c2UgY29uc3RhbnQgRE9VQkxFID0+IDQ7Cit1c2UgY29uc3RhbnQgSTE2ICAgID0+IDY7Cit1c2UgY29uc3RhbnQgSTMyICAgID0+IDg7Cit1c2UgY29uc3RhbnQgSTY0ICAgID0+IDEwOwordXNlIGNvbnN0YW50IFNUUklORyA9PiAxMTsKK3VzZSBjb25zdGFudCBVVEY3ICAgPT4gMTE7Cit1c2UgY29uc3RhbnQgU1RSVUNUID0+IDEyOwordXNlIGNvbnN0YW50IE1BUCAgICA9PiAxMzsKK3VzZSBjb25zdGFudCBTRVQgICAgPT4gMTQ7Cit1c2UgY29uc3RhbnQgTElTVCAgID0+IDE1OwordXNlIGNvbnN0YW50IFVURjggICA9PiAxNjsKK3VzZSBjb25zdGFudCBVVEYxNiAgPT4gMTc7CisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1VuaXhTZXJ2ZXJTb2NrZXQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1VuaXhTZXJ2ZXJTb2NrZXQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc1ZTgwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVW5peFNlcnZlclNvY2tldC5wbQpAQCAtMCwwICsxLDg0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQ7Cit1c2UgVGhyaWZ0OjpVbml4U29ja2V0OworCit1c2UgSU86OlNvY2tldDo6VU5JWDsKKworcGFja2FnZSBUaHJpZnQ6OlVuaXhTZXJ2ZXJTb2NrZXQ7Cit1c2UgYmFzZSBxdyggVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQgKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworIworIyBDb25zdHJ1Y3Rvci4KKyMgSWYgYSBzaW5nbGUgYXJndW1lbnQgaXMgZ2l2ZW4gdGhhdCBpcyBub3QgYSBoYXNoLCB0aGF0IGlzIHRoZSB1bml4IGRvbWFpbiBzb2NrZXQgcGF0aC4KKyMgSWYgYSBzaW5nbGUgYXJndW1lbnQgaXMgZ2l2ZW4gdGhhdCBpcyBhIGhhc2g6CisjIEBwYXJhbVtpbl0gIHBhdGggICB1bml4IGRvbWFpbiBzb2NrZXQgZmlsZSBuYW1lCisjIEBwYXJhbVtpbl0gIHF1ZXVlICB0aGUgbGlzdGVuIHF1ZXVlIHNpemUgKGRlZmF1bHQgaXMgbm90IHNwZWNpZmllZCBpcyBzdXBwbGllZCBieSBTZXJ2ZXJTb2NrZXQpCisjIEBleGFtcGxlICAgIG15ICRzZXJ2ZXJzb2NrID0gVGhyaWZ0OjpVbml4U2VydmVyU29ja2V0LT5uZXcoJHBhdGgpOworIyBAZXhhbXBsZSAgICBteSAkc2VydmVyc29jayA9IFRocmlmdDo6VW5peFNlcnZlclNvY2tldC0+bmV3KHBhdGggPT4gInNvbWVwYXRoIiwgcXVldWUgPT4gNjQpOworIworc3ViIG5ldworeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkYXJncyAgICAgID0gc2hpZnQ7CisgICAgbXkgJHNlbGY7CisKKyAgICBpZiAocmVmKCRhcmdzKSBlcSAnSEFTSCcpIHsKKyAgICAgICAgJHNlbGYgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCRhcmdzKTsKKyAgICB9IGVsc2UgeworICAgICAgICAkc2VsZiA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoKTsKKyAgICAgICAgJHNlbGYtPntwYXRofSA9ICRhcmdzOworICAgIH0KKworICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7Cit9CisKK3N1YiBfX2NsaWVudAoreworICByZXR1cm4gVGhyaWZ0OjpVbml4U29ja2V0LT5uZXcoKTsKK30KKworc3ViIF9fbGlzdGVuCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRzb2NrID0gSU86OlNvY2tldDo6VU5JWC0+bmV3KAorICAgICAgICBUeXBlICAgICAgPT4gSU86OlNvY2tldDo6U09DS19TVFJFQU0sCisgICAgICAgIExvY2FsICAgICA9PiAkc2VsZi0+e3BhdGh9LAorICAgICAgICBMaXN0ZW4gICAgPT4gJHNlbGYtPntxdWV1ZX0pCisgICAgfHwgZG8geworICAgICAgICBteSAkZXJyb3IgPSAnVW5peFNlcnZlclNvY2tldDogQ291bGQgbm90IGJpbmQgdG8gJyAuCisgICAgICAgICAgICAgICAgICAgICRzZWxmLT57cGF0aH0gLiAnICgnIC4gJCEgLiAnKSc7CisgICAgICAgIGlmICgkc2VsZi0+e2RlYnVnfSkgeworICAgICAgICAgICAgJHNlbGYtPntkZWJ1Z0hhbmRsZXJ9LT4oJGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoJGVycm9yLCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICB9OworCisgICAgcmV0dXJuICRzb2NrOworfQorCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9Vbml4U29ja2V0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9Vbml4U29ja2V0LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzg2ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1VuaXhTb2NrZXQucG0KQEAgLTAsMCArMSw2NyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6U29ja2V0OworCit1c2UgSU86OlNvY2tldDo6VU5JWDsKKworcGFja2FnZSBUaHJpZnQ6OlVuaXhTb2NrZXQ7Cit1c2UgYmFzZSBxdyggVGhyaWZ0OjpTb2NrZXQgKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworIworIyBDb25zdHJ1Y3Rvci4KKyMgVGFrZXMgYSB1bml4IGRvbWFpbiBzb2NrZXQgZmlsZW5hbWUuCisjIFNlZSBUaHJpZnQ6OlNvY2tldCBmb3IgYmFzZSBjbGFzcyBwYXJhbWV0ZXJzLgorIyBAcGFyYW1baW5dICBwYXRoICAgcGF0aCB0byB1bml4IHNvY2tldCBmaWxlCisjIEBleGFtcGxlICAgIG15ICRzb2NrID0gVGhyaWZ0OjpVbml4U29ja2V0LT5uZXcoJHBhdGgpOworIworc3ViIG5ldworeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygpOworICAgICRzZWxmLT57cGF0aH0gPSBzaGlmdDsKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsICRjbGFzc25hbWUpOworfQorCitzdWIgX19vcGVuCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRzb2NrID0gSU86OlNvY2tldDo6VU5JWC0+bmV3KAorICAgICAgICBUeXBlICAgICAgPT4gSU86OlNvY2tldDo6U09DS19TVFJFQU0sCisgICAgICAgIFBlZXIgICAgICA9PiAkc2VsZi0+e3BhdGh9KQorICAgIHx8IGRvIHsKKyAgICAgICAgbXkgJGVycm9yID0gJ1VuaXhTb2NrZXQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcgLgorICAgICAgICAgICAgJHNlbGYtPntwYXRofSAuICcgKCcgLiAkISAuICcpJzsKKyAgICAgICAgaWYgKCRzZWxmLT57ZGVidWd9KSB7CisgICAgICAgICAgICAkc2VsZi0+e2RlYnVnSGFuZGxlcn0tPigkZXJyb3IpOworICAgICAgICB9CisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygkZXJyb3IsIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgIH07CisKKyAgICByZXR1cm4gJHNvY2s7Cit9CisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC90ZXN0L01ha2VmaWxlLmFtIGIvbGliL3BlcmwvdGVzdC9NYWtlZmlsZS5hbQppbmRleCA3OTVhYWVkLi5kZTAzOTcxIDEwMDY0NAotLS0gYS9saWIvcGVybC90ZXN0L01ha2VmaWxlLmFtCisrKyBiL2xpYi9wZXJsL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTE3LDE1ICsxNyw0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSBAdG9wX2J1aWxkZGlyQC9jb21waWxlci9jcHAvdGhyaWZ0Ci1USFJJRlRfSUYgPSBAdG9wX3NyY2RpckAvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAotCi1jaGVjay1sb2NhbDogZ2VuLXBlcmwvVGhyaWZ0VGVzdC9UeXBlcy5wbQotCi1nZW4tcGVybC9UaHJpZnRUZXN0L1R5cGVzLnBtOiAkKFRIUklGVF9JRikKLQkkKFRIUklGVCkgLS1nZW4gcGVybCAkKFRIUklGVF9JRikKLQotY2xlYW4tbG9jYWw6Ci0Jcm0gLXJmIGdlbi1wZXJsCi0KLUVYVFJBX0RJU1QgPSBtZW1vcnlfYnVmZmVyLnQgcHJvY2Vzc29yLnQKK0VYVFJBX0RJU1QgPSBtZW1vcnlfYnVmZmVyLnQgcHJvY2Vzc29yLnQgbXVsdGlwbGV4LnQKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL3Rlc3QvbXVsdGlwbGV4LnQgYi9saWIvcGVybC90ZXN0L211bHRpcGxleC50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYTliNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC90ZXN0L211bHRpcGxleC50CkBAIC0wLDAgKzEsMjAxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIFRlc3Q6Ok1vcmUgdGVzdHMgPT4gNjsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0OjpNZW1vcnlCdWZmZXI7Cit1c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTsKK3VzZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvY2Vzc29yOwordXNlIFRocmlmdDo6U2VydmVyOwordXNlIFRocmlmdDo6U29ja2V0OworCit1c2UgQmVuY2htYXJrU2VydmljZTsKK3VzZSBBZ2dyOworCit1c2UgY29uc3RhbnQgTkFNRV9CRU5DSE1BUktTRVJWSUNFID0+ICdCZW5jaG1hcmtTZXJ2aWNlJzsKK3VzZSBjb25zdGFudCBOQU1FX0FHR1IgID0+ICAnQWdncic7CisKK215ICRidWZmZXIgICAgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlci0+bmV3KDEwMjQpOworbXkgJGFnZ3JfcHJvdG9jb2wgID0gVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sLT5uZXcoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC0+bmV3KCRidWZmZXIpLCBOQU1FX0FHR1IpOworbXkgJGFnZ3JfY2xpZW50ICAgID0gQWdnckNsaWVudC0+bmV3KCRhZ2dyX3Byb3RvY29sKTsKK215ICRiZW5jaG1hcmtfcHJvdG9jb2wgPSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2wtPm5ldyhUaHJpZnQ6OkJpbmFyeVByb3RvY29sLT5uZXcoJGJ1ZmZlciksIE5BTUVfQkVOQ0hNQVJLU0VSVklDRSk7CitteSAkYmVuY2htYXJrX2NsaWVudCA9IEJlbmNobWFya1NlcnZpY2VDbGllbnQtPm5ldygkYmVuY2htYXJrX3Byb3RvY29sKTsgCisKKyRidWZmZXItPm9wZW4oKTsKKworZm9yKG15ICRpID0gMTsgJGkgPD0gNTsgJGkrKykgeworICAgICRhZ2dyX2NsaWVudC0+c2VuZF9hZGRWYWx1ZSgkaSk7CisgICAgJGFnZ3JfY2xpZW50LT57c2VxaWR9Kys7Cit9CisKKyRhZ2dyX2NsaWVudC0+c2VuZF9nZXRWYWx1ZXMoKTsKKworZm9yKG15ICRpID0gMTsgJGkgPD0gNTsgJGkrKykgeworICAgICRiZW5jaG1hcmtfY2xpZW50LT5zZW5kX2ZpYm9uYWNjaSgkaSk7CisgICAgJGJlbmNobWFya19jbGllbnQtPntzZXFpZH0rKzsKK30KKyRiZW5jaG1hcmtfY2xpZW50LT57c2VxaWR9LS07CisKK215ICRjbGllbnRfY29tbWFuZF9iaW5hcnkgPSAkYnVmZmVyLT5nZXRCdWZmZXI7CiskYnVmZmVyLT5yZXNldEJ1ZmZlcjsKKworCisjIFByb2Nlc3MgYnkgc2VydmVyCitteSAkc2VydmVyX291dHB1dF9iaW5hcnk7Cit7CisgICAgbXkgJGJlbmNobWFya19oYW5kbGVyID0gTXk6OkJlbmNobWFya1NlcnZpY2UtPm5ldygpOworICAgIG15ICRiZW5jaG1hcmtfcHJvY2Vzc29yID0gQmVuY2htYXJrU2VydmljZVByb2Nlc3Nvci0+bmV3KCRiZW5jaG1hcmtfaGFuZGxlcik7CisgICAgbXkgJGFnZ3JfaGFuZGxlciA9IE15OjpBZ2dyLT5uZXcoKTsgCisgICAgbXkgJGFnZ3JfcHJvY2Vzc29yID0gQWdnclByb2Nlc3Nvci0+bmV3KCRhZ2dyX2hhbmRsZXIpOworICAgIAorICAgIG15ICRwcm90b2NvbF9mYWN0b3J5ID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnktPm5ldygpOworCisgICAgbXkgJGlucHV0X2J1ZmZlciAgICA9IFRocmlmdDo6TWVtb3J5QnVmZmVyLT5uZXcoKTsKKyAgICAkaW5wdXRfYnVmZmVyLT53cml0ZSgkY2xpZW50X2NvbW1hbmRfYmluYXJ5KTsKKworICAgIG15ICRpbnB1dF9wcm90b2NvbCAgPSAkcHJvdG9jb2xfZmFjdG9yeS0+Z2V0UHJvdG9jb2woJGlucHV0X2J1ZmZlcik7CisKKyAgICBteSAkb3V0cHV0X2J1ZmZlciAgID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXItPm5ldygpOworICAgIG15ICRvdXRwdXRfcHJvdG9jb2wgPSAkcHJvdG9jb2xfZmFjdG9yeS0+Z2V0UHJvdG9jb2woJG91dHB1dF9idWZmZXIpOworCisgICAgbXkgJHByb2Nlc3NvciA9IFRocmlmdDo6TXVsdGlwbGV4ZWRQcm9jZXNzb3ItPm5ldygpOworCisgICAgJHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoTkFNRV9CRU5DSE1BUktTRVJWSUNFLCAkYmVuY2htYXJrX3Byb2Nlc3Nvcik7CisgICAgJHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoTkFNRV9BR0dSLCAkYWdncl9wcm9jZXNzb3IpOworICAgIG15ICRyZXN1bHQ7CisgICAgZm9yKG15ICRpID0gMTsgJGkgPD0gMTE7ICRpKyspIHsKKyAgICAgICAgJHJlc3VsdCA9ICRwcm9jZXNzb3ItPnByb2Nlc3MoJGlucHV0X3Byb3RvY29sLCAkb3V0cHV0X3Byb3RvY29sKTsKKyAgICAgICAgcHJpbnQgInByb2Nlc3MgcmVzdWx0ZWQgaW4gJHJlc3VsdFxuIjsKKyAgICB9CisKKyAgICAkc2VydmVyX291dHB1dF9iaW5hcnkgPSAkb3V0cHV0X2J1ZmZlci0+Z2V0QnVmZmVyKCk7Cit9CisKKyRidWZmZXItPndyaXRlKCRzZXJ2ZXJfb3V0cHV0X2JpbmFyeSk7CisKKworCitmb3IobXkgJGkgPSAxOyAkaSA8PSA1OyAkaSsrKSB7CisgICAgbXkgKCRmdW5jdGlvbl9uYW1lLCAkbWVzc2FnZV90eXBlLCAkc2VxdWVuY2VfaWQpOworCisgICAgJGFnZ3JfcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4oXCRmdW5jdGlvbl9uYW1lLCBcJG1lc3NhZ2VfdHlwZSwgXCRzZXF1ZW5jZV9pZCk7CisKKyAgICBpZiAoJG1lc3NhZ2VfdHlwZSA9PSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7CisgICAgICAgZGllOworICAgIH0KKyAgICAKKyAgICBteSAkYWdncl9yZXN1bHQgPSBBZ2dyX2FkZFZhbHVlX3Jlc3VsdC0+bmV3KCk7CisgICAgJGFnZ3JfcmVzdWx0LT5yZWFkKCRhZ2dyX3Byb3RvY29sKTsKKyAgICAkYWdncl9wcm90b2NvbC0+cmVhZE1lc3NhZ2VFbmQoKTsKK30KKworbXkgKCRmdW5jdGlvbl9uYW1lLCAkbWVzc2FnZV90eXBlLCAkc2VxdWVuY2VfaWQpOworCiskYWdncl9wcm90b2NvbC0+cmVhZE1lc3NhZ2VCZWdpbihcJGZ1bmN0aW9uX25hbWUsIFwkbWVzc2FnZV90eXBlLCBcJHNlcXVlbmNlX2lkKTsKKworaWYgKCRtZXNzYWdlX3R5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeworICAgIGRpZTsKK30KKyAgICAKK215ICRhZ2dyX3Jlc3VsdCA9IEFnZ3JfZ2V0VmFsdWVzX3Jlc3VsdC0+bmV3KCk7CiskYWdncl9yZXN1bHQtPnJlYWQoJGFnZ3JfcHJvdG9jb2wpOworJGFnZ3JfcHJvdG9jb2wtPnJlYWRNZXNzYWdlRW5kKCk7CisKK2lzX2RlZXBseSgkYWdncl9yZXN1bHQtPnN1Y2Nlc3MoKSwgWzEsMiwzLDQsNV0pOworIAorCitmb3JlYWNoIG15ICR2YWwoKDEsMiwzLDUsOCkpIHsKKyAgICBteSAoJGZ1bmN0aW9uX25hbWUsICRtZXNzYWdlX3R5cGUsICRzZXF1ZW5jZV9pZCk7CisKKyAgICAkYmVuY2htYXJrX3Byb3RvY29sLT5yZWFkTWVzc2FnZUJlZ2luKFwkZnVuY3Rpb25fbmFtZSwgXCRtZXNzYWdlX3R5cGUsIFwkc2VxdWVuY2VfaWQpOworCisgICAgaWYgKCRtZXNzYWdlX3R5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeworICAgICAgICBkaWU7CisgICAgfQorICAgIG15ICRiZW5jaG1hcmtfcmVzdWx0ID0gQmVuY2htYXJrU2VydmljZV9maWJvbmFjY2lfcmVzdWx0LT5uZXcoKTsKKyAgICAkYmVuY2htYXJrX3Jlc3VsdC0+cmVhZCgkYmVuY2htYXJrX3Byb3RvY29sKTsKKyAgICAkYmVuY2htYXJrX3Byb3RvY29sLT5yZWFkTWVzc2FnZUVuZCgpOworICAgIAorICAgIGlzKCRiZW5jaG1hcmtfcmVzdWx0LT5zdWNjZXNzKCksICR2YWwpOworfQorCisKK3BhY2thZ2UgTXk6OkFnZ3I7Cit1c2UgYmFzZSBxdyhBZ2dySWYpOyAKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsgCisKK3N1YiBuZXcgeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgICAgID0ge307CisgICAgCisgICAgJHNlbGYtPnt2YWx1ZXN9ID0gKCk7CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Cit9CisKK3N1YiBhZGRWYWx1ZXsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICR2YWx1ZSA9IHNoaWZ0OworCisgICAgcHVzaCAoQHskc2VsZi0+e3ZhbHVlc319LCAkdmFsdWUpOyAgCit9CisKK3N1YiBnZXRWYWx1ZXN7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICAKKyAgIHJldHVybiAkc2VsZi0+e3ZhbHVlc307Cit9CisKKworCitwYWNrYWdlIE15OjpCZW5jaG1hcmtTZXJ2aWNlOwordXNlIGJhc2UgcXcoQmVuY2htYXJrU2VydmljZUlmKTsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzID0gc2hpZnQ7CisgICAgcmV0dXJuIGJsZXNzIHt9LCAkY2xhc3M7Cit9CisKK3N1YiBmaWJvbmFjY2kgeworICAgIG15ICgkc2VsZiwgJG4pID0gQF87CisgICAgCisgICAgbXkgJHByZXYgPSAwOworICAgIG15ICRuZXh0OworICAgIG15ICRyZXN1bHQgPSAxOworICAgIAorICAgIHdoaWxlICgkbiA+IDApIHsKKyAgICAgICAgJG5leHQgPSAkcmVzdWx0ICsgJHByZXY7CisgICAgICAgICRwcmV2ID0gJHJlc3VsdDsKKyAgICAgICAgJHJlc3VsdCA9ICRuZXh0OworICAgICAgICAtLSRuOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gJHJlc3VsdDsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvdGVzdC9wcm9jZXNzb3IudCBiL2xpYi9wZXJsL3Rlc3QvcHJvY2Vzc29yLnQKaW5kZXggMWQ4YmU3My4uZjgzMzAzNSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvdGVzdC9wcm9jZXNzb3IudAorKysgYi9saWIvcGVybC90ZXN0L3Byb2Nlc3Nvci50CkBAIC0yMiw5ICsyMiw5IEBACiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCi11c2UgVGhyaWZ0OwogdXNlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7CiB1c2UgVGhyaWZ0OjpNZW1vcnlCdWZmZXI7Cit1c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTsKIAogdXNlIFRocmlmdFRlc3Q6OlRocmlmdFRlc3Q7CiB1c2UgVGhyaWZ0VGVzdDo6VHlwZXM7CkBAIC03Miw3ICs3Miw3IEBACiAgICAgJHByb3RvY29sLT5yZWFkTWVzc2FnZUJlZ2luKFwkZnVuY3Rpb25fbmFtZSwgXCRtZXNzYWdlX3R5cGUsIFwkc2VxdWVuY2VfaWQpOwogICAgIHByaW50ICIgICRmdW5jdGlvbl9uYW1lLCAkbWVzc2FnZV90eXBlLCAkc2VxdWVuY2VfaWRcbiI7CiAKLSAgICBpZiAoJG1lc3NhZ2VfdHlwZSA9PSBUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeworICAgIGlmICgkbWVzc2FnZV90eXBlID09IFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsKICAgICAgICAgZGllOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL3BlcmwvdG9vbHMvRml4dXBEaXN0LnBsIGIvbGliL3BlcmwvdG9vbHMvRml4dXBEaXN0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YTJiMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC90b29scy9GaXh1cERpc3QucGwKQEAgLTAsMCArMSwzNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMKKyMgVGhpcyB3aWxsIGZpeCB1cCB0aGUgZGlzdHJpYnV0aW9uIHNvIHRoYXQgQ1BBTiBwcm9wZXJseQorIyBpbmRleGVzIFRocmlmdC4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgdXRmODsKKwordXNlIERhdGE6OkR1bXBlcjsKK3VzZSBDUEFOOjpNZXRhOworCitteSAkbWV0YSA9IENQQU46Ok1ldGEtPmxvYWRfZmlsZSgnTUVUQS5qc29uJyk7CiskbWV0YS0+eydwcm92aWRlcyd9ID0geyAnVGhyaWZ0JyA9PiB7ICdmaWxlJyA9PiAnbGliL1RocmlmdC5wbScsICd2ZXJzaW9uJyA9PiAkbWV0YS0+dmVyc2lvbigpIH0gfTsKKyRtZXRhLT5zYXZlKCdNRVRBLmpzb24nKTsKZGlmZiAtLWdpdCBhL2xpYi9waHAvTWFrZWZpbGUuYW0gYi9saWIvcGhwL01ha2VmaWxlLmFtCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMDcyNDJmOS4uOGQ5MDUwYQotLS0gYS9saWIvcGhwL01ha2VmaWxlLmFtCisrKyBiL2xpYi9waHAvTWFrZWZpbGUuYW0KQEAgLTE3LDQxICsxNywxMzMgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLSUuc286Ci0JY2Qgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvIFwKLQkgICYmICQoTUFLRSkKKworaWYgV0lUSF9URVNUUworU1VCRElSUyA9IHRlc3QKK2VuZGlmCiAKIGlmIFdJVEhfUEhQX0VYVEVOU0lPTgorJS5zbzoKKwljZCBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC8gJiYgJChNQUtFKQorCiBwaHBjb25mZGlyPSQoUEhQX0NPTkZJR19QUkVGSVgpCiBwaHBjb25mX0RBVEE9dGhyaWZ0X3Byb3RvY29sLmluaQogCiBwaHBtb2R1bGVkaXIgPSBgcGhwLWNvbmZpZyAtLWV4dGVuc2lvbi1kaXJgCiBwaHBtb2R1bGVfU0NSSVBUUyA9IHNyYy9leHQvdGhyaWZ0X3Byb3RvY29sL21vZHVsZXMvdGhyaWZ0X3Byb3RvY29sLnNvCisKK2Rpc3RjbGVhbi1sb2NhbDoKKwljZCAkKHBocG1vZHVsZV9TQ1JJUFRTKSAmJiAkKFBIUElaRSkgLS1jbGVhbgorCiBlbmRpZgogCi1waHBkaXIgPSAkKFBIUF9QUkVGSVgpCi1waHBfREFUQSA9ICBcCi0gIHNyYy9hdXRvbG9hZC5waHAgXAotICBzcmMvVGhyaWZ0LnBocAorcGhwZGlyID0gJChQSFBfUFJFRklYKS8KK3BocF9EQVRBID0gXAorICBsaWIvVE11bHRpcGxleGVkUHJvY2Vzc29yLnBocAogCi1waHBwcm90b2NvbGRpciA9ICQocGhwZGlyKS9wcm90b2NvbAorcGhwYmFzZWRpciA9ICQocGhwZGlyKS9CYXNlCitwaHBiYXNlX0RBVEEgPSBcCisgIGxpYi9CYXNlL1RCYXNlLnBocAorCitwaHBjbGFzc2xvYWRlcmRpciA9ICQocGhwZGlyKS9DbGFzc0xvYWRlcgorcGhwY2xhc3Nsb2FkZXJfREFUQSA9IFwKKyAgbGliL0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocAorCitwaHBleGNlcHRpb25kaXIgPSAkKHBocGRpcikvRXhjZXB0aW9uCitwaHBleGNlcHRpb25fREFUQSA9IFwKKyAgbGliL0V4Y2VwdGlvbi9UQXBwbGljYXRpb25FeGNlcHRpb24ucGhwIFwKKyAgbGliL0V4Y2VwdGlvbi9URXhjZXB0aW9uLnBocCBcCisgIGxpYi9FeGNlcHRpb24vVFByb3RvY29sRXhjZXB0aW9uLnBocCBcCisgIGxpYi9FeGNlcHRpb24vVFRyYW5zcG9ydEV4Y2VwdGlvbi5waHAKKworcGhwZmFjdG9yeWRpciA9ICQocGhwZGlyKS9GYWN0b3J5CitwaHBmYWN0b3J5X0RBVEEgPSBcCisgIGxpYi9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwIFwKKyAgbGliL0ZhY3RvcnkvVENvbXBhY3RQcm90b2NvbEZhY3RvcnkucGhwIFwKKyAgbGliL0ZhY3RvcnkvVEpTT05Qcm90b2NvbEZhY3RvcnkucGhwIFwKKyAgbGliL0ZhY3RvcnkvVFByb3RvY29sRmFjdG9yeS5waHAgXAorICBsaWIvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwIFwKKyAgbGliL0ZhY3RvcnkvVFRyYW5zcG9ydEZhY3RvcnkucGhwCisKK3BocHByb3RvY29sZGlyID0gJChwaHBkaXIpL1Byb3RvY29sCiBwaHBwcm90b2NvbF9EQVRBID0gXAotICBzcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocCBcCi0gIHNyYy9wcm90b2NvbC9UQmluYXJ5U2VyaWFsaXplci5waHAgXAotICBzcmMvcHJvdG9jb2wvVFByb3RvY29sLnBocAorICBsaWIvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQucGhwIFwKKyAgbGliL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAgXAorICBsaWIvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5waHAgXAorICBsaWIvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5waHAgXAorICBsaWIvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wucGhwIFwKKyAgbGliL1Byb3RvY29sL1RQcm90b2NvbC5waHAgXAorICBsaWIvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnBocCBcCisgIGxpYi9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLnBocAogCi1waHB0cmFuc3BvcnRkaXIgPSAkKHBocGRpcikvdHJhbnNwb3J0CitwaHBwcm90b2NvbGpzb25kaXIgPSAkKHBocHByb3RvY29sZGlyKS9KU09OCitwaHBwcm90b2NvbGpzb25fREFUQSA9IFwKKyAgbGliL1Byb3RvY29sL0pTT04vQmFzZUNvbnRleHQucGhwIFwKKyAgbGliL1Byb3RvY29sL0pTT04vTGlzdENvbnRleHQucGhwIFwKKyAgbGliL1Byb3RvY29sL0pTT04vTG9va2FoZWFkUmVhZGVyLnBocCBcCisgIGxpYi9Qcm90b2NvbC9KU09OL1BhaXJDb250ZXh0LnBocAorCitwaHBwcm90b2NvbHNpbXBsZWpzb25kaXIgPSAkKHBocHByb3RvY29sZGlyKS9TaW1wbGVKU09OCitwaHBwcm90b2NvbHNpbXBsZWpzb25fREFUQSA9IFwKKyAgbGliL1Byb3RvY29sL1NpbXBsZUpTT04vQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbi5waHAgXAorICBsaWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9Db250ZXh0LnBocCBcCisgIGxpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0xpc3RDb250ZXh0LnBocCBcCisgIGxpYi9Qcm90b2NvbC9TaW1wbGVKU09OL01hcENvbnRleHQucGhwIFwKKyAgbGliL1Byb3RvY29sL1NpbXBsZUpTT04vU3RydWN0Q29udGV4dC5waHAKKworcGhwc2VyaWFsaXplcmRpciA9ICQocGhwZGlyKS9TZXJpYWxpemVyCitwaHBzZXJpYWxpemVyX0RBVEEgPSBcCisgIGxpYi9TZXJpYWxpemVyL1RCaW5hcnlTZXJpYWxpemVyLnBocAorCitwaHBzZXJ2ZXJkaXIgPSAkKHBocGRpcikvU2VydmVyCitwaHBzZXJ2ZXJfREFUQSA9IFwKKyAgbGliL1NlcnZlci9UU2VydmVyU29ja2V0LnBocCBcCisgIGxpYi9TZXJ2ZXIvVEZvcmtpbmdTZXJ2ZXIucGhwIFwKKyAgbGliL1NlcnZlci9UU2VydmVyLnBocCBcCisgIGxpYi9TZXJ2ZXIvVFNlcnZlclRyYW5zcG9ydC5waHAgXAorICBsaWIvU2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwCisKK3BocHN0cmluZ2Z1bmNkaXIgPSAkKHBocGRpcikvU3RyaW5nRnVuYworcGhwc3RyaW5nZnVuY19EQVRBID0gXAorICBsaWIvU3RyaW5nRnVuYy9NYnN0cmluZy5waHAgXAorICBsaWIvU3RyaW5nRnVuYy9Db3JlLnBocCBcCisgIGxpYi9TdHJpbmdGdW5jL1RTdHJpbmdGdW5jLnBocAorCitwaHB0cmFuc3BvcnRkaXIgPSAkKHBocGRpcikvVHJhbnNwb3J0CiBwaHB0cmFuc3BvcnRfREFUQSA9IFwKLSAgc3JjL3RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwIFwKLSAgc3JjL3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocCBcCi0gIHNyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQucGhwIFwKLSAgc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLnBocCBcCi0gIHNyYy90cmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwIFwKLSAgc3JjL3RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocCBcCi0gIHNyYy90cmFuc3BvcnQvVFNvY2tldC5waHAgXAotICBzcmMvdHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocCBcCi0gIHNyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5waHAKKyAgbGliL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UQ3VybENsaWVudC5waHAgXAorICBsaWIvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9USHR0cENsaWVudC5waHAgXAorICBsaWIvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UTnVsbFRyYW5zcG9ydC5waHAgXAorICBsaWIvVHJhbnNwb3J0L1RQaHBTdHJlYW0ucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UU29ja2V0LnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVFNvY2tldFBvb2wucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UVHJhbnNwb3J0LnBocAogCi1FWFRSQV9ESVNUID0gc3JjIHRocmlmdF9wcm90b2NvbC5pbmkgUkVBRE1FLmFwYWNoZQorcGhwdHlwZWRpciA9ICQocGhwZGlyKS9UeXBlCitwaHB0eXBlX0RBVEEgPSBcCisgIGxpYi9UeXBlL1RNZXNzYWdlVHlwZS5waHAgXAorICBsaWIvVHlwZS9UVHlwZS5waHAgXAorICBsaWIvVHlwZS9UQ29uc3RhbnQucGhwCiAKLU1BSU5UQUlORVJDTEVBTkZJTEVTID0gTWFrZWZpbGUgTWFrZWZpbGUuaW4KK0VYVFJBX0RJU1QgPSBcCisgIGxpYiBcCisgIHNyYy9hdXRvbG9hZC5waHAgXAorICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQgXAorICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcudzMyIFwKKyAgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5jcHAgXAorICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmggXAorICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9ydW4tdGVzdHMucGhwIFwKKyAgc3JjL1RocmlmdC5waHAgXAorICBzcmMvVFN0cmluZ1V0aWxzLnBocCBcCisgIGNvZGluZ19zdGFuZGFyZHMubWQgXAorICB0aHJpZnRfcHJvdG9jb2wuaW5pIFwKKyAgUkVBRE1FLmFwYWNoZS5tZCBcCisgIFJFQURNRS5tZAorCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IFwKKyAgTWFrZWZpbGUgXAorICBNYWtlZmlsZS5pbgorCmRpZmYgLS1naXQgYS9saWIvcGhwL1JFQURNRSBiL2xpYi9waHAvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjU2NmY0Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotVGhyaWZ0IFBIUCBTb2Z0d2FyZSBMaWJyYXJ5Ci0KLUxpY2Vuc2UKLT09PT09PT0KLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLVVzaW5nIFRocmlmdCB3aXRoIFBIUAotPT09PT09PT09PT09PT09PT09PT09Ci0KLVRocmlmdCByZXF1aXJlcyBQSFAgNS4gVGhyaWZ0IG1ha2VzIGFzIGZldyBhc3N1bXB0aW9ucyBhYm91dCB5b3VyIFBIUAotZW52aXJvbm1lbnQgYXMgcG9zc2libGUgd2hpbGUgdHJ5aW5nIHRvIG1ha2Ugc29tZSBtb3JlIGFkdmFuY2VkIFBIUAotZmVhdHVyZXMgKGkuZS4gQVBDIGNhY2hlaW5nIHVzaW5nIGFzYm9sdXRlIHBhdGggVVJMcykgYXMgc2ltcGxlIGFzIHBvc3NpYmxlLgotCi1UbyB1c2UgVGhyaWZ0IGluIHlvdXIgUEhQIGNvZGViYXNlLCB0YWtlIHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci0KLSMxKSBDb3B5IGFsbCBvZiB0aHJpZnQvbGliL3BocC9zcmMgaW50byB5b3VyIFBIUCBjb2RlYmFzZQotIzIpIFNldCAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXSB0byB0aGUgcGF0aCB5b3UgaW5zdGFsbGVkIFRocmlmdAotIzMpIGluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL1RocmlmdC5waHAnOwotCi1Ob3RlIHRoYXQgIzMgbXVzdCBiZSBkb25lIGJlZm9yZSBpbmNsdWRpbmcgYW55IG90aGVyIFRocmlmdCBmaWxlcy4KLUlmIHlvdSBkbyBub3QgZG8gIzIsIFRocmlmdC5waHAgd2lsbCBzZXQgdGhpcyBnbG9iYWwgZm9yIHlvdSwgYnV0IGl0IHdpbGwgYmUKLWRvbmUgdXNpbmcgZGlybmFtZShfX0ZJTEVfXyksIHdoaWNoIGlzIGxlc3MgZWZmaWNpZW50IHRoYW4gcHJvdmlkaW5nIHRoZSBzdGF0aWMKLXN0cmluZyB5b3Vyc2VsZi4KLQotV2hlbiB5b3UgZ2VuZXJhdGUgYSBUaHJpZnQgcGFja2FnZSB1c2luZyB0aGUgY29tcGlsZXIsIGl0IG1ha2VzIGFuIGFzc3VtcHRpb24KLWFib3V0IHdoZXJlIHlvdXIgZ2VuZXJhdGVkIGNvZGUgd2lsbCBsaXZlLiBJZiB5b3VyIGZpbGUgaXMgIk15UGFja2FnZS50aHJpZnQiLAotdGhlIGdlbmVyYXRlZCBmaWxlcyBtdXN0IGJlIGluc3RhbGxlZCBpbnRvOgotCi0kR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3BhY2thZ2VzL015UGFja2FnZS8nOwotCi1UaGlzIGFsbG93cyB0aGUgY29kZSBnZW5lcmF0b3IgdG8gY29tcGlsZSB5b3VyIGNvZGUgd2l0aG91dCBhbnkgZXh0cmEgZmxhZ3MKLWZvciB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBuYW1lcyB3aGlsZSBzdGlsbCBhbGxvd2luZyB5b3VyIGluY2x1ZGUgcGF0aHMgdG8KLWJlIGFic29sdXRlIChpZiB5b3UgaGF2ZSBhbiBhYnNvbHV0ZSBUSFJJRlRfUk9PVCkuCi0KLURlcGVuZGVuY2llcwotPT09PT09PT09PT09Ci0KLVBIUF9JTlRfU0laRQotCi0gIFRoaXMgYnVpbHQtaW4gc2lnbmFscyB3aGV0aGVyIHlvdXIgYXJjaGl0ZWN0dXJlIGlzIDMyIG9yIDY0IGJpdCBhbmQgaXMKLSAgdXNlZCBieSB0aGUgVEJpbmFyeVByb3RvY29sIHRvIHByb3Blcmx5IHVzZSBwYWNrKCkgYW5kIHVucGFjaygpIHRvCi0gIHNlcmlhbGl6ZSBkYXRhLgotCi1hcGNfZmV0Y2goKSwgYXBjX3N0b3JlKCkKLQotICBBUEMgY2FjaGUgaXMgdXNlZCBieSB0aGUgVFNvY2tldFBvb2wgY2xhc3MuIElmIHlvdSBkbyBub3QgaGF2ZSBBUEMgaW5zdGFsbGVkLAotICBUaHJpZnQgd2lsbCBmaWxsIGluIG51bGwgc3R1YiBmdW5jdGlvbiBkZWZpbml0aW9ucy4KZGlmZiAtLWdpdCBhL2xpYi9waHAvUkVBRE1FLmFwYWNoZSBiL2xpYi9waHAvUkVBRE1FLmFwYWNoZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM0MTgzMy4uMDAwMDAwMAotLS0gYS9saWIvcGhwL1JFQURNRS5hcGFjaGUKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi1UaHJpZnQgUEhQL0FwYWNoZSBJbnRlZ3JhdGlvbgotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1CdWlsZGluZyBQSFAgVGhyaWZ0IFNlcnZpY2VzIHdpdGggQXBhY2hlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRocmlmdCBjYW4gYmUgZW1iZWRkZWQgaW4gdGhlIEFwYWNoZSB3ZWJzZXJ2ZXIgd2l0aCBQSFAgaW5zdGFsbGVkLiBTYW1wbGUKLWNvZGUgaXMgcHJvdmlkZWQgYmVsb3cuIE5vdGUgdGhhdCB0byBtYWtlIHJlcXVlc3RzIHRvIHRoaXMgdHlwZSBvZiBzZXJ2ZXIKLXlvdSBtdXN0IHVzZSBhIFRIdHRwQ2xpZW50IHRyYW5zcG9ydC4KLQotU2FtcGxlIENvZGUKLT09PT09PT09PT09Ci0KLTw/cGhwCi0KLS8qKgotICogRXhhbXBsZSBvZiBob3cgdG8gYnVpbGQgYSBUaHJpZnQgc2VydmVyIGluIEFwYWNoZS9QSFAKLSAqCi0gKi8KLQotJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10gPSAnL3lvdXIvdGhyaWZ0L3Jvb3QnOwotCi1pbmNsdWRlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9UaHJpZnQucGhwJzsKLWluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3BhY2thZ2VzL1NlcnZpY2UvU2VydmljZS5waHAnOwotaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvdHJhbnNwb3J0L1RQaHBTdHJlYW0ucGhwJzsKLWluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAnOwotCi1jbGFzcyBTZXJ2aWNlSGFuZGxlciBpbXBsZW1lbnRzIFNlcnZpY2VJZiB7Ci0gIC8vIEltcGxlbWVudCB5b3VyIGludGVyZmFjZSBhbmQgbWV0aG9kcyBoZXJlCi19Ci0KLWhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCcpOwotCi0kaGFuZGxlciA9IG5ldyBTZXJ2aWNlSGFuZGxlcigpOwotJHByb2Nlc3NvciA9IG5ldyBTZXJ2aWNlUHJvY2Vzc29yKCRoYW5kbGVyKTsKLQotLy8gVXNlIHRoZSBUUGhwU3RyZWFtIHRyYW5zcG9ydCB0byByZWFkL3dyaXRlIGRpcmVjdGx5IGZyb20gSFRUUAotJHRyYW5zcG9ydCA9IG5ldyBUUGhwU3RyZWFtKFRQaHBTdHJlYW06Ok1PREVfUiB8IFRQaHBTdHJlYW06Ok1PREVfVyk7Ci0kcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOwotCi0kdHJhbnNwb3J0LT5vcGVuKCk7Ci0kcHJvY2Vzc29yLT5wcm9jZXNzKCRwcm90b2NvbCwgJHByb3RvY29sKTsKLSR0cmFuc3BvcnQtPmNsb3NlKCk7CmRpZmYgLS1naXQgYS9saWIvcGhwL1JFQURNRS5hcGFjaGUubWQgYi9saWIvcGhwL1JFQURNRS5hcGFjaGUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU5MjU4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvUkVBRE1FLmFwYWNoZS5tZApAQCAtMCwwICsxLDc0IEBACitUaHJpZnQgUEhQL0FwYWNoZSBJbnRlZ3JhdGlvbgorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitCdWlsZGluZyBQSFAgVGhyaWZ0IFNlcnZpY2VzIHdpdGggQXBhY2hlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RocmlmdCBjYW4gYmUgZW1iZWRkZWQgaW4gdGhlIEFwYWNoZSB3ZWJzZXJ2ZXIgd2l0aCBQSFAgaW5zdGFsbGVkLiBTYW1wbGUKK2NvZGUgaXMgcHJvdmlkZWQgYmVsb3cuIE5vdGUgdGhhdCB0byBtYWtlIHJlcXVlc3RzIHRvIHRoaXMgdHlwZSBvZiBzZXJ2ZXIKK3lvdSBtdXN0IHVzZSBhIFRIdHRwQ2xpZW50IHRyYW5zcG9ydC4KKworU2FtcGxlIENvZGUKKz09PT09PT09PT09CisKKzw/cGhwCisKK25hbWVzcGFjZSBNeU5hbWVzcGFjZTsKKworLyoqCisgKiBJbmNsdWRlIHBhdGgKKyAqLworJFRIUklGVF9ST09UID0gJy95b3VyL3RocmlmdC9yb290L2xpYic7CisKKy8qKgorICogSW5pdCBBdXRsb2FkZXIKKyAqLworcmVxdWlyZV9vbmNlICRUSFJJRlRfUk9PVCAuICcvVGhyaWZ0L0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocCc7CisKKyRsb2FkZXIgPSBuZXcgVGhyaWZ0Q2xhc3NMb2FkZXIoKTsKKyRsb2FkZXItPnJlZ2lzdGVyTmFtZXNwYWNlKCdUaHJpZnQnLCAkVEhSSUZUX1JPT1QpOworJGxvYWRlci0+cmVnaXN0ZXJEZWZpbml0aW9uKCdUaHJpZnQnLCAkVEhSSUZUX1JPT1QgLiAnL3BhY2thZ2VzJyk7CiskbG9hZGVyLT5yZWdpc3RlcigpOworCit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUUGhwU3RyZWFtOwordXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7CisKKy8qKgorICogRXhhbXBsZSBvZiBob3cgdG8gYnVpbGQgYSBUaHJpZnQgc2VydmVyIGluIEFwYWNoZS9QSFAKKyAqLworCitjbGFzcyBTZXJ2aWNlSGFuZGxlciBpbXBsZW1lbnRzIFNlcnZpY2VJZiB7CisgIC8vIEltcGxlbWVudCB5b3VyIGludGVyZmFjZSBhbmQgbWV0aG9kcyBoZXJlCit9CisKK2hlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCcpOworCiskaGFuZGxlciA9IG5ldyBTZXJ2aWNlSGFuZGxlcigpOworJHByb2Nlc3NvciA9IG5ldyBTZXJ2aWNlUHJvY2Vzc29yKCRoYW5kbGVyKTsKKworLy8gVXNlIHRoZSBUUGhwU3RyZWFtIHRyYW5zcG9ydCB0byByZWFkL3dyaXRlIGRpcmVjdGx5IGZyb20gSFRUUAorJHRyYW5zcG9ydCA9IG5ldyBUUGhwU3RyZWFtKFRQaHBTdHJlYW06Ok1PREVfUiB8IFRQaHBTdHJlYW06Ok1PREVfVyk7CiskcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOworCiskdHJhbnNwb3J0LT5vcGVuKCk7CiskcHJvY2Vzc29yLT5wcm9jZXNzKCRwcm90b2NvbCwgJHByb3RvY29sKTsKKyR0cmFuc3BvcnQtPmNsb3NlKCk7CmRpZmYgLS1naXQgYS9saWIvcGhwL1JFQURNRS5tZCBiL2xpYi9waHAvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNzAxMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL1JFQURNRS5tZApAQCAtMCwwICsxLDYwIEBACitUaHJpZnQgUEhQIFNvZnR3YXJlIExpYnJhcnkKKworIyBMaWNlbnNlCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCisjIFVzaW5nIFRocmlmdCB3aXRoIFBIUAorCitUaHJpZnQgcmVxdWlyZXMgUEhQIDUuIFRocmlmdCBtYWtlcyBhcyBmZXcgYXNzdW1wdGlvbnMgYWJvdXQgeW91ciBQSFAKK2Vudmlyb25tZW50IGFzIHBvc3NpYmxlIHdoaWxlIHRyeWluZyB0byBtYWtlIHNvbWUgbW9yZSBhZHZhbmNlZCBQSFAKK2ZlYXR1cmVzIChpLmUuIEFQQyBjYWNoZWluZyB1c2luZyBhc2JvbHV0ZSBwYXRoIFVSTHMpIGFzIHNpbXBsZSBhcyBwb3NzaWJsZS4KKworVG8gdXNlIFRocmlmdCBpbiB5b3VyIFBIUCBjb2RlYmFzZSwgdGFrZSB0aGUgZm9sbG93aW5nIHN0ZXBzOgorCisxLiBDb3B5IGFsbCBvZiB0aHJpZnQvbGliL3BocC9saWIgaW50byB5b3VyIFBIUCBjb2RlYmFzZQorMi4gQ29uZmlndXJlIFN5bWZvbnkgQXV0b2xvYWRlciAob3Igd2hhdGV2ZXIgeW91IHVzdWFsbHkgdXNlKQorCitBZnRlciB0aGF0LCB5b3UgaGF2ZSB0byBtYW51YWxseSBpbmNsdWRlIHRoZSBUaHJpZnQgcGFja2FnZQorY3JlYXRlZCBieSB0aGUgY29tcGlsZXI6CisKK2BgYAorcmVxdWlyZV9vbmNlICdwYWNrYWdlcy9TZXJ2aWNlL1NlcnZpY2UucGhwJzsKK3JlcXVpcmVfb25jZSAncGFja2FnZXMvU2VydmljZS9UeXBlcy5waHAnOworYGBgCisKKyMgRGVwZW5kZW5jaWVzCisKK1BIUF9JTlRfU0laRQorCisgICAgVGhpcyBidWlsdC1pbiBzaWduYWxzIHdoZXRoZXIgeW91ciBhcmNoaXRlY3R1cmUgaXMgMzIgb3IgNjQgYml0IGFuZCBpcworICAgIHVzZWQgYnkgdGhlIFRCaW5hcnlQcm90b2NvbCB0byBwcm9wZXJseSB1c2UgcGFjaygpIGFuZCB1bnBhY2soKSB0bworICAgIHNlcmlhbGl6ZSBkYXRhLgorCithcGNfZmV0Y2goKSwgYXBjX3N0b3JlKCkKKworICAgIEFQQyBjYWNoZSBpcyB1c2VkIGJ5IHRoZSBUU29ja2V0UG9vbCBjbGFzcy4gSWYgeW91IGRvIG5vdCBoYXZlIEFQQyBpbnN0YWxsZWQsCisgICAgVGhyaWZ0IHdpbGwgZmlsbCBpbiBudWxsIHN0dWIgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCisKKyMgQnJlYWtpbmcgQ2hhbmdlcworCisjIyAwLjEyLjAKKworMS4gW1BTUi00XShodHRwczovL3d3dy5waHAtZmlnLm9yZy9wc3IvcHNyLTQvKSBsb2FkZXIgaXMgbm93IHRoZSBkZWZhdWx0LiBJZiB5b3Ugd2FudCB0byB1c2UgY2xhc3MgbWFwcyBpbnN0ZWFkLCB1c2UgYC1nZW4gcGhwOmNsYXNzbWFwYC4KKworMi4gSWYgdXNpbmcgUFNSLTQsIHVzZSBgJHRocmlmdENsYXNzTG9hZGVyLT5yZWdpc3Rlck5hbWVzcGFjZSgnbmFtZXNwYWNlJywgJzxwYXRoPicpYCBpbnN0ZWFkIG9mIGAkdGhyaWZ0Q2xhc3NMb2FkZXItPnJlZ2lzdGVyRGVmaW5pdGlvbignbmFtZXNwYWNlJywgJzxwYXRoPicpYC4KZGlmZiAtLWdpdCBhL2xpYi9waHAvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9waHAvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjE3NTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEsNSBAQAorIyMgUEhQIENvZGluZyBTdGFuZGFyZHMKKworUGxlYXNlIGZvbGxvdzoKKyAqIFtUaHJpZnQgR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCisgKiBbUFNSLTJdKGh0dHA6Ly93d3cucGhwLWZpZy5vcmcvcHNyL3Bzci0yLykKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0Jhc2UvVEJhc2UucGhwIGIvbGliL3BocC9saWIvQmFzZS9UQmFzZS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxYjYzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0Jhc2UvVEJhc2UucGhwCkBAIC0wLDAgKzEsMzgyIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEJhc2U7CisKK3VzZSBUaHJpZnRcVHlwZVxUVHlwZTsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZyb20gd2hpY2ggb3RoZXIgVGhyaWZ0IHN0cnVjdHMgZXh0ZW5kLiBUaGlzIGlzIHNvIHRoYXQgd2UgY2FuCisgKiBjdXQgYmFjayBvbiB0aGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUgd2hpY2ggaXMgdHVybmluZyBvdXQgdG8gaGF2ZSBhCisgKiBub250cml2aWFsIGNvc3QganVzdCB0byBsb2FkIHRoYW5rcyB0byB0aGUgd29uZHJvdXNseSBhYnlzbWFsIGltcGxlbWVudGF0aW9uCisgKiBvZiBQSFAuIE5vdGUgdGhhdCBjb2RlIGlzIGludGVudGlvbmFsbHkgZHVwbGljYXRlZCBpbiBoZXJlIHRvIGF2b2lkIG1ha2luZworICogZnVuY3Rpb24gY2FsbHMgZm9yIGV2ZXJ5IGZpZWxkIG9yIG1lbWJlciBvZiBhIGNvbnRhaW5lci4uCisgKi8KK2Fic3RyYWN0IGNsYXNzIFRCYXNlCit7CisgICAgcHVibGljIHN0YXRpYyAkdG1ldGhvZCA9IGFycmF5KAorICAgICAgICBUVHlwZTo6Qk9PTCA9PiAnQm9vbCcsCisgICAgICAgIFRUeXBlOjpCWVRFID0+ICdCeXRlJywKKyAgICAgICAgVFR5cGU6OkkxNiA9PiAnSTE2JywKKyAgICAgICAgVFR5cGU6OkkzMiA9PiAnSTMyJywKKyAgICAgICAgVFR5cGU6Okk2NCA9PiAnSTY0JywKKyAgICAgICAgVFR5cGU6OkRPVUJMRSA9PiAnRG91YmxlJywKKyAgICAgICAgVFR5cGU6OlNUUklORyA9PiAnU3RyaW5nJworICAgICk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkaW5wdXQpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRvdXRwdXQpOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzcGVjID0gbnVsbCwgJHZhbHMgPSBudWxsKQorICAgIHsKKyAgICAgICAgaWYgKGlzX2FycmF5KCRzcGVjKSAmJiBpc19hcnJheSgkdmFscykpIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKCRzcGVjIGFzICRmaWQgPT4gJGZzcGVjKSB7CisgICAgICAgICAgICAgICAgJHZhciA9ICRmc3BlY1sndmFyJ107CisgICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR2YWxzWyR2YXJdKSkgeworICAgICAgICAgICAgICAgICAgICAkdGhpcy0+JHZhciA9ICR2YWxzWyR2YXJdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX3dha2V1cCgpCisgICAgeworICAgICAgICAkdGhpcy0+X19jb25zdHJ1Y3QoZ2V0X29iamVjdF92YXJzKCR0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZE1hcCgmJHZhciwgJHNwZWMsICRpbnB1dCkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGt0eXBlID0gJHNwZWNbJ2t0eXBlJ107CisgICAgICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOworICAgICAgICAka3JlYWQgPSAkdnJlYWQgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV0pKSB7CisgICAgICAgICAgICAka3JlYWQgPSAncmVhZCcgLiBUQmFzZTo6JHRtZXRob2RbJGt0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRrc3BlYyA9ICRzcGVjWydrZXknXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV0pKSB7CisgICAgICAgICAgICAkdnJlYWQgPSAncmVhZCcgLiBUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR2c3BlYyA9ICRzcGVjWyd2YWwnXTsKKyAgICAgICAgfQorICAgICAgICAkdmFyID0gYXJyYXkoKTsKKyAgICAgICAgJF9rdHlwZSA9ICRfdnR5cGUgPSAkc2l6ZSA9IDA7CisgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEJlZ2luKCRfa3R5cGUsICRfdnR5cGUsICRzaXplKTsKKyAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKKyAgICAgICAgICAgICRrZXkgPSAkdmFsID0gbnVsbDsKKyAgICAgICAgICAgIGlmICgka3JlYWQgIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiRrcmVhZCgka2V5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgka3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJGtzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgJGtleSA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRrZXktPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJGtleSwgJGtzcGVjLCAkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGtleSwgJGtzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRrZXksICRrc3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgkdnJlYWQgIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiR2cmVhZCgkdmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJHZzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgJHZhbCA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR2YWwtPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJHZhbCwgJHZzcGVjLCAkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHZhbCwgJHZzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICR2YXJbJGtleV0gPSAkdmFsOworICAgICAgICB9CisgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTGlzdCgmJHZhciwgJHNwZWMsICRpbnB1dCwgJHNldCA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAkZXR5cGUgPSAkc3BlY1snZXR5cGUnXTsKKyAgICAgICAgJGVyZWFkID0gJHZyZWFkID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgeworICAgICAgICAgICAgJGVyZWFkID0gJ3JlYWQnIC4gVEJhc2U6OiR0bWV0aG9kWyRldHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkZXNwZWMgPSAkc3BlY1snZWxlbSddOworICAgICAgICB9CisgICAgICAgICR2YXIgPSBhcnJheSgpOworICAgICAgICAkX2V0eXBlID0gJHNpemUgPSAwOworICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0QmVnaW4oJF9ldHlwZSwgJHNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEJlZ2luKCRfZXR5cGUsICRzaXplKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgKyskaSkgeworICAgICAgICAgICAgJGVsZW0gPSBudWxsOworICAgICAgICAgICAgaWYgKCRlcmVhZCAhPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JGVyZWFkKCRlbGVtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCRldHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3MgPSAkZXNwZWNbJ2NsYXNzJ107CisgICAgICAgICAgICAgICAgICAgICAgICAkZWxlbSA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRlbGVtLT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRlbGVtLCAkZXNwZWMsICRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRlbGVtLCAkZXNwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgICAgICR2YXJbJGVsZW1dID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJHZhciBbXSA9ICRlbGVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgkc2V0KSB7CisgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRFbmQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3JlYWQoJGNsYXNzLCAkc3BlYywgJGlucHV0KQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAkZm5hbWUgPSBudWxsOworICAgICAgICAkZnR5cGUgPSAwOworICAgICAgICAkZmlkID0gMDsKKyAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oJGZuYW1lKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oJGZuYW1lLCAkZnR5cGUsICRmaWQpOworICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzc2V0KCRzcGVjWyRmaWRdKSkgeworICAgICAgICAgICAgICAgICRmc3BlYyA9ICRzcGVjWyRmaWRdOworICAgICAgICAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOworICAgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gJGZzcGVjWyd0eXBlJ10pIHsKKyAgICAgICAgICAgICAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkZnVuYyA9ICdyZWFkJyAuIFRCYXNlOjokdG1ldGhvZFskZnR5cGVdOworICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kZnVuYygkdGhpcy0+JHZhcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCRmdHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJGZzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+JHZhciA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPiR2YXItPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVNYXAoJHZhciwgJHNwZWMsICRvdXRwdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOworICAgICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKKyAgICAgICAgJGt3cml0ZSA9ICR2d3JpdGUgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV0pKSB7CisgICAgICAgICAgICAka3dyaXRlID0gJ3dyaXRlJyAuIFRCYXNlOjokdG1ldGhvZFska3R5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGtzcGVjID0gJHNwZWNbJ2tleSddOworICAgICAgICB9CisgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXSkpIHsKKyAgICAgICAgICAgICR2d3JpdGUgPSAnd3JpdGUnIC4gVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdnNwZWMgPSAkc3BlY1sndmFsJ107CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBCZWdpbigka3R5cGUsICR2dHlwZSwgY291bnQoJHZhcikpOworICAgICAgICBmb3JlYWNoICgkdmFyIGFzICRrZXkgPT4gJHZhbCkgeworICAgICAgICAgICAgaWYgKGlzc2V0KCRrd3JpdGUpKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JGt3cml0ZSgka2V5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgka3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGtleS0+d3JpdGUoJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgka2V5LCAka3NwZWMsICRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXNzZXQoJHZ3cml0ZSkpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kdndyaXRlKCR2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCR2dHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdmFsLT53cml0ZSgkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCR2YWwsICR2c3BlYywgJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxpc3QoJHZhciwgJHNwZWMsICRvdXRwdXQsICRzZXQgPSBmYWxzZSkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107CisgICAgICAgICRld3JpdGUgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRldHlwZV0pKSB7CisgICAgICAgICAgICAkZXdyaXRlID0gJ3dyaXRlJyAuIFRCYXNlOjokdG1ldGhvZFskZXR5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEJlZ2luKCRldHlwZSwgY291bnQoJHZhcikpOworICAgICAgICB9CisgICAgICAgIGZvcmVhY2ggKCR2YXIgYXMgJGtleSA9PiAkdmFsKSB7CisgICAgICAgICAgICAkZWxlbSA9ICRzZXQgPyAka2V5IDogJHZhbDsKKyAgICAgICAgICAgIGlmIChpc3NldCgkZXdyaXRlKSkgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRld3JpdGUoJGVsZW0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCRldHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkZWxlbS0+d3JpdGUoJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGVsZW0sICRlc3BlYywgJG91dHB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0RW5kKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3dyaXRlKCRjbGFzcywgJHNwZWMsICRvdXRwdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJGNsYXNzKTsKKyAgICAgICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKKyAgICAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOworICAgICAgICAgICAgaWYgKCR0aGlzLT4kdmFyICE9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgJGZ0eXBlID0gJGZzcGVjWyd0eXBlJ107CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCR2YXIsICRmdHlwZSwgJGZpZCk7CisgICAgICAgICAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZnR5cGVdKSkgeworICAgICAgICAgICAgICAgICAgICAkZnVuYyA9ICd3cml0ZScgLiBUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXTsKKyAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JGZ1bmMoJHRoaXMtPiR2YXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoJGZ0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPiR2YXItPndyaXRlKCRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAgYi9saWIvcGhwL2xpYi9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM2MWJkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocApAQCAtMCwwICsxLDIwNiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ2xhc3NMb2FkZXIgdG8gbG9hZCBUaHJpZnQgbGlicmFyeSBhbmQgZGVmaW5pdGlvbnMKKyAqIEluc3BpcmVkIGZyb20gVW5pdmVyc2FsQ2xhc3NMb2FkZXIgZnJvbSBTeW1mb255IDIKKyAqCisgKiBAcGFja2FnZSB0aHJpZnQuY2xhc3Nsb2FkZXIKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XENsYXNzTG9hZGVyOworCitjbGFzcyBUaHJpZnRDbGFzc0xvYWRlcgoreworICAgIC8qKgorICAgICAqIE5hbWVzcGFjZXMgcGF0aAorICAgICAqIEB2YXIgYXJyYXkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJG5hbWVzcGFjZXMgPSBhcnJheSgpOworCisgICAgLyoqCisgICAgICogVGhyaWZ0IGRlZmluaXRpb24gcGF0aHMKKyAgICAgKiBAdmFyIHR5cGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGRlZmluaXRpb25zID0gYXJyYXkoKTsKKworICAgIC8qKgorICAgICAqIERvIHdlIHVzZSBBUEMgY2FjaGUgPworICAgICAqIEB2YXIgYm9vbGVhbgorICAgICAqLworICAgIHByb3RlY3RlZCAkYXBjID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBBUEMgQ2FjaGUgcHJlZml4CisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGFwY19wcmVmaXg7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYXV0b2xvYWRlciB0byB1c2UgQVBDIGNhY2hlCisgICAgICogQHBhcmFtIGJvb2xlYW4gJGFwYworICAgICAqIEBwYXJhbSBzdHJpbmcgJGFwY19wcmVmaXgKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGFwYyA9IGZhbHNlLCAkYXBjX3ByZWZpeCA9IG51bGwpCisgICAgeworICAgICAgICAkdGhpcy0+YXBjID0gJGFwYzsKKyAgICAgICAgJHRoaXMtPmFwY19wcmVmaXggPSAkYXBjX3ByZWZpeDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBuYW1lc3BhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZQorICAgICAqIEBwYXJhbSBhcnJheXxzdHJpbmcgJHBhdGhzIFRoZSBsb2NhdGlvbihzKSBvZiB0aGUgbmFtZXNwYWNlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyTmFtZXNwYWNlKCRuYW1lc3BhY2UsICRwYXRocykKKyAgICB7CisgICAgICAgICR0aGlzLT5uYW1lc3BhY2VzWyRuYW1lc3BhY2VdID0gKGFycmF5KSRwYXRoczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBUaHJpZnQgZGVmaW5pdGlvbiBuYW1lc3BhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lc3BhY2UgVGhlIGRlZmluaXRpb24gbmFtZXNwYWNlCisgICAgICogQHBhcmFtIGFycmF5fHN0cmluZyAkcGF0aHMgVGhlIGxvY2F0aW9uKHMpIG9mIHRoZSBkZWZpbml0aW9uIG5hbWVzcGFjZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3RlckRlZmluaXRpb24oJG5hbWVzcGFjZSwgJHBhdGhzKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmRlZmluaXRpb25zWyRuYW1lc3BhY2VdID0gKGFycmF5KSRwYXRoczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgdGhpcyBpbnN0YW5jZSBhcyBhbiBhdXRvbG9hZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIEJvb2xlYW4gJHByZXBlbmQgV2hldGhlciB0byBwcmVwZW5kIHRoZSBhdXRvbG9hZGVyIG9yIG5vdAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3RlcigkcHJlcGVuZCA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgc3BsX2F1dG9sb2FkX3JlZ2lzdGVyKGFycmF5KCR0aGlzLCAnbG9hZENsYXNzJyksIHRydWUsICRwcmVwZW5kKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gY2xhc3MsIGRlZmluaXRpb24gb3IgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkY2xhc3MgVGhlIG5hbWUgb2YgdGhlIGNsYXNzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGxvYWRDbGFzcygkY2xhc3MpCisgICAgeworICAgICAgICBpZiAoKHRydWUgPT09ICR0aGlzLT5hcGMgJiYgKCRmaWxlID0gJHRoaXMtPmZpbmRGaWxlSW5BcGMoJGNsYXNzKSkpIG9yCisgICAgICAgICAgICAoJGZpbGUgPSAkdGhpcy0+ZmluZEZpbGUoJGNsYXNzKSkKKyAgICAgICAgKSB7CisgICAgICAgICAgICByZXF1aXJlX29uY2UgJGZpbGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gY2xhc3Mgb3IgaW50ZXJmYWNlIGluIEFQQy4KKyAgICAgKiBAcGFyYW0gIHN0cmluZyAkY2xhc3MgVGhlIG5hbWUgb2YgdGhlIGNsYXNzCisgICAgICogQHJldHVybiBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZmluZEZpbGVJbkFwYygkY2xhc3MpCisgICAgeworICAgICAgICBpZiAoZmFsc2UgPT09ICRmaWxlID0gYXBjX2ZldGNoKCR0aGlzLT5hcGNfcHJlZml4IC4gJGNsYXNzKSkgeworICAgICAgICAgICAgYXBjX3N0b3JlKCR0aGlzLT5hcGNfcHJlZml4IC4gJGNsYXNzLCAkZmlsZSA9ICR0aGlzLT5maW5kRmlsZSgkY2xhc3MpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGNsYXNzIGluIG5hbWVzcGFjZXMgb3IgZGVmaW5pdGlvbnMgZGlyZWN0b3JpZXMKKyAgICAgKiBAcGFyYW0gIHN0cmluZyAkY2xhc3MKKyAgICAgKiBAcmV0dXJuIHN0cmluZworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBmaW5kRmlsZSgkY2xhc3MpCisgICAgeworICAgICAgICAvLyBSZW1vdmUgZmlyc3QgYmFja3NsYXNoCisgICAgICAgIGlmICgnXFwnID09ICRjbGFzc1swXSkgeworICAgICAgICAgICAgJGNsYXNzID0gc3Vic3RyKCRjbGFzcywgMSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmFsc2UgIT09ICRwb3MgPSBzdHJycG9zKCRjbGFzcywgJ1xcJykpIHsKKyAgICAgICAgICAgIC8vIE5hbWVzcGFjZWQgY2xhc3MgbmFtZQorICAgICAgICAgICAgJG5hbWVzcGFjZSA9IHN1YnN0cigkY2xhc3MsIDAsICRwb3MpOworCisgICAgICAgICAgICAvLyBJdGVyYXRlIGluIG5vcm1hbCBuYW1lc3BhY2VzCisgICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+bmFtZXNwYWNlcyBhcyAkbnMgPT4gJGRpcnMpIHsKKyAgICAgICAgICAgICAgICAvL0Rvbid0IGludGVyZmVyZSB3aXRoIG90aGVyIGF1dG9sb2FkZXJzCisgICAgICAgICAgICAgICAgaWYgKDAgIT09IHN0cnBvcygkbmFtZXNwYWNlLCAkbnMpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkaXJzIGFzICRkaXIpIHsKKyAgICAgICAgICAgICAgICAgICAgJGNsYXNzTmFtZSA9IHN1YnN0cigkY2xhc3MsICRwb3MgKyAxKTsKKworICAgICAgICAgICAgICAgICAgICAkZmlsZSA9ICRkaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9yZXBsYWNlKCdcXCcsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRuYW1lc3BhY2UpIC4KKyAgICAgICAgICAgICAgICAgICAgICAgIERJUkVDVE9SWV9TRVBBUkFUT1IgLgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzTmFtZSAuICcucGhwJzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGZpbGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEl0ZXJhdGUgaW4gVGhyaWZ0IG5hbWVzcGFjZXMKKworICAgICAgICAgICAgLy8gUmVtb3ZlIGZpcnN0IHBhcnQgb2YgbmFtZXNwYWNlCisgICAgICAgICAgICAkbSA9IGV4cGxvZGUoJ1xcJywgJGNsYXNzKTsKKworICAgICAgICAgICAgLy8gSWdub3JlIHdyb25nIGNhbGwKKyAgICAgICAgICAgIGlmIChjb3VudCgkbSkgPD0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJGNsYXNzID0gYXJyYXlfcG9wKCRtKTsKKyAgICAgICAgICAgICRuYW1lc3BhY2UgPSBpbXBsb2RlKCdcXCcsICRtKTsKKworICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmRlZmluaXRpb25zIGFzICRucyA9PiAkZGlycykgeworICAgICAgICAgICAgICAgIC8vRG9uJ3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgYXV0b2xvYWRlcnMKKyAgICAgICAgICAgICAgICBpZiAoMCAhPT0gc3RycG9zKCRuYW1lc3BhY2UsICRucykpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGRpcnMgYXMgJGRpcikgeworICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICogQXZhaWxhYmxlIGluIHNlcnZpY2U6IEludGVyZmFjZSwgQ2xpZW50LCBQcm9jZXNzb3IsIFJlc3QKKyAgICAgICAgICAgICAgICAgICAgICogQW5kIGV2ZXJ5IHNlcnZpY2UgbWV0aG9kcyAoXy4rKQorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IHByZWdfbWF0Y2goJyMoLispKGlmfGNsaWVudHxwcm9jZXNzb3J8cmVzdCkkI2knLCAkY2xhc3MsICRuKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIDAgPT09IHByZWdfbWF0Y2goJyMoLispX1thLXowLTldK18oYXJnc3xyZXN1bHQpJCNpJywgJGNsYXNzLCAkbikKKyAgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3NOYW1lID0gJ1R5cGVzJzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzc05hbWUgPSAkblsxXTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICRmaWxlID0gJGRpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLgorICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3JlcGxhY2UoJ1xcJywgRElSRUNUT1JZX1NFUEFSQVRPUiwgJG5hbWVzcGFjZSkgLgorICAgICAgICAgICAgICAgICAgICAgICAgRElSRUNUT1JZX1NFUEFSQVRPUiAuCisgICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3NOYW1lIC4gJy5waHAnOworCisgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkZmlsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkZmlsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UQXBwbGljYXRpb25FeGNlcHRpb24ucGhwIGIvbGliL3BocC9saWIvRXhjZXB0aW9uL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJiNmE2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UQXBwbGljYXRpb25FeGNlcHRpb24ucGhwCkBAIC0wLDAgKzEsNzYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcRXhjZXB0aW9uOworCit1c2UgVGhyaWZ0XFR5cGVcVFR5cGU7CisKK2NsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24KK3sKKyAgICBwdWJsaWMgc3RhdGljICRfVFNQRUMgPQorICAgICAgICBhcnJheSgxID0+IGFycmF5KCd2YXInID0+ICdtZXNzYWdlJywKKyAgICAgICAgICAgICd0eXBlJyA9PiBUVHlwZTo6U1RSSU5HKSwKKyAgICAgICAgICAgIDIgPT4gYXJyYXkoJ3ZhcicgPT4gJ2NvZGUnLAorICAgICAgICAgICAgICAgICd0eXBlJyA9PiBUVHlwZTo6STMyKSk7CisKKyAgICBjb25zdCBVTktOT1dOID0gMDsKKyAgICBjb25zdCBVTktOT1dOX01FVEhPRCA9IDE7CisgICAgY29uc3QgSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyOworICAgIGNvbnN0IFdST05HX01FVEhPRF9OQU1FID0gMzsKKyAgICBjb25zdCBCQURfU0VRVUVOQ0VfSUQgPSA0OworICAgIGNvbnN0IE1JU1NJTkdfUkVTVUxUID0gNTsKKyAgICBjb25zdCBJTlRFUk5BTF9FUlJPUiA9IDY7CisgICAgY29uc3QgUFJPVE9DT0xfRVJST1IgPSA3OworICAgIGNvbnN0IElOVkFMSURfVFJBTlNGT1JNID0gODsKKyAgICBjb25zdCBJTlZBTElEX1BST1RPQ09MID0gOTsKKyAgICBjb25zdCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlID0gbnVsbCwgJGNvZGUgPSAwKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRvdXRwdXQpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPl9yZWFkKCdUQXBwbGljYXRpb25FeGNlcHRpb24nLCBzZWxmOjokX1RTUEVDLCAkb3V0cHV0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG91dHB1dCkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbignVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7CisgICAgICAgIGlmICgkbWVzc2FnZSA9ICR0aGlzLT5nZXRNZXNzYWdlKCkpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbignbWVzc2FnZScsIFRUeXBlOjpTVFJJTkcsIDEpOworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJpbmcoJG1lc3NhZ2UpOworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgIGlmICgkY29kZSA9ICR0aGlzLT5nZXRDb2RlKCkpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigndHlwZScsIFRUeXBlOjpJMzIsIDIpOworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVJMzIoJGNvZGUpOworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7CisKKyAgICAgICAgcmV0dXJuICR4ZmVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9URXhjZXB0aW9uLnBocCBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9URXhjZXB0aW9uLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGJmODMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRXhjZXB0aW9uL1RFeGNlcHRpb24ucGhwCkBAIC0wLDAgKzEsMzg0IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEV4Y2VwdGlvbjsKKwordXNlIFRocmlmdFxUeXBlXFRUeXBlOwordXNlIFRocmlmdFxCYXNlXFRCYXNlOworCisvKioKKyAqIE5PVEUobWNzbGVlKTogVGhpcyBjdXJyZW50bHkgY29udGFpbnMgYSB0b24gb2YgZHVwbGljYXRlZCBjb2RlIGZyb20gVEJhc2UKKyAqIGJlY2F1c2Ugd2UgbmVlZCB0byBzYXZlIENQVSBjeWNsZXMgYW5kIHRoaXMgaXMgbm90IHlldCBpbiBhbiBleHRlbnNpb24uCisgKiBJZGVhbGx5IHdlJ2QgbXVsdGlwbHktaW5oZXJpdCBURXhjZXB0aW9uIGZyb20gYm90aCBFeGNlcHRpb24gYW5kIEJhc2UsIGJ1dAorICogdGhhdCdzIG5vdCBwb3NzaWJsZSBpbiBQSFAgYW5kIHRoZXJlIGFyZSBubyBtb2R1bGVzIGVpdGhlciwgc28gZm9yIG5vdyB3ZQorICogYXBvbG9nZXRpY2FsbHkgdGFrZSBhIHRyaXAgdG8gSGFja1Rvd24uCisgKgorICogQ2FuIGJlIGNhbGxlZCB3aXRoIHN0YW5kYXJkIEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciAobWVzc2FnZSwgY29kZSkgb3Igd2l0aAorICogVGhyaWZ0IEJhc2Ugb2JqZWN0IGNvbnN0cnVjdG9yIChzcGVjLCB2YWxzKS4KKyAqCisgKiBAcGFyYW0gbWl4ZWQgJHAxIE1lc3NhZ2UgKHN0cmluZykgb3IgdHlwZS1zcGVjIChhcnJheSkKKyAqIEBwYXJhbSBtaXhlZCAkcDIgQ29kZSAoaW50ZWdlcikgb3IgdmFsdWVzIChhcnJheSkKKyAqLworY2xhc3MgVEV4Y2VwdGlvbiBleHRlbmRzIFxFeGNlcHRpb24KK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHAxID0gbnVsbCwgJHAyID0gMCkKKyAgICB7CisgICAgICAgIGlmIChpc19hcnJheSgkcDEpICYmIGlzX2FycmF5KCRwMikpIHsKKyAgICAgICAgICAgICRzcGVjID0gJHAxOworICAgICAgICAgICAgJHZhbHMgPSAkcDI7CisgICAgICAgICAgICBmb3JlYWNoICgkc3BlYyBhcyAkZmlkID0+ICRmc3BlYykgeworICAgICAgICAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOworICAgICAgICAgICAgICAgIGlmIChpc3NldCgkdmFsc1skdmFyXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPiR2YXIgPSAkdmFsc1skdmFyXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRwMSwgJHAyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgJHRtZXRob2QgPSBhcnJheSgKKyAgICAgICAgVFR5cGU6OkJPT0wgPT4gJ0Jvb2wnLAorICAgICAgICBUVHlwZTo6QllURSA9PiAnQnl0ZScsCisgICAgICAgIFRUeXBlOjpJMTYgPT4gJ0kxNicsCisgICAgICAgIFRUeXBlOjpJMzIgPT4gJ0kzMicsCisgICAgICAgIFRUeXBlOjpJNjQgPT4gJ0k2NCcsCisgICAgICAgIFRUeXBlOjpET1VCTEUgPT4gJ0RvdWJsZScsCisgICAgICAgIFRUeXBlOjpTVFJJTkcgPT4gJ1N0cmluZycKKyAgICApOworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZE1hcCgmJHZhciwgJHNwZWMsICRpbnB1dCkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGt0eXBlID0gJHNwZWNbJ2t0eXBlJ107CisgICAgICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOworICAgICAgICAka3JlYWQgPSAkdnJlYWQgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV0pKSB7CisgICAgICAgICAgICAka3JlYWQgPSAncmVhZCcgLiBUQmFzZTo6JHRtZXRob2RbJGt0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRrc3BlYyA9ICRzcGVjWydrZXknXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV0pKSB7CisgICAgICAgICAgICAkdnJlYWQgPSAncmVhZCcgLiBUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR2c3BlYyA9ICRzcGVjWyd2YWwnXTsKKyAgICAgICAgfQorICAgICAgICAkdmFyID0gYXJyYXkoKTsKKyAgICAgICAgJF9rdHlwZSA9ICRfdnR5cGUgPSAkc2l6ZSA9IDA7CisgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEJlZ2luKCRfa3R5cGUsICRfdnR5cGUsICRzaXplKTsKKyAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKKyAgICAgICAgICAgICRrZXkgPSAkdmFsID0gbnVsbDsKKyAgICAgICAgICAgIGlmICgka3JlYWQgIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiRrcmVhZCgka2V5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgka3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJGtzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgJGtleSA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRrZXktPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJGtleSwgJGtzcGVjLCAkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGtleSwgJGtzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRrZXksICRrc3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgkdnJlYWQgIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiR2cmVhZCgkdmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJHZzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgJHZhbCA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR2YWwtPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJHZhbCwgJHZzcGVjLCAkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHZhbCwgJHZzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICR2YXJbJGtleV0gPSAkdmFsOworICAgICAgICB9CisgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTGlzdCgmJHZhciwgJHNwZWMsICRpbnB1dCwgJHNldCA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAkZXR5cGUgPSAkc3BlY1snZXR5cGUnXTsKKyAgICAgICAgJGVyZWFkID0gJHZyZWFkID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgeworICAgICAgICAgICAgJGVyZWFkID0gJ3JlYWQnIC4gVEJhc2U6OiR0bWV0aG9kWyRldHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkZXNwZWMgPSAkc3BlY1snZWxlbSddOworICAgICAgICB9CisgICAgICAgICR2YXIgPSBhcnJheSgpOworICAgICAgICAkX2V0eXBlID0gJHNpemUgPSAwOworICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0QmVnaW4oJF9ldHlwZSwgJHNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEJlZ2luKCRfZXR5cGUsICRzaXplKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgKyskaSkgeworICAgICAgICAgICAgJGVsZW0gPSBudWxsOworICAgICAgICAgICAgaWYgKCRlcmVhZCAhPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JGVyZWFkKCRlbGVtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCRldHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3MgPSAkZXNwZWNbJ2NsYXNzJ107CisgICAgICAgICAgICAgICAgICAgICAgICAkZWxlbSA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRlbGVtLT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRlbGVtLCAkZXNwZWMsICRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRlbGVtLCAkZXNwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgICAgICR2YXJbJGVsZW1dID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJHZhciBbXSA9ICRlbGVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgkc2V0KSB7CisgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRFbmQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3JlYWQoJGNsYXNzLCAkc3BlYywgJGlucHV0KQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAkZm5hbWUgPSBudWxsOworICAgICAgICAkZnR5cGUgPSAwOworICAgICAgICAkZmlkID0gMDsKKyAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oJGZuYW1lKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oJGZuYW1lLCAkZnR5cGUsICRmaWQpOworICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzc2V0KCRzcGVjWyRmaWRdKSkgeworICAgICAgICAgICAgICAgICRmc3BlYyA9ICRzcGVjWyRmaWRdOworICAgICAgICAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOworICAgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gJGZzcGVjWyd0eXBlJ10pIHsKKyAgICAgICAgICAgICAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkZnVuYyA9ICdyZWFkJyAuIFRCYXNlOjokdG1ldGhvZFskZnR5cGVdOworICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kZnVuYygkdGhpcy0+JHZhcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCRmdHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJGZzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+JHZhciA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPiR2YXItPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVNYXAoJHZhciwgJHNwZWMsICRvdXRwdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOworICAgICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKKyAgICAgICAgJGt3cml0ZSA9ICR2d3JpdGUgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV0pKSB7CisgICAgICAgICAgICAka3dyaXRlID0gJ3dyaXRlJyAuIFRCYXNlOjokdG1ldGhvZFska3R5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGtzcGVjID0gJHNwZWNbJ2tleSddOworICAgICAgICB9CisgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXSkpIHsKKyAgICAgICAgICAgICR2d3JpdGUgPSAnd3JpdGUnIC4gVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdnNwZWMgPSAkc3BlY1sndmFsJ107CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBCZWdpbigka3R5cGUsICR2dHlwZSwgY291bnQoJHZhcikpOworICAgICAgICBmb3JlYWNoICgkdmFyIGFzICRrZXkgPT4gJHZhbCkgeworICAgICAgICAgICAgaWYgKGlzc2V0KCRrd3JpdGUpKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JGt3cml0ZSgka2V5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgka3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGtleS0+d3JpdGUoJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgka2V5LCAka3NwZWMsICRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXNzZXQoJHZ3cml0ZSkpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kdndyaXRlKCR2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCR2dHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdmFsLT53cml0ZSgkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCR2YWwsICR2c3BlYywgJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxpc3QoJHZhciwgJHNwZWMsICRvdXRwdXQsICRzZXQgPSBmYWxzZSkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107CisgICAgICAgICRld3JpdGUgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRldHlwZV0pKSB7CisgICAgICAgICAgICAkZXdyaXRlID0gJ3dyaXRlJyAuIFRCYXNlOjokdG1ldGhvZFskZXR5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEJlZ2luKCRldHlwZSwgY291bnQoJHZhcikpOworICAgICAgICB9CisgICAgICAgIGZvcmVhY2ggKCR2YXIgYXMgJGtleSA9PiAkdmFsKSB7CisgICAgICAgICAgICAkZWxlbSA9ICRzZXQgPyAka2V5IDogJHZhbDsKKyAgICAgICAgICAgIGlmIChpc3NldCgkZXdyaXRlKSkgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRld3JpdGUoJGVsZW0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCRldHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkZWxlbS0+d3JpdGUoJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGVsZW0sICRlc3BlYywgJG91dHB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0RW5kKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3dyaXRlKCRjbGFzcywgJHNwZWMsICRvdXRwdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJGNsYXNzKTsKKyAgICAgICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKKyAgICAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOworICAgICAgICAgICAgaWYgKCR0aGlzLT4kdmFyICE9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgJGZ0eXBlID0gJGZzcGVjWyd0eXBlJ107CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCR2YXIsICRmdHlwZSwgJGZpZCk7CisgICAgICAgICAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZnR5cGVdKSkgeworICAgICAgICAgICAgICAgICAgICAkZnVuYyA9ICd3cml0ZScgLiBUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXTsKKyAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JGZ1bmMoJHRoaXMtPiR2YXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoJGZ0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPiR2YXItPndyaXRlKCRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9FeGNlcHRpb24vVFByb3RvY29sRXhjZXB0aW9uLnBocCBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UUHJvdG9jb2xFeGNlcHRpb24ucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNTVkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9FeGNlcHRpb24vVFByb3RvY29sRXhjZXB0aW9uLnBocApAQCAtMCwwICsxLDUwIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqIEBhdXRob3I6IHJtYXJpbiAobWFyaW4ucmFkdUBmYWNlYm9vay5jb20pCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxFeGNlcHRpb247CisKKy8qKgorICogUHJvdG9jb2wgbW9kdWxlLiBDb250YWlucyBhbGwgdGhlIHR5cGVzIGFuZCBkZWZpbml0aW9ucyBuZWVkZWQgdG8gaW1wbGVtZW50CisgKiBhIHByb3RvY29sIGVuY29kZXIvZGVjb2Rlci4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCisvKioKKyAqIFByb3RvY29sIGV4Y2VwdGlvbnMKKyAqLworY2xhc3MgVFByb3RvY29sRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbgoreworICAgIGNvbnN0IFVOS05PV04gPSAwOworICAgIGNvbnN0IElOVkFMSURfREFUQSA9IDE7CisgICAgY29uc3QgTkVHQVRJVkVfU0laRSA9IDI7CisgICAgY29uc3QgU0laRV9MSU1JVCA9IDM7CisgICAgY29uc3QgQkFEX1ZFUlNJT04gPSA0OworICAgIGNvbnN0IE5PVF9JTVBMRU1FTlRFRCA9IDU7CisgICAgY29uc3QgREVQVEhfTElNSVQgPSA2OworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlID0gbnVsbCwgJGNvZGUgPSAwKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UVHJhbnNwb3J0RXhjZXB0aW9uLnBocCBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UVHJhbnNwb3J0RXhjZXB0aW9uLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDhkNTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRXhjZXB0aW9uL1RUcmFuc3BvcnRFeGNlcHRpb24ucGhwCkBAIC0wLDAgKzEsNDAgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEV4Y2VwdGlvbjsKKworLyoqCisgKiBUcmFuc3BvcnQgZXhjZXB0aW9ucworICovCitjbGFzcyBUVHJhbnNwb3J0RXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbgoreworICAgIGNvbnN0IFVOS05PV04gPSAwOworICAgIGNvbnN0IE5PVF9PUEVOID0gMTsKKyAgICBjb25zdCBBTFJFQURZX09QRU4gPSAyOworICAgIGNvbnN0IFRJTUVEX09VVCA9IDM7CisgICAgY29uc3QgRU5EX09GX0ZJTEUgPSA0OworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlID0gbnVsbCwgJGNvZGUgPSAwKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0ZhY3RvcnkvVEJpbmFyeVByb3RvY29sRmFjdG9yeS5waHAgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MTkxODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwCkBAIC0wLDAgKzEsNDUgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKKwordXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7CisKKy8qKgorICogQmluYXJ5IFByb3RvY29sIEZhY3RvcnkKKyAqLworY2xhc3MgVEJpbmFyeVByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkKK3sKKyAgICBwcml2YXRlICRzdHJpY3RSZWFkXyA9IGZhbHNlOworICAgIHByaXZhdGUgJHN0cmljdFdyaXRlXyA9IGZhbHNlOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzdHJpY3RSZWFkID0gZmFsc2UsICRzdHJpY3RXcml0ZSA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnN0cmljdFJlYWRfID0gJHN0cmljdFJlYWQ7CisgICAgICAgICR0aGlzLT5zdHJpY3RXcml0ZV8gPSAkc3RyaWN0V3JpdGU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCR0cmFucykKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFucywgJHRoaXMtPnN0cmljdFJlYWRfLCAkdGhpcy0+c3RyaWN0V3JpdGVfKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9GYWN0b3J5L1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVENvbXBhY3RQcm90b2NvbEZhY3RvcnkucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZmI4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5LnBocApAQCAtMCwwICsxLDQwIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7CisKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVENvbXBhY3RQcm90b2NvbDsKKworLyoqCisgKiBDb21wYWN0IFByb3RvY29sIEZhY3RvcnkKKyAqLworY2xhc3MgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCR0cmFucykKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCgkdHJhbnMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0ZhY3RvcnkvVEpTT05Qcm90b2NvbEZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvRmFjdG9yeS9USlNPTlByb3RvY29sRmFjdG9yeS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJmYjFkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVEpTT05Qcm90b2NvbEZhY3RvcnkucGhwCkBAIC0wLDAgKzEsNDAgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKKwordXNlIFRocmlmdFxQcm90b2NvbFxUSlNPTlByb3RvY29sOworCisvKioKKyAqIEpTT04gUHJvdG9jb2wgRmFjdG9yeQorICovCitjbGFzcyBUSlNPTlByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdG9jb2woJHRyYW5zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUSlNPTlByb3RvY29sKCR0cmFucyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvRmFjdG9yeS9UUHJvdG9jb2xGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVFByb3RvY29sRmFjdG9yeS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMwNjZjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVFByb3RvY29sRmFjdG9yeS5waHAKQEAgLTAsMCArMSwzNiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxGYWN0b3J5OworCisvKioKKyAqIFByb3RvY29sIGZhY3RvcnkgY3JlYXRlcyBwcm90b2NvbCBvYmplY3RzIGZyb20gdHJhbnNwb3J0cworICovCitpbnRlcmZhY2UgVFByb3RvY29sRmFjdG9yeQoreworICAgIC8qKgorICAgICAqIEJ1aWxkIGEgcHJvdG9jb2wgZnJvbSB0aGUgYmFzZSB0cmFuc3BvcnQKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhyaWZ0XFByb3RvY29sXFRQcm90b2NvbCBwcm90b2NvbAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCgkdHJhbnMpOworfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZGU0ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RTdHJpbmdGdW5jRmFjdG9yeS5waHAKQEAgLTAsMCArMSw2NiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK25hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKKwordXNlIFRocmlmdFxTdHJpbmdGdW5jXENvcmU7Cit1c2UgVGhyaWZ0XFN0cmluZ0Z1bmNcTWJzdHJpbmc7Cit1c2UgVGhyaWZ0XFN0cmluZ0Z1bmNcVFN0cmluZ0Z1bmM7CisKK2NsYXNzIFRTdHJpbmdGdW5jRmFjdG9yeQoreworICAgIHByaXZhdGUgc3RhdGljICRfaW5zdGFuY2U7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIFNpbmdsZXRvbiBpbnN0YW5jZSBvZiBUU3RyaW5nRnVuYyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzCisgICAgICogY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHN5c3RlbSdzIG1ic3RyaW5nLmZ1bmNfb3ZlcmxvYWQgc2V0dGluZ3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRTdHJpbmdGdW5jCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGUoKQorICAgIHsKKyAgICAgICAgaWYgKCFzZWxmOjokX2luc3RhbmNlKSB7CisgICAgICAgICAgICBzZWxmOjpfc2V0SW5zdGFuY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzZWxmOjokX2luc3RhbmNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9zZXRJbnN0YW5jZSgpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2Fubm90IHVzZSBzdHIqIGZ1bmN0aW9ucyBmb3IgYnl0ZSBjb3VudGluZyBiZWNhdXNlIG11bHRpYnl0ZQorICAgICAgICAgKiBjaGFyYWN0ZXJzIHdpbGwgYmUgcmVhZCBhIHNpbmdsZSBieXRlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogU2VlOiBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbWJzdHJpbmcub3ZlcmxvYWQucGhwCisgICAgICAgICAqLworICAgICAgICBpZiAoaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpICYgMikgeworICAgICAgICAgICAgc2VsZjo6JF9pbnN0YW5jZSA9IG5ldyBNYnN0cmluZygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBtYnN0cmluZyBpcyBub3QgaW5zdGFsbGVkIG9yIGRvZXMgbm90IGhhdmUgZnVuY3Rpb24gb3ZlcmxvYWRpbmcKKyAgICAgICAgICAgICAqIG9mIHRoZSBzdHIqIGZ1bmN0aW9ucyBlbmFibGVkIHNvIHVzZSBQSFAgY29yZSBzdHIqIGZ1bmN0aW9ucyBmb3IKKyAgICAgICAgICAgICAqIGJ5dGUgY291bnRpbmcuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHNlbGY6OiRfaW5zdGFuY2UgPSBuZXcgQ29yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvRmFjdG9yeS9UVHJhbnNwb3J0RmFjdG9yeS5waHAgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RUcmFuc3BvcnRGYWN0b3J5LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2YyZWVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRmFjdG9yeS9UVHJhbnNwb3J0RmFjdG9yeS5waHAKQEAgLTAsMCArMSwxOCBAQAorPD9waHAKKworbmFtZXNwYWNlIFRocmlmdFxGYWN0b3J5OworCit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUVHJhbnNwb3J0OworCitjbGFzcyBUVHJhbnNwb3J0RmFjdG9yeQoreworICAgIC8qKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkdHJhbnNwb3J0CisgICAgICogQHJldHVybiBUVHJhbnNwb3J0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCAkdHJhbnNwb3J0KQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0cmFuc3BvcnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9CYXNlQ29udGV4dC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9KU09OL0Jhc2VDb250ZXh0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWJjYjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9CYXNlQ29udGV4dC5waHAKQEAgLTAsMCArMSwzOSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbFxKU09OOworCitjbGFzcyBCYXNlQ29udGV4dAoreworICAgIHB1YmxpYyBmdW5jdGlvbiBlc2NhcGVOdW0oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCkKKyAgICB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9MaXN0Q29udGV4dC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9KU09OL0xpc3RDb250ZXh0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWY2NTk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9MaXN0Q29udGV4dC5waHAKQEAgLTAsMCArMSw1NCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbFxKU09OOworCit1c2UgVGhyaWZ0XFByb3RvY29sXFRKU09OUHJvdG9jb2w7CisKK2NsYXNzIExpc3RDb250ZXh0IGV4dGVuZHMgQmFzZUNvbnRleHQKK3sKKyAgICBwcml2YXRlICRmaXJzdF8gPSB0cnVlOworICAgIHByaXZhdGUgJHBfOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBfID0gJHA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+Zmlyc3RfKSB7CisgICAgICAgICAgICAkdGhpcy0+Zmlyc3RfID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+cF8tPmdldFRyYW5zcG9ydCgpLT53cml0ZShUSlNPTlByb3RvY29sOjpDT01NQSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmZpcnN0XykgeworICAgICAgICAgICAgJHRoaXMtPmZpcnN0XyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPnBfLT5yZWFkSlNPTlN5bnRheENoYXIoVEpTT05Qcm90b2NvbDo6Q09NTUEpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9Mb29rYWhlYWRSZWFkZXIucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9Mb29rYWhlYWRSZWFkZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMThjNDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9KU09OL0xvb2thaGVhZFJlYWRlci5waHAKQEAgLTAsMCArMSw1NyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbFxKU09OOworCitjbGFzcyBMb29rYWhlYWRSZWFkZXIKK3sKKyAgICBwcml2YXRlICRoYXNEYXRhXyA9IGZhbHNlOworICAgIHByaXZhdGUgJGRhdGFfID0gYXJyYXkoKTsKKyAgICBwcml2YXRlICRwXzsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcCkKKyAgICB7CisgICAgICAgICR0aGlzLT5wXyA9ICRwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+aGFzRGF0YV8pIHsKKyAgICAgICAgICAgICR0aGlzLT5oYXNEYXRhXyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPmRhdGFfID0gJHRoaXMtPnBfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEFsbCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdWJzdHIoJHRoaXMtPmRhdGFfLCAwLCAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcGVlaygpCisgICAgeworICAgICAgICBpZiAoISR0aGlzLT5oYXNEYXRhXykgeworICAgICAgICAgICAgJHRoaXMtPmRhdGFfID0gJHRoaXMtPnBfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEFsbCgxKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT5oYXNEYXRhXyA9IHRydWU7CisKKyAgICAgICAgcmV0dXJuIHN1YnN0cigkdGhpcy0+ZGF0YV8sIDAsIDEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL0pTT04vUGFpckNvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9QYWlyQ29udGV4dC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzNTNjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL0pTT04vUGFpckNvbnRleHQucGhwCkBAIC0wLDAgKzEsNjQgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcSlNPTjsKKwordXNlIFRocmlmdFxQcm90b2NvbFxUSlNPTlByb3RvY29sOworCitjbGFzcyBQYWlyQ29udGV4dCBleHRlbmRzIEJhc2VDb250ZXh0Cit7CisgICAgcHJpdmF0ZSAkZmlyc3RfID0gdHJ1ZTsKKyAgICBwcml2YXRlICRjb2xvbl8gPSB0cnVlOworICAgIHByaXZhdGUgJHBfID0gbnVsbDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcCkKKyAgICB7CisgICAgICAgICR0aGlzLT5wXyA9ICRwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmZpcnN0XykgeworICAgICAgICAgICAgJHRoaXMtPmZpcnN0XyA9IGZhbHNlOworICAgICAgICAgICAgJHRoaXMtPmNvbG9uXyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+cF8tPmdldFRyYW5zcG9ydCgpLT53cml0ZSgkdGhpcy0+Y29sb25fID8gVEpTT05Qcm90b2NvbDo6Q09MT04gOiBUSlNPTlByb3RvY29sOjpDT01NQSk7CisgICAgICAgICAgICAkdGhpcy0+Y29sb25fID0gISR0aGlzLT5jb2xvbl87CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmZpcnN0XykgeworICAgICAgICAgICAgJHRoaXMtPmZpcnN0XyA9IGZhbHNlOworICAgICAgICAgICAgJHRoaXMtPmNvbG9uXyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+cF8tPnJlYWRKU09OU3ludGF4Q2hhcigkdGhpcy0+Y29sb25fID8gVEpTT05Qcm90b2NvbDo6Q09MT04gOiBUSlNPTlByb3RvY29sOjpDT01NQSk7CisgICAgICAgICAgICAkdGhpcy0+Y29sb25fID0gISR0aGlzLT5jb2xvbl87CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZXNjYXBlTnVtKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29sb25fOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbi5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24ucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMmI4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24ucGhwCkBAIC0wLDAgKzEsMzMgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTjsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKKworY2xhc3MgQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24KK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1lc3NhZ2UpCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9Db250ZXh0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmQxNmZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9Db250ZXh0LnBocApAQCAtMCwwICsxLDM1IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT047CisKK2NsYXNzIENvbnRleHQKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNNYXBLZXkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTGlzdENvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9MaXN0Q29udGV4dC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYzNDZkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTGlzdENvbnRleHQucGhwCkBAIC0wLDAgKzEsNDUgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTjsKKwordXNlIFRocmlmdFxQcm90b2NvbFxUU2ltcGxlSlNPTlByb3RvY29sOworCitjbGFzcyBMaXN0Q29udGV4dCBleHRlbmRzIENvbnRleHQKK3sKKyAgICBwcm90ZWN0ZWQgJGZpcnN0XyA9IHRydWU7CisgICAgcHJpdmF0ZSAkcF87CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHApCisgICAgeworICAgICAgICAkdGhpcy0+cF8gPSAkcDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5maXJzdF8pIHsKKyAgICAgICAgICAgICR0aGlzLT5maXJzdF8gPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0aGlzLT5wXy0+Z2V0VHJhbnNwb3J0KCktPndyaXRlKFRTaW1wbGVKU09OUHJvdG9jb2w6OkNPTU1BKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTWFwQ29udGV4dC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL01hcENvbnRleHQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYzA2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL01hcENvbnRleHQucGhwCkBAIC0wLDAgKzEsNDcgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTjsKKworY2xhc3MgTWFwQ29udGV4dCBleHRlbmRzIFN0cnVjdENvbnRleHQKK3sKKyAgICBwcm90ZWN0ZWQgJGlzS2V5ID0gdHJ1ZTsKKyAgICBwcml2YXRlICRwXzsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcCkKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHApOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgpCisgICAgeworICAgICAgICBwYXJlbnQ6OndyaXRlKCk7CisgICAgICAgICR0aGlzLT5pc0tleSA9ICEkdGhpcy0+aXNLZXk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGlzTWFwS2V5KCkKKyAgICB7CisgICAgICAgIC8vIHdlIHdhbnQgdG8gY29lcmNlIG1hcCBrZXlzIHRvIGpzb24gc3RyaW5ncyByZWdhcmRsZXNzCisgICAgICAgIC8vIG9mIHRoZWlyIHR5cGUKKyAgICAgICAgcmV0dXJuICR0aGlzLT5pc0tleTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL1N0cnVjdENvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9TdHJ1Y3RDb250ZXh0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGE2MmQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9TdHJ1Y3RDb250ZXh0LnBocApAQCAtMCwwICsxLDUyIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT047CisKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVFNpbXBsZUpTT05Qcm90b2NvbDsKKworY2xhc3MgU3RydWN0Q29udGV4dCBleHRlbmRzIENvbnRleHQKK3sKKyAgICBwcm90ZWN0ZWQgJGZpcnN0XyA9IHRydWU7CisgICAgcHJvdGVjdGVkICRjb2xvbl8gPSB0cnVlOworICAgIHByaXZhdGUgJHBfOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBfID0gJHA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+Zmlyc3RfKSB7CisgICAgICAgICAgICAkdGhpcy0+Zmlyc3RfID0gZmFsc2U7CisgICAgICAgICAgICAkdGhpcy0+Y29sb25fID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0aGlzLT5wXy0+Z2V0VHJhbnNwb3J0KCktPndyaXRlKAorICAgICAgICAgICAgICAgICR0aGlzLT5jb2xvbl8gPworICAgICAgICAgICAgICAgICAgICBUU2ltcGxlSlNPTlByb3RvY29sOjpDT0xPTiA6CisgICAgICAgICAgICAgICAgICAgIFRTaW1wbGVKU09OUHJvdG9jb2w6OkNPTU1BCisgICAgICAgICAgICApOworICAgICAgICAgICAgJHRoaXMtPmNvbG9uXyA9ICEkdGhpcy0+Y29sb25fOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RhNWMwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAKQEAgLTAsMCArMSw0NTMgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBUaHJpZnRcVHlwZVxUVHlwZTsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRQcm90b2NvbEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7CisKKy8qKgorICogQmluYXJ5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wuCisgKgorICovCitjbGFzcyBUQmluYXJ5UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wKK3sKKyAgICBjb25zdCBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwOworICAgIGNvbnN0IFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7CisKKyAgICBwcm90ZWN0ZWQgJHN0cmljdFJlYWRfID0gZmFsc2U7CisgICAgcHJvdGVjdGVkICRzdHJpY3RXcml0ZV8gPSB0cnVlOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucywgJHN0cmljdFJlYWQgPSBmYWxzZSwgJHN0cmljdFdyaXRlID0gdHJ1ZSkKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHRyYW5zKTsKKyAgICAgICAgJHRoaXMtPnN0cmljdFJlYWRfID0gJHN0cmljdFJlYWQ7CisgICAgICAgICR0aGlzLT5zdHJpY3RXcml0ZV8gPSAkc3RyaWN0V3JpdGU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5zdHJpY3RXcml0ZV8pIHsKKyAgICAgICAgICAgICR2ZXJzaW9uID0gc2VsZjo6VkVSU0lPTl8xIHwgJHR5cGU7CisKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUkzMigkdmVyc2lvbikgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZVN0cmluZygkbmFtZSkgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUkzMigkc2VxaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlU3RyaW5nKCRuYW1lKSArCisgICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkdHlwZSkgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUkzMigkc2VxaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKQorICAgIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVCeXRlKCRmaWVsZFR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZUkxNigkZmllbGRJZCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPndyaXRlQnl0ZShUVHlwZTo6U1RPUCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgka2V5VHlwZSkgKworICAgICAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkdmFsVHlwZSkgKworICAgICAgICAgICAgJHRoaXMtPndyaXRlSTMyKCRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGVsZW1UeXBlKSArCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkZWxlbVR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZUkzMigkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBwYWNrKCdjJywgJHZhbHVlID8gMSA6IDApOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgMSk7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9IHBhY2soJ2MnLCAkdmFsdWUpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgMSk7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gcGFjaygnbicsICR2YWx1ZSk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCAyKTsKKworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBwYWNrKCdOJywgJHZhbHVlKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDQpOworCisgICAgICAgIHJldHVybiA0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkdmFsdWUpCisgICAgeworICAgICAgICAvLyBJZiB3ZSBhcmUgb24gYSAzMmJpdCBhcmNoaXRlY3R1cmUgd2UgaGF2ZSB0byBleHBsaWNpdGx5IGRlYWwgd2l0aAorICAgICAgICAvLyA2NC1iaXQgdHdvcy1jb21wbGVtZW50IGFyaXRobWV0aWMgc2luY2UgUEhQIHdhbnRzIHRvIHRyZWF0IGFsbCBpbnRzCisgICAgICAgIC8vIGFzIHNpZ25lZCBhbmQgYW55IGludCBvdmVyIDJeMzEgLSAxIGFzIGEgZmxvYXQKKyAgICAgICAgaWYgKFBIUF9JTlRfU0laRSA9PSA0KSB7CisgICAgICAgICAgICAkbmVnID0gJHZhbHVlIDwgMDsKKworICAgICAgICAgICAgaWYgKCRuZWcpIHsKKyAgICAgICAgICAgICAgICAkdmFsdWUgKj0gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICRoaSA9IChpbnQpKCR2YWx1ZSAvIDQyOTQ5NjcyOTYpOworICAgICAgICAgICAgJGxvID0gKGludCkkdmFsdWU7CisKKyAgICAgICAgICAgIGlmICgkbmVnKSB7CisgICAgICAgICAgICAgICAgJGhpID0gfiRoaTsKKyAgICAgICAgICAgICAgICAkbG8gPSB+JGxvOworICAgICAgICAgICAgICAgIGlmICgoJGxvICYgKGludCkweGZmZmZmZmZmKSA9PSAoaW50KTB4ZmZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgJGxvID0gMDsKKyAgICAgICAgICAgICAgICAgICAgJGhpKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJGxvKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgJGRhdGEgPSBwYWNrKCdOMicsICRoaSwgJGxvKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRoaSA9ICR2YWx1ZSA+PiAzMjsKKyAgICAgICAgICAgICRsbyA9ICR2YWx1ZSAmIDB4RkZGRkZGRkY7CisgICAgICAgICAgICAkZGF0YSA9IHBhY2soJ04yJywgJGhpLCAkbG8pOworICAgICAgICB9CisKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDgpOworCisgICAgICAgIHJldHVybiA4OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSgkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9IHBhY2soJ2QnLCAkdmFsdWUpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzdHJyZXYoJGRhdGEpLCA4KTsKKworICAgICAgICByZXR1cm4gODsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGxlbiA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdmFsdWUpOworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPndyaXRlSTMyKCRsZW4pOworICAgICAgICBpZiAoJGxlbikgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJHZhbHVlLCAkbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZEkzMigkc3opOworICAgICAgICBpZiAoJHN6IDwgMCkgeworICAgICAgICAgICAgJHZlcnNpb24gPSAoaW50KSgkc3ogJiBzZWxmOjpWRVJTSU9OX01BU0spOworICAgICAgICAgICAgaWYgKCR2ZXJzaW9uICE9IChpbnQpc2VsZjo6VkVSU0lPTl8xKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaWRlbnRpZmllcjogJyAuICRzeiwgVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkdHlwZSA9ICRzeiAmIDB4MDAwMDAwZmY7CisgICAgICAgICAgICAkcmVzdWx0ICs9CisgICAgICAgICAgICAgICAgJHRoaXMtPnJlYWRTdHJpbmcoJG5hbWUpICsKKyAgICAgICAgICAgICAgICAkdGhpcy0+cmVhZEkzMigkc2VxaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCR0aGlzLT5zdHJpY3RSZWFkXykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICdObyB2ZXJzaW9uIGlkZW50aWZpZXIsIG9sZCBwcm90b2NvbCBjbGllbnQ/JywKKyAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTgorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBwcmUtdmVyc2lvbmVkIGlucHV0CisgICAgICAgICAgICAgICAgJG5hbWUgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKCRzeik7CisgICAgICAgICAgICAgICAgJHJlc3VsdCArPQorICAgICAgICAgICAgICAgICAgICAkc3ogKworICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cmVhZEJ5dGUoJHR5cGUpICsKKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNlcWlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCYkbmFtZSkKKyAgICB7CisgICAgICAgICRuYW1lID0gJyc7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCYkbmFtZSwgJiRmaWVsZFR5cGUsICYkZmllbGRJZCkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZEJ5dGUoJGZpZWxkVHlwZSk7CisgICAgICAgIGlmICgkZmllbGRUeXBlID09IFRUeXBlOjpTVE9QKSB7CisgICAgICAgICAgICAkZmllbGRJZCA9IDA7CisKKyAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgICAgICB9CisgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRJMTYoJGZpZWxkSWQpOworCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigmJGtleVR5cGUsICYkdmFsVHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAkdGhpcy0+cmVhZEJ5dGUoJGtleVR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkQnl0ZSgkdmFsVHlwZSkgKworICAgICAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPnJlYWRCeXRlKCRlbGVtVHlwZSkgKworICAgICAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPnJlYWRCeXRlKCRlbGVtVHlwZSkgKworICAgICAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDEpOworICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOworICAgICAgICAkdmFsdWUgPSAkYXJyWzFdID09IDE7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7CisgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICR2YWx1ZSA9ICRhcnJbMV07CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgyKTsKKyAgICAgICAgJGFyciA9IHVucGFjaygnbicsICRkYXRhKTsKKyAgICAgICAgJHZhbHVlID0gJGFyclsxXTsKKyAgICAgICAgaWYgKCR2YWx1ZSA+IDB4N2ZmZikgeworICAgICAgICAgICAgJHZhbHVlID0gMCAtICgoJHZhbHVlIC0gMSkgXiAweGZmZmYpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg0KTsKKyAgICAgICAgJGFyciA9IHVucGFjaygnTicsICRkYXRhKTsKKyAgICAgICAgJHZhbHVlID0gJGFyclsxXTsKKyAgICAgICAgaWYgKCR2YWx1ZSA+IDB4N2ZmZmZmZmYpIHsKKyAgICAgICAgICAgICR2YWx1ZSA9IDAgLSAoKCR2YWx1ZSAtIDEpIF4gMHhmZmZmZmZmZik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gNDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgmJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDgpOworCisgICAgICAgICRhcnIgPSB1bnBhY2soJ04yJywgJGRhdGEpOworCisgICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIDMyYml0IGFyY2hpdGVjdHVyZSB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgZGVhbCB3aXRoCisgICAgICAgIC8vIDY0LWJpdCB0d29zLWNvbXBsZW1lbnQgYXJpdGhtZXRpYyBzaW5jZSBQSFAgd2FudHMgdG8gdHJlYXQgYWxsIGludHMKKyAgICAgICAgLy8gYXMgc2lnbmVkIGFuZCBhbnkgaW50IG92ZXIgMl4zMSAtIDEgYXMgYSBmbG9hdAorICAgICAgICBpZiAoUEhQX0lOVF9TSVpFID09IDQpIHsKKyAgICAgICAgICAgICRoaSA9ICRhcnJbMV07CisgICAgICAgICAgICAkbG8gPSAkYXJyWzJdOworICAgICAgICAgICAgJGlzTmVnID0gJGhpIDwgMDsKKworICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGEgbmVnYXRpdmUKKyAgICAgICAgICAgIGlmICgkaXNOZWcpIHsKKyAgICAgICAgICAgICAgICAkaGkgPSB+JGhpICYgKGludCkweGZmZmZmZmZmOworICAgICAgICAgICAgICAgICRsbyA9IH4kbG8gJiAoaW50KTB4ZmZmZmZmZmY7CisKKyAgICAgICAgICAgICAgICBpZiAoJGxvID09IChpbnQpMHhmZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICAkaGkrKzsKKyAgICAgICAgICAgICAgICAgICAgJGxvID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkbG8rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZvcmNlIDMyYml0IHdvcmRzIGluIGV4Y2VzcyBvZiAyRyB0byBwZSBwb3NpdGl2ZSAtIHdlIGRlYWwgd2lnaCBzaWduCisgICAgICAgICAgICAvLyBleHBsaWNpdGx5IGJlbG93CisKKyAgICAgICAgICAgIGlmICgkaGkgJiAoaW50KTB4ODAwMDAwMDApIHsKKyAgICAgICAgICAgICAgICAkaGkgJj0gKGludCkweDdmZmZmZmZmOworICAgICAgICAgICAgICAgICRoaSArPSAweDgwMDAwMDAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoJGxvICYgKGludCkweDgwMDAwMDAwKSB7CisgICAgICAgICAgICAgICAgJGxvICY9IChpbnQpMHg3ZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAkbG8gKz0gMHg4MDAwMDAwMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJHZhbHVlID0gJGhpICogNDI5NDk2NzI5NiArICRsbzsKKworICAgICAgICAgICAgaWYgKCRpc05lZykgeworICAgICAgICAgICAgICAgICR2YWx1ZSA9IDAgLSAkdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBVcGNhc3QgbmVnYXRpdmVzIGluIExTQiBiaXQKKyAgICAgICAgICAgIGlmICgkYXJyWzJdICYgMHg4MDAwMDAwMCkgeworICAgICAgICAgICAgICAgICRhcnJbMl0gPSAkYXJyWzJdICYgMHhmZmZmZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGEgbmVnYXRpdmUKKyAgICAgICAgICAgIGlmICgkYXJyWzFdICYgMHg4MDAwMDAwMCkgeworICAgICAgICAgICAgICAgICRhcnJbMV0gPSAkYXJyWzFdICYgMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAkYXJyWzFdID0gJGFyclsxXSBeIDB4ZmZmZmZmZmY7CisgICAgICAgICAgICAgICAgJGFyclsyXSA9ICRhcnJbMl0gXiAweGZmZmZmZmZmOworICAgICAgICAgICAgICAgICR2YWx1ZSA9IDAgLSAkYXJyWzFdICogNDI5NDk2NzI5NiAtICRhcnJbMl0gLSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkdmFsdWUgPSAkYXJyWzFdICogNDI5NDk2NzI5NiArICRhcnJbMl07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gODsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBzdHJyZXYoJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg4KSk7CisgICAgICAgICRhcnIgPSB1bnBhY2soJ2QnLCAkZGF0YSk7CisgICAgICAgICR2YWx1ZSA9ICRhcnJbMV07CisKKyAgICAgICAgcmV0dXJuIDg7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZEkzMigkbGVuKTsKKyAgICAgICAgaWYgKCRsZW4pIHsKKyAgICAgICAgICAgICR2YWx1ZSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoJGxlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdmFsdWUgPSAnJzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY3OTlhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLnBocApAQCAtMCwwICsxLDY3IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOworCit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUQnVmZmVyZWRUcmFuc3BvcnQ7CisKKy8qKgorICogQWNjZWxlcmF0ZWQgYmluYXJ5IHByb3RvY29sOiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHRocmlmdF9wcm90b2NvbAorICogZXh0ZW5zaW9uIGZvciBmYXN0ZXIgZGVzZXJpYWxpemF0aW9uCisgKi8KK2NsYXNzIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGV4dGVuZHMgVEJpbmFyeVByb3RvY29sCit7CisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucywgJHN0cmljdFJlYWQgPSBmYWxzZSwgJHN0cmljdFdyaXRlID0gdHJ1ZSkKKyAgICB7CisgICAgICAgIC8vIElmIHRoZSB0cmFuc3BvcnQgZG9lc24ndCBpbXBsZW1lbnQgcHV0QmFjaywgd3JhcCBpdCBpbiBhCisgICAgICAgIC8vIFRCdWZmZXJlZFRyYW5zcG9ydCAod2hpY2ggZG9lcykKKworICAgICAgICAvLyBOT1RFICh0LmhlaW50eik6IFRoaXMgaXMgdmVyeSBldmlsIHRvIGRvLCBiZWNhdXNlIHRoZSBUQnVmZmVyZWRUcmFuc3BvcnQgbWF5IHN3YWxsb3cgYnl0ZXMsIHdoaWNoCisgICAgICAgIC8vIGFyZSB0aGVuIG5ldmVyIHdyaXR0ZW4gdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LiBUaGlzIGhhcHBlbnMgcHJlY2lzZWx5IHdoZW4gYSBudW1iZXIgb2YgYnl0ZXMKKyAgICAgICAgLy8gbGVzcyB0aGFuIHRoZSBtYXggYnVmZmVyIHNpemUgKDUxMiBieSBkZWZhdWx0KSBpcyB3cml0dGVuIHRvIHRoZSB0cmFuc3BvcnQgYW5kIHRoZW4gZmx1c2goKSBpcyBOT1QKKyAgICAgICAgLy8gY2FsbGVkLiBJbiB0aGF0IGNhc2UgdGhlIGRhdGEgc3RheXMgaW4gdGhlIHdyaXRlQnVmZmVyIG9mIHRoZSB0cmFuc3BvcnQsIGZyb20gd2hlcmUgaXQgY2FuIG5ldmVyIGJlCisgICAgICAgIC8vIGFjY2Vzc2VkIGFnYWluIChmb3IgZXhhbXBsZSB0aHJvdWdoIHJlYWQoKSkuCisgICAgICAgIC8vCisgICAgICAgIC8vIFNpbmNlIHRoZSBjYWxsZXIgb2YgdGhpcyBtZXRob2QgZG9lcyBub3Qga25vdyBhYm91dCB0aGUgd3JhcHBpbmcgdHJhbnNwb3J0LCB0aGlzIGNyZWF0ZXMgYnVncyB3aGljaAorICAgICAgICAvLyBhcmUgdmVyeSBkaWZmaWN1bHQgdG8gZmluZC4gSGVuY2UgdGhlIHdyYXBwaW5nIG9mIGEgdHJhbnNwb3J0IGluIGEgYnVmZmVyIHNob3VsZCBiZSBsZWZ0IHRvIHRoZQorICAgICAgICAvLyBjYWxsaW5nIGNvZGUuIEFuIGludGVyZmFjZSBjb3VsZCB1c2VkIHRvIG1hbmRhdGUgdGhlIHByZXNlbmNlIG9mIHRoZSBwdXRCYWNrKCkgbWV0aG9kIGluIHRoZSB0cmFuc3BvcnQuCisgICAgICAgIC8vCisgICAgICAgIC8vIEkgYW0gbGVhdmluZyB0aGlzIGNvZGUgaW4gbm9uZXRoZWxlc3MsIGJlY2F1c2UgdGhlcmUgbWF5IGJlIGFwcGxpY2F0aW9ucyBkZXBlbmRpbmcgb24gdGhpcyBiZWhhdmlvci4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQHNlZSBUSFJJRlQtMTU3OQorCisgICAgICAgIGlmICghbWV0aG9kX2V4aXN0cygkdHJhbnMsICdwdXRCYWNrJykpIHsKKyAgICAgICAgICAgICR0cmFucyA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoJHRyYW5zKTsKKyAgICAgICAgfQorICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucywgJHN0cmljdFJlYWQsICRzdHJpY3RXcml0ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGlzU3RyaWN0UmVhZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnN0cmljdFJlYWRfOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc1N0cmljdFdyaXRlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+c3RyaWN0V3JpdGVfOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmMmEyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucGhwCkBAIC0wLDAgKzEsNzM5IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOworCit1c2UgVGhyaWZ0XFR5cGVcVFR5cGU7Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIENvbXBhY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBwcm90b2NvbC4KKyAqCisgKi8KK2NsYXNzIFRDb21wYWN0UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wKK3sKKyAgICBjb25zdCBDT01QQUNUX1NUT1AgPSAweDAwOworICAgIGNvbnN0IENPTVBBQ1RfVFJVRSA9IDB4MDE7CisgICAgY29uc3QgQ09NUEFDVF9GQUxTRSA9IDB4MDI7CisgICAgY29uc3QgQ09NUEFDVF9CWVRFID0gMHgwMzsKKyAgICBjb25zdCBDT01QQUNUX0kxNiA9IDB4MDQ7CisgICAgY29uc3QgQ09NUEFDVF9JMzIgPSAweDA1OworICAgIGNvbnN0IENPTVBBQ1RfSTY0ID0gMHgwNjsKKyAgICBjb25zdCBDT01QQUNUX0RPVUJMRSA9IDB4MDc7CisgICAgY29uc3QgQ09NUEFDVF9CSU5BUlkgPSAweDA4OworICAgIGNvbnN0IENPTVBBQ1RfTElTVCA9IDB4MDk7CisgICAgY29uc3QgQ09NUEFDVF9TRVQgPSAweDBBOworICAgIGNvbnN0IENPTVBBQ1RfTUFQID0gMHgwQjsKKyAgICBjb25zdCBDT01QQUNUX1NUUlVDVCA9IDB4MEM7CisKKyAgICBjb25zdCBTVEFURV9DTEVBUiA9IDA7CisgICAgY29uc3QgU1RBVEVfRklFTERfV1JJVEUgPSAxOworICAgIGNvbnN0IFNUQVRFX1ZBTFVFX1dSSVRFID0gMjsKKyAgICBjb25zdCBTVEFURV9DT05UQUlORVJfV1JJVEUgPSAzOworICAgIGNvbnN0IFNUQVRFX0JPT0xfV1JJVEUgPSA0OworICAgIGNvbnN0IFNUQVRFX0ZJRUxEX1JFQUQgPSA1OworICAgIGNvbnN0IFNUQVRFX0NPTlRBSU5FUl9SRUFEID0gNjsKKyAgICBjb25zdCBTVEFURV9WQUxVRV9SRUFEID0gNzsKKyAgICBjb25zdCBTVEFURV9CT09MX1JFQUQgPSA4OworCisgICAgY29uc3QgVkVSU0lPTl9NQVNLID0gMHgxZjsKKyAgICBjb25zdCBWRVJTSU9OID0gMTsKKyAgICBjb25zdCBQUk9UT0NPTF9JRCA9IDB4ODI7CisgICAgY29uc3QgVFlQRV9NQVNLID0gMHhlMDsKKyAgICBjb25zdCBUWVBFX0JJVFMgPSAweDA3OworICAgIGNvbnN0IFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgJGN0eXBlcyA9IGFycmF5KAorICAgICAgICBUVHlwZTo6U1RPUCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NUT1AsCisgICAgICAgIFRUeXBlOjpCT09MID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfVFJVRSwgLy8gdXNlZCBmb3IgY29sbGVjdGlvbgorICAgICAgICBUVHlwZTo6QllURSA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0JZVEUsCisgICAgICAgIFRUeXBlOjpJMTYgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMTYsCisgICAgICAgIFRUeXBlOjpJMzIgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMzIsCisgICAgICAgIFRUeXBlOjpJNjQgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JNjQsCisgICAgICAgIFRUeXBlOjpET1VCTEUgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9ET1VCTEUsCisgICAgICAgIFRUeXBlOjpTVFJJTkcgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CSU5BUlksCisgICAgICAgIFRUeXBlOjpTVFJVQ1QgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TVFJVQ1QsCisgICAgICAgIFRUeXBlOjpMU1QgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9MSVNULAorICAgICAgICBUVHlwZTo6U0VUID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU0VULAorICAgICAgICBUVHlwZTo6TUFQID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfTUFQLAorICAgICk7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljICR0dHlwZXMgPSBhcnJheSgKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TVE9QID0+IFRUeXBlOjpTVE9QLAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1RSVUUgPT4gVFR5cGU6OkJPT0wsIC8vIHVzZWQgZm9yIGNvbGxlY3Rpb24KKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9GQUxTRSA9PiBUVHlwZTo6Qk9PTCwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CWVRFID0+IFRUeXBlOjpCWVRFLAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0kxNiA9PiBUVHlwZTo6STE2LAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0kzMiA9PiBUVHlwZTo6STMyLAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0k2NCA9PiBUVHlwZTo6STY0LAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0RPVUJMRSA9PiBUVHlwZTo6RE9VQkxFLAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0JJTkFSWSA9PiBUVHlwZTo6U1RSSU5HLAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NUUlVDVCA9PiBUVHlwZTo6U1RSVUNULAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0xJU1QgPT4gVFR5cGU6OkxTVCwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TRVQgPT4gVFR5cGU6OlNFVCwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9NQVAgPT4gVFR5cGU6Ok1BUCwKKyAgICApOworCisgICAgcHJvdGVjdGVkICRzdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NMRUFSOworICAgIHByb3RlY3RlZCAkbGFzdEZpZCA9IDA7CisgICAgcHJvdGVjdGVkICRib29sRmlkID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgJGJvb2xWYWx1ZSA9IG51bGw7CisgICAgcHJvdGVjdGVkICRzdHJ1Y3RzID0gYXJyYXkoKTsKKyAgICBwcm90ZWN0ZWQgJGNvbnRhaW5lcnMgPSBhcnJheSgpOworCisgICAgLy8gU29tZSB2YXJpbnQgLyB6aWd6YWcgaGVscGVyIG1ldGhvZHMKKyAgICBwdWJsaWMgZnVuY3Rpb24gdG9aaWdaYWcoJG4sICRiaXRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgkbiA8PCAxKSBeICgkbiA+PiAoJGJpdHMgLSAxKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGZyb21aaWdaYWcoJG4pCisgICAgeworICAgICAgICByZXR1cm4gKCRuID4+IDEpIF4gLSgkbiAmIDEpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRWYXJpbnQoJGRhdGEpCisgICAgeworICAgICAgICAkb3V0ID0gIiI7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpZiAoKCRkYXRhICYgfjB4N2YpID09PSAwKSB7CisgICAgICAgICAgICAgICAgJG91dCAuPSBjaHIoJGRhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkb3V0IC49IGNocigoJGRhdGEgJiAweGZmKSB8IDB4ODApOworICAgICAgICAgICAgICAgICRkYXRhID0gJGRhdGEgPj4gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkb3V0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVZhcmludCgkZGF0YSkKKyAgICB7CisgICAgICAgICRvdXQgPSAkdGhpcy0+Z2V0VmFyaW50KCRkYXRhKTsKKyAgICAgICAgJHJlc3VsdCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkb3V0KTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJG91dCwgJHJlc3VsdCk7CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRWYXJpbnQoJiRyZXN1bHQpCisgICAgeworICAgICAgICAkaWR4ID0gMDsKKyAgICAgICAgJHNoaWZ0ID0gMDsKKyAgICAgICAgJHJlc3VsdCA9IDA7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAkeCA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7CisgICAgICAgICAgICAkYXJyID0gdW5wYWNrKCdDJywgJHgpOworICAgICAgICAgICAgJGJ5dGUgPSAkYXJyWzFdOworICAgICAgICAgICAgJGlkeCArPSAxOworICAgICAgICAgICAgJHJlc3VsdCB8PSAoJGJ5dGUgJiAweDdmKSA8PCAkc2hpZnQ7CisgICAgICAgICAgICBpZiAoKCRieXRlID4+IDcpID09PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICRpZHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkc2hpZnQgKz0gNzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkaWR4OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMpCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKQorICAgIHsKKyAgICAgICAgJHdyaXR0ZW4gPQorICAgICAgICAgICAgJHRoaXMtPndyaXRlVUJ5dGUoVENvbXBhY3RQcm90b2NvbDo6UFJPVE9DT0xfSUQpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZVVCeXRlKFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT04gfAorICAgICAgICAgICAgICAgICgkdHlwZSA8PCBUQ29tcGFjdFByb3RvY29sOjpUWVBFX1NISUZUX0FNT1VOVCkpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZVZhcmludCgkc2VxaWQpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZVN0cmluZygkbmFtZSk7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX1ZBTFVFX1dSSVRFOworCisgICAgICAgIHJldHVybiAkd3JpdHRlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NMRUFSOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnN0cnVjdHNbXSA9IGFycmF5KCR0aGlzLT5zdGF0ZSwgJHRoaXMtPmxhc3RGaWQpOworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9GSUVMRF9XUklURTsKKyAgICAgICAgJHRoaXMtPmxhc3RGaWQgPSAwOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpCisgICAgeworICAgICAgICAkb2xkX3ZhbHVlcyA9IGFycmF5X3BvcCgkdGhpcy0+c3RydWN0cyk7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9ICRvbGRfdmFsdWVzWzBdOworICAgICAgICAkdGhpcy0+bGFzdEZpZCA9ICRvbGRfdmFsdWVzWzFdOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlQnl0ZSgwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEhlYWRlcigkdHlwZSwgJGZpZCkKKyAgICB7CisgICAgICAgICR3cml0dGVuID0gMDsKKyAgICAgICAgJGRlbHRhID0gJGZpZCAtICR0aGlzLT5sYXN0RmlkOworICAgICAgICBpZiAoMCA8ICRkZWx0YSAmJiAkZGVsdGEgPD0gMTUpIHsKKyAgICAgICAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlVUJ5dGUoKCRkZWx0YSA8PCA0KSB8ICR0eXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlQnl0ZSgkdHlwZSkgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUkxNigkZmlkKTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+bGFzdEZpZCA9ICRmaWQ7CisKKyAgICAgICAgcmV0dXJuICR3cml0dGVuOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkX25hbWUsICRmaWVsZF90eXBlLCAkZmllbGRfaWQpCisgICAgeworICAgICAgICBpZiAoJGZpZWxkX3R5cGUgPT0gVFRZUEU6OkJPT0wpIHsKKyAgICAgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0JPT0xfV1JJVEU7CisgICAgICAgICAgICAkdGhpcy0+Ym9vbEZpZCA9ICRmaWVsZF9pZDsKKworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9WQUxVRV9XUklURTsKKworICAgICAgICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUZpZWxkSGVhZGVyKHNlbGY6OiRjdHlwZXNbJGZpZWxkX3R5cGVdLCAkZmllbGRfaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfRklFTERfV1JJVEU7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQ29sbGVjdGlvbkJlZ2luKCRldHlwZSwgJHNpemUpCisgICAgeworICAgICAgICAkd3JpdHRlbiA9IDA7CisgICAgICAgIGlmICgkc2l6ZSA8PSAxNCkgeworICAgICAgICAgICAgJHdyaXR0ZW4gPSAkdGhpcy0+d3JpdGVVQnl0ZSgkc2l6ZSA8PCA0IHwKKyAgICAgICAgICAgICAgICBzZWxmOjokY3R5cGVzWyRldHlwZV0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHdyaXR0ZW4gPSAkdGhpcy0+d3JpdGVVQnl0ZSgweGYwIHwKKyAgICAgICAgICAgICAgICAgICAgc2VsZjo6JGN0eXBlc1skZXR5cGVdKSArCisgICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlVmFyaW50KCRzaXplKTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+Y29udGFpbmVyc1tdID0gJHRoaXMtPnN0YXRlOworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfV1JJVEU7CisKKyAgICAgICAgcmV0dXJuICR3cml0dGVuOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKCRrZXlfdHlwZSwgJHZhbF90eXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgICR3cml0dGVuID0gMDsKKyAgICAgICAgaWYgKCRzaXplID09IDApIHsKKyAgICAgICAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlQnl0ZSgwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlVmFyaW50KCRzaXplKSArCisgICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlVUJ5dGUoc2VsZjo6JGN0eXBlc1ska2V5X3R5cGVdIDw8IDQgfAorICAgICAgICAgICAgICAgICAgICBzZWxmOjokY3R5cGVzWyR2YWxfdHlwZV0pOworICAgICAgICB9CisgICAgICAgICR0aGlzLT5jb250YWluZXJzW10gPSAkdGhpcy0+c3RhdGU7CisKKyAgICAgICAgcmV0dXJuICR3cml0dGVuOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25FbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gYXJyYXlfcG9wKCR0aGlzLT5jb250YWluZXJzKTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUNvbGxlY3Rpb25FbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oJGVsZW1fdHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlQ29sbGVjdGlvbkJlZ2luKCRlbGVtX3R5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1fdHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlQ29sbGVjdGlvbkJlZ2luKCRlbGVtX3R5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUNvbGxlY3Rpb25FbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKCR2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+c3RhdGUgPT0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQk9PTF9XUklURSkgeworICAgICAgICAgICAgJGN0eXBlID0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9GQUxTRTsKKyAgICAgICAgICAgIGlmICgkdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAkY3R5cGUgPSBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1RSVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVGaWVsZEhlYWRlcigkY3R5cGUsICR0aGlzLT5ib29sRmlkKTsKKyAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5zdGF0ZSA9PSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfV1JJVEUpIHsKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVCeXRlKCR2YWx1ZSA/IDEgOiAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0ludmFsaWQgc3RhdGUgaW4gY29tcGFjdCBwcm90b2NvbCcpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9IHBhY2soJ2MnLCAkdmFsdWUpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgMSk7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlVUJ5dGUoJGJ5dGUpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShwYWNrKCdDJywgJGJ5dGUpLCAxKTsKKworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJHRoaW5nID0gJHRoaXMtPnRvWmlnWmFnKCR2YWx1ZSwgMTYpOworCisgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVWYXJpbnQoJHRoaW5nKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJHRoaW5nID0gJHRoaXMtPnRvWmlnWmFnKCR2YWx1ZSwgMzIpOworCisgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVWYXJpbnQoJHRoaW5nKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBwYWNrKCdkJywgJHZhbHVlKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDgpOworCisgICAgICAgIHJldHVybiA4OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkdmFsdWUpCisgICAgeworICAgICAgICAkbGVuID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR2YWx1ZSk7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+d3JpdGVWYXJpbnQoJGxlbik7CisgICAgICAgIGlmICgkbGVuKSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkdmFsdWUsICRsZW4pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQgKyAkbGVuOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRfdHlwZSwgJiRmaWVsZF9pZCkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFVCeXRlKCRjb21wYWN0X3R5cGVfYW5kX2RlbHRhKTsKKworICAgICAgICAkY29tcGFjdF90eXBlID0gJGNvbXBhY3RfdHlwZV9hbmRfZGVsdGEgJiAweDBmOworCisgICAgICAgIGlmICgkY29tcGFjdF90eXBlID09IFRUeXBlOjpTVE9QKSB7CisgICAgICAgICAgICAkZmllbGRfdHlwZSA9ICRjb21wYWN0X3R5cGU7CisgICAgICAgICAgICAkZmllbGRfaWQgPSAwOworCisgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICAkZGVsdGEgPSAkY29tcGFjdF90eXBlX2FuZF9kZWx0YSA+PiA0OworICAgICAgICBpZiAoJGRlbHRhID09IDApIHsKKyAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRJMTYoJGZpZWxkX2lkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRmaWVsZF9pZCA9ICR0aGlzLT5sYXN0RmlkICsgJGRlbHRhOworICAgICAgICB9CisgICAgICAgICR0aGlzLT5sYXN0RmlkID0gJGZpZWxkX2lkOworICAgICAgICAkZmllbGRfdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkY29tcGFjdF90eXBlKTsKKworICAgICAgICBpZiAoJGNvbXBhY3RfdHlwZSA9PSBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1RSVUUpIHsKKyAgICAgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0JPT0xfUkVBRDsKKyAgICAgICAgICAgICR0aGlzLT5ib29sVmFsdWUgPSB0cnVlOworICAgICAgICB9IGVsc2VpZiAoJGNvbXBhY3RfdHlwZSA9PSBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0ZBTFNFKSB7CisgICAgICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1JFQUQ7CisgICAgICAgICAgICAkdGhpcy0+Ym9vbFZhbHVlID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9WQUxVRV9SRUFEOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9GSUVMRF9SRUFEOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkVUJ5dGUoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKKyAgICAgICAgJGFyciA9IHVucGFjaygnQycsICRkYXRhKTsKKyAgICAgICAgJHZhbHVlID0gJGFyclsxXTsKKworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKKyAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKKyAgICAgICAgJHZhbHVlID0gJGFyclsxXTsKKworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFppZ1phZygmJHZhbHVlKQorICAgIHsKKyAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVmFyaW50KCR2YWx1ZSk7CisgICAgICAgICR2YWx1ZSA9ICR0aGlzLT5mcm9tWmlnWmFnKCR2YWx1ZSk7CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCisgICAgeworICAgICAgICAkcHJvdG9JZCA9IDA7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFVCeXRlKCRwcm90b0lkKTsKKyAgICAgICAgaWYgKCRwcm90b0lkICE9IFRDb21wYWN0UHJvdG9jb2w6OlBST1RPQ09MX0lEKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdCYWQgcHJvdG9jb2wgaWQgaW4gVENvbXBhY3QgbWVzc2FnZScpOworICAgICAgICB9CisgICAgICAgICR2ZXJUeXBlID0gMDsKKyAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFVCeXRlKCR2ZXJUeXBlKTsKKyAgICAgICAgJHR5cGUgPSAoJHZlclR5cGUgPj4gVENvbXBhY3RQcm90b2NvbDo6VFlQRV9TSElGVF9BTU9VTlQpICYgVENvbXBhY3RQcm90b2NvbDo6VFlQRV9CSVRTOworICAgICAgICAkdmVyc2lvbiA9ICR2ZXJUeXBlICYgVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTl9NQVNLOworICAgICAgICBpZiAoJHZlcnNpb24gIT0gVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaW4gVENvbXBhY3QgbWVzc2FnZScpOworICAgICAgICB9CisgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRWYXJpbnQoJHNlcWlkKTsKKyAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFN0cmluZygkbmFtZSk7CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKQorICAgIHsKKyAgICAgICAgJG5hbWUgPSAnJzsgLy8gdW51c2VkCisgICAgICAgICR0aGlzLT5zdHJ1Y3RzW10gPSBhcnJheSgkdGhpcy0+c3RhdGUsICR0aGlzLT5sYXN0RmlkKTsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfRklFTERfUkVBRDsKKyAgICAgICAgJHRoaXMtPmxhc3RGaWQgPSAwOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkKKyAgICB7CisgICAgICAgICRsYXN0ID0gYXJyYXlfcG9wKCR0aGlzLT5zdHJ1Y3RzKTsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gJGxhc3RbMF07CisgICAgICAgICR0aGlzLT5sYXN0RmlkID0gJGxhc3RbMV07CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRDb2xsZWN0aW9uQmVnaW4oJiR0eXBlLCAmJHNpemUpCisgICAgeworICAgICAgICAkc2l6ZVR5cGUgPSAwOworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRVQnl0ZSgkc2l6ZVR5cGUpOworICAgICAgICAkc2l6ZSA9ICRzaXplVHlwZSA+PiA0OworICAgICAgICAkdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkc2l6ZVR5cGUpOworICAgICAgICBpZiAoJHNpemUgPT0gMTUpIHsKKyAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRWYXJpbnQoJHNpemUpOworICAgICAgICB9CisgICAgICAgICR0aGlzLT5jb250YWluZXJzW10gPSAkdGhpcy0+c3RhdGU7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NPTlRBSU5FUl9SRUFEOworCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlfdHlwZSwgJiR2YWxfdHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVmFyaW50KCRzaXplKTsKKyAgICAgICAgJHR5cGVzID0gMDsKKyAgICAgICAgaWYgKCRzaXplID4gMCkgeworICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFVCeXRlKCR0eXBlcyk7CisgICAgICAgIH0KKyAgICAgICAgJHZhbF90eXBlID0gJHRoaXMtPmdldFRUeXBlKCR0eXBlcyk7CisgICAgICAgICRrZXlfdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkdHlwZXMgPj4gNCk7CisgICAgICAgICR0aGlzLT5jb250YWluZXJzW10gPSAkdGhpcy0+c3RhdGU7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NPTlRBSU5FUl9SRUFEOworCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQ29sbGVjdGlvbkVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+c3RhdGUgPSBhcnJheV9wb3AoJHRoaXMtPmNvbnRhaW5lcnMpOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZENvbGxlY3Rpb25FbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1fdHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQ29sbGVjdGlvbkJlZ2luKCRlbGVtX3R5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQ29sbGVjdGlvbkVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtX3R5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZENvbGxlY3Rpb25CZWdpbigkZWxlbV90eXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQ29sbGVjdGlvbkVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5zdGF0ZSA9PSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1JFQUQpIHsKKyAgICAgICAgICAgICR2YWx1ZSA9ICR0aGlzLT5ib29sVmFsdWU7CisKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2VpZiAoJHRoaXMtPnN0YXRlID09IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NPTlRBSU5FUl9SRUFEKSB7CisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRCeXRlKCR2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdJbnZhbGlkIHN0YXRlIGluIGNvbXBhY3QgcHJvdG9jb2wnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRaaWdaYWcoJHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkWmlnWmFnKCR2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg4KTsKKyAgICAgICAgJGFyciA9IHVucGFjaygnZCcsICRkYXRhKTsKKyAgICAgICAgJHZhbHVlID0gJGFyclsxXTsKKworICAgICAgICByZXR1cm4gODsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygmJHZhbHVlKQorICAgIHsKKyAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVmFyaW50KCRsZW4pOworICAgICAgICBpZiAoJGxlbikgeworICAgICAgICAgICAgJHZhbHVlID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgkbGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR2YWx1ZSA9ICcnOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQgKyAkbGVuOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUVHlwZSgkYnl0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBzZWxmOjokdHR5cGVzWyRieXRlICYgMHgwZl07CisgICAgfQorCisgICAgLy8gSWYgd2UgYXJlIG9uIGEgMzJiaXQgYXJjaGl0ZWN0dXJlIHdlIGhhdmUgdG8gZXhwbGljaXRseSBkZWFsIHdpdGgKKyAgICAvLyA2NC1iaXQgdHdvcy1jb21wbGVtZW50IGFyaXRobWV0aWMgc2luY2UgUEhQIHdhbnRzIHRvIHRyZWF0IGFsbCBpbnRzCisgICAgLy8gYXMgc2lnbmVkIGFuZCBhbnkgaW50IG92ZXIgMl4zMSAtIDEgYXMgYSBmbG9hdAorCisgICAgLy8gUmVhZCBhbmQgd3JpdGUgSTY0IGFzIHR3byAzMiBiaXQgbnVtYmVycyAkaGkgYW5kICRsbworCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgIC8vIFJlYWQgdmFyaW50IGZyb20gd2lyZQorICAgICAgICAkaGkgPSAwOworICAgICAgICAkbG8gPSAwOworCisgICAgICAgICRpZHggPSAwOworICAgICAgICAkc2hpZnQgPSAwOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAkeCA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7CisgICAgICAgICAgICAkYXJyID0gdW5wYWNrKCdDJywgJHgpOworICAgICAgICAgICAgJGJ5dGUgPSAkYXJyWzFdOworICAgICAgICAgICAgJGlkeCArPSAxOworICAgICAgICAgICAgLy8gU2hpZnQgaGkgYW5kIGxvIHRvZ2V0aGVyLgorICAgICAgICAgICAgaWYgKCRzaGlmdCA8IDI4KSB7CisgICAgICAgICAgICAgICAgJGxvIHw9ICgoJGJ5dGUgJiAweDdmKSA8PCAkc2hpZnQpOworICAgICAgICAgICAgfSBlbHNlaWYgKCRzaGlmdCA9PSAyOCkgeworICAgICAgICAgICAgICAgICRsbyB8PSAoKCRieXRlICYgMHgwZikgPDwgMjgpOworICAgICAgICAgICAgICAgICRoaSB8PSAoKCRieXRlICYgMHg3MCkgPj4gNCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRoaSB8PSAoKCRieXRlICYgMHg3ZikgPDwgKCRzaGlmdCAtIDMyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKCRieXRlID4+IDcpID09PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkc2hpZnQgKz0gNzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdywgdW56aWcgaXQuCisgICAgICAgICR4b3JlciA9IDA7CisgICAgICAgIGlmICgkbG8gJiAxKSB7CisgICAgICAgICAgICAkeG9yZXIgPSAweGZmZmZmZmZmOworICAgICAgICB9CisgICAgICAgICRsbyA9ICgkbG8gPj4gMSkgJiAweDdmZmZmZmZmOworICAgICAgICAkbG8gPSAkbG8gfCAoKCRoaSAmIDEpIDw8IDMxKTsKKyAgICAgICAgJGhpID0gKCRoaSA+PiAxKSBeICR4b3JlcjsKKyAgICAgICAgJGxvID0gJGxvIF4gJHhvcmVyOworCisgICAgICAgIC8vIE5vdyBwdXQgJGhpIGFuZCAkbG8gYmFjayB0b2dldGhlcgorICAgICAgICAkaXNOZWcgPSAkaGkgPCAwIHx8ICRoaSAmIDB4ODAwMDAwMDA7CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGEgbmVnYXRpdmUKKyAgICAgICAgaWYgKCRpc05lZykgeworICAgICAgICAgICAgJGhpID0gfiRoaSAmIChpbnQpMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICRsbyA9IH4kbG8gJiAoaW50KTB4ZmZmZmZmZmY7CisKKyAgICAgICAgICAgIGlmICgkbG8gPT0gKGludCkweGZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgJGhpKys7CisgICAgICAgICAgICAgICAgJGxvID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJGxvKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBGb3JjZSAzMmJpdCB3b3JkcyBpbiBleGNlc3Mgb2YgMkcgdG8gYmUgcG9zaXRpdmUgLSB3ZSBkZWFsIHdpdGggc2lnbgorICAgICAgICAvLyBleHBsaWNpdGx5IGJlbG93CisKKyAgICAgICAgaWYgKCRoaSAmIChpbnQpMHg4MDAwMDAwMCkgeworICAgICAgICAgICAgJGhpICY9IChpbnQpMHg3ZmZmZmZmZjsKKyAgICAgICAgICAgICRoaSArPSAweDgwMDAwMDAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCRsbyAmIChpbnQpMHg4MDAwMDAwMCkgeworICAgICAgICAgICAgJGxvICY9IChpbnQpMHg3ZmZmZmZmZjsKKyAgICAgICAgICAgICRsbyArPSAweDgwMDAwMDAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGFzIG5lZ2F0aXZlIHZhbHVlIGZpcnN0LCBzaW5jZSB3ZSBjYW4gc3RvcmUgLTJeNjMgYnV0IG5vdCAyXjYzCisgICAgICAgICR2YWx1ZSA9IC0kaGkgKiA0Mjk0OTY3Mjk2IC0gJGxvOworCisgICAgICAgIGlmICghJGlzTmVnKSB7CisgICAgICAgICAgICAkdmFsdWUgPSAtJHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRpZHg7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KCR2YWx1ZSkKKyAgICB7CisgICAgICAgIC8vIElmIHdlIGFyZSBpbiBhbiBJMzIgcmFuZ2UsIHVzZSB0aGUgZWFzeSBtZXRob2QgYmVsb3cuCisgICAgICAgIGlmICgoJHZhbHVlID4gNDI5NDk2NzI5NikgfHwgKCR2YWx1ZSA8IC00Mjk0OTY3Mjk2KSkgeworICAgICAgICAgICAgLy8gQ29udmVydCAkdmFsdWUgdG8gJGhpIGFuZCAkbG8KKyAgICAgICAgICAgICRuZWcgPSAkdmFsdWUgPCAwOworCisgICAgICAgICAgICBpZiAoJG5lZykgeworICAgICAgICAgICAgICAgICR2YWx1ZSAqPSAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJGhpID0gKGludCkkdmFsdWUgPj4gMzI7CisgICAgICAgICAgICAkbG8gPSAoaW50KSR2YWx1ZSAmIDB4ZmZmZmZmZmY7CisKKyAgICAgICAgICAgIGlmICgkbmVnKSB7CisgICAgICAgICAgICAgICAgJGhpID0gfiRoaTsKKyAgICAgICAgICAgICAgICAkbG8gPSB+JGxvOworICAgICAgICAgICAgICAgIGlmICgoJGxvICYgKGludCkweGZmZmZmZmZmKSA9PSAoaW50KTB4ZmZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgJGxvID0gMDsKKyAgICAgICAgICAgICAgICAgICAgJGhpKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJGxvKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBOb3cgZG8gdGhlIHppZ2dpbmcgYW5kIHphZ2dpbmcuCisgICAgICAgICAgICAkeG9yZXIgPSAwOworICAgICAgICAgICAgaWYgKCRuZWcpIHsKKyAgICAgICAgICAgICAgICAkeG9yZXIgPSAweGZmZmZmZmZmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJGxvd2JpdCA9ICgkbG8gPj4gMzEpICYgMTsKKyAgICAgICAgICAgICRoaSA9ICgkaGkgPDwgMSkgfCAkbG93Yml0OworICAgICAgICAgICAgJGxvID0gKCRsbyA8PCAxKTsKKyAgICAgICAgICAgICRsbyA9ICgkbG8gXiAkeG9yZXIpICYgMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICRoaSA9ICgkaGkgXiAkeG9yZXIpICYgMHhmZmZmZmZmZjsKKworICAgICAgICAgICAgLy8gbm93IHdyaXRlIG91dCB0aGUgdmFyaW50LCBlbnN1cmluZyB3ZSBzaGlmdCBib3RoIGhpIGFuZCBsbworICAgICAgICAgICAgJG91dCA9ICIiOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoKCRsbyAmIH4weDdmKSA9PT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAkaGkgPT09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgJG91dCAuPSBjaHIoJGxvKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJG91dCAuPSBjaHIoKCRsbyAmIDB4ZmYpIHwgMHg4MCk7CisgICAgICAgICAgICAgICAgICAgICRsbyA9ICRsbyA+PiA3OworICAgICAgICAgICAgICAgICAgICAkbG8gPSAkbG8gfCAoJGhpIDw8IDI1KTsKKyAgICAgICAgICAgICAgICAgICAgJGhpID0gJGhpID4+IDc7CisgICAgICAgICAgICAgICAgICAgIC8vIFJpZ2h0IHNoaWZ0IGNhcnJpZXMgc2lnbiwgYnV0IHdlIGRvbid0IHdhbnQgaXQgdG8uCisgICAgICAgICAgICAgICAgICAgICRoaSA9ICRoaSAmICgxMjcgPDwgMjUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJHJldCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkb3V0KTsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRvdXQsICRyZXQpOworCisgICAgICAgICAgICByZXR1cm4gJHJldDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVWYXJpbnQoJHRoaXMtPnRvWmlnWmFnKCR2YWx1ZSwgNjQpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1RKU09OUHJvdG9jb2wucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE0NDg4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RKU09OUHJvdG9jb2wucGhwCkBAIC0wLDAgKzEsODE1IEBACis8P3BocAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBUaHJpZnRcVHlwZVxUVHlwZTsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRQcm90b2NvbEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcSlNPTlxCYXNlQ29udGV4dDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcSlNPTlxMb29rYWhlYWRSZWFkZXI7Cit1c2UgVGhyaWZ0XFByb3RvY29sXEpTT05cUGFpckNvbnRleHQ7Cit1c2UgVGhyaWZ0XFByb3RvY29sXEpTT05cTGlzdENvbnRleHQ7CisKKy8qKgorICogSlNPTiBpbXBsZW1lbnRhdGlvbiBvZiB0aHJpZnQgcHJvdG9jb2wsIHBvcnRlZCBmcm9tIEphdmEuCisgKi8KK2NsYXNzIFRKU09OUHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wKK3sKKyAgICBjb25zdCBDT01NQSA9ICcsJzsKKyAgICBjb25zdCBDT0xPTiA9ICc6JzsKKyAgICBjb25zdCBMQlJBQ0UgPSAneyc7CisgICAgY29uc3QgUkJSQUNFID0gJ30nOworICAgIGNvbnN0IExCUkFDS0VUID0gJ1snOworICAgIGNvbnN0IFJCUkFDS0VUID0gJ10nOworICAgIGNvbnN0IFFVT1RFID0gJyInOworICAgIGNvbnN0IEJBQ0tTTEFTSCA9ICdcXCc7CisgICAgY29uc3QgWkVSTyA9ICcwJzsKKyAgICBjb25zdCBFU0NTRVEgPSAnXFwnOworICAgIGNvbnN0IERPVUJMRUVTQyA9ICdfX0RPVUJMRV9FU0NBUEVfU0VRVUVOQ0VfXyc7CisKKyAgICBjb25zdCBWRVJTSU9OID0gMTsKKworICAgIHB1YmxpYyBzdGF0aWMgJEpTT05fQ0hBUl9UQUJMRSA9IGFycmF5KAorICAgICAgICAvKiAgMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAgIEEgICBCICAgQyAgIEQgICBFICAgRiAqLworICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAnYicsICd0JywgJ24nLCAwLCAnZicsICdyJywgMCwgMCwgLy8gMAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAxCisgICAgICAgIDEsIDEsICciJywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gMgorICAgICk7CisKKyAgICBwdWJsaWMgc3RhdGljICRFU0NBUEVfQ0hBUlMgPSBhcnJheSgnIicsICdcXCcsICcvJywgImIiLCAiZiIsICJuIiwgInIiLCAidCIpOworCisgICAgcHVibGljIHN0YXRpYyAkRVNDQVBFX0NIQVJfVkFMUyA9IGFycmF5KAorICAgICAgICAnIicsICdcXCcsICcvJywgIlx4MDgiLCAiXGYiLCAiXG4iLCAiXHIiLCAiXHQiLAorICAgICk7CisKKyAgICBjb25zdCBOQU1FX0JPT0wgPSAidGYiOworICAgIGNvbnN0IE5BTUVfQllURSA9ICJpOCI7CisgICAgY29uc3QgTkFNRV9JMTYgPSAiaTE2IjsKKyAgICBjb25zdCBOQU1FX0kzMiA9ICJpMzIiOworICAgIGNvbnN0IE5BTUVfSTY0ID0gImk2NCI7CisgICAgY29uc3QgTkFNRV9ET1VCTEUgPSAiZGJsIjsKKyAgICBjb25zdCBOQU1FX1NUUlVDVCA9ICJyZWMiOworICAgIGNvbnN0IE5BTUVfU1RSSU5HID0gInN0ciI7CisgICAgY29uc3QgTkFNRV9NQVAgPSAibWFwIjsKKyAgICBjb25zdCBOQU1FX0xJU1QgPSAibHN0IjsKKyAgICBjb25zdCBOQU1FX1NFVCA9ICJzZXQiOworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRUeXBlTmFtZUZvclR5cGVJRCgkdHlwZUlEKQorICAgIHsKKyAgICAgICAgc3dpdGNoICgkdHlwZUlEKSB7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpCT09MOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0JPT0w7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpCWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0JZVEU7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJMTY6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfSTE2OworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STMyOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0kzMjsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6Okk2NDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9JNjQ7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpET1VCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfRE9VQkxFOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX1NUUklORzsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9TVFJVQ1Q7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfTUFQOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX1NFVDsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9MSVNUOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgdHlwZSIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGdldFR5cGVJREZvclR5cGVOYW1lKCRuYW1lKQorICAgIHsKKyAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpTVE9QOworCisgICAgICAgIGlmIChzdHJsZW4oJG5hbWUpID4gMSkgeworICAgICAgICAgICAgc3dpdGNoIChzdWJzdHIoJG5hbWUsIDAsIDEpKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6RE9VQkxFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJzdHIoJG5hbWUsIDEsIDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc4JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkJZVEU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcxJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkkxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzMnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6STMyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnNic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpJNjQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnbCc6CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6TFNUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpNQVA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3InOgorICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OlNUUlVDVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICAgICAgICAgIGlmIChzdWJzdHIoJG5hbWUsIDEsIDEpID09ICd0JykgeworICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpTVFJJTkc7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmIChzdWJzdHIoJG5hbWUsIDEsIDEpID09ICdlJykgeworICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpTRVQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6Qk9PTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCRyZXN1bHQgPT0gVFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIlVucmVjb2duaXplZCB0eXBlIiwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljICRjb250ZXh0U3RhY2tfID0gYXJyYXkoKTsKKyAgICBwdWJsaWMgJGNvbnRleHRfOworICAgIHB1YmxpYyAkcmVhZGVyXzsKKworICAgIHByaXZhdGUgZnVuY3Rpb24gcHVzaENvbnRleHQoJGMpCisgICAgeworICAgICAgICBhcnJheV9wdXNoKCR0aGlzLT5jb250ZXh0U3RhY2tfLCAkdGhpcy0+Y29udGV4dF8pOworICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSAkYzsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHBvcENvbnRleHQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gYXJyYXlfcG9wKCR0aGlzLT5jb250ZXh0U3RhY2tfKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdHJhbnMpOworICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSBuZXcgQmFzZUNvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnJlYWRlcl8gPSBuZXcgTG9va2FoZWFkUmVhZGVyKCR0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRTdGFja18gPSBhcnJheSgpOworICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSBuZXcgQmFzZUNvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnJlYWRlcl8gPSBuZXcgTG9va2FoZWFkUmVhZGVyKCR0aGlzKTsKKyAgICB9CisKKyAgICBwcml2YXRlICR0bXBidWZfID0gYXJyYXkoNCk7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEpTT05TeW50YXhDaGFyKCRiKQorICAgIHsKKyAgICAgICAgJGNoID0gJHRoaXMtPnJlYWRlcl8tPnJlYWQoKTsKKworICAgICAgICBpZiAoc3Vic3RyKCRjaCwgMCwgMSkgIT0gJGIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIlVuZXhwZWN0ZWQgY2hhcmFjdGVyOiAiIC4gJGNoLCBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGhleFZhbCgkcykKKyAgICB7CisgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IHN0cmxlbigkcyk7ICRpKyspIHsKKyAgICAgICAgICAgICRjaCA9IHN1YnN0cigkcywgJGksIDEpOworCisgICAgICAgICAgICBpZiAoISgkY2ggPj0gImEiICYmICRjaCA8PSAiZiIpICYmICEoJGNoID49ICIwIiAmJiAkY2ggPD0gIjkiKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkV4cGVjdGVkIGhleCBjaGFyYWN0ZXIgIiAuICRjaCwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGhleGRlYygkcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBoZXhDaGFyKCR2YWwpCisgICAgeworICAgICAgICByZXR1cm4gZGVjaGV4KCR2YWwpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gaGFzSlNPTlVuZXNjYXBlZFVuaWNvZGUoKQorICAgIHsKKyAgICAgICAgaWYgKFBIUF9NQUpPUl9WRVJTSU9OID4gNSB8fCAoUEhQX01BSk9SX1ZFUlNJT04gPT0gNSAmJiBQSFBfTUlOT1JfVkVSU0lPTiA+PSA0KSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB1bmVzY2FwZWRVbmljb2RlKCRzdHIpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmhhc0pTT05VbmVzY2FwZWRVbmljb2RlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBqc29uX2VuY29kZSgkc3RyLCBKU09OX1VORVNDQVBFRF9VTklDT0RFKTsKKyAgICAgICAgfQorCisgICAgICAgICRqc29uID0ganNvbl9lbmNvZGUoJHN0cik7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVW5lc2NhcGVkIGNoYXJhY3RlciBvdXRzaWRlIHRoZSBCYXNpYyBNdWx0aWxpbmd1YWwgUGxhbmUKKyAgICAgICAgICogSGlnaCBzdXJyb2dhdGU6IDB4RDgwMCAtIDB4REJGRgorICAgICAgICAgKiBMb3cgc3Vycm9nYXRlOiAweERDMDAgLSAweERGRkYKKyAgICAgICAgICovCisgICAgICAgICRqc29uID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKAorICAgICAgICAgICAgJy9cXFxcdShkWzg5YWJdWzAtOWEtZl17Mn0pXFxcXHUoZFtjZGVmXVswLTlhLWZdezJ9KS9pJywKKyAgICAgICAgICAgIGZ1bmN0aW9uICgkbWF0Y2hlcykgeworICAgICAgICAgICAgICAgIHJldHVybiBtYl9jb252ZXJ0X2VuY29kaW5nKHBhY2soJ0gqJywgJG1hdGNoZXNbMV0gLiAkbWF0Y2hlc1syXSksICdVVEYtOCcsICdVVEYtMTZCRScpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICRqc29uCisgICAgICAgICk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVW5lc2NhcGVkIGNoYXJhY3RlcnMgd2l0aGluIHRoZSBCYXNpYyBNdWx0aWxpbmd1YWwgUGxhbmUKKyAgICAgICAgICovCisgICAgICAgICRqc29uID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKAorICAgICAgICAgICAgJy9cXFxcdShbMC05YS1mXXs0fSkvaScsCisgICAgICAgICAgICBmdW5jdGlvbiAoJG1hdGNoZXMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWJfY29udmVydF9lbmNvZGluZyhwYWNrKCdIKicsICRtYXRjaGVzWzFdKSwgJ1VURi04JywgJ1VURi0xNkJFJyk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgJGpzb24KKyAgICAgICAgKTsKKworICAgICAgICByZXR1cm4gJGpzb247CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05TdHJpbmcoJGIpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7CisKKyAgICAgICAgaWYgKGlzX251bWVyaWMoJGIpICYmICR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCR0aGlzLT51bmVzY2FwZWRVbmljb2RlKCRiKSk7CisKKyAgICAgICAgaWYgKGlzX251bWVyaWMoJGIpICYmICR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OSW50ZWdlcigkbnVtKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfLT53cml0ZSgpOworCisgICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkbnVtKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05Eb3VibGUoJG51bSkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+d3JpdGUoKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoanNvbl9lbmNvZGUoJG51bSkpOworCisgICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkJhc2U2NCgkZGF0YSkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+d3JpdGUoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShqc29uX2VuY29kZShiYXNlNjRfZW5jb2RlKCRkYXRhKSkpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05PYmplY3RTdGFydCgpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDRSk7CisgICAgICAgICR0aGlzLT5wdXNoQ29udGV4dChuZXcgUGFpckNvbnRleHQoJHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTk9iamVjdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cG9wQ29udGV4dCgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0UpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OQXJyYXlTdGFydCgpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDS0VUKTsKKyAgICAgICAgJHRoaXMtPnB1c2hDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgkdGhpcykpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OQXJyYXlFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBvcENvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNLRVQpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05TdHJpbmcoJHNraXBDb250ZXh0KQorICAgIHsKKyAgICAgICAgaWYgKCEkc2tpcENvbnRleHQpIHsKKyAgICAgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOworICAgICAgICB9CisKKyAgICAgICAgJGpzb25TdHJpbmcgPSAnJzsKKyAgICAgICAgJGxhc3RDaGFyID0gbnVsbDsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICRjaCA9ICR0aGlzLT5yZWFkZXJfLT5yZWFkKCk7CisgICAgICAgICAgICAkanNvblN0cmluZyAuPSAkY2g7CisgICAgICAgICAgICBpZiAoJGNoID09IHNlbGY6OlFVT1RFICYmCisgICAgICAgICAgICAgICAgJGxhc3RDaGFyICE9PSBudWxsICYmCisgICAgICAgICAgICAgICAgJGxhc3RDaGFyICE9PSBzZWxmOjpFU0NTRVEpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgkY2ggPT0gc2VsZjo6RVNDU0VRICYmICRsYXN0Q2hhciA9PSBzZWxmOjpFU0NTRVEpIHsKKyAgICAgICAgICAgICAgICAkbGFzdENoYXIgPSBzZWxmOjpET1VCTEVFU0M7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRsYXN0Q2hhciA9ICRjaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBqc29uX2RlY29kZSgkanNvblN0cmluZyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBpc0pTT05OdW1lcmljKCRiKQorICAgIHsKKyAgICAgICAgc3dpdGNoICgkYikgeworICAgICAgICAgICAgY2FzZSAnKyc6CisgICAgICAgICAgICBjYXNlICctJzoKKyAgICAgICAgICAgIGNhc2UgJy4nOgorICAgICAgICAgICAgY2FzZSAnMCc6CisgICAgICAgICAgICBjYXNlICcxJzoKKyAgICAgICAgICAgIGNhc2UgJzInOgorICAgICAgICAgICAgY2FzZSAnMyc6CisgICAgICAgICAgICBjYXNlICc0JzoKKyAgICAgICAgICAgIGNhc2UgJzUnOgorICAgICAgICAgICAgY2FzZSAnNic6CisgICAgICAgICAgICBjYXNlICc3JzoKKyAgICAgICAgICAgIGNhc2UgJzgnOgorICAgICAgICAgICAgY2FzZSAnOSc6CisgICAgICAgICAgICBjYXNlICdFJzoKKyAgICAgICAgICAgIGNhc2UgJ2UnOgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICAgIHsKKyAgICAgICAgJHN0cmJsZCA9IGFycmF5KCk7CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICRjaCA9ICR0aGlzLT5yZWFkZXJfLT5wZWVrKCk7CisKKyAgICAgICAgICAgIGlmICghJHRoaXMtPmlzSlNPTk51bWVyaWMoJGNoKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAkc3RyYmxkW10gPSAkdGhpcy0+cmVhZGVyXy0+cmVhZCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGltcGxvZGUoIiIsICRzdHJibGQpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05JbnRlZ2VyKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOworCisgICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgICRzdHIgPSAkdGhpcy0+cmVhZEpTT05OdW1lcmljQ2hhcnMoKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzX251bWVyaWMoJHN0cikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkludmFsaWQgZGF0YSBpbiBudW1lcmljOiAiIC4gJHN0ciwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGludHZhbCgkc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZGVudGljYWwgdG8gcmVhZEpTT05JbnRlZ2VyIGJ1dCB3aXRob3V0IHRoZSBmaW5hbCBjYXN0LgorICAgICAqIE5lZWRlZCBmb3IgcHJvcGVyIGhhbmRsaW5nIG9mIGk2NCBvbiAzMiBiaXQgbWFjaGluZXMuICBXaHkgYQorICAgICAqIHNlcGFyYXRlIGZ1bmN0aW9uPyAgU28gd2UgZG9uJ3QgaGF2ZSB0byBmb3JjZSB0aGUgcmVzdCBvZiB0aGUKKyAgICAgKiB1c2UgY2FzZXMgdGhyb3VnaCB0aGUgZXh0cmEgY29uZGl0aW9uYWwuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTkludGVnZXJBc1N0cmluZygpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICAkc3RyID0gJHRoaXMtPnJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisKKyAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc19udW1lcmljKCRzdHIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJJbnZhbGlkIGRhdGEgaW4gbnVtZXJpYzogIiAuICRzdHIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkc3RyOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05Eb3VibGUoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfLT5yZWFkKCk7CisKKyAgICAgICAgaWYgKHN1YnN0cigkdGhpcy0+cmVhZGVyXy0+cGVlaygpLCAwLCAxKSA9PSBzZWxmOjpRVU9URSkgeworICAgICAgICAgICAgJGFyciA9ICR0aGlzLT5yZWFkSlNPTlN0cmluZyh0cnVlKTsKKworICAgICAgICAgICAgaWYgKCRhcnIgPT0gIk5hTiIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkFOOworICAgICAgICAgICAgfSBlbHNlaWYgKCRhcnIgPT0gIkluZmluaXR5IikgeworICAgICAgICAgICAgICAgIHJldHVybiBJTkY7CisgICAgICAgICAgICB9IGVsc2VpZiAoISR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQgIiAuICRhcnIsCisgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZsb2F0dmFsKCRhcnIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZsb2F0dmFsKCR0aGlzLT5yZWFkSlNPTk51bWVyaWNDaGFycygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05CYXNlNjQoKQorICAgIHsKKyAgICAgICAgJGFyciA9ICR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSk7CisgICAgICAgICRkYXRhID0gYmFzZTY0X2RlY29kZSgkYXJyLCB0cnVlKTsKKworICAgICAgICBpZiAoJGRhdGEgPT09IGZhbHNlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJJbnZhbGlkIGJhc2U2NCBkYXRhICIgLiAkYXJyLCBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJGRhdGE7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTk9iamVjdFN0YXJ0KCkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOworICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OkxCUkFDRSk7CisgICAgICAgICR0aGlzLT5wdXNoQ29udGV4dChuZXcgUGFpckNvbnRleHQoJHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OT2JqZWN0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UkJSQUNFKTsKKyAgICAgICAgJHRoaXMtPnBvcENvbnRleHQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OQXJyYXlTdGFydCgpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpMQlJBQ0tFVCk7CisgICAgICAgICR0aGlzLT5wdXNoQ29udGV4dChuZXcgTGlzdENvbnRleHQoJHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OQXJyYXlFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpSQlJBQ0tFVCk7CisgICAgICAgICR0aGlzLT5wb3BDb250ZXh0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBGdW5jdGlvbiBuYW1lCisgICAgICogQHBhcmFtIGludCAkdHlwZSBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKKyAgICAgKiBAcGFyYW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoc2VsZjo6VkVSU0lPTik7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJG5hbWUpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkdHlwZSk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRzZXFpZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheUVuZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHN0cmluZyAkbmFtZSBTdHJ1Y3QgbmFtZQorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorICAgICAqIEByZXR1cm4gaW50ICAgICAgICBIb3cgbWFueSBieXRlcyB3cml0dGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSBhIHN0cnVjdC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorICAgICAqIEByZXR1cm4gaW50ICAgICAgICBIb3cgbWFueSBieXRlcyB3cml0dGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05PYmplY3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGZpZWxkSWQpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkdGhpcy0+Z2V0VHlwZU5hbWVGb3JUeXBlSUQoJGZpZWxkVHlwZSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpzb25PYmplY3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkdGhpcy0+Z2V0VHlwZU5hbWVGb3JUeXBlSUQoJGtleVR5cGUpKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkdGhpcy0+Z2V0VHlwZU5hbWVGb3JUeXBlSUQoJHZhbFR5cGUpKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJHNpemUpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdEVuZCgpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCRlbGVtVHlwZSkpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkdGhpcy0+Z2V0VHlwZU5hbWVGb3JUeXBlSUQoJGVsZW1UeXBlKSk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkYm9vbCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRib29sID8gMSA6IDApOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJGJ5dGUpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkYnl0ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCRpMTYpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkaTE2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJGkzMikKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRpMzIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkaTY0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGk2NCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCRkdWIpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09ORG91YmxlKCRkdWIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkc3RyKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgbWVzc2FnZSBoZWFkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisgICAgICogQHBhcmVtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlTdGFydCgpOworCisgICAgICAgIGlmICgkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCkgIT0gc2VsZjo6VkVSU0lPTikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24iLCBUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OKTsKKyAgICAgICAgfQorCisgICAgICAgICRuYW1lID0gJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKTsKKyAgICAgICAgJHR5cGUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgICRzZXFpZCA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSBjbG9zZSBvZiBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05PYmplY3RTdGFydCgpOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpCisgICAgeworICAgICAgICAkY2ggPSAkdGhpcy0+cmVhZGVyXy0+cGVlaygpOworICAgICAgICAkbmFtZSA9ICIiOworCisgICAgICAgIGlmIChzdWJzdHIoJGNoLCAwLCAxKSA9PSBzZWxmOjpSQlJBQ0UpIHsKKyAgICAgICAgICAgICRmaWVsZFR5cGUgPSBUVHlwZTo6U1RPUDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRmaWVsZElkID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOworICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKyAgICAgICAgICAgICRmaWVsZFR5cGUgPSAkdGhpcy0+Z2V0VHlwZUlERm9yVHlwZU5hbWUoJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgJGtleVR5cGUgPSAkdGhpcy0+Z2V0VHlwZUlERm9yVHlwZU5hbWUoJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgICR2YWxUeXBlID0gJHRoaXMtPmdldFR5cGVJREZvclR5cGVOYW1lKCR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICAkc2l6ZSA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICRlbGVtVHlwZSA9ICR0aGlzLT5nZXRUeXBlSURGb3JUeXBlTmFtZSgkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgJHNpemUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICRlbGVtVHlwZSA9ICR0aGlzLT5nZXRUeXBlSURGb3JUeXBlTmFtZSgkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgJHNpemUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woJiRib29sKQorICAgIHsKKyAgICAgICAgJGJvb2wgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCkgPT0gMCA/IGZhbHNlIDogdHJ1ZTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiRieXRlKQorICAgIHsKKyAgICAgICAgJGJ5dGUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoJiRpMTYpCisgICAgeworICAgICAgICAkaTE2ID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCYkaTMyKQorICAgIHsKKyAgICAgICAgJGkzMiA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgmJGk2NCkKKyAgICB7CisgICAgICAgIGlmIChQSFBfSU5UX1NJWkUgPT09IDQpIHsKKyAgICAgICAgICAgICRpNjQgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyQXNTdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRpNjQgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJGR1YikKKyAgICB7CisgICAgICAgICRkdWIgPSAkdGhpcy0+cmVhZEpTT05Eb3VibGUoKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygmJHN0cikKKyAgICB7CisgICAgICAgICRzdHIgPSAkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTc5YzA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wucGhwCkBAIC0wLDAgKzEsODUgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBUaHJpZnRcVHlwZVxUTWVzc2FnZVR5cGU7CisKKy8qKgorICogPGNvZGU+VE11bHRpcGxleGVkUHJvdG9jb2w8L2NvZGU+IGlzIGEgcHJvdG9jb2wtaW5kZXBlbmRlbnQgY29uY3JldGUgZGVjb3JhdG9yCisgKiB0aGF0IGFsbG93cyBhIFRocmlmdCBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG11bHRpcGxleGluZyBUaHJpZnQgc2VydmVyLAorICogYnkgcHJlcGVuZGluZyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lIGR1cmluZyBmdW5jdGlvbiBjYWxscy4KKyAqCisgKiBAcGFja2FnZSBUaHJpZnRcUHJvdG9jb2wKKyAqLworY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2xEZWNvcmF0b3IKK3sKKyAgICAvKioKKyAgICAgKiBTZXBhcmF0b3IgYmV0d2VlbiBzZXJ2aWNlIG5hbWUgYW5kIGZ1bmN0aW9uIG5hbWUuCisgICAgICogU2hvdWxkIGJlIHRoZSBzYW1lIGFzIHVzZWQgYXQgbXVsdGlwbGV4ZWQgVGhyaWZ0IHNlcnZlci4KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgY29uc3QgU0VQQVJBVE9SID0gIjoiOworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2Ygc2VydmljZS4KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSAkc2VydmljZU5hbWVfOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3Igb2YgPGNvZGU+VE11bHRpcGxleGVkUHJvdG9jb2w8L2NvZGU+IGNsYXNzLgorICAgICAqCisgICAgICogV3JhcCB0aGUgc3BlY2lmaWVkIHByb3RvY29sLCBhbGxvd2luZyBpdCB0byBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggYQorICAgICAqIG11bHRpcGxleGluZyBzZXJ2ZXIuICBUaGUgPGNvZGU+JHNlcnZpY2VOYW1lPC9jb2RlPiBpcyByZXF1aXJlZCBhcyBpdCBpcworICAgICAqIHByZXBlbmRlZCB0byB0aGUgbWVzc2FnZSBoZWFkZXIgc28gdGhhdCB0aGUgbXVsdGlwbGV4aW5nIHNlcnZlciBjYW4gYnJva2VyCisgICAgICogdGhlIGZ1bmN0aW9uIGNhbGwgdG8gdGhlIHByb3BlciBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIFRQcm90b2NvbCAkcHJvdG9jb2wKKyAgICAgKiBAcGFyYW0gc3RyaW5nICAgICRzZXJ2aWNlTmFtZSBUaGUgbmFtZSBvZiBzZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChUUHJvdG9jb2wgJHByb3RvY29sLCAkc2VydmljZU5hbWUpCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRwcm90b2NvbCk7CisgICAgICAgICR0aGlzLT5zZXJ2aWNlTmFtZV8gPSAkc2VydmljZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlci4KKyAgICAgKiBQcmVwZW5kcyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lLCBzZXBhcmF0ZWQgYnkgPGNvZGU+VE11bHRpcGxleGVkUHJvdG9jb2w6OlNFUEFSQVRPUjwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBGdW5jdGlvbiBuYW1lLgorICAgICAqIEBwYXJhbSBpbnQgICAgJHR5cGUgIE1lc3NhZ2UgdHlwZS4KKyAgICAgKiBAcGFyYW0gaW50ICAgICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkKKyAgICB7CisgICAgICAgIGlmICgkdHlwZSA9PSBUTWVzc2FnZVR5cGU6OkNBTEwgfHwgJHR5cGUgPT0gVE1lc3NhZ2VUeXBlOjpPTkVXQVkpIHsKKyAgICAgICAgICAgICRuYW1lV2l0aFNlcnZpY2UgPSAkdGhpcy0+c2VydmljZU5hbWVfIC4gc2VsZjo6U0VQQVJBVE9SIC4gJG5hbWU7CisgICAgICAgICAgICBwYXJlbnQ6OndyaXRlTWVzc2FnZUJlZ2luKCRuYW1lV2l0aFNlcnZpY2UsICR0eXBlLCAkc2VxaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyZW50Ojp3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9UUHJvdG9jb2wucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVFByb3RvY29sLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWFjZWI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVFByb3RvY29sLnBocApAQCAtMCwwICsxLDM1MCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbDsKKwordXNlIFRocmlmdFxUeXBlXFRUeXBlOwordXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOworCisvKioKKyAqIFByb3RvY29sIGJhc2UgY2xhc3MgbW9kdWxlLgorICovCithYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2wKK3sKKyAgICAvKioKKyAgICAgKiBVbmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAqCisgICAgICogQHZhciBUVHJhbnNwb3J0CisgICAgICovCisgICAgcHJvdGVjdGVkICR0cmFuc187CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNfID0gJHRyYW5zOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjY2Vzc29yIGZvciB0cmFuc3BvcnQKKyAgICAgKgorICAgICAqIEByZXR1cm4gVFRyYW5zcG9ydAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT50cmFuc187CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBGdW5jdGlvbiBuYW1lCisgICAgICogQHBhcmFtIGludCAkdHlwZSBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKKyAgICAgKiBAcGFyYW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBtZXNzYWdlCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpOworCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgc3RydWN0IGhlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgU3RydWN0IG5hbWUKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyAgICAgKiBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpOworCisgICAgLyoqCisgICAgICogQ2xvc2UgYSBzdHJ1Y3QuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyAgICAgKiBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCk7CisKKyAgICAvKgorICAgICAqIFN0YXJ0cyBhIGZpZWxkLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAgICAgJG5hbWUgRmllbGQgbmFtZQorICAgICAqIEBwYXJhbSBpbnQgICAgICAgICR0eXBlIEZpZWxkIHR5cGUKKyAgICAgKiBAcGFyYW0gaW50ICAgICAgICAkZmlkICBGaWVsZCBpZAorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorICAgICAqIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkYm9vbCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKCRieXRlKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkaTE2KTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMigkaTMyKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkaTY0KTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSgkZHViKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkc3RyKTsKKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBtZXNzYWdlIGhlYWRlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBGdW5jdGlvbiBuYW1lCisgICAgICogQHBhcmFtIGludCAkdHlwZSBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKKyAgICAgKiBAcGFyZW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpOworCisgICAgLyoqCisgICAgICogUmVhZCB0aGUgY2xvc2Ugb2YgbWVzc2FnZQorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigmJGtleVR5cGUsICYkdmFsVHlwZSwgJiRzaXplKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkYm9vbCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiRieXRlKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkaTE2KTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCYkaTMyKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCYkaTY0KTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCYkZHViKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nKCYkc3RyKTsKKworICAgIC8qKgorICAgICAqIFRoZSBza2lwIGZ1bmN0aW9uIGlzIGEgdXRpbGl0eSB0byBwYXJzZSBvdmVyIHVucmVjb2duaXplZCBkYXRlIHdpdGhvdXQKKyAgICAgKiBjYXVzaW5nIGNvcnJ1cHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gVFR5cGUgJHR5cGUgV2hhdCB0eXBlIGlzIGl0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNraXAoJHR5cGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKCR0eXBlKSB7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpCT09MOgorICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZEJvb2woJGJvb2wpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6QllURToKKyAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRCeXRlKCRieXRlKTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkkxNjoKKyAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRJMTYoJGkxNik7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJMzI6CisgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkSTMyKCRpMzIpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STY0OgorICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZEk2NCgkaTY0KTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkRPVUJMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWREb3VibGUoJGR1Yik7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkU3RyaW5nKCRzdHIpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFN0cnVjdEJlZ2luKCRuYW1lKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkRmllbGRCZWdpbigkbmFtZSwgJGZ0eXBlLCAkZmlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkZnR5cGUpOworICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFN0cnVjdEVuZCgpOworCisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKKyAgICAgICAgICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgJGkrKykgeworICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5za2lwKCRrZXlUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkdmFsVHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRNYXBFbmQoKTsKKworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworCisgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisgICAgICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkZWxlbVR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkU2V0RW5kKCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKworICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZExpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKKyAgICAgICAgICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgJGkrKykgeworICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5za2lwKCRlbGVtVHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRMaXN0RW5kKCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAnVW5rbm93biBmaWVsZCB0eXBlOiAnIC4gJHR5cGUsCisgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZm9yIHNraXBwaW5nIGJpbmFyeSBkYXRhCisgICAgICoKKyAgICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkaXRyYW5zIFRUcmFuc3BvcnQgb2JqZWN0CisgICAgICogQHBhcmFtIGludCAkdHlwZSBGaWVsZCB0eXBlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBza2lwQmluYXJ5KCRpdHJhbnMsICR0eXBlKQorICAgIHsKKyAgICAgICAgc3dpdGNoICgkdHlwZSkgeworICAgICAgICAgICAgY2FzZSBUVHlwZTo6Qk9PTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgxKTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkJZVEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJMTY6CisgICAgICAgICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMik7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJMzI6CisgICAgICAgICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoNCk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJNjQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoOCk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpET1VCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoOCk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJJTkc6CisgICAgICAgICAgICAgICAgJGxlbiA9IHVucGFjaygnTicsICRpdHJhbnMtPnJlYWRBbGwoNCkpOworICAgICAgICAgICAgICAgICRsZW4gPSAkbGVuWzFdOworICAgICAgICAgICAgICAgIGlmICgkbGVuID4gMHg3ZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICAkbGVuID0gMCAtICgoJGxlbiAtIDEpIF4gMHhmZmZmZmZmZik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIDQgKyAkaXRyYW5zLT5yZWFkQWxsKCRsZW4pOworCisgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgJHJlc3VsdCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgJGZ0eXBlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgJGZpZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKKyAgICAgICAgICAgICAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgJGZ0eXBlID0gJGFyclsxXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gSTE2IGZpZWxkIGlkCisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJGl0cmFucy0+cmVhZEFsbCgyKTsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICRmdHlwZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAvLyBLdHlwZQorICAgICAgICAgICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKKyAgICAgICAgICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOworICAgICAgICAgICAgICAgICRrdHlwZSA9ICRhcnJbMV07CisgICAgICAgICAgICAgICAgLy8gVnR5cGUKKyAgICAgICAgICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKKyAgICAgICAgICAgICAgICAkdnR5cGUgPSAkYXJyWzFdOworICAgICAgICAgICAgICAgIC8vIFNpemUKKyAgICAgICAgICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoNCk7CisgICAgICAgICAgICAgICAgJGFyciA9IHVucGFjaygnTicsICRkYXRhKTsKKyAgICAgICAgICAgICAgICAkc2l6ZSA9ICRhcnJbMV07CisgICAgICAgICAgICAgICAgaWYgKCRzaXplID4gMHg3ZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICAkc2l6ZSA9IDAgLSAoKCRzaXplIC0gMSkgXiAweGZmZmZmZmZmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJHJlc3VsdCA9IDY7CisgICAgICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICRrdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gc2VsZjo6c2tpcEJpbmFyeSgkaXRyYW5zLCAkdnR5cGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworCisgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgLy8gVnR5cGUKKyAgICAgICAgICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKKyAgICAgICAgICAgICAgICAkdnR5cGUgPSAkYXJyWzFdOworICAgICAgICAgICAgICAgIC8vIFNpemUKKyAgICAgICAgICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoNCk7CisgICAgICAgICAgICAgICAgJGFyciA9IHVucGFjaygnTicsICRkYXRhKTsKKyAgICAgICAgICAgICAgICAkc2l6ZSA9ICRhcnJbMV07CisgICAgICAgICAgICAgICAgaWYgKCRzaXplID4gMHg3ZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICAkc2l6ZSA9IDAgLSAoKCRzaXplIC0gMSkgXiAweGZmZmZmZmZmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJHJlc3VsdCA9IDU7CisgICAgICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICR2dHlwZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ1Vua25vd24gZmllbGQgdHlwZTogJyAuICR0eXBlLAorICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQQorICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODVlMGI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnBocApAQCAtMCwwICsxLDI4NSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKKworLyoqCisgKiA8Y29kZT5UUHJvdG9jb2xEZWNvcmF0b3I8L2NvZGU+IGZvcndhcmRzIGFsbCByZXF1ZXN0cyB0byBhbiBlbmNsb3NlZAorICogPGNvZGU+VFByb3RvY29sPC9jb2RlPiBpbnN0YW5jZSwgcHJvdmlkaW5nIGEgd2F5IHRvIGF1dGhvciBjb25jaXNlCisgKiBjb25jcmV0ZSBkZWNvcmF0b3Igc3ViY2xhc3Nlcy4gV2hpbGUgaXQgaGFzIG5vIGFic3RyYWN0IG1ldGhvZHMsIGl0CisgKiBpcyBtYXJrZWQgYWJzdHJhY3QgYXMgYSByZW1pbmRlciB0aGF0IGJ5IGl0c2VsZiwgaXQgZG9lcyBub3QgbW9kaWZ5CisgKiB0aGUgYmVoYXZpb3VyIG9mIHRoZSBlbmNsb3NlZCA8Y29kZT5UUHJvdG9jb2w8L2NvZGU+LgorICoKKyAqIEBwYWNrYWdlIFRocmlmdFxQcm90b2NvbAorICovCithYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3IgZXh0ZW5kcyBUUHJvdG9jb2wKK3sKKyAgICAvKioKKyAgICAgKiBJbnN0YW5jZSBvZiBwcm90b2NvbCwgdG8gd2hpY2ggYWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBmb3J3YXJkZWQuCisgICAgICoKKyAgICAgKiBAdmFyIFRQcm90b2NvbAorICAgICAqLworICAgIHByaXZhdGUgJGNvbmNyZXRlUHJvdG9jb2xfOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3Igb2YgPGNvZGU+VFByb3RvY29sRGVjb3JhdG9yPC9jb2RlPiBjbGFzcy4KKyAgICAgKiBFbmNsb3NlcyB0aGUgc3BlY2lmaWVkIHByb3RvY29sLgorICAgICAqCisgICAgICogQHBhcmFtIFRQcm90b2NvbCAkcHJvdG9jb2wgQWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBmb3J3YXJkIHRvIHRoaXMgaW5zdGFuY2UuIE11c3QgYmUgbm9uLW51bGwuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9fY29uc3RydWN0KFRQcm90b2NvbCAkcHJvdG9jb2wpCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRwcm90b2NvbC0+Z2V0VHJhbnNwb3J0KCkpOworICAgICAgICAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8gPSAkcHJvdG9jb2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgIEZ1bmN0aW9uIG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICAgICR0eXBlICBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKKyAgICAgKiBAcGFyYW0gaW50ICAgICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTWVzc2FnZUVuZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIFN0cnVjdCBuYW1lCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyAgICAgKiBAcmV0dXJuIGludCAgICAgICAgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgYSBzdHJ1Y3QuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyAgICAgKiBAcmV0dXJuIGludCAgICAgICAgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVN0cnVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVGaWVsZFN0b3AoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVNYXBFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVMaXN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlU2V0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkYm9vbCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlQm9vbCgkYm9vbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkYnl0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlQnl0ZSgkYnl0ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCRpMTYpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUkxNigkaTE2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJGkzMikKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlSTMyKCRpMzIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkaTY0KQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVJNjQoJGk2NCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCRkdWIpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZURvdWJsZSgkZHViKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHN0cikKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlU3RyaW5nKCRzdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBtZXNzYWdlIGhlYWRlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSAgRnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBpbnQgICAgJHR5cGUgIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQorICAgICAqIEBwYXJhbSBpbnQgICAgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgdGhlIGNsb3NlIG9mIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZE1lc3NhZ2VFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCYkbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRTdHJ1Y3RCZWdpbigkbmFtZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZFN0cnVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkRmllbGRCZWdpbigkbmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEZpZWxkRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigmJGtleVR5cGUsICYkdmFsVHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZE1hcEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZExpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZExpc3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU2V0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkYm9vbCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRCb29sKCRib29sKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiRieXRlKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEJ5dGUoJGJ5dGUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkaTE2KQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEkxNigkaTE2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJGkzMikKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRJMzIoJGkzMik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiRpNjQpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkSTY0KCRpNjQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCYkZHViKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZERvdWJsZSgkZHViKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygmJHN0cikKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRTdHJpbmcoJHN0cik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2YxZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5waHAKQEAgLTAsMCArMSwzNzQgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRQcm90b2NvbEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTlxDb250ZXh0OwordXNlIFRocmlmdFxQcm90b2NvbFxTaW1wbGVKU09OXExpc3RDb250ZXh0OwordXNlIFRocmlmdFxQcm90b2NvbFxTaW1wbGVKU09OXFN0cnVjdENvbnRleHQ7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT05cTWFwQ29udGV4dDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTlxDb2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uOworCisvKioKKyAqIFNpbXBsZUpTT04gaW1wbGVtZW50YXRpb24gb2YgdGhyaWZ0IHByb3RvY29sLCBwb3J0ZWQgZnJvbSBKYXZhLgorICovCitjbGFzcyBUU2ltcGxlSlNPTlByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sCit7CisgICAgY29uc3QgQ09NTUEgPSAnLCc7CisgICAgY29uc3QgQ09MT04gPSAnOic7CisgICAgY29uc3QgTEJSQUNFID0gJ3snOworICAgIGNvbnN0IFJCUkFDRSA9ICd9JzsKKyAgICBjb25zdCBMQlJBQ0tFVCA9ICdbJzsKKyAgICBjb25zdCBSQlJBQ0tFVCA9ICddJzsKKyAgICBjb25zdCBRVU9URSA9ICciJzsKKworICAgIGNvbnN0IE5BTUVfTUFQID0gIm1hcCI7CisgICAgY29uc3QgTkFNRV9MSVNUID0gImxzdCI7CisgICAgY29uc3QgTkFNRV9TRVQgPSAic2V0IjsKKworICAgIHByb3RlY3RlZCAkd3JpdGVDb250ZXh0XyA9IG51bGw7CisgICAgcHJvdGVjdGVkICR3cml0ZUNvbnRleHRTdGFja18gPSBbXTsKKworICAgIC8qKgorICAgICAqIFB1c2ggYSBuZXcgd3JpdGUgY29udGV4dCBvbnRvIHRoZSBzdGFjay4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcHVzaFdyaXRlQ29udGV4dChDb250ZXh0ICRjKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dFN0YWNrX1tdID0gJHRoaXMtPndyaXRlQ29udGV4dF87CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfID0gJGM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wIHRoZSBsYXN0IHdyaXRlIGNvbnRleHQgb2ZmIHRoZSBzdGFjaworICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBwb3BXcml0ZUNvbnRleHQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8gPSBhcnJheV9wb3AoJHRoaXMtPndyaXRlQ29udGV4dFN0YWNrXyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBhcmUgbm90IGVuY291bnRlcmluZyBhIG1hcCB3aG9zZSBrZXlzIGFyZSBjb250YWluZXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGFzc2VydENvbnRleHRJc05vdE1hcEtleSgkaW52YWxpZEtleVR5cGUpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPndyaXRlQ29udGV4dF8tPmlzTWFwS2V5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJDYW5ub3Qgc2VyaWFsaXplIGEgbWFwIHdpdGgga2V5cyB0aGF0IGFyZSBvZiB0eXBlICIgLgorICAgICAgICAgICAgICAgICRpbnZhbGlkS2V5VHlwZQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OU3RyaW5nKCRiKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8tPndyaXRlKCk7CisKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoanNvbl9lbmNvZGUoKHN0cmluZykkYikpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OSW50ZWdlcigkbnVtKQorICAgIHsKKyAgICAgICAgJGlzTWFwS2V5ID0gJHRoaXMtPndyaXRlQ29udGV4dF8tPmlzTWFwS2V5KCk7CisKKyAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8tPndyaXRlKCk7CisKKyAgICAgICAgaWYgKCRpc01hcEtleSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoKGludCkkbnVtKTsKKworICAgICAgICBpZiAoJGlzTWFwS2V5KSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkRvdWJsZSgkbnVtKQorICAgIHsKKyAgICAgICAgJGlzTWFwS2V5ID0gJHRoaXMtPndyaXRlQ29udGV4dF8tPmlzTWFwS2V5KCk7CisKKyAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8tPndyaXRlKCk7CisKKyAgICAgICAgaWYgKCRpc01hcEtleSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoanNvbl9lbmNvZGUoKGZsb2F0KSRudW0pKTsKKworICAgICAgICBpZiAoJGlzTWFwS2V5KSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMpCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucyk7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfID0gbmV3IENvbnRleHQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIG1lc3NhZ2UgaGVhZGVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBGdW5jdGlvbiBuYW1lCisgICAgICogQHBhcmFtIGludCAgICAkdHlwZSAgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisgICAgICogQHBhcmFtIGludCAgICAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDS0VUKTsKKyAgICAgICAgJHRoaXMtPnB1c2hXcml0ZUNvbnRleHQobmV3IExpc3RDb250ZXh0KCR0aGlzKSk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJG5hbWUpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkdHlwZSk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRzZXFpZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5wb3BXcml0ZUNvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNLRVQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHN0cmluZyAgICAgJG5hbWUgU3RydWN0IG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0UpOworICAgICAgICAkdGhpcy0+cHVzaFdyaXRlQ29udGV4dChuZXcgU3RydWN0Q29udGV4dCgkdGhpcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIGEgc3RydWN0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cG9wV3JpdGVDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlJCUkFDRSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJGZpZWxkTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFzc2VydENvbnRleHRJc05vdE1hcEtleShzZWxmOjpOQU1FX01BUCk7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0UpOworICAgICAgICAkdGhpcy0+cHVzaFdyaXRlQ29udGV4dChuZXcgTWFwQ29udGV4dCgkdGhpcykpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cG9wV3JpdGVDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlJCUkFDRSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0Q29udGV4dElzTm90TWFwS2V5KHNlbGY6Ok5BTUVfTElTVCk7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0tFVCk7CisgICAgICAgICR0aGlzLT5wdXNoV3JpdGVDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgkdGhpcykpOworICAgICAgICAvLyBObyBtZXRhZGF0YSEKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5wb3BXcml0ZUNvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNLRVQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0Q29udGV4dElzTm90TWFwS2V5KHNlbGY6Ok5BTUVfU0VUKTsKKyAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8tPndyaXRlKCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDS0VUKTsKKyAgICAgICAgJHRoaXMtPnB1c2hXcml0ZUNvbnRleHQobmV3IExpc3RDb250ZXh0KCR0aGlzKSk7CisgICAgICAgIC8vIE5vIG1ldGFkYXRhIQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cG9wV3JpdGVDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlJCUkFDS0VUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKCRib29sKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGJvb2wgPyAxIDogMCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkYnl0ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRieXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoJGkxNikKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRpMTYpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMigkaTMyKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGkzMik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KCRpNjQpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkaTY0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJGR1YikKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05Eb3VibGUoJGR1Yik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKCRzdHIpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCRzdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRpbmcgbWV0aG9kcy4KKyAgICAgKgorICAgICAqIHNpbXBsZWpzb24gaXMgbm90IG1lYW50IHRvIGJlIHJlYWQgYmFjayBpbnRvIHRocmlmdAorICAgICAqIC0gc2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvdGhyaWZ0L1RocmlmdFVzYWdlSmF2YQorICAgICAqIC0gdXNlIEpTT04gaW5zdGVhZAorICAgICAqLworCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCYkbmFtZSkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCYkbmFtZSwgJiRmaWVsZFR5cGUsICYkZmllbGRJZCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCYka2V5VHlwZSwgJiR2YWxUeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBFbmQoKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woJiRib29sKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQnl0ZSgmJGJ5dGUpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoJiRpMTYpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiRpMzIpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiRpNjQpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoJiRkdWIpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiRzdHIpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU2VyaWFsaXplci9UQmluYXJ5U2VyaWFsaXplci5waHAgYi9saWIvcGhwL2xpYi9TZXJpYWxpemVyL1RCaW5hcnlTZXJpYWxpemVyLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDJiMTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU2VyaWFsaXplci9UQmluYXJ5U2VyaWFsaXplci5waHAKQEAgLTAsMCArMSw4NyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKiBAYXV0aG9yOiBybWFyaW4gKG1hcmluLnJhZHVAZmFjZWJvb2suY29tKQorICovCisKK25hbWVzcGFjZSBUaHJpZnRcU2VyaWFsaXplcjsKKwordXNlIFRocmlmdFxUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlcjsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQ7Cit1c2UgVGhyaWZ0XFR5cGVcVE1lc3NhZ2VUeXBlOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIHNlcmlhbGl6aW5nIGFuZCBkZXNlcmlhbGl6aW5nCisgKiBhIHRocmlmdCBvYmplY3QgdXNpbmcgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQuCisgKi8KK2NsYXNzIFRCaW5hcnlTZXJpYWxpemVyCit7CisgICAgLy8gTk9URShybWFyaW4pOiBCZWNhdXNlIHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkKKyAgICAvLyBhZGRzIGEgYmVnaW4gbWVzc2FnZSBwcmVmaXgsIHlvdSBjYW5ub3Qgc3BlY2lmeQorICAgIC8vIGEgdHJhbnNwb3J0IGluIHdoaWNoIHRvIHNlcmlhbGl6ZSBhbiBvYmplY3QuIEl0IGhhcyB0bworICAgIC8vIGJlIGEgc3RyaW5nLiBPdGhlcndpc2Ugd2Ugd2lsbCBicmVhayB0aGUgY29tcGF0aWJpbGl0eSB3aXRoCisgICAgLy8gbm9ybWFsIGRlc2VyaWFsaXphdGlvbi4KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNlcmlhbGl6ZSgkb2JqZWN0KQorICAgIHsKKyAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7CisgICAgICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCgkdHJhbnNwb3J0KTsKKyAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeScpKSB7CisgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5KAorICAgICAgICAgICAgICAgICRwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAkb2JqZWN0LT5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpSRVBMWSwKKyAgICAgICAgICAgICAgICAkb2JqZWN0LAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgJHByb3RvY29sLT5pc1N0cmljdFdyaXRlKCkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICRwcm90b2NvbC0+cmVhZE1lc3NhZ2VCZWdpbigkdW51c2VkX25hbWUsICR1bnVzZWRfdHlwZSwgJHVudXNlZF9zZXFpZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkb2JqZWN0LT53cml0ZSgkcHJvdG9jb2wpOworICAgICAgICB9CisgICAgICAgICRwcm90b2NvbC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7CisKKyAgICAgICAgcmV0dXJuICR0cmFuc3BvcnQtPmdldEJ1ZmZlcigpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGVzZXJpYWxpemUoJHN0cmluZ19vYmplY3QsICRjbGFzc19uYW1lLCAkYnVmZmVyX3NpemUgPSA4MTkyKQorICAgIHsKKyAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7CisgICAgICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCgkdHJhbnNwb3J0KTsKKyAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5JykpIHsKKyAgICAgICAgICAgIC8vIE5PVEUgKHQuaGVpbnR6KSBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBpbnRlcm5hbGx5IHdyYXBzIG91ciBUTWVtb3J5QnVmZmVyIGluIGEKKyAgICAgICAgICAgIC8vIFRCdWZmZXJlZFRyYW5zcG9ydCwgc28gd2UgaGF2ZSB0byByZXRyaWV2ZSBpdCBhZ2FpbiBvciByaXNrIGxvc2luZyBkYXRhIHdoZW4gd3JpdGluZworICAgICAgICAgICAgLy8gbGVzcyB0aGFuIDUxMiBieXRlcyB0byB0aGUgdHJhbnNwb3J0IChzZWUgdGhlIGNvbW1lbnQgdGhlcmUgYXMgd2VsbCkuCisgICAgICAgICAgICAvLyBAc2VlIFRIUklGVC0xNTc5CisgICAgICAgICAgICAkcHJvdG9jb2wtPndyaXRlTWVzc2FnZUJlZ2luKCcnLCBUTWVzc2FnZVR5cGU6OlJFUExZLCAwKTsKKyAgICAgICAgICAgICRwcm90b2NvbFRyYW5zcG9ydCA9ICRwcm90b2NvbC0+Z2V0VHJhbnNwb3J0KCk7CisgICAgICAgICAgICAkcHJvdG9jb2xUcmFuc3BvcnQtPndyaXRlKCRzdHJpbmdfb2JqZWN0KTsKKyAgICAgICAgICAgICRwcm90b2NvbFRyYW5zcG9ydC0+Zmx1c2goKTsKKworICAgICAgICAgICAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSgkcHJvdG9jb2wsICRjbGFzc19uYW1lLCAkcHJvdG9jb2wtPmlzU3RyaWN0UmVhZCgpLCAkYnVmZmVyX3NpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRyYW5zcG9ydC0+d3JpdGUoJHN0cmluZ19vYmplY3QpOworICAgICAgICAgICAgJG9iamVjdCA9IG5ldyAkY2xhc3NfbmFtZSgpOworICAgICAgICAgICAgJG9iamVjdC0+cmVhZCgkcHJvdG9jb2wpOworCisgICAgICAgICAgICByZXR1cm4gJG9iamVjdDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1NlcnZlci9URm9ya2luZ1NlcnZlci5waHAgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVEZvcmtpbmdTZXJ2ZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYjZlOTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVEZvcmtpbmdTZXJ2ZXIucGhwCkBAIC0wLDAgKzEsMTI1IEBACis8P3BocAorCituYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKKwordXNlIFRocmlmdFxUcmFuc3BvcnRcVFRyYW5zcG9ydDsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOworCisvKioKKyAqIEEgZm9ya2luZyBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBzZXJ2ZXIuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnNlcnZlcgorICovCitjbGFzcyBURm9ya2luZ1NlcnZlciBleHRlbmRzIFRTZXJ2ZXIKK3sKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciB0aGUgbWFpbiBzZXJ2aW5nIGxvb3AKKyAgICAgKgorICAgICAqIEB2YXIgYm9vbAorICAgICAqLworICAgIHByaXZhdGUgJHN0b3BfID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBMaXN0IG9mIGNoaWxkcmVuLgorICAgICAqCisgICAgICogQHZhciBhcnJheQorICAgICAqLworICAgIHByb3RlY3RlZCAkY2hpbGRyZW5fID0gYXJyYXkoKTsKKworICAgIC8qKgorICAgICAqIExpc3RlbnMgZm9yIG5ldyBjbGllbnQgdXNpbmcgdGhlIHN1cHBsaWVkCisgICAgICogdHJhbnNwb3J0LiBXZSBmb3JrIHdoZW4gYSBuZXcgY29ubmVjdGlvbgorICAgICAqIGFycml2ZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2VydmUoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPmxpc3RlbigpOworCisgICAgICAgIHdoaWxlICghJHRoaXMtPnN0b3BfKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICR0cmFuc3BvcnQgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+YWNjZXB0KCk7CisKKyAgICAgICAgICAgICAgICBpZiAoJHRyYW5zcG9ydCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICRwaWQgPSBwY250bF9mb3JrKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCRwaWQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aGFuZGxlUGFyZW50KCR0cmFuc3BvcnQsICRwaWQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJHBpZCA9PT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhhbmRsZUNoaWxkKCR0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ0ZhaWxlZCB0byBmb3JrJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICR0aGlzLT5jb2xsZWN0Q2hpbGRyZW4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvZGUgcnVuIGJ5IHRoZSBwYXJlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbSBUVHJhbnNwb3J0ICR0cmFuc3BvcnQKKyAgICAgKiBAcGFyYW0gaW50ICRwaWQKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIGhhbmRsZVBhcmVudChUVHJhbnNwb3J0ICR0cmFuc3BvcnQsICRwaWQpCisgICAgeworICAgICAgICAkdGhpcy0+Y2hpbGRyZW5fWyRwaWRdID0gJHRyYW5zcG9ydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2RlIHJ1biBieSB0aGUgY2hpbGQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkdHJhbnNwb3J0CisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBoYW5kbGVDaGlsZChUVHJhbnNwb3J0ICR0cmFuc3BvcnQpCisgICAgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgJGlucHV0VHJhbnNwb3J0ID0gJHRoaXMtPmlucHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKKyAgICAgICAgICAgICRvdXRwdXRUcmFuc3BvcnQgPSAkdGhpcy0+b3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKKyAgICAgICAgICAgICRpbnB1dFByb3RvY29sID0gJHRoaXMtPmlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woJGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICRvdXRwdXRQcm90b2NvbCA9ICR0aGlzLT5vdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbCgkb3V0cHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgIHdoaWxlICgkdGhpcy0+cHJvY2Vzc29yXy0+cHJvY2VzcygkaW5wdXRQcm90b2NvbCwgJG91dHB1dFByb3RvY29sKSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgQCR0cmFuc3BvcnQtPmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIGV4aXQoMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29sbGVjdHMgYW55IGNoaWxkcmVuIHdlIG1heSBoYXZlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIGNvbGxlY3RDaGlsZHJlbigpCisgICAgeworICAgICAgICBmb3JlYWNoICgkdGhpcy0+Y2hpbGRyZW5fIGFzICRwaWQgPT4gJHRyYW5zcG9ydCkgeworICAgICAgICAgICAgaWYgKHBjbnRsX3dhaXRwaWQoJHBpZCwgJHN0YXR1cywgV05PSEFORykgPiAwKSB7CisgICAgICAgICAgICAgICAgdW5zZXQoJHRoaXMtPmNoaWxkcmVuX1skcGlkXSk7CisgICAgICAgICAgICAgICAgaWYgKCR0cmFuc3BvcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgQCR0cmFuc3BvcnQtPmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcHMgdGhlIHNlcnZlciBydW5uaW5nLiBLaWxscyB0aGUgdHJhbnNwb3J0CisgICAgICogYW5kIHRoZW4gc3RvcHMgdGhlIG1haW4gc2VydmluZyBsb29wCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc3RvcCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Y2xvc2UoKTsKKyAgICAgICAgJHRoaXMtPnN0b3BfID0gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNTTFNlcnZlclNvY2tldC5waHAgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNTTFNlcnZlclNvY2tldC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM1ODliNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1NlcnZlci9UU1NMU2VydmVyU29ja2V0LnBocApAQCAtMCwwICsxLDk3IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7CisKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRTU0xTb2NrZXQ7CisKKy8qKgorICogU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIGEgc2VydmVyIGFnZW50LgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVFNTTFNlcnZlclNvY2tldCBleHRlbmRzIFRTZXJ2ZXJTb2NrZXQKK3sKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgcG9ydAorICAgICAqCisgICAgICogQHZhciByZXNvdXJjZQorICAgICAqLworICAgIHByb3RlY3RlZCAkY29udGV4dF8gPSBudWxsOworCisgICAgLyoqCisgICAgICogU2VydmVyU29ja2V0IGNvbnN0cnVjdG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0IEhvc3QgdG8gbGlzdGVuIG9uCisgICAgICogQHBhcmFtIGludCAkcG9ydCBQb3J0IHRvIGxpc3RlbiBvbgorICAgICAqIEBwYXJhbSByZXNvdXJjZSAkY29udGV4dCBTdHJlYW0gY29udGV4dAorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaG9zdCA9ICdsb2NhbGhvc3QnLCAkcG9ydCA9IDkwOTAsICRjb250ZXh0ID0gbnVsbCkKKyAgICB7CisgICAgICAgICRzc2xfaG9zdCA9ICR0aGlzLT5nZXRTU0xIb3N0KCRob3N0KTsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkc3NsX2hvc3QsICRwb3J0KTsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gJGNvbnRleHQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFNTTEhvc3QoJGhvc3QpCisgICAgeworICAgICAgICAkdHJhbnNwb3J0X3Byb3RvY29sX2xvYyA9IHN0cnBvcygkaG9zdCwgIjovLyIpOworICAgICAgICBpZiAoJHRyYW5zcG9ydF9wcm90b2NvbF9sb2MgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAkaG9zdCA9ICdzc2w6Ly8nIC4gJGhvc3Q7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICRob3N0OworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW5zIGEgbmV3IHNvY2tldCBzZXJ2ZXIgaGFuZGxlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gbGlzdGVuKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5saXN0ZW5lcl8gPSBAc3RyZWFtX3NvY2tldF9zZXJ2ZXIoCisgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8sCisgICAgICAgICAgICAkZXJybm8sCisgICAgICAgICAgICAkZXJyc3RyLAorICAgICAgICAgICAgU1RSRUFNX1NFUlZFUl9CSU5EIHwgU1RSRUFNX1NFUlZFUl9MSVNURU4sCisgICAgICAgICAgICAkdGhpcy0+Y29udGV4dF8KKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhY2NlcHQuIElmIG5vdCBjbGllbnQgaXMgYWNjZXB0ZWQgaW4gdGhlIGdpdmVuIHRpbWUKKyAgICAgKgorICAgICAqIEByZXR1cm4gVFNvY2tldAorICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhY2NlcHRJbXBsKCkKKyAgICB7CisgICAgICAgICRoYW5kbGUgPSBAc3RyZWFtX3NvY2tldF9hY2NlcHQoJHRoaXMtPmxpc3RlbmVyXywgJHRoaXMtPmFjY2VwdFRpbWVvdXRfIC8gMTAwMC4wKTsKKyAgICAgICAgaWYgKCEkaGFuZGxlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgICRzb2NrZXQgPSBuZXcgVFNTTFNvY2tldCgpOworICAgICAgICAkc29ja2V0LT5zZXRIYW5kbGUoJGhhbmRsZSk7CisKKyAgICAgICAgcmV0dXJuICRzb2NrZXQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXIucGhwIGIvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OGMzNzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNlcnZlci5waHAKQEAgLTAsMCArMSwxMDIgQEAKKzw/cGhwCisKK25hbWVzcGFjZSBUaHJpZnRcU2VydmVyOworCit1c2UgVGhyaWZ0XEZhY3RvcnlcVFRyYW5zcG9ydEZhY3Rvcnk7Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFByb3RvY29sRmFjdG9yeTsKKworLyoqCisgKiBHZW5lcmljIGNsYXNzIGZvciBhIFRocmlmdCBzZXJ2ZXIuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnNlcnZlcgorICovCithYnN0cmFjdCBjbGFzcyBUU2VydmVyCit7CisgICAgLyoqCisgICAgICogUHJvY2Vzc29yIHRvIGhhbmRsZSBuZXcgY2xpZW50cworICAgICAqCisgICAgICogQHZhciBUUHJvY2Vzc29yCisgICAgICovCisgICAgcHJvdGVjdGVkICRwcm9jZXNzb3JfOworCisgICAgLyoqCisgICAgICogU2VydmVyIHRyYW5zcG9ydCB0byBiZSB1c2VkIGZvciBsaXN0ZW5pbmcKKyAgICAgKiBhbmQgYWNjZXB0aW5nIG5ldyBjbGllbnRzCisgICAgICoKKyAgICAgKiBAdmFyIFRTZXJ2ZXJUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHRyYW5zcG9ydF87CisKKyAgICAvKioKKyAgICAgKiBJbnB1dCB0cmFuc3BvcnQgZmFjdG9yeQorICAgICAqCisgICAgICogQHZhciBUVHJhbnNwb3J0RmFjdG9yeQorICAgICAqLworICAgIHByb3RlY3RlZCAkaW5wdXRUcmFuc3BvcnRGYWN0b3J5XzsKKworICAgIC8qKgorICAgICAqIE91dHB1dCB0cmFuc3BvcnQgZmFjdG9yeQorICAgICAqCisgICAgICogQHZhciBUVHJhbnNwb3J0RmFjdG9yeQorICAgICAqLworICAgIHByb3RlY3RlZCAkb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV87CisKKyAgICAvKioKKyAgICAgKiBJbnB1dCBwcm90b2NvbCBmYWN0b3J5CisgICAgICoKKyAgICAgKiBAdmFyIFRQcm90b2NvbEZhY3RvcnkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKKworICAgIC8qKgorICAgICAqIE91dHB1dCBwcm90b2NvbCBmYWN0b3J5CisgICAgICoKKyAgICAgKiBAdmFyIFRQcm90b2NvbEZhY3RvcnkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJG91dHB1dFByb3RvY29sRmFjdG9yeV87CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIGFsbCB0aGUgZmFjdG9yaWVzLCBldGMKKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmplY3QgJHByb2Nlc3NvcgorICAgICAqIEBwYXJhbSBUU2VydmVyVHJhbnNwb3J0ICR0cmFuc3BvcnQKKyAgICAgKiBAcGFyYW0gVFRyYW5zcG9ydEZhY3RvcnkgJGlucHV0VHJhbnNwb3J0RmFjdG9yeQorICAgICAqIEBwYXJhbSBUVHJhbnNwb3J0RmFjdG9yeSAkb3V0cHV0VHJhbnNwb3J0RmFjdG9yeQorICAgICAqIEBwYXJhbSBUUHJvdG9jb2xGYWN0b3J5ICRpbnB1dFByb3RvY29sRmFjdG9yeQorICAgICAqIEBwYXJhbSBUUHJvdG9jb2xGYWN0b3J5ICRvdXRwdXRQcm90b2NvbEZhY3RvcnkKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCisgICAgICAgICRwcm9jZXNzb3IsCisgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgJHRyYW5zcG9ydCwKKyAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgJGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgJG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgJGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICBUUHJvdG9jb2xGYWN0b3J5ICRvdXRwdXRQcm90b2NvbEZhY3RvcnkKKyAgICApIHsKKyAgICAgICAgJHRoaXMtPnByb2Nlc3Nvcl8gPSAkcHJvY2Vzc29yOworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0XyA9ICR0cmFuc3BvcnQ7CisgICAgICAgICR0aGlzLT5pbnB1dFRyYW5zcG9ydEZhY3RvcnlfID0gJGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgJHRoaXMtPm91dHB1dFRyYW5zcG9ydEZhY3RvcnlfID0gJG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgICR0aGlzLT5pbnB1dFByb3RvY29sRmFjdG9yeV8gPSAkaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgICR0aGlzLT5vdXRwdXRQcm90b2NvbEZhY3RvcnlfID0gJG91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXJ2ZXMgdGhlIHNlcnZlci4gVGhpcyBzaG91bGQgbmV2ZXIgcmV0dXJuCisgICAgICogdW5sZXNzIGEgcHJvYmxlbSBwZXJtaXRzIGl0IHRvIGRvIHNvIG9yIGl0CisgICAgICogaXMgaW50ZXJydXB0ZWQgaW50ZW50aW9uYWxseQorICAgICAqCisgICAgICogQGFic3RyYWN0CisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHNlcnZlKCk7CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyB0aGUgc2VydmVyIHNlcnZpbmcKKyAgICAgKgorICAgICAqIEBhYnN0cmFjdAorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBzdG9wKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNlcnZlclNvY2tldC5waHAgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNlcnZlclNvY2tldC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYzOGZiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1NlcnZlci9UU2VydmVyU29ja2V0LnBocApAQCAtMCwwICsxLDEyNCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcU2VydmVyOworCit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUU29ja2V0OworCisvKioKKyAqIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZlciBhZ2VudC4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRTZXJ2ZXJTb2NrZXQgZXh0ZW5kcyBUU2VydmVyVHJhbnNwb3J0Cit7CisgICAgLyoqCisgICAgICogSGFuZGxlIGZvciB0aGUgbGlzdGVuZXIgc29ja2V0CisgICAgICoKKyAgICAgKiBAdmFyIHJlc291cmNlCisgICAgICovCisgICAgcHJvdGVjdGVkICRsaXN0ZW5lcl87CisKKyAgICAvKioKKyAgICAgKiBQb3J0IGZvciB0aGUgbGlzdGVuZXIgdG8gbGlzdGVuIG9uCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkcG9ydF87CisKKyAgICAvKioKKyAgICAgKiBUaW1lb3V0IHdoZW4gbGlzdGVuaW5nIGZvciBhIG5ldyBjbGllbnQKKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRhY2NlcHRUaW1lb3V0XyA9IDMwMDAwOworCisgICAgLyoqCisgICAgICogSG9zdCB0byBsaXN0ZW4gb24KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRob3N0XzsKKworICAgIC8qKgorICAgICAqIFNlcnZlclNvY2tldCBjb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBIb3N0IHRvIGxpc3RlbiBvbgorICAgICAqIEBwYXJhbSBpbnQgJHBvcnQgUG9ydCB0byBsaXN0ZW4gb24KKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QgPSAnbG9jYWxob3N0JywgJHBvcnQgPSA5MDkwKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmhvc3RfID0gJGhvc3Q7CisgICAgICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGFjY2VwdCB0aW1lb3V0CisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICRhY2NlcHRUaW1lb3V0CisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldEFjY2VwdFRpbWVvdXQoJGFjY2VwdFRpbWVvdXQpCisgICAgeworICAgICAgICAkdGhpcy0+YWNjZXB0VGltZW91dF8gPSAkYWNjZXB0VGltZW91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVucyBhIG5ldyBzb2NrZXQgc2VydmVyIGhhbmRsZQorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGxpc3RlbigpCisgICAgeworICAgICAgICAkdGhpcy0+bGlzdGVuZXJfID0gc3RyZWFtX3NvY2tldF9zZXJ2ZXIoJ3RjcDovLycgLiAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgc29ja2V0IHNlcnZlciBoYW5kbGUKKyAgICAgKgorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCisgICAgeworICAgICAgICBAZmNsb3NlKCR0aGlzLT5saXN0ZW5lcl8pOworICAgICAgICAkdGhpcy0+bGlzdGVuZXJfID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhY2NlcHQuIElmIG5vdCBjbGllbnQgaXMgYWNjZXB0ZWQgaW4gdGhlIGdpdmVuIHRpbWUKKyAgICAgKgorICAgICAqIEByZXR1cm4gVFNvY2tldAorICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhY2NlcHRJbXBsKCkKKyAgICB7CisgICAgICAgICRoYW5kbGUgPSBAc3RyZWFtX3NvY2tldF9hY2NlcHQoJHRoaXMtPmxpc3RlbmVyXywgJHRoaXMtPmFjY2VwdFRpbWVvdXRfIC8gMTAwMC4wKTsKKyAgICAgICAgaWYgKCEkaGFuZGxlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgICRzb2NrZXQgPSBuZXcgVFNvY2tldCgpOworICAgICAgICAkc29ja2V0LT5zZXRIYW5kbGUoJGhhbmRsZSk7CisKKyAgICAgICAgcmV0dXJuICRzb2NrZXQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXJUcmFuc3BvcnQucGhwIGIvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXJUcmFuc3BvcnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YTI3YWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNlcnZlclRyYW5zcG9ydC5waHAKQEAgLTAsMCArMSw1NiBAQAorPD9waHAKKworbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247CisKKy8qKgorICogR2VuZXJpYyBjbGFzcyBmb3IgU2VydmVyIGFnZW50LgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworYWJzdHJhY3QgY2xhc3MgVFNlcnZlclRyYW5zcG9ydAoreworICAgIC8qKgorICAgICAqIExpc3QgZm9yIG5ldyBjbGllbnRzCisgICAgICoKKyAgICAgKiBAYWJzdHJhY3QKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gbGlzdGVuKCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgc2VydmVyCisgICAgICoKKyAgICAgKiBAYWJzdHJhY3QKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKTsKKworICAgIC8qKgorICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIHVzZSB0aGlzIHRvIGltcGxlbWVudAorICAgICAqIGFjY2VwdC4KKyAgICAgKgorICAgICAqIEBhYnN0cmFjdAorICAgICAqIEByZXR1cm4gVFRyYW5zcG9ydAorICAgICAqLworICAgIGFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiBhY2NlcHRJbXBsKCk7CisKKyAgICAvKioKKyAgICAgKiBVc2VzIHRoZSBhY2NlcHQgaW1wbGVtdGF0aW9uLiBJZiBudWxsIGlzIHJldHVybmVkLCBhbgorICAgICAqIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCkKKyAgICB7CisgICAgICAgICR0cmFuc3BvcnQgPSAkdGhpcy0+YWNjZXB0SW1wbCgpOworCisgICAgICAgIGlmICgkdHJhbnNwb3J0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJhY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHRyYW5zcG9ydDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5waHAgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMxZGRhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1NlcnZlci9UU2ltcGxlU2VydmVyLnBocApAQCAtMCwwICsxLDYwIEBACis8P3BocAorCituYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKKworLyoqCisgKiBTaW1wbGUgaW1wbGVtdGF0aW9uIG9mIGEgVGhyaWZ0IHNlcnZlci4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQuc2VydmVyCisgKi8KK2NsYXNzIFRTaW1wbGVTZXJ2ZXIgZXh0ZW5kcyBUU2VydmVyCit7CisgICAgLyoqCisgICAgICogRmxhZyBmb3IgdGhlIG1haW4gc2VydmluZyBsb29wCisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICRzdG9wXyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogTGlzdGVucyBmb3IgbmV3IGNsaWVudCB1c2luZyB0aGUgc3VwcGxpZWQKKyAgICAgKiB0cmFuc3BvcnQuIEl0IGhhbmRsZXMgVFRyYW5zcG9ydEV4Y2VwdGlvbnMKKyAgICAgKiB0byBhdm9pZCB0aW1lb3V0cyBldGMga2lsbGluZyBpdAorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNlcnZlKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5saXN0ZW4oKTsKKworICAgICAgICB3aGlsZSAoISR0aGlzLT5zdG9wXykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAkdHJhbnNwb3J0ID0gJHRoaXMtPnRyYW5zcG9ydF8tPmFjY2VwdCgpOworCisgICAgICAgICAgICAgICAgaWYgKCR0cmFuc3BvcnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAkaW5wdXRUcmFuc3BvcnQgPSAkdGhpcy0+aW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KCR0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAkb3V0cHV0VHJhbnNwb3J0ID0gJHRoaXMtPm91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoJHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICRpbnB1dFByb3RvY29sID0gJHRoaXMtPmlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woJGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgJG91dHB1dFByb3RvY29sID0gJHRoaXMtPm91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKCRvdXRwdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoJHRoaXMtPnByb2Nlc3Nvcl8tPnByb2Nlc3MoJGlucHV0UHJvdG9jb2wsICRvdXRwdXRQcm90b2NvbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3BzIHRoZSBzZXJ2ZXIgcnVubmluZy4gS2lsbHMgdGhlIHRyYW5zcG9ydAorICAgICAqIGFuZCB0aGVuIHN0b3BzIHRoZSBtYWluIHNlcnZpbmcgbG9vcAorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHN0b3AoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7CisgICAgICAgICR0aGlzLT5zdG9wXyA9IHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU3RvcmVkTWVzc2FnZVByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1N0b3JlZE1lc3NhZ2VQcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhYWFhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1N0b3JlZE1lc3NhZ2VQcm90b2NvbC5waHAKQEAgLTAsMCArMSw1MyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb2Nlc3NvcgorICovCisKK25hbWVzcGFjZSBUaHJpZnQ7CisKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sOwordXNlIFRocmlmdFxQcm90b2NvbFxUUHJvdG9jb2xEZWNvcmF0b3I7CisKKy8qKgorICogIE91ciBnb2FsIHdhcyB0byB3b3JrIHdpdGggYW55IHByb3RvY29sLiBJbiBvcmRlciB0byBkbyB0aGF0LCB3ZSBuZWVkZWQKKyAqICB0byBhbGxvdyB0aGVtIHRvIGNhbGwgcmVhZE1lc3NhZ2VCZWdpbigpIGFuZCBnZXQgdGhlIE1lc3NhZ2UgaW4gZXhhY3RseQorICogIHRoZSBzdGFuZGFyZCBmb3JtYXQsIHdpdGhvdXQgdGhlIHNlcnZpY2UgbmFtZSBwcmVwZW5kZWQgdG8gdGhlIE1lc3NhZ2UgbmFtZS4KKyAqLworY2xhc3MgU3RvcmVkTWVzc2FnZVByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sRGVjb3JhdG9yCit7CisgICAgcHJpdmF0ZSAkZm5hbWVfOworICAgIHByaXZhdGUgJG10eXBlXzsKKyAgICBwcml2YXRlICRyc2VxaWRfOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFRQcm90b2NvbCAkcHJvdG9jb2wsICRmbmFtZSwgJG10eXBlLCAkcnNlcWlkKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkcHJvdG9jb2wpOworICAgICAgICAkdGhpcy0+Zm5hbWVfICA9ICRmbmFtZTsKKyAgICAgICAgJHRoaXMtPm10eXBlXyAgPSAkbXR5cGU7CisgICAgICAgICR0aGlzLT5yc2VxaWRfID0gJHJzZXFpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCkKKyAgICB7CisgICAgICAgICRuYW1lICA9ICR0aGlzLT5mbmFtZV87CisgICAgICAgICR0eXBlICA9ICR0aGlzLT5tdHlwZV87CisgICAgICAgICRzZXFpZCA9ICR0aGlzLT5yc2VxaWRfOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1N0cmluZ0Z1bmMvQ29yZS5waHAgYi9saWIvcGhwL2xpYi9TdHJpbmdGdW5jL0NvcmUucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YTc1YjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TdHJpbmdGdW5jL0NvcmUucGhwCkBAIC0wLDAgKzEsNDAgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFN0cmluZ0Z1bmM7CisKK2NsYXNzIENvcmUgaW1wbGVtZW50cyBUU3RyaW5nRnVuYworeworICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoID0gbnVsbCkKKyAgICB7CisgICAgICAgIC8vIHNwZWNpZnlpbmcgYSBudWxsICRsZW5ndGggd291bGQgcmV0dXJuIGFuIGVtcHR5IHN0cmluZworICAgICAgICBpZiAoJGxlbmd0aCA9PT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHN1YnN0cigkc3RyLCAkc3RhcnQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN1YnN0cigkc3RyLCAkc3RhcnQsICRsZW5ndGgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJsZW4oJHN0cikKKyAgICB7CisgICAgICAgIHJldHVybiBzdHJsZW4oJHN0cik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU3RyaW5nRnVuYy9NYnN0cmluZy5waHAgYi9saWIvcGhwL2xpYi9TdHJpbmdGdW5jL01ic3RyaW5nLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjhmZjE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU3RyaW5nRnVuYy9NYnN0cmluZy5waHAKQEAgLTAsMCArMSw0NiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK25hbWVzcGFjZSBUaHJpZnRcU3RyaW5nRnVuYzsKKworY2xhc3MgTWJzdHJpbmcgaW1wbGVtZW50cyBUU3RyaW5nRnVuYworeworICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoID0gbnVsbCkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBXZSBuZWVkIHRvIHNldCB0aGUgY2hhcnNldCBwYXJhbWV0ZXIsIHdoaWNoIGlzIHRoZSBzZWNvbmQKKyAgICAgICAgICogb3B0aW9uYWwgcGFyYW1ldGVyIGFuZCB0aGUgZmlyc3Qgb3B0aW9uYWwgcGFyYW1ldGVyIGNhbid0CisgICAgICAgICAqIGJlIG51bGwgb3IgZmFsc2UgYXMgYSAibWFnaWMiIHZhbHVlIGJlY2F1c2UgdGhhdCB3b3VsZAorICAgICAgICAgKiBjYXVzZSBhbiBlbXB0eSBzdHJpbmcgdG8gYmUgcmV0dXJuZWQsIHNvIHdlIG5lZWQgdG8KKyAgICAgICAgICogYWN0dWFsbHkgY2FsY3VsYXRlIHRoZSBwcm9wZXIgbGVuZ3RoIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCRsZW5ndGggPT09IG51bGwpIHsKKyAgICAgICAgICAgICRsZW5ndGggPSAkdGhpcy0+c3RybGVuKCRzdHIpIC0gJHN0YXJ0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1iX3N1YnN0cigkc3RyLCAkc3RhcnQsICRsZW5ndGgsICc4Yml0Jyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHN0cmxlbigkc3RyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1iX3N0cmxlbigkc3RyLCAnOGJpdCcpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1N0cmluZ0Z1bmMvVFN0cmluZ0Z1bmMucGhwIGIvbGliL3BocC9saWIvU3RyaW5nRnVuYy9UU3RyaW5nRnVuYy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhNDk3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1N0cmluZ0Z1bmMvVFN0cmluZ0Z1bmMucGhwCkBAIC0wLDAgKzEsMjggQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFN0cmluZ0Z1bmM7CisKK2ludGVyZmFjZSBUU3RyaW5nRnVuYworeworICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoID0gbnVsbCk7CisgICAgcHVibGljIGZ1bmN0aW9uIHN0cmxlbigkc3RyKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5waHAgYi9saWIvcGhwL2xpYi9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NGE5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucGhwCkBAIC0wLDAgKzEsMTE4IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvY2Vzc29yCisgKi8KKworbmFtZXNwYWNlIFRocmlmdDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sOwordXNlIFRocmlmdFxQcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbDsKK3VzZSBUaHJpZnRcVHlwZVxUTWVzc2FnZVR5cGU7CisKKy8qKgorICogPGNvZGU+VE11bHRpcGxleGVkUHJvY2Vzc29yPC9jb2RlPiBpcyBhIFByb2Nlc3NvciBhbGxvd2luZworICogYSBzaW5nbGUgPGNvZGU+VFNlcnZlcjwvY29kZT4gdG8gcHJvdmlkZSBtdWx0aXBsZSBzZXJ2aWNlcy4KKyAqCisgKiA8cD5UbyBkbyBzbywgeW91IGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gcmVnaXN0ZXIgYWRkaXRpb25hbAorICogcHJvY2Vzc29ycyB3aXRoIGl0LCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6PC9wPgorICoKKyAqIDxibG9ja3F1b3RlPjxjb2RlPgorICogICAgICRwcm9jZXNzb3IgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgKgorICogICAgIHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoCisgKiAgICAgICAgICJDYWxjdWxhdG9yIiwKKyAqICAgICAgICAgbmV3IFx0dXRvcmlhbFxDYWxjdWxhdG9yUHJvY2Vzc29yKG5ldyBDYWxjdWxhdG9ySGFuZGxlcigpKSk7CisgKgorICogICAgIHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoCisgKiAgICAgICAgICJXZWF0aGVyUmVwb3J0IiwKKyAqICAgICAgICAgbmV3IFx0dXRvcmlhbFxXZWF0aGVyUmVwb3J0UHJvY2Vzc29yKG5ldyBXZWF0aGVyUmVwb3J0SGFuZGxlcigpKSk7CisgKgorICogICAgICRwcm9jZXNzb3ItPnByb2Nlc3MoJHByb3RvY29sLCAkcHJvdG9jb2wpOworICogPC9jb2RlPjwvYmxvY2txdW90ZT4KKyAqLworCitjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IKK3sKKyAgICBwcml2YXRlICRzZXJ2aWNlUHJvY2Vzc29yTWFwXzsKKworICAgIC8qKgorICAgICAqICdSZWdpc3RlcicgYSBzZXJ2aWNlIHdpdGggdGhpcyA8Y29kZT5UTXVsdGlwbGV4ZWRQcm9jZXNzb3I8L2NvZGU+LiAgVGhpcworICAgICAqIGFsbG93cyB1cyB0byBicm9rZXIgcmVxdWVzdHMgdG8gaW5kaXZpZHVhbCBzZXJ2aWNlcyBieSB1c2luZyB0aGUgc2VydmljZQorICAgICAqIG5hbWUgdG8gc2VsZWN0IHRoZW0gYXQgcmVxdWVzdCB0aW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIE5hbWUgb2YgYSBzZXJ2aWNlLCBoYXMgdG8gYmUgaWRlbnRpY2FsIHRvIHRoZSBuYW1lCisgICAgICogZGVjbGFyZWQgaW4gdGhlIFRocmlmdCBJREwsIGUuZy4gIldlYXRoZXJSZXBvcnQiLgorICAgICAqIEBwYXJhbSBwcm9jZXNzb3IgSW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2aWNlLCB1c3VhbGx5IHJlZmVycmVkIHRvCisgICAgICogYXMgImhhbmRsZXJzIiwgZS5nLiBXZWF0aGVyUmVwb3J0SGFuZGxlciBpbXBsZW1lbnRpbmcgV2VhdGhlclJlcG9ydC5JZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXJQcm9jZXNzb3IoJHNlcnZpY2VOYW1lLCAkcHJvY2Vzc29yKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnNlcnZpY2VQcm9jZXNzb3JNYXBfWyRzZXJ2aWNlTmFtZV0gPSAkcHJvY2Vzc29yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+cHJvY2VzczwvY29kZT4gcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKyAgICAgKgorICAgICAqIDxvbD4KKyAgICAgKiAgICAgPGxpPlJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZS48L2xpPgorICAgICAqICAgICA8bGk+RXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIG1lc3NhZ2UuPC9saT4KKyAgICAgKiAgICAgPGxpPlVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IuPC9saT4KKyAgICAgKiAgICAgPGxpPkRpc3BhdGNoIHRvIHRoZSBwcm9jZXNzb3IsIHdpdGggYSBkZWNvcmF0ZWQgaW5zdGFuY2Ugb2YgVFByb3RvY29sCisgICAgICogICAgICAgICB0aGF0IGFsbG93cyByZWFkTWVzc2FnZUJlZ2luKCkgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCBNZXNzYWdlLjwvbGk+CisgICAgICogPC9vbD4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBJZiB0aGUgbWVzc2FnZSB0eXBlIGlzIG5vdCBDQUxMIG9yIE9ORVdBWSwgaWYKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIHNlcnZpY2UgbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBtZXNzYWdlLCBvciBpZiB0aGUgc2VydmljZQorICAgICAqICAgICAgICAgICAgICAgICAgICBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIHNlcnZpY2UgbWFwLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKFRQcm90b2NvbCAkaW5wdXQsIFRQcm90b2NvbCAkb3V0cHV0KQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICAgIFVzZSB0aGUgYWN0dWFsIHVuZGVybHlpbmcgcHJvdG9jb2wgKGUuZy4gVEJpbmFyeVByb3RvY29sKSB0byByZWFkIHRoZQorICAgICAgICAgICAgbWVzc2FnZSBoZWFkZXIuIFRoaXMgcHVsbHMgdGhlIG1lc3NhZ2UgIm9mZiB0aGUgd2lyZSIsIHdoaWNoIHdlJ2xsCisgICAgICAgICAgICBkZWFsIHdpdGggYXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZC4KKyAgICAgICAgKi8KKyAgICAgICAgJGlucHV0LT5yZWFkTWVzc2FnZUJlZ2luKCRmbmFtZSwgJG10eXBlLCAkcnNlcWlkKTsKKworICAgICAgICBpZiAoJG10eXBlICE9PSBUTWVzc2FnZVR5cGU6OkNBTEwgJiYgJG10eXBlICE9IFRNZXNzYWdlVHlwZTo6T05FV0FZKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiVGhpcyBzaG91bGQgbm90IGhhdmUgaGFwcGVuZWQhPyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGFuZCB0aGUgbmV3IE1lc3NhZ2UgbmFtZS4KKyAgICAgICAgaWYgKHN0cnBvcygkZm5hbWUsIFRNdWx0aXBsZXhlZFByb3RvY29sOjpTRVBBUkFUT1IpID09PSBmYWxzZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiB7JGZuYW1lfS4gRGlkIHlvdSAiIC4KKyAgICAgICAgICAgICAgICAiZm9yZ2V0IHRvIHVzZSBhIFRNdWx0aXBsZXhQcm90b2NvbCBpbiB5b3VyIGNsaWVudD8iKTsKKyAgICAgICAgfQorICAgICAgICBsaXN0KCRzZXJ2aWNlTmFtZSwgJG1lc3NhZ2VOYW1lKSA9IGV4cGxvZGUoJzonLCAkZm5hbWUsIDIpOworICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJHNlcnZpY2VOYW1lLCAkdGhpcy0+c2VydmljZVByb2Nlc3Nvck1hcF8pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogeyRzZXJ2aWNlTmFtZX0uICBEaWQgeW91IGZvcmdldCAiIC4KKyAgICAgICAgICAgICAgICAidG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGlzcGF0Y2ggcHJvY2Vzc2luZyB0byB0aGUgc3RvcmVkIHByb2Nlc3NvcgorICAgICAgICAkcHJvY2Vzc29yID0gJHRoaXMtPnNlcnZpY2VQcm9jZXNzb3JNYXBfWyRzZXJ2aWNlTmFtZV07CisKKyAgICAgICAgcmV0dXJuICRwcm9jZXNzb3ItPnByb2Nlc3MoCisgICAgICAgICAgICBuZXcgU3RvcmVkTWVzc2FnZVByb3RvY29sKCRpbnB1dCwgJG1lc3NhZ2VOYW1lLCAkbXR5cGUsICRyc2VxaWQpLAorICAgICAgICAgICAgJG91dHB1dAorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzYzVhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwCkBAIC0wLDAgKzEsMjA2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIEJ1ZmZlcmVkIHRyYW5zcG9ydC4gU3RvcmVzIGRhdGEgdG8gYW4gaW50ZXJuYWwgYnVmZmVyIHRoYXQgaXQgZG9lc24ndAorICogYWN0dWFsbHkgd3JpdGUgb3V0IHVudGlsIGZsdXNoIGlzIGNhbGxlZC4gRm9yIHJlYWRpbmcsIHdlIGRvIGEgZ3JlZWR5CisgKiByZWFkIGFuZCB0aGVuIHNlcnZlIGRhdGEgb3V0IG9mIHRoZSBpbnRlcm5hbCBidWZmZXIuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0Cit7CisgICAgLyoqCisgICAgICogVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICoKKyAgICAgKiBAdmFyIFRUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHRyYW5zcG9ydF87CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVjZWl2ZSBidWZmZXIgc2l6ZQorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHJCdWZTaXplXyA9IDUxMjsKKworICAgIC8qKgorICAgICAqIFRoZSB3cml0ZSBidWZmZXIgc2l6ZQorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHdCdWZTaXplXyA9IDUxMjsKKworICAgIC8qKgorICAgICAqIFRoZSB3cml0ZSBidWZmZXIuCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkd0J1Zl8gPSAnJzsKKworICAgIC8qKgorICAgICAqIFRoZSByZWFkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRyQnVmXyA9ICcnOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIENyZWF0ZXMgYSBidWZmZXJlZCB0cmFuc3BvcnQgYXJvdW5kIGFuIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFuc3BvcnQsICRyQnVmU2l6ZSA9IDUxMiwgJHdCdWZTaXplID0gNTEyKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8gPSAkdHJhbnNwb3J0OworICAgICAgICAkdGhpcy0+ckJ1ZlNpemVfID0gJHJCdWZTaXplOworICAgICAgICAkdGhpcy0+d0J1ZlNpemVfID0gJHdCdWZTaXplOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5pc09wZW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdGRvYworICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPm9wZW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHB1dEJhY2soJGRhdGEpCisgICAgeworICAgICAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPT09IDApIHsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICRkYXRhOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gKCRkYXRhIC4gJHRoaXMtPnJCdWZfKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSByZWFzb24gdGhhdCB3ZSBjdXN0b21pemUgcmVhZEFsbCBoZXJlIGlzIHRoYXQgdGhlIG1ham9yaXR5IG9mIFBIUAorICAgICAqIHN0cmVhbXMgYXJlIGFscmVhZHkgaW50ZXJuYWxseSBidWZmZXJlZCBieSBQSFAuIFRoZSBzb2NrZXQgc3RyZWFtLCBmb3IKKyAgICAgKiBleGFtcGxlLCBidWZmZXJzIGludGVybmFsbHkgYW5kIGJsb2NrcyBpZiB5b3UgY2FsbCByZWFkIHdpdGggJGxlbiBncmVhdGVyCisgICAgICogdGhhbiB0aGUgYW1vdW50IG9mIGRhdGEgYXZhaWxhYmxlLCB1bmxpa2UgcmVjdigpIGluIEMuCisgICAgICoKKyAgICAgKiBUaGVyZWZvcmUsIHVzZSB0aGUgcmVhZEFsbCBtZXRob2Qgb2YgdGhlIHdyYXBwZWQgdHJhbnNwb3J0IGluc2lkZQorICAgICAqIHRoZSBidWZmZXJlZCByZWFkQWxsLgorICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRBbGwoJGxlbikKKyAgICB7CisgICAgICAgICRoYXZlID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXyk7CisgICAgICAgIGlmICgkaGF2ZSA9PSAwKSB7CisgICAgICAgICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKCRsZW4pOworICAgICAgICB9IGVsc2VpZiAoJGhhdmUgPCAkbGVuKSB7CisgICAgICAgICAgICAkZGF0YSA9ICR0aGlzLT5yQnVmXzsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICcnOworICAgICAgICAgICAgJGRhdGEgLj0gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWRBbGwoJGxlbiAtICRoYXZlKTsKKyAgICAgICAgfSBlbHNlaWYgKCRoYXZlID09ICRsZW4pIHsKKyAgICAgICAgICAgICRkYXRhID0gJHRoaXMtPnJCdWZfOworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gJyc7CisgICAgICAgIH0gZWxzZWlmICgkaGF2ZSA+ICRsZW4pIHsKKyAgICAgICAgICAgICRkYXRhID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgMCwgJGxlbik7CisgICAgICAgICAgICAkdGhpcy0+ckJ1Zl8gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAkbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkZGF0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdGRvYworICAgICAqCisgICAgICogQHBhcmFtIGludCAkbGVuCisgICAgICogQHJldHVybiBzdHJpbmcKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQorICAgIHsKKyAgICAgICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7CisgICAgICAgICAgICAkdGhpcy0+ckJ1Zl8gPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZCgkdGhpcy0+ckJ1ZlNpemVfKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSA8PSAkbGVuKSB7CisgICAgICAgICAgICAkcmV0ID0gJHRoaXMtPnJCdWZfOworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gJyc7CisKKyAgICAgICAgICAgIHJldHVybiAkcmV0OworICAgICAgICB9CisKKyAgICAgICAgJHJldCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkdGhpcy0+ckJ1Zl8sIDAsICRsZW4pOworICAgICAgICAkdGhpcy0+ckJ1Zl8gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAkbGVuKTsKKworICAgICAgICByZXR1cm4gJHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdGRvYworICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkYnVmCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpCisgICAgeworICAgICAgICAkdGhpcy0+d0J1Zl8gLj0gJGJ1ZjsKKyAgICAgICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+d0J1Zl8pID49ICR0aGlzLT53QnVmU2l6ZV8pIHsKKyAgICAgICAgICAgICRvdXQgPSAkdGhpcy0+d0J1Zl87CisKKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjbGVhciB0aGUgaW50ZXJuYWwgd0J1Zl8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUKKyAgICAgICAgICAgIC8vIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUgKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpCisgICAgICAgICAgICAvLyBpZiB0aGUgdW5kZXJseWluZyB3cml0ZSB0aHJvd3MgdXAgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICAkdGhpcy0+d0J1Zl8gPSAnJzsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT53cml0ZSgkb3V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBpbmhlcml0ZG9jCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKQorICAgIHsKKyAgICAgICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+d0J1Zl8pID4gMCkgeworICAgICAgICAgICAgJG91dCA9ICR0aGlzLT53QnVmXzsKKworICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGNsZWFyIHRoZSBpbnRlcm5hbCB3QnVmXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQorICAgICAgICAgICAgLy8gdG8gZW5zdXJlIHdlJ3JlIGluIGEgc2FuZSBzdGF0ZSAoaS5lLiBpbnRlcm5hbCBidWZmZXIgY2xlYW5lZCkKKyAgICAgICAgICAgIC8vIGlmIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRocm93cyB1cCBhbiBleGNlcHRpb24KKyAgICAgICAgICAgICR0aGlzLT53QnVmXyA9ICcnOworICAgICAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPndyaXRlKCRvdXQpOworICAgICAgICB9CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5mbHVzaCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UQ3VybENsaWVudC5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEN1cmxDbGllbnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MmI0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEN1cmxDbGllbnQucGhwCkBAIC0wLDAgKzEsMjc2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIEhUVFAgY2xpZW50IGZvciBUaHJpZnQKKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRDdXJsQ2xpZW50IGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIHByaXZhdGUgc3RhdGljICRjdXJsSGFuZGxlOworCisgICAgLyoqCisgICAgICogVGhlIGhvc3QgdG8gY29ubmVjdCB0bworICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGhvc3RfOworCisgICAgLyoqCisgICAgICogVGhlIHBvcnQgdG8gY29ubmVjdCBvbgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHBvcnRfOworCisgICAgLyoqCisgICAgICogVGhlIFVSSSB0byByZXF1ZXN0CisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkdXJpXzsKKworICAgIC8qKgorICAgICAqIFRoZSBzY2hlbWUgdG8gdXNlIGZvciB0aGUgcmVxdWVzdCwgaS5lLiBodHRwLCBodHRwcworICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHNjaGVtZV87CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgZm9yIHRoZSBIVFRQIHJlcXVlc3QgZGF0YQorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHJlcXVlc3RfOworCisgICAgLyoqCisgICAgICogQnVmZmVyIGZvciB0aGUgSFRUUCByZXNwb25zZSBkYXRhLgorICAgICAqCisgICAgICogQHZhciBiaW5hcnkgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRyZXNwb25zZV87CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRpbWVvdXQKKyAgICAgKgorICAgICAqIEB2YXIgZmxvYXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHRpbWVvdXRfOworCisgICAgLyoqCisgICAgICogaHR0cCBoZWFkZXJzCisgICAgICoKKyAgICAgKiBAdmFyIGFycmF5CisgICAgICovCisgICAgcHJvdGVjdGVkICRoZWFkZXJzXzsKKworICAgIC8qKgorICAgICAqIE1ha2UgYSBuZXcgSFRUUCBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0CisgICAgICogQHBhcmFtIGludCAkcG9ydAorICAgICAqIEBwYXJhbSBzdHJpbmcgJHVyaQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaG9zdCwgJHBvcnQgPSA4MCwgJHVyaSA9ICcnLCAkc2NoZW1lID0gJ2h0dHAnKQorICAgIHsKKyAgICAgICAgaWYgKChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHVyaSkgPiAwKSAmJiAoJHVyaXswfSAhPSAnLycpKSB7CisgICAgICAgICAgICAkdXJpID0gJy8nIC4gJHVyaTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+c2NoZW1lXyA9ICRzY2hlbWU7CisgICAgICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OworICAgICAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKKyAgICAgICAgJHRoaXMtPnVyaV8gPSAkdXJpOworICAgICAgICAkdGhpcy0+cmVxdWVzdF8gPSAnJzsKKyAgICAgICAgJHRoaXMtPnJlc3BvbnNlXyA9IG51bGw7CisgICAgICAgICR0aGlzLT50aW1lb3V0XyA9IG51bGw7CisgICAgICAgICR0aGlzLT5oZWFkZXJzXyA9IGFycmF5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHJlYWQgdGltZW91dAorICAgICAqCisgICAgICogQHBhcmFtIGZsb2F0ICR0aW1lb3V0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFRpbWVvdXRTZWNzKCR0aW1lb3V0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRpbWVvdXRfID0gJHRpbWVvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgorICAgICAqCisgICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgb3BlbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbiB0aGUgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcKKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3Qgb3BlbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlcXVlc3RfID0gJyc7CisgICAgICAgICR0aGlzLT5yZXNwb25zZV8gPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgc29tZSBkYXRhIGludG8gdGhlIGFycmF5LgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbGVuIEhvdyBtdWNoIHRvIHJlYWQKKyAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YSB0aGF0IGhhcyBiZWVuIHJlYWQKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IHJlYWQgYW55IG1vcmUgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCisgICAgeworICAgICAgICBpZiAoJGxlbiA+PSBzdHJsZW4oJHRoaXMtPnJlc3BvbnNlXykpIHsKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVzcG9uc2VfOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHJldCA9IHN1YnN0cigkdGhpcy0+cmVzcG9uc2VfLCAwLCAkbGVuKTsKKyAgICAgICAgICAgICR0aGlzLT5yZXNwb25zZV8gPSBzdWJzdHIoJHRoaXMtPnJlc3BvbnNlXywgJGxlbik7CisKKyAgICAgICAgICAgIHJldHVybiAkcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR3VhcmFudGVlcyB0aGF0IHRoZSBmdWxsIGFtb3VudCBvZiBkYXRhIGlzIHJlYWQuIFNpbmNlIFRDdXJsQ2xpZW50IGdldHMgZW50aXJlIHBheWxvYWQgYXQKKyAgICAgKiBvbmNlLCBwYXJlbnQgcmVhZEFsbCBjYW5ub3QgYmUgdXNlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhLCBvZiBleGFjdCBsZW5ndGgKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IHJlYWQgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQWxsKCRsZW4pCisgICAgeworICAgICAgICAkZGF0YSA9ICR0aGlzLT5yZWFkKCRsZW4pOworCisgICAgICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGRhdGEpICE9PSAkbGVuKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVEN1cmxDbGllbnQgY291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMnKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkZGF0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgc29tZSBkYXRhIGludG8gdGhlIHBlbmRpbmcgYnVmZmVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRidWYgVGhlIGRhdGEgdG8gd3JpdGUKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgd3JpdGluZyBmYWlscworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlcXVlc3RfIC49ICRidWY7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbnMgYW5kIHNlbmRzIHRoZSBhY3R1YWwgcmVxdWVzdCBvdmVyIHRoZSBIVFRQIGNvbm5lY3Rpb24KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhIHdyaXRpbmcgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgICAgIGlmICghc2VsZjo6JGN1cmxIYW5kbGUpIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyX3NodXRkb3duX2Z1bmN0aW9uKGFycmF5KCdUaHJpZnRcXFRyYW5zcG9ydFxcVEN1cmxDbGllbnQnLCAnY2xvc2VDdXJsSGFuZGxlJykpOworICAgICAgICAgICAgc2VsZjo6JGN1cmxIYW5kbGUgPSBjdXJsX2luaXQoKTsKKyAgICAgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCB0cnVlKTsKKyAgICAgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX0JJTkFSWVRSQU5TRkVSLCB0cnVlKTsKKyAgICAgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX1VTRVJBR0VOVCwgJ1BIUC9UQ3VybENsaWVudCcpOworICAgICAgICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgJ1BPU1QnKTsKKyAgICAgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCB0cnVlKTsKKyAgICAgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX01BWFJFRElSUywgMSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gR29kLCBQSFAgcmVhbGx5IGhhcyBzb21lIGVzb3RlcmljIHdheXMgb2YgZG9pbmcgc2ltcGxlIHRoaW5ncy4KKyAgICAgICAgJGhvc3QgPSAkdGhpcy0+aG9zdF8gLiAoJHRoaXMtPnBvcnRfICE9IDgwID8gJzonIC4gJHRoaXMtPnBvcnRfIDogJycpOworICAgICAgICAkZnVsbFVybCA9ICR0aGlzLT5zY2hlbWVfIC4gIjovLyIgLiAkaG9zdCAuICR0aGlzLT51cmlfOworCisgICAgICAgICRoZWFkZXJzID0gYXJyYXkoKTsKKyAgICAgICAgJGRlZmF1bHRIZWFkZXJzID0gYXJyYXkoJ0FjY2VwdCcgPT4gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JywKKyAgICAgICAgICAgICdDb250ZW50LVR5cGUnID0+ICdhcHBsaWNhdGlvbi94LXRocmlmdCcsCisgICAgICAgICAgICAnQ29udGVudC1MZW5ndGgnID0+IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+cmVxdWVzdF8pKTsKKyAgICAgICAgZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJGRlZmF1bHRIZWFkZXJzLCAkdGhpcy0+aGVhZGVyc18pIGFzICRrZXkgPT4gJHZhbHVlKSB7CisgICAgICAgICAgICAkaGVhZGVyc1tdID0gIiRrZXk6ICR2YWx1ZSI7CisgICAgICAgIH0KKworICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9IVFRQSEVBREVSLCAkaGVhZGVycyk7CisKKyAgICAgICAgaWYgKCR0aGlzLT50aW1lb3V0XyA+IDApIHsKKyAgICAgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX1RJTUVPVVQsICR0aGlzLT50aW1lb3V0Xyk7CisgICAgICAgIH0KKyAgICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfUE9TVEZJRUxEUywgJHRoaXMtPnJlcXVlc3RfKTsKKyAgICAgICAgJHRoaXMtPnJlcXVlc3RfID0gJyc7CisKKyAgICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfVVJMLCAkZnVsbFVybCk7CisgICAgICAgICR0aGlzLT5yZXNwb25zZV8gPSBjdXJsX2V4ZWMoc2VsZjo6JGN1cmxIYW5kbGUpOworICAgICAgICAkcmVzcG9uc2VFcnJvciA9IGN1cmxfZXJyb3Ioc2VsZjo6JGN1cmxIYW5kbGUpOworCisgICAgICAgICRjb2RlID0gY3VybF9nZXRpbmZvKHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMSU5GT19IVFRQX0NPREUpOworCisgICAgICAgIC8vIEhhbmRsZSBub24gMjAwIHN0YXR1cyBjb2RlIC8gY29ubmVjdCBmYWlsdXJlCisgICAgICAgIGlmICgkdGhpcy0+cmVzcG9uc2VfID09PSBmYWxzZSB8fCAkY29kZSAhPT0gMjAwKSB7CisgICAgICAgICAgICBjdXJsX2Nsb3NlKHNlbGY6OiRjdXJsSGFuZGxlKTsKKyAgICAgICAgICAgIHNlbGY6OiRjdXJsSGFuZGxlID0gbnVsbDsKKyAgICAgICAgICAgICR0aGlzLT5yZXNwb25zZV8gPSBudWxsOworICAgICAgICAgICAgJGVycm9yID0gJ1RDdXJsQ2xpZW50OiBDb3VsZCBub3QgY29ubmVjdCB0byAnIC4gJGZ1bGxVcmw7CisgICAgICAgICAgICBpZiAoJHJlc3BvbnNlRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAkZXJyb3IgLj0gJywgJyAuICRyZXNwb25zZUVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCRjb2RlKSB7CisgICAgICAgICAgICAgICAgJGVycm9yIC49ICcsIEhUVFAgc3RhdHVzIGNvZGU6ICcgLiAkY29kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCRlcnJvciwgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNsb3NlQ3VybEhhbmRsZSgpCisgICAgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHNlbGY6OiRjdXJsSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgY3VybF9jbG9zZShzZWxmOjokY3VybEhhbmRsZSk7CisgICAgICAgICAgICAgICAgc2VsZjo6JGN1cmxIYW5kbGUgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChcRXhjZXB0aW9uICR4KSB7CisgICAgICAgICAgICBlcnJvcl9sb2coJ1RoZXJlIHdhcyBhbiBlcnJvciBjbG9zaW5nIHRoZSBjdXJsIGhhbmRsZTogJyAuICR4LT5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZEhlYWRlcnMoJGhlYWRlcnMpCisgICAgeworICAgICAgICAkdGhpcy0+aGVhZGVyc18gPSBhcnJheV9tZXJnZSgkdGhpcy0+aGVhZGVyc18sICRoZWFkZXJzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlkMTg2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocApAQCAtMCwwICsxLDE5MiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIEZyYW1lZCB0cmFuc3BvcnQuIFdyaXRlcyBhbmQgcmVhZHMgZGF0YSBpbiBjaHVua3MgdGhhdCBhcmUgc3RhbXBlZCB3aXRoCisgKiB0aGVpciBsZW5ndGguCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBURnJhbWVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIC8qKgorICAgICAqIFVuZGVybHlpbmcgdHJhbnNwb3J0IG9iamVjdC4KKyAgICAgKgorICAgICAqIEB2YXIgVFRyYW5zcG9ydAorICAgICAqLworICAgIHByaXZhdGUgJHRyYW5zcG9ydF87CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgZm9yIHJlYWQgZGF0YS4KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSAkckJ1Zl87CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgZm9yIHF1ZXVlZCBvdXRwdXQgZGF0YQorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlICR3QnVmXzsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gZnJhbWUgcmVhZHMKKyAgICAgKgorICAgICAqIEB2YXIgYm9vbAorICAgICAqLworICAgIHByaXZhdGUgJHJlYWRfOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBmcmFtZSB3cml0ZXMKKyAgICAgKgorICAgICAqIEB2YXIgYm9vbAorICAgICAqLworICAgIHByaXZhdGUgJHdyaXRlXzsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIFRUcmFuc3BvcnQgJHRyYW5zcG9ydCBVbmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnNwb3J0ID0gbnVsbCwgJHJlYWQgPSB0cnVlLCAkd3JpdGUgPSB0cnVlKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8gPSAkdHJhbnNwb3J0OworICAgICAgICAkdGhpcy0+cmVhZF8gPSAkcmVhZDsKKyAgICAgICAgJHRoaXMtPndyaXRlXyA9ICR3cml0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+aXNPcGVuKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPm9wZW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgZnJvbSB0aGUgYnVmZmVyLiBXaGVuIG1vcmUgZGF0YSBpcyByZXF1aXJlZCByZWFkcyBhbm90aGVyIGVudGlyZQorICAgICAqIGNodW5rIGFuZCBzZXJ2ZXMgZnV0dXJlIHJlYWRzIG91dCBvZiB0aGF0LgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbGVuIEhvdyBtdWNoIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQorICAgIHsKKyAgICAgICAgaWYgKCEkdGhpcy0+cmVhZF8pIHsKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZCgkbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSA9PT0gMCkgeworICAgICAgICAgICAgJHRoaXMtPnJlYWRGcmFtZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSnVzdCByZXR1cm4gZnVsbCBidWZmCisgICAgICAgIGlmICgkbGVuID49IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pKSB7CisgICAgICAgICAgICAkb3V0ID0gJHRoaXMtPnJCdWZfOworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gbnVsbDsKKworICAgICAgICAgICAgcmV0dXJuICRvdXQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyCisgICAgICAgICRvdXQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAwLCAkbGVuKTsKKyAgICAgICAgJHRoaXMtPnJCdWZfID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgJGxlbik7CisKKyAgICAgICAgcmV0dXJuICRvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0IHByZXZpb3VzbHkgcmVhZCBkYXRhIGJhY2sgaW50byB0aGUgYnVmZmVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRkYXRhIGRhdGEgdG8gcmV0dXJuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHB1dEJhY2soJGRhdGEpCisgICAgeworICAgICAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPT09IDApIHsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICRkYXRhOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gKCRkYXRhIC4gJHRoaXMtPnJCdWZfKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgY2h1bmsgb2YgZGF0YSBpbnRvIHRoZSBpbnRlcm5hbCByZWFkIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRGcmFtZSgpCisgICAgeworICAgICAgICAkYnVmID0gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWRBbGwoNCk7CisgICAgICAgICR2YWwgPSB1bnBhY2soJ04nLCAkYnVmKTsKKyAgICAgICAgJHN6ID0gJHZhbFsxXTsKKworICAgICAgICAkdGhpcy0+ckJ1Zl8gPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCgkc3opOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBzb21lIGRhdGEgdG8gdGhlIHBlbmRpbmcgb3V0cHV0IGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiBUaGUgZGF0YQorICAgICAqIEBwYXJhbSBpbnQgJGxlbiBMaW1pdCBvZiBieXRlcyB0byB3cml0ZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmLCAkbGVuID0gbnVsbCkKKyAgICB7CisgICAgICAgIGlmICghJHRoaXMtPndyaXRlXykgeworICAgICAgICAgICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT53cml0ZSgkYnVmLCAkbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkbGVuICE9PSBudWxsICYmICRsZW4gPCBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikpIHsKKyAgICAgICAgICAgICRidWYgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJGJ1ZiwgMCwgJGxlbik7CisgICAgICAgIH0KKyAgICAgICAgJHRoaXMtPndCdWZfIC49ICRidWY7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBvdXRwdXQgYnVmZmVyIHRvIHRoZSBzdHJlYW0gaW4gdGhlIGZvcm1hdCBvZiBhIDQtYnl0ZSBsZW5ndGgKKyAgICAgKiBmb2xsb3dlZCBieSB0aGUgYWN0dWFsIGRhdGEuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgICAgIGlmICghJHRoaXMtPndyaXRlXyB8fCBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPndCdWZfKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPmZsdXNoKCk7CisgICAgICAgIH0KKworICAgICAgICAkb3V0ID0gcGFjaygnTicsIFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+d0J1Zl8pKTsKKyAgICAgICAgJG91dCAuPSAkdGhpcy0+d0J1Zl87CisKKyAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGNsZWFyIHRoZSBpbnRlcm5hbCB3QnVmXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQorICAgICAgICAvLyB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlIChpLmUuIGludGVybmFsIGJ1ZmZlciBjbGVhbmVkKQorICAgICAgICAvLyBpZiB0aGUgdW5kZXJseWluZyB3cml0ZSB0aHJvd3MgdXAgYW4gZXhjZXB0aW9uCisgICAgICAgICR0aGlzLT53QnVmXyA9ICcnOworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+d3JpdGUoJG91dCk7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5mbHVzaCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RyYW5zcG9ydC9USHR0cENsaWVudC5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEh0dHBDbGllbnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNTg4MDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEh0dHBDbGllbnQucGhwCkBAIC0wLDAgKzEsMjU4IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIEhUVFAgY2xpZW50IGZvciBUaHJpZnQKKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRIdHRwQ2xpZW50IGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIC8qKgorICAgICAqIFRoZSBob3N0IHRvIGNvbm5lY3QgdG8KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRob3N0XzsKKworICAgIC8qKgorICAgICAqIFRoZSBwb3J0IHRvIGNvbm5lY3Qgb24KKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRwb3J0XzsKKworICAgIC8qKgorICAgICAqIFRoZSBVUkkgdG8gcmVxdWVzdAorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHVyaV87CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2NoZW1lIHRvIHVzZSBmb3IgdGhlIHJlcXVlc3QsIGkuZS4gaHR0cCwgaHR0cHMKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRzY2hlbWVfOworCisgICAgLyoqCisgICAgICogQnVmZmVyIGZvciB0aGUgSFRUUCByZXF1ZXN0IGRhdGEKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRidWZfOworCisgICAgLyoqCisgICAgICogSW5wdXQgc29ja2V0IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEB2YXIgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGhhbmRsZV87CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRpbWVvdXQKKyAgICAgKgorICAgICAqIEB2YXIgZmxvYXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHRpbWVvdXRfOworCisgICAgLyoqCisgICAgICogaHR0cCBoZWFkZXJzCisgICAgICoKKyAgICAgKiBAdmFyIGFycmF5CisgICAgICovCisgICAgcHJvdGVjdGVkICRoZWFkZXJzXzsKKworICAgIC8qKgorICAgICAqIENvbnRleHQgYWRkaXRpb25hbCBvcHRpb25zCisgICAgICoKKyAgICAgKiBAdmFyIGFycmF5CisgICAgICovCisgICAgcHJvdGVjdGVkICRjb250ZXh0XzsKKworICAgIC8qKgorICAgICAqIE1ha2UgYSBuZXcgSFRUUCBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0CisgICAgICogQHBhcmFtIGludCAgICAkcG9ydAorICAgICAqIEBwYXJhbSBzdHJpbmcgJHVyaQorICAgICAqIEBwYXJhbSBzdHJpbmcgJHNjaGVtZQorICAgICAqIEBwYXJhbSBhcnJheSAgJGNvbnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QsICRwb3J0ID0gODAsICR1cmkgPSAnJywgJHNjaGVtZSA9ICdodHRwJywgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQorICAgIHsKKyAgICAgICAgaWYgKChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHVyaSkgPiAwKSAmJiAoJHVyaXswfSAhPSAnLycpKSB7CisgICAgICAgICAgICAkdXJpID0gJy8nIC4gJHVyaTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+c2NoZW1lXyA9ICRzY2hlbWU7CisgICAgICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OworICAgICAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKKyAgICAgICAgJHRoaXMtPnVyaV8gPSAkdXJpOworICAgICAgICAkdGhpcy0+YnVmXyA9ICcnOworICAgICAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7CisgICAgICAgICR0aGlzLT50aW1lb3V0XyA9IG51bGw7CisgICAgICAgICR0aGlzLT5oZWFkZXJzXyA9IGFycmF5KCk7CisgICAgICAgICR0aGlzLT5jb250ZXh0XyA9ICRjb250ZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCByZWFkIHRpbWVvdXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBmbG9hdCAkdGltZW91dAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRUaW1lb3V0U2VjcygkdGltZW91dCkKKyAgICB7CisgICAgICAgICR0aGlzLT50aW1lb3V0XyA9ICR0aW1lb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgb3Blbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG9wZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IG9wZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSB0cmFuc3BvcnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+aGFuZGxlXykgeworICAgICAgICAgICAgQGZjbG9zZSgkdGhpcy0+aGFuZGxlXyk7CisgICAgICAgICAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHNvbWUgZGF0YSBpbnRvIHRoZSBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJGxlbiBIb3cgbXVjaCB0byByZWFkCisgICAgICogQHJldHVybiBzdHJpbmcgVGhlIGRhdGEgdGhhdCBoYXMgYmVlbiByZWFkCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGFueSBtb3JlIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBAZnJlYWQoJHRoaXMtPmhhbmRsZV8sICRsZW4pOworICAgICAgICBpZiAoJGRhdGEgPT09IGZhbHNlIHx8ICRkYXRhID09PSAnJykgeworICAgICAgICAgICAgJG1kID0gc3RyZWFtX2dldF9tZXRhX2RhdGEoJHRoaXMtPmhhbmRsZV8pOworICAgICAgICAgICAgaWYgKCRtZFsndGltZWRfb3V0J10pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ1RIdHRwQ2xpZW50OiB0aW1lZCBvdXQgcmVhZGluZyAnIC4gJGxlbiAuICcgYnl0ZXMgZnJvbSAnIC4KKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfIC4gJHRoaXMtPnVyaV8sCisgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAnVEh0dHBDbGllbnQ6IENvdWxkIG5vdCByZWFkICcgLiAkbGVuIC4gJyBieXRlcyBmcm9tICcgLgorICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8gLiAkdGhpcy0+dXJpXywKKyAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTgorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJGRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHNvbWUgZGF0YSBpbnRvIHRoZSBwZW5kaW5nIGJ1ZmZlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkYnVmIFRoZSBkYXRhIHRvIHdyaXRlCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdyaXRpbmcgZmFpbHMKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKKyAgICB7CisgICAgICAgICR0aGlzLT5idWZfIC49ICRidWY7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbnMgYW5kIHNlbmRzIHRoZSBhY3R1YWwgcmVxdWVzdCBvdmVyIHRoZSBIVFRQIGNvbm5lY3Rpb24KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhIHdyaXRpbmcgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgICAgIC8vIEdvZCwgUEhQIHJlYWxseSBoYXMgc29tZSBlc290ZXJpYyB3YXlzIG9mIGRvaW5nIHNpbXBsZSB0aGluZ3MuCisgICAgICAgICRob3N0ID0gJHRoaXMtPmhvc3RfIC4gKCR0aGlzLT5wb3J0XyAhPSA4MCA/ICc6JyAuICR0aGlzLT5wb3J0XyA6ICcnKTsKKworICAgICAgICAkaGVhZGVycyA9IGFycmF5KCk7CisgICAgICAgICRkZWZhdWx0SGVhZGVycyA9IGFycmF5KCdIb3N0JyA9PiAkaG9zdCwKKyAgICAgICAgICAgICdBY2NlcHQnID0+ICdhcHBsaWNhdGlvbi94LXRocmlmdCcsCisgICAgICAgICAgICAnVXNlci1BZ2VudCcgPT4gJ1BIUC9USHR0cENsaWVudCcsCisgICAgICAgICAgICAnQ29udGVudC1UeXBlJyA9PiAnYXBwbGljYXRpb24veC10aHJpZnQnLAorICAgICAgICAgICAgJ0NvbnRlbnQtTGVuZ3RoJyA9PiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPmJ1Zl8pKTsKKyAgICAgICAgZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJGRlZmF1bHRIZWFkZXJzLCAkdGhpcy0+aGVhZGVyc18pIGFzICRrZXkgPT4gJHZhbHVlKSB7CisgICAgICAgICAgICAkaGVhZGVyc1tdID0gIiRrZXk6ICR2YWx1ZSI7CisgICAgICAgIH0KKworICAgICAgICAkb3B0aW9ucyA9ICR0aGlzLT5jb250ZXh0XzsKKworICAgICAgICAkYmFzZUh0dHBPcHRpb25zID0gaXNzZXQoJG9wdGlvbnNbImh0dHAiXSkgPyAkb3B0aW9uc1siaHR0cCJdIDogYXJyYXkoKTsKKworICAgICAgICAkaHR0cE9wdGlvbnMgPSAkYmFzZUh0dHBPcHRpb25zICsgYXJyYXkoJ21ldGhvZCcgPT4gJ1BPU1QnLAorICAgICAgICAgICAgJ2hlYWRlcicgPT4gaW1wbG9kZSgiXHJcbiIsICRoZWFkZXJzKSwKKyAgICAgICAgICAgICdtYXhfcmVkaXJlY3RzJyA9PiAxLAorICAgICAgICAgICAgJ2NvbnRlbnQnID0+ICR0aGlzLT5idWZfKTsKKyAgICAgICAgaWYgKCR0aGlzLT50aW1lb3V0XyA+IDApIHsKKyAgICAgICAgICAgICRodHRwT3B0aW9uc1sndGltZW91dCddID0gJHRoaXMtPnRpbWVvdXRfOworICAgICAgICB9CisgICAgICAgICR0aGlzLT5idWZfID0gJyc7CisKKyAgICAgICAgJG9wdGlvbnNbImh0dHAiXSA9ICRodHRwT3B0aW9uczsKKyAgICAgICAgJGNvbnRleHRpZCA9IHN0cmVhbV9jb250ZXh0X2NyZWF0ZSgkb3B0aW9ucyk7CisgICAgICAgICR0aGlzLT5oYW5kbGVfID0gQGZvcGVuKAorICAgICAgICAgICAgJHRoaXMtPnNjaGVtZV8gLiAnOi8vJyAuICRob3N0IC4gJHRoaXMtPnVyaV8sCisgICAgICAgICAgICAncicsCisgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICRjb250ZXh0aWQKKyAgICAgICAgKTsKKworICAgICAgICAvLyBDb25uZWN0IGZhaWxlZD8KKyAgICAgICAgaWYgKCR0aGlzLT5oYW5kbGVfID09PSBmYWxzZSkgeworICAgICAgICAgICAgJHRoaXMtPmhhbmRsZV8gPSBudWxsOworICAgICAgICAgICAgJGVycm9yID0gJ1RIdHRwQ2xpZW50OiBDb3VsZCBub3QgY29ubmVjdCB0byAnIC4gJGhvc3QgLiAkdGhpcy0+dXJpXzsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCRlcnJvciwgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZEhlYWRlcnMoJGhlYWRlcnMpCisgICAgeworICAgICAgICAkdGhpcy0+aGVhZGVyc18gPSBhcnJheV9tZXJnZSgkdGhpcy0+aGVhZGVyc18sICRoZWFkZXJzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlMDNhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLnBocApAQCAtMCwwICsxLDEwNiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBBIG1lbW9yeSBidWZmZXIgaXMgYSB0cmFucHNvcnQgdGhhdCBzaW1wbHkgcmVhZHMgZnJvbSBhbmQgd3JpdGVzIHRvIGFuCisgKiBpbi1tZW1vcnkgc3RyaW5nIGJ1ZmZlci4gQW55dGltZSB5b3UgY2FsbCB3cml0ZSBvbiBpdCwgdGhlIGRhdGEgaXMgc2ltcGx5CisgKiBwbGFjZWQgaW50byBhIGJ1ZmZlciwgYW5kIGFueXRpbWUgeW91IGNhbGwgcmVhZCwgZGF0YSBpcyByZWFkIGZyb20gdGhhdAorICogYnVmZmVyLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVE1lbW9yeUJ1ZmZlciBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gT3B0aW9uYWxseSBwYXNzIGFuIGluaXRpYWwgdmFsdWUKKyAgICAgKiBmb3IgdGhlIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGJ1ZiA9ICcnKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmJ1Zl8gPSAkYnVmOworICAgIH0KKworICAgIHByb3RlY3RlZCAkYnVmXyA9ICcnOworCisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmJ1Zl8gLj0gJGJ1ZjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQorICAgIHsKKyAgICAgICAgJGJ1Zkxlbmd0aCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+YnVmXyk7CisKKyAgICAgICAgaWYgKCRidWZMZW5ndGggPT09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICdUTWVtb3J5QnVmZmVyOiBDb3VsZCBub3QgcmVhZCAnIC4KKyAgICAgICAgICAgICAgICAkbGVuIC4gJyBieXRlcyBmcm9tIGJ1ZmZlci4nLAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04KKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoJGJ1Zkxlbmd0aCA8PSAkbGVuKSB7CisgICAgICAgICAgICAkcmV0ID0gJHRoaXMtPmJ1Zl87CisgICAgICAgICAgICAkdGhpcy0+YnVmXyA9ICcnOworCisgICAgICAgICAgICByZXR1cm4gJHJldDsKKyAgICAgICAgfQorCisgICAgICAgICRyZXQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPmJ1Zl8sIDAsICRsZW4pOworICAgICAgICAkdGhpcy0+YnVmXyA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkdGhpcy0+YnVmXywgJGxlbik7CisKKyAgICAgICAgcmV0dXJuICRyZXQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldEJ1ZmZlcigpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmJ1Zl87CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGF2YWlsYWJsZSgpCisgICAgeworICAgICAgICByZXR1cm4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5idWZfKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcHV0QmFjaygkZGF0YSkKKyAgICB7CisgICAgICAgICR0aGlzLT5idWZfID0gJGRhdGEgLiAkdGhpcy0+YnVmXzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTA4NmI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocApAQCAtMCwwICsxLDU2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247CisKKy8qKgorICogVHJhbnNwb3J0IHRoYXQgb25seSBhY2NlcHRzIHdyaXRlcyBhbmQgaWdub3JlcyB0aGVtLgorICogVGhpcyBpcyB1c2VmdWwgZm9yIG1lYXN1cmluZyB0aGUgc2VyaWFsaXplZCBzaXplIG9mIHN0cnVjdHVyZXMuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUTnVsbFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDYW4ndCByZWFkIGZyb20gVE51bGxUcmFuc3BvcnQuIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpCisgICAgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjgyM2ZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RQaHBTdHJlYW0ucGhwCkBAIC0wLDAgKzEsMTI0IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIFBocCBzdHJlYW0gdHJhbnNwb3J0LiBSZWFkcyB0byBhbmQgd3JpdGVzIGZyb20gdGhlIHBocCBzdGFuZGFyZCBzdHJlYW1zCisgKiBwaHA6Ly9pbnB1dCBhbmQgcGhwOi8vb3V0cHV0CisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUUGhwU3RyZWFtIGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIGNvbnN0IE1PREVfUiA9IDE7CisgICAgY29uc3QgTU9ERV9XID0gMjsKKworICAgIHByaXZhdGUgJGluU3RyZWFtXyA9IG51bGw7CisKKyAgICBwcml2YXRlICRvdXRTdHJlYW1fID0gbnVsbDsKKworICAgIHByaXZhdGUgJHJlYWRfID0gZmFsc2U7CisKKyAgICBwcml2YXRlICR3cml0ZV8gPSBmYWxzZTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbW9kZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkXyA9ICRtb2RlICYgc2VsZjo6TU9ERV9SOworICAgICAgICAkdGhpcy0+d3JpdGVfID0gJG1vZGUgJiBzZWxmOjpNT0RFX1c7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5yZWFkXykgeworICAgICAgICAgICAgJHRoaXMtPmluU3RyZWFtXyA9IEBmb3BlbihzZWxmOjppblN0cmVhbU5hbWUoKSwgJ3InKTsKKyAgICAgICAgICAgIGlmICghaXNfcmVzb3VyY2UoJHRoaXMtPmluU3RyZWFtXykpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFBocFN0cmVhbTogQ291bGQgbm90IG9wZW4gcGhwOi8vaW5wdXQnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoJHRoaXMtPndyaXRlXykgeworICAgICAgICAgICAgJHRoaXMtPm91dFN0cmVhbV8gPSBAZm9wZW4oJ3BocDovL291dHB1dCcsICd3Jyk7CisgICAgICAgICAgICBpZiAoIWlzX3Jlc291cmNlKCR0aGlzLT5vdXRTdHJlYW1fKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdUUGhwU3RyZWFtOiBDb3VsZCBub3Qgb3BlbiBwaHA6Ly9vdXRwdXQnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPnJlYWRfKSB7CisgICAgICAgICAgICBAZmNsb3NlKCR0aGlzLT5pblN0cmVhbV8pOworICAgICAgICAgICAgJHRoaXMtPmluU3RyZWFtXyA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCR0aGlzLT53cml0ZV8pIHsKKyAgICAgICAgICAgIEBmY2xvc2UoJHRoaXMtPm91dFN0cmVhbV8pOworICAgICAgICAgICAgJHRoaXMtPm91dFN0cmVhbV8gPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICghJHRoaXMtPnJlYWRfIHx8IGlzX3Jlc291cmNlKCR0aGlzLT5pblN0cmVhbV8pKSAmJgorICAgICAgICAgICAgKCEkdGhpcy0+d3JpdGVfIHx8IGlzX3Jlc291cmNlKCR0aGlzLT5vdXRTdHJlYW1fKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgICRkYXRhID0gQGZyZWFkKCR0aGlzLT5pblN0cmVhbV8sICRsZW4pOworICAgICAgICBpZiAoJGRhdGEgPT09IGZhbHNlIHx8ICRkYXRhID09PSAnJykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RQaHBTdHJlYW06IENvdWxkIG5vdCByZWFkICcgLiAkbGVuIC4gJyBieXRlcycpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRkYXRhOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQorICAgIHsKKyAgICAgICAgd2hpbGUgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkYnVmKSA+IDApIHsKKyAgICAgICAgICAgICRnb3QgPSBAZndyaXRlKCR0aGlzLT5vdXRTdHJlYW1fLCAkYnVmKTsKKyAgICAgICAgICAgIGlmICgkZ290ID09PSAwIHx8ICRnb3QgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICdUUGhwU3RyZWFtOiBDb3VsZCBub3Qgd3JpdGUgJyAuIFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkYnVmKSAuICcgYnl0ZXMnCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICRidWYgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJGJ1ZiwgJGdvdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKQorICAgIHsKKyAgICAgICAgQGZmbHVzaCgkdGhpcy0+b3V0U3RyZWFtXyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaW5TdHJlYW1OYW1lKCkKKyAgICB7CisgICAgICAgIGlmIChwaHBfc2FwaV9uYW1lKCkgPT0gJ2NsaScpIHsKKyAgICAgICAgICAgIHJldHVybiAncGhwOi8vc3RkaW4nOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICdwaHA6Ly9pbnB1dCc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTU0xTb2NrZXQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTU0xTb2NrZXQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YTBhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFNTTFNvY2tldC5waHAKQEAgLTAsMCArMSwxMTcgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIFNvY2tldHMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVFNTTFNvY2tldCBleHRlbmRzIFRTb2NrZXQKK3sKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgcG9ydAorICAgICAqCisgICAgICogQHZhciByZXNvdXJjZQorICAgICAqLworICAgIHByb3RlY3RlZCAkY29udGV4dF8gPSBudWxsOworCisgICAgLyoqCisgICAgICogU29ja2V0IGNvbnN0cnVjdG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0IFJlbW90ZSBob3N0bmFtZQorICAgICAqIEBwYXJhbSBpbnQgJHBvcnQgUmVtb3RlIHBvcnQKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJGNvbnRleHQgU3RyZWFtIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gYm9vbCAkcGVyc2lzdCBXaGV0aGVyIHRvIHVzZSBhIHBlcnNpc3RlbnQgc29ja2V0CisgICAgICogQHBhcmFtIHN0cmluZyAkZGVidWdIYW5kbGVyIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVycm9yIGxvZ2dpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCisgICAgICAgICRob3N0ID0gJ2xvY2FsaG9zdCcsCisgICAgICAgICRwb3J0ID0gOTA5MCwKKyAgICAgICAgJGNvbnRleHQgPSBudWxsLAorICAgICAgICAkZGVidWdIYW5kbGVyID0gbnVsbAorICAgICkgeworICAgICAgICAkdGhpcy0+aG9zdF8gPSAkdGhpcy0+Z2V0U1NMSG9zdCgkaG9zdCk7CisgICAgICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OworICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSAkY29udGV4dDsKKyAgICAgICAgJHRoaXMtPmRlYnVnSGFuZGxlcl8gPSAkZGVidWdIYW5kbGVyID8gJGRlYnVnSGFuZGxlciA6ICdlcnJvcl9sb2cnOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBob3N0IG5hbWUgd2l0aCBTU0wgdHJhbnNwb3J0IHByb3RvY29sCisgICAgICogaWYgbm8gdHJhbnNwb3J0IHByb3RvY29sIGFscmVhZHkgc3BlY2lmaWVkIGluCisgICAgICogdGhlIGhvc3QgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgSG9zdCB0byBsaXN0ZW4gb24KKyAgICAgKiBAcmV0dXJuIHN0cmluZyAkaG9zdCAgIEhvc3QgbmFtZSB3aXRoIHRyYW5zcG9ydCBwcm90b2NvbAorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0U1NMSG9zdCgkaG9zdCkKKyAgICB7CisgICAgICAgICR0cmFuc3BvcnRfcHJvdG9jb2xfbG9jID0gc3RycG9zKCRob3N0LCAiOi8vIik7CisgICAgICAgIGlmICgkdHJhbnNwb3J0X3Byb3RvY29sX2xvYyA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICRob3N0ID0gJ3NzbDovLycgLiAkaG9zdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJGhvc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdHMgdGhlIHNvY2tldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmlzT3BlbigpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignU29ja2V0IGFscmVhZHkgY29ubmVjdGVkJywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QUxSRUFEWV9PUEVOKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbXB0eSgkdGhpcy0+aG9zdF8pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignQ2Fubm90IG9wZW4gbnVsbCBob3N0JywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCR0aGlzLT5wb3J0XyA8PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0JywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgICAgICB9CisKKyAgICAgICAgJHRoaXMtPmhhbmRsZV8gPSBAc3RyZWFtX3NvY2tldF9jbGllbnQoCisgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8sCisgICAgICAgICAgICAkZXJybm8sCisgICAgICAgICAgICAkZXJyc3RyLAorICAgICAgICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0U2VjXyArICgkdGhpcy0+c2VuZFRpbWVvdXRVc2VjXyAvIDEwMDAwMDApLAorICAgICAgICAgICAgU1RSRUFNX0NMSUVOVF9DT05ORUNULAorICAgICAgICAgICAgJHRoaXMtPmNvbnRleHRfCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQ29ubmVjdCBmYWlsZWQ/CisgICAgICAgIGlmICgkdGhpcy0+aGFuZGxlXyA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICRlcnJvciA9ICdUU29ja2V0OiBDb3VsZCBub3QgY29ubmVjdCB0byAnIC4KKyAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8gLiAnICgnIC4gJGVycnN0ciAuICcgWycgLiAkZXJybm8gLiAnXSknOworICAgICAgICAgICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKKyAgICAgICAgICAgICAgICBjYWxsX3VzZXJfZnVuYygkdGhpcy0+ZGVidWdIYW5kbGVyXywgJGVycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCRlcnJvcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFNvY2tldC5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFNvY2tldC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE0N2VmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UU29ja2V0LnBocApAQCAtMCwwICsxLDM2NiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwordXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7CisKKy8qKgorICogU29ja2V0cyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUU29ja2V0IGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIC8qKgorICAgICAqIEhhbmRsZSB0byBQSFAgc29ja2V0CisgICAgICoKKyAgICAgKiBAdmFyIHJlc291cmNlCisgICAgICovCisgICAgcHJvdGVjdGVkICRoYW5kbGVfID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFJlbW90ZSBob3N0bmFtZQorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGhvc3RfID0gJ2xvY2FsaG9zdCc7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgcG9ydAorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHBvcnRfID0gJzkwOTAnOworCisgICAgLyoqCisgICAgICogU2VuZCB0aW1lb3V0IGluIHNlY29uZHMuCisgICAgICoKKyAgICAgKiBDb21iaW5lZCB3aXRoIHNlbmRUaW1lb3V0VXNlYyB0aGlzIGlzIHVzZWQgZm9yIHNlbmQgdGltZW91dHMuCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkc2VuZFRpbWVvdXRTZWNfID0gMDsKKworICAgIC8qKgorICAgICAqIFNlbmQgdGltZW91dCBpbiBtaWNyb3NlY29uZHMuCisgICAgICoKKyAgICAgKiBDb21iaW5lZCB3aXRoIHNlbmRUaW1lb3V0U2VjIHRoaXMgaXMgdXNlZCBmb3Igc2VuZCB0aW1lb3V0cy4KKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRzZW5kVGltZW91dFVzZWNfID0gMTAwMDAwOworCisgICAgLyoqCisgICAgICogUmVjdiB0aW1lb3V0IGluIHNlY29uZHMKKyAgICAgKgorICAgICAqIENvbWJpbmVkIHdpdGggcmVjdlRpbWVvdXRVc2VjIHRoaXMgaXMgdXNlZCBmb3IgcmVjdiB0aW1lb3V0cy4KKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRyZWN2VGltZW91dFNlY18gPSAwOworCisgICAgLyoqCisgICAgICogUmVjdiB0aW1lb3V0IGluIG1pY3Jvc2Vjb25kcworICAgICAqCisgICAgICogQ29tYmluZWQgd2l0aCByZWN2VGltZW91dFNlYyB0aGlzIGlzIHVzZWQgZm9yIHJlY3YgdGltZW91dHMuCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkcmVjdlRpbWVvdXRVc2VjXyA9IDc1MDAwMDsKKworICAgIC8qKgorICAgICAqIFBlcnNpc3RlbnQgc29ja2V0IG9yIHBsYWluPworICAgICAqCisgICAgICogQHZhciBib29sCisgICAgICovCisgICAgcHJvdGVjdGVkICRwZXJzaXN0XyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogRGVidWdnaW5nIG9uPworICAgICAqCisgICAgICogQHZhciBib29sCisgICAgICovCisgICAgcHJvdGVjdGVkICRkZWJ1Z18gPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIERlYnVnIGhhbmRsZXIKKyAgICAgKgorICAgICAqIEB2YXIgbWl4ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGRlYnVnSGFuZGxlcl8gPSBudWxsOworCisgICAgLyoqCisgICAgICogU29ja2V0IGNvbnN0cnVjdG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0IFJlbW90ZSBob3N0bmFtZQorICAgICAqIEBwYXJhbSBpbnQgJHBvcnQgUmVtb3RlIHBvcnQKKyAgICAgKiBAcGFyYW0gYm9vbCAkcGVyc2lzdCBXaGV0aGVyIHRvIHVzZSBhIHBlcnNpc3RlbnQgc29ja2V0CisgICAgICogQHBhcmFtIHN0cmluZyAkZGVidWdIYW5kbGVyIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVycm9yIGxvZ2dpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCisgICAgICAgICRob3N0ID0gJ2xvY2FsaG9zdCcsCisgICAgICAgICRwb3J0ID0gOTA5MCwKKyAgICAgICAgJHBlcnNpc3QgPSBmYWxzZSwKKyAgICAgICAgJGRlYnVnSGFuZGxlciA9IG51bGwKKyAgICApIHsKKyAgICAgICAgJHRoaXMtPmhvc3RfID0gJGhvc3Q7CisgICAgICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OworICAgICAgICAkdGhpcy0+cGVyc2lzdF8gPSAkcGVyc2lzdDsKKyAgICAgICAgJHRoaXMtPmRlYnVnSGFuZGxlcl8gPSAkZGVidWdIYW5kbGVyID8gJGRlYnVnSGFuZGxlciA6ICdlcnJvcl9sb2cnOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSAkaGFuZGxlCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldEhhbmRsZSgkaGFuZGxlKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmhhbmRsZV8gPSAkaGFuZGxlOworICAgICAgICBzdHJlYW1fc2V0X2Jsb2NraW5nKCR0aGlzLT5oYW5kbGVfLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2VuZCB0aW1lb3V0LgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkdGltZW91dCBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0U2VuZFRpbWVvdXQoJHRpbWVvdXQpCisgICAgeworICAgICAgICAkdGhpcy0+c2VuZFRpbWVvdXRTZWNfID0gZmxvb3IoJHRpbWVvdXQgLyAxMDAwKTsKKyAgICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18gPQorICAgICAgICAgICAgKCR0aW1lb3V0IC0gKCR0aGlzLT5zZW5kVGltZW91dFNlY18gKiAxMDAwKSkgKiAxMDAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHJlY2VpdmUgdGltZW91dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJHRpbWVvdXQgVGltZW91dCBpbiBtaWxsaXNlY29uZHMuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFJlY3ZUaW1lb3V0KCR0aW1lb3V0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlY3ZUaW1lb3V0U2VjXyA9IGZsb29yKCR0aW1lb3V0IC8gMTAwMCk7CisgICAgICAgICR0aGlzLT5yZWN2VGltZW91dFVzZWNfID0KKyAgICAgICAgICAgICgkdGltZW91dCAtICgkdGhpcy0+cmVjdlRpbWVvdXRTZWNfICogMTAwMCkpICogMTAwMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGRlYnVnZ2luZyBvdXRwdXQgb24gb3Igb2ZmCisgICAgICoKKyAgICAgKiBAcGFyYW0gYm9vbCAkZGVidWcKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0RGVidWcoJGRlYnVnKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmRlYnVnXyA9ICRkZWJ1ZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGhvc3QgdGhhdCB0aGlzIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KKyAgICAgKgorICAgICAqIEByZXR1cm4gc3RyaW5nIGhvc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SG9zdCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmhvc3RfOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcmVtb3RlIHBvcnQgdGhhdCB0aGlzIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW50IHBvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UG9ydCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnBvcnRfOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgdGhpcyBpcyBvcGVuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2wgdHJ1ZSBpZiB0aGUgc29ja2V0IGlzIG9wZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc19yZXNvdXJjZSgkdGhpcy0+aGFuZGxlXyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdHMgdGhlIHNvY2tldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmlzT3BlbigpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignU29ja2V0IGFscmVhZHkgY29ubmVjdGVkJywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QUxSRUFEWV9PUEVOKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbXB0eSgkdGhpcy0+aG9zdF8pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignQ2Fubm90IG9wZW4gbnVsbCBob3N0JywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCR0aGlzLT5wb3J0XyA8PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0JywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCR0aGlzLT5wZXJzaXN0XykgeworICAgICAgICAgICAgJHRoaXMtPmhhbmRsZV8gPSBAcGZzb2Nrb3BlbigKKyAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8sCisgICAgICAgICAgICAgICAgJHRoaXMtPnBvcnRfLAorICAgICAgICAgICAgICAgICRlcnJubywKKyAgICAgICAgICAgICAgICAkZXJyc3RyLAorICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18gKyAoJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18gLyAxMDAwMDAwKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0aGlzLT5oYW5kbGVfID0gQGZzb2Nrb3BlbigKKyAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8sCisgICAgICAgICAgICAgICAgJHRoaXMtPnBvcnRfLAorICAgICAgICAgICAgICAgICRlcnJubywKKyAgICAgICAgICAgICAgICAkZXJyc3RyLAorICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18gKyAoJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18gLyAxMDAwMDAwKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbm5lY3QgZmFpbGVkPworICAgICAgICBpZiAoJHRoaXMtPmhhbmRsZV8gPT09IGZhbHNlKSB7CisgICAgICAgICAgICAkZXJyb3IgPSAnVFNvY2tldDogQ291bGQgbm90IGNvbm5lY3QgdG8gJyAuCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfIC4gJyAoJyAuICRlcnJzdHIgLiAnIFsnIC4gJGVycm5vIC4gJ10pJzsKKyAgICAgICAgICAgIGlmICgkdGhpcy0+ZGVidWdfKSB7CisgICAgICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmRlYnVnSGFuZGxlcl8sICRlcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigkZXJyb3IpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnc29ja2V0X2ltcG9ydF9zdHJlYW0nKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3NvY2tldF9zZXRfb3B0aW9uJykpIHsKKyAgICAgICAgICAgICRzb2NrZXQgPSBzb2NrZXRfaW1wb3J0X3N0cmVhbSgkdGhpcy0+aGFuZGxlXyk7CisgICAgICAgICAgICBzb2NrZXRfc2V0X29wdGlvbigkc29ja2V0LCBTT0xfVENQLCBUQ1BfTk9ERUxBWSwgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHNvY2tldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICAgICAgQGZjbG9zZSgkdGhpcy0+aGFuZGxlXyk7CisgICAgICAgICR0aGlzLT5oYW5kbGVfID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGZyb20gdGhlIHNvY2tldCBhdCBtb3N0ICRsZW4gYnl0ZXMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCB3YWl0IGZvciBhbGwgdGhlIHJlcXVlc3RlZCBkYXRhLCBpdCB3aWxsIHJldHVybiBhcworICAgICAqIHNvb24gYXMgYW55IGRhdGEgaXMgcmVjZWl2ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICRsZW4gTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAgICAgKiBAcmV0dXJuIHN0cmluZyBCaW5hcnkgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCisgICAgeworICAgICAgICAkbnVsbCA9IG51bGw7CisgICAgICAgICRyZWFkID0gYXJyYXkoJHRoaXMtPmhhbmRsZV8pOworICAgICAgICAkcmVhZGFibGUgPSBAc3RyZWFtX3NlbGVjdCgKKyAgICAgICAgICAgICRyZWFkLAorICAgICAgICAgICAgJG51bGwsCisgICAgICAgICAgICAkbnVsbCwKKyAgICAgICAgICAgICR0aGlzLT5yZWN2VGltZW91dFNlY18sCisgICAgICAgICAgICAkdGhpcy0+cmVjdlRpbWVvdXRVc2VjXworICAgICAgICApOworCisgICAgICAgIGlmICgkcmVhZGFibGUgPiAwKSB7CisgICAgICAgICAgICAkZGF0YSA9IGZyZWFkKCR0aGlzLT5oYW5kbGVfLCAkbGVuKTsKKyAgICAgICAgICAgIGlmICgkZGF0YSA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHJlYWQgJyAuICRsZW4gLiAnIGJ5dGVzIGZyb20gJyAuCisgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0Xyk7CisgICAgICAgICAgICB9IGVsc2VpZiAoJGRhdGEgPT0gJycgJiYgZmVvZigkdGhpcy0+aGFuZGxlXykpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldCByZWFkIDAgYnl0ZXMnKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuICRkYXRhOworICAgICAgICB9IGVsc2VpZiAoJHJlYWRhYmxlID09PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldDogdGltZWQgb3V0IHJlYWRpbmcgJyAuICRsZW4gLiAnIGJ5dGVzIGZyb20gJyAuCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3QgcmVhZCAnIC4gJGxlbiAuICcgYnl0ZXMgZnJvbSAnIC4KKyAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgdG8gdGhlIHNvY2tldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiBUaGUgZGF0YSB0byB3cml0ZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQorICAgIHsKKyAgICAgICAgJG51bGwgPSBudWxsOworICAgICAgICAkd3JpdGUgPSBhcnJheSgkdGhpcy0+aGFuZGxlXyk7CisKKyAgICAgICAgLy8ga2VlcCB3cml0aW5nIHVudGlsIGFsbCB0aGUgZGF0YSBoYXMgYmVlbiB3cml0dGVuCisgICAgICAgIHdoaWxlIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgPiAwKSB7CisgICAgICAgICAgICAvLyB3YWl0IGZvciBzdHJlYW0gdG8gYmVjb21lIGF2YWlsYWJsZSBmb3Igd3JpdGluZworICAgICAgICAgICAgJHdyaXRhYmxlID0gQHN0cmVhbV9zZWxlY3QoCisgICAgICAgICAgICAgICAgJG51bGwsCisgICAgICAgICAgICAgICAgJHdyaXRlLAorICAgICAgICAgICAgICAgICRudWxsLAorICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18sCisgICAgICAgICAgICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18KKyAgICAgICAgICAgICk7CisgICAgICAgICAgICBpZiAoJHdyaXRhYmxlID4gMCkgeworICAgICAgICAgICAgICAgIC8vIHdyaXRlIGJ1ZmZlciB0byBzdHJlYW0KKyAgICAgICAgICAgICAgICAkd3JpdHRlbiA9IGZ3cml0ZSgkdGhpcy0+aGFuZGxlXywgJGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCR3cml0dGVuID09PSAtMSB8fCAkd3JpdHRlbiA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAnVFNvY2tldDogQ291bGQgbm90IHdyaXRlICcgLiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgLiAnIGJ5dGVzICcgLgorICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSBob3cgbXVjaCBvZiB0aGUgYnVmZmVyIGlzIGxlZnQgdG8gd3JpdGUKKyAgICAgICAgICAgICAgICAkYnVmID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCRidWYsICR3cml0dGVuKTsKKyAgICAgICAgICAgIH0gZWxzZWlmICgkd3JpdGFibGUgPT09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXQ6IHRpbWVkIG91dCB3cml0aW5nICcgLiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgLiAnIGJ5dGVzIGZyb20gJyAuCisgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0XworICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAnVFNvY2tldDogQ291bGQgbm90IHdyaXRlICcgLiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgLiAnIGJ5dGVzICcgLgorICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmx1c2ggb3V0cHV0IHRvIHRoZSBzb2NrZXQuCisgICAgICoKKyAgICAgKiBTaW5jZSByZWFkKCksIHJlYWRBbGwoKSBhbmQgd3JpdGUoKSBvcGVyYXRlIG9uIHRoZSBzb2NrZXRzIGRpcmVjdGx5LAorICAgICAqIHRoaXMgaXMgYSBuby1vcAorICAgICAqCisgICAgICogSWYgeW91IHdpc2ggdG8gaGF2ZSBmbHVzaGFibGUgYnVmZmVyaW5nIGJlaGF2aW91ciwgd3JhcCB0aGlzIFRTb2NrZXQKKyAgICAgKiBpbiBhIFRCdWZmZXJlZFRyYW5zcG9ydC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKQorICAgIHsKKyAgICAgICAgLy8gbm8tb3AKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFNvY2tldFBvb2wucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjllOGRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocApAQCAtMCwwICsxLDMxMCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOworCisvKioKKyAqIFRoaXMgbGlicmFyeSBtYWtlcyB1c2Ugb2YgQVBDIGNhY2hlIHRvIG1ha2UgaG9zdHMgYXMgZG93biBpbiBhIHdlYgorICogZW52aXJvbm1lbnQuIElmIHlvdSBhcmUgcnVubmluZyBmcm9tIHRoZSBDTEkgb3Igb24gYSBzeXN0ZW0gd2l0aG91dCBBUEMKKyAqIGluc3RhbGxlZCwgdGhlbiB0aGVzZSBudWxsIGZ1bmN0aW9ucyB3aWxsIHN0ZXAgaW4gYW5kIGFjdCBsaWtlIGNhY2hlCisgKiBtaXNzZXMuCisgKi8KK2lmICghZnVuY3Rpb25fZXhpc3RzKCdhcGNfZmV0Y2gnKSkgeworICAgIGZ1bmN0aW9uIGFwY19mZXRjaCgka2V5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZ1bmN0aW9uIGFwY19zdG9yZSgka2V5LCAkdmFyLCAkdHRsID0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKKy8qKgorICogU29ja2V0cyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UgdGhhdCBhbGxvd3MgY29ubmVjdGlvbgorICogdG8gYSBwb29sIG9mIHNlcnZlcnMuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUU29ja2V0UG9vbCBleHRlbmRzIFRTb2NrZXQKK3sKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgc2VydmVycy4gQXJyYXkgb2YgYXNzb2NpYXRpdmUgYXJyYXlzIHdpdGggJ2hvc3QnIGFuZCAncG9ydCcga2V5cworICAgICAqLworICAgIHByaXZhdGUgJHNlcnZlcnNfID0gYXJyYXkoKTsKKworICAgIC8qKgorICAgICAqIEhvdyBtYW55IHRpbWVzIHRvIHJldHJ5IGVhY2ggaG9zdCBpbiBjb25uZWN0CisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByaXZhdGUgJG51bVJldHJpZXNfID0gMTsKKworICAgIC8qKgorICAgICAqIFJldHJ5IGludGVydmFsIGluIHNlY29uZHMsIGhvdyBsb25nIHRvIG5vdCB0cnkgYSBob3N0IGlmIGl0IGhhcyBiZWVuCisgICAgICogbWFya2VkIGFzIGRvd24uCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByaXZhdGUgJHJldHJ5SW50ZXJ2YWxfID0gNjA7CisKKyAgICAvKioKKyAgICAgKiBNYXggY29uc2VjdXRpdmUgZmFpbHVyZXMgYmVmb3JlIG1hcmtpbmcgYSBob3N0IGRvd24uCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByaXZhdGUgJG1heENvbnNlY3V0aXZlRmFpbHVyZXNfID0gMTsKKworICAgIC8qKgorICAgICAqIFRyeSBob3N0cyBpbiBvcmRlcj8gb3IgUmFuZG9taXplZD8KKyAgICAgKgorICAgICAqIEB2YXIgYm9vbAorICAgICAqLworICAgIHByaXZhdGUgJHJhbmRvbWl6ZV8gPSB0cnVlOworCisgICAgLyoqCisgICAgICogQWx3YXlzIHRyeSBsYXN0IGhvc3QsIGV2ZW4gaWYgbWFya2VkIGRvd24/CisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICRhbHdheXNUcnlMYXN0XyA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBTb2NrZXQgcG9vbCBjb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQHBhcmFtIGFycmF5ICRob3N0cyBMaXN0IG9mIHJlbW90ZSBob3N0bmFtZXMKKyAgICAgKiBAcGFyYW0gbWl4ZWQgJHBvcnRzIEFycmF5IG9mIHJlbW90ZSBwb3J0cywgb3IgYSBzaW5nbGUgY29tbW9uIHBvcnQKKyAgICAgKiBAcGFyYW0gYm9vbCAkcGVyc2lzdCBXaGV0aGVyIHRvIHVzZSBhIHBlcnNpc3RlbnQgc29ja2V0CisgICAgICogQHBhcmFtIG1peGVkICRkZWJ1Z0hhbmRsZXIgRnVuY3Rpb24gZm9yIGVycm9yIGxvZ2dpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCisgICAgICAgICRob3N0cyA9IGFycmF5KCdsb2NhbGhvc3QnKSwKKyAgICAgICAgJHBvcnRzID0gYXJyYXkoOTA5MCksCisgICAgICAgICRwZXJzaXN0ID0gZmFsc2UsCisgICAgICAgICRkZWJ1Z0hhbmRsZXIgPSBudWxsCisgICAgKSB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QobnVsbCwgMCwgJHBlcnNpc3QsICRkZWJ1Z0hhbmRsZXIpOworCisgICAgICAgIGlmICghaXNfYXJyYXkoJHBvcnRzKSkgeworICAgICAgICAgICAgJHBvcnQgPSAkcG9ydHM7CisgICAgICAgICAgICAkcG9ydHMgPSBhcnJheSgpOworICAgICAgICAgICAgZm9yZWFjaCAoJGhvc3RzIGFzICRrZXkgPT4gJHZhbCkgeworICAgICAgICAgICAgICAgICRwb3J0c1ska2V5XSA9ICRwb3J0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yZWFjaCAoJGhvc3RzIGFzICRrZXkgPT4gJGhvc3QpIHsKKyAgICAgICAgICAgICR0aGlzLT5zZXJ2ZXJzXyBbXSA9IGFycmF5KCdob3N0JyA9PiAkaG9zdCwKKyAgICAgICAgICAgICAgICAncG9ydCcgPT4gJHBvcnRzWyRrZXldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHNlcnZlciB0byB0aGUgcG9vbAorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwcmV2ZW50IHlvdSBmcm9tIGFkZGluZyBhIGR1cGxpY2F0ZSBzZXJ2ZXIgZW50cnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0IGhvc3RuYW1lIG9yIElQCisgICAgICogQHBhcmFtIGludCAkcG9ydCBwb3J0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZFNlcnZlcigkaG9zdCwgJHBvcnQpCisgICAgeworICAgICAgICAkdGhpcy0+c2VydmVyc19bXSA9IGFycmF5KCdob3N0JyA9PiAkaG9zdCwgJ3BvcnQnID0+ICRwb3J0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGhvdyBtYW55IHRpbWUgdG8ga2VlcCByZXRyeWluZyBhIGhvc3QgaW4gdGhlIGNvbm5lY3QgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICRudW1SZXRyaWVzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldE51bVJldHJpZXMoJG51bVJldHJpZXMpCisgICAgeworICAgICAgICAkdGhpcy0+bnVtUmV0cmllc18gPSAkbnVtUmV0cmllczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGhvdyBsb25nIHRvIHdhaXQgdW50aWwgcmV0cnlpbmcgYSBob3N0IGlmIGl0IHdhcyBtYXJrZWQgZG93bgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbnVtUmV0cmllcworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRSZXRyeUludGVydmFsKCRyZXRyeUludGVydmFsKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJldHJ5SW50ZXJ2YWxfID0gJHJldHJ5SW50ZXJ2YWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBob3cgbWFueSB0aW1lIHRvIGtlZXAgcmV0cnlpbmcgYSBob3N0IGJlZm9yZSBtYXJraW5nIGl0IGFzIGRvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICRudW1SZXRyaWVzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldE1heENvbnNlY3V0aXZlRmFpbHVyZXMoJG1heENvbnNlY3V0aXZlRmFpbHVyZXMpCisgICAgeworICAgICAgICAkdGhpcy0+bWF4Q29uc2VjdXRpdmVGYWlsdXJlc18gPSAkbWF4Q29uc2VjdXRpdmVGYWlsdXJlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUdXJucyByYW5kb21pemF0aW9uIGluIGNvbm5lY3Qgb3JkZXIgb24gb3Igb2ZmLgorICAgICAqCisgICAgICogQHBhcmFtIGJvb2wgJHJhbmRvbWl6ZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRSYW5kb21pemUoJHJhbmRvbWl6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5yYW5kb21pemVfID0gJHJhbmRvbWl6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGFsd2F5cyB0cnkgdGhlIGxhc3Qgc2VydmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGJvb2wgJGFsd2F5c1RyeUxhc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0QWx3YXlzVHJ5TGFzdCgkYWx3YXlzVHJ5TGFzdCkKKyAgICB7CisgICAgICAgICR0aGlzLT5hbHdheXNUcnlMYXN0XyA9ICRhbHdheXNUcnlMYXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRoZSBzb2NrZXQgYnkgaXRlcmF0aW5nIHRocm91Z2ggYWxsIHRoZSBzZXJ2ZXJzIGluIHRoZSBwb29sCisgICAgICogYW5kIHRyeWluZyB0byBmaW5kIG9uZSB0aGF0IHdvcmtzLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgICAgIC8vIENoZWNrIGlmIHdlIHdhbnQgb3JkZXIgcmFuZG9taXphdGlvbgorICAgICAgICBpZiAoJHRoaXMtPnJhbmRvbWl6ZV8pIHsKKyAgICAgICAgICAgIHNodWZmbGUoJHRoaXMtPnNlcnZlcnNfKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvdW50IHNlcnZlcnMgdG8gaWRlbnRpZnkgdGhlICJsYXN0IiBvbmUKKyAgICAgICAgJG51bVNlcnZlcnMgPSBjb3VudCgkdGhpcy0+c2VydmVyc18pOworCisgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRudW1TZXJ2ZXJzOyArKyRpKSB7CisgICAgICAgICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSAkaG9zdCBhbmQgJHBvcnQgdmFyaWFibGVzCisgICAgICAgICAgICBleHRyYWN0KCR0aGlzLT5zZXJ2ZXJzX1skaV0pOworCisgICAgICAgICAgICAvLyBDaGVjayBBUEMgY2FjaGUgZm9yIGEgcmVjb3JkIG9mIHRoaXMgc2VydmVyIGJlaW5nIGRvd24KKyAgICAgICAgICAgICRmYWlsdGltZUtleSA9ICd0aHJpZnRfZmFpbHRpbWU6JyAuICRob3N0IC4gJzonIC4gJHBvcnQgLiAnfic7CisKKyAgICAgICAgICAgIC8vIENhY2hlIG1pc3M/IEFzc3VtZSBpdCdzIE9LCisgICAgICAgICAgICAkbGFzdEZhaWx0aW1lID0gYXBjX2ZldGNoKCRmYWlsdGltZUtleSk7CisgICAgICAgICAgICBpZiAoJGxhc3RGYWlsdGltZSA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAkbGFzdEZhaWx0aW1lID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJHJldHJ5SW50ZXJ2YWxQYXNzZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gQ2FjaGUgaGl0Li4ubWFrZSBzdXJlIGVub3VnaCB0aGUgcmV0cnkgaW50ZXJ2YWwgaGFzIGVsYXBzZWQKKyAgICAgICAgICAgIGlmICgkbGFzdEZhaWx0aW1lID4gMCkgeworICAgICAgICAgICAgICAgICRlbGFwc2VkID0gdGltZSgpIC0gJGxhc3RGYWlsdGltZTsKKyAgICAgICAgICAgICAgICBpZiAoJGVsYXBzZWQgPiAkdGhpcy0+cmV0cnlJbnRlcnZhbF8pIHsKKyAgICAgICAgICAgICAgICAgICAgJHJldHJ5SW50ZXJ2YWxQYXNzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmRlYnVnXykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRlYnVnSGFuZGxlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXRQb29sOiByZXRyeUludGVydmFsICcgLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoJyAuICR0aGlzLT5yZXRyeUludGVydmFsXyAuICcpICcgLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoYXMgcGFzc2VkIGZvciBob3N0ICcgLiAkaG9zdCAuICc6JyAuICRwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBPbmx5IGNvbm5lY3QgaWYgbm90IGluIHRoZSBtaWRkbGUgb2YgYSBmYWlsIGludGVydmFsLCBPUiBpZiB0aGlzCisgICAgICAgICAgICAvLyBpcyB0aGUgTEFTVCBzZXJ2ZXIgd2UgYXJlIHRyeWluZywganVzdCBoYW1tZXIgYXdheSBvbiBpdAorICAgICAgICAgICAgJGlzTGFzdFNlcnZlciA9IGZhbHNlOworICAgICAgICAgICAgaWYgKCR0aGlzLT5hbHdheXNUcnlMYXN0XykgeworICAgICAgICAgICAgICAgICRpc0xhc3RTZXJ2ZXIgPSAoJGkgPT0gKCRudW1TZXJ2ZXJzIC0gMSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKCRsYXN0RmFpbHRpbWUgPT09IDApIHx8CisgICAgICAgICAgICAgICAgKCRpc0xhc3RTZXJ2ZXIpIHx8CisgICAgICAgICAgICAgICAgKCRsYXN0RmFpbHRpbWUgPiAwICYmICRyZXRyeUludGVydmFsUGFzc2VkKSkgeworICAgICAgICAgICAgICAgIC8vIFNldCB1bmRlcmx5aW5nIFRTb2NrZXQgcGFyYW1zIHRvIHRoaXMgb25lCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfID0gJGhvc3Q7CisgICAgICAgICAgICAgICAgJHRoaXMtPnBvcnRfID0gJHBvcnQ7CisKKyAgICAgICAgICAgICAgICAvLyBUcnkgdXAgdG8gbnVtUmV0cmllc18gY29ubmVjdGlvbnMgcGVyIHNlcnZlcgorICAgICAgICAgICAgICAgIGZvciAoJGF0dGVtcHQgPSAwOyAkYXR0ZW1wdCA8ICR0aGlzLT5udW1SZXRyaWVzXzsgJGF0dGVtcHQrKykgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSB1bmRlcmx5aW5nIFRTb2NrZXQgb3BlbiBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OjpvcGVuKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgY2xlYXIgdGhlIGZhaWx1cmUgY291bnRzIGlmIHJlcXVpcmVkIHRvIGRvIHNvCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGxhc3RGYWlsdGltZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGNfc3RvcmUoJGZhaWx0aW1lS2V5LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VjY2Vzc2Z1bCBjb25uZWN0aW9uLCByZXR1cm4gbm93CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gJHR4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25uZWN0aW9uIGZhaWxlZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gTWFyayBmYWlsdXJlIG9mIHRoaXMgaG9zdCBpbiB0aGUgY2FjaGUKKyAgICAgICAgICAgICAgICAkY29uc2VjZmFpbHNLZXkgPSAndGhyaWZ0X2NvbnNlY2ZhaWxzOicgLiAkaG9zdCAuICc6JyAuICRwb3J0IC4gJ34nOworCisgICAgICAgICAgICAgICAgLy8gSWdub3JlIGNhY2hlIG1pc3NlcworICAgICAgICAgICAgICAgICRjb25zZWNmYWlscyA9IGFwY19mZXRjaCgkY29uc2VjZmFpbHNLZXkpOworICAgICAgICAgICAgICAgIGlmICgkY29uc2VjZmFpbHMgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgICRjb25zZWNmYWlscyA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSW5jcmVtZW50IGJ5IG9uZQorICAgICAgICAgICAgICAgICRjb25zZWNmYWlscysrOworCisgICAgICAgICAgICAgICAgLy8gTG9nIGFuZCBjYWNoZSB0aGlzIGZhaWx1cmUKKyAgICAgICAgICAgICAgICBpZiAoJGNvbnNlY2ZhaWxzID49ICR0aGlzLT5tYXhDb25zZWN1dGl2ZUZhaWx1cmVzXykgeworICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmRlYnVnXykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRlYnVnSGFuZGxlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXRQb29sOiBtYXJraW5nICcgLiAkaG9zdCAuICc6JyAuICRwb3J0IC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGFzIGRvd24gZm9yICcgLiAkdGhpcy0+cmV0cnlJbnRlcnZhbF8gLiAnIHNlY3MgJyAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FmdGVyICcgLiAkY29uc2VjZmFpbHMgLiAnIGZhaWxlZCBhdHRlbXB0cy4nCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBmYWlsdXJlIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgYXBjX3N0b3JlKCRmYWlsdGltZUtleSwgdGltZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgY291bnQgb2YgY29uc2VjdXRpdmUgZmFpbHVyZXMKKyAgICAgICAgICAgICAgICAgICAgYXBjX3N0b3JlKCRjb25zZWNmYWlsc0tleSwgMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXBjX3N0b3JlKCRjb25zZWNmYWlsc0tleSwgJGNvbnNlY2ZhaWxzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBPaCBubzsgd2UgZmFpbGVkIHRoZW0gYWxsLiBUaGUgc3lzdGVtIGlzIHRvdGFsbHkgaWxsIQorICAgICAgICAkZXJyb3IgPSAnVFNvY2tldFBvb2w6IEFsbCBob3N0cyBpbiBwb29sIGFyZSBkb3duLiAnOworICAgICAgICAkaG9zdHMgPSBhcnJheSgpOworICAgICAgICBmb3JlYWNoICgkdGhpcy0+c2VydmVyc18gYXMgJHNlcnZlcikgeworICAgICAgICAgICAgJGhvc3RzIFtdID0gJHNlcnZlclsnaG9zdCddIC4gJzonIC4gJHNlcnZlclsncG9ydCddOworICAgICAgICB9CisgICAgICAgICRob3N0bGlzdCA9IGltcGxvZGUoJywnLCAkaG9zdHMpOworICAgICAgICAkZXJyb3IgLj0gJygnIC4gJGhvc3RsaXN0IC4gJyknOworICAgICAgICBpZiAoJHRoaXMtPmRlYnVnXykgeworICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmRlYnVnSGFuZGxlcl8sICRlcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFRyYW5zcG9ydC5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFRyYW5zcG9ydC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5MjFjNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UVHJhbnNwb3J0LnBocApAQCAtMCwwICsxLDk4IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIEJhc2UgaW50ZXJmYWNlIGZvciBhIHRyYW5zcG9ydCBhZ2VudC4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2Fic3RyYWN0IGNsYXNzIFRUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBvcGVuCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpOworCisgICAgLyoqCisgICAgICogT3BlbiB0aGUgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcKKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3Qgb3BlbgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBvcGVuKCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgdHJhbnNwb3J0LgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpOworCisgICAgLyoqCisgICAgICogUmVhZCBzb21lIGRhdGEgaW50byB0aGUgYXJyYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICRsZW4gSG93IG11Y2ggdG8gcmVhZAorICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhIHRoYXQgaGFzIGJlZW4gcmVhZAorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3QgcmVhZCBhbnkgbW9yZSBkYXRhCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbik7CisKKyAgICAvKioKKyAgICAgKiBHdWFyYW50ZWVzIHRoYXQgdGhlIGZ1bGwgYW1vdW50IG9mIGRhdGEgaXMgcmVhZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhLCBvZiBleGFjdCBsZW5ndGgKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IHJlYWQgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQWxsKCRsZW4pCisgICAgeworICAgICAgICAvLyByZXR1cm4gJHRoaXMtPnJlYWQoJGxlbik7CisKKyAgICAgICAgJGRhdGEgPSAnJzsKKyAgICAgICAgJGdvdCA9IDA7CisgICAgICAgIHdoaWxlICgoJGdvdCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkZGF0YSkpIDwgJGxlbikgeworICAgICAgICAgICAgJGRhdGEgLj0gJHRoaXMtPnJlYWQoJGxlbiAtICRnb3QpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRkYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgZ2l2ZW4gZGF0YSBvdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRidWYgVGhlIGRhdGEgdG8gd3JpdGUKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgd3JpdGluZyBmYWlscworICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKTsKKworICAgIC8qKgorICAgICAqIEZsdXNoZXMgYW55IHBlbmRpbmcgZGF0YSBvdXQgb2YgYSBidWZmZXIKKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhIHdyaXRpbmcgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHlwZS9UQ29uc3RhbnQucGhwIGIvbGliL3BocC9saWIvVHlwZS9UQ29uc3RhbnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNWRhNGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UeXBlL1RDb25zdGFudC5waHAKQEAgLTAsMCArMSw1MiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUeXBlOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGNvbnN0YW50IE1hbmFnZW1lbnQKKyAqLworYWJzdHJhY3QgY2xhc3MgVENvbnN0YW50Cit7CisgICAgLyoqCisgICAgICogRG9uJ3QgaW5zdGFuY2lhdGUgdGhpcyBjbGFzcworICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCisgICAgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIGNvbnN0YW50IHZhbHVlCisgICAgICogQHBhcmFtICBzdHJpbmcgJGNvbnN0YW50CisgICAgICogQHJldHVybiBtaXhlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0KCRjb25zdGFudCkKKyAgICB7CisgICAgICAgIGlmIChpc19udWxsKHN0YXRpYzo6JCRjb25zdGFudCkpIHsKKyAgICAgICAgICAgIHN0YXRpYzo6JCRjb25zdGFudCA9IGNhbGxfdXNlcl9mdW5jKAorICAgICAgICAgICAgICAgIHNwcmludGYoJ3N0YXRpYzo6aW5pdF8lcycsICRjb25zdGFudCkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3RhdGljOjokJGNvbnN0YW50OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1R5cGUvVE1lc3NhZ2VUeXBlLnBocCBiL2xpYi9waHAvbGliL1R5cGUvVE1lc3NhZ2VUeXBlLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzlhZTYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHlwZS9UTWVzc2FnZVR5cGUucGhwCkBAIC0wLDAgKzEsMzQgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHlwZTsKKworLyoqCisgKiBNZXNzYWdlIHR5cGVzIGZvciBSUEMKKyAqLworY2xhc3MgVE1lc3NhZ2VUeXBlCit7CisgICAgY29uc3QgQ0FMTCAgPSAxOworICAgIGNvbnN0IFJFUExZID0gMjsKKyAgICBjb25zdCBFWENFUFRJT04gPSAzOworICAgIGNvbnN0IE9ORVdBWSA9IDQ7Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UeXBlL1RUeXBlLnBocCBiL2xpYi9waHAvbGliL1R5cGUvVFR5cGUucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZGIxNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UeXBlL1RUeXBlLnBocApAQCAtMCwwICsxLDQ3IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFR5cGU7CisKKy8qKgorICogRGF0YSB0eXBlcyB0aGF0IGNhbiBiZSBzZW50IHZpYSBUaHJpZnQKKyAqLworY2xhc3MgVFR5cGUKK3sKKyAgICBjb25zdCBTVE9QICAgPSAwOworICAgIGNvbnN0IFZPSUQgICA9IDE7CisgICAgY29uc3QgQk9PTCAgID0gMjsKKyAgICBjb25zdCBCWVRFICAgPSAzOworICAgIGNvbnN0IEkwOCAgICA9IDM7CisgICAgY29uc3QgRE9VQkxFID0gNDsKKyAgICBjb25zdCBJMTYgICAgPSA2OworICAgIGNvbnN0IEkzMiAgICA9IDg7CisgICAgY29uc3QgSTY0ICAgID0gMTA7CisgICAgY29uc3QgU1RSSU5HID0gMTE7CisgICAgY29uc3QgVVRGNyAgID0gMTE7CisgICAgY29uc3QgU1RSVUNUID0gMTI7CisgICAgY29uc3QgTUFQICAgID0gMTM7CisgICAgY29uc3QgU0VUICAgID0gMTQ7CisgICAgY29uc3QgTFNUICAgID0gMTU7ICAgIC8vIE4uQi4gY2Fubm90IHVzZSBMSVNUIGtleXdvcmQgaW4gUEhQIQorICAgIGNvbnN0IFVURjggICA9IDE2OworICAgIGNvbnN0IFVURjE2ICA9IDE3OworfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvVFN0cmluZ1V0aWxzLnBocCBiL2xpYi9waHAvc3JjL1RTdHJpbmdVdGlscy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk0YmFmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvc3JjL1RTdHJpbmdVdGlscy5waHAKQEAgLTAsMCArMSw5MCBAQAorPD9waHAKKworaW50ZXJmYWNlIFRTdHJpbmdGdW5jCit7CisgICAgcHVibGljIGZ1bmN0aW9uIHN1YnN0cigkc3RyLCAkc3RhcnQsICRsZW5ndGggPSBudWxsKTsKKyAgICBwdWJsaWMgZnVuY3Rpb24gc3RybGVuKCRzdHIpOworfQorCitjbGFzcyBUU3RyaW5nRnVuY19Db3JlCitpbXBsZW1lbnRzIFRTdHJpbmdGdW5jIHsKKyAgICBwdWJsaWMgZnVuY3Rpb24gc3Vic3RyKCRzdHIsICRzdGFydCwgJGxlbmd0aCA9IG51bGwpCisgICAgeworICAgICAgICAvLyBzcGVjaWZ5aW5nIGEgbnVsbCAkbGVuZ3RoIHdvdWxkIHJldHVybiBhbiBlbXB0eSBzdHJpbmcKKyAgICAgICAgaWYgKCRsZW5ndGggPT09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBzdWJzdHIoJHN0ciwgJHN0YXJ0KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gc3RybGVuKCRzdHIpCisgICAgeworICAgICAgICByZXR1cm4gc3RybGVuKCRzdHIpOworICAgIH0KK30KKworY2xhc3MgVFN0cmluZ0Z1bmNfTWJzdHJpbmcKK2ltcGxlbWVudHMgVFN0cmluZ0Z1bmMgeworICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoID0gbnVsbCkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBXZSBuZWVkIHRvIHNldCB0aGUgY2hhcnNldCBwYXJhbWV0ZXIsIHdoaWNoIGlzIHRoZSBzZWNvbmQKKyAgICAgICAgICogb3B0aW9uYWwgcGFyYW1ldGVyIGFuZCB0aGUgZmlyc3Qgb3B0aW9uYWwgcGFyYW1ldGVyIGNhbid0CisgICAgICAgICAqIGJlIG51bGwgb3IgZmFsc2UgYXMgYSAibWFnaWMiIHZhbHVlIGJlY2F1c2UgdGhhdCB3b3VsZAorICAgICAgICAgKiBjYXVzZSBhbiBlbXB0eSBzdHJpbmcgdG8gYmUgcmV0dXJuZWQsIHNvIHdlIG5lZWQgdG8KKyAgICAgICAgICogYWN0dWFsbHkgY2FsY3VsYXRlIHRoZSBwcm9wZXIgbGVuZ3RoIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCRsZW5ndGggPT09IG51bGwpIHsKKyAgICAgICAgICAgICRsZW5ndGggPSAkdGhpcy0+c3RybGVuKCRzdHIpIC0gJHN0YXJ0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1iX3N1YnN0cigkc3RyLCAkc3RhcnQsICRsZW5ndGgsICc4Yml0Jyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHN0cmxlbigkc3RyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1iX3N0cmxlbigkc3RyLCAnOGJpdCcpOworICAgIH0KK30KKworY2xhc3MgVFN0cmluZ0Z1bmNGYWN0b3J5Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgJF9pbnN0YW5jZTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgU2luZ2xldG9uIGluc3RhbmNlIG9mIFRTdHJpbmdGdW5jIGltcGxlbWVudGF0aW9uIHRoYXQgaXMKKyAgICAgKiBjb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgc3lzdGVtJ3MgbWJzdHJpbmcuZnVuY19vdmVybG9hZCBzZXR0aW5ncy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVFN0cmluZ0Z1bmMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZSgpCisgICAgeworICAgICAgICBpZiAoIXNlbGY6OiRfaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIHNlbGY6Ol9zZXRJbnN0YW5jZSgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNlbGY6OiRfaW5zdGFuY2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3NldEluc3RhbmNlKCkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYW5ub3QgdXNlIHN0ciogZnVuY3Rpb25zIGZvciBieXRlIGNvdW50aW5nIGJlY2F1c2UgbXVsdGlieXRlCisgICAgICAgICAqIGNoYXJhY3RlcnMgd2lsbCBiZSByZWFkIGEgc2luZ2xlIGJ5dGVzLgorICAgICAgICAgKgorICAgICAgICAgKiBTZWU6IGh0dHA6Ly91cy5waHAubmV0L21hbnVhbC9lbi9tYnN0cmluZy5vdmVybG9hZC5waHAKKyAgICAgICAgICovCisgICAgICAgIGlmIChpbmlfZ2V0KCdtYnN0cmluZy5mdW5jX292ZXJsb2FkJykgJiAyKSB7CisgICAgICAgICAgICBzZWxmOjokX2luc3RhbmNlID0gbmV3IFRTdHJpbmdGdW5jX01ic3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgLyoqCisgICAgICAgICAqIG1ic3RyaW5nIGlzIG5vdCBpbnN0YWxsZWQgb3IgZG9lcyBub3QgaGF2ZSBmdW5jdGlvbiBvdmVybG9hZGluZworICAgICAgICAgKiBvZiB0aGUgc3RyKiBmdW5jdGlvbnMgZW5hYmxlZCBzbyB1c2UgUEhQIGNvcmUgc3RyKiBmdW5jdGlvbnMgZm9yCisgICAgICAgICAqIGJ5dGUgY291bnRpbmcuCisgICAgICAgICAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNlbGY6OiRfaW5zdGFuY2UgPSBuZXcgVFN0cmluZ0Z1bmNfQ29yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvVGhyaWZ0LnBocCBiL2xpYi9waHAvc3JjL1RocmlmdC5waHAKaW5kZXggZDJhOTQ0MS4uNGZlNDM5MiAxMDA2NDQKLS0tIGEvbGliL3BocC9zcmMvVGhyaWZ0LnBocAorKysgYi9saWIvcGhwL3NyYy9UaHJpZnQucGhwCkBAIC0yMCwxMSArMjAsMTEgQEAKICAqIEBwYWNrYWdlIHRocmlmdAogICovCiAKLQogLyoqCiAgKiBEYXRhIHR5cGVzIHRoYXQgY2FuIGJlIHNlbnQgdmlhIFRocmlmdAogICovCi1jbGFzcyBUVHlwZSB7CitjbGFzcyBUVHlwZQorewogICBjb25zdCBTVE9QICAgPSAwOwogICBjb25zdCBWT0lEICAgPSAxOwogICBjb25zdCBCT09MICAgPSAyOwpAQCAtNDcsNyArNDcsOCBAQAogLyoqCiAgKiBNZXNzYWdlIHR5cGVzIGZvciBSUEMKICAqLwotY2xhc3MgVE1lc3NhZ2VUeXBlIHsKK2NsYXNzIFRNZXNzYWdlVHlwZQorewogICBjb25zdCBDQUxMICA9IDE7CiAgIGNvbnN0IFJFUExZID0gMjsKICAgY29uc3QgRVhDRVBUSU9OID0gMzsKQEAgLTY3LDggKzY4LDEwIEBACiAgKiBAcGFyYW0gbWl4ZWQgJHAxIE1lc3NhZ2UgKHN0cmluZykgb3IgdHlwZS1zcGVjIChhcnJheSkKICAqIEBwYXJhbSBtaXhlZCAkcDIgQ29kZSAoaW50ZWdlcikgb3IgdmFsdWVzIChhcnJheSkKICAqLwotY2xhc3MgVEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwMT1udWxsLCAkcDI9MCkgeworY2xhc3MgVEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgoreworICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHAxPW51bGwsICRwMj0wKQorICB7CiAgICAgaWYgKGlzX2FycmF5KCRwMSkgJiYgaXNfYXJyYXkoJHAyKSkgewogICAgICAgJHNwZWMgPSAkcDE7CiAgICAgICAkdmFscyA9ICRwMjsKQEAgLTkxLDcgKzk0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OkRPVUJMRSA9PiAnRG91YmxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OlNUUklORyA9PiAnU3RyaW5nJyk7CiAKLSAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZE1hcCgmJHZhciwgJHNwZWMsICRpbnB1dCkgeworICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTWFwKCYkdmFyLCAkc3BlYywgJGlucHV0KQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOwogICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOwpAQCAtMTU0LDEwICsxNTgsMTIgQEAKICAgICAgICR2YXJbJGtleV0gPSAkdmFsOwogICAgIH0KICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBFbmQoKTsKKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogCi0gIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRMaXN0KCYkdmFyLCAkc3BlYywgJGlucHV0LCAkc2V0PWZhbHNlKSB7CisgIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRMaXN0KCYkdmFyLCAkc3BlYywgJGlucHV0LCAkc2V0PWZhbHNlKQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICRldHlwZSA9ICRzcGVjWydldHlwZSddOwogICAgICRlcmVhZCA9ICR2cmVhZCA9IG51bGw7CkBAIC0yMDcsMTAgKzIxMywxMiBAQAogICAgIH0gZWxzZSB7CiAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7CiAgICAgfQorCiAgICAgcmV0dXJuICR4ZmVyOwogICB9CiAKLSAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9yZWFkKCRjbGFzcywgJHNwZWMsICRpbnB1dCkgeworICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3JlYWQoJGNsYXNzLCAkc3BlYywgJGlucHV0KQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICRmbmFtZSA9IG51bGw7CiAgICAgJGZ0eXBlID0gMDsKQEAgLTI1NiwxMCArMjY0LDEyIEBACiAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEVuZCgpOwogICAgIH0KICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsKKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogCi0gIHByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTWFwKCR2YXIsICRzcGVjLCAkb3V0cHV0KSB7CisgIHByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTWFwKCR2YXIsICRzcGVjLCAkb3V0cHV0KQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOwogICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOwpAQCAtMzE0LDEwICszMjQsMTIgQEAKICAgICAgIH0KICAgICB9CiAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBFbmQoKTsKKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogCi0gIHByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTGlzdCgkdmFyLCAkc3BlYywgJG91dHB1dCwgJHNldD1mYWxzZSkgeworICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxpc3QoJHZhciwgJHNwZWMsICRvdXRwdXQsICRzZXQ9ZmFsc2UpCisgIHsKICAgICAkeGZlciA9IDA7CiAgICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107CiAgICAgJGV3cml0ZSA9IG51bGw7CkBAIC0zNTcsMTAgKzM2OSwxMiBAQAogICAgIH0gZWxzZSB7CiAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RFbmQoKTsKICAgICB9CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIAotICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3dyaXRlKCRjbGFzcywgJHNwZWMsICRvdXRwdXQpIHsKKyAgcHJvdGVjdGVkIGZ1bmN0aW9uIF93cml0ZSgkY2xhc3MsICRzcGVjLCAkb3V0cHV0KQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJGNsYXNzKTsKICAgICBmb3JlYWNoICgkc3BlYyBhcyAkZmlkID0+ICRmc3BlYykgewpAQCAtMzkyLDYgKzQwNiw3IEBACiAgICAgfQogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7CiAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogCkBAIC00MDQsOCArNDE5LDggQEAKICAqIG9mIFBIUC4gTm90ZSB0aGF0IGNvZGUgaXMgaW50ZW50aW9uYWxseSBkdXBsaWNhdGVkIGluIGhlcmUgdG8gYXZvaWQgbWFraW5nCiAgKiBmdW5jdGlvbiBjYWxscyBmb3IgZXZlcnkgZmllbGQgb3IgbWVtYmVyIG9mIGEgY29udGFpbmVyLi4KICAqLwotYWJzdHJhY3QgY2xhc3MgVEJhc2UgewotCithYnN0cmFjdCBjbGFzcyBUQmFzZQorewogICBzdGF0aWMgJHRtZXRob2QgPSBhcnJheShUVHlwZTo6Qk9PTCAgID0+ICdCb29sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OkJZVEUgICA9PiAnQnl0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpJMTYgICAgPT4gJ0kxNicsCkBAIC00MTQsMTEgKzQyOSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6RE9VQkxFID0+ICdEb3VibGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6U1RSSU5HID0+ICdTdHJpbmcnKTsKIAotICBhYnN0cmFjdCBmdW5jdGlvbiByZWFkKCRpbnB1dCk7CisgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkKCRpbnB1dCk7CiAKLSAgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGUoJG91dHB1dCk7CisgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkb3V0cHV0KTsKIAotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHNwZWM9bnVsbCwgJHZhbHM9bnVsbCkgeworICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHNwZWM9bnVsbCwgJHZhbHM9bnVsbCkKKyAgewogICAgIGlmIChpc19hcnJheSgkc3BlYykgJiYgaXNfYXJyYXkoJHZhbHMpKSB7CiAgICAgICBmb3JlYWNoICgkc3BlYyBhcyAkZmlkID0+ICRmc3BlYykgewogICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKQEAgLTQyOSw3ICs0NDUsOCBAQAogICAgIH0KICAgfQogCi0gIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRNYXAoJiR2YXIsICRzcGVjLCAkaW5wdXQpIHsKKyAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZE1hcCgmJHZhciwgJHNwZWMsICRpbnB1dCkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAka3R5cGUgPSAkc3BlY1sna3R5cGUnXTsKICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKQEAgLTQ5MiwxMCArNTA5LDEyIEBACiAgICAgICAkdmFyWyRrZXldID0gJHZhbDsKICAgICB9CiAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwRW5kKCk7CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIAotICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTGlzdCgmJHZhciwgJHNwZWMsICRpbnB1dCwgJHNldD1mYWxzZSkgeworICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTGlzdCgmJHZhciwgJHNwZWMsICRpbnB1dCwgJHNldD1mYWxzZSkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAkZXR5cGUgPSAkc3BlY1snZXR5cGUnXTsKICAgICAkZXJlYWQgPSAkdnJlYWQgPSBudWxsOwpAQCAtNTQ1LDEwICs1NjQsMTIgQEAKICAgICB9IGVsc2UgewogICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEVuZCgpOwogICAgIH0KKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogCi0gIHByb3RlY3RlZCBmdW5jdGlvbiBfcmVhZCgkY2xhc3MsICRzcGVjLCAkaW5wdXQpIHsKKyAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9yZWFkKCRjbGFzcywgJHNwZWMsICRpbnB1dCkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAkZm5hbWUgPSBudWxsOwogICAgICRmdHlwZSA9IDA7CkBAIC01OTQsMTAgKzYxNSwxMiBAQAogICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsKICAgICB9CiAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIAotICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZU1hcCgkdmFyLCAkc3BlYywgJG91dHB1dCkgeworICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZU1hcCgkdmFyLCAkc3BlYywgJG91dHB1dCkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAka3R5cGUgPSAkc3BlY1sna3R5cGUnXTsKICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKQEAgLTY1MiwxMCArNjc1LDEyIEBACiAgICAgICB9CiAgICAgfQogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwRW5kKCk7CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIAotICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxpc3QoJHZhciwgJHNwZWMsICRvdXRwdXQsICRzZXQ9ZmFsc2UpIHsKKyAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVMaXN0KCR2YXIsICRzcGVjLCAkb3V0cHV0LCAkc2V0PWZhbHNlKQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICRldHlwZSA9ICRzcGVjWydldHlwZSddOwogICAgICRld3JpdGUgPSBudWxsOwpAQCAtNjk1LDEwICs3MjAsMTIgQEAKICAgICB9IGVsc2UgewogICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7CiAgICAgfQorCiAgICAgcmV0dXJuICR4ZmVyOwogICB9CiAKLSAgcHJvdGVjdGVkIGZ1bmN0aW9uIF93cml0ZSgkY2xhc3MsICRzcGVjLCAkb3V0cHV0KSB7CisgIHByb3RlY3RlZCBmdW5jdGlvbiBfd3JpdGUoJGNsYXNzLCAkc3BlYywgJG91dHB1dCkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCRjbGFzcyk7CiAgICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKQEAgLTczMCwxMSArNzU3LDEzIEBACiAgICAgfQogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7CiAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogfQogCi1jbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIHsKK2NsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24KK3sKICAgc3RhdGljICRfVFNQRUMgPQogICAgIGFycmF5KDEgPT4gYXJyYXkoJ3ZhcicgPT4gJ21lc3NhZ2UnLAogICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnID0+IFRUeXBlOjpTVFJJTkcpLApAQCAtNzUwLDE1ICs3NzksMTggQEAKICAgY29uc3QgSU5URVJOQUxfRVJST1IgPSA2OwogICBjb25zdCBQUk9UT0NPTF9FUlJPUiA9IDc7CiAKLSAgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1lc3NhZ2U9bnVsbCwgJGNvZGU9MCkgeworICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1lc3NhZ2U9bnVsbCwgJGNvZGU9MCkKKyAgewogICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlKTsKICAgfQogCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRvdXRwdXQpIHsKKyAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJG91dHB1dCkKKyAgewogICAgIHJldHVybiAkdGhpcy0+X3JlYWQoJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicsIHNlbGY6OiRfVFNQRUMsICRvdXRwdXQpOwogICB9CiAKLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRvdXRwdXQpIHsKKyAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRvdXRwdXQpCisgIHsKICAgICAkeGZlciA9IDA7CiAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbignVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7CiAgICAgaWYgKCRtZXNzYWdlID0gJHRoaXMtPmdldE1lc3NhZ2UoKSkgewpAQCAtNzczLDYgKzgwNSw3IEBACiAgICAgfQogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7CiAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogfQpAQCAtNzg1LDMgKzgxOCw0IEBACiB9CiBpbmNsdWRlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9wcm90b2NvbC9UUHJvdG9jb2wucGhwJzsKIGluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3RyYW5zcG9ydC9UVHJhbnNwb3J0LnBocCc7CitpbmNsdWRlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9UU3RyaW5nVXRpbHMucGhwJzsKZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL2F1dG9sb2FkLnBocCBiL2xpYi9waHAvc3JjL2F1dG9sb2FkLnBocAppbmRleCAzYTM1NTQ1Li44NWJkNzk3IDEwMDY0NAotLS0gYS9saWIvcGhwL3NyYy9hdXRvbG9hZC5waHAKKysrIGIvbGliL3BocC9zcmMvYXV0b2xvYWQucGhwCkBAIC0yMCw3ICsyMCw2IEBACiAgKiBAcGFja2FnZSB0aHJpZnQKICAqLwogCi0KIC8qKgogICogSW5jbHVkZSB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXNlIGF1dG9sb2FkIHdpdGggeW91ciBQSFAgZ2VuZXJhdGVkIFRocmlmdAogICogY29kZS4gVGhlIGdlbmVyYXRlZCBjb2RlIHdpbGwgKm5vdCogaW5jbHVkZSBhbnkgZGVmaW5lZCBUaHJpZnQgY2xhc3NlcyBieQpAQCAtMzcsMTIgKzM2LDEzIEBACiAkR0xPQkFMU1snQVVUT0xPQURfSE9PS1MnXSA9IGFycmF5KCk7CiAKIGlmICghZnVuY3Rpb25fZXhpc3RzKCdfX2F1dG9sb2FkJykpIHsKLSAgZnVuY3Rpb24gX19hdXRvbG9hZCgkY2xhc3MpIHsKKyAgZnVuY3Rpb24gX19hdXRvbG9hZCgkY2xhc3MpCisgIHsKICAgICBnbG9iYWwgJFRIUklGVF9BVVRPTE9BRDsKICAgICAkY2xhc3NsID0gc3RydG9sb3dlcigkY2xhc3MpOwogICAgIGlmIChpc3NldCgkVEhSSUZUX0FVVE9MT0FEWyRjbGFzc2xdKSkgewogICAgICAgaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvcGFja2FnZXMvJy4kVEhSSUZUX0FVVE9MT0FEWyRjbGFzc2xdOwotICAgIH0gZWxzZSBpZiAoIWVtcHR5KCRHTE9CQUxTWydBVVRPTE9BRF9IT09LUyddKSkgeworICAgIH0gZWxzZWlmICghZW1wdHkoJEdMT0JBTFNbJ0FVVE9MT0FEX0hPT0tTJ10pKSB7CiAgICAgICBmb3JlYWNoICgkR0xPQkFMU1snQVVUT0xPQURfSE9PS1MnXSBhcyAkaG9vaykgewogICAgICAgICAkaG9vaygkY2xhc3MpOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQgYi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZy5tNAppbmRleCAyYzMzOGEwLi5lMjEzOGM4IDEwMDY0NAotLS0gYS9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZy5tNAorKysgYi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZy5tNApAQCAtMiwxNCArMiwzMyBAQAogZG5sIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCiBkbmwgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0CiBkbmwgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgorZG5sCitkbmwgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorZG5sIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkbmwgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK2RubCByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK2RubCB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCitkbmwgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorZG5sIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorZG5sCitkbmwgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorZG5sCitkbmwgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorZG5sIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCitkbmwgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitkbmwgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK2RubCBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCitkbmwgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIFBIUF9BUkdfRU5BQkxFKHRocmlmdF9wcm90b2NvbCwgd2hldGhlciB0byBlbmFibGUgdGhlIHRocmlmdF9wcm90b2NvbCBleHRlbnNpb24sCi1bICAtLWVuYWJsZS10aHJpZnRfcHJvdG9jb2wJRW5hYmxlIHRoZSBmYnRocmlmdF9wcm90b2NvbCBleHRlbnNpb25dKQorWyAgLS1lbmFibGUtdGhyaWZ0X3Byb3RvY29sCUVuYWJsZSB0aGUgdGhyaWZ0X3Byb3RvY29sIGV4dGVuc2lvbl0pCiAKIGlmIHRlc3QgIiRQSFBfVEhSSUZUX1BST1RPQ09MIiAhPSAibm8iOyB0aGVuCiAgIFBIUF9SRVFVSVJFX0NYWCgpCiAgIFBIUF9BRERfTElCUkFSWV9XSVRIX1BBVEgoc3RkYysrLCAiIiwgVEhSSUZUX1BST1RPQ09MX1NIQVJFRF9MSUJBREQpCiAgIFBIUF9TVUJTVChUSFJJRlRfUFJPVE9DT0xfU0hBUkVEX0xJQkFERCkKKyAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAtc3RkPWMrKzExIgorCiAgIFBIUF9ORVdfRVhURU5TSU9OKHRocmlmdF9wcm90b2NvbCwgcGhwX3RocmlmdF9wcm90b2NvbC5jcHAsICRleHRfc2hhcmVkKQogZmkKIApkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmNwcCBiL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5jcHAKaW5kZXggM2UzMmNiOS4uNjNjODkwNSAxMDA2NDQKLS0tIGEvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmNwcAorKysgYi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuY3BwCkBAIC0xNiwyNSArMTYsMjMgQEAKICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi0KICNpZmRlZiBIQVZFX0NPTkZJR19ICiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjZW5kaWYKIAorI2luY2x1ZGUgInBocC5oIgorI2luY2x1ZGUgInplbmRfaW50ZXJmYWNlcy5oIgorI2luY2x1ZGUgInplbmRfZXhjZXB0aW9ucy5oIgorI2luY2x1ZGUgInBocF90aHJpZnRfcHJvdG9jb2wuaCIKKworI2lmIFBIUF9WRVJTSU9OX0lEID49IDcwMDAwCisKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBkZWZpbmVkKCBXSU4zMiApIHx8IGRlZmluZWQoIF9XSU42NCApCi10eXBlZGVmIGludCAgaW50MzJfdDsgCi10eXBlZGVmIHNpZ25lZCBjaGFyIGludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVpbnQ4X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1aW50MTZfdDsKLXR5cGVkZWYgbG9uZyBsb25nICBpbnQ2NF90OwotdHlwZWRlZiB1bnNpZ25lZCAgIHVpbnQzMl90OyAKLXR5cGVkZWYgc2hvcnQgIGludDE2X3Q7IAotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgICB1aW50NjRfdDsKLSNlbHNlCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+IAotI2VuZGlmCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxjc3RkaW50PgogI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CiAKICNpZm5kZWYgYnN3YXBfNjQKICNkZWZpbmUJYnN3YXBfNjQoeCkgICAgICgoKHVpbnQ2NF90KSh4KSA8PCA1NikgfCBcCkBAIC04NywyNiArODUsMjIgQEAKIGNvbnN0IGludCBJTlZBTElEX0RBVEEgPSAxOwogY29uc3QgaW50IEJBRF9WRVJTSU9OID0gNDsKIAotI2luY2x1ZGUgInBocC5oIgotI2luY2x1ZGUgInplbmRfaW50ZXJmYWNlcy5oIgotI2luY2x1ZGUgInplbmRfZXhjZXB0aW9ucy5oIgotI2luY2x1ZGUgInBocF90aHJpZnRfcHJvdG9jb2wuaCIKLQotc3RhdGljIGZ1bmN0aW9uX2VudHJ5IHRocmlmdF9wcm90b2NvbF9mdW5jdGlvbnNbXSA9IHsKLSAgUEhQX0ZFKHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnksIE5VTEwpCi0gIFBIUF9GRSh0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnksIE5VTEwpCi0gIHtOVUxMLCBOVUxMLCBOVUxMfQotfSA7CitzdGF0aWMgemVuZF9mdW5jdGlvbl9lbnRyeSB0aHJpZnRfcHJvdG9jb2xfZnVuY3Rpb25zW10gPSB7CisgIFBIUF9GRSh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5LCBudWxscHRyKQorICBQSFBfRkUodGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5LCBudWxscHRyKQorICBQSFBfRkUodGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5X2FmdGVyX21lc3NhZ2VfYmVnaW4sIG51bGxwdHIpCisgIHtudWxscHRyLCBudWxscHRyLCBudWxscHRyfQorfTsKIAogemVuZF9tb2R1bGVfZW50cnkgdGhyaWZ0X3Byb3RvY29sX21vZHVsZV9lbnRyeSA9IHsKICAgU1RBTkRBUkRfTU9EVUxFX0hFQURFUiwKICAgInRocmlmdF9wcm90b2NvbCIsCiAgIHRocmlmdF9wcm90b2NvbF9mdW5jdGlvbnMsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCisgIG51bGxwdHIsCisgIG51bGxwdHIsCisgIG51bGxwdHIsCisgIG51bGxwdHIsCisgIG51bGxwdHIsCiAgICIxLjAiLAogICBTVEFOREFSRF9NT0RVTEVfUFJPUEVSVElFUwogfTsKQEAgLTExNyw0MiArMTExLDYxIEBACiAKIGNsYXNzIFBIUEV4Y2VwdGlvbldyYXBwZXIgOiBwdWJsaWMgc3RkOjpleGNlcHRpb24gewogcHVibGljOgotICBQSFBFeGNlcHRpb25XcmFwcGVyKHp2YWwqIF9leCkgdGhyb3coKSA6IGV4KF9leCkgewotICAgIHNucHJpbnRmKF93aGF0LCA0MCwgIlBIUCBleGNlcHRpb24genZhbD0lcCIsIGV4KTsKKyAgUEhQRXhjZXB0aW9uV3JhcHBlcih6dmFsKiBfZXgpIHRocm93KCkgeworICAgIFpWQUxfQ09QWSgmZXgsIF9leCk7CisgICAgc25wcmludGYoX3doYXQsIDQwLCAiUEhQIGV4Y2VwdGlvbiB6dmFsPSVwIiwgX2V4KTsKICAgfQotICBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKSB7IHJldHVybiBfd2hhdDsgfQotICB+UEhQRXhjZXB0aW9uV3JhcHBlcigpIHRocm93KCkge30KLSAgb3BlcmF0b3IgenZhbCooKSBjb25zdCB0aHJvdygpIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8enZhbCo+KGV4KTsgfSAvLyBaZW5kIEFQSSBkb2Vzbid0IGRvICdjb25zdCcuLi4KKworICBQSFBFeGNlcHRpb25XcmFwcGVyKHplbmRfb2JqZWN0KiBfZXhvYmopIHRocm93KCkgeworICAgIFpWQUxfT0JKKCZleCwgX2V4b2JqKTsKKyAgICBzbnByaW50Zihfd2hhdCwgNDAsICJQSFAgZXhjZXB0aW9uIHp2YWw9JXAiLCBfZXhvYmopOworICB9CisgIH5QSFBFeGNlcHRpb25XcmFwcGVyKCkgdGhyb3coKSB7CisgICAgenZhbF9kdG9yKCZleCk7CisgIH0KKworICBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKSB7CisgICAgcmV0dXJuIF93aGF0OworICB9CisgIG9wZXJhdG9yIHp2YWwqKCkgY29uc3QgdGhyb3coKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8enZhbCo+KCZleCk7CisgIH0gLy8gWmVuZCBBUEkgZG9lc24ndCBkbyAnY29uc3QnLi4uCiBwcm90ZWN0ZWQ6Ci0gIHp2YWwqIGV4OworICB6dmFsIGV4OwogICBjaGFyIF93aGF0WzQwXTsKIH0gOwogCiBjbGFzcyBQSFBUcmFuc3BvcnQgewotcHVibGljOgotICB6dmFsKiBwcm90b2NvbCgpIHsgcmV0dXJuIHA7IH0KLSAgenZhbCogdHJhbnNwb3J0KCkgeyByZXR1cm4gdDsgfQogcHJvdGVjdGVkOgotICBQSFBUcmFuc3BvcnQoKSB7fQorICBQSFBUcmFuc3BvcnQoenZhbCogX3AsIHNpemVfdCBfYnVmZmVyX3NpemUpIHsKKyAgICBhc3NlcnQoWl9UWVBFX1AoX3ApID09IElTX09CSkVDVCk7CiAKLSAgdm9pZCBjb25zdHJ1Y3Rfd2l0aF96dmFsKHp2YWwqIF9wLCBzaXplX3QgX2J1ZmZlcl9zaXplKSB7CisgICAgWlZBTF9VTkRFRigmdCk7CisKICAgICBidWZmZXIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihlbWFsbG9jKF9idWZmZXJfc2l6ZSkpOwogICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXI7CiAgICAgYnVmZmVyX3VzZWQgPSAwOwogICAgIGJ1ZmZlcl9zaXplID0gX2J1ZmZlcl9zaXplOwotICAgIHAgPSBfcDsKIAogICAgIC8vIEdldCB0aGUgdHJhbnNwb3J0IGZvciB0aGUgcGFzc2VkIHByb3RvY29sCiAgICAgenZhbCBnZXR0cmFuc3BvcnQ7Ci0gICAgWlZBTF9TVFJJTkcoJmdldHRyYW5zcG9ydCwgImdldFRyYW5zcG9ydCIsIDApOwotICAgIE1BS0VfU1REX1pWQUwodCk7Ci0gICAgWlZBTF9OVUxMKHQpOwotICAgIFRTUk1MU19GRVRDSCgpOwotICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICZwLCAmZ2V0dHJhbnNwb3J0LCB0LCAwLCBOVUxMIFRTUk1MU19DQyk7CisgICAgWlZBTF9TVFJJTkcoJmdldHRyYW5zcG9ydCwgImdldFRyYW5zcG9ydCIpOworICAgIGNhbGxfdXNlcl9mdW5jdGlvbihudWxscHRyLCBfcCwgJmdldHRyYW5zcG9ydCwgJnQsIDAsIG51bGxwdHIpOworCisgICAgenZhbF9kdG9yKCZnZXR0cmFuc3BvcnQpOworCisgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKKyAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgIH0KKworICAgIGFzc2VydChaX1RZUEUodCkgPT0gSVNfT0JKRUNUKTsKICAgfQorCiAgIH5QSFBUcmFuc3BvcnQoKSB7CiAgICAgZWZyZWUoYnVmZmVyKTsKLSAgICB6dmFsX3B0cl9kdG9yKCZ0KTsKKyAgICB6dmFsX2R0b3IoJnQpOwogICB9CiAKICAgY2hhciogYnVmZmVyOwpAQCAtMTYwLDIwICsxNzMsMTQgQEAKICAgc2l6ZV90IGJ1ZmZlcl91c2VkOwogICBzaXplX3QgYnVmZmVyX3NpemU7CiAKLSAgenZhbCogcDsKLSAgenZhbCogdDsKKyAgenZhbCB0OwogfTsKIAogCiBjbGFzcyBQSFBPdXRwdXRUcmFuc3BvcnQgOiBwdWJsaWMgUEhQVHJhbnNwb3J0IHsKIHB1YmxpYzoKLSAgUEhQT3V0cHV0VHJhbnNwb3J0KHp2YWwqIF9wLCBzaXplX3QgX2J1ZmZlcl9zaXplID0gODE5MikgewotICAgIGNvbnN0cnVjdF93aXRoX3p2YWwoX3AsIF9idWZmZXJfc2l6ZSk7Ci0gIH0KLQotICB+UEhQT3V0cHV0VHJhbnNwb3J0KCkgewotICAgIC8vZmx1c2goKTsKLSAgfQorICBQSFBPdXRwdXRUcmFuc3BvcnQoenZhbCogX3AsIHNpemVfdCBfYnVmZmVyX3NpemUgPSA4MTkyKSA6IFBIUFRyYW5zcG9ydChfcCwgX2J1ZmZlcl9zaXplKSB7IH0KKyAgflBIUE91dHB1dFRyYW5zcG9ydCgpIHsgfQogCiAgIHZvaWQgd3JpdGUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbikgewogICAgIGlmICgobGVuICsgYnVmZmVyX3VzZWQpID4gYnVmZmVyX3NpemUpIHsKQEAgLTIzMSwzMiArMjM4LDM1IEBACiAgICAgfQogICB9CiAgIHZvaWQgZGlyZWN0Rmx1c2goKSB7Ci0gICAgenZhbCByZXQ7CisgICAgenZhbCByZXQsIGZsdXNoZm47CiAgICAgWlZBTF9OVUxMKCZyZXQpOwotICAgIHp2YWwgZmx1c2hmbjsKLSAgICBaVkFMX1NUUklORygmZmx1c2hmbiwgImZsdXNoIiwgMCk7Ci0gICAgVFNSTUxTX0ZFVENIKCk7Ci0gICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJnQsICZmbHVzaGZuLCAmcmV0LCAwLCBOVUxMIFRTUk1MU19DQyk7Ci0gICAgenZhbF9kdG9yKCZyZXQpOwotICB9Ci0gIHZvaWQgZGlyZWN0V3JpdGUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbikgewotICAgIHp2YWwgd3JpdGVmbjsKLSAgICBaVkFMX1NUUklORygmd3JpdGVmbiwgIndyaXRlIiwgMCk7Ci0gICAgY2hhciogbmV3YnVmID0gKGNoYXIqKWVtYWxsb2MobGVuICsgMSk7Ci0gICAgbWVtY3B5KG5ld2J1ZiwgZGF0YSwgbGVuKTsKLSAgICBuZXdidWZbbGVuXSA9ICdcMCc7Ci0gICAgenZhbCAqYXJnc1sxXTsKLSAgICBNQUtFX1NURF9aVkFMKGFyZ3NbMF0pOwotICAgIFpWQUxfU1RSSU5HTChhcmdzWzBdLCBuZXdidWYsIGxlbiwgMCk7Ci0gICAgVFNSTUxTX0ZFVENIKCk7Ci0gICAgenZhbCByZXQ7Ci0gICAgWlZBTF9OVUxMKCZyZXQpOwotICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICZ0LCAmd3JpdGVmbiwgJnJldCwgMSwgYXJncyBUU1JNTFNfQ0MpOwotICAgIHp2YWxfcHRyX2R0b3IoYXJncyk7CisgICAgWlZBTF9TVFJJTkcoJmZsdXNoZm4sICJmbHVzaCIpOworCisgICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJih0aGlzLT50KSwgJmZsdXNoZm4sICZyZXQsIDAsIG51bGxwdHIpOworICAgIHp2YWxfZHRvcigmZmx1c2hmbik7CiAgICAgenZhbF9kdG9yKCZyZXQpOwogICAgIGlmIChFRyhleGNlcHRpb24pKSB7Ci0gICAgICB6dmFsKiBleCA9IEVHKGV4Y2VwdGlvbik7Ci0gICAgICBFRyhleGNlcHRpb24pID0gTlVMTDsKKyAgICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKKyAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgIH0KKyAgfQorICB2b2lkIGRpcmVjdFdyaXRlKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBsZW4pIHsKKyAgICB6dmFsIGFyZ3NbMV0sIHJldCwgd3JpdGVmbjsKKworICAgIFpWQUxfU1RSSU5HKCZ3cml0ZWZuLCAid3JpdGUiKTsKKyAgICBaVkFMX1NUUklOR0woJmFyZ3NbMF0sIGRhdGEsIGxlbik7CisKKyAgICBaVkFMX05VTEwoJnJldCk7CisgICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJih0aGlzLT50KSwgJndyaXRlZm4sICZyZXQsIDEsIGFyZ3MpOworCisgICAgenZhbF9kdG9yKCZ3cml0ZWZuKTsKKyAgICB6dmFsX2R0b3IoJnJldCk7CisgICAgenZhbF9kdG9yKCZhcmdzWzBdKTsKKworICAgIGlmIChFRyhleGNlcHRpb24pKSB7CisgICAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CiAgICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKICAgICB9CiAgIH0KQEAgLTI2NCw4ICsyNzQsNyBAQAogCiBjbGFzcyBQSFBJbnB1dFRyYW5zcG9ydCA6IHB1YmxpYyBQSFBUcmFuc3BvcnQgewogcHVibGljOgotICBQSFBJbnB1dFRyYW5zcG9ydCh6dmFsKiBfcCwgc2l6ZV90IF9idWZmZXJfc2l6ZSA9IDgxOTIpIHsKLSAgICBjb25zdHJ1Y3Rfd2l0aF96dmFsKF9wLCBfYnVmZmVyX3NpemUpOworICBQSFBJbnB1dFRyYW5zcG9ydCh6dmFsKiBfcCwgc2l6ZV90IF9idWZmZXJfc2l6ZSA9IDgxOTIpIDogUEhQVHJhbnNwb3J0KF9wLCBfYnVmZmVyX3NpemUpIHsKICAgfQogCiAgIH5QSFBJbnB1dFRyYW5zcG9ydCgpIHsKQEAgLTI3NCwyNCArMjgzLDIxIEBACiAKICAgdm9pZCBwdXRfYmFjaygpIHsKICAgICBpZiAoYnVmZmVyX3VzZWQpIHsKLSAgICAgIHp2YWwgcHV0YmFja2ZuOwotICAgICAgWlZBTF9TVFJJTkcoJnB1dGJhY2tmbiwgInB1dEJhY2siLCAwKTsKLQotICAgICAgY2hhciogbmV3YnVmID0gKGNoYXIqKWVtYWxsb2MoYnVmZmVyX3VzZWQgKyAxKTsKLSAgICAgIG1lbWNweShuZXdidWYsIGJ1ZmZlcl9wdHIsIGJ1ZmZlcl91c2VkKTsKLSAgICAgIG5ld2J1ZltidWZmZXJfdXNlZF0gPSAnXDAnOwotCi0gICAgICB6dmFsICphcmdzWzFdOwotICAgICAgTUFLRV9TVERfWlZBTChhcmdzWzBdKTsKLSAgICAgIFpWQUxfU1RSSU5HTChhcmdzWzBdLCBuZXdidWYsIGJ1ZmZlcl91c2VkLCAwKTsKLQotICAgICAgVFNSTUxTX0ZFVENIKCk7Ci0KLSAgICAgIHp2YWwgcmV0OworICAgICAgenZhbCBhcmdzWzFdLCByZXQsIHB1dGJhY2tmbjsKKyAgICAgIFpWQUxfU1RSSU5HTCgmYXJnc1swXSwgYnVmZmVyX3B0ciwgYnVmZmVyX3VzZWQpOworICAgICAgWlZBTF9TVFJJTkcoJnB1dGJhY2tmbiwgInB1dEJhY2siKTsKICAgICAgIFpWQUxfTlVMTCgmcmV0KTsKLSAgICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICZ0LCAmcHV0YmFja2ZuLCAmcmV0LCAxLCBhcmdzIFRTUk1MU19DQyk7Ci0gICAgICB6dmFsX3B0cl9kdG9yKGFyZ3MpOworCisgICAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmKHRoaXMtPnQpLCAmcHV0YmFja2ZuLCAmcmV0LCAxLCBhcmdzKTsKKworICAgICAgenZhbF9kdG9yKCZwdXRiYWNrZm4pOwogICAgICAgenZhbF9kdG9yKCZyZXQpOworICAgICAgenZhbF9kdG9yKCZhcmdzWzBdKTsKKyAgICAgIGlmIChFRyhleGNlcHRpb24pKSB7CisgICAgICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOworICAgICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKKyAgICAgIH0KICAgICB9CiAgICAgYnVmZmVyX3VzZWQgPSAwOwogICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXI7CkBAIC0yOTksNyArMzA1LDcgQEAKIAogICB2b2lkIHNraXAoc2l6ZV90IGxlbikgewogICAgIHdoaWxlIChsZW4pIHsKLSAgICAgIHNpemVfdCBjaHVua19zaXplID0gTUlOKGxlbiwgYnVmZmVyX3VzZWQpOworICAgICAgc2l6ZV90IGNodW5rX3NpemUgPSAoc3RkOjptaW4pKGxlbiwgYnVmZmVyX3VzZWQpOwogICAgICAgaWYgKGNodW5rX3NpemUpIHsKICAgICAgICAgYnVmZmVyX3B0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGJ1ZmZlcl9wdHIpICsgY2h1bmtfc2l6ZTsKICAgICAgICAgYnVmZmVyX3VzZWQgLT0gY2h1bmtfc2l6ZTsKQEAgLTMxMiw3ICszMTgsNyBAQAogCiAgIHZvaWQgcmVhZEJ5dGVzKHZvaWQqIGJ1Ziwgc2l6ZV90IGxlbikgewogICAgIHdoaWxlIChsZW4pIHsKLSAgICAgIHNpemVfdCBjaHVua19zaXplID0gTUlOKGxlbiwgYnVmZmVyX3VzZWQpOworICAgICAgc2l6ZV90IGNodW5rX3NpemUgPSAoc3RkOjptaW4pKGxlbiwgYnVmZmVyX3VzZWQpOwogICAgICAgaWYgKGNodW5rX3NpemUpIHsKICAgICAgICAgbWVtY3B5KGJ1ZiwgYnVmZmVyX3B0ciwgY2h1bmtfc2l6ZSk7CiAgICAgICAgIGJ1ZmZlcl9wdHIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihidWZmZXJfcHRyKSArIGNodW5rX3NpemU7CkBAIC0zNTMsMjkgKzM1OSwyOSBAQAogICB2b2lkIHJlZmlsbCgpIHsKICAgICBhc3NlcnQoYnVmZmVyX3VzZWQgPT0gMCk7CiAgICAgenZhbCByZXR2YWw7Ci0gICAgWlZBTF9OVUxMKCZyZXR2YWwpOwotCi0gICAgenZhbCAqYXJnc1sxXTsKLSAgICBNQUtFX1NURF9aVkFMKGFyZ3NbMF0pOwotICAgIFpWQUxfTE9ORyhhcmdzWzBdLCBidWZmZXJfc2l6ZSk7Ci0KLSAgICBUU1JNTFNfRkVUQ0goKTsKLQorICAgIHp2YWwgYXJnc1sxXTsKICAgICB6dmFsIGZ1bmNuYW1lOwotICAgIFpWQUxfU1RSSU5HKCZmdW5jbmFtZSwgInJlYWQiLCAwKTsKIAotICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICZ0LCAmZnVuY25hbWUsICZyZXR2YWwsIDEsIGFyZ3MgVFNSTUxTX0NDKTsKLSAgICB6dmFsX3B0cl9kdG9yKGFyZ3MpOworICAgIFpWQUxfTlVMTCgmcmV0dmFsKTsKKyAgICBaVkFMX0xPTkcoJmFyZ3NbMF0sIGJ1ZmZlcl9zaXplKTsKKworICAgIFpWQUxfU1RSSU5HKCZmdW5jbmFtZSwgInJlYWQiKTsKKworICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICYodGhpcy0+dCksICZmdW5jbmFtZSwgJnJldHZhbCwgMSwgYXJncyk7CisgICAgenZhbF9kdG9yKCZhcmdzWzBdKTsKKyAgICB6dmFsX2R0b3IoJmZ1bmNuYW1lKTsKIAogICAgIGlmIChFRyhleGNlcHRpb24pKSB7CiAgICAgICB6dmFsX2R0b3IoJnJldHZhbCk7Ci0gICAgICB6dmFsKiBleCA9IEVHKGV4Y2VwdGlvbik7Ci0gICAgICBFRyhleGNlcHRpb24pID0gTlVMTDsKKworICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOwogICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CiAgICAgfQogCiAgICAgYnVmZmVyX3VzZWQgPSBaX1NUUkxFTihyZXR2YWwpOwogICAgIG1lbWNweShidWZmZXIsIFpfU1RSVkFMKHJldHZhbCksIGJ1ZmZlcl91c2VkKTsKKwogICAgIHp2YWxfZHRvcigmcmV0dmFsKTsKIAogICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXI7CkBAIC0zODMsMjIyICszODksNjMgQEAKIAogfTsKIAorc3RhdGljCiB2b2lkIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKHp2YWwqIHp0aGlzLCBQSFBJbnB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIHNwZWMpOworc3RhdGljCiB2b2lkIGJpbmFyeV9zZXJpYWxpemVfc3BlYyh6dmFsKiB6dGhpcywgUEhQT3V0cHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIEhhc2hUYWJsZSogc3BlYyk7Ci12b2lkIGJpbmFyeV9zZXJpYWxpemUoaW50OF90IHRocmlmdF90eXBlSUQsIFBIUE91dHB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCB6dmFsKiogdmFsdWUsIEhhc2hUYWJsZSogZmllbGRzcGVjKTsKLXZvaWQgc2tpcF9lbGVtZW50KGxvbmcgdGhyaWZ0X3R5cGVJRCwgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCk7Ci12b2lkIHByb3RvY29sX3dyaXRlTWVzc2FnZUJlZ2luKHp2YWwgKnRyYW5zcG9ydCwgY29uc3QgY2hhciogbWV0aG9kX25hbWUsIGludDMyX3QgbXNndHlwZSwgaW50MzJfdCBzZXFJRCk7Ci0KK3N0YXRpYwordm9pZCBiaW5hcnlfc2VyaWFsaXplKGludDhfdCB0aHJpZnRfdHlwZUlELCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCogdmFsdWUsIEhhc2hUYWJsZSogZmllbGRzcGVjKTsKK3N0YXRpYyBpbmxpbmUKK2Jvb2wgdHR5cGVfaXNfc2NhbGFyKGludDhfdCB0KTsKIAogLy8gQ3JlYXRlIGEgUEhQIG9iamVjdCBnaXZlbiBhIHR5cGVuYW1lIGFuZCBjYWxsIHRoZSBjdG9yLCBvcHRpb25hbGx5IHBhc3NpbmcgdXAgdG8gMiBhcmd1bWVudHMKLXZvaWQgY3JlYXRlT2JqZWN0KGNoYXIqIG9ial90eXBlbmFtZSwgenZhbCogcmV0dXJuX3ZhbHVlLCBpbnQgbmFyZ3MgPSAwLCB6dmFsKiBhcmcxID0gTlVMTCwgenZhbCogYXJnMiA9IE5VTEwpIHsKLSAgVFNSTUxTX0ZFVENIKCk7Ci0gIHNpemVfdCBvYmpfdHlwZW5hbWVfbGVuID0gc3RybGVuKG9ial90eXBlbmFtZSk7Ci0gIHplbmRfY2xhc3NfZW50cnkqIGNlID0gemVuZF9mZXRjaF9jbGFzcyhvYmpfdHlwZW5hbWUsIG9ial90eXBlbmFtZV9sZW4sIFpFTkRfRkVUQ0hfQ0xBU1NfREVGQVVMVCBUU1JNTFNfQ0MpOworc3RhdGljCit2b2lkIGNyZWF0ZU9iamVjdChjb25zdCBjaGFyKiBvYmpfdHlwZW5hbWUsIHp2YWwqIHJldHVybl92YWx1ZSwgaW50IG5hcmdzID0gMCwgenZhbCogYXJnMSA9IG51bGxwdHIsIHp2YWwqIGFyZzIgPSBudWxscHRyKSB7CisgIC8qIGlzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGF0IG9uIHRoZSBzdGFjayA/ICovCisgIHplbmRfc3RyaW5nICpvYmpfbmFtZSA9IHplbmRfc3RyaW5nX2luaXQob2JqX3R5cGVuYW1lLCBzdHJsZW4ob2JqX3R5cGVuYW1lKSwgMCk7CisgIHplbmRfY2xhc3NfZW50cnkqIGNlID0gemVuZF9mZXRjaF9jbGFzcyhvYmpfbmFtZSwgWkVORF9GRVRDSF9DTEFTU19ERUZBVUxUKTsKKyAgemVuZF9zdHJpbmdfcmVsZWFzZShvYmpfbmFtZSk7CisKICAgaWYgKCEgY2UpIHsKLSAgICBwaHBfZXJyb3JfZG9jcmVmKE5VTEwgVFNSTUxTX0NDLCBFX0VSUk9SLCAiQ2xhc3MgJXMgZG9lcyBub3QgZXhpc3QiLCBvYmpfdHlwZW5hbWUpOworICAgIHBocF9lcnJvcl9kb2NyZWYobnVsbHB0ciwgRV9FUlJPUiwgIkNsYXNzICVzIGRvZXMgbm90IGV4aXN0Iiwgb2JqX3R5cGVuYW1lKTsKICAgICBSRVRVUk5fTlVMTCgpOwogICB9CiAKLSAgb2JqZWN0X2FuZF9wcm9wZXJ0aWVzX2luaXQocmV0dXJuX3ZhbHVlLCBjZSwgTlVMTCk7Ci0gIHplbmRfZnVuY3Rpb24qIGNvbnN0cnVjdG9yID0gemVuZF9zdGRfZ2V0X2NvbnN0cnVjdG9yKHJldHVybl92YWx1ZSBUU1JNTFNfQ0MpOwotICB6dmFsKiBjdG9yX3J2ID0gTlVMTDsKLSAgemVuZF9jYWxsX21ldGhvZCgmcmV0dXJuX3ZhbHVlLCBjZSwgJmNvbnN0cnVjdG9yLCBOVUxMLCAwLCAmY3Rvcl9ydiwgbmFyZ3MsIGFyZzEsIGFyZzIgVFNSTUxTX0NDKTsKLSAgenZhbF9wdHJfZHRvcigmY3Rvcl9ydik7CisgIG9iamVjdF9hbmRfcHJvcGVydGllc19pbml0KHJldHVybl92YWx1ZSwgY2UsIG51bGxwdHIpOworICB6ZW5kX2Z1bmN0aW9uKiBjb25zdHJ1Y3RvciA9IHplbmRfc3RkX2dldF9jb25zdHJ1Y3RvcihaX09CSl9QKHJldHVybl92YWx1ZSkpOworICB6dmFsIGN0b3JfcnY7CisgIHplbmRfY2FsbF9tZXRob2QocmV0dXJuX3ZhbHVlLCBjZSwgJmNvbnN0cnVjdG9yLCBOVUxMLCAwLCAmY3Rvcl9ydiwgbmFyZ3MsIGFyZzEsIGFyZzIpOworICB6dmFsX2R0b3IoJmN0b3JfcnYpOworICBpZiAoRUcoZXhjZXB0aW9uKSkgeworICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgIH0KIH0KIAotdm9pZCB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oY2hhciogd2hhdCwgbG9uZyBlcnJvcmNvZGUpIHsKLSAgVFNSTUxTX0ZFVENIKCk7CitzdGF0aWMKK3ZvaWQgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGNvbnN0IGNoYXIqIHdoYXQsIGxvbmcgZXJyb3Jjb2RlKSB7CisgIHp2YWwgendoYXQsIHplcnJvcmNvZGU7CiAKLSAgenZhbCAqendoYXQsICp6ZXJyb3Jjb2RlOwotICBNQUtFX1NURF9aVkFMKHp3aGF0KTsKLSAgTUFLRV9TVERfWlZBTCh6ZXJyb3Jjb2RlKTsKKyAgWlZBTF9TVFJJTkcoJnp3aGF0LCB3aGF0KTsKKyAgWlZBTF9MT05HKCZ6ZXJyb3Jjb2RlLCBlcnJvcmNvZGUpOwogCi0gIFpWQUxfU1RSSU5HKHp3aGF0LCB3aGF0LCAxKTsKLSAgWlZBTF9MT05HKHplcnJvcmNvZGUsIGVycm9yY29kZSk7CisgIHp2YWwgZXg7CisgIGNyZWF0ZU9iamVjdCgiXFxUaHJpZnRcXEV4Y2VwdGlvblxcVFByb3RvY29sRXhjZXB0aW9uIiwgJmV4LCAyLCAmendoYXQsICZ6ZXJyb3Jjb2RlKTsKIAotICB6dmFsKiBleDsKLSAgTUFLRV9TVERfWlZBTChleCk7Ci0gIGNyZWF0ZU9iamVjdCgiVFByb3RvY29sRXhjZXB0aW9uIiwgZXgsIDIsIHp3aGF0LCB6ZXJyb3Jjb2RlKTsKLSAgenZhbF9wdHJfZHRvcigmendoYXQpOwotICB6dmFsX3B0cl9kdG9yKCZ6ZXJyb3Jjb2RlKTsKLSAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgIHp2YWxfZHRvcigmendoYXQpOworICB6dmFsX2R0b3IoJnplcnJvcmNvZGUpOworCisgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoJmV4KTsKIH0KIAogLy8gU2V0cyBFRyhleGNlcHRpb24pLCBjYWxsIHRoaXMgYW5kIHRoZW4gUkVUVVJOX05VTEwoKTsKLXZvaWQgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBleCBUU1JNTFNfREMpIHsKLSAgemVuZF90aHJvd19leGNlcHRpb24oemVuZF9leGNlcHRpb25fZ2V0X2RlZmF1bHQoVFNSTUxTX0MpLCBjb25zdF9jYXN0PGNoYXIqPihleC53aGF0KCkpLCAwIFRTUk1MU19DQyk7CitzdGF0aWMKK3ZvaWQgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBleCkgeworICB6ZW5kX3Rocm93X2V4Y2VwdGlvbih6ZW5kX2V4Y2VwdGlvbl9nZXRfZGVmYXVsdCgpLCBjb25zdF9jYXN0PGNoYXIqPihleC53aGF0KCkpLCAwKTsKIH0KIAotCi12b2lkIGJpbmFyeV9kZXNlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCogcmV0dXJuX3ZhbHVlLCBIYXNoVGFibGUqIGZpZWxkc3BlYykgewotICB6dmFsKiogdmFsX3B0cjsKLSAgWl9UWVBFX1AocmV0dXJuX3ZhbHVlKSA9IElTX05VTEw7IC8vIGp1c3QgaW4gY2FzZQotCi0gIHN3aXRjaCAodGhyaWZ0X3R5cGVJRCkgewotICAgIGNhc2UgVF9TVE9QOgotICAgIGNhc2UgVF9WT0lEOgotICAgICAgUkVUVVJOX05VTEwoKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfU1RSVUNUOiB7Ci0gICAgICBpZiAoemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAiY2xhc3MiLCA2LCAodm9pZCoqKSZ2YWxfcHRyKSAhPSBTVUNDRVNTKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigibm8gY2xhc3MgdHlwZSBpbiBzcGVjIiwgSU5WQUxJRF9EQVRBKTsKLSAgICAgICAgc2tpcF9lbGVtZW50KFRfU1RSVUNULCB0cmFuc3BvcnQpOwotICAgICAgICBSRVRVUk5fTlVMTCgpOwotICAgICAgfQotICAgICAgY2hhciogc3RydWN0VHlwZSA9IFpfU1RSVkFMX1BQKHZhbF9wdHIpOwotICAgICAgY3JlYXRlT2JqZWN0KHN0cnVjdFR5cGUsIHJldHVybl92YWx1ZSk7Ci0gICAgICBpZiAoWl9UWVBFX1AocmV0dXJuX3ZhbHVlKSA9PSBJU19OVUxMKSB7Ci0gICAgICAgIC8vIHVuYWJsZSB0byBjcmVhdGUgY2xhc3MgZW50cnkKLSAgICAgICAgc2tpcF9lbGVtZW50KFRfU1RSVUNULCB0cmFuc3BvcnQpOwotICAgICAgICBSRVRVUk5fTlVMTCgpOwotICAgICAgfQotICAgICAgVFNSTUxTX0ZFVENIKCk7Ci0gICAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eSh6ZW5kX2dldF9jbGFzc19lbnRyeShyZXR1cm5fdmFsdWUgVFNSTUxTX0NDKSwgIl9UU1BFQyIsIDYsIGZhbHNlIFRTUk1MU19DQyk7Ci0gICAgICBpZiAoWl9UWVBFX1Aoc3BlYykgIT0gSVNfQVJSQVkpIHsKLSAgICAgICAgY2hhciBlcnJidWZbMTI4XTsKLSAgICAgICAgc25wcmludGYoZXJyYnVmLCAxMjgsICJzcGVjIGZvciAlcyBpcyB3cm9uZyB0eXBlOiAlZFxuIiwgc3RydWN0VHlwZSwgWl9UWVBFX1Aoc3BlYykpOwotICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOwotICAgICAgICBSRVRVUk5fTlVMTCgpOwotICAgICAgfQotICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMocmV0dXJuX3ZhbHVlLCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOwotICAgICAgcmV0dXJuOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBUX0JPT0w6IHsKLSAgICAgIHVpbnQ4X3QgYzsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDEpOwotICAgICAgUkVUVVJOX0JPT0woYyAhPSAwKTsKLSAgICB9Ci0gIC8vY2FzZSBUX0kwODogLy8gc2FtZSBudW1lcmljIHZhbHVlIGFzIFRfQllURQotICAgIGNhc2UgVF9CWVRFOiB7Ci0gICAgICB1aW50OF90IGM7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCAxKTsKLSAgICAgIFJFVFVSTl9MT05HKChpbnQ4X3QpYyk7Ci0gICAgfQotICAgIGNhc2UgVF9JMTY6IHsKLSAgICAgIHVpbnQxNl90IGM7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCAyKTsKLSAgICAgIFJFVFVSTl9MT05HKChpbnQxNl90KW50b2hzKGMpKTsKLSAgICB9Ci0gICAgY2FzZSBUX0kzMjogewotICAgICAgdWludDMyX3QgYzsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDQpOwotICAgICAgUkVUVVJOX0xPTkcoKGludDMyX3QpbnRvaGwoYykpOwotICAgIH0KLSAgICBjYXNlIFRfVTY0OgotICAgIGNhc2UgVF9JNjQ6IHsKLSAgICAgIHVpbnQ2NF90IGM7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCA4KTsKLSAgICAgIFJFVFVSTl9MT05HKChpbnQ2NF90KW50b2hsbChjKSk7Ci0gICAgfQotICAgIGNhc2UgVF9ET1VCTEU6IHsKLSAgICAgIHVuaW9uIHsKLSAgICAgICAgdWludDY0X3QgYzsKLSAgICAgICAgZG91YmxlIGQ7Ci0gICAgICB9IGE7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCYoYS5jKSwgOCk7Ci0gICAgICBhLmMgPSBudG9obGwoYS5jKTsKLSAgICAgIFJFVFVSTl9ET1VCTEUoYS5kKTsKLSAgICB9Ci0gICAgLy9jYXNlIFRfVVRGNzogLy8gYWxpYXNlcyBUX1NUUklORwotICAgIGNhc2UgVF9VVEY4OgotICAgIGNhc2UgVF9VVEYxNjoKLSAgICBjYXNlIFRfU1RSSU5HOiB7Ci0gICAgICB1aW50MzJfdCBzaXplID0gdHJhbnNwb3J0LnJlYWRVMzIoKTsKLSAgICAgIGlmIChzaXplKSB7Ci0gICAgICAgIGNoYXIqIHN0cmJ1ZiA9IChjaGFyKikgZW1hbGxvYyhzaXplICsgMSk7Ci0gICAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoc3RyYnVmLCBzaXplKTsKLSAgICAgICAgc3RyYnVmW3NpemVdID0gJ1wwJzsKLSAgICAgICAgWlZBTF9TVFJJTkdMKHJldHVybl92YWx1ZSwgc3RyYnVmLCBzaXplLCAwKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFpWQUxfRU1QVFlfU1RSSU5HKHJldHVybl92YWx1ZSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgVF9NQVA6IHsgLy8gYXJyYXkgb2Yga2V5IC0+IHZhbHVlCi0gICAgICB1aW50OF90IHR5cGVzWzJdOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcyh0eXBlcywgMik7Ci0gICAgICB1aW50MzJfdCBzaXplID0gdHJhbnNwb3J0LnJlYWRVMzIoKTsKLSAgICAgIGFycmF5X2luaXQocmV0dXJuX3ZhbHVlKTsKLQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAia2V5IiwgNCwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIGtleXNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInZhbCIsIDQsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgSGFzaFRhYmxlKiB2YWxzcGVjID0gWl9BUlJWQUxfUFAodmFsX3B0cik7Ci0KLSAgICAgIGZvciAodWludDMyX3QgcyA9IDA7IHMgPCBzaXplOyArK3MpIHsKLSAgICAgICAgenZhbCAqdmFsdWU7Ci0gICAgICAgIE1BS0VfU1REX1pWQUwodmFsdWUpOwotCi0gICAgICAgIHp2YWwqIGtleTsKLSAgICAgICAgTUFLRV9TVERfWlZBTChrZXkpOwotCi0gICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlc1swXSwgdHJhbnNwb3J0LCBrZXksIGtleXNwZWMpOwotICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZXNbMV0sIHRyYW5zcG9ydCwgdmFsdWUsIHZhbHNwZWMpOwotICAgICAgICBpZiAoWl9UWVBFX1Aoa2V5KSA9PSBJU19MT05HKSB7Ci0gICAgICAgICAgemVuZF9oYXNoX2luZGV4X3VwZGF0ZShyZXR1cm5fdmFsdWUtPnZhbHVlLmh0LCBaX0xWQUxfUChrZXkpLCAmdmFsdWUsIHNpemVvZih6dmFsICopLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBpZiAoWl9UWVBFX1Aoa2V5KSAhPSBJU19TVFJJTkcpIGNvbnZlcnRfdG9fc3RyaW5nKGtleSk7Ci0gICAgICAgICAgemVuZF9oYXNoX3VwZGF0ZShyZXR1cm5fdmFsdWUtPnZhbHVlLmh0LCBaX1NUUlZBTF9QKGtleSksIFpfU1RSTEVOX1Aoa2V5KSArIDEsICZ2YWx1ZSwgc2l6ZW9mKHp2YWwgKiksIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIHp2YWxfcHRyX2R0b3IoJmtleSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47IC8vIHJldHVybl92YWx1ZSBhbHJlYWR5IHBvcHVsYXRlZAotICAgIH0KLSAgICBjYXNlIFRfTElTVDogeyAvLyBhcnJheSB3aXRoIGF1dG9nZW5lcmF0ZWQgbnVtZXJpYyBrZXlzCi0gICAgICBpbnQ4X3QgdHlwZSA9IHRyYW5zcG9ydC5yZWFkSTgoKTsKLSAgICAgIHVpbnQzMl90IHNpemUgPSB0cmFuc3BvcnQucmVhZFUzMigpOwotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAiZWxlbSIsIDUsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgSGFzaFRhYmxlKiBlbGVtc3BlYyA9IFpfQVJSVkFMX1BQKHZhbF9wdHIpOwotCi0gICAgICBhcnJheV9pbml0KHJldHVybl92YWx1ZSk7Ci0gICAgICBmb3IgKHVpbnQzMl90IHMgPSAwOyBzIDwgc2l6ZTsgKytzKSB7Ci0gICAgICAgIHp2YWwgKnZhbHVlOwotICAgICAgICBNQUtFX1NURF9aVkFMKHZhbHVlKTsKLSAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGUsIHRyYW5zcG9ydCwgdmFsdWUsIGVsZW1zcGVjKTsKLSAgICAgICAgemVuZF9oYXNoX25leHRfaW5kZXhfaW5zZXJ0KHJldHVybl92YWx1ZS0+dmFsdWUuaHQsICZ2YWx1ZSwgc2l6ZW9mKHp2YWwgKiksIE5VTEwpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIFRfU0VUOiB7IC8vIGFycmF5IG9mIGtleSAtPiBUUlVFCi0gICAgICB1aW50OF90IHR5cGU7Ci0gICAgICB1aW50MzJfdCBzaXplOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmdHlwZSwgMSk7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZzaXplLCA0KTsKLSAgICAgIHNpemUgPSBudG9obChzaXplKTsKLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgImVsZW0iLCA1LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIEhhc2hUYWJsZSogZWxlbXNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLQotICAgICAgYXJyYXlfaW5pdChyZXR1cm5fdmFsdWUpOwotCi0gICAgICBmb3IgKHVpbnQzMl90IHMgPSAwOyBzIDwgc2l6ZTsgKytzKSB7Ci0gICAgICAgIHp2YWwqIGtleTsKLSAgICAgICAgenZhbCogdmFsdWU7Ci0gICAgICAgIE1BS0VfU1REX1pWQUwoa2V5KTsKLSAgICAgICAgTUFLRV9TVERfWlZBTCh2YWx1ZSk7Ci0gICAgICAgIFpWQUxfVFJVRSh2YWx1ZSk7Ci0KLSAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGUsIHRyYW5zcG9ydCwga2V5LCBlbGVtc3BlYyk7Ci0KLSAgICAgICAgaWYgKFpfVFlQRV9QKGtleSkgPT0gSVNfTE9ORykgewotICAgICAgICAgIHplbmRfaGFzaF9pbmRleF91cGRhdGUocmV0dXJuX3ZhbHVlLT52YWx1ZS5odCwgWl9MVkFMX1Aoa2V5KSwgJnZhbHVlLCBzaXplb2YoenZhbCAqKSwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgaWYgKFpfVFlQRV9QKGtleSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZyhrZXkpOwotICAgICAgICAgIHplbmRfaGFzaF91cGRhdGUocmV0dXJuX3ZhbHVlLT52YWx1ZS5odCwgWl9TVFJWQUxfUChrZXkpLCBaX1NUUkxFTl9QKGtleSkgKyAxLCAmdmFsdWUsIHNpemVvZih6dmFsICopLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICB6dmFsX3B0cl9kdG9yKCZrZXkpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfTsKLQotICBjaGFyIGVycmJ1ZlsxMjhdOwotICBzcHJpbnRmKGVycmJ1ZiwgIlVua25vd24gdGhyaWZ0IHR5cGVJRCAlZCIsIHRocmlmdF90eXBlSUQpOwotICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOwotfQotCitzdGF0aWMKIHZvaWQgc2tpcF9lbGVtZW50KGxvbmcgdGhyaWZ0X3R5cGVJRCwgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCkgewogICBzd2l0Y2ggKHRocmlmdF90eXBlSUQpIHsKICAgICBjYXNlIFRfU1RPUDoKQEAgLTY1OCwxMDEgKzUwNSw0NzIgQEAKICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGVycmJ1ZiwgSU5WQUxJRF9EQVRBKTsKIH0KIAotdm9pZCBwcm90b2NvbF93cml0ZU1lc3NhZ2VCZWdpbih6dmFsKiB0cmFuc3BvcnQsIGNvbnN0IGNoYXIqIG1ldGhvZF9uYW1lLCBpbnQzMl90IG1zZ3R5cGUsIGludDMyX3Qgc2VxSUQpIHsKLSAgVFNSTUxTX0ZFVENIKCk7Ci0gIHp2YWwgKmFyZ3NbM107Ci0KLSAgTUFLRV9TVERfWlZBTChhcmdzWzBdKTsKLSAgWlZBTF9TVFJJTkdMKGFyZ3NbMF0sIChjaGFyKiltZXRob2RfbmFtZSwgc3RybGVuKG1ldGhvZF9uYW1lKSwgMSk7Ci0KLSAgTUFLRV9TVERfWlZBTChhcmdzWzFdKTsKLSAgWlZBTF9MT05HKGFyZ3NbMV0sIG1zZ3R5cGUpOwotCi0gIE1BS0VfU1REX1pWQUwoYXJnc1syXSk7Ci0gIFpWQUxfTE9ORyhhcmdzWzJdLCBzZXFJRCk7Ci0KLSAgenZhbCByZXQ7Ci0gIFpWQUxfTlVMTCgmcmV0KTsKLQotICB6dmFsIHdyaXRlTWVzc2FnZWZuOwotICBaVkFMX1NUUklORygmd3JpdGVNZXNzYWdlZm4sICJ3cml0ZU1lc3NhZ2VCZWdpbiIsIDApOwotCi0gIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICZ0cmFuc3BvcnQsICZ3cml0ZU1lc3NhZ2VmbiwgJnJldCwgMywgYXJncyBUU1JNTFNfQ0MpOwotCi0gIHp2YWxfcHRyX2R0b3IoJmFyZ3NbMF0pOwotICB6dmFsX3B0cl9kdG9yKCZhcmdzWzFdKTsKLSAgenZhbF9wdHJfZHRvcigmYXJnc1syXSk7Ci0gIHp2YWxfZHRvcigmcmV0KTsKK3N0YXRpYyBpbmxpbmUKK2Jvb2wgenZhbF9pc19ib29sKHp2YWwqIHYpIHsKKyAgcmV0dXJuIFpfVFlQRV9QKHYpID09IElTX1RSVUUgfHwgWl9UWVBFX1AodikgPT0gSVNfRkFMU0U7CiB9CiAKLXZvaWQgYmluYXJ5X3NlcmlhbGl6ZV9oYXNodGFibGVfa2V5KGludDhfdCBrZXl0eXBlLCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgSGFzaFRhYmxlKiBodCwgSGFzaFBvc2l0aW9uJiBodF9wb3MpIHsKK3N0YXRpYwordm9pZCBiaW5hcnlfZGVzZXJpYWxpemUoaW50OF90IHRocmlmdF90eXBlSUQsIFBIUElucHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIHp2YWwqIHJldHVybl92YWx1ZSwgSGFzaFRhYmxlKiBmaWVsZHNwZWMpIHsKKyAgWlZBTF9OVUxMKHJldHVybl92YWx1ZSk7CisKKyAgc3dpdGNoICh0aHJpZnRfdHlwZUlEKSB7CisgICAgY2FzZSBUX1NUT1A6CisgICAgY2FzZSBUX1ZPSUQ6CisgICAgICBSRVRVUk5fTlVMTCgpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9TVFJVQ1Q6IHsKKyAgICAgIHp2YWwqIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiY2xhc3MiLCBzaXplb2YoImNsYXNzIiktMSk7CisgICAgICBpZiAodmFsX3B0ciA9PSBudWxscHRyKSB7CisgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigibm8gY2xhc3MgdHlwZSBpbiBzcGVjIiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgICAgc2tpcF9lbGVtZW50KFRfU1RSVUNULCB0cmFuc3BvcnQpOworICAgICAgICBSRVRVUk5fTlVMTCgpOworICAgICAgfQorCisgICAgICBjaGFyKiBzdHJ1Y3RUeXBlID0gWl9TVFJWQUxfUCh2YWxfcHRyKTsKKyAgICAgIC8vIENyZWF0ZSBhbiBvYmplY3QgaW4gUEhQIHVzZXJsYW5kIGJhc2VkIG9uIG91ciBzcGVjCisgICAgICBjcmVhdGVPYmplY3Qoc3RydWN0VHlwZSwgcmV0dXJuX3ZhbHVlKTsKKyAgICAgIGlmIChaX1RZUEVfUChyZXR1cm5fdmFsdWUpID09IElTX05VTEwpIHsKKyAgICAgICAgLy8gdW5hYmxlIHRvIGNyZWF0ZSBjbGFzcyBlbnRyeQorICAgICAgICBza2lwX2VsZW1lbnQoVF9TVFJVQ1QsIHRyYW5zcG9ydCk7CisgICAgICAgIFJFVFVSTl9OVUxMKCk7CisgICAgICB9CisKKyAgICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0VfUChyZXR1cm5fdmFsdWUpLCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFNQRUMiKS0xLCBmYWxzZSk7CisgICAgICBaVkFMX0RFUkVGKHNwZWMpOworICAgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgICAgfQorICAgICAgaWYgKFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7CisgICAgICAgIGNoYXIgZXJyYnVmWzEyOF07CisgICAgICAgIHNucHJpbnRmKGVycmJ1ZiwgMTI4LCAic3BlYyBmb3IgJXMgaXMgd3JvbmcgdHlwZTogJWRcbiIsIHN0cnVjdFR5cGUsIFpfVFlQRV9QKHNwZWMpKTsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGVycmJ1ZiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgICAgUkVUVVJOX05VTEwoKTsKKyAgICAgIH0KKyAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKHJldHVybl92YWx1ZSwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgVF9CT09MOiB7CisgICAgICB1aW50OF90IGM7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCAxKTsKKyAgICAgIFJFVFVSTl9CT09MKGMgIT0gMCk7CisgICAgfQorICAvL2Nhc2UgVF9JMDg6IC8vIHNhbWUgbnVtZXJpYyB2YWx1ZSBhcyBUX0JZVEUKKyAgICBjYXNlIFRfQllURTogeworICAgICAgdWludDhfdCBjOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgMSk7CisgICAgICBSRVRVUk5fTE9ORygoaW50OF90KWMpOworICAgIH0KKyAgICBjYXNlIFRfSTE2OiB7CisgICAgICB1aW50MTZfdCBjOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgMik7CisgICAgICBSRVRVUk5fTE9ORygoaW50MTZfdCludG9ocyhjKSk7CisgICAgfQorICAgIGNhc2UgVF9JMzI6IHsKKyAgICAgIHVpbnQzMl90IGM7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCA0KTsKKyAgICAgIFJFVFVSTl9MT05HKChpbnQzMl90KW50b2hsKGMpKTsKKyAgICB9CisgICAgY2FzZSBUX1U2NDoKKyAgICBjYXNlIFRfSTY0OiB7CisgICAgICB1aW50NjRfdCBjOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgOCk7CisgICAgICBSRVRVUk5fTE9ORygoaW50NjRfdCludG9obGwoYykpOworICAgIH0KKyAgICBjYXNlIFRfRE9VQkxFOiB7CisgICAgICB1bmlvbiB7CisgICAgICAgIHVpbnQ2NF90IGM7CisgICAgICAgIGRvdWJsZSBkOworICAgICAgfSBhOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmKGEuYyksIDgpOworICAgICAgYS5jID0gbnRvaGxsKGEuYyk7CisgICAgICBSRVRVUk5fRE9VQkxFKGEuZCk7CisgICAgfQorICAgIC8vY2FzZSBUX1VURjc6IC8vIGFsaWFzZXMgVF9TVFJJTkcKKyAgICBjYXNlIFRfVVRGODoKKyAgICBjYXNlIFRfVVRGMTY6CisgICAgY2FzZSBUX1NUUklORzogeworICAgICAgdWludDMyX3Qgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkVTMyKCk7CisgICAgICBpZiAoc2l6ZSkgeworICAgICAgICBjaGFyIHN0cmJ1ZltzaXplKzFdOworICAgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKHN0cmJ1Ziwgc2l6ZSk7CisgICAgICAgIHN0cmJ1ZltzaXplXSA9ICdcMCc7CisgICAgICAgIFpWQUxfU1RSSU5HTChyZXR1cm5fdmFsdWUsIHN0cmJ1Ziwgc2l6ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBaVkFMX0VNUFRZX1NUUklORyhyZXR1cm5fdmFsdWUpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIFRfTUFQOiB7IC8vIGFycmF5IG9mIGtleSAtPiB2YWx1ZQorICAgICAgdWludDhfdCB0eXBlc1syXTsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXModHlwZXMsIDIpOworICAgICAgdWludDMyX3Qgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkVTMyKCk7CisgICAgICBhcnJheV9pbml0KHJldHVybl92YWx1ZSk7CisKKyAgICAgIHp2YWwgKnZhbF9wdHI7CisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImtleSIsIHNpemVvZigia2V5IiktMSk7CisgICAgICBIYXNoVGFibGUqIGtleXNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ2YWwiLCBzaXplb2YoInZhbCIpLTEpOworICAgICAgSGFzaFRhYmxlKiB2YWxzcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKKworICAgICAgZm9yICh1aW50MzJfdCBzID0gMDsgcyA8IHNpemU7ICsrcykgeworICAgICAgICB6dmFsIGtleSwgdmFsdWU7CisKKyAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGVzWzBdLCB0cmFuc3BvcnQsICZrZXksIGtleXNwZWMpOworICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZXNbMV0sIHRyYW5zcG9ydCwgJnZhbHVlLCB2YWxzcGVjKTsKKyAgICAgICAgaWYgKFpfVFlQRShrZXkpID09IElTX0xPTkcpIHsKKyAgICAgICAgICB6ZW5kX2hhc2hfaW5kZXhfdXBkYXRlKFpfQVJSX1AocmV0dXJuX3ZhbHVlKSwgWl9MVkFMKGtleSksICZ2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKFpfVFlQRShrZXkpICE9IElTX1NUUklORykgY29udmVydF90b19zdHJpbmcoJmtleSk7CisgICAgICAgICAgemVuZF9zeW10YWJsZV91cGRhdGUoWl9BUlJfUChyZXR1cm5fdmFsdWUpLCBaX1NUUihrZXkpLCAmdmFsdWUpOworICAgICAgICB9CisgICAgICAgIHp2YWxfZHRvcigma2V5KTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsgLy8gcmV0dXJuX3ZhbHVlIGFscmVhZHkgcG9wdWxhdGVkCisgICAgfQorICAgIGNhc2UgVF9MSVNUOiB7IC8vIGFycmF5IHdpdGggYXV0b2dlbmVyYXRlZCBudW1lcmljIGtleXMKKyAgICAgIGludDhfdCB0eXBlID0gdHJhbnNwb3J0LnJlYWRJOCgpOworICAgICAgdWludDMyX3Qgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkVTMyKCk7CisgICAgICB6dmFsICp2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImVsZW0iLCBzaXplb2YoImVsZW0iKS0xKTsKKyAgICAgIEhhc2hUYWJsZSogZWxlbXNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOworCisgICAgICBhcnJheV9pbml0KHJldHVybl92YWx1ZSk7CisgICAgICBmb3IgKHVpbnQzMl90IHMgPSAwOyBzIDwgc2l6ZTsgKytzKSB7CisgICAgICAgIHp2YWwgdmFsdWU7CisgICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlLCB0cmFuc3BvcnQsICZ2YWx1ZSwgZWxlbXNwZWMpOworICAgICAgICB6ZW5kX2hhc2hfbmV4dF9pbmRleF9pbnNlcnQoWl9BUlJfUChyZXR1cm5fdmFsdWUpLCAmdmFsdWUpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIFRfU0VUOiB7IC8vIGFycmF5IG9mIGtleSAtPiBUUlVFCisgICAgICB1aW50OF90IHR5cGU7CisgICAgICB1aW50MzJfdCBzaXplOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmdHlwZSwgMSk7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZzaXplLCA0KTsKKyAgICAgIHNpemUgPSBudG9obChzaXplKTsKKyAgICAgIHp2YWwgKnZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZWxlbSIsIHNpemVvZigiZWxlbSIpLTEpOworICAgICAgSGFzaFRhYmxlKiBlbGVtc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisKKyAgICAgIGFycmF5X2luaXQocmV0dXJuX3ZhbHVlKTsKKworICAgICAgZm9yICh1aW50MzJfdCBzID0gMDsgcyA8IHNpemU7ICsrcykgeworICAgICAgICB6dmFsIGtleSwgdmFsdWU7CisgICAgICAgIFpWQUxfVFJVRSgmdmFsdWUpOworCisgICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlLCB0cmFuc3BvcnQsICZrZXksIGVsZW1zcGVjKTsKKworICAgICAgICBpZiAoWl9UWVBFKGtleSkgPT0gSVNfTE9ORykgeworICAgICAgICAgIHplbmRfaGFzaF9pbmRleF91cGRhdGUoWl9BUlJfUChyZXR1cm5fdmFsdWUpLCBaX0xWQUwoa2V5KSwgJnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoWl9UWVBFKGtleSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZygma2V5KTsKKyAgICAgICAgICB6ZW5kX3N5bXRhYmxlX3VwZGF0ZShaX0FSUl9QKHJldHVybl92YWx1ZSksIFpfU1RSKGtleSksICZ2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgenZhbF9kdG9yKCZrZXkpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfTsKKworICBjaGFyIGVycmJ1ZlsxMjhdOworICBzcHJpbnRmKGVycmJ1ZiwgIlVua25vd24gdGhyaWZ0IHR5cGVJRCAlZCIsIHRocmlmdF90eXBlSUQpOworICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOworfQorCitzdGF0aWMKK3ZvaWQgYmluYXJ5X3NlcmlhbGl6ZV9oYXNodGFibGVfa2V5KGludDhfdCBrZXl0eXBlLCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgSGFzaFRhYmxlKiBodCwgSGFzaFBvc2l0aW9uJiBodF9wb3MsIEhhc2hUYWJsZSogc3BlYykgewogICBib29sIGtleXR5cGVfaXNfbnVtZXJpYyA9ICghKChrZXl0eXBlID09IFRfU1RSSU5HKSB8fCAoa2V5dHlwZSA9PSBUX1VURjgpIHx8IChrZXl0eXBlID09IFRfVVRGMTYpKSk7CiAKLSAgY2hhcioga2V5OworICB6ZW5kX3N0cmluZyoga2V5OwogICB1aW50IGtleV9sZW47CiAgIGxvbmcgaW5kZXggPSAwOwogCi0gIHp2YWwqIHo7Ci0gIE1BS0VfU1REX1pWQUwoeik7CisgIHp2YWwgejsKIAotICBpbnQgcmVzID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2tleV9leChodCwgJmtleSwgJmtleV9sZW4sICh1bG9uZyopJmluZGV4LCAwLCAmaHRfcG9zKTsKLSAgaWYgKGtleXR5cGVfaXNfbnVtZXJpYykgewotICAgIGlmIChyZXMgPT0gSEFTSF9LRVlfSVNfU1RSSU5HKSB7Ci0gICAgICBpbmRleCA9IHN0cnRvbChrZXksIE5VTEwsIDEwKTsKLSAgICB9Ci0gICAgWlZBTF9MT05HKHosIGluZGV4KTsKKyAgaW50IHJlcyA9IHplbmRfaGFzaF9nZXRfY3VycmVudF9rZXlfZXgoaHQsICZrZXksICh6ZW5kX3Vsb25nKikmaW5kZXgsICZodF9wb3MpOworICBpZiAocmVzID09IEhBU0hfS0VZX0lTX1NUUklORykgeworICAgIFpWQUxfU1RSX0NPUFkoJnosIGtleSk7CiAgIH0gZWxzZSB7Ci0gICAgY2hhciBidWZbNjRdOwotICAgIGlmIChyZXMgPT0gSEFTSF9LRVlfSVNfU1RSSU5HKSB7Ci0gICAgICBrZXlfbGVuIC09IDE7IC8vIHNraXAgdGhlIG51bGwgdGVybWluYXRvcgotICAgIH0gZWxzZSB7Ci0gICAgICBzcHJpbnRmKGJ1ZiwgIiVsZCIsIGluZGV4KTsKLSAgICAgIGtleSA9IGJ1Zjsga2V5X2xlbiA9IHN0cmxlbihidWYpOwotICAgIH0KLSAgICBaVkFMX1NUUklOR0woeiwga2V5LCBrZXlfbGVuLCAxKTsKKyAgICBaVkFMX0xPTkcoJnosIGluZGV4KTsKICAgfQotICBiaW5hcnlfc2VyaWFsaXplKGtleXR5cGUsIHRyYW5zcG9ydCwgJnosIE5VTEwpOwotICB6dmFsX3B0cl9kdG9yKCZ6KTsKKyAgYmluYXJ5X3NlcmlhbGl6ZShrZXl0eXBlLCB0cmFuc3BvcnQsICZ6LCBzcGVjKTsKKyAgenZhbF9kdG9yKCZ6KTsKIH0KIAotaW5saW5lIGJvb2wgdHR5cGVfaXNfaW50KGludDhfdCB0KSB7CitzdGF0aWMKK3ZvaWQgYmluYXJ5X3NlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQT3V0cHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIHp2YWwqIHZhbHVlLCBIYXNoVGFibGUqIGZpZWxkc3BlYykgeworICBpZiAodmFsdWUpIHsKKyAgICBaVkFMX0RFUkVGKHZhbHVlKTsKKyAgfQorICAvLyBBdCB0aGlzIHBvaW50IHRoZSB0eXBlSUQgKGFuZCBmaWVsZCBudW0sIGlmIGFwcGxpY2FibGUpIHNob3VsZCd2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbiB0byB0aGUgb3V0cHV0IHNvIGFsbCB3ZSBuZWVkIHRvIGRvIGlzIHdyaXRlIHRoZSBwYXlsb2FkLgorICBzd2l0Y2ggKHRocmlmdF90eXBlSUQpIHsKKyAgICBjYXNlIFRfU1RPUDoKKyAgICBjYXNlIFRfVk9JRDoKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfU1RSVUNUOiB7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX09CSkVDVCkgeworICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBub24tb2JqZWN0IHR5cGUgYXMgYSBUX1NUUlVDVCIsIElOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eShaX09CSkNFX1AodmFsdWUpLCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFNQRUMiKS0xLCB0cnVlKTsKKyAgICAgIGlmIChzcGVjICYmIFpfVFlQRV9QKHNwZWMpID09IElTX1JFRkVSRU5DRSkgeworICAgICAgICBaVkFMX0RFUkVGKHNwZWMpOworICAgICAgfQorICAgICAgaWYgKCFzcGVjIHx8IFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7CisgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIG5vbi1UaHJpZnQgb2JqZWN0IGFzIGEgVF9TVFJVQ1QiLCBJTlZBTElEX0RBVEEpOworICAgICAgfQorICAgICAgYmluYXJ5X3NlcmlhbGl6ZV9zcGVjKHZhbHVlLCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOworICAgIH0gcmV0dXJuOworICAgIGNhc2UgVF9CT09MOgorICAgICAgaWYgKCF6dmFsX2lzX2Jvb2wodmFsdWUpKSBjb252ZXJ0X3RvX2Jvb2xlYW4odmFsdWUpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTgoWl9UWVBFX0lORk9fUCh2YWx1ZSkgPT0gSVNfVFJVRSA/IDEgOiAwKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfQllURToKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbHVlKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUk4KFpfTFZBTF9QKHZhbHVlKSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBUX0kxNjoKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbHVlKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUkxNihaX0xWQUxfUCh2YWx1ZSkpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9JMzI6CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWx1ZSk7CisgICAgICB0cmFuc3BvcnQud3JpdGVJMzIoWl9MVkFMX1AodmFsdWUpKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfSTY0OgorICAgIGNhc2UgVF9VNjQ6IHsKKyAgICAgIGludDY0X3QgbF9kYXRhOworI2lmIGRlZmluZWQoX0xQNjQpIHx8IGRlZmluZWQoX1dJTjY0KQorICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsdWUpOworICAgICAgbF9kYXRhID0gWl9MVkFMX1AodmFsdWUpOworI2Vsc2UKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfRE9VQkxFKSBjb252ZXJ0X3RvX2RvdWJsZSh2YWx1ZSk7CisgICAgICBsX2RhdGEgPSAoaW50NjRfdClaX0RWQUxfUCh2YWx1ZSk7CisjZW5kaWYKKyAgICAgIHRyYW5zcG9ydC53cml0ZUk2NChsX2RhdGEpOworICAgIH0gcmV0dXJuOworICAgIGNhc2UgVF9ET1VCTEU6IHsKKyAgICAgIHVuaW9uIHsKKyAgICAgICAgaW50NjRfdCBjOworICAgICAgICBkb3VibGUgZDsKKyAgICAgIH0gYTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfRE9VQkxFKSBjb252ZXJ0X3RvX2RvdWJsZSh2YWx1ZSk7CisgICAgICBhLmQgPSBaX0RWQUxfUCh2YWx1ZSk7CisgICAgICB0cmFuc3BvcnQud3JpdGVJNjQoYS5jKTsKKyAgICB9IHJldHVybjsKKyAgICBjYXNlIFRfVVRGODoKKyAgICBjYXNlIFRfVVRGMTY6CisgICAgY2FzZSBUX1NUUklORzoKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZyh2YWx1ZSk7CisgICAgICB0cmFuc3BvcnQud3JpdGVTdHJpbmcoWl9TVFJWQUxfUCh2YWx1ZSksIFpfU1RSTEVOX1AodmFsdWUpKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfTUFQOiB7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0FSUkFZKSBjb252ZXJ0X3RvX2FycmF5KHZhbHVlKTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfTUFQKSIsIElOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgICBIYXNoVGFibGUqIGh0ID0gWl9BUlJWQUxfUCh2YWx1ZSk7CisgICAgICB6dmFsKiB2YWxfcHRyOworCisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImt0eXBlIiwgc2l6ZW9mKCJrdHlwZSIpLTEpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICAgIHVpbnQ4X3Qga2V5dHlwZSA9IFpfTFZBTF9QKHZhbF9wdHIpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTgoa2V5dHlwZSk7CisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgInZ0eXBlIiwgc2l6ZW9mKCJ2dHlwZSIpLTEpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICAgIHVpbnQ4X3QgdmFsdHlwZSA9IFpfTFZBTF9QKHZhbF9wdHIpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTgodmFsdHlwZSk7CisKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidmFsIiwgc2l6ZW9mKCJ2YWwiKS0xKTsKKyAgICAgIEhhc2hUYWJsZSogdmFsc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisgICAgICBIYXNoVGFibGUqIGtleXNwZWMgPSBaX0FSUlZBTF9QKHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJrZXkiLCBzaXplb2YoImtleSIpLTEpKTsKKworICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKHplbmRfaGFzaF9udW1fZWxlbWVudHMoaHQpKTsKKyAgICAgIEhhc2hQb3NpdGlvbiBrZXlfcHRyOworICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOworICAgICAgICAgICAodmFsX3B0ciA9IHplbmRfaGFzaF9nZXRfY3VycmVudF9kYXRhX2V4KGh0LCAma2V5X3B0cikpICE9IG51bGxwdHI7CisgICAgICAgICAgIHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgeworICAgICAgICBiaW5hcnlfc2VyaWFsaXplX2hhc2h0YWJsZV9rZXkoa2V5dHlwZSwgdHJhbnNwb3J0LCBodCwga2V5X3B0ciwga2V5c3BlYyk7CisgICAgICAgIGJpbmFyeV9zZXJpYWxpemUodmFsdHlwZSwgdHJhbnNwb3J0LCB2YWxfcHRyLCB2YWxzcGVjKTsKKyAgICAgIH0KKyAgICB9IHJldHVybjsKKyAgICBjYXNlIFRfTElTVDogeworICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19BUlJBWSkgY29udmVydF90b19hcnJheSh2YWx1ZSk7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0FSUkFZKSB7CisgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIGFuIGluY29tcGF0aWJsZSB0eXBlIGFzIGFuIGFycmF5IChUX0xJU1QpIiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICAgIEhhc2hUYWJsZSogaHQgPSBaX0FSUlZBTF9QKHZhbHVlKTsKKyAgICAgIHp2YWwqIHZhbF9wdHI7CisKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZXR5cGUiLCBzaXplb2YoImV0eXBlIiktMSk7CisgICAgICBpZiAoWl9UWVBFX1AodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbF9wdHIpOworICAgICAgdWludDhfdCB2YWx0eXBlID0gWl9MVkFMX1AodmFsX3B0cik7CisgICAgICB0cmFuc3BvcnQud3JpdGVJOCh2YWx0eXBlKTsKKworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgc2l6ZW9mKCJlbGVtIiktMSk7CisgICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOworCisgICAgICB0cmFuc3BvcnQud3JpdGVJMzIoemVuZF9oYXNoX251bV9lbGVtZW50cyhodCkpOworICAgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7CisgICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7CisgICAgICAgICAgICh2YWxfcHRyID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoaHQsICZrZXlfcHRyKSkgIT0gbnVsbHB0cjsKKyAgICAgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChodCwgJmtleV9wdHIpKSB7CisgICAgICAgIGJpbmFyeV9zZXJpYWxpemUodmFsdHlwZSwgdHJhbnNwb3J0LCB2YWxfcHRyLCB2YWxzcGVjKTsKKyAgICAgIH0KKyAgICB9IHJldHVybjsKKyAgICBjYXNlIFRfU0VUOiB7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0FSUkFZKSBjb252ZXJ0X3RvX2FycmF5KHZhbHVlKTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfU0VUKSIsIElOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgICBIYXNoVGFibGUqIGh0ID0gWl9BUlJWQUxfUCh2YWx1ZSk7CisgICAgICB6dmFsKiB2YWxfcHRyOworCisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImV0eXBlIiwgc2l6ZW9mKCJldHlwZSIpLTEpOworICAgICAgSGFzaFRhYmxlKiBzcGVjID0gWl9BUlJWQUxfUCh6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZWxlbSIsIHNpemVvZigiZWxlbSIpLTEpKTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsX3B0cik7CisgICAgICB1aW50OF90IGtleXR5cGUgPSBaX0xWQUxfUCh2YWxfcHRyKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUk4KGtleXR5cGUpOworCisgICAgICB0cmFuc3BvcnQud3JpdGVJMzIoemVuZF9oYXNoX251bV9lbGVtZW50cyhodCkpOworICAgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7CisgICAgICBpZih0dHlwZV9pc19zY2FsYXIoa2V5dHlwZSkpeworICAgICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7CisgICAgICAgICAgICAgKHZhbF9wdHIgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgJmtleV9wdHIpKSAhPSBudWxscHRyOworICAgICAgICAgICAgIHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgeworICAgICAgICAgIGJpbmFyeV9zZXJpYWxpemVfaGFzaHRhYmxlX2tleShrZXl0eXBlLCB0cmFuc3BvcnQsIGh0LCBrZXlfcHRyLCBzcGVjKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOworICAgICAgICAgICAgICh2YWxfcHRyID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoaHQsICZrZXlfcHRyKSkgIT0gbnVsbHB0cjsKKyAgICAgICAgICAgICB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KGh0LCAma2V5X3B0cikpIHsKKyAgICAgICAgICBiaW5hcnlfc2VyaWFsaXplKGtleXR5cGUsIHRyYW5zcG9ydCwgdmFsX3B0ciwgc3BlYyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IHJldHVybjsKKyAgfTsKKworICBjaGFyIGVycmJ1ZlsxMjhdOworICBzbnByaW50ZihlcnJidWYsIDEyOCwgIlVua25vd24gdGhyaWZ0IHR5cGVJRCAlZCIsIHRocmlmdF90eXBlSUQpOworICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOworfQorCitzdGF0aWMKK3ZvaWQgcHJvdG9jb2xfd3JpdGVNZXNzYWdlQmVnaW4oenZhbCogdHJhbnNwb3J0LCB6ZW5kX3N0cmluZyogbWV0aG9kX25hbWUsIGludDMyX3QgbXNndHlwZSwgaW50MzJfdCBzZXFJRCkgeworICB6dmFsIGFyZ3NbM107CisgIHp2YWwgcmV0OworICB6dmFsIHdyaXRlTWVzc2FnZWZuOworCisgIFpWQUxfU1RSX0NPUFkoJmFyZ3NbMF0sIG1ldGhvZF9uYW1lKTsKKyAgWlZBTF9MT05HKCZhcmdzWzFdLCBtc2d0eXBlKTsKKyAgWlZBTF9MT05HKCZhcmdzWzJdLCBzZXFJRCk7CisgIFpWQUxfTlVMTCgmcmV0KTsKKyAgWlZBTF9TVFJJTkcoJndyaXRlTWVzc2FnZWZuLCAid3JpdGVNZXNzYWdlQmVnaW4iKTsKKworICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCB0cmFuc3BvcnQsICZ3cml0ZU1lc3NhZ2VmbiwgJnJldCwgMywgYXJncyk7CisKKyAgenZhbF9kdG9yKCZ3cml0ZU1lc3NhZ2Vmbik7CisgIHp2YWxfZHRvcigmYXJnc1syXSk7IHp2YWxfZHRvcigmYXJnc1sxXSk7IHp2YWxfZHRvcigmYXJnc1swXSk7CisgIHp2YWxfZHRvcigmcmV0KTsKKyAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOworICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICB9Cit9CisKK3N0YXRpYyBpbmxpbmUKK2Jvb2wgdHR5cGVfaXNfaW50KGludDhfdCB0KSB7CiAgIHJldHVybiAoKHQgPT0gVF9CWVRFKSB8fCAoKHQgPj0gVF9JMTYpICAmJiAodCA8PSBUX0k2NCkpKTsKIH0KK3N0YXRpYyBpbmxpbmUKK2Jvb2wgdHR5cGVfaXNfc2NhbGFyKGludDhfdCB0KSB7CisgIHJldHVybiAhKCh0ID09IFRfU1RSVUNUKSB8fCAoIHQ9PSBUX01BUCkgIHx8ICh0ID09IFRfU0VUKSB8fCAodCA9PSBUX0xJU1QpKTsKK30KIAotaW5saW5lIGJvb2wgdHR5cGVzX2FyZV9jb21wYXRpYmxlKGludDhfdCB0MSwgaW50OF90IHQyKSB7CitzdGF0aWMgaW5saW5lCitib29sIHR0eXBlc19hcmVfY29tcGF0aWJsZShpbnQ4X3QgdDEsIGludDhfdCB0MikgewogICAvLyBJbnRlZ2VyIHR5cGVzIG9mIGRpZmZlcmVudCB3aWR0aHMgYXJlIGNvbnNpZGVyZWQgY29tcGF0aWJsZTsKICAgLy8gb3RoZXJ3aXNlIHRoZSB0eXBlSUQgbXVzdCBtYXRjaC4KICAgcmV0dXJuICgodDEgPT0gdDIpIHx8ICh0dHlwZV9pc19pbnQodDEpICYmIHR0eXBlX2lzX2ludCh0MikpKTsKIH0KIAorLy9pcyB1c2VkIHRvIHZhbGlkYXRlIG9iamVjdHMgYmVmb3JlIHNlcmlhbGl6YXRpb24gYW5kIGFmdGVyIGRlc2VyaWFsaXphdGlvbi4gRm9yIG5vdywgb25seSByZXF1aXJlZCBmaWVsZHMgYXJlIHZhbGlkYXRlZC4KK3N0YXRpYwordm9pZCB2YWxpZGF0ZV90aHJpZnRfb2JqZWN0KHp2YWwqIG9iamVjdCkgeworICAgIHplbmRfY2xhc3NfZW50cnkqIG9iamVjdF9jbGFzc19lbnRyeSA9IFpfT0JKQ0VfUChvYmplY3QpOworICAgIHp2YWwqIGlzX3ZhbGlkYXRlID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eShvYmplY3RfY2xhc3NfZW50cnksICJpc1ZhbGlkYXRlIiwgc2l6ZW9mKCJpc1ZhbGlkYXRlIiktMSwgdHJ1ZSk7CisgICAgaWYgKGlzX3ZhbGlkYXRlKSB7CisgICAgICBaVkFMX0RFUkVGKGlzX3ZhbGlkYXRlKTsKKyAgICB9CisgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkob2JqZWN0X2NsYXNzX2VudHJ5LCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFNQRUMiKS0xLCB0cnVlKTsKKyAgICBpZiAoc3BlYykgeworICAgICAgWlZBTF9ERVJFRihzcGVjKTsKKyAgICB9CisgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7CisgICAgenZhbCogdmFsX3B0cjsKKworICAgIGlmIChpc192YWxpZGF0ZSAmJiBaX1RZUEVfSU5GT19QKGlzX3ZhbGlkYXRlKSA9PSBJU19UUlVFKSB7CisgICAgICAgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoWl9BUlJWQUxfUChzcGVjKSwgJmtleV9wdHIpOworICAgICAgICAgICAodmFsX3B0ciA9IHplbmRfaGFzaF9nZXRfY3VycmVudF9kYXRhX2V4KFpfQVJSVkFMX1Aoc3BlYyksICZrZXlfcHRyKSkgIT0gbnVsbHB0cjsKKyAgICAgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChaX0FSUlZBTF9QKHNwZWMpLCAma2V5X3B0cikpIHsKKworICAgICAgICAgICAgemVuZF91bG9uZyBmaWVsZG5vOworICAgICAgICAgICAgaWYgKHplbmRfaGFzaF9nZXRfY3VycmVudF9rZXlfZXgoWl9BUlJWQUxfUChzcGVjKSwgbnVsbHB0ciwgJmZpZWxkbm8sICZrZXlfcHRyKSAhPSBIQVNIX0tFWV9JU19MT05HKSB7CisgICAgICAgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQmFkIGtleXR5cGUgaW4gVFNQRUMgKGV4cGVjdGVkICdsb25nJykiLCBJTlZBTElEX0RBVEEpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBIYXNoVGFibGUqIGZpZWxkc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisKKyAgICAgICAgICAgIC8vIGZpZWxkIG5hbWUKKyAgICAgICAgICAgIHp2YWwqIHp2YXJuYW1lID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgInZhciIsIHNpemVvZigidmFyIiktMSk7CisgICAgICAgICAgICBjaGFyKiB2YXJuYW1lID0gWl9TVFJWQUxfUCh6dmFybmFtZSk7CisKKyAgICAgICAgICAgIHp2YWwqIGlzX3JlcXVpcmVkID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImlzUmVxdWlyZWQiLCBzaXplb2YoImlzUmVxdWlyZWQiKS0xKTsKKyAgICAgICAgICAgIHp2YWwgcnY7CisgICAgICAgICAgICB6dmFsKiBwcm9wID0gemVuZF9yZWFkX3Byb3BlcnR5KG9iamVjdF9jbGFzc19lbnRyeSwgb2JqZWN0LCB2YXJuYW1lLCBzdHJsZW4odmFybmFtZSksIGZhbHNlLCAmcnYpOworCisgICAgICAgICAgICBpZiAoWl9UWVBFX0lORk9fUChpc19yZXF1aXJlZCkgPT0gSVNfVFJVRSAmJiBaX1RZUEVfUChwcm9wKSA9PSBJU19OVUxMKSB7CisgICAgICAgICAgICAgICAgY2hhciBlcnJidWZbMTI4XTsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihlcnJidWYsIDEyOCwgIlJlcXVpcmVkIGZpZWxkICVzLiVzIGlzIHVuc2V0ISIsIFpTVFJfVkFMKG9iamVjdF9jbGFzc19lbnRyeS0+bmFtZSksIHZhcm5hbWUpOworICAgICAgICAgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYwogdm9pZCBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyh6dmFsKiB6dGhpcywgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgSGFzaFRhYmxlKiBzcGVjKSB7CiAgIC8vIFNFVCBhbmQgTElTVCBoYXZlICdlbGVtJyA9PiBhcnJheSgndHlwZScsIFtvcHRpb25hbF0gJ2NsYXNzJykKICAgLy8gTUFQIGhhcyAndmFsJyA9PiBhcnJheSgndHlwZScsIFtvcHRpb25hXSAnY2xhc3MnKQotICBUU1JNTFNfRkVUQ0goKTsKLSAgemVuZF9jbGFzc19lbnRyeSogY2UgPSB6ZW5kX2dldF9jbGFzc19lbnRyeSh6dGhpcyBUU1JNTFNfQ0MpOworICB6ZW5kX2NsYXNzX2VudHJ5KiBjZSA9IFpfT0JKQ0VfUCh6dGhpcyk7CiAgIHdoaWxlICh0cnVlKSB7Ci0gICAgenZhbCoqIHZhbF9wdHIgPSBOVUxMOwotCiAgICAgaW50OF90IHR0eXBlID0gdHJhbnNwb3J0LnJlYWRJOCgpOwotICAgIGlmICh0dHlwZSA9PSBUX1NUT1ApIHJldHVybjsKKyAgICBpZiAodHR5cGUgPT0gVF9TVE9QKSB7CisgICAgICB2YWxpZGF0ZV90aHJpZnRfb2JqZWN0KHp0aGlzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBpbnQxNl90IGZpZWxkbm8gPSB0cmFuc3BvcnQucmVhZEkxNigpOwotICAgIGlmICh6ZW5kX2hhc2hfaW5kZXhfZmluZChzcGVjLCBmaWVsZG5vLCAodm9pZCoqKSZ2YWxfcHRyKSA9PSBTVUNDRVNTKSB7Ci0gICAgICBIYXNoVGFibGUqIGZpZWxkc3BlYyA9IFpfQVJSVkFMX1BQKHZhbF9wdHIpOworICAgIHp2YWwqIHZhbF9wdHIgPSB6ZW5kX2hhc2hfaW5kZXhfZmluZChzcGVjLCBmaWVsZG5vKTsKKyAgICBpZiAodmFsX3B0ciAhPSBudWxscHRyKSB7CisgICAgICBIYXNoVGFibGUqIGZpZWxkc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CiAgICAgICAvLyBwdWxsIHRoZSBmaWVsZCBuYW1lCi0gICAgICAvLyB6ZW5kIGhhc2ggdGFibGVzIHVzZSB0aGUgbnVsbCBhdCB0aGUgZW5kIGluIHRoZSBsZW5ndGguLi4gc28gc3RybGVuKGhhc2gga2V5KSArIDEuCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJ2YXIiLCA0LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIGNoYXIqIHZhcm5hbWUgPSBaX1NUUlZBTF9QUCh2YWxfcHRyKTsKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidmFyIiwgc2l6ZW9mKCJ2YXIiKS0xKTsKKyAgICAgIGNoYXIqIHZhcm5hbWUgPSBaX1NUUlZBTF9QKHZhbF9wdHIpOwogCiAgICAgICAvLyBhbmQgdGhlIHR5cGUKLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInR5cGUiLCA1LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWxfcHRyKTsKLSAgICAgIGludDhfdCBleHBlY3RlZF90dHlwZSA9IFpfTFZBTF9QUCh2YWxfcHRyKTsKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidHlwZSIsIHNpemVvZigidHlwZSIpLTEpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICAgIGludDhfdCBleHBlY3RlZF90dHlwZSA9IFpfTFZBTF9QKHZhbF9wdHIpOwogCiAgICAgICBpZiAodHR5cGVzX2FyZV9jb21wYXRpYmxlKHR0eXBlLCBleHBlY3RlZF90dHlwZSkpIHsKLSAgICAgICAgenZhbCogcnYgPSBOVUxMOwotICAgICAgICBNQUtFX1NURF9aVkFMKHJ2KTsKLSAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR0eXBlLCB0cmFuc3BvcnQsIHJ2LCBmaWVsZHNwZWMpOwotICAgICAgICB6ZW5kX3VwZGF0ZV9wcm9wZXJ0eShjZSwgenRoaXMsIHZhcm5hbWUsIHN0cmxlbih2YXJuYW1lKSwgcnYgVFNSTUxTX0NDKTsKKyAgICAgICAgenZhbCBydjsKKyAgICAgICAgWlZBTF9VTkRFRigmcnYpOworCisgICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0dHlwZSwgdHJhbnNwb3J0LCAmcnYsIGZpZWxkc3BlYyk7CisgICAgICAgIHplbmRfdXBkYXRlX3Byb3BlcnR5KGNlLCB6dGhpcywgdmFybmFtZSwgc3RybGVuKHZhcm5hbWUpLCAmcnYpOworCiAgICAgICAgIHp2YWxfcHRyX2R0b3IoJnJ2KTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNraXBfZWxlbWVudCh0dHlwZSwgdHJhbnNwb3J0KTsKQEAgLTc2MywxNzEgKzk4MSw0NCBAQAogICB9CiB9CiAKLXZvaWQgYmluYXJ5X3NlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQT3V0cHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIHp2YWwqKiB2YWx1ZSwgSGFzaFRhYmxlKiBmaWVsZHNwZWMpIHsKLSAgLy8gQXQgdGhpcyBwb2ludCB0aGUgdHlwZUlEIChhbmQgZmllbGQgbnVtLCBpZiBhcHBsaWNhYmxlKSBzaG91bGQndmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzbyBhbGwgd2UgbmVlZCB0byBkbyBpcyB3cml0ZSB0aGUgcGF5bG9hZC4KLSAgc3dpdGNoICh0aHJpZnRfdHlwZUlEKSB7Ci0gICAgY2FzZSBUX1NUT1A6Ci0gICAgY2FzZSBUX1ZPSUQ6Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBUX1NUUlVDVDogewotICAgICAgVFNSTUxTX0ZFVENIKCk7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19PQkpFQ1QpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgbm9uLW9iamVjdCB0eXBlIGFzIGEgVF9TVFJVQ1QiLCBJTlZBTElEX0RBVEEpOwotICAgICAgfQotICAgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoemVuZF9nZXRfY2xhc3NfZW50cnkoKnZhbHVlIFRTUk1MU19DQyksICJfVFNQRUMiLCA2LCBmYWxzZSBUU1JNTFNfQ0MpOwotICAgICAgaWYgKFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIG5vbi1UaHJpZnQgb2JqZWN0IGFzIGEgVF9TVFJVQ1QiLCBJTlZBTElEX0RBVEEpOwotICAgICAgfQotICAgICAgYmluYXJ5X3NlcmlhbGl6ZV9zcGVjKCp2YWx1ZSwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKLSAgICB9IHJldHVybjsKLSAgICBjYXNlIFRfQk9PTDoKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0JPT0wpIGNvbnZlcnRfdG9fYm9vbGVhbigqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTgoWl9CVkFMX1BQKHZhbHVlKSA/IDEgOiAwKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfQllURToKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTgoWl9MVkFMX1BQKHZhbHVlKSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBUX0kxNjoKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTE2KFpfTFZBTF9QUCh2YWx1ZSkpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9JMzI6Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcoKnZhbHVlKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUkzMihaX0xWQUxfUFAodmFsdWUpKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfSTY0OgotICAgIGNhc2UgVF9VNjQ6IHsKLSAgICAgIGludDY0X3QgbF9kYXRhOwotI2lmIGRlZmluZWQoX0xQNjQpIHx8IGRlZmluZWQoX1dJTjY0KQotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWx1ZSk7Ci0gICAgICBsX2RhdGEgPSBaX0xWQUxfUFAodmFsdWUpOwotI2Vsc2UKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0RPVUJMRSkgY29udmVydF90b19kb3VibGUoKnZhbHVlKTsKLSAgICAgIGxfZGF0YSA9IChpbnQ2NF90KVpfRFZBTF9QUCh2YWx1ZSk7Ci0jZW5kaWYKLSAgICAgIHRyYW5zcG9ydC53cml0ZUk2NChsX2RhdGEpOwotICAgIH0gcmV0dXJuOwotICAgIGNhc2UgVF9ET1VCTEU6IHsKLSAgICAgIHVuaW9uIHsKLSAgICAgICAgaW50NjRfdCBjOwotICAgICAgICBkb3VibGUgZDsKLSAgICAgIH0gYTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0RPVUJMRSkgY29udmVydF90b19kb3VibGUoKnZhbHVlKTsKLSAgICAgIGEuZCA9IFpfRFZBTF9QUCh2YWx1ZSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJNjQoYS5jKTsKLSAgICB9IHJldHVybjsKLSAgICAvL2Nhc2UgVF9VVEY3OgotICAgIGNhc2UgVF9VVEY4OgotICAgIGNhc2UgVF9VVEYxNjoKLSAgICBjYXNlIFRfU1RSSU5HOgotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZygqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlU3RyaW5nKFpfU1RSVkFMX1BQKHZhbHVlKSwgWl9TVFJMRU5fUFAodmFsdWUpKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfTUFQOiB7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19BUlJBWSkgY29udmVydF90b19hcnJheSgqdmFsdWUpOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfTUFQKSIsIElOVkFMSURfREFUQSk7Ci0gICAgICB9Ci0gICAgICBIYXNoVGFibGUqIGh0ID0gWl9BUlJWQUxfUFAodmFsdWUpOwotICAgICAgenZhbCoqIHZhbF9wdHI7Ci0KLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgImt0eXBlIiwgNiwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsX3B0cik7Ci0gICAgICB1aW50OF90IGtleXR5cGUgPSBaX0xWQUxfUFAodmFsX3B0cik7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOChrZXl0eXBlKTsKLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInZ0eXBlIiwgNiwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsX3B0cik7Ci0gICAgICB1aW50OF90IHZhbHR5cGUgPSBaX0xWQUxfUFAodmFsX3B0cik7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOCh2YWx0eXBlKTsKLQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidmFsIiwgNCwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLQotICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKHplbmRfaGFzaF9udW1fZWxlbWVudHMoaHQpKTsKLSAgICAgIEhhc2hQb3NpdGlvbiBrZXlfcHRyOwotICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOyB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgKHZvaWQqKikmdmFsX3B0ciwgJmtleV9wdHIpID09IFNVQ0NFU1M7IHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgewotICAgICAgICBiaW5hcnlfc2VyaWFsaXplX2hhc2h0YWJsZV9rZXkoa2V5dHlwZSwgdHJhbnNwb3J0LCBodCwga2V5X3B0cik7Ci0gICAgICAgIGJpbmFyeV9zZXJpYWxpemUodmFsdHlwZSwgdHJhbnNwb3J0LCB2YWxfcHRyLCB2YWxzcGVjKTsKLSAgICAgIH0KLSAgICB9IHJldHVybjsKLSAgICBjYXNlIFRfTElTVDogewotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIGNvbnZlcnRfdG9fYXJyYXkoKnZhbHVlKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIGFuIGluY29tcGF0aWJsZSB0eXBlIGFzIGFuIGFycmF5IChUX0xJU1QpIiwgSU5WQUxJRF9EQVRBKTsKLSAgICAgIH0KLSAgICAgIEhhc2hUYWJsZSogaHQgPSBaX0FSUlZBTF9QUCh2YWx1ZSk7Ci0gICAgICB6dmFsKiogdmFsX3B0cjsKLQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAiZXR5cGUiLCA2LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWxfcHRyKTsKLSAgICAgIHVpbnQ4X3QgdmFsdHlwZSA9IFpfTFZBTF9QUCh2YWxfcHRyKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUk4KHZhbHR5cGUpOwotCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgNSwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLQotICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKHplbmRfaGFzaF9udW1fZWxlbWVudHMoaHQpKTsKLSAgICAgIEhhc2hQb3NpdGlvbiBrZXlfcHRyOwotICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOyB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgKHZvaWQqKikmdmFsX3B0ciwgJmtleV9wdHIpID09IFNVQ0NFU1M7IHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgewotICAgICAgICBiaW5hcnlfc2VyaWFsaXplKHZhbHR5cGUsIHRyYW5zcG9ydCwgdmFsX3B0ciwgdmFsc3BlYyk7Ci0gICAgICB9Ci0gICAgfSByZXR1cm47Ci0gICAgY2FzZSBUX1NFVDogewotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIGNvbnZlcnRfdG9fYXJyYXkoKnZhbHVlKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIGFuIGluY29tcGF0aWJsZSB0eXBlIGFzIGFuIGFycmF5IChUX1NFVCkiLCBJTlZBTElEX0RBVEEpOwotICAgICAgfQotICAgICAgSGFzaFRhYmxlKiBodCA9IFpfQVJSVkFMX1BQKHZhbHVlKTsKLSAgICAgIHp2YWwqKiB2YWxfcHRyOwotCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJldHlwZSIsIDYsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcoKnZhbF9wdHIpOwotICAgICAgdWludDhfdCBrZXl0eXBlID0gWl9MVkFMX1BQKHZhbF9wdHIpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTgoa2V5dHlwZSk7Ci0KLSAgICAgIHRyYW5zcG9ydC53cml0ZUkzMih6ZW5kX2hhc2hfbnVtX2VsZW1lbnRzKGh0KSk7Ci0gICAgICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKLSAgICAgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoaHQsICZrZXlfcHRyKTsgemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoaHQsICh2b2lkKiopJnZhbF9wdHIsICZrZXlfcHRyKSA9PSBTVUNDRVNTOyB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KGh0LCAma2V5X3B0cikpIHsKLSAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZV9oYXNodGFibGVfa2V5KGtleXR5cGUsIHRyYW5zcG9ydCwgaHQsIGtleV9wdHIpOwotICAgICAgfQotICAgIH0gcmV0dXJuOwotICB9OwotICBjaGFyIGVycmJ1ZlsxMjhdOwotICBzcHJpbnRmKGVycmJ1ZiwgIlVua25vd24gdGhyaWZ0IHR5cGVJRCAlZCIsIHRocmlmdF90eXBlSUQpOwotICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOwotfQotCi0KK3N0YXRpYwogdm9pZCBiaW5hcnlfc2VyaWFsaXplX3NwZWMoenZhbCogenRoaXMsIFBIUE91dHB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIHNwZWMpIHsKKworICB2YWxpZGF0ZV90aHJpZnRfb2JqZWN0KHp0aGlzKTsKKwogICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKLSAgenZhbCoqIHZhbF9wdHI7CisgIHp2YWwqIHZhbF9wdHI7CiAKLSAgVFNSTUxTX0ZFVENIKCk7Ci0gIHplbmRfY2xhc3NfZW50cnkqIGNlID0gemVuZF9nZXRfY2xhc3NfZW50cnkoenRoaXMgVFNSTUxTX0NDKTsKKyAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChzcGVjLCAma2V5X3B0cik7CisgICAgICAgKHZhbF9wdHIgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChzcGVjLCAma2V5X3B0cikpICE9IG51bGxwdHI7CisgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChzcGVjLCAma2V5X3B0cikpIHsKIAotICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KHNwZWMsICZrZXlfcHRyKTsgemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoc3BlYywgKHZvaWQqKikmdmFsX3B0ciwgJmtleV9wdHIpID09IFNVQ0NFU1M7IHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoc3BlYywgJmtleV9wdHIpKSB7Ci0gICAgdWxvbmcgZmllbGRubzsKLSAgICBpZiAoemVuZF9oYXNoX2dldF9jdXJyZW50X2tleV9leChzcGVjLCBOVUxMLCBOVUxMLCAmZmllbGRubywgMCwgJmtleV9wdHIpICE9IEhBU0hfS0VZX0lTX0xPTkcpIHsKKyAgICB6ZW5kX3Vsb25nIGZpZWxkbm87CisgICAgaWYgKHplbmRfaGFzaF9nZXRfY3VycmVudF9rZXlfZXgoc3BlYywgbnVsbHB0ciwgJmZpZWxkbm8sICZrZXlfcHRyKSAhPSBIQVNIX0tFWV9JU19MT05HKSB7CiAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkJhZCBrZXl0eXBlIGluIFRTUEVDIChleHBlY3RlZCAnbG9uZycpIiwgSU5WQUxJRF9EQVRBKTsKICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgSGFzaFRhYmxlKiBmaWVsZHNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKKyAgICBIYXNoVGFibGUqIGZpZWxkc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CiAKICAgICAvLyBmaWVsZCBuYW1lCi0gICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidmFyIiwgNCwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgY2hhciogdmFybmFtZSA9IFpfU1RSVkFMX1BQKHZhbF9wdHIpOworICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidmFyIiwgc2l6ZW9mKCJ2YXIiKS0xKTsKKyAgICBjaGFyKiB2YXJuYW1lID0gWl9TVFJWQUxfUCh2YWxfcHRyKTsKIAogICAgIC8vIHRocmlmdCB0eXBlCi0gICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidHlwZSIsIDUsICh2b2lkKiopJnZhbF9wdHIpOwotICAgIGlmIChaX1RZUEVfUFAodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWxfcHRyKTsKLSAgICBpbnQ4X3QgdHR5cGUgPSBaX0xWQUxfUFAodmFsX3B0cik7CisgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ0eXBlIiwgc2l6ZW9mKCJ0eXBlIiktMSk7CisgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICBpbnQ4X3QgdHR5cGUgPSBaX0xWQUxfUCh2YWxfcHRyKTsKIAotICAgIHp2YWwqIHByb3AgPSB6ZW5kX3JlYWRfcHJvcGVydHkoY2UsIHp0aGlzLCB2YXJuYW1lLCBzdHJsZW4odmFybmFtZSksIGZhbHNlIFRTUk1MU19DQyk7CisgICAgenZhbCBydjsKKyAgICB6dmFsKiBwcm9wID0gemVuZF9yZWFkX3Byb3BlcnR5KFpfT0JKQ0VfUCh6dGhpcyksIHp0aGlzLCB2YXJuYW1lLCBzdHJsZW4odmFybmFtZSksIGZhbHNlLCAmcnYpOworCisgICAgaWYgKFpfVFlQRV9QKHByb3ApID09IElTX1JFRkVSRU5DRSl7CisgICAgICBaVkFMX1VOUkVGKHByb3ApOworICAgIH0KICAgICBpZiAoWl9UWVBFX1AocHJvcCkgIT0gSVNfTlVMTCkgewogICAgICAgdHJhbnNwb3J0LndyaXRlSTgodHR5cGUpOwogICAgICAgdHJhbnNwb3J0LndyaXRlSTE2KGZpZWxkbm8pOwotICAgICAgYmluYXJ5X3NlcmlhbGl6ZSh0dHlwZSwgdHJhbnNwb3J0LCAmcHJvcCwgZmllbGRzcGVjKTsKKyAgICAgIGJpbmFyeV9zZXJpYWxpemUodHR5cGUsIHRyYW5zcG9ydCwgcHJvcCwgZmllbGRzcGVjKTsKICAgICB9CiAgIH0KICAgdHJhbnNwb3J0LndyaXRlSTgoVF9TVE9QKTsgLy8gc3RydWN0IGVuZApAQCAtOTM1LDkzICsxMDI2LDU5IEBACiAKIC8vIDYgcGFyYW1zOiAkdHJhbnNwb3J0ICRtZXRob2RfbmFtZSAkdHR5cGUgJHJlcXVlc3Rfc3RydWN0ICRzZXFJRCAkc3RyaWN0X3dyaXRlCiBQSFBfRlVOQ1RJT04odGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSkgewotICBpbnQgYXJnYyA9IFpFTkRfTlVNX0FSR1MoKTsKLSAgaWYgKGFyZ2MgPCA2KSB7Ci0gICAgV1JPTkdfUEFSQU1fQ09VTlQ7CisgIHp2YWwgKnByb3RvY29sOworICB6dmFsICpyZXF1ZXN0X3N0cnVjdDsKKyAgemVuZF9zdHJpbmcgKm1ldGhvZF9uYW1lOworICBsb25nIG1zZ3R5cGUsIHNlcUlEOworICB6ZW5kX2Jvb2wgc3RyaWN0X3dyaXRlOworCisgIGlmICh6ZW5kX3BhcnNlX3BhcmFtZXRlcnNfZXgoWkVORF9QQVJTRV9QQVJBTVNfUVVJRVQsIFpFTkRfTlVNX0FSR1MoKSwgIm9TbG9sYiIsCisgICAgJnByb3RvY29sLCAmbWV0aG9kX25hbWUsICZtc2d0eXBlLAorICAgICZyZXF1ZXN0X3N0cnVjdCwgJnNlcUlELCAmc3RyaWN0X3dyaXRlKSA9PSBGQUlMVVJFKSB7CisgICAgICByZXR1cm47CiAgIH0KIAotICB6dmFsICoqKmFyZ3MgPSAoenZhbCoqKikgZW1hbGxvYyhhcmdjICogc2l6ZW9mKHp2YWwqKikpOwotICB6ZW5kX2dldF9wYXJhbWV0ZXJzX2FycmF5X2V4KGFyZ2MsIGFyZ3MpOwotCi0gIGlmIChaX1RZUEVfUFAoYXJnc1swXSkgIT0gSVNfT0JKRUNUKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIjFzdCBwYXJhbWV0ZXIgaXMgbm90IGFuIG9iamVjdCAodHJhbnNwb3J0KSIpOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIFJFVFVSTl9OVUxMKCk7Ci0gIH0KLQotICBpZiAoWl9UWVBFX1BQKGFyZ3NbMV0pICE9IElTX1NUUklORykgewotICAgIHBocF9lcnJvcl9kb2NyZWYoTlVMTCBUU1JNTFNfQ0MsIEVfRVJST1IsICIybmQgcGFyYW1ldGVyIGlzIG5vdCBhIHN0cmluZyAobWV0aG9kIG5hbWUpIik7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgUkVUVVJOX05VTEwoKTsKLSAgfQotCi0gIGlmIChaX1RZUEVfUFAoYXJnc1szXSkgIT0gSVNfT0JKRUNUKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIjR0aCBwYXJhbWV0ZXIgaXMgbm90IGFuIG9iamVjdCAocmVxdWVzdCBzdHJ1Y3QpIik7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgUkVUVVJOX05VTEwoKTsKLSAgfQotCi0KICAgdHJ5IHsKLSAgICBQSFBPdXRwdXRUcmFuc3BvcnQgdHJhbnNwb3J0KCphcmdzWzBdKTsKLSAgICB6dmFsICpwcm90b2NvbCA9ICphcmdzWzBdOwotICAgIGNvbnN0IGNoYXIqIG1ldGhvZF9uYW1lID0gWl9TVFJWQUxfUFAoYXJnc1sxXSk7Ci0gICAgY29udmVydF90b19sb25nKCphcmdzWzJdKTsKLSAgICBpbnQzMl90IG1zZ3R5cGUgPSBaX0xWQUxfUFAoYXJnc1syXSk7Ci0gICAgenZhbCogcmVxdWVzdF9zdHJ1Y3QgPSAqYXJnc1szXTsKLSAgICBjb252ZXJ0X3RvX2xvbmcoKmFyZ3NbNF0pOwotICAgIGludDMyX3Qgc2VxSUQgPSBaX0xWQUxfUFAoYXJnc1s0XSk7Ci0gICAgY29udmVydF90b19ib29sZWFuKCphcmdzWzVdKTsKLSAgICBib29sIHN0cmljdFdyaXRlID0gWl9CVkFMX1BQKGFyZ3NbNV0pOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIGFyZ3MgPSBOVUxMOwotICAgIHByb3RvY29sX3dyaXRlTWVzc2FnZUJlZ2luKHByb3RvY29sLCBtZXRob2RfbmFtZSwgbXNndHlwZSwgc2VxSUQpOwotICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KHplbmRfZ2V0X2NsYXNzX2VudHJ5KHJlcXVlc3Rfc3RydWN0IFRTUk1MU19DQyksICJfVFNQRUMiLCA2LCBmYWxzZSBUU1JNTFNfQ0MpOwotICAgIGlmIChaX1RZUEVfUChzcGVjKSAhPSBJU19BUlJBWSkgewotICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBub24tVGhyaWZ0IG9iamVjdCIsIElOVkFMSURfREFUQSk7CisgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoWl9PQkpDRV9QKHJlcXVlc3Rfc3RydWN0KSwgIl9UU1BFQyIsIHNpemVvZigiX1RTUEVDIiktMSwgdHJ1ZSk7CisgICAgaWYgKHNwZWMpIHsKKyAgICAgIFpWQUxfREVSRUYoc3BlYyk7CiAgICAgfQorCisgICAgaWYgKCFzcGVjIHx8IFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7CisgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgc2VyaWFsaXplIGZyb20gbm9uLVRocmlmdCBvYmplY3QiLCBJTlZBTElEX0RBVEEpOworICAgIH0KKworICAgIFBIUE91dHB1dFRyYW5zcG9ydCB0cmFuc3BvcnQocHJvdG9jb2wpOworICAgIHByb3RvY29sX3dyaXRlTWVzc2FnZUJlZ2luKHByb3RvY29sLCBtZXRob2RfbmFtZSwgKGludDMyX3QpIG1zZ3R5cGUsIChpbnQzMl90KSBzZXFJRCk7CiAgICAgYmluYXJ5X3NlcmlhbGl6ZV9zcGVjKHJlcXVlc3Rfc3RydWN0LCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOwogICAgIHRyYW5zcG9ydC5mbHVzaCgpOworCiAgIH0gY2F0Y2ggKGNvbnN0IFBIUEV4Y2VwdGlvbldyYXBwZXImIGV4KSB7Ci0gICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KGV4IFRTUk1MU19DQyk7CisgICAgLy8gZXggd2lsbCBiZSBkZXN0cnVjdGVkLCBzbyBjb3B5IHRvIGEgenZhbCB0aGF0IHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdCBjYW4gdGFrZSBvd25lcnNoaXAgb2YKKyAgICB6dmFsIG15ZXg7CisgICAgWlZBTF9DT1BZKCZteWV4LCBleCk7CisgICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KCZteWV4KTsKICAgICBSRVRVUk5fTlVMTCgpOwogICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZXgpIHsKLSAgICB0aHJvd196ZW5kX2V4Y2VwdGlvbl9mcm9tX3N0ZF9leGNlcHRpb24oZXggVFNSTUxTX0NDKTsKKyAgICB0aHJvd196ZW5kX2V4Y2VwdGlvbl9mcm9tX3N0ZF9leGNlcHRpb24oZXgpOwogICAgIFJFVFVSTl9OVUxMKCk7CiAgIH0KIH0KIAotLy8gMyBwYXJhbXM6ICR0cmFuc3BvcnQgJHJlc3BvbnNlX1R5cGVuYW1lICRzdHJpY3RfcmVhZAorCisvLyA0IHBhcmFtczogJHRyYW5zcG9ydCAkcmVzcG9uc2VfVHlwZW5hbWUgJHN0cmljdF9yZWFkICRidWZmZXJfc2l6ZQogUEhQX0ZVTkNUSU9OKHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSkgewotICBpbnQgYXJnYyA9IFpFTkRfTlVNX0FSR1MoKTsKKyAgenZhbCAqcHJvdG9jb2w7CisgIHplbmRfc3RyaW5nICpvYmpfdHlwZW5hbWU7CisgIHplbmRfYm9vbCBzdHJpY3RfcmVhZDsKKyAgc2l6ZV90IGJ1ZmZlcl9zaXplID0gODE5MjsKIAotICBpZiAoYXJnYyA8IDMpIHsKLSAgICBXUk9OR19QQVJBTV9DT1VOVDsKLSAgfQotCi0gIHp2YWwgKioqYXJncyA9ICh6dmFsKioqKSBlbWFsbG9jKGFyZ2MgKiBzaXplb2YoenZhbCoqKSk7Ci0gIHplbmRfZ2V0X3BhcmFtZXRlcnNfYXJyYXlfZXgoYXJnYywgYXJncyk7Ci0KLSAgaWYgKFpfVFlQRV9QUChhcmdzWzBdKSAhPSBJU19PQkpFQ1QpIHsKLSAgICBwaHBfZXJyb3JfZG9jcmVmKE5VTEwgVFNSTUxTX0NDLCBFX0VSUk9SLCAiMXN0IHBhcmFtZXRlciBpcyBub3QgYW4gb2JqZWN0ICh0cmFuc3BvcnQpIik7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgUkVUVVJOX05VTEwoKTsKLSAgfQotCi0gIGlmIChaX1RZUEVfUFAoYXJnc1sxXSkgIT0gSVNfU1RSSU5HKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIjJuZCBwYXJhbWV0ZXIgaXMgbm90IGEgc3RyaW5nICh0eXBlbmFtZSBvZiBleHBlY3RlZCByZXNwb25zZSBzdHJ1Y3QpIik7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgUkVUVVJOX05VTEwoKTsKKyAgaWYgKHplbmRfcGFyc2VfcGFyYW1ldGVycyhaRU5EX05VTV9BUkdTKCksICJvU2J8bCIsICZwcm90b2NvbCwgJm9ial90eXBlbmFtZSwgJnN0cmljdF9yZWFkLCAmYnVmZmVyX3NpemUpID09IEZBSUxVUkUpIHsKKyAgICByZXR1cm47CiAgIH0KIAogICB0cnkgewotICAgIFBIUElucHV0VHJhbnNwb3J0IHRyYW5zcG9ydCgqYXJnc1swXSk7Ci0gICAgY2hhciogb2JqX3R5cGVuYW1lID0gWl9TVFJWQUxfUFAoYXJnc1sxXSk7Ci0gICAgY29udmVydF90b19ib29sZWFuKCphcmdzWzJdKTsKLSAgICBib29sIHN0cmljdF9yZWFkID0gWl9CVkFMX1BQKGFyZ3NbMl0pOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIGFyZ3MgPSBOVUxMOwotCisgICAgUEhQSW5wdXRUcmFuc3BvcnQgdHJhbnNwb3J0KHByb3RvY29sLCBidWZmZXJfc2l6ZSk7CiAgICAgaW50OF90IG1lc3NhZ2VUeXBlID0gMDsKICAgICBpbnQzMl90IHN6ID0gdHJhbnNwb3J0LnJlYWRJMzIoKTsKIApAQCAtMTA0NywyMyArMTEwNCw2OSBAQAogICAgIH0KIAogICAgIGlmIChtZXNzYWdlVHlwZSA9PSBUX0VYQ0VQVElPTikgewotICAgICAgenZhbCogZXg7Ci0gICAgICBNQUtFX1NURF9aVkFMKGV4KTsKLSAgICAgIGNyZWF0ZU9iamVjdCgiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiwgZXgpOwotICAgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoemVuZF9nZXRfY2xhc3NfZW50cnkoZXggVFNSTUxTX0NDKSwgIl9UU1BFQyIsIDYsIGZhbHNlIFRTUk1MU19DQyk7Ci0gICAgICBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyhleCwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKLSAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgICAgenZhbCBleDsKKyAgICAgIGNyZWF0ZU9iamVjdCgiXFxUaHJpZnRcXEV4Y2VwdGlvblxcVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiwgJmV4KTsKKyAgICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0UoZXgpLCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFBTRUMiKS0xLCBmYWxzZSk7CisgICAgICBaVkFMX0RFUkVGKHNwZWMpOworICAgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgICAgfQorICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMoJmV4LCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOworICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcigmZXgpOwogICAgIH0KIAotICAgIGNyZWF0ZU9iamVjdChvYmpfdHlwZW5hbWUsIHJldHVybl92YWx1ZSk7Ci0gICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoemVuZF9nZXRfY2xhc3NfZW50cnkocmV0dXJuX3ZhbHVlIFRTUk1MU19DQyksICJfVFNQRUMiLCA2LCBmYWxzZSBUU1JNTFNfQ0MpOworICAgIGNyZWF0ZU9iamVjdChaU1RSX1ZBTChvYmpfdHlwZW5hbWUpLCByZXR1cm5fdmFsdWUpOworICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0VfUChyZXR1cm5fdmFsdWUpLCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFNQRUMiKS0xLCB0cnVlKTsKKyAgICBpZiAoc3BlYykgeworICAgICAgWlZBTF9ERVJFRihzcGVjKTsKKyAgICB9CisgICAgaWYgKCFzcGVjIHx8IFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7CisgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgZGVzZXJpYWxpemUgdG8gbm9uLVRocmlmdCBvYmplY3QiLCBJTlZBTElEX0RBVEEpOworICAgIH0KICAgICBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyhyZXR1cm5fdmFsdWUsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7CiAgIH0gY2F0Y2ggKGNvbnN0IFBIUEV4Y2VwdGlvbldyYXBwZXImIGV4KSB7Ci0gICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KGV4IFRTUk1MU19DQyk7CisgICAgLy8gZXggd2lsbCBiZSBkZXN0cnVjdGVkLCBzbyBjb3B5IHRvIGEgenZhbCB0aGF0IHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdCBjYW4gb3duZXJzaGlwIG9mCisgICAgenZhbCBteWV4OworICAgIFpWQUxfQ09QWSgmbXlleCwgZXgpOworICAgIHp2YWxfZHRvcihyZXR1cm5fdmFsdWUpOworICAgIHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdCgmbXlleCk7CiAgICAgUkVUVVJOX05VTEwoKTsKICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGV4KSB7Ci0gICAgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGV4IFRTUk1MU19DQyk7CisgICAgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGV4KTsKICAgICBSRVRVUk5fTlVMTCgpOwogICB9CiB9CiAKKy8vIDQgcGFyYW1zOiAkdHJhbnNwb3J0ICRyZXNwb25zZV9UeXBlbmFtZSAkc3RyaWN0X3JlYWQgJGJ1ZmZlcl9zaXplCitQSFBfRlVOQ1RJT04odGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5X2FmdGVyX21lc3NhZ2VfYmVnaW4pIHsKKyAgenZhbCAqcHJvdG9jb2w7CisgIHplbmRfc3RyaW5nICpvYmpfdHlwZW5hbWU7CisgIHplbmRfYm9vbCBzdHJpY3RfcmVhZDsKKyAgc2l6ZV90IGJ1ZmZlcl9zaXplID0gODE5MjsKKworICBpZiAoemVuZF9wYXJzZV9wYXJhbWV0ZXJzKFpFTkRfTlVNX0FSR1MoKSwgIm9TYnxsIiwgJnByb3RvY29sLCAmb2JqX3R5cGVuYW1lLCAmc3RyaWN0X3JlYWQsICZidWZmZXJfc2l6ZSkgPT0gRkFJTFVSRSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHRyeSB7CisgICAgUEhQSW5wdXRUcmFuc3BvcnQgdHJhbnNwb3J0KHByb3RvY29sLCBidWZmZXJfc2l6ZSk7CisKKyAgICBjcmVhdGVPYmplY3QoWlNUUl9WQUwob2JqX3R5cGVuYW1lKSwgcmV0dXJuX3ZhbHVlKTsKKyAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eShaX09CSkNFX1AocmV0dXJuX3ZhbHVlKSwgIl9UU1BFQyIsIHNpemVvZigiX1RTUEVDIiktMSwgZmFsc2UpOworICAgIFpWQUxfREVSRUYoc3BlYyk7CisgICAgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMocmV0dXJuX3ZhbHVlLCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOworICB9IGNhdGNoIChjb25zdCBQSFBFeGNlcHRpb25XcmFwcGVyJiBleCkgeworICAgIC8vIGV4IHdpbGwgYmUgZGVzdHJ1Y3RlZCwgc28gY29weSB0byBhIHp2YWwgdGhhdCB6ZW5kX3Rocm93X2V4Y2VwdGlvbl9vYmplY3QgY2FuIHRha2Ugb3duZXJzaGlwIG9mCisgICAgenZhbCBteWV4OworICAgIFpWQUxfQ09QWSgmbXlleCwgZXgpOworICAgIHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdCgmbXlleCk7CisgICAgUkVUVVJOX05VTEwoKTsKKyAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGV4KSB7CisgICAgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGV4KTsKKyAgICBSRVRVUk5fTlVMTCgpOworICB9Cit9CisKKyNlbmRpZiAvKiBQSFBfVkVSU0lPTl9JRCA+PSA3MDAwMCAqLwpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmggYi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuaAppbmRleCA0NGQwM2NjLi4wNDIwOTk3IDEwMDY0NAotLS0gYS9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuaAorKysgYi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuaApAQCAtMjEsNiArMjEsNyBAQAogCiBQSFBfRlVOQ1RJT04odGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSk7CiBQSFBfRlVOQ1RJT04odGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5KTsKK1BIUF9GVU5DVElPTih0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnlfYWZ0ZXJfbWVzc2FnZV9iZWdpbik7CiAKIGV4dGVybiB6ZW5kX21vZHVsZV9lbnRyeSB0aHJpZnRfcHJvdG9jb2xfbW9kdWxlX2VudHJ5OwogI2RlZmluZSBwaHBleHRfdGhyaWZ0X3Byb3RvY29sX3B0ciAmdGhyaWZ0X3Byb3RvY29sX21vZHVsZV9lbnRyeQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocCBiL2xpYi9waHAvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YmM3NTAuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDQyOSArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi1pbmNsdWRlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocCc7Ci0KLS8qKgotICogQmluYXJ5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wuCi0gKgotICovCi1jbGFzcyBUQmluYXJ5UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgewotCi0gIGNvbnN0IFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDA7Ci0gIGNvbnN0IFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7Ci0KLSAgcHJvdGVjdGVkICRzdHJpY3RSZWFkXyA9IGZhbHNlOwotICBwcm90ZWN0ZWQgJHN0cmljdFdyaXRlXyA9IHRydWU7Ci0KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucywgJHN0cmljdFJlYWQ9ZmFsc2UsICRzdHJpY3RXcml0ZT10cnVlKSB7Ci0gICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdHJhbnMpOwotICAgICR0aGlzLT5zdHJpY3RSZWFkXyA9ICRzdHJpY3RSZWFkOwotICAgICR0aGlzLT5zdHJpY3RXcml0ZV8gPSAkc3RyaWN0V3JpdGU7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpIHsKLSAgICBpZiAoJHRoaXMtPnN0cmljdFdyaXRlXykgewotICAgICAgJHZlcnNpb24gPSBzZWxmOjpWRVJTSU9OXzEgfCAkdHlwZTsKLSAgICAgIHJldHVybgotICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHZlcnNpb24pICsKLSAgICAgICAgJHRoaXMtPndyaXRlU3RyaW5nKCRuYW1lKSArCi0gICAgICAgICR0aGlzLT53cml0ZUkzMigkc2VxaWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4KLSAgICAgICAgJHRoaXMtPndyaXRlU3RyaW5nKCRuYW1lKSArCi0gICAgICAgICR0aGlzLT53cml0ZUJ5dGUoJHR5cGUpICsKLSAgICAgICAgJHRoaXMtPndyaXRlSTMyKCRzZXFpZCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKSB7Ci0gICAgcmV0dXJuCi0gICAgICAkdGhpcy0+d3JpdGVCeXRlKCRmaWVsZFR5cGUpICsKLSAgICAgICR0aGlzLT53cml0ZUkxNigkZmllbGRJZCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT53cml0ZUJ5dGUoVFR5cGU6OlNUT1ApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkgewotICAgIHJldHVybgotICAgICAgJHRoaXMtPndyaXRlQnl0ZSgka2V5VHlwZSkgKwotICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkdmFsVHlwZSkgKwotICAgICAgJHRoaXMtPndyaXRlSTMyKCRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKSB7Ci0gICAgcmV0dXJuCi0gICAgICAkdGhpcy0+d3JpdGVCeXRlKCRlbGVtVHlwZSkgKwotICAgICAgJHRoaXMtPndyaXRlSTMyKCRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKSB7Ci0gICAgcmV0dXJuCi0gICAgICAkdGhpcy0+d3JpdGVCeXRlKCRlbGVtVHlwZSkgKwotICAgICAgJHRoaXMtPndyaXRlSTMyKCRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSBwYWNrKCdjJywgJHZhbHVlID8gMSA6IDApOwotICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCAxKTsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSBwYWNrKCdjJywgJHZhbHVlKTsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgMSk7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSBwYWNrKCduJywgJHZhbHVlKTsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgMik7Ci0gICAgcmV0dXJuIDI7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSBwYWNrKCdOJywgJHZhbHVlKTsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgNCk7Ci0gICAgcmV0dXJuIDQ7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJHZhbHVlKSB7Ci0gICAgLy8gSWYgd2UgYXJlIG9uIGEgMzJiaXQgYXJjaGl0ZWN0dXJlIHdlIGhhdmUgdG8gZXhwbGljaXRseSBkZWFsIHdpdGgKLSAgICAvLyA2NC1iaXQgdHdvcy1jb21wbGVtZW50IGFyaXRobWV0aWMgc2luY2UgUEhQIHdhbnRzIHRvIHRyZWF0IGFsbCBpbnRzCi0gICAgLy8gYXMgc2lnbmVkIGFuZCBhbnkgaW50IG92ZXIgMl4zMSAtIDEgYXMgYSBmbG9hdAotICAgIGlmIChQSFBfSU5UX1NJWkUgPT0gNCkgewotICAgICAgJG5lZyA9ICR2YWx1ZSA8IDA7Ci0KLSAgICAgIGlmICgkbmVnKSB7Ci0gICAgICAgICR2YWx1ZSAqPSAtMTsKLSAgICAgIH0KLQotICAgICAgJGhpID0gKGludCkoJHZhbHVlIC8gNDI5NDk2NzI5Nik7Ci0gICAgICAkbG8gPSAoaW50KSR2YWx1ZTsKLQotICAgICAgaWYgKCRuZWcpIHsKLSAgICAgICAgJGhpID0gfiRoaTsKLSAgICAgICAgJGxvID0gfiRsbzsKLSAgICAgICAgaWYgKCgkbG8gJiAoaW50KTB4ZmZmZmZmZmYpID09IChpbnQpMHhmZmZmZmZmZikgewotICAgICAgICAgICRsbyA9IDA7Ci0gICAgICAgICAgJGhpKys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgJGxvKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICRkYXRhID0gcGFjaygnTjInLCAkaGksICRsbyk7Ci0KLSAgICB9IGVsc2UgewotICAgICAgJGhpID0gJHZhbHVlID4+IDMyOwotICAgICAgJGxvID0gJHZhbHVlICYgMHhGRkZGRkZGRjsKLSAgICAgICRkYXRhID0gcGFjaygnTjInLCAkaGksICRsbyk7Ci0gICAgfQotCi0gICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDgpOwotICAgIHJldHVybiA4OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCR2YWx1ZSkgewotICAgICRkYXRhID0gcGFjaygnZCcsICR2YWx1ZSk7Ci0gICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc3RycmV2KCRkYXRhKSwgOCk7Ci0gICAgcmV0dXJuIDg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHZhbHVlKSB7Ci0gICAgJGxlbiA9IHN0cmxlbigkdmFsdWUpOwotICAgICRyZXN1bHQgPSAkdGhpcy0+d3JpdGVJMzIoJGxlbik7Ci0gICAgaWYgKCRsZW4pIHsKLSAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCR2YWx1ZSwgJGxlbik7Ci0gICAgfQotICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKSB7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkSTMyKCRzeik7Ci0gICAgaWYgKCRzeiA8IDApIHsKLSAgICAgICR2ZXJzaW9uID0gKGludCkgKCRzeiAmIHNlbGY6OlZFUlNJT05fTUFTSyk7Ci0gICAgICBpZiAoJHZlcnNpb24gIT0gKGludCkgc2VsZjo6VkVSU0lPTl8xKSB7Ci0gICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0JhZCB2ZXJzaW9uIGlkZW50aWZpZXI6ICcuJHN6LCBUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OKTsKLSAgICAgIH0KLSAgICAgICR0eXBlID0gJHN6ICYgMHgwMDAwMDBmZjsKLSAgICAgICRyZXN1bHQgKz0KLSAgICAgICAgJHRoaXMtPnJlYWRTdHJpbmcoJG5hbWUpICsKLSAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNlcWlkKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKCR0aGlzLT5zdHJpY3RSZWFkXykgewotICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdObyB2ZXJzaW9uIGlkZW50aWZpZXIsIG9sZCBwcm90b2NvbCBjbGllbnQ/JywgVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBIYW5kbGUgcHJlLXZlcnNpb25lZCBpbnB1dAotICAgICAgICAkbmFtZSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoJHN6KTsKLSAgICAgICAgJHJlc3VsdCArPQotICAgICAgICAgICRzeiArCi0gICAgICAgICAgJHRoaXMtPnJlYWRCeXRlKCR0eXBlKSArCi0gICAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNlcWlkKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICRyZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCYkbmFtZSkgewotICAgICRuYW1lID0gJyc7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpIHsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRCeXRlKCRmaWVsZFR5cGUpOwotICAgIGlmICgkZmllbGRUeXBlID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAkZmllbGRJZCA9IDA7Ci0gICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICB9Ci0gICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZEkxNigkZmllbGRJZCk7Ci0gICAgcmV0dXJuICRyZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigmJGtleVR5cGUsICYkdmFsVHlwZSwgJiRzaXplKSB7Ci0gICAgcmV0dXJuCi0gICAgICAkdGhpcy0+cmVhZEJ5dGUoJGtleVR5cGUpICsKLSAgICAgICR0aGlzLT5yZWFkQnl0ZSgkdmFsVHlwZSkgKwotICAgICAgJHRoaXMtPnJlYWRJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBFbmQoKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT5yZWFkQnl0ZSgkZWxlbVR5cGUpICsKLSAgICAgICR0aGlzLT5yZWFkSTMyKCRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKSB7Ci0gICAgcmV0dXJuCi0gICAgICAkdGhpcy0+cmVhZEJ5dGUoJGVsZW1UeXBlKSArCi0gICAgICAkdGhpcy0+cmVhZEkzMigkc2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDEpOwotICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7Ci0gICAgJHZhbHVlID0gJGFyclsxXSA9PSAxOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkdmFsdWUpIHsKLSAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7Ci0gICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKLSAgICAkdmFsdWUgPSAkYXJyWzFdOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoJiR2YWx1ZSkgewotICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgyKTsKLSAgICAkYXJyID0gdW5wYWNrKCduJywgJGRhdGEpOwotICAgICR2YWx1ZSA9ICRhcnJbMV07Ci0gICAgaWYgKCR2YWx1ZSA+IDB4N2ZmZikgewotICAgICAgJHZhbHVlID0gMCAtICgoJHZhbHVlIC0gMSkgXiAweGZmZmYpOwotICAgIH0KLSAgICByZXR1cm4gMjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCYkdmFsdWUpIHsKLSAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoNCk7Ci0gICAgJGFyciA9IHVucGFjaygnTicsICRkYXRhKTsKLSAgICAkdmFsdWUgPSAkYXJyWzFdOwotICAgIGlmICgkdmFsdWUgPiAweDdmZmZmZmZmKSB7Ci0gICAgICAkdmFsdWUgPSAwIC0gKCgkdmFsdWUgLSAxKSBeIDB4ZmZmZmZmZmYpOwotICAgIH0KLSAgICByZXR1cm4gNDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCYkdmFsdWUpIHsKLSAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoOCk7Ci0KLSAgICAkYXJyID0gdW5wYWNrKCdOMicsICRkYXRhKTsKLQotICAgIC8vIElmIHdlIGFyZSBvbiBhIDMyYml0IGFyY2hpdGVjdHVyZSB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgZGVhbCB3aXRoCi0gICAgLy8gNjQtYml0IHR3b3MtY29tcGxlbWVudCBhcml0aG1ldGljIHNpbmNlIFBIUCB3YW50cyB0byB0cmVhdCBhbGwgaW50cwotICAgIC8vIGFzIHNpZ25lZCBhbmQgYW55IGludCBvdmVyIDJeMzEgLSAxIGFzIGEgZmxvYXQKLSAgICBpZiAoUEhQX0lOVF9TSVpFID09IDQpIHsKLQotICAgICAgJGhpID0gJGFyclsxXTsKLSAgICAgICRsbyA9ICRhcnJbMl07Ci0gICAgICAkaXNOZWcgPSAkaGkgIDwgMDsKLQotICAgICAgLy8gQ2hlY2sgZm9yIGEgbmVnYXRpdmUKLSAgICAgIGlmICgkaXNOZWcpIHsKLSAgICAgICAgJGhpID0gfiRoaSAmIChpbnQpMHhmZmZmZmZmZjsKLSAgICAgICAgJGxvID0gfiRsbyAmIChpbnQpMHhmZmZmZmZmZjsKLQotICAgICAgICBpZiAoJGxvID09IChpbnQpMHhmZmZmZmZmZikgewotICAgICAgICAgICRoaSsrOwotICAgICAgICAgICRsbyA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgJGxvKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gRm9yY2UgMzJiaXQgd29yZHMgaW4gZXhjZXNzIG9mIDJHIHRvIHBlIHBvc2l0aXZlIC0gd2UgZGVhbCB3aWdoIHNpZ24KLSAgICAgIC8vIGV4cGxpY2l0bHkgYmVsb3cKLQotICAgICAgaWYgKCRoaSAmIChpbnQpMHg4MDAwMDAwMCkgewotICAgICAgICAkaGkgJj0gKGludCkweDdmZmZmZmZmOwotICAgICAgICAkaGkgKz0gMHg4MDAwMDAwMDsKLSAgICAgIH0KLQotICAgICAgaWYgKCRsbyAmIChpbnQpMHg4MDAwMDAwMCkgewotICAgICAgICAkbG8gJj0gKGludCkweDdmZmZmZmZmOwotICAgICAgICAkbG8gKz0gMHg4MDAwMDAwMDsKLSAgICAgIH0KLQotICAgICAgJHZhbHVlID0gJGhpICogNDI5NDk2NzI5NiArICRsbzsKLQotICAgICAgaWYgKCRpc05lZykgewotICAgICAgICAkdmFsdWUgPSAwIC0gJHZhbHVlOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0KLSAgICAgIC8vIFVwY2FzdCBuZWdhdGl2ZXMgaW4gTFNCIGJpdAotICAgICAgaWYgKCRhcnJbMl0gJiAweDgwMDAwMDAwKSB7Ci0gICAgICAgICRhcnJbMl0gPSAkYXJyWzJdICYgMHhmZmZmZmZmZjsKLSAgICAgIH0KLQotICAgICAgLy8gQ2hlY2sgZm9yIGEgbmVnYXRpdmUKLSAgICAgIGlmICgkYXJyWzFdICYgMHg4MDAwMDAwMCkgewotICAgICAgICAkYXJyWzFdID0gJGFyclsxXSAmIDB4ZmZmZmZmZmY7Ci0gICAgICAgICRhcnJbMV0gPSAkYXJyWzFdIF4gMHhmZmZmZmZmZjsKLSAgICAgICAgJGFyclsyXSA9ICRhcnJbMl0gXiAweGZmZmZmZmZmOwotICAgICAgICAkdmFsdWUgPSAwIC0gJGFyclsxXSo0Mjk0OTY3Mjk2IC0gJGFyclsyXSAtIDE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkdmFsdWUgPSAkYXJyWzFdKjQyOTQ5NjcyOTYgKyAkYXJyWzJdOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiA4OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoJiR2YWx1ZSkgewotICAgICRkYXRhID0gc3RycmV2KCR0aGlzLT50cmFuc18tPnJlYWRBbGwoOCkpOwotICAgICRhcnIgPSB1bnBhY2soJ2QnLCAkZGF0YSk7Ci0gICAgJHZhbHVlID0gJGFyclsxXTsKLSAgICByZXR1cm4gODsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nKCYkdmFsdWUpIHsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRJMzIoJGxlbik7Ci0gICAgaWYgKCRsZW4pIHsKLSAgICAgICR2YWx1ZSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoJGxlbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR2YWx1ZSA9ICcnOwotICAgIH0KLSAgICByZXR1cm4gJHJlc3VsdCArICRsZW47Ci0gIH0KLX0KLQotLyoqCi0gKiBCaW5hcnkgUHJvdG9jb2wgRmFjdG9yeQotICovCi1jbGFzcyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7Ci0gIHByaXZhdGUgJHN0cmljdFJlYWRfID0gZmFsc2U7Ci0gIHByaXZhdGUgJHN0cmljdFdyaXRlXyA9IGZhbHNlOwotCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkc3RyaWN0UmVhZD1mYWxzZSwgJHN0cmljdFdyaXRlPWZhbHNlKSB7Ci0gICAgJHRoaXMtPnN0cmljdFJlYWRfID0gJHN0cmljdFJlYWQ7Ci0gICAgJHRoaXMtPnN0cmljdFdyaXRlXyA9ICRzdHJpY3RXcml0ZTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCgkdHJhbnMpIHsKLSAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnMsICR0aGlzLT5zdHJpY3RSZWFkXywgJHRoaXMtPnN0cmljdFdyaXRlXyk7Ci0gIH0KLX0KLQotLyoqCi0gKiBBY2NlbGVyYXRlZCBiaW5hcnkgcHJvdG9jb2w6IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgdGhyaWZ0X3Byb3RvY29sCi0gKiBleHRlbnNpb24gZm9yIGZhc3RlciBkZXNlcmlhbGl6YXRpb24KLSAqLwotY2xhc3MgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgZXh0ZW5kcyBUQmluYXJ5UHJvdG9jb2wgewotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zLCAkc3RyaWN0UmVhZD1mYWxzZSwgJHN0cmljdFdyaXRlPXRydWUpIHsKLSAgICAvLyBJZiB0aGUgdHJhbnNwb3J0IGRvZXNuJ3QgaW1wbGVtZW50IHB1dEJhY2ssIHdyYXAgaXQgaW4gYQotICAgIC8vIFRCdWZmZXJlZFRyYW5zcG9ydCAod2hpY2ggZG9lcykKLSAgICBpZiAoIW1ldGhvZF9leGlzdHMoJHRyYW5zLCAncHV0QmFjaycpKSB7Ci0gICAgICAkdHJhbnMgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCR0cmFucyk7Ci0gICAgfQotICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHRyYW5zLCAkc3RyaWN0UmVhZCwgJHN0cmljdFdyaXRlKTsKLSAgfQotICBwdWJsaWMgZnVuY3Rpb24gaXNTdHJpY3RSZWFkKCkgewotICAgIHJldHVybiAkdGhpcy0+c3RyaWN0UmVhZF87Ci0gIH0KLSAgcHVibGljIGZ1bmN0aW9uIGlzU3RyaWN0V3JpdGUoKSB7Ci0gICAgcmV0dXJuICR0aGlzLT5zdHJpY3RXcml0ZV87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL3Byb3RvY29sL1RCaW5hcnlTZXJpYWxpemVyLnBocCBiL2xpYi9waHAvc3JjL3Byb3RvY29sL1RCaW5hcnlTZXJpYWxpemVyLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkxM2QzMi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3NyYy9wcm90b2NvbC9UQmluYXJ5U2VyaWFsaXplci5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqIEBhdXRob3I6IHJtYXJpbiAobWFyaW4ucmFkdUBmYWNlYm9vay5jb20pCi0gKi8KLQotcmVxdWlyZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwJzsKLXJlcXVpcmVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAnOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHNlcmlhbGl6aW5nIGFuZCBkZXNlcmlhbGl6aW5nCi0gKiBhIHRocmlmdCBvYmplY3QgdXNpbmcgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQuCi0gKi8KLWNsYXNzIFRCaW5hcnlTZXJpYWxpemVyIHsKLQotICAvLyBOT1RFKHJtYXJpbik6IEJlY2F1c2UgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeQotICAvLyBhZGRzIGEgYmVnaW4gbWVzc2FnZSBwcmVmaXgsIHlvdSBjYW5ub3Qgc3BlY2lmeQotICAvLyBhIHRyYW5zcG9ydCBpbiB3aGljaCB0byBzZXJpYWxpemUgYW4gb2JqZWN0LiBJdCBoYXMgdG8KLSAgLy8gYmUgYSBzdHJpbmcuIE90aGVyd2lzZSB3ZSB3aWxsIGJyZWFrIHRoZSBjb21wYXRpYmlsaXR5IHdpdGgKLSAgLy8gbm9ybWFsIGRlc2VyaWFsaXphdGlvbi4KLSAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXJpYWxpemUoJG9iamVjdCkgewotICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOwotICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCgkdHJhbnNwb3J0KTsKLSAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5JykpIHsKLSAgICAgIHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkoJHByb3RvY29sLCAkb2JqZWN0LT5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6UkVQTFksICRvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICRwcm90b2NvbC0+aXNTdHJpY3RXcml0ZSgpKTsKLQotICAgICAgJHByb3RvY29sLT5yZWFkTWVzc2FnZUJlZ2luKCR1bnVzZWRfbmFtZSwgJHVudXNlZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1bnVzZWRfc2VxaWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAkb2JqZWN0LT53cml0ZSgkcHJvdG9jb2wpOwotICAgIH0KLSAgICByZXR1cm4gJHRyYW5zcG9ydC0+Z2V0QnVmZmVyKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRlc2VyaWFsaXplKCRzdHJpbmdfb2JqZWN0LCAkY2xhc3NfbmFtZSkgewotICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKLSAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKCR0cmFuc3BvcnQpOwotICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnknKSkgewotICAgICAgICRwcm90b2NvbC0+d3JpdGVNZXNzYWdlQmVnaW4oJycsIFRNZXNzYWdlVHlwZTo6UkVQTFksIDApOwotICAgICAgICR0cmFuc3BvcnQtPndyaXRlKCRzdHJpbmdfb2JqZWN0KTsKLSAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5KCRwcm90b2NvbCwgJGNsYXNzX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJvdG9jb2wtPmlzU3RyaWN0UmVhZCgpKTsKLSAgICAgfSBlbHNlIHsKLSAgICAgICAkdHJhbnNwb3J0LT53cml0ZSgkc3RyaW5nX29iamVjdCk7Ci0gICAgICAgJG9iamVjdCA9IG5ldyAkY2xhc3NfbmFtZSgpOwotICAgICAgICRvYmplY3QtPnJlYWQoJHByb3RvY29sKTsKLSAgICAgICByZXR1cm4gJG9iamVjdDsKLSAgICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnBocCBiL2xpYi9waHAvc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWNiZDA5Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNjc4ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLWluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwJzsKLQotLyoqCi0gKiBDb21wYWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wuCi0gKgotICovCi1jbGFzcyBUQ29tcGFjdFByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sIHsKLQotICBjb25zdCBDT01QQUNUX1NUT1AgPSAweDAwOwotICBjb25zdCBDT01QQUNUX1RSVUUgPSAweDAxOwotICBjb25zdCBDT01QQUNUX0ZBTFNFID0gMHgwMjsKLSAgY29uc3QgQ09NUEFDVF9CWVRFID0gMHgwMzsKLSAgY29uc3QgQ09NUEFDVF9JMTYgPSAweDA0OwotICBjb25zdCBDT01QQUNUX0kzMiA9IDB4MDU7Ci0gIGNvbnN0IENPTVBBQ1RfSTY0ID0gMHgwNjsKLSAgY29uc3QgQ09NUEFDVF9ET1VCTEUgPSAweDA3OwotICBjb25zdCBDT01QQUNUX0JJTkFSWSA9IDB4MDg7Ci0gIGNvbnN0IENPTVBBQ1RfTElTVCA9IDB4MDk7Ci0gIGNvbnN0IENPTVBBQ1RfU0VUID0gMHgwQTsKLSAgY29uc3QgQ09NUEFDVF9NQVAgPSAweDBCOwotICBjb25zdCBDT01QQUNUX1NUUlVDVCA9IDB4MEM7Ci0KLSAgY29uc3QgU1RBVEVfQ0xFQVIgPSAwOwotICBjb25zdCBTVEFURV9GSUVMRF9XUklURSA9IDE7Ci0gIGNvbnN0IFNUQVRFX1ZBTFVFX1dSSVRFID0gMjsKLSAgY29uc3QgU1RBVEVfQ09OVEFJTkVSX1dSSVRFID0gMzsKLSAgY29uc3QgU1RBVEVfQk9PTF9XUklURSA9IDQ7Ci0gIGNvbnN0IFNUQVRFX0ZJRUxEX1JFQUQgPSA1OwotICBjb25zdCBTVEFURV9DT05UQUlORVJfUkVBRCA9IDY7Ci0gIGNvbnN0IFNUQVRFX1ZBTFVFX1JFQUQgPSA3OwotICBjb25zdCBTVEFURV9CT09MX1JFQUQgPSA4OwotCi0gIGNvbnN0IFZFUlNJT05fTUFTSyA9IDB4MWY7Ci0gIGNvbnN0IFZFUlNJT04gPSAxOwotICBjb25zdCBQUk9UT0NPTF9JRCA9IDB4ODI7Ci0gIGNvbnN0IFRZUEVfTUFTSyA9IDB4ZTA7Ci0gIGNvbnN0IFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKLQotICBwcm90ZWN0ZWQgc3RhdGljICRjdHlwZXMgPSBhcnJheSgKLSAgICBUVHlwZTo6U1RPUCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NUT1AsCi0gICAgVFR5cGU6OkJPT0wgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9UUlVFLCAvLyB1c2VkIGZvciBjb2xsZWN0aW9uCi0gICAgVFR5cGU6OkJZVEUgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CWVRFLAotICAgIFRUeXBlOjpJMTYgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMTYsCi0gICAgVFR5cGU6OkkzMiA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0kzMiwKLSAgICBUVHlwZTo6STY0ID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfSTY0LAotICAgIFRUeXBlOjpET1VCTEUgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9ET1VCTEUsCi0gICAgVFR5cGU6OlNUUklORyA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0JJTkFSWSwKLSAgICBUVHlwZTo6U1RSVUNUID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU1RSVUNULAotICAgIFRUeXBlOjpMU1QgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9MSVNULAotICAgIFRUeXBlOjpTRVQgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TRVQsCi0gICAgVFR5cGU6Ok1BUCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX01BUCwKLSAgKTsKLQotICBwcm90ZWN0ZWQgc3RhdGljICR0dHlwZXMgPSBhcnJheSgKLSAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NUT1AgPT4gVFR5cGU6OlNUT1AgLAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfVFJVRSA9PiBUVHlwZTo6Qk9PTCwgLy8gdXNlZCBmb3IgY29sbGVjdGlvbgotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfRkFMU0UgPT4gVFR5cGU6OkJPT0wsCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CWVRFID0+IFRUeXBlOjpCWVRFLAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfSTE2ID0+IFRUeXBlOjpJMTYsCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMzIgPT4gVFR5cGU6OkkzMiwKLSAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0k2NCA9PiBUVHlwZTo6STY0LAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfRE9VQkxFID0+IFRUeXBlOjpET1VCTEUsCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CSU5BUlkgPT4gVFR5cGU6OlNUUklORywKLSAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NUUlVDVCA9PiBUVHlwZTo6U1RSVUNULAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfTElTVCA9PiBUVHlwZTo6TFNULAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU0VUID0+IFRUeXBlOjpTRVQsCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9NQVAgPT4gVFR5cGU6Ok1BUCwKLSAgKTsKLQotICBwcm90ZWN0ZWQgJHN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQ0xFQVI7Ci0gIHByb3RlY3RlZCAkbGFzdEZpZCA9IDA7Ci0gIHByb3RlY3RlZCAkYm9vbEZpZCA9IG51bGw7Ci0gIHByb3RlY3RlZCAkYm9vbFZhbHVlID0gbnVsbDsKLSAgcHJvdGVjdGVkICRzdHJ1Y3RzID0gYXJyYXkoKTsKLSAgcHJvdGVjdGVkICRjb250YWluZXJzID0gYXJyYXkoKTsKLQotICAvLyBTb21lIHZhcmludCAvIHppZ3phZyBoZWxwZXIgbWV0aG9kcwotICBwdWJsaWMgZnVuY3Rpb24gdG9aaWdaYWcoJG4sICRiaXRzKSB7Ci0gICAgcmV0dXJuICgkbiA8PCAxKSBeICgkbiA+PiAoJGJpdHMgLSAxKSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gZnJvbVppZ1phZygkbikgewotICAgIHJldHVybiAoJG4gPj4gMSkgXiAtKCRuICYgMSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFyaW50KCRkYXRhKSB7Ci0gICAgJG91dCA9ICIiOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBpZiAoKCRkYXRhICYgfjB4N2YpID09PSAwKSB7Ci0gICAgICAgICRvdXQgLj0gY2hyKCRkYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkb3V0IC49IGNocigoJGRhdGEgJiAweGZmKSB8IDB4ODApOwotICAgICAgICAkZGF0YSA9ICRkYXRhID4+IDc7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAkb3V0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlVmFyaW50KCRkYXRhKSB7Ci0gICAgJG91dCA9ICR0aGlzLT5nZXRWYXJpbnQoJGRhdGEpOwotICAgICRyZXN1bHQgPSBzdHJsZW4oJG91dCk7Ci0gICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJG91dCwgJHJlc3VsdCk7Ci0gICAgcmV0dXJuICRyZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFZhcmludCgmJHJlc3VsdCkgewotICAgICRpZHggPSAwOwotICAgICRzaGlmdCA9IDA7Ci0gICAgJHJlc3VsdCA9IDA7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICR4ID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKLSAgICAgICRhcnIgPSB1bnBhY2soJ0MnLCAkeCk7Ci0gICAgICAkYnl0ZSA9ICRhcnJbMV07Ci0gICAgICAkaWR4ICs9IDE7Ci0gICAgICAkcmVzdWx0IHw9ICgkYnl0ZSAmIDB4N2YpIDw8ICRzaGlmdDsKLSAgICAgIGlmICgoJGJ5dGUgPj4gNykgPT09IDApIHsKLSAgICAgICAgcmV0dXJuICRpZHg7Ci0gICAgICB9Ci0gICAgICAkc2hpZnQgKz0gNzsKLSAgICB9Ci0KLSAgICByZXR1cm4gJGlkeDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMpIHsKLSAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucyk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpIHsKLSAgICAkd3JpdHRlbiA9Ci0gICAgICAkdGhpcy0+d3JpdGVVQnl0ZShUQ29tcGFjdFByb3RvY29sOjpQUk9UT0NPTF9JRCkgKwotICAgICAgJHRoaXMtPndyaXRlVUJ5dGUoVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTiB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoJHR5cGUgPDwgVENvbXBhY3RQcm90b2NvbDo6VFlQRV9TSElGVF9BTU9VTlQpKSArCi0gICAgICAkdGhpcy0+d3JpdGVWYXJpbnQoJHNlcWlkKSArCi0gICAgICAkdGhpcy0+d3JpdGVTdHJpbmcoJG5hbWUpOwotICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX1ZBTFVFX1dSSVRFOwotICAgIHJldHVybiAkd3JpdHRlbjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKSB7Ci0gICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQ0xFQVI7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSkgewotICAgICR0aGlzLT5zdHJ1Y3RzW10gPSBhcnJheSgkdGhpcy0+c3RhdGUsICR0aGlzLT5sYXN0RmlkKTsKLSAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9GSUVMRF9XUklURTsKLSAgICAkdGhpcy0+bGFzdEZpZCA9IDA7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKSB7Ci0gICAgJG9sZF92YWx1ZXMgPSBhcnJheV9wb3AoJHRoaXMtPnN0cnVjdHMpOwotICAgICR0aGlzLT5zdGF0ZSA9ICRvbGRfdmFsdWVzWzBdOwotICAgICR0aGlzLT5sYXN0RmlkID0gJG9sZF92YWx1ZXNbMV07Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKSB7Ci0gICAgcmV0dXJuICR0aGlzLT53cml0ZUJ5dGUoMCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEhlYWRlcigkdHlwZSwgJGZpZCkgewotICAgICR3cml0dGVuID0gMDsKLSAgICAkZGVsdGEgPSAkZmlkIC0gJHRoaXMtPmxhc3RGaWQ7Ci0gICAgaWYgKDAgPCAkZGVsdGEgJiYgJGRlbHRhIDw9IDE1KSB7Ci0gICAgICAkd3JpdHRlbiA9ICR0aGlzLT53cml0ZVVCeXRlKCgkZGVsdGEgPDwgNCkgfCAkdHlwZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlQnl0ZSgkdHlwZSkgKwotICAgICAgICAkdGhpcy0+d3JpdGVJMTYoJGZpZCk7Ci0gICAgfQotICAgICR0aGlzLT5sYXN0RmlkID0gJGZpZDsKLSAgICByZXR1cm4gJHdyaXR0ZW47Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZF9uYW1lLCAkZmllbGRfdHlwZSwgJGZpZWxkX2lkKSB7Ci0gICAgaWYgKCRmaWVsZF90eXBlID09IFRUWVBFOjpCT09MKSB7Ci0gICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1dSSVRFOwotICAgICAgJHRoaXMtPmJvb2xGaWQgPSAkZmllbGRfaWQ7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgewotICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfVkFMVUVfV1JJVEU7Ci0gICAgICByZXR1cm4gJHRoaXMtPndyaXRlRmllbGRIZWFkZXIoc2VsZjo6JGN0eXBlc1skZmllbGRfdHlwZV0sICRmaWVsZF9pZCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKSB7Ci0gICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfRklFTERfV1JJVEU7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVDb2xsZWN0aW9uQmVnaW4oJGV0eXBlLCAkc2l6ZSkgewotICAgICR3cml0dGVuID0gMDsKLSAgICBpZiAoJHNpemUgPD0gMTQpIHsKLSAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlVUJ5dGUoJHNpemUgPDwgNCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjokY3R5cGVzWyRldHlwZV0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAkd3JpdHRlbiA9ICR0aGlzLT53cml0ZVVCeXRlKDB4ZjAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjokY3R5cGVzWyRldHlwZV0pICsKLSAgICAgICAgJHRoaXMtPndyaXRlVmFyaW50KCRzaXplKTsKLSAgICB9Ci0gICAgJHRoaXMtPmNvbnRhaW5lcnNbXSA9ICR0aGlzLT5zdGF0ZTsKLSAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfV1JJVEU7Ci0KLSAgICByZXR1cm4gJHdyaXR0ZW47Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5X3R5cGUsICR2YWxfdHlwZSwgJHNpemUpIHsKLSAgICAkd3JpdHRlbiA9IDA7Ci0gICAgaWYgKCRzaXplID09IDApIHsKLSAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlQnl0ZSgwKTsKLSAgICB9IGVsc2UgewotICAgICAgJHdyaXR0ZW4gPSAkdGhpcy0+d3JpdGVWYXJpbnQoJHNpemUpICsKLSAgICAgICAgJHRoaXMtPndyaXRlVUJ5dGUoc2VsZjo6JGN0eXBlc1ska2V5X3R5cGVdIDw8IDQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjokY3R5cGVzWyR2YWxfdHlwZV0pOwotICAgIH0KLSAgICAkdGhpcy0+Y29udGFpbmVyc1tdID0gJHRoaXMtPnN0YXRlOwotICAgIHJldHVybiAkd3JpdHRlbjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25FbmQoKSB7Ci0gICAgJHRoaXMtPnN0YXRlID0gYXJyYXlfcG9wKCR0aGlzLT5jb250YWluZXJzKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpIHsKLSAgICByZXR1cm4gJHRoaXMtPndyaXRlQ29sbGVjdGlvbkVuZCgpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtX3R5cGUsICRzaXplKSB7Ci0gICAgcmV0dXJuICR0aGlzLT53cml0ZUNvbGxlY3Rpb25CZWdpbigkZWxlbV90eXBlLCAkc2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkgewotICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uRW5kKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbV90eXBlLCAkc2l6ZSkgewotICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uQmVnaW4oJGVsZW1fdHlwZSwgJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkgewotICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uRW5kKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKCR2YWx1ZSkgewotICAgIGlmICgkdGhpcy0+c3RhdGUgPT0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQk9PTF9XUklURSkgewotICAgICAgJGN0eXBlID0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9GQUxTRTsKLSAgICAgIGlmICgkdmFsdWUpIHsKLSAgICAgICAgJGN0eXBlID0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9UUlVFOwotICAgICAgfQotICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUZpZWxkSGVhZGVyKCRjdHlwZSwgJHRoaXMtPmJvb2xGaWQpOwotICAgIH0gZWxzZSBpZiAoJHRoaXMtPnN0YXRlID09IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NPTlRBSU5FUl9XUklURSkgewotICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUJ5dGUoJHZhbHVlID8gMSA6IDApOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdJbnZhbGlkIHN0YXRlIGluIGNvbXBhY3QgcHJvdG9jb2wnKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKCR2YWx1ZSkgewotICAgICRkYXRhID0gcGFjaygnYycsICR2YWx1ZSk7Ci0gICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDEpOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlVUJ5dGUoJGJ5dGUpIHsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShwYWNrKCdDJywgJGJ5dGUpLCAxKTsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkdmFsdWUpIHsKLSAgICAkdGhpbmcgPSAkdGhpcy0+dG9aaWdaYWcoJHZhbHVlLCAxNik7Ci0gICAgcmV0dXJuICR0aGlzLT53cml0ZVZhcmludCgkdGhpbmcpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCR2YWx1ZSkgewotICAgICR0aGluZyA9ICR0aGlzLT50b1ppZ1phZygkdmFsdWUsIDMyKTsKLSAgICByZXR1cm4gJHRoaXMtPndyaXRlVmFyaW50KCR0aGluZyk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSBwYWNrKCdkJywgJHZhbHVlKTsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzdHJyZXYoJGRhdGEpLCA4KTsKLSAgICByZXR1cm4gODsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkdmFsdWUpIHsKLSAgICAkbGVuID0gc3RybGVuKCR2YWx1ZSk7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT53cml0ZVZhcmludCgkbGVuKTsKLSAgICBpZiAoJGxlbikgewotICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJHZhbHVlLCAkbGVuKTsKLSAgICB9Ci0gICAgcmV0dXJuICRyZXN1bHQgKyAkbGVuOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCYkbmFtZSwgJiRmaWVsZF90eXBlLCAmJGZpZWxkX2lkKSB7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVUJ5dGUoJGZpZWxkX3R5cGUpOwotCi0gICAgaWYgKCgkZmllbGRfdHlwZSAmIDB4MGYpID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAkZmllbGRfaWQgPSAwOwotICAgICAgcmV0dXJuICRyZXN1bHQ7Ci0gICAgfQotICAgICRkZWx0YSA9ICRmaWVsZF90eXBlID4+IDQ7Ci0gICAgaWYgKCRkZWx0YSA9PSAwKSB7Ci0gICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkSTE2KCRmaWVsZF9pZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICRmaWVsZF9pZCA9ICR0aGlzLT5sYXN0RmlkICsgJGRlbHRhOwotICAgIH0KLSAgICAkdGhpcy0+bGFzdEZpZCA9ICRmaWVsZF9pZDsKLSAgICAkZmllbGRfdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkZmllbGRfdHlwZSAmIDB4MGYpOwotICAgIGlmICgkZmllbGRfdHlwZSA9PSBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1RSVUUpIHsKLSAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0JPT0xfUkVBRDsKLSAgICAgICR0aGlzLT5ib29sVmFsdWUgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoJGZpZWxkX3R5cGUgPT0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9GQUxTRSkgewotICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQk9PTF9SRUFEOwotICAgICAgJHRoaXMtPmJvb2xWYWx1ZSA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9WQUxVRV9SRUFEOwotICAgIH0KLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKSB7Ci0gICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfRklFTERfUkVBRDsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkVUJ5dGUoJiR2YWx1ZSkgewotICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKLSAgICAkYXJyID0gdW5wYWNrKCdDJywgJGRhdGEpOwotICAgICR2YWx1ZSA9ICRhcnJbMV07Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiR2YWx1ZSkgewotICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKLSAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICR2YWx1ZSA9ICRhcnJbMV07Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFppZ1phZygmJHZhbHVlKSB7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVmFyaW50KCR2YWx1ZSk7Ci0gICAgJHZhbHVlID0gJHRoaXMtPmZyb21aaWdaYWcoJHZhbHVlKTsKLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKSB7Ci0gICAgJHByb3RvSWQgPSAwOwotICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFVCeXRlKCRwcm90b0lkKTsKLSAgICBpZiAoJHByb3RvSWQgIT0gVENvbXBhY3RQcm90b2NvbDo6UFJPVE9DT0xfSUQpIHsKLSAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0JhZCBwcm90b2NvbCBpZCBpbiBUQ29tcGFjdCBtZXNzYWdlJyk7Ci0gICAgfQotICAgICR2ZXJUeXBlID0gMDsKLSAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkVUJ5dGUoJHZlclR5cGUpOwotICAgICR0eXBlID0gKCR2ZXJUeXBlICYgVENvbXBhY3RQcm90b2NvbDo6VFlQRV9NQVNLKSA+PgotICAgICAgVENvbXBhY3RQcm90b2NvbDo6VFlQRV9TSElGVF9BTU9VTlQ7Ci0gICAgJHZlcnNpb24gPSAkdmVyVHlwZSAmIFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT05fTUFTSzsKLSAgICBpZiAoJHZlcnNpb24gIT0gVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTikgewotICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaW4gVENvbXBhY3QgbWVzc2FnZScpOwotICAgIH0KLSAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkVmFyaW50KCRzZXFJZCk7Ci0gICAgJG5hbWUgKz0gJHRoaXMtPnJlYWRTdHJpbmcoJG5hbWUpOwotCi0gICAgcmV0dXJuICRyZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCYkbmFtZSkgewotICAgICRuYW1lID0gJyc7IC8vIHVudXNlZAotICAgICR0aGlzLT5zdHJ1Y3RzW10gPSBhcnJheSgkdGhpcy0+c3RhdGUsICR0aGlzLT5sYXN0RmlkKTsKLSAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9GSUVMRF9SRUFEOwotICAgICR0aGlzLT5sYXN0RmlkID0gMDsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkgewotICAgICRsYXN0ID0gYXJyYXlfcG9wKCR0aGlzLT5zdHJ1Y3RzKTsKLSAgICAkdGhpcy0+c3RhdGUgPSAkbGFzdFswXTsKLSAgICAkdGhpcy0+bGFzdEZpZCA9ICRsYXN0WzFdOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRDb2xsZWN0aW9uQmVnaW4oJiR0eXBlLCAmJHNpemUpIHsKLSAgICAkc2l6ZVR5cGUgPSAwOwotICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFVCeXRlKCRzaXplVHlwZSk7Ci0gICAgJHNpemUgPSAkc2l6ZVR5cGUgPj4gNDsKLSAgICAkdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkc2l6ZVR5cGUpOwotICAgIGlmICgkc2l6ZSA9PSAxNSkgewotICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFZhcmludCgkc2l6ZSk7Ci0gICAgfQotICAgICR0aGlzLT5jb250YWluZXJzW10gPSAkdGhpcy0+c3RhdGU7Ci0gICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQ09OVEFJTkVSX1JFQUQ7Ci0KLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlfdHlwZSwgJiR2YWxfdHlwZSwgJiRzaXplKSB7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVmFyaW50KCRzaXplKTsKLSAgICAkdHlwZXMgPSAwOwotICAgIGlmICgkc2l6ZSA+IDApIHsKLSAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRVQnl0ZSgkdHlwZXMpOwotICAgIH0KLSAgICAkdmFsX3R5cGUgPSAkdGhpcy0+Z2V0VFR5cGUoJHR5cGVzKTsKLSAgICAka2V5X3R5cGUgPSAkdGhpcy0+Z2V0VFR5cGUoJHR5cGVzID4+IDQpOwotICAgICR0aGlzLT5jb250YWluZXJzW10gPSAkdGhpcy0+c3RhdGU7Ci0gICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQ09OVEFJTkVSX1JFQUQ7Ci0KLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkQ29sbGVjdGlvbkVuZCgpIHsKLSAgICAkdGhpcy0+c3RhdGUgPSBhcnJheV9wb3AoJHRoaXMtPmNvbnRhaW5lcnMpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBFbmQoKSB7Ci0gICAgcmV0dXJuICR0aGlzLT5yZWFkQ29sbGVjdGlvbkVuZCgpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oJiRlbGVtX3R5cGUsICYkc2l6ZSkgewotICAgIHJldHVybiAkdGhpcy0+cmVhZENvbGxlY3Rpb25CZWdpbigkZWxlbV90eXBlLCAkc2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKSB7Ci0gICAgcmV0dXJuICR0aGlzLT5yZWFkQ29sbGVjdGlvbkVuZCgpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1fdHlwZSwgJiRzaXplKSB7Ci0gICAgcmV0dXJuICR0aGlzLT5yZWFkQ29sbGVjdGlvbkJlZ2luKCRlbGVtX3R5cGUsICRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkgewotICAgIHJldHVybiAkdGhpcy0+cmVhZENvbGxlY3Rpb25FbmQoKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJHZhbHVlKSB7Ci0gICAgaWYgKCR0aGlzLT5zdGF0ZSA9PSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1JFQUQpIHsKLSAgICAgICR2YWx1ZSA9ICR0aGlzLT5ib29sVmFsdWU7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgaWYgKCR0aGlzLT5zdGF0ZSA9PSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfUkVBRCkgewotICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQnl0ZSgkdmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdJbnZhbGlkIHN0YXRlIGluIGNvbXBhY3QgcHJvdG9jb2wnKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJHZhbHVlKSB7Ci0gICAgcmV0dXJuICR0aGlzLT5yZWFkWmlnWmFnKCR2YWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJHZhbHVlKSB7Ci0gICAgcmV0dXJuICR0aGlzLT5yZWFkWmlnWmFnKCR2YWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSBzdHJyZXYoJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg4KSk7Ci0gICAgJGFyciA9IHVucGFjaygnZCcsICRkYXRhKTsKLSAgICAkdmFsdWUgPSAkYXJyWzFdOwotICAgIHJldHVybiA4OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiR2YWx1ZSkgewotICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFZhcmludCgkbGVuKTsKLSAgICBpZiAoJGxlbikgewotICAgICAgJHZhbHVlID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgkbGVuKTsKLSAgICB9IGVsc2UgewotICAgICAgJHZhbHVlID0gJyc7Ci0gICAgfQotICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBnZXRUVHlwZSgkYnl0ZSkgewotICAgIHJldHVybiBzZWxmOjokdHR5cGVzWyRieXRlICYgMHgwZl07Ci0gIH0KLQotICAvLyBJZiB3ZSBhcmUgb24gYSAzMmJpdCBhcmNoaXRlY3R1cmUgd2UgaGF2ZSB0byBleHBsaWNpdGx5IGRlYWwgd2l0aAotICAvLyA2NC1iaXQgdHdvcy1jb21wbGVtZW50IGFyaXRobWV0aWMgc2luY2UgUEhQIHdhbnRzIHRvIHRyZWF0IGFsbCBpbnRzCi0gIC8vIGFzIHNpZ25lZCBhbmQgYW55IGludCBvdmVyIDJeMzEgLSAxIGFzIGEgZmxvYXQKLQotICAvLyBSZWFkIGFuZCB3cml0ZSBJNjQgYXMgdHdvIDMyIGJpdCBudW1iZXJzICRoaSBhbmQgJGxvCi0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiR2YWx1ZSkgewotICAgIC8vIFJlYWQgdmFyaW50IGZyb20gd2lyZQotICAgICRoaSA9IDA7Ci0gICAgJGxvID0gMDsKLQotICAgICRpZHggPSAwOwotICAgICRzaGlmdCA9IDA7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgJHggPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDEpOwotICAgICAgJGFyciA9IHVucGFjaygnQycsICR4KTsKLSAgICAgICRieXRlID0gJGFyclsxXTsKLSAgICAgICRpZHggKz0gMTsKLSAgICAgIGlmICgkc2hpZnQgPCAzMikgewotICAgICAgICAkbG8gfD0gKCgkYnl0ZSAmIDB4N2YpIDw8ICRzaGlmdCkgJgotICAgICAgICAgIDB4MDAwMDAwMDBmZmZmZmZmZjsKLSAgICAgIH0KLSAgICAgIC8vIFNoaWZ0IGhpIGFuZCBsbyB0b2dldGhlci4KLSAgICAgIGlmICgkc2hpZnQgPj0gMzIpIHsKLSAgICAgICAgJGhpIHw9ICgoJGJ5dGUgJiAweDdmKSA8PCAoJHNoaWZ0IC0gMzIpKTsKLSAgICAgIH0gZWxzZSBpZiAoJHNoaWZ0ID4gMjUpIHsKLSAgICAgICAgJGhpIHw9ICgoJGJ5dGUgJiAweDdmKSA+PiAoJHNoaWZ0IC0gMjUpKTsKLSAgICAgIH0KLSAgICAgIGlmICgoJGJ5dGUgPj4gNykgPT09IDApIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAkc2hpZnQgKz0gNzsKLSAgICB9Ci0KLSAgICAvLyBOb3csIHVuemlnIGl0LgotICAgICR4b3JlciA9IDA7Ci0gICAgaWYgKCRsbyAmIDEpIHsKLSAgICAgICR4b3JlciA9IDB4ZmZmZmZmZmY7Ci0gICAgfQotICAgICRsbyA9ICgkbG8gPj4gMSkgJiAweDdmZmZmZmZmOwotICAgICRsbyA9ICRsbyB8ICgoJGhpICYgMSkgPDwgMzEpOwotICAgICRoaSA9ICgkaGkgPj4gMSkgXiAkeG9yZXI7Ci0gICAgJGxvID0gJGxvIF4gJHhvcmVyOwotCi0gICAgLy8gTm93IHB1dCAkaGkgYW5kICRsbyBiYWNrIHRvZ2V0aGVyCi0gICAgaWYgKHRydWUpIHsKLSAgICAgICRpc05lZyA9ICRoaSAgPCAwOwotCi0gICAgICAvLyBDaGVjayBmb3IgYSBuZWdhdGl2ZQotICAgICAgaWYgKCRpc05lZykgewotICAgICAgICAkaGkgPSB+JGhpICYgKGludCkweGZmZmZmZmZmOwotICAgICAgICAkbG8gPSB+JGxvICYgKGludCkweGZmZmZmZmZmOwotCi0gICAgICAgIGlmICgkbG8gPT0gKGludCkweGZmZmZmZmZmKSB7Ci0gICAgICAgICAgJGhpKys7Ci0gICAgICAgICAgJGxvID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAkbG8rKzsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBGb3JjZSAzMmJpdCB3b3JkcyBpbiBleGNlc3Mgb2YgMkcgdG8gYmUgcG9zaXRpdmUgLSB3ZSBkZWFsIHdpdGggc2lnbgotICAgICAgLy8gZXhwbGljaXRseSBiZWxvdwotCi0gICAgICBpZiAoJGhpICYgKGludCkweDgwMDAwMDAwKSB7Ci0gICAgICAgICRoaSAmPSAoaW50KTB4N2ZmZmZmZmY7Ci0gICAgICAgICRoaSArPSAweDgwMDAwMDAwOwotICAgICAgfQotCi0gICAgICBpZiAoJGxvICYgKGludCkweDgwMDAwMDAwKSB7Ci0gICAgICAgICRsbyAmPSAoaW50KTB4N2ZmZmZmZmY7Ci0gICAgICAgICRsbyArPSAweDgwMDAwMDAwOwotICAgICAgfQotCi0gICAgICAkdmFsdWUgPSAkaGkgKiA0Mjk0OTY3Mjk2ICsgJGxvOwotCi0gICAgICBpZiAoJGlzTmVnKSB7Ci0gICAgICAgICR2YWx1ZSA9IDAgLSAkdmFsdWU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLQotICAgICAgLy8gVXBjYXN0IG5lZ2F0aXZlcyBpbiBMU0IgYml0Ci0gICAgICBpZiAoJGFyclsyXSAmIDB4ODAwMDAwMDApIHsKLSAgICAgICAgJGFyclsyXSA9ICRhcnJbMl0gJiAweGZmZmZmZmZmOwotICAgICAgfQotCi0gICAgICAvLyBDaGVjayBmb3IgYSBuZWdhdGl2ZQotICAgICAgaWYgKCRhcnJbMV0gJiAweDgwMDAwMDAwKSB7Ci0gICAgICAgICRhcnJbMV0gPSAkYXJyWzFdICYgMHhmZmZmZmZmZjsKLSAgICAgICAgJGFyclsxXSA9ICRhcnJbMV0gXiAweGZmZmZmZmZmOwotICAgICAgICAkYXJyWzJdID0gJGFyclsyXSBeIDB4ZmZmZmZmZmY7Ci0gICAgICAgICR2YWx1ZSA9IDAgLSAkYXJyWzFdICogNDI5NDk2NzI5NiAtICRhcnJbMl0gLSAxOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJHZhbHVlID0gJGFyclsxXSAqIDQyOTQ5NjcyOTYgKyAkYXJyWzJdOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAkaWR4OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KCR2YWx1ZSkgewotICAgIC8vIElmIHdlIGFyZSBpbiBhbiBJMzIgcmFuZ2UsIHVzZSB0aGUgZWFzeSBtZXRob2QgYmVsb3cuCi0gICAgaWYgKCgkdmFsdWUgPiA0Mjk0OTY3Mjk2KSB8fCAoJHZhbHVlIDwgLTQyOTQ5NjcyOTYpKSB7Ci0gICAgICAvLyBDb252ZXJ0ICR2YWx1ZSB0byAkaGkgYW5kICRsbwotICAgICAgJG5lZyA9ICR2YWx1ZSA8IDA7Ci0KLSAgICAgIGlmICgkbmVnKSB7Ci0gICAgICAgICR2YWx1ZSAqPSAtMTsKLSAgICAgIH0KLQotICAgICAgJGhpID0gKGludCkkdmFsdWUgPj4gMzI7Ci0gICAgICAkbG8gPSAoaW50KSR2YWx1ZSAmIDB4ZmZmZmZmZmY7Ci0KLSAgICAgIGlmICgkbmVnKSB7Ci0gICAgICAgICRoaSA9IH4kaGk7Ci0gICAgICAgICRsbyA9IH4kbG87Ci0gICAgICAgIGlmICgoJGxvICYgKGludCkweGZmZmZmZmZmKSA9PSAoaW50KTB4ZmZmZmZmZmYpIHsKLSAgICAgICAgICAkbG8gPSAwOwotICAgICAgICAgICRoaSsrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICRsbysrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIE5vdyBkbyB0aGUgemlnZ2luZyBhbmQgemFnZ2luZy4KLSAgICAgICR4b3JlciA9IDA7Ci0gICAgICBpZiAoJG5lZykgewotICAgICAgICAkeG9yZXIgPSAweGZmZmZmZmZmOwotICAgICAgfQotICAgICAgJGxvd2JpdCA9ICgkbG8gPj4gMzEpICYgMTsKLSAgICAgICRoaSA9ICgkaGkgPDwgMSkgfCAkbG93Yml0OwotICAgICAgJGxvID0gKCRsbyA8PCAxKTsKLSAgICAgICRsbyA9ICgkbG8gXiAkeG9yZXIpICYgMHhmZmZmZmZmZjsKLSAgICAgICRoaSA9ICgkaGkgXiAkeG9yZXIpICYgMHhmZmZmZmZmZjsKLQotICAgICAgLy8gbm93IHdyaXRlIG91dCB0aGUgdmFyaW50LCBlbnN1cmluZyB3ZSBzaGlmdCBib3RoIGhpIGFuZCBsbwotICAgICAgJG91dCA9ICIiOwotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaWYgKCgkbG8gJiB+MHg3ZikgPT09IDAgJiYKLSAgICAgICAgICAgJGhpID09PSAwKSB7Ci0gICAgICAgICAgJG91dCAuPSBjaHIoJGxvKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAkb3V0IC49IGNocigoJGxvICYgMHhmZikgfCAweDgwKTsKLSAgICAgICAgICAkbG8gPSAkbG8gPj4gNzsKLSAgICAgICAgICAkbG8gPSAkbG8gfCAoJGhpIDw8IDI1KTsKLSAgICAgICAgICAkaGkgPSAkaGkgPj4gNzsKLSAgICAgICAgICAvLyBSaWdodCBzaGlmdCBjYXJyaWVzIHNpZ24sIGJ1dCB3ZSBkb24ndCB3YW50IGl0IHRvLgotICAgICAgICAgICRoaSA9ICRoaSAmICgxMjcgPDwgMjUpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgICRyZXQgPSBzdHJsZW4oJG91dCk7Ci0gICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkb3V0LCAkcmV0KTsKLQotICAgICAgcmV0dXJuICRyZXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVWYXJpbnQoJHRoaXMtPnRvWmlnWmFnKCR2YWx1ZSwgNjQpKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBDb21wYWN0IFByb3RvY29sIEZhY3RvcnkKLSAqLwotY2xhc3MgVENvbXBjYXRQcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5IHsKLQotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdG9jb2woJHRyYW5zKSB7Ci0gICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sKCR0cmFucyk7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvcHJvdG9jb2wvVFByb3RvY29sLnBocCBiL2xpYi9waHAvc3JjL3Byb3RvY29sL1RQcm90b2NvbC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMWZhY2QuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvcHJvdG9jb2wvVFByb3RvY29sLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi0KLS8qKgotICogUHJvdG9jb2wgbW9kdWxlLiBDb250YWlucyBhbGwgdGhlIHR5cGVzIGFuZCBkZWZpbml0aW9ucyBuZWVkZWQgdG8gaW1wbGVtZW50Ci0gKiBhIHByb3RvY29sIGVuY29kZXIvZGVjb2Rlci4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi0vKioKLSAqIFByb3RvY29sIGV4Y2VwdGlvbnMKLSAqLwotY2xhc3MgVFByb3RvY29sRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7Ci0gIGNvbnN0IFVOS05PV04gPSAwOwotICBjb25zdCBJTlZBTElEX0RBVEEgPSAxOwotICBjb25zdCBORUdBVElWRV9TSVpFID0gMjsKLSAgY29uc3QgU0laRV9MSU1JVCA9IDM7Ci0gIGNvbnN0IEJBRF9WRVJTSU9OID0gNDsKLQotICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZT1udWxsLCAkY29kZT0wKSB7Ci0gICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOwotICB9Ci19Ci0KLS8qKgotICogUHJvdG9jb2wgYmFzZSBjbGFzcyBtb2R1bGUuCi0gKi8KLWFic3RyYWN0IGNsYXNzIFRQcm90b2NvbCB7Ci0gIC8vIFRoZSBiZWxvdyBtYXkgc2VlbSBzaWxseSwgYnV0IGl0IGlzIHRvIGdldCBhcm91bmQgdGhlIHByb2JsZW0gdGhhdCB0aGUKLSAgLy8gImluc3RhbmNlb2YiIG9wZXJhdG9yIGNhbiBvbmx5IHRha2UgaW4gYSBUX1ZBUklBQkxFIGFuZCBub3QgYSBUX1NUUklORwotICAvLyBvciBUX0NPTlNUQU5UX0VOQ0FQU0VEX1NUUklORy4gVXNpbmcgImlzX2EoKSIgaW5zdGVhZCBvZiAiaW5zdGFuY2VvZiIgaXMKLSAgLy8gYSB3b3JrYXJvdW5kIGJ1dCBpcyBkZXByZWNhdGVkIGluIFBIUDUuIFRoaXMgaXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkCi0gIC8vIGRlc2VyaWFsaXphdGlvbiBjb2RlLgotICBzdGF0aWMgJFRCSU5BUllQUk9UT0NPTEFDQ0VMRVJBVEVEID0gJ1RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkJzsKLQotICAvKioKLSAgICogVW5kZXJseWluZyB0cmFuc3BvcnQKLSAgICoKLSAgICogQHZhciBUVHJhbnNwb3J0Ci0gICAqLwotICBwcm90ZWN0ZWQgJHRyYW5zXzsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMpIHsKLSAgICAkdGhpcy0+dHJhbnNfID0gJHRyYW5zOwotICB9Ci0KLSAgLyoqCi0gICAqIEFjY2Vzc29yIGZvciB0cmFuc3BvcnQKLSAgICoKLSAgICogQHJldHVybiBUVHJhbnNwb3J0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KCkgewotICAgIHJldHVybiAkdGhpcy0+dHJhbnNfOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIKLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBGdW5jdGlvbiBuYW1lCi0gICAqIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCi0gICAqIEBwYXJhbSBpbnQgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7Ci0KLSAgLyoqCi0gICAqIENsb3NlIHRoZSBtZXNzYWdlCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCk7Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgICAgICRuYW1lIFN0cnVjdCBuYW1lCi0gICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgotICAgKiBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSk7Ci0KLSAgLyoqCi0gICAqIENsb3NlIGEgc3RydWN0LgotICAgKgotICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKLSAgICogQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCk7Ci0KLSAgLyoKLSAgICogU3RhcnRzIGEgZmllbGQuCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgICAgICRuYW1lIEZpZWxkIG5hbWUKLSAgICogQHBhcmFtIGludCAgICAgICAgJHR5cGUgRmllbGQgdHlwZQotICAgKiBAcGFyYW0gaW50ICAgICAgICAkZmlkICBGaWVsZCBpZAotICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKLSAgICogQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZVNldEVuZCgpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZUJvb2woJGJvb2wpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZUJ5dGUoJGJ5dGUpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZUkxNigkaTE2KTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVJMzIoJGkzMik7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlSTY0KCRpNjQpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZURvdWJsZSgkZHViKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHN0cik7Ci0KLSAgLyoqCi0gICAqIFJlYWRzIHRoZSBtZXNzYWdlIGhlYWRlcgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIEZ1bmN0aW9uIG5hbWUKLSAgICogQHBhcmFtIGludCAkdHlwZSBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKLSAgICogQHBhcmVtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpOwotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBjbG9zZSBvZiBtZXNzYWdlCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCYkbmFtZSk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkVHlwZSwgJiRmaWVsZElkKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigmJGtleVR5cGUsICYkdmFsVHlwZSwgJiRzaXplKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZE1hcEVuZCgpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkU2V0RW5kKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRCb29sKCYkYm9vbCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRCeXRlKCYkYnl0ZSk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRJMTYoJiRpMTYpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkSTMyKCYkaTMyKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZEk2NCgmJGk2NCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWREb3VibGUoJiRkdWIpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkU3RyaW5nKCYkc3RyKTsKLQotICAvKioKLSAgICogVGhlIHNraXAgZnVuY3Rpb24gaXMgYSB1dGlsaXR5IHRvIHBhcnNlIG92ZXIgdW5yZWNvZ25pemVkIGRhdGUgd2l0aG91dAotICAgKiBjYXVzaW5nIGNvcnJ1cHRpb24uCi0gICAqCi0gICAqIEBwYXJhbSBUVHlwZSAkdHlwZSBXaGF0IHR5cGUgaXMgaXQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBza2lwKCR0eXBlKSB7Ci0gICAgc3dpdGNoICgkdHlwZSkgewotICAgIGNhc2UgVFR5cGU6OkJPT0w6Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlYWRCb29sKCRib29sKTsKLSAgICBjYXNlIFRUeXBlOjpCWVRFOgotICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQnl0ZSgkYnl0ZSk7Ci0gICAgY2FzZSBUVHlwZTo6STE2OgotICAgICAgcmV0dXJuICR0aGlzLT5yZWFkSTE2KCRpMTYpOwotICAgIGNhc2UgVFR5cGU6OkkzMjoKLSAgICAgIHJldHVybiAkdGhpcy0+cmVhZEkzMigkaTMyKTsKLSAgICBjYXNlIFRUeXBlOjpJNjQ6Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlYWRJNjQoJGk2NCk7Ci0gICAgY2FzZSBUVHlwZTo6RE9VQkxFOgotICAgICAgcmV0dXJuICR0aGlzLT5yZWFkRG91YmxlKCRkdWIpOwotICAgIGNhc2UgVFR5cGU6OlNUUklORzoKLSAgICAgIHJldHVybiAkdGhpcy0+cmVhZFN0cmluZygkc3RyKTsKLSAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICB7Ci0gICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFN0cnVjdEJlZ2luKCRuYW1lKTsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkRmllbGRCZWdpbigkbmFtZSwgJGZ0eXBlLCAkZmlkKTsKLSAgICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkZnR5cGUpOwotICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRGaWVsZEVuZCgpOwotICAgICAgICB9Ci0gICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRTdHJ1Y3RFbmQoKTsKLSAgICAgICAgcmV0dXJuICRyZXN1bHQ7Ci0gICAgICB9Ci0gICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgewotICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKLSAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKLSAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5za2lwKCRrZXlUeXBlKTsKLSAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5za2lwKCR2YWxUeXBlKTsKLSAgICAgICAgfQotICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkTWFwRW5kKCk7Ci0gICAgICAgIHJldHVybiAkcmVzdWx0OwotICAgICAgfQotICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgIHsKLSAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkZWxlbVR5cGUpOwotICAgICAgICB9Ci0gICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRTZXRFbmQoKTsKLSAgICAgICAgcmV0dXJuICRyZXN1bHQ7Ci0gICAgICB9Ci0gICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgewotICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkZWxlbVR5cGUpOwotICAgICAgICB9Ci0gICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRMaXN0RW5kKCk7Ci0gICAgICAgIHJldHVybiAkcmVzdWx0OwotICAgICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVXRpbGl0eSBmb3Igc2tpcHBpbmcgYmluYXJ5IGRhdGEKLSAgICoKLSAgICogQHBhcmFtIFRUcmFuc3BvcnQgJGl0cmFucyBUVHJhbnNwb3J0IG9iamVjdAotICAgKiBAcGFyYW0gaW50ICAgICAgICAkdHlwZSAgIEZpZWxkIHR5cGUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2tpcEJpbmFyeSgkaXRyYW5zLCAkdHlwZSkgewotICAgIHN3aXRjaCAoJHR5cGUpIHsKLSAgICBjYXNlIFRUeXBlOjpCT09MOgotICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMSk7Ci0gICAgY2FzZSBUVHlwZTo6QllURToKLSAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgIGNhc2UgVFR5cGU6OkkxNjoKLSAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDIpOwotICAgIGNhc2UgVFR5cGU6OkkzMjoKLSAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDQpOwotICAgIGNhc2UgVFR5cGU6Okk2NDoKLSAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDgpOwotICAgIGNhc2UgVFR5cGU6OkRPVUJMRToKLSAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDgpOwotICAgIGNhc2UgVFR5cGU6OlNUUklORzoKLSAgICAgICRsZW4gPSB1bnBhY2soJ04nLCAkaXRyYW5zLT5yZWFkQWxsKDQpKTsKLSAgICAgICRsZW4gPSAkbGVuWzFdOwotICAgICAgaWYgKCRsZW4gPiAweDdmZmZmZmZmKSB7Ci0gICAgICAgICRsZW4gPSAwIC0gKCgkbGVuIC0gMSkgXiAweGZmZmZmZmZmKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiA0ICsgJGl0cmFucy0+cmVhZEFsbCgkbGVuKTsKLSAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICB7Ci0gICAgICAgICRyZXN1bHQgPSAwOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICRmdHlwZSA9IDA7Ci0gICAgICAgICAgJGZpZCA9IDA7Ci0gICAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7Ci0gICAgICAgICAgJGZ0eXBlID0gJGFyclsxXTsKLSAgICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gSTE2IGZpZWxkIGlkCi0gICAgICAgICAgJHJlc3VsdCArPSAkaXRyYW5zLT5yZWFkQWxsKDIpOwotICAgICAgICAgICRyZXN1bHQgKz0gc2VsZjo6c2tpcEJpbmFyeSgkaXRyYW5zLCAkZnR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAkcmVzdWx0OwotICAgICAgfQotICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgIHsKLSAgICAgICAgLy8gS3R5cGUKLSAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICAgICAka3R5cGUgPSAkYXJyWzFdOwotICAgICAgICAvLyBWdHlwZQotICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7Ci0gICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7Ci0gICAgICAgICR2dHlwZSA9ICRhcnJbMV07Ci0gICAgICAgIC8vIFNpemUKLSAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDQpOwotICAgICAgICAkYXJyID0gdW5wYWNrKCdOJywgJGRhdGEpOwotICAgICAgICAkc2l6ZSA9ICRhcnJbMV07Ci0gICAgICAgIGlmICgkc2l6ZSA+IDB4N2ZmZmZmZmYpIHsKLSAgICAgICAgICAkc2l6ZSA9IDAgLSAoKCRzaXplIC0gMSkgXiAweGZmZmZmZmZmKTsKLSAgICAgICAgfQotICAgICAgICAkcmVzdWx0ID0gNjsKLSAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKLSAgICAgICAgICAkcmVzdWx0ICs9IHNlbGY6OnNraXBCaW5hcnkoJGl0cmFucywgJGt0eXBlKTsKLSAgICAgICAgICAkcmVzdWx0ICs9IHNlbGY6OnNraXBCaW5hcnkoJGl0cmFucywgJHZ0eXBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgewotICAgICAgICAvLyBWdHlwZQotICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7Ci0gICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7Ci0gICAgICAgICR2dHlwZSA9ICRhcnJbMV07Ci0gICAgICAgIC8vIFNpemUKLSAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDQpOwotICAgICAgICAkYXJyID0gdW5wYWNrKCdOJywgJGRhdGEpOwotICAgICAgICAkc2l6ZSA9ICRhcnJbMV07Ci0gICAgICAgIGlmICgkc2l6ZSA+IDB4N2ZmZmZmZmYpIHsKLSAgICAgICAgICAkc2l6ZSA9IDAgLSAoKCRzaXplIC0gMSkgXiAweGZmZmZmZmZmKTsKLSAgICAgICAgfQotICAgICAgICAkcmVzdWx0ID0gNTsKLSAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKLSAgICAgICAgICAkcmVzdWx0ICs9IHNlbGY6OnNraXBCaW5hcnkoJGl0cmFucywgJHZ0eXBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogUHJvdG9jb2wgZmFjdG9yeSBjcmVhdGVzIHByb3RvY29sIG9iamVjdHMgZnJvbSB0cmFuc3BvcnRzCi0gKi8KLWludGVyZmFjZSBUUHJvdG9jb2xGYWN0b3J5IHsKLSAgLyoqCi0gICAqIEJ1aWxkIGEgcHJvdG9jb2wgZnJvbSB0aGUgYmFzZSB0cmFuc3BvcnQKLSAgICoKLSAgICogQHJldHVybiBUUHJvdG9jb2wgcHJvdG9jb2wKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCgkdHJhbnMpOwotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvc2VydmVyL1RGb3JraW5nU2VydmVyLnBocCBiL2xpYi9waHAvc3JjL3NlcnZlci9URm9ya2luZ1NlcnZlci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMzcwY2IuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvc2VydmVyL1RGb3JraW5nU2VydmVyLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi08P3BocAotCi1pbmNsdWRlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9zZXJ2ZXIvVFNlcnZlci5waHAnOwotCi0vKioKLSAqIEEgZm9ya2luZyBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBzZXJ2ZXIuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnNlcnZlcgotICovCi1jbGFzcyBURm9ya2luZ1NlcnZlciBleHRlbmRzIFRTZXJ2ZXIgewotICAvKioKLSAgICogRmxhZyBmb3IgdGhlIG1haW4gc2VydmluZyBsb29wCi0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkc3RvcF8gPSBmYWxzZTsKLQotICAvKioKLSAgICogTGlzdCBvZiBjaGlsZHJlbi4KLSAgICoKLSAgICogQHZhciBhcnJheQotICAgKi8KLSAgcHJvdGVjdGVkICRjaGlsZHJlbl8gPSBhcnJheSgpOwotCi0gIC8qKgotICAgKiBMaXN0ZW5zIGZvciBuZXcgY2xpZW50IHVzaW5nIHRoZSBzdXBwbGllZAotICAgKiB0cmFuc3BvcnQuIFdlIGZvcmsgd2hlbiBhIG5ldyBjb25uZWN0aW9uCi0gICAqIGFycml2ZXMuCi0gICAqCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNlcnZlKCkgewotICAgICR0aGlzLT50cmFuc3BvcnRfLT5saXN0ZW4oKTsKLQotICAgIHdoaWxlICghJHRoaXMtPnN0b3BfKSB7Ci0gICAgICB0cnkgewotICAgICAgICAkdHJhbnNwb3J0ID0gJHRoaXMtPnRyYW5zcG9ydF8tPmFjY2VwdCgpOwotCi0gICAgICAgIGlmICgkdHJhbnNwb3J0ICE9IG51bGwpIHsKLSAgICAgICAgICAkcGlkID0gcGNudGxfZm9yaygpOwotCi0gICAgICAgICAgaWYgKCRwaWQgPiAwKSB7Ci0gICAgICAgICAgICAkdGhpcy0+aGFuZGxlUGFyZW50KCR0cmFuc3BvcnQsICRwaWQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICgkcGlkID09PSAwKSB7Ci0gICAgICAgICAgICAkdGhpcy0+aGFuZGxlQ2hpbGQoJHRyYW5zcG9ydCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ0ZhaWxlZCB0byBmb3JrJyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgeyB9Ci0KLSAgICAgICR0aGlzLT5jb2xsZWN0Q2hpbGRyZW4oKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ29kZSBydW4gYnkgdGhlIHBhcmVudAotICAgKgotICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkdHJhbnNwb3J0Ci0gICAqIEBwYXJhbSBpbnQgJHBpZAotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHByaXZhdGUgZnVuY3Rpb24gaGFuZGxlUGFyZW50KFRUcmFuc3BvcnQgJHRyYW5zcG9ydCwgJHBpZCkgewotICAgICR0aGlzLT5jaGlsZHJlbl9bJHBpZF0gPSAkdHJhbnNwb3J0OwotICB9Ci0KLSAgLyoqCi0gICAqIENvZGUgcnVuIGJ5IHRoZSBjaGlsZC4KLSAgICoKLSAgICogQHBhcmFtIFRUcmFuc3BvcnQgJHRyYW5zcG9ydAotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHByaXZhdGUgZnVuY3Rpb24gaGFuZGxlQ2hpbGQoVFRyYW5zcG9ydCAkdHJhbnNwb3J0KSB7Ci0gICAgdHJ5IHsKLSAgICAgICRpbnB1dFRyYW5zcG9ydCA9ICR0aGlzLT5pbnB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoJHRyYW5zcG9ydCk7Ci0gICAgICAkb3V0cHV0VHJhbnNwb3J0ID0gJHRoaXMtPm91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoJHRyYW5zcG9ydCk7Ci0gICAgICAkaW5wdXRQcm90b2NvbCA9ICR0aGlzLT5pbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKCRpbnB1dFRyYW5zcG9ydCk7Ci0gICAgICAkb3V0cHV0UHJvdG9jb2wgPSAkdGhpcy0+b3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woJG91dHB1dFRyYW5zcG9ydCk7Ci0gICAgICB3aGlsZSAoJHRoaXMtPnByb2Nlc3Nvcl8tPnByb2Nlc3MoJGlucHV0UHJvdG9jb2wsICRvdXRwdXRQcm90b2NvbCkpIHsgfQotICAgICAgQCR0cmFuc3BvcnQtPmNsb3NlKCk7Ci0gICAgfQotICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7IH0KLSAgICAKLSAgICBleGl0KDApOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbGxlY3RzIGFueSBjaGlsZHJlbiB3ZSBtYXkgaGF2ZQotICAgKgotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHByaXZhdGUgZnVuY3Rpb24gY29sbGVjdENoaWxkcmVuKCkgewotICAgIGZvcmVhY2ggKCR0aGlzLT5jaGlsZHJlbl8gYXMgJHBpZCA9PiAkdHJhbnNwb3J0KSB7Ci0gICAgICBpZiAocGNudGxfd2FpdHBpZCgkcGlkLCAkc3RhdHVzLCBXTk9IQU5HKSA+IDApIHsKLSAgICAgICAgdW5zZXQoJHRoaXMtPmNoaWxkcmVuX1skcGlkXSk7Ci0gICAgICAgIGlmICgkdHJhbnNwb3J0KSBAJHRyYW5zcG9ydC0+Y2xvc2UoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU3RvcHMgdGhlIHNlcnZlciBydW5uaW5nLiBLaWxscyB0aGUgdHJhbnNwb3J0Ci0gICAqIGFuZCB0aGVuIHN0b3BzIHRoZSBtYWluIHNlcnZpbmcgbG9vcAotICAgKgotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzdG9wKCkgewotICAgICR0aGlzLT50cmFuc3BvcnRfLT5jbG9zZSgpOwotICAgICR0aGlzLT5zdG9wXyA9IHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL3NlcnZlci9UU2VydmVyLnBocCBiL2xpYi9waHAvc3JjL3NlcnZlci9UU2VydmVyLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI1YTllZS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3NyYy9zZXJ2ZXIvVFNlcnZlci5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08P3BocAotCi0vKioKLSAqIEdlbmVyaWMgY2xhc3MgZm9yIGEgVGhyaWZ0IHNlcnZlci4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQuc2VydmVyCi0gKi8KLWFic3RyYWN0IGNsYXNzIFRTZXJ2ZXIgewotCi0gIC8qKgotICAgKiBQcm9jZXNzb3IgdG8gaGFuZGxlIG5ldyBjbGllbnRzCi0gICAqCi0gICAqIEB2YXIgVFByb2Nlc3NvcgotICAgKi8KLSAgcHJvdGVjdGVkICRwcm9jZXNzb3JfOwotCi0gIC8qKgotICAgKiBTZXJ2ZXIgdHJhbnNwb3J0IHRvIGJlIHVzZWQgZm9yIGxpc3RlbmluZwotICAgKiBhbmQgYWNjZXB0aW5nIG5ldyBjbGllbnRzCi0gICAqCi0gICAqIEB2YXIgVFNlcnZlclRyYW5zcG9ydAotICAgKi8KLSAgcHJvdGVjdGVkICR0cmFuc3BvcnRfOwotCi0gIC8qKgotICAgKiBJbnB1dCB0cmFuc3BvcnQgZmFjdG9yeQotICAgKgotICAgKiBAdmFyIFRUcmFuc3BvcnRGYWN0b3J5Ci0gICAqLwotICBwcm90ZWN0ZWQgJGlucHV0VHJhbnNwb3J0RmFjdG9yeV87Ci0KLSAgLyoqCi0gICAqIE91dHB1dCB0cmFuc3BvcnQgZmFjdG9yeQotICAgKgotICAgKiBAdmFyIFRUcmFuc3BvcnRGYWN0b3J5Ci0gICAqLwotICBwcm90ZWN0ZWQgJG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfOwotCi0gIC8qKgotICAgKiBJbnB1dCBwcm90b2NvbCBmYWN0b3J5Ci0gICAqCi0gICAqIEB2YXIgVFByb3RvY29sRmFjdG9yeQotICAgKi8KLSAgcHJvdGVjdGVkICRpbnB1dFByb3RvY29sRmFjdG9yeV87Ci0KLSAgLyoqCi0gICAqIE91dHB1dCBwcm90b2NvbCBmYWN0b3J5Ci0gICAqCi0gICAqIEB2YXIgVFByb3RvY29sRmFjdG9yeQotICAgKi8KLSAgcHJvdGVjdGVkICRvdXRwdXRQcm90b2NvbEZhY3RvcnlfOwotCi0gIC8qKgotICAgKiBTZXRzIHVwIGFsbCB0aGUgZmFjdG9yaWVzLCBldGMKLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCAkcHJvY2Vzc29yCi0gICAqIEBwYXJhbSBUU2VydmVyVHJhbnNwb3J0ICR0cmFuc3BvcnQKLSAgICogQHBhcmFtIFRUcmFuc3BvcnRGYWN0b3J5ICRpbnB1dFRyYW5zcG9ydEZhY3RvcnkKLSAgICogQHBhcmFtIFRUcmFuc3BvcnRGYWN0b3J5ICRvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Ci0gICAqIEBwYXJhbSBUUHJvdG9jb2xGYWN0b3J5ICRpbnB1dFByb3RvY29sRmFjdG9yeQotICAgKiBAcGFyYW0gVFByb3RvY29sRmFjdG9yeSAkb3V0cHV0UHJvdG9jb2xGYWN0b3J5Ci0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0ICR0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSAkaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgJG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5ICRpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgJG91dHB1dFByb3RvY29sRmFjdG9yeSkgewotICAgICR0aGlzLT5wcm9jZXNzb3JfID0gJHByb2Nlc3NvcjsKLSAgICAkdGhpcy0+dHJhbnNwb3J0XyA9ICR0cmFuc3BvcnQ7Ci0gICAgJHRoaXMtPmlucHV0VHJhbnNwb3J0RmFjdG9yeV8gPSAkaW5wdXRUcmFuc3BvcnRGYWN0b3J5OwotICAgICR0aGlzLT5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyA9ICRvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OwotICAgICR0aGlzLT5pbnB1dFByb3RvY29sRmFjdG9yeV8gPSAkaW5wdXRQcm90b2NvbEZhY3Rvcnk7Ci0gICAgJHRoaXMtPm91dHB1dFByb3RvY29sRmFjdG9yeV8gPSAkb3V0cHV0UHJvdG9jb2xGYWN0b3J5OwotICB9Ci0KLSAgLyoqCi0gICAqIFNlcnZlcyB0aGUgc2VydmVyLiBUaGlzIHNob3VsZCBuZXZlciByZXR1cm4KLSAgICogdW5sZXNzIGEgcHJvYmxlbSBwZXJtaXRzIGl0IHRvIGRvIHNvIG9yIGl0Ci0gICAqIGlzIGludGVycnVwdGVkIGludGVudGlvbmFsbHkKLSAgICoKLSAgICogQGFic3RyYWN0Ci0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHNlcnZlKCk7Ci0KLSAgLyoqCi0gICAqIFN0b3BzIHRoZSBzZXJ2ZXIgc2VydmluZwotICAgKgotICAgKiBAYWJzdHJhY3QKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gc3RvcCgpOwotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvc2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwIGIvbGliL3BocC9zcmMvc2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2QwYTMyLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvc3JjL3NlcnZlci9UU2ltcGxlU2VydmVyLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/cGhwCi0KLWluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3NlcnZlci9UU2VydmVyLnBocCc7Ci0KLS8qKgotICogU2ltcGxlIGltcGxlbXRhdGlvbiBvZiBhIFRocmlmdCBzZXJ2ZXIuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnNlcnZlcgotICovCi1jbGFzcyBUU2ltcGxlU2VydmVyIGV4dGVuZHMgVFNlcnZlciB7Ci0gIC8qKgotICAgKiBGbGFnIGZvciB0aGUgbWFpbiBzZXJ2aW5nIGxvb3AKLSAgICoKLSAgICogQHZhciBib29sCi0gICAqLwotICBwcml2YXRlICRzdG9wXyA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBMaXN0ZW5zIGZvciBuZXcgY2xpZW50IHVzaW5nIHRoZSBzdXBwbGllZAotICAgKiB0cmFuc3BvcnQuIEl0IGhhbmRsZXMgVFRyYW5zcG9ydEV4Y2VwdGlvbnMKLSAgICogdG8gYXZvaWQgdGltZW91dHMgZXRjIGtpbGxpbmcgaXQKLSAgICoKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2VydmUoKSB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmxpc3RlbigpOwotCi0gICAgd2hpbGUgKCEkdGhpcy0+c3RvcF8pIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgICR0cmFuc3BvcnQgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+YWNjZXB0KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoJHRyYW5zcG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgJGlucHV0VHJhbnNwb3J0ID0gJHRoaXMtPmlucHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKLSAgICAgICAgICAkb3V0cHV0VHJhbnNwb3J0ID0gJHRoaXMtPm91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoJHRyYW5zcG9ydCk7Ci0gICAgICAgICAgJGlucHV0UHJvdG9jb2wgPSAkdGhpcy0+aW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbCgkaW5wdXRUcmFuc3BvcnQpOwotICAgICAgICAgICRvdXRwdXRQcm90b2NvbCA9ICR0aGlzLT5vdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbCgkb3V0cHV0VHJhbnNwb3J0KTsKLSAgICAgICAgICB3aGlsZSAoJHRoaXMtPnByb2Nlc3Nvcl8tPnByb2Nlc3MoJGlucHV0UHJvdG9jb2wsICRvdXRwdXRQcm90b2NvbCkpIHsgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgeyB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3BzIHRoZSBzZXJ2ZXIgcnVubmluZy4gS2lsbHMgdGhlIHRyYW5zcG9ydAotICAgKiBhbmQgdGhlbiBzdG9wcyB0aGUgbWFpbiBzZXJ2aW5nIGxvb3AKLSAgICoKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc3RvcCgpIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgICAkdGhpcy0+c3RvcF8gPSB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODQxNTY0Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi0KLS8qKgotICogQnVmZmVyZWQgdHJhbnNwb3J0LiBTdG9yZXMgZGF0YSB0byBhbiBpbnRlcm5hbCBidWZmZXIgdGhhdCBpdCBkb2Vzbid0Ci0gKiBhY3R1YWxseSB3cml0ZSBvdXQgdW50aWwgZmx1c2ggaXMgY2FsbGVkLiBGb3IgcmVhZGluZywgd2UgZG8gYSBncmVlZHkKLSAqIHJlYWQgYW5kIHRoZW4gc2VydmUgZGF0YSBvdXQgb2YgdGhlIGludGVybmFsIGJ1ZmZlci4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgewotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4gQ3JlYXRlcyBhIGJ1ZmZlcmVkIHRyYW5zcG9ydCBhcm91bmQgYW4gdW5kZXJseWluZyB0cmFuc3BvcnQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnNwb3J0PW51bGwsICRyQnVmU2l6ZT01MTIsICR3QnVmU2l6ZT01MTIpIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0XyA9ICR0cmFuc3BvcnQ7Ci0gICAgJHRoaXMtPnJCdWZTaXplXyA9ICRyQnVmU2l6ZTsKLSAgICAkdGhpcy0+d0J1ZlNpemVfID0gJHdCdWZTaXplOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAotICAgKgotICAgKiBAdmFyIFRUcmFuc3BvcnQKLSAgICovCi0gIHByb3RlY3RlZCAkdHJhbnNwb3J0XyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSByZWNlaXZlIGJ1ZmZlciBzaXplCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcm90ZWN0ZWQgJHJCdWZTaXplXyA9IDUxMjsKLQotICAvKioKLSAgICogVGhlIHdyaXRlIGJ1ZmZlciBzaXplCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcm90ZWN0ZWQgJHdCdWZTaXplXyA9IDUxMjsKLQotICAvKioKLSAgICogVGhlIHdyaXRlIGJ1ZmZlci4KLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByb3RlY3RlZCAkd0J1Zl8gPSAnJzsKLQotICAvKioKLSAgICogVGhlIHJlYWQgYnVmZmVyLgotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRyQnVmXyA9ICcnOwotCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKSB7Ci0gICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5pc09wZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkgewotICAgICR0aGlzLT50cmFuc3BvcnRfLT5vcGVuKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKSB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcHV0QmFjaygkZGF0YSkgewotICAgIGlmIChzdHJsZW4oJHRoaXMtPnJCdWZfKSA9PT0gMCkgewotICAgICAgJHRoaXMtPnJCdWZfID0gJGRhdGE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICgkZGF0YSAuICR0aGlzLT5yQnVmXyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSByZWFzb24gdGhhdCB3ZSBjdXN0b21pemUgcmVhZEFsbCBoZXJlIGlzIHRoYXQgdGhlIG1ham9yaXR5IG9mIFBIUAotICAgKiBzdHJlYW1zIGFyZSBhbHJlYWR5IGludGVybmFsbHkgYnVmZmVyZWQgYnkgUEhQLiBUaGUgc29ja2V0IHN0cmVhbSwgZm9yCi0gICAqIGV4YW1wbGUsIGJ1ZmZlcnMgaW50ZXJuYWxseSBhbmQgYmxvY2tzIGlmIHlvdSBjYWxsIHJlYWQgd2l0aCAkbGVuIGdyZWF0ZXIKLSAgICogdGhhbiB0aGUgYW1vdW50IG9mIGRhdGEgYXZhaWxhYmxlLCB1bmxpa2UgcmVjdigpIGluIEMuCi0gICAqCi0gICAqIFRoZXJlZm9yZSwgdXNlIHRoZSByZWFkQWxsIG1ldGhvZCBvZiB0aGUgd3JhcHBlZCB0cmFuc3BvcnQgaW5zaWRlCi0gICAqIHRoZSBidWZmZXJlZCByZWFkQWxsLgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRBbGwoJGxlbikgewotICAgICRoYXZlID0gc3RybGVuKCR0aGlzLT5yQnVmXyk7Ci0gICAgaWYgKCRoYXZlID09IDApIHsKLSAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWRBbGwoJGxlbik7Ci0gICAgfSBlbHNlIGlmICgkaGF2ZSA8ICRsZW4pIHsKLSAgICAgICRkYXRhID0gJHRoaXMtPnJCdWZfOwotICAgICAgJHRoaXMtPnJCdWZfID0gJyc7Ci0gICAgICAkZGF0YSAuPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCgkbGVuIC0gJGhhdmUpOwotICAgIH0gZWxzZSBpZiAoJGhhdmUgPT0gJGxlbikgewotICAgICAgJGRhdGEgPSAkdGhpcy0+ckJ1Zl87Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSAnJzsKLSAgICB9IGVsc2UgaWYgKCRoYXZlID4gJGxlbikgewotICAgICAgJGRhdGEgPSBzdWJzdHIoJHRoaXMtPnJCdWZfLCAwLCAkbGVuKTsKLSAgICAgICR0aGlzLT5yQnVmXyA9IHN1YnN0cigkdGhpcy0+ckJ1Zl8sICRsZW4pOwotICAgIH0KLSAgICByZXR1cm4gJGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKSB7Ci0gICAgaWYgKHN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZCgkdGhpcy0+ckJ1ZlNpemVfKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RybGVuKCR0aGlzLT5yQnVmXykgPD0gJGxlbikgewotICAgICAgJHJldCA9ICR0aGlzLT5yQnVmXzsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICcnOwotICAgICAgcmV0dXJuICRyZXQ7Ci0gICAgfQotCi0gICAgJHJldCA9IHN1YnN0cigkdGhpcy0+ckJ1Zl8sIDAsICRsZW4pOwotICAgICR0aGlzLT5yQnVmXyA9IHN1YnN0cigkdGhpcy0+ckJ1Zl8sICRsZW4pOwotICAgIHJldHVybiAkcmV0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpIHsKLSAgICAkdGhpcy0+d0J1Zl8gLj0gJGJ1ZjsKLSAgICBpZiAoc3RybGVuKCR0aGlzLT53QnVmXykgPj0gJHRoaXMtPndCdWZTaXplXykgewotICAgICAgJG91dCA9ICR0aGlzLT53QnVmXzsKLQotICAgICAgLy8gTm90ZSB0aGF0IHdlIGNsZWFyIHRoZSBpbnRlcm5hbCB3QnVmXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQotICAgICAgLy8gdG8gZW5zdXJlIHdlJ3JlIGluIGEgc2FuZSBzdGF0ZSAoaS5lLiBpbnRlcm5hbCBidWZmZXIgY2xlYW5lZCkKLSAgICAgIC8vIGlmIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRocm93cyB1cCBhbiBleGNlcHRpb24KLSAgICAgICR0aGlzLT53QnVmXyA9ICcnOwotICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPndyaXRlKCRvdXQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpIHsKLSAgICBpZiAoc3RybGVuKCR0aGlzLT53QnVmXykgPiAwKSB7Ci0gICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+d3JpdGUoJHRoaXMtPndCdWZfKTsKLSAgICAgICR0aGlzLT53QnVmXyA9ICcnOwotICAgIH0KLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Zmx1c2goKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAgYi9saWIvcGhwL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYzBiYjUuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi0KLS8qKgotICogRnJhbWVkIHRyYW5zcG9ydC4gV3JpdGVzIGFuZCByZWFkcyBkYXRhIGluIGNodW5rcyB0aGF0IGFyZSBzdGFtcGVkIHdpdGgKLSAqIHRoZWlyIGxlbmd0aC4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRGcmFtZWRUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKLQotICAvKioKLSAgICogVW5kZXJseWluZyB0cmFuc3BvcnQgb2JqZWN0LgotICAgKgotICAgKiBAdmFyIFRUcmFuc3BvcnQKLSAgICovCi0gIHByaXZhdGUgJHRyYW5zcG9ydF87Ci0KLSAgLyoqCi0gICAqIEJ1ZmZlciBmb3IgcmVhZCBkYXRhLgotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJpdmF0ZSAkckJ1Zl87Ci0KLSAgLyoqCi0gICAqIEJ1ZmZlciBmb3IgcXVldWVkIG91dHB1dCBkYXRhCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcml2YXRlICR3QnVmXzsKLQotICAvKioKLSAgICogV2hldGhlciB0byBmcmFtZSByZWFkcwotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByaXZhdGUgJHJlYWRfOwotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRvIGZyYW1lIHdyaXRlcwotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByaXZhdGUgJHdyaXRlXzsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSBUVHJhbnNwb3J0ICR0cmFuc3BvcnQgVW5kZXJseWluZyB0cmFuc3BvcnQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnNwb3J0PW51bGwsICRyZWFkPXRydWUsICR3cml0ZT10cnVlKSB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8gPSAkdHJhbnNwb3J0OwotICAgICR0aGlzLT5yZWFkXyA9ICRyZWFkOwotICAgICR0aGlzLT53cml0ZV8gPSAkd3JpdGU7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkgewotICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+aXNPcGVuKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+b3BlbigpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkgewotICAgICR0aGlzLT50cmFuc3BvcnRfLT5jbG9zZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWRzIGZyb20gdGhlIGJ1ZmZlci4gV2hlbiBtb3JlIGRhdGEgaXMgcmVxdWlyZWQgcmVhZHMgYW5vdGhlciBlbnRpcmUKLSAgICogY2h1bmsgYW5kIHNlcnZlcyBmdXR1cmUgcmVhZHMgb3V0IG9mIHRoYXQuCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJGxlbiBIb3cgbXVjaCBkYXRhCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKSB7Ci0gICAgaWYgKCEkdGhpcy0+cmVhZF8pIHsKLSAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZCgkbGVuKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RybGVuKCR0aGlzLT5yQnVmXykgPT09IDApIHsKLSAgICAgICR0aGlzLT5yZWFkRnJhbWUoKTsKLSAgICB9Ci0KLSAgICAvLyBKdXN0IHJldHVybiBmdWxsIGJ1ZmYKLSAgICBpZiAoJGxlbiA+PSBzdHJsZW4oJHRoaXMtPnJCdWZfKSkgewotICAgICAgJG91dCA9ICR0aGlzLT5yQnVmXzsKLSAgICAgICR0aGlzLT5yQnVmXyA9IG51bGw7Ci0gICAgICByZXR1cm4gJG91dDsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gc3Vic3RyCi0gICAgJG91dCA9IHN1YnN0cigkdGhpcy0+ckJ1Zl8sIDAsICRsZW4pOwotICAgICR0aGlzLT5yQnVmXyA9IHN1YnN0cigkdGhpcy0+ckJ1Zl8sICRsZW4pOwotICAgIHJldHVybiAkb3V0OwotICB9Ci0KLSAgLyoqCi0gICAqIFB1dCBwcmV2aW91c2x5IHJlYWQgZGF0YSBiYWNrIGludG8gdGhlIGJ1ZmZlcgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRkYXRhIGRhdGEgdG8gcmV0dXJuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gcHV0QmFjaygkZGF0YSkgewotICAgIGlmIChzdHJsZW4oJHRoaXMtPnJCdWZfKSA9PT0gMCkgewotICAgICAgJHRoaXMtPnJCdWZfID0gJGRhdGE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICgkZGF0YSAuICR0aGlzLT5yQnVmXyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWRzIGEgY2h1bmsgb2YgZGF0YSBpbnRvIHRoZSBpbnRlcm5hbCByZWFkIGJ1ZmZlci4KLSAgICovCi0gIHByaXZhdGUgZnVuY3Rpb24gcmVhZEZyYW1lKCkgewotICAgICRidWYgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCg0KTsKLSAgICAkdmFsID0gdW5wYWNrKCdOJywgJGJ1Zik7Ci0gICAgJHN6ID0gJHZhbFsxXTsKLQotICAgICR0aGlzLT5yQnVmXyA9ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKCRzeik7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGVzIHNvbWUgZGF0YSB0byB0aGUgcGVuZGluZyBvdXRwdXQgYnVmZmVyLgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRidWYgVGhlIGRhdGEKLSAgICogQHBhcmFtIGludCAgICAkbGVuIExpbWl0IG9mIGJ5dGVzIHRvIHdyaXRlCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZiwgJGxlbj1udWxsKSB7Ci0gICAgaWYgKCEkdGhpcy0+d3JpdGVfKSB7Ci0gICAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPndyaXRlKCRidWYsICRsZW4pOwotICAgIH0KLQotICAgIGlmICgkbGVuICE9PSBudWxsICYmICRsZW4gPCBzdHJsZW4oJGJ1ZikpIHsKLSAgICAgICRidWYgPSBzdWJzdHIoJGJ1ZiwgMCwgJGxlbik7Ci0gICAgfQotICAgICR0aGlzLT53QnVmXyAuPSAkYnVmOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyB0aGUgb3V0cHV0IGJ1ZmZlciB0byB0aGUgc3RyZWFtIGluIHRoZSBmb3JtYXQgb2YgYSA0LWJ5dGUgbGVuZ3RoCi0gICAqIGZvbGxvd2VkIGJ5IHRoZSBhY3R1YWwgZGF0YS4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpIHsKLSAgICBpZiAoISR0aGlzLT53cml0ZV8gfHwgc3RybGVuKCR0aGlzLT53QnVmXykgPT0gMCkgewotICAgICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5mbHVzaCgpOwotICAgIH0KLQotICAgICRvdXQgPSBwYWNrKCdOJywgc3RybGVuKCR0aGlzLT53QnVmXykpOwotICAgICRvdXQgLj0gJHRoaXMtPndCdWZfOwotCi0gICAgLy8gTm90ZSB0aGF0IHdlIGNsZWFyIHRoZSBpbnRlcm5hbCB3QnVmXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQotICAgIC8vIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUgKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpCi0gICAgLy8gaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzIHVwIGFuIGV4Y2VwdGlvbgotICAgICR0aGlzLT53QnVmXyA9ICcnOwotICAgICR0aGlzLT50cmFuc3BvcnRfLT53cml0ZSgkb3V0KTsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Zmx1c2goKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQucGhwIGIvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAyZGJiYi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi0KLS8qKgotICogSFRUUCBjbGllbnQgZm9yIFRocmlmdAotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVEh0dHBDbGllbnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKLQotICAvKioKLSAgICogVGhlIGhvc3QgdG8gY29ubmVjdCB0bwotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRob3N0XzsKLQotICAvKioKLSAgICogVGhlIHBvcnQgdG8gY29ubmVjdCBvbgotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJvdGVjdGVkICRwb3J0XzsKLQotICAvKioKLSAgICogVGhlIFVSSSB0byByZXF1ZXN0Ci0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJHVyaV87Ci0KLSAgLyoqCi0gICAqIFRoZSBzY2hlbWUgdG8gdXNlIGZvciB0aGUgcmVxdWVzdCwgaS5lLiBodHRwLCBodHRwcwotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRzY2hlbWVfOwotCi0gIC8qKgotICAgKiBCdWZmZXIgZm9yIHRoZSBIVFRQIHJlcXVlc3QgZGF0YQotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRidWZfOwotCi0gIC8qKgotICAgKiBJbnB1dCBzb2NrZXQgc3RyZWFtLgotICAgKgotICAgKiBAdmFyIHJlc291cmNlCi0gICAqLwotICBwcm90ZWN0ZWQgJGhhbmRsZV87Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGltZW91dAotICAgKgotICAgKiBAdmFyIGZsb2F0Ci0gICAqLwotICBwcm90ZWN0ZWQgJHRpbWVvdXRfOwotCi0gIC8qKgotICAgKiBNYWtlIGEgbmV3IEhUVFAgY2xpZW50LgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRob3N0Ci0gICAqIEBwYXJhbSBpbnQgICAgJHBvcnQKLSAgICogQHBhcmFtIHN0cmluZyAkdXJpCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QsICRwb3J0PTgwLCAkdXJpPScnLCAkc2NoZW1lID0gJ2h0dHAnKSB7Ci0gICAgaWYgKChzdHJsZW4oJHVyaSkgPiAwKSAmJiAoJHVyaXswfSAhPSAnLycpKSB7Ci0gICAgICAkdXJpID0gJy8nLiR1cmk7Ci0gICAgfQotICAgICR0aGlzLT5zY2hlbWVfID0gJHNjaGVtZTsKLSAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKLSAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKLSAgICAkdGhpcy0+dXJpXyA9ICR1cmk7Ci0gICAgJHRoaXMtPmJ1Zl8gPSAnJzsKLSAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7Ci0gICAgJHRoaXMtPnRpbWVvdXRfID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgcmVhZCB0aW1lb3V0Ci0gICAqCi0gICAqIEBwYXJhbSBmbG9hdCAkdGltZW91dAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldFRpbWVvdXRTZWNzKCR0aW1lb3V0KSB7Ci0gICAgJHRoaXMtPnRpbWVvdXRfID0gJHRpbWVvdXQ7Ci0gIH0KLQotICAvKioKLSAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgotICAgKgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBvcGVuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3Qgb3BlbgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKSB7fQotCi0gIC8qKgotICAgKiBDbG9zZSB0aGUgdHJhbnNwb3J0LgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkgewotICAgIGlmICgkdGhpcy0+aGFuZGxlXykgewotICAgICAgQGZjbG9zZSgkdGhpcy0+aGFuZGxlXyk7Ci0gICAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgc29tZSBkYXRhIGludG8gdGhlIGFycmF5LgotICAgKgotICAgKiBAcGFyYW0gaW50ICAgICRsZW4gSG93IG11Y2ggdG8gcmVhZAotICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YSB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGFueSBtb3JlIGRhdGEKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pIHsKLSAgICAkZGF0YSA9IEBmcmVhZCgkdGhpcy0+aGFuZGxlXywgJGxlbik7Ci0gICAgaWYgKCRkYXRhID09PSBGQUxTRSB8fCAkZGF0YSA9PT0gJycpIHsKLSAgICAgICRtZCA9IHN0cmVhbV9nZXRfbWV0YV9kYXRhKCR0aGlzLT5oYW5kbGVfKTsKLSAgICAgIGlmICgkbWRbJ3RpbWVkX291dCddKSB7Ci0gICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUSHR0cENsaWVudDogdGltZWQgb3V0IHJlYWRpbmcgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLiR0aGlzLT5ob3N0Xy4nOicuJHRoaXMtPnBvcnRfLicvJy4kdGhpcy0+dXJpXywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUSHR0cENsaWVudDogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLiR0aGlzLT5ob3N0Xy4nOicuJHRoaXMtPnBvcnRfLicvJy4kdGhpcy0+dXJpXywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAkZGF0YTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZXMgc29tZSBkYXRhIGludG8gdGhlIHBlbmRpbmcgYnVmZmVyCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiAgVGhlIGRhdGEgdG8gd3JpdGUKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdyaXRpbmcgZmFpbHMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKSB7Ci0gICAgJHRoaXMtPmJ1Zl8gLj0gJGJ1ZjsKLSAgfQotCi0gIC8qKgotICAgKiBPcGVucyBhbmQgc2VuZHMgdGhlIGFjdHVhbCByZXF1ZXN0IG92ZXIgdGhlIEhUVFAgY29ubmVjdGlvbgotICAgKgotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYSB3cml0aW5nIGVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkgewotICAgIC8vIEdvZCwgUEhQIHJlYWxseSBoYXMgc29tZSBlc290ZXJpYyB3YXlzIG9mIGRvaW5nIHNpbXBsZSB0aGluZ3MuCi0gICAgJGhvc3QgPSAkdGhpcy0+aG9zdF8uKCR0aGlzLT5wb3J0XyAhPSA4MCA/ICc6Jy4kdGhpcy0+cG9ydF8gOiAnJyk7Ci0KLSAgICAkaGVhZGVycyA9IGFycmF5KCdIb3N0OiAnLiRob3N0LAotICAgICAgICAgICAgICAgICAgICAgJ0FjY2VwdDogYXBwbGljYXRpb24veC10aHJpZnQnLAotICAgICAgICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQ6IFBIUC9USHR0cENsaWVudCcsCi0gICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCcsCi0gICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1MZW5ndGg6ICcuc3RybGVuKCR0aGlzLT5idWZfKSk7Ci0KLSAgICAkb3B0aW9ucyA9IGFycmF5KCdtZXRob2QnID0+ICdQT1NUJywKLSAgICAgICAgICAgICAgICAgICAgICdoZWFkZXInID0+IGltcGxvZGUoIlxyXG4iLCAkaGVhZGVycyksCi0gICAgICAgICAgICAgICAgICAgICAnbWF4X3JlZGlyZWN0cycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICdjb250ZW50JyA9PiAkdGhpcy0+YnVmXyk7Ci0gICAgaWYgKCR0aGlzLT50aW1lb3V0XyA+IDApIHsKLSAgICAgICRvcHRpb25zWyd0aW1lb3V0J10gPSAkdGhpcy0+dGltZW91dF87Ci0gICAgfQotICAgICR0aGlzLT5idWZfID0gJyc7Ci0KLSAgICAkY29udGV4dGlkID0gc3RyZWFtX2NvbnRleHRfY3JlYXRlKGFycmF5KCdodHRwJyA9PiAkb3B0aW9ucykpOwotICAgICR0aGlzLT5oYW5kbGVfID0gQGZvcGVuKCR0aGlzLT5zY2hlbWVfLic6Ly8nLiRob3N0LiR0aGlzLT51cmlfLCAncicsIGZhbHNlLCAkY29udGV4dGlkKTsKLQotICAgIC8vIENvbm5lY3QgZmFpbGVkPwotICAgIGlmICgkdGhpcy0+aGFuZGxlXyA9PT0gRkFMU0UpIHsKLSAgICAgICR0aGlzLT5oYW5kbGVfID0gbnVsbDsKLSAgICAgICRlcnJvciA9ICdUSHR0cENsaWVudDogQ291bGQgbm90IGNvbm5lY3QgdG8gJy4kaG9zdC4kdGhpcy0+dXJpXzsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCRlcnJvciwgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAgYi9saWIvcGhwL3NyYy90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYjFhNTQuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLQotLyoqCi0gKiBBIG1lbW9yeSBidWZmZXIgaXMgYSB0cmFucHNvcnQgdGhhdCBzaW1wbHkgcmVhZHMgZnJvbSBhbmQgd3JpdGVzIHRvIGFuCi0gKiBpbi1tZW1vcnkgc3RyaW5nIGJ1ZmZlci4gQW55dGltZSB5b3UgY2FsbCB3cml0ZSBvbiBpdCwgdGhlIGRhdGEgaXMgc2ltcGx5Ci0gKiBwbGFjZWQgaW50byBhIGJ1ZmZlciwgYW5kIGFueXRpbWUgeW91IGNhbGwgcmVhZCwgZGF0YSBpcyByZWFkIGZyb20gdGhhdAotICogYnVmZmVyLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVE1lbW9yeUJ1ZmZlciBleHRlbmRzIFRUcmFuc3BvcnQgewotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4gT3B0aW9uYWxseSBwYXNzIGFuIGluaXRpYWwgdmFsdWUKLSAgICogZm9yIHRoZSBidWZmZXIuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGJ1ZiA9ICcnKSB7Ci0gICAgJHRoaXMtPmJ1Zl8gPSAkYnVmOwotICB9Ci0KLSAgcHJvdGVjdGVkICRidWZfID0gJyc7Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkge30KLQotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKSB7fQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKSB7Ci0gICAgJHRoaXMtPmJ1Zl8gLj0gJGJ1ZjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pIHsKLSAgICBpZiAoc3RybGVuKCR0aGlzLT5idWZfKSA9PT0gMCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RNZW1vcnlCdWZmZXI6IENvdWxkIG5vdCByZWFkICcgLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbiAuICcgYnl0ZXMgZnJvbSBidWZmZXIuJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04pOwotICAgIH0KLQotICAgIGlmIChzdHJsZW4oJHRoaXMtPmJ1Zl8pIDw9ICRsZW4pIHsKLSAgICAgICRyZXQgPSAkdGhpcy0+YnVmXzsKLSAgICAgICR0aGlzLT5idWZfID0gJyc7Ci0gICAgICByZXR1cm4gJHJldDsKLSAgICB9Ci0KLSAgICAkcmV0ID0gc3Vic3RyKCR0aGlzLT5idWZfLCAwLCAkbGVuKTsKLSAgICAkdGhpcy0+YnVmXyA9IHN1YnN0cigkdGhpcy0+YnVmXywgJGxlbik7Ci0KLSAgICByZXR1cm4gJHJldDsKLSAgfQotCi0gIGZ1bmN0aW9uIGdldEJ1ZmZlcigpIHsKLSAgICByZXR1cm4gJHRoaXMtPmJ1Zl87Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gYXZhaWxhYmxlKCkgewotICAgIHJldHVybiBzdHJsZW4oJHRoaXMtPmJ1Zl8pOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwIGIvbGliL3BocC9zcmMvdHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU1MzQwZC4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLQotLyoqCi0gKiBUcmFuc3BvcnQgdGhhdCBvbmx5IGFjY2VwdHMgd3JpdGVzIGFuZCBpZ25vcmVzIHRoZW0uCi0gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbWVhc3VyaW5nIHRoZSBzZXJpYWxpemVkIHNpemUgb2Ygc3RydWN0dXJlcy4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFROdWxsVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkge30KLQotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKSB7fQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pIHsKLSAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ2FuJ3QgcmVhZCBmcm9tIFROdWxsVHJhbnNwb3J0LiIpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpIHt9Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocCBiL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRiMTFhNi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFBocFN0cmVhbS5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLQotLyoqCi0gKiBQaHAgc3RyZWFtIHRyYW5zcG9ydC4gUmVhZHMgdG8gYW5kIHdyaXRlcyBmcm9tIHRoZSBwaHAgc3RhbmRhcmQgc3RyZWFtcwotICogcGhwOi8vaW5wdXQgYW5kIHBocDovL291dHB1dAotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVFBocFN0cmVhbSBleHRlbmRzIFRUcmFuc3BvcnQgewotCi0gIGNvbnN0IE1PREVfUiA9IDE7Ci0gIGNvbnN0IE1PREVfVyA9IDI7Ci0KLSAgcHJpdmF0ZSAkaW5TdHJlYW1fID0gbnVsbDsKLQotICBwcml2YXRlICRvdXRTdHJlYW1fID0gbnVsbDsKLQotICBwcml2YXRlICRyZWFkXyA9IGZhbHNlOwotCi0gIHByaXZhdGUgJHdyaXRlXyA9IGZhbHNlOwotCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbW9kZSkgewotICAgICR0aGlzLT5yZWFkXyA9ICRtb2RlICYgc2VsZjo6TU9ERV9SOwotICAgICR0aGlzLT53cml0ZV8gPSAkbW9kZSAmIHNlbGY6Ok1PREVfVzsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkgewotICAgIGlmICgkdGhpcy0+cmVhZF8pIHsKLSAgICAgICR0aGlzLT5pblN0cmVhbV8gPSBAZm9wZW4oc2VsZjo6aW5TdHJlYW1OYW1lKCksICdyJyk7Ci0gICAgICBpZiAoIWlzX3Jlc291cmNlKCR0aGlzLT5pblN0cmVhbV8pKSB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdUUGhwU3RyZWFtOiBDb3VsZCBub3Qgb3BlbiBwaHA6Ly9pbnB1dCcpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoJHRoaXMtPndyaXRlXykgewotICAgICAgJHRoaXMtPm91dFN0cmVhbV8gPSBAZm9wZW4oJ3BocDovL291dHB1dCcsICd3Jyk7Ci0gICAgICBpZiAoIWlzX3Jlc291cmNlKCR0aGlzLT5vdXRTdHJlYW1fKSkgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFBocFN0cmVhbTogQ291bGQgbm90IG9wZW4gcGhwOi8vb3V0cHV0Jyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkgewotICAgIGlmICgkdGhpcy0+cmVhZF8pIHsKLSAgICAgIEBmY2xvc2UoJHRoaXMtPmluU3RyZWFtXyk7Ci0gICAgICAkdGhpcy0+aW5TdHJlYW1fID0gbnVsbDsKLSAgICB9Ci0gICAgaWYgKCR0aGlzLT53cml0ZV8pIHsKLSAgICAgIEBmY2xvc2UoJHRoaXMtPm91dFN0cmVhbV8pOwotICAgICAgJHRoaXMtPm91dFN0cmVhbV8gPSBudWxsOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKSB7Ci0gICAgcmV0dXJuCi0gICAgICAoISR0aGlzLT5yZWFkXyB8fCBpc19yZXNvdXJjZSgkdGhpcy0+aW5TdHJlYW1fKSkgJiYKLSAgICAgICghJHRoaXMtPndyaXRlXyB8fCBpc19yZXNvdXJjZSgkdGhpcy0+b3V0U3RyZWFtXykpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikgewotICAgICRkYXRhID0gQGZyZWFkKCR0aGlzLT5pblN0cmVhbV8sICRsZW4pOwotICAgIGlmICgkZGF0YSA9PT0gRkFMU0UgfHwgJGRhdGEgPT09ICcnKSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFBocFN0cmVhbTogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMnKTsKLSAgICB9Ci0gICAgcmV0dXJuICRkYXRhOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpIHsKLSAgICB3aGlsZSAoc3RybGVuKCRidWYpID4gMCkgewotICAgICAgJGdvdCA9IEBmd3JpdGUoJHRoaXMtPm91dFN0cmVhbV8sICRidWYpOwotICAgICAgaWYgKCRnb3QgPT09IDAgfHwgJGdvdCA9PT0gRkFMU0UpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RQaHBTdHJlYW06IENvdWxkIG5vdCB3cml0ZSAnLnN0cmxlbigkYnVmKS4nIGJ5dGVzJyk7Ci0gICAgICB9Ci0gICAgICAkYnVmID0gc3Vic3RyKCRidWYsICRnb3QpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpIHsKLSAgICBAZmZsdXNoKCR0aGlzLT5vdXRTdHJlYW1fKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGluU3RyZWFtTmFtZSgpIHsKLSAgICBpZiAocGhwX3NhcGlfbmFtZSgpID09ICdjbGknKSB7Ci0gICAgICByZXR1cm4gJ3BocDovL3N0ZGluJzsKLSAgICB9Ci0gICAgcmV0dXJuICdwaHA6Ly9pbnB1dCc7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQucGhwIGIvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWMxMmFiLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTw/cGhwCi0KLWluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LnBocCc7Ci1pbmNsdWRlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy90cmFuc3BvcnQvVFNvY2tldC5waHAnOwotCi0vKioKLSAqIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZlciBhZ2VudC4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRTZXJ2ZXJTb2NrZXQgZXh0ZW5kcyBUU2VydmVyVHJhbnNwb3J0IHsKLQotICAvKioKLSAgICogSGFuZGxlIGZvciB0aGUgbGlzdGVuZXIgc29ja2V0Ci0gICAqCi0gICAqIEB2YXIgcmVzb3VyY2UKLSAgICovCi0gIHByaXZhdGUgJGxpc3RlbmVyXzsKLQotICAvKioKLSAgICogUG9ydCBmb3IgdGhlIGxpc3RlbmVyIHRvIGxpc3RlbiBvbgotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkcG9ydF87Ci0KLSAgLyoqCi0gICAqIFRpbWVvdXQgd2hlbiBsaXN0ZW5pbmcgZm9yIGEgbmV3IGNsaWVudAotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkYWNjZXB0VGltZW91dF8gPSAzMDAwMDsKLQotICAvKioKLSAgICogSG9zdCB0byBsaXN0ZW4gb24KLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByaXZhdGUgJGhvc3RfOwotCi0gIC8qKgotICAgKiBTZXJ2ZXJTb2NrZXQgY29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkaG9zdCAgICAgICAgSG9zdCB0byBsaXN0ZW4gb24KLSAgICogQHBhcmFtIGludCAkcG9ydCAgICAgICAgICAgUG9ydCB0byBsaXN0ZW4gb24KLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QgPSAnbG9jYWxob3N0JywgJHBvcnQgPSA5MDkwKSB7Ci0gICAgJHRoaXMtPmhvc3RfID0gJGhvc3Q7Ci0gICAgJHRoaXMtPnBvcnRfID0gJHBvcnQ7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgYWNjZXB0IHRpbWVvdXQKLSAgICoKLSAgICogQHBhcmFtIGludCAkYWNjZXB0VGltZW91dAotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRBY2NlcHRUaW1lb3V0KCRhY2NlcHRUaW1lb3V0KSB7Ci0gICAgJHRoaXMtPmFjY2VwdFRpbWVvdXRfID0gJGFjY2VwdFRpbWVvdXQ7Ci0gIH0KLQotICAvKioKLSAgICogT3BlbnMgYSBuZXcgc29ja2V0IHNlcnZlciBoYW5kbGUKLSAgICoKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gbGlzdGVuKCkgewotICAgICR0aGlzLT5saXN0ZW5lcl8gPSBzdHJlYW1fc29ja2V0X3NlcnZlcigndGNwOi8vJyAuICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0Xyk7Ci0gIH0KLQotICAvKioKLSAgICogQ2xvc2VzIHRoZSBzb2NrZXQgc2VydmVyIGhhbmRsZQotICAgKgotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpIHsKLSAgICBAZmNsb3NlKCR0aGlzLT5saXN0ZW5lcl8pOwotICAgICR0aGlzLT5saXN0ZW5lcl8gPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEltcGxlbWVudGF0aW9uIG9mIGFjY2VwdC4gSWYgbm90IGNsaWVudCBpcyBhY2NlcHRlZCBpbiB0aGUgZ2l2ZW4gdGltZQotICAgKgotICAgKiBAcmV0dXJuIFRTb2NrZXQKLSAgICovCi0gIHByb3RlY3RlZCBmdW5jdGlvbiBhY2NlcHRJbXBsKCkgewotICAgICRoYW5kbGUgPSBAc3RyZWFtX3NvY2tldF9hY2NlcHQoJHRoaXMtPmxpc3RlbmVyXywgJHRoaXMtPmFjY2VwdFRpbWVvdXRfIC8gMTAwMC4wKTsKLSAgICBpZighJGhhbmRsZSkgcmV0dXJuIG51bGw7Ci0KLSAgICAkc29ja2V0ID0gbmV3IFRTb2NrZXQoKTsKLSAgICAkc29ja2V0LT5zZXRIYW5kbGUoJGhhbmRsZSk7Ci0gICAgCi0gICAgcmV0dXJuICRzb2NrZXQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkyY2E3Ny4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3BocAotCi0vKioKLSAqIEdlbmVyaWMgY2xhc3MgZm9yIFNlcnZlciBhZ2VudC4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWFic3RyYWN0IGNsYXNzIFRTZXJ2ZXJUcmFuc3BvcnQgewotICAvKioKLSAgICogTGlzdCBmb3IgbmV3IGNsaWVudHMKLSAgICoKLSAgICogQGFic3RyYWN0Ci0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGxpc3RlbigpOwotCi0gIC8qKgotICAgKiBDbG9zZSB0aGUgc2VydmVyCi0gICAqCi0gICAqIEBhYnN0cmFjdAotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpOwotCi0gIC8qKgotICAgKiBTdWJjbGFzc2VzIHNob3VsZCB1c2UgdGhpcyB0byBpbXBsZW1lbnQKLSAgICogYWNjZXB0LgotICAgKgotICAgKiBAYWJzdHJhY3QKLSAgICogQHJldHVybiBUVHJhbnNwb3J0Ci0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgZnVuY3Rpb24gYWNjZXB0SW1wbCgpOwotCi0gIC8qKgotICAgKiBVc2VzIHRoZSBhY2NlcHQgaW1wbGVtdGF0aW9uLiBJZiBudWxsIGlzIHJldHVybmVkLCBhbgotICAgKiBleGNlcHRpb24gaXMgdGhyb3duLgotICAgKgotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KLSAgICogQHJldHVybiBUVHJhbnNwb3J0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCkgewotICAgICR0cmFuc3BvcnQgPSAkdGhpcy0+YWNjZXB0SW1wbCgpOwotCi0gICAgaWYgKCR0cmFuc3BvcnQgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oImFjY2VwdCgpIG1heSBub3QgcmV0dXJuIE5VTEwiKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuICR0cmFuc3BvcnQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UU29ja2V0LnBocCBiL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UU29ja2V0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFmOTAyMC4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFNvY2tldC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLQotLyoqCi0gKiBTb2NrZXRzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRTb2NrZXQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKLQotICAvKioKLSAgICogSGFuZGxlIHRvIFBIUCBzb2NrZXQKLSAgICoKLSAgICogQHZhciByZXNvdXJjZQotICAgKi8KLSAgcHJpdmF0ZSAkaGFuZGxlXyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFJlbW90ZSBob3N0bmFtZQotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRob3N0XyA9ICdsb2NhbGhvc3QnOwotCi0gIC8qKgotICAgKiBSZW1vdGUgcG9ydAotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJvdGVjdGVkICRwb3J0XyA9ICc5MDkwJzsKLQotICAvKioKLSAgICogU2VuZCB0aW1lb3V0IGluIHNlY29uZHMuCi0gICAqCi0gICAqIENvbWJpbmVkIHdpdGggc2VuZFRpbWVvdXRVc2VjIHRoaXMgaXMgdXNlZCBmb3Igc2VuZCB0aW1lb3V0cy4KLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJHNlbmRUaW1lb3V0U2VjXyA9IDA7Ci0KLSAgLyoqCi0gICAqIFNlbmQgdGltZW91dCBpbiBtaWNyb3NlY29uZHMuCi0gICAqCi0gICAqIENvbWJpbmVkIHdpdGggc2VuZFRpbWVvdXRTZWMgdGhpcyBpcyB1c2VkIGZvciBzZW5kIHRpbWVvdXRzLgotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkc2VuZFRpbWVvdXRVc2VjXyA9IDEwMDAwMDsKLQotICAvKioKLSAgICogUmVjdiB0aW1lb3V0IGluIHNlY29uZHMKLSAgICoKLSAgICogQ29tYmluZWQgd2l0aCByZWN2VGltZW91dFVzZWMgdGhpcyBpcyB1c2VkIGZvciByZWN2IHRpbWVvdXRzLgotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkcmVjdlRpbWVvdXRTZWNfID0gMDsKLQotICAvKioKLSAgICogUmVjdiB0aW1lb3V0IGluIG1pY3Jvc2Vjb25kcwotICAgKgotICAgKiBDb21iaW5lZCB3aXRoIHJlY3ZUaW1lb3V0U2VjIHRoaXMgaXMgdXNlZCBmb3IgcmVjdiB0aW1lb3V0cy4KLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJHJlY3ZUaW1lb3V0VXNlY18gPSA3NTAwMDA7Ci0KLSAgLyoqCi0gICAqIFBlcnNpc3RlbnQgc29ja2V0IG9yIHBsYWluPwotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByb3RlY3RlZCAkcGVyc2lzdF8gPSBGQUxTRTsKLQotICAvKioKLSAgICogRGVidWdnaW5nIG9uPwotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByb3RlY3RlZCAkZGVidWdfID0gRkFMU0U7Ci0KLSAgLyoqCi0gICAqIERlYnVnIGhhbmRsZXIKLSAgICoKLSAgICogQHZhciBtaXhlZAotICAgKi8KLSAgcHJvdGVjdGVkICRkZWJ1Z0hhbmRsZXJfID0gbnVsbDsKLQotICAvKioKLSAgICogU29ja2V0IGNvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgICAgICAgICBSZW1vdGUgaG9zdG5hbWUKLSAgICogQHBhcmFtIGludCAgICAkcG9ydCAgICAgICAgIFJlbW90ZSBwb3J0Ci0gICAqIEBwYXJhbSBib29sICAgJHBlcnNpc3QgICAgICBXaGV0aGVyIHRvIHVzZSBhIHBlcnNpc3RlbnQgc29ja2V0Ci0gICAqIEBwYXJhbSBzdHJpbmcgJGRlYnVnSGFuZGxlciBGdW5jdGlvbiB0byBjYWxsIGZvciBlcnJvciBsb2dnaW5nCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3Q9J2xvY2FsaG9zdCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcG9ydD05MDkwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBlcnNpc3Q9RkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGVidWdIYW5kbGVyPW51bGwpIHsKLSAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKLSAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKLSAgICAkdGhpcy0+cGVyc2lzdF8gPSAkcGVyc2lzdDsKLSAgICAkdGhpcy0+ZGVidWdIYW5kbGVyXyA9ICRkZWJ1Z0hhbmRsZXIgPyAkZGVidWdIYW5kbGVyIDogJ2Vycm9yX2xvZyc7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHJlc291cmNlICRoYW5kbGUKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0SGFuZGxlKCRoYW5kbGUpIHsKLSAgICAkdGhpcy0+aGFuZGxlXyA9ICRoYW5kbGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgc2VuZCB0aW1lb3V0LgotICAgKgotICAgKiBAcGFyYW0gaW50ICR0aW1lb3V0ICBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcy4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRTZW5kVGltZW91dCgkdGltZW91dCkgewotICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18gPSBmbG9vcigkdGltZW91dCAvIDEwMDApOwotICAgICR0aGlzLT5zZW5kVGltZW91dFVzZWNfID0KLSAgICAgICAgICAgICgkdGltZW91dCAtICgkdGhpcy0+c2VuZFRpbWVvdXRTZWNfICogMTAwMCkpICogMTAwMDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSByZWNlaXZlIHRpbWVvdXQuCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJHRpbWVvdXQgIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldFJlY3ZUaW1lb3V0KCR0aW1lb3V0KSB7Ci0gICAgJHRoaXMtPnJlY3ZUaW1lb3V0U2VjXyA9IGZsb29yKCR0aW1lb3V0IC8gMTAwMCk7Ci0gICAgJHRoaXMtPnJlY3ZUaW1lb3V0VXNlY18gPQotICAgICAgICAgICAgKCR0aW1lb3V0IC0gKCR0aGlzLT5yZWN2VGltZW91dFNlY18gKiAxMDAwKSkgKiAxMDAwOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgZGVidWdnaW5nIG91dHB1dCBvbiBvciBvZmYKLSAgICoKLSAgICogQHBhcmFtIGJvb2wgJGRlYnVnCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0RGVidWcoJGRlYnVnKSB7Ci0gICAgJHRoaXMtPmRlYnVnXyA9ICRkZWJ1ZzsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGhvc3QgdGhhdCB0aGlzIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KLSAgICoKLSAgICogQHJldHVybiBzdHJpbmcgaG9zdAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGdldEhvc3QoKSB7Ci0gICAgcmV0dXJuICR0aGlzLT5ob3N0XzsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHJlbW90ZSBwb3J0IHRoYXQgdGhpcyBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCi0gICAqCi0gICAqIEByZXR1cm4gaW50IHBvcnQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBnZXRQb3J0KCkgewotICAgIHJldHVybiAkdGhpcy0+cG9ydF87Ci0gIH0KLQotICAvKioKLSAgICogVGVzdHMgd2hldGhlciB0aGlzIGlzIG9wZW4KLSAgICoKLSAgICogQHJldHVybiBib29sIHRydWUgaWYgdGhlIHNvY2tldCBpcyBvcGVuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkgewotICAgIHJldHVybiBpc19yZXNvdXJjZSgkdGhpcy0+aGFuZGxlXyk7Ci0gIH0KLQotICAvKioKLSAgICogQ29ubmVjdHMgdGhlIHNvY2tldC4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkgewotICAgIGlmICgkdGhpcy0+aXNPcGVuKCkpIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQnLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpBTFJFQURZX09QRU4pOwotICAgIH0KLQotICAgIGlmIChlbXB0eSgkdGhpcy0+aG9zdF8pKSB7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignQ2Fubm90IG9wZW4gbnVsbCBob3N0JywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOwotICAgIH0KLQotICAgIGlmICgkdGhpcy0+cG9ydF8gPD0gMCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ0Nhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCcsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKLSAgICB9Ci0KLSAgICBpZiAoJHRoaXMtPnBlcnNpc3RfKSB7Ci0gICAgICAkdGhpcy0+aGFuZGxlXyA9IEBwZnNvY2tvcGVuKCR0aGlzLT5ob3N0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnBvcnRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXJybm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18gKyAoJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18gLyAxMDAwMDAwKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR0aGlzLT5oYW5kbGVfID0gQGZzb2Nrb3BlbigkdGhpcy0+aG9zdF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnBvcnRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXJyc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18gKyAoJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18gLyAxMDAwMDAwKSk7Ci0gICAgfQotCi0gICAgLy8gQ29ubmVjdCBmYWlsZWQ/Ci0gICAgaWYgKCR0aGlzLT5oYW5kbGVfID09PSBGQUxTRSkgewotICAgICAgJGVycm9yID0gJ1RTb2NrZXQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcuJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8uJyAoJy4kZXJyc3RyLicgWycuJGVycm5vLiddKSc7Ci0gICAgICBpZiAoJHRoaXMtPmRlYnVnXykgewotICAgICAgICBjYWxsX3VzZXJfZnVuYygkdGhpcy0+ZGVidWdIYW5kbGVyXywgJGVycm9yKTsKLSAgICAgIH0KLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCRlcnJvcik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgc29ja2V0LgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkgewotICAgIGlmICghJHRoaXMtPnBlcnNpc3RfKSB7Ci0gICAgICBAZmNsb3NlKCR0aGlzLT5oYW5kbGVfKTsKLSAgICAgICR0aGlzLT5oYW5kbGVfID0gbnVsbDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBmcm9tIHRoZSBzb2NrZXQgYXQgbW9zdCAkbGVuIGJ5dGVzLgotICAgKgotICAgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCB3YWl0IGZvciBhbGwgdGhlIHJlcXVlc3RlZCBkYXRhLCBpdCB3aWxsIHJldHVybiBhcwotICAgKiBzb29uIGFzIGFueSBkYXRhIGlzIHJlY2VpdmVkLgotICAgKgotICAgKiBAcGFyYW0gaW50ICRsZW4gTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KLSAgICogQHJldHVybiBzdHJpbmcgQmluYXJ5IGRhdGEKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pIHsKLSAgICAkbnVsbCA9IG51bGw7Ci0gICAgJHJlYWQgPSBhcnJheSgkdGhpcy0+aGFuZGxlXyk7Ci0gICAgJHJlYWRhYmxlID0gQHN0cmVhbV9zZWxlY3QoJHJlYWQsICRudWxsLCAkbnVsbCwgJHRoaXMtPnJlY3ZUaW1lb3V0U2VjXywgJHRoaXMtPnJlY3ZUaW1lb3V0VXNlY18pOwotCi0gICAgaWYgKCRyZWFkYWJsZSA+IDApIHsKLSAgICAgICRkYXRhID0gQHN0cmVhbV9zb2NrZXRfcmVjdmZyb20oJHRoaXMtPmhhbmRsZV8sICRsZW4pOwotICAgICAgaWYgKCRkYXRhID09PSBmYWxzZSkgewotICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcyBmcm9tICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgfSBlbHNlaWYoJGRhdGEgPT0gJycgJiYgZmVvZigkdGhpcy0+aGFuZGxlXykpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldCByZWFkIDAgYnl0ZXMnKTsKLSAgICAgICAgfQotCi0gICAgICByZXR1cm4gJGRhdGE7Ci0gICAgfSBlbHNlIGlmICgkcmVhZGFibGUgPT09IDApIHsKLSAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCByZWFkaW5nICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgfQotICAgIH0KLQotICAvKioKLSAgICogV3JpdGUgdG8gdGhlIHNvY2tldC4KLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkYnVmIFRoZSBkYXRhIHRvIHdyaXRlCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikgewotICAgICRudWxsID0gbnVsbDsKLSAgICAkd3JpdGUgPSBhcnJheSgkdGhpcy0+aGFuZGxlXyk7Ci0KLSAgICAvLyBrZWVwIHdyaXRpbmcgdW50aWwgYWxsIHRoZSBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4KLSAgICB3aGlsZSAoc3RybGVuKCRidWYpID4gMCkgewotICAgICAgLy8gd2FpdCBmb3Igc3RyZWFtIHRvIGJlY29tZSBhdmFpbGFibGUgZm9yIHdyaXRpbmcKLSAgICAgICR3cml0YWJsZSA9IEBzdHJlYW1fc2VsZWN0KCRudWxsLCAkd3JpdGUsICRudWxsLCAkdGhpcy0+c2VuZFRpbWVvdXRTZWNfLCAkdGhpcy0+c2VuZFRpbWVvdXRVc2VjXyk7Ci0gICAgICBpZiAoJHdyaXRhYmxlID4gMCkgewotICAgICAgICAvLyB3cml0ZSBidWZmZXIgdG8gc3RyZWFtCi0gICAgICAgICR3cml0dGVuID0gQHN0cmVhbV9zb2NrZXRfc2VuZHRvKCR0aGlzLT5oYW5kbGVfLCAkYnVmKTsKLSAgICAgICAgaWYgKCR3cml0dGVuID09PSAtMSB8fCAkd3JpdHRlbiA9PT0gZmFsc2UpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHdyaXRlICcuc3RybGVuKCRidWYpLicgYnl0ZXMgJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgICB9Ci0gICAgICAgIC8vIGRldGVybWluZSBob3cgbXVjaCBvZiB0aGUgYnVmZmVyIGlzIGxlZnQgdG8gd3JpdGUKLSAgICAgICAgJGJ1ZiA9IHN1YnN0cigkYnVmLCAkd3JpdHRlbik7Ci0gICAgICB9IGVsc2UgaWYgKCR3cml0YWJsZSA9PT0gMCkgewotICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUU29ja2V0OiB0aW1lZCBvdXQgd3JpdGluZyAnLnN0cmxlbigkYnVmKS4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHdyaXRlICcuc3RybGVuKCRidWYpLicgYnl0ZXMgJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0Xy4nOicuJHRoaXMtPnBvcnRfKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAvKioKLSAgICogRmx1c2ggb3V0cHV0IHRvIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIFNpbmNlIHJlYWQoKSwgcmVhZEFsbCgpIGFuZCB3cml0ZSgpIG9wZXJhdGUgb24gdGhlIHNvY2tldHMgZGlyZWN0bHksCi0gICAqIHRoaXMgaXMgYSBuby1vcAotICAgKgotICAgKiBJZiB5b3Ugd2lzaCB0byBoYXZlIGZsdXNoYWJsZSBidWZmZXJpbmcgYmVoYXZpb3VyLCB3cmFwIHRoaXMgVFNvY2tldAotICAgKiBpbiBhIFRCdWZmZXJlZFRyYW5zcG9ydC4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpIHsKLSAgICAvLyBuby1vcAotICAgIH0KLSAgfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocCBiL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UU29ja2V0UG9vbC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNDZjMzYuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLQotCi0vKiogSW5oZXJpdHMgZnJvbSBTb2NrZXQgKi8KLWluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3RyYW5zcG9ydC9UU29ja2V0LnBocCc7Ci0KLS8qKgotICogVGhpcyBsaWJyYXJ5IG1ha2VzIHVzZSBvZiBBUEMgY2FjaGUgdG8gbWFrZSBob3N0cyBhcyBkb3duIGluIGEgd2ViCi0gKiBlbnZpcm9ubWVudC4gSWYgeW91IGFyZSBydW5uaW5nIGZyb20gdGhlIENMSSBvciBvbiBhIHN5c3RlbSB3aXRob3V0IEFQQwotICogaW5zdGFsbGVkLCB0aGVuIHRoZXNlIG51bGwgZnVuY3Rpb25zIHdpbGwgc3RlcCBpbiBhbmQgYWN0IGxpa2UgY2FjaGUKLSAqIG1pc3Nlcy4KLSAqLwotaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2FwY19mZXRjaCcpKSB7Ci0gIGZ1bmN0aW9uIGFwY19mZXRjaCgka2V5KSB7IHJldHVybiBGQUxTRTsgfQotICBmdW5jdGlvbiBhcGNfc3RvcmUoJGtleSwgJHZhciwgJHR0bD0wKSB7IHJldHVybiBGQUxTRTsgfQotfQotCi0vKioKLSAqIFNvY2tldHMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlIHRoYXQgYWxsb3dzIGNvbm5lY3Rpb24KLSAqIHRvIGEgcG9vbCBvZiBzZXJ2ZXJzLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVFNvY2tldFBvb2wgZXh0ZW5kcyBUU29ja2V0IHsKLQotICAvKioKLSAgICogUmVtb3RlIHNlcnZlcnMuIEFycmF5IG9mIGFzc29jaWF0aXZlIGFycmF5cyB3aXRoICdob3N0JyBhbmQgJ3BvcnQnIGtleXMKLSAgICovCi0gIHByaXZhdGUgJHNlcnZlcnNfID0gYXJyYXkoKTsKLQotICAvKioKLSAgICogSG93IG1hbnkgdGltZXMgdG8gcmV0cnkgZWFjaCBob3N0IGluIGNvbm5lY3QKLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJG51bVJldHJpZXNfID0gMTsKLQotICAvKioKLSAgICogUmV0cnkgaW50ZXJ2YWwgaW4gc2Vjb25kcywgaG93IGxvbmcgdG8gbm90IHRyeSBhIGhvc3QgaWYgaXQgaGFzIGJlZW4KLSAgICogbWFya2VkIGFzIGRvd24uCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcml2YXRlICRyZXRyeUludGVydmFsXyA9IDYwOwotCi0gIC8qKgotICAgKiBNYXggY29uc2VjdXRpdmUgZmFpbHVyZXMgYmVmb3JlIG1hcmtpbmcgYSBob3N0IGRvd24uCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcml2YXRlICRtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXyA9IDE7Ci0KLSAgLyoqCi0gICAqIFRyeSBob3N0cyBpbiBvcmRlcj8gb3IgUmFuZG9taXplZD8KLSAgICoKLSAgICogQHZhciBib29sCi0gICAqLwotICBwcml2YXRlICRyYW5kb21pemVfID0gVFJVRTsKLQotICAvKioKLSAgICogQWx3YXlzIHRyeSBsYXN0IGhvc3QsIGV2ZW4gaWYgbWFya2VkIGRvd24/Ci0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkYWx3YXlzVHJ5TGFzdF8gPSBUUlVFOwotCi0gIC8qKgotICAgKiBTb2NrZXQgcG9vbCBjb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gYXJyYXkgICRob3N0cyAgICAgICAgTGlzdCBvZiByZW1vdGUgaG9zdG5hbWVzCi0gICAqIEBwYXJhbSBtaXhlZCAgJHBvcnRzICAgICAgICBBcnJheSBvZiByZW1vdGUgcG9ydHMsIG9yIGEgc2luZ2xlIGNvbW1vbiBwb3J0Ci0gICAqIEBwYXJhbSBib29sICAgJHBlcnNpc3QgICAgICBXaGV0aGVyIHRvIHVzZSBhIHBlcnNpc3RlbnQgc29ja2V0Ci0gICAqIEBwYXJhbSBtaXhlZCAgJGRlYnVnSGFuZGxlciBGdW5jdGlvbiBmb3IgZXJyb3IgbG9nZ2luZwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRob3N0cz1hcnJheSgnbG9jYWxob3N0JyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcG9ydHM9YXJyYXkoOTA5MCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGVyc2lzdD1GQUxTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkZWJ1Z0hhbmRsZXI9bnVsbCkgewotICAgIHBhcmVudDo6X19jb25zdHJ1Y3QobnVsbCwgMCwgJHBlcnNpc3QsICRkZWJ1Z0hhbmRsZXIpOwotCi0gICAgaWYgKCFpc19hcnJheSgkcG9ydHMpKSB7Ci0gICAgICAkcG9ydCA9ICRwb3J0czsKLSAgICAgICRwb3J0cyA9IGFycmF5KCk7Ci0gICAgICBmb3JlYWNoICgkaG9zdHMgYXMgJGtleSA9PiAkdmFsKSB7Ci0gICAgICAgICRwb3J0c1ska2V5XSA9ICRwb3J0OwotICAgICAgfQotICAgIH0KLQotICAgIGZvcmVhY2ggKCRob3N0cyBhcyAka2V5ID0+ICRob3N0KSB7Ci0gICAgICAkdGhpcy0+c2VydmVyc18gW109IGFycmF5KCdob3N0JyA9PiAkaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BvcnQnID0+ICRwb3J0c1ska2V5XSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHNlcnZlciB0byB0aGUgcG9vbAotICAgKgotICAgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHByZXZlbnQgeW91IGZyb20gYWRkaW5nIGEgZHVwbGljYXRlIHNlcnZlciBlbnRyeS4KLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBob3N0bmFtZSBvciBJUAotICAgKiBAcGFyYW0gaW50ICRwb3J0IHBvcnQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBhZGRTZXJ2ZXIoJGhvc3QsICRwb3J0KSB7Ci0gICAgJHRoaXMtPnNlcnZlcnNfW10gPSBhcnJheSgnaG9zdCcgPT4gJGhvc3QsICdwb3J0JyA9PiAkcG9ydCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyBob3cgbWFueSB0aW1lIHRvIGtlZXAgcmV0cnlpbmcgYSBob3N0IGluIHRoZSBjb25uZWN0IGZ1bmN0aW9uLgotICAgKgotICAgKiBAcGFyYW0gaW50ICRudW1SZXRyaWVzCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0TnVtUmV0cmllcygkbnVtUmV0cmllcykgewotICAgICR0aGlzLT5udW1SZXRyaWVzXyA9ICRudW1SZXRyaWVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgaG93IGxvbmcgdG8gd2FpdCB1bnRpbCByZXRyeWluZyBhIGhvc3QgaWYgaXQgd2FzIG1hcmtlZCBkb3duCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJG51bVJldHJpZXMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRSZXRyeUludGVydmFsKCRyZXRyeUludGVydmFsKSB7Ci0gICAgJHRoaXMtPnJldHJ5SW50ZXJ2YWxfID0gJHJldHJ5SW50ZXJ2YWw7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyBob3cgbWFueSB0aW1lIHRvIGtlZXAgcmV0cnlpbmcgYSBob3N0IGJlZm9yZSBtYXJraW5nIGl0IGFzIGRvd24uCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJG51bVJldHJpZXMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRNYXhDb25zZWN1dGl2ZUZhaWx1cmVzKCRtYXhDb25zZWN1dGl2ZUZhaWx1cmVzKSB7Ci0gICAgJHRoaXMtPm1heENvbnNlY3V0aXZlRmFpbHVyZXNfID0gJG1heENvbnNlY3V0aXZlRmFpbHVyZXM7Ci0gIH0KLQotICAvKioKLSAgICogVHVybnMgcmFuZG9taXphdGlvbiBpbiBjb25uZWN0IG9yZGVyIG9uIG9yIG9mZi4KLSAgICoKLSAgICogQHBhcmFtIGJvb2wgJHJhbmRvbWl6ZQotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldFJhbmRvbWl6ZSgkcmFuZG9taXplKSB7Ci0gICAgJHRoaXMtPnJhbmRvbWl6ZV8gPSAkcmFuZG9taXplOwotICB9Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdG8gYWx3YXlzIHRyeSB0aGUgbGFzdCBzZXJ2ZXIuCi0gICAqCi0gICAqIEBwYXJhbSBib29sICRhbHdheXNUcnlMYXN0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0QWx3YXlzVHJ5TGFzdCgkYWx3YXlzVHJ5TGFzdCkgewotICAgICR0aGlzLT5hbHdheXNUcnlMYXN0XyA9ICRhbHdheXNUcnlMYXN0OwotICB9Ci0KLQotICAvKioKLSAgICogQ29ubmVjdHMgdGhlIHNvY2tldCBieSBpdGVyYXRpbmcgdGhyb3VnaCBhbGwgdGhlIHNlcnZlcnMgaW4gdGhlIHBvb2wKLSAgICogYW5kIHRyeWluZyB0byBmaW5kIG9uZSB0aGF0IHdvcmtzLgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKSB7Ci0gICAgLy8gQ2hlY2sgaWYgd2Ugd2FudCBvcmRlciByYW5kb21pemF0aW9uCi0gICAgaWYgKCR0aGlzLT5yYW5kb21pemVfKSB7Ci0gICAgICBzaHVmZmxlKCR0aGlzLT5zZXJ2ZXJzXyk7Ci0gICAgfQotCi0gICAgLy8gQ291bnQgc2VydmVycyB0byBpZGVudGlmeSB0aGUgImxhc3QiIG9uZQotICAgICRudW1TZXJ2ZXJzID0gY291bnQoJHRoaXMtPnNlcnZlcnNfKTsKLQotICAgIGZvciAoJGkgPSAwOyAkaSA8ICRudW1TZXJ2ZXJzOyArKyRpKSB7Ci0KLSAgICAgIC8vIFRoaXMgZXh0cmFjdHMgdGhlICRob3N0IGFuZCAkcG9ydCB2YXJpYWJsZXMKLSAgICAgIGV4dHJhY3QoJHRoaXMtPnNlcnZlcnNfWyRpXSk7Ci0KLSAgICAgIC8vIENoZWNrIEFQQyBjYWNoZSBmb3IgYSByZWNvcmQgb2YgdGhpcyBzZXJ2ZXIgYmVpbmcgZG93bgotICAgICAgJGZhaWx0aW1lS2V5ID0gJ3RocmlmdF9mYWlsdGltZTonLiRob3N0Lic6Jy4kcG9ydC4nfic7Ci0KLSAgICAgIC8vIENhY2hlIG1pc3M/IEFzc3VtZSBpdCdzIE9LCi0gICAgICAkbGFzdEZhaWx0aW1lID0gYXBjX2ZldGNoKCRmYWlsdGltZUtleSk7Ci0gICAgICBpZiAoJGxhc3RGYWlsdGltZSA9PT0gRkFMU0UpIHsKLSAgICAgICAgJGxhc3RGYWlsdGltZSA9IDA7Ci0gICAgICB9Ci0KLSAgICAgICRyZXRyeUludGVydmFsUGFzc2VkID0gRkFMU0U7Ci0KLSAgICAgIC8vIENhY2hlIGhpdC4uLm1ha2Ugc3VyZSBlbm91Z2ggdGhlIHJldHJ5IGludGVydmFsIGhhcyBlbGFwc2VkCi0gICAgICBpZiAoJGxhc3RGYWlsdGltZSA+IDApIHsKLSAgICAgICAgJGVsYXBzZWQgPSB0aW1lKCkgLSAkbGFzdEZhaWx0aW1lOwotICAgICAgICBpZiAoJGVsYXBzZWQgPiAkdGhpcy0+cmV0cnlJbnRlcnZhbF8pIHsKLSAgICAgICAgICAkcmV0cnlJbnRlcnZhbFBhc3NlZCA9IFRSVUU7Ci0gICAgICAgICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKLSAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5kZWJ1Z0hhbmRsZXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXRQb29sOiByZXRyeUludGVydmFsICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAnKCcuJHRoaXMtPnJldHJ5SW50ZXJ2YWxfLicpICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAnaGFzIHBhc3NlZCBmb3IgaG9zdCAnLiRob3N0Lic6Jy4kcG9ydCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIE9ubHkgY29ubmVjdCBpZiBub3QgaW4gdGhlIG1pZGRsZSBvZiBhIGZhaWwgaW50ZXJ2YWwsIE9SIGlmIHRoaXMKLSAgICAgIC8vIGlzIHRoZSBMQVNUIHNlcnZlciB3ZSBhcmUgdHJ5aW5nLCBqdXN0IGhhbW1lciBhd2F5IG9uIGl0Ci0gICAgICAkaXNMYXN0U2VydmVyID0gRkFMU0U7Ci0gICAgICBpZiAoJHRoaXMtPmFsd2F5c1RyeUxhc3RfKSB7Ci0gICAgICAgICRpc0xhc3RTZXJ2ZXIgPSAoJGkgPT0gKCRudW1TZXJ2ZXJzIC0gMSkpOwotICAgICAgfQotCi0gICAgICBpZiAoKCRsYXN0RmFpbHRpbWUgPT09IDApIHx8Ci0gICAgICAgICAgKCRpc0xhc3RTZXJ2ZXIpIHx8Ci0gICAgICAgICAgKCRsYXN0RmFpbHRpbWUgPiAwICYmICRyZXRyeUludGVydmFsUGFzc2VkKSkgewotCi0gICAgICAgIC8vIFNldCB1bmRlcmx5aW5nIFRTb2NrZXQgcGFyYW1zIHRvIHRoaXMgb25lCi0gICAgICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OwotICAgICAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKLQotICAgICAgICAvLyBUcnkgdXAgdG8gbnVtUmV0cmllc18gY29ubmVjdGlvbnMgcGVyIHNlcnZlcgotICAgICAgICBmb3IgKCRhdHRlbXB0ID0gMDsgJGF0dGVtcHQgPCAkdGhpcy0+bnVtUmV0cmllc187ICRhdHRlbXB0KyspIHsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gVXNlIHRoZSB1bmRlcmx5aW5nIFRTb2NrZXQgb3BlbiBmdW5jdGlvbgotICAgICAgICAgICAgcGFyZW50OjpvcGVuKCk7Ci0KLSAgICAgICAgICAgIC8vIE9ubHkgY2xlYXIgdGhlIGZhaWx1cmUgY291bnRzIGlmIHJlcXVpcmVkIHRvIGRvIHNvCi0gICAgICAgICAgICBpZiAoJGxhc3RGYWlsdGltZSA+IDApIHsKLSAgICAgICAgICAgICAgYXBjX3N0b3JlKCRmYWlsdGltZUtleSwgMCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFN1Y2Nlc3NmdWwgY29ubmVjdGlvbiwgcmV0dXJuIG5vdwotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiAkdHgpIHsKLSAgICAgICAgICAgIC8vIENvbm5lY3Rpb24gZmFpbGVkCi0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWFyayBmYWlsdXJlIG9mIHRoaXMgaG9zdCBpbiB0aGUgY2FjaGUKLSAgICAgICAgJGNvbnNlY2ZhaWxzS2V5ID0gJ3RocmlmdF9jb25zZWNmYWlsczonLiRob3N0Lic6Jy4kcG9ydC4nfic7Ci0KLSAgICAgICAgLy8gSWdub3JlIGNhY2hlIG1pc3NlcwotICAgICAgICAkY29uc2VjZmFpbHMgPSBhcGNfZmV0Y2goJGNvbnNlY2ZhaWxzS2V5KTsKLSAgICAgICAgaWYgKCRjb25zZWNmYWlscyA9PT0gRkFMU0UpIHsKLSAgICAgICAgICAkY29uc2VjZmFpbHMgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSW5jcmVtZW50IGJ5IG9uZQotICAgICAgICAkY29uc2VjZmFpbHMrKzsKLQotICAgICAgICAvLyBMb2cgYW5kIGNhY2hlIHRoaXMgZmFpbHVyZQotICAgICAgICBpZiAoJGNvbnNlY2ZhaWxzID49ICR0aGlzLT5tYXhDb25zZWN1dGl2ZUZhaWx1cmVzXykgewotICAgICAgICAgIGlmICgkdGhpcy0+ZGVidWdfKSB7Ci0gICAgICAgICAgICBjYWxsX3VzZXJfZnVuYygkdGhpcy0+ZGVidWdIYW5kbGVyXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICdUU29ja2V0UG9vbDogbWFya2luZyAnLiRob3N0Lic6Jy4kcG9ydC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICcgYXMgZG93biBmb3IgJy4kdGhpcy0+cmV0cnlJbnRlcnZhbF8uJyBzZWNzICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAnYWZ0ZXIgJy4kY29uc2VjZmFpbHMuJyBmYWlsZWQgYXR0ZW1wdHMuJyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIFN0b3JlIHRoZSBmYWlsdXJlIHRpbWUKLSAgICAgICAgICBhcGNfc3RvcmUoJGZhaWx0aW1lS2V5LCB0aW1lKCkpOwotCi0gICAgICAgICAgLy8gQ2xlYXIgdGhlIGNvdW50IG9mIGNvbnNlY3V0aXZlIGZhaWx1cmVzCi0gICAgICAgICAgYXBjX3N0b3JlKCRjb25zZWNmYWlsc0tleSwgMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYXBjX3N0b3JlKCRjb25zZWNmYWlsc0tleSwgJGNvbnNlY2ZhaWxzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIE9oIG5vOyB3ZSBmYWlsZWQgdGhlbSBhbGwuIFRoZSBzeXN0ZW0gaXMgdG90YWxseSBpbGwhCi0gICAgJGVycm9yID0gJ1RTb2NrZXRQb29sOiBBbGwgaG9zdHMgaW4gcG9vbCBhcmUgZG93bi4gJzsKLSAgICAkaG9zdHMgPSBhcnJheSgpOwotICAgIGZvcmVhY2ggKCR0aGlzLT5zZXJ2ZXJzXyBhcyAkc2VydmVyKSB7Ci0gICAgICAkaG9zdHMgW109ICRzZXJ2ZXJbJ2hvc3QnXS4nOicuJHNlcnZlclsncG9ydCddOwotICAgIH0KLSAgICAkaG9zdGxpc3QgPSBpbXBsb2RlKCcsJywgJGhvc3RzKTsKLSAgICAkZXJyb3IgLj0gJygnLiRob3N0bGlzdC4nKSc7Ci0gICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKLSAgICAgIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5kZWJ1Z0hhbmRsZXJfLCAkZXJyb3IpOwotICAgIH0KLSAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigkZXJyb3IpOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5waHAgYi9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZTMzNmQuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi0KLS8qKgotICogVHJhbnNwb3J0IGV4Y2VwdGlvbnMKLSAqLwotY2xhc3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24gewotCi0gIGNvbnN0IFVOS05PV04gPSAwOwotICBjb25zdCBOT1RfT1BFTiA9IDE7Ci0gIGNvbnN0IEFMUkVBRFlfT1BFTiA9IDI7Ci0gIGNvbnN0IFRJTUVEX09VVCA9IDM7Ci0gIGNvbnN0IEVORF9PRl9GSUxFID0gNDsKLQotICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZT1udWxsLCAkY29kZT0wKSB7Ci0gICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOwotICB9Ci19Ci0KLS8qKgotICogQmFzZSBpbnRlcmZhY2UgZm9yIGEgdHJhbnNwb3J0IGFnZW50LgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotYWJzdHJhY3QgY2xhc3MgVFRyYW5zcG9ydCB7Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgb3Blbi4KLSAgICoKLSAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgb3BlbgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIGlzT3BlbigpOwotCi0gIC8qKgotICAgKiBPcGVuIHRoZSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcvd3JpdGluZwotICAgKgotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IG9wZW4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiBvcGVuKCk7Ci0KLSAgLyoqCi0gICAqIENsb3NlIHRoZSB0cmFuc3BvcnQuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gY2xvc2UoKTsKLQotICAvKioKLSAgICogUmVhZCBzb21lIGRhdGEgaW50byB0aGUgYXJyYXkuCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgICAgJGxlbiBIb3cgbXVjaCB0byByZWFkCi0gICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IHJlYWQgYW55IG1vcmUgZGF0YQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWQoJGxlbik7Ci0KLSAgLyoqCi0gICAqIEd1YXJhbnRlZXMgdGhhdCB0aGUgZnVsbCBhbW91bnQgb2YgZGF0YSBpcyByZWFkLgotICAgKgotICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YSwgb2YgZXhhY3QgbGVuZ3RoCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3QgcmVhZCBkYXRhCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEFsbCgkbGVuKSB7Ci0gICAgLy8gcmV0dXJuICR0aGlzLT5yZWFkKCRsZW4pOwotCi0gICAgJGRhdGEgPSAnJzsKLSAgICAkZ290ID0gMDsKLSAgICB3aGlsZSAoKCRnb3QgPSBzdHJsZW4oJGRhdGEpKSA8ICRsZW4pIHsKLSAgICAgICRkYXRhIC49ICR0aGlzLT5yZWFkKCRsZW4gLSAkZ290KTsKLSAgICB9Ci0gICAgcmV0dXJuICRkYXRhOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyB0aGUgZ2l2ZW4gZGF0YSBvdXQuCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiAgVGhlIGRhdGEgdG8gd3JpdGUKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdyaXRpbmcgZmFpbHMKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZSgkYnVmKTsKLQotICAvKioKLSAgICogRmx1c2hlcyBhbnkgcGVuZGluZyBkYXRhIG91dCBvZiBhIGJ1ZmZlcgotICAgKgotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYSB3cml0aW5nIGVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkge30KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5waHAgYi9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzBhNjVhLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3BocAotCi1jbGFzcyBUVHJhbnNwb3J0RmFjdG9yeSB7Ci0gIC8qKgotICAgKiBAc3RhdGljCi0gICAqIEBwYXJhbSBUVHJhbnNwb3J0ICR0cmFuc3BvcnQKLSAgICogQHJldHVybiBUVHJhbnNwb3J0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydChUVHJhbnNwb3J0ICR0cmFuc3BvcnQpIHsKLSAgICByZXR1cm4gJHRyYW5zcG9ydDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L0ZpeHR1cmVzLnBocCBiL2xpYi9waHAvdGVzdC9GaXh0dXJlcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1N2Q4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9GaXh0dXJlcy5waHAKQEAgLTAsMCArMSwxOTQgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnQ7CisKK3VzZSBUaHJpZnRUZXN0XFh0cnVjdDsKK3VzZSBUaHJpZnRUZXN0XFh0cnVjdDI7Cit1c2UgVGhyaWZ0VGVzdFxOdW1iZXJ6OwordXNlIFRocmlmdFRlc3RcSW5zYW5pdHk7CisKK2NsYXNzIEZpeHR1cmVzCit7CisgICAgcHVibGljIHN0YXRpYyAkYnVmc2l6ZSA9IDgxOTI7IC8vYmlnIGVub3VnaCB0byByZWFkIGJpZ2dlc3Qgc2VyaWFsaXplZCBGaXh0dXJlIGFyZy4KKyAgICBwdWJsaWMgc3RhdGljICR0ZXN0QXJncyA9IGFycmF5KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBvcHVsYXRlVGVzdEFyZ3MoKQorICAgIHsKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzInXSA9CisgICAgICAgICAgICAicXVvdGU6IFxcXCIgYmFja3NsYXNoOiIgLgorICAgICAgICAgICAgIiBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXFwvICIgLgorICAgICAgICAgICAgIiBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogIiAuCisgICAgICAgICAgICAiIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogXCJcXFwvXGJcblxyXHQiIC4KKyAgICAgICAgICAgICIgbm93LWEtYnVuY2gtb2YtanVuazogIUAjXCQlJigpKCYlJCN7fXt9PD48PjwiOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzMnXSA9CisgICAgICAgICAgICAic3RyaW5nIHRoYXQgZW5kcyBpbiBkb3VibGUtYmFja3NsYXNoIFxcXFwiOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFVuaWNvZGVTdHJpbmdXaXRoTm9uQk1QJ10gPQorICAgICAgICAgICAgIuC4quC4p+C4seC4quC4lOC4tS/wnZKvIjsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3REb3VibGUnXSA9IDMuMTQxNTkyNjUzNTg5ODsKKworICAgICAgICAvLyBUT0RPOiBhZGQgdGVzdEJpbmFyeSgpIGNhbGwKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RCeXRlJ10gPSAweDAxOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEkzMiddID0gcG93KDIsIDMwKTsKKworICAgICAgICBpZiAoUEhQX0lOVF9TSVpFID09IDgpIHsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEk2NCddID0gcG93KDIsIDYwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEk2NCddID0gIjExNTI5MjE1MDQ2MDY4NDcwMDAiOworICAgICAgICB9CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RydWN0J10gPQorICAgICAgICAgICAgbmV3IFh0cnVjdCgKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ3dvcmtlZCcsCisgICAgICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiAweDAxLAorICAgICAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiBwb3coMiwgMzApLAorICAgICAgICAgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TmVzdE5lc3RlZCddID0KKyAgICAgICAgICAgIG5ldyBYdHJ1Y3QoCisgICAgICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICd3b3JrZWQnLAorICAgICAgICAgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4gMHgwMSwKKyAgICAgICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gcG93KDIsIDMwKSwKKyAgICAgICAgICAgICAgICAgICAgJ2k2NF90aGluZycgPT4gc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STY0J10KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXSA9CisgICAgICAgICAgICBuZXcgWHRydWN0MigKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDB4MDEsCisgICAgICAgICAgICAgICAgICAgICdzdHJ1Y3RfdGhpbmcnID0+IHNlbGY6OiR0ZXN0QXJnc1sndGVzdE5lc3ROZXN0ZWQnXSwKKyAgICAgICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gcG93KDIsIDE1KQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TWFwJ10gPQorICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgNyA9PiA3NywKKyAgICAgICAgICAgICAgICA4ID0+IDg4LAorICAgICAgICAgICAgICAgIDkgPT4gOTkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nTWFwJ10gPQorICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgImEiID0+ICIxMjMiLAorICAgICAgICAgICAgICAgICJhIGIiID0+ICJ3aXRoIHNwYWNlcyAiLAorICAgICAgICAgICAgICAgICJzYW1lIiA9PiAic2FtZSIsCisgICAgICAgICAgICAgICAgIjAiID0+ICJudW1lcmljIGtleSIsCisgICAgICAgICAgICAgICAgImxvbmdWYWx1ZSIgPT4gc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddLAorICAgICAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzEnXSA9PiAibG9uZyBrZXkiCisgICAgICAgICAgICApOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFNldCddID0gYXJyYXkoMSA9PiB0cnVlLCA1ID0+IHRydWUsIDYgPT4gdHJ1ZSk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TGlzdCddID0gYXJyYXkoMSwgMiwgMyk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0RW51bSddID0gTnVtYmVyejo6T05FOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFR5cGVkZWYnXSA9IDY5OworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdE1hcE1hcEV4cGVjdGVkUmVzdWx0J10gPQorICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgNCA9PiBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgMSA9PiAxLAorICAgICAgICAgICAgICAgICAgICAyID0+IDIsCisgICAgICAgICAgICAgICAgICAgIDMgPT4gMywKKyAgICAgICAgICAgICAgICAgICAgNCA9PiA0LAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgLTQgPT4gYXJyYXkoCisgICAgICAgICAgICAgICAgICAgIC00ID0+IC00LAorICAgICAgICAgICAgICAgICAgICAtMyA9PiAtMywKKyAgICAgICAgICAgICAgICAgICAgLTIgPT4gLTIsCisgICAgICAgICAgICAgICAgICAgIC0xID0+IC0xCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICAvLyB0ZXN0SW5zYW5pdHkgLi4uIHRha2VzIGEgZmV3IHN0ZXBzIHRvIHNldCB1cCEKKworICAgICAgICAkeHRydWN0MSA9CisgICAgICAgICAgICBuZXcgWHRydWN0KAorICAgICAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnR29vZGJ5ZTQnLAorICAgICAgICAgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4gNCwKKyAgICAgICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gNCwKKyAgICAgICAgICAgICAgICAgICAgJ2k2NF90aGluZycgPT4gNAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgJHh0cnVjdDIgPQorICAgICAgICAgICAgbmV3IFh0cnVjdCgKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ0hlbGxvMicsCisgICAgICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiAyLAorICAgICAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiAyLAorICAgICAgICAgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiAyCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICAkdXNlck1hcCA9CisgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICBOdW1iZXJ6OjpGSVZFID0+IDUsCisgICAgICAgICAgICAgICAgTnVtYmVyejo6RUlHSFQgPT4gOAorICAgICAgICAgICAgKTsKKworICAgICAgICAkaW5zYW5pdHkyID0KKyAgICAgICAgICAgIG5ldyBJbnNhbml0eSgKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ3VzZXJNYXAnID0+ICR1c2VyTWFwLAorICAgICAgICAgICAgICAgICAgICAneHRydWN0cycgPT4gYXJyYXkoJHh0cnVjdDEsICR4dHJ1Y3QyKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgJGluc2FuaXR5MyA9ICRpbnNhbml0eTI7CisKKyAgICAgICAgJGluc2FuaXR5NiA9CisgICAgICAgICAgICBuZXcgSW5zYW5pdHkoCisgICAgICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgICAgICd1c2VyTWFwJyA9PiBudWxsLAorICAgICAgICAgICAgICAgICAgICAneHRydWN0cycgPT4gbnVsbAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0SW5zYW5pdHlFeHBlY3RlZFJlc3VsdCddID0KKyAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICIxIiA9PiBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgTnVtYmVyejo6VFdPID0+ICRpbnNhbml0eTIsCisgICAgICAgICAgICAgICAgICAgIE51bWJlcno6OlRIUkVFID0+ICRpbnNhbml0eTMKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICIyIiA9PiBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgTnVtYmVyejo6U0lYID0+ICRpbnNhbml0eTYKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9Kc29uU2VyaWFsaXplL0pzb25TZXJpYWxpemVUZXN0LnBocCBiL2xpYi9waHAvdGVzdC9Kc29uU2VyaWFsaXplL0pzb25TZXJpYWxpemVUZXN0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjY4NjUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L0pzb25TZXJpYWxpemUvSnNvblNlcmlhbGl6ZVRlc3QucGhwCkBAIC0wLDAgKzEsMTE2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnRcSnNvblNlcmlhbGl6ZTsKKwordXNlIFBIUFVuaXRcRnJhbWV3b3JrXFRlc3RDYXNlOwordXNlIHN0ZENsYXNzOworCityZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworCisvKioKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgSnNvblNlcmlhbGl6ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzZXRVcCgpCisgICAgeworICAgICAgICBpZiAodmVyc2lvbl9jb21wYXJlKHBocHZlcnNpb24oKSwgJzUuNCcsICc8JykpIHsKKyAgICAgICAgICAgICR0aGlzLT5tYXJrVGVzdFNraXBwZWQoJ1JlcXVpcmVzIFBIUCA1LjQgb3IgbmV3ZXIhJyk7CisgICAgICAgIH0KKyAgICAgICAgLyoqIEB2YXIgXENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyICRsb2FkZXIgKi8KKyAgICAgICAgJGxvYWRlciA9IHJlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisgICAgICAgICRsb2FkZXItPmFkZFBzcjQoJycsIF9fRElSX18gLiAnLy4uL3BhY2thZ2VzL3BocGpzJyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbXB0eVN0cnVjdCgpCisgICAgeworICAgICAgICAkZW1wdHkgPSBuZXcgXFRocmlmdFRlc3RcRW1wdHlTdHJ1Y3QoYXJyYXkoJ25vbl9leGlzdGluZ19rZXknID0+ICdiYXInKSk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMobmV3IHN0ZENsYXNzKCksIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCRlbXB0eSkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZ3NBbmRJbnRzKCkKKyAgICB7CisgICAgICAgICRpbnB1dCA9IGFycmF5KAorICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ2ZvbycsCisgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiAxMjM0NTY3ODkwLAorICAgICAgICApOworICAgICAgICAkeHRydWN0ID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdCgkaW5wdXQpOworCisgICAgICAgIC8vIFh0cnVjdCdzICdpMzJfdGhpbmcnIGFuZCAnYnl0ZV90aGluZycgZmllbGRzIHNob3VsZCBub3QgYmUgcHJlc2VudCBoZXJlIQorICAgICAgICAkZXhwZWN0ZWQgPSBuZXcgc3RkQ2xhc3MoKTsKKyAgICAgICAgJGV4cGVjdGVkLT5zdHJpbmdfdGhpbmcgPSAkaW5wdXRbJ3N0cmluZ190aGluZyddOworICAgICAgICAkZXhwZWN0ZWQtPmk2NF90aGluZyA9ICRpbnB1dFsnaTY0X3RoaW5nJ107CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCBqc29uX2RlY29kZShqc29uX2VuY29kZSgkeHRydWN0KSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TmVzdGVkU3RydWN0cygpCisgICAgeworICAgICAgICAkeHRydWN0MiA9IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QyKGFycmF5KAorICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDQyLAorICAgICAgICAgICAgJ3N0cnVjdF90aGluZycgPT4gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdChhcnJheSgKKyAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiAxMjM0NTYsCisgICAgICAgICAgICApKSwKKyAgICAgICAgKSk7CisKKyAgICAgICAgJGV4cGVjdGVkID0gbmV3IHN0ZENsYXNzKCk7CisgICAgICAgICRleHBlY3RlZC0+Ynl0ZV90aGluZyA9ICR4dHJ1Y3QyLT5ieXRlX3RoaW5nOworICAgICAgICAkZXhwZWN0ZWQtPnN0cnVjdF90aGluZyA9IG5ldyBzdGRDbGFzcygpOworICAgICAgICAkZXhwZWN0ZWQtPnN0cnVjdF90aGluZy0+aTMyX3RoaW5nID0gJHh0cnVjdDItPnN0cnVjdF90aGluZy0+aTMyX3RoaW5nOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwganNvbl9kZWNvZGUoanNvbl9lbmNvZGUoJHh0cnVjdDIpKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJbnNhbml0eSgpCisgICAgeworICAgICAgICAkeGlucHV0ID0gYXJyYXkoJ3N0cmluZ190aGluZycgPT4gJ2ZvbycpOworICAgICAgICAkeHRydWN0ID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdCgkeGlucHV0KTsKKyAgICAgICAgJGluc2FuaXR5ID0gbmV3IFxUaHJpZnRUZXN0XEluc2FuaXR5KGFycmF5KAorICAgICAgICAgICAgJ3h0cnVjdHMnID0+IGFycmF5KCR4dHJ1Y3QsICR4dHJ1Y3QsICR4dHJ1Y3QpCisgICAgICAgICkpOworICAgICAgICAkZXhwZWN0ZWQgPSBuZXcgc3RkQ2xhc3MoKTsKKyAgICAgICAgJGV4cGVjdGVkLT54dHJ1Y3RzID0gYXJyYXkoKG9iamVjdCkkeGlucHV0LCAob2JqZWN0KSR4aW5wdXQsIChvYmplY3QpJHhpbnB1dCk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCBqc29uX2RlY29kZShqc29uX2VuY29kZSgkaW5zYW5pdHkpKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0ZWRMaXN0cygpCisgICAgeworICAgICAgICAkYm9uayA9IG5ldyBcVGhyaWZ0VGVzdFxCb25rKGFycmF5KCdtZXNzYWdlJyA9PiAnZm9vJykpOworICAgICAgICAkbmVzdGVkID0gbmV3IFxUaHJpZnRUZXN0XE5lc3RlZExpc3RzQm9uayhhcnJheSgnYm9uaycgPT4gYXJyYXkoYXJyYXkoYXJyYXkoJGJvbmspKSkpKTsKKyAgICAgICAgJGV4cGVjdGVkID0gbmV3IHN0ZENsYXNzKCk7CisgICAgICAgICRleHBlY3RlZC0+Ym9uayA9IGFycmF5KGFycmF5KGFycmF5KChvYmplY3QpYXJyYXkoJ21lc3NhZ2UnID0+ICdmb28nKSkpKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCRuZXN0ZWQpKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBzKCkKKyAgICB7CisgICAgICAgICRpbnRtYXAgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoWyd0aGluZycgPT4gWzAgPT4gJ3plcm8nXV0pOworICAgICAgICAkZW1wdHltYXAgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoW10pOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCd7InRoaW5nIjp7IjAiOiJ6ZXJvIn19JywganNvbl9lbmNvZGUoJGludG1hcCkpOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCd7fScsIGpzb25fZW5jb2RlKCRlbXB0eW1hcCkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U2NhbGFyVHlwZXMoKQorICAgIHsKKyAgICAgICAgJGIgPSBuZXcgXFRocmlmdFRlc3RcQm9vbHMoWydpbV90cnVlJyA9PiAnMScsICdpbV9mYWxzZScgPT4gJzAnXSk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJ3siaW1fdHJ1ZSI6dHJ1ZSwiaW1fZmFsc2UiOmZhbHNlfScsIGpzb25fZW5jb2RlKCRiKSk7CisgICAgICAgICRzID0gbmV3IFxUaHJpZnRUZXN0XFN0cnVjdEEoWydzJyA9PiA0Ml0pOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCd7InMiOiI0MiJ9JywganNvbl9lbmNvZGUoJHMpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvcGhwL3Rlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDgyNDY4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDUzIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworUEhQVU5JVD1waHAgJCh0b3Bfc3JjZGlyKS92ZW5kb3IvYmluL3BocHVuaXQKKworc3R1YnM6IC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgIFRlc3RWYWxpZGF0b3JzLnRocmlmdAorCW1rZGlyIC1wIC4vcGFja2FnZXMvcGhwCisJJChUSFJJRlQpIC0tZ2VuIHBocCAtciAtLW91dCAuL3BhY2thZ2VzL3BocCAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisJbWtkaXIgLXAgLi9wYWNrYWdlcy9waHB2CisJbWtkaXIgLXAgLi9wYWNrYWdlcy9waHB2bworCW1rZGlyIC1wIC4vcGFja2FnZXMvcGhwanMKKwkkKFRIUklGVCkgLS1nZW4gcGhwOnZhbGlkYXRlICAgICAtciAtLW91dCAuL3BhY2thZ2VzL3BocHYgICBUZXN0VmFsaWRhdG9ycy50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gcGhwOnZhbGlkYXRlLG9vcCAtciAtLW91dCAuL3BhY2thZ2VzL3BocHZvICBUZXN0VmFsaWRhdG9ycy50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gcGhwOmpzb24gICAgICAgICAtciAtLW91dCAuL3BhY2thZ2VzL3BocGpzICBUZXN0VmFsaWRhdG9ycy50aHJpZnQKKworZGVwczogJCh0b3Bfc3JjZGlyKS9jb21wb3Nlci5qc29uCisJY29tcG9zZXIgaW5zdGFsbCAtLXdvcmtpbmctZGlyPSQodG9wX3NyY2RpcikKKworYWxsLWxvY2FsOiBkZXBzCisKK2NoZWNrLWpzb24tc2VyaWFsaXplcjogZGVwcyBzdHVicworCSQoUEhQVU5JVCkgLS1sb2ctanVuaXQ9VEVTVC1sb2ctanNvbi1zZXJpYWxpemVyLnhtbCBKc29uU2VyaWFsaXplLworCitjaGVjay12YWxpZGF0b3I6IGRlcHMgc3R1YnMKKwkkKFBIUFVOSVQpIC0tbG9nLWp1bml0PVRFU1QtbG9nLXZhbGlkYXRvci54bWwgVmFsaWRhdG9yLworCitjaGVjay1wcm90b2NvbDoJZGVwcyBzdHVicworCSQoUEhQVU5JVCkgLS1sb2ctanVuaXQ9VEVTVC1sb2ctcHJvdG9jb2wueG1sIFByb3RvY29sLworCitjaGVjazogZGVwcyBzdHVicyBcCisgIGNoZWNrLXByb3RvY29sIFwKKyAgY2hlY2stdmFsaWRhdG9yIFwKKyAgY2hlY2stanNvbi1zZXJpYWxpemVyCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIC4vcGFja2FnZXMKKwkkKFJNKSBURVNULSoueG1sCmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvQmluYXJ5U2VyaWFsaXplclRlc3QucGhwIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL0JpbmFyeVNlcmlhbGl6ZXJUZXN0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWIwYmI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL0JpbmFyeVNlcmlhbGl6ZXJUZXN0LnBocApAQCAtMCwwICsxLDYwIEBACis8P3BocAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50ZXN0CisgKi8KKworbmFtZXNwYWNlIFRlc3RcVGhyaWZ0XFByb3RvY29sOworCit1c2UgUEhQVW5pdFxGcmFtZXdvcmtcVGVzdENhc2U7Cit1c2UgVGhyaWZ0XFNlcmlhbGl6ZXJcVEJpbmFyeVNlcmlhbGl6ZXI7CisKK3JlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisKKy8qKioKKyAqIFRoaXMgdGVzdCBzdWl0ZSBkZXBlbmRzIG9uIHJ1bm5pbmcgdGhlIGNvbXBpbGVyIGFnYWluc3QgdGhlCisgKiBzdGFuZGFyZCBUaHJpZnRUZXN0LnRocmlmdCBmaWxlOgorICoKKyAqIGxpYi9waHAvdGVzdCQgLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBwaHAgLXIgXAorICogICAtLW91dCAuL3BhY2thZ2VzIC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyAqCisgKiBAcnVuVGVzdHNJblNlcGFyYXRlUHJvY2Vzc2VzCisgKi8KK2NsYXNzIEJpbmFyeVNlcmlhbGl6ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VXAoKQorICAgIHsKKyAgICAgICAgLyoqIEB2YXIgXENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyICRsb2FkZXIgKi8KKyAgICAgICAgJGxvYWRlciA9IHJlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisgICAgICAgICRsb2FkZXItPmFkZFBzcjQoJycsIF9fRElSX18gLiAnLy4uL3BhY2thZ2VzL3BocCcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdlIHRyeSB0byBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIGEgcmFuZG9tIG9iamVjdCB0byBtYWtlIHN1cmUgbm8gZXhjZXB0aW9ucyBhcmUgdGhyb3duLgorICAgICAqIEBzZWUgVEhSSUZULTE1NzkKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJpbmFyeVNlcmlhbGl6ZXIoKQorICAgIHsKKyAgICAgICAgJHN0cnVjdCA9IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QoYXJyYXkoJ3N0cmluZ190aGluZycgPT4gJ2FiYycpKTsKKyAgICAgICAgJHNlcmlhbGl6ZWQgPSBUQmluYXJ5U2VyaWFsaXplcjo6c2VyaWFsaXplKCRzdHJ1Y3QsICdUaHJpZnRUZXN0XFxYdHJ1Y3QnKTsKKyAgICAgICAgJGRlc2VyaWFsaXplZCA9IFRCaW5hcnlTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZSgkc2VyaWFsaXplZCwgJ1RocmlmdFRlc3RcXFh0cnVjdCcpOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRzdHJ1Y3QsICRkZXNlcmlhbGl6ZWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9USlNPTlByb3RvY29sRml4dHVyZXMucGhwIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RKU09OUHJvdG9jb2xGaXh0dXJlcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ5MDM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9USlNPTlByb3RvY29sRml4dHVyZXMucGhwCkBAIC0wLDAgKzEsNzQgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnRcUHJvdG9jb2w7CisKK2NsYXNzIFRKU09OUHJvdG9jb2xGaXh0dXJlcworeworICAgIHB1YmxpYyBzdGF0aWMgJHRlc3RBcmdzSlNPTiA9IGFycmF5KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBvcHVsYXRlVGVzdEFyZ3NKU09OKCkKKyAgICB7CisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ10gPSAne30nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcxJ10gPSAneyIxIjp7InN0ciI6IkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIFwvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZVwn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCBCYWhhc2EgTWVsYXl1LCDZhdin2LLZkNix2YjZhtuMLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwXC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniJ9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzInXSA9ICd7IjEiOnsic3RyIjoicXVvdGU6IFxcXFxcIiBiYWNrc2xhc2g6IGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcXFxcXC8gIGJhY2tzcGFjZTogXFxcXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiBcIlxcXFxcXFxcXC9cXFxcYlxuXHJcdCBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48In19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMyddID0gJ3siMSI6eyJzdHIiOiJzdHJpbmcgdGhhdCBlbmRzIGluIGRvdWJsZS1iYWNrc2xhc2ggXFxcXFxcXFwifX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RVbmljb2RlU3RyaW5nV2l0aE5vbkJNUCddID0gJ3siMSI6eyJzdHIiOiLguKrguKfguLHguKrguJTguLVcL/Cdkq8ifX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXSA9ICd7IjEiOnsiZGJsIjozLjE0MTU5MjY1MzU4OTh9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXSA9ICd7IjEiOnsiaTgiOjF9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddID0gJ3siMSI6eyJpMzIiOjEwNzM3NDE4MjR9fSc7CisKKyAgICAgICAgaWYgKFBIUF9JTlRfU0laRSA9PSA4KSB7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J10gPSAneyIxIjp7Imk2NCI6JyAuIHBvdygyLCA2MCkgLiAnfX0nOworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddID0gJ3siMSI6eyJyZWMiOnsiMSI6eyJzdHIiOiJ3b3JrZWQifSwiNCI6eyJpOCI6MX0sIjkiOnsiaTMyIjoxMDczNzQxODI0fSwiMTEiOnsiaTY0IjonIC4gcG93KDIsIDYwKSAuICd9fX19JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10gPSAneyIxIjp7InJlYyI6eyIxIjp7Imk4IjoxfSwiMiI6eyJyZWMiOnsiMSI6eyJzdHIiOiJ3b3JrZWQifSwiNCI6eyJpOCI6MX0sIjkiOnsiaTMyIjoxMDczNzQxODI0fSwiMTEiOnsiaTY0IjonIC4gcG93KDIsIDYwKSAuICd9fX0sIjMiOnsiaTMyIjozMjc2OH19fX0nOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddID0gJ3siMSI6eyJpNjQiOjExNTI5MjE1MDQ2MDY4NDcwMDB9fSc7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J10gPSAneyIxIjp7InJlYyI6eyIxIjp7InN0ciI6IndvcmtlZCJ9LCI0Ijp7Imk4IjoxfSwiOSI6eyJpMzIiOjEwNzM3NDE4MjR9LCIxMSI6eyJpNjQiOjExNTI5MjE1MDQ2MDY4NDcwMDB9fX19JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10gPSAneyIxIjp7InJlYyI6eyIxIjp7Imk4IjoxfSwiMiI6eyJyZWMiOnsiMSI6eyJzdHIiOiJ3b3JrZWQifSwiNCI6eyJpOCI6MX0sIjkiOnsiaTMyIjoxMDczNzQxODI0fSwiMTEiOnsiaTY0IjoxMTUyOTIxNTA0NjA2ODQ3MDAwfX19LCIzIjp7ImkzMiI6MzI3Njh9fX19JzsKKyAgICAgICAgfQorCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXAnXSA9ICd7IjEiOnsibWFwIjpbImkzMiIsImkzMiIsMyx7IjciOjc3LCI4Ijo4OCwiOSI6OTl9XX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nTWFwJ10gPSAneyIxIjp7Im1hcCI6WyJzdHIiLCJzdHIiLDYseyJhIjoiMTIzIiwiYSBiIjoid2l0aCBzcGFjZXMgIiwic2FtZSI6InNhbWUiLCIwIjoibnVtZXJpYyBrZXkiLCJsb25nVmFsdWUiOiJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb25cdTAwZTlzLCBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjksIFx1MDY0NVx1MDYzNVx1MDYzMVx1MDY0OSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6XHUwMjU5cmJheWNhbiwgXHUwNDExXHUwNDMwXHUwNDQ4XHUwNGExXHUwNDNlXHUwNDQwXHUwNDQyLCBCb2FyaXNjaCwgXHUwMTdkZW1haXRcdTAxMTdcdTAxNjFrYSwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgKFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzYVx1MDQzNVx1MDQzMlx1MDQ1Nlx1MDQ0Nlx1MDQzMCksIFx1MDQxMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOCwgQmFtYW5hbmthbiwgXHUwOWFjXHUwOWJlXHUwOTgyXHUwOWIyXHUwOWJlLCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbFx1MDBlMCwgTVx1MDBlY25nLWRcdTAxMTVcdTAzMjRuZy1uZ1x1MWU3M1x1MDMwNCwgXHUwNDFkXHUwNDNlXHUwNDQ1XHUwNDQ3XHUwNDM4XHUwNDM5XHUwNDNkLCBDZWJ1YW5vLCBcdTEzZTNcdTEzYjNcdTEzYTksIFx1MDEwY2Vza3ksIFx1MDQyMVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQ2M1x1MDMwMVx1MDQzZFx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQ0YSBcLyBcdTJjMTRcdTJjMGVcdTJjMTFcdTJjMDJcdTJjMjFcdTJjMTBcdTJjMjBcdTJjMTRcdTJjMGRcdTJjMWYsIFx1MDQyN1x1MDRkMVx1MDQzMlx1MDQzMFx1MDQ0OFx1MDQzYlx1MDQzMCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwgXHUwNzhiXHUwN2E4XHUwNzg4XHUwN2FjXHUwNzgwXHUwN2E4XHUwNzg0XHUwN2E2XHUwNzkwXHUwN2IwLCBcdTAzOTVcdTAzYmJcdTAzYmJcdTAzYjdcdTAzYmRcdTAzYjlcdTAzYmFcdTAzYWMsIEVtaWxpXHUwMGUwbiBlIHJ1bWFnblx1MDBmMmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYVx1MDBmMW9sLCBFZXN0aSwgRXVza2FyYSwgXHUwNjQxXHUwNjI3XHUwNjMxXHUwNjMzXHUwNmNjLCBTdW9taSwgVlx1MDBmNXJvLCBGXHUwMGY4cm95c2t0LCBGcmFuXHUwMGU3YWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCBcdThkMWJcdThhOWUsIEdcdTAwZTBpZGhsaWcsIEdhbGVnbywgQXZhXHUwMGYxZVwnXHUxZWJkLCBcdTBhOTdcdTBhYzFcdTBhOWNcdTBhYjBcdTBhYmVcdTBhYTRcdTBhYzAsIEdhZWxnLCBcdTA1ZTJcdTA1ZDFcdTA1ZThcdTA1ZDlcdTA1ZWEsIFx1MDkzOVx1MDkzZlx1MDkyOFx1MDk0ZFx1MDkyNlx1MDk0MCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXlcdTAwZjJsIGF5aXN5ZW4sIE1hZ3lhciwgXHUwNTQwXHUwNTYxXHUwNTc1XHUwNTY1XHUwNTgwXHUwNTY1XHUwNTc2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCBcdTAwY2RzbGVuc2thLCBJdGFsaWFubywgXHU2NWU1XHU2NzJjXHU4YTllLCBMb2piYW4sIEJhc2EgSmF3YSwgXHUxMGU1XHUxMGQwXHUxMGUwXHUxMGQ3XHUxMGUzXHUxMGRhXHUxMGQ4LCBLb25nbywgS2FsYWFsbGlzdXQsIFx1MGM5NVx1MGNhOFx1MGNjZFx1MGNhOFx1MGNhMSwgXHVkNTVjXHVhZDZkXHVjNWI0LCBcdTA0MWFcdTA0NGFcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDdcdTA0MzBcdTA0MzktXHUwNDFjXHUwNDMwXHUwNDNiXHUwNDNhXHUwNDRhXHUwNDMwXHUwNDQwLCBSaXBvYXJpc2NoLCBLdXJkXHUwMGVlLCBcdTA0MWFcdTA0M2VcdTA0M2NcdTA0MzgsIEtlcm5ld2VrLCBcdTA0MWFcdTA0NGJcdTA0NDBcdTA0MzNcdTA0NGJcdTA0MzdcdTA0NDdcdTA0MzAsIExhdGluYSwgTGFkaW5vLCBMXHUwMGVidHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ1x1MDBlMWxhLCBcdTBlYTVcdTBlYjJcdTBlYTcsIExpZXR1dmlcdTAxNzMsIExhdHZpZVx1MDE2MXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksIFx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZFx1MDQ0MVx1MDQzYVx1MDQzOCwgXHUwZDJlXHUwZDMyXHUwZDJmXHUwZDNlXHUwZDMzXHUwZDAyLCBcdTA5MmVcdTA5MzBcdTA5M2VcdTA5MjBcdTA5NDAsIEJhaGFzYSBNZWxheXUsIFx1MDY0NVx1MDYyN1x1MDYzMlx1MDY1MFx1MDYzMVx1MDY0OFx1MDY0Nlx1MDZjYywgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIFx1MDkyOFx1MDk0N1x1MDkyYVx1MDkzZVx1MDkzMiBcdTA5MmRcdTA5M2VcdTA5MzdcdTA5M2UsIE5lZGVybGFuZHMsIFx1MjAyYU5vcnNrIChueW5vcnNrKVx1MjAyYywgXHUyMDJhTm9yc2sgKGJva21cdTAwZTVsKVx1MjAyYywgTm91b3JtYW5kLCBEaW5cdTAwZTkgYml6YWFkLCBPY2NpdGFuLCBcdTA0MThcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzBcdTA0NDMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksIFx1MDY3ZVx1MDY0Nlx1MDYyY1x1MDYyN1x1MDYyOFx1MDZjYywgXHUwNjdlXHUwNjlhXHUwNjJhXHUwNjQ4LCBQb3J0dWd1XHUwMGVhcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tXHUwMGUyblx1MDEwMywgXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5LCBcdTA0MjFcdTA0MzBcdTA0NDVcdTA0MzAgXHUwNDQyXHUwNDRiXHUwNDNiXHUwNDMwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU1x1MDBlMW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuXHUwMTBkaW5hLCBTbG92ZW5cdTAxNjFcdTAxMGRpbmEsIFx1MDQyMVx1MDQ0MFx1MDQzZlx1MDQ0MVx1MDQzYVx1MDQzOCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCBcdTBiYTRcdTBiYWVcdTBiYmZcdTBiYjRcdTBiY2QsIFx1MGMyNFx1MGM0Nlx1MGMzMlx1MGM0MVx1MGMxN1x1MGM0MSwgXHUwNDIyXHUwNDNlXHUwNGI3XHUwNDM4XHUwNDNhXHUwNGUzLCBcdTBlNDRcdTBlMTdcdTBlMjIsIFRcdTAwZmNya21lblx1MDBlN2UsIFRhZ2Fsb2csIFRcdTAwZmNya1x1MDBlN2UsIFx1MDQyMlx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0N1x1MDQzMFwvVGF0YXJcdTAwZTdhLCBcdTA0MjNcdTA0M2FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M2RcdTA0NDFcdTA0NGNcdTA0M2FcdTA0MzAsIFx1MDYyN1x1MDYzMVx1MDYyZlx1MDY0OCwgVGlcdTFlYmZuZyBWaVx1MWVjN3QsIFZvbGFwXHUwMGZjaywgV2Fsb24sIFdpbmFyYXksIFx1NTQzNFx1OGJlZCwgaXNpWGhvc2EsIFx1MDVkOVx1MDVkOVx1MDViNFx1MDVkM1x1MDVkOVx1MDVlOSwgWW9yXHUwMGY5Ylx1MDBlMSwgWmVcdTAwZWF1d3MsIFx1NGUyZFx1NjU4NywgQlx1MDBlMm4tbFx1MDBlMm0tZ1x1MDBmYSwgXHU3Y2I1XHU4YTllIiwiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uXHUwMGU5cywgXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRhXHUwNjI5LCBcdTA2NDVcdTA2MzVcdTA2MzFcdTA2NDksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBelx1MDI1OXJiYXljYW4sIFx1MDQxMVx1MDQzMFx1MDQ0OFx1MDRhMVx1MDQzZVx1MDQ0MFx1MDQ0MiwgQm9hcmlzY2gsIFx1MDE3ZGVtYWl0XHUwMTE3XHUwMTYxa2EsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmIChcdTA0NDJcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDhcdTA0M2FcdTA0MzVcdTA0MzJcdTA0NTZcdTA0NDZcdTA0MzApLCBcdTA0MTFcdTA0NGFcdTA0M2JcdTA0MzNcdTA0MzBcdTA0NDBcdTA0NDFcdTA0M2FcdTA0MzgsIEJhbWFuYW5rYW4sIFx1MDlhY1x1MDliZVx1MDk4Mlx1MDliMlx1MDliZSwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWxcdTAwZTAsIE1cdTAwZWNuZy1kXHUwMTE1XHUwMzI0bmctbmdcdTFlNzNcdTAzMDQsIFx1MDQxZFx1MDQzZVx1MDQ0NVx1MDQ0N1x1MDQzOFx1MDQzOVx1MDQzZCwgQ2VidWFubywgXHUxM2UzXHUxM2IzXHUxM2E5LCBcdTAxMGNlc2t5LCBcdTA0MjFcdTA0M2JcdTA0M2VcdTA0MzJcdTA0NjNcdTAzMDFcdTA0M2RcdTA0NGNcdTA0NDFcdTA0M2FcdTA0NGEgXC8gXHUyYzE0XHUyYzBlXHUyYzExXHUyYzAyXHUyYzIxXHUyYzEwXHUyYzIwXHUyYzE0XHUyYzBkXHUyYzFmLCBcdTA0MjdcdTA0ZDFcdTA0MzJcdTA0MzBcdTA0NDhcdTA0M2JcdTA0MzAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIFx1MDc4Ylx1MDdhOFx1MDc4OFx1MDdhY1x1MDc4MFx1MDdhOFx1MDc4NFx1MDdhNlx1MDc5MFx1MDdiMCwgXHUwMzk1XHUwM2JiXHUwM2JiXHUwM2I3XHUwM2JkXHUwM2I5XHUwM2JhXHUwM2FjLCBFbWlsaVx1MDBlMG4gZSBydW1hZ25cdTAwZjJsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGFcdTAwZjFvbCwgRWVzdGksIEV1c2thcmEsIFx1MDY0MVx1MDYyN1x1MDYzMVx1MDYzM1x1MDZjYywgU3VvbWksIFZcdTAwZjVybywgRlx1MDBmOHJveXNrdCwgRnJhblx1MDBlN2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwgXHU4ZDFiXHU4YTllLCBHXHUwMGUwaWRobGlnLCBHYWxlZ28sIEF2YVx1MDBmMWVcJ1x1MWViZCwgXHUwYTk3XHUwYWMxXHUwYTljXHUwYWIwXHUwYWJlXHUwYWE0XHUwYWMwLCBHYWVsZywgXHUwNWUyXHUwNWQxXHUwNWU4XHUwNWQ5XHUwNWVhLCBcdTA5MzlcdTA5M2ZcdTA5MjhcdTA5NGRcdTA5MjZcdTA5NDAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5XHUwMGYybCBheWlzeWVuLCBNYWd5YXIsIFx1MDU0MFx1MDU2MVx1MDU3NVx1MDU2NVx1MDU4MFx1MDU2NVx1MDU3NiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgXHUwMGNkc2xlbnNrYSwgSXRhbGlhbm8sIFx1NjVlNVx1NjcyY1x1OGE5ZSwgTG9qYmFuLCBCYXNhIEphd2EsIFx1MTBlNVx1MTBkMFx1MTBlMFx1MTBkN1x1MTBlM1x1MTBkYVx1MTBkOCwgS29uZ28sIEthbGFhbGxpc3V0LCBcdTBjOTVcdTBjYThcdTBjY2RcdTBjYThcdTBjYTEsIFx1ZDU1Y1x1YWQ2ZFx1YzViNCwgXHUwNDFhXHUwNDRhXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDM5LVx1MDQxY1x1MDQzMFx1MDQzYlx1MDQzYVx1MDQ0YVx1MDQzMFx1MDQ0MCwgUmlwb2FyaXNjaCwgS3VyZFx1MDBlZSwgXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDM4LCBLZXJuZXdlaywgXHUwNDFhXHUwNDRiXHUwNDQwXHUwNDMzXHUwNDRiXHUwNDM3XHUwNDQ3XHUwNDMwLCBMYXRpbmEsIExhZGlubywgTFx1MDBlYnR6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmdcdTAwZTFsYSwgXHUwZWE1XHUwZWIyXHUwZWE3LCBMaWV0dXZpXHUwMTczLCBMYXR2aWVcdTAxNjF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCBcdTA0MWNcdTA0MzBcdTA0M2FcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzgsIFx1MGQyZVx1MGQzMlx1MGQyZlx1MGQzZVx1MGQzM1x1MGQwMiwgXHUwOTJlXHUwOTMwXHUwOTNlXHUwOTIwXHUwOTQwLCBCYWhhc2EgTWVsYXl1LCBcdTA2NDVcdTA2MjdcdTA2MzJcdTA2NTBcdTA2MzFcdTA2NDhcdTA2NDZcdTA2Y2MsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCBcdTA5MjhcdTA5NDdcdTA5MmFcdTA5M2VcdTA5MzIgXHUwOTJkXHUwOTNlXHUwOTM3XHUwOTNlLCBOZWRlcmxhbmRzLCBcdTIwMmFOb3JzayAobnlub3JzaylcdTIwMmMsIFx1MjAyYU5vcnNrIChib2ttXHUwMGU1bClcdTIwMmMsIE5vdW9ybWFuZCwgRGluXHUwMGU5IGJpemFhZCwgT2NjaXRhbiwgXHUwNDE4XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDQzLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgXC8gUGl0a2VybiwgUG9sc2tpLCBcdTA2N2VcdTA2NDZcdTA2MmNcdTA2MjdcdTA2MjhcdTA2Y2MsIFx1MDY3ZVx1MDY5YVx1MDYyYVx1MDY0OCwgUG9ydHVndVx1MDBlYXMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbVx1MDBlMm5cdTAxMDMsIFx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSwgXHUwNDIxXHUwNDMwXHUwNDQ1XHUwNDMwIFx1MDQ0Mlx1MDQ0Ylx1MDQzYlx1MDQzMCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFNcdTAwZTFtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3Zlblx1MDEwZGluYSwgU2xvdmVuXHUwMTYxXHUwMTBkaW5hLCBcdTA0MjFcdTA0NDBcdTA0M2ZcdTA0NDFcdTA0M2FcdTA0MzggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwgXHUwYmE0XHUwYmFlXHUwYmJmXHUwYmI0XHUwYmNkLCBcdTBjMjRcdTBjNDZcdTBjMzJcdTBjNDFcdTBjMTdcdTBjNDEsIFx1MDQyMlx1MDQzZVx1MDRiN1x1MDQzOFx1MDQzYVx1MDRlMywgXHUwZTQ0XHUwZTE3XHUwZTIyLCBUXHUwMGZjcmttZW5cdTAwZTdlLCBUYWdhbG9nLCBUXHUwMGZjcmtcdTAwZTdlLCBcdTA0MjJcdTA0MzBcdTA0NDJcdTA0MzBcdTA0NDBcdTA0NDdcdTA0MzBcL1RhdGFyXHUwMGU3YSwgXHUwNDIzXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNkXHUwNDQxXHUwNDRjXHUwNDNhXHUwNDMwLCBcdTA2MjdcdTA2MzFcdTA2MmZcdTA2NDgsIFRpXHUxZWJmbmcgVmlcdTFlYzd0LCBWb2xhcFx1MDBmY2ssIFdhbG9uLCBXaW5hcmF5LCBcdTU0MzRcdThiZWQsIGlzaVhob3NhLCBcdTA1ZDlcdTA1ZDlcdTA1YjRcdTA1ZDNcdTA1ZDlcdTA1ZTksIFlvclx1MDBmOWJcdTAwZTEsIFplXHUwMGVhdXdzLCBcdTRlMmRcdTY1ODcsIEJcdTAwZTJuLWxcdTAwZTJtLWdcdTAwZmEsIFx1N2NiNVx1OGE5ZSI6Imxvbmcga2V5In1dfX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTZXQnXSA9ICd7IjEiOnsic2V0IjpbImkzMiIsMywxLDUsNl19fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXSA9ICd7IjEiOnsibHN0IjpbImkzMiIsMywxLDIsM119fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEVudW0nXSA9ICd7IjEiOnsiaTMyIjoxfX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ10gPSAneyIxIjp7Imk2NCI6Njl9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcE1hcCddID0gJ3siMCI6eyJtYXAiOlsiaTMyIiwibWFwIiwyLHsiNCI6WyJpMzIiLCJpMzIiLDQseyIxIjoxLCIyIjoyLCIzIjozLCI0Ijo0fV0sIi00IjpbImkzMiIsImkzMiIsNCx7Ii00IjotNCwiLTMiOi0zLCItMiI6LTIsIi0xIjotMX1dfV19fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEluc2FuaXR5J10gPSAneyIwIjp7Im1hcCI6WyJpNjQiLCJtYXAiLDIseyIxIjpbImkzMiIsInJlYyIsMix7IjIiOnsiMSI6eyJtYXAiOlsiaTMyIiwiaTY0IiwyLHsiNSI6NSwiOCI6OH1dfSwiMiI6eyJsc3QiOlsicmVjIiwyLHsiMSI6eyJzdHIiOiJHb29kYnllNCJ9LCI0Ijp7Imk4Ijo0fSwiOSI6eyJpMzIiOjR9LCIxMSI6eyJpNjQiOjR9fSx7IjEiOnsic3RyIjoiSGVsbG8yIn0sIjQiOnsiaTgiOjJ9LCI5Ijp7ImkzMiI6Mn0sIjExIjp7Imk2NCI6Mn19XX19LCIzIjp7IjEiOnsibWFwIjpbImkzMiIsImk2NCIsMix7IjUiOjUsIjgiOjh9XX0sIjIiOnsibHN0IjpbInJlYyIsMix7IjEiOnsic3RyIjoiR29vZGJ5ZTQifSwiNCI6eyJpOCI6NH0sIjkiOnsiaTMyIjo0fSwiMTEiOnsiaTY0Ijo0fX0seyIxIjp7InN0ciI6IkhlbGxvMiJ9LCI0Ijp7Imk4IjoyfSwiOSI6eyJpMzIiOjJ9LCIxMSI6eyJpNjQiOjJ9fV19fX1dLCIyIjpbImkzMiIsInJlYyIsMSx7IjYiOnt9fV19XX19JzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVEpTT05Qcm90b2NvbFRlc3QucGhwIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RKU09OUHJvdG9jb2xUZXN0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjBlY2NlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RKU09OUHJvdG9jb2xUZXN0LnBocApAQCAtMCwwICsxLDUxOCBAQAorPD9waHAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudGVzdAorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdFxQcm90b2NvbDsKKwordXNlIFBIUFVuaXRcRnJhbWV3b3JrXFRlc3RDYXNlOwordXNlIFRlc3RcVGhyaWZ0XEZpeHR1cmVzOwordXNlIFRocmlmdFxQcm90b2NvbFxUSlNPTlByb3RvY29sOwordXNlIFRocmlmdFxUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlcjsKKworcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKworLyoqKgorICogVGhpcyB0ZXN0IHN1aXRlIGRlcGVuZHMgb24gcnVubmluZyB0aGUgY29tcGlsZXIgYWdhaW5zdCB0aGUKKyAqIHN0YW5kYXJkIFRocmlmdFRlc3QudGhyaWZ0IGZpbGU6CisgKgorICogbGliL3BocC90ZXN0JCAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIHBocCAtciBcCisgKiAgIC0tb3V0IC4vcGFja2FnZXMgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICoKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgVEpTT05Qcm90b2NvbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHByaXZhdGUgJHRyYW5zcG9ydDsKKyAgICBwcml2YXRlICRwcm90b2NvbDsKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0VXBCZWZvcmVDbGFzcygpCisgICAgeworICAgICAgICAvKiogQHZhciBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIgJGxvYWRlciAqLworICAgICAgICAkbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKyAgICAgICAgJGxvYWRlci0+YWRkUHNyNCgnJywgX19ESVJfXyAuICcvLi4vcGFja2FnZXMvcGhwJyk7CisKKyAgICAgICAgRml4dHVyZXM6OnBvcHVsYXRlVGVzdEFyZ3MoKTsKKyAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjpwb3B1bGF0ZVRlc3RBcmdzSlNPTigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRVcCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKKyAgICAgICAgJHRoaXMtPnByb3RvY29sID0gbmV3IFRKU09OUHJvdG9jb2woJHRoaXMtPnRyYW5zcG9ydCk7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPm9wZW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXUklURSBURVNUUworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Vm9pZFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFZvaWRfYXJncygpOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nMVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzEnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcyV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzInXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdERvdWJsZVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdERvdWJsZV9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3REb3VibGUnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RG91YmxlJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Qnl0ZVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEJ5dGVfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0Qnl0ZSddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RCeXRlJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STMyV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0STMyX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEkzMiddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJMzInXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJNjRXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJNjRfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STY0J107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cnVjdFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cnVjdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJ1Y3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TmVzdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0J107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE1hcFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RNYXAnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXAnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmdNYXBXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdNYXBfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nTWFwJ107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nTWFwJ107CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlICRhY3R1YWwgcmV0dXJucyB1bmVzY2FwZWQgc3RyaW5nLgorICAgICAgICAgKiBJdCBpcyByZXF1aXJlZCB0byB0byBkZWNvZGUgdGhlbiBlbmNvZGUgaXQgYWdhaW4KKyAgICAgICAgICogdG8gZ2V0IHRoZSBleHBlY3RlZCBlc2NhcGVkIHVuaWNvZGUuCisgICAgICAgICAqLworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwganNvbl9lbmNvZGUoanNvbl9kZWNvZGUoJGFjdHVhbCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFNldFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFNldF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTZXQnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTZXQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RMaXN0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TGlzdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RMaXN0J107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TGlzdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEVudW1Xcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RFbnVtX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEVudW0nXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RFbnVtJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0VHlwZWRlZldyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFR5cGVkZWZfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0VHlwZWRlZiddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFR5cGVkZWYnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUkVBRCBURVNUUworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Vm9pZFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Vm9pZF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcxUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzEnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nMlJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcyJ10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzNXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMyddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmczJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nNFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RVbmljb2RlU3RyaW5nV2l0aE5vbkJNUCddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RVbmljb2RlU3RyaW5nV2l0aE5vbkJNUCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdERvdWJsZVJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3REb3VibGVfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3REb3VibGUnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RCeXRlUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RCeXRlX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0Qnl0ZSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEkzMlJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJMzInXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJMzJfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJMzInXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJNjRSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0STY0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STY0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RydWN0UmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cnVjdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cnVjdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE5lc3RSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE5lc3RfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE1hcCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZ01hcFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmdNYXAnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdNYXBfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmdNYXAnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTZXRSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U2V0J10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U2V0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U2V0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TGlzdFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RMaXN0J10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TGlzdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdExpc3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbnVtUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEVudW0nXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RFbnVtX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0RW51bSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFR5cGVkZWZSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0VHlwZWRlZiddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFR5cGVkZWZfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RUeXBlZGVmJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwTWFwUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcE1hcCddCisgICAgICAgICk7CisgICAgICAgICRyZXN1bHQgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwTWFwX3Jlc3VsdCgpOworICAgICAgICAkcmVzdWx0LT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRyZXN1bHQtPnN1Y2Nlc3M7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RNYXBNYXBFeHBlY3RlZFJlc3VsdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEluc2FuaXR5UmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEluc2FuaXR5J10KKyAgICAgICAgKTsKKyAgICAgICAgJHJlc3VsdCA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJbnNhbml0eV9yZXN1bHQoKTsKKyAgICAgICAgJHJlc3VsdC0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkcmVzdWx0LT5zdWNjZXNzOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0SW5zYW5pdHlFeHBlY3RlZFJlc3VsdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzLnBocCBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXMucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0N2ZkODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzLnBocApAQCAtMCwwICsxLDY3IEBACis8P3BocAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50ZXN0CisgKi8KKworbmFtZXNwYWNlIHRlc3RcVGhyaWZ0XFByb3RvY29sOworCitjbGFzcyBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXMKK3sKKyAgICBwdWJsaWMgc3RhdGljICR0ZXN0QXJnc0pTT04gPSBhcnJheSgpOworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwb3B1bGF0ZVRlc3RBcmdzU2ltcGxlSlNPTigpCisgICAgeworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0Vm9pZCddID0gJ3t9JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMSddID0gJ3sidGhpbmciOiJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb25cdTAwZTlzLCBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjksIFx1MDY0NVx1MDYzNVx1MDYzMVx1MDY0OSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6XHUwMjU5cmJheWNhbiwgXHUwNDExXHUwNDMwXHUwNDQ4XHUwNGExXHUwNDNlXHUwNDQwXHUwNDQyLCBCb2FyaXNjaCwgXHUwMTdkZW1haXRcdTAxMTdcdTAxNjFrYSwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgKFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzYVx1MDQzNVx1MDQzMlx1MDQ1Nlx1MDQ0Nlx1MDQzMCksIFx1MDQxMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOCwgQmFtYW5hbmthbiwgXHUwOWFjXHUwOWJlXHUwOTgyXHUwOWIyXHUwOWJlLCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbFx1MDBlMCwgTVx1MDBlY25nLWRcdTAxMTVcdTAzMjRuZy1uZ1x1MWU3M1x1MDMwNCwgXHUwNDFkXHUwNDNlXHUwNDQ1XHUwNDQ3XHUwNDM4XHUwNDM5XHUwNDNkLCBDZWJ1YW5vLCBcdTEzZTNcdTEzYjNcdTEzYTksIFx1MDEwY2Vza3ksIFx1MDQyMVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQ2M1x1MDMwMVx1MDQzZFx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQ0YSBcLyBcdTJjMTRcdTJjMGVcdTJjMTFcdTJjMDJcdTJjMjFcdTJjMTBcdTJjMjBcdTJjMTRcdTJjMGRcdTJjMWYsIFx1MDQyN1x1MDRkMVx1MDQzMlx1MDQzMFx1MDQ0OFx1MDQzYlx1MDQzMCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwgXHUwNzhiXHUwN2E4XHUwNzg4XHUwN2FjXHUwNzgwXHUwN2E4XHUwNzg0XHUwN2E2XHUwNzkwXHUwN2IwLCBcdTAzOTVcdTAzYmJcdTAzYmJcdTAzYjdcdTAzYmRcdTAzYjlcdTAzYmFcdTAzYWMsIEVtaWxpXHUwMGUwbiBlIHJ1bWFnblx1MDBmMmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYVx1MDBmMW9sLCBFZXN0aSwgRXVza2FyYSwgXHUwNjQxXHUwNjI3XHUwNjMxXHUwNjMzXHUwNmNjLCBTdW9taSwgVlx1MDBmNXJvLCBGXHUwMGY4cm95c2t0LCBGcmFuXHUwMGU3YWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCBcdThkMWJcdThhOWUsIEdcdTAwZTBpZGhsaWcsIEdhbGVnbywgQXZhXHUwMGYxZVwnXHUxZWJkLCBcdTBhOTdcdTBhYzFcdTBhOWNcdTBhYjBcdTBhYmVcdTBhYTRcdTBhYzAsIEdhZWxnLCBcdTA1ZTJcdTA1ZDFcdTA1ZThcdTA1ZDlcdTA1ZWEsIFx1MDkzOVx1MDkzZlx1MDkyOFx1MDk0ZFx1MDkyNlx1MDk0MCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXlcdTAwZjJsIGF5aXN5ZW4sIE1hZ3lhciwgXHUwNTQwXHUwNTYxXHUwNTc1XHUwNTY1XHUwNTgwXHUwNTY1XHUwNTc2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCBcdTAwY2RzbGVuc2thLCBJdGFsaWFubywgXHU2NWU1XHU2NzJjXHU4YTllLCBMb2piYW4sIEJhc2EgSmF3YSwgXHUxMGU1XHUxMGQwXHUxMGUwXHUxMGQ3XHUxMGUzXHUxMGRhXHUxMGQ4LCBLb25nbywgS2FsYWFsbGlzdXQsIFx1MGM5NVx1MGNhOFx1MGNjZFx1MGNhOFx1MGNhMSwgXHVkNTVjXHVhZDZkXHVjNWI0LCBcdTA0MWFcdTA0NGFcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDdcdTA0MzBcdTA0MzktXHUwNDFjXHUwNDMwXHUwNDNiXHUwNDNhXHUwNDRhXHUwNDMwXHUwNDQwLCBSaXBvYXJpc2NoLCBLdXJkXHUwMGVlLCBcdTA0MWFcdTA0M2VcdTA0M2NcdTA0MzgsIEtlcm5ld2VrLCBcdTA0MWFcdTA0NGJcdTA0NDBcdTA0MzNcdTA0NGJcdTA0MzdcdTA0NDdcdTA0MzAsIExhdGluYSwgTGFkaW5vLCBMXHUwMGVidHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ1x1MDBlMWxhLCBcdTBlYTVcdTBlYjJcdTBlYTcsIExpZXR1dmlcdTAxNzMsIExhdHZpZVx1MDE2MXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksIFx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZFx1MDQ0MVx1MDQzYVx1MDQzOCwgXHUwZDJlXHUwZDMyXHUwZDJmXHUwZDNlXHUwZDMzXHUwZDAyLCBcdTA5MmVcdTA5MzBcdTA5M2VcdTA5MjBcdTA5NDAsIEJhaGFzYSBNZWxheXUsIFx1MDY0NVx1MDYyN1x1MDYzMlx1MDY1MFx1MDYzMVx1MDY0OFx1MDY0Nlx1MDZjYywgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIFx1MDkyOFx1MDk0N1x1MDkyYVx1MDkzZVx1MDkzMiBcdTA5MmRcdTA5M2VcdTA5MzdcdTA5M2UsIE5lZGVybGFuZHMsIFx1MjAyYU5vcnNrIChueW5vcnNrKVx1MjAyYywgXHUyMDJhTm9yc2sgKGJva21cdTAwZTVsKVx1MjAyYywgTm91b3JtYW5kLCBEaW5cdTAwZTkgYml6YWFkLCBPY2NpdGFuLCBcdTA0MThcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzBcdTA0NDMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksIFx1MDY3ZVx1MDY0Nlx1MDYyY1x1MDYyN1x1MDYyOFx1MDZjYywgXHUwNjdlXHUwNjlhXHUwNjJhXHUwNjQ4LCBQb3J0dWd1XHUwMGVhcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tXHUwMGUyblx1MDEwMywgXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5LCBcdTA0MjFcdTA0MzBcdTA0NDVcdTA0MzAgXHUwNDQyXHUwNDRiXHUwNDNiXHUwNDMwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU1x1MDBlMW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuXHUwMTBkaW5hLCBTbG92ZW5cdTAxNjFcdTAxMGRpbmEsIFx1MDQyMVx1MDQ0MFx1MDQzZlx1MDQ0MVx1MDQzYVx1MDQzOCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCBcdTBiYTRcdTBiYWVcdTBiYmZcdTBiYjRcdTBiY2QsIFx1MGMyNFx1MGM0Nlx1MGMzMlx1MGM0MVx1MGMxN1x1MGM0MSwgXHUwNDIyXHUwNDNlXHUwNGI3XHUwNDM4XHUwNDNhXHUwNGUzLCBcdTBlNDRcdTBlMTdcdTBlMjIsIFRcdTAwZmNya21lblx1MDBlN2UsIFRhZ2Fsb2csIFRcdTAwZmNya1x1MDBlN2UsIFx1MDQyMlx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0N1x1MDQzMFwvVGF0YXJcdTAwZTdhLCBcdTA0MjNcdTA0M2FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M2RcdTA0NDFcdTA0NGNcdTA0M2FcdTA0MzAsIFx1MDYyN1x1MDYzMVx1MDYyZlx1MDY0OCwgVGlcdTFlYmZuZyBWaVx1MWVjN3QsIFZvbGFwXHUwMGZjaywgV2Fsb24sIFdpbmFyYXksIFx1NTQzNFx1OGJlZCwgaXNpWGhvc2EsIFx1MDVkOVx1MDVkOVx1MDViNFx1MDVkM1x1MDVkOVx1MDVlOSwgWW9yXHUwMGY5Ylx1MDBlMSwgWmVcdTAwZWF1d3MsIFx1NGUyZFx1NjU4NywgQlx1MDBlMm4tbFx1MDBlMm0tZ1x1MDBmYSwgXHU3Y2I1XHU4YTllIn0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcyJ10gPSAneyJ0aGluZyI6InF1b3RlOiBcXFxcXCIgYmFja3NsYXNoOiBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXFxcXFwvICBiYWNrc3BhY2U6IFxcXFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogXCJcXFxcXFxcXFwvXFxcXGJcblxyXHQgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCJ9JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0RG91YmxlJ10gPSAneyJ0aGluZyI6My4xNDE1OTI2NTM1ODk4fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXSA9ICd7InRoaW5nIjoxfSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddID0gJ3sidGhpbmciOjEwNzM3NDE4MjR9JzsKKworICAgICAgICBpZiAoUEhQX0lOVF9TSVpFID09IDgpIHsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXSA9ICd7InRoaW5nIjonIC4gcG93KDIsIDYwKSAuICd9JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXSA9ICd7InRoaW5nIjp7InN0cmluZ190aGluZyI6IndvcmtlZCIsImJ5dGVfdGhpbmciOjEsImkzMl90aGluZyI6MTA3Mzc0MTgyNCwiaTY0X3RoaW5nIjonIC4gcG93KDIsIDYwKSAuICd9fSc7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddID0gJ3sidGhpbmciOnsiYnl0ZV90aGluZyI6MSwic3RydWN0X3RoaW5nIjp7InN0cmluZ190aGluZyI6IndvcmtlZCIsImJ5dGVfdGhpbmciOjEsImkzMl90aGluZyI6MTA3Mzc0MTgyNCwiaTY0X3RoaW5nIjonIC4gcG93KDIsIDYwKSAuICd9LCJpMzJfdGhpbmciOjMyNzY4fX0nOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddID0gJ3sidGhpbmciOjExNTI5MjE1MDQ2MDY4NDcwMDB9JzsKKworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddID0gJ3sidGhpbmciOnsic3RyaW5nX3RoaW5nIjoid29ya2VkIiwiYnl0ZV90aGluZyI6MSwiaTMyX3RoaW5nIjoxMDczNzQxODI0LCJpNjRfdGhpbmciOjExNTI5MjE1MDQ2MDY4NDcwMDB9fSc7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddID0gJ3sidGhpbmciOnsiYnl0ZV90aGluZyI6MSwic3RydWN0X3RoaW5nIjp7InN0cmluZ190aGluZyI6IndvcmtlZCIsImJ5dGVfdGhpbmciOjEsImkzMl90aGluZyI6MTA3Mzc0MTgyNCwiaTY0X3RoaW5nIjoxMTUyOTIxNTA0NjA2ODQ3MDAwfSwiaTMyX3RoaW5nIjozMjc2OH19JzsKKyAgICAgICAgfQorCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXAnXSA9ICd7InRoaW5nIjp7IjciOjc3LCI4Ijo4OCwiOSI6OTl9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZ01hcCddID0gJ3sidGhpbmciOnsiYSI6IjEyMyIsImEgYiI6IndpdGggc3BhY2VzICIsInNhbWUiOiJzYW1lIiwiMCI6Im51bWVyaWMga2V5IiwibG9uZ1ZhbHVlIjoiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uXHUwMGU5cywgXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRhXHUwNjI5LCBcdTA2NDVcdTA2MzVcdTA2MzFcdTA2NDksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBelx1MDI1OXJiYXljYW4sIFx1MDQxMVx1MDQzMFx1MDQ0OFx1MDRhMVx1MDQzZVx1MDQ0MFx1MDQ0MiwgQm9hcmlzY2gsIFx1MDE3ZGVtYWl0XHUwMTE3XHUwMTYxa2EsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmIChcdTA0NDJcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDhcdTA0M2FcdTA0MzVcdTA0MzJcdTA0NTZcdTA0NDZcdTA0MzApLCBcdTA0MTFcdTA0NGFcdTA0M2JcdTA0MzNcdTA0MzBcdTA0NDBcdTA0NDFcdTA0M2FcdTA0MzgsIEJhbWFuYW5rYW4sIFx1MDlhY1x1MDliZVx1MDk4Mlx1MDliMlx1MDliZSwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWxcdTAwZTAsIE1cdTAwZWNuZy1kXHUwMTE1XHUwMzI0bmctbmdcdTFlNzNcdTAzMDQsIFx1MDQxZFx1MDQzZVx1MDQ0NVx1MDQ0N1x1MDQzOFx1MDQzOVx1MDQzZCwgQ2VidWFubywgXHUxM2UzXHUxM2IzXHUxM2E5LCBcdTAxMGNlc2t5LCBcdTA0MjFcdTA0M2JcdTA0M2VcdTA0MzJcdTA0NjNcdTAzMDFcdTA0M2RcdTA0NGNcdTA0NDFcdTA0M2FcdTA0NGEgXC8gXHUyYzE0XHUyYzBlXHUyYzExXHUyYzAyXHUyYzIxXHUyYzEwXHUyYzIwXHUyYzE0XHUyYzBkXHUyYzFmLCBcdTA0MjdcdTA0ZDFcdTA0MzJcdTA0MzBcdTA0NDhcdTA0M2JcdTA0MzAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIFx1MDc4Ylx1MDdhOFx1MDc4OFx1MDdhY1x1MDc4MFx1MDdhOFx1MDc4NFx1MDdhNlx1MDc5MFx1MDdiMCwgXHUwMzk1XHUwM2JiXHUwM2JiXHUwM2I3XHUwM2JkXHUwM2I5XHUwM2JhXHUwM2FjLCBFbWlsaVx1MDBlMG4gZSBydW1hZ25cdTAwZjJsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGFcdTAwZjFvbCwgRWVzdGksIEV1c2thcmEsIFx1MDY0MVx1MDYyN1x1MDYzMVx1MDYzM1x1MDZjYywgU3VvbWksIFZcdTAwZjVybywgRlx1MDBmOHJveXNrdCwgRnJhblx1MDBlN2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwgXHU4ZDFiXHU4YTllLCBHXHUwMGUwaWRobGlnLCBHYWxlZ28sIEF2YVx1MDBmMWVcJ1x1MWViZCwgXHUwYTk3XHUwYWMxXHUwYTljXHUwYWIwXHUwYWJlXHUwYWE0XHUwYWMwLCBHYWVsZywgXHUwNWUyXHUwNWQxXHUwNWU4XHUwNWQ5XHUwNWVhLCBcdTA5MzlcdTA5M2ZcdTA5MjhcdTA5NGRcdTA5MjZcdTA5NDAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5XHUwMGYybCBheWlzeWVuLCBNYWd5YXIsIFx1MDU0MFx1MDU2MVx1MDU3NVx1MDU2NVx1MDU4MFx1MDU2NVx1MDU3NiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgXHUwMGNkc2xlbnNrYSwgSXRhbGlhbm8sIFx1NjVlNVx1NjcyY1x1OGE5ZSwgTG9qYmFuLCBCYXNhIEphd2EsIFx1MTBlNVx1MTBkMFx1MTBlMFx1MTBkN1x1MTBlM1x1MTBkYVx1MTBkOCwgS29uZ28sIEthbGFhbGxpc3V0LCBcdTBjOTVcdTBjYThcdTBjY2RcdTBjYThcdTBjYTEsIFx1ZDU1Y1x1YWQ2ZFx1YzViNCwgXHUwNDFhXHUwNDRhXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDM5LVx1MDQxY1x1MDQzMFx1MDQzYlx1MDQzYVx1MDQ0YVx1MDQzMFx1MDQ0MCwgUmlwb2FyaXNjaCwgS3VyZFx1MDBlZSwgXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDM4LCBLZXJuZXdlaywgXHUwNDFhXHUwNDRiXHUwNDQwXHUwNDMzXHUwNDRiXHUwNDM3XHUwNDQ3XHUwNDMwLCBMYXRpbmEsIExhZGlubywgTFx1MDBlYnR6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmdcdTAwZTFsYSwgXHUwZWE1XHUwZWIyXHUwZWE3LCBMaWV0dXZpXHUwMTczLCBMYXR2aWVcdTAxNjF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCBcdTA0MWNcdTA0MzBcdTA0M2FcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzgsIFx1MGQyZVx1MGQzMlx1MGQyZlx1MGQzZVx1MGQzM1x1MGQwMiwgXHUwOTJlXHUwOTMwXHUwOTNlXHUwOTIwXHUwOTQwLCBCYWhhc2EgTWVsYXl1LCBcdTA2NDVcdTA2MjdcdTA2MzJcdTA2NTBcdTA2MzFcdTA2NDhcdTA2NDZcdTA2Y2MsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCBcdTA5MjhcdTA5NDdcdTA5MmFcdTA5M2VcdTA5MzIgXHUwOTJkXHUwOTNlXHUwOTM3XHUwOTNlLCBOZWRlcmxhbmRzLCBcdTIwMmFOb3JzayAobnlub3JzaylcdTIwMmMsIFx1MjAyYU5vcnNrIChib2ttXHUwMGU1bClcdTIwMmMsIE5vdW9ybWFuZCwgRGluXHUwMGU5IGJpemFhZCwgT2NjaXRhbiwgXHUwNDE4XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDQzLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgXC8gUGl0a2VybiwgUG9sc2tpLCBcdTA2N2VcdTA2NDZcdTA2MmNcdTA2MjdcdTA2MjhcdTA2Y2MsIFx1MDY3ZVx1MDY5YVx1MDYyYVx1MDY0OCwgUG9ydHVndVx1MDBlYXMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbVx1MDBlMm5cdTAxMDMsIFx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSwgXHUwNDIxXHUwNDMwXHUwNDQ1XHUwNDMwIFx1MDQ0Mlx1MDQ0Ylx1MDQzYlx1MDQzMCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFNcdTAwZTFtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3Zlblx1MDEwZGluYSwgU2xvdmVuXHUwMTYxXHUwMTBkaW5hLCBcdTA0MjFcdTA0NDBcdTA0M2ZcdTA0NDFcdTA0M2FcdTA0MzggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwgXHUwYmE0XHUwYmFlXHUwYmJmXHUwYmI0XHUwYmNkLCBcdTBjMjRcdTBjNDZcdTBjMzJcdTBjNDFcdTBjMTdcdTBjNDEsIFx1MDQyMlx1MDQzZVx1MDRiN1x1MDQzOFx1MDQzYVx1MDRlMywgXHUwZTQ0XHUwZTE3XHUwZTIyLCBUXHUwMGZjcmttZW5cdTAwZTdlLCBUYWdhbG9nLCBUXHUwMGZjcmtcdTAwZTdlLCBcdTA0MjJcdTA0MzBcdTA0NDJcdTA0MzBcdTA0NDBcdTA0NDdcdTA0MzBcL1RhdGFyXHUwMGU3YSwgXHUwNDIzXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNkXHUwNDQxXHUwNDRjXHUwNDNhXHUwNDMwLCBcdTA2MjdcdTA2MzFcdTA2MmZcdTA2NDgsIFRpXHUxZWJmbmcgVmlcdTFlYzd0LCBWb2xhcFx1MDBmY2ssIFdhbG9uLCBXaW5hcmF5LCBcdTU0MzRcdThiZWQsIGlzaVhob3NhLCBcdTA1ZDlcdTA1ZDlcdTA1YjRcdTA1ZDNcdTA1ZDlcdTA1ZTksIFlvclx1MDBmOWJcdTAwZTEsIFplXHUwMGVhdXdzLCBcdTRlMmRcdTY1ODcsIEJcdTAwZTJuLWxcdTAwZTJtLWdcdTAwZmEsIFx1N2NiNVx1OGE5ZSIsIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvblx1MDBlOXMsIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSwgXHUwNjQ1XHUwNjM1XHUwNjMxXHUwNjQ5LCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXpcdTAyNTlyYmF5Y2FuLCBcdTA0MTFcdTA0MzBcdTA0NDhcdTA0YTFcdTA0M2VcdTA0NDBcdTA0NDIsIEJvYXJpc2NoLCBcdTAxN2RlbWFpdFx1MDExN1x1MDE2MWthLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiAoXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDNhXHUwNDM1XHUwNDMyXHUwNDU2XHUwNDQ2XHUwNDMwKSwgXHUwNDExXHUwNDRhXHUwNDNiXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4LCBCYW1hbmFua2FuLCBcdTA5YWNcdTA5YmVcdTA5ODJcdTA5YjJcdTA5YmUsIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsXHUwMGUwLCBNXHUwMGVjbmctZFx1MDExNVx1MDMyNG5nLW5nXHUxZTczXHUwMzA0LCBcdTA0MWRcdTA0M2VcdTA0NDVcdTA0NDdcdTA0MzhcdTA0MzlcdTA0M2QsIENlYnVhbm8sIFx1MTNlM1x1MTNiM1x1MTNhOSwgXHUwMTBjZXNreSwgXHUwNDIxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDYzXHUwMzAxXHUwNDNkXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDRhIFwvIFx1MmMxNFx1MmMwZVx1MmMxMVx1MmMwMlx1MmMyMVx1MmMxMFx1MmMyMFx1MmMxNFx1MmMwZFx1MmMxZiwgXHUwNDI3XHUwNGQxXHUwNDMyXHUwNDMwXHUwNDQ4XHUwNDNiXHUwNDMwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCBcdTA3OGJcdTA3YThcdTA3ODhcdTA3YWNcdTA3ODBcdTA3YThcdTA3ODRcdTA3YTZcdTA3OTBcdTA3YjAsIFx1MDM5NVx1MDNiYlx1MDNiYlx1MDNiN1x1MDNiZFx1MDNiOVx1MDNiYVx1MDNhYywgRW1pbGlcdTAwZTBuIGUgcnVtYWduXHUwMGYybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3BhXHUwMGYxb2wsIEVlc3RpLCBFdXNrYXJhLCBcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Y2MsIFN1b21pLCBWXHUwMGY1cm8sIEZcdTAwZjhyb3lza3QsIEZyYW5cdTAwZTdhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIFx1OGQxYlx1OGE5ZSwgR1x1MDBlMGlkaGxpZywgR2FsZWdvLCBBdmFcdTAwZjFlXCdcdTFlYmQsIFx1MGE5N1x1MGFjMVx1MGE5Y1x1MGFiMFx1MGFiZVx1MGFhNFx1MGFjMCwgR2FlbGcsIFx1MDVlMlx1MDVkMVx1MDVlOFx1MDVkOVx1MDVlYSwgXHUwOTM5XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI2XHUwOTQwLCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JleVx1MDBmMmwgYXlpc3llbiwgTWFneWFyLCBcdTA1NDBcdTA1NjFcdTA1NzVcdTA1NjVcdTA1ODBcdTA1NjVcdTA1NzYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIFx1MDBjZHNsZW5za2EsIEl0YWxpYW5vLCBcdTY1ZTVcdTY3MmNcdThhOWUsIExvamJhbiwgQmFzYSBKYXdhLCBcdTEwZTVcdTEwZDBcdTEwZTBcdTEwZDdcdTEwZTNcdTEwZGFcdTEwZDgsIEtvbmdvLCBLYWxhYWxsaXN1dCwgXHUwYzk1XHUwY2E4XHUwY2NkXHUwY2E4XHUwY2ExLCBcdWQ1NWNcdWFkNmRcdWM1YjQsIFx1MDQxYVx1MDQ0YVx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzOS1cdTA0MWNcdTA0MzBcdTA0M2JcdTA0M2FcdTA0NGFcdTA0MzBcdTA0NDAsIFJpcG9hcmlzY2gsIEt1cmRcdTAwZWUsIFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzOCwgS2VybmV3ZWssIFx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0N1x1MDQzMCwgTGF0aW5hLCBMYWRpbm8sIExcdTAwZWJ0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nXHUwMGUxbGEsIFx1MGVhNVx1MGViMlx1MGVhNywgTGlldHV2aVx1MDE3MywgTGF0dmllXHUwMTYxdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwgXHUwNDFjXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4LCBcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIsIFx1MDkyZVx1MDkzMFx1MDkzZVx1MDkyMFx1MDk0MCwgQmFoYXNhIE1lbGF5dSwgXHUwNjQ1XHUwNjI3XHUwNjMyXHUwNjUwXHUwNjMxXHUwNjQ4XHUwNjQ2XHUwNmNjLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwgXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyIFx1MDkyZFx1MDkzZVx1MDkzN1x1MDkzZSwgTmVkZXJsYW5kcywgXHUyMDJhTm9yc2sgKG55bm9yc2spXHUyMDJjLCBcdTIwMmFOb3JzayAoYm9rbVx1MDBlNWwpXHUyMDJjLCBOb3Vvcm1hbmQsIERpblx1MDBlOSBiaXphYWQsIE9jY2l0YW4sIFx1MDQxOFx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzMFx1MDQ0MywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwgXHUwNjdlXHUwNjQ2XHUwNjJjXHUwNjI3XHUwNjI4XHUwNmNjLCBcdTA2N2VcdTA2OWFcdTA2MmFcdTA2NDgsIFBvcnR1Z3VcdTAwZWFzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb21cdTAwZTJuXHUwMTAzLCBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzksIFx1MDQyMVx1MDQzMFx1MDQ0NVx1MDQzMCBcdTA0NDJcdTA0NGJcdTA0M2JcdTA0MzAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTXHUwMGUxbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW5cdTAxMGRpbmEsIFNsb3Zlblx1MDE2MVx1MDEwZGluYSwgXHUwNDIxXHUwNDQwXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4IFwvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIFx1MGJhNFx1MGJhZVx1MGJiZlx1MGJiNFx1MGJjZCwgXHUwYzI0XHUwYzQ2XHUwYzMyXHUwYzQxXHUwYzE3XHUwYzQxLCBcdTA0MjJcdTA0M2VcdTA0YjdcdTA0MzhcdTA0M2FcdTA0ZTMsIFx1MGU0NFx1MGUxN1x1MGUyMiwgVFx1MDBmY3JrbWVuXHUwMGU3ZSwgVGFnYWxvZywgVFx1MDBmY3JrXHUwMGU3ZSwgXHUwNDIyXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDQ3XHUwNDMwXC9UYXRhclx1MDBlN2EsIFx1MDQyM1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzZFx1MDQ0MVx1MDQ0Y1x1MDQzYVx1MDQzMCwgXHUwNjI3XHUwNjMxXHUwNjJmXHUwNjQ4LCBUaVx1MWViZm5nIFZpXHUxZWM3dCwgVm9sYXBcdTAwZmNrLCBXYWxvbiwgV2luYXJheSwgXHU1NDM0XHU4YmVkLCBpc2lYaG9zYSwgXHUwNWQ5XHUwNWQ5XHUwNWI0XHUwNWQzXHUwNWQ5XHUwNWU5LCBZb3JcdTAwZjliXHUwMGUxLCBaZVx1MDBlYXV3cywgXHU0ZTJkXHU2NTg3LCBCXHUwMGUybi1sXHUwMGUybS1nXHUwMGZhLCBcdTdjYjVcdThhOWUiOiJsb25nIGtleSJ9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFNldCddID0gJ3sidGhpbmciOlsxLDUsNl19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TGlzdCddID0gJ3sidGhpbmciOlsxLDIsM119JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddID0gJ3sidGhpbmciOjF9JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0VHlwZWRlZiddID0gJ3sidGhpbmciOjY5fSc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnBocCBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sVGVzdC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRhMTM3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sVGVzdC5waHAKQEAgLTAsMCArMSwyNTQgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBQSFBVbml0XEZyYW1ld29ya1xUZXN0Q2FzZTsKK3VzZSBUZXN0XFRocmlmdFxGaXh0dXJlczsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVFNpbXBsZUpTT05Qcm90b2NvbDsKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRNZW1vcnlCdWZmZXI7CisKK3JlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisKKy8qKioKKyAqIFRoaXMgdGVzdCBzdWl0ZSBkZXBlbmRzIG9uIHJ1bm5pbmcgdGhlIGNvbXBpbGVyIGFnYWluc3QgdGhlCisgKiBzdGFuZGFyZCBUaHJpZnRUZXN0LnRocmlmdCBmaWxlOgorICoKKyAqIGxpYi9waHAvdGVzdCQgLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBwaHAgLXIgXAorICogICAtLW91dCAuL3BhY2thZ2VzIC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyAqCisgKiBAcnVuVGVzdHNJblNlcGFyYXRlUHJvY2Vzc2VzCisgKi8KK2NsYXNzIFRTaW1wbGVKU09OUHJvdG9jb2xUZXN0IGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwcml2YXRlICR0cmFuc3BvcnQ7CisgICAgcHJpdmF0ZSAkcHJvdG9jb2w7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldFVwQmVmb3JlQ2xhc3MoKQorICAgIHsKKworICAgICAgICAvKiogQHZhciBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIgJGxvYWRlciAqLworICAgICAgICAkbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKyAgICAgICAgJGxvYWRlci0+YWRkUHNyNCgnJywgX19ESVJfXyAuICcvLi4vcGFja2FnZXMvcGhwJyk7CisKKyAgICAgICAgRml4dHVyZXM6OnBvcHVsYXRlVGVzdEFyZ3MoKTsKKyAgICAgICAgVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjpwb3B1bGF0ZVRlc3RBcmdzU2ltcGxlSlNPTigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRVcCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKKyAgICAgICAgJHRoaXMtPnByb3RvY29sID0gbmV3IFRTaW1wbGVKU09OUHJvdG9jb2woJHRoaXMtPnRyYW5zcG9ydCk7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPm9wZW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXUklURSBURVNUUworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Vm9pZFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFZvaWRfYXJncygpOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nMVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzEnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcyV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzInXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdERvdWJsZVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdERvdWJsZV9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3REb3VibGUnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RG91YmxlJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Qnl0ZVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEJ5dGVfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0Qnl0ZSddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RCeXRlJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STMyV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0STMyX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEkzMiddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJMzInXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJNjRXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJNjRfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STY0J107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cnVjdFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cnVjdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJ1Y3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TmVzdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0J107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE1hcFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RNYXAnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXAnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmdNYXBXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdNYXBfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nTWFwJ107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nTWFwJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U2V0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U2V0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFNldCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFNldCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdExpc3RXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RMaXN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdExpc3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RMaXN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RW51bVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEVudW1fYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0RW51bSddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEVudW0nXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RUeXBlZGVmV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0VHlwZWRlZl9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RUeXBlZGVmJ107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0VHlwZWRlZiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvVGVzdFZhbGlkYXRvcnMudGhyaWZ0IGIvbGliL3BocC90ZXN0L1Rlc3RWYWxpZGF0b3JzLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzM4ZDkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1Rlc3RWYWxpZGF0b3JzLnRocmlmdApAQCAtMCwwICsxLDMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBwaHAgVGVzdFZhbGlkYXRvcnMKKworaW5jbHVkZSAiLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCIKKwordW5pb24gVW5pb25PZlN0cmluZ3MgeworICAxOiBzdHJpbmcgYWE7CisgIDI6IHN0cmluZyBiYjsKK30KKworc2VydmljZSBUZXN0U2VydmljZSB7CisgICAgdm9pZCB0ZXN0KCkgdGhyb3dzKDE6IFRocmlmdFRlc3QuWGNlcHRpb24geGNlcHRpb24pOworfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1ZhbGlkYXRvci9CYXNlVmFsaWRhdG9yVGVzdC5waHAgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL0Jhc2VWYWxpZGF0b3JUZXN0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDI5MDgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1ZhbGlkYXRvci9CYXNlVmFsaWRhdG9yVGVzdC5waHAKQEAgLTAsMCArMSwxNTQgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdDsKKwordXNlIFBIUFVuaXRcRnJhbWV3b3JrXFRlc3RDYXNlOwordXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOwordXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7Cit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUTWVtb3J5QnVmZmVyOworCithYnN0cmFjdCBjbGFzcyBCYXNlVmFsaWRhdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbXB0eVN0cnVjdFZhbGlkYXRvcigpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0Tm9SZWFkVmFsaWRhdG9yKCdUaHJpZnRUZXN0XEVtcHR5U3RydWN0Jyk7CisgICAgICAgICR0aGlzLT5hc3NlcnROb1dyaXRlVmFsaWRhdG9yKCdUaHJpZnRUZXN0XEVtcHR5U3RydWN0Jyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RCb25rVmFsaWRhdG9yKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5hc3NlcnROb1JlYWRWYWxpZGF0b3IoJ1RocmlmdFRlc3RcQm9uaycpOworICAgICAgICAkdGhpcy0+YXNzZXJ0SGFzV3JpdGVWYWxpZGF0b3IoJ1RocmlmdFRlc3RcQm9uaycpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RydWN0QVZhbGlkYXRvcigpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0SGFzUmVhZFZhbGlkYXRvcignVGhyaWZ0VGVzdFxTdHJ1Y3RBJyk7CisgICAgICAgICR0aGlzLT5hc3NlcnRIYXNXcml0ZVZhbGlkYXRvcignVGhyaWZ0VGVzdFxTdHJ1Y3RBJyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RVbmlvbk9mU3RyaW5nc1ZhbGlkYXRvcigpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0Tm9Xcml0ZVZhbGlkYXRvcignVGVzdFZhbGlkYXRvcnNcVW5pb25PZlN0cmluZ3MnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFNlcnZpY2VSZXN1bHRWYWxpZGF0b3IoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFzc2VydE5vUmVhZFZhbGlkYXRvcignVGVzdFZhbGlkYXRvcnNcVGVzdFNlcnZpY2VfdGVzdF9yZXN1bHQnKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydE5vV3JpdGVWYWxpZGF0b3IoJ1Rlc3RWYWxpZGF0b3JzXFRlc3RTZXJ2aWNlX3Rlc3RfcmVzdWx0Jyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RSZWFkRW1wdHkoKQorICAgIHsKKyAgICAgICAgJGJvbmsgPSBuZXcgXFRocmlmdFRlc3RcQm9uaygpOworICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoIlwwMDAiKTsKKyAgICAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKKyAgICAgICAgJGJvbmstPnJlYWQoJHByb3RvY29sKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFdyaXRlRW1wdHkoKQorICAgIHsKKyAgICAgICAgJGJvbmsgPSBuZXcgXFRocmlmdFRlc3RcQm9uaygpOworICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKKyAgICAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICRib25rLT53cml0ZSgkcHJvdG9jb2wpOworICAgICAgICAgICAgJHRoaXMtPmZhaWwoJ0Jvbmsgd2FzIGFibGUgdG8gd3JpdGUgYW4gZW1wdHkgb2JqZWN0Jyk7CisgICAgICAgIH0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiAkZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RXcml0ZVdpdGhNaXNzaW5nUmVxdWlyZWQoKQorICAgIHsKKyAgICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBhcmUgbm90IGFibGUgdG8gd3JpdGUgU3RydWN0QSB3aXRoIGEgbWlzc2luZyByZXF1aXJlZCBmaWVsZAorICAgICAgICAkc3RydWN0YSA9IG5ldyBcVGhyaWZ0VGVzdFxTdHJ1Y3RBKCk7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAkc3RydWN0YS0+d3JpdGUoJHByb3RvY29sKTsKKyAgICAgICAgICAgICR0aGlzLT5mYWlsKCdTdHJ1Y3RBIHdhcyBhYmxlIHRvIHdyaXRlIGFuIGVtcHR5IG9iamVjdCcpOworICAgICAgICB9IGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24gJGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0UmVhZFN0cnVjdEEoKQorICAgIHsKKyAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKGJhc2U2NF9kZWNvZGUoJ0N3QUJBQUFBQTJGaVl3QT0nKSk7CisgICAgICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7CisgICAgICAgICRzdHJ1Y3RhID0gbmV3IFxUaHJpZnRUZXN0XFN0cnVjdEEoKTsKKyAgICAgICAgJHN0cnVjdGEtPnJlYWQoJHByb3RvY29sKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygiYWJjIiwgJHN0cnVjdGEtPnMpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0V3JpdGVTdHJ1Y3RBKCkKKyAgICB7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOworICAgICAgICAkc3RydWN0YSA9IG5ldyBcVGhyaWZ0VGVzdFxTdHJ1Y3RBKCk7CisgICAgICAgICRzdHJ1Y3RhLT5zID0gImFiYyI7CisgICAgICAgICRzdHJ1Y3RhLT53cml0ZSgkcHJvdG9jb2wpOworICAgICAgICAkd3JpdGVSZXN1bHQgPSBiYXNlNjRfZW5jb2RlKCR0cmFuc3BvcnQtPmdldEJ1ZmZlcigpKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygnQ3dBQkFBQUFBMkZpWXdBPScsICR3cml0ZVJlc3VsdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBhc3NlcnRIYXNSZWFkVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgIGlmICghc3RhdGljOjpoYXNSZWFkVmFsaWRhdG9yKCRjbGFzcykpIHsKKyAgICAgICAgICAgIHN0YXRpYzo6ZmFpbCgkY2xhc3MgLiAnIGNsYXNzIHNob3VsZCBoYXZlIGEgcmVhZCB2YWxpZGF0b3InKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gYXNzZXJ0Tm9SZWFkVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgIGlmIChzdGF0aWM6Omhhc1JlYWRWYWxpZGF0b3IoJGNsYXNzKSkgeworICAgICAgICAgICAgc3RhdGljOjpmYWlsKCRjbGFzcyAuICcgY2xhc3Mgc2hvdWxkIG5vdCBoYXZlIGEgd3JpdGUgdmFsaWRhdG9yJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGFzc2VydEhhc1dyaXRlVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgIGlmICghc3RhdGljOjpoYXNXcml0ZVZhbGlkYXRvcigkY2xhc3MpKSB7CisgICAgICAgICAgICBzdGF0aWM6OmZhaWwoJGNsYXNzIC4gJyBjbGFzcyBzaG91bGQgaGF2ZSBhIHdyaXRlIHZhbGlkYXRvcicpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBhc3NlcnROb1dyaXRlVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgIGlmIChzdGF0aWM6Omhhc1dyaXRlVmFsaWRhdG9yKCRjbGFzcykpIHsKKyAgICAgICAgICAgIHN0YXRpYzo6ZmFpbCgkY2xhc3MgLiAnIGNsYXNzIHNob3VsZCBub3QgaGF2ZSBhIHdyaXRlIHZhbGlkYXRvcicpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaGFzUmVhZFZhbGlkYXRvcigkY2xhc3MpCisgICAgeworICAgICAgICAkcmMgPSBuZXcgXFJlZmxlY3Rpb25DbGFzcygkY2xhc3MpOworCisgICAgICAgIHJldHVybiAkcmMtPmhhc01ldGhvZCgnX3ZhbGlkYXRlRm9yUmVhZCcpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGhhc1dyaXRlVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgICRyYyA9IG5ldyBcUmVmbGVjdGlvbkNsYXNzKCRjbGFzcyk7CisKKyAgICAgICAgcmV0dXJuICRyYy0+aGFzTWV0aG9kKCdfdmFsaWRhdGVGb3JXcml0ZScpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvVmFsaWRhdG9yVGVzdC5waHAgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL1ZhbGlkYXRvclRlc3QucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNmM3YTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL1ZhbGlkYXRvclRlc3QucGhwCkBAIC0wLDAgKzEsNDEgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdDsKKworcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKwordXNlIFRocmlmdFxDbGFzc0xvYWRlclxUaHJpZnRDbGFzc0xvYWRlcjsKKworLyoqCisgKiBDbGFzcyBUZXN0VmFsaWRhdG9ycworICogQHBhY2thZ2UgVGVzdFxUaHJpZnQKKyAqCisgKiBAcnVuVGVzdHNJblNlcGFyYXRlUHJvY2Vzc2VzCisgKi8KK2NsYXNzIFZhbGlkYXRvclRlc3QgZXh0ZW5kcyBCYXNlVmFsaWRhdG9yVGVzdAoreworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRVcCgpCisgICAgeworICAgICAgICAvKiogQHZhciBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIgJGxvYWRlciAqLworICAgICAgICAkbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKyAgICAgICAgJGxvYWRlci0+YWRkUHNyNCgnJywgX19ESVJfXyAuICcvLi4vcGFja2FnZXMvcGhwdicpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvVmFsaWRhdG9yVGVzdE9vcC5waHAgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL1ZhbGlkYXRvclRlc3RPb3AucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYmNhNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL1ZhbGlkYXRvclRlc3RPb3AucGhwCkBAIC0wLDAgKzEsNDEgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdDsKKworcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworCit1c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOworCisvKioKKyAqIENsYXNzIFRlc3RWYWxpZGF0b3JzT29wCisgKiBAcGFja2FnZSBUZXN0XFRocmlmdAorICoKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgVmFsaWRhdG9yVGVzdE9vcCBleHRlbmRzIEJhc2VWYWxpZGF0b3JUZXN0Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIHNldFVwKCkKKyAgICB7CisgICAgICAgIC8qKiBAdmFyIFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlciAkbG9hZGVyICovCisgICAgICAgICRsb2FkZXIgPSByZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworICAgICAgICAkbG9hZGVyLT5hZGRQc3I0KCcnLCBfX0RJUl9fIC4gJy8uLi9wYWNrYWdlcy9waHB2bycpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9weS9DTWFrZUxpc3RzLnR4dCBiL2xpYi9weS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmI5MWZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7UFlUSE9OX0lOQ0xVREVfRElSU30pCisKK2FkZF9jdXN0b21fdGFyZ2V0KHB5dGhvbl9idWlsZCBBTEwKKyAgICBDT01NQU5EICR7UFlUSE9OX0VYRUNVVEFCTEV9IHNldHVwLnB5IGJ1aWxkCisgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CisgICAgQ09NTUVOVCAiQnVpbGRpbmcgUHl0aG9uIGxpYnJhcnkiCispCisKK2lmKEJVSUxEX1RFU1RJTkcpCisgICAgYWRkX3Rlc3QoUHl0aG9uVGVzdFNTTFNvY2tldCAke1BZVEhPTl9FWEVDVVRBQkxFfSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdGVzdC90ZXN0X3NzbHNvY2tldC5weSkKKyAgICBhZGRfdGVzdChQeXRob25UaHJpZnRKc29uICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS90ZXN0L3RocmlmdF9qc29uLnB5KQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvbGliL3B5L01BTklGRVNULmluIGIvbGliL3B5L01BTklGRVNULmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNTRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvTUFOSUZFU1QuaW4KQEAgLTAsMCArMSBAQAoraW5jbHVkZSBzcmMvZXh0LyoKZGlmZiAtLWdpdCBhL2xpYi9weS9NYWtlZmlsZS5hbSBiL2xpYi9weS9NYWtlZmlsZS5hbQppbmRleCA1MjUwY2Y2Li41ODYxODU4IDEwMDY0NAotLS0gYS9saWIvcHkvTWFrZWZpbGUuYW0KKysrIGIvbGliL3B5L01ha2VmaWxlLmFtCkBAIC0xNiwxMSArMTYsMjEgQEAKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKLQorQVVUT01BS0VfT1BUSU9OUyA9IHNlcmlhbC10ZXN0cwogREVTVERJUiA/PSAvCi1FWFRSQV9ESVNUID0gc2V0dXAucHkgc2V0dXAuY2ZnIHNyYwogCi1hbGwtbG9jYWw6CitpZiBXSVRIX1BZMworcHkzLWJ1aWxkOgorCSQoUFlUSE9OMykgc2V0dXAucHkgYnVpbGQKK3B5My10ZXN0OiBweTMtYnVpbGQKKwkkKFBZVEhPTjMpIHRlc3QvdGhyaWZ0X2pzb24ucHkKKwkkKFBZVEhPTjMpIHRlc3QvdGVzdF9zc2xzb2NrZXQucHkKK2Vsc2UKK3B5My1idWlsZDoKK3B5My10ZXN0OgorZW5kaWYKKworYWxsLWxvY2FsOiBweTMtYnVpbGQKIAkkKFBZVEhPTikgc2V0dXAucHkgYnVpbGQKIAogIyBXZSdyZSBpZ25vcmluZyBwcmVmaXggaGVyZSBiZWNhdXNlIHNpdGUtcGFja2FnZXMgc2VlbXMgdG8gYmUKQEAgLTMzLDQgKzQzLDE3IEBACiBjbGVhbi1sb2NhbDoKIAkkKFJNKSAtciBidWlsZAogCi1jaGVjay1sb2NhbDogYWxsCitjaGVjay1sb2NhbDogYWxsIHB5My10ZXN0CisJJChQWVRIT04pIHRlc3QvdGhyaWZ0X2pzb24ucHkKKwkkKFBZVEhPTikgdGVzdC90ZXN0X3NzbHNvY2tldC5weQorCitFWFRSQV9ESVNUID0gXAorCUNNYWtlTGlzdHMudHh0IFwKKwlNQU5JRkVTVC5pbiBcCisJY29kaW5nX3N0YW5kYXJkcy5tZCBcCisJY29tcGF0IFwKKwlzZXR1cC5weSBcCisJc2V0dXAuY2ZnIFwKKwlzcmMgXAorCXRlc3QgXAorCVJFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL3B5L1JFQURNRSBiL2xpYi9weS9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9weS9SRUFETUUKcmVuYW1lIHRvIGxpYi9weS9SRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9weS9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL3B5L2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM1NjBiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEsNyBAQAorIyMgUHl0aG9uIENvZGluZyBTdGFuZGFyZHMKKworUGxlYXNlIGZvbGxvdzoKKyAqIFtUaHJpZnQgR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCisgKiBDb2RlIFN0eWxlIGZvciBQeXRob24gQ29kZSBbUEVQOF0oaHR0cDovL2xlZ2FjeS5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wMDA4LykKKworV2hlbiBpbiBkb3VidCAtIGNoZWNrIHdpdGggPGh0dHA6Ly93d3cucHlsaW50Lm9yZy8+IG9yIG9ubGluZSB3aXRoIDxodHRwOi8vcGVwOG9ubGluZS5jb20+LgpkaWZmIC0tZ2l0IGEvbGliL3B5L2NvbXBhdC93aW4zMi9zdGRpbnQuaCBiL2xpYi9weS9jb21wYXQvd2luMzIvc3RkaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAyNjA4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9jb21wYXQvd2luMzIvc3RkaW50LmgKQEAgLTAsMCArMSwyNDcgQEAKKy8vIElTTyBDOXggIGNvbXBsaWFudCBzdGRpbnQuaCBmb3IgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8KKy8vIEJhc2VkIG9uIElTTy9JRUMgOTg5OTpUQzIgQ29tbWl0dGVlIGRyYWZ0IChNYXkgNiwgMjAwNSkgV0cxNC9OMTEyNCAKKy8vIAorLy8gIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IEFsZXhhbmRlciBDaGVtZXJpcworLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8gCisvLyAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIAorLy8gICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAKKy8vICAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy8vIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisvLyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTworLy8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorLy8gUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7CisvLyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgCisvLyBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorLy8gT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgorLy8gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLyAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2lmbmRlZiBfTVNDX1ZFUiAvLyBbCisjZXJyb3IgIlVzZSB0aGlzIGhlYWRlciBvbmx5IHdpdGggTWljcm9zb2Z0IFZpc3VhbCBDKysgY29tcGlsZXJzISIKKyNlbmRpZiAvLyBfTVNDX1ZFUiBdCisKKyNpZm5kZWYgX01TQ19TVERJTlRfSF8gLy8gWworI2RlZmluZSBfTVNDX1NURElOVF9IXworCisjaWYgX01TQ19WRVIgPiAxMDAwCisjcHJhZ21hIG9uY2UKKyNlbmRpZgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKy8vIEZvciBWaXN1YWwgU3R1ZGlvIDYgaW4gQysrIG1vZGUgYW5kIGZvciBtYW55IFZpc3VhbCBTdHVkaW8gdmVyc2lvbnMgd2hlbgorLy8gY29tcGlsaW5nIGZvciBBUk0gd2Ugc2hvdWxkIHdyYXAgPHdjaGFyLmg+IGluY2x1ZGUgd2l0aCAnZXh0ZXJuICJDKysiIHt9JworLy8gb3IgY29tcGlsZXIgZ2l2ZSBtYW55IGVycm9ycyBsaWtlIHRoaXM6CisvLyAgIGVycm9yIEMyNzMzOiBzZWNvbmQgQyBsaW5rYWdlIG9mIG92ZXJsb2FkZWQgZnVuY3Rpb24gJ3dtZW1jaHInIG5vdCBhbGxvd2VkCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisjICBpbmNsdWRlIDx3Y2hhci5oPgorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworLy8gRGVmaW5lIF9XNjQgbWFjcm9zIHRvIG1hcmsgdHlwZXMgY2hhbmdpbmcgdGhlaXIgc2l6ZSwgbGlrZSBpbnRwdHJfdC4KKyNpZm5kZWYgX1c2NAorIyAgaWYgIWRlZmluZWQoX19taWRsKSAmJiAoZGVmaW5lZChfWDg2XykgfHwgZGVmaW5lZChfTV9JWDg2KSkgJiYgX01TQ19WRVIgPj0gMTMwMAorIyAgICAgZGVmaW5lIF9XNjQgX193NjQKKyMgIGVsc2UKKyMgICAgIGRlZmluZSBfVzY0CisjICBlbmRpZgorI2VuZGlmCisKKworLy8gNy4xOC4xIEludGVnZXIgdHlwZXMKKworLy8gNy4xOC4xLjEgRXhhY3Qtd2lkdGggaW50ZWdlciB0eXBlcworCisvLyBWaXN1YWwgU3R1ZGlvIDYgYW5kIEVtYmVkZGVkIFZpc3VhbCBDKysgNCBkb2Vzbid0CisvLyByZWFsaXplIHRoYXQsIGUuZy4gY2hhciBoYXMgdGhlIHNhbWUgc2l6ZSBhcyBfX2ludDgKKy8vIHNvIHdlIGdpdmUgdXAgb24gX19pbnRYIGZvciB0aGVtLgorI2lmIChfTVNDX1ZFUiA8IDEzMDApCisgICB0eXBlZGVmIHNpZ25lZCBjaGFyICAgICAgIGludDhfdDsKKyAgIHR5cGVkZWYgc2lnbmVkIHNob3J0ICAgICAgaW50MTZfdDsKKyAgIHR5cGVkZWYgc2lnbmVkIGludCAgICAgICAgaW50MzJfdDsKKyAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgdWludDhfdDsKKyAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgdWludDE2X3Q7CisgICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgIHVpbnQzMl90OworI2Vsc2UKKyAgIHR5cGVkZWYgc2lnbmVkIF9faW50OCAgICAgaW50OF90OworICAgdHlwZWRlZiBzaWduZWQgX19pbnQxNiAgICBpbnQxNl90OworICAgdHlwZWRlZiBzaWduZWQgX19pbnQzMiAgICBpbnQzMl90OworICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDggICB1aW50OF90OworICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDE2ICB1aW50MTZfdDsKKyAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQzMiAgdWludDMyX3Q7CisjZW5kaWYKK3R5cGVkZWYgc2lnbmVkIF9faW50NjQgICAgICAgaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCAgICAgdWludDY0X3Q7CisKKworLy8gNy4xOC4xLjIgTWluaW11bS13aWR0aCBpbnRlZ2VyIHR5cGVzCit0eXBlZGVmIGludDhfdCAgICBpbnRfbGVhc3Q4X3Q7Cit0eXBlZGVmIGludDE2X3QgICBpbnRfbGVhc3QxNl90OwordHlwZWRlZiBpbnQzMl90ICAgaW50X2xlYXN0MzJfdDsKK3R5cGVkZWYgaW50NjRfdCAgIGludF9sZWFzdDY0X3Q7Cit0eXBlZGVmIHVpbnQ4X3QgICB1aW50X2xlYXN0OF90OwordHlwZWRlZiB1aW50MTZfdCAgdWludF9sZWFzdDE2X3Q7Cit0eXBlZGVmIHVpbnQzMl90ICB1aW50X2xlYXN0MzJfdDsKK3R5cGVkZWYgdWludDY0X3QgIHVpbnRfbGVhc3Q2NF90OworCisvLyA3LjE4LjEuMyBGYXN0ZXN0IG1pbmltdW0td2lkdGggaW50ZWdlciB0eXBlcwordHlwZWRlZiBpbnQ4X3QgICAgaW50X2Zhc3Q4X3Q7Cit0eXBlZGVmIGludDE2X3QgICBpbnRfZmFzdDE2X3Q7Cit0eXBlZGVmIGludDMyX3QgICBpbnRfZmFzdDMyX3Q7Cit0eXBlZGVmIGludDY0X3QgICBpbnRfZmFzdDY0X3Q7Cit0eXBlZGVmIHVpbnQ4X3QgICB1aW50X2Zhc3Q4X3Q7Cit0eXBlZGVmIHVpbnQxNl90ICB1aW50X2Zhc3QxNl90OwordHlwZWRlZiB1aW50MzJfdCAgdWludF9mYXN0MzJfdDsKK3R5cGVkZWYgdWludDY0X3QgIHVpbnRfZmFzdDY0X3Q7CisKKy8vIDcuMTguMS40IEludGVnZXIgdHlwZXMgY2FwYWJsZSBvZiBob2xkaW5nIG9iamVjdCBwb2ludGVycworI2lmZGVmIF9XSU42NCAvLyBbCisgICB0eXBlZGVmIHNpZ25lZCBfX2ludDY0ICAgIGludHB0cl90OworICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0ICB1aW50cHRyX3Q7CisjZWxzZSAvLyBfV0lONjQgXVsKKyAgIHR5cGVkZWYgX1c2NCBzaWduZWQgaW50ICAgaW50cHRyX3Q7CisgICB0eXBlZGVmIF9XNjQgdW5zaWduZWQgaW50IHVpbnRwdHJfdDsKKyNlbmRpZiAvLyBfV0lONjQgXQorCisvLyA3LjE4LjEuNSBHcmVhdGVzdC13aWR0aCBpbnRlZ2VyIHR5cGVzCit0eXBlZGVmIGludDY0X3QgICBpbnRtYXhfdDsKK3R5cGVkZWYgdWludDY0X3QgIHVpbnRtYXhfdDsKKworCisvLyA3LjE4LjIgTGltaXRzIG9mIHNwZWNpZmllZC13aWR0aCBpbnRlZ2VyIHR5cGVzCisKKyNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChfX1NURENfTElNSVRfTUFDUk9TKSAvLyBbICAgU2VlIGZvb3Rub3RlIDIyMCBhdCBwYWdlIDI1NyBhbmQgZm9vdG5vdGUgMjIxIGF0IHBhZ2UgMjU5CisKKy8vIDcuMTguMi4xIExpbWl0cyBvZiBleGFjdC13aWR0aCBpbnRlZ2VyIHR5cGVzCisjZGVmaW5lIElOVDhfTUlOICAgICAoKGludDhfdClfSThfTUlOKQorI2RlZmluZSBJTlQ4X01BWCAgICAgX0k4X01BWAorI2RlZmluZSBJTlQxNl9NSU4gICAgKChpbnQxNl90KV9JMTZfTUlOKQorI2RlZmluZSBJTlQxNl9NQVggICAgX0kxNl9NQVgKKyNkZWZpbmUgSU5UMzJfTUlOICAgICgoaW50MzJfdClfSTMyX01JTikKKyNkZWZpbmUgSU5UMzJfTUFYICAgIF9JMzJfTUFYCisjZGVmaW5lIElOVDY0X01JTiAgICAoKGludDY0X3QpX0k2NF9NSU4pCisjZGVmaW5lIElOVDY0X01BWCAgICBfSTY0X01BWAorI2RlZmluZSBVSU5UOF9NQVggICAgX1VJOF9NQVgKKyNkZWZpbmUgVUlOVDE2X01BWCAgIF9VSTE2X01BWAorI2RlZmluZSBVSU5UMzJfTUFYICAgX1VJMzJfTUFYCisjZGVmaW5lIFVJTlQ2NF9NQVggICBfVUk2NF9NQVgKKworLy8gNy4xOC4yLjIgTGltaXRzIG9mIG1pbmltdW0td2lkdGggaW50ZWdlciB0eXBlcworI2RlZmluZSBJTlRfTEVBU1Q4X01JTiAgICBJTlQ4X01JTgorI2RlZmluZSBJTlRfTEVBU1Q4X01BWCAgICBJTlQ4X01BWAorI2RlZmluZSBJTlRfTEVBU1QxNl9NSU4gICBJTlQxNl9NSU4KKyNkZWZpbmUgSU5UX0xFQVNUMTZfTUFYICAgSU5UMTZfTUFYCisjZGVmaW5lIElOVF9MRUFTVDMyX01JTiAgIElOVDMyX01JTgorI2RlZmluZSBJTlRfTEVBU1QzMl9NQVggICBJTlQzMl9NQVgKKyNkZWZpbmUgSU5UX0xFQVNUNjRfTUlOICAgSU5UNjRfTUlOCisjZGVmaW5lIElOVF9MRUFTVDY0X01BWCAgIElOVDY0X01BWAorI2RlZmluZSBVSU5UX0xFQVNUOF9NQVggICBVSU5UOF9NQVgKKyNkZWZpbmUgVUlOVF9MRUFTVDE2X01BWCAgVUlOVDE2X01BWAorI2RlZmluZSBVSU5UX0xFQVNUMzJfTUFYICBVSU5UMzJfTUFYCisjZGVmaW5lIFVJTlRfTEVBU1Q2NF9NQVggIFVJTlQ2NF9NQVgKKworLy8gNy4xOC4yLjMgTGltaXRzIG9mIGZhc3Rlc3QgbWluaW11bS13aWR0aCBpbnRlZ2VyIHR5cGVzCisjZGVmaW5lIElOVF9GQVNUOF9NSU4gICAgSU5UOF9NSU4KKyNkZWZpbmUgSU5UX0ZBU1Q4X01BWCAgICBJTlQ4X01BWAorI2RlZmluZSBJTlRfRkFTVDE2X01JTiAgIElOVDE2X01JTgorI2RlZmluZSBJTlRfRkFTVDE2X01BWCAgIElOVDE2X01BWAorI2RlZmluZSBJTlRfRkFTVDMyX01JTiAgIElOVDMyX01JTgorI2RlZmluZSBJTlRfRkFTVDMyX01BWCAgIElOVDMyX01BWAorI2RlZmluZSBJTlRfRkFTVDY0X01JTiAgIElOVDY0X01JTgorI2RlZmluZSBJTlRfRkFTVDY0X01BWCAgIElOVDY0X01BWAorI2RlZmluZSBVSU5UX0ZBU1Q4X01BWCAgIFVJTlQ4X01BWAorI2RlZmluZSBVSU5UX0ZBU1QxNl9NQVggIFVJTlQxNl9NQVgKKyNkZWZpbmUgVUlOVF9GQVNUMzJfTUFYICBVSU5UMzJfTUFYCisjZGVmaW5lIFVJTlRfRkFTVDY0X01BWCAgVUlOVDY0X01BWAorCisvLyA3LjE4LjIuNCBMaW1pdHMgb2YgaW50ZWdlciB0eXBlcyBjYXBhYmxlIG9mIGhvbGRpbmcgb2JqZWN0IHBvaW50ZXJzCisjaWZkZWYgX1dJTjY0IC8vIFsKKyMgIGRlZmluZSBJTlRQVFJfTUlOICAgSU5UNjRfTUlOCisjICBkZWZpbmUgSU5UUFRSX01BWCAgIElOVDY0X01BWAorIyAgZGVmaW5lIFVJTlRQVFJfTUFYICBVSU5UNjRfTUFYCisjZWxzZSAvLyBfV0lONjQgXVsKKyMgIGRlZmluZSBJTlRQVFJfTUlOICAgSU5UMzJfTUlOCisjICBkZWZpbmUgSU5UUFRSX01BWCAgIElOVDMyX01BWAorIyAgZGVmaW5lIFVJTlRQVFJfTUFYICBVSU5UMzJfTUFYCisjZW5kaWYgLy8gX1dJTjY0IF0KKworLy8gNy4xOC4yLjUgTGltaXRzIG9mIGdyZWF0ZXN0LXdpZHRoIGludGVnZXIgdHlwZXMKKyNkZWZpbmUgSU5UTUFYX01JTiAgIElOVDY0X01JTgorI2RlZmluZSBJTlRNQVhfTUFYICAgSU5UNjRfTUFYCisjZGVmaW5lIFVJTlRNQVhfTUFYICBVSU5UNjRfTUFYCisKKy8vIDcuMTguMyBMaW1pdHMgb2Ygb3RoZXIgaW50ZWdlciB0eXBlcworCisjaWZkZWYgX1dJTjY0IC8vIFsKKyMgIGRlZmluZSBQVFJESUZGX01JTiAgX0k2NF9NSU4KKyMgIGRlZmluZSBQVFJESUZGX01BWCAgX0k2NF9NQVgKKyNlbHNlICAvLyBfV0lONjQgXVsKKyMgIGRlZmluZSBQVFJESUZGX01JTiAgX0kzMl9NSU4KKyMgIGRlZmluZSBQVFJESUZGX01BWCAgX0kzMl9NQVgKKyNlbmRpZiAgLy8gX1dJTjY0IF0KKworI2RlZmluZSBTSUdfQVRPTUlDX01JTiAgSU5UX01JTgorI2RlZmluZSBTSUdfQVRPTUlDX01BWCAgSU5UX01BWAorCisjaWZuZGVmIFNJWkVfTUFYIC8vIFsKKyMgIGlmZGVmIF9XSU42NCAvLyBbCisjICAgICBkZWZpbmUgU0laRV9NQVggIF9VSTY0X01BWAorIyAgZWxzZSAvLyBfV0lONjQgXVsKKyMgICAgIGRlZmluZSBTSVpFX01BWCAgX1VJMzJfTUFYCisjICBlbmRpZiAvLyBfV0lONjQgXQorI2VuZGlmIC8vIFNJWkVfTUFYIF0KKworLy8gV0NIQVJfTUlOIGFuZCBXQ0hBUl9NQVggYXJlIGFsc28gZGVmaW5lZCBpbiA8d2NoYXIuaD4KKyNpZm5kZWYgV0NIQVJfTUlOIC8vIFsKKyMgIGRlZmluZSBXQ0hBUl9NSU4gIDAKKyNlbmRpZiAgLy8gV0NIQVJfTUlOIF0KKyNpZm5kZWYgV0NIQVJfTUFYIC8vIFsKKyMgIGRlZmluZSBXQ0hBUl9NQVggIF9VSTE2X01BWAorI2VuZGlmICAvLyBXQ0hBUl9NQVggXQorCisjZGVmaW5lIFdJTlRfTUlOICAwCisjZGVmaW5lIFdJTlRfTUFYICBfVUkxNl9NQVgKKworI2VuZGlmIC8vIF9fU1REQ19MSU1JVF9NQUNST1MgXQorCisKKy8vIDcuMTguNCBMaW1pdHMgb2Ygb3RoZXIgaW50ZWdlciB0eXBlcworCisjaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoX19TVERDX0NPTlNUQU5UX01BQ1JPUykgLy8gWyAgIFNlZSBmb290bm90ZSAyMjQgYXQgcGFnZSAyNjAKKworLy8gNy4xOC40LjEgTWFjcm9zIGZvciBtaW5pbXVtLXdpZHRoIGludGVnZXIgY29uc3RhbnRzCisKKyNkZWZpbmUgSU5UOF9DKHZhbCkgIHZhbCMjaTgKKyNkZWZpbmUgSU5UMTZfQyh2YWwpIHZhbCMjaTE2CisjZGVmaW5lIElOVDMyX0ModmFsKSB2YWwjI2kzMgorI2RlZmluZSBJTlQ2NF9DKHZhbCkgdmFsIyNpNjQKKworI2RlZmluZSBVSU5UOF9DKHZhbCkgIHZhbCMjdWk4CisjZGVmaW5lIFVJTlQxNl9DKHZhbCkgdmFsIyN1aTE2CisjZGVmaW5lIFVJTlQzMl9DKHZhbCkgdmFsIyN1aTMyCisjZGVmaW5lIFVJTlQ2NF9DKHZhbCkgdmFsIyN1aTY0CisKKy8vIDcuMTguNC4yIE1hY3JvcyBmb3IgZ3JlYXRlc3Qtd2lkdGggaW50ZWdlciBjb25zdGFudHMKKyNkZWZpbmUgSU5UTUFYX0MgICBJTlQ2NF9DCisjZGVmaW5lIFVJTlRNQVhfQyAgVUlOVDY0X0MKKworI2VuZGlmIC8vIF9fU1REQ19DT05TVEFOVF9NQUNST1MgXQorCisKKyNlbmRpZiAvLyBfTVNDX1NURElOVF9IXyBdCmRpZmYgLS1naXQgYS9saWIvcHkvc2V0dXAuY2ZnIGIvbGliL3B5L3NldHVwLmNmZwppbmRleCAyZGNhMmY4Li5jOWVkMGFlIDEwMDY0NAotLS0gYS9saWIvcHkvc2V0dXAuY2ZnCisrKyBiL2xpYi9weS9zZXR1cC5jZmcKQEAgLTEsMiArMSw2IEBACiBbaW5zdGFsbF0KIG9wdGltaXplID0gMQorW21ldGFkYXRhXQorZGVzY3JpcHRpb24tZmlsZSA9IFJFQURNRS5tZAorW2ZsYWtlOF0KK21heC1saW5lLWxlbmd0aCA9IDEwMApkaWZmIC0tZ2l0IGEvbGliL3B5L3NldHVwLnB5IGIvbGliL3B5L3NldHVwLnB5CmluZGV4IDYwZTI0NzkuLjNjZjE0NjkgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zZXR1cC5weQorKysgYi9saWIvcHkvc2V0dXAucHkKQEAgLTksNyArOSw3IEBACiAjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKICMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jCWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCiAjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCkBAIC0xOSwzOCArMTksMTIxIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCitpbXBvcnQgc3lzCiB0cnk6CiAgICAgZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uCi1leGNlcHQ6CitleGNlcHQgRXhjZXB0aW9uOgogICAgIGZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwLCBFeHRlbnNpb24KIAotZmFzdGJpbmFyeW1vZCA9IEV4dGVuc2lvbigndGhyaWZ0LnByb3RvY29sLmZhc3RiaW5hcnknLAotICAgICAgICAgICAgICAgICAgICBzb3VyY2VzID0gWydzcmMvcHJvdG9jb2wvZmFzdGJpbmFyeS5jJ10sCi0gICAgICAgICAgICAgICAgKQorZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHQgaW1wb3J0IGJ1aWxkX2V4dAorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBDQ29tcGlsZXJFcnJvciwgRGlzdHV0aWxzRXhlY0Vycm9yLCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yCiAKLXNldHVwKG5hbWUgPSAndGhyaWZ0JywKLSAgICB2ZXJzaW9uID0gJzAuNy4wJywKLSAgICBkZXNjcmlwdGlvbiA9ICdQeXRob24gYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0nLAotICAgIGF1dGhvciA9IFsnVGhyaWZ0IERldmVsb3BlcnMnXSwKLSAgICBhdXRob3JfZW1haWwgPSBbJ2RldkB0aHJpZnQuYXBhY2hlLm9yZyddLAotICAgIHVybCA9ICdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcnLAotICAgIGxpY2Vuc2UgPSAnQXBhY2hlIExpY2Vuc2UgMi4wJywKLSAgICBwYWNrYWdlcyA9IFsKLSAgICAgICAgJ3RocmlmdCcsCi0gICAgICAgICd0aHJpZnQucHJvdG9jb2wnLAotICAgICAgICAndGhyaWZ0LnRyYW5zcG9ydCcsCi0gICAgICAgICd0aHJpZnQuc2VydmVyJywKLSAgICBdLAotICAgIHBhY2thZ2VfZGlyID0geyd0aHJpZnQnIDogJ3NyYyd9LAotICAgIGV4dF9tb2R1bGVzID0gW2Zhc3RiaW5hcnltb2RdLAotICAgIGNsYXNzaWZpZXJzPVsKLSAgICAgICAgJ0RldmVsb3BtZW50IFN0YXR1cyA6OiA1IC0gUHJvZHVjdGlvbi9TdGFibGUnLAotICAgICAgICAnRW52aXJvbm1lbnQgOjogQ29uc29sZScsCi0gICAgICAgICdJbnRlbmRlZCBBdWRpZW5jZSA6OiBEZXZlbG9wZXJzJywKLSAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbicsCi0gICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMicsCi0gICAgICAgICdUb3BpYyA6OiBTb2Z0d2FyZSBEZXZlbG9wbWVudCA6OiBMaWJyYXJpZXMnLAotICAgICAgICAnVG9waWMgOjogU3lzdGVtIDo6IE5ldHdvcmtpbmcnCi0gICAgXQotKQorIyBGaXggdG8gYnVpbGQgc2Rpc3QgdW5kZXIgdmFncmFudAoraW1wb3J0IG9zCitpZiAndmFncmFudCcgaW4gc3RyKG9zLmVudmlyb24pOgorICAgIHRyeToKKyAgICAgICAgZGVsIG9zLmxpbmsKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIHBhc3MKIAoraW5jbHVkZV9kaXJzID0gWydzcmMnXQoraWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgaW5jbHVkZV9kaXJzLmFwcGVuZCgnY29tcGF0L3dpbjMyJykKKyAgICBleHRfZXJyb3JzID0gKENDb21waWxlckVycm9yLCBEaXN0dXRpbHNFeGVjRXJyb3IsIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsIElPRXJyb3IpCitlbHNlOgorICAgIGV4dF9lcnJvcnMgPSAoQ0NvbXBpbGVyRXJyb3IsIERpc3R1dGlsc0V4ZWNFcnJvciwgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcikKKworCitjbGFzcyBCdWlsZEZhaWxlZChFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitjbGFzcyB2ZV9idWlsZF9leHQoYnVpbGRfZXh0KToKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBidWlsZF9leHQucnVuKHNlbGYpCisgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yOgorICAgICAgICAgICAgcmFpc2UgQnVpbGRGYWlsZWQoKQorCisgICAgZGVmIGJ1aWxkX2V4dGVuc2lvbihzZWxmLCBleHQpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBidWlsZF9leHQuYnVpbGRfZXh0ZW5zaW9uKHNlbGYsIGV4dCkKKyAgICAgICAgZXhjZXB0IGV4dF9lcnJvcnM6CisgICAgICAgICAgICByYWlzZSBCdWlsZEZhaWxlZCgpCisKKworZGVmIHJ1bl9zZXR1cCh3aXRoX2JpbmFyeSk6CisgICAgaWYgd2l0aF9iaW5hcnk6CisgICAgICAgIGV4dGVuc2lvbnMgPSBkaWN0KAorICAgICAgICAgICAgZXh0X21vZHVsZXM9WworICAgICAgICAgICAgICAgIEV4dGVuc2lvbigndGhyaWZ0LnByb3RvY29sLmZhc3RiaW5hcnknLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPVsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvZXh0L21vZHVsZS5jcHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9leHQvdHlwZXMuY3BwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvZXh0L2JpbmFyeS5jcHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9leHQvY29tcGFjdC5jcHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlX2RpcnM9aW5jbHVkZV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgY21kY2xhc3M9ZGljdChidWlsZF9leHQ9dmVfYnVpbGRfZXh0KQorICAgICAgICApCisgICAgZWxzZToKKyAgICAgICAgZXh0ZW5zaW9ucyA9IGRpY3QoKQorCisgICAgc3NsX2RlcHMgPSBbXQorICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMjoKKyAgICAgICAgc3NsX2RlcHMuYXBwZW5kKCdpcGFkZHJlc3MnKQorICAgIGlmIHN5cy5oZXh2ZXJzaW9uIDwgMHgwMzA1MDAwMDoKKyAgICAgICAgc3NsX2RlcHMuYXBwZW5kKCdiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lPj0zLjUnKQorICAgIHRvcm5hZG9fZGVwcyA9IFsndG9ybmFkbz49NC4wJ10KKyAgICB0d2lzdGVkX2RlcHMgPSBbJ3R3aXN0ZWQnXQorCisgICAgc2V0dXAobmFtZT0ndGhyaWZ0JywKKyAgICAgICAgICB2ZXJzaW9uPScxLjAuMCcsCisgICAgICAgICAgZGVzY3JpcHRpb249J1B5dGhvbiBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbScsCisgICAgICAgICAgYXV0aG9yPSdBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMnLAorICAgICAgICAgIGF1dGhvcl9lbWFpbD0nZGV2QHRocmlmdC5hcGFjaGUub3JnJywKKyAgICAgICAgICB1cmw9J2h0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZycsCisgICAgICAgICAgbGljZW5zZT0nQXBhY2hlIExpY2Vuc2UgMi4wJywKKyAgICAgICAgICBpbnN0YWxsX3JlcXVpcmVzPVsnc2l4Pj0xLjcuMiddLAorICAgICAgICAgIGV4dHJhc19yZXF1aXJlPXsKKyAgICAgICAgICAgICAgJ3NzbCc6IHNzbF9kZXBzLAorICAgICAgICAgICAgICAndG9ybmFkbyc6IHRvcm5hZG9fZGVwcywKKyAgICAgICAgICAgICAgJ3R3aXN0ZWQnOiB0d2lzdGVkX2RlcHMsCisgICAgICAgICAgICAgICdhbGwnOiBzc2xfZGVwcyArIHRvcm5hZG9fZGVwcyArIHR3aXN0ZWRfZGVwcywKKyAgICAgICAgICB9LAorICAgICAgICAgIHBhY2thZ2VzPVsKKyAgICAgICAgICAgICAgJ3RocmlmdCcsCisgICAgICAgICAgICAgICd0aHJpZnQucHJvdG9jb2wnLAorICAgICAgICAgICAgICAndGhyaWZ0LnRyYW5zcG9ydCcsCisgICAgICAgICAgICAgICd0aHJpZnQuc2VydmVyJywKKyAgICAgICAgICBdLAorICAgICAgICAgIHBhY2thZ2VfZGlyPXsndGhyaWZ0JzogJ3NyYyd9LAorICAgICAgICAgIGNsYXNzaWZpZXJzPVsKKyAgICAgICAgICAgICAgJ0RldmVsb3BtZW50IFN0YXR1cyA6OiA1IC0gUHJvZHVjdGlvbi9TdGFibGUnLAorICAgICAgICAgICAgICAnRW52aXJvbm1lbnQgOjogQ29uc29sZScsCisgICAgICAgICAgICAgICdJbnRlbmRlZCBBdWRpZW5jZSA6OiBEZXZlbG9wZXJzJywKKyAgICAgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbicsCisgICAgICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMicsCisgICAgICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMycsCisgICAgICAgICAgICAgICdUb3BpYyA6OiBTb2Z0d2FyZSBEZXZlbG9wbWVudCA6OiBMaWJyYXJpZXMnLAorICAgICAgICAgICAgICAnVG9waWMgOjogU3lzdGVtIDo6IE5ldHdvcmtpbmcnCisgICAgICAgICAgXSwKKyAgICAgICAgICB6aXBfc2FmZT1GYWxzZSwKKyAgICAgICAgICAqKmV4dGVuc2lvbnMKKyAgICAgICAgICApCisKKwordHJ5OgorICAgIHdpdGhfYmluYXJ5ID0gVHJ1ZQorICAgIHJ1bl9zZXR1cCh3aXRoX2JpbmFyeSkKK2V4Y2VwdCBCdWlsZEZhaWxlZDoKKyAgICBwcmludCgpCisgICAgcHJpbnQoJyonICogODApCisgICAgcHJpbnQoIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBjb21waWxlIHdpdGggdGhlIEMgZXh0ZW5zaW9uIGVuYWJsZWQiKQorICAgIHByaW50KCJBdHRlbXB0aW5nIHRvIGJ1aWxkIHdpdGhvdXQgdGhlIGV4dGVuc2lvbiBub3ciKQorICAgIHByaW50KCcqJyAqIDgwKQorICAgIHByaW50KCkKKworICAgIHJ1bl9zZXR1cChGYWxzZSkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvVE11bHRpcGxleGVkUHJvY2Vzc29yLnB5IGIvbGliL3B5L3NyYy9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjNWFmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvVE11bHRpcGxleGVkUHJvY2Vzc29yLnB5CkBAIC0wLDAgKzEsNTQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRQcm9jZXNzb3IsIFRNZXNzYWdlVHlwZSwgVEV4Y2VwdGlvbgorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRQcm90b2NvbERlY29yYXRvciwgVE11bHRpcGxleGVkUHJvdG9jb2wKKworCitjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoVFByb2Nlc3Nvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZpY2VzID0ge30KKworICAgIGRlZiByZWdpc3RlclByb2Nlc3NvcihzZWxmLCBzZXJ2aWNlTmFtZSwgcHJvY2Vzc29yKToKKyAgICAgICAgc2VsZi5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV0gPSBwcm9jZXNzb3IKKworICAgIGRlZiBwcm9jZXNzKHNlbGYsIGlwcm90LCBvcHJvdCk6CisgICAgICAgIChuYW1lLCB0eXBlLCBzZXFpZCkgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkKKyAgICAgICAgaWYgdHlwZSAhPSBUTWVzc2FnZVR5cGUuQ0FMTCBhbmQgdHlwZSAhPSBUTWVzc2FnZVR5cGUuT05FV0FZOgorICAgICAgICAgICAgcmFpc2UgVEV4Y2VwdGlvbigiVE11bHRpcGxleGVkIHByb3RvY29sIG9ubHkgc3VwcG9ydHMgQ0FMTCAmIE9ORVdBWSIpCisKKyAgICAgICAgaW5kZXggPSBuYW1lLmZpbmQoVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SKQorICAgICAgICBpZiBpbmRleCA8IDA6CisgICAgICAgICAgICByYWlzZSBURXhjZXB0aW9uKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogIiArIG5hbWUgKyAiLiBEaWQgeW91IGZvcmdldCB0byB1c2UgVE11bHRpcGxleGVkUHJvdG9jb2wgaW4geW91ciBjbGllbnQ/IikKKworICAgICAgICBzZXJ2aWNlTmFtZSA9IG5hbWVbMDppbmRleF0KKyAgICAgICAgY2FsbCA9IG5hbWVbaW5kZXggKyBsZW4oVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SKTpdCisgICAgICAgIGlmIHNlcnZpY2VOYW1lIG5vdCBpbiBzZWxmLnNlcnZpY2VzOgorICAgICAgICAgICAgcmFpc2UgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogIiArIHNlcnZpY2VOYW1lICsgIi4gRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyIpCisKKyAgICAgICAgc3RhbmRhcmRNZXNzYWdlID0gKGNhbGwsIHR5cGUsIHNlcWlkKQorICAgICAgICByZXR1cm4gc2VsZi5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV0ucHJvY2VzcyhTdG9yZWRNZXNzYWdlUHJvdG9jb2woaXByb3QsIHN0YW5kYXJkTWVzc2FnZSksIG9wcm90KQorCisKK2NsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbChUUHJvdG9jb2xEZWNvcmF0b3IuVFByb3RvY29sRGVjb3JhdG9yKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvdG9jb2wsIG1lc3NhZ2VCZWdpbik6CisgICAgICAgIHNlbGYubWVzc2FnZUJlZ2luID0gbWVzc2FnZUJlZ2luCisKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubWVzc2FnZUJlZ2luCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL1RSZWN1cnNpdmUucHkgYi9saWIvcHkvc3JjL1RSZWN1cnNpdmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmMjAyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvVFJlY3Vyc2l2ZS5weQpAQCAtMCwwICsxLDgzIEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCisKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVFR5cGUKKworVFlQRV9JRFggPSAxCitTUEVDX0FSR1NfSURYID0gMworU1BFQ19BUkdTX0NMQVNTX1JFRl9JRFggPSAwCitTUEVDX0FSR1NfVEhSSUZUX1NQRUNfSURYID0gMQorCisKK2RlZiBmaXhfc3BlYyhhbGxfc3RydWN0cyk6CisgICAgIiIiV2lyZSB1cCByZWN1cnNpdmUgcmVmZXJlbmNlcyBmb3IgYWxsIFRTdHJ1Y3QgZGVmaW5pdGlvbnMgaW5zaWRlIG9mIGVhY2ggdGhyaWZ0X3NwZWMuIiIiCisgICAgZm9yIHN0cnVjIGluIGFsbF9zdHJ1Y3RzOgorICAgICAgICBzcGVjID0gc3RydWMudGhyaWZ0X3NwZWMKKyAgICAgICAgZm9yIHRocmlmdF9zcGVjIGluIHNwZWM6CisgICAgICAgICAgICBpZiB0aHJpZnRfc3BlYyBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHRocmlmdF9zcGVjW1RZUEVfSURYXSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgICAgICAgICAgb3RoZXIgPSB0aHJpZnRfc3BlY1tTUEVDX0FSR1NfSURYXVtTUEVDX0FSR1NfQ0xBU1NfUkVGX0lEWF0udGhyaWZ0X3NwZWMKKyAgICAgICAgICAgICAgICB0aHJpZnRfc3BlY1tTUEVDX0FSR1NfSURYXVtTUEVDX0FSR1NfVEhSSUZUX1NQRUNfSURYXSA9IG90aGVyCisgICAgICAgICAgICBlbGlmIHRocmlmdF9zcGVjW1RZUEVfSURYXSBpbiAoVFR5cGUuTElTVCwgVFR5cGUuU0VUKToKKyAgICAgICAgICAgICAgICBfZml4X2xpc3Rfb3Jfc2V0KHRocmlmdF9zcGVjW1NQRUNfQVJHU19JRFhdKQorICAgICAgICAgICAgZWxpZiB0aHJpZnRfc3BlY1tUWVBFX0lEWF0gPT0gVFR5cGUuTUFQOgorICAgICAgICAgICAgICAgIF9maXhfbWFwKHRocmlmdF9zcGVjW1NQRUNfQVJHU19JRFhdKQorCisKK2RlZiBfZml4X2xpc3Rfb3Jfc2V0KGVsZW1lbnRfdHlwZSk6CisgICAgIyBGb3IgYSBsaXN0IG9yIHNldCwgdGhlIHRocmlmdF9zcGVjIGVudHJ5IGxvb2tzIGxpa2UsCisgICAgIyAoMSwgVFR5cGUuTElTVCwgJ2xpc3RlcicsIChUVHlwZS5TVFJVQ1QsIFtSZWNMaXN0LCBOb25lXSwgRmFsc2UpLCBOb25lLCApLCAgIyAxCisgICAgIyBzbyBgYGVsZW1lbnRfdHlwZWBgIHdpbGwgYmUsCisgICAgIyAoVFR5cGUuU1RSVUNULCBbUmVjTGlzdCwgTm9uZV0sIEZhbHNlKQorICAgIGlmIGVsZW1lbnRfdHlwZVswXSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgIGVsZW1lbnRfdHlwZVsxXVsxXSA9IGVsZW1lbnRfdHlwZVsxXVswXS50aHJpZnRfc3BlYworICAgIGVsaWYgZWxlbWVudF90eXBlWzBdIGluIChUVHlwZS5MSVNULCBUVHlwZS5TRVQpOgorICAgICAgICBfZml4X2xpc3Rfb3Jfc2V0KGVsZW1lbnRfdHlwZVsxXSkKKyAgICBlbGlmIGVsZW1lbnRfdHlwZVswXSA9PSBUVHlwZS5NQVA6CisgICAgICAgIF9maXhfbWFwKGVsZW1lbnRfdHlwZVsxXSkKKworCitkZWYgX2ZpeF9tYXAoZWxlbWVudF90eXBlKToKKyAgICAjIEZvciBhIG1hcCBvZiBrZXkgLT4gdmFsdWUgdHlwZSwgYGBlbGVtZW50X3R5cGVgYCB3aWxsIGJlLAorICAgICMgKFRUeXBlLkkxNiwgTm9uZSwgVFR5cGUuU1RSVUNULCBbUmVjTWFwQmFzaWMsIE5vbmVdLCBGYWxzZSksIE5vbmUsICkKKyAgICAjIHdoaWNoIGlzIGp1c3QgYSBub3JtYWwgc3RydWN0IGRlZmluaXRpb24uCisgICAgIworICAgICMgRm9yIGEgbWFwIG9mIGtleSAtPiBsaXN0IC8gc2V0LCBgYGVsZW1lbnRfdHlwZWBgIHdpbGwgYmUsCisgICAgIyAoVFR5cGUuSTE2LCBOb25lLCBUVHlwZS5MSVNULCAoVFR5cGUuU1RSVUNULCBbUmVjTWFwTGlzdCwgTm9uZV0sIEZhbHNlKSwgRmFsc2UpCisgICAgIyBhbmQgd2UgbmVlZCB0byBwcm9jZXNzIHRoZSAzcmQgZWxlbWVudCBhcyBhIGxpc3QuCisgICAgIworICAgICMgRm9yIGEgbWFwIG9mIGtleSAtPiBtYXAsIGBgZWxlbWVudF90eXBlYGAgd2lsbCBiZSwKKyAgICAjIChUVHlwZS5JMTYsIE5vbmUsIFRUeXBlLk1BUCwgKFRUeXBlLkkxNiwgTm9uZSwgVFR5cGUuU1RSVUNULAorICAgICMgIFtSZWNNYXBNYXAsIE5vbmVdLCBGYWxzZSksIEZhbHNlKQorICAgICMgYW5kIG5lZWQgdG8gcHJvY2VzcyAzcmQgZWxlbWVudCBhcyBhIG1hcC4KKworICAgICMgSXMgdGhlIG1hcCBrZXkgYSBzdHJ1Y3Q/CisgICAgaWYgZWxlbWVudF90eXBlWzBdID09IFRUeXBlLlNUUlVDVDoKKyAgICAgICAgZWxlbWVudF90eXBlWzFdWzFdID0gZWxlbWVudF90eXBlWzFdWzBdLnRocmlmdF9zcGVjCisgICAgZWxpZiBlbGVtZW50X3R5cGVbMF0gaW4gKFRUeXBlLkxJU1QsIFRUeXBlLlNFVCk6CisgICAgICAgIF9maXhfbGlzdF9vcl9zZXQoZWxlbWVudF90eXBlWzFdKQorICAgIGVsaWYgZWxlbWVudF90eXBlWzBdID09IFRUeXBlLk1BUDoKKyAgICAgICAgX2ZpeF9tYXAoZWxlbWVudF90eXBlWzFdKQorCisgICAgIyBJcyB0aGUgbWFwIHZhbHVlIGEgc3RydWN0PworICAgIGlmIGVsZW1lbnRfdHlwZVsyXSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgIGVsZW1lbnRfdHlwZVszXVsxXSA9IGVsZW1lbnRfdHlwZVszXVswXS50aHJpZnRfc3BlYworICAgIGVsaWYgZWxlbWVudF90eXBlWzJdIGluIChUVHlwZS5MSVNULCBUVHlwZS5TRVQpOgorICAgICAgICBfZml4X2xpc3Rfb3Jfc2V0KGVsZW1lbnRfdHlwZVszXSkKKyAgICBlbGlmIGVsZW1lbnRfdHlwZVsyXSA9PSBUVHlwZS5NQVA6CisgICAgICAgIF9maXhfbWFwKGVsZW1lbnRfdHlwZVszXSkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvVFNDb25zLnB5IGIvbGliL3B5L3NyYy9UU0NvbnMucHkKaW5kZXggMjQwNDYyNS4uYmM2N2Q3MCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9UU0NvbnMucHkKKysrIGIvbGliL3B5L3NyYy9UU0NvbnMucHkKQEAgLTE5LDE1ICsxOSwxOCBAQAogCiBmcm9tIG9zIGltcG9ydCBwYXRoCiBmcm9tIFNDb25zLkJ1aWxkZXIgaW1wb3J0IEJ1aWxkZXIKK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCBtYXAKKwogCiBkZWYgc2NvbnNfZW52KGVudiwgYWRkPScnKToKLSAgb3BhdGggPSBwYXRoLmRpcm5hbWUocGF0aC5hYnNwYXRoKCckVEFSR0VUJykpCi0gIGxzdHIgPSAndGhyaWZ0IC0tZ2VuIGNwcCAtbyAnICsgb3BhdGggKyAnICcgKyBhZGQgKyAnICRTT1VSQ0UnCi0gIGNwcGJ1aWxkID0gQnVpbGRlcihhY3Rpb24gPSBsc3RyKQotICBlbnYuQXBwZW5kKEJVSUxERVJTID0geydUaHJpZnRDcHAnIDogY3BwYnVpbGR9KQorICAgIG9wYXRoID0gcGF0aC5kaXJuYW1lKHBhdGguYWJzcGF0aCgnJFRBUkdFVCcpKQorICAgIGxzdHIgPSAndGhyaWZ0IC0tZ2VuIGNwcCAtbyAnICsgb3BhdGggKyAnICcgKyBhZGQgKyAnICRTT1VSQ0UnCisgICAgY3BwYnVpbGQgPSBCdWlsZGVyKGFjdGlvbj1sc3RyKQorICAgIGVudi5BcHBlbmQoQlVJTERFUlM9eydUaHJpZnRDcHAnOiBjcHBidWlsZH0pCisKIAogZGVmIGdlbl9jcHAoZW52LCBkaXIsIGZpbGUpOgotICBzY29uc19lbnYoZW52KQotICBzdWZmaXhlcyA9IFsnX3R5cGVzLmgnLCAnX3R5cGVzLmNwcCddCi0gIHRhcmdldHMgPSBtYXAobGFtYmRhIHM6ICdnZW4tY3BwLycgKyBmaWxlICsgcywgc3VmZml4ZXMpCi0gIHJldHVybiBlbnYuVGhyaWZ0Q3BwKHRhcmdldHMsIGRpcitmaWxlKycudGhyaWZ0JykKKyAgICBzY29uc19lbnYoZW52KQorICAgIHN1ZmZpeGVzID0gWydfdHlwZXMuaCcsICdfdHlwZXMuY3BwJ10KKyAgICB0YXJnZXRzID0gbWFwKGxhbWJkYSBzOiAnZ2VuLWNwcC8nICsgZmlsZSArIHMsIHN1ZmZpeGVzKQorICAgIHJldHVybiBlbnYuVGhyaWZ0Q3BwKHRhcmdldHMsIGRpciArIGZpbGUgKyAnLnRocmlmdCcpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL1RTZXJpYWxpemF0aW9uLnB5IGIvbGliL3B5L3NyYy9UU2VyaWFsaXphdGlvbi5weQppbmRleCBiMTlmOThhLi5mYmJlNzY4IDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL1RTZXJpYWxpemF0aW9uLnB5CisrKyBiL2xpYi9weS9zcmMvVFNlcmlhbGl6YXRpb24ucHkKQEAgLTE3LDE4ICsxNywyMiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSBwcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCi1mcm9tIHRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorZnJvbSAucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorZnJvbSAudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CiAKLWRlZiBzZXJpYWxpemUodGhyaWZ0X29iamVjdCwgcHJvdG9jb2xfZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOgorCitkZWYgc2VyaWFsaXplKHRocmlmdF9vYmplY3QsCisgICAgICAgICAgICAgIHByb3RvY29sX2ZhY3Rvcnk9VEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk6CiAgICAgdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKICAgICBwcm90b2NvbCA9IHByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQogICAgIHRocmlmdF9vYmplY3Qud3JpdGUocHJvdG9jb2wpCiAgICAgcmV0dXJuIHRyYW5zcG9ydC5nZXR2YWx1ZSgpCiAKLWRlZiBkZXNlcmlhbGl6ZShiYXNlLCBidWYsIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKToKKworZGVmIGRlc2VyaWFsaXplKGJhc2UsCisgICAgICAgICAgICAgICAgYnVmLAorICAgICAgICAgICAgICAgIHByb3RvY29sX2ZhY3Rvcnk9VEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk6CiAgICAgdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGJ1ZikKICAgICBwcm90b2NvbCA9IHByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQogICAgIGJhc2UucmVhZChwcm90b2NvbCkKICAgICByZXR1cm4gYmFzZQotCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL1RUb3JuYWRvLnB5IGIvbGliL3B5L3NyYy9UVG9ybmFkby5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWZmMTFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9UVG9ybmFkby5weQpAQCAtMCwwICsxLDE4OCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHNvY2tldAoraW1wb3J0IHN0cnVjdAorCitmcm9tIC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEV4Y2VwdGlvbiwgVFRyYW5zcG9ydEJhc2UsIFRNZW1vcnlCdWZmZXIKKworZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKK2Zyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKK2Zyb20gdG9ybmFkbyBpbXBvcnQgZ2VuLCBpb3N0cmVhbSwgaW9sb29wLCB0Y3BzZXJ2ZXIsIGNvbmN1cnJlbnQKKworX19hbGxfXyA9IFsnVFRvcm5hZG9TZXJ2ZXInLCAnVFRvcm5hZG9TdHJlYW1UcmFuc3BvcnQnXQorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKKworCitjbGFzcyBfTG9jayhvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fd2FpdGVycyA9IGRlcXVlKCkKKworICAgIGRlZiBhY3F1aXJlZChzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLl93YWl0ZXJzKSA+IDAKKworICAgIEBnZW4uY29yb3V0aW5lCisgICAgZGVmIGFjcXVpcmUoc2VsZik6CisgICAgICAgIGJsb2NrZXIgPSBzZWxmLl93YWl0ZXJzWy0xXSBpZiBzZWxmLmFjcXVpcmVkKCkgZWxzZSBOb25lCisgICAgICAgIGZ1dHVyZSA9IGNvbmN1cnJlbnQuRnV0dXJlKCkKKyAgICAgICAgc2VsZi5fd2FpdGVycy5hcHBlbmQoZnV0dXJlKQorICAgICAgICBpZiBibG9ja2VyOgorICAgICAgICAgICAgeWllbGQgYmxvY2tlcgorCisgICAgICAgIHJhaXNlIGdlbi5SZXR1cm4oc2VsZi5fbG9ja19jb250ZXh0KCkpCisKKyAgICBkZWYgcmVsZWFzZShzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuYWNxdWlyZWQoKSwgJ0xvY2sgbm90IGFxdWlyZWQnCisgICAgICAgIGZ1dHVyZSA9IHNlbGYuX3dhaXRlcnMucG9wbGVmdCgpCisgICAgICAgIGZ1dHVyZS5zZXRfcmVzdWx0KE5vbmUpCisKKyAgICBAY29udGV4dG1hbmFnZXIKKyAgICBkZWYgX2xvY2tfY29udGV4dChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeWllbGQKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYucmVsZWFzZSgpCisKKworY2xhc3MgVFRvcm5hZG9TdHJlYW1UcmFuc3BvcnQoVFRyYW5zcG9ydEJhc2UpOgorICAgICIiImEgZnJhbWVkLCBidWZmZXJlZCB0cmFuc3BvcnQgb3ZlciBhIFRvcm5hZG8gc3RyZWFtIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQsIHN0cmVhbT1Ob25lLCBpb19sb29wPU5vbmUpOgorICAgICAgICBzZWxmLmhvc3QgPSBob3N0CisgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi5pb19sb29wID0gaW9fbG9vcCBvciBpb2xvb3AuSU9Mb29wLmN1cnJlbnQoKQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ5dGVzSU8oKQorICAgICAgICBzZWxmLl9yZWFkX2xvY2sgPSBfTG9jaygpCisKKyAgICAgICAgIyBzZXJ2ZXJzIHByb3ZpZGUgYSByZWFkeS10by1nbyBzdHJlYW0KKyAgICAgICAgc2VsZi5zdHJlYW0gPSBzdHJlYW0KKworICAgIGRlZiB3aXRoX3RpbWVvdXQoc2VsZiwgdGltZW91dCwgZnV0dXJlKToKKyAgICAgICAgcmV0dXJuIGdlbi53aXRoX3RpbWVvdXQodGltZW91dCwgZnV0dXJlLCBzZWxmLmlvX2xvb3ApCisKKyAgICBAZ2VuLmNvcm91dGluZQorICAgIGRlZiBvcGVuKHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgIGxvZ2dlci5kZWJ1Zygnc29ja2V0IGNvbm5lY3RpbmcnKQorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNLCAwKQorICAgICAgICBzZWxmLnN0cmVhbSA9IGlvc3RyZWFtLklPU3RyZWFtKHNvY2spCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29ubmVjdCA9IHNlbGYuc3RyZWFtLmNvbm5lY3QoKHNlbGYuaG9zdCwgc2VsZi5wb3J0KSkKKyAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgeWllbGQgc2VsZi53aXRoX3RpbWVvdXQodGltZW91dCwgY29ubmVjdCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgeWllbGQgY29ubmVjdAorICAgICAgICBleGNlcHQgKHNvY2tldC5lcnJvciwgSU9FcnJvciwgaW9sb29wLlRpbWVvdXRFcnJvcikgYXMgZToKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAnY291bGQgbm90IGNvbm5lY3QgdG8ge306e30gKHt9KScuZm9ybWF0KHNlbGYuaG9zdCwgc2VsZi5wb3J0LCBlKQorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICB0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sCisgICAgICAgICAgICAgICAgbWVzc2FnZT1tZXNzYWdlKQorCisgICAgICAgIHJhaXNlIGdlbi5SZXR1cm4oc2VsZikKKworICAgIGRlZiBzZXRfY2xvc2VfY2FsbGJhY2soc2VsZiwgY2FsbGJhY2spOgorICAgICAgICAiIiIKKyAgICAgICAgU2hvdWxkIGJlIGNhbGxlZCBvbmx5IGFmdGVyIG9wZW4oKSByZXR1cm5zCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnN0cmVhbS5zZXRfY2xvc2VfY2FsbGJhY2soY2FsbGJhY2spCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICMgZG9uJ3QgcmFpc2UgaWYgd2UgaW50ZW5kIHRvIGNsb3NlCisgICAgICAgIHNlbGYuc3RyZWFtLnNldF9jbG9zZV9jYWxsYmFjayhOb25lKQorICAgICAgICBzZWxmLnN0cmVhbS5jbG9zZSgpCisKKyAgICBkZWYgcmVhZChzZWxmLCBfKToKKyAgICAgICAgIyBUaGUgZ2VuZXJhdGVkIGNvZGUgZm9yIFRvcm5hZG8gc2hvdWxkbid0IGRvIGluZGl2aWR1YWwgcmVhZHMgLS0gb25seQorICAgICAgICAjIGZyYW1lcyBhdCBhIHRpbWUKKyAgICAgICAgYXNzZXJ0IEZhbHNlLCAieW91J3JlIGRvaW5nIGl0IHdyb25nIgorCisgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgZGVmIGlvX2V4Y2VwdGlvbl9jb250ZXh0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB5aWVsZAorICAgICAgICBleGNlcHQgKHNvY2tldC5lcnJvciwgSU9FcnJvcikgYXMgZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgdHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U9c3RyKGUpKQorICAgICAgICBleGNlcHQgaW9zdHJlYW0uU3RyZWFtQnVmZmVyRnVsbEVycm9yIGFzIGU6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U9c3RyKGUpKQorCisgICAgQGdlbi5jb3JvdXRpbmUKKyAgICBkZWYgcmVhZEZyYW1lKHNlbGYpOgorICAgICAgICAjIElPU3RyZWFtIHByb2Nlc3NlcyByZWFkcyBvbmUgYXQgYSB0aW1lCisgICAgICAgIHdpdGggKHlpZWxkIHNlbGYuX3JlYWRfbG9jay5hY3F1aXJlKCkpOgorICAgICAgICAgICAgd2l0aCBzZWxmLmlvX2V4Y2VwdGlvbl9jb250ZXh0KCk6CisgICAgICAgICAgICAgICAgZnJhbWVfaGVhZGVyID0geWllbGQgc2VsZi5zdHJlYW0ucmVhZF9ieXRlcyg0KQorICAgICAgICAgICAgICAgIGlmIGxlbihmcmFtZV9oZWFkZXIpID09IDA6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIGlvc3RyZWFtLlN0cmVhbUNsb3NlZEVycm9yKCdSZWFkIHplcm8gYnl0ZXMgZnJvbSBzdHJlYW0nKQorICAgICAgICAgICAgICAgIGZyYW1lX2xlbmd0aCwgPSBzdHJ1Y3QudW5wYWNrKCchaScsIGZyYW1lX2hlYWRlcikKKyAgICAgICAgICAgICAgICBmcmFtZSA9IHlpZWxkIHNlbGYuc3RyZWFtLnJlYWRfYnl0ZXMoZnJhbWVfbGVuZ3RoKQorICAgICAgICAgICAgICAgIHJhaXNlIGdlbi5SZXR1cm4oZnJhbWUpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5fX3didWYud3JpdGUoYnVmKQorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBmcmFtZSA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKKyAgICAgICAgIyByZXNldCB3YnVmIGJlZm9yZSB3cml0ZS9mbHVzaCB0byBwcmVzZXJ2ZSBzdGF0ZSBvbiB1bmRlcmx5aW5nIGZhaWx1cmUKKyAgICAgICAgZnJhbWVfbGVuZ3RoID0gc3RydWN0LnBhY2soJyFpJywgbGVuKGZyYW1lKSkKKyAgICAgICAgc2VsZi5fX3didWYgPSBCeXRlc0lPKCkKKyAgICAgICAgd2l0aCBzZWxmLmlvX2V4Y2VwdGlvbl9jb250ZXh0KCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5zdHJlYW0ud3JpdGUoZnJhbWVfbGVuZ3RoICsgZnJhbWUpCisKKworY2xhc3MgVFRvcm5hZG9TZXJ2ZXIodGNwc2VydmVyLlRDUFNlcnZlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgaXByb3RfZmFjdG9yeSwgb3Byb3RfZmFjdG9yeT1Ob25lLAorICAgICAgICAgICAgICAgICAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBzdXBlcihUVG9ybmFkb1NlcnZlciwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQorCisgICAgICAgIHNlbGYuX3Byb2Nlc3NvciA9IHByb2Nlc3NvcgorICAgICAgICBzZWxmLl9pcHJvdF9mYWN0b3J5ID0gaXByb3RfZmFjdG9yeQorICAgICAgICBzZWxmLl9vcHJvdF9mYWN0b3J5ID0gKG9wcm90X2ZhY3RvcnkgaWYgb3Byb3RfZmFjdG9yeSBpcyBub3QgTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaXByb3RfZmFjdG9yeSkKKworICAgIEBnZW4uY29yb3V0aW5lCisgICAgZGVmIGhhbmRsZV9zdHJlYW0oc2VsZiwgc3RyZWFtLCBhZGRyZXNzKToKKyAgICAgICAgaG9zdCwgcG9ydCA9IGFkZHJlc3NbOjJdCisgICAgICAgIHRyYW5zID0gVFRvcm5hZG9TdHJlYW1UcmFuc3BvcnQoaG9zdD1ob3N0LCBwb3J0PXBvcnQsIHN0cmVhbT1zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9fbG9vcD1zZWxmLmlvX2xvb3ApCisgICAgICAgIG9wcm90ID0gc2VsZi5fb3Byb3RfZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBub3QgdHJhbnMuc3RyZWFtLmNsb3NlZCgpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSB5aWVsZCB0cmFucy5yZWFkRnJhbWUoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0RXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIGlmIGUudHlwZSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgdHIgPSBUTWVtb3J5QnVmZmVyKGZyYW1lKQorICAgICAgICAgICAgICAgIGlwcm90ID0gc2VsZi5faXByb3RfZmFjdG9yeS5nZXRQcm90b2NvbCh0cikKKyAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLl9wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCd0aHJpZnQgZXhjZXB0aW9uIGluIGhhbmRsZV9zdHJlYW0nKQorICAgICAgICAgICAgdHJhbnMuY2xvc2UoKQorCisgICAgICAgIGxvZ2dlci5pbmZvKCdjbGllbnQgZGlzY29ubmVjdGVkICVzOiVkJywgaG9zdCwgcG9ydCkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvVGhyaWZ0LnB5IGIvbGliL3B5L3NyYy9UaHJpZnQucHkKaW5kZXggYWY2ZjU4ZC4uMDA5NDFkOCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9UaHJpZnQucHkKKysrIGIvbGliL3B5L3NyYy9UaHJpZnQucHkKQEAgLTE5LDExNyArMTksMTc0IEBACiAKIGltcG9ydCBzeXMKIAotY2xhc3MgVFR5cGU6Ci0gIFNUT1AgICA9IDAKLSAgVk9JRCAgID0gMQotICBCT09MICAgPSAyCi0gIEJZVEUgICA9IDMKLSAgSTA4ICAgID0gMwotICBET1VCTEUgPSA0Ci0gIEkxNiAgICA9IDYKLSAgSTMyICAgID0gOAotICBJNjQgICAgPSAxMAotICBTVFJJTkcgPSAxMQotICBVVEY3ICAgPSAxMQotICBTVFJVQ1QgPSAxMgotICBNQVAgICAgPSAxMwotICBTRVQgICAgPSAxNAotICBMSVNUICAgPSAxNQotICBVVEY4ICAgPSAxNgotICBVVEYxNiAgPSAxNwogCi1jbGFzcyBUTWVzc2FnZVR5cGU6Ci0gIENBTEwgID0gMQotICBSRVBMWSA9IDIKLSAgRVhDRVBUSU9OID0gMwotICBPTkVXQVkgPSA0CitjbGFzcyBUVHlwZShvYmplY3QpOgorICAgIFNUT1AgPSAwCisgICAgVk9JRCA9IDEKKyAgICBCT09MID0gMgorICAgIEJZVEUgPSAzCisgICAgSTA4ID0gMworICAgIERPVUJMRSA9IDQKKyAgICBJMTYgPSA2CisgICAgSTMyID0gOAorICAgIEk2NCA9IDEwCisgICAgU1RSSU5HID0gMTEKKyAgICBVVEY3ID0gMTEKKyAgICBTVFJVQ1QgPSAxMgorICAgIE1BUCA9IDEzCisgICAgU0VUID0gMTQKKyAgICBMSVNUID0gMTUKKyAgICBVVEY4ID0gMTYKKyAgICBVVEYxNiA9IDE3CiAKLWNsYXNzIFRQcm9jZXNzb3I6CisgICAgX1ZBTFVFU19UT19OQU1FUyA9ICgKKyAgICAgICAgJ1NUT1AnLAorICAgICAgICAnVk9JRCcsCisgICAgICAgICdCT09MJywKKyAgICAgICAgJ0JZVEUnLAorICAgICAgICAnRE9VQkxFJywKKyAgICAgICAgTm9uZSwKKyAgICAgICAgJ0kxNicsCisgICAgICAgIE5vbmUsCisgICAgICAgICdJMzInLAorICAgICAgICBOb25lLAorICAgICAgICAnSTY0JywKKyAgICAgICAgJ1NUUklORycsCisgICAgICAgICdTVFJVQ1QnLAorICAgICAgICAnTUFQJywKKyAgICAgICAgJ1NFVCcsCisgICAgICAgICdMSVNUJywKKyAgICAgICAgJ1VURjgnLAorICAgICAgICAnVVRGMTYnLAorICAgICkKIAotICAiIiJCYXNlIGNsYXNzIGZvciBwcm9jc2Vzc29yLCB3aGljaCB3b3JrcyBvbiB0d28gc3RyZWFtcy4iIiIKIAotICBkZWYgcHJvY2VzcyhpcHJvdCwgb3Byb3QpOgotICAgIHBhc3MKK2NsYXNzIFRNZXNzYWdlVHlwZShvYmplY3QpOgorICAgIENBTEwgPSAxCisgICAgUkVQTFkgPSAyCisgICAgRVhDRVBUSU9OID0gMworICAgIE9ORVdBWSA9IDQKKworCitjbGFzcyBUUHJvY2Vzc29yKG9iamVjdCk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgcHJvY2Vzc29yLCB3aGljaCB3b3JrcyBvbiB0d28gc3RyZWFtcy4iIiIKKworICAgIGRlZiBwcm9jZXNzKHNlbGYsIGlwcm90LCBvcHJvdCk6CisgICAgICAgIHBhc3MKKwogCiBjbGFzcyBURXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgYWxsIHRocmlmdCBleGNlcHRpb25zLiIiIgogCi0gICIiIkJhc2UgY2xhc3MgZm9yIGFsbCB0aHJpZnQgZXhjZXB0aW9ucy4iIiIKKyAgICAjIEJhc2VFeGNlcHRpb24ubWVzc2FnZSBpcyBkZXByZWNhdGVkIGluIFB5dGhvbiB2WzIuNiwzLjApCisgICAgaWYgKDIsIDYsIDApIDw9IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMCk6CisgICAgICAgIGRlZiBfZ2V0X21lc3NhZ2Uoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fbWVzc2FnZQogCi0gICMgQmFzZUV4Y2VwdGlvbi5tZXNzYWdlIGlzIGRlcHJlY2F0ZWQgaW4gUHl0aG9uIHZbMi42LDMuMCkKLSAgaWYgKDIsNiwwKSA8PSBzeXMudmVyc2lvbl9pbmZvIDwgKDMsMCk6Ci0gICAgZGVmIF9nZXRfbWVzc2FnZShzZWxmKToKLQkgICAgcmV0dXJuIHNlbGYuX21lc3NhZ2UKLSAgICBkZWYgX3NldF9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgotCSAgICBzZWxmLl9tZXNzYWdlID0gbWVzc2FnZQotICAgIG1lc3NhZ2UgPSBwcm9wZXJ0eShfZ2V0X21lc3NhZ2UsIF9zZXRfbWVzc2FnZSkKKyAgICAgICAgZGVmIF9zZXRfbWVzc2FnZShzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuX21lc3NhZ2UgPSBtZXNzYWdlCisgICAgICAgIG1lc3NhZ2UgPSBwcm9wZXJ0eShfZ2V0X21lc3NhZ2UsIF9zZXRfbWVzc2FnZSkKIAotICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZT1Ob25lKToKLSAgICBFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbWVzc2FnZSkKLSAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2U9Tm9uZSk6CisgICAgICAgIEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQorICAgICAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisKIAogY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRFeGNlcHRpb24pOgorICAgICIiIkFwcGxpY2F0aW9uIGxldmVsIHRocmlmdCBleGNlcHRpb25zLiIiIgogCi0gICIiIkFwcGxpY2F0aW9uIGxldmVsIHRocmlmdCBleGNlcHRpb25zLiIiIgorICAgIFVOS05PV04gPSAwCisgICAgVU5LTk9XTl9NRVRIT0QgPSAxCisgICAgSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyCisgICAgV1JPTkdfTUVUSE9EX05BTUUgPSAzCisgICAgQkFEX1NFUVVFTkNFX0lEID0gNAorICAgIE1JU1NJTkdfUkVTVUxUID0gNQorICAgIElOVEVSTkFMX0VSUk9SID0gNgorICAgIFBST1RPQ09MX0VSUk9SID0gNworICAgIElOVkFMSURfVFJBTlNGT1JNID0gOAorICAgIElOVkFMSURfUFJPVE9DT0wgPSA5CisgICAgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMAogCi0gIFVOS05PV04gPSAwCi0gIFVOS05PV05fTUVUSE9EID0gMQotICBJTlZBTElEX01FU1NBR0VfVFlQRSA9IDIKLSAgV1JPTkdfTUVUSE9EX05BTUUgPSAzCi0gIEJBRF9TRVFVRU5DRV9JRCA9IDQKLSAgTUlTU0lOR19SRVNVTFQgPSA1Ci0gIElOVEVSTkFMX0VSUk9SID0gNgotICBQUk9UT0NPTF9FUlJPUiA9IDcKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZT1VTktOT1dOLCBtZXNzYWdlPU5vbmUpOgorICAgICAgICBURXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCisgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKIAotICBkZWYgX19pbml0X18oc2VsZiwgdHlwZT1VTktOT1dOLCBtZXNzYWdlPU5vbmUpOgotICAgIFRFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbWVzc2FnZSkKLSAgICBzZWxmLnR5cGUgPSB0eXBlCi0KLSAgZGVmIF9fc3RyX18oc2VsZik6Ci0gICAgaWYgc2VsZi5tZXNzYWdlOgotICAgICAgcmV0dXJuIHNlbGYubWVzc2FnZQotICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuVU5LTk9XTl9NRVRIT0Q6Ci0gICAgICByZXR1cm4gJ1Vua25vd24gbWV0aG9kJwotICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuSU5WQUxJRF9NRVNTQUdFX1RZUEU6Ci0gICAgICByZXR1cm4gJ0ludmFsaWQgbWVzc2FnZSB0eXBlJwotICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuV1JPTkdfTUVUSE9EX05BTUU6Ci0gICAgICByZXR1cm4gJ1dyb25nIG1ldGhvZCBuYW1lJwotICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuQkFEX1NFUVVFTkNFX0lEOgotICAgICAgcmV0dXJuICdCYWQgc2VxdWVuY2UgSUQnCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5NSVNTSU5HX1JFU1VMVDoKLSAgICAgIHJldHVybiAnTWlzc2luZyByZXN1bHQnCi0gICAgZWxzZToKLSAgICAgIHJldHVybiAnRGVmYXVsdCAodW5rbm93bikgVEFwcGxpY2F0aW9uRXhjZXB0aW9uJwotCi0gIGRlZiByZWFkKHNlbGYsIGlwcm90KToKLSAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKQotICAgIHdoaWxlIFRydWU6Ci0gICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKQotICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKLSAgICAgICAgYnJlYWsKLSAgICAgIGlmIGZpZCA9PSAxOgotICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkc6Ci0gICAgICAgICAgc2VsZi5tZXNzYWdlID0gaXByb3QucmVhZFN0cmluZygpOworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm1lc3NhZ2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5tZXNzYWdlCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuVU5LTk9XTl9NRVRIT0Q6CisgICAgICAgICAgICByZXR1cm4gJ1Vua25vd24gbWV0aG9kJworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLklOVkFMSURfTUVTU0FHRV9UWVBFOgorICAgICAgICAgICAgcmV0dXJuICdJbnZhbGlkIG1lc3NhZ2UgdHlwZScKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5XUk9OR19NRVRIT0RfTkFNRToKKyAgICAgICAgICAgIHJldHVybiAnV3JvbmcgbWV0aG9kIG5hbWUnCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuQkFEX1NFUVVFTkNFX0lEOgorICAgICAgICAgICAgcmV0dXJuICdCYWQgc2VxdWVuY2UgSUQnCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuTUlTU0lOR19SRVNVTFQ6CisgICAgICAgICAgICByZXR1cm4gJ01pc3NpbmcgcmVzdWx0JworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLklOVEVSTkFMX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuICdJbnRlcm5hbCBlcnJvcicKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5QUk9UT0NPTF9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiAnUHJvdG9jb2wgZXJyb3InCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuSU5WQUxJRF9UUkFOU0ZPUk06CisgICAgICAgICAgICByZXR1cm4gJ0ludmFsaWQgdHJhbnNmb3JtJworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLklOVkFMSURfUFJPVE9DT0w6CisgICAgICAgICAgICByZXR1cm4gJ0ludmFsaWQgcHJvdG9jb2wnCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuVU5TVVBQT1JURURfQ0xJRU5UX1RZUEU6CisgICAgICAgICAgICByZXR1cm4gJ1Vuc3VwcG9ydGVkIGNsaWVudCB0eXBlJwogICAgICAgICBlbHNlOgotICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCi0gICAgICBlbGlmIGZpZCA9PSAyOgotICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzI6Ci0gICAgICAgICAgc2VsZi50eXBlID0gaXByb3QucmVhZEkzMigpOwotICAgICAgICBlbHNlOgotICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCi0gICAgICBlbHNlOgotICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQotICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCkKLSAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCkKKyAgICAgICAgICAgIHJldHVybiAnRGVmYXVsdCAodW5rbm93bikgVEFwcGxpY2F0aW9uRXhjZXB0aW9uJwogCi0gIGRlZiB3cml0ZShzZWxmLCBvcHJvdCk6Ci0gICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignVEFwcGxpY2F0aW9uRXhjZXB0aW9uJykKLSAgICBpZiBzZWxmLm1lc3NhZ2UgIT0gTm9uZToKLSAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignbWVzc2FnZScsIFRUeXBlLlNUUklORywgMSkKLSAgICAgIG9wcm90LndyaXRlU3RyaW5nKHNlbGYubWVzc2FnZSkKLSAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQotICAgIGlmIHNlbGYudHlwZSAhPSBOb25lOgotICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCd0eXBlJywgVFR5cGUuSTMyLCAyKQotICAgICAgb3Byb3Qud3JpdGVJMzIoc2VsZi50eXBlKQotICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCi0gICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQotICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCkKKyAgICBkZWYgcmVhZChzZWxmLCBpcHJvdCk6CisgICAgICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKQorICAgICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgZmlkID09IDE6CisgICAgICAgICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSSU5HOgorICAgICAgICAgICAgICAgICAgICBzZWxmLm1lc3NhZ2UgPSBpcHJvdC5yZWFkU3RyaW5nKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgICAgICAgZWxpZiBmaWQgPT0gMjoKKyAgICAgICAgICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudHlwZSA9IGlwcm90LnJlYWRJMzIoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKQorICAgICAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCkKKworICAgIGRlZiB3cml0ZShzZWxmLCBvcHJvdCk6CisgICAgICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpCisgICAgICAgIGlmIHNlbGYubWVzc2FnZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignbWVzc2FnZScsIFRUeXBlLlNUUklORywgMSkKKyAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHNlbGYubWVzc2FnZSkKKyAgICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgICAgICBpZiBzZWxmLnR5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUVHlwZS5JMzIsIDIpCisgICAgICAgICAgICBvcHJvdC53cml0ZUkzMihzZWxmLnR5cGUpCisgICAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQorICAgICAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpCisKKworY2xhc3MgVEZyb3plbkRpY3QoZGljdCk6CisgICAgIiIiQSBkaWN0aW9uYXJ5IHRoYXQgaXMgImZyb3plbiIgbGlrZSBhIGZyb3plbnNldCIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHN1cGVyKFRGcm96ZW5EaWN0LCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCisgICAgICAgICMgU29ydCB0aGUgaXRlbXMgc28gdGhleSB3aWxsIGJlIGluIGEgY29uc2lzdGVudCBvcmRlci4KKyAgICAgICAgIyBYT1IgaW4gdGhlIGhhc2ggb2YgdGhlIGNsYXNzIHNvIHdlIGRvbid0IGNvbGxpZGUgd2l0aAorICAgICAgICAjIHRoZSBoYXNoIG9mIGEgbGlzdCBvZiB0dXBsZXMuCisgICAgICAgIHNlbGYuX19oYXNodmFsID0gaGFzaChURnJvemVuRGljdCkgXiBoYXNoKHR1cGxlKHNvcnRlZChzZWxmLml0ZW1zKCkpKSkKKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiQ2FuJ3QgbW9kaWZ5IGZyb3plbiBURnJlZXphYmxlRGljdCIpCisKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbid0IG1vZGlmeSBmcm96ZW4gVEZyZWV6YWJsZURpY3QiKQorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2hhc2h2YWwKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvY29tcGF0LnB5IGIvbGliL3B5L3NyYy9jb21wYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4MjcxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvY29tcGF0LnB5CkBAIC0wLDAgKzEsNDYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgc3lzCisKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMjoKKworICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTyBhcyBCdWZmZXJJTworCisgICAgZGVmIGJpbmFyeV90b19zdHIoYmluX3ZhbCk6CisgICAgICAgIHJldHVybiBiaW5fdmFsCisKKyAgICBkZWYgc3RyX3RvX2JpbmFyeShzdHJfdmFsKToKKyAgICAgICAgcmV0dXJuIHN0cl92YWwKKworICAgIGRlZiBieXRlX2luZGV4KGJ5dGVzX3ZhbCwgaSk6CisgICAgICAgIHJldHVybiBvcmQoYnl0ZXNfdmFsW2ldKQorCitlbHNlOgorCisgICAgZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTyBhcyBCdWZmZXJJTyAgIyBub3FhCisKKyAgICBkZWYgYmluYXJ5X3RvX3N0cihiaW5fdmFsKToKKyAgICAgICAgcmV0dXJuIGJpbl92YWwuZGVjb2RlKCd1dGY4JykKKworICAgIGRlZiBzdHJfdG9fYmluYXJ5KHN0cl92YWwpOgorICAgICAgICByZXR1cm4gYnl0ZXMoc3RyX3ZhbCwgJ3V0ZjgnKQorCisgICAgZGVmIGJ5dGVfaW5kZXgoYnl0ZXNfdmFsLCBpKToKKyAgICAgICAgcmV0dXJuIGJ5dGVzX3ZhbFtpXQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvYmluYXJ5LmNwcCBiL2xpYi9weS9zcmMvZXh0L2JpbmFyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVkOGQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L2JpbmFyeS5jcHAKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZXh0L2JpbmFyeS5oIgorbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKK2Jvb2wgQmluYXJ5UHJvdG9jb2w6OnJlYWRGaWVsZEJlZ2luKFRUeXBlJiB0eXBlLCBpbnQxNl90JiB0YWcpIHsKKyAgdWludDhfdCBiID0gMDsKKyAgaWYgKCFyZWFkQnl0ZShiKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICB0eXBlID0gc3RhdGljX2Nhc3Q8VFR5cGU+KGIpOworICBpZiAodHlwZSA9PSBUX1NUT1ApIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gcmVhZEkxNih0YWcpOworfQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvYmluYXJ5LmggYi9saWIvcHkvc3JjL2V4dC9iaW5hcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjBiMGQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvYmluYXJ5LmgKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfUFlfQklOQVJZX0gKKyNkZWZpbmUgVEhSSUZUX1BZX0JJTkFSWV9ICisKKyNpbmNsdWRlIDxQeXRob24uaD4KKyNpbmNsdWRlICJleHQvcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJleHQvZW5kaWFuLmgiCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHkgeworCitjbGFzcyBCaW5hcnlQcm90b2NvbCA6IHB1YmxpYyBQcm90b2NvbEJhc2U8QmluYXJ5UHJvdG9jb2w+IHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+QmluYXJ5UHJvdG9jb2woKSB7fQorCisgIHZvaWQgd3JpdGVJOChpbnQ4X3QgdmFsKSB7IHdyaXRlQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZ2YWwpLCBzaXplb2YoaW50OF90KSk7IH0KKworICB2b2lkIHdyaXRlSTE2KGludDE2X3QgdmFsKSB7CisgICAgaW50MTZfdCBuZXQgPSBzdGF0aWNfY2FzdDxpbnQxNl90PihodG9ucyh2YWwpKTsKKyAgICB3cml0ZUJ1ZmZlcihyZWludGVycHJldF9jYXN0PGNoYXIqPigmbmV0KSwgc2l6ZW9mKGludDE2X3QpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJMzIoaW50MzJfdCB2YWwpIHsKKyAgICBpbnQzMl90IG5ldCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGh0b25sKHZhbCkpOworICAgIHdyaXRlQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZuZXQpLCBzaXplb2YoaW50MzJfdCkpOworICB9CisKKyAgdm9pZCB3cml0ZUk2NChpbnQ2NF90IHZhbCkgeworICAgIGludDY0X3QgbmV0ID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oaHRvbmxsKHZhbCkpOworICAgIHdyaXRlQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZuZXQpLCBzaXplb2YoaW50NjRfdCkpOworICB9CisKKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB7CisgICAgLy8gVW5mb3J0dW5hdGVseSwgYml0d2lzZV9jYXN0IGRvZXNuJ3Qgd29yayBpbiBDLiAgQmFkIEMhCisgICAgdW5pb24geworICAgICAgZG91YmxlIGY7CisgICAgICBpbnQ2NF90IHQ7CisgICAgfSB0cmFuc2ZlcjsKKyAgICB0cmFuc2Zlci5mID0gZHViOworICAgIHdyaXRlSTY0KHRyYW5zZmVyLnQpOworICB9CisKKyAgdm9pZCB3cml0ZUJvb2woaW50IHYpIHsgd3JpdGVCeXRlKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHYpKTsgfQorCisgIHZvaWQgd3JpdGVTdHJpbmcoUHlPYmplY3QqIHZhbHVlLCBpbnQzMl90IGxlbikgeworICAgIHdyaXRlSTMyKGxlbik7CisgICAgd3JpdGVCdWZmZXIoUHlCeXRlc19BU19TVFJJTkcodmFsdWUpLCBsZW4pOworICB9CisKKyAgYm9vbCB3cml0ZUxpc3RCZWdpbihQeU9iamVjdCogdmFsdWUsIGNvbnN0IFNldExpc3RUeXBlQXJncyYgcGFyc2VkYXJncywgaW50MzJfdCBsZW4pIHsKKyAgICB3cml0ZUJ5dGUocGFyc2VkYXJncy5lbGVtZW50X3R5cGUpOworICAgIHdyaXRlSTMyKGxlbik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHdyaXRlTWFwQmVnaW4oUHlPYmplY3QqIHZhbHVlLCBjb25zdCBNYXBUeXBlQXJncyYgcGFyc2VkYXJncywgaW50MzJfdCBsZW4pIHsKKyAgICB3cml0ZUJ5dGUocGFyc2VkYXJncy5rdGFnKTsKKyAgICB3cml0ZUJ5dGUocGFyc2VkYXJncy52dGFnKTsKKyAgICB3cml0ZUkzMihsZW4pOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCB3cml0ZVN0cnVjdEJlZ2luKCkgeyByZXR1cm4gdHJ1ZTsgfQorICBib29sIHdyaXRlU3RydWN0RW5kKCkgeyByZXR1cm4gdHJ1ZTsgfQorICBib29sIHdyaXRlRmllbGQoUHlPYmplY3QqIHZhbHVlLCBjb25zdCBTdHJ1Y3RJdGVtU3BlYyYgcGFyc2Vkc3BlYykgeworICAgIHdyaXRlQnl0ZShzdGF0aWNfY2FzdDx1aW50OF90PihwYXJzZWRzcGVjLnR5cGUpKTsKKyAgICB3cml0ZUkxNihwYXJzZWRzcGVjLnRhZyk7CisgICAgcmV0dXJuIGVuY29kZVZhbHVlKHZhbHVlLCBwYXJzZWRzcGVjLnR5cGUsIHBhcnNlZHNwZWMudHlwZWFyZ3MpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHsgd3JpdGVCeXRlKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KFRfU1RPUCkpOyB9CisKKyAgYm9vbCByZWFkQm9vbChib29sJiB2YWwpIHsKKyAgICBjaGFyKiBidWY7CisgICAgaWYgKCFyZWFkQnl0ZXMoJmJ1ZiwgMSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFsID0gYnVmWzBdID09IDE7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHJlYWRJOChpbnQ4X3QmIHZhbCkgeworICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCAxKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWwgPSBidWZbMF07CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHJlYWRJMTYoaW50MTZfdCYgdmFsKSB7CisgICAgY2hhciogYnVmOworICAgIGlmICghcmVhZEJ5dGVzKCZidWYsIHNpemVvZihpbnQxNl90KSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtY3B5KCZ2YWwsIGJ1Ziwgc2l6ZW9mKGludDE2X3QpKTsKKyAgICB2YWwgPSBudG9ocyh2YWwpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCByZWFkSTMyKGludDMyX3QmIHZhbCkgeworICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCBzaXplb2YoaW50MzJfdCkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1lbWNweSgmdmFsLCBidWYsIHNpemVvZihpbnQzMl90KSk7CisgICAgdmFsID0gbnRvaGwodmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgcmVhZEk2NChpbnQ2NF90JiB2YWwpIHsKKyAgICBjaGFyKiBidWY7CisgICAgaWYgKCFyZWFkQnl0ZXMoJmJ1Ziwgc2l6ZW9mKGludDY0X3QpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1jcHkoJnZhbCwgYnVmLCBzaXplb2YoaW50NjRfdCkpOworICAgIHZhbCA9IG50b2hsbCh2YWwpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCByZWFkRG91YmxlKGRvdWJsZSYgdmFsKSB7CisgICAgdW5pb24geworICAgICAgaW50NjRfdCBmOworICAgICAgZG91YmxlIHQ7CisgICAgfSB0cmFuc2ZlcjsKKworICAgIGlmICghcmVhZEk2NCh0cmFuc2Zlci5mKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWwgPSB0cmFuc2Zlci50OworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaW50MzJfdCByZWFkU3RyaW5nKGNoYXIqKiBidWYpIHsKKyAgICBpbnQzMl90IGxlbiA9IDA7CisgICAgaWYgKCFyZWFkSTMyKGxlbikgfHwgIWNoZWNrTGVuZ3RoTGltaXQobGVuLCBzdHJpbmdMaW1pdCgpKSB8fCAhcmVhZEJ5dGVzKGJ1ZiwgbGVuKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gbGVuOworICB9CisKKyAgaW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBldHlwZSkgeworICAgIGludDMyX3QgbGVuOworICAgIHVpbnQ4X3QgYiA9IDA7CisgICAgaWYgKCFyZWFkQnl0ZShiKSB8fCAhcmVhZEkzMihsZW4pIHx8ICFjaGVja0xlbmd0aExpbWl0KGxlbiwgY29udGFpbmVyTGltaXQoKSkpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZXR5cGUgPSBzdGF0aWNfY2FzdDxUVHlwZT4oYik7CisgICAgcmV0dXJuIGxlbjsKKyAgfQorCisgIGludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrdHlwZSwgVFR5cGUmIHZ0eXBlKSB7CisgICAgaW50MzJfdCBsZW47CisgICAgdWludDhfdCBrLCB2OworICAgIGlmICghcmVhZEJ5dGUoaykgfHwgIXJlYWRCeXRlKHYpIHx8ICFyZWFkSTMyKGxlbikgfHwgIWNoZWNrTGVuZ3RoTGltaXQobGVuLCBjb250YWluZXJMaW1pdCgpKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBrdHlwZSA9IHN0YXRpY19jYXN0PFRUeXBlPihrKTsKKyAgICB2dHlwZSA9IHN0YXRpY19jYXN0PFRUeXBlPih2KTsKKyAgICByZXR1cm4gbGVuOworICB9CisKKyAgYm9vbCByZWFkU3RydWN0QmVnaW4oKSB7IHJldHVybiB0cnVlOyB9CisgIGJvb2wgcmVhZFN0cnVjdEVuZCgpIHsgcmV0dXJuIHRydWU7IH0KKworICBib29sIHJlYWRGaWVsZEJlZ2luKFRUeXBlJiB0eXBlLCBpbnQxNl90JiB0YWcpOworCisjZGVmaW5lIFNLSVBCWVRFUyhuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFyZWFkQnl0ZXMoJmR1bW15X2J1Zl8sIChuKSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyAgYm9vbCBza2lwQm9vbCgpIHsgU0tJUEJZVEVTKDEpOyB9CisgIGJvb2wgc2tpcEJ5dGUoKSB7IFNLSVBCWVRFUygxKTsgfQorICBib29sIHNraXBJMTYoKSB7IFNLSVBCWVRFUygyKTsgfQorICBib29sIHNraXBJMzIoKSB7IFNLSVBCWVRFUyg0KTsgfQorICBib29sIHNraXBJNjQoKSB7IFNLSVBCWVRFUyg4KTsgfQorICBib29sIHNraXBEb3VibGUoKSB7IFNLSVBCWVRFUyg4KTsgfQorICBib29sIHNraXBTdHJpbmcoKSB7CisgICAgaW50MzJfdCBsZW47CisgICAgaWYgKCFyZWFkSTMyKGxlbikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgU0tJUEJZVEVTKGxlbik7CisgIH0KKyN1bmRlZiBTS0lQQllURVMKKworcHJpdmF0ZToKKyAgY2hhciogZHVtbXlfYnVmXzsKK307Cit9Cit9Cit9CisjZW5kaWYgLy8gVEhSSUZUX1BZX0JJTkFSWV9ICmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC9jb21wYWN0LmNwcCBiL2xpYi9weS9zcmMvZXh0L2NvbXBhY3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YTk5YTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2V4dC9jb21wYWN0LmNwcApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZXh0L2NvbXBhY3QuaCIKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKK2NvbnN0IHVpbnQ4X3QgQ29tcGFjdFByb3RvY29sOjpUVHlwZVRvQ1R5cGVbXSA9IHsKKyAgICBDVF9TVE9QLCAgICAgICAgIC8vIFRfU1RPUAorICAgIDAsICAgICAgICAgICAgICAgLy8gdW51c2VkCisgICAgQ1RfQk9PTEVBTl9UUlVFLCAvLyBUX0JPT0wKKyAgICBDVF9CWVRFLCAgICAgICAgIC8vIFRfQllURQorICAgIENUX0RPVUJMRSwgICAgICAgLy8gVF9ET1VCTEUKKyAgICAwLCAgICAgICAgICAgICAgIC8vIHVudXNlZAorICAgIENUX0kxNiwgICAgICAgICAgLy8gVF9JMTYKKyAgICAwLCAgICAgICAgICAgICAgIC8vIHVudXNlZAorICAgIENUX0kzMiwgICAgICAgICAgLy8gVF9JMzIKKyAgICAwLCAgICAgICAgICAgICAgIC8vIHVudXNlZAorICAgIENUX0k2NCwgICAgICAgICAgLy8gVF9JNjQKKyAgICBDVF9CSU5BUlksICAgICAgIC8vIFRfU1RSSU5HCisgICAgQ1RfU1RSVUNULCAgICAgICAvLyBUX1NUUlVDVAorICAgIENUX01BUCwgICAgICAgICAgLy8gVF9NQVAKKyAgICBDVF9TRVQsICAgICAgICAgIC8vIFRfU0VUCisgICAgQ1RfTElTVCwgICAgICAgICAvLyBUX0xJU1QKK307CisKK2Jvb2wgQ29tcGFjdFByb3RvY29sOjpyZWFkRmllbGRCZWdpbihUVHlwZSYgdHlwZSwgaW50MTZfdCYgdGFnKSB7CisgIHVpbnQ4X3QgYjsKKyAgaWYgKCFyZWFkQnl0ZShiKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICB1aW50OF90IGN0eXBlID0gYiAmIDB4ZjsKKyAgdHlwZSA9IGdldFRUeXBlKGN0eXBlKTsKKyAgaWYgKHR5cGUgPT0gLTEpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSBpZiAodHlwZSA9PSBUX1NUT1ApIHsKKyAgICB0YWcgPSAwOworICAgIHJldHVybiB0cnVlOworICB9CisgIHVpbnQ4X3QgZGlmZiA9IChiICYgMHhmMCkgPj4gNDsKKyAgaWYgKGRpZmYpIHsKKyAgICB0YWcgPSByZWFkVGFnc18udG9wKCkgKyBkaWZmOworICB9IGVsc2UgaWYgKCFyZWFkSTE2KHRhZykpIHsKKyAgICByZWFkVGFnc18udG9wKCkgPSAtMTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGN0eXBlID09IENUX0JPT0xFQU5fRkFMU0UgfHwgY3R5cGUgPT0gQ1RfQk9PTEVBTl9UUlVFKSB7CisgICAgcmVhZEJvb2xfLmV4aXN0cyA9IHRydWU7CisgICAgcmVhZEJvb2xfLnZhbHVlID0gY3R5cGUgPT0gQ1RfQk9PTEVBTl9UUlVFOworICB9CisgIHJlYWRUYWdzXy50b3AoKSA9IHRhZzsKKyAgcmV0dXJuIHRydWU7Cit9CisKK1RUeXBlIENvbXBhY3RQcm90b2NvbDo6Z2V0VFR5cGUodWludDhfdCB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICBjYXNlIFRfU1RPUDoKKyAgICByZXR1cm4gVF9TVE9QOworICBjYXNlIENUX0JPT0xFQU5fRkFMU0U6CisgIGNhc2UgQ1RfQk9PTEVBTl9UUlVFOgorICAgIHJldHVybiBUX0JPT0w7CisgIGNhc2UgQ1RfQllURToKKyAgICByZXR1cm4gVF9CWVRFOworICBjYXNlIENUX0kxNjoKKyAgICByZXR1cm4gVF9JMTY7CisgIGNhc2UgQ1RfSTMyOgorICAgIHJldHVybiBUX0kzMjsKKyAgY2FzZSBDVF9JNjQ6CisgICAgcmV0dXJuIFRfSTY0OworICBjYXNlIENUX0RPVUJMRToKKyAgICByZXR1cm4gVF9ET1VCTEU7CisgIGNhc2UgQ1RfQklOQVJZOgorICAgIHJldHVybiBUX1NUUklORzsKKyAgY2FzZSBDVF9MSVNUOgorICAgIHJldHVybiBUX0xJU1Q7CisgIGNhc2UgQ1RfU0VUOgorICAgIHJldHVybiBUX1NFVDsKKyAgY2FzZSBDVF9NQVA6CisgICAgcmV0dXJuIFRfTUFQOworICBjYXNlIENUX1NUUlVDVDoKKyAgICByZXR1cm4gVF9TVFJVQ1Q7CisgIGRlZmF1bHQ6CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImRvbid0IGtub3cgd2hhdCB0eXBlOiAlZCIsIHR5cGUpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUVHlwZT4oLTEpOworICB9Cit9Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC9jb21wYWN0LmggYi9saWIvcHkvc3JjL2V4dC9jb21wYWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc4ZDdhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L2NvbXBhY3QuaApAQCAtMCwwICsxLDM2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9QWV9DT01QQUNUX0gKKyNkZWZpbmUgVEhSSUZUX1BZX0NPTVBBQ1RfSAorCisjaW5jbHVkZSA8UHl0aG9uLmg+CisjaW5jbHVkZSAiZXh0L3Byb3RvY29sLmgiCisjaW5jbHVkZSAiZXh0L2VuZGlhbi5oIgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0YWNrPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHB5IHsKKworY2xhc3MgQ29tcGFjdFByb3RvY29sIDogcHVibGljIFByb3RvY29sQmFzZTxDb21wYWN0UHJvdG9jb2w+IHsKK3B1YmxpYzoKKyAgQ29tcGFjdFByb3RvY29sKCkgeyByZWFkQm9vbF8uZXhpc3RzID0gZmFsc2U7IH0KKworICB2aXJ0dWFsIH5Db21wYWN0UHJvdG9jb2woKSB7fQorCisgIHZvaWQgd3JpdGVJOChpbnQ4X3QgdmFsKSB7IHdyaXRlQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZ2YWwpLCAxKTsgfQorCisgIHZvaWQgd3JpdGVJMTYoaW50MTZfdCB2YWwpIHsgd3JpdGVWYXJpbnQodG9aaWdaYWcodmFsKSk7IH0KKworICBpbnQgd3JpdGVJMzIoaW50MzJfdCB2YWwpIHsgcmV0dXJuIHdyaXRlVmFyaW50KHRvWmlnWmFnKHZhbCkpOyB9CisKKyAgdm9pZCB3cml0ZUk2NChpbnQ2NF90IHZhbCkgeyB3cml0ZVZhcmludDY0KHRvWmlnWmFnNjQodmFsKSk7IH0KKworICB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkdWIpIHsKKyAgICB1bmlvbiB7CisgICAgICBkb3VibGUgZjsKKyAgICAgIGludDY0X3QgdDsKKyAgICB9IHRyYW5zZmVyOworICAgIHRyYW5zZmVyLmYgPSBodG9sZWxsKGR1Yik7CisgICAgd3JpdGVCdWZmZXIocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJnRyYW5zZmVyLnQpLCBzaXplb2YoaW50NjRfdCkpOworICB9CisKKyAgdm9pZCB3cml0ZUJvb2woaW50IHYpIHsgd3JpdGVCeXRlKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHYgPyBDVF9CT09MRUFOX1RSVUUgOiBDVF9CT09MRUFOX0ZBTFNFKSk7IH0KKworICB2b2lkIHdyaXRlU3RyaW5nKFB5T2JqZWN0KiB2YWx1ZSwgaW50MzJfdCBsZW4pIHsKKyAgICB3cml0ZVZhcmludChsZW4pOworICAgIHdyaXRlQnVmZmVyKFB5Qnl0ZXNfQVNfU1RSSU5HKHZhbHVlKSwgbGVuKTsKKyAgfQorCisgIGJvb2wgd3JpdGVMaXN0QmVnaW4oUHlPYmplY3QqIHZhbHVlLCBjb25zdCBTZXRMaXN0VHlwZUFyZ3MmIGFyZ3MsIGludDMyX3QgbGVuKSB7CisgICAgaW50IGN0eXBlID0gdG9Db21wYWN0VHlwZShhcmdzLmVsZW1lbnRfdHlwZSk7CisgICAgaWYgKGxlbiA8PSAxNCkgeworICAgICAgd3JpdGVCeXRlKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGxlbiA8PCA0IHwgY3R5cGUpKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVCeXRlKDB4ZjAgfCBjdHlwZSk7CisgICAgICB3cml0ZVZhcmludChsZW4pOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgd3JpdGVNYXBCZWdpbihQeU9iamVjdCogdmFsdWUsIGNvbnN0IE1hcFR5cGVBcmdzJiBhcmdzLCBpbnQzMl90IGxlbikgeworICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgd3JpdGVCeXRlKDApOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGludCBjdHlwZSA9IHRvQ29tcGFjdFR5cGUoYXJncy5rdGFnKSA8PCA0IHwgdG9Db21wYWN0VHlwZShhcmdzLnZ0YWcpOworICAgIHdyaXRlVmFyaW50KGxlbik7CisgICAgd3JpdGVCeXRlKGN0eXBlKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgd3JpdGVTdHJ1Y3RCZWdpbigpIHsKKyAgICB3cml0ZVRhZ3NfLnB1c2goMCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgYm9vbCB3cml0ZVN0cnVjdEVuZCgpIHsKKyAgICB3cml0ZVRhZ3NfLnBvcCgpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCB3cml0ZUZpZWxkKFB5T2JqZWN0KiB2YWx1ZSwgY29uc3QgU3RydWN0SXRlbVNwZWMmIHNwZWMpIHsKKyAgICBpZiAoc3BlYy50eXBlID09IFRfQk9PTCkgeworICAgICAgZG9Xcml0ZUZpZWxkQmVnaW4oc3BlYywgUHlPYmplY3RfSXNUcnVlKHZhbHVlKSA/IENUX0JPT0xFQU5fVFJVRSA6IENUX0JPT0xFQU5fRkFMU0UpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIGRvV3JpdGVGaWVsZEJlZ2luKHNwZWMsIHRvQ29tcGFjdFR5cGUoc3BlYy50eXBlKSk7CisgICAgICByZXR1cm4gZW5jb2RlVmFsdWUodmFsdWUsIHNwZWMudHlwZSwgc3BlYy50eXBlYXJncyk7CisgICAgfQorICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHsgd3JpdGVCeXRlKDApOyB9CisKKyAgYm9vbCByZWFkQm9vbChib29sJiB2YWwpIHsKKyAgICBpZiAocmVhZEJvb2xfLmV4aXN0cykgeworICAgICAgcmVhZEJvb2xfLmV4aXN0cyA9IGZhbHNlOworICAgICAgdmFsID0gcmVhZEJvb2xfLnZhbHVlOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCAxKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWwgPSBidWZbMF0gPT0gQ1RfQk9PTEVBTl9UUlVFOworICAgIHJldHVybiB0cnVlOworICB9CisgIGJvb2wgcmVhZEk4KGludDhfdCYgdmFsKSB7CisgICAgY2hhciogYnVmOworICAgIGlmICghcmVhZEJ5dGVzKCZidWYsIDEpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZhbCA9IGJ1ZlswXTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgcmVhZEkxNihpbnQxNl90JiB2YWwpIHsKKyAgICB1aW50MTZfdCB1dmFsOworICAgIGlmIChyZWFkVmFyaW50PHVpbnQxNl90LCAzPih1dmFsKSkgeworICAgICAgdmFsID0gZnJvbVppZ1phZzxpbnQxNl90LCB1aW50MTZfdD4odXZhbCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCByZWFkSTMyKGludDMyX3QmIHZhbCkgeworICAgIHVpbnQzMl90IHV2YWw7CisgICAgaWYgKHJlYWRWYXJpbnQ8dWludDMyX3QsIDU+KHV2YWwpKSB7CisgICAgICB2YWwgPSBmcm9tWmlnWmFnPGludDMyX3QsIHVpbnQzMl90Pih1dmFsKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIHJlYWRJNjQoaW50NjRfdCYgdmFsKSB7CisgICAgdWludDY0X3QgdXZhbDsKKyAgICBpZiAocmVhZFZhcmludDx1aW50NjRfdCwgMTA+KHV2YWwpKSB7CisgICAgICB2YWwgPSBmcm9tWmlnWmFnPGludDY0X3QsIHVpbnQ2NF90Pih1dmFsKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIHJlYWREb3VibGUoZG91YmxlJiB2YWwpIHsKKyAgICB1bmlvbiB7CisgICAgICBpbnQ2NF90IGY7CisgICAgICBkb3VibGUgdDsKKyAgICB9IHRyYW5zZmVyOworCisgICAgY2hhciogYnVmOworICAgIGlmICghcmVhZEJ5dGVzKCZidWYsIDgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1lbWNweSgmdHJhbnNmZXIuZiwgYnVmLCBzaXplb2YoaW50NjRfdCkpOworICAgIHRyYW5zZmVyLmYgPSBsZXRvaGxsKHRyYW5zZmVyLmYpOworICAgIHZhbCA9IHRyYW5zZmVyLnQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpbnQzMl90IHJlYWRTdHJpbmcoY2hhcioqIGJ1ZikgeworICAgIHVpbnQzMl90IGxlbjsKKyAgICBpZiAoIXJlYWRWYXJpbnQ8dWludDMyX3QsIDU+KGxlbikgfHwgIWNoZWNrTGVuZ3RoTGltaXQobGVuLCBzdHJpbmdMaW1pdCgpKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIXJlYWRCeXRlcyhidWYsIGxlbikpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGxlbjsKKyAgfQorCisgIGludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZXR5cGUpIHsKKyAgICB1aW50OF90IGI7CisgICAgaWYgKCFyZWFkQnl0ZShiKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBldHlwZSA9IGdldFRUeXBlKGIgJiAweGYpOworICAgIGlmIChldHlwZSA9PSAtMSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB1aW50MzJfdCBsZW4gPSAoYiA+PiA0KSAmIDB4ZjsKKyAgICBpZiAobGVuID09IDE1ICYmICFyZWFkVmFyaW50PHVpbnQzMl90LCA1PihsZW4pKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghY2hlY2tMZW5ndGhMaW1pdChsZW4sIGNvbnRhaW5lckxpbWl0KCkpKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBsZW47CisgIH0KKworICBpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga3R5cGUsIFRUeXBlJiB2dHlwZSkgeworICAgIHVpbnQzMl90IGxlbjsKKyAgICBpZiAoIXJlYWRWYXJpbnQ8dWludDMyX3QsIDU+KGxlbikgfHwgIWNoZWNrTGVuZ3RoTGltaXQobGVuLCBjb250YWluZXJMaW1pdCgpKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobGVuICE9IDApIHsKKyAgICAgIHVpbnQ4X3Qga3ZUeXBlOworICAgICAgaWYgKCFyZWFkQnl0ZShrdlR5cGUpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGt0eXBlID0gZ2V0VFR5cGUoa3ZUeXBlID4+IDQpOworICAgICAgdnR5cGUgPSBnZXRUVHlwZShrdlR5cGUgJiAweGYpOworICAgICAgaWYgKGt0eXBlID09IC0xIHx8IHZ0eXBlID09IC0xKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxlbjsKKyAgfQorCisgIGJvb2wgcmVhZFN0cnVjdEJlZ2luKCkgeworICAgIHJlYWRUYWdzXy5wdXNoKDApOworICAgIHJldHVybiB0cnVlOworICB9CisgIGJvb2wgcmVhZFN0cnVjdEVuZCgpIHsKKyAgICByZWFkVGFnc18ucG9wKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgYm9vbCByZWFkRmllbGRCZWdpbihUVHlwZSYgdHlwZSwgaW50MTZfdCYgdGFnKTsKKworICBib29sIHNraXBCb29sKCkgeworICAgIGJvb2wgdmFsOworICAgIHJldHVybiByZWFkQm9vbCh2YWwpOworICB9CisjZGVmaW5lIFNLSVBCWVRFUyhuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFyZWFkQnl0ZXMoJmR1bW15X2J1Zl8sIChuKSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisgIGJvb2wgc2tpcEJ5dGUoKSB7IFNLSVBCWVRFUygxKTsgfQorICBib29sIHNraXBEb3VibGUoKSB7IFNLSVBCWVRFUyg4KTsgfQorICBib29sIHNraXBJMTYoKSB7CisgICAgaW50MTZfdCB2YWw7CisgICAgcmV0dXJuIHJlYWRJMTYodmFsKTsKKyAgfQorICBib29sIHNraXBJMzIoKSB7CisgICAgaW50MzJfdCB2YWw7CisgICAgcmV0dXJuIHJlYWRJMzIodmFsKTsKKyAgfQorICBib29sIHNraXBJNjQoKSB7CisgICAgaW50NjRfdCB2YWw7CisgICAgcmV0dXJuIHJlYWRJNjQodmFsKTsKKyAgfQorICBib29sIHNraXBTdHJpbmcoKSB7CisgICAgdWludDMyX3QgbGVuOworICAgIGlmICghcmVhZFZhcmludDx1aW50MzJfdCwgNT4obGVuKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBTS0lQQllURVMobGVuKTsKKyAgfQorI3VuZGVmIFNLSVBCWVRFUworCitwcml2YXRlOgorICBlbnVtIFR5cGVzIHsKKyAgICBDVF9TVE9QID0gMHgwMCwKKyAgICBDVF9CT09MRUFOX1RSVUUgPSAweDAxLAorICAgIENUX0JPT0xFQU5fRkFMU0UgPSAweDAyLAorICAgIENUX0JZVEUgPSAweDAzLAorICAgIENUX0kxNiA9IDB4MDQsCisgICAgQ1RfSTMyID0gMHgwNSwKKyAgICBDVF9JNjQgPSAweDA2LAorICAgIENUX0RPVUJMRSA9IDB4MDcsCisgICAgQ1RfQklOQVJZID0gMHgwOCwKKyAgICBDVF9MSVNUID0gMHgwOSwKKyAgICBDVF9TRVQgPSAweDBBLAorICAgIENUX01BUCA9IDB4MEIsCisgICAgQ1RfU1RSVUNUID0gMHgwQworICB9OworCisgIHN0YXRpYyBjb25zdCB1aW50OF90IFRUeXBlVG9DVHlwZVtdOworCisgIFRUeXBlIGdldFRUeXBlKHVpbnQ4X3QgdHlwZSk7CisKKyAgaW50IHRvQ29tcGFjdFR5cGUoVFR5cGUgdHlwZSkgeworICAgIGludCBpID0gc3RhdGljX2Nhc3Q8aW50Pih0eXBlKTsKKyAgICByZXR1cm4gaSA8IDE2ID8gVFR5cGVUb0NUeXBlW2ldIDogLTE7CisgIH0KKworICB1aW50MzJfdCB0b1ppZ1phZyhpbnQzMl90IHZhbCkgeyByZXR1cm4gKHZhbCA+PiAzMSkgXiAodmFsIDw8IDEpOyB9CisKKyAgdWludDY0X3QgdG9aaWdaYWc2NChpbnQ2NF90IHZhbCkgeyByZXR1cm4gKHZhbCA+PiA2MykgXiAodmFsIDw8IDEpOyB9CisKKyAgaW50IHdyaXRlVmFyaW50KHVpbnQzMl90IHZhbCkgeworICAgIGludCBjbnQgPSAxOworICAgIHdoaWxlICh2YWwgJiB+MHg3ZlUpIHsKKyAgICAgIHdyaXRlQnl0ZShzdGF0aWNfY2FzdDxjaGFyPigodmFsICYgMHg3ZlUpIHwgMHg4MFUpKTsKKyAgICAgIHZhbCA+Pj0gNzsKKyAgICAgICsrY250OworICAgIH0KKyAgICB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8Y2hhcj4odmFsKSk7CisgICAgcmV0dXJuIGNudDsKKyAgfQorCisgIGludCB3cml0ZVZhcmludDY0KHVpbnQ2NF90IHZhbCkgeworICAgIGludCBjbnQgPSAxOworICAgIHdoaWxlICh2YWwgJiB+MHg3ZlVMTCkgeworICAgICAgd3JpdGVCeXRlKHN0YXRpY19jYXN0PGNoYXI+KCh2YWwgJiAweDdmVUxMKSB8IDB4ODBVTEwpKTsKKyAgICAgIHZhbCA+Pj0gNzsKKyAgICAgICsrY250OworICAgIH0KKyAgICB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8Y2hhcj4odmFsKSk7CisgICAgcmV0dXJuIGNudDsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgTWF4PgorICBib29sIHJlYWRWYXJpbnQoVCYgcmVzdWx0KSB7CisgICAgdWludDhfdCBiOworICAgIFQgdmFsID0gMDsKKyAgICBpbnQgc2hpZnQgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTWF4OyArK2kpIHsKKyAgICAgIGlmICghcmVhZEJ5dGUoYikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgaWYgKGIgJiAweDgwKSB7CisgICAgICAgIHZhbCB8PSBzdGF0aWNfY2FzdDxUPihiICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgICB9IGVsc2UgeworICAgICAgICB2YWwgfD0gc3RhdGljX2Nhc3Q8VD4oYikgPDwgc2hpZnQ7CisgICAgICAgIHJlc3VsdCA9IHZhbDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBzaGlmdCArPSA3OworICAgIH0KKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInZhcmludCBleGNlZWRlZCAlZCBieXRlcyIsIE1heCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFMsIHR5cGVuYW1lIFU+CisgIFMgZnJvbVppZ1phZyhVIHZhbCkgeworICAgIHJldHVybiAodmFsID4+IDEpIF4gc3RhdGljX2Nhc3Q8VT4oLXN0YXRpY19jYXN0PFM+KHZhbCAmIDEpKTsKKyAgfQorCisgIHZvaWQgZG9Xcml0ZUZpZWxkQmVnaW4oY29uc3QgU3RydWN0SXRlbVNwZWMmIHNwZWMsIGludCBjdHlwZSkgeworICAgIGludCBkaWZmID0gc3BlYy50YWcgLSB3cml0ZVRhZ3NfLnRvcCgpOworICAgIGlmIChkaWZmID4gMCAmJiBkaWZmIDw9IDE1KSB7CisgICAgICB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8dWludDhfdD4oZGlmZiA8PCA0IHwgY3R5cGUpKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVCeXRlKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGN0eXBlKSk7CisgICAgICB3cml0ZUkxNihzcGVjLnRhZyk7CisgICAgfQorICAgIHdyaXRlVGFnc18udG9wKCkgPSBzcGVjLnRhZzsKKyAgfQorCisgIHN0ZDo6c3RhY2s8aW50PiB3cml0ZVRhZ3NfOworICBzdGQ6OnN0YWNrPGludD4gcmVhZFRhZ3NfOworICBzdHJ1Y3QgeworICAgIGJvb2wgZXhpc3RzOworICAgIGJvb2wgdmFsdWU7CisgIH0gcmVhZEJvb2xfOworICBjaGFyKiBkdW1teV9idWZfOworfTsKK30KK30KK30KKyNlbmRpZiAvLyBUSFJJRlRfUFlfQ09NUEFDVF9ICmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC9lbmRpYW4uaCBiL2xpYi9weS9zcmMvZXh0L2VuZGlhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMzcyYTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2V4dC9lbmRpYW4uaApAQCAtMCwwICsxLDkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1BZX0VORElBTl9ICisjZGVmaW5lIFRIUklGVF9QWV9FTkRJQU5fSAorCisjaW5jbHVkZSA8UHl0aG9uLmg+CisKKyNpZm5kZWYgX1dJTjMyCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2Vsc2UKKyNpbmNsdWRlIDxXaW5Tb2NrMi5oPgorI3ByYWdtYSBjb21tZW50KGxpYiwgIndzMl8zMi5saWIiKQorI2RlZmluZSBCSUdfRU5ESUFOICg0MzIxKQorI2RlZmluZSBMSVRUTEVfRU5ESUFOICgxMjM0KQorI2RlZmluZSBCWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKyNkZWZpbmUgaW5saW5lIF9faW5saW5lCisjZW5kaWYKKworLyogRml4IGVuZGlhbm5lc3MgaXNzdWVzIG9uIFNvbGFyaXMgKi8KKyNpZiBkZWZpbmVkKF9fU1ZSNCkgJiYgZGVmaW5lZChfX3N1bikKKyNpZiBkZWZpbmVkKF9faTM4NikgJiYgIWRlZmluZWQoX19pMzg2X18pCisjZGVmaW5lIF9faTM4Nl9fCisjZW5kaWYKKworI2lmbmRlZiBCSUdfRU5ESUFOCisjZGVmaW5lIEJJR19FTkRJQU4gKDQzMjEpCisjZW5kaWYKKyNpZm5kZWYgTElUVExFX0VORElBTgorI2RlZmluZSBMSVRUTEVfRU5ESUFOICgxMjM0KQorI2VuZGlmCisKKy8qIEkzODYgaXMgTEUsIGV2ZW4gb24gU29sYXJpcyAqLworI2lmICFkZWZpbmVkKEJZVEVfT1JERVIpICYmIGRlZmluZWQoX19pMzg2X18pCisjZGVmaW5lIEJZVEVfT1JERVIgTElUVExFX0VORElBTgorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfX0JZVEVfT1JERVIKKyNpZiBkZWZpbmVkKEJZVEVfT1JERVIpICYmIGRlZmluZWQoTElUVExFX0VORElBTikgJiYgZGVmaW5lZChCSUdfRU5ESUFOKQorI2RlZmluZSBfX0JZVEVfT1JERVIgQllURV9PUkRFUgorI2RlZmluZSBfX0xJVFRMRV9FTkRJQU4gTElUVExFX0VORElBTgorI2RlZmluZSBfX0JJR19FTkRJQU4gQklHX0VORElBTgorI2Vsc2UKKyNlcnJvciAiQ2Fubm90IGRldGVybWluZSBlbmRpYW5uZXNzIgorI2VuZGlmCisjZW5kaWYKKworLy8gU2FtZSBjb21tZW50IGFzIHRoZSBlbnVtLiAgU29ycnkuCisjaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorI2RlZmluZSBudG9obGwobikgKG4pCisjZGVmaW5lIGh0b25sbChuKSAobikKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fR0xJQkNfXykKKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2RlZmluZSBsZXRvaGxsKG4pIGJzd2FwXzY0KG4pCisjZGVmaW5lIGh0b2xlbGwobikgYnN3YXBfNjQobikKKyNlbHNlIC8qIEdOVUMgJiBHTElCQyAqLworI2RlZmluZSBsZXRvaGxsKG4pICgoKCh1bnNpZ25lZCBsb25nIGxvbmcpbnRvaGwobikpIDw8IDMyKSArIG50b2hsKG4gPj4gMzIpKQorI2RlZmluZSBodG9sZWxsKG4pICgoKCh1bnNpZ25lZCBsb25nIGxvbmcpaHRvbmwobikpIDw8IDMyKSArIGh0b25sKG4gPj4gMzIpKQorI2VuZGlmCisjZWxpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dMSUJDX18pCisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNkZWZpbmUgbnRvaGxsKG4pIGJzd2FwXzY0KG4pCisjZGVmaW5lIGh0b25sbChuKSBic3dhcF82NChuKQorI2Vsc2UgLyogR05VQyAmIEdMSUJDICovCisjZGVmaW5lIG50b2hsbChuKSAoKCgodW5zaWduZWQgbG9uZyBsb25nKW50b2hsKG4pKSA8PCAzMikgKyBudG9obChuID4+IDMyKSkKKyNkZWZpbmUgaHRvbmxsKG4pICgoKCh1bnNpZ25lZCBsb25nIGxvbmcpaHRvbmwobikpIDw8IDMyKSArIGh0b25sKG4gPj4gMzIpKQorI2VuZGlmIC8qIEdOVUMgJiBHTElCQyAqLworI2RlZmluZSBsZXRvaGxsKG4pIChuKQorI2RlZmluZSBodG9sZWxsKG4pIChuKQorI2Vsc2UgLyogX19CWVRFX09SREVSICovCisjZXJyb3IgIkNhbid0IGRlZmluZSBodG9ubGwgb3IgbnRvaGxsISIKKyNlbmRpZgorCisjZW5kaWYgLy8gVEhSSUZUX1BZX0VORElBTl9ICmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC9tb2R1bGUuY3BwIGIvbGliL3B5L3NyYy9leHQvbW9kdWxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTU4YjhmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvbW9kdWxlLmNwcApAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8UHl0aG9uLmg+CisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJiaW5hcnkuaCIKKyNpbmNsdWRlICJjb21wYWN0LmgiCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBUT0RPKGRyZWlzcyk6IGRlZnZhbCBhcHBlYXJzIHRvIGJlIHVudXNlZC4gIExvb2sgaW50byByZW1vdmluZyBpdC4KKy8vIFRPRE8oZHJlaXNzKTogTWFrZSBwYXJzZV9zcGVjX2FyZ3MgcmVjdXJzaXZlLCBhbmQgY2FjaGUgdGhlIG91dHB1dAorLy8gICAgICAgICAgICAgICBwZXJtYW5lbnRseSBpbiB0aGUgb2JqZWN0LiAgKE1hbGxvYyBhbmQgb3JwaGFuLikKKy8vIFRPRE8oZHJlaXNzKTogV2h5IGRvIHdlIG5lZWQgY1N0cmluZ0lPIGZvciByZWFkaW5nLCB3aHkgbm90IGp1c3QgY2hhcio/CisvLyAgICAgICAgICAgICAgIENhbiBjU3RyaW5nSU8gbGV0IHVzIHdvcmsgd2l0aCBhIEJ1ZmZlcmVkVHJhbnNwb3J0PworLy8gVE9ETyhkcmVpc3MpOiBEb24ndCBpZ25vcmUgdGhlIHJ2IGZyb20gY3dyaXRlIChtYXliZSkuCisKKy8vIERvaW5nIGEgYmVuY2htYXJrIHNob3dzIHRoYXQgaW50ZXJuaW5nIGFjdHVhbGx5IG1ha2VzIGEgZGlmZmVyZW5jZSwgYW1hemluZ2x5LgorCisvKiogUG9pbnRlciB0byBpbnRlcm5lZCBzdHJpbmcgdG8gc3BlZWQgdXAgYXR0cmlidXRlIGxvb2t1cC4gKi8KK1B5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKFRGcm96ZW5EaWN0KTsKK1B5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19idWYpOworUHlPYmplY3QqIElOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX3JlZmlsbCk7CitzdGF0aWMgUHlPYmplY3QqIElOVEVSTl9TVFJJTkcoc3RyaW5nX2xlbmd0aF9saW1pdCk7CitzdGF0aWMgUHlPYmplY3QqIElOVEVSTl9TVFJJTkcoY29udGFpbmVyX2xlbmd0aF9saW1pdCk7CitzdGF0aWMgUHlPYmplY3QqIElOVEVSTl9TVFJJTkcodHJhbnMpOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHB5IHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgUHlPYmplY3QqIGVuY29kZV9pbXBsKFB5T2JqZWN0KiBhcmdzKSB7CisgIGlmICghYXJncykKKyAgICByZXR1cm4gTlVMTDsKKworICBQeU9iamVjdCogZW5jX29iaiA9IE5VTEw7CisgIFB5T2JqZWN0KiB0eXBlX2FyZ3MgPSBOVUxMOworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PIiwgJmVuY19vYmosICZ0eXBlX2FyZ3MpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKCFlbmNfb2JqIHx8ICF0eXBlX2FyZ3MpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIFQgcHJvdG9jb2w7CisgIGlmICghcHJvdG9jb2wucHJlcGFyZUVuY29kZUJ1ZmZlcigpIHx8ICFwcm90b2NvbC5lbmNvZGVWYWx1ZShlbmNfb2JqLCBUX1NUUlVDVCwgdHlwZV9hcmdzKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIHByb3RvY29sLmdldEVuY29kZWRWYWx1ZSgpOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgYXNfbG9uZ190aGVuX2RlbGV0ZShQeU9iamVjdCogdmFsdWUsIGxvbmcgZGVmYXVsdF92YWx1ZSkgeworICBTY29wZWRQeU9iamVjdCBzY29wZSh2YWx1ZSk7CisgIGxvbmcgdiA9IFB5SW50X0FzTG9uZyh2YWx1ZSk7CisgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSkgeworICAgIFB5RXJyX0NsZWFyKCk7CisgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7CisgIH0KKyAgcmV0dXJuIHY7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIFB5T2JqZWN0KiBkZWNvZGVfaW1wbChQeU9iamVjdCogYXJncykgeworICBQeU9iamVjdCogb3V0cHV0X29iaiA9IE5VTEw7CisgIFB5T2JqZWN0KiBvcHJvdCA9IE5VTEw7CisgIFB5T2JqZWN0KiB0eXBlYXJncyA9IE5VTEw7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT09PIiwgJm91dHB1dF9vYmosICZvcHJvdCwgJnR5cGVhcmdzKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgVCBwcm90b2NvbDsKKyAgaW50MzJfdCBkZWZhdWx0X2xpbWl0ID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKTsKKyAgcHJvdG9jb2wuc2V0U3RyaW5nTGVuZ3RoTGltaXQoCisgICAgICBhc19sb25nX3RoZW5fZGVsZXRlKFB5T2JqZWN0X0dldEF0dHIob3Byb3QsIElOVEVSTl9TVFJJTkcoc3RyaW5nX2xlbmd0aF9saW1pdCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X2xpbWl0KSk7CisgIHByb3RvY29sLnNldENvbnRhaW5lckxlbmd0aExpbWl0KAorICAgICAgYXNfbG9uZ190aGVuX2RlbGV0ZShQeU9iamVjdF9HZXRBdHRyKG9wcm90LCBJTlRFUk5fU1RSSU5HKGNvbnRhaW5lcl9sZW5ndGhfbGltaXQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9saW1pdCkpOworICBTY29wZWRQeU9iamVjdCB0cmFuc3BvcnQoUHlPYmplY3RfR2V0QXR0cihvcHJvdCwgSU5URVJOX1NUUklORyh0cmFucykpKTsKKyAgaWYgKCF0cmFuc3BvcnQpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIFN0cnVjdFR5cGVBcmdzIHBhcnNlZGFyZ3M7CisgIGlmICghcGFyc2Vfc3RydWN0X2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKCFwcm90b2NvbC5wcmVwYXJlRGVjb2RlQnVmZmVyRnJvbVRyYW5zcG9ydCh0cmFuc3BvcnQuZ2V0KCkpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gcHJvdG9jb2wucmVhZFN0cnVjdChvdXRwdXRfb2JqLCBwYXJzZWRhcmdzLmtsYXNzLCBwYXJzZWRhcmdzLnNwZWMpOworfQorfQorfQorfQorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnB5OworCisvKiAtLSBQWVRIT04gTU9EVUxFIFNFVFVQIFNUVUZGIC0tLSAqLworCitleHRlcm4gIkMiIHsKKworc3RhdGljIFB5T2JqZWN0KiBlbmNvZGVfYmluYXJ5KFB5T2JqZWN0KiwgUHlPYmplY3QqIGFyZ3MpIHsKKyAgcmV0dXJuIGVuY29kZV9pbXBsPEJpbmFyeVByb3RvY29sPihhcmdzKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBkZWNvZGVfYmluYXJ5KFB5T2JqZWN0KiwgUHlPYmplY3QqIGFyZ3MpIHsKKyAgcmV0dXJuIGRlY29kZV9pbXBsPEJpbmFyeVByb3RvY29sPihhcmdzKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBlbmNvZGVfY29tcGFjdChQeU9iamVjdCosIFB5T2JqZWN0KiBhcmdzKSB7CisgIHJldHVybiBlbmNvZGVfaW1wbDxDb21wYWN0UHJvdG9jb2w+KGFyZ3MpOworfQorCitzdGF0aWMgUHlPYmplY3QqIGRlY29kZV9jb21wYWN0KFB5T2JqZWN0KiwgUHlPYmplY3QqIGFyZ3MpIHsKKyAgcmV0dXJuIGRlY29kZV9pbXBsPENvbXBhY3RQcm90b2NvbD4oYXJncyk7Cit9CisKK3N0YXRpYyBQeU1ldGhvZERlZiBUaHJpZnRGYXN0QmluYXJ5TWV0aG9kc1tdID0geworICAgIHsiZW5jb2RlX2JpbmFyeSIsIGVuY29kZV9iaW5hcnksIE1FVEhfVkFSQVJHUywgIiJ9LAorICAgIHsiZGVjb2RlX2JpbmFyeSIsIGRlY29kZV9iaW5hcnksIE1FVEhfVkFSQVJHUywgIiJ9LAorICAgIHsiZW5jb2RlX2NvbXBhY3QiLCBlbmNvZGVfY29tcGFjdCwgTUVUSF9WQVJBUkdTLCAiIn0sCisgICAgeyJkZWNvZGVfY29tcGFjdCIsIGRlY29kZV9jb21wYWN0LCBNRVRIX1ZBUkFSR1MsICIifSwKKyAgICB7TlVMTCwgTlVMTCwgMCwgTlVMTH0gLyogU2VudGluZWwgKi8KK307CisKKyNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKKworc3RhdGljIHN0cnVjdCBQeU1vZHVsZURlZiBUaHJpZnRGYXN0QmluYXJ5RGVmID0ge1B5TW9kdWxlRGVmX0hFQURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhyaWZ0LnByb3RvY29sLmZhc3RiaW5hcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRGYXN0QmluYXJ5TWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMfTsKKworI2RlZmluZSBJTklURVJST1IgcmV0dXJuIE5VTEw7CisKK1B5T2JqZWN0KiBQeUluaXRfZmFzdGJpbmFyeSgpIHsKKworI2Vsc2UKKworI2RlZmluZSBJTklURVJST1IgcmV0dXJuOworCit2b2lkIGluaXRmYXN0YmluYXJ5KCkgeworCisgIFB5Y1N0cmluZ19JTVBPUlQ7CisgIGlmIChQeWNTdHJpbmdJTyA9PSBOVUxMKQorICAgIElOSVRFUlJPUgorCisjZW5kaWYKKworI2RlZmluZSBJTklUX0lOVEVSTl9TVFJJTkcodmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElOVEVSTl9TVFJJTkcodmFsdWUpID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygjdmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghSU5URVJOX1NUUklORyh2YWx1ZSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgSU5JVEVSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisgIElOSVRfSU5URVJOX1NUUklORyhURnJvemVuRGljdCk7CisgIElOSVRfSU5URVJOX1NUUklORyhjc3RyaW5naW9fYnVmKTsKKyAgSU5JVF9JTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19yZWZpbGwpOworICBJTklUX0lOVEVSTl9TVFJJTkcoc3RyaW5nX2xlbmd0aF9saW1pdCk7CisgIElOSVRfSU5URVJOX1NUUklORyhjb250YWluZXJfbGVuZ3RoX2xpbWl0KTsKKyAgSU5JVF9JTlRFUk5fU1RSSU5HKHRyYW5zKTsKKyN1bmRlZiBJTklUX0lOVEVSTl9TVFJJTkcKKworICBQeU9iamVjdCogbW9kdWxlID0KKyNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKKyAgICAgIFB5TW9kdWxlX0NyZWF0ZSgmVGhyaWZ0RmFzdEJpbmFyeURlZik7CisjZWxzZQorICAgICAgUHlfSW5pdE1vZHVsZSgidGhyaWZ0LnByb3RvY29sLmZhc3RiaW5hcnkiLCBUaHJpZnRGYXN0QmluYXJ5TWV0aG9kcyk7CisjZW5kaWYKKyAgaWYgKG1vZHVsZSA9PSBOVUxMKQorICAgIElOSVRFUlJPUjsKKworI2lmIFBZX01BSk9SX1ZFUlNJT04gPj0gMworICByZXR1cm4gbW9kdWxlOworI2VuZGlmCit9Cit9CmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC9wcm90b2NvbC5oIGIvbGliL3B5L3NyYy9leHQvcHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjFiN2VlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvcHJvdG9jb2wuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1BZX1BST1RPQ09MX0gKKyNkZWZpbmUgVEhSSUZUX1BZX1BST1RPQ09MX0gKKworI2luY2x1ZGUgImV4dC90eXBlcy5oIgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgorY2xhc3MgUHJvdG9jb2xCYXNlIHsKKworcHVibGljOgorICBQcm90b2NvbEJhc2UoKQorICAgIDogc3RyaW5nTGltaXRfKChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkpLAorICAgICAgY29udGFpbmVyTGltaXRfKChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkpLAorICAgICAgb3V0cHV0XyhOVUxMKSB7fQorICBpbmxpbmUgdmlydHVhbCB+UHJvdG9jb2xCYXNlKCk7CisKKyAgYm9vbCBwcmVwYXJlRGVjb2RlQnVmZmVyRnJvbVRyYW5zcG9ydChQeU9iamVjdCogdHJhbnMpOworCisgIFB5T2JqZWN0KiByZWFkU3RydWN0KFB5T2JqZWN0KiBvdXRwdXQsIFB5T2JqZWN0KiBrbGFzcywgUHlPYmplY3QqIHNwZWNfc2VxKTsKKworICBib29sIHByZXBhcmVFbmNvZGVCdWZmZXIoKTsKKworICBib29sIGVuY29kZVZhbHVlKFB5T2JqZWN0KiB2YWx1ZSwgVFR5cGUgdHlwZSwgUHlPYmplY3QqIHR5cGVhcmdzKTsKKworICBQeU9iamVjdCogZ2V0RW5jb2RlZFZhbHVlKCk7CisKKyAgbG9uZyBzdHJpbmdMaW1pdCgpIGNvbnN0IHsgcmV0dXJuIHN0cmluZ0xpbWl0XzsgfQorICB2b2lkIHNldFN0cmluZ0xlbmd0aExpbWl0KGxvbmcgbGltaXQpIHsgc3RyaW5nTGltaXRfID0gbGltaXQ7IH0KKworICBsb25nIGNvbnRhaW5lckxpbWl0KCkgY29uc3QgeyByZXR1cm4gY29udGFpbmVyTGltaXRfOyB9CisgIHZvaWQgc2V0Q29udGFpbmVyTGVuZ3RoTGltaXQobG9uZyBsaW1pdCkgeyBjb250YWluZXJMaW1pdF8gPSBsaW1pdDsgfQorCitwcm90ZWN0ZWQ6CisgIGJvb2wgcmVhZEJ5dGVzKGNoYXIqKiBvdXRwdXQsIGludCBsZW4pOworCisgIGJvb2wgcmVhZEJ5dGUodWludDhfdCYgdmFsKSB7CisgICAgY2hhciogYnVmOworICAgIGlmICghcmVhZEJ5dGVzKCZidWYsIDEpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZhbCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGJ1ZlswXSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHdyaXRlQnVmZmVyKGNoYXIqIGRhdGEsIHNpemVfdCBsZW4pOworCisgIHZvaWQgd3JpdGVCeXRlKHVpbnQ4X3QgdmFsKSB7IHdyaXRlQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZ2YWwpLCAxKTsgfQorCisgIFB5T2JqZWN0KiBkZWNvZGVWYWx1ZShUVHlwZSB0eXBlLCBQeU9iamVjdCogdHlwZWFyZ3MpOworCisgIGJvb2wgc2tpcChUVHlwZSB0eXBlKTsKKworICBpbmxpbmUgYm9vbCBjaGVja1R5cGUoVFR5cGUgZ290LCBUVHlwZSBleHBlY3RlZCk7CisgIGlubGluZSBib29sIGNoZWNrTGVuZ3RoTGltaXQoaW50MzJfdCBsZW4sIGxvbmcgbGltaXQpOworCisgIGlubGluZSBib29sIGlzVXRmOChQeU9iamVjdCogdHlwZWFyZ3MpOworCitwcml2YXRlOgorICBJbXBsKiBpbXBsKCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8SW1wbCo+KHRoaXMpOyB9CisKKyAgbG9uZyBzdHJpbmdMaW1pdF87CisgIGxvbmcgY29udGFpbmVyTGltaXRfOworICBFbmNvZGVCdWZmZXIqIG91dHB1dF87CisgIERlY29kZUJ1ZmZlciBpbnB1dF87Cit9OworfQorfQorfQorCisjaW5jbHVkZSAiZXh0L3Byb3RvY29sLnRjYyIKKworI2VuZGlmIC8vIFRIUklGVF9QWV9QUk9UT0NPTF9ICmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC9wcm90b2NvbC50Y2MgYi9saWIvcHkvc3JjL2V4dC9wcm90b2NvbC50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE1ZGY3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L3Byb3RvY29sLnRjYwpAQCAtMCwwICsxLDkxMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9QWV9QUk9UT0NPTF9UQ0MKKyNkZWZpbmUgVEhSSUZUX1BZX1BST1RPQ09MX1RDQworCisjaW5jbHVkZSA8aXRlcmF0b3I+CisKKyNkZWZpbmUgQ0hFQ0tfUkFOR0UodiwgbWluLCBtYXgpICgoKHYpIDw9IChtYXgpKSAmJiAoKHYpID49IChtaW4pKSkKKyNkZWZpbmUgSU5JVF9PVVRCVUZfU0laRSAxMjgKKworI2lmIFBZX01BSk9SX1ZFUlNJT04gPCAzCisjaW5jbHVkZSA8Y1N0cmluZ0lPLmg+CisjZWxzZQorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNlbmRpZgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHB5IHsKKworI2lmIFBZX01BSk9SX1ZFUlNJT04gPCAzCisKK25hbWVzcGFjZSBkZXRhaWwgeworCitpbmxpbmUgYm9vbCBpbnB1dF9jaGVjayhQeU9iamVjdCogaW5wdXQpIHsKKyAgcmV0dXJuIFB5Y1N0cmluZ0lPX0lucHV0Q2hlY2soaW5wdXQpOworfQorCitpbmxpbmUgRW5jb2RlQnVmZmVyKiBuZXdfZW5jb2RlX2J1ZmZlcihzaXplX3Qgc2l6ZSkgeworICBpZiAoIVB5Y1N0cmluZ0lPKSB7CisgICAgUHljU3RyaW5nX0lNUE9SVDsKKyAgfQorICBpZiAoIVB5Y1N0cmluZ0lPKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIFB5Y1N0cmluZ0lPLT5OZXdPdXRwdXQoc2l6ZSk7Cit9CisKK2lubGluZSBpbnQgcmVhZF9idWZmZXIoUHlPYmplY3QqIGJ1ZiwgY2hhcioqIG91dHB1dCwgaW50IGxlbikgeworICBpZiAoIVB5Y1N0cmluZ0lPKSB7CisgICAgUHljU3RyaW5nX0lNUE9SVDsKKyAgfQorICBpZiAoIVB5Y1N0cmluZ0lPKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCAiZmFpbGVkIHRvIGltcG9ydCBuYXRpdmUgY1N0cmluZ0lPIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiBQeWNTdHJpbmdJTy0+Y3JlYWQoYnVmLCBvdXRwdXQsIGxlbik7Cit9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgoraW5saW5lIFByb3RvY29sQmFzZTxJbXBsPjo6flByb3RvY29sQmFzZSgpIHsKKyAgaWYgKG91dHB1dF8pIHsKKyAgICBQeV9DTEVBUihvdXRwdXRfKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2lubGluZSBib29sIFByb3RvY29sQmFzZTxJbXBsPjo6aXNVdGY4KFB5T2JqZWN0KiB0eXBlYXJncykgeworICByZXR1cm4gUHlTdHJpbmdfQ2hlY2sodHlwZWFyZ3MpICYmICFzdHJuY21wKFB5U3RyaW5nX0FTX1NUUklORyh0eXBlYXJncyksICJVVEY4IiwgNCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgorUHlPYmplY3QqIFByb3RvY29sQmFzZTxJbXBsPjo6Z2V0RW5jb2RlZFZhbHVlKCkgeworICBpZiAoIVB5Y1N0cmluZ0lPKSB7CisgICAgUHljU3RyaW5nX0lNUE9SVDsKKyAgfQorICBpZiAoIVB5Y1N0cmluZ0lPKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIFB5Y1N0cmluZ0lPLT5jZ2V0dmFsdWUob3V0cHV0Xyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgoraW5saW5lIGJvb2wgUHJvdG9jb2xCYXNlPEltcGw+Ojp3cml0ZUJ1ZmZlcihjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoIVB5Y1N0cmluZ0lPKSB7CisgICAgUHljU3RyaW5nX0lNUE9SVDsKKyAgfQorICBpZiAoIVB5Y1N0cmluZ0lPKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCAiZmFpbGVkIHRvIGltcG9ydCBuYXRpdmUgY1N0cmluZ0lPIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGludCBsZW4gPSBQeWNTdHJpbmdJTy0+Y3dyaXRlKG91dHB1dF8sIGRhdGEsIHNpemUpOworICBpZiAobGVuIDwgMCkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLCAiZmFpbGVkIHRvIHdyaXRlIHRvIGNTdHJpbmdJTyBvYmplY3QiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4obGVuKSAhPSBzaXplKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0VPRkVycm9yLCAid3JpdGUgbGVuZ3RoIG1pc21hdGNoOiBleHBlY3RlZCAlbHUgZ290ICVkIiwgc2l6ZSwgbGVuKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKyNlbHNlCisKK25hbWVzcGFjZSBkZXRhaWwgeworCitpbmxpbmUgYm9vbCBpbnB1dF9jaGVjayhQeU9iamVjdCogaW5wdXQpIHsKKyAgLy8gVE9ETzogQ2hlY2sgZm9yIEJ5dGVzSU8gdHlwZQorICByZXR1cm4gdHJ1ZTsKK30KKworaW5saW5lIEVuY29kZUJ1ZmZlciogbmV3X2VuY29kZV9idWZmZXIoc2l6ZV90IHNpemUpIHsKKyAgRW5jb2RlQnVmZmVyKiBidWZmZXIgPSBuZXcgRW5jb2RlQnVmZmVyOworICBidWZmZXItPmJ1Zi5yZXNlcnZlKHNpemUpOworICBidWZmZXItPnBvcyA9IDA7CisgIHJldHVybiBidWZmZXI7Cit9CisKK3N0cnVjdCBieXRlc2lvIHsKKyAgUHlPYmplY3RfSEVBRAorI2lmIFBZX01JTk9SX1ZFUlNJT04gPCA1CisgICAgICBjaGFyKiBidWY7CisjZWxzZQorICAgICAgUHlPYmplY3QqIGJ1ZjsKKyNlbmRpZgorICBQeV9zc2l6ZV90IHBvczsKKyAgUHlfc3NpemVfdCBzdHJpbmdfc2l6ZTsKK307CisKK2lubGluZSBpbnQgcmVhZF9idWZmZXIoUHlPYmplY3QqIGJ1ZiwgY2hhcioqIG91dHB1dCwgaW50IGxlbikgeworICBieXRlc2lvKiBidWYyID0gcmVpbnRlcnByZXRfY2FzdDxieXRlc2lvKj4oYnVmKTsKKyNpZiBQWV9NSU5PUl9WRVJTSU9OIDwgNQorICAqb3V0cHV0ID0gYnVmMi0+YnVmICsgYnVmMi0+cG9zOworI2Vsc2UKKyAgKm91dHB1dCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKGJ1ZjItPmJ1ZikgKyBidWYyLT5wb3M7CisjZW5kaWYKKyAgUHlfc3NpemVfdCBwb3MwID0gYnVmMi0+cG9zOworICBidWYyLT5wb3MgPSAoc3RkOjptaW4pKGJ1ZjItPnBvcyArIHN0YXRpY19jYXN0PFB5X3NzaXplX3Q+KGxlbiksIGJ1ZjItPnN0cmluZ19zaXplKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oYnVmMi0+cG9zIC0gcG9zMCk7Cit9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgoraW5saW5lIFByb3RvY29sQmFzZTxJbXBsPjo6flByb3RvY29sQmFzZSgpIHsKKyAgaWYgKG91dHB1dF8pIHsKKyAgICBkZWxldGUgb3V0cHV0XzsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2lubGluZSBib29sIFByb3RvY29sQmFzZTxJbXBsPjo6aXNVdGY4KFB5T2JqZWN0KiB0eXBlYXJncykgeworICAvLyB3aGlsZSBjb25kaXRpb24gZm9yIHB5MiBpcyAiYXJnID09ICdVVEY4JyIsIGl0IHNob3VsZCBiZSAiYXJnICE9ICdCSU5BUlknIiBmb3IgcHkzLgorICAvLyBIQUNLOiBjaGVjayB0aGUgbGVuZ3RoIGFuZCBkb24ndCBib3RoZXIgcmVhZGluZyB0aGUgdmFsdWUKKyAgcmV0dXJuICFQeVVuaWNvZGVfQ2hlY2sodHlwZWFyZ3MpIHx8IFB5VW5pY29kZV9HRVRfTEVOR1RIKHR5cGVhcmdzKSAhPSA2OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK1B5T2JqZWN0KiBQcm90b2NvbEJhc2U8SW1wbD46OmdldEVuY29kZWRWYWx1ZSgpIHsKKyAgcmV0dXJuIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUob3V0cHV0Xy0+YnVmLmRhdGEoKSwgb3V0cHV0Xy0+YnVmLnNpemUoKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgoraW5saW5lIGJvb2wgUHJvdG9jb2xCYXNlPEltcGw+Ojp3cml0ZUJ1ZmZlcihjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBzaXplX3QgbmVlZCA9IHNpemUgKyBvdXRwdXRfLT5wb3M7CisgIGlmIChvdXRwdXRfLT5idWYuY2FwYWNpdHkoKSA8IG5lZWQpIHsKKyAgICB0cnkgeworICAgICAgb3V0cHV0Xy0+YnVmLnJlc2VydmUobmVlZCk7CisgICAgfSBjYXRjaCAoc3RkOjpiYWRfYWxsb2MmIGV4KSB7CisgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJGYWlsZWQgdG8gYWxsb2NhdGUgd3JpdGUgYnVmZmVyIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHN0ZDo6Y29weShkYXRhLCBkYXRhICsgc2l6ZSwgc3RkOjpiYWNrX2luc2VydGVyKG91dHB1dF8tPmJ1ZikpOworICByZXR1cm4gdHJ1ZTsKK30KKworI2VuZGlmCisKK25hbWVzcGFjZSBkZXRhaWwgeworCisjZGVmaW5lIERFQ0xBUkVfT1BfU0NPUEUobmFtZSwgb3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0cnVjdCBuYW1lIyNTY29wZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSW1wbCogaW1wbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYm9vbCB2YWxpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmFtZSMjU2NvcGUoSW1wbCogdGhpeikgOiBpbXBsKHRoaXopLCB2YWxpZChpbXBsLT5vcCMjQmVnaW4oKSkge30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfm5hbWUjI1Njb3BlKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAodmFsaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGltcGwtPm9wIyNFbmQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb3BlcmF0b3IgYm9vbCgpIHsgcmV0dXJuIHZhbGlkOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbXBsLCB0ZW1wbGF0ZSA8dHlwZW5hbWU+IGNsYXNzIFQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWUjI1Njb3BlPEltcGw+IG9wIyNTY29wZShUPEltcGw+KiB0aGl6KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG5hbWUjI1Njb3BlPEltcGw+KHN0YXRpY19jYXN0PEltcGwqPih0aGl6KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KK0RFQ0xBUkVfT1BfU0NPUEUoV3JpdGVTdHJ1Y3QsIHdyaXRlU3RydWN0KQorREVDTEFSRV9PUF9TQ09QRShSZWFkU3RydWN0LCByZWFkU3RydWN0KQorI3VuZGVmIERFQ0xBUkVfT1BfU0NPUEUKKworaW5saW5lIGJvb2wgY2hlY2tfc3NpemVfdF8zMihQeV9zc2l6ZV90IGxlbikgeworICAvLyBlcnJvciBmcm9tIGdldHRpbmcgdGhlIGludAorICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQobGVuKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUNIRUNLX1JBTkdFKGxlbiwgMCwgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInNpemUgb3V0IG9mIHJhbmdlOiBleGNlZWRlZCBJTlQzMl9NQVgiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBwYXJzZV9weWludChQeU9iamVjdCogbywgVCogcmV0LCBpbnQzMl90IG1pbiwgaW50MzJfdCBtYXgpIHsKKyAgbG9uZyB2YWwgPSBQeUludF9Bc0xvbmcobyk7CisKKyAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHZhbCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFDSEVDS19SQU5HRSh2YWwsIG1pbiwgbWF4KSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAiaW50IG91dCBvZiByYW5nZSIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpyZXQgPSBzdGF0aWNfY2FzdDxUPih2YWwpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitpbmxpbmUgYm9vbCBQcm90b2NvbEJhc2U8SW1wbD46OmNoZWNrVHlwZShUVHlwZSBnb3QsIFRUeXBlIGV4cGVjdGVkKSB7CisgIGlmIChleHBlY3RlZCAhPSBnb3QpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZ290IHdyb25nIHR0eXBlIHdoaWxlIHJlYWRpbmcgZmllbGQiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgorYm9vbCBQcm90b2NvbEJhc2U8SW1wbD46OmNoZWNrTGVuZ3RoTGltaXQoaW50MzJfdCBsZW4sIGxvbmcgbGltaXQpIHsKKyAgaWYgKGxlbiA8IDApIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfT3ZlcmZsb3dFcnJvciwgIm5lZ2F0aXZlIGxlbmd0aDogJWxkIiwgbGltaXQpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAobGVuID4gbGltaXQpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInNpemUgZXhjZWVkZWQgc3BlY2lmaWVkIGxpbWl0OiAlbGQiLCBsaW1pdCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2Jvb2wgUHJvdG9jb2xCYXNlPEltcGw+OjpyZWFkQnl0ZXMoY2hhcioqIG91dHB1dCwgaW50IGxlbikgeworICBpZiAobGVuIDwgMCkgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiYXR0ZW1wdGVkIHRvIHJlYWQgbmVnYXRpdmUgbGVuZ3RoOiAlZCIsIGxlbik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIFRPRE8oZHJlaXNzKTogRG9uJ3QgZmVhciB0aGUgbWFsbG9jLiAgVGhpbmsgYWJvdXQgdGFraW5nIGEgY29weSBvZgorICAvLyAgICAgICAgICAgICAgIHRoZSBwYXJ0aWFsIHJlYWQgaW5zdGVhZCBvZiBmb3JjaW5nIHRoZSB0cmFuc3BvcnQKKyAgLy8gICAgICAgICAgICAgICB0byBwcmVwZW5kIGl0IHRvIGl0cyBidWZmZXIuCisKKyAgaW50IHJsZW4gPSBkZXRhaWw6OnJlYWRfYnVmZmVyKGlucHV0Xy5zdHJpbmdpb2J1Zi5nZXQoKSwgb3V0cHV0LCBsZW4pOworCisgIGlmIChybGVuID09IGxlbikgeworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKHJsZW4gPT0gLTEpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgLy8gdXNpbmcgYnVpbGRpbmcgZnVuY3Rpb25zIGFzIHRoaXMgaXMgYSByYXJlIGNvZGVwYXRoCisgICAgU2NvcGVkUHlPYmplY3QgbmV3aW9idWYoUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGlucHV0Xy5yZWZpbGxfY2FsbGFibGUuZ2V0KCksIHJlZmlsbF9zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXQsIHJsZW4sIGxlbiwgTlVMTCkpOworICAgIGlmICghbmV3aW9idWYpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBtdXN0IGRvIHRoaXMgKkFGVEVSKiB0aGUgY2FsbCBzbyB0aGF0IHdlIGRvbid0IGRlcmVmIHRoZSBpbyBidWZmZXIKKyAgICBpbnB1dF8uc3RyaW5naW9idWYucmVzZXQobmV3aW9idWYucmVsZWFzZSgpKTsKKworICAgIHJsZW4gPSBkZXRhaWw6OnJlYWRfYnVmZmVyKGlucHV0Xy5zdHJpbmdpb2J1Zi5nZXQoKSwgb3V0cHV0LCBsZW4pOworCisgICAgaWYgKHJsZW4gPT0gbGVuKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHJsZW4gPT0gLTEpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVE9ETyhkcmVpc3MpOiBUaGlzIGNvdWxkIGJlIGEgdmFsaWQgY29kZSBwYXRoIGZvciBiaWcgYmluYXJ5IGJsb2JzLgorICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInJlZmlsbCBjbGFpbWVkIHRvIGhhdmUgcmVmaWxsZWQgdGhlIGJ1ZmZlciwgYnV0IGRpZG4ndCEhIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgorYm9vbCBQcm90b2NvbEJhc2U8SW1wbD46OnByZXBhcmVEZWNvZGVCdWZmZXJGcm9tVHJhbnNwb3J0KFB5T2JqZWN0KiB0cmFucykgeworICBpZiAoaW5wdXRfLnN0cmluZ2lvYnVmKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJkZWNvZGUgYnVmZmVyIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBTY29wZWRQeU9iamVjdCBzdHJpbmdpb2J1ZihQeU9iamVjdF9HZXRBdHRyKHRyYW5zLCBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19idWYpKSk7CisgIGlmICghc3RyaW5naW9idWYpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFkZXRhaWw6OmlucHV0X2NoZWNrKHN0cmluZ2lvYnVmLmdldCgpKSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3Rpbmcgc3RyaW5naW8gaW5wdXRfIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgU2NvcGVkUHlPYmplY3QgcmVmaWxsX2NhbGxhYmxlKFB5T2JqZWN0X0dldEF0dHIodHJhbnMsIElOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX3JlZmlsbCkpKTsKKyAgaWYgKCFyZWZpbGxfY2FsbGFibGUpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKHJlZmlsbF9jYWxsYWJsZS5nZXQoKSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIGNhbGxhYmxlIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW5wdXRfLnN0cmluZ2lvYnVmLnN3YXAoc3RyaW5naW9idWYpOworICBpbnB1dF8ucmVmaWxsX2NhbGxhYmxlLnN3YXAocmVmaWxsX2NhbGxhYmxlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgorYm9vbCBQcm90b2NvbEJhc2U8SW1wbD46OnByZXBhcmVFbmNvZGVCdWZmZXIoKSB7CisgIG91dHB1dF8gPSBkZXRhaWw6Om5ld19lbmNvZGVfYnVmZmVyKElOSVRfT1VUQlVGX1NJWkUpOworICByZXR1cm4gb3V0cHV0XyAhPSBOVUxMOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2Jvb2wgUHJvdG9jb2xCYXNlPEltcGw+OjplbmNvZGVWYWx1ZShQeU9iamVjdCogdmFsdWUsIFRUeXBlIHR5cGUsIFB5T2JqZWN0KiB0eXBlYXJncykgeworICAvKgorICAgKiBSZWZjb3VudGluZyBTdHJhdGVneToKKyAgICoKKyAgICogV2UgYXNzdW1lIHRoYXQgZWxlbWVudHMgb2YgdGhlIHRocmlmdF9zcGVjIHR1cGxlIGFyZSBub3QgZ29pbmcgdG8gYmUKKyAgICogbXV0YXRlZCwgc28gd2UgZG9uJ3QgcmVmIGNvdW50IHRob3NlIGF0IGFsbC4gT3RoZXIgdGhhbiB0aGF0LCB3ZSB0cnkgdG8KKyAgICoga2VlcCBhIHJlZmVyZW5jZSB0byBhbGwgdGhlIHVzZXItY3JlYXRlZCBvYmplY3RzIHdoaWxlIHdlIHdvcmsgd2l0aCB0aGVtLgorICAgKiBlbmNvZGVWYWx1ZSBhc3N1bWVzIHRoYXQgYSByZWZlcmVuY2UgaXMgYWxyZWFkeSBoZWxkLiBUaGUgKmNhbGxlciogaXMKKyAgICogcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIHJlZmVyZW5jZXMKKyAgICovCisKKyAgc3dpdGNoICh0eXBlKSB7CisKKyAgY2FzZSBUX0JPT0w6IHsKKyAgICBpbnQgdiA9IFB5T2JqZWN0X0lzVHJ1ZSh2YWx1ZSk7CisgICAgaWYgKHYgPT0gLTEpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaW1wbCgpLT53cml0ZUJvb2wodik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgY2FzZSBUX0kwODogeworICAgIGludDhfdCB2YWw7CisKKyAgICBpZiAoIXBhcnNlX3B5aW50KHZhbHVlLCAmdmFsLCAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ4X3Q+OjptaW4pKCksCisgICAgICAgICAgICAgICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ4X3Q+OjptYXgpKCkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW1wbCgpLT53cml0ZUk4KHZhbCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgY2FzZSBUX0kxNjogeworICAgIGludDE2X3QgdmFsOworCisgICAgaWYgKCFwYXJzZV9weWludCh2YWx1ZSwgJnZhbCwgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1pbikoKSwKKyAgICAgICAgICAgICAgICAgICAgIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptYXgpKCkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW1wbCgpLT53cml0ZUkxNih2YWwpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGNhc2UgVF9JMzI6IHsKKyAgICBpbnQzMl90IHZhbDsKKworICAgIGlmICghcGFyc2VfcHlpbnQodmFsdWUsICZ2YWwsIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptaW4pKCksCisgICAgICAgICAgICAgICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGltcGwoKS0+d3JpdGVJMzIodmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBjYXNlIFRfSTY0OiB7CisgICAgaW50NjRfdCBudmFsID0gUHlMb25nX0FzTG9uZ0xvbmcodmFsdWUpOworCisgICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKG52YWwpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFDSEVDS19SQU5HRShudmFsLCAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWluKSgpLAorICAgICAgICAgICAgICAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCkoKSkpIHsKKyAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAiaW50IG91dCBvZiByYW5nZSIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGltcGwoKS0+d3JpdGVJNjQobnZhbCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjYXNlIFRfRE9VQkxFOiB7CisgICAgZG91YmxlIG52YWwgPSBQeUZsb2F0X0FzRG91YmxlKHZhbHVlKTsKKyAgICBpZiAobnZhbCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbXBsKCktPndyaXRlRG91YmxlKG52YWwpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX1NUUklORzogeworICAgIFNjb3BlZFB5T2JqZWN0IG52YWw7CisKKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgeworICAgICAgbnZhbC5yZXNldChQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHZhbHVlKSk7CisgICAgICBpZiAoIW52YWwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgbnZhbC5yZXNldCh2YWx1ZSk7CisgICAgfQorCisgICAgUHlfc3NpemVfdCBsZW4gPSBQeUJ5dGVzX1NpemUobnZhbC5nZXQoKSk7CisgICAgaWYgKCFkZXRhaWw6OmNoZWNrX3NzaXplX3RfMzIobGVuKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGltcGwoKS0+d3JpdGVTdHJpbmcobnZhbC5nZXQoKSwgc3RhdGljX2Nhc3Q8aW50MzJfdD4obGVuKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjYXNlIFRfTElTVDoKKyAgY2FzZSBUX1NFVDogeworICAgIFNldExpc3RUeXBlQXJncyBwYXJzZWRhcmdzOworICAgIGlmICghcGFyc2Vfc2V0X2xpc3RfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUHlfc3NpemVfdCBsZW4gPSBQeU9iamVjdF9MZW5ndGgodmFsdWUpOworICAgIGlmICghZGV0YWlsOjpjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIWltcGwoKS0+d3JpdGVMaXN0QmVnaW4odmFsdWUsIHBhcnNlZGFyZ3MsIHN0YXRpY19jYXN0PGludDMyX3Q+KGxlbikpIHx8IFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgU2NvcGVkUHlPYmplY3QgaXRlcmF0b3IoUHlPYmplY3RfR2V0SXRlcih2YWx1ZSkpOworICAgIGlmICghaXRlcmF0b3IpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB3aGlsZSAoUHlPYmplY3QqIHJhd0l0ZW0gPSBQeUl0ZXJfTmV4dChpdGVyYXRvci5nZXQoKSkpIHsKKyAgICAgIFNjb3BlZFB5T2JqZWN0IGl0ZW0ocmF3SXRlbSk7CisgICAgICBpZiAoIWVuY29kZVZhbHVlKGl0ZW0uZ2V0KCksIHBhcnNlZGFyZ3MuZWxlbWVudF90eXBlLCBwYXJzZWRhcmdzLnR5cGVhcmdzKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjYXNlIFRfTUFQOiB7CisgICAgUHlfc3NpemVfdCBsZW4gPSBQeURpY3RfU2l6ZSh2YWx1ZSk7CisgICAgaWYgKCFkZXRhaWw6OmNoZWNrX3NzaXplX3RfMzIobGVuKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIE1hcFR5cGVBcmdzIHBhcnNlZGFyZ3M7CisgICAgaWYgKCFwYXJzZV9tYXBfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFpbXBsKCktPndyaXRlTWFwQmVnaW4odmFsdWUsIHBhcnNlZGFyZ3MsIHN0YXRpY19jYXN0PGludDMyX3Q+KGxlbikpIHx8IFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgIFB5T2JqZWN0KiBrID0gTlVMTDsKKyAgICBQeU9iamVjdCogdiA9IE5VTEw7CisgICAgLy8gVE9ETyhibWF1cmVyKTogc2hvdWxkIHN1cHBvcnQgYW55IG1hcHBpbmcsIG5vdCBqdXN0IGRpY3RzCisgICAgd2hpbGUgKFB5RGljdF9OZXh0KHZhbHVlLCAmcG9zLCAmaywgJnYpKSB7CisgICAgICBpZiAoIWVuY29kZVZhbHVlKGssIHBhcnNlZGFyZ3Mua3RhZywgcGFyc2VkYXJncy5rdHlwZWFyZ3MpCisgICAgICAgICAgfHwgIWVuY29kZVZhbHVlKHYsIHBhcnNlZGFyZ3MudnRhZywgcGFyc2VkYXJncy52dHlwZWFyZ3MpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjYXNlIFRfU1RSVUNUOiB7CisgICAgU3RydWN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKKyAgICBpZiAoIXBhcnNlX3N0cnVjdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQeV9zc2l6ZV90IG5zcGVjID0gUHlUdXBsZV9TaXplKHBhcnNlZGFyZ3Muc3BlYyk7CisgICAgaWYgKG5zcGVjID09IC0xKSB7CisgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAic3BlYyBpcyBub3QgYSB0dXBsZSIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGRldGFpbDo6V3JpdGVTdHJ1Y3RTY29wZTxJbXBsPiBzY29wZSA9IGRldGFpbDo6d3JpdGVTdHJ1Y3RTY29wZSh0aGlzKTsKKyAgICBpZiAoIXNjb3BlKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoUHlfc3NpemVfdCBpID0gMDsgaSA8IG5zcGVjOyBpKyspIHsKKyAgICAgIFB5T2JqZWN0KiBzcGVjX3R1cGxlID0gUHlUdXBsZV9HRVRfSVRFTShwYXJzZWRhcmdzLnNwZWMsIGkpOworICAgICAgaWYgKHNwZWNfdHVwbGUgPT0gUHlfTm9uZSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgU3RydWN0SXRlbVNwZWMgcGFyc2Vkc3BlYzsKKyAgICAgIGlmICghcGFyc2Vfc3RydWN0X2l0ZW1fc3BlYygmcGFyc2Vkc3BlYywgc3BlY190dXBsZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBTY29wZWRQeU9iamVjdCBpbnN0dmFsKFB5T2JqZWN0X0dldEF0dHIodmFsdWUsIHBhcnNlZHNwZWMuYXR0cm5hbWUpKTsKKworICAgICAgaWYgKCFpbnN0dmFsKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgaWYgKGluc3R2YWwuZ2V0KCkgPT0gUHlfTm9uZSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgYm9vbCByZXMgPSBpbXBsKCktPndyaXRlRmllbGQoaW5zdHZhbC5nZXQoKSwgcGFyc2Vkc3BlYyk7CisgICAgICBpZiAoIXJlcykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIGltcGwoKS0+d3JpdGVGaWVsZFN0b3AoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNhc2UgVF9TVE9QOgorICBjYXNlIFRfVk9JRDoKKyAgY2FzZSBUX1VURjE2OgorICBjYXNlIFRfVVRGODoKKyAgY2FzZSBUX1U2NDoKKyAgZGVmYXVsdDoKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiVW5leHBlY3RlZCBUVHlwZSBmb3IgZW5jb2RlVmFsdWU6ICVkIiwgdHlwZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgorYm9vbCBQcm90b2NvbEJhc2U8SW1wbD46OnNraXAoVFR5cGUgdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgY2FzZSBUX0JPT0w6CisgICAgcmV0dXJuIGltcGwoKS0+c2tpcEJvb2woKTsKKyAgY2FzZSBUX0kwODoKKyAgICByZXR1cm4gaW1wbCgpLT5za2lwQnl0ZSgpOworICBjYXNlIFRfSTE2OgorICAgIHJldHVybiBpbXBsKCktPnNraXBJMTYoKTsKKyAgY2FzZSBUX0kzMjoKKyAgICByZXR1cm4gaW1wbCgpLT5za2lwSTMyKCk7CisgIGNhc2UgVF9JNjQ6CisgICAgcmV0dXJuIGltcGwoKS0+c2tpcEk2NCgpOworICBjYXNlIFRfRE9VQkxFOgorICAgIHJldHVybiBpbXBsKCktPnNraXBEb3VibGUoKTsKKworICBjYXNlIFRfU1RSSU5HOiB7CisgICAgcmV0dXJuIGltcGwoKS0+c2tpcFN0cmluZygpOworICB9CisKKyAgY2FzZSBUX0xJU1Q6CisgIGNhc2UgVF9TRVQ6IHsKKyAgICBUVHlwZSBldHlwZSA9IFRfU1RPUDsKKyAgICBpbnQzMl90IGxlbiA9IGltcGwoKS0+cmVhZExpc3RCZWdpbihldHlwZSk7CisgICAgaWYgKGxlbiA8IDApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgIGlmICghc2tpcChldHlwZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNhc2UgVF9NQVA6IHsKKyAgICBUVHlwZSBrdHlwZSA9IFRfU1RPUDsKKyAgICBUVHlwZSB2dHlwZSA9IFRfU1RPUDsKKyAgICBpbnQzMl90IGxlbiA9IGltcGwoKS0+cmVhZE1hcEJlZ2luKGt0eXBlLCB2dHlwZSk7CisgICAgaWYgKGxlbiA8IDApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgIGlmICghc2tpcChrdHlwZSkgfHwgIXNraXAodnR5cGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjYXNlIFRfU1RSVUNUOiB7CisgICAgZGV0YWlsOjpSZWFkU3RydWN0U2NvcGU8SW1wbD4gc2NvcGUgPSBkZXRhaWw6OnJlYWRTdHJ1Y3RTY29wZSh0aGlzKTsKKyAgICBpZiAoIXNjb3BlKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBUVHlwZSB0eXBlID0gVF9TVE9QOworICAgICAgaW50MTZfdCB0YWc7CisgICAgICBpZiAoIWltcGwoKS0+cmVhZEZpZWxkQmVnaW4odHlwZSwgdGFnKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAodHlwZSA9PSBUX1NUT1ApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBpZiAoIXNraXAodHlwZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNhc2UgVF9TVE9QOgorICBjYXNlIFRfVk9JRDoKKyAgY2FzZSBUX1VURjE2OgorICBjYXNlIFRfVVRGODoKKyAgY2FzZSBUX1U2NDoKKyAgZGVmYXVsdDoKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiVW5leHBlY3RlZCBUVHlwZSBmb3Igc2tpcDogJWQiLCB0eXBlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUmV0dXJucyBhIG5ldyByZWZlcmVuY2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK1B5T2JqZWN0KiBQcm90b2NvbEJhc2U8SW1wbD46OmRlY29kZVZhbHVlKFRUeXBlIHR5cGUsIFB5T2JqZWN0KiB0eXBlYXJncykgeworICBzd2l0Y2ggKHR5cGUpIHsKKworICBjYXNlIFRfQk9PTDogeworICAgIGJvb2wgdiA9IDA7CisgICAgaWYgKCFpbXBsKCktPnJlYWRCb29sKHYpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHYpIHsKKyAgICAgIFB5X1JFVFVSTl9UUlVFOworICAgIH0gZWxzZSB7CisgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgfQorICB9CisgIGNhc2UgVF9JMDg6IHsKKyAgICBpbnQ4X3QgdiA9IDA7CisgICAgaWYgKCFpbXBsKCktPnJlYWRJOCh2KSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2KTsKKyAgfQorICBjYXNlIFRfSTE2OiB7CisgICAgaW50MTZfdCB2ID0gMDsKKyAgICBpZiAoIWltcGwoKS0+cmVhZEkxNih2KSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2KTsKKyAgfQorICBjYXNlIFRfSTMyOiB7CisgICAgaW50MzJfdCB2ID0gMDsKKyAgICBpZiAoIWltcGwoKS0+cmVhZEkzMih2KSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2KTsKKyAgfQorCisgIGNhc2UgVF9JNjQ6IHsKKyAgICBpbnQ2NF90IHYgPSAwOworICAgIGlmICghaW1wbCgpLT5yZWFkSTY0KHYpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLy8gVE9ETyhkcmVpc3MpOiBGaW5kIG91dCBpZiB3ZSBjYW4gdGFrZSB0aGlzIGZhc3RwYXRoIGFsd2F5cyB3aGVuCisgICAgLy8gICAgICAgICAgICAgICBzaXplb2YobG9uZykgPT0gc2l6ZW9mKGxvbmcgbG9uZykuCisgICAgaWYgKENIRUNLX1JBTkdFKHYsIExPTkdfTUlOLCBMT05HX01BWCkpIHsKKyAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl2KTsKKyAgICB9CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcodik7CisgIH0KKworICBjYXNlIFRfRE9VQkxFOiB7CisgICAgZG91YmxlIHYgPSAwLjA7CisgICAgaWYgKCFpbXBsKCktPnJlYWREb3VibGUodikpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHYpOworICB9CisKKyAgY2FzZSBUX1NUUklORzogeworICAgIGNoYXIqIGJ1ZiA9IE5VTEw7CisgICAgaW50IGxlbiA9IGltcGwoKS0+cmVhZFN0cmluZygmYnVmKTsKKyAgICBpZiAobGVuIDwgMCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChpc1V0ZjgodHlwZWFyZ3MpKSB7CisgICAgICByZXR1cm4gUHlVbmljb2RlX0RlY29kZVVURjgoYnVmLCBsZW4sIDApOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIGxlbik7CisgICAgfQorICB9CisKKyAgY2FzZSBUX0xJU1Q6CisgIGNhc2UgVF9TRVQ6IHsKKyAgICBTZXRMaXN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKKyAgICBpZiAoIXBhcnNlX3NldF9saXN0X2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgVFR5cGUgZXR5cGUgPSBUX1NUT1A7CisgICAgaW50MzJfdCBsZW4gPSBpbXBsKCktPnJlYWRMaXN0QmVnaW4oZXR5cGUpOworICAgIGlmIChsZW4gPCAwKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGxlbiA+IDAgJiYgIWNoZWNrVHlwZShldHlwZSwgcGFyc2VkYXJncy5lbGVtZW50X3R5cGUpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBib29sIHVzZV90dXBsZSA9IHR5cGUgPT0gVF9MSVNUICYmIHBhcnNlZGFyZ3MuaW1tdXRhYmxlOworICAgIFNjb3BlZFB5T2JqZWN0IHJldCh1c2VfdHVwbGUgPyBQeVR1cGxlX05ldyhsZW4pIDogUHlMaXN0X05ldyhsZW4pKTsKKyAgICBpZiAoIXJldCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgUHlPYmplY3QqIGl0ZW0gPSBkZWNvZGVWYWx1ZShldHlwZSwgcGFyc2VkYXJncy50eXBlYXJncyk7CisgICAgICBpZiAoIWl0ZW0pIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBpZiAodXNlX3R1cGxlKSB7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmV0LmdldCgpLCBpLCBpdGVtKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFB5TGlzdF9TRVRfSVRFTShyZXQuZ2V0KCksIGksIGl0ZW0pOworICAgICAgfQorICAgIH0KKworICAgIC8vIFRPRE8oZHJlaXNzKTogQ29uc2lkZXIgYml0aW5nIHRoZSBidWxsZXQgYW5kIG1ha2luZyB0d28gc2VwYXJhdGUgY2FzZXMKKyAgICAvLyAgICAgICAgICAgICAgIGZvciBsaXN0IGFuZCBzZXQsIGF2b2lkaW5nIHRoaXMgcG9zdCBmYWN0byBjb252ZXJzaW9uLgorICAgIGlmICh0eXBlID09IFRfU0VUKSB7CisgICAgICBQeU9iamVjdCogc2V0cmV0OworICAgICAgc2V0cmV0ID0gcGFyc2VkYXJncy5pbW11dGFibGUgPyBQeUZyb3plblNldF9OZXcocmV0LmdldCgpKSA6IFB5U2V0X05ldyhyZXQuZ2V0KCkpOworICAgICAgcmV0dXJuIHNldHJldDsKKyAgICB9CisgICAgcmV0dXJuIHJldC5yZWxlYXNlKCk7CisgIH0KKworICBjYXNlIFRfTUFQOiB7CisgICAgTWFwVHlwZUFyZ3MgcGFyc2VkYXJnczsKKyAgICBpZiAoIXBhcnNlX21hcF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFRUeXBlIGt0eXBlID0gVF9TVE9QOworICAgIFRUeXBlIHZ0eXBlID0gVF9TVE9QOworICAgIHVpbnQzMl90IGxlbiA9IGltcGwoKS0+cmVhZE1hcEJlZ2luKGt0eXBlLCB2dHlwZSk7CisgICAgaWYgKGxlbiA+IDAgJiYgKCFjaGVja1R5cGUoa3R5cGUsIHBhcnNlZGFyZ3Mua3RhZykgfHwgIWNoZWNrVHlwZSh2dHlwZSwgcGFyc2VkYXJncy52dGFnKSkpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFNjb3BlZFB5T2JqZWN0IHJldChQeURpY3RfTmV3KCkpOworICAgIGlmICghcmV0KSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgIFNjb3BlZFB5T2JqZWN0IGsoZGVjb2RlVmFsdWUoa3R5cGUsIHBhcnNlZGFyZ3Mua3R5cGVhcmdzKSk7CisgICAgICBpZiAoIWspIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBTY29wZWRQeU9iamVjdCB2KGRlY29kZVZhbHVlKHZ0eXBlLCBwYXJzZWRhcmdzLnZ0eXBlYXJncykpOworICAgICAgaWYgKCF2KSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHJldC5nZXQoKSwgay5nZXQoKSwgdi5nZXQoKSkgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHBhcnNlZGFyZ3MuaW1tdXRhYmxlKSB7CisgICAgICBpZiAoIVRocmlmdE1vZHVsZSkgeworICAgICAgICBUaHJpZnRNb2R1bGUgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoInRocmlmdC5UaHJpZnQiKTsKKyAgICAgIH0KKyAgICAgIGlmICghVGhyaWZ0TW9kdWxlKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorCisgICAgICBTY29wZWRQeU9iamVjdCBjbHMoUHlPYmplY3RfR2V0QXR0cihUaHJpZnRNb2R1bGUsIElOVEVSTl9TVFJJTkcoVEZyb3plbkRpY3QpKSk7CisgICAgICBpZiAoIWNscykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKworICAgICAgU2NvcGVkUHlPYmplY3QgYXJnKFB5VHVwbGVfTmV3KDEpKTsKKyAgICAgIFB5VHVwbGVfU0VUX0lURU0oYXJnLmdldCgpLCAwLCByZXQucmVsZWFzZSgpKTsKKyAgICAgIHJldC5yZXNldChQeU9iamVjdF9DYWxsT2JqZWN0KGNscy5nZXQoKSwgYXJnLmdldCgpKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldC5yZWxlYXNlKCk7CisgIH0KKworICBjYXNlIFRfU1RSVUNUOiB7CisgICAgU3RydWN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKKyAgICBpZiAoIXBhcnNlX3N0cnVjdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcmVhZFN0cnVjdChQeV9Ob25lLCBwYXJzZWRhcmdzLmtsYXNzLCBwYXJzZWRhcmdzLnNwZWMpOworICB9CisKKyAgY2FzZSBUX1NUT1A6CisgIGNhc2UgVF9WT0lEOgorICBjYXNlIFRfVVRGMTY6CisgIGNhc2UgVF9VVEY4OgorICBjYXNlIFRfVTY0OgorICBkZWZhdWx0OgorICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJVbmV4cGVjdGVkIFRUeXBlIGZvciBkZWNvZGVWYWx1ZTogJWQiLCB0eXBlKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK1B5T2JqZWN0KiBQcm90b2NvbEJhc2U8SW1wbD46OnJlYWRTdHJ1Y3QoUHlPYmplY3QqIG91dHB1dCwgUHlPYmplY3QqIGtsYXNzLCBQeU9iamVjdCogc3BlY19zZXEpIHsKKyAgaW50IHNwZWNfc2VxX2xlbiA9IFB5VHVwbGVfU2l6ZShzcGVjX3NlcSk7CisgIGJvb2wgaW1tdXRhYmxlID0gb3V0cHV0ID09IFB5X05vbmU7CisgIFNjb3BlZFB5T2JqZWN0IGt3YXJnczsKKyAgaWYgKHNwZWNfc2VxX2xlbiA9PSAtMSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKGltbXV0YWJsZSkgeworICAgIGt3YXJncy5yZXNldChQeURpY3RfTmV3KCkpOworICAgIGlmICgha3dhcmdzKSB7CisgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZmFpbGVkIHRvIHByZXBhcmUga3dhcmd1bWVudCBzdG9yYWdlIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKworICBkZXRhaWw6OlJlYWRTdHJ1Y3RTY29wZTxJbXBsPiBzY29wZSA9IGRldGFpbDo6cmVhZFN0cnVjdFNjb3BlKHRoaXMpOworICBpZiAoIXNjb3BlKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgd2hpbGUgKHRydWUpIHsKKyAgICBUVHlwZSB0eXBlID0gVF9TVE9QOworICAgIGludDE2X3QgdGFnOworICAgIGlmICghaW1wbCgpLT5yZWFkRmllbGRCZWdpbih0eXBlLCB0YWcpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHR5cGUgPT0gVF9TVE9QKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHRhZyA8IDAgfHwgdGFnID49IHNwZWNfc2VxX2xlbikgeworICAgICAgaWYgKCFza2lwKHR5cGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFcnJvciB3aGlsZSBza2lwcGluZyB1bmtub3duIGZpZWxkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgUHlPYmplY3QqIGl0ZW1fc3BlYyA9IFB5VHVwbGVfR0VUX0lURU0oc3BlY19zZXEsIHRhZyk7CisgICAgaWYgKGl0ZW1fc3BlYyA9PSBQeV9Ob25lKSB7CisgICAgICBpZiAoIXNraXAodHlwZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkVycm9yIHdoaWxlIHNraXBwaW5nIHVua25vd24gZmllbGQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgU3RydWN0SXRlbVNwZWMgcGFyc2Vkc3BlYzsKKyAgICBpZiAoIXBhcnNlX3N0cnVjdF9pdGVtX3NwZWMoJnBhcnNlZHNwZWMsIGl0ZW1fc3BlYykpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAocGFyc2Vkc3BlYy50eXBlICE9IHR5cGUpIHsKKyAgICAgIGlmICghc2tpcCh0eXBlKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAic3RydWN0IGZpZWxkIGhhZCB3cm9uZyB0eXBlOiBleHBlY3RlZCAlZCBidXQgZ290ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIHBhcnNlZHNwZWMudHlwZSwgdHlwZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgU2NvcGVkUHlPYmplY3QgZmllbGR2YWwoZGVjb2RlVmFsdWUocGFyc2Vkc3BlYy50eXBlLCBwYXJzZWRzcGVjLnR5cGVhcmdzKSk7CisgICAgaWYgKCFmaWVsZHZhbCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKChpbW11dGFibGUgJiYgUHlEaWN0X1NldEl0ZW0oa3dhcmdzLmdldCgpLCBwYXJzZWRzcGVjLmF0dHJuYW1lLCBmaWVsZHZhbC5nZXQoKSkgPT0gLTEpCisgICAgICAgIHx8ICghaW1tdXRhYmxlICYmIFB5T2JqZWN0X1NldEF0dHIob3V0cHV0LCBwYXJzZWRzcGVjLmF0dHJuYW1lLCBmaWVsZHZhbC5nZXQoKSkgPT0gLTEpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKyAgaWYgKGltbXV0YWJsZSkgeworICAgIFNjb3BlZFB5T2JqZWN0IGFyZ3MoUHlUdXBsZV9OZXcoMCkpOworICAgIGlmICghYXJncykgeworICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImZhaWxlZCB0byBwcmVwYXJlIGFyZ3VtZW50IHN0b3JhZ2UiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlPYmplY3RfQ2FsbChrbGFzcywgYXJncy5nZXQoKSwga3dhcmdzLmdldCgpKTsKKyAgfQorICBQeV9JTkNSRUYob3V0cHV0KTsKKyAgcmV0dXJuIG91dHB1dDsKK30KK30KK30KK30KKyNlbmRpZiAvLyBUSFJJRlRfUFlfUFJPVE9DT0xfSApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvdHlwZXMuY3BwIGIvbGliL3B5L3NyYy9leHQvdHlwZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NDQzZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2V4dC90eXBlcy5jcHAKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImV4dC90eXBlcy5oIgorI2luY2x1ZGUgImV4dC9wcm90b2NvbC5oIgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHB5IHsKKworUHlPYmplY3QqIFRocmlmdE1vZHVsZSA9IE5VTEw7CisKKyNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworY2hhciByZWZpbGxfc2lnbmF0dXJlW10gPSB7J3MnLCAnIycsICdpJ307CisjZWxzZQorY29uc3QgY2hhciogcmVmaWxsX3NpZ25hdHVyZSA9ICJ5I2kiOworI2VuZGlmCisKK2Jvb2wgcGFyc2Vfc3RydWN0X2l0ZW1fc3BlYyhTdHJ1Y3RJdGVtU3BlYyogZGVzdCwgUHlPYmplY3QqIHNwZWNfdHVwbGUpIHsKKyAgLy8gaSdkIGxpa2UgdG8gdXNlIFBhcnNlQXJncyBoZXJlLCBidXQgaXQgc2VlbXMgdG8gYmUgYSBib3R0bGVuZWNrLgorICBpZiAoUHlUdXBsZV9TaXplKHNwZWNfdHVwbGUpICE9IDUpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIDUgYXJndW1lbnRzIGZvciBzcGVjIHR1cGxlIGJ1dCBnb3QgJWQiLAorICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KFB5VHVwbGVfU2l6ZShzcGVjX3R1cGxlKSkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPnRhZyA9IHN0YXRpY19jYXN0PFRUeXBlPihQeUludF9Bc0xvbmcoUHlUdXBsZV9HRVRfSVRFTShzcGVjX3R1cGxlLCAwKSkpOworICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+dGFnKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPnR5cGUgPSBzdGF0aWNfY2FzdDxUVHlwZT4oUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgMSkpKTsKKyAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPnR5cGUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZGVzdC0+YXR0cm5hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDIpOworICBkZXN0LT50eXBlYXJncyA9IFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgMyk7CisgIGRlc3QtPmRlZnZhbCA9IFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgNCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIHBhcnNlX3NldF9saXN0X2FyZ3MoU2V0TGlzdFR5cGVBcmdzKiBkZXN0LCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKKyAgaWYgKFB5VHVwbGVfU2l6ZSh0eXBlYXJncykgIT0gMykgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RpbmcgdHVwbGUgb2Ygc2l6ZSAzIGZvciBsaXN0L3NldCB0eXBlIGFyZ3MiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT5lbGVtZW50X3R5cGUgPSBzdGF0aWNfY2FzdDxUVHlwZT4oUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDApKSk7CisgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChkZXN0LT5lbGVtZW50X3R5cGUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZGVzdC0+dHlwZWFyZ3MgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAxKTsKKworICBkZXN0LT5pbW11dGFibGUgPSBQeV9UcnVlID09IFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDIpOworCisgIHJldHVybiB0cnVlOworfQorCitib29sIHBhcnNlX21hcF9hcmdzKE1hcFR5cGVBcmdzKiBkZXN0LCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKKyAgaWYgKFB5VHVwbGVfU2l6ZSh0eXBlYXJncykgIT0gNSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RpbmcgNSBhcmd1bWVudHMgZm9yIHR5cGVhcmdzIHRvIG1hcCIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPmt0YWcgPSBzdGF0aWNfY2FzdDxUVHlwZT4oUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDApKSk7CisgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChkZXN0LT5rdGFnKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPnZ0YWcgPSBzdGF0aWNfY2FzdDxUVHlwZT4oUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDIpKSk7CisgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChkZXN0LT52dGFnKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPmt0eXBlYXJncyA9IFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDEpOworICBkZXN0LT52dHlwZWFyZ3MgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAzKTsKKyAgZGVzdC0+aW1tdXRhYmxlID0gUHlfVHJ1ZSA9PSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCA0KTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBwYXJzZV9zdHJ1Y3RfYXJncyhTdHJ1Y3RUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKSB7CisgIGlmIChQeUxpc3RfU2l6ZSh0eXBlYXJncykgIT0gMikgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RpbmcgbGlzdCBvZiBzaXplIDIgZm9yIHN0cnVjdCBhcmdzIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZGVzdC0+a2xhc3MgPSBQeUxpc3RfR0VUX0lURU0odHlwZWFyZ3MsIDApOworICBkZXN0LT5zcGVjID0gUHlMaXN0X0dFVF9JVEVNKHR5cGVhcmdzLCAxKTsKKworICByZXR1cm4gdHJ1ZTsKK30KK30KK30KK30KZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvZXh0L3R5cGVzLmggYi9saWIvcHkvc3JjL2V4dC90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZDhkZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2V4dC90eXBlcy5oCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1BZX1RZUEVTX0gKKyNkZWZpbmUgVEhSSUZUX1BZX1RZUEVTX0gKKworI2luY2x1ZGUgPFB5dGhvbi5oPgorCisjaWZkZWYgX01TQ19WRVIKKyNkZWZpbmUgX19TVERDX0ZPUk1BVF9NQUNST1MKKyNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUworI2VuZGlmCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gVE9ETzogYmV0dGVyIG1hY3JvcworI2RlZmluZSBQeUludF9Bc0xvbmcodikgUHlMb25nX0FzTG9uZyh2KQorI2RlZmluZSBQeUludF9Gcm9tTG9uZyh2KSBQeUxvbmdfRnJvbUxvbmcodikKKworI2RlZmluZSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKHYpIFB5VW5pY29kZV9JbnRlcm5Gcm9tU3RyaW5nKHYpCisKKyNlbmRpZgorCisjZGVmaW5lIElOVEVSTl9TVFJJTkcodmFsdWUpIF9pbnRlcm5fIyN2YWx1ZQorCisjZGVmaW5lIElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHYpICgoKHYpID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorCitleHRlcm4gIkMiIHsKK2V4dGVybiBQeU9iamVjdCogSU5URVJOX1NUUklORyhURnJvemVuRGljdCk7CitleHRlcm4gUHlPYmplY3QqIElOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX2J1Zik7CitleHRlcm4gUHlPYmplY3QqIElOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX3JlZmlsbCk7Cit9CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHkgeworCitleHRlcm4gUHlPYmplY3QqIFRocmlmdE1vZHVsZTsKKworLy8gU3RvbGVuIG91dCBvZiBUUHJvdG9jb2wuaC4KKy8vIEl0IHdvdWxkIGJlIGEgaHVnZSBwYWluIHRvIGhhdmUgYm90aCBnZXQgdGhpcyBmcm9tIG9uZSBwbGFjZS4KK2VudW0gVFR5cGUgeworICBUX0lOVkFMSUQgPSAtMSwKKyAgVF9TVE9QID0gMCwKKyAgVF9WT0lEID0gMSwKKyAgVF9CT09MID0gMiwKKyAgVF9CWVRFID0gMywKKyAgVF9JMDggPSAzLAorICBUX0kxNiA9IDYsCisgIFRfSTMyID0gOCwKKyAgVF9VNjQgPSA5LAorICBUX0k2NCA9IDEwLAorICBUX0RPVUJMRSA9IDQsCisgIFRfU1RSSU5HID0gMTEsCisgIFRfVVRGNyA9IDExLAorICBUX1NUUlVDVCA9IDEyLAorICBUX01BUCA9IDEzLAorICBUX1NFVCA9IDE0LAorICBUX0xJU1QgPSAxNSwKKyAgVF9VVEY4ID0gMTYsCisgIFRfVVRGMTYgPSAxNworfTsKKworLy8gcmVwbGFjZSB3aXRoIHVuaXF1ZV9wdHIgd2hlbiB3ZSdyZSBPSyB3aXRoIEMrKzExCitjbGFzcyBTY29wZWRQeU9iamVjdCB7CitwdWJsaWM6CisgIFNjb3BlZFB5T2JqZWN0KCkgOiBvYmpfKE5VTEwpIHt9CisgIGV4cGxpY2l0IFNjb3BlZFB5T2JqZWN0KFB5T2JqZWN0KiBweV9vYmplY3QpIDogb2JqXyhweV9vYmplY3QpIHt9CisgIH5TY29wZWRQeU9iamVjdCgpIHsKKyAgICBpZiAob2JqXykKKyAgICAgIFB5X0RFQ1JFRihvYmpfKTsKKyAgfQorICBQeU9iamVjdCogZ2V0KCkgdGhyb3coKSB7IHJldHVybiBvYmpfOyB9CisgIG9wZXJhdG9yIGJvb2woKSB7IHJldHVybiBvYmpfOyB9CisgIHZvaWQgcmVzZXQoUHlPYmplY3QqIHB5X29iamVjdCkgdGhyb3coKSB7CisgICAgaWYgKG9ial8pCisgICAgICBQeV9ERUNSRUYob2JqXyk7CisgICAgb2JqXyA9IHB5X29iamVjdDsKKyAgfQorICBQeU9iamVjdCogcmVsZWFzZSgpIHRocm93KCkgeworICAgIFB5T2JqZWN0KiB0bXAgPSBvYmpfOworICAgIG9ial8gPSBOVUxMOworICAgIHJldHVybiB0bXA7CisgIH0KKyAgdm9pZCBzd2FwKFNjb3BlZFB5T2JqZWN0JiBvdGhlcikgdGhyb3coKSB7CisgICAgU2NvcGVkUHlPYmplY3QgdG1wKG90aGVyLnJlbGVhc2UoKSk7CisgICAgb3RoZXIucmVzZXQocmVsZWFzZSgpKTsKKyAgICByZXNldCh0bXAucmVsZWFzZSgpKTsKKyAgfQorCitwcml2YXRlOgorICBTY29wZWRQeU9iamVjdChjb25zdCBTY29wZWRQeU9iamVjdCYpIHt9CisgIFNjb3BlZFB5T2JqZWN0JiBvcGVyYXRvcj0oY29uc3QgU2NvcGVkUHlPYmplY3QmKSB7IHJldHVybiAqdGhpczsgfQorCisgIFB5T2JqZWN0KiBvYmpfOworfTsKKworLyoqCisgKiBBIGNhY2hlIG9mIHRoZSB0d28ga2V5IGF0dHJpYnV0ZXMgb2YgYSBDUmVhZGFibGVUcmFuc3BvcnQsCisgKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeU9iamVjdF9HZXRBdHRyLgorICovCitzdHJ1Y3QgRGVjb2RlQnVmZmVyIHsKKyAgU2NvcGVkUHlPYmplY3Qgc3RyaW5naW9idWY7CisgIFNjb3BlZFB5T2JqZWN0IHJlZmlsbF9jYWxsYWJsZTsKK307CisKKyNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworZXh0ZXJuIGNoYXIgcmVmaWxsX3NpZ25hdHVyZVszXTsKK3R5cGVkZWYgUHlPYmplY3QgRW5jb2RlQnVmZmVyOworI2Vsc2UKK2V4dGVybiBjb25zdCBjaGFyKiByZWZpbGxfc2lnbmF0dXJlOworc3RydWN0IEVuY29kZUJ1ZmZlciB7CisgIHN0ZDo6dmVjdG9yPGNoYXI+IGJ1ZjsKKyAgc2l6ZV90IHBvczsKK307CisjZW5kaWYKKworLyoqCisgKiBBIGNhY2hlIG9mIHRoZSBzcGVjX2FyZ3MgZm9yIGEgc2V0IG9yIGxpc3QsCisgKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeVR1cGxlX0dFVF9JVEVNLgorICovCitzdHJ1Y3QgU2V0TGlzdFR5cGVBcmdzIHsKKyAgVFR5cGUgZWxlbWVudF90eXBlOworICBQeU9iamVjdCogdHlwZWFyZ3M7CisgIGJvb2wgaW1tdXRhYmxlOworfTsKKworLyoqCisgKiBBIGNhY2hlIG9mIHRoZSBzcGVjX2FyZ3MgZm9yIGEgbWFwLAorICogc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNhbGxpbmcgUHlUdXBsZV9HRVRfSVRFTS4KKyAqLworc3RydWN0IE1hcFR5cGVBcmdzIHsKKyAgVFR5cGUga3RhZzsKKyAgVFR5cGUgdnRhZzsKKyAgUHlPYmplY3QqIGt0eXBlYXJnczsKKyAgUHlPYmplY3QqIHZ0eXBlYXJnczsKKyAgYm9vbCBpbW11dGFibGU7Cit9OworCisvKioKKyAqIEEgY2FjaGUgb2YgdGhlIHNwZWNfYXJncyBmb3IgYSBzdHJ1Y3QsCisgKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeVR1cGxlX0dFVF9JVEVNLgorICovCitzdHJ1Y3QgU3RydWN0VHlwZUFyZ3MgeworICBQeU9iamVjdCoga2xhc3M7CisgIFB5T2JqZWN0KiBzcGVjOworICBib29sIGltbXV0YWJsZTsKK307CisKKy8qKgorICogQSBjYWNoZSBvZiB0aGUgaXRlbSBzcGVjIGZyb20gYSBzdHJ1Y3Qgc3BlY2lmaWNhdGlvbiwKKyAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCisgKi8KK3N0cnVjdCBTdHJ1Y3RJdGVtU3BlYyB7CisgIGludCB0YWc7CisgIFRUeXBlIHR5cGU7CisgIFB5T2JqZWN0KiBhdHRybmFtZTsKKyAgUHlPYmplY3QqIHR5cGVhcmdzOworICBQeU9iamVjdCogZGVmdmFsOworfTsKKworYm9vbCBwYXJzZV9zZXRfbGlzdF9hcmdzKFNldExpc3RUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKTsKKworYm9vbCBwYXJzZV9tYXBfYXJncyhNYXBUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKTsKKworYm9vbCBwYXJzZV9zdHJ1Y3RfYXJncyhTdHJ1Y3RUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKTsKKworYm9vbCBwYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjKFN0cnVjdEl0ZW1TcGVjKiBkZXN0LCBQeU9iamVjdCogc3BlY190dXBsZSk7Cit9Cit9Cit9CisKKyNlbmRpZiAvLyBUSFJJRlRfUFlfVFlQRVNfSApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9UQmFzZS5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEJhc2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFlMWIxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEJhc2UucHkKQEAgLTAsMCArMSw4MiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorCisKK2NsYXNzIFRCYXNlKG9iamVjdCk6CisgICAgX19zbG90c19fID0gKCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgTCA9IFsnJXM9JXInICUgKGtleSwgZ2V0YXR0cihzZWxmLCBrZXkpKSBmb3Iga2V5IGluIHNlbGYuX19zbG90c19fXQorICAgICAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGZvciBhdHRyIGluIHNlbGYuX19zbG90c19fOgorICAgICAgICAgICAgbXlfdmFsID0gZ2V0YXR0cihzZWxmLCBhdHRyKQorICAgICAgICAgICAgb3RoZXJfdmFsID0gZ2V0YXR0cihvdGhlciwgYXR0cikKKyAgICAgICAgICAgIGlmIG15X3ZhbCAhPSBvdGhlcl92YWw6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKworICAgIGRlZiByZWFkKHNlbGYsIGlwcm90KToKKyAgICAgICAgaWYgKGlwcm90Ll9mYXN0X2RlY29kZSBpcyBub3QgTm9uZSBhbmQKKyAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kCisgICAgICAgICAgICAgICAgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSk6CisgICAgICAgICAgICBpcHJvdC5fZmFzdF9kZWNvZGUoc2VsZiwgaXByb3QsIFtzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlY10pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpcHJvdC5yZWFkU3RydWN0KHNlbGYsIHNlbGYudGhyaWZ0X3NwZWMpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOgorICAgICAgICBpZiAob3Byb3QuX2Zhc3RfZW5jb2RlIGlzIG5vdCBOb25lIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lKToKKyAgICAgICAgICAgIG9wcm90LnRyYW5zLndyaXRlKAorICAgICAgICAgICAgICAgIG9wcm90Ll9mYXN0X2VuY29kZShzZWxmLCBbc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWNdKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9wcm90LndyaXRlU3RydWN0KHNlbGYsIHNlbGYudGhyaWZ0X3NwZWMpCisKKworY2xhc3MgVEV4Y2VwdGlvbkJhc2UoVEJhc2UsIEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2NsYXNzIFRGcm96ZW5CYXNlKFRCYXNlKToKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbid0IG1vZGlmeSBmcm96ZW4gc3RydWN0IikKKworICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiQ2FuJ3QgbW9kaWZ5IGZyb3plbiBzdHJ1Y3QiKQorCisgICAgZGVmIF9faGFzaF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5fX2NsYXNzX18pIF4gaGFzaChzZWxmLl9fc2xvdHNfXykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiByZWFkKGNscywgaXByb3QpOgorICAgICAgICBpZiAoaXByb3QuX2Zhc3RfZGVjb2RlIGlzIG5vdCBOb25lIGFuZAorICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQKKyAgICAgICAgICAgICAgICBjbHMudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUpOgorICAgICAgICAgICAgc2VsZiA9IGNscygpCisgICAgICAgICAgICByZXR1cm4gaXByb3QuX2Zhc3RfZGVjb2RlKE5vbmUsIGlwcm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWNdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGlwcm90LnJlYWRTdHJ1Y3QoY2xzLCBjbHMudGhyaWZ0X3NwZWMsIFRydWUpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnB5CmluZGV4IDUwYzZhYTguLmY2YmU3NzIgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnB5CisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnB5CkBAIC0xNywyNDMgKzE3LDI4NSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSBUUHJvdG9jb2wgaW1wb3J0ICoKK2Zyb20gLlRQcm90b2NvbCBpbXBvcnQgVFR5cGUsIFRQcm90b2NvbEJhc2UsIFRQcm90b2NvbEV4Y2VwdGlvbgogZnJvbSBzdHJ1Y3QgaW1wb3J0IHBhY2ssIHVucGFjawogCisKIGNsYXNzIFRCaW5hcnlQcm90b2NvbChUUHJvdG9jb2xCYXNlKToKKyAgICAiIiJCaW5hcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBwcm90b2NvbCBkcml2ZXIuIiIiCiAKLSAgIiIiQmluYXJ5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wgZHJpdmVyLiIiIgorICAgICMgTmFzdHlIYXh4LiBQeXRob24gMi40KyBvbiAzMi1iaXQgbWFjaGluZXMgZm9yY2VzIGhleCBjb25zdGFudHMgdG8gYmUKKyAgICAjIHBvc2l0aXZlLCBjb252ZXJ0aW5nIHRoaXMgaW50byBhIGxvbmcuIElmIHdlIGhhcmRjb2RlIHRoZSBpbnQgdmFsdWUKKyAgICAjIGluc3RlYWQgaXQnbGwgc3RheSBpbiAzMiBiaXQtbGFuZC4KIAotICAjIE5hc3R5SGF4eC4gUHl0aG9uIDIuNCsgb24gMzItYml0IG1hY2hpbmVzIGZvcmNlcyBoZXggY29uc3RhbnRzIHRvIGJlCi0gICMgcG9zaXRpdmUsIGNvbnZlcnRpbmcgdGhpcyBpbnRvIGEgbG9uZy4gSWYgd2UgaGFyZGNvZGUgdGhlIGludCB2YWx1ZQotICAjIGluc3RlYWQgaXQnbGwgc3RheSBpbiAzMiBiaXQtbGFuZC4KKyAgICAjIFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDAKKyAgICBWRVJTSU9OX01BU0sgPSAtNjU1MzYKIAotICAjIFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDAKLSAgVkVSU0lPTl9NQVNLID0gLTY1NTM2CisgICAgIyBWRVJTSU9OXzEgPSAweDgwMDEwMDAwCisgICAgVkVSU0lPTl8xID0gLTIxNDc0MTgxMTIKIAotICAjIFZFUlNJT05fMSA9IDB4ODAwMTAwMDAKLSAgVkVSU0lPTl8xID0gLTIxNDc0MTgxMTIKKyAgICBUWVBFX01BU0sgPSAweDAwMDAwMGZmCiAKLSAgVFlQRV9NQVNLID0gMHgwMDAwMDBmZgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucywgc3RyaWN0UmVhZD1GYWxzZSwgc3RyaWN0V3JpdGU9VHJ1ZSwgKiprd2FyZ3MpOgorICAgICAgICBUUHJvdG9jb2xCYXNlLl9faW5pdF9fKHNlbGYsIHRyYW5zKQorICAgICAgICBzZWxmLnN0cmljdFJlYWQgPSBzdHJpY3RSZWFkCisgICAgICAgIHNlbGYuc3RyaWN0V3JpdGUgPSBzdHJpY3RXcml0ZQorICAgICAgICBzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQgPSBrd2FyZ3MuZ2V0KCdzdHJpbmdfbGVuZ3RoX2xpbWl0JywgTm9uZSkKKyAgICAgICAgc2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0ID0ga3dhcmdzLmdldCgnY29udGFpbmVyX2xlbmd0aF9saW1pdCcsIE5vbmUpCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zLCBzdHJpY3RSZWFkPUZhbHNlLCBzdHJpY3RXcml0ZT1UcnVlKToKLSAgICBUUHJvdG9jb2xCYXNlLl9faW5pdF9fKHNlbGYsIHRyYW5zKQotICAgIHNlbGYuc3RyaWN0UmVhZCA9IHN0cmljdFJlYWQKLSAgICBzZWxmLnN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGUKKyAgICBkZWYgX2NoZWNrX3N0cmluZ19sZW5ndGgoc2VsZiwgbGVuZ3RoKToKKyAgICAgICAgc2VsZi5fY2hlY2tfbGVuZ3RoKHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCwgbGVuZ3RoKQogCi0gIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBzZXFpZCk6Ci0gICAgaWYgc2VsZi5zdHJpY3RXcml0ZToKLSAgICAgIHNlbGYud3JpdGVJMzIoVEJpbmFyeVByb3RvY29sLlZFUlNJT05fMSB8IHR5cGUpCi0gICAgICBzZWxmLndyaXRlU3RyaW5nKG5hbWUpCi0gICAgICBzZWxmLndyaXRlSTMyKHNlcWlkKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLndyaXRlU3RyaW5nKG5hbWUpCi0gICAgICBzZWxmLndyaXRlQnl0ZSh0eXBlKQotICAgICAgc2VsZi53cml0ZUkzMihzZXFpZCkKKyAgICBkZWYgX2NoZWNrX2NvbnRhaW5lcl9sZW5ndGgoc2VsZiwgbGVuZ3RoKToKKyAgICAgICAgc2VsZi5fY2hlY2tfbGVuZ3RoKHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCwgbGVuZ3RoKQogCi0gIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBzZXFpZCk6CisgICAgICAgIGlmIHNlbGYuc3RyaWN0V3JpdGU6CisgICAgICAgICAgICBzZWxmLndyaXRlSTMyKFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OXzEgfCB0eXBlKQorICAgICAgICAgICAgc2VsZi53cml0ZVN0cmluZyhuYW1lKQorICAgICAgICAgICAgc2VsZi53cml0ZUkzMihzZXFpZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYud3JpdGVTdHJpbmcobmFtZSkKKyAgICAgICAgICAgIHNlbGYud3JpdGVCeXRlKHR5cGUpCisgICAgICAgICAgICBzZWxmLndyaXRlSTMyKHNlcWlkKQogCi0gIGRlZiB3cml0ZVN0cnVjdEJlZ2luKHNlbGYsIG5hbWUpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUZpZWxkQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgaWQpOgotICAgIHNlbGYud3JpdGVCeXRlKHR5cGUpCi0gICAgc2VsZi53cml0ZUkxNihpZCkKKyAgICBkZWYgd3JpdGVTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBpZCk6CisgICAgICAgIHNlbGYud3JpdGVCeXRlKHR5cGUpCisgICAgICAgIHNlbGYud3JpdGVJMTYoaWQpCiAKLSAgZGVmIHdyaXRlRmllbGRTdG9wKHNlbGYpOgotICAgIHNlbGYud3JpdGVCeXRlKFRUeXBlLlNUT1ApOworICAgIGRlZiB3cml0ZUZpZWxkRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlTWFwQmVnaW4oc2VsZiwga3R5cGUsIHZ0eXBlLCBzaXplKToKLSAgICBzZWxmLndyaXRlQnl0ZShrdHlwZSkKLSAgICBzZWxmLndyaXRlQnl0ZSh2dHlwZSkKLSAgICBzZWxmLndyaXRlSTMyKHNpemUpCisgICAgZGVmIHdyaXRlRmllbGRTdG9wKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlQnl0ZShUVHlwZS5TVE9QKQogCi0gIGRlZiB3cml0ZU1hcEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlTWFwQmVnaW4oc2VsZiwga3R5cGUsIHZ0eXBlLCBzaXplKToKKyAgICAgICAgc2VsZi53cml0ZUJ5dGUoa3R5cGUpCisgICAgICAgIHNlbGYud3JpdGVCeXRlKHZ0eXBlKQorICAgICAgICBzZWxmLndyaXRlSTMyKHNpemUpCiAKLSAgZGVmIHdyaXRlTGlzdEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKLSAgICBzZWxmLndyaXRlQnl0ZShldHlwZSkKLSAgICBzZWxmLndyaXRlSTMyKHNpemUpCisgICAgZGVmIHdyaXRlTWFwRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlTGlzdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlTGlzdEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgc2VsZi53cml0ZUJ5dGUoZXR5cGUpCisgICAgICAgIHNlbGYud3JpdGVJMzIoc2l6ZSkKIAotICBkZWYgd3JpdGVTZXRCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6Ci0gICAgc2VsZi53cml0ZUJ5dGUoZXR5cGUpCi0gICAgc2VsZi53cml0ZUkzMihzaXplKQorICAgIGRlZiB3cml0ZUxpc3RFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVTZXRFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZVNldEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgc2VsZi53cml0ZUJ5dGUoZXR5cGUpCisgICAgICAgIHNlbGYud3JpdGVJMzIoc2l6ZSkKIAotICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2wpOgotICAgIGlmIGJvb2w6Ci0gICAgICBzZWxmLndyaXRlQnl0ZSgxKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLndyaXRlQnl0ZSgwKQorICAgIGRlZiB3cml0ZVNldEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6Ci0gICAgYnVmZiA9IHBhY2soIiFiIiwgYnl0ZSkKLSAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCisgICAgZGVmIHdyaXRlQm9vbChzZWxmLCBib29sKToKKyAgICAgICAgaWYgYm9vbDoKKyAgICAgICAgICAgIHNlbGYud3JpdGVCeXRlKDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndyaXRlQnl0ZSgwKQogCi0gIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgotICAgIGJ1ZmYgPSBwYWNrKCIhaCIsIGkxNikKLSAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCisgICAgZGVmIHdyaXRlQnl0ZShzZWxmLCBieXRlKToKKyAgICAgICAgYnVmZiA9IHBhY2soIiFiIiwgYnl0ZSkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShidWZmKQogCi0gIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgotICAgIGJ1ZmYgPSBwYWNrKCIhaSIsIGkzMikKLSAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCisgICAgZGVmIHdyaXRlSTE2KHNlbGYsIGkxNik6CisgICAgICAgIGJ1ZmYgPSBwYWNrKCIhaCIsIGkxNikKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShidWZmKQogCi0gIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgotICAgIGJ1ZmYgPSBwYWNrKCIhcSIsIGk2NCkKLSAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCisgICAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6CisgICAgICAgIGJ1ZmYgPSBwYWNrKCIhaSIsIGkzMikKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShidWZmKQogCi0gIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkdWIpOgotICAgIGJ1ZmYgPSBwYWNrKCIhZCIsIGR1YikKLSAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCisgICAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6CisgICAgICAgIGJ1ZmYgPSBwYWNrKCIhcSIsIGk2NCkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShidWZmKQogCi0gIGRlZiB3cml0ZVN0cmluZyhzZWxmLCBzdHIpOgotICAgIHNlbGYud3JpdGVJMzIobGVuKHN0cikpCi0gICAgc2VsZi50cmFucy53cml0ZShzdHIpCisgICAgZGVmIHdyaXRlRG91YmxlKHNlbGYsIGR1Yik6CisgICAgICAgIGJ1ZmYgPSBwYWNrKCIhZCIsIGR1YikKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShidWZmKQogCi0gIGRlZiByZWFkTWVzc2FnZUJlZ2luKHNlbGYpOgotICAgIHN6ID0gc2VsZi5yZWFkSTMyKCkKLSAgICBpZiBzeiA8IDA6Ci0gICAgICB2ZXJzaW9uID0gc3ogJiBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl9NQVNLCi0gICAgICBpZiB2ZXJzaW9uICE9IFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OXzE6Ci0gICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwgbWVzc2FnZT0nQmFkIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbjogJWQnICUgKHN6KSkKLSAgICAgIHR5cGUgPSBzeiAmIFRCaW5hcnlQcm90b2NvbC5UWVBFX01BU0sKLSAgICAgIG5hbWUgPSBzZWxmLnJlYWRTdHJpbmcoKQotICAgICAgc2VxaWQgPSBzZWxmLnJlYWRJMzIoKQotICAgIGVsc2U6Ci0gICAgICBpZiBzZWxmLnN0cmljdFJlYWQ6Ci0gICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwgbWVzc2FnZT0nTm8gcHJvdG9jb2wgdmVyc2lvbiBoZWFkZXInKQotICAgICAgbmFtZSA9IHNlbGYudHJhbnMucmVhZEFsbChzeikKLSAgICAgIHR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKLSAgICAgIHNlcWlkID0gc2VsZi5yZWFkSTMyKCkKLSAgICByZXR1cm4gKG5hbWUsIHR5cGUsIHNlcWlkKQorICAgIGRlZiB3cml0ZUJpbmFyeShzZWxmLCBzdHIpOgorICAgICAgICBzZWxmLndyaXRlSTMyKGxlbihzdHIpKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKHN0cikKIAotICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTWVzc2FnZUJlZ2luKHNlbGYpOgorICAgICAgICBzeiA9IHNlbGYucmVhZEkzMigpCisgICAgICAgIGlmIHN6IDwgMDoKKyAgICAgICAgICAgIHZlcnNpb24gPSBzeiAmIFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OX01BU0sKKyAgICAgICAgICAgIGlmIHZlcnNpb24gIT0gVEJpbmFyeVByb3RvY29sLlZFUlNJT05fMToKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIHR5cGU9VFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdCYWQgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luOiAlZCcgJSAoc3opKQorICAgICAgICAgICAgdHlwZSA9IHN6ICYgVEJpbmFyeVByb3RvY29sLlRZUEVfTUFTSworICAgICAgICAgICAgbmFtZSA9IHNlbGYucmVhZFN0cmluZygpCisgICAgICAgICAgICBzZXFpZCA9IHNlbGYucmVhZEkzMigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzZWxmLnN0cmljdFJlYWQ6CisgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKHR5cGU9VFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdObyBwcm90b2NvbCB2ZXJzaW9uIGhlYWRlcicpCisgICAgICAgICAgICBuYW1lID0gc2VsZi50cmFucy5yZWFkQWxsKHN6KQorICAgICAgICAgICAgdHlwZSA9IHNlbGYucmVhZEJ5dGUoKQorICAgICAgICAgICAgc2VxaWQgPSBzZWxmLnJlYWRJMzIoKQorICAgICAgICByZXR1cm4gKG5hbWUsIHR5cGUsIHNlcWlkKQogCi0gIGRlZiByZWFkU3RydWN0QmVnaW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRGaWVsZEJlZ2luKHNlbGYpOgotICAgIHR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKLSAgICBpZiB0eXBlID09IFRUeXBlLlNUT1A6Ci0gICAgICByZXR1cm4gKE5vbmUsIHR5cGUsIDApCi0gICAgaWQgPSBzZWxmLnJlYWRJMTYoKQotICAgIHJldHVybiAoTm9uZSwgdHlwZSwgaWQpCisgICAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEZpZWxkRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6CisgICAgICAgIHR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgaWYgdHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICAgICAgcmV0dXJuIChOb25lLCB0eXBlLCAwKQorICAgICAgICBpZCA9IHNlbGYucmVhZEkxNigpCisgICAgICAgIHJldHVybiAoTm9uZSwgdHlwZSwgaWQpCiAKLSAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKLSAgICBrdHlwZSA9IHNlbGYucmVhZEJ5dGUoKQotICAgIHZ0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCi0gICAgc2l6ZSA9IHNlbGYucmVhZEkzMigpCi0gICAgcmV0dXJuIChrdHlwZSwgdnR5cGUsIHNpemUpCisgICAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkTWFwRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZE1hcEJlZ2luKHNlbGYpOgorICAgICAgICBrdHlwZSA9IHNlbGYucmVhZEJ5dGUoKQorICAgICAgICB2dHlwZSA9IHNlbGYucmVhZEJ5dGUoKQorICAgICAgICBzaXplID0gc2VsZi5yZWFkSTMyKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfY29udGFpbmVyX2xlbmd0aChzaXplKQorICAgICAgICByZXR1cm4gKGt0eXBlLCB2dHlwZSwgc2l6ZSkKIAotICBkZWYgcmVhZExpc3RCZWdpbihzZWxmKToKLSAgICBldHlwZSA9IHNlbGYucmVhZEJ5dGUoKQotICAgIHNpemUgPSBzZWxmLnJlYWRJMzIoKQotICAgIHJldHVybiAoZXR5cGUsIHNpemUpCisgICAgZGVmIHJlYWRNYXBFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZExpc3RFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTGlzdEJlZ2luKHNlbGYpOgorICAgICAgICBldHlwZSA9IHNlbGYucmVhZEJ5dGUoKQorICAgICAgICBzaXplID0gc2VsZi5yZWFkSTMyKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfY29udGFpbmVyX2xlbmd0aChzaXplKQorICAgICAgICByZXR1cm4gKGV0eXBlLCBzaXplKQogCi0gIGRlZiByZWFkU2V0QmVnaW4oc2VsZik6Ci0gICAgZXR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKLSAgICBzaXplID0gc2VsZi5yZWFkSTMyKCkKLSAgICByZXR1cm4gKGV0eXBlLCBzaXplKQorICAgIGRlZiByZWFkTGlzdEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkU2V0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZFNldEJlZ2luKHNlbGYpOgorICAgICAgICBldHlwZSA9IHNlbGYucmVhZEJ5dGUoKQorICAgICAgICBzaXplID0gc2VsZi5yZWFkSTMyKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfY29udGFpbmVyX2xlbmd0aChzaXplKQorICAgICAgICByZXR1cm4gKGV0eXBlLCBzaXplKQogCi0gIGRlZiByZWFkQm9vbChzZWxmKToKLSAgICBieXRlID0gc2VsZi5yZWFkQnl0ZSgpCi0gICAgaWYgYnl0ZSA9PSAwOgotICAgICAgcmV0dXJuIEZhbHNlCi0gICAgcmV0dXJuIFRydWUKKyAgICBkZWYgcmVhZFNldEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkQnl0ZShzZWxmKToKLSAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDEpCi0gICAgdmFsLCA9IHVucGFjaygnIWInLCBidWZmKQotICAgIHJldHVybiB2YWwKKyAgICBkZWYgcmVhZEJvb2woc2VsZik6CisgICAgICAgIGJ5dGUgPSBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgaWYgYnl0ZSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCiAKLSAgZGVmIHJlYWRJMTYoc2VsZik6Ci0gICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCgyKQotICAgIHZhbCwgPSB1bnBhY2soJyFoJywgYnVmZikKLSAgICByZXR1cm4gdmFsCisgICAgZGVmIHJlYWRCeXRlKHNlbGYpOgorICAgICAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDEpCisgICAgICAgIHZhbCwgPSB1bnBhY2soJyFiJywgYnVmZikKKyAgICAgICAgcmV0dXJuIHZhbAogCi0gIGRlZiByZWFkSTMyKHNlbGYpOgotICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoNCkKLSAgICB2YWwsID0gdW5wYWNrKCchaScsIGJ1ZmYpCi0gICAgcmV0dXJuIHZhbAorICAgIGRlZiByZWFkSTE2KHNlbGYpOgorICAgICAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDIpCisgICAgICAgIHZhbCwgPSB1bnBhY2soJyFoJywgYnVmZikKKyAgICAgICAgcmV0dXJuIHZhbAogCi0gIGRlZiByZWFkSTY0KHNlbGYpOgotICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoOCkKLSAgICB2YWwsID0gdW5wYWNrKCchcScsIGJ1ZmYpCi0gICAgcmV0dXJuIHZhbAorICAgIGRlZiByZWFkSTMyKHNlbGYpOgorICAgICAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDQpCisgICAgICAgIHZhbCwgPSB1bnBhY2soJyFpJywgYnVmZikKKyAgICAgICAgcmV0dXJuIHZhbAogCi0gIGRlZiByZWFkRG91YmxlKHNlbGYpOgotICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoOCkKLSAgICB2YWwsID0gdW5wYWNrKCchZCcsIGJ1ZmYpCi0gICAgcmV0dXJuIHZhbAorICAgIGRlZiByZWFkSTY0KHNlbGYpOgorICAgICAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDgpCisgICAgICAgIHZhbCwgPSB1bnBhY2soJyFxJywgYnVmZikKKyAgICAgICAgcmV0dXJuIHZhbAogCi0gIGRlZiByZWFkU3RyaW5nKHNlbGYpOgotICAgIGxlbiA9IHNlbGYucmVhZEkzMigpCi0gICAgc3RyID0gc2VsZi50cmFucy5yZWFkQWxsKGxlbikKLSAgICByZXR1cm4gc3RyCisgICAgZGVmIHJlYWREb3VibGUoc2VsZik6CisgICAgICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoOCkKKyAgICAgICAgdmFsLCA9IHVucGFjaygnIWQnLCBidWZmKQorICAgICAgICByZXR1cm4gdmFsCisKKyAgICBkZWYgcmVhZEJpbmFyeShzZWxmKToKKyAgICAgICAgc2l6ZSA9IHNlbGYucmVhZEkzMigpCisgICAgICAgIHNlbGYuX2NoZWNrX3N0cmluZ19sZW5ndGgoc2l6ZSkKKyAgICAgICAgcyA9IHNlbGYudHJhbnMucmVhZEFsbChzaXplKQorICAgICAgICByZXR1cm4gcwogCiAKLWNsYXNzIFRCaW5hcnlQcm90b2NvbEZhY3Rvcnk6Ci0gIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJpY3RSZWFkPUZhbHNlLCBzdHJpY3RXcml0ZT1UcnVlKToKLSAgICBzZWxmLnN0cmljdFJlYWQgPSBzdHJpY3RSZWFkCi0gICAgc2VsZi5zdHJpY3RXcml0ZSA9IHN0cmljdFdyaXRlCitjbGFzcyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmljdFJlYWQ9RmFsc2UsIHN0cmljdFdyaXRlPVRydWUsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5zdHJpY3RSZWFkID0gc3RyaWN0UmVhZAorICAgICAgICBzZWxmLnN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGUKKyAgICAgICAgc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0ID0ga3dhcmdzLmdldCgnc3RyaW5nX2xlbmd0aF9saW1pdCcsIE5vbmUpCisgICAgICAgIHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCA9IGt3YXJncy5nZXQoJ2NvbnRhaW5lcl9sZW5ndGhfbGltaXQnLCBOb25lKQogCi0gIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6Ci0gICAgcHJvdCA9IFRCaW5hcnlQcm90b2NvbCh0cmFucywgc2VsZi5zdHJpY3RSZWFkLCBzZWxmLnN0cmljdFdyaXRlKQotICAgIHJldHVybiBwcm90CisgICAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcHJvdCA9IFRCaW5hcnlQcm90b2NvbCh0cmFucywgc2VsZi5zdHJpY3RSZWFkLCBzZWxmLnN0cmljdFdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19sZW5ndGhfbGltaXQ9c2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQ9c2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0KQorICAgICAgICByZXR1cm4gcHJvdAogCiAKIGNsYXNzIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKFRCaW5hcnlQcm90b2NvbCk6CisgICAgIiIiQy1BY2NlbGVyYXRlZCB2ZXJzaW9uIG9mIFRCaW5hcnlQcm90b2NvbC4KIAotICAiIiJDLUFjY2VsZXJhdGVkIHZlcnNpb24gb2YgVEJpbmFyeVByb3RvY29sLgorICAgIFRoaXMgY2xhc3MgZG9lcyBub3Qgb3ZlcnJpZGUgYW55IG9mIFRCaW5hcnlQcm90b2NvbCdzIG1ldGhvZHMsCisgICAgYnV0IHRoZSBnZW5lcmF0ZWQgY29kZSByZWNvZ25pemVzIGl0IGRpcmVjdGx5IGFuZCB3aWxsIGNhbGwgaW50bworICAgIG91ciBDIG1vZHVsZSB0byBkbyB0aGUgZW5jb2RpbmcsIGJ5cGFzc2luZyB0aGlzIG9iamVjdCBlbnRpcmVseS4KKyAgICBXZSBpbmhlcml0IGZyb20gVEJpbmFyeVByb3RvY29sIHNvIHRoYXQgdGhlIG5vcm1hbCBUQmluYXJ5UHJvdG9jb2wKKyAgICBlbmNvZGluZyBjYW4gaGFwcGVuIGlmIHRoZSBmYXN0YmluYXJ5IG1vZHVsZSBkb2Vzbid0IHdvcmsgZm9yIHNvbWUKKyAgICByZWFzb24uICAoVE9ETyhkcmVpc3MpOiBNYWtlIHRoaXMgaGFwcGVuIHNhbmVseSBpbiBtb3JlIGNhc2VzLikKKyAgICBUbyBkaXNhYmxlIHRoaXMgYmVoYXZpb3IsIHBhc3MgZmFsbGJhY2s9RmFsc2UgY29uc3RydWN0b3IgYXJndW1lbnQuCiAKLSAgVGhpcyBjbGFzcyBkb2VzIG5vdCBvdmVycmlkZSBhbnkgb2YgVEJpbmFyeVByb3RvY29sJ3MgbWV0aG9kcywKLSAgYnV0IHRoZSBnZW5lcmF0ZWQgY29kZSByZWNvZ25pemVzIGl0IGRpcmVjdGx5IGFuZCB3aWxsIGNhbGwgaW50bwotICBvdXIgQyBtb2R1bGUgdG8gZG8gdGhlIGVuY29kaW5nLCBieXBhc3NpbmcgdGhpcyBvYmplY3QgZW50aXJlbHkuCi0gIFdlIGluaGVyaXQgZnJvbSBUQmluYXJ5UHJvdG9jb2wgc28gdGhhdCB0aGUgbm9ybWFsIFRCaW5hcnlQcm90b2NvbAotICBlbmNvZGluZyBjYW4gaGFwcGVuIGlmIHRoZSBmYXN0YmluYXJ5IG1vZHVsZSBkb2Vzbid0IHdvcmsgZm9yIHNvbWUKLSAgcmVhc29uLiAgKFRPRE8oZHJlaXNzKTogTWFrZSB0aGlzIGhhcHBlbiBzYW5lbHkgaW4gbW9yZSBjYXNlcy4pCisgICAgSW4gb3JkZXIgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIEMgbW9kdWxlLCBqdXN0IHVzZQorICAgIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGluc3RlYWQgb2YgVEJpbmFyeVByb3RvY29sLgogCi0gIEluIG9yZGVyIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBDIG1vZHVsZSwganVzdCB1c2UKLSAgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgaW5zdGVhZCBvZiBUQmluYXJ5UHJvdG9jb2wuCisgICAgTk9URTogIFRoaXMgY29kZSB3YXMgY29udHJpYnV0ZWQgYnkgYW4gZXh0ZXJuYWwgZGV2ZWxvcGVyLgorICAgICAgICAgICBUaGUgaW50ZXJuYWwgVGhyaWZ0IHRlYW0gaGFzIHJldmlld2VkIGFuZCB0ZXN0ZWQgaXQsCisgICAgICAgICAgIGJ1dCB3ZSBjYW5ub3QgZ3VhcmFudGVlIHRoYXQgaXQgaXMgcHJvZHVjdGlvbi1yZWFkeS4KKyAgICAgICAgICAgUGxlYXNlIGZlZWwgZnJlZSB0byByZXBvcnQgYnVncyBhbmQvb3Igc3VjY2VzcyBzdG9yaWVzCisgICAgICAgICAgIHRvIHRoZSBwdWJsaWMgbWFpbGluZyBsaXN0LgorICAgICIiIgorICAgIHBhc3MKIAotICBOT1RFOiAgVGhpcyBjb2RlIHdhcyBjb250cmlidXRlZCBieSBhbiBleHRlcm5hbCBkZXZlbG9wZXIuCi0gICAgICAgICBUaGUgaW50ZXJuYWwgVGhyaWZ0IHRlYW0gaGFzIHJldmlld2VkIGFuZCB0ZXN0ZWQgaXQsCi0gICAgICAgICBidXQgd2UgY2Fubm90IGd1YXJhbnRlZSB0aGF0IGl0IGlzIHByb2R1Y3Rpb24tcmVhZHkuCi0gICAgICAgICBQbGVhc2UgZmVlbCBmcmVlIHRvIHJlcG9ydCBidWdzIGFuZC9vciBzdWNjZXNzIHN0b3JpZXMKLSAgICAgICAgIHRvIHRoZSBwdWJsaWMgbWFpbGluZyBsaXN0LgotICAiIiIKLQotICBwYXNzCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIGZhbGxiYWNrID0ga3dhcmdzLnBvcCgnZmFsbGJhY2snLCBUcnVlKQorICAgICAgICBzdXBlcihUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgZmFzdGJpbmFyeQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBpZiBub3QgZmFsbGJhY2s6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2Zhc3RfZGVjb2RlID0gZmFzdGJpbmFyeS5kZWNvZGVfYmluYXJ5CisgICAgICAgICAgICBzZWxmLl9mYXN0X2VuY29kZSA9IGZhc3RiaW5hcnkuZW5jb2RlX2JpbmFyeQogCiAKLWNsYXNzIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeToKLSAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKLSAgICByZXR1cm4gVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQodHJhbnMpCitjbGFzcyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3Rvcnkob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgc3RyaW5nX2xlbmd0aF9saW1pdD1Ob25lLAorICAgICAgICAgICAgICAgICBjb250YWluZXJfbGVuZ3RoX2xpbWl0PU5vbmUsCisgICAgICAgICAgICAgICAgIGZhbGxiYWNrPVRydWUpOgorICAgICAgICBzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQgPSBzdHJpbmdfbGVuZ3RoX2xpbWl0CisgICAgICAgIHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCA9IGNvbnRhaW5lcl9sZW5ndGhfbGltaXQKKyAgICAgICAgc2VsZi5fZmFsbGJhY2sgPSBmYWxsYmFjaworCisgICAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKAorICAgICAgICAgICAgdHJhbnMsCisgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PXNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCwKKyAgICAgICAgICAgIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQ9c2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0LAorICAgICAgICAgICAgZmFsbGJhY2s9c2VsZi5fZmFsbGJhY2spCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucHkKaW5kZXggNmQ1N2FlYi4uZTQ4NWNmZiAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnB5CisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5weQpAQCAtMSw2ICsxLDI3IEBACi1mcm9tIFRQcm90b2NvbCBpbXBvcnQgKgorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gLlRQcm90b2NvbCBpbXBvcnQgVFR5cGUsIFRQcm90b2NvbEJhc2UsIFRQcm90b2NvbEV4Y2VwdGlvbiwgY2hlY2tJbnRlZ2VyTGltaXRzCiBmcm9tIHN0cnVjdCBpbXBvcnQgcGFjaywgdW5wYWNrCiAKK2Zyb20gLi5jb21wYXQgaW1wb3J0IGJpbmFyeV90b19zdHIsIHN0cl90b19iaW5hcnkKKwogX19hbGxfXyA9IFsnVENvbXBhY3RQcm90b2NvbCcsICdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSddCiAKIENMRUFSID0gMApAQCAtMTMsMzY0ICszNCw0NDIgQEAKIFZBTFVFX1JFQUQgPSA3CiBCT09MX1JFQUQgPSA4CiAKKwogZGVmIG1ha2VfaGVscGVyKHZfZnJvbSwgY29udGFpbmVyKToKLSAgZGVmIGhlbHBlcihmdW5jKToKLSAgICBkZWYgbmVzdGVkKHNlbGYsICphcmdzLCAqKmt3YXJncyk6Ci0gICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAodl9mcm9tLCBjb250YWluZXIpLCAoc2VsZi5zdGF0ZSwgdl9mcm9tLCBjb250YWluZXIpCi0gICAgICByZXR1cm4gZnVuYyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCi0gICAgcmV0dXJuIG5lc3RlZAotICByZXR1cm4gaGVscGVyCisgICAgZGVmIGhlbHBlcihmdW5jKToKKyAgICAgICAgZGVmIG5lc3RlZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKHZfZnJvbSwgY29udGFpbmVyKSwgKHNlbGYuc3RhdGUsIHZfZnJvbSwgY29udGFpbmVyKQorICAgICAgICAgICAgcmV0dXJuIGZ1bmMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICByZXR1cm4gbmVzdGVkCisgICAgcmV0dXJuIGhlbHBlcgorCisKIHdyaXRlciA9IG1ha2VfaGVscGVyKFZBTFVFX1dSSVRFLCBDT05UQUlORVJfV1JJVEUpCiByZWFkZXIgPSBtYWtlX2hlbHBlcihWQUxVRV9SRUFELCBDT05UQUlORVJfUkVBRCkKIAorCiBkZWYgbWFrZVppZ1phZyhuLCBiaXRzKToKLSAgcmV0dXJuIChuIDw8IDEpIF4gKG4gPj4gKGJpdHMgLSAxKSkKKyAgICBjaGVja0ludGVnZXJMaW1pdHMobiwgYml0cykKKyAgICByZXR1cm4gKG4gPDwgMSkgXiAobiA+PiAoYml0cyAtIDEpKQorCiAKIGRlZiBmcm9tWmlnWmFnKG4pOgotICByZXR1cm4gKG4gPj4gMSkgXiAtKG4gJiAxKQorICAgIHJldHVybiAobiA+PiAxKSBeIC0obiAmIDEpCisKIAogZGVmIHdyaXRlVmFyaW50KHRyYW5zLCBuKToKLSAgb3V0ID0gW10KLSAgd2hpbGUgVHJ1ZToKLSAgICBpZiBuICYgfjB4N2YgPT0gMDoKLSAgICAgIG91dC5hcHBlbmQobikKLSAgICAgIGJyZWFrCi0gICAgZWxzZToKLSAgICAgIG91dC5hcHBlbmQoKG4gJiAweGZmKSB8IDB4ODApCi0gICAgICBuID0gbiA+PiA3Ci0gIHRyYW5zLndyaXRlKCcnLmpvaW4obWFwKGNociwgb3V0KSkpCisgICAgb3V0ID0gYnl0ZWFycmF5KCkKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBpZiBuICYgfjB4N2YgPT0gMDoKKyAgICAgICAgICAgIG91dC5hcHBlbmQobikKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvdXQuYXBwZW5kKChuICYgMHhmZikgfCAweDgwKQorICAgICAgICAgICAgbiA9IG4gPj4gNworICAgIHRyYW5zLndyaXRlKGJ5dGVzKG91dCkpCisKIAogZGVmIHJlYWRWYXJpbnQodHJhbnMpOgotICByZXN1bHQgPSAwCi0gIHNoaWZ0ID0gMAotICB3aGlsZSBUcnVlOgotICAgIHggPSB0cmFucy5yZWFkQWxsKDEpCi0gICAgYnl0ZSA9IG9yZCh4KQotICAgIHJlc3VsdCB8PSAoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0Ci0gICAgaWYgYnl0ZSA+PiA3ID09IDA6Ci0gICAgICByZXR1cm4gcmVzdWx0Ci0gICAgc2hpZnQgKz0gNworICAgIHJlc3VsdCA9IDAKKyAgICBzaGlmdCA9IDAKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICB4ID0gdHJhbnMucmVhZEFsbCgxKQorICAgICAgICBieXRlID0gb3JkKHgpCisgICAgICAgIHJlc3VsdCB8PSAoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0CisgICAgICAgIGlmIGJ5dGUgPj4gNyA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICBzaGlmdCArPSA3CiAKLWNsYXNzIENvbXBhY3RUeXBlOgotICBTVE9QID0gMHgwMAotICBUUlVFID0gMHgwMQotICBGQUxTRSA9IDB4MDIKLSAgQllURSA9IDB4MDMKLSAgSTE2ID0gMHgwNAotICBJMzIgPSAweDA1Ci0gIEk2NCA9IDB4MDYKLSAgRE9VQkxFID0gMHgwNwotICBCSU5BUlkgPSAweDA4Ci0gIExJU1QgPSAweDA5Ci0gIFNFVCA9IDB4MEEKLSAgTUFQID0gMHgwQgotICBTVFJVQ1QgPSAweDBDCiAKLUNUWVBFUyA9IHtUVHlwZS5TVE9QOiBDb21wYWN0VHlwZS5TVE9QLAotICAgICAgICAgIFRUeXBlLkJPT0w6IENvbXBhY3RUeXBlLlRSVUUsICMgdXNlZCBmb3IgY29sbGVjdGlvbgotICAgICAgICAgIFRUeXBlLkJZVEU6IENvbXBhY3RUeXBlLkJZVEUsCi0gICAgICAgICAgVFR5cGUuSTE2OiBDb21wYWN0VHlwZS5JMTYsCi0gICAgICAgICAgVFR5cGUuSTMyOiBDb21wYWN0VHlwZS5JMzIsCi0gICAgICAgICAgVFR5cGUuSTY0OiBDb21wYWN0VHlwZS5JNjQsCi0gICAgICAgICAgVFR5cGUuRE9VQkxFOiBDb21wYWN0VHlwZS5ET1VCTEUsCi0gICAgICAgICAgVFR5cGUuU1RSSU5HOiBDb21wYWN0VHlwZS5CSU5BUlksCi0gICAgICAgICAgVFR5cGUuU1RSVUNUOiBDb21wYWN0VHlwZS5TVFJVQ1QsCi0gICAgICAgICAgVFR5cGUuTElTVDogQ29tcGFjdFR5cGUuTElTVCwKLSAgICAgICAgICBUVHlwZS5TRVQ6IENvbXBhY3RUeXBlLlNFVCwKLSAgICAgICAgICBUVHlwZS5NQVA6IENvbXBhY3RUeXBlLk1BUAotICAgICAgICAgIH0KK2NsYXNzIENvbXBhY3RUeXBlKG9iamVjdCk6CisgICAgU1RPUCA9IDB4MDAKKyAgICBUUlVFID0gMHgwMQorICAgIEZBTFNFID0gMHgwMgorICAgIEJZVEUgPSAweDAzCisgICAgSTE2ID0gMHgwNAorICAgIEkzMiA9IDB4MDUKKyAgICBJNjQgPSAweDA2CisgICAgRE9VQkxFID0gMHgwNworICAgIEJJTkFSWSA9IDB4MDgKKyAgICBMSVNUID0gMHgwOQorICAgIFNFVCA9IDB4MEEKKyAgICBNQVAgPSAweDBCCisgICAgU1RSVUNUID0gMHgwQworCisKK0NUWVBFUyA9IHsKKyAgICBUVHlwZS5TVE9QOiBDb21wYWN0VHlwZS5TVE9QLAorICAgIFRUeXBlLkJPT0w6IENvbXBhY3RUeXBlLlRSVUUsICAjIHVzZWQgZm9yIGNvbGxlY3Rpb24KKyAgICBUVHlwZS5CWVRFOiBDb21wYWN0VHlwZS5CWVRFLAorICAgIFRUeXBlLkkxNjogQ29tcGFjdFR5cGUuSTE2LAorICAgIFRUeXBlLkkzMjogQ29tcGFjdFR5cGUuSTMyLAorICAgIFRUeXBlLkk2NDogQ29tcGFjdFR5cGUuSTY0LAorICAgIFRUeXBlLkRPVUJMRTogQ29tcGFjdFR5cGUuRE9VQkxFLAorICAgIFRUeXBlLlNUUklORzogQ29tcGFjdFR5cGUuQklOQVJZLAorICAgIFRUeXBlLlNUUlVDVDogQ29tcGFjdFR5cGUuU1RSVUNULAorICAgIFRUeXBlLkxJU1Q6IENvbXBhY3RUeXBlLkxJU1QsCisgICAgVFR5cGUuU0VUOiBDb21wYWN0VHlwZS5TRVQsCisgICAgVFR5cGUuTUFQOiBDb21wYWN0VHlwZS5NQVAsCit9CiAKIFRUWVBFUyA9IHt9CiBmb3IgaywgdiBpbiBDVFlQRVMuaXRlbXMoKToKLSAgVFRZUEVTW3ZdID0gaworICAgIFRUWVBFU1t2XSA9IGsKIFRUWVBFU1tDb21wYWN0VHlwZS5GQUxTRV0gPSBUVHlwZS5CT09MCiBkZWwgawogZGVsIHYKIAorCiBjbGFzcyBUQ29tcGFjdFByb3RvY29sKFRQcm90b2NvbEJhc2UpOgotICAiQ29tcGFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyaWZ0IHByb3RvY29sIGRyaXZlci4iCisgICAgIiIiQ29tcGFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyaWZ0IHByb3RvY29sIGRyaXZlci4iIiIKIAotICBQUk9UT0NPTF9JRCA9IDB4ODIKLSAgVkVSU0lPTiA9IDEKLSAgVkVSU0lPTl9NQVNLID0gMHgxZgotICBUWVBFX01BU0sgPSAweGUwCi0gIFRZUEVfU0hJRlRfQU1PVU5UID0gNQorICAgIFBST1RPQ09MX0lEID0gMHg4MgorICAgIFZFUlNJT04gPSAxCisgICAgVkVSU0lPTl9NQVNLID0gMHgxZgorICAgIFRZUEVfTUFTSyA9IDB4ZTAKKyAgICBUWVBFX0JJVFMgPSAweDA3CisgICAgVFlQRV9TSElGVF9BTU9VTlQgPSA1CiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zKToKLSAgICBUUHJvdG9jb2xCYXNlLl9faW5pdF9fKHNlbGYsIHRyYW5zKQotICAgIHNlbGYuc3RhdGUgPSBDTEVBUgotICAgIHNlbGYuX19sYXN0X2ZpZCA9IDAKLSAgICBzZWxmLl9fYm9vbF9maWQgPSBOb25lCi0gICAgc2VsZi5fX2Jvb2xfdmFsdWUgPSBOb25lCi0gICAgc2VsZi5fX3N0cnVjdHMgPSBbXQotICAgIHNlbGYuX19jb250YWluZXJzID0gW10KKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsCisgICAgICAgICAgICAgICAgIHN0cmluZ19sZW5ndGhfbGltaXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgY29udGFpbmVyX2xlbmd0aF9saW1pdD1Ob25lKToKKyAgICAgICAgVFByb3RvY29sQmFzZS5fX2luaXRfXyhzZWxmLCB0cmFucykKKyAgICAgICAgc2VsZi5zdGF0ZSA9IENMRUFSCisgICAgICAgIHNlbGYuX19sYXN0X2ZpZCA9IDAKKyAgICAgICAgc2VsZi5fX2Jvb2xfZmlkID0gTm9uZQorICAgICAgICBzZWxmLl9fYm9vbF92YWx1ZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fX3N0cnVjdHMgPSBbXQorICAgICAgICBzZWxmLl9fY29udGFpbmVycyA9IFtdCisgICAgICAgIHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCA9IHN0cmluZ19sZW5ndGhfbGltaXQKKyAgICAgICAgc2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0ID0gY29udGFpbmVyX2xlbmd0aF9saW1pdAogCi0gIGRlZiBfX3dyaXRlVmFyaW50KHNlbGYsIG4pOgotICAgIHdyaXRlVmFyaW50KHNlbGYudHJhbnMsIG4pCisgICAgZGVmIF9jaGVja19zdHJpbmdfbGVuZ3RoKHNlbGYsIGxlbmd0aCk6CisgICAgICAgIHNlbGYuX2NoZWNrX2xlbmd0aChzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQsIGxlbmd0aCkKIAotICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgc2VxaWQpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENMRUFSCi0gICAgc2VsZi5fX3dyaXRlVUJ5dGUoc2VsZi5QUk9UT0NPTF9JRCkKLSAgICBzZWxmLl9fd3JpdGVVQnl0ZShzZWxmLlZFUlNJT04gfCAodHlwZSA8PCBzZWxmLlRZUEVfU0hJRlRfQU1PVU5UKSkKLSAgICBzZWxmLl9fd3JpdGVWYXJpbnQoc2VxaWQpCi0gICAgc2VsZi5fX3dyaXRlU3RyaW5nKG5hbWUpCi0gICAgc2VsZi5zdGF0ZSA9IFZBTFVFX1dSSVRFCisgICAgZGVmIF9jaGVja19jb250YWluZXJfbGVuZ3RoKHNlbGYsIGxlbmd0aCk6CisgICAgICAgIHNlbGYuX2NoZWNrX2xlbmd0aChzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQsIGxlbmd0aCkKIAotICBkZWYgd3JpdGVNZXNzYWdlRW5kKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IFZBTFVFX1dSSVRFCi0gICAgc2VsZi5zdGF0ZSA9IENMRUFSCisgICAgZGVmIF9fd3JpdGVWYXJpbnQoc2VsZiwgbik6CisgICAgICAgIHdyaXRlVmFyaW50KHNlbGYudHJhbnMsIG4pCiAKLSAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKENMRUFSLCBDT05UQUlORVJfV1JJVEUsIFZBTFVFX1dSSVRFKSwgc2VsZi5zdGF0ZQotICAgIHNlbGYuX19zdHJ1Y3RzLmFwcGVuZCgoc2VsZi5zdGF0ZSwgc2VsZi5fX2xhc3RfZmlkKSkKLSAgICBzZWxmLnN0YXRlID0gRklFTERfV1JJVEUKLSAgICBzZWxmLl9fbGFzdF9maWQgPSAwCisgICAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHR5cGUsIHNlcWlkKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gQ0xFQVIKKyAgICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoc2VsZi5QUk9UT0NPTF9JRCkKKyAgICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoc2VsZi5WRVJTSU9OIHwgKHR5cGUgPDwgc2VsZi5UWVBFX1NISUZUX0FNT1VOVCkpCisgICAgICAgIHNlbGYuX193cml0ZVZhcmludChzZXFpZCkKKyAgICAgICAgc2VsZi5fX3dyaXRlQmluYXJ5KHN0cl90b19iaW5hcnkobmFtZSkpCisgICAgICAgIHNlbGYuc3RhdGUgPSBWQUxVRV9XUklURQogCi0gIGRlZiB3cml0ZVN0cnVjdEVuZChzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBGSUVMRF9XUklURQotICAgIHNlbGYuc3RhdGUsIHNlbGYuX19sYXN0X2ZpZCA9IHNlbGYuX19zdHJ1Y3RzLnBvcCgpCisgICAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gVkFMVUVfV1JJVEUKKyAgICAgICAgc2VsZi5zdGF0ZSA9IENMRUFSCiAKLSAgZGVmIHdyaXRlRmllbGRTdG9wKHNlbGYpOgotICAgIHNlbGYuX193cml0ZUJ5dGUoMCkKKyAgICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKENMRUFSLCBDT05UQUlORVJfV1JJVEUsIFZBTFVFX1dSSVRFKSwgc2VsZi5zdGF0ZQorICAgICAgICBzZWxmLl9fc3RydWN0cy5hcHBlbmQoKHNlbGYuc3RhdGUsIHNlbGYuX19sYXN0X2ZpZCkpCisgICAgICAgIHNlbGYuc3RhdGUgPSBGSUVMRF9XUklURQorICAgICAgICBzZWxmLl9fbGFzdF9maWQgPSAwCiAKLSAgZGVmIF9fd3JpdGVGaWVsZEhlYWRlcihzZWxmLCB0eXBlLCBmaWQpOgotICAgIGRlbHRhID0gZmlkIC0gc2VsZi5fX2xhc3RfZmlkCi0gICAgaWYgMCA8IGRlbHRhIDw9IDE1OgotICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoZGVsdGEgPDwgNCB8IHR5cGUpCi0gICAgZWxzZToKLSAgICAgIHNlbGYuX193cml0ZUJ5dGUodHlwZSkKLSAgICAgIHNlbGYuX193cml0ZUkxNihmaWQpCi0gICAgc2VsZi5fX2xhc3RfZmlkID0gZmlkCisgICAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBGSUVMRF9XUklURQorICAgICAgICBzZWxmLnN0YXRlLCBzZWxmLl9fbGFzdF9maWQgPSBzZWxmLl9fc3RydWN0cy5wb3AoKQogCi0gIGRlZiB3cml0ZUZpZWxkQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgZmlkKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBGSUVMRF9XUklURSwgc2VsZi5zdGF0ZQotICAgIGlmIHR5cGUgPT0gVFR5cGUuQk9PTDoKLSAgICAgIHNlbGYuc3RhdGUgPSBCT09MX1dSSVRFCi0gICAgICBzZWxmLl9fYm9vbF9maWQgPSBmaWQKLSAgICBlbHNlOgotICAgICAgc2VsZi5zdGF0ZSA9IFZBTFVFX1dSSVRFCi0gICAgICBzZWxmLl9fd3JpdGVGaWVsZEhlYWRlcihDVFlQRVNbdHlwZV0sIGZpZCkKKyAgICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6CisgICAgICAgIHNlbGYuX193cml0ZUJ5dGUoMCkKIAotICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfV1JJVEUsIEJPT0xfV1JJVEUpLCBzZWxmLnN0YXRlCi0gICAgc2VsZi5zdGF0ZSA9IEZJRUxEX1dSSVRFCi0KLSAgZGVmIF9fd3JpdGVVQnl0ZShzZWxmLCBieXRlKToKLSAgICBzZWxmLnRyYW5zLndyaXRlKHBhY2soJyFCJywgYnl0ZSkpCi0KLSAgZGVmIF9fd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgotICAgIHNlbGYudHJhbnMud3JpdGUocGFjaygnIWInLCBieXRlKSkKLQotICBkZWYgX193cml0ZUkxNihzZWxmLCBpMTYpOgotICAgIHNlbGYuX193cml0ZVZhcmludChtYWtlWmlnWmFnKGkxNiwgMTYpKQotCi0gIGRlZiBfX3dyaXRlU2l6ZShzZWxmLCBpMzIpOgotICAgIHNlbGYuX193cml0ZVZhcmludChpMzIpCi0KLSAgZGVmIHdyaXRlQ29sbGVjdGlvbkJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfV1JJVEUsIENPTlRBSU5FUl9XUklURSksIHNlbGYuc3RhdGUKLSAgICBpZiBzaXplIDw9IDE0OgotICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoc2l6ZSA8PCA0IHwgQ1RZUEVTW2V0eXBlXSkKLSAgICBlbHNlOgotICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoMHhmMCB8IENUWVBFU1tldHlwZV0pCi0gICAgICBzZWxmLl9fd3JpdGVTaXplKHNpemUpCi0gICAgc2VsZi5fX2NvbnRhaW5lcnMuYXBwZW5kKHNlbGYuc3RhdGUpCi0gICAgc2VsZi5zdGF0ZSA9IENPTlRBSU5FUl9XUklURQotICB3cml0ZVNldEJlZ2luID0gd3JpdGVDb2xsZWN0aW9uQmVnaW4KLSAgd3JpdGVMaXN0QmVnaW4gPSB3cml0ZUNvbGxlY3Rpb25CZWdpbgotCi0gIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1dSSVRFLCBDT05UQUlORVJfV1JJVEUpLCBzZWxmLnN0YXRlCi0gICAgaWYgc2l6ZSA9PSAwOgotICAgICAgc2VsZi5fX3dyaXRlQnl0ZSgwKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLl9fd3JpdGVTaXplKHNpemUpCi0gICAgICBzZWxmLl9fd3JpdGVVQnl0ZShDVFlQRVNba3R5cGVdIDw8IDQgfCBDVFlQRVNbdnR5cGVdKQotICAgIHNlbGYuX19jb250YWluZXJzLmFwcGVuZChzZWxmLnN0YXRlKQotICAgIHNlbGYuc3RhdGUgPSBDT05UQUlORVJfV1JJVEUKLQotICBkZWYgd3JpdGVDb2xsZWN0aW9uRW5kKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENPTlRBSU5FUl9XUklURSwgc2VsZi5zdGF0ZQotICAgIHNlbGYuc3RhdGUgPSBzZWxmLl9fY29udGFpbmVycy5wb3AoKQotICB3cml0ZU1hcEVuZCA9IHdyaXRlQ29sbGVjdGlvbkVuZAotICB3cml0ZVNldEVuZCA9IHdyaXRlQ29sbGVjdGlvbkVuZAotICB3cml0ZUxpc3RFbmQgPSB3cml0ZUNvbGxlY3Rpb25FbmQKLQotICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2wpOgotICAgIGlmIHNlbGYuc3RhdGUgPT0gQk9PTF9XUklURToKLSAgICAgICAgaWYgYm9vbDoKLSAgICAgICAgICAgIGN0eXBlID0gQ29tcGFjdFR5cGUuVFJVRQorICAgIGRlZiBfX3dyaXRlRmllbGRIZWFkZXIoc2VsZiwgdHlwZSwgZmlkKToKKyAgICAgICAgZGVsdGEgPSBmaWQgLSBzZWxmLl9fbGFzdF9maWQKKyAgICAgICAgaWYgMCA8IGRlbHRhIDw9IDE1OgorICAgICAgICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoZGVsdGEgPDwgNCB8IHR5cGUpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBjdHlwZSA9IENvbXBhY3RUeXBlLkZBTFNFCi0gICAgICAgIHNlbGYuX193cml0ZUZpZWxkSGVhZGVyKGN0eXBlLCBzZWxmLl9fYm9vbF9maWQpCi0gICAgZWxpZiBzZWxmLnN0YXRlID09IENPTlRBSU5FUl9XUklURToKLSAgICAgICBpZiBib29sOgotICAgICAgICAgICBzZWxmLl9fd3JpdGVCeXRlKENvbXBhY3RUeXBlLlRSVUUpCi0gICAgICAgZWxzZToKLSAgICAgICAgICAgc2VsZi5fX3dyaXRlQnl0ZShDb21wYWN0VHlwZS5GQUxTRSkKLSAgICBlbHNlOgotICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IsICJJbnZhbGlkIHN0YXRlIGluIGNvbXBhY3QgcHJvdG9jb2wiCisgICAgICAgICAgICBzZWxmLl9fd3JpdGVCeXRlKHR5cGUpCisgICAgICAgICAgICBzZWxmLl9fd3JpdGVJMTYoZmlkKQorICAgICAgICBzZWxmLl9fbGFzdF9maWQgPSBmaWQKIAotICB3cml0ZUJ5dGUgPSB3cml0ZXIoX193cml0ZUJ5dGUpCi0gIHdyaXRlSTE2ID0gd3JpdGVyKF9fd3JpdGVJMTYpCisgICAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBmaWQpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBGSUVMRF9XUklURSwgc2VsZi5zdGF0ZQorICAgICAgICBpZiB0eXBlID09IFRUeXBlLkJPT0w6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gQk9PTF9XUklURQorICAgICAgICAgICAgc2VsZi5fX2Jvb2xfZmlkID0gZmlkCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gVkFMVUVfV1JJVEUKKyAgICAgICAgICAgIHNlbGYuX193cml0ZUZpZWxkSGVhZGVyKENUWVBFU1t0eXBlXSwgZmlkKQogCi0gIEB3cml0ZXIKLSAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6Ci0gICAgc2VsZi5fX3dyaXRlVmFyaW50KG1ha2VaaWdaYWcoaTMyLCAzMikpCisgICAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9XUklURSwgQk9PTF9XUklURSksIHNlbGYuc3RhdGUKKyAgICAgICAgc2VsZi5zdGF0ZSA9IEZJRUxEX1dSSVRFCiAKLSAgQHdyaXRlcgotICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKLSAgICBzZWxmLl9fd3JpdGVWYXJpbnQobWFrZVppZ1phZyhpNjQsIDY0KSkKKyAgICBkZWYgX193cml0ZVVCeXRlKHNlbGYsIGJ5dGUpOgorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKHBhY2soJyFCJywgYnl0ZSkpCiAKLSAgQHdyaXRlcgotICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZHViKToKLSAgICBzZWxmLnRyYW5zLndyaXRlKHBhY2soJyFkJywgZHViKSkKKyAgICBkZWYgX193cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6CisgICAgICAgIHNlbGYudHJhbnMud3JpdGUocGFjaygnIWInLCBieXRlKSkKIAotICBkZWYgX193cml0ZVN0cmluZyhzZWxmLCBzKToKLSAgICBzZWxmLl9fd3JpdGVTaXplKGxlbihzKSkKLSAgICBzZWxmLnRyYW5zLndyaXRlKHMpCi0gIHdyaXRlU3RyaW5nID0gd3JpdGVyKF9fd3JpdGVTdHJpbmcpCisgICAgZGVmIF9fd3JpdGVJMTYoc2VsZiwgaTE2KToKKyAgICAgICAgc2VsZi5fX3dyaXRlVmFyaW50KG1ha2VaaWdaYWcoaTE2LCAxNikpCiAKLSAgZGVmIHJlYWRGaWVsZEJlZ2luKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IEZJRUxEX1JFQUQsIHNlbGYuc3RhdGUKLSAgICB0eXBlID0gc2VsZi5fX3JlYWRVQnl0ZSgpCi0gICAgaWYgdHlwZSAmIDB4MGYgPT0gVFR5cGUuU1RPUDoKLSAgICAgIHJldHVybiAoTm9uZSwgMCwgMCkKLSAgICBkZWx0YSA9IHR5cGUgPj4gNAotICAgIGlmIGRlbHRhID09IDA6Ci0gICAgICBmaWQgPSBzZWxmLl9fcmVhZEkxNigpCi0gICAgZWxzZToKLSAgICAgIGZpZCA9IHNlbGYuX19sYXN0X2ZpZCArIGRlbHRhCi0gICAgc2VsZi5fX2xhc3RfZmlkID0gZmlkCi0gICAgdHlwZSA9IHR5cGUgJiAweDBmCi0gICAgaWYgdHlwZSA9PSBDb21wYWN0VHlwZS5UUlVFOgotICAgICAgc2VsZi5zdGF0ZSA9IEJPT0xfUkVBRAotICAgICAgc2VsZi5fX2Jvb2xfdmFsdWUgPSBUcnVlCi0gICAgZWxpZiB0eXBlID09IENvbXBhY3RUeXBlLkZBTFNFOgotICAgICAgc2VsZi5zdGF0ZSA9IEJPT0xfUkVBRAotICAgICAgc2VsZi5fX2Jvb2xfdmFsdWUgPSBGYWxzZQotICAgIGVsc2U6Ci0gICAgICBzZWxmLnN0YXRlID0gVkFMVUVfUkVBRAotICAgIHJldHVybiAoTm9uZSwgc2VsZi5fX2dldFRUeXBlKHR5cGUpLCBmaWQpCisgICAgZGVmIF9fd3JpdGVTaXplKHNlbGYsIGkzMik6CisgICAgICAgIHNlbGYuX193cml0ZVZhcmludChpMzIpCiAKLSAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfUkVBRCwgQk9PTF9SRUFEKSwgc2VsZi5zdGF0ZQotICAgIHNlbGYuc3RhdGUgPSBGSUVMRF9SRUFECisgICAgZGVmIHdyaXRlQ29sbGVjdGlvbkJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1dSSVRFLCBDT05UQUlORVJfV1JJVEUpLCBzZWxmLnN0YXRlCisgICAgICAgIGlmIHNpemUgPD0gMTQ6CisgICAgICAgICAgICBzZWxmLl9fd3JpdGVVQnl0ZShzaXplIDw8IDQgfCBDVFlQRVNbZXR5cGVdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoMHhmMCB8IENUWVBFU1tldHlwZV0pCisgICAgICAgICAgICBzZWxmLl9fd3JpdGVTaXplKHNpemUpCisgICAgICAgIHNlbGYuX19jb250YWluZXJzLmFwcGVuZChzZWxmLnN0YXRlKQorICAgICAgICBzZWxmLnN0YXRlID0gQ09OVEFJTkVSX1dSSVRFCisgICAgd3JpdGVTZXRCZWdpbiA9IHdyaXRlQ29sbGVjdGlvbkJlZ2luCisgICAgd3JpdGVMaXN0QmVnaW4gPSB3cml0ZUNvbGxlY3Rpb25CZWdpbgogCi0gIGRlZiBfX3JlYWRVQnl0ZShzZWxmKToKLSAgICByZXN1bHQsID0gdW5wYWNrKCchQicsIHNlbGYudHJhbnMucmVhZEFsbCgxKSkKLSAgICByZXR1cm4gcmVzdWx0CisgICAgZGVmIHdyaXRlTWFwQmVnaW4oc2VsZiwga3R5cGUsIHZ0eXBlLCBzaXplKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1dSSVRFLCBDT05UQUlORVJfV1JJVEUpLCBzZWxmLnN0YXRlCisgICAgICAgIGlmIHNpemUgPT0gMDoKKyAgICAgICAgICAgIHNlbGYuX193cml0ZUJ5dGUoMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX193cml0ZVNpemUoc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuX193cml0ZVVCeXRlKENUWVBFU1trdHlwZV0gPDwgNCB8IENUWVBFU1t2dHlwZV0pCisgICAgICAgIHNlbGYuX19jb250YWluZXJzLmFwcGVuZChzZWxmLnN0YXRlKQorICAgICAgICBzZWxmLnN0YXRlID0gQ09OVEFJTkVSX1dSSVRFCiAKLSAgZGVmIF9fcmVhZEJ5dGUoc2VsZik6Ci0gICAgcmVzdWx0LCA9IHVucGFjaygnIWInLCBzZWxmLnRyYW5zLnJlYWRBbGwoMSkpCi0gICAgcmV0dXJuIHJlc3VsdAorICAgIGRlZiB3cml0ZUNvbGxlY3Rpb25FbmQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENPTlRBSU5FUl9XUklURSwgc2VsZi5zdGF0ZQorICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5fX2NvbnRhaW5lcnMucG9wKCkKKyAgICB3cml0ZU1hcEVuZCA9IHdyaXRlQ29sbGVjdGlvbkVuZAorICAgIHdyaXRlU2V0RW5kID0gd3JpdGVDb2xsZWN0aW9uRW5kCisgICAgd3JpdGVMaXN0RW5kID0gd3JpdGVDb2xsZWN0aW9uRW5kCiAKLSAgZGVmIF9fcmVhZFZhcmludChzZWxmKToKLSAgICByZXR1cm4gcmVhZFZhcmludChzZWxmLnRyYW5zKQorICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbCk6CisgICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gQk9PTF9XUklURToKKyAgICAgICAgICAgIGlmIGJvb2w6CisgICAgICAgICAgICAgICAgY3R5cGUgPSBDb21wYWN0VHlwZS5UUlVFCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGN0eXBlID0gQ29tcGFjdFR5cGUuRkFMU0UKKyAgICAgICAgICAgIHNlbGYuX193cml0ZUZpZWxkSGVhZGVyKGN0eXBlLCBzZWxmLl9fYm9vbF9maWQpCisgICAgICAgIGVsaWYgc2VsZi5zdGF0ZSA9PSBDT05UQUlORVJfV1JJVEU6CisgICAgICAgICAgICBpZiBib29sOgorICAgICAgICAgICAgICAgIHNlbGYuX193cml0ZUJ5dGUoQ29tcGFjdFR5cGUuVFJVRSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fX3dyaXRlQnl0ZShDb21wYWN0VHlwZS5GQUxTRSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJJbnZhbGlkIHN0YXRlIGluIGNvbXBhY3QgcHJvdG9jb2wiKQogCi0gIGRlZiBfX3JlYWRaaWdaYWcoc2VsZik6Ci0gICAgcmV0dXJuIGZyb21aaWdaYWcoc2VsZi5fX3JlYWRWYXJpbnQoKSkKKyAgICB3cml0ZUJ5dGUgPSB3cml0ZXIoX193cml0ZUJ5dGUpCisgICAgd3JpdGVJMTYgPSB3cml0ZXIoX193cml0ZUkxNikKIAotICBkZWYgX19yZWFkU2l6ZShzZWxmKToKLSAgICByZXN1bHQgPSBzZWxmLl9fcmVhZFZhcmludCgpCi0gICAgaWYgcmVzdWx0IDwgMDoKLSAgICAgIHJhaXNlIFRFeGNlcHRpb24oIkxlbmd0aCA8IDAiKQotICAgIHJldHVybiByZXN1bHQKKyAgICBAd3JpdGVyCisgICAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6CisgICAgICAgIHNlbGYuX193cml0ZVZhcmludChtYWtlWmlnWmFnKGkzMiwgMzIpKQogCi0gIGRlZiByZWFkTWVzc2FnZUJlZ2luKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENMRUFSCi0gICAgcHJvdG9faWQgPSBzZWxmLl9fcmVhZFVCeXRlKCkKLSAgICBpZiBwcm90b19pZCAhPSBzZWxmLlBST1RPQ09MX0lEOgotICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKLSAgICAgICAgICAnQmFkIHByb3RvY29sIGlkIGluIHRoZSBtZXNzYWdlOiAlZCcgJSBwcm90b19pZCkKLSAgICB2ZXJfdHlwZSA9IHNlbGYuX19yZWFkVUJ5dGUoKQotICAgIHR5cGUgPSAodmVyX3R5cGUgJiBzZWxmLlRZUEVfTUFTSykgPj4gc2VsZi5UWVBFX1NISUZUX0FNT1VOVAotICAgIHZlcnNpb24gPSB2ZXJfdHlwZSAmIHNlbGYuVkVSU0lPTl9NQVNLCi0gICAgaWYgdmVyc2lvbiAhPSBzZWxmLlZFUlNJT046Ci0gICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAotICAgICAgICAgICdCYWQgdmVyc2lvbjogJWQgKGV4cGVjdCAlZCknICUgKHZlcnNpb24sIHNlbGYuVkVSU0lPTikpCi0gICAgc2VxaWQgPSBzZWxmLl9fcmVhZFZhcmludCgpCi0gICAgbmFtZSA9IHNlbGYuX19yZWFkU3RyaW5nKCkKLSAgICByZXR1cm4gKG5hbWUsIHR5cGUsIHNlcWlkKQorICAgIEB3cml0ZXIKKyAgICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKKyAgICAgICAgc2VsZi5fX3dyaXRlVmFyaW50KG1ha2VaaWdaYWcoaTY0LCA2NCkpCiAKLSAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENMRUFSCi0gICAgYXNzZXJ0IGxlbihzZWxmLl9fc3RydWN0cykgPT0gMAorICAgIEB3cml0ZXIKKyAgICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZHViKToKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShwYWNrKCc8ZCcsIGR1YikpCiAKLSAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoQ0xFQVIsIENPTlRBSU5FUl9SRUFELCBWQUxVRV9SRUFEKSwgc2VsZi5zdGF0ZQotICAgIHNlbGYuX19zdHJ1Y3RzLmFwcGVuZCgoc2VsZi5zdGF0ZSwgc2VsZi5fX2xhc3RfZmlkKSkKLSAgICBzZWxmLnN0YXRlID0gRklFTERfUkVBRAotICAgIHNlbGYuX19sYXN0X2ZpZCA9IDAKKyAgICBkZWYgX193cml0ZUJpbmFyeShzZWxmLCBzKToKKyAgICAgICAgc2VsZi5fX3dyaXRlU2l6ZShsZW4ocykpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUocykKKyAgICB3cml0ZUJpbmFyeSA9IHdyaXRlcihfX3dyaXRlQmluYXJ5KQogCi0gIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IEZJRUxEX1JFQUQKLSAgICBzZWxmLnN0YXRlLCBzZWxmLl9fbGFzdF9maWQgPSBzZWxmLl9fc3RydWN0cy5wb3AoKQorICAgIGRlZiByZWFkRmllbGRCZWdpbihzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gRklFTERfUkVBRCwgc2VsZi5zdGF0ZQorICAgICAgICB0eXBlID0gc2VsZi5fX3JlYWRVQnl0ZSgpCisgICAgICAgIGlmIHR5cGUgJiAweDBmID09IFRUeXBlLlNUT1A6CisgICAgICAgICAgICByZXR1cm4gKE5vbmUsIDAsIDApCisgICAgICAgIGRlbHRhID0gdHlwZSA+PiA0CisgICAgICAgIGlmIGRlbHRhID09IDA6CisgICAgICAgICAgICBmaWQgPSBzZWxmLl9fcmVhZEkxNigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaWQgPSBzZWxmLl9fbGFzdF9maWQgKyBkZWx0YQorICAgICAgICBzZWxmLl9fbGFzdF9maWQgPSBmaWQKKyAgICAgICAgdHlwZSA9IHR5cGUgJiAweDBmCisgICAgICAgIGlmIHR5cGUgPT0gQ29tcGFjdFR5cGUuVFJVRToKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBCT09MX1JFQUQKKyAgICAgICAgICAgIHNlbGYuX19ib29sX3ZhbHVlID0gVHJ1ZQorICAgICAgICBlbGlmIHR5cGUgPT0gQ29tcGFjdFR5cGUuRkFMU0U6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gQk9PTF9SRUFECisgICAgICAgICAgICBzZWxmLl9fYm9vbF92YWx1ZSA9IEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gVkFMVUVfUkVBRAorICAgICAgICByZXR1cm4gKE5vbmUsIHNlbGYuX19nZXRUVHlwZSh0eXBlKSwgZmlkKQogCi0gIGRlZiByZWFkQ29sbGVjdGlvbkJlZ2luKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9SRUFELCBDT05UQUlORVJfUkVBRCksIHNlbGYuc3RhdGUKLSAgICBzaXplX3R5cGUgPSBzZWxmLl9fcmVhZFVCeXRlKCkKLSAgICBzaXplID0gc2l6ZV90eXBlID4+IDQKLSAgICB0eXBlID0gc2VsZi5fX2dldFRUeXBlKHNpemVfdHlwZSkKLSAgICBpZiBzaXplID09IDE1OgotICAgICAgc2l6ZSA9IHNlbGYuX19yZWFkU2l6ZSgpCi0gICAgc2VsZi5fX2NvbnRhaW5lcnMuYXBwZW5kKHNlbGYuc3RhdGUpCi0gICAgc2VsZi5zdGF0ZSA9IENPTlRBSU5FUl9SRUFECi0gICAgcmV0dXJuIHR5cGUsIHNpemUKLSAgcmVhZFNldEJlZ2luID0gcmVhZENvbGxlY3Rpb25CZWdpbgotICByZWFkTGlzdEJlZ2luID0gcmVhZENvbGxlY3Rpb25CZWdpbgorICAgIGRlZiByZWFkRmllbGRFbmQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9SRUFELCBCT09MX1JFQUQpLCBzZWxmLnN0YXRlCisgICAgICAgIHNlbGYuc3RhdGUgPSBGSUVMRF9SRUFECiAKLSAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfUkVBRCwgQ09OVEFJTkVSX1JFQUQpLCBzZWxmLnN0YXRlCi0gICAgc2l6ZSA9IHNlbGYuX19yZWFkU2l6ZSgpCi0gICAgdHlwZXMgPSAwCi0gICAgaWYgc2l6ZSA+IDA6Ci0gICAgICB0eXBlcyA9IHNlbGYuX19yZWFkVUJ5dGUoKQotICAgIHZ0eXBlID0gc2VsZi5fX2dldFRUeXBlKHR5cGVzKQotICAgIGt0eXBlID0gc2VsZi5fX2dldFRUeXBlKHR5cGVzID4+IDQpCi0gICAgc2VsZi5fX2NvbnRhaW5lcnMuYXBwZW5kKHNlbGYuc3RhdGUpCi0gICAgc2VsZi5zdGF0ZSA9IENPTlRBSU5FUl9SRUFECi0gICAgcmV0dXJuIChrdHlwZSwgdnR5cGUsIHNpemUpCisgICAgZGVmIF9fcmVhZFVCeXRlKHNlbGYpOgorICAgICAgICByZXN1bHQsID0gdW5wYWNrKCchQicsIHNlbGYudHJhbnMucmVhZEFsbCgxKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAogCi0gIGRlZiByZWFkQ29sbGVjdGlvbkVuZChzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBDT05UQUlORVJfUkVBRCwgc2VsZi5zdGF0ZQotICAgIHNlbGYuc3RhdGUgPSBzZWxmLl9fY29udGFpbmVycy5wb3AoKQotICByZWFkU2V0RW5kID0gcmVhZENvbGxlY3Rpb25FbmQKLSAgcmVhZExpc3RFbmQgPSByZWFkQ29sbGVjdGlvbkVuZAotICByZWFkTWFwRW5kID0gcmVhZENvbGxlY3Rpb25FbmQKKyAgICBkZWYgX19yZWFkQnl0ZShzZWxmKToKKyAgICAgICAgcmVzdWx0LCA9IHVucGFjaygnIWInLCBzZWxmLnRyYW5zLnJlYWRBbGwoMSkpCisgICAgICAgIHJldHVybiByZXN1bHQKIAotICBkZWYgcmVhZEJvb2woc2VsZik6Ci0gICAgaWYgc2VsZi5zdGF0ZSA9PSBCT09MX1JFQUQ6Ci0gICAgICByZXR1cm4gc2VsZi5fX2Jvb2xfdmFsdWUgPT0gQ29tcGFjdFR5cGUuVFJVRQotICAgIGVsaWYgc2VsZi5zdGF0ZSA9PSBDT05UQUlORVJfUkVBRDoKLSAgICAgIHJldHVybiBzZWxmLl9fcmVhZEJ5dGUoKSA9PSBDb21wYWN0VHlwZS5UUlVFCi0gICAgZWxzZToKLSAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yLCAiSW52YWxpZCBzdGF0ZSBpbiBjb21wYWN0IHByb3RvY29sOiAlZCIgJSBzZWxmLnN0YXRlCisgICAgZGVmIF9fcmVhZFZhcmludChzZWxmKToKKyAgICAgICAgcmV0dXJuIHJlYWRWYXJpbnQoc2VsZi50cmFucykKIAotICByZWFkQnl0ZSA9IHJlYWRlcihfX3JlYWRCeXRlKQotICBfX3JlYWRJMTYgPSBfX3JlYWRaaWdaYWcKLSAgcmVhZEkxNiA9IHJlYWRlcihfX3JlYWRaaWdaYWcpCi0gIHJlYWRJMzIgPSByZWFkZXIoX19yZWFkWmlnWmFnKQotICByZWFkSTY0ID0gcmVhZGVyKF9fcmVhZFppZ1phZykKKyAgICBkZWYgX19yZWFkWmlnWmFnKHNlbGYpOgorICAgICAgICByZXR1cm4gZnJvbVppZ1phZyhzZWxmLl9fcmVhZFZhcmludCgpKQogCi0gIEByZWFkZXIKLSAgZGVmIHJlYWREb3VibGUoc2VsZik6Ci0gICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCg4KQotICAgIHZhbCwgPSB1bnBhY2soJyFkJywgYnVmZikKLSAgICByZXR1cm4gdmFsCisgICAgZGVmIF9fcmVhZFNpemUoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuX19yZWFkVmFyaW50KCkKKyAgICAgICAgaWYgcmVzdWx0IDwgMDoKKyAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbigiTGVuZ3RoIDwgMCIpCisgICAgICAgIHJldHVybiByZXN1bHQKIAotICBkZWYgX19yZWFkU3RyaW5nKHNlbGYpOgotICAgIGxlbiA9IHNlbGYuX19yZWFkU2l6ZSgpCi0gICAgcmV0dXJuIHNlbGYudHJhbnMucmVhZEFsbChsZW4pCi0gIHJlYWRTdHJpbmcgPSByZWFkZXIoX19yZWFkU3RyaW5nKQorICAgIGRlZiByZWFkTWVzc2FnZUJlZ2luKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBDTEVBUgorICAgICAgICBwcm90b19pZCA9IHNlbGYuX19yZWFkVUJ5dGUoKQorICAgICAgICBpZiBwcm90b19pZCAhPSBzZWxmLlBST1RPQ09MX0lEOgorICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQmFkIHByb3RvY29sIGlkIGluIHRoZSBtZXNzYWdlOiAlZCcgJSBwcm90b19pZCkKKyAgICAgICAgdmVyX3R5cGUgPSBzZWxmLl9fcmVhZFVCeXRlKCkKKyAgICAgICAgdHlwZSA9ICh2ZXJfdHlwZSA+PiBzZWxmLlRZUEVfU0hJRlRfQU1PVU5UKSAmIHNlbGYuVFlQRV9CSVRTCisgICAgICAgIHZlcnNpb24gPSB2ZXJfdHlwZSAmIHNlbGYuVkVSU0lPTl9NQVNLCisgICAgICAgIGlmIHZlcnNpb24gIT0gc2VsZi5WRVJTSU9OOgorICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQmFkIHZlcnNpb246ICVkIChleHBlY3QgJWQpJyAlICh2ZXJzaW9uLCBzZWxmLlZFUlNJT04pKQorICAgICAgICBzZXFpZCA9IHNlbGYuX19yZWFkVmFyaW50KCkKKyAgICAgICAgbmFtZSA9IGJpbmFyeV90b19zdHIoc2VsZi5fX3JlYWRCaW5hcnkoKSkKKyAgICAgICAgcmV0dXJuIChuYW1lLCB0eXBlLCBzZXFpZCkKIAotICBkZWYgX19nZXRUVHlwZShzZWxmLCBieXRlKToKLSAgICByZXR1cm4gVFRZUEVTW2J5dGUgJiAweDBmXQorICAgIGRlZiByZWFkTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gQ0xFQVIKKyAgICAgICAgYXNzZXJ0IGxlbihzZWxmLl9fc3RydWN0cykgPT0gMAorCisgICAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKENMRUFSLCBDT05UQUlORVJfUkVBRCwgVkFMVUVfUkVBRCksIHNlbGYuc3RhdGUKKyAgICAgICAgc2VsZi5fX3N0cnVjdHMuYXBwZW5kKChzZWxmLnN0YXRlLCBzZWxmLl9fbGFzdF9maWQpKQorICAgICAgICBzZWxmLnN0YXRlID0gRklFTERfUkVBRAorICAgICAgICBzZWxmLl9fbGFzdF9maWQgPSAwCisKKyAgICBkZWYgcmVhZFN0cnVjdEVuZChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gRklFTERfUkVBRAorICAgICAgICBzZWxmLnN0YXRlLCBzZWxmLl9fbGFzdF9maWQgPSBzZWxmLl9fc3RydWN0cy5wb3AoKQorCisgICAgZGVmIHJlYWRDb2xsZWN0aW9uQmVnaW4oc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9SRUFELCBDT05UQUlORVJfUkVBRCksIHNlbGYuc3RhdGUKKyAgICAgICAgc2l6ZV90eXBlID0gc2VsZi5fX3JlYWRVQnl0ZSgpCisgICAgICAgIHNpemUgPSBzaXplX3R5cGUgPj4gNAorICAgICAgICB0eXBlID0gc2VsZi5fX2dldFRUeXBlKHNpemVfdHlwZSkKKyAgICAgICAgaWYgc2l6ZSA9PSAxNToKKyAgICAgICAgICAgIHNpemUgPSBzZWxmLl9fcmVhZFNpemUoKQorICAgICAgICBzZWxmLl9jaGVja19jb250YWluZXJfbGVuZ3RoKHNpemUpCisgICAgICAgIHNlbGYuX19jb250YWluZXJzLmFwcGVuZChzZWxmLnN0YXRlKQorICAgICAgICBzZWxmLnN0YXRlID0gQ09OVEFJTkVSX1JFQUQKKyAgICAgICAgcmV0dXJuIHR5cGUsIHNpemUKKyAgICByZWFkU2V0QmVnaW4gPSByZWFkQ29sbGVjdGlvbkJlZ2luCisgICAgcmVhZExpc3RCZWdpbiA9IHJlYWRDb2xsZWN0aW9uQmVnaW4KKworICAgIGRlZiByZWFkTWFwQmVnaW4oc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9SRUFELCBDT05UQUlORVJfUkVBRCksIHNlbGYuc3RhdGUKKyAgICAgICAgc2l6ZSA9IHNlbGYuX19yZWFkU2l6ZSgpCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnRhaW5lcl9sZW5ndGgoc2l6ZSkKKyAgICAgICAgdHlwZXMgPSAwCisgICAgICAgIGlmIHNpemUgPiAwOgorICAgICAgICAgICAgdHlwZXMgPSBzZWxmLl9fcmVhZFVCeXRlKCkKKyAgICAgICAgdnR5cGUgPSBzZWxmLl9fZ2V0VFR5cGUodHlwZXMpCisgICAgICAgIGt0eXBlID0gc2VsZi5fX2dldFRUeXBlKHR5cGVzID4+IDQpCisgICAgICAgIHNlbGYuX19jb250YWluZXJzLmFwcGVuZChzZWxmLnN0YXRlKQorICAgICAgICBzZWxmLnN0YXRlID0gQ09OVEFJTkVSX1JFQUQKKyAgICAgICAgcmV0dXJuIChrdHlwZSwgdnR5cGUsIHNpemUpCisKKyAgICBkZWYgcmVhZENvbGxlY3Rpb25FbmQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENPTlRBSU5FUl9SRUFELCBzZWxmLnN0YXRlCisgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLl9fY29udGFpbmVycy5wb3AoKQorICAgIHJlYWRTZXRFbmQgPSByZWFkQ29sbGVjdGlvbkVuZAorICAgIHJlYWRMaXN0RW5kID0gcmVhZENvbGxlY3Rpb25FbmQKKyAgICByZWFkTWFwRW5kID0gcmVhZENvbGxlY3Rpb25FbmQKKworICAgIGRlZiByZWFkQm9vbChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSA9PSBCT09MX1JFQUQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2Jvb2xfdmFsdWUgPT0gQ29tcGFjdFR5cGUuVFJVRQorICAgICAgICBlbGlmIHNlbGYuc3RhdGUgPT0gQ09OVEFJTkVSX1JFQUQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX3JlYWRCeXRlKCkgPT0gQ29tcGFjdFR5cGUuVFJVRQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIkludmFsaWQgc3RhdGUgaW4gY29tcGFjdCBwcm90b2NvbDogJWQiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUpCisKKyAgICByZWFkQnl0ZSA9IHJlYWRlcihfX3JlYWRCeXRlKQorICAgIF9fcmVhZEkxNiA9IF9fcmVhZFppZ1phZworICAgIHJlYWRJMTYgPSByZWFkZXIoX19yZWFkWmlnWmFnKQorICAgIHJlYWRJMzIgPSByZWFkZXIoX19yZWFkWmlnWmFnKQorICAgIHJlYWRJNjQgPSByZWFkZXIoX19yZWFkWmlnWmFnKQorCisgICAgQHJlYWRlcgorICAgIGRlZiByZWFkRG91YmxlKHNlbGYpOgorICAgICAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDgpCisgICAgICAgIHZhbCwgPSB1bnBhY2soJzxkJywgYnVmZikKKyAgICAgICAgcmV0dXJuIHZhbAorCisgICAgZGVmIF9fcmVhZEJpbmFyeShzZWxmKToKKyAgICAgICAgc2l6ZSA9IHNlbGYuX19yZWFkU2l6ZSgpCisgICAgICAgIHNlbGYuX2NoZWNrX3N0cmluZ19sZW5ndGgoc2l6ZSkKKyAgICAgICAgcmV0dXJuIHNlbGYudHJhbnMucmVhZEFsbChzaXplKQorICAgIHJlYWRCaW5hcnkgPSByZWFkZXIoX19yZWFkQmluYXJ5KQorCisgICAgZGVmIF9fZ2V0VFR5cGUoc2VsZiwgYnl0ZSk6CisgICAgICAgIHJldHVybiBUVFlQRVNbYnl0ZSAmIDB4MGZdCiAKIAotY2xhc3MgVENvbXBhY3RQcm90b2NvbEZhY3Rvcnk6Ci0gIGRlZiBfX2luaXRfXyhzZWxmKToKK2NsYXNzIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIHN0cmluZ19sZW5ndGhfbGltaXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgY29udGFpbmVyX2xlbmd0aF9saW1pdD1Ob25lKToKKyAgICAgICAgc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0ID0gc3RyaW5nX2xlbmd0aF9saW1pdAorICAgICAgICBzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQgPSBjb250YWluZXJfbGVuZ3RoX2xpbWl0CisKKyAgICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVENvbXBhY3RQcm90b2NvbCh0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQpCisKKworY2xhc3MgVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkKFRDb21wYWN0UHJvdG9jb2wpOgorICAgICIiIkMtQWNjZWxlcmF0ZWQgdmVyc2lvbiBvZiBUQ29tcGFjdFByb3RvY29sLgorCisgICAgVGhpcyBjbGFzcyBkb2VzIG5vdCBvdmVycmlkZSBhbnkgb2YgVENvbXBhY3RQcm90b2NvbCdzIG1ldGhvZHMsCisgICAgYnV0IHRoZSBnZW5lcmF0ZWQgY29kZSByZWNvZ25pemVzIGl0IGRpcmVjdGx5IGFuZCB3aWxsIGNhbGwgaW50bworICAgIG91ciBDIG1vZHVsZSB0byBkbyB0aGUgZW5jb2RpbmcsIGJ5cGFzc2luZyB0aGlzIG9iamVjdCBlbnRpcmVseS4KKyAgICBXZSBpbmhlcml0IGZyb20gVENvbXBhY3RQcm90b2NvbCBzbyB0aGF0IHRoZSBub3JtYWwgVENvbXBhY3RQcm90b2NvbAorICAgIGVuY29kaW5nIGNhbiBoYXBwZW4gaWYgdGhlIGZhc3RiaW5hcnkgbW9kdWxlIGRvZXNuJ3Qgd29yayBmb3Igc29tZQorICAgIHJlYXNvbi4KKyAgICBUbyBkaXNhYmxlIHRoaXMgYmVoYXZpb3IsIHBhc3MgZmFsbGJhY2s9RmFsc2UgY29uc3RydWN0b3IgYXJndW1lbnQuCisKKyAgICBJbiBvcmRlciB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgQyBtb2R1bGUsIGp1c3QgdXNlCisgICAgVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkIGluc3RlYWQgb2YgVENvbXBhY3RQcm90b2NvbC4KKyAgICAiIiIKICAgICBwYXNzCiAKLSAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKLSAgICByZXR1cm4gVENvbXBhY3RQcm90b2NvbCh0cmFucykKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgZmFsbGJhY2sgPSBrd2FyZ3MucG9wKCdmYWxsYmFjaycsIFRydWUpCisgICAgICAgIHN1cGVyKFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgZmFzdGJpbmFyeQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBpZiBub3QgZmFsbGJhY2s6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2Zhc3RfZGVjb2RlID0gZmFzdGJpbmFyeS5kZWNvZGVfY29tcGFjdAorICAgICAgICAgICAgc2VsZi5fZmFzdF9lbmNvZGUgPSBmYXN0YmluYXJ5LmVuY29kZV9jb21wYWN0CisKKworY2xhc3MgVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PU5vbmUsCisgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgZmFsbGJhY2s9VHJ1ZSk6CisgICAgICAgIHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCA9IHN0cmluZ19sZW5ndGhfbGltaXQKKyAgICAgICAgc2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0ID0gY29udGFpbmVyX2xlbmd0aF9saW1pdAorICAgICAgICBzZWxmLl9mYWxsYmFjayA9IGZhbGxiYWNrCisKKyAgICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkKAorICAgICAgICAgICAgdHJhbnMsCisgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PXNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCwKKyAgICAgICAgICAgIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQ9c2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0LAorICAgICAgICAgICAgZmFsbGJhY2s9c2VsZi5fZmFsbGJhY2spCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyN2E3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5weQpAQCAtMCwwICsxLDIyNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGltcG9ydCBUUHJvdG9jb2xCYXNlLCBUUHJvdG9jb2xFeGNlcHRpb24KK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBUTWVzc2FnZVR5cGUKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5USGVhZGVyVHJhbnNwb3J0IGltcG9ydCBUSGVhZGVyVHJhbnNwb3J0LCBUSGVhZGVyU3VicHJvdG9jb2xJRCwgVEhlYWRlckNsaWVudFR5cGUKKworCitQUk9UT0NPTFNfQllfSUQgPSB7CisgICAgVEhlYWRlclN1YnByb3RvY29sSUQuQklOQVJZOiBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCwKKyAgICBUSGVhZGVyU3VicHJvdG9jb2xJRC5DT01QQUNUOiBUQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWQsCit9CisKKworY2xhc3MgVEhlYWRlclByb3RvY29sKFRQcm90b2NvbEJhc2UpOgorICAgICIiIkEgZnJhbWVkIHByb3RvY29sIHdpdGggaGVhZGVycyBhbmQgcGF5bG9hZCB0cmFuc2Zvcm1zLgorCisgICAgVEhlYWRlclByb3RvY29sIGZyYW1lcyBvdGhlciBUaHJpZnQgcHJvdG9jb2xzIGFuZCBhZGRzIHN1cHBvcnQgZm9yIG9wdGlvbmFsCisgICAgb3V0LW9mLWJhbmQgaGVhZGVycy4gVGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgc3VicHJvdG9jb2xzIGFyZQorICAgIFRCaW5hcnlQcm90b2NvbCBhbmQgVENvbXBhY3RQcm90b2NvbC4KKworICAgIEl0J3MgYWxzbyBwb3NzaWJsZSB0byBhcHBseSB0cmFuc2Zvcm1zIHRvIHRoZSBlbmNvZGVkIG1lc3NhZ2UgcGF5bG9hZC4gVGhlCisgICAgb25seSB0cmFuc2Zvcm0gY3VycmVudGx5IHN1cHBvcnRlZCBpcyB0byBnemlwLgorCisgICAgV2hlbiB1c2VkIGluIGEgc2VydmVyLCBUSGVhZGVyUHJvdG9jb2wgY2FuIGFjY2VwdCBtZXNzYWdlcyBmcm9tCisgICAgbm9uLVRIZWFkZXJQcm90b2NvbCBjbGllbnRzIGlmIGFsbG93ZWQgKHNlZSBgYWxsb3dlZF9jbGllbnRfdHlwZXNgKS4gVGhpcworICAgIGluY2x1ZGVzIGZyYW1lZCBhbmQgdW5mcmFtZWQgdHJhbnNwb3J0cyBhbmQgYm90aCBUQmluYXJ5UHJvdG9jb2wgYW5kCisgICAgVENvbXBhY3RQcm90b2NvbC4gVGhlIHNlcnZlciB3aWxsIHJlc3BvbmQgaW4gdGhlIGFwcHJvcHJpYXRlIGRpYWxlY3QgZm9yCisgICAgdGhlIGNvbm5lY3RlZCBjbGllbnQuIEhUVFAgY2xpZW50cyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCisKKyAgICBUSGVhZGVyUHJvdG9jb2wgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgVEhUVFBTZXJ2ZXIsIFROb25ibG9ja2luZ1NlcnZlciwKKyAgICBvciBUUHJvY2Vzc1Bvb2xTZXJ2ZXIuCisKKyAgICBTZWUgZG9jL3NwZWNzL0hlYWRlckZvcm1hdC5tZCBmb3IgZGV0YWlscyBvZiB0aGUgd2lyZSBmb3JtYXQuCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIGFsbG93ZWRfY2xpZW50X3R5cGVzKToKKyAgICAgICAgIyBtdWNoIG9mIHRoZSBhY3R1YWwgd29yayBmb3IgVEhlYWRlclByb3RvY29sIGhhcHBlbnMgZG93biBpbgorICAgICAgICAjIFRIZWFkZXJUcmFuc3BvcnQgc2luY2Ugd2UgbmVlZCB0byBkbyBsb3ctbGV2ZWwgc2hlbmFuaWdhbnMgdG8gZGV0ZWN0CisgICAgICAgICMgaWYgdGhlIGNsaWVudCBpcyBzZW5kaW5nIHVzIGhlYWRlcnMgb3Igb25lIG9mIHRoZSBoZWFkZXJsZXNzIGZvcm1hdHMKKyAgICAgICAgIyB3ZSBzdXBwb3J0LiB0aGlzIHdyYXBzIHRoZSByZWFsIHRyYW5zcG9ydCB3aXRoIHRoZSBvbmUgdGhhdCBkb2VzIGFsbAorICAgICAgICAjIHRoZSBtYWdpYy4KKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodHJhbnNwb3J0LCBUSGVhZGVyVHJhbnNwb3J0KToKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IFRIZWFkZXJUcmFuc3BvcnQodHJhbnNwb3J0LCBhbGxvd2VkX2NsaWVudF90eXBlcykKKyAgICAgICAgc3VwZXIoVEhlYWRlclByb3RvY29sLCBzZWxmKS5fX2luaXRfXyh0cmFuc3BvcnQpCisgICAgICAgIHNlbGYuX3NldF9wcm90b2NvbCgpCisKKyAgICBkZWYgZ2V0X2hlYWRlcnMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRyYW5zLmdldF9oZWFkZXJzKCkKKworICAgIGRlZiBzZXRfaGVhZGVyKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICBzZWxmLnRyYW5zLnNldF9oZWFkZXIoa2V5LCB2YWx1ZSkKKworICAgIGRlZiBjbGVhcl9oZWFkZXJzKHNlbGYpOgorICAgICAgICBzZWxmLnRyYW5zLmNsZWFyX2hlYWRlcnMoKQorCisgICAgZGVmIGFkZF90cmFuc2Zvcm0oc2VsZiwgdHJhbnNmb3JtX2lkKToKKyAgICAgICAgc2VsZi50cmFucy5hZGRfdHJhbnNmb3JtKHRyYW5zZm9ybV9pZCkKKworICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0dHlwZSwgc2VxaWQpOgorICAgICAgICBzZWxmLnRyYW5zLnNlcXVlbmNlX2lkID0gc2VxaWQKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHR0eXBlLCBzZXFpZCkKKworICAgIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKQorCisgICAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKG5hbWUpCisKKyAgICBkZWYgd3JpdGVTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZVN0cnVjdEVuZCgpCisKKyAgICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBmaWQpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVGaWVsZEJlZ2luKG5hbWUsIHR0eXBlLCBmaWQpCisKKyAgICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlRmllbGRFbmQoKQorCisgICAgZGVmIHdyaXRlRmllbGRTdG9wKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVGaWVsZFN0b3AoKQorCisgICAgZGVmIHdyaXRlTWFwQmVnaW4oc2VsZiwga3R5cGUsIHZ0eXBlLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTWFwQmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKQorCisgICAgZGVmIHdyaXRlTWFwRW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVNYXBFbmQoKQorCisgICAgZGVmIHdyaXRlTGlzdEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTGlzdEJlZ2luKGV0eXBlLCBzaXplKQorCisgICAgZGVmIHdyaXRlTGlzdEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTGlzdEVuZCgpCisKKyAgICBkZWYgd3JpdGVTZXRCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZVNldEJlZ2luKGV0eXBlLCBzaXplKQorCisgICAgZGVmIHdyaXRlU2V0RW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVTZXRFbmQoKQorCisgICAgZGVmIHdyaXRlQm9vbChzZWxmLCBib29sX3ZhbCk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUJvb2woYm9vbF92YWwpCisKKyAgICBkZWYgd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVCeXRlKGJ5dGUpCisKKyAgICBkZWYgd3JpdGVJMTYoc2VsZiwgaTE2KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlSTE2KGkxNikKKworICAgIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVJMzIoaTMyKQorCisgICAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUk2NChpNjQpCisKKyAgICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZHViKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlRG91YmxlKGR1YikKKworICAgIGRlZiB3cml0ZUJpbmFyeShzZWxmLCBzdHJfdmFsKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlQmluYXJ5KHN0cl92YWwpCisKKyAgICBkZWYgX3NldF9wcm90b2NvbChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJvdG9jb2xfY2xzID0gUFJPVE9DT0xTX0JZX0lEW3NlbGYudHJhbnMucHJvdG9jb2xfaWRdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAiVW5rbm93biBwcm90b2NvbCByZXF1ZXN0ZWQuIiwKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLl9wcm90b2NvbCA9IHByb3RvY29sX2NscyhzZWxmLnRyYW5zKQorICAgICAgICBzZWxmLl9mYXN0X2VuY29kZSA9IHNlbGYuX3Byb3RvY29sLl9mYXN0X2VuY29kZQorICAgICAgICBzZWxmLl9mYXN0X2RlY29kZSA9IHNlbGYuX3Byb3RvY29sLl9mYXN0X2RlY29kZQorCisgICAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudHJhbnMucmVhZEZyYW1lKDApCisgICAgICAgICAgICBzZWxmLl9zZXRfcHJvdG9jb2woKQorICAgICAgICBleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFzIGV4YzoKKyAgICAgICAgICAgIHNlbGYuX3Byb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKGIiIiwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgMCkKKyAgICAgICAgICAgIGV4Yy53cml0ZShzZWxmLl9wcm90b2NvbCkKKyAgICAgICAgICAgIHNlbGYuX3Byb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpCisgICAgICAgICAgICBzZWxmLnRyYW5zLmZsdXNoKCkKKworICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpCisKKyAgICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpCisKKyAgICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZFN0cnVjdEJlZ2luKCkKKworICAgIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZFN0cnVjdEVuZCgpCisKKyAgICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkRmllbGRCZWdpbigpCisKKyAgICBkZWYgcmVhZEZpZWxkRW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZEZpZWxkRW5kKCkKKworICAgIGRlZiByZWFkTWFwQmVnaW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTWFwQmVnaW4oKQorCisgICAgZGVmIHJlYWRNYXBFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTWFwRW5kKCkKKworICAgIGRlZiByZWFkTGlzdEJlZ2luKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZExpc3RCZWdpbigpCisKKyAgICBkZWYgcmVhZExpc3RFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTGlzdEVuZCgpCisKKyAgICBkZWYgcmVhZFNldEJlZ2luKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZFNldEJlZ2luKCkKKworICAgIGRlZiByZWFkU2V0RW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZFNldEVuZCgpCisKKyAgICBkZWYgcmVhZEJvb2woc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkQm9vbCgpCisKKyAgICBkZWYgcmVhZEJ5dGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkQnl0ZSgpCisKKyAgICBkZWYgcmVhZEkxNihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRJMTYoKQorCisgICAgZGVmIHJlYWRJMzIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkSTMyKCkKKworICAgIGRlZiByZWFkSTY0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZEk2NCgpCisKKyAgICBkZWYgcmVhZERvdWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWREb3VibGUoKQorCisgICAgZGVmIHJlYWRCaW5hcnkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkQmluYXJ5KCkKKworCitjbGFzcyBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFsbG93ZWRfY2xpZW50X3R5cGVzPShUSGVhZGVyQ2xpZW50VHlwZS5IRUFERVJTLCkpOgorICAgICAgICBzZWxmLmFsbG93ZWRfY2xpZW50X3R5cGVzID0gYWxsb3dlZF9jbGllbnRfdHlwZXMKKworICAgIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiBUSGVhZGVyUHJvdG9jb2wodHJhbnMsIHNlbGYuYWxsb3dlZF9jbGllbnRfdHlwZXMpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RKU09OUHJvdG9jb2wucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RKU09OUHJvdG9jb2wucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyMDk5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5weQpAQCAtMCwwICsxLDY3NyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gLlRQcm90b2NvbCBpbXBvcnQgKFRUeXBlLCBUUHJvdG9jb2xCYXNlLCBUUHJvdG9jb2xFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMpCitpbXBvcnQgYmFzZTY0CitpbXBvcnQgbWF0aAoraW1wb3J0IHN5cworCitmcm9tIC4uY29tcGF0IGltcG9ydCBzdHJfdG9fYmluYXJ5CisKKworX19hbGxfXyA9IFsnVEpTT05Qcm90b2NvbCcsCisgICAgICAgICAgICdUSlNPTlByb3RvY29sRmFjdG9yeScsCisgICAgICAgICAgICdUU2ltcGxlSlNPTlByb3RvY29sJywKKyAgICAgICAgICAgJ1RTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5J10KKworVkVSU0lPTiA9IDEKKworQ09NTUEgPSBiJywnCitDT0xPTiA9IGInOicKK0xCUkFDRSA9IGIneycKK1JCUkFDRSA9IGInfScKK0xCUkFDS0VUID0gYidbJworUkJSQUNLRVQgPSBiJ10nCitRVU9URSA9IGInIicKK0JBQ0tTTEFTSCA9IGInXFwnCitaRVJPID0gYicwJworCitFU0NTRVEwID0gb3JkKCdcXCcpCitFU0NTRVExID0gb3JkKCd1JykKK0VTQ0FQRV9DSEFSX1ZBTFMgPSB7CisgICAgJyInOiAnXFwiJywKKyAgICAnXFwnOiAnXFxcXCcsCisgICAgJ1xiJzogJ1xcYicsCisgICAgJ1xmJzogJ1xcZicsCisgICAgJ1xuJzogJ1xcbicsCisgICAgJ1xyJzogJ1xccicsCisgICAgJ1x0JzogJ1xcdCcsCisgICAgIyAnLyc6ICdcXC8nLAorfQorRVNDQVBFX0NIQVJTID0geworICAgIGInIic6ICciJywKKyAgICBiJ1xcJzogJ1xcJywKKyAgICBiJ2InOiAnXGInLAorICAgIGInZic6ICdcZicsCisgICAgYiduJzogJ1xuJywKKyAgICBiJ3InOiAnXHInLAorICAgIGIndCc6ICdcdCcsCisgICAgYicvJzogJy8nLAorfQorTlVNRVJJQ19DSEFSID0gYicrLS4wMTIzNDU2Nzg5RWUnCisKK0NUWVBFUyA9IHsKKyAgICBUVHlwZS5CT09MOiAndGYnLAorICAgIFRUeXBlLkJZVEU6ICdpOCcsCisgICAgVFR5cGUuSTE2OiAnaTE2JywKKyAgICBUVHlwZS5JMzI6ICdpMzInLAorICAgIFRUeXBlLkk2NDogJ2k2NCcsCisgICAgVFR5cGUuRE9VQkxFOiAnZGJsJywKKyAgICBUVHlwZS5TVFJJTkc6ICdzdHInLAorICAgIFRUeXBlLlNUUlVDVDogJ3JlYycsCisgICAgVFR5cGUuTElTVDogJ2xzdCcsCisgICAgVFR5cGUuU0VUOiAnc2V0JywKKyAgICBUVHlwZS5NQVA6ICdtYXAnLAorfQorCitKVFlQRVMgPSB7fQorZm9yIGtleSBpbiBDVFlQRVMua2V5cygpOgorICAgIEpUWVBFU1tDVFlQRVNba2V5XV0gPSBrZXkKKworCitjbGFzcyBKU09OQmFzZUNvbnRleHQob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCk6CisgICAgICAgIHNlbGYucHJvdG9jb2wgPSBwcm90b2NvbAorICAgICAgICBzZWxmLmZpcnN0ID0gVHJ1ZQorCisgICAgZGVmIGRvSU8oc2VsZiwgZnVuY3Rpb24pOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgd3JpdGUoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiByZWFkKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZXNjYXBlTnVtKHNlbGYpOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworCitjbGFzcyBKU09OTGlzdENvbnRleHQoSlNPTkJhc2VDb250ZXh0KToKKworICAgIGRlZiBkb0lPKHNlbGYsIGZ1bmN0aW9uKToKKyAgICAgICAgaWYgc2VsZi5maXJzdCBpcyBUcnVlOgorICAgICAgICAgICAgc2VsZi5maXJzdCA9IEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmdW5jdGlvbihDT01NQSkKKworICAgIGRlZiB3cml0ZShzZWxmKToKKyAgICAgICAgc2VsZi5kb0lPKHNlbGYucHJvdG9jb2wudHJhbnMud3JpdGUpCisKKyAgICBkZWYgcmVhZChzZWxmKToKKyAgICAgICAgc2VsZi5kb0lPKHNlbGYucHJvdG9jb2wucmVhZEpTT05TeW50YXhDaGFyKQorCisKK2NsYXNzIEpTT05QYWlyQ29udGV4dChKU09OQmFzZUNvbnRleHQpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sKToKKyAgICAgICAgc3VwZXIoSlNPTlBhaXJDb250ZXh0LCBzZWxmKS5fX2luaXRfXyhwcm90b2NvbCkKKyAgICAgICAgc2VsZi5jb2xvbiA9IFRydWUKKworICAgIGRlZiBkb0lPKHNlbGYsIGZ1bmN0aW9uKToKKyAgICAgICAgaWYgc2VsZi5maXJzdDoKKyAgICAgICAgICAgIHNlbGYuZmlyc3QgPSBGYWxzZQorICAgICAgICAgICAgc2VsZi5jb2xvbiA9IFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZ1bmN0aW9uKENPTE9OIGlmIHNlbGYuY29sb24gZWxzZSBDT01NQSkKKyAgICAgICAgICAgIHNlbGYuY29sb24gPSBub3Qgc2VsZi5jb2xvbgorCisgICAgZGVmIHdyaXRlKHNlbGYpOgorICAgICAgICBzZWxmLmRvSU8oc2VsZi5wcm90b2NvbC50cmFucy53cml0ZSkKKworICAgIGRlZiByZWFkKHNlbGYpOgorICAgICAgICBzZWxmLmRvSU8oc2VsZi5wcm90b2NvbC5yZWFkSlNPTlN5bnRheENoYXIpCisKKyAgICBkZWYgZXNjYXBlTnVtKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jb2xvbgorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAnJXMsIGNvbG9uPSVzJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5jb2xvbikKKworCitjbGFzcyBMb29rYWhlYWRSZWFkZXIoKToKKyAgICBoYXNEYXRhID0gRmFsc2UKKyAgICBkYXRhID0gJycKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCk6CisgICAgICAgIHNlbGYucHJvdG9jb2wgPSBwcm90b2NvbAorCisgICAgZGVmIHJlYWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaGFzRGF0YSBpcyBUcnVlOgorICAgICAgICAgICAgc2VsZi5oYXNEYXRhID0gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYucHJvdG9jb2wudHJhbnMucmVhZCgxKQorICAgICAgICByZXR1cm4gc2VsZi5kYXRhCisKKyAgICBkZWYgcGVlayhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5oYXNEYXRhIGlzIEZhbHNlOgorICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5wcm90b2NvbC50cmFucy5yZWFkKDEpCisgICAgICAgIHNlbGYuaGFzRGF0YSA9IFRydWUKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YQorCisKK2NsYXNzIFRKU09OUHJvdG9jb2xCYXNlKFRQcm90b2NvbEJhc2UpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zKToKKyAgICAgICAgVFByb3RvY29sQmFzZS5fX2luaXRfXyhzZWxmLCB0cmFucykKKyAgICAgICAgc2VsZi5yZXNldFdyaXRlQ29udGV4dCgpCisgICAgICAgIHNlbGYucmVzZXRSZWFkQ29udGV4dCgpCisKKyAgICAjIFdlIGRvbid0IGhhdmUgbGVuZ3RoIGxpbWl0IGltcGxlbWVudGF0aW9uIGZvciBKU09OIHByb3RvY29scworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBzdHJpbmdfbGVuZ3RoX2xpbWl0KHNlbmYpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQoc2VuZik6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgcmVzZXRXcml0ZUNvbnRleHQoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dCA9IEpTT05CYXNlQ29udGV4dChzZWxmKQorICAgICAgICBzZWxmLmNvbnRleHRTdGFjayA9IFtzZWxmLmNvbnRleHRdCisKKyAgICBkZWYgcmVzZXRSZWFkQ29udGV4dChzZWxmKToKKyAgICAgICAgc2VsZi5yZXNldFdyaXRlQ29udGV4dCgpCisgICAgICAgIHNlbGYucmVhZGVyID0gTG9va2FoZWFkUmVhZGVyKHNlbGYpCisKKyAgICBkZWYgcHVzaENvbnRleHQoc2VsZiwgY3R4KToKKyAgICAgICAgc2VsZi5jb250ZXh0U3RhY2suYXBwZW5kKGN0eCkKKyAgICAgICAgc2VsZi5jb250ZXh0ID0gY3R4CisKKyAgICBkZWYgcG9wQ29udGV4dChzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0U3RhY2sucG9wKCkKKyAgICAgICAgaWYgc2VsZi5jb250ZXh0U3RhY2s6CisgICAgICAgICAgICBzZWxmLmNvbnRleHQgPSBzZWxmLmNvbnRleHRTdGFja1stMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY29udGV4dCA9IEpTT05CYXNlQ29udGV4dChzZWxmKQorCisgICAgZGVmIHdyaXRlSlNPTlN0cmluZyhzZWxmLCBzdHJpbmcpOgorICAgICAgICBzZWxmLmNvbnRleHQud3JpdGUoKQorICAgICAgICBqc29uX3N0ciA9IFsnIiddCisgICAgICAgIGZvciBzIGluIHN0cmluZzoKKyAgICAgICAgICAgIGVzY2FwZWQgPSBFU0NBUEVfQ0hBUl9WQUxTLmdldChzLCBzKQorICAgICAgICAgICAganNvbl9zdHIuYXBwZW5kKGVzY2FwZWQpCisgICAgICAgIGpzb25fc3RyLmFwcGVuZCgnIicpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoc3RyX3RvX2JpbmFyeSgnJy5qb2luKGpzb25fc3RyKSkpCisKKyAgICBkZWYgd3JpdGVKU09OTnVtYmVyKHNlbGYsIG51bWJlciwgZm9ybWF0dGVyPSd7MH0nKToKKyAgICAgICAgc2VsZi5jb250ZXh0LndyaXRlKCkKKyAgICAgICAganNOdW1iZXIgPSBzdHIoZm9ybWF0dGVyLmZvcm1hdChudW1iZXIpKS5lbmNvZGUoJ2FzY2lpJykKKyAgICAgICAgaWYgc2VsZi5jb250ZXh0LmVzY2FwZU51bSgpOgorICAgICAgICAgICAgc2VsZi50cmFucy53cml0ZShRVU9URSkKKyAgICAgICAgICAgIHNlbGYudHJhbnMud3JpdGUoanNOdW1iZXIpCisgICAgICAgICAgICBzZWxmLnRyYW5zLndyaXRlKFFVT1RFKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50cmFucy53cml0ZShqc051bWJlcikKKworICAgIGRlZiB3cml0ZUpTT05CYXNlNjQoc2VsZiwgYmluYXJ5KToKKyAgICAgICAgc2VsZi5jb250ZXh0LndyaXRlKCkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShRVU9URSkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShiYXNlNjQuYjY0ZW5jb2RlKGJpbmFyeSkpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoUVVPVEUpCisKKyAgICBkZWYgd3JpdGVKU09OT2JqZWN0U3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dC53cml0ZSgpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoTEJSQUNFKQorICAgICAgICBzZWxmLnB1c2hDb250ZXh0KEpTT05QYWlyQ29udGV4dChzZWxmKSkKKworICAgIGRlZiB3cml0ZUpTT05PYmplY3RFbmQoc2VsZik6CisgICAgICAgIHNlbGYucG9wQ29udGV4dCgpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoUkJSQUNFKQorCisgICAgZGVmIHdyaXRlSlNPTkFycmF5U3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dC53cml0ZSgpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoTEJSQUNLRVQpCisgICAgICAgIHNlbGYucHVzaENvbnRleHQoSlNPTkxpc3RDb250ZXh0KHNlbGYpKQorCisgICAgZGVmIHdyaXRlSlNPTkFycmF5RW5kKHNlbGYpOgorICAgICAgICBzZWxmLnBvcENvbnRleHQoKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKFJCUkFDS0VUKQorCisgICAgZGVmIHJlYWRKU09OU3ludGF4Q2hhcihzZWxmLCBjaGFyYWN0ZXIpOgorICAgICAgICBjdXJyZW50ID0gc2VsZi5yZWFkZXIucmVhZCgpCisgICAgICAgIGlmIGNoYXJhY3RlciAhPSBjdXJyZW50OgorICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgY2hhcmFjdGVyOiAlcyIgJSBjdXJyZW50KQorCisgICAgZGVmIF9pc0hpZ2hTdXJyb2dhdGUoc2VsZiwgY29kZXVuaXQpOgorICAgICAgICByZXR1cm4gY29kZXVuaXQgPj0gMHhkODAwIGFuZCBjb2RldW5pdCA8PSAweGRiZmYKKworICAgIGRlZiBfaXNMb3dTdXJyb2dhdGUoc2VsZiwgY29kZXVuaXQpOgorICAgICAgICByZXR1cm4gY29kZXVuaXQgPj0gMHhkYzAwIGFuZCBjb2RldW5pdCA8PSAweGRmZmYKKworICAgIGRlZiBfdG9DaGFyKHNlbGYsIGhpZ2gsIGxvdz1Ob25lKToKKyAgICAgICAgaWYgbm90IGxvdzoKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gKCJcXHUlMDR4IiAlIGhpZ2gpLmRlY29kZSgndW5pY29kZS1lc2NhcGUnKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNocihoaWdoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29kZXBvaW50ID0gKDEgPDwgMTYpICsgKChoaWdoICYgMHgzZmYpIDw8IDEwKQorICAgICAgICAgICAgY29kZXBvaW50ICs9IGxvdyAmIDB4M2ZmCisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CisgICAgICAgICAgICAgICAgcyA9ICJcXFUlMDh4IiAlIGNvZGVwb2ludAorICAgICAgICAgICAgICAgIHJldHVybiBzLmRlY29kZSgndW5pY29kZS1lc2NhcGUnKS5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNocihjb2RlcG9pbnQpCisKKyAgICBkZWYgcmVhZEpTT05TdHJpbmcoc2VsZiwgc2tpcENvbnRleHQpOgorICAgICAgICBoaWdoU3Vycm9nYXRlID0gTm9uZQorICAgICAgICBzdHJpbmcgPSBbXQorICAgICAgICBpZiBza2lwQ29udGV4dCBpcyBGYWxzZToKKyAgICAgICAgICAgIHNlbGYuY29udGV4dC5yZWFkKCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBjaGFyYWN0ZXIgPSBzZWxmLnJlYWRlci5yZWFkKCkKKyAgICAgICAgICAgIGlmIGNoYXJhY3RlciA9PSBRVU9URToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgb3JkKGNoYXJhY3RlcikgPT0gRVNDU0VRMDoKKyAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSBzZWxmLnJlYWRlci5yZWFkKCkKKyAgICAgICAgICAgICAgICBpZiBvcmQoY2hhcmFjdGVyKSA9PSBFU0NTRVExOgorICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSBzZWxmLnRyYW5zLnJlYWQoNCkuZGVjb2RlKCdhc2NpaScpCisgICAgICAgICAgICAgICAgICAgIGNvZGV1bml0ID0gaW50KGNoYXJhY3RlciwgMTYpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX2lzSGlnaFN1cnJvZ2F0ZShjb2RldW5pdCk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBoaWdoU3Vycm9nYXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpCisgICAgICAgICAgICAgICAgICAgICAgICBoaWdoU3Vycm9nYXRlID0gY29kZXVuaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5faXNMb3dTdXJyb2dhdGUoY29kZXVuaXQpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGhpZ2hTdXJyb2dhdGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgaGlnaCBzdXJyb2dhdGUgY2hhciIpCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSBzZWxmLl90b0NoYXIoaGlnaFN1cnJvZ2F0ZSwgY29kZXVuaXQpCisgICAgICAgICAgICAgICAgICAgICAgICBoaWdoU3Vycm9nYXRlID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gc2VsZi5fdG9DaGFyKGNvZGV1bml0KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIGNoYXJhY3RlciBub3QgaW4gRVNDQVBFX0NIQVJTOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciIpCisgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IEVTQ0FQRV9DSEFSU1tjaGFyYWN0ZXJdCisgICAgICAgICAgICBlbGlmIGNoYXJhY3RlciBpbiBFU0NBUEVfQ0hBUl9WQUxTOgorICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5lc2NhcGVkIGNvbnRyb2wgY2hhciIpCisgICAgICAgICAgICBlbGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPiAyOgorICAgICAgICAgICAgICAgIHV0ZjhfYnl0ZXMgPSBieXRlYXJyYXkoW29yZChjaGFyYWN0ZXIpXSkKKyAgICAgICAgICAgICAgICB3aGlsZSBvcmQoc2VsZi5yZWFkZXIucGVlaygpKSA+PSAweDgwOgorICAgICAgICAgICAgICAgICAgICB1dGY4X2J5dGVzLmFwcGVuZChvcmQoc2VsZi5yZWFkZXIucmVhZCgpKSkKKyAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSB1dGY4X2J5dGVzLmRlY29kZSgndXRmOCcpCisgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKGNoYXJhY3RlcikKKworICAgICAgICAgICAgaWYgaGlnaFN1cnJvZ2F0ZToKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpCisgICAgICAgIHJldHVybiAnJy5qb2luKHN0cmluZykKKworICAgIGRlZiBpc0pTT05OdW1lcmljKHNlbGYsIGNoYXJhY3Rlcik6CisgICAgICAgIHJldHVybiAoVHJ1ZSBpZiBOVU1FUklDX0NIQVIuZmluZChjaGFyYWN0ZXIpICE9IC0gMSBlbHNlIEZhbHNlKQorCisgICAgZGVmIHJlYWRKU09OUXVvdGVzKHNlbGYpOgorICAgICAgICBpZiAoc2VsZi5jb250ZXh0LmVzY2FwZU51bSgpKToKKyAgICAgICAgICAgIHNlbGYucmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKQorCisgICAgZGVmIHJlYWRKU09OTnVtZXJpY0NoYXJzKHNlbGYpOgorICAgICAgICBudW1lcmljID0gW10KKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGNoYXJhY3RlciA9IHNlbGYucmVhZGVyLnBlZWsoKQorICAgICAgICAgICAgaWYgc2VsZi5pc0pTT05OdW1lcmljKGNoYXJhY3RlcikgaXMgRmFsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIG51bWVyaWMuYXBwZW5kKHNlbGYucmVhZGVyLnJlYWQoKSkKKyAgICAgICAgcmV0dXJuIGInJy5qb2luKG51bWVyaWMpLmRlY29kZSgnYXNjaWknKQorCisgICAgZGVmIHJlYWRKU09OSW50ZWdlcihzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0LnJlYWQoKQorICAgICAgICBzZWxmLnJlYWRKU09OUXVvdGVzKCkKKyAgICAgICAgbnVtZXJpYyA9IHNlbGYucmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICAgICAgICBzZWxmLnJlYWRKU09OUXVvdGVzKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGludChudW1lcmljKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIikKKworICAgIGRlZiByZWFkSlNPTkRvdWJsZShzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0LnJlYWQoKQorICAgICAgICBpZiBzZWxmLnJlYWRlci5wZWVrKCkgPT0gUVVPVEU6CisgICAgICAgICAgICBzdHJpbmcgPSBzZWxmLnJlYWRKU09OU3RyaW5nKFRydWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZG91YmxlID0gZmxvYXQoc3RyaW5nKQorICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRleHQuZXNjYXBlTnVtIGlzIEZhbHNlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgbm90IG1hdGguaXNpbmYoZG91YmxlKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBtYXRoLmlzbmFuKGRvdWJsZSkpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gZG91YmxlCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5jb250ZXh0LmVzY2FwZU51bSgpIGlzIFRydWU6CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0KHNlbGYucmVhZEpTT05OdW1lcmljQ2hhcnMoKSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpCisKKyAgICBkZWYgcmVhZEpTT05CYXNlNjQoc2VsZik6CisgICAgICAgIHN0cmluZyA9IHNlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpCisgICAgICAgIHNpemUgPSBsZW4oc3RyaW5nKQorICAgICAgICBtID0gc2l6ZSAlIDQKKyAgICAgICAgIyBGb3JjZSBwYWRkaW5nIHNpbmNlIGI2NGVuY29kZSBtZXRob2QgZG9lcyBub3QgYWxsb3cgaXQKKyAgICAgICAgaWYgbSAhPSAwOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNCAtIG0pOgorICAgICAgICAgICAgICAgIHN0cmluZyArPSAnPScKKyAgICAgICAgcmV0dXJuIGJhc2U2NC5iNjRkZWNvZGUoc3RyaW5nKQorCisgICAgZGVmIHJlYWRKU09OT2JqZWN0U3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dC5yZWFkKCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoTEJSQUNFKQorICAgICAgICBzZWxmLnB1c2hDb250ZXh0KEpTT05QYWlyQ29udGV4dChzZWxmKSkKKworICAgIGRlZiByZWFkSlNPTk9iamVjdEVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUkJSQUNFKQorICAgICAgICBzZWxmLnBvcENvbnRleHQoKQorCisgICAgZGVmIHJlYWRKU09OQXJyYXlTdGFydChzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0LnJlYWQoKQorICAgICAgICBzZWxmLnJlYWRKU09OU3ludGF4Q2hhcihMQlJBQ0tFVCkKKyAgICAgICAgc2VsZi5wdXNoQ29udGV4dChKU09OTGlzdENvbnRleHQoc2VsZikpCisKKyAgICBkZWYgcmVhZEpTT05BcnJheUVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUkJSQUNLRVQpCisgICAgICAgIHNlbGYucG9wQ29udGV4dCgpCisKKworY2xhc3MgVEpTT05Qcm90b2NvbChUSlNPTlByb3RvY29sQmFzZSk6CisKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgc2VsZi5yZXNldFJlYWRDb250ZXh0KCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTkFycmF5U3RhcnQoKQorICAgICAgICBpZiBzZWxmLnJlYWRKU09OSW50ZWdlcigpICE9IFZFUlNJT046CisgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKQorICAgICAgICBuYW1lID0gc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSkKKyAgICAgICAgdHlwZW4gPSBzZWxmLnJlYWRKU09OSW50ZWdlcigpCisgICAgICAgIHNlcWlkID0gc2VsZi5yZWFkSlNPTkludGVnZXIoKQorICAgICAgICByZXR1cm4gKG5hbWUsIHR5cGVuLCBzZXFpZCkKKworICAgIGRlZiByZWFkTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTkFycmF5RW5kKCkKKworICAgIGRlZiByZWFkU3RydWN0QmVnaW4oc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05PYmplY3RTdGFydCgpCisKKyAgICBkZWYgcmVhZFN0cnVjdEVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTk9iamVjdEVuZCgpCisKKyAgICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6CisgICAgICAgIGNoYXJhY3RlciA9IHNlbGYucmVhZGVyLnBlZWsoKQorICAgICAgICB0dHlwZSA9IDAKKyAgICAgICAgaWQgPSAwCisgICAgICAgIGlmIGNoYXJhY3RlciA9PSBSQlJBQ0U6CisgICAgICAgICAgICB0dHlwZSA9IFRUeXBlLlNUT1AKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlkID0gc2VsZi5yZWFkSlNPTkludGVnZXIoKQorICAgICAgICAgICAgc2VsZi5yZWFkSlNPTk9iamVjdFN0YXJ0KCkKKyAgICAgICAgICAgIHR0eXBlID0gSlRZUEVTW3NlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpXQorICAgICAgICByZXR1cm4gKE5vbmUsIHR0eXBlLCBpZCkKKworICAgIGRlZiByZWFkRmllbGRFbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05PYmplY3RFbmQoKQorCisgICAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTkFycmF5U3RhcnQoKQorICAgICAgICBrZXlUeXBlID0gSlRZUEVTW3NlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpXQorICAgICAgICB2YWx1ZVR5cGUgPSBKVFlQRVNbc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSldCisgICAgICAgIHNpemUgPSBzZWxmLnJlYWRKU09OSW50ZWdlcigpCisgICAgICAgIHNlbGYucmVhZEpTT05PYmplY3RTdGFydCgpCisgICAgICAgIHJldHVybiAoa2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplKQorCisgICAgZGVmIHJlYWRNYXBFbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05PYmplY3RFbmQoKQorICAgICAgICBzZWxmLnJlYWRKU09OQXJyYXlFbmQoKQorCisgICAgZGVmIHJlYWRDb2xsZWN0aW9uQmVnaW4oc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAgZWxlbVR5cGUgPSBKVFlQRVNbc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSldCisgICAgICAgIHNpemUgPSBzZWxmLnJlYWRKU09OSW50ZWdlcigpCisgICAgICAgIHJldHVybiAoZWxlbVR5cGUsIHNpemUpCisgICAgcmVhZExpc3RCZWdpbiA9IHJlYWRDb2xsZWN0aW9uQmVnaW4KKyAgICByZWFkU2V0QmVnaW4gPSByZWFkQ29sbGVjdGlvbkJlZ2luCisKKyAgICBkZWYgcmVhZENvbGxlY3Rpb25FbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05BcnJheUVuZCgpCisgICAgcmVhZFNldEVuZCA9IHJlYWRDb2xsZWN0aW9uRW5kCisgICAgcmVhZExpc3RFbmQgPSByZWFkQ29sbGVjdGlvbkVuZAorCisgICAgZGVmIHJlYWRCb29sKHNlbGYpOgorICAgICAgICByZXR1cm4gKEZhbHNlIGlmIHNlbGYucmVhZEpTT05JbnRlZ2VyKCkgPT0gMCBlbHNlIFRydWUpCisKKyAgICBkZWYgcmVhZE51bWJlcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZEpTT05JbnRlZ2VyKCkKKyAgICByZWFkQnl0ZSA9IHJlYWROdW1iZXIKKyAgICByZWFkSTE2ID0gcmVhZE51bWJlcgorICAgIHJlYWRJMzIgPSByZWFkTnVtYmVyCisgICAgcmVhZEk2NCA9IHJlYWROdW1iZXIKKworICAgIGRlZiByZWFkRG91YmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yZWFkSlNPTkRvdWJsZSgpCisKKyAgICBkZWYgcmVhZFN0cmluZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpCisKKyAgICBkZWYgcmVhZEJpbmFyeShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZEpTT05CYXNlNjQoKQorCisgICAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHJlcXVlc3RfdHlwZSwgc2VxaWQpOgorICAgICAgICBzZWxmLnJlc2V0V3JpdGVDb250ZXh0KCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoVkVSU0lPTikKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcobmFtZSkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIocmVxdWVzdF90eXBlKQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihzZXFpZCkKKworICAgIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlFbmQoKQorCisgICAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0U3RhcnQoKQorCisgICAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCisKKyAgICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBpZCk6CisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGlkKQorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdFN0YXJ0KCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcoQ1RZUEVTW3R0eXBlXSkKKworICAgIGRlZiB3cml0ZUZpZWxkRW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCisKKyAgICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlTdGFydCgpCisgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKENUWVBFU1trdHlwZV0pCisgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKENUWVBFU1t2dHlwZV0pCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKHNpemUpCisgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0U3RhcnQoKQorCisgICAgZGVmIHdyaXRlTWFwRW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlFbmQoKQorCisgICAgZGVmIHdyaXRlTGlzdEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcoQ1RZUEVTW2V0eXBlXSkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoc2l6ZSkKKworICAgIGRlZiB3cml0ZUxpc3RFbmQoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlFbmQoKQorCisgICAgZGVmIHdyaXRlU2V0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5U3RhcnQoKQorICAgICAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhDVFlQRVNbZXR5cGVdKQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihzaXplKQorCisgICAgZGVmIHdyaXRlU2V0RW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5RW5kKCkKKworICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbGVhbik6CisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKDEgaWYgYm9vbGVhbiBpcyBUcnVlIGVsc2UgMCkKKworICAgIGRlZiB3cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6CisgICAgICAgIGNoZWNrSW50ZWdlckxpbWl0cyhieXRlLCA4KQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihieXRlKQorCisgICAgZGVmIHdyaXRlSTE2KHNlbGYsIGkxNik6CisgICAgICAgIGNoZWNrSW50ZWdlckxpbWl0cyhpMTYsIDE2KQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihpMTYpCisKKyAgICBkZWYgd3JpdGVJMzIoc2VsZiwgaTMyKToKKyAgICAgICAgY2hlY2tJbnRlZ2VyTGltaXRzKGkzMiwgMzIpCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGkzMikKKworICAgIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgorICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMoaTY0LCA2NCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoaTY0KQorCisgICAgZGVmIHdyaXRlRG91YmxlKHNlbGYsIGRibCk6CisgICAgICAgICMgMTcgc2lnbmlmaWNhbnQgZGlnaXRzIHNob3VsZCBiZSBqdXN0IGVub3VnaCBmb3IgYW55IGRvdWJsZSBwcmVjaXNpb24KKyAgICAgICAgIyB2YWx1ZS4KKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoZGJsLCAnezA6LjE3Z30nKQorCisgICAgZGVmIHdyaXRlU3RyaW5nKHNlbGYsIHN0cmluZyk6CisgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKHN0cmluZykKKworICAgIGRlZiB3cml0ZUJpbmFyeShzZWxmLCBiaW5hcnkpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkJhc2U2NChiaW5hcnkpCisKKworY2xhc3MgVEpTT05Qcm90b2NvbEZhY3Rvcnkob2JqZWN0KToKKyAgICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbCh0cmFucykKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBzdHJpbmdfbGVuZ3RoX2xpbWl0KHNlbmYpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQoc2VuZik6CisgICAgICAgIHJldHVybiBOb25lCisKKworY2xhc3MgVFNpbXBsZUpTT05Qcm90b2NvbChUSlNPTlByb3RvY29sQmFzZSk6CisgICAgIiIiU2ltcGxlLCByZWFkYWJsZSwgd3JpdGUtb25seSBKU09OIHByb3RvY29sLgorCisgICAgVXNlZnVsIGZvciBpbnRlcmFjdGluZyB3aXRoIHNjcmlwdGluZyBsYW5ndWFnZXMuCisgICAgIiIiCisKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisKKyAgICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQorCisgICAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisKKyAgICBkZWYgcmVhZFN0cnVjdEVuZChzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisKKyAgICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgcmVxdWVzdF90eXBlLCBzZXFpZCk6CisgICAgICAgIHNlbGYucmVzZXRXcml0ZUNvbnRleHQoKQorCisgICAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0U3RhcnQoKQorCisgICAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCisKKyAgICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBmaWQpOgorICAgICAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhuYW1lKQorCisgICAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0U3RhcnQoKQorCisgICAgZGVmIHdyaXRlTWFwRW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCisKKyAgICBkZWYgX3dyaXRlQ29sbGVjdGlvbkJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheVN0YXJ0KCkKKworICAgIGRlZiBfd3JpdGVDb2xsZWN0aW9uRW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5RW5kKCkKKyAgICB3cml0ZUxpc3RCZWdpbiA9IF93cml0ZUNvbGxlY3Rpb25CZWdpbgorICAgIHdyaXRlTGlzdEVuZCA9IF93cml0ZUNvbGxlY3Rpb25FbmQKKyAgICB3cml0ZVNldEJlZ2luID0gX3dyaXRlQ29sbGVjdGlvbkJlZ2luCisgICAgd3JpdGVTZXRFbmQgPSBfd3JpdGVDb2xsZWN0aW9uRW5kCisKKyAgICBkZWYgd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgorICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMoYnl0ZSwgOCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoYnl0ZSkKKworICAgIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgorICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMoaTE2LCAxNikKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoaTE2KQorCisgICAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6CisgICAgICAgIGNoZWNrSW50ZWdlckxpbWl0cyhpMzIsIDMyKQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihpMzIpCisKKyAgICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKKyAgICAgICAgY2hlY2tJbnRlZ2VyTGltaXRzKGk2NCwgNjQpCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGk2NCkKKworICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbGVhbik6CisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKDEgaWYgYm9vbGVhbiBpcyBUcnVlIGVsc2UgMCkKKworICAgIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkYmwpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihkYmwpCisKKyAgICBkZWYgd3JpdGVTdHJpbmcoc2VsZiwgc3RyaW5nKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcoc3RyaW5nKQorCisgICAgZGVmIHdyaXRlQmluYXJ5KHNlbGYsIGJpbmFyeSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OQmFzZTY0KGJpbmFyeSkKKworCitjbGFzcyBUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeShvYmplY3QpOgorCisgICAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIFRTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjgzOTBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5weQpAQCAtMCwwICsxLDM5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUTWVzc2FnZVR5cGUKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUUHJvdG9jb2xEZWNvcmF0b3IKKworU0VQQVJBVE9SID0gIjoiCisKKworY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2woVFByb3RvY29sRGVjb3JhdG9yLlRQcm90b2NvbERlY29yYXRvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sLCBzZXJ2aWNlTmFtZSk6CisgICAgICAgIHNlbGYuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZQorCisgICAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHR5cGUsIHNlcWlkKToKKyAgICAgICAgaWYgKHR5cGUgPT0gVE1lc3NhZ2VUeXBlLkNBTEwgb3IKKyAgICAgICAgICAgICAgICB0eXBlID09IFRNZXNzYWdlVHlwZS5PTkVXQVkpOgorICAgICAgICAgICAgc3VwZXIoVE11bHRpcGxleGVkUHJvdG9jb2wsIHNlbGYpLndyaXRlTWVzc2FnZUJlZ2luKAorICAgICAgICAgICAgICAgIHNlbGYuc2VydmljZU5hbWUgKyBTRVBBUkFUT1IgKyBuYW1lLAorICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgc2VxaWQKKyAgICAgICAgICAgICkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN1cGVyKFRNdWx0aXBsZXhlZFByb3RvY29sLCBzZWxmKS53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0eXBlLCBzZXFpZCkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2wucHkKaW5kZXggYmUzY2IxNC4uODMxNGNmNiAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2wucHkKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2wucHkKQEAgLTE3LDE4OSArMTcsNDA0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1mcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0ICoKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEV4Y2VwdGlvbiwgVFR5cGUsIFRGcm96ZW5EaWN0Citmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEV4Y2VwdGlvbgorZnJvbSAuLmNvbXBhdCBpbXBvcnQgYmluYXJ5X3RvX3N0ciwgc3RyX3RvX2JpbmFyeQorCitpbXBvcnQgc2l4CitpbXBvcnQgc3lzCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaXNsaWNlCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgemlwCisKIAogY2xhc3MgVFByb3RvY29sRXhjZXB0aW9uKFRFeGNlcHRpb24pOgorICAgICIiIkN1c3RvbSBQcm90b2NvbCBFeGNlcHRpb24gY2xhc3MiIiIKIAotICAiIiJDdXN0b20gUHJvdG9jb2wgRXhjZXB0aW9uIGNsYXNzIiIiCisgICAgVU5LTk9XTiA9IDAKKyAgICBJTlZBTElEX0RBVEEgPSAxCisgICAgTkVHQVRJVkVfU0laRSA9IDIKKyAgICBTSVpFX0xJTUlUID0gMworICAgIEJBRF9WRVJTSU9OID0gNAorICAgIE5PVF9JTVBMRU1FTlRFRCA9IDUKKyAgICBERVBUSF9MSU1JVCA9IDYKKyAgICBJTlZBTElEX1BST1RPQ09MID0gNwogCi0gIFVOS05PV04gPSAwCi0gIElOVkFMSURfREFUQSA9IDEKLSAgTkVHQVRJVkVfU0laRSA9IDIKLSAgU0laRV9MSU1JVCA9IDMKLSAgQkFEX1ZFUlNJT04gPSA0CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGU9VU5LTk9XTiwgbWVzc2FnZT1Ob25lKToKKyAgICAgICAgVEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQorICAgICAgICBzZWxmLnR5cGUgPSB0eXBlCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGU9VU5LTk9XTiwgbWVzc2FnZT1Ob25lKToKLSAgICBURXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCi0gICAgc2VsZi50eXBlID0gdHlwZQogCi1jbGFzcyBUUHJvdG9jb2xCYXNlOgorY2xhc3MgVFByb3RvY29sQmFzZShvYmplY3QpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIFRocmlmdCBwcm90b2NvbCBkcml2ZXIuIiIiCiAKLSAgIiIiQmFzZSBjbGFzcyBmb3IgVGhyaWZ0IHByb3RvY29sIGRyaXZlci4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMpOgorICAgICAgICBzZWxmLnRyYW5zID0gdHJhbnMKKyAgICAgICAgc2VsZi5fZmFzdF9kZWNvZGUgPSBOb25lCisgICAgICAgIHNlbGYuX2Zhc3RfZW5jb2RlID0gTm9uZQogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucyk6Ci0gICAgc2VsZi50cmFucyA9IHRyYW5zCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfY2hlY2tfbGVuZ3RoKGxpbWl0LCBsZW5ndGgpOgorICAgICAgICBpZiBsZW5ndGggPCAwOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOZWdhdGl2ZSBsZW5ndGg6ICVkJyAlIGxlbmd0aCkKKyAgICAgICAgaWYgbGltaXQgaXMgbm90IE5vbmUgYW5kIGxlbmd0aCA+IGxpbWl0OgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlNJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMZW5ndGggZXhjZWVkZWQgbWF4IGFsbG93ZWQ6ICVkJyAlIGxpbWl0KQogCi0gIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBzZXFpZCk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0dHlwZSwgc2VxaWQpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZVN0cnVjdEJlZ2luKHNlbGYsIG5hbWUpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZVN0cnVjdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBpZCk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUZpZWxkQmVnaW4oc2VsZiwgbmFtZSwgdHR5cGUsIGZpZCk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUZpZWxkU3RvcChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVNYXBFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1hcEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUxpc3RCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUxpc3RCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVMaXN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVMaXN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlU2V0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTZXRCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVTZXRFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZVNldEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbCk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbF92YWwpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlQnl0ZShzZWxmLCBieXRlKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlQnl0ZShzZWxmLCBieXRlKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVJMTYoc2VsZiwgaTE2KToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVJMzIoc2VsZiwgaTMyKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkdWIpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZHViKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZVN0cmluZyhzZWxmLCBzdHIpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTdHJpbmcoc2VsZiwgc3RyX3ZhbCk6CisgICAgICAgIHNlbGYud3JpdGVCaW5hcnkoc3RyX3RvX2JpbmFyeShzdHJfdmFsKSkKIAotICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlQmluYXJ5KHNlbGYsIHN0cl92YWwpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVVdGY4KHNlbGYsIHN0cl92YWwpOgorICAgICAgICBzZWxmLndyaXRlU3RyaW5nKHN0cl92YWwuZW5jb2RlKCd1dGY4JykpCiAKLSAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZFN0cnVjdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRGaWVsZEJlZ2luKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZE1hcEJlZ2luKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZE1hcEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkTGlzdEJlZ2luKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZE1hcEJlZ2luKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRMaXN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZE1hcEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkU2V0QmVnaW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTGlzdEJlZ2luKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRTZXRFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTGlzdEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkQm9vbChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRTZXRCZWdpbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkQnl0ZShzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRTZXRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEkxNihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRCb29sKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRJMzIoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkQnl0ZShzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkSTY0KHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEkxNihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkRG91YmxlKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEkzMihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkU3RyaW5nKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEk2NChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBza2lwKHNlbGYsIHR5cGUpOgotICAgIGlmIHR5cGUgPT0gVFR5cGUuU1RPUDoKLSAgICAgIHJldHVybgotICAgIGVsaWYgdHlwZSA9PSBUVHlwZS5CT09MOgotICAgICAgc2VsZi5yZWFkQm9vbCgpCi0gICAgZWxpZiB0eXBlID09IFRUeXBlLkJZVEU6Ci0gICAgICBzZWxmLnJlYWRCeXRlKCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuSTE2OgotICAgICAgc2VsZi5yZWFkSTE2KCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuSTMyOgotICAgICAgc2VsZi5yZWFkSTMyKCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuSTY0OgotICAgICAgc2VsZi5yZWFkSTY0KCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuRE9VQkxFOgotICAgICAgc2VsZi5yZWFkRG91YmxlKCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuU1RSSU5HOgotICAgICAgc2VsZi5yZWFkU3RyaW5nKCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuU1RSVUNUOgotICAgICAgbmFtZSA9IHNlbGYucmVhZFN0cnVjdEJlZ2luKCkKLSAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgIChuYW1lLCB0eXBlLCBpZCkgPSBzZWxmLnJlYWRGaWVsZEJlZ2luKCkKLSAgICAgICAgaWYgdHlwZSA9PSBUVHlwZS5TVE9QOgotICAgICAgICAgIGJyZWFrCi0gICAgICAgIHNlbGYuc2tpcCh0eXBlKQotICAgICAgICBzZWxmLnJlYWRGaWVsZEVuZCgpCi0gICAgICBzZWxmLnJlYWRTdHJ1Y3RFbmQoKQotICAgIGVsaWYgdHlwZSA9PSBUVHlwZS5NQVA6Ci0gICAgICAoa3R5cGUsIHZ0eXBlLCBzaXplKSA9IHNlbGYucmVhZE1hcEJlZ2luKCkKLSAgICAgIGZvciBpIGluIHJhbmdlKHNpemUpOgotICAgICAgICBzZWxmLnNraXAoa3R5cGUpCi0gICAgICAgIHNlbGYuc2tpcCh2dHlwZSkKLSAgICAgIHNlbGYucmVhZE1hcEVuZCgpCi0gICAgZWxpZiB0eXBlID09IFRUeXBlLlNFVDoKLSAgICAgIChldHlwZSwgc2l6ZSkgPSBzZWxmLnJlYWRTZXRCZWdpbigpCi0gICAgICBmb3IgaSBpbiByYW5nZShzaXplKToKLSAgICAgICAgc2VsZi5za2lwKGV0eXBlKQotICAgICAgc2VsZi5yZWFkU2V0RW5kKCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuTElTVDoKLSAgICAgIChldHlwZSwgc2l6ZSkgPSBzZWxmLnJlYWRMaXN0QmVnaW4oKQotICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2l6ZSk6Ci0gICAgICAgIHNlbGYuc2tpcChldHlwZSkKLSAgICAgIHNlbGYucmVhZExpc3RFbmQoKQorICAgIGRlZiByZWFkRG91YmxlKHNlbGYpOgorICAgICAgICBwYXNzCiAKLWNsYXNzIFRQcm90b2NvbEZhY3Rvcnk6Ci0gIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6Ci0gICAgcGFzcworICAgIGRlZiByZWFkU3RyaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gYmluYXJ5X3RvX3N0cihzZWxmLnJlYWRCaW5hcnkoKSkKKworICAgIGRlZiByZWFkQmluYXJ5KHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgcmVhZFV0Zjgoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0ZjgnKQorCisgICAgZGVmIHNraXAoc2VsZiwgdHR5cGUpOgorICAgICAgICBpZiB0dHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuQk9PTDoKKyAgICAgICAgICAgIHNlbGYucmVhZEJvb2woKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLkJZVEU6CisgICAgICAgICAgICBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5JMTY6CisgICAgICAgICAgICBzZWxmLnJlYWRJMTYoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLkkzMjoKKyAgICAgICAgICAgIHNlbGYucmVhZEkzMigpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuSTY0OgorICAgICAgICAgICAgc2VsZi5yZWFkSTY0KCkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5ET1VCTEU6CisgICAgICAgICAgICBzZWxmLnJlYWREb3VibGUoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLlNUUklORzoKKyAgICAgICAgICAgIHNlbGYucmVhZFN0cmluZygpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuU1RSVUNUOgorICAgICAgICAgICAgbmFtZSA9IHNlbGYucmVhZFN0cnVjdEJlZ2luKCkKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgKG5hbWUsIHR0eXBlLCBpZCkgPSBzZWxmLnJlYWRGaWVsZEJlZ2luKCkKKyAgICAgICAgICAgICAgICBpZiB0dHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHNlbGYuc2tpcCh0dHlwZSkKKyAgICAgICAgICAgICAgICBzZWxmLnJlYWRGaWVsZEVuZCgpCisgICAgICAgICAgICBzZWxmLnJlYWRTdHJ1Y3RFbmQoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLk1BUDoKKyAgICAgICAgICAgIChrdHlwZSwgdnR5cGUsIHNpemUpID0gc2VsZi5yZWFkTWFwQmVnaW4oKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2l6ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwKGt0eXBlKQorICAgICAgICAgICAgICAgIHNlbGYuc2tpcCh2dHlwZSkKKyAgICAgICAgICAgIHNlbGYucmVhZE1hcEVuZCgpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuU0VUOgorICAgICAgICAgICAgKGV0eXBlLCBzaXplKSA9IHNlbGYucmVhZFNldEJlZ2luKCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNpemUpOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcChldHlwZSkKKyAgICAgICAgICAgIHNlbGYucmVhZFNldEVuZCgpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuTElTVDoKKyAgICAgICAgICAgIChldHlwZSwgc2l6ZSkgPSBzZWxmLnJlYWRMaXN0QmVnaW4oKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2l6ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwKGV0eXBlKQorICAgICAgICAgICAgc2VsZi5yZWFkTGlzdEVuZCgpCisKKyAgICAjIHR1cGxlIG9mOiAoICdyZWFkZXIgbWV0aG9kJyBuYW1lLCBpc19jb250YWluZXIgYm9vbCwgJ3dyaXRlcl9tZXRob2QnIG5hbWUgKQorICAgIF9UVFlQRV9IQU5ETEVSUyA9ICgKKyAgICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgMCBUVHlwZS5TVE9QCisgICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDEgVFR5cGUuVk9JRCAjIFRPRE86IGhhbmRsZSB2b2lkPworICAgICAgICAoJ3JlYWRCb29sJywgJ3dyaXRlQm9vbCcsIEZhbHNlKSwgICMgMiBUVHlwZS5CT09MCisgICAgICAgICgncmVhZEJ5dGUnLCAnd3JpdGVCeXRlJywgRmFsc2UpLCAgIyAzIFRUeXBlLkJZVEUgYW5kIEkwOAorICAgICAgICAoJ3JlYWREb3VibGUnLCAnd3JpdGVEb3VibGUnLCBGYWxzZSksICAjIDQgVFR5cGUuRE9VQkxFCisgICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDUgdW5kZWZpbmVkCisgICAgICAgICgncmVhZEkxNicsICd3cml0ZUkxNicsIEZhbHNlKSwgICMgNiBUVHlwZS5JMTYKKyAgICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgNyB1bmRlZmluZWQKKyAgICAgICAgKCdyZWFkSTMyJywgJ3dyaXRlSTMyJywgRmFsc2UpLCAgIyA4IFRUeXBlLkkzMgorICAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpLCAgIyA5IHVuZGVmaW5lZAorICAgICAgICAoJ3JlYWRJNjQnLCAnd3JpdGVJNjQnLCBGYWxzZSksICAjIDEwIFRUeXBlLkk2NAorICAgICAgICAoJ3JlYWRTdHJpbmcnLCAnd3JpdGVTdHJpbmcnLCBGYWxzZSksICAjIDExIFRUeXBlLlNUUklORyBhbmQgVVRGNworICAgICAgICAoJ3JlYWRDb250YWluZXJTdHJ1Y3QnLCAnd3JpdGVDb250YWluZXJTdHJ1Y3QnLCBUcnVlKSwgICMgMTIgKi5TVFJVQ1QKKyAgICAgICAgKCdyZWFkQ29udGFpbmVyTWFwJywgJ3dyaXRlQ29udGFpbmVyTWFwJywgVHJ1ZSksICAjIDEzIFRUeXBlLk1BUAorICAgICAgICAoJ3JlYWRDb250YWluZXJTZXQnLCAnd3JpdGVDb250YWluZXJTZXQnLCBUcnVlKSwgICMgMTQgVFR5cGUuU0VUCisgICAgICAgICgncmVhZENvbnRhaW5lckxpc3QnLCAnd3JpdGVDb250YWluZXJMaXN0JywgVHJ1ZSksICAjIDE1IFRUeXBlLkxJU1QKKyAgICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgMTYgVFR5cGUuVVRGOCAjIFRPRE86IGhhbmRsZSB1dGY4IHR5cGVzPworICAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpICAjIDE3IFRUeXBlLlVURjE2ICMgVE9ETzogaGFuZGxlIHV0ZjE2IHR5cGVzPworICAgICkKKworICAgIGRlZiBfdHR5cGVfaGFuZGxlcnMoc2VsZiwgdHR5cGUsIHNwZWMpOgorICAgICAgICBpZiBzcGVjID09ICdCSU5BUlknOgorICAgICAgICAgICAgaWYgdHR5cGUgIT0gVFR5cGUuU1RSSU5HOgorICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0ludmFsaWQgYmluYXJ5IGZpZWxkIHR5cGUgJWQnICUgdHR5cGUpCisgICAgICAgICAgICByZXR1cm4gKCdyZWFkQmluYXJ5JywgJ3dyaXRlQmluYXJ5JywgRmFsc2UpCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgc3BlYyA9PSAnVVRGOCc6CisgICAgICAgICAgICBpZiB0dHlwZSAhPSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKHR5cGU9VFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nSW52YWxpZCBzdHJpbmcgZmllbGQgdHlwZSAlZCcgJSB0dHlwZSkKKyAgICAgICAgICAgIHJldHVybiAoJ3JlYWRVdGY4JywgJ3dyaXRlVXRmOCcsIEZhbHNlKQorICAgICAgICByZXR1cm4gc2VsZi5fVFRZUEVfSEFORExFUlNbdHR5cGVdIGlmIHR0eXBlIDwgbGVuKHNlbGYuX1RUWVBFX0hBTkRMRVJTKSBlbHNlIChOb25lLCBOb25lLCBGYWxzZSkKKworICAgIGRlZiBfcmVhZF9ieV90dHlwZShzZWxmLCB0dHlwZSwgc3BlYywgZXNwZWMpOgorICAgICAgICByZWFkZXJfbmFtZSwgXywgaXNfY29udGFpbmVyID0gc2VsZi5fdHR5cGVfaGFuZGxlcnModHR5cGUsIGVzcGVjKQorICAgICAgICBpZiByZWFkZXJfbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKHR5cGU9VFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdJbnZhbGlkIHR5cGUgJWQnICUgKHR0eXBlKSkKKyAgICAgICAgcmVhZGVyX2Z1bmMgPSBnZXRhdHRyKHNlbGYsIHJlYWRlcl9uYW1lKQorICAgICAgICByZWFkID0gKGxhbWJkYTogcmVhZGVyX2Z1bmMoZXNwZWMpKSBpZiBpc19jb250YWluZXIgZWxzZSByZWFkZXJfZnVuYworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgeWllbGQgcmVhZCgpCisKKyAgICBkZWYgcmVhZEZpZWxkQnlUVHlwZShzZWxmLCB0dHlwZSwgc3BlYyk6CisgICAgICAgIHJldHVybiBuZXh0KHNlbGYuX3JlYWRfYnlfdHR5cGUodHR5cGUsIHNwZWMsIHNwZWMpKQorCisgICAgZGVmIHJlYWRDb250YWluZXJMaXN0KHNlbGYsIHNwZWMpOgorICAgICAgICB0dHlwZSwgdHNwZWMsIGlzX2ltbXV0YWJsZSA9IHNwZWMKKyAgICAgICAgKGxpc3RfdHlwZSwgbGlzdF9sZW4pID0gc2VsZi5yZWFkTGlzdEJlZ2luKCkKKyAgICAgICAgIyBUT0RPOiBjb21wYXJlIHR5cGVzIHdlIGp1c3QgZGVjb2RlZCB3aXRoIHRocmlmdF9zcGVjCisgICAgICAgIGVsZW1zID0gaXNsaWNlKHNlbGYuX3JlYWRfYnlfdHR5cGUodHR5cGUsIHNwZWMsIHRzcGVjKSwgbGlzdF9sZW4pCisgICAgICAgIHJlc3VsdHMgPSAodHVwbGUgaWYgaXNfaW1tdXRhYmxlIGVsc2UgbGlzdCkoZWxlbXMpCisgICAgICAgIHNlbGYucmVhZExpc3RFbmQoKQorICAgICAgICByZXR1cm4gcmVzdWx0cworCisgICAgZGVmIHJlYWRDb250YWluZXJTZXQoc2VsZiwgc3BlYyk6CisgICAgICAgIHR0eXBlLCB0c3BlYywgaXNfaW1tdXRhYmxlID0gc3BlYworICAgICAgICAoc2V0X3R5cGUsIHNldF9sZW4pID0gc2VsZi5yZWFkU2V0QmVnaW4oKQorICAgICAgICAjIFRPRE86IGNvbXBhcmUgdHlwZXMgd2UganVzdCBkZWNvZGVkIHdpdGggdGhyaWZ0X3NwZWMKKyAgICAgICAgZWxlbXMgPSBpc2xpY2Uoc2VsZi5fcmVhZF9ieV90dHlwZSh0dHlwZSwgc3BlYywgdHNwZWMpLCBzZXRfbGVuKQorICAgICAgICByZXN1bHRzID0gKGZyb3plbnNldCBpZiBpc19pbW11dGFibGUgZWxzZSBzZXQpKGVsZW1zKQorICAgICAgICBzZWxmLnJlYWRTZXRFbmQoKQorICAgICAgICByZXR1cm4gcmVzdWx0cworCisgICAgZGVmIHJlYWRDb250YWluZXJTdHJ1Y3Qoc2VsZiwgc3BlYyk6CisgICAgICAgIChvYmpfY2xhc3MsIG9ial9zcGVjKSA9IHNwZWMKKyAgICAgICAgb2JqID0gb2JqX2NsYXNzKCkKKyAgICAgICAgb2JqLnJlYWQoc2VsZikKKyAgICAgICAgcmV0dXJuIG9iagorCisgICAgZGVmIHJlYWRDb250YWluZXJNYXAoc2VsZiwgc3BlYyk6CisgICAgICAgIGt0eXBlLCBrc3BlYywgdnR5cGUsIHZzcGVjLCBpc19pbW11dGFibGUgPSBzcGVjCisgICAgICAgIChtYXBfa3R5cGUsIG1hcF92dHlwZSwgbWFwX2xlbikgPSBzZWxmLnJlYWRNYXBCZWdpbigpCisgICAgICAgICMgVE9ETzogY29tcGFyZSB0eXBlcyB3ZSBqdXN0IGRlY29kZWQgd2l0aCB0aHJpZnRfc3BlYyBhbmQKKyAgICAgICAgIyBhYm9ydC9za2lwIGlmIHR5cGVzIGRpc2FncmVlCisgICAgICAgIGtleXMgPSBzZWxmLl9yZWFkX2J5X3R0eXBlKGt0eXBlLCBzcGVjLCBrc3BlYykKKyAgICAgICAgdmFscyA9IHNlbGYuX3JlYWRfYnlfdHR5cGUodnR5cGUsIHNwZWMsIHZzcGVjKQorICAgICAgICBrZXl2YWxzID0gaXNsaWNlKHppcChrZXlzLCB2YWxzKSwgbWFwX2xlbikKKyAgICAgICAgcmVzdWx0cyA9IChURnJvemVuRGljdCBpZiBpc19pbW11dGFibGUgZWxzZSBkaWN0KShrZXl2YWxzKQorICAgICAgICBzZWxmLnJlYWRNYXBFbmQoKQorICAgICAgICByZXR1cm4gcmVzdWx0cworCisgICAgZGVmIHJlYWRTdHJ1Y3Qoc2VsZiwgb2JqLCB0aHJpZnRfc3BlYywgaXNfaW1tdXRhYmxlPUZhbHNlKToKKyAgICAgICAgaWYgaXNfaW1tdXRhYmxlOgorICAgICAgICAgICAgZmllbGRzID0ge30KKyAgICAgICAgc2VsZi5yZWFkU3RydWN0QmVnaW4oKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgKGZuYW1lLCBmdHlwZSwgZmlkKSA9IHNlbGYucmVhZEZpZWxkQmVnaW4oKQorICAgICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZpZWxkID0gdGhyaWZ0X3NwZWNbZmlkXQorICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwKGZ0eXBlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBmaWVsZCBpcyBub3QgTm9uZSBhbmQgZnR5cGUgPT0gZmllbGRbMV06CisgICAgICAgICAgICAgICAgICAgIGZuYW1lID0gZmllbGRbMl0KKyAgICAgICAgICAgICAgICAgICAgZnNwZWMgPSBmaWVsZFszXQorICAgICAgICAgICAgICAgICAgICB2YWwgPSBzZWxmLnJlYWRGaWVsZEJ5VFR5cGUoZnR5cGUsIGZzcGVjKQorICAgICAgICAgICAgICAgICAgICBpZiBpc19pbW11dGFibGU6CisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHNbZm5hbWVdID0gdmFsCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKG9iaiwgZm5hbWUsIHZhbCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXAoZnR5cGUpCisgICAgICAgICAgICBzZWxmLnJlYWRGaWVsZEVuZCgpCisgICAgICAgIHNlbGYucmVhZFN0cnVjdEVuZCgpCisgICAgICAgIGlmIGlzX2ltbXV0YWJsZToKKyAgICAgICAgICAgIHJldHVybiBvYmooKipmaWVsZHMpCisKKyAgICBkZWYgd3JpdGVDb250YWluZXJTdHJ1Y3Qoc2VsZiwgdmFsLCBzcGVjKToKKyAgICAgICAgdmFsLndyaXRlKHNlbGYpCisKKyAgICBkZWYgd3JpdGVDb250YWluZXJMaXN0KHNlbGYsIHZhbCwgc3BlYyk6CisgICAgICAgIHR0eXBlLCB0c3BlYywgXyA9IHNwZWMKKyAgICAgICAgc2VsZi53cml0ZUxpc3RCZWdpbih0dHlwZSwgbGVuKHZhbCkpCisgICAgICAgIGZvciBfIGluIHNlbGYuX3dyaXRlX2J5X3R0eXBlKHR0eXBlLCB2YWwsIHNwZWMsIHRzcGVjKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi53cml0ZUxpc3RFbmQoKQorCisgICAgZGVmIHdyaXRlQ29udGFpbmVyU2V0KHNlbGYsIHZhbCwgc3BlYyk6CisgICAgICAgIHR0eXBlLCB0c3BlYywgXyA9IHNwZWMKKyAgICAgICAgc2VsZi53cml0ZVNldEJlZ2luKHR0eXBlLCBsZW4odmFsKSkKKyAgICAgICAgZm9yIF8gaW4gc2VsZi5fd3JpdGVfYnlfdHR5cGUodHR5cGUsIHZhbCwgc3BlYywgdHNwZWMpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLndyaXRlU2V0RW5kKCkKKworICAgIGRlZiB3cml0ZUNvbnRhaW5lck1hcChzZWxmLCB2YWwsIHNwZWMpOgorICAgICAgICBrdHlwZSwga3NwZWMsIHZ0eXBlLCB2c3BlYywgXyA9IHNwZWMKKyAgICAgICAgc2VsZi53cml0ZU1hcEJlZ2luKGt0eXBlLCB2dHlwZSwgbGVuKHZhbCkpCisgICAgICAgIGZvciBfIGluIHppcChzZWxmLl93cml0ZV9ieV90dHlwZShrdHlwZSwgc2l4Lml0ZXJrZXlzKHZhbCksIHNwZWMsIGtzcGVjKSwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlX2J5X3R0eXBlKHZ0eXBlLCBzaXguaXRlcnZhbHVlcyh2YWwpLCBzcGVjLCB2c3BlYykpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLndyaXRlTWFwRW5kKCkKKworICAgIGRlZiB3cml0ZVN0cnVjdChzZWxmLCBvYmosIHRocmlmdF9zcGVjKToKKyAgICAgICAgc2VsZi53cml0ZVN0cnVjdEJlZ2luKG9iai5fX2NsYXNzX18uX19uYW1lX18pCisgICAgICAgIGZvciBmaWVsZCBpbiB0aHJpZnRfc3BlYzoKKyAgICAgICAgICAgIGlmIGZpZWxkIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZuYW1lID0gZmllbGRbMl0KKyAgICAgICAgICAgIHZhbCA9IGdldGF0dHIob2JqLCBmbmFtZSkKKyAgICAgICAgICAgIGlmIHZhbCBpcyBOb25lOgorICAgICAgICAgICAgICAgICMgc2tpcCB3cml0aW5nIG91dCB1bnNldCBmaWVsZHMKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZmlkID0gZmllbGRbMF0KKyAgICAgICAgICAgIGZ0eXBlID0gZmllbGRbMV0KKyAgICAgICAgICAgIGZzcGVjID0gZmllbGRbM10KKyAgICAgICAgICAgIHNlbGYud3JpdGVGaWVsZEJlZ2luKGZuYW1lLCBmdHlwZSwgZmlkKQorICAgICAgICAgICAgc2VsZi53cml0ZUZpZWxkQnlUVHlwZShmdHlwZSwgdmFsLCBmc3BlYykKKyAgICAgICAgICAgIHNlbGYud3JpdGVGaWVsZEVuZCgpCisgICAgICAgIHNlbGYud3JpdGVGaWVsZFN0b3AoKQorICAgICAgICBzZWxmLndyaXRlU3RydWN0RW5kKCkKKworICAgIGRlZiBfd3JpdGVfYnlfdHR5cGUoc2VsZiwgdHR5cGUsIHZhbHMsIHNwZWMsIGVzcGVjKToKKyAgICAgICAgXywgd3JpdGVyX25hbWUsIGlzX2NvbnRhaW5lciA9IHNlbGYuX3R0eXBlX2hhbmRsZXJzKHR0eXBlLCBlc3BlYykKKyAgICAgICAgd3JpdGVyX2Z1bmMgPSBnZXRhdHRyKHNlbGYsIHdyaXRlcl9uYW1lKQorICAgICAgICB3cml0ZSA9IChsYW1iZGEgdjogd3JpdGVyX2Z1bmModiwgZXNwZWMpKSBpZiBpc19jb250YWluZXIgZWxzZSB3cml0ZXJfZnVuYworICAgICAgICBmb3IgdiBpbiB2YWxzOgorICAgICAgICAgICAgeWllbGQgd3JpdGUodikKKworICAgIGRlZiB3cml0ZUZpZWxkQnlUVHlwZShzZWxmLCB0dHlwZSwgdmFsLCBzcGVjKToKKyAgICAgICAgbmV4dChzZWxmLl93cml0ZV9ieV90dHlwZSh0dHlwZSwgW3ZhbF0sIHNwZWMsIHNwZWMpKQorCisKK2RlZiBjaGVja0ludGVnZXJMaW1pdHMoaSwgYml0cyk6CisgICAgaWYgYml0cyA9PSA4IGFuZCAoaSA8IC0xMjggb3IgaSA+IDEyNyk6CisgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImk4IHJlcXVpcmVzIC0xMjggPD0gbnVtYmVyIDw9IDEyNyIpCisgICAgZWxpZiBiaXRzID09IDE2IGFuZCAoaSA8IC0zMjc2OCBvciBpID4gMzI3NjcpOgorICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpMTYgcmVxdWlyZXMgLTMyNzY4IDw9IG51bWJlciA8PSAzMjc2NyIpCisgICAgZWxpZiBiaXRzID09IDMyIGFuZCAoaSA8IC0yMTQ3NDgzNjQ4IG9yIGkgPiAyMTQ3NDgzNjQ3KToKKyAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyIHJlcXVpcmVzIC0yMTQ3NDgzNjQ4IDw9IG51bWJlciA8PSAyMTQ3NDgzNjQ3IikKKyAgICBlbGlmIGJpdHMgPT0gNjQgYW5kIChpIDwgLTkyMjMzNzIwMzY4NTQ3NzU4MDggb3IgaSA+IDkyMjMzNzIwMzY4NTQ3NzU4MDcpOgorICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjQgcmVxdWlyZXMgLTkyMjMzNzIwMzY4NTQ3NzU4MDggPD0gbnVtYmVyIDw9IDkyMjMzNzIwMzY4NTQ3NzU4MDciKQorCisKK2NsYXNzIFRQcm90b2NvbEZhY3Rvcnkob2JqZWN0KToKKyAgICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NTQ2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5weQpAQCAtMCwwICsxLDI2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCitjbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3Iob2JqZWN0KToKKyAgICBkZWYgX19uZXdfXyhjbHMsIHByb3RvY29sLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBkZWNvcmF0ZWRfY2xzID0gdHlwZSgnJy5qb2luKFsnRGVjb3JhdGVkJywgcHJvdG9jb2wuX19jbGFzc19fLl9fbmFtZV9fXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbHMsIHByb3RvY29sLl9fY2xhc3NfXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sLl9fZGljdF9fKQorICAgICAgICByZXR1cm4gb2JqZWN0Ll9fbmV3X18oZGVjb3JhdGVkX2NscykKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvX19pbml0X18ucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL19faW5pdF9fLnB5CmluZGV4IDAxYmZlMTguLjcxNDhmNjYgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvcHJvdG9jb2wvX19pbml0X18ucHkKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9fX2luaXRfXy5weQpAQCAtMTcsNCArMTcsNSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotX19hbGxfXyA9IFsnVFByb3RvY29sJywgJ1RCaW5hcnlQcm90b2NvbCcsICdmYXN0YmluYXJ5J10KK19fYWxsX18gPSBbJ2Zhc3RiaW5hcnknLCAnVEJhc2UnLCAnVEJpbmFyeVByb3RvY29sJywgJ1RDb21wYWN0UHJvdG9jb2wnLAorICAgICAgICAgICAnVEpTT05Qcm90b2NvbCcsICdUUHJvdG9jb2wnXQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9mYXN0YmluYXJ5LmMgYi9saWIvcHkvc3JjL3Byb3RvY29sL2Zhc3RiaW5hcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdiMjE1YS4uMDAwMDAwMAotLS0gYS9saWIvcHkvc3JjL3Byb3RvY29sL2Zhc3RiaW5hcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8UHl0aG9uLmg+Ci0jaW5jbHVkZSAiY1N0cmluZ0lPLmgiCi0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLQotLyogRml4IGVuZGlhbm5lc3MgaXNzdWVzIG9uIFNvbGFyaXMgKi8KLSNpZiBkZWZpbmVkIChfX1NWUjQpICYmIGRlZmluZWQgKF9fc3VuKQotICNpZiBkZWZpbmVkKF9faTM4NikgJiYgIWRlZmluZWQoX19pMzg2X18pCi0gICNkZWZpbmUgX19pMzg2X18KLSAjZW5kaWYKLQotICNpZm5kZWYgQklHX0VORElBTgotICAjZGVmaW5lIEJJR19FTkRJQU4gKDQzMjEpCi0gI2VuZGlmCi0gI2lmbmRlZiBMSVRUTEVfRU5ESUFOCi0gICNkZWZpbmUgTElUVExFX0VORElBTiAoMTIzNCkKLSAjZW5kaWYKLQotIC8qIEkzODYgaXMgTEUsIGV2ZW4gb24gU29sYXJpcyAqLwotICNpZiAhZGVmaW5lZChCWVRFX09SREVSKSAmJiBkZWZpbmVkKF9faTM4Nl9fKQotICAjZGVmaW5lIEJZVEVfT1JERVIgTElUVExFX0VORElBTgotICNlbmRpZgotI2VuZGlmCi0KLS8vIFRPRE8oZHJlaXNzKTogZGVmdmFsIGFwcGVhcnMgdG8gYmUgdW51c2VkLiAgTG9vayBpbnRvIHJlbW92aW5nIGl0LgotLy8gVE9ETyhkcmVpc3MpOiBNYWtlIHBhcnNlX3NwZWNfYXJncyByZWN1cnNpdmUsIGFuZCBjYWNoZSB0aGUgb3V0cHV0Ci0vLyAgICAgICAgICAgICAgIHBlcm1hbmVudGx5IGluIHRoZSBvYmplY3QuICAoTWFsbG9jIGFuZCBvcnBoYW4uKQotLy8gVE9ETyhkcmVpc3MpOiBXaHkgZG8gd2UgbmVlZCBjU3RyaW5nSU8gZm9yIHJlYWRpbmcsIHdoeSBub3QganVzdCBjaGFyKj8KLS8vICAgICAgICAgICAgICAgQ2FuIGNTdHJpbmdJTyBsZXQgdXMgd29yayB3aXRoIGEgQnVmZmVyZWRUcmFuc3BvcnQ/Ci0vLyBUT0RPKGRyZWlzcyk6IERvbid0IGlnbm9yZSB0aGUgcnYgZnJvbSBjd3JpdGUgKG1heWJlKS4KLQotLyogPT09PT09IEJFR0lOIFVUSUxJVElFUyA9PT09PT0gKi8KLQotI2RlZmluZSBJTklUX09VVEJVRl9TSVpFIDEyOAotCi0vLyBTdG9sZW4gb3V0IG9mIFRQcm90b2NvbC5oLgotLy8gSXQgd291bGQgYmUgYSBodWdlIHBhaW4gdG8gaGF2ZSBib3RoIGdldCB0aGlzIGZyb20gb25lIHBsYWNlLgotdHlwZWRlZiBlbnVtIFRUeXBlIHsKLSAgVF9TVE9QICAgICAgID0gMCwKLSAgVF9WT0lEICAgICAgID0gMSwKLSAgVF9CT09MICAgICAgID0gMiwKLSAgVF9CWVRFICAgICAgID0gMywKLSAgVF9JMDggICAgICAgID0gMywKLSAgVF9JMTYgICAgICAgID0gNiwKLSAgVF9JMzIgICAgICAgID0gOCwKLSAgVF9VNjQgICAgICAgID0gOSwKLSAgVF9JNjQgICAgICAgID0gMTAsCi0gIFRfRE9VQkxFICAgICA9IDQsCi0gIFRfU1RSSU5HICAgICA9IDExLAotICBUX1VURjcgICAgICAgPSAxMSwKLSAgVF9TVFJVQ1QgICAgID0gMTIsCi0gIFRfTUFQICAgICAgICA9IDEzLAotICBUX1NFVCAgICAgICAgPSAxNCwKLSAgVF9MSVNUICAgICAgID0gMTUsCi0gIFRfVVRGOCAgICAgICA9IDE2LAotICBUX1VURjE2ICAgICAgPSAxNwotfSBUVHlwZTsKLQotI2lmbmRlZiBfX0JZVEVfT1JERVIKLSMgaWYgZGVmaW5lZChCWVRFX09SREVSKSAmJiBkZWZpbmVkKExJVFRMRV9FTkRJQU4pICYmIGRlZmluZWQoQklHX0VORElBTikKLSMgIGRlZmluZSBfX0JZVEVfT1JERVIgQllURV9PUkRFUgotIyAgZGVmaW5lIF9fTElUVExFX0VORElBTiBMSVRUTEVfRU5ESUFOCi0jICBkZWZpbmUgX19CSUdfRU5ESUFOIEJJR19FTkRJQU4KLSMgZWxzZQotIyAgZXJyb3IgIkNhbm5vdCBkZXRlcm1pbmUgZW5kaWFubmVzcyIKLSMgZW5kaWYKLSNlbmRpZgotCi0vLyBTYW1lIGNvbW1lbnQgYXMgdGhlIGVudW0uICBTb3JyeS4KLSNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCi0jIGRlZmluZSBudG9obGwobikgKG4pCi0jIGRlZmluZSBodG9ubGwobikgKG4pCi0jZWxpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCi0jIGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTElCQ19fKQotIyAgaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KLSMgIGRlZmluZSBudG9obGwobikgYnN3YXBfNjQobikKLSMgIGRlZmluZSBodG9ubGwobikgYnN3YXBfNjQobikKLSMgZWxzZSAvKiBHTlVDICYgR0xJQkMgKi8KLSMgIGRlZmluZSBudG9obGwobikgKCAoKCh1bnNpZ25lZCBsb25nIGxvbmcpbnRvaGwobikpIDw8IDMyKSArIG50b2hsKG4gPj4gMzIpICkKLSMgIGRlZmluZSBodG9ubGwobikgKCAoKCh1bnNpZ25lZCBsb25nIGxvbmcpaHRvbmwobikpIDw8IDMyKSArIGh0b25sKG4gPj4gMzIpICkKLSMgZW5kaWYgLyogR05VQyAmIEdMSUJDICovCi0jZWxzZSAvKiBfX0JZVEVfT1JERVIgKi8KLSMgZXJyb3IgIkNhbid0IGRlZmluZSBodG9ubGwgb3IgbnRvaGxsISIKLSNlbmRpZgotCi0vLyBEb2luZyBhIGJlbmNobWFyayBzaG93cyB0aGF0IGludGVybmluZyBhY3R1YWxseSBtYWtlcyBhIGRpZmZlcmVuY2UsIGFtYXppbmdseS4KLSNkZWZpbmUgSU5URVJOX1NUUklORyh2YWx1ZSkgX2ludGVybl8gIyMgdmFsdWUKLQotI2RlZmluZSBJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSAoICgodikgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkgKQotI2RlZmluZSBDSEVDS19SQU5HRSh2LCBtaW4sIG1heCkgKCAoKHYpIDw9IChtYXgpKSAmJiAoKHYpID49IChtaW4pKSApCi0KLS8vIFB5X3NzaXplX3Qgd2FzIG5vdCBkZWZpbmVkIGJlZm9yZSBQeXRob24gMi41Ci0jaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLXR5cGVkZWYgaW50IFB5X3NzaXplX3Q7Ci0jZW5kaWYKLQotLyoqCi0gKiBBIGNhY2hlIG9mIHRoZSBzcGVjX2FyZ3MgZm9yIGEgc2V0IG9yIGxpc3QsCi0gKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeVR1cGxlX0dFVF9JVEVNLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFRUeXBlIGVsZW1lbnRfdHlwZTsKLSAgUHlPYmplY3QqIHR5cGVhcmdzOwotfSBTZXRMaXN0VHlwZUFyZ3M7Ci0KLS8qKgotICogQSBjYWNoZSBvZiB0aGUgc3BlY19hcmdzIGZvciBhIG1hcCwKLSAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgVFR5cGUga3RhZzsKLSAgVFR5cGUgdnRhZzsKLSAgUHlPYmplY3QqIGt0eXBlYXJnczsKLSAgUHlPYmplY3QqIHZ0eXBlYXJnczsKLX0gTWFwVHlwZUFyZ3M7Ci0KLS8qKgotICogQSBjYWNoZSBvZiB0aGUgc3BlY19hcmdzIGZvciBhIHN0cnVjdCwKLSAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgUHlPYmplY3QqIGtsYXNzOwotICBQeU9iamVjdCogc3BlYzsKLX0gU3RydWN0VHlwZUFyZ3M7Ci0KLS8qKgotICogQSBjYWNoZSBvZiB0aGUgaXRlbSBzcGVjIGZyb20gYSBzdHJ1Y3Qgc3BlY2lmaWNhdGlvbiwKLSAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IHRhZzsKLSAgVFR5cGUgdHlwZTsKLSAgUHlPYmplY3QqIGF0dHJuYW1lOwotICBQeU9iamVjdCogdHlwZWFyZ3M7Ci0gIFB5T2JqZWN0KiBkZWZ2YWw7Ci19IFN0cnVjdEl0ZW1TcGVjOwotCi0vKioKLSAqIEEgY2FjaGUgb2YgdGhlIHR3byBrZXkgYXR0cmlidXRlcyBvZiBhIENSZWFkYWJsZVRyYW5zcG9ydCwKLSAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5T2JqZWN0X0dldEF0dHIuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgUHlPYmplY3QqIHN0cmluZ2lvYnVmOwotICBQeU9iamVjdCogcmVmaWxsX2NhbGxhYmxlOwotfSBEZWNvZGVCdWZmZXI7Ci0KLS8qKiBQb2ludGVyIHRvIGludGVybmVkIHN0cmluZyB0byBzcGVlZCB1cCBhdHRyaWJ1dGUgbG9va3VwLiAqLwotc3RhdGljIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19idWYpOwotLyoqIFBvaW50ZXIgdG8gaW50ZXJuZWQgc3RyaW5nIHRvIHNwZWVkIHVwIGF0dHJpYnV0ZSBsb29rdXAuICovCi1zdGF0aWMgUHlPYmplY3QqIElOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX3JlZmlsbCk7Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbAotY2hlY2tfc3NpemVfdF8zMihQeV9zc2l6ZV90IGxlbikgewotICAvLyBlcnJvciBmcm9tIGdldHRpbmcgdGhlIGludAotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQobGVuKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUNIRUNLX1JBTkdFKGxlbiwgMCwgSU5UMzJfTUFYKSkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAic3RyaW5nIHNpemUgb3V0IG9mIHJhbmdlIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wKLXBhcnNlX3B5aW50KFB5T2JqZWN0KiBvLCBpbnQzMl90KiByZXQsIGludDMyX3QgbWluLCBpbnQzMl90IG1heCkgewotICBsb25nIHZhbCA9IFB5SW50X0FzTG9uZyhvKTsKLQotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQodmFsKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUNIRUNLX1JBTkdFKHZhbCwgbWluLCBtYXgpKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJpbnQgb3V0IG9mIHJhbmdlIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnJldCA9IChpbnQzMl90KSB2YWw7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIC0tLSBGVU5DVElPTlMgVE8gUEFSU0UgU1RSVUNUIFNQRUNJRklDQVRPSU5TIC0tLSAqLwotCi1zdGF0aWMgYm9vbAotcGFyc2Vfc2V0X2xpc3RfYXJncyhTZXRMaXN0VHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncykgewotICBpZiAoUHlUdXBsZV9TaXplKHR5cGVhcmdzKSAhPSAyKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyB0dXBsZSBvZiBzaXplIDIgZm9yIGxpc3Qvc2V0IHR5cGUgYXJncyIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPmVsZW1lbnRfdHlwZSA9IFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAwKSk7Ci0gIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChkZXN0LT5lbGVtZW50X3R5cGUpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+dHlwZWFyZ3MgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAxKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wKLXBhcnNlX21hcF9hcmdzKE1hcFR5cGVBcmdzKiBkZXN0LCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKLSAgaWYgKFB5VHVwbGVfU2l6ZSh0eXBlYXJncykgIT0gNCkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RpbmcgNCBhcmd1bWVudHMgZm9yIHR5cGVhcmdzIHRvIG1hcCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPmt0YWcgPSBQeUludF9Bc0xvbmcoUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMCkpOwotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+a3RhZykpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT52dGFnID0gUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDIpKTsKLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPnZ0YWcpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+a3R5cGVhcmdzID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMSk7Ci0gIGRlc3QtPnZ0eXBlYXJncyA9IFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDMpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbAotcGFyc2Vfc3RydWN0X2FyZ3MoU3RydWN0VHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncykgewotICBpZiAoUHlUdXBsZV9TaXplKHR5cGVhcmdzKSAhPSAyKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyB0dXBsZSBvZiBzaXplIDIgZm9yIHN0cnVjdCBhcmdzIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+a2xhc3MgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAwKTsKLSAgZGVzdC0+c3BlYyA9IFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDEpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50Ci1wYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjKFN0cnVjdEl0ZW1TcGVjKiBkZXN0LCBQeU9iamVjdCogc3BlY190dXBsZSkgewotCi0gIC8vIGknZCBsaWtlIHRvIHVzZSBQYXJzZUFyZ3MgaGVyZSwgYnV0IGl0IHNlZW1zIHRvIGJlIGEgYm90dGxlbmVjay4KLSAgaWYgKFB5VHVwbGVfU2l6ZShzcGVjX3R1cGxlKSAhPSA1KSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyA1IGFyZ3VtZW50cyBmb3Igc3BlYyB0dXBsZSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPnRhZyA9IFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDApKTsKLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPnRhZykpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT50eXBlID0gUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgMSkpOwotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+dHlwZSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT5hdHRybmFtZSA9IFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgMik7Ci0gIGRlc3QtPnR5cGVhcmdzID0gUHlUdXBsZV9HRVRfSVRFTShzcGVjX3R1cGxlLCAzKTsKLSAgZGVzdC0+ZGVmdmFsID0gUHlUdXBsZV9HRVRfSVRFTShzcGVjX3R1cGxlLCA0KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qID09PT09PSBFTkQgVVRJTElUSUVTID09PT09PSAqLwotCi0KLS8qID09PT09PSBCRUdJTiBXUklUSU5HIEZVTkNUSU9OUyA9PT09PT0gKi8KLQotLyogLS0tIExPVy1MRVZFTCBXUklUSU5HIEZVTkNUSU9OUyAtLS0gKi8KLQotc3RhdGljIHZvaWQgd3JpdGVCeXRlKFB5T2JqZWN0KiBvdXRidWYsIGludDhfdCB2YWwpIHsKLSAgaW50OF90IG5ldCA9IHZhbDsKLSAgUHljU3RyaW5nSU8tPmN3cml0ZShvdXRidWYsIChjaGFyKikmbmV0LCBzaXplb2YoaW50OF90KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdyaXRlSTE2KFB5T2JqZWN0KiBvdXRidWYsIGludDE2X3QgdmFsKSB7Ci0gIGludDE2X3QgbmV0ID0gKGludDE2X3QpaHRvbnModmFsKTsKLSAgUHljU3RyaW5nSU8tPmN3cml0ZShvdXRidWYsIChjaGFyKikmbmV0LCBzaXplb2YoaW50MTZfdCkpOwotfQotCi1zdGF0aWMgdm9pZCB3cml0ZUkzMihQeU9iamVjdCogb3V0YnVmLCBpbnQzMl90IHZhbCkgewotICBpbnQzMl90IG5ldCA9IChpbnQzMl90KWh0b25sKHZhbCk7Ci0gIFB5Y1N0cmluZ0lPLT5jd3JpdGUob3V0YnVmLCAoY2hhciopJm5ldCwgc2l6ZW9mKGludDMyX3QpKTsKLX0KLQotc3RhdGljIHZvaWQgd3JpdGVJNjQoUHlPYmplY3QqIG91dGJ1ZiwgaW50NjRfdCB2YWwpIHsKLSAgaW50NjRfdCBuZXQgPSAoaW50NjRfdClodG9ubGwodmFsKTsKLSAgUHljU3RyaW5nSU8tPmN3cml0ZShvdXRidWYsIChjaGFyKikmbmV0LCBzaXplb2YoaW50NjRfdCkpOwotfQotCi1zdGF0aWMgdm9pZCB3cml0ZURvdWJsZShQeU9iamVjdCogb3V0YnVmLCBkb3VibGUgZHViKSB7Ci0gIC8vIFVuZm9ydHVuYXRlbHksIGJpdHdpc2VfY2FzdCBkb2Vzbid0IHdvcmsgaW4gQy4gIEJhZCBDIQotICB1bmlvbiB7Ci0gICAgZG91YmxlIGY7Ci0gICAgaW50NjRfdCB0OwotICB9IHRyYW5zZmVyOwotICB0cmFuc2Zlci5mID0gZHViOwotICB3cml0ZUk2NChvdXRidWYsIHRyYW5zZmVyLnQpOwotfQotCi0KLS8qIC0tLSBNQUlOIFJFQ1VSU0lWRSBPVVRQVVQgRlVDTlRJT04gLS0gKi8KLQotc3RhdGljIGludAotb3V0cHV0X3ZhbChQeU9iamVjdCogb3V0cHV0LCBQeU9iamVjdCogdmFsdWUsIFRUeXBlIHR5cGUsIFB5T2JqZWN0KiB0eXBlYXJncykgewotICAvKgotICAgKiBSZWZjb3VudGluZyBTdHJhdGVneToKLSAgICoKLSAgICogV2UgYXNzdW1lIHRoYXQgZWxlbWVudHMgb2YgdGhlIHRocmlmdF9zcGVjIHR1cGxlIGFyZSBub3QgZ29pbmcgdG8gYmUKLSAgICogbXV0YXRlZCwgc28gd2UgZG9uJ3QgcmVmIGNvdW50IHRob3NlIGF0IGFsbC4gT3RoZXIgdGhhbiB0aGF0LCB3ZSB0cnkgdG8KLSAgICoga2VlcCBhIHJlZmVyZW5jZSB0byBhbGwgdGhlIHVzZXItY3JlYXRlZCBvYmplY3RzIHdoaWxlIHdlIHdvcmsgd2l0aCB0aGVtLgotICAgKiBvdXRwdXRfdmFsIGFzc3VtZXMgdGhhdCBhIHJlZmVyZW5jZSBpcyBhbHJlYWR5IGhlbGQuIFRoZSAqY2FsbGVyKiBpcwotICAgKiByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgcmVmZXJlbmNlcwotICAgKi8KLQotICBzd2l0Y2ggKHR5cGUpIHsKLQotICBjYXNlIFRfQk9PTDogewotICAgIGludCB2ID0gUHlPYmplY3RfSXNUcnVlKHZhbHVlKTsKLSAgICBpZiAodiA9PSAtMSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlQnl0ZShvdXRwdXQsIChpbnQ4X3QpIHYpOwotICAgIGJyZWFrOwotICB9Ci0gIGNhc2UgVF9JMDg6IHsKLSAgICBpbnQzMl90IHZhbDsKLQotICAgIGlmICghcGFyc2VfcHlpbnQodmFsdWUsICZ2YWwsIElOVDhfTUlOLCBJTlQ4X01BWCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3cml0ZUJ5dGUob3V0cHV0LCAoaW50OF90KSB2YWwpOwotICAgIGJyZWFrOwotICB9Ci0gIGNhc2UgVF9JMTY6IHsKLSAgICBpbnQzMl90IHZhbDsKLQotICAgIGlmICghcGFyc2VfcHlpbnQodmFsdWUsICZ2YWwsIElOVDE2X01JTiwgSU5UMTZfTUFYKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlSTE2KG91dHB1dCwgKGludDE2X3QpIHZhbCk7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgY2FzZSBUX0kzMjogewotICAgIGludDMyX3QgdmFsOwotCi0gICAgaWYgKCFwYXJzZV9weWludCh2YWx1ZSwgJnZhbCwgSU5UMzJfTUlOLCBJTlQzMl9NQVgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVJMzIob3V0cHV0LCB2YWwpOwotICAgIGJyZWFrOwotICB9Ci0gIGNhc2UgVF9JNjQ6IHsKLSAgICBpbnQ2NF90IG52YWwgPSBQeUxvbmdfQXNMb25nTG9uZyh2YWx1ZSk7Ci0KLSAgICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQobnZhbCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIUNIRUNLX1JBTkdFKG52YWwsIElOVDY0X01JTiwgSU5UNjRfTUFYKSkgewotICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJpbnQgb3V0IG9mIHJhbmdlIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVJNjQob3V0cHV0LCBudmFsKTsKLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9ET1VCTEU6IHsKLSAgICBkb3VibGUgbnZhbCA9IFB5RmxvYXRfQXNEb3VibGUodmFsdWUpOwotICAgIGlmIChudmFsID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlRG91YmxlKG91dHB1dCwgbnZhbCk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBjYXNlIFRfU1RSSU5HOiB7Ci0gICAgUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19TaXplKHZhbHVlKTsKLQotICAgIGlmICghY2hlY2tfc3NpemVfdF8zMihsZW4pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVJMzIob3V0cHV0LCAoaW50MzJfdCkgbGVuKTsKLSAgICBQeWNTdHJpbmdJTy0+Y3dyaXRlKG91dHB1dCwgUHlTdHJpbmdfQXNTdHJpbmcodmFsdWUpLCAoaW50MzJfdCkgbGVuKTsKLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9MSVNUOgotICBjYXNlIFRfU0VUOiB7Ci0gICAgUHlfc3NpemVfdCBsZW47Ci0gICAgU2V0TGlzdFR5cGVBcmdzIHBhcnNlZGFyZ3M7Ci0gICAgUHlPYmplY3QgKml0ZW07Ci0gICAgUHlPYmplY3QgKml0ZXJhdG9yOwotCi0gICAgaWYgKCFwYXJzZV9zZXRfbGlzdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBsZW4gPSBQeU9iamVjdF9MZW5ndGgodmFsdWUpOwotCi0gICAgaWYgKCFjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3cml0ZUJ5dGUob3V0cHV0LCBwYXJzZWRhcmdzLmVsZW1lbnRfdHlwZSk7Ci0gICAgd3JpdGVJMzIob3V0cHV0LCAoaW50MzJfdCkgbGVuKTsKLQotICAgIGl0ZXJhdG9yID0gIFB5T2JqZWN0X0dldEl0ZXIodmFsdWUpOwotICAgIGlmIChpdGVyYXRvciA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd2hpbGUgKChpdGVtID0gUHlJdGVyX05leHQoaXRlcmF0b3IpKSkgewotICAgICAgaWYgKCFvdXRwdXRfdmFsKG91dHB1dCwgaXRlbSwgcGFyc2VkYXJncy5lbGVtZW50X3R5cGUsIHBhcnNlZGFyZ3MudHlwZWFyZ3MpKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKLSAgICAgICAgUHlfREVDUkVGKGl0ZXJhdG9yKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgUHlfREVDUkVGKGl0ZW0pOwotICAgIH0KLQotICAgIFB5X0RFQ1JFRihpdGVyYXRvcik7Ci0KLSAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSBUX01BUDogewotICAgIFB5T2JqZWN0ICprLCAqdjsKLSAgICBQeV9zc2l6ZV90IHBvcyA9IDA7Ci0gICAgUHlfc3NpemVfdCBsZW47Ci0KLSAgICBNYXBUeXBlQXJncyBwYXJzZWRhcmdzOwotCi0gICAgbGVuID0gUHlEaWN0X1NpemUodmFsdWUpOwotICAgIGlmICghY2hlY2tfc3NpemVfdF8zMihsZW4pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFwYXJzZV9tYXBfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVCeXRlKG91dHB1dCwgcGFyc2VkYXJncy5rdGFnKTsKLSAgICB3cml0ZUJ5dGUob3V0cHV0LCBwYXJzZWRhcmdzLnZ0YWcpOwotICAgIHdyaXRlSTMyKG91dHB1dCwgbGVuKTsKLQotICAgIC8vIFRPRE8oYm1hdXJlcik6IHNob3VsZCBzdXBwb3J0IGFueSBtYXBwaW5nLCBub3QganVzdCBkaWN0cwotICAgIHdoaWxlIChQeURpY3RfTmV4dCh2YWx1ZSwgJnBvcywgJmssICZ2KSkgewotICAgICAgLy8gVE9ETyhkcmVpc3MpOiBUaGluayBoYXJkIGFib3V0IHdoZXRoZXIgdGhlc2UgSU5DUkVGcyBhY3R1YWxseQotICAgICAgLy8gICAgICAgICAgICAgICB0dXJuIGFueSB1bnNhZmUgc2NlbmFyaW9zIGludG8gc2FmZSBzY2VuYXJpb3MuCi0gICAgICBQeV9JTkNSRUYoayk7Ci0gICAgICBQeV9JTkNSRUYodik7Ci0KLSAgICAgIGlmICghb3V0cHV0X3ZhbChvdXRwdXQsIGssIHBhcnNlZGFyZ3Mua3RhZywgcGFyc2VkYXJncy5rdHlwZWFyZ3MpCi0gICAgICAgICAgfHwgIW91dHB1dF92YWwob3V0cHV0LCB2LCBwYXJzZWRhcmdzLnZ0YWcsIHBhcnNlZGFyZ3MudnR5cGVhcmdzKSkgewotICAgICAgICBQeV9ERUNSRUYoayk7Ci0gICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgUHlfREVDUkVGKGspOwotICAgICAgUHlfREVDUkVGKHYpOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIC8vIFRPRE8oZHJlaXNzKTogQ29uc2lkZXIgYnJlYWtpbmcgdGhpcyBvdXQgYXMgYSBmdW5jdGlvbgotICAvLyAgICAgICAgICAgICAgIHRoZSB3YXkgd2UgZGlkIGZvciBkZWNvZGVfc3RydWN0LgotICBjYXNlIFRfU1RSVUNUOiB7Ci0gICAgU3RydWN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKLSAgICBQeV9zc2l6ZV90IG5zcGVjOwotICAgIFB5X3NzaXplX3QgaTsKLQotICAgIGlmICghcGFyc2Vfc3RydWN0X2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIG5zcGVjID0gUHlUdXBsZV9TaXplKHBhcnNlZGFyZ3Muc3BlYyk7Ci0KLSAgICBpZiAobnNwZWMgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnNwZWM7IGkrKykgewotICAgICAgU3RydWN0SXRlbVNwZWMgcGFyc2Vkc3BlYzsKLSAgICAgIFB5T2JqZWN0KiBzcGVjX3R1cGxlOwotICAgICAgUHlPYmplY3QqIGluc3R2YWwgPSBOVUxMOwotCi0gICAgICBzcGVjX3R1cGxlID0gUHlUdXBsZV9HRVRfSVRFTShwYXJzZWRhcmdzLnNwZWMsIGkpOwotICAgICAgaWYgKHNwZWNfdHVwbGUgPT0gUHlfTm9uZSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKCFwYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjICgmcGFyc2Vkc3BlYywgc3BlY190dXBsZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBpbnN0dmFsID0gUHlPYmplY3RfR2V0QXR0cih2YWx1ZSwgcGFyc2Vkc3BlYy5hdHRybmFtZSk7Ci0KLSAgICAgIGlmICghaW5zdHZhbCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpbnN0dmFsID09IFB5X05vbmUpIHsKLSAgICAgICAgUHlfREVDUkVGKGluc3R2YWwpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgd3JpdGVCeXRlKG91dHB1dCwgKGludDhfdCkgcGFyc2Vkc3BlYy50eXBlKTsKLSAgICAgIHdyaXRlSTE2KG91dHB1dCwgcGFyc2Vkc3BlYy50YWcpOwotCi0gICAgICBpZiAoIW91dHB1dF92YWwob3V0cHV0LCBpbnN0dmFsLCBwYXJzZWRzcGVjLnR5cGUsIHBhcnNlZHNwZWMudHlwZWFyZ3MpKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihpbnN0dmFsKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBQeV9ERUNSRUYoaW5zdHZhbCk7Ci0gICAgfQotCi0gICAgd3JpdGVCeXRlKG91dHB1dCwgKGludDhfdClUX1NUT1ApOwotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSBUX1NUT1A6Ci0gIGNhc2UgVF9WT0lEOgotICBjYXNlIFRfVVRGMTY6Ci0gIGNhc2UgVF9VVEY4OgotICBjYXNlIFRfVTY0OgotICBkZWZhdWx0OgotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJVbmV4cGVjdGVkIFRUeXBlIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotCi0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiAtLS0gVE9QLUxFVkVMIFdSQVBQRVIgRk9SIE9VVFBVVCAtLSAqLwotCi1zdGF0aWMgUHlPYmplY3QgKgotZW5jb2RlX2JpbmFyeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLSAgUHlPYmplY3QqIGVuY19vYmo7Ci0gIFB5T2JqZWN0KiB0eXBlX2FyZ3M7Ci0gIFB5T2JqZWN0KiBidWY7Ci0gIFB5T2JqZWN0KiByZXQgPSBOVUxMOwotCi0gIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08iLCAmZW5jX29iaiwgJnR5cGVfYXJncykpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGJ1ZiA9IFB5Y1N0cmluZ0lPLT5OZXdPdXRwdXQoSU5JVF9PVVRCVUZfU0laRSk7Ci0gIGlmIChvdXRwdXRfdmFsKGJ1ZiwgZW5jX29iaiwgVF9TVFJVQ1QsIHR5cGVfYXJncykpIHsKLSAgICByZXQgPSBQeWNTdHJpbmdJTy0+Y2dldHZhbHVlKGJ1Zik7Ci0gIH0KLQotICBQeV9ERUNSRUYoYnVmKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogPT09PT09IEVORCBXUklUSU5HIEZVTkNUSU9OUyA9PT09PT0gKi8KLQotCi0vKiA9PT09PT0gQkVHSU4gUkVBRElORyBGVU5DVElPTlMgPT09PT09ICovCi0KLS8qIC0tLSBMT1ctTEVWRUwgUkVBRElORyBGVU5DVElPTlMgLS0tICovCi0KLXN0YXRpYyB2b2lkCi1mcmVlX2RlY29kZWJ1ZihEZWNvZGVCdWZmZXIqIGQpIHsKLSAgUHlfWERFQ1JFRihkLT5zdHJpbmdpb2J1Zik7Ci0gIFB5X1hERUNSRUYoZC0+cmVmaWxsX2NhbGxhYmxlKTsKLX0KLQotc3RhdGljIGJvb2wKLWRlY29kZV9idWZmZXJfZnJvbV9vYmooRGVjb2RlQnVmZmVyKiBkZXN0LCBQeU9iamVjdCogb2JqKSB7Ci0gIGRlc3QtPnN0cmluZ2lvYnVmID0gUHlPYmplY3RfR2V0QXR0cihvYmosIElOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX2J1ZikpOwotICBpZiAoIWRlc3QtPnN0cmluZ2lvYnVmKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFQeWNTdHJpbmdJT19JbnB1dENoZWNrKGRlc3QtPnN0cmluZ2lvYnVmKSkgewotICAgIGZyZWVfZGVjb2RlYnVmKGRlc3QpOwotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3Rpbmcgc3RyaW5naW8gaW5wdXQiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT5yZWZpbGxfY2FsbGFibGUgPSBQeU9iamVjdF9HZXRBdHRyKG9iaiwgSU5URVJOX1NUUklORyhjc3RyaW5naW9fcmVmaWxsKSk7Ci0KLSAgaWYoIWRlc3QtPnJlZmlsbF9jYWxsYWJsZSkgewotICAgIGZyZWVfZGVjb2RlYnVmKGRlc3QpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghUHlDYWxsYWJsZV9DaGVjayhkZXN0LT5yZWZpbGxfY2FsbGFibGUpKSB7Ci0gICAgZnJlZV9kZWNvZGVidWYoZGVzdCk7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyBjYWxsYWJsZSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCByZWFkQnl0ZXMoRGVjb2RlQnVmZmVyKiBpbnB1dCwgY2hhcioqIG91dHB1dCwgaW50IGxlbikgewotICBpbnQgcmVhZDsKLQotICAvLyBUT0RPKGRyZWlzcyk6IERvbid0IGZlYXIgdGhlIG1hbGxvYy4gIFRoaW5rIGFib3V0IHRha2luZyBhIGNvcHkgb2YKLSAgLy8gICAgICAgICAgICAgICB0aGUgcGFydGlhbCByZWFkIGluc3RlYWQgb2YgZm9yY2luZyB0aGUgdHJhbnNwb3J0Ci0gIC8vICAgICAgICAgICAgICAgdG8gcHJlcGVuZCBpdCB0byBpdHMgYnVmZmVyLgotCi0gIHJlYWQgPSBQeWNTdHJpbmdJTy0+Y3JlYWQoaW5wdXQtPnN0cmluZ2lvYnVmLCBvdXRwdXQsIGxlbik7Ci0KLSAgaWYgKHJlYWQgPT0gbGVuKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAocmVhZCA9PSAtMSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICBQeU9iamVjdCogbmV3aW9idWY7Ci0KLSAgICAvLyB1c2luZyBidWlsZGluZyBmdW5jdGlvbnMgYXMgdGhpcyBpcyBhIHJhcmUgY29kZXBhdGgKLSAgICBuZXdpb2J1ZiA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigKLSAgICAgICAgaW5wdXQtPnJlZmlsbF9jYWxsYWJsZSwgInMjaSIsICpvdXRwdXQsIHJlYWQsIGxlbiwgTlVMTCk7Ci0gICAgaWYgKG5ld2lvYnVmID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBtdXN0IGRvIHRoaXMgKkFGVEVSKiB0aGUgY2FsbCBzbyB0aGF0IHdlIGRvbid0IGRlcmVmIHRoZSBpbyBidWZmZXIKLSAgICBQeV9DTEVBUihpbnB1dC0+c3RyaW5naW9idWYpOwotICAgIGlucHV0LT5zdHJpbmdpb2J1ZiA9IG5ld2lvYnVmOwotCi0gICAgcmVhZCA9IFB5Y1N0cmluZ0lPLT5jcmVhZChpbnB1dC0+c3RyaW5naW9idWYsIG91dHB1dCwgbGVuKTsKLQotICAgIGlmIChyZWFkID09IGxlbikgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIGlmIChyZWFkID09IC0xKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFRPRE8oZHJlaXNzKTogVGhpcyBjb3VsZCBiZSBhIHZhbGlkIGNvZGUgcGF0aCBmb3IgYmlnIGJpbmFyeSBibG9icy4KLSAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgInJlZmlsbCBjbGFpbWVkIHRvIGhhdmUgcmVmaWxsZWQgdGhlIGJ1ZmZlciwgYnV0IGRpZG4ndCEhIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyBpbnQ4X3QgcmVhZEJ5dGUoRGVjb2RlQnVmZmVyKiBpbnB1dCkgewotICBjaGFyKiBidWY7Ci0gIGlmICghcmVhZEJ5dGVzKGlucHV0LCAmYnVmLCBzaXplb2YoaW50OF90KSkpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICByZXR1cm4gKihpbnQ4X3QqKSBidWY7Ci19Ci0KLXN0YXRpYyBpbnQxNl90IHJlYWRJMTYoRGVjb2RlQnVmZmVyKiBpbnB1dCkgewotICBjaGFyKiBidWY7Ci0gIGlmICghcmVhZEJ5dGVzKGlucHV0LCAmYnVmLCBzaXplb2YoaW50MTZfdCkpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcmV0dXJuIChpbnQxNl90KSBudG9ocygqKGludDE2X3QqKSBidWYpOwotfQotCi1zdGF0aWMgaW50MzJfdCByZWFkSTMyKERlY29kZUJ1ZmZlciogaW5wdXQpIHsKLSAgY2hhciogYnVmOwotICBpZiAoIXJlYWRCeXRlcyhpbnB1dCwgJmJ1Ziwgc2l6ZW9mKGludDMyX3QpKSkgewotICAgIHJldHVybiAtMTsKLSAgfQotICByZXR1cm4gKGludDMyX3QpIG50b2hsKCooaW50MzJfdCopIGJ1Zik7Ci19Ci0KLQotc3RhdGljIGludDY0X3QgcmVhZEk2NChEZWNvZGVCdWZmZXIqIGlucHV0KSB7Ci0gIGNoYXIqIGJ1ZjsKLSAgaWYgKCFyZWFkQnl0ZXMoaW5wdXQsICZidWYsIHNpemVvZihpbnQ2NF90KSkpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICByZXR1cm4gKGludDY0X3QpIG50b2hsbCgqKGludDY0X3QqKSBidWYpOwotfQotCi1zdGF0aWMgZG91YmxlIHJlYWREb3VibGUoRGVjb2RlQnVmZmVyKiBpbnB1dCkgewotICB1bmlvbiB7Ci0gICAgaW50NjRfdCBmOwotICAgIGRvdWJsZSB0OwotICB9IHRyYW5zZmVyOwotCi0gIHRyYW5zZmVyLmYgPSByZWFkSTY0KGlucHV0KTsKLSAgaWYgKHRyYW5zZmVyLmYgPT0gLTEpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIHRyYW5zZmVyLnQ7Ci19Ci0KLXN0YXRpYyBib29sCi1jaGVja1R5cGVCeXRlKERlY29kZUJ1ZmZlciogaW5wdXQsIFRUeXBlIGV4cGVjdGVkKSB7Ci0gIFRUeXBlIGdvdCA9IHJlYWRCeXRlKGlucHV0KTsKLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGdvdCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoZXhwZWN0ZWQgIT0gZ290KSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImdvdCB3cm9uZyB0dHlwZSB3aGlsZSByZWFkaW5nIGZpZWxkIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbAotc2tpcChEZWNvZGVCdWZmZXIqIGlucHV0LCBUVHlwZSB0eXBlKSB7Ci0jZGVmaW5lIFNLSVBCWVRFUyhuKSBcCi0gIGRvIHsgXAotICAgIGlmICghcmVhZEJ5dGVzKGlucHV0LCAmZHVtbXlfYnVmLCAobikpKSB7IFwKLSAgICAgIHJldHVybiBmYWxzZTsgXAotICAgIH0gXAotICB9IHdoaWxlKDApCi0KLSAgY2hhciogZHVtbXlfYnVmOwotCi0gIHN3aXRjaCAodHlwZSkgewotCi0gIGNhc2UgVF9CT09MOgotICBjYXNlIFRfSTA4OiBTS0lQQllURVMoMSk7IGJyZWFrOwotICBjYXNlIFRfSTE2OiBTS0lQQllURVMoMik7IGJyZWFrOwotICBjYXNlIFRfSTMyOiBTS0lQQllURVMoNCk7IGJyZWFrOwotICBjYXNlIFRfSTY0OgotICBjYXNlIFRfRE9VQkxFOiBTS0lQQllURVMoOCk7IGJyZWFrOwotCi0gIGNhc2UgVF9TVFJJTkc6IHsKLSAgICAvLyBUT0RPKGRyZWlzcyk6IEZpbmQgb3V0IGlmIHRoZXNlIGNoZWNrX3NzaXplX3QzMnMgYXJlIHJlYWxseSBuZWNlc3NhcnkuCi0gICAgaW50IGxlbiA9IHJlYWRJMzIoaW5wdXQpOwotICAgIGlmICghY2hlY2tfc3NpemVfdF8zMihsZW4pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIFNLSVBCWVRFUyhsZW4pOwotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSBUX0xJU1Q6Ci0gIGNhc2UgVF9TRVQ6IHsKLSAgICBUVHlwZSBldHlwZTsKLSAgICBpbnQgbGVuLCBpOwotCi0gICAgZXR5cGUgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKGV0eXBlID09IC0xKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbGVuID0gcmVhZEkzMihpbnB1dCk7Ci0gICAgaWYgKCFjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgIGlmICghc2tpcChpbnB1dCwgZXR5cGUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBjYXNlIFRfTUFQOiB7Ci0gICAgVFR5cGUga3R5cGUsIHZ0eXBlOwotICAgIGludCBsZW4sIGk7Ci0KLSAgICBrdHlwZSA9IHJlYWRCeXRlKGlucHV0KTsKLSAgICBpZiAoa3R5cGUgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2dHlwZSA9IHJlYWRCeXRlKGlucHV0KTsKLSAgICBpZiAodnR5cGUgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBsZW4gPSByZWFkSTMyKGlucHV0KTsKLSAgICBpZiAoIWNoZWNrX3NzaXplX3RfMzIobGVuKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgaWYgKCEoc2tpcChpbnB1dCwga3R5cGUpICYmIHNraXAoaW5wdXQsIHZ0eXBlKSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9TVFJVQ1Q6IHsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgVFR5cGUgdHlwZTsKLQotICAgICAgdHlwZSA9IHJlYWRCeXRlKGlucHV0KTsKLSAgICAgIGlmICh0eXBlID09IC0xKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgaWYgKHR5cGUgPT0gVF9TVE9QKQotICAgICAgICBicmVhazsKLQotICAgICAgU0tJUEJZVEVTKDIpOyAvLyB0YWcKLSAgICAgIGlmICghc2tpcChpbnB1dCwgdHlwZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9TVE9QOgotICBjYXNlIFRfVk9JRDoKLSAgY2FzZSBUX1VURjE2OgotICBjYXNlIFRfVVRGODoKLSAgY2FzZSBUX1U2NDoKLSAgZGVmYXVsdDoKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVW5leHBlY3RlZCBUVHlwZSIpOwotICAgIHJldHVybiBmYWxzZTsKLQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSN1bmRlZiBTS0lQQllURVMKLX0KLQotCi0vKiAtLS0gSEVMUEVSIEZVTkNUSU9OIEZPUiBERUNPREVfVkFMIC0tLSAqLwotCi1zdGF0aWMgUHlPYmplY3QqCi1kZWNvZGVfdmFsKERlY29kZUJ1ZmZlciogaW5wdXQsIFRUeXBlIHR5cGUsIFB5T2JqZWN0KiB0eXBlYXJncyk7Ci0KLXN0YXRpYyBib29sCi1kZWNvZGVfc3RydWN0KERlY29kZUJ1ZmZlciogaW5wdXQsIFB5T2JqZWN0KiBvdXRwdXQsIFB5T2JqZWN0KiBzcGVjX3NlcSkgewotICBpbnQgc3BlY19zZXFfbGVuID0gUHlUdXBsZV9TaXplKHNwZWNfc2VxKTsKLSAgaWYgKHNwZWNfc2VxX2xlbiA9PSAtMSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgVFR5cGUgdHlwZTsKLSAgICBpbnQxNl90IHRhZzsKLSAgICBQeU9iamVjdCogaXRlbV9zcGVjOwotICAgIFB5T2JqZWN0KiBmaWVsZHZhbCA9IE5VTEw7Ci0gICAgU3RydWN0SXRlbVNwZWMgcGFyc2Vkc3BlYzsKLQotICAgIHR5cGUgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKHR5cGUgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHR5cGUgPT0gVF9TVE9QKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgdGFnID0gcmVhZEkxNihpbnB1dCk7Ci0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHRhZykpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHRhZyA+PSAwICYmIHRhZyA8IHNwZWNfc2VxX2xlbikgewotICAgICAgaXRlbV9zcGVjID0gUHlUdXBsZV9HRVRfSVRFTShzcGVjX3NlcSwgdGFnKTsKLSAgICB9IGVsc2UgewotICAgICAgaXRlbV9zcGVjID0gUHlfTm9uZTsKLSAgICB9Ci0KLSAgICBpZiAoaXRlbV9zcGVjID09IFB5X05vbmUpIHsKLSAgICAgIGlmICghc2tpcChpbnB1dCwgdHlwZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFwYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjKCZwYXJzZWRzcGVjLCBpdGVtX3NwZWMpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChwYXJzZWRzcGVjLnR5cGUgIT0gdHlwZSkgewotICAgICAgaWYgKCFza2lwKGlucHV0LCB0eXBlKSkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAic3RydWN0IGZpZWxkIGhhZCB3cm9uZyB0eXBlIHdoaWxlIHJlYWRpbmcgYW5kIGNhbid0IGJlIHNraXBwZWQiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZmllbGR2YWwgPSBkZWNvZGVfdmFsKGlucHV0LCBwYXJzZWRzcGVjLnR5cGUsIHBhcnNlZHNwZWMudHlwZWFyZ3MpOwotICAgIGlmIChmaWVsZHZhbCA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKFB5T2JqZWN0X1NldEF0dHIob3V0cHV0LCBwYXJzZWRzcGVjLmF0dHJuYW1lLCBmaWVsZHZhbCkgPT0gLTEpIHsKLSAgICAgIFB5X0RFQ1JFRihmaWVsZHZhbCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIFB5X0RFQ1JFRihmaWVsZHZhbCk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogLS0tIE1BSU4gUkVDVVJTSVZFIElOUFVUIEZVQ05USU9OIC0tLSAqLwotCi0vLyBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZS4KLXN0YXRpYyBQeU9iamVjdCoKLWRlY29kZV92YWwoRGVjb2RlQnVmZmVyKiBpbnB1dCwgVFR5cGUgdHlwZSwgUHlPYmplY3QqIHR5cGVhcmdzKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotCi0gIGNhc2UgVF9CT09MOiB7Ci0gICAgaW50OF90IHYgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHYpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHYpIHsKLSAgICBjYXNlIDA6IFB5X1JFVFVSTl9GQUxTRTsKLSAgICBjYXNlIDE6IFB5X1JFVFVSTl9UUlVFOwotICAgIC8vIERvbid0IGxhdWdoLiAgVGhpcyBpcyBhIHBvdGVudGlhbGx5IHNlcmlvdXMgaXNzdWUuCi0gICAgZGVmYXVsdDogUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJvb2xlYW4gb3V0IG9mIHJhbmdlIik7IHJldHVybiBOVUxMOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotICBjYXNlIFRfSTA4OiB7Ci0gICAgaW50OF90IHYgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHYpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodik7Ci0gIH0KLSAgY2FzZSBUX0kxNjogewotICAgIGludDE2X3QgdiA9IHJlYWRJMTYoaW5wdXQpOwotICAgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2KTsKLSAgfQotICBjYXNlIFRfSTMyOiB7Ci0gICAgaW50MzJfdCB2ID0gcmVhZEkzMihpbnB1dCk7Ci0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHYpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHYpOwotICB9Ci0KLSAgY2FzZSBUX0k2NDogewotICAgIGludDY0X3QgdiA9IHJlYWRJNjQoaW5wdXQpOwotICAgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIC8vIFRPRE8oZHJlaXNzKTogRmluZCBvdXQgaWYgd2UgY2FuIHRha2UgdGhpcyBmYXN0cGF0aCBhbHdheXMgd2hlbgotICAgIC8vICAgICAgICAgICAgICAgc2l6ZW9mKGxvbmcpID09IHNpemVvZihsb25nIGxvbmcpLgotICAgIGlmIChDSEVDS19SQU5HRSh2LCBMT05HX01JTiwgTE9OR19NQVgpKSB7Ci0gICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHYpOwotICAgIH0KLQotICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHYpOwotICB9Ci0KLSAgY2FzZSBUX0RPVUJMRTogewotICAgIGRvdWJsZSB2ID0gcmVhZERvdWJsZShpbnB1dCk7Ci0gICAgaWYgKHYgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUodik7Ci0gIH0KLQotICBjYXNlIFRfU1RSSU5HOiB7Ci0gICAgUHlfc3NpemVfdCBsZW4gPSByZWFkSTMyKGlucHV0KTsKLSAgICBjaGFyKiBidWY7Ci0gICAgaWYgKCFyZWFkQnl0ZXMoaW5wdXQsICZidWYsIGxlbikpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIGxlbik7Ci0gIH0KLQotICBjYXNlIFRfTElTVDoKLSAgY2FzZSBUX1NFVDogewotICAgIFNldExpc3RUeXBlQXJncyBwYXJzZWRhcmdzOwotICAgIGludDMyX3QgbGVuOwotICAgIFB5T2JqZWN0KiByZXQgPSBOVUxMOwotICAgIGludCBpOwotCi0gICAgaWYgKCFwYXJzZV9zZXRfbGlzdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmICghY2hlY2tUeXBlQnl0ZShpbnB1dCwgcGFyc2VkYXJncy5lbGVtZW50X3R5cGUpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBsZW4gPSByZWFkSTMyKGlucHV0KTsKLSAgICBpZiAoIWNoZWNrX3NzaXplX3RfMzIobGVuKSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0ID0gUHlMaXN0X05ldyhsZW4pOwotICAgIGlmICghcmV0KSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgIFB5T2JqZWN0KiBpdGVtID0gZGVjb2RlX3ZhbChpbnB1dCwgcGFyc2VkYXJncy5lbGVtZW50X3R5cGUsIHBhcnNlZGFyZ3MudHlwZWFyZ3MpOwotICAgICAgaWYgKCFpdGVtKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihyZXQpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICAgIFB5TGlzdF9TRVRfSVRFTShyZXQsIGksIGl0ZW0pOwotICAgIH0KLQotICAgIC8vIFRPRE8oZHJlaXNzKTogQ29uc2lkZXIgYml0aW5nIHRoZSBidWxsZXQgYW5kIG1ha2luZyB0d28gc2VwYXJhdGUgY2FzZXMKLSAgICAvLyAgICAgICAgICAgICAgIGZvciBsaXN0IGFuZCBzZXQsIGF2b2lkaW5nIHRoaXMgcG9zdCBmYWN0byBjb252ZXJzaW9uLgotICAgIGlmICh0eXBlID09IFRfU0VUKSB7Ci0gICAgICBQeU9iamVjdCogc2V0cmV0OwotI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0gICAgICAvLyBoYWNrIG5lZWRlZCBmb3Igb2xkZXIgdmVyc2lvbnMKLSAgICAgIHNldHJldCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoKFB5T2JqZWN0KikmUHlTZXRfVHlwZSwgcmV0LCBOVUxMKTsKLSNlbHNlCi0gICAgICAvLyBvZmZpY2lhbCB2ZXJzaW9uCi0gICAgICBzZXRyZXQgPSBQeVNldF9OZXcocmV0KTsKLSNlbmRpZgotICAgICAgUHlfREVDUkVGKHJldCk7Ci0gICAgICByZXR1cm4gc2V0cmV0OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgY2FzZSBUX01BUDogewotICAgIGludDMyX3QgbGVuOwotICAgIGludCBpOwotICAgIE1hcFR5cGVBcmdzIHBhcnNlZGFyZ3M7Ci0gICAgUHlPYmplY3QqIHJldCA9IE5VTEw7Ci0KLSAgICBpZiAoIXBhcnNlX21hcF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmICghY2hlY2tUeXBlQnl0ZShpbnB1dCwgcGFyc2VkYXJncy5rdGFnKSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmICghY2hlY2tUeXBlQnl0ZShpbnB1dCwgcGFyc2VkYXJncy52dGFnKSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgbGVuID0gcmVhZEkzMihpbnB1dCk7Ci0gICAgaWYgKCFjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXQgPSBQeURpY3RfTmV3KCk7Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICBQeU9iamVjdCogayA9IE5VTEw7Ci0gICAgICBQeU9iamVjdCogdiA9IE5VTEw7Ci0gICAgICBrID0gZGVjb2RlX3ZhbChpbnB1dCwgcGFyc2VkYXJncy5rdGFnLCBwYXJzZWRhcmdzLmt0eXBlYXJncyk7Ci0gICAgICBpZiAoayA9PSBOVUxMKSB7Ci0gICAgICAgIGdvdG8gbG9vcF9lcnJvcjsKLSAgICAgIH0KLSAgICAgIHYgPSBkZWNvZGVfdmFsKGlucHV0LCBwYXJzZWRhcmdzLnZ0YWcsIHBhcnNlZGFyZ3MudnR5cGVhcmdzKTsKLSAgICAgIGlmICh2ID09IE5VTEwpIHsKLSAgICAgICAgZ290byBsb29wX2Vycm9yOwotICAgICAgfQotICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHJldCwgaywgdikgPT0gLTEpIHsKLSAgICAgICAgZ290byBsb29wX2Vycm9yOwotICAgICAgfQotCi0gICAgICBQeV9ERUNSRUYoayk7Ci0gICAgICBQeV9ERUNSRUYodik7Ci0gICAgICBjb250aW51ZTsKLQotICAgICAgLy8gWXVjayEgIERlc3RydWN0b3JzLCBhbnlvbmU/Ci0gICAgICBsb29wX2Vycm9yOgotICAgICAgUHlfWERFQ1JFRihrKTsKLSAgICAgIFB5X1hERUNSRUYodik7Ci0gICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci0KLSAgICBlcnJvcjoKLSAgICBQeV9YREVDUkVGKHJldCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBjYXNlIFRfU1RSVUNUOiB7Ci0gICAgU3RydWN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKLSAgICBpZiAoIXBhcnNlX3N0cnVjdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIFB5T2JqZWN0KiByZXQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHBhcnNlZGFyZ3Mua2xhc3MsIE5VTEwpOwotICAgIGlmICghcmV0KSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoIWRlY29kZV9zdHJ1Y3QoaW5wdXQsIHJldCwgcGFyc2VkYXJncy5zcGVjKSkgewotICAgICAgUHlfREVDUkVGKHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgY2FzZSBUX1NUT1A6Ci0gIGNhc2UgVF9WT0lEOgotICBjYXNlIFRfVVRGMTY6Ci0gIGNhc2UgVF9VVEY4OgotICBjYXNlIFRfVTY0OgotICBkZWZhdWx0OgotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJVbmV4cGVjdGVkIFRUeXBlIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotCi0vKiAtLS0gVE9QLUxFVkVMIFdSQVBQRVIgRk9SIElOUFVUIC0tICovCi0KLXN0YXRpYyBQeU9iamVjdCoKLWRlY29kZV9iaW5hcnkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSB7Ci0gIFB5T2JqZWN0KiBvdXRwdXRfb2JqID0gTlVMTDsKLSAgUHlPYmplY3QqIHRyYW5zcG9ydCA9IE5VTEw7Ci0gIFB5T2JqZWN0KiB0eXBlYXJncyA9IE5VTEw7Ci0gIFN0cnVjdFR5cGVBcmdzIHBhcnNlZGFyZ3M7Ci0gIERlY29kZUJ1ZmZlciBpbnB1dCA9IHt9OwotCi0gIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT09PIiwgJm91dHB1dF9vYmosICZ0cmFuc3BvcnQsICZ0eXBlYXJncykpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGlmICghcGFyc2Vfc3RydWN0X2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaWYgKCFkZWNvZGVfYnVmZmVyX2Zyb21fb2JqKCZpbnB1dCwgdHJhbnNwb3J0KSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaWYgKCFkZWNvZGVfc3RydWN0KCZpbnB1dCwgb3V0cHV0X29iaiwgcGFyc2VkYXJncy5zcGVjKSkgewotICAgIGZyZWVfZGVjb2RlYnVmKCZpbnB1dCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBmcmVlX2RlY29kZWJ1ZigmaW5wdXQpOwotCi0gIFB5X1JFVFVSTl9OT05FOwotfQotCi0vKiA9PT09PT0gRU5EIFJFQURJTkcgRlVOQ1RJT05TID09PT09PSAqLwotCi0KLS8qIC0tIFBZVEhPTiBNT0RVTEUgU0VUVVAgU1RVRkYgLS0tICovCi0KLXN0YXRpYyBQeU1ldGhvZERlZiBUaHJpZnRGYXN0QmluYXJ5TWV0aG9kc1tdID0gewotCi0gIHsiZW5jb2RlX2JpbmFyeSIsICBlbmNvZGVfYmluYXJ5LCBNRVRIX1ZBUkFSR1MsICIifSwKLSAgeyJkZWNvZGVfYmluYXJ5IiwgIGRlY29kZV9iaW5hcnksIE1FVEhfVkFSQVJHUywgIiJ9LAotCi0gIHtOVUxMLCBOVUxMLCAwLCBOVUxMfSAgICAgICAgLyogU2VudGluZWwgKi8KLX07Ci0KLVB5TU9ESU5JVF9GVU5DCi1pbml0ZmFzdGJpbmFyeSh2b2lkKSB7Ci0jZGVmaW5lIElOSVRfSU5URVJOX1NUUklORyh2YWx1ZSkgXAotICBkbyB7IFwKLSAgICBJTlRFUk5fU1RSSU5HKHZhbHVlKSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoI3ZhbHVlKTsgXAotICAgIGlmKCFJTlRFUk5fU1RSSU5HKHZhbHVlKSkgcmV0dXJuOyBcCi0gIH0gd2hpbGUoMCkKLQotICBJTklUX0lOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX2J1Zik7Ci0gIElOSVRfSU5URVJOX1NUUklORyhjc3RyaW5naW9fcmVmaWxsKTsKLSN1bmRlZiBJTklUX0lOVEVSTl9TVFJJTkcKLQotICBQeWNTdHJpbmdfSU1QT1JUOwotICBpZiAoUHljU3RyaW5nSU8gPT0gTlVMTCkgcmV0dXJuOwotCi0gICh2b2lkKSBQeV9Jbml0TW9kdWxlKCJ0aHJpZnQucHJvdG9jb2wuZmFzdGJpbmFyeSIsIFRocmlmdEZhc3RCaW5hcnlNZXRob2RzKTsKLX0KZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvc2VydmVyL1RIdHRwU2VydmVyLnB5IGIvbGliL3B5L3NyYy9zZXJ2ZXIvVEh0dHBTZXJ2ZXIucHkKaW5kZXggMzA0N2Q5Yy4uODVjZjQwMCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9zZXJ2ZXIvVEh0dHBTZXJ2ZXIucHkKKysrIGIvbGliL3B5L3NyYy9zZXJ2ZXIvVEh0dHBTZXJ2ZXIucHkKQEAgLTE3LDY2ICsxNyw5MCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IEJhc2VIVFRQU2VydmVyCitpbXBvcnQgc3NsCisKK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCBCYXNlSFRUUFNlcnZlcgogCiBmcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogCi1jbGFzcyBSZXNwb25zZUV4Y2VwdGlvbihFeGNlcHRpb24pOgotICAiIiJBbGxvd3MgaGFuZGxlcnMgdG8gb3ZlcnJpZGUgdGhlIEhUVFAgcmVzcG9uc2UKIAotICBOb3JtYWxseSwgVEh0dHBTZXJ2ZXIgYWx3YXlzIHNlbmRzIGEgMjAwIHJlc3BvbnNlLiAgSWYgYSBoYW5kbGVyIHdhbnRzCi0gIHRvIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IgKGUuZy4sIHRvIHNpbXVsYXRlIGEgbWlzY29uZmlndXJlZCBvcgotICBvdmVybG9hZGVkIHdlYiBzZXJ2ZXIgZHVyaW5nIHRlc3RpbmcpLCBpdCBjYW4gcmFpc2UgYSBSZXNwb25zZUV4Y2VwdGlvbi4KLSAgVGhlIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3Igd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUKLSAgUmVxdWVzdEhhbmRsZXIgYXMgaXRzIG9ubHkgYXJndW1lbnQuCi0gICIiIgotICBkZWYgX19pbml0X18oc2VsZiwgaGFuZGxlcik6Ci0gICAgc2VsZi5oYW5kbGVyID0gaGFuZGxlcgorY2xhc3MgUmVzcG9uc2VFeGNlcHRpb24oRXhjZXB0aW9uKToKKyAgICAiIiJBbGxvd3MgaGFuZGxlcnMgdG8gb3ZlcnJpZGUgdGhlIEhUVFAgcmVzcG9uc2UKKworICAgIE5vcm1hbGx5LCBUSHR0cFNlcnZlciBhbHdheXMgc2VuZHMgYSAyMDAgcmVzcG9uc2UuICBJZiBhIGhhbmRsZXIgd2FudHMKKyAgICB0byBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIChlLmcuLCB0byBzaW11bGF0ZSBhIG1pc2NvbmZpZ3VyZWQgb3IKKyAgICBvdmVybG9hZGVkIHdlYiBzZXJ2ZXIgZHVyaW5nIHRlc3RpbmcpLCBpdCBjYW4gcmFpc2UgYSBSZXNwb25zZUV4Y2VwdGlvbi4KKyAgICBUaGUgZnVuY3Rpb24gcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZQorICAgIFJlcXVlc3RIYW5kbGVyIGFzIGl0cyBvbmx5IGFyZ3VtZW50LgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBoYW5kbGVyKToKKyAgICAgICAgc2VsZi5oYW5kbGVyID0gaGFuZGxlcgogCiAKIGNsYXNzIFRIdHRwU2VydmVyKFRTZXJ2ZXIuVFNlcnZlcik6Ci0gICIiIkEgc2ltcGxlIEhUVFAtYmFzZWQgVGhyaWZ0IHNlcnZlcgorICAgICIiIkEgc2ltcGxlIEhUVFAtYmFzZWQgVGhyaWZ0IHNlcnZlcgogCi0gIFRoaXMgY2xhc3MgaXMgbm90IHZlcnkgcGVyZm9ybWFudCwgYnV0IGl0IGlzIHVzZWZ1bCAoZm9yIGV4YW1wbGUpIGZvcgotICBhY3RpbmcgYXMgYSBtb2NrIHZlcnNpb24gb2YgYW4gQXBhY2hlLWJhc2VkIFBIUCBUaHJpZnQgZW5kcG9pbnQuIiIiCisgICAgVGhpcyBjbGFzcyBpcyBub3QgdmVyeSBwZXJmb3JtYW50LCBidXQgaXQgaXMgdXNlZnVsIChmb3IgZXhhbXBsZSkgZm9yCisgICAgYWN0aW5nIGFzIGEgbW9jayB2ZXJzaW9uIG9mIGFuIEFwYWNoZS1iYXNlZCBQSFAgVGhyaWZ0IGVuZHBvaW50LgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgIHNlcnZlcl9hZGRyZXNzLAorICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5PU5vbmUsCisgICAgICAgICAgICAgICAgIHNlcnZlcl9jbGFzcz1CYXNlSFRUUFNlcnZlci5IVFRQU2VydmVyLAorICAgICAgICAgICAgICAgICAqKmt3YXJncyk6CisgICAgICAgICIiIlNldCB1cCBwcm90b2NvbCBmYWN0b3JpZXMgYW5kIEhUVFAgKG9yIEhUVFBTKSBzZXJ2ZXIuCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2Nlc3Nvciwgc2VydmVyX2FkZHJlc3MsCi0gICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gTm9uZSwKLSAgICAgIHNlcnZlcl9jbGFzcyA9IEJhc2VIVFRQU2VydmVyLkhUVFBTZXJ2ZXIpOgotICAgICIiIlNldCB1cCBwcm90b2NvbCBmYWN0b3JpZXMgYW5kIEhUVFAgc2VydmVyLgorICAgICAgICBTZWUgQmFzZUhUVFBTZXJ2ZXIgZm9yIHNlcnZlcl9hZGRyZXNzLgorICAgICAgICBTZWUgVFNlcnZlciBmb3IgcHJvdG9jb2wgZmFjdG9yaWVzLgogCi0gICAgU2VlIEJhc2VIVFRQU2VydmVyIGZvciBzZXJ2ZXJfYWRkcmVzcy4KLSAgICBTZWUgVFNlcnZlciBmb3IgcHJvdG9jb2wgZmFjdG9yaWVzLiIiIgorICAgICAgICBUbyBtYWtlIGEgc2VjdXJlIHNlcnZlciwgcHJvdmlkZSB0aGUgbmFtZWQgYXJndW1lbnRzOgorICAgICAgICAqIGNhZmlsZSAgICAtIHRvIHZhbGlkYXRlIGNsaWVudHMgW29wdGlvbmFsXQorICAgICAgICAqIGNlcnRfZmlsZSAtIHRoZSBzZXJ2ZXIgY2VydAorICAgICAgICAqIGtleV9maWxlICAtIHRoZSBzZXJ2ZXIncyBrZXkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG91dHB1dFByb3RvY29sRmFjdG9yeSBpcyBOb25lOgorICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3RvcnkKIAotICAgIGlmIG91dHB1dFByb3RvY29sRmFjdG9yeSBpcyBOb25lOgotICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3RvcnkKKyAgICAgICAgVFNlcnZlci5UU2VydmVyLl9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgTm9uZSwgTm9uZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCiAKLSAgICBUU2VydmVyLlRTZXJ2ZXIuX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBOb25lLCBOb25lLCBOb25lLAotICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorICAgICAgICB0aHR0cHNlcnZlciA9IHNlbGYKIAotICAgIHRodHRwc2VydmVyID0gc2VsZgorICAgICAgICBjbGFzcyBSZXF1ZXN0SGFuZGVyKEJhc2VIVFRQU2VydmVyLkJhc2VIVFRQUmVxdWVzdEhhbmRsZXIpOgorICAgICAgICAgICAgZGVmIGRvX1BPU1Qoc2VsZik6CisgICAgICAgICAgICAgICAgIyBEb24ndCBjYXJlIGFib3V0IHRoZSByZXF1ZXN0IHBhdGguCisgICAgICAgICAgICAgICAgaXRyYW5zID0gVFRyYW5zcG9ydC5URmlsZU9iamVjdFRyYW5zcG9ydChzZWxmLnJmaWxlKQorICAgICAgICAgICAgICAgIG90cmFucyA9IFRUcmFuc3BvcnQuVEZpbGVPYmplY3RUcmFuc3BvcnQoc2VsZi53ZmlsZSkKKyAgICAgICAgICAgICAgICBpdHJhbnMgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydCgKKyAgICAgICAgICAgICAgICAgICAgaXRyYW5zLCBpbnQoc2VsZi5oZWFkZXJzWydDb250ZW50LUxlbmd0aCddKSkKKyAgICAgICAgICAgICAgICBvdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICAgICAgICAgIGlwcm90ID0gdGh0dHBzZXJ2ZXIuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQorICAgICAgICAgICAgICAgIG9wcm90ID0gdGh0dHBzZXJ2ZXIub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHRodHRwc2VydmVyLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgICAgICAgICAgICBleGNlcHQgUmVzcG9uc2VFeGNlcHRpb24gYXMgZXhuOgorICAgICAgICAgICAgICAgICAgICBleG4uaGFuZGxlcihzZWxmKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDApCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoImNvbnRlbnQtdHlwZSIsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLndmaWxlLndyaXRlKG90cmFucy5nZXR2YWx1ZSgpKQogCi0gICAgY2xhc3MgUmVxdWVzdEhhbmRlcihCYXNlSFRUUFNlcnZlci5CYXNlSFRUUFJlcXVlc3RIYW5kbGVyKToKLSAgICAgIGRlZiBkb19QT1NUKHNlbGYpOgotICAgICAgICAjIERvbid0IGNhcmUgYWJvdXQgdGhlIHJlcXVlc3QgcGF0aC4KLSAgICAgICAgaXRyYW5zID0gVFRyYW5zcG9ydC5URmlsZU9iamVjdFRyYW5zcG9ydChzZWxmLnJmaWxlKQotICAgICAgICBvdHJhbnMgPSBUVHJhbnNwb3J0LlRGaWxlT2JqZWN0VHJhbnNwb3J0KHNlbGYud2ZpbGUpCi0gICAgICAgIGl0cmFucyA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KGl0cmFucywgaW50KHNlbGYuaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSkpCi0gICAgICAgIG90cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gICAgICAgIGlwcm90ID0gdGh0dHBzZXJ2ZXIuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQotICAgICAgICBvcHJvdCA9IHRodHRwc2VydmVyLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCi0gICAgICAgIHRyeToKLSAgICAgICAgICB0aHR0cHNlcnZlci5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCi0gICAgICAgIGV4Y2VwdCBSZXNwb25zZUV4Y2VwdGlvbiwgZXhuOgotICAgICAgICAgIGV4bi5oYW5kbGVyKHNlbGYpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDIwMCkKLSAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJjb250ZW50LXR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQotICAgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQotICAgICAgICAgIHNlbGYud2ZpbGUud3JpdGUob3RyYW5zLmdldHZhbHVlKCkpCisgICAgICAgIHNlbGYuaHR0cGQgPSBzZXJ2ZXJfY2xhc3Moc2VydmVyX2FkZHJlc3MsIFJlcXVlc3RIYW5kZXIpCiAKLSAgICBzZWxmLmh0dHBkID0gc2VydmVyX2NsYXNzKHNlcnZlcl9hZGRyZXNzLCBSZXF1ZXN0SGFuZGVyKQorICAgICAgICBpZiAoa3dhcmdzLmdldCgnY2FmaWxlJykgb3Iga3dhcmdzLmdldCgnY2VydF9maWxlJykgb3Iga3dhcmdzLmdldCgna2V5X2ZpbGUnKSk6CisgICAgICAgICAgICBjb250ZXh0ID0gc3NsLmNyZWF0ZV9kZWZhdWx0X2NvbnRleHQoY2FmaWxlPWt3YXJncy5nZXQoJ2NhZmlsZScpKQorICAgICAgICAgICAgY29udGV4dC5jaGVja19ob3N0bmFtZSA9IEZhbHNlCisgICAgICAgICAgICBjb250ZXh0LmxvYWRfY2VydF9jaGFpbihrd2FyZ3MuZ2V0KCdjZXJ0X2ZpbGUnKSwga3dhcmdzLmdldCgna2V5X2ZpbGUnKSkKKyAgICAgICAgICAgIGNvbnRleHQudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRCBpZiBrd2FyZ3MuZ2V0KCdjYWZpbGUnKSBlbHNlIHNzbC5DRVJUX05PTkUKKyAgICAgICAgICAgIHNlbGYuaHR0cGQuc29ja2V0ID0gY29udGV4dC53cmFwX3NvY2tldChzZWxmLmh0dHBkLnNvY2tldCwgc2VydmVyX3NpZGU9VHJ1ZSkKIAotICBkZWYgc2VydmUoc2VsZik6Ci0gICAgc2VsZi5odHRwZC5zZXJ2ZV9mb3JldmVyKCkKKyAgICBkZWYgc2VydmUoc2VsZik6CisgICAgICAgIHNlbGYuaHR0cGQuc2VydmVfZm9yZXZlcigpCisKKyAgICBkZWYgc2h1dGRvd24oc2VsZik6CisgICAgICAgIHNlbGYuaHR0cGQuc29ja2V0LmNsb3NlKCkKKyAgICAgICAgIyBzZWxmLmh0dHBkLnNodXRkb3duKCkgIyBoYW5ncyBmb3JldmVyLCBweXRob24gZG9lc24ndCBoYW5kbGUgUE9MTE5WQUwgcHJvcGVybHkhCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIucHkgYi9saWIvcHkvc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIucHkKaW5kZXggZWEzNDhhMC4uZjYyZDQ4NiAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLnB5CisrKyBiL2xpYi9weS9zcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5weQpAQCAtMTgsMjUgKzE4LDMzIEBACiAjCiAiIiJJbXBsZW1lbnRhdGlvbiBvZiBub24tYmxvY2tpbmcgc2VydmVyLgogCi1UaGUgbWFpbiBpZGVhIG9mIHRoZSBzZXJ2ZXIgaXMgcmVjaXZpbmcgYW5kIHNlbmRpbmcgcmVxdWVzdHMKLW9ubHkgZnJvbSBtYWluIHRocmVhZC4KK1RoZSBtYWluIGlkZWEgb2YgdGhlIHNlcnZlciBpcyB0byByZWNlaXZlIGFuZCBzZW5kIHJlcXVlc3RzCitvbmx5IGZyb20gdGhlIG1haW4gdGhyZWFkLgogCi1JdCBhbHNvIG1ha2VzIHRocmVhZCBwb29sIHNlcnZlciBpbiB0YXNrcyB0ZXJtcywgbm90IGNvbm5lY3Rpb25zLgorVGhlIHRocmVhZCBwb29vbCBzaG91bGQgYmUgc2l6ZWQgZm9yIGNvbmN1cnJlbnQgdGFza3MsIG5vdAorbWF4aW11bSBjb25uZWN0aW9ucwogIiIiCi1pbXBvcnQgdGhyZWFkaW5nCi1pbXBvcnQgc29ja2V0Ci1pbXBvcnQgUXVldWUKLWltcG9ydCBzZWxlY3QKLWltcG9ydCBzdHJ1Y3QKKwogaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBzZWxlY3QKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCB0aHJlYWRpbmcKKworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCBxdWV1ZQogCiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIGZyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sRmFjdG9yeQogCiBfX2FsbF9fID0gWydUTm9uYmxvY2tpbmdTZXJ2ZXInXQogCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKKworCiBjbGFzcyBXb3JrZXIodGhyZWFkaW5nLlRocmVhZCk6CiAgICAgIiIiV29ya2VyIGlzIGEgc21hbGwgaGVscGVyIHRvIHByb2Nlc3MgaW5jb21pbmcgY29ubmVjdGlvbi4iIiIKKwogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBxdWV1ZSk6CiAgICAgICAgIHRocmVhZGluZy5UaHJlYWQuX19pbml0X18oc2VsZikKICAgICAgICAgc2VsZi5xdWV1ZSA9IHF1ZXVlCkBAIC01MSw4ICs1OSw5IEBACiAgICAgICAgICAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQogICAgICAgICAgICAgICAgIGNhbGxiYWNrKFRydWUsIG90cmFucy5nZXR2YWx1ZSgpKQogICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbigiRXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcgcmVxdWVzdCIpCi0gICAgICAgICAgICAgICAgY2FsbGJhY2soRmFsc2UsICcnKQorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oIkV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIHJlcXVlc3QiLCBleGNfaW5mbz1UcnVlKQorICAgICAgICAgICAgICAgIGNhbGxiYWNrKEZhbHNlLCBiJycpCisKIAogV0FJVF9MRU4gPSAwCiBXQUlUX01FU1NBR0UgPSAxCkBAIC02MCw4ICs2OSw5IEBACiBTRU5EX0FOU1dFUiA9IDMKIENMT1NFRCA9IDQKIAorCiBkZWYgbG9ja2VkKGZ1bmMpOgotICAgICJEZWNvcmF0b3Igd2hpY2ggbG9ja3Mgc2VsZi5sb2NrLiIKKyAgICAiIiJEZWNvcmF0b3Igd2hpY2ggbG9ja3Mgc2VsZi5sb2NrLiIiIgogICAgIGRlZiBuZXN0ZWQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgc2VsZi5sb2NrLmFjcXVpcmUoKQogICAgICAgICB0cnk6CkBAIC03MCwyNSArODAsNDAgQEAKICAgICAgICAgICAgIHNlbGYubG9jay5yZWxlYXNlKCkKICAgICByZXR1cm4gbmVzdGVkCiAKKwogZGVmIHNvY2tldF9leGNlcHRpb24oZnVuYyk6Ci0gICAgIkRlY29yYXRvciBjbG9zZSBvYmplY3Qgb24gc29ja2V0LmVycm9yLiIKKyAgICAiIiJEZWNvcmF0b3IgY2xvc2Ugb2JqZWN0IG9uIHNvY2tldC5lcnJvci4iIiIKICAgICBkZWYgcmVhZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICB0cnk6CiAgICAgICAgICAgICByZXR1cm4gZnVuYyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCiAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ2lnbm9yaW5nIHNvY2tldCBleGNlcHRpb24nLCBleGNfaW5mbz1UcnVlKQogICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgcmV0dXJuIHJlYWQKIAotY2xhc3MgQ29ubmVjdGlvbjoKKworY2xhc3MgTWVzc2FnZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvZmZzZXQsIGxlbl8sIGhlYWRlcik6CisgICAgICAgIHNlbGYub2Zmc2V0ID0gb2Zmc2V0CisgICAgICAgIHNlbGYubGVuID0gbGVuXworICAgICAgICBzZWxmLmJ1ZmZlciA9IE5vbmUKKyAgICAgICAgc2VsZi5pc19oZWFkZXIgPSBoZWFkZXIKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBlbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm9mZnNldCArIHNlbGYubGVuCisKKworY2xhc3MgQ29ubmVjdGlvbihvYmplY3QpOgogICAgICIiIkJhc2ljIGNsYXNzIGlzIHJlcHJlc2VudGVkIGNvbm5lY3Rpb24uCi0gICAgCisKICAgICBJdCBjYW4gYmUgaW4gc3RhdGU6CiAgICAgICAgIFdBSVRfTEVOIC0tLSBjb25uZWN0aW9uIGlzIHJlYWRpbmcgcmVxdWVzdCBsZW4uCiAgICAgICAgIFdBSVRfTUVTU0FHRSAtLS0gY29ubmVjdGlvbiBpcyByZWFkaW5nIHJlcXVlc3QuCi0gICAgICAgIFdBSVRfUFJPQ0VTUyAtLS0gY29ubmVjdGlvbiBoYXMganVzdCByZWFkIHdob2xlIHJlcXVlc3QgYW5kIAotICAgICAgICAgICAgd2FpdHMgZm9yIGNhbGwgcmVhZHkgcm91dGluZS4KKyAgICAgICAgV0FJVF9QUk9DRVNTIC0tLSBjb25uZWN0aW9uIGhhcyBqdXN0IHJlYWQgd2hvbGUgcmVxdWVzdCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0cyBmb3IgY2FsbCByZWFkeSByb3V0aW5lLgogICAgICAgICBTRU5EX0FOU1dFUiAtLS0gY29ubmVjdGlvbiBpcyBzZW5kaW5nIGFuc3dlciBzdHJpbmcgKGluY2x1ZGluZyBsZW5ndGgKLSAgICAgICAgICAgIG9mIGFuc3dlcikuCisgICAgICAgICAgICAgICAgICAgICAgICBvZiBhbnN3ZXIpLgogICAgICAgICBDTE9TRUQgLS0tIHNvY2tldCB3YXMgY2xvc2VkIGFuZCBjb25uZWN0aW9uIHNob3VsZCBiZSBkZWxldGVkLgogICAgICIiIgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuZXdfc29ja2V0LCB3YWtlX3VwKToKQEAgLTk2LDgwICsxMjEsNzIgQEAKICAgICAgICAgc2VsZi5zb2NrZXQuc2V0YmxvY2tpbmcoRmFsc2UpCiAgICAgICAgIHNlbGYuc3RhdHVzID0gV0FJVF9MRU4KICAgICAgICAgc2VsZi5sZW4gPSAwCi0gICAgICAgIHNlbGYubWVzc2FnZSA9ICcnCisgICAgICAgIHNlbGYucmVjZWl2ZWQgPSBkZXF1ZSgpCisgICAgICAgIHNlbGYuX3JlYWRpbmcgPSBNZXNzYWdlKDAsIDQsIFRydWUpCisgICAgICAgIHNlbGYuX3JidWYgPSBiJycKKyAgICAgICAgc2VsZi5fd2J1ZiA9IGInJwogICAgICAgICBzZWxmLmxvY2sgPSB0aHJlYWRpbmcuTG9jaygpCiAgICAgICAgIHNlbGYud2FrZV91cCA9IHdha2VfdXAKLQotICAgIGRlZiBfcmVhZF9sZW4oc2VsZik6Ci0gICAgICAgICIiIlJlYWRzIGxlbmd0aCBvZiByZXF1ZXN0LgotICAgICAgICAKLSAgICAgICAgSXQncyByZWFsbHkgcGFyYW5vaWMgcm91dGluZSBhbmQgaXQgbWF5IGJlIHJlcGxhY2VkIGJ5IAotICAgICAgICBzZWxmLnNvY2tldC5yZWN2KDQpLiIiIgotICAgICAgICByZWFkID0gc2VsZi5zb2NrZXQucmVjdig0IC0gbGVuKHNlbGYubWVzc2FnZSkpCi0gICAgICAgIGlmIGxlbihyZWFkKSA9PSAwOgotICAgICAgICAgICAgIyBpZiB3ZSByZWFkIDAgYnl0ZXMgYW5kIHNlbGYubWVzc2FnZSBpcyBlbXB0eSwgaXQgbWVhbnMgY2xpZW50IGNsb3NlIAotICAgICAgICAgICAgIyBjb25uZWN0aW9uCi0gICAgICAgICAgICBpZiBsZW4oc2VsZi5tZXNzYWdlKSAhPSAwOgotICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoImNhbid0IHJlYWQgZnJhbWUgc2l6ZSBmcm9tIHNvY2tldCIpCi0gICAgICAgICAgICBzZWxmLmNsb3NlKCkKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLm1lc3NhZ2UgKz0gcmVhZAotICAgICAgICBpZiBsZW4oc2VsZi5tZXNzYWdlKSA9PSA0OgotICAgICAgICAgICAgc2VsZi5sZW4sID0gc3RydWN0LnVucGFjaygnIWknLCBzZWxmLm1lc3NhZ2UpCi0gICAgICAgICAgICBpZiBzZWxmLmxlbiA8IDA6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigibmVnYXRpdmUgZnJhbWUgc2l6ZSwgaXQgc2VlbXMgY2xpZW50IlwKLSAgICAgICAgICAgICAgICAgICAgIiBkb2Vzbid0IHVzZSBGcmFtZWRUcmFuc3BvcnQiKQotICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQotICAgICAgICAgICAgZWxpZiBzZWxmLmxlbiA9PSAwOgotICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoImVtcHR5IGZyYW1lLCBpdCdzIHJlYWxseSBzdHJhbmdlIikKLSAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gJycKLSAgICAgICAgICAgICAgICBzZWxmLnN0YXR1cyA9IFdBSVRfTUVTU0FHRQorICAgICAgICBzZWxmLnJlbWFpbmluZyA9IEZhbHNlCiAKICAgICBAc29ja2V0X2V4Y2VwdGlvbgogICAgIGRlZiByZWFkKHNlbGYpOgogICAgICAgICAiIiJSZWFkcyBkYXRhIGZyb20gc3RyZWFtIGFuZCBzd2l0Y2ggc3RhdGUuIiIiCiAgICAgICAgIGFzc2VydCBzZWxmLnN0YXR1cyBpbiAoV0FJVF9MRU4sIFdBSVRfTUVTU0FHRSkKLSAgICAgICAgaWYgc2VsZi5zdGF0dXMgPT0gV0FJVF9MRU46Ci0gICAgICAgICAgICBzZWxmLl9yZWFkX2xlbigpCi0gICAgICAgICAgICAjIGdvIGJhY2sgdG8gdGhlIG1haW4gbG9vcCBoZXJlIGZvciBzaW1wbGljaXR5IGluc3RlYWQgb2YKLSAgICAgICAgICAgICMgZmFsbGluZyB0aHJvdWdoLCBldmVuIHRob3VnaCB0aGVyZSBpcyBhIGdvb2QgY2hhbmNlIHRoYXQKLSAgICAgICAgICAgICMgdGhlIG1lc3NhZ2UgaXMgYWxyZWFkeSBhdmFpbGFibGUKLSAgICAgICAgZWxpZiBzZWxmLnN0YXR1cyA9PSBXQUlUX01FU1NBR0U6Ci0gICAgICAgICAgICByZWFkID0gc2VsZi5zb2NrZXQucmVjdihzZWxmLmxlbiAtIGxlbihzZWxmLm1lc3NhZ2UpKQotICAgICAgICAgICAgaWYgbGVuKHJlYWQpID09IDA6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigiY2FuJ3QgcmVhZCBmcmFtZSBmcm9tIHNvY2tldCAoZ2V0ICVkIG9mICVkIGJ5dGVzKSIgJQotICAgICAgICAgICAgICAgICAgICAobGVuKHNlbGYubWVzc2FnZSksIHNlbGYubGVuKSkKKyAgICAgICAgYXNzZXJ0IG5vdCBzZWxmLnJlY2VpdmVkCisgICAgICAgIGJ1Zl9zaXplID0gODE5MgorICAgICAgICBmaXJzdCA9IFRydWUKKyAgICAgICAgZG9uZSA9IEZhbHNlCisgICAgICAgIHdoaWxlIG5vdCBkb25lOgorICAgICAgICAgICAgcmVhZCA9IHNlbGYuc29ja2V0LnJlY3YoYnVmX3NpemUpCisgICAgICAgICAgICBybGVuID0gbGVuKHJlYWQpCisgICAgICAgICAgICBkb25lID0gcmxlbiA8IGJ1Zl9zaXplCisgICAgICAgICAgICBzZWxmLl9yYnVmICs9IHJlYWQKKyAgICAgICAgICAgIGlmIGZpcnN0IGFuZCBybGVuID09IDA6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5zdGF0dXMgIT0gV0FJVF9MRU4gb3Igc2VsZi5fcmJ1ZjoKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdjb3VsZCBub3QgcmVhZCBmcmFtZSBmcm9tIHNvY2tldCcpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdyZWFkIHplcm8gbGVuZ3RoLiBjbGllbnQgbWlnaHQgaGF2ZSBkaXNjb25uZWN0ZWQnKQogICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQotICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgc2VsZi5tZXNzYWdlICs9IHJlYWQKLSAgICAgICAgICAgIGlmIGxlbihzZWxmLm1lc3NhZ2UpID09IHNlbGYubGVuOgorICAgICAgICAgICAgd2hpbGUgbGVuKHNlbGYuX3JidWYpID49IHNlbGYuX3JlYWRpbmcuZW5kOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX3JlYWRpbmcuaXNfaGVhZGVyOgorICAgICAgICAgICAgICAgICAgICBtbGVuLCA9IHN0cnVjdC51bnBhY2soJyFpJywgc2VsZi5fcmJ1Zls6NF0pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlYWRpbmcgPSBNZXNzYWdlKHNlbGYuX3JlYWRpbmcuZW5kLCBtbGVuLCBGYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSBXQUlUX01FU1NBR0UKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZWFkaW5nLmJ1ZmZlciA9IHNlbGYuX3JidWYKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWNlaXZlZC5hcHBlbmQoc2VsZi5fcmVhZGluZykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmJ1ZiA9IHNlbGYuX3JidWZbc2VsZi5fcmVhZGluZy5lbmQ6XQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZWFkaW5nID0gTWVzc2FnZSgwLCA0LCBUcnVlKQorICAgICAgICAgICAgZmlyc3QgPSBGYWxzZQorICAgICAgICAgICAgaWYgc2VsZi5yZWNlaXZlZDoKICAgICAgICAgICAgICAgICBzZWxmLnN0YXR1cyA9IFdBSVRfUFJPQ0VTUworICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHNlbGYucmVtYWluaW5nID0gbm90IGRvbmUKIAogICAgIEBzb2NrZXRfZXhjZXB0aW9uCiAgICAgZGVmIHdyaXRlKHNlbGYpOgogICAgICAgICAiIiJXcml0ZXMgZGF0YSBmcm9tIHNvY2tldCBhbmQgc3dpdGNoIHN0YXRlLiIiIgogICAgICAgICBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gU0VORF9BTlNXRVIKLSAgICAgICAgc2VudCA9IHNlbGYuc29ja2V0LnNlbmQoc2VsZi5tZXNzYWdlKQotICAgICAgICBpZiBzZW50ID09IGxlbihzZWxmLm1lc3NhZ2UpOgorICAgICAgICBzZW50ID0gc2VsZi5zb2NrZXQuc2VuZChzZWxmLl93YnVmKQorICAgICAgICBpZiBzZW50ID09IGxlbihzZWxmLl93YnVmKToKICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gV0FJVF9MRU4KLSAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9ICcnCisgICAgICAgICAgICBzZWxmLl93YnVmID0gYicnCiAgICAgICAgICAgICBzZWxmLmxlbiA9IDAKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9IHNlbGYubWVzc2FnZVtzZW50Ol0KKyAgICAgICAgICAgIHNlbGYuX3didWYgPSBzZWxmLl93YnVmW3NlbnQ6XQogCiAgICAgQGxvY2tlZAogICAgIGRlZiByZWFkeShzZWxmLCBhbGxfb2ssIG1lc3NhZ2UpOgogICAgICAgICAiIiJDYWxsYmFjayBmdW5jdGlvbiBmb3Igc3dpdGNoaW5nIHN0YXRlIGFuZCB3YWtpbmcgdXAgbWFpbiB0aHJlYWQuCi0gICAgICAgIAorCiAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG9ubHkgZnVuY3Rpb24gd2l0Y2ggY2FuIGJlIGNhbGxlZCBhc3luY2hyb25vdXMuCi0gICAgICAgIAorCiAgICAgICAgIFRoZSByZWFkeSBjYW4gc3dpdGNoIENvbm5lY3Rpb24gdG8gdGhyZWUgc3RhdGVzOgogICAgICAgICAgICAgV0FJVF9MRU4gaWYgcmVxdWVzdCB3YXMgb25ld2F5LgogICAgICAgICAgICAgU0VORF9BTlNXRVIgaWYgcmVxdWVzdCB3YXMgcHJvY2Vzc2VkIGluIG5vcm1hbCB3YXkuCiAgICAgICAgICAgICBDTE9TRUQgaWYgcmVxdWVzdCB0aHJvd3MgdW5leHBlY3RlZCBleGNlcHRpb24uCi0gICAgICAgIAorCiAgICAgICAgIFRoZSBvbmUgd2FrZXMgdXAgbWFpbiB0aHJlYWQuCiAgICAgICAgICIiIgogICAgICAgICBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gV0FJVF9QUk9DRVNTCkBAIC0xNzcsNjUgKzE5NCw3NCBAQAogICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgICAgICAgICBzZWxmLndha2VfdXAoKQogICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYubGVuID0gJycKKyAgICAgICAgc2VsZi5sZW4gPSAwCiAgICAgICAgIGlmIGxlbihtZXNzYWdlKSA9PSAwOgogICAgICAgICAgICAgIyBpdCB3YXMgYSBvbmV3YXkgcmVxdWVzdCwgZG8gbm90IHdyaXRlIGFuc3dlcgotICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gJycKKyAgICAgICAgICAgIHNlbGYuX3didWYgPSBiJycKICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gV0FJVF9MRU4KICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9IHN0cnVjdC5wYWNrKCchaScsIGxlbihtZXNzYWdlKSkgKyBtZXNzYWdlCisgICAgICAgICAgICBzZWxmLl93YnVmID0gc3RydWN0LnBhY2soJyFpJywgbGVuKG1lc3NhZ2UpKSArIG1lc3NhZ2UKICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gU0VORF9BTlNXRVIKICAgICAgICAgc2VsZi53YWtlX3VwKCkKIAogICAgIEBsb2NrZWQKICAgICBkZWYgaXNfd3JpdGVhYmxlKHNlbGYpOgotICAgICAgICAiUmV0dXJucyBUcnVlIGlmIGNvbm5lY3Rpb24gc2hvdWxkIGJlIGFkZGVkIHRvIHdyaXRlIGxpc3Qgb2Ygc2VsZWN0LiIKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgY29ubmVjdGlvbiBzaG91bGQgYmUgYWRkZWQgdG8gd3JpdGUgbGlzdCBvZiBzZWxlY3QiIiIKICAgICAgICAgcmV0dXJuIHNlbGYuc3RhdHVzID09IFNFTkRfQU5TV0VSCiAKICAgICAjIGl0J3Mgbm90IG5lY2Vzc2FyeSwgYnV0Li4uCiAgICAgQGxvY2tlZAogICAgIGRlZiBpc19yZWFkYWJsZShzZWxmKToKLSAgICAgICAgIlJldHVybnMgVHJ1ZSBpZiBjb25uZWN0aW9uIHNob3VsZCBiZSBhZGRlZCB0byByZWFkIGxpc3Qgb2Ygc2VsZWN0LiIKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgY29ubmVjdGlvbiBzaG91bGQgYmUgYWRkZWQgdG8gcmVhZCBsaXN0IG9mIHNlbGVjdCIiIgogICAgICAgICByZXR1cm4gc2VsZi5zdGF0dXMgaW4gKFdBSVRfTEVOLCBXQUlUX01FU1NBR0UpCiAKICAgICBAbG9ja2VkCiAgICAgZGVmIGlzX2Nsb3NlZChzZWxmKToKLSAgICAgICAgIlJldHVybnMgVHJ1ZSBpZiBjb25uZWN0aW9uIGlzIGNsb3NlZC4iCisgICAgICAgICIiIlJldHVybnMgVHJ1ZSBpZiBjb25uZWN0aW9uIGlzIGNsb3NlZC4iIiIKICAgICAgICAgcmV0dXJuIHNlbGYuc3RhdHVzID09IENMT1NFRAogCiAgICAgZGVmIGZpbGVubyhzZWxmKToKLSAgICAgICAgIlJldHVybnMgdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgYXNzb2NpYXRlZCBzb2NrZXQuIgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGFzc29jaWF0ZWQgc29ja2V0LiIiIgogICAgICAgICByZXR1cm4gc2VsZi5zb2NrZXQuZmlsZW5vKCkKIAogICAgIGRlZiBjbG9zZShzZWxmKToKLSAgICAgICAgIkNsb3NlcyBjb25uZWN0aW9uIgorICAgICAgICAiIiJDbG9zZXMgY29ubmVjdGlvbiIiIgogICAgICAgICBzZWxmLnN0YXR1cyA9IENMT1NFRAogICAgICAgICBzZWxmLnNvY2tldC5jbG9zZSgpCiAKLWNsYXNzIFROb25ibG9ja2luZ1NlcnZlcjoKKworY2xhc3MgVE5vbmJsb2NraW5nU2VydmVyKG9iamVjdCk6CiAgICAgIiIiTm9uLWJsb2NraW5nIHNlcnZlci4iIiIKLSAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBsc29ja2V0LCBpbnB1dFByb3RvY29sRmFjdG9yeT1Ob25lLCAKLSAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeT1Ob25lLCB0aHJlYWRzPTEwKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgIGxzb2NrZXQsCisgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5PU5vbmUsCisgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeT1Ob25lLAorICAgICAgICAgICAgICAgICB0aHJlYWRzPTEwKToKICAgICAgICAgc2VsZi5wcm9jZXNzb3IgPSBwcm9jZXNzb3IKICAgICAgICAgc2VsZi5zb2NrZXQgPSBsc29ja2V0CiAgICAgICAgIHNlbGYuaW5fcHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeSBvciBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKICAgICAgICAgc2VsZi5vdXRfcHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnkgb3Igc2VsZi5pbl9wcm90b2NvbAogICAgICAgICBzZWxmLnRocmVhZHMgPSBpbnQodGhyZWFkcykKICAgICAgICAgc2VsZi5jbGllbnRzID0ge30KLSAgICAgICAgc2VsZi50YXNrcyA9IFF1ZXVlLlF1ZXVlKCkKKyAgICAgICAgc2VsZi50YXNrcyA9IHF1ZXVlLlF1ZXVlKCkKICAgICAgICAgc2VsZi5fcmVhZCwgc2VsZi5fd3JpdGUgPSBzb2NrZXQuc29ja2V0cGFpcigpCiAgICAgICAgIHNlbGYucHJlcGFyZWQgPSBGYWxzZQorICAgICAgICBzZWxmLl9zdG9wID0gRmFsc2UKIAogICAgIGRlZiBzZXROdW1UaHJlYWRzKHNlbGYsIG51bSk6CiAgICAgICAgICIiIlNldCB0aGUgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIHRoYXQgc2hvdWxkIGJlIGNyZWF0ZWQuIiIiCiAgICAgICAgICMgaW1wbGVtZW50IFRocmVhZFBvb2wgaW50ZXJmYWNlCi0gICAgICAgIGFzc2VydCBub3Qgc2VsZi5wcmVwYXJlZCwgIllvdSBjYW4ndCBjaGFuZ2UgbnVtYmVyIG9mIHRocmVhZHMgZm9yIHdvcmtpbmcgc2VydmVyIgorICAgICAgICBhc3NlcnQgbm90IHNlbGYucHJlcGFyZWQsICJDYW4ndCBjaGFuZ2UgbnVtYmVyIG9mIHRocmVhZHMgYWZ0ZXIgc3RhcnQiCiAgICAgICAgIHNlbGYudGhyZWFkcyA9IG51bQogCiAgICAgZGVmIHByZXBhcmUoc2VsZik6CiAgICAgICAgICIiIlByZXBhcmVzIHNlcnZlciBmb3Igc2VydmUgcmVxdWVzdHMuIiIiCisgICAgICAgIGlmIHNlbGYucHJlcGFyZWQ6CisgICAgICAgICAgICByZXR1cm4KICAgICAgICAgc2VsZi5zb2NrZXQubGlzdGVuKCkKLSAgICAgICAgZm9yIF8gaW4geHJhbmdlKHNlbGYudGhyZWFkcyk6CisgICAgICAgIGZvciBfIGluIHJhbmdlKHNlbGYudGhyZWFkcyk6CiAgICAgICAgICAgICB0aHJlYWQgPSBXb3JrZXIoc2VsZi50YXNrcykKICAgICAgICAgICAgIHRocmVhZC5zZXREYWVtb24oVHJ1ZSkKICAgICAgICAgICAgIHRocmVhZC5zdGFydCgpCkBAIC0yNDMsNTIgKzI2OSw4MiBAQAogCiAgICAgZGVmIHdha2VfdXAoc2VsZik6CiAgICAgICAgICIiIldha2UgdXAgbWFpbiB0aHJlYWQuCi0gICAgICAgIAotICAgICAgICBUaGUgc2VydmVyIHVzdWFseSB3YWl0cyBpbiBzZWxlY3QgY2FsbCBpbiB3ZSBzaG91bGQgdGVybWluYXRlIG9uZS4KKworICAgICAgICBUaGUgc2VydmVyIHVzdWFsbHkgd2FpdHMgaW4gc2VsZWN0IGNhbGwgaW4gd2Ugc2hvdWxkIHRlcm1pbmF0ZSBvbmUuCiAgICAgICAgIFRoZSBzaW1wbGVzdCB3YXkgaXMgdXNpbmcgc29ja2V0cGFpci4KLSAgICAgICAgCisKICAgICAgICAgU2VsZWN0IGFsd2F5cyB3YWl0IHRvIHJlYWQgZnJvbSB0aGUgZmlyc3Qgc29ja2V0IG9mIHNvY2tldHBhaXIuCi0gICAgICAgIAorCiAgICAgICAgIEluIHRoaXMgY2FzZSwgd2UgY2FuIGp1c3Qgd3JpdGUgYW55dGhpbmcgdG8gdGhlIHNlY29uZCBzb2NrZXQgZnJvbQotICAgICAgICBzb2NrZXRwYWlyLiIiIgotICAgICAgICBzZWxmLl93cml0ZS5zZW5kKCcxJykKKyAgICAgICAgc29ja2V0cGFpci4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3dyaXRlLnNlbmQoYicxJykKKworICAgIGRlZiBzdG9wKHNlbGYpOgorICAgICAgICAiIiJTdG9wIHRoZSBzZXJ2ZXIuCisKKyAgICAgICAgVGhpcyBtZXRob2QgY2F1c2VzIHRoZSBzZXJ2ZSgpIG1ldGhvZCB0byByZXR1cm4uICBzdG9wKCkgbWF5IGJlIGludm9rZWQKKyAgICAgICAgZnJvbSB3aXRoaW4geW91ciBoYW5kbGVyLCBvciBmcm9tIGFub3RoZXIgdGhyZWFkLgorCisgICAgICAgIEFmdGVyIHN0b3AoKSBpcyBjYWxsZWQsIHNlcnZlKCkgd2lsbCByZXR1cm4gYnV0IHRoZSBzZXJ2ZXIgd2lsbCBzdGlsbAorICAgICAgICBiZSBsaXN0ZW5pbmcgb24gdGhlIHNvY2tldC4gIHNlcnZlKCkgbWF5IHRoZW4gYmUgY2FsbGVkIGFnYWluIHRvIHJlc3VtZQorICAgICAgICBwcm9jZXNzaW5nIHJlcXVlc3RzLiAgQWx0ZXJuYXRpdmVseSwgY2xvc2UoKSBtYXkgYmUgY2FsbGVkIGFmdGVyCisgICAgICAgIHNlcnZlKCkgcmV0dXJucyB0byBjbG9zZSB0aGUgc2VydmVyIHNvY2tldCBhbmQgc2h1dGRvd24gYWxsIHdvcmtlcgorICAgICAgICB0aHJlYWRzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fc3RvcCA9IFRydWUKKyAgICAgICAgc2VsZi53YWtlX3VwKCkKIAogICAgIGRlZiBfc2VsZWN0KHNlbGYpOgogICAgICAgICAiIiJEb2VzIHNlbGVjdCBvbiBvcGVuIGNvbm5lY3Rpb25zLiIiIgogICAgICAgICByZWFkYWJsZSA9IFtzZWxmLnNvY2tldC5oYW5kbGUuZmlsZW5vKCksIHNlbGYuX3JlYWQuZmlsZW5vKCldCiAgICAgICAgIHdyaXRhYmxlID0gW10KLSAgICAgICAgZm9yIGksIGNvbm5lY3Rpb24gaW4gc2VsZi5jbGllbnRzLml0ZW1zKCk6CisgICAgICAgIHJlbWFpbmluZyA9IFtdCisgICAgICAgIGZvciBpLCBjb25uZWN0aW9uIGluIGxpc3Qoc2VsZi5jbGllbnRzLml0ZW1zKCkpOgogICAgICAgICAgICAgaWYgY29ubmVjdGlvbi5pc19yZWFkYWJsZSgpOgogICAgICAgICAgICAgICAgIHJlYWRhYmxlLmFwcGVuZChjb25uZWN0aW9uLmZpbGVubygpKQorICAgICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24ucmVtYWluaW5nIG9yIGNvbm5lY3Rpb24ucmVjZWl2ZWQ6CisgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZy5hcHBlbmQoY29ubmVjdGlvbi5maWxlbm8oKSkKICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24uaXNfd3JpdGVhYmxlKCk6CiAgICAgICAgICAgICAgICAgd3JpdGFibGUuYXBwZW5kKGNvbm5lY3Rpb24uZmlsZW5vKCkpCiAgICAgICAgICAgICBpZiBjb25uZWN0aW9uLmlzX2Nsb3NlZCgpOgogICAgICAgICAgICAgICAgIGRlbCBzZWxmLmNsaWVudHNbaV0KLSAgICAgICAgcmV0dXJuIHNlbGVjdC5zZWxlY3QocmVhZGFibGUsIHdyaXRhYmxlLCByZWFkYWJsZSkKLSAgICAgICAgCisgICAgICAgIGlmIHJlbWFpbmluZzoKKyAgICAgICAgICAgIHJldHVybiByZW1haW5pbmcsIFtdLCBbXSwgRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxlY3Quc2VsZWN0KHJlYWRhYmxlLCB3cml0YWJsZSwgcmVhZGFibGUpICsgKFRydWUsKQorCiAgICAgZGVmIGhhbmRsZShzZWxmKToKICAgICAgICAgIiIiSGFuZGxlIHJlcXVlc3RzLgotICAgICAgIAotICAgICAgICBXQVJOSU5HISBZb3UgbXVzdCBjYWxsIHByZXBhcmUgQkVGT1JFIGNhbGxpbmcgaGFuZGxlLgorCisgICAgICAgIFdBUk5JTkchIFlvdSBtdXN0IGNhbGwgcHJlcGFyZSgpIEJFRk9SRSBjYWxsaW5nIGhhbmRsZSgpCiAgICAgICAgICIiIgogICAgICAgICBhc3NlcnQgc2VsZi5wcmVwYXJlZCwgIllvdSBoYXZlIHRvIGNhbGwgcHJlcGFyZSBiZWZvcmUgaGFuZGxlIgotICAgICAgICByc2V0LCB3c2V0LCB4c2V0ID0gc2VsZi5fc2VsZWN0KCkKKyAgICAgICAgcnNldCwgd3NldCwgeHNldCwgc2VsZWN0ZWQgPSBzZWxmLl9zZWxlY3QoKQogICAgICAgICBmb3IgcmVhZGFibGUgaW4gcnNldDoKICAgICAgICAgICAgIGlmIHJlYWRhYmxlID09IHNlbGYuX3JlYWQuZmlsZW5vKCk6CiAgICAgICAgICAgICAgICAgIyBkb24ndCBjYXJlIGkganVzdCBuZWVkIHRvIGNsZWFuIHJlYWRhYmxlIGZsYWcKLSAgICAgICAgICAgICAgICBzZWxmLl9yZWFkLnJlY3YoMTAyNCkgCisgICAgICAgICAgICAgICAgc2VsZi5fcmVhZC5yZWN2KDEwMjQpCiAgICAgICAgICAgICBlbGlmIHJlYWRhYmxlID09IHNlbGYuc29ja2V0LmhhbmRsZS5maWxlbm8oKToKLSAgICAgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNvY2tldC5hY2NlcHQoKS5oYW5kbGUKLSAgICAgICAgICAgICAgICBzZWxmLmNsaWVudHNbY2xpZW50LmZpbGVubygpXSA9IENvbm5lY3Rpb24oY2xpZW50LCBzZWxmLndha2VfdXApCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNvY2tldC5hY2NlcHQoKQorICAgICAgICAgICAgICAgICAgICBpZiBjbGllbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudHNbY2xpZW50LmhhbmRsZS5maWxlbm8oKV0gPSBDb25uZWN0aW9uKGNsaWVudC5oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2FrZV91cCkKKyAgICAgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ2Vycm9yIHdoaWxlIGFjY2VwdGluZycsIGV4Y19pbmZvPVRydWUpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gPSBzZWxmLmNsaWVudHNbcmVhZGFibGVdCi0gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5yZWFkKCkKLSAgICAgICAgICAgICAgICBpZiBjb25uZWN0aW9uLnN0YXR1cyA9PSBXQUlUX1BST0NFU1M6Ci0gICAgICAgICAgICAgICAgICAgIGl0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoY29ubmVjdGlvbi5tZXNzYWdlKQorICAgICAgICAgICAgICAgIGlmIHNlbGVjdGVkOgorICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnJlYWQoKQorICAgICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24ucmVjZWl2ZWQ6CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc3RhdHVzID0gV0FJVF9QUk9DRVNTCisgICAgICAgICAgICAgICAgICAgIG1zZyA9IGNvbm5lY3Rpb24ucmVjZWl2ZWQucG9wbGVmdCgpCisgICAgICAgICAgICAgICAgICAgIGl0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIobXNnLmJ1ZmZlciwgbXNnLm9mZnNldCkKICAgICAgICAgICAgICAgICAgICAgb3RyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCiAgICAgICAgICAgICAgICAgICAgIGlwcm90ID0gc2VsZi5pbl9wcm90b2NvbC5nZXRQcm90b2NvbChpdHJhbnNwb3J0KQogICAgICAgICAgICAgICAgICAgICBvcHJvdCA9IHNlbGYub3V0X3Byb3RvY29sLmdldFByb3RvY29sKG90cmFuc3BvcnQpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYudGFza3MucHV0KFtzZWxmLnByb2Nlc3NvciwgaXByb3QsIG9wcm90LCAKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50YXNrcy5wdXQoW3NlbGYucHJvY2Vzc29yLCBpcHJvdCwgb3Byb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdHJhbnNwb3J0LCBjb25uZWN0aW9uLnJlYWR5XSkKICAgICAgICAgZm9yIHdyaXRlYWJsZSBpbiB3c2V0OgogICAgICAgICAgICAgc2VsZi5jbGllbnRzW3dyaXRlYWJsZV0ud3JpdGUoKQpAQCAtMjk4LDEzICszNTQsMTcgQEAKIAogICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgIiIiQ2xvc2VzIHRoZSBzZXJ2ZXIuIiIiCi0gICAgICAgIGZvciBfIGluIHhyYW5nZShzZWxmLnRocmVhZHMpOgorICAgICAgICBmb3IgXyBpbiByYW5nZShzZWxmLnRocmVhZHMpOgogICAgICAgICAgICAgc2VsZi50YXNrcy5wdXQoW05vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmVdKQogICAgICAgICBzZWxmLnNvY2tldC5jbG9zZSgpCiAgICAgICAgIHNlbGYucHJlcGFyZWQgPSBGYWxzZQotICAgICAgICAKKwogICAgIGRlZiBzZXJ2ZShzZWxmKToKLSAgICAgICAgIiIiU2VydmUgZm9yZXZlci4iIiIKKyAgICAgICAgIiIiU2VydmUgcmVxdWVzdHMuCisKKyAgICAgICAgU2VydmUgcmVxdWVzdHMgZm9yZXZlciwgb3IgdW50aWwgc3RvcCgpIGlzIGNhbGxlZC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3N0b3AgPSBGYWxzZQogICAgICAgICBzZWxmLnByZXBhcmUoKQotICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICB3aGlsZSBub3Qgc2VsZi5fc3RvcDoKICAgICAgICAgICAgIHNlbGYuaGFuZGxlKCkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvc2VydmVyL1RQcm9jZXNzUG9vbFNlcnZlci5weSBiL2xpYi9weS9zcmMvc2VydmVyL1RQcm9jZXNzUG9vbFNlcnZlci5weQppbmRleCA3ZWQ4MTRhLi5mZTZkYzgxIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3NlcnZlci9UUHJvY2Vzc1Bvb2xTZXJ2ZXIucHkKKysrIGIvbGliL3B5L3NyYy9zZXJ2ZXIvVFByb2Nlc3NQb29sU2VydmVyLnB5CkBAIC0xOSwyMCArMTksMjIgQEAKIAogCiBpbXBvcnQgbG9nZ2luZwotZnJvbSBtdWx0aXByb2Nlc3NpbmcgaW1wb3J0ICBQcm9jZXNzLCBWYWx1ZSwgQ29uZGl0aW9uLCByZWR1Y3Rpb24KIAotZnJvbSBUU2VydmVyIGltcG9ydCBUU2VydmVyCitmcm9tIG11bHRpcHJvY2Vzc2luZyBpbXBvcnQgUHJvY2VzcywgVmFsdWUsIENvbmRpdGlvbgorCitmcm9tIC5UU2VydmVyIGltcG9ydCBUU2VydmVyCiBmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEV4Y2VwdGlvbgogCi1jbGFzcyBUUHJvY2Vzc1Bvb2xTZXJ2ZXIoVFNlcnZlcik6Citsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKIAotICAgICIiIgotICAgIFNlcnZlciB3aXRoIGEgZml4ZWQgc2l6ZSBwb29sIG9mIHdvcmtlciBzdWJwcm9jZXNzZXMgd2hpY2ggc2VydmljZSByZXF1ZXN0cy4KKworY2xhc3MgVFByb2Nlc3NQb29sU2VydmVyKFRTZXJ2ZXIpOgorICAgICIiIlNlcnZlciB3aXRoIGEgZml4ZWQgc2l6ZSBwb29sIG9mIHdvcmtlciBzdWJwcm9jZXNzZXMgdG8gc2VydmljZSByZXF1ZXN0cworCiAgICAgTm90ZSB0aGF0IGlmIHlvdSBuZWVkIHNoYXJlZCBzdGF0ZSBiZXR3ZWVuIHRoZSBoYW5kbGVycyAtIGl0J3MgdXAgdG8geW91IQogICAgIFdyaXR0ZW4gYnkgRHZpciBWb2xrLCBkb2F0LmNvbQogICAgICIiIgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsICogYXJncyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKICAgICAgICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKICAgICAgICAgc2VsZi5udW1Xb3JrZXJzID0gMTAKICAgICAgICAgc2VsZi53b3JrZXJzID0gW10KQEAgLTUwLDE5ICs1MiwyMCBAQAogICAgICAgICBzZWxmLm51bVdvcmtlcnMgPSBudW0KIAogICAgIGRlZiB3b3JrZXJQcm9jZXNzKHNlbGYpOgotICAgICAgICAiIiJMb29wIGFyb3VuZCBnZXR0aW5nIGNsaWVudHMgZnJvbSB0aGUgc2hhcmVkIHF1ZXVlIGFuZCBwcm9jZXNzIHRoZW0uIiIiCi0KKyAgICAgICAgIiIiTG9vcCBnZXR0aW5nIGNsaWVudHMgZnJvbSB0aGUgc2hhcmVkIHF1ZXVlIGFuZCBwcm9jZXNzIHRoZW0iIiIKICAgICAgICAgaWYgc2VsZi5wb3N0Rm9ya0NhbGxiYWNrOgogICAgICAgICAgICAgc2VsZi5wb3N0Rm9ya0NhbGxiYWNrKCkKIAotICAgICAgICB3aGlsZSBzZWxmLmlzUnVubmluZy52YWx1ZSA9PSBUcnVlOgorICAgICAgICB3aGlsZSBzZWxmLmlzUnVubmluZy52YWx1ZToKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBjbGllbnQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZUNsaWVudChjbGllbnQpCiAgICAgICAgICAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKICAgICAgICAgICAgICAgICByZXR1cm4gMAotICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgeDoKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbih4KQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKIAogICAgIGRlZiBzZXJ2ZUNsaWVudChzZWxmLCBjbGllbnQpOgogICAgICAgICAiIiJQcm9jZXNzIGlucHV0L291dHB1dCBmcm9tIGEgY2xpZW50IGZvciBhcyBsb25nIGFzIHBvc3NpYmxlIiIiCkBAIC03NCw0NiArNzcsNDIgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKLSAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnRFeGNlcHRpb24sIHR4OgorICAgICAgICBleGNlcHQgVFRyYW5zcG9ydEV4Y2VwdGlvbjoKICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgeDoKLSAgICAgICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKHgpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKIAogICAgICAgICBpdHJhbnMuY2xvc2UoKQogICAgICAgICBvdHJhbnMuY2xvc2UoKQogCi0KICAgICBkZWYgc2VydmUoc2VsZik6Ci0gICAgICAgICIiIlN0YXJ0IGEgZml4ZWQgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIGFuZCBwdXQgY2xpZW50IGludG8gYSBxdWV1ZSIiIgotCi0gICAgICAgICN0aGlzIGlzIGEgc2hhcmVkIHN0YXRlIHRoYXQgY2FuIHRlbGwgdGhlIHdvcmtlcnMgdG8gZXhpdCB3aGVuIHNldCBhcyBmYWxzZQorICAgICAgICAiIiJTdGFydCB3b3JrZXJzIGFuZCBwdXQgaW50byBxdWV1ZSIiIgorICAgICAgICAjIHRoaXMgaXMgYSBzaGFyZWQgc3RhdGUgdGhhdCBjYW4gdGVsbCB0aGUgd29ya2VycyB0byBleGl0IHdoZW4gRmFsc2UKICAgICAgICAgc2VsZi5pc1J1bm5pbmcudmFsdWUgPSBUcnVlCiAKLSAgICAgICAgI2ZpcnN0IGJpbmQgYW5kIGxpc3RlbiB0byB0aGUgcG9ydAorICAgICAgICAjIGZpcnN0IGJpbmQgYW5kIGxpc3RlbiB0byB0aGUgcG9ydAogICAgICAgICBzZWxmLnNlcnZlclRyYW5zcG9ydC5saXN0ZW4oKQogCi0gICAgICAgICNmb3JrIHRoZSBjaGlsZHJlbgorICAgICAgICAjIGZvcmsgdGhlIGNoaWxkcmVuCiAgICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYubnVtV29ya2Vycyk6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgdyA9IFByb2Nlc3ModGFyZ2V0PXNlbGYud29ya2VyUHJvY2VzcykKICAgICAgICAgICAgICAgICB3LmRhZW1vbiA9IFRydWUKICAgICAgICAgICAgICAgICB3LnN0YXJ0KCkKICAgICAgICAgICAgICAgICBzZWxmLndvcmtlcnMuYXBwZW5kKHcpCi0gICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCB4OgotICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKHgpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQogCi0gICAgICAgICN3YWl0IHVudGlsIHRoZSBjb25kaXRpb24gaXMgc2V0IGJ5IHN0b3AoKQotCisgICAgICAgICMgd2FpdCB1bnRpbCB0aGUgY29uZGl0aW9uIGlzIHNldCBieSBzdG9wKCkKICAgICAgICAgd2hpbGUgVHJ1ZToKLQogICAgICAgICAgICAgc2VsZi5zdG9wQ29uZGl0aW9uLmFjcXVpcmUoKQogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHNlbGYuc3RvcENvbmRpdGlvbi53YWl0KCkKICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgZXhjZXB0IChTeXN0ZW1FeGl0LCBLZXlib2FyZEludGVycnVwdCk6Ci0JCWJyZWFrCi0gICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCB4OgotICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKHgpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCiAKICAgICAgICAgc2VsZi5pc1J1bm5pbmcudmFsdWUgPSBGYWxzZQogCkBAIC0xMjIsNCArMTIxLDMgQEAKICAgICAgICAgc2VsZi5zdG9wQ29uZGl0aW9uLmFjcXVpcmUoKQogICAgICAgICBzZWxmLnN0b3BDb25kaXRpb24ubm90aWZ5KCkKICAgICAgICAgc2VsZi5zdG9wQ29uZGl0aW9uLnJlbGVhc2UoKQotCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3NlcnZlci9UU2VydmVyLnB5IGIvbGliL3B5L3NyYy9zZXJ2ZXIvVFNlcnZlci5weQppbmRleCA4NDU2ZTJkLi5kZjJhN2JiIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3NlcnZlci9UU2VydmVyLnB5CisrKyBiL2xpYi9weS9zcmMvc2VydmVyL1RTZXJ2ZXIucHkKQEAgLTE3LDI1OCArMTcsMzA3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgcXVldWUKIGltcG9ydCBsb2dnaW5nCi1pbXBvcnQgc3lzCiBpbXBvcnQgb3MKLWltcG9ydCB0cmFjZWJhY2sKIGltcG9ydCB0aHJlYWRpbmcKLWltcG9ydCBRdWV1ZQogCi1mcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRQcm9jZXNzb3IKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVEhlYWRlclByb3RvY29sIGltcG9ydCBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5Citmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIAotY2xhc3MgVFNlcnZlcjoKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQogCi0gICIiIkJhc2UgaW50ZXJmYWNlIGZvciBhIHNlcnZlciwgd2hpY2ggbXVzdCBoYXZlIGEgc2VydmUgbWV0aG9kLiIiIgogCi0gICIiIiAzIGNvbnN0cnVjdG9ycyBmb3IgYWxsIHNlcnZlcnM6Ci0gIDEpIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCkKLSAgMikgKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCi0gIDMpIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpIiIiCi0gIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6Ci0gICAgaWYgKGxlbihhcmdzKSA9PSAyKToKLSAgICAgIHNlbGYuX19pbml0QXJnc19fKGFyZ3NbMF0sIGFyZ3NbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0LlRUcmFuc3BvcnRGYWN0b3J5QmFzZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RmFjdG9yeUJhc2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKQotICAgIGVsaWYgKGxlbihhcmdzKSA9PSA0KToKLSAgICAgIHNlbGYuX19pbml0QXJnc19fKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbM10pCi0gICAgZWxpZiAobGVuKGFyZ3MpID09IDYpOgotICAgICAgc2VsZi5fX2luaXRBcmdzX18oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSkKK2NsYXNzIFRTZXJ2ZXIob2JqZWN0KToKKyAgICAiIiJCYXNlIGludGVyZmFjZSBmb3IgYSBzZXJ2ZXIsIHdoaWNoIG11c3QgaGF2ZSBhIHNlcnZlKCkgbWV0aG9kLgogCi0gIGRlZiBfX2luaXRBcmdzX18oc2VsZiwgcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOgotICAgIHNlbGYucHJvY2Vzc29yID0gcHJvY2Vzc29yCi0gICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQgPSBzZXJ2ZXJUcmFuc3BvcnQKLSAgICBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeSA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeQotICAgIHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkKLSAgICBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3RvcnkKLSAgICBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeQorICAgIFRocmVlIGNvbnN0cnVjdG9ycyBmb3IgYWxsIHNlcnZlcnM6CisgICAgMSkgKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0KQorICAgIDIpIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorICAgIDMpIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIChsZW4oYXJncykgPT0gMik6CisgICAgICAgICAgICBzZWxmLl9faW5pdEFyZ3NfXyhhcmdzWzBdLCBhcmdzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RmFjdG9yeUJhc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQuVFRyYW5zcG9ydEZhY3RvcnlCYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKKyAgICAgICAgZWxpZiAobGVuKGFyZ3MpID09IDQpOgorICAgICAgICAgICAgc2VsZi5fX2luaXRBcmdzX18oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1szXSkKKyAgICAgICAgZWxpZiAobGVuKGFyZ3MpID09IDYpOgorICAgICAgICAgICAgc2VsZi5fX2luaXRBcmdzX18oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSkKIAotICBkZWYgc2VydmUoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBfX2luaXRBcmdzX18oc2VsZiwgcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KToKKyAgICAgICAgc2VsZi5wcm9jZXNzb3IgPSBwcm9jZXNzb3IKKyAgICAgICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQgPSBzZXJ2ZXJUcmFuc3BvcnQKKyAgICAgICAgc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgICAgc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeQorICAgICAgICBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3RvcnkKKyAgICAgICAgc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkKKworICAgICAgICBpbnB1dF9pc19oZWFkZXIgPSBpc2luc3RhbmNlKHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnksIFRIZWFkZXJQcm90b2NvbEZhY3RvcnkpCisgICAgICAgIG91dHB1dF9pc19oZWFkZXIgPSBpc2luc3RhbmNlKHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KQorICAgICAgICBpZiBhbnkoKGlucHV0X2lzX2hlYWRlciwgb3V0cHV0X2lzX2hlYWRlcikpIGFuZCBpbnB1dF9pc19oZWFkZXIgIT0gb3V0cHV0X2lzX2hlYWRlcjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlRIZWFkZXJQcm90b2NvbCBzZXJ2ZXJzIHJlcXVpcmUgdGhhdCBib3RoIHRoZSBpbnB1dCBhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0IHByb3RvY29scyBhcmUgVEhlYWRlclByb3RvY29sLiIpCisKKyAgICBkZWYgc2VydmUoc2VsZik6CisgICAgICAgIHBhc3MKKwogCiBjbGFzcyBUU2ltcGxlU2VydmVyKFRTZXJ2ZXIpOgorICAgICIiIlNpbXBsZSBzaW5nbGUtdGhyZWFkZWQgc2VydmVyIHRoYXQganVzdCBwdW1wcyBhcm91bmQgb25lIHRyYW5zcG9ydC4iIiIKIAotICAiIiJTaW1wbGUgc2luZ2xlLXRocmVhZGVkIHNlcnZlciB0aGF0IGp1c3QgcHVtcHMgYXJvdW5kIG9uZSB0cmFuc3BvcnQuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKIAotICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgotICAgIFRTZXJ2ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MpCi0KLSAgZGVmIHNlcnZlKHNlbGYpOgotICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpCi0gICAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQotICAgICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCi0gICAgICB0cnk6CisgICAgZGVmIHNlcnZlKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZlclRyYW5zcG9ydC5saXN0ZW4oKQogICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQotICAgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiwgdHg6Ci0gICAgICAgIHBhc3MKLSAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIHg6Ci0gICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKHgpCisgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQorICAgICAgICAgICAgaWYgbm90IGNsaWVudDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQogCi0gICAgICBpdHJhbnMuY2xvc2UoKQotICAgICAgb3RyYW5zLmNsb3NlKCkKKyAgICAgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQorCisgICAgICAgICAgICAjIGZvciBUSGVhZGVyUHJvdG9jb2wsIHdlIG11c3QgdXNlIHRoZSBzYW1lIHByb3RvY29sIGluc3RhbmNlIGZvcgorICAgICAgICAgICAgIyBpbnB1dCBhbmQgb3V0cHV0IHNvIHRoYXQgdGhlIHJlc3BvbnNlIGlzIGluIHRoZSBzYW1lIGRpYWxlY3QgdGhhdAorICAgICAgICAgICAgIyB0aGUgc2VydmVyIGRldGVjdGVkIHRoZSByZXF1ZXN0IHdhcyBpbi4KKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSwgVEhlYWRlclByb3RvY29sRmFjdG9yeSk6CisgICAgICAgICAgICAgICAgb3RyYW5zID0gTm9uZQorICAgICAgICAgICAgICAgIG9wcm90ID0gaXByb3QKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICAgICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb246CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKKworICAgICAgICAgICAgaXRyYW5zLmNsb3NlKCkKKyAgICAgICAgICAgIGlmIG90cmFuczoKKyAgICAgICAgICAgICAgICBvdHJhbnMuY2xvc2UoKQorCiAKIGNsYXNzIFRUaHJlYWRlZFNlcnZlcihUU2VydmVyKToKKyAgICAiIiJUaHJlYWRlZCBzZXJ2ZXIgdGhhdCBzcGF3bnMgYSBuZXcgdGhyZWFkIHBlciBlYWNoIGNvbm5lY3Rpb24uIiIiCiAKLSAgIiIiVGhyZWFkZWQgc2VydmVyIHRoYXQgc3Bhd25zIGEgbmV3IHRocmVhZCBwZXIgZWFjaCBjb25uZWN0aW9uLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBUU2VydmVyLl9faW5pdF9fKHNlbGYsICphcmdzKQorICAgICAgICBzZWxmLmRhZW1vbiA9IGt3YXJncy5nZXQoImRhZW1vbiIsIEZhbHNlKQogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgotICAgIFRTZXJ2ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MpCi0gICAgc2VsZi5kYWVtb24gPSBrd2FyZ3MuZ2V0KCJkYWVtb24iLCBGYWxzZSkKKyAgICBkZWYgc2VydmUoc2VsZik6CisgICAgICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKKyAgICAgICAgICAgICAgICBpZiBub3QgY2xpZW50OgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLmhhbmRsZSwgYXJncz0oY2xpZW50LCkpCisgICAgICAgICAgICAgICAgdC5zZXREYWVtb24oc2VsZi5kYWVtb24pCisgICAgICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCiAKLSAgZGVmIHNlcnZlKHNlbGYpOgotICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIHRyeToKLSAgICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKLSAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0ID0gc2VsZi5oYW5kbGUsIGFyZ3M9KGNsaWVudCwpKQotICAgICAgICB0LnNldERhZW1vbihzZWxmLmRhZW1vbikKLSAgICAgICAgdC5zdGFydCgpCi0gICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgIHJhaXNlCi0gICAgICBleGNlcHQgRXhjZXB0aW9uLCB4OgotICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbih4KQorICAgIGRlZiBoYW5kbGUoc2VsZiwgY2xpZW50KToKKyAgICAgICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKIAotICBkZWYgaGFuZGxlKHNlbGYsIGNsaWVudCk6Ci0gICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKLSAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKLSAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQotICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQotICAgIHRyeToKLSAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQotICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIHR4OgotICAgICAgcGFzcwotICAgIGV4Y2VwdCBFeGNlcHRpb24sIHg6Ci0gICAgICBsb2dnaW5nLmV4Y2VwdGlvbih4KQorICAgICAgICAjIGZvciBUSGVhZGVyUHJvdG9jb2wsIHdlIG11c3QgdXNlIHRoZSBzYW1lIHByb3RvY29sIGluc3RhbmNlIGZvciBpbnB1dAorICAgICAgICAjIGFuZCBvdXRwdXQgc28gdGhhdCB0aGUgcmVzcG9uc2UgaXMgaW4gdGhlIHNhbWUgZGlhbGVjdCB0aGF0IHRoZQorICAgICAgICAjIHNlcnZlciBkZXRlY3RlZCB0aGUgcmVxdWVzdCB3YXMgaW4uCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSwgVEhlYWRlclByb3RvY29sRmFjdG9yeSk6CisgICAgICAgICAgICBvdHJhbnMgPSBOb25lCisgICAgICAgICAgICBvcHJvdCA9IGlwcm90CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQogCi0gICAgaXRyYW5zLmNsb3NlKCkKLSAgICBvdHJhbnMuY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQorICAgICAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCisKKyAgICAgICAgaXRyYW5zLmNsb3NlKCkKKyAgICAgICAgaWYgb3RyYW5zOgorICAgICAgICAgICAgb3RyYW5zLmNsb3NlKCkKKwogCiBjbGFzcyBUVGhyZWFkUG9vbFNlcnZlcihUU2VydmVyKToKKyAgICAiIiJTZXJ2ZXIgd2l0aCBhIGZpeGVkIHNpemUgcG9vbCBvZiB0aHJlYWRzIHdoaWNoIHNlcnZpY2UgcmVxdWVzdHMuIiIiCiAKLSAgIiIiU2VydmVyIHdpdGggYSBmaXhlZCBzaXplIHBvb2wgb2YgdGhyZWFkcyB3aGljaCBzZXJ2aWNlIHJlcXVlc3RzLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBUU2VydmVyLl9faW5pdF9fKHNlbGYsICphcmdzKQorICAgICAgICBzZWxmLmNsaWVudHMgPSBxdWV1ZS5RdWV1ZSgpCisgICAgICAgIHNlbGYudGhyZWFkcyA9IDEwCisgICAgICAgIHNlbGYuZGFlbW9uID0ga3dhcmdzLmdldCgiZGFlbW9uIiwgRmFsc2UpCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6Ci0gICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKLSAgICBzZWxmLmNsaWVudHMgPSBRdWV1ZS5RdWV1ZSgpCi0gICAgc2VsZi50aHJlYWRzID0gMTAKLSAgICBzZWxmLmRhZW1vbiA9IGt3YXJncy5nZXQoImRhZW1vbiIsIEZhbHNlKQorICAgIGRlZiBzZXROdW1UaHJlYWRzKHNlbGYsIG51bSk6CisgICAgICAgICIiIlNldCB0aGUgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIHRoYXQgc2hvdWxkIGJlIGNyZWF0ZWQiIiIKKyAgICAgICAgc2VsZi50aHJlYWRzID0gbnVtCiAKLSAgZGVmIHNldE51bVRocmVhZHMoc2VsZiwgbnVtKToKLSAgICAiIiJTZXQgdGhlIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyB0aGF0IHNob3VsZCBiZSBjcmVhdGVkIiIiCi0gICAgc2VsZi50aHJlYWRzID0gbnVtCisgICAgZGVmIHNlcnZlVGhyZWFkKHNlbGYpOgorICAgICAgICAiIiJMb29wIGFyb3VuZCBnZXR0aW5nIGNsaWVudHMgZnJvbSB0aGUgc2hhcmVkIHF1ZXVlIGFuZCBwcm9jZXNzIHRoZW0uIiIiCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5jbGllbnRzLmdldCgpCisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZUNsaWVudChjbGllbnQpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQogCi0gIGRlZiBzZXJ2ZVRocmVhZChzZWxmKToKLSAgICAiIiJMb29wIGFyb3VuZCBnZXR0aW5nIGNsaWVudHMgZnJvbSB0aGUgc2hhcmVkIHF1ZXVlIGFuZCBwcm9jZXNzIHRoZW0uIiIiCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIHRyeToKLSAgICAgICAgY2xpZW50ID0gc2VsZi5jbGllbnRzLmdldCgpCi0gICAgICAgIHNlbGYuc2VydmVDbGllbnQoY2xpZW50KQotICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgeDoKLSAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oeCkKKyAgICBkZWYgc2VydmVDbGllbnQoc2VsZiwgY2xpZW50KToKKyAgICAgICAgIiIiUHJvY2VzcyBpbnB1dC9vdXRwdXQgZnJvbSBhIGNsaWVudCBmb3IgYXMgbG9uZyBhcyBwb3NzaWJsZSIiIgorICAgICAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQorICAgICAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQogCi0gIGRlZiBzZXJ2ZUNsaWVudChzZWxmLCBjbGllbnQpOgotICAgICIiIlByb2Nlc3MgaW5wdXQvb3V0cHV0IGZyb20gYSBjbGllbnQgZm9yIGFzIGxvbmcgYXMgcG9zc2libGUiIiIKLSAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCi0gICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCi0gICAgdHJ5OgotICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCi0gICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiwgdHg6Ci0gICAgICBwYXNzCi0gICAgZXhjZXB0IEV4Y2VwdGlvbiwgeDoKLSAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKHgpCisgICAgICAgICMgZm9yIFRIZWFkZXJQcm90b2NvbCwgd2UgbXVzdCB1c2UgdGhlIHNhbWUgcHJvdG9jb2wgaW5zdGFuY2UgZm9yIGlucHV0CisgICAgICAgICMgYW5kIG91dHB1dCBzbyB0aGF0IHRoZSByZXNwb25zZSBpcyBpbiB0aGUgc2FtZSBkaWFsZWN0IHRoYXQgdGhlCisgICAgICAgICMgc2VydmVyIGRldGVjdGVkIHRoZSByZXF1ZXN0IHdhcyBpbi4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LCBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KToKKyAgICAgICAgICAgIG90cmFucyA9IE5vbmUKKyAgICAgICAgICAgIG9wcm90ID0gaXByb3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQorICAgICAgICAgICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCiAKLSAgICBpdHJhbnMuY2xvc2UoKQotICAgIG90cmFucy5jbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCisgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb246CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKIAotICBkZWYgc2VydmUoc2VsZik6Ci0gICAgIiIiU3RhcnQgYSBmaXhlZCBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgYW5kIHB1dCBjbGllbnQgaW50byBhIHF1ZXVlIiIiCi0gICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZi50aHJlYWRzKToKLSAgICAgIHRyeToKLSAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0ID0gc2VsZi5zZXJ2ZVRocmVhZCkKLSAgICAgICAgdC5zZXREYWVtb24oc2VsZi5kYWVtb24pCi0gICAgICAgIHQuc3RhcnQoKQotICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgeDoKLSAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oeCkKKyAgICAgICAgaXRyYW5zLmNsb3NlKCkKKyAgICAgICAgaWYgb3RyYW5zOgorICAgICAgICAgICAgb3RyYW5zLmNsb3NlKCkKIAotICAgICMgUHVtcCB0aGUgc29ja2V0IGZvciBjbGllbnRzCi0gICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQubGlzdGVuKCkKLSAgICB3aGlsZSBUcnVlOgotICAgICAgdHJ5OgotICAgICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQotICAgICAgICBzZWxmLmNsaWVudHMucHV0KGNsaWVudCkKLSAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIHg6Ci0gICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKHgpCisgICAgZGVmIHNlcnZlKHNlbGYpOgorICAgICAgICAiIiJTdGFydCBhIGZpeGVkIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyBhbmQgcHV0IGNsaWVudCBpbnRvIGEgcXVldWUiIiIKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZi50aHJlYWRzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5zZXJ2ZVRocmVhZCkKKyAgICAgICAgICAgICAgICB0LnNldERhZW1vbihzZWxmLmRhZW1vbikKKyAgICAgICAgICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCisKKyAgICAgICAgIyBQdW1wIHRoZSBzb2NrZXQgZm9yIGNsaWVudHMKKyAgICAgICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQubGlzdGVuKCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBjbGllbnQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgc2VsZi5jbGllbnRzLnB1dChjbGllbnQpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQogCiAKIGNsYXNzIFRGb3JraW5nU2VydmVyKFRTZXJ2ZXIpOgorICAgICIiIkEgVGhyaWZ0IHNlcnZlciB0aGF0IGZvcmtzIGEgbmV3IHByb2Nlc3MgZm9yIGVhY2ggcmVxdWVzdAogCi0gICIiIkEgVGhyaWZ0IHNlcnZlciB0aGF0IGZvcmtzIGEgbmV3IHByb2Nlc3MgZm9yIGVhY2ggcmVxdWVzdCIiIgotICAiIiIKLSAgVGhpcyBpcyBtb3JlIHNjYWxhYmxlIHRoYW4gdGhlIHRocmVhZGVkIHNlcnZlciBhcyBpdCBkb2VzIG5vdCBjYXVzZQotICBHSUwgY29udGVudGlvbi4KKyAgICBUaGlzIGlzIG1vcmUgc2NhbGFibGUgdGhhbiB0aGUgdGhyZWFkZWQgc2VydmVyIGFzIGl0IGRvZXMgbm90IGNhdXNlCisgICAgR0lMIGNvbnRlbnRpb24uCiAKLSAgTm90ZSB0aGF0IHRoaXMgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgZnJvbSB0aGUgdGhyZWFkaW5nIHNlcnZlci4KLSAgU3BlY2lmaWNhbGx5LCB1cGRhdGVzIHRvIHNoYXJlZCB2YXJpYWJsZXMgd2lsbCBubyBsb25nZXIgYmUgc2hhcmVkLgotICBJdCB3aWxsIGFsc28gbm90IHdvcmsgb24gd2luZG93cy4KKyAgICBOb3RlIHRoYXQgdGhpcyBoYXMgZGlmZmVyZW50IHNlbWFudGljcyBmcm9tIHRoZSB0aHJlYWRpbmcgc2VydmVyLgorICAgIFNwZWNpZmljYWxseSwgdXBkYXRlcyB0byBzaGFyZWQgdmFyaWFibGVzIHdpbGwgbm8gbG9uZ2VyIGJlIHNoYXJlZC4KKyAgICBJdCB3aWxsIGFsc28gbm90IHdvcmsgb24gd2luZG93cy4KIAotICBUaGlzIGNvZGUgaXMgaGVhdmlseSBpbnNwaXJlZCBieSBTb2NrZXRTZXJ2ZXIuRm9ya2luZ01peEluIGluIHRoZQotICBQeXRob24gc3RkbGliLgotICAiIiIKKyAgICBUaGlzIGNvZGUgaXMgaGVhdmlseSBpbnNwaXJlZCBieSBTb2NrZXRTZXJ2ZXIuRm9ya2luZ01peEluIGluIHRoZQorICAgIFB5dGhvbiBzdGRsaWIuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKKyAgICAgICAgc2VsZi5jaGlsZHJlbiA9IFtdCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKLSAgICBUU2VydmVyLl9faW5pdF9fKHNlbGYsICphcmdzKQotICAgIHNlbGYuY2hpbGRyZW4gPSBbXQotCi0gIGRlZiBzZXJ2ZShzZWxmKToKLSAgICBkZWYgdHJ5X2Nsb3NlKGZpbGUpOgotICAgICAgdHJ5OgotICAgICAgICBmaWxlLmNsb3NlKCkKLSAgICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgotICAgICAgICBsb2dnaW5nLndhcm5pbmcoZSwgZXhjX2luZm89VHJ1ZSkKLQotCi0gICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQubGlzdGVuKCkKLSAgICB3aGlsZSBUcnVlOgotICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKLSAgICAgIHRyeToKLSAgICAgICAgcGlkID0gb3MuZm9yaygpCi0KLSAgICAgICAgaWYgcGlkOiAjIHBhcmVudAotICAgICAgICAgICMgYWRkIGJlZm9yZSBjb2xsZWN0LCBvdGhlcndpc2UgeW91IHJhY2Ugdy8gd2FpdHBpZAotICAgICAgICAgIHNlbGYuY2hpbGRyZW4uYXBwZW5kKHBpZCkKLSAgICAgICAgICBzZWxmLmNvbGxlY3RfY2hpbGRyZW4oKQotCi0gICAgICAgICAgIyBQYXJlbnQgbXVzdCBjbG9zZSBzb2NrZXQgb3IgdGhlIGNvbm5lY3Rpb24gbWF5IG5vdCBnZXQKLSAgICAgICAgICAjIGNsb3NlZCBwcm9tcHRseQotICAgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgICAgICAgdHJ5X2Nsb3NlKGl0cmFucykKLSAgICAgICAgICB0cnlfY2xvc2Uob3RyYW5zKQotICAgICAgICBlbHNlOgotICAgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0KLSAgICAgICAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQotICAgICAgICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQotCi0gICAgICAgICAgZWNvZGUgPSAwCi0gICAgICAgICAgdHJ5OgorICAgIGRlZiBzZXJ2ZShzZWxmKToKKyAgICAgICAgZGVmIHRyeV9jbG9zZShmaWxlKToKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKLSAgICAgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIHR4OgotICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlOgotICAgICAgICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbihlKQotICAgICAgICAgICAgICBlY29kZSA9IDEKLSAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgdHJ5X2Nsb3NlKGl0cmFucykKLSAgICAgICAgICAgIHRyeV9jbG9zZShvdHJhbnMpCisgICAgICAgICAgICAgICAgZmlsZS5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKGUsIGV4Y19pbmZvPVRydWUpCiAKLSAgICAgICAgICBvcy5fZXhpdChlY29kZSkKKyAgICAgICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQubGlzdGVuKCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpCisgICAgICAgICAgICBpZiBub3QgY2xpZW50OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGlkID0gb3MuZm9yaygpCiAKLSAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIHR4OgotICAgICAgICBwYXNzCi0gICAgICBleGNlcHQgRXhjZXB0aW9uLCB4OgotICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbih4KQorICAgICAgICAgICAgICAgIGlmIHBpZDogICMgcGFyZW50CisgICAgICAgICAgICAgICAgICAgICMgYWRkIGJlZm9yZSBjb2xsZWN0LCBvdGhlcndpc2UgeW91IHJhY2Ugdy8gd2FpdHBpZAorICAgICAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuLmFwcGVuZChwaWQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29sbGVjdF9jaGlsZHJlbigpCiAKKyAgICAgICAgICAgICAgICAgICAgIyBQYXJlbnQgbXVzdCBjbG9zZSBzb2NrZXQgb3IgdGhlIGNvbm5lY3Rpb24gbWF5IG5vdCBnZXQKKyAgICAgICAgICAgICAgICAgICAgIyBjbG9zZWQgcHJvbXB0bHkKKyAgICAgICAgICAgICAgICAgICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgICAgICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICAgICAgICAgIHRyeV9jbG9zZShpdHJhbnMpCisgICAgICAgICAgICAgICAgICAgIHRyeV9jbG9zZShvdHJhbnMpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgICAgICAgICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKIAotICBkZWYgY29sbGVjdF9jaGlsZHJlbihzZWxmKToKLSAgICB3aGlsZSBzZWxmLmNoaWxkcmVuOgotICAgICAgdHJ5OgotICAgICAgICBwaWQsIHN0YXR1cyA9IG9zLndhaXRwaWQoMCwgb3MuV05PSEFORykKLSAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKLSAgICAgICAgcGlkID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAjIGZvciBUSGVhZGVyUHJvdG9jb2wsIHdlIG11c3QgdXNlIHRoZSBzYW1lIHByb3RvY29sCisgICAgICAgICAgICAgICAgICAgICMgaW5zdGFuY2UgZm9yIGlucHV0IGFuZCBvdXRwdXQgc28gdGhhdCB0aGUgcmVzcG9uc2UgaXMgaW4KKyAgICAgICAgICAgICAgICAgICAgIyB0aGUgc2FtZSBkaWFsZWN0IHRoYXQgdGhlIHNlcnZlciBkZXRlY3RlZCB0aGUgcmVxdWVzdCB3YXMKKyAgICAgICAgICAgICAgICAgICAgIyBpbi4KKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LCBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KToKKyAgICAgICAgICAgICAgICAgICAgICAgIG90cmFucyA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wcm90ID0gaXByb3QKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCiAKLSAgICAgIGlmIHBpZDoKLSAgICAgICAgc2VsZi5jaGlsZHJlbi5yZW1vdmUocGlkKQotICAgICAgZWxzZToKLSAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZWNvZGUgPSAwCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY29kZSA9IDEKKyAgICAgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeV9jbG9zZShpdHJhbnMpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBvdHJhbnM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5X2Nsb3NlKG90cmFucykKIAorICAgICAgICAgICAgICAgICAgICBvcy5fZXhpdChlY29kZSkKIAorICAgICAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorCisgICAgZGVmIGNvbGxlY3RfY2hpbGRyZW4oc2VsZik6CisgICAgICAgIHdoaWxlIHNlbGYuY2hpbGRyZW46CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGlkLCBzdGF0dXMgPSBvcy53YWl0cGlkKDAsIG9zLldOT0hBTkcpCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgcGlkID0gTm9uZQorCisgICAgICAgICAgICBpZiBwaWQ6CisgICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbi5yZW1vdmUocGlkKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBicmVhawpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5weSBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkNTY0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQucHkKQEAgLTAsMCArMSwzNTIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgc3RydWN0CitpbXBvcnQgemxpYgorCitmcm9tIHRocmlmdC5jb21wYXQgaW1wb3J0IEJ1ZmZlcklPLCBieXRlX2luZGV4Citmcm9tIHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbCwgcmVhZFZhcmludCwgd3JpdGVWYXJpbnQKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uCitmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgKAorICAgIENSZWFkYWJsZVRyYW5zcG9ydCwKKyAgICBUTWVtb3J5QnVmZmVyLAorICAgIFRUcmFuc3BvcnRCYXNlLAorICAgIFRUcmFuc3BvcnRFeGNlcHRpb24sCispCisKKworVTE2ID0gc3RydWN0LlN0cnVjdCgiIUgiKQorSTMyID0gc3RydWN0LlN0cnVjdCgiIWkiKQorSEVBREVSX01BR0lDID0gMHgwRkZGCitIQVJEX01BWF9GUkFNRV9TSVpFID0gMHgzRkZGRkZGRgorCisKK2NsYXNzIFRIZWFkZXJDbGllbnRUeXBlKG9iamVjdCk6CisgICAgSEVBREVSUyA9IDB4MDAKKworICAgIEZSQU1FRF9CSU5BUlkgPSAweDAxCisgICAgVU5GUkFNRURfQklOQVJZID0gMHgwMgorCisgICAgRlJBTUVEX0NPTVBBQ1QgPSAweDAzCisgICAgVU5GUkFNRURfQ09NUEFDVCA9IDB4MDQKKworCitjbGFzcyBUSGVhZGVyU3VicHJvdG9jb2xJRChvYmplY3QpOgorICAgIEJJTkFSWSA9IDB4MDAKKyAgICBDT01QQUNUID0gMHgwMgorCisKK2NsYXNzIFRJbmZvSGVhZGVyVHlwZShvYmplY3QpOgorICAgIEtFWV9WQUxVRSA9IDB4MDEKKworCitjbGFzcyBUSGVhZGVyVHJhbnNmb3JtSUQob2JqZWN0KToKKyAgICBaTElCID0gMHgwMQorCisKK1JFQURfVFJBTlNGT1JNU19CWV9JRCA9IHsKKyAgICBUSGVhZGVyVHJhbnNmb3JtSUQuWkxJQjogemxpYi5kZWNvbXByZXNzLAorfQorCisKK1dSSVRFX1RSQU5TRk9STVNfQllfSUQgPSB7CisgICAgVEhlYWRlclRyYW5zZm9ybUlELlpMSUI6IHpsaWIuY29tcHJlc3MsCit9CisKKworZGVmIF9yZWFkU3RyaW5nKHRyYW5zKToKKyAgICBzaXplID0gcmVhZFZhcmludCh0cmFucykKKyAgICBpZiBzaXplIDwgMDoKKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICJOZWdhdGl2ZSBsZW5ndGgiCisgICAgICAgICkKKyAgICByZXR1cm4gdHJhbnMucmVhZChzaXplKQorCisKK2RlZiBfd3JpdGVTdHJpbmcodHJhbnMsIHZhbHVlKToKKyAgICB3cml0ZVZhcmludCh0cmFucywgbGVuKHZhbHVlKSkKKyAgICB0cmFucy53cml0ZSh2YWx1ZSkKKworCitjbGFzcyBUSGVhZGVyVHJhbnNwb3J0KFRUcmFuc3BvcnRCYXNlLCBDUmVhZGFibGVUcmFuc3BvcnQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIGFsbG93ZWRfY2xpZW50X3R5cGVzKToKKyAgICAgICAgc2VsZi5fdHJhbnNwb3J0ID0gdHJhbnNwb3J0CisgICAgICAgIHNlbGYuX2NsaWVudF90eXBlID0gVEhlYWRlckNsaWVudFR5cGUuSEVBREVSUworICAgICAgICBzZWxmLl9hbGxvd2VkX2NsaWVudF90eXBlcyA9IGFsbG93ZWRfY2xpZW50X3R5cGVzCisKKyAgICAgICAgc2VsZi5fcmVhZF9idWZmZXIgPSBCdWZmZXJJTyhiIiIpCisgICAgICAgIHNlbGYuX3JlYWRfaGVhZGVycyA9IHt9CisKKyAgICAgICAgc2VsZi5fd3JpdGVfYnVmZmVyID0gQnVmZmVySU8oKQorICAgICAgICBzZWxmLl93cml0ZV9oZWFkZXJzID0ge30KKyAgICAgICAgc2VsZi5fd3JpdGVfdHJhbnNmb3JtcyA9IFtdCisKKyAgICAgICAgc2VsZi5mbGFncyA9IDAKKyAgICAgICAgc2VsZi5zZXF1ZW5jZV9pZCA9IDAKKyAgICAgICAgc2VsZi5fcHJvdG9jb2xfaWQgPSBUSGVhZGVyU3VicHJvdG9jb2xJRC5CSU5BUlkKKyAgICAgICAgc2VsZi5fbWF4X2ZyYW1lX3NpemUgPSBIQVJEX01BWF9GUkFNRV9TSVpFCisKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdHJhbnNwb3J0LmlzT3BlbigpCisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3RyYW5zcG9ydC5vcGVuKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3RyYW5zcG9ydC5jbG9zZSgpCisKKyAgICBkZWYgZ2V0X2hlYWRlcnMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9yZWFkX2hlYWRlcnMKKworICAgIGRlZiBzZXRfaGVhZGVyKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShrZXksIGJ5dGVzKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImhlYWRlciBuYW1lcyBtdXN0IGJlIGJ5dGVzIikKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIGJ5dGVzKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImhlYWRlciB2YWx1ZXMgbXVzdCBiZSBieXRlcyIpCisgICAgICAgIHNlbGYuX3dyaXRlX2hlYWRlcnNba2V5XSA9IHZhbHVlCisKKyAgICBkZWYgY2xlYXJfaGVhZGVycyhzZWxmKToKKyAgICAgICAgc2VsZi5fd3JpdGVfaGVhZGVycy5jbGVhcigpCisKKyAgICBkZWYgYWRkX3RyYW5zZm9ybShzZWxmLCB0cmFuc2Zvcm1faWQpOgorICAgICAgICBpZiB0cmFuc2Zvcm1faWQgbm90IGluIFdSSVRFX1RSQU5TRk9STVNfQllfSUQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmtub3duIHRyYW5zZm9ybSIpCisgICAgICAgIHNlbGYuX3dyaXRlX3RyYW5zZm9ybXMuYXBwZW5kKHRyYW5zZm9ybV9pZCkKKworICAgIGRlZiBzZXRfbWF4X2ZyYW1lX3NpemUoc2VsZiwgc2l6ZSk6CisgICAgICAgIGlmIG5vdCAwIDwgc2l6ZSA8IEhBUkRfTUFYX0ZSQU1FX1NJWkU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtYXhpbXVtIGZyYW1lIHNpemUgc2hvdWxkIGJlIDwgJWQgYW5kID4gMCIgJSBIQVJEX01BWF9GUkFNRV9TSVpFKQorICAgICAgICBzZWxmLl9tYXhfZnJhbWVfc2l6ZSA9IHNpemUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBwcm90b2NvbF9pZChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fY2xpZW50X3R5cGUgPT0gVEhlYWRlckNsaWVudFR5cGUuSEVBREVSUzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbF9pZAorICAgICAgICBlbGlmIHNlbGYuX2NsaWVudF90eXBlIGluIChUSGVhZGVyQ2xpZW50VHlwZS5GUkFNRURfQklOQVJZLCBUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9CSU5BUlkpOgorICAgICAgICAgICAgcmV0dXJuIFRIZWFkZXJTdWJwcm90b2NvbElELkJJTkFSWQorICAgICAgICBlbGlmIHNlbGYuX2NsaWVudF90eXBlIGluIChUSGVhZGVyQ2xpZW50VHlwZS5GUkFNRURfQ09NUEFDVCwgVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQ09NUEFDVCk6CisgICAgICAgICAgICByZXR1cm4gVEhlYWRlclN1YnByb3RvY29sSUQuQ09NUEFDVAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLklOVkFMSURfQ0xJRU5UX1RZUEUsCisgICAgICAgICAgICAgICAgIlByb3RvY29sIElEIG5vdCBrbm93IGZvciBjbGllbnQgdHlwZSAlZCIgJSBzZWxmLl9jbGllbnRfdHlwZSwKKyAgICAgICAgICAgICkKKworICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgIyBpZiB0aGVyZSBhcmUgYnl0ZXMgbGVmdCBpbiB0aGUgYnVmZmVyLCBwcm9kdWNlIHRob3NlIGZpcnN0LgorICAgICAgICBieXRlc19yZWFkID0gc2VsZi5fcmVhZF9idWZmZXIucmVhZChzeikKKyAgICAgICAgYnl0ZXNfbGVmdF90b19yZWFkID0gc3ogLSBsZW4oYnl0ZXNfcmVhZCkKKyAgICAgICAgaWYgYnl0ZXNfbGVmdF90b19yZWFkID09IDA6CisgICAgICAgICAgICByZXR1cm4gYnl0ZXNfcmVhZAorCisgICAgICAgICMgaWYgd2UndmUgZGV0ZXJtaW5lZCB0aGlzIGlzIGFuIHVuZnJhbWVkIGNsaWVudCwganVzdCBwYXNzIHRoZSByZWFkCisgICAgICAgICMgdGhyb3VnaCB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdW50aWwgd2UncmUgcmVzZXQgYWdhaW4gYXQgdGhlCisgICAgICAgICMgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IG1lc3NhZ2UuCisgICAgICAgIGlmIHNlbGYuX2NsaWVudF90eXBlIGluIChUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9CSU5BUlksIFRIZWFkZXJDbGllbnRUeXBlLlVORlJBTUVEX0NPTVBBQ1QpOgorICAgICAgICAgICAgcmV0dXJuIGJ5dGVzX3JlYWQgKyBzZWxmLl90cmFuc3BvcnQucmVhZChieXRlc19sZWZ0X3RvX3JlYWQpCisKKyAgICAgICAgIyB3ZSdyZSBlbXB0eSBhbmQgKG1heWJlKSBmcmFtZWQuIGZpbGwgdGhlIGJ1ZmZlcnMgd2l0aCB0aGUgbmV4dCBmcmFtZS4KKyAgICAgICAgc2VsZi5yZWFkRnJhbWUoYnl0ZXNfbGVmdF90b19yZWFkKQorICAgICAgICByZXR1cm4gYnl0ZXNfcmVhZCArIHNlbGYuX3JlYWRfYnVmZmVyLnJlYWQoYnl0ZXNfbGVmdF90b19yZWFkKQorCisgICAgZGVmIF9zZXRfY2xpZW50X3R5cGUoc2VsZiwgY2xpZW50X3R5cGUpOgorICAgICAgICBpZiBjbGllbnRfdHlwZSBub3QgaW4gc2VsZi5fYWxsb3dlZF9jbGllbnRfdHlwZXM6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uSU5WQUxJRF9DTElFTlRfVFlQRSwKKyAgICAgICAgICAgICAgICAiQ2xpZW50IHR5cGUgJWQgbm90IGFsbG93ZWQgYnkgc2VydmVyLiIgJSBjbGllbnRfdHlwZSwKKyAgICAgICAgICAgICkKKyAgICAgICAgc2VsZi5fY2xpZW50X3R5cGUgPSBjbGllbnRfdHlwZQorCisgICAgZGVmIHJlYWRGcmFtZShzZWxmLCByZXFfc3opOgorICAgICAgICAjIHRoZSBmaXJzdCB3b3JkIGNvdWxkIGVpdGhlciBiZSB0aGUgbGVuZ3RoIGZpZWxkIG9mIGEgZnJhbWVkIG1lc3NhZ2UKKyAgICAgICAgIyBvciB0aGUgZmlyc3QgYnl0ZXMgb2YgYW4gdW5mcmFtZWQgbWVzc2FnZS4KKyAgICAgICAgZmlyc3Rfd29yZCA9IHNlbGYuX3RyYW5zcG9ydC5yZWFkQWxsKEkzMi5zaXplKQorICAgICAgICBmcmFtZV9zaXplLCA9IEkzMi51bnBhY2soZmlyc3Rfd29yZCkKKyAgICAgICAgaXNfdW5mcmFtZWQgPSBGYWxzZQorICAgICAgICBpZiBmcmFtZV9zaXplICYgVEJpbmFyeVByb3RvY29sLlZFUlNJT05fTUFTSyA9PSBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl8xOgorICAgICAgICAgICAgc2VsZi5fc2V0X2NsaWVudF90eXBlKFRIZWFkZXJDbGllbnRUeXBlLlVORlJBTUVEX0JJTkFSWSkKKyAgICAgICAgICAgIGlzX3VuZnJhbWVkID0gVHJ1ZQorICAgICAgICBlbGlmIChieXRlX2luZGV4KGZpcnN0X3dvcmQsIDApID09IFRDb21wYWN0UHJvdG9jb2wuUFJPVE9DT0xfSUQgYW5kCisgICAgICAgICAgICAgIGJ5dGVfaW5kZXgoZmlyc3Rfd29yZCwgMSkgJiBUQ29tcGFjdFByb3RvY29sLlZFUlNJT05fTUFTSyA9PSBUQ29tcGFjdFByb3RvY29sLlZFUlNJT04pOgorICAgICAgICAgICAgc2VsZi5fc2V0X2NsaWVudF90eXBlKFRIZWFkZXJDbGllbnRUeXBlLlVORlJBTUVEX0NPTVBBQ1QpCisgICAgICAgICAgICBpc191bmZyYW1lZCA9IFRydWUKKworICAgICAgICBpZiBpc191bmZyYW1lZDoKKyAgICAgICAgICAgIGJ5dGVzX2xlZnRfdG9fcmVhZCA9IHJlcV9zeiAtIEkzMi5zaXplCisgICAgICAgICAgICBpZiBieXRlc19sZWZ0X3RvX3JlYWQgPiAwOgorICAgICAgICAgICAgICAgIHJlc3QgPSBzZWxmLl90cmFuc3BvcnQucmVhZChieXRlc19sZWZ0X3RvX3JlYWQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlc3QgPSBiIiIKKyAgICAgICAgICAgIHNlbGYuX3JlYWRfYnVmZmVyID0gQnVmZmVySU8oZmlyc3Rfd29yZCArIHJlc3QpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIG9rLCB3ZSdyZSBzdGlsbCBoZXJlIHNvIHdlJ3JlIGZyYW1lZC4KKyAgICAgICAgaWYgZnJhbWVfc2l6ZSA+IHNlbGYuX21heF9mcmFtZV9zaXplOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlNJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgIkZyYW1lIHdhcyB0b28gbGFyZ2UuIiwKKyAgICAgICAgICAgICkKKyAgICAgICAgcmVhZF9idWZmZXIgPSBCdWZmZXJJTyhzZWxmLl90cmFuc3BvcnQucmVhZEFsbChmcmFtZV9zaXplKSkKKworICAgICAgICAjIHRoZSBuZXh0IHdvcmQgaXMgZWl0aGVyIGdvaW5nIHRvIGJlIHRoZSB2ZXJzaW9uIGZpZWxkIG9mIGEKKyAgICAgICAgIyBiaW5hcnkvY29tcGFjdCBwcm90b2NvbCBtZXNzYWdlIG9yIHRoZSBtYWdpYyB2YWx1ZSArIGZsYWdzIG9mIGEKKyAgICAgICAgIyBoZWFkZXIgcHJvdG9jb2wgbWVzc2FnZS4KKyAgICAgICAgc2Vjb25kX3dvcmQgPSByZWFkX2J1ZmZlci5yZWFkKEkzMi5zaXplKQorICAgICAgICB2ZXJzaW9uLCA9IEkzMi51bnBhY2soc2Vjb25kX3dvcmQpCisgICAgICAgIHJlYWRfYnVmZmVyLnNlZWsoMCkKKyAgICAgICAgaWYgdmVyc2lvbiA+PiAxNiA9PSBIRUFERVJfTUFHSUM6CisgICAgICAgICAgICBzZWxmLl9zZXRfY2xpZW50X3R5cGUoVEhlYWRlckNsaWVudFR5cGUuSEVBREVSUykKKyAgICAgICAgICAgIHNlbGYuX3JlYWRfYnVmZmVyID0gc2VsZi5fcGFyc2VfaGVhZGVyX2Zvcm1hdChyZWFkX2J1ZmZlcikKKyAgICAgICAgZWxpZiB2ZXJzaW9uICYgVEJpbmFyeVByb3RvY29sLlZFUlNJT05fTUFTSyA9PSBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl8xOgorICAgICAgICAgICAgc2VsZi5fc2V0X2NsaWVudF90eXBlKFRIZWFkZXJDbGllbnRUeXBlLkZSQU1FRF9CSU5BUlkpCisgICAgICAgICAgICBzZWxmLl9yZWFkX2J1ZmZlciA9IHJlYWRfYnVmZmVyCisgICAgICAgIGVsaWYgKGJ5dGVfaW5kZXgoc2Vjb25kX3dvcmQsIDApID09IFRDb21wYWN0UHJvdG9jb2wuUFJPVE9DT0xfSUQgYW5kCisgICAgICAgICAgICAgIGJ5dGVfaW5kZXgoc2Vjb25kX3dvcmQsIDEpICYgVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OX01BU0sgPT0gVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OKToKKyAgICAgICAgICAgIHNlbGYuX3NldF9jbGllbnRfdHlwZShUSGVhZGVyQ2xpZW50VHlwZS5GUkFNRURfQ09NUEFDVCkKKyAgICAgICAgICAgIHNlbGYuX3JlYWRfYnVmZmVyID0gcmVhZF9idWZmZXIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5JTlZBTElEX0NMSUVOVF9UWVBFLAorICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGV0ZWN0IGNsaWVudCB0cmFuc3BvcnQgdHlwZS4iLAorICAgICAgICAgICAgKQorCisgICAgZGVmIF9wYXJzZV9oZWFkZXJfZm9ybWF0KHNlbGYsIGJ1ZmZlcik6CisgICAgICAgICMgbWFrZSBCdWZmZXJJTyBsb29rIGxpa2UgVFRyYW5zcG9ydCBmb3IgdmFyaW50IGhlbHBlcnMKKyAgICAgICAgYnVmZmVyX3RyYW5zcG9ydCA9IFRNZW1vcnlCdWZmZXIoKQorICAgICAgICBidWZmZXJfdHJhbnNwb3J0Ll9idWZmZXIgPSBidWZmZXIKKworICAgICAgICBidWZmZXIucmVhZCgyKSAgIyBkaXNjYXJkIHRoZSBtYWdpYyBieXRlcworICAgICAgICBzZWxmLmZsYWdzLCA9IFUxNi51bnBhY2soYnVmZmVyLnJlYWQoVTE2LnNpemUpKQorICAgICAgICBzZWxmLnNlcXVlbmNlX2lkLCA9IEkzMi51bnBhY2soYnVmZmVyLnJlYWQoSTMyLnNpemUpKQorCisgICAgICAgIGhlYWRlcl9sZW5ndGggPSBVMTYudW5wYWNrKGJ1ZmZlci5yZWFkKFUxNi5zaXplKSlbMF0gKiA0CisgICAgICAgIGVuZF9vZl9oZWFkZXJzID0gYnVmZmVyLnRlbGwoKSArIGhlYWRlcl9sZW5ndGgKKyAgICAgICAgaWYgZW5kX29mX2hlYWRlcnMgPiBsZW4oYnVmZmVyLmdldHZhbHVlKCkpOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlNJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgIkhlYWRlciBzaXplIGlzIGxhcmdlciB0aGFuIHdob2xlIGZyYW1lLiIsCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5fcHJvdG9jb2xfaWQgPSByZWFkVmFyaW50KGJ1ZmZlcl90cmFuc3BvcnQpCisKKyAgICAgICAgdHJhbnNmb3JtcyA9IFtdCisgICAgICAgIHRyYW5zZm9ybV9jb3VudCA9IHJlYWRWYXJpbnQoYnVmZmVyX3RyYW5zcG9ydCkKKyAgICAgICAgZm9yIF8gaW4gcmFuZ2UodHJhbnNmb3JtX2NvdW50KToKKyAgICAgICAgICAgIHRyYW5zZm9ybV9pZCA9IHJlYWRWYXJpbnQoYnVmZmVyX3RyYW5zcG9ydCkKKyAgICAgICAgICAgIGlmIHRyYW5zZm9ybV9pZCBub3QgaW4gUkVBRF9UUkFOU0ZPUk1TX0JZX0lEOgorICAgICAgICAgICAgICAgIHJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVkFMSURfVFJBTlNGT1JNLAorICAgICAgICAgICAgICAgICAgICAiVW5rbm93biB0cmFuc2Zvcm06ICVkIiAlIHRyYW5zZm9ybV9pZCwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB0cmFuc2Zvcm1zLmFwcGVuZCh0cmFuc2Zvcm1faWQpCisgICAgICAgIHRyYW5zZm9ybXMucmV2ZXJzZSgpCisKKyAgICAgICAgaGVhZGVycyA9IHt9CisgICAgICAgIHdoaWxlIGJ1ZmZlci50ZWxsKCkgPCBlbmRfb2ZfaGVhZGVyczoKKyAgICAgICAgICAgIGhlYWRlcl90eXBlID0gcmVhZFZhcmludChidWZmZXJfdHJhbnNwb3J0KQorICAgICAgICAgICAgaWYgaGVhZGVyX3R5cGUgPT0gVEluZm9IZWFkZXJUeXBlLktFWV9WQUxVRToKKyAgICAgICAgICAgICAgICBjb3VudCA9IHJlYWRWYXJpbnQoYnVmZmVyX3RyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICBmb3IgXyBpbiByYW5nZShjb3VudCk6CisgICAgICAgICAgICAgICAgICAgIGtleSA9IF9yZWFkU3RyaW5nKGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gX3JlYWRTdHJpbmcoYnVmZmVyX3RyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1trZXldID0gdmFsdWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsgICMgaWdub3JlIHVua25vd24gaGVhZGVycworICAgICAgICBzZWxmLl9yZWFkX2hlYWRlcnMgPSBoZWFkZXJzCisKKyAgICAgICAgIyBza2lwIHBhZGRpbmcgLyBhbnl0aGluZyB3ZSBkaWRuJ3QgdW5kZXJzdGFuZAorICAgICAgICBidWZmZXIuc2VlayhlbmRfb2ZfaGVhZGVycykKKworICAgICAgICBwYXlsb2FkID0gYnVmZmVyLnJlYWQoKQorICAgICAgICBmb3IgdHJhbnNmb3JtX2lkIGluIHRyYW5zZm9ybXM6CisgICAgICAgICAgICB0cmFuc2Zvcm1fZm4gPSBSRUFEX1RSQU5TRk9STVNfQllfSURbdHJhbnNmb3JtX2lkXQorICAgICAgICAgICAgcGF5bG9hZCA9IHRyYW5zZm9ybV9mbihwYXlsb2FkKQorICAgICAgICByZXR1cm4gQnVmZmVySU8ocGF5bG9hZCkKKworICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICBzZWxmLl93cml0ZV9idWZmZXIud3JpdGUoYnVmKQorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBwYXlsb2FkID0gc2VsZi5fd3JpdGVfYnVmZmVyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5fd3JpdGVfYnVmZmVyID0gQnVmZmVySU8oKQorCisgICAgICAgIGJ1ZmZlciA9IEJ1ZmZlcklPKCkKKyAgICAgICAgaWYgc2VsZi5fY2xpZW50X3R5cGUgPT0gVEhlYWRlckNsaWVudFR5cGUuSEVBREVSUzoKKyAgICAgICAgICAgIGZvciB0cmFuc2Zvcm1faWQgaW4gc2VsZi5fd3JpdGVfdHJhbnNmb3JtczoKKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm1fZm4gPSBXUklURV9UUkFOU0ZPUk1TX0JZX0lEW3RyYW5zZm9ybV9pZF0KKyAgICAgICAgICAgICAgICBwYXlsb2FkID0gdHJhbnNmb3JtX2ZuKHBheWxvYWQpCisKKyAgICAgICAgICAgIGhlYWRlcnMgPSBCdWZmZXJJTygpCisgICAgICAgICAgICB3cml0ZVZhcmludChoZWFkZXJzLCBzZWxmLl9wcm90b2NvbF9pZCkKKyAgICAgICAgICAgIHdyaXRlVmFyaW50KGhlYWRlcnMsIGxlbihzZWxmLl93cml0ZV90cmFuc2Zvcm1zKSkKKyAgICAgICAgICAgIGZvciB0cmFuc2Zvcm1faWQgaW4gc2VsZi5fd3JpdGVfdHJhbnNmb3JtczoKKyAgICAgICAgICAgICAgICB3cml0ZVZhcmludChoZWFkZXJzLCB0cmFuc2Zvcm1faWQpCisgICAgICAgICAgICBpZiBzZWxmLl93cml0ZV9oZWFkZXJzOgorICAgICAgICAgICAgICAgIHdyaXRlVmFyaW50KGhlYWRlcnMsIFRJbmZvSGVhZGVyVHlwZS5LRVlfVkFMVUUpCisgICAgICAgICAgICAgICAgd3JpdGVWYXJpbnQoaGVhZGVycywgbGVuKHNlbGYuX3dyaXRlX2hlYWRlcnMpKQorICAgICAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYuX3dyaXRlX2hlYWRlcnMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgX3dyaXRlU3RyaW5nKGhlYWRlcnMsIGtleSkKKyAgICAgICAgICAgICAgICAgICAgX3dyaXRlU3RyaW5nKGhlYWRlcnMsIHZhbHVlKQorICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlX2hlYWRlcnMgPSB7fQorICAgICAgICAgICAgcGFkZGluZ19uZWVkZWQgPSAoNCAtIChsZW4oaGVhZGVycy5nZXR2YWx1ZSgpKSAlIDQpKSAlIDQKKyAgICAgICAgICAgIGhlYWRlcnMud3JpdGUoYiJceDAwIiAqIHBhZGRpbmdfbmVlZGVkKQorICAgICAgICAgICAgaGVhZGVyX2J5dGVzID0gaGVhZGVycy5nZXR2YWx1ZSgpCisKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShJMzIucGFjaygxMCArIGxlbihoZWFkZXJfYnl0ZXMpICsgbGVuKHBheWxvYWQpKSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShVMTYucGFjayhIRUFERVJfTUFHSUMpKQorICAgICAgICAgICAgYnVmZmVyLndyaXRlKFUxNi5wYWNrKHNlbGYuZmxhZ3MpKQorICAgICAgICAgICAgYnVmZmVyLndyaXRlKEkzMi5wYWNrKHNlbGYuc2VxdWVuY2VfaWQpKQorICAgICAgICAgICAgYnVmZmVyLndyaXRlKFUxNi5wYWNrKGxlbihoZWFkZXJfYnl0ZXMpIC8vIDQpKQorICAgICAgICAgICAgYnVmZmVyLndyaXRlKGhlYWRlcl9ieXRlcykKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShwYXlsb2FkKQorICAgICAgICBlbGlmIHNlbGYuX2NsaWVudF90eXBlIGluIChUSGVhZGVyQ2xpZW50VHlwZS5GUkFNRURfQklOQVJZLCBUSGVhZGVyQ2xpZW50VHlwZS5GUkFNRURfQ09NUEFDVCk6CisgICAgICAgICAgICBidWZmZXIud3JpdGUoSTMyLnBhY2sobGVuKHBheWxvYWQpKSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShwYXlsb2FkKQorICAgICAgICBlbGlmIHNlbGYuX2NsaWVudF90eXBlIGluIChUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9CSU5BUlksIFRIZWFkZXJDbGllbnRUeXBlLlVORlJBTUVEX0NPTVBBQ1QpOgorICAgICAgICAgICAgYnVmZmVyLndyaXRlKHBheWxvYWQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uSU5WQUxJRF9DTElFTlRfVFlQRSwKKyAgICAgICAgICAgICAgICAiVW5rbm93biBjbGllbnQgdHlwZS4iLAorICAgICAgICAgICAgKQorCisgICAgICAgICMgdGhlIGZyYW1lIGxlbmd0aCBmaWVsZCBkb2Vzbid0IGNvdW50IHRvd2FyZHMgdGhlIGZyYW1lIHBheWxvYWQgc2l6ZQorICAgICAgICBmcmFtZV9ieXRlcyA9IGJ1ZmZlci5nZXR2YWx1ZSgpCisgICAgICAgIGZyYW1lX3BheWxvYWRfc2l6ZSA9IGxlbihmcmFtZV9ieXRlcykgLSA0CisgICAgICAgIGlmIGZyYW1lX3BheWxvYWRfc2l6ZSA+IHNlbGYuX21heF9mcmFtZV9zaXplOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlNJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgIkF0dGVtcHRpbmcgdG8gc2VuZCBmcmFtZSB0aGF0IGlzIHRvbyBsYXJnZS4iLAorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuX3RyYW5zcG9ydC53cml0ZShmcmFtZV9ieXRlcykKKyAgICAgICAgc2VsZi5fdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcmVhZF9idWZmZXIKKworICAgIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHBhcnRpYWxyZWFkLCByZXFsZW4pOgorICAgICAgICByZXN1bHQgPSBieXRlYXJyYXkocGFydGlhbHJlYWQpCisgICAgICAgIHdoaWxlIGxlbihyZXN1bHQpIDwgcmVxbGVuOgorICAgICAgICAgICAgcmVzdWx0ICs9IHNlbGYucmVhZChyZXFsZW4gLSBsZW4ocmVzdWx0KSkKKyAgICAgICAgc2VsZi5fcmVhZF9idWZmZXIgPSBCdWZmZXJJTyhyZXN1bHQpCisgICAgICAgIHJldHVybiBzZWxmLl9yZWFkX2J1ZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9USHR0cENsaWVudC5weQppbmRleCA1MDI2OTc4Li4zN2IwYTRkIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9USHR0cENsaWVudC5weQorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9USHR0cENsaWVudC5weQpAQCAtMTcsMTEwICsxNywxNzEgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWZyb20gVFRyYW5zcG9ydCBpbXBvcnQgKgotZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCi0KLWltcG9ydCB1cmxwYXJzZQotaW1wb3J0IGh0dHBsaWIKK2Zyb20gaW8gaW1wb3J0IEJ5dGVzSU8KK2ltcG9ydCBvcworaW1wb3J0IHNzbAoraW1wb3J0IHN5cwogaW1wb3J0IHdhcm5pbmdzCi1pbXBvcnQgc29ja2V0CitpbXBvcnQgYmFzZTY0CisKK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCB1cmxsaWIKK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCBodHRwX2NsaWVudAorCitmcm9tIC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0QmFzZQoraW1wb3J0IHNpeAorCiAKIGNsYXNzIFRIdHRwQ2xpZW50KFRUcmFuc3BvcnRCYXNlKToKKyAgICAiIiJIdHRwIGltcGxlbWVudGF0aW9uIG9mIFRUcmFuc3BvcnQgYmFzZS4iIiIKIAotICAiIiJIdHRwIGltcGxlbWVudGF0aW9uIG9mIFRUcmFuc3BvcnQgYmFzZS4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdXJpX29yX2hvc3QsIHBvcnQ9Tm9uZSwgcGF0aD1Ob25lLCBjYWZpbGU9Tm9uZSwgY2VydF9maWxlPU5vbmUsIGtleV9maWxlPU5vbmUsIHNzbF9jb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJUSHR0cENsaWVudCBzdXBwb3J0cyB0d28gZGlmZmVyZW50IHR5cGVzIG9mIGNvbnN0cnVjdGlvbjoKIAotICBkZWYgX19pbml0X18oc2VsZiwgdXJpX29yX2hvc3QsIHBvcnQ9Tm9uZSwgcGF0aD1Ob25lKToKLSAgICAiIiJUSHR0cENsaWVudCBzdXBwb3J0cyB0d28gZGlmZmVyZW50IHR5cGVzIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuCisgICAgICAgIFRIdHRwQ2xpZW50KGhvc3QsIHBvcnQsIHBhdGgpIC0gZGVwcmVjYXRlZAorICAgICAgICBUSHR0cENsaWVudCh1cmksIFtwb3J0PTxuPiwgcGF0aD08cz4sIGNhZmlsZT08ZmlsZW5hbWU+LCBjZXJ0X2ZpbGU9PGZpbGVuYW1lPiwga2V5X2ZpbGU9PGZpbGVuYW1lPiwgc3NsX2NvbnRleHQ9PGNvbnRleHQ+XSkKIAotICAgIFRIdHRwQ2xpZW50KGhvc3QsIHBvcnQsIHBhdGgpIC0gZGVwcmVjYXRlZAotICAgIFRIdHRwQ2xpZW50KHVyaSkKKyAgICAgICAgT25seSB0aGUgc2Vjb25kIHN1cHBvcnRzIGh0dHBzLiAgVG8gcHJvcGVybHkgYXV0aGVudGljYXRlIGFnYWluc3QgdGhlIHNlcnZlciwKKyAgICAgICAgcHJvdmlkZSB0aGUgY2xpZW50J3MgaWRlbnRpdHkgYnkgc3BlY2lmeWluZyBjZXJ0X2ZpbGUgYW5kIGtleV9maWxlLiAgVG8gcHJvcGVybHkKKyAgICAgICAgYXV0aGVudGljYXRlIHRoZSBzZXJ2ZXIsIHNwZWNpZnkgZWl0aGVyIGNhZmlsZSBvciBzc2xfY29udGV4dCB3aXRoIGEgQ0EgZGVmaW5lZC4KKyAgICAgICAgTk9URTogaWYgYm90aCBjYWZpbGUgYW5kIHNzbF9jb250ZXh0IGFyZSBkZWZpbmVkLCBzc2xfY29udGV4dCB3aWxsIG92ZXJyaWRlIGNhZmlsZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHBvcnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICJQbGVhc2UgdXNlIHRoZSBUSHR0cENsaWVudCgnaHR0cHtzfTovL2hvc3Q6cG9ydC9wYXRoJykgY29uc3RydWN0b3IiLAorICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICBzdGFja2xldmVsPTIpCisgICAgICAgICAgICBzZWxmLmhvc3QgPSB1cmlfb3JfaG9zdAorICAgICAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICAgICAgYXNzZXJ0IHBhdGgKKyAgICAgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKyAgICAgICAgICAgIHNlbGYuc2NoZW1lID0gJ2h0dHAnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXJzZWQgPSB1cmxsaWIucGFyc2UudXJscGFyc2UodXJpX29yX2hvc3QpCisgICAgICAgICAgICBzZWxmLnNjaGVtZSA9IHBhcnNlZC5zY2hlbWUKKyAgICAgICAgICAgIGFzc2VydCBzZWxmLnNjaGVtZSBpbiAoJ2h0dHAnLCAnaHR0cHMnKQorICAgICAgICAgICAgaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHAnOgorICAgICAgICAgICAgICAgIHNlbGYucG9ydCA9IHBhcnNlZC5wb3J0IG9yIGh0dHBfY2xpZW50LkhUVFBfUE9SVAorICAgICAgICAgICAgZWxpZiBzZWxmLnNjaGVtZSA9PSAnaHR0cHMnOgorICAgICAgICAgICAgICAgIHNlbGYucG9ydCA9IHBhcnNlZC5wb3J0IG9yIGh0dHBfY2xpZW50LkhUVFBTX1BPUlQKKyAgICAgICAgICAgICAgICBzZWxmLmNlcnRmaWxlID0gY2VydF9maWxlCisgICAgICAgICAgICAgICAgc2VsZi5rZXlmaWxlID0ga2V5X2ZpbGUKKyAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQgPSBzc2wuY3JlYXRlX2RlZmF1bHRfY29udGV4dChjYWZpbGU9Y2FmaWxlKSBpZiAoY2FmaWxlIGFuZCBub3Qgc3NsX2NvbnRleHQpIGVsc2Ugc3NsX2NvbnRleHQKKyAgICAgICAgICAgIHNlbGYuaG9zdCA9IHBhcnNlZC5ob3N0bmFtZQorICAgICAgICAgICAgc2VsZi5wYXRoID0gcGFyc2VkLnBhdGgKKyAgICAgICAgICAgIGlmIHBhcnNlZC5xdWVyeToKKyAgICAgICAgICAgICAgICBzZWxmLnBhdGggKz0gJz8lcycgJSBwYXJzZWQucXVlcnkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJveHkgPSB1cmxsaWIucmVxdWVzdC5nZXRwcm94aWVzKClbc2VsZi5zY2hlbWVdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHByb3h5ID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgdXJsbGliLnJlcXVlc3QucHJveHlfYnlwYXNzKHNlbGYuaG9zdCk6CisgICAgICAgICAgICAgICAgcHJveHkgPSBOb25lCisgICAgICAgIGlmIHByb3h5OgorICAgICAgICAgICAgcGFyc2VkID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKHByb3h5KQorICAgICAgICAgICAgc2VsZi5yZWFsaG9zdCA9IHNlbGYuaG9zdAorICAgICAgICAgICAgc2VsZi5yZWFscG9ydCA9IHNlbGYucG9ydAorICAgICAgICAgICAgc2VsZi5ob3N0ID0gcGFyc2VkLmhvc3RuYW1lCisgICAgICAgICAgICBzZWxmLnBvcnQgPSBwYXJzZWQucG9ydAorICAgICAgICAgICAgc2VsZi5wcm94eV9hdXRoID0gc2VsZi5iYXNpY19wcm94eV9hdXRoX2hlYWRlcihwYXJzZWQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnJlYWxob3N0ID0gc2VsZi5yZWFscG9ydCA9IHNlbGYucHJveHlfYXV0aCA9IE5vbmUKKyAgICAgICAgc2VsZi5fX3didWYgPSBCeXRlc0lPKCkKKyAgICAgICAgc2VsZi5fX2h0dHAgPSBOb25lCisgICAgICAgIHNlbGYuX19odHRwX3Jlc3BvbnNlID0gTm9uZQorICAgICAgICBzZWxmLl9fdGltZW91dCA9IE5vbmUKKyAgICAgICAgc2VsZi5fX2N1c3RvbV9oZWFkZXJzID0gTm9uZQogCi0gICAgT25seSB0aGUgc2Vjb25kIHN1cHBvcnRzIGh0dHBzLiIiIgorICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgYmFzaWNfcHJveHlfYXV0aF9oZWFkZXIocHJveHkpOgorICAgICAgICBpZiBwcm94eSBpcyBOb25lIG9yIG5vdCBwcm94eS51c2VybmFtZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGFwID0gIiVzOiVzIiAlICh1cmxsaWIucGFyc2UudW5xdW90ZShwcm94eS51c2VybmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICB1cmxsaWIucGFyc2UudW5xdW90ZShwcm94eS5wYXNzd29yZCkpCisgICAgICAgIGNyID0gYmFzZTY0LmI2NGVuY29kZShhcCkuc3RyaXAoKQorICAgICAgICByZXR1cm4gIkJhc2ljICIgKyBjcgogCi0gICAgaWYgcG9ydCBpcyBub3QgTm9uZToKLSAgICAgIHdhcm5pbmdzLndhcm4oIlBsZWFzZSB1c2UgdGhlIFRIdHRwQ2xpZW50KCdodHRwOi8vaG9zdDpwb3J0L3BhdGgnKSBzeW50YXgiLCBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKLSAgICAgIHNlbGYuaG9zdCA9IHVyaV9vcl9ob3N0Ci0gICAgICBzZWxmLnBvcnQgPSBwb3J0Ci0gICAgICBhc3NlcnQgcGF0aAotICAgICAgc2VsZi5wYXRoID0gcGF0aAotICAgICAgc2VsZi5zY2hlbWUgPSAnaHR0cCcKLSAgICBlbHNlOgotICAgICAgcGFyc2VkID0gdXJscGFyc2UudXJscGFyc2UodXJpX29yX2hvc3QpCi0gICAgICBzZWxmLnNjaGVtZSA9IHBhcnNlZC5zY2hlbWUKLSAgICAgIGFzc2VydCBzZWxmLnNjaGVtZSBpbiAoJ2h0dHAnLCAnaHR0cHMnKQotICAgICAgaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHAnOgotICAgICAgICBzZWxmLnBvcnQgPSBwYXJzZWQucG9ydCBvciBodHRwbGliLkhUVFBfUE9SVAotICAgICAgZWxpZiBzZWxmLnNjaGVtZSA9PSAnaHR0cHMnOgotICAgICAgICBzZWxmLnBvcnQgPSBwYXJzZWQucG9ydCBvciBodHRwbGliLkhUVFBTX1BPUlQKLSAgICAgIHNlbGYuaG9zdCA9IHBhcnNlZC5ob3N0bmFtZQotICAgICAgc2VsZi5wYXRoID0gcGFyc2VkLnBhdGgKLSAgICAgIGlmIHBhcnNlZC5xdWVyeToKLSAgICAgICAgc2VsZi5wYXRoICs9ICc/JXMnICUgcGFyc2VkLnF1ZXJ5Ci0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCi0gICAgc2VsZi5fX2h0dHAgPSBOb25lCi0gICAgc2VsZi5fX3RpbWVvdXQgPSBOb25lCisgICAgZGVmIHVzaW5nX3Byb3h5KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yZWFsaG9zdCBpcyBub3QgTm9uZQogCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgIGlmIHNlbGYuc2NoZW1lID09ICdodHRwJzoKLSAgICAgIHNlbGYuX19odHRwID0gaHR0cGxpYi5IVFRQKHNlbGYuaG9zdCwgc2VsZi5wb3J0KQotICAgIGVsc2U6Ci0gICAgICBzZWxmLl9faHR0cCA9IGh0dHBsaWIuSFRUUFMoc2VsZi5ob3N0LCBzZWxmLnBvcnQpCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIGlmIHNlbGYuc2NoZW1lID09ICdodHRwJzoKKyAgICAgICAgICAgIHNlbGYuX19odHRwID0gaHR0cF9jbGllbnQuSFRUUENvbm5lY3Rpb24oc2VsZi5ob3N0LCBzZWxmLnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9c2VsZi5fX3RpbWVvdXQpCisgICAgICAgIGVsaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHBzJzoKKyAgICAgICAgICAgIHNlbGYuX19odHRwID0gaHR0cF9jbGllbnQuSFRUUFNDb25uZWN0aW9uKHNlbGYuaG9zdCwgc2VsZi5wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2ZpbGU9c2VsZi5rZXlmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9maWxlPXNlbGYuY2VydGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXNlbGYuX190aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dD1zZWxmLmNvbnRleHQpCisgICAgICAgIGlmIHNlbGYudXNpbmdfcHJveHkoKToKKyAgICAgICAgICAgIHNlbGYuX19odHRwLnNldF90dW5uZWwoc2VsZi5yZWFsaG9zdCwgc2VsZi5yZWFscG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJQcm94eS1BdXRob3JpemF0aW9uIjogc2VsZi5wcm94eV9hdXRofSkKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgc2VsZi5fX2h0dHAuY2xvc2UoKQotICAgIHNlbGYuX19odHRwID0gTm9uZQorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5fX2h0dHAuY2xvc2UoKQorICAgICAgICBzZWxmLl9faHR0cCA9IE5vbmUKKyAgICAgICAgc2VsZi5fX2h0dHBfcmVzcG9uc2UgPSBOb25lCiAKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX2h0dHAgIT0gTm9uZQorICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9faHR0cCBpcyBub3QgTm9uZQogCi0gIGRlZiBzZXRUaW1lb3V0KHNlbGYsIG1zKToKLSAgICBpZiBub3QgaGFzYXR0cihzb2NrZXQsICdnZXRkZWZhdWx0dGltZW91dCcpOgotICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorICAgIGRlZiBzZXRUaW1lb3V0KHNlbGYsIG1zKToKKyAgICAgICAgaWYgbXMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX190aW1lb3V0ID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fX3RpbWVvdXQgPSBtcyAvIDEwMDAuMAogCi0gICAgaWYgbXMgaXMgTm9uZToKLSAgICAgIHNlbGYuX190aW1lb3V0ID0gTm9uZQotICAgIGVsc2U6Ci0gICAgICBzZWxmLl9fdGltZW91dCA9IG1zLzEwMDAuMAorICAgIGRlZiBzZXRDdXN0b21IZWFkZXJzKHNlbGYsIGhlYWRlcnMpOgorICAgICAgICBzZWxmLl9fY3VzdG9tX2hlYWRlcnMgPSBoZWFkZXJzCiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgIHJldHVybiBzZWxmLl9faHR0cC5maWxlLnJlYWQoc3opCisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICByZXR1cm4gc2VsZi5fX2h0dHBfcmVzcG9uc2UucmVhZChzeikKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKIAotICBkZWYgX193aXRoVGltZW91dChmKToKLSAgICBkZWYgX2YoKmFyZ3MsICoqa3dhcmdzKToKLSAgICAgIG9yaWdfdGltZW91dCA9IHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpCi0gICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoYXJnc1swXS5fX3RpbWVvdXQpCi0gICAgICByZXN1bHQgPSBmKCphcmdzLCAqKmt3YXJncykKLSAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChvcmlnX3RpbWVvdXQpCi0gICAgICByZXR1cm4gcmVzdWx0Ci0gICAgcmV0dXJuIF9mCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmlzT3BlbigpOgorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgIHNlbGYub3BlbigpCiAKLSAgZGVmIGZsdXNoKHNlbGYpOgotICAgIGlmIHNlbGYuaXNPcGVuKCk6Ci0gICAgICBzZWxmLmNsb3NlKCkKLSAgICBzZWxmLm9wZW4oKTsKKyAgICAgICAgIyBQdWxsIGRhdGEgb3V0IG9mIGJ1ZmZlcgorICAgICAgICBkYXRhID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ5dGVzSU8oKQogCi0gICAgIyBQdWxsIGRhdGEgb3V0IG9mIGJ1ZmZlcgotICAgIGRhdGEgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCi0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCisgICAgICAgICMgSFRUUCByZXF1ZXN0CisgICAgICAgIGlmIHNlbGYudXNpbmdfcHJveHkoKSBhbmQgc2VsZi5zY2hlbWUgPT0gImh0dHAiOgorICAgICAgICAgICAgIyBuZWVkIGZ1bGwgVVJMIG9mIHJlYWwgaG9zdCBmb3IgSFRUUCBwcm94eSBoZXJlIChIVFRQUyB1c2VzIENPTk5FQ1QgdHVubmVsKQorICAgICAgICAgICAgc2VsZi5fX2h0dHAucHV0cmVxdWVzdCgnUE9TVCcsICJodHRwOi8vJXM6JXMlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5yZWFsaG9zdCwgc2VsZi5yZWFscG9ydCwgc2VsZi5wYXRoKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX19odHRwLnB1dHJlcXVlc3QoJ1BPU1QnLCBzZWxmLnBhdGgpCiAKLSAgICAjIEhUVFAgcmVxdWVzdAotICAgIHNlbGYuX19odHRwLnB1dHJlcXVlc3QoJ1BPU1QnLCBzZWxmLnBhdGgpCisgICAgICAgICMgV3JpdGUgaGVhZGVycworICAgICAgICBzZWxmLl9faHR0cC5wdXRoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94LXRocmlmdCcpCisgICAgICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcignQ29udGVudC1MZW5ndGgnLCBzdHIobGVuKGRhdGEpKSkKKyAgICAgICAgaWYgc2VsZi51c2luZ19wcm94eSgpIGFuZCBzZWxmLnNjaGVtZSA9PSAiaHR0cCIgYW5kIHNlbGYucHJveHlfYXV0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcigiUHJveHktQXV0aG9yaXphdGlvbiIsIHNlbGYucHJveHlfYXV0aCkKIAotICAgICMgV3JpdGUgaGVhZGVycwotICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcignSG9zdCcsIHNlbGYuaG9zdCkKLSAgICBzZWxmLl9faHR0cC5wdXRoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94LXRocmlmdCcpCi0gICAgc2VsZi5fX2h0dHAucHV0aGVhZGVyKCdDb250ZW50LUxlbmd0aCcsIHN0cihsZW4oZGF0YSkpKQotICAgIHNlbGYuX19odHRwLmVuZGhlYWRlcnMoKQorICAgICAgICBpZiBub3Qgc2VsZi5fX2N1c3RvbV9oZWFkZXJzIG9yICdVc2VyLUFnZW50JyBub3QgaW4gc2VsZi5fX2N1c3RvbV9oZWFkZXJzOgorICAgICAgICAgICAgdXNlcl9hZ2VudCA9ICdQeXRob24vVEh0dHBDbGllbnQnCisgICAgICAgICAgICBzY3JpcHQgPSBvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKQorICAgICAgICAgICAgaWYgc2NyaXB0OgorICAgICAgICAgICAgICAgIHVzZXJfYWdlbnQgPSAnJXMgKCVzKScgJSAodXNlcl9hZ2VudCwgdXJsbGliLnBhcnNlLnF1b3RlKHNjcmlwdCkpCisgICAgICAgICAgICBzZWxmLl9faHR0cC5wdXRoZWFkZXIoJ1VzZXItQWdlbnQnLCB1c2VyX2FnZW50KQogCi0gICAgIyBXcml0ZSBwYXlsb2FkCi0gICAgc2VsZi5fX2h0dHAuc2VuZChkYXRhKQorICAgICAgICBpZiBzZWxmLl9fY3VzdG9tX2hlYWRlcnM6CisgICAgICAgICAgICBmb3Iga2V5LCB2YWwgaW4gc2l4Lml0ZXJpdGVtcyhzZWxmLl9fY3VzdG9tX2hlYWRlcnMpOgorICAgICAgICAgICAgICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcihrZXksIHZhbCkKIAotICAgICMgR2V0IHJlcGx5IHRvIGZsdXNoIHRoZSByZXF1ZXN0Ci0gICAgc2VsZi5jb2RlLCBzZWxmLm1lc3NhZ2UsIHNlbGYuaGVhZGVycyA9IHNlbGYuX19odHRwLmdldHJlcGx5KCkKKyAgICAgICAgc2VsZi5fX2h0dHAuZW5kaGVhZGVycygpCiAKLSAgIyBEZWNvcmF0ZSBpZiB3ZSBrbm93IGhvdyB0byB0aW1lb3V0Ci0gIGlmIGhhc2F0dHIoc29ja2V0LCAnZ2V0ZGVmYXVsdHRpbWVvdXQnKToKLSAgICBmbHVzaCA9IF9fd2l0aFRpbWVvdXQoZmx1c2gpCisgICAgICAgICMgV3JpdGUgcGF5bG9hZAorICAgICAgICBzZWxmLl9faHR0cC5zZW5kKGRhdGEpCisKKyAgICAgICAgIyBHZXQgcmVwbHkgdG8gZmx1c2ggdGhlIHJlcXVlc3QKKyAgICAgICAgc2VsZi5fX2h0dHBfcmVzcG9uc2UgPSBzZWxmLl9faHR0cC5nZXRyZXNwb25zZSgpCisgICAgICAgIHNlbGYuY29kZSA9IHNlbGYuX19odHRwX3Jlc3BvbnNlLnN0YXR1cworICAgICAgICBzZWxmLm1lc3NhZ2UgPSBzZWxmLl9faHR0cF9yZXNwb25zZS5yZWFzb24KKyAgICAgICAgc2VsZi5oZWFkZXJzID0gc2VsZi5fX2h0dHBfcmVzcG9uc2UubXNnCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0LnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldC5weQppbmRleCBiZTM1ODQ0Li5iNTRjYTVkIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0LnB5CisrKyBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXQucHkKQEAgLTE2LDE2MSArMTYsMzgxIEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCisKK2ltcG9ydCBsb2dnaW5nCiBpbXBvcnQgb3MKIGltcG9ydCBzb2NrZXQKIGltcG9ydCBzc2wKK2ltcG9ydCBzeXMKK2ltcG9ydCB3YXJuaW5ncwogCitmcm9tIC5zc2xjb21wYXQgaW1wb3J0IF9tYXRjaF9ob3N0bmFtZSwgX21hdGNoX2hhc19pcGFkZHJlc3MKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAogZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRFeGNlcHRpb24KIAotY2xhc3MgVFNTTFNvY2tldChUU29ja2V0LlRTb2NrZXQpOgotICAiIiIKLSAgU1NMIGltcGxlbWVudGF0aW9uIG9mIGNsaWVudC1zaWRlIFRTb2NrZXQKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQord2FybmluZ3MuZmlsdGVyd2FybmluZ3MoCisgICAgJ2RlZmF1bHQnLCBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcsIG1vZHVsZT1fX25hbWVfXykKIAotICBUaGlzIGNsYXNzIGNyZWF0ZXMgb3V0Ym91bmQgc29ja2V0cyB3cmFwcGVkIHVzaW5nIHRoZQotICBweXRob24gc3RhbmRhcmQgc3NsIG1vZHVsZSBmb3IgZW5jcnlwdGVkIGNvbm5lY3Rpb25zLgotICAKLSAgVGhlIHByb3RvY29sIHVzZWQgaXMgc2V0IHVzaW5nIHRoZSBjbGFzcyB2YXJpYWJsZQotICBTU0xfVkVSU0lPTiwgd2hpY2ggbXVzdCBiZSBvbmUgb2Ygc3NsLlBST1RPQ09MXyogYW5kCi0gIGRlZmF1bHRzIHRvICBzc2wuUFJPVE9DT0xfVExTdjEgZm9yIGdyZWF0ZXN0IHNlY3VyaXR5LgotICAiIiIKLSAgU1NMX1ZFUlNJT04gPSBzc2wuUFJPVE9DT0xfVExTdjEKIAotICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCB2YWxpZGF0ZT1UcnVlLCBjYV9jZXJ0cz1Ob25lLCB1bml4X3NvY2tldD1Ob25lKToKK2NsYXNzIFRTU0xCYXNlKG9iamVjdCk6CisgICAgIyBTU0xDb250ZXh0IGlzIG5vdCBhdmFpbGFibGUgZm9yIFB5dGhvbiA8IDIuNy45CisgICAgX2hhc19zc2xfY29udGV4dCA9IHN5cy5oZXh2ZXJzaW9uID49IDB4MDIwNzA5RjAKKworICAgICMgY2lwaGVycyBhcmd1bWVudCBpcyBub3QgYXZhaWxhYmxlIGZvciBQeXRob24gPCAyLjcuMAorICAgIF9oYXNfY2lwaGVycyA9IHN5cy5oZXh2ZXJzaW9uID49IDB4MDIwNzAwRjAKKworICAgICMgRm9yIHB5dGhvbiA+PSAyLjcuOSwgdXNlIGxhdGVzdCBUTFMgdGhhdCBib3RoIGNsaWVudCBhbmQgc2VydmVyCisgICAgIyBzdXBwb3J0cy4KKyAgICAjIFNTTCAyLjAgYW5kIDMuMCBhcmUgZGlzYWJsZWQgdmlhIHNzbC5PUF9OT19TU0x2MiBhbmQgc3NsLk9QX05PX1NTTHYzLgorICAgICMgRm9yIHB5dGhvbiA8IDIuNy45LCB1c2UgVExTIDEuMCBzaW5jZSBUTFN2MV9YIG5vciBPUF9OT19TU0x2WCBpcworICAgICMgdW5hdmFpbGFibGUuCisgICAgX2RlZmF1bHRfcHJvdG9jb2wgPSBzc2wuUFJPVE9DT0xfU1NMdjIzIGlmIF9oYXNfc3NsX2NvbnRleHQgZWxzZSBcCisgICAgICAgIHNzbC5QUk9UT0NPTF9UTFN2MQorCisgICAgZGVmIF9pbml0X2NvbnRleHQoc2VsZiwgc3NsX3ZlcnNpb24pOgorICAgICAgICBpZiBzZWxmLl9oYXNfc3NsX2NvbnRleHQ6CisgICAgICAgICAgICBzZWxmLl9jb250ZXh0ID0gc3NsLlNTTENvbnRleHQoc3NsX3ZlcnNpb24pCisgICAgICAgICAgICBpZiBzZWxmLl9jb250ZXh0LnByb3RvY29sID09IHNzbC5QUk9UT0NPTF9TU0x2MjM6CisgICAgICAgICAgICAgICAgc2VsZi5fY29udGV4dC5vcHRpb25zIHw9IHNzbC5PUF9OT19TU0x2MgorICAgICAgICAgICAgICAgIHNlbGYuX2NvbnRleHQub3B0aW9ucyB8PSBzc2wuT1BfTk9fU1NMdjMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2NvbnRleHQgPSBOb25lCisgICAgICAgICAgICBzZWxmLl9zc2xfdmVyc2lvbiA9IHNzbF92ZXJzaW9uCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgX3Nob3VsZF92ZXJpZnkoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2hhc19zc2xfY29udGV4dDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9jb250ZXh0LnZlcmlmeV9tb2RlICE9IHNzbC5DRVJUX05PTkUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNlcnRfcmVxcyAhPSBzc2wuQ0VSVF9OT05FCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgc3NsX3ZlcnNpb24oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2hhc19zc2xfY29udGV4dDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnNzbF9jb250ZXh0LnByb3RvY29sCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fc3NsX3ZlcnNpb24KKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBzc2xfY29udGV4dChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRleHQKKworICAgIFNTTF9WRVJTSU9OID0gX2RlZmF1bHRfcHJvdG9jb2wKICAgICAiIiIKLSAgICBAcGFyYW0gdmFsaWRhdGU6IFNldCB0byBGYWxzZSB0byBkaXNhYmxlIFNTTCBjZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uIGVudGlyZWx5LgotICAgIEB0eXBlIHZhbGlkYXRlOiBib29sCi0gICAgQHBhcmFtIGNhX2NlcnRzOiBGaWxlbmFtZSB0byB0aGUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IHBlbSBmaWxlLCBwb3NzaWJseSBhCi0gICAgZmlsZSBkb3dubG9hZGVkIGZyb206IGh0dHA6Ly9jdXJsLmhheHguc2UvY2EvY2FjZXJ0LnBlbSAgVGhpcyBpcyBwYXNzZWQgdG8KLSAgICB0aGUgc3NsX3dyYXAgZnVuY3Rpb24gYXMgdGhlICdjYV9jZXJ0cycgcGFyYW1ldGVyLgotICAgIEB0eXBlIGNhX2NlcnRzOiBzdHIKLSAgICAKLSAgICBSYWlzZXMgYW4gSU9FcnJvciBleGNlcHRpb24gaWYgdmFsaWRhdGUgaXMgVHJ1ZSBhbmQgdGhlIGNhX2NlcnRzIGZpbGUgaXMKLSAgICBOb25lLCBub3QgcHJlc2VudCBvciB1bnJlYWRhYmxlLgotICAgICIiIgotICAgIHNlbGYudmFsaWRhdGUgPSB2YWxpZGF0ZQotICAgIHNlbGYuaXNfdmFsaWQgPSBGYWxzZQotICAgIHNlbGYucGVlcmNlcnQgPSBOb25lCi0gICAgaWYgbm90IHZhbGlkYXRlOgotICAgICAgc2VsZi5jZXJ0X3JlcXMgPSBzc2wuQ0VSVF9OT05FCi0gICAgZWxzZToKLSAgICAgIHNlbGYuY2VydF9yZXFzID0gc3NsLkNFUlRfUkVRVUlSRUQKLSAgICBzZWxmLmNhX2NlcnRzID0gY2FfY2VydHMKLSAgICBpZiB2YWxpZGF0ZToKLSAgICAgIGlmIGNhX2NlcnRzIGlzIE5vbmUgb3Igbm90IG9zLmFjY2VzcyhjYV9jZXJ0cywgb3MuUl9PSyk6Ci0gICAgICAgIHJhaXNlIElPRXJyb3IoJ0NlcnRpZmljYXRlIEF1dGhvcml0eSBjYV9jZXJ0cyBmaWxlICIlcyIgaXMgbm90IHJlYWRhYmxlLCBjYW5ub3QgdmFsaWRhdGUgU1NMIGNlcnRpZmljYXRlcy4nICUgKGNhX2NlcnRzKSkKLSAgICBUU29ja2V0LlRTb2NrZXQuX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCwgdW5peF9zb2NrZXQpCisgIERlZmF1bHQgU1NMIHZlcnNpb24uCisgIEZvciBiYWNrd29yZCBjb21wYXRpYmlsaXR5LCBpdCBjYW4gYmUgbW9kaWZpZWQuCisgIFVzZSBfX2luaXRfXyBrZXl3b2FyZCBhcmd1bWVudCAic3NsX3ZlcnNpb24iIGluc3RlYWQuCisgICIiIgogCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgIHRyeToKLSAgICAgIHJlczAgPSBzZWxmLl9yZXNvbHZlQWRkcigpCi0gICAgICBmb3IgcmVzIGluIHJlczA6Ci0gICAgICAgIHNvY2tfZmFtaWx5LCBzb2NrX3R5cGU9IHJlc1swOjJdCi0gICAgICAgIGlwX3BvcnQgPSByZXNbNF0KLSAgICAgICAgcGxhaW5fc29jayA9IHNvY2tldC5zb2NrZXQoc29ja19mYW1pbHksIHNvY2tfdHlwZSkKLSAgICAgICAgc2VsZi5oYW5kbGUgPSBzc2wud3JhcF9zb2NrZXQocGxhaW5fc29jaywgc3NsX3ZlcnNpb249c2VsZi5TU0xfVkVSU0lPTiwKLSAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PVRydWUsIGNhX2NlcnRzPXNlbGYuY2FfY2VydHMsIGNlcnRfcmVxcz1zZWxmLmNlcnRfcmVxcykgCi0gICAgICAgIHNlbGYuaGFuZGxlLnNldHRpbWVvdXQoc2VsZi5fdGltZW91dCkKKyAgICBkZWYgX2RlcHJlY2F0ZWRfYXJnKHNlbGYsIGFyZ3MsIGt3YXJncywgcG9zLCBrZXkpOgorICAgICAgICBpZiBsZW4oYXJncykgPD0gcG9zOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHJlYWxfcG9zID0gcG9zICsgMworICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgJyVkdGggcG9zaXRpb25hbCBhcmd1bWVudCBpcyBkZXByZWNhdGVkLicKKyAgICAgICAgICAgICdwbGVhc2UgdXNlIGtleXdhcmQgYXJndW1lbnQgaW5zdGVhbmQuJworICAgICAgICAgICAgJSByZWFsX3BvcywgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTMpCisKKyAgICAgICAgaWYga2V5IGluIGt3YXJnczoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKKyAgICAgICAgICAgICAgICAnRHVwbGljYXRlIGFyZ3VtZW50OiAlZHRoIGFyZ3VtZW50IGFuZCAlcyBrZXl3YXJkIGFyZ3VtZW50LicKKyAgICAgICAgICAgICAgICAlIChyZWFsX3Bvcywga2V5KSkKKyAgICAgICAga3dhcmdzW2tleV0gPSBhcmdzW3Bvc10KKworICAgIGRlZiBfdW5peF9zb2NrZXRfYXJnKHNlbGYsIGhvc3QsIHBvcnQsIGFyZ3MsIGt3YXJncyk6CisgICAgICAgIGtleSA9ICd1bml4X3NvY2tldCcKKyAgICAgICAgaWYgaG9zdCBpcyBOb25lIGFuZCBwb3J0IGlzIE5vbmUgYW5kIGxlbihhcmdzKSA9PSAxIGFuZCBrZXkgbm90IGluIGt3YXJnczoKKyAgICAgICAgICAgIGt3YXJnc1trZXldID0gYXJnc1swXQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwga2V5KToKKyAgICAgICAgaWYga2V5ID09ICdTU0xfVkVSU0lPTic6CisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICdTU0xfVkVSU0lPTiBpcyBkZXByZWNhdGVkLicKKyAgICAgICAgICAgICAgICAncGxlYXNlIHVzZSBzc2xfdmVyc2lvbiBhdHRyaWJ1dGUgaW5zdGVhZC4nLAorICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3NsX3ZlcnNpb24KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2ZXJfc2lkZSwgaG9zdCwgc3NsX29wdHMpOgorICAgICAgICBzZWxmLl9zZXJ2ZXJfc2lkZSA9IHNlcnZlcl9zaWRlCisgICAgICAgIGlmIFRTU0xCYXNlLlNTTF9WRVJTSU9OICE9IHNlbGYuX2RlZmF1bHRfcHJvdG9jb2w6CisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICdTU0xfVkVSU0lPTiBpcyBkZXByZWNhdGVkLicKKyAgICAgICAgICAgICAgICAncGxlYXNlIHVzZSBzc2xfdmVyc2lvbiBrZXl3YXJkIGFyZ3VtZW50IGluc3RlYWQuJywKKyAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgc2VsZi5fY29udGV4dCA9IHNzbF9vcHRzLnBvcCgnc3NsX2NvbnRleHQnLCBOb25lKQorICAgICAgICBzZWxmLl9zZXJ2ZXJfaG9zdG5hbWUgPSBOb25lCisgICAgICAgIGlmIG5vdCBzZWxmLl9zZXJ2ZXJfc2lkZToKKyAgICAgICAgICAgIHNlbGYuX3NlcnZlcl9ob3N0bmFtZSA9IHNzbF9vcHRzLnBvcCgnc2VydmVyX2hvc3RuYW1lJywgaG9zdCkKKyAgICAgICAgaWYgc2VsZi5fY29udGV4dDoKKyAgICAgICAgICAgIHNlbGYuX2N1c3RvbV9jb250ZXh0ID0gVHJ1ZQorICAgICAgICAgICAgaWYgc3NsX29wdHM6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgJ0luY29tcGF0aWJsZSBhcmd1bWVudHM6IHNzbF9jb250ZXh0IGFuZCAlcycKKyAgICAgICAgICAgICAgICAgICAgJSAnICcuam9pbihzc2xfb3B0cy5rZXlzKCkpKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX2hhc19zc2xfY29udGV4dDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAnc3NsX2NvbnRleHQgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyB2ZXJzaW9uIG9mIFB5dGhvbicpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9jdXN0b21fY29udGV4dCA9IEZhbHNlCisgICAgICAgICAgICBzc2xfdmVyc2lvbiA9IHNzbF9vcHRzLnBvcCgnc3NsX3ZlcnNpb24nLCBUU1NMQmFzZS5TU0xfVkVSU0lPTikKKyAgICAgICAgICAgIHNlbGYuX2luaXRfY29udGV4dChzc2xfdmVyc2lvbikKKyAgICAgICAgICAgIHNlbGYuY2VydF9yZXFzID0gc3NsX29wdHMucG9wKCdjZXJ0X3JlcXMnLCBzc2wuQ0VSVF9SRVFVSVJFRCkKKyAgICAgICAgICAgIHNlbGYuY2FfY2VydHMgPSBzc2xfb3B0cy5wb3AoJ2NhX2NlcnRzJywgTm9uZSkKKyAgICAgICAgICAgIHNlbGYua2V5ZmlsZSA9IHNzbF9vcHRzLnBvcCgna2V5ZmlsZScsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmNlcnRmaWxlID0gc3NsX29wdHMucG9wKCdjZXJ0ZmlsZScsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmNpcGhlcnMgPSBzc2xfb3B0cy5wb3AoJ2NpcGhlcnMnLCBOb25lKQorCisgICAgICAgICAgICBpZiBzc2xfb3B0czoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAnVW5rbm93biBrZXl3b3JkIGFyZ3VtZW50czogJywgJyAnLmpvaW4oc3NsX29wdHMua2V5cygpKSkKKworICAgICAgICAgICAgaWYgc2VsZi5fc2hvdWxkX3ZlcmlmeToKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5jYV9jZXJ0czoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICdjYV9jZXJ0cyBpcyBuZWVkZWQgd2hlbiBjZXJ0X3JlcXMgaXMgbm90IHNzbC5DRVJUX05PTkUnKQorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5hY2Nlc3Moc2VsZi5jYV9jZXJ0cywgb3MuUl9PSyk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJ0NlcnRpZmljYXRlIEF1dGhvcml0eSBjYV9jZXJ0cyBmaWxlICIlcyIgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcyBub3QgcmVhZGFibGUsIGNhbm5vdCB2YWxpZGF0ZSBTU0wgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjZXJ0aWZpY2F0ZXMuJyAlIChzZWxmLmNhX2NlcnRzKSkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjZXJ0ZmlsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NlcnRmaWxlCisKKyAgICBAY2VydGZpbGUuc2V0dGVyCisgICAgZGVmIGNlcnRmaWxlKHNlbGYsIGNlcnRmaWxlKToKKyAgICAgICAgaWYgc2VsZi5fc2VydmVyX3NpZGUgYW5kIG5vdCBjZXJ0ZmlsZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2NlcnRmaWxlIGlzIG5lZWRlZCBmb3Igc2VydmVyLXNpZGUnKQorICAgICAgICBpZiBjZXJ0ZmlsZSBhbmQgbm90IG9zLmFjY2VzcyhjZXJ0ZmlsZSwgb3MuUl9PSyk6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCdObyBzdWNoIGNlcnRmaWxlIGZvdW5kOiAlcycgJSAoY2VydGZpbGUpKQorICAgICAgICBzZWxmLl9jZXJ0ZmlsZSA9IGNlcnRmaWxlCisKKyAgICBkZWYgX3dyYXBfc29ja2V0KHNlbGYsIHNvY2spOgorICAgICAgICBpZiBzZWxmLl9oYXNfc3NsX2NvbnRleHQ6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fY3VzdG9tX2NvbnRleHQ6CisgICAgICAgICAgICAgICAgc2VsZi5zc2xfY29udGV4dC52ZXJpZnlfbW9kZSA9IHNlbGYuY2VydF9yZXFzCisgICAgICAgICAgICAgICAgaWYgc2VsZi5jZXJ0ZmlsZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zc2xfY29udGV4dC5sb2FkX2NlcnRfY2hhaW4oc2VsZi5jZXJ0ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5rZXlmaWxlKQorICAgICAgICAgICAgICAgIGlmIHNlbGYuY2lwaGVyczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zc2xfY29udGV4dC5zZXRfY2lwaGVycyhzZWxmLmNpcGhlcnMpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5jYV9jZXJ0czoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zc2xfY29udGV4dC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc2VsZi5jYV9jZXJ0cykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnNzbF9jb250ZXh0LndyYXBfc29ja2V0KAorICAgICAgICAgICAgICAgIHNvY2ssIHNlcnZlcl9zaWRlPXNlbGYuX3NlcnZlcl9zaWRlLAorICAgICAgICAgICAgICAgIHNlcnZlcl9ob3N0bmFtZT1zZWxmLl9zZXJ2ZXJfaG9zdG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzc2xfb3B0cyA9IHsKKyAgICAgICAgICAgICAgICAnc3NsX3ZlcnNpb24nOiBzZWxmLl9zc2xfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAnc2VydmVyX3NpZGUnOiBzZWxmLl9zZXJ2ZXJfc2lkZSwKKyAgICAgICAgICAgICAgICAnY2FfY2VydHMnOiBzZWxmLmNhX2NlcnRzLAorICAgICAgICAgICAgICAgICdrZXlmaWxlJzogc2VsZi5rZXlmaWxlLAorICAgICAgICAgICAgICAgICdjZXJ0ZmlsZSc6IHNlbGYuY2VydGZpbGUsCisgICAgICAgICAgICAgICAgJ2NlcnRfcmVxcyc6IHNlbGYuY2VydF9yZXFzLAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgc2VsZi5jaXBoZXJzOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2hhc19jaXBoZXJzOgorICAgICAgICAgICAgICAgICAgICBzc2xfb3B0c1snY2lwaGVycyddID0gc2VsZi5jaXBoZXJzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAnY2lwaGVycyBpcyBzcGVjaWZpZWQgYnV0IGlnbm9yZWQgZHVlIHRvIG9sZCBQeXRob24gdmVyc2lvbicpCisgICAgICAgICAgICByZXR1cm4gc3NsLndyYXBfc29ja2V0KHNvY2ssICoqc3NsX29wdHMpCisKKworY2xhc3MgVFNTTFNvY2tldChUU29ja2V0LlRTb2NrZXQsIFRTU0xCYXNlKToKKyAgICAiIiIKKyAgICBTU0wgaW1wbGVtZW50YXRpb24gb2YgVFNvY2tldAorCisgICAgVGhpcyBjbGFzcyBjcmVhdGVzIG91dGJvdW5kIHNvY2tldHMgd3JhcHBlZCB1c2luZyB0aGUKKyAgICBweXRob24gc3RhbmRhcmQgc3NsIG1vZHVsZSBmb3IgZW5jcnlwdGVkIGNvbm5lY3Rpb25zLgorICAgICIiIgorCisgICAgIyBOZXcgc2lnbmF0dXJlCisgICAgIyBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCB1bml4X3NvY2tldD1Ob25lLAorICAgICMgICAgICAgICAgICAgICoqc3NsX2FyZ3MpOgorICAgICMgRGVwcmVjYXRlZCBzaWduYXR1cmUKKyAgICAjIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsIHZhbGlkYXRlPVRydWUsCisgICAgIyAgICAgICAgICAgICAgY2FfY2VydHM9Tm9uZSwga2V5ZmlsZT1Ob25lLCBjZXJ0ZmlsZT1Ob25lLAorICAgICMgICAgICAgICAgICAgIHVuaXhfc29ja2V0PU5vbmUsIGNpcGhlcnM9Tm9uZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiUG9zaXRpb25hbCBhcmd1bWVudHM6IGBgaG9zdGBgLCBgYHBvcnRgYCwgYGB1bml4X3NvY2tldGBgCisKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6IGBga2V5ZmlsZWBgLCBgYGNlcnRmaWxlYGAsIGBgY2VydF9yZXFzYGAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBgYHNzbF92ZXJzaW9uYGAsIGBgY2FfY2VydHNgYCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgY2lwaGVyc2BgIChQeXRob24gMi43LjAgb3IgbGF0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBzZXJ2ZXJfaG9zdG5hbWVgYCAoUHl0aG9uIDIuNy45IG9yIGxhdGVyKQorICAgICAgICBQYXNzZWQgdG8gc3NsLndyYXBfc29ja2V0LiBTZWUgc3NsLndyYXBfc29ja2V0IGRvY3VtZW50YXRpb24uCisKKyAgICAgICAgQWx0ZXJuYXRpdmUga2V5d29yZCBhcmd1bWVudHM6IChQeXRob24gMi43Ljkgb3IgbGF0ZXIpCisgICAgICAgICAgYGBzc2xfY29udGV4dGBgOiBzc2wuU1NMQ29udGV4dCB0byBiZSB1c2VkIGZvciBTU0xDb250ZXh0LndyYXBfc29ja2V0CisgICAgICAgICAgYGBzZXJ2ZXJfaG9zdG5hbWVgYDogUGFzc2VkIHRvIFNTTENvbnRleHQud3JhcF9zb2NrZXQKKworICAgICAgICBDb21tb24ga2V5d29yZCBhcmd1bWVudDoKKyAgICAgICAgICBgYHZhbGlkYXRlX2NhbGxiYWNrYGAgKGNlcnQsIGhvc3RuYW1lKSAtPiBOb25lOgorICAgICAgICAgICAgICBDYWxsZWQgYWZ0ZXIgU1NMIGhhbmRzaGFrZS4gQ2FuIHJhaXNlIHdoZW4gaG9zdG5hbWUgZG9lcyBub3QKKyAgICAgICAgICAgICAgbWF0Y2ggdGhlIGNlcnQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmlzX3ZhbGlkID0gRmFsc2UKKyAgICAgICAgc2VsZi5wZWVyY2VydCA9IE5vbmUKKworICAgICAgICBpZiBhcmdzOgorICAgICAgICAgICAgaWYgbGVuKGFyZ3MpID4gNjoKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1RvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnQnKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX3VuaXhfc29ja2V0X2FyZyhob3N0LCBwb3J0LCBhcmdzLCBrd2FyZ3MpOgorICAgICAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMCwgJ3ZhbGlkYXRlJykKKyAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMSwgJ2NhX2NlcnRzJykKKyAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMiwgJ2tleWZpbGUnKQorICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCAzLCAnY2VydGZpbGUnKQorICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCA0LCAndW5peF9zb2NrZXQnKQorICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCA1LCAnY2lwaGVycycpCisKKyAgICAgICAgdmFsaWRhdGUgPSBrd2FyZ3MucG9wKCd2YWxpZGF0ZScsIE5vbmUpCisgICAgICAgIGlmIHZhbGlkYXRlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY2VydF9yZXFzX25hbWUgPSAnQ0VSVF9SRVFVSVJFRCcgaWYgdmFsaWRhdGUgZWxzZSAnQ0VSVF9OT05FJworICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAndmFsaWRhdGUgaXMgZGVwcmVjYXRlZC4gcGxlYXNlIHVzZSBjZXJ0X3JlcXM9c3NsLiVzIGluc3RlYWQnCisgICAgICAgICAgICAgICAgJSBjZXJ0X3JlcXNfbmFtZSwKKyAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgICAgIGlmICdjZXJ0X3JlcXMnIGluIGt3YXJnczoKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0Nhbm5vdCBzcGVjaWZ5IGJvdGggdmFsaWRhdGUgYW5kIGNlcnRfcmVxcycpCisgICAgICAgICAgICBrd2FyZ3NbJ2NlcnRfcmVxcyddID0gc3NsLkNFUlRfUkVRVUlSRUQgaWYgdmFsaWRhdGUgZWxzZSBzc2wuQ0VSVF9OT05FCisKKyAgICAgICAgdW5peF9zb2NrZXQgPSBrd2FyZ3MucG9wKCd1bml4X3NvY2tldCcsIE5vbmUpCisgICAgICAgIHNlbGYuX3ZhbGlkYXRlX2NhbGxiYWNrID0ga3dhcmdzLnBvcCgndmFsaWRhdGVfY2FsbGJhY2snLCBfbWF0Y2hfaG9zdG5hbWUpCisgICAgICAgIFRTU0xCYXNlLl9faW5pdF9fKHNlbGYsIEZhbHNlLCBob3N0LCBrd2FyZ3MpCisgICAgICAgIFRTb2NrZXQuVFNvY2tldC5fX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0LCB1bml4X3NvY2tldCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB2YWxpZGF0ZShzZWxmKToKKyAgICAgICAgd2FybmluZ3Mud2FybigndmFsaWRhdGUgaXMgZGVwcmVjYXRlZC4gcGxlYXNlIHVzZSBjZXJ0X3JlcXMgaW5zdGVhZCcsCisgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgIHJldHVybiBzZWxmLmNlcnRfcmVxcyAhPSBzc2wuQ0VSVF9OT05FCisKKyAgICBAdmFsaWRhdGUuc2V0dGVyCisgICAgZGVmIHZhbGlkYXRlKHNlbGYsIHZhbHVlKToKKyAgICAgICAgd2FybmluZ3Mud2FybigndmFsaWRhdGUgaXMgZGVwcmVjYXRlZC4gcGxlYXNlIHVzZSBjZXJ0X3JlcXMgaW5zdGVhZCcsCisgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgIHNlbGYuY2VydF9yZXFzID0gc3NsLkNFUlRfUkVRVUlSRUQgaWYgdmFsdWUgZWxzZSBzc2wuQ0VSVF9OT05FCisKKyAgICBkZWYgX2RvX29wZW4oc2VsZiwgZmFtaWx5LCBzb2NrdHlwZSk6CisgICAgICAgIHBsYWluX3NvY2sgPSBzb2NrZXQuc29ja2V0KGZhbWlseSwgc29ja3R5cGUpCiAgICAgICAgIHRyeToKLSAgICAgICAgICBzZWxmLmhhbmRsZS5jb25uZWN0KGlwX3BvcnQpCi0gICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGU6Ci0gICAgICAgICAgaWYgcmVzIGlzIG5vdCByZXMwWy0xXToKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIGUKLSAgICAgICAgYnJlYWsKLSAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlOgotICAgICAgaWYgc2VsZi5fdW5peF9zb2NrZXQ6Ci0gICAgICAgIG1lc3NhZ2UgPSAnQ291bGQgbm90IGNvbm5lY3QgdG8gc2VjdXJlIHNvY2tldCAlcycgJSBzZWxmLl91bml4X3NvY2tldAotICAgICAgZWxzZToKLSAgICAgICAgbWVzc2FnZSA9ICdDb3VsZCBub3QgY29ubmVjdCB0byAlczolZCcgJSAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpCi0gICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgbWVzc2FnZT1tZXNzYWdlKQotICAgIGlmIHNlbGYudmFsaWRhdGU6Ci0gICAgICBzZWxmLl92YWxpZGF0ZV9jZXJ0KCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl93cmFwX3NvY2tldChwbGFpbl9zb2NrKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgcGxhaW5fc29jay5jbG9zZSgpCisgICAgICAgICAgICBtc2cgPSAnZmFpbGVkIHRvIGluaXRpYWxpemUgU1NMJworICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbihtc2cpCisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIG1zZykKIAotICBkZWYgX3ZhbGlkYXRlX2NlcnQoc2VsZik6Ci0gICAgIiIiaW50ZXJuYWwgbWV0aG9kIHRvIHZhbGlkYXRlIHRoZSBwZWVyJ3MgU1NMIGNlcnRpZmljYXRlLCBhbmQgdG8gY2hlY2sgdGhlCi0gICAgY29tbW9uTmFtZSBvZiB0aGUgY2VydGlmaWNhdGUgdG8gZW5zdXJlIGl0IG1hdGNoZXMgdGhlIGhvc3RuYW1lIHdlCi0gICAgdXNlZCB0byBtYWtlIHRoaXMgY29ubmVjdGlvbi4gIERvZXMgbm90IHN1cHBvcnQgc3ViamVjdEFsdE5hbWUgcmVjb3JkcwotICAgIGluIGNlcnRpZmljYXRlcy4KLSAgICAKLSAgICByYWlzZXMgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGUgY2VydGlmaWNhdGUgZmFpbHMgdmFsaWRhdGlvbi4iIiIKLSAgICBjZXJ0ID0gc2VsZi5oYW5kbGUuZ2V0cGVlcmNlcnQoKQotICAgIHNlbGYucGVlcmNlcnQgPSBjZXJ0Ci0gICAgaWYgJ3N1YmplY3QnIG5vdCBpbiBjZXJ0OgotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbih0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sCi0gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nTm8gU1NMIGNlcnRpZmljYXRlIGZvdW5kIGZyb20gJXM6JXMnICUgKHNlbGYuaG9zdCwgc2VsZi5wb3J0KSkKLSAgICBmaWVsZHMgPSBjZXJ0WydzdWJqZWN0J10KLSAgICBmb3IgZmllbGQgaW4gZmllbGRzOgotICAgICAgIyBlbnN1cmUgc3RydWN0dXJlIHdlIGdldCBiYWNrIGlzIHdoYXQgd2UgZXhwZWN0Ci0gICAgICBpZiBub3QgaXNpbnN0YW5jZShmaWVsZCwgdHVwbGUpOgotICAgICAgICBjb250aW51ZQotICAgICAgY2VydF9wYWlyID0gZmllbGRbMF0KLSAgICAgIGlmIGxlbihjZXJ0X3BhaXIpIDwgMjoKLSAgICAgICAgY29udGludWUKLSAgICAgIGNlcnRfa2V5LCBjZXJ0X3ZhbHVlID0gY2VydF9wYWlyWzA6Ml0KLSAgICAgIGlmIGNlcnRfa2V5ICE9ICdjb21tb25OYW1lJzoKLSAgICAgICAgY29udGludWUKLSAgICAgIGNlcnRob3N0ID0gY2VydF92YWx1ZQotICAgICAgaWYgY2VydGhvc3QgPT0gc2VsZi5ob3N0OgotICAgICAgICAjIHN1Y2Nlc3MsIGNlcnQgY29tbW9uTmFtZSBtYXRjaGVzIGRlc2lyZWQgaG9zdG5hbWUKLSAgICAgICAgc2VsZi5pc192YWxpZCA9IFRydWUKLSAgICAgICAgcmV0dXJuIAotICAgICAgZWxzZToKLSAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbih0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nSG9zdCBuYW1lIHdlIGNvbm5lY3RlZCB0byAiJXMiIGRvZXNuXCd0IG1hdGNoIGNlcnRpZmljYXRlIHByb3ZpZGVkIGNvbW1vbk5hbWUgIiVzIicgJSAoc2VsZi5ob3N0LCBjZXJ0aG9zdCkpCi0gICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbih0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdDb3VsZCBub3QgdmFsaWRhdGUgU1NMIGNlcnRpZmljYXRlIGZyb20gaG9zdCAiJXMiLiAgQ2VydD0lcycgJSAoc2VsZi5ob3N0LCBjZXJ0KSkKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgc3VwZXIoVFNTTFNvY2tldCwgc2VsZikub3BlbigpCisgICAgICAgIGlmIHNlbGYuX3Nob3VsZF92ZXJpZnk6CisgICAgICAgICAgICBzZWxmLnBlZXJjZXJ0ID0gc2VsZi5oYW5kbGUuZ2V0cGVlcmNlcnQoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX3ZhbGlkYXRlX2NhbGxiYWNrKHNlbGYucGVlcmNlcnQsIHNlbGYuX3NlcnZlcl9ob3N0bmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLmlzX3ZhbGlkID0gVHJ1ZQorICAgICAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnRFeGNlcHRpb246CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXg6CisgICAgICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sIHN0cihleCkpCiAKLWNsYXNzIFRTU0xTZXJ2ZXJTb2NrZXQoVFNvY2tldC5UU2VydmVyU29ja2V0KToKLSAgIiIiCi0gIFNTTCBpbXBsZW1lbnRhdGlvbiBvZiBUU2VydmVyU29ja2V0CiAKLSAgVGhpcyB1c2VzIHRoZSBzc2wgbW9kdWxlJ3Mgd3JhcF9zb2NrZXQoKSBtZXRob2QgdG8gcHJvdmlkZSBTU0wKLSAgbmVnb3RpYXRlZCBlbmNyeXB0aW9uLgotICAiIiIKLSAgU1NMX1ZFUlNJT04gPSBzc2wuUFJPVE9DT0xfVExTdjEKK2NsYXNzIFRTU0xTZXJ2ZXJTb2NrZXQoVFNvY2tldC5UU2VydmVyU29ja2V0LCBUU1NMQmFzZSk6CisgICAgIiIiU1NMIGltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJTb2NrZXQKIAotICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD1Ob25lLCBwb3J0PTkwOTAsIGNlcnRmaWxlPSdjZXJ0LnBlbScsIHVuaXhfc29ja2V0PU5vbmUpOgotICAgICIiIkluaXRpYWxpemUgYSBUU1NMU2VydmVyU29ja2V0Ci0gICAgCi0gICAgQHBhcmFtIGNlcnRmaWxlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBmaWxlLCBkZWZhdWx0cyB0byBjZXJ0LnBlbQotICAgIEB0eXBlIGNlcnRmaWxlOiBzdHIKLSAgICBAcGFyYW0gaG9zdDogVGhlIGhvc3RuYW1lIG9yIElQIHRvIGJpbmQgdGhlIGxpc3RlbiBzb2NrZXQgdG8sIGkuZS4gJ2xvY2FsaG9zdCcgZm9yIG9ubHkgYWxsb3dpbmcKLSAgICBsb2NhbCBuZXR3b3JrIGNvbm5lY3Rpb25zLiBQYXNzIE5vbmUgdG8gYmluZCB0byBhbGwgaW50ZXJmYWNlcy4KLSAgICBAdHlwZSBob3N0OiBzdHIKLSAgICBAcGFyYW0gcG9ydDogVGhlIHBvcnQgdG8gbGlzdGVuIG9uIGZvciBpbmJvdW5kIGNvbm5lY3Rpb25zLgotICAgIEB0eXBlIHBvcnQ6IGludAorICAgIFRoaXMgdXNlcyB0aGUgc3NsIG1vZHVsZSdzIHdyYXBfc29ja2V0KCkgbWV0aG9kIHRvIHByb3ZpZGUgU1NMCisgICAgbmVnb3RpYXRlZCBlbmNyeXB0aW9uLgogICAgICIiIgotICAgIHNlbGYuc2V0Q2VydGZpbGUoY2VydGZpbGUpCi0gICAgVFNvY2tldC5UU2VydmVyU29ja2V0Ll9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQpCiAKLSAgZGVmIHNldENlcnRmaWxlKHNlbGYsIGNlcnRmaWxlKToKLSAgICAiIiJTZXQgb3IgY2hhbmdlIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgZmlsZSB1c2VkIHRvIHdyYXAgbmV3IGNvbm5lY3Rpb25zLgotICAgIAotICAgIEBwYXJhbSBjZXJ0ZmlsZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUsIGkuZS4gJy9ldGMvY2VydHMvc2VydmVyLnBlbScKLSAgICBAdHlwZSBjZXJ0ZmlsZTogc3RyCi0gICAgCi0gICAgUmFpc2VzIGFuIElPRXJyb3IgZXhjZXB0aW9uIGlmIHRoZSBjZXJ0ZmlsZSBpcyBub3QgcHJlc2VudCBvciB1bnJlYWRhYmxlLgotICAgICIiIgotICAgIGlmIG5vdCBvcy5hY2Nlc3MoY2VydGZpbGUsIG9zLlJfT0spOgotICAgICAgcmFpc2UgSU9FcnJvcignTm8gc3VjaCBjZXJ0ZmlsZSBmb3VuZDogJXMnICUgKGNlcnRmaWxlKSkKLSAgICBzZWxmLmNlcnRmaWxlID0gY2VydGZpbGUKKyAgICAjIE5ldyBzaWduYXR1cmUKKyAgICAjIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsIHVuaXhfc29ja2V0PU5vbmUsICoqc3NsX2FyZ3MpOgorICAgICMgRGVwcmVjYXRlZCBzaWduYXR1cmUKKyAgICAjIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PU5vbmUsIHBvcnQ9OTA5MCwgY2VydGZpbGU9J2NlcnQucGVtJywgdW5peF9zb2NrZXQ9Tm9uZSwgY2lwaGVycz1Ob25lKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD1Ob25lLCBwb3J0PTkwOTAsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIlBvc2l0aW9uYWwgYXJndW1lbnRzOiBgYGhvc3RgYCwgYGBwb3J0YGAsIGBgdW5peF9zb2NrZXRgYAogCi0gIGRlZiBhY2NlcHQoc2VsZik6Ci0gICAgcGxhaW5fY2xpZW50LCBhZGRyID0gc2VsZi5oYW5kbGUuYWNjZXB0KCkKLSAgICB0cnk6Ci0gICAgICBjbGllbnQgPSBzc2wud3JhcF9zb2NrZXQocGxhaW5fY2xpZW50LCBjZXJ0ZmlsZT1zZWxmLmNlcnRmaWxlLAotICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9zaWRlPVRydWUsIHNzbF92ZXJzaW9uPXNlbGYuU1NMX1ZFUlNJT04pCi0gICAgZXhjZXB0IHNzbC5TU0xFcnJvciwgc3NsX2V4YzoKLSAgICAgICMgZmFpbGVkIGhhbmRzaGFrZS9zc2wgd3JhcCwgY2xvc2Ugc29ja2V0IHRvIGNsaWVudAotICAgICAgcGxhaW5fY2xpZW50LmNsb3NlKCkKLSAgICAgICMgcmFpc2Ugc3NsX2V4YwotICAgICAgIyBXZSBjYW4ndCByYWlzZSB0aGUgZXhjZXB0aW9uLCBiZWNhdXNlIGl0IGtpbGxzIG1vc3QgVFNlcnZlciBkZXJpdmVkIHNlcnZlKCkKLSAgICAgICMgbWV0aG9kcy4KLSAgICAgICMgSW5zdGVhZCwgcmV0dXJuIE5vbmUsIGFuZCBsZXQgdGhlIFRTZXJ2ZXIgaW5zdGFuY2UgZGVhbCB3aXRoIGl0IGluCi0gICAgICAjIG90aGVyIGV4Y2VwdGlvbiBoYW5kbGluZy4gIChidXQgVFNpbXBsZVNlcnZlciBkaWVzIGFueXdheSkKLSAgICAgIHJldHVybiBOb25lIAotICAgIHJlc3VsdCA9IFRTb2NrZXQuVFNvY2tldCgpCi0gICAgcmVzdWx0LnNldEhhbmRsZShjbGllbnQpCi0gICAgcmV0dXJuIHJlc3VsdAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czogYGBrZXlmaWxlYGAsIGBgY2VydGZpbGVgYCwgYGBjZXJ0X3JlcXNgYCwgYGBzc2xfdmVyc2lvbmBgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBjYV9jZXJ0c2BgLCBgYGNpcGhlcnNgYCAoUHl0aG9uIDIuNy4wIG9yIGxhdGVyKQorICAgICAgICBTZWUgc3NsLndyYXBfc29ja2V0IGRvY3VtZW50YXRpb24uCisKKyAgICAgICAgQWx0ZXJuYXRpdmUga2V5d29yZCBhcmd1bWVudHM6IChQeXRob24gMi43Ljkgb3IgbGF0ZXIpCisgICAgICAgICAgYGBzc2xfY29udGV4dGBgOiBzc2wuU1NMQ29udGV4dCB0byBiZSB1c2VkIGZvciBTU0xDb250ZXh0LndyYXBfc29ja2V0CisgICAgICAgICAgYGBzZXJ2ZXJfaG9zdG5hbWVgYDogUGFzc2VkIHRvIFNTTENvbnRleHQud3JhcF9zb2NrZXQKKworICAgICAgICBDb21tb24ga2V5d29yZCBhcmd1bWVudDoKKyAgICAgICAgICBgYHZhbGlkYXRlX2NhbGxiYWNrYGAgKGNlcnQsIGhvc3RuYW1lKSAtPiBOb25lOgorICAgICAgICAgICAgICBDYWxsZWQgYWZ0ZXIgU1NMIGhhbmRzaGFrZS4gQ2FuIHJhaXNlIHdoZW4gaG9zdG5hbWUgZG9lcyBub3QKKyAgICAgICAgICAgICAgbWF0Y2ggdGhlIGNlcnQuCisgICAgICAgICIiIgorICAgICAgICBpZiBhcmdzOgorICAgICAgICAgICAgaWYgbGVuKGFyZ3MpID4gMzoKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1RvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnQnKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX3VuaXhfc29ja2V0X2FyZyhob3N0LCBwb3J0LCBhcmdzLCBrd2FyZ3MpOgorICAgICAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMCwgJ2NlcnRmaWxlJykKKyAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMSwgJ3VuaXhfc29ja2V0JykKKyAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMiwgJ2NpcGhlcnMnKQorCisgICAgICAgIGlmICdzc2xfY29udGV4dCcgbm90IGluIGt3YXJnczoKKyAgICAgICAgICAgICMgUHJlc2VydmUgZXhpc3RpbmcgYmVoYXZpb3JzIGZvciBkZWZhdWx0IHZhbHVlcworICAgICAgICAgICAgaWYgJ2NlcnRfcmVxcycgbm90IGluIGt3YXJnczoKKyAgICAgICAgICAgICAgICBrd2FyZ3NbJ2NlcnRfcmVxcyddID0gc3NsLkNFUlRfTk9ORQorICAgICAgICAgICAgaWYnY2VydGZpbGUnIG5vdCBpbiBrd2FyZ3M6CisgICAgICAgICAgICAgICAga3dhcmdzWydjZXJ0ZmlsZSddID0gJ2NlcnQucGVtJworCisgICAgICAgIHVuaXhfc29ja2V0ID0ga3dhcmdzLnBvcCgndW5peF9zb2NrZXQnLCBOb25lKQorICAgICAgICBzZWxmLl92YWxpZGF0ZV9jYWxsYmFjayA9IFwKKyAgICAgICAgICAgIGt3YXJncy5wb3AoJ3ZhbGlkYXRlX2NhbGxiYWNrJywgX21hdGNoX2hvc3RuYW1lKQorICAgICAgICBUU1NMQmFzZS5fX2luaXRfXyhzZWxmLCBUcnVlLCBOb25lLCBrd2FyZ3MpCisgICAgICAgIFRTb2NrZXQuVFNlcnZlclNvY2tldC5fX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0LCB1bml4X3NvY2tldCkKKyAgICAgICAgaWYgc2VsZi5fc2hvdWxkX3ZlcmlmeSBhbmQgbm90IF9tYXRjaF9oYXNfaXBhZGRyZXNzOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignTmVlZCBpcGFkZHJlc3MgYW5kIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlIHRvIHZlcmlmeSBjbGllbnQgY2VydGlmaWNhdGUnKQorCisgICAgZGVmIHNldENlcnRmaWxlKHNlbGYsIGNlcnRmaWxlKToKKyAgICAgICAgIiIiU2V0IG9yIGNoYW5nZSB0aGUgc2VydmVyIGNlcnRpZmljYXRlIGZpbGUgdXNlZCB0byB3cmFwIG5ldworICAgICAgICBjb25uZWN0aW9ucy4KKworICAgICAgICBAcGFyYW0gY2VydGZpbGU6IFRoZSBmaWxlbmFtZSBvZiB0aGUgc2VydmVyIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGkuZS4gJy9ldGMvY2VydHMvc2VydmVyLnBlbScKKyAgICAgICAgQHR5cGUgY2VydGZpbGU6IHN0cgorCisgICAgICAgIFJhaXNlcyBhbiBJT0Vycm9yIGV4Y2VwdGlvbiBpZiB0aGUgY2VydGZpbGUgaXMgbm90IHByZXNlbnQgb3IgdW5yZWFkYWJsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAnc2V0Q2VydGZpbGUgaXMgZGVwcmVjYXRlZC4gcGxlYXNlIHVzZSBjZXJ0ZmlsZSBwcm9wZXJ0eSBpbnN0ZWFkLicsCisgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgc2VsZi5jZXJ0ZmlsZSA9IGNlcnRmaWxlCisKKyAgICBkZWYgYWNjZXB0KHNlbGYpOgorICAgICAgICBwbGFpbl9jbGllbnQsIGFkZHIgPSBzZWxmLmhhbmRsZS5hY2NlcHQoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGllbnQgPSBzZWxmLl93cmFwX3NvY2tldChwbGFpbl9jbGllbnQpCisgICAgICAgIGV4Y2VwdCAoc3NsLlNTTEVycm9yLCBzb2NrZXQuZXJyb3IsIE9TRXJyb3IpOgorICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbignRXJyb3Igd2hpbGUgYWNjZXB0aW5nIGZyb20gJXMnLCBhZGRyKQorICAgICAgICAgICAgIyBmYWlsZWQgaGFuZHNoYWtlL3NzbCB3cmFwLCBjbG9zZSBzb2NrZXQgdG8gY2xpZW50CisgICAgICAgICAgICBwbGFpbl9jbGllbnQuY2xvc2UoKQorICAgICAgICAgICAgIyByYWlzZQorICAgICAgICAgICAgIyBXZSBjYW4ndCByYWlzZSB0aGUgZXhjZXB0aW9uLCBiZWNhdXNlIGl0IGtpbGxzIG1vc3QgVFNlcnZlciBkZXJpdmVkCisgICAgICAgICAgICAjIHNlcnZlKCkgbWV0aG9kcy4KKyAgICAgICAgICAgICMgSW5zdGVhZCwgcmV0dXJuIE5vbmUsIGFuZCBsZXQgdGhlIFRTZXJ2ZXIgaW5zdGFuY2UgZGVhbCB3aXRoIGl0IGluCisgICAgICAgICAgICAjIG90aGVyIGV4Y2VwdGlvbiBoYW5kbGluZy4gIChidXQgVFNpbXBsZVNlcnZlciBkaWVzIGFueXdheSkKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgaWYgc2VsZi5fc2hvdWxkX3ZlcmlmeToKKyAgICAgICAgICAgIGNsaWVudC5wZWVyY2VydCA9IGNsaWVudC5nZXRwZWVyY2VydCgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fdmFsaWRhdGVfY2FsbGJhY2soY2xpZW50LnBlZXJjZXJ0LCBhZGRyWzBdKQorICAgICAgICAgICAgICAgIGNsaWVudC5pc192YWxpZCA9IFRydWUKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byB2YWxpZGF0ZSBjbGllbnQgY2VydGlmaWNhdGUgYWRkcmVzczogJXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJbMF0sIGV4Y19pbmZvPVRydWUpCisgICAgICAgICAgICAgICAgY2xpZW50LmNsb3NlKCkKKyAgICAgICAgICAgICAgICBwbGFpbl9jbGllbnQuY2xvc2UoKQorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgcmVzdWx0ID0gVFNvY2tldC5UU29ja2V0KCkKKyAgICAgICAgcmVzdWx0LmhhbmRsZSA9IGNsaWVudAorICAgICAgICByZXR1cm4gcmVzdWx0CmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU29ja2V0LnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFNvY2tldC5weQppbmRleCBiZTYxNjc4Li5hN2Q2NjE3IDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU29ja2V0LnB5CisrKyBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RTb2NrZXQucHkKQEAgLTE3LDE0NyArMTcsMTg1IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1mcm9tIFRUcmFuc3BvcnQgaW1wb3J0ICoKLWltcG9ydCBvcwogaW1wb3J0IGVycm5vCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCiBpbXBvcnQgc29ja2V0CiBpbXBvcnQgc3lzCiAKLWNsYXNzIFRTb2NrZXRCYXNlKFRUcmFuc3BvcnRCYXNlKToKLSAgZGVmIF9yZXNvbHZlQWRkcihzZWxmKToKLSAgICBpZiBzZWxmLl91bml4X3NvY2tldCBpcyBub3QgTm9uZToKLSAgICAgIHJldHVybiBbKHNvY2tldC5BRl9VTklYLCBzb2NrZXQuU09DS19TVFJFQU0sIE5vbmUsIE5vbmUsIHNlbGYuX3VuaXhfc29ja2V0KV0KLSAgICBlbHNlOgotICAgICAgcmV0dXJuIHNvY2tldC5nZXRhZGRyaW5mbyhzZWxmLmhvc3QsIHNlbGYucG9ydCwgc29ja2V0LkFGX1VOU1BFQywgc29ja2V0LlNPQ0tfU1RSRUFNLCAwLCBzb2NrZXQuQUlfUEFTU0lWRSB8IHNvY2tldC5BSV9BRERSQ09ORklHKQorZnJvbSAuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEJhc2UsIFRUcmFuc3BvcnRFeGNlcHRpb24sIFRTZXJ2ZXJUcmFuc3BvcnRCYXNlCiAKLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIGlmIHNlbGYuaGFuZGxlOgotICAgICAgc2VsZi5oYW5kbGUuY2xvc2UoKQotICAgICAgc2VsZi5oYW5kbGUgPSBOb25lCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKKworCitjbGFzcyBUU29ja2V0QmFzZShUVHJhbnNwb3J0QmFzZSk6CisgICAgZGVmIF9yZXNvbHZlQWRkcihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fdW5peF9zb2NrZXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gWyhzb2NrZXQuQUZfVU5JWCwgc29ja2V0LlNPQ0tfU1RSRUFNLCBOb25lLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdW5peF9zb2NrZXQpXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNvY2tldC5nZXRhZGRyaW5mbyhzZWxmLmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc29ja2V0X2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LlNPQ0tfU1RSRUFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuQUlfUEFTU0lWRSB8IHNvY2tldC5BSV9BRERSQ09ORklHKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmhhbmRsZToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlID0gTm9uZQorCiAKIGNsYXNzIFRTb2NrZXQoVFNvY2tldEJhc2UpOgotICAiIiJTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgVFRyYW5zcG9ydCBiYXNlLiIiIgorICAgICIiIlNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBUVHJhbnNwb3J0IGJhc2UuIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgdW5peF9zb2NrZXQ9Tm9uZSk6Ci0gICAgIiIiSW5pdGlhbGl6ZSBhIFRTb2NrZXQKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCB1bml4X3NvY2tldD1Ob25lLCBzb2NrZXRfZmFtaWx5PXNvY2tldC5BRl9VTlNQRUMpOgorICAgICAgICAiIiJJbml0aWFsaXplIGEgVFNvY2tldAogCi0gICAgQHBhcmFtIGhvc3Qoc3RyKSAgVGhlIGhvc3QgdG8gY29ubmVjdCB0by4KLSAgICBAcGFyYW0gcG9ydChpbnQpICBUaGUgKFRDUCkgcG9ydCB0byBjb25uZWN0IHRvLgotICAgIEBwYXJhbSB1bml4X3NvY2tldChzdHIpICBUaGUgZmlsZW5hbWUgb2YgYSB1bml4IHNvY2tldCB0byBjb25uZWN0IHRvLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaG9zdCBhbmQgcG9ydCB3aWxsIGJlIGlnbm9yZWQuKQotICAgICIiIgorICAgICAgICBAcGFyYW0gaG9zdChzdHIpICBUaGUgaG9zdCB0byBjb25uZWN0IHRvLgorICAgICAgICBAcGFyYW0gcG9ydChpbnQpICBUaGUgKFRDUCkgcG9ydCB0byBjb25uZWN0IHRvLgorICAgICAgICBAcGFyYW0gdW5peF9zb2NrZXQoc3RyKSAgVGhlIGZpbGVuYW1lIG9mIGEgdW5peCBzb2NrZXQgdG8gY29ubmVjdCB0by4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChob3N0IGFuZCBwb3J0IHdpbGwgYmUgaWdub3JlZC4pCisgICAgICAgIEBwYXJhbSBzb2NrZXRfZmFtaWx5KGludCkgIFRoZSBzb2NrZXQgZmFtaWx5IHRvIHVzZSB3aXRoIHRoaXMgc29ja2V0LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5ob3N0ID0gaG9zdAorICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CisgICAgICAgIHNlbGYuaGFuZGxlID0gTm9uZQorICAgICAgICBzZWxmLl91bml4X3NvY2tldCA9IHVuaXhfc29ja2V0CisgICAgICAgIHNlbGYuX3RpbWVvdXQgPSBOb25lCisgICAgICAgIHNlbGYuX3NvY2tldF9mYW1pbHkgPSBzb2NrZXRfZmFtaWx5CiAKLSAgICBzZWxmLmhvc3QgPSBob3N0Ci0gICAgc2VsZi5wb3J0ID0gcG9ydAotICAgIHNlbGYuaGFuZGxlID0gTm9uZQotICAgIHNlbGYuX3VuaXhfc29ja2V0ID0gdW5peF9zb2NrZXQKLSAgICBzZWxmLl90aW1lb3V0ID0gTm9uZQorICAgIGRlZiBzZXRIYW5kbGUoc2VsZiwgaCk6CisgICAgICAgIHNlbGYuaGFuZGxlID0gaAogCi0gIGRlZiBzZXRIYW5kbGUoc2VsZiwgaCk6Ci0gICAgc2VsZi5oYW5kbGUgPSBoCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaGFuZGxlIGlzIG5vdCBOb25lCiAKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5oYW5kbGUgaXMgbm90IE5vbmUKKyAgICBkZWYgc2V0VGltZW91dChzZWxmLCBtcyk6CisgICAgICAgIGlmIG1zIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl90aW1lb3V0ID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fdGltZW91dCA9IG1zIC8gMTAwMC4wCiAKLSAgZGVmIHNldFRpbWVvdXQoc2VsZiwgbXMpOgotICAgIGlmIG1zIGlzIE5vbmU6Ci0gICAgICBzZWxmLl90aW1lb3V0ID0gTm9uZQotICAgIGVsc2U6Ci0gICAgICBzZWxmLl90aW1lb3V0ID0gbXMvMTAwMC4wCisgICAgICAgIGlmIHNlbGYuaGFuZGxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5oYW5kbGUuc2V0dGltZW91dChzZWxmLl90aW1lb3V0KQogCi0gICAgaWYgc2VsZi5oYW5kbGUgaXMgbm90IE5vbmU6Ci0gICAgICBzZWxmLmhhbmRsZS5zZXR0aW1lb3V0KHNlbGYuX3RpbWVvdXQpCisgICAgZGVmIF9kb19vcGVuKHNlbGYsIGZhbWlseSwgc29ja3R5cGUpOgorICAgICAgICByZXR1cm4gc29ja2V0LnNvY2tldChmYW1pbHksIHNvY2t0eXBlKQogCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgIHRyeToKLSAgICAgIHJlczAgPSBzZWxmLl9yZXNvbHZlQWRkcigpCi0gICAgICBmb3IgcmVzIGluIHJlczA6Ci0gICAgICAgIHNlbGYuaGFuZGxlID0gc29ja2V0LnNvY2tldChyZXNbMF0sIHJlc1sxXSkKLSAgICAgICAgc2VsZi5oYW5kbGUuc2V0dGltZW91dChzZWxmLl90aW1lb3V0KQorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBfYWRkcmVzcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3VuaXhfc29ja2V0IGlmIHNlbGYuX3VuaXhfc29ja2V0IGVsc2UgJyVzOiVkJyAlIChzZWxmLmhvc3QsIHNlbGYucG9ydCkKKworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmhhbmRsZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5BTFJFQURZX09QRU4pCiAgICAgICAgIHRyeToKLSAgICAgICAgICBzZWxmLmhhbmRsZS5jb25uZWN0KHJlc1s0XSkKLSAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZToKLSAgICAgICAgICBpZiByZXMgaXMgbm90IHJlczBbLTFdOgotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgZQotICAgICAgICBicmVhawotICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGU6Ci0gICAgICBpZiBzZWxmLl91bml4X3NvY2tldDoKLSAgICAgICAgbWVzc2FnZSA9ICdDb3VsZCBub3QgY29ubmVjdCB0byBzb2NrZXQgJXMnICUgc2VsZi5fdW5peF9zb2NrZXQKLSAgICAgIGVsc2U6Ci0gICAgICAgIG1lc3NhZ2UgPSAnQ291bGQgbm90IGNvbm5lY3QgdG8gJXM6JWQnICUgKHNlbGYuaG9zdCwgc2VsZi5wb3J0KQotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbih0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIG1lc3NhZ2U9bWVzc2FnZSkKKyAgICAgICAgICAgIGFkZHJzID0gc2VsZi5fcmVzb2x2ZUFkZHIoKQorICAgICAgICBleGNlcHQgc29ja2V0LmdhaWVycm9yOgorICAgICAgICAgICAgbXNnID0gJ2ZhaWxlZCB0byByZXNvbHZlIHNvY2thZGRyIGZvciAnICsgc3RyKHNlbGYuX2FkZHJlc3MpCisgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKG1zZykKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgbXNnKQorICAgICAgICBmb3IgZmFtaWx5LCBzb2NrdHlwZSwgXywgXywgc29ja2FkZHIgaW4gYWRkcnM6CisgICAgICAgICAgICBoYW5kbGUgPSBzZWxmLl9kb19vcGVuKGZhbWlseSwgc29ja3R5cGUpCisgICAgICAgICAgICBoYW5kbGUuc2V0dGltZW91dChzZWxmLl90aW1lb3V0KQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGhhbmRsZS5jb25uZWN0KHNvY2thZGRyKQorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlID0gaGFuZGxlCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgICAgIGhhbmRsZS5jbG9zZSgpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0NvdWxkIG5vdCBjb25uZWN0IHRvICVzJywgc29ja2FkZHIsIGV4Y19pbmZvPVRydWUpCisgICAgICAgIG1zZyA9ICdDb3VsZCBub3QgY29ubmVjdCB0byBhbnkgb2YgJXMnICUgbGlzdChtYXAobGFtYmRhIGE6IGFbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcnMpKQorICAgICAgICBsb2dnZXIuZXJyb3IobXNnKQorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIG1zZykKIAotICBkZWYgcmVhZChzZWxmLCBzeik6Ci0gICAgdHJ5OgotICAgICAgYnVmZiA9IHNlbGYuaGFuZGxlLnJlY3Yoc3opCi0gICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZToKLSAgICAgIGlmIChlLmFyZ3NbMF0gPT0gZXJybm8uRUNPTk5SRVNFVCBhbmQKLSAgICAgICAgICAoc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nIG9yIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdmcmVlYnNkJykpKToKLSAgICAgICAgIyBmcmVlYnNkIGFuZCBNYWNoIGRvbid0IGZvbGxvdyBQT1NJWCBzZW1hbnRpYyBvZiByZWN2Ci0gICAgICAgICMgYW5kIGZhaWwgd2l0aCBFQ09OTlJFU0VUIGlmIHBlZXIgcGVyZm9ybWVkIHNodXRkb3duLgotICAgICAgICAjIFNlZSBjb3JyZXNwb25kaW5nIGNvbW1lbnQgYW5kIGNvZGUgaW4gVFNvY2tldDo6cmVhZCgpCi0gICAgICAgICMgaW4gbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTb2NrZXQuY3BwLgotICAgICAgICBzZWxmLmNsb3NlKCkKLSAgICAgICAgIyBUcmlnZ2VyIHRoZSBjaGVjayB0byByYWlzZSB0aGUgRU5EX09GX0ZJTEUgZXhjZXB0aW9uIGJlbG93LgotICAgICAgICBidWZmID0gJycKLSAgICAgIGVsc2U6Ci0gICAgICAgIHJhaXNlCi0gICAgaWYgbGVuKGJ1ZmYpID09IDA6Ci0gICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgbWVzc2FnZT0nVFNvY2tldCByZWFkIDAgYnl0ZXMnKQotICAgIHJldHVybiBidWZmCisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBidWZmID0gc2VsZi5oYW5kbGUucmVjdihzeikKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyBlOgorICAgICAgICAgICAgaWYgKGUuYXJnc1swXSA9PSBlcnJuby5FQ09OTlJFU0VUIGFuZAorICAgICAgICAgICAgICAgICAgICAoc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nIG9yIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdmcmVlYnNkJykpKToKKyAgICAgICAgICAgICAgICAjIGZyZWVic2QgYW5kIE1hY2ggZG9uJ3QgZm9sbG93IFBPU0lYIHNlbWFudGljIG9mIHJlY3YKKyAgICAgICAgICAgICAgICAjIGFuZCBmYWlsIHdpdGggRUNPTk5SRVNFVCBpZiBwZWVyIHBlcmZvcm1lZCBzaHV0ZG93bi4KKyAgICAgICAgICAgICAgICAjIFNlZSBjb3JyZXNwb25kaW5nIGNvbW1lbnQgYW5kIGNvZGUgaW4gVFNvY2tldDo6cmVhZCgpCisgICAgICAgICAgICAgICAgIyBpbiBsaWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldC5jcHAuCisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgIyBUcmlnZ2VyIHRoZSBjaGVjayB0byByYWlzZSB0aGUgRU5EX09GX0ZJTEUgZXhjZXB0aW9uIGJlbG93LgorICAgICAgICAgICAgICAgIGJ1ZmYgPSAnJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBpZiBsZW4oYnVmZikgPT0gMDoKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24odHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdUU29ja2V0IHJlYWQgMCBieXRlcycpCisgICAgICAgIHJldHVybiBidWZmCiAKLSAgZGVmIHdyaXRlKHNlbGYsIGJ1ZmYpOgotICAgIGlmIG5vdCBzZWxmLmhhbmRsZToKLSAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24odHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCBtZXNzYWdlPSdUcmFuc3BvcnQgbm90IG9wZW4nKQotICAgIHNlbnQgPSAwCi0gICAgaGF2ZSA9IGxlbihidWZmKQotICAgIHdoaWxlIHNlbnQgPCBoYXZlOgotICAgICAgcGx1cyA9IHNlbGYuaGFuZGxlLnNlbmQoYnVmZikKLSAgICAgIGlmIHBsdXMgPT0gMDoKLSAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbih0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUsIG1lc3NhZ2U9J1RTb2NrZXQgc2VudCAwIGJ5dGVzJykKLSAgICAgIHNlbnQgKz0gcGx1cwotICAgICAgYnVmZiA9IGJ1ZmZbcGx1czpdCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1ZmYpOgorICAgICAgICBpZiBub3Qgc2VsZi5oYW5kbGU6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVHJhbnNwb3J0IG5vdCBvcGVuJykKKyAgICAgICAgc2VudCA9IDAKKyAgICAgICAgaGF2ZSA9IGxlbihidWZmKQorICAgICAgICB3aGlsZSBzZW50IDwgaGF2ZToKKyAgICAgICAgICAgIHBsdXMgPSBzZWxmLmhhbmRsZS5zZW5kKGJ1ZmYpCisgICAgICAgICAgICBpZiBwbHVzID09IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbih0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdUU29ja2V0IHNlbnQgMCBieXRlcycpCisgICAgICAgICAgICBzZW50ICs9IHBsdXMKKyAgICAgICAgICAgIGJ1ZmYgPSBidWZmW3BsdXM6XQogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBwYXNzCisKIAogY2xhc3MgVFNlcnZlclNvY2tldChUU29ja2V0QmFzZSwgVFNlcnZlclRyYW5zcG9ydEJhc2UpOgotICAiIiJTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgVFNlcnZlclRyYW5zcG9ydCBiYXNlLiIiIgorICAgICIiIlNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBUU2VydmVyVHJhbnNwb3J0IGJhc2UuIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9Tm9uZSwgcG9ydD05MDkwLCB1bml4X3NvY2tldD1Ob25lKToKLSAgICBzZWxmLmhvc3QgPSBob3N0Ci0gICAgc2VsZi5wb3J0ID0gcG9ydAotICAgIHNlbGYuX3VuaXhfc29ja2V0ID0gdW5peF9zb2NrZXQKLSAgICBzZWxmLmhhbmRsZSA9IE5vbmUKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD1Ob25lLCBwb3J0PTkwOTAsIHVuaXhfc29ja2V0PU5vbmUsIHNvY2tldF9mYW1pbHk9c29ja2V0LkFGX1VOU1BFQyk6CisgICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKKyAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICBzZWxmLl91bml4X3NvY2tldCA9IHVuaXhfc29ja2V0CisgICAgICAgIHNlbGYuX3NvY2tldF9mYW1pbHkgPSBzb2NrZXRfZmFtaWx5CisgICAgICAgIHNlbGYuaGFuZGxlID0gTm9uZQorICAgICAgICBzZWxmLl9iYWNrbG9nID0gMTI4CiAKLSAgZGVmIGxpc3RlbihzZWxmKToKLSAgICByZXMwID0gc2VsZi5fcmVzb2x2ZUFkZHIoKQotICAgIGZvciByZXMgaW4gcmVzMDoKLSAgICAgIGlmIHJlc1swXSBpcyBzb2NrZXQuQUZfSU5FVDYgb3IgcmVzIGlzIHJlczBbLTFdOgotICAgICAgICBicmVhaworICAgIGRlZiBzZXRCYWNrbG9nKHNlbGYsIGJhY2tsb2c9Tm9uZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLmhhbmRsZToKKyAgICAgICAgICAgIHNlbGYuX2JhY2tsb2cgPSBiYWNrbG9nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFdlIGNhbm4ndCB1cGRhdGUgYmFja2xvZyB3aGVuIGl0IGlzIGFscmVhZHkgbGlzdGVuaW5nLCBzaW5jZSB0aGUKKyAgICAgICAgICAgICMgaGFuZGxlIGhhcyBiZWVuIGNyZWF0ZWQuCisgICAgICAgICAgICBsb2dnZXIud2FybignWW91IGhhdmUgdG8gc2V0IGJhY2tsb2cgYmVmb3JlIGxpc3Rlbi4nKQogCi0gICAgIyBXZSBuZWVkIHJlbW92ZSB0aGUgb2xkIHVuaXggc29ja2V0IGlmIHRoZSBmaWxlIGV4aXN0cyBhbmQKLSAgICAjIG5vYm9keSBpcyBsaXN0ZW5pbmcgb24gaXQuCi0gICAgaWYgc2VsZi5fdW5peF9zb2NrZXQ6Ci0gICAgICB0bXAgPSBzb2NrZXQuc29ja2V0KHJlc1swXSwgcmVzWzFdKQotICAgICAgdHJ5OgotICAgICAgICB0bXAuY29ubmVjdChyZXNbNF0pCi0gICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlcnI6Ci0gICAgICAgIGVubywgbWVzc2FnZSA9IGVyci5hcmdzCi0gICAgICAgIGlmIGVubyA9PSBlcnJuby5FQ09OTlJFRlVTRUQ6Ci0gICAgICAgICAgb3MudW5saW5rKHJlc1s0XSkKKyAgICBkZWYgbGlzdGVuKHNlbGYpOgorICAgICAgICByZXMwID0gc2VsZi5fcmVzb2x2ZUFkZHIoKQorICAgICAgICBzb2NrZXRfZmFtaWx5ID0gc2VsZi5fc29ja2V0X2ZhbWlseSA9PSBzb2NrZXQuQUZfVU5TUEVDIGFuZCBzb2NrZXQuQUZfSU5FVDYgb3Igc2VsZi5fc29ja2V0X2ZhbWlseQorICAgICAgICBmb3IgcmVzIGluIHJlczA6CisgICAgICAgICAgICBpZiByZXNbMF0gaXMgc29ja2V0X2ZhbWlseSBvciByZXMgaXMgcmVzMFstMV06CisgICAgICAgICAgICAgICAgYnJlYWsKIAotICAgIHNlbGYuaGFuZGxlID0gc29ja2V0LnNvY2tldChyZXNbMF0sIHJlc1sxXSkKLSAgICBzZWxmLmhhbmRsZS5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSLCAxKQotICAgIGlmIGhhc2F0dHIoc2VsZi5oYW5kbGUsICdzZXRfdGltZW91dCcpOgotICAgICAgc2VsZi5oYW5kbGUuc2V0X3RpbWVvdXQoTm9uZSkKLSAgICBzZWxmLmhhbmRsZS5iaW5kKHJlc1s0XSkKLSAgICBzZWxmLmhhbmRsZS5saXN0ZW4oMTI4KQorICAgICAgICAjIFdlIG5lZWQgcmVtb3ZlIHRoZSBvbGQgdW5peCBzb2NrZXQgaWYgdGhlIGZpbGUgZXhpc3RzIGFuZAorICAgICAgICAjIG5vYm9keSBpcyBsaXN0ZW5pbmcgb24gaXQuCisgICAgICAgIGlmIHNlbGYuX3VuaXhfc29ja2V0OgorICAgICAgICAgICAgdG1wID0gc29ja2V0LnNvY2tldChyZXNbMF0sIHJlc1sxXSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0bXAuY29ubmVjdChyZXNbNF0pCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIGVycjoKKyAgICAgICAgICAgICAgICBlbm8sIG1lc3NhZ2UgPSBlcnIuYXJncworICAgICAgICAgICAgICAgIGlmIGVubyA9PSBlcnJuby5FQ09OTlJFRlVTRUQ6CisgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhyZXNbNF0pCiAKLSAgZGVmIGFjY2VwdChzZWxmKToKLSAgICBjbGllbnQsIGFkZHIgPSBzZWxmLmhhbmRsZS5hY2NlcHQoKQotICAgIHJlc3VsdCA9IFRTb2NrZXQoKQotICAgIHJlc3VsdC5zZXRIYW5kbGUoY2xpZW50KQotICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgc2VsZi5oYW5kbGUgPSBzb2NrZXQuc29ja2V0KHJlc1swXSwgcmVzWzFdKQorICAgICAgICBzZWxmLmhhbmRsZS5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSLCAxKQorICAgICAgICBpZiBoYXNhdHRyKHNlbGYuaGFuZGxlLCAnc2V0dGltZW91dCcpOgorICAgICAgICAgICAgc2VsZi5oYW5kbGUuc2V0dGltZW91dChOb25lKQorICAgICAgICBzZWxmLmhhbmRsZS5iaW5kKHJlc1s0XSkKKyAgICAgICAgc2VsZi5oYW5kbGUubGlzdGVuKHNlbGYuX2JhY2tsb2cpCisKKyAgICBkZWYgYWNjZXB0KHNlbGYpOgorICAgICAgICBjbGllbnQsIGFkZHIgPSBzZWxmLmhhbmRsZS5hY2NlcHQoKQorICAgICAgICByZXN1bHQgPSBUU29ja2V0KCkKKyAgICAgICAgcmVzdWx0LnNldEhhbmRsZShjbGllbnQpCisgICAgICAgIHJldHVybiByZXN1bHQKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LnB5CmluZGV4IDEyZTUxYTkuLmQxMzA2MGYgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQucHkKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5weQpAQCAtMTcsMzE1ICsxNyw0MzkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwotZnJvbSBzdHJ1Y3QgaW1wb3J0IHBhY2ssdW5wYWNrCitmcm9tIHN0cnVjdCBpbXBvcnQgcGFjaywgdW5wYWNrCiBmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRFeGNlcHRpb24KK2Zyb20gLi5jb21wYXQgaW1wb3J0IEJ1ZmZlcklPCisKIAogY2xhc3MgVFRyYW5zcG9ydEV4Y2VwdGlvbihURXhjZXB0aW9uKToKKyAgICAiIiJDdXN0b20gVHJhbnNwb3J0IEV4Y2VwdGlvbiBjbGFzcyIiIgogCi0gICIiIkN1c3RvbSBUcmFuc3BvcnQgRXhjZXB0aW9uIGNsYXNzIiIiCisgICAgVU5LTk9XTiA9IDAKKyAgICBOT1RfT1BFTiA9IDEKKyAgICBBTFJFQURZX09QRU4gPSAyCisgICAgVElNRURfT1VUID0gMworICAgIEVORF9PRl9GSUxFID0gNAorICAgIE5FR0FUSVZFX1NJWkUgPSA1CisgICAgU0laRV9MSU1JVCA9IDYKKyAgICBJTlZBTElEX0NMSUVOVF9UWVBFID0gNwogCi0gIFVOS05PV04gPSAwCi0gIE5PVF9PUEVOID0gMQotICBBTFJFQURZX09QRU4gPSAyCi0gIFRJTUVEX09VVCA9IDMKLSAgRU5EX09GX0ZJTEUgPSA0CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGU9VU5LTk9XTiwgbWVzc2FnZT1Ob25lKToKKyAgICAgICAgVEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQorICAgICAgICBzZWxmLnR5cGUgPSB0eXBlCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGU9VU5LTk9XTiwgbWVzc2FnZT1Ob25lKToKLSAgICBURXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCi0gICAgc2VsZi50eXBlID0gdHlwZQogCi1jbGFzcyBUVHJhbnNwb3J0QmFzZToKK2NsYXNzIFRUcmFuc3BvcnRCYXNlKG9iamVjdCk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgVGhyaWZ0IHRyYW5zcG9ydCBsYXllci4iIiIKIAotICAiIiJCYXNlIGNsYXNzIGZvciBUaHJpZnQgdHJhbnNwb3J0IGxheWVyLiIiIgorICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgaXNPcGVuKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkKHNlbGYsIHN6KToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRBbGwoc2VsZiwgc3opOgorICAgICAgICBidWZmID0gYicnCisgICAgICAgIGhhdmUgPSAwCisgICAgICAgIHdoaWxlIChoYXZlIDwgc3opOgorICAgICAgICAgICAgY2h1bmsgPSBzZWxmLnJlYWQoc3ogLSBoYXZlKQorICAgICAgICAgICAgY2h1bmtMZW4gPSBsZW4oY2h1bmspCisgICAgICAgICAgICBoYXZlICs9IGNodW5rTGVuCisgICAgICAgICAgICBidWZmICs9IGNodW5rCiAKLSAgZGVmIHJlYWRBbGwoc2VsZiwgc3opOgotICAgIGJ1ZmYgPSAnJwotICAgIGhhdmUgPSAwCi0gICAgd2hpbGUgKGhhdmUgPCBzeik6Ci0gICAgICBjaHVuayA9IHNlbGYucmVhZChzei1oYXZlKQotICAgICAgaGF2ZSArPSBsZW4oY2h1bmspCi0gICAgICBidWZmICs9IGNodW5rCisgICAgICAgICAgICBpZiBjaHVua0xlbiA9PSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yKCkKIAotICAgICAgaWYgbGVuKGNodW5rKSA9PSAwOgotICAgICAgICByYWlzZSBFT0ZFcnJvcigpCisgICAgICAgIHJldHVybiBidWZmCiAKLSAgICByZXR1cm4gYnVmZgorICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6Ci0gICAgcGFzcworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICBwYXNzCiAKICMgVGhpcyBjbGFzcyBzaG91bGQgYmUgdGhvdWdodCBvZiBhcyBhbiBpbnRlcmZhY2UuCi1jbGFzcyBDUmVhZGFibGVUcmFuc3BvcnQ6Ci0gICIiImJhc2UgY2xhc3MgZm9yIHRyYW5zcG9ydHMgdGhhdCBhcmUgcmVhZGFibGUgZnJvbSBDIiIiCitjbGFzcyBDUmVhZGFibGVUcmFuc3BvcnQob2JqZWN0KToKKyAgICAiIiJiYXNlIGNsYXNzIGZvciB0cmFuc3BvcnRzIHRoYXQgYXJlIHJlYWRhYmxlIGZyb20gQyIiIgogCi0gICMgVE9ETyhkcmVpc3MpOiBUaGluayBhYm91dCBjaGFuZ2luZyB0aGlzIGludGVyZmFjZSB0byBhbGxvdyB1cyB0byB1c2UKLSAgIyAgICAgICAgICAgICAgIGEgKFB5dGhvbiwgbm90IGMpIFN0cmluZ0lPIGluc3RlYWQsIGJlY2F1c2UgaXQgYWxsb3dzCi0gICMgICAgICAgICAgICAgICB5b3UgdG8gd3JpdGUgYWZ0ZXIgcmVhZGluZy4KKyAgICAjIFRPRE8oZHJlaXNzKTogVGhpbmsgYWJvdXQgY2hhbmdpbmcgdGhpcyBpbnRlcmZhY2UgdG8gYWxsb3cgdXMgdG8gdXNlCisgICAgIyAgICAgICAgICAgICAgIGEgKFB5dGhvbiwgbm90IGMpIFN0cmluZ0lPIGluc3RlYWQsIGJlY2F1c2UgaXQgYWxsb3dzCisgICAgIyAgICAgICAgICAgICAgIHlvdSB0byB3cml0ZSBhZnRlciByZWFkaW5nLgogCi0gICMgTk9URTogVGhpcyBpcyBhIGNsYXNzaWMgY2xhc3MsIHNvIHByb3BlcnRpZXMgd2lsbCBOT1Qgd29yawotICAjICAgICAgIGNvcnJlY3RseSBmb3Igc2V0dGluZy4KLSAgQHByb3BlcnR5Ci0gIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgotICAgICIiIkEgY1N0cmluZ0lPIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSBjdXJyZW50IGNodW5rIHdlIGFyZSByZWFkaW5nLiIiIgotICAgIHBhc3MKKyAgICAjIE5PVEU6IFRoaXMgaXMgYSBjbGFzc2ljIGNsYXNzLCBzbyBwcm9wZXJ0aWVzIHdpbGwgTk9UIHdvcmsKKyAgICAjICAgICAgIGNvcnJlY3RseSBmb3Igc2V0dGluZy4KKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKKyAgICAgICAgIiIiQSBjU3RyaW5nSU8gYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIGN1cnJlbnQgY2h1bmsgd2UgYXJlIHJlYWRpbmcuIiIiCisgICAgICAgIHBhc3MKIAotICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKLSAgICAiIiJSZWZpbGxzIGNzdHJpbmdpb19idWYuCisgICAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcGFydGlhbHJlYWQsIHJlcWxlbik6CisgICAgICAgICIiIlJlZmlsbHMgY3N0cmluZ2lvX2J1Zi4KIAotICAgIFJldHVybnMgdGhlIGN1cnJlbnRseSB1c2VkIGJ1ZmZlciAod2hpY2ggY2FuIGJ1dCBuZWVkIG5vdCBiZSB0aGUgc2FtZSBhcwotICAgIHRoZSBvbGQgY3N0cmluZ2lvX2J1ZikuIHBhcnRpYWxyZWFkIGlzIHdoYXQgdGhlIEMgY29kZSBoYXMgcmVhZCBmcm9tIHRoZQotICAgIGJ1ZmZlciwgYW5kIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBidWZmZXIgYmVmb3JlIGFueSBtb3JlIHJlYWRzLiAgVGhlCi0gICAgcmV0dXJuIHZhbHVlIG11c3QgYmUgYSBuZXcsIG5vdCBib3Jyb3dlZCByZWZlcmVuY2UuICBTb21ldGhpbmcgYWxvbmcgdGhlCi0gICAgbGluZXMgb2Ygc2VsZi5fYnVmIHNob3VsZCBiZSBmaW5lLgorICAgICAgICBSZXR1cm5zIHRoZSBjdXJyZW50bHkgdXNlZCBidWZmZXIgKHdoaWNoIGNhbiBidXQgbmVlZCBub3QgYmUgdGhlIHNhbWUgYXMKKyAgICAgICAgdGhlIG9sZCBjc3RyaW5naW9fYnVmKS4gcGFydGlhbHJlYWQgaXMgd2hhdCB0aGUgQyBjb2RlIGhhcyByZWFkIGZyb20gdGhlCisgICAgICAgIGJ1ZmZlciwgYW5kIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBidWZmZXIgYmVmb3JlIGFueSBtb3JlIHJlYWRzLiAgVGhlCisgICAgICAgIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEgbmV3LCBub3QgYm9ycm93ZWQgcmVmZXJlbmNlLiAgU29tZXRoaW5nIGFsb25nIHRoZQorICAgICAgICBsaW5lcyBvZiBzZWxmLl9idWYgc2hvdWxkIGJlIGZpbmUuCiAKLSAgICBJZiByZXFsZW4gYnl0ZXMgY2FuJ3QgYmUgcmVhZCwgdGhyb3cgRU9GRXJyb3IuCisgICAgICAgIElmIHJlcWxlbiBieXRlcyBjYW4ndCBiZSByZWFkLCB0aHJvdyBFT0ZFcnJvci4KKyAgICAgICAgIiIiCisgICAgICAgIHBhc3MKKworCitjbGFzcyBUU2VydmVyVHJhbnNwb3J0QmFzZShvYmplY3QpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIFRocmlmdCBzZXJ2ZXIgdHJhbnNwb3J0cy4iIiIKKworICAgIGRlZiBsaXN0ZW4oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBhY2NlcHQoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgcGFzcworCisKK2NsYXNzIFRUcmFuc3BvcnRGYWN0b3J5QmFzZShvYmplY3QpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIGEgVHJhbnNwb3J0IEZhY3RvcnkiIiIKKworICAgIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gdHJhbnMKKworCitjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KG9iamVjdCk6CisgICAgIiIiRmFjdG9yeSB0cmFuc3BvcnQgdGhhdCBidWlsZHMgYnVmZmVyZWQgdHJhbnNwb3J0cyIiIgorCisgICAgZGVmIGdldFRyYW5zcG9ydChzZWxmLCB0cmFucyk6CisgICAgICAgIGJ1ZmZlcmVkID0gVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zKQorICAgICAgICByZXR1cm4gYnVmZmVyZWQKKworCitjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnQoVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydCk6CisgICAgIiIiQ2xhc3MgdGhhdCB3cmFwcyBhbm90aGVyIHRyYW5zcG9ydCBhbmQgYnVmZmVycyBpdHMgSS9PLgorCisgICAgVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgYSAoY29uZmlndXJhYmxlKSBmaXhlZC1zaXplIHJlYWQgYnVmZmVyCisgICAgYnV0IGJ1ZmZlcnMgYWxsIHdyaXRlcyB1bnRpbCBhIGZsdXNoIGlzIHBlcmZvcm1lZC4KICAgICAiIiIKLSAgICBwYXNzCisgICAgREVGQVVMVF9CVUZGRVIgPSA0MDk2CiAKLWNsYXNzIFRTZXJ2ZXJUcmFuc3BvcnRCYXNlOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucywgcmJ1Zl9zaXplPURFRkFVTFRfQlVGRkVSKToKKyAgICAgICAgc2VsZi5fX3RyYW5zID0gdHJhbnMKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCisgICAgICAgICMgUGFzcyBzdHJpbmcgYXJndW1lbnQgdG8gaW5pdGlhbGl6ZSByZWFkIGJ1ZmZlciBhcyBjU3RyaW5nSU8uSW5wdXRUeXBlCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8oYicnKQorICAgICAgICBzZWxmLl9fcmJ1Zl9zaXplID0gcmJ1Zl9zaXplCiAKLSAgIiIiQmFzZSBjbGFzcyBmb3IgVGhyaWZ0IHNlcnZlciB0cmFuc3BvcnRzLiIiIgorICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuaXNPcGVuKCkKIAotICBkZWYgbGlzdGVuKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5vcGVuKCkKIAotICBkZWYgYWNjZXB0KHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuY2xvc2UoKQogCi0gIGRlZiBjbG9zZShzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorICAgICAgICBpZiBsZW4ocmV0KSAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHJldAorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKHNlbGYuX190cmFucy5yZWFkKG1heChzeiwgc2VsZi5fX3JidWZfc2l6ZSkpKQorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYucmVhZChzeikKIAotY2xhc3MgVFRyYW5zcG9ydEZhY3RvcnlCYXNlOgorICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICMgb24gZXhjZXB0aW9uIHJlc2V0IHdidWYgc28gaXQgZG9lc24ndCBjb250YWluIGEgcGFydGlhbCBmdW5jdGlvbiBjYWxsCisgICAgICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ1ZmZlcklPKCkKKyAgICAgICAgICAgIHJhaXNlIGUKIAotICAiIiJCYXNlIGNsYXNzIGZvciBhIFRyYW5zcG9ydCBGYWN0b3J5IiIiCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBvdXQgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCisgICAgICAgICMgcmVzZXQgd2J1ZiBiZWZvcmUgd3JpdGUvZmx1c2ggdG8gcHJlc2VydmUgc3RhdGUgb24gdW5kZXJseWluZyBmYWlsdXJlCisgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQorICAgICAgICBzZWxmLl9fdHJhbnMud3JpdGUob3V0KQorICAgICAgICBzZWxmLl9fdHJhbnMuZmx1c2goKQogCi0gIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMpOgotICAgIHJldHVybiB0cmFucworICAgICMgSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlLgorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYKIAotY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeToKKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKKyAgICAgICAgcmV0c3RyaW5nID0gcGFydGlhbHJlYWQKKyAgICAgICAgaWYgcmVxbGVuIDwgc2VsZi5fX3JidWZfc2l6ZToKKyAgICAgICAgICAgICMgdHJ5IHRvIG1ha2UgYSByZWFkIG9mIGFzIG11Y2ggYXMgd2UgY2FuLgorICAgICAgICAgICAgcmV0c3RyaW5nICs9IHNlbGYuX190cmFucy5yZWFkKHNlbGYuX19yYnVmX3NpemUpCiAKLSAgIiIiRmFjdG9yeSB0cmFuc3BvcnQgdGhhdCBidWlsZHMgYnVmZmVyZWQgdHJhbnNwb3J0cyIiIgorICAgICAgICAjIGJ1dCBtYWtlIHN1cmUgd2UgZG8gcmVhZCByZXFsZW4gYnl0ZXMuCisgICAgICAgIGlmIGxlbihyZXRzdHJpbmcpIDwgcmVxbGVuOgorICAgICAgICAgICAgcmV0c3RyaW5nICs9IHNlbGYuX190cmFucy5yZWFkQWxsKHJlcWxlbiAtIGxlbihyZXRzdHJpbmcpKQogCi0gIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMpOgotICAgIGJ1ZmZlcmVkID0gVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zKQotICAgIHJldHVybiBidWZmZXJlZAorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKHJldHN0cmluZykKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmCiAKIAotY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0KFRUcmFuc3BvcnRCYXNlLENSZWFkYWJsZVRyYW5zcG9ydCk6Ci0KLSAgIiIiQ2xhc3MgdGhhdCB3cmFwcyBhbm90aGVyIHRyYW5zcG9ydCBhbmQgYnVmZmVycyBpdHMgSS9PLgotCi0gIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgKGNvbmZpZ3VyYWJsZSkgZml4ZWQtc2l6ZSByZWFkIGJ1ZmZlcgotICBidXQgYnVmZmVycyBhbGwgd3JpdGVzIHVudGlsIGEgZmx1c2ggaXMgcGVyZm9ybWVkLgotICAiIiIKLQotICBERUZBVUxUX0JVRkZFUiA9IDQwOTYKLQotICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsIHJidWZfc2l6ZSA9IERFRkFVTFRfQlVGRkVSKToKLSAgICBzZWxmLl9fdHJhbnMgPSB0cmFucwotICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8oIiIpCi0gICAgc2VsZi5fX3JidWZfc2l6ZSA9IHJidWZfc2l6ZQotCi0gIGRlZiBpc09wZW4oc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX190cmFucy5pc09wZW4oKQotCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fdHJhbnMub3BlbigpCi0KLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fdHJhbnMuY2xvc2UoKQotCi0gIGRlZiByZWFkKHNlbGYsIHN6KToKLSAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQotICAgIGlmIGxlbihyZXQpICE9IDA6Ci0gICAgICByZXR1cm4gcmV0Ci0KLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKHNlbGYuX190cmFucy5yZWFkKG1heChzeiwgc2VsZi5fX3JidWZfc2l6ZSkpKQotICAgIHJldHVybiBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQotCi0gIGRlZiB3cml0ZShzZWxmLCBidWYpOgotICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKLQotICBkZWYgZmx1c2goc2VsZik6Ci0gICAgb3V0ID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQotICAgICMgcmVzZXQgd2J1ZiBiZWZvcmUgd3JpdGUvZmx1c2ggdG8gcHJlc2VydmUgc3RhdGUgb24gdW5kZXJseWluZyBmYWlsdXJlCi0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCi0gICAgc2VsZi5fX3RyYW5zLndyaXRlKG91dCkKLSAgICBzZWxmLl9fdHJhbnMuZmx1c2goKQotCi0gICMgSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlLgotICBAcHJvcGVydHkKLSAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX19yYnVmCi0KLSAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcGFydGlhbHJlYWQsIHJlcWxlbik6Ci0gICAgcmV0c3RyaW5nID0gcGFydGlhbHJlYWQKLSAgICBpZiByZXFsZW4gPCBzZWxmLl9fcmJ1Zl9zaXplOgotICAgICAgIyB0cnkgdG8gbWFrZSBhIHJlYWQgb2YgYXMgbXVjaCBhcyB3ZSBjYW4uCi0gICAgICByZXRzdHJpbmcgKz0gc2VsZi5fX3RyYW5zLnJlYWQoc2VsZi5fX3JidWZfc2l6ZSkKLQotICAgICMgYnV0IG1ha2Ugc3VyZSB3ZSBkbyByZWFkIHJlcWxlbiBieXRlcy4KLSAgICBpZiBsZW4ocmV0c3RyaW5nKSA8IHJlcWxlbjoKLSAgICAgIHJldHN0cmluZyArPSBzZWxmLl9fdHJhbnMucmVhZEFsbChyZXFsZW4gLSBsZW4ocmV0c3RyaW5nKSkKLQotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8ocmV0c3RyaW5nKQotICAgIHJldHVybiBzZWxmLl9fcmJ1ZgotCiBjbGFzcyBUTWVtb3J5QnVmZmVyKFRUcmFuc3BvcnRCYXNlLCBDUmVhZGFibGVUcmFuc3BvcnQpOgotICAiIiJXcmFwcyBhIGNTdHJpbmdJTyBvYmplY3QgYXMgYSBUVHJhbnNwb3J0LgorICAgICIiIldyYXBzIGEgY0J5dGVzSU8gb2JqZWN0IGFzIGEgVFRyYW5zcG9ydC4KIAotICBOT1RFOiBVbmxpa2UgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoaXMgY2xhc3MsIHlvdSBjYW5ub3Qgd3JpdGUgdG8gaXQKLSAgICAgICAgdGhlbiBpbW1lZGlhdGVseSByZWFkIGZyb20gaXQuICBJZiB5b3Ugd2FudCB0byByZWFkIGZyb20gYQotICAgICAgICBUTWVtb3J5QnVmZmVyLCB5b3UgbXVzdCBlaXRoZXIgcGFzcyBhIHN0cmluZyB0byB0aGUgY29uc3RydWN0b3IuCi0gIFRPRE8oZHJlaXNzKTogTWFrZSB0aGlzIHdvcmsgbGlrZSB0aGUgQysrIHZlcnNpb24uCi0gICIiIgorICAgIE5PVEU6IFVubGlrZSB0aGUgQysrIHZlcnNpb24gb2YgdGhpcyBjbGFzcywgeW91IGNhbm5vdCB3cml0ZSB0byBpdAorICAgICAgICAgIHRoZW4gaW1tZWRpYXRlbHkgcmVhZCBmcm9tIGl0LiAgSWYgeW91IHdhbnQgdG8gcmVhZCBmcm9tIGEKKyAgICAgICAgICBUTWVtb3J5QnVmZmVyLCB5b3UgbXVzdCBlaXRoZXIgcGFzcyBhIHN0cmluZyB0byB0aGUgY29uc3RydWN0b3IuCisgICAgVE9ETyhkcmVpc3MpOiBNYWtlIHRoaXMgd29yayBsaWtlIHRoZSBDKysgdmVyc2lvbi4KKyAgICAiIiIKIAotICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWU9Tm9uZSk6Ci0gICAgIiIidmFsdWUgLS0gYSB2YWx1ZSB0byByZWFkIGZyb20gZm9yIHN0cmluZ2lvCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlPU5vbmUsIG9mZnNldD0wKToKKyAgICAgICAgIiIidmFsdWUgLS0gYSB2YWx1ZSB0byByZWFkIGZyb20gZm9yIHN0cmluZ2lvCiAKLSAgICBJZiB2YWx1ZSBpcyBzZXQsIHRoaXMgd2lsbCBiZSBhIHRyYW5zcG9ydCBmb3IgcmVhZGluZywKLSAgICBvdGhlcndpc2UsIGl0IGlzIGZvciB3cml0aW5nIiIiCi0gICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6Ci0gICAgICBzZWxmLl9idWZmZXIgPSBTdHJpbmdJTyh2YWx1ZSkKLSAgICBlbHNlOgotICAgICAgc2VsZi5fYnVmZmVyID0gU3RyaW5nSU8oKQorICAgICAgICBJZiB2YWx1ZSBpcyBzZXQsIHRoaXMgd2lsbCBiZSBhIHRyYW5zcG9ydCBmb3IgcmVhZGluZywKKyAgICAgICAgb3RoZXJ3aXNlLCBpdCBpcyBmb3Igd3JpdGluZyIiIgorICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2J1ZmZlciA9IEJ1ZmZlcklPKHZhbHVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fYnVmZmVyID0gQnVmZmVySU8oKQorICAgICAgICBpZiBvZmZzZXQ6CisgICAgICAgICAgICBzZWxmLl9idWZmZXIuc2VlayhvZmZzZXQpCiAKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICByZXR1cm4gbm90IHNlbGYuX2J1ZmZlci5jbG9zZWQKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gbm90IHNlbGYuX2J1ZmZlci5jbG9zZWQKIAotICBkZWYgb3BlbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgc2VsZi5fYnVmZmVyLmNsb3NlKCkKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuX2J1ZmZlci5jbG9zZSgpCiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgIHJldHVybiBzZWxmLl9idWZmZXIucmVhZChzeikKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgIHJldHVybiBzZWxmLl9idWZmZXIucmVhZChzeikKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICBzZWxmLl9idWZmZXIud3JpdGUoYnVmKQorICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICBzZWxmLl9idWZmZXIud3JpdGUoYnVmKQogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIGdldHZhbHVlKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9idWZmZXIuZ2V0dmFsdWUoKQorICAgIGRlZiBnZXR2YWx1ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2J1ZmZlci5nZXR2YWx1ZSgpCiAKLSAgIyBJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UuCi0gIEBwcm9wZXJ0eQotICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fYnVmZmVyCisgICAgIyBJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UuCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9idWZmZXIKIAotICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKLSAgICAjIG9ubHkgb25lIHNob3QgYXQgcmVhZGluZy4uLgotICAgIHJhaXNlIEVPRkVycm9yKCkKKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKKyAgICAgICAgIyBvbmx5IG9uZSBzaG90IGF0IHJlYWRpbmcuLi4KKyAgICAgICAgcmFpc2UgRU9GRXJyb3IoKQogCi1jbGFzcyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeToKIAotICAiIiJGYWN0b3J5IHRyYW5zcG9ydCB0aGF0IGJ1aWxkcyBmcmFtZWQgdHJhbnNwb3J0cyIiIgorY2xhc3MgVEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnkob2JqZWN0KToKKyAgICAiIiJGYWN0b3J5IHRyYW5zcG9ydCB0aGF0IGJ1aWxkcyBmcmFtZWQgdHJhbnNwb3J0cyIiIgogCi0gIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMpOgotICAgIGZyYW1lZCA9IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpCi0gICAgcmV0dXJuIGZyYW1lZAorICAgIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMpOgorICAgICAgICBmcmFtZWQgPSBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKQorICAgICAgICByZXR1cm4gZnJhbWVkCiAKIAogY2xhc3MgVEZyYW1lZFRyYW5zcG9ydChUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0KToKKyAgICAiIiJDbGFzcyB0aGF0IHdyYXBzIGFub3RoZXIgdHJhbnNwb3J0IGFuZCBmcmFtZXMgaXRzIEkvTyB3aGVuIHdyaXRpbmcuIiIiCiAKLSAgIiIiQ2xhc3MgdGhhdCB3cmFwcyBhbm90aGVyIHRyYW5zcG9ydCBhbmQgZnJhbWVzIGl0cyBJL08gd2hlbiB3cml0aW5nLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucywpOgorICAgICAgICBzZWxmLl9fdHJhbnMgPSB0cmFucworICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKGInJykKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zLCk6Ci0gICAgc2VsZi5fX3RyYW5zID0gdHJhbnMKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKCkKLSAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmlzT3BlbigpCiAKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmlzT3BlbigpCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMub3BlbigpCiAKLSAgZGVmIG9wZW4oc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX190cmFucy5vcGVuKCkKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuY2xvc2UoKQogCi0gIGRlZiBjbG9zZShzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmNsb3NlKCkKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgIHJldCA9IHNlbGYuX19yYnVmLnJlYWQoc3opCisgICAgICAgIGlmIGxlbihyZXQpICE9IDA6CisgICAgICAgICAgICByZXR1cm4gcmV0CiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgIHJldCA9IHNlbGYuX19yYnVmLnJlYWQoc3opCi0gICAgaWYgbGVuKHJldCkgIT0gMDoKLSAgICAgIHJldHVybiByZXQKKyAgICAgICAgc2VsZi5yZWFkRnJhbWUoKQorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYucmVhZChzeikKIAotICAgIHNlbGYucmVhZEZyYW1lKCkKLSAgICByZXR1cm4gc2VsZi5fX3JidWYucmVhZChzeikKKyAgICBkZWYgcmVhZEZyYW1lKHNlbGYpOgorICAgICAgICBidWZmID0gc2VsZi5fX3RyYW5zLnJlYWRBbGwoNCkKKyAgICAgICAgc3osID0gdW5wYWNrKCchaScsIGJ1ZmYpCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8oc2VsZi5fX3RyYW5zLnJlYWRBbGwoc3opKQogCi0gIGRlZiByZWFkRnJhbWUoc2VsZik6Ci0gICAgYnVmZiA9IHNlbGYuX190cmFucy5yZWFkQWxsKDQpCi0gICAgc3osID0gdW5wYWNrKCchaScsIGJ1ZmYpCi0gICAgc2VsZi5fX3JidWYgPSBTdHJpbmdJTyhzZWxmLl9fdHJhbnMucmVhZEFsbChzeikpCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICB3b3V0ID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQorICAgICAgICB3c3ogPSBsZW4od291dCkKKyAgICAgICAgIyByZXNldCB3YnVmIGJlZm9yZSB3cml0ZS9mbHVzaCB0byBwcmVzZXJ2ZSBzdGF0ZSBvbiB1bmRlcmx5aW5nIGZhaWx1cmUKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCisgICAgICAgICMgTi5CLjogRG9pbmcgdGhpcyBzdHJpbmcgY29uY2F0ZW5hdGlvbiBpcyBXQVkgY2hlYXBlciB0aGFuIG1ha2luZworICAgICAgICAjIHR3byBzZXBhcmF0ZSBjYWxscyB0byB0aGUgdW5kZXJseWluZyBzb2NrZXQgb2JqZWN0LiBTb2NrZXQgd3JpdGVzIGluCisgICAgICAgICMgUHl0aG9uIHR1cm4gb3V0IHRvIGJlIFJFQUxMWSBleHBlbnNpdmUsIGJ1dCBpdCBzZWVtcyB0byBkbyBhIHByZXR0eQorICAgICAgICAjIGdvb2Qgam9iIG9mIG1hbmFnaW5nIHN0cmluZyBidWZmZXIgb3BlcmF0aW9ucyB3aXRob3V0IGV4Y2Vzc2l2ZSBjb3BpZXMKKyAgICAgICAgYnVmID0gcGFjaygiIWkiLCB3c3opICsgd291dAorICAgICAgICBzZWxmLl9fdHJhbnMud3JpdGUoYnVmKQorICAgICAgICBzZWxmLl9fdHJhbnMuZmx1c2goKQogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICB3b3V0ID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQotICAgIHdzeiA9IGxlbih3b3V0KQotICAgICMgcmVzZXQgd2J1ZiBiZWZvcmUgd3JpdGUvZmx1c2ggdG8gcHJlc2VydmUgc3RhdGUgb24gdW5kZXJseWluZyBmYWlsdXJlCi0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCi0gICAgIyBOLkIuOiBEb2luZyB0aGlzIHN0cmluZyBjb25jYXRlbmF0aW9uIGlzIFdBWSBjaGVhcGVyIHRoYW4gbWFraW5nCi0gICAgIyB0d28gc2VwYXJhdGUgY2FsbHMgdG8gdGhlIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdC4gU29ja2V0IHdyaXRlcyBpbgotICAgICMgUHl0aG9uIHR1cm4gb3V0IHRvIGJlIFJFQUxMWSBleHBlbnNpdmUsIGJ1dCBpdCBzZWVtcyB0byBkbyBhIHByZXR0eQotICAgICMgZ29vZCBqb2Igb2YgbWFuYWdpbmcgc3RyaW5nIGJ1ZmZlciBvcGVyYXRpb25zIHdpdGhvdXQgZXhjZXNzaXZlIGNvcGllcwotICAgIGJ1ZiA9IHBhY2soIiFpIiwgd3N6KSArIHdvdXQKLSAgICBzZWxmLl9fdHJhbnMud3JpdGUoYnVmKQotICAgIHNlbGYuX190cmFucy5mbHVzaCgpCisgICAgIyBJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UuCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1ZgogCi0gICMgSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlLgotICBAcHJvcGVydHkKLSAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX19yYnVmCi0KLSAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcHJlZml4LCByZXFsZW4pOgotICAgICMgc2VsZi5fX3JidWYgd2lsbCBhbHJlYWR5IGJlIGVtcHR5IGhlcmUgYmVjYXVzZSBmYXN0YmluYXJ5IGRvZXNuJ3QKLSAgICAjIGFzayBmb3IgYSByZWZpbGwgdW50aWwgdGhlIHByZXZpb3VzIGJ1ZmZlciBpcyBlbXB0eS4gIFRoZXJlZm9yZSwKLSAgICAjIHdlIGNhbiBzdGFydCByZWFkaW5nIG5ldyBmcmFtZXMgaW1tZWRpYXRlbHkuCi0gICAgd2hpbGUgbGVuKHByZWZpeCkgPCByZXFsZW46Ci0gICAgICBzZWxmLnJlYWRGcmFtZSgpCi0gICAgICBwcmVmaXggKz0gc2VsZi5fX3JidWYuZ2V0dmFsdWUoKQotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8ocHJlZml4KQotICAgIHJldHVybiBzZWxmLl9fcmJ1ZgorICAgIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHByZWZpeCwgcmVxbGVuKToKKyAgICAgICAgIyBzZWxmLl9fcmJ1ZiB3aWxsIGFscmVhZHkgYmUgZW1wdHkgaGVyZSBiZWNhdXNlIGZhc3RiaW5hcnkgZG9lc24ndAorICAgICAgICAjIGFzayBmb3IgYSByZWZpbGwgdW50aWwgdGhlIHByZXZpb3VzIGJ1ZmZlciBpcyBlbXB0eS4gIFRoZXJlZm9yZSwKKyAgICAgICAgIyB3ZSBjYW4gc3RhcnQgcmVhZGluZyBuZXcgZnJhbWVzIGltbWVkaWF0ZWx5LgorICAgICAgICB3aGlsZSBsZW4ocHJlZml4KSA8IHJlcWxlbjoKKyAgICAgICAgICAgIHNlbGYucmVhZEZyYW1lKCkKKyAgICAgICAgICAgIHByZWZpeCArPSBzZWxmLl9fcmJ1Zi5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8ocHJlZml4KQorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYKIAogCiBjbGFzcyBURmlsZU9iamVjdFRyYW5zcG9ydChUVHJhbnNwb3J0QmFzZSk6Ci0gICIiIldyYXBzIGEgZmlsZS1saWtlIG9iamVjdCB0byBtYWtlIGl0IHdvcmsgYXMgYSBUaHJpZnQgdHJhbnNwb3J0LiIiIgorICAgICIiIldyYXBzIGEgZmlsZS1saWtlIG9iamVjdCB0byBtYWtlIGl0IHdvcmsgYXMgYSBUaHJpZnQgdHJhbnNwb3J0LiIiIgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlb2JqKToKLSAgICBzZWxmLmZpbGVvYmogPSBmaWxlb2JqCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVvYmopOgorICAgICAgICBzZWxmLmZpbGVvYmogPSBmaWxlb2JqCiAKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICByZXR1cm4gVHJ1ZQorICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCiAKLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGVvYmouY2xvc2UoKQogCi0gIGRlZiByZWFkKHNlbGYsIHN6KToKLSAgICByZXR1cm4gc2VsZi5maWxlb2JqLnJlYWQoc3opCisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICByZXR1cm4gc2VsZi5maWxlb2JqLnJlYWQoc3opCiAKLSAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6Ci0gICAgc2VsZi5maWxlb2JqLndyaXRlKGJ1ZikKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKGJ1ZikKIAotICBkZWYgZmx1c2goc2VsZik6Ci0gICAgc2VsZi5maWxlb2JqLmZsdXNoKCkKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIHNlbGYuZmlsZW9iai5mbHVzaCgpCisKKworY2xhc3MgVFNhc2xDbGllbnRUcmFuc3BvcnQoVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydCk6CisgICAgIiIiCisgICAgU0FTTCB0cmFuc3BvcnQKKyAgICAiIiIKKworICAgIFNUQVJUID0gMQorICAgIE9LID0gMgorICAgIEJBRCA9IDMKKyAgICBFUlJPUiA9IDQKKyAgICBDT01QTEVURSA9IDUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIGhvc3QsIHNlcnZpY2UsIG1lY2hhbmlzbT0nR1NTQVBJJywKKyAgICAgICAgICAgICAgICAgKipzYXNsX2t3YXJncyk6CisgICAgICAgICIiIgorICAgICAgICB0cmFuc3BvcnQ6IGFuIHVuZGVybHlpbmcgdHJhbnNwb3J0IHRvIHVzZSwgdHlwaWNhbGx5IGp1c3QgYSBUU29ja2V0CisgICAgICAgIGhvc3Q6IHRoZSBuYW1lIG9mIHRoZSBzZXJ2ZXIsIGZyb20gYSBTQVNMIHBlcnNwZWN0aXZlCisgICAgICAgIHNlcnZpY2U6IHRoZSBuYW1lIG9mIHRoZSBzZXJ2ZXIncyBzZXJ2aWNlLCBmcm9tIGEgU0FTTCBwZXJzcGVjdGl2ZQorICAgICAgICBtZWNoYW5pc206IHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJyZWQgbWVjaGFuaXNtIHRvIHVzZQorCisgICAgICAgIEFsbCBvdGhlciBrd2FyZ3Mgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHB1cmVzYXNsLmNsaWVudC5TQVNMQ2xpZW50CisgICAgICAgIGNvbnN0cnVjdG9yLgorICAgICAgICAiIiIKKworICAgICAgICBmcm9tIHB1cmVzYXNsLmNsaWVudCBpbXBvcnQgU0FTTENsaWVudAorCisgICAgICAgIHNlbGYudHJhbnNwb3J0ID0gdHJhbnNwb3J0CisgICAgICAgIHNlbGYuc2FzbCA9IFNBU0xDbGllbnQoaG9zdCwgc2VydmljZSwgbWVjaGFuaXNtLCAqKnNhc2xfa3dhcmdzKQorCisgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKGInJykKKworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi50cmFuc3BvcnQuaXNPcGVuKCk6CisgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydC5vcGVuKCkKKworICAgICAgICBzZWxmLnNlbmRfc2FzbF9tc2coc2VsZi5TVEFSVCwgc2VsZi5zYXNsLm1lY2hhbmlzbSkKKyAgICAgICAgc2VsZi5zZW5kX3Nhc2xfbXNnKHNlbGYuT0ssIHNlbGYuc2FzbC5wcm9jZXNzKCkpCisKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHN0YXR1cywgY2hhbGxlbmdlID0gc2VsZi5yZWN2X3Nhc2xfbXNnKCkKKyAgICAgICAgICAgIGlmIHN0YXR1cyA9PSBzZWxmLk9LOgorICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9zYXNsX21zZyhzZWxmLk9LLCBzZWxmLnNhc2wucHJvY2VzcyhjaGFsbGVuZ2UpKQorICAgICAgICAgICAgZWxpZiBzdGF0dXMgPT0gc2VsZi5DT01QTEVURToKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5zYXNsLmNvbXBsZXRlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgc2VydmVyIGVycm9uZW91c2x5IGluZGljYXRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAidGhhdCBTQVNMIG5lZ290aWF0aW9uIHdhcyBjb21wbGV0ZSIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgIkJhZCBTQVNMIG5lZ290aWF0aW9uIHN0YXR1czogJWQgKCVzKSIKKyAgICAgICAgICAgICAgICAgICAgJSAoc3RhdHVzLCBjaGFsbGVuZ2UpKQorCisgICAgZGVmIHNlbmRfc2FzbF9tc2coc2VsZiwgc3RhdHVzLCBib2R5KToKKyAgICAgICAgaGVhZGVyID0gcGFjaygiPkJJIiwgc3RhdHVzLCBsZW4oYm9keSkpCisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlKGhlYWRlciArIGJvZHkpCisgICAgICAgIHNlbGYudHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGRlZiByZWN2X3Nhc2xfbXNnKHNlbGYpOgorICAgICAgICBoZWFkZXIgPSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKDUpCisgICAgICAgIHN0YXR1cywgbGVuZ3RoID0gdW5wYWNrKCI+QkkiLCBoZWFkZXIpCisgICAgICAgIGlmIGxlbmd0aCA+IDA6CisgICAgICAgICAgICBwYXlsb2FkID0gc2VsZi50cmFuc3BvcnQucmVhZEFsbChsZW5ndGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXlsb2FkID0gIiIKKyAgICAgICAgcmV0dXJuIHN0YXR1cywgcGF5bG9hZAorCisgICAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLl9fd2J1Zi53cml0ZShkYXRhKQorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBkYXRhID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQorICAgICAgICBlbmNvZGVkID0gc2VsZi5zYXNsLndyYXAoZGF0YSkKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGUoJycuam9pbigocGFjaygiIWkiLCBsZW4oZW5jb2RlZCkpLCBlbmNvZGVkKSkpCisgICAgICAgIHNlbGYudHJhbnNwb3J0LmZsdXNoKCkKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCisKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgIHJldCA9IHNlbGYuX19yYnVmLnJlYWQoc3opCisgICAgICAgIGlmIGxlbihyZXQpICE9IDA6CisgICAgICAgICAgICByZXR1cm4gcmV0CisKKyAgICAgICAgc2VsZi5fcmVhZF9mcmFtZSgpCisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorCisgICAgZGVmIF9yZWFkX2ZyYW1lKHNlbGYpOgorICAgICAgICBoZWFkZXIgPSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKDQpCisgICAgICAgIGxlbmd0aCwgPSB1bnBhY2soJyFpJywgaGVhZGVyKQorICAgICAgICBlbmNvZGVkID0gc2VsZi50cmFuc3BvcnQucmVhZEFsbChsZW5ndGgpCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8oc2VsZi5zYXNsLnVud3JhcChlbmNvZGVkKSkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5zYXNsLmRpc3Bvc2UoKQorICAgICAgICBzZWxmLnRyYW5zcG9ydC5jbG9zZSgpCisKKyAgICAjIGJhc2VkIG9uIFRGcmFtZWRUcmFuc3BvcnQKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmCisKKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwcmVmaXgsIHJlcWxlbik6CisgICAgICAgICMgc2VsZi5fX3JidWYgd2lsbCBhbHJlYWR5IGJlIGVtcHR5IGhlcmUgYmVjYXVzZSBmYXN0YmluYXJ5IGRvZXNuJ3QKKyAgICAgICAgIyBhc2sgZm9yIGEgcmVmaWxsIHVudGlsIHRoZSBwcmV2aW91cyBidWZmZXIgaXMgZW1wdHkuICBUaGVyZWZvcmUsCisgICAgICAgICMgd2UgY2FuIHN0YXJ0IHJlYWRpbmcgbmV3IGZyYW1lcyBpbW1lZGlhdGVseS4KKyAgICAgICAgd2hpbGUgbGVuKHByZWZpeCkgPCByZXFsZW46CisgICAgICAgICAgICBzZWxmLl9yZWFkX2ZyYW1lKCkKKyAgICAgICAgICAgIHByZWZpeCArPSBzZWxmLl9fcmJ1Zi5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8ocHJlZml4KQorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUd2lzdGVkLnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFR3aXN0ZWQucHkKaW5kZXggYjZkY2I0ZS4uYTI3ZjBhZCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFR3aXN0ZWQucHkKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFR3aXN0ZWQucHkKQEAgLTE2LDMwICsxNiwzMyBAQAogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwotZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgaW1wbGVtZW50cywgSW50ZXJmYWNlLCBBdHRyaWJ1dGUKLWZyb20gdHdpc3RlZC5pbnRlcm5ldC5wcm90b2NvbCBpbXBvcnQgUHJvdG9jb2wsIFNlcnZlckZhY3RvcnksIENsaWVudEZhY3RvcnksIFwKKworZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTworaW1wb3J0IHN0cnVjdAorCitmcm9tIHpvcGUuaW50ZXJmYWNlIGltcG9ydCBpbXBsZW1lbnRlciwgSW50ZXJmYWNlLCBBdHRyaWJ1dGUKK2Zyb20gdHdpc3RlZC5pbnRlcm5ldC5wcm90b2NvbCBpbXBvcnQgU2VydmVyRmFjdG9yeSwgQ2xpZW50RmFjdG9yeSwgXAogICAgIGNvbm5lY3Rpb25Eb25lCiBmcm9tIHR3aXN0ZWQuaW50ZXJuZXQgaW1wb3J0IGRlZmVyCitmcm9tIHR3aXN0ZWQuaW50ZXJuZXQudGhyZWFkcyBpbXBvcnQgZGVmZXJUb1RocmVhZAogZnJvbSB0d2lzdGVkLnByb3RvY29scyBpbXBvcnQgYmFzaWMKLWZyb20gdHdpc3RlZC5weXRob24gaW1wb3J0IGxvZwogZnJvbSB0d2lzdGVkLndlYiBpbXBvcnQgc2VydmVyLCByZXNvdXJjZSwgaHR0cAogCiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKLWZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogCiAKIGNsYXNzIFRNZXNzYWdlU2VuZGVyVHJhbnNwb3J0KFRUcmFuc3BvcnQuVFRyYW5zcG9ydEJhc2UpOgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5fX3didWYgPSBCeXRlc0lPKCkKIAogICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgogICAgICAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCiAKICAgICBkZWYgZmx1c2goc2VsZik6CiAgICAgICAgIG1zZyA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKLSAgICAgICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCi0gICAgICAgIHNlbGYuc2VuZE1lc3NhZ2UobXNnKQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ5dGVzSU8oKQorICAgICAgICByZXR1cm4gc2VsZi5zZW5kTWVzc2FnZShtc2cpCiAKICAgICBkZWYgc2VuZE1lc3NhZ2Uoc2VsZiwgbWVzc2FnZSk6CiAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKQEAgLTUyLDcgKzU1LDcgQEAKICAgICAgICAgc2VsZi5mdW5jID0gZnVuYwogCiAgICAgZGVmIHNlbmRNZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgotICAgICAgICBzZWxmLmZ1bmMobWVzc2FnZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuZnVuYyhtZXNzYWdlKQogCiAKIGNsYXNzIFRocmlmdENsaWVudFByb3RvY29sKGJhc2ljLkludDMyU3RyaW5nUmVjZWl2ZXIpOgpAQCAtNzksMTEgKzgyLDE4IEBACiAgICAgICAgIHNlbGYuc3RhcnRlZC5jYWxsYmFjayhzZWxmLmNsaWVudCkKIAogICAgIGRlZiBjb25uZWN0aW9uTG9zdChzZWxmLCByZWFzb249Y29ubmVjdGlvbkRvbmUpOgotICAgICAgICBmb3Igayx2IGluIHNlbGYuY2xpZW50Ll9yZXFzLml0ZXJpdGVtcygpOgorICAgICAgICAjIHRoZSBjYWxsZWQgZXJyYmFja3MgY2FuIGFkZCBpdGVtcyB0byBvdXIgY2xpZW50J3MgX3JlcXMsCisgICAgICAgICMgc28gd2UgbmVlZCB0byB1c2UgYSB0bXAsIGFuZCBpdGVyYXRlIHVudGlsIG5vIG1vcmUgcmVxdWVzdHMKKyAgICAgICAgIyBhcmUgYWRkZWQgZHVyaW5nIGVycmJhY2tzCisgICAgICAgIGlmIHNlbGYuY2xpZW50OgogICAgICAgICAgICAgdGV4ID0gVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uKAogICAgICAgICAgICAgICAgIHR5cGU9VFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLAotICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0Nvbm5lY3Rpb24gY2xvc2VkJykKLSAgICAgICAgICAgIHYuZXJyYmFjayh0ZXgpCisgICAgICAgICAgICAgICAgbWVzc2FnZT0nQ29ubmVjdGlvbiBjbG9zZWQgKCVzKScgJSByZWFzb24pCisgICAgICAgICAgICB3aGlsZSBzZWxmLmNsaWVudC5fcmVxczoKKyAgICAgICAgICAgICAgICBfLCB2ID0gc2VsZi5jbGllbnQuX3JlcXMucG9waXRlbSgpCisgICAgICAgICAgICAgICAgdi5lcnJiYWNrKHRleCkKKyAgICAgICAgICAgIGRlbCBzZWxmLmNsaWVudC5fcmVxcworICAgICAgICAgICAgc2VsZi5jbGllbnQgPSBOb25lCiAKICAgICBkZWYgc3RyaW5nUmVjZWl2ZWQoc2VsZiwgZnJhbWUpOgogICAgICAgICB0ciA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihmcmFtZSkKQEAgLTk5LDYgKzEwOSwxMDggQEAKICAgICAgICAgbWV0aG9kKGlwcm90LCBtdHlwZSwgcnNlcWlkKQogCiAKK2NsYXNzIFRocmlmdFNBU0xDbGllbnRQcm90b2NvbChUaHJpZnRDbGllbnRQcm90b2NvbCk6CisKKyAgICBTVEFSVCA9IDEKKyAgICBPSyA9IDIKKyAgICBCQUQgPSAzCisgICAgRVJST1IgPSA0CisgICAgQ09NUExFVEUgPSA1CisKKyAgICBNQVhfTEVOR1RIID0gMiAqKiAzMSAtIDEKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjbGllbnRfY2xhc3MsIGlwcm90X2ZhY3RvcnksIG9wcm90X2ZhY3Rvcnk9Tm9uZSwKKyAgICAgICAgICAgICAgICAgaG9zdD1Ob25lLCBzZXJ2aWNlPU5vbmUsIG1lY2hhbmlzbT0nR1NTQVBJJywgKipzYXNsX2t3YXJncyk6CisgICAgICAgICIiIgorICAgICAgICBob3N0OiB0aGUgbmFtZSBvZiB0aGUgc2VydmVyLCBmcm9tIGEgU0FTTCBwZXJzcGVjdGl2ZQorICAgICAgICBzZXJ2aWNlOiB0aGUgbmFtZSBvZiB0aGUgc2VydmVyJ3Mgc2VydmljZSwgZnJvbSBhIFNBU0wgcGVyc3BlY3RpdmUKKyAgICAgICAgbWVjaGFuaXNtOiB0aGUgbmFtZSBvZiB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSB0byB1c2UKKworICAgICAgICBBbGwgb3RoZXIga3dhcmdzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBwdXJlc2FzbC5jbGllbnQuU0FTTENsaWVudAorICAgICAgICBjb25zdHJ1Y3Rvci4KKyAgICAgICAgIiIiCisKKyAgICAgICAgZnJvbSBwdXJlc2FzbC5jbGllbnQgaW1wb3J0IFNBU0xDbGllbnQKKyAgICAgICAgc2VsZi5TQVNMQ0xpZW50ID0gU0FTTENsaWVudAorCisgICAgICAgIFRocmlmdENsaWVudFByb3RvY29sLl9faW5pdF9fKHNlbGYsIGNsaWVudF9jbGFzcywgaXByb3RfZmFjdG9yeSwgb3Byb3RfZmFjdG9yeSkKKworICAgICAgICBzZWxmLl9zYXNsX25lZ290aWF0aW9uX2RlZmVycmVkID0gTm9uZQorICAgICAgICBzZWxmLl9zYXNsX25lZ290aWF0aW9uX3N0YXR1cyA9IE5vbmUKKyAgICAgICAgc2VsZi5jbGllbnQgPSBOb25lCisKKyAgICAgICAgaWYgaG9zdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY3JlYXRlU0FTTENsaWVudChob3N0LCBzZXJ2aWNlLCBtZWNoYW5pc20sICoqc2FzbF9rd2FyZ3MpCisKKyAgICBkZWYgY3JlYXRlU0FTTENsaWVudChzZWxmLCBob3N0LCBzZXJ2aWNlLCBtZWNoYW5pc20sICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5zYXNsID0gc2VsZi5TQVNMQ2xpZW50KGhvc3QsIHNlcnZpY2UsIG1lY2hhbmlzbSwgKiprd2FyZ3MpCisKKyAgICBkZWYgZGlzcGF0Y2goc2VsZiwgbXNnKToKKyAgICAgICAgZW5jb2RlZCA9IHNlbGYuc2FzbC53cmFwKG1zZykKKyAgICAgICAgbGVuX2FuZF9lbmNvZGVkID0gJycuam9pbigoc3RydWN0LnBhY2soJyFpJywgbGVuKGVuY29kZWQpKSwgZW5jb2RlZCkpCisgICAgICAgIFRocmlmdENsaWVudFByb3RvY29sLmRpc3BhdGNoKHNlbGYsIGxlbl9hbmRfZW5jb2RlZCkKKworICAgIEBkZWZlci5pbmxpbmVDYWxsYmFja3MKKyAgICBkZWYgY29ubmVjdGlvbk1hZGUoc2VsZik6CisgICAgICAgIHNlbGYuX3NlbmRTQVNMTWVzc2FnZShzZWxmLlNUQVJULCBzZWxmLnNhc2wubWVjaGFuaXNtKQorICAgICAgICBpbml0aWFsX21lc3NhZ2UgPSB5aWVsZCBkZWZlclRvVGhyZWFkKHNlbGYuc2FzbC5wcm9jZXNzKQorICAgICAgICBzZWxmLl9zZW5kU0FTTE1lc3NhZ2Uoc2VsZi5PSywgaW5pdGlhbF9tZXNzYWdlKQorCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBzdGF0dXMsIGNoYWxsZW5nZSA9IHlpZWxkIHNlbGYuX3JlY2VpdmVTQVNMTWVzc2FnZSgpCisgICAgICAgICAgICBpZiBzdGF0dXMgPT0gc2VsZi5PSzoKKyAgICAgICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIGRlZmVyVG9UaHJlYWQoc2VsZi5zYXNsLnByb2Nlc3MsIGNoYWxsZW5nZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9zZW5kU0FTTE1lc3NhZ2Uoc2VsZi5PSywgcmVzcG9uc2UpCisgICAgICAgICAgICBlbGlmIHN0YXR1cyA9PSBzZWxmLkNPTVBMRVRFOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnNhc2wuY29tcGxldGU6CisgICAgICAgICAgICAgICAgICAgIG1zZyA9ICJUaGUgc2VydmVyIGVycm9uZW91c2x5IGluZGljYXRlZCB0aGF0IFNBU0wgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWdvdGlhdGlvbiB3YXMgY29tcGxldGUiCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbihtc2csIG1lc3NhZ2U9bXNnKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1zZyA9ICJCYWQgU0FTTCBuZWdvdGlhdGlvbiBzdGF0dXM6ICVkICglcykiICUgKHN0YXR1cywgY2hhbGxlbmdlKQorICAgICAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbihtc2csIG1lc3NhZ2U9bXNnKQorCisgICAgICAgIHNlbGYuX3Nhc2xfbmVnb3RpYXRpb25fZGVmZXJyZWQgPSBOb25lCisgICAgICAgIFRocmlmdENsaWVudFByb3RvY29sLmNvbm5lY3Rpb25NYWRlKHNlbGYpCisKKyAgICBkZWYgX3NlbmRTQVNMTWVzc2FnZShzZWxmLCBzdGF0dXMsIGJvZHkpOgorICAgICAgICBpZiBib2R5IGlzIE5vbmU6CisgICAgICAgICAgICBib2R5ID0gIiIKKyAgICAgICAgaGVhZGVyID0gc3RydWN0LnBhY2soIj5CSSIsIHN0YXR1cywgbGVuKGJvZHkpKQorICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZShoZWFkZXIgKyBib2R5KQorCisgICAgZGVmIF9yZWNlaXZlU0FTTE1lc3NhZ2Uoc2VsZik6CisgICAgICAgIHNlbGYuX3Nhc2xfbmVnb3RpYXRpb25fZGVmZXJyZWQgPSBkZWZlci5EZWZlcnJlZCgpCisgICAgICAgIHNlbGYuX3Nhc2xfbmVnb3RpYXRpb25fc3RhdHVzID0gTm9uZQorICAgICAgICByZXR1cm4gc2VsZi5fc2FzbF9uZWdvdGlhdGlvbl9kZWZlcnJlZAorCisgICAgZGVmIGNvbm5lY3Rpb25Mb3N0KHNlbGYsIHJlYXNvbj1jb25uZWN0aW9uRG9uZSk6CisgICAgICAgIGlmIHNlbGYuY2xpZW50OgorICAgICAgICAgICAgVGhyaWZ0Q2xpZW50UHJvdG9jb2wuY29ubmVjdGlvbkxvc3Qoc2VsZiwgcmVhc29uKQorCisgICAgZGVmIGRhdGFSZWNlaXZlZChzZWxmLCBkYXRhKToKKyAgICAgICAgaWYgc2VsZi5fc2FzbF9uZWdvdGlhdGlvbl9kZWZlcnJlZDoKKyAgICAgICAgICAgICMgd2UgZ290IGEgc2FzbCBjaGFsbGVuZ2UgaW4gdGhlIGZvcm1hdCAoc3RhdHVzLCBsZW5ndGgsIGNoYWxsZW5nZSkKKyAgICAgICAgICAgICMgc2F2ZSB0aGUgc3RhdHVzLCBsZXQgSW50TlN0cmluZ1JlY2VpdmVyIHBpZWNlIHRoZSBjaGFsbGVuZ2UgZGF0YSB0b2dldGhlcgorICAgICAgICAgICAgc2VsZi5fc2FzbF9uZWdvdGlhdGlvbl9zdGF0dXMsID0gc3RydWN0LnVucGFjaygiQiIsIGRhdGFbMF0pCisgICAgICAgICAgICBUaHJpZnRDbGllbnRQcm90b2NvbC5kYXRhUmVjZWl2ZWQoc2VsZiwgZGF0YVsxOl0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIG5vcm1hbCBmcmFtZSwgbGV0IEludE5TdHJpbmdSZWNlaXZlciBwaWVjZSBpdCB0b2dldGhlcgorICAgICAgICAgICAgVGhyaWZ0Q2xpZW50UHJvdG9jb2wuZGF0YVJlY2VpdmVkKHNlbGYsIGRhdGEpCisKKyAgICBkZWYgc3RyaW5nUmVjZWl2ZWQoc2VsZiwgZnJhbWUpOgorICAgICAgICBpZiBzZWxmLl9zYXNsX25lZ290aWF0aW9uX2RlZmVycmVkOgorICAgICAgICAgICAgIyB0aGUgZnJhbWUgaXMganVzdCBhIFNBU0wgY2hhbGxlbmdlCisgICAgICAgICAgICByZXNwb25zZSA9IChzZWxmLl9zYXNsX25lZ290aWF0aW9uX3N0YXR1cywgZnJhbWUpCisgICAgICAgICAgICBzZWxmLl9zYXNsX25lZ290aWF0aW9uX2RlZmVycmVkLmNhbGxiYWNrKHJlc3BvbnNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyB0aGVyZSdzIGEgc2Vjb25kIDQgYnl0ZSBsZW5ndGggcHJlZml4IGluc2lkZSB0aGUgZnJhbWUKKyAgICAgICAgICAgIGRlY29kZWRfZnJhbWUgPSBzZWxmLnNhc2wudW53cmFwKGZyYW1lWzQ6XSkKKyAgICAgICAgICAgIFRocmlmdENsaWVudFByb3RvY29sLnN0cmluZ1JlY2VpdmVkKHNlbGYsIGRlY29kZWRfZnJhbWUpCisKKwogY2xhc3MgVGhyaWZ0U2VydmVyUHJvdG9jb2woYmFzaWMuSW50MzJTdHJpbmdSZWNlaXZlcik6CiAKICAgICBNQVhfTEVOR1RIID0gMiAqKiAzMSAtIDEKQEAgLTEyNCw3ICsyMzYsNyBAQAogCiAgICAgICAgIGQgPSBzZWxmLmZhY3RvcnkucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQogICAgICAgICBkLmFkZENhbGxiYWNrcyhzZWxmLnByb2Nlc3NPaywgc2VsZi5wcm9jZXNzRXJyb3IsCi0gICAgICAgICAgICBjYWxsYmFja0FyZ3M9KHRtbywpKQorICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0FyZ3M9KHRtbywpKQogCiAKIGNsYXNzIElUaHJpZnRTZXJ2ZXJGYWN0b3J5KEludGVyZmFjZSk6CkBAIC0xNDUsMTAgKzI1Nyw5IEBACiAgICAgb3Byb3RfZmFjdG9yeSA9IEF0dHJpYnV0ZSgiT3V0cHV0IHByb3RvY29sIGZhY3RvcnkiKQogCiAKK0BpbXBsZW1lbnRlcihJVGhyaWZ0U2VydmVyRmFjdG9yeSkKIGNsYXNzIFRocmlmdFNlcnZlckZhY3RvcnkoU2VydmVyRmFjdG9yeSk6CiAKLSAgICBpbXBsZW1lbnRzKElUaHJpZnRTZXJ2ZXJGYWN0b3J5KQotCiAgICAgcHJvdG9jb2wgPSBUaHJpZnRTZXJ2ZXJQcm90b2NvbAogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgaXByb3RfZmFjdG9yeSwgb3Byb3RfZmFjdG9yeT1Ob25lKToKQEAgLTE2MCwxMCArMjcxLDkgQEAKICAgICAgICAgICAgIHNlbGYub3Byb3RfZmFjdG9yeSA9IG9wcm90X2ZhY3RvcnkKIAogCitAaW1wbGVtZW50ZXIoSVRocmlmdENsaWVudEZhY3RvcnkpCiBjbGFzcyBUaHJpZnRDbGllbnRGYWN0b3J5KENsaWVudEZhY3RvcnkpOgogCi0gICAgaW1wbGVtZW50cyhJVGhyaWZ0Q2xpZW50RmFjdG9yeSkKLQogICAgIHByb3RvY29sID0gVGhyaWZ0Q2xpZW50UHJvdG9jb2wKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjbGllbnRfY2xhc3MsIGlwcm90X2ZhY3RvcnksIG9wcm90X2ZhY3Rvcnk9Tm9uZSk6CkBAIC0xNzYsNyArMjg2LDcgQEAKIAogICAgIGRlZiBidWlsZFByb3RvY29sKHNlbGYsIGFkZHIpOgogICAgICAgICBwID0gc2VsZi5wcm90b2NvbChzZWxmLmNsaWVudF9jbGFzcywgc2VsZi5pcHJvdF9mYWN0b3J5LAotICAgICAgICAgICAgc2VsZi5vcHJvdF9mYWN0b3J5KQorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wcm90X2ZhY3RvcnkpCiAgICAgICAgIHAuZmFjdG9yeSA9IHNlbGYKICAgICAgICAgcmV0dXJuIHAKIApAQCAtMTg2LDcgKzI5Niw3IEBACiAgICAgYWxsb3dlZE1ldGhvZHMgPSAoJ1BPU1QnLCkKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9jZXNzb3IsIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3Rvcnk9Tm9uZSk6CisgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeT1Ob25lKToKICAgICAgICAgcmVzb3VyY2UuUmVzb3VyY2UuX19pbml0X18oc2VsZikKICAgICAgICAgc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5CiAgICAgICAgIGlmIG91dHB1dFByb3RvY29sRmFjdG9yeSBpcyBOb25lOgpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5weQppbmRleCA3ODRkNGUxLi5lODQ4NTc5IDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5weQorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5weQpAQCAtMTYsMjQ2ICsxNiwyMzMgQEAKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKLScnJwotVFpsaWJUcmFuc3BvcnQgcHJvdmlkZXMgYSBjb21wcmVzc2VkIHRyYW5zcG9ydCBhbmQgdHJhbnNwb3J0IGZhY3RvcnkKKworIiIiVFpsaWJUcmFuc3BvcnQgcHJvdmlkZXMgYSBjb21wcmVzc2VkIHRyYW5zcG9ydCBhbmQgdHJhbnNwb3J0IGZhY3RvcnkKIGNsYXNzLCB1c2luZyB0aGUgcHl0aG9uIHN0YW5kYXJkIGxpYnJhcnkgemxpYiBtb2R1bGUgdG8gaW1wbGVtZW50CiBkYXRhIGNvbXByZXNzaW9uLgotJycnCisiIiIKIAogZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgogaW1wb3J0IHpsaWIKLWZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwotZnJvbSBUVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0Citmcm9tIC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0Citmcm9tIC4uY29tcGF0IGltcG9ydCBCdWZmZXJJTworCiAKIGNsYXNzIFRabGliVHJhbnNwb3J0RmFjdG9yeShvYmplY3QpOgotICAnJycKLSAgRmFjdG9yeSB0cmFuc3BvcnQgdGhhdCBidWlsZHMgemxpYiBjb21wcmVzc2VkIHRyYW5zcG9ydHMuCi0gIAotICBUaGlzIGZhY3RvcnkgY2FjaGVzIHRoZSBsYXN0IHNpbmdsZSBjbGllbnQvdHJhbnNwb3J0IHRoYXQgaXQgd2FzIHBhc3NlZAotICBhbmQgcmV0dXJucyB0aGUgc2FtZSBUWmxpYlRyYW5zcG9ydCBvYmplY3QgdGhhdCB3YXMgY3JlYXRlZC4KLSAgCi0gIFRoaXMgY2FjaGluZyBtZWFucyB0aGUgVFNlcnZlciBjbGFzcyB3aWxsIGdldCB0aGUgX3NhbWVfIHRyYW5zcG9ydAotICBvYmplY3QgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCB0cmFuc3BvcnRzIGZyb20gdGhpcyBmYWN0b3J5LgotICAoRm9yIG5vbi10aHJlYWRlZCBzY2VuYXJpb3Mgb25seSwgc2luY2UgdGhlIGNhY2hlIG9ubHkgaG9sZHMgb25lIG9iamVjdCkKLSAgCi0gIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2FjaGluZyBpcyB0byBhbGxvY2F0ZSBvbmx5IG9uZSBUWmxpYlRyYW5zcG9ydCB3aGVyZQotICBvbmx5IG9uZSBpcyByZWFsbHkgbmVlZGVkIChzaW5jZSBpdCBtdXN0IGhhdmUgc2VwYXJhdGUgcmVhZC93cml0ZSBidWZmZXJzKSwKLSAgYW5kIG1ha2VzIHRoZSBzdGF0aXN0aWNzIGZyb20gZ2V0Q29tcFNhdmluZ3MoKSBhbmQgZ2V0Q29tcFJhdGlvKCkKLSAgZWFzaWVyIHRvIHVuZGVyc3RhbmQuCi0gICcnJworICAgICIiIkZhY3RvcnkgdHJhbnNwb3J0IHRoYXQgYnVpbGRzIHpsaWIgY29tcHJlc3NlZCB0cmFuc3BvcnRzLgogCi0gICMgY2xhc3Mgc2NvcGVkIGNhY2hlIG9mIGxhc3QgdHJhbnNwb3J0IGdpdmVuIGFuZCB6bGlidHJhbnNwb3J0IHJldHVybmVkCi0gIF9sYXN0X3RyYW5zID0gTm9uZQotICBfbGFzdF96ID0gTm9uZQorICAgIFRoaXMgZmFjdG9yeSBjYWNoZXMgdGhlIGxhc3Qgc2luZ2xlIGNsaWVudC90cmFuc3BvcnQgdGhhdCBpdCB3YXMgcGFzc2VkCisgICAgYW5kIHJldHVybnMgdGhlIHNhbWUgVFpsaWJUcmFuc3BvcnQgb2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuCiAKLSAgZGVmIGdldFRyYW5zcG9ydChzZWxmLCB0cmFucywgY29tcHJlc3NsZXZlbD05KToKLSAgICAnJydXcmFwIGEgdHJhbnNwb3J0ICwgdHJhbnMsIHdpdGggdGhlIFRabGliVHJhbnNwb3J0Ci0gICAgY29tcHJlc3NlZCB0cmFuc3BvcnQgY2xhc3MsIHJldHVybmluZyBhIG5ldwotICAgIHRyYW5zcG9ydCB0byB0aGUgY2FsbGVyLgotICAgIAotICAgIEBwYXJhbSBjb21wcmVzc2xldmVsOiBUaGUgemxpYiBjb21wcmVzc2lvbiBsZXZlbCwgcmFuZ2luZwotICAgIGZyb20gMCAobm8gY29tcHJlc3Npb24pIHRvIDkgKGJlc3QgY29tcHJlc3Npb24pLiAgRGVmYXVsdHMgdG8gOS4KLSAgICBAdHlwZSBjb21wcmVzc2xldmVsOiBpbnQKLSAgICAKLSAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgVFpsaWJUcmFuc3BvcnQgd2hpY2ggd3JhcHMgdGhlCi0gICAgcGFzc2VkIEN7dHJhbnN9IFRUcmFuc3BvcnQgZGVyaXZlZCBpbnN0YW5jZS4KLSAgICAnJycKLSAgICBpZiB0cmFucyA9PSBzZWxmLl9sYXN0X3RyYW5zOgotICAgICAgcmV0dXJuIHNlbGYuX2xhc3RfegotICAgIHp0cmFucyA9IFRabGliVHJhbnNwb3J0KHRyYW5zLCBjb21wcmVzc2xldmVsKQotICAgIHNlbGYuX2xhc3RfdHJhbnMgPSB0cmFucwotICAgIHNlbGYuX2xhc3RfeiA9IHp0cmFucwotICAgIHJldHVybiB6dHJhbnMKKyAgICBUaGlzIGNhY2hpbmcgbWVhbnMgdGhlIFRTZXJ2ZXIgY2xhc3Mgd2lsbCBnZXQgdGhlIF9zYW1lXyB0cmFuc3BvcnQKKyAgICBvYmplY3QgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCB0cmFuc3BvcnRzIGZyb20gdGhpcyBmYWN0b3J5LgorICAgIChGb3Igbm9uLXRocmVhZGVkIHNjZW5hcmlvcyBvbmx5LCBzaW5jZSB0aGUgY2FjaGUgb25seSBob2xkcyBvbmUgb2JqZWN0KQorCisgICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBjYWNoaW5nIGlzIHRvIGFsbG9jYXRlIG9ubHkgb25lIFRabGliVHJhbnNwb3J0IHdoZXJlCisgICAgb25seSBvbmUgaXMgcmVhbGx5IG5lZWRlZCAoc2luY2UgaXQgbXVzdCBoYXZlIHNlcGFyYXRlIHJlYWQvd3JpdGUgYnVmZmVycyksCisgICAgYW5kIG1ha2VzIHRoZSBzdGF0aXN0aWNzIGZyb20gZ2V0Q29tcFNhdmluZ3MoKSBhbmQgZ2V0Q29tcFJhdGlvKCkKKyAgICBlYXNpZXIgdG8gdW5kZXJzdGFuZC4KKyAgICAiIiIKKyAgICAjIGNsYXNzIHNjb3BlZCBjYWNoZSBvZiBsYXN0IHRyYW5zcG9ydCBnaXZlbiBhbmQgemxpYnRyYW5zcG9ydCByZXR1cm5lZAorICAgIF9sYXN0X3RyYW5zID0gTm9uZQorICAgIF9sYXN0X3ogPSBOb25lCisKKyAgICBkZWYgZ2V0VHJhbnNwb3J0KHNlbGYsIHRyYW5zLCBjb21wcmVzc2xldmVsPTkpOgorICAgICAgICAiIiJXcmFwIGEgdHJhbnNwb3J0LCB0cmFucywgd2l0aCB0aGUgVFpsaWJUcmFuc3BvcnQKKyAgICAgICAgY29tcHJlc3NlZCB0cmFuc3BvcnQgY2xhc3MsIHJldHVybmluZyBhIG5ldworICAgICAgICB0cmFuc3BvcnQgdG8gdGhlIGNhbGxlci4KKworICAgICAgICBAcGFyYW0gY29tcHJlc3NsZXZlbDogVGhlIHpsaWIgY29tcHJlc3Npb24gbGV2ZWwsIHJhbmdpbmcKKyAgICAgICAgZnJvbSAwIChubyBjb21wcmVzc2lvbikgdG8gOSAoYmVzdCBjb21wcmVzc2lvbikuICBEZWZhdWx0cyB0byA5LgorICAgICAgICBAdHlwZSBjb21wcmVzc2xldmVsOiBpbnQKKworICAgICAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgVFpsaWJUcmFuc3BvcnQgd2hpY2ggd3JhcHMgdGhlCisgICAgICAgIHBhc3NlZCBDe3RyYW5zfSBUVHJhbnNwb3J0IGRlcml2ZWQgaW5zdGFuY2UuCisgICAgICAgICIiIgorICAgICAgICBpZiB0cmFucyA9PSBzZWxmLl9sYXN0X3RyYW5zOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2xhc3RfegorICAgICAgICB6dHJhbnMgPSBUWmxpYlRyYW5zcG9ydCh0cmFucywgY29tcHJlc3NsZXZlbCkKKyAgICAgICAgc2VsZi5fbGFzdF90cmFucyA9IHRyYW5zCisgICAgICAgIHNlbGYuX2xhc3RfeiA9IHp0cmFucworICAgICAgICByZXR1cm4genRyYW5zCiAKIAogY2xhc3MgVFpsaWJUcmFuc3BvcnQoVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydCk6Ci0gICcnJwotICBDbGFzcyB0aGF0IHdyYXBzIGEgdHJhbnNwb3J0IHdpdGggemxpYiwgY29tcHJlc3Npbmcgd3JpdGVzCi0gIGFuZCBkZWNvbXByZXNzZXMgcmVhZHMsIHVzaW5nIHRoZSBweXRob24gc3RhbmRhcmQKLSAgbGlicmFyeSB6bGliIG1vZHVsZS4KLSAgJycnCisgICAgIiIiQ2xhc3MgdGhhdCB3cmFwcyBhIHRyYW5zcG9ydCB3aXRoIHpsaWIsIGNvbXByZXNzaW5nIHdyaXRlcworICAgIGFuZCBkZWNvbXByZXNzZXMgcmVhZHMsIHVzaW5nIHRoZSBweXRob24gc3RhbmRhcmQKKyAgICBsaWJyYXJ5IHpsaWIgbW9kdWxlLgorICAgICIiIgorICAgICMgUmVhZCBidWZmZXIgc2l6ZSBmb3IgdGhlIHB5dGhvbiBmYXN0YmluYXJ5IEMgZXh0ZW5zaW9uLAorICAgICMgdGhlIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGNsYXNzLgorICAgIERFRkFVTFRfQlVGRlNJWkUgPSA0MDk2CiAKLSAgIyBSZWFkIGJ1ZmZlciBzaXplIGZvciB0aGUgcHl0aG9uIGZhc3RiaW5hcnkgQyBleHRlbnNpb24sCi0gICMgdGhlIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGNsYXNzLgotICBERUZBVUxUX0JVRkZTSVpFID0gNDA5NgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucywgY29tcHJlc3NsZXZlbD05KToKKyAgICAgICAgIiIiQ3JlYXRlIGEgbmV3IFRabGliVHJhbnNwb3J0LCB3cmFwcGluZyBDe3RyYW5zfSwgYW5vdGhlcgorICAgICAgICBUVHJhbnNwb3J0IGRlcml2ZWQgb2JqZWN0LgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucywgY29tcHJlc3NsZXZlbD05KToKLSAgICAnJycKLSAgICBDcmVhdGUgYSBuZXcgVFpsaWJUcmFuc3BvcnQsIHdyYXBwaW5nIEN7dHJhbnN9LCBhbm90aGVyCi0gICAgVFRyYW5zcG9ydCBkZXJpdmVkIG9iamVjdC4KLSAgICAKLSAgICBAcGFyYW0gdHJhbnM6IEEgdGhyaWZ0IHRyYW5zcG9ydCBvYmplY3QsIGkuZS4gYSBUU29ja2V0KCkgb2JqZWN0LgotICAgIEB0eXBlIHRyYW5zOiBUVHJhbnNwb3J0Ci0gICAgQHBhcmFtIGNvbXByZXNzbGV2ZWw6IFRoZSB6bGliIGNvbXByZXNzaW9uIGxldmVsLCByYW5naW5nCi0gICAgZnJvbSAwIChubyBjb21wcmVzc2lvbikgdG8gOSAoYmVzdCBjb21wcmVzc2lvbikuICBEZWZhdWx0IGlzIDkuCi0gICAgQHR5cGUgY29tcHJlc3NsZXZlbDogaW50Ci0gICAgJycnCi0gICAgc2VsZi5fX3RyYW5zID0gdHJhbnMKLSAgICBzZWxmLmNvbXByZXNzbGV2ZWwgPSBjb21wcmVzc2xldmVsCi0gICAgc2VsZi5fX3JidWYgPSBTdHJpbmdJTygpCi0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCi0gICAgc2VsZi5faW5pdF96bGliKCkKLSAgICBzZWxmLl9pbml0X3N0YXRzKCkKKyAgICAgICAgQHBhcmFtIHRyYW5zOiBBIHRocmlmdCB0cmFuc3BvcnQgb2JqZWN0LCBpLmUuIGEgVFNvY2tldCgpIG9iamVjdC4KKyAgICAgICAgQHR5cGUgdHJhbnM6IFRUcmFuc3BvcnQKKyAgICAgICAgQHBhcmFtIGNvbXByZXNzbGV2ZWw6IFRoZSB6bGliIGNvbXByZXNzaW9uIGxldmVsLCByYW5naW5nCisgICAgICAgIGZyb20gMCAobm8gY29tcHJlc3Npb24pIHRvIDkgKGJlc3QgY29tcHJlc3Npb24pLiAgRGVmYXVsdCBpcyA5LgorICAgICAgICBAdHlwZSBjb21wcmVzc2xldmVsOiBpbnQKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX190cmFucyA9IHRyYW5zCisgICAgICAgIHNlbGYuY29tcHJlc3NsZXZlbCA9IGNvbXByZXNzbGV2ZWwKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTygpCisgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQorICAgICAgICBzZWxmLl9pbml0X3psaWIoKQorICAgICAgICBzZWxmLl9pbml0X3N0YXRzKCkKIAotICBkZWYgX3JlaW5pdF9idWZmZXJzKHNlbGYpOgotICAgICcnJwotICAgIEludGVybmFsIG1ldGhvZCB0byBpbml0aWFsaXplL3Jlc2V0IHRoZSBpbnRlcm5hbCBTdHJpbmdJTyBvYmplY3RzCi0gICAgZm9yIHJlYWQgYW5kIHdyaXRlIGJ1ZmZlcnMuCi0gICAgJycnCi0gICAgc2VsZi5fX3JidWYgPSBTdHJpbmdJTygpCi0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCisgICAgZGVmIF9yZWluaXRfYnVmZmVycyhzZWxmKToKKyAgICAgICAgIiIiSW50ZXJuYWwgbWV0aG9kIHRvIGluaXRpYWxpemUvcmVzZXQgdGhlIGludGVybmFsIFN0cmluZ0lPIG9iamVjdHMKKyAgICAgICAgZm9yIHJlYWQgYW5kIHdyaXRlIGJ1ZmZlcnMuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKCkKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCiAKLSAgZGVmIF9pbml0X3N0YXRzKHNlbGYpOgotICAgICcnJwotICAgIEludGVybmFsIG1ldGhvZCB0byByZXNldCB0aGUgaW50ZXJuYWwgc3RhdGlzdGljcyBjb3VudGVycwotICAgIGZvciBjb21wcmVzc2lvbiByYXRpb3MgYW5kIGJhbmR3aWR0aCBzYXZpbmdzLgotICAgICcnJwotICAgIHNlbGYuYnl0ZXNfaW4gPSAwCi0gICAgc2VsZi5ieXRlc19vdXQgPSAwCi0gICAgc2VsZi5ieXRlc19pbl9jb21wID0gMAotICAgIHNlbGYuYnl0ZXNfb3V0X2NvbXAgPSAwCisgICAgZGVmIF9pbml0X3N0YXRzKHNlbGYpOgorICAgICAgICAiIiJJbnRlcm5hbCBtZXRob2QgdG8gcmVzZXQgdGhlIGludGVybmFsIHN0YXRpc3RpY3MgY291bnRlcnMKKyAgICAgICAgZm9yIGNvbXByZXNzaW9uIHJhdGlvcyBhbmQgYmFuZHdpZHRoIHNhdmluZ3MuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmJ5dGVzX2luID0gMAorICAgICAgICBzZWxmLmJ5dGVzX291dCA9IDAKKyAgICAgICAgc2VsZi5ieXRlc19pbl9jb21wID0gMAorICAgICAgICBzZWxmLmJ5dGVzX291dF9jb21wID0gMAogCi0gIGRlZiBfaW5pdF96bGliKHNlbGYpOgotICAgICcnJwotICAgIEludGVybmFsIG1ldGhvZCBmb3Igc2V0dGluZyB1cCB0aGUgemxpYiBjb21wcmVzc2lvbiBhbmQKLSAgICBkZWNvbXByZXNzaW9uIG9iamVjdHMuCi0gICAgJycnCi0gICAgc2VsZi5femNvbXBfcmVhZCA9IHpsaWIuZGVjb21wcmVzc29iaigpCi0gICAgc2VsZi5femNvbXBfd3JpdGUgPSB6bGliLmNvbXByZXNzb2JqKHNlbGYuY29tcHJlc3NsZXZlbCkKKyAgICBkZWYgX2luaXRfemxpYihzZWxmKToKKyAgICAgICAgIiIiSW50ZXJuYWwgbWV0aG9kIGZvciBzZXR0aW5nIHVwIHRoZSB6bGliIGNvbXByZXNzaW9uIGFuZAorICAgICAgICBkZWNvbXByZXNzaW9uIG9iamVjdHMuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl96Y29tcF9yZWFkID0gemxpYi5kZWNvbXByZXNzb2JqKCkKKyAgICAgICAgc2VsZi5femNvbXBfd3JpdGUgPSB6bGliLmNvbXByZXNzb2JqKHNlbGYuY29tcHJlc3NsZXZlbCkKIAotICBkZWYgZ2V0Q29tcFJhdGlvKHNlbGYpOgotICAgICcnJwotICAgIEdldCB0aGUgY3VycmVudCBtZWFzdXJlZCBjb21wcmVzc2lvbiByYXRpb3MgKGluLG91dCkgZnJvbQotICAgIHRoaXMgdHJhbnNwb3J0LgotICAgIAotICAgIFJldHVybnMgYSB0dXBsZSBvZjogCi0gICAgKGluYm91bmRfY29tcHJlc3Npb25fcmF0aW8sIG91dGJvdW5kX2NvbXByZXNzaW9uX3JhdGlvKQotICAgIAotICAgIFRoZSBjb21wcmVzc2lvbiByYXRpb3MgYXJlIGNvbXB1dGVkIGFzOgotICAgICAgICBjb21wcmVzc2VkIC8gdW5jb21wcmVzc2VkCisgICAgZGVmIGdldENvbXBSYXRpbyhzZWxmKToKKyAgICAgICAgIiIiR2V0IHRoZSBjdXJyZW50IG1lYXN1cmVkIGNvbXByZXNzaW9uIHJhdGlvcyAoaW4sb3V0KSBmcm9tCisgICAgICAgIHRoaXMgdHJhbnNwb3J0LgogCi0gICAgRS5nLiwgZGF0YSB0aGF0IGNvbXByZXNzZXMgYnkgMTB4IHdpbGwgaGF2ZSBhIHJhdGlvIG9mOiAwLjEwCi0gICAgYW5kIGRhdGEgdGhhdCBjb21wcmVzc2VzIHRvIGhhbGYgb2YgdHMgb3JpZ2luYWwgc2l6ZSB3aWxsCi0gICAgaGF2ZSBhIHJhdGlvIG9mIDAuNQotICAgIAotICAgIE5vbmUgaXMgcmV0dXJuZWQgaWYgbm8gYnl0ZXMgaGF2ZSB5ZXQgYmVlbiBwcm9jZXNzZWQgaW4KLSAgICBhIHBhcnRpY3VsYXIgZGlyZWN0aW9uLgotICAgICcnJwotICAgIHJfcGVyY2VudCwgd19wZXJjZW50ID0gKE5vbmUsIE5vbmUpCi0gICAgaWYgc2VsZi5ieXRlc19pbiA+IDA6Ci0gICAgICByX3BlcmNlbnQgPSBzZWxmLmJ5dGVzX2luX2NvbXAgLyBzZWxmLmJ5dGVzX2luCi0gICAgaWYgc2VsZi5ieXRlc19vdXQgPiAwOgotICAgICAgd19wZXJjZW50ID0gc2VsZi5ieXRlc19vdXRfY29tcCAvIHNlbGYuYnl0ZXNfb3V0Ci0gICAgcmV0dXJuIChyX3BlcmNlbnQsIHdfcGVyY2VudCkKKyAgICAgICAgUmV0dXJucyBhIHR1cGxlIG9mOgorICAgICAgICAoaW5ib3VuZF9jb21wcmVzc2lvbl9yYXRpbywgb3V0Ym91bmRfY29tcHJlc3Npb25fcmF0aW8pCiAKLSAgZGVmIGdldENvbXBTYXZpbmdzKHNlbGYpOgotICAgICcnJwotICAgIEdldCB0aGUgY3VycmVudCBjb3VudCBvZiBzYXZlZCBieXRlcyBkdWUgdG8gZGF0YQotICAgIGNvbXByZXNzaW9uLgotICAgIAotICAgIFJldHVybnMgYSB0dXBsZSBvZjoKLSAgICAoaW5ib3VuZF9zYXZlZF9ieXRlcywgb3V0Ym91bmRfc2F2ZWRfYnl0ZXMpCi0gICAgCi0gICAgTm90ZTogaWYgY29tcHJlc3Npb24gaXMgYWN0dWFsbHkgZXhwYW5kaW5nIHlvdXIKLSAgICBkYXRhIChvbmx5IGxpa2VseSB3aXRoIHZlcnkgdGlueSB0aHJpZnQgb2JqZWN0cyksIHRoZW4KLSAgICB0aGUgdmFsdWVzIHJldHVybmVkIHdpbGwgYmUgbmVnYXRpdmUuCi0gICAgJycnCi0gICAgcl9zYXZlZCA9IHNlbGYuYnl0ZXNfaW4gLSBzZWxmLmJ5dGVzX2luX2NvbXAKLSAgICB3X3NhdmVkID0gc2VsZi5ieXRlc19vdXQgLSBzZWxmLmJ5dGVzX291dF9jb21wCi0gICAgcmV0dXJuIChyX3NhdmVkLCB3X3NhdmVkKQorICAgICAgICBUaGUgY29tcHJlc3Npb24gcmF0aW9zIGFyZSBjb21wdXRlZCBhczoKKyAgICAgICAgICAgIGNvbXByZXNzZWQgLyB1bmNvbXByZXNzZWQKIAotICBkZWYgaXNPcGVuKHNlbGYpOgotICAgICcnJ1JldHVybiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQncyBvcGVuIHN0YXR1cycnJwotICAgIHJldHVybiBzZWxmLl9fdHJhbnMuaXNPcGVuKCkKKyAgICAgICAgRS5nLiwgZGF0YSB0aGF0IGNvbXByZXNzZXMgYnkgMTB4IHdpbGwgaGF2ZSBhIHJhdGlvIG9mOiAwLjEwCisgICAgICAgIGFuZCBkYXRhIHRoYXQgY29tcHJlc3NlcyB0byBoYWxmIG9mIHRzIG9yaWdpbmFsIHNpemUgd2lsbAorICAgICAgICBoYXZlIGEgcmF0aW8gb2YgMC41CiAKLSAgZGVmIG9wZW4oc2VsZik6Ci0gICAgIiIiT3BlbiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQiIiIKLSAgICBzZWxmLl9pbml0X3N0YXRzKCkKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLm9wZW4oKQorICAgICAgICBOb25lIGlzIHJldHVybmVkIGlmIG5vIGJ5dGVzIGhhdmUgeWV0IGJlZW4gcHJvY2Vzc2VkIGluCisgICAgICAgIGEgcGFydGljdWxhciBkaXJlY3Rpb24uCisgICAgICAgICIiIgorICAgICAgICByX3BlcmNlbnQsIHdfcGVyY2VudCA9IChOb25lLCBOb25lKQorICAgICAgICBpZiBzZWxmLmJ5dGVzX2luID4gMDoKKyAgICAgICAgICAgIHJfcGVyY2VudCA9IHNlbGYuYnl0ZXNfaW5fY29tcCAvIHNlbGYuYnl0ZXNfaW4KKyAgICAgICAgaWYgc2VsZi5ieXRlc19vdXQgPiAwOgorICAgICAgICAgICAgd19wZXJjZW50ID0gc2VsZi5ieXRlc19vdXRfY29tcCAvIHNlbGYuYnl0ZXNfb3V0CisgICAgICAgIHJldHVybiAocl9wZXJjZW50LCB3X3BlcmNlbnQpCiAKLSAgZGVmIGxpc3RlbihzZWxmKToKLSAgICAnJydJbnZva2UgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0J3MgbGlzdGVuKCkgbWV0aG9kJycnCi0gICAgc2VsZi5fX3RyYW5zLmxpc3RlbigpCisgICAgZGVmIGdldENvbXBTYXZpbmdzKHNlbGYpOgorICAgICAgICAiIiJHZXQgdGhlIGN1cnJlbnQgY291bnQgb2Ygc2F2ZWQgYnl0ZXMgZHVlIHRvIGRhdGEKKyAgICAgICAgY29tcHJlc3Npb24uCiAKLSAgZGVmIGFjY2VwdChzZWxmKToKLSAgICAnJydBY2NlcHQgY29ubmVjdGlvbnMgb24gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0JycnCi0gICAgcmV0dXJuIHNlbGYuX190cmFucy5hY2NlcHQoKQorICAgICAgICBSZXR1cm5zIGEgdHVwbGUgb2Y6CisgICAgICAgIChpbmJvdW5kX3NhdmVkX2J5dGVzLCBvdXRib3VuZF9zYXZlZF9ieXRlcykKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgJycnQ2xvc2UgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LCcnJwotICAgIHNlbGYuX3JlaW5pdF9idWZmZXJzKCkKLSAgICBzZWxmLl9pbml0X3psaWIoKQotICAgIHJldHVybiBzZWxmLl9fdHJhbnMuY2xvc2UoKQorICAgICAgICBOb3RlOiBpZiBjb21wcmVzc2lvbiBpcyBhY3R1YWxseSBleHBhbmRpbmcgeW91cgorICAgICAgICBkYXRhIChvbmx5IGxpa2VseSB3aXRoIHZlcnkgdGlueSB0aHJpZnQgb2JqZWN0cyksIHRoZW4KKyAgICAgICAgdGhlIHZhbHVlcyByZXR1cm5lZCB3aWxsIGJlIG5lZ2F0aXZlLgorICAgICAgICAiIiIKKyAgICAgICAgcl9zYXZlZCA9IHNlbGYuYnl0ZXNfaW4gLSBzZWxmLmJ5dGVzX2luX2NvbXAKKyAgICAgICAgd19zYXZlZCA9IHNlbGYuYnl0ZXNfb3V0IC0gc2VsZi5ieXRlc19vdXRfY29tcAorICAgICAgICByZXR1cm4gKHJfc2F2ZWQsIHdfc2F2ZWQpCiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgICcnJwotICAgIFJlYWQgdXAgdG8gc3ogYnl0ZXMgZnJvbSB0aGUgZGVjb21wcmVzc2VkIGJ5dGVzIGJ1ZmZlciwgYW5kCi0gICAgcmVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBpZiB0aGUgZGVjb21wcmVzc2lvbgotICAgIGJ1ZmZlciBpcyBlbXB0eS4KLSAgICAnJycKLSAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQotICAgIGlmIGxlbihyZXQpID4gMDoKLSAgICAgIHJldHVybiByZXQKLSAgICAjIGtlZXAgcmVhZGluZyBmcm9tIHRyYW5zcG9ydCB1bnRpbCBzb21ldGhpbmcgY29tZXMgYmFjawotICAgIHdoaWxlIFRydWU6Ci0gICAgICBpZiBzZWxmLnJlYWRDb21wKHN6KToKLSAgICAgICAgYnJlYWsKLSAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQotICAgIHJldHVybiByZXQKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0J3Mgb3BlbiBzdGF0dXMiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5pc09wZW4oKQogCi0gIGRlZiByZWFkQ29tcChzZWxmLCBzeik6Ci0gICAgJycnCi0gICAgUmVhZCBjb21wcmVzc2VkIGRhdGEgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQsIHRoZW4KLSAgICBkZWNvbXByZXNzIGl0IGFuZCBhcHBlbmQgaXQgdG8gdGhlIGludGVybmFsIFN0cmluZ0lPIHJlYWQgYnVmZmVyCi0gICAgJycnCi0gICAgemJ1ZiA9IHNlbGYuX190cmFucy5yZWFkKHN6KQotICAgIHpidWYgPSBzZWxmLl96Y29tcF9yZWFkLnVuY29uc3VtZWRfdGFpbCArIHpidWYKLSAgICBidWYgPSBzZWxmLl96Y29tcF9yZWFkLmRlY29tcHJlc3MoemJ1ZikKLSAgICBzZWxmLmJ5dGVzX2luICs9IGxlbih6YnVmKQotICAgIHNlbGYuYnl0ZXNfaW5fY29tcCArPSBsZW4oYnVmKQotICAgIG9sZCA9IHNlbGYuX19yYnVmLnJlYWQoKQotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8ob2xkICsgYnVmKQotICAgIGlmIGxlbihvbGQpICsgbGVuKGJ1ZikgPT0gMDoKLSAgICAgIHJldHVybiBGYWxzZQotICAgIHJldHVybiBUcnVlCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgICIiIk9wZW4gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IiIiCisgICAgICAgIHNlbGYuX2luaXRfc3RhdHMoKQorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLm9wZW4oKQogCi0gIGRlZiB3cml0ZShzZWxmLCBidWYpOgotICAgICcnJwotICAgIFdyaXRlIHNvbWUgYnl0ZXMsIHB1dHRpbmcgdGhlbSBpbnRvIHRoZSBpbnRlcm5hbCB3cml0ZQotICAgIGJ1ZmZlciBmb3IgZXZlbnR1YWwgY29tcHJlc3Npb24uCi0gICAgJycnCi0gICAgc2VsZi5fX3didWYud3JpdGUoYnVmKQorICAgIGRlZiBsaXN0ZW4oc2VsZik6CisgICAgICAgICIiIkludm9rZSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQncyBsaXN0ZW4oKSBtZXRob2QiIiIKKyAgICAgICAgc2VsZi5fX3RyYW5zLmxpc3RlbigpCiAKLSAgZGVmIGZsdXNoKHNlbGYpOgotICAgICcnJwotICAgIEZsdXNoIGFueSBxdWV1ZWQgdXAgZGF0YSBpbiB0aGUgd3JpdGUgYnVmZmVyIGFuZCBlbnN1cmUgdGhlCi0gICAgY29tcHJlc3Npb24gYnVmZmVyIGlzIGZsdXNoZWQgb3V0IHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAotICAgICcnJwotICAgIHdvdXQgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCi0gICAgaWYgbGVuKHdvdXQpID4gMDoKLSAgICAgIHpidWYgPSBzZWxmLl96Y29tcF93cml0ZS5jb21wcmVzcyh3b3V0KQotICAgICAgc2VsZi5ieXRlc19vdXQgKz0gbGVuKHdvdXQpCi0gICAgICBzZWxmLmJ5dGVzX291dF9jb21wICs9IGxlbih6YnVmKQotICAgIGVsc2U6Ci0gICAgICB6YnVmID0gJycKLSAgICB6dGFpbCA9IHNlbGYuX3pjb21wX3dyaXRlLmZsdXNoKHpsaWIuWl9TWU5DX0ZMVVNIKQotICAgIHNlbGYuYnl0ZXNfb3V0X2NvbXAgKz0gbGVuKHp0YWlsKQotICAgIGlmIChsZW4oemJ1ZikgKyBsZW4oenRhaWwpKSA+IDA6Ci0gICAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKLSAgICAgIHNlbGYuX190cmFucy53cml0ZSh6YnVmICsgenRhaWwpCi0gICAgc2VsZi5fX3RyYW5zLmZsdXNoKCkKKyAgICBkZWYgYWNjZXB0KHNlbGYpOgorICAgICAgICAiIiJBY2NlcHQgY29ubmVjdGlvbnMgb24gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IiIiCisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuYWNjZXB0KCkKIAotICBAcHJvcGVydHkKLSAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6Ci0gICAgJycnSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlJycnCi0gICAgcmV0dXJuIHNlbGYuX19yYnVmCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJDbG9zZSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQsIiIiCisgICAgICAgIHNlbGYuX3JlaW5pdF9idWZmZXJzKCkKKyAgICAgICAgc2VsZi5faW5pdF96bGliKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5jbG9zZSgpCiAKLSAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcGFydGlhbHJlYWQsIHJlcWxlbik6Ci0gICAgJycnSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlIGZvciByZWZpbGwnJycKLSAgICByZXRzdHJpbmcgPSBwYXJ0aWFscmVhZAotICAgIGlmIHJlcWxlbiA8IHNlbGYuREVGQVVMVF9CVUZGU0laRToKLSAgICAgIHJldHN0cmluZyArPSBzZWxmLnJlYWQoc2VsZi5ERUZBVUxUX0JVRkZTSVpFKQotICAgIHdoaWxlIGxlbihyZXRzdHJpbmcpIDwgcmVxbGVuOgotICAgICAgcmV0c3RyaW5nICs9IHNlbGYucmVhZChyZXFsZW4gLSBsZW4ocmV0c3RyaW5nKSkKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKHJldHN0cmluZykKLSAgICByZXR1cm4gc2VsZi5fX3JidWYKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgICIiIlJlYWQgdXAgdG8gc3ogYnl0ZXMgZnJvbSB0aGUgZGVjb21wcmVzc2VkIGJ5dGVzIGJ1ZmZlciwgYW5kCisgICAgICAgIHJlYWQgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgaWYgdGhlIGRlY29tcHJlc3Npb24KKyAgICAgICAgYnVmZmVyIGlzIGVtcHR5LgorICAgICAgICAiIiIKKyAgICAgICAgcmV0ID0gc2VsZi5fX3JidWYucmVhZChzeikKKyAgICAgICAgaWYgbGVuKHJldCkgPiAwOgorICAgICAgICAgICAgcmV0dXJuIHJldAorICAgICAgICAjIGtlZXAgcmVhZGluZyBmcm9tIHRyYW5zcG9ydCB1bnRpbCBzb21ldGhpbmcgY29tZXMgYmFjaworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgaWYgc2VsZi5yZWFkQ29tcChzeik6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0ID0gc2VsZi5fX3JidWYucmVhZChzeikKKyAgICAgICAgcmV0dXJuIHJldAorCisgICAgZGVmIHJlYWRDb21wKHNlbGYsIHN6KToKKyAgICAgICAgIiIiUmVhZCBjb21wcmVzc2VkIGRhdGEgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQsIHRoZW4KKyAgICAgICAgZGVjb21wcmVzcyBpdCBhbmQgYXBwZW5kIGl0IHRvIHRoZSBpbnRlcm5hbCBTdHJpbmdJTyByZWFkIGJ1ZmZlcgorICAgICAgICAiIiIKKyAgICAgICAgemJ1ZiA9IHNlbGYuX190cmFucy5yZWFkKHN6KQorICAgICAgICB6YnVmID0gc2VsZi5femNvbXBfcmVhZC51bmNvbnN1bWVkX3RhaWwgKyB6YnVmCisgICAgICAgIGJ1ZiA9IHNlbGYuX3pjb21wX3JlYWQuZGVjb21wcmVzcyh6YnVmKQorICAgICAgICBzZWxmLmJ5dGVzX2luICs9IGxlbih6YnVmKQorICAgICAgICBzZWxmLmJ5dGVzX2luX2NvbXAgKz0gbGVuKGJ1ZikKKyAgICAgICAgb2xkID0gc2VsZi5fX3JidWYucmVhZCgpCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8ob2xkICsgYnVmKQorICAgICAgICBpZiBsZW4ob2xkKSArIGxlbihidWYpID09IDA6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICAiIiJXcml0ZSBzb21lIGJ5dGVzLCBwdXR0aW5nIHRoZW0gaW50byB0aGUgaW50ZXJuYWwgd3JpdGUKKyAgICAgICAgYnVmZmVyIGZvciBldmVudHVhbCBjb21wcmVzc2lvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgIiIiRmx1c2ggYW55IHF1ZXVlZCB1cCBkYXRhIGluIHRoZSB3cml0ZSBidWZmZXIgYW5kIGVuc3VyZSB0aGUKKyAgICAgICAgY29tcHJlc3Npb24gYnVmZmVyIGlzIGZsdXNoZWQgb3V0IHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAgICAiIiIKKyAgICAgICAgd291dCA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKKyAgICAgICAgaWYgbGVuKHdvdXQpID4gMDoKKyAgICAgICAgICAgIHpidWYgPSBzZWxmLl96Y29tcF93cml0ZS5jb21wcmVzcyh3b3V0KQorICAgICAgICAgICAgc2VsZi5ieXRlc19vdXQgKz0gbGVuKHdvdXQpCisgICAgICAgICAgICBzZWxmLmJ5dGVzX291dF9jb21wICs9IGxlbih6YnVmKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgemJ1ZiA9ICcnCisgICAgICAgIHp0YWlsID0gc2VsZi5femNvbXBfd3JpdGUuZmx1c2goemxpYi5aX1NZTkNfRkxVU0gpCisgICAgICAgIHNlbGYuYnl0ZXNfb3V0X2NvbXAgKz0gbGVuKHp0YWlsKQorICAgICAgICBpZiAobGVuKHpidWYpICsgbGVuKHp0YWlsKSkgPiAwOgorICAgICAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCisgICAgICAgICAgICBzZWxmLl9fdHJhbnMud3JpdGUoemJ1ZiArIHp0YWlsKQorICAgICAgICBzZWxmLl9fdHJhbnMuZmx1c2goKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6CisgICAgICAgICIiIkltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZSIiIgorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYKKworICAgIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHBhcnRpYWxyZWFkLCByZXFsZW4pOgorICAgICAgICAiIiJJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UgZm9yIHJlZmlsbCIiIgorICAgICAgICByZXRzdHJpbmcgPSBwYXJ0aWFscmVhZAorICAgICAgICBpZiByZXFsZW4gPCBzZWxmLkRFRkFVTFRfQlVGRlNJWkU6CisgICAgICAgICAgICByZXRzdHJpbmcgKz0gc2VsZi5yZWFkKHNlbGYuREVGQVVMVF9CVUZGU0laRSkKKyAgICAgICAgd2hpbGUgbGVuKHJldHN0cmluZykgPCByZXFsZW46CisgICAgICAgICAgICByZXRzdHJpbmcgKz0gc2VsZi5yZWFkKHJlcWxlbiAtIGxlbihyZXRzdHJpbmcpKQorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKHJldHN0cmluZykKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9fX2luaXRfXy5weSBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L19faW5pdF9fLnB5CmluZGV4IDQ2ZTU0ZmUuLmM5NTk2ZDkgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L19faW5pdF9fLnB5CisrKyBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L19faW5pdF9fLnB5CkBAIC0xNyw0ICsxNyw0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1fX2FsbF9fID0gWydUVHJhbnNwb3J0JywgJ1RTb2NrZXQnLCAnVEh0dHBDbGllbnQnLCdUWmxpYlRyYW5zcG9ydCddCitfX2FsbF9fID0gWydUVHJhbnNwb3J0JywgJ1RTb2NrZXQnLCAnVEh0dHBDbGllbnQnLCAnVFpsaWJUcmFuc3BvcnQnXQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvc3NsY29tcGF0LnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvc3NsY29tcGF0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMDBjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9zc2xjb21wYXQucHkKQEAgLTAsMCArMSwxMDAgQEAKKyMKKyMgbGljZW5zZWQgdG8gdGhlIGFwYWNoZSBzb2Z0d2FyZSBmb3VuZGF0aW9uIChhc2YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gc2VlIHRoZSBub3RpY2UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gdGhlIGFzZiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBhcGFjaGUgbGljZW5zZSwgdmVyc2lvbiAyLjAgKHRoZQorIyAibGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIGxpY2Vuc2UuIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgbGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9saWNlbnNlLTIuMAorIworIyB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBsaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJhcyBpcyIgYmFzaXMsIHdpdGhvdXQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIGFueQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHN5cworCitmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEV4Y2VwdGlvbgorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKKworCitkZWYgbGVnYWN5X3ZhbGlkYXRlX2NhbGxiYWNrKGNlcnQsIGhvc3RuYW1lKToKKyAgICAiIiJsZWdhY3kgbWV0aG9kIHRvIHZhbGlkYXRlIHRoZSBwZWVyJ3MgU1NMIGNlcnRpZmljYXRlLCBhbmQgdG8gY2hlY2sKKyAgICB0aGUgY29tbW9uTmFtZSBvZiB0aGUgY2VydGlmaWNhdGUgdG8gZW5zdXJlIGl0IG1hdGNoZXMgdGhlIGhvc3RuYW1lIHdlCisgICAgdXNlZCB0byBtYWtlIHRoaXMgY29ubmVjdGlvbi4gIERvZXMgbm90IHN1cHBvcnQgc3ViamVjdEFsdE5hbWUgcmVjb3JkcworICAgIGluIGNlcnRpZmljYXRlcy4KKworICAgIHJhaXNlcyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZSBjZXJ0aWZpY2F0ZSBmYWlscyB2YWxpZGF0aW9uLgorICAgICIiIgorICAgIGlmICdzdWJqZWN0JyBub3QgaW4gY2VydDoKKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sCisgICAgICAgICAgICAnTm8gU1NMIGNlcnRpZmljYXRlIGZvdW5kIGZyb20gJXMnICUgaG9zdG5hbWUpCisgICAgZmllbGRzID0gY2VydFsnc3ViamVjdCddCisgICAgZm9yIGZpZWxkIGluIGZpZWxkczoKKyAgICAgICAgIyBlbnN1cmUgc3RydWN0dXJlIHdlIGdldCBiYWNrIGlzIHdoYXQgd2UgZXhwZWN0CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGZpZWxkLCB0dXBsZSk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBjZXJ0X3BhaXIgPSBmaWVsZFswXQorICAgICAgICBpZiBsZW4oY2VydF9wYWlyKSA8IDI6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBjZXJ0X2tleSwgY2VydF92YWx1ZSA9IGNlcnRfcGFpclswOjJdCisgICAgICAgIGlmIGNlcnRfa2V5ICE9ICdjb21tb25OYW1lJzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGNlcnRob3N0ID0gY2VydF92YWx1ZQorICAgICAgICAjIHRoaXMgY2hlY2sgc2hvdWxkIGJlIHBlcmZvcm1lZCBieSBzb21lIHNvcnQgb2YgQWNjZXNzIE1hbmFnZXIKKyAgICAgICAgaWYgY2VydGhvc3QgPT0gaG9zdG5hbWU6CisgICAgICAgICAgICAjIHN1Y2Nlc3MsIGNlcnQgY29tbW9uTmFtZSBtYXRjaGVzIGRlc2lyZWQgaG9zdG5hbWUKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sCisgICAgICAgICAgICAgICAgJ0hvc3RuYW1lIHdlIGNvbm5lY3RlZCB0byAiJXMiIGRvZXNuXCd0IG1hdGNoIGNlcnRpZmljYXRlICcKKyAgICAgICAgICAgICAgICAncHJvdmlkZWQgY29tbW9uTmFtZSAiJXMiJyAlIChob3N0bmFtZSwgY2VydGhvc3QpKQorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwKKyAgICAgICAgJ0NvdWxkIG5vdCB2YWxpZGF0ZSBTU0wgY2VydGlmaWNhdGUgZnJvbSBob3N0ICIlcyIuICBDZXJ0PSVzJworICAgICAgICAlIChob3N0bmFtZSwgY2VydCkpCisKKworZGVmIF9vcHRpb25hbF9kZXBlbmRlbmNpZXMoKToKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBpcGFkZHJlc3MgICMgbm9xYQorICAgICAgICBsb2dnZXIuZGVidWcoJ2lwYWRkcmVzcyBtb2R1bGUgaXMgYXZhaWxhYmxlJykKKyAgICAgICAgaXBhZGRyID0gVHJ1ZQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgbG9nZ2VyLndhcm4oJ2lwYWRkcmVzcyBtb2R1bGUgaXMgdW5hdmFpbGFibGUnKQorICAgICAgICBpcGFkZHIgPSBGYWxzZQorCisgICAgaWYgc3lzLmhleHZlcnNpb24gPCAweDAzMDUwMEYwOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgaW1wb3J0IG1hdGNoX2hvc3RuYW1lLCBfX3ZlcnNpb25fXyBhcyB2ZXIKKyAgICAgICAgICAgIHZlciA9IGxpc3QobWFwKGludCwgdmVyLnNwbGl0KCcuJykpKQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIG1vZHVsZSBpcyBhdmFpbGFibGUnKQorICAgICAgICAgICAgbWF0Y2ggPSBtYXRjaF9ob3N0bmFtZQorICAgICAgICAgICAgaWYgdmVyWzBdICogMTAgKyB2ZXJbMV0gPj0gMzU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGlwYWRkciwgbWF0Y2gKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ2JhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgbW9kdWxlIGlzIHRvbyBvbGQnKQorICAgICAgICAgICAgICAgIGlwYWRkciA9IEZhbHNlCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCdiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIGlzIHVuYXZhaWxhYmxlJykKKyAgICAgICAgICAgIGlwYWRkciA9IEZhbHNlCisgICAgdHJ5OgorICAgICAgICBmcm9tIHNzbCBpbXBvcnQgbWF0Y2hfaG9zdG5hbWUKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdzc2wubWF0Y2hfaG9zdG5hbWUgaXMgYXZhaWxhYmxlJykKKyAgICAgICAgbWF0Y2ggPSBtYXRjaF9ob3N0bmFtZQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgbG9nZ2VyLndhcm4oJ3VzaW5nIGxlZ2FjeSB2YWxpZGF0aW9uIGNhbGxiYWNrJykKKyAgICAgICAgbWF0Y2ggPSBsZWdhY3lfdmFsaWRhdGVfY2FsbGJhY2sKKyAgICByZXR1cm4gaXBhZGRyLCBtYXRjaAorCisKK19tYXRjaF9oYXNfaXBhZGRyZXNzLCBfbWF0Y2hfaG9zdG5hbWUgPSBfb3B0aW9uYWxfZGVwZW5kZW5jaWVzKCkKZGlmZiAtLWdpdCBhL2xpYi9weS90ZXN0L19pbXBvcnRfbG9jYWxfdGhyaWZ0LnB5IGIvbGliL3B5L3Rlc3QvX2ltcG9ydF9sb2NhbF90aHJpZnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyMzEyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS90ZXN0L19pbXBvcnRfbG9jYWxfdGhyaWZ0LnB5CkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgZ2xvYgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK1NDUklQVF9ESVIgPSBvcy5wYXRoLnJlYWxwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCitST09UX0RJUiA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpKSkKKworZm9yIGxpYnBhdGggaW4gZ2xvYi5nbG9iKG9zLnBhdGguam9pbihST09UX0RJUiwgJ2xpYicsICdweScsICdidWlsZCcsICdsaWIuKicpKToKKyAgICBpZiBsaWJwYXRoLmVuZHN3aXRoKCctJWQuJWQnICUgKHN5cy52ZXJzaW9uX2luZm9bMF0sIHN5cy52ZXJzaW9uX2luZm9bMV0pKToKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGxpYnBhdGgpCisgICAgICAgIGJyZWFrCmRpZmYgLS1naXQgYS9saWIvcHkvdGVzdC90ZXN0X3NzbHNvY2tldC5weSBiL2xpYi9weS90ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMzQ0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvdGVzdC90ZXN0X3NzbHNvY2tldC5weQpAQCAtMCwwICsxLDM0NiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBpbnNwZWN0CitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBzc2wKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRocmVhZGluZworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKK2Zyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKKworaW1wb3J0IF9pbXBvcnRfbG9jYWxfdGhyaWZ0ICAjIG5vcWEKKworU0NSSVBUX0RJUiA9IG9zLnBhdGgucmVhbHBhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKK1JPT1RfRElSID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUikpKQorU0VSVkVSX1BFTSA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdzZXJ2ZXIucGVtJykKK1NFUlZFUl9DRVJUID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ3NlcnZlci5jcnQnKQorU0VSVkVSX0tFWSA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdzZXJ2ZXIua2V5JykKK0NMSUVOVF9DRVJUX05PX0lQID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ2NsaWVudC5jcnQnKQorQ0xJRU5UX0tFWV9OT19JUCA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdjbGllbnQua2V5JykKK0NMSUVOVF9DRVJUID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ2NsaWVudF92My5jcnQnKQorQ0xJRU5UX0tFWSA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdjbGllbnRfdjMua2V5JykKK0NMSUVOVF9DQSA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdDQS5wZW0nKQorCitURVNUX0NJUEhFUlMgPSAnREVTLUNCQzMtU0hBOkVDREhFLVJTQS1BRVMxMjgtR0NNLVNIQTI1NicKKworCitjbGFzcyBTZXJ2ZXJBY2NlcHRvcih0aHJlYWRpbmcuVGhyZWFkKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2VydmVyLCBleHBlY3RfZmFpbHVyZT1GYWxzZSk6CisgICAgICAgIHN1cGVyKFNlcnZlckFjY2VwdG9yLCBzZWxmKS5fX2luaXRfXygpCisgICAgICAgIHNlbGYuZGFlbW9uID0gVHJ1ZQorICAgICAgICBzZWxmLl9zZXJ2ZXIgPSBzZXJ2ZXIKKyAgICAgICAgc2VsZi5fbGlzdGVuaW5nID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgc2VsZi5fcG9ydCA9IE5vbmUKKyAgICAgICAgc2VsZi5fcG9ydF9ib3VuZCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHNlbGYuX2NsaWVudCA9IE5vbmUKKyAgICAgICAgc2VsZi5fY2xpZW50X2FjY2VwdGVkID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgc2VsZi5fZXhwZWN0X2ZhaWx1cmUgPSBleHBlY3RfZmFpbHVyZQorICAgICAgICBmcmFtZSA9IGluc3BlY3Quc3RhY2soMylbMl0KKyAgICAgICAgc2VsZi5uYW1lID0gZnJhbWVbM10KKyAgICAgICAgZGVsIGZyYW1lCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLl9zZXJ2ZXIubGlzdGVuKCkKKyAgICAgICAgc2VsZi5fbGlzdGVuaW5nLnNldCgpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYWRkcmVzcyA9IHNlbGYuX3NlcnZlci5oYW5kbGUuZ2V0c29ja25hbWUoKQorICAgICAgICAgICAgaWYgbGVuKGFkZHJlc3MpID4gMToKKyAgICAgICAgICAgICAgICAjIEFGX0lORVQgYWRkcmVzc2VzIGFyZSAyLXR1cGxlcyAoaG9zdCwgcG9ydCkgYW5kIEFGX0lORVQ2IGFyZQorICAgICAgICAgICAgICAgICMgNC10dXBsZXMgKGhvc3QsIHBvcnQsIC4uLiksIGJ1dCBpbiBlYWNoIGNhc2UgcG9ydCBpcyBpbiB0aGUgc2Vjb25kIHNsb3QuCisgICAgICAgICAgICAgICAgc2VsZi5fcG9ydCA9IGFkZHJlc3NbMV0KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX3BvcnRfYm91bmQuc2V0KCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9jbGllbnQgPSBzZWxmLl9zZXJ2ZXIuYWNjZXB0KCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKCdlcnJvciBvbiBzZXJ2ZXIgc2lkZSAoJXMpOicgJSBzZWxmLm5hbWUpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fZXhwZWN0X2ZhaWx1cmU6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2NsaWVudF9hY2NlcHRlZC5zZXQoKQorCisgICAgZGVmIGF3YWl0X2xpc3RlbmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5fbGlzdGVuaW5nLndhaXQoKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHBvcnQoc2VsZik6CisgICAgICAgIHNlbGYuX3BvcnRfYm91bmQud2FpdCgpCisgICAgICAgIHJldHVybiBzZWxmLl9wb3J0CisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY2xpZW50KHNlbGYpOgorICAgICAgICBzZWxmLl9jbGllbnRfYWNjZXB0ZWQud2FpdCgpCisgICAgICAgIHJldHVybiBzZWxmLl9jbGllbnQKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fY2xpZW50OgorICAgICAgICAgICAgc2VsZi5fY2xpZW50LmNsb3NlKCkKKyAgICAgICAgc2VsZi5fc2VydmVyLmNsb3NlKCkKKworCisjIFB5dGhvbiAyLjYgY29tcGF0CitjbGFzcyBBc3NlcnRSYWlzZXMob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhwZWN0ZWQpOgorICAgICAgICBzZWxmLl9leHBlY3RlZCA9IGV4cGVjdGVkCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKToKKyAgICAgICAgaWYgbm90IGV4Y190eXBlIG9yIG5vdCBpc3N1YmNsYXNzKGV4Y190eXBlLCBzZWxmLl9leHBlY3RlZCk6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ2ZhaWwnKQorICAgICAgICByZXR1cm4gVHJ1ZQorCisKK2NsYXNzIFRTU0xTb2NrZXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgX3NlcnZlcl9zb2NrZXQoc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gVFNTTFNlcnZlclNvY2tldChwb3J0PTAsICoqa3dhcmdzKQorCisgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgZGVmIF9jb25uZWN0YWJsZV9jbGllbnQoc2VsZiwgc2VydmVyLCBleHBlY3RfZmFpbHVyZT1GYWxzZSwgcGF0aD1Ob25lLCAqKmNsaWVudF9rd2FyZ3MpOgorICAgICAgICBhY2MgPSBTZXJ2ZXJBY2NlcHRvcihzZXJ2ZXIsIGV4cGVjdF9mYWlsdXJlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBhY2Muc3RhcnQoKQorICAgICAgICAgICAgYWNjLmF3YWl0X2xpc3RlbmluZygpCisKKyAgICAgICAgICAgIGhvc3QsIHBvcnQgPSAoJ2xvY2FsaG9zdCcsIGFjYy5wb3J0KSBpZiBwYXRoIGlzIE5vbmUgZWxzZSAoTm9uZSwgTm9uZSkKKyAgICAgICAgICAgIGNsaWVudCA9IFRTU0xTb2NrZXQoaG9zdCwgcG9ydCwgdW5peF9zb2NrZXQ9cGF0aCwgKipjbGllbnRfa3dhcmdzKQorICAgICAgICAgICAgeWllbGQgYWNjLCBjbGllbnQKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGFjYy5jbG9zZSgpCisKKyAgICBkZWYgX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VsZiwgc2VydmVyLCBwYXRoPU5vbmUsICoqY2xpZW50X2FyZ3MpOgorICAgICAgICBsb2dnaW5nLmRpc2FibGUobG9nZ2luZy5DUklUSUNBTCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBzZWxmLl9jb25uZWN0YWJsZV9jbGllbnQoc2VydmVyLCBUcnVlLCBwYXRoPXBhdGgsICoqY2xpZW50X2FyZ3MpIGFzIChhY2MsIGNsaWVudCk6CisgICAgICAgICAgICAgICAgIyBXZSBuZWVkIHRvIHdhaXQgZm9yIGEgY29ubmVjdGlvbiBmYWlsdXJlLCBidXQgbm90IHRvbyBsb25nLiAgMjBtcyBpcyBhIHR1bmFibGUKKyAgICAgICAgICAgICAgICAjIGNvbXByb21pc2UgYmV0d2VlbiB0ZXN0IHNwZWVkIGFuZCBzdGFiaWxpdHkKKyAgICAgICAgICAgICAgICBjbGllbnQuc2V0VGltZW91dCgyMCkKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuX2Fzc2VydF9yYWlzZXMoVFRyYW5zcG9ydEV4Y2VwdGlvbik6CisgICAgICAgICAgICAgICAgICAgIGNsaWVudC5vcGVuKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYWNjLmNsaWVudCBpcyBOb25lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgbG9nZ2luZy5kaXNhYmxlKGxvZ2dpbmcuTk9UU0VUKQorCisgICAgZGVmIF9hc3NlcnRfcmFpc2VzKHNlbGYsIGV4Yyk6CisgICAgICAgIGlmIHN5cy5oZXh2ZXJzaW9uID49IDB4MDIwNzAwRjA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5hc3NlcnRSYWlzZXMoZXhjKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEFzc2VydFJhaXNlcyhleGMpCisKKyAgICBkZWYgX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VsZiwgc2VydmVyLCBwYXRoPU5vbmUsICoqY2xpZW50X2FyZ3MpOgorICAgICAgICB3aXRoIHNlbGYuX2Nvbm5lY3RhYmxlX2NsaWVudChzZXJ2ZXIsIHBhdGg9cGF0aCwgKipjbGllbnRfYXJncykgYXMgKGFjYywgY2xpZW50KToKKyAgICAgICAgICAgIGNsaWVudC5vcGVuKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYWNjLmNsaWVudCBpcyBub3QgTm9uZSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgY2xpZW50LmNsb3NlKCkKKworICAgICMgZGVwcmVjYXRlZCBmZWF0dXJlCisgICAgZGVmIHRlc3RfZGVwcmVjYXRpb24oc2VsZik6CisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpIGFzIHc6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnYWx3YXlzJywgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nLCBtb2R1bGU9c2VsZi5fX21vZHVsZV9fKQorICAgICAgICAgICAgVFNTTFNvY2tldCgnbG9jYWxob3N0JywgMCwgdmFsaWRhdGU9VHJ1ZSwgY2FfY2VydHM9U0VSVkVSX0NFUlQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMSkKKworICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2Fsd2F5cycsIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywgbW9kdWxlPXNlbGYuX19tb2R1bGVfXykKKyAgICAgICAgICAgICMgRGVwcmVjYXRlZCBzaWduYXR1cmUKKyAgICAgICAgICAgICMgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgdmFsaWRhdGU9VHJ1ZSwgY2FfY2VydHM9Tm9uZSwga2V5ZmlsZT1Ob25lLCBjZXJ0ZmlsZT1Ob25lLCB1bml4X3NvY2tldD1Ob25lLCBjaXBoZXJzPU5vbmUpOgorICAgICAgICAgICAgVFNTTFNvY2tldCgnbG9jYWxob3N0JywgMCwgVHJ1ZSwgU0VSVkVSX0NFUlQsIENMSUVOVF9LRVksIENMSUVOVF9DRVJULCBOb25lLCBURVNUX0NJUEhFUlMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgNykKKworICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2Fsd2F5cycsIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywgbW9kdWxlPXNlbGYuX19tb2R1bGVfXykKKyAgICAgICAgICAgICMgRGVwcmVjYXRlZCBzaWduYXR1cmUKKyAgICAgICAgICAgICMgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9Tm9uZSwgcG9ydD05MDkwLCBjZXJ0ZmlsZT0nY2VydC5wZW0nLCB1bml4X3NvY2tldD1Ob25lLCBjaXBoZXJzPU5vbmUpOgorICAgICAgICAgICAgVFNTTFNlcnZlclNvY2tldChOb25lLCAwLCBTRVJWRVJfUEVNLCBOb25lLCBURVNUX0NJUEhFUlMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMykKKworICAgICMgZGVwcmVjYXRlZCBmZWF0dXJlCisgICAgZGVmIHRlc3Rfc2V0X2NlcnRfcmVxc19ieV92YWxpZGF0ZShzZWxmKToKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdhbHdheXMnLCBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcsIG1vZHVsZT1zZWxmLl9fbW9kdWxlX18pCisgICAgICAgICAgICBjMSA9IFRTU0xTb2NrZXQoJ2xvY2FsaG9zdCcsIDAsIHZhbGlkYXRlPVRydWUsIGNhX2NlcnRzPVNFUlZFUl9DRVJUKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjMS5jZXJ0X3JlcXMsIHNzbC5DRVJUX1JFUVVJUkVEKQorCisgICAgICAgICAgICBjMSA9IFRTU0xTb2NrZXQoJ2xvY2FsaG9zdCcsIDAsIHZhbGlkYXRlPUZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjMS5jZXJ0X3JlcXMsIHNzbC5DRVJUX05PTkUpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHcpLCAyKQorCisgICAgIyBkZXByZWNhdGVkIGZlYXR1cmUKKyAgICBkZWYgdGVzdF9zZXRfdmFsaWRhdGVfYnlfY2VydF9yZXFzKHNlbGYpOgorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2Fsd2F5cycsIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywgbW9kdWxlPXNlbGYuX19tb2R1bGVfXykKKyAgICAgICAgICAgIGMxID0gVFNTTFNvY2tldCgnbG9jYWxob3N0JywgMCwgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGMxLnZhbGlkYXRlKQorCisgICAgICAgICAgICBjMiA9IFRTU0xTb2NrZXQoJ2xvY2FsaG9zdCcsIDAsIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwgY2FfY2VydHM9U0VSVkVSX0NFUlQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYzIudmFsaWRhdGUpCisKKyAgICAgICAgICAgIGMzID0gVFNTTFNvY2tldCgnbG9jYWxob3N0JywgMCwgY2VydF9yZXFzPXNzbC5DRVJUX09QVElPTkFMLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjMy52YWxpZGF0ZSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDMpCisKKyAgICBkZWYgdGVzdF91bml4X2RvbWFpbl9zb2NrZXQoc2VsZik6CisgICAgICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJzoKKyAgICAgICAgICAgIHByaW50KCdza2lwcGluZyB0ZXN0X3VuaXhfZG9tYWluX3NvY2tldCcpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZmQsIHBhdGggPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQodW5peF9zb2NrZXQ9cGF0aCwga2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCkKKyAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBwYXRoPXBhdGgsIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW5saW5rKHBhdGgpCisKKyAgICBkZWYgdGVzdF9zZXJ2ZXJfY2VydChzZWxmKToKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJUKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCkKKworICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQpCisgICAgICAgICMgc2VydmVyIGNlcnQgbm90IGluIGNhX2NlcnRzCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsIGNhX2NlcnRzPUNMSUVOVF9DRVJUKQorCisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCkKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FKQorCisgICAgZGVmIHRlc3Rfc2V0X3NlcnZlcl9jZXJ0KHNlbGYpOgorICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9Q0xJRU5UX0NFUlQpCisgICAgICAgIHdpdGggc2VsZi5fYXNzZXJ0X3JhaXNlcyhFeGNlcHRpb24pOgorICAgICAgICAgICAgc2VydmVyLmNlcnRmaWxlID0gJ2ZvbycKKyAgICAgICAgd2l0aCBzZWxmLl9hc3NlcnRfcmFpc2VzKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBzZXJ2ZXIuY2VydGZpbGUgPSBOb25lCisgICAgICAgIHNlcnZlci5jZXJ0ZmlsZSA9IFNFUlZFUl9DRVJUCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsIGNhX2NlcnRzPVNFUlZFUl9DRVJUKQorCisgICAgZGVmIHRlc3RfY2xpZW50X2NlcnQoc2VsZik6CisgICAgICAgIGlmIG5vdCBfbWF0Y2hfaGFzX2lwYWRkcmVzczoKKyAgICAgICAgICAgIHByaW50KCdza2lwcGluZyB0ZXN0X2NsaWVudF9jZXJ0JykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KAorICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBrZXlmaWxlPVNFUlZFUl9LRVksCisgICAgICAgICAgICBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgY2FfY2VydHM9Q0xJRU5UX0NFUlQpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIGtleWZpbGU9U0VSVkVSX0tFWSkKKworICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KAorICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBrZXlmaWxlPVNFUlZFUl9LRVksCisgICAgICAgICAgICBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgY2FfY2VydHM9Q0xJRU5UX0NBKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsIGNlcnRmaWxlPUNMSUVOVF9DRVJUX05PX0lQLCBrZXlmaWxlPUNMSUVOVF9LRVlfTk9fSVApCisKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldCgKKyAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwga2V5ZmlsZT1TRVJWRVJfS0VZLAorICAgICAgICAgICAgY2VydGZpbGU9U0VSVkVSX0NFUlQsIGNhX2NlcnRzPUNMSUVOVF9DQSkKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjZXJ0ZmlsZT1DTElFTlRfQ0VSVCwga2V5ZmlsZT1DTElFTlRfS0VZKQorCisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoCisgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfT1BUSU9OQUwsIGtleWZpbGU9U0VSVkVSX0tFWSwKKyAgICAgICAgICAgIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBjYV9jZXJ0cz1DTElFTlRfQ0EpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSwgY2VydGZpbGU9Q0xJRU5UX0NFUlQsIGtleWZpbGU9Q0xJRU5UX0tFWSkKKworICAgIGRlZiB0ZXN0X2NpcGhlcnMoc2VsZik6CisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgY2lwaGVycz1URVNUX0NJUEhFUlMpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCwgY2lwaGVycz1URVNUX0NJUEhFUlMpCisKKyAgICAgICAgaWYgbm90IFRTU0xTb2NrZXQuX2hhc19jaXBoZXJzOgorICAgICAgICAgICAgIyB1bml0dGVzdC5za2lwIGlzIG5vdCBhdmFpbGFibGUgZm9yIFB5dGhvbiAyLjYKKyAgICAgICAgICAgIHByaW50KCdza2lwcGluZyB0ZXN0X2NpcGhlcnMnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCkKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJULCBjaXBoZXJzPSdOVUxMJykKKworICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIGNpcGhlcnM9VEVTVF9DSVBIRVJTKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQsIGNpcGhlcnM9J05VTEwnKQorCisgICAgZGVmIHRlc3Rfc3NsMl9hbmRfc3NsM19kaXNhYmxlZChzZWxmKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc3NsLCAnUFJPVE9DT0xfU1NMdjMnKToKKyAgICAgICAgICAgIHByaW50KCdQUk9UT0NPTF9TU0x2MyBpcyBub3QgYXZhaWxhYmxlJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCkKKyAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1NTTHYzKQorCisgICAgICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9TU0x2MykKKyAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCkKKworICAgICAgICBpZiBub3QgaGFzYXR0cihzc2wsICdQUk9UT0NPTF9TU0x2MicpOgorICAgICAgICAgICAgcHJpbnQoJ1BST1RPQ09MX1NTTHYyIGlzIG5vdCBhdmFpbGFibGUnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJUKQorICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfU1NMdjIpCisKKyAgICAgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1NTTHYyKQorICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJUKQorCisgICAgZGVmIHRlc3RfbmV3ZXJfdGxzKHNlbGYpOgorICAgICAgICBpZiBub3QgVFNTTFNvY2tldC5faGFzX3NzbF9jb250ZXh0OgorICAgICAgICAgICAgIyB1bml0dGVzdC5za2lwIGlzIG5vdCBhdmFpbGFibGUgZm9yIFB5dGhvbiAyLjYKKyAgICAgICAgICAgIHByaW50KCdza2lwcGluZyB0ZXN0X25ld2VyX3RscycpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc3NsLCAnUFJPVE9DT0xfVExTdjFfMicpOgorICAgICAgICAgICAgcHJpbnQoJ1BST1RPQ09MX1RMU3YxXzIgaXMgbm90IGF2YWlsYWJsZScpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9UTFN2MV8yKQorICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfVExTdjFfMikKKworICAgICAgICBpZiBub3QgaGFzYXR0cihzc2wsICdQUk9UT0NPTF9UTFN2MV8xJyk6CisgICAgICAgICAgICBwcmludCgnUFJPVE9DT0xfVExTdjFfMSBpcyBub3QgYXZhaWxhYmxlJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1RMU3YxXzEpCisgICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9UTFN2MV8xKQorCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNzbCwgJ1BST1RPQ09MX1RMU3YxXzEnKSBvciBub3QgaGFzYXR0cihzc2wsICdQUk9UT0NPTF9UTFN2MV8yJyk6CisgICAgICAgICAgICBwcmludCgnUFJPVE9DT0xfVExTdjFfMSBhbmQvb3IgUFJPVE9DT0xfVExTdjFfMiBpcyBub3QgYXZhaWxhYmxlJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1RMU3YxXzIpCisgICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9UTFN2MV8xKQorCisgICAgZGVmIHRlc3Rfc3NsX2NvbnRleHQoc2VsZik6CisgICAgICAgIGlmIG5vdCBUU1NMU29ja2V0Ll9oYXNfc3NsX2NvbnRleHQ6CisgICAgICAgICAgICAjIHVuaXR0ZXN0LnNraXAgaXMgbm90IGF2YWlsYWJsZSBmb3IgUHl0aG9uIDIuNgorICAgICAgICAgICAgcHJpbnQoJ3NraXBwaW5nIHRlc3Rfc3NsX2NvbnRleHQnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlcnZlcl9jb250ZXh0ID0gc3NsLmNyZWF0ZV9kZWZhdWx0X2NvbnRleHQoc3NsLlB1cnBvc2UuQ0xJRU5UX0FVVEgpCisgICAgICAgIHNlcnZlcl9jb250ZXh0LmxvYWRfY2VydF9jaGFpbihTRVJWRVJfQ0VSVCwgU0VSVkVSX0tFWSkKKyAgICAgICAgc2VydmVyX2NvbnRleHQubG9hZF92ZXJpZnlfbG9jYXRpb25zKENMSUVOVF9DQSkKKyAgICAgICAgc2VydmVyX2NvbnRleHQudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAorICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KHNzbF9jb250ZXh0PXNlcnZlcl9jb250ZXh0KQorCisgICAgICAgIGNsaWVudF9jb250ZXh0ID0gc3NsLmNyZWF0ZV9kZWZhdWx0X2NvbnRleHQoc3NsLlB1cnBvc2UuU0VSVkVSX0FVVEgpCisgICAgICAgIGNsaWVudF9jb250ZXh0LmxvYWRfY2VydF9jaGFpbihDTElFTlRfQ0VSVCwgQ0xJRU5UX0tFWSkKKyAgICAgICAgY2xpZW50X2NvbnRleHQubG9hZF92ZXJpZnlfbG9jYXRpb25zKFNFUlZFUl9DRVJUKQorICAgICAgICBjbGllbnRfY29udGV4dC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECisKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIHNzbF9jb250ZXh0PWNsaWVudF9jb250ZXh0KQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbG9nZ2luZy5iYXNpY0NvbmZpZyhsZXZlbD1sb2dnaW5nLldBUk4pCisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRTU0xTb2NrZXQgaW1wb3J0IFRTU0xTb2NrZXQsIFRTU0xTZXJ2ZXJTb2NrZXQsIF9tYXRjaF9oYXNfaXBhZGRyZXNzCisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRFeGNlcHRpb24KKworICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3Rlc3QvdGhyaWZ0X2pzb24ucHkgYi9saWIvcHkvdGVzdC90aHJpZnRfanNvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGU3YTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3Rlc3QvdGhyaWZ0X2pzb24ucHkKQEAgLTAsMCArMSw1MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorCitpbXBvcnQgX2ltcG9ydF9sb2NhbF90aHJpZnQgICMgbm9xYQorZnJvbSB0aHJpZnQucHJvdG9jb2wuVEpTT05Qcm90b2NvbCBpbXBvcnQgVEpTT05Qcm90b2NvbAorZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CisKKyMKKyMgSW4gb3JkZXIgdG8gcnVuIHRoZSB0ZXN0IHVuZGVyIFdpbmRvd3MuIFdlIG5lZWQgdG8gY3JlYXRlIHN5bWJvbGljIGxpbmsKKyMgbmFtZSAndGhyaWZ0JyB0byAnLi4vc3JjJyBmb2xkZXIgYnkgdXNpbmc6CisjCisjIG1rbGluayAvRCB0aHJpZnQgLi5cc3JjCisjCisKKworY2xhc3MgVGVzdEpTT05TdHJpbmcodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZXNjYXBlZF91bmljb2RlX3N0cmluZyhzZWxmKToKKyAgICAgICAgdW5pY29kZV9qc29uID0gYiciaGVsbG8gXFx1MGUwMVxcdTBlMDJcXHUwZTAzXFx1ZDgzNVxcdWRjYWJcXHVkYjQwXFx1ZGM3MCB1bmljb2RlIicKKyAgICAgICAgdW5pY29kZV90ZXh0ID0gdSdoZWxsbyBcdTBlMDFcdTBlMDJcdTBlMDNcVTAwMDFENEFCXFUwMDBFMDA3MCB1bmljb2RlJworCisgICAgICAgIGJ1ZiA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcih1bmljb2RlX2pzb24pCisgICAgICAgIHRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpLmdldFRyYW5zcG9ydChidWYpCisgICAgICAgIHByb3RvY29sID0gVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpCisKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA9PSAyOgorICAgICAgICAgICAgdW5pY29kZV90ZXh0ID0gdW5pY29kZV90ZXh0LmVuY29kZSgndXRmOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG9jb2wucmVhZFN0cmluZygpLCB1bmljb2RlX3RleHQpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9yYi9DSEFOR0VMT0cgYi9saWIvcmIvQ0hBTkdFTE9HCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWRjZTJhLi4wMDAwMDAwCi0tLSBhL2xpYi9yYi9DSEFOR0VMT0cKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi12MC4wLjEuIEluaXRpYWwgcmVsZWFzZQpkaWZmIC0tZ2l0IGEvbGliL3JiL0dlbWZpbGUgYi9saWIvcmIvR2VtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzg2YWY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL0dlbWZpbGUKQEAgLTAsMCArMSw0IEBACitzb3VyY2UgImh0dHA6Ly9ydWJ5Z2Vtcy5vcmciCisKK2dlbXNwZWMKKwpkaWZmIC0tZ2l0IGEvbGliL3JiL01ha2VmaWxlLmFtIGIvbGliL3JiL01ha2VmaWxlLmFtCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMzljMDRkOS4uMTM3ZWRiNAotLS0gYS9saWIvcmIvTWFrZWZpbGUuYW0KKysrIGIvbGliL3JiL01ha2VmaWxlLmFtCkBAIC0xNywzMyArMTcsMzUgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK0RFU1RESVIgPz0gLworCitpZiBIQVZFX0JVTkRMRVIKKworYWxsLWxvY2FsOgorCSQoQlVORExFUikgaW5zdGFsbAorCSQoQlVORExFUikgZXhlYyByYWtlIGJ1aWxkX2V4dAorCitpbnN0YWxsLWV4ZWMtaG9vazoKKwkkKEJVTkRMRVIpIGV4ZWMgcmFrZSBpbnN0YWxsCisKK2NsZWFuLWxvY2FsOgorCSQoQlVORExFUikgaW5zdGFsbAorCSQoQlVORExFUikgZXhlYyByYWtlIGNsZWFuCisKK2NoZWNrLWxvY2FsOiBhbGwKKwkkKEJVTkRMRVIpIGluc3RhbGwKKwkkKEJVTkRMRVIpIGV4ZWMgcmFrZQorCitlbmRpZgorCiBFWFRSQV9ESVNUID0gXAotCUNIQU5HRUxPRyBcCisJY29kaW5nX3N0YW5kYXJkcy5tZCBcCiAJUmFrZWZpbGUgXAotCU1hbmlmZXN0IFwKLQlzZXR1cC5yYiBcCisJR2VtZmlsZSBcCisJdGhyaWZ0LmdlbXNwZWMgXAogCWxpYiBcCiAJZXh0IFwKIAliZW5jaG1hcmsgXAogCXNjcmlwdCBcCi0Jc3BlYwotCi1ERVNURElSID89IC8KLQotYWxsLWxvY2FsOgotCWlmIFsgLW4gIiQoUlVCWV9QUkVGSVgpIiBdIDsgdGhlbiAkKFJVQlkpIHNldHVwLnJiIGNvbmZpZyAtLXByZWZpeD0kKERFU1RESVIpJChSVUJZX1BSRUZJWCkgLS1yYmRpcj0nJCRsaWJkaXIvcnVieScgLS1zb2Rpcj0nJCRsaWJkaXIvcnVieScgOyBlbGlmIFsgLW4gIiQoREVTVERJUikiIF0gOyB0aGVuICQoUlVCWSkgc2V0dXAucmIgY29uZmlnIC0tcHJlZml4PSQoREVTVERJUikgOyBlbHNlICQoUlVCWSkgc2V0dXAucmIgY29uZmlnIDsgZmkKLQkkKFJVQlkpIHNldHVwLnJiIHNldHVwCi0KLWluc3RhbGwtZXhlYy1ob29rOgotCSQoUlVCWSkgc2V0dXAucmIgaW5zdGFsbCAtLXByZWZpeD0kKERFU1RESVIpCi0KLSMgTWFrZSBzdXJlIHRoaXMgZG9lc24ndCBmYWlsIGlmIFJ1YnkgaXMgbm90IGNvbmZpZ3VyZWQuCi1jbGVhbi1sb2NhbDoKLQlSVUJZPSQoUlVCWSkgOyBpZiB0ZXN0IC16ICIkJFJVQlkiIDsgdGhlbiBSVUJZPTogOyBmaSA7IFwKLQkkJFJVQlkgc2V0dXAucmIgY2xlYW4KLQotY2hlY2stbG9jYWw6IGFsbAotaWYgSEFWRV9SU1BFQwotCXJha2Ugc3BlYwotZW5kaWYKLQorCXNwZWMgXAorCVJFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL3JiL01hbmlmZXN0IGIvbGliL3JiL01hbmlmZXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDFmMDMxLi4wMDAwMDAwCi0tLSBhL2xpYi9yYi9NYW5pZmVzdAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLUNIQU5HRUxPRwotTWFuaWZlc3QKLVJha2VmaWxlCi1SRUFETUUKLXNldHVwLnJiCi1iZW5jaG1hcmsvYmVuY2htYXJrLnJiCi1iZW5jaG1hcmsvQmVuY2htYXJrLnRocmlmdAotYmVuY2htYXJrL2NsaWVudC5yYgotYmVuY2htYXJrL3NlcnZlci5yYgotYmVuY2htYXJrL3RoaW5fc2VydmVyLnJiCi1leHQvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkLmMKLWV4dC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQuaAotZXh0L2NvbXBhY3RfcHJvdG9jb2wuYwotZXh0L2NvbXBhY3RfcHJvdG9jb2wuaAotZXh0L2NvbnN0YW50cy5oCi1leHQvZXh0Y29uZi5yYgotZXh0L21hY3Jvcy5oCi1leHQvbWVtb3J5X2J1ZmZlci5jCi1leHQvbWVtb3J5X2J1ZmZlci5oCi1leHQvcHJvdG9jb2wuYwotZXh0L3Byb3RvY29sLmgKLWV4dC9zdHJ1Y3QuYwotZXh0L3N0cnVjdC5oCi1leHQvdGhyaWZ0X25hdGl2ZS5jCi1saWIvdGhyaWZ0LnJiCi1saWIvdGhyaWZ0L2NsaWVudC5yYgotbGliL3RocmlmdC9jb3JlX2V4dC5yYgotbGliL3RocmlmdC9leGNlcHRpb25zLnJiCi1saWIvdGhyaWZ0L3Byb2Nlc3Nvci5yYgotbGliL3RocmlmdC9zdHJ1Y3QucmIKLWxpYi90aHJpZnQvc3RydWN0X3VuaW9uLnJiCi1saWIvdGhyaWZ0L3VuaW9uLnJiCi1saWIvdGhyaWZ0L3RocmlmdF9uYXRpdmUucmIKLWxpYi90aHJpZnQvdHlwZXMucmIKLWxpYi90aHJpZnQvY29yZV9leHQvZml4bnVtLnJiCi1saWIvdGhyaWZ0L3Byb3RvY29sL2Jhc2VfcHJvdG9jb2wucmIKLWxpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sLnJiCi1saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5yYgotbGliL3RocmlmdC9wcm90b2NvbC9jb21wYWN0X3Byb3RvY29sLnJiCi1saWIvdGhyaWZ0L3NlcmlhbGl6ZXIvZGVzZXJpYWxpemVyLnJiCi1saWIvdGhyaWZ0L3NlcmlhbGl6ZXIvc2VyaWFsaXplci5yYgotbGliL3RocmlmdC9zZXJ2ZXIvYmFzZV9zZXJ2ZXIucmIKLWxpYi90aHJpZnQvc2VydmVyL21vbmdyZWxfaHR0cF9zZXJ2ZXIucmIKLWxpYi90aHJpZnQvc2VydmVyL25vbmJsb2NraW5nX3NlcnZlci5yYgotbGliL3RocmlmdC9zZXJ2ZXIvc2ltcGxlX3NlcnZlci5yYgotbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkX3Bvb2xfc2VydmVyLnJiCi1saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRlZF9zZXJ2ZXIucmIKLWxpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2Vfc2VydmVyX3RyYW5zcG9ydC5yYgotbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV90cmFuc3BvcnQucmIKLWxpYi90aHJpZnQvdHJhbnNwb3J0L2J1ZmZlcmVkX3RyYW5zcG9ydC5yYgotbGliL3RocmlmdC90cmFuc3BvcnQvZnJhbWVkX3RyYW5zcG9ydC5yYgotbGliL3RocmlmdC90cmFuc3BvcnQvaHR0cF9jbGllbnRfdHJhbnNwb3J0LnJiCi1saWIvdGhyaWZ0L3RyYW5zcG9ydC9pb19zdHJlYW1fdHJhbnNwb3J0LnJiCi1saWIvdGhyaWZ0L3RyYW5zcG9ydC9tZW1vcnlfYnVmZmVyX3RyYW5zcG9ydC5yYgotbGliL3RocmlmdC90cmFuc3BvcnQvc2VydmVyX3NvY2tldC5yYgotbGliL3RocmlmdC90cmFuc3BvcnQvc29ja2V0LnJiCi1saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NlcnZlcl9zb2NrZXQucmIKLWxpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc29ja2V0LnJiCi1zY3JpcHQvcHJvdG9fYmVuY2htYXJrLnJiCi1zY3JpcHQvcmVhZF9zdHJ1Y3QucmIKLXNjcmlwdC93cml0ZV9zdHJ1Y3QucmIKLXNwZWMvYmFzZV9wcm90b2NvbF9zcGVjLnJiCi1zcGVjL2Jhc2VfdHJhbnNwb3J0X3NwZWMucmIKLXNwZWMvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkX3NwZWMucmIKLXNwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWMucmIKLXNwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWNfc2hhcmVkLnJiCi1zcGVjL2NsaWVudF9zcGVjLnJiCi1zcGVjL2NvbXBhY3RfcHJvdG9jb2xfc3BlYy5yYgotc3BlYy9leGNlcHRpb25fc3BlYy5yYgotc3BlYy9odHRwX2NsaWVudF9zcGVjLnJiCi1zcGVjL21vbmdyZWxfaHR0cF9zZXJ2ZXJfc3BlYy5yYgotc3BlYy9ub25ibG9ja2luZ19zZXJ2ZXJfc3BlYy5yYgotc3BlYy9wcm9jZXNzb3Jfc3BlYy5yYgotc3BlYy9zZXJpYWxpemVyX3NwZWMucmIKLXNwZWMvc2VydmVyX3NvY2tldF9zcGVjLnJiCi1zcGVjL3NlcnZlcl9zcGVjLnJiCi1zcGVjL3NvY2tldF9zcGVjLnJiCi1zcGVjL3NvY2tldF9zcGVjX3NoYXJlZC5yYgotc3BlYy9zcGVjX2hlbHBlci5yYgotc3BlYy9zdHJ1Y3Rfc3BlYy5yYgotc3BlYy91bmlvbl9zcGVjLnJiCi1zcGVjL1RocmlmdFNwZWMudGhyaWZ0Ci1zcGVjL3R5cGVzX3NwZWMucmIKLXNwZWMvdW5peF9zb2NrZXRfc3BlYy5yYgpkaWZmIC0tZ2l0IGEvbGliL3JiL1JFQURNRSBiL2xpYi9yYi9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9yYi9SRUFETUUKcmVuYW1lIHRvIGxpYi9yYi9SRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9yYi9SYWtlZmlsZSBiL2xpYi9yYi9SYWtlZmlsZQppbmRleCA2ZWI0ZjY4Li41ZTVlNWFjIDEwMDY0NAotLS0gYS9saWIvcmIvUmFrZWZpbGUKKysrIGIvbGliL3JiL1Jha2VmaWxlCkBAIC0xOSw4NiArMTksMTAyIEBACiAKIHJlcXVpcmUgJ3J1YnlnZW1zJwogcmVxdWlyZSAncmFrZScKLXJlcXVpcmUgJ3NwZWMvcmFrZS9zcGVjdGFzaycKK3JlcXVpcmUgJ3Jha2UvY2xlYW4nCityZXF1aXJlICdyc3BlYy9jb3JlL3Jha2VfdGFzaycKIAogVEhSSUZUID0gJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQnCiAKLXRhc2sgOmRlZmF1bHQgPT4gWzpzcGVjXQordGFzayA6ZGVmYXVsdCA9PiBbOmdlbV0KK3Rhc2sgOnNwZWMgPT4gWzonZ2VuLXJiJywgOmJ1aWxkX2V4dCwgOnJlYWxzcGVjXQogCi10YXNrIDpzcGVjID0+IFs6J2dlbi1yYicsIDpyZWFsc3BlY10KLQotU3BlYzo6UmFrZTo6U3BlY1Rhc2submV3KDpyZWFsc3BlYykgZG8gfHR8Ci0gIHQuc3BlY19maWxlcyA9IEZpbGVMaXN0WydzcGVjLyoqLypfc3BlYy5yYiddCi0gIHQuc3BlY19vcHRzID0gWyctLWNvbG9yJ10KK1JTcGVjOjpDb3JlOjpSYWtlVGFzay5uZXcoOnJlYWxzcGVjKSBkbyB8dHwKKyAgdC5yc3BlY19vcHRzID0gWyctLWNvbG9yJywgJy0tZm9ybWF0IGQnXQogZW5kCiAKLVNwZWM6OlJha2U6OlNwZWNUYXNrLm5ldyg6J3NwZWM6cmNvdicpIGRvIHx0fAotICB0LnNwZWNfZmlsZXMgPSBGaWxlTGlzdFsnc3BlYy8qKi8qX3NwZWMucmInXQotICB0LnNwZWNfb3B0cyA9IFsnLS1jb2xvciddCitSU3BlYzo6Q29yZTo6UmFrZVRhc2submV3KDonc3BlYzpyY292JykgZG8gfHR8CisgIHQucnNwZWNfb3B0cyA9IFsnLS1jb2xvcicsICctLWZvcm1hdCBkJ10KICAgdC5yY292ID0gdHJ1ZQogICB0LnJjb3Zfb3B0cyA9IFsnLS1leGNsdWRlJywgJ15zcGVjLC9nZW1zLyddCiBlbmQKIAotZGVzYyAnUnVuIHRoZSBjb21waWxlciB0ZXN0cyAocmVxdWlyZXMgZnVsbCB0aHJpZnQgY2hlY2tvdXQpJwotdGFzayA6dGVzdCBkbwotICAjIGVuc3VyZSB0aGlzIGlzIGEgZnVsbCB0aHJpZnQgY2hlY2tvdXQgYW5kIG5vdCBhIHRhcmJhbGwgb2YgdGhlIHJ1YnkgbGlicwotICBjbWQgPSAnaGVhZCAtMSAuLi8uLi9SRUFETUUgMj4vZGV2L251bGwgfCBncmVwIFRocmlmdCA+L2Rldi9udWxsIDI+L2Rldi9udWxsJwotICBzeXN0ZW0oY21kKSBvciBmYWlsICJyYWtlIHRlc3QgcmVxdWlyZXMgYSBmdWxsIHRocmlmdCBjaGVja291dCIKLSAgc2ggJ21ha2UnLCAnLUMnLCBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgIi8uLi8uLi90ZXN0L3JiIiwgImNoZWNrIgotZW5kCi0KIGRlc2MgJ0NvbXBpbGUgdGhlIC50aHJpZnQgZmlsZXMgZm9yIHRoZSBzcGVjcycKLXRhc2sgOidnZW4tcmInID0+IFs6J2dlbi1yYjpzcGVjJywgOidnZW4tcmI6YmVuY2htYXJrJywgOidnZW4tcmI6ZGVidWdfcHJvdG8nXQotCit0YXNrIDonZ2VuLXJiJyA9PiBbOidnZW4tcmI6c3BlYycsIDonZ2VuLXJiOm5hbWVzcGFjZWRfc3BlYycsIDonZ2VuLXJiOmZsYXRfc3BlYycsIDonZ2VuLXJiOmJlbmNobWFyaycsIDonZ2VuLXJiOmRlYnVnX3Byb3RvJ10KIG5hbWVzcGFjZSA6J2dlbi1yYicgZG8KICAgdGFzayA6J3NwZWMnIGRvCiAgICAgZGlyID0gRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlYycKICAgICBzaCBUSFJJRlQsICctLWdlbicsICdyYicsICctbycsIGRpciwgIiN7ZGlyfS9UaHJpZnRTcGVjLnRocmlmdCIKICAgZW5kCiAKKyAgdGFzayA6J25hbWVzcGFjZWRfc3BlYycgZG8KKyAgICBkaXIgPSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjJworICAgIHNoIFRIUklGVCwgJy0tZ2VuJywgJ3JiOm5hbWVzcGFjZWQnLCAnLS1yZWN1cnNlJywgJy1vJywgZGlyLCAiI3tkaXJ9L1RocmlmdE5hbWVzcGFjZWRTcGVjLnRocmlmdCIKKyAgICBzaCBUSFJJRlQsICctLWdlbicsICdyYjpuYW1lc3BhY2VkJywgJy0tcmVjdXJzZScsICctbycsIGRpciwgIiN7ZGlyfS9CYXNlU2VydmljZS50aHJpZnQiCisgICAgc2ggVEhSSUZULCAnLS1nZW4nLCAncmI6bmFtZXNwYWNlZCcsICctLXJlY3Vyc2UnLCAnLW8nLCBkaXIsICIje2Rpcn0vRXh0ZW5kZWRTZXJ2aWNlLnRocmlmdCIKKyAgZW5kCisKKyAgdGFzayA6J2ZsYXRfc3BlYycgZG8KKyAgICBkaXIgPSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjJworICAgIG1rZGlyX3AoIiN7ZGlyfS9nZW4tcmIvZmxhdCIpCisgICAgc2ggVEhSSUZULCAnLS1nZW4nLCAncmInLCAnLS1yZWN1cnNlJywgJy1vdXQnLCAiI3tkaXJ9L2dlbi1yYi9mbGF0IiwgIiN7ZGlyfS9UaHJpZnROYW1lc3BhY2VkU3BlYy50aHJpZnQiCisgIGVuZAorCiAgIHRhc2sgOidiZW5jaG1hcmsnIGRvCiAgICAgZGlyID0gRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvYmVuY2htYXJrJwogICAgIHNoIFRIUklGVCwgJy0tZ2VuJywgJ3JiJywgJy1vJywgZGlyLCAiI3tkaXJ9L0JlbmNobWFyay50aHJpZnQiCiAgIGVuZAogICAKICAgdGFzayA6J2RlYnVnX3Byb3RvJyBkbwotICAgIHNoICJta2RpciIsICItcCIsICJkZWJ1Z19wcm90b190ZXN0IgotICAgIHNoIFRIUklGVCwgJy0tZ2VuJywgJ3JiJywgIi1vIiwgImRlYnVnX3Byb3RvX3Rlc3QiLCAiLi4vLi4vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQiCisgICAgc2ggIm1rZGlyIiwgIi1wIiwgInRlc3QvZGVidWdfcHJvdG8iCisgICAgc2ggVEhSSUZULCAnLS1nZW4nLCAncmInLCAiLW8iLCAidGVzdC9kZWJ1Z19wcm90byIsICIuLi8uLi90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCIKICAgZW5kCiBlbmQKIAorZGVzYyAiQnVpbGQgdGhlIG5hdGl2ZSBsaWJyYXJ5IgordGFzayA6YnVpbGRfZXh0ID0+IDonZ2VuLXJiJyBkbworICAgbmV4dCBpZiBkZWZpbmVkPyhSVUJZX0VOR0lORSkgJiYgUlVCWV9FTkdJTkUgPX4gL2pydWJ5LworICAgRGlyOjpjaGRpcihGaWxlOjpkaXJuYW1lKCdleHQvZXh0Y29uZi5yYicpKSBkbworICAgICAgdW5sZXNzIHNoICJydWJ5ICN7RmlsZTo6YmFzZW5hbWUoJ2V4dC9leHRjb25mLnJiJyl9IgorICAgICAgICAkc3RkZXJyLnB1dHMgIkZhaWxlZCB0byBydW4gZXh0Y29uZiIKKyAgICAgICAgICBicmVhaworICAgICAgZW5kCisgICAgICB1bmxlc3Mgc2ggIm1ha2UiCisgICAgICAgICRzdGRlcnIucHV0cyAibWFrZSBmYWlsZWQiCisgICAgICAgIGJyZWFrCisgICAgICBlbmQKKyAgICBlbmQKK2VuZAorCitkZXNjICdSdW4gdGhlIGNvbXBpbGVyIHRlc3RzIChyZXF1aXJlcyBmdWxsIHRocmlmdCBjaGVja291dCknCit0YXNrIDp0ZXN0IGRvCisgICMgZW5zdXJlIHRoaXMgaXMgYSBmdWxsIHRocmlmdCBjaGVja291dCBhbmQgbm90IGEgdGFyYmFsbCBvZiB0aGUgcnVieSBsaWJzCisgIGNtZCA9ICdoZWFkIC0xIC4uLy4uL1JFQURNRS5tZCAyPi9kZXYvbnVsbCB8IGdyZXAgVGhyaWZ0ID4vZGV2L251bGwgMj4vZGV2L251bGwnCisgIHN5c3RlbShjbWQpIG9yIGZhaWwgInJha2UgdGVzdCByZXF1aXJlcyBhIGZ1bGwgdGhyaWZ0IGNoZWNrb3V0IgorICBzaCAnbWFrZScsICctQycsIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAiLy4uLy4uL3Rlc3QvcmIiLCAiY2hlY2siCitlbmQKKwogZGVzYyAnUnVuIGJlbmNobWFya2luZyBvZiBOb25ibG9ja2luZ1NlcnZlcicKIHRhc2sgOmJlbmNobWFyayBkbwogICBydWJ5ICdiZW5jaG1hcmsvYmVuY2htYXJrLnJiJwogZW5kCiAKLQotYmVnaW4KLSAgcmVxdWlyZSAnZWNob2UnCi0KLSAgRWNob2UubmV3KCd0aHJpZnQnKSBkbyB8cHwKLSAgICBwLmF1dGhvciA9IFsnVGhyaWZ0IERldmVsb3BlcnMnXQotICAgIHAuZW1haWwgPSBbJ2RldkB0aHJpZnQuYXBhY2hlLm9yZyddCi0gICAgcC5zdW1tYXJ5ID0gIlJ1YnkgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0iCi0gICAgcC51cmwgPSAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIgotICAgIHAuaW5jbHVkZV9yYWtlZmlsZSA9IHRydWUKLSAgICBwLnZlcnNpb24gPSAiMC43LjAiCi0gICAgcC5ydWJ5Z2Vtc192ZXJzaW9uID0gIj49IDEuMi4wIgotICBlbmQKLQotICB0YXNrIDppbnN0YWxsID0+IFs6Y2hlY2tfc2l0ZV9saWJdCi0KLSAgcmVxdWlyZSAncmJjb25maWcnCi0gIHRhc2sgOmNoZWNrX3NpdGVfbGliIGRvCi0gICAgaWYgRmlsZS5leGlzdD8oRmlsZS5qb2luKENvbmZpZzo6Q09ORklHWydzaXRlbGliZGlyJ10sICd0aHJpZnQucmInKSkKLSAgICAgIGZhaWwgInRocmlmdCBpcyBhbHJlYWR5IGluc3RhbGxlZCBpbiBzaXRlX3J1YnkiCi0gICAgZW5kCi0gIGVuZAotcmVzY3VlIExvYWRFcnJvcgotICBbOmluc3RhbGwsIDpwYWNrYWdlXS5lYWNoIGRvIHx0fAotICAgIGRlc2MgIlN0dWIgZm9yICN7dH0iCi0gICAgdGFzayB0IGRvCi0gICAgICBmYWlsICJUaGUgRWNob2UgZ2VtIGlzIHJlcXVpcmVkIGZvciB0aGlzIHRhc2siCi0gICAgZW5kCitkZXNjICdCdWlsZHMgdGhlIHRocmlmdCBnZW0nCit0YXNrIDpnZW0gPT4gWzpzcGVjLCA6YnVpbGRfZXh0XSBkbworICB1bmxlc3Mgc2ggJ2dlbScsICdidWlsZCcsICd0aHJpZnQuZ2Vtc3BlYycKKyAgICAkc3RkZXJyLnB1dHMgIkZhaWxlZCB0byBidWlsZCB0aHJpZnQgZ2VtIgorICAgIGJyZWFrCiAgIGVuZAogZW5kCisKK2Rlc2MgJ0luc3RhbGwgdGhlIHRocmlmdCBnZW0nCit0YXNrIDppbnN0YWxsID0+IFs6Z2VtXSBkbworICB1bmxlc3Mgc2ggJ2dlbScsICdpbnN0YWxsJywgRGlyLmdsb2IoJ3RocmlmdC0qLmdlbScpLmxhc3QKKyAgICAkc3RkZXJyLnB1dHMgIkZhaWxlZCB0byBpbnN0YWxsIHRocmlmdCBnZW0iCisgICAgYnJlYWsKKyAgZW5kCitlbmQKKworQ0xFQU4uaW5jbHVkZSBbCisgICcuYnVuZGxlJywgJ2JlbmNobWFyay9nZW4tcmInLCAnY292ZXJhZ2UnLCAnZXh0Lyoue28sYnVuZGxlLHNvLGRsbH0nLCAnZXh0L21rbWYubG9nJywKKyAgJ2V4dC9NYWtlZmlsZScsICdleHQvY29uZnRlc3QuZFNZTScsICdHZW1maWxlLmxvY2snLCAnbWttZi5sb2cnLCAncGtnJywgICdzcGVjL2dlbi1yYicsCisgICd0ZXN0JywgJ3RocmlmdC0qLmdlbScKK10KZGlmZiAtLWdpdCBhL2xpYi9yYi9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL3JiL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQuYyBiL2xpYi9yYi9leHQvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkLmMKaW5kZXggYmQxYzJkYS4uNjVjYmU1ZiAxMDA2NDQKLS0tIGEvbGliL3JiL2V4dC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQuYworKysgYi9saWIvcmIvZXh0L2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5jCkBAIC0yMiw3ICsyMiw4IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8Y29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8c3RydWN0Lmg+Ci0jaW5jbHVkZSAibWFjcm9zLmgiCisjaW5jbHVkZSA8bWFjcm9zLmg+CisjaW5jbHVkZSA8Ynl0ZXMuaD4KIAogVkFMVUUgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19uYXRpdmVfcW1hcmsoVkFMVUUgc2VsZikgewogICByZXR1cm4gUXRydWU7CkBAIC03OCw4ICs3OSw5IEBACiAKIHN0YXRpYyB2b2lkIHdyaXRlX3N0cmluZ19kaXJlY3QoVkFMVUUgdHJhbnMsIFZBTFVFIHN0cikgewogICBpZiAoVFlQRShzdHIpICE9IFRfU1RSSU5HKSB7Ci0gICAgcmJfcmFpc2UocmJfZVN0YW5kYXJkRXJyb3IsICJWYWx1ZSBzaG91bGQgYmUgYSBzdHJpbmciKTsgICAgCisgICAgcmJfcmFpc2UocmJfZVN0YW5kYXJkRXJyb3IsICJWYWx1ZSBzaG91bGQgYmUgYSBzdHJpbmciKTsKICAgfQorICBzdHIgPSBjb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIoc3RyKTsKICAgd3JpdGVfaTMyX2RpcmVjdCh0cmFucywgUlNUUklOR19MRU4oc3RyKSk7CiAgIHJiX2Z1bmNhbGwodHJhbnMsIHdyaXRlX21ldGhvZF9pZCwgMSwgc3RyKTsKIH0KQEAgLTIxNywxMSArMjE5LDIxIEBACiAgIHJldHVybiBRbmlsOwogfQogCitWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3dyaXRlX2JpbmFyeShWQUxVRSBzZWxmLCBWQUxVRSBidWYpIHsKKyAgQ0hFQ0tfTklMKGJ1Zik7CisgIFZBTFVFIHRyYW5zID0gR0VUX1RSQU5TUE9SVChzZWxmKTsKKyAgYnVmID0gZm9yY2VfYmluYXJ5X2VuY29kaW5nKGJ1Zik7CisgIHdyaXRlX2kzMl9kaXJlY3QodHJhbnMsIFJTVFJJTkdfTEVOKGJ1ZikpOworICByYl9mdW5jYWxsKHRyYW5zLCB3cml0ZV9tZXRob2RfaWQsIDEsIGJ1Zik7CisgIHJldHVybiBRbmlsOworfQorCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gaW50ZXJmYWNlIHJlYWRpbmcgbWV0aG9kcwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVkFMVUUgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX3N0cmluZyhWQUxVRSBzZWxmKTsKK1ZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9iaW5hcnkoVkFMVUUgc2VsZik7CiBWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfYnl0ZShWQUxVRSBzZWxmKTsKIFZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9pMzIoVkFMVUUgc2VsZik7CiBWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfaTE2KFZBTFVFIHNlbGYpOwpAQCAtMjcxLDI3ICsyODMsMjcgQEAKICAgcmV0dXJuIFFuaWw7CiB9CiAKLVZBTFVFIHJiX3RoaWZ0X2JpbmFyeV9wcm90b19yZWFkX3N0cnVjdF9iZWdpbihWQUxVRSBzZWxmKSB7CitWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2JlZ2luKFZBTFVFIHNlbGYpIHsKICAgcmV0dXJuIFFuaWw7CiB9CiAKLVZBTFVFIHJiX3RoaWZ0X2JpbmFyeV9wcm90b19yZWFkX3N0cnVjdF9lbmQoVkFMVUUgc2VsZikgeworVkFMVUUgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX3N0cnVjdF9lbmQoVkFMVUUgc2VsZikgewogICByZXR1cm4gUW5pbDsKIH0KIAotVkFMVUUgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfZmllbGRfZW5kKFZBTFVFIHNlbGYpIHsKK1ZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9maWVsZF9lbmQoVkFMVUUgc2VsZikgewogICByZXR1cm4gUW5pbDsKIH0KIAotVkFMVUUgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfbWFwX2VuZChWQUxVRSBzZWxmKSB7CitWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfbWFwX2VuZChWQUxVRSBzZWxmKSB7CiAgIHJldHVybiBRbmlsOwogfQogCi1WQUxVRSByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9saXN0X2VuZChWQUxVRSBzZWxmKSB7CitWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfbGlzdF9lbmQoVkFMVUUgc2VsZikgewogICByZXR1cm4gUW5pbDsKIH0KIAotVkFMVUUgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc2V0X2VuZChWQUxVRSBzZWxmKSB7CitWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc2V0X2VuZChWQUxVRSBzZWxmKSB7CiAgIHJldHVybiBRbmlsOwogfQogCkBAIC0zNzksNiArMzkxLDExIEBACiB9CiAKIFZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJpbmcoVkFMVUUgc2VsZikgeworICBWQUxVRSBidWZmZXIgPSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfYmluYXJ5KHNlbGYpOworICByZXR1cm4gY29udmVydF90b19zdHJpbmcoYnVmZmVyKTsKK30KKworVkFMVUUgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2JpbmFyeShWQUxVRSBzZWxmKSB7CiAgIGludCBzaXplID0gcmVhZF9pMzJfZGlyZWN0KHNlbGYpOwogICByZXR1cm4gUkVBRChzZWxmLCBzaXplKTsKIH0KQEAgLTQwNyw2ICs0MjQsNyBAQAogICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgIndyaXRlX2k2NCIsICAgICAgICAgICByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3dyaXRlX2k2NCwgMSk7CiAgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAid3JpdGVfZG91YmxlIiwgICAgICAgIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fd3JpdGVfZG91YmxlLCAxKTsKICAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJ3cml0ZV9zdHJpbmciLCAgICAgICAgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b193cml0ZV9zdHJpbmcsIDEpOworICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgIndyaXRlX2JpbmFyeSIsICAgICAgICByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3dyaXRlX2JpbmFyeSwgMSk7CiAgIC8vIHVudXNlZCBtZXRob2RzCiAgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAid3JpdGVfbWVzc2FnZV9lbmQiLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3dyaXRlX21lc3NhZ2VfZW5kLCAwKTsKICAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJ3cml0ZV9zdHJ1Y3RfYmVnaW4iLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3dyaXRlX3N0cnVjdF9iZWdpbiwgMSk7CkBAIC00MjgsMTQgKzQ0NiwxNSBAQAogICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfaTY0IiwgICAgICAgICAgICByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfaTY0LCAwKTsKICAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX2RvdWJsZSIsICAgICAgICAgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2RvdWJsZSwgMCk7CiAgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9zdHJpbmciLCAgICAgICAgIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJpbmcsIDApOworICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfYmluYXJ5IiwgICAgICAgICByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfYmluYXJ5LCAwKTsKICAgLy8gdW51c2VkIG1ldGhvZHMKICAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX21lc3NhZ2VfZW5kIiwgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX21lc3NhZ2VfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX3N0cnVjdF9iZWdpbiIsIHJiX3RoaWZ0X2JpbmFyeV9wcm90b19yZWFkX3N0cnVjdF9iZWdpbiwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9zdHJ1Y3RfZW5kIiwgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9maWVsZF9lbmQiLCByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9maWVsZF9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfbWFwX2VuZCIsIHJiX3RoaWZ0X2JpbmFyeV9wcm90b19yZWFkX21hcF9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfbGlzdF9lbmQiLCByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9saXN0X2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9zZXRfZW5kIiwgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc2V0X2VuZCwgMCk7CisgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9zdHJ1Y3RfYmVnaW4iLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2JlZ2luLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX3N0cnVjdF9lbmQiLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2VuZCwgMCk7CisgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9maWVsZF9lbmQiLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfZmllbGRfZW5kLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX21hcF9lbmQiLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfbWFwX2VuZCwgMCk7CisgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9saXN0X2VuZCIsIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9saXN0X2VuZCwgMCk7CisgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9zZXRfZW5kIiwgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX3NldF9lbmQsIDApOwogCiAgIHJidWZfaXZhcl9pZCA9IHJiX2ludGVybigiQHJidWYiKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9yYi9leHQvYnl0ZXMuYyBiL2xpYi9yYi9leHQvYnl0ZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTZmYWM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL2V4dC9ieXRlcy5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxydWJ5Lmg+CisjaWZkZWYgSEFWRV9SVUJZX0VOQ09ESU5HX0gKKyNpbmNsdWRlIDxydWJ5L2VuY29kaW5nLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxjb25zdGFudHMuaD4KKworVkFMVUUgZm9yY2VfYmluYXJ5X2VuY29kaW5nKFZBTFVFIGJ1ZmZlcikgeworICByZXR1cm4gcmJfZnVuY2FsbCh0aHJpZnRfYnl0ZXNfbW9kdWxlLCBmb3JjZV9iaW5hcnlfZW5jb2RpbmdfaWQsIDEsIGJ1ZmZlcik7Cit9CisKK1ZBTFVFIGNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcihWQUxVRSBzdHJpbmcpIHsKKyAgcmV0dXJuIHJiX2Z1bmNhbGwodGhyaWZ0X2J5dGVzX21vZHVsZSwgY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyX2lkLCAxLCBzdHJpbmcpOworfQorCitWQUxVRSBjb252ZXJ0X3RvX3N0cmluZyhWQUxVRSB1dGY4X2J1ZmZlcikgeworICByZXR1cm4gcmJfZnVuY2FsbCh0aHJpZnRfYnl0ZXNfbW9kdWxlLCBjb252ZXJ0X3RvX3N0cmluZ19pZCwgMSwgdXRmOF9idWZmZXIpOworfQpkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC9ieXRlcy5oIGIvbGliL3JiL2V4dC9ieXRlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMDhkODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvZXh0L2J5dGVzLmgKQEAgLTAsMCArMSwzMSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHJ1YnkuaD4KKworLyoKKyAqIEEgY29sbGVjdGlvbiBvZiB1dGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCBieXRlcyBhbmQgYnl0ZSBidWZmZXJzLgorICoKKyAqIFRoZXNlIG1ldGhvZHMgYXJlIHRoZSBuYXRpdmUgYW5hbG9naWVzIHRvIHNvbWUgb2YgdGhlIG1ldGhvZHMgaW4KKyAqIFRocmlmdDo6Qnl0ZXMgKHRocmlmdC9ieXRlcy5yYikuCisgKi8KKworVkFMVUUgZm9yY2VfYmluYXJ5X2VuY29kaW5nKFZBTFVFIGJ1ZmZlcik7CitWQUxVRSBjb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIoVkFMVUUgc3RyaW5nKTsKK1ZBTFVFIGNvbnZlcnRfdG9fc3RyaW5nKFZBTFVFIHV0ZjhfYnVmZmVyKTsKZGlmZiAtLWdpdCBhL2xpYi9yYi9leHQvY29tcGFjdF9wcm90b2NvbC5jIGIvbGliL3JiL2V4dC9jb21wYWN0X3Byb3RvY29sLmMKaW5kZXggYTQ3ZmU2Yy4uYzBmNDZiOSAxMDA2NDQKLS0tIGEvbGliL3JiL2V4dC9jb21wYWN0X3Byb3RvY29sLmMKKysrIGIvbGliL3JiL2V4dC9jb21wYWN0X3Byb3RvY29sLmMKQEAgLTIwLDkgKzIwLDEwIEBACiAjaW5jbHVkZSA8cnVieS5oPgogI2luY2x1ZGUgPHN0ZGJvb2wuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlICJjb25zdGFudHMuaCIKLSNpbmNsdWRlICJzdHJ1Y3QuaCIKLSNpbmNsdWRlICJtYWNyb3MuaCIKKyNpbmNsdWRlIDxjb25zdGFudHMuaD4KKyNpbmNsdWRlIDxzdHJ1Y3QuaD4KKyNpbmNsdWRlIDxtYWNyb3MuaD4KKyNpbmNsdWRlIDxieXRlcy5oPgogCiAjZGVmaW5lIExBU1RfSUQob2JqKSBGSVgySU5UKHJiX2FyeV9wb3AocmJfaXZhcl9nZXQob2JqLCBsYXN0X2ZpZWxkX2lkKSkpCiAjZGVmaW5lIFNFVF9MQVNUX0lEKG9iaiwgdmFsKSByYl9hcnlfcHVzaChyYl9pdmFyX2dldChvYmosIGxhc3RfZmllbGRfaWQpLCB2YWwpCkBAIC0zOSw2ICs0MCw3IEBACiBzdGF0aWMgaW50IFZFUlNJT047CiBzdGF0aWMgaW50IFZFUlNJT05fTUFTSzsKIHN0YXRpYyBpbnQgVFlQRV9NQVNLOworc3RhdGljIGludCBUWVBFX0JJVFM7CiBzdGF0aWMgaW50IFRZUEVfU0hJRlRfQU1PVU5UOwogc3RhdGljIGludCBQUk9UT0NPTF9JRDsKIApAQCAtMTY2LDYgKzE2OCw3IEBACiAKIFZBTFVFIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX2kzMihWQUxVRSBzZWxmLCBWQUxVRSBpMzIpOwogVkFMVUUgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfc3RyaW5nKFZBTFVFIHNlbGYsIFZBTFVFIHN0cik7CitWQUxVRSByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9iaW5hcnkoVkFMVUUgc2VsZiwgVkFMVUUgYnVmKTsKIAogVkFMVUUgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfbWVzc2FnZV9lbmQoVkFMVUUgc2VsZikgewogICByZXR1cm4gUW5pbDsKQEAgLTMwNCw5ICszMDcsMTYgQEAKIH0KIAogVkFMVUUgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfc3RyaW5nKFZBTFVFIHNlbGYsIFZBTFVFIHN0cikgeworICBzdHIgPSBjb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIoc3RyKTsKKyAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfYmluYXJ5KHNlbGYsIHN0cik7CisgIHJldHVybiBRbmlsOworfQorCitWQUxVRSByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9iaW5hcnkoVkFMVUUgc2VsZiwgVkFMVUUgYnVmKSB7CisgIGJ1ZiA9IGZvcmNlX2JpbmFyeV9lbmNvZGluZyhidWYpOwogICBWQUxVRSB0cmFuc3BvcnQgPSBHRVRfVFJBTlNQT1JUKHNlbGYpOwotICB3cml0ZV92YXJpbnQzMih0cmFuc3BvcnQsIFJTVFJJTkdfTEVOKHN0cikpOwotICBXUklURSh0cmFuc3BvcnQsIFJTVFJJTkdfUFRSKHN0ciksIFJTVFJJTkdfTEVOKHN0cikpOworICB3cml0ZV92YXJpbnQzMih0cmFuc3BvcnQsIFJTVFJJTkdfTEVOKGJ1ZikpOworICBXUklURSh0cmFuc3BvcnQsIFN0cmluZ1ZhbHVlUHRyKGJ1ZiksIFJTVFJJTkdfTEVOKGJ1ZikpOwogICByZXR1cm4gUW5pbDsKIH0KIApAQCAtMzE3LDYgKzMyNyw3IEBACiAjZGVmaW5lIGlzX2Jvb2xfdHlwZShjdHlwZSkgKCgoY3R5cGUpICYgMHgwRikgPT0gQ1RZUEVfQk9PTEVBTl9UUlVFIHx8ICgoY3R5cGUpICYgMHgwRikgPT0gQ1RZUEVfQk9PTEVBTl9GQUxTRSkKIAogVkFMVUUgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9zdHJpbmcoVkFMVUUgc2VsZik7CitWQUxVRSByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX2JpbmFyeShWQUxVRSBzZWxmKTsKIFZBTFVFIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfYnl0ZShWQUxVRSBzZWxmKTsKIFZBTFVFIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfaTMyKFZBTFVFIHNlbGYpOwogVkFMVUUgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9pMTYoVkFMVUUgc2VsZik7CkBAIC00NDAsNyArNDUxLDcgQEAKICAgICByYl9leGNfcmFpc2UoZ2V0X3Byb3RvY29sX2V4Y2VwdGlvbihJTlQyRklYKC0xKSwgcmJfc3RyX25ldzIoYnVmKSkpOwogICB9CiAgIAotICBpbnQ4X3QgdHlwZSA9ICh2ZXJzaW9uX2FuZF90eXBlID4+IFRZUEVfU0hJRlRfQU1PVU5UKSAmIDB4MDM7CisgIGludDhfdCB0eXBlID0gKHZlcnNpb25fYW5kX3R5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9CSVRTOwogICBpbnQzMl90IHNlcWlkID0gcmVhZF92YXJpbnQ2NChzZWxmKTsKICAgVkFMVUUgbWVzc2FnZU5hbWUgPSByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX3N0cmluZyhzZWxmKTsKICAgcmV0dXJuIHJiX2FyeV9uZXczKDMsIG1lc3NhZ2VOYW1lLCBJTlQyRklYKHR5cGUpLCBJTlQyTlVNKHNlcWlkKSk7CkBAIC01NDUsMTkgKzU1NiwyNSBAQAogfQogCiBWQUxVRSByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX3N0cmluZyhWQUxVRSBzZWxmKSB7CisgIFZBTFVFIGJ1ZmZlciA9IHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfYmluYXJ5KHNlbGYpOworICByZXR1cm4gY29udmVydF90b19zdHJpbmcoYnVmZmVyKTsKK30KKworVkFMVUUgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9iaW5hcnkoVkFMVUUgc2VsZikgewogICBpbnQ2NF90IHNpemUgPSByZWFkX3ZhcmludDY0KHNlbGYpOwogICByZXR1cm4gUkVBRChzZWxmLCBzaXplKTsKIH0KIAogc3RhdGljIHZvaWQgSW5pdF9jb25zdGFudHMoKSB7CiAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzID0gcmJfY29uc3RfZ2V0KHRocmlmdF9tb2R1bGUsIHJiX2ludGVybigiQ29tcGFjdFByb3RvY29sIikpOwotICAKKwogICBWRVJTSU9OID0gcmJfbnVtMmxsKHJiX2NvbnN0X2dldCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgcmJfaW50ZXJuKCJWRVJTSU9OIikpKTsKICAgVkVSU0lPTl9NQVNLID0gcmJfbnVtMmxsKHJiX2NvbnN0X2dldCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgcmJfaW50ZXJuKCJWRVJTSU9OX01BU0siKSkpOwogICBUWVBFX01BU0sgPSByYl9udW0ybGwocmJfY29uc3RfZ2V0KHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCByYl9pbnRlcm4oIlRZUEVfTUFTSyIpKSk7CisgIFRZUEVfQklUUyA9IHJiX251bTJsbChyYl9jb25zdF9nZXQodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsIHJiX2ludGVybigiVFlQRV9CSVRTIikpKTsKICAgVFlQRV9TSElGVF9BTU9VTlQgPSBGSVgySU5UKHJiX2NvbnN0X2dldCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgcmJfaW50ZXJuKCJUWVBFX1NISUZUX0FNT1VOVCIpKSk7CiAgIFBST1RPQ09MX0lEID0gRklYMklOVChyYl9jb25zdF9nZXQodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsIHJiX2ludGVybigiUFJPVE9DT0xfSUQiKSkpOwotICAKKwogICBsYXN0X2ZpZWxkX2lkID0gcmJfaW50ZXJuKCJAbGFzdF9maWVsZCIpOwogICBib29sZWFuX2ZpZWxkX2lkID0gcmJfaW50ZXJuKCJAYm9vbGVhbl9maWVsZCIpOwogICBib29sX3ZhbHVlX2lkID0gcmJfaW50ZXJuKCJAYm9vbF92YWx1ZSIpOwpAQCAtNTgwLDYgKzU5Nyw3IEBACiAgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsICJ3cml0ZV9pNjQiLCAgICAgICAgICAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfaTY0LCAxKTsKICAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgIndyaXRlX2RvdWJsZSIsICAgICAgICByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9kb3VibGUsIDEpOwogICByYl9kZWZpbmVfbWV0aG9kKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCAid3JpdGVfc3RyaW5nIiwgICAgICAgIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX3N0cmluZywgMSk7CisgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsICJ3cml0ZV9iaW5hcnkiLCAgICAgICAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfYmluYXJ5LCAxKTsKIAogICByYl9kZWZpbmVfbWV0aG9kKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCAid3JpdGVfbWVzc2FnZV9lbmQiLCByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9tZXNzYWdlX2VuZCwgMCk7CiAgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsICJ3cml0ZV9zdHJ1Y3RfYmVnaW4iLCByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9zdHJ1Y3RfYmVnaW4sIDEpOwpAQCAtNjAyLDYgKzYyMCw3IEBACiAgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsICJyZWFkX2k2NCIsICAgICAgICAgICAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9pNjQsIDApOwogICByYl9kZWZpbmVfbWV0aG9kKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCAicmVhZF9kb3VibGUiLCAgICAgICAgIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfZG91YmxlLCAwKTsKICAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgInJlYWRfc3RyaW5nIiwgICAgICAgICByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX3N0cmluZywgMCk7CisgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsICJyZWFkX2JpbmFyeSIsICAgICAgICAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9iaW5hcnksIDApOwogCiAgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsICJyZWFkX21lc3NhZ2VfZW5kIiwgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9tZXNzYWdlX2VuZCwgMCk7CiAgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsICJyZWFkX3N0cnVjdF9iZWdpbiIsICByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX3N0cnVjdF9iZWdpbiwgMCk7CmRpZmYgLS1naXQgYS9saWIvcmIvZXh0L2NvbnN0YW50cy5oIGIvbGliL3JiL2V4dC9jb25zdGFudHMuaAppbmRleCA5ZWEwMGQyLi5lN2FlYzQ0IDEwMDY0NAotLS0gYS9saWIvcmIvZXh0L2NvbnN0YW50cy5oCisrKyBiL2xpYi9yYi9leHQvY29uc3RhbnRzLmgKQEAgLTQyLDE5ICs0MiwyMCBAQAogZXh0ZXJuIElEIHdyaXRlX2k2NF9tZXRob2RfaWQ7CiBleHRlcm4gSUQgd3JpdGVfZG91YmxlX21ldGhvZF9pZDsKIGV4dGVybiBJRCB3cml0ZV9zdHJpbmdfbWV0aG9kX2lkOworZXh0ZXJuIElEIHdyaXRlX2JpbmFyeV9tZXRob2RfaWQ7CiBleHRlcm4gSUQgd3JpdGVfbWFwX2JlZ2luX21ldGhvZF9pZDsKIGV4dGVybiBJRCB3cml0ZV9tYXBfZW5kX21ldGhvZF9pZDsKIGV4dGVybiBJRCB3cml0ZV9saXN0X2JlZ2luX21ldGhvZF9pZDsKIGV4dGVybiBJRCB3cml0ZV9saXN0X2VuZF9tZXRob2RfaWQ7CiBleHRlcm4gSUQgd3JpdGVfc2V0X2JlZ2luX21ldGhvZF9pZDsKIGV4dGVybiBJRCB3cml0ZV9zZXRfZW5kX21ldGhvZF9pZDsKLWV4dGVybiBJRCBzaXplX21ldGhvZF9pZDsKIGV4dGVybiBJRCByZWFkX2Jvb2xfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHJlYWRfYnl0ZV9tZXRob2RfaWQ7CiBleHRlcm4gSUQgcmVhZF9pMTZfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHJlYWRfaTMyX21ldGhvZF9pZDsKIGV4dGVybiBJRCByZWFkX2k2NF9tZXRob2RfaWQ7CiBleHRlcm4gSUQgcmVhZF9zdHJpbmdfbWV0aG9kX2lkOworZXh0ZXJuIElEIHJlYWRfYmluYXJ5X21ldGhvZF9pZDsKIGV4dGVybiBJRCByZWFkX2RvdWJsZV9tZXRob2RfaWQ7CiBleHRlcm4gSUQgcmVhZF9tYXBfYmVnaW5fbWV0aG9kX2lkOwogZXh0ZXJuIElEIHJlYWRfbWFwX2VuZF9tZXRob2RfaWQ7CkBAIC02NywxNSArNjgsMTUgQEAKIGV4dGVybiBJRCByZWFkX2ZpZWxkX2JlZ2luX21ldGhvZF9pZDsKIGV4dGVybiBJRCByZWFkX2ZpZWxkX2VuZF9tZXRob2RfaWQ7CiBleHRlcm4gSUQga2V5c19tZXRob2RfaWQ7Ci1leHRlcm4gSUQgZW50cmllc19tZXRob2RfaWQ7IAotZXh0ZXJuIElEIG5hbWVfbWV0aG9kX2lkOyAKLWV4dGVybiBJRCBzb3J0X21ldGhvZF9pZDsKK2V4dGVybiBJRCBlbnRyaWVzX21ldGhvZF9pZDsKIGV4dGVybiBJRCB3cml0ZV9maWVsZF9zdG9wX21ldGhvZF9pZDsKIGV4dGVybiBJRCBza2lwX21ldGhvZF9pZDsKIGV4dGVybiBJRCB3cml0ZV9tZXRob2RfaWQ7CiBleHRlcm4gSUQgcmVhZF9hbGxfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHJlYWRfaW50b19idWZmZXJfbWV0aG9kX2lkOwotZXh0ZXJuIElEIG5hdGl2ZV9xbWFya19tZXRob2RfaWQ7CitleHRlcm4gSUQgZm9yY2VfYmluYXJ5X2VuY29kaW5nX2lkOworZXh0ZXJuIElEIGNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcl9pZDsKK2V4dGVybiBJRCBjb252ZXJ0X3RvX3N0cmluZ19pZDsKIAogZXh0ZXJuIElEIGZpZWxkc19jb25zdF9pZDsKIGV4dGVybiBJRCB0cmFuc3BvcnRfaXZhcl9pZDsKQEAgLTg4LDkgKzg5LDExIEBACiBleHRlcm4gVkFMVUUgdmFsdWVfc3ltOwogZXh0ZXJuIFZBTFVFIGVsZW1lbnRfc3ltOwogZXh0ZXJuIFZBTFVFIGNsYXNzX3N5bTsKK2V4dGVybiBWQUxVRSBiaW5hcnlfc3ltOwogCiBleHRlcm4gVkFMVUUgcmJfY1NldDsKIGV4dGVybiBWQUxVRSB0aHJpZnRfbW9kdWxlOwogZXh0ZXJuIFZBTFVFIHRocmlmdF90eXBlc19tb2R1bGU7CitleHRlcm4gVkFMVUUgdGhyaWZ0X2J5dGVzX21vZHVsZTsKIGV4dGVybiBWQUxVRSBjbGFzc190aHJpZnRfcHJvdG9jb2w7CiBleHRlcm4gVkFMVUUgcHJvdG9jb2xfZXhjZXB0aW9uX2NsYXNzOwpkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC9leHRjb25mLnJiIGIvbGliL3JiL2V4dC9leHRjb25mLnJiCmluZGV4IDM2ZGFjOWIuLmIzNWY2MGIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9leHQvZXh0Y29uZi5yYgorKysgYi9saWIvcmIvZXh0L2V4dGNvbmYucmIKQEAgLTIxLDggKzIxLDEyIEBACiAgIEZpbGUub3BlbignTWFrZWZpbGUnLCAndycpe3xmfCBmLnB1dHMgImFsbDpcblxuaW5zdGFsbDpcbiIgfQogZWxzZQogICByZXF1aXJlICdta21mJworICByZXF1aXJlICdyYmNvbmZpZycKIAotICAkQ0ZMQUdTID0gIi1nIC1PMiAtV2FsbCAtV2Vycm9yIgorICAkQVJDSF9GTEFHUyA9IFJiQ29uZmlnOjpDT05GSUdbJ0NGTEFHUyddLnNjYW4oIC8oLWFyY2ggKShcUyspLyApLm1hcHt8eCx5fCB4ICsgeSArICcgJyB9LmpvaW4oJycpCisKKworICAkQ0ZMQUdTID0gIi1mc2lnbmVkLWNoYXIgLWcgLU8yIC1XYWxsIC1XZXJyb3IgIiArICRBUkNIX0ZMQUdTCiAKICAgaGF2ZV9mdW5jKCJzdHJsY3B5IiwgInN0cmluZy5oIikKIApkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC9tZW1vcnlfYnVmZmVyLmMgYi9saWIvcmIvZXh0L21lbW9yeV9idWZmZXIuYwppbmRleCBiZDFiYWM4Li44YjUyYzRhIDEwMDY0NAotLS0gYS9saWIvcmIvZXh0L21lbW9yeV9idWZmZXIuYworKysgYi9saWIvcmIvZXh0L21lbW9yeV9idWZmZXIuYwpAQCAtMTksNyArMTksOCBAQAogCiAjaW5jbHVkZSA8cnVieS5oPgogI2luY2x1ZGUgPGNvbnN0YW50cy5oPgotI2luY2x1ZGUgIm1hY3Jvcy5oIgorI2luY2x1ZGUgPGJ5dGVzLmg+CisjaW5jbHVkZSA8bWFjcm9zLmg+CiAKIElEIGJ1Zl9pdmFyX2lkOwogSUQgaW5kZXhfaXZhcl9pZDsKQEAgLTM3LDcgKzM4LDggQEAKIAogVkFMVUUgcmJfdGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUoVkFMVUUgc2VsZiwgVkFMVUUgc3RyKSB7CiAgIFZBTFVFIGJ1ZiA9IEdFVF9CVUYoc2VsZik7Ci0gIHJiX3N0cl9idWZfY2F0KGJ1ZiwgUlNUUklOR19QVFIoc3RyKSwgUlNUUklOR19MRU4oc3RyKSk7CisgIHN0ciA9IGZvcmNlX2JpbmFyeV9lbmNvZGluZyhzdHIpOworICByYl9zdHJfYnVmX2NhdChidWYsIFN0cmluZ1ZhbHVlUHRyKHN0ciksIFJTVFJJTkdfTEVOKHN0cikpOwogICByZXR1cm4gUW5pbDsKIH0KIApAQCAtOTMsMjUgKzk1LDI2IEBACiAgIGludCBpbmRleDsKICAgVkFMVUUgYnVmID0gR0VUX0JVRihzZWxmKTsKIAorICBpbmRleCA9IEZJWDJJTlQocmJfaXZhcl9nZXQoc2VsZiwgaW5kZXhfaXZhcl9pZCkpOwogICB3aGlsZSAoaSA8IHNpemUpIHsKLSAgICBpbmRleCA9IEZJWDJJTlQocmJfaXZhcl9nZXQoc2VsZiwgaW5kZXhfaXZhcl9pZCkpOwogICAgIGlmIChpbmRleCA+PSBSU1RSSU5HX0xFTihidWYpKSB7CiAgICAgICByYl9yYWlzZShyYl9lRU9GRXJyb3IsICJOb3QgZW5vdWdoIGJ5dGVzIHJlbWFpbiBpbiBtZW1vcnkgYnVmZmVyIik7CiAgICAgfQogICAgIGNoYXIgYnl0ZSA9IFJTVFJJTkdfUFRSKGJ1ZilbaW5kZXgrK107CiAKLSAgICBpZiAoaW5kZXggPj0gR0FSQkFHRV9CVUZGRVJfU0laRSkgewotICAgICAgcmJfaXZhcl9zZXQoc2VsZiwgYnVmX2l2YXJfaWQsIHJiX2Z1bmNhbGwoYnVmLCBzbGljZV9tZXRob2RfaWQsIDIsIElOVDJGSVgoaW5kZXgpLCBJTlQyRklYKFJTVFJJTkdfTEVOKGJ1ZikgLSAxKSkpOwotICAgICAgaW5kZXggPSAwOwotICAgIH0KLSAgICByYl9pdmFyX3NldChzZWxmLCBpbmRleF9pdmFyX2lkLCBJTlQyRklYKGluZGV4KSk7Ci0KICAgICBpZiAoaSA+PSBSU1RSSU5HX0xFTihidWZmZXJfdmFsdWUpKSB7CiAgICAgICByYl9yYWlzZShyYl9lSW5kZXhFcnJvciwgImluZGV4ICVkIG91dCBvZiBzdHJpbmciLCBpKTsKICAgICB9CiAgICAgKChjaGFyKilSU1RSSU5HX1BUUihidWZmZXJfdmFsdWUpKVtpXSA9IGJ5dGU7CiAgICAgaSsrOwogICB9CisKKyAgaWYgKGluZGV4ID49IEdBUkJBR0VfQlVGRkVSX1NJWkUpIHsKKyAgICByYl9pdmFyX3NldChzZWxmLCBidWZfaXZhcl9pZCwgcmJfZnVuY2FsbChidWYsIHNsaWNlX21ldGhvZF9pZCwgMiwgSU5UMkZJWChpbmRleCksIElOVDJGSVgoUlNUUklOR19MRU4oYnVmKSAtIDEpKSk7CisgICAgaW5kZXggPSAwOworICB9CisgIHJiX2l2YXJfc2V0KHNlbGYsIGluZGV4X2l2YXJfaWQsIElOVDJGSVgoaW5kZXgpKTsKKwogICByZXR1cm4gSU5UMkZJWChpKTsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC9wcm90b2NvbC5jIGIvbGliL3JiL2V4dC9wcm90b2NvbC5jCmluZGV4IGMxODc2NTQuLmU2OWRlMjkgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9leHQvcHJvdG9jb2wuYworKysgYi9saWIvcmIvZXh0L3Byb3RvY29sLmMKQEAgLTEsMTg1ICswLDAgQEAKLS8qKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxydWJ5Lmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8Y29uc3RhbnRzLmg+Ci0jaW5jbHVkZSA8c3RydWN0Lmg+Ci0KLXN0YXRpYyBWQUxVRSBza2lwKFZBTFVFIHNlbGYsIGludCB0dHlwZSkgewotICBpZiAodHR5cGUgPT0gVFRZUEVfU1RPUCkgewotICAgIHJldHVybiBRbmlsOwotICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX0JPT0wpIHsKLSAgICByYl9mdW5jYWxsKHNlbGYsIHJlYWRfYm9vbF9tZXRob2RfaWQsIDApOwotICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX0JZVEUpIHsKLSAgICByYl9mdW5jYWxsKHNlbGYsIHJlYWRfYnl0ZV9tZXRob2RfaWQsIDApOwotICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX0kxNikgewotICAgIHJiX2Z1bmNhbGwoc2VsZiwgcmVhZF9pMTZfbWV0aG9kX2lkLCAwKTsKLSAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9JMzIpIHsKLSAgICByYl9mdW5jYWxsKHNlbGYsIHJlYWRfaTMyX21ldGhvZF9pZCwgMCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfSTY0KSB7Ci0gICAgcmJfZnVuY2FsbChzZWxmLCByZWFkX2k2NF9tZXRob2RfaWQsIDApOwotICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX0RPVUJMRSkgewotICAgIHJiX2Z1bmNhbGwoc2VsZiwgcmVhZF9kb3VibGVfbWV0aG9kX2lkLCAwKTsKLSAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9TVFJJTkcpIHsKLSAgICByYl9mdW5jYWxsKHNlbGYsIHJlYWRfc3RyaW5nX21ldGhvZF9pZCwgMCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfU1RSVUNUKSB7Ci0gICAgcmJfZnVuY2FsbChzZWxmLCByZWFkX3N0cnVjdF9iZWdpbl9tZXRob2RfaWQsIDApOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBWQUxVRSBmaWVsZF9oZWFkZXIgPSByYl9mdW5jYWxsKHNlbGYsIHJlYWRfZmllbGRfYmVnaW5fbWV0aG9kX2lkLCAwKTsKLSAgICAgIGlmIChOSUxfUChmaWVsZF9oZWFkZXIpIHx8IEZJWDJJTlQocmJfYXJ5X2VudHJ5KGZpZWxkX2hlYWRlciwgMSkpID09IFRUWVBFX1NUT1AgKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAKLSAgICAgIHNraXAoc2VsZiwgRklYMklOVChyYl9hcnlfZW50cnkoZmllbGRfaGVhZGVyLCAxKSkpOwotICAgICAgcmJfZnVuY2FsbChzZWxmLCByZWFkX2ZpZWxkX2VuZF9tZXRob2RfaWQsIDApOwotICAgIH0KLSAgICByYl9mdW5jYWxsKHNlbGYsIHJlYWRfc3RydWN0X2VuZF9tZXRob2RfaWQsIDApOwotICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX01BUCkgewotICAgIGludCBpOwotICAgIFZBTFVFIG1hcF9oZWFkZXIgPSByYl9mdW5jYWxsKHNlbGYsIHJlYWRfbWFwX2JlZ2luX21ldGhvZF9pZCwgMCk7Ci0gICAgaW50IGt0eXBlID0gRklYMklOVChyYl9hcnlfZW50cnkobWFwX2hlYWRlciwgMCkpOwotICAgIGludCB2dHlwZSA9IEZJWDJJTlQocmJfYXJ5X2VudHJ5KG1hcF9oZWFkZXIsIDEpKTsKLSAgICBpbnQgc2l6ZSA9IEZJWDJJTlQocmJfYXJ5X2VudHJ5KG1hcF9oZWFkZXIsIDIpKTsKLSAgICAKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICBza2lwKHNlbGYsIGt0eXBlKTsKLSAgICAgIHNraXAoc2VsZiwgdnR5cGUpOwotICAgIH0KLSAgICByYl9mdW5jYWxsKHNlbGYsIHJlYWRfbWFwX2VuZF9tZXRob2RfaWQsIDApOwotICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX0xJU1QgfHwgdHR5cGUgPT0gVFRZUEVfU0VUKSB7Ci0gICAgaW50IGk7Ci0gICAgVkFMVUUgY29sbGVjdGlvbl9oZWFkZXIgPSByYl9mdW5jYWxsKHNlbGYsIHR0eXBlID09IFRUWVBFX0xJU1QgPyByZWFkX2xpc3RfYmVnaW5fbWV0aG9kX2lkIDogcmVhZF9zZXRfYmVnaW5fbWV0aG9kX2lkLCAwKTsKLSAgICBpbnQgZXR5cGUgPSBGSVgySU5UKHJiX2FyeV9lbnRyeShjb2xsZWN0aW9uX2hlYWRlciwgMCkpOwotICAgIGludCBzaXplID0gRklYMklOVChyYl9hcnlfZW50cnkoY29sbGVjdGlvbl9oZWFkZXIsIDEpKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICBza2lwKHNlbGYsIGV0eXBlKTsKLSAgICB9Ci0gICAgcmJfZnVuY2FsbChzZWxmLCB0dHlwZSA9PSBUVFlQRV9MSVNUID8gcmVhZF9saXN0X2VuZF9tZXRob2RfaWQgOiByZWFkX3NldF9lbmRfbWV0aG9kX2lkLCAwKTsKLSAgfSBlbHNlIHsKLSAgICByYl9yYWlzZShyYl9lTm90SW1wRXJyb3IsICJkb24ndCBrbm93IGhvdyB0byBza2lwIHR5cGUgJWQiLCB0dHlwZSk7Ci0gIH0KLQotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhyaWZ0X3Byb3RvY29sX25hdGl2ZV9xbWFyayhWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRZmFsc2U7Ci19Ci0KLVZBTFVFIHJiX3RocmlmdF9wcm90b2NvbF9za2lwKFZBTFVFIHByb3RvY29sLCBWQUxVRSB0dHlwZSkgewotICByZXR1cm4gc2tpcChwcm90b2NvbCwgRklYMklOVCh0dHlwZSkpOwotfQotCi1WQUxVRSByYl90aHJpZnRfd3JpdGVfbWVzc2FnZV9lbmQoVkFMVUUgc2VsZikgewotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhyaWZ0X3dyaXRlX3N0cnVjdF9iZWdpbihWQUxVRSBzZWxmLCBWQUxVRSBuYW1lKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi1WQUxVRSByYl90aHJpZnRfd3JpdGVfc3RydWN0X2VuZChWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi1WQUxVRSByYl90aHJpZnRfd3JpdGVfZmllbGRfZW5kKFZBTFVFIHNlbGYpIHsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLVZBTFVFIHJiX3RocmlmdF93cml0ZV9tYXBfZW5kKFZBTFVFIHNlbGYpIHsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLVZBTFVFIHJiX3RocmlmdF93cml0ZV9saXN0X2VuZChWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi1WQUxVRSByYl90aHJpZnRfd3JpdGVfc2V0X2VuZChWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi1WQUxVRSByYl90aHJpZnRfcmVhZF9tZXNzYWdlX2VuZChWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi1WQUxVRSByYl90aGlmdF9yZWFkX3N0cnVjdF9iZWdpbihWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi1WQUxVRSByYl90aGlmdF9yZWFkX3N0cnVjdF9lbmQoVkFMVUUgc2VsZikgewotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhpZnRfcmVhZF9maWVsZF9lbmQoVkFMVUUgc2VsZikgewotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhpZnRfcmVhZF9tYXBfZW5kKFZBTFVFIHNlbGYpIHsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLVZBTFVFIHJiX3RoaWZ0X3JlYWRfbGlzdF9lbmQoVkFMVUUgc2VsZikgewotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhpZnRfcmVhZF9zZXRfZW5kKFZBTFVFIHNlbGYpIHsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLXZvaWQgSW5pdF9wcm90b2NvbCgpIHsKLSAgVkFMVUUgY19wcm90b2NvbCA9IHJiX2NvbnN0X2dldCh0aHJpZnRfbW9kdWxlLCByYl9pbnRlcm4oIkJhc2VQcm90b2NvbCIpKTsKLSAgCi0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgInNraXAiLCByYl90aHJpZnRfcHJvdG9jb2xfc2tpcCwgMSk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgIndyaXRlX21lc3NhZ2VfZW5kIiwgcmJfdGhyaWZ0X3dyaXRlX21lc3NhZ2VfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAid3JpdGVfc3RydWN0X2JlZ2luIiwgcmJfdGhyaWZ0X3dyaXRlX3N0cnVjdF9iZWdpbiwgMSk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgIndyaXRlX3N0cnVjdF9lbmQiLCByYl90aHJpZnRfd3JpdGVfc3RydWN0X2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgIndyaXRlX2ZpZWxkX2VuZCIsIHJiX3RocmlmdF93cml0ZV9maWVsZF9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJ3cml0ZV9tYXBfZW5kIiwgcmJfdGhyaWZ0X3dyaXRlX21hcF9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJ3cml0ZV9saXN0X2VuZCIsIHJiX3RocmlmdF93cml0ZV9saXN0X2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgIndyaXRlX3NldF9lbmQiLCByYl90aHJpZnRfd3JpdGVfc2V0X2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgInJlYWRfbWVzc2FnZV9lbmQiLCByYl90aHJpZnRfcmVhZF9tZXNzYWdlX2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgInJlYWRfc3RydWN0X2JlZ2luIiwgcmJfdGhpZnRfcmVhZF9zdHJ1Y3RfYmVnaW4sIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJyZWFkX3N0cnVjdF9lbmQiLCByYl90aGlmdF9yZWFkX3N0cnVjdF9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJyZWFkX2ZpZWxkX2VuZCIsIHJiX3RoaWZ0X3JlYWRfZmllbGRfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAicmVhZF9tYXBfZW5kIiwgcmJfdGhpZnRfcmVhZF9tYXBfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAicmVhZF9saXN0X2VuZCIsIHJiX3RoaWZ0X3JlYWRfbGlzdF9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJyZWFkX3NldF9lbmQiLCByYl90aGlmdF9yZWFkX3NldF9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJuYXRpdmU/IiwgcmJfdGhyaWZ0X3Byb3RvY29sX25hdGl2ZV9xbWFyaywgMCk7Ci0gIAotICAvLyBuYXRpdmVfcHJvdG9fbWV0aG9kX3RhYmxlICpucG10OwotICAvLyBucG10ID0gQUxMT0MobmF0aXZlX3Byb3RvX21ldGhvZF90YWJsZSk7Ci0gIC8vIG5wbXQtPndyaXRlX21lc3NhZ2VfZW5kID0gcmJfdGhyaWZ0X3dyaXRlX21lc3NhZ2VfZW5kOwotICAvLyBucG10LT53cml0ZV9zdHJ1Y3RfYmVnaW4gPSByYl90aHJpZnRfd3JpdGVfc3RydWN0X2JlZ2luOwotICAvLyBucG10LT53cml0ZV9zdHJ1Y3RfZW5kID0gcmJfdGhyaWZ0X3dyaXRlX3N0cnVjdF9lbmQ7Ci0gIC8vIG5wbXQtPndyaXRlX2ZpZWxkX2VuZCA9IHJiX3RocmlmdF93cml0ZV9maWVsZF9lbmQ7Ci0gIC8vIG5wbXQtPndyaXRlX21hcF9lbmQgPSByYl90aHJpZnRfd3JpdGVfbWFwX2VuZDsKLSAgLy8gbnBtdC0+d3JpdGVfbGlzdF9lbmQgPSByYl90aHJpZnRfd3JpdGVfbGlzdF9lbmQ7Ci0gIC8vIG5wbXQtPndyaXRlX3NldF9lbmQgPSByYl90aHJpZnRfd3JpdGVfc2V0X2VuZDsKLSAgLy8gbnBtdC0+cmVhZF9tZXNzYWdlX2VuZCA9IHJiX3RocmlmdF9yZWFkX21lc3NhZ2VfZW5kOwotICAvLyBucG10LT5yZWFkX3N0cnVjdF9iZWdpbiA9IHJiX3RoaWZ0X3JlYWRfc3RydWN0X2JlZ2luOwotICAvLyBucG10LT5yZWFkX3N0cnVjdF9lbmQgPSByYl90aGlmdF9yZWFkX3N0cnVjdF9lbmQ7Ci0gIC8vIG5wbXQtPnJlYWRfZmllbGRfZW5kID0gcmJfdGhpZnRfcmVhZF9maWVsZF9lbmQ7Ci0gIC8vIG5wbXQtPnJlYWRfbWFwX2VuZCA9IHJiX3RoaWZ0X3JlYWRfbWFwX2VuZDsKLSAgLy8gbnBtdC0+cmVhZF9saXN0X2VuZCA9IHJiX3RoaWZ0X3JlYWRfbGlzdF9lbmQ7Ci0gIC8vIG5wbXQtPnJlYWRfc2V0X2VuZCA9IHJiX3RoaWZ0X3JlYWRfc2V0X2VuZDsKLSAgLy8gCi0gIC8vIFZBTFVFIG1ldGhvZF90YWJsZV9vYmplY3QgPSBEYXRhX1dyYXBfU3RydWN0KHJiX2NPYmplY3QsIDAsIGZyZWUsIG5wbXQpOwotICAvLyByYl9jb25zdF9zZXQoY19wcm90b2NvbCwgcmJfaW50ZXJuKCJAbmF0aXZlX21ldGhvZF90YWJsZSIpLCBtZXRob2RfdGFibGVfb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL2xpYi9yYi9leHQvcHJvdG9jb2wuaCBiL2xpYi9yYi9leHQvcHJvdG9jb2wuaAppbmRleCA1MzY5NTMwLi5lNjlkZTI5IDEwMDY0NAotLS0gYS9saWIvcmIvZXh0L3Byb3RvY29sLmgKKysrIGIvbGliL3JiL2V4dC9wcm90b2NvbC5oCkBAIC0xLDIwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotdm9pZCBJbml0X3Byb3RvY29sKCk7CmRpZmYgLS1naXQgYS9saWIvcmIvZXh0L3N0cmxjcHkuYyBiL2xpYi9yYi9leHQvc3RybGNweS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MDBmZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvZXh0L3N0cmxjcHkuYwpAQCAtMCwwICsxLDQxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAic3RybGNweS5oIgorCisjaWZuZGVmIEhBVkVfU1RSTENQWQorI2RlZmluZSBIQVZFX1NUUkxDUFkKK3NpemVfdAorc3RybGNweSAoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBkc3Rfc3opCit7CisgICAgc2l6ZV90IG47CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgZHN0X3N6OyBuKyspIHsKKyAgICAgIGlmICgoKmRzdCsrID0gKnNyYysrKSA9PSAnXDAnKQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAobiA8IGRzdF9zeikKKyAgICAgIHJldHVybiBuOworICAgIGlmIChuID4gMCkKKyAgICAgICooZHN0IC0gMSkgPSAnXDAnOworICAgIHJldHVybiBuICsgc3RybGVuIChzcmMpOworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYi9yYi9leHQvc3RybGNweS5oIGIvbGliL3JiL2V4dC9zdHJsY3B5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZmZTBmZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9leHQvc3RybGNweS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZuZGVmIF9faGFzX2J1aWx0aW4KKyNkZWZpbmUgX19oYXNfYnVpbHRpbih4KSAwCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUkxDUFkKK3NpemVfdCBzdHJsY3B5IChjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGRzdF9zeik7CisjZWxzZQorI2lmICFfX2hhc19idWlsdGluKHN0cmxjcHkpCitleHRlcm4gc2l6ZV90IHN0cmxjcHkoY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CisjZW5kaWYKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWIvcmIvZXh0L3N0cnVjdC5jIGIvbGliL3JiL2V4dC9zdHJ1Y3QuYwppbmRleCBkYWUzMzhlLi5lM2FhODU1IDEwMDY0NAotLS0gYS9saWIvcmIvZXh0L3N0cnVjdC5jCisrKyBiL2xpYi9yYi9leHQvc3RydWN0LmMKQEAgLTIwLDMzICsyMCw3IEBACiAjaW5jbHVkZSAic3RydWN0LmgiCiAjaW5jbHVkZSAiY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAibWFjcm9zLmgiCi0KLSNpZm5kZWYgSEFWRV9TVFJMQ1BZCi0KLXN0YXRpYwotc2l6ZV90Ci1zdHJsY3B5IChjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGRzdF9zeikKLXsKLSAgICBzaXplX3QgbjsKLQotICAgIGZvciAobiA9IDA7IG4gPCBkc3Rfc3o7IG4rKykgewotICAgICAgaWYgKCgqZHN0KysgPSAqc3JjKyspID09ICdcMCcpCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChuIDwgZHN0X3N6KQotICAgICAgcmV0dXJuIG47Ci0gICAgaWYgKG4gPiAwKQotICAgICAgKihkc3QgLSAxKSA9ICdcMCc7Ci0gICAgcmV0dXJuIG4gKyBzdHJsZW4gKHNyYyk7Ci19Ci0jZWxzZQotLyoKLSAgIFJ1YnkgMS45LnggaW5jbHVkZXMgdGhlIE9wZW5CU0QgaW1wbGVtZW50YXRpb24gb2Ygc3RybGNweS4KLSAgIFNlZSBtaXNzaW5nL3N0cmxjcHkuYyBpbiBSdWJ5IDEuOSBzb3VyY2UKLSAqLwotZXh0ZXJuIHNpemVfdCBzdHJsY3B5KGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwotI2VuZGlmCisjaW5jbHVkZSAic3RybGNweS5oIgogCiBWQUxVRSB0aHJpZnRfdW5pb25fY2xhc3M7CiAKQEAgLTEwMSw2ICs3NSwxMSBAQAogICByZXR1cm4gUW5pbDsKIH0KIAorVkFMVUUgZGVmYXVsdF93cml0ZV9iaW5hcnkoVkFMVUUgcHJvdG9jb2wsIFZBTFVFIHZhbHVlKSB7CisgIHJiX2Z1bmNhbGwocHJvdG9jb2wsIHdyaXRlX2JpbmFyeV9tZXRob2RfaWQsIDEsIHZhbHVlKTsKKyAgcmV0dXJuIFFuaWw7Cit9CisKIFZBTFVFIGRlZmF1bHRfd3JpdGVfbGlzdF9iZWdpbihWQUxVRSBwcm90b2NvbCwgVkFMVUUgZXR5cGUsIFZBTFVFIGxlbmd0aCkgewogICByYl9mdW5jYWxsKHByb3RvY29sLCB3cml0ZV9saXN0X2JlZ2luX21ldGhvZF9pZCwgMiwgZXR5cGUsIGxlbmd0aCk7CiAgIHJldHVybiBRbmlsOwpAQCAtMjE2LDYgKzE5NSwxMCBAQAogICByZXR1cm4gcmJfZnVuY2FsbChwcm90b2NvbCwgcmVhZF9zdHJpbmdfbWV0aG9kX2lkLCAwKTsKIH0KIAorVkFMVUUgZGVmYXVsdF9yZWFkX2JpbmFyeShWQUxVRSBwcm90b2NvbCkgeworICByZXR1cm4gcmJfZnVuY2FsbChwcm90b2NvbCwgcmVhZF9iaW5hcnlfbWV0aG9kX2lkLCAwKTsKK30KKwogVkFMVUUgZGVmYXVsdF9yZWFkX3N0cnVjdF9iZWdpbihWQUxVRSBwcm90b2NvbCkgewogICByZXR1cm4gcmJfZnVuY2FsbChwcm90b2NvbCwgcmVhZF9zdHJ1Y3RfYmVnaW5fbWV0aG9kX2lkLCAwKTsKIH0KQEAgLTIzMSwxMCArMjE0LDEwIEBACiBzdGF0aWMgdm9pZCB3cml0ZV9hbnl0aGluZyhpbnQgdHR5cGUsIFZBTFVFIHZhbHVlLCBWQUxVRSBwcm90b2NvbCwgVkFMVUUgZmllbGRfaW5mbyk7CiAKIFZBTFVFIGdldF9maWVsZF92YWx1ZShWQUxVRSBvYmosIFZBTFVFIGZpZWxkX25hbWUpIHsKLSAgY2hhciBuYW1lX2J1ZltSU1RSSU5HX0xFTihmaWVsZF9uYW1lKSArIDFdOworICBjaGFyIG5hbWVfYnVmW1JTVFJJTkdfTEVOKGZpZWxkX25hbWUpICsgMl07CiAKICAgbmFtZV9idWZbMF0gPSAnQCc7Ci0gIHN0cmxjcHkoJm5hbWVfYnVmWzFdLCBSU1RSSU5HX1BUUihmaWVsZF9uYW1lKSwgc2l6ZW9mKG5hbWVfYnVmKSk7CisgIHN0cmxjcHkoJm5hbWVfYnVmWzFdLCBSU1RSSU5HX1BUUihmaWVsZF9uYW1lKSwgUlNUUklOR19MRU4oZmllbGRfbmFtZSkgKyAxKTsKIAogICBWQUxVRSB2YWx1ZSA9IHJiX2l2YXJfZ2V0KG9iaiwgcmJfaW50ZXJuKG5hbWVfYnVmKSk7CiAKQEAgLTMwNyw3ICsyOTAsNyBAQAogCiAgICAgaWYgKFRZUEUodmFsdWUpID09IFRfQVJSQVkpIHsKICAgICAgIGl0ZW1zID0gdmFsdWU7Ci0gICAgfSBlbHNlIHsgICAgICAgIAorICAgIH0gZWxzZSB7CiAgICAgICBpZiAocmJfY1NldCA9PSBDTEFTU19PRih2YWx1ZSkpIHsKICAgICAgICAgaXRlbXMgPSByYl9mdW5jYWxsKHZhbHVlLCBlbnRyaWVzX21ldGhvZF9pZCwgMCk7CiAgICAgICB9IGVsc2UgewpAQCAtMzUzLDcgKzMzNiwxMiBAQAogICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX0RPVUJMRSkgewogICAgIGRlZmF1bHRfd3JpdGVfZG91YmxlKHByb3RvY29sLCB2YWx1ZSk7CiAgIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfU1RSSU5HKSB7Ci0gICAgZGVmYXVsdF93cml0ZV9zdHJpbmcocHJvdG9jb2wsIHZhbHVlKTsKKyAgICBWQUxVRSBpc19iaW5hcnkgPSByYl9oYXNoX2FyZWYoZmllbGRfaW5mbywgYmluYXJ5X3N5bSk7CisgICAgaWYgKGlzX2JpbmFyeSAhPSBRdHJ1ZSkgeworICAgICAgZGVmYXVsdF93cml0ZV9zdHJpbmcocHJvdG9jb2wsIHZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgZGVmYXVsdF93cml0ZV9iaW5hcnkocHJvdG9jb2wsIHZhbHVlKTsKKyAgICB9CiAgIH0gZWxzZSBpZiAoSVNfQ09OVEFJTkVSKHR0eXBlKSkgewogICAgIHdyaXRlX2NvbnRhaW5lcih0dHlwZSwgZmllbGRfaW5mbywgdmFsdWUsIHByb3RvY29sKTsKICAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9TVFJVQ1QpIHsKQEAgLTQxNywxMCArNDA1LDEwIEBACiBzdGF0aWMgdm9pZCBza2lwX2xpc3Rfb3Jfc2V0X2NvbnRlbnRzKFZBTFVFIHByb3RvY29sLCBWQUxVRSBlbGVtZW50X3R5cGVfdmFsdWUsIGludCBzaXplKTsKIAogc3RhdGljIHZvaWQgc2V0X2ZpZWxkX3ZhbHVlKFZBTFVFIG9iaiwgVkFMVUUgZmllbGRfbmFtZSwgVkFMVUUgdmFsdWUpIHsKLSAgY2hhciBuYW1lX2J1ZltSU1RSSU5HX0xFTihmaWVsZF9uYW1lKSArIDFdOworICBjaGFyIG5hbWVfYnVmW1JTVFJJTkdfTEVOKGZpZWxkX25hbWUpICsgMl07CiAKICAgbmFtZV9idWZbMF0gPSAnQCc7Ci0gIHN0cmxjcHkoJm5hbWVfYnVmWzFdLCBSU1RSSU5HX1BUUihmaWVsZF9uYW1lKSwgc2l6ZW9mKG5hbWVfYnVmKSk7CisgIHN0cmxjcHkoJm5hbWVfYnVmWzFdLCBSU1RSSU5HX1BUUihmaWVsZF9uYW1lKSwgUlNUUklOR19MRU4oZmllbGRfbmFtZSkrMSk7CiAKICAgcmJfaXZhcl9zZXQob2JqLCByYl9pbnRlcm4obmFtZV9idWYpLCB2YWx1ZSk7CiB9CkBAIC00NTYsNyArNDQ0LDEyIEBACiAgIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfSTY0KSB7CiAgICAgcmVzdWx0ID0gZGVmYXVsdF9yZWFkX2k2NChwcm90b2NvbCk7CiAgIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfU1RSSU5HKSB7Ci0gICAgcmVzdWx0ID0gZGVmYXVsdF9yZWFkX3N0cmluZyhwcm90b2NvbCk7CisgICAgVkFMVUUgaXNfYmluYXJ5ID0gcmJfaGFzaF9hcmVmKGZpZWxkX2luZm8sIGJpbmFyeV9zeW0pOworICAgIGlmIChpc19iaW5hcnkgIT0gUXRydWUpIHsKKyAgICAgIHJlc3VsdCA9IGRlZmF1bHRfcmVhZF9zdHJpbmcocHJvdG9jb2wpOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgPSBkZWZhdWx0X3JlYWRfYmluYXJ5KHByb3RvY29sKTsKKyAgICB9CiAgIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfRE9VQkxFKSB7CiAgICAgcmVzdWx0ID0gZGVmYXVsdF9yZWFkX2RvdWJsZShwcm90b2NvbCk7CiAgIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfU1RSVUNUKSB7CkBAIC00ODQsNyArNDc3LDcgQEAKICAgICBpZiAoIU5JTF9QKGtleV9pbmZvKSAmJiAhTklMX1AodmFsdWVfaW5mbykpIHsKICAgICAgIGludCBzcGVjaWZpZWRfa2V5X3R5cGUgPSBGSVgySU5UKHJiX2hhc2hfYXJlZihrZXlfaW5mbywgdHlwZV9zeW0pKTsKICAgICAgIGludCBzcGVjaWZpZWRfdmFsdWVfdHlwZSA9IEZJWDJJTlQocmJfaGFzaF9hcmVmKHZhbHVlX2luZm8sIHR5cGVfc3ltKSk7Ci0gICAgICBpZiAoc3BlY2lmaWVkX2tleV90eXBlID09IGtleV90dHlwZSAmJiBzcGVjaWZpZWRfdmFsdWVfdHlwZSA9PSB2YWx1ZV90dHlwZSkgeworICAgICAgaWYgKG51bV9lbnRyaWVzID09IDAgfHwgKHNwZWNpZmllZF9rZXlfdHlwZSA9PSBrZXlfdHR5cGUgJiYgc3BlY2lmaWVkX3ZhbHVlX3R5cGUgPT0gdmFsdWVfdHR5cGUpKSB7CiAgICAgICAgIHJlc3VsdCA9IHJiX2hhc2hfbmV3KCk7CiAKICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9lbnRyaWVzOyArK2kpIHsKQEAgLTYzMyw3ICs2MjYsNyBAQAogICAgIGlmIChmaWVsZF90eXBlID09IHNwZWNpZmllZF90eXBlKSB7CiAgICAgICAvLyByZWFkIHRoZSB2YWx1ZQogICAgICAgVkFMVUUgbmFtZSA9IHJiX2hhc2hfYXJlZihmaWVsZF9pbmZvLCBuYW1lX3N5bSk7Ci0gICAgICByYl9pdl9zZXQoc2VsZiwgIkBzZXRmaWVsZCIsIElEMlNZTShyYl9pbnRlcm4oUlNUUklOR19QVFIobmFtZSkpKSk7CisgICAgICByYl9pdl9zZXQoc2VsZiwgIkBzZXRmaWVsZCIsIHJiX3N0cl9pbnRlcm4obmFtZSkpOwogICAgICAgcmJfaXZfc2V0KHNlbGYsICJAdmFsdWUiLCByZWFkX2FueXRoaW5nKHByb3RvY29sLCBmaWVsZF90eXBlLCBmaWVsZF9pbmZvKSk7CiAgICAgfSBlbHNlIHsKICAgICAgIHJiX2Z1bmNhbGwocHJvdG9jb2wsIHNraXBfbWV0aG9kX2lkLCAxLCBmaWVsZF90eXBlX3ZhbHVlKTsKQEAgLTY1Myw5ICs2NDYsNiBAQAogICAgIHJiX3JhaXNlKHJiX2VSdW50aW1lRXJyb3IsICJ0b28gbWFueSBmaWVsZHMgaW4gdW5pb24hIik7CiAgIH0KIAotICAvLyByZWFkIGZpZWxkIGVuZAotICBkZWZhdWx0X3JlYWRfZmllbGRfZW5kKHByb3RvY29sKTsKLQogICAvLyByZWFkIHN0cnVjdCBlbmQKICAgZGVmYXVsdF9yZWFkX3N0cnVjdF9lbmQocHJvdG9jb2wpOwogCkBAIC02ODAsNiArNjcwLDEwIEBACiAKICAgVkFMVUUgZmllbGRfaW5mbyA9IHJiX2hhc2hfYXJlZihzdHJ1Y3RfZmllbGRzLCBmaWVsZF9pZCk7CiAKKyAgaWYoTklMX1AoZmllbGRfaW5mbykpIHsKKyAgICByYl9yYWlzZShyYl9lUnVudGltZUVycm9yLCAic2V0X2ZpZWxkIGlzIG5vdCB2YWxpZCBmb3IgdGhpcyB1bmlvbiEiKTsKKyAgfQorCiAgIFZBTFVFIHR0eXBlX3ZhbHVlID0gcmJfaGFzaF9hcmVmKGZpZWxkX2luZm8sIHR5cGVfc3ltKTsKICAgaW50IHR0eXBlID0gRklYMklOVCh0dHlwZV92YWx1ZSk7CiAKZGlmZiAtLWdpdCBhL2xpYi9yYi9leHQvdGhyaWZ0X25hdGl2ZS5jIGIvbGliL3JiL2V4dC90aHJpZnRfbmF0aXZlLmMKaW5kZXggMmY2YmIxYS4uMzQzMGI3YyAxMDA2NDQKLS0tIGEvbGliL3JiL2V4dC90aHJpZnRfbmF0aXZlLmMKKysrIGIvbGliL3JiL2V4dC90aHJpZnRfbmF0aXZlLmMKQEAgLTE4LDE1ICsxOCwxNiBAQAogICovCiAKICNpbmNsdWRlIDxydWJ5Lmg+CisjaW5jbHVkZSA8Ynl0ZXMuaD4KICNpbmNsdWRlIDxzdHJ1Y3QuaD4KICNpbmNsdWRlIDxiaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQuaD4KICNpbmNsdWRlIDxjb21wYWN0X3Byb3RvY29sLmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wuaD4KICNpbmNsdWRlIDxtZW1vcnlfYnVmZmVyLmg+CiAKIC8vIGNhY2hlZCBjbGFzc2VzL21vZHVsZXMKIFZBTFVFIHJiX2NTZXQ7CiBWQUxVRSB0aHJpZnRfbW9kdWxlOworVkFMVUUgdGhyaWZ0X2J5dGVzX21vZHVsZTsKIFZBTFVFIHRocmlmdF90eXBlc19tb2R1bGU7CiAKIC8vIFRUeXBlIGNvbnN0YW50cwpAQCAtNTYsMTkgKzU3LDIwIEBACiBJRCB3cml0ZV9pNjRfbWV0aG9kX2lkOwogSUQgd3JpdGVfZG91YmxlX21ldGhvZF9pZDsKIElEIHdyaXRlX3N0cmluZ19tZXRob2RfaWQ7CitJRCB3cml0ZV9iaW5hcnlfbWV0aG9kX2lkOwogSUQgd3JpdGVfbWFwX2JlZ2luX21ldGhvZF9pZDsKIElEIHdyaXRlX21hcF9lbmRfbWV0aG9kX2lkOwogSUQgd3JpdGVfbGlzdF9iZWdpbl9tZXRob2RfaWQ7CiBJRCB3cml0ZV9saXN0X2VuZF9tZXRob2RfaWQ7CiBJRCB3cml0ZV9zZXRfYmVnaW5fbWV0aG9kX2lkOwogSUQgd3JpdGVfc2V0X2VuZF9tZXRob2RfaWQ7Ci1JRCBzaXplX21ldGhvZF9pZDsKIElEIHJlYWRfYm9vbF9tZXRob2RfaWQ7CiBJRCByZWFkX2J5dGVfbWV0aG9kX2lkOwogSUQgcmVhZF9pMTZfbWV0aG9kX2lkOwogSUQgcmVhZF9pMzJfbWV0aG9kX2lkOwogSUQgcmVhZF9pNjRfbWV0aG9kX2lkOwogSUQgcmVhZF9zdHJpbmdfbWV0aG9kX2lkOworSUQgcmVhZF9iaW5hcnlfbWV0aG9kX2lkOwogSUQgcmVhZF9kb3VibGVfbWV0aG9kX2lkOwogSUQgcmVhZF9tYXBfYmVnaW5fbWV0aG9kX2lkOwogSUQgcmVhZF9tYXBfZW5kX21ldGhvZF9pZDsKQEAgLTgxLDE1ICs4MywxNSBAQAogSUQgcmVhZF9maWVsZF9iZWdpbl9tZXRob2RfaWQ7CiBJRCByZWFkX2ZpZWxkX2VuZF9tZXRob2RfaWQ7CiBJRCBrZXlzX21ldGhvZF9pZDsKLUlEIGVudHJpZXNfbWV0aG9kX2lkOyAKLUlEIG5hbWVfbWV0aG9kX2lkOyAKLUlEIHNvcnRfbWV0aG9kX2lkOworSUQgZW50cmllc19tZXRob2RfaWQ7CiBJRCB3cml0ZV9maWVsZF9zdG9wX21ldGhvZF9pZDsKIElEIHNraXBfbWV0aG9kX2lkOwogSUQgd3JpdGVfbWV0aG9kX2lkOwogSUQgcmVhZF9hbGxfbWV0aG9kX2lkOwogSUQgcmVhZF9pbnRvX2J1ZmZlcl9tZXRob2RfaWQ7Ci1JRCBuYXRpdmVfcW1hcmtfbWV0aG9kX2lkOworSUQgZm9yY2VfYmluYXJ5X2VuY29kaW5nX2lkOworSUQgY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyX2lkOworSUQgY29udmVydF90b19zdHJpbmdfaWQ7CiAKIC8vIGNvbnN0YW50IGlkcwogSUQgZmllbGRzX2NvbnN0X2lkOwpAQCAtMTA0LDExICsxMDYsMTMgQEAKIFZBTFVFIHZhbHVlX3N5bTsKIFZBTFVFIGVsZW1lbnRfc3ltOwogVkFMVUUgY2xhc3Nfc3ltOworVkFMVUUgYmluYXJ5X3N5bTsKIFZBTFVFIHByb3RvY29sX2V4Y2VwdGlvbl9jbGFzczsKIAogdm9pZCBJbml0X3RocmlmdF9uYXRpdmUoKSB7CiAgIC8vIGNhY2hlZCBjbGFzc2VzCiAgIHRocmlmdF9tb2R1bGUgPSByYl9jb25zdF9nZXQocmJfY09iamVjdCwgcmJfaW50ZXJuKCJUaHJpZnQiKSk7CisgIHRocmlmdF9ieXRlc19tb2R1bGUgPSByYl9jb25zdF9nZXQodGhyaWZ0X21vZHVsZSwgcmJfaW50ZXJuKCJCeXRlcyIpKTsKICAgdGhyaWZ0X3R5cGVzX21vZHVsZSA9IHJiX2NvbnN0X2dldCh0aHJpZnRfbW9kdWxlLCByYl9pbnRlcm4oIlR5cGVzIikpOwogICByYl9jU2V0ID0gcmJfY29uc3RfZ2V0KHJiX2NPYmplY3QsIHJiX2ludGVybigiU2V0IikpOwogICBwcm90b2NvbF9leGNlcHRpb25fY2xhc3MgPSByYl9jb25zdF9nZXQodGhyaWZ0X21vZHVsZSwgcmJfaW50ZXJuKCJQcm90b2NvbEV4Y2VwdGlvbiIpKTsKQEAgLTEzOSwxOSArMTQzLDIwIEBACiAgIHdyaXRlX2k2NF9tZXRob2RfaWQgPSByYl9pbnRlcm4oIndyaXRlX2k2NCIpOwogICB3cml0ZV9kb3VibGVfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJ3cml0ZV9kb3VibGUiKTsKICAgd3JpdGVfc3RyaW5nX21ldGhvZF9pZCA9IHJiX2ludGVybigid3JpdGVfc3RyaW5nIik7CisgIHdyaXRlX2JpbmFyeV9tZXRob2RfaWQgPSByYl9pbnRlcm4oIndyaXRlX2JpbmFyeSIpOwogICB3cml0ZV9tYXBfYmVnaW5fbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJ3cml0ZV9tYXBfYmVnaW4iKTsKICAgd3JpdGVfbWFwX2VuZF9tZXRob2RfaWQgPSByYl9pbnRlcm4oIndyaXRlX21hcF9lbmQiKTsKICAgd3JpdGVfbGlzdF9iZWdpbl9tZXRob2RfaWQgPSByYl9pbnRlcm4oIndyaXRlX2xpc3RfYmVnaW4iKTsKICAgd3JpdGVfbGlzdF9lbmRfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJ3cml0ZV9saXN0X2VuZCIpOwogICB3cml0ZV9zZXRfYmVnaW5fbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJ3cml0ZV9zZXRfYmVnaW4iKTsKICAgd3JpdGVfc2V0X2VuZF9tZXRob2RfaWQgPSByYl9pbnRlcm4oIndyaXRlX3NldF9lbmQiKTsKLSAgc2l6ZV9tZXRob2RfaWQgPSByYl9pbnRlcm4oInNpemUiKTsKICAgcmVhZF9ib29sX21ldGhvZF9pZCA9IHJiX2ludGVybigicmVhZF9ib29sIik7CiAgIHJlYWRfYnl0ZV9tZXRob2RfaWQgPSByYl9pbnRlcm4oInJlYWRfYnl0ZSIpOwogICByZWFkX2kxNl9tZXRob2RfaWQgPSByYl9pbnRlcm4oInJlYWRfaTE2Iik7CiAgIHJlYWRfaTMyX21ldGhvZF9pZCA9IHJiX2ludGVybigicmVhZF9pMzIiKTsKICAgcmVhZF9pNjRfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJyZWFkX2k2NCIpOwogICByZWFkX3N0cmluZ19tZXRob2RfaWQgPSByYl9pbnRlcm4oInJlYWRfc3RyaW5nIik7CisgIHJlYWRfYmluYXJ5X21ldGhvZF9pZCA9IHJiX2ludGVybigicmVhZF9iaW5hcnkiKTsKICAgcmVhZF9kb3VibGVfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJyZWFkX2RvdWJsZSIpOwogICByZWFkX21hcF9iZWdpbl9tZXRob2RfaWQgPSByYl9pbnRlcm4oInJlYWRfbWFwX2JlZ2luIik7CiAgIHJlYWRfbWFwX2VuZF9tZXRob2RfaWQgPSByYl9pbnRlcm4oInJlYWRfbWFwX2VuZCIpOyAgCkBAIC0xNjUsMTQgKzE3MCwxNCBAQAogICByZWFkX2ZpZWxkX2VuZF9tZXRob2RfaWQgPSByYl9pbnRlcm4oInJlYWRfZmllbGRfZW5kIik7CiAgIGtleXNfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJrZXlzIik7CiAgIGVudHJpZXNfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJlbnRyaWVzIik7Ci0gIG5hbWVfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJuYW1lIik7Ci0gIHNvcnRfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJzb3J0Iik7CiAgIHdyaXRlX2ZpZWxkX3N0b3BfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJ3cml0ZV9maWVsZF9zdG9wIik7CiAgIHNraXBfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJza2lwIik7CiAgIHdyaXRlX21ldGhvZF9pZCA9IHJiX2ludGVybigid3JpdGUiKTsKICAgcmVhZF9hbGxfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJyZWFkX2FsbCIpOwogICByZWFkX2ludG9fYnVmZmVyX21ldGhvZF9pZCA9IHJiX2ludGVybigicmVhZF9pbnRvX2J1ZmZlciIpOwotICBuYXRpdmVfcW1hcmtfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJuYXRpdmU/Iik7CisgIGZvcmNlX2JpbmFyeV9lbmNvZGluZ19pZCA9IHJiX2ludGVybigiZm9yY2VfYmluYXJ5X2VuY29kaW5nIik7CisgIGNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcl9pZCA9IHJiX2ludGVybigiY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyIik7CisgIGNvbnZlcnRfdG9fc3RyaW5nX2lkID0gcmJfaW50ZXJuKCJjb252ZXJ0X3RvX3N0cmluZyIpOwogCiAgIC8vIGNvbnN0YW50IGlkcwogICBmaWVsZHNfY29uc3RfaWQgPSByYl9pbnRlcm4oIkZJRUxEUyIpOwpAQCAtMTg3LDggKzE5Miw4IEBACiAgIHZhbHVlX3N5bSA9IElEMlNZTShyYl9pbnRlcm4oInZhbHVlIikpOwogICBlbGVtZW50X3N5bSA9IElEMlNZTShyYl9pbnRlcm4oImVsZW1lbnQiKSk7CiAgIGNsYXNzX3N5bSA9IElEMlNZTShyYl9pbnRlcm4oImNsYXNzIikpOworICBiaW5hcnlfc3ltID0gSUQyU1lNKHJiX2ludGVybigiYmluYXJ5IikpOwogCi0gIEluaXRfcHJvdG9jb2woKTsKICAgSW5pdF9zdHJ1Y3QoKTsKICAgSW5pdF9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQoKTsKICAgSW5pdF9jb21wYWN0X3Byb3RvY29sKCk7CmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0LnJiCmluZGV4IDAyZDY3YjguLjBmNTgxMjIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0LnJiCkBAIC0xLDQgKzEsNCBAQAotIyAKKyMKICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQogIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgpAQCAtNiwyNiArNiwyOCBAQAogIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCiAjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKICMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAorIwogIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKKyMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KLSMgCisjCiAjIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCiAjIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCiAjIGRldGFpbHMuCiAKICQ6LnVuc2hpZnQgRmlsZS5kaXJuYW1lKF9fRklMRV9fKQogCityZXF1aXJlICd0aHJpZnQvYnl0ZXMnCiByZXF1aXJlICd0aHJpZnQvY29yZV9leHQnCiByZXF1aXJlICd0aHJpZnQvZXhjZXB0aW9ucycKIHJlcXVpcmUgJ3RocmlmdC90eXBlcycKIHJlcXVpcmUgJ3RocmlmdC9wcm9jZXNzb3InCityZXF1aXJlICd0aHJpZnQvbXVsdGlwbGV4ZWRfcHJvY2Vzc29yJwogcmVxdWlyZSAndGhyaWZ0L2NsaWVudCcKIHJlcXVpcmUgJ3RocmlmdC9zdHJ1Y3QnCiByZXF1aXJlICd0aHJpZnQvdW5pb24nCkBAIC00MCwxMiArNDIsMTYgQEAKIHJlcXVpcmUgJ3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2wnCiByZXF1aXJlICd0aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkJwogcmVxdWlyZSAndGhyaWZ0L3Byb3RvY29sL2NvbXBhY3RfcHJvdG9jb2wnCityZXF1aXJlICd0aHJpZnQvcHJvdG9jb2wvanNvbl9wcm90b2NvbCcKK3JlcXVpcmUgJ3RocmlmdC9wcm90b2NvbC9tdWx0aXBsZXhlZF9wcm90b2NvbCcKIAogIyB0cmFuc3BvcnQKIHJlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvYmFzZV90cmFuc3BvcnQnCiByZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L2Jhc2Vfc2VydmVyX3RyYW5zcG9ydCcKIHJlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvc29ja2V0JworcmVxdWlyZSAndGhyaWZ0L3RyYW5zcG9ydC9zc2xfc29ja2V0JwogcmVxdWlyZSAndGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0JworcmVxdWlyZSAndGhyaWZ0L3RyYW5zcG9ydC9zc2xfc2VydmVyX3NvY2tldCcKIHJlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvdW5peF9zb2NrZXQnCiByZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L3VuaXhfc2VydmVyX3NvY2tldCcKIHJlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvYnVmZmVyZWRfdHJhbnNwb3J0JwpkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvYnl0ZXMucmIgYi9saWIvcmIvbGliL3RocmlmdC9ieXRlcy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmQ0ZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvYnl0ZXMucmIKQEAgLTAsMCArMSwxMzEgQEAKKyMgZW5jb2Rpbmc6IGFzY2lpLThiaXQKKyMgCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMgCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIAorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCittb2R1bGUgVGhyaWZ0CisgICMgQSBjb2xsZWN0aW9uIG9mIHV0aWxpdGllcyBmb3Igd29ya2luZyB3aXRoIGJ5dGVzIGFuZCBieXRlIGJ1ZmZlcnMuCisgIG1vZHVsZSBCeXRlcworICAgIGlmIFJVQllfVkVSU0lPTiA+PSAnMS45JworICAgICAgIyBDcmVhdGVzIGFuZCBlbXB0eSBieXRlIGJ1ZmZlciAoU3RyaW5nIHdpdGggQklOQVJZIGVuY29kaW5nKQorICAgICAgIworICAgICAgIyBzaXplIC0gVGhlIEludGVnZXIgc2l6ZSBvZiB0aGUgYnVmZmVyIChkZWZhdWx0OiBuaWwpIHRvIGNyZWF0ZQorICAgICAgIworICAgICAgIyBSZXR1cm5zIGEgU3RyaW5nIHdpdGggQklOQVJZIGVuY29kaW5nLCBmaWxsZWQgd2l0aCBudWxsIGNoYXJhY3RlcnMgCisgICAgICAjIGlmIHNpemUgaXMgZ3JlYXRlciB0aGFuIHplcm8KKyAgICAgIGRlZiBzZWxmLmVtcHR5X2J5dGVfYnVmZmVyKHNpemUgPSBuaWwpCisgICAgICAgIGlmIChzaXplICYmIHNpemUgPiAwKQorICAgICAgICAgICJcMCIuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OkJJTkFSWSkgKiBzaXplCisgICAgICAgIGVsc2UKKyAgICAgICAgICAnJy5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6QklOQVJZKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjIEZvcmNlcyB0aGUgZW5jb2Rpbmcgb2YgdGhlIGJ1ZmZlciB0byBCSU5BUlkuIElmIHRoZSBidWZmZXIKKyAgICAgICMgcGFzc2VkIGlzIGZyb3plbiwgdGhlbiBpdCB3aWxsIGJlIGR1cGxpY2F0ZWQuCisgICAgICAjCisgICAgICAjIGJ1ZmZlciAtIFRoZSBTdHJpbmcgdG8gZm9yY2UgdGhlIGVuY29kaW5nIG9mLgorICAgICAgIworICAgICAgIyBSZXR1cm5zIHRoZSBTdHJpbmcgcGFzc2VkIHdpdGggYW4gZW5jb2Rpbmcgb2YgQklOQVJZOyByZXR1cm5lZAorICAgICAgIyBTdHJpbmcgbWF5IGJlIGEgZHVwbGljYXRlLgorICAgICAgZGVmIHNlbGYuZm9yY2VfYmluYXJ5X2VuY29kaW5nKGJ1ZmZlcikKKyAgICAgICAgYnVmZmVyID0gYnVmZmVyLmR1cCBpZiBidWZmZXIuZnJvemVuPworICAgICAgICBidWZmZXIuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgIGVuZAorCisgICAgICAjIEdldHMgdGhlIGJ5dGUgdmFsdWUgb2YgYSBnaXZlbiBwb3NpdGlvbiBpbiBhIFN0cmluZy4KKyAgICAgICMKKyAgICAgICMgc3RyaW5nIC0gVGhlIFN0cmluZyB0byByZXRyaXZlIHRoZSBieXRlIHZhbHVlIGZyb20uCisgICAgICAjIGluZGV4ICAtIFRoZSBJbnRlZ2VyIGxvY2F0aW9uIG9mIHRoZSBieXRlIHZhbHVlIHRvIHJldHJpZXZlLgorICAgICAgIworICAgICAgIyBSZXR1cm5zIGFuIEludGVnZXIgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUuCisgICAgICBkZWYgc2VsZi5nZXRfc3RyaW5nX2J5dGUoc3RyaW5nLCBpbmRleCkKKyAgICAgICAgc3RyaW5nLmdldGJ5dGUoaW5kZXgpCisgICAgICBlbmQKKworICAgICAgIyBTZXRzIHRoZSBieXRlIHZhbHVlIGdpdmVuIHRvIGEgZ2l2ZW4gaW5kZXggaW4gYSBTdHJpbmcuCisgICAgICAjCisgICAgICAjIHN0cmluZyAtIFRoZSBTdHJpbmcgdG8gc2V0IHRoZSBieXRlIHZhbHVlIGluLgorICAgICAgIyBpbmRleCAgLSBUaGUgSW50ZWdlciBsb2NhdGlvbiB0byBzZXQgdGhlIGJ5dGUgdmFsdWUgYXQuCisgICAgICAjIGJ5dGUgICAtIFRoZSBJbnRlZ2VyIHZhbHVlICgwIHRvIDI1NSkgdG8gc2V0IGluIHRoZSBzdHJpbmcuCisgICAgICAjCisgICAgICAjIFJldHVybnMgYW4gSW50ZWdlciB2YWx1ZSBvZiB0aGUgYnl0ZSB2YWx1ZSB0byBzZXQuCisgICAgICBkZWYgc2VsZi5zZXRfc3RyaW5nX2J5dGUoc3RyaW5nLCBpbmRleCwgYnl0ZSkKKyAgICAgICAgc3RyaW5nLnNldGJ5dGUoaW5kZXgsIGJ5dGUpCisgICAgICBlbmQKKworICAgICAgIyBDb252ZXJ0cyB0aGUgZ2l2ZW4gU3RyaW5nIHRvIGEgVVRGLTggYnl0ZSBidWZmZXIuCisgICAgICAjCisgICAgICAjIHN0cmluZyAtIFRoZSBTdHJpbmcgdG8gY29udmVydC4KKyAgICAgICMKKyAgICAgICMgUmV0dXJucyBhIG5ldyBTdHJpbmcgd2l0aCBCSU5BUlkgZW5jb2RpbmcsIGNvbnRhaW5pbmcgdGhlIFVURi04CisgICAgICAjIGJ5dGVzIG9mIHRoZSBvcmlnaW5hbCBzdHJpbmcuCisgICAgICBkZWYgc2VsZi5jb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIoc3RyaW5nKQorICAgICAgICBpZiBzdHJpbmcuZW5jb2RpbmcgIT0gRW5jb2Rpbmc6OlVURl84CisgICAgICAgICAgIyB0cmFuc2NvZGUgdG8gVVRGLTgKKyAgICAgICAgICBzdHJpbmcgPSBzdHJpbmcuZW5jb2RlKEVuY29kaW5nOjpVVEZfOCkKKyAgICAgICAgZWxzZQorICAgICAgICAgICMgZW5jb2RpbmcgaXMgYWxyZWFkeSBVVEYtOCwgYnV0IGEgZHVwbGljYXRlIGlzIG5lZWRlZAorICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5kdXAKKyAgICAgICAgZW5kCisgICAgICAgIHN0cmluZy5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6QklOQVJZKQorICAgICAgZW5kCisKKyAgICAgICMgQ29udmVydHMgdGhlIGdpdmVuIFVURi04IGJ5dGUgYnVmZmVyIGludG8gYSBTdHJpbmcKKyAgICAgICMKKyAgICAgICMgdXRmOF9idWZmZXIgLSBBIFN0cmluZywgd2l0aCBCSU5BUlkgZW5jb2RpbmcsIGNvbnRhaW5pbmcgVVRGLTggYnl0ZXMKKyAgICAgICMKKyAgICAgICMgUmV0dXJucyBhIG5ldyBTdHJpbmcgd2l0aCBVVEYtOCBlbmNvZGluZywKKyAgICAgIGRlZiBzZWxmLmNvbnZlcnRfdG9fc3RyaW5nKHV0ZjhfYnVmZmVyKQorICAgICAgICAjIGR1cGxpY2F0ZSB0aGUgYnVmZmVyLCBmb3JjZSBlbmNvZGluZyB0byBVVEYtOAorICAgICAgICB1dGY4X2J1ZmZlci5kdXAuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OlVURl84KQorICAgICAgZW5kCisgICAgZWxzZQorICAgICAgZGVmIHNlbGYuZW1wdHlfYnl0ZV9idWZmZXIoc2l6ZSA9IG5pbCkKKyAgICAgICAgaWYgKHNpemUgJiYgc2l6ZSA+IDApCisgICAgICAgICAgIlwwIiAqIHNpemUKKyAgICAgICAgZWxzZQorICAgICAgICAgICcnCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmZvcmNlX2JpbmFyeV9lbmNvZGluZyhidWZmZXIpCisgICAgICAgIGJ1ZmZlcgorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmdldF9zdHJpbmdfYnl0ZShzdHJpbmcsIGluZGV4KQorICAgICAgICBzdHJpbmdbaW5kZXhdCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuc2V0X3N0cmluZ19ieXRlKHN0cmluZywgaW5kZXgsIGJ5dGUpCisgICAgICAgIHN0cmluZ1tpbmRleF0gPSBieXRlCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyKHN0cmluZykKKyAgICAgICAgIyBUaGlzIGFzc3VtZXMgJEtDT0RFIGlzICdVVEY4Jy8nVScsIHdoaWNoIHdvdWxkIG1lYW4gdGhlIFN0cmluZyBpcyBhbHJlYWR5IGEgVVRGLTggYnl0ZSBidWZmZXIKKyAgICAgICAgIyBUT0RPIGNvbnNpZGVyIGhhbmRsaW5nIG90aGVyICRLQ09ERSB2YWx1ZXMgYW5kIHRyYW5zY29kaW5nIHdpdGggaWNvbnYKKyAgICAgICAgc3RyaW5nCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuY29udmVydF90b19zdHJpbmcodXRmOF9idWZmZXIpCisgICAgICAgICMgU2VlIGNvbW1lbnQgaW4gJ2NvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcicgZm9yIHJlbGV2YW50IGFzc3VtcHRpb25zLgorICAgICAgICB1dGY4X2J1ZmZlcgorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9jbGllbnQucmIgYi9saWIvcmIvbGliL3RocmlmdC9jbGllbnQucmIKaW5kZXggNWIzMGYwMS4uNjRlZjA1OSAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvY2xpZW50LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L2NsaWVudC5yYgpAQCAtMSw0ICsxLDQgQEAKLSMgCisjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKICMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KQEAgLTYsMTYgKzYsMTYgQEAKICMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQogIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKKyMKICMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCisjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KICMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCiAjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jIAorIwogCiBtb2R1bGUgVGhyaWZ0CiAgIG1vZHVsZSBDbGllbnQKQEAgLTI3LDYgKzI3LDE1IEBACiAKICAgICBkZWYgc2VuZF9tZXNzYWdlKG5hbWUsIGFyZ3NfY2xhc3MsIGFyZ3MgPSB7fSkKICAgICAgIEBvcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKG5hbWUsIE1lc3NhZ2VUeXBlczo6Q0FMTCwgQHNlcWlkKQorICAgICAgc2VuZF9tZXNzYWdlX2FyZ3MoYXJnc19jbGFzcywgYXJncykKKyAgICBlbmQKKworICAgIGRlZiBzZW5kX29uZXdheV9tZXNzYWdlKG5hbWUsIGFyZ3NfY2xhc3MsIGFyZ3MgPSB7fSkKKyAgICAgIEBvcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKG5hbWUsIE1lc3NhZ2VUeXBlczo6T05FV0FZLCBAc2VxaWQpCisgICAgICBzZW5kX21lc3NhZ2VfYXJncyhhcmdzX2NsYXNzLCBhcmdzKQorICAgIGVuZAorCisgICAgZGVmIHNlbmRfbWVzc2FnZV9hcmdzKGFyZ3NfY2xhc3MsIGFyZ3MpCiAgICAgICBkYXRhID0gYXJnc19jbGFzcy5uZXcKICAgICAgIGFyZ3MuZWFjaCBkbyB8aywgdnwKICAgICAgICAgZGF0YS5zZW5kKCIje2sudG9fc309IiwgdikKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L2V4Y2VwdGlvbnMucmIgYi9saWIvcmIvbGliL3RocmlmdC9leGNlcHRpb25zLnJiCmluZGV4IDJjY2M3Y2UuLjY4Y2I5ZTAgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L2V4Y2VwdGlvbnMucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvZXhjZXB0aW9ucy5yYgpAQCAtMzcsNiArMzcsOSBAQAogICAgIE1JU1NJTkdfUkVTVUxUID0gNQogICAgIElOVEVSTkFMX0VSUk9SID0gNgogICAgIFBST1RPQ09MX0VSUk9SID0gNworICAgIElOVkFMSURfVFJBTlNGT1JNID0gOAorICAgIElOVkFMSURfUFJPVE9DT0wgPSA5CisgICAgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMAogCiAgICAgYXR0cl9yZWFkZXIgOnR5cGUKIApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MzRjMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm9jZXNzb3IucmIKQEAgLTAsMCArMSw3NiBAQAorIyAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3JlcXVpcmUgJ3RocmlmdC9wcm90b2NvbC9wcm90b2NvbF9kZWNvcmF0b3InCityZXF1aXJlICd0aHJpZnQvcHJvdG9jb2wvYmFzZV9wcm90b2NvbCcKKworbW9kdWxlIFRocmlmdAorICBjbGFzcyBNdWx0aXBsZXhlZFByb2Nlc3NvcgorICAgIGRlZiBpbml0aWFsaXplCisgICAgICBAYWN0dWFsX3Byb2Nlc3NvcnMgPSB7fQorICAgIGVuZAorIAorICAgIGRlZiByZWdpc3Rlcl9wcm9jZXNzb3Ioc2VydmljZV9uYW1lLCBwcm9jZXNzb3IpCisgICAgICBAYWN0dWFsX3Byb2Nlc3NvcnNbc2VydmljZV9uYW1lXSA9IHByb2Nlc3NvcgorICAgIGVuZAorIAorICAgIGRlZiBwcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgIG5hbWUsIHR5cGUsIHNlcWlkID0gaXByb3QucmVhZF9tZXNzYWdlX2JlZ2luCisgICAgICBjaGVja190eXBlKHR5cGUpCisgICAgICBjaGVja19zZXBhcmF0b3IobmFtZSkKKyAgICAgIHNlcnZpY2VfbmFtZSwgbWV0aG9kID0gbmFtZS5zcGxpdCgnOicpCisgICAgICBwcm9jZXNzb3Ioc2VydmljZV9uYW1lKS5wcm9jZXNzKFN0b3JlZE1lc3NhZ2VQcm90b2NvbC5uZXcoaXByb3QsIFttZXRob2QsIHR5cGUsIHNlcWlkXSksIG9wcm90KQorICAgIGVuZAorCisgICAgcHJvdGVjdGVkCisKKyAgICBkZWYgcHJvY2Vzc29yKHNlcnZpY2VfbmFtZSkKKyAgICAgIGlmIEBhY3R1YWxfcHJvY2Vzc29ycy5oYXNfa2V5PyhzZXJ2aWNlX25hbWUpCisgICAgICAgIEBhY3R1YWxfcHJvY2Vzc29yc1tzZXJ2aWNlX25hbWVdCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIFRocmlmdDo6RXhjZXB0aW9uLm5ldygiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogI3tzZXJ2aWNlX25hbWV9LiBEaWQgeW91IGZvcmdldCB0byBjYWxsICN7c2VsZi5jbGFzcy5uYW1lfSNyZWdpc3Rlcl9wcm9jZXNzb3I/IikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGNoZWNrX3R5cGUodHlwZSkKKyAgICAgIHVubGVzcyBbTWVzc2FnZVR5cGVzOjpDQUxMLCBNZXNzYWdlVHlwZXM6Ok9ORVdBWV0uaW5jbHVkZT8odHlwZSkKKyAgICAgICAgcmFpc2UgVGhyaWZ0OjpFeGNlcHRpb24ubmV3KCdUaGlzIHNob3VsZCBub3QgaGF2ZSBoYXBwZW5lZCE/JykKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGNoZWNrX3NlcGFyYXRvcihuYW1lKQorICAgICAgaWYgbmFtZS5jb3VudCgnOicpIDwgMQorICAgICAgICByYWlzZSBUaHJpZnQ6OkV4Y2VwdGlvbi5uZXcoIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiAje25hbWV9LiBEaWQgeW91IGZvcmdldCB0byB1c2UgYSBUaHJpZnQ6OlByb3RvY29sOjpNdWx0aXBsZXhlZFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgY2xhc3MgU3RvcmVkTWVzc2FnZVByb3RvY29sIDwgQmFzZVByb3RvY29sCisKKyAgICBpbmNsdWRlIFByb3RvY29sRGVjb3JhdG9yCisgICAgCisgICAgZGVmIGluaXRpYWxpemUocHJvdG9jb2wsIG1lc3NhZ2VfYmVnaW4pCisgICAgICBzdXBlcihwcm90b2NvbCkKKyAgICAgIEBtZXNzYWdlX2JlZ2luID0gbWVzc2FnZV9iZWdpbgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbWVzc2FnZV9iZWdpbgorICAgICAgQG1lc3NhZ2VfYmVnaW4KKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb2Nlc3Nvci5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb2Nlc3Nvci5yYgppbmRleCA1ZDllMGExLi5jZTIxZTEyIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9wcm9jZXNzb3IucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvY2Vzc29yLnJiCkBAIC0xNywyNSArMTcsMzYgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjIAogCityZXF1aXJlICdsb2dnZXInCisKIG1vZHVsZSBUaHJpZnQKICAgbW9kdWxlIFByb2Nlc3NvcgotICAgIGRlZiBpbml0aWFsaXplKGhhbmRsZXIpCisgICAgZGVmIGluaXRpYWxpemUoaGFuZGxlciwgbG9nZ2VyPW5pbCkKICAgICAgIEBoYW5kbGVyID0gaGFuZGxlcgorICAgICAgaWYgbG9nZ2VyLm5pbD8KKyAgICAgICAgQGxvZ2dlciA9IExvZ2dlci5uZXcoU1RERVJSKQorICAgICAgICBAbG9nZ2VyLmxldmVsID0gTG9nZ2VyOjpXQVJOCisgICAgICBlbHNlCisgICAgICAgIEBsb2dnZXIgPSBsb2dnZXIKKyAgICAgIGVuZAogICAgIGVuZAogCiAgICAgZGVmIHByb2Nlc3MoaXByb3QsIG9wcm90KQogICAgICAgbmFtZSwgdHlwZSwgc2VxaWQgID0gaXByb3QucmVhZF9tZXNzYWdlX2JlZ2luCiAgICAgICBpZiByZXNwb25kX3RvPygicHJvY2Vzc18je25hbWV9IikKLSAgICAgICAgc2VuZCgicHJvY2Vzc18je25hbWV9Iiwgc2VxaWQsIGlwcm90LCBvcHJvdCkKKyAgICAgICAgYmVnaW4KKyAgICAgICAgICBzZW5kKCJwcm9jZXNzXyN7bmFtZX0iLCBzZXFpZCwgaXByb3QsIG9wcm90KQorICAgICAgICByZXNjdWUgPT4gZQorICAgICAgICAgIHggPSBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoQXBwbGljYXRpb25FeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLCAnSW50ZXJuYWwgZXJyb3InKQorICAgICAgICAgIEBsb2dnZXIuZGVidWcgIkludGVybmFsIGVycm9yIDogI3tlLm1lc3NhZ2V9XG4je2UuYmFja3RyYWNlLmpvaW4oIlxuIil9IgorICAgICAgICAgIHdyaXRlX2Vycm9yKHgsIG9wcm90LCBuYW1lLCBzZXFpZCkKKyAgICAgICAgZW5kCiAgICAgICAgIHRydWUKICAgICAgIGVsc2UKICAgICAgICAgaXByb3Quc2tpcChUeXBlczo6U1RSVUNUKQogICAgICAgICBpcHJvdC5yZWFkX21lc3NhZ2VfZW5kCiAgICAgICAgIHggPSBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCAnVW5rbm93biBmdW5jdGlvbiAnK25hbWUpCi0gICAgICAgIG9wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4obmFtZSwgTWVzc2FnZVR5cGVzOjpFWENFUFRJT04sIHNlcWlkKQotICAgICAgICB4LndyaXRlKG9wcm90KQotICAgICAgICBvcHJvdC53cml0ZV9tZXNzYWdlX2VuZAotICAgICAgICBvcHJvdC50cmFucy5mbHVzaAorICAgICAgICB3cml0ZV9lcnJvcih4LCBvcHJvdCwgbmFtZSwgc2VxaWQpCiAgICAgICAgIGZhbHNlCiAgICAgICBlbmQKICAgICBlbmQKQEAgLTUzLDUgKzY0LDEyIEBACiAgICAgICBvcHJvdC53cml0ZV9tZXNzYWdlX2VuZAogICAgICAgb3Byb3QudHJhbnMuZmx1c2gKICAgICBlbmQKKworICAgIGRlZiB3cml0ZV9lcnJvcihlcnIsIG9wcm90LCBuYW1lLCBzZXFpZCkKKyAgICAgIG9wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4obmFtZSwgTWVzc2FnZVR5cGVzOjpFWENFUFRJT04sIHNlcWlkKQorICAgICAgZXJyLndyaXRlKG9wcm90KQorICAgICAgb3Byb3Qud3JpdGVfbWVzc2FnZV9lbmQKKyAgICAgIG9wcm90LnRyYW5zLmZsdXNoCisgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iYXNlX3Byb3RvY29sLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmFzZV9wcm90b2NvbC5yYgppbmRleCBiMTk5MDlkLi41YzY5M2U5IDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iYXNlX3Byb3RvY29sLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2Jhc2VfcHJvdG9jb2wucmIKQEAgLTI4LDYgKzI4LDggQEAKICAgICBORUdBVElWRV9TSVpFID0gMgogICAgIFNJWkVfTElNSVQgPSAzCiAgICAgQkFEX1ZFUlNJT04gPSA0CisgICAgTk9UX0lNUExFTUVOVEVEID0gNQorICAgIERFUFRIX0xJTUlUID0gNgogCiAgICAgYXR0cl9yZWFkZXIgOnR5cGUKIApAQCAtMTE0LDEwICsxMTYsMjcgQEAKICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICBlbmQKIAorICAgICMgV3JpdGVzIGEgVGhyaWZ0IFN0cmluZy4gSW4gUnVieSAxLjkrLCB0aGUgU3RyaW5nIHBhc3NlZCB3aWxsIGJlIHRyYW5zY29kZWQgdG8gVVRGLTguCisgICAgIworICAgICMgc3RyIC0gVGhlIFN0cmluZyB0byB3cml0ZS4KKyAgICAjCisgICAgIyBSYWlzZXMgRW5jb2RpbmdFcnJvciBpZiB0aGUgdHJhbnNjb2RpbmcgdG8gVVRGLTggZmFpbHMuCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nLgogICAgIGRlZiB3cml0ZV9zdHJpbmcoc3RyKQogICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgIGVuZAogCisgICAgIyBXcml0ZXMgYSBUaHJpZnQgQmluYXJ5IChUaHJpZnQgU3RyaW5nIHdpdGggbm8gZW5jb2RpbmcpLiBJbiBSdWJ5IDEuOSssIHRoZSBTdHJpbmcgcGFzc2VkCisgICAgIyB3aWxsIGZvcmNlZCBpbnRvIEJJTkFSWSBlbmNvZGluZy4KKyAgICAjCisgICAgIyBidWYgLSBUaGUgU3RyaW5nIHRvIHdyaXRlLgorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZy4KKyAgICBkZWYgd3JpdGVfYmluYXJ5KGJ1ZikKKyAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICBlbmQKKwogICAgIGRlZiByZWFkX21lc3NhZ2VfYmVnaW4KICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICBlbmQKQEAgLTE3OCwxOCArMTk3LDY3IEBACiAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgZW5kCiAKKyAgICAjIFJlYWRzIGEgVGhyaWZ0IFN0cmluZy4gSW4gUnVieSAxLjkrLCBhbGwgU3RyaW5ncyB3aWxsIGJlIHJldHVybmVkIHdpdGggYW4gRW5jb2Rpbmcgb2YgVVRGLTguCisgICAgIworICAgICMgUmV0dXJucyBhIFN0cmluZy4KICAgICBkZWYgcmVhZF9zdHJpbmcKICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICBlbmQKIAotICAgIGRlZiB3cml0ZV9maWVsZChuYW1lLCB0eXBlLCBmaWQsIHZhbHVlKQotICAgICAgd3JpdGVfZmllbGRfYmVnaW4obmFtZSwgdHlwZSwgZmlkKQotICAgICAgd3JpdGVfdHlwZSh0eXBlLCB2YWx1ZSkKKyAgICAjIFJlYWRzIGEgVGhyaWZ0IEJpbmFyeSAoVGhyaWZ0IFN0cmluZyB3aXRob3V0IGVuY29kaW5nKS4gSW4gUnVieSAxLjkrLCBhbGwgU3RyaW5ncyB3aWxsIGJlIHJldHVybmVkCisgICAgIyB3aXRoIGFuIEVuY29kaW5nIG9mIEJJTkFSWS4KKyAgICAjCisgICAgIyBSZXR1cm5zIGEgU3RyaW5nLgorICAgIGRlZiByZWFkX2JpbmFyeQorICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorICAgIGVuZAorCisgICAgIyBXcml0ZXMgYSBmaWVsZCBiYXNlZCBvbiB0aGUgZmllbGQgaW5mb3JtYXRpb24sIGZpZWxkIElEIGFuZCB2YWx1ZS4KKyAgICAjCisgICAgIyBmaWVsZF9pbmZvIC0gQSBIYXNoIGNvbnRhaW5pbmcgdGhlIGRlZmluaXRpb24gb2YgdGhlIGZpZWxkOgorICAgICMgICAgICAgICAgICAgIDpuYW1lICAgLSBUaGUgbmFtZSBvZiB0aGUgZmllbGQuCisgICAgIyAgICAgICAgICAgICAgOnR5cGUgICAtIFRoZSB0eXBlIG9mIHRoZSBmaWVsZCwgd2hpY2ggbXVzdCBiZSBhIFRocmlmdDo6VHlwZXMgY29uc3RhbnQuCisgICAgIyAgICAgICAgICAgICAgOmJpbmFyeSAtIEEgQm9vbGVhbiBmbGFnIHRoYXQgaW5kaWNhdGVzIGlmIFRocmlmdDo6VHlwZXM6OlNUUklORyBpcyBhIGJpbmFyeSBzdHJpbmcgKHN0cmluZyB3aXRob3V0IGVuY29kaW5nKS4KKyAgICAjIGZpZCAgICAgICAgLSBUaGUgSUQgb2YgdGhlIGZpZWxkLgorICAgICMgdmFsdWUgICAgICAtIFRoZSBmaWVsZCdzIHZhbHVlIHRvIHdyaXRlOyBvYmplY3QgdHlwZSB2YXJpZXMgYmFzZWQgb24gOnR5cGUuCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nLgorICAgIGRlZiB3cml0ZV9maWVsZCgqYXJncykKKyAgICAgIGlmIGFyZ3Muc2l6ZSA9PSAzCisgICAgICAgICMgaGFuZGxlcyB0aGUgZG9jdW1lbnRlZCBtZXRob2Qgc2lnbmF0dXJlIC0gd3JpdGVfZmllbGQoZmllbGRfaW5mbywgZmlkLCB2YWx1ZSkKKyAgICAgICAgZmllbGRfaW5mbyA9IGFyZ3NbMF0KKyAgICAgICAgZmlkID0gYXJnc1sxXQorICAgICAgICB2YWx1ZSA9IGFyZ3NbMl0KKyAgICAgIGVsc2lmIGFyZ3Muc2l6ZSA9PSA0CisgICAgICAgICMgaGFuZGxlcyB0aGUgZGVwcmVjYXRlZCBtZXRob2Qgc2lnbmF0dXJlIC0gd3JpdGVfZmllbGQobmFtZSwgdHlwZSwgZmlkLCB2YWx1ZSkKKyAgICAgICAgZmllbGRfaW5mbyA9IHs6bmFtZSA9PiBhcmdzWzBdLCA6dHlwZSA9PiBhcmdzWzFdfQorICAgICAgICBmaWQgPSBhcmdzWzJdCisgICAgICAgIHZhbHVlID0gYXJnc1szXQorICAgICAgZWxzZQorICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLCAid3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyAoI3thcmdzLnNpemV9IGZvciAzKSIKKyAgICAgIGVuZAorCisgICAgICB3cml0ZV9maWVsZF9iZWdpbihmaWVsZF9pbmZvWzpuYW1lXSwgZmllbGRfaW5mb1s6dHlwZV0sIGZpZCkKKyAgICAgIHdyaXRlX3R5cGUoZmllbGRfaW5mbywgdmFsdWUpCiAgICAgICB3cml0ZV9maWVsZF9lbmQKICAgICBlbmQKIAotICAgIGRlZiB3cml0ZV90eXBlKHR5cGUsIHZhbHVlKQotICAgICAgY2FzZSB0eXBlCisgICAgIyBXcml0ZXMgYSBmaWVsZCB2YWx1ZSBiYXNlZCBvbiB0aGUgZmllbGQgaW5mb3JtYXRpb24uCisgICAgIworICAgICMgZmllbGRfaW5mbyAtIEEgSGFzaCBjb250YWluaW5nIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBmaWVsZDoKKyAgICAjICAgICAgICAgICAgICA6dHlwZSAgIC0gVGhlIFRocmlmdDo6VHlwZXMgY29uc3RhbnQgdGhhdCBkZXRlcm1pbmVzIGhvdyB0aGUgdmFsdWUgaXMgd3JpdHRlbi4KKyAgICAjICAgICAgICAgICAgICA6YmluYXJ5IC0gQSBCb29sZWFuIGZsYWcgdGhhdCBpbmRpY2F0ZXMgaWYgVGhyaWZ0OjpUeXBlczo6U1RSSU5HIGlzIGEgYmluYXJ5IHN0cmluZyAoc3RyaW5nIHdpdGhvdXQgZW5jb2RpbmcpLgorICAgICMgdmFsdWUgICAgICAtIFRoZSBmaWVsZCdzIHZhbHVlIHRvIHdyaXRlOyBvYmplY3QgdHlwZSB2YXJpZXMgYmFzZWQgb24gZmllbGRfaW5mb1s6dHlwZV0uCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nLgorICAgIGRlZiB3cml0ZV90eXBlKGZpZWxkX2luZm8sIHZhbHVlKQorICAgICAgIyBpZiBmaWVsZF9pbmZvIGlzIGEgRml4bnVtLCBhc3N1bWUgaXQgaXMgYSBUaHJpZnQ6OlR5cGVzIGNvbnN0YW50CisgICAgICAjIGNvbnZlcnQgaXQgaW50byBhIGZpZWxkX2luZm8gSGFzaCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyAgICAgIGlmIGZpZWxkX2luZm8uaXNfYT8gRml4bnVtCisgICAgICAgIGZpZWxkX2luZm8gPSB7OnR5cGUgPT4gZmllbGRfaW5mb30KKyAgICAgIGVuZAorCisgICAgICBjYXNlIGZpZWxkX2luZm9bOnR5cGVdCiAgICAgICB3aGVuIFR5cGVzOjpCT09MCiAgICAgICAgIHdyaXRlX2Jvb2wodmFsdWUpCiAgICAgICB3aGVuIFR5cGVzOjpCWVRFCkBAIC0yMDMsNyArMjcxLDExIEBACiAgICAgICB3aGVuIFR5cGVzOjpJNjQKICAgICAgICAgd3JpdGVfaTY0KHZhbHVlKQogICAgICAgd2hlbiBUeXBlczo6U1RSSU5HCi0gICAgICAgIHdyaXRlX3N0cmluZyh2YWx1ZSkKKyAgICAgICAgaWYgZmllbGRfaW5mb1s6YmluYXJ5XQorICAgICAgICAgIHdyaXRlX2JpbmFyeSh2YWx1ZSkKKyAgICAgICAgZWxzZQorICAgICAgICAgIHdyaXRlX3N0cmluZyh2YWx1ZSkKKyAgICAgICAgZW5kCiAgICAgICB3aGVuIFR5cGVzOjpTVFJVQ1QKICAgICAgICAgdmFsdWUud3JpdGUoc2VsZikKICAgICAgIGVsc2UKQEAgLTIxMSw4ICsyODMsMjEgQEAKICAgICAgIGVuZAogICAgIGVuZAogCi0gICAgZGVmIHJlYWRfdHlwZSh0eXBlKQotICAgICAgY2FzZSB0eXBlCisgICAgIyBSZWFkcyBhIGZpZWxkIHZhbHVlIGJhc2VkIG9uIHRoZSBmaWVsZCBpbmZvcm1hdGlvbi4KKyAgICAjCisgICAgIyBmaWVsZF9pbmZvIC0gQSBIYXNoIGNvbnRhaW5pbmcgdGhlIHBlcnRpbmVudCBkYXRhIHRvIHdyaXRlOgorICAgICMgICAgICAgICAgICAgIDp0eXBlICAgLSBUaGUgVGhyaWZ0OjpUeXBlcyBjb25zdGFudCB0aGF0IGRldGVybWluZXMgaG93IHRoZSB2YWx1ZSBpcyB3cml0dGVuLgorICAgICMgICAgICAgICAgICAgIDpiaW5hcnkgLSBBIGZsYWcgdGhhdCBpbmRpY2F0ZXMgaWYgVGhyaWZ0OjpUeXBlczo6U1RSSU5HIGlzIGEgYmluYXJ5IHN0cmluZyAoc3RyaW5nIHdpdGhvdXQgZW5jb2RpbmcpLgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIHZhbHVlIHJlYWQ7IG9iamVjdCB0eXBlIHZhcmllcyBiYXNlZCBvbiBmaWVsZF9pbmZvWzp0eXBlXS4KKyAgICBkZWYgcmVhZF90eXBlKGZpZWxkX2luZm8pCisgICAgICAjIGlmIGZpZWxkX2luZm8gaXMgYSBGaXhudW0sIGFzc3VtZSBpdCBpcyBhIFRocmlmdDo6VHlwZXMgY29uc3RhbnQKKyAgICAgICMgY29udmVydCBpdCBpbnRvIGEgZmllbGRfaW5mbyBIYXNoIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICAgICAgaWYgZmllbGRfaW5mby5pc19hPyBGaXhudW0KKyAgICAgICAgZmllbGRfaW5mbyA9IHs6dHlwZSA9PiBmaWVsZF9pbmZvfQorICAgICAgZW5kCisKKyAgICAgIGNhc2UgZmllbGRfaW5mb1s6dHlwZV0KICAgICAgIHdoZW4gVHlwZXM6OkJPT0wKICAgICAgICAgcmVhZF9ib29sCiAgICAgICB3aGVuIFR5cGVzOjpCWVRFCkBAIC0yMjYsNyArMzExLDExIEBACiAgICAgICB3aGVuIFR5cGVzOjpJNjQKICAgICAgICAgcmVhZF9pNjQKICAgICAgIHdoZW4gVHlwZXM6OlNUUklORwotICAgICAgICByZWFkX3N0cmluZworICAgICAgICBpZiBmaWVsZF9pbmZvWzpiaW5hcnldCisgICAgICAgICAgcmVhZF9iaW5hcnkKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJlYWRfc3RyaW5nCisgICAgICAgIGVuZAogICAgICAgZWxzZQogICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgICBlbmQKQEAgLTI4MCwxMSArMzY5LDE5IEBACiAgICAgICAgIHJlYWRfbGlzdF9lbmQKICAgICAgIGVuZAogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiI3t0cmFucy50b19zfSIKKyAgICBlbmQKICAgZW5kCiAKICAgY2xhc3MgQmFzZVByb3RvY29sRmFjdG9yeQogICAgIGRlZiBnZXRfcHJvdG9jb2wodHJhbnMpCiAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJiYXNlIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sLnJiCmluZGV4IGY5YWRiMjAuLmQ4Mjc5ZGIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2wucmIKQEAgLTMyLDggKzMyLDcgQEAKIAogICAgICAgIyBQcmUtYWxsb2NhdGVkIHJlYWQgYnVmZmVyIGZvciBmaXhlZC1zaXplIHJlYWQgbWV0aG9kcy4gTmVlZHMgdG8gYmUgYXQgbGVhc3QgOCBieXRlcyBsb25nIGZvcgogICAgICAgIyByZWFkX2k2NCgpIGFuZCByZWFkX2RvdWJsZSgpLgotICAgICAgQHJidWYgPSAiXDAiICogOAotICAgICAgQHJidWYuZm9yY2VfZW5jb2RpbmcoIkJJTkFSWSIpIGlmIEByYnVmLnJlc3BvbmRfdG8/KDpmb3JjZV9lbmNvZGluZykKKyAgICAgIEByYnVmID0gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIoOCkKICAgICBlbmQKIAogICAgIGRlZiB3cml0ZV9tZXNzYWdlX2JlZ2luKG5hbWUsIHR5cGUsIHNlcWlkKQpAQCAtMTA4LDggKzEwNywxMyBAQAogICAgIGVuZAogCiAgICAgZGVmIHdyaXRlX3N0cmluZyhzdHIpCi0gICAgICB3cml0ZV9pMzIoc3RyLmxlbmd0aCkKLSAgICAgIHRyYW5zLndyaXRlKHN0cikKKyAgICAgIGJ1ZiA9IEJ5dGVzLmNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcihzdHIpCisgICAgICB3cml0ZV9iaW5hcnkoYnVmKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2JpbmFyeShidWYpCisgICAgICB3cml0ZV9pMzIoYnVmLmJ5dGVzaXplKQorICAgICAgdHJhbnMud3JpdGUoYnVmKQogICAgIGVuZAogCiAgICAgZGVmIHJlYWRfbWVzc2FnZV9iZWdpbgpAQCAtMjE0LDE2ICsyMTgsMjcgQEAKICAgICBlbmQKIAogICAgIGRlZiByZWFkX3N0cmluZwotICAgICAgc3ogPSByZWFkX2kzMgotICAgICAgZGF0ID0gdHJhbnMucmVhZF9hbGwoc3opCi0gICAgICBkYXQKKyAgICAgIGJ1ZmZlciA9IHJlYWRfYmluYXJ5CisgICAgICBCeXRlcy5jb252ZXJ0X3RvX3N0cmluZyhidWZmZXIpCiAgICAgZW5kCiAKKyAgICBkZWYgcmVhZF9iaW5hcnkKKyAgICAgIHNpemUgPSByZWFkX2kzMgorICAgICAgdHJhbnMucmVhZF9hbGwoc2l6ZSkKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImJpbmFyeSgje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKICAgZW5kCiAKICAgY2xhc3MgQmluYXJ5UHJvdG9jb2xGYWN0b3J5IDwgQmFzZVByb3RvY29sRmFjdG9yeQogICAgIGRlZiBnZXRfcHJvdG9jb2wodHJhbnMpCiAgICAgICByZXR1cm4gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC5uZXcodHJhbnMpCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJiaW5hcnkiCisgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQucmIKaW5kZXggNzBlYTY1Mi4uMDliMDI2NCAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5yYgpAQCAtMzUsNSArMzUsMTMgQEAKICAgICAgICAgQmluYXJ5UHJvdG9jb2wubmV3KHRyYW5zKQogICAgICAgZW5kCiAgICAgZW5kCisKKyAgICBkZWYgdG9fcworICAgICAgaWYgKGRlZmluZWQ/IEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpCisgICAgICAgICJiaW5hcnktYWNjZWwiCisgICAgICBlbHNlCisgICAgICAgICJiaW5hcnkiCisgICAgICBlbmQKKyAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2NvbXBhY3RfcHJvdG9jb2wucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9jb21wYWN0X3Byb3RvY29sLnJiCmluZGV4IGVkZTgyZjIuLjFmOWJkMzAgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2NvbXBhY3RfcHJvdG9jb2wucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvY29tcGFjdF9wcm90b2NvbC5yYgpAQCAtMjQsNiArMjQsNyBAQAogICAgIFZFUlNJT04gPSAxCiAgICAgVkVSU0lPTl9NQVNLID0gMHgxZgogICAgIFRZUEVfTUFTSyA9IDB4RTAKKyAgICBUWVBFX0JJVFMgPSAweDA3CiAgICAgVFlQRV9TSElGVF9BTU9VTlQgPSA1CiAKICAgICBUU1RPUCA9IFsiIiwgVHlwZXM6OlNUT1AsIDBdCkBAIC0xMDAsOCArMTAxLDcgQEAKICAgICAgIEBib29sZWFuX3ZhbHVlID0gbmlsCiAKICAgICAgICMgUHJlLWFsbG9jYXRlZCByZWFkIGJ1ZmZlciBmb3IgcmVhZF9kb3VibGUoKS4KLSAgICAgIEByYnVmID0gIlwwIiAqIDgKLSAgICAgIEByYnVmLmZvcmNlX2VuY29kaW5nKCJCSU5BUlkiKSBpZiBAcmJ1Zi5yZXNwb25kX3RvPyg6Zm9yY2VfZW5jb2RpbmcpCisgICAgICBAcmJ1ZiA9IEJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyKDgpCiAgICAgZW5kCiAKICAgICBkZWYgd3JpdGVfbWVzc2FnZV9iZWdpbihuYW1lLCB0eXBlLCBzZXFpZCkKQEAgLTIxMSw4ICsyMTEsMTMgQEAKICAgICBlbmQKIAogICAgIGRlZiB3cml0ZV9zdHJpbmcoc3RyKQotICAgICAgd3JpdGVfdmFyaW50MzIoc3RyLmxlbmd0aCkKLSAgICAgIEB0cmFucy53cml0ZShzdHIpCisgICAgICBidWYgPSBCeXRlcy5jb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIoc3RyKQorICAgICAgd3JpdGVfYmluYXJ5KGJ1ZikKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9iaW5hcnkoYnVmKQorICAgICAgd3JpdGVfdmFyaW50MzIoYnVmLmJ5dGVzaXplKQorICAgICAgQHRyYW5zLndyaXRlKGJ1ZikKICAgICBlbmQKIAogICAgIGRlZiByZWFkX21lc3NhZ2VfYmVnaW4KQEAgLTIyNyw3ICsyMzIsNyBAQAogICAgICAgICByYWlzZSBQcm90b2NvbEV4Y2VwdGlvbi5uZXcoIkV4cGVjdGVkIHZlcnNpb24gI3tWRVJTSU9OfSBidXQgZ290ICN7dmVyc2lvbn0iKTsKICAgICAgIGVuZAogICAgICAgCi0gICAgICB0eXBlID0gKHZlcnNpb25fYW5kX3R5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgMHgwMworICAgICAgdHlwZSA9ICh2ZXJzaW9uX2FuZF90eXBlID4+IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfQklUUwogICAgICAgc2VxaWQgPSByZWFkX3ZhcmludDMyKCkKICAgICAgIG1lc3NhZ2VOYW1lID0gcmVhZF9zdHJpbmcoKQogICAgICAgW21lc3NhZ2VOYW1lLCB0eXBlLCBzZXFpZF0KQEAgLTMzMiwxMSArMzM3LDE5IEBACiAgICAgZW5kCiAKICAgICBkZWYgcmVhZF9zdHJpbmcKKyAgICAgIGJ1ZmZlciA9IHJlYWRfYmluYXJ5CisgICAgICBCeXRlcy5jb252ZXJ0X3RvX3N0cmluZyhidWZmZXIpCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9iaW5hcnkKICAgICAgIHNpemUgPSByZWFkX3ZhcmludDMyKCkKICAgICAgIHRyYW5zLnJlYWRfYWxsKHNpemUpCiAgICAgZW5kCiAgICAgCi0gICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJjb21wYWN0KCN7c3VwZXIudG9fc30pIgorICAgIGVuZAorCiAgICAgcHJpdmF0ZQogICAgIAogICAgICMgCkBAIC00MjIsNSArNDM1LDkgQEAKICAgICBkZWYgZ2V0X3Byb3RvY29sKHRyYW5zKQogICAgICAgQ29tcGFjdFByb3RvY29sLm5ldyh0cmFucykKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImNvbXBhY3QiCisgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9qc29uX3Byb3RvY29sLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvanNvbl9wcm90b2NvbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWU3NGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvanNvbl9wcm90b2NvbC5yYgpAQCAtMCwwICsxLDc4NiBAQAorIyBlbmNvZGluZzogVVRGLTgKKyMgCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMgCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIAorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIyAKKworcmVxdWlyZSAnYmFzZTY0JworCittb2R1bGUgVGhyaWZ0CisgIGNsYXNzIExvb2thaGVhZFJlYWRlcgorICAgIGRlZiBpbml0aWFsaXplKHRyYW5zKQorICAgICAgQHRyYW5zID0gdHJhbnMKKyAgICAgIEBoYXNEYXRhID0gZmFsc2UKKyAgICAgIEBkYXRhID0gbmlsCisgICAgZW5kCisKKyAgICBkZWYgcmVhZAorICAgICAgaWYgQGhhc0RhdGEKKyAgICAgICAgQGhhc0RhdGEgPSBmYWxzZQorICAgICAgZWxzZQorICAgICAgICBAZGF0YSA9IEB0cmFucy5yZWFkKDEpCisgICAgICBlbmQKKworICAgICAgcmV0dXJuIEBkYXRhCisgICAgZW5kCisKKyAgICBkZWYgcGVlaworICAgICAgaWYgIUBoYXNEYXRhCisgICAgICAgIEBkYXRhID0gQHRyYW5zLnJlYWQoMSkKKyAgICAgIGVuZAorICAgICAgQGhhc0RhdGEgPSB0cnVlCisgICAgICByZXR1cm4gQGRhdGEKKyAgICBlbmQKKyAgZW5kCisKKyAgIworICAjIENsYXNzIHRvIHNlcnZlIGFzIGJhc2UgSlNPTiBjb250ZXh0IGFuZCBhcyBiYXNlIGNsYXNzIGZvciBvdGhlciBjb250ZXh0CisgICMgaW1wbGVtZW50YXRpb25zCisgICMKKyAgY2xhc3MgSlNPTkNvbnRleHQKKyAgICBAQGtKU09ORWxlbVNlcGFyYXRvciA9ICcsJworICAgICMKKyAgICAjIFdyaXRlIGNvbnRleHQgZGF0YSB0byB0aGUgdHJhbnMuIERlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4KKyAgICAjCisgICAgZGVmIHdyaXRlKHRyYW5zKQorICAgIGVuZAorCisgICAgIworICAgICMgUmVhZCBjb250ZXh0IGRhdGEgZnJvbSB0aGUgdHJhbnMuIERlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4KKyAgICAjCisgICAgZGVmIHJlYWQocmVhZGVyKQorICAgIGVuZAorCisgICAgIworICAgICMgUmV0dXJuIHRydWUgaWYgbnVtYmVycyBuZWVkIHRvIGJlIGVzY2FwZWQgYXMgc3RyaW5ncyBpbiB0aGlzIGNvbnRleHQuCisgICAgIyBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJldHVybiBmYWxzZS4KKyAgICAjCisgICAgZGVmIGVzY2FwZU51bQorICAgICAgcmV0dXJuIGZhbHNlCisgICAgZW5kCisgIGVuZAorCisgICMgQ29udGV4dCBjbGFzcyBmb3Igb2JqZWN0IG1lbWJlciBrZXktdmFsdWUgcGFpcnMKKyAgY2xhc3MgSlNPTlBhaXJDb250ZXh0IDwgSlNPTkNvbnRleHQKKyAgICBAQGtKU09OUGFpclNlcGFyYXRvciA9ICc6JworCisgICAgZGVmIGluaXRpYWxpemUKKyAgICAgIEBmaXJzdCA9IHRydWUKKyAgICAgIEBjb2xvbiA9IHRydWUKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZSh0cmFucykKKyAgICAgIGlmIChAZmlyc3QpCisgICAgICAgIEBmaXJzdCA9IGZhbHNlCisgICAgICAgIEBjb2xvbiA9IHRydWUKKyAgICAgIGVsc2UKKyAgICAgICAgdHJhbnMud3JpdGUoQGNvbG9uID8gQEBrSlNPTlBhaXJTZXBhcmF0b3IgOiBAQGtKU09ORWxlbVNlcGFyYXRvcikKKyAgICAgICAgQGNvbG9uID0gIUBjb2xvbgorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVhZChyZWFkZXIpCisgICAgICBpZiAoQGZpcnN0KQorICAgICAgICBAZmlyc3QgPSBmYWxzZQorICAgICAgICBAY29sb24gPSB0cnVlCisgICAgICBlbHNlCisgICAgICAgIGNoID0gKEBjb2xvbiA/IEBAa0pTT05QYWlyU2VwYXJhdG9yIDogQEBrSlNPTkVsZW1TZXBhcmF0b3IpCisgICAgICAgIEBjb2xvbiA9ICFAY29sb24KKyAgICAgICAgSnNvblByb3RvY29sOjpyZWFkX3N5bnRheF9jaGFyKHJlYWRlciwgY2gpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgTnVtYmVycyBtdXN0IGJlIHR1cm5lZCBpbnRvIHN0cmluZ3MgaWYgdGhleSBhcmUgdGhlIGtleSBwYXJ0IG9mIGEgcGFpcgorICAgIGRlZiBlc2NhcGVOdW0KKyAgICAgIHJldHVybiBAY29sb24KKyAgICBlbmQKKyAgZW5kCisKKyAgIyBDb250ZXh0IGNsYXNzIGZvciBsaXN0cworICBjbGFzcyBKU09OTGlzdENvbnRleHQgPCBKU09OQ29udGV4dAorCisgICAgZGVmIGluaXRpYWxpemUKKyAgICAgIEBmaXJzdCA9IHRydWUKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZSh0cmFucykKKyAgICAgIGlmIChAZmlyc3QpCisgICAgICAgIEBmaXJzdCA9IGZhbHNlCisgICAgICBlbHNlCisgICAgICAgIHRyYW5zLndyaXRlKEBAa0pTT05FbGVtU2VwYXJhdG9yKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVhZChyZWFkZXIpCisgICAgICBpZiAoQGZpcnN0KQorICAgICAgICBAZmlyc3QgPSBmYWxzZQorICAgICAgZWxzZQorICAgICAgICBKc29uUHJvdG9jb2w6OnJlYWRfc3ludGF4X2NoYXIocmVhZGVyLCBAQGtKU09ORWxlbVNlcGFyYXRvcikKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKworICBjbGFzcyBKc29uUHJvdG9jb2wgPCBCYXNlUHJvdG9jb2wKKworICAgIEBAa0pTT05PYmplY3RTdGFydCA9ICd7JworICAgIEBAa0pTT05PYmplY3RFbmQgPSAnfScKKyAgICBAQGtKU09OQXJyYXlTdGFydCA9ICdbJworICAgIEBAa0pTT05BcnJheUVuZCA9ICddJworICAgIEBAa0pTT05OZXdsaW5lID0gJ1xuJworICAgIEBAa0pTT05CYWNrc2xhc2ggPSAnXFwnCisgICAgQEBrSlNPTlN0cmluZ0RlbGltaXRlciA9ICciJworCisgICAgQEBrVGhyaWZ0VmVyc2lvbjEgPSAxCisKKyAgICBAQGtUaHJpZnROYW4gPSAiTmFOIgorICAgIEBAa1RocmlmdEluZmluaXR5ID0gIkluZmluaXR5IgorICAgIEBAa1RocmlmdE5lZ2F0aXZlSW5maW5pdHkgPSAiLUluZmluaXR5IgorCisgICAgZGVmIGluaXRpYWxpemUodHJhbnMpCisgICAgICBzdXBlcih0cmFucykKKyAgICAgIEBjb250ZXh0ID0gSlNPTkNvbnRleHQubmV3CisgICAgICBAY29udGV4dHMgPSBBcnJheS5uZXcKKyAgICAgIEByZWFkZXIgPSBMb29rYWhlYWRSZWFkZXIubmV3KHRyYW5zKQorICAgIGVuZAorCisgICAgZGVmIGdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoaWQpCisgICAgICBjYXNlIGlkCisgICAgICB3aGVuIFR5cGVzOjpCT09MCisgICAgICAgICJ0ZiIKKyAgICAgIHdoZW4gVHlwZXM6OkJZVEUKKyAgICAgICAgImk4IgorICAgICAgd2hlbiBUeXBlczo6STE2CisgICAgICAgICJpMTYiCisgICAgICB3aGVuIFR5cGVzOjpJMzIKKyAgICAgICAgImkzMiIKKyAgICAgIHdoZW4gVHlwZXM6Okk2NAorICAgICAgICAiaTY0IgorICAgICAgd2hlbiBUeXBlczo6RE9VQkxFCisgICAgICAgICJkYmwiCisgICAgICB3aGVuIFR5cGVzOjpTVFJJTkcKKyAgICAgICAgInN0ciIKKyAgICAgIHdoZW4gVHlwZXM6OlNUUlVDVAorICAgICAgICAicmVjIgorICAgICAgd2hlbiBUeXBlczo6TUFQCisgICAgICAgICJtYXAiCisgICAgICB3aGVuIFR5cGVzOjpTRVQKKyAgICAgICAgInNldCIKKyAgICAgIHdoZW4gVHlwZXM6OkxJU1QKKyAgICAgICAgImxzdCIKKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZShuYW1lKQorICAgICAgaWYgKG5hbWUgPT0gInRmIikKKyAgICAgICAgcmVzdWx0ID0gVHlwZXM6OkJPT0wKKyAgICAgIGVsc2lmIChuYW1lID09ICJpOCIpCisgICAgICAgIHJlc3VsdCA9IFR5cGVzOjpCWVRFCisgICAgICBlbHNpZiAobmFtZSA9PSAiaTE2IikKKyAgICAgICAgcmVzdWx0ID0gVHlwZXM6OkkxNgorICAgICAgZWxzaWYgKG5hbWUgPT0gImkzMiIpCisgICAgICAgIHJlc3VsdCA9IFR5cGVzOjpJMzIKKyAgICAgIGVsc2lmIChuYW1lID09ICJpNjQiKQorICAgICAgICByZXN1bHQgPSBUeXBlczo6STY0CisgICAgICBlbHNpZiAobmFtZSA9PSAiZGJsIikKKyAgICAgICAgcmVzdWx0ID0gVHlwZXM6OkRPVUJMRQorICAgICAgZWxzaWYgKG5hbWUgPT0gInN0ciIpCisgICAgICAgIHJlc3VsdCA9IFR5cGVzOjpTVFJJTkcKKyAgICAgIGVsc2lmIChuYW1lID09ICJyZWMiKQorICAgICAgICByZXN1bHQgPSBUeXBlczo6U1RSVUNUCisgICAgICBlbHNpZiAobmFtZSA9PSAibWFwIikKKyAgICAgICAgcmVzdWx0ID0gVHlwZXM6Ok1BUAorICAgICAgZWxzaWYgKG5hbWUgPT0gInNldCIpCisgICAgICAgIHJlc3VsdCA9IFR5cGVzOjpTRVQKKyAgICAgIGVsc2lmIChuYW1lID09ICJsc3QiKQorICAgICAgICByZXN1bHQgPSBUeXBlczo6TElTVAorICAgICAgZWxzZQorICAgICAgICByZXN1bHQgPSBUeXBlczo6U1RPUAorICAgICAgZW5kCisgICAgICBpZiAocmVzdWx0ID09IFR5cGVzOjpTVE9QKQorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisgICAgICBlbmQKKyAgICAgIHJldHVybiByZXN1bHQKKyAgICBlbmQKKworICAgICMgU3RhdGljIGhlbHBlciBmdW5jdGlvbnMKKworICAgICMgUmVhZCAxIGNoYXJhY3RlciBmcm9tIHRoZSB0cmFucyBhbmQgdmVyaWZ5IHRoYXQgaXQgaXMgdGhlIGV4cGVjdGVkIGNoYXJhY3RlciBjaC4KKyAgICAjIFRocm93IGEgcHJvdG9jb2wgZXhjZXB0aW9uIGlmIGl0IGlzIG5vdC4KKyAgICBkZWYgc2VsZi5yZWFkX3N5bnRheF9jaGFyKHJlYWRlciwgY2gpCisgICAgICBjaDIgPSByZWFkZXIucmVhZAorICAgICAgaWYgKGNoMiAhPSBjaCkKKyAgICAgICAgcmFpc2UgUHJvdG9jb2xFeGNlcHRpb24ubmV3KFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsICJFeHBlY3RlZCBcJyN7Y2h9XCcgZ290IFwnI3tjaDJ9XCcuIikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAjIFJldHVybiB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgY2ggaXMgaW4gWy0rMC05LkVlXTsgZmFsc2Ugb3RoZXJ3aXNlCisgICAgZGVmIGlzX2pzb25fbnVtZXJpYyhjaCkKKyAgICAgIGNhc2UgY2gKKyAgICAgIHdoZW4gJysnLCAnLScsICcuJywgJzAnIC4uICc5JywgJ0UnLCAiZSIKKyAgICAgICAgcmV0dXJuIHRydWUKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBwdXNoX2NvbnRleHQoY29udGV4dCkKKyAgICAgIEBjb250ZXh0cy5wdXNoKEBjb250ZXh0KQorICAgICAgQGNvbnRleHQgPSBjb250ZXh0CisgICAgZW5kCisKKyAgICBkZWYgcG9wX2NvbnRleHQKKyAgICAgIEBjb250ZXh0ID0gQGNvbnRleHRzLnBvcAorICAgIGVuZAorCisgICAgIyBXcml0ZSB0aGUgY2hhcmFjdGVyIGNoIGFzIGEgSlNPTiBlc2NhcGUgc2VxdWVuY2UgKCJcdTAweHgiKQorICAgIGRlZiB3cml0ZV9qc29uX2VzY2FwZV9jaGFyKGNoKQorICAgICAgdHJhbnMud3JpdGUoJ1xcdScpCisgICAgICBjaF92YWx1ZSA9IGNoWzBdCisgICAgICBpZiAoY2hfdmFsdWUua2luZF9vZj8gU3RyaW5nKQorICAgICAgICBjaF92YWx1ZSA9IGNoLmJ5dGVzLmZpcnN0CisgICAgICBlbmQKKyAgICAgIHRyYW5zLndyaXRlKGNoX3ZhbHVlLnRvX3MoMTYpLnJqdXN0KDQsJzAnKSkKKyAgICBlbmQKKworICAgICMgV3JpdGUgdGhlIGNoYXJhY3RlciBjaCBhcyBwYXJ0IG9mIGEgSlNPTiBzdHJpbmcsIGVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlLgorICAgIGRlZiB3cml0ZV9qc29uX2NoYXIoY2gpCisgICAgICAjIFRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBoYW5kbGluZyBmb3IgdGhlIGZpcnN0IDB4MzAgY2hhcmFjdGVycworICAgICAgIyAwIDogZXNjYXBlIHVzaW5nICJcdTAweHgiIG5vdGF0aW9uCisgICAgICAjIDEgOiBqdXN0IG91dHB1dCBpbmRleAorICAgICAgIyA8b3RoZXI+IDogZXNjYXBlIHVzaW5nICJcPG90aGVyPiIgbm90YXRpb24KKyAgICAgIGtKU09OQ2hhclRhYmxlID0gWworICAgICAgICAgICMgMCAxIDIgMyA0IDUgNiA3IDggOSBBIEIgQyBEIEUgRgorICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsJ2InLCd0JywnbicsIDAsJ2YnLCdyJywgMCwgMCwgIyAwCisgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIyAxCisgICAgICAgICAgMSwgMSwnIicsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICMgMgorICAgICAgXQorCisgICAgICBjaF92YWx1ZSA9IGNoWzBdCisgICAgICBpZiAoY2hfdmFsdWUua2luZF9vZj8gU3RyaW5nKQorICAgICAgICBjaF92YWx1ZSA9IGNoLmJ5dGVzLmZpcnN0CisgICAgICBlbmQKKyAgICAgIGlmIChjaF92YWx1ZSA+PSAweDMwKQorICAgICAgICBpZiAoY2ggPT0gQEBrSlNPTkJhY2tzbGFzaCkgIyBPbmx5IHNwZWNpYWwgY2hhcmFjdGVyID49IDB4MzAgaXMgJ1wnCisgICAgICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTkJhY2tzbGFzaCkKKyAgICAgICAgICB0cmFucy53cml0ZShAQGtKU09OQmFja3NsYXNoKQorICAgICAgICBlbHNlCisgICAgICAgICAgdHJhbnMud3JpdGUoY2gpCisgICAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICBvdXRDaCA9IGtKU09OQ2hhclRhYmxlW2NoX3ZhbHVlXTsKKyAgICAgICAgIyBDaGVjayBpZiByZWd1bGFyIGNoYXJhY3RlciwgYmFja3NsYXNoIGVzY2FwZWQsIG9yIEpTT04gZXNjYXBlZAorICAgICAgICBpZiBvdXRDaC5raW5kX29mPyBTdHJpbmcKKyAgICAgICAgICB0cmFucy53cml0ZShAQGtKU09OQmFja3NsYXNoKQorICAgICAgICAgIHRyYW5zLndyaXRlKG91dENoKQorICAgICAgICBlbHNpZiBvdXRDaCA9PSAxCisgICAgICAgICAgdHJhbnMud3JpdGUoY2gpCisgICAgICAgIGVsc2UKKyAgICAgICAgICB3cml0ZV9qc29uX2VzY2FwZV9jaGFyKGNoKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBXcml0ZSBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcgc3RyIGFzIGEgSlNPTiBzdHJpbmcsIGVzY2FwaW5nIGNoYXJhY3RlcnMgYXMgYXBwcm9wcmlhdGUuCisgICAgZGVmIHdyaXRlX2pzb25fc3RyaW5nKHN0cikKKyAgICAgIEBjb250ZXh0LndyaXRlKHRyYW5zKQorICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICAgIHN0ci5zcGxpdCgnJykuZWFjaCBkbyB8Y2h8CisgICAgICAgIHdyaXRlX2pzb25fY2hhcihjaCkKKyAgICAgIGVuZAorICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICBlbmQKKworICAgICMgV3JpdGUgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5nIGFzIEpTT04gc3RyaW5nLCBiYXNlNjQtZW5jb2RpbmcKKyAgICAjIHRoZSBzdHJpbmcncyBjb250ZW50cywgYW5kIGVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlCisgICAgZGVmIHdyaXRlX2pzb25fYmFzZTY0KHN0cikKKyAgICAgIEBjb250ZXh0LndyaXRlKHRyYW5zKQorICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICAgIHRyYW5zLndyaXRlKEJhc2U2NC5zdHJpY3RfZW5jb2RlNjQoc3RyKSkKKyAgICAgIHRyYW5zLndyaXRlKEBAa0pTT05TdHJpbmdEZWxpbWl0ZXIpCisgICAgZW5kCisKKyAgICAjIENvbnZlcnQgdGhlIGdpdmVuIGludGVnZXIgdHlwZSB0byBhIEpTT04gbnVtYmVyLCBvciBhIHN0cmluZworICAgICMgaWYgdGhlIGNvbnRleHQgcmVxdWlyZXMgaXQgKGVnOiBrZXkgaW4gYSBtYXAgcGFpcikuCisgICAgZGVmIHdyaXRlX2pzb25faW50ZWdlcihudW0pCisgICAgICBAY29udGV4dC53cml0ZSh0cmFucykKKyAgICAgIGVzY2FwZU51bSA9IEBjb250ZXh0LmVzY2FwZU51bQorICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICAgIGVuZAorICAgICAgdHJhbnMud3JpdGUobnVtLnRvX3MpOworICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBDb252ZXJ0IHRoZSBnaXZlbiBkb3VibGUgdG8gYSBKU09OIHN0cmluZywgd2hpY2ggaXMgZWl0aGVyIHRoZSBudW1iZXIsCisgICAgIyAiTmFOIiBvciAiSW5maW5pdHkiIG9yICItSW5maW5pdHkiLgorICAgIGRlZiB3cml0ZV9qc29uX2RvdWJsZShudW0pCisgICAgICBAY29udGV4dC53cml0ZSh0cmFucykKKyAgICAgICMgTm9ybWFsaXplIG91dHB1dCBvZiB0aHJpZnQ6OnRvX3N0cmluZyBmb3IgTmFOcyBhbmQgSW5maW5pdGllcworICAgICAgc3BlY2lhbCA9IGZhbHNlOworICAgICAgaWYgKG51bS5uYW4/KQorICAgICAgICBzcGVjaWFsID0gdHJ1ZTsKKyAgICAgICAgdmFsID0gQEBrVGhyaWZ0TmFuOworICAgICAgZWxzaWYgKG51bS5pbmZpbml0ZT8pCisgICAgICAgIHNwZWNpYWwgPSB0cnVlOworICAgICAgICB2YWwgPSBAQGtUaHJpZnRJbmZpbml0eTsKKyAgICAgICAgaWYgKG51bSA8IDAuMCkKKyAgICAgICAgICB2YWwgPSBAQGtUaHJpZnROZWdhdGl2ZUluZmluaXR5OworICAgICAgICBlbmQKKyAgICAgIGVsc2UKKyAgICAgICAgdmFsID0gbnVtLnRvX3MKKyAgICAgIGVuZAorCisgICAgICBlc2NhcGVOdW0gPSBzcGVjaWFsIHx8IEBjb250ZXh0LmVzY2FwZU51bQorICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICAgIGVuZAorICAgICAgdHJhbnMud3JpdGUodmFsKQorICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2pzb25fb2JqZWN0X3N0YXJ0CisgICAgICBAY29udGV4dC53cml0ZSh0cmFucykKKyAgICAgIHRyYW5zLndyaXRlKEBAa0pTT05PYmplY3RTdGFydCkKKyAgICAgIHB1c2hfY29udGV4dChKU09OUGFpckNvbnRleHQubmV3KTsKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9qc29uX29iamVjdF9lbmQKKyAgICAgIHBvcF9jb250ZXh0CisgICAgICB0cmFucy53cml0ZShAQGtKU09OT2JqZWN0RW5kKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2pzb25fYXJyYXlfc3RhcnQKKyAgICAgIEBjb250ZXh0LndyaXRlKHRyYW5zKQorICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTkFycmF5U3RhcnQpCisgICAgICBwdXNoX2NvbnRleHQoSlNPTkxpc3RDb250ZXh0Lm5ldyk7CisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfanNvbl9hcnJheV9lbmQKKyAgICAgIHBvcF9jb250ZXh0CisgICAgICB0cmFucy53cml0ZShAQGtKU09OQXJyYXlFbmQpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfbWVzc2FnZV9iZWdpbihuYW1lLCB0eXBlLCBzZXFpZCkKKyAgICAgIHdyaXRlX2pzb25fYXJyYXlfc3RhcnQKKyAgICAgIHdyaXRlX2pzb25faW50ZWdlcihAQGtUaHJpZnRWZXJzaW9uMSkKKyAgICAgIHdyaXRlX2pzb25fc3RyaW5nKG5hbWUpCisgICAgICB3cml0ZV9qc29uX2ludGVnZXIodHlwZSkKKyAgICAgIHdyaXRlX2pzb25faW50ZWdlcihzZXFpZCkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9tZXNzYWdlX2VuZAorICAgICAgd3JpdGVfanNvbl9hcnJheV9lbmQKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9zdHJ1Y3RfYmVnaW4obmFtZSkKKyAgICAgIHdyaXRlX2pzb25fb2JqZWN0X3N0YXJ0CisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfc3RydWN0X2VuZAorICAgICAgd3JpdGVfanNvbl9vYmplY3RfZW5kCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfZmllbGRfYmVnaW4obmFtZSwgdHlwZSwgaWQpCisgICAgICB3cml0ZV9qc29uX2ludGVnZXIoaWQpCisgICAgICB3cml0ZV9qc29uX29iamVjdF9zdGFydAorICAgICAgd3JpdGVfanNvbl9zdHJpbmcoZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZCh0eXBlKSkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9maWVsZF9lbmQKKyAgICAgIHdyaXRlX2pzb25fb2JqZWN0X2VuZAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2ZpZWxkX3N0b3A7IG5pbDsgZW5kCisKKyAgICBkZWYgd3JpdGVfbWFwX2JlZ2luKGt0eXBlLCB2dHlwZSwgc2l6ZSkKKyAgICAgIHdyaXRlX2pzb25fYXJyYXlfc3RhcnQKKyAgICAgIHdyaXRlX2pzb25fc3RyaW5nKGdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoa3R5cGUpKQorICAgICAgd3JpdGVfanNvbl9zdHJpbmcoZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZCh2dHlwZSkpCisgICAgICB3cml0ZV9qc29uX2ludGVnZXIoc2l6ZSkKKyAgICAgIHdyaXRlX2pzb25fb2JqZWN0X3N0YXJ0CisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfbWFwX2VuZAorICAgICAgd3JpdGVfanNvbl9vYmplY3RfZW5kCisgICAgICB3cml0ZV9qc29uX2FycmF5X2VuZAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2xpc3RfYmVnaW4oZXR5cGUsIHNpemUpCisgICAgICB3cml0ZV9qc29uX2FycmF5X3N0YXJ0CisgICAgICB3cml0ZV9qc29uX3N0cmluZyhnZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKGV0eXBlKSkKKyAgICAgIHdyaXRlX2pzb25faW50ZWdlcihzaXplKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2xpc3RfZW5kCisgICAgICB3cml0ZV9qc29uX2FycmF5X2VuZAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX3NldF9iZWdpbihldHlwZSwgc2l6ZSkKKyAgICAgIHdyaXRlX2pzb25fYXJyYXlfc3RhcnQKKyAgICAgIHdyaXRlX2pzb25fc3RyaW5nKGdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoZXR5cGUpKQorICAgICAgd3JpdGVfanNvbl9pbnRlZ2VyKHNpemUpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfc2V0X2VuZAorICAgICAgd3JpdGVfanNvbl9hcnJheV9lbmQKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9ib29sKGJvb2wpCisgICAgICB3cml0ZV9qc29uX2ludGVnZXIoYm9vbCA/IDEgOiAwKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2J5dGUoYnl0ZSkKKyAgICAgIHdyaXRlX2pzb25faW50ZWdlcihieXRlKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2kxNihpMTYpCisgICAgICB3cml0ZV9qc29uX2ludGVnZXIoaTE2KQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2kzMihpMzIpCisgICAgICB3cml0ZV9qc29uX2ludGVnZXIoaTMyKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2k2NChpNjQpCisgICAgICB3cml0ZV9qc29uX2ludGVnZXIoaTY0KQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2RvdWJsZShkdWIpCisgICAgICB3cml0ZV9qc29uX2RvdWJsZShkdWIpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfc3RyaW5nKHN0cikKKyAgICAgIHdyaXRlX2pzb25fc3RyaW5nKHN0cikKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9iaW5hcnkoc3RyKQorICAgICAgd3JpdGVfanNvbl9iYXNlNjQoc3RyKQorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFJlYWRpbmcgZnVuY3Rpb25zCisgICAgIyMKKworICAgICMgUmVhZHMgMSBieXRlIGFuZCB2ZXJpZmllcyB0aGF0IGl0IG1hdGNoZXMgY2guCisgICAgZGVmIHJlYWRfanNvbl9zeW50YXhfY2hhcihjaCkKKyAgICAgIEpzb25Qcm90b2NvbDo6cmVhZF9zeW50YXhfY2hhcihAcmVhZGVyLCBjaCkKKyAgICBlbmQKKworICAgICMgRGVjb2RlcyB0aGUgZm91ciBoZXggcGFydHMgb2YgYSBKU09OIGVzY2FwZWQgc3RyaW5nIGNoYXJhY3RlciBhbmQgcmV0dXJucworICAgICMgdGhlIGNoYXJhY3RlciB2aWEgb3V0LgorICAgICMKKyAgICAjIE5vdGUgLSB0aGlzIG9ubHkgc3VwcG9ydHMgVW5pY29kZSBjaGFyYWN0ZXJzIGluIHRoZSBCTVAgKFUrMDAwMCB0byBVK0ZGRkYpOworICAgICMgY2hhcmFjdGVycyBhYm92ZSB0aGUgQk1QIGFyZSBlbmNvZGVkIGFzIHR3byBlc2NhcGUgc2VxdWVuY2VzIChzdXJyb2dhdGUgcGFpcnMpLAorICAgICMgd2hpY2ggaXMgbm90IHlldCBpbXBsZW1lbnRlZAorICAgIGRlZiByZWFkX2pzb25fZXNjYXBlX2NoYXIKKyAgICAgIHN0ciA9IEByZWFkZXIucmVhZAorICAgICAgc3RyICs9IEByZWFkZXIucmVhZAorICAgICAgc3RyICs9IEByZWFkZXIucmVhZAorICAgICAgc3RyICs9IEByZWFkZXIucmVhZAorICAgICAgaWYgUlVCWV9WRVJTSU9OID49ICcxLjknCisgICAgICAgIHN0ci5oZXguY2hyKEVuY29kaW5nOjpVVEZfOCkKKyAgICAgIGVsc2UKKyAgICAgICAgc3RyLmhleC5jaHIKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBEZWNvZGVzIGEgSlNPTiBzdHJpbmcsIGluY2x1ZGluZyB1bmVzY2FwaW5nLCBhbmQgcmV0dXJucyB0aGUgc3RyaW5nIHZpYSBzdHIKKyAgICBkZWYgcmVhZF9qc29uX3N0cmluZyhza2lwQ29udGV4dCA9IGZhbHNlKQorICAgICAgIyBUaGlzIHN0cmluZydzIGNoYXJhY3RlcnMgbXVzdCBtYXRjaCB1cCB3aXRoIHRoZSBlbGVtZW50cyBpbiBlc2NhcGVfY2hhcl92YWxzLgorICAgICAgIyBJIGRvbid0IGhhdmUgJy8nIG9uIHRoaXMgbGlzdCBldmVuIHRob3VnaCBpdCBhcHBlYXJzIG9uIHd3dy5qc29uLm9yZyAtLQorICAgICAgIyBpdCBpcyBub3QgaW4gdGhlIFJGQyAtPiBpdCBpcy4gU2VlIFJGQyA0NjI3CisgICAgICBlc2NhcGVfY2hhcnMgPSAiXCJcXC9iZm5ydCIKKworICAgICAgIyBUaGUgZWxlbWVudHMgb2YgdGhpcyBhcnJheSBtdXN0IG1hdGNoIHVwIHdpdGggdGhlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgaW4KKyAgICAgICMgZXNjYXBlX2NoYXJzCisgICAgICBlc2NhcGVfY2hhcl92YWxzID0gWworICAgICAgICAiXCIiLCAiXFwiLCAiXC8iLCAiXGIiLCAiXGYiLCAiXG4iLCAiXHIiLCAiXHQiLAorICAgICAgXQorCisgICAgICBpZiAhc2tpcENvbnRleHQKKyAgICAgICAgQGNvbnRleHQucmVhZChAcmVhZGVyKQorICAgICAgZW5kCisgICAgICByZWFkX2pzb25fc3ludGF4X2NoYXIoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICAgIGNoID0gIiIKKyAgICAgIHN0ciA9ICIiCisgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgY2ggPSBAcmVhZGVyLnJlYWQKKyAgICAgICAgaWYgKGNoID09IEBAa0pTT05TdHJpbmdEZWxpbWl0ZXIpCisgICAgICAgICAgYnJlYWsKKyAgICAgICAgZW5kCisgICAgICAgIGlmIChjaCA9PSBAQGtKU09OQmFja3NsYXNoKQorICAgICAgICAgIGNoID0gQHJlYWRlci5yZWFkCisgICAgICAgICAgaWYgKGNoID09ICd1JykKKyAgICAgICAgICAgIGNoID0gcmVhZF9qc29uX2VzY2FwZV9jaGFyCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcG9zID0gZXNjYXBlX2NoYXJzLmluZGV4KGNoKTsKKyAgICAgICAgICAgIGlmIChwb3MubmlsPykgIyBub3QgZm91bmQKKyAgICAgICAgICAgICAgcmFpc2UgUHJvdG9jb2xFeGNlcHRpb24ubmV3KFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsICJFeHBlY3RlZCBjb250cm9sIGNoYXIsIGdvdCBcJyN7Y2h9XCcuIikKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgY2ggPSBlc2NhcGVfY2hhcl92YWxzW3Bvc10KKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICAgIHN0ciArPSBjaAorICAgICAgZW5kCisgICAgICByZXR1cm4gc3RyCisgICAgZW5kCisKKyAgICAjIFJlYWRzIGEgYmxvY2sgb2YgYmFzZTY0IGNoYXJhY3RlcnMsIGRlY29kaW5nIGl0LCBhbmQgcmV0dXJucyB2aWEgc3RyCisgICAgZGVmIHJlYWRfanNvbl9iYXNlNjQKKyAgICAgIHN0ciA9IHJlYWRfanNvbl9zdHJpbmcKKyAgICAgIG0gPSBzdHIubGVuZ3RoICUgNAorICAgICAgaWYgbSAhPSAwCisgICAgICAgICMgQWRkIG1pc3NpbmcgcGFkZGluZworICAgICAgICAoNCAtIG0pLnRpbWVzIGRvCisgICAgICAgICAgc3RyICs9ICc9JworICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgQmFzZTY0LnN0cmljdF9kZWNvZGU2NChzdHIpCisgICAgZW5kCisKKyAgICAjIFJlYWRzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycywgc3RvcHBpbmcgYXQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzIG5vdAorICAgICMgYSB2YWxpZCBKU09OIG51bWVyaWMgY2hhcmFjdGVyLgorICAgIGRlZiByZWFkX2pzb25fbnVtZXJpY19jaGFycworICAgICAgc3RyID0gIiIKKyAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICBjaCA9IEByZWFkZXIucGVlaworICAgICAgICBpZiAoIWlzX2pzb25fbnVtZXJpYyhjaCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGVuZAorICAgICAgICBjaCA9IEByZWFkZXIucmVhZAorICAgICAgICBzdHIgKz0gY2gKKyAgICAgIGVuZAorICAgICAgcmV0dXJuIHN0cgorICAgIGVuZAorCisgICAgIyBSZWFkcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYW5kIGFzc2VtYmxlcyB0aGVtIGludG8gYSBudW1iZXIsCisgICAgIyByZXR1cm5pbmcgdGhlbSB2aWEgbnVtCisgICAgZGVmIHJlYWRfanNvbl9pbnRlZ2VyCisgICAgICBAY29udGV4dC5yZWFkKEByZWFkZXIpCisgICAgICBpZiAoQGNvbnRleHQuZXNjYXBlTnVtKQorICAgICAgICByZWFkX2pzb25fc3ludGF4X2NoYXIoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICAgIGVuZAorICAgICAgc3RyID0gcmVhZF9qc29uX251bWVyaWNfY2hhcnMKKworICAgICAgYmVnaW4KKyAgICAgICAgbnVtID0gSW50ZWdlcihzdHIpOworICAgICAgcmVzY3VlCisgICAgICAgIHJhaXNlIFByb3RvY29sRXhjZXB0aW9uLm5ldyhQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiI3tzdHJ9XCIiKQorICAgICAgZW5kCisKKyAgICAgIGlmIChAY29udGV4dC5lc2NhcGVOdW0pCisgICAgICAgIHJlYWRfanNvbl9zeW50YXhfY2hhcihAQGtKU09OU3RyaW5nRGVsaW1pdGVyKQorICAgICAgZW5kCisKKyAgICAgIHJldHVybiBudW0KKyAgICBlbmQKKworICAgICMgUmVhZHMgYSBKU09OIG51bWJlciBvciBzdHJpbmcgYW5kIGludGVycHJldHMgaXQgYXMgYSBkb3VibGUuCisgICAgZGVmIHJlYWRfanNvbl9kb3VibGUKKyAgICAgIEBjb250ZXh0LnJlYWQoQHJlYWRlcikKKyAgICAgIG51bSA9IDAKKyAgICAgIGlmIChAcmVhZGVyLnBlZWsgPT0gQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICAgICAgc3RyID0gcmVhZF9qc29uX3N0cmluZyh0cnVlKQorICAgICAgICAjIENoZWNrIGZvciBOYU4sIEluZmluaXR5IGFuZCAtSW5maW5pdHkKKyAgICAgICAgaWYgKHN0ciA9PSBAQGtUaHJpZnROYW4pCisgICAgICAgICAgbnVtID0gKCsxLjAvMC4wKS8oKzEuMC8wLjApCisgICAgICAgIGVsc2lmIChzdHIgPT0gQEBrVGhyaWZ0SW5maW5pdHkpCisgICAgICAgICAgbnVtID0gKzEuMC8wLjAKKyAgICAgICAgZWxzaWYgKHN0ciA9PSBAQGtUaHJpZnROZWdhdGl2ZUluZmluaXR5KQorICAgICAgICAgIG51bSA9IC0xLjAvMC4wCisgICAgICAgIGVsc2UKKyAgICAgICAgICBpZiAoIUBjb250ZXh0LmVzY2FwZU51bSkKKyAgICAgICAgICAgICMgUmFpc2UgZXhjZXB0aW9uIC0tIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCisgICAgICAgICAgICByYWlzZSBQcm90b2NvbEV4Y2VwdGlvbi5uZXcoUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIikKKyAgICAgICAgICBlbmQKKyAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgbnVtID0gRmxvYXQoc3RyKQorICAgICAgICAgIHJlc2N1ZQorICAgICAgICAgICAgcmFpc2UgUHJvdG9jb2xFeGNlcHRpb24ubmV3KFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsICJFeHBlY3RlZCBudW1lcmljIHZhbHVlOyBnb3QgXCIje3N0cn1cIiIpCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICBpZiAoQGNvbnRleHQuZXNjYXBlTnVtKQorICAgICAgICAgICMgVGhpcyB3aWxsIHRocm93IC0gd2Ugc2hvdWxkIGhhdmUgaGFkIGEgcXVvdGUgaWYgZXNjYXBlTnVtID09IHRydWUKKyAgICAgICAgICByZWFkX2pzb25fc3ludGF4X2NoYXIoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICAgICAgZW5kCisgICAgICAgIHN0ciA9IHJlYWRfanNvbl9udW1lcmljX2NoYXJzCisgICAgICAgIGJlZ2luCisgICAgICAgICAgbnVtID0gRmxvYXQoc3RyKQorICAgICAgICByZXNjdWUKKyAgICAgICAgICByYWlzZSBQcm90b2NvbEV4Y2VwdGlvbi5uZXcoUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwgIkV4cGVjdGVkIG51bWVyaWMgdmFsdWU7IGdvdCBcIiN7c3RyfVwiIikKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIHJldHVybiBudW0KKyAgICBlbmQKKworICAgIGRlZiByZWFkX2pzb25fb2JqZWN0X3N0YXJ0CisgICAgICBAY29udGV4dC5yZWFkKEByZWFkZXIpCisgICAgICByZWFkX2pzb25fc3ludGF4X2NoYXIoQEBrSlNPTk9iamVjdFN0YXJ0KQorICAgICAgcHVzaF9jb250ZXh0KEpTT05QYWlyQ29udGV4dC5uZXcpCisgICAgICBuaWwKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2pzb25fb2JqZWN0X2VuZAorICAgICAgcmVhZF9qc29uX3N5bnRheF9jaGFyKEBAa0pTT05PYmplY3RFbmQpCisgICAgICBwb3BfY29udGV4dAorICAgICAgbmlsCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9qc29uX2FycmF5X3N0YXJ0CisgICAgICBAY29udGV4dC5yZWFkKEByZWFkZXIpCisgICAgICByZWFkX2pzb25fc3ludGF4X2NoYXIoQEBrSlNPTkFycmF5U3RhcnQpCisgICAgICBwdXNoX2NvbnRleHQoSlNPTkxpc3RDb250ZXh0Lm5ldykKKyAgICAgIG5pbAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfanNvbl9hcnJheV9lbmQKKyAgICAgIHJlYWRfanNvbl9zeW50YXhfY2hhcihAQGtKU09OQXJyYXlFbmQpCisgICAgICBwb3BfY29udGV4dAorICAgICAgbmlsCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9tZXNzYWdlX2JlZ2luCisgICAgICByZWFkX2pzb25fYXJyYXlfc3RhcnQKKyAgICAgIHZlcnNpb24gPSByZWFkX2pzb25faW50ZWdlcgorICAgICAgaWYgKHZlcnNpb24gIT0gQEBrVGhyaWZ0VmVyc2lvbjEpCisgICAgICAgIHJhaXNlIFByb3RvY29sRXhjZXB0aW9uLm5ldyhQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sICdNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4nKQorICAgICAgZW5kCisgICAgICBuYW1lID0gcmVhZF9qc29uX3N0cmluZworICAgICAgbWVzc2FnZV90eXBlID0gcmVhZF9qc29uX2ludGVnZXIKKyAgICAgIHNlcWlkID0gcmVhZF9qc29uX2ludGVnZXIKKyAgICAgIFtuYW1lLCBtZXNzYWdlX3R5cGUsIHNlcWlkXQorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbWVzc2FnZV9lbmQKKyAgICAgIHJlYWRfanNvbl9hcnJheV9lbmQKKyAgICAgIG5pbAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfc3RydWN0X2JlZ2luCisgICAgICByZWFkX2pzb25fb2JqZWN0X3N0YXJ0CisgICAgICBuaWwKKyAgICBlbmQKKworICAgIGRlZiByZWFkX3N0cnVjdF9lbmQKKyAgICAgIHJlYWRfanNvbl9vYmplY3RfZW5kCisgICAgICBuaWwKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2ZpZWxkX2JlZ2luCisgICAgICAjIENoZWNrIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZSBsaXN0CisgICAgICBjaCA9IEByZWFkZXIucGVlaworICAgICAgaWYgKGNoID09IEBAa0pTT05PYmplY3RFbmQpCisgICAgICAgIGZpZWxkX3R5cGUgPSBUeXBlczo6U1RPUAorICAgICAgZWxzZQorICAgICAgICBmaWVsZF9pZCA9IHJlYWRfanNvbl9pbnRlZ2VyCisgICAgICAgIHJlYWRfanNvbl9vYmplY3Rfc3RhcnQKKyAgICAgICAgZmllbGRfdHlwZSA9IGdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUocmVhZF9qc29uX3N0cmluZykKKyAgICAgIGVuZAorICAgICAgW25pbCwgZmllbGRfdHlwZSwgZmllbGRfaWRdCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9maWVsZF9lbmQKKyAgICAgIHJlYWRfanNvbl9vYmplY3RfZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9tYXBfYmVnaW4KKyAgICAgIHJlYWRfanNvbl9hcnJheV9zdGFydAorICAgICAga2V5X3R5cGUgPSBnZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKHJlYWRfanNvbl9zdHJpbmcpCisgICAgICB2YWxfdHlwZSA9IGdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUocmVhZF9qc29uX3N0cmluZykKKyAgICAgIHNpemUgPSByZWFkX2pzb25faW50ZWdlcgorICAgICAgcmVhZF9qc29uX29iamVjdF9zdGFydAorICAgICAgW2tleV90eXBlLCB2YWxfdHlwZSwgc2l6ZV0KKyAgICBlbmQKKworICAgIGRlZiByZWFkX21hcF9lbmQKKyAgICAgIHJlYWRfanNvbl9vYmplY3RfZW5kCisgICAgICByZWFkX2pzb25fYXJyYXlfZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9saXN0X2JlZ2luCisgICAgICByZWFkX2pzb25fYXJyYXlfc3RhcnQKKyAgICAgIFtnZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKHJlYWRfanNvbl9zdHJpbmcpLCByZWFkX2pzb25faW50ZWdlcl0KKyAgICBlbmQKKworICAgIGRlZiByZWFkX2xpc3RfZW5kCisgICAgICByZWFkX2pzb25fYXJyYXlfZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9zZXRfYmVnaW4KKyAgICAgIHJlYWRfanNvbl9hcnJheV9zdGFydAorICAgICAgW2dldF90eXBlX2lkX2Zvcl90eXBlX25hbWUocmVhZF9qc29uX3N0cmluZyksIHJlYWRfanNvbl9pbnRlZ2VyXQorICAgIGVuZAorCisgICAgZGVmIHJlYWRfc2V0X2VuZAorICAgICAgcmVhZF9qc29uX2FycmF5X2VuZAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfYm9vbAorICAgICAgYnl0ZSA9IHJlYWRfYnl0ZQorICAgICAgYnl0ZSAhPSAwCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9ieXRlCisgICAgICByZWFkX2pzb25faW50ZWdlcgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfaTE2CisgICAgICByZWFkX2pzb25faW50ZWdlcgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfaTMyCisgICAgICByZWFkX2pzb25faW50ZWdlcgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfaTY0CisgICAgICByZWFkX2pzb25faW50ZWdlcgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfZG91YmxlCisgICAgICByZWFkX2pzb25fZG91YmxlCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9zdHJpbmcKKyAgICAgIHJlYWRfanNvbl9zdHJpbmcKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2JpbmFyeQorICAgICAgcmVhZF9qc29uX2Jhc2U2NAorICAgIGVuZAorCisgICAgZGVmIHRvX3MKKyAgICAgICJqc29uKCN7c3VwZXIudG9fc30pIgorICAgIGVuZAorICBlbmQKKworICBjbGFzcyBKc29uUHJvdG9jb2xGYWN0b3J5IDwgQmFzZVByb3RvY29sRmFjdG9yeQorICAgIGRlZiBnZXRfcHJvdG9jb2wodHJhbnMpCisgICAgICByZXR1cm4gVGhyaWZ0OjpKc29uUHJvdG9jb2wubmV3KHRyYW5zKQorICAgIGVuZAorCisgICAgZGVmIHRvX3MKKyAgICAgICJqc29uIgorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvbXVsdGlwbGV4ZWRfcHJvdG9jb2wucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9tdWx0aXBsZXhlZF9wcm90b2NvbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDQyOGE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvbXVsdGlwbGV4ZWRfcHJvdG9jb2wucmIKQEAgLTAsMCArMSw0NCBAQAorIyAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3JlcXVpcmUgJ3RocmlmdC9wcm90b2NvbC9wcm90b2NvbF9kZWNvcmF0b3InCisKK21vZHVsZSBUaHJpZnQKKyAgY2xhc3MgTXVsdGlwbGV4ZWRQcm90b2NvbCA8IEJhc2VQcm90b2NvbAorCisgICAgaW5jbHVkZSBQcm90b2NvbERlY29yYXRvcgorCisgICAgZGVmIGluaXRpYWxpemUocHJvdG9jb2wsIHNlcnZpY2VfbmFtZSkKKyAgICAgIHN1cGVyKHByb3RvY29sKQorICAgICAgQHNlcnZpY2VfbmFtZSA9IHNlcnZpY2VfbmFtZQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX21lc3NhZ2VfYmVnaW4obmFtZSwgdHlwZSwgc2VxaWQpCisgICAgICBjYXNlIHR5cGUKKyAgICAgIHdoZW4gTWVzc2FnZVR5cGVzOjpDQUxMLCBNZXNzYWdlVHlwZXM6Ok9ORVdBWQorICAgICAgICBAcHJvdG9jb2wud3JpdGVfbWVzc2FnZV9iZWdpbigiI3tAc2VydmljZV9uYW1lfToje25hbWV9IiwgdHlwZSwgc2VxaWQpCisgICAgICBlbHNlCisgICAgICAgIEBwcm90b2NvbC53cml0ZV9tZXNzYWdlX2JlZ2luKG5hbWUsIHR5cGUsIHNlcWlkKQorICAgICAgZW5kIAorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAibXVsdGlwbGV4ZWQoI3tAc2VydmljZV9uYW1lPUBwcm90b2NvbC50b19zfSkiCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9wcm90b2NvbF9kZWNvcmF0b3IucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9wcm90b2NvbF9kZWNvcmF0b3IucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFlM2MxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL3Byb3RvY29sX2RlY29yYXRvci5yYgpAQCAtMCwwICsxLDE5NCBAQAorIyAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK21vZHVsZSBUaHJpZnQKKyAgbW9kdWxlIFByb3RvY29sRGVjb3JhdG9yCisKKyAgICBkZWYgaW5pdGlhbGl6ZShwcm90b2NvbCkKKyAgICAgIEBwcm90b2NvbCA9IHByb3RvY29sCisgICAgZW5kCisKKyAgICBkZWYgdHJhbnMKKyAgICAgIEBwcm90b2NvbC50cmFucworICAgIGVuZAorCisgICAgZGVmIHdyaXRlX21lc3NhZ2VfYmVnaW4obmFtZSwgdHlwZSwgc2VxaWQpCisgICAgICBAcHJvdG9jb2wud3JpdGVfbWVzc2FnZV9iZWdpbgorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX21lc3NhZ2VfZW5kCisgICAgICBAcHJvdG9jb2wud3JpdGVfbWVzc2FnZV9lbmQKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9zdHJ1Y3RfYmVnaW4obmFtZSkKKyAgICAgIEBwcm90b2NvbC53cml0ZV9zdHJ1Y3RfYmVnaW4obmFtZSkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9zdHJ1Y3RfZW5kCisgICAgICBAcHJvdG9jb2wud3JpdGVfc3RydWN0X2VuZAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2ZpZWxkX2JlZ2luKG5hbWUsIHR5cGUsIGlkKQorICAgICAgQHByb3RvY29sLndyaXRlX2ZpZWxkX2JlZ2luKG5hbWUsIHR5cGUsIGlkKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2ZpZWxkX2VuZAorICAgICAgQHByb3RvY29sLndyaXRlX2ZpZWxkX2VuZAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2ZpZWxkX3N0b3AKKyAgICAgIEBwcm90b2NvbC53cml0ZV9maWVsZF9zdG9wCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfbWFwX2JlZ2luKGt0eXBlLCB2dHlwZSwgc2l6ZSkKKyAgICAgIEBwcm90b2NvbC53cml0ZV9tYXBfYmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX21hcF9lbmQKKyAgICAgIEBwcm90b2NvbC53cml0ZV9tYXBfZW5kCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfbGlzdF9iZWdpbihldHlwZSwgc2l6ZSkKKyAgICAgIEBwcm90b2NvbC53cml0ZV9saXN0X2JlZ2luKGV0eXBlLCBzaXplKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2xpc3RfZW5kCisgICAgICBAcHJvdG9jb2wud3JpdGVfbGlzdF9lbmQKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9zZXRfYmVnaW4oZXR5cGUsIHNpemUpCisgICAgICBAcHJvdG9jb2wud3JpdGVfc2V0X2JlZ2luKGV0eXBlLCBzaXplKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX3NldF9lbmQKKyAgICAgIEBwcm90b2NvbC53cml0ZV9zZXRfZW5kCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfYm9vbChib29sKQorICAgICAgQHByb3RvY29sLndyaXRlX2Jvb2woYm9vbCkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9ieXRlKGJ5dGUpCisgICAgICBAcHJvdG9jb2wud3JpdGVfYnl0ZShieXRlKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2kxNihpMTYpCisgICAgICBAcHJvdG9jb2wud3JpdGVfaTE2KGkxNikKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9pMzIoaTMyKQorICAgICAgQHByb3RvY29sLndyaXRlX2kzMihpMzIpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfaTY0KGk2NCkKKyAgICAgIEBwcm90b2NvbC53cml0ZV9pNjQoaTY0KQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2RvdWJsZShkdWIpCisgICAgICBAcHJvdG9jb2wud3JpdGVfZG91YmxlKGR1YikKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9zdHJpbmcoc3RyKQorICAgICAgQHByb3RvY29sLndyaXRlX3N0cmluZyhzdHIpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfYmluYXJ5KGJ1ZikKKyAgICAgIEBwcm90b2NvbC53cml0ZV9iaW5hcnkoYnVmKQorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbWVzc2FnZV9iZWdpbgorICAgICAgQHByb3RvY29sLnJlYWRfbWVzc2FnZV9iZWdpbgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbWVzc2FnZV9lbmQKKyAgICAgIEBwcm90b2NvbC5yZWFkX21lc3NhZ2VfZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9zdHJ1Y3RfYmVnaW4KKyAgICAgIEBwcm90b2NvbC5yZWFkX3N0cnVjdF9iZWdpbgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfc3RydWN0X2VuZAorICAgICAgQHByb3RvY29sLnJlYWRfc3RydWN0X2VuZAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfZmllbGRfYmVnaW4KKyAgICAgIEBwcm90b2NvbC5yZWFkX2ZpZWxkX2JlZ2luCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9maWVsZF9lbmQKKyAgICAgIEBwcm90b2NvbC5yZWFkX2ZpZWxkX2VuZAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbWFwX2JlZ2luCisgICAgICBAcHJvdG9jb2wucmVhZF9tYXBfYmVnaW4KKyAgICBlbmQKKworICAgIGRlZiByZWFkX21hcF9lbmQKKyAgICAgIEBwcm90b2NvbC5yZWFkX21hcF9lbmQKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2xpc3RfYmVnaW4KKyAgICAgIEBwcm90b2NvbC5yZWFkX2xpc3RfYmVnaW4KKyAgICBlbmQKKworICAgIGRlZiByZWFkX2xpc3RfZW5kCisgICAgICBAcHJvdG9jb2wucmVhZF9saXN0X2VuZAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfc2V0X2JlZ2luCisgICAgICBAcHJvdG9jb2wucmVhZF9zZXRfYmVnaW4KKyAgICBlbmQKKworICAgIGRlZiByZWFkX3NldF9lbmQKKyAgICAgIEBwcm90b2NvbC5yZWFkX3NldF9lbmQKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2Jvb2wKKyAgICAgIEBwcm90b2NvbC5yZWFkX2Jvb2wKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2J5dGUKKyAgICAgIEBwcm90b2NvbC5yZWFkX2J5dGUKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2kxNgorICAgICAgQHByb3RvY29sLnJlYWRfaTE2CisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9pMzIKKyAgICAgIEBwcm90b2NvbC5yZWFkX2kzMgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfaTY0CisgICAgICBAcHJvdG9jb2wucmVhZF9pNjQKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2RvdWJsZQorICAgICAgQHByb3RvY29sLnJlYWRfZG91YmxlCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9zdHJpbmcKKyAgICAgIEBwcm90b2NvbC5yZWFkX3N0cmluZworICAgIGVuZAorCisgICAgZGVmIHJlYWRfYmluYXJ5CisgICAgICBAcHJvdG9jb2wucmVhZF9iaW5hcnkKKyAgICBlbmQKKyAgZW5kCitlbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvYmFzZV9zZXJ2ZXIucmIgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvYmFzZV9zZXJ2ZXIucmIKaW5kZXggMWVlMTIxMy4uYWE0ZDA5YyAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL2Jhc2Vfc2VydmVyLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9iYXNlX3NlcnZlci5yYgpAQCAtMjYsNiArMjYsMTIgQEAKICAgICAgIEBwcm90b2NvbF9mYWN0b3J5ID0gcHJvdG9jb2xfZmFjdG9yeSA/IHByb3RvY29sX2ZhY3RvcnkgOiBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeS5uZXcKICAgICBlbmQKIAotICAgIGRlZiBzZXJ2ZTsgbmlsOyBlbmQKKyAgICBkZWYgc2VydmUKKyAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICBlbmQKKworICAgIGRlZiB0b19zCisgICAgICAic2VydmVyKCN7QHByb3RvY29sX2ZhY3RvcnkudG9fc30oI3tAdHJhbnNwb3J0X2ZhY3RvcnkudG9fc30oI3tAc2VydmVyX3RyYW5zcG9ydC50b19zfSkpKSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9tb25ncmVsX2h0dHBfc2VydmVyLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL21vbmdyZWxfaHR0cF9zZXJ2ZXIucmIKaW5kZXggODRlYWNmMC4uZGUzNTRjOCAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL21vbmdyZWxfaHR0cF9zZXJ2ZXIucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL21vbmdyZWxfaHR0cF9zZXJ2ZXIucmIKQEAgLTIwLDYgKzIwLDcgQEAKIHJlcXVpcmUgJ21vbmdyZWwnCiAKICMjIFN0aWNrcyBhIHNlcnZpY2Ugb24gYSBVUkwsIHVzaW5nIG1vbmdyZWwgdG8gZG8gdGhlIEhUVFAgd29yaworIyA8Yj5ERVBSRUNBVEVEOjwvYj4gUGxlYXNlIHVzZSA8dHQ+VGhyaWZ0OjpUaGluSFRUUFNlcnZlcjwvdHQ+IGluc3RlYWQuCiBtb2R1bGUgVGhyaWZ0CiAgIGNsYXNzIE1vbmdyZWxIVFRQU2VydmVyIDwgQmFzZVNlcnZlcgogICAgIGNsYXNzIEhhbmRsZXIgPCBNb25ncmVsOjpIdHRwSGFuZGxlcgpAQCAtNDMsNiArNDQsNyBAQAogICAgIGVuZAogCiAgICAgZGVmIGluaXRpYWxpemUocHJvY2Vzc29yLCBvcHRzPXt9KQorICAgICAgS2VybmVsLndhcm4gIltERVBSRUNBVElPTiBXQVJOSU5HXSBgVGhyaWZ0OjpNb25ncmVsSFRUUFNlcnZlcmAgaXMgZGVwcmVjYXRlZC4gIFBsZWFzZSB1c2UgYFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXJgIGluc3RlYWQuIgogICAgICAgcG9ydCA9IG9wdHNbOnBvcnRdIHx8IDgwCiAgICAgICBpcCA9IG9wdHNbOmlwXSB8fCAiMC4wLjAuMCIKICAgICAgIHBhdGggPSBvcHRzWzpwYXRoXSB8fCAiIgpkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3NpbXBsZV9zZXJ2ZXIucmIgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvc2ltcGxlX3NlcnZlci5yYgppbmRleCAyMWU4NjU5Li45MDVmZTliIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvc2ltcGxlX3NlcnZlci5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvc2ltcGxlX3NlcnZlci5yYgpAQCAtMzksNSArMzksOSBAQAogICAgICAgICBAc2VydmVyX3RyYW5zcG9ydC5jbG9zZQogICAgICAgZW5kCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJzaW1wbGUoI3tzdXBlci50b19zfSkiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhpbl9odHRwX3NlcnZlci5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aGluX2h0dHBfc2VydmVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhODFjNmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhpbl9odHRwX3NlcnZlci5yYgpAQCAtMCwwICsxLDkxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAncmFjaycKK3JlcXVpcmUgJ3RoaW4nCisKKyMjCisjIFdyYXBzIHRoZSBUaGluIHdlYiBzZXJ2ZXIgdG8gcHJvdmlkZSBhIFRocmlmdCBzZXJ2ZXIgb3ZlciBIVFRQLgorbW9kdWxlIFRocmlmdAorICBjbGFzcyBUaGluSFRUUFNlcnZlciA8IEJhc2VTZXJ2ZXIKKworICAgICMjCisgICAgIyBBY2NlcHRzIGEgVGhyaWZ0OjpQcm9jZXNzb3IKKyAgICAjIE9wdGlvbnMgaW5jbHVkZToKKyAgICAjICogOnBvcnQKKyAgICAjICogOmlwCisgICAgIyAqIDpwYXRoCisgICAgIyAqIDpwcm90b2NvbF9mYWN0b3J5CisgICAgZGVmIGluaXRpYWxpemUocHJvY2Vzc29yLCBvcHRpb25zPXt9KQorICAgICAgcG9ydCA9IG9wdGlvbnNbOnBvcnRdIHx8IDgwCisgICAgICBpcCA9IG9wdGlvbnNbOmlwXSB8fCAiMC4wLjAuMCIKKyAgICAgIHBhdGggPSBvcHRpb25zWzpwYXRoXSB8fCAiLyIKKyAgICAgIHByb3RvY29sX2ZhY3RvcnkgPSBvcHRpb25zWzpwcm90b2NvbF9mYWN0b3J5XSB8fCBCaW5hcnlQcm90b2NvbEZhY3RvcnkubmV3CisgICAgICBhcHAgPSBSYWNrQXBwbGljYXRpb24uZm9yKHBhdGgsIHByb2Nlc3NvciwgcHJvdG9jb2xfZmFjdG9yeSkKKyAgICAgIEBzZXJ2ZXIgPSBUaGluOjpTZXJ2ZXIubmV3KGlwLCBwb3J0LCBhcHApCisgICAgZW5kCisKKyAgICAjIworICAgICMgU3RhcnRzIHRoZSBzZXJ2ZXIKKyAgICBkZWYgc2VydmUKKyAgICAgIEBzZXJ2ZXIuc3RhcnQKKyAgICBlbmQKKworICAgIGNsYXNzIFJhY2tBcHBsaWNhdGlvbgorCisgICAgICBUSFJJRlRfSEVBREVSID0gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IgorCisgICAgICBkZWYgc2VsZi5mb3IocGF0aCwgcHJvY2Vzc29yLCBwcm90b2NvbF9mYWN0b3J5KQorICAgICAgICBSYWNrOjpCdWlsZGVyLm5ldyBkbworICAgICAgICAgIHVzZSBSYWNrOjpDb21tb25Mb2dnZXIKKyAgICAgICAgICB1c2UgUmFjazo6U2hvd0V4Y2VwdGlvbnMKKyAgICAgICAgICB1c2UgUmFjazo6TGludAorICAgICAgICAgIG1hcCBwYXRoIGRvCisgICAgICAgICAgICBydW4gbGFtYmRhIHsgfGVudnwKKyAgICAgICAgICAgICAgcmVxdWVzdCA9IFJhY2s6OlJlcXVlc3QubmV3KGVudikKKyAgICAgICAgICAgICAgaWYgUmFja0FwcGxpY2F0aW9uLnZhbGlkX3RocmlmdF9yZXF1ZXN0PyhyZXF1ZXN0KQorICAgICAgICAgICAgICAgIFJhY2tBcHBsaWNhdGlvbi5zdWNjZXNzZnVsX3JlcXVlc3QocmVxdWVzdCwgcHJvY2Vzc29yLCBwcm90b2NvbF9mYWN0b3J5KQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUmFja0FwcGxpY2F0aW9uLmZhaWxlZF9yZXF1ZXN0CisgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgfQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5zdWNjZXNzZnVsX3JlcXVlc3QocmFja19yZXF1ZXN0LCBwcm9jZXNzb3IsIHByb3RvY29sX2ZhY3RvcnkpCisgICAgICAgIHJlc3BvbnNlID0gUmFjazo6UmVzcG9uc2UubmV3KFtdLCAyMDAsIHsnQ29udGVudC1UeXBlJyA9PiBUSFJJRlRfSEVBREVSfSkKKyAgICAgICAgdHJhbnNwb3J0ID0gSU9TdHJlYW1UcmFuc3BvcnQubmV3IHJhY2tfcmVxdWVzdC5ib2R5LCByZXNwb25zZQorICAgICAgICBwcm90b2NvbCA9IHByb3RvY29sX2ZhY3RvcnkuZ2V0X3Byb3RvY29sIHRyYW5zcG9ydAorICAgICAgICBwcm9jZXNzb3IucHJvY2VzcyBwcm90b2NvbCwgcHJvdG9jb2wKKyAgICAgICAgcmVzcG9uc2UKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5mYWlsZWRfcmVxdWVzdAorICAgICAgICBSYWNrOjpSZXNwb25zZS5uZXcoWydOb3QgRm91bmQnXSwgNDA0LCB7J0NvbnRlbnQtVHlwZScgPT4gVEhSSUZUX0hFQURFUn0pCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYudmFsaWRfdGhyaWZ0X3JlcXVlc3Q/KHJhY2tfcmVxdWVzdCkKKyAgICAgICAgcmFja19yZXF1ZXN0LnBvc3Q/ICYmIHJhY2tfcmVxdWVzdC5lbnZbIkNPTlRFTlRfVFlQRSJdID09IFRIUklGVF9IRUFERVIKKyAgICAgIGVuZAorCisgICAgZW5kCisKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRfcG9vbF9zZXJ2ZXIucmIgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkX3Bvb2xfc2VydmVyLnJiCmluZGV4IDhjZWM4MDUuLmJiNzU0YWQgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRfcG9vbF9zZXJ2ZXIucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZF9wb29sX3NlcnZlci5yYgpAQCAtNzEsNSArNzEsOSBAQAogICAgICAgICBAc2VydmVyX3RyYW5zcG9ydC5jbG9zZQogICAgICAgZW5kCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJ0aHJlYWRwb29sKCN7c3VwZXIudG9fc30pIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZGVkX3NlcnZlci5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRlZF9zZXJ2ZXIucmIKaW5kZXggYTJjOTE3Yy4uODhlZTE4MyAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZGVkX3NlcnZlci5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkZWRfc2VydmVyLnJiCkBAIC00Myw1ICs0Myw5IEBACiAgICAgICAgIEBzZXJ2ZXJfdHJhbnNwb3J0LmNsb3NlCiAgICAgICBlbmQKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgInRocmVhZGVkKCN7c3VwZXIudG9fc30pIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvc3RydWN0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvc3RydWN0LnJiCmluZGV4IDM1MTI0NjMuLmRmOWQ2NTYgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3N0cnVjdC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9zdHJ1Y3QucmIKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgICAgICAgICAgd3JpdGVfY29udGFpbmVyKG9wcm90LCB2YWx1ZSwgZmllbGRfaW5mbykKICAgICAgICAgICAgIG9wcm90LndyaXRlX2ZpZWxkX2VuZAogICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIG9wcm90LndyaXRlX2ZpZWxkKG5hbWUsIHR5cGUsIGZpZCwgdmFsdWUpCisgICAgICAgICAgICBvcHJvdC53cml0ZV9maWVsZChmaWVsZF9pbmZvLCBmaWQsIHZhbHVlKQogICAgICAgICAgIGVuZAogICAgICAgICBlbmQKICAgICAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvc3RydWN0X3VuaW9uLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvc3RydWN0X3VuaW9uLnJiCmluZGV4IDBmZjE3NWYuLmUyMWIzOWUgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3N0cnVjdF91bmlvbi5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9zdHJ1Y3RfdW5pb24ucmIKQEAgLTU2LDcgKzU2LDcgQEAKICAgICAgIHdoZW4gVHlwZXM6Ok1BUAogICAgICAgICBrZXlfdHlwZSwgdmFsX3R5cGUsIHNpemUgPSBpcHJvdC5yZWFkX21hcF9iZWdpbgogICAgICAgICAjIFNraXAgdGhlIG1hcCBjb250ZW50cyBpZiB0aGUgZGVjbGFyZWQga2V5IG9yIHZhbHVlIHR5cGVzIGRvbid0IG1hdGNoIHRoZSBleHBlY3RlZCBvbmVzLgotICAgICAgICBpZiAoa2V5X3R5cGUgIT0gZmllbGRbOmtleV1bOnR5cGVdIHx8IHZhbF90eXBlICE9IGZpZWxkWzp2YWx1ZV1bOnR5cGVdKQorICAgICAgICBpZiAoc2l6ZSAhPSAwICYmIChrZXlfdHlwZSAhPSBmaWVsZFs6a2V5XVs6dHlwZV0gfHwgdmFsX3R5cGUgIT0gZmllbGRbOnZhbHVlXVs6dHlwZV0pKQogICAgICAgICAgIHNpemUudGltZXMgZG8KICAgICAgICAgICAgIGlwcm90LnNraXAoa2V5X3R5cGUpCiAgICAgICAgICAgICBpcHJvdC5za2lwKHZhbF90eXBlKQpAQCAtMTAxLDcgKzEwMSw3IEBACiAgICAgICAgIGVuZAogICAgICAgICBpcHJvdC5yZWFkX3NldF9lbmQKICAgICAgIGVsc2UKLSAgICAgICAgdmFsdWUgPSBpcHJvdC5yZWFkX3R5cGUoZmllbGRbOnR5cGVdKQorICAgICAgICB2YWx1ZSA9IGlwcm90LnJlYWRfdHlwZShmaWVsZCkKICAgICAgIGVuZAogICAgICAgdmFsdWUKICAgICBlbmQKQEAgLTExMCw3ICsxMTAsNyBAQAogICAgICAgaWYgaXNfY29udGFpbmVyPyBmaWVsZFs6dHlwZV0KICAgICAgICAgd3JpdGVfY29udGFpbmVyKG9wcm90LCB2YWx1ZSwgZmllbGQpCiAgICAgICBlbHNlCi0gICAgICAgIG9wcm90LndyaXRlX3R5cGUoZmllbGRbOnR5cGVdLCB2YWx1ZSkKKyAgICAgICAgb3Byb3Qud3JpdGVfdHlwZShmaWVsZCwgdmFsdWUpCiAgICAgICBlbmQKICAgICBlbmQKIApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2Vfc2VydmVyX3RyYW5zcG9ydC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3NlcnZlcl90cmFuc3BvcnQucmIKaW5kZXggNjhjNWFmMC4uMDEwNTQ2MyAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2Vfc2VydmVyX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV9zZXJ2ZXJfdHJhbnNwb3J0LnJiCkBAIC0zNCw0ICszNCw0IEBACiAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV90cmFuc3BvcnQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV90cmFuc3BvcnQucmIKaW5kZXggMGExMmNlYS4uOTdlNTkzNSAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2VfdHJhbnNwb3J0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3RyYW5zcG9ydC5yYgpAQCAtMzUsMjIgKzM1LDE0IEBACiAgIGVuZAogCiAgIG1vZHVsZSBUcmFuc3BvcnRVdGlscwotICAgIGlmIFJVQllfVkVSU0lPTiA+PSAnMS45JwotICAgICAgZGVmIHNlbGYuZ2V0X3N0cmluZ19ieXRlKHN0cmluZywgaW5kZXgpCi0gICAgICAgIHN0cmluZy5nZXRieXRlKGluZGV4KQotICAgICAgZW5kCisgICAgIyBEZXByZWNhdGVkOiBVc2UgVGhyaWZ0OjpCeXRlcyBpbnN0ZWFkCisgICAgZGVmIHNlbGYuZ2V0X3N0cmluZ19ieXRlKHN0cmluZywgaW5kZXgpCisgICAgICBCeXRlcy5nZXRfc3RyaW5nX2J5dGUoc3RyaW5nLCBpbmRleCkKKyAgICBlbmQKIAotICAgICAgZGVmIHNlbGYuc2V0X3N0cmluZ19ieXRlKHN0cmluZywgaW5kZXgsIGJ5dGUpCi0gICAgICAgIHN0cmluZy5zZXRieXRlKGluZGV4LCBieXRlKQotICAgICAgZW5kCi0gICAgZWxzZQotICAgICAgZGVmIHNlbGYuZ2V0X3N0cmluZ19ieXRlKHN0cmluZywgaW5kZXgpCi0gICAgICAgIHN0cmluZ1tpbmRleF0KLSAgICAgIGVuZAotCi0gICAgICBkZWYgc2VsZi5zZXRfc3RyaW5nX2J5dGUoc3RyaW5nLCBpbmRleCwgYnl0ZSkKLSAgICAgICAgc3RyaW5nW2luZGV4XSA9IGJ5dGUKLSAgICAgIGVuZAorICAgICMgRGVwcmVjYXRlZDogVXNlIFRocmlmdDo6Qnl0ZXMgaW5zdGVhZAorICAgIGRlZiBzZWxmLnNldF9zdHJpbmdfYnl0ZShzdHJpbmcsIGluZGV4LCBieXRlKQorICAgICAgQnl0ZXMuc2V0X3N0cmluZ19ieXRlKHN0cmluZywgaW5kZXgsIGJ5dGUpCiAgICAgZW5kCiAgIGVuZAogCkBAIC02MSw2ICs1MywxMSBAQAogCiAgICAgZGVmIGNsb3NlOyBlbmQKIAorICAgICMgUmVhZHMgYSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgdHJhbnNwb3J0cy4gSW4gUnVieSAxLjkrLCB0aGUgU3RyaW5nIHJldHVybmVkIHdpbGwgaGF2ZSBhIEJJTkFSWSAoYWthIEFTQ0lJOEJJVCkgZW5jb2RpbmcuCisgICAgIworICAgICMgc3ogLSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgdHJhbnNwb3J0LgorICAgICMKKyAgICAjIFJldHVybnMgYSBTdHJpbmcgYWN0aW5nIGFzIGEgYnl0ZSBidWZmZXIuCiAgICAgZGVmIHJlYWQoc3opCiAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgZW5kCkBAIC02OCw3ICs2NSw3IEBACiAgICAgIyBSZXR1cm5zIGFuIHVuc2lnbmVkIGJ5dGUgYXMgYSBGaXhudW0gaW4gdGhlIHJhbmdlICgwLi4yNTUpLgogICAgIGRlZiByZWFkX2J5dGUKICAgICAgIGJ1ZiA9IHJlYWRfYWxsKDEpCi0gICAgICByZXR1cm4gOjpUaHJpZnQ6OlRyYW5zcG9ydFV0aWxzLmdldF9zdHJpbmdfYnl0ZShidWYsIDApCisgICAgICByZXR1cm4gQnl0ZXMuZ2V0X3N0cmluZ19ieXRlKGJ1ZiwgMCkKICAgICBlbmQKIAogICAgICMgUmVhZHMgc2l6ZSBieXRlcyBhbmQgY29waWVzIHRoZW0gaW50byBidWZmZXJbMC4uc2l6ZV0uCkBAIC03NiwxNCArNzMsMTQgQEAKICAgICAgIHRtcCA9IHJlYWRfYWxsKHNpemUpCiAgICAgICBpID0gMAogICAgICAgdG1wLmVhY2hfYnl0ZSBkbyB8Ynl0ZXwKLSAgICAgICAgOjpUaHJpZnQ6OlRyYW5zcG9ydFV0aWxzLnNldF9zdHJpbmdfYnl0ZShidWZmZXIsIGksIGJ5dGUpCisgICAgICAgIEJ5dGVzLnNldF9zdHJpbmdfYnl0ZShidWZmZXIsIGksIGJ5dGUpCiAgICAgICAgIGkgKz0gMQogICAgICAgZW5kCiAgICAgICBpCiAgICAgZW5kCiAKICAgICBkZWYgcmVhZF9hbGwoc2l6ZSkKLSAgICAgIHJldHVybiAnJyBpZiBzaXplIDw9IDAKKyAgICAgIHJldHVybiBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlciBpZiBzaXplIDw9IDAKICAgICAgIGJ1ZiA9IHJlYWQoc2l6ZSkKICAgICAgIHdoaWxlIChidWYubGVuZ3RoIDwgc2l6ZSkKICAgICAgICAgY2h1bmsgPSByZWFkKHNpemUgLSBidWYubGVuZ3RoKQpAQCAtOTIsMTYgKzg5LDI5IEBACiAgICAgCiAgICAgICBidWYKICAgICBlbmQKLSAgCisKKyAgICAjIFdyaXRlcyB0aGUgYnl0ZSBidWZmZXIgdG8gdGhlIHRyYW5zcG9ydC4gSW4gUnVieSAxLjkrLCB0aGUgYnVmZmVyIHdpbGwgYmUgZm9yY2VkIGludG8gQklOQVJZIGVuY29kaW5nLgorICAgICMKKyAgICAjIGJ1ZiAtIEEgU3RyaW5nIGFjdGluZyBhcyBhIGJ5dGUgYnVmZmVyLgorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZy4KICAgICBkZWYgd3JpdGUoYnVmKTsgZW5kCiAgICAgYWxpYXNfbWV0aG9kIDo8PCwgOndyaXRlCiAKICAgICBkZWYgZmx1c2g7IGVuZAorCisgICAgZGVmIHRvX3MKKyAgICAgICJiYXNlIgorICAgIGVuZAogICBlbmQKICAgCiAgIGNsYXNzIEJhc2VUcmFuc3BvcnRGYWN0b3J5CiAgICAgZGVmIGdldF90cmFuc3BvcnQodHJhbnMpCiAgICAgICByZXR1cm4gdHJhbnMKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImJhc2UiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYnVmZmVyZWRfdHJhbnNwb3J0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2J1ZmZlcmVkX3RyYW5zcG9ydC5yYgppbmRleCA2NzZhNGQzLi40ZmU5YzQxIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYnVmZmVyZWRfdHJhbnNwb3J0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9idWZmZXJlZF90cmFuc3BvcnQucmIKQEAgLTI0LDggKzI0LDggQEAKICAgICAKICAgICBkZWYgaW5pdGlhbGl6ZSh0cmFuc3BvcnQpCiAgICAgICBAdHJhbnNwb3J0ID0gdHJhbnNwb3J0Ci0gICAgICBAd2J1ZiA9ICcnCi0gICAgICBAcmJ1ZiA9ICcnCisgICAgICBAd2J1ZiA9IEJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCisgICAgICBAcmJ1ZiA9IEJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCiAgICAgICBAaW5kZXggPSAwCiAgICAgZW5kCiAKQEAgLTQ0LDEyICs0NCwxMiBAQAogCiAgICAgZGVmIHJlYWQoc3opCiAgICAgICBAaW5kZXggKz0gc3oKLSAgICAgIHJldCA9IEByYnVmLnNsaWNlKEBpbmRleCAtIHN6LCBzeikgfHwgJycKKyAgICAgIHJldCA9IEByYnVmLnNsaWNlKEBpbmRleCAtIHN6LCBzeikgfHwgQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKIAogICAgICAgaWYgcmV0Lmxlbmd0aCA9PSAwCiAgICAgICAgIEByYnVmID0gQHRyYW5zcG9ydC5yZWFkKFtzeiwgREVGQVVMVF9CVUZGRVJdLm1heCkKICAgICAgICAgQGluZGV4ID0gc3oKLSAgICAgICAgcmV0ID0gQHJidWYuc2xpY2UoMCwgc3opIHx8ICcnCisgICAgICAgIHJldCA9IEByYnVmLnNsaWNlKDAsIHN6KSB8fCBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcgogICAgICAgZW5kCiAKICAgICAgIHJldApAQCAtNjUsOSArNjUsMTUgQEAKICAgICAgICMgVGhlIHJlYWQgYnVmZmVyIGhhcyBzb21lIGRhdGEgbm93LCByZWFkIGEgc2luZ2xlIGJ5dGUuIFVzaW5nIGdldF9zdHJpbmdfYnl0ZSgpIGF2b2lkcwogICAgICAgIyBhbGxvY2F0aW5nIGEgdGVtcCBzdHJpbmcgb2Ygc2l6ZSAxIHVubmVjZXNzYXJpbHkuCiAgICAgICBAaW5kZXggKz0gMQotICAgICAgcmV0dXJuIDo6VGhyaWZ0OjpUcmFuc3BvcnRVdGlscy5nZXRfc3RyaW5nX2J5dGUoQHJidWYsIEBpbmRleCAtIDEpCisgICAgICByZXR1cm4gQnl0ZXMuZ2V0X3N0cmluZ19ieXRlKEByYnVmLCBAaW5kZXggLSAxKQogICAgIGVuZAogCisgICAgIyBSZWFkcyBhIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSB0cmFuc3BvcnQgaW50byB0aGUgYnVmZmVyIHBhc3NlZC4KKyAgICAjCisgICAgIyBidWZmZXIgLSBUaGUgU3RyaW5nIChieXRlIGJ1ZmZlcikgdG8gd3JpdGUgZGF0YSB0bzsgdGhpcyBpcyBhc3N1bWVkIHRvIGhhdmUgYSBCSU5BUlkgZW5jb2RpbmcuCisgICAgIyBzaXplICAgLSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgdHJhbnNwb3J0IGFuZCB3cml0ZSB0byB0aGUgYnVmZmVyLgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLgogICAgIGRlZiByZWFkX2ludG9fYnVmZmVyKGJ1ZmZlciwgc2l6ZSkKICAgICAgIGkgPSAwCiAgICAgICB3aGlsZSBpIDwgc2l6ZQpAQCAtNzgsOCArODQsOCBAQAogICAgICAgICBlbmQKIAogICAgICAgICAjIFRoZSByZWFkIGJ1ZmZlciBoYXMgc29tZSBkYXRhIG5vdywgc28gY29weSBieXRlcyBvdmVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyLgotICAgICAgICBieXRlID0gOjpUaHJpZnQ6OlRyYW5zcG9ydFV0aWxzLmdldF9zdHJpbmdfYnl0ZShAcmJ1ZiwgQGluZGV4KQotICAgICAgICA6OlRocmlmdDo6VHJhbnNwb3J0VXRpbHMuc2V0X3N0cmluZ19ieXRlKGJ1ZmZlciwgaSwgYnl0ZSkKKyAgICAgICAgYnl0ZSA9IEJ5dGVzLmdldF9zdHJpbmdfYnl0ZShAcmJ1ZiwgQGluZGV4KQorICAgICAgICBCeXRlcy5zZXRfc3RyaW5nX2J5dGUoYnVmZmVyLCBpLCBieXRlKQogICAgICAgICBAaW5kZXggKz0gMQogICAgICAgICBpICs9IDEKICAgICAgIGVuZApAQCAtODcsMjIgKzkzLDMwIEBACiAgICAgZW5kCiAKICAgICBkZWYgd3JpdGUoYnVmKQotICAgICAgQHdidWYgPDwgYnVmCisgICAgICBAd2J1ZiA8PCBCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcoYnVmKQogICAgIGVuZAogCiAgICAgZGVmIGZsdXNoCi0gICAgICBpZiBAd2J1ZiAhPSAnJworICAgICAgdW5sZXNzIEB3YnVmLmVtcHR5PwogICAgICAgICBAdHJhbnNwb3J0LndyaXRlKEB3YnVmKQotICAgICAgICBAd2J1ZiA9ICcnCisgICAgICAgIEB3YnVmID0gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKICAgICAgIGVuZAogICAgICAgCiAgICAgICBAdHJhbnNwb3J0LmZsdXNoCiAgICAgZW5kCisKKyAgICBkZWYgdG9fcworICAgICAgImJ1ZmZlcmVkKCN7QHRyYW5zcG9ydC50b19zfSkiCisgICAgZW5kCiAgIGVuZAogCiAgIGNsYXNzIEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSA8IEJhc2VUcmFuc3BvcnRGYWN0b3J5CiAgICAgZGVmIGdldF90cmFuc3BvcnQodHJhbnNwb3J0KQogICAgICAgcmV0dXJuIEJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFuc3BvcnQpCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJidWZmZXJlZCIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9mcmFtZWRfdHJhbnNwb3J0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2ZyYW1lZF90cmFuc3BvcnQucmIKaW5kZXggZTc2MzBkMC4uOTUzMTc3OCAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2ZyYW1lZF90cmFuc3BvcnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2ZyYW1lZF90cmFuc3BvcnQucmIKQEAgLTIyLDggKzIyLDggQEAKICAgY2xhc3MgRnJhbWVkVHJhbnNwb3J0IDwgQmFzZVRyYW5zcG9ydAogICAgIGRlZiBpbml0aWFsaXplKHRyYW5zcG9ydCwgcmVhZD10cnVlLCB3cml0ZT10cnVlKQogICAgICAgQHRyYW5zcG9ydCA9IHRyYW5zcG9ydAotICAgICAgQHJidWYgICAgICA9ICcnCi0gICAgICBAd2J1ZiAgICAgID0gJycKKyAgICAgIEByYnVmICAgICAgPSBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcgorICAgICAgQHdidWYgICAgICA9IEJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCiAgICAgICBAcmVhZCAgICAgID0gcmVhZAogICAgICAgQHdyaXRlICAgICA9IHdyaXRlCiAgICAgICBAaW5kZXggICAgICA9IDAKQEAgLTQ0LDEyICs0NCwxMiBAQAogICAgIGRlZiByZWFkKHN6KQogICAgICAgcmV0dXJuIEB0cmFuc3BvcnQucmVhZChzeikgdW5sZXNzIEByZWFkCiAKLSAgICAgIHJldHVybiAnJyBpZiBzeiA8PSAwCisgICAgICByZXR1cm4gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIgaWYgc3ogPD0gMAogCiAgICAgICByZWFkX2ZyYW1lIGlmIEBpbmRleCA+PSBAcmJ1Zi5sZW5ndGgKIAogICAgICAgQGluZGV4ICs9IHN6Ci0gICAgICBAcmJ1Zi5zbGljZShAaW5kZXggLSBzeiwgc3opIHx8ICcnCisgICAgICBAcmJ1Zi5zbGljZShAaW5kZXggLSBzeiwgc3opIHx8IEJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCiAgICAgZW5kCiAKICAgICBkZWYgcmVhZF9ieXRlCkBAIC02MCw3ICs2MCw3IEBACiAgICAgICAjIFRoZSByZWFkIGJ1ZmZlciBoYXMgc29tZSBkYXRhIG5vdywgcmVhZCBhIHNpbmdsZSBieXRlLiBVc2luZyBnZXRfc3RyaW5nX2J5dGUoKSBhdm9pZHMKICAgICAgICMgYWxsb2NhdGluZyBhIHRlbXAgc3RyaW5nIG9mIHNpemUgMSB1bm5lY2Vzc2FyaWx5LgogICAgICAgQGluZGV4ICs9IDEKLSAgICAgIHJldHVybiA6OlRocmlmdDo6VHJhbnNwb3J0VXRpbHMuZ2V0X3N0cmluZ19ieXRlKEByYnVmLCBAaW5kZXggLSAxKQorICAgICAgcmV0dXJuIEJ5dGVzLmdldF9zdHJpbmdfYnl0ZShAcmJ1ZiwgQGluZGV4IC0gMSkKICAgICBlbmQKIAogICAgIGRlZiByZWFkX2ludG9fYnVmZmVyKGJ1ZmZlciwgc2l6ZSkKQEAgLTY5LDE4ICs2OSwxOCBAQAogICAgICAgICByZWFkX2ZyYW1lIGlmIEBpbmRleCA+PSBAcmJ1Zi5sZW5ndGgKIAogICAgICAgICAjIFRoZSByZWFkIGJ1ZmZlciBoYXMgc29tZSBkYXRhIG5vdywgc28gY29weSBieXRlcyBvdmVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyLgotICAgICAgICBieXRlID0gOjpUaHJpZnQ6OlRyYW5zcG9ydFV0aWxzLmdldF9zdHJpbmdfYnl0ZShAcmJ1ZiwgQGluZGV4KQotICAgICAgICA6OlRocmlmdDo6VHJhbnNwb3J0VXRpbHMuc2V0X3N0cmluZ19ieXRlKGJ1ZmZlciwgaSwgYnl0ZSkKKyAgICAgICAgYnl0ZSA9IEJ5dGVzLmdldF9zdHJpbmdfYnl0ZShAcmJ1ZiwgQGluZGV4KQorICAgICAgICBCeXRlcy5zZXRfc3RyaW5nX2J5dGUoYnVmZmVyLCBpLCBieXRlKQogICAgICAgICBAaW5kZXggKz0gMQogICAgICAgICBpICs9IDEKICAgICAgIGVuZAogICAgICAgaQogICAgIGVuZAogCi0KLSAgICBkZWYgd3JpdGUoYnVmLHN6PW5pbCkKKyAgICBkZWYgd3JpdGUoYnVmLCBzej1uaWwpCiAgICAgICByZXR1cm4gQHRyYW5zcG9ydC53cml0ZShidWYpIHVubGVzcyBAd3JpdGUKIAorICAgICAgYnVmID0gQnl0ZXMuZm9yY2VfYmluYXJ5X2VuY29kaW5nKGJ1ZikKICAgICAgIEB3YnVmIDw8IChzeiA/IGJ1ZlswLi4uc3pdIDogYnVmKQogICAgIGVuZAogCkBAIC05MiwxMCArOTIsMTUgQEAKICAgICAgIHJldHVybiBAdHJhbnNwb3J0LmZsdXNoIHVubGVzcyBAd3JpdGUKIAogICAgICAgb3V0ID0gW0B3YnVmLmxlbmd0aF0ucGFjaygnTicpCisgICAgICAjIEFycmF5I3BhY2sgc2hvdWxkIHJldHVybiBhIEJJTkFSWSBlbmNvZGVkIFN0cmluZywgc28gaXQgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSB0byBmb3JjZSBlbmNvZGluZwogICAgICAgb3V0IDw8IEB3YnVmCiAgICAgICBAdHJhbnNwb3J0LndyaXRlKG91dCkKICAgICAgIEB0cmFuc3BvcnQuZmx1c2gKLSAgICAgIEB3YnVmID0gJycKKyAgICAgIEB3YnVmID0gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKKyAgICBlbmQKKworICAgIGRlZiB0b19zCisgICAgICAiZnJhbWVkKCN7QHRyYW5zcG9ydC50b19zfSkiCiAgICAgZW5kCiAKICAgICBwcml2YXRlCkBAIC0xMTIsNSArMTE3LDkgQEAKICAgICBkZWYgZ2V0X3RyYW5zcG9ydCh0cmFuc3BvcnQpCiAgICAgICByZXR1cm4gRnJhbWVkVHJhbnNwb3J0Lm5ldyh0cmFuc3BvcnQpCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJmcmFtZWQiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaHR0cF9jbGllbnRfdHJhbnNwb3J0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2h0dHBfY2xpZW50X3RyYW5zcG9ydC5yYgppbmRleCAyMmNhZjAyLi41YzFkZDVjIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaHR0cF9jbGllbnRfdHJhbnNwb3J0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9odHRwX2NsaWVudF90cmFuc3BvcnQucmIKQEAgLTIwLDIxICsyMCwyMyBAQAogCiByZXF1aXJlICduZXQvaHR0cCcKIHJlcXVpcmUgJ25ldC9odHRwcycKK3JlcXVpcmUgJ29wZW5zc2wnCiByZXF1aXJlICd1cmknCiByZXF1aXJlICdzdHJpbmdpbycKIAogbW9kdWxlIFRocmlmdAogICBjbGFzcyBIVFRQQ2xpZW50VHJhbnNwb3J0IDwgQmFzZVRyYW5zcG9ydAogCi0gICAgZGVmIGluaXRpYWxpemUodXJsKQorICAgIGRlZiBpbml0aWFsaXplKHVybCwgb3B0cyA9IHt9KQogICAgICAgQHVybCA9IFVSSSB1cmwKICAgICAgIEBoZWFkZXJzID0geydDb250ZW50LVR5cGUnID0+ICdhcHBsaWNhdGlvbi94LXRocmlmdCd9Ci0gICAgICBAb3V0YnVmID0gIiIKKyAgICAgIEBvdXRidWYgPSBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcgorICAgICAgQHNzbF92ZXJpZnlfbW9kZSA9IG9wdHMuZmV0Y2goOnNzbF92ZXJpZnlfbW9kZSwgT3BlblNTTDo6U1NMOjpWRVJJRllfUEVFUikKICAgICBlbmQKIAogICAgIGRlZiBvcGVuPzsgdHJ1ZSBlbmQKICAgICBkZWYgcmVhZChzeik7IEBpbmJ1Zi5yZWFkIHN6IGVuZAotICAgIGRlZiB3cml0ZShidWYpOyBAb3V0YnVmIDw8IGJ1ZiBlbmQKKyAgICBkZWYgd3JpdGUoYnVmKTsgQG91dGJ1ZiA8PCBCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcoYnVmKSBlbmQKIAogICAgIGRlZiBhZGRfaGVhZGVycyhoZWFkZXJzKQogICAgICAgQGhlYWRlcnMgPSBAaGVhZGVycy5tZXJnZShoZWFkZXJzKQpAQCAtNDIsMTAgKzQ0LDE4IEBACiAKICAgICBkZWYgZmx1c2gKICAgICAgIGh0dHAgPSBOZXQ6OkhUVFAubmV3IEB1cmwuaG9zdCwgQHVybC5wb3J0Ci0gICAgICBodHRwLnVzZV9zc2wgPSBAdXJsLnNjaGVtZSA9PSAiaHR0cHMiCi0gICAgICByZXNwLCBkYXRhID0gaHR0cC5wb3N0KEB1cmwucmVxdWVzdF91cmksIEBvdXRidWYsIEBoZWFkZXJzKQorICAgICAgaHR0cC51c2Vfc3NsID0gQHVybC5zY2hlbWUgPT0gJ2h0dHBzJworICAgICAgaHR0cC52ZXJpZnlfbW9kZSA9IEBzc2xfdmVyaWZ5X21vZGUgaWYgQHVybC5zY2hlbWUgPT0gJ2h0dHBzJworICAgICAgcmVzcCA9IGh0dHAucG9zdChAdXJsLnJlcXVlc3RfdXJpLCBAb3V0YnVmLCBAaGVhZGVycykKKyAgICAgIGRhdGEgPSByZXNwLmJvZHkKKyAgICAgIGRhdGEgPSBCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcoZGF0YSkKICAgICAgIEBpbmJ1ZiA9IFN0cmluZ0lPLm5ldyBkYXRhCi0gICAgICBAb3V0YnVmID0gIiIKKyAgICBlbnN1cmUKKyAgICAgIEBvdXRidWYgPSBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcgorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiQHtzZWxmLnVybH0iCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaW9fc3RyZWFtX3RyYW5zcG9ydC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9pb19zdHJlYW1fdHJhbnNwb3J0LnJiCmluZGV4IGJlMzQ4YWEuLmNjZWM2OGYgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9pb19zdHJlYW1fdHJhbnNwb3J0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9pb19zdHJlYW1fdHJhbnNwb3J0LnJiCkBAIC0zMiw4ICszMiwxMSBAQAogCiAgICAgZGVmIG9wZW4/OyBub3QgQGlucHV0LmNsb3NlZD8gb3Igbm90IEBvdXRwdXQuY2xvc2VkPyBlbmQKICAgICBkZWYgcmVhZChzeik7IEBpbnB1dC5yZWFkKHN6KSBlbmQKLSAgICBkZWYgd3JpdGUoYnVmKTsgQG91dHB1dC53cml0ZShidWYpIGVuZAorICAgIGRlZiB3cml0ZShidWYpOyBAb3V0cHV0LndyaXRlKEJ5dGVzLmZvcmNlX2JpbmFyeV9lbmNvZGluZyhidWYpKSBlbmQKICAgICBkZWYgY2xvc2U7IEBpbnB1dC5jbG9zZTsgQG91dHB1dC5jbG9zZSBlbmQKICAgICBkZWYgdG9faW87IEBpbnB1dCBlbmQgIyB3ZSdyZSBhc3N1bWluZyB0aGlzIGlzIHVzZWQgaW4gYSBJTy5zZWxlY3QgZm9yIHJlYWRpbmcKKyAgICBkZWYgdG9fcworICAgICAgImlvc3RyZWFtKGlucHV0PSN7QGlucHV0LnRvX3N9LG91dHB1dD0je0BvdXRwdXQudG9fc30pIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L21lbW9yeV9idWZmZXJfdHJhbnNwb3J0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L21lbW9yeV9idWZmZXJfdHJhbnNwb3J0LnJiCmluZGV4IDYyYzUyOTIuLjQ2OWVhNzMgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9tZW1vcnlfYnVmZmVyX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvbWVtb3J5X2J1ZmZlcl90cmFuc3BvcnQucmIKQEAgLTI4LDcgKzI4LDcgQEAKICAgICAjIHRoaXMgYmVoYXZpb3IgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLiBJZiB5b3Ugd2lzaCB0byBjaGFuZ2UgaXQKICAgICAjIGdvIGFoZWFkLCBqdXN0IG1ha2Ugc3VyZSB0aGUgc3BlY3MgcGFzcwogICAgIGRlZiBpbml0aWFsaXplKGJ1ZmZlciA9IG5pbCkKLSAgICAgIEBidWYgPSBidWZmZXIgfHwgJycKKyAgICAgIEBidWYgPSBidWZmZXIgPyBCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcoYnVmZmVyKSA6IEJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCiAgICAgICBAaW5kZXggPSAwCiAgICAgZW5kCiAKQEAgLTQ4LDcgKzQ4LDcgQEAKIAogICAgICMgdGhpcyBtZXRob2QgZG9lcyBub3QgdXNlIHRoZSBwYXNzZWQgb2JqZWN0IGRpcmVjdGx5IGJ1dCBjb3BpZXMgaXQKICAgICBkZWYgcmVzZXRfYnVmZmVyKG5ld19idWYgPSAnJykKLSAgICAgIEBidWYucmVwbGFjZSBuZXdfYnVmCisgICAgICBAYnVmLnJlcGxhY2UgQnl0ZXMuZm9yY2VfYmluYXJ5X2VuY29kaW5nKG5ld19idWYpCiAgICAgICBAaW5kZXggPSAwCiAgICAgZW5kCiAKQEAgLTcyLDcgKzcyLDcgQEAKIAogICAgIGRlZiByZWFkX2J5dGUKICAgICAgIHJhaXNlIEVPRkVycm9yLm5ldygiTm90IGVub3VnaCBieXRlcyByZW1haW4gaW4gYnVmZmVyIikgaWYgQGluZGV4ID49IEBidWYuc2l6ZQotICAgICAgdmFsID0gOjpUaHJpZnQ6OlRyYW5zcG9ydFV0aWxzLmdldF9zdHJpbmdfYnl0ZShAYnVmLCBAaW5kZXgpCisgICAgICB2YWwgPSBCeXRlcy5nZXRfc3RyaW5nX2J5dGUoQGJ1ZiwgQGluZGV4KQogICAgICAgQGluZGV4ICs9IDEKICAgICAgIGlmIEBpbmRleCA+PSBHQVJCQUdFX0JVRkZFUl9TSVpFCiAgICAgICAgIEBidWYgPSBAYnVmLnNsaWNlKEBpbmRleC4uLTEpCkBAIC04Nyw4ICs4Nyw4IEBACiAgICAgICAgIHJhaXNlIEVPRkVycm9yLm5ldygiTm90IGVub3VnaCBieXRlcyByZW1haW4gaW4gYnVmZmVyIikgaWYgQGluZGV4ID49IEBidWYuc2l6ZQogCiAgICAgICAgICMgVGhlIHJlYWQgYnVmZmVyIGhhcyBzb21lIGRhdGEgbm93LCBzbyBjb3B5IGJ5dGVzIG92ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIuCi0gICAgICAgIGJ5dGUgPSA6OlRocmlmdDo6VHJhbnNwb3J0VXRpbHMuZ2V0X3N0cmluZ19ieXRlKEBidWYsIEBpbmRleCkKLSAgICAgICAgOjpUaHJpZnQ6OlRyYW5zcG9ydFV0aWxzLnNldF9zdHJpbmdfYnl0ZShidWZmZXIsIGksIGJ5dGUpCisgICAgICAgIGJ5dGUgPSBCeXRlcy5nZXRfc3RyaW5nX2J5dGUoQGJ1ZiwgQGluZGV4KQorICAgICAgICBCeXRlcy5zZXRfc3RyaW5nX2J5dGUoYnVmZmVyLCBpLCBieXRlKQogICAgICAgICBAaW5kZXggKz0gMQogICAgICAgICBpICs9IDEKICAgICAgIGVuZApAQCAtMTAwLDcgKzEwMCw3IEBACiAgICAgZW5kCiAKICAgICBkZWYgd3JpdGUod2J1ZikKLSAgICAgIEBidWYgPDwgd2J1ZgorICAgICAgQGJ1ZiA8PCBCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2Rpbmcod2J1ZikKICAgICBlbmQKIAogICAgIGRlZiBmbHVzaApAQCAtMTIxLDUgKzEyMSw5IEBACiAgICAgICBlbmQKICAgICAgIG91dC5qb2luKCIgIikKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgIm1lbW9yeSIKKyAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NlcnZlcl9zb2NrZXQucmIKaW5kZXggN2ZlYjlhYi4uNTAwMDIzMiAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NlcnZlcl9zb2NrZXQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NlcnZlcl9zb2NrZXQucmIKQEAgLTU5LDUgKzU5LDEwIEBACiAgICAgZW5kCiAKICAgICBhbGlhcyB0b19pbyBoYW5kbGUKKworICAgIGRlZiB0b19zCisgICAgICAic29ja2V0KCN7QGhvc3R9OiN7QHBvcnR9KSIKKyAgICBlbmQKKwogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NvY2tldC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQucmIKaW5kZXggOWJiMjAzNi4uZjVlNmYzYiAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NvY2tldC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc29ja2V0LnJiCkBAIC0zMywyNSArMzMsMjggQEAKICAgICBhdHRyX2FjY2Vzc29yIDpoYW5kbGUsIDp0aW1lb3V0CiAKICAgICBkZWYgb3BlbgotICAgICAgYmVnaW4KLSAgICAgICAgYWRkcmluZm8gPSA6OlNvY2tldDo6Z2V0YWRkcmluZm8oQGhvc3QsIEBwb3J0KS5maXJzdAotICAgICAgICBAaGFuZGxlID0gOjpTb2NrZXQubmV3KGFkZHJpbmZvWzRdLCA6OlNvY2tldDo6U09DS19TVFJFQU0sIDApCi0gICAgICAgIHNvY2thZGRyID0gOjpTb2NrZXQuc29ja2FkZHJfaW4oYWRkcmluZm9bMV0sIGFkZHJpbmZvWzNdKQorICAgICAgZm9yIGFkZHJpbmZvIGluIDo6U29ja2V0OjpnZXRhZGRyaW5mbyhAaG9zdCwgQHBvcnQsIG5pbCwgOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNKSBkbwogICAgICAgICBiZWdpbgotICAgICAgICAgIEBoYW5kbGUuY29ubmVjdF9ub25ibG9jayhzb2NrYWRkcikKLSAgICAgICAgcmVzY3VlIEVycm5vOjpFSU5QUk9HUkVTUwotICAgICAgICAgIHVubGVzcyBJTy5zZWxlY3QobmlsLCBbIEBoYW5kbGUgXSwgbmlsLCBAdGltZW91dCkKLSAgICAgICAgICAgIHJhaXNlIFRyYW5zcG9ydEV4Y2VwdGlvbi5uZXcoVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvbm5lY3Rpb24gdGltZW91dCB0byAje0BkZXNjfSIpCi0gICAgICAgICAgZW5kCisgICAgICAgICAgc29ja2V0ID0gOjpTb2NrZXQubmV3KGFkZHJpbmZvWzRdLCA6OlNvY2tldDo6U09DS19TVFJFQU0sIDApCisgICAgICAgICAgc29ja2V0LnNldHNvY2tvcHQoOjpTb2NrZXQ6OklQUFJPVE9fVENQLCA6OlNvY2tldDo6VENQX05PREVMQVksIDEpCisgICAgICAgICAgc29ja2FkZHIgPSA6OlNvY2tldC5zb2NrYWRkcl9pbihhZGRyaW5mb1sxXSwgYWRkcmluZm9bM10pCiAgICAgICAgICAgYmVnaW4KLSAgICAgICAgICAgIEBoYW5kbGUuY29ubmVjdF9ub25ibG9jayhzb2NrYWRkcikKLSAgICAgICAgICByZXNjdWUgRXJybm86OkVJU0NPTk4KKyAgICAgICAgICAgIHNvY2tldC5jb25uZWN0X25vbmJsb2NrKHNvY2thZGRyKQorICAgICAgICAgIHJlc2N1ZSBFcnJubzo6RUlOUFJPR1JFU1MKKyAgICAgICAgICAgIHVubGVzcyBJTy5zZWxlY3QobmlsLCBbIHNvY2tldCBdLCBuaWwsIEB0aW1lb3V0KQorICAgICAgICAgICAgICBuZXh0CisgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIGJlZ2luCisgICAgICAgICAgICAgIHNvY2tldC5jb25uZWN0X25vbmJsb2NrKHNvY2thZGRyKQorICAgICAgICAgICAgcmVzY3VlIEVycm5vOjpFSVNDT05OCisgICAgICAgICAgICBlbmQKICAgICAgICAgICBlbmQKKyAgICAgICAgICByZXR1cm4gQGhhbmRsZSA9IHNvY2tldAorICAgICAgICByZXNjdWUgU3RhbmRhcmRFcnJvciA9PiBlCisgICAgICAgICAgbmV4dAogICAgICAgICBlbmQKLSAgICAgICAgQGhhbmRsZQotICAgICAgcmVzY3VlIFN0YW5kYXJkRXJyb3IgPT4gZQotICAgICAgICByYWlzZSBUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3QgY29ubmVjdCB0byAje0BkZXNjfTogI3tlfSIpCiAgICAgICBlbmQKKyAgICAgIHJhaXNlIFRyYW5zcG9ydEV4Y2VwdGlvbi5uZXcoVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBjb25uZWN0IHRvICN7QGRlc2N9OiAje2V9IikKICAgICBlbmQKIAogICAgIGRlZiBvcGVuPwpAQCAtNjAsNiArNjMsNyBAQAogCiAgICAgZGVmIHdyaXRlKHN0cikKICAgICAgIHJhaXNlIElPRXJyb3IsICJjbG9zZWQgc3RyZWFtIiB1bmxlc3Mgb3Blbj8KKyAgICAgIHN0ciA9IEJ5dGVzLmZvcmNlX2JpbmFyeV9lbmNvZGluZyhzdHIpCiAgICAgICBiZWdpbgogICAgICAgICBpZiBAdGltZW91dC5uaWw/IG9yIEB0aW1lb3V0ID09IDAKICAgICAgICAgICBAaGFuZGxlLndyaXRlKHN0cikKQEAgLTEzMCw4ICsxMzQsMTAgQEAKICAgICAgIEBoYW5kbGUgPSBuaWwKICAgICBlbmQKIAotICAgIGRlZiB0b19pbwotICAgICAgQGhhbmRsZQorICAgIGFsaWFzIHRvX2lvIGhhbmRsZQorCisgICAgZGVmIHRvX3MKKyAgICAgICJzb2NrZXQoI3tAaG9zdH06I3tAcG9ydH0pIgogICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NzbF9zZXJ2ZXJfc29ja2V0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NzbF9zZXJ2ZXJfc29ja2V0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYmQ1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc3NsX3NlcnZlcl9zb2NrZXQucmIKQEAgLTAsMCArMSw0MSBAQAorIyBlbmNvZGluZzogYXNjaWktOGJpdAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3JlcXVpcmUgJ3NvY2tldCcKKworbW9kdWxlIFRocmlmdAorICBjbGFzcyBTU0xTZXJ2ZXJTb2NrZXQgPCBTZXJ2ZXJTb2NrZXQKKyAgICBkZWYgaW5pdGlhbGl6ZShob3N0X29yX3BvcnQsIHBvcnQgPSBuaWwsIHNzbF9jb250ZXh0ID0gbmlsKQorICAgICAgc3VwZXIoaG9zdF9vcl9wb3J0LCBwb3J0KQorICAgICAgQHNzbF9jb250ZXh0ID0gc3NsX2NvbnRleHQKKyAgICBlbmQKKworICAgIGF0dHJfYWNjZXNzb3IgOnNzbF9jb250ZXh0CisKKyAgICBkZWYgbGlzdGVuCisgICAgICBzb2NrZXQgPSBUQ1BTZXJ2ZXIubmV3KEBob3N0LCBAcG9ydCkKKyAgICAgIEBoYW5kbGUgPSBPcGVuU1NMOjpTU0w6OlNTTFNlcnZlci5uZXcoc29ja2V0LCBAc3NsX2NvbnRleHQpCisgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJzc2woI3tzdXBlci50b19zfSkiCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc3NsX3NvY2tldC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zc2xfc29ja2V0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYjk2YWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc3NsX3NvY2tldC5yYgpAQCAtMCwwICsxLDUxIEBACisjIGVuY29kaW5nOiBhc2NpaS04Yml0CisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworbW9kdWxlIFRocmlmdAorICBjbGFzcyBTU0xTb2NrZXQgPCBTb2NrZXQKKyAgICBkZWYgaW5pdGlhbGl6ZShob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsIHRpbWVvdXQ9bmlsLCBzc2xfY29udGV4dD1uaWwpCisgICAgICBzdXBlcihob3N0LCBwb3J0LCB0aW1lb3V0KQorICAgICAgQHNzbF9jb250ZXh0ID0gc3NsX2NvbnRleHQKKyAgICBlbmQKKworICAgIGF0dHJfYWNjZXNzb3IgOnNzbF9jb250ZXh0CisKKyAgICBkZWYgb3BlbgorICAgICAgc29ja2V0ID0gc3VwZXIKKyAgICAgIEBoYW5kbGUgPSBPcGVuU1NMOjpTU0w6OlNTTFNvY2tldC5uZXcoc29ja2V0LCBAc3NsX2NvbnRleHQpCisgICAgICBiZWdpbgorICAgICAgICBAaGFuZGxlLmNvbm5lY3Rfbm9uYmxvY2sKKyAgICAgICAgQGhhbmRsZS5wb3N0X2Nvbm5lY3Rpb25fY2hlY2soQGhvc3QpCisgICAgICAgIEBoYW5kbGUKKyAgICAgIHJlc2N1ZSBJTzo6V2FpdFJlYWRhYmxlCisgICAgICAgIElPLnNlbGVjdChbIEBoYW5kbGUgXSwgbmlsLCBuaWwsIEB0aW1lb3V0KQorICAgICAgICByZXRyeQorICAgICAgcmVzY3VlIElPOjpXYWl0V3JpdGFibGUKKyAgICAgICAgSU8uc2VsZWN0KG5pbCwgWyBAaGFuZGxlIF0sIG5pbCwgQHRpbWVvdXQpCisgICAgICAgIHJldHJ5CisgICAgICByZXNjdWUgU3RhbmRhcmRFcnJvciA9PiBlCisgICAgICAgIHJhaXNlIFRyYW5zcG9ydEV4Y2VwdGlvbi5uZXcoVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBjb25uZWN0IHRvICN7QGRlc2N9OiAje2V9IikKKyAgICAgIGVuZAorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAic3NsKCN7c3VwZXIudG9fc30pIgorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc2VydmVyX3NvY2tldC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NlcnZlcl9zb2NrZXQucmIKaW5kZXggYTEzNWQyNS4uMDU3ZDEyMiAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc2VydmVyX3NvY2tldC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zZXJ2ZXJfc29ja2V0LnJiCkBAIC01Niw1ICs1Niw5IEBACiAgICAgZW5kCiAKICAgICBhbGlhcyB0b19pbyBoYW5kbGUKKworICAgIGRlZiB0b19zCisgICAgICAiZG9tYWluKCN7QHBhdGh9KSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NvY2tldC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NvY2tldC5yYgppbmRleCA4ZjY5MmU0Li41ZGZmZDU5IDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zb2NrZXQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc29ja2V0LnJiCkBAIC0zNiw1ICszNiw5IEBACiAgICAgICAgIHJhaXNlIFRyYW5zcG9ydEV4Y2VwdGlvbi5uZXcoVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBvcGVuIFVOSVggc29ja2V0IGF0ICN7QHBhdGh9IikKICAgICAgIGVuZAogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiZG9tYWluKCN7QHBhdGh9KSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3VuaW9uLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdW5pb24ucmIKaW5kZXggYTcwNThmMi4uNDkwYzU1YyAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdW5pb24ucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdW5pb24ucmIKQEAgLTg3LDEyICs4Nyw5IEBACiAgICAgZW5kCiAKICAgICBkZWYgPT0ob3RoZXIpCi0gICAgICBvdGhlciAhPSBuaWwgJiYgQHNldGZpZWxkID09IG90aGVyLmdldF9zZXRfZmllbGQgJiYgQHZhbHVlID09IG90aGVyLmdldF92YWx1ZQorICAgICAgb3RoZXIuZXF1YWw/KHNlbGYpIHx8IG90aGVyLmluc3RhbmNlX29mPyhzZWxmLmNsYXNzKSAmJiBAc2V0ZmllbGQgPT0gb3RoZXIuZ2V0X3NldF9maWVsZCAmJiBAdmFsdWUgPT0gb3RoZXIuZ2V0X3ZhbHVlCiAgICAgZW5kCi0KLSAgICBkZWYgZXFsPyhvdGhlcikKLSAgICAgIHNlbGYuY2xhc3MgPT0gb3RoZXIuY2xhc3MgJiYgc2VsZiA9PSBvdGhlcgotICAgIGVuZAorICAgIGFsaWFzX21ldGhvZCA6ZXFsPywgOj09CiAKICAgICBkZWYgaGFzaAogICAgICAgW3NlbGYuY2xhc3MubmFtZSwgQHNldGZpZWxkLCBAdmFsdWVdLmhhc2gKQEAgLTE3Niw0ICsxNzMsNCBAQAogICAgICAgZW5kCiAgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc2V0dXAucmIgYi9saWIvcmIvc2V0dXAucmIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMGM4MjYuLjAwMDAwMDAKLS0tIGEvbGliL3JiL3NldHVwLnJiCisrKyAvZGV2L251bGwKQEAgLTEsMTU4NSArMCwwIEBACi0jCi0jIHNldHVwLnJiCi0jCi0jIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IE1pbmVybyBBb2tpCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlLgotIyBZb3UgY2FuIGRpc3RyaWJ1dGUvbW9kaWZ5IHRoaXMgcHJvZ3JhbSB1bmRlciB0aGUgdGVybXMgb2YKLSMgdGhlIEdOVSBMR1BMLCBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMS4KLSMKLQotdW5sZXNzIEVudW1lcmFibGUubWV0aG9kX2RlZmluZWQ/KDptYXApICAgIyBSdWJ5IDEuNC42Ci0gIG1vZHVsZSBFbnVtZXJhYmxlCi0gICAgYWxpYXMgbWFwIGNvbGxlY3QKLSAgZW5kCi1lbmQKLQotdW5sZXNzIEZpbGUucmVzcG9uZF90bz8oOnJlYWQpICAgIyBSdWJ5IDEuNgotICBkZWYgRmlsZS5yZWFkKGZuYW1lKQotICAgIG9wZW4oZm5hbWUpIHt8ZnwKLSAgICAgIHJldHVybiBmLnJlYWQKLSAgICB9Ci0gIGVuZAotZW5kCi0KLXVubGVzcyBFcnJuby5jb25zdF9kZWZpbmVkPyg6RU5PVEVNUFRZKSAgICMgV2luZG93cz8KLSAgbW9kdWxlIEVycm5vCi0gICAgY2xhc3MgRU5PVEVNUFRZCi0gICAgICAjIFdlIGRvIG5vdCByYWlzZSB0aGlzIGV4Y2VwdGlvbiwgaW1wbGVtZW50YXRpb24gaXMgbm90IG5lZWRlZC4KLSAgICBlbmQKLSAgZW5kCi1lbmQKLQotZGVmIEZpbGUuYmlucmVhZChmbmFtZSkKLSAgb3BlbihmbmFtZSwgJ3JiJykge3xmfAotICAgIHJldHVybiBmLnJlYWQKLSAgfQotZW5kCi0KLSMgZm9yIGNvcnJ1cHRlZCBXaW5kb3dzJyBzdGF0KDIpCi1kZWYgRmlsZS5kaXI/KHBhdGgpCi0gIEZpbGUuZGlyZWN0b3J5PygocGF0aFstMSwxXSA9PSAnLycpID8gcGF0aCA6IHBhdGggKyAnLycpCi1lbmQKLQotCi1jbGFzcyBDb25maWdUYWJsZQotCi0gIGluY2x1ZGUgRW51bWVyYWJsZQotCi0gIGRlZiBpbml0aWFsaXplKHJiY29uZmlnKQotICAgIEByYmNvbmZpZyA9IHJiY29uZmlnCi0gICAgQGl0ZW1zID0gW10KLSAgICBAdGFibGUgPSB7fQotICAgICMgb3B0aW9ucwotICAgIEBpbnN0YWxsX3ByZWZpeCA9IG5pbAotICAgIEBjb25maWdfb3B0ID0gbmlsCi0gICAgQHZlcmJvc2UgPSB0cnVlCi0gICAgQG5vX2hhcm0gPSBmYWxzZQotICBlbmQKLQotICBhdHRyX2FjY2Vzc29yIDppbnN0YWxsX3ByZWZpeAotICBhdHRyX2FjY2Vzc29yIDpjb25maWdfb3B0Ci0KLSAgYXR0cl93cml0ZXIgOnZlcmJvc2UKLQotICBkZWYgdmVyYm9zZT8KLSAgICBAdmVyYm9zZQotICBlbmQKLQotICBhdHRyX3dyaXRlciA6bm9faGFybQotCi0gIGRlZiBub19oYXJtPwotICAgIEBub19oYXJtCi0gIGVuZAotCi0gIGRlZiBbXShrZXkpCi0gICAgbG9va3VwKGtleSkucmVzb2x2ZShzZWxmKQotICBlbmQKLQotICBkZWYgW109KGtleSwgdmFsKQotICAgIGxvb2t1cChrZXkpLnNldCB2YWwKLSAgZW5kCi0KLSAgZGVmIG5hbWVzCi0gICAgQGl0ZW1zLm1hcCB7fGl8IGkubmFtZSB9Ci0gIGVuZAotCi0gIGRlZiBlYWNoKCZibG9jaykKLSAgICBAaXRlbXMuZWFjaCgmYmxvY2spCi0gIGVuZAotCi0gIGRlZiBrZXk/KG5hbWUpCi0gICAgQHRhYmxlLmtleT8obmFtZSkKLSAgZW5kCi0KLSAgZGVmIGxvb2t1cChuYW1lKQotICAgIEB0YWJsZVtuYW1lXSBvciBzZXR1cF9yYl9lcnJvciAibm8gc3VjaCBjb25maWcgaXRlbTogI3tuYW1lfSIKLSAgZW5kCi0KLSAgZGVmIGFkZChpdGVtKQotICAgIEBpdGVtcy5wdXNoIGl0ZW0KLSAgICBAdGFibGVbaXRlbS5uYW1lXSA9IGl0ZW0KLSAgZW5kCi0KLSAgZGVmIHJlbW92ZShuYW1lKQotICAgIGl0ZW0gPSBsb29rdXAobmFtZSkKLSAgICBAaXRlbXMuZGVsZXRlX2lmIHt8aXwgaS5uYW1lID09IG5hbWUgfQotICAgIEB0YWJsZS5kZWxldGVfaWYge3xuYW1lLCBpfCBpLm5hbWUgPT0gbmFtZSB9Ci0gICAgaXRlbQotICBlbmQKLQotICBkZWYgbG9hZF9zY3JpcHQocGF0aCwgaW5zdCA9IG5pbCkKLSAgICBpZiBGaWxlLmZpbGU/KHBhdGgpCi0gICAgICBNZXRhQ29uZmlnRW52aXJvbm1lbnQubmV3KHNlbGYsIGluc3QpLmluc3RhbmNlX2V2YWwgRmlsZS5yZWFkKHBhdGgpLCBwYXRoCi0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiBzYXZlZmlsZQotICAgICcuY29uZmlnJwotICBlbmQKLQotICBkZWYgbG9hZF9zYXZlZmlsZQotICAgIGJlZ2luCi0gICAgICBGaWxlLmZvcmVhY2goc2F2ZWZpbGUoKSkgZG8gfGxpbmV8Ci0gICAgICAgIGssIHYgPSAqbGluZS5zcGxpdCgvPS8sIDIpCi0gICAgICAgIHNlbGZba10gPSB2LnN0cmlwCi0gICAgICBlbmQKLSAgICByZXNjdWUgRXJybm86OkVOT0VOVAotICAgICAgc2V0dXBfcmJfZXJyb3IgJCEubWVzc2FnZSArICJcbiN7RmlsZS5iYXNlbmFtZSgkMCl9IGNvbmZpZyBmaXJzdCIKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHNhdmUKLSAgICBAaXRlbXMuZWFjaCB7fGl8IGkudmFsdWUgfQotICAgIEZpbGUub3BlbihzYXZlZmlsZSgpLCAndycpIHt8ZnwKLSAgICAgIEBpdGVtcy5lYWNoIGRvIHxpfAotICAgICAgICBmLnByaW50ZiAiJXM9JXNcbiIsIGkubmFtZSwgaS52YWx1ZSBpZiBpLnZhbHVlPyBhbmQgaS52YWx1ZQotICAgICAgZW5kCi0gICAgfQotICBlbmQKLQotICBkZWYgbG9hZF9zdGFuZGFyZF9lbnRyaWVzCi0gICAgc3RhbmRhcmRfZW50cmllcyhAcmJjb25maWcpLmVhY2ggZG8gfGVudHwKLSAgICAgIGFkZCBlbnQKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHN0YW5kYXJkX2VudHJpZXMocmJjb25maWcpCi0gICAgYyA9IHJiY29uZmlnCi0KLSAgICBydWJ5cGF0aCA9IEZpbGUuam9pbihjWydiaW5kaXInXSwgY1sncnVieV9pbnN0YWxsX25hbWUnXSArIGNbJ0VYRUVYVCddKQotCi0gICAgbWFqb3IgPSBjWydNQUpPUiddLnRvX2kKLSAgICBtaW5vciA9IGNbJ01JTk9SJ10udG9faQotICAgIHRlZW55ID0gY1snVEVFTlknXS50b19pCi0gICAgdmVyc2lvbiA9ICIje21ham9yfS4je21pbm9yfSIKLQotICAgICMgcnVieSB2ZXIuID49IDEuNC40PwotICAgIG5ld3BhdGhfcCA9ICgobWFqb3IgPj0gMikgb3IKLSAgICAgICAgICAgICAgICAgKChtYWpvciA9PSAxKSBhbmQKLSAgICAgICAgICAgICAgICAgICgobWlub3IgPj0gNSkgb3IKLSAgICAgICAgICAgICAgICAgICAoKG1pbm9yID09IDQpIGFuZCAodGVlbnkgPj0gNCkpKSkpCi0KLSAgICBpZiBjWydydWJ5bGliZGlyJ10KLSAgICAgICMgViA+IDEuNi4zCi0gICAgICBsaWJydWJ5ICAgICAgICAgPSAiI3tjWydwcmVmaXgnXX0vbGliL3J1YnkiCi0gICAgICBsaWJydWJ5dmVyICAgICAgPSBjWydydWJ5bGliZGlyJ10KLSAgICAgIGxpYnJ1Ynl2ZXJhcmNoICA9IGNbJ2FyY2hkaXInXQotICAgICAgc2l0ZXJ1YnkgICAgICAgID0gY1snc2l0ZWRpciddCi0gICAgICBzaXRlcnVieXZlciAgICAgPSBjWydzaXRlbGliZGlyJ10KLSAgICAgIHNpdGVydWJ5dmVyYXJjaCA9IGNbJ3NpdGVhcmNoZGlyJ10KLSAgICBlbHNpZiBuZXdwYXRoX3AKLSAgICAgICMgMS40LjQgPD0gViA8PSAxLjYuMwotICAgICAgbGlicnVieSAgICAgICAgID0gIiN7Y1sncHJlZml4J119L2xpYi9ydWJ5IgotICAgICAgbGlicnVieXZlciAgICAgID0gIiN7Y1sncHJlZml4J119L2xpYi9ydWJ5LyN7dmVyc2lvbn0iCi0gICAgICBsaWJydWJ5dmVyYXJjaCAgPSAiI3tjWydwcmVmaXgnXX0vbGliL3J1YnkvI3t2ZXJzaW9ufS8je2NbJ2FyY2gnXX0iCi0gICAgICBzaXRlcnVieSAgICAgICAgPSBjWydzaXRlZGlyJ10KLSAgICAgIHNpdGVydWJ5dmVyICAgICA9ICIkc2l0ZXJ1YnkvI3t2ZXJzaW9ufSIKLSAgICAgIHNpdGVydWJ5dmVyYXJjaCA9ICIkc2l0ZXJ1Ynl2ZXIvI3tjWydhcmNoJ119IgotICAgIGVsc2UKLSAgICAgICMgViA8IDEuNC40Ci0gICAgICBsaWJydWJ5ICAgICAgICAgPSAiI3tjWydwcmVmaXgnXX0vbGliL3J1YnkiCi0gICAgICBsaWJydWJ5dmVyICAgICAgPSAiI3tjWydwcmVmaXgnXX0vbGliL3J1YnkvI3t2ZXJzaW9ufSIKLSAgICAgIGxpYnJ1Ynl2ZXJhcmNoICA9ICIje2NbJ3ByZWZpeCddfS9saWIvcnVieS8je3ZlcnNpb259LyN7Y1snYXJjaCddfSIKLSAgICAgIHNpdGVydWJ5ICAgICAgICA9ICIje2NbJ3ByZWZpeCddfS9saWIvcnVieS8je3ZlcnNpb259L3NpdGVfcnVieSIKLSAgICAgIHNpdGVydWJ5dmVyICAgICA9IHNpdGVydWJ5Ci0gICAgICBzaXRlcnVieXZlcmFyY2ggPSAiJHNpdGVydWJ5dmVyLyN7Y1snYXJjaCddfSIKLSAgICBlbmQKLSAgICBwYXJhbWV0ZXJpemUgPSBsYW1iZGEge3xwYXRofAotICAgICAgcGF0aC5zdWIoL1xBI3tSZWdleHAucXVvdGUoY1sncHJlZml4J10pfS8sICckcHJlZml4JykKLSAgICB9Ci0KLSAgICBpZiBhcmcgPSBjWydjb25maWd1cmVfYXJncyddLnNwbGl0LmRldGVjdCB7fGFyZ3wgLy0td2l0aC1tYWtlLXByb2c9LyA9fiBhcmcgfQotICAgICAgbWFrZXByb2cgPSBhcmcuc3ViKC8nLywgJycpLnNwbGl0KC89LywgMilbMV0KLSAgICBlbHNlCi0gICAgICBtYWtlcHJvZyA9ICdtYWtlJwotICAgIGVuZAotCi0gICAgWwotICAgICAgRXhlY0l0ZW0ubmV3KCdpbnN0YWxsZGlycycsICdzdGQvc2l0ZS9ob21lJywKLSAgICAgICAgICAgICAgICAgICAnc3RkOiBpbnN0YWxsIHVuZGVyIGxpYnJ1Ynk7IHNpdGU6IGluc3RhbGwgdW5kZXIgc2l0ZV9ydWJ5OyBob21lOiBpbnN0YWxsIHVuZGVyICRIT01FJylcCi0gICAgICAgICAge3x2YWwsIHRhYmxlfAotICAgICAgICAgICAgY2FzZSB2YWwKLSAgICAgICAgICAgIHdoZW4gJ3N0ZCcKLSAgICAgICAgICAgICAgdGFibGVbJ3JiZGlyJ10gPSAnJGxpYnJ1Ynl2ZXInCi0gICAgICAgICAgICAgIHRhYmxlWydzb2RpciddID0gJyRsaWJydWJ5dmVyYXJjaCcKLSAgICAgICAgICAgIHdoZW4gJ3NpdGUnCi0gICAgICAgICAgICAgIHRhYmxlWydyYmRpciddID0gJyRzaXRlcnVieXZlcicKLSAgICAgICAgICAgICAgdGFibGVbJ3NvZGlyJ10gPSAnJHNpdGVydWJ5dmVyYXJjaCcKLSAgICAgICAgICAgIHdoZW4gJ2hvbWUnCi0gICAgICAgICAgICAgIHNldHVwX3JiX2Vycm9yICckSE9NRSB3YXMgbm90IHNldCcgdW5sZXNzIEVOVlsnSE9NRSddCi0gICAgICAgICAgICAgIHRhYmxlWydwcmVmaXgnXSA9IEVOVlsnSE9NRSddCi0gICAgICAgICAgICAgIHRhYmxlWydyYmRpciddID0gJyRsaWJkaXIvcnVieScKLSAgICAgICAgICAgICAgdGFibGVbJ3NvZGlyJ10gPSAnJGxpYmRpci9ydWJ5JwotICAgICAgICAgICAgZW5kCi0gICAgICAgICAgfSwKLSAgICAgIFBhdGhJdGVtLm5ldygncHJlZml4JywgJ3BhdGgnLCBjWydwcmVmaXgnXSwKLSAgICAgICAgICAgICAgICAgICAncGF0aCBwcmVmaXggb2YgdGFyZ2V0IGVudmlyb25tZW50JyksCi0gICAgICBQYXRoSXRlbS5uZXcoJ2JpbmRpcicsICdwYXRoJywgcGFyYW1ldGVyaXplLmNhbGwoY1snYmluZGlyJ10pLAotICAgICAgICAgICAgICAgICAgICd0aGUgZGlyZWN0b3J5IGZvciBjb21tYW5kcycpLAotICAgICAgUGF0aEl0ZW0ubmV3KCdsaWJkaXInLCAncGF0aCcsIHBhcmFtZXRlcml6ZS5jYWxsKGNbJ2xpYmRpciddKSwKLSAgICAgICAgICAgICAgICAgICAndGhlIGRpcmVjdG9yeSBmb3IgbGlicmFyaWVzJyksCi0gICAgICBQYXRoSXRlbS5uZXcoJ2RhdGFkaXInLCAncGF0aCcsIHBhcmFtZXRlcml6ZS5jYWxsKGNbJ2RhdGFkaXInXSksCi0gICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIHNoYXJlZCBkYXRhJyksCi0gICAgICBQYXRoSXRlbS5uZXcoJ21hbmRpcicsICdwYXRoJywgcGFyYW1ldGVyaXplLmNhbGwoY1snbWFuZGlyJ10pLAotICAgICAgICAgICAgICAgICAgICd0aGUgZGlyZWN0b3J5IGZvciBtYW4gcGFnZXMnKSwKLSAgICAgIFBhdGhJdGVtLm5ldygnc3lzY29uZmRpcicsICdwYXRoJywgcGFyYW1ldGVyaXplLmNhbGwoY1snc3lzY29uZmRpciddKSwKLSAgICAgICAgICAgICAgICAgICAndGhlIGRpcmVjdG9yeSBmb3Igc3lzdGVtIGNvbmZpZ3VyYXRpb24gZmlsZXMnKSwKLSAgICAgIFBhdGhJdGVtLm5ldygnbG9jYWxzdGF0ZWRpcicsICdwYXRoJywgcGFyYW1ldGVyaXplLmNhbGwoY1snbG9jYWxzdGF0ZWRpciddKSwKLSAgICAgICAgICAgICAgICAgICAndGhlIGRpcmVjdG9yeSBmb3IgbG9jYWwgc3RhdGUgZGF0YScpLAotICAgICAgUGF0aEl0ZW0ubmV3KCdsaWJydWJ5JywgJ3BhdGgnLCBsaWJydWJ5LAotICAgICAgICAgICAgICAgICAgICd0aGUgZGlyZWN0b3J5IGZvciBydWJ5IGxpYnJhcmllcycpLAotICAgICAgUGF0aEl0ZW0ubmV3KCdsaWJydWJ5dmVyJywgJ3BhdGgnLCBsaWJydWJ5dmVyLAotICAgICAgICAgICAgICAgICAgICd0aGUgZGlyZWN0b3J5IGZvciBzdGFuZGFyZCBydWJ5IGxpYnJhcmllcycpLAotICAgICAgUGF0aEl0ZW0ubmV3KCdsaWJydWJ5dmVyYXJjaCcsICdwYXRoJywgbGlicnVieXZlcmFyY2gsCi0gICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIHN0YW5kYXJkIHJ1YnkgZXh0ZW5zaW9ucycpLAotICAgICAgUGF0aEl0ZW0ubmV3KCdzaXRlcnVieScsICdwYXRoJywgc2l0ZXJ1YnksCi0gICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIHZlcnNpb24taW5kZXBlbmRlbnQgYXV4IHJ1YnkgbGlicmFyaWVzJyksCi0gICAgICBQYXRoSXRlbS5uZXcoJ3NpdGVydWJ5dmVyJywgJ3BhdGgnLCBzaXRlcnVieXZlciwKLSAgICAgICAgICAgICAgICAgICAndGhlIGRpcmVjdG9yeSBmb3IgYXV4IHJ1YnkgbGlicmFyaWVzJyksCi0gICAgICBQYXRoSXRlbS5uZXcoJ3NpdGVydWJ5dmVyYXJjaCcsICdwYXRoJywgc2l0ZXJ1Ynl2ZXJhcmNoLAotICAgICAgICAgICAgICAgICAgICd0aGUgZGlyZWN0b3J5IGZvciBhdXggcnVieSBiaW5hcmllcycpLAotICAgICAgUGF0aEl0ZW0ubmV3KCdyYmRpcicsICdwYXRoJywgJyRzaXRlcnVieXZlcicsCi0gICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIHJ1Ynkgc2NyaXB0cycpLAotICAgICAgUGF0aEl0ZW0ubmV3KCdzb2RpcicsICdwYXRoJywgJyRzaXRlcnVieXZlcmFyY2gnLAotICAgICAgICAgICAgICAgICAgICd0aGUgZGlyZWN0b3J5IGZvciBydWJ5IGV4dGVudGlvbnMnKSwKLSAgICAgIFBhdGhJdGVtLm5ldygncnVieXBhdGgnLCAncGF0aCcsIHJ1YnlwYXRoLAotICAgICAgICAgICAgICAgICAgICd0aGUgcGF0aCB0byBzZXQgdG8gIyEgbGluZScpLAotICAgICAgUHJvZ3JhbUl0ZW0ubmV3KCdydWJ5cHJvZycsICduYW1lJywgcnVieXBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgJ3RoZSBydWJ5IHByb2dyYW0gdXNpbmcgZm9yIGluc3RhbGxhdGlvbicpLAotICAgICAgUHJvZ3JhbUl0ZW0ubmV3KCdtYWtlcHJvZycsICduYW1lJywgbWFrZXByb2csCi0gICAgICAgICAgICAgICAgICAgICAgJ3RoZSBtYWtlIHByb2dyYW0gdG8gY29tcGlsZSBydWJ5IGV4dGVudGlvbnMnKSwKLSAgICAgIFNlbGVjdEl0ZW0ubmV3KCdzaGViYW5nJywgJ2FsbC9ydWJ5L25ldmVyJywgJ3J1YnknLAotICAgICAgICAgICAgICAgICAgICAgJ3NoZWJhbmcgbGluZSAoIyEpIGVkaXRpbmcgbW9kZScpLAotICAgICAgQm9vbEl0ZW0ubmV3KCd3aXRob3V0LWV4dCcsICd5ZXMvbm8nLCAnbm8nLAotICAgICAgICAgICAgICAgICAgICdkb2VzIG5vdCBjb21waWxlL2luc3RhbGwgcnVieSBleHRlbnRpb25zJykKLSAgICBdCi0gIGVuZAotICBwcml2YXRlIDpzdGFuZGFyZF9lbnRyaWVzCi0KLSAgZGVmIGxvYWRfbXVsdGlwYWNrYWdlX2VudHJpZXMKLSAgICBtdWx0aXBhY2thZ2VfZW50cmllcygpLmVhY2ggZG8gfGVudHwKLSAgICAgIGFkZCBlbnQKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIG11bHRpcGFja2FnZV9lbnRyaWVzCi0gICAgWwotICAgICAgUGFja2FnZVNlbGVjdGlvbkl0ZW0ubmV3KCd3aXRoJywgJ25hbWUsbmFtZS4uLicsICcnLCAnQUxMJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFja2FnZSBuYW1lcyB0aGF0IHlvdSB3YW50IHRvIGluc3RhbGwnKSwKLSAgICAgIFBhY2thZ2VTZWxlY3Rpb25JdGVtLm5ldygnd2l0aG91dCcsICduYW1lLG5hbWUuLi4nLCAnJywgJ05PTkUnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWNrYWdlIG5hbWVzIHRoYXQgeW91IGRvIG5vdCB3YW50IHRvIGluc3RhbGwnKQotICAgIF0KLSAgZW5kCi0gIHByaXZhdGUgOm11bHRpcGFja2FnZV9lbnRyaWVzCi0KLSAgQUxJQVNFUyA9IHsKLSAgICAnc3RkLXJ1YnknICAgICAgICAgPT4gJ2xpYnJ1Ynl2ZXInLAotICAgICdzdGRydWJ5JyAgICAgICAgICA9PiAnbGlicnVieXZlcicsCi0gICAgJ3J1YnlsaWJkaXInICAgICAgID0+ICdsaWJydWJ5dmVyJywKLSAgICAnYXJjaGRpcicgICAgICAgICAgPT4gJ2xpYnJ1Ynl2ZXJhcmNoJywKLSAgICAnc2l0ZS1ydWJ5LWNvbW1vbicgPT4gJ3NpdGVydWJ5JywgICAgICMgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLSAgICAnc2l0ZS1ydWJ5JyAgICAgICAgPT4gJ3NpdGVydWJ5dmVyJywgICMgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLSAgICAnYmluLWRpcicgICAgICAgICAgPT4gJ2JpbmRpcicsCi0gICAgJ2Jpbi1kaXInICAgICAgICAgID0+ICdiaW5kaXInLAotICAgICdyYi1kaXInICAgICAgICAgICA9PiAncmJkaXInLAotICAgICdzby1kaXInICAgICAgICAgICA9PiAnc29kaXInLAotICAgICdkYXRhLWRpcicgICAgICAgICA9PiAnZGF0YWRpcicsCi0gICAgJ3J1YnktcGF0aCcgICAgICAgID0+ICdydWJ5cGF0aCcsCi0gICAgJ3J1YnktcHJvZycgICAgICAgID0+ICdydWJ5cHJvZycsCi0gICAgJ3J1YnknICAgICAgICAgICAgID0+ICdydWJ5cHJvZycsCi0gICAgJ21ha2UtcHJvZycgICAgICAgID0+ICdtYWtlcHJvZycsCi0gICAgJ21ha2UnICAgICAgICAgICAgID0+ICdtYWtlcHJvZycKLSAgfQotCi0gIGRlZiBmaXh1cAotICAgIEFMSUFTRVMuZWFjaCBkbyB8YWxpLCBuYW1lfAotICAgICAgQHRhYmxlW2FsaV0gPSBAdGFibGVbbmFtZV0KLSAgICBlbmQKLSAgICBAaXRlbXMuZnJlZXplCi0gICAgQHRhYmxlLmZyZWV6ZQotICAgIEBvcHRpb25zX3JlID0gL1xBLS0oI3tAdGFibGUua2V5cy5qb2luKCd8Jyl9KSg/Oj0oLiopKT9cei8KLSAgZW5kCi0KLSAgZGVmIHBhcnNlX29wdChvcHQpCi0gICAgbSA9IEBvcHRpb25zX3JlLm1hdGNoKG9wdCkgb3Igc2V0dXBfcmJfZXJyb3IgImNvbmZpZzogdW5rbm93biBvcHRpb24gI3tvcHR9IgotICAgIG0udG9fYVsxLDJdCi0gIGVuZAotCi0gIGRlZiBkbGxleHQKLSAgICBAcmJjb25maWdbJ0RMRVhUJ10KLSAgZW5kCi0KLSAgZGVmIHZhbHVlX2NvbmZpZz8obmFtZSkKLSAgICBsb29rdXAobmFtZSkudmFsdWU/Ci0gIGVuZAotCi0gIGNsYXNzIEl0ZW0KLSAgICBkZWYgaW5pdGlhbGl6ZShuYW1lLCB0ZW1wbGF0ZSwgZGVmYXVsdCwgZGVzYykKLSAgICAgIEBuYW1lID0gbmFtZS5mcmVlemUKLSAgICAgIEB0ZW1wbGF0ZSA9IHRlbXBsYXRlCi0gICAgICBAdmFsdWUgPSBkZWZhdWx0Ci0gICAgICBAZGVmYXVsdCA9IGRlZmF1bHQKLSAgICAgIEBkZXNjcmlwdGlvbiA9IGRlc2MKLSAgICBlbmQKLQotICAgIGF0dHJfcmVhZGVyIDpuYW1lCi0gICAgYXR0cl9yZWFkZXIgOmRlc2NyaXB0aW9uCi0KLSAgICBhdHRyX2FjY2Vzc29yIDpkZWZhdWx0Ci0gICAgYWxpYXMgaGVscF9kZWZhdWx0IGRlZmF1bHQKLQotICAgIGRlZiBoZWxwX29wdAotICAgICAgIi0tI3tAbmFtZX09I3tAdGVtcGxhdGV9IgotICAgIGVuZAotCi0gICAgZGVmIHZhbHVlPwotICAgICAgdHJ1ZQotICAgIGVuZAotCi0gICAgZGVmIHZhbHVlCi0gICAgICBAdmFsdWUKLSAgICBlbmQKLQotICAgIGRlZiByZXNvbHZlKHRhYmxlKQotICAgICAgQHZhbHVlLmdzdWIoJXI8XCQoW14vXSspPikgeyB0YWJsZVskMV0gfQotICAgIGVuZAotCi0gICAgZGVmIHNldCh2YWwpCi0gICAgICBAdmFsdWUgPSBjaGVjayh2YWwpCi0gICAgZW5kCi0KLSAgICBwcml2YXRlCi0KLSAgICBkZWYgY2hlY2sodmFsKQotICAgICAgc2V0dXBfcmJfZXJyb3IgImNvbmZpZzogLS0je25hbWV9IHJlcXVpcmVzIGFyZ3VtZW50IiB1bmxlc3MgdmFsCi0gICAgICB2YWwKLSAgICBlbmQKLSAgZW5kCi0KLSAgY2xhc3MgQm9vbEl0ZW0gPCBJdGVtCi0gICAgZGVmIGNvbmZpZ190eXBlCi0gICAgICAnYm9vbCcKLSAgICBlbmQKLQotICAgIGRlZiBoZWxwX29wdAotICAgICAgIi0tI3tAbmFtZX0iCi0gICAgZW5kCi0KLSAgICBwcml2YXRlCi0KLSAgICBkZWYgY2hlY2sodmFsKQotICAgICAgcmV0dXJuICd5ZXMnIHVubGVzcyB2YWwKLSAgICAgIGNhc2UgdmFsCi0gICAgICB3aGVuIC9cQXkoZXMpP1x6L2ksIC9cQXQocnVlKT9cei9pIHRoZW4gJ3llcycKLSAgICAgIHdoZW4gL1xBbihvKT9cei9pLCAvXEFmKGFsc2UpXHovaSAgdGhlbiAnbm8nCi0gICAgICBlbHNlCi0gICAgICAgIHNldHVwX3JiX2Vycm9yICJjb25maWc6IC0tI3tAbmFtZX0gYWNjZXB0cyBvbmx5IHllcy9ubyBmb3IgYXJndW1lbnQiCi0gICAgICBlbmQKLSAgICBlbmQKLSAgZW5kCi0KLSAgY2xhc3MgUGF0aEl0ZW0gPCBJdGVtCi0gICAgZGVmIGNvbmZpZ190eXBlCi0gICAgICAncGF0aCcKLSAgICBlbmQKLQotICAgIHByaXZhdGUKLQotICAgIGRlZiBjaGVjayhwYXRoKQotICAgICAgc2V0dXBfcmJfZXJyb3IgImNvbmZpZzogLS0je0BuYW1lfSByZXF1aXJlcyBhcmd1bWVudCIgIHVubGVzcyBwYXRoCi0gICAgICBwYXRoWzAsMV0gPT0gJyQnID8gcGF0aCA6IEZpbGUuZXhwYW5kX3BhdGgocGF0aCkKLSAgICBlbmQKLSAgZW5kCi0KLSAgY2xhc3MgUHJvZ3JhbUl0ZW0gPCBJdGVtCi0gICAgZGVmIGNvbmZpZ190eXBlCi0gICAgICAncHJvZ3JhbScKLSAgICBlbmQKLSAgZW5kCi0KLSAgY2xhc3MgU2VsZWN0SXRlbSA8IEl0ZW0KLSAgICBkZWYgaW5pdGlhbGl6ZShuYW1lLCBzZWxlY3Rpb24sIGRlZmF1bHQsIGRlc2MpCi0gICAgICBzdXBlcgotICAgICAgQG9rID0gc2VsZWN0aW9uLnNwbGl0KCcvJykKLSAgICBlbmQKLQotICAgIGRlZiBjb25maWdfdHlwZQotICAgICAgJ3NlbGVjdCcKLSAgICBlbmQKLQotICAgIHByaXZhdGUKLQotICAgIGRlZiBjaGVjayh2YWwpCi0gICAgICB1bmxlc3MgQG9rLmluY2x1ZGU/KHZhbC5zdHJpcCkKLSAgICAgICAgc2V0dXBfcmJfZXJyb3IgImNvbmZpZzogdXNlIC0tI3tAbmFtZX09I3tAdGVtcGxhdGV9ICgje3ZhbH0pIgotICAgICAgZW5kCi0gICAgICB2YWwuc3RyaXAKLSAgICBlbmQKLSAgZW5kCi0KLSAgY2xhc3MgRXhlY0l0ZW0gPCBJdGVtCi0gICAgZGVmIGluaXRpYWxpemUobmFtZSwgc2VsZWN0aW9uLCBkZXNjLCAmYmxvY2spCi0gICAgICBzdXBlciBuYW1lLCBzZWxlY3Rpb24sIG5pbCwgZGVzYwotICAgICAgQG9rID0gc2VsZWN0aW9uLnNwbGl0KCcvJykKLSAgICAgIEBhY3Rpb24gPSBibG9jawotICAgIGVuZAotCi0gICAgZGVmIGNvbmZpZ190eXBlCi0gICAgICAnZXhlYycKLSAgICBlbmQKLQotICAgIGRlZiB2YWx1ZT8KLSAgICAgIGZhbHNlCi0gICAgZW5kCi0KLSAgICBkZWYgcmVzb2x2ZSh0YWJsZSkKLSAgICAgIHNldHVwX3JiX2Vycm9yICIkI3tuYW1lKCl9IHdyb25nbHkgdXNlZCBhcyBvcHRpb24gdmFsdWUiCi0gICAgZW5kCi0KLSAgICB1bmRlZiBzZXQKLQotICAgIGRlZiBldmFsdWF0ZSh2YWwsIHRhYmxlKQotICAgICAgdiA9IHZhbC5zdHJpcC5kb3duY2FzZQotICAgICAgdW5sZXNzIEBvay5pbmNsdWRlPyh2KQotICAgICAgICBzZXR1cF9yYl9lcnJvciAiaW52YWxpZCBvcHRpb24gLS0je0BuYW1lfT0je3ZhbH0gKHVzZSAje0B0ZW1wbGF0ZX0pIgotICAgICAgZW5kCi0gICAgICBAYWN0aW9uLmNhbGwgdiwgdGFibGUKLSAgICBlbmQKLSAgZW5kCi0KLSAgY2xhc3MgUGFja2FnZVNlbGVjdGlvbkl0ZW0gPCBJdGVtCi0gICAgZGVmIGluaXRpYWxpemUobmFtZSwgdGVtcGxhdGUsIGRlZmF1bHQsIGhlbHBfZGVmYXVsdCwgZGVzYykKLSAgICAgIHN1cGVyIG5hbWUsIHRlbXBsYXRlLCBkZWZhdWx0LCBkZXNjCi0gICAgICBAaGVscF9kZWZhdWx0ID0gaGVscF9kZWZhdWx0Ci0gICAgZW5kCi0KLSAgICBhdHRyX3JlYWRlciA6aGVscF9kZWZhdWx0Ci0KLSAgICBkZWYgY29uZmlnX3R5cGUKLSAgICAgICdwYWNrYWdlJwotICAgIGVuZAotCi0gICAgcHJpdmF0ZQotCi0gICAgZGVmIGNoZWNrKHZhbCkKLSAgICAgIHVubGVzcyBGaWxlLmRpcj8oInBhY2thZ2VzLyN7dmFsfSIpCi0gICAgICAgIHNldHVwX3JiX2Vycm9yICJjb25maWc6IG5vIHN1Y2ggcGFja2FnZTogI3t2YWx9IgotICAgICAgZW5kCi0gICAgICB2YWwKLSAgICBlbmQKLSAgZW5kCi0KLSAgY2xhc3MgTWV0YUNvbmZpZ0Vudmlyb25tZW50Ci0gICAgZGVmIGluaXRpYWxpemUoY29uZmlnLCBpbnN0YWxsZXIpCi0gICAgICBAY29uZmlnID0gY29uZmlnCi0gICAgICBAaW5zdGFsbGVyID0gaW5zdGFsbGVyCi0gICAgZW5kCi0KLSAgICBkZWYgY29uZmlnX25hbWVzCi0gICAgICBAY29uZmlnLm5hbWVzCi0gICAgZW5kCi0KLSAgICBkZWYgY29uZmlnPyhuYW1lKQotICAgICAgQGNvbmZpZy5rZXk/KG5hbWUpCi0gICAgZW5kCi0KLSAgICBkZWYgYm9vbF9jb25maWc/KG5hbWUpCi0gICAgICBAY29uZmlnLmxvb2t1cChuYW1lKS5jb25maWdfdHlwZSA9PSAnYm9vbCcKLSAgICBlbmQKLQotICAgIGRlZiBwYXRoX2NvbmZpZz8obmFtZSkKLSAgICAgIEBjb25maWcubG9va3VwKG5hbWUpLmNvbmZpZ190eXBlID09ICdwYXRoJwotICAgIGVuZAotCi0gICAgZGVmIHZhbHVlX2NvbmZpZz8obmFtZSkKLSAgICAgIEBjb25maWcubG9va3VwKG5hbWUpLmNvbmZpZ190eXBlICE9ICdleGVjJwotICAgIGVuZAotCi0gICAgZGVmIGFkZF9jb25maWcoaXRlbSkKLSAgICAgIEBjb25maWcuYWRkIGl0ZW0KLSAgICBlbmQKLQotICAgIGRlZiBhZGRfYm9vbF9jb25maWcobmFtZSwgZGVmYXVsdCwgZGVzYykKLSAgICAgIEBjb25maWcuYWRkIEJvb2xJdGVtLm5ldyhuYW1lLCAneWVzL25vJywgZGVmYXVsdCA/ICd5ZXMnIDogJ25vJywgZGVzYykKLSAgICBlbmQKLQotICAgIGRlZiBhZGRfcGF0aF9jb25maWcobmFtZSwgZGVmYXVsdCwgZGVzYykKLSAgICAgIEBjb25maWcuYWRkIFBhdGhJdGVtLm5ldyhuYW1lLCAncGF0aCcsIGRlZmF1bHQsIGRlc2MpCi0gICAgZW5kCi0KLSAgICBkZWYgc2V0X2NvbmZpZ19kZWZhdWx0KG5hbWUsIGRlZmF1bHQpCi0gICAgICBAY29uZmlnLmxvb2t1cChuYW1lKS5kZWZhdWx0ID0gZGVmYXVsdAotICAgIGVuZAotCi0gICAgZGVmIHJlbW92ZV9jb25maWcobmFtZSkKLSAgICAgIEBjb25maWcucmVtb3ZlKG5hbWUpCi0gICAgZW5kCi0KLSAgICAjIEZvciBvbmx5IG11bHRpcGFja2FnZQotICAgIGRlZiBwYWNrYWdlcwotICAgICAgcmFpc2UgJ1tzZXR1cC5yYiBmYXRhbF0gbXVsdGktcGFja2FnZSBtZXRhY29uZmlnIEFQSSBwYWNrYWdlcygpIGNhbGxlZCBmb3Igc2luZ2xlLXBhY2thZ2U7IGNvbnRhY3QgYXBwbGljYXRpb24gcGFja2FnZSB2ZW5kb3InIHVubGVzcyBAaW5zdGFsbGVyCi0gICAgICBAaW5zdGFsbGVyLnBhY2thZ2VzCi0gICAgZW5kCi0KLSAgICAjIEZvciBvbmx5IG11bHRpcGFja2FnZQotICAgIGRlZiBkZWNsYXJlX3BhY2thZ2VzKGxpc3QpCi0gICAgICByYWlzZSAnW3NldHVwLnJiIGZhdGFsXSBtdWx0aS1wYWNrYWdlIG1ldGFjb25maWcgQVBJIGRlY2xhcmVfcGFja2FnZXMoKSBjYWxsZWQgZm9yIHNpbmdsZS1wYWNrYWdlOyBjb250YWN0IGFwcGxpY2F0aW9uIHBhY2thZ2UgdmVuZG9yJyB1bmxlc3MgQGluc3RhbGxlcgotICAgICAgQGluc3RhbGxlci5wYWNrYWdlcyA9IGxpc3QKLSAgICBlbmQKLSAgZW5kCi0KLWVuZCAgICMgY2xhc3MgQ29uZmlnVGFibGUKLQotCi0jIFRoaXMgbW9kdWxlIHJlcXVpcmVzOiAjdmVyYm9zZT8sICNub19oYXJtPwotbW9kdWxlIEZpbGVPcGVyYXRpb25zCi0KLSAgZGVmIG1rZGlyX3AoZGlybmFtZSwgcHJlZml4ID0gbmlsKQotICAgIGRpcm5hbWUgPSBwcmVmaXggKyBGaWxlLmV4cGFuZF9wYXRoKGRpcm5hbWUpIGlmIHByZWZpeAotICAgICRzdGRlcnIucHV0cyAibWtkaXIgLXAgI3tkaXJuYW1lfSIgaWYgdmVyYm9zZT8KLSAgICByZXR1cm4gaWYgbm9faGFybT8KLQotICAgICMgRG9lcyBub3QgY2hlY2sgJy8nLCBpdCdzIHRvbyBhYm5vcm1hbC4KLSAgICBkaXJzID0gRmlsZS5leHBhbmRfcGF0aChkaXJuYW1lKS5zcGxpdCglcjwoPz0vKT4pCi0gICAgaWYgL1xBW2Etel06XHovaSA9fiBkaXJzWzBdCi0gICAgICBkaXNrID0gZGlycy5zaGlmdAotICAgICAgZGlyc1swXSA9IGRpc2sgKyBkaXJzWzBdCi0gICAgZW5kCi0gICAgZGlycy5lYWNoX2luZGV4IGRvIHxpZHh8Ci0gICAgICBwYXRoID0gZGlyc1swLi5pZHhdLmpvaW4oJycpCi0gICAgICBEaXIubWtkaXIgcGF0aCB1bmxlc3MgRmlsZS5kaXI/KHBhdGgpCi0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiBybV9mKHBhdGgpCi0gICAgJHN0ZGVyci5wdXRzICJybSAtZiAje3BhdGh9IiBpZiB2ZXJib3NlPwotICAgIHJldHVybiBpZiBub19oYXJtPwotICAgIGZvcmNlX3JlbW92ZV9maWxlIHBhdGgKLSAgZW5kCi0KLSAgZGVmIHJtX3JmKHBhdGgpCi0gICAgJHN0ZGVyci5wdXRzICJybSAtcmYgI3twYXRofSIgaWYgdmVyYm9zZT8KLSAgICByZXR1cm4gaWYgbm9faGFybT8KLSAgICByZW1vdmVfdHJlZSBwYXRoCi0gIGVuZAotCi0gIGRlZiByZW1vdmVfdHJlZShwYXRoKQotICAgIGlmIEZpbGUuc3ltbGluaz8ocGF0aCkKLSAgICAgIHJlbW92ZV9maWxlIHBhdGgKLSAgICBlbHNpZiBGaWxlLmRpcj8ocGF0aCkKLSAgICAgIHJlbW92ZV90cmVlMCBwYXRoCi0gICAgZWxzZQotICAgICAgZm9yY2VfcmVtb3ZlX2ZpbGUgcGF0aAotICAgIGVuZAotICBlbmQKLQotICBkZWYgcmVtb3ZlX3RyZWUwKHBhdGgpCi0gICAgRGlyLmZvcmVhY2gocGF0aCkgZG8gfGVudHwKLSAgICAgIG5leHQgaWYgZW50ID09ICcuJwotICAgICAgbmV4dCBpZiBlbnQgPT0gJy4uJwotICAgICAgZW50cGF0aCA9ICIje3BhdGh9LyN7ZW50fSIKLSAgICAgIGlmIEZpbGUuc3ltbGluaz8oZW50cGF0aCkKLSAgICAgICAgcmVtb3ZlX2ZpbGUgZW50cGF0aAotICAgICAgZWxzaWYgRmlsZS5kaXI/KGVudHBhdGgpCi0gICAgICAgIHJlbW92ZV90cmVlMCBlbnRwYXRoCi0gICAgICBlbHNlCi0gICAgICAgIGZvcmNlX3JlbW92ZV9maWxlIGVudHBhdGgKLSAgICAgIGVuZAotICAgIGVuZAotICAgIGJlZ2luCi0gICAgICBEaXIucm1kaXIgcGF0aAotICAgIHJlc2N1ZSBFcnJubzo6RU5PVEVNUFRZCi0gICAgICAjIGRpcmVjdG9yeSBtYXkgbm90IGJlIGVtcHR5Ci0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiBtb3ZlX2ZpbGUoc3JjLCBkZXN0KQotICAgIGZvcmNlX3JlbW92ZV9maWxlIGRlc3QKLSAgICBiZWdpbgotICAgICAgRmlsZS5yZW5hbWUgc3JjLCBkZXN0Ci0gICAgcmVzY3VlCi0gICAgICBGaWxlLm9wZW4oZGVzdCwgJ3diJykge3xmfAotICAgICAgICBmLndyaXRlIEZpbGUuYmlucmVhZChzcmMpCi0gICAgICB9Ci0gICAgICBGaWxlLmNobW9kIEZpbGUuc3RhdChzcmMpLm1vZGUsIGRlc3QKLSAgICAgIEZpbGUudW5saW5rIHNyYwotICAgIGVuZAotICBlbmQKLQotICBkZWYgZm9yY2VfcmVtb3ZlX2ZpbGUocGF0aCkKLSAgICBiZWdpbgotICAgICAgcmVtb3ZlX2ZpbGUgcGF0aAotICAgIHJlc2N1ZQotICAgIGVuZAotICBlbmQKLQotICBkZWYgcmVtb3ZlX2ZpbGUocGF0aCkKLSAgICBGaWxlLmNobW9kIDA3NzcsIHBhdGgKLSAgICBGaWxlLnVubGluayBwYXRoCi0gIGVuZAotCi0gIGRlZiBpbnN0YWxsKGZyb20sIGRlc3QsIG1vZGUsIHByZWZpeCA9IG5pbCkKLSAgICAkc3RkZXJyLnB1dHMgImluc3RhbGwgI3tmcm9tfSAje2Rlc3R9IiBpZiB2ZXJib3NlPwotICAgIHJldHVybiBpZiBub19oYXJtPwotCi0gICAgcmVhbGRlc3QgPSBwcmVmaXggPyBwcmVmaXggKyBGaWxlLmV4cGFuZF9wYXRoKGRlc3QpIDogZGVzdAotICAgIHJlYWxkZXN0ID0gRmlsZS5qb2luKHJlYWxkZXN0LCBGaWxlLmJhc2VuYW1lKGZyb20pKSBpZiBGaWxlLmRpcj8ocmVhbGRlc3QpCi0gICAgc3RyID0gRmlsZS5iaW5yZWFkKGZyb20pCi0gICAgaWYgZGlmZj8oc3RyLCByZWFsZGVzdCkKLSAgICAgIHZlcmJvc2Vfb2ZmIHsKLSAgICAgICAgcm1fZiByZWFsZGVzdCBpZiBGaWxlLmV4aXN0PyhyZWFsZGVzdCkKLSAgICAgIH0KLSAgICAgIEZpbGUub3BlbihyZWFsZGVzdCwgJ3diJykge3xmfAotICAgICAgICBmLndyaXRlIHN0cgotICAgICAgfQotICAgICAgRmlsZS5jaG1vZCBtb2RlLCByZWFsZGVzdAotCi0gICAgICBGaWxlLm9wZW4oIiN7b2JqZGlyX3Jvb3QoKX0vSW5zdGFsbGVkRmlsZXMiLCAnYScpIHt8ZnwKLSAgICAgICAgaWYgcHJlZml4Ci0gICAgICAgICAgZi5wdXRzIHJlYWxkZXN0LnN1YihwcmVmaXgsICcnKQotICAgICAgICBlbHNlCi0gICAgICAgICAgZi5wdXRzIHJlYWxkZXN0Ci0gICAgICAgIGVuZAotICAgICAgfQotICAgIGVuZAotICBlbmQKLQotICBkZWYgZGlmZj8obmV3X2NvbnRlbnQsIHBhdGgpCi0gICAgcmV0dXJuIHRydWUgdW5sZXNzIEZpbGUuZXhpc3Q/KHBhdGgpCi0gICAgbmV3X2NvbnRlbnQgIT0gRmlsZS5iaW5yZWFkKHBhdGgpCi0gIGVuZAotCi0gIGRlZiBjb21tYW5kKCphcmdzKQotICAgICRzdGRlcnIucHV0cyBhcmdzLmpvaW4oJyAnKSBpZiB2ZXJib3NlPwotICAgIHN5c3RlbSgqYXJncykgb3IgcmFpc2UgUnVudGltZUVycm9yLAotICAgICAgICAic3lzdGVtKCN7YXJncy5tYXB7fGF8IGEuaW5zcGVjdCB9LmpvaW4oJyAnKX0pIGZhaWxlZCIKLSAgZW5kCi0KLSAgZGVmIHJ1YnkoKmFyZ3MpCi0gICAgY29tbWFuZCBjb25maWcoJ3J1Ynlwcm9nJyksICphcmdzCi0gIGVuZAotCi0gIGRlZiBtYWtlKHRhc2sgPSBuaWwpCi0gICAgY29tbWFuZCgqW2NvbmZpZygnbWFrZXByb2cnKSwgdGFza10uY29tcGFjdCkKLSAgZW5kCi0KLSAgZGVmIGV4dGRpcj8oZGlyKQotICAgIEZpbGUuZXhpc3Q/KCIje2Rpcn0vTUFOSUZFU1QiKSBvciBGaWxlLmV4aXN0PygiI3tkaXJ9L2V4dGNvbmYucmIiKQotICBlbmQKLQotICBkZWYgZmlsZXNfb2YoZGlyKQotICAgIERpci5vcGVuKGRpcikge3xkfAotICAgICAgcmV0dXJuIGQuc2VsZWN0IHt8ZW50fCBGaWxlLmZpbGU/KCIje2Rpcn0vI3tlbnR9IikgfQotICAgIH0KLSAgZW5kCi0KLSAgRElSX1JFSkVDVCA9ICV3KCAuIC4uIENWUyBTQ0NTIFJDUyBDVlMuYWRtIC5zdm4gKQotCi0gIGRlZiBkaXJlY3Rvcmllc19vZihkaXIpCi0gICAgRGlyLm9wZW4oZGlyKSB7fGR8Ci0gICAgICByZXR1cm4gZC5zZWxlY3Qge3xlbnR8IEZpbGUuZGlyPygiI3tkaXJ9LyN7ZW50fSIpIH0gLSBESVJfUkVKRUNUCi0gICAgfQotICBlbmQKLQotZW5kCi0KLQotIyBUaGlzIG1vZHVsZSByZXF1aXJlczogI3NyY2Rpcl9yb290LCAjb2JqZGlyX3Jvb3QsICNyZWxwYXRoCi1tb2R1bGUgSG9va1NjcmlwdEFQSQotCi0gIGRlZiBnZXRfY29uZmlnKGtleSkKLSAgICBAY29uZmlnW2tleV0KLSAgZW5kCi0KLSAgYWxpYXMgY29uZmlnIGdldF9jb25maWcKLQotICAjIG9ic29sZXRlOiB1c2UgbWV0YWNvbmZpZyB0byBjaGFuZ2UgY29uZmlndXJhdGlvbgotICBkZWYgc2V0X2NvbmZpZyhrZXksIHZhbCkKLSAgICBAY29uZmlnW2tleV0gPSB2YWwKLSAgZW5kCi0KLSAgIwotICAjIHNyY2Rpci9vYmpkaXIgKHdvcmtzIG9ubHkgaW4gdGhlIHBhY2thZ2UgZGlyZWN0b3J5KQotICAjCi0KLSAgZGVmIGN1cnJfc3JjZGlyCi0gICAgIiN7c3JjZGlyX3Jvb3QoKX0vI3tyZWxwYXRoKCl9IgotICBlbmQKLQotICBkZWYgY3Vycl9vYmpkaXIKLSAgICAiI3tvYmpkaXJfcm9vdCgpfS8je3JlbHBhdGgoKX0iCi0gIGVuZAotCi0gIGRlZiBzcmNmaWxlKHBhdGgpCi0gICAgIiN7Y3Vycl9zcmNkaXIoKX0vI3twYXRofSIKLSAgZW5kCi0KLSAgZGVmIHNyY2V4aXN0PyhwYXRoKQotICAgIEZpbGUuZXhpc3Q/KHNyY2ZpbGUocGF0aCkpCi0gIGVuZAotCi0gIGRlZiBzcmNkaXJlY3Rvcnk/KHBhdGgpCi0gICAgRmlsZS5kaXI/KHNyY2ZpbGUocGF0aCkpCi0gIGVuZAotCi0gIGRlZiBzcmNmaWxlPyhwYXRoKQotICAgIEZpbGUuZmlsZT8oc3JjZmlsZShwYXRoKSkKLSAgZW5kCi0KLSAgZGVmIHNyY2VudHJpZXMocGF0aCA9ICcuJykKLSAgICBEaXIub3BlbigiI3tjdXJyX3NyY2RpcigpfS8je3BhdGh9Iikge3xkfAotICAgICAgcmV0dXJuIGQudG9fYSAtICV3KC4gLi4pCi0gICAgfQotICBlbmQKLQotICBkZWYgc3JjZmlsZXMocGF0aCA9ICcuJykKLSAgICBzcmNlbnRyaWVzKHBhdGgpLnNlbGVjdCB7fGZuYW1lfAotICAgICAgRmlsZS5maWxlPyhGaWxlLmpvaW4oY3Vycl9zcmNkaXIoKSwgcGF0aCwgZm5hbWUpKQotICAgIH0KLSAgZW5kCi0KLSAgZGVmIHNyY2RpcmVjdG9yaWVzKHBhdGggPSAnLicpCi0gICAgc3JjZW50cmllcyhwYXRoKS5zZWxlY3Qge3xmbmFtZXwKLSAgICAgIEZpbGUuZGlyPyhGaWxlLmpvaW4oY3Vycl9zcmNkaXIoKSwgcGF0aCwgZm5hbWUpKQotICAgIH0KLSAgZW5kCi0KLWVuZAotCi0KLWNsYXNzIFRvcGxldmVsSW5zdGFsbGVyCi0KLSAgVmVyc2lvbiAgID0gJzMuNC4xJwotICBDb3B5cmlnaHQgPSAnQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgTWluZXJvIEFva2knCi0KLSAgVEFTS1MgPSBbCi0gICAgWyAnYWxsJywgICAgICAnZG8gY29uZmlnLCBzZXR1cCwgdGhlbiBpbnN0YWxsJyBdLAotICAgIFsgJ2NvbmZpZycsICAgJ3NhdmVzIHlvdXIgY29uZmlndXJhdGlvbnMnIF0sCi0gICAgWyAnc2hvdycsICAgICAnc2hvd3MgY3VycmVudCBjb25maWd1cmF0aW9uJyBdLAotICAgIFsgJ3NldHVwJywgICAgJ2NvbXBpbGVzIHJ1YnkgZXh0ZW50aW9ucyBhbmQgb3RoZXJzJyBdLAotICAgIFsgJ2luc3RhbGwnLCAgJ2luc3RhbGxzIGZpbGVzJyBdLAotICAgIFsgJ3Rlc3QnLCAgICAgJ3J1biBhbGwgdGVzdHMgaW4gdGVzdC8nIF0sCi0gICAgWyAnY2xlYW4nLCAgICAiZG9lcyBgbWFrZSBjbGVhbicgZm9yIGVhY2ggZXh0ZW50aW9uIiBdLAotICAgIFsgJ2Rpc3RjbGVhbicsImRvZXMgYG1ha2UgZGlzdGNsZWFuJyBmb3IgZWFjaCBleHRlbnRpb24iIF0KLSAgXQotCi0gIGRlZiBUb3BsZXZlbEluc3RhbGxlci5pbnZva2UKLSAgICBjb25maWcgPSBDb25maWdUYWJsZS5uZXcobG9hZF9yYmNvbmZpZygpKQotICAgIGNvbmZpZy5sb2FkX3N0YW5kYXJkX2VudHJpZXMKLSAgICBjb25maWcubG9hZF9tdWx0aXBhY2thZ2VfZW50cmllcyBpZiBtdWx0aXBhY2thZ2U/Ci0gICAgY29uZmlnLmZpeHVwCi0gICAga2xhc3MgPSAobXVsdGlwYWNrYWdlPygpID8gVG9wbGV2ZWxJbnN0YWxsZXJNdWx0aSA6IFRvcGxldmVsSW5zdGFsbGVyKQotICAgIGtsYXNzLm5ldyhGaWxlLmRpcm5hbWUoJDApLCBjb25maWcpLmludm9rZQotICBlbmQKLQotICBkZWYgVG9wbGV2ZWxJbnN0YWxsZXIubXVsdGlwYWNrYWdlPwotICAgIEZpbGUuZGlyPyhGaWxlLmRpcm5hbWUoJDApICsgJy9wYWNrYWdlcycpCi0gIGVuZAotCi0gIGRlZiBUb3BsZXZlbEluc3RhbGxlci5sb2FkX3JiY29uZmlnCi0gICAgaWYgYXJnID0gQVJHVi5kZXRlY3Qge3xhcmd8IC9cQS0tcmJjb25maWc9LyA9fiBhcmcgfQotICAgICAgQVJHVi5kZWxldGUoYXJnKQotICAgICAgbG9hZCBGaWxlLmV4cGFuZF9wYXRoKGFyZy5zcGxpdCgvPS8sIDIpWzFdKQotICAgICAgJCIucHVzaCAncmJjb25maWcucmInCi0gICAgZWxzZQotICAgICAgcmVxdWlyZSAncmJjb25maWcnCi0gICAgZW5kCi0gICAgOjpDb25maWc6OkNPTkZJRwotICBlbmQKLQotICBkZWYgaW5pdGlhbGl6ZShhcmRpcl9yb290LCBjb25maWcpCi0gICAgQGFyZGlyID0gRmlsZS5leHBhbmRfcGF0aChhcmRpcl9yb290KQotICAgIEBjb25maWcgPSBjb25maWcKLSAgICAjIGNhY2hlCi0gICAgQHZhbGlkX3Rhc2tfcmUgPSBuaWwKLSAgZW5kCi0KLSAgZGVmIGNvbmZpZyhrZXkpCi0gICAgQGNvbmZpZ1trZXldCi0gIGVuZAotCi0gIGRlZiBpbnNwZWN0Ci0gICAgIiM8I3tzZWxmLmNsYXNzfSAje19faWRfXygpfT4iCi0gIGVuZAotCi0gIGRlZiBpbnZva2UKLSAgICBydW5fbWV0YWNvbmZpZ3MKLSAgICBjYXNlIHRhc2sgPSBwYXJzZWFyZ19nbG9iYWwoKQotICAgIHdoZW4gbmlsLCAnYWxsJwotICAgICAgcGFyc2VhcmdfY29uZmlnCi0gICAgICBpbml0X2luc3RhbGxlcnMKLSAgICAgIGV4ZWNfY29uZmlnCi0gICAgICBleGVjX3NldHVwCi0gICAgICBleGVjX2luc3RhbGwKLSAgICBlbHNlCi0gICAgICBjYXNlIHRhc2sKLSAgICAgIHdoZW4gJ2NvbmZpZycsICd0ZXN0JwotICAgICAgICA7Ci0gICAgICB3aGVuICdjbGVhbicsICdkaXN0Y2xlYW4nCi0gICAgICAgIEBjb25maWcubG9hZF9zYXZlZmlsZSBpZiBGaWxlLmV4aXN0PyhAY29uZmlnLnNhdmVmaWxlKQotICAgICAgZWxzZQotICAgICAgICBAY29uZmlnLmxvYWRfc2F2ZWZpbGUKLSAgICAgIGVuZAotICAgICAgX19zZW5kX18gInBhcnNlYXJnXyN7dGFza30iCi0gICAgICBpbml0X2luc3RhbGxlcnMKLSAgICAgIF9fc2VuZF9fICJleGVjXyN7dGFza30iCi0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiBydW5fbWV0YWNvbmZpZ3MKLSAgICBAY29uZmlnLmxvYWRfc2NyaXB0ICIje0BhcmRpcn0vbWV0YWNvbmZpZyIKLSAgZW5kCi0KLSAgZGVmIGluaXRfaW5zdGFsbGVycwotICAgIEBpbnN0YWxsZXIgPSBJbnN0YWxsZXIubmV3KEBjb25maWcsIEBhcmRpciwgRmlsZS5leHBhbmRfcGF0aCgnLicpKQotICBlbmQKLQotICAjCi0gICMgSG9vayBTY3JpcHQgQVBJIGJhc2VzCi0gICMKLQotICBkZWYgc3JjZGlyX3Jvb3QKLSAgICBAYXJkaXIKLSAgZW5kCi0KLSAgZGVmIG9iamRpcl9yb290Ci0gICAgJy4nCi0gIGVuZAotCi0gIGRlZiByZWxwYXRoCi0gICAgJy4nCi0gIGVuZAotCi0gICMKLSAgIyBPcHRpb24gUGFyc2luZwotICAjCi0KLSAgZGVmIHBhcnNlYXJnX2dsb2JhbAotICAgIHdoaWxlIGFyZyA9IEFSR1Yuc2hpZnQKLSAgICAgIGNhc2UgYXJnCi0gICAgICB3aGVuIC9cQVx3K1x6LwotICAgICAgICBzZXR1cF9yYl9lcnJvciAiaW52YWxpZCB0YXNrOiAje2FyZ30iIHVubGVzcyB2YWxpZF90YXNrPyhhcmcpCi0gICAgICAgIHJldHVybiBhcmcKLSAgICAgIHdoZW4gJy1xJywgJy0tcXVpZXQnCi0gICAgICAgIEBjb25maWcudmVyYm9zZSA9IGZhbHNlCi0gICAgICB3aGVuICctLXZlcmJvc2UnCi0gICAgICAgIEBjb25maWcudmVyYm9zZSA9IHRydWUKLSAgICAgIHdoZW4gJy0taGVscCcKLSAgICAgICAgcHJpbnRfdXNhZ2UgJHN0ZG91dAotICAgICAgICBleGl0IDAKLSAgICAgIHdoZW4gJy0tdmVyc2lvbicKLSAgICAgICAgcHV0cyAiI3tGaWxlLmJhc2VuYW1lKCQwKX0gdmVyc2lvbiAje1ZlcnNpb259IgotICAgICAgICBleGl0IDAKLSAgICAgIHdoZW4gJy0tY29weXJpZ2h0JwotICAgICAgICBwdXRzIENvcHlyaWdodAotICAgICAgICBleGl0IDAKLSAgICAgIGVsc2UKLSAgICAgICAgc2V0dXBfcmJfZXJyb3IgInVua25vd24gZ2xvYmFsIG9wdGlvbiAnI3thcmd9JyIKLSAgICAgIGVuZAotICAgIGVuZAotICAgIG5pbAotICBlbmQKLQotICBkZWYgdmFsaWRfdGFzaz8odCkKLSAgICB2YWxpZF90YXNrX3JlKCkgPX4gdAotICBlbmQKLQotICBkZWYgdmFsaWRfdGFza19yZQotICAgIEB2YWxpZF90YXNrX3JlIHx8PSAvXEEoPzoje1RBU0tTLm1hcCB7fHRhc2ssZGVzY3wgdGFzayB9LmpvaW4oJ3wnKX0pXHovCi0gIGVuZAotCi0gIGRlZiBwYXJzZWFyZ19ub19vcHRpb25zCi0gICAgdW5sZXNzIEFSR1YuZW1wdHk/Ci0gICAgICB0YXNrID0gY2FsbGVyKDApLmZpcnN0LnNsaWNlKCVyPGBwYXJzZWFyZ18oXHcrKSc+LCAxKQotICAgICAgc2V0dXBfcmJfZXJyb3IgIiN7dGFza306IHVua25vd24gb3B0aW9uczogI3tBUkdWLmpvaW4oJyAnKX0iCi0gICAgZW5kCi0gIGVuZAotCi0gIGFsaWFzIHBhcnNlYXJnX3Nob3cgICAgICAgcGFyc2Vhcmdfbm9fb3B0aW9ucwotICBhbGlhcyBwYXJzZWFyZ19zZXR1cCAgICAgIHBhcnNlYXJnX25vX29wdGlvbnMKLSAgYWxpYXMgcGFyc2VhcmdfdGVzdCAgICAgICBwYXJzZWFyZ19ub19vcHRpb25zCi0gIGFsaWFzIHBhcnNlYXJnX2NsZWFuICAgICAgcGFyc2Vhcmdfbm9fb3B0aW9ucwotICBhbGlhcyBwYXJzZWFyZ19kaXN0Y2xlYW4gIHBhcnNlYXJnX25vX29wdGlvbnMKLQotICBkZWYgcGFyc2VhcmdfY29uZmlnCi0gICAgZXZhbG9wdCA9IFtdCi0gICAgc2V0ID0gW10KLSAgICBAY29uZmlnLmNvbmZpZ19vcHQgPSBbXQotICAgIHdoaWxlIGkgPSBBUkdWLnNoaWZ0Ci0gICAgICBpZiAvXEEtLT9cei8gPX4gaQotICAgICAgICBAY29uZmlnLmNvbmZpZ19vcHQgPSBBUkdWLmR1cAotICAgICAgICBicmVhawotICAgICAgZW5kCi0gICAgICBuYW1lLCB2YWx1ZSA9ICpAY29uZmlnLnBhcnNlX29wdChpKQotICAgICAgaWYgQGNvbmZpZy52YWx1ZV9jb25maWc/KG5hbWUpCi0gICAgICAgIEBjb25maWdbbmFtZV0gPSB2YWx1ZQotICAgICAgZWxzZQotICAgICAgICBldmFsb3B0LnB1c2ggW25hbWUsIHZhbHVlXQotICAgICAgZW5kCi0gICAgICBzZXQucHVzaCBuYW1lCi0gICAgZW5kCi0gICAgZXZhbG9wdC5lYWNoIGRvIHxuYW1lLCB2YWx1ZXwKLSAgICAgIEBjb25maWcubG9va3VwKG5hbWUpLmV2YWx1YXRlIHZhbHVlLCBAY29uZmlnCi0gICAgZW5kCi0gICAgIyBDaGVjayBpZiBjb25maWd1cmF0aW9uIGlzIHZhbGlkCi0gICAgc2V0LmVhY2ggZG8gfG58Ci0gICAgICBAY29uZmlnW25dIGlmIEBjb25maWcudmFsdWVfY29uZmlnPyhuKQotICAgIGVuZAotICBlbmQKLQotICBkZWYgcGFyc2VhcmdfaW5zdGFsbAotICAgIEBjb25maWcubm9faGFybSA9IGZhbHNlCi0gICAgQGNvbmZpZy5pbnN0YWxsX3ByZWZpeCA9ICcnCi0gICAgd2hpbGUgYSA9IEFSR1Yuc2hpZnQKLSAgICAgIGNhc2UgYQotICAgICAgd2hlbiAnLS1uby1oYXJtJwotICAgICAgICBAY29uZmlnLm5vX2hhcm0gPSB0cnVlCi0gICAgICB3aGVuIC9cQS0tcHJlZml4PS8KLSAgICAgICAgcGF0aCA9IGEuc3BsaXQoLz0vLCAyKVsxXQotICAgICAgICBwYXRoID0gRmlsZS5leHBhbmRfcGF0aChwYXRoKSB1bmxlc3MgcGF0aFswLDFdID09ICcvJwotICAgICAgICBAY29uZmlnLmluc3RhbGxfcHJlZml4ID0gcGF0aAotICAgICAgZWxzZQotICAgICAgICBzZXR1cF9yYl9lcnJvciAiaW5zdGFsbDogdW5rbm93biBvcHRpb24gI3thfSIKLSAgICAgIGVuZAotICAgIGVuZAotICBlbmQKLQotICBkZWYgcHJpbnRfdXNhZ2Uob3V0KQotICAgIG91dC5wdXRzICdUeXBpY2FsIEluc3RhbGxhdGlvbiBQcm9jZWR1cmU6JwotICAgIG91dC5wdXRzICIgICQgcnVieSAje0ZpbGUuYmFzZW5hbWUgJDB9IGNvbmZpZyIKLSAgICBvdXQucHV0cyAiICAkIHJ1YnkgI3tGaWxlLmJhc2VuYW1lICQwfSBzZXR1cCIKLSAgICBvdXQucHV0cyAiICAjIHJ1YnkgI3tGaWxlLmJhc2VuYW1lICQwfSBpbnN0YWxsIChtYXkgcmVxdWlyZSByb290IHByaXZpbGVnZSkiCi0gICAgb3V0LnB1dHMKLSAgICBvdXQucHV0cyAnRGV0YWlsZWQgVXNhZ2U6JwotICAgIG91dC5wdXRzICIgIHJ1YnkgI3tGaWxlLmJhc2VuYW1lICQwfSA8Z2xvYmFsIG9wdGlvbj4iCi0gICAgb3V0LnB1dHMgIiAgcnVieSAje0ZpbGUuYmFzZW5hbWUgJDB9IFs8Z2xvYmFsIG9wdGlvbnM+XSA8dGFzaz4gWzx0YXNrIG9wdGlvbnM+XSIKLQotICAgIGZtdCA9ICIgICUtMjRzICVzXG4iCi0gICAgb3V0LnB1dHMKLSAgICBvdXQucHV0cyAnR2xvYmFsIG9wdGlvbnM6JwotICAgIG91dC5wcmludGYgZm10LCAnLXEsLS1xdWlldCcsICAgJ3N1cHByZXNzIG1lc3NhZ2Ugb3V0cHV0cycKLSAgICBvdXQucHJpbnRmIGZtdCwgJyAgIC0tdmVyYm9zZScsICdvdXRwdXQgbWVzc2FnZXMgdmVyYm9zZWx5JwotICAgIG91dC5wcmludGYgZm10LCAnICAgLS1oZWxwJywgICAgJ3ByaW50IHRoaXMgbWVzc2FnZScKLSAgICBvdXQucHJpbnRmIGZtdCwgJyAgIC0tdmVyc2lvbicsICdwcmludCB2ZXJzaW9uIGFuZCBxdWl0JwotICAgIG91dC5wcmludGYgZm10LCAnICAgLS1jb3B5cmlnaHQnLCAgJ3ByaW50IGNvcHlyaWdodCBhbmQgcXVpdCcKLSAgICBvdXQucHV0cwotICAgIG91dC5wdXRzICdUYXNrczonCi0gICAgVEFTS1MuZWFjaCBkbyB8bmFtZSwgZGVzY3wKLSAgICAgIG91dC5wcmludGYgZm10LCBuYW1lLCBkZXNjCi0gICAgZW5kCi0KLSAgICBmbXQgPSAiICAlLTI0cyAlcyBbJXNdXG4iCi0gICAgb3V0LnB1dHMKLSAgICBvdXQucHV0cyAnT3B0aW9ucyBmb3IgQ09ORklHIG9yIEFMTDonCi0gICAgQGNvbmZpZy5lYWNoIGRvIHxpdGVtfAotICAgICAgb3V0LnByaW50ZiBmbXQsIGl0ZW0uaGVscF9vcHQsIGl0ZW0uZGVzY3JpcHRpb24sIGl0ZW0uaGVscF9kZWZhdWx0Ci0gICAgZW5kCi0gICAgb3V0LnByaW50ZiBmbXQsICctLXJiY29uZmlnPXBhdGgnLCAncmJjb25maWcucmIgdG8gbG9hZCcsInJ1bm5pbmcgcnVieSdzIgotICAgIG91dC5wdXRzCi0gICAgb3V0LnB1dHMgJ09wdGlvbnMgZm9yIElOU1RBTEw6JwotICAgIG91dC5wcmludGYgZm10LCAnLS1uby1oYXJtJywgJ29ubHkgZGlzcGxheSB3aGF0IHRvIGRvIGlmIGdpdmVuJywgJ29mZicKLSAgICBvdXQucHJpbnRmIGZtdCwgJy0tcHJlZml4PXBhdGgnLCAgJ2luc3RhbGwgcGF0aCBwcmVmaXgnLCAnJwotICAgIG91dC5wdXRzCi0gIGVuZAotCi0gICMKLSAgIyBUYXNrIEhhbmRsZXJzCi0gICMKLQotICBkZWYgZXhlY19jb25maWcKLSAgICBAaW5zdGFsbGVyLmV4ZWNfY29uZmlnCi0gICAgQGNvbmZpZy5zYXZlICAgIyBtdXN0IGJlIGZpbmFsCi0gIGVuZAotCi0gIGRlZiBleGVjX3NldHVwCi0gICAgQGluc3RhbGxlci5leGVjX3NldHVwCi0gIGVuZAotCi0gIGRlZiBleGVjX2luc3RhbGwKLSAgICBAaW5zdGFsbGVyLmV4ZWNfaW5zdGFsbAotICBlbmQKLQotICBkZWYgZXhlY190ZXN0Ci0gICAgQGluc3RhbGxlci5leGVjX3Rlc3QKLSAgZW5kCi0KLSAgZGVmIGV4ZWNfc2hvdwotICAgIEBjb25maWcuZWFjaCBkbyB8aXwKLSAgICAgIHByaW50ZiAiJS0yMHMgJXNcbiIsIGkubmFtZSwgaS52YWx1ZSBpZiBpLnZhbHVlPwotICAgIGVuZAotICBlbmQKLQotICBkZWYgZXhlY19jbGVhbgotICAgIEBpbnN0YWxsZXIuZXhlY19jbGVhbgotICBlbmQKLQotICBkZWYgZXhlY19kaXN0Y2xlYW4KLSAgICBAaW5zdGFsbGVyLmV4ZWNfZGlzdGNsZWFuCi0gIGVuZAotCi1lbmQgICAjIGNsYXNzIFRvcGxldmVsSW5zdGFsbGVyCi0KLQotY2xhc3MgVG9wbGV2ZWxJbnN0YWxsZXJNdWx0aSA8IFRvcGxldmVsSW5zdGFsbGVyCi0KLSAgaW5jbHVkZSBGaWxlT3BlcmF0aW9ucwotCi0gIGRlZiBpbml0aWFsaXplKGFyZGlyX3Jvb3QsIGNvbmZpZykKLSAgICBzdXBlcgotICAgIEBwYWNrYWdlcyA9IGRpcmVjdG9yaWVzX29mKCIje0BhcmRpcn0vcGFja2FnZXMiKQotICAgIHJhaXNlICdubyBwYWNrYWdlIGV4aXN0cycgaWYgQHBhY2thZ2VzLmVtcHR5PwotICAgIEByb290X2luc3RhbGxlciA9IEluc3RhbGxlci5uZXcoQGNvbmZpZywgQGFyZGlyLCBGaWxlLmV4cGFuZF9wYXRoKCcuJykpCi0gIGVuZAotCi0gIGRlZiBydW5fbWV0YWNvbmZpZ3MKLSAgICBAY29uZmlnLmxvYWRfc2NyaXB0ICIje0BhcmRpcn0vbWV0YWNvbmZpZyIsIHNlbGYKLSAgICBAcGFja2FnZXMuZWFjaCBkbyB8bmFtZXwKLSAgICAgIEBjb25maWcubG9hZF9zY3JpcHQgIiN7QGFyZGlyfS9wYWNrYWdlcy8je25hbWV9L21ldGFjb25maWciCi0gICAgZW5kCi0gIGVuZAotCi0gIGF0dHJfcmVhZGVyIDpwYWNrYWdlcwotCi0gIGRlZiBwYWNrYWdlcz0obGlzdCkKLSAgICByYWlzZSAncGFja2FnZSBsaXN0IGlzIGVtcHR5JyBpZiBsaXN0LmVtcHR5PwotICAgIGxpc3QuZWFjaCBkbyB8bmFtZXwKLSAgICAgIHJhaXNlICJkaXJlY3RvcnkgcGFja2FnZXMvI3tuYW1lfSBkb2VzIG5vdCBleGlzdCJcCi0gICAgICAgICAgICAgIHVubGVzcyBGaWxlLmRpcj8oIiN7QGFyZGlyfS9wYWNrYWdlcy8je25hbWV9IikKLSAgICBlbmQKLSAgICBAcGFja2FnZXMgPSBsaXN0Ci0gIGVuZAotCi0gIGRlZiBpbml0X2luc3RhbGxlcnMKLSAgICBAaW5zdGFsbGVycyA9IHt9Ci0gICAgQHBhY2thZ2VzLmVhY2ggZG8gfHBhY2t8Ci0gICAgICBAaW5zdGFsbGVyc1twYWNrXSA9IEluc3RhbGxlci5uZXcoQGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIje0BhcmRpcn0vcGFja2FnZXMvI3twYWNrfSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZXMvI3twYWNrfSIpCi0gICAgZW5kCi0gICAgd2l0aCAgICA9IGV4dHJhY3Rfc2VsZWN0aW9uKGNvbmZpZygnd2l0aCcpKQotICAgIHdpdGhvdXQgPSBleHRyYWN0X3NlbGVjdGlvbihjb25maWcoJ3dpdGhvdXQnKSkKLSAgICBAc2VsZWN0ZWQgPSBAaW5zdGFsbGVycy5rZXlzLnNlbGVjdCB7fG5hbWV8Ci0gICAgICAgICAgICAgICAgICAod2l0aC5lbXB0eT8gb3Igd2l0aC5pbmNsdWRlPyhuYW1lKSkgXAotICAgICAgICAgICAgICAgICAgICAgIGFuZCBub3Qgd2l0aG91dC5pbmNsdWRlPyhuYW1lKQotICAgICAgICAgICAgICAgIH0KLSAgZW5kCi0KLSAgZGVmIGV4dHJhY3Rfc2VsZWN0aW9uKGxpc3QpCi0gICAgYSA9IGxpc3Quc3BsaXQoLywvKQotICAgIGEuZWFjaCBkbyB8bmFtZXwKLSAgICAgIHNldHVwX3JiX2Vycm9yICJubyBzdWNoIHBhY2thZ2U6ICN7bmFtZX0iICB1bmxlc3MgQGluc3RhbGxlcnMua2V5PyhuYW1lKQotICAgIGVuZAotICAgIGEKLSAgZW5kCi0KLSAgZGVmIHByaW50X3VzYWdlKGYpCi0gICAgc3VwZXIKLSAgICBmLnB1dHMgJ0lubHVkZWQgcGFja2FnZXM6JwotICAgIGYucHV0cyAnICAnICsgQHBhY2thZ2VzLnNvcnQuam9pbignICcpCi0gICAgZi5wdXRzCi0gIGVuZAotCi0gICMKLSAgIyBUYXNrIEhhbmRsZXJzCi0gICMKLQotICBkZWYgZXhlY19jb25maWcKLSAgICBydW5faG9vayAncHJlLWNvbmZpZycKLSAgICBlYWNoX3NlbGVjdGVkX2luc3RhbGxlcnMge3xpbnN0fCBpbnN0LmV4ZWNfY29uZmlnIH0KLSAgICBydW5faG9vayAncG9zdC1jb25maWcnCi0gICAgQGNvbmZpZy5zYXZlICAgIyBtdXN0IGJlIGZpbmFsCi0gIGVuZAotCi0gIGRlZiBleGVjX3NldHVwCi0gICAgcnVuX2hvb2sgJ3ByZS1zZXR1cCcKLSAgICBlYWNoX3NlbGVjdGVkX2luc3RhbGxlcnMge3xpbnN0fCBpbnN0LmV4ZWNfc2V0dXAgfQotICAgIHJ1bl9ob29rICdwb3N0LXNldHVwJwotICBlbmQKLQotICBkZWYgZXhlY19pbnN0YWxsCi0gICAgcnVuX2hvb2sgJ3ByZS1pbnN0YWxsJwotICAgIGVhY2hfc2VsZWN0ZWRfaW5zdGFsbGVycyB7fGluc3R8IGluc3QuZXhlY19pbnN0YWxsIH0KLSAgICBydW5faG9vayAncG9zdC1pbnN0YWxsJwotICBlbmQKLQotICBkZWYgZXhlY190ZXN0Ci0gICAgcnVuX2hvb2sgJ3ByZS10ZXN0JwotICAgIGVhY2hfc2VsZWN0ZWRfaW5zdGFsbGVycyB7fGluc3R8IGluc3QuZXhlY190ZXN0IH0KLSAgICBydW5faG9vayAncG9zdC10ZXN0JwotICBlbmQKLQotICBkZWYgZXhlY19jbGVhbgotICAgIHJtX2YgQGNvbmZpZy5zYXZlZmlsZQotICAgIHJ1bl9ob29rICdwcmUtY2xlYW4nCi0gICAgZWFjaF9zZWxlY3RlZF9pbnN0YWxsZXJzIHt8aW5zdHwgaW5zdC5leGVjX2NsZWFuIH0KLSAgICBydW5faG9vayAncG9zdC1jbGVhbicKLSAgZW5kCi0KLSAgZGVmIGV4ZWNfZGlzdGNsZWFuCi0gICAgcm1fZiBAY29uZmlnLnNhdmVmaWxlCi0gICAgcnVuX2hvb2sgJ3ByZS1kaXN0Y2xlYW4nCi0gICAgZWFjaF9zZWxlY3RlZF9pbnN0YWxsZXJzIHt8aW5zdHwgaW5zdC5leGVjX2Rpc3RjbGVhbiB9Ci0gICAgcnVuX2hvb2sgJ3Bvc3QtZGlzdGNsZWFuJwotICBlbmQKLQotICAjCi0gICMgbGliCi0gICMKLQotICBkZWYgZWFjaF9zZWxlY3RlZF9pbnN0YWxsZXJzCi0gICAgRGlyLm1rZGlyICdwYWNrYWdlcycgdW5sZXNzIEZpbGUuZGlyPygncGFja2FnZXMnKQotICAgIEBzZWxlY3RlZC5lYWNoIGRvIHxwYWNrfAotICAgICAgJHN0ZGVyci5wdXRzICJQcm9jZXNzaW5nIHRoZSBwYWNrYWdlIGAje3BhY2t9JyAuLi4iIGlmIHZlcmJvc2U/Ci0gICAgICBEaXIubWtkaXIgInBhY2thZ2VzLyN7cGFja30iIHVubGVzcyBGaWxlLmRpcj8oInBhY2thZ2VzLyN7cGFja30iKQotICAgICAgRGlyLmNoZGlyICJwYWNrYWdlcy8je3BhY2t9IgotICAgICAgeWllbGQgQGluc3RhbGxlcnNbcGFja10KLSAgICAgIERpci5jaGRpciAnLi4vLi4nCi0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiBydW5faG9vayhpZCkKLSAgICBAcm9vdF9pbnN0YWxsZXIucnVuX2hvb2sgaWQKLSAgZW5kCi0KLSAgIyBtb2R1bGUgRmlsZU9wZXJhdGlvbnMgcmVxdWlyZXMgdGhpcwotICBkZWYgdmVyYm9zZT8KLSAgICBAY29uZmlnLnZlcmJvc2U/Ci0gIGVuZAotCi0gICMgbW9kdWxlIEZpbGVPcGVyYXRpb25zIHJlcXVpcmVzIHRoaXMKLSAgZGVmIG5vX2hhcm0/Ci0gICAgQGNvbmZpZy5ub19oYXJtPwotICBlbmQKLQotZW5kICAgIyBjbGFzcyBUb3BsZXZlbEluc3RhbGxlck11bHRpCi0KLQotY2xhc3MgSW5zdGFsbGVyCi0KLSAgRklMRVRZUEVTID0gJXcoIGJpbiBsaWIgZXh0IGRhdGEgY29uZiBtYW4gKQotCi0gIGluY2x1ZGUgRmlsZU9wZXJhdGlvbnMKLSAgaW5jbHVkZSBIb29rU2NyaXB0QVBJCi0KLSAgZGVmIGluaXRpYWxpemUoY29uZmlnLCBzcmNyb290LCBvYmpyb290KQotICAgIEBjb25maWcgPSBjb25maWcKLSAgICBAc3JjZGlyID0gRmlsZS5leHBhbmRfcGF0aChzcmNyb290KQotICAgIEBvYmpkaXIgPSBGaWxlLmV4cGFuZF9wYXRoKG9ianJvb3QpCi0gICAgQGN1cnJkaXIgPSAnLicKLSAgZW5kCi0KLSAgZGVmIGluc3BlY3QKLSAgICAiIzwje3NlbGYuY2xhc3N9ICN7RmlsZS5iYXNlbmFtZShAc3JjZGlyKX0+IgotICBlbmQKLQotICBkZWYgbm9vcChyZWwpCi0gIGVuZAotCi0gICMKLSAgIyBIb29rIFNjcmlwdCBBUEkgYmFzZSBtZXRob2RzCi0gICMKLQotICBkZWYgc3JjZGlyX3Jvb3QKLSAgICBAc3JjZGlyCi0gIGVuZAotCi0gIGRlZiBvYmpkaXJfcm9vdAotICAgIEBvYmpkaXIKLSAgZW5kCi0KLSAgZGVmIHJlbHBhdGgKLSAgICBAY3VycmRpcgotICBlbmQKLQotICAjCi0gICMgQ29uZmlnIEFjY2VzcwotICAjCi0KLSAgIyBtb2R1bGUgRmlsZU9wZXJhdGlvbnMgcmVxdWlyZXMgdGhpcwotICBkZWYgdmVyYm9zZT8KLSAgICBAY29uZmlnLnZlcmJvc2U/Ci0gIGVuZAotCi0gICMgbW9kdWxlIEZpbGVPcGVyYXRpb25zIHJlcXVpcmVzIHRoaXMKLSAgZGVmIG5vX2hhcm0/Ci0gICAgQGNvbmZpZy5ub19oYXJtPwotICBlbmQKLQotICBkZWYgdmVyYm9zZV9vZmYKLSAgICBiZWdpbgotICAgICAgc2F2ZSwgQGNvbmZpZy52ZXJib3NlID0gQGNvbmZpZy52ZXJib3NlPywgZmFsc2UKLSAgICAgIHlpZWxkCi0gICAgZW5zdXJlCi0gICAgICBAY29uZmlnLnZlcmJvc2UgPSBzYXZlCi0gICAgZW5kCi0gIGVuZAotCi0gICMKLSAgIyBUQVNLIGNvbmZpZwotICAjCi0KLSAgZGVmIGV4ZWNfY29uZmlnCi0gICAgZXhlY190YXNrX3RyYXZlcnNlICdjb25maWcnCi0gIGVuZAotCi0gIGFsaWFzIGNvbmZpZ19kaXJfYmluIG5vb3AKLSAgYWxpYXMgY29uZmlnX2Rpcl9saWIgbm9vcAotCi0gIGRlZiBjb25maWdfZGlyX2V4dChyZWwpCi0gICAgZXh0Y29uZiBpZiBleHRkaXI/KGN1cnJfc3JjZGlyKCkpCi0gIGVuZAotCi0gIGFsaWFzIGNvbmZpZ19kaXJfZGF0YSBub29wCi0gIGFsaWFzIGNvbmZpZ19kaXJfY29uZiBub29wCi0gIGFsaWFzIGNvbmZpZ19kaXJfbWFuIG5vb3AKLQotICBkZWYgZXh0Y29uZgotICAgIHJ1YnkgIiN7Y3Vycl9zcmNkaXIoKX0vZXh0Y29uZi5yYiIsICpAY29uZmlnLmNvbmZpZ19vcHQKLSAgZW5kCi0KLSAgIwotICAjIFRBU0sgc2V0dXAKLSAgIwotCi0gIGRlZiBleGVjX3NldHVwCi0gICAgZXhlY190YXNrX3RyYXZlcnNlICdzZXR1cCcKLSAgZW5kCi0KLSAgZGVmIHNldHVwX2Rpcl9iaW4ocmVsKQotICAgIGZpbGVzX29mKGN1cnJfc3JjZGlyKCkpLmVhY2ggZG8gfGZuYW1lfAotICAgICAgdXBkYXRlX3NoZWJhbmdfbGluZSAiI3tjdXJyX3NyY2RpcigpfS8je2ZuYW1lfSIKLSAgICBlbmQKLSAgZW5kCi0KLSAgYWxpYXMgc2V0dXBfZGlyX2xpYiBub29wCi0KLSAgZGVmIHNldHVwX2Rpcl9leHQocmVsKQotICAgIG1ha2UgaWYgZXh0ZGlyPyhjdXJyX3NyY2RpcigpKQotICBlbmQKLQotICBhbGlhcyBzZXR1cF9kaXJfZGF0YSBub29wCi0gIGFsaWFzIHNldHVwX2Rpcl9jb25mIG5vb3AKLSAgYWxpYXMgc2V0dXBfZGlyX21hbiBub29wCi0KLSAgZGVmIHVwZGF0ZV9zaGViYW5nX2xpbmUocGF0aCkKLSAgICByZXR1cm4gaWYgbm9faGFybT8KLSAgICByZXR1cm4gaWYgY29uZmlnKCdzaGViYW5nJykgPT0gJ25ldmVyJwotICAgIG9sZCA9IFNoZWJhbmcubG9hZChwYXRoKQotICAgIGlmIG9sZAotICAgICAgJHN0ZGVyci5wdXRzICJ3YXJuaW5nOiAje3BhdGh9OiBTaGViYW5nIGxpbmUgaW5jbHVkZXMgdG9vIG1hbnkgYXJncy4gIEl0IGlzIG5vdCBwb3J0YWJsZSBhbmQgeW91ciBwcm9ncmFtIG1heSBub3Qgd29yay4iIGlmIG9sZC5hcmdzLnNpemUgPiAxCi0gICAgICBuZXcgPSBuZXdfc2hlYmFuZyhvbGQpCi0gICAgICByZXR1cm4gaWYgbmV3LnRvX3MgPT0gb2xkLnRvX3MKLSAgICBlbHNlCi0gICAgICByZXR1cm4gdW5sZXNzIGNvbmZpZygnc2hlYmFuZycpID09ICdhbGwnCi0gICAgICBuZXcgPSBTaGViYW5nLm5ldyhjb25maWcoJ3J1YnlwYXRoJykpCi0gICAgZW5kCi0gICAgJHN0ZGVyci5wdXRzICJ1cGRhdGluZyBzaGViYW5nOiAje0ZpbGUuYmFzZW5hbWUocGF0aCl9IiBpZiB2ZXJib3NlPwotICAgIG9wZW5fYXRvbWljX3dyaXRlcihwYXRoKSB7fG91dHB1dHwKLSAgICAgIEZpbGUub3BlbihwYXRoLCAncmInKSB7fGZ8Ci0gICAgICAgIGYuZ2V0cyBpZiBvbGQgICAjIGRpc2NhcmQKLSAgICAgICAgb3V0cHV0LnB1dHMgbmV3LnRvX3MKLSAgICAgICAgb3V0cHV0LnByaW50IGYucmVhZAotICAgICAgfQotICAgIH0KLSAgZW5kCi0KLSAgZGVmIG5ld19zaGViYW5nKG9sZCkKLSAgICBpZiAvXEFydWJ5LyA9fiBGaWxlLmJhc2VuYW1lKG9sZC5jbWQpCi0gICAgICBTaGViYW5nLm5ldyhjb25maWcoJ3J1YnlwYXRoJyksIG9sZC5hcmdzKQotICAgIGVsc2lmIEZpbGUuYmFzZW5hbWUob2xkLmNtZCkgPT0gJ2VudicgYW5kIG9sZC5hcmdzLmZpcnN0ID09ICdydWJ5JwotICAgICAgU2hlYmFuZy5uZXcoY29uZmlnKCdydWJ5cGF0aCcpLCBvbGQuYXJnc1sxLi4tMV0pCi0gICAgZWxzZQotICAgICAgcmV0dXJuIG9sZCB1bmxlc3MgY29uZmlnKCdzaGViYW5nJykgPT0gJ2FsbCcKLSAgICAgIFNoZWJhbmcubmV3KGNvbmZpZygncnVieXBhdGgnKSkKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIG9wZW5fYXRvbWljX3dyaXRlcihwYXRoLCAmYmxvY2spCi0gICAgdG1wZmlsZSA9IEZpbGUuYmFzZW5hbWUocGF0aCkgKyAnLnRtcCcKLSAgICBiZWdpbgotICAgICAgRmlsZS5vcGVuKHRtcGZpbGUsICd3YicsICZibG9jaykKLSAgICAgIEZpbGUucmVuYW1lIHRtcGZpbGUsIEZpbGUuYmFzZW5hbWUocGF0aCkKLSAgICBlbnN1cmUKLSAgICAgIEZpbGUudW5saW5rIHRtcGZpbGUgaWYgRmlsZS5leGlzdD8odG1wZmlsZSkKLSAgICBlbmQKLSAgZW5kCi0KLSAgY2xhc3MgU2hlYmFuZwotICAgIGRlZiBTaGViYW5nLmxvYWQocGF0aCkKLSAgICAgIGxpbmUgPSBuaWwKLSAgICAgIEZpbGUub3BlbihwYXRoKSB7fGZ8Ci0gICAgICAgIGxpbmUgPSBmLmdldHMKLSAgICAgIH0KLSAgICAgIHJldHVybiBuaWwgdW5sZXNzIC9cQSMhLyA9fiBsaW5lCi0gICAgICBwYXJzZShsaW5lKQotICAgIGVuZAotCi0gICAgZGVmIFNoZWJhbmcucGFyc2UobGluZSkKLSAgICAgIGNtZCwgKmFyZ3MgPSAqbGluZS5zdHJpcC5zdWIoL1xBXCMhLywgJycpLnNwbGl0KCcgJykKLSAgICAgIG5ldyhjbWQsIGFyZ3MpCi0gICAgZW5kCi0KLSAgICBkZWYgaW5pdGlhbGl6ZShjbWQsIGFyZ3MgPSBbXSkKLSAgICAgIEBjbWQgPSBjbWQKLSAgICAgIEBhcmdzID0gYXJncwotICAgIGVuZAotCi0gICAgYXR0cl9yZWFkZXIgOmNtZAotICAgIGF0dHJfcmVhZGVyIDphcmdzCi0KLSAgICBkZWYgdG9fcwotICAgICAgIiMhICN7QGNtZH0iICsgKEBhcmdzLmVtcHR5PyA/ICcnIDogIiAje0BhcmdzLmpvaW4oJyAnKX0iKQotICAgIGVuZAotICBlbmQKLQotICAjCi0gICMgVEFTSyBpbnN0YWxsCi0gICMKLQotICBkZWYgZXhlY19pbnN0YWxsCi0gICAgcm1fZiAnSW5zdGFsbGVkRmlsZXMnCi0gICAgZXhlY190YXNrX3RyYXZlcnNlICdpbnN0YWxsJwotICBlbmQKLQotICBkZWYgaW5zdGFsbF9kaXJfYmluKHJlbCkKLSAgICBpbnN0YWxsX2ZpbGVzIHRhcmdldGZpbGVzKCksICIje2NvbmZpZygnYmluZGlyJyl9LyN7cmVsfSIsIDA3NTUKLSAgZW5kCi0KLSAgZGVmIGluc3RhbGxfZGlyX2xpYihyZWwpCi0gICAgaW5zdGFsbF9maWxlcyBsaWJmaWxlcygpLCAiI3tjb25maWcoJ3JiZGlyJyl9LyN7cmVsfSIsIDA2NDQKLSAgZW5kCi0KLSAgZGVmIGluc3RhbGxfZGlyX2V4dChyZWwpCi0gICAgcmV0dXJuIHVubGVzcyBleHRkaXI/KGN1cnJfc3JjZGlyKCkpCi0gICAgaW5zdGFsbF9maWxlcyBydWJ5ZXh0ZW50aW9ucygnLicpLAotICAgICAgICAgICAgICAgICAgIiN7Y29uZmlnKCdzb2RpcicpfS8je0ZpbGUuZGlybmFtZShyZWwpfSIsCi0gICAgICAgICAgICAgICAgICAwNTU1Ci0gIGVuZAotCi0gIGRlZiBpbnN0YWxsX2Rpcl9kYXRhKHJlbCkKLSAgICBpbnN0YWxsX2ZpbGVzIHRhcmdldGZpbGVzKCksICIje2NvbmZpZygnZGF0YWRpcicpfS8je3JlbH0iLCAwNjQ0Ci0gIGVuZAotCi0gIGRlZiBpbnN0YWxsX2Rpcl9jb25mKHJlbCkKLSAgICAjIEZJWE1FOiBzaG91bGQgbm90IHJlbW92ZSBjdXJyZW50IGNvbmZpZyBmaWxlcwotICAgICMgKHJlbmFtZSBwcmV2aW91cyBmaWxlIHRvIC5vbGQvLm9yZykKLSAgICBpbnN0YWxsX2ZpbGVzIHRhcmdldGZpbGVzKCksICIje2NvbmZpZygnc3lzY29uZmRpcicpfS8je3JlbH0iLCAwNjQ0Ci0gIGVuZAotCi0gIGRlZiBpbnN0YWxsX2Rpcl9tYW4ocmVsKQotICAgIGluc3RhbGxfZmlsZXMgdGFyZ2V0ZmlsZXMoKSwgIiN7Y29uZmlnKCdtYW5kaXInKX0vI3tyZWx9IiwgMDY0NAotICBlbmQKLQotICBkZWYgaW5zdGFsbF9maWxlcyhsaXN0LCBkZXN0LCBtb2RlKQotICAgIG1rZGlyX3AgZGVzdCwgQGNvbmZpZy5pbnN0YWxsX3ByZWZpeAotICAgIGxpc3QuZWFjaCBkbyB8Zm5hbWV8Ci0gICAgICBpbnN0YWxsIGZuYW1lLCBkZXN0LCBtb2RlLCBAY29uZmlnLmluc3RhbGxfcHJlZml4Ci0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiBsaWJmaWxlcwotICAgIGdsb2JfcmVqZWN0KCV3KCoueSAqLm91dHB1dCksIHRhcmdldGZpbGVzKCkpCi0gIGVuZAotCi0gIGRlZiBydWJ5ZXh0ZW50aW9ucyhkaXIpCi0gICAgZW50cyA9IGdsb2Jfc2VsZWN0KCIqLiN7QGNvbmZpZy5kbGxleHR9IiwgdGFyZ2V0ZmlsZXMoKSkKLSAgICBpZiBlbnRzLmVtcHR5PwotICAgICAgc2V0dXBfcmJfZXJyb3IgIm5vIHJ1YnkgZXh0ZW50aW9uIGV4aXN0czogJ3J1YnkgI3skMH0gc2V0dXAnIGZpcnN0IgotICAgIGVuZAotICAgIGVudHMKLSAgZW5kCi0KLSAgZGVmIHRhcmdldGZpbGVzCi0gICAgbWFwZGlyKGV4aXN0ZmlsZXMoKSAtIGhvb2tmaWxlcygpKQotICBlbmQKLQotICBkZWYgbWFwZGlyKGVudHMpCi0gICAgZW50cy5tYXAge3xlbnR8Ci0gICAgICBpZiBGaWxlLmV4aXN0PyhlbnQpCi0gICAgICB0aGVuIGVudCAgICAgICAgICAgICAgICAgICAgICAgICAjIG9iamRpcgotICAgICAgZWxzZSAiI3tjdXJyX3NyY2RpcigpfS8je2VudH0iICAgIyBzcmNkaXIKLSAgICAgIGVuZAotICAgIH0KLSAgZW5kCi0KLSAgIyBwaWNrZWQgdXAgbWFueSBlbnRyaWVzIGZyb20gY3ZzLTEuMTEuMS9zcmMvaWdub3JlLmMKLSAgSlVOS19GSUxFUyA9ICV3KAotICAgIGNvcmUgUkNTTE9HIHRhZ3MgVEFHUyAubWFrZS5zdGF0ZQotICAgIC5uc2VfZGVwaW5mbyAjKiAuIyogY3ZzbG9nLiogLCogLmRlbC0qICoub2xiCi0gICAgKn4gKi5vbGQgKi5iYWsgKi5CQUsgKi5vcmlnICoucmVqIF8kKiAqJAotCi0gICAgKi5vcmcgKi5pbiAuKgotICApCi0KLSAgZGVmIGV4aXN0ZmlsZXMKLSAgICBnbG9iX3JlamVjdChKVU5LX0ZJTEVTLCAoZmlsZXNfb2YoY3Vycl9zcmNkaXIoKSkgfCBmaWxlc19vZignLicpKSkKLSAgZW5kCi0KLSAgZGVmIGhvb2tmaWxlcwotICAgICV3KCBwcmUtJXMgcG9zdC0lcyBwcmUtJXMucmIgcG9zdC0lcy5yYiApLm1hcCB7fGZtdHwKLSAgICAgICV3KCBjb25maWcgc2V0dXAgaW5zdGFsbCBjbGVhbiApLm1hcCB7fHR8IHNwcmludGYoZm10LCB0KSB9Ci0gICAgfS5mbGF0dGVuCi0gIGVuZAotCi0gIGRlZiBnbG9iX3NlbGVjdChwYXQsIGVudHMpCi0gICAgcmUgPSBnbG9iczJyZShbcGF0XSkKLSAgICBlbnRzLnNlbGVjdCB7fGVudHwgcmUgPX4gZW50IH0KLSAgZW5kCi0KLSAgZGVmIGdsb2JfcmVqZWN0KHBhdHMsIGVudHMpCi0gICAgcmUgPSBnbG9iczJyZShwYXRzKQotICAgIGVudHMucmVqZWN0IHt8ZW50fCByZSA9fiBlbnQgfQotICBlbmQKLQotICBHTE9CMlJFR0VYID0gewotICAgICcuJyA9PiAnXC4nLAotICAgICckJyA9PiAnXCQnLAotICAgICcjJyA9PiAnXCMnLAotICAgICcqJyA9PiAnLionCi0gIH0KLQotICBkZWYgZ2xvYnMycmUocGF0cykKLSAgICAvXEEoPzojewotICAgICAgcGF0cy5tYXAge3xwYXR8IHBhdC5nc3ViKC9bXC5cJFwjXCpdLykge3xjaHwgR0xPQjJSRUdFWFtjaF0gfSB9LmpvaW4oJ3wnKQotICAgIH0pXHovCi0gIGVuZAotCi0gICMKLSAgIyBUQVNLIHRlc3QKLSAgIwotCi0gIFRFU1RESVIgPSAndGVzdCcKLQotICBkZWYgZXhlY190ZXN0Ci0gICAgdW5sZXNzIEZpbGUuZGlyZWN0b3J5PygndGVzdCcpCi0gICAgICAkc3RkZXJyLnB1dHMgJ25vIHRlc3QgaW4gdGhpcyBwYWNrYWdlJyBpZiB2ZXJib3NlPwotICAgICAgcmV0dXJuCi0gICAgZW5kCi0gICAgJHN0ZGVyci5wdXRzICdSdW5uaW5nIHRlc3RzLi4uJyBpZiB2ZXJib3NlPwotICAgIGJlZ2luCi0gICAgICByZXF1aXJlICd0ZXN0L3VuaXQnCi0gICAgcmVzY3VlIExvYWRFcnJvcgotICAgICAgc2V0dXBfcmJfZXJyb3IgJ3Rlc3QvdW5pdCBjYW5ub3QgbG9hZGVkLiAgWW91IG5lZWQgUnVieSAxLjggb3IgbGF0ZXIgdG8gaW52b2tlIHRoaXMgdGFzay4nCi0gICAgZW5kCi0gICAgcnVubmVyID0gVGVzdDo6VW5pdDo6QXV0b1J1bm5lci5uZXcodHJ1ZSkKLSAgICBydW5uZXIudG9fcnVuIDw8IFRFU1RESVIKLSAgICBydW5uZXIucnVuCi0gIGVuZAotCi0gICMKLSAgIyBUQVNLIGNsZWFuCi0gICMKLQotICBkZWYgZXhlY19jbGVhbgotICAgIGV4ZWNfdGFza190cmF2ZXJzZSAnY2xlYW4nCi0gICAgcm1fZiBAY29uZmlnLnNhdmVmaWxlCi0gICAgcm1fZiAnSW5zdGFsbGVkRmlsZXMnCi0gIGVuZAotCi0gIGFsaWFzIGNsZWFuX2Rpcl9iaW4gbm9vcAotICBhbGlhcyBjbGVhbl9kaXJfbGliIG5vb3AKLSAgYWxpYXMgY2xlYW5fZGlyX2RhdGEgbm9vcAotICBhbGlhcyBjbGVhbl9kaXJfY29uZiBub29wCi0gIGFsaWFzIGNsZWFuX2Rpcl9tYW4gbm9vcAotCi0gIGRlZiBjbGVhbl9kaXJfZXh0KHJlbCkKLSAgICByZXR1cm4gdW5sZXNzIGV4dGRpcj8oY3Vycl9zcmNkaXIoKSkKLSAgICBtYWtlICdjbGVhbicgaWYgRmlsZS5maWxlPygnTWFrZWZpbGUnKQotICBlbmQKLQotICAjCi0gICMgVEFTSyBkaXN0Y2xlYW4KLSAgIwotCi0gIGRlZiBleGVjX2Rpc3RjbGVhbgotICAgIGV4ZWNfdGFza190cmF2ZXJzZSAnZGlzdGNsZWFuJwotICAgIHJtX2YgQGNvbmZpZy5zYXZlZmlsZQotICAgIHJtX2YgJ0luc3RhbGxlZEZpbGVzJwotICBlbmQKLQotICBhbGlhcyBkaXN0Y2xlYW5fZGlyX2JpbiBub29wCi0gIGFsaWFzIGRpc3RjbGVhbl9kaXJfbGliIG5vb3AKLQotICBkZWYgZGlzdGNsZWFuX2Rpcl9leHQocmVsKQotICAgIHJldHVybiB1bmxlc3MgZXh0ZGlyPyhjdXJyX3NyY2RpcigpKQotICAgIG1ha2UgJ2Rpc3RjbGVhbicgaWYgRmlsZS5maWxlPygnTWFrZWZpbGUnKQotICBlbmQKLQotICBhbGlhcyBkaXN0Y2xlYW5fZGlyX2RhdGEgbm9vcAotICBhbGlhcyBkaXN0Y2xlYW5fZGlyX2NvbmYgbm9vcAotICBhbGlhcyBkaXN0Y2xlYW5fZGlyX21hbiBub29wCi0KLSAgIwotICAjIFRyYXZlcnNpbmcKLSAgIwotCi0gIGRlZiBleGVjX3Rhc2tfdHJhdmVyc2UodGFzaykKLSAgICBydW5faG9vayAicHJlLSN7dGFza30iCi0gICAgRklMRVRZUEVTLmVhY2ggZG8gfHR5cGV8Ci0gICAgICBpZiB0eXBlID09ICdleHQnIGFuZCBjb25maWcoJ3dpdGhvdXQtZXh0JykgPT0gJ3llcycKLSAgICAgICAgJHN0ZGVyci5wdXRzICdza2lwcGluZyBleHQvKiBieSB1c2VyIG9wdGlvbicgaWYgdmVyYm9zZT8KLSAgICAgICAgbmV4dAotICAgICAgZW5kCi0gICAgICB0cmF2ZXJzZSB0YXNrLCB0eXBlLCAiI3t0YXNrfV9kaXJfI3t0eXBlfSIKLSAgICBlbmQKLSAgICBydW5faG9vayAicG9zdC0je3Rhc2t9IgotICBlbmQKLQotICBkZWYgdHJhdmVyc2UodGFzaywgcmVsLCBtaWQpCi0gICAgZGl2ZV9pbnRvKHJlbCkgewotICAgICAgcnVuX2hvb2sgInByZS0je3Rhc2t9IgotICAgICAgX19zZW5kX18gbWlkLCByZWwuc3ViKCVyW1xBLio/KD86L3xceildLCAnJykKLSAgICAgIGRpcmVjdG9yaWVzX29mKGN1cnJfc3JjZGlyKCkpLmVhY2ggZG8gfGR8Ci0gICAgICAgIHRyYXZlcnNlIHRhc2ssICIje3JlbH0vI3tkfSIsIG1pZAotICAgICAgZW5kCi0gICAgICBydW5faG9vayAicG9zdC0je3Rhc2t9IgotICAgIH0KLSAgZW5kCi0KLSAgZGVmIGRpdmVfaW50byhyZWwpCi0gICAgcmV0dXJuIHVubGVzcyBGaWxlLmRpcj8oIiN7QHNyY2Rpcn0vI3tyZWx9IikKLQotICAgIGRpciA9IEZpbGUuYmFzZW5hbWUocmVsKQotICAgIERpci5ta2RpciBkaXIgdW5sZXNzIEZpbGUuZGlyPyhkaXIpCi0gICAgcHJldmRpciA9IERpci5wd2QKLSAgICBEaXIuY2hkaXIgZGlyCi0gICAgJHN0ZGVyci5wdXRzICctLS0+ICcgKyByZWwgaWYgdmVyYm9zZT8KLSAgICBAY3VycmRpciA9IHJlbAotICAgIHlpZWxkCi0gICAgRGlyLmNoZGlyIHByZXZkaXIKLSAgICAkc3RkZXJyLnB1dHMgJzwtLS0gJyArIHJlbCBpZiB2ZXJib3NlPwotICAgIEBjdXJyZGlyID0gRmlsZS5kaXJuYW1lKHJlbCkKLSAgZW5kCi0KLSAgZGVmIHJ1bl9ob29rKGlkKQotICAgIHBhdGggPSBbICIje2N1cnJfc3JjZGlyKCl9LyN7aWR9IiwKLSAgICAgICAgICAgICAiI3tjdXJyX3NyY2RpcigpfS8je2lkfS5yYiIgXS5kZXRlY3Qge3xjYW5kfCBGaWxlLmZpbGU/KGNhbmQpIH0KLSAgICByZXR1cm4gdW5sZXNzIHBhdGgKLSAgICBiZWdpbgotICAgICAgaW5zdGFuY2VfZXZhbCBGaWxlLnJlYWQocGF0aCksIHBhdGgsIDEKLSAgICByZXNjdWUKLSAgICAgIHJhaXNlIGlmICRERUJVRwotICAgICAgc2V0dXBfcmJfZXJyb3IgImhvb2sgI3twYXRofSBmYWlsZWQ6XG4iICsgJCEubWVzc2FnZQotICAgIGVuZAotICBlbmQKLQotZW5kICAgIyBjbGFzcyBJbnN0YWxsZXIKLQotCi1jbGFzcyBTZXR1cEVycm9yIDwgU3RhbmRhcmRFcnJvcjsgZW5kCi0KLWRlZiBzZXR1cF9yYl9lcnJvcihtc2cpCi0gIHJhaXNlIFNldHVwRXJyb3IsIG1zZwotZW5kCi0KLWlmICQwID09IF9fRklMRV9fCi0gIGJlZ2luCi0gICAgVG9wbGV2ZWxJbnN0YWxsZXIuaW52b2tlCi0gIHJlc2N1ZSBTZXR1cEVycm9yCi0gICAgcmFpc2UgaWYgJERFQlVHCi0gICAgJHN0ZGVyci5wdXRzICQhLm1lc3NhZ2UKLSAgICAkc3RkZXJyLnB1dHMgIlRyeSAncnVieSAjeyQwfSAtLWhlbHAnIGZvciBkZXRhaWxlZCB1c2FnZS4iCi0gICAgZXhpdCAxCi0gIGVuZAotZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9CYXNlU2VydmljZS50aHJpZnQgYi9saWIvcmIvc3BlYy9CYXNlU2VydmljZS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM3ZDMyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL0Jhc2VTZXJ2aWNlLnRocmlmdApAQCAtMCwwICsxLDI3IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworbmFtZXNwYWNlIHJiIEJhc2UKKworc3RydWN0IEhlbGxvIHsKKyAgMTogc3RyaW5nIGdyZWV0aW5nID0gImhlbGxvIHdvcmxkIgorfQorCitzZXJ2aWNlIEJhc2VTZXJ2aWNlIHsKKyAgSGVsbG8gZ3JlZXRpbmcoMTpib29sIGVuZ2xpc2gpCit9CmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9FeHRlbmRlZFNlcnZpY2UudGhyaWZ0IGIvbGliL3JiL3NwZWMvRXh0ZW5kZWRTZXJ2aWNlLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTZiNzA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL3NwZWMvRXh0ZW5kZWRTZXJ2aWNlLnRocmlmdApAQCAtMCwwICsxLDI1IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworbmFtZXNwYWNlIHJiIEV4dGVuZGVkCisKK2luY2x1ZGUgIkJhc2VTZXJ2aWNlLnRocmlmdCIKKworc2VydmljZSBFeHRlbmRlZFNlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZS5CYXNlU2VydmljZSB7CisgIHZvaWQgcGluZygpCit9CmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9SZWZlcmVuY2VkLnRocmlmdCBiL2xpYi9yYi9zcGVjL1JlZmVyZW5jZWQudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZjE4M2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9SZWZlcmVuY2VkLnRocmlmdApAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCituYW1lc3BhY2UgcmIgT3RoZXJOYW1lc3BhY2UKKworZW51bSBTb21lRW51bSB7CisgIE9ORQorICBUV08KK30KZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL1RocmlmdE5hbWVzcGFjZWRTcGVjLnRocmlmdCBiL2xpYi9yYi9zcGVjL1RocmlmdE5hbWVzcGFjZWRTcGVjLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmYyODg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL3NwZWMvVGhyaWZ0TmFtZXNwYWNlZFNwZWMudGhyaWZ0CkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK25hbWVzcGFjZSByYiBOYW1lc3BhY2VkU3BlY05hbWVzcGFjZQorCitpbmNsdWRlICJSZWZlcmVuY2VkLnRocmlmdCIKKworc3RydWN0IEhlbGxvIHsKKyAgMTogc3RyaW5nIGdyZWV0aW5nID0gImhlbGxvIHdvcmxkIgorfQorCitzZXJ2aWNlIE5hbWVzcGFjZWROb25ibG9ja2luZ1NlcnZpY2UgeworICBIZWxsbyBncmVldGluZygxOmJvb2wgZW5nbGlzaCkKKyAgYm9vbCBibG9jaygpCisgIG9uZXdheSB2b2lkIHVuYmxvY2soMTppMzIgbikKKyAgb25ld2F5IHZvaWQgc2h1dGRvd24oKQorICB2b2lkIHNsZWVwKDE6ZG91YmxlIHNlY29uZHMpCit9CmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9UaHJpZnRTcGVjLnRocmlmdCBiL2xpYi9yYi9zcGVjL1RocmlmdFNwZWMudGhyaWZ0CmluZGV4IGU0ZGVjZTQuLmI0MjQ4MWIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL1RocmlmdFNwZWMudGhyaWZ0CisrKyBiL2xpYi9yYi9zcGVjL1RocmlmdFNwZWMudGhyaWZ0CkBAIC0xMjksNCArMTI5LDU1IEBACiAKIHN0cnVjdCBTdHJ1Y3RXaXRoRW51bU1hcCB7CiAgIDE6IG1hcDxTb21lRW51bSwgbGlzdDxTb21lRW51bT4+IG15X21hcDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CisKKyMgTmVzdGVkIGxpc3RzCitzdHJ1Y3QgTmVzdGVkTGlzdEluTGlzdCB7CisgIDE6IGxpc3Q8bGlzdDxieXRlPj4gdmFsdWUKK30KKworc3RydWN0IE5lc3RlZExpc3RJblNldCB7CisgIDE6IHNldDxsaXN0PGJ5dGU+PiB2YWx1ZQorfQorCitzdHJ1Y3QgTmVzdGVkTGlzdEluTWFwS2V5IHsKKyAgMTogbWFwPGxpc3Q8Ynl0ZT4sIGJ5dGU+IHZhbHVlCit9CisKK3N0cnVjdCBOZXN0ZWRMaXN0SW5NYXBWYWx1ZSB7CisgIDE6IG1hcDxieXRlLCBsaXN0PGJ5dGU+PiB2YWx1ZQorfQorCisjIE5lc3RlZCBzZXRzCitzdHJ1Y3QgTmVzdGVkU2V0SW5MaXN0IHsKKyAgMTogbGlzdDxzZXQ8Ynl0ZT4+IHZhbHVlCit9CisKK3N0cnVjdCBOZXN0ZWRTZXRJblNldCB7CisgIDE6IHNldDxzZXQ8Ynl0ZT4+IHZhbHVlCit9CisKK3N0cnVjdCBOZXN0ZWRTZXRJbk1hcEtleSB7CisgIDE6IG1hcDxzZXQ8Ynl0ZT4sIGJ5dGU+IHZhbHVlCit9CisKK3N0cnVjdCBOZXN0ZWRTZXRJbk1hcFZhbHVlIHsKKyAgMTogbWFwPGJ5dGUsIHNldDxieXRlPj4gdmFsdWUKK30KKworIyBOZXN0ZWQgbWFwcworc3RydWN0IE5lc3RlZE1hcEluTGlzdCB7CisgIDE6IGxpc3Q8bWFwPGJ5dGUsIGJ5dGU+PiB2YWx1ZQorfQorCitzdHJ1Y3QgTmVzdGVkTWFwSW5TZXQgeworICAxOiBzZXQ8bWFwPGJ5dGUsIGJ5dGU+PiB2YWx1ZQorfQorCitzdHJ1Y3QgTmVzdGVkTWFwSW5NYXBLZXkgeworICAyOiBtYXA8bWFwPGJ5dGUsIGJ5dGU+LCBieXRlPiB2YWx1ZQorfQorCitzdHJ1Y3QgTmVzdGVkTWFwSW5NYXBWYWx1ZSB7CisgIDI6IG1hcDxieXRlLCBtYXA8Ynl0ZSwgYnl0ZT4+IHZhbHVlCit9CmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9iYXNlX3Byb3RvY29sX3NwZWMucmIgYi9saWIvcmIvc3BlYy9iYXNlX3Byb3RvY29sX3NwZWMucmIKaW5kZXggZWZiMTZkOC4uZWNhOTM2YiAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvYmFzZV9wcm90b2NvbF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2Jhc2VfcHJvdG9jb2xfc3BlYy5yYgpAQCAtMTcsMTQ0ICsxNywyMTAgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAotY2xhc3MgVGhyaWZ0QmFzZVByb3RvY29sU3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAorZGVzY3JpYmUgJ0Jhc2VQcm90b2NvbCcgZG8KIAogICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgQHRyYW5zID0gbW9jaygiTW9ja1RyYW5zcG9ydCIpCi0gICAgQHByb3QgPSBCYXNlUHJvdG9jb2wubmV3KEB0cmFucykKKyAgICBAdHJhbnMgPSBkb3VibGUoIk1vY2tUcmFuc3BvcnQiKQorICAgIEBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KEB0cmFucykKICAgZW5kCiAKLSAgZGVzY3JpYmUgQmFzZVByb3RvY29sIGRvCisgIGRlc2NyaWJlIFRocmlmdDo6QmFzZVByb3RvY29sIGRvCiAgICAgIyBtb3N0IG9mIHRoZSBtZXRob2RzIGFyZSBzdHVicywgc28gd2UgY2FuIGlnbm9yZSB0aGVtCiAKLSAgICBpdCAic2hvdWxkIG1ha2UgdHJhbnMgYWNjZXNzaWJsZSIgZG8KLSAgICAgIEBwcm90LnRyYW5zLnNob3VsZCBlcWwoQHRyYW5zKQorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigidHJhbnMiKQorICAgICAgZXhwZWN0KEBwcm90LnRvX3MpLnRvIGVxKCJ0cmFucyIpCiAgICAgZW5kCiAKLSAgICBpdCAic2hvdWxkIHdyaXRlIG91dCBhIGZpZWxkIG5pY2VseSIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnZmllbGQnLCAndHlwZScsICdmaWQnKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfdHlwZSkud2l0aCgndHlwZScsICd2YWx1ZScpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLm9yZGVyZWQKKyAgICBpdCAic2hvdWxkIG1ha2UgdHJhbnMgYWNjZXNzaWJsZSIgZG8KKyAgICAgIGV4cGVjdChAcHJvdC50cmFucykudG8gZXFsKEB0cmFucykKKyAgICBlbmQKKworICAgIGl0ICdzaG91bGQgd3JpdGUgb3V0IGEgZmllbGQgbmljZWx5IChkZXByZWNhdGVkIHdyaXRlX2ZpZWxkIHNpZ25hdHVyZSknIGRvCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdmaWVsZCcsICd0eXBlJywgJ2ZpZCcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfdHlwZSkud2l0aCh7Om5hbWUgPT4gJ2ZpZWxkJywgOnR5cGUgPT4gJ3R5cGUnfSwgJ3ZhbHVlJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLm9yZGVyZWQKICAgICAgIEBwcm90LndyaXRlX2ZpZWxkKCdmaWVsZCcsICd0eXBlJywgJ2ZpZCcsICd2YWx1ZScpCiAgICAgZW5kCiAKLSAgICBpdCAic2hvdWxkIHdyaXRlIG91dCB0aGUgZGlmZmVyZW50IHR5cGVzIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2Jvb2wpLndpdGgoJ2Jvb2wnKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfYnl0ZSkud2l0aCgnYnl0ZScpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9kb3VibGUpLndpdGgoJ2RvdWJsZScpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoJ2kxNicpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoJ2kzMicpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pNjQpLndpdGgoJ2k2NCcpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoJ3N0cmluZycpLm9yZGVyZWQKLSAgICAgIHN0cnVjdCA9IG1vY2soJ1N0cnVjdCcpCi0gICAgICBzdHJ1Y3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KS5vcmRlcmVkCi0gICAgICBAcHJvdC53cml0ZV90eXBlKFR5cGVzOjpCT09MLCAnYm9vbCcpCi0gICAgICBAcHJvdC53cml0ZV90eXBlKFR5cGVzOjpCWVRFLCAnYnl0ZScpCi0gICAgICBAcHJvdC53cml0ZV90eXBlKFR5cGVzOjpET1VCTEUsICdkb3VibGUnKQotICAgICAgQHByb3Qud3JpdGVfdHlwZShUeXBlczo6STE2LCAnaTE2JykKLSAgICAgIEBwcm90LndyaXRlX3R5cGUoVHlwZXM6OkkzMiwgJ2kzMicpCi0gICAgICBAcHJvdC53cml0ZV90eXBlKFR5cGVzOjpJNjQsICdpNjQnKQotICAgICAgQHByb3Qud3JpdGVfdHlwZShUeXBlczo6U1RSSU5HLCAnc3RyaW5nJykKLSAgICAgIEBwcm90LndyaXRlX3R5cGUoVHlwZXM6OlNUUlVDVCwgc3RydWN0KQorICAgIGl0ICdzaG91bGQgd3JpdGUgb3V0IGEgZmllbGQgbmljZWx5JyBkbworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnZmllbGQnLCAndHlwZScsICdmaWQnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3R5cGUpLndpdGgoezpuYW1lID0+ICdmaWVsZCcsIDp0eXBlID0+ICd0eXBlJywgOmJpbmFyeSA9PiBmYWxzZX0sICd2YWx1ZScpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5vcmRlcmVkCisgICAgICBAcHJvdC53cml0ZV9maWVsZCh7Om5hbWUgPT4gJ2ZpZWxkJywgOnR5cGUgPT4gJ3R5cGUnLCA6YmluYXJ5ID0+IGZhbHNlfSwgJ2ZpZCcsICd2YWx1ZScpCisgICAgZW5kCisKKyAgICBpdCAnc2hvdWxkIHdyaXRlIG91dCB0aGUgZGlmZmVyZW50IHR5cGVzIChkZXByZWNhdGVkIHdyaXRlX3R5cGUgc2lnbmF0dXJlKScgZG8KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfYm9vbCkud2l0aCgnYm9vbCcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfYnl0ZSkud2l0aCgnYnl0ZScpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZG91YmxlKS53aXRoKCdkb3VibGUnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kxNikud2l0aCgnaTE2Jykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoJ2kzMicpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTY0KS53aXRoKCdpNjQnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnc3RyaW5nJykub3JkZXJlZAorICAgICAgc3RydWN0ID0gZG91YmxlKCdTdHJ1Y3QnKQorICAgICAgZXhwZWN0KHN0cnVjdCkudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoVGhyaWZ0OjpUeXBlczo6Qk9PTCwgJ2Jvb2wnKQorICAgICAgQHByb3Qud3JpdGVfdHlwZShUaHJpZnQ6OlR5cGVzOjpCWVRFLCAnYnl0ZScpCisgICAgICBAcHJvdC53cml0ZV90eXBlKFRocmlmdDo6VHlwZXM6OkRPVUJMRSwgJ2RvdWJsZScpCisgICAgICBAcHJvdC53cml0ZV90eXBlKFRocmlmdDo6VHlwZXM6OkkxNiwgJ2kxNicpCisgICAgICBAcHJvdC53cml0ZV90eXBlKFRocmlmdDo6VHlwZXM6OkkzMiwgJ2kzMicpCisgICAgICBAcHJvdC53cml0ZV90eXBlKFRocmlmdDo6VHlwZXM6Okk2NCwgJ2k2NCcpCisgICAgICBAcHJvdC53cml0ZV90eXBlKFRocmlmdDo6VHlwZXM6OlNUUklORywgJ3N0cmluZycpCisgICAgICBAcHJvdC53cml0ZV90eXBlKFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgc3RydWN0KQogICAgICAgIyBhbGwgb3RoZXIgdHlwZXMgYXJlIG5vdCBpbXBsZW1lbnRlZAotICAgICAgW1R5cGVzOjpTVE9QLCBUeXBlczo6Vk9JRCwgVHlwZXM6Ok1BUCwgVHlwZXM6OlNFVCwgVHlwZXM6OkxJU1RdLmVhY2ggZG8gfHR5cGV8Ci0gICAgICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX3R5cGUodHlwZSwgdHlwZS50b19zKSB9LnNob3VsZCByYWlzZV9lcnJvcihOb3RJbXBsZW1lbnRlZEVycm9yKQorICAgICAgW1RocmlmdDo6VHlwZXM6OlNUT1AsIFRocmlmdDo6VHlwZXM6OlZPSUQsIFRocmlmdDo6VHlwZXM6Ok1BUCwgVGhyaWZ0OjpUeXBlczo6U0VULCBUaHJpZnQ6OlR5cGVzOjpMSVNUXS5lYWNoIGRvIHx0eXBlfAorICAgICAgICBleHBlY3QgeyBAcHJvdC53cml0ZV90eXBlKHR5cGUsIHR5cGUudG9fcykgfS50byByYWlzZV9lcnJvcihOb3RJbXBsZW1lbnRlZEVycm9yKQogICAgICAgZW5kCiAgICAgZW5kCiAKLSAgICBpdCAic2hvdWxkIHJlYWQgdGhlIGRpZmZlcmVudCB0eXBlcyIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2Jvb2wpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2J5dGUpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kxNikub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCi0gICAgICBAcHJvdC5yZWFkX3R5cGUoVHlwZXM6OkJPT0wpCi0gICAgICBAcHJvdC5yZWFkX3R5cGUoVHlwZXM6OkJZVEUpCi0gICAgICBAcHJvdC5yZWFkX3R5cGUoVHlwZXM6OkkxNikKLSAgICAgIEBwcm90LnJlYWRfdHlwZShUeXBlczo6STMyKQotICAgICAgQHByb3QucmVhZF90eXBlKFR5cGVzOjpJNjQpCi0gICAgICBAcHJvdC5yZWFkX3R5cGUoVHlwZXM6OkRPVUJMRSkKLSAgICAgIEBwcm90LnJlYWRfdHlwZShUeXBlczo6U1RSSU5HKQorICAgIGl0ICdzaG91bGQgd3JpdGUgb3V0IHRoZSBkaWZmZXJlbnQgdHlwZXMnIGRvCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2Jvb2wpLndpdGgoJ2Jvb2wnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2J5dGUpLndpdGgoJ2J5dGUnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2RvdWJsZSkud2l0aCgnZG91YmxlJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoJ2kxNicpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKCdpMzInKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2k2NCkud2l0aCgnaTY0Jykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoJ3N0cmluZycpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfYmluYXJ5KS53aXRoKCdiaW5hcnknKS5vcmRlcmVkCisgICAgICBzdHJ1Y3QgPSBkb3VibGUoJ1N0cnVjdCcpCisgICAgICBleHBlY3Qoc3RydWN0KS50byByZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkub3JkZXJlZAorICAgICAgQHByb3Qud3JpdGVfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Qk9PTH0sICdib29sJykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJZVEV9LCAnYnl0ZScpCisgICAgICBAcHJvdC53cml0ZV90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpET1VCTEV9LCAnZG91YmxlJykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkxNn0sICdpMTYnKQorICAgICAgQHByb3Qud3JpdGVfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSwgJ2kzMicpCisgICAgICBAcHJvdC53cml0ZV90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJNjR9LCAnaTY0JykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklOR30sICdzdHJpbmcnKQorICAgICAgQHByb3Qud3JpdGVfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCA6YmluYXJ5ID0+IHRydWV9LCAnYmluYXJ5JykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUlVDVH0sIHN0cnVjdCkKICAgICAgICMgYWxsIG90aGVyIHR5cGVzIGFyZSBub3QgaW1wbGVtZW50ZWQKLSAgICAgIFtUeXBlczo6U1RPUCwgVHlwZXM6OlZPSUQsIFR5cGVzOjpNQVAsIFR5cGVzOjpTRVQsIFR5cGVzOjpMSVNUXS5lYWNoIGRvIHx0eXBlfAotICAgICAgICBsYW1iZGEgeyBAcHJvdC5yZWFkX3R5cGUodHlwZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoTm90SW1wbGVtZW50ZWRFcnJvcikKKyAgICAgIFtUaHJpZnQ6OlR5cGVzOjpTVE9QLCBUaHJpZnQ6OlR5cGVzOjpWT0lELCBUaHJpZnQ6OlR5cGVzOjpNQVAsIFRocmlmdDo6VHlwZXM6OlNFVCwgVGhyaWZ0OjpUeXBlczo6TElTVF0uZWFjaCBkbyB8dHlwZXwKKyAgICAgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfdHlwZSh7OnR5cGUgPT4gdHlwZX0sIHR5cGUudG9fcykgfS50byByYWlzZV9lcnJvcihOb3RJbXBsZW1lbnRlZEVycm9yKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAnc2hvdWxkIHJlYWQgdGhlIGRpZmZlcmVudCB0eXBlcyAoZGVwcmVjYXRlZCByZWFkX3R5cGUgc2lnbmF0dXJlKScgZG8KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9ib29sKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfYnl0ZSkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kxNikub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2k2NCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZAorICAgICAgQHByb3QucmVhZF90eXBlKFRocmlmdDo6VHlwZXM6OkJPT0wpCisgICAgICBAcHJvdC5yZWFkX3R5cGUoVGhyaWZ0OjpUeXBlczo6QllURSkKKyAgICAgIEBwcm90LnJlYWRfdHlwZShUaHJpZnQ6OlR5cGVzOjpJMTYpCisgICAgICBAcHJvdC5yZWFkX3R5cGUoVGhyaWZ0OjpUeXBlczo6STMyKQorICAgICAgQHByb3QucmVhZF90eXBlKFRocmlmdDo6VHlwZXM6Okk2NCkKKyAgICAgIEBwcm90LnJlYWRfdHlwZShUaHJpZnQ6OlR5cGVzOjpET1VCTEUpCisgICAgICBAcHJvdC5yZWFkX3R5cGUoVGhyaWZ0OjpUeXBlczo6U1RSSU5HKQorICAgICAgIyBhbGwgb3RoZXIgdHlwZXMgYXJlIG5vdCBpbXBsZW1lbnRlZAorICAgICAgW1RocmlmdDo6VHlwZXM6OlNUT1AsIFRocmlmdDo6VHlwZXM6OlZPSUQsIFRocmlmdDo6VHlwZXM6Ok1BUCwKKyAgICAgICBUaHJpZnQ6OlR5cGVzOjpTRVQsIFRocmlmdDo6VHlwZXM6OkxJU1QsIFRocmlmdDo6VHlwZXM6OlNUUlVDVF0uZWFjaCBkbyB8dHlwZXwKKyAgICAgICAgZXhwZWN0IHsgQHByb3QucmVhZF90eXBlKHR5cGUpIH0udG8gcmFpc2VfZXJyb3IoTm90SW1wbGVtZW50ZWRFcnJvcikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgaXQgJ3Nob3VsZCByZWFkIHRoZSBkaWZmZXJlbnQgdHlwZXMnIGRvCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfYm9vbCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2J5dGUpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMTYpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9kb3VibGUpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9iaW5hcnkpLm9yZGVyZWQKKyAgICAgIEBwcm90LnJlYWRfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Qk9PTH0pCisgICAgICBAcHJvdC5yZWFkX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJZVEV9KQorICAgICAgQHByb3QucmVhZF90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMTZ9KQorICAgICAgQHByb3QucmVhZF90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9KQorICAgICAgQHByb3QucmVhZF90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJNjR9KQorICAgICAgQHByb3QucmVhZF90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpET1VCTEV9KQorICAgICAgQHByb3QucmVhZF90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9KQorICAgICAgQHByb3QucmVhZF90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDpiaW5hcnkgPT4gdHJ1ZX0pCisgICAgICAjIGFsbCBvdGhlciB0eXBlcyBhcmUgbm90IGltcGxlbWVudGVkCisgICAgICBbVGhyaWZ0OjpUeXBlczo6U1RPUCwgVGhyaWZ0OjpUeXBlczo6Vk9JRCwgVGhyaWZ0OjpUeXBlczo6TUFQLAorICAgICAgIFRocmlmdDo6VHlwZXM6OlNFVCwgVGhyaWZ0OjpUeXBlczo6TElTVCwgVGhyaWZ0OjpUeXBlczo6U1RSVUNUXS5lYWNoIGRvIHx0eXBlfAorICAgICAgICBleHBlY3QgeyBAcHJvdC5yZWFkX3R5cGUoezp0eXBlID0+IHR5cGV9KSB9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2tpcCB0aGUgYmFzaWMgdHlwZXMiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9ib29sKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9ieXRlKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMTYpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTY0KS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9kb3VibGUpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZAotICAgICAgQHByb3Quc2tpcChUeXBlczo6Qk9PTCkKLSAgICAgIEBwcm90LnNraXAoVHlwZXM6OkJZVEUpCi0gICAgICBAcHJvdC5za2lwKFR5cGVzOjpJMTYpCi0gICAgICBAcHJvdC5za2lwKFR5cGVzOjpJMzIpCi0gICAgICBAcHJvdC5za2lwKFR5cGVzOjpJNjQpCi0gICAgICBAcHJvdC5za2lwKFR5cGVzOjpET1VCTEUpCi0gICAgICBAcHJvdC5za2lwKFR5cGVzOjpTVFJJTkcpCi0gICAgICBAcHJvdC5za2lwKFR5cGVzOjpTVE9QKSAjIHNob3VsZCBkbyBhYnNvbHV0ZWx5IG5vdGhpbmcKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9ib29sKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfYnl0ZSkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kxNikub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2k2NCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZAorICAgICAgQHByb3Quc2tpcChUaHJpZnQ6OlR5cGVzOjpCT09MKQorICAgICAgQHByb3Quc2tpcChUaHJpZnQ6OlR5cGVzOjpCWVRFKQorICAgICAgQHByb3Quc2tpcChUaHJpZnQ6OlR5cGVzOjpJMTYpCisgICAgICBAcHJvdC5za2lwKFRocmlmdDo6VHlwZXM6OkkzMikKKyAgICAgIEBwcm90LnNraXAoVGhyaWZ0OjpUeXBlczo6STY0KQorICAgICAgQHByb3Quc2tpcChUaHJpZnQ6OlR5cGVzOjpET1VCTEUpCisgICAgICBAcHJvdC5za2lwKFRocmlmdDo6VHlwZXM6OlNUUklORykKKyAgICAgIEBwcm90LnNraXAoVGhyaWZ0OjpUeXBlczo6U1RPUCkgIyBzaG91bGQgZG8gYWJzb2x1dGVseSBub3RoaW5nCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgc3RydWN0cyIgZG8KICAgICAgIHJlYWxfc2tpcCA9IEBwcm90Lm1ldGhvZCg6c2tpcCkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmV4YWN0bHkoNCkudGltZXMuYW5kX3JldHVybigKLSAgICAgICAgWydmaWVsZCAxJywgVHlwZXM6OlNUUklORywgMV0sCi0gICAgICAgIFsnZmllbGQgMicsIFR5cGVzOjpJMzIsIDJdLAotICAgICAgICBbJ2ZpZWxkIDMnLCBUeXBlczo6TUFQLCAzXSwKLSAgICAgICAgW25pbCwgVHlwZXM6OlNUT1AsIDBdCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmV4YWN0bHkoNCkudGltZXMuYW5kX3JldHVybigKKyAgICAgICAgWydmaWVsZCAxJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxXSwKKyAgICAgICAgWydmaWVsZCAyJywgVGhyaWZ0OjpUeXBlczo6STMyLCAyXSwKKyAgICAgICAgWydmaWVsZCAzJywgVGhyaWZ0OjpUeXBlczo6TUFQLCAzXSwKKyAgICAgICAgW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0KICAgICAgICkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSgzKS50aW1lcwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5leGFjdGx5KDMpLnRpbWVzCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtUeXBlczo6U1RSSU5HLCBUeXBlczo6U1RSSU5HLCAxXSkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoMykudGltZXMKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmV4YWN0bHkoMykudGltZXMKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDFdKQogICAgICAgIyBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmV4YWN0bHkoMikudGltZXMKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9lbmQpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKLSAgICAgIHJlYWxfc2tpcC5jYWxsKFR5cGVzOjpTVFJVQ1QpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWFwX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIHJlYWxfc2tpcC5jYWxsKFRocmlmdDo6VHlwZXM6OlNUUlVDVCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2tpcCBtYXBzIiBkbwogICAgICAgcmVhbF9za2lwID0gQHByb3QubWV0aG9kKDpza2lwKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1R5cGVzOjpTVFJJTkcsIFR5cGVzOjpTVFJVQ1QsIDFdKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbInNvbWVfc3RydWN0Il0pCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtuaWwsIFR5cGVzOjpTVE9QLCBuaWxdKTsKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9lbmQpLm9yZGVyZWQKLSAgICAgIHJlYWxfc2tpcC5jYWxsKFR5cGVzOjpNQVApCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWFwX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6U1RSVUNULCAxXSkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbInNvbWVfc3RydWN0Il0pCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCBuaWxdKTsKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWFwX2VuZCkub3JkZXJlZAorICAgICAgcmVhbF9za2lwLmNhbGwoVGhyaWZ0OjpUeXBlczo6TUFQKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBza2lwIHNldHMiIGRvCiAgICAgICByZWFsX3NraXAgPSBAcHJvdC5tZXRob2QoOnNraXApCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zZXRfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVHlwZXM6Okk2NCwgOV0pCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQuZXhhY3RseSg5KS50aW1lcwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc2V0X2VuZCkKLSAgICAgIHJlYWxfc2tpcC5jYWxsKFR5cGVzOjpTRVQpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc2V0X2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6Okk2NCwgOV0pCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTY0KS5vcmRlcmVkLmV4YWN0bHkoOSkudGltZXMKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zZXRfZW5kKQorICAgICAgcmVhbF9za2lwLmNhbGwoVGhyaWZ0OjpUeXBlczo6U0VUKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBza2lwIGxpc3RzIiBkbwogICAgICAgcmVhbF9za2lwID0gQHByb3QubWV0aG9kKDpza2lwKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbGlzdF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtUeXBlczo6RE9VQkxFLCAxMV0pCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9kb3VibGUpLm9yZGVyZWQuZXhhY3RseSgxMSkudGltZXMKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2xpc3RfZW5kKQotICAgICAgcmVhbF9za2lwLmNhbGwoVHlwZXM6OkxJU1QpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbGlzdF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIDExXSkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9kb3VibGUpLm9yZGVyZWQuZXhhY3RseSgxMSkudGltZXMKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9saXN0X2VuZCkKKyAgICAgIHJlYWxfc2tpcC5jYWxsKFRocmlmdDo6VHlwZXM6OkxJU1QpCiAgICAgZW5kCiAgIGVuZAogCi0gIGRlc2NyaWJlIEJhc2VQcm90b2NvbEZhY3RvcnkgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpCYXNlUHJvdG9jb2xGYWN0b3J5IGRvCiAgICAgaXQgInNob3VsZCByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yIiBkbwogICAgICAgIyByZXR1cm5pbmcgbmlsIHNpbmNlIFByb3RvY29sIGlzIGp1c3QgYW4gYWJzdHJhY3QgY2xhc3MKLSAgICAgIGxhbWJkYSB7QmFzZVByb3RvY29sRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKG1vY2soIk1vY2tUcmFuc3BvcnQiKSl9LnNob3VsZCByYWlzZV9lcnJvcihOb3RJbXBsZW1lbnRlZEVycm9yKQorICAgICAgZXhwZWN0IHtUaHJpZnQ6OkJhc2VQcm90b2NvbEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChkb3VibGUoIk1vY2tUcmFuc3BvcnQiKSl9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpCYXNlUHJvdG9jb2xGYWN0b3J5Lm5ldy50b19zKS50byBlcSgiYmFzZSIpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9iYXNlX3RyYW5zcG9ydF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvYmFzZV90cmFuc3BvcnRfc3BlYy5yYgppbmRleCBhMjk2NTZmLi5kMmY2MGFhIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9iYXNlX3RyYW5zcG9ydF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2Jhc2VfdHJhbnNwb3J0X3NwZWMucmIKQEAgLTE3LDIxMiArMTcsMjM1IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWNfaGVscGVyJworcmVxdWlyZSAnc3BlY19oZWxwZXInCiAKLWNsYXNzIFRocmlmdEJhc2VUcmFuc3BvcnRTcGVjIDwgU3BlYzo6RXhhbXBsZUdyb3VwCi0gIGluY2x1ZGUgVGhyaWZ0CitkZXNjcmliZSAnQmFzZVRyYW5zcG9ydCcgZG8KIAotICBkZXNjcmliZSBUcmFuc3BvcnRFeGNlcHRpb24gZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24gZG8KICAgICBpdCAic2hvdWxkIG1ha2UgdHlwZSBhY2Nlc3NpYmxlIiBkbwotICAgICAgZXhjID0gVHJhbnNwb3J0RXhjZXB0aW9uLm5ldyhUcmFuc3BvcnRFeGNlcHRpb246OkFMUkVBRFlfT1BFTiwgIm1zZyIpCi0gICAgICBleGMudHlwZS5zaG91bGQgPT0gVHJhbnNwb3J0RXhjZXB0aW9uOjpBTFJFQURZX09QRU4KLSAgICAgIGV4Yy5tZXNzYWdlLnNob3VsZCA9PSAibXNnIgorICAgICAgZXhjID0gVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpBTFJFQURZX09QRU4sICJtc2ciKQorICAgICAgZXhwZWN0KGV4Yy50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6QUxSRUFEWV9PUEVOKQorICAgICAgZXhwZWN0KGV4Yy5tZXNzYWdlKS50byBlcSgibXNnIikKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgQmFzZVRyYW5zcG9ydCBkbworICBkZXNjcmliZSBUaHJpZnQ6OkJhc2VUcmFuc3BvcnQgZG8KICAgICBpdCAic2hvdWxkIHJlYWQgdGhlIHNwZWNpZmllZCBzaXplIiBkbwotICAgICAgdHJhbnNwb3J0ID0gQmFzZVRyYW5zcG9ydC5uZXcKLSAgICAgIHRyYW5zcG9ydC5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aCg0MCkub3JkZXJlZC5hbmRfcmV0dXJuKCIxMCBsZXR0ZXJzIikKLSAgICAgIHRyYW5zcG9ydC5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aCgzMCkub3JkZXJlZC5hbmRfcmV0dXJuKCJmaWZ0ZWVuIGxldHRlcnMiKQotICAgICAgdHJhbnNwb3J0LnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKDE1KS5vcmRlcmVkLmFuZF9yZXR1cm4oIm1vcmUgY2hhcmFjdGVycyIpCi0gICAgICB0cmFuc3BvcnQucmVhZF9hbGwoNDApLnNob3VsZCA9PSAiMTAgbGV0dGVyc2ZpZnRlZW4gbGV0dGVyc21vcmUgY2hhcmFjdGVycyIKKyAgICAgIHRyYW5zcG9ydCA9IFRocmlmdDo6QmFzZVRyYW5zcG9ydC5uZXcKKyAgICAgIGV4cGVjdCh0cmFuc3BvcnQpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoNDApLm9yZGVyZWQuYW5kX3JldHVybigiMTAgbGV0dGVycyIpCisgICAgICBleHBlY3QodHJhbnNwb3J0KS50byByZWNlaXZlKDpyZWFkKS53aXRoKDMwKS5vcmRlcmVkLmFuZF9yZXR1cm4oImZpZnRlZW4gbGV0dGVycyIpCisgICAgICBleHBlY3QodHJhbnNwb3J0KS50byByZWNlaXZlKDpyZWFkKS53aXRoKDE1KS5vcmRlcmVkLmFuZF9yZXR1cm4oIm1vcmUgY2hhcmFjdGVycyIpCisgICAgICBleHBlY3QodHJhbnNwb3J0LnJlYWRfYWxsKDQwKSkudG8gZXEoIjEwIGxldHRlcnNmaWZ0ZWVuIGxldHRlcnNtb3JlIGNoYXJhY3RlcnMiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzdHViIG91dCB0aGUgcmVzdCBvZiB0aGUgbWV0aG9kcyIgZG8KICAgICAgICMgY2FuJ3QgdGVzdCBmb3Igc3R1YmJpbmVzcywgc28ganVzdCBtYWtlIHN1cmUgdGhleSdyZSBkZWZpbmVkCiAgICAgICBbOm9wZW4/LCA6b3BlbiwgOmNsb3NlLCA6cmVhZCwgOndyaXRlLCA6Zmx1c2hdLmVhY2ggZG8gfHN5bXwKLSAgICAgICAgQmFzZVRyYW5zcG9ydC5tZXRob2RfZGVmaW5lZD8oc3ltKS5zaG91bGQgYmVfdHJ1ZQorICAgICAgICBleHBlY3QoVGhyaWZ0OjpCYXNlVHJhbnNwb3J0Lm1ldGhvZF9kZWZpbmVkPyhzeW0pKS50byBiZV90cnV0aHkKICAgICAgIGVuZAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhbGlhcyA8PCB0byB3cml0ZSIgZG8KLSAgICAgIEJhc2VUcmFuc3BvcnQuaW5zdGFuY2VfbWV0aG9kKDo8PCkuc2hvdWxkID09IEJhc2VUcmFuc3BvcnQuaW5zdGFuY2VfbWV0aG9kKDp3cml0ZSkKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VUcmFuc3BvcnQuaW5zdGFuY2VfbWV0aG9kKDo8PCkpLnRvIGVxKFRocmlmdDo6QmFzZVRyYW5zcG9ydC5pbnN0YW5jZV9tZXRob2QoOndyaXRlKSkKKyAgICBlbmQKKyAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpCYXNlVHJhbnNwb3J0Lm5ldy50b19zKS50byBlcSgiYmFzZSIpCiAgICAgZW5kCiAgIGVuZAogCi0gIGRlc2NyaWJlIEJhc2VTZXJ2ZXJUcmFuc3BvcnQgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpCYXNlU2VydmVyVHJhbnNwb3J0IGRvCiAgICAgaXQgInNob3VsZCBzdHViIG91dCBpdHMgbWV0aG9kcyIgZG8KICAgICAgIFs6bGlzdGVuLCA6YWNjZXB0LCA6Y2xvc2VdLmVhY2ggZG8gfHN5bXwKLSAgICAgICAgQmFzZVNlcnZlclRyYW5zcG9ydC5tZXRob2RfZGVmaW5lZD8oc3ltKS5zaG91bGQgYmVfdHJ1ZQorICAgICAgICBleHBlY3QoVGhyaWZ0OjpCYXNlU2VydmVyVHJhbnNwb3J0Lm1ldGhvZF9kZWZpbmVkPyhzeW0pKS50byBiZV90cnV0aHkKICAgICAgIGVuZAogICAgIGVuZAogICBlbmQKIAotICBkZXNjcmliZSBCYXNlVHJhbnNwb3J0RmFjdG9yeSBkbworICBkZXNjcmliZSBUaHJpZnQ6OkJhc2VUcmFuc3BvcnRGYWN0b3J5IGRvCiAgICAgaXQgInNob3VsZCByZXR1cm4gdGhlIHRyYW5zcG9ydCBpdCdzIGdpdmVuIiBkbwotICAgICAgdHJhbnNwb3J0ID0gbW9jaygiVHJhbnNwb3J0IikKLSAgICAgIEJhc2VUcmFuc3BvcnRGYWN0b3J5Lm5ldy5nZXRfdHJhbnNwb3J0KHRyYW5zcG9ydCkuc2hvdWxkIGVxbCh0cmFuc3BvcnQpCisgICAgICB0cmFuc3BvcnQgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QoVGhyaWZ0OjpCYXNlVHJhbnNwb3J0RmFjdG9yeS5uZXcuZ2V0X3RyYW5zcG9ydCh0cmFuc3BvcnQpKS50byBlcWwodHJhbnNwb3J0KQorICAgIGVuZAorICAgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VUcmFuc3BvcnRGYWN0b3J5Lm5ldy50b19zKS50byBlcSgiYmFzZSIpCiAgICAgZW5kCiAgIGVuZAogCi0gIGRlc2NyaWJlIEJ1ZmZlcmVkVHJhbnNwb3J0IGRvCi0gICAgaXQgInNob3VsZCBwYXNzIHRocm91Z2ggZXZlcnl0aGluZyBidXQgd3JpdGUvZmx1c2gvcmVhZCIgZG8KLSAgICAgIHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpvcGVuPykub3JkZXJlZC5hbmRfcmV0dXJuKCIrIG9wZW4/IikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpvcGVuKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3BlbiIpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQgIyBmcm9tIHRoZSBjbG9zZQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgY2xvc2UiKQotICAgICAgYnRyYW5zID0gQnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQotICAgICAgYnRyYW5zLm9wZW4/LnNob3VsZCA9PSAiKyBvcGVuPyIKLSAgICAgIGJ0cmFucy5vcGVuLnNob3VsZCA9PSAiKyBvcGVuIgotICAgICAgYnRyYW5zLmNsb3NlLnNob3VsZCA9PSAiKyBjbG9zZSIKKyAgZGVzY3JpYmUgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydCBkbworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHRvX3MgdGhhdCBkZXNjcmliZXMgdGhlIGVuY2Fwc3VsYXRpb24iIGRvCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6dG9fcykuYW5kX3JldHVybigibW9jayIpCisgICAgICBleHBlY3QoVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpLnRvX3MpLnRvIGVxKCJidWZmZXJlZChtb2NrKSIpCiAgICAgZW5kCi0gICAgCi0gICAgaXQgInNob3VsZCBidWZmZXIgcmVhZHMgaW4gY2h1bmtzIG9mICN7QnVmZmVyZWRUcmFuc3BvcnQ6OkRFRkFVTFRfQlVGRkVSfSIgZG8KLSAgICAgIHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKEJ1ZmZlcmVkVHJhbnNwb3J0OjpERUZBVUxUX0JVRkZFUikuYW5kX3JldHVybigibG9ydW0gaXBzdW0gZG9sb3IgZW1ldCIpCi0gICAgICBidHJhbnMgPSBCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCi0gICAgICBidHJhbnMucmVhZCg2KS5zaG91bGQgPT0gImxvcnVtICIKLSAgICAgIGJ0cmFucy5yZWFkKDYpLnNob3VsZCA9PSAiaXBzdW0gIgotICAgICAgYnRyYW5zLnJlYWQoNikuc2hvdWxkID09ICJkb2xvciAiCi0gICAgICBidHJhbnMucmVhZCg2KS5zaG91bGQgPT0gImVtZXQiCisKKyAgICBpdCAic2hvdWxkIHBhc3MgdGhyb3VnaCBldmVyeXRoaW5nIGJ1dCB3cml0ZS9mbHVzaC9yZWFkIiBkbworICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOm9wZW4/KS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3Blbj8iKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpvcGVuKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3BlbiIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKS5vcmRlcmVkICMgZnJvbSB0aGUgY2xvc2UKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpLm9yZGVyZWQuYW5kX3JldHVybigiKyBjbG9zZSIpCisgICAgICBidHJhbnMgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKKyAgICAgIGV4cGVjdChidHJhbnMub3Blbj8pLnRvIGVxKCIrIG9wZW4/IikKKyAgICAgIGV4cGVjdChidHJhbnMub3BlbikudG8gZXEoIisgb3BlbiIpCisgICAgICBleHBlY3QoYnRyYW5zLmNsb3NlKS50byBlcSgiKyBjbG9zZSIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIGJ1ZmZlciByZWFkcyBpbiBjaHVua3Mgb2YgI3tUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0OjpERUZBVUxUX0JVRkZFUn0iIGRvCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6cmVhZCkud2l0aChUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0OjpERUZBVUxUX0JVRkZFUikuYW5kX3JldHVybigibG9ydW0gaXBzdW0gZG9sb3IgZW1ldCIpCisgICAgICBidHJhbnMgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKKyAgICAgIGV4cGVjdChidHJhbnMucmVhZCg2KSkudG8gZXEoImxvcnVtICIpCisgICAgICBleHBlY3QoYnRyYW5zLnJlYWQoNikpLnRvIGVxKCJpcHN1bSAiKQorICAgICAgZXhwZWN0KGJ0cmFucy5yZWFkKDYpKS50byBlcSgiZG9sb3IgIikKKyAgICAgIGV4cGVjdChidHJhbnMucmVhZCg2KSkudG8gZXEoImVtZXQiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBidWZmZXIgd3JpdGVzIGFuZCBzZW5kIHRoZW0gb24gZmx1c2giIGRvCi0gICAgICB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCi0gICAgICBidHJhbnMgPSBCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGJ0cmFucyA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQogICAgICAgYnRyYW5zLndyaXRlKCJvbmUvIikKICAgICAgIGJ0cmFucy53cml0ZSgidHdvLyIpCiAgICAgICBidHJhbnMud3JpdGUoInRocmVlLyIpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoIm9uZS90d28vdGhyZWUvIikub3JkZXJlZAotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmZsdXNoKS5vcmRlcmVkCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJvbmUvdHdvL3RocmVlLyIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQKICAgICAgIGJ0cmFucy5mbHVzaAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBvbmx5IHNlbmQgYnVmZmVyZWQgZGF0YSBvbmNlIiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgYnRyYW5zID0gQnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQorICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBidHJhbnMgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKICAgICAgIGJ0cmFucy53cml0ZSgib25lLyIpCiAgICAgICBidHJhbnMud3JpdGUoInR3by8iKQogICAgICAgYnRyYW5zLndyaXRlKCJ0aHJlZS8iKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJvbmUvdHdvL3RocmVlLyIpCi0gICAgICB0cmFucy5zdHViISg6Zmx1c2gpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJvbmUvdHdvL3RocmVlLyIpCisgICAgICBhbGxvdyh0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpCiAgICAgICBidHJhbnMuZmx1c2gKICAgICAgICMgTm90aGluZyB0byBmbHVzaCB3aXRoIG5vIGRhdGEKICAgICAgIGJ0cmFucy5mbHVzaAogICAgIGVuZAotICAgIAorCiAgICAgaXQgInNob3VsZCBmbHVzaCBvbiBjbG9zZSIgZG8KLSAgICAgIHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkKLSAgICAgIGJ0cmFucyA9IEJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKLSAgICAgIGJ0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBidHJhbnMgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKKyAgICAgIGV4cGVjdChidHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKQogICAgICAgYnRyYW5zLmNsb3NlCiAgICAgZW5kCi0gICAgCisKICAgICBpdCAic2hvdWxkIG5vdCB3cml0ZSB0byBzb2NrZXQgaWYgdGhlcmUncyBubyBkYXRhIiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmZsdXNoKQotICAgICAgYnRyYW5zID0gQnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQorICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKQorICAgICAgYnRyYW5zID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCiAgICAgICBidHJhbnMuZmx1c2gKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5IGRvCisgIGRlc2NyaWJlIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5IGRvCiAgICAgaXQgInNob3VsZCB3cmFwIHRoZSBnaXZlbiB0cmFuc3BvcnQgaW4gYSBCdWZmZXJlZFRyYW5zcG9ydCIgZG8KLSAgICAgIHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKLSAgICAgIGJ0cmFucyA9IG1vY2soIkJ1ZmZlcmVkVHJhbnNwb3J0IikKLSAgICAgIEJ1ZmZlcmVkVHJhbnNwb3J0LnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgodHJhbnMpLmFuZF9yZXR1cm4oYnRyYW5zKQotICAgICAgQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldy5nZXRfdHJhbnNwb3J0KHRyYW5zKS5zaG91bGQgPT0gYnRyYW5zCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGJ0cmFucyA9IGRvdWJsZSgiQnVmZmVyZWRUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQpLnRvIHJlY2VpdmUoOm5ldykud2l0aCh0cmFucykuYW5kX3JldHVybihidHJhbnMpCisgICAgICBleHBlY3QoVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkubmV3LmdldF90cmFuc3BvcnQodHJhbnMpKS50byBlcShidHJhbnMpCisgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldy50b19zKS50byBlcSgiYnVmZmVyZWQiKQogICAgIGVuZAogICBlbmQKIAotICBkZXNjcmliZSBGcmFtZWRUcmFuc3BvcnQgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQorICAgICAgQHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgdG9fcyB0aGF0IGRlc2NyaWJlcyB0aGUgZW5jYXBzdWxhdGlvbiIgZG8KKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDp0b19zKS5hbmRfcmV0dXJuKCJtb2NrIikKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcodHJhbnMpLnRvX3MpLnRvIGVxKCJmcmFtZWQobW9jaykiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwYXNzIHRocm91Z2ggb3Blbj8vb3Blbi9jbG9zZSIgZG8KLSAgICAgIGZ0cmFucyA9IEZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpvcGVuPykub3JkZXJlZC5hbmRfcmV0dXJuKCIrIG9wZW4/IikKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6b3Blbikub3JkZXJlZC5hbmRfcmV0dXJuKCIrIG9wZW4iKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkub3JkZXJlZC5hbmRfcmV0dXJuKCIrIGNsb3NlIikKLSAgICAgIGZ0cmFucy5vcGVuPy5zaG91bGQgPT0gIisgb3Blbj8iCi0gICAgICBmdHJhbnMub3Blbi5zaG91bGQgPT0gIisgb3BlbiIKLSAgICAgIGZ0cmFucy5jbG9zZS5zaG91bGQgPT0gIisgY2xvc2UiCisgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6b3Blbj8pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuPyIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpvcGVuKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3BlbiIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkub3JkZXJlZC5hbmRfcmV0dXJuKCIrIGNsb3NlIikKKyAgICAgIGV4cGVjdChmdHJhbnMub3Blbj8pLnRvIGVxKCIrIG9wZW4/IikKKyAgICAgIGV4cGVjdChmdHJhbnMub3BlbikudG8gZXEoIisgb3BlbiIpCisgICAgICBleHBlY3QoZnRyYW5zLmNsb3NlKS50byBlcSgiKyBjbG9zZSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHBhc3MgdGhyb3VnaCByZWFkIHdoZW4gcmVhZCBpcyB0dXJuZWQgb2ZmIiBkbwotICAgICAgZnRyYW5zID0gRnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMsIGZhbHNlLCB0cnVlKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKDE3KS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgcmVhZCIpCi0gICAgICBmdHJhbnMucmVhZCgxNykuc2hvdWxkID09ICIrIHJlYWQiCisgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zLCBmYWxzZSwgdHJ1ZSkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoMTcpLm9yZGVyZWQuYW5kX3JldHVybigiKyByZWFkIikKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCgxNykpLnRvIGVxKCIrIHJlYWQiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwYXNzIHRocm91Z2ggd3JpdGUvZmx1c2ggd2hlbiB3cml0ZSBpcyB0dXJuZWQgb2ZmIiBkbwotICAgICAgZnRyYW5zID0gRnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMsIHRydWUsIGZhbHNlKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiZm9vIikub3JkZXJlZC5hbmRfcmV0dXJuKCIrIHdyaXRlIikKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQuYW5kX3JldHVybigiKyBmbHVzaCIpCi0gICAgICBmdHJhbnMud3JpdGUoImZvbyIpLnNob3VsZCA9PSAiKyB3cml0ZSIKLSAgICAgIGZ0cmFucy5mbHVzaC5zaG91bGQgPT0gIisgZmx1c2giCisgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zLCB0cnVlLCBmYWxzZSkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJmb28iKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgd3JpdGUiKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQuYW5kX3JldHVybigiKyBmbHVzaCIpCisgICAgICBleHBlY3QoZnRyYW5zLndyaXRlKCJmb28iKSkudG8gZXEoIisgd3JpdGUiKQorICAgICAgZXhwZWN0KGZ0cmFucy5mbHVzaCkudG8gZXEoIisgZmx1c2giKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gYSBmdWxsIGZyYW1lIGlmIGFza2VkIGZvciA+PSB0aGUgZnJhbWUncyBsZW5ndGgiIGRvCiAgICAgICBmcmFtZSA9ICJ0aGlzIGlzIGEgZnJhbWUiCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWRfYWxsKS53aXRoKDQpLmFuZF9yZXR1cm4oIlwwMDBcMDAwXDAwMFwwMTciKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZS5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUpCi0gICAgICBGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykucmVhZChmcmFtZS5sZW5ndGggKyAxMCkuc2hvdWxkID09IGZyYW1lCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpyZWFkX2FsbCkud2l0aCg0KS5hbmRfcmV0dXJuKCJcMDAwXDAwMFwwMDBcMDE3IikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lLmxlbmd0aCkuYW5kX3JldHVybihmcmFtZSkKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKS5yZWFkKGZyYW1lLmxlbmd0aCArIDEwKSkudG8gZXEoZnJhbWUpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJldHVybiBzbGljZXMgb2YgdGhlIGZyYW1lIHdoZW4gYXNrZWQgZm9yIDwgdGhlIGZyYW1lJ3MgbGVuZ3RoIiBkbwogICAgICAgZnJhbWUgPSAidGhpcyBpcyBhIGZyYW1lIgotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aCg0KS5hbmRfcmV0dXJuKCJcMDAwXDAwMFwwMDBcMDE3IikKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoZnJhbWUubGVuZ3RoKS5hbmRfcmV0dXJuKGZyYW1lKQotICAgICAgZnRyYW5zID0gRnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCi0gICAgICBmdHJhbnMucmVhZCg0KS5zaG91bGQgPT0gInRoaXMiCi0gICAgICBmdHJhbnMucmVhZCg0KS5zaG91bGQgPT0gIiBpcyAiCi0gICAgICBmdHJhbnMucmVhZCgxNikuc2hvdWxkID09ICJhIGZyYW1lIgorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoNCkuYW5kX3JldHVybigiXDAwMFwwMDBcMDAwXDAxNyIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZS5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUpCisgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDQpKS50byBlcSgidGhpcyIpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoNCkpLnRvIGVxKCIgaXMgIikKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCgxNikpLnRvIGVxKCJhIGZyYW1lIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIG5vdGhpbmcgaWYgYXNrZWQgZm9yIDw9IDAiIGRvCi0gICAgICBGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykucmVhZCgtMikuc2hvdWxkID09ICIiCisgICAgICBleHBlY3QoVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykucmVhZCgtMikpLnRvIGVxKCIiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwdWxsIGEgbmV3IGZyYW1lIHdoZW4gdGhlIGZpcnN0IGlzIGV4aGF1c3RlZCIgZG8KICAgICAgIGZyYW1lID0gInRoaXMgaXMgYSBmcmFtZSIKICAgICAgIGZyYW1lMiA9ICJ5ZXQgYW5vdGhlciBmcmFtZSIKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoNCkuYW5kX3JldHVybigiXDAwMFwwMDBcMDAwXDAxNyIsICJcMDAwXDAwMFwwMDBcMDIxIikKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoZnJhbWUubGVuZ3RoKS5hbmRfcmV0dXJuKGZyYW1lKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZTIubGVuZ3RoKS5hbmRfcmV0dXJuKGZyYW1lMikKLSAgICAgIGZ0cmFucyA9IEZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQotICAgICAgZnRyYW5zLnJlYWQoNCkuc2hvdWxkID09ICJ0aGlzIgotICAgICAgZnRyYW5zLnJlYWQoOCkuc2hvdWxkID09ICIgaXMgYSBmciIKLSAgICAgIGZ0cmFucy5yZWFkKDYpLnNob3VsZCA9PSAiYW1lIgotICAgICAgZnRyYW5zLnJlYWQoNCkuc2hvdWxkID09ICJ5ZXQgIgotICAgICAgZnRyYW5zLnJlYWQoMTYpLnNob3VsZCA9PSAiYW5vdGhlciBmcmFtZSIKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKDQpLmFuZF9yZXR1cm4oIlwwMDBcMDAwXDAwMFwwMTciLCAiXDAwMFwwMDBcMDAwXDAyMSIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZS5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZTIubGVuZ3RoKS5hbmRfcmV0dXJuKGZyYW1lMikKKyAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoNCkpLnRvIGVxKCJ0aGlzIikKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCg4KSkudG8gZXEoIiBpcyBhIGZyIikKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCg2KSkudG8gZXEoImFtZSIpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoNCkpLnRvIGVxKCJ5ZXQgIikKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCgxNikpLnRvIGVxKCJhbm90aGVyIGZyYW1lIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYnVmZmVyIHdyaXRlcyIgZG8KLSAgICAgIGZ0cmFucyA9IEZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQotICAgICAgQHRyYW5zLnNob3VsZF9ub3RfcmVjZWl2ZSg6d3JpdGUpCisgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQorICAgICAgZXhwZWN0KEB0cmFucykubm90X3RvIHJlY2VpdmUoOndyaXRlKQogICAgICAgZnRyYW5zLndyaXRlKCJmb28iKQogICAgICAgZnRyYW5zLndyaXRlKCJiYXIiKQogICAgICAgZnRyYW5zLndyaXRlKCJ0aGlzIGlzIGEgZnJhbWUiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBzbGljZXMgb2YgdGhlIGJ1ZmZlciIgZG8KLSAgICAgIGZ0cmFucyA9IEZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQorICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKICAgICAgIGZ0cmFucy53cml0ZSgiZm9vYmFyIiwgMykKICAgICAgIGZ0cmFucy53cml0ZSgiYmFyZm9vIiwgMSkKLSAgICAgIEB0cmFucy5zdHViISg6Zmx1c2gpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJcMDAwXDAwMFwwMDBcMDA0Zm9vYiIpCisgICAgICBhbGxvdyhAdHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoIlwwMDBcMDAwXDAwMFwwMDRmb29iIikKICAgICAgIGZ0cmFucy5mbHVzaAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBmbHVzaCBmcmFtZXMgd2l0aCBhIDQtYnl0ZSBoZWFkZXIiIGRvCi0gICAgICBmdHJhbnMgPSBGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoIlwwMDBcMDAwXDAwMFwwMzVvbmUvdHdvL3RocmVlL3RoaXMgaXMgYSBmcmFtZSIpLm9yZGVyZWQKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQKKyAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAzNW9uZS90d28vdGhyZWUvdGhpcyBpcyBhIGZyYW1lIikub3JkZXJlZAorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQKICAgICAgIGZ0cmFucy53cml0ZSgib25lLyIpCiAgICAgICBmdHJhbnMud3JpdGUoInR3by8iKQogICAgICAgZnRyYW5zLndyaXRlKCJ0aHJlZS8iKQpAQCAtMjMxLDEyMCArMjU0LDEzNCBAQAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBub3QgZmx1c2ggdGhlIHNhbWUgYnVmZmVyZWQgZGF0YSB0d2ljZSIgZG8KLSAgICAgIGZ0cmFucyA9IEZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAwN2Zvby9iYXIiKQotICAgICAgQHRyYW5zLnN0dWIhKDpmbHVzaCkKKyAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAwN2Zvby9iYXIiKQorICAgICAgYWxsb3coQHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkKICAgICAgIGZ0cmFucy53cml0ZSgiZm9vIikKICAgICAgIGZ0cmFucy53cml0ZSgiL2JhciIpCiAgICAgICBmdHJhbnMuZmx1c2gKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoIlwwMDBcMDAwXDAwMFwwMDAiKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoIlwwMDBcMDAwXDAwMFwwMDAiKQogICAgICAgZnRyYW5zLmZsdXNoCiAgICAgZW5kCiAgIGVuZAogCi0gIGRlc2NyaWJlIEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnRGYWN0b3J5IGRvCiAgICAgaXQgInNob3VsZCB3cmFwIHRoZSBnaXZlbiB0cmFuc3BvcnQgaW4gYSBGcmFtZWRUcmFuc3BvcnQiIGRvCi0gICAgICB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCi0gICAgICBGcmFtZWRUcmFuc3BvcnQuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCh0cmFucykKLSAgICAgIEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkubmV3LmdldF90cmFuc3BvcnQodHJhbnMpCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKHRyYW5zKQorICAgICAgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldy5nZXRfdHJhbnNwb3J0KHRyYW5zKQorICAgIGVuZAorICAgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJmcmFtZWQiKQogICAgIGVuZAogICBlbmQKIAotICBkZXNjcmliZSBNZW1vcnlCdWZmZXJUcmFuc3BvcnQgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAYnVmZmVyID0gTWVtb3J5QnVmZmVyVHJhbnNwb3J0Lm5ldworICAgICAgQGJ1ZmZlciA9IFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0Lm5ldworICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBidWZmZXIudG9fcykudG8gZXEoIm1lbW9yeSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGFjY2VwdCBhIGJ1ZmZlciBvbiBpbnB1dCBhbmQgdXNlIGl0IGRpcmVjdGx5IiBkbwogICAgICAgcyA9ICJ0aGlzIGlzIGEgdGVzdCIKLSAgICAgIEBidWZmZXIgPSBNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3KHMpCi0gICAgICBAYnVmZmVyLnJlYWQoNCkuc2hvdWxkID09ICJ0aGlzIgorICAgICAgQGJ1ZmZlciA9IFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0Lm5ldyhzKQorICAgICAgZXhwZWN0KEBidWZmZXIucmVhZCg0KSkudG8gZXEoInRoaXMiKQogICAgICAgcy5zbGljZSEoLTQuLi0xKQotICAgICAgQGJ1ZmZlci5yZWFkKEBidWZmZXIuYXZhaWxhYmxlKS5zaG91bGQgPT0gIiBpcyBhICIKKyAgICAgIGV4cGVjdChAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpKS50byBlcSgiIGlzIGEgIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWx3YXlzIHJlbWFpbiBvcGVuIiBkbwotICAgICAgQGJ1ZmZlci5zaG91bGQgYmVfb3BlbgorICAgICAgZXhwZWN0KEBidWZmZXIpLnRvIGJlX29wZW4KICAgICAgIEBidWZmZXIuY2xvc2UKLSAgICAgIEBidWZmZXIuc2hvdWxkIGJlX29wZW4KKyAgICAgIGV4cGVjdChAYnVmZmVyKS50byBiZV9vcGVuCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlc3BvbmQgdG8gcGVlayBhbmQgYXZhaWxhYmxlIiBkbwogICAgICAgQGJ1ZmZlci53cml0ZSAic29tZSBkYXRhIgotICAgICAgQGJ1ZmZlci5wZWVrLnNob3VsZCBiZV90cnVlCi0gICAgICBAYnVmZmVyLmF2YWlsYWJsZS5zaG91bGQgPT0gOQorICAgICAgZXhwZWN0KEBidWZmZXIucGVlaykudG8gYmVfdHJ1dGh5CisgICAgICBleHBlY3QoQGJ1ZmZlci5hdmFpbGFibGUpLnRvIGVxKDkpCiAgICAgICBAYnVmZmVyLnJlYWQoNCkKLSAgICAgIEBidWZmZXIucGVlay5zaG91bGQgYmVfdHJ1ZQotICAgICAgQGJ1ZmZlci5hdmFpbGFibGUuc2hvdWxkID09IDUKKyAgICAgIGV4cGVjdChAYnVmZmVyLnBlZWspLnRvIGJlX3RydXRoeQorICAgICAgZXhwZWN0KEBidWZmZXIuYXZhaWxhYmxlKS50byBlcSg1KQogICAgICAgQGJ1ZmZlci5yZWFkKDUpCi0gICAgICBAYnVmZmVyLnBlZWsuc2hvdWxkIGJlX2ZhbHNlCi0gICAgICBAYnVmZmVyLmF2YWlsYWJsZS5zaG91bGQgPT0gMAorICAgICAgZXhwZWN0KEBidWZmZXIucGVlaykudG8gYmVfZmFsc2V5CisgICAgICBleHBlY3QoQGJ1ZmZlci5hdmFpbGFibGUpLnRvIGVxKDApCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGJlIGFibGUgdG8gcmVzZXQgdGhlIGJ1ZmZlciIgZG8KICAgICAgIEBidWZmZXIud3JpdGUgInRlc3QgZGF0YSIKICAgICAgIEBidWZmZXIucmVzZXRfYnVmZmVyKCJmb29iYXIiKQotICAgICAgQGJ1ZmZlci5hdmFpbGFibGUuc2hvdWxkID09IDYKLSAgICAgIEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkuc2hvdWxkID09ICJmb29iYXIiCisgICAgICBleHBlY3QoQGJ1ZmZlci5hdmFpbGFibGUpLnRvIGVxKDYpCisgICAgICBleHBlY3QoQGJ1ZmZlci5yZWFkKEBidWZmZXIuYXZhaWxhYmxlKSkudG8gZXEoImZvb2JhciIpCiAgICAgICBAYnVmZmVyLnJlc2V0X2J1ZmZlcgotICAgICAgQGJ1ZmZlci5hdmFpbGFibGUuc2hvdWxkID09IDAKKyAgICAgIGV4cGVjdChAYnVmZmVyLmF2YWlsYWJsZSkudG8gZXEoMCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY29weSB0aGUgZ2l2ZW4gc3RyaW5nIHdoZW4gcmVzZXR0aW5nIHRoZSBidWZmZXIiIGRvCiAgICAgICBzID0gInRoaXMgaXMgYSB0ZXN0IgogICAgICAgQGJ1ZmZlci5yZXNldF9idWZmZXIocykKLSAgICAgIEBidWZmZXIuYXZhaWxhYmxlLnNob3VsZCA9PSAxNAorICAgICAgZXhwZWN0KEBidWZmZXIuYXZhaWxhYmxlKS50byBlcSgxNCkKICAgICAgIEBidWZmZXIucmVhZCgxMCkKLSAgICAgIEBidWZmZXIuYXZhaWxhYmxlLnNob3VsZCA9PSA0Ci0gICAgICBzLnNob3VsZCA9PSAidGhpcyBpcyBhIHRlc3QiCisgICAgICBleHBlY3QoQGJ1ZmZlci5hdmFpbGFibGUpLnRvIGVxKDQpCisgICAgICBleHBlY3QocykudG8gZXEoInRoaXMgaXMgYSB0ZXN0IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIGZyb20gcmVhZCB3aGF0IHdhcyBnaXZlbiBpbiB3cml0ZSIgZG8KICAgICAgIEBidWZmZXIud3JpdGUgInRlc3QgZGF0YSIKLSAgICAgIEBidWZmZXIucmVhZCg0KS5zaG91bGQgPT0gInRlc3QiCi0gICAgICBAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpLnNob3VsZCA9PSAiIGRhdGEiCisgICAgICBleHBlY3QoQGJ1ZmZlci5yZWFkKDQpKS50byBlcSgidGVzdCIpCisgICAgICBleHBlY3QoQGJ1ZmZlci5yZWFkKEBidWZmZXIuYXZhaWxhYmxlKSkudG8gZXEoIiBkYXRhIikKICAgICAgIEBidWZmZXIud3JpdGUgImZvbyIKICAgICAgIEBidWZmZXIud3JpdGUgIiBiYXIiCi0gICAgICBAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpLnNob3VsZCA9PSAiZm9vIGJhciIKKyAgICAgIGV4cGVjdChAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpKS50byBlcSgiZm9vIGJhciIpCiAgICAgZW5kCi0gICAgCisKICAgICBpdCAic2hvdWxkIHRocm93IGFuIEVPRkVycm9yIHdoZW4gdGhlcmUgaXNuJ3QgZW5vdWdoIGRhdGEgaW4gdGhlIGJ1ZmZlciIgZG8KICAgICAgIEBidWZmZXIucmVzZXRfYnVmZmVyKCIiKQotICAgICAgbGFtYmRhe0BidWZmZXIucmVhZCgxKX0uc2hvdWxkIHJhaXNlX2Vycm9yKEVPRkVycm9yKQorICAgICAgZXhwZWN0e0BidWZmZXIucmVhZCgxKX0udG8gcmFpc2VfZXJyb3IoRU9GRXJyb3IpCiAKICAgICAgIEBidWZmZXIucmVzZXRfYnVmZmVyKCIxMjM0IikKLSAgICAgIGxhbWJkYXtAYnVmZmVyLnJlYWQoNSl9LnNob3VsZCByYWlzZV9lcnJvcihFT0ZFcnJvcikKKyAgICAgIGV4cGVjdHtAYnVmZmVyLnJlYWQoNSl9LnRvIHJhaXNlX2Vycm9yKEVPRkVycm9yKQogICAgIGVuZAogICBlbmQKIAotICBkZXNjcmliZSBJT1N0cmVhbVRyYW5zcG9ydCBkbworICBkZXNjcmliZSBUaHJpZnQ6OklPU3RyZWFtVHJhbnNwb3J0IGRvCiAgICAgYmVmb3JlKDplYWNoKSBkbwotICAgICAgQGlucHV0ID0gbW9jaygiSW5wdXQiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIEBvdXRwdXQgPSBtb2NrKCJPdXRwdXQiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIEB0cmFucyA9IElPU3RyZWFtVHJhbnNwb3J0Lm5ldyhAaW5wdXQsIEBvdXRwdXQpCisgICAgICBAaW5wdXQgPSBkb3VibGUoIklucHV0IiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBAb3V0cHV0ID0gZG91YmxlKCJPdXRwdXQiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIEB0cmFucyA9IFRocmlmdDo6SU9TdHJlYW1UcmFuc3BvcnQubmV3KEBpbnB1dCwgQG91dHB1dCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAaW5wdXQpLnRvIHJlY2VpdmUoOnRvX3MpLmFuZF9yZXR1cm4oIm1vY2tfaW5wdXQiKQorICAgICAgZXhwZWN0KEBvdXRwdXQpLnRvIHJlY2VpdmUoOnRvX3MpLmFuZF9yZXR1cm4oIm1vY2tfb3V0cHV0IikKKyAgICAgIGV4cGVjdChAdHJhbnMudG9fcykudG8gZXEoImlvc3RyZWFtKGlucHV0PW1vY2tfaW5wdXQsb3V0cHV0PW1vY2tfb3V0cHV0KSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGJlIG9wZW4gYXMgbG9uZyBhcyBib3RoIGlucHV0IG9yIG91dHB1dCBhcmUgb3BlbiIgZG8KLSAgICAgIEB0cmFucy5zaG91bGQgYmVfb3BlbgotICAgICAgQGlucHV0LnN0dWIhKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCi0gICAgICBAdHJhbnMuc2hvdWxkIGJlX29wZW4KLSAgICAgIEBpbnB1dC5zdHViISg6Y2xvc2VkPykuYW5kX3JldHVybihmYWxzZSkKLSAgICAgIEBvdXRwdXQuc3R1YiEoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKLSAgICAgIEB0cmFucy5zaG91bGQgYmVfb3BlbgotICAgICAgQGlucHV0LnN0dWIhKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCi0gICAgICBAdHJhbnMuc2hvdWxkX25vdCBiZV9vcGVuCisgICAgICBleHBlY3QoQHRyYW5zKS50byBiZV9vcGVuCisgICAgICBhbGxvdyhAaW5wdXQpLnRvIHJlY2VpdmUoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIGJlX29wZW4KKyAgICAgIGFsbG93KEBpbnB1dCkudG8gcmVjZWl2ZSg6Y2xvc2VkPykuYW5kX3JldHVybihmYWxzZSkKKyAgICAgIGFsbG93KEBvdXRwdXQpLnRvIHJlY2VpdmUoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIGJlX29wZW4KKyAgICAgIGFsbG93KEBpbnB1dCkudG8gcmVjZWl2ZSg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQorICAgICAgZXhwZWN0KEB0cmFucykubm90X3RvIGJlX29wZW4KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcGFzcyB0aHJvdWdoIHJlYWQvd3JpdGUgdG8gaW5wdXQvb3V0cHV0IiBkbwotICAgICAgQGlucHV0LnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKDE3KS5hbmRfcmV0dXJuKCIrIHJlYWQiKQotICAgICAgQG91dHB1dC5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZvb2JhciIpLmFuZF9yZXR1cm4oIisgd3JpdGUiKQotICAgICAgQHRyYW5zLnJlYWQoMTcpLnNob3VsZCA9PSAiKyByZWFkIgotICAgICAgQHRyYW5zLndyaXRlKCJmb29iYXIiKS5zaG91bGQgPT0gIisgd3JpdGUiCisgICAgICBleHBlY3QoQGlucHV0KS50byByZWNlaXZlKDpyZWFkKS53aXRoKDE3KS5hbmRfcmV0dXJuKCIrIHJlYWQiKQorICAgICAgZXhwZWN0KEBvdXRwdXQpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJmb29iYXIiKS5hbmRfcmV0dXJuKCIrIHdyaXRlIikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZCgxNykpLnRvIGVxKCIrIHJlYWQiKQorICAgICAgZXhwZWN0KEB0cmFucy53cml0ZSgiZm9vYmFyIikpLnRvIGVxKCIrIHdyaXRlIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY2xvc2UgYm90aCBpbnB1dCBhbmQgb3V0cHV0IHdoZW4gY2xvc2VkIiBkbwotICAgICAgQGlucHV0LnNob3VsZF9yZWNlaXZlKDpjbG9zZSkKLSAgICAgIEBvdXRwdXQuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKQorICAgICAgZXhwZWN0KEBpbnB1dCkudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBleHBlY3QoQG91dHB1dCkudG8gcmVjZWl2ZSg6Y2xvc2UpCiAgICAgICBAdHJhbnMuY2xvc2UKICAgICBlbmQKICAgZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZF9zcGVjLnJiCmluZGV4IGI4NTE4YzguLmIyY2QwNGIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZF9zcGVjLnJiCkBAIC0xNywzMCArMTcsMzAgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL2JpbmFyeV9wcm90b2NvbF9zcGVjX3NoYXJlZCcKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJworcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKCIje0ZpbGUuZGlybmFtZShfX0ZJTEVfXyl9L2JpbmFyeV9wcm90b2NvbF9zcGVjX3NoYXJlZCIpCiAKIGlmIGRlZmluZWQ/IFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZAogCi0gIGNsYXNzIFRocmlmdEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRTcGVjIDwgU3BlYzo6RXhhbXBsZUdyb3VwCi0gICAgaW5jbHVkZSBUaHJpZnQKKyAgZGVzY3JpYmUgJ0JpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQnIGRvCisgICAgIyBzaW5jZSBCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIHNob3VsZCBiZSBkaXJlY3RseSBlcXVpdmFsZW50IHRvCisgICAgIyBCaW5hcnlQcm90b2NvbCwgd2UgZG9uJ3QgbmVlZCBhbnkgY3VzdG9tIHNwZWNzIQorICAgIGl0X3Nob3VsZF9iZWhhdmVfbGlrZSAnYSBiaW5hcnkgcHJvdG9jb2wnCiAKLSAgICBkZXNjcmliZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgZG8KLSAgICAgICMgc2luY2UgQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBzaG91bGQgYmUgZGlyZWN0bHkgZXF1aXZhbGVudCB0byAKLSAgICAgICMgQmluYXJ5UHJvdG9jb2wsIHdlIGRvbid0IG5lZWQgYW55IGN1c3RvbSBzcGVjcyEKLSAgICAgIGl0X3Nob3VsZF9iZWhhdmVfbGlrZSAnYSBiaW5hcnkgcHJvdG9jb2wnCi0KLSAgICAgIGRlZiBwcm90b2NvbF9jbGFzcwotICAgICAgICBCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkCi0gICAgICBlbmQKKyAgICBkZWYgcHJvdG9jb2xfY2xhc3MKKyAgICAgIFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZAogICAgIGVuZAogCi0gICAgZGVzY3JpYmUgQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkgZG8KKyAgICBkZXNjcmliZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5IGRvCiAgICAgICBpdCAic2hvdWxkIGNyZWF0ZSBhIEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQiIGRvCi0gICAgICAgIEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2wobW9jaygiTW9ja1RyYW5zcG9ydCIpKS5zaG91bGQgYmVfaW5zdGFuY2Vfb2YoQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkKKyAgICAgICAgZXhwZWN0KFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChkb3VibGUoIk1vY2tUcmFuc3BvcnQiKSkpLnRvIGJlX2luc3RhbmNlX29mKFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkKKyAgICAgIGVuZAorCisgICAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5Lm5ldy50b19zKS50byBlcSgiYmluYXJ5LWFjY2VsIikKICAgICAgIGVuZAogICAgIGVuZAogICBlbmQKIGVsc2UKICAgcHV0cyAic2tpcHBpbmcgQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBzcGVjIGJlY2F1c2UgaXQgaXMgbm90IGRlZmluZWQuIgotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9zcGVjLnJiCmluZGV4IDZkYTQ2N2UuLjA2NWY1Y2UgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9zcGVjLnJiCkBAIC0xNyw0NSArMTcsNTggQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL2JpbmFyeV9wcm90b2NvbF9zcGVjX3NoYXJlZCcKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJworcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKCIje0ZpbGUuZGlybmFtZShfX0ZJTEVfXyl9L2JpbmFyeV9wcm90b2NvbF9zcGVjX3NoYXJlZCIpCiAKLWNsYXNzIFRocmlmdEJpbmFyeVByb3RvY29sU3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAorZGVzY3JpYmUgJ0JpbmFyeVByb3RvY29sJyBkbwogCi0gIGRlc2NyaWJlIEJpbmFyeVByb3RvY29sIGRvCi0gICAgaXRfc2hvdWxkX2JlaGF2ZV9saWtlICdhIGJpbmFyeSBwcm90b2NvbCcKKyAgaXRfc2hvdWxkX2JlaGF2ZV9saWtlICdhIGJpbmFyeSBwcm90b2NvbCcKIAotICAgIGRlZiBwcm90b2NvbF9jbGFzcwotICAgICAgQmluYXJ5UHJvdG9jb2wKKyAgZGVmIHByb3RvY29sX2NsYXNzCisgICAgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbAorICBlbmQKKworICBkZXNjcmliZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sIGRvCisKKyAgICBiZWZvcmUoOmVhY2gpIGRvCisgICAgICBAdHJhbnMgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcKKyAgICAgIEBwcm90ID0gcHJvdG9jb2xfY2xhc3MubmV3KEB0cmFucykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBhIG1lc3NhZ2UgaGVhZGVyIiBkbwogICAgICAgQHRyYW5zLndyaXRlKFtwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlZFUlNJT05fMSkgfCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6UkVQTFldLnBhY2soJ04nKSkKICAgICAgIEB0cmFucy53cml0ZShbNDJdLnBhY2soJ04nKSkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigndGVzdE1lc3NhZ2UnKQotICAgICAgQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luLnNob3VsZCA9PSBbJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OlJFUExZLCA0Ml0KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmFuZF9yZXR1cm4oJ3Rlc3RNZXNzYWdlJykKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4pLnRvIGVxKFsndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6UkVQTFksIDQyXSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXNzYWdlIGhlYWRlciBoYXMgdGhlIHdyb25nIHZlcnNpb24iIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4oLTEpCi0gICAgICBsYW1iZGEgeyBAcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4gfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiwgJ01pc3NpbmcgdmVyc2lvbiBpZGVudGlmaWVyJykgZG8gfGV8CisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKC0xKQorICAgICAgZXhwZWN0IHsgQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiwgJ01pc3NpbmcgdmVyc2lvbiBpZGVudGlmaWVyJykgZG8gfGV8CiAgICAgICAgIGUudHlwZSA9PSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTgogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZSBoZWFkZXIgZG9lcyBub3QgZXhpc3QgYW5kIHN0cmljdF9yZWFkIGlzIGVuYWJsZWQiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4oNDIpCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6c3RyaWN0X3JlYWQpLmFuZF9yZXR1cm4odHJ1ZSkKLSAgICAgIGxhbWJkYSB7IEBwcm90LnJlYWRfbWVzc2FnZV9iZWdpbiB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLCAnTm8gdmVyc2lvbiBpZGVudGlmaWVyLCBvbGQgcHJvdG9jb2wgY2xpZW50PycpIGRvIHxlfCAgICAgICAgCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKDQyKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpzdHJpY3RfcmVhZCkuYW5kX3JldHVybih0cnVlKQorICAgICAgZXhwZWN0IHsgQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiwgJ05vIHZlcnNpb24gaWRlbnRpZmllciwgb2xkIHByb3RvY29sIGNsaWVudD8nKSBkbyB8ZXwKICAgICAgICAgZS50eXBlID09IFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OCiAgICAgICBlbmQKICAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAcHJvdC50b19zKS50byBlcSgiYmluYXJ5KG1lbW9yeSkiKQorICAgIGVuZAogICBlbmQKIAotICBkZXNjcmliZSBCaW5hcnlQcm90b2NvbEZhY3RvcnkgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkgZG8KICAgICBpdCAic2hvdWxkIGNyZWF0ZSBhIEJpbmFyeVByb3RvY29sIiBkbwotICAgICAgQmluYXJ5UHJvdG9jb2xGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2wobW9jaygiTW9ja1RyYW5zcG9ydCIpKS5zaG91bGQgYmVfaW5zdGFuY2Vfb2YoQmluYXJ5UHJvdG9jb2wpCisgICAgICBleHBlY3QoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChkb3VibGUoIk1vY2tUcmFuc3BvcnQiKSkpLnRvIGJlX2luc3RhbmNlX29mKFRocmlmdDo6QmluYXJ5UHJvdG9jb2wpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJiaW5hcnkiKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWNfc2hhcmVkLnJiIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWNfc2hhcmVkLnJiCmluZGV4IDI4ZGE3NjAuLjU4ZDY1ZjAgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9zcGVjX3NoYXJlZC5yYgorKysgYi9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlY19zaGFyZWQucmIKQEAgLTEsMyArMSw0IEBACisjIGVuY29kaW5nOiBhc2NpaS04Yml0CiAjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTE3LDcgKzE4LDcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAogc2hhcmVkX2V4YW1wbGVzX2ZvciAnYSBiaW5hcnkgcHJvdG9jb2wnIGRvCiAgIGJlZm9yZSg6ZWFjaCkgZG8KQEAgLTI2LDM0ICsyNywzNCBAQAogICBlbmQKIAogICBpdCAic2hvdWxkIGRlZmluZSB0aGUgcHJvcGVyIFZFUlNJT05fMSwgVkVSU0lPTl9NQVNLIEFORCBUWVBFX01BU0siIGRvCi0gICAgcHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OX01BU0spLnNob3VsZCA9PSAweGZmZmYwMDAwCi0gICAgcHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OXzEpLnNob3VsZCA9PSAweDgwMDEwMDAwCi0gICAgcHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpUWVBFX01BU0spLnNob3VsZCA9PSAweDAwMDAwMGZmCisgICAgZXhwZWN0KHByb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VkVSU0lPTl9NQVNLKSkudG8gZXEoMHhmZmZmMDAwMCkKKyAgICBleHBlY3QocHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OXzEpKS50byBlcSgweDgwMDEwMDAwKQorICAgIGV4cGVjdChwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlRZUEVfTUFTSykpLnRvIGVxKDB4MDAwMDAwZmYpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgbWFrZSBzdHJpY3RfcmVhZCByZWFkYWJsZSIgZG8KLSAgICBAcHJvdC5zdHJpY3RfcmVhZC5zaG91bGQgZXFsKHRydWUpCisgICAgZXhwZWN0KEBwcm90LnN0cmljdF9yZWFkKS50byBlcWwodHJ1ZSkKICAgZW5kCiAKICAgaXQgInNob3VsZCBtYWtlIHN0cmljdF93cml0ZSByZWFkYWJsZSIgZG8KLSAgICBAcHJvdC5zdHJpY3Rfd3JpdGUuc2hvdWxkIGVxbCh0cnVlKQorICAgIGV4cGVjdChAcHJvdC5zdHJpY3Rfd3JpdGUpLnRvIGVxbCh0cnVlKQogICBlbmQgICAgCiAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgbWVzc2FnZSBoZWFkZXIiIGRvCiAgICAgQHByb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMTcpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09IFtwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlZFUlNJT05fMSkgfCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgInRlc3RNZXNzYWdlIi5zaXplLCAidGVzdE1lc3NhZ2UiLCAxN10ucGFjaygiTk5hMTFOIikKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKFtwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlZFUlNJT05fMSkgfCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgInRlc3RNZXNzYWdlIi5zaXplLCAidGVzdE1lc3NhZ2UiLCAxN10ucGFjaygiTk5hMTFOIikpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgbWVzc2FnZSBoZWFkZXIgd2l0aG91dCB2ZXJzaW9uIHdoZW4gd3JpdGVzIGFyZSBub3Qgc3RyaWN0IiBkbwogICAgIEBwcm90ID0gcHJvdG9jb2xfY2xhc3MubmV3KEB0cmFucywgdHJ1ZSwgZmFsc2UpICMgbm8gc3RyaWN0IHdyaXRlCiAgICAgQHByb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMTcpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcMDAwXDAwMFwwMDBcdnRlc3RNZXNzYWdlXDAwMVwwMDBcMDAwXDAwMFwwMjEiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDFcMDAwXDAwMFwwMDBcMDIxIikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBtZXNzYWdlIGhlYWRlciB3aXRoIGEgdmVyc2lvbiB3aGVuIHdyaXRlcyBhcmUgc3RyaWN0IiBkbwogICAgIEBwcm90ID0gcHJvdG9jb2xfY2xhc3MubmV3KEB0cmFucykgIyBzdHJpY3Qgd3JpdGUKICAgICBAcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAxNykKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwyMDBcMDAxXDAwMFwwMDFcMDAwXDAwMFwwMDBcdnRlc3RNZXNzYWdlXDAwMFwwMDBcMDAwXDAyMSIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcMjAwXDAwMVwwMDBcMDAxXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDBcMDAwXDAwMFwwMjEiKQogICBlbmQKICAgCiAKQEAgLTYxLDY0ICs2Miw2NyBAQAogCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIGZpZWxkIGhlYWRlciIgZG8KICAgICBAcHJvdC53cml0ZV9maWVsZF9iZWdpbignZm9vJywgVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAzKQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAzXS5wYWNrKCJjbiIpCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAzXS5wYWNrKCJjbiIpKQogICBlbmQKICAgCiAgICMgZmllbGQgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgU1RPUCBmaWVsZCIgZG8KICAgICBAcHJvdC53cml0ZV9maWVsZF9zdG9wCi0gICAgQHRyYW5zLnJlYWQoMSkuc2hvdWxkID09ICJcMDAwIgorICAgIGV4cGVjdChAdHJhbnMucmVhZCgxKSkudG8gZXEoIlwwMDAiKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIG1hcCBoZWFkZXIiIGRvCiAgICAgQHByb3Qud3JpdGVfbWFwX2JlZ2luKFRocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6TElTVCwgMTcpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09IFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OkxJU1QsIDE3XS5wYWNrKCJjY04iKTsKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OkxJU1QsIDE3XS5wYWNrKCJjY04iKSk7CiAgIGVuZAogICAgCiAgICMgbWFwIGZvb3RlciBpcyBhIG5vb3AKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIGxpc3QgaGVhZGVyIiBkbwogICAgIEBwcm90LndyaXRlX2xpc3RfYmVnaW4oVGhyaWZ0OjpUeXBlczo6STE2LCA0MikKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OkkxNiwgNDJdLnBhY2soImNOIikKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKFtUaHJpZnQ6OlR5cGVzOjpJMTYsIDQyXS5wYWNrKCJjTiIpKQogICBlbmQKICAgCiAgICMgbGlzdCBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBzZXQgaGVhZGVyIiBkbwogICAgIEBwcm90LndyaXRlX3NldF9iZWdpbihUaHJpZnQ6OlR5cGVzOjpJMTYsIDQyKQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6STE2LCA0Ml0ucGFjaygiY04iKQorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoW1RocmlmdDo6VHlwZXM6OkkxNiwgNDJdLnBhY2soImNOIikpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSBhIGJvb2wiIGRvCiAgICAgQHByb3Qud3JpdGVfYm9vbCh0cnVlKQogICAgIEBwcm90LndyaXRlX2Jvb2woZmFsc2UpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcMDAxXDAwMCIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcMDAxXDAwMCIpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB0cmVhdCBhIG5pbCBib29sIGFzIGZhbHNlIiBkbwogICAgIEBwcm90LndyaXRlX2Jvb2wobmlsKQotICAgIEB0cmFucy5yZWFkKDEpLnNob3VsZCA9PSAiXDAwMCIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoMSkpLnRvIGVxKCJcMDAwIikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIGEgYnl0ZSIgZG8KICAgICAjIGJ5dGUgaXMgc21hbGwgZW5vdWdoLCBsZXQncyBjaGVjayAtMTI4Li4xMjcKICAgICAoLTEyOC4uMTI3KS5lYWNoIGRvIHxpfAogICAgICAgQHByb3Qud3JpdGVfYnl0ZShpKQotICAgICAgQHRyYW5zLnJlYWQoMSkuc2hvdWxkID09IFtpXS5wYWNrKCdjJykKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZCgxKSkudG8gZXEoW2ldLnBhY2soJ2MnKSkKICAgICBlbmQKLSAgICAjIGhhbmRpbmcgaXQgbnVtYmVycyBvdXQgb2Ygc2lnbmVkIHJhbmdlIHNob3VsZCBjbGlwCi0gICAgQHRyYW5zLnJzcGVjX3ZlcmlmeQorICBlbmQKKworICBpdCAic2hvdWxkIGNsaXAgbnVtYmVycyBvdXQgb2Ygc2lnbmVkIHJhbmdlIiBkbwogICAgICgxMjguLjI1NSkuZWFjaCBkbyB8aXwKICAgICAgIEBwcm90LndyaXRlX2J5dGUoaSkKLSAgICAgIEB0cmFucy5yZWFkKDEpLnNob3VsZCA9PSBbaV0ucGFjaygnYycpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoMSkpLnRvIGVxKFtpXS5wYWNrKCdjJykpCiAgICAgZW5kCi0gICAgIyBhbmQgbGFzdGx5LCBhIEJpZ251bSBpcyBnb2luZyB0byBlcnJvciBvdXQKLSAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9ieXRlKDIqKjY1KSB9LnNob3VsZCByYWlzZV9lcnJvcihSYW5nZUVycm9yKQorICBlbmQKKworICBpdCAiZXJyb3JzIG91dCB3aXRoIGEgQmlnbnVtIiBkbworICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2J5dGUoMioqNjUpIH0udG8gcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIGVycm9yIGdyYWNlZnVsbHkgd2hlbiB0cnlpbmcgdG8gd3JpdGUgYSBuaWwgYnl0ZSIgZG8KLSAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9ieXRlKG5pbCkgfS5zaG91bGQgcmFpc2VfZXJyb3IKKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9ieXRlKG5pbCkgfS50byByYWlzZV9lcnJvcgogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgYW4gaTE2IiBkbwpAQCAtMTMwLDE0ICsxMzQsMTQgQEAKICAgICAjIGFuZCB0cnkgc29tZXRoaW5nIG91dCBvZiBzaWduZWQgcmFuZ2UsIGl0IHNob3VsZCBjbGlwCiAgICAgQHByb3Qud3JpdGVfaTE2KDIqKjE1ICsgNSkKICAgICAKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwyMDBcMDAwXDM3NFwwMDBcMDAwXDAyMVwwMDBcMDAwXDMzMFwzNjBcMDA2XDI3M1wxNzdcMzc3XDIwMFwwMDUiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDIwMFwwMDBcMzc0XDAwMFwwMDBcMDIxXDAwMFwwMDBcMzMwXDM2MFwwMDZcMjczXDE3N1wzNzdcMjAwXDAwNSIpCiAgICAgCiAgICAgIyBhIEJpZ251bSBzaG91bGQgZXJyb3IKICAgICAjIGxhbWJkYSB7IEBwcm90LndyaXRlX2kxNigyKio2NSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIGVycm9yIGdyYWNlZnVsbHkgd2hlbiB0cnlpbmcgdG8gd3JpdGUgYSBuaWwgaTE2IiBkbwotICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX2kxNihuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfaTE2KG5pbCkgfS50byByYWlzZV9lcnJvcgogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgYW4gaTMyIiBkbwpAQCAtMTQ3LDE0ICsxNTEsMTQgQEAKICAgICAgIEBwcm90LndyaXRlX2kzMihpKQogICAgIGVuZAogICAgICMgdHJ5IHNvbWV0aGluZyBvdXQgb2Ygc2lnbmVkIHJhbmdlLCBpdCBzaG91bGQgY2xpcAotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXDIwMFwwMDBcMDAwXDAwMCIgKyAiXDM3N1wzNzZcMDM3XHIiICsgIlwzNzdcMzc3XDM2NlwwMzQiICsgIlwzNzdcMzc3XDM3N1wzNzUiICsgIlwwMDBcMDAwXDAwMFwwMDAiICsgIlwwMDAjXDM0MFwyMDMiICsgIlwwMDBcMDAwMCsiICsgIlwxNzdcMzc3XDM3N1wzNzciCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDIwMFwwMDBcMDAwXDAwMCIgKyAiXDM3N1wzNzZcMDM3XHIiICsgIlwzNzdcMzc3XDM2NlwwMzQiICsgIlwzNzdcMzc3XDM3N1wzNzUiICsgIlwwMDBcMDAwXDAwMFwwMDAiICsgIlwwMDAjXDM0MFwyMDMiICsgIlwwMDBcMDAwMCsiICsgIlwxNzdcMzc3XDM3N1wzNzciKQogICAgIFsyICoqIDMxICsgNSwgMiAqKiA2NSArIDVdLmVhY2ggZG8gfGl8Ci0gICAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9pMzIoaSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikgIAorICAgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfaTMyKGkpIH0udG8gcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikgIAogICAgIGVuZAogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgZXJyb3IgZ3JhY2VmdWxseSB3aGVuIHRyeWluZyB0byB3cml0ZSBhIG5pbCBpMzIiIGRvCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfaTMyKG5pbCkgfS5zaG91bGQgcmFpc2VfZXJyb3IKKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9pMzIobmlsKSB9LnRvIHJhaXNlX2Vycm9yCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSBhbiBpNjQiIGRvCkBAIC0xNjQsNyArMTY4LDcgQEAKICAgICAgIEBwcm90LndyaXRlX2k2NChpKQogICAgIGVuZAogICAgICMgdHJ5IHNvbWV0aGluZyBvdXQgb2Ygc2lnbmVkIHJhbmdlLCBpdCBzaG91bGQgY2xpcAotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSBbIlwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIiwKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKFsiXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAiLAogICAgICAgIlwzNzdcMzc3XDM2NFwzMDNcMDM1XDI0NCtdIiwKICAgICAgICJcMzc3XDM3N1wzNzdcMzc3XDM3NlwyMzE6XDM0MSIsCiAgICAgICAiXDM3N1wzNzdcMzc3XDM3N1wzNzdcMzc3XDM3N1wwMjYiLApAQCAtMTcyLDEyICsxNzYsMTIgQEAKICAgICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDA0XDMxNyIsCiAgICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDAjXDM0MFwyMDQiLAogICAgICAgIlwwMDBcMDAwXDAwMFwwMDJcMzQwXDMxMX5cMzY1IiwKLSAgICAgICJcMTc3XDM3N1wzNzdcMzc3XDM3N1wzNzdcMzc3XDM3NyJdLmpvaW4oIiIpCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfaTY0KDIgKiogNjUgKyA1KSB9LnNob3VsZCByYWlzZV9lcnJvcihSYW5nZUVycm9yKQorICAgICAgIlwxNzdcMzc3XDM3N1wzNzdcMzc3XDM3N1wzNzdcMzc3Il0uam9pbigiIikpCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfaTY0KDIgKiogNjUgKyA1KSB9LnRvIHJhaXNlX2Vycm9yKFJhbmdlRXJyb3IpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCBlcnJvciBncmFjZWZ1bGx5IHdoZW4gdHJ5aW5nIHRvIHdyaXRlIGEgbmlsIGk2NCIgZG8KLSAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9pNjQobmlsKSB9LnNob3VsZCByYWlzZV9lcnJvcgorICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2k2NChuaWwpIH0udG8gcmFpc2VfZXJyb3IKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIGEgZG91YmxlIiBkbwpAQCAtMTg1LDgxICsxODksMTI0IEBACiAgICAgdmFsdWVzID0gW0Zsb2F0OjpNSU4sLTEyMzEuMTUzMjUsIC0xMjMxMjMuMjMsIC0yMy4yMzUxNTEyMywgMCwgMTIzNTEuMTMyNSwgNTIzLjIzLCBGbG9hdDo6TUFYXQogICAgIHZhbHVlcy5lYWNoIGRvIHxmfAogICAgICAgQHByb3Qud3JpdGVfZG91YmxlKGYpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gW2ZdLnBhY2soIkciKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbZl0ucGFjaygiRyIpKQogICAgIGVuZAogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgZXJyb3IgZ3JhY2VmdWxseSB3aGVuIHRyeWluZyB0byB3cml0ZSBhIG5pbCBkb3VibGUiIGRvCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfZG91YmxlKG5pbCkgfS5zaG91bGQgcmFpc2VfZXJyb3IKKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9kb3VibGUobmlsKSB9LnRvIHJhaXNlX2Vycm9yCiAgIGVuZAotICAKLSAgaXQgInNob3VsZCB3cml0ZSBhIHN0cmluZyIgZG8KLSAgICBzdHIgPSAiaGVsbG8gd29ybGQiCi0gICAgQHByb3Qud3JpdGVfc3RyaW5nKHN0cikKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gW3N0ci5zaXplXS5wYWNrKCJOIikgKyBzdHIKKworICBpZiBSVUJZX1ZFUlNJT04gPj0gJzEuOScKKyAgICBpdCAnc2hvdWxkIHdyaXRlIGEgc3RyaW5nJyBkbworICAgICAgc3RyID0gJ2FiYycKKyAgICAgIEBwcm90LndyaXRlX3N0cmluZyhzdHIpCisgICAgICBhID0gQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkKKyAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHg2MSwgMHg2MiwgMHg2M10pCisgICAgZW5kCisKKyAgICBpdCAnc2hvdWxkIHdyaXRlIGEgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzJyBkbworICAgICAgc3RyID0gImFiYyBcdTIwQUMgXHUyMEFEIi5lbmNvZGUoJ1VURi04JykKKyAgICAgIEBwcm90LndyaXRlX3N0cmluZyhzdHIpCisgICAgICBhID0gQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkKKyAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwQiwgMHg2MSwgMHg2MiwgMHg2MywgMHgyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMiwgMHg4MiwgMHhBQywgMHgyMCwgMHhFMiwgMHg4MiwgMHhBRF0pCisgICAgZW5kCisKKyAgICBpdCAnc2hvdWxkIHdyaXRlIHNob3VsZCB3cml0ZSBhIHN0cmluZyB3aXRoIHVuaWNvZGUgY2hhcmFjdGVycyBhbmQgdHJhbnNjb2RpbmcnIGRvCisgICAgICBzdHIgPSAiYWJjIFx1MjBBQyIuZW5jb2RlKCdJU08tODg1OS0xNScpCisgICAgICBAcHJvdC53cml0ZV9zdHJpbmcoc3RyKQorICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCisgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgIGV4cGVjdChhLnVucGFjaygnQyonKSkudG8gZXEoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NjEsIDB4NjIsIDB4NjMsIDB4MjAsIDB4RTIsIDB4ODIsIDB4QUNdKQorICAgIGVuZAorCisgICAgaXQgJ3Nob3VsZCB3cml0ZSBhIGJpbmFyeSBzdHJpbmcnIGRvCisgICAgICBidWZmZXIgPSBbMCwgMSwgMiwgM10ucGFjaygnQyonKQorICAgICAgQHByb3Qud3JpdGVfYmluYXJ5KGJ1ZmZlcikKKyAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQorICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDAzXSkKKyAgICBlbmQKKyAgZWxzZQorICAgIGl0ICdzaG91bGQgd3JpdGUgYSBzdHJpbmcnIGRvCisgICAgICBzdHIgPSAnYWJjJworICAgICAgQHByb3Qud3JpdGVfc3RyaW5nKHN0cikKKyAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQorICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHg2MSwgMHg2MiwgMHg2M10pCisgICAgZW5kCisKKyAgICBpdCAnc2hvdWxkIHdyaXRlIGEgYmluYXJ5IHN0cmluZycgZG8KKyAgICAgIGJ1ZmZlciA9IFswLCAxLCAyLCAzXS5wYWNrKCdDKicpCisgICAgICBAcHJvdC53cml0ZV9iaW5hcnkoYnVmZmVyKQorICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCisgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDAzXSkKKyAgICBlbmQKICAgZW5kCi0gIAorCiAgIGl0ICJzaG91bGQgZXJyb3IgZ3JhY2VmdWxseSB3aGVuIHRyeWluZyB0byB3cml0ZSBhIG5pbCBzdHJpbmciIGRvCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfc3RyaW5nKG5pbCkgfS5zaG91bGQgcmFpc2VfZXJyb3IKKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9zdHJpbmcobmlsKSB9LnRvIHJhaXNlX2Vycm9yCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgbWVzc2FnZSBoZWFkZXIgd2l0aG91dCB2ZXJzaW9uIHdoZW4gd3JpdGVzIGFyZSBub3Qgc3RyaWN0IiBkbwogICAgIEBwcm90ID0gcHJvdG9jb2xfY2xhc3MubmV3KEB0cmFucywgdHJ1ZSwgZmFsc2UpICMgbm8gc3RyaWN0IHdyaXRlCiAgICAgQHByb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMTcpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcMDAwXDAwMFwwMDBcdnRlc3RNZXNzYWdlXDAwMVwwMDBcMDAwXDAwMFwwMjEiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDFcMDAwXDAwMFwwMDBcMDIxIikKICAgZW5kCiAgICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIG1lc3NhZ2UgaGVhZGVyIHdpdGggYSB2ZXJzaW9uIHdoZW4gd3JpdGVzIGFyZSBzdHJpY3QiIGRvCiAgICAgQHByb3QgPSBwcm90b2NvbF9jbGFzcy5uZXcoQHRyYW5zKSAjIHN0cmljdCB3cml0ZQogICAgIEBwcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDE3KQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXDIwMFwwMDFcMDAwXDAwMVwwMDBcMDAwXDAwMFx2dGVzdE1lc3NhZ2VcMDAwXDAwMFwwMDBcMDIxIgorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwyMDBcMDAxXDAwMFwwMDFcMDAwXDAwMFwwMDBcdnRlc3RNZXNzYWdlXDAwMFwwMDBcMDAwXDAyMSIpCiAgIGVuZAogICAKICAgIyBtZXNzYWdlIGZvb3RlciBpcyBhIG5vb3AKICAgCiAgIGl0ICJzaG91bGQgcmVhZCBhIGZpZWxkIGhlYWRlciIgZG8KICAgICBAdHJhbnMud3JpdGUoW1RocmlmdDo6VHlwZXM6OlNUUklORywgM10ucGFjaygiY24iKSkKLSAgICBAcHJvdC5yZWFkX2ZpZWxkX2JlZ2luLnNob3VsZCA9PSBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDNdCisgICAgZXhwZWN0KEBwcm90LnJlYWRfZmllbGRfYmVnaW4pLnRvIGVxKFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUUklORywgM10pCiAgIGVuZAogICAKICAgIyBmaWVsZCBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHJlYWQgYSBzdG9wIGZpZWxkIiBkbwogICAgIEB0cmFucy53cml0ZShbVGhyaWZ0OjpUeXBlczo6U1RPUF0ucGFjaygiYyIpKTsKLSAgICBAcHJvdC5yZWFkX2ZpZWxkX2JlZ2luLnNob3VsZCA9PSBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXQorICAgIGV4cGVjdChAcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKS50byBlcShbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXSkKICAgZW5kCiAKICAgaXQgInNob3VsZCByZWFkIGEgbWFwIGhlYWRlciIgZG8KICAgICBAdHJhbnMud3JpdGUoW1RocmlmdDo6VHlwZXM6OkRPVUJMRSwgVGhyaWZ0OjpUeXBlczo6STY0LCA0Ml0ucGFjaygiY2NOIikpCi0gICAgQHByb3QucmVhZF9tYXBfYmVnaW4uc2hvdWxkID09IFtUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIFRocmlmdDo6VHlwZXM6Okk2NCwgNDJdCisgICAgZXhwZWN0KEBwcm90LnJlYWRfbWFwX2JlZ2luKS50byBlcShbVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCBUaHJpZnQ6OlR5cGVzOjpJNjQsIDQyXSkKICAgZW5kCiAgIAogICAjIG1hcCBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHJlYWQgYSBsaXN0IGhlYWRlciIgZG8KICAgICBAdHJhbnMud3JpdGUoW1RocmlmdDo6VHlwZXM6OlNUUklORywgMTddLnBhY2soImNOIikpCi0gICAgQHByb3QucmVhZF9saXN0X2JlZ2luLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxN10KKyAgICBleHBlY3QoQHByb3QucmVhZF9saXN0X2JlZ2luKS50byBlcShbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxN10pCiAgIGVuZAogICAKICAgIyBsaXN0IGZvb3RlciBpcyBhIG5vb3AKICAgCiAgIGl0ICJzaG91bGQgcmVhZCBhIHNldCBoZWFkZXIiIGRvCiAgICAgQHRyYW5zLndyaXRlKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDE3XS5wYWNrKCJjTiIpKQotICAgIEBwcm90LnJlYWRfc2V0X2JlZ2luLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxN10KKyAgICBleHBlY3QoQHByb3QucmVhZF9zZXRfYmVnaW4pLnRvIGVxKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDE3XSkKICAgZW5kCiAgIAogICAjIHNldCBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHJlYWQgYSBib29sIiBkbwogICAgIEB0cmFucy53cml0ZSgiXDAwMVwwMDAiKTsKLSAgICBAcHJvdC5yZWFkX2Jvb2wuc2hvdWxkID09IHRydWUKLSAgICBAcHJvdC5yZWFkX2Jvb2wuc2hvdWxkID09IGZhbHNlCisgICAgZXhwZWN0KEBwcm90LnJlYWRfYm9vbCkudG8gZXEodHJ1ZSkKKyAgICBleHBlY3QoQHByb3QucmVhZF9ib29sKS50byBlcShmYWxzZSkKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHJlYWQgYSBieXRlIiBkbwogICAgIFstMTI4LCAtNTcsIC0zLCAwLCAxNywgMjQsIDEyN10uZWFjaCBkbyB8aXwKICAgICAgIEB0cmFucy53cml0ZShbaV0ucGFjaygiYyIpKQotICAgICAgQHByb3QucmVhZF9ieXRlLnNob3VsZCA9PSBpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9ieXRlKS50byBlcShpKQogICAgIGVuZAogICBlbmQKICAgCkBAIC0yNjcsNyArMzE0LDcgQEAKICAgICAjIHRyeSBhIHNjYXR0ZXJpbmcgb2YgdmFsdWVzLCBpbmNsdWRpbmcgbWluL21heAogICAgIFstMioqMTUsIC01MjM3LCAtMzUzLCAwLCAxNTI3LCAyMjM0LCAyKioxNS0xXS5lYWNoIGRvIHxpfAogICAgICAgQHRyYW5zLndyaXRlKFtpXS5wYWNrKCJuIikpOwotICAgICAgQHByb3QucmVhZF9pMTYuc2hvdWxkID09IGkKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2kxNikudG8gZXEoaSkKICAgICBlbmQKICAgZW5kCiAgIApAQCAtMjc1LDcgKzMyMiw3IEBACiAgICAgIyB0cnkgYSBzY2F0dGVyaW5nIG9mIHZhbHVlcywgaW5jbHVkaW5nIG1pbi9tYXgKICAgICBbLTIqKjMxLCAtMjM1MTI1LCAtNjIzNiwgMCwgMjM1MSwgMTIzMTIzLCAyKiozMS0xXS5lYWNoIGRvIHxpfAogICAgICAgQHRyYW5zLndyaXRlKFtpXS5wYWNrKCJOIikpCi0gICAgICBAcHJvdC5yZWFkX2kzMi5zaG91bGQgPT0gaQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfaTMyKS50byBlcShpKQogICAgIGVuZAogICBlbmQKICAgCkBAIC0yODMsNyArMzMwLDcgQEAKICAgICAjIHRyeSBhIHNjYXR0ZXJpbmcgb2YgdmFsdWVzLCBpbmNsdWRpbmcgbWluL21heAogICAgIFstMioqNjMsIC0xMjM1MTIzMTIsIC02MzQ2LCAwLCAzMiwgMjM0NjMyMjMyMywgMioqNjMtMV0uZWFjaCBkbyB8aXwKICAgICAgIEB0cmFucy53cml0ZShbaSA+PiAzMiwgaSAmIDB4RkZGRkZGRkZdLnBhY2soIk5OIikpCi0gICAgICBAcHJvdC5yZWFkX2k2NC5zaG91bGQgPT0gaQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfaTY0KS50byBlcShpKQogICAgIGVuZAogICBlbmQKICAgCkBAIC0yOTEsMjcgKzMzOCw2MyBAQAogICAgICMgdHJ5IGEgcmFuZG9tIHNjYXR0ZXJpbmcgb2YgdmFsdWVzLCBpbmNsdWRpbmcgbWluL21heAogICAgIFtGbG9hdDo6TUlOLCAtMjMxMjMxLjEyMzUxLCAtMzIzLjIzMzUxMywgMCwgMTIzLjIzNTEyMzUsIDIzNTEyMzUuMTIzNTEyMzUsIEZsb2F0OjpNQVhdLmVhY2ggZG8gfGZ8CiAgICAgICBAdHJhbnMud3JpdGUoW2ZdLnBhY2soIkciKSk7Ci0gICAgICBAcHJvdC5yZWFkX2RvdWJsZS5zaG91bGQgPT0gZgorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfZG91YmxlKS50byBlcShmKQogICAgIGVuZAogICBlbmQKLSAgCi0gIGl0ICJzaG91bGQgcmVhZCBhIHN0cmluZyIgZG8KLSAgICBzdHIgPSAiaGVsbG8gd29ybGQiCi0gICAgQHRyYW5zLndyaXRlKFtzdHIuc2l6ZV0ucGFjaygiTiIpICsgc3RyKQotICAgIEBwcm90LnJlYWRfc3RyaW5nLnNob3VsZCA9PSBzdHIKKworICBpZiBSVUJZX1ZFUlNJT04gPj0gJzEuOScKKyAgICBpdCAnc2hvdWxkIHJlYWQgYSBzdHJpbmcnIGRvCisgICAgICAjIGkzMiBvZiB2YWx1ZSAzLCBmb2xsb3dlZCBieSB0aHJlZSBjaGFyYWN0ZXJzL1VURi04IGJ5dGVzICdhJywgJ2InLCAnYycKKyAgICAgIGJ1ZmZlciA9IFsweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDYxLCAweDYyLCAweDYzXS5wYWNrKCdDKicpCisgICAgICBAdHJhbnMud3JpdGUoYnVmZmVyKQorICAgICAgYSA9IEBwcm90LnJlYWRfc3RyaW5nCisgICAgICBleHBlY3QoYSkudG8gZXEoJ2FiYycuZW5jb2RlKCdVVEYtOCcpKQorICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpVVEZfOCkKKyAgICBlbmQKKworICAgIGl0ICdzaG91bGQgcmVhZCBhIHN0cmluZyBjb250YWluaW5nIHVuaWNvZGUgY2hhcmFjdGVycyBmcm9tIFVURi04IGVuY29kZWQgYnVmZmVyJyBkbworICAgICAgIyBpMzIgb2YgdmFsdWUgMywgZm9sbG93ZWQgYnkgb25lIGNoYXJhY3RlciBVKzIwQUMgbWFkZSB1cCBvZiB0aHJlZSBieXRlcworICAgICAgYnVmZmVyID0gWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4RTIsIDB4ODIsIDB4QUNdLnBhY2soJ0MqJykKKyAgICAgIEB0cmFucy53cml0ZShidWZmZXIpCisgICAgICBhID0gQHByb3QucmVhZF9zdHJpbmcKKyAgICAgIGV4cGVjdChhKS50byBlcSgiXHUyMEFDIi5lbmNvZGUoJ1VURi04JykpCisgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OlVURl84KQorICAgIGVuZAorCisgICAgaXQgJ3Nob3VsZCByZWFkIGEgYmluYXJ5IHN0cmluZycgZG8KKyAgICAgIGJ1ZmZlciA9IFsweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDAzXS5wYWNrKCdDKicpCisgICAgICBAdHJhbnMud3JpdGUoYnVmZmVyKQorICAgICAgYSA9IEBwcm90LnJlYWRfYmluYXJ5CisgICAgICBleHBlY3QoYSkudG8gZXEoWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdLnBhY2soJ0MqJykpCisgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICBlbmQKKyAgZWxzZQorICAgIGl0ICdzaG91bGQgcmVhZCBhIHN0cmluZycgZG8KKyAgICAgICMgaTMyIG9mIHZhbHVlIDMsIGZvbGxvd2VkIGJ5IHRocmVlIGNoYXJhY3RlcnMvVVRGLTggYnl0ZXMgJ2EnLCAnYicsICdjJworICAgICAgYnVmZmVyID0gWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4NjEsIDB4NjIsIDB4NjNdLnBhY2soJ0MqJykKKyAgICAgIEB0cmFucy53cml0ZShidWZmZXIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9zdHJpbmcpLnRvIGVxKCdhYmMnKQorICAgIGVuZAorCisgICAgaXQgJ3Nob3VsZCByZWFkIGEgYmluYXJ5IHN0cmluZycgZG8KKyAgICAgIGJ1ZmZlciA9IFsweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDAzXS5wYWNrKCdDKicpCisgICAgICBAdHJhbnMud3JpdGUoYnVmZmVyKQorICAgICAgYSA9IEBwcm90LnJlYWRfYmluYXJ5CisgICAgICBleHBlY3QoYSkudG8gZXEoWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdLnBhY2soJ0MqJykpCisgICAgZW5kCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcGVyZm9ybSBhIGNvbXBsZXRlIHJwYyB3aXRoIG5vIGFyZ3Mgb3IgcmV0dXJuIiBkbwogICAgIHNydl90ZXN0KAogICAgICAgcHJvYyB7fGNsaWVudHwgY2xpZW50LnNlbmRfdm9pZE1ldGhvZCgpfSwKLSAgICAgIHByb2Mge3xjbGllbnR8IGNsaWVudC5yZWN2X3ZvaWRNZXRob2Quc2hvdWxkID09IG5pbH0KKyAgICAgIHByb2Mge3xjbGllbnR8IGV4cGVjdChjbGllbnQucmVjdl92b2lkTWV0aG9kKS50byBlcShuaWwpfQogICAgICkKICAgZW5kCiAKICAgaXQgInNob3VsZCBwZXJmb3JtIGEgY29tcGxldGUgcnBjIHdpdGggYSBwcmltaXRpdmUgcmV0dXJuIHR5cGUiIGRvCiAgICAgc3J2X3Rlc3QoCiAgICAgICBwcm9jIHt8Y2xpZW50fCBjbGllbnQuc2VuZF9wcmltaXRpdmVNZXRob2QoKX0sCi0gICAgICBwcm9jIHt8Y2xpZW50fCBjbGllbnQucmVjdl9wcmltaXRpdmVNZXRob2Quc2hvdWxkID09IDF9CisgICAgICBwcm9jIHt8Y2xpZW50fCBleHBlY3QoY2xpZW50LnJlY3ZfcHJpbWl0aXZlTWV0aG9kKS50byBlcSgxKX0KICAgICApCiAgIGVuZAogCkBAIC0zMjIsNyArNDA1LDcgQEAKICAgICAgICAgcmVzdWx0ID0gY2xpZW50LnJlY3Zfc3RydWN0TWV0aG9kCiAgICAgICAgIHJlc3VsdC5zZXRfYnl0ZV9tYXAgPSBuaWwKICAgICAgICAgcmVzdWx0Lm1hcF9ieXRlX21hcCA9IG5pbAotICAgICAgICByZXN1bHQuc2hvdWxkID09IEZpeHR1cmVzOjpDT01QQUNUX1BST1RPQ09MX1RFU1RfU1RSVUNUCisgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvIGVxKEZpeHR1cmVzOjpDT01QQUNUX1BST1RPQ09MX1RFU1RfU1RSVUNUKQogICAgICAgfQogICAgICkKICAgZW5kCkBAIC0zNDMsOSArNDI2LDkgQEAKICAgICBjbGllbnRwcm90byA9IHByb3RvY29sX2NsYXNzLm5ldyhjbGllbnRzaWRlKQogICAgIHNlcnZlcnByb3RvID0gcHJvdG9jb2xfY2xhc3MubmV3KHNlcnZlcnNpZGUpCiAKLSAgICBwcm9jZXNzb3IgPSBTcnY6OlByb2Nlc3Nvci5uZXcoU3J2SGFuZGxlci5uZXcpCisgICAgcHJvY2Vzc29yID0gVGhyaWZ0OjpUZXN0OjpTcnY6OlByb2Nlc3Nvci5uZXcoU3J2SGFuZGxlci5uZXcpCiAKLSAgICBjbGllbnQgPSBTcnY6OkNsaWVudC5uZXcoY2xpZW50cHJvdG8sIGNsaWVudHByb3RvKQorICAgIGNsaWVudCA9IFRocmlmdDo6VGVzdDo6U3J2OjpDbGllbnQubmV3KGNsaWVudHByb3RvLCBjbGllbnRwcm90bykKIAogICAgICMgZmlyc3QgYmxvY2sKICAgICBmaXJzdGJsb2NrLmNhbGwoY2xpZW50KQpkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvYnl0ZXNfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2J5dGVzX3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4NjUzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL2J5dGVzX3NwZWMucmIKQEAgLTAsMCArMSwxNjAgQEAKKyMgZW5jb2Rpbmc6IFVURi04CisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAnc3BlY19oZWxwZXInCisKK2Rlc2NyaWJlIFRocmlmdDo6Qnl0ZXMgZG8KKyAgaWYgUlVCWV9WRVJTSU9OID49ICcxLjknCisgICAgZGVzY3JpYmUgJy5lbXB0eV9ieXRlX2J1ZmZlcicgZG8KKyAgICAgIGl0ICdzaG91bGQgY3JlYXRlIGFuIGVtcHR5IGJ1ZmZlcicgZG8KKyAgICAgICAgYiA9IFRocmlmdDo6Qnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKKyAgICAgICAgZXhwZWN0KGIubGVuZ3RoKS50byBlcSgwKQorICAgICAgICBleHBlY3QoYi5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgIGVuZAorCisgICAgICBpdCAnc2hvdWxkIGNyZWF0ZSBhbiBlbXB0eSBidWZmZXIgb2YgZ2l2ZW4gc2l6ZScgZG8KKyAgICAgICAgYiA9IFRocmlmdDo6Qnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIgMgorICAgICAgICBleHBlY3QoYi5sZW5ndGgpLnRvIGVxKDIpCisgICAgICAgIGV4cGVjdChiLmdldGJ5dGUoMCkpLnRvIGVxKDApCisgICAgICAgIGV4cGVjdChiLmdldGJ5dGUoMSkpLnRvIGVxKDApCisgICAgICAgIGV4cGVjdChiLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZXNjcmliZSAnLmZvcmNlX2JpbmFyeV9lbmNvZGluZycgZG8KKyAgICAgIGl0ICdzaG91bGQgY2hhbmdlIGVuY29kaW5nJyBkbworICAgICAgICBlID0gJ1NUUklORycuZW5jb2RlKCdVVEYtOCcpCisgICAgICAgIGV4cGVjdChlLmVuY29kaW5nKS5ub3RfdG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgICAgYSA9IFRocmlmdDo6Qnl0ZXMuZm9yY2VfYmluYXJ5X2VuY29kaW5nIGUKKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlc2NyaWJlICcuZ2V0X3N0cmluZ19ieXRlJyBkbworICAgICAgaXQgJ3Nob3VsZCBnZXQgdGhlIGJ5dGUgYXQgaW5kZXgnIGRvCisgICAgICAgIHMgPSAiXHg0MVx4NDIiCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJ5dGVzLmdldF9zdHJpbmdfYnl0ZShzLCAwKSkudG8gZXEoMHg0MSkKKyAgICAgICAgZXhwZWN0KFRocmlmdDo6Qnl0ZXMuZ2V0X3N0cmluZ19ieXRlKHMsIDEpKS50byBlcSgweDQyKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZXNjcmliZSAnLnNldF9zdHJpbmdfYnl0ZScgZG8KKyAgICAgIGl0ICdzaG91bGQgc2V0IGJ5dGUgdmFsdWUgYXQgaW5kZXgnIGRvCisgICAgICAgIHMgPSAiXHg0MVx4NDIiCisgICAgICAgIFRocmlmdDo6Qnl0ZXMuc2V0X3N0cmluZ19ieXRlKHMsIDAsIDB4NDMpCisgICAgICAgIGV4cGVjdChzLmdldGJ5dGUoMCkpLnRvIGVxKDB4NDMpCisgICAgICAgIGV4cGVjdChzKS50byBlcSgnQ0InKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZXNjcmliZSAnLmNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcicgZG8KKyAgICAgIGl0ICdzaG91bGQgY29udmVydCBVVEYtOCBTdHJpbmcgdG8gYnl0ZSBidWZmZXInIGRvCisgICAgICAgIGUgPSAiXHUyMEFDIi5lbmNvZGUoJ1VURi04JykgIyBhIHN0cmluZyB3aXRoIGV1cm8gc2lnbiBjaGFyYWN0ZXIgVSsyMEFDCisgICAgICAgIGV4cGVjdChlLmxlbmd0aCkudG8gZXEoMSkKKworICAgICAgICBhID0gVGhyaWZ0OjpCeXRlcy5jb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIgZQorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgICAgZXhwZWN0KGEubGVuZ3RoKS50byBlcSgzKQorICAgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweEUyLCAweDgyLCAweEFDXSkKKyAgICAgIGVuZAorCisgICAgICBpdCAnc2hvdWxkIGNvbnZlcnQgSVNPLTg4NTktMTUgU3RyaW5nIHRvIFVURi04IGJ5dGUgYnVmZmVyJyBkbworICAgICAgICAjIEFzc3VtcHRpb25zCisgICAgICAgIGUgPSAiXHUyMEFDIi5lbmNvZGUoJ0lTTy04ODU5LTE1JykgIyBhIHN0cmluZyB3aXRoIGV1cm8gc2lnbiBjaGFyYWN0ZXIgVSsyMEFDLCB0aGVuIGNvbnZlcnRlZCB0byBJU08tODg1OS0xNQorICAgICAgICBleHBlY3QoZS5sZW5ndGgpLnRvIGVxKDEpCisgICAgICAgIGV4cGVjdChlLnVucGFjaygnQyonKSkudG8gZXEoWzB4QTRdKSAjIGV1cm8gc2lnbiBpcyBhIGRpZmZlcmVudCBjb2RlIHBvaW50IGluIElTTy04ODU5LTE1CisKKyAgICAgICAgYSA9IFRocmlmdDo6Qnl0ZXMuY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyIGUKKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICAgIGV4cGVjdChhLmxlbmd0aCkudG8gZXEoMykKKyAgICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHhFMiwgMHg4MiwgMHhBQ10pCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlc2NyaWJlICcuY29udmVydF90b19zdHJpbmcnIGRvCisgICAgICBpdCAnc2hvdWxkIGNvbnZlcnQgVVRGLTggYnl0ZSBidWZmZXIgdG8gYSBVVEYtOCBTdHJpbmcnIGRvCisgICAgICAgIGUgPSBbMHhFMiwgMHg4MiwgMHhBQ10ucGFjaygiQyoiKQorICAgICAgICBleHBlY3QoZS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgICAgYSA9IFRocmlmdDo6Qnl0ZXMuY29udmVydF90b19zdHJpbmcgZQorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OlVURl84KQorICAgICAgICBleHBlY3QoYSkudG8gZXEoIlx1MjBBQyIpCisgICAgICBlbmQKKyAgICBlbmQKKworICBlbHNlICMgUlVCWV9WRVJTSU9OCisgICAgZGVzY3JpYmUgJy5lbXB0eV9ieXRlX2J1ZmZlcicgZG8KKyAgICAgIGl0ICdzaG91bGQgY3JlYXRlIGFuIGVtcHR5IGJ1ZmZlcicgZG8KKyAgICAgICAgYiA9IFRocmlmdDo6Qnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKKyAgICAgICAgZXhwZWN0KGIubGVuZ3RoKS50byBlcSgwKQorICAgICAgZW5kCisKKyAgICAgIGl0ICdzaG91bGQgY3JlYXRlIGFuIGVtcHR5IGJ1ZmZlciBvZiBnaXZlbiBzaXplJyBkbworICAgICAgICBiID0gVGhyaWZ0OjpCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlciAyCisgICAgICAgIGV4cGVjdChiLmxlbmd0aCkudG8gZXEoMikKKyAgICAgICAgZXhwZWN0KGJbMF0pLnRvIGVxKDApCisgICAgICAgIGV4cGVjdChiWzFdKS50byBlcSgwKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZXNjcmliZSAnLmZvcmNlX2JpbmFyeV9lbmNvZGluZycgZG8KKyAgICAgIGl0ICdzaG91bGQgYmUgYSBuby1vcCcgZG8KKyAgICAgICAgZSA9ICdTVFJJTkcnCisgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmZvcmNlX2JpbmFyeV9lbmNvZGluZyBlCisgICAgICAgIGV4cGVjdChhKS50byBlcShlKQorICAgICAgICBleHBlY3QoYSkudG8gYmUoZSkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVzY3JpYmUgJy5nZXRfc3RyaW5nX2J5dGUnIGRvCisgICAgICBpdCAnc2hvdWxkIGdldCB0aGUgYnl0ZSBhdCBpbmRleCcgZG8KKyAgICAgICAgcyA9ICJceDQxXHg0MiIKKyAgICAgICAgZXhwZWN0KFRocmlmdDo6Qnl0ZXMuZ2V0X3N0cmluZ19ieXRlKHMsIDApKS50byBlcSgweDQxKQorICAgICAgICBleHBlY3QoVGhyaWZ0OjpCeXRlcy5nZXRfc3RyaW5nX2J5dGUocywgMSkpLnRvIGVxKDB4NDIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlc2NyaWJlICcuc2V0X3N0cmluZ19ieXRlJyBkbworICAgICAgaXQgJ3Nob3VsZCBzZXQgYnl0ZSB2YWx1ZSBhdCBpbmRleCcgZG8KKyAgICAgICAgcyA9ICJceDQxXHg0MiIKKyAgICAgICAgVGhyaWZ0OjpCeXRlcy5zZXRfc3RyaW5nX2J5dGUocywgMCwgMHg0MykKKyAgICAgICAgZXhwZWN0KHNbMF0pLnRvIGVxKDB4NDMpCisgICAgICAgIGV4cGVjdChzKS50byBlcSgnQ0InKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZXNjcmliZSAnLmNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcicgZG8KKyAgICAgIGl0ICdzaG91bGQgYmUgYSBuby1vcCcgZG8KKyAgICAgICAgZSA9ICdTVFJJTkcnCisgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlciBlCisgICAgICAgIGV4cGVjdChhKS50byBlcShlKQorICAgICAgICBleHBlY3QoYSkudG8gYmUoZSkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVzY3JpYmUgJy5jb252ZXJ0X3RvX3N0cmluZycgZG8KKyAgICAgIGl0ICdzaG91bGQgYmUgYSBuby1vcCcgZG8KKyAgICAgICAgZSA9ICdTVFJJTkcnCisgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmNvbnZlcnRfdG9fc3RyaW5nIGUKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGUpCisgICAgICAgIGV4cGVjdChhKS50byBiZShlKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9jbGllbnRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2NsaWVudF9zcGVjLnJiCmluZGV4IGU3MDdkODEuLmQ1ZDRjZWUgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2NsaWVudF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2NsaWVudF9zcGVjLnJiCkBAIC0xNyw4NCArMTcsODIgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAotY2xhc3MgVGhyaWZ0Q2xpZW50U3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAorZGVzY3JpYmUgJ0NsaWVudCcgZG8KIAogICBjbGFzcyBDbGllbnRTcGVjCiAgICAgaW5jbHVkZSBUaHJpZnQ6OkNsaWVudAogICBlbmQKIAogICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgQHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQorICAgIEBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQogICAgIEBjbGllbnQgPSBDbGllbnRTcGVjLm5ldyhAcHJvdCkKICAgZW5kCiAKLSAgZGVzY3JpYmUgQ2xpZW50IGRvCisgIGRlc2NyaWJlIFRocmlmdDo6Q2xpZW50IGRvCiAgICAgaXQgInNob3VsZCByZS11c2UgaXByb3QgZm9yIG9wcm90IGlmIG5vdCBvdGhlcndpc2Ugc3BlY2lmaWVkIiBkbwotICAgICAgQGNsaWVudC5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAaXByb3QnKS5zaG91bGQgZXFsKEBwcm90KQotICAgICAgQGNsaWVudC5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAb3Byb3QnKS5zaG91bGQgZXFsKEBwcm90KQorICAgICAgZXhwZWN0KEBjbGllbnQuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQGlwcm90JykpLnRvIGVxbChAcHJvdCkKKyAgICAgIGV4cGVjdChAY2xpZW50Lmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6J0BvcHJvdCcpKS50byBlcWwoQHByb3QpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNlbmQgYSB0ZXN0IG1lc3NhZ2UiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UnLCBNZXNzYWdlVHlwZXM6OkNBTEwsIDApCi0gICAgICBtb2NrX2FyZ3MgPSBtb2NrKCcjPFRlc3RNZXNzYWdlX2FyZ3M6bW9jaz4nKQotICAgICAgbW9ja19hcmdzLnNob3VsZF9yZWNlaXZlKDpmb289KS53aXRoKCdmb28nKQotICAgICAgbW9ja19hcmdzLnNob3VsZF9yZWNlaXZlKDpiYXI9KS53aXRoKDQyKQotICAgICAgbW9ja19hcmdzLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2VuZCkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp0cmFucykgZG8KLSAgICAgICAgbW9jaygndHJhbnMnKS50ZWUgZG8gfHRyYW5zfAotICAgICAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMCkKKyAgICAgIG1vY2tfYXJncyA9IGRvdWJsZSgnIzxUZXN0TWVzc2FnZV9hcmdzOm1vY2s+JykKKyAgICAgIGV4cGVjdChtb2NrX2FyZ3MpLnRvIHJlY2VpdmUoOmZvbz0pLndpdGgoJ2ZvbycpCisgICAgICBleHBlY3QobW9ja19hcmdzKS50byByZWNlaXZlKDpiYXI9KS53aXRoKDQyKQorICAgICAgZXhwZWN0KG1vY2tfYXJncykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21lc3NhZ2VfZW5kKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp0cmFucykgZG8KKyAgICAgICAgZG91YmxlKCd0cmFucycpLnRhcCBkbyB8dHJhbnN8CisgICAgICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkKICAgICAgICAgZW5kCiAgICAgICBlbmQKLSAgICAgIGtsYXNzID0gc3R1YigiVGVzdE1lc3NhZ2VfYXJncyIsIDpuZXcgPT4gbW9ja19hcmdzKQorICAgICAga2xhc3MgPSBkb3VibGUoIlRlc3RNZXNzYWdlX2FyZ3MiLCA6bmV3ID0+IG1vY2tfYXJncykKICAgICAgIEBjbGllbnQuc2VuZF9tZXNzYWdlKCd0ZXN0TWVzc2FnZScsIGtsYXNzLCA6Zm9vID0+ICdmb28nLCA6YmFyID0+IDQyKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBpbmNyZW1lbnQgdGhlIHNlcXVlbmNlIGlkIHdoZW4gc2VuZGluZyBtZXNzYWdlcyIgZG8KLSAgICAgIHBlbmRpbmcgIml0IHNlZW1zIHNlcXVlbmNlIGlkcyBhcmUgY29tcGxldGVseSBpZ25vcmVkIHJpZ2h0IG5vdyIgZG8KLSAgICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgIE1lc3NhZ2VUeXBlczo6Q0FMTCwgMCkub3JkZXJlZAotICAgICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UyJywgTWVzc2FnZVR5cGVzOjpDQUxMLCAxKS5vcmRlcmVkCi0gICAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZTMnLCBNZXNzYWdlVHlwZXM6OkNBTEwsIDIpLm9yZGVyZWQKLSAgICAgICAgQHByb3Quc3R1YiEoOndyaXRlX21lc3NhZ2VfZW5kKQotICAgICAgICBAcHJvdC5zdHViISg6dHJhbnMpLmFuZF9yZXR1cm4gbW9jaygidHJhbnMiKS5hc19udWxsX29iamVjdAotICAgICAgICBAY2xpZW50LnNlbmRfbWVzc2FnZSgndGVzdE1lc3NhZ2UnLCBtb2NrKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpCi0gICAgICAgIEBjbGllbnQuc2VuZF9tZXNzYWdlKCd0ZXN0TWVzc2FnZTInLCBtb2NrKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpCi0gICAgICAgIEBjbGllbnQuc2VuZF9tZXNzYWdlKCd0ZXN0TWVzc2FnZTMnLCBtb2NrKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpICAgICAgICAKLSAgICAgIGVuZAorICAgICAgcGVuZGluZyAiaXQgc2VlbXMgc2VxdWVuY2UgaWRzIGFyZSBjb21wbGV0ZWx5IGlnbm9yZWQgcmlnaHQgbm93IgorICAgICAgQHByb3QuZXhwZWN0KDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsICBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMCkub3JkZXJlZAorICAgICAgQHByb3QuZXhwZWN0KDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZTInLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMSkub3JkZXJlZAorICAgICAgQHByb3QuZXhwZWN0KDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZTMnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMikub3JkZXJlZAorICAgICAgQHByb3Quc3R1YiEoOndyaXRlX21lc3NhZ2VfZW5kKQorICAgICAgQHByb3Quc3R1YiEoOnRyYW5zKS5hbmRfcmV0dXJuIGRvdWJsZSgidHJhbnMiKS5hc19udWxsX29iamVjdAorICAgICAgQGNsaWVudC5zZW5kX21lc3NhZ2UoJ3Rlc3RNZXNzYWdlJywgZG91YmxlKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpCisgICAgICBAY2xpZW50LnNlbmRfbWVzc2FnZSgndGVzdE1lc3NhZ2UyJywgZG91YmxlKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpCisgICAgICBAY2xpZW50LnNlbmRfbWVzc2FnZSgndGVzdE1lc3NhZ2UzJywgZG91YmxlKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlY2VpdmUgYSB0ZXN0IG1lc3NhZ2UiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5hbmRfcmV0dXJuIFtuaWwsIE1lc3NhZ2VUeXBlczo6Q0FMTCwgMF0KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKQotICAgICAgbW9ja19rbGFzcyA9IG1vY2soIiM8TW9ja0NsYXNzOm1vY2s+IikKLSAgICAgIG1vY2tfa2xhc3Muc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoQHByb3QpCi0gICAgICBAY2xpZW50LnJlY2VpdmVfbWVzc2FnZShzdHViKCJNb2NrQ2xhc3MiLCA6bmV3ID0+IG1vY2tfa2xhc3MpKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfYmVnaW4pLmFuZF9yZXR1cm4gW25pbCwgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDBdCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWVzc2FnZV9lbmQpCisgICAgICBtb2NrX2tsYXNzID0gZG91YmxlKCIjPE1vY2tDbGFzczptb2NrPiIpCisgICAgICBleHBlY3QobW9ja19rbGFzcykudG8gcmVjZWl2ZSg6cmVhZCkud2l0aChAcHJvdCkKKyAgICAgIEBjbGllbnQucmVjZWl2ZV9tZXNzYWdlKGRvdWJsZSgiTW9ja0NsYXNzIiwgOm5ldyA9PiBtb2NrX2tsYXNzKSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgaGFuZGxlIHJlY2VpdmVkIGV4Y2VwdGlvbnMiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5hbmRfcmV0dXJuIFtuaWwsIE1lc3NhZ2VUeXBlczo6RVhDRVBUSU9OLCAwXQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9lbmQpCi0gICAgICBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuIGRvCi0gICAgICAgIFN0YW5kYXJkRXJyb3IubmV3LnRlZSBkbyB8bW9ja19leGN8Ci0gICAgICAgICAgbW9ja19leGMuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoQHByb3QpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikuYW5kX3JldHVybiBbbmlsLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6RVhDRVBUSU9OLCAwXQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKQorICAgICAgZXhwZWN0KFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24pLnRvIHJlY2VpdmUoOm5ldykgZG8KKyAgICAgICAgU3RhbmRhcmRFcnJvci5uZXcudGFwIGRvIHxtb2NrX2V4Y3wKKyAgICAgICAgICBleHBlY3QobW9ja19leGMpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoQHByb3QpCiAgICAgICAgIGVuZAogICAgICAgZW5kCi0gICAgICBsYW1iZGEgeyBAY2xpZW50LnJlY2VpdmVfbWVzc2FnZShuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IpCisgICAgICBleHBlY3QgeyBAY2xpZW50LnJlY2VpdmVfbWVzc2FnZShuaWwpIH0udG8gcmFpc2VfZXJyb3IoU3RhbmRhcmRFcnJvcikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY2xvc2UgdGhlIHRyYW5zcG9ydCBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2VuZGluZyBhIG1lc3NhZ2UiIGRvCi0gICAgICBAcHJvdC5zdHViISg6d3JpdGVfbWVzc2FnZV9iZWdpbikKLSAgICAgIEBwcm90LnNob3VsZF9ub3RfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpCi0gICAgICBtb2NrX2FyZ3MgPSBtb2NrKCIjPFRlc3RNZXNzYWdlX2FyZ3M6bW9jaz4iKQotICAgICAgbW9ja19hcmdzLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCi0gICAgICB0cmFucyA9IG1vY2soIk1vY2tUcmFuc3BvcnQiKQotICAgICAgQHByb3Quc3R1YiEoOnRyYW5zKS5hbmRfcmV0dXJuKHRyYW5zKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKQotICAgICAga2xhc3MgPSBtb2NrKCJUZXN0TWVzc2FnZV9hcmdzIiwgOm5ldyA9PiBtb2NrX2FyZ3MpCi0gICAgICBsYW1iZGEgeyBAY2xpZW50LnNlbmRfbWVzc2FnZSgidGVzdE1lc3NhZ2UiLCBrbGFzcykgfS5zaG91bGQgcmFpc2VfZXJyb3IoU3RhbmRhcmRFcnJvcikKKyAgICAgIGFsbG93KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKQorICAgICAgZXhwZWN0KEBwcm90KS5ub3RfdG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpCisgICAgICBtb2NrX2FyZ3MgPSBkb3VibGUoIiM8VGVzdE1lc3NhZ2VfYXJnczptb2NrPiIpCisgICAgICBleHBlY3QobW9ja19hcmdzKS50byByZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCisgICAgICB0cmFucyA9IGRvdWJsZSgiTW9ja1RyYW5zcG9ydCIpCisgICAgICBhbGxvdyhAcHJvdCkudG8gcmVjZWl2ZSg6dHJhbnMpLmFuZF9yZXR1cm4odHJhbnMpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKQorICAgICAga2xhc3MgPSBkb3VibGUoIlRlc3RNZXNzYWdlX2FyZ3MiLCA6bmV3ID0+IG1vY2tfYXJncykKKyAgICAgIGV4cGVjdCB7IEBjbGllbnQuc2VuZF9tZXNzYWdlKCJ0ZXN0TWVzc2FnZSIsIGtsYXNzKSB9LnRvIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9jb21wYWN0X3Byb3RvY29sX3NwZWMucmIgYi9saWIvcmIvc3BlYy9jb21wYWN0X3Byb3RvY29sX3NwZWMucmIKaW5kZXggMWZhMjE4Mi4uNTEzZGQ2OSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvY29tcGFjdF9wcm90b2NvbF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2NvbXBhY3RfcHJvdG9jb2xfc3BlYy5yYgpAQCAtMSwzICsxLDQgQEAKKyMgZW5jb2Rpbmc6IFVURi04CiAjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTE3LDcgKzE4LDcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAogZGVzY3JpYmUgVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2wgZG8KICAgVEVTVFMgPSB7CkBAIC0yNSw3ICsyNiw3IEBACiAgICAgOmkxNiA9PiAoMC4uMTQpLm1hcCB7fHNoaWZ0fCBbMSA8PCBzaGlmdCwgLSgxIDw8IHNoaWZ0KV19LmZsYXR0ZW4uc29ydCwKICAgICA6aTMyID0+ICgwLi4zMCkubWFwIHt8c2hpZnR8IFsxIDw8IHNoaWZ0LCAtKDEgPDwgc2hpZnQpXX0uZmxhdHRlbi5zb3J0LAogICAgIDppNjQgPT4gKDAuLjYyKS5tYXAge3xzaGlmdHwgWzEgPDwgc2hpZnQsIC0oMSA8PCBzaGlmdCldfS5mbGF0dGVuLnNvcnQsCi0gICAgOnN0cmluZyA9PiBbIiIsICIxIiwgInNob3J0IiwgImZvdXJ0ZWVuMTIzNDU2IiwgImZpZnRlZW4xMjM0NTY3OCIsICIxIiAqIDEyNywgIjEiICogMzAwMF0sCisgICAgOnN0cmluZyA9PiBbIiIsICIxIiwgInNob3J0IiwgImZvdXJ0ZWVuMTIzNDU2IiwgImZpZnRlZW4xMjM0NTY3OCIsICJ1bmljb2RlIGNoYXJhY3RlcnM6IFx1MjBBQyBcdTIwQUQiLCAiMSIgKiAxMjcsICIxIiAqIDMwMDBdLAogICAgIDpiaW5hcnkgPT4gWyIiLCAiXDAwMSIsICJcMDAxIiAqIDUsICJcMDAxIiAqIDE0LCAiXDAwMSIgKiAxNSwgIlwwMDEiICogMTI3LCAiXDAwMSIgKiAzMDAwXSwKICAgICA6ZG91YmxlID0+IFswLjAsIDEuMCwgLTEuMCwgMS4xLCAtMS4xLCAxMDAwMDAwMC4xLCAxLjAvMC4wLCAtMS4wLzAuMF0sCiAgICAgOmJvb2wgPT4gW3RydWUsIGZhbHNlXQpAQCAtNDEsNyArNDIsNyBAQAogICAgICAgICBwcm90by5zZW5kKHdyaXRlcihwcmltaXRpdmVfdHlwZSksIHZhbHVlKQogICAgICAgICAjIHB1dHMgImJ1ZjogI3t0cmFucy5pbnNwZWN0X2J1ZmZlcn0iIGlmIHByaW1pdGl2ZV90eXBlID09IDppNjQKICAgICAgICAgcmVhZF9iYWNrID0gcHJvdG8uc2VuZChyZWFkZXIocHJpbWl0aXZlX3R5cGUpKQotICAgICAgICByZWFkX2JhY2suc2hvdWxkID09IHZhbHVlCisgICAgICAgIGV4cGVjdChyZWFkX2JhY2spLnRvIGVxKHZhbHVlKQogICAgICAgZW5kCiAgICAgZW5kCiAgIGVuZApAQCAtNjEsMTAgKzYyLDEwIEBACiAKICAgICAgICAgcHJvdG8gPSBUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbC5uZXcodHJhbnMpCiAgICAgICAgIG5hbWUsIHR5cGUsIGlkID0gcHJvdG8ucmVhZF9maWVsZF9iZWdpbgotICAgICAgICB0eXBlLnNob3VsZCA9PSB0aHJpZnRfdHlwZQotICAgICAgICBpZC5zaG91bGQgPT0gMTUKKyAgICAgICAgZXhwZWN0KHR5cGUpLnRvIGVxKHRocmlmdF90eXBlKQorICAgICAgICBleHBlY3QoaWQpLnRvIGVxKDE1KQogICAgICAgICByZWFkX2JhY2sgPSBwcm90by5zZW5kKHJlYWRlcihwcmltaXRpdmVfdHlwZSkpCi0gICAgICAgIHJlYWRfYmFjay5zaG91bGQgPT0gdmFsdWUKKyAgICAgICAgZXhwZWN0KHJlYWRfYmFjaykudG8gZXEodmFsdWUpCiAgICAgICAgIHByb3RvLnJlYWRfZmllbGRfZW5kCiAgICAgICBlbmQKICAgICBlbmQKQEAgLTc0LDEzICs3NSwxMyBAQAogICAgIHRyYW5zID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3CiAgICAgcHJvdG8gPSBUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbC5uZXcodHJhbnMpCiAKLSAgICBzdHJ1Y3QgPSBDb21wYWN0UHJvdG9UZXN0U3RydWN0Lm5ldworICAgIHN0cnVjdCA9IFRocmlmdDo6VGVzdDo6Q29tcGFjdFByb3RvVGVzdFN0cnVjdC5uZXcKICAgICAjIHNldHMgYW5kIG1hcHMgZG9uJ3QgaGFzaCB3ZWxsLi4uIG5vdCBzdXJlIHdoYXQgdG8gZG8gaGVyZS4KICAgICBzdHJ1Y3Qud3JpdGUocHJvdG8pCiAKLSAgICBzdHJ1Y3QyID0gQ29tcGFjdFByb3RvVGVzdFN0cnVjdC5uZXcKKyAgICBzdHJ1Y3QyID0gVGhyaWZ0OjpUZXN0OjpDb21wYWN0UHJvdG9UZXN0U3RydWN0Lm5ldwogICAgIHN0cnVjdDIucmVhZChwcm90bykgICAgCi0gICAgc3RydWN0Mi5zaG91bGQgPT0gc3RydWN0CisgICAgZXhwZWN0KHN0cnVjdDIpLnRvIGVxKHN0cnVjdCkKICAgZW5kCiAKICAgaXQgInNob3VsZCBtYWtlIG1ldGhvZCBjYWxscyBjb3JyZWN0bHkiIGRvCkBAIC05MCwxOSArOTEsMTkgQEAKICAgICBjbGllbnRfaW5fdHJhbnMgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcKICAgICBjbGllbnRfaW5fcHJvdG8gPSBUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbC5uZXcoY2xpZW50X2luX3RyYW5zKQogCi0gICAgcHJvY2Vzc29yID0gU3J2OjpQcm9jZXNzb3IubmV3KEphbmt5SGFuZGxlci5uZXcpCisgICAgcHJvY2Vzc29yID0gVGhyaWZ0OjpUZXN0OjpTcnY6OlByb2Nlc3Nvci5uZXcoSmFua3lIYW5kbGVyLm5ldykKIAotICAgIGNsaWVudCA9IFNydjo6Q2xpZW50Lm5ldyhjbGllbnRfaW5fcHJvdG8sIGNsaWVudF9vdXRfcHJvdG8pCisgICAgY2xpZW50ID0gVGhyaWZ0OjpUZXN0OjpTcnY6OkNsaWVudC5uZXcoY2xpZW50X2luX3Byb3RvLCBjbGllbnRfb3V0X3Byb3RvKQogICAgIGNsaWVudC5zZW5kX0phbmt5KDEpCiAgICAgIyBwdXRzIGNsaWVudF9vdXRfdHJhbnMuaW5zcGVjdF9idWZmZXIKICAgICBwcm9jZXNzb3IucHJvY2VzcyhjbGllbnRfb3V0X3Byb3RvLCBjbGllbnRfaW5fcHJvdG8pCi0gICAgY2xpZW50LnJlY3ZfSmFua3kuc2hvdWxkID09IDIKKyAgICBleHBlY3QoY2xpZW50LnJlY3ZfSmFua3kpLnRvIGVxKDIpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCBkZWFsIHdpdGggZmllbGRzIGZvbGxvd2luZyBmaWVsZHMgdGhhdCBoYXZlIG5vbi1kZWx0YSBpZHMiIGRvCi0gICAgYnJjcCA9IEJyZWFrc1J1YnlDb21wYWN0UHJvdG9jb2wubmV3KAorICAgIGJyY3AgPSBUaHJpZnQ6OlRlc3Q6OkJyZWFrc1J1YnlDb21wYWN0UHJvdG9jb2wubmV3KAogICAgICAgOmZpZWxkMSA9PiAiYmxhaCIsIAotICAgICAgOmZpZWxkMiA9PiBCaWdGaWVsZElkU3RydWN0Lm5ldygKKyAgICAgIDpmaWVsZDIgPT4gVGhyaWZ0OjpUZXN0OjpCaWdGaWVsZElkU3RydWN0Lm5ldygKICAgICAgICAgOmZpZWxkMSA9PiAic3RyaW5nMSIsIAogICAgICAgICA6ZmllbGQyID0+ICJzdHJpbmcyIiksIAogICAgICAgOmZpZWxkMyA9PiAzKQpAQCAtMTEwLDkgKzExMSwyNSBAQAogICAgIGJ5dGVzID0gc2VyLnNlcmlhbGl6ZShicmNwKQogCiAgICAgZGVzZXIgPSBUaHJpZnQ6OkRlc2VyaWFsaXplci5uZXcoVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lm5ldykKLSAgICBicmNwMiA9IEJyZWFrc1J1YnlDb21wYWN0UHJvdG9jb2wubmV3CisgICAgYnJjcDIgPSBUaHJpZnQ6OlRlc3Q6OkJyZWFrc1J1YnlDb21wYWN0UHJvdG9jb2wubmV3CiAgICAgZGVzZXIuZGVzZXJpYWxpemUoYnJjcDIsIGJ5dGVzKQotICAgIGJyY3AyLnNob3VsZCA9PSBicmNwCisgICAgZXhwZWN0KGJyY3AyKS50byBlcShicmNwKQorICBlbmQKKyAgCisgIGl0ICJzaG91bGQgZGVzZXJpYWxpemUgYW4gZW1wdHkgbWFwIHRvIGFuIGVtcHR5IGhhc2giIGRvCisgICAgc3RydWN0ID0gVGhyaWZ0OjpUZXN0OjpTaW5nbGVNYXBUZXN0U3RydWN0Lm5ldyg6aTMyX21hcCA9PiB7fSkKKyAgICBzZXIgPSBUaHJpZnQ6OlNlcmlhbGl6ZXIubmV3KFRocmlmdDo6Q29tcGFjdFByb3RvY29sRmFjdG9yeS5uZXcpCisgICAgYnl0ZXMgPSBzZXIuc2VyaWFsaXplKHN0cnVjdCkKKworICAgIGRlc2VyID0gVGhyaWZ0OjpEZXNlcmlhbGl6ZXIubmV3KFRocmlmdDo6Q29tcGFjdFByb3RvY29sRmFjdG9yeS5uZXcpCisgICAgc3RydWN0MiA9IFRocmlmdDo6VGVzdDo6U2luZ2xlTWFwVGVzdFN0cnVjdC5uZXcKKyAgICBkZXNlci5kZXNlcmlhbGl6ZShzdHJ1Y3QyLCBieXRlcykKKyAgICBleHBlY3Qoc3RydWN0KS50byBlcShzdHJ1Y3QyKQorICBlbmQKKyAgCisgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICB0cmFucyA9IFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0Lm5ldworICAgIGV4cGVjdChUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbC5uZXcodHJhbnMpLnRvX3MpLnRvIGVxKCJjb21wYWN0KG1lbW9yeSkiKQogICBlbmQKICAgCiAgIGNsYXNzIEphbmt5SGFuZGxlcgpAQCAtMTIyLDEyICsxMzksMjAgQEAKICAgZW5kCiAgIAogICBkZWYgd3JpdGVyKHN5bSkKLSAgICBzeW0gPSBzeW0gPT0gOmJpbmFyeSA/IDpzdHJpbmcgOiBzeW0KICAgICAid3JpdGVfI3tzeW0udG9fc30iCiAgIGVuZAogICAKICAgZGVmIHJlYWRlcihzeW0pCi0gICAgc3ltID0gc3ltID09IDpiaW5hcnkgPyA6c3RyaW5nIDogc3ltCiAgICAgInJlYWRfI3tzeW0udG9fc30iCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCisKK2Rlc2NyaWJlIFRocmlmdDo6Q29tcGFjdFByb3RvY29sRmFjdG9yeSBkbworICBpdCAic2hvdWxkIGNyZWF0ZSBhIENvbXBhY3RQcm90b2NvbCIgZG8KKyAgICBleHBlY3QoVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2woZG91YmxlKCJNb2NrVHJhbnNwb3J0IikpKS50byBiZV9pbnN0YW5jZV9vZihUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgIGV4cGVjdChUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJjb21wYWN0IikKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2V4Y2VwdGlvbl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvZXhjZXB0aW9uX3NwZWMucmIKaW5kZXggZmMzMjEzNy4uMzc5YWU2OSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvZXhjZXB0aW9uX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvZXhjZXB0aW9uX3NwZWMucmIKQEAgLTE3LDEyNiArMTcsMTI1IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWNfaGVscGVyJworcmVxdWlyZSAnc3BlY19oZWxwZXInCiAKLWNsYXNzIFRocmlmdEV4Y2VwdGlvblNwZWMgPCBTcGVjOjpFeGFtcGxlR3JvdXAKLSAgaW5jbHVkZSBUaHJpZnQKK2Rlc2NyaWJlICdFeGNlcHRpb24nIGRvCiAKLSAgZGVzY3JpYmUgRXhjZXB0aW9uIGRvCisgIGRlc2NyaWJlIFRocmlmdDo6RXhjZXB0aW9uIGRvCiAgICAgaXQgInNob3VsZCBoYXZlIGFuIGFjY2Vzc2libGUgbWVzc2FnZSIgZG8KLSAgICAgIGUgPSBFeGNlcHRpb24ubmV3KCJ0ZXN0IG1lc3NhZ2UiKQotICAgICAgZS5tZXNzYWdlLnNob3VsZCA9PSAidGVzdCBtZXNzYWdlIgorICAgICAgZSA9IFRocmlmdDo6RXhjZXB0aW9uLm5ldygidGVzdCBtZXNzYWdlIikKKyAgICAgIGV4cGVjdChlLm1lc3NhZ2UpLnRvIGVxKCJ0ZXN0IG1lc3NhZ2UiKQogICAgIGVuZAogICBlbmQKIAotICBkZXNjcmliZSBBcHBsaWNhdGlvbkV4Y2VwdGlvbiBkbworICBkZXNjcmliZSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIGRvCiAgICAgaXQgInNob3VsZCBpbmhlcml0IGZyb20gVGhyaWZ0OjpFeGNlcHRpb24iIGRvCi0gICAgICBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5zdXBlcmNsYXNzLnNob3VsZCA9PSBFeGNlcHRpb24KKyAgICAgIGV4cGVjdChUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLnN1cGVyY2xhc3MpLnRvIGVxKFRocmlmdDo6RXhjZXB0aW9uKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBoYXZlIGFuIGFjY2Vzc2libGUgdHlwZSBhbmQgbWVzc2FnZSIgZG8KLSAgICAgIGUgPSBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcKLSAgICAgIGUudHlwZS5zaG91bGQgPT0gQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV04KLSAgICAgIGUubWVzc2FnZS5zaG91bGQgYmVfbmlsCi0gICAgICBlID0gQXBwbGljYXRpb25FeGNlcHRpb24ubmV3KEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCwgInRlc3QgbWVzc2FnZSIpCi0gICAgICBlLnR5cGUuc2hvdWxkID09IEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRAotICAgICAgZS5tZXNzYWdlLnNob3VsZCA9PSAidGVzdCBtZXNzYWdlIgorICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3CisgICAgICBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOKQorICAgICAgZXhwZWN0KGUubWVzc2FnZSkudG8gYmVfbmlsCisgICAgICBlID0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QsICJ0ZXN0IG1lc3NhZ2UiKQorICAgICAgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QpCisgICAgICBleHBlY3QoZS5tZXNzYWdlKS50byBlcSgidGVzdCBtZXNzYWdlIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBhIHN0cnVjdCBvZmYgb2YgYSBwcm90b2NvbCIgZG8KLSAgICAgIHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybigKLSAgICAgICAgWyJtZXNzYWdlIiwgVHlwZXM6OlNUUklORywgMV0sCi0gICAgICAgIFsidHlwZSIsIFR5cGVzOjpJMzIsIDJdLAotICAgICAgICBbbmlsLCBUeXBlczo6U1RPUCwgMF0KKyAgICAgIHByb3QgPSBkb3VibGUoIk1vY2tQcm90b2NvbCIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oCisgICAgICAgIFsibWVzc2FnZSIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMV0sCisgICAgICAgIFsidHlwZSIsIFRocmlmdDo6VHlwZXM6OkkzMiwgMl0sCisgICAgICAgIFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIDBdCiAgICAgICApCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZC5hbmRfcmV0dXJuICJ0ZXN0IG1lc3NhZ2UiCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZC5hbmRfcmV0dXJuIEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDIpLnRpbWVzCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZC5hbmRfcmV0dXJuICJ0ZXN0IG1lc3NhZ2UiCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQuYW5kX3JldHVybiBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSgyKS50aW1lcworICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAogCi0gICAgICBlID0gQXBwbGljYXRpb25FeGNlcHRpb24ubmV3CisgICAgICBlID0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcKICAgICAgIGUucmVhZChwcm90KQotICAgICAgZS5tZXNzYWdlLnNob3VsZCA9PSAidGVzdCBtZXNzYWdlIgotICAgICAgZS50eXBlLnNob3VsZCA9PSBBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lECisgICAgICBleHBlY3QoZS5tZXNzYWdlKS50byBlcSgidGVzdCBtZXNzYWdlIikKKyAgICAgIGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2tpcCBiYWQgZmllbGRzIHdoZW4gcmVhZGluZyBhIHN0cnVjdCIgZG8KLSAgICAgIHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmV4YWN0bHkoNSkudGltZXMuYW5kX3JldHVybigKLSAgICAgICAgWyJ0eXBlIiwgVHlwZXM6OkkzMiwgMl0sCi0gICAgICAgIFsidHlwZSIsIFR5cGVzOjpTVFJJTkcsIDJdLAotICAgICAgICBbIm1lc3NhZ2UiLCBUeXBlczo6TUFQLCAxXSwKLSAgICAgICAgWyJtZXNzYWdlIiwgVHlwZXM6OlNUUklORywgM10sCi0gICAgICAgIFtuaWwsIFR5cGVzOjpTVE9QLCAwXQorICAgICAgcHJvdCA9IGRvdWJsZSgiTW9ja1Byb3RvY29sIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmV4YWN0bHkoNSkudGltZXMuYW5kX3JldHVybigKKyAgICAgICAgWyJ0eXBlIiwgVGhyaWZ0OjpUeXBlczo6STMyLCAyXSwKKyAgICAgICAgWyJ0eXBlIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAyXSwKKyAgICAgICAgWyJtZXNzYWdlIiwgVGhyaWZ0OjpUeXBlczo6TUFQLCAxXSwKKyAgICAgICAgWyJtZXNzYWdlIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAzXSwKKyAgICAgICAgW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0KICAgICAgICkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuIEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlZBTElEX01FU1NBR0VfVFlQRQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6c2tpcCkud2l0aChUeXBlczo6U1RSSU5HKS50d2ljZQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6c2tpcCkud2l0aChUeXBlczo6TUFQKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoNCkudGltZXMKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuIFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OklOVkFMSURfTUVTU0FHRV9UWVBFCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpTVFJJTkcpLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpNQVApCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoNCkudGltZXMKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKIAotICAgICAgZSA9IEFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldworICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3CiAgICAgICBlLnJlYWQocHJvdCkKLSAgICAgIGUubWVzc2FnZS5zaG91bGQgYmVfbmlsCi0gICAgICBlLnR5cGUuc2hvdWxkID09IEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlZBTElEX01FU1NBR0VfVFlQRQorICAgICAgZXhwZWN0KGUubWVzc2FnZSkudG8gYmVfbmlsCisgICAgICBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlZBTElEX01FU1NBR0VfVFlQRSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgYSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIHN0cnVjdCB0byB0aGUgb3Byb3QiIGRvCi0gICAgICBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJtZXNzYWdlIiwgVHlwZXM6OlNUUklORywgMSkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJ0ZXN0IG1lc3NhZ2UiKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgidHlwZSIsIFR5cGVzOjpJMzIsIDIpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aChBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIHByb3QgPSBkb3VibGUoIk1vY2tQcm90b2NvbCIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJtZXNzYWdlIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJ0ZXN0IG1lc3NhZ2UiKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoInR5cGUiLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKIAotICAgICAgZSA9IEFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QsICJ0ZXN0IG1lc3NhZ2UiKQorICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3KFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCAidGVzdCBtZXNzYWdlIikKICAgICAgIGUud3JpdGUocHJvdCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2tpcCBuaWwgZmllbGRzIHdoZW4gd3JpdGluZyB0byB0aGUgb3Byb3QiIGRvCi0gICAgICBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJtZXNzYWdlIiwgVHlwZXM6OlNUUklORywgMSkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJ0ZXN0IG1lc3NhZ2UiKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIHByb3QgPSBkb3VibGUoIk1vY2tQcm90b2NvbCIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJtZXNzYWdlIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJ0ZXN0IG1lc3NhZ2UiKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKIAotICAgICAgZSA9IEFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhuaWwsICJ0ZXN0IG1lc3NhZ2UiKQorICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3KG5pbCwgInRlc3QgbWVzc2FnZSIpCiAgICAgICBlLndyaXRlKHByb3QpCiAKLSAgICAgIHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoInR5cGUiLCBUeXBlczo6STMyLCAyKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoQXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRCkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgidHlwZSIsIFRocmlmdDo6VHlwZXM6OkkzMiwgMikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aChUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkub3JkZXJlZAogCi0gICAgICBlID0gQXBwbGljYXRpb25FeGNlcHRpb24ubmV3KEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQpCisgICAgICBlID0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lEKQogICAgICAgZS53cml0ZShwcm90KQogCi0gICAgICBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIHByb3QgPSBkb3VibGUoIk1vY2tQcm90b2NvbCIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCiAKLSAgICAgIGUgPSBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcobmlsKQorICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3KG5pbCkKICAgICAgIGUud3JpdGUocHJvdCkKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgUHJvdG9jb2xFeGNlcHRpb24gZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiBkbwogICAgIGl0ICJzaG91bGQgaGF2ZSBhbiBhY2Nlc3NpYmxlIHR5cGUiIGRvCi0gICAgICBwcm90ID0gUHJvdG9jb2xFeGNlcHRpb24ubmV3KFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlULCAibWVzc2FnZSIpCi0gICAgICBwcm90LnR5cGUuc2hvdWxkID09IFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUCi0gICAgICBwcm90Lm1lc3NhZ2Uuc2hvdWxkID09ICJtZXNzYWdlIgorICAgICAgcHJvdCA9IFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24ubmV3KFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQsICJtZXNzYWdlIikKKyAgICAgIGV4cGVjdChwcm90LnR5cGUpLnRvIGVxKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpCisgICAgICBleHBlY3QocHJvdC5tZXNzYWdlKS50byBlcSgibWVzc2FnZSIpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9mbGF0X3NwZWMucmIgYi9saWIvcmIvc3BlYy9mbGF0X3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkzMDU2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL2ZsYXRfc3BlYy5yYgpAQCAtMCwwICsxLDYyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAnc3BlY19oZWxwZXInCisKK2Rlc2NyaWJlICdnZW5lcmF0aW9uJyBkbworICBiZWZvcmUgZG8KKyAgICByZXF1aXJlICduYW1lc3BhY2VkX25vbmJsb2NraW5nX3NlcnZpY2UnCisgIGVuZAorCisgIGl0ICJkaWQgbm90IGdlbmVyYXRlIHRoZSB3cm9uZyBmaWxlcyIgZG8KKyAgICBwcmVmaXggPSBGaWxlLmV4cGFuZF9wYXRoKCIuLi9nZW4tcmIvZmxhdCIsIF9fRklMRV9fKQorICAgIFsibmFtZXNwYWNlZF9zcGVjX25hbWVzcGFjZS9uYW1lc3BhY2VkX25vbmJsb2NraW5nX3NlcnZpY2UucmIiLAorICAgICAibmFtZXNwYWNlZF9zcGVjX25hbWVzcGFjZS90aHJpZnRfbmFtZXNwYWNlZF9zcGVjX2NvbnN0YW50cy5yYiIsCisgICAgICJuYW1lc3BhY2VkX3NwZWNfbmFtZXNwYWNlL3RocmlmdF9uYW1lc3BhY2VkX3NwZWNfdHlwZXMucmIiLAorICAgICAib3RoZXJfbmFtZXNwYWNlL3JlZmVyZW5jZWRfY29uc3RhbnRzLnJiIiwKKyAgICAgIm90aGVyX25hbWVzcGFjZS9yZWZlcmVuY2VkX3R5cGVzLnJiIgorICAgIF0uZWFjaCBkbyB8bmFtZXwKKyAgICAgIGV4cGVjdChGaWxlLmV4aXN0PyhGaWxlLmpvaW4ocHJlZml4LCBuYW1lKSkpLm5vdF90byBiZV90cnV0aHkKKyAgICBlbmQKKyAgZW5kCisKKyAgaXQgImdlbmVyYXRlZCB0aGUgcmlnaHQgZmlsZXMiIGRvCisgICAgcHJlZml4ID0gRmlsZS5leHBhbmRfcGF0aCgiLi4vZ2VuLXJiL2ZsYXQiLCBfX0ZJTEVfXykKKyAgICBbIm5hbWVzcGFjZWRfbm9uYmxvY2tpbmdfc2VydmljZS5yYiIsCisgICAgICJ0aHJpZnRfbmFtZXNwYWNlZF9zcGVjX2NvbnN0YW50cy5yYiIsCisgICAgICJ0aHJpZnRfbmFtZXNwYWNlZF9zcGVjX3R5cGVzLnJiIiwKKyAgICAgInJlZmVyZW5jZWRfY29uc3RhbnRzLnJiIiwKKyAgICAgInJlZmVyZW5jZWRfdHlwZXMucmIiCisgICAgXS5lYWNoIGRvIHxuYW1lfAorICAgICAgZXhwZWN0KEZpbGUuZXhpc3Q/KEZpbGUuam9pbihwcmVmaXgsIG5hbWUpKSkudG8gYmVfdHJ1dGh5CisgICAgZW5kCisgIGVuZAorCisgIGl0ICJoYXMgYSBzZXJ2aWNlIGNsYXNzIGluIHRoZSByaWdodCBwbGFjZSIgZG8KKyAgICBleHBlY3QoZGVmaW5lZD8oTmFtZXNwYWNlZFNwZWNOYW1lc3BhY2U6Ok5hbWVzcGFjZWROb25ibG9ja2luZ1NlcnZpY2UpKS50byBiZV90cnV0aHkKKyAgZW5kCisKKyAgaXQgImhhcyBhIHN0cnVjdCBpbiB0aGUgcmlnaHQgcGxhY2UiIGRvCisgICAgZXhwZWN0KGRlZmluZWQ/KE5hbWVzcGFjZWRTcGVjTmFtZXNwYWNlOjpIZWxsbykpLnRvIGJlX3RydXRoeQorICBlbmQKKworICBpdCAicmVxdWlyZWQgYW4gaW5jbHVkZWQgZmlsZSIgZG8KKyAgICBleHBlY3QoZGVmaW5lZD8oT3RoZXJOYW1lc3BhY2U6OlNvbWVFbnVtKSkudG8gYmVfdHJ1dGh5CisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9odHRwX2NsaWVudF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvaHR0cF9jbGllbnRfc3BlYy5yYgppbmRleCBjOTE5MDUxLi5kZjQ3MmFiIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9odHRwX2NsaWVudF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2h0dHBfY2xpZW50X3NwZWMucmIKQEAgLTE3LDMzICsxNyw0MCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJwogCi1jbGFzcyBUaHJpZnRIVFRQQ2xpZW50VHJhbnNwb3J0U3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAorZGVzY3JpYmUgJ1RocmlmdDo6SFRUUENsaWVudFRyYW5zcG9ydCcgZG8KIAotICBkZXNjcmliZSBIVFRQQ2xpZW50VHJhbnNwb3J0IGRvCisgIGRlc2NyaWJlIFRocmlmdDo6SFRUUENsaWVudFRyYW5zcG9ydCBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBjbGllbnQgPSBIVFRQQ2xpZW50VHJhbnNwb3J0Lm5ldygiaHR0cDovL215LmRvbWFpbi5jb20vcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIikKKyAgICAgIEBjbGllbnQgPSBUaHJpZnQ6OkhUVFBDbGllbnRUcmFuc3BvcnQubmV3KCJodHRwOi8vbXkuZG9tYWluLmNvbS9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiKQorICAgIGVuZAorICAgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIEBjbGllbnQudG9fcyA9PSAiaHR0cDovL215LmRvbWFpbi5jb20vcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhbHdheXMgYmUgb3BlbiIgZG8KLSAgICAgIEBjbGllbnQuc2hvdWxkIGJlX29wZW4KKyAgICAgIGV4cGVjdChAY2xpZW50KS50byBiZV9vcGVuCiAgICAgICBAY2xpZW50LmNsb3NlCi0gICAgICBAY2xpZW50LnNob3VsZCBiZV9vcGVuCisgICAgICBleHBlY3QoQGNsaWVudCkudG8gYmVfb3BlbgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwb3N0IHZpYSBIVFRQIGFuZCByZXR1cm4gdGhlIHJlc3VsdHMiIGRvCiAgICAgICBAY2xpZW50LndyaXRlICJhIHRlc3QiCiAgICAgICBAY2xpZW50LndyaXRlICIgZnJhbWUiCi0gICAgICBOZXQ6OkhUVFAuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDgwKS5hbmRfcmV0dXJuIGRvCi0gICAgICAgIG1vY2soIk5ldDo6SFRUUCIpLnRlZSBkbyB8aHR0cHwKLSAgICAgICAgICBodHRwLnNob3VsZF9yZWNlaXZlKDp1c2Vfc3NsPSkud2l0aChmYWxzZSkKLSAgICAgICAgICBodHRwLnNob3VsZF9yZWNlaXZlKDpwb3N0KS53aXRoKCIvcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIiwgImEgdGVzdCBmcmFtZSIsIHsiQ29udGVudC1UeXBlIj0+ImFwcGxpY2F0aW9uL3gtdGhyaWZ0In0pLmFuZF9yZXR1cm4oW25pbCwgImRhdGEiXSkKKyAgICAgIGV4cGVjdChOZXQ6OkhUVFApLnRvIHJlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDgwKSBkbworICAgICAgICBkb3VibGUoIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgoZmFsc2UpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnBvc3QpLndpdGgoIi9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiLCAiYSB0ZXN0IGZyYW1lIiwgeyJDb250ZW50LVR5cGUiPT4iYXBwbGljYXRpb24veC10aHJpZnQifSkgZG8KKyAgICAgICAgICAgIGRvdWJsZSgiTmV0OjpIVFRQT0siKS50YXAgZG8gfHJlc3BvbnNlfAorICAgICAgICAgICAgICBleHBlY3QocmVzcG9uc2UpLnRvIHJlY2VpdmUoOmJvZHkpLmFuZF9yZXR1cm4gImRhdGEiCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKICAgICAgICAgZW5kCiAgICAgICBlbmQKICAgICAgIEBjbGllbnQuZmx1c2gKLSAgICAgIEBjbGllbnQucmVhZCgxMCkuc2hvdWxkID09ICJkYXRhIgorICAgICAgZXhwZWN0KEBjbGllbnQucmVhZCgxMCkpLnRvIGVxKCJkYXRhIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2VuZCBjdXN0b20gaGVhZGVycyBpZiBkZWZpbmVkIiBkbwpAQCAtNTIsMTMgKzU5LDgxIEBACiAgICAgICBoZWFkZXJzID0geyJDb250ZW50LVR5cGUiPT4iYXBwbGljYXRpb24veC10aHJpZnQifS5tZXJnZShjdXN0b21faGVhZGVycykKIAogICAgICAgQGNsaWVudC5hZGRfaGVhZGVycyhjdXN0b21faGVhZGVycykKLSAgICAgIE5ldDo6SFRUUC5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKCJteS5kb21haW4uY29tIiwgODApLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgbW9jaygiTmV0OjpIVFRQIikudGVlIGRvIHxodHRwfAotICAgICAgICAgIGh0dHAuc2hvdWxkX3JlY2VpdmUoOnVzZV9zc2w9KS53aXRoKGZhbHNlKQotICAgICAgICAgIGh0dHAuc2hvdWxkX3JlY2VpdmUoOnBvc3QpLndpdGgoIi9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiLCAidGVzdCIsIGhlYWRlcnMpLmFuZF9yZXR1cm4oW25pbCwgImRhdGEiXSkKKyAgICAgIGV4cGVjdChOZXQ6OkhUVFApLnRvIHJlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDgwKSBkbworICAgICAgICBkb3VibGUoIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgoZmFsc2UpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnBvc3QpLndpdGgoIi9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiLCAidGVzdCIsIGhlYWRlcnMpIGRvCisgICAgICAgICAgICBkb3VibGUoIk5ldDo6SFRUUE9LIikudGFwIGRvIHxyZXNwb25zZXwKKyAgICAgICAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50byByZWNlaXZlKDpib2R5KS5hbmRfcmV0dXJuICJkYXRhIgorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCiAgICAgICAgIGVuZAogICAgICAgZW5kCiAgICAgICBAY2xpZW50LmZsdXNoCiAgICAgZW5kCisKKyAgICBpdCAnc2hvdWxkIHJlc2V0IHRoZSBvdXRidWYgb24gSFRUUCBmYWlsdXJlcycgZG8KKyAgICAgIEBjbGllbnQud3JpdGUgInRlc3QiCisKKyAgICAgIGV4cGVjdChOZXQ6OkhUVFApLnRvIHJlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDgwKSBkbworICAgICAgICBkb3VibGUoIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgoZmFsc2UpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnBvc3QpLndpdGgoIi9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiLCAidGVzdCIsIHsiQ29udGVudC1UeXBlIj0+ImFwcGxpY2F0aW9uL3gtdGhyaWZ0In0pIHsgcmFpc2UgTmV0OjpSZWFkVGltZW91dCB9CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIEBjbGllbnQuZmx1c2ggIHJlc2N1ZQorICAgICAgZXhwZWN0KEBjbGllbnQuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDpAb3V0YnVmKSkudG8gZXEoVGhyaWZ0OjpCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcikKKyAgICBlbmQKKworICBlbmQKKworICBkZXNjcmliZSAnc3NsIGVuYWJsZWQnIGRvCisgICAgYmVmb3JlKDplYWNoKSBkbworICAgICAgQHNlcnZpY2VfcGF0aCA9ICIvcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIgorICAgICAgQHNlcnZlcl91cmkgPSAiaHR0cHM6Ly9teS5kb21haW4uY29tIgorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB1c2UgU1NMIGZvciBodHRwcyIgZG8KKyAgICAgIGNsaWVudCA9IFRocmlmdDo6SFRUUENsaWVudFRyYW5zcG9ydC5uZXcoIiN7QHNlcnZlcl91cml9I3tAc2VydmljZV9wYXRofSIpCisKKyAgICAgIGNsaWVudC53cml0ZSAidGVzdCIKKworICAgICAgZXhwZWN0KE5ldDo6SFRUUCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKCJteS5kb21haW4uY29tIiwgNDQzKSBkbworICAgICAgICBkb3VibGUoIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgodHJ1ZSkKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dmVyaWZ5X21vZGU9KS53aXRoKE9wZW5TU0w6OlNTTDo6VkVSSUZZX1BFRVIpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnBvc3QpLndpdGgoQHNlcnZpY2VfcGF0aCwgInRlc3QiLAorICAgICAgICAgICAgICAiQ29udGVudC1UeXBlIiA9PiAiYXBwbGljYXRpb24veC10aHJpZnQiKSBkbworICAgICAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFBPSyIpLnRhcCBkbyB8cmVzcG9uc2V8CisgICAgICAgICAgICAgIGV4cGVjdChyZXNwb25zZSkudG8gcmVjZWl2ZSg6Ym9keSkuYW5kX3JldHVybiAiZGF0YSIKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgY2xpZW50LmZsdXNoCisgICAgICBleHBlY3QoY2xpZW50LnJlYWQoNCkpLnRvIGVxKCJkYXRhIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgc2V0IFNTTCB2ZXJpZnkgbW9kZSB3aGVuIHNwZWNpZmllZCIgZG8KKyAgICAgIGNsaWVudCA9IFRocmlmdDo6SFRUUENsaWVudFRyYW5zcG9ydC5uZXcoIiN7QHNlcnZlcl91cml9I3tAc2VydmljZV9wYXRofSIsCisgICAgICAgICAgOnNzbF92ZXJpZnlfbW9kZSA9PiBPcGVuU1NMOjpTU0w6OlZFUklGWV9OT05FKQorCisgICAgICBjbGllbnQud3JpdGUgInRlc3QiCisgICAgICBleHBlY3QoTmV0OjpIVFRQKS50byByZWNlaXZlKDpuZXcpLndpdGgoIm15LmRvbWFpbi5jb20iLCA0NDMpIGRvCisgICAgICAgIGRvdWJsZSgiTmV0OjpIVFRQIikudGFwIGRvIHxodHRwfAorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDp1c2Vfc3NsPSkud2l0aCh0cnVlKQorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDp2ZXJpZnlfbW9kZT0pLndpdGgoT3BlblNTTDo6U1NMOjpWRVJJRllfTk9ORSkKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6cG9zdCkud2l0aChAc2VydmljZV9wYXRoLCAidGVzdCIsCisgICAgICAgICAgICAgICJDb250ZW50LVR5cGUiID0+ICJhcHBsaWNhdGlvbi94LXRocmlmdCIpIGRvCisgICAgICAgICAgICBkb3VibGUoIk5ldDo6SFRUUE9LIikudGFwIGRvIHxyZXNwb25zZXwKKyAgICAgICAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50byByZWNlaXZlKDpib2R5KS5hbmRfcmV0dXJuICJkYXRhIgorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBjbGllbnQuZmx1c2gKKyAgICAgIGV4cGVjdChjbGllbnQucmVhZCg0KSkudG8gZXEoImRhdGEiKQorICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvanNvbl9wcm90b2NvbF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvanNvbl9wcm90b2NvbF9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMWFmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9qc29uX3Byb3RvY29sX3NwZWMucmIKQEAgLTAsMCArMSw1NTIgQEAKKyMgZW5jb2Rpbmc6IFVURi04CisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAnc3BlY19oZWxwZXInCisKK2Rlc2NyaWJlICdKc29uUHJvdG9jb2wnIGRvCisKKyAgZGVzY3JpYmUgVGhyaWZ0OjpKc29uUHJvdG9jb2wgZG8KKyAgICBiZWZvcmUoOmVhY2gpIGRvCisgICAgICBAdHJhbnMgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcKKyAgICAgIEBwcm90ID0gVGhyaWZ0OjpKc29uUHJvdG9jb2wubmV3KEB0cmFucykKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBlc2NhcGVkIGNoYXIiIGRvCisgICAgICBAcHJvdC53cml0ZV9qc29uX2VzY2FwZV9jaGFyKCJcbiIpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCdcdTAwMGEnKQorCisgICAgICBAcHJvdC53cml0ZV9qc29uX2VzY2FwZV9jaGFyKCIgIikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoJ1x1MDAyMCcpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gY2hhciIgZG8KKyAgICAgIEBwcm90LndyaXRlX2pzb25fY2hhcigiXG4iKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgnXFxuJykKKworICAgICAgQHByb3Qud3JpdGVfanNvbl9jaGFyKCIgIikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoJyAnKQorCisgICAgICBAcHJvdC53cml0ZV9qc29uX2NoYXIoIlxcIikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlxcXFwiKQorCisgICAgICBAcHJvdC53cml0ZV9qc29uX2NoYXIoIkAiKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgnQCcpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gc3RyaW5nIiBkbworICAgICAgQHByb3Qud3JpdGVfanNvbl9zdHJpbmcoInRoaXMgaXMgYSBcXCBqc29uXG5zdHJpbmciKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJ0aGlzIGlzIGEgXFxcXCBqc29uXFxuc3RyaW5nXCIiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIGJhc2U2NCIgZG8KKyAgICAgIEBwcm90LndyaXRlX2pzb25fYmFzZTY0KCJ0aGlzIGlzIGEgYmFzZTY0IHN0cmluZyIpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcImRHaHBjeUJwY3lCaElHSmhjMlUyTkNCemRISnBibWM9XCIiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIGludGVnZXIiIGRvCisgICAgICBAcHJvdC53cml0ZV9qc29uX2ludGVnZXIoNDUpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCI0NSIpCisKKyAgICAgIEBwcm90LndyaXRlX2pzb25faW50ZWdlcigzMzAwMCkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjMzMDAwIikKKworICAgICAgQHByb3Qud3JpdGVfanNvbl9pbnRlZ2VyKDMwMDAwMDAwMDApCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIzMDAwMDAwMDAwIikKKworICAgICAgQHByb3Qud3JpdGVfanNvbl9pbnRlZ2VyKDYwMDAwMDAwMDApCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCI2MDAwMDAwMDAwIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBkb3VibGUiIGRvCisgICAgICBAcHJvdC53cml0ZV9qc29uX2RvdWJsZSgxMi4zKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMTIuMyIpCisKKyAgICAgIEBwcm90LndyaXRlX2pzb25fZG91YmxlKC0zLjIxKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiLTMuMjEiKQorCisgICAgICBAcHJvdC53cml0ZV9qc29uX2RvdWJsZSgoKCsxLjAvMC4wKS8oKzEuMC8wLjApKSkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiTmFOXCIiKQorCisgICAgICBAcHJvdC53cml0ZV9qc29uX2RvdWJsZSgoKzEuMC8wLjApKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJJbmZpbml0eVwiIikKKworICAgICAgQHByb3Qud3JpdGVfanNvbl9kb3VibGUoKC0xLjAvMC4wKSkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiLUluZmluaXR5XCIiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIG9iamVjdCBzdGFydCIgZG8KKyAgICAgIEBwcm90LndyaXRlX2pzb25fb2JqZWN0X3N0YXJ0CisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJ7IikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBvYmplY3QgZW5kIiBkbworICAgICAgQHByb3Qud3JpdGVfanNvbl9vYmplY3RfZW5kCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJ9IikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBhcnJheSBzdGFydCIgZG8KKyAgICAgIEBwcm90LndyaXRlX2pzb25fYXJyYXlfc3RhcnQKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlsiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIGFycmF5IGVuZCIgZG8KKyAgICAgIEBwcm90LndyaXRlX2pzb25fYXJyYXlfZW5kCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJdIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgbWVzc2FnZSBiZWdpbiIgZG8KKyAgICAgIEBwcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oIm5hbWUiLCAxMiwgMzIpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJbMSxcIm5hbWVcIiwxMiwzMiIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIG1lc3NhZ2UgZW5kIiBkbworICAgICAgQHByb3Qud3JpdGVfbWVzc2FnZV9lbmQKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIl0iKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBzdHJ1Y3QgYmVnaW4iIGRvCisgICAgICBAcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oIm5hbWUiKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgieyIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIHN0cnVjdCBlbmQiIGRvCisgICAgICBAcHJvdC53cml0ZV9zdHJ1Y3RfZW5kCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJ9IikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgZmllbGQgYmVnaW4iIGRvCisgICAgICBAcHJvdC53cml0ZV9maWVsZF9iZWdpbigibmFtZSIsIFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgMzIpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIzMntcInJlY1wiIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgZmllbGQgZW5kIiBkbworICAgICAgQHByb3Qud3JpdGVfZmllbGRfZW5kCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJ9IikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgZmllbGQgc3RvcCIgZG8KKyAgICAgIEBwcm90LndyaXRlX2ZpZWxkX3N0b3AKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIiIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIG1hcCBiZWdpbiIgZG8KKyAgICAgIEBwcm90LndyaXRlX21hcF9iZWdpbihUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIFRocmlmdDo6VHlwZXM6OkxJU1QsIDMyKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiW1wicmVjXCIsXCJsc3RcIiwzMix7IikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgbWFwIGVuZCIgZG8KKyAgICAgIEBwcm90LndyaXRlX21hcF9lbmQKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIn1dIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgbGlzdCBiZWdpbiIgZG8KKyAgICAgIEBwcm90LndyaXRlX2xpc3RfYmVnaW4oVGhyaWZ0OjpUeXBlczo6U1RSVUNULCAzMikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIltcInJlY1wiLDMyIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgbGlzdCBlbmQiIGRvCisgICAgICBAcHJvdC53cml0ZV9saXN0X2VuZAorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXSIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIHNldCBiZWdpbiIgZG8KKyAgICAgIEBwcm90LndyaXRlX3NldF9iZWdpbihUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDMyKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiW1wicmVjXCIsMzIiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBzZXQgZW5kIiBkbworICAgICAgQHByb3Qud3JpdGVfc2V0X2VuZAorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXSIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIGJvb2wiIGRvCisgICAgICBAcHJvdC53cml0ZV9ib29sKHRydWUpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIxIikKKworICAgICAgQHByb3Qud3JpdGVfYm9vbChmYWxzZSkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjAiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBieXRlIiBkbworICAgICAgQHByb3Qud3JpdGVfYnl0ZSgxMDApCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIxMDAiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBpMTYiIGRvCisgICAgICBAcHJvdC53cml0ZV9pMTYoMTAwMCkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjEwMDAiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBpMzIiIGRvCisgICAgICBAcHJvdC53cml0ZV9pMzIoMzAwMDAwMDAwMCkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjMwMDAwMDAwMDAiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBpNjQiIGRvCisgICAgICBAcHJvdC53cml0ZV9pNjQoNjAwMDAwMDAwMCkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjYwMDAwMDAwMDAiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBkb3VibGUiIGRvCisgICAgICBAcHJvdC53cml0ZV9kb3VibGUoMS4yMykKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjEuMjMiKQorCisgICAgICBAcHJvdC53cml0ZV9kb3VibGUoLTMyLjEpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCItMzIuMSIpCisKKyAgICAgIEBwcm90LndyaXRlX2RvdWJsZSgoKCsxLjAvMC4wKS8oKzEuMC8wLjApKSkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiTmFOXCIiKQorCisgICAgICBAcHJvdC53cml0ZV9kb3VibGUoKCsxLjAvMC4wKSkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiSW5maW5pdHlcIiIpCisKKyAgICAgIEBwcm90LndyaXRlX2RvdWJsZSgoLTEuMC8wLjApKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCItSW5maW5pdHlcIiIpCisgICAgZW5kCisKKyAgICBpZiBSVUJZX1ZFUlNJT04gPj0gJzEuOScKKyAgICAgIGl0ICdzaG91bGQgd3JpdGUgc3RyaW5nJyBkbworICAgICAgICBAcHJvdC53cml0ZV9zdHJpbmcoJ3RoaXMgaXMgYSB0ZXN0IHN0cmluZycpCisgICAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQorICAgICAgICBleHBlY3QoYSkudG8gZXEoJyJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciJy5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6QklOQVJZKSkKKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICBlbmQKKworICAgICAgaXQgJ3Nob3VsZCB3cml0ZSBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnMnIGRvCisgICAgICAgIEBwcm90LndyaXRlX3N0cmluZygidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzOiBcdTIwQUMgXHUyMEFEIikKKyAgICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCisgICAgICAgIGV4cGVjdChhKS50byBlcSgiXCJ0aGlzIGlzIGEgdGVzdCBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnM6IFx1MjBBQyBcdTIwQURcIiIuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OkJJTkFSWSkpCisgICAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgZW5kCisgICAgZWxzZQorICAgICAgaXQgJ3Nob3VsZCB3cml0ZSBzdHJpbmcnIGRvCisgICAgICAgIEBwcm90LndyaXRlX3N0cmluZygndGhpcyBpcyBhIHRlc3Qgc3RyaW5nJykKKyAgICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgnInRoaXMgaXMgYSB0ZXN0IHN0cmluZyInKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIGJpbmFyeSIgZG8KKyAgICAgIEBwcm90LndyaXRlX2JpbmFyeSgidGhpcyBpcyBhIGJhc2U2NCBzdHJpbmciKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJkR2hwY3lCcGN5QmhJR0poYzJVMk5DQnpkSEpwYm1jPVwiIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgbG9uZyBiaW5hcnkiIGRvCisgICAgICBAcHJvdC53cml0ZV9iaW5hcnkoKDAuLi4yNTYpLnRvX2EucGFjaygnQyonKSkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiQUFFQ0F3UUZCZ2NJQ1FvTERBME9EeEFSRWhNVUZSWVhHQmthR3h3ZEhoOGdJU0lqSkNVbUp5Z3BLaXNzTFM0dk1ERXlNelExTmpjNE9UbzdQRDArUDBCQlFrTkVSVVpIU0VsS1MweE5UazlRVVZKVFZGVldWMWhaV2x0Y1hWNWZZR0ZpWTJSbFptZG9hV3ByYkcxdWIzQnhjbk4wZFhaM2VIbDZlM3g5Zm4rQWdZS0RoSVdHaDRpSmlvdU1qWTZQa0pHU2s1U1ZscGVZbVpxYm5KMmVuNkNob3FPa3BhYW5xS21xcTZ5dHJxK3dzYkt6dExXMnQ3aTV1cnU4dmI2L3dNSEN3OFRGeHNmSXljckx6TTNPejlEUjB0UFUxZGJYMk5uYTI5emQzdC9nNGVMajVPWG01K2pwNnV2czdlN3Y4UEh5OC9UMTl2ZjQrZnI3L1AzKy93PT1cIiIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIGdldCB0eXBlIG5hbWUgZm9yIHR5cGUgaWQiIGRvCisgICAgICBleHBlY3Qge0Bwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6U1RPUCl9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgICBleHBlY3Qge0Bwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6Vk9JRCl9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpCT09MKSkudG8gZXEoInRmIikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkJZVEUpKS50byBlcSgiaTgiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6RE9VQkxFKSkudG8gZXEoImRibCIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpJMTYpKS50byBlcSgiaTE2IikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkkzMikpLnRvIGVxKCJpMzIiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6STY0KSkudG8gZXEoImk2NCIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpTVFJJTkcpKS50byBlcSgic3RyIikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OlNUUlVDVCkpLnRvIGVxKCJyZWMiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6TUFQKSkudG8gZXEoIm1hcCIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpTRVQpKS50byBlcSgic2V0IikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkxJU1QpKS50byBlcSgibHN0IikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgZ2V0IHR5cGUgaWQgZm9yIHR5cGUgbmFtZSIgZG8KKyAgICAgIGV4cGVjdCB7QHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgicHAiKX0udG8gcmFpc2VfZXJyb3IoTm90SW1wbGVtZW50ZWRFcnJvcikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJ0ZiIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpCT09MKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImk4IikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OkJZVEUpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgiZGJsIikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OkRPVUJMRSkKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJpMTYiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6STE2KQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImkzMiIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpJMzIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgiaTY0IikpLnRvIGVxKFRocmlmdDo6VHlwZXM6Okk2NCkKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJzdHIiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6U1RSSU5HKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoInJlYyIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgibWFwIikpLnRvIGVxKFRocmlmdDo6VHlwZXM6Ok1BUCkKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJzZXQiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6U0VUKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImxzdCIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpMSVNUKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGpzb24gc3ludGF4IGNoYXIiIGRvCisgICAgICBAdHJhbnMud3JpdGUoJ0YnKQorICAgICAgZXhwZWN0IHtAcHJvdC5yZWFkX2pzb25fc3ludGF4X2NoYXIoJ0cnKX0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbikKKyAgICAgIEB0cmFucy53cml0ZSgnSCcpCisgICAgICBAcHJvdC5yZWFkX2pzb25fc3ludGF4X2NoYXIoJ0gnKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGpzb24gZXNjYXBlIGNoYXIiIGRvCisgICAgICBAdHJhbnMud3JpdGUoJzAwNTQnKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9lc2NhcGVfY2hhcikudG8gZXEoJ1QnKQorCisgICAgICBAdHJhbnMud3JpdGUoIlwiXFxcIlwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fc3RyaW5nKGZhbHNlKSkudG8gZXEoIlwiIikKKworICAgICAgQHRyYW5zLndyaXRlKCJcIlxcXFxcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcXCIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXC9cIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcLyIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXGJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcYiIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXGZcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcZiIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXG5cIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcbiIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXHJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcciIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXHRcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcdCIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQganNvbiBzdHJpbmciIGRvCisgICAgICBAdHJhbnMud3JpdGUoIlwiXFxQIikKKyAgICAgIGV4cGVjdCB7QHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSl9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24pCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJ0aGlzIGlzIGEgdGVzdCBzdHJpbmdcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZykudG8gZXEoInRoaXMgaXMgYSB0ZXN0IHN0cmluZyIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQganNvbiBiYXNlNjQiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIlwiZEdocGN5QnBjeUJoSUhSbGMzUWdjM1J5YVc1blwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fYmFzZTY0KS50byBlcSgidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgaXMganNvbiBudW1lcmljIiBkbworICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiQSIpKS50byBlcShmYWxzZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIisiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIi0iKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIi4iKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjAiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjEiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjIiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjMiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjQiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjUiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjYiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjciKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjgiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjkiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIkUiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoImUiKSkudG8gZXEodHJ1ZSkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIG51bWVyaWMgY2hhcnMiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIjEuNDUzRTQ1VCIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX251bWVyaWNfY2hhcnMpLnRvIGVxKCIxLjQ1M0U0NSIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQganNvbiBpbnRlZ2VyIiBkbworICAgICAgQHRyYW5zLndyaXRlKCIxLjQ1XCJcIiIpCisgICAgICBleHBlY3Qge0Bwcm90LnJlYWRfanNvbl9pbnRlZ2VyfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uKQorICAgICAgQHByb3QucmVhZF9zdHJpbmcKKworICAgICAgQHRyYW5zLndyaXRlKCIxNDUzVCIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX2ludGVnZXIpLnRvIGVxKDE0NTMpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQganNvbiBkb3VibGUiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIjEuNDVlM2UwMVwiXCIiKQorICAgICAgZXhwZWN0IHtAcHJvdC5yZWFkX2pzb25fZG91YmxlfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uKQorICAgICAgQHByb3QucmVhZF9zdHJpbmcKKworICAgICAgQHRyYW5zLndyaXRlKCJcIjEuNDUzZTAxXCIiKQorICAgICAgZXhwZWN0IHtAcHJvdC5yZWFkX2pzb25fZG91YmxlfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uKQorCisgICAgICBAdHJhbnMud3JpdGUoIjEuNDUzZTAxXCJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX2RvdWJsZSkudG8gZXEoMTQuNTMpCisgICAgICBAcHJvdC5yZWFkX3N0cmluZworCisgICAgICBAdHJhbnMud3JpdGUoIlwiTmFOXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9kb3VibGUubmFuPykudG8gZXEodHJ1ZSkKKworICAgICAgQHRyYW5zLndyaXRlKCJcIkluZmluaXR5XCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9kb3VibGUpLnRvIGVxKCsxLjAvMC4wKQorCisgICAgICBAdHJhbnMud3JpdGUoIlwiLUluZmluaXR5XCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9kb3VibGUpLnRvIGVxKC0xLjAvMC4wKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGpzb24gb2JqZWN0IHN0YXJ0IiBkbworICAgICAgQHRyYW5zLndyaXRlKCJ7IikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fb2JqZWN0X3N0YXJ0KS50byBlcShuaWwpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQganNvbiBvYmplY3QgZW5kIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJ9IikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fb2JqZWN0X2VuZCkudG8gZXEobmlsKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGpzb24gYXJyYXkgc3RhcnQiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIlsiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9hcnJheV9zdGFydCkudG8gZXEobmlsKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGpzb24gYXJyYXkgZW5kIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJdIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fYXJyYXlfZW5kKS50byBlcShuaWwpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWRfbWVzc2FnZV9iZWdpbiIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiWzIsIikKKyAgICAgIGV4cGVjdCB7QHByb3QucmVhZF9tZXNzYWdlX2JlZ2lufS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uKQorCisgICAgICBAdHJhbnMud3JpdGUoIlsxLFwibmFtZVwiLDEyLDMyXCJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luKS50byBlcShbIm5hbWUiLCAxMiwgMzJdKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIG1lc3NhZ2UgZW5kIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJdIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX21lc3NhZ2VfZW5kKS50byBlcShuaWwpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgc3RydWN0IGJlZ2luIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJ7IikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX3N0cnVjdF9iZWdpbikudG8gZXEobmlsKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIHN0cnVjdCBlbmQiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIn0iKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfc3RydWN0X2VuZCkudG8gZXEobmlsKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGZpZWxkIGJlZ2luIiBkbworICAgICAgQHRyYW5zLndyaXRlKCIxe1wicmVjXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfZmllbGRfYmVnaW4pLnRvIGVxKFtuaWwsIDEyLCAxXSkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBmaWVsZCBlbmQiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIn0iKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfZmllbGRfZW5kKS50byBlcShuaWwpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgbWFwIGJlZ2luIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJbXCJyZWNcIixcImxzdFwiLDIseyIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9tYXBfYmVnaW4pLnRvIGVxKFsxMiwgMTUsIDJdKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIG1hcCBlbmQiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIn1dIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX21hcF9lbmQpLnRvIGVxKG5pbCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBsaXN0IGJlZ2luIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJbXCJyZWNcIiwyXCJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9saXN0X2JlZ2luKS50byBlcShbMTIsIDJdKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGxpc3QgZW5kIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJdIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2xpc3RfZW5kKS50byBlcShuaWwpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgc2V0IGJlZ2luIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJbXCJyZWNcIiwyXCJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9zZXRfYmVnaW4pLnRvIGVxKFsxMiwgMl0pCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgc2V0IGVuZCIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiXSIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9zZXRfZW5kKS50byBlcShuaWwpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgYm9vbCIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiMFwiXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfYm9vbCkudG8gZXEoZmFsc2UpCisgICAgICBAcHJvdC5yZWFkX3N0cmluZworCisgICAgICBAdHJhbnMud3JpdGUoIjFcIlwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2Jvb2wpLnRvIGVxKHRydWUpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgYnl0ZSIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiNjBcIlwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2J5dGUpLnRvIGVxKDYwKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGkxNiIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiMTAwMFwiXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfaTE2KS50byBlcSgxMDAwKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGkzMiIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiMzAwMDAwMDAwMFwiXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfaTMyKS50byBlcSgzMDAwMDAwMDAwKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGk2NCIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiNjAwMDAwMDAwMFwiXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfaTY0KS50byBlcSg2MDAwMDAwMDAwKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGRvdWJsZSIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiMTIuMjNcIlwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2RvdWJsZSkudG8gZXEoMTIuMjMpCisgICAgZW5kCisKKyAgICBpZiBSVUJZX1ZFUlNJT04gPj0gJzEuOScKKyAgICAgIGl0ICdzaG91bGQgcmVhZCBzdHJpbmcnIGRvCisgICAgICAgIEB0cmFucy53cml0ZSgnInRoaXMgaXMgYSB0ZXN0IHN0cmluZyInLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpCSU5BUlkpKQorICAgICAgICBhID0gQHByb3QucmVhZF9zdHJpbmcKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKCd0aGlzIGlzIGEgdGVzdCBzdHJpbmcnKQorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OlVURl84KQorICAgICAgZW5kCisKKyAgICAgIGl0ICdzaG91bGQgcmVhZCBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnMnIGRvCisgICAgICAgIEB0cmFucy53cml0ZSgnInRoaXMgaXMgYSB0ZXN0IHN0cmluZyB3aXRoIHVuaWNvZGUgY2hhcmFjdGVyczogXHUyMEFDIFx1MjBBRCInLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpCSU5BUlkpKQorICAgICAgICBhID0gQHByb3QucmVhZF9zdHJpbmcKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKCJ0aGlzIGlzIGEgdGVzdCBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnM6IFx1MjBBQyBcdTIwQUQiKQorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OlVURl84KQorICAgICAgZW5kCisgICAgZWxzZQorICAgICAgaXQgJ3Nob3VsZCByZWFkIHN0cmluZycgZG8KKyAgICAgICAgQHRyYW5zLndyaXRlKCcidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIicpCisgICAgICAgIGV4cGVjdChAcHJvdC5yZWFkX3N0cmluZykudG8gZXEoJ3RoaXMgaXMgYSB0ZXN0IHN0cmluZycpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBiaW5hcnkiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIlwiZEdocGN5QnBjeUJoSUhSbGMzUWdjM1J5YVc1blwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2JpbmFyeSkudG8gZXEoInRoaXMgaXMgYSB0ZXN0IHN0cmluZyIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgbG9uZyBiaW5hcnkiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIlwiQUFFQ0F3UUZCZ2NJQ1FvTERBME9EeEFSRWhNVUZSWVhHQmthR3h3ZEhoOGdJU0lqSkNVbUp5Z3BLaXNzTFM0dk1ERXlNelExTmpjNE9UbzdQRDArUDBCQlFrTkVSVVpIU0VsS1MweE5UazlRVVZKVFZGVldWMWhaV2x0Y1hWNWZZR0ZpWTJSbFptZG9hV3ByYkcxdWIzQnhjbk4wZFhaM2VIbDZlM3g5Zm4rQWdZS0RoSVdHaDRpSmlvdU1qWTZQa0pHU2s1U1ZscGVZbVpxYm5KMmVuNkNob3FPa3BhYW5xS21xcTZ5dHJxK3dzYkt6dExXMnQ3aTV1cnU4dmI2L3dNSEN3OFRGeHNmSXljckx6TTNPejlEUjB0UFUxZGJYMk5uYTI5emQzdC9nNGVMajVPWG01K2pwNnV2czdlN3Y4UEh5OC9UMTl2ZjQrZnI3L1AzKy93PT1cIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9iaW5hcnkuYnl0ZXMudG9fYSkudG8gZXEoKDAuLi4yNTYpLnRvX2EpCisgICAgZW5kCisgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAcHJvdC50b19zKS50byBlcSgianNvbihtZW1vcnkpIikKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVzY3JpYmUgVGhyaWZ0OjpKc29uUHJvdG9jb2xGYWN0b3J5IGRvCisgICAgaXQgInNob3VsZCBjcmVhdGUgYSBKc29uUHJvdG9jb2wiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpKc29uUHJvdG9jb2xGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2woZG91YmxlKCJNb2NrVHJhbnNwb3J0IikpKS50byBiZV9pbnN0YW5jZV9vZihUaHJpZnQ6Okpzb25Qcm90b2NvbCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6Okpzb25Qcm90b2NvbEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJqc29uIikKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL21vbmdyZWxfaHR0cF9zZXJ2ZXJfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL21vbmdyZWxfaHR0cF9zZXJ2ZXJfc3BlYy5yYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5NDQ5MS4uMDAwMDAwMAotLS0gYS9saWIvcmIvc3BlYy9tb25ncmVsX2h0dHBfc2VydmVyX3NwZWMucmIKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCi1yZXF1aXJlICd0aHJpZnQvc2VydmVyL21vbmdyZWxfaHR0cF9zZXJ2ZXInCi0KLWNsYXNzIFRocmlmdEhUVFBTZXJ2ZXJTcGVjIDwgU3BlYzo6RXhhbXBsZUdyb3VwCi0gIGluY2x1ZGUgVGhyaWZ0Ci0KLSAgSGFuZGxlciA9IE1vbmdyZWxIVFRQU2VydmVyOjpIYW5kbGVyCi0KLSAgZGVzY3JpYmUgTW9uZ3JlbEhUVFBTZXJ2ZXIgZG8KLSAgICBpdCAic2hvdWxkIGhhdmUgYXBwcm9wcmlhdGUgZGVmYXVsdHMiIGRvCi0gICAgICBtb2NrX2ZhY3RvcnkgPSBtb2NrKCJCaW5hcnlQcm90b2NvbEZhY3RvcnkiKQotICAgICAgbW9ja19wcm9jID0gbW9jaygiUHJvY2Vzc29yIikKLSAgICAgIEJpbmFyeVByb3RvY29sRmFjdG9yeS5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKG1vY2tfZmFjdG9yeSkKLSAgICAgIE1vbmdyZWw6Okh0dHBTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgiMC4wLjAuMCIsIDgwKS5hbmRfcmV0dXJuIGRvCi0gICAgICAgIG1vY2soIk1vbmdyZWw6Okh0dHBTZXJ2ZXIiKS50ZWUgZG8gfG1vY2t8Ci0gICAgICAgICAgaGFuZGxlciA9IG1vY2soIkhhbmRsZXIiKQotICAgICAgICAgIEhhbmRsZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChtb2NrX3Byb2MsIG1vY2tfZmFjdG9yeSkuYW5kX3JldHVybihoYW5kbGVyKQotICAgICAgICAgIG1vY2suc2hvdWxkX3JlY2VpdmUoOnJlZ2lzdGVyKS53aXRoKCIvIiwgaGFuZGxlcikKLSAgICAgICAgZW5kCi0gICAgICBlbmQKLSAgICAgIE1vbmdyZWxIVFRQU2VydmVyLm5ldyhtb2NrX3Byb2MpCi0gICAgZW5kCi0KLSAgICBpdCAic2hvdWxkIHVuZGVyc3RhbmQgOmlwLCA6cG9ydCwgOnBhdGgsIGFuZCA6cHJvdG9jb2xfZmFjdG9yeSIgZG8KLSAgICAgIG1vY2tfcHJvYyA9IG1vY2soIlByb2Nlc3NvciIpCi0gICAgICBtb2NrX2ZhY3RvcnkgPSBtb2NrKCJQcm90b2NvbEZhY3RvcnkiKQotICAgICAgTW9uZ3JlbDo6SHR0cFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKCIxLjIuMy40IiwgMTIzNCkuYW5kX3JldHVybiBkbwotICAgICAgICBtb2NrKCJNb25ncmVsOjpIdHRwU2VydmVyIikudGVlIGRvIHxtb2NrfAotICAgICAgICAgIGhhbmRsZXIgPSBtb2NrKCJIYW5kbGVyIikKLSAgICAgICAgICBIYW5kbGVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgobW9ja19wcm9jLCBtb2NrX2ZhY3RvcnkpLmFuZF9yZXR1cm4oaGFuZGxlcikKLSAgICAgICAgICBtb2NrLnNob3VsZF9yZWNlaXZlKDpyZWdpc3Rlcikud2l0aCgiL2ZvbyIsIGhhbmRsZXIpCi0gICAgICAgIGVuZAotICAgICAgZW5kCi0gICAgICBNb25ncmVsSFRUUFNlcnZlci5uZXcobW9ja19wcm9jLCA6aXAgPT4gIjEuMi4zLjQiLCA6cG9ydCA9PiAxMjM0LCA6cGF0aCA9PiAiZm9vIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpwcm90b2NvbF9mYWN0b3J5ID0+IG1vY2tfZmFjdG9yeSkKLSAgICBlbmQKLQotICAgIGl0ICJzaG91bGQgc2VydmUgdXNpbmcgTW9uZ3JlbDo6SHR0cFNlcnZlciIgZG8KLSAgICAgIEJpbmFyeVByb3RvY29sRmFjdG9yeS5zdHViISg6bmV3KQotICAgICAgTW9uZ3JlbDo6SHR0cFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuIGRvCi0gICAgICAgIG1vY2soIk1vbmdyZWw6Okh0dHBTZXJ2ZXIiKS50ZWUgZG8gfG1vY2t8Ci0gICAgICAgICAgSGFuZGxlci5zdHViISg6bmV3KQotICAgICAgICAgIG1vY2suc3R1YiEoOnJlZ2lzdGVyKQotICAgICAgICAgIG1vY2suc2hvdWxkX3JlY2VpdmUoOnJ1bikuYW5kX3JldHVybiBkbwotICAgICAgICAgICAgbW9jaygiTW9uZ3JlbDo6SHR0cFNlcnZlci5ydW4iKS50ZWUgZG8gfHJ1bm5lcnwKLSAgICAgICAgICAgICAgcnVubmVyLnNob3VsZF9yZWNlaXZlKDpqb2luKQotICAgICAgICAgICAgZW5kCi0gICAgICAgICAgZW5kCi0gICAgICAgIGVuZAotICAgICAgZW5kCi0gICAgICBNb25ncmVsSFRUUFNlcnZlci5uZXcobmlsKS5zZXJ2ZQotICAgIGVuZAotICBlbmQKLQotICBkZXNjcmliZSBNb25ncmVsSFRUUFNlcnZlcjo6SGFuZGxlciBkbwotICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBwcm9jZXNzb3IgPSBtb2NrKCJQcm9jZXNzb3IiKQotICAgICAgQGZhY3RvcnkgPSBtb2NrKCJQcm90b2NvbEZhY3RvcnkiKQotICAgICAgQGhhbmRsZXIgPSBIYW5kbGVyLm5ldyhAcHJvY2Vzc29yLCBAZmFjdG9yeSkKLSAgICBlbmQKLQotICAgIGl0ICJzaG91bGQgcmV0dXJuIDQwNCBmb3Igbm9uLVBPU1QgcmVxdWVzdHMiIGRvCi0gICAgICByZXF1ZXN0ID0gbW9jaygicmVxdWVzdCIsIDpwYXJhbXMgPT4geyJSRVFVRVNUX01FVEhPRCIgPT4gIkdFVCJ9KQotICAgICAgcmVzcG9uc2UgPSBtb2NrKCJyZXNwb25zZSIpCi0gICAgICByZXNwb25zZS5zaG91bGRfcmVjZWl2ZSg6c3RhcnQpLndpdGgoNDA0KQotICAgICAgcmVzcG9uc2Uuc2hvdWxkX25vdF9yZWNlaXZlKDpzdGFydCkud2l0aCgyMDApCi0gICAgICBAaGFuZGxlci5wcm9jZXNzKHJlcXVlc3QsIHJlc3BvbnNlKQotICAgIGVuZAotCi0gICAgaXQgInNob3VsZCBzZXJ2ZSB1c2luZyBhcHBsaWNhdGlvbi94LXRocmlmdCIgZG8KLSAgICAgIHJlcXVlc3QgPSBtb2NrKCJyZXF1ZXN0IiwgOnBhcmFtcyA9PiB7IlJFUVVFU1RfTUVUSE9EIiA9PiAiUE9TVCJ9LCA6Ym9keSA9PiBuaWwpCi0gICAgICByZXNwb25zZSA9IG1vY2soInJlc3BvbnNlIikKLSAgICAgIGhlYWQgPSBtb2NrKCJoZWFkIikKLSAgICAgIGhlYWQuc2hvdWxkX3JlY2VpdmUoOltdPSkud2l0aCgiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKLSAgICAgIElPU3RyZWFtVHJhbnNwb3J0LnN0dWIhKDpuZXcpCi0gICAgICBAZmFjdG9yeS5zdHViISg6Z2V0X3Byb3RvY29sKQotICAgICAgQHByb2Nlc3Nvci5zdHViISg6cHJvY2VzcykKLSAgICAgIHJlc3BvbnNlLnNob3VsZF9yZWNlaXZlKDpzdGFydCkud2l0aCgyMDApLmFuZF95aWVsZChoZWFkLCBuaWwpCi0gICAgICBAaGFuZGxlci5wcm9jZXNzKHJlcXVlc3QsIHJlc3BvbnNlKQotICAgIGVuZAotCi0gICAgaXQgInNob3VsZCB1c2UgdGhlIElPU3RyZWFtVHJhbnNwb3J0IiBkbwotICAgICAgYm9keSA9IG1vY2soImJvZHkiKQotICAgICAgcmVxdWVzdCA9IG1vY2soInJlcXVlc3QiLCA6cGFyYW1zID0+IHsiUkVRVUVTVF9NRVRIT0QiID0+ICJQT1NUIn0sIDpib2R5ID0+IGJvZHkpCi0gICAgICByZXNwb25zZSA9IG1vY2soInJlc3BvbnNlIikKLSAgICAgIGhlYWQgPSBtb2NrKCJoZWFkIikKLSAgICAgIGhlYWQuc3R1YiEoOltdPSkKLSAgICAgIG91dCA9IG1vY2soIm91dCIpCi0gICAgICBwcm90b2NvbCA9IG1vY2soInByb3RvY29sIikKLSAgICAgIHRyYW5zcG9ydCA9IG1vY2soInRyYW5zcG9ydCIpCi0gICAgICBJT1N0cmVhbVRyYW5zcG9ydC5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKGJvZHksIG91dCkuYW5kX3JldHVybih0cmFuc3BvcnQpCi0gICAgICBAZmFjdG9yeS5zaG91bGRfcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS53aXRoKHRyYW5zcG9ydCkuYW5kX3JldHVybihwcm90b2NvbCkKLSAgICAgIEBwcm9jZXNzb3Iuc2hvdWxkX3JlY2VpdmUoOnByb2Nlc3MpLndpdGgocHJvdG9jb2wsIHByb3RvY29sKQotICAgICAgcmVzcG9uc2Uuc2hvdWxkX3JlY2VpdmUoOnN0YXJ0KS53aXRoKDIwMCkuYW5kX3lpZWxkKGhlYWQsIG91dCkKLSAgICAgIEBoYW5kbGVyLnByb2Nlc3MocmVxdWVzdCwgcmVzcG9uc2UpCi0gICAgZW5kCi0gIGVuZAotZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9uYW1lc3BhY2VkX3NwZWMucmIgYi9saWIvcmIvc3BlYy9uYW1lc3BhY2VkX3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2ZDM2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL25hbWVzcGFjZWRfc3BlYy5yYgpAQCAtMCwwICsxLDY3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAnc3BlY19oZWxwZXInCisKK2Rlc2NyaWJlICduYW1lc3BhY2VkIGdlbmVyYXRpb24nIGRvCisgIGJlZm9yZSBkbworICAgIHJlcXVpcmUgJ25hbWVzcGFjZWRfc3BlY19uYW1lc3BhY2UvbmFtZXNwYWNlZF9ub25ibG9ja2luZ19zZXJ2aWNlJworICBlbmQKKworICBpdCAiZ2VuZXJhdGVkIHRoZSByaWdodCBmaWxlcyIgZG8KKyAgICBwcmVmaXggPSBGaWxlLmV4cGFuZF9wYXRoKCIuLi9nZW4tcmIiLCBfX0ZJTEVfXykKKyAgICBbIm5hbWVzcGFjZWRfc3BlY19uYW1lc3BhY2UvbmFtZXNwYWNlZF9ub25ibG9ja2luZ19zZXJ2aWNlLnJiIiwKKyAgICAgIm5hbWVzcGFjZWRfc3BlY19uYW1lc3BhY2UvdGhyaWZ0X25hbWVzcGFjZWRfc3BlY19jb25zdGFudHMucmIiLAorICAgICAibmFtZXNwYWNlZF9zcGVjX25hbWVzcGFjZS90aHJpZnRfbmFtZXNwYWNlZF9zcGVjX3R5cGVzLnJiIiwKKyAgICAgIm90aGVyX25hbWVzcGFjZS9yZWZlcmVuY2VkX2NvbnN0YW50cy5yYiIsCisgICAgICJvdGhlcl9uYW1lc3BhY2UvcmVmZXJlbmNlZF90eXBlcy5yYiIKKyAgICBdLmVhY2ggZG8gfG5hbWV8CisgICAgICBleHBlY3QoRmlsZS5leGlzdD8oRmlsZS5qb2luKHByZWZpeCwgbmFtZSkpKS50byBiZV90cnV0aHkKKyAgICBlbmQKKyAgZW5kCisKKyAgaXQgImRpZCBub3QgZ2VuZXJhdGUgdGhlIHdyb25nIGZpbGVzIiBkbworICAgIHByZWZpeCA9IEZpbGUuZXhwYW5kX3BhdGgoIi4uL2dlbi1yYiIsIF9fRklMRV9fKQorICAgIFsibmFtZXNwYWNlZF9ub25ibG9ja2luZ19zZXJ2aWNlLnJiIiwKKyAgICAgInRocmlmdF9uYW1lc3BhY2VkX3NwZWNfY29uc3RhbnRzLnJiIiwKKyAgICAgInRocmlmdF9uYW1lc3BhY2VkX3NwZWNfdHlwZXMucmIiLAorICAgICAicmVmZXJlbmNlZF9jb25zdGFudHMucmIiLAorICAgICAicmVmZXJlbmNlZF90eXBlcy5yYiIKKyAgICBdLmVhY2ggZG8gfG5hbWV8CisgICAgICBleHBlY3QoRmlsZS5leGlzdD8oRmlsZS5qb2luKHByZWZpeCwgbmFtZSkpKS5ub3RfdG8gYmVfdHJ1dGh5CisgICAgZW5kCisgIGVuZAorCisgIGl0ICJoYXMgYSBzZXJ2aWNlIGNsYXNzIGluIHRoZSByaWdodCBwbGFjZSIgZG8KKyAgICBleHBlY3QoZGVmaW5lZD8oTmFtZXNwYWNlZFNwZWNOYW1lc3BhY2U6Ok5hbWVzcGFjZWROb25ibG9ja2luZ1NlcnZpY2UpKS50byBiZV90cnV0aHkKKyAgZW5kCisKKyAgaXQgImhhcyBhIHN0cnVjdCBpbiB0aGUgcmlnaHQgcGxhY2UiIGRvCisgICAgZXhwZWN0KGRlZmluZWQ/KE5hbWVzcGFjZWRTcGVjTmFtZXNwYWNlOjpIZWxsbykpLnRvIGJlX3RydXRoeQorICBlbmQKKworICBpdCAicmVxdWlyZWQgYW4gaW5jbHVkZWQgZmlsZSIgZG8KKyAgICBleHBlY3QoZGVmaW5lZD8oT3RoZXJOYW1lc3BhY2U6OlNvbWVFbnVtKSkudG8gYmVfdHJ1dGh5CisgIGVuZAorCisgIGl0ICJleHRlbmRlZCBhIHNlcnZpY2UiIGRvCisgICAgcmVxdWlyZSAiZXh0ZW5kZWQvZXh0ZW5kZWRfc2VydmljZSIKKyAgZW5kCisKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvbm9uYmxvY2tpbmdfc2VydmVyX3NwZWMucmIgYi9saWIvcmIvc3BlYy9ub25ibG9ja2luZ19zZXJ2ZXJfc3BlYy5yYgppbmRleCBlYWQ1MWQ3Li42MTNkODgzIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9ub25ibG9ja2luZ19zZXJ2ZXJfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9ub25ibG9ja2luZ19zZXJ2ZXJfc3BlYy5yYgpAQCAtMTcsMTEgKzE3LDkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAotY2xhc3MgVGhyaWZ0Tm9uYmxvY2tpbmdTZXJ2ZXJTcGVjIDwgU3BlYzo6RXhhbXBsZUdyb3VwCi0gIGluY2x1ZGUgVGhyaWZ0Ci0gIGluY2x1ZGUgU3BlY05hbWVzcGFjZQorZGVzY3JpYmUgJ05vbmJsb2NraW5nU2VydmVyJyBkbwogCiAgIGNsYXNzIEhhbmRsZXIKICAgICBkZWYgaW5pdGlhbGl6ZQpAQCAtNTUsNyArNTMsNyBAQAogICAgIGVuZAogICBlbmQKIAotICBjbGFzcyBTcGVjVHJhbnNwb3J0IDwgQmFzZVRyYW5zcG9ydAorICBjbGFzcyBTcGVjVHJhbnNwb3J0IDwgVGhyaWZ0OjpCYXNlVHJhbnNwb3J0CiAgICAgZGVmIGluaXRpYWxpemUodHJhbnNwb3J0LCBxdWV1ZSkKICAgICAgIEB0cmFuc3BvcnQgPSB0cmFuc3BvcnQKICAgICAgIEBxdWV1ZSA9IHF1ZXVlCkBAIC04OSw3ICs4Nyw3IEBACiAgICAgZW5kCiAgIGVuZAogCi0gIGNsYXNzIFNwZWNTZXJ2ZXJTb2NrZXQgPCBTZXJ2ZXJTb2NrZXQKKyAgY2xhc3MgU3BlY1NlcnZlclNvY2tldCA8IFRocmlmdDo6U2VydmVyU29ja2V0CiAgICAgZGVmIGluaXRpYWxpemUoaG9zdCwgcG9ydCwgcXVldWUpCiAgICAgICBzdXBlcihob3N0LCBwb3J0KQogICAgICAgQHF1ZXVlID0gcXVldWUKQEAgLTEwNSwxMyArMTAzLDEzIEBACiAgICAgYmVmb3JlKDplYWNoKSBkbwogICAgICAgQHBvcnQgPSA0MzI1MQogICAgICAgaGFuZGxlciA9IEhhbmRsZXIubmV3Ci0gICAgICBwcm9jZXNzb3IgPSBOb25ibG9ja2luZ1NlcnZpY2U6OlByb2Nlc3Nvci5uZXcoaGFuZGxlcikKKyAgICAgIHByb2Nlc3NvciA9IFNwZWNOYW1lc3BhY2U6Ok5vbmJsb2NraW5nU2VydmljZTo6UHJvY2Vzc29yLm5ldyhoYW5kbGVyKQogICAgICAgcXVldWUgPSBRdWV1ZS5uZXcKICAgICAgIEB0cmFuc3BvcnQgPSBTcGVjU2VydmVyU29ja2V0Lm5ldygnbG9jYWxob3N0JywgQHBvcnQsIHF1ZXVlKQotICAgICAgdHJhbnNwb3J0X2ZhY3RvcnkgPSBGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldworICAgICAgdHJhbnNwb3J0X2ZhY3RvcnkgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydEZhY3RvcnkubmV3CiAgICAgICBsb2dnZXIgPSBMb2dnZXIubmV3KFNUREVSUikKICAgICAgIGxvZ2dlci5sZXZlbCA9IExvZ2dlcjo6V0FSTgotICAgICAgQHNlcnZlciA9IE5vbmJsb2NraW5nU2VydmVyLm5ldyhwcm9jZXNzb3IsIEB0cmFuc3BvcnQsIHRyYW5zcG9ydF9mYWN0b3J5LCBuaWwsIDUsIGxvZ2dlcikKKyAgICAgIEBzZXJ2ZXIgPSBUaHJpZnQ6Ok5vbmJsb2NraW5nU2VydmVyLm5ldyhwcm9jZXNzb3IsIEB0cmFuc3BvcnQsIHRyYW5zcG9ydF9mYWN0b3J5LCBuaWwsIDUsIGxvZ2dlcikKICAgICAgIGhhbmRsZXIuc2VydmVyID0gQHNlcnZlcgogICAgICAgQHNlcnZlcl90aHJlYWQgPSBUaHJlYWQubmV3KFRocmVhZC5jdXJyZW50KSBkbyB8bWFzdGVyX3RocmVhZHwKICAgICAgICAgYmVnaW4KQEAgLTEzNiw5ICsxMzQsOSBAQAogICAgIGVuZAogCiAgICAgZGVmIHNldHVwX2NsaWVudChxdWV1ZSA9IG5pbCkKLSAgICAgIHRyYW5zcG9ydCA9IFNwZWNUcmFuc3BvcnQubmV3KEZyYW1lZFRyYW5zcG9ydC5uZXcoU29ja2V0Lm5ldygnbG9jYWxob3N0JywgQHBvcnQpKSwgcXVldWUpCi0gICAgICBwcm90b2NvbCA9IEJpbmFyeVByb3RvY29sLm5ldyh0cmFuc3BvcnQpCi0gICAgICBjbGllbnQgPSBOb25ibG9ja2luZ1NlcnZpY2U6OkNsaWVudC5uZXcocHJvdG9jb2wpCisgICAgICB0cmFuc3BvcnQgPSBTcGVjVHJhbnNwb3J0Lm5ldyhUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoVGhyaWZ0OjpTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCBAcG9ydCkpLCBxdWV1ZSkKKyAgICAgIHByb3RvY29sID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC5uZXcodHJhbnNwb3J0KQorICAgICAgY2xpZW50ID0gU3BlY05hbWVzcGFjZTo6Tm9uYmxvY2tpbmdTZXJ2aWNlOjpDbGllbnQubmV3KHByb3RvY29sKQogICAgICAgdHJhbnNwb3J0Lm9wZW4KICAgICAgIEBjbGllbnRzIDw8IFtjbGllbnQsIHRyYW5zcG9ydF0KICAgICAgIGNsaWVudApAQCAtMTc4LDggKzE3Niw4IEBACiAKICAgICBpdCAic2hvdWxkIGhhbmRsZSBiYXNpYyBtZXNzYWdlIHBhc3NpbmciIGRvCiAgICAgICBjbGllbnQgPSBzZXR1cF9jbGllbnQKLSAgICAgIGNsaWVudC5ncmVldGluZyh0cnVlKS5zaG91bGQgPT0gSGVsbG8ubmV3Ci0gICAgICBjbGllbnQuZ3JlZXRpbmcoZmFsc2UpLnNob3VsZCA9PSBIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdBbG9oYSEnKQorICAgICAgZXhwZWN0KGNsaWVudC5ncmVldGluZyh0cnVlKSkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KQorICAgICAgZXhwZWN0KGNsaWVudC5ncmVldGluZyhmYWxzZSkpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gJ0Fsb2hhIScpKQogICAgICAgQHNlcnZlci5zaHV0ZG93bgogICAgIGVuZAogCkBAIC0xOTcsNyArMTk1LDcgQEAKICAgICAgIGVuZAogICAgICAgNC50aW1lcyB7IHRyYW5zX3F1ZXVlLnBvcCB9CiAgICAgICBzZXR1cF9jbGllbnQudW5ibG9jayg0KQotICAgICAgNC50aW1lcyB7IHF1ZXVlLnBvcC5zaG91bGQgYmVfdHJ1ZSB9CisgICAgICA0LnRpbWVzIHsgZXhwZWN0KHF1ZXVlLnBvcCkudG8gYmVfdHJ1dGh5IH0KICAgICAgIEBzZXJ2ZXIuc2h1dGRvd24KICAgICBlbmQKIApAQCAtMjE0LDE1ICsyMTIsMTUgQEAKICAgICAgIHF1ZXVlc1s0XSA8PCA6aGVsbG8KICAgICAgIHF1ZXVlc1s1XSA8PCA6aGVsbG8KICAgICAgIHF1ZXVlc1s2XSA8PCA6aGVsbG8KLSAgICAgIDMudGltZXMgeyByZXN1bHQucG9wLnNob3VsZCA9PSBIZWxsby5uZXcgfQotICAgICAgY2xpZW50LmdyZWV0aW5nKHRydWUpLnNob3VsZCA9PSBIZWxsby5uZXcKKyAgICAgIDMudGltZXMgeyBleHBlY3QocmVzdWx0LnBvcCkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KSB9CisgICAgICBleHBlY3QoY2xpZW50LmdyZWV0aW5nKHRydWUpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcpCiAgICAgICBxdWV1ZXNbNV0gPDwgWzp1bmJsb2NrLCA0XQotICAgICAgNC50aW1lcyB7IHJlc3VsdC5wb3Auc2hvdWxkIGJlX3RydWUgfQorICAgICAgNC50aW1lcyB7IGV4cGVjdChyZXN1bHQucG9wKS50byBiZV90cnV0aHkgfQogICAgICAgcXVldWVzWzJdIDw8IDpoZWxsbwotICAgICAgcmVzdWx0LnBvcC5zaG91bGQgPT0gSGVsbG8ubmV3Ci0gICAgICBjbGllbnQuZ3JlZXRpbmcoZmFsc2UpLnNob3VsZCA9PSBIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdBbG9oYSEnKQorICAgICAgZXhwZWN0KHJlc3VsdC5wb3ApLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldykKKyAgICAgIGV4cGVjdChjbGllbnQuZ3JlZXRpbmcoZmFsc2UpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdBbG9oYSEnKSkKICAgICAgIDcudGltZXMgeyBxdWV1ZXMuc2hpZnQgPDwgOmV4aXQgfQotICAgICAgY2xpZW50LmdyZWV0aW5nKHRydWUpLnNob3VsZCA9PSBIZWxsby5uZXcKKyAgICAgIGV4cGVjdChjbGllbnQuZ3JlZXRpbmcodHJ1ZSkpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldykKICAgICAgIEBzZXJ2ZXIuc2h1dGRvd24KICAgICBlbmQKIApAQCAtMjMxLDcgKzIyOSw3IEBACiAgICAgICBjbGllbnQgPSBzZXR1cF9jbGllbnQKICAgICAgIGNsaWVudC5ncmVldGluZyhmYWxzZSkgIyBmb3JjZSBhIG1lc3NhZ2UgcGFzcwogICAgICAgQHNlcnZlci5zaHV0ZG93bgotICAgICAgQHNlcnZlcl90aHJlYWQuam9pbigyKS5zaG91bGQgYmVfYW5faW5zdGFuY2Vfb2YoVGhyZWFkKQorICAgICAgZXhwZWN0KEBzZXJ2ZXJfdGhyZWFkLmpvaW4oMikpLnRvIGJlX2FuX2luc3RhbmNlX29mKFRocmVhZCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY29udGludWUgcHJvY2Vzc2luZyBhY3RpdmUgbWVzc2FnZXMgd2hlbiBzaHV0dGluZyBkb3duIiBkbwpAQCAtMjQwLDggKzIzOCw4IEBACiAgICAgICBjbGllbnQgPDwgOnNsZWVwCiAgICAgICBzbGVlcCAwLjEgIyBnaXZlIHRoZSBzZXJ2ZXIgdGltZSB0byBzdGFydCBwcm9jZXNzaW5nIHRoZSBjbGllbnQncyBtZXNzYWdlCiAgICAgICBAc2VydmVyLnNodXRkb3duCi0gICAgICBAc2VydmVyX3RocmVhZC5qb2luKDIpLnNob3VsZCBiZV9hbl9pbnN0YW5jZV9vZihUaHJlYWQpCi0gICAgICByZXN1bHQucG9wLnNob3VsZCA9PSA6c2xlcHQKKyAgICAgIGV4cGVjdChAc2VydmVyX3RocmVhZC5qb2luKDIpKS50byBiZV9hbl9pbnN0YW5jZV9vZihUaHJlYWQpCisgICAgICBleHBlY3QocmVzdWx0LnBvcCkudG8gZXEoOnNsZXB0KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBraWxsIGFjdGl2ZSBtZXNzYWdlcyB3aGVuIHRoZXkgZG9uJ3QgZXhwaXJlIHdoaWxlIHNodXR0aW5nIGRvd24iIGRvCkBAIC0yNTEsMTUgKzI0OSwxNSBAQAogICAgICAgc2xlZXAgMC4xICMgc3RhcnQgcHJvY2Vzc2luZyB0aGUgY2xpZW50J3MgbWVzc2FnZQogICAgICAgQHNlcnZlci5zaHV0ZG93bigxKQogICAgICAgQGNhdGNoX2V4Y2VwdGlvbnMgPSB0cnVlCi0gICAgICBAc2VydmVyX3RocmVhZC5qb2luKDMpLnNob3VsZF9ub3QgYmVfbmlsCi0gICAgICByZXN1bHQuc2hvdWxkIGJlX2VtcHR5CisgICAgICBleHBlY3QoQHNlcnZlcl90aHJlYWQuam9pbigzKSkubm90X3RvIGJlX25pbAorICAgICAgZXhwZWN0KHJlc3VsdCkudG8gYmVfZW1wdHkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWxsb3cgc2h1dHRpbmcgZG93biBpbiByZXNwb25zZSB0byBhIG1lc3NhZ2UiIGRvCiAgICAgICBjbGllbnQgPSBzZXR1cF9jbGllbnQKLSAgICAgIGNsaWVudC5ncmVldGluZyh0cnVlKS5zaG91bGQgPT0gSGVsbG8ubmV3CisgICAgICBleHBlY3QoY2xpZW50LmdyZWV0aW5nKHRydWUpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcpCiAgICAgICBjbGllbnQuc2h1dGRvd24KLSAgICAgIEBzZXJ2ZXJfdGhyZWFkLmpvaW4oMikuc2hvdWxkX25vdCBiZV9uaWwKKyAgICAgIGV4cGVjdChAc2VydmVyX3RocmVhZC5qb2luKDIpKS5ub3RfdG8gYmVfbmlsCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9wcm9jZXNzb3Jfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3Byb2Nlc3Nvcl9zcGVjLnJiCmluZGV4IGQzNWY2NTIuLmQzMDU1M2YgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3Byb2Nlc3Nvcl9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3Byb2Nlc3Nvcl9zcGVjLnJiCkBAIC0xNyw2NSArMTcsNjIgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAotY2xhc3MgVGhyaWZ0UHJvY2Vzc29yU3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAorZGVzY3JpYmUgJ1Byb2Nlc3NvcicgZG8KIAogICBjbGFzcyBQcm9jZXNzb3JTcGVjCiAgICAgaW5jbHVkZSBUaHJpZnQ6OlByb2Nlc3NvcgogICBlbmQKIAotICBkZXNjcmliZSAiUHJvY2Vzc29yIiBkbworICBkZXNjcmliZSBUaHJpZnQ6OlByb2Nlc3NvciBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBwcm9jZXNzb3IgPSBQcm9jZXNzb3JTcGVjLm5ldyhtb2NrKCJNb2NrSGFuZGxlciIpKQotICAgICAgQHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQorICAgICAgQHByb2Nlc3NvciA9IFByb2Nlc3NvclNwZWMubmV3KGRvdWJsZSgiTW9ja0hhbmRsZXIiKSkKKyAgICAgIEBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQogICAgIGVuZAogCiAgICAgZGVmIG1vY2tfdHJhbnMob2JqKQotICAgICAgb2JqLnNob3VsZF9yZWNlaXZlKDp0cmFucykub3JkZXJlZC5hbmRfcmV0dXJuIGRvCi0gICAgICAgIG1vY2soInRyYW5zIikudGVlIGRvIHx0cmFuc3wKLSAgICAgICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChvYmopLnRvIHJlY2VpdmUoOnRyYW5zKS5vcmRlcmVkIGRvCisgICAgICAgIGRvdWJsZSgidHJhbnMiKS50YXAgZG8gfHRyYW5zfAorICAgICAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQKICAgICAgICAgZW5kCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY2FsbCBwcm9jZXNzXzxtZXNzYWdlPiB3aGVuIGl0IHJlY2VpdmVzIHRoYXQgbWVzc2FnZSIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21lc3NhZ2VfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybiBbJ3Rlc3RNZXNzYWdlJywgTWVzc2FnZVR5cGVzOjpDQUxMLCAxN10KLSAgICAgIEBwcm9jZXNzb3Iuc2hvdWxkX3JlY2VpdmUoOnByb2Nlc3NfdGVzdE1lc3NhZ2UpLndpdGgoMTcsIEBwcm90LCBAcHJvdCkub3JkZXJlZAotICAgICAgQHByb2Nlc3Nvci5wcm9jZXNzKEBwcm90LCBAcHJvdCkuc2hvdWxkID09IHRydWUKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4gWyd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAxN10KKyAgICAgIGV4cGVjdChAcHJvY2Vzc29yKS50byByZWNlaXZlKDpwcm9jZXNzX3Rlc3RNZXNzYWdlKS53aXRoKDE3LCBAcHJvdCwgQHByb3QpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvY2Vzc29yLnByb2Nlc3MoQHByb3QsIEBwcm90KSkudG8gZXEodHJ1ZSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgYW4gQXBwbGljYXRpb25FeGNlcHRpb24gd2hlbiB0aGUgcmVjZWl2ZWQgbWVzc2FnZSBjYW5ub3QgYmUgcHJvY2Vzc2VkIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuIFsndGVzdE1lc3NhZ2UnLCBNZXNzYWdlVHlwZXM6OkNBTEwsIDRdCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6c2tpcCkud2l0aChUeXBlczo6U1RSVUNUKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgTWVzc2FnZVR5cGVzOjpFWENFUFRJT04sIDQpLm9yZGVyZWQKLSAgICAgIEFwcGxpY2F0aW9uRXhjZXB0aW9uLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCAiVW5rbm93biBmdW5jdGlvbiB0ZXN0TWVzc2FnZSIpLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgbW9jayhBcHBsaWNhdGlvbkV4Y2VwdGlvbikudGVlIGRvIHxlfAotICAgICAgICAgIGUuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KS5vcmRlcmVkCi0gICAgICAgIGVuZAotICAgICAgZW5kCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4gWyd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCA0XQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6OlNUUlVDVCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkVYQ0VQVElPTiwgNCkub3JkZXJlZAorICAgICAgZSA9IGRvdWJsZShUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uKQorICAgICAgZXhwZWN0KGUpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KS5vcmRlcmVkCisgICAgICBleHBlY3QoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCAiVW5rbm93biBmdW5jdGlvbiB0ZXN0TWVzc2FnZSIpLmFuZF9yZXR1cm4oZSkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpLm9yZGVyZWQKICAgICAgIG1vY2tfdHJhbnMoQHByb3QpCiAgICAgICBAcHJvY2Vzc29yLnByb2Nlc3MoQHByb3QsIEBwcm90KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwYXNzIGFyZ3Mgb2ZmIHRvIHRoZSBhcmdzIGNsYXNzIiBkbwotICAgICAgYXJnc19jbGFzcyA9IG1vY2soIk1vY2tBcmdzQ2xhc3MiKQotICAgICAgYXJncyA9IG1vY2soIiM8TW9ja0FyZ3NDbGFzczptb2NrPiIpLnRlZSBkbyB8YXJnc3wKLSAgICAgICAgYXJncy5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aChAcHJvdCkub3JkZXJlZAorICAgICAgYXJnc19jbGFzcyA9IGRvdWJsZSgiTW9ja0FyZ3NDbGFzcyIpCisgICAgICBhcmdzID0gZG91YmxlKCIjPE1vY2tBcmdzQ2xhc3M6bW9jaz4iKS50YXAgZG8gfGFyZ3N8CisgICAgICAgIGV4cGVjdChhcmdzKS50byByZWNlaXZlKDpyZWFkKS53aXRoKEBwcm90KS5vcmRlcmVkCiAgICAgICBlbmQKLSAgICAgIGFyZ3NfY2xhc3Muc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybiBhcmdzCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkub3JkZXJlZAotICAgICAgQHByb2Nlc3Nvci5yZWFkX2FyZ3MoQHByb3QsIGFyZ3NfY2xhc3MpLnNob3VsZCBlcWwoYXJncykKKyAgICAgIGV4cGVjdChhcmdzX2NsYXNzKS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4gYXJncworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb2Nlc3Nvci5yZWFkX2FyZ3MoQHByb3QsIGFyZ3NfY2xhc3MpKS50byBlcWwoYXJncykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgb3V0IGEgcmVwbHkgd2hlbiBhc2tlZCIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsIE1lc3NhZ2VUeXBlczo6UkVQTFksIDIzKS5vcmRlcmVkCi0gICAgICByZXN1bHQgPSBtb2NrKCJNb2NrUmVzdWx0IikKLSAgICAgIHJlc3VsdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpSRVBMWSwgMjMpLm9yZGVyZWQKKyAgICAgIHJlc3VsdCA9IGRvdWJsZSgiTW9ja1Jlc3VsdCIpCisgICAgICBleHBlY3QocmVzdWx0KS50byByZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2VuZCkub3JkZXJlZAogICAgICAgbW9ja190cmFucyhAcHJvdCkKICAgICAgIEBwcm9jZXNzb3Iud3JpdGVfcmVzdWx0KHJlc3VsdCwgQHByb3QsICd0ZXN0TWVzc2FnZScsIDIzKQogICAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc2VyaWFsaXplcl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc2VyaWFsaXplcl9zcGVjLnJiCmluZGV4IDQ0MzM5YzAuLjJhN2RjNmQgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NlcmlhbGl6ZXJfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9zZXJpYWxpemVyX3NwZWMucmIKQEAgLTE3LDUzICsxNyw1MSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJwogCi1jbGFzcyBUaHJpZnRTZXJpYWxpemVyU3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAotICBpbmNsdWRlIFNwZWNOYW1lc3BhY2UKK2Rlc2NyaWJlICdTZXJpYWxpemVyJyBkbwogCi0gIGRlc2NyaWJlIFNlcmlhbGl6ZXIgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpTZXJpYWxpemVyIGRvCiAgICAgaXQgInNob3VsZCBzZXJpYWxpemUgc3RydWN0cyB0byBiaW5hcnkgYnkgZGVmYXVsdCIgZG8KLSAgICAgIHNlcmlhbGl6ZXIgPSBTZXJpYWxpemVyLm5ldyhUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5Lm5ldykKLSAgICAgIGRhdGEgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShIZWxsby5uZXcoOmdyZWV0aW5nID0+ICInRWxsbyBndXYnbm9yISIpKQotICAgICAgZGF0YS5zaG91bGQgPT0gIlx4MEJceDAwXHgwMVx4MDBceDAwXHgwMFx4MEUnRWxsbyBndXYnbm9yIVx4MDAiCisgICAgICBzZXJpYWxpemVyID0gVGhyaWZ0OjpTZXJpYWxpemVyLm5ldyhUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5Lm5ldykKKyAgICAgIGRhdGEgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICInRWxsbyBndXYnbm9yISIpKQorICAgICAgZXhwZWN0KGRhdGEpLnRvIGVxKCJceDBCXHgwMFx4MDFceDAwXHgwMFx4MDBceDBFJ0VsbG8gZ3V2J25vciFceDAwIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2VyaWFsaXplIHN0cnVjdHMgdG8gdGhlIGdpdmVuIHByb3RvY29sIiBkbwotICAgICAgcHJvdG9jb2wgPSBCYXNlUHJvdG9jb2wubmV3KG1vY2soInRyYW5zcG9ydCIpKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6SGVsbG8iKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJncmVldGluZyIsIFR5cGVzOjpTVFJJTkcsIDEpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJHb29kIGRheSIpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkKLSAgICAgIHByb3RvY29sX2ZhY3RvcnkgPSBtb2NrKCJQcm90b2NvbEZhY3RvcnkiKQotICAgICAgcHJvdG9jb2xfZmFjdG9yeS5zdHViISg6Z2V0X3Byb3RvY29sKS5hbmRfcmV0dXJuKHByb3RvY29sKQotICAgICAgc2VyaWFsaXplciA9IFNlcmlhbGl6ZXIubmV3KHByb3RvY29sX2ZhY3RvcnkpCi0gICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShIZWxsby5uZXcoOmdyZWV0aW5nID0+ICJHb29kIGRheSIpKQorICAgICAgcHJvdG9jb2wgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoZG91YmxlKCJ0cmFuc3BvcnQiKSkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpIZWxsbyIpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJncmVldGluZyIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJHb29kIGRheSIpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkKKyAgICAgIHByb3RvY29sX2ZhY3RvcnkgPSBkb3VibGUoIlByb3RvY29sRmFjdG9yeSIpCisgICAgICBhbGxvdyhwcm90b2NvbF9mYWN0b3J5KS50byByZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmFuZF9yZXR1cm4ocHJvdG9jb2wpCisgICAgICBzZXJpYWxpemVyID0gVGhyaWZ0OjpTZXJpYWxpemVyLm5ldyhwcm90b2NvbF9mYWN0b3J5KQorICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAiR29vZCBkYXkiKSkKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgRGVzZXJpYWxpemVyIGRvCisgIGRlc2NyaWJlIFRocmlmdDo6RGVzZXJpYWxpemVyIGRvCiAgICAgaXQgInNob3VsZCBkZXNlcmlhbGl6ZSBzdHJ1Y3RzIGZyb20gYmluYXJ5IGJ5IGRlZmF1bHQiIGRvCi0gICAgICBkZXNlcmlhbGl6ZXIgPSBEZXNlcmlhbGl6ZXIubmV3CisgICAgICBkZXNlcmlhbGl6ZXIgPSBUaHJpZnQ6OkRlc2VyaWFsaXplci5uZXcKICAgICAgIGRhdGEgPSAiXHgwQlx4MDBceDAxXHgwMFx4MDBceDAwXHgwRSdFbGxvIGd1didub3IhXHgwMCIKLSAgICAgIGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZShIZWxsby5uZXcsIGRhdGEpLnNob3VsZCA9PSBIZWxsby5uZXcoOmdyZWV0aW5nID0+ICInRWxsbyBndXYnbm9yISIpCisgICAgICBleHBlY3QoZGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldywgZGF0YSkpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gIidFbGxvIGd1didub3IhIikpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGRlc2VyaWFsaXplIHN0cnVjdHMgZnJvbSB0aGUgZ2l2ZW4gcHJvdG9jb2wiIGRvCi0gICAgICBwcm90b2NvbCA9IEJhc2VQcm90b2NvbC5uZXcobW9jaygidHJhbnNwb3J0IikpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLmFuZF9yZXR1cm4oIlNwZWNOYW1lc3BhY2U6OkhlbGxvIikKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5hbmRfcmV0dXJuKFsiZ3JlZXRpbmciLCBUeXBlczo6U1RSSU5HLCAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuaWwsIFR5cGVzOjpTVE9QLCAwXSkKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigiR29vZCBkYXkiKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfZW5kKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkKLSAgICAgIHByb3RvY29sX2ZhY3RvcnkgPSBtb2NrKCJQcm90b2NvbEZhY3RvcnkiKQotICAgICAgcHJvdG9jb2xfZmFjdG9yeS5zdHViISg6Z2V0X3Byb3RvY29sKS5hbmRfcmV0dXJuKHByb3RvY29sKQotICAgICAgZGVzZXJpYWxpemVyID0gRGVzZXJpYWxpemVyLm5ldyhwcm90b2NvbF9mYWN0b3J5KQotICAgICAgZGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKEhlbGxvLm5ldywgIiIpLnNob3VsZCA9PSBIZWxsby5uZXcoOmdyZWV0aW5nID0+ICJHb29kIGRheSIpCisgICAgICBwcm90b2NvbCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhkb3VibGUoInRyYW5zcG9ydCIpKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikuYW5kX3JldHVybigiU3BlY05hbWVzcGFjZTo6SGVsbG8iKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5hbmRfcmV0dXJuKFsiZ3JlZXRpbmciLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0pCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCJHb29kIGRheSIpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfZW5kKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpCisgICAgICBwcm90b2NvbF9mYWN0b3J5ID0gZG91YmxlKCJQcm90b2NvbEZhY3RvcnkiKQorICAgICAgYWxsb3cocHJvdG9jb2xfZmFjdG9yeSkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5hbmRfcmV0dXJuKHByb3RvY29sKQorICAgICAgZGVzZXJpYWxpemVyID0gVGhyaWZ0OjpEZXNlcmlhbGl6ZXIubmV3KHByb3RvY29sX2ZhY3RvcnkpCisgICAgICBleHBlY3QoZGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldywgIiIpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICJHb29kIGRheSIpKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc2VydmVyX3NvY2tldF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc2VydmVyX3NvY2tldF9zcGVjLnJiCmluZGV4IGZjZTUwMTMuLmVjOWU1NTAgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NlcnZlcl9zb2NrZXRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9zZXJ2ZXJfc29ja2V0X3NwZWMucmIKQEAgLTE3LDY0ICsxNyw2OCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICIvc29ja2V0X3NwZWNfc2hhcmVkIgorcmVxdWlyZSAnc3BlY19oZWxwZXInCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoIiN7RmlsZS5kaXJuYW1lKF9fRklMRV9fKX0vc29ja2V0X3NwZWNfc2hhcmVkIikKIAotY2xhc3MgVGhyaWZ0U2VydmVyU29ja2V0U3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAorZGVzY3JpYmUgJ1RocmlmdDo6U2VydmVyU29ja2V0JyBkbwogCi0gIGRlc2NyaWJlIFNlcnZlclNvY2tldCBkbworICBkZXNjcmliZSBUaHJpZnQ6OlNlcnZlclNvY2tldCBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBzb2NrZXQgPSBTZXJ2ZXJTb2NrZXQubmV3KDEyMzQpCisgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQubmV3KDEyMzQpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNyZWF0ZSBhIGhhbmRsZSB3aGVuIGNhbGxpbmcgbGlzdGVuIiBkbwotICAgICAgVENQU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgobmlsLCAxMjM0KQorICAgICAgZXhwZWN0KFRDUFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKG5pbCwgMTIzNCkKICAgICAgIEBzb2NrZXQubGlzdGVuCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGFjY2VwdCBhbiBvcHRpb25hbCBob3N0IGFyZ3VtZW50IiBkbwotICAgICAgQHNvY2tldCA9IFNlcnZlclNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDEyMzQpCi0gICAgICBUQ1BTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgnbG9jYWxob3N0JywgMTIzNCkKKyAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlNlcnZlclNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDEyMzQpCisgICAgICBleHBlY3QoVENQU2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgoJ2xvY2FsaG9zdCcsIDEyMzQpCisgICAgICBAc29ja2V0LnRvX3MgPT0gInNlcnZlcihsb2NhbGhvc3Q6MTIzNCkiCiAgICAgICBAc29ja2V0Lmxpc3RlbgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjcmVhdGUgYSBUaHJpZnQ6OlNvY2tldCB0byB3cmFwIGFjY2VwdGVkIHNvY2tldHMiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJUQ1BTZXJ2ZXIiKQotICAgICAgVENQU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgobmlsLCAxMjM0KS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiVENQU2VydmVyIikKKyAgICAgIGV4cGVjdChUQ1BTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChuaWwsIDEyMzQpLmFuZF9yZXR1cm4oaGFuZGxlKQogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIHNvY2sgPSBtb2NrKCJzb2NrIikKLSAgICAgIGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6YWNjZXB0KS5hbmRfcmV0dXJuKHNvY2spCi0gICAgICB0cmFucyA9IG1vY2soIlNvY2tldCIpCi0gICAgIFNvY2tldC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKHRyYW5zKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmhhbmRsZT0pLndpdGgoc29jaykKLSAgICAgIEBzb2NrZXQuYWNjZXB0LnNob3VsZCA9PSB0cmFucworICAgICAgc29jayA9IGRvdWJsZSgic29jayIpCisgICAgICBleHBlY3QoaGFuZGxlKS50byByZWNlaXZlKDphY2NlcHQpLmFuZF9yZXR1cm4oc29jaykKKyAgICAgIHRyYW5zID0gZG91YmxlKCJTb2NrZXQiKQorICAgICAgZXhwZWN0KFRocmlmdDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4odHJhbnMpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmhhbmRsZT0pLndpdGgoc29jaykKKyAgICAgIGV4cGVjdChAc29ja2V0LmFjY2VwdCkudG8gZXEodHJhbnMpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNsb3NlIHRoZSBoYW5kbGUgd2hlbiBjbG9zZWQiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJUQ1BTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIFRDUFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKG5pbCwgMTIzNCkuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIlRDUFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgZXhwZWN0KFRDUFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKG5pbCwgMTIzNCkuYW5kX3JldHVybihoYW5kbGUpCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgaGFuZGxlLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkKKyAgICAgIGV4cGVjdChoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQogICAgICAgQHNvY2tldC5jbG9zZQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gbmlsIHdoZW4gYWNjZXB0aW5nIGlmIHRoZXJlIGlzIG5vIGhhbmRsZSIgZG8KLSAgICAgIEBzb2NrZXQuYWNjZXB0LnNob3VsZCBiZV9uaWwKKyAgICAgIGV4cGVjdChAc29ja2V0LmFjY2VwdCkudG8gYmVfbmlsCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJldHVybiB0cnVlIGZvciBjbG9zZWQ/IHdoZW4gYXBwcm9wcmlhdGUiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJUQ1BTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIFRDUFNlcnZlci5zdHViISg6bmV3KS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiVENQU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBhbGxvdyhUQ1BTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihoYW5kbGUpCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgQHNvY2tldC5zaG91bGRfbm90IGJlX2Nsb3NlZAotICAgICAgaGFuZGxlLnN0dWIhKDpjbG9zZSkKKyAgICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfY2xvc2VkCisgICAgICBhbGxvdyhoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQogICAgICAgQHNvY2tldC5jbG9zZQotICAgICAgQHNvY2tldC5zaG91bGQgYmVfY2xvc2VkCisgICAgICBleHBlY3QoQHNvY2tldCkudG8gYmVfY2xvc2VkCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgQHNvY2tldC5zaG91bGRfbm90IGJlX2Nsb3NlZAotICAgICAgaGFuZGxlLnN0dWIhKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCi0gICAgICBAc29ja2V0LnNob3VsZCBiZV9jbG9zZWQKKyAgICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfY2xvc2VkCisgICAgICBhbGxvdyhoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKKyAgICAgIGV4cGVjdChAc29ja2V0KS50byBiZV9jbG9zZWQKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAc29ja2V0LnRvX3MpLnRvIGVxKCJzb2NrZXQoOjEyMzQpIikKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3NlcnZlcl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc2VydmVyX3NwZWMucmIKaW5kZXggZmZlOWJmZi4uNTdmNTIzNyAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvc2VydmVyX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvc2VydmVyX3NwZWMucmIKQEAgLTE2LDE0NSArMTYsMTcyIEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKK2Rlc2NyaWJlICdTZXJ2ZXInIGRvCiAKLWNsYXNzIFRocmlmdFNlcnZlclNwZWMgPCBTcGVjOjpFeGFtcGxlR3JvdXAKLSAgaW5jbHVkZSBUaHJpZnQKLQotICBkZXNjcmliZSBCYXNlU2VydmVyIGRvCi0gICAgaXQgInNob3VsZCBkZWZhdWx0IHRvIEJhc2VUcmFuc3BvcnRGYWN0b3J5IGFuZCBCaW5hcnlQcm90b2NvbEZhY3Rvcnkgd2hlbiBub3Qgc3BlY2lmaWVkIiBkbwotICAgICAgc2VydmVyID0gQmFzZVNlcnZlci5uZXcobW9jaygiUHJvY2Vzc29yIiksIG1vY2soIkJhc2VTZXJ2ZXJUcmFuc3BvcnQiKSkKLSAgICAgIHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAdHJhbnNwb3J0X2ZhY3RvcnknKS5zaG91bGQgYmVfYW5faW5zdGFuY2Vfb2YoQmFzZVRyYW5zcG9ydEZhY3RvcnkpCi0gICAgICBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQHByb3RvY29sX2ZhY3RvcnknKS5zaG91bGQgYmVfYW5faW5zdGFuY2Vfb2YoQmluYXJ5UHJvdG9jb2xGYWN0b3J5KQotICAgIGVuZAotCi0gICAgIyBzZXJ2ZSBpcyBhIG5vb3AsIHNvIGNhbid0IHRlc3QgdGhhdAotICBlbmQKLQotICBzaGFyZWRfZXhhbXBsZXNfZm9yICJzZXJ2ZXJzIiBkbworICBkZXNjcmliZSBUaHJpZnQ6OkJhc2VTZXJ2ZXIgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAcHJvY2Vzc29yID0gbW9jaygiUHJvY2Vzc29yIikKLSAgICAgIEBzZXJ2ZXJUcmFucyA9IG1vY2soIlNlcnZlclRyYW5zcG9ydCIpCi0gICAgICBAdHJhbnMgPSBtb2NrKCJCYXNlVHJhbnNwb3J0IikKLSAgICAgIEBwcm90ID0gbW9jaygiQmFzZVByb3RvY29sIikKLSAgICAgIEBjbGllbnQgPSBtb2NrKCJDbGllbnQiKQotICAgICAgQHNlcnZlciA9IHNlcnZlcl90eXBlLm5ldyhAcHJvY2Vzc29yLCBAc2VydmVyVHJhbnMsIEB0cmFucywgQHByb3QpCisgICAgICBAcHJvY2Vzc29yID0gZG91YmxlKCJQcm9jZXNzb3IiKQorICAgICAgQHNlcnZlclRyYW5zID0gZG91YmxlKCJTZXJ2ZXJUcmFuc3BvcnQiKQorICAgICAgQHRyYW5zID0gZG91YmxlKCJCYXNlVHJhbnNwb3J0IikKKyAgICAgIEBwcm90ID0gZG91YmxlKCJCYXNlUHJvdG9jb2wiKQorICAgICAgQHNlcnZlciA9IGRlc2NyaWJlZF9jbGFzcy5uZXcoQHByb2Nlc3NvciwgQHNlcnZlclRyYW5zLCBAdHJhbnMsIEBwcm90KQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBkZWZhdWx0IHRvIEJhc2VUcmFuc3BvcnRGYWN0b3J5IGFuZCBCaW5hcnlQcm90b2NvbEZhY3Rvcnkgd2hlbiBub3Qgc3BlY2lmaWVkIiBkbworICAgICAgQHNlcnZlciA9IFRocmlmdDo6QmFzZVNlcnZlci5uZXcoZG91YmxlKCJQcm9jZXNzb3IiKSwgZG91YmxlKCJCYXNlU2VydmVyVHJhbnNwb3J0IikpCisgICAgICBleHBlY3QoQHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAdHJhbnNwb3J0X2ZhY3RvcnknKSkudG8gYmVfYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpCYXNlVHJhbnNwb3J0RmFjdG9yeSkKKyAgICAgIGV4cGVjdChAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6J0Bwcm90b2NvbF9mYWN0b3J5JykpLnRvIGJlX2FuX2luc3RhbmNlX29mKFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5KQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBub3Qgc2VydmUiIGRvCisgICAgICBleHBlY3QgeyBAc2VydmVyLnNlcnZlKCl9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJzZXJ2ZXJUcmFucyIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInRyYW5zIikKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJwcm90IikKKyAgICAgIGV4cGVjdChAc2VydmVyLnRvX3MpLnRvIGVxKCJzZXJ2ZXIocHJvdCh0cmFucyhzZXJ2ZXJUcmFucykpKSIpCiAgICAgZW5kCiAgIGVuZAogCi0gIGRlc2NyaWJlIFNpbXBsZVNlcnZlciBkbwotICAgIGl0X3Nob3VsZF9iZWhhdmVfbGlrZSAic2VydmVycyIKLQotICAgIGRlZiBzZXJ2ZXJfdHlwZQotICAgICAgU2ltcGxlU2VydmVyCisgIGRlc2NyaWJlIFRocmlmdDo6U2ltcGxlU2VydmVyIGRvCisgICAgYmVmb3JlKDplYWNoKSBkbworICAgICAgQHByb2Nlc3NvciA9IGRvdWJsZSgiUHJvY2Vzc29yIikKKyAgICAgIEBzZXJ2ZXJUcmFucyA9IGRvdWJsZSgiU2VydmVyVHJhbnNwb3J0IikKKyAgICAgIEB0cmFucyA9IGRvdWJsZSgiQmFzZVRyYW5zcG9ydCIpCisgICAgICBAcHJvdCA9IGRvdWJsZSgiQmFzZVByb3RvY29sIikKKyAgICAgIEBjbGllbnQgPSBkb3VibGUoIkNsaWVudCIpCisgICAgICBAc2VydmVyID0gZGVzY3JpYmVkX2NsYXNzLm5ldyhAcHJvY2Vzc29yLCBAc2VydmVyVHJhbnMsIEB0cmFucywgQHByb3QpCiAgICAgZW5kCi0KKyAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInNlcnZlclRyYW5zIikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigidHJhbnMiKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInByb3QiKQorICAgICAgZXhwZWN0KEBzZXJ2ZXIudG9fcykudG8gZXEoInNpbXBsZShzZXJ2ZXIocHJvdCh0cmFucyhzZXJ2ZXJUcmFucykpKSkiKQorICAgIGVuZAorICAgIAogICAgIGl0ICJzaG91bGQgc2VydmUgaW4gdGhlIG1haW4gdGhyZWFkIiBkbwotICAgICAgQHNlcnZlclRyYW5zLnNob3VsZF9yZWNlaXZlKDpsaXN0ZW4pLm9yZGVyZWQKLSAgICAgIEBzZXJ2ZXJUcmFucy5zaG91bGRfcmVjZWl2ZSg6YWNjZXB0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQGNsaWVudCkKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Z2V0X3RyYW5zcG9ydCkuZXhhY3RseSgzKS50aW1lcy53aXRoKEBjbGllbnQpLmFuZF9yZXR1cm4oQHRyYW5zKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOmdldF9wcm90b2NvbCkuZXhhY3RseSgzKS50aW1lcy53aXRoKEB0cmFucykuYW5kX3JldHVybihAcHJvdCkKKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOmxpc3Rlbikub3JkZXJlZAorICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6YWNjZXB0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQGNsaWVudCkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmdldF90cmFuc3BvcnQpLmV4YWN0bHkoMykudGltZXMud2l0aChAY2xpZW50KS5hbmRfcmV0dXJuKEB0cmFucykKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHRyYW5zKS5hbmRfcmV0dXJuKEBwcm90KQogICAgICAgeCA9IDAKLSAgICAgIEBwcm9jZXNzb3Iuc2hvdWxkX3JlY2VpdmUoOnByb2Nlc3MpLmV4YWN0bHkoMykudGltZXMud2l0aChAcHJvdCwgQHByb3QpLmFuZF9yZXR1cm4gZG8KKyAgICAgIGV4cGVjdChAcHJvY2Vzc29yKS50byByZWNlaXZlKDpwcm9jZXNzKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHByb3QsIEBwcm90KSBkbwogICAgICAgICBjYXNlICh4ICs9IDEpCiAgICAgICAgIHdoZW4gMSB0aGVuIHJhaXNlIFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uCiAgICAgICAgIHdoZW4gMiB0aGVuIHJhaXNlIFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24KICAgICAgICAgd2hlbiAzIHRoZW4gdGhyb3cgOnN0b3AKICAgICAgICAgZW5kCiAgICAgICBlbmQKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpLmV4YWN0bHkoMykudGltZXMKLSAgICAgIEBzZXJ2ZXJUcmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpLm9yZGVyZWQKLSAgICAgIGxhbWJkYSB7IEBzZXJ2ZXIuc2VydmUgfS5zaG91bGQgdGhyb3dfc3ltYm9sKDpzdG9wKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpLmV4YWN0bHkoMykudGltZXMKKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKS5vcmRlcmVkCisgICAgICBleHBlY3QgeyBAc2VydmVyLnNlcnZlIH0udG8gdGhyb3dfc3ltYm9sKDpzdG9wKQogICAgIGVuZAogICBlbmQKIAotICBkZXNjcmliZSBUaHJlYWRlZFNlcnZlciBkbwotICAgIGl0X3Nob3VsZF9iZWhhdmVfbGlrZSAic2VydmVycyIKLQotICAgIGRlZiBzZXJ2ZXJfdHlwZQotICAgICAgVGhyZWFkZWRTZXJ2ZXIKKyAgZGVzY3JpYmUgVGhyaWZ0OjpUaHJlYWRlZFNlcnZlciBkbworICAgIGJlZm9yZSg6ZWFjaCkgZG8KKyAgICAgIEBwcm9jZXNzb3IgPSBkb3VibGUoIlByb2Nlc3NvciIpCisgICAgICBAc2VydmVyVHJhbnMgPSBkb3VibGUoIlNlcnZlclRyYW5zcG9ydCIpCisgICAgICBAdHJhbnMgPSBkb3VibGUoIkJhc2VUcmFuc3BvcnQiKQorICAgICAgQHByb3QgPSBkb3VibGUoIkJhc2VQcm90b2NvbCIpCisgICAgICBAY2xpZW50ID0gZG91YmxlKCJDbGllbnQiKQorICAgICAgQHNlcnZlciA9IGRlc2NyaWJlZF9jbGFzcy5uZXcoQHByb2Nlc3NvciwgQHNlcnZlclRyYW5zLCBAdHJhbnMsIEBwcm90KQogICAgIGVuZAogCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJzZXJ2ZXJUcmFucyIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInRyYW5zIikKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJwcm90IikKKyAgICAgIGV4cGVjdChAc2VydmVyLnRvX3MpLnRvIGVxKCJ0aHJlYWRlZChzZXJ2ZXIocHJvdCh0cmFucyhzZXJ2ZXJUcmFucykpKSkiKQorICAgIGVuZAorICAgIAogICAgIGl0ICJzaG91bGQgc2VydmUgdXNpbmcgdGhyZWFkcyIgZG8KLSAgICAgIEBzZXJ2ZXJUcmFucy5zaG91bGRfcmVjZWl2ZSg6bGlzdGVuKS5vcmRlcmVkCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmFjY2VwdCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEBjbGllbnQpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmdldF90cmFuc3BvcnQpLmV4YWN0bHkoMykudGltZXMud2l0aChAY2xpZW50KS5hbmRfcmV0dXJuKEB0cmFucykKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmV4YWN0bHkoMykudGltZXMud2l0aChAdHJhbnMpLmFuZF9yZXR1cm4oQHByb3QpCi0gICAgICBUaHJlYWQuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChAcHJvdCwgQHRyYW5zKS5leGFjdGx5KDMpLnRpbWVzLmFuZF95aWVsZChAcHJvdCwgQHRyYW5zKQorICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6bGlzdGVuKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDphY2NlcHQpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAY2xpZW50KQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Z2V0X3RyYW5zcG9ydCkuZXhhY3RseSgzKS50aW1lcy53aXRoKEBjbGllbnQpLmFuZF9yZXR1cm4oQHRyYW5zKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmV4YWN0bHkoMykudGltZXMud2l0aChAdHJhbnMpLmFuZF9yZXR1cm4oQHByb3QpCisgICAgICBleHBlY3QoVGhyZWFkKS50byByZWNlaXZlKDpuZXcpLndpdGgoQHByb3QsIEB0cmFucykuZXhhY3RseSgzKS50aW1lcy5hbmRfeWllbGQoQHByb3QsIEB0cmFucykKICAgICAgIHggPSAwCi0gICAgICBAcHJvY2Vzc29yLnNob3VsZF9yZWNlaXZlKDpwcm9jZXNzKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHByb3QsIEBwcm90KS5hbmRfcmV0dXJuIGRvCisgICAgICBleHBlY3QoQHByb2Nlc3NvcikudG8gcmVjZWl2ZSg6cHJvY2VzcykuZXhhY3RseSgzKS50aW1lcy53aXRoKEBwcm90LCBAcHJvdCkgZG8KICAgICAgICAgY2FzZSAoeCArPSAxKQogICAgICAgICB3aGVuIDEgdGhlbiByYWlzZSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbgogICAgICAgICB3aGVuIDIgdGhlbiByYWlzZSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uCiAgICAgICAgIHdoZW4gMyB0aGVuIHRocm93IDpzdG9wCiAgICAgICAgIGVuZAogICAgICAgZW5kCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5leGFjdGx5KDMpLnRpbWVzCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5vcmRlcmVkCi0gICAgICBsYW1iZGEgeyBAc2VydmVyLnNlcnZlIH0uc2hvdWxkIHRocm93X3N5bWJvbCg6c3RvcCkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKS5leGFjdGx5KDMpLnRpbWVzCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkub3JkZXJlZAorICAgICAgZXhwZWN0IHsgQHNlcnZlci5zZXJ2ZSB9LnRvIHRocm93X3N5bWJvbCg6c3RvcCkKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgVGhyZWFkUG9vbFNlcnZlciBkbwotICAgIGl0X3Nob3VsZF9iZWhhdmVfbGlrZSAic2VydmVycyIKLQotICAgIGRlZiBzZXJ2ZXJfdHlwZQotICAgICAgIyBwdXQgdGhpcyBzdHVmZiBoZXJlIHNvIGl0IHJ1bnMgYmVmb3JlIHRoZSBzZXJ2ZXIgaXMgY3JlYXRlZAotICAgICAgQHRocmVhZFEgPSBtb2NrKCJTaXplZFF1ZXVlIikKLSAgICAgIFNpemVkUXVldWUuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgyMCkuYW5kX3JldHVybihAdGhyZWFkUSkKLSAgICAgIEBleGNRID0gbW9jaygiUXVldWUiKQotICAgICAgUXVldWUuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybihAZXhjUSkKLSAgICAgIFRocmVhZFBvb2xTZXJ2ZXIKKyAgZGVzY3JpYmUgVGhyaWZ0OjpUaHJlYWRQb29sU2VydmVyIGRvCisgICAgYmVmb3JlKDplYWNoKSBkbworICAgICAgQHByb2Nlc3NvciA9IGRvdWJsZSgiUHJvY2Vzc29yIikKKyAgICAgIEBzZXJ2ZXJfdHJhbnMgPSBkb3VibGUoIlNlcnZlclRyYW5zcG9ydCIpCisgICAgICBAdHJhbnMgPSBkb3VibGUoIkJhc2VUcmFuc3BvcnQiKQorICAgICAgQHByb3QgPSBkb3VibGUoIkJhc2VQcm90b2NvbCIpCisgICAgICBAY2xpZW50ID0gZG91YmxlKCJDbGllbnQiKQorICAgICAgQHNlcnZlciA9IGRlc2NyaWJlZF9jbGFzcy5uZXcoQHByb2Nlc3NvciwgQHNlcnZlcl90cmFucywgQHRyYW5zLCBAcHJvdCkKKyAgICAgIHNsZWVwKDAuMTUpCiAgICAgZW5kCiAKLSAgICBpdCAic2hvdWxkIHNldCB1cCB0aGUgcXVldWVzIiBkbwotICAgICAgQHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAdGhyZWFkX3EnKS5zaG91bGQgYmUoQHRocmVhZFEpCi0gICAgICBAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6J0BleGNlcHRpb25fcScpLnNob3VsZCBiZShAZXhjUSkKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHNlcnZlcl90cmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJzZXJ2ZXJfdHJhbnMiKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJ0cmFucyIpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigicHJvdCIpCisgICAgICBleHBlY3QoQHNlcnZlci50b19zKS50byBlcSgidGhyZWFkcG9vbChzZXJ2ZXIocHJvdCh0cmFucyhzZXJ2ZXJfdHJhbnMpKSkpIikKICAgICBlbmQKLQorICAgIAogICAgIGl0ICJzaG91bGQgc2VydmUgaW5zaWRlIGEgdGhyZWFkIiBkbwotICAgICAgVGhyZWFkLnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4gZG8gfGJsb2NrfAotICAgICAgICBAc2VydmVyLnNob3VsZF9yZWNlaXZlKDpzZXJ2ZSkKLSAgICAgICAgYmxvY2suY2FsbAotICAgICAgICBAc2VydmVyLnJzcGVjX3ZlcmlmeQorICAgICAgZXhjZXB0aW9uX3EgPSBAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6QGV4Y2VwdGlvbl9xKQorICAgICAgZXhwZWN0X2FueV9pbnN0YW5jZV9vZihkZXNjcmliZWRfY2xhc3MpLnRvIHJlY2VpdmUoOnNlcnZlKSBkbyAKKyAgICAgICAgZXhjZXB0aW9uX3EucHVzaChTdGFuZGFyZEVycm9yLm5ldygnRVJST1InKSkKICAgICAgIGVuZAotICAgICAgQGV4Y1Euc2hvdWxkX3JlY2VpdmUoOnBvcCkuYW5kX3Rocm93KDpwb3BwZWQpCi0gICAgICBsYW1iZGEgeyBAc2VydmVyLnJlc2N1YWJsZV9zZXJ2ZSB9LnNob3VsZCB0aHJvd19zeW1ib2woOnBvcHBlZCkKKyAgICAgIGV4cGVjdCB7IEBzZXJ2ZXIucmVzY3VhYmxlX3NlcnZlIH0udG8ocmFpc2VfZXJyb3IoJ0VSUk9SJykpCisgICAgICBzbGVlcCgwLjE1KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhdm9pZCBydW5uaW5nIHRoZSBzZXJ2ZXIgdHdpY2Ugd2hlbiByZXRyeWluZyByZXNjdWFibGVfc2VydmUiIGRvCi0gICAgICBUaHJlYWQuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybiBkbyB8YmxvY2t8Ci0gICAgICAgIEBzZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOnNlcnZlKQotICAgICAgICBibG9jay5jYWxsCi0gICAgICAgIEBzZXJ2ZXIucnNwZWNfdmVyaWZ5CisgICAgICBleGNlcHRpb25fcSA9IEBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDpAZXhjZXB0aW9uX3EpCisgICAgICBleHBlY3RfYW55X2luc3RhbmNlX29mKGRlc2NyaWJlZF9jbGFzcykudG8gcmVjZWl2ZSg6c2VydmUpIGRvIAorICAgICAgICBleGNlcHRpb25fcS5wdXNoKFN0YW5kYXJkRXJyb3IubmV3KCdFUlJPUjEnKSkKKyAgICAgICAgZXhjZXB0aW9uX3EucHVzaChTdGFuZGFyZEVycm9yLm5ldygnRVJST1IyJykpCiAgICAgICBlbmQKLSAgICAgIEBleGNRLnNob3VsZF9yZWNlaXZlKDpwb3ApLnR3aWNlLmFuZF90aHJvdyg6cG9wcGVkKQotICAgICAgbGFtYmRhIHsgQHNlcnZlci5yZXNjdWFibGVfc2VydmUgfS5zaG91bGQgdGhyb3dfc3ltYm9sKDpwb3BwZWQpCi0gICAgICBsYW1iZGEgeyBAc2VydmVyLnJlc2N1YWJsZV9zZXJ2ZSB9LnNob3VsZCB0aHJvd19zeW1ib2woOnBvcHBlZCkKKyAgICAgIGV4cGVjdCB7IEBzZXJ2ZXIucmVzY3VhYmxlX3NlcnZlIH0udG8ocmFpc2VfZXJyb3IoJ0VSUk9SMScpKQorICAgICAgZXhwZWN0IHsgQHNlcnZlci5yZXNjdWFibGVfc2VydmUgfS50byhyYWlzZV9lcnJvcignRVJST1IyJykpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNlcnZlIHVzaW5nIGEgdGhyZWFkIHBvb2wiIGRvCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmxpc3Rlbikub3JkZXJlZAotICAgICAgQHRocmVhZFEuc2hvdWxkX3JlY2VpdmUoOnB1c2gpLndpdGgoOnRva2VuKQotICAgICAgQHRocmVhZFEuc2hvdWxkX3JlY2VpdmUoOnBvcCkKLSAgICAgIFRocmVhZC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfeWllbGQKLSAgICAgIEBzZXJ2ZXJUcmFucy5zaG91bGRfcmVjZWl2ZSg6YWNjZXB0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQGNsaWVudCkKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Z2V0X3RyYW5zcG9ydCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEB0cmFucykKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAcHJvdCkKKyAgICAgIHRocmVhZF9xID0gZG91YmxlKCJTaXplZFF1ZXVlIikKKyAgICAgIGV4Y2VwdGlvbl9xID0gZG91YmxlKCJRdWV1ZSIpCisgICAgICBAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX3NldCg6QHRocmVhZF9xLCB0aHJlYWRfcSkKKyAgICAgIEBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfc2V0KDpAZXhjZXB0aW9uX3EsIGV4Y2VwdGlvbl9xKQorICAgICAgZXhwZWN0KEBzZXJ2ZXJfdHJhbnMpLnRvIHJlY2VpdmUoOmxpc3Rlbikub3JkZXJlZAorICAgICAgZXhwZWN0KHRocmVhZF9xKS50byByZWNlaXZlKDpwdXNoKS53aXRoKDp0b2tlbikKKyAgICAgIGV4cGVjdCh0aHJlYWRfcSkudG8gcmVjZWl2ZSg6cG9wKQorICAgICAgZXhwZWN0KFRocmVhZCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfeWllbGQKKyAgICAgIGV4cGVjdChAc2VydmVyX3RyYW5zKS50byByZWNlaXZlKDphY2NlcHQpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAY2xpZW50KQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Z2V0X3RyYW5zcG9ydCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEB0cmFucykKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQHByb3QpCiAgICAgICB4ID0gMAogICAgICAgZXJyb3IgPSBSdW50aW1lRXJyb3IubmV3KCJTdG9wcGVkIikKLSAgICAgIEBwcm9jZXNzb3Iuc2hvdWxkX3JlY2VpdmUoOnByb2Nlc3MpLmV4YWN0bHkoMykudGltZXMud2l0aChAcHJvdCwgQHByb3QpLmFuZF9yZXR1cm4gZG8KKyAgICAgIGV4cGVjdChAcHJvY2Vzc29yKS50byByZWNlaXZlKDpwcm9jZXNzKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHByb3QsIEBwcm90KSBkbwogICAgICAgICBjYXNlICh4ICs9IDEpCiAgICAgICAgIHdoZW4gMSB0aGVuIHJhaXNlIFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uCiAgICAgICAgIHdoZW4gMiB0aGVuIHJhaXNlIFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24KICAgICAgICAgd2hlbiAzIHRoZW4gcmFpc2UgZXJyb3IKICAgICAgICAgZW5kCiAgICAgICBlbmQKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpLmV4YWN0bHkoMykudGltZXMKLSAgICAgIEBleGNRLnNob3VsZF9yZWNlaXZlKDpwdXNoKS53aXRoKGVycm9yKS5hbmRfdGhyb3coOnN0b3ApCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKQotICAgICAgbGFtYmRhIHsgQHNlcnZlci5zZXJ2ZSB9LnNob3VsZCB0aHJvd19zeW1ib2woOnN0b3ApCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkuZXhhY3RseSgzKS50aW1lcworICAgICAgZXhwZWN0KGV4Y2VwdGlvbl9xKS50byByZWNlaXZlKDpwdXNoKS53aXRoKGVycm9yKS5hbmRfdGhyb3coOnN0b3ApCisgICAgICBleHBlY3QoQHNlcnZlcl90cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBleHBlY3QgeyBAc2VydmVyLnNlcnZlIH0udG8odGhyb3dfc3ltYm9sKDpzdG9wKSkKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc29ja2V0X3NwZWMucmIKaW5kZXggZGQ4YjBmOS4uMjAyYzc0NSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvc29ja2V0X3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvc29ja2V0X3NwZWMucmIKQEAgLTE3LDQ1ICsxNyw1MiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICIvc29ja2V0X3NwZWNfc2hhcmVkIgorcmVxdWlyZSAnc3BlY19oZWxwZXInCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoIiN7RmlsZS5kaXJuYW1lKF9fRklMRV9fKX0vc29ja2V0X3NwZWNfc2hhcmVkIikKIAotY2xhc3MgVGhyaWZ0U29ja2V0U3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAorZGVzY3JpYmUgJ1NvY2tldCcgZG8KIAotICBkZXNjcmliZSBTb2NrZXQgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpTb2NrZXQgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAc29ja2V0ID0gU29ja2V0Lm5ldwotICAgICAgQGhhbmRsZSA9IG1vY2soIkhhbmRsZSIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgQGhhbmRsZS5zdHViISg6Y2xvc2UpCi0gICAgICBAaGFuZGxlLnN0dWIhKDpjb25uZWN0X25vbmJsb2NrKQotICAgICAgOjpTb2NrZXQuc3R1YiEoOm5ldykuYW5kX3JldHVybihAaGFuZGxlKQorICAgICAgQHNvY2tldCA9IFRocmlmdDo6U29ja2V0Lm5ldworICAgICAgQGhhbmRsZSA9IGRvdWJsZSgiSGFuZGxlIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGFsbG93KEBoYW5kbGUpLnRvIHJlY2VpdmUoOmNvbm5lY3Rfbm9uYmxvY2spCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpzZXRzb2Nrb3B0KQorICAgICAgYWxsb3coOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihAaGFuZGxlKQogICAgIGVuZAogCiAgICAgaXRfc2hvdWxkX2JlaGF2ZV9saWtlICJhIHNvY2tldCIKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgYSBUcmFuc3BvcnRFeGNlcHRpb24gd2hlbiBpdCBjYW5ub3Qgb3BlbiBhIHNvY2tldCIgZG8KLSAgICAgIDo6U29ja2V0LnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQotICAgICAgbGFtYmRhIHsgQHNvY2tldC5vcGVuIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiB9CisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJsb2NhbGhvc3QiLCA5MDkwLCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQorICAgICAgZXhwZWN0IHsgQHNvY2tldC5vcGVuIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTikgfQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBvcGVuIGEgOjpTb2NrZXQgd2l0aCBkZWZhdWx0IGFyZ3MiIGRvCi0gICAgICA6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKG1vY2soIkhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUpKQotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJsb2NhbGhvc3QiLCA5MDkwKS5hbmRfcmV0dXJuKFtbXV0pCi0gICAgICA6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6c29ja2FkZHJfaW4pCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihkb3VibGUoIkhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUsIDpzZXRzb2Nrb3B0ID0+IG5pbCkpCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJsb2NhbGhvc3QiLCA5MDkwLCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpzb2NrYWRkcl9pbikKKyAgICAgIEBzb2NrZXQudG9fcyA9PSAic29ja2V0KGxvY2FsaG9zdDo5MDkwKSIKICAgICAgIEBzb2NrZXQub3BlbgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhY2NlcHQgaG9zdC9wb3J0IG9wdGlvbnMiIGRvCi0gICAgICA6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKG1vY2soIkhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUpKQotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJteS5kb21haW4iLCAxMjM0KS5hbmRfcmV0dXJuKFtbXV0pCi0gICAgICA6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6c29ja2FkZHJfaW4pCi0gICAgICBTb2NrZXQubmV3KCdteS5kb21haW4nLCAxMjM0KS5vcGVuCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihkb3VibGUoIkhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUsIDpzZXRzb2Nrb3B0ID0+IG5pbCkpCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJteS5kb21haW4iLCAxMjM0LCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpzb2NrYWRkcl9pbikKKyAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlNvY2tldC5uZXcoJ215LmRvbWFpbicsIDEyMzQpLm9wZW4KKyAgICAgIEBzb2NrZXQudG9fcyA9PSAic29ja2V0KG15LmRvbWFpbjoxMjM0KSIKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWNjZXB0IGFuIG9wdGlvbmFsIHRpbWVvdXQiIGRvCi0gICAgICA6OlNvY2tldC5zdHViISg6bmV3KQotICAgICAgU29ja2V0Lm5ldygnbG9jYWxob3N0JywgODA4MCwgNSkudGltZW91dC5zaG91bGQgPT0gNQorICAgICAgYWxsb3coOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykKKyAgICAgIGV4cGVjdChUaHJpZnQ6OlNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDgwODAsIDUpLnRpbWVvdXQpLnRvIGVxKDUpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBhbGxvdyg6OlNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KQorICAgICAgZXhwZWN0KFRocmlmdDo6U29ja2V0Lm5ldygnbXlob3N0JywgODA5MCkudG9fcykudG8gZXEoInNvY2tldChteWhvc3Q6ODA5MCkiKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc29ja2V0X3NwZWNfc2hhcmVkLnJiIGIvbGliL3JiL3NwZWMvc29ja2V0X3NwZWNfc2hhcmVkLnJiCmluZGV4IDZlZDc3ZmEuLjMyYmRiNzEgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjX3NoYXJlZC5yYgorKysgYi9saWIvcmIvc3BlYy9zb2NrZXRfc3BlY19zaGFyZWQucmIKQEAgLTE3LDg4ICsxNyw4OCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJwogCiBzaGFyZWRfZXhhbXBsZXNfZm9yICJhIHNvY2tldCIgZG8KICAgaXQgInNob3VsZCBvcGVuIGEgc29ja2V0IiBkbwotICAgIEBzb2NrZXQub3Blbi5zaG91bGQgPT0gQGhhbmRsZQorICAgIGV4cGVjdChAc29ja2V0Lm9wZW4pLnRvIGVxKEBoYW5kbGUpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgYmUgb3BlbiB3aGVuZXZlciBpdCBoYXMgYSBoYW5kbGUiIGRvCi0gICAgQHNvY2tldC5zaG91bGRfbm90IGJlX29wZW4KKyAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX29wZW4KICAgICBAc29ja2V0Lm9wZW4KLSAgICBAc29ja2V0LnNob3VsZCBiZV9vcGVuCisgICAgZXhwZWN0KEBzb2NrZXQpLnRvIGJlX29wZW4KICAgICBAc29ja2V0LmhhbmRsZSA9IG5pbAotICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9vcGVuCisgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9vcGVuCiAgICAgQHNvY2tldC5oYW5kbGUgPSBAaGFuZGxlCiAgICAgQHNvY2tldC5jbG9zZQotICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9vcGVuCisgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9vcGVuCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgd3JpdGUgZGF0YSB0byB0aGUgaGFuZGxlIiBkbwogICAgIEBzb2NrZXQub3BlbgotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJmb29iYXIiKQorICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiZm9vYmFyIikKICAgICBAc29ja2V0LndyaXRlKCJmb29iYXIiKQotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJmYWlsIikuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCi0gICAgbGFtYmRhIHsgQHNvY2tldC53cml0ZSgiZmFpbCIpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiB9CisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJmYWlsIikuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCisgICAgZXhwZWN0IHsgQHNvY2tldC53cml0ZSgiZmFpbCIpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTikgfQogICBlbmQKIAogICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIHdoZW4gaXQgY2Fubm90IHJlYWQgZnJvbSB0aGUgaGFuZGxlIiBkbwogICAgIEBzb2NrZXQub3BlbgotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOnJlYWRwYXJ0aWFsKS53aXRoKDE3KS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKLSAgICBsYW1iZGEgeyBAc29ja2V0LnJlYWQoMTcpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiB9CisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOnJlYWRwYXJ0aWFsKS53aXRoKDE3KS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKKyAgICBleHBlY3QgeyBAc29ja2V0LnJlYWQoMTcpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTikgfQogICBlbmQKIAogICBpdCAic2hvdWxkIHJldHVybiB0aGUgZGF0YSByZWFkIHdoZW4gcmVhZGluZyBmcm9tIHRoZSBoYW5kbGUgd29ya3MiIGRvCiAgICAgQHNvY2tldC5vcGVuCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6cmVhZHBhcnRpYWwpLndpdGgoMTcpLmFuZF9yZXR1cm4oInRlc3QgZGF0YSIpCi0gICAgQHNvY2tldC5yZWFkKDE3KS5zaG91bGQgPT0gInRlc3QgZGF0YSIKKyAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6cmVhZHBhcnRpYWwpLndpdGgoMTcpLmFuZF9yZXR1cm4oInRlc3QgZGF0YSIpCisgICAgZXhwZWN0KEBzb2NrZXQucmVhZCgxNykpLnRvIGVxKCJ0ZXN0IGRhdGEiKQogICBlbmQKIAogICBpdCAic2hvdWxkIGRlY2xhcmUgaXRzZWxmIGFzIGNsb3NlZCB3aGVuIGl0IGhhcyBhbiBlcnJvciIgZG8KICAgICBAc29ja2V0Lm9wZW4KLSAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiZmFpbCIpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQotICAgIEBzb2NrZXQuc2hvdWxkIGJlX29wZW4KLSAgICBsYW1iZGEgeyBAc29ja2V0LndyaXRlKCJmYWlsIikgfS5zaG91bGQgcmFpc2VfZXJyb3IKLSAgICBAc29ja2V0LnNob3VsZF9ub3QgYmVfb3BlbgorICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiZmFpbCIpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQorICAgIGV4cGVjdChAc29ja2V0KS50byBiZV9vcGVuCisgICAgZXhwZWN0IHsgQHNvY2tldC53cml0ZSgiZmFpbCIpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTikgfQorICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfb3BlbgogICBlbmQKIAogICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIHdoZW4gdGhlIHN0cmVhbSBpcyBjbG9zZWQiIGRvCiAgICAgQHNvY2tldC5vcGVuCi0gICAgQGhhbmRsZS5zdHViISg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQotICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9vcGVuCi0gICAgbGFtYmRhIHsgQHNvY2tldC53cml0ZSgiZmFpbCIpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKElPRXJyb3IsICJjbG9zZWQgc3RyZWFtIikKLSAgICBsYW1iZGEgeyBAc29ja2V0LnJlYWQoMTApIH0uc2hvdWxkIHJhaXNlX2Vycm9yKElPRXJyb3IsICJjbG9zZWQgc3RyZWFtIikKKyAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCisgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9vcGVuCisgICAgZXhwZWN0IHsgQHNvY2tldC53cml0ZSgiZmFpbCIpIH0udG8gcmFpc2VfZXJyb3IoSU9FcnJvciwgImNsb3NlZCBzdHJlYW0iKQorICAgIGV4cGVjdCB7IEBzb2NrZXQucmVhZCgxMCkgfS50byByYWlzZV9lcnJvcihJT0Vycm9yLCAiY2xvc2VkIHN0cmVhbSIpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgc3VwcG9ydCB0aGUgdGltZW91dCBhY2Nlc3NvciBmb3IgcmVhZCIgZG8KICAgICBAc29ja2V0LnRpbWVvdXQgPSAzCiAgICAgQHNvY2tldC5vcGVuCi0gICAgSU8uc2hvdWxkX3JlY2VpdmUoOnNlbGVjdCkud2l0aChbQGhhbmRsZV0sIG5pbCwgbmlsLCAzKS5hbmRfcmV0dXJuKFtbQGhhbmRsZV0sIFtdLCBbXV0pCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6cmVhZHBhcnRpYWwpLndpdGgoMTcpLmFuZF9yZXR1cm4oInRlc3QgZGF0YSIpCi0gICAgQHNvY2tldC5yZWFkKDE3KS5zaG91bGQgPT0gInRlc3QgZGF0YSIKKyAgICBleHBlY3QoSU8pLnRvIHJlY2VpdmUoOnNlbGVjdCkud2l0aChbQGhhbmRsZV0sIG5pbCwgbmlsLCAzKS5hbmRfcmV0dXJuKFtbQGhhbmRsZV0sIFtdLCBbXV0pCisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOnJlYWRwYXJ0aWFsKS53aXRoKDE3KS5hbmRfcmV0dXJuKCJ0ZXN0IGRhdGEiKQorICAgIGV4cGVjdChAc29ja2V0LnJlYWQoMTcpKS50byBlcSgidGVzdCBkYXRhIikKICAgZW5kCiAKICAgaXQgInNob3VsZCBzdXBwb3J0IHRoZSB0aW1lb3V0IGFjY2Vzc29yIGZvciB3cml0ZSIgZG8KICAgICBAc29ja2V0LnRpbWVvdXQgPSAzCiAgICAgQHNvY2tldC5vcGVuCi0gICAgSU8uc2hvdWxkX3JlY2VpdmUoOnNlbGVjdCkud2l0aChuaWwsIFtAaGFuZGxlXSwgbmlsLCAzKS50d2ljZS5hbmRfcmV0dXJuKFtbXSwgW0BoYW5kbGVdLCBbXV0pCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbm9uYmxvY2spLndpdGgoInRlc3QgZGF0YSIpLmFuZF9yZXR1cm4oNCkKLSAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDp3cml0ZV9ub25ibG9jaykud2l0aCgiIGRhdGEiKS5hbmRfcmV0dXJuKDUpCi0gICAgQHNvY2tldC53cml0ZSgidGVzdCBkYXRhIikuc2hvdWxkID09IDkKKyAgICBleHBlY3QoSU8pLnRvIHJlY2VpdmUoOnNlbGVjdCkud2l0aChuaWwsIFtAaGFuZGxlXSwgbmlsLCAzKS50d2ljZS5hbmRfcmV0dXJuKFtbXSwgW0BoYW5kbGVdLCBbXV0pCisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOndyaXRlX25vbmJsb2NrKS53aXRoKCJ0ZXN0IGRhdGEiKS5hbmRfcmV0dXJuKDQpCisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOndyaXRlX25vbmJsb2NrKS53aXRoKCIgZGF0YSIpLmFuZF9yZXR1cm4oNSkKKyAgICBleHBlY3QoQHNvY2tldC53cml0ZSgidGVzdCBkYXRhIikpLnRvIGVxKDkpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3Igd2hlbiByZWFkIHRpbWVzIG91dCIgZG8KICAgICBAc29ja2V0LnRpbWVvdXQgPSAwLjUKICAgICBAc29ja2V0Lm9wZW4KLSAgICBJTy5zaG91bGRfcmVjZWl2ZSg6c2VsZWN0KS5vbmNlIHtzbGVlcCgwLjUpOyBuaWx9Ci0gICAgbGFtYmRhIHsgQHNvY2tldC5yZWFkKDE3KSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUIH0KKyAgICBleHBlY3QoSU8pLnRvIHJlY2VpdmUoOnNlbGVjdCkub25jZSB7c2xlZXAoMC41KTsgbmlsfQorICAgIGV4cGVjdCB7IEBzb2NrZXQucmVhZCgxNykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCkgfQogICBlbmQKIAogICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIHdoZW4gd3JpdGUgdGltZXMgb3V0IiBkbwogICAgIEBzb2NrZXQudGltZW91dCA9IDAuNQogICAgIEBzb2NrZXQub3BlbgotICAgIElPLnNob3VsZF9yZWNlaXZlKDpzZWxlY3QpLndpdGgobmlsLCBbQGhhbmRsZV0sIG5pbCwgMC41KS5hbnlfbnVtYmVyX29mX3RpbWVzLmFuZF9yZXR1cm4obmlsKQotICAgIGxhbWJkYSB7IEBzb2NrZXQud3JpdGUoInRlc3QgZGF0YSIpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQgfQorICAgIGFsbG93KElPKS50byByZWNlaXZlKDpzZWxlY3QpLndpdGgobmlsLCBbQGhhbmRsZV0sIG5pbCwgMC41KS5hbmRfcmV0dXJuKG5pbCkKKyAgICBleHBlY3QgeyBAc29ja2V0LndyaXRlKCJ0ZXN0IGRhdGEiKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUKSB9CiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zcGVjX2hlbHBlci5yYiBiL2xpYi9yYi9zcGVjL3NwZWNfaGVscGVyLnJiCmluZGV4IGMwNDE0MWEuLjViZjk4ZDAgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NwZWNfaGVscGVyLnJiCisrKyBiL2xpYi9yYi9zcGVjL3NwZWNfaGVscGVyLnJiCkBAIC0xLDMgKzEsNCBAQAorIyBlbmNvZGluZzogVVRGLTgKICMKICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtMTgsNyArMTksNyBAQAogIwogCiByZXF1aXJlICdydWJ5Z2VtcycKLXJlcXVpcmUgJ3NwZWMnCityZXF1aXJlICdyc3BlYycKIAogJDoudW5zaGlmdCBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgKiV3Wy4uIGV4dF0pCiAKQEAgLTI2LDMzICsyNywzOCBAQAogIyB3aWxsIGdldCBzY3Jld2VkIHVwCiAjICQiIDw8ICdmYXN0dGhyZWFkLmJ1bmRsZScKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy8uLi9saWIvdGhyaWZ0JworcmVxdWlyZSAndGhyaWZ0JwogCi1jbGFzcyBPYmplY3QKLSAgIyB0ZWUgaXMgYSB1c2VmdWwgbWV0aG9kLCBzbyBsZXQncyBsZXQgb3VyIHRlc3RzIGhhdmUgaXQKLSAgZGVmIHRlZSgmYmxvY2spCi0gICAgYmxvY2suY2FsbChzZWxmKQotICAgIHNlbGYKK3VubGVzcyBPYmplY3QubWV0aG9kX2RlZmluZWQ/IDp0YXAKKyAgIyBpZiBPYmplY3QjdGFwIGlzbid0IGRlZmluZWQsIHRoZW4gYWRkIGl0OyB0aGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpbiBSdWJ5IDwgMS44LjcKKyAgY2xhc3MgT2JqZWN0CisgICAgZGVmIHRhcCgmYmxvY2spCisgICAgICBibG9jay5jYWxsKHNlbGYpCisgICAgICBzZWxmCisgICAgZW5kCiAgIGVuZAogZW5kCiAKLVNwZWM6OlJ1bm5lci5jb25maWd1cmUgZG8gfGNvbmZpZ3VyYXRpb258CitSU3BlYy5jb25maWd1cmUgZG8gfGNvbmZpZ3VyYXRpb258CiAgIGNvbmZpZ3VyYXRpb24uYmVmb3JlKDplYWNoKSBkbwogICAgIFRocmlmdC50eXBlX2NoZWNraW5nID0gdHJ1ZQogICBlbmQKIGVuZAogCi0kOi51bnNoaWZ0IEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAqJXdbLi4gZGVidWdfcHJvdG9fdGVzdCBnZW4tcmJdKQotcmVxdWlyZSAic3J2IgotcmVxdWlyZSAiZGVidWdfcHJvdG9fdGVzdF9jb25zdGFudHMiCiskOi51bnNoaWZ0IEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAqJXdbLi4gdGVzdCBkZWJ1Z19wcm90byBnZW4tcmJdKQorcmVxdWlyZSAnc3J2JworcmVxdWlyZSAnZGVidWdfcHJvdG9fdGVzdF9jb25zdGFudHMnCiAKICQ6LnVuc2hpZnQgRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICold1tnZW4tcmJdKQogcmVxdWlyZSAndGhyaWZ0X3NwZWNfdHlwZXMnCiByZXF1aXJlICdub25ibG9ja2luZ19zZXJ2aWNlJwogCiBtb2R1bGUgRml4dHVyZXMKLSAgQ09NUEFDVF9QUk9UT0NPTF9URVNUX1NUUlVDVCA9IENPTVBBQ1RfVEVTVC5kdXAKKyAgQ09NUEFDVF9QUk9UT0NPTF9URVNUX1NUUlVDVCA9IFRocmlmdDo6VGVzdDo6Q09NUEFDVF9URVNULmR1cAogICBDT01QQUNUX1BST1RPQ09MX1RFU1RfU1RSVUNULmFfYmluYXJ5ID0gWzAsMSwyLDMsNCw1LDYsNyw4XS5wYWNrKCdjKicpCiAgIENPTVBBQ1RfUFJPVE9DT0xfVEVTVF9TVFJVQ1Quc2V0X2J5dGVfbWFwID0gbmlsCiAgIENPTVBBQ1RfUFJPVE9DT0xfVEVTVF9TVFJVQ1QubWFwX2J5dGVfbWFwID0gbmlsCiBlbmQKKworJDoudW5zaGlmdCBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgKiV3W2dlbi1yYi9mbGF0XSkKKwpkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc3NsX3NlcnZlcl9zb2NrZXRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3NzbF9zZXJ2ZXJfc29ja2V0X3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJlNjUxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL3NzbF9zZXJ2ZXJfc29ja2V0X3NwZWMucmIKQEAgLTAsMCArMSwzNCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJworcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKCIje0ZpbGUuZGlybmFtZShfX0ZJTEVfXyl9L3NvY2tldF9zcGVjX3NoYXJlZCIpCisKK2Rlc2NyaWJlICdTU0xTZXJ2ZXJTb2NrZXQnIGRvCisKKyAgZGVzY3JpYmUgVGhyaWZ0OjpTU0xTZXJ2ZXJTb2NrZXQgZG8KKyAgICBiZWZvcmUoOmVhY2gpIGRvCisgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpTU0xTZXJ2ZXJTb2NrZXQubmV3KDEyMzQpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHNvY2tldC50b19zKS50byBlcSgic3NsKHNvY2tldCg6MTIzNCkpIikKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3NzbF9zb2NrZXRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3NzbF9zb2NrZXRfc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDhkOGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL3NwZWMvc3NsX3NvY2tldF9zcGVjLnJiCkBAIC0wLDAgKzEsNzggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCityZXF1aXJlICdzcGVjX2hlbHBlcicKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aCgiI3tGaWxlLmRpcm5hbWUoX19GSUxFX18pfS9zb2NrZXRfc3BlY19zaGFyZWQiKQorCitkZXNjcmliZSAnU1NMU29ja2V0JyBkbworCisgIGRlc2NyaWJlIFRocmlmdDo6U1NMU29ja2V0IGRvCisgICAgYmVmb3JlKDplYWNoKSBkbworICAgICAgQGNvbnRleHQgPSBPcGVuU1NMOjpTU0w6OlNTTENvbnRleHQubmV3CisgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpTU0xTb2NrZXQubmV3CisgICAgICBAc2ltcGxlX3NvY2tldF9oYW5kbGUgPSBkb3VibGUoIkhhbmRsZSIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgYWxsb3coQHNpbXBsZV9zb2NrZXRfaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGFsbG93KEBzaW1wbGVfc29ja2V0X2hhbmRsZSkudG8gcmVjZWl2ZSg6Y29ubmVjdF9ub25ibG9jaykKKyAgICAgIGFsbG93KEBzaW1wbGVfc29ja2V0X2hhbmRsZSkudG8gcmVjZWl2ZSg6c2V0c29ja29wdCkKKworICAgICAgQGhhbmRsZSA9IGRvdWJsZShkb3VibGUoIlNTTEhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUsIDpwb3N0X2Nvbm5lY3Rpb25fY2hlY2sgPT4gdHJ1ZSksIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgYWxsb3coQGhhbmRsZSkudG8gcmVjZWl2ZSg6Y29ubmVjdF9ub25ibG9jaykKKyAgICAgIGFsbG93KEBoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQorICAgICAgYWxsb3coQGhhbmRsZSkudG8gcmVjZWl2ZSg6cG9zdF9jb25uZWN0aW9uX2NoZWNrKQorCisgICAgICBhbGxvdyg6OlNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKEBzaW1wbGVfc29ja2V0X2hhbmRsZSkKKyAgICAgIGFsbG93KE9wZW5TU0w6OlNTTDo6U1NMU29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oQGhhbmRsZSkKKyAgICBlbmQKKworICAgIGl0X3Nob3VsZF9iZWhhdmVfbGlrZSAiYSBzb2NrZXQiCisKKyAgICBpdCAic2hvdWxkIHJhaXNlIGEgVHJhbnNwb3J0RXhjZXB0aW9uIHdoZW4gaXQgY2Fubm90IG9wZW4gYSBzc2wgc29ja2V0IiBkbworICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpnZXRhZGRyaW5mbykud2l0aCgibG9jYWxob3N0IiwgOTA5MCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pLmFuZF9yZXR1cm4oW1tdXSkKKyAgICAgIGV4cGVjdCB7IEBzb2NrZXQub3BlbiB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pIH0KKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgb3BlbiBhIDo6U29ja2V0IHdpdGggZGVmYXVsdCBhcmdzIiBkbworICAgICAgZXhwZWN0KE9wZW5TU0w6OlNTTDo6U1NMU29ja2V0KS50byByZWNlaXZlKDpuZXcpLndpdGgoQHNpbXBsZV9zb2NrZXRfaGFuZGxlLCBuaWwpLmFuZF9yZXR1cm4oQGhhbmRsZSkKKyAgICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDpwb3N0X2Nvbm5lY3Rpb25fY2hlY2spLndpdGgoJ2xvY2FsaG9zdCcpCisgICAgICBAc29ja2V0Lm9wZW4KKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgYWNjZXB0IGhvc3QvcG9ydCBvcHRpb25zIiBkbworICAgICAgaGFuZGxlID0gZG91YmxlKCJIYW5kbGUiLCA6Y29ubmVjdF9ub25ibG9jayA9PiB0cnVlLCA6c2V0c29ja29wdCA9PiBuaWwpCisgICAgICBhbGxvdyg6OlNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGV4cGVjdCg6OlNvY2tldCkudG8gcmVjZWl2ZSg6Z2V0YWRkcmluZm8pLndpdGgoIm15LmRvbWFpbiIsIDEyMzQsIG5pbCwgOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNKS5hbmRfcmV0dXJuKFtbXV0pCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOnNvY2thZGRyX2luKQorICAgICAgZXhwZWN0KE9wZW5TU0w6OlNTTDo6U1NMU29ja2V0KS50byByZWNlaXZlKDpuZXcpLndpdGgoaGFuZGxlLCBuaWwpLmFuZF9yZXR1cm4oQGhhbmRsZSkKKyAgICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDpwb3N0X2Nvbm5lY3Rpb25fY2hlY2spLndpdGgoJ215LmRvbWFpbicpCisgICAgICBUaHJpZnQ6OlNTTFNvY2tldC5uZXcoJ215LmRvbWFpbicsIDEyMzQsIDYwMDAsIG5pbCkub3BlbgorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBhY2NlcHQgYW4gb3B0aW9uYWwgdGltZW91dCIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OlNTTFNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDgwODAsIDUpLnRpbWVvdXQpLnRvIGVxKDUpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIGFjY2VwdCBhbiBvcHRpb25hbCBjb250ZXh0IiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6U1NMU29ja2V0Lm5ldygnbG9jYWxob3N0JywgODA4MCwgNSwgQGNvbnRleHQpLnNzbF9jb250ZXh0KS50byBlcShAY29udGV4dCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OlNTTFNvY2tldC5uZXcoJ215aG9zdCcsIDgwOTApLnRvX3MpLnRvIGVxKCJzc2woc29ja2V0KG15aG9zdDo4MDkwKSkiKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc3RydWN0X25lc3RlZF9jb250YWluZXJzX3NwZWMucmIgYi9saWIvcmIvc3BlYy9zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDYzNTY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL3NwZWMvc3RydWN0X25lc3RlZF9jb250YWluZXJzX3NwZWMucmIKQEAgLTAsMCArMSwxOTEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCityZXF1aXJlICdzcGVjX2hlbHBlcicKKworZGVzY3JpYmUgJ1N0cnVjdE5lc3RlZENvbnRhaW5lcnMnIGRvCisKKyAgZGVmIHdpdGhfdHlwZV9jaGVja2luZworICAgIHNhdmVkX3R5cGVfY2hlY2tpbmcsIFRocmlmdC50eXBlX2NoZWNraW5nID0gVGhyaWZ0LnR5cGVfY2hlY2tpbmcsIHRydWUKKyAgICBiZWdpbgorICAgICAgeWllbGQKKyAgICBlbnN1cmUKKyAgICAgIFRocmlmdC50eXBlX2NoZWNraW5nID0gc2F2ZWRfdHlwZV9jaGVja2luZworICAgIGVuZAorICBlbmQKKworICBkZXNjcmliZSBUaHJpZnQ6OlN0cnVjdCBkbworICAgICMgTmVzdGVkIGNvbnRhaW5lciB0ZXN0cywgc2VlIFRIUklGVC0zNjkuCisgICAgaXQgInNob3VsZCBzdXBwb3J0IG5lc3RlZCBsaXN0cyBpbnNpZGUgbGlzdHMiIGRvCisgICAgICB3aXRoX3R5cGVfY2hlY2tpbmcgZG8KKyAgICAgICAgYSwgYiA9IFNwZWNOYW1lc3BhY2U6Ok5lc3RlZExpc3RJbkxpc3QubmV3LCBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRMaXN0SW5MaXN0Lm5ldworICAgICAgICBbYSwgYl0uZWFjaCBkbyB8dGhyaWZ0X3N0cnVjdHwKKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0gWyBbMSwgMiwgM10sIFsyLCAzLCA0XSBdCisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQorICAgICAgICBlbmQKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCisgICAgICAgIGIudmFsdWUucHVzaCBbMywgNCwgNV0KKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHN1cHBvcnQgbmVzdGVkIGxpc3RzIGluc2lkZSBzZXRzIiBkbworICAgICAgd2l0aF90eXBlX2NoZWNraW5nIGRvCisgICAgICAgIGEsIGIgPSBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRMaXN0SW5TZXQubmV3LCBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRMaXN0SW5TZXQubmV3CisgICAgICAgIFthLCBiXS5lYWNoIGRvIHx0aHJpZnRfc3RydWN0fAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSBbIFsxLCAyLCAzXSwgWzIsIDMsIDRdIF0udG9fc2V0CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQorICAgICAgICBlbmQKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCisgICAgICAgIGIudmFsdWUuYWRkIFszLCA0LCA1XQorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgc3VwcG9ydCBuZXN0ZWQgbGlzdHMgaW4gbWFwIGtleXMiIGRvCisgICAgICB3aXRoX3R5cGVfY2hlY2tpbmcgZG8KKyAgICAgICAgYSwgYiA9IFNwZWNOYW1lc3BhY2U6Ok5lc3RlZExpc3RJbk1hcEtleS5uZXcsIFNwZWNOYW1lc3BhY2U6Ok5lc3RlZExpc3RJbk1hcEtleS5uZXcKKyAgICAgICAgW2EsIGJdLmVhY2ggZG8gfHRocmlmdF9zdHJ1Y3R8CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IHsgWzEsIDIsIDNdID0+IDEsIFsyLCAzLCA0XSA9PiAyIH0KKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCisgICAgICAgIGVuZAorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKKyAgICAgICAgYi52YWx1ZVtbMywgNCwgNV1dID0gMworICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgc3VwcG9ydCBuZXN0ZWQgbGlzdHMgaW4gbWFwIHZhbHVlcyIgZG8KKyAgICAgIHdpdGhfdHlwZV9jaGVja2luZyBkbworICAgICAgICBhLCBiID0gU3BlY05hbWVzcGFjZTo6TmVzdGVkTGlzdEluTWFwVmFsdWUubmV3LCBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRMaXN0SW5NYXBWYWx1ZS5uZXcKKyAgICAgICAgW2EsIGJdLmVhY2ggZG8gfHRocmlmdF9zdHJ1Y3R8CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IHsgMSA9PiBbMSwgMiwgM10sIDIgPT4gWzIsIDMsIDRdIH0KKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCisgICAgICAgIGVuZAorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKKyAgICAgICAgYi52YWx1ZVszXSA9IFszLCA0LCA1XQorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgc3VwcG9ydCBuZXN0ZWQgc2V0cyBpbnNpZGUgbGlzdHMiIGRvCisgICAgICB3aXRoX3R5cGVfY2hlY2tpbmcgZG8KKyAgICAgICAgYSwgYiA9IFNwZWNOYW1lc3BhY2U6Ok5lc3RlZFNldEluTGlzdC5uZXcsIFNwZWNOYW1lc3BhY2U6Ok5lc3RlZFNldEluTGlzdC5uZXcKKyAgICAgICAgW2EsIGJdLmVhY2ggZG8gfHRocmlmdF9zdHJ1Y3R8CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IFsgWzEsIDIsIDNdLnRvX3NldCwgWzIsIDMsIDRdLnRvX3NldCBdCisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQorICAgICAgICBlbmQKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCisgICAgICAgIGIudmFsdWUucHVzaChbMywgNCwgNV0udG9fc2V0KQorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgc3VwcG9ydCBuZXN0ZWQgc2V0cyBpbnNpZGUgc2V0cyIgZG8KKyAgICAgIHdpdGhfdHlwZV9jaGVja2luZyBkbworICAgICAgICBhLCBiID0gU3BlY05hbWVzcGFjZTo6TmVzdGVkU2V0SW5TZXQubmV3LCBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRTZXRJblNldC5uZXcKKyAgICAgICAgW2EsIGJdLmVhY2ggZG8gfHRocmlmdF9zdHJ1Y3R8CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IFsgWzEsIDIsIDNdLnRvX3NldCwgWzIsIDMsIDRdLnRvX3NldCBdLnRvX3NldAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKKyAgICAgICAgZW5kCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQorICAgICAgICBiLnZhbHVlLmFkZChbMywgNCwgNV0udG9fc2V0KQorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgc3VwcG9ydCBuZXN0ZWQgc2V0cyBpbiBtYXAga2V5cyIgZG8KKyAgICAgIHdpdGhfdHlwZV9jaGVja2luZyBkbworICAgICAgICBhLCBiID0gU3BlY05hbWVzcGFjZTo6TmVzdGVkU2V0SW5NYXBLZXkubmV3LCBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRTZXRJbk1hcEtleS5uZXcKKyAgICAgICAgW2EsIGJdLmVhY2ggZG8gfHRocmlmdF9zdHJ1Y3R8CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IHsgWzEsIDIsIDNdLnRvX3NldCA9PiAxLCBbMiwgMywgNF0udG9fc2V0ID0+IDIgfQorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKKyAgICAgICAgZW5kCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQorICAgICAgICBiLnZhbHVlW1szLCA0LCA1XS50b19zZXRdID0gMworICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgc3VwcG9ydCBuZXN0ZWQgc2V0cyBpbiBtYXAgdmFsdWVzIiBkbworICAgICAgd2l0aF90eXBlX2NoZWNraW5nIGRvCisgICAgICAgIGEsIGIgPSBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRTZXRJbk1hcFZhbHVlLm5ldywgU3BlY05hbWVzcGFjZTo6TmVzdGVkU2V0SW5NYXBWYWx1ZS5uZXcKKyAgICAgICAgW2EsIGJdLmVhY2ggZG8gfHRocmlmdF9zdHJ1Y3R8CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IHsgMSA9PiBbMSwgMiwgM10udG9fc2V0LCAyID0+IFsyLCAzLCA0XS50b19zZXQgfQorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKKyAgICAgICAgZW5kCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQorICAgICAgICBiLnZhbHVlWzNdID0gWzMsIDQsIDVdLnRvX3NldAorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgc3VwcG9ydCBuZXN0ZWQgbWFwcyBpbnNpZGUgbGlzdHMiIGRvCisgICAgICB3aXRoX3R5cGVfY2hlY2tpbmcgZG8KKyAgICAgICAgYSwgYiA9IFNwZWNOYW1lc3BhY2U6Ok5lc3RlZE1hcEluTGlzdC5uZXcsIFNwZWNOYW1lc3BhY2U6Ok5lc3RlZE1hcEluTGlzdC5uZXcKKyAgICAgICAgW2EsIGJdLmVhY2ggZG8gfHRocmlmdF9zdHJ1Y3R8CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IFsgezEgPT4gMiwgMyA9PiA0fSwgezIgPT4gMywgNCA9PiA1fSBdCisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQorICAgICAgICBlbmQKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCisgICAgICAgIGIudmFsdWUucHVzaCh7IDMgPT4gNCwgNSA9PiA2IH0pCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBzdXBwb3J0IG5lc3RlZCBtYXBzIGluc2lkZSBzZXRzIiBkbworICAgICAgd2l0aF90eXBlX2NoZWNraW5nIGRvCisgICAgICAgIGEsIGIgPSBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRNYXBJblNldC5uZXcsIFNwZWNOYW1lc3BhY2U6Ok5lc3RlZE1hcEluU2V0Lm5ldworICAgICAgICBbYSwgYl0uZWFjaCBkbyB8dGhyaWZ0X3N0cnVjdHwKKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0gWyB7MSA9PiAyLCAzID0+IDR9LCB7MiA9PiAzLCA0ID0+IDV9IF0udG9fc2V0CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQorICAgICAgICBlbmQKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCisgICAgICAgIGIudmFsdWUuYWRkKHsgMyA9PiA0LCA1ID0+IDYgfSkKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHN1cHBvcnQgbmVzdGVkIG1hcHMgaW4gbWFwIGtleXMiIGRvCisgICAgICB3aXRoX3R5cGVfY2hlY2tpbmcgZG8KKyAgICAgICAgYSwgYiA9IFNwZWNOYW1lc3BhY2U6Ok5lc3RlZE1hcEluTWFwS2V5Lm5ldywgU3BlY05hbWVzcGFjZTo6TmVzdGVkTWFwSW5NYXBLZXkubmV3CisgICAgICAgIFthLCBiXS5lYWNoIGRvIHx0aHJpZnRfc3RydWN0fAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSB7IHsgMSA9PiAyLCAzID0+IDR9ID0+IDEsIHsyID0+IDMsIDQgPT4gNX0gID0+IDIgfQorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKKyAgICAgICAgZW5kCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQorICAgICAgICBiLnZhbHVlW3szID0+IDQsIDUgPT4gNn1dID0gMworICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgc3VwcG9ydCBuZXN0ZWQgbWFwcyBpbiBtYXAgdmFsdWVzIiBkbworICAgICAgd2l0aF90eXBlX2NoZWNraW5nIGRvCisgICAgICAgIGEsIGIgPSBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRNYXBJbk1hcFZhbHVlLm5ldywgU3BlY05hbWVzcGFjZTo6TmVzdGVkTWFwSW5NYXBWYWx1ZS5uZXcKKyAgICAgICAgW2EsIGJdLmVhY2ggZG8gfHRocmlmdF9zdHJ1Y3R8CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IHsgMSA9PiB7IDEgPT4gMiwgMyA9PiA0fSwgMiA9PiB7MiA9PiAzLCA0ID0+IDV9IH0KKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCisgICAgICAgIGVuZAorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKKyAgICAgICAgYi52YWx1ZVszXSA9IHsgMyA9PiA0LCA1ID0+IDYgfQorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3N0cnVjdF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc3RydWN0X3NwZWMucmIKaW5kZXggMDRmNTVjYS4uYmJkNTAyYiAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvc3RydWN0X3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvc3RydWN0X3NwZWMucmIKQEAgLTE3LDIwNCArMTcsMjAyIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWNfaGVscGVyJworcmVxdWlyZSAnc3BlY19oZWxwZXInCiAKLWNsYXNzIFRocmlmdFN0cnVjdFNwZWMgPCBTcGVjOjpFeGFtcGxlR3JvdXAKLSAgaW5jbHVkZSBUaHJpZnQKLSAgaW5jbHVkZSBTcGVjTmFtZXNwYWNlCitkZXNjcmliZSAnU3RydWN0JyBkbwogCi0gIGRlc2NyaWJlIFN0cnVjdCBkbworICBkZXNjcmliZSBUaHJpZnQ6OlN0cnVjdCBkbwogICAgIGl0ICJzaG91bGQgaXRlcmF0ZSBvdmVyIGFsbCBmaWVsZHMgcHJvcGVybHkiIGRvCiAgICAgICBmaWVsZHMgPSB7fQotICAgICAgRm9vLm5ldy5lYWNoX2ZpZWxkIHsgfGZpZCxmaWVsZF9pbmZvfCBmaWVsZHNbZmlkXSA9IGZpZWxkX2luZm8gfQotICAgICAgZmllbGRzLnNob3VsZCA9PSBGb286OkZJRUxEUworICAgICAgU3BlY05hbWVzcGFjZTo6Rm9vLm5ldy5lYWNoX2ZpZWxkIHsgfGZpZCxmaWVsZF9pbmZvfCBmaWVsZHNbZmlkXSA9IGZpZWxkX2luZm8gfQorICAgICAgZXhwZWN0KGZpZWxkcykudG8gZXEoU3BlY05hbWVzcGFjZTo6Rm9vOjpGSUVMRFMpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGluaXRpYWxpemUgYWxsIGZpZWxkcyB0byBkZWZhdWx0cyIgZG8KLSAgICAgIHZhbGlkYXRlX2RlZmF1bHRfYXJndW1lbnRzKEZvby5uZXcpCisgICAgICB2YWxpZGF0ZV9kZWZhdWx0X2FyZ3VtZW50cyhTcGVjTmFtZXNwYWNlOjpGb28ubmV3KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBpbml0aWFsaXplIGFsbCBmaWVsZHMgdG8gZGVmYXVsdHMgYW5kIGFjY2VwdCBhIGJsb2NrIGFyZ3VtZW50IiBkbwotICAgICAgRm9vLm5ldyBkbyB8ZnwKKyAgICAgIFNwZWNOYW1lc3BhY2U6OkZvby5uZXcgZG8gfGZ8CiAgICAgICAgIHZhbGlkYXRlX2RlZmF1bHRfYXJndW1lbnRzKGYpCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGRlZiB2YWxpZGF0ZV9kZWZhdWx0X2FyZ3VtZW50cyhvYmplY3QpCi0gICAgICBvYmplY3Quc2ltcGxlLnNob3VsZCA9PSA1MwotICAgICAgb2JqZWN0LndvcmRzLnNob3VsZCA9PSAid29yZHMiCi0gICAgICBvYmplY3QuaGVsbG8uc2hvdWxkID09IEhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gJ2hlbGxvLCB3b3JsZCEnKQotICAgICAgb2JqZWN0LmludHMuc2hvdWxkID09IFsxLCAyLCAyLCAzXQotICAgICAgb2JqZWN0LmNvbXBsZXguc2hvdWxkIGJlX25pbAotICAgICAgb2JqZWN0LnNob3J0cy5zaG91bGQgPT0gU2V0Lm5ldyhbNSwgMTcsIDIzOV0pCisgICAgICBleHBlY3Qob2JqZWN0LnNpbXBsZSkudG8gZXEoNTMpCisgICAgICBleHBlY3Qob2JqZWN0LndvcmRzKS50byBlcSgid29yZHMiKQorICAgICAgZXhwZWN0KG9iamVjdC5oZWxsbykudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAnaGVsbG8sIHdvcmxkIScpKQorICAgICAgZXhwZWN0KG9iamVjdC5pbnRzKS50byBlcShbMSwgMiwgMiwgM10pCisgICAgICBleHBlY3Qob2JqZWN0LmNvbXBsZXgpLnRvIGJlX25pbAorICAgICAgZXhwZWN0KG9iamVjdC5zaG9ydHMpLnRvIGVxKFNldC5uZXcoWzUsIDE3LCAyMzldKSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgbm90IHNoYXJlIGRlZmF1bHQgdmFsdWVzIGJldHdlZW4gaW5zdGFuY2VzIiBkbwogICAgICAgYmVnaW4KLSAgICAgICAgc3RydWN0ID0gRm9vLm5ldworICAgICAgICBzdHJ1Y3QgPSBTcGVjTmFtZXNwYWNlOjpGb28ubmV3CiAgICAgICAgIHN0cnVjdC5pbnRzIDw8IDE3Ci0gICAgICAgIEZvby5uZXcuaW50cy5zaG91bGQgPT0gWzEsMiwyLDNdCisgICAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28ubmV3LmludHMpLnRvIGVxKFsxLDIsMiwzXSkKICAgICAgIGVuc3VyZQogICAgICAgICAjIGVuc3VyZSBubyBsZWFrYWdlIHRvIG90aGVyIHRlc3RzCi0gICAgICAgIEZvbzo6RklFTERTWzRdWzpkZWZhdWx0XSA9IFsxLDIsMiwzXQorICAgICAgICBTcGVjTmFtZXNwYWNlOjpGb286OkZJRUxEU1s0XVs6ZGVmYXVsdF0gPSBbMSwyLDIsM10KICAgICAgIGVuZAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwcm9wZXJseSBpbml0aWFsaXplIGJvb2xlYW4gdmFsdWVzIiBkbwotICAgICAgc3RydWN0ID0gQm9vbFN0cnVjdC5uZXcoOnllc25vID0+IGZhbHNlKQotICAgICAgc3RydWN0Lnllc25vLnNob3VsZCBiZV9mYWxzZQorICAgICAgc3RydWN0ID0gU3BlY05hbWVzcGFjZTo6Qm9vbFN0cnVjdC5uZXcoOnllc25vID0+IGZhbHNlKQorICAgICAgZXhwZWN0KHN0cnVjdC55ZXNubykudG8gYmVfZmFsc2V5CiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGhhdmUgcHJvcGVyID09IHNlbWFudGljcyIgZG8KLSAgICAgIEZvby5uZXcuc2hvdWxkX25vdCA9PSBIZWxsby5uZXcKLSAgICAgIEZvby5uZXcuc2hvdWxkID09IEZvby5uZXcKLSAgICAgIEZvby5uZXcoOnNpbXBsZSA9PiA1Mikuc2hvdWxkX25vdCA9PSBGb28ubmV3CisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldykubm90X3RvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldykKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28ubmV3KS50byBlcShTcGVjTmFtZXNwYWNlOjpGb28ubmV3KQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcoOnNpbXBsZSA9PiA1MikpLm5vdF90byBlcShTcGVjTmFtZXNwYWNlOjpGb28ubmV3KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwcmludCBlbnVtIHZhbHVlIG5hbWVzIGluIGluc3BlY3QiIGRvCi0gICAgICBTdHJ1Y3RXaXRoU29tZUVudW0ubmV3KDpzb21lX2VudW0gPT4gU29tZUVudW06Ok9ORSkuaW5zcGVjdC5zaG91bGQgPT0gIjxTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoU29tZUVudW0gc29tZV9lbnVtOk9ORSAoMCk+IgorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhTb21lRW51bS5uZXcoOnNvbWVfZW51bSA9PiBTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FKS5pbnNwZWN0KS50byBlcSgiPFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhTb21lRW51bSBzb21lX2VudW06T05FICgwKT4iKQogCi0gICAgICBTdHJ1Y3RXaXRoRW51bU1hcC5uZXcoOm15X21hcCA9PiB7U29tZUVudW06Ok9ORSA9PiBbU29tZUVudW06OlRXT119KS5pbnNwZWN0LnNob3VsZCA9PSAiPFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhFbnVtTWFwIG15X21hcDp7T05FICgwKTogW1RXTyAoMSldfT4iCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aEVudW1NYXAubmV3KDpteV9tYXAgPT4ge1NwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUgPT4gW1NwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpUV09dfSkuaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoRW51bU1hcCBteV9tYXA6e09ORSAoMCk6IFtUV08gKDEpXX0+IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcHJldHR5IHByaW50IGJpbmFyeSBmaWVsZHMiIGRvCi0gICAgICBGb28yLm5ldyg6bXlfYmluYXJ5ID0+ICJcMDAxXDAwMlwwMDMiKS5pbnNwZWN0LnNob3VsZCA9PSAiPFNwZWNOYW1lc3BhY2U6OkZvbzIgbXlfYmluYXJ5OjAxMDIwMz4iCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vMi5uZXcoOm15X2JpbmFyeSA9PiAiXDAwMVwwMDJcMDAzIikuaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpGb28yIG15X2JpbmFyeTowMTAyMDM+IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgb2ZmZXIgZmllbGQ/IG1ldGhvZHMiIGRvCi0gICAgICBGb28ubmV3Lm9wdF9zdHJpbmc/LnNob3VsZCBiZV9mYWxzZQotICAgICAgRm9vLm5ldyg6c2ltcGxlID0+IDUyKS5zaW1wbGU/LnNob3VsZCBiZV90cnVlCi0gICAgICBGb28ubmV3KDpteV9ib29sID0+IGZhbHNlKS5teV9ib29sPy5zaG91bGQgYmVfdHJ1ZQotICAgICAgRm9vLm5ldyg6bXlfYm9vbCA9PiB0cnVlKS5teV9ib29sPy5zaG91bGQgYmVfdHJ1ZQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcub3B0X3N0cmluZz8pLnRvIGJlX2ZhbHNleQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcoOnNpbXBsZSA9PiA1Mikuc2ltcGxlPykudG8gYmVfdHJ1dGh5CisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldyg6bXlfYm9vbCA9PiBmYWxzZSkubXlfYm9vbD8pLnRvIGJlX3RydXRoeQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcoOm15X2Jvb2wgPT4gdHJ1ZSkubXlfYm9vbD8pLnRvIGJlX3RydXRoeQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBiZSBjb21wYXJhYmxlIiBkbwotICAgICAgczEgPSBTdHJ1Y3RXaXRoU29tZUVudW0ubmV3KDpzb21lX2VudW0gPT4gU29tZUVudW06Ok9ORSkKLSAgICAgIHMyID0gU3RydWN0V2l0aFNvbWVFbnVtLm5ldyg6c29tZV9lbnVtID0+IFNvbWVFbnVtOjpUV08pCisgICAgICBzMSA9IFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhTb21lRW51bS5uZXcoOnNvbWVfZW51bSA9PiBTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FKQorICAgICAgczIgPSBTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoU29tZUVudW0ubmV3KDpzb21lX2VudW0gPT4gU3BlY05hbWVzcGFjZTo6U29tZUVudW06OlRXTykKIAotICAgICAgKHMxIDw9PiBzMikuc2hvdWxkID09IC0xCi0gICAgICAoczIgPD0+IHMxKS5zaG91bGQgPT0gMQotICAgICAgKHMxIDw9PiBzMSkuc2hvdWxkID09IDAKLSAgICAgIChzMSA8PT4gU3RydWN0V2l0aFNvbWVFbnVtLm5ldygpKS5zaG91bGQgPT0gLTEKKyAgICAgIGV4cGVjdChzMSA8PT4gczIpLnRvIGVxKC0xKQorICAgICAgZXhwZWN0KHMyIDw9PiBzMSkudG8gZXEoMSkKKyAgICAgIGV4cGVjdChzMSA8PT4gczEpLnRvIGVxKDApCisgICAgICBleHBlY3QoczEgPD0+IFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhTb21lRW51bS5uZXcoKSkudG8gZXEoLTEpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgaXRzZWxmIG9mZiB0aGUgd2lyZSIgZG8KLSAgICAgIHN0cnVjdCA9IEZvby5uZXcKLSAgICAgIHByb3QgPSBCYXNlUHJvdG9jb2wubmV3KG1vY2soInRyYW5zcG9ydCIpKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5hbmRfcmV0dXJuKAotICAgICAgICBbJ2NvbXBsZXgnLCBUeXBlczo6TUFQLCA1XSwgIyBGb28KLSAgICAgICAgWyd3b3JkcycsIFR5cGVzOjpTVFJJTkcsIDJdLCAjIEZvbwotICAgICAgICBbJ2hlbGxvJywgVHlwZXM6OlNUUlVDVCwgM10sICMgRm9vCi0gICAgICAgICAgWydncmVldGluZycsIFR5cGVzOjpTVFJJTkcsIDFdLCAjIEhlbGxvCi0gICAgICAgICAgW25pbCwgVHlwZXM6OlNUT1AsIDBdLCAjIEhlbGxvCi0gICAgICAgIFsnc2ltcGxlJywgVHlwZXM6OkkzMiwgMV0sICMgRm9vCi0gICAgICAgIFsnaW50cycsIFR5cGVzOjpMSVNULCA0XSwgIyBGb28KLSAgICAgICAgWydzaG9ydHMnLCBUeXBlczo6U0VULCA2XSwgIyBGb28KLSAgICAgICAgW25pbCwgVHlwZXM6OlNUT1AsIDBdICMgSGVsbG8KKyAgICAgIHN0cnVjdCA9IFNwZWNOYW1lc3BhY2U6OkZvby5uZXcKKyAgICAgIHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoZG91YmxlKCJ0cmFuc3BvcnQiKSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikudHdpY2UKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuYW5kX3JldHVybigKKyAgICAgICAgWydjb21wbGV4JywgVGhyaWZ0OjpUeXBlczo6TUFQLCA1XSwgIyBGb28KKyAgICAgICAgWyd3b3JkcycsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMl0sICMgRm9vCisgICAgICAgIFsnaGVsbG8nLCBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDNdLCAjIEZvbworICAgICAgICAgIFsnZ3JlZXRpbmcnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDFdLCAjIEhlbGxvCisgICAgICAgICAgW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0sICMgSGVsbG8KKyAgICAgICAgWydzaW1wbGUnLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDFdLCAjIEZvbworICAgICAgICBbJ2ludHMnLCBUaHJpZnQ6OlR5cGVzOjpMSVNULCA0XSwgIyBGb28KKyAgICAgICAgWydzaG9ydHMnLCBUaHJpZnQ6OlR5cGVzOjpTRVQsIDZdLCAjIEZvbworICAgICAgICBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXSAjIEhlbGxvCiAgICAgICApCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSg3KS50aW1lcwotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLmFuZF9yZXR1cm4oCi0gICAgICAgIFtUeXBlczo6STMyLCBUeXBlczo6TUFQLCAyXSwgIyBjb21wbGV4Ci0gICAgICAgICAgW1R5cGVzOjpTVFJJTkcsIFR5cGVzOjpET1VCTEUsIDJdLCAjIGNvbXBsZXgvMS92YWx1ZQotICAgICAgICAgIFtUeXBlczo6U1RSSU5HLCBUeXBlczo6RE9VQkxFLCAxXSAjIGNvbXBsZXgvMi92YWx1ZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDcpLnRpbWVzCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLmFuZF9yZXR1cm4oCisgICAgICAgIFtUaHJpZnQ6OlR5cGVzOjpJMzIsIFRocmlmdDo6VHlwZXM6Ok1BUCwgMl0sICMgY29tcGxleAorICAgICAgICAgIFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OkRPVUJMRSwgMl0sICMgY29tcGxleC8xL3ZhbHVlCisgICAgICAgICAgW1RocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAxXSAjIGNvbXBsZXgvMi92YWx1ZQogICAgICAgKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfZW5kKS5leGFjdGx5KDMpLnRpbWVzCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2xpc3RfYmVnaW4pLmFuZF9yZXR1cm4oW1R5cGVzOjpJMzIsIDRdKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9saXN0X2VuZCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc2V0X2JlZ2luKS5hbmRfcmV0dXJuKFtUeXBlczo6STE2LCAyXSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc2V0X2VuZCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWFwX2VuZCkuZXhhY3RseSgzKS50aW1lcworICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbGlzdF9iZWdpbikuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6STMyLCA0XSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2xpc3RfZW5kKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc2V0X2JlZ2luKS5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpJMTYsIDJdKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc2V0X2VuZCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybigKICAgICAgICAgMSwgMTQsICAgICAgICAjIGNvbXBsZXgga2V5cwogICAgICAgICA0MiwgICAgICAgICAgICMgc2ltcGxlCiAgICAgICAgIDQsIDIzLCA0LCAyOSAgIyBpbnRzCiAgICAgICApCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigicGkiLCAiZSIsICJmZWlnZW5iYXVtIiwgImFwcGxlIGJhbmFuYSIsICJ3aGF0J3MgdXA/IikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZG91YmxlKS5hbmRfcmV0dXJuKE1hdGg6OlBJLCBNYXRoOjpFLCA0LjY2OTIwMTYwOSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTE2KS5hbmRfcmV0dXJuKDIsIDMpCi0gICAgICBwcm90LnNob3VsZF9ub3RfcmVjZWl2ZSg6c2tpcCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigicGkiLCAiZSIsICJmZWlnZW5iYXVtIiwgImFwcGxlIGJhbmFuYSIsICJ3aGF0J3MgdXA/IikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2RvdWJsZSkuYW5kX3JldHVybihNYXRoOjpQSSwgTWF0aDo6RSwgNC42NjkyMDE2MDkpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMTYpLmFuZF9yZXR1cm4oMiwgMykKKyAgICAgIGV4cGVjdChwcm90KS5ub3RfdG8gcmVjZWl2ZSg6c2tpcCkKICAgICAgIHN0cnVjdC5yZWFkKHByb3QpCiAKLSAgICAgIHN0cnVjdC5zaW1wbGUuc2hvdWxkID09IDQyCi0gICAgICBzdHJ1Y3QuY29tcGxleC5zaG91bGQgPT0gezEgPT4geyJwaSIgPT4gTWF0aDo6UEksICJlIiA9PiBNYXRoOjpFfSwgMTQgPT4geyJmZWlnZW5iYXVtIiA9PiA0LjY2OTIwMTYwOX19Ci0gICAgICBzdHJ1Y3QuaGVsbG8uc2hvdWxkID09IEhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gIndoYXQncyB1cD8iKQotICAgICAgc3RydWN0LndvcmRzLnNob3VsZCA9PSAiYXBwbGUgYmFuYW5hIgotICAgICAgc3RydWN0LmludHMuc2hvdWxkID09IFs0LCAyMywgNCwgMjldCi0gICAgICBzdHJ1Y3Quc2hvcnRzLnNob3VsZCA9PSBTZXQubmV3KFszLCAyXSkKKyAgICAgIGV4cGVjdChzdHJ1Y3Quc2ltcGxlKS50byBlcSg0MikKKyAgICAgIGV4cGVjdChzdHJ1Y3QuY29tcGxleCkudG8gZXEoezEgPT4geyJwaSIgPT4gTWF0aDo6UEksICJlIiA9PiBNYXRoOjpFfSwgMTQgPT4geyJmZWlnZW5iYXVtIiA9PiA0LjY2OTIwMTYwOX19KQorICAgICAgZXhwZWN0KHN0cnVjdC5oZWxsbykudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAid2hhdCdzIHVwPyIpKQorICAgICAgZXhwZWN0KHN0cnVjdC53b3JkcykudG8gZXEoImFwcGxlIGJhbmFuYSIpCisgICAgICBleHBlY3Qoc3RydWN0LmludHMpLnRvIGVxKFs0LCAyMywgNCwgMjldKQorICAgICAgZXhwZWN0KHN0cnVjdC5zaG9ydHMpLnRvIGVxKFNldC5uZXcoWzMsIDJdKSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2VyaWFsaXplIGZhbHNlIGJvb2xlYW4gZmllbGRzIGNvcnJlY3RseSIgZG8KLSAgICAgIGIgPSBCb29sU3RydWN0Lm5ldyg6eWVzbm8gPT4gZmFsc2UpCi0gICAgICBwcm90ID0gQmluYXJ5UHJvdG9jb2wubmV3KE1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9ib29sKS53aXRoKGZhbHNlKQorICAgICAgYiA9IFNwZWNOYW1lc3BhY2U6OkJvb2xTdHJ1Y3QubmV3KDp5ZXNubyA9PiBmYWxzZSkKKyAgICAgIHByb3QgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLm5ldyhUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfYm9vbCkud2l0aChmYWxzZSkKICAgICAgIGIud3JpdGUocHJvdCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2tpcCB1bmV4cGVjdGVkIGZpZWxkcyBpbiBzdHJ1Y3RzIGFuZCB1c2UgZGVmYXVsdCB2YWx1ZXMiIGRvCi0gICAgICBzdHJ1Y3QgPSBGb28ubmV3Ci0gICAgICBwcm90ID0gQmFzZVByb3RvY29sLm5ldyhtb2NrKCJ0cmFuc3BvcnQiKSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuYW5kX3JldHVybigKLSAgICAgICAgWydzaW1wbGUnLCBUeXBlczo6STMyLCAxXSwKLSAgICAgICAgWydjb21wbGV4JywgVHlwZXM6OlNUUlVDVCwgNV0sCi0gICAgICAgIFsndGhpbnonLCBUeXBlczo6TUFQLCA3XSwKLSAgICAgICAgWydmb29iYXInLCBUeXBlczo6STMyLCAzXSwKLSAgICAgICAgWyd3b3JkcycsIFR5cGVzOjpTVFJJTkcsIDJdLAotICAgICAgICBbbmlsLCBUeXBlczo6U1RPUCwgMF0KKyAgICAgIHN0cnVjdCA9IFNwZWNOYW1lc3BhY2U6OkZvby5uZXcKKyAgICAgIHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoZG91YmxlKCJ0cmFuc3BvcnQiKSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuYW5kX3JldHVybigKKyAgICAgICAgWydzaW1wbGUnLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDFdLAorICAgICAgICBbJ2NvbXBsZXgnLCBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDVdLAorICAgICAgICBbJ3RoaW56JywgVGhyaWZ0OjpUeXBlczo6TUFQLCA3XSwKKyAgICAgICAgWydmb29iYXInLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDNdLAorICAgICAgICBbJ3dvcmRzJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAyXSwKKyAgICAgICAgW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0KICAgICAgICkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDUpLnRpbWVzCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybig0MikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCJmb29iYXIiKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6c2tpcCkud2l0aChUeXBlczo6U1RSVUNUKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6c2tpcCkud2l0aChUeXBlczo6TUFQKQotICAgICAgIyBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9iZWdpbikuYW5kX3JldHVybihbVHlwZXM6OkkzMiwgVHlwZXM6OkkzMiwgMF0pCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoNSkudGltZXMKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybig0MikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigiZm9vYmFyIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6OlNUUlVDVCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6Ok1BUCkKKyAgICAgICMgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OkkzMiwgVGhyaWZ0OjpUeXBlczo6STMyLCAwXSkKICAgICAgICMgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfZW5kKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6c2tpcCkud2l0aChUeXBlczo6STMyKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6STMyKQogICAgICAgc3RydWN0LnJlYWQocHJvdCkKIAotICAgICAgc3RydWN0LnNpbXBsZS5zaG91bGQgPT0gNDIKLSAgICAgIHN0cnVjdC5jb21wbGV4LnNob3VsZCBiZV9uaWwKLSAgICAgIHN0cnVjdC53b3Jkcy5zaG91bGQgPT0gImZvb2JhciIKLSAgICAgIHN0cnVjdC5oZWxsby5zaG91bGQgPT0gSGVsbG8ubmV3KDpncmVldGluZyA9PiAnaGVsbG8sIHdvcmxkIScpCi0gICAgICBzdHJ1Y3QuaW50cy5zaG91bGQgPT0gWzEsIDIsIDIsIDNdCi0gICAgICBzdHJ1Y3Quc2hvcnRzLnNob3VsZCA9PSBTZXQubmV3KFs1LCAxNywgMjM5XSkKKyAgICAgIGV4cGVjdChzdHJ1Y3Quc2ltcGxlKS50byBlcSg0MikKKyAgICAgIGV4cGVjdChzdHJ1Y3QuY29tcGxleCkudG8gYmVfbmlsCisgICAgICBleHBlY3Qoc3RydWN0LndvcmRzKS50byBlcSgiZm9vYmFyIikKKyAgICAgIGV4cGVjdChzdHJ1Y3QuaGVsbG8pLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gJ2hlbGxvLCB3b3JsZCEnKSkKKyAgICAgIGV4cGVjdChzdHJ1Y3QuaW50cykudG8gZXEoWzEsIDIsIDIsIDNdKQorICAgICAgZXhwZWN0KHN0cnVjdC5zaG9ydHMpLnRvIGVxKFNldC5uZXcoWzUsIDE3LCAyMzldKSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgaXRzZWxmIHRvIHRoZSB3aXJlIiBkbwotICAgICAgcHJvdCA9IEJhc2VQcm90b2NvbC5uZXcobW9jaygidHJhbnNwb3J0IikpICNtb2NrKCJQcm90b2NvbCIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OkZvbyIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OkhlbGxvIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnaW50cycsIFR5cGVzOjpMSVNULCA0KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDEpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMikudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCgzKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2NvbXBsZXgnLCBUeXBlczo6TUFQLCA1KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDUpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoJ2ZvbycpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9kb3VibGUpLndpdGgoMS4yMykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdzaG9ydHMnLCBUeXBlczo6U0VULCA2KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKDUpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoMTcpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoMjM5KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkuZXhhY3RseSg2KS50aW1lcwotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ3NpbXBsZScsIFR5cGVzOjpJMzIsIDEpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoNTMpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnaGVsbG8nLCBUeXBlczo6U1RSVUNULCAzKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2dyZWV0aW5nJywgVHlwZXM6OlNUUklORywgMSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnaGVsbG8sIHdvcmxkIScpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tYXBfYmVnaW4pLndpdGgoVHlwZXM6OkkzMiwgVHlwZXM6Ok1BUCwgMSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21hcF9iZWdpbikud2l0aChUeXBlczo6U1RSSU5HLCBUeXBlczo6RE9VQkxFLCAxKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWFwX2VuZCkudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2xpc3RfYmVnaW4pLndpdGgoVHlwZXM6OkkzMiwgNCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2xpc3RfZW5kKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc2V0X2JlZ2luKS53aXRoKFR5cGVzOjpJMTYsIDMpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zZXRfZW5kKQorICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhkb3VibGUoInRyYW5zcG9ydCIpKSAjbW9jaygiUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6Rm9vIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OkhlbGxvIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdpbnRzJywgVGhyaWZ0OjpUeXBlczo6TElTVCwgNCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMikudHdpY2UKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnY29tcGxleCcsIFRocmlmdDo6VHlwZXM6Ok1BUCwgNSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoNSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoJ2ZvbycpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZG91YmxlKS53aXRoKDEuMjMpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ3Nob3J0cycsIFRocmlmdDo6VHlwZXM6OlNFVCwgNikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoNSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoMTcpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKDIzOSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkuZXhhY3RseSg2KS50aW1lcworICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdzaW1wbGUnLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDEpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDUzKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdoZWxsbycsIFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgMykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnZ3JlZXRpbmcnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCdoZWxsbywgd29ybGQhJykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9tYXBfYmVnaW4pLndpdGgoVGhyaWZ0OjpUeXBlczo6STMyLCBUaHJpZnQ6OlR5cGVzOjpNQVAsIDEpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWFwX2JlZ2luKS53aXRoKFRocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAxKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21hcF9lbmQpLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbGlzdF9iZWdpbikud2l0aChUaHJpZnQ6OlR5cGVzOjpJMzIsIDQpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbGlzdF9lbmQpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc2V0X2JlZ2luKS53aXRoKFRocmlmdDo6VHlwZXM6OkkxNiwgMykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zZXRfZW5kKQogCi0gICAgICBzdHJ1Y3QgPSBGb28ubmV3CisgICAgICBzdHJ1Y3QgPSBTcGVjTmFtZXNwYWNlOjpGb28ubmV3CiAgICAgICBzdHJ1Y3Qud29yZHMgPSBuaWwKICAgICAgIHN0cnVjdC5jb21wbGV4ID0gezUgPT4geyJmb28iID0+IDEuMjN9fQogICAgICAgc3RydWN0LndyaXRlKHByb3QpCkBAIC0yMjIsNTEgKzIyMCw1MSBAQAogCiAgICAgaXQgInNob3VsZCByYWlzZSBhbiBleGNlcHRpb24gaWYgcHJlc2VudGVkIHdpdGggYW4gdW5rbm93biBjb250YWluZXIiIGRvCiAgICAgICAjIHllYWggdGhpcyBpcyBzaWxseSwgYnV0IEknbSBnb2luZyBmb3IgY29kZSBjb3ZlcmFnZSBoZXJlCi0gICAgICBzdHJ1Y3QgPSBGb28ubmV3Ci0gICAgICBsYW1iZGEgeyBzdHJ1Y3Quc2VuZCA6d3JpdGVfY29udGFpbmVyLCBuaWwsIG5pbCwgezp0eXBlID0+ICJmb28ifSB9LnNob3VsZCByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yLCAiTm90IGEgY29udGFpbmVyIHR5cGU6IGZvbyIpCisgICAgICBzdHJ1Y3QgPSBTcGVjTmFtZXNwYWNlOjpGb28ubmV3CisgICAgICBleHBlY3QgeyBzdHJ1Y3Quc2VuZCA6d3JpdGVfY29udGFpbmVyLCBuaWwsIG5pbCwgezp0eXBlID0+ICJmb28ifSB9LnRvIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IsICJOb3QgYSBjb250YWluZXIgdHlwZTogZm9vIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc3VwcG9ydCBvcHRpb25hbCB0eXBlLWNoZWNraW5nIGluIFRocmlmdDo6U3RydWN0Lm5ldyIgZG8KICAgICAgIFRocmlmdC50eXBlX2NoZWNraW5nID0gdHJ1ZQogICAgICAgYmVnaW4KLSAgICAgICAgbGFtYmRhIHsgSGVsbG8ubmV3KDpncmVldGluZyA9PiAzKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IsICJFeHBlY3RlZCBUeXBlczo6U1RSSU5HLCByZWNlaXZlZCBGaXhudW0gZm9yIGZpZWxkIGdyZWV0aW5nIikKKyAgICAgICAgZXhwZWN0IHsgU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAzKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCAvRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgKEludGVnZXJ8Rml4bnVtKSBmb3IgZmllbGQgZ3JlZXRpbmcvKQogICAgICAgZW5zdXJlCiAgICAgICAgIFRocmlmdC50eXBlX2NoZWNraW5nID0gZmFsc2UKICAgICAgIGVuZAotICAgICAgbGFtYmRhIHsgSGVsbG8ubmV3KDpncmVldGluZyA9PiAzKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAzKSB9Lm5vdF90byByYWlzZV9lcnJvcgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzdXBwb3J0IG9wdGlvbmFsIHR5cGUtY2hlY2tpbmcgaW4gZmllbGQgYWNjZXNzb3JzIiBkbwogICAgICAgVGhyaWZ0LnR5cGVfY2hlY2tpbmcgPSB0cnVlCiAgICAgICBiZWdpbgotICAgICAgICBoZWxsbyA9IEhlbGxvLm5ldwotICAgICAgICBsYW1iZGEgeyBoZWxsby5ncmVldGluZyA9IDMgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yLCAiRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgRml4bnVtIGZvciBmaWVsZCBncmVldGluZyIpCisgICAgICAgIGhlbGxvID0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3CisgICAgICAgIGV4cGVjdCB7IGhlbGxvLmdyZWV0aW5nID0gMyB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCAvRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgKEludGVnZXJ8Rml4bnVtKSBmb3IgZmllbGQgZ3JlZXRpbmcvKQogICAgICAgZW5zdXJlCiAgICAgICAgIFRocmlmdC50eXBlX2NoZWNraW5nID0gZmFsc2UKICAgICAgIGVuZAotICAgICAgbGFtYmRhIHsgaGVsbG8uZ3JlZXRpbmcgPSAzIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBoZWxsby5ncmVldGluZyA9IDMgfS5ub3RfdG8gcmFpc2VfZXJyb3IKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gdW5rbm93biB0eXBlcyBhcmUgZ2l2ZW4gdG8gVGhyaWZ0OjpTdHJ1Y3QubmV3IiBkbwotICAgICAgbGFtYmRhIHsgSGVsbG8ubmV3KDpmaXNoID0+ICdzYWxtb24nKSB9LnNob3VsZCByYWlzZV9lcnJvcihFeGNlcHRpb24sICJVbmtub3duIGtleSBnaXZlbiB0byBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXc6IGZpc2giKQorICAgICAgZXhwZWN0IHsgU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpmaXNoID0+ICdzYWxtb24nKSB9LnRvIHJhaXNlX2Vycm9yKEV4Y2VwdGlvbiwgIlVua25vd24ga2V5IGdpdmVuIHRvIFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldzogZmlzaCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHN1cHBvcnQgYHJhaXNlIFhjZXB0aW9uLCAnbWVzc2FnZSdgIGZvciBFeGNlcHRpb24gc3RydWN0cyIgZG8KICAgICAgIGJlZ2luCi0gICAgICAgIHJhaXNlIFhjZXB0aW9uLCAic29tZXRoaW5nIGhhcHBlbmVkIgorICAgICAgICByYWlzZSBTcGVjTmFtZXNwYWNlOjpYY2VwdGlvbiwgInNvbWV0aGluZyBoYXBwZW5lZCIKICAgICAgIHJlc2N1ZSBUaHJpZnQ6OkV4Y2VwdGlvbiA9PiBlCi0gICAgICAgIGUubWVzc2FnZS5zaG91bGQgPT0gInNvbWV0aGluZyBoYXBwZW5lZCIKLSAgICAgICAgZS5jb2RlLnNob3VsZCA9PSAxCisgICAgICAgIGV4cGVjdChlLm1lc3NhZ2UpLnRvIGVxKCJzb21ldGhpbmcgaGFwcGVuZWQiKQorICAgICAgICBleHBlY3QoZS5jb2RlKS50byBlcSgxKQogICAgICAgICAjIGVuc3VyZSBpdCBnZXRzIHNlcmlhbGl6ZWQgcHJvcGVybHksIHRoaXMgaXMgdGhlIHJlYWxseSBpbXBvcnRhbnQgcGFydAotICAgICAgICBwcm90ID0gQmFzZVByb3RvY29sLm5ldyhtb2NrKCJ0cmFucyIpKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OlhjZXB0aW9uIikKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ21lc3NhZ2UnLCBUeXBlczo6U1RSSU5HLCAxKSMsICJzb21ldGhpbmcgaGFwcGVuZWQiKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoInNvbWV0aGluZyBoYXBwZW5lZCIpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdjb2RlJywgVHlwZXM6OkkzMiwgMikjLCAxKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMSkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS50d2ljZQorICAgICAgICBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KGRvdWJsZSgidHJhbnMiKSkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6WGNlcHRpb24iKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdtZXNzYWdlJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKSMsICJzb21ldGhpbmcgaGFwcGVuZWQiKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJzb21ldGhpbmcgaGFwcGVuZWQiKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2NvZGUnLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDIpIywgMSkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCgxKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkudHdpY2UKIAogICAgICAgICBlLndyaXRlKHByb3QpCiAgICAgICBlbmQKQEAgLTI3NCwxOSArMjcyLDE5IEBACiAKICAgICBpdCAic2hvdWxkIHN1cHBvcnQgdGhlIHJlZ3VsYXIgaW5pdGlhbGl6ZXIgZm9yIGV4Y2VwdGlvbiBzdHJ1Y3RzIiBkbwogICAgICAgYmVnaW4KLSAgICAgICAgcmFpc2UgWGNlcHRpb24sIDptZXNzYWdlID0+ICJzb21ldGhpbmcgaGFwcGVuZWQiLCA6Y29kZSA9PiA1CisgICAgICAgIHJhaXNlIFNwZWNOYW1lc3BhY2U6OlhjZXB0aW9uLCA6bWVzc2FnZSA9PiAic29tZXRoaW5nIGhhcHBlbmVkIiwgOmNvZGUgPT4gNQogICAgICAgcmVzY3VlIFRocmlmdDo6RXhjZXB0aW9uID0+IGUKLSAgICAgICAgZS5tZXNzYWdlLnNob3VsZCA9PSAic29tZXRoaW5nIGhhcHBlbmVkIgotICAgICAgICBlLmNvZGUuc2hvdWxkID09IDUKLSAgICAgICAgcHJvdCA9IEJhc2VQcm90b2NvbC5uZXcobW9jaygidHJhbnMiKSkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpYY2VwdGlvbiIpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdtZXNzYWdlJywgVHlwZXM6OlNUUklORywgMSkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJzb21ldGhpbmcgaGFwcGVuZWQiKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnY29kZScsIFR5cGVzOjpJMzIsIDIpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCg1KQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLnR3aWNlCisgICAgICAgIGV4cGVjdChlLm1lc3NhZ2UpLnRvIGVxKCJzb21ldGhpbmcgaGFwcGVuZWQiKQorICAgICAgICBleHBlY3QoZS5jb2RlKS50byBlcSg1KQorICAgICAgICBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KGRvdWJsZSgidHJhbnMiKSkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6WGNlcHRpb24iKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdtZXNzYWdlJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJzb21ldGhpbmcgaGFwcGVuZWQiKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2NvZGUnLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDIpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoNSkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLnR3aWNlCiAKICAgICAgICAgZS53cml0ZShwcm90KQogICAgICAgZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy90aGluX2h0dHBfc2VydmVyX3NwZWMucmIgYi9saWIvcmIvc3BlYy90aGluX2h0dHBfc2VydmVyX3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1MzkxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL3RoaW5faHR0cF9zZXJ2ZXJfc3BlYy5yYgpAQCAtMCwwICsxLDE0MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJworcmVxdWlyZSAncmFjay90ZXN0JworcmVxdWlyZSAndGhyaWZ0L3NlcnZlci90aGluX2h0dHBfc2VydmVyJworCitkZXNjcmliZSBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyIGRvCisKKyAgbGV0KDpwcm9jZXNzb3IpIHsgZG91YmxlKCdwcm9jZXNzb3InKSB9CisKKyAgZGVzY3JpYmUgIiNpbml0aWFsaXplIiBkbworCisgICAgY29udGV4dCAid2hlbiB1c2luZyB0aGUgZGVmYXVsdHMiIGRvCisKKyAgICAgIGl0ICJiaW5kcyB0byBwb3J0IDgwLCB3aXRoIGhvc3QgMC4wLjAuMCwgYSBwYXRoIG9mICcvJyIgZG8KKyAgICAgICAgZXhwZWN0KFRoaW46OlNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKCcwLjAuMC4wJywgODAsIGFuX2luc3RhbmNlX29mKFJhY2s6OkJ1aWxkZXIpKQorICAgICAgICBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyLm5ldyhwcm9jZXNzb3IpCisgICAgICBlbmQKKworICAgICAgaXQgJ2NyZWF0ZXMgYSBUaGluSFRUUFNlcnZlcjo6UmFja0FwcGxpY2F0aW9uQ29udGV4dCcgZG8KKyAgICAgICAgZXhwZWN0KFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXI6OlJhY2tBcHBsaWNhdGlvbikudG8gcmVjZWl2ZSg6Zm9yKS53aXRoKCIvIiwgcHJvY2Vzc29yLCBhbl9pbnN0YW5jZV9vZihUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeSkpLmFuZF9yZXR1cm4oYW55dGhpbmcpCisgICAgICAgIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXIubmV3KHByb2Nlc3NvcikKKyAgICAgIGVuZAorCisgICAgICBpdCAidXNlcyB0aGUgQmluYXJ5UHJvdG9jb2xGYWN0b3J5IiBkbworICAgICAgICBleHBlY3QoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkpLnRvIHJlY2VpdmUoOm5ldykKKyAgICAgICAgVGhyaWZ0OjpUaGluSFRUUFNlcnZlci5uZXcocHJvY2Vzc29yKQorICAgICAgZW5kCisKKyAgICBlbmQKKworICAgIGNvbnRleHQgIndoZW4gdXNpbmcgdGhlIG9wdGlvbnMiIGRvCisKKyAgICAgIGl0ICdhY2NlcHRzIDppcCwgOnBvcnQsIDpwYXRoJyBkbworICAgICAgICBpcCA9ICIxOTIuMTY4LjAuMSIKKyAgICAgICAgcG9ydCA9IDMwMDAKKyAgICAgICAgcGF0aCA9ICIvdGhpbiIKKyAgICAgICAgZXhwZWN0KFRoaW46OlNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKGlwLCBwb3J0LCBhbl9pbnN0YW5jZV9vZihSYWNrOjpCdWlsZGVyKSkKKyAgICAgICAgVGhyaWZ0OjpUaGluSFRUUFNlcnZlci5uZXcocHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmlwID0+IGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOnBvcnQgPT4gcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDpwYXRoID0+IHBhdGgpCisgICAgICBlbmQKKworICAgICAgaXQgJ2NyZWF0ZXMgYSBUaGluSFRUUFNlcnZlcjo6UmFja0FwcGxpY2F0aW9uQ29udGV4dCB3aXRoIGEgZGlmZmVyZW50IHByb3RvY29sIGZhY3RvcnknIGRvCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OlRoaW5IVFRQU2VydmVyOjpSYWNrQXBwbGljYXRpb24pLnRvIHJlY2VpdmUoOmZvcikud2l0aCgiLyIsIHByb2Nlc3NvciwgYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpKc29uUHJvdG9jb2xGYWN0b3J5KSkuYW5kX3JldHVybihhbnl0aGluZykKKyAgICAgICAgVGhyaWZ0OjpUaGluSFRUUFNlcnZlci5uZXcocHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOnByb3RvY29sX2ZhY3RvcnkgPT4gVGhyaWZ0OjpKc29uUHJvdG9jb2xGYWN0b3J5Lm5ldykKKyAgICAgIGVuZAorCisgICAgZW5kCisKKyAgZW5kCisKKyAgZGVzY3JpYmUgIiNzZXJ2ZSIgZG8KKworICAgIGl0ICdzdGFydHMgdGhlIFRoaW4gc2VydmVyJyBkbworICAgICAgdW5kZXJseWluZ190aGluX3NlcnZlciA9IGRvdWJsZSgndGhpbiBzZXJ2ZXInLCA6c3RhcnQgPT4gdHJ1ZSkKKyAgICAgIGFsbG93KFRoaW46OlNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKHVuZGVybHlpbmdfdGhpbl9zZXJ2ZXIpCisKKyAgICAgIHRoaW5fdGhyaWZ0X3NlcnZlciA9IFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXIubmV3KHByb2Nlc3NvcikKKworICAgICAgZXhwZWN0KHVuZGVybHlpbmdfdGhpbl9zZXJ2ZXIpLnRvIHJlY2VpdmUoOnN0YXJ0KQorICAgICAgdGhpbl90aHJpZnRfc2VydmVyLnNlcnZlCisgICAgZW5kCisgIGVuZAorCitlbmQKKworZGVzY3JpYmUgVGhyaWZ0OjpUaGluSFRUUFNlcnZlcjo6UmFja0FwcGxpY2F0aW9uIGRvCisgIGluY2x1ZGUgUmFjazo6VGVzdDo6TWV0aG9kcworCisgIGxldCg6cHJvY2Vzc29yKSB7IGRvdWJsZSgncHJvY2Vzc29yJykgfQorICBsZXQoOnByb3RvY29sX2ZhY3RvcnkpIHsgZG91YmxlKCdwcm90b2NvbCBmYWN0b3J5JykgfQorCisgIGRlZiBhcHAKKyAgICBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyOjpSYWNrQXBwbGljYXRpb24uZm9yKCIvIiwgcHJvY2Vzc29yLCBwcm90b2NvbF9mYWN0b3J5KQorICBlbmQKKworICBjb250ZXh0ICI0MDQgcmVzcG9uc2UiIGRvCisKKyAgICBpdCAncmVjZWl2ZXMgYSBub24tUE9TVCcgZG8KKyAgICAgIGhlYWRlcignQ29udGVudC1UeXBlJywgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKKyAgICAgIGdldCAiLyIKKyAgICAgIGV4cGVjdChsYXN0X3Jlc3BvbnNlLnN0YXR1cykudG8gYmUgNDA0CisgICAgZW5kCisKKyAgICBpdCAncmVjZWl2ZXMgYSBoZWFkZXIgb3RoZXIgdGhhbiBhcHBsaWNhdGlvbi94LXRocmlmdCcgZG8KKyAgICAgIGhlYWRlcignQ29udGVudC1UeXBlJywgImFwcGxpY2F0aW9uL2pzb24iKQorICAgICAgcG9zdCAiLyIKKyAgICAgIGV4cGVjdChsYXN0X3Jlc3BvbnNlLnN0YXR1cykudG8gYmUgNDA0CisgICAgZW5kCisKKyAgZW5kCisKKyAgY29udGV4dCAiMjAwIHJlc3BvbnNlIiBkbworCisgICAgYmVmb3JlIGRvCisgICAgICBhbGxvdyhwcm90b2NvbF9mYWN0b3J5KS50byByZWNlaXZlKDpnZXRfcHJvdG9jb2wpCisgICAgICBhbGxvdyhwcm9jZXNzb3IpLnRvIHJlY2VpdmUoOnByb2Nlc3MpCisgICAgZW5kCisKKyAgICBpdCAnY3JlYXRlcyBhbiBJT1N0cmVhbVRyYW5zcG9ydCcgZG8KKyAgICAgIGhlYWRlcignQ29udGVudC1UeXBlJywgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKKyAgICAgIGV4cGVjdChUaHJpZnQ6OklPU3RyZWFtVHJhbnNwb3J0KS50byByZWNlaXZlKDpuZXcpLndpdGgoYW5faW5zdGFuY2Vfb2YoUmFjazo6TGludDo6SW5wdXRXcmFwcGVyKSwgYW5faW5zdGFuY2Vfb2YoUmFjazo6UmVzcG9uc2UpKQorICAgICAgcG9zdCAiLyIKKyAgICBlbmQKKworICAgIGl0ICdmZXRjaGVzIHRoZSByaWdodCBwcm90b2NvbCBiYXNlZCBvbiB0aGUgVHJhbnNwb3J0JyBkbworICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGUnLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQorICAgICAgZXhwZWN0KHByb3RvY29sX2ZhY3RvcnkpLnRvIHJlY2VpdmUoOmdldF9wcm90b2NvbCkud2l0aChhbl9pbnN0YW5jZV9vZihUaHJpZnQ6OklPU3RyZWFtVHJhbnNwb3J0KSkKKyAgICAgIHBvc3QgIi8iCisgICAgZW5kCisKKyAgICBpdCAnc3RhdHVzIGNvZGUgMjAwJyBkbworICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGUnLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQorICAgICAgcG9zdCAiLyIKKyAgICAgIGV4cGVjdChsYXN0X3Jlc3BvbnNlLm9rPykudG8gYmVfdHJ1dGh5CisgICAgZW5kCisKKyAgZW5kCisKK2VuZAorCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy90eXBlc19zcGVjLnJiIGIvbGliL3JiL3NwZWMvdHlwZXNfc3BlYy5yYgppbmRleCA3OTk5ZTkyLi5kNTk1YWI1IDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy90eXBlc19zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3R5cGVzX3NwZWMucmIKQEAgLTE3LDEwICsxNyw5IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWNfaGVscGVyJworcmVxdWlyZSAnc3BlY19oZWxwZXInCiAKLWNsYXNzIFRocmlmdFR5cGVzU3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAorZGVzY3JpYmUgVGhyaWZ0OjpUeXBlcyBkbwogCiAgIGJlZm9yZSg6ZWFjaCkgZG8KICAgICBUaHJpZnQudHlwZV9jaGVja2luZyA9IHRydWUKQEAgLTMwLDg3ICsyOSw5MCBAQAogICAgIFRocmlmdC50eXBlX2NoZWNraW5nID0gZmFsc2UKICAgZW5kCiAKLSAgZGVzY3JpYmUgIlR5cGUgY2hlY2tpbmciIGRvCisgIGNvbnRleHQgJ3R5cGUgY2hlY2tpbmcnIGRvCiAgICAgaXQgInNob3VsZCByZXR1cm4gdGhlIHByb3BlciBuYW1lIGZvciBlYWNoIHR5cGUiIGRvCi0gICAgICBUaHJpZnQudHlwZV9uYW1lKFR5cGVzOjpJMTYpLnNob3VsZCA9PSAiVHlwZXM6OkkxNiIKLSAgICAgIFRocmlmdC50eXBlX25hbWUoVHlwZXM6OlZPSUQpLnNob3VsZCA9PSAiVHlwZXM6OlZPSUQiCi0gICAgICBUaHJpZnQudHlwZV9uYW1lKFR5cGVzOjpMSVNUKS5zaG91bGQgPT0gIlR5cGVzOjpMSVNUIgotICAgICAgVGhyaWZ0LnR5cGVfbmFtZSg0Mikuc2hvdWxkIGJlX25pbAorICAgICAgZXhwZWN0KFRocmlmdC50eXBlX25hbWUoVGhyaWZ0OjpUeXBlczo6STE2KSkudG8gZXEoIlR5cGVzOjpJMTYiKQorICAgICAgZXhwZWN0KFRocmlmdC50eXBlX25hbWUoVGhyaWZ0OjpUeXBlczo6Vk9JRCkpLnRvIGVxKCJUeXBlczo6Vk9JRCIpCisgICAgICBleHBlY3QoVGhyaWZ0LnR5cGVfbmFtZShUaHJpZnQ6OlR5cGVzOjpMSVNUKSkudG8gZXEoIlR5cGVzOjpMSVNUIikKKyAgICAgIGV4cGVjdChUaHJpZnQudHlwZV9uYW1lKDQyKSkudG8gYmVfbmlsCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNoZWNrIHR5cGVzIHByb3Blcmx5IiBkbwotICAgICAgIyBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIFR5cGVzOjpTVE9QKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCAgICAgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpTVE9QfSwgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsICAgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpWT0lEfSwgICA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6Vk9JRH0sICAgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUodHJ1ZSwgICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6Qk9PTH0sICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVHlwZXM6OkJPT0x9LCAgIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVHlwZXM6OkJZVEV9LCAgIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSg0MiwgICAgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpJMTZ9LCAgICA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoNDIsICAgICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6STMyfSwgICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVHlwZXM6Okk2NH0sICAgIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLjE0LCAgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpJMzJ9LCAgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLjE0LCAgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpET1VCTEV9LCA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6RE9VQkxFfSwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoIjMiLCAgICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6U1RSSU5HfSwgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVHlwZXM6OlNUUklOR30sIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKKyAgICAgICMgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RPUH0sICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Vk9JRH0sICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Vk9JRH0sICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKHRydWUsICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Qk9PTH0sICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Qk9PTH0sICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6QllURX0sICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STE2fSwgICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSwgICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STY0fSwgICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMuMTQsICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSwgICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMuMTQsICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6RE9VQkxFfSwgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6RE9VQkxFfSwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKCIzIiwgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfSwgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfSwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKICAgICAgIGhlbGxvID0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3Ci0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShoZWxsbywgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpTVFJVQ1QsIDpjbGFzcyA9PiBTcGVjTmFtZXNwYWNlOjpIZWxsb30sIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgiZm9vIiwgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpTVFJVQ1R9LCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSh7OmZvbyA9PiAxfSwgICAgezp0eXBlID0+IFR5cGVzOjpNQVB9LCAgICA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzFdLCAgICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6TUFQfSwgICAgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzFdLCAgICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6TElTVH0sICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKHs6Zm9vID0+IDF9LCAgICB7OnR5cGUgPT4gVHlwZXM6OkxJU1R9LCAgIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFNldC5uZXcoWzEsMl0pLCB7OnR5cGUgPT4gVHlwZXM6OlNFVH0sICAgIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShbMSwyXSwgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpTRVR9LCAgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSh7OmZvbyA9PiB0cnVlfSwgezp0eXBlID0+IFR5cGVzOjpTRVR9LCAgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShoZWxsbywgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgOmNsYXNzID0+IFNwZWNOYW1lc3BhY2U6OkhlbGxvfSwgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKCJmb28iLCAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSVUNUfSwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGZpZWxkID0gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Ok1BUCwgOmtleSA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSwgOnZhbHVlID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9fQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoezEgPT4gIm9uZSJ9LCAgIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzFdLCAgICAgICAgICAgIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TElTVCwgOmVsZW1lbnQgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn19CisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShbMV0sICAgICAgICAgICAgZmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSh7OmZvbyA9PiAxfSwgICAgZmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTRVQsIDplbGVtZW50ID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9fQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwyXSksIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzEsMl0sICAgICAgICAgIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoezpmb28gPT4gdHJ1ZX0sIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBlcnJvciBvdXQgaWYgbmlsIGlzIHBhc3NlZCBhbmQgc2tpcF90eXBlcyBpcyBmYWxzZSIgZG8KLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFR5cGVzOjpCT09MfSwgICA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVHlwZXM6OkJZVEV9LCAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUeXBlczo6STE2fSwgICAgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFR5cGVzOjpJMzJ9LCAgICA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVHlwZXM6Okk2NH0sICAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUeXBlczo6RE9VQkxFfSwgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFR5cGVzOjpTVFJJTkd9LCA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVHlwZXM6OlNUUlVDVH0sIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUeXBlczo6TElTVH0sICAgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFR5cGVzOjpTRVR9LCAgICA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVHlwZXM6Ok1BUH0sICAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCT09MfSwgICA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJZVEV9LCAgIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STE2fSwgICAgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9LCAgICA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Okk2NH0sICAgIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6RE9VQkxFfSwgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9LCA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUlVDVH0sIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TElTVH0sICAgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTRVR9LCAgICA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Ok1BUH0sICAgIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjaGVjayBlbGVtZW50IHR5cGVzIG9uIGNvbnRhaW5lcnMiIGRvCi0gICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUeXBlczo6TElTVCwgOmVsZW1lbnQgPT4gezp0eXBlID0+IFR5cGVzOjpJMzJ9fQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzEsIDJdLCBmaWVsZCwgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFsxLCBuaWwsIDJdLCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVHlwZXM6Ok1BUCwgOmtleSA9PiB7OnR5cGUgPT4gVHlwZXM6OkkzMn0sIDp2YWx1ZSA9PiB7OnR5cGUgPT4gVHlwZXM6OlNUUklOR319Ci0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSh7MSA9PiAib25lIiwgMiA9PiAidHdvIn0sIGZpZWxkLCA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoezEgPT4gIm9uZSIsIG5pbCA9PiAibmlsIn0sIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSh7MSA9PiBuaWwsIDIgPT4gInR3byJ9LCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVHlwZXM6OlNFVCwgOmVsZW1lbnQgPT4gezp0eXBlID0+IFR5cGVzOjpJMzJ9fQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwgMl0pLCBmaWVsZCwgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFNldC5uZXcoWzEsIG5pbCwgMl0pLCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwgMi4zLCAyXSksIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICAKLSAgICAgIGZpZWxkID0gezp0eXBlID0+IFR5cGVzOjpTVFJVQ1QsIDpjbGFzcyA9PiBTcGVjTmFtZXNwYWNlOjpIZWxsb30KLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFNwZWNOYW1lc3BhY2U6OkJvb2xTdHJ1Y3QsIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpMSVNULCA6ZWxlbWVudCA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfX0KKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFsxLCAyXSwgZmllbGQsIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShbMSwgbmlsLCAyXSwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpNQVAsIDprZXkgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0sIDp2YWx1ZSA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfX0KKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKHsxID0+ICJvbmUiLCAyID0+ICJ0d28ifSwgZmllbGQsIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSh7MSA9PiAib25lIiwgbmlsID0+ICJuaWwifSwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSh7MSA9PiBuaWwsIDIgPT4gInR3byJ9LCBmaWVsZCwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGZpZWxkID0gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNFVCwgOmVsZW1lbnQgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn19CisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShTZXQubmV3KFsxLCAyXSksIGZpZWxkLCA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwgbmlsLCAyXSksIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwgMi4zLCAyXSksIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorCisgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDpjbGFzcyA9PiBTcGVjTmFtZXNwYWNlOjpIZWxsb30KKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFNwZWNOYW1lc3BhY2U6OkJvb2xTdHJ1Y3QsIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQogICAgIGVuZAogCi0gICAgaXQgInNob3VsZCBnaXZlIHRoZSBUeXBlRXJyb3IgYSByZWFkYWJsZSBtZXNzYWdlIiBkbwotICAgICAgbXNnID0gIkV4cGVjdGVkIFR5cGVzOjpTVFJJTkcsIHJlY2VpdmVkIEZpeG51bSBmb3IgZmllbGQgZm9vIgotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgezp0eXBlID0+IFR5cGVzOjpTVFJJTkd9LCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IsIG1zZykKLSAgICAgIG1zZyA9ICJFeHBlY3RlZCBUeXBlczo6U1RSSU5HLCByZWNlaXZlZCBGaXhudW0gZm9yIGZpZWxkIGZvby5lbGVtZW50IgotICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVHlwZXM6OkxJU1QsIDplbGVtZW50ID0+IHs6dHlwZSA9PiBUeXBlczo6U1RSSU5HfX0KLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFszXSwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvciwgbXNnKQorICAgIGl0ICJzaG91bGQgZ2l2ZSB0aGUgVGhyaWZ0OjpUeXBlRXJyb3IgYSByZWFkYWJsZSBtZXNzYWdlIiBkbworICAgICAgbXNnID0gL0V4cGVjdGVkIFR5cGVzOjpTVFJJTkcsIHJlY2VpdmVkIChJbnRlZ2VyfEZpeG51bSkgZm9yIGZpZWxkIGZvby8KKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9LCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCBtc2cpCisgICAgICBtc2cgPSAvRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgKEludGVnZXJ8Rml4bnVtKSBmb3IgZmllbGQgZm9vLmVsZW1lbnQvCisgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpMSVNULCA6ZWxlbWVudCA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfX0KKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFszXSwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsIG1zZykKICAgICAgIG1zZyA9ICJFeHBlY3RlZCBUeXBlczo6STMyLCByZWNlaXZlZCBOaWxDbGFzcyBmb3IgZmllbGQgZm9vLmVsZW1lbnQua2V5IgotICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVHlwZXM6OkxJU1QsCi0gICAgICAgICAgICAgICA6ZWxlbWVudCA9PiB7OnR5cGUgPT4gVHlwZXM6Ok1BUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6a2V5ID0+IHs6dHlwZSA9PiBUeXBlczo6STMyfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6dmFsdWUgPT4gezp0eXBlID0+IFR5cGVzOjpJMzJ9fX0KLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFt7bmlsID0+IDN9XSwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvciwgbXNnKQorICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TElTVCwKKyAgICAgICAgICAgICAgIDplbGVtZW50ID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpNQVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmtleSA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6dmFsdWUgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn19fQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoW3tuaWwgPT4gM31dLCBmaWVsZCwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgbXNnKQogICAgICAgbXNnID0gIkV4cGVjdGVkIFR5cGVzOjpJMzIsIHJlY2VpdmVkIE5pbENsYXNzIGZvciBmaWVsZCBmb28uZWxlbWVudC52YWx1ZSIKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFt7MSA9PiBuaWx9XSwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvciwgbXNnKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoW3sxID0+IG5pbH1dLCBmaWVsZCwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgbXNnKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvdW5pb25fc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3VuaW9uX3NwZWMucmIKaW5kZXggNzAyZTkyMC4uMGNlNjMwNiAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvdW5pb25fc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy91bmlvbl9zcGVjLnJiCkBAIC0xNywxNTYgKzE3LDE3OCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJwogCi1jbGFzcyBUaHJpZnRVbmlvblNwZWMgPCBTcGVjOjpFeGFtcGxlR3JvdXAKLSAgaW5jbHVkZSBUaHJpZnQKLSAgaW5jbHVkZSBTcGVjTmFtZXNwYWNlCitkZXNjcmliZSAnVW5pb24nIGRvCiAKLSAgZGVzY3JpYmUgVW5pb24gZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpVbmlvbiBkbwogICAgIGl0ICJzaG91bGQgcmV0dXJuIG5pbCB2YWx1ZSBpbiB1bnNldCB1bmlvbiIgZG8KLSAgICAgIHVuaW9uID0gTXlfdW5pb24ubmV3Ci0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSBuaWwKLSAgICAgIHVuaW9uLmdldF92YWx1ZS5zaG91bGQgPT0gbmlsCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldworICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKG5pbCkKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfdmFsdWUpLnRvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2V0IGEgZmllbGQgYW5kIGJlIGFjY2Vzc2libGUgdGhyb3VnaCBnZXRfdmFsdWUgYW5kIHRoZSBuYW1lZCBmaWVsZCBhY2Nlc3NvciIgZG8KLSAgICAgIHVuaW9uID0gTXlfdW5pb24ubmV3CisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldwogICAgICAgdW5pb24uaW50ZWdlcjMyID0gMjUKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IDppbnRlZ2VyMzIKLSAgICAgIHVuaW9uLmdldF92YWx1ZS5zaG91bGQgPT0gMjUKLSAgICAgIHVuaW9uLmludGVnZXIzMi5zaG91bGQgPT0gMjUKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcSg6aW50ZWdlcjMyKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF92YWx1ZSkudG8gZXEoMjUpCisgICAgICBleHBlY3QodW5pb24uaW50ZWdlcjMyKS50byBlcSgyNSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd29yayBjb3JyZWN0bHkgd2hlbiBpbnN0YW50aWF0ZWQgd2l0aCBzdGF0aWMgZmllbGQgY29uc3RydWN0b3JzIiBkbwotICAgICAgdW5pb24gPSBNeV91bmlvbi5pbnRlZ2VyMzIoNSkKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IDppbnRlZ2VyMzIKLSAgICAgIHVuaW9uLmludGVnZXIzMi5zaG91bGQgPT0gNQorICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5pbnRlZ2VyMzIoNSkKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcSg6aW50ZWdlcjMyKQorICAgICAgZXhwZWN0KHVuaW9uLmludGVnZXIzMikudG8gZXEoNSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgZm9yIHdyb25nIHNldCBmaWVsZCIgZG8KLSAgICAgIHVuaW9uID0gTXlfdW5pb24ubmV3CisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldwogICAgICAgdW5pb24uaW50ZWdlcjMyID0gMjUKLSAgICAgIGxhbWJkYSB7IHVuaW9uLnNvbWVfY2hhcmFjdGVycyB9LnNob3VsZCByYWlzZV9lcnJvcihSdW50aW1lRXJyb3IsICJzb21lX2NoYXJhY3RlcnMgaXMgbm90IHVuaW9uJ3Mgc2V0IGZpZWxkLiIpCisgICAgICBleHBlY3QgeyB1bmlvbi5zb21lX2NoYXJhY3RlcnMgfS50byByYWlzZV9lcnJvcihSdW50aW1lRXJyb3IsICJzb21lX2NoYXJhY3RlcnMgaXMgbm90IHVuaW9uJ3Mgc2V0IGZpZWxkLiIpCiAgICAgZW5kCi0gICAgIAorCisgICAgaXQgInNob3VsZCByYWlzZSBmb3Igd3Jvbmcgc2V0IGZpZWxkIHdoZW4gaGFzaCBpbml0aWFsaXplZCBhbmQgdHlwZSBjaGVja2luZyBpcyBvZmYiIGRvCisgICAgICBUaHJpZnQudHlwZV9jaGVja2luZyA9IGZhbHNlCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyh7aW5jb3JyZWN0X2ZpZWxkOiA6aW5jb3JyZWN0fSkKKyAgICAgIGV4YW1wbGUgPSBsYW1iZGEgeyBUaHJpZnQ6OlNlcmlhbGl6ZXIubmV3LnNlcmlhbGl6ZSh1bmlvbikgfQorICAgICAgZXhwZWN0KGV4YW1wbGUpLnRvIHJhaXNlX2Vycm9yKFJ1bnRpbWVFcnJvciwgInNldF9maWVsZCBpcyBub3QgdmFsaWQgZm9yIHRoaXMgdW5pb24hIikKKyAgICBlbmQKKwogICAgIGl0ICJzaG91bGQgbm90IGJlIGVxdWFsIHRvIG5pbCIgZG8KLSAgICAgIHVuaW9uID0gTXlfdW5pb24ubmV3Ci0gICAgICB1bmlvbi5zaG91bGRfbm90ID09IG5pbAorICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcKKyAgICAgIGV4cGVjdCh1bmlvbikubm90X3RvIGVxKG5pbCkKICAgICBlbmQKLSAgICAgCisKKyAgICBpdCAic2hvdWxkIG5vdCBiZSBlcXVhbCB3aXRoIGFuIGVtcHR5IFN0cmluZyIgZG8KKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3CisgICAgICBleHBlY3QodW5pb24pLm5vdF90byBlcSgnJykKKyAgICBlbmQKKwogICAgIGl0ICJzaG91bGQgbm90IGVxdWF0ZSB0d28gZGlmZmVyZW50IHVuaW9ucywgaTMyIHZzLiBzdHJpbmciIGRvCi0gICAgICB1bmlvbiA9IE15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKLSAgICAgIG90aGVyX3VuaW9uID0gTXlfdW5pb24ubmV3KDpzb21lX2NoYXJhY3RlcnMsICJibGFoISIpCi0gICAgICB1bmlvbi5zaG91bGRfbm90ID09IG90aGVyX3VuaW9uCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKKyAgICAgIG90aGVyX3VuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpzb21lX2NoYXJhY3RlcnMsICJibGFoISIpCisgICAgICBleHBlY3QodW5pb24pLm5vdF90byBlcShvdGhlcl91bmlvbikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcHJvcGVybHkgcmVzZXQgc2V0ZmllbGQgYW5kIHNldHZhbHVlIiBkbwotICAgICAgdW5pb24gPSBNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCi0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSA6aW50ZWdlcjMyCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcSg6aW50ZWdlcjMyKQogICAgICAgdW5pb24uc29tZV9jaGFyYWN0ZXJzID0gImJsYWghIgotICAgICAgdW5pb24uZ2V0X3NldF9maWVsZC5zaG91bGQgPT0gOnNvbWVfY2hhcmFjdGVycwotICAgICAgdW5pb24uZ2V0X3ZhbHVlLnNob3VsZCA9PSAiYmxhaCEiCi0gICAgICBsYW1iZGEgeyB1bmlvbi5pbnRlZ2VyMzIgfS5zaG91bGQgcmFpc2VfZXJyb3IoUnVudGltZUVycm9yLCAiaW50ZWdlcjMyIGlzIG5vdCB1bmlvbidzIHNldCBmaWVsZC4iKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKDpzb21lX2NoYXJhY3RlcnMpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3ZhbHVlKS50byBlcSgiYmxhaCEiKQorICAgICAgZXhwZWN0IHsgdW5pb24uaW50ZWdlcjMyIH0udG8gcmFpc2VfZXJyb3IoUnVudGltZUVycm9yLCAiaW50ZWdlcjMyIGlzIG5vdCB1bmlvbidzIHNldCBmaWVsZC4iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBub3QgZXF1YXRlIHR3byBkaWZmZXJlbnQgdW5pb25zIHdpdGggZGlmZmVyZW50IHZhbHVlcyIgZG8KLSAgICAgIHVuaW9uID0gTXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQotICAgICAgb3RoZXJfdW5pb24gPSBNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgNDAwKQotICAgICAgdW5pb24uc2hvdWxkX25vdCA9PSBvdGhlcl91bmlvbgorICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCisgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCA0MDApCisgICAgICBleHBlY3QodW5pb24pLm5vdF90byBlcShvdGhlcl91bmlvbikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgbm90IGVxdWF0ZSB0d28gZGlmZmVyZW50IHVuaW9ucyB3aXRoIGRpZmZlcmVudCBmaWVsZHMiIGRvCi0gICAgICB1bmlvbiA9IE15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKLSAgICAgIG90aGVyX3VuaW9uID0gTXlfdW5pb24ubmV3KDpvdGhlcl9pMzIsIDI1KQotICAgICAgdW5pb24uc2hvdWxkX25vdCA9PSBvdGhlcl91bmlvbgorICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCisgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6b3RoZXJfaTMyLCAyNSkKKyAgICAgIGV4cGVjdCh1bmlvbikubm90X3RvIGVxKG90aGVyX3VuaW9uKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBpbnNwZWN0IHByb3Blcmx5IiBkbwotICAgICAgdW5pb24gPSBNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCi0gICAgICB1bmlvbi5pbnNwZWN0LnNob3VsZCA9PSAiPFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uIGludGVnZXIzMjogMjU+IgorICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCisgICAgICBleHBlY3QodW5pb24uaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpNeV91bmlvbiBpbnRlZ2VyMzI6IDI1PiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG5vdCBhbGxvdyBzZXR0aW5nIHdpdGggaW5zdGFuY2VfdmFyaWFibGVfc2V0IiBkbwotICAgICAgdW5pb24gPSBNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjcpCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNykKICAgICAgIHVuaW9uLmluc3RhbmNlX3ZhcmlhYmxlX3NldCg6QHNvbWVfY2hhcmFjdGVycywgImhhbGxvISIpCi0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSA6aW50ZWdlcjMyCi0gICAgICB1bmlvbi5nZXRfdmFsdWUuc2hvdWxkID09IDI3Ci0gICAgICBsYW1iZGEgeyB1bmlvbi5zb21lX2NoYXJhY3RlcnMgfS5zaG91bGQgcmFpc2VfZXJyb3IoUnVudGltZUVycm9yLCAic29tZV9jaGFyYWN0ZXJzIGlzIG5vdCB1bmlvbidzIHNldCBmaWVsZC4iKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKDppbnRlZ2VyMzIpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3ZhbHVlKS50byBlcSgyNykKKyAgICAgIGV4cGVjdCB7IHVuaW9uLnNvbWVfY2hhcmFjdGVycyB9LnRvIHJhaXNlX2Vycm9yKFJ1bnRpbWVFcnJvciwgInNvbWVfY2hhcmFjdGVycyBpcyBub3QgdW5pb24ncyBzZXQgZmllbGQuIikKICAgICBlbmQKIAotICAgIGl0ICJzaG91bGQgc2VyaWFsaXplIGNvcnJlY3RseSIgZG8KKyAgICBpdCAic2hvdWxkIHNlcmlhbGl6ZSB0byBiaW5hcnkgY29ycmVjdGx5IiBkbwogICAgICAgdHJhbnMgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcKICAgICAgIHByb3RvID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC5uZXcodHJhbnMpCiAKLSAgICAgIHVuaW9uID0gTXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQorICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCiAgICAgICB1bmlvbi53cml0ZShwcm90bykKIAotICAgICAgb3RoZXJfdW5pb24gPSBNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCisgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKICAgICAgIG90aGVyX3VuaW9uLnJlYWQocHJvdG8pCi0gICAgICBvdGhlcl91bmlvbi5zaG91bGQgPT0gdW5pb24KKyAgICAgIGV4cGVjdChvdGhlcl91bmlvbikudG8gZXEodW5pb24pCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHNlcmlhbGl6ZSB0byBqc29uIGNvcnJlY3RseSIgZG8KKyAgICAgIHRyYW5zID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3CisgICAgICBwcm90byA9IFRocmlmdDo6SnNvblByb3RvY29sLm5ldyh0cmFucykKKworICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCisgICAgICB1bmlvbi53cml0ZShwcm90bykKKworICAgICAgb3RoZXJfdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCisgICAgICBvdGhlcl91bmlvbi5yZWFkKHByb3RvKQorICAgICAgZXhwZWN0KG90aGVyX3VuaW9uKS50byBlcSh1bmlvbikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmFpc2Ugd2hlbiB2YWxpZGF0aW5nIHVuc2V0IHVuaW9uIiBkbwotICAgICAgdW5pb24gPSBNeV91bmlvbi5uZXcKLSAgICAgIGxhbWJkYSB7IHVuaW9uLnZhbGlkYXRlIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IsICJVbmlvbiBmaWVsZHMgYXJlIG5vdCBzZXQuIikKKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3CisgICAgICBleHBlY3QgeyB1bmlvbi52YWxpZGF0ZSB9LnRvIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IsICJVbmlvbiBmaWVsZHMgYXJlIG5vdCBzZXQuIikKIAotICAgICAgb3RoZXJfdW5pb24gPSBNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMSkKLSAgICAgIGxhbWJkYSB7IG90aGVyX3VuaW9uLnZhbGlkYXRlIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yLCAiVW5pb24gZmllbGRzIGFyZSBub3Qgc2V0LiIpCisgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAxKQorICAgICAgZXhwZWN0IHsgb3RoZXJfdW5pb24udmFsaWRhdGUgfS5ub3RfdG8gcmFpc2VfZXJyb3IKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgdmFsaWRhdGUgYW4gZW51bSBmaWVsZCBwcm9wZXJseSIgZG8KLSAgICAgIHVuaW9uID0gVGVzdFVuaW9uLm5ldyg6ZW51bV9maWVsZCwgMykKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IDplbnVtX2ZpZWxkCi0gICAgICBsYW1iZGEgeyB1bmlvbi52YWxpZGF0ZSB9LnNob3VsZCByYWlzZV9lcnJvcihQcm90b2NvbEV4Y2VwdGlvbiwgIkludmFsaWQgdmFsdWUgb2YgZmllbGQgZW51bV9maWVsZCEiKQorICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24ubmV3KDplbnVtX2ZpZWxkLCAzKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKDplbnVtX2ZpZWxkKQorICAgICAgZXhwZWN0IHsgdW5pb24udmFsaWRhdGUgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLCAiSW52YWxpZCB2YWx1ZSBvZiBmaWVsZCBlbnVtX2ZpZWxkISIpCiAKLSAgICAgIG90aGVyX3VuaW9uID0gVGVzdFVuaW9uLm5ldyg6ZW51bV9maWVsZCwgMSkKLSAgICAgIGxhbWJkYSB7IG90aGVyX3VuaW9uLnZhbGlkYXRlIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihQcm90b2NvbEV4Y2VwdGlvbiwgIkludmFsaWQgdmFsdWUgb2YgZmllbGQgZW51bV9maWVsZCEiKQorICAgICAgb3RoZXJfdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24ubmV3KDplbnVtX2ZpZWxkLCAxKQorICAgICAgZXhwZWN0IHsgb3RoZXJfdW5pb24udmFsaWRhdGUgfS5ub3RfdG8gcmFpc2VfZXJyb3IKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcHJvcGVybHkgc2VyaWFsaXplIGFuZCBtYXRjaCBzdHJ1Y3RzIHdpdGggYSB1bmlvbiIgZG8KLSAgICAgIHVuaW9uID0gTXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI2KQotICAgICAgc3d1ID0gU3RydWN0X3dpdGhfdW5pb24ubmV3KDpmdW5fdW5pb24gPT4gdW5pb24pCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNikKKyAgICAgIHN3dSA9IFNwZWNOYW1lc3BhY2U6OlN0cnVjdF93aXRoX3VuaW9uLm5ldyg6ZnVuX3VuaW9uID0+IHVuaW9uKQogCiAgICAgICB0cmFucyA9IFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0Lm5ldwogICAgICAgcHJvdG8gPSBUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbC5uZXcodHJhbnMpCiAKICAgICAgIHN3dS53cml0ZShwcm90bykKIAotICAgICAgb3RoZXJfdW5pb24gPSBNeV91bmlvbi5uZXcoOnNvbWVfY2hhcmFjdGVycywgImhlbGxvIHRoZXJlIikKLSAgICAgIHN3dTIgPSBTdHJ1Y3Rfd2l0aF91bmlvbi5uZXcoOmZ1bl91bmlvbiA9PiBvdGhlcl91bmlvbikKKyAgICAgIG90aGVyX3VuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpzb21lX2NoYXJhY3RlcnMsICJoZWxsbyB0aGVyZSIpCisgICAgICBzd3UyID0gU3BlY05hbWVzcGFjZTo6U3RydWN0X3dpdGhfdW5pb24ubmV3KDpmdW5fdW5pb24gPT4gb3RoZXJfdW5pb24pCiAKLSAgICAgIHN3dTIuc2hvdWxkX25vdCA9PSBzd3UKKyAgICAgIGV4cGVjdChzd3UyKS5ub3RfdG8gZXEoc3d1KQogCiAgICAgICBzd3UyLnJlYWQocHJvdG8pCi0gICAgICBzd3UyLnNob3VsZCA9PSBzd3UKKyAgICAgIGV4cGVjdChzd3UyKS50byBlcShzd3UpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHN1cHBvcnQgb2xkIHN0eWxlIGNvbnN0cnVjdG9yIiBkbwotICAgICAgdW5pb24gPSBNeV91bmlvbi5uZXcoOmludGVnZXIzMiA9PiAyNikKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IDppbnRlZ2VyMzIKLSAgICAgIHVuaW9uLmdldF92YWx1ZS5zaG91bGQgPT0gMjYKKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIgPT4gMjYpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3NldF9maWVsZCkudG8gZXEoOmludGVnZXIzMikKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfdmFsdWUpLnRvIGVxKDI2KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBub3QgdGhyb3cgYW4gZXJyb3Igd2hlbiBpbnNwZWN0ZWQgYW5kIHVuc2V0IiBkbwotICAgICAgbGFtYmRhe1Rlc3RVbmlvbi5uZXcoKS5pbnNwZWN0fS5zaG91bGRfbm90IHJhaXNlX2Vycm9yCisgICAgICBleHBlY3R7U3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uLm5ldygpLmluc3BlY3R9Lm5vdF90byByYWlzZV9lcnJvcgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwcmludCBlbnVtIHZhbHVlIG5hbWUgd2hlbiBpbnNwZWN0ZWQiIGRvCi0gICAgICBNeV91bmlvbi5uZXcoOnNvbWVfZW51bSA9PiBTb21lRW51bTo6T05FKS5pbnNwZWN0LnNob3VsZCA9PSAiPFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uIHNvbWVfZW51bTogT05FICgwKT4iCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpzb21lX2VudW0gPT4gU3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSkuaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpNeV91bmlvbiBzb21lX2VudW06IE9ORSAoMCk+IikKIAotICAgICAgTXlfdW5pb24ubmV3KDpteV9tYXAgPT4ge1NvbWVFbnVtOjpPTkUgPT4gW1NvbWVFbnVtOjpUV09dfSkuaW5zcGVjdC5zaG91bGQgPT0gIjxTcGVjTmFtZXNwYWNlOjpNeV91bmlvbiBteV9tYXA6IHtPTkUgKDApOiBbVFdPICgxKV19PiIgCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpteV9tYXAgPT4ge1NwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUgPT4gW1NwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpUV09dfSkuaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpNeV91bmlvbiBteV9tYXA6IHtPTkUgKDApOiBbVFdPICgxKV19PiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG9mZmVyIGZpZWxkPyBtZXRob2RzIiBkbwotICAgICAgTXlfdW5pb24ubmV3LnNvbWVfZW51bT8uc2hvdWxkIGJlX2ZhbHNlCi0gICAgICBNeV91bmlvbi5uZXcoOnNvbWVfZW51bSA9PiBTb21lRW51bTo6T05FKS5zb21lX2VudW0/LnNob3VsZCBiZV90cnVlCi0gICAgICBNeV91bmlvbi5uZXcoOmltX3RydWUgPT4gZmFsc2UpLmltX3RydWU/LnNob3VsZCBiZV90cnVlCi0gICAgICBNeV91bmlvbi5uZXcoOmltX3RydWUgPT4gdHJ1ZSkuaW1fdHJ1ZT8uc2hvdWxkIGJlX3RydWUKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcuc29tZV9lbnVtPykudG8gYmVfZmFsc2V5CisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpzb21lX2VudW0gPT4gU3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSkuc29tZV9lbnVtPykudG8gYmVfdHJ1dGh5CisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbV90cnVlID0+IGZhbHNlKS5pbV90cnVlPykudG8gYmVfdHJ1dGh5CisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbV90cnVlID0+IHRydWUpLmltX3RydWU/KS50byBiZV90cnV0aHkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcHJldHR5IHByaW50IGJpbmFyeSBmaWVsZHMiIGRvCi0gICAgICBUZXN0VW5pb24ubmV3KDpiaW5hcnlfZmllbGQgPT4gIlwwMDFcMDAyXDAwMyIpLmluc3BlY3Quc2hvdWxkID09ICI8U3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uIGJpbmFyeV9maWVsZDogMDEwMjAzPiIKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24ubmV3KDpiaW5hcnlfZmllbGQgPT4gIlwwMDFcMDAyXDAwMyIpLmluc3BlY3QpLnRvIGVxKCI8U3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uIGJpbmFyeV9maWVsZDogMDEwMjAzPiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGJlIGNvbXBhcmFibGUiIGRvCkBAIC0xNzcsMTUgKzE5OSwxNSBAQAogICAgICAgICBbMSwgICAxLCAgMSwgIDBdXQogCiAgICAgICBvYmpzID0gWwotICAgICAgICBUZXN0VW5pb24ubmV3KDpzdHJpbmdfZmllbGQsICJibGFoIiksIAotICAgICAgICBUZXN0VW5pb24ubmV3KDpzdHJpbmdfZmllbGQsICJibGFoYmxhaCIpLAotICAgICAgICBUZXN0VW5pb24ubmV3KDppMzJfZmllbGQsIDEpLAotICAgICAgICBUZXN0VW5pb24ubmV3KCldCisgICAgICAgIFNwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbi5uZXcoOnN0cmluZ19maWVsZCwgImJsYWgiKSwKKyAgICAgICAgU3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uLm5ldyg6c3RyaW5nX2ZpZWxkLCAiYmxhaGJsYWgiKSwKKyAgICAgICAgU3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uLm5ldyg6aTMyX2ZpZWxkLCAxKSwKKyAgICAgICAgU3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uLm5ldygpXQogCiAgICAgICBmb3IgeSBpbiAwLi4zCiAgICAgICAgIGZvciB4IGluIDAuLjMKICAgICAgICAgICAjIHB1dHMgIiN7b2Jqc1t5XS5pbnNwZWN0fSA8PT4gI3tvYmpzW3hdLmluc3BlY3R9IHNob3VsZCA9PSAje3JlbGF0aW9uc2hpcHNbeV1beF19IgotICAgICAgICAgIChvYmpzW3ldIDw9PiBvYmpzW3hdKS5zaG91bGQgPT0gcmVsYXRpb25zaGlwc1t5XVt4XQorICAgICAgICAgIGV4cGVjdChvYmpzW3ldIDw9PiBvYmpzW3hdKS50byBlcShyZWxhdGlvbnNoaXBzW3ldW3hdKQogICAgICAgICBlbmQKICAgICAgIGVuZAogICAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvdW5peF9zb2NrZXRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3VuaXhfc29ja2V0X3NwZWMucmIKaW5kZXggZGYyMzlkNy4uODYyM2U5NSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvdW5peF9zb2NrZXRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy91bml4X3NvY2tldF9zcGVjLnJiCkBAIC0xNyw5MiArMTcsMTAwIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWNfaGVscGVyJwotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgIi9zb2NrZXRfc3BlY19zaGFyZWQiCityZXF1aXJlICdzcGVjX2hlbHBlcicKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aCgiI3tGaWxlLmRpcm5hbWUoX19GSUxFX18pfS9zb2NrZXRfc3BlY19zaGFyZWQiKQogCi1jbGFzcyBUaHJpZnRVTklYU29ja2V0U3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAorZGVzY3JpYmUgJ1VOSVhTb2NrZXQnIGRvCiAKLSAgZGVzY3JpYmUgVU5JWFNvY2tldCBkbworICBkZXNjcmliZSBUaHJpZnQ6OlVOSVhTb2NrZXQgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCiAgICAgICBAcGF0aCA9ICcvdG1wL3RocmlmdF9zcGVjX3NvY2tldCcKLSAgICAgIEBzb2NrZXQgPSBVTklYU29ja2V0Lm5ldyhAcGF0aCkKLSAgICAgIEBoYW5kbGUgPSBtb2NrKCJIYW5kbGUiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIEBoYW5kbGUuc3R1YiEoOmNsb3NlKQotICAgICAgOjpVTklYU29ja2V0LnN0dWIhKDpuZXcpLmFuZF9yZXR1cm4oQGhhbmRsZSkKKyAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlVOSVhTb2NrZXQubmV3KEBwYXRoKQorICAgICAgQGhhbmRsZSA9IGRvdWJsZSgiSGFuZGxlIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGFsbG93KDo6VU5JWFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKEBoYW5kbGUpCiAgICAgZW5kCiAKICAgICBpdF9zaG91bGRfYmVoYXZlX2xpa2UgImEgc29ja2V0IgogCiAgICAgaXQgInNob3VsZCByYWlzZSBhIFRyYW5zcG9ydEV4Y2VwdGlvbiB3aGVuIGl0IGNhbm5vdCBvcGVuIGEgc29ja2V0IiBkbwotICAgICAgOjpVTklYU29ja2V0LnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQotICAgICAgbGFtYmRhIHsgQHNvY2tldC5vcGVuIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiB9CisgICAgICBleHBlY3QoOjpVTklYU29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQorICAgICAgZXhwZWN0IHsgQHNvY2tldC5vcGVuIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTikgfQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhY2NlcHQgYW4gb3B0aW9uYWwgdGltZW91dCIgZG8KLSAgICAgIDo6VU5JWFNvY2tldC5zdHViISg6bmV3KQotICAgICAgVU5JWFNvY2tldC5uZXcoQHBhdGgsIDUpLnRpbWVvdXQuc2hvdWxkID09IDUKKyAgICAgIGFsbG93KDo6VU5JWFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KQorICAgICAgZXhwZWN0KFRocmlmdDo6VU5JWFNvY2tldC5uZXcoQHBhdGgsIDUpLnRpbWVvdXQpLnRvIGVxKDUpCisgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgYWxsb3coOjpVTklYU29ja2V0KS50byByZWNlaXZlKDpuZXcpCisgICAgICBleHBlY3QoVGhyaWZ0OjpVTklYU29ja2V0Lm5ldyhAcGF0aCkudG9fcykudG8gZXEoImRvbWFpbigje0BwYXRofSkiKQogICAgIGVuZAogICBlbmQKIAotICBkZXNjcmliZSBVTklYU2VydmVyU29ja2V0IGRvCisgIGRlc2NyaWJlIFRocmlmdDo6VU5JWFNlcnZlclNvY2tldCBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KICAgICAgIEBwYXRoID0gJy90bXAvdGhyaWZ0X3NwZWNfc29ja2V0JwotICAgICAgQHNvY2tldCA9IFVOSVhTZXJ2ZXJTb2NrZXQubmV3KEBwYXRoKQorICAgICAgQHNvY2tldCA9IFRocmlmdDo6VU5JWFNlcnZlclNvY2tldC5uZXcoQHBhdGgpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNyZWF0ZSBhIGhhbmRsZSB3aGVuIGNhbGxpbmcgbGlzdGVuIiBkbwotICAgICAgVU5JWFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKQorICAgICAgZXhwZWN0KFVOSVhTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChAcGF0aCkKICAgICAgIEBzb2NrZXQubGlzdGVuCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNyZWF0ZSBhIFRocmlmdDo6VU5JWFNvY2tldCB0byB3cmFwIGFjY2VwdGVkIHNvY2tldHMiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJVTklYU2VydmVyIikKLSAgICAgIFVOSVhTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChAcGF0aCkuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIlVOSVhTZXJ2ZXIiKQorICAgICAgZXhwZWN0KFVOSVhTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChAcGF0aCkuYW5kX3JldHVybihoYW5kbGUpCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgc29jayA9IG1vY2soInNvY2siKQotICAgICAgaGFuZGxlLnNob3VsZF9yZWNlaXZlKDphY2NlcHQpLmFuZF9yZXR1cm4oc29jaykKLSAgICAgIHRyYW5zID0gbW9jaygiVU5JWFNvY2tldCIpCi0gICAgICBVTklYU29ja2V0LnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4odHJhbnMpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6aGFuZGxlPSkud2l0aChzb2NrKQotICAgICAgQHNvY2tldC5hY2NlcHQuc2hvdWxkID09IHRyYW5zCisgICAgICBzb2NrID0gZG91YmxlKCJzb2NrIikKKyAgICAgIGV4cGVjdChoYW5kbGUpLnRvIHJlY2VpdmUoOmFjY2VwdCkuYW5kX3JldHVybihzb2NrKQorICAgICAgdHJhbnMgPSBkb3VibGUoIlVOSVhTb2NrZXQiKQorICAgICAgZXhwZWN0KFRocmlmdDo6VU5JWFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKHRyYW5zKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpoYW5kbGU9KS53aXRoKHNvY2spCisgICAgICBleHBlY3QoQHNvY2tldC5hY2NlcHQpLnRvIGVxKHRyYW5zKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjbG9zZSB0aGUgaGFuZGxlIHdoZW4gY2xvc2VkIiBkbwotICAgICAgaGFuZGxlID0gbW9jaygiVU5JWFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgVU5JWFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiVU5JWFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgZXhwZWN0KFVOSVhTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChAcGF0aCkuYW5kX3JldHVybihoYW5kbGUpCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgaGFuZGxlLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkKLSAgICAgIEZpbGUuc3R1YiEoOmRlbGV0ZSkKKyAgICAgIGV4cGVjdChoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQorICAgICAgYWxsb3coRmlsZSkudG8gcmVjZWl2ZSg6ZGVsZXRlKQogICAgICAgQHNvY2tldC5jbG9zZQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBkZWxldGUgdGhlIHNvY2tldCB3aGVuIGNsb3NlZCIgZG8KLSAgICAgIGhhbmRsZSA9IG1vY2soIlVOSVhTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIFVOSVhTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChAcGF0aCkuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIlVOSVhTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIGV4cGVjdChVTklYU2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgoQHBhdGgpLmFuZF9yZXR1cm4oaGFuZGxlKQogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIGhhbmRsZS5zdHViISg6Y2xvc2UpCi0gICAgICBGaWxlLnNob3VsZF9yZWNlaXZlKDpkZWxldGUpLndpdGgoQHBhdGgpCisgICAgICBhbGxvdyhoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQorICAgICAgZXhwZWN0KEZpbGUpLnRvIHJlY2VpdmUoOmRlbGV0ZSkud2l0aChAcGF0aCkKICAgICAgIEBzb2NrZXQuY2xvc2UKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIG5pbCB3aGVuIGFjY2VwdGluZyBpZiB0aGVyZSBpcyBubyBoYW5kbGUiIGRvCi0gICAgICBAc29ja2V0LmFjY2VwdC5zaG91bGQgYmVfbmlsCisgICAgICBleHBlY3QoQHNvY2tldC5hY2NlcHQpLnRvIGJlX25pbAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gdHJ1ZSBmb3IgY2xvc2VkPyB3aGVuIGFwcHJvcHJpYXRlIiBkbwotICAgICAgaGFuZGxlID0gbW9jaygiVU5JWFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgVU5JWFNlcnZlci5zdHViISg6bmV3KS5hbmRfcmV0dXJuKGhhbmRsZSkKLSAgICAgIEZpbGUuc3R1YiEoOmRlbGV0ZSkKKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiVU5JWFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgYWxsb3coVU5JWFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGFsbG93KEZpbGUpLnRvIHJlY2VpdmUoOmRlbGV0ZSkKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBAc29ja2V0LnNob3VsZF9ub3QgYmVfY2xvc2VkCi0gICAgICBoYW5kbGUuc3R1YiEoOmNsb3NlKQorICAgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9jbG9zZWQKKyAgICAgIGFsbG93KGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCiAgICAgICBAc29ja2V0LmNsb3NlCi0gICAgICBAc29ja2V0LnNob3VsZCBiZV9jbG9zZWQKKyAgICAgIGV4cGVjdChAc29ja2V0KS50byBiZV9jbG9zZWQKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBAc29ja2V0LnNob3VsZF9ub3QgYmVfY2xvc2VkCi0gICAgICBoYW5kbGUuc3R1YiEoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKLSAgICAgIEBzb2NrZXQuc2hvdWxkIGJlX2Nsb3NlZAorICAgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9jbG9zZWQKKyAgICAgIGFsbG93KGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQorICAgICAgZXhwZWN0KEBzb2NrZXQpLnRvIGJlX2Nsb3NlZAorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBzb2NrZXQudG9fcykudG8gZXEoImRvbWFpbigje0BwYXRofSkiKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3RocmlmdC5nZW1zcGVjIGIvbGliL3JiL3RocmlmdC5nZW1zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MzE5NGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvdGhyaWZ0LmdlbXNwZWMKQEAgLTAsMCArMSw0MCBAQAorIyAtKi0gZW5jb2Rpbmc6IHV0Zi04IC0qLQorJDoucHVzaCBGaWxlLmV4cGFuZF9wYXRoKCIuLi9saWIiLCBfX0ZJTEVfXykKKworR2VtOjpTcGVjaWZpY2F0aW9uLm5ldyBkbyB8c3wKKyAgcy5uYW1lICAgICAgICA9ICd0aHJpZnQnCisgIHMudmVyc2lvbiAgICAgPSAnMS4wLjAnCisgIHMuYXV0aG9ycyAgICAgPSBbJ0FwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyddCisgIHMuZW1haWwgICAgICAgPSBbJ2RldkB0aHJpZnQuYXBhY2hlLm9yZyddCisgIHMuaG9tZXBhZ2UgICAgPSAnaHR0cDovL3RocmlmdC5hcGFjaGUub3JnJworICBzLnN1bW1hcnkgICAgID0gJXF7UnVieSBiaW5kaW5ncyBmb3IgQXBhY2hlIFRocmlmdH0KKyAgcy5kZXNjcmlwdGlvbiA9ICVxe1J1YnkgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW19CisgIHMubGljZW5zZSAgICAgPSAnQXBhY2hlLTIuMCcKKyAgcy5leHRlbnNpb25zICA9IFsnZXh0L2V4dGNvbmYucmInXQorCisgIHMuaGFzX3Jkb2MgICAgICA9IHRydWUKKyAgcy5yZG9jX29wdGlvbnMgID0gJXdbLS1saW5lLW51bWJlcnMgLS1pbmxpbmUtc291cmNlIC0tdGl0bGUgVGhyaWZ0IC0tbWFpbiBSRUFETUVdCisKKyAgcy5ydWJ5Zm9yZ2VfcHJvamVjdCA9ICd0aHJpZnQnCisKKyAgZGlyID0gRmlsZS5leHBhbmRfcGF0aChGaWxlLmRpcm5hbWUoX19GSUxFX18pKQorCisgIHMuZmlsZXMgPSBEaXIuZ2xvYigie2xpYixzcGVjfS8qKi8qIikKKyAgcy50ZXN0X2ZpbGVzID0gRGlyLmdsb2IoInt0ZXN0LHNwZWMsYmVuY2htYXJrfS8qKi8qIikKKyAgcy5leGVjdXRhYmxlcyA9ICBEaXIuZ2xvYigie2Jpbn0vKiovKiIpCisKKyAgcy5leHRyYV9yZG9jX2ZpbGVzICA9ICV3W1JFQURNRS5tZF0gKyBEaXIuZ2xvYigie2V4dCxsaWJ9LyoqLyoue2MsaCxyYn0iKQorCisgIHMucmVxdWlyZV9wYXRocyA9ICV3W2xpYiBleHRdCisKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAnYnVuZGxlcicsICAgICAgICAgICAgJ34+IDEuMTEnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3ByeScsICAgICAgICAgICAgICAgICd+PiAwLjExLjMnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3ByeS1ieWVidWcnLCAgICAgICAgICd+PiAzLjYnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3ByeS1zdGFja19leHBsb3JlcicsICd+PiAwLjQuOS4yJworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdyYWNrJywgICAgICAgICAgICAgICAnfj4gMi4wJworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdyYWNrLXRlc3QnLCAgICAgICAgICAnfj4gMC44LjMnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3Jha2UnLCAgICAgICAgICAgICAgICd+PiAxMi4zJworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdyc3BlYycsICAgICAgICAgICAgICAnfj4gMy43JworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICd0aGluJywgICAgICAgICAgICAgICAnfj4gMS43JworZW5kCisKZGlmZiAtLWdpdCBhL2xpYi9ycy9DYXJnby50b21sIGIvbGliL3JzL0NhcmdvLnRvbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQzMjE3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9DYXJnby50b21sCkBAIC0wLDAgKzEsMTkgQEAKK1twYWNrYWdlXQorbmFtZSA9ICJ0aHJpZnQiCitkZXNjcmlwdGlvbiA9ICJSdXN0IGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtIgordmVyc2lvbiA9ICIxLjAuMCIKK2xpY2Vuc2UgPSAiQXBhY2hlLTIuMCIKK2F1dGhvcnMgPSBbIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiJdCitob21lcGFnZSA9ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciCitkb2N1bWVudGF0aW9uID0gImh0dHBzOi8vdGhyaWZ0LmFwYWNoZS5vcmciCityZWFkbWUgPSAiUkVBRE1FLm1kIgorZXhjbHVkZSA9IFsiTWFrZWZpbGUqIiwgInRlc3QvKioiLCAiKi5pbWwiXQora2V5d29yZHMgPSBbInRocmlmdCJdCisKK1tkZXBlbmRlbmNpZXNdCitieXRlb3JkZXIgPSAifjEuMi4xIgoraW50ZWdlci1lbmNvZGluZyA9ICJ+MS4wLjQiCitsb2cgPSAifjAuMy44IgordGhyZWFkcG9vbCA9ICJ+MS43LjEiCit0cnlfZnJvbSA9ICJ+MC4yLjIiCisKZGlmZiAtLWdpdCBhL2xpYi9ycy9NYWtlZmlsZS5hbSBiL2xpYi9ycy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTM0MTIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0gLgorCitpZiBXSVRIX1RFU1RTCitTVUJESVJTICs9IHRlc3QKK2VuZGlmCisKK2luc3RhbGw6CisJQGVjaG8gJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworCUBlY2hvICcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKKwlAZWNobyAnVGhlIFJ1c3QgY2xpZW50IGxpYnJhcnkgc2hvdWxkIGJlIGluc3RhbGxlZCB2aWEgYSBDYXJnby50b21sIGRlcGVuZGVuY3kgLSBwbGVhc2Ugc2VlIC9saWIvcnMvUkVBRE1FLm1kJworCUBlY2hvICcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKKwlAZWNobyAnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisKK2NoZWNrLWxvY2FsOgorCSQoQ0FSR08pIHRlc3QKKworYWxsLWxvY2FsOgorCSQoQ0FSR08pIGJ1aWxkCisKK2NsZWFuLWxvY2FsOgorCSQoQ0FSR08pIGNsZWFuCisJLSQoUk0pIENhcmdvLmxvY2sKKworRVhUUkFfRElTVCA9IFwKKwlzcmMgXAorCUNhcmdvLnRvbWwgXAorCVJFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL3JzL1JFQURNRS5tZCBiL2xpYi9ycy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MzN2ExMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9SRUFETUUubWQKQEAgLTAsMCArMSwxMTEgQEAKKyMgUnVzdCBUaHJpZnQgbGlicmFyeQorCisjIyBPdmVydmlldworCitUaGlzIGNyYXRlIGltcGxlbWVudHMgdGhlIGNvbXBvbmVudHMgcmVxdWlyZWQgdG8gYnVpbGQgYSB3b3JraW5nIFRocmlmdCBzZXJ2ZXIKK2FuZCBjbGllbnQuIEl0IGlzIGRpdmlkZWQgaW50byB0aGUgZm9sbG93aW5nIG1vZHVsZXM6CisKKyAxLiBlcnJvcnMKKyAyLiBwcm90b2NvbAorIDMuIHRyYW5zcG9ydAorIDQuIHNlcnZlcgorIDUuIGF1dG9nZW4KKworVGhlIG1vZHVsZXMgYXJlIGxheWVyZWQgYXMgc2hvd24uIFRoZSBgZ2VuZXJhdGVkYCBsYXllciBpcyBjb2RlIGdlbmVyYXRlZCBieSB0aGUKK1RocmlmdCBjb21waWxlcidzIFJ1c3QgcGx1Z2luLiBJdCB1c2VzIHRoZSBjb21wb25lbnRzIGRlZmluZWQgaW4gdGhpcyBjcmF0ZSB0bworc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSB0eXBlcyBhbmQgaW1wbGVtZW50IFJQQy4gVXNlcnMgaW50ZXJhY3Qgd2l0aCB0aGVzZQordHlwZXMgYW5kIHNlcnZpY2VzIGJ5IHdyaXRpbmcgdGhlaXIgb3duIGNvZGUgb24gdG9wLgorCisgYGBgdGV4dAorICstLS0tLS0tLS0tLSsKKyB8ICBhcHAgZGV2ICB8CisgKy0tLS0tLS0tLS0tKworIHwgZ2VuZXJhdGVkIHwgPC0+IGVycm9ycy9yZXN1bHRzCisgKy0tLS0tLS0tLS0tKworIHwgIHByb3RvY29sIHwKKyArLS0tLS0tLS0tLS0rCisgfCB0cmFuc3BvcnQgfAorICstLS0tLS0tLS0tLSsKKyBgYGAKKworIyMgVXNpbmcgdGhpcyBjcmF0ZQorCitBZGQgYHRocmlmdCA9ICJ4LnkueiJgIHRvIHlvdXIgYENhcmdvLnRvbWxgLCB3aGVyZSBgeC55LnpgIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZQorVGhyaWZ0IGNvbXBpbGVyIHlvdSdyZSB1c2luZy4KKworIyMgQVBJIERvY3VtZW50YXRpb24KKworRnVsbCBbUnVzdGRvY10oaHR0cHM6Ly9kb2NzLnJzL3RocmlmdC8pCisKKyMjIENvbXBhdGliaWxpdHkKKworVGhlIFJ1c3QgbGlicmFyeSBhbmQgYXV0by1nZW5lcmF0ZWQgY29kZSB0YXJnZXRzIFJ1c3QgdmVyc2lvbnMgMS4yOCsuCitJdCBkb2VzIG5vdCBjdXJyZW50bHkgdXNlIGFueSBSdXN0IDIwMTggZmVhdHVyZXMuCisKKyMjIyBCcmVha2luZyBDaGFuZ2VzCisKK0JyZWFraW5nIGNoYW5nZXMgYXJlIG1pbmltaXplZC4gV2hlbiB0aGV5IGFyZSBtYWRlIHRoZXkgd2lsbCBiZSBvdXRsaW5lZCBiZWxvdyB3aXRoIHRyYW5zaXRpb24gZ3VpZGVsaW5lcy4KKworIyMjIyMgVGhyaWZ0IDAuMTIuMAorCisqICoqW1RIUklGVC00NTI5XSoqIC0gUnVzdCBlbnVtIHZhcmlhbnRzIGFyZSBub3cgY2FtZWwtY2FzZWQgaW5zdGVhZCBvZiB1cHBlcmNhc2VkIHRvIGNvbmZvcm0gdG8gUnVzdCBuYW1pbmcgY29udmVudGlvbnMKKworICAgIFByZXZpb3VzbHksIGVudW0gdmFyaWFudHMgd2VyZSB1cHBlcmNhc2VkIGluIHRoZSBhdXRvLWdlbmVyYXRlZCBjb2RlLgorICAgIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHRocmlmdCBlbnVtOgorCisgICAgYGBgdGhyaWZ0CisgICAgLy8gVEhSSUZUCisgICAgZW51bSBPcGVyYXRpb24geworICAgICAgQURELAorICAgICAgU1VCVFJBQ1QsCisgICAgICBNVUxUSVBMWSwKKyAgICAgIERJVklERSwKKyAgICB9CisgICAgYGBgCisgICAgCisgICAgdXNlZCB0byBnZW5lcmF0ZToKKyAgICAKKyAgICBgYGBydXN0CisgICAgLy8gT0xEIEFVVE8tR0VORVJBVEVEIFJVU1QKKyAgICBwdWIgZW51bSBPcGVyYXRpb24geworICAgICAgIEFERCwKKyAgICAgICBTVUJUUkFDVCwKKyAgICAgICBNVUxUSVBMWSwKKyAgICAgICBESVZJREUsCisgICAgIH0KKyAgICBgYGAKKyAgICBJdCAqbm93KiBnZW5lcmF0ZXM6CisgICAgYGBgcnVzdAorICAgIC8vIE5FVyBBVVRPLUdFTkVSQVRFRCBSVVNUCisgICAgcHViIGVudW0gT3BlcmF0aW9uIHsKKyAgICAgICBBZGQsCisgICAgICAgU3VidHJhY3QsCisgICAgICAgTXVsdGlwbHksCisgICAgICAgRGl2aWRlLAorICAgICB9CisgICAgYGBgCisgICAgCisgICAgWW91IHdpbGwgaGF2ZSB0byBjaGFuZ2UgYWxsIGVudW0gdmFyaWFudHMgaW4geW91ciBjb2RlIHRvIHVzZSBjYW1lbC1jYXNlZCBuYW1lcy4KKyAgICBUaGlzIHNob3VsZCBiZSBhIHNlYXJjaCBhbmQgcmVwbGFjZS4KKworIyMgQ29udHJpYnV0aW5nCisKK0J1ZyByZXBvcnRzIGFuZCBQUnMgYXJlIGFsd2F5cyB3ZWxjb21lISBQbGVhc2Ugc2VlIHRoZQorW1RocmlmdCB3ZWJzaXRlXShodHRwczovL3RocmlmdC5hcGFjaGUub3JnLykgZm9yIG1vcmUgZGV0YWlscy4KKworVGhyaWZ0IFJ1c3Qgc3VwcG9ydCByZXF1aXJlcyBjb2RlIGluIHNldmVyYWwgZGlyZWN0b3JpZXM6CisKKyogYGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcnNfZ2VuZXJhdG9yLmNjYDogYmluZGluZyBjb2RlIGdlbmVyYXRvcgorKiBgbGliL3JzYDogcnVudGltZSBsaWJyYXJ5CisqIGBsaWIvcnMvdGVzdGA6IHN1cHBsZW1lbnRhbCB0ZXN0cworKiBgdHV0b3JpYWwvcnNgOiB0dXRvcmlhbCBjbGllbnQgYW5kIHNlcnZlcgorKiBgdGVzdC9yc2A6IGNyb3NzLWxhbmd1YWdlIHRlc3QgY2xpZW50IGFuZCBzZXJ2ZXIKKworQWxsIGxpYnJhcnkgY29kZSwgdGVzdCBjb2RlIGFuZCBhdXRvLWdlbmVyYXRlZCBjb2RlIGNvbXBpbGVzIGFuZCBwYXNzZXMgY2xpcHB5Cit3aXRob3V0IHdhcm5pbmdzLiBBbGwgbmV3IGNvZGUgbXVzdCBkbyB0aGUgc2FtZSEgV2hlbiBtYWtpbmcgY2hhbmdlcyBlbnN1cmUgdGhhdDoKKworKiBgcnVzdGNgIGRvZXMgZG9lcyBvdXRwdXQgYW55IHdhcm5pbmdzCisqIGBjbGlwcHlgIHdpdGggZGVmYXVsdCBzZXR0aW5ncyBkb2VzIG5vdCBvdXRwdXQgYW55IHdhcm5pbmdzIChpbmNsdWRlcyBhdXRvLWdlbmVyYXRlZCBjb2RlKQorKiBgY2FyZ28gdGVzdGAgaXMgc3VjY2Vzc2Z1bAorKiBgbWFrZSBwcmVjcm9zc2AgYW5kIGBtYWtlIGNoZWNrYCBhcmUgc3VjY2Vzc2Z1bAorKiBgdHV0b3JpYWwvYmluL3R1dG9yaWFsX2NsaWVudGAgYW5kIGB0dXRvcmlhbC9iaW4vdHV0b3JpYWxfc2VydmVyYCBjb21tdW5pY2F0ZQpkaWZmIC0tZ2l0IGEvbGliL3JzL1JFTEVBU0lORy5tZCBiL2xpYi9ycy9SRUxFQVNJTkcubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDczZDdhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9SRUxFQVNJTkcubWQKQEAgLTAsMCArMSw1NyBAQAorIyBQdWJsaXNoaW5nIHRoZSB0aHJpZnQgY3JhdGUKKworUHVibGlzaGluZyB0aGUgUnVzdCB0aHJpZnQgY3JhdGUgaXMgc3RyYWlnaHRmb3J3YXJkLCBhbmQgaW52b2x2ZXMgdHdvIG1ham9yIHN0ZXBzOgorCisxLiBTZXR0aW5nIHVwIHlvdXIgW2NyYXRlcy5pb10oaHR0cHM6Ly93d3cuY3JhdGVzLmlvKSBhY2NvdW50IF8ob25lLXRpbWUpXworCisyLiBQYWNrYWdpbmcvcHVibGlzaGluZyB0aGUgUnVzdCB0aHJpZnQgY3JhdGUgaXRzZWxmCisKKyMjIFNldCB1cCB5b3VyIGNyYXRlcy5pbyBhY2NvdW50IChvbmUtdGltZSkKKworMS4gR28gdG8gW2NyYXRlcy5pb10oaHR0cHM6Ly93d3cuY3JhdGVzLmlvKSBhbmQgY2xpY2sgdGhlIGBMb2cgSW5gIGJ1dHRvbiBhdCB0aGUgdG9wIHJpZ2h0LgorCisgICBMb2cgaW4gKiphcyB0aGUgR2l0aHViIHVzZXIgd2l0aCB3cml0ZSBwZXJtaXNzaW9ucyB0byB0aGUgdGhyaWZ0IHJlcG8hKioKKworMi4gQ2xpY2sgeW91ciB1c2VyIGljb24gYnV0dG9uIGF0IHRoZSB0b3AgcmlnaHQgYW5kIHNlbGVjdCBgQWNjb3VudCBTZXR0aW5nc2AuCisKKzMuIENsaWNrIGBOZXcgVG9rZW5gIG5leHQgdG8gYEFQSSBBY2Nlc3NgLgorCisgICBUaGlzIGdlbmVyYXRlcyBhIG5ldyBBUEkga2V5IHRoYXQgY2FyZ28gdXNlcyB0byBwdWJsaXNoIHBhY2thZ2VzIHRvIGNyYXRlcy5pby4KKyAgIFN0b3JlIHRoaXMgQVBJIGtleSBzb21ld2hlcmUgc2FmZS4gSWYgeW91IHdpbGwgb25seSB1c2UgdGhpcyBHaXRodWIgYWNjb3VudCB0bworICAgcHVibGlzaCBjcmF0ZXMgdG8gY3JhdGVzLmlvIHlvdSBjYW4gZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgdG8gc2F2ZSB0aGUKKyAgIGdlbmVyYXRlZCBrZXkgdG8gYH4vLmNhcmdvL2NyZWRlbnRpYWxzYC4KKworIyMgUGFja2FnZSBhbmQgUHVibGlzaAorCitZb3UgY2FuIHVzZSB0aGUgYXV0b21hdGVkIHNjcmlwdCBvciBydW4gdGhlIHJlbGVhc2Ugc3RlcHMgbWFudWFsbHkuCisKKyoqSW1wb3J0YW50Kio6IGBjYXJnb2AgZXhwZWN0cyB0aGF0IHZlcnNpb24gbnVtYmVycyBmb2xsb3cgdGhlIHNlbWFudGljIHZlcnNpb25pbmcgZm9ybWF0LgorVGhpcyBtZWFucyB0aGF0IGBUSFJJRlRfUkVMRUFTRV9WRVJTSU9OYCBtdXN0IGhhdmUgYSBtYWpvciwgbWlub3IgYW5kIHBhdGNoIG51bWJlciwgaS5lLiwgbXVzdAorYmUgaW4gdGhlIGZvcm0gYCMuIyMuIyNgLgorCisjIyMjIEF1dG9tYXRlZAorCitSdW4gYC4vcmVsZWFzZS5zaCBbVEhSSUZUX1JFTEVBU0VfVkVSU0lPTl1gLgorCitfUmVxdWlyZXMgeW91IHRvIGhhdmUgc3RvcmVkIHlvdXIgY3JlZGVudGlhbHMgaW4gYH4vLmNhcmdvL2NyZWRlbnRpYWxzYC5fCisKKyMjIyMgTWFudWFsCisKKzEuIEVkaXQgYENhcmdvLnRvbWxgIGFuZCB1cGRhdGUgdGhlIGB2ZXJzaW9uID0gMS4wYCBrZXkgdG8gYHZlcnNpb24gPSBbVEhSSUZUX1JFTEVBU0VfVkVSU0lPTl1gCisKKzIuIGBnaXQgYWRkIENhcmdvLnRvbWxgCisKKzMuIGBnaXQgY29tbWl0IC1tICJVcGRhdGUgdGhyaWZ0IGNyYXRlIHZlcnNpb24gdG8gW1RIUklGVF9SRUxFQVNFX1ZFUlNJT05dIiAtbSAiQ2xpZW50OiBycyJgCisKKzQuIGBjYXJnbyBsb2dpbmAKKworICAgIF8obm90IHJlcXVpcmVkIGlmIHlvdSBoYXZlIHN0b3JlZCB5b3VyIGNyZWRlbnRpYWxzIGluIGB+Ly5jYXJnby9jcmVkZW50aWFsc2ApXworCis1LiBgY2FyZ28gY2xlYW5gCisKKzYuIGBjYXJnbyBwYWNrYWdlYAorCisgICBUaGlzIHN0ZXAgZmFpbHMgaWYgdGhlcmUgYXJlIGFueSB1bmNvbW1pdHRlZCBvciBpZ25vcmVkIGZpbGVzLiBEbyAqKm5vdCoqIHVzZSB0aGUgYC0tYWxsb3ctZGlydHlgCisgICBmbGFnISBJbnN0ZWFkLCBhZGQgdGhlIGhpZ2hsaWdodGVkIGZpbGVzIGFzIGVudHJpZXMgaW4gdGhlIGBDYXJnby50b21sYCBgZXhjbHVkZWAga2V5LgorCis3LiBgY2FyZ28gcHVibGlzaGAKZGlmZiAtLWdpdCBhL2xpYi9ycy9yZWxlYXNlLnNoIGIvbGliL3JzL3JlbGVhc2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzRlNWI0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9yZWxlYXNlLnNoCkBAIC0wLDAgKzEsMjYgQEAKKyMhL2Jpbi9iYXNoCisKK3NldCAtbyBlcnJleGl0CitzZXQgLW8gcGlwZWZhaWwKK3NldCAtbyBub3Vuc2V0CisKK2lmICEgW1sgJCMgLWVxIDEgJiYgJDEgPX4gXlswLTldKFwuWzAtOV1bMC05XSopezJ9JCBdXTsgdGhlbgorICAgICg+JjIgZWNobyAiVXNhZ2U6IC4vcHVibGlzaC1jcmF0ZS5zaCBbVEhSSUZUX1JFTEVBU0VfVkVSU0lPTl0gIikKKyAgICAoPiYyIGVjaG8gIiAgICAgICBUSFJJRlRfUkVMRUFTRV9WRVJTSU9OIGlzIGluIHNlbWFudGljIHZlcnNpb25pbmcgZm9ybWF0LCBpLmUuICMuIyMuIyMiKQorICAgIGV4aXQgMQorZmkKKworVEhSSUZUX1JFTEVBU0VfVkVSU0lPTj0kezE6LX0KKworZWNobyAiVXBkYXRpbmcgQ2FyZ28udG9tbCB0byAke1RIUklGVF9SRUxFQVNFX1ZFUlNJT059Igorc2VkIC1pLm9sZCAtZSAicy9edmVyc2lvbiA9IC4qJC92ZXJzaW9uID0gXCIke1RIUklGVF9SRUxFQVNFX1ZFUlNJT059XCIvZyIgQ2FyZ28udG9tbAorcm0gQ2FyZ28udG9tbC5vbGQKKworZWNobyAiQ29tbWl0dGluZyB1cGRhdGVkIENhcmdvLnRvbWwiCitnaXQgYWRkIENhcmdvLnRvbWwKK2dpdCBjb21taXQgLW0gIlVwZGF0ZSB0aHJpZnQgY3JhdGUgdmVyc2lvbiB0byAke1RIUklGVF9SRUxFQVNFX1ZFUlNJT059IiAtbSAiQ2xpZW50OiBycyIKKworZWNobyAiUGFja2FnaW5nIGFuZCByZWxlYXNpbmcgcnVzdCB0aHJpZnQgY3JhdGUgd2l0aCB2ZXJzaW9uICR7VEhSSUZUX1JFTEVBU0VfVkVSU0lPTn0iCitjYXJnbyBjbGVhbgorY2FyZ28gcGFja2FnZQorY2FyZ28gcHVibGlzaApkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9hdXRvZ2VuLnJzIGIvbGliL3JzL3NyYy9hdXRvZ2VuLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZDQwODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL2F1dG9nZW4ucnMKQEAgLTAsMCArMSw0NSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyEgVGhyaWZ0IGNvbXBpbGVyIGF1dG8tZ2VuZXJhdGVkIHN1cHBvcnQuCisvLyEKKy8vIQorLy8hIFR5cGVzIGFuZCBmdW5jdGlvbnMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIncyBSdXN0IHBsdWdpbgorLy8hIHRvIGltcGxlbWVudCByZXF1aXJlZCBmdW5jdGlvbmFsaXR5LiBVc2VycyBzaG91bGQgbmV2ZXIgaGF2ZSB0byB1c2UgY29kZQorLy8hIGluIHRoaXMgbW9kdWxlIGRpcmVjdGx5LgorCit1c2UgcHJvdG9jb2w6OntUSW5wdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sfTsKKworLy8vIFNwZWNpZmllcyB0aGUgbWluaW11bSBmdW5jdGlvbmFsaXR5IGFuIGF1dG8tZ2VuZXJhdGVkIGNsaWVudCBzaG91bGQgcHJvdmlkZQorLy8vIHRvIGNvbW11bmljYXRlIHdpdGggYSBUaHJpZnQgc2VydmVyLgorcHViIHRyYWl0IFRUaHJpZnRDbGllbnQgeworICAgIC8vLyBSZXR1cm5zIHRoZSBpbnB1dCBwcm90b2NvbCB1c2VkIHRvIHJlYWQgc2VyaWFsaXplZCBUaHJpZnQgbWVzc2FnZXMKKyAgICAvLy8gZnJvbSB0aGUgVGhyaWZ0IHNlcnZlci4KKyAgICBmbiBpX3Byb3RfbXV0KCZtdXQgc2VsZikgLT4gJm11dCBUSW5wdXRQcm90b2NvbDsKKyAgICAvLy8gUmV0dXJucyB0aGUgb3V0cHV0IHByb3RvY29sIHVzZWQgdG8gd3JpdGUgc2VyaWFsaXplZCBUaHJpZnQgbWVzc2FnZXMKKyAgICAvLy8gdG8gdGhlIFRocmlmdCBzZXJ2ZXIuCisgICAgZm4gb19wcm90X211dCgmbXV0IHNlbGYpIC0+ICZtdXQgVE91dHB1dFByb3RvY29sOworICAgIC8vLyBSZXR1cm5zIHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGxhc3QgbWVzc2FnZSB3cml0dGVuIHRvIHRoZSBUaHJpZnQKKyAgICAvLy8gc2VydmVyLiBSZXR1cm5zIGAwYCBpZiBubyBtZXNzYWdlcyBoYXZlIGJlZW4gd3JpdHRlbi4gU2VxdWVuY2UKKyAgICAvLy8gbnVtYmVycyBzaG91bGQgKm5ldmVyKiBiZSBuZWdhdGl2ZSwgYW5kIHRoaXMgbWV0aG9kIHJldHVybnMgYW4gYGkzMmAKKyAgICAvLy8gc2ltcGx5IGJlY2F1c2UgdGhlIFRocmlmdCBwcm90b2NvbCBlbmNvZGVzIHNlcXVlbmNlIG51bWJlcnMgYXMgYGkzMmAgb24KKyAgICAvLy8gdGhlIHdpcmUuCisgICAgZm4gc2VxdWVuY2VfbnVtYmVyKCZzZWxmKSAtPiBpMzI7IC8vIEZJWE1FOiBjb25zaWRlciByZXR1cm5pbmcgYSB1MzIKKyAgICAvLy8gSW5jcmVtZW50cyB0aGUgc2VxdWVuY2UgbnVtYmVyLCBpbmRpY2F0aW5nIHRoYXQgYSBtZXNzYWdlIHdpdGggdGhhdAorICAgIC8vLyBudW1iZXIgaGFzIGJlZW4gc2VudCB0byB0aGUgVGhyaWZ0IHNlcnZlci4KKyAgICBmbiBpbmNyZW1lbnRfc2VxdWVuY2VfbnVtYmVyKCZtdXQgc2VsZikgLT4gaTMyOworfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9lcnJvcnMucnMgYi9saWIvcnMvc3JjL2Vycm9ycy5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmEyNTc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9lcnJvcnMucnMKQEAgLTAsMCArMSw2NzAgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIHN0ZDo6Y29udmVydDo6e0Zyb20sIEludG99OwordXNlIHN0ZDo6ZXJyb3I6OkVycm9yIGFzIFN0ZEVycm9yOwordXNlIHN0ZDo6Zm10Ojp7RGVidWcsIERpc3BsYXksIEZvcm1hdHRlcn07Cit1c2Ugc3RkOjp7ZXJyb3IsIGZtdCwgaW8sIHN0cmluZ307Cit1c2UgdHJ5X2Zyb206OlRyeUZyb207CisKK3VzZSBwcm90b2NvbDo6e1RGaWVsZElkZW50aWZpZXIsIFRJbnB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2wsIFRTdHJ1Y3RJZGVudGlmaWVyLCBUVHlwZX07CisKKy8vIEZJWE1FOiBzaG91bGQgYWxsIG15IGVycm9yIHN0cnVjdHMgaW1wbCBlcnJvcjo6RXJyb3IgYXMgd2VsbD8KKy8vIEZJWE1FOiBzaG91bGQgYWxsIGZpZWxkcyBpbiBUcmFuc3BvcnRFcnJvciwgUHJvdG9jb2xFcnJvciBhbmQgQXBwbGljYXRpb25FcnJvciBiZSBvcHRpb25hbD8KKworLy8vIEVycm9yIHR5cGUgcmV0dXJuZWQgYnkgYWxsIHJ1bnRpbWUgbGlicmFyeSBmdW5jdGlvbnMuCisvLy8KKy8vLyBgdGhyaWZ0OjpFcnJvcmAgaXMgdXNlZCB0aHJvdWdob3V0IHRoaXMgY3JhdGUgYXMgd2VsbCBhcyBpbiBhdXRvLWdlbmVyYXRlZAorLy8vIFJ1c3QgY29kZS4gSXQgY29uc2lzdHMgb2YgZm91ciB2YXJpYW50cyBkZWZpbmVkIGJ5IGNvbnZlbnRpb24gYWNyb3NzIFRocmlmdAorLy8vIGltcGxlbWVudGF0aW9uczoKKy8vLworLy8vIDEuIGBUcmFuc3BvcnRgOiBlcnJvcnMgZW5jb3VudGVyZWQgd2hpbGUgb3BlcmF0aW5nIG9uIEkvTyBjaGFubmVscworLy8vIDIuIGBQcm90b2NvbGA6IGVycm9ycyBlbmNvdW50ZXJlZCBkdXJpbmcgcnVudGltZS1saWJyYXJ5IHByb2Nlc3NpbmcKKy8vLyAzLiBgQXBwbGljYXRpb25gOiBlcnJvcnMgZW5jb3VudGVyZWQgd2l0aGluIGF1dG8tZ2VuZXJhdGVkIGNvZGUKKy8vLyA0LiBgVXNlcmA6IElETC1kZWZpbmVkIGV4Y2VwdGlvbiBzdHJ1Y3RzCisvLy8KKy8vLyBUaGUgYEFwcGxpY2F0aW9uYCB2YXJpYW50IGFsc28gZnVuY3Rpb25zIGFzIGEgY2F0Y2gtYWxsOiBhbGwgaGFuZGxlciBlcnJvcnMKKy8vLyBhcmUgYXV0b21hdGljYWxseSB0dXJuZWQgaW50byBhcHBsaWNhdGlvbiBlcnJvcnMuCisvLy8KKy8vLyBBbGwgZXJyb3IgdmFyaWFudHMgZXhjZXB0IGBFcnJvcjo6VXNlcmAgdGFrZSBhbiBlcG9ueW1vdXMgc3RydWN0IHdpdGggdHdvCisvLy8gcmVxdWlyZWQgZmllbGRzOgorLy8vCisvLy8gMS4gYGtpbmRgOiB2YXJpYW50LXNwZWNpZmljIGVudW0gaWRlbnRpZnlpbmcgdGhlIGVycm9yIHN1Yi10eXBlCisvLy8gMi4gYG1lc3NhZ2VgOiBodW1hbi1yZWFkYWJsZSBlcnJvciBpbmZvIHN0cmluZworLy8vCisvLy8gYGtpbmRgIGlzIGRlZmluZWQgYnkgY29udmVudGlvbiB3aGlsZSBgbWVzc2FnZWAgaXMgZnJlZWZvcm0uIElmIG5vbmUgb2YgdGhlCisvLy8gZW51bWVyYXRlZCBraW5kcyBhcmUgc3VpdGFibGUgdXNlIGBVbmtub3duYC4KKy8vLworLy8vIFRvIHNpbXBsaWZ5IGVycm9yIGNyZWF0aW9uIGNvbnZlbmllbmNlIGNvbnN0cnVjdG9ycyBhcmUgZGVmaW5lZCBmb3IgYWxsCisvLy8gdmFyaWFudHMsIGFuZCBjb252ZXJzaW9ucyBmcm9tIHRoZWlyIHN0cnVjdHMgKGB0aHJpZnQ6OlRyYW5zcG9ydEVycm9yYCwKKy8vLyBgdGhyaWZ0OjpQcm90b2NvbEVycm9yYCBhbmQgYHRocmlmdDo6QXBwbGljYXRpb25FcnJvcmAgaW50byBgdGhyaWZ0OjpFcnJvcmAuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYSBgVHJhbnNwb3J0RXJyb3JgLgorLy8vCisvLy8gYGBgCisvLy8gdXNlIHRocmlmdDsKKy8vLyB1c2UgdGhyaWZ0Ojp7VHJhbnNwb3J0RXJyb3IsIFRyYW5zcG9ydEVycm9yS2luZH07CisvLy8KKy8vLyAvLyBleHBsaWNpdAorLy8vIGxldCBlcnIwOiB0aHJpZnQ6OlJlc3VsdDwoKT4gPSBFcnIoCisvLy8gICB0aHJpZnQ6OkVycm9yOjpUcmFuc3BvcnQoCisvLy8gICAgIFRyYW5zcG9ydEVycm9yIHsKKy8vLyAgICAgICBraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQ6OlRpbWVkT3V0LAorLy8vICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNvbm5lY3Rpb24gdG8gc2VydmVyIHRpbWVkIG91dCIpCisvLy8gICAgIH0KKy8vLyAgICkKKy8vLyApOworLy8vCisvLy8gLy8gdXNlIGNvbnZlcnNpb24KKy8vLyBsZXQgZXJyMTogdGhyaWZ0OjpSZXN1bHQ8KCk+ID0gRXJyKAorLy8vICAgdGhyaWZ0OjpFcnJvcjo6ZnJvbSgKKy8vLyAgICAgVHJhbnNwb3J0RXJyb3IgeworLy8vICAgICAgIGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZDo6VGltZWRPdXQsCisvLy8gICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY29ubmVjdGlvbiB0byBzZXJ2ZXIgdGltZWQgb3V0IikKKy8vLyAgICAgfQorLy8vICAgKQorLy8vICk7CisvLy8KKy8vLyAvLyB1c2Ugc3RydWN0IGNvbnN0cnVjdG9yCisvLy8gbGV0IGVycjI6IHRocmlmdDo6UmVzdWx0PCgpPiA9IEVycigKKy8vLyAgIHRocmlmdDo6RXJyb3I6OlRyYW5zcG9ydCgKKy8vLyAgICAgVHJhbnNwb3J0RXJyb3I6Om5ldygKKy8vLyAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OlRpbWVkT3V0LAorLy8vICAgICAgICJjb25uZWN0aW9uIHRvIHNlcnZlciB0aW1lZCBvdXQiCisvLy8gICAgICkKKy8vLyAgICkKKy8vLyApOworLy8vCisvLy8KKy8vLyAvLyB1c2UgZXJyb3IgdmFyaWFudCBjb25zdHJ1Y3RvcgorLy8vIGxldCBlcnIzOiB0aHJpZnQ6OlJlc3VsdDwoKT4gPSBFcnIoCisvLy8gICB0aHJpZnQ6Om5ld190cmFuc3BvcnRfZXJyb3IoCisvLy8gICAgIFRyYW5zcG9ydEVycm9yS2luZDo6VGltZWRPdXQsCisvLy8gICAgICJjb25uZWN0aW9uIHRvIHNlcnZlciB0aW1lZCBvdXQiCisvLy8gICApCisvLy8gKTsKKy8vLyBgYGAKKy8vLworLy8vIENyZWF0ZSBhbiBlcnJvciBmcm9tIGEgc3RyaW5nLgorLy8vCisvLy8gYGBgCisvLy8gdXNlIHRocmlmdDsKKy8vLyB1c2UgdGhyaWZ0Ojp7QXBwbGljYXRpb25FcnJvciwgQXBwbGljYXRpb25FcnJvcktpbmR9OworLy8vCisvLy8gLy8gd2UganVzdCB1c2UgYEZyb206OmZyb21gIHRvIGNvbnZlcnQgYSBgU3RyaW5nYCBpbnRvIGEgYHRocmlmdDo6RXJyb3JgCisvLy8gbGV0IGVycjA6IHRocmlmdDo6UmVzdWx0PCgpPiA9IEVycigKKy8vLyAgIHRocmlmdDo6RXJyb3I6OmZyb20oIlRoaXMgaXMgYW4gZXJyb3IiKQorLy8vICk7CisvLy8KKy8vLyAvLyBlcnIwIGlzIGVxdWl2YWxlbnQgdG8uLi4KKy8vLyBsZXQgZXJyMTogdGhyaWZ0OjpSZXN1bHQ8KCk+ID0gRXJyKAorLy8vICAgdGhyaWZ0OjpFcnJvcjo6QXBwbGljYXRpb24oCisvLy8gICAgIEFwcGxpY2F0aW9uRXJyb3IgeworLy8vICAgICAgIGtpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duLAorLy8vICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoIlRoaXMgaXMgYW4gZXJyb3IiKQorLy8vICAgICB9CisvLy8gICApCisvLy8gKTsKKy8vLyBgYGAKKy8vLworLy8vIFJldHVybiBhbiBJREwtZGVmaW5lZCBleGNlcHRpb24uCisvLy8KKy8vLyBgYGB0ZXh0CisvLy8gLy8gVGhyaWZ0IElETCBleGNlcHRpb24gZGVmaW5pdGlvbi4KKy8vLyBleGNlcHRpb24gWGNlcHRpb24geworLy8vICAgMTogaTMyIGVycm9yQ29kZSwKKy8vLyAgIDI6IHN0cmluZyBtZXNzYWdlCisvLy8gfQorLy8vIGBgYAorLy8vCisvLy8gYGBgCisvLy8gdXNlIHN0ZDo6Y29udmVydDo6RnJvbTsKKy8vLyB1c2Ugc3RkOjplcnJvcjo6RXJyb3I7CisvLy8gdXNlIHN0ZDo6Zm10OworLy8vIHVzZSBzdGQ6OmZtdDo6e0Rpc3BsYXksIEZvcm1hdHRlcn07CisvLy8KKy8vLyAvLyBhdXRvLWdlbmVyYXRlZCBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyCisvLy8gI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgT3JkLCBQYXJ0aWFsRXEsIFBhcnRpYWxPcmQpXQorLy8vIHB1YiBzdHJ1Y3QgWGNlcHRpb24geworLy8vICAgcHViIGVycm9yX2NvZGU6IE9wdGlvbjxpMzI+LAorLy8vICAgcHViIG1lc3NhZ2U6IE9wdGlvbjxTdHJpbmc+LAorLy8vIH0KKy8vLworLy8vIC8vIGF1dG8tZ2VuZXJhdGVkIGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIKKy8vLyBpbXBsIEVycm9yIGZvciBYY2VwdGlvbiB7CisvLy8gICBmbiBkZXNjcmlwdGlvbigmc2VsZikgLT4gJnN0ciB7CisvLy8gICAgICJyZW1vdGUgc2VydmljZSB0aHJldyBYY2VwdGlvbiIKKy8vLyAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBhdXRvLWdlbmVyYXRlZCBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyCisvLy8gaW1wbCBGcm9tPFhjZXB0aW9uPiBmb3IgdGhyaWZ0OjpFcnJvciB7CisvLy8gICBmbiBmcm9tKGU6IFhjZXB0aW9uKSAtPiBTZWxmIHsKKy8vLyAgICAgdGhyaWZ0OjpFcnJvcjo6VXNlcihCb3g6Om5ldyhlKSkKKy8vLyAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBhdXRvLWdlbmVyYXRlZCBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyCisvLy8gaW1wbCBEaXNwbGF5IGZvciBYY2VwdGlvbiB7CisvLy8gICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisvLy8gICAgIHNlbGYuZGVzY3JpcHRpb24oKS5mbXQoZikKKy8vLyAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBpbiB1c2VyIGNvZGUuLi4KKy8vLyBsZXQgZXJyOiB0aHJpZnQ6OlJlc3VsdDwoKT4gPSBFcnIoCisvLy8gICB0aHJpZnQ6OkVycm9yOjpmcm9tKFhjZXB0aW9uIHsgZXJyb3JfY29kZTogU29tZSgxKSwgbWVzc2FnZTogTm9uZSB9KQorLy8vICk7CisvLy8gYGBgCitwdWIgZW51bSBFcnJvciB7CisgICAgLy8vIEVycm9ycyBlbmNvdW50ZXJlZCB3aGlsZSBvcGVyYXRpbmcgb24gSS9PIGNoYW5uZWxzLgorICAgIC8vLworICAgIC8vLyBUaGVzZSBpbmNsdWRlICpjb25uZWN0aW9uIGNsb3NlZCogYW5kICpiaW5kIGZhaWx1cmUqLgorICAgIFRyYW5zcG9ydChUcmFuc3BvcnRFcnJvciksCisgICAgLy8vIEVycm9ycyBlbmNvdW50ZXJlZCBkdXJpbmcgcnVudGltZS1saWJyYXJ5IHByb2Nlc3NpbmcuCisgICAgLy8vCisgICAgLy8vIFRoZXNlIGluY2x1ZGUgKm1lc3NhZ2UgdG9vIGxhcmdlKiBhbmQgKnVuc3VwcG9ydGVkIHByb3RvY29sIHZlcnNpb24qLgorICAgIFByb3RvY29sKFByb3RvY29sRXJyb3IpLAorICAgIC8vLyBFcnJvcnMgZW5jb3VudGVyZWQgd2l0aGluIGF1dG8tZ2VuZXJhdGVkIGNvZGUsIG9yIHdoZW4gaW5jb21pbmcKKyAgICAvLy8gb3Igb3V0Z29pbmcgbWVzc2FnZXMgdmlvbGF0ZSB0aGUgVGhyaWZ0IHNwZWMuCisgICAgLy8vCisgICAgLy8vIFRoZXNlIGluY2x1ZGUgKm91dC1vZi1vcmRlciBtZXNzYWdlcyogYW5kICptaXNzaW5nIHJlcXVpcmVkIHN0cnVjdAorICAgIC8vLyBmaWVsZHMqLgorICAgIC8vLworICAgIC8vLyBUaGlzIHZhcmlhbnQgYWxzbyBmdW5jdGlvbnMgYXMgYSBjYXRjaC1hbGw6IGVycm9ycyBmcm9tIGhhbmRsZXIKKyAgICAvLy8gZnVuY3Rpb25zIGFyZSBhdXRvbWF0aWNhbGx5IHJldHVybmVkIGFzIGFuIGBBcHBsaWNhdGlvbkVycm9yYC4KKyAgICBBcHBsaWNhdGlvbihBcHBsaWNhdGlvbkVycm9yKSwKKyAgICAvLy8gSURMLWRlZmluZWQgZXhjZXB0aW9uIHN0cnVjdHMuCisgICAgVXNlcihCb3g8ZXJyb3I6OkVycm9yICsgU3luYyArIFNlbmQ+KSwKK30KKworaW1wbCBFcnJvciB7CisgICAgLy8vIENyZWF0ZSBhbiBgQXBwbGljYXRpb25FcnJvcmAgZnJvbSBpdHMgd2lyZSByZXByZXNlbnRhdGlvbi4KKyAgICAvLy8KKyAgICAvLy8gQXBwbGljYXRpb24gY29kZSAqKnNob3VsZCBuZXZlcioqIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuCisgICAgcHViIGZuIHJlYWRfYXBwbGljYXRpb25fZXJyb3JfZnJvbV9pbl9wcm90b2NvbCgKKyAgICAgICAgaTogJm11dCBUSW5wdXRQcm90b2NvbCwKKyAgICApIC0+IDo6UmVzdWx0PEFwcGxpY2F0aW9uRXJyb3I+IHsKKyAgICAgICAgbGV0IG11dCBtZXNzYWdlID0gImdlbmVyYWwgcmVtb3RlIGVycm9yIi50b19vd25lZCgpOworICAgICAgICBsZXQgbXV0IGtpbmQgPSBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93bjsKKworICAgICAgICBpLnJlYWRfc3RydWN0X2JlZ2luKCk/OworCisgICAgICAgIGxvb3AgeworICAgICAgICAgICAgbGV0IGZpZWxkX2lkZW50ID0gaS5yZWFkX2ZpZWxkX2JlZ2luKCk/OworCisgICAgICAgICAgICBpZiBmaWVsZF9pZGVudC5maWVsZF90eXBlID09IFRUeXBlOjpTdG9wIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGV0IGlkID0gZmllbGRfaWRlbnQKKyAgICAgICAgICAgICAgICAuaWQKKyAgICAgICAgICAgICAgICAuZXhwZWN0KCJzZW5kZXIgc2hvdWxkIGFsd2F5cyBzcGVjaWZ5IGlkIGZvciBub24tU1RPUCBmaWVsZCIpOworCisgICAgICAgICAgICBtYXRjaCBpZCB7CisgICAgICAgICAgICAgICAgMSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxldCByZW1vdGVfbWVzc2FnZSA9IGkucmVhZF9zdHJpbmcoKT87CisgICAgICAgICAgICAgICAgICAgIGkucmVhZF9maWVsZF9lbmQoKT87CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSByZW1vdGVfbWVzc2FnZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgMiA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxldCByZW1vdGVfdHlwZV9hc19pbnQgPSBpLnJlYWRfaTMyKCk/OworICAgICAgICAgICAgICAgICAgICBsZXQgcmVtb3RlX2tpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kID0gVHJ5RnJvbTo6dHJ5X2Zyb20ocmVtb3RlX3R5cGVfYXNfaW50KQorICAgICAgICAgICAgICAgICAgICAgICAgLnVud3JhcF9vcihBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93bik7CisgICAgICAgICAgICAgICAgICAgIGkucmVhZF9maWVsZF9lbmQoKT87CisgICAgICAgICAgICAgICAgICAgIGtpbmQgPSByZW1vdGVfa2luZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgXyA9PiB7CisgICAgICAgICAgICAgICAgICAgIGkuc2tpcChmaWVsZF9pZGVudC5maWVsZF90eXBlKT87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaS5yZWFkX3N0cnVjdF9lbmQoKT87CisKKyAgICAgICAgT2soQXBwbGljYXRpb25FcnJvciB7CisgICAgICAgICAgICBraW5kOiBraW5kLAorICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSwKKyAgICAgICAgfSkKKyAgICB9CisKKyAgICAvLy8gQ29udmVydCBhbiBgQXBwbGljYXRpb25FcnJvcmAgaW50byBpdHMgd2lyZSByZXByZXNlbnRhdGlvbiBhbmQgd3JpdGUKKyAgICAvLy8gaXQgdG8gdGhlIHJlbW90ZS4KKyAgICAvLy8KKyAgICAvLy8gQXBwbGljYXRpb24gY29kZSAqKnNob3VsZCBuZXZlcioqIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuCisgICAgcHViIGZuIHdyaXRlX2FwcGxpY2F0aW9uX2Vycm9yX3RvX291dF9wcm90b2NvbCgKKyAgICAgICAgZTogJkFwcGxpY2F0aW9uRXJyb3IsCisgICAgICAgIG86ICZtdXQgVE91dHB1dFByb3RvY29sLAorICAgICkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgby53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIG5hbWU6ICJUQXBwbGljYXRpb25FeGNlcHRpb24iLnRvX293bmVkKCksCisgICAgICAgIH0pPzsKKworICAgICAgICBsZXQgbWVzc2FnZV9maWVsZCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygibWVzc2FnZSIsIFRUeXBlOjpTdHJpbmcsIDEpOworICAgICAgICBsZXQgdHlwZV9maWVsZCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygidHlwZSIsIFRUeXBlOjpJMzIsIDIpOworCisgICAgICAgIG8ud3JpdGVfZmllbGRfYmVnaW4oJm1lc3NhZ2VfZmllbGQpPzsKKyAgICAgICAgby53cml0ZV9zdHJpbmcoJmUubWVzc2FnZSk/OworICAgICAgICBvLndyaXRlX2ZpZWxkX2VuZCgpPzsKKworICAgICAgICBvLndyaXRlX2ZpZWxkX2JlZ2luKCZ0eXBlX2ZpZWxkKT87CisgICAgICAgIG8ud3JpdGVfaTMyKGUua2luZCBhcyBpMzIpPzsKKyAgICAgICAgby53cml0ZV9maWVsZF9lbmQoKT87CisKKyAgICAgICAgby53cml0ZV9maWVsZF9zdG9wKCk/OworICAgICAgICBvLndyaXRlX3N0cnVjdF9lbmQoKT87CisKKyAgICAgICAgby5mbHVzaCgpCisgICAgfQorfQorCitpbXBsIGVycm9yOjpFcnJvciBmb3IgRXJyb3IgeworICAgIGZuIGRlc2NyaXB0aW9uKCZzZWxmKSAtPiAmc3RyIHsKKyAgICAgICAgbWF0Y2ggKnNlbGYgeworICAgICAgICAgICAgRXJyb3I6OlRyYW5zcG9ydChyZWYgZSkgPT4gVHJhbnNwb3J0RXJyb3I6OmRlc2NyaXB0aW9uKGUpLAorICAgICAgICAgICAgRXJyb3I6OlByb3RvY29sKHJlZiBlKSA9PiBQcm90b2NvbEVycm9yOjpkZXNjcmlwdGlvbihlKSwKKyAgICAgICAgICAgIEVycm9yOjpBcHBsaWNhdGlvbihyZWYgZSkgPT4gQXBwbGljYXRpb25FcnJvcjo6ZGVzY3JpcHRpb24oZSksCisgICAgICAgICAgICBFcnJvcjo6VXNlcihyZWYgZSkgPT4gZS5kZXNjcmlwdGlvbigpLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIERlYnVnIGZvciBFcnJvciB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICBtYXRjaCAqc2VsZiB7CisgICAgICAgICAgICBFcnJvcjo6VHJhbnNwb3J0KHJlZiBlKSA9PiBEZWJ1Zzo6Zm10KGUsIGYpLAorICAgICAgICAgICAgRXJyb3I6OlByb3RvY29sKHJlZiBlKSA9PiBEZWJ1Zzo6Zm10KGUsIGYpLAorICAgICAgICAgICAgRXJyb3I6OkFwcGxpY2F0aW9uKHJlZiBlKSA9PiBEZWJ1Zzo6Zm10KGUsIGYpLAorICAgICAgICAgICAgRXJyb3I6OlVzZXIocmVmIGUpID0+IERlYnVnOjpmbXQoZSwgZiksCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRGlzcGxheSBmb3IgRXJyb3IgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgbWF0Y2ggKnNlbGYgeworICAgICAgICAgICAgRXJyb3I6OlRyYW5zcG9ydChyZWYgZSkgPT4gRGlzcGxheTo6Zm10KGUsIGYpLAorICAgICAgICAgICAgRXJyb3I6OlByb3RvY29sKHJlZiBlKSA9PiBEaXNwbGF5OjpmbXQoZSwgZiksCisgICAgICAgICAgICBFcnJvcjo6QXBwbGljYXRpb24ocmVmIGUpID0+IERpc3BsYXk6OmZtdChlLCBmKSwKKyAgICAgICAgICAgIEVycm9yOjpVc2VyKHJlZiBlKSA9PiBEaXNwbGF5OjpmbXQoZSwgZiksCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRnJvbTxTdHJpbmc+IGZvciBFcnJvciB7CisgICAgZm4gZnJvbShzOiBTdHJpbmcpIC0+IFNlbGYgeworICAgICAgICBFcnJvcjo6QXBwbGljYXRpb24oQXBwbGljYXRpb25FcnJvciB7CisgICAgICAgICAgICBraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgIG1lc3NhZ2U6IHMsCisgICAgICAgIH0pCisgICAgfQorfQorCitpbXBsPCdhPiBGcm9tPCYnYSBzdHI+IGZvciBFcnJvciB7CisgICAgZm4gZnJvbShzOiAmJ2Egc3RyKSAtPiBTZWxmIHsKKyAgICAgICAgRXJyb3I6OkFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDogQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICBtZXNzYWdlOiBTdHJpbmc6OmZyb20ocyksCisgICAgICAgIH0pCisgICAgfQorfQorCitpbXBsIEZyb208VHJhbnNwb3J0RXJyb3I+IGZvciBFcnJvciB7CisgICAgZm4gZnJvbShlOiBUcmFuc3BvcnRFcnJvcikgLT4gU2VsZiB7CisgICAgICAgIEVycm9yOjpUcmFuc3BvcnQoZSkKKyAgICB9Cit9CisKK2ltcGwgRnJvbTxQcm90b2NvbEVycm9yPiBmb3IgRXJyb3IgeworICAgIGZuIGZyb20oZTogUHJvdG9jb2xFcnJvcikgLT4gU2VsZiB7CisgICAgICAgIEVycm9yOjpQcm90b2NvbChlKQorICAgIH0KK30KKworaW1wbCBGcm9tPEFwcGxpY2F0aW9uRXJyb3I+IGZvciBFcnJvciB7CisgICAgZm4gZnJvbShlOiBBcHBsaWNhdGlvbkVycm9yKSAtPiBTZWxmIHsKKyAgICAgICAgRXJyb3I6OkFwcGxpY2F0aW9uKGUpCisgICAgfQorfQorCisvLy8gQ3JlYXRlIGEgbmV3IGBFcnJvcmAgaW5zdGFuY2Ugb2YgdHlwZSBgVHJhbnNwb3J0YCB0aGF0IHdyYXBzIGEKKy8vLyBgVHJhbnNwb3J0RXJyb3JgLgorcHViIGZuIG5ld190cmFuc3BvcnRfZXJyb3I8UzogSW50bzxTdHJpbmc+PihraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQsIG1lc3NhZ2U6IFMpIC0+IEVycm9yIHsKKyAgICBFcnJvcjo6VHJhbnNwb3J0KFRyYW5zcG9ydEVycm9yOjpuZXcoa2luZCwgbWVzc2FnZSkpCit9CisKKy8vLyBJbmZvcm1hdGlvbiBhYm91dCBJL08gZXJyb3JzLgorI1tkZXJpdmUoRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBUcmFuc3BvcnRFcnJvciB7CisgICAgLy8vIEkvTyBlcnJvciB2YXJpYW50LgorICAgIC8vLworICAgIC8vLyBJZiBhIHNwZWNpZmljIGBUcmFuc3BvcnRFcnJvcktpbmRgIGRvZXMgbm90IGFwcGx5IHVzZQorICAgIC8vLyBgVHJhbnNwb3J0RXJyb3JLaW5kOjpVbmtub3duYC4KKyAgICBwdWIga2luZDogVHJhbnNwb3J0RXJyb3JLaW5kLAorICAgIC8vLyBIdW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlLgorICAgIHB1YiBtZXNzYWdlOiBTdHJpbmcsCit9CisKK2ltcGwgVHJhbnNwb3J0RXJyb3IgeworICAgIC8vLyBDcmVhdGUgYSBuZXcgYFRyYW5zcG9ydEVycm9yYC4KKyAgICBwdWIgZm4gbmV3PFM6IEludG88U3RyaW5nPj4oa2luZDogVHJhbnNwb3J0RXJyb3JLaW5kLCBtZXNzYWdlOiBTKSAtPiBUcmFuc3BvcnRFcnJvciB7CisgICAgICAgIFRyYW5zcG9ydEVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IGtpbmQsCisgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLmludG8oKSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIEkvTyBlcnJvciBjYXRlZ29yaWVzLgorLy8vCisvLy8gVGhpcyBsaXN0IG1heSBncm93LCBhbmQgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIG1hdGNoIGFnYWluc3QgaXQuCisjW2Rlcml2ZShDbG9uZSwgQ29weSwgRXEsIERlYnVnLCBQYXJ0aWFsRXEpXQorcHViIGVudW0gVHJhbnNwb3J0RXJyb3JLaW5kIHsKKyAgICAvLy8gQ2F0Y2gtYWxsIEkvTyBlcnJvci4KKyAgICBVbmtub3duID0gMCwKKyAgICAvLy8gQW4gSS9PIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIHdoZW4gdGhlIHRyYW5zcG9ydCBjaGFubmVsIHdhcyBub3Qgb3Blbi4KKyAgICBOb3RPcGVuID0gMSwKKyAgICAvLy8gVGhlIHRyYW5zcG9ydCBjaGFubmVsIGNhbm5vdCBiZSBvcGVuZWQgYmVjYXVzZSBpdCB3YXMgb3BlbmVkIHByZXZpb3VzbHkuCisgICAgQWxyZWFkeU9wZW4gPSAyLAorICAgIC8vLyBBbiBJL08gb3BlcmF0aW9uIHRpbWVkIG91dC4KKyAgICBUaW1lZE91dCA9IDMsCisgICAgLy8vIEEgcmVhZCBjb3VsZCBub3QgY29tcGxldGUgYmVjYXVzZSBubyBieXRlcyB3ZXJlIGF2YWlsYWJsZS4KKyAgICBFbmRPZkZpbGUgPSA0LAorICAgIC8vLyBBbiBpbnZhbGlkIChidWZmZXIvbWVzc2FnZSkgc2l6ZSB3YXMgcmVxdWVzdGVkIG9yIHJlY2VpdmVkLgorICAgIE5lZ2F0aXZlU2l6ZSA9IDUsCisgICAgLy8vIFRvbyBsYXJnZSBhIGJ1ZmZlciBvciBtZXNzYWdlIHNpemUgd2FzIHJlcXVlc3RlZCBvciByZWNlaXZlZC4KKyAgICBTaXplTGltaXQgPSA2LAorfQorCitpbXBsIFRyYW5zcG9ydEVycm9yIHsKKyAgICBmbiBkZXNjcmlwdGlvbigmc2VsZikgLT4gJnN0ciB7CisgICAgICAgIG1hdGNoIHNlbGYua2luZCB7CisgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OlVua25vd24gPT4gInRyYW5zcG9ydCBlcnJvciIsCisgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6Ok5vdE9wZW4gPT4gIm5vdCBvcGVuIiwKKyAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6QWxyZWFkeU9wZW4gPT4gImFscmVhZHkgb3BlbiIsCisgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OlRpbWVkT3V0ID0+ICJ0aW1lZCBvdXQiLAorICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpFbmRPZkZpbGUgPT4gImVuZCBvZiBmaWxlIiwKKyAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6TmVnYXRpdmVTaXplID0+ICJuZWdhdGl2ZSBzaXplIG1lc3NhZ2UiLAorICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpTaXplTGltaXQgPT4gIm1lc3NhZ2UgdG9vIGxvbmciLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIERpc3BsYXkgZm9yIFRyYW5zcG9ydEVycm9yIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIHdyaXRlIShmLCAie30iLCBzZWxmLmRlc2NyaXB0aW9uKCkpCisgICAgfQorfQorCitpbXBsIFRyeUZyb208aTMyPiBmb3IgVHJhbnNwb3J0RXJyb3JLaW5kIHsKKyAgICB0eXBlIEVyciA9IEVycm9yOworICAgIGZuIHRyeV9mcm9tKGZyb206IGkzMikgLT4gUmVzdWx0PFNlbGYsIFNlbGY6OkVycj4geworICAgICAgICBtYXRjaCBmcm9tIHsKKyAgICAgICAgICAgIDAgPT4gT2soVHJhbnNwb3J0RXJyb3JLaW5kOjpVbmtub3duKSwKKyAgICAgICAgICAgIDEgPT4gT2soVHJhbnNwb3J0RXJyb3JLaW5kOjpOb3RPcGVuKSwKKyAgICAgICAgICAgIDIgPT4gT2soVHJhbnNwb3J0RXJyb3JLaW5kOjpBbHJlYWR5T3BlbiksCisgICAgICAgICAgICAzID0+IE9rKFRyYW5zcG9ydEVycm9yS2luZDo6VGltZWRPdXQpLAorICAgICAgICAgICAgNCA9PiBPayhUcmFuc3BvcnRFcnJvcktpbmQ6OkVuZE9mRmlsZSksCisgICAgICAgICAgICA1ID0+IE9rKFRyYW5zcG9ydEVycm9yS2luZDo6TmVnYXRpdmVTaXplKSwKKyAgICAgICAgICAgIDYgPT4gT2soVHJhbnNwb3J0RXJyb3JLaW5kOjpTaXplTGltaXQpLAorICAgICAgICAgICAgXyA9PiBFcnIoRXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBjb252ZXJ0IHt9IHRvIFRyYW5zcG9ydEVycm9yS2luZCIsIGZyb20pLAorICAgICAgICAgICAgfSkpLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIEZyb208aW86OkVycm9yPiBmb3IgRXJyb3IgeworICAgIGZuIGZyb20oZXJyOiBpbzo6RXJyb3IpIC0+IFNlbGYgeworICAgICAgICBtYXRjaCBlcnIua2luZCgpIHsKKyAgICAgICAgICAgIGlvOjpFcnJvcktpbmQ6OkNvbm5lY3Rpb25SZXNldAorICAgICAgICAgICAgfCBpbzo6RXJyb3JLaW5kOjpDb25uZWN0aW9uUmVmdXNlZAorICAgICAgICAgICAgfCBpbzo6RXJyb3JLaW5kOjpOb3RDb25uZWN0ZWQgPT4gRXJyb3I6OlRyYW5zcG9ydChUcmFuc3BvcnRFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogVHJhbnNwb3J0RXJyb3JLaW5kOjpOb3RPcGVuLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5kZXNjcmlwdGlvbigpLnRvX293bmVkKCksCisgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgIGlvOjpFcnJvcktpbmQ6OkFscmVhZHlFeGlzdHMgPT4gRXJyb3I6OlRyYW5zcG9ydChUcmFuc3BvcnRFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogVHJhbnNwb3J0RXJyb3JLaW5kOjpBbHJlYWR5T3BlbiwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIuZGVzY3JpcHRpb24oKS50b19vd25lZCgpLAorICAgICAgICAgICAgfSksCisgICAgICAgICAgICBpbzo6RXJyb3JLaW5kOjpUaW1lZE91dCA9PiBFcnJvcjo6VHJhbnNwb3J0KFRyYW5zcG9ydEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQ6OlRpbWVkT3V0LAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5kZXNjcmlwdGlvbigpLnRvX293bmVkKCksCisgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgIGlvOjpFcnJvcktpbmQ6OlVuZXhwZWN0ZWRFb2YgPT4gRXJyb3I6OlRyYW5zcG9ydChUcmFuc3BvcnRFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogVHJhbnNwb3J0RXJyb3JLaW5kOjpFbmRPZkZpbGUsCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLmRlc2NyaXB0aW9uKCkudG9fb3duZWQoKSwKKyAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgXyA9PiB7CisgICAgICAgICAgICAgICAgRXJyb3I6OlRyYW5zcG9ydChUcmFuc3BvcnRFcnJvciB7CisgICAgICAgICAgICAgICAgICAgIGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLmRlc2NyaXB0aW9uKCkudG9fb3duZWQoKSwgLy8gRklYTUU6IHVzZSBpbyBlcnJvcidzIGRlYnVnIHN0cmluZworICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRnJvbTxzdHJpbmc6OkZyb21VdGY4RXJyb3I+IGZvciBFcnJvciB7CisgICAgZm4gZnJvbShlcnI6IHN0cmluZzo6RnJvbVV0ZjhFcnJvcikgLT4gU2VsZiB7CisgICAgICAgIEVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSwKKyAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5kZXNjcmlwdGlvbigpLnRvX293bmVkKCksIC8vIEZJWE1FOiB1c2UgZm10OjpFcnJvcidzIGRlYnVnIHN0cmluZworICAgICAgICB9KQorICAgIH0KK30KKworLy8vIENyZWF0ZSBhIG5ldyBgRXJyb3JgIGluc3RhbmNlIG9mIHR5cGUgYFByb3RvY29sYCB0aGF0IHdyYXBzIGEKKy8vLyBgUHJvdG9jb2xFcnJvcmAuCitwdWIgZm4gbmV3X3Byb3RvY29sX2Vycm9yPFM6IEludG88U3RyaW5nPj4oa2luZDogUHJvdG9jb2xFcnJvcktpbmQsIG1lc3NhZ2U6IFMpIC0+IEVycm9yIHsKKyAgICBFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvcjo6bmV3KGtpbmQsIG1lc3NhZ2UpKQorfQorCisvLy8gSW5mb3JtYXRpb24gYWJvdXQgZXJyb3JzIHRoYXQgb2NjdXIgaW4gdGhlIHJ1bnRpbWUgbGlicmFyeS4KKyNbZGVyaXZlKERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgUHJvdG9jb2xFcnJvciB7CisgICAgLy8vIFByb3RvY29sIGVycm9yIHZhcmlhbnQuCisgICAgLy8vCisgICAgLy8vIElmIGEgc3BlY2lmaWMgYFByb3RvY29sRXJyb3JLaW5kYCBkb2VzIG5vdCBhcHBseSB1c2UKKyAgICAvLy8gYFByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duYC4KKyAgICBwdWIga2luZDogUHJvdG9jb2xFcnJvcktpbmQsCisgICAgLy8vIEh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuCisgICAgcHViIG1lc3NhZ2U6IFN0cmluZywKK30KKworaW1wbCBQcm90b2NvbEVycm9yIHsKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IGBQcm90b2NvbEVycm9yYC4KKyAgICBwdWIgZm4gbmV3PFM6IEludG88U3RyaW5nPj4oa2luZDogUHJvdG9jb2xFcnJvcktpbmQsIG1lc3NhZ2U6IFMpIC0+IFByb3RvY29sRXJyb3IgeworICAgICAgICBQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IGtpbmQsCisgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLmludG8oKSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIFJ1bnRpbWUgbGlicmFyeSBlcnJvciBjYXRlZ29yaWVzLgorLy8vCisvLy8gVGhpcyBsaXN0IG1heSBncm93LCBhbmQgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIG1hdGNoIGFnYWluc3QgaXQuCisjW2Rlcml2ZShDbG9uZSwgQ29weSwgRXEsIERlYnVnLCBQYXJ0aWFsRXEpXQorcHViIGVudW0gUHJvdG9jb2xFcnJvcktpbmQgeworICAgIC8vLyBDYXRjaC1hbGwgcnVudGltZS1saWJyYXJ5IGVycm9yLgorICAgIFVua25vd24gPSAwLAorICAgIC8vLyBBbiBpbnZhbGlkIGFyZ3VtZW50IHdhcyBzdXBwbGllZCB0byBhIGxpYnJhcnkgZnVuY3Rpb24sIG9yIGludmFsaWQgZGF0YQorICAgIC8vLyB3YXMgcmVjZWl2ZWQgZnJvbSBhIFRocmlmdCBlbmRwb2ludC4KKyAgICBJbnZhbGlkRGF0YSA9IDEsCisgICAgLy8vIEFuIGludmFsaWQgc2l6ZSB3YXMgcmVjZWl2ZWQgaW4gYW4gZW5jb2RlZCBmaWVsZC4KKyAgICBOZWdhdGl2ZVNpemUgPSAyLAorICAgIC8vLyBUaHJpZnQgbWVzc2FnZSBvciBmaWVsZCB3YXMgdG9vIGxvbmcuCisgICAgU2l6ZUxpbWl0ID0gMywKKyAgICAvLy8gVW5zdXBwb3J0ZWQgb3IgdW5rbm93biBUaHJpZnQgcHJvdG9jb2wgdmVyc2lvbi4KKyAgICBCYWRWZXJzaW9uID0gNCwKKyAgICAvLy8gVW5zdXBwb3J0ZWQgVGhyaWZ0IHByb3RvY29sLCBzZXJ2ZXIgb3IgZmllbGQgdHlwZS4KKyAgICBOb3RJbXBsZW1lbnRlZCA9IDUsCisgICAgLy8vIFJlYWNoZWQgdGhlIG1heGltdW0gbmVzdGVkIGRlcHRoIHRvIHdoaWNoIGFuIGVuY29kZWQgVGhyaWZ0IGZpZWxkIGNvdWxkCisgICAgLy8vIGJlIHNraXBwZWQuCisgICAgRGVwdGhMaW1pdCA9IDYsCit9CisKK2ltcGwgUHJvdG9jb2xFcnJvciB7CisgICAgZm4gZGVzY3JpcHRpb24oJnNlbGYpIC0+ICZzdHIgeworICAgICAgICBtYXRjaCBzZWxmLmtpbmQgeworICAgICAgICAgICAgUHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd24gPT4gInByb3RvY29sIGVycm9yIiwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSA9PiAiYmFkIGRhdGEiLAorICAgICAgICAgICAgUHJvdG9jb2xFcnJvcktpbmQ6Ok5lZ2F0aXZlU2l6ZSA9PiAibmVnYXRpdmUgbWVzc2FnZSBzaXplIiwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpTaXplTGltaXQgPT4gIm1lc3NhZ2UgdG9vIGxvbmciLAorICAgICAgICAgICAgUHJvdG9jb2xFcnJvcktpbmQ6OkJhZFZlcnNpb24gPT4gImludmFsaWQgdGhyaWZ0IHZlcnNpb24iLAorICAgICAgICAgICAgUHJvdG9jb2xFcnJvcktpbmQ6Ok5vdEltcGxlbWVudGVkID0+ICJub3QgaW1wbGVtZW50ZWQiLAorICAgICAgICAgICAgUHJvdG9jb2xFcnJvcktpbmQ6OkRlcHRoTGltaXQgPT4gIm1heGltdW0gc2tpcCBkZXB0aCByZWFjaGVkIiwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBEaXNwbGF5IGZvciBQcm90b2NvbEVycm9yIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIHdyaXRlIShmLCAie30iLCBzZWxmLmRlc2NyaXB0aW9uKCkpCisgICAgfQorfQorCitpbXBsIFRyeUZyb208aTMyPiBmb3IgUHJvdG9jb2xFcnJvcktpbmQgeworICAgIHR5cGUgRXJyID0gRXJyb3I7CisgICAgZm4gdHJ5X2Zyb20oZnJvbTogaTMyKSAtPiBSZXN1bHQ8U2VsZiwgU2VsZjo6RXJyPiB7CisgICAgICAgIG1hdGNoIGZyb20geworICAgICAgICAgICAgMCA9PiBPayhQcm90b2NvbEVycm9yS2luZDo6VW5rbm93biksCisgICAgICAgICAgICAxID0+IE9rKFByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSksCisgICAgICAgICAgICAyID0+IE9rKFByb3RvY29sRXJyb3JLaW5kOjpOZWdhdGl2ZVNpemUpLAorICAgICAgICAgICAgMyA9PiBPayhQcm90b2NvbEVycm9yS2luZDo6U2l6ZUxpbWl0KSwKKyAgICAgICAgICAgIDQgPT4gT2soUHJvdG9jb2xFcnJvcktpbmQ6OkJhZFZlcnNpb24pLAorICAgICAgICAgICAgNSA9PiBPayhQcm90b2NvbEVycm9yS2luZDo6Tm90SW1wbGVtZW50ZWQpLAorICAgICAgICAgICAgNiA9PiBPayhQcm90b2NvbEVycm9yS2luZDo6RGVwdGhMaW1pdCksCisgICAgICAgICAgICBfID0+IEVycihFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogUHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY2Fubm90IGNvbnZlcnQge30gdG8gUHJvdG9jb2xFcnJvcktpbmQiLCBmcm9tKSwKKyAgICAgICAgICAgIH0pKSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIENyZWF0ZSBhIG5ldyBgRXJyb3JgIGluc3RhbmNlIG9mIHR5cGUgYEFwcGxpY2F0aW9uYCB0aGF0IHdyYXBzIGFuCisvLy8gYEFwcGxpY2F0aW9uRXJyb3JgLgorcHViIGZuIG5ld19hcHBsaWNhdGlvbl9lcnJvcjxTOiBJbnRvPFN0cmluZz4+KGtpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kLCBtZXNzYWdlOiBTKSAtPiBFcnJvciB7CisgICAgRXJyb3I6OkFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uRXJyb3I6Om5ldyhraW5kLCBtZXNzYWdlKSkKK30KKworLy8vIEluZm9ybWF0aW9uIGFib3V0IGVycm9ycyBpbiBhdXRvLWdlbmVyYXRlZCBjb2RlIG9yIGluIHVzZXItaW1wbGVtZW50ZWQKKy8vLyBzZXJ2aWNlIGhhbmRsZXJzLgorI1tkZXJpdmUoRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAvLy8gQXBwbGljYXRpb24gZXJyb3IgdmFyaWFudC4KKyAgICAvLy8KKyAgICAvLy8gSWYgYSBzcGVjaWZpYyBgQXBwbGljYXRpb25FcnJvcktpbmRgIGRvZXMgbm90IGFwcGx5IHVzZQorICAgIC8vLyBgQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd25gLgorICAgIHB1YiBraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZCwKKyAgICAvLy8gSHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZS4KKyAgICBwdWIgbWVzc2FnZTogU3RyaW5nLAorfQorCitpbXBsIEFwcGxpY2F0aW9uRXJyb3IgeworICAgIC8vLyBDcmVhdGUgYSBuZXcgYEFwcGxpY2F0aW9uRXJyb3JgLgorICAgIHB1YiBmbiBuZXc8UzogSW50bzxTdHJpbmc+PihraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZCwgbWVzc2FnZTogUykgLT4gQXBwbGljYXRpb25FcnJvciB7CisgICAgICAgIEFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDoga2luZCwKKyAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UuaW50bygpLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gQXV0by1nZW5lcmF0ZWQgb3IgdXNlci1pbXBsZW1lbnRlZCBjb2RlIGVycm9yIGNhdGVnb3JpZXMuCisvLy8KKy8vLyBUaGlzIGxpc3QgbWF5IGdyb3csIGFuZCBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gbWF0Y2ggYWdhaW5zdCBpdC4KKyNbZGVyaXZlKENsb25lLCBDb3B5LCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgZW51bSBBcHBsaWNhdGlvbkVycm9yS2luZCB7CisgICAgLy8vIENhdGNoLWFsbCBhcHBsaWNhdGlvbiBlcnJvci4KKyAgICBVbmtub3duID0gMCwKKyAgICAvLy8gTWFkZSBzZXJ2aWNlIGNhbGwgdG8gYW4gdW5rbm93biBzZXJ2aWNlIG1ldGhvZC4KKyAgICBVbmtub3duTWV0aG9kID0gMSwKKyAgICAvLy8gUmVjZWl2ZWQgYW4gdW5rbm93biBUaHJpZnQgbWVzc2FnZSB0eXBlLiBUaGF0IGlzLCBub3Qgb25lIG9mIHRoZQorICAgIC8vLyBgdGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlYCB2YXJpYW50cy4KKyAgICBJbnZhbGlkTWVzc2FnZVR5cGUgPSAyLAorICAgIC8vLyBNZXRob2QgbmFtZSBpbiBhIHNlcnZpY2UgcmVwbHkgZG9lcyBub3QgbWF0Y2ggdGhlIG5hbWUgb2YgdGhlCisgICAgLy8vIHJlY2VpdmluZyBzZXJ2aWNlIG1ldGhvZC4KKyAgICBXcm9uZ01ldGhvZE5hbWUgPSAzLAorICAgIC8vLyBSZWNlaXZlZCBhbiBvdXQtb2Ytb3JkZXIgVGhyaWZ0IG1lc3NhZ2UuCisgICAgQmFkU2VxdWVuY2VJZCA9IDQsCisgICAgLy8vIFNlcnZpY2UgcmVwbHkgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCisgICAgTWlzc2luZ1Jlc3VsdCA9IDUsCisgICAgLy8vIEF1dG8tZ2VuZXJhdGVkIGNvZGUgZmFpbGVkIHVuZXhwZWN0ZWRseS4KKyAgICBJbnRlcm5hbEVycm9yID0gNiwKKyAgICAvLy8gVGhyaWZ0IHByb3RvY29sIGVycm9yLiBXaGVuIHBvc3NpYmxlIHVzZSBgRXJyb3I6OlByb3RvY29sRXJyb3JgIHdpdGggYQorICAgIC8vLyBzcGVjaWZpYyBgUHJvdG9jb2xFcnJvcktpbmRgIGluc3RlYWQuCisgICAgUHJvdG9jb2xFcnJvciA9IDcsCisgICAgLy8vICpVbmtub3duKi4gSW5jbHVkZWQgb25seSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIFRocmlmdCBpbXBsZW1lbnRhdGlvbnMuCisgICAgSW52YWxpZFRyYW5zZm9ybSA9IDgsIC8vID8/CisgICAgLy8vIFRocmlmdCBlbmRwb2ludCByZXF1ZXN0ZWQsIG9yIGlzIHVzaW5nLCBhbiB1bnN1cHBvcnRlZCBlbmNvZGluZy4KKyAgICBJbnZhbGlkUHJvdG9jb2wgPSA5LCAvLyA/PworICAgIC8vLyBUaHJpZnQgZW5kcG9pbnQgcmVxdWVzdGVkLCBvciBpcyB1c2luZywgYW4gdW5zdXBwb3J0ZWQgYXV0by1nZW5lcmF0ZWQgY2xpZW50IHR5cGUuCisgICAgVW5zdXBwb3J0ZWRDbGllbnRUeXBlID0gMTAsIC8vID8/Cit9CisKK2ltcGwgQXBwbGljYXRpb25FcnJvciB7CisgICAgZm4gZGVzY3JpcHRpb24oJnNlbGYpIC0+ICZzdHIgeworICAgICAgICBtYXRjaCBzZWxmLmtpbmQgeworICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24gPT4gInNlcnZpY2UgZXJyb3IiLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd25NZXRob2QgPT4gInVua25vd24gc2VydmljZSBtZXRob2QiLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OkludmFsaWRNZXNzYWdlVHlwZSA9PiAid3JvbmcgbWVzc2FnZSB0eXBlIHJlY2VpdmVkIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpXcm9uZ01ldGhvZE5hbWUgPT4gInVua25vd24gbWV0aG9kIHJlcGx5IHJlY2VpdmVkIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpCYWRTZXF1ZW5jZUlkID0+ICJvdXQgb2Ygb3JkZXIgc2VxdWVuY2UgaWQiLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6Ok1pc3NpbmdSZXN1bHQgPT4gIm1pc3NpbmcgbWV0aG9kIHJlc3VsdCIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6SW50ZXJuYWxFcnJvciA9PiAicmVtb3RlIHNlcnZpY2UgdGhyZXcgZXhjZXB0aW9uIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpQcm90b2NvbEVycm9yID0+ICJwcm90b2NvbCBlcnJvciIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6SW52YWxpZFRyYW5zZm9ybSA9PiAiaW52YWxpZCB0cmFuc2Zvcm0iLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OkludmFsaWRQcm90b2NvbCA9PiAiaW52YWxpZCBwcm90b2NvbCByZXF1ZXN0ZWQiLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OlVuc3VwcG9ydGVkQ2xpZW50VHlwZSA9PiAidW5zdXBwb3J0ZWQgcHJvdG9jb2wgY2xpZW50IiwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBEaXNwbGF5IGZvciBBcHBsaWNhdGlvbkVycm9yIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIHdyaXRlIShmLCAie30iLCBzZWxmLmRlc2NyaXB0aW9uKCkpCisgICAgfQorfQorCitpbXBsIFRyeUZyb208aTMyPiBmb3IgQXBwbGljYXRpb25FcnJvcktpbmQgeworICAgIHR5cGUgRXJyID0gRXJyb3I7CisgICAgZm4gdHJ5X2Zyb20oZnJvbTogaTMyKSAtPiBSZXN1bHQ8U2VsZiwgU2VsZjo6RXJyPiB7CisgICAgICAgIG1hdGNoIGZyb20geworICAgICAgICAgICAgMCA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biksCisgICAgICAgICAgICAxID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duTWV0aG9kKSwKKyAgICAgICAgICAgIDIgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OkludmFsaWRNZXNzYWdlVHlwZSksCisgICAgICAgICAgICAzID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpXcm9uZ01ldGhvZE5hbWUpLAorICAgICAgICAgICAgNCA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6QmFkU2VxdWVuY2VJZCksCisgICAgICAgICAgICA1ID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpNaXNzaW5nUmVzdWx0KSwKKyAgICAgICAgICAgIDYgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OkludGVybmFsRXJyb3IpLAorICAgICAgICAgICAgNyA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6UHJvdG9jb2xFcnJvciksCisgICAgICAgICAgICA4ID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnZhbGlkVHJhbnNmb3JtKSwKKyAgICAgICAgICAgIDkgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OkludmFsaWRQcm90b2NvbCksCisgICAgICAgICAgICAxMCA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5zdXBwb3J0ZWRDbGllbnRUeXBlKSwKKyAgICAgICAgICAgIF8gPT4gRXJyKEVycm9yOjpBcHBsaWNhdGlvbihBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3QgY29udmVydCB7fSB0byBBcHBsaWNhdGlvbkVycm9yS2luZCIsIGZyb20pLAorICAgICAgICAgICAgfSkpLAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9saWIucnMgYi9saWIvcnMvc3JjL2xpYi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTVjN2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9saWIucnMKQEAgLTAsMCArMSw4NyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyEgUnVzdCBydW50aW1lIGxpYnJhcnkgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0uCisvLyEKKy8vISBUaGlzIGNyYXRlIGltcGxlbWVudHMgdGhlIGNvbXBvbmVudHMgcmVxdWlyZWQgdG8gYnVpbGQgYSB3b3JraW5nCisvLyEgVGhyaWZ0IHNlcnZlciBhbmQgY2xpZW50LiBJdCBpcyBkaXZpZGVkIGludG8gdGhlIGZvbGxvd2luZyBtb2R1bGVzOgorLy8hCisvLyEgMS4gZXJyb3JzCisvLyEgMi4gcHJvdG9jb2wKKy8vISAzLiB0cmFuc3BvcnQKKy8vISA0LiBzZXJ2ZXIKKy8vISA1LiBhdXRvZ2VuCisvLyEKKy8vISBUaGUgbW9kdWxlcyBhcmUgbGF5ZXJlZCBhcyBzaG93biBpbiB0aGUgZGlhZ3JhbSBiZWxvdy4gVGhlIGBhdXRvZ2VuJ2RgCisvLyEgbGF5ZXIgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIncyBSdXN0IHBsdWdpbi4gSXQgdXNlcyB0aGUKKy8vISB0eXBlcyBhbmQgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcyBjcmF0ZSB0byBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplCisvLyEgbWVzc2FnZXMgYW5kIGltcGxlbWVudCBSUEMuIFVzZXJzIGludGVyYWN0IHdpdGggdGhlc2UgdHlwZXMgYW5kIHNlcnZpY2VzCisvLyEgYnkgd3JpdGluZyB0aGVpciBvd24gY29kZSB0aGF0IHVzZXMgdGhlIGF1dG8tZ2VuZXJhdGVkIGNsaWVudHMgYW5kCisvLyEgc2VydmVycy4KKy8vIQorLy8hIGBgYHRleHQKKy8vISArLS0tLS0tLS0tLS0rCisvLyEgfCB1c2VyIGFwcCAgfAorLy8hICstLS0tLS0tLS0tLSsKKy8vISB8IGF1dG9nZW4nZCB8ICh1c2VzIGVycm9ycywgYXV0b2dlbikKKy8vISArLS0tLS0tLS0tLS0rCisvLyEgfCAgcHJvdG9jb2wgfAorLy8hICstLS0tLS0tLS0tLSsKKy8vISB8IHRyYW5zcG9ydCB8CisvLyEgKy0tLS0tLS0tLS0tKworLy8hIGBgYAorCisjIVtjcmF0ZV90eXBlID0gImxpYiJdCisjIVtkb2ModGVzdChhdHRyKGFsbG93KHVudXNlZF92YXJpYWJsZXMpLCBkZW55KHdhcm5pbmdzKSkpKV0KKworZXh0ZXJuIGNyYXRlIGJ5dGVvcmRlcjsKK2V4dGVybiBjcmF0ZSBpbnRlZ2VyX2VuY29kaW5nOworZXh0ZXJuIGNyYXRlIHRocmVhZHBvb2w7CitleHRlcm4gY3JhdGUgdHJ5X2Zyb207CisKKyNbbWFjcm9fdXNlXQorZXh0ZXJuIGNyYXRlIGxvZzsKKworLy8gTk9URTogdGhpcyBtYWNybyBoYXMgdG8gYmUgZGVmaW5lZCBiZWZvcmUgYW55IG1vZHVsZXMuIFNlZToKKy8vIGh0dHBzOi8vZGFuaWVsa2VlcC5naXRodWIuaW8vcXVpY2staW50cm8tdG8tbWFjcm9zLmh0bWwjc29tZS1tb3JlLWdvdGNoYXMKKworLy8vIEFzc2VydCB0aGF0IGFuIGV4cHJlc3Npb24gcmV0dXJuaW5nIGEgYFJlc3VsdGAgaXMgYSBzdWNjZXNzLiBJZiBpdCBpcywKKy8vLyByZXR1cm4gdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgcmVzdWx0LCBpLmUuIGBleHByLnVud3JhcCgpYC4KKyNbY2ZnKHRlc3QpXQorbWFjcm9fcnVsZXMhIGFzc2VydF9zdWNjZXNzIHsKKyAgICAoJGU6IGV4cHIpID0+IHt7CisgICAgICAgIGxldCByZXMgPSAkZTsKKyAgICAgICAgYXNzZXJ0IShyZXMuaXNfb2soKSk7CisgICAgICAgIHJlcy51bndyYXAoKQorICAgIH19OworfQorCitwdWIgbW9kIHByb3RvY29sOworcHViIG1vZCBzZXJ2ZXI7CitwdWIgbW9kIHRyYW5zcG9ydDsKKworbW9kIGVycm9yczsKK3B1YiB1c2UgZXJyb3JzOjoqOworCittb2QgYXV0b2dlbjsKK3B1YiB1c2UgYXV0b2dlbjo6KjsKKworLy8vIFJlc3VsdCB0eXBlIHJldHVybmVkIGJ5IGFsbCBydW50aW1lIGxpYnJhcnkgZnVuY3Rpb25zLgorLy8vCisvLy8gQXMgaXMgY29udmVudGlvbiB0aGlzIGlzIGEgdHlwZWRlZiBvZiBgc3RkOjpyZXN1bHQ6OlJlc3VsdGAKKy8vLyB3aXRoIGBFYCBkZWZpbmVkIGFzIHRoZSBgdGhyaWZ0OjpFcnJvcmAgdHlwZS4KK3B1YiB0eXBlIFJlc3VsdDxUPiA9IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8VCwgc2VsZjo6RXJyb3I+OwpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9wcm90b2NvbC9iaW5hcnkucnMgYi9saWIvcnMvc3JjL3Byb3RvY29sL2JpbmFyeS5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWFmZjNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9wcm90b2NvbC9iaW5hcnkucnMKQEAgLTAsMCArMSw5NTcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIGJ5dGVvcmRlcjo6e0JpZ0VuZGlhbiwgQnl0ZU9yZGVyLCBSZWFkQnl0ZXNFeHQsIFdyaXRlQnl0ZXNFeHR9OwordXNlIHN0ZDo6Y29udmVydDo6RnJvbTsKK3VzZSB0cnlfZnJvbTo6VHJ5RnJvbTsKKwordXNlIHN1cGVyOjp7CisgICAgVEZpZWxkSWRlbnRpZmllciwgVElucHV0UHJvdG9jb2wsIFRJbnB1dFByb3RvY29sRmFjdG9yeSwgVExpc3RJZGVudGlmaWVyLCBUTWFwSWRlbnRpZmllciwKKyAgICBUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZSwKK307Cit1c2Ugc3VwZXI6OntUT3V0cHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbEZhY3RvcnksIFRTZXRJZGVudGlmaWVyLCBUU3RydWN0SWRlbnRpZmllciwgVFR5cGV9OwordXNlIHRyYW5zcG9ydDo6e1RSZWFkVHJhbnNwb3J0LCBUV3JpdGVUcmFuc3BvcnR9OwordXNlIHtQcm90b2NvbEVycm9yLCBQcm90b2NvbEVycm9yS2luZH07CisKK2NvbnN0IEJJTkFSWV9QUk9UT0NPTF9WRVJTSU9OXzE6IHUzMiA9IDB4ODAwMTAwMDA7CisKKy8vLyBSZWFkIG1lc3NhZ2VzIGVuY29kZWQgaW4gdGhlIFRocmlmdCBzaW1wbGUgYmluYXJ5IGVuY29kaW5nLgorLy8vCisvLy8gVGhlcmUgYXJlIHR3byBhdmFpbGFibGUgbW9kZXM6IGBzdHJpY3RgIGFuZCBgbm9uLXN0cmljdGAsIHdoZXJlIHRoZQorLy8vIGBub24tc3RyaWN0YCB2ZXJzaW9uIGRvZXMgbm90IGNoZWNrIGZvciB0aGUgcHJvdG9jb2wgdmVyc2lvbiBpbiB0aGUKKy8vLyByZWNlaXZlZCBtZXNzYWdlIGhlYWRlci4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRCaW5hcnlJbnB1dFByb3RvY29sYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeUlucHV0UHJvdG9jb2wsIFRJbnB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgcHJvdG9jb2wgPSBUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwsIHRydWUpOworLy8vCisvLy8gbGV0IHJlY3ZkX2Jvb2wgPSBwcm90b2NvbC5yZWFkX2Jvb2woKS51bndyYXAoKTsKKy8vLyBsZXQgcmVjdmRfc3RyaW5nID0gcHJvdG9jb2wucmVhZF9zdHJpbmcoKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVEJpbmFyeUlucHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFJlYWRUcmFuc3BvcnQsCit7CisgICAgc3RyaWN0OiBib29sLAorICAgIHB1YiB0cmFuc3BvcnQ6IFQsIC8vIEZJWE1FOiBzaG91bGRuJ3QgYmUgcHVibGljCit9CisKK2ltcGw8J2EsIFQ+IFRCaW5hcnlJbnB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRSZWFkVHJhbnNwb3J0LAoreworICAgIC8vLyBDcmVhdGUgYSBgVEJpbmFyeUlucHV0UHJvdG9jb2xgIHRoYXQgcmVhZHMgYnl0ZXMgZnJvbSBgdHJhbnNwb3J0YC4KKyAgICAvLy8KKyAgICAvLy8gU2V0IGBzdHJpY3RgIHRvIGB0cnVlYCBpZiBhbGwgaW5jb21pbmcgbWVzc2FnZXMgY29udGFpbiB0aGUgcHJvdG9jb2wKKyAgICAvLy8gdmVyc2lvbiBudW1iZXIgaW4gdGhlIHByb3RvY29sIGhlYWRlci4KKyAgICBwdWIgZm4gbmV3KHRyYW5zcG9ydDogVCwgc3RyaWN0OiBib29sKSAtPiBUQmluYXJ5SW5wdXRQcm90b2NvbDxUPiB7CisgICAgICAgIFRCaW5hcnlJbnB1dFByb3RvY29sIHsKKyAgICAgICAgICAgIHN0cmljdDogc3RyaWN0LAorICAgICAgICAgICAgdHJhbnNwb3J0OiB0cmFuc3BvcnQsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGw8VD4gVElucHV0UHJvdG9jb2wgZm9yIFRCaW5hcnlJbnB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRSZWFkVHJhbnNwb3J0LAoreworICAgICNbY2ZnX2F0dHIoZmVhdHVyZSA9ICJjYXJnby1jbGlwcHkiLCBhbGxvdyhjb2xsYXBzaWJsZV9pZikpXQorICAgIGZuIHJlYWRfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNZXNzYWdlSWRlbnRpZmllcj4geworICAgICAgICBsZXQgbXV0IGZpcnN0X2J5dGVzID0gdmVjIVswOyA0XTsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF9leGFjdCgmbXV0IGZpcnN0X2J5dGVzWy4uXSk/OworCisgICAgICAgIC8vIHRoZSB0aHJpZnQgdmVyc2lvbiBoZWFkZXIgaXMgaW50ZW50aW9uYWxseSBuZWdhdGl2ZQorICAgICAgICAvLyBzbyB0aGUgZmlyc3QgY2hlY2sgd2UnbGwgZG8gaXMgc2VlIGlmIHRoZSBzaWduIGJpdCBpcyBzZXQKKyAgICAgICAgLy8gYW5kIGlmIHNvIC0gYXNzdW1lIGl0J3MgdGhlIHByb3RvY29sLXZlcnNpb24gaGVhZGVyCisgICAgICAgIGlmIGZpcnN0X2J5dGVzWzBdID49IDggeworICAgICAgICAgICAgLy8gYXBwYXJlbnRseSB3ZSBnb3QgYSBwcm90b2NvbC12ZXJzaW9uIGhlYWRlciAtIGNoZWNrCisgICAgICAgICAgICAvLyBpdCwgYW5kIGlmIGl0IG1hdGNoZXMsIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIGZpZWxkcworICAgICAgICAgICAgaWYgZmlyc3RfYnl0ZXNbMC4uMl0gIT0gWzB4ODAsIDB4MDFdIHsKKyAgICAgICAgICAgICAgICBFcnIoOjpFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpCYWRWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJyZWNlaXZlZCBiYWQgdmVyc2lvbjogezo/fSIsICZmaXJzdF9ieXRlc1swLi4yXSksCisgICAgICAgICAgICAgICAgfSkpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlX3R5cGU6IFRNZXNzYWdlVHlwZSA9IFRyeUZyb206OnRyeV9mcm9tKGZpcnN0X2J5dGVzWzNdKT87CisgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBzZWxmLnJlYWRfc3RyaW5nKCk/OworICAgICAgICAgICAgICAgIGxldCBzZXF1ZW5jZV9udW1iZXIgPSBzZWxmLnJlYWRfaTMyKCk/OworICAgICAgICAgICAgICAgIE9rKFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KG5hbWUsIG1lc3NhZ2VfdHlwZSwgc2VxdWVuY2VfbnVtYmVyKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGFwcGFyZW50bHkgd2UgZGlkbid0IGdldCBhIHByb3RvY29sLXZlcnNpb24gaGVhZGVyLAorICAgICAgICAgICAgLy8gd2hpY2ggaGFwcGVucyBpZiB0aGUgc2VuZGVyIGlzIG5vdCB1c2luZyB0aGUgc3RyaWN0IHByb3RvY29sCisgICAgICAgICAgICBpZiBzZWxmLnN0cmljdCB7CisgICAgICAgICAgICAgICAgLy8gd2UncmUgaW4gc3RyaWN0IG1vZGUgaG93ZXZlciwgYW5kIHRoYXQgYWx3YXlzCisgICAgICAgICAgICAgICAgLy8gcmVxdWlyZXMgdGhlIHByb3RvY29sLXZlcnNpb24gaGVhZGVyIHRvIGJlIHdyaXR0ZW4gZmlyc3QKKyAgICAgICAgICAgICAgICBFcnIoOjpFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpCYWRWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJyZWNlaXZlZCBiYWQgdmVyc2lvbjogezo/fSIsICZmaXJzdF9ieXRlc1swLi4yXSksCisgICAgICAgICAgICAgICAgfSkpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGluIHRoZSBub24tc3RyaWN0IHZlcnNpb24gdGhlIGZpcnN0IG1lc3NhZ2UgZmllbGQKKyAgICAgICAgICAgICAgICAvLyBpcyB0aGUgbWVzc2FnZSBuYW1lLiBzdHJpbmdzIChieXRlIGFycmF5cykgYXJlIGxlbmd0aC1wcmVmaXhlZCwKKyAgICAgICAgICAgICAgICAvLyBzbyB3ZSd2ZSBqdXN0IHJlYWQgdGhlIGxlbmd0aCBpbiB0aGUgZmlyc3QgNCBieXRlcworICAgICAgICAgICAgICAgIGxldCBuYW1lX3NpemUgPSBCaWdFbmRpYW46OnJlYWRfaTMyKCZmaXJzdF9ieXRlcykgYXMgdXNpemU7CisgICAgICAgICAgICAgICAgbGV0IG11dCBuYW1lX2J1ZjogVmVjPHU4PiA9IHZlYyFbMDsgbmFtZV9zaXplXTsKKyAgICAgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX2V4YWN0KCZtdXQgbmFtZV9idWYpPzsKKyAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IFN0cmluZzo6ZnJvbV91dGY4KG5hbWVfYnVmKT87CisKKyAgICAgICAgICAgICAgICAvLyByZWFkIHRoZSByZXN0IG9mIHRoZSBmaWVsZHMKKyAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZV90eXBlOiBUTWVzc2FnZVR5cGUgPSBzZWxmLnJlYWRfYnl0ZSgpLmFuZF90aGVuKFRyeUZyb206OnRyeV9mcm9tKT87CisgICAgICAgICAgICAgICAgbGV0IHNlcXVlbmNlX251bWJlciA9IHNlbGYucmVhZF9pMzIoKT87CisgICAgICAgICAgICAgICAgT2soVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcobmFtZSwgbWVzc2FnZV90eXBlLCBzZXF1ZW5jZV9udW1iZXIpKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gcmVhZF9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RydWN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8T3B0aW9uPFRTdHJ1Y3RJZGVudGlmaWVyPj4geworICAgICAgICBPayhOb25lKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfZmllbGRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxURmllbGRJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCBmaWVsZF90eXBlX2J5dGUgPSBzZWxmLnJlYWRfYnl0ZSgpPzsKKyAgICAgICAgbGV0IGZpZWxkX3R5cGUgPSBmaWVsZF90eXBlX2Zyb21fdTgoZmllbGRfdHlwZV9ieXRlKT87CisgICAgICAgIGxldCBpZCA9IG1hdGNoIGZpZWxkX3R5cGUgeworICAgICAgICAgICAgVFR5cGU6OlN0b3AgPT4gT2soMCksCisgICAgICAgICAgICBfID0+IHNlbGYucmVhZF9pMTYoKSwKKyAgICAgICAgfT87CisgICAgICAgIE9rKFRGaWVsZElkZW50aWZpZXI6Om5ldzo6PE9wdGlvbjxTdHJpbmc+LCBTdHJpbmcsIGkxNj4oCisgICAgICAgICAgICBOb25lLCBmaWVsZF90eXBlLCBpZCwKKyAgICAgICAgKSkKKyAgICB9CisKKyAgICBmbiByZWFkX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfYnl0ZXMoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxWZWM8dTg+PiB7CisgICAgICAgIGxldCBudW1fYnl0ZXMgPSBzZWxmLnRyYW5zcG9ydC5yZWFkX2kzMjo6PEJpZ0VuZGlhbj4oKT8gYXMgdXNpemU7CisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IG51bV9ieXRlc107CisgICAgICAgIHNlbGYudHJhbnNwb3J0CisgICAgICAgICAgICAucmVhZF9leGFjdCgmbXV0IGJ1ZikKKyAgICAgICAgICAgIC5tYXAofF98IGJ1ZikKKyAgICAgICAgICAgIC5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9ib29sKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8Ym9vbD4geworICAgICAgICBsZXQgYiA9IHNlbGYucmVhZF9pOCgpPzsKKyAgICAgICAgbWF0Y2ggYiB7CisgICAgICAgICAgICAwID0+IE9rKGZhbHNlKSwKKyAgICAgICAgICAgIF8gPT4gT2sodHJ1ZSksCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiByZWFkX2k4KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTg+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF9pOCgpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2kxNigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkxNj4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX2kxNjo6PEJpZ0VuZGlhbj4oKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9pMzIoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMzI+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF9pMzI6OjxCaWdFbmRpYW4+KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfaTY0KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTY0PiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfaTY0Ojo8QmlnRW5kaWFuPigpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2RvdWJsZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGY2ND4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX2Y2NDo6PEJpZ0VuZGlhbj4oKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJpbmcoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgbGV0IGJ5dGVzID0gc2VsZi5yZWFkX2J5dGVzKCk/OworICAgICAgICBTdHJpbmc6OmZyb21fdXRmOChieXRlcykubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfbGlzdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRMaXN0SWRlbnRpZmllcj4geworICAgICAgICBsZXQgZWxlbWVudF90eXBlOiBUVHlwZSA9IHNlbGYucmVhZF9ieXRlKCkuYW5kX3RoZW4oZmllbGRfdHlwZV9mcm9tX3U4KT87CisgICAgICAgIGxldCBzaXplID0gc2VsZi5yZWFkX2kzMigpPzsKKyAgICAgICAgT2soVExpc3RJZGVudGlmaWVyOjpuZXcoZWxlbWVudF90eXBlLCBzaXplKSkKKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9zZXRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUU2V0SWRlbnRpZmllcj4geworICAgICAgICBsZXQgZWxlbWVudF90eXBlOiBUVHlwZSA9IHNlbGYucmVhZF9ieXRlKCkuYW5kX3RoZW4oZmllbGRfdHlwZV9mcm9tX3U4KT87CisgICAgICAgIGxldCBzaXplID0gc2VsZi5yZWFkX2kzMigpPzsKKyAgICAgICAgT2soVFNldElkZW50aWZpZXI6Om5ldyhlbGVtZW50X3R5cGUsIHNpemUpKQorICAgIH0KKworICAgIGZuIHJlYWRfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfbWFwX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1hcElkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IGtleV90eXBlOiBUVHlwZSA9IHNlbGYucmVhZF9ieXRlKCkuYW5kX3RoZW4oZmllbGRfdHlwZV9mcm9tX3U4KT87CisgICAgICAgIGxldCB2YWx1ZV90eXBlOiBUVHlwZSA9IHNlbGYucmVhZF9ieXRlKCkuYW5kX3RoZW4oZmllbGRfdHlwZV9mcm9tX3U4KT87CisgICAgICAgIGxldCBzaXplID0gc2VsZi5yZWFkX2kzMigpPzsKKyAgICAgICAgT2soVE1hcElkZW50aWZpZXI6Om5ldyhrZXlfdHlwZSwgdmFsdWVfdHlwZSwgc2l6ZSkpCisgICAgfQorCisgICAgZm4gcmVhZF9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgLy8gdXRpbGl0eQorICAgIC8vCisKKyAgICBmbiByZWFkX2J5dGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDx1OD4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX3U4KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KK30KKworLy8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBgVEJpbmFyeUlucHV0UHJvdG9jb2xgLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeTsKKworaW1wbCBUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5YC4KKyAgICBwdWIgZm4gbmV3KCkgLT4gVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAgICAgVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5IHt9CisgICAgfQorfQorCitpbXBsIFRJbnB1dFByb3RvY29sRmFjdG9yeSBmb3IgVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICBmbiBjcmVhdGUoJnNlbGYsIHRyYW5zcG9ydDogQm94PFRSZWFkVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUSW5wdXRQcm90b2NvbCArIFNlbmQ+IHsKKyAgICAgICAgQm94OjpuZXcoVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyh0cmFuc3BvcnQsIHRydWUpKQorICAgIH0KK30KKworLy8vIFdyaXRlIG1lc3NhZ2VzIHVzaW5nIHRoZSBUaHJpZnQgc2ltcGxlIGJpbmFyeSBlbmNvZGluZy4KKy8vLworLy8vIFRoZXJlIGFyZSB0d28gYXZhaWxhYmxlIG1vZGVzOiBgc3RyaWN0YCBhbmQgYG5vbi1zdHJpY3RgLCB3aGVyZSB0aGUKKy8vLyBgc3RyaWN0YCB2ZXJzaW9uIHdyaXRlcyB0aGUgcHJvdG9jb2wgdmVyc2lvbiBudW1iZXIgaW4gdGhlIG91dGdvaW5nIG1lc3NhZ2UKKy8vLyBoZWFkZXIgYW5kIHRoZSBgbm9uLXN0cmljdGAgdmVyc2lvbiBkb2VzIG5vdC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRCaW5hcnlPdXRwdXRQcm90b2NvbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlPdXRwdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgcHJvdG9jb2wgPSBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsLCB0cnVlKTsKKy8vLworLy8vIHByb3RvY29sLndyaXRlX2Jvb2wodHJ1ZSkudW53cmFwKCk7CisvLy8gcHJvdG9jb2wud3JpdGVfc3RyaW5nKCJ0ZXN0X3N0cmluZyIpLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUQmluYXJ5T3V0cHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFdyaXRlVHJhbnNwb3J0LAoreworICAgIHN0cmljdDogYm9vbCwKKyAgICBwdWIgdHJhbnNwb3J0OiBULCAvLyBGSVhNRTogZG8gbm90IG1ha2UgcHVibGljOyBvbmx5IHB1YmxpYyBmb3IgdGVzdGluZyEKK30KKworaW1wbDxUPiBUQmluYXJ5T3V0cHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFdyaXRlVHJhbnNwb3J0LAoreworICAgIC8vLyBDcmVhdGUgYSBgVEJpbmFyeU91dHB1dFByb3RvY29sYCB0aGF0IHdyaXRlcyBieXRlcyB0byBgdHJhbnNwb3J0YC4KKyAgICAvLy8KKyAgICAvLy8gU2V0IGBzdHJpY3RgIHRvIGB0cnVlYCBpZiBhbGwgb3V0Z29pbmcgbWVzc2FnZXMgc2hvdWxkIGNvbnRhaW4gdGhlCisgICAgLy8vIHByb3RvY29sIHZlcnNpb24gbnVtYmVyIGluIHRoZSBwcm90b2NvbCBoZWFkZXIuCisgICAgcHViIGZuIG5ldyh0cmFuc3BvcnQ6IFQsIHN0cmljdDogYm9vbCkgLT4gVEJpbmFyeU91dHB1dFByb3RvY29sPFQ+IHsKKyAgICAgICAgVEJpbmFyeU91dHB1dFByb3RvY29sIHsKKyAgICAgICAgICAgIHN0cmljdDogc3RyaWN0LAorICAgICAgICAgICAgdHJhbnNwb3J0OiB0cmFuc3BvcnQsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGw8VD4gVE91dHB1dFByb3RvY29sIGZvciBUQmluYXJ5T3V0cHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFdyaXRlVHJhbnNwb3J0LAoreworICAgIGZuIHdyaXRlX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1lc3NhZ2VJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBpZiBzZWxmLnN0cmljdCB7CisgICAgICAgICAgICBsZXQgbWVzc2FnZV90eXBlOiB1OCA9IGlkZW50aWZpZXIubWVzc2FnZV90eXBlLmludG8oKTsKKyAgICAgICAgICAgIGxldCBoZWFkZXIgPSBCSU5BUllfUFJPVE9DT0xfVkVSU0lPTl8xIHwgKG1lc3NhZ2VfdHlwZSBhcyB1MzIpOworICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfdTMyOjo8QmlnRW5kaWFuPihoZWFkZXIpPzsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfc3RyaW5nKCZpZGVudGlmaWVyLm5hbWUpPzsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfaTMyKGlkZW50aWZpZXIuc2VxdWVuY2VfbnVtYmVyKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZi53cml0ZV9zdHJpbmcoJmlkZW50aWZpZXIubmFtZSk/OworICAgICAgICAgICAgc2VsZi53cml0ZV9ieXRlKGlkZW50aWZpZXIubWVzc2FnZV90eXBlLmludG8oKSk/OworICAgICAgICAgICAgc2VsZi53cml0ZV9pMzIoaWRlbnRpZmllci5zZXF1ZW5jZV9udW1iZXIpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiB3cml0ZV9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYsIF86ICZUU3RydWN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRGaWVsZElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGlmIGlkZW50aWZpZXIuaWQuaXNfbm9uZSgpICYmIGlkZW50aWZpZXIuZmllbGRfdHlwZSAhPSBUVHlwZTo6U3RvcCB7CisgICAgICAgICAgICByZXR1cm4gRXJyKDo6RXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoCisgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgd3JpdGUgaWRlbnRpZmllciB7Oj99IHdpdGhvdXQgc2VxdWVuY2UgbnVtYmVyIiwKKyAgICAgICAgICAgICAgICAgICAgJmlkZW50aWZpZXIKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgfSkpOworICAgICAgICB9CisKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKGZpZWxkX3R5cGVfdG9fdTgoaWRlbnRpZmllci5maWVsZF90eXBlKSk/OworICAgICAgICBpZiBsZXQgU29tZShpZCkgPSBpZGVudGlmaWVyLmlkIHsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfaTE2KGlkKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgT2soKCkpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9zdG9wKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKGZpZWxkX3R5cGVfdG9fdTgoVFR5cGU6OlN0b3ApKQorICAgIH0KKworICAgIGZuIHdyaXRlX2J5dGVzKCZtdXQgc2VsZiwgYjogJlt1OF0pIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfaTMyKGIubGVuKCkgYXMgaTMyKT87CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX2FsbChiKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gd3JpdGVfYm9vbCgmbXV0IHNlbGYsIGI6IGJvb2wpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGlmIGIgeworICAgICAgICAgICAgc2VsZi53cml0ZV9pOCgxKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZi53cml0ZV9pOCgwKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gd3JpdGVfaTgoJm11dCBzZWxmLCBpOiBpOCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfaTgoaSkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHdyaXRlX2kxNigmbXV0IHNlbGYsIGk6IGkxNikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfaTE2Ojo8QmlnRW5kaWFuPihpKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gd3JpdGVfaTMyKCZtdXQgc2VsZiwgaTogaTMyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV9pMzI6OjxCaWdFbmRpYW4+KGkpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pNjQoJm11dCBzZWxmLCBpOiBpNjQpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX2k2NDo6PEJpZ0VuZGlhbj4oaSkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHdyaXRlX2RvdWJsZSgmbXV0IHNlbGYsIGQ6IGY2NCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfZjY0Ojo8QmlnRW5kaWFuPihkKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RyaW5nKCZtdXQgc2VsZiwgczogJnN0cikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlcyhzLmFzX2J5dGVzKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTGlzdElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZShmaWVsZF90eXBlX3RvX3U4KGlkZW50aWZpZXIuZWxlbWVudF90eXBlKSk/OworICAgICAgICBzZWxmLndyaXRlX2kzMihpZGVudGlmaWVyLnNpemUpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zZXRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVFNldElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZShmaWVsZF90eXBlX3RvX3U4KGlkZW50aWZpZXIuZWxlbWVudF90eXBlKSk/OworICAgICAgICBzZWxmLndyaXRlX2kzMihpZGVudGlmaWVyLnNpemUpCisgICAgfQorCisgICAgZm4gd3JpdGVfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX21hcF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWFwSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IGtleV90eXBlID0gaWRlbnRpZmllcgorICAgICAgICAgICAgLmtleV90eXBlCisgICAgICAgICAgICAuZXhwZWN0KCJtYXAgaWRlbnRpZmllciB0byB3cml0ZSBzaG91bGQgY29udGFpbiBrZXkgdHlwZSIpOworICAgICAgICBzZWxmLndyaXRlX2J5dGUoZmllbGRfdHlwZV90b191OChrZXlfdHlwZSkpPzsKKyAgICAgICAgbGV0IHZhbF90eXBlID0gaWRlbnRpZmllcgorICAgICAgICAgICAgLnZhbHVlX3R5cGUKKyAgICAgICAgICAgIC5leHBlY3QoIm1hcCBpZGVudGlmaWVyIHRvIHdyaXRlIHNob3VsZCBjb250YWluIHZhbHVlIHR5cGUiKTsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKGZpZWxkX3R5cGVfdG9fdTgodmFsX3R5cGUpKT87CisgICAgICAgIHNlbGYud3JpdGVfaTMyKGlkZW50aWZpZXIuc2l6ZSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5mbHVzaCgpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICAvLyB1dGlsaXR5CisgICAgLy8KKworICAgIGZuIHdyaXRlX2J5dGUoJm11dCBzZWxmLCBiOiB1OCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfdTgoYikubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KK30KKworLy8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBgVEJpbmFyeU91dHB1dFByb3RvY29sYC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5OworCitpbXBsIFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeWAuCisgICAgcHViIGZuIG5ldygpIC0+IFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3RvcnkgeworICAgICAgICBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5IHt9CisgICAgfQorfQorCitpbXBsIFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgZm9yIFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3RvcnkgeworICAgIGZuIGNyZWF0ZSgmc2VsZiwgdHJhbnNwb3J0OiBCb3g8VFdyaXRlVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUT3V0cHV0UHJvdG9jb2wgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KHRyYW5zcG9ydCwgdHJ1ZSkpCisgICAgfQorfQorCitmbiBmaWVsZF90eXBlX3RvX3U4KGZpZWxkX3R5cGU6IFRUeXBlKSAtPiB1OCB7CisgICAgbWF0Y2ggZmllbGRfdHlwZSB7CisgICAgICAgIFRUeXBlOjpTdG9wID0+IDB4MDAsCisgICAgICAgIFRUeXBlOjpWb2lkID0+IDB4MDEsCisgICAgICAgIFRUeXBlOjpCb29sID0+IDB4MDIsCisgICAgICAgIFRUeXBlOjpJMDggPT4gMHgwMywgLy8gZXF1aXZhbGVudCB0byBUVHlwZTo6Qnl0ZQorICAgICAgICBUVHlwZTo6RG91YmxlID0+IDB4MDQsCisgICAgICAgIFRUeXBlOjpJMTYgPT4gMHgwNiwKKyAgICAgICAgVFR5cGU6OkkzMiA9PiAweDA4LAorICAgICAgICBUVHlwZTo6STY0ID0+IDB4MEEsCisgICAgICAgIFRUeXBlOjpTdHJpbmcgfCBUVHlwZTo6VXRmNyA9PiAweDBCLAorICAgICAgICBUVHlwZTo6U3RydWN0ID0+IDB4MEMsCisgICAgICAgIFRUeXBlOjpNYXAgPT4gMHgwRCwKKyAgICAgICAgVFR5cGU6OlNldCA9PiAweDBFLAorICAgICAgICBUVHlwZTo6TGlzdCA9PiAweDBGLAorICAgICAgICBUVHlwZTo6VXRmOCA9PiAweDEwLAorICAgICAgICBUVHlwZTo6VXRmMTYgPT4gMHgxMSwKKyAgICB9Cit9CisKK2ZuIGZpZWxkX3R5cGVfZnJvbV91OChiOiB1OCkgLT4gOjpSZXN1bHQ8VFR5cGU+IHsKKyAgICBtYXRjaCBiIHsKKyAgICAgICAgMHgwMCA9PiBPayhUVHlwZTo6U3RvcCksCisgICAgICAgIDB4MDEgPT4gT2soVFR5cGU6OlZvaWQpLAorICAgICAgICAweDAyID0+IE9rKFRUeXBlOjpCb29sKSwKKyAgICAgICAgMHgwMyA9PiBPayhUVHlwZTo6STA4KSwgLy8gRXF1aXZhbGVudCB0byBUVHlwZTo6Qnl0ZQorICAgICAgICAweDA0ID0+IE9rKFRUeXBlOjpEb3VibGUpLAorICAgICAgICAweDA2ID0+IE9rKFRUeXBlOjpJMTYpLAorICAgICAgICAweDA4ID0+IE9rKFRUeXBlOjpJMzIpLAorICAgICAgICAweDBBID0+IE9rKFRUeXBlOjpJNjQpLAorICAgICAgICAweDBCID0+IE9rKFRUeXBlOjpTdHJpbmcpLCAvLyB0ZWNobmljYWxseSwgYWxzbyBhIFVURjcsIGJ1dCB3ZSdsbCB0cmVhdCBpdCBhcyBzdHJpbmcKKyAgICAgICAgMHgwQyA9PiBPayhUVHlwZTo6U3RydWN0KSwKKyAgICAgICAgMHgwRCA9PiBPayhUVHlwZTo6TWFwKSwKKyAgICAgICAgMHgwRSA9PiBPayhUVHlwZTo6U2V0KSwKKyAgICAgICAgMHgwRiA9PiBPayhUVHlwZTo6TGlzdCksCisgICAgICAgIDB4MTAgPT4gT2soVFR5cGU6OlV0ZjgpLAorICAgICAgICAweDExID0+IE9rKFRUeXBlOjpVdGYxNiksCisgICAgICAgIHVua24gPT4gRXJyKDo6RXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAga2luZDogUHJvdG9jb2xFcnJvcktpbmQ6OkludmFsaWREYXRhLAorICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY2Fubm90IGNvbnZlcnQge30gdG8gVFR5cGUiLCB1bmtuKSwKKyAgICAgICAgfSkpLAorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworCisgICAgdXNlIHByb3RvY29sOjp7CisgICAgICAgIFRGaWVsZElkZW50aWZpZXIsIFRJbnB1dFByb3RvY29sLCBUTGlzdElkZW50aWZpZXIsIFRNYXBJZGVudGlmaWVyLCBUTWVzc2FnZUlkZW50aWZpZXIsCisgICAgICAgIFRNZXNzYWdlVHlwZSwgVE91dHB1dFByb3RvY29sLCBUU2V0SWRlbnRpZmllciwgVFN0cnVjdElkZW50aWZpZXIsIFRUeXBlLAorICAgIH07CisgICAgdXNlIHRyYW5zcG9ydDo6e1JlYWRIYWxmLCBUQnVmZmVyQ2hhbm5lbCwgVElvQ2hhbm5lbCwgV3JpdGVIYWxmfTsKKworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cmljdF9tZXNzYWdlX2NhbGxfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInRlc3QiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEpOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDE2XSA9IFsKKyAgICAgICAgICAgIDB4ODAsCisgICAgICAgICAgICAweDAxLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDEsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDA0LAorICAgICAgICAgICAgMHg3NCwKKyAgICAgICAgICAgIDB4NjUsCisgICAgICAgICAgICAweDczLAorICAgICAgICAgICAgMHg3NCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDEsCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX25vbl9zdHJpY3RfbWVzc2FnZV9jYWxsX2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKGZhbHNlKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygidGVzdCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMSk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50KS5pc19vaygpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMTNdID0gWworICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwNCwKKyAgICAgICAgICAgIDB4NzQsCisgICAgICAgICAgICAweDY1LAorICAgICAgICAgICAgMHg3MywKKyAgICAgICAgICAgIDB4NzQsCisgICAgICAgICAgICAweDAxLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMSwKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3RyaWN0X21lc3NhZ2VfcmVwbHlfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInRlc3QiLCBUTWVzc2FnZVR5cGU6OlJlcGx5LCAxMCk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50KS5pc19vaygpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMTZdID0gWworICAgICAgICAgICAgMHg4MCwKKyAgICAgICAgICAgIDB4MDEsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMiwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDQsCisgICAgICAgICAgICAweDc0LAorICAgICAgICAgICAgMHg2NSwKKyAgICAgICAgICAgIDB4NzMsCisgICAgICAgICAgICAweDc0LAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwQSwKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbm9uX3N0cmljdF9tZXNzYWdlX3JlcGx5X2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKGZhbHNlKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygidGVzdCIsIFRNZXNzYWdlVHlwZTo6UmVwbHksIDEwKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxM10gPSBbCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDA0LAorICAgICAgICAgICAgMHg3NCwKKyAgICAgICAgICAgIDB4NjUsCisgICAgICAgICAgICAweDczLAorICAgICAgICAgICAgMHg3NCwKKyAgICAgICAgICAgIDB4MDIsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDBBLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX3N0cmljdF9tZXNzYWdlX2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGxldCBzZW50X2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInRlc3QiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEpOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZzZW50X2lkZW50KS5pc19vaygpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVjZWl2ZWRfaWRlbnQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbWVzc2FnZV9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfaWRlbnQsICZzZW50X2lkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX25vbl9zdHJpY3RfbWVzc2FnZV9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyhmYWxzZSk7CisKKyAgICAgICAgbGV0IHNlbnRfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygidGVzdCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMSk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJnNlbnRfaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZWNlaXZlZF9pZGVudCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9tZXNzYWdlX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZWNlaXZlZF9pZGVudCwgJnNlbnRfaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21lc3NhZ2VfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfbWVzc2FnZV9lbmQoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3RydWN0X2JlZ2luKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUoCisgICAgICAgICAgICB8b3wgby53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3RydWN0X2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX3N0cnVjdF9lbmQoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfZmllbGRfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3QKKyAgICAgICAgICAgIC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJzb21lX2ZpZWxkIiwgVFR5cGU6OlN0cmluZywgMjIpKQorICAgICAgICAgICAgLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAzXSA9IFsweDBCLCAweDAwLCAweDE2XTsKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfZmllbGRfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgbGV0IHNlbnRfZmllbGRfaWRlbnQgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDIwKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJnNlbnRfZmllbGRfaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCBleHBlY3RlZF9pZGVudCA9IFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpJNjQsCisgICAgICAgICAgICBpZDogU29tZSgyMCksCisgICAgICAgIH07IC8vIG5vIG5hbWUKKyAgICAgICAgbGV0IHJlY2VpdmVkX2lkZW50ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZWNlaXZlZF9pZGVudCwgJmV4cGVjdGVkX2lkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdG9wX2ZpZWxkKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKS5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMV0gPSBbMHgwMF07CisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX2ZpZWxkX3N0b3AoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpLmlzX29rKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCBleHBlY3RlZF9pZGVudCA9IFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgaWQ6IFNvbWUoMCksCisgICAgICAgIH07IC8vIHdlIGdldCBpZCAwCisKKyAgICAgICAgbGV0IHJlY2VpdmVkX2lkZW50ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZWNlaXZlZF9pZGVudCwgJmV4cGVjdGVkX2lkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9maWVsZF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9maWVsZF9lbmQoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbGlzdF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdAorICAgICAgICAgICAgLndyaXRlX2xpc3RfYmVnaW4oJlRMaXN0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpCb29sLCA1KSkKKyAgICAgICAgICAgIC5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgNV0gPSBbMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNV07CisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX2xpc3RfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVExpc3RJZGVudGlmaWVyOjpuZXcoVFR5cGU6Okxpc3QsIDkwMCk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX2xpc3RfYmVnaW4oJmlkZW50KS5pc19vaygpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVjZWl2ZWRfaWRlbnQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbGlzdF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfaWRlbnQsICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbGlzdF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9saXN0X2VuZCgpLCB0cnVlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zZXRfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3QKKyAgICAgICAgICAgIC53cml0ZV9zZXRfYmVnaW4oJlRTZXRJZGVudGlmaWVyOjpuZXcoVFR5cGU6OkkxNiwgNykpCisgICAgICAgICAgICAuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDVdID0gWzB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDddOworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zZXRfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVFNldElkZW50aWZpZXI6Om5ldyhUVHlwZTo6STY0LCAyMDAwKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfc2V0X2JlZ2luKCZpZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlY2VpdmVkX2lkZW50X3Jlc3VsdCA9IGlfcHJvdC5yZWFkX3NldF9iZWdpbigpOworICAgICAgICBhc3NlcnQhKHJlY2VpdmVkX2lkZW50X3Jlc3VsdC5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfaWRlbnRfcmVzdWx0LnVud3JhcCgpLCAmaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3NldF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9zZXRfZW5kKCksIHRydWUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21hcF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdAorICAgICAgICAgICAgLndyaXRlX21hcF9iZWdpbigmVE1hcElkZW50aWZpZXI6Om5ldyhUVHlwZTo6STY0LCBUVHlwZTo6U3RydWN0LCAzMikpCisgICAgICAgICAgICAuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDZdID0gWzB4MEEsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjBdOworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9tYXBfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1hcElkZW50aWZpZXI6Om5ldyhUVHlwZTo6TWFwLCBUVHlwZTo6U2V0LCAxMDApOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9tYXBfYmVnaW4oJmlkZW50KS5pc19vaygpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVjZWl2ZWRfaWRlbnQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbWFwX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZWNlaXZlZF9pZGVudCwgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tYXBfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfbWFwX2VuZCgpLCB0cnVlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9ib29sX3RydWUoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfYm9vbCh0cnVlKS5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMV0gPSBbMHgwMV07CisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9ib29sX2ZhbHNlKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX2Jvb2woZmFsc2UpLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxXSA9IFsweDAwXTsKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JlYWRfYm9vbF90cnVlKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIF8pID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIHNldF9yZWFkYWJsZV9ieXRlcyEoaV9wcm90LCAmWzB4MDFdKTsKKworICAgICAgICBsZXQgcmVhZF9ib29sID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9ib29sLCB0cnVlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX2Jvb2xfZmFsc2UoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgXykgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgc2V0X3JlYWRhYmxlX2J5dGVzIShpX3Byb3QsICZbMHgwMF0pOworCisgICAgICAgIGxldCByZWFkX2Jvb2wgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX2Jvb2wsIGZhbHNlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9hbGxvd19hbnlfbm9uX3plcm9fdmFsdWVfdG9fYmVfaW50ZXJwcmV0ZWRfYXNfYm9vbF90cnVlKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIF8pID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIHNldF9yZWFkYWJsZV9ieXRlcyEoaV9wcm90LCAmWzB4QUNdKTsKKworICAgICAgICBsZXQgcmVhZF9ib29sID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9ib29sLCB0cnVlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9ieXRlcygpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBsZXQgYnl0ZXM6IFt1ODsgMTBdID0gWzB4MEEsIDB4Q0MsIDB4RDEsIDB4ODQsIDB4OTksIDB4MTIsIDB4QUIsIDB4QkIsIDB4NDUsIDB4REZdOworCisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX2J5dGVzKCZieXRlcykuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGJ1ZiA9IG9fcHJvdC50cmFuc3BvcnQud3JpdGVfYnl0ZXMoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWzAuLjRdLCBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwQV0pOyAvLyBsZW5ndGgKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWzQuLl0sIGJ5dGVzKTsgLy8gYWN0dWFsIGJ5dGVzCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9ieXRlcygpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgYnl0ZXM6IFt1ODsgMjVdID0gWworICAgICAgICAgICAgMHgyMCwKKyAgICAgICAgICAgIDB4RkQsCisgICAgICAgICAgICAweDE4LAorICAgICAgICAgICAgMHg4NCwKKyAgICAgICAgICAgIDB4OTksCisgICAgICAgICAgICAweDEyLAorICAgICAgICAgICAgMHhBQiwKKyAgICAgICAgICAgIDB4QkIsCisgICAgICAgICAgICAweDQ1LAorICAgICAgICAgICAgMHhERiwKKyAgICAgICAgICAgIDB4MzQsCisgICAgICAgICAgICAweERDLAorICAgICAgICAgICAgMHg5OCwKKyAgICAgICAgICAgIDB4QTQsCisgICAgICAgICAgICAweDZELAorICAgICAgICAgICAgMHhGMywKKyAgICAgICAgICAgIDB4OTksCisgICAgICAgICAgICAweEI0LAorICAgICAgICAgICAgMHhCNywKKyAgICAgICAgICAgIDB4RDQsCisgICAgICAgICAgICAweDlDLAorICAgICAgICAgICAgMHhBNSwKKyAgICAgICAgICAgIDB4QjMsCisgICAgICAgICAgICAweEM5LAorICAgICAgICAgICAgMHg4OCwKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9ieXRlcygmYnl0ZXMpLmlzX29rKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZWNlaXZlZF9ieXRlcyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ieXRlcygpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfYnl0ZXMsICZieXRlcyk7CisgICAgfQorCisgICAgZm4gdGVzdF9vYmplY3RzKAorICAgICAgICBzdHJpY3Q6IGJvb2wsCisgICAgKSAtPiAoCisgICAgICAgIFRCaW5hcnlJbnB1dFByb3RvY29sPFJlYWRIYWxmPFRCdWZmZXJDaGFubmVsPj4sCisgICAgICAgIFRCaW5hcnlPdXRwdXRQcm90b2NvbDxXcml0ZUhhbGY8VEJ1ZmZlckNoYW5uZWw+PiwKKyAgICApIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDQwLCA0MCk7CisKKyAgICAgICAgbGV0IChyX21lbSwgd19tZW0pID0gbWVtLnNwbGl0KCkudW53cmFwKCk7CisKKyAgICAgICAgbGV0IGlfcHJvdCA9IFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcocl9tZW0sIHN0cmljdCk7CisgICAgICAgIGxldCBvX3Byb3QgPSBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyh3X21lbSwgc3RyaWN0KTsKKworICAgICAgICAoaV9wcm90LCBvX3Byb3QpCisgICAgfQorCisgICAgZm4gYXNzZXJ0X25vX3dyaXRlPEY+KG11dCB3cml0ZV9mbjogRiwgc3RyaWN0OiBib29sKQorICAgIHdoZXJlCisgICAgICAgIEY6IEZuTXV0KCZtdXQgVEJpbmFyeU91dHB1dFByb3RvY29sPFdyaXRlSGFsZjxUQnVmZmVyQ2hhbm5lbD4+KSAtPiA6OlJlc3VsdDwoKT4sCisgICAgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHN0cmljdCk7CisgICAgICAgIGFzc2VydCEod3JpdGVfZm4oJm11dCBvX3Byb3QpLmlzX29rKCkpOworICAgICAgICBhc3NlcnRfZXEhKG9fcHJvdC50cmFuc3BvcnQud3JpdGVfYnl0ZXMoKS5sZW4oKSwgMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9wcm90b2NvbC9jb21wYWN0LnJzIGIvbGliL3JzL3NyYy9wcm90b2NvbC9jb21wYWN0LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNWVkYWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3Byb3RvY29sL2NvbXBhY3QucnMKQEAgLTAsMCArMSwyMzg2IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBieXRlb3JkZXI6OntCaWdFbmRpYW4sIFJlYWRCeXRlc0V4dCwgV3JpdGVCeXRlc0V4dH07Cit1c2UgaW50ZWdlcl9lbmNvZGluZzo6e1ZhckludFJlYWRlciwgVmFySW50V3JpdGVyfTsKK3VzZSBzdGQ6OmNvbnZlcnQ6OkZyb207Cit1c2Ugc3RkOjppbzsKK3VzZSB0cnlfZnJvbTo6VHJ5RnJvbTsKKwordXNlIHN1cGVyOjp7CisgICAgVEZpZWxkSWRlbnRpZmllciwgVElucHV0UHJvdG9jb2wsIFRJbnB1dFByb3RvY29sRmFjdG9yeSwgVExpc3RJZGVudGlmaWVyLCBUTWFwSWRlbnRpZmllciwKKyAgICBUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZSwKK307Cit1c2Ugc3VwZXI6OntUT3V0cHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbEZhY3RvcnksIFRTZXRJZGVudGlmaWVyLCBUU3RydWN0SWRlbnRpZmllciwgVFR5cGV9OwordXNlIHRyYW5zcG9ydDo6e1RSZWFkVHJhbnNwb3J0LCBUV3JpdGVUcmFuc3BvcnR9OworCitjb25zdCBDT01QQUNUX1BST1RPQ09MX0lEOiB1OCA9IDB4ODI7Citjb25zdCBDT01QQUNUX1ZFUlNJT046IHU4ID0gMHgwMTsKK2NvbnN0IENPTVBBQ1RfVkVSU0lPTl9NQVNLOiB1OCA9IDB4MUY7CisKKy8vLyBSZWFkIG1lc3NhZ2VzIGVuY29kZWQgaW4gdGhlIFRocmlmdCBjb21wYWN0IHByb3RvY29sLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVENvbXBhY3RJbnB1dFByb3RvY29sYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VENvbXBhY3RJbnB1dFByb3RvY29sLCBUSW5wdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHByb3RvY29sID0gVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCk7CisvLy8KKy8vLyBsZXQgcmVjdmRfYm9vbCA9IHByb3RvY29sLnJlYWRfYm9vbCgpLnVud3JhcCgpOworLy8vIGxldCByZWN2ZF9zdHJpbmcgPSBwcm90b2NvbC5yZWFkX3N0cmluZygpLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUQ29tcGFjdElucHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFJlYWRUcmFuc3BvcnQsCit7CisgICAgLy8gSWRlbnRpZmllciBvZiB0aGUgbGFzdCBmaWVsZCBkZXNlcmlhbGl6ZWQgZm9yIGEgc3RydWN0LgorICAgIGxhc3RfcmVhZF9maWVsZF9pZDogaTE2LAorICAgIC8vIFN0YWNrIG9mIHRoZSBsYXN0IHJlYWQgZmllbGQgaWRzIChhIG5ldyBlbnRyeSBpcyBhZGRlZCBlYWNoIHRpbWUgYSBuZXN0ZWQgc3RydWN0IGlzIHJlYWQpLgorICAgIHJlYWRfZmllbGRfaWRfc3RhY2s6IFZlYzxpMTY+LAorICAgIC8vIEJvb2xlYW4gdmFsdWUgZm9yIGEgZmllbGQuCisgICAgLy8gU2F2ZWQgYmVjYXVzZSBib29sZWFuIGZpZWxkcyBhbmQgdGhlaXIgdmFsdWUgYXJlIGVuY29kZWQgaW4gYSBzaW5nbGUgYnl0ZSwKKyAgICAvLyBhbmQgcmVhZGluZyB0aGUgZmllbGQgb25seSBvY2N1cnMgYWZ0ZXIgdGhlIGZpZWxkIGlkIGlzIHJlYWQuCisgICAgcGVuZGluZ19yZWFkX2Jvb2xfdmFsdWU6IE9wdGlvbjxib29sPiwKKyAgICAvLyBVbmRlcmx5aW5nIHRyYW5zcG9ydCB1c2VkIGZvciBieXRlLWxldmVsIG9wZXJhdGlvbnMuCisgICAgdHJhbnNwb3J0OiBULAorfQorCitpbXBsPFQ+IFRDb21wYWN0SW5wdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUUmVhZFRyYW5zcG9ydCwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRDb21wYWN0SW5wdXRQcm90b2NvbGAgdGhhdCByZWFkcyBieXRlcyBmcm9tIGB0cmFuc3BvcnRgLgorICAgIHB1YiBmbiBuZXcodHJhbnNwb3J0OiBUKSAtPiBUQ29tcGFjdElucHV0UHJvdG9jb2w8VD4geworICAgICAgICBUQ29tcGFjdElucHV0UHJvdG9jb2wgeworICAgICAgICAgICAgbGFzdF9yZWFkX2ZpZWxkX2lkOiAwLAorICAgICAgICAgICAgcmVhZF9maWVsZF9pZF9zdGFjazogVmVjOjpuZXcoKSwKKyAgICAgICAgICAgIHBlbmRpbmdfcmVhZF9ib29sX3ZhbHVlOiBOb25lLAorICAgICAgICAgICAgdHJhbnNwb3J0OiB0cmFuc3BvcnQsCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3Rfc2V0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KFRUeXBlLCBpMzIpPiB7CisgICAgICAgIGxldCBoZWFkZXIgPSBzZWxmLnJlYWRfYnl0ZSgpPzsKKyAgICAgICAgbGV0IGVsZW1lbnRfdHlwZSA9IGNvbGxlY3Rpb25fdThfdG9fdHlwZShoZWFkZXIgJiAweDBGKT87CisKKyAgICAgICAgbGV0IGVsZW1lbnRfY291bnQ7CisgICAgICAgIGxldCBwb3NzaWJsZV9lbGVtZW50X2NvdW50ID0gKGhlYWRlciAmIDB4RjApID4+IDQ7CisgICAgICAgIGlmIHBvc3NpYmxlX2VsZW1lbnRfY291bnQgIT0gMTUgeworICAgICAgICAgICAgLy8gaGlnaCBiaXRzIHNldCBoaWdoIGlmIGNvdW50IGFuZCB0eXBlIGVuY29kZWQgc2VwYXJhdGVseQorICAgICAgICAgICAgZWxlbWVudF9jb3VudCA9IHBvc3NpYmxlX2VsZW1lbnRfY291bnQgYXMgaTMyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZWxlbWVudF9jb3VudCA9IHNlbGYudHJhbnNwb3J0LnJlYWRfdmFyaW50Ojo8dTMyPigpPyBhcyBpMzI7CisgICAgICAgIH0KKworICAgICAgICBPaygoZWxlbWVudF90eXBlLCBlbGVtZW50X2NvdW50KSkKKyAgICB9Cit9CisKK2ltcGw8VD4gVElucHV0UHJvdG9jb2wgZm9yIFRDb21wYWN0SW5wdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUUmVhZFRyYW5zcG9ydCwKK3sKKyAgICBmbiByZWFkX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWVzc2FnZUlkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IGNvbXBhY3RfaWQgPSBzZWxmLnJlYWRfYnl0ZSgpPzsKKyAgICAgICAgaWYgY29tcGFjdF9pZCAhPSBDT01QQUNUX1BST1RPQ09MX0lEIHsKKyAgICAgICAgICAgIEVycig6OkVycm9yOjpQcm90b2NvbCg6OlByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IDo6UHJvdG9jb2xFcnJvcktpbmQ6OkJhZFZlcnNpb24sCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiaW52YWxpZCBjb21wYWN0IHByb3RvY29sIGhlYWRlciB7Oj99IiwgY29tcGFjdF9pZCksCisgICAgICAgICAgICB9KSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9rKCgpKQorICAgICAgICB9PzsKKworICAgICAgICBsZXQgdHlwZV9hbmRfYnl0ZSA9IHNlbGYucmVhZF9ieXRlKCk/OworICAgICAgICBsZXQgcmVjZWl2ZWRfdmVyc2lvbiA9IHR5cGVfYW5kX2J5dGUgJiBDT01QQUNUX1ZFUlNJT05fTUFTSzsKKyAgICAgICAgaWYgcmVjZWl2ZWRfdmVyc2lvbiAhPSBDT01QQUNUX1ZFUlNJT04geworICAgICAgICAgICAgRXJyKDo6RXJyb3I6OlByb3RvY29sKDo6UHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogOjpQcm90b2NvbEVycm9yS2luZDo6QmFkVmVyc2lvbiwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKAorICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHByb2Nlc3MgY29tcGFjdCBwcm90b2NvbCB2ZXJzaW9uIHs6P30iLAorICAgICAgICAgICAgICAgICAgICByZWNlaXZlZF92ZXJzaW9uCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIH0pKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgT2soKCkpCisgICAgICAgIH0/OworCisgICAgICAgIC8vIE5PVEU6IHVuc2lnbmVkIHJpZ2h0IHNoaWZ0IHdpbGwgcGFkIHdpdGggMHMKKyAgICAgICAgbGV0IG1lc3NhZ2VfdHlwZTogVE1lc3NhZ2VUeXBlID0gVE1lc3NhZ2VUeXBlOjp0cnlfZnJvbSh0eXBlX2FuZF9ieXRlID4+IDUpPzsKKyAgICAgICAgbGV0IHNlcXVlbmNlX251bWJlciA9IHNlbGYucmVhZF9pMzIoKT87CisgICAgICAgIGxldCBzZXJ2aWNlX2NhbGxfbmFtZSA9IHNlbGYucmVhZF9zdHJpbmcoKT87CisKKyAgICAgICAgc2VsZi5sYXN0X3JlYWRfZmllbGRfaWQgPSAwOworCisgICAgICAgIE9rKFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KAorICAgICAgICAgICAgc2VydmljZV9jYWxsX25hbWUsCisgICAgICAgICAgICBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICBzZXF1ZW5jZV9udW1iZXIsCisgICAgICAgICkpCisgICAgfQorCisgICAgZm4gcmVhZF9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RydWN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8T3B0aW9uPFRTdHJ1Y3RJZGVudGlmaWVyPj4geworICAgICAgICBzZWxmLnJlYWRfZmllbGRfaWRfc3RhY2sucHVzaChzZWxmLmxhc3RfcmVhZF9maWVsZF9pZCk7CisgICAgICAgIHNlbGYubGFzdF9yZWFkX2ZpZWxkX2lkID0gMDsKKyAgICAgICAgT2soTm9uZSkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmxhc3RfcmVhZF9maWVsZF9pZCA9IHNlbGYKKyAgICAgICAgICAgIC5yZWFkX2ZpZWxkX2lkX3N0YWNrCisgICAgICAgICAgICAucG9wKCkKKyAgICAgICAgICAgIC5leHBlY3QoInNob3VsZCBoYXZlIHByZXZpb3VzIGZpZWxkIGlkcyIpOworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VEZpZWxkSWRlbnRpZmllcj4geworICAgICAgICAvLyB3ZSBjYW4gcmVhZCBhdCBsZWFzdCBvbmUgYnl0ZSwgd2hpY2ggaXM6CisgICAgICAgIC8vIC0gdGhlIHR5cGUKKyAgICAgICAgLy8gLSB0aGUgZmllbGQgZGVsdGEgYW5kIHRoZSB0eXBlCisgICAgICAgIGxldCBmaWVsZF90eXBlID0gc2VsZi5yZWFkX2J5dGUoKT87CisgICAgICAgIGxldCBmaWVsZF9kZWx0YSA9IChmaWVsZF90eXBlICYgMHhGMCkgPj4gNDsKKyAgICAgICAgbGV0IGZpZWxkX3R5cGUgPSBtYXRjaCBmaWVsZF90eXBlICYgMHgwRiB7CisgICAgICAgICAgICAweDAxID0+IHsKKyAgICAgICAgICAgICAgICBzZWxmLnBlbmRpbmdfcmVhZF9ib29sX3ZhbHVlID0gU29tZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBPayhUVHlwZTo6Qm9vbCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIDB4MDIgPT4geworICAgICAgICAgICAgICAgIHNlbGYucGVuZGluZ19yZWFkX2Jvb2xfdmFsdWUgPSBTb21lKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBPayhUVHlwZTo6Qm9vbCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHR0dTggPT4gdThfdG9fdHlwZSh0dHU4KSwKKyAgICAgICAgfT87CisKKyAgICAgICAgbWF0Y2ggZmllbGRfdHlwZSB7CisgICAgICAgICAgICBUVHlwZTo6U3RvcCA9PiBPaygKKyAgICAgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyOjpuZXc6OjxPcHRpb248U3RyaW5nPiwgU3RyaW5nLCBPcHRpb248aTE2Pj4oCisgICAgICAgICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICApLAorICAgICAgICAgICAgXyA9PiB7CisgICAgICAgICAgICAgICAgaWYgZmllbGRfZGVsdGEgIT0gMCB7CisgICAgICAgICAgICAgICAgICAgIHNlbGYubGFzdF9yZWFkX2ZpZWxkX2lkICs9IGZpZWxkX2RlbHRhIGFzIGkxNjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZWxmLmxhc3RfcmVhZF9maWVsZF9pZCA9IHNlbGYucmVhZF9pMTYoKT87CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIE9rKFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICBpZDogU29tZShzZWxmLmxhc3RfcmVhZF9maWVsZF9pZCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHJlYWRfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9ib29sKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8Ym9vbD4geworICAgICAgICBtYXRjaCBzZWxmLnBlbmRpbmdfcmVhZF9ib29sX3ZhbHVlLnRha2UoKSB7CisgICAgICAgICAgICBTb21lKGIpID0+IE9rKGIpLAorICAgICAgICAgICAgTm9uZSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGIgPSBzZWxmLnJlYWRfYnl0ZSgpPzsKKyAgICAgICAgICAgICAgICBtYXRjaCBiIHsKKyAgICAgICAgICAgICAgICAgICAgMHgwMSA9PiBPayh0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgMHgwMiA9PiBPayhmYWxzZSksCisgICAgICAgICAgICAgICAgICAgIHVua24gPT4gRXJyKDo6RXJyb3I6OlByb3RvY29sKDo6UHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAgICAgICAgICBraW5kOiA6OlByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBjb252ZXJ0IHt9IGludG8gYm9vbCIsIHVua24pLAorICAgICAgICAgICAgICAgICAgICB9KSksCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gcmVhZF9ieXRlcygmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFZlYzx1OD4+IHsKKyAgICAgICAgbGV0IGxlbiA9IHNlbGYudHJhbnNwb3J0LnJlYWRfdmFyaW50Ojo8dTMyPigpPzsKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzB1ODsgbGVuIGFzIHVzaXplXTsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQKKyAgICAgICAgICAgIC5yZWFkX2V4YWN0KCZtdXQgYnVmKQorICAgICAgICAgICAgLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICAgICAgICAgIC5tYXAofF98IGJ1ZikKKyAgICB9CisKKyAgICBmbiByZWFkX2k4KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTg+IHsKKyAgICAgICAgc2VsZi5yZWFkX2J5dGUoKS5tYXAofGl8IGkgYXMgaTgpCisgICAgfQorCisgICAgZm4gcmVhZF9pMTYoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMTY+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF92YXJpbnQ6OjxpMTY+KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfaTMyKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTMyPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfdmFyaW50Ojo8aTMyPigpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2k2NCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk2ND4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX3ZhcmludDo6PGk2ND4oKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9kb3VibGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxmNjQ+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF9mNjQ6OjxCaWdFbmRpYW4+KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RyaW5nKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgIGxldCBieXRlcyA9IHNlbGYucmVhZF9ieXRlcygpPzsKKyAgICAgICAgU3RyaW5nOjpmcm9tX3V0ZjgoYnl0ZXMpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTGlzdElkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IChlbGVtZW50X3R5cGUsIGVsZW1lbnRfY291bnQpID0gc2VsZi5yZWFkX2xpc3Rfc2V0X2JlZ2luKCk/OworICAgICAgICBPayhUTGlzdElkZW50aWZpZXI6Om5ldyhlbGVtZW50X3R5cGUsIGVsZW1lbnRfY291bnQpKQorICAgIH0KKworICAgIGZuIHJlYWRfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX3NldF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRTZXRJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCAoZWxlbWVudF90eXBlLCBlbGVtZW50X2NvdW50KSA9IHNlbGYucmVhZF9saXN0X3NldF9iZWdpbigpPzsKKyAgICAgICAgT2soVFNldElkZW50aWZpZXI6Om5ldyhlbGVtZW50X3R5cGUsIGVsZW1lbnRfY291bnQpKQorICAgIH0KKworICAgIGZuIHJlYWRfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfbWFwX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1hcElkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IGVsZW1lbnRfY291bnQgPSBzZWxmLnRyYW5zcG9ydC5yZWFkX3ZhcmludDo6PHUzMj4oKT8gYXMgaTMyOworICAgICAgICBpZiBlbGVtZW50X2NvdW50ID09IDAgeworICAgICAgICAgICAgT2soVE1hcElkZW50aWZpZXI6Om5ldyhOb25lLCBOb25lLCAwKSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxldCB0eXBlX2hlYWRlciA9IHNlbGYucmVhZF9ieXRlKCk/OworICAgICAgICAgICAgbGV0IGtleV90eXBlID0gY29sbGVjdGlvbl91OF90b190eXBlKCh0eXBlX2hlYWRlciAmIDB4RjApID4+IDQpPzsKKyAgICAgICAgICAgIGxldCB2YWxfdHlwZSA9IGNvbGxlY3Rpb25fdThfdG9fdHlwZSh0eXBlX2hlYWRlciAmIDB4MEYpPzsKKyAgICAgICAgICAgIE9rKFRNYXBJZGVudGlmaWVyOjpuZXcoa2V5X3R5cGUsIHZhbF90eXBlLCBlbGVtZW50X2NvdW50KSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHJlYWRfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIC8vIHV0aWxpdHkKKyAgICAvLworCisgICAgZm4gcmVhZF9ieXRlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8dTg+IHsKKyAgICAgICAgbGV0IG11dCBidWYgPSBbMHU4OyAxXTsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQKKyAgICAgICAgICAgIC5yZWFkX2V4YWN0KCZtdXQgYnVmKQorICAgICAgICAgICAgLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICAgICAgICAgIC5tYXAofF98IGJ1ZlswXSkKKyAgICB9Cit9CisKK2ltcGw8VD4gaW86OlNlZWsgZm9yIFRDb21wYWN0SW5wdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBpbzo6U2VlayArIFRSZWFkVHJhbnNwb3J0LAoreworICAgIGZuIHNlZWsoJm11dCBzZWxmLCBwb3M6IGlvOjpTZWVrRnJvbSkgLT4gaW86OlJlc3VsdDx1NjQ+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQuc2Vlayhwb3MpCisgICAgfQorfQorCisvLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIGBUQ29tcGFjdElucHV0UHJvdG9jb2xgLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3Rvcnk7CisKK2ltcGwgVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5YC4KKyAgICBwdWIgZm4gbmV3KCkgLT4gVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgICAgIFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3Rvcnkge30KKyAgICB9Cit9CisKK2ltcGwgVElucHV0UHJvdG9jb2xGYWN0b3J5IGZvciBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICBmbiBjcmVhdGUoJnNlbGYsIHRyYW5zcG9ydDogQm94PFRSZWFkVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUSW5wdXRQcm90b2NvbCArIFNlbmQ+IHsKKyAgICAgICAgQm94OjpuZXcoVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcodHJhbnNwb3J0KSkKKyAgICB9Cit9CisKKy8vLyBXcml0ZSBtZXNzYWdlcyB1c2luZyB0aGUgVGhyaWZ0IGNvbXBhY3QgcHJvdG9jb2wuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUQ29tcGFjdE91dHB1dFByb3RvY29sYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VENvbXBhY3RPdXRwdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgcHJvdG9jb2wgPSBUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCk7CisvLy8KKy8vLyBwcm90b2NvbC53cml0ZV9ib29sKHRydWUpLnVud3JhcCgpOworLy8vIHByb3RvY29sLndyaXRlX3N0cmluZygidGVzdF9zdHJpbmciKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVENvbXBhY3RPdXRwdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUV3JpdGVUcmFuc3BvcnQsCit7CisgICAgLy8gSWRlbnRpZmllciBvZiB0aGUgbGFzdCBmaWVsZCBzZXJpYWxpemVkIGZvciBhIHN0cnVjdC4KKyAgICBsYXN0X3dyaXRlX2ZpZWxkX2lkOiBpMTYsCisgICAgLy8gU3RhY2sgb2YgdGhlIGxhc3Qgd3JpdHRlbiBmaWVsZCBpZHMgKG5ldyBlbnRyeSBhZGRlZCBlYWNoIHRpbWUgYSBuZXN0ZWQgc3RydWN0IGlzIHdyaXR0ZW4pLgorICAgIHdyaXRlX2ZpZWxkX2lkX3N0YWNrOiBWZWM8aTE2PiwKKyAgICAvLyBGaWVsZCBpZGVudGlmaWVyIG9mIHRoZSBib29sZWFuIGZpZWxkIHRvIGJlIHdyaXR0ZW4uCisgICAgLy8gU2F2ZWQgYmVjYXVzZSBib29sZWFuIGZpZWxkcyBhbmQgdGhlaXIgdmFsdWUgYXJlIGVuY29kZWQgaW4gYSBzaW5nbGUgYnl0ZQorICAgIHBlbmRpbmdfd3JpdGVfYm9vbF9maWVsZF9pZGVudGlmaWVyOiBPcHRpb248VEZpZWxkSWRlbnRpZmllcj4sCisgICAgLy8gVW5kZXJseWluZyB0cmFuc3BvcnQgdXNlZCBmb3IgYnl0ZS1sZXZlbCBvcGVyYXRpb25zLgorICAgIHRyYW5zcG9ydDogVCwKK30KKworaW1wbDxUPiBUQ29tcGFjdE91dHB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRXcml0ZVRyYW5zcG9ydCwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRDb21wYWN0T3V0cHV0UHJvdG9jb2xgIHRoYXQgd3JpdGVzIGJ5dGVzIHRvIGB0cmFuc3BvcnRgLgorICAgIHB1YiBmbiBuZXcodHJhbnNwb3J0OiBUKSAtPiBUQ29tcGFjdE91dHB1dFByb3RvY29sPFQ+IHsKKyAgICAgICAgVENvbXBhY3RPdXRwdXRQcm90b2NvbCB7CisgICAgICAgICAgICBsYXN0X3dyaXRlX2ZpZWxkX2lkOiAwLAorICAgICAgICAgICAgd3JpdGVfZmllbGRfaWRfc3RhY2s6IFZlYzo6bmV3KCksCisgICAgICAgICAgICBwZW5kaW5nX3dyaXRlX2Jvb2xfZmllbGRfaWRlbnRpZmllcjogTm9uZSwKKyAgICAgICAgICAgIHRyYW5zcG9ydDogdHJhbnNwb3J0LAorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRklYTUU6IGZpZWxkX3R5cGUgYXMgdW5jb25zdHJhaW5lZCB1OCBpcyBiYWQKKyAgICBmbiB3cml0ZV9maWVsZF9oZWFkZXIoJm11dCBzZWxmLCBmaWVsZF90eXBlOiB1OCwgZmllbGRfaWQ6IGkxNikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IGZpZWxkX2RlbHRhID0gZmllbGRfaWQgLSBzZWxmLmxhc3Rfd3JpdGVfZmllbGRfaWQ7CisgICAgICAgIGlmIGZpZWxkX2RlbHRhID4gMCAmJiBmaWVsZF9kZWx0YSA8IDE1IHsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZSgoKGZpZWxkX2RlbHRhIGFzIHU4KSA8PCA0KSB8IGZpZWxkX3R5cGUpPzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZShmaWVsZF90eXBlKT87CisgICAgICAgICAgICBzZWxmLndyaXRlX2kxNihmaWVsZF9pZCk/OworICAgICAgICB9CisgICAgICAgIHNlbGYubGFzdF93cml0ZV9maWVsZF9pZCA9IGZpZWxkX2lkOworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9saXN0X3NldF9iZWdpbigmbXV0IHNlbGYsIGVsZW1lbnRfdHlwZTogVFR5cGUsIGVsZW1lbnRfY291bnQ6IGkzMikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IGVsZW1faWRlbnRpZmllciA9IGNvbGxlY3Rpb25fdHlwZV90b191OChlbGVtZW50X3R5cGUpOworICAgICAgICBpZiBlbGVtZW50X2NvdW50IDw9IDE0IHsKKyAgICAgICAgICAgIGxldCBoZWFkZXIgPSAoZWxlbWVudF9jb3VudCBhcyB1OCkgPDwgNCB8IGVsZW1faWRlbnRpZmllcjsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZShoZWFkZXIpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZXQgaGVhZGVyID0gMHhGMCB8IGVsZW1faWRlbnRpZmllcjsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZShoZWFkZXIpPzsKKyAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0CisgICAgICAgICAgICAgICAgLndyaXRlX3ZhcmludChlbGVtZW50X2NvdW50IGFzIHUzMikKKyAgICAgICAgICAgICAgICAubWFwX2VycihGcm9tOjpmcm9tKQorICAgICAgICAgICAgICAgIC5tYXAofF98ICgpKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gYXNzZXJ0X25vX3BlbmRpbmdfYm9vbF93cml0ZSgmc2VsZikgeworICAgICAgICBpZiBsZXQgU29tZShyZWYgZikgPSBzZWxmLnBlbmRpbmdfd3JpdGVfYm9vbF9maWVsZF9pZGVudGlmaWVyIHsKKyAgICAgICAgICAgIHBhbmljISgicGVuZGluZyBib29sIGZpZWxkIHs6P30gbm90IHdyaXR0ZW4iLCBmKQorICAgICAgICB9CisgICAgfQorfQorCitpbXBsPFQ+IFRPdXRwdXRQcm90b2NvbCBmb3IgVENvbXBhY3RPdXRwdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUV3JpdGVUcmFuc3BvcnQsCit7CisgICAgZm4gd3JpdGVfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWVzc2FnZUlkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZShDT01QQUNUX1BST1RPQ09MX0lEKT87CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZSgodTg6OmZyb20oaWRlbnRpZmllci5tZXNzYWdlX3R5cGUpIDw8IDUpIHwgQ09NUEFDVF9WRVJTSU9OKT87CisgICAgICAgIHNlbGYud3JpdGVfaTMyKGlkZW50aWZpZXIuc2VxdWVuY2VfbnVtYmVyKT87CisgICAgICAgIHNlbGYud3JpdGVfc3RyaW5nKCZpZGVudGlmaWVyLm5hbWUpPzsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2Jvb2xfd3JpdGUoKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RydWN0X2JlZ2luKCZtdXQgc2VsZiwgXzogJlRTdHJ1Y3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2ZpZWxkX2lkX3N0YWNrLnB1c2goc2VsZi5sYXN0X3dyaXRlX2ZpZWxkX2lkKTsKKyAgICAgICAgc2VsZi5sYXN0X3dyaXRlX2ZpZWxkX2lkID0gMDsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfYm9vbF93cml0ZSgpOworICAgICAgICBzZWxmLmxhc3Rfd3JpdGVfZmllbGRfaWQgPSBzZWxmCisgICAgICAgICAgICAud3JpdGVfZmllbGRfaWRfc3RhY2sKKyAgICAgICAgICAgIC5wb3AoKQorICAgICAgICAgICAgLmV4cGVjdCgic2hvdWxkIGhhdmUgcHJldmlvdXMgZmllbGQgaWRzIik7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRGaWVsZElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIG1hdGNoIGlkZW50aWZpZXIuZmllbGRfdHlwZSB7CisgICAgICAgICAgICBUVHlwZTo6Qm9vbCA9PiB7CisgICAgICAgICAgICAgICAgaWYgc2VsZi5wZW5kaW5nX3dyaXRlX2Jvb2xfZmllbGRfaWRlbnRpZmllci5pc19zb21lKCkgeworICAgICAgICAgICAgICAgICAgICBwYW5pYyEoCisgICAgICAgICAgICAgICAgICAgICAgICAic2hvdWxkIG5vdCBoYXZlIGEgcGVuZGluZyBib29sIHdoaWxlIHdyaXRpbmcgYW5vdGhlciBib29sIHdpdGggaWQ6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB7Oj99IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWxmLnBlbmRpbmdfd3JpdGVfYm9vbF9maWVsZF9pZGVudGlmaWVyID0gU29tZShpZGVudGlmaWVyLmNsb25lKCkpOworICAgICAgICAgICAgICAgIE9rKCgpKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgXyA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGZpZWxkX3R5cGUgPSB0eXBlX3RvX3U4KGlkZW50aWZpZXIuZmllbGRfdHlwZSk7CisgICAgICAgICAgICAgICAgbGV0IGZpZWxkX2lkID0gaWRlbnRpZmllci5pZC5leHBlY3QoIm5vbi1zdG9wIGZpZWxkIHNob3VsZCBoYXZlIGZpZWxkIGlkIik7CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9maWVsZF9oZWFkZXIoZmllbGRfdHlwZSwgZmllbGRfaWQpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2Jvb2xfd3JpdGUoKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfc3RvcCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfYm9vbF93cml0ZSgpOworICAgICAgICBzZWxmLndyaXRlX2J5dGUodHlwZV90b191OChUVHlwZTo6U3RvcCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfYm9vbCgmbXV0IHNlbGYsIGI6IGJvb2wpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIG1hdGNoIHNlbGYucGVuZGluZ193cml0ZV9ib29sX2ZpZWxkX2lkZW50aWZpZXIudGFrZSgpIHsKKyAgICAgICAgICAgIFNvbWUocGVuZGluZykgPT4geworICAgICAgICAgICAgICAgIGxldCBmaWVsZF9pZCA9IHBlbmRpbmcuaWQuZXhwZWN0KCJib29sIGZpZWxkIHNob3VsZCBoYXZlIGEgZmllbGQgaWQiKTsKKyAgICAgICAgICAgICAgICBsZXQgZmllbGRfdHlwZV9hc191OCA9IGlmIGIgeyAweDAxIH0gZWxzZSB7IDB4MDIgfTsKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2ZpZWxkX2hlYWRlcihmaWVsZF90eXBlX2FzX3U4LCBmaWVsZF9pZCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5vbmUgPT4geworICAgICAgICAgICAgICAgIGlmIGIgeworICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUoMHgwMSkKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUoMHgwMikKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiB3cml0ZV9ieXRlcygmbXV0IHNlbGYsIGI6ICZbdThdKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV92YXJpbnQoYi5sZW4oKSBhcyB1MzIpPzsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfYWxsKGIpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pOCgmbXV0IHNlbGYsIGk6IGk4KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2J5dGUoaSBhcyB1OCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pMTYoJm11dCBzZWxmLCBpOiBpMTYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0CisgICAgICAgICAgICAud3JpdGVfdmFyaW50KGkpCisgICAgICAgICAgICAubWFwX2VycihGcm9tOjpmcm9tKQorICAgICAgICAgICAgLm1hcCh8X3wgKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTMyKCZtdXQgc2VsZiwgaTogaTMyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydAorICAgICAgICAgICAgLndyaXRlX3ZhcmludChpKQorICAgICAgICAgICAgLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICAgICAgICAgIC5tYXAofF98ICgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2k2NCgmbXV0IHNlbGYsIGk6IGk2NCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQKKyAgICAgICAgICAgIC53cml0ZV92YXJpbnQoaSkKKyAgICAgICAgICAgIC5tYXBfZXJyKEZyb206OmZyb20pCisgICAgICAgICAgICAubWFwKHxffCAoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9kb3VibGUoJm11dCBzZWxmLCBkOiBmNjQpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX2Y2NDo6PEJpZ0VuZGlhbj4oZCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cmluZygmbXV0IHNlbGYsIHM6ICZzdHIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZXMocy5hc19ieXRlcygpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVExpc3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2xpc3Rfc2V0X2JlZ2luKGlkZW50aWZpZXIuZWxlbWVudF90eXBlLCBpZGVudGlmaWVyLnNpemUpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zZXRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVFNldElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfbGlzdF9zZXRfYmVnaW4oaWRlbnRpZmllci5lbGVtZW50X3R5cGUsIGlkZW50aWZpZXIuc2l6ZSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWFwX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNYXBJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBpZiBpZGVudGlmaWVyLnNpemUgPT0gMCB7CisgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUoMCkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX3ZhcmludChpZGVudGlmaWVyLnNpemUgYXMgdTMyKT87CisKKyAgICAgICAgICAgIGxldCBrZXlfdHlwZSA9IGlkZW50aWZpZXIKKyAgICAgICAgICAgICAgICAua2V5X3R5cGUKKyAgICAgICAgICAgICAgICAuZXhwZWN0KCJtYXAgaWRlbnRpZmllciB0byB3cml0ZSBzaG91bGQgY29udGFpbiBrZXkgdHlwZSIpOworICAgICAgICAgICAgbGV0IGtleV90eXBlX2J5dGUgPSBjb2xsZWN0aW9uX3R5cGVfdG9fdTgoa2V5X3R5cGUpIDw8IDQ7CisKKyAgICAgICAgICAgIGxldCB2YWxfdHlwZSA9IGlkZW50aWZpZXIKKyAgICAgICAgICAgICAgICAudmFsdWVfdHlwZQorICAgICAgICAgICAgICAgIC5leHBlY3QoIm1hcCBpZGVudGlmaWVyIHRvIHdyaXRlIHNob3VsZCBjb250YWluIHZhbHVlIHR5cGUiKTsKKyAgICAgICAgICAgIGxldCB2YWxfdHlwZV9ieXRlID0gY29sbGVjdGlvbl90eXBlX3RvX3U4KHZhbF90eXBlKTsKKworICAgICAgICAgICAgbGV0IG1hcF90eXBlX2hlYWRlciA9IGtleV90eXBlX2J5dGUgfCB2YWxfdHlwZV9ieXRlOworICAgICAgICAgICAgc2VsZi53cml0ZV9ieXRlKG1hcF90eXBlX2hlYWRlcikKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHdyaXRlX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LmZsdXNoKCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIC8vIHV0aWxpdHkKKyAgICAvLworCisgICAgZm4gd3JpdGVfYnl0ZSgmbXV0IHNlbGYsIGI6IHU4KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZSgmW2JdKS5tYXBfZXJyKEZyb206OmZyb20pLm1hcCh8X3wgKCkpCisgICAgfQorfQorCisvLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIGBUQ29tcGFjdE91dHB1dFByb3RvY29sYC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeTsKKworaW1wbCBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeWAuCisgICAgcHViIGZuIG5ldygpIC0+IFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAgICAgVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3Rvcnkge30KKyAgICB9Cit9CisKK2ltcGwgVE91dHB1dFByb3RvY29sRmFjdG9yeSBmb3IgVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3RvcnkgeworICAgIGZuIGNyZWF0ZSgmc2VsZiwgdHJhbnNwb3J0OiBCb3g8VFdyaXRlVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUT3V0cHV0UHJvdG9jb2wgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldyh0cmFuc3BvcnQpKQorICAgIH0KK30KKworZm4gY29sbGVjdGlvbl90eXBlX3RvX3U4KGZpZWxkX3R5cGU6IFRUeXBlKSAtPiB1OCB7CisgICAgbWF0Y2ggZmllbGRfdHlwZSB7CisgICAgICAgIFRUeXBlOjpCb29sID0+IDB4MDEsCisgICAgICAgIGYgPT4gdHlwZV90b191OChmKSwKKyAgICB9Cit9CisKK2ZuIHR5cGVfdG9fdTgoZmllbGRfdHlwZTogVFR5cGUpIC0+IHU4IHsKKyAgICBtYXRjaCBmaWVsZF90eXBlIHsKKyAgICAgICAgVFR5cGU6OlN0b3AgPT4gMHgwMCwKKyAgICAgICAgVFR5cGU6OkkwOCA9PiAweDAzLCAvLyBlcXVpdmFsZW50IHRvIFRUeXBlOjpCeXRlCisgICAgICAgIFRUeXBlOjpJMTYgPT4gMHgwNCwKKyAgICAgICAgVFR5cGU6OkkzMiA9PiAweDA1LAorICAgICAgICBUVHlwZTo6STY0ID0+IDB4MDYsCisgICAgICAgIFRUeXBlOjpEb3VibGUgPT4gMHgwNywKKyAgICAgICAgVFR5cGU6OlN0cmluZyA9PiAweDA4LAorICAgICAgICBUVHlwZTo6TGlzdCA9PiAweDA5LAorICAgICAgICBUVHlwZTo6U2V0ID0+IDB4MEEsCisgICAgICAgIFRUeXBlOjpNYXAgPT4gMHgwQiwKKyAgICAgICAgVFR5cGU6OlN0cnVjdCA9PiAweDBDLAorICAgICAgICBfID0+IHBhbmljIShmb3JtYXQhKAorICAgICAgICAgICAgInNob3VsZCBub3QgaGF2ZSBhdHRlbXB0ZWQgdG8gY29udmVydCB7fSB0byB1OCIsCisgICAgICAgICAgICBmaWVsZF90eXBlCisgICAgICAgICkpLAorICAgIH0KK30KKworZm4gY29sbGVjdGlvbl91OF90b190eXBlKGI6IHU4KSAtPiA6OlJlc3VsdDxUVHlwZT4geworICAgIG1hdGNoIGIgeworICAgICAgICAweDAxID0+IE9rKFRUeXBlOjpCb29sKSwKKyAgICAgICAgbyA9PiB1OF90b190eXBlKG8pLAorICAgIH0KK30KKworZm4gdThfdG9fdHlwZShiOiB1OCkgLT4gOjpSZXN1bHQ8VFR5cGU+IHsKKyAgICBtYXRjaCBiIHsKKyAgICAgICAgMHgwMCA9PiBPayhUVHlwZTo6U3RvcCksCisgICAgICAgIDB4MDMgPT4gT2soVFR5cGU6OkkwOCksIC8vIGVxdWl2YWxlbnQgdG8gVFR5cGU6OkJ5dGUKKyAgICAgICAgMHgwNCA9PiBPayhUVHlwZTo6STE2KSwKKyAgICAgICAgMHgwNSA9PiBPayhUVHlwZTo6STMyKSwKKyAgICAgICAgMHgwNiA9PiBPayhUVHlwZTo6STY0KSwKKyAgICAgICAgMHgwNyA9PiBPayhUVHlwZTo6RG91YmxlKSwKKyAgICAgICAgMHgwOCA9PiBPayhUVHlwZTo6U3RyaW5nKSwKKyAgICAgICAgMHgwOSA9PiBPayhUVHlwZTo6TGlzdCksCisgICAgICAgIDB4MEEgPT4gT2soVFR5cGU6OlNldCksCisgICAgICAgIDB4MEIgPT4gT2soVFR5cGU6Ok1hcCksCisgICAgICAgIDB4MEMgPT4gT2soVFR5cGU6OlN0cnVjdCksCisgICAgICAgIHVua24gPT4gRXJyKDo6RXJyb3I6OlByb3RvY29sKDo6UHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICBraW5kOiA6OlByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSwKKyAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBjb252ZXJ0IHt9IGludG8gVFR5cGUiLCB1bmtuKSwKKyAgICAgICAgfSkpLAorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworCisgICAgdXNlIHByb3RvY29sOjp7CisgICAgICAgIFRGaWVsZElkZW50aWZpZXIsIFRJbnB1dFByb3RvY29sLCBUTGlzdElkZW50aWZpZXIsIFRNYXBJZGVudGlmaWVyLCBUTWVzc2FnZUlkZW50aWZpZXIsCisgICAgICAgIFRNZXNzYWdlVHlwZSwgVE91dHB1dFByb3RvY29sLCBUU2V0SWRlbnRpZmllciwgVFN0cnVjdElkZW50aWZpZXIsIFRUeXBlLAorICAgIH07CisgICAgdXNlIHRyYW5zcG9ydDo6e1JlYWRIYWxmLCBUQnVmZmVyQ2hhbm5lbCwgVElvQ2hhbm5lbCwgV3JpdGVIYWxmfTsKKworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21lc3NhZ2VfYmVnaW5fMCgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoCisgICAgICAgICAgICAiZm9vIiwKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6Q2FsbCwKKyAgICAgICAgICAgIDQzMQorICAgICAgICApKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDhdID0gWworICAgICAgICAgICAgMHg4MiwgLyogcHJvdG9jb2wgSUQgKi8KKyAgICAgICAgICAgIDB4MjEsIC8qIG1lc3NhZ2UgdHlwZSB8IHByb3RvY29sIHZlcnNpb24gKi8KKyAgICAgICAgICAgIDB4REUsCisgICAgICAgICAgICAweDA2LCAvKiB6aWctemFnIHZhcmludCBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICAgICAgICAgIDB4MDMsIC8qIG1lc3NhZ2UtbmFtZSBsZW5ndGggKi8KKyAgICAgICAgICAgIDB4NjYsCisgICAgICAgICAgICAweDZGLAorICAgICAgICAgICAgMHg2RiAvKiAiZm9vIiAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWVzc2FnZV9iZWdpbl8xKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygKKyAgICAgICAgICAgICJiYXIiLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpSZXBseSwKKyAgICAgICAgICAgIDk5MTgyOAorICAgICAgICApKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDldID0gWworICAgICAgICAgICAgMHg4MiwgLyogcHJvdG9jb2wgSUQgKi8KKyAgICAgICAgICAgIDB4NDEsIC8qIG1lc3NhZ2UgdHlwZSB8IHByb3RvY29sIHZlcnNpb24gKi8KKyAgICAgICAgICAgIDB4QTgsCisgICAgICAgICAgICAweDg5LAorICAgICAgICAgICAgMHg3OSwgLyogemlnLXphZyB2YXJpbnQgc2VxdWVuY2UgbnVtYmVyICovCisgICAgICAgICAgICAweDAzLCAvKiBtZXNzYWdlLW5hbWUgbGVuZ3RoICovCisgICAgICAgICAgICAweDYyLAorICAgICAgICAgICAgMHg2MSwKKyAgICAgICAgICAgIDB4NzIgLyogImJhciIgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbWVzc2FnZV9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGxldCBpZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJzZXJ2aWNlX2NhbGwiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEyODM5NDgpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmaWRlbnQpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVzID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlcywgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tZXNzYWdlX2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX21lc3NhZ2VfZW5kKCkpOworICAgIH0KKworICAgIC8vIE5PVEU6IHN0cnVjdHMgYW5kIGZpZWxkcyBhcmUgdGVzdGVkIHRvZ2V0aGVyCisgICAgLy8KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cnVjdF93aXRoX2RlbHRhX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggdGlueSBmaWVsZCBpZHMKKyAgICAgICAgLy8gc2luY2UgdGhleSdyZSBzbWFsbCB0aGUgZmllbGQgaWRzIHdpbGwgYmUgZW5jb2RlZCBhcyBkZWx0YXMKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIHRoZSBmaXJzdCBmaWVsZCAoYW5kIGl0J3MgemVybykgaXQgZ2V0cyB0aGUgZnVsbCB2YXJpbnQgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCAwKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBjYW4gYmUgZW5jb2RlZCBhcyBhIGRlbHRhCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkxNiwgNCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgY2FuIGJlIGVuY29kZWQgYXMgYSBkZWx0YQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpMaXN0LCA5KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgNV0gPSBbCisgICAgICAgICAgICAweDAzLCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDAwLCAvKiBmaXJzdCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHg0NCwgLyogZmllbGQgZGVsdGEgKDQpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHg1OSwgLyogZmllbGQgZGVsdGEgKDUpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwMCAvKiBmaWVsZCBzdG9wICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX3N0cnVjdF93aXRoX2RlbHRhX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggdGlueSBmaWVsZCBpZHMKKyAgICAgICAgLy8gc2luY2UgdGhleSdyZSBzbWFsbCB0aGUgZmllbGQgaWRzIHdpbGwgYmUgZW5jb2RlZCBhcyBkZWx0YXMKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIHRoZSBmaXJzdCBmaWVsZCAoYW5kIGl0J3MgemVybykgaXQgZ2V0cyB0aGUgZnVsbCB2YXJpbnQgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzEgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGNhbiBiZSBlbmNvZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzIgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMTYsIDQpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8yKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGNhbiBiZSBlbmNvZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpMaXN0LCA5KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIHRoZSBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cnVjdF93aXRoX25vbl96ZXJvX2luaXRpYWxfZmllbGRfYW5kX2RlbHRhX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggdGlueSBmaWVsZCBpZHMKKyAgICAgICAgLy8gc2luY2UgdGhleSdyZSBzbWFsbCB0aGUgZmllbGQgaWRzIHdpbGwgYmUgZW5jb2RlZCBhcyBkZWx0YXMKKworICAgICAgICAvLyBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBjYW4gYmUgZW5jb2RlZCBhcyBhIGRlbHRhCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgMikpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgY2FuIGJlIGVuY29kZWQgYXMgYSBkZWx0YQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTdHJpbmcsIDYpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA0XSA9IFsKKyAgICAgICAgICAgIDB4MTUsIC8qIGZpZWxkIGRlbHRhICgxKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MUEsIC8qIGZpZWxkIGRlbHRhICgxKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4NDgsIC8qIGZpZWxkIGRlbHRhICg0KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zdHJ1Y3Rfd2l0aF9ub25femVyb19pbml0aWFsX2ZpZWxkX2FuZF9kZWx0YV9maWVsZHMoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIHRpbnkgZmllbGQgaWRzCisgICAgICAgIC8vIHNpbmNlIHRoZXkncmUgc21hbGwgdGhlIGZpZWxkIGlkcyB3aWxsIGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCAxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBjYW4gYmUgZW5jb2RlZCBhcyBhIGRlbHRhCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCAyKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBjYW4gYmUgZW5jb2RlZCBhcyBhIGRlbHRhCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U3RyaW5nLCA2KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIHRoZSBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cnVjdF93aXRoX2xvbmdfZmllbGRzKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gbm8gYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaG93ZXZlcgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyB3cml0ZSB0aHJlZSBmaWVsZHMgd2l0aCBmaWVsZCBpZHMgdGhhdCBjYW5ub3QgYmUgZW5jb2RlZCBhcyBkZWx0YXMKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIHRoZSBmaXJzdCBmaWVsZCAoYW5kIGl0J3MgemVybykgaXQgZ2V0cyB0aGUgZnVsbCB2YXJpbnQgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCAwKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhIGlzID4gMTUgaXQgaXMgZW5jb2RlZCBhcyBhIHppZy16YWcgdmFyaW50CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMTYpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgaXMgPiAxNSBpdCBpcyBlbmNvZGVkIGFzIGEgemlnLXphZyB2YXJpbnQKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCA5OSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDhdID0gWworICAgICAgICAgICAgMHgwNSwgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwMCwgLyogZmlyc3QgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MDYsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MjAsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDBBLCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweEM2LAorICAgICAgICAgICAgMHgwMSwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zdHJ1Y3Rfd2l0aF9sb25nX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggZmllbGQgaWRzIHRoYXQgY2Fubm90IGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBpcyB0aGUgZmlyc3QgZmllbGQgKGFuZCBpdCdzIHplcm8pIGl0IGdldHMgdGhlIGZ1bGwgdmFyaW50IHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCAwKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhIGlzID4gMTUgaXQgaXMgZW5jb2RlZCBhcyBhIHppZy16YWcgdmFyaW50CisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxNik7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSBpcyA+IDE1IGl0IGlzIGVuY29kZWQgYXMgYSB6aWctemFnIHZhcmludAorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgOTkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8zKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgdGhlIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8xCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8yCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNCwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3RydWN0X3dpdGhfbWl4X29mX2xvbmdfYW5kX2RlbHRhX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggZmllbGQgaWRzIHRoYXQgY2Fubm90IGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCA5KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhIGlzID4gMTUgaXQgaXMgZW5jb2RlZCBhcyBhIHppZy16YWcgdmFyaW50CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgMTAwMCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSBpcyA+IDE1IGl0IGlzIGVuY29kZWQgYXMgYSB6aWctemFnIHZhcmludAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDIwMDEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgb25seSAzIHVwIGZyb20gdGhlIHByZXZpb3VzIGl0IGlzIHJlY29yZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCAyMDA0KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMTBdID0gWworICAgICAgICAgICAgMHgxNiwgLyogZmllbGQgZGVsdGEgKDEpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHg4NSwgLyogZmllbGQgZGVsdGEgKDgpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwQSwgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHhEMCwKKyAgICAgICAgICAgIDB4MEYsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDBBLCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweEEyLAorICAgICAgICAgICAgMHgxRiwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4M0EsIC8qIGZpZWxkIGRlbHRhICgzKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zdHJ1Y3Rfd2l0aF9taXhfb2ZfbG9uZ19hbmRfZGVsdGFfZmllbGRzKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gbm8gYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaG93ZXZlcgorICAgICAgICBsZXQgc3RydWN0X2lkZW50ID0gVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIik7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZzdHJ1Y3RfaWRlbnQpKTsKKworICAgICAgICAvLyB3cml0ZSB0aHJlZSBmaWVsZHMgd2l0aCBmaWVsZCBpZHMgdGhhdCBjYW5ub3QgYmUgZW5jb2RlZCBhcyBkZWx0YXMKKworICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCA5KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhIGlzID4gMTUgaXQgaXMgZW5jb2RlZCBhcyBhIHppZy16YWcgdmFyaW50CisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCAxMDAwKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhIGlzID4gMTUgaXQgaXMgZW5jb2RlZCBhcyBhIHppZy16YWcgdmFyaW50CisgICAgICAgIGxldCBmaWVsZF9pZGVudF80ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCAyMDAxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfNCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIG9ubHkgMyB1cCBmcm9tIHRoZSBwcmV2aW91cyBpdCBpcyByZWNvcmRlZCBhcyBhIGRlbHRhCisgICAgICAgIGxldCBmaWVsZF9pZGVudF81ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCAyMDA0KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfNSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIHRoZSBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfNAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzUgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzUsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfNQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzYgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzYsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX25lc3RlZF9zdHJ1Y3RzXzAoKSB7CisgICAgICAgIC8vIGxhc3QgZmllbGQgb2YgdGhlIGNvbnRhaW5pbmcgc3RydWN0IGlzIGEgZGVsdGEKKyAgICAgICAgLy8gZmlyc3QgZmllbGQgb2YgdGhlIHRoZSBjb250YWluZWQgc3RydWN0IGlzIGEgZGVsdGEKKworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCA5KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCA3KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpEb3VibGUsIDI0KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDddID0gWworICAgICAgICAgICAgMHgxNiwgLyogZmllbGQgZGVsdGEgKDEpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHg4NSwgLyogZmllbGQgZGVsdGEgKDgpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHg3MywgLyogZmllbGQgZGVsdGEgKDcpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwNywgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgzMCwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MDAsIC8qIGZpZWxkIHN0b3AgLSBjb250YWluZWQgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAtIGNvbnRhaW5pbmcgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbmVzdGVkX3N0cnVjdHNfMCgpIHsKKyAgICAgICAgLy8gbGFzdCBmaWVsZCBvZiB0aGUgY29udGFpbmluZyBzdHJ1Y3QgaXMgYSBkZWx0YQorICAgICAgICAvLyBmaXJzdCBmaWVsZCBvZiB0aGUgdGhlIGNvbnRhaW5lZCBzdHJ1Y3QgaXMgYSBkZWx0YQorCisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCA5KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDcpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8zKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF80ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6RG91YmxlLCAyNCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzQpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmluZyBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmVkIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNCwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF80CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBsZXQgcmVhZF9pZGVudF83ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF83LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbmVzdGVkX3N0cnVjdHNfMSgpIHsKKyAgICAgICAgLy8gbGFzdCBmaWVsZCBvZiB0aGUgY29udGFpbmluZyBzdHJ1Y3QgaXMgYSBkZWx0YQorICAgICAgICAvLyBmaXJzdCBmaWVsZCBvZiB0aGUgdGhlIGNvbnRhaW5lZCBzdHJ1Y3QgaXMgYSBmdWxsIHdyaXRlCisKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgOSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpEb3VibGUsIDI0KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgMjcpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgN10gPSBbCisgICAgICAgICAgICAweDE2LCAvKiBmaWVsZCBkZWx0YSAoMSkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDg1LCAvKiBmaWVsZCBkZWx0YSAoOCkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDA3LCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDMwLCAvKiB6aWctemFnIHZhcmludCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgzMywgLyogZmllbGQgZGVsdGEgKDMpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwMCwgLyogZmllbGQgc3RvcCAtIGNvbnRhaW5lZCAqLworICAgICAgICAgICAgMHgwMCAvKiBmaWVsZCBzdG9wIC0gY29udGFpbmluZyAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9uZXN0ZWRfc3RydWN0c18xKCkgeworICAgICAgICAvLyBsYXN0IGZpZWxkIG9mIHRoZSBjb250YWluaW5nIHN0cnVjdCBpcyBhIGRlbHRhCisgICAgICAgIC8vIGZpcnN0IGZpZWxkIG9mIHRoZSB0aGUgY29udGFpbmVkIHN0cnVjdCBpcyBhIGZ1bGwgd3JpdGUKKworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzEgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgOSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkRvdWJsZSwgMjQpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8zKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzQgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDI3KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfNCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gcmVhZCBjb250YWluaW5nIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8xCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8yCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gcmVhZCBjb250YWluZWQgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8zLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzMKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF80LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzQKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBsZXQgcmVhZF9pZGVudF82ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF82LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGxldCByZWFkX2lkZW50XzcgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzcsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9uZXN0ZWRfc3RydWN0c18yKCkgeworICAgICAgICAvLyBsYXN0IGZpZWxkIG9mIHRoZSBjb250YWluaW5nIHN0cnVjdCBpcyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgLy8gZmlyc3QgZmllbGQgb2YgdGhlIHRoZSBjb250YWluZWQgc3RydWN0IGlzIGEgZGVsdGEgd3JpdGUKKworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U3RyaW5nLCAyMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpEb3VibGUsIDcpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCAxMCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA3XSA9IFsKKyAgICAgICAgICAgIDB4MTYsIC8qIGZpZWxkIGRlbHRhICgxKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDgsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MkEsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDc3LCAvKiBmaWVsZCBkZWx0YSg3KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MzMsIC8qIGZpZWxkIGRlbHRhICgzKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAsIC8qIGZpZWxkIHN0b3AgLSBjb250YWluZWQgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAtIGNvbnRhaW5pbmcgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbmVzdGVkX3N0cnVjdHNfMigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzIgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTdHJpbmcsIDIxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6RG91YmxlLCA3KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF80ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCAxMCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzQpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmluZyBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmVkIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNCwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF80CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBsZXQgcmVhZF9pZGVudF83ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF83LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbmVzdGVkX3N0cnVjdHNfMygpIHsKKyAgICAgICAgLy8gbGFzdCBmaWVsZCBvZiB0aGUgY29udGFpbmluZyBzdHJ1Y3QgaXMgYSBmdWxsIHdyaXRlCisgICAgICAgIC8vIGZpcnN0IGZpZWxkIG9mIHRoZSB0aGUgY29udGFpbmVkIHN0cnVjdCBpcyBhIGZ1bGwgd3JpdGUKKworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U3RyaW5nLCAyMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpEb3VibGUsIDIxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgMjcpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgOF0gPSBbCisgICAgICAgICAgICAweDE2LCAvKiBmaWVsZCBkZWx0YSAoMSkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDA4LCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDJBLCAvKiB6aWctemFnIHZhcmludCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgwNywgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgyQSwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4NjMsIC8qIGZpZWxkIGRlbHRhICg2KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAsIC8qIGZpZWxkIHN0b3AgLSBjb250YWluZWQgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAtIGNvbnRhaW5pbmcgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbmVzdGVkX3N0cnVjdHNfMygpIHsKKyAgICAgICAgLy8gbGFzdCBmaWVsZCBvZiB0aGUgY29udGFpbmluZyBzdHJ1Y3QgaXMgYSBmdWxsIHdyaXRlCisgICAgICAgIC8vIGZpcnN0IGZpZWxkIG9mIHRoZSB0aGUgY29udGFpbmVkIHN0cnVjdCBpcyBhIGZ1bGwgd3JpdGUKKworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzEgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlN0cmluZywgMjEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8yKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpEb3VibGUsIDIxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF80ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCAyNyk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzQpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmluZyBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmVkIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNCwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF80CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBsZXQgcmVhZF9pZGVudF83ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF83LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfYm9vbF9maWVsZCgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggZmllbGQgaWRzIHRoYXQgY2Fubm90IGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNiBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDkpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbChmYWxzZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgMjYpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbCh0cnVlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCA0NSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKGZhbHNlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA3XSA9IFsKKyAgICAgICAgICAgIDB4MTEsIC8qIGZpZWxkIGRlbHRhICgxKSB8IHRydWUgKi8KKyAgICAgICAgICAgIDB4ODIsIC8qIGZpZWxkIGRlbHRhICg4KSB8IGZhbHNlICovCisgICAgICAgICAgICAweDAxLCAvKiB0cnVlICovCisgICAgICAgICAgICAweDM0LCAvKiBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgwMiwgLyogZmFsc2UgKi8KKyAgICAgICAgICAgIDB4NUEsIC8qIGZpZWxkIGlkICovCisgICAgICAgICAgICAweDAwIC8qIHN0b3AgZmllbGQgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfYm9vbF9maWVsZCgpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgbGV0IHN0cnVjdF9pZGVudCA9IFRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmc3RydWN0X2lkZW50KSk7CisKKyAgICAgICAgLy8gd3JpdGUgdHdvIGZpZWxkcworCisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTYgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgOSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKGZhbHNlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDI2KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2wodHJ1ZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzQgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCA0NSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzQpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKGZhbHNlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgdGhlIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8xCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGxldCByZWFkX3ZhbHVlXzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3ZhbHVlXzEsIHRydWUpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBsZXQgcmVhZF92YWx1ZV8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF92YWx1ZV8yLCBmYWxzZSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGxldCByZWFkX3ZhbHVlXzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3ZhbHVlXzMsIHRydWUpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfNAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBsZXQgcmVhZF92YWx1ZV80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF92YWx1ZV80LCBmYWxzZSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgICNbc2hvdWxkX3BhbmljXQorICAgIGZuIG11c3RfZmFpbF9pZl93cml0ZV9maWVsZF9lbmRfd2l0aG91dF93cml0aW5nX2Jvb2xfdmFsdWUoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDEpKSk7CisgICAgICAgIG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKS51bndyYXAoKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgI1tzaG91bGRfcGFuaWNdCisgICAgZm4gbXVzdF9mYWlsX2lmX3dyaXRlX3N0b3BfZmllbGRfd2l0aG91dF93cml0aW5nX2Jvb2xfdmFsdWUoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDEpKSk7CisgICAgICAgIG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkudW53cmFwKCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgICNbc2hvdWxkX3BhbmljXQorICAgIGZuIG11c3RfZmFpbF9pZl93cml0ZV9zdHJ1Y3RfZW5kX3dpdGhvdXRfd3JpdGluZ19ib29sX3ZhbHVlKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCAxKSkpOworICAgICAgICBvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpLnVud3JhcCgpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICAjW3Nob3VsZF9wYW5pY10KKyAgICBmbiBtdXN0X2ZhaWxfaWZfd3JpdGVfc3RydWN0X2VuZF93aXRob3V0X2FueV9maWVsZHMoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKyAgICAgICAgb19wcm90LndyaXRlX3N0cnVjdF9lbmQoKS51bndyYXAoKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9maWVsZF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9maWVsZF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc21hbGxfc2l6ZWRfbGlzdF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbGlzdF9iZWdpbigmVExpc3RJZGVudGlmaWVyOjpuZXcoVFR5cGU6Okk2NCwgNCkpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMV0gPSBbMHg0NiAvKiBzaXplIHwgZWxlbV90eXBlICovXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zbWFsbF9zaXplZF9saXN0X2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVExpc3RJZGVudGlmaWVyOjpuZXcoVFR5cGU6OkkwOCwgMTApOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbGlzdF9iZWdpbigmaWRlbnQpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVzID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2xpc3RfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlcywgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9sYXJnZV9zaXplZF9saXN0X2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IHJlcyA9IG9fcHJvdC53cml0ZV9saXN0X2JlZ2luKCZUTGlzdElkZW50aWZpZXI6Om5ldyhUVHlwZTo6TGlzdCwgOTk5OSkpOworICAgICAgICBhc3NlcnQhKHJlcy5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgM10gPSBbCisgICAgICAgICAgICAweEY5LCAvKiAweEYwIHwgZWxlbV90eXBlICovCisgICAgICAgICAgICAweDhGLCAweDRFLCAvKiBzaXplIGFzIHZhcmludCAqLworICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX2xhcmdlX3NpemVkX2xpc3RfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTGlzdElkZW50aWZpZXI6Om5ldyhUVHlwZTo6U2V0LCA0NzM4MSk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9saXN0X2JlZ2luKCZpZGVudCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZXMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbGlzdF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVzLCAmaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2xpc3RfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfbGlzdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc21hbGxfc2l6ZWRfc2V0X2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zZXRfYmVnaW4oJlRTZXRJZGVudGlmaWVyOjpuZXcoVFR5cGU6OlN0cnVjdCwgMikpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMV0gPSBbMHgyQyAvKiBzaXplIHwgZWxlbV90eXBlICovXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zbWFsbF9zaXplZF9zZXRfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUU2V0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpJMTYsIDcpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc2V0X2JlZ2luKCZpZGVudCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZXMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc2V0X2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZXMsICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbGFyZ2Vfc2l6ZWRfc2V0X2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zZXRfYmVnaW4oJlRTZXRJZGVudGlmaWVyOjpuZXcoVFR5cGU6OkRvdWJsZSwgMjM4OTEpKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDRdID0gWworICAgICAgICAgICAgMHhGNywgLyogMHhGMCB8IGVsZW1fdHlwZSAqLworICAgICAgICAgICAgMHhEMywgMHhCQSwgMHgwMSwgLyogc2l6ZSBhcyB2YXJpbnQgKi8KKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9sYXJnZV9zaXplZF9zZXRfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUU2V0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpNYXAsIDM5Mjg0MjkpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc2V0X2JlZ2luKCZpZGVudCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZXMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc2V0X2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZXMsICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc2V0X2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX3NldF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfemVyb19zaXplZF9tYXBfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21hcF9iZWdpbigmVE1hcElkZW50aWZpZXI6Om5ldyhUVHlwZTo6U3RyaW5nLCBUVHlwZTo6STMyLCAwKSkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxXSA9IFsweDAwXTsgLy8gc2luY2Ugc2l6ZSBpcyB6ZXJvIHdlIGRvbid0IHdyaXRlIGFueXRoaW5nCisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JlYWRfemVyb19zaXplZF9tYXBfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21hcF9iZWdpbigmVE1hcElkZW50aWZpZXI6Om5ldyhUVHlwZTo6RG91YmxlLCBUVHlwZTo6STMyLCAwKSkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZXMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbWFwX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgJnJlcywKKyAgICAgICAgICAgICZUTWFwSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAga2V5X3R5cGU6IE5vbmUsCisgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTogTm9uZSwKKyAgICAgICAgICAgICAgICBzaXplOiAwLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21hcF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWFwX2JlZ2luKCZUTWFwSWRlbnRpZmllcjo6bmV3KAorICAgICAgICAgICAgVFR5cGU6OkRvdWJsZSwKKyAgICAgICAgICAgIFRUeXBlOjpTdHJpbmcsCisgICAgICAgICAgICAyMzgKKyAgICAgICAgKSkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAzXSA9IFsKKyAgICAgICAgICAgIDB4RUUsIDB4MDEsIC8qIHNpemUgYXMgdmFyaW50ICovCisgICAgICAgICAgICAweDc4LCAvKiBrZXkgdHlwZSB8IHZhbCB0eXBlICovCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbWFwX2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1hcElkZW50aWZpZXI6Om5ldyhUVHlwZTo6TWFwLCBUVHlwZTo6TGlzdCwgMTkyODM0OSk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tYXBfYmVnaW4oJmlkZW50KSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlcyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9tYXBfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlcywgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tYXBfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfbWFwX2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tYXBfd2l0aF9ib29sX2tleV9hbmRfdmFsdWUoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21hcF9iZWdpbigmVE1hcElkZW50aWZpZXI6Om5ldyhUVHlwZTo6Qm9vbCwgVFR5cGU6OkJvb2wsIDEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbCh0cnVlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbChmYWxzZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21hcF9lbmQoKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDRdID0gWworICAgICAgICAgICAgMHgwMSwgLyogc2l6ZSBhcyB2YXJpbnQgKi8KKyAgICAgICAgICAgIDB4MTEsIC8qIGtleSB0eXBlIHwgdmFsIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDEsIC8qIGtleTogdHJ1ZSAqLworICAgICAgICAgICAgMHgwMiwgLyogdmFsOiBmYWxzZSAqLworICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX21hcF93aXRoX2Jvb2xfdmFsdWUoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgbWFwX2lkZW50ID0gVE1hcElkZW50aWZpZXI6Om5ldyhUVHlwZTo6Qm9vbCwgVFR5cGU6OkJvb2wsIDIpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21hcF9iZWdpbigmbWFwX2lkZW50KSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbCh0cnVlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbChmYWxzZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2woZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tYXBfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIG1hcCBoZWFkZXIKKyAgICAgICAgbGV0IHJjdmRfaWRlbnQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbWFwX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyY3ZkX2lkZW50LCAmbWFwX2lkZW50KTsKKyAgICAgICAgLy8ga2V5IDEKKyAgICAgICAgbGV0IGIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShiLCB0cnVlKTsKKyAgICAgICAgLy8gdmFsIDEKKyAgICAgICAgbGV0IGIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShiLCBmYWxzZSk7CisgICAgICAgIC8vIGtleSAyCisgICAgICAgIGxldCBiID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEoYiwgZmFsc2UpOworICAgICAgICAvLyB2YWwgMgorICAgICAgICBsZXQgYiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKGIsIHRydWUpOworICAgICAgICAvLyBtYXAgZW5kCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9tYXBfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JlYWRfbWFwX2VuZCgpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBfKSA9IHRlc3Rfb2JqZWN0cygpOworICAgICAgICBhc3NlcnQhKGlfcHJvdC5yZWFkX21hcF9lbmQoKS5pc19vaygpKTsgLy8gd2lsbCBibG93IHVwIGlmIHdlIHRyeSB0byByZWFkIGZyb20gZW1wdHkgYnVmZmVyCisgICAgfQorCisgICAgZm4gdGVzdF9vYmplY3RzKCkgLT4gKAorICAgICAgICBUQ29tcGFjdElucHV0UHJvdG9jb2w8UmVhZEhhbGY8VEJ1ZmZlckNoYW5uZWw+PiwKKyAgICAgICAgVENvbXBhY3RPdXRwdXRQcm90b2NvbDxXcml0ZUhhbGY8VEJ1ZmZlckNoYW5uZWw+PiwKKyAgICApIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDgwLCA4MCk7CisKKyAgICAgICAgbGV0IChyX21lbSwgd19tZW0pID0gbWVtLnNwbGl0KCkudW53cmFwKCk7CisKKyAgICAgICAgbGV0IGlfcHJvdCA9IFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KHJfbWVtKTsKKyAgICAgICAgbGV0IG9fcHJvdCA9IFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldyh3X21lbSk7CisKKyAgICAgICAgKGlfcHJvdCwgb19wcm90KQorICAgIH0KKworICAgIGZuIGFzc2VydF9ub193cml0ZTxGPihtdXQgd3JpdGVfZm46IEYpCisgICAgd2hlcmUKKyAgICAgICAgRjogRm5NdXQoJm11dCBUQ29tcGFjdE91dHB1dFByb3RvY29sPFdyaXRlSGFsZjxUQnVmZmVyQ2hhbm5lbD4+KSAtPiA6OlJlc3VsdDwoKT4sCisgICAgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisgICAgICAgIGFzc2VydCEod3JpdGVfZm4oJm11dCBvX3Byb3QpLmlzX29rKCkpOworICAgICAgICBhc3NlcnRfZXEhKG9fcHJvdC50cmFuc3BvcnQud3JpdGVfYnl0ZXMoKS5sZW4oKSwgMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9wcm90b2NvbC9tb2QucnMgYi9saWIvcnMvc3JjL3Byb3RvY29sL21vZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWMwMjg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9wcm90b2NvbC9tb2QucnMKQEAgLTAsMCArMSw5NjkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8hIFR5cGVzIHVzZWQgdG8gc2VuZCBhbmQgcmVjZWl2ZSBwcmltaXRpdmVzIGJldHdlZW4gYSBUaHJpZnQgY2xpZW50IGFuZCBzZXJ2ZXIuCisvLyEKKy8vISAjIEV4YW1wbGVzCisvLyEKKy8vISBDcmVhdGUgYW5kIHVzZSBhIGBUSW5wdXRQcm90b2NvbGAuCisvLyEKKy8vISBgYGBub19ydW4KKy8vISB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sLCBUSW5wdXRQcm90b2NvbH07CisvLyEgdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vIQorLy8hIC8vIGNyZWF0ZSB0aGUgSS9PIGNoYW5uZWwKKy8vISBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLyEgY2hhbm5lbC5vcGVuKCIxMjcuMC4wLjE6OTA5MCIpLnVud3JhcCgpOworLy8hCisvLyEgLy8gY3JlYXRlIHRoZSBwcm90b2NvbCB0byBkZWNvZGUgYnl0ZXMgaW50byB0eXBlcworLy8hIGxldCBtdXQgcHJvdG9jb2wgPSBUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwsIHRydWUpOworLy8hCisvLyEgLy8gcmVhZCB0eXBlcyBmcm9tIHRoZSB3aXJlCisvLyEgbGV0IGZpZWxkX2lkZW50aWZpZXIgPSBwcm90b2NvbC5yZWFkX2ZpZWxkX2JlZ2luKCkudW53cmFwKCk7CisvLyEgbGV0IGZpZWxkX2NvbnRlbnRzID0gcHJvdG9jb2wucmVhZF9zdHJpbmcoKS51bndyYXAoKTsKKy8vISBsZXQgZmllbGRfZW5kID0gcHJvdG9jb2wucmVhZF9maWVsZF9lbmQoKS51bndyYXAoKTsKKy8vISBgYGAKKy8vIQorLy8hIENyZWF0ZSBhbmQgdXNlIGEgYFRPdXRwdXRQcm90b2NvbGAuCisvLyEKKy8vISBgYGBub19ydW4KKy8vISB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlPdXRwdXRQcm90b2NvbCwgVEZpZWxkSWRlbnRpZmllciwgVE91dHB1dFByb3RvY29sLCBUVHlwZX07CisvLyEgdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vIQorLy8hIC8vIGNyZWF0ZSB0aGUgSS9PIGNoYW5uZWwKKy8vISBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLyEgY2hhbm5lbC5vcGVuKCIxMjcuMC4wLjE6OTA5MCIpLnVud3JhcCgpOworLy8hCisvLyEgLy8gY3JlYXRlIHRoZSBwcm90b2NvbCB0byBlbmNvZGUgdHlwZXMgaW50byBieXRlcworLy8hIGxldCBtdXQgcHJvdG9jb2wgPSBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsLCB0cnVlKTsKKy8vIQorLy8hIC8vIHdyaXRlIHR5cGVzCisvLyEgcHJvdG9jb2wud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygic3RyaW5nX3RoaW5nIiwgVFR5cGU6OlN0cmluZywgMSkpLnVud3JhcCgpOworLy8hIHByb3RvY29sLndyaXRlX3N0cmluZygiZm9vIikudW53cmFwKCk7CisvLyEgcHJvdG9jb2wud3JpdGVfZmllbGRfZW5kKCkudW53cmFwKCk7CisvLyEgYGBgCisKK3VzZSBzdGQ6OmNvbnZlcnQ6OkZyb207Cit1c2Ugc3RkOjpmbXQ7Cit1c2Ugc3RkOjpmbXQ6OntEaXNwbGF5LCBGb3JtYXR0ZXJ9OwordXNlIHRyeV9mcm9tOjpUcnlGcm9tOworCit1c2UgdHJhbnNwb3J0Ojp7VFJlYWRUcmFuc3BvcnQsIFRXcml0ZVRyYW5zcG9ydH07Cit1c2Uge1Byb3RvY29sRXJyb3IsIFByb3RvY29sRXJyb3JLaW5kfTsKKworI1tjZmcodGVzdCldCittYWNyb19ydWxlcyEgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMgeworICAgICgkb19wcm90OmlkZW50LCAkZXhwZWN0ZWRfYnl0ZXM6aWRlbnQpID0+IHt7CisgICAgICAgIGFzc2VydF9lcSEoJG9fcHJvdC50cmFuc3BvcnQud3JpdGVfYnl0ZXMoKSwgJiRleHBlY3RlZF9ieXRlcyk7CisgICAgfX07Cit9CisKKy8vIEZJWE1FOiBzaG91bGQgdGFrZSBib3RoIHJlYWQgYW5kIHdyaXRlCisjW2NmZyh0ZXN0KV0KK21hY3JvX3J1bGVzISBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciB7CisgICAgKCRvX3Byb3Q6aWRlbnQpID0+IHt7CisgICAgICAgICRvX3Byb3QudHJhbnNwb3J0LmNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyKCk7CisgICAgfX07Cit9CisKKyNbY2ZnKHRlc3QpXQorbWFjcm9fcnVsZXMhIHNldF9yZWFkYWJsZV9ieXRlcyB7CisgICAgKCRpX3Byb3Q6aWRlbnQsICRieXRlczpleHByKSA9PiB7CisgICAgICAgICRpX3Byb3QudHJhbnNwb3J0LnNldF9yZWFkYWJsZV9ieXRlcygkYnl0ZXMpOworICAgIH07Cit9CisKK21vZCBiaW5hcnk7Cittb2QgY29tcGFjdDsKK21vZCBtdWx0aXBsZXhlZDsKK21vZCBzdG9yZWQ7CisKK3B1YiB1c2Ugc2VsZjo6YmluYXJ5Ojp7CisgICAgVEJpbmFyeUlucHV0UHJvdG9jb2wsIFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSwgVEJpbmFyeU91dHB1dFByb3RvY29sLAorICAgIFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3RvcnksCit9OworcHViIHVzZSBzZWxmOjpjb21wYWN0Ojp7CisgICAgVENvbXBhY3RJbnB1dFByb3RvY29sLCBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5LCBUQ29tcGFjdE91dHB1dFByb3RvY29sLAorICAgIFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorfTsKK3B1YiB1c2Ugc2VsZjo6bXVsdGlwbGV4ZWQ6OlRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sOworcHViIHVzZSBzZWxmOjpzdG9yZWQ6OlRTdG9yZWRJbnB1dFByb3RvY29sOworCisvLyBEZWZhdWx0IG1heGltdW0gZGVwdGggdG8gd2hpY2ggYFRJbnB1dFByb3RvY29sOjpza2lwYCB3aWxsIHNraXAgYSBUaHJpZnQKKy8vIGZpZWxkLiBBIGRlZmF1bHQgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgVGhyaWZ0IHN0cnVjdHMgb3IgY29sbGVjdGlvbnMgbWF5CisvLyBjb250YWluIG5lc3RlZCBzdHJ1Y3RzIGFuZCBjb2xsZWN0aW9ucywgd2hpY2ggY291bGQgcmVzdWx0IGluIGluZGVmaW5pdGUKKy8vIHJlY3Vyc2lvbi4KK2NvbnN0IE1BWElNVU1fU0tJUF9ERVBUSDogaTggPSA2NDsKKworLy8vIENvbnZlcnRzIGEgc3RyZWFtIG9mIGJ5dGVzIGludG8gVGhyaWZ0IGlkZW50aWZpZXJzLCBwcmltaXRpdmVzLAorLy8vIGNvbnRhaW5lcnMsIG9yIHN0cnVjdHMuCisvLy8KKy8vLyBUaGlzIHRyYWl0IGRvZXMgbm90IGRlYWwgd2l0aCBoaWdoZXItbGV2ZWwgVGhyaWZ0IGNvbmNlcHRzIGxpa2Ugc3RydWN0cyBvcgorLy8vIGV4Y2VwdGlvbnMgLSBvbmx5IHdpdGggcHJpbWl0aXZlcyBhbmQgbWVzc2FnZSBvciBjb250YWluZXIgYm91bmRhcmllcy4gT25jZQorLy8vIGJ5dGVzIGFyZSByZWFkIHRoZXkgYXJlIGRlc2VyaWFsaXplZCBhbmQgYW4gaWRlbnRpZmllciAoZm9yIGV4YW1wbGUKKy8vLyBgVE1lc3NhZ2VJZGVudGlmaWVyYCkgb3IgYSBwcmltaXRpdmUgaXMgcmV0dXJuZWQuCisvLy8KKy8vLyBBbGwgbWV0aG9kcyByZXR1cm4gYSBgdGhyaWZ0OjpSZXN1bHRgLiBJZiBhbiBgRXJyYCBpcyByZXR1cm5lZCB0aGUgcHJvdG9jb2wKKy8vLyBpbnN0YW5jZSBhbmQgaXRzIHVuZGVybHlpbmcgdHJhbnNwb3J0IHNob3VsZCBiZSB0ZXJtaW5hdGVkLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVElucHV0UHJvdG9jb2xgCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sLCBUSW5wdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oIjEyNy4wLjAuMTo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHByb3RvY29sID0gVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsLCB0cnVlKTsKKy8vLworLy8vIGxldCBmaWVsZF9pZGVudGlmaWVyID0gcHJvdG9jb2wucmVhZF9maWVsZF9iZWdpbigpLnVud3JhcCgpOworLy8vIGxldCBmaWVsZF9jb250ZW50cyA9IHByb3RvY29sLnJlYWRfc3RyaW5nKCkudW53cmFwKCk7CisvLy8gbGV0IGZpZWxkX2VuZCA9IHByb3RvY29sLnJlYWRfZmllbGRfZW5kKCkudW53cmFwKCk7CisvLy8gYGBgCitwdWIgdHJhaXQgVElucHV0UHJvdG9jb2wgeworICAgIC8vLyBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgYSBUaHJpZnQgbWVzc2FnZS4KKyAgICBmbiByZWFkX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWVzc2FnZUlkZW50aWZpZXI+OworICAgIC8vLyBSZWFkIHRoZSBlbmQgb2YgYSBUaHJpZnQgbWVzc2FnZS4KKyAgICBmbiByZWFkX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgYSBUaHJpZnQgc3RydWN0LgorICAgIGZuIHJlYWRfc3RydWN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8T3B0aW9uPFRTdHJ1Y3RJZGVudGlmaWVyPj47CisgICAgLy8vIFJlYWQgdGhlIGVuZCBvZiBhIFRocmlmdCBzdHJ1Y3QuCisgICAgZm4gcmVhZF9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgYSBUaHJpZnQgc3RydWN0IGZpZWxkLgorICAgIGZuIHJlYWRfZmllbGRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxURmllbGRJZGVudGlmaWVyPjsKKyAgICAvLy8gUmVhZCB0aGUgZW5kIG9mIGEgVGhyaWZ0IHN0cnVjdCBmaWVsZC4KKyAgICBmbiByZWFkX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gUmVhZCBhIGJvb2wuCisgICAgZm4gcmVhZF9ib29sKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8Ym9vbD47CisgICAgLy8vIFJlYWQgYSBmaXhlZC1sZW5ndGggYnl0ZSBhcnJheS4KKyAgICBmbiByZWFkX2J5dGVzKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VmVjPHU4Pj47CisgICAgLy8vIFJlYWQgYSB3b3JkLgorICAgIGZuIHJlYWRfaTgoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpOD47CisgICAgLy8vIFJlYWQgYSAxNi1iaXQgc2lnbmVkIGludGVnZXIuCisgICAgZm4gcmVhZF9pMTYoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMTY+OworICAgIC8vLyBSZWFkIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyLgorICAgIGZuIHJlYWRfaTMyKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTMyPjsKKyAgICAvLy8gUmVhZCBhIDY0LWJpdCBzaWduZWQgaW50ZWdlci4KKyAgICBmbiByZWFkX2k2NCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk2ND47CisgICAgLy8vIFJlYWQgYSA2NC1iaXQgZmxvYXQuCisgICAgZm4gcmVhZF9kb3VibGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxmNjQ+OworICAgIC8vLyBSZWFkIGEgZml4ZWQtbGVuZ3RoIHN0cmluZyAobm90IG51bGwgdGVybWluYXRlZCkuCisgICAgZm4gcmVhZF9zdHJpbmcoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxTdHJpbmc+OworICAgIC8vLyBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgYSBsaXN0LgorICAgIGZuIHJlYWRfbGlzdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRMaXN0SWRlbnRpZmllcj47CisgICAgLy8vIFJlYWQgdGhlIGVuZCBvZiBhIGxpc3QuCisgICAgZm4gcmVhZF9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgc2V0LgorICAgIGZuIHJlYWRfc2V0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VFNldElkZW50aWZpZXI+OworICAgIC8vLyBSZWFkIHRoZSBlbmQgb2YgYSBzZXQuCisgICAgZm4gcmVhZF9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgYSBtYXAuCisgICAgZm4gcmVhZF9tYXBfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWFwSWRlbnRpZmllcj47CisgICAgLy8vIFJlYWQgdGhlIGVuZCBvZiBhIG1hcC4KKyAgICBmbiByZWFkX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFNraXAgYSBmaWVsZCB3aXRoIHR5cGUgYGZpZWxkX3R5cGVgIHJlY3Vyc2l2ZWx5IHVudGlsIHRoZSBkZWZhdWx0CisgICAgLy8vIG1heGltdW0gc2tpcCBkZXB0aCBpcyByZWFjaGVkLgorICAgIGZuIHNraXAoJm11dCBzZWxmLCBmaWVsZF90eXBlOiBUVHlwZSkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5za2lwX3RpbGxfZGVwdGgoZmllbGRfdHlwZSwgTUFYSU1VTV9TS0lQX0RFUFRIKQorICAgIH0KKyAgICAvLy8gU2tpcCBhIGZpZWxkIHdpdGggdHlwZSBgZmllbGRfdHlwZWAgcmVjdXJzaXZlbHkgdXAgdG8gYGRlcHRoYCBsZXZlbHMuCisgICAgZm4gc2tpcF90aWxsX2RlcHRoKCZtdXQgc2VsZiwgZmllbGRfdHlwZTogVFR5cGUsIGRlcHRoOiBpOCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgaWYgZGVwdGggPT0gMCB7CisgICAgICAgICAgICByZXR1cm4gRXJyKDo6RXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpEZXB0aExpbWl0LAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBwYXJzZSBwYXN0IHs6P30iLCBmaWVsZF90eXBlKSwKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgfQorCisgICAgICAgIG1hdGNoIGZpZWxkX3R5cGUgeworICAgICAgICAgICAgVFR5cGU6OkJvb2wgPT4gc2VsZi5yZWFkX2Jvb2woKS5tYXAofF98ICgpKSwKKyAgICAgICAgICAgIFRUeXBlOjpJMDggPT4gc2VsZi5yZWFkX2k4KCkubWFwKHxffCAoKSksCisgICAgICAgICAgICBUVHlwZTo6STE2ID0+IHNlbGYucmVhZF9pMTYoKS5tYXAofF98ICgpKSwKKyAgICAgICAgICAgIFRUeXBlOjpJMzIgPT4gc2VsZi5yZWFkX2kzMigpLm1hcCh8X3wgKCkpLAorICAgICAgICAgICAgVFR5cGU6Okk2NCA9PiBzZWxmLnJlYWRfaTY0KCkubWFwKHxffCAoKSksCisgICAgICAgICAgICBUVHlwZTo6RG91YmxlID0+IHNlbGYucmVhZF9kb3VibGUoKS5tYXAofF98ICgpKSwKKyAgICAgICAgICAgIFRUeXBlOjpTdHJpbmcgPT4gc2VsZi5yZWFkX3N0cmluZygpLm1hcCh8X3wgKCkpLAorICAgICAgICAgICAgVFR5cGU6OlN0cnVjdCA9PiB7CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkX3N0cnVjdF9iZWdpbigpPzsKKyAgICAgICAgICAgICAgICBsb29wIHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IGZpZWxkX2lkZW50ID0gc2VsZi5yZWFkX2ZpZWxkX2JlZ2luKCk/OworICAgICAgICAgICAgICAgICAgICBpZiBmaWVsZF9pZGVudC5maWVsZF90eXBlID09IFRUeXBlOjpTdG9wIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2tpcF90aWxsX2RlcHRoKGZpZWxkX2lkZW50LmZpZWxkX3R5cGUsIGRlcHRoIC0gMSk/OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWxmLnJlYWRfc3RydWN0X2VuZCgpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBUVHlwZTo6TGlzdCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGxpc3RfaWRlbnQgPSBzZWxmLnJlYWRfbGlzdF9iZWdpbigpPzsKKyAgICAgICAgICAgICAgICBmb3IgXyBpbiAwLi5saXN0X2lkZW50LnNpemUgeworICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBfdGlsbF9kZXB0aChsaXN0X2lkZW50LmVsZW1lbnRfdHlwZSwgZGVwdGggLSAxKT87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbGYucmVhZF9saXN0X2VuZCgpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBUVHlwZTo6U2V0ID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgc2V0X2lkZW50ID0gc2VsZi5yZWFkX3NldF9iZWdpbigpPzsKKyAgICAgICAgICAgICAgICBmb3IgXyBpbiAwLi5zZXRfaWRlbnQuc2l6ZSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2tpcF90aWxsX2RlcHRoKHNldF9pZGVudC5lbGVtZW50X3R5cGUsIGRlcHRoIC0gMSk/OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWxmLnJlYWRfc2V0X2VuZCgpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBUVHlwZTo6TWFwID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgbWFwX2lkZW50ID0gc2VsZi5yZWFkX21hcF9iZWdpbigpPzsKKyAgICAgICAgICAgICAgICBmb3IgXyBpbiAwLi5tYXBfaWRlbnQuc2l6ZSB7CisgICAgICAgICAgICAgICAgICAgIGxldCBrZXlfdHlwZSA9IG1hcF9pZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgLmtleV90eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAuZXhwZWN0KCJub24temVybyBzaXplZCBtYXAgc2hvdWxkIGNvbnRhaW4ga2V5IHR5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHZhbF90eXBlID0gbWFwX2lkZW50CisgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgLmV4cGVjdCgibm9uLXplcm8gc2l6ZWQgbWFwIHNob3VsZCBjb250YWluIHZhbHVlIHR5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5za2lwX3RpbGxfZGVwdGgoa2V5X3R5cGUsIGRlcHRoIC0gMSk/OworICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBfdGlsbF9kZXB0aCh2YWxfdHlwZSwgZGVwdGggLSAxKT87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbGYucmVhZF9tYXBfZW5kKCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHUgPT4gRXJyKDo6RXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBza2lwIGZpZWxkIHR5cGUgezo/fSIsICZ1KSwKKyAgICAgICAgICAgIH0pKSwKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHV0aWxpdHkgKERPIE5PVCBVU0UgSU4gR0VORVJBVEVEIENPREUhISEhKQorICAgIC8vCisKKyAgICAvLy8gUmVhZCBhbiB1bnNpZ25lZCBieXRlLgorICAgIC8vLworICAgIC8vLyBUaGlzIG1ldGhvZCBzaG91bGQgKipuZXZlcioqIGJlIHVzZWQgaW4gZ2VuZXJhdGVkIGNvZGUuCisgICAgZm4gcmVhZF9ieXRlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8dTg+OworfQorCisvLy8gQ29udmVydHMgVGhyaWZ0IGlkZW50aWZpZXJzLCBwcmltaXRpdmVzLCBjb250YWluZXJzIG9yIHN0cnVjdHMgaW50byBhCisvLy8gc3RyZWFtIG9mIGJ5dGVzLgorLy8vCisvLy8gVGhpcyB0cmFpdCBkb2VzIG5vdCBkZWFsIHdpdGggaGlnaGVyLWxldmVsIFRocmlmdCBjb25jZXB0cyBsaWtlIHN0cnVjdHMgb3IKKy8vLyBleGNlcHRpb25zIC0gb25seSB3aXRoIHByaW1pdGl2ZXMgYW5kIG1lc3NhZ2Ugb3IgY29udGFpbmVyIGJvdW5kYXJpZXMuCisvLy8gV3JpdGUgbWV0aG9kcyB0YWtlIGFuIGlkZW50aWZpZXIgKGZvciBleGFtcGxlLCBgVE1lc3NhZ2VJZGVudGlmaWVyYCkgb3IgYQorLy8vIHByaW1pdGl2ZS4gQW55IG9yIGFsbCBvZiB0aGUgZmllbGRzIGluIGFuIGlkZW50aWZpZXIgbWF5IGJlIG9taXR0ZWQgd2hlbgorLy8vIHdyaXRpbmcgdG8gdGhlIHRyYW5zcG9ydC4gV3JpdGUgbWV0aG9kcyBtYXkgZXZlbiBiZSBub29wcy4gQWxsIG9mIHRoaXMgaXMKKy8vLyB0cmFuc3BhcmVudCB0byB0aGUgY2FsbGVyOyBhcyBsb25nIGFzIGEgbWF0Y2hpbmcgYFRJbnB1dFByb3RvY29sYAorLy8vIGltcGxlbWVudGF0aW9uIGlzIHVzZWQsIHJlY2VpdmVkIG1lc3NhZ2VzIHdpbGwgYmUgZGVjb2RlZCBjb3JyZWN0bHkuCisvLy8KKy8vLyBBbGwgbWV0aG9kcyByZXR1cm4gYSBgdGhyaWZ0OjpSZXN1bHRgLiBJZiBhbiBgRXJyYCBpcyByZXR1cm5lZCB0aGUgcHJvdG9jb2wKKy8vLyBpbnN0YW5jZSBhbmQgaXRzIHVuZGVybHlpbmcgdHJhbnNwb3J0IHNob3VsZCBiZSB0ZXJtaW5hdGVkLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVE91dHB1dFByb3RvY29sYAorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRGaWVsZElkZW50aWZpZXIsIFRPdXRwdXRQcm90b2NvbCwgVFR5cGV9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCIxMjcuMC4wLjE6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCBwcm90b2NvbCA9IFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwsIHRydWUpOworLy8vCisvLy8gcHJvdG9jb2wud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygic3RyaW5nX3RoaW5nIiwgVFR5cGU6OlN0cmluZywgMSkpLnVud3JhcCgpOworLy8vIHByb3RvY29sLndyaXRlX3N0cmluZygiZm9vIikudW53cmFwKCk7CisvLy8gcHJvdG9jb2wud3JpdGVfZmllbGRfZW5kKCkudW53cmFwKCk7CisvLy8gYGBgCitwdWIgdHJhaXQgVE91dHB1dFByb3RvY29sIHsKKyAgICAvLy8gV3JpdGUgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBtZXNzYWdlLgorICAgIGZuIHdyaXRlX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1lc3NhZ2VJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBlbmQgb2YgYSBUaHJpZnQgbWVzc2FnZS4KKyAgICBmbiB3cml0ZV9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBzdHJ1Y3QuCisgICAgZm4gd3JpdGVfc3RydWN0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRTdHJ1Y3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBlbmQgb2YgYSBUaHJpZnQgc3RydWN0LgorICAgIGZuIHdyaXRlX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBiZWdpbm5pbmcgb2YgYSBUaHJpZnQgZmllbGQuCisgICAgZm4gd3JpdGVfZmllbGRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVEZpZWxkSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgZW5kIG9mIGEgVGhyaWZ0IGZpZWxkLgorICAgIGZuIHdyaXRlX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYSBTVE9QIGZpZWxkIGluZGljYXRpbmcgdGhhdCBhbGwgdGhlIGZpZWxkcyBpbiBhIHN0cnVjdCBoYXZlIGJlZW4KKyAgICAvLy8gd3JpdHRlbi4KKyAgICBmbiB3cml0ZV9maWVsZF9zdG9wKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSBhIGJvb2wuCisgICAgZm4gd3JpdGVfYm9vbCgmbXV0IHNlbGYsIGI6IGJvb2wpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYSBmaXhlZC1sZW5ndGggYnl0ZSBhcnJheS4KKyAgICBmbiB3cml0ZV9ieXRlcygmbXV0IHNlbGYsIGI6ICZbdThdKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGFuIDgtYml0IHNpZ25lZCBpbnRlZ2VyLgorICAgIGZuIHdyaXRlX2k4KCZtdXQgc2VsZiwgaTogaTgpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYSAxNi1iaXQgc2lnbmVkIGludGVnZXIuCisgICAgZm4gd3JpdGVfaTE2KCZtdXQgc2VsZiwgaTogaTE2KSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyLgorICAgIGZuIHdyaXRlX2kzMigmbXV0IHNlbGYsIGk6IGkzMikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSBhIDY0LWJpdCBzaWduZWQgaW50ZWdlci4KKyAgICBmbiB3cml0ZV9pNjQoJm11dCBzZWxmLCBpOiBpNjQpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYSA2NC1iaXQgZmxvYXQuCisgICAgZm4gd3JpdGVfZG91YmxlKCZtdXQgc2VsZiwgZDogZjY0KSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGEgZml4ZWQtbGVuZ3RoIHN0cmluZy4KKyAgICBmbiB3cml0ZV9zdHJpbmcoJm11dCBzZWxmLCBzOiAmc3RyKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBiZWdpbm5pbmcgb2YgYSBsaXN0LgorICAgIGZuIHdyaXRlX2xpc3RfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVExpc3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBlbmQgb2YgYSBsaXN0LgorICAgIGZuIHdyaXRlX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgYmVnaW5uaW5nIG9mIGEgc2V0LgorICAgIGZuIHdyaXRlX3NldF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUU2V0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgZW5kIG9mIGEgc2V0LgorICAgIGZuIHdyaXRlX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBiZWdpbm5pbmcgb2YgYSBtYXAuCisgICAgZm4gd3JpdGVfbWFwX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNYXBJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBlbmQgb2YgYSBtYXAuCisgICAgZm4gd3JpdGVfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gRmx1c2ggYnVmZmVyZWQgYnl0ZXMgdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworCisgICAgLy8gdXRpbGl0eSAoRE8gTk9UIFVTRSBJTiBHRU5FUkFURUQgQ09ERSEhISEpCisgICAgLy8KKworICAgIC8vLyBXcml0ZSBhbiB1bnNpZ25lZCBieXRlLgorICAgIC8vLworICAgIC8vLyBUaGlzIG1ldGhvZCBzaG91bGQgKipuZXZlcioqIGJlIHVzZWQgaW4gZ2VuZXJhdGVkIGNvZGUuCisgICAgZm4gd3JpdGVfYnl0ZSgmbXV0IHNlbGYsIGI6IHU4KSAtPiA6OlJlc3VsdDwoKT47IC8vIEZJWE1FOiBSRU1PVkUKK30KKworaW1wbDxQPiBUSW5wdXRQcm90b2NvbCBmb3IgQm94PFA+Cit3aGVyZQorICAgIFA6IFRJbnB1dFByb3RvY29sICsgP1NpemVkLAoreworICAgIGZuIHJlYWRfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNZXNzYWdlSWRlbnRpZmllcj4geworICAgICAgICAoKipzZWxmKS5yZWFkX21lc3NhZ2VfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS5yZWFkX21lc3NhZ2VfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PE9wdGlvbjxUU3RydWN0SWRlbnRpZmllcj4+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9zdHJ1Y3RfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfc3RydWN0X2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9maWVsZF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRGaWVsZElkZW50aWZpZXI+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9maWVsZF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS5yZWFkX2ZpZWxkX2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9ib29sKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8Ym9vbD4geworICAgICAgICAoKipzZWxmKS5yZWFkX2Jvb2woKQorICAgIH0KKworICAgIGZuIHJlYWRfYnl0ZXMoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxWZWM8dTg+PiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfYnl0ZXMoKQorICAgIH0KKworICAgIGZuIHJlYWRfaTgoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpOD4geworICAgICAgICAoKipzZWxmKS5yZWFkX2k4KCkKKyAgICB9CisKKyAgICBmbiByZWFkX2kxNigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkxNj4geworICAgICAgICAoKipzZWxmKS5yZWFkX2kxNigpCisgICAgfQorCisgICAgZm4gcmVhZF9pMzIoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMzI+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9pMzIoKQorICAgIH0KKworICAgIGZuIHJlYWRfaTY0KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTY0PiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfaTY0KCkKKyAgICB9CisKKyAgICBmbiByZWFkX2RvdWJsZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGY2ND4geworICAgICAgICAoKipzZWxmKS5yZWFkX2RvdWJsZSgpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJpbmcoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9zdHJpbmcoKQorICAgIH0KKworICAgIGZuIHJlYWRfbGlzdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRMaXN0SWRlbnRpZmllcj4geworICAgICAgICAoKipzZWxmKS5yZWFkX2xpc3RfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS5yZWFkX2xpc3RfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3NldF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRTZXRJZGVudGlmaWVyPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfc2V0X2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS5yZWFkX3NldF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfbWFwX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1hcElkZW50aWZpZXI+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9tYXBfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfbWFwX2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9ieXRlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8dTg+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9ieXRlKCkKKyAgICB9Cit9CisKK2ltcGw8UD4gVE91dHB1dFByb3RvY29sIGZvciBCb3g8UD4KK3doZXJlCisgICAgUDogVE91dHB1dFByb3RvY29sICsgP1NpemVkLAoreworICAgIGZuIHdyaXRlX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1lc3NhZ2VJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9tZXNzYWdlX2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9tZXNzYWdlX2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RydWN0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRTdHJ1Y3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9zdHJ1Y3RfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfc3RydWN0X2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVEZpZWxkSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfZmllbGRfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9maWVsZF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX3N0b3AoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9maWVsZF9zdG9wKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9ib29sKCZtdXQgc2VsZiwgYjogYm9vbCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfYm9vbChiKQorICAgIH0KKworICAgIGZuIHdyaXRlX2J5dGVzKCZtdXQgc2VsZiwgYjogJlt1OF0pIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2J5dGVzKGIpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTgoJm11dCBzZWxmLCBpOiBpOCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfaTgoaSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pMTYoJm11dCBzZWxmLCBpOiBpMTYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2kxNihpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2kzMigmbXV0IHNlbGYsIGk6IGkzMikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfaTMyKGkpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTY0KCZtdXQgc2VsZiwgaTogaTY0KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9pNjQoaSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9kb3VibGUoJm11dCBzZWxmLCBkOiBmNjQpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2RvdWJsZShkKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cmluZygmbXV0IHNlbGYsIHM6ICZzdHIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX3N0cmluZyhzKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVExpc3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9saXN0X2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9saXN0X2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfc2V0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRTZXRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9zZXRfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfc2V0X2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWFwX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNYXBJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9tYXBfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfbWFwX2VuZCgpCisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS5mbHVzaCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfYnl0ZSgmbXV0IHNlbGYsIGI6IHU4KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9ieXRlKGIpCisgICAgfQorfQorCisvLy8gSGVscGVyIHR5cGUgdXNlZCBieSBzZXJ2ZXJzIHRvIGNyZWF0ZSBgVElucHV0UHJvdG9jb2xgIGluc3RhbmNlcyBmb3IKKy8vLyBhY2NlcHRlZCBjbGllbnQgY29ubmVjdGlvbnMuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYSBgVElucHV0UHJvdG9jb2xGYWN0b3J5YCBhbmQgdXNlIGl0IHRvIGNyZWF0ZSBhIGBUSW5wdXRQcm90b2NvbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSwgVElucHV0UHJvdG9jb2xGYWN0b3J5fTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigiMTI3LjAuMC4xOjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBmYWN0b3J5ID0gVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKTsKKy8vLyBsZXQgcHJvdG9jb2wgPSBmYWN0b3J5LmNyZWF0ZShCb3g6Om5ldyhjaGFubmVsKSk7CisvLy8gYGBgCitwdWIgdHJhaXQgVElucHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAvLyBDcmVhdGUgYSBgVElucHV0UHJvdG9jb2xgIHRoYXQgcmVhZHMgYnl0ZXMgZnJvbSBgdHJhbnNwb3J0YC4KKyAgICBmbiBjcmVhdGUoJnNlbGYsIHRyYW5zcG9ydDogQm94PFRSZWFkVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUSW5wdXRQcm90b2NvbCArIFNlbmQ+OworfQorCitpbXBsPFQ+IFRJbnB1dFByb3RvY29sRmFjdG9yeSBmb3IgQm94PFQ+Cit3aGVyZQorICAgIFQ6IFRJbnB1dFByb3RvY29sRmFjdG9yeSArID9TaXplZCwKK3sKKyAgICBmbiBjcmVhdGUoJnNlbGYsIHRyYW5zcG9ydDogQm94PFRSZWFkVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUSW5wdXRQcm90b2NvbCArIFNlbmQ+IHsKKyAgICAgICAgKCoqc2VsZikuY3JlYXRlKHRyYW5zcG9ydCkKKyAgICB9Cit9CisKKy8vLyBIZWxwZXIgdHlwZSB1c2VkIGJ5IHNlcnZlcnMgdG8gY3JlYXRlIGBUT3V0cHV0UHJvdG9jb2xgIGluc3RhbmNlcyBmb3IKKy8vLyBhY2NlcHRlZCBjbGllbnQgY29ubmVjdGlvbnMuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYSBgVE91dHB1dFByb3RvY29sRmFjdG9yeWAgYW5kIHVzZSBpdCB0byBjcmVhdGUgYSBgVE91dHB1dFByb3RvY29sYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeSwgVE91dHB1dFByb3RvY29sRmFjdG9yeX07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oIjEyNy4wLjAuMTo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgZmFjdG9yeSA9IFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpOworLy8vIGxldCBwcm90b2NvbCA9IGZhY3RvcnkuY3JlYXRlKEJveDo6bmV3KGNoYW5uZWwpKTsKKy8vLyBgYGAKK3B1YiB0cmFpdCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRPdXRwdXRQcm90b2NvbGAgdGhhdCB3cml0ZXMgYnl0ZXMgdG8gYHRyYW5zcG9ydGAuCisgICAgZm4gY3JlYXRlKCZzZWxmLCB0cmFuc3BvcnQ6IEJveDxUV3JpdGVUcmFuc3BvcnQgKyBTZW5kPikgLT4gQm94PFRPdXRwdXRQcm90b2NvbCArIFNlbmQ+OworfQorCitpbXBsPFQ+IFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgZm9yIEJveDxUPgord2hlcmUKKyAgICBUOiBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5ICsgP1NpemVkLAoreworICAgIGZuIGNyZWF0ZSgmc2VsZiwgdHJhbnNwb3J0OiBCb3g8VFdyaXRlVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUT3V0cHV0UHJvdG9jb2wgKyBTZW5kPiB7CisgICAgICAgICgqKnNlbGYpLmNyZWF0ZSh0cmFuc3BvcnQpCisgICAgfQorfQorCisvLy8gVGhyaWZ0IG1lc3NhZ2UgaWRlbnRpZmllci4KKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFRNZXNzYWdlSWRlbnRpZmllciB7CisgICAgLy8vIFNlcnZpY2UgY2FsbCB0aGUgbWVzc2FnZSBpcyBhc3NvY2lhdGVkIHdpdGguCisgICAgcHViIG5hbWU6IFN0cmluZywKKyAgICAvLy8gTWVzc2FnZSB0eXBlLgorICAgIHB1YiBtZXNzYWdlX3R5cGU6IFRNZXNzYWdlVHlwZSwKKyAgICAvLy8gT3JkZXJlZCBzZXF1ZW5jZSBudW1iZXIgaWRlbnRpZnlpbmcgdGhlIG1lc3NhZ2UuCisgICAgcHViIHNlcXVlbmNlX251bWJlcjogaTMyLAorfQorCitpbXBsIFRNZXNzYWdlSWRlbnRpZmllciB7CisgICAgLy8vIENyZWF0ZSBhIGBUTWVzc2FnZUlkZW50aWZpZXJgIGZvciBhIFRocmlmdCBzZXJ2aWNlLWNhbGwgbmFtZWQgYG5hbWVgCisgICAgLy8vIHdpdGggbWVzc2FnZSB0eXBlIGBtZXNzYWdlX3R5cGVgIGFuZCBzZXF1ZW5jZSBudW1iZXIgYHNlcXVlbmNlX251bWJlcmAuCisgICAgcHViIGZuIG5ldzxTOiBJbnRvPFN0cmluZz4+KAorICAgICAgICBuYW1lOiBTLAorICAgICAgICBtZXNzYWdlX3R5cGU6IFRNZXNzYWdlVHlwZSwKKyAgICAgICAgc2VxdWVuY2VfbnVtYmVyOiBpMzIsCisgICAgKSAtPiBUTWVzc2FnZUlkZW50aWZpZXIgeworICAgICAgICBUTWVzc2FnZUlkZW50aWZpZXIgeworICAgICAgICAgICAgbmFtZTogbmFtZS5pbnRvKCksCisgICAgICAgICAgICBtZXNzYWdlX3R5cGU6IG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgIHNlcXVlbmNlX251bWJlcjogc2VxdWVuY2VfbnVtYmVyLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gVGhyaWZ0IHN0cnVjdCBpZGVudGlmaWVyLgorI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgVFN0cnVjdElkZW50aWZpZXIgeworICAgIC8vLyBOYW1lIG9mIHRoZSBlbmNvZGVkIFRocmlmdCBzdHJ1Y3QuCisgICAgcHViIG5hbWU6IFN0cmluZywKK30KKworaW1wbCBUU3RydWN0SWRlbnRpZmllciB7CisgICAgLy8vIENyZWF0ZSBhIGBUU3RydWN0SWRlbnRpZmllcmAgZm9yIGEgc3RydWN0IG5hbWVkIGBuYW1lYC4KKyAgICBwdWIgZm4gbmV3PFM6IEludG88U3RyaW5nPj4obmFtZTogUykgLT4gVFN0cnVjdElkZW50aWZpZXIgeworICAgICAgICBUU3RydWN0SWRlbnRpZmllciB7IG5hbWU6IG5hbWUuaW50bygpIH0KKyAgICB9Cit9CisKKy8vLyBUaHJpZnQgZmllbGQgaWRlbnRpZmllci4KKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFRGaWVsZElkZW50aWZpZXIgeworICAgIC8vLyBOYW1lIG9mIHRoZSBUaHJpZnQgZmllbGQuCisgICAgLy8vCisgICAgLy8vIGBOb25lYCBpZiBpdCdzIG5vdCBzZW50IG92ZXIgdGhlIHdpcmUuCisgICAgcHViIG5hbWU6IE9wdGlvbjxTdHJpbmc+LAorICAgIC8vLyBGaWVsZCB0eXBlLgorICAgIC8vLworICAgIC8vLyBUaGlzIG1heSBiZSBhIHByaW1pdGl2ZSwgY29udGFpbmVyLCBvciBhIHN0cnVjdC4KKyAgICBwdWIgZmllbGRfdHlwZTogVFR5cGUsCisgICAgLy8vIFRocmlmdCBmaWVsZCBpZC4KKyAgICAvLy8KKyAgICAvLy8gYE5vbmVgIG9ubHkgaWYgYGZpZWxkX3R5cGVgIGlzIGBUVHlwZTo6U3RvcGAuCisgICAgcHViIGlkOiBPcHRpb248aTE2PiwKK30KKworaW1wbCBURmllbGRJZGVudGlmaWVyIHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRGaWVsZElkZW50aWZpZXJgIGZvciBhIGZpZWxkIG5hbWVkIGBuYW1lYCB3aXRoIHR5cGUKKyAgICAvLy8gYGZpZWxkX3R5cGVgIGFuZCBmaWVsZCBpZCBgaWRgLgorICAgIC8vLworICAgIC8vLyBgaWRgIHNob3VsZCBiZSBgTm9uZWAgaWYgYGZpZWxkX3R5cGVgIGlzIGBUVHlwZTo6U3RvcGAuCisgICAgcHViIGZuIG5ldzxOLCBTLCBJPihuYW1lOiBOLCBmaWVsZF90eXBlOiBUVHlwZSwgaWQ6IEkpIC0+IFRGaWVsZElkZW50aWZpZXIKKyAgICB3aGVyZQorICAgICAgICBOOiBJbnRvPE9wdGlvbjxTPj4sCisgICAgICAgIFM6IEludG88U3RyaW5nPiwKKyAgICAgICAgSTogSW50bzxPcHRpb248aTE2Pj4sCisgICAgeworICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIG5hbWU6IG5hbWUuaW50bygpLm1hcCh8bnwgbi5pbnRvKCkpLAorICAgICAgICAgICAgZmllbGRfdHlwZTogZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGlkOiBpZC5pbnRvKCksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBUaHJpZnQgbGlzdCBpZGVudGlmaWVyLgorI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgVExpc3RJZGVudGlmaWVyIHsKKyAgICAvLy8gVHlwZSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGxpc3QuCisgICAgcHViIGVsZW1lbnRfdHlwZTogVFR5cGUsCisgICAgLy8vIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdC4KKyAgICBwdWIgc2l6ZTogaTMyLAorfQorCitpbXBsIFRMaXN0SWRlbnRpZmllciB7CisgICAgLy8vIENyZWF0ZSBhIGBUTGlzdElkZW50aWZpZXJgIGZvciBhIGxpc3Qgd2l0aCBgc2l6ZWAgZWxlbWVudHMgb2YgdHlwZQorICAgIC8vLyBgZWxlbWVudF90eXBlYC4KKyAgICBwdWIgZm4gbmV3KGVsZW1lbnRfdHlwZTogVFR5cGUsIHNpemU6IGkzMikgLT4gVExpc3RJZGVudGlmaWVyIHsKKyAgICAgICAgVExpc3RJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIGVsZW1lbnRfdHlwZTogZWxlbWVudF90eXBlLAorICAgICAgICAgICAgc2l6ZTogc2l6ZSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIFRocmlmdCBzZXQgaWRlbnRpZmllci4KKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFRTZXRJZGVudGlmaWVyIHsKKyAgICAvLy8gVHlwZSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHNldC4KKyAgICBwdWIgZWxlbWVudF90eXBlOiBUVHlwZSwKKyAgICAvLy8gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBzZXQuCisgICAgcHViIHNpemU6IGkzMiwKK30KKworaW1wbCBUU2V0SWRlbnRpZmllciB7CisgICAgLy8vIENyZWF0ZSBhIGBUU2V0SWRlbnRpZmllcmAgZm9yIGEgc2V0IHdpdGggYHNpemVgIGVsZW1lbnRzIG9mIHR5cGUKKyAgICAvLy8gYGVsZW1lbnRfdHlwZWAuCisgICAgcHViIGZuIG5ldyhlbGVtZW50X3R5cGU6IFRUeXBlLCBzaXplOiBpMzIpIC0+IFRTZXRJZGVudGlmaWVyIHsKKyAgICAgICAgVFNldElkZW50aWZpZXIgeworICAgICAgICAgICAgZWxlbWVudF90eXBlOiBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICBzaXplOiBzaXplLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gVGhyaWZ0IG1hcCBpZGVudGlmaWVyLgorI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgVE1hcElkZW50aWZpZXIgeworICAgIC8vLyBNYXAga2V5IHR5cGUuCisgICAgcHViIGtleV90eXBlOiBPcHRpb248VFR5cGU+LAorICAgIC8vLyBNYXAgdmFsdWUgdHlwZS4KKyAgICBwdWIgdmFsdWVfdHlwZTogT3B0aW9uPFRUeXBlPiwKKyAgICAvLy8gTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIG1hcC4KKyAgICBwdWIgc2l6ZTogaTMyLAorfQorCitpbXBsIFRNYXBJZGVudGlmaWVyIHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRNYXBJZGVudGlmaWVyYCBmb3IgYSBtYXAgd2l0aCBgc2l6ZWAgZW50cmllcyBvZiB0eXBlCisgICAgLy8vIGBrZXlfdHlwZSAtPiB2YWx1ZV90eXBlYC4KKyAgICBwdWIgZm4gbmV3PEssIFY+KGtleV90eXBlOiBLLCB2YWx1ZV90eXBlOiBWLCBzaXplOiBpMzIpIC0+IFRNYXBJZGVudGlmaWVyCisgICAgd2hlcmUKKyAgICAgICAgSzogSW50bzxPcHRpb248VFR5cGU+PiwKKyAgICAgICAgVjogSW50bzxPcHRpb248VFR5cGU+PiwKKyAgICB7CisgICAgICAgIFRNYXBJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIGtleV90eXBlOiBrZXlfdHlwZS5pbnRvKCksCisgICAgICAgICAgICB2YWx1ZV90eXBlOiB2YWx1ZV90eXBlLmludG8oKSwKKyAgICAgICAgICAgIHNpemU6IHNpemUsCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBUaHJpZnQgbWVzc2FnZSB0eXBlcy4KKyNbZGVyaXZlKENsb25lLCBDb3B5LCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgZW51bSBUTWVzc2FnZVR5cGUgeworICAgIC8vLyBTZXJ2aWNlLWNhbGwgcmVxdWVzdC4KKyAgICBDYWxsLAorICAgIC8vLyBTZXJ2aWNlLWNhbGwgcmVzcG9uc2UuCisgICAgUmVwbHksCisgICAgLy8vIFVuZXhwZWN0ZWQgZXJyb3IgaW4gdGhlIHJlbW90ZSBzZXJ2aWNlLgorICAgIEV4Y2VwdGlvbiwKKyAgICAvLy8gT25lLXdheSBzZXJ2aWNlLWNhbGwgcmVxdWVzdCAobm8gcmVzcG9uc2UgaXMgZXhwZWN0ZWQpLgorICAgIE9uZVdheSwKK30KKworaW1wbCBEaXNwbGF5IGZvciBUTWVzc2FnZVR5cGUgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgbWF0Y2ggKnNlbGYgeworICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpDYWxsID0+IHdyaXRlIShmLCAiQ2FsbCIpLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpSZXBseSA9PiB3cml0ZSEoZiwgIlJlcGx5IiksCisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OkV4Y2VwdGlvbiA9PiB3cml0ZSEoZiwgIkV4Y2VwdGlvbiIpLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpPbmVXYXkgPT4gd3JpdGUhKGYsICJPbmVXYXkiKSwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBGcm9tPFRNZXNzYWdlVHlwZT4gZm9yIHU4IHsKKyAgICBmbiBmcm9tKG1lc3NhZ2VfdHlwZTogVE1lc3NhZ2VUeXBlKSAtPiBTZWxmIHsKKyAgICAgICAgbWF0Y2ggbWVzc2FnZV90eXBlIHsKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6Q2FsbCA9PiAweDAxLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpSZXBseSA9PiAweDAyLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpFeGNlcHRpb24gPT4gMHgwMywKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6T25lV2F5ID0+IDB4MDQsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgVHJ5RnJvbTx1OD4gZm9yIFRNZXNzYWdlVHlwZSB7CisgICAgdHlwZSBFcnIgPSA6OkVycm9yOworICAgIGZuIHRyeV9mcm9tKGI6IHU4KSAtPiA6OlJlc3VsdDxTZWxmPiB7CisgICAgICAgIG1hdGNoIGIgeworICAgICAgICAgICAgMHgwMSA9PiBPayhUTWVzc2FnZVR5cGU6OkNhbGwpLAorICAgICAgICAgICAgMHgwMiA9PiBPayhUTWVzc2FnZVR5cGU6OlJlcGx5KSwKKyAgICAgICAgICAgIDB4MDMgPT4gT2soVE1lc3NhZ2VUeXBlOjpFeGNlcHRpb24pLAorICAgICAgICAgICAgMHgwNCA9PiBPayhUTWVzc2FnZVR5cGU6Ok9uZVdheSksCisgICAgICAgICAgICB1bmtuID0+IEVycig6OkVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEsCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY2Fubm90IGNvbnZlcnQge30gdG8gVE1lc3NhZ2VUeXBlIiwgdW5rbiksCisgICAgICAgICAgICB9KSksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBUaHJpZnQgc3RydWN0LWZpZWxkIHR5cGVzLgorI1tkZXJpdmUoQ2xvbmUsIENvcHksIERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBlbnVtIFRUeXBlIHsKKyAgICAvLy8gSW5kaWNhdGVzIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgc2VyaWFsaXplZCBmaWVsZHMgaW4gdGhpcyBUaHJpZnQgc3RydWN0LgorICAgIFN0b3AsCisgICAgLy8vIFZvaWQgKGAoKWApIGZpZWxkLgorICAgIFZvaWQsCisgICAgLy8vIEJvb2xlYW4uCisgICAgQm9vbCwKKyAgICAvLy8gU2lnbmVkIDgtYml0IGludC4KKyAgICBJMDgsCisgICAgLy8vIERvdWJsZS1wcmVjaXNpb24gbnVtYmVyLgorICAgIERvdWJsZSwKKyAgICAvLy8gU2lnbmVkIDE2LWJpdCBpbnQuCisgICAgSTE2LAorICAgIC8vLyBTaWduZWQgMzItYml0IGludC4KKyAgICBJMzIsCisgICAgLy8vIFNpZ25lZCA2NC1iaXQgaW50LgorICAgIEk2NCwKKyAgICAvLy8gVVRGLTggc3RyaW5nLgorICAgIFN0cmluZywKKyAgICAvLy8gVVRGLTcgc3RyaW5nLiAqVW5zdXBwb3J0ZWQqLgorICAgIFV0ZjcsCisgICAgLy8vIFRocmlmdCBzdHJ1Y3QuCisgICAgU3RydWN0LAorICAgIC8vLyBNYXAuCisgICAgTWFwLAorICAgIC8vLyBTZXQuCisgICAgU2V0LAorICAgIC8vLyBMaXN0LgorICAgIExpc3QsCisgICAgLy8vIFVURi04IHN0cmluZy4KKyAgICBVdGY4LAorICAgIC8vLyBVVEYtMTYgc3RyaW5nLiAqVW5zdXBwb3J0ZWQqLgorICAgIFV0ZjE2LAorfQorCitpbXBsIERpc3BsYXkgZm9yIFRUeXBlIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIG1hdGNoICpzZWxmIHsKKyAgICAgICAgICAgIFRUeXBlOjpTdG9wID0+IHdyaXRlIShmLCAiU1RPUCIpLAorICAgICAgICAgICAgVFR5cGU6OlZvaWQgPT4gd3JpdGUhKGYsICJ2b2lkIiksCisgICAgICAgICAgICBUVHlwZTo6Qm9vbCA9PiB3cml0ZSEoZiwgImJvb2wiKSwKKyAgICAgICAgICAgIFRUeXBlOjpJMDggPT4gd3JpdGUhKGYsICJpMDgiKSwKKyAgICAgICAgICAgIFRUeXBlOjpEb3VibGUgPT4gd3JpdGUhKGYsICJkb3VibGUiKSwKKyAgICAgICAgICAgIFRUeXBlOjpJMTYgPT4gd3JpdGUhKGYsICJpMTYiKSwKKyAgICAgICAgICAgIFRUeXBlOjpJMzIgPT4gd3JpdGUhKGYsICJpMzIiKSwKKyAgICAgICAgICAgIFRUeXBlOjpJNjQgPT4gd3JpdGUhKGYsICJpNjQiKSwKKyAgICAgICAgICAgIFRUeXBlOjpTdHJpbmcgPT4gd3JpdGUhKGYsICJzdHJpbmciKSwKKyAgICAgICAgICAgIFRUeXBlOjpVdGY3ID0+IHdyaXRlIShmLCAiVVRGNyIpLAorICAgICAgICAgICAgVFR5cGU6OlN0cnVjdCA9PiB3cml0ZSEoZiwgInN0cnVjdCIpLAorICAgICAgICAgICAgVFR5cGU6Ok1hcCA9PiB3cml0ZSEoZiwgIm1hcCIpLAorICAgICAgICAgICAgVFR5cGU6OlNldCA9PiB3cml0ZSEoZiwgInNldCIpLAorICAgICAgICAgICAgVFR5cGU6Okxpc3QgPT4gd3JpdGUhKGYsICJsaXN0IiksCisgICAgICAgICAgICBUVHlwZTo6VXRmOCA9PiB3cml0ZSEoZiwgIlVURjgiKSwKKyAgICAgICAgICAgIFRUeXBlOjpVdGYxNiA9PiB3cml0ZSEoZiwgIlVURjE2IiksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBDb21wYXJlIHRoZSBleHBlY3RlZCBtZXNzYWdlIHNlcXVlbmNlIG51bWJlciBgZXhwZWN0ZWRgIHdpdGggdGhlIHJlY2VpdmVkCisvLy8gbWVzc2FnZSBzZXF1ZW5jZSBudW1iZXIgYGFjdHVhbGAuCisvLy8KKy8vLyBSZXR1cm4gYCgpYCBpZiBgYWN0dWFsID09IGV4cGVjdGVkYCwgYEVycmAgb3RoZXJ3aXNlLgorcHViIGZuIHZlcmlmeV9leHBlY3RlZF9zZXF1ZW5jZV9udW1iZXIoZXhwZWN0ZWQ6IGkzMiwgYWN0dWFsOiBpMzIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgaWYgZXhwZWN0ZWQgPT0gYWN0dWFsIHsKKyAgICAgICAgT2soKCkpCisgICAgfSBlbHNlIHsKKyAgICAgICAgRXJyKDo6RXJyb3I6OkFwcGxpY2F0aW9uKDo6QXBwbGljYXRpb25FcnJvciB7CisgICAgICAgICAgICBraW5kOiA6OkFwcGxpY2F0aW9uRXJyb3JLaW5kOjpCYWRTZXF1ZW5jZUlkLAorICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiZXhwZWN0ZWQge30gZ290IHt9IiwgZXhwZWN0ZWQsIGFjdHVhbCksCisgICAgICAgIH0pKQorICAgIH0KK30KKworLy8vIENvbXBhcmUgdGhlIGV4cGVjdGVkIHNlcnZpY2UtY2FsbCBuYW1lIGBleHBlY3RlZGAgd2l0aCB0aGUgcmVjZWl2ZWQKKy8vLyBzZXJ2aWNlLWNhbGwgbmFtZSBgYWN0dWFsYC4KKy8vLworLy8vIFJldHVybiBgKClgIGlmIGBhY3R1YWwgPT0gZXhwZWN0ZWRgLCBgRXJyYCBvdGhlcndpc2UuCitwdWIgZm4gdmVyaWZ5X2V4cGVjdGVkX3NlcnZpY2VfY2FsbChleHBlY3RlZDogJnN0ciwgYWN0dWFsOiAmc3RyKSAtPiA6OlJlc3VsdDwoKT4geworICAgIGlmIGV4cGVjdGVkID09IGFjdHVhbCB7CisgICAgICAgIE9rKCgpKQorICAgIH0gZWxzZSB7CisgICAgICAgIEVycig6OkVycm9yOjpBcHBsaWNhdGlvbig6OkFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDogOjpBcHBsaWNhdGlvbkVycm9yS2luZDo6V3JvbmdNZXRob2ROYW1lLAorICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiZXhwZWN0ZWQge30gZ290IHt9IiwgZXhwZWN0ZWQsIGFjdHVhbCksCisgICAgICAgIH0pKQorICAgIH0KK30KKworLy8vIENvbXBhcmUgdGhlIGV4cGVjdGVkIG1lc3NhZ2UgdHlwZSBgZXhwZWN0ZWRgIHdpdGggdGhlIHJlY2VpdmVkIG1lc3NhZ2UgdHlwZQorLy8vIGBhY3R1YWxgLgorLy8vCisvLy8gUmV0dXJuIGAoKWAgaWYgYGFjdHVhbCA9PSBleHBlY3RlZGAsIGBFcnJgIG90aGVyd2lzZS4KK3B1YiBmbiB2ZXJpZnlfZXhwZWN0ZWRfbWVzc2FnZV90eXBlKGV4cGVjdGVkOiBUTWVzc2FnZVR5cGUsIGFjdHVhbDogVE1lc3NhZ2VUeXBlKSAtPiA6OlJlc3VsdDwoKT4geworICAgIGlmIGV4cGVjdGVkID09IGFjdHVhbCB7CisgICAgICAgIE9rKCgpKQorICAgIH0gZWxzZSB7CisgICAgICAgIEVycig6OkVycm9yOjpBcHBsaWNhdGlvbig6OkFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDogOjpBcHBsaWNhdGlvbkVycm9yS2luZDo6SW52YWxpZE1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiZXhwZWN0ZWQge30gZ290IHt9IiwgZXhwZWN0ZWQsIGFjdHVhbCksCisgICAgICAgIH0pKQorICAgIH0KK30KKworLy8vIENoZWNrIGlmIGEgcmVxdWlyZWQgVGhyaWZ0IHN0cnVjdCBmaWVsZCBleGlzdHMuCisvLy8KKy8vLyBSZXR1cm4gYCgpYCBpZiBpdCBkb2VzLCBgRXJyYCBvdGhlcndpc2UuCitwdWIgZm4gdmVyaWZ5X3JlcXVpcmVkX2ZpZWxkX2V4aXN0czxUPihmaWVsZF9uYW1lOiAmc3RyLCBmaWVsZDogJk9wdGlvbjxUPikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICBtYXRjaCAqZmllbGQgeworICAgICAgICBTb21lKF8pID0+IE9rKCgpKSwKKyAgICAgICAgTm9uZSA9PiBFcnIoOjpFcnJvcjo6UHJvdG9jb2woOjpQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IDo6UHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJtaXNzaW5nIHJlcXVpcmVkIGZpZWxkIHt9IiwgZmllbGRfbmFtZSksCisgICAgICAgIH0pKSwKKyAgICB9Cit9CisKKy8vLyBFeHRyYWN0IHRoZSBmaWVsZCBpZCBmcm9tIGEgVGhyaWZ0IGZpZWxkIGlkZW50aWZpZXIuCisvLy8KKy8vLyBgZmllbGRfaWRlbnRgIG11c3QgKm5vdCogaGF2ZSBgVEZpZWxkSWRlbnRpZmllci5maWVsZF90eXBlYCBvZiB0eXBlIGBUVHlwZTo6U3RvcGAuCisvLy8KKy8vLyBSZXR1cm4gYFRGaWVsZElkZW50aWZpZXIuaWRgIGlmIGFuIGlkIGV4aXN0cywgYEVycmAgb3RoZXJ3aXNlLgorcHViIGZuIGZpZWxkX2lkKGZpZWxkX2lkZW50OiAmVEZpZWxkSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8aTE2PiB7CisgICAgZmllbGRfaWRlbnQuaWQub2tfb3JfZWxzZSh8fCB7CisgICAgICAgIDo6RXJyb3I6OlByb3RvY29sKDo6UHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICBraW5kOiA6OlByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgibWlzc2luZyBmaWVsZCBpbiBpbiB7Oj99IiwgZmllbGRfaWRlbnQpLAorICAgICAgICB9KQorICAgIH0pCit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKworICAgIHVzZSBzdGQ6OmlvOjpDdXJzb3I7CisKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIHRyYW5zcG9ydDo6e1RSZWFkVHJhbnNwb3J0LCBUV3JpdGVUcmFuc3BvcnR9OworCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV9pbnB1dF9wcm90b2NvbF9mcm9tX2NvbmNyZXRlX2lucHV0X3Byb3RvY29sKCkgeworICAgICAgICBsZXQgcjogQm94PFRSZWFkVHJhbnNwb3J0PiA9IEJveDo6bmV3KEN1cnNvcjo6bmV3KFswLCAxLCAyXSkpOworICAgICAgICBsZXQgbXV0IHQgPSBUQ29tcGFjdElucHV0UHJvdG9jb2w6Om5ldyhyKTsKKyAgICAgICAgdGFrZXNfaW5wdXRfcHJvdG9jb2woJm11dCB0KQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfaW5wdXRfcHJvdG9jb2xfZnJvbV9ib3hlZF9pbnB1dCgpIHsKKyAgICAgICAgbGV0IHI6IEJveDxUUmVhZFRyYW5zcG9ydD4gPSBCb3g6Om5ldyhDdXJzb3I6Om5ldyhbMCwgMSwgMl0pKTsKKyAgICAgICAgbGV0IG11dCB0OiBCb3g8VElucHV0UHJvdG9jb2w+ID0gQm94OjpuZXcoVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcocikpOworICAgICAgICB0YWtlc19pbnB1dF9wcm90b2NvbCgmbXV0IHQpCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV9vdXRwdXRfcHJvdG9jb2xfZnJvbV9jb25jcmV0ZV9vdXRwdXRfcHJvdG9jb2woKSB7CisgICAgICAgIGxldCB3OiBCb3g8VFdyaXRlVHJhbnNwb3J0PiA9IEJveDo6bmV3KHZlYyFbMHU4OyAxMF0pOworICAgICAgICBsZXQgbXV0IHQgPSBUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcodyk7CisgICAgICAgIHRha2VzX291dHB1dF9wcm90b2NvbCgmbXV0IHQpCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV9vdXRwdXRfcHJvdG9jb2xfZnJvbV9ib3hlZF9vdXRwdXQoKSB7CisgICAgICAgIGxldCB3OiBCb3g8VFdyaXRlVHJhbnNwb3J0PiA9IEJveDo6bmV3KHZlYyFbMHU4OyAxMF0pOworICAgICAgICBsZXQgbXV0IHQ6IEJveDxUT3V0cHV0UHJvdG9jb2w+ID0gQm94OjpuZXcoVENvbXBhY3RPdXRwdXRQcm90b2NvbDo6bmV3KHcpKTsKKyAgICAgICAgdGFrZXNfb3V0cHV0X3Byb3RvY29sKCZtdXQgdCkKKyAgICB9CisKKyAgICBmbiB0YWtlc19pbnB1dF9wcm90b2NvbDxSPih0OiAmbXV0IFIpCisgICAgd2hlcmUKKyAgICAgICAgUjogVElucHV0UHJvdG9jb2wsCisgICAgeworICAgICAgICB0LnJlYWRfYnl0ZSgpLnVud3JhcCgpOworICAgIH0KKworICAgIGZuIHRha2VzX291dHB1dF9wcm90b2NvbDxXPih0OiAmbXV0IFcpCisgICAgd2hlcmUKKyAgICAgICAgVzogVE91dHB1dFByb3RvY29sLAorICAgIHsKKyAgICAgICAgdC5mbHVzaCgpLnVud3JhcCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvcHJvdG9jb2wvbXVsdGlwbGV4ZWQucnMgYi9saWIvcnMvc3JjL3Byb3RvY29sL211bHRpcGxleGVkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZWU0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3Byb3RvY29sL211bHRpcGxleGVkLnJzCkBAIC0wLDAgKzEsMjM5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBzdXBlcjo6eworICAgIFRGaWVsZElkZW50aWZpZXIsIFRMaXN0SWRlbnRpZmllciwgVE1hcElkZW50aWZpZXIsIFRNZXNzYWdlSWRlbnRpZmllciwgVE1lc3NhZ2VUeXBlLAorICAgIFRPdXRwdXRQcm90b2NvbCwgVFNldElkZW50aWZpZXIsIFRTdHJ1Y3RJZGVudGlmaWVyLAorfTsKKworLy8vIGBUT3V0cHV0UHJvdG9jb2xgIHRoYXQgcHJlZml4ZXMgdGhlIHNlcnZpY2UgbmFtZSB0byBhbGwgb3V0Z29pbmcgVGhyaWZ0CisvLy8gbWVzc2FnZXMuCisvLy8KKy8vLyBBIGBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbGAgc2hvdWxkIGJlIHVzZWQgd2hlbiBtdWx0aXBsZSBUaHJpZnQgc2VydmljZXMKKy8vLyBzZW5kIG1lc3NhZ2VzIG92ZXIgYSBzaW5nbGUgSS9PIGNoYW5uZWwuIEJ5IHByZWZpeGluZyBzZXJ2aWNlIGlkZW50aWZpZXJzCisvLy8gdG8gb3V0Z29pbmcgbWVzc2FnZXMgcmVjZWl2ZXJzIGFyZSBhYmxlIHRvIGRlbXV4IHRoZW0gYW5kIHJvdXRlIHRoZW0gdG8gdGhlCisvLy8gYXBwcm9wcmlhdGUgc2VydmljZSBwcm9jZXNzb3IuIFJ1c3QgcmVjZWl2ZXJzIG11c3QgdXNlIGEgYFRNdWx0aXBsZXhlZFByb2Nlc3NvcmAKKy8vLyB0byBwcm9jZXNzIGluY29taW5nIG1lc3NhZ2VzLCB3aGlsZSBvdGhlciBsYW5ndWFnZXMgbXVzdCB1c2UgdGhlaXIKKy8vLyBjb3JyZXNwb25kaW5nIG11bHRpcGxleGVkIHByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbnMuCisvLy8KKy8vLyBGb3IgZXhhbXBsZSwgZ2l2ZW4gYSBzZXJ2aWNlIGBUZXN0U2VydmljZWAgYW5kIGEgc2VydmljZSBjYWxsIGB0ZXN0X2NhbGxgLAorLy8vIHRoaXMgaW1wbGVtZW50YXRpb24gd291bGQgaWRlbnRpZnkgbWVzc2FnZXMgYXMgb3JpZ2luYXRpbmcgZnJvbQorLy8vIGBUZXN0U2VydmljZTp0ZXN0X2NhbGxgLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2xgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZSwgVE91dHB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlPdXRwdXRQcm90b2NvbCwgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IHByb3RvY29sID0gVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCwgdHJ1ZSk7CisvLy8gbGV0IG11dCBwcm90b2NvbCA9IFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sOjpuZXcoInNlcnZpY2VfbmFtZSIsIHByb3RvY29sKTsKKy8vLworLy8vIGxldCBpZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJzdmNfY2FsbCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMSk7CisvLy8gcHJvdG9jb2wud3JpdGVfbWVzc2FnZV9iZWdpbigmaWRlbnQpLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDxQPgord2hlcmUKKyAgICBQOiBUT3V0cHV0UHJvdG9jb2wsCit7CisgICAgc2VydmljZV9uYW1lOiBTdHJpbmcsCisgICAgaW5uZXI6IFAsCit9CisKK2ltcGw8UD4gVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w8UD4KK3doZXJlCisgICAgUDogVE91dHB1dFByb3RvY29sLAoreworICAgIC8vLyBDcmVhdGUgYSBgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2xgIHRoYXQgaWRlbnRpZmllcyBvdXRnb2luZyBtZXNzYWdlcworICAgIC8vLyBhcyBvcmlnaW5hdGluZyBmcm9tIGEgc2VydmljZSBuYW1lZCBgc2VydmljZV9uYW1lYCBhbmQgc2VuZHMgdGhlbSBvdmVyCisgICAgLy8vIHRoZSBgd3JhcHBlZGAgYFRPdXRwdXRQcm90b2NvbGAuIE91dGdvaW5nIG1lc3NhZ2VzIGFyZSBlbmNvZGVkIGFuZCBzZW50CisgICAgLy8vIGJ5IGB3cmFwcGVkYCwgbm90IGJ5IHRoaXMgaW5zdGFuY2UuCisgICAgcHViIGZuIG5ldyhzZXJ2aWNlX25hbWU6ICZzdHIsIHdyYXBwZWQ6IFApIC0+IFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sPFA+IHsKKyAgICAgICAgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2wgeworICAgICAgICAgICAgc2VydmljZV9uYW1lOiBzZXJ2aWNlX25hbWUudG9fb3duZWQoKSwKKyAgICAgICAgICAgIGlubmVyOiB3cmFwcGVkLAorICAgICAgICB9CisgICAgfQorfQorCisvLyBGSVhNRTogYXZvaWQgcGFzc3Rocm91Z2ggbWV0aG9kcworaW1wbDxQPiBUT3V0cHV0UHJvdG9jb2wgZm9yIFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sPFA+Cit3aGVyZQorICAgIFA6IFRPdXRwdXRQcm90b2NvbCwKK3sKKyAgICBmbiB3cml0ZV9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNZXNzYWdlSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbWF0Y2ggaWRlbnRpZmllci5tZXNzYWdlX3R5cGUgeworICAgICAgICAgICAgLy8gRklYTUU6IGlzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBvdmVycmlkZSBpZGVudGlmaWVyIGhlcmU/CisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OkNhbGwgfCBUTWVzc2FnZVR5cGU6Ok9uZVdheSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGlkZW50aWZpZXIgPSBUTWVzc2FnZUlkZW50aWZpZXIgeworICAgICAgICAgICAgICAgICAgICBuYW1lOiBmb3JtYXQhKCJ7fTp7fSIsIHNlbGYuc2VydmljZV9uYW1lLCBpZGVudGlmaWVyLm5hbWUpLAorICAgICAgICAgICAgICAgICAgICAuLippZGVudGlmaWVyCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBzZWxmLmlubmVyLndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50aWZpZXIpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBfID0+IHNlbGYuaW5uZXIud3JpdGVfbWVzc2FnZV9iZWdpbihpZGVudGlmaWVyKSwKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHdyaXRlX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9tZXNzYWdlX2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RydWN0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRTdHJ1Y3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX3N0cnVjdF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX3N0cnVjdF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRGaWVsZElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfZmllbGRfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2ZpZWxkX2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfc3RvcCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfZmllbGRfc3RvcCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfYnl0ZXMoJm11dCBzZWxmLCBiOiAmW3U4XSkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9ieXRlcyhiKQorICAgIH0KKworICAgIGZuIHdyaXRlX2Jvb2woJm11dCBzZWxmLCBiOiBib29sKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2Jvb2woYikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pOCgmbXV0IHNlbGYsIGk6IGk4KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2k4KGkpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTE2KCZtdXQgc2VsZiwgaTogaTE2KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2kxNihpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2kzMigmbXV0IHNlbGYsIGk6IGkzMikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9pMzIoaSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pNjQoJm11dCBzZWxmLCBpOiBpNjQpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfaTY0KGkpCisgICAgfQorCisgICAgZm4gd3JpdGVfZG91YmxlKCZtdXQgc2VsZiwgZDogZjY0KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2RvdWJsZShkKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cmluZygmbXV0IHNlbGYsIHM6ICZzdHIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfc3RyaW5nKHMpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTGlzdElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfbGlzdF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9saXN0X2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfc2V0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRTZXRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX3NldF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX3NldF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX21hcF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWFwSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9tYXBfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9tYXBfZW5kKCkKKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIuZmx1c2goKQorICAgIH0KKworICAgIC8vIHV0aWxpdHkKKyAgICAvLworCisgICAgZm4gd3JpdGVfYnl0ZSgmbXV0IHNlbGYsIGI6IHU4KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2J5dGUoYikKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKworICAgIHVzZSBwcm90b2NvbDo6e1RCaW5hcnlPdXRwdXRQcm90b2NvbCwgVE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGUsIFRPdXRwdXRQcm90b2NvbH07CisgICAgdXNlIHRyYW5zcG9ydDo6e1RCdWZmZXJDaGFubmVsLCBUSW9DaGFubmVsLCBXcml0ZUhhbGZ9OworCisgICAgdXNlIHN1cGVyOjoqOworCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWVzc2FnZV9iZWdpbl93aXRoX3ByZWZpeGVkX3NlcnZpY2VfbmFtZSgpIHsKKyAgICAgICAgbGV0IG11dCBvX3Byb3QgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygiYmFyIiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAyKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxOV0gPSBbCisgICAgICAgICAgICAweDgwLAorICAgICAgICAgICAgMHgwMSwgLyogcHJvdG9jb2wgaWRlbnRpZmllciAqLworICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDEsIC8qIG1lc3NhZ2UgdHlwZSAqLworICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwNywKKyAgICAgICAgICAgIDB4NjYsCisgICAgICAgICAgICAweDZGLAorICAgICAgICAgICAgMHg2RiwgLyogImZvbyIgKi8KKyAgICAgICAgICAgIDB4M0EsIC8qICI6IiAqLworICAgICAgICAgICAgMHg2MiwKKyAgICAgICAgICAgIDB4NjEsCisgICAgICAgICAgICAweDcyLCAvKiAiYmFyIiAqLworICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMiAvKiBzZXF1ZW5jZSBudW1iZXIgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxIShvX3Byb3QuaW5uZXIudHJhbnNwb3J0LndyaXRlX2J5dGVzKCksIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICBmbiB0ZXN0X29iamVjdHMoKSAtPiBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDxUQmluYXJ5T3V0cHV0UHJvdG9jb2w8V3JpdGVIYWxmPFRCdWZmZXJDaGFubmVsPj4+CisgICAgeworICAgICAgICBsZXQgYyA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDQwLCA0MCk7CisgICAgICAgIGxldCAoXywgd19jaGFuKSA9IGMuc3BsaXQoKS51bndyYXAoKTsKKyAgICAgICAgbGV0IHByb3QgPSBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyh3X2NoYW4sIHRydWUpOworICAgICAgICBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDo6bmV3KCJmb28iLCBwcm90KQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvcHJvdG9jb2wvc3RvcmVkLnJzIGIvbGliL3JzL3NyYy9wcm90b2NvbC9zdG9yZWQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM1NTk3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvc3RvcmVkLnJzCkBAIC0wLDAgKzEsMTk2IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBzdGQ6OmNvbnZlcnQ6OkludG87CisKK3VzZSBzdXBlcjo6eworICAgIFRGaWVsZElkZW50aWZpZXIsIFRJbnB1dFByb3RvY29sLCBUTGlzdElkZW50aWZpZXIsIFRNYXBJZGVudGlmaWVyLCBUTWVzc2FnZUlkZW50aWZpZXIsCisgICAgVFNldElkZW50aWZpZXIsIFRTdHJ1Y3RJZGVudGlmaWVyLAorfTsKK3VzZSBQcm90b2NvbEVycm9yS2luZDsKKworLy8vIGBUSW5wdXRQcm90b2NvbGAgcmVxdWlyZWQgdG8gdXNlIGEgYFRNdWx0aXBsZXhlZFByb2Nlc3NvcmAuCisvLy8KKy8vLyBBIGBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JgIHJlYWRzIGluY29taW5nIG1lc3NhZ2UgaWRlbnRpZmllcnMgdG8gZGV0ZXJtaW5lIHRvCisvLy8gd2hpY2ggYFRQcm9jZXNzb3JgIHJlcXVlc3RzIHNob3VsZCBiZSBmb3J3YXJkZWQuIEhvd2V2ZXIsIG9uY2UgcmVhZCwgdGhvc2UKKy8vLyBtZXNzYWdlIGlkZW50aWZpZXIgYnl0ZXMgYXJlIG5vIGxvbmdlciBvbiB0aGUgd2lyZS4gU2luY2UgZG93bnN0cmVhbQorLy8vIHByb2Nlc3NvcnMgZXhwZWN0IHRvIHJlYWQgbWVzc2FnZSBpZGVudGlmaWVycyBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbAorLy8vIHdlIG5lZWQgc29tZSB3YXkgb2Ygc3VwcGx5aW5nIGEgYFRNZXNzYWdlSWRlbnRpZmllcmAgd2l0aCB0aGUgc2VydmljZS1uYW1lCisvLy8gc3RyaXBwZWQuIFRoaXMgaW1wbGVtZW50YXRpb24gc3RvcmVzIHRoZSByZWNlaXZlZCBgVE1lc3NhZ2VJZGVudGlmaWVyYAorLy8vICh3aXRob3V0IHRoZSBzZXJ2aWNlIG5hbWUpIGFuZCBwYXNzZXMgaXQgdG8gdGhlIHdyYXBwZWQgYFRJbnB1dFByb3RvY29sYAorLy8vIHdoZW4gYFRJbnB1dFByb3RvY29sOjpyZWFkX21lc3NhZ2VfYmVnaW4oLi4uKWAgaXMgY2FsbGVkLiBJdCBkZWxlZ2F0ZXMgYWxsCisvLy8gb3RoZXIgY2FsbHMgZGlyZWN0bHkgdG8gdGhlIHdyYXBwZWQgYFRJbnB1dFByb3RvY29sYC4KKy8vLworLy8vIFRoaXMgdHlwZSAqKnNob3VsZCBub3QqKiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9uIGNvZGUuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUU3RvcmVkSW5wdXRQcm90b2NvbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0OworLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRNZXNzYWdlSWRlbnRpZmllciwgVE1lc3NhZ2VUeXBlLCBUT3V0cHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeUlucHV0UHJvdG9jb2wsIFRCaW5hcnlPdXRwdXRQcm90b2NvbCwgVFN0b3JlZElucHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnNlcnZlcjo6VFByb2Nlc3NvcjsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntUSW9DaGFubmVsLCBUVGNwQ2hhbm5lbH07CisvLy8KKy8vLyAvLyBzYW1wbGUgcHJvY2Vzc29yCisvLy8gc3RydWN0IEFjdHVhbFByb2Nlc3NvcjsKKy8vLyBpbXBsIFRQcm9jZXNzb3IgZm9yIEFjdHVhbFByb2Nlc3NvciB7CisvLy8gICAgIGZuIHByb2Nlc3MoCisvLy8gICAgICAgICAmc2VsZiwKKy8vLyAgICAgICAgIF86ICZtdXQgVElucHV0UHJvdG9jb2wsCisvLy8gICAgICAgICBfOiAmbXV0IFRPdXRwdXRQcm90b2NvbAorLy8vICAgICApIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisvLy8gICAgICAgICB1bmltcGxlbWVudGVkISgpCisvLy8gICAgIH0KKy8vLyB9CisvLy8gbGV0IHByb2Nlc3NvciA9IEFjdHVhbFByb2Nlc3NvciB7fTsKKy8vLworLy8vIC8vIGNvbnN0cnVjdCB0aGUgc2hhcmVkIHRyYW5zcG9ydAorLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgKGlfY2hhbiwgb19jaGFuKSA9IGNoYW5uZWwuc3BsaXQoKS51bndyYXAoKTsKKy8vLworLy8vIC8vIGNvbnN0cnVjdCB0aGUgYWN0dWFsIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2xzCisvLy8gbGV0IG11dCBpX3Byb3QgPSBUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KGlfY2hhbiwgdHJ1ZSk7CisvLy8gbGV0IG11dCBvX3Byb3QgPSBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyhvX2NoYW4sIHRydWUpOworLy8vCisvLy8gLy8gbWVzc2FnZSBpZGVudGlmaWVyIHJlY2VpdmVkIGZyb20gcmVtb3RlIGFuZCBtb2RpZmllZCB0byByZW1vdmUgdGhlIHNlcnZpY2UgbmFtZQorLy8vIGxldCBuZXdfbXNnX2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInNlcnZpY2VfY2FsbCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMSk7CisvLy8KKy8vLyAvLyBjb25zdHJ1Y3QgdGhlIHByb3h5IGlucHV0IHByb3RvY29sCisvLy8gbGV0IG11dCBwcm94eV9pX3Byb3QgPSBUU3RvcmVkSW5wdXRQcm90b2NvbDo6bmV3KCZtdXQgaV9wcm90LCBuZXdfbXNnX2lkZW50KTsKKy8vLyBsZXQgcmVzID0gcHJvY2Vzc29yLnByb2Nlc3MoJm11dCBwcm94eV9pX3Byb3QsICZtdXQgb19wcm90KTsKKy8vLyBgYGAKKy8vIEZJWE1FOiBpbXBsZW1lbnQgRGVidWcKK3B1YiBzdHJ1Y3QgVFN0b3JlZElucHV0UHJvdG9jb2w8J2E+IHsKKyAgICBpbm5lcjogJidhIG11dCBUSW5wdXRQcm90b2NvbCwKKyAgICBtZXNzYWdlX2lkZW50OiBPcHRpb248VE1lc3NhZ2VJZGVudGlmaWVyPiwKK30KKworaW1wbDwnYT4gVFN0b3JlZElucHV0UHJvdG9jb2w8J2E+IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRTdG9yZWRJbnB1dFByb3RvY29sYCB0aGF0IGRlbGVnYXRlcyBhbGwgY2FsbHMgb3RoZXIgdGhhbgorICAgIC8vLyBgVElucHV0UHJvdG9jb2w6OnJlYWRfbWVzc2FnZV9iZWdpbiguLi4pYCB0byBhIGB3cmFwcGVkYAorICAgIC8vLyBgVElucHV0UHJvdG9jb2xgLiBgbWVzc2FnZV9pZGVudGAgaXMgdGhlIG1vZGlmaWVkIG1lc3NhZ2UgaWRlbnRpZmllciAtCisgICAgLy8vIHdpdGggc2VydmljZSBuYW1lIHN0cmlwcGVkIC0gdGhhdCB3aWxsIGJlIHBhc3NlZCB0bworICAgIC8vLyBgd3JhcHBlZC5yZWFkX21lc3NhZ2VfYmVnaW4oLi4uKWAuCisgICAgcHViIGZuIG5ldygKKyAgICAgICAgd3JhcHBlZDogJm11dCBUSW5wdXRQcm90b2NvbCwKKyAgICAgICAgbWVzc2FnZV9pZGVudDogVE1lc3NhZ2VJZGVudGlmaWVyLAorICAgICkgLT4gVFN0b3JlZElucHV0UHJvdG9jb2wgeworICAgICAgICBUU3RvcmVkSW5wdXRQcm90b2NvbCB7CisgICAgICAgICAgICBpbm5lcjogd3JhcHBlZCwKKyAgICAgICAgICAgIG1lc3NhZ2VfaWRlbnQ6IG1lc3NhZ2VfaWRlbnQuaW50bygpLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsPCdhPiBUSW5wdXRQcm90b2NvbCBmb3IgVFN0b3JlZElucHV0UHJvdG9jb2w8J2E+IHsKKyAgICBmbiByZWFkX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWVzc2FnZUlkZW50aWZpZXI+IHsKKyAgICAgICAgc2VsZi5tZXNzYWdlX2lkZW50LnRha2UoKS5va19vcl9lbHNlKHx8IHsKKyAgICAgICAgICAgIDo6ZXJyb3JzOjpuZXdfcHJvdG9jb2xfZXJyb3IoCisgICAgICAgICAgICAgICAgUHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICAgICAgIm1lc3NhZ2UgaWRlbnRpZmllciBhbHJlYWR5IHJlYWQiLAorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIH0KKworICAgIGZuIHJlYWRfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfbWVzc2FnZV9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RydWN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8T3B0aW9uPFRTdHJ1Y3RJZGVudGlmaWVyPj4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfc3RydWN0X2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfc3RydWN0X2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9maWVsZF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRGaWVsZElkZW50aWZpZXI+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2ZpZWxkX2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9maWVsZF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfYnl0ZXMoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxWZWM8dTg+PiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9ieXRlcygpCisgICAgfQorCisgICAgZm4gcmVhZF9ib29sKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8Ym9vbD4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfYm9vbCgpCisgICAgfQorCisgICAgZm4gcmVhZF9pOCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk4PiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9pOCgpCisgICAgfQorCisgICAgZm4gcmVhZF9pMTYoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMTY+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2kxNigpCisgICAgfQorCisgICAgZm4gcmVhZF9pMzIoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMzI+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2kzMigpCisgICAgfQorCisgICAgZm4gcmVhZF9pNjQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpNjQ+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2k2NCgpCisgICAgfQorCisgICAgZm4gcmVhZF9kb3VibGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxmNjQ+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2RvdWJsZSgpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJpbmcoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX3N0cmluZygpCisgICAgfQorCisgICAgZm4gcmVhZF9saXN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VExpc3RJZGVudGlmaWVyPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9saXN0X2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2xpc3RfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3NldF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRTZXRJZGVudGlmaWVyPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9zZXRfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9zZXRfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX21hcF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNYXBJZGVudGlmaWVyPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9tYXBfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9tYXBfZW5kKCkKKyAgICB9CisKKyAgICAvLyB1dGlsaXR5CisgICAgLy8KKworICAgIGZuIHJlYWRfYnl0ZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PHU4PiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9ieXRlKCkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3NlcnZlci9tb2QucnMgYi9saWIvcnMvc3JjL3NlcnZlci9tb2QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiMzgxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvc2VydmVyL21vZC5ycwpAQCAtMCwwICsxLDEyNCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyEgVHlwZXMgdXNlZCB0byBpbXBsZW1lbnQgYSBUaHJpZnQgc2VydmVyLgorCit1c2UgcHJvdG9jb2w6OntUSW5wdXRQcm90b2NvbCwgVE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGUsIFRPdXRwdXRQcm90b2NvbH07Cit1c2Uge0FwcGxpY2F0aW9uRXJyb3IsIEFwcGxpY2F0aW9uRXJyb3JLaW5kfTsKKworbW9kIG11bHRpcGxleGVkOworbW9kIHRocmVhZGVkOworCitwdWIgdXNlIHNlbGY6Om11bHRpcGxleGVkOjpUTXVsdGlwbGV4ZWRQcm9jZXNzb3I7CitwdWIgdXNlIHNlbGY6OnRocmVhZGVkOjpUU2VydmVyOworCisvLy8gSGFuZGxlcyBpbmNvbWluZyBUaHJpZnQgbWVzc2FnZXMgYW5kIGRpc3BhdGNoZXMgdGhlbSB0byB0aGUgdXNlci1kZWZpbmVkCisvLy8gaGFuZGxlciBmdW5jdGlvbnMuCisvLy8KKy8vLyBBbiBpbXBsZW1lbnRhdGlvbiBpcyBhdXRvLWdlbmVyYXRlZCBmb3IgZWFjaCBUaHJpZnQgc2VydmljZS4gV2hlbiB1c2VkIGJ5IGEKKy8vLyBzZXJ2ZXIgKGZvciBleGFtcGxlLCBhIGBUU2ltcGxlU2VydmVyYCksIGl0IHdpbGwgZGVtdXggaW5jb21pbmcgc2VydmljZQorLy8vIGNhbGxzIGFuZCBpbnZva2UgdGhlIGNvcnJlc3BvbmRpbmcgdXNlci1kZWZpbmVkIGhhbmRsZXIgZnVuY3Rpb24uCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHN0YXJ0IGEgc2VydmVyIHVzaW5nIHRoZSBhdXRvLWdlbmVyYXRlZCBgVFByb2Nlc3NvcmAgZm9yCisvLy8gYSBUaHJpZnQgc2VydmljZSBgU2ltcGxlU2VydmljZWAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0OworLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6c2VydmVyOjpUUHJvY2Vzc29yOworLy8vCisvLy8gLy8KKy8vLyAvLyBhdXRvLWdlbmVyYXRlZAorLy8vIC8vCisvLy8KKy8vLyAvLyBwcm9jZXNzb3IgZm9yIGBTaW1wbGVTZXJ2aWNlYAorLy8vIHN0cnVjdCBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3NvcjsKKy8vLyBpbXBsIFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yIHsKKy8vLyAgICAgZm4gbmV3PEg6IFNpbXBsZVNlcnZpY2VTeW5jSGFuZGxlcj4ocHJvY2Vzc29yOiBIKSAtPiBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3NvciB7CisvLy8gICAgICAgICB1bmltcGxlbWVudGVkISgpOworLy8vICAgICB9CisvLy8gfQorLy8vCisvLy8gLy8gYFRQcm9jZXNzb3JgIGltcGxlbWVudGF0aW9uIGZvciBgU2ltcGxlU2VydmljZWAKKy8vLyBpbXBsIFRQcm9jZXNzb3IgZm9yIFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yIHsKKy8vLyAgICAgZm4gcHJvY2Vzcygmc2VsZiwgaTogJm11dCBUSW5wdXRQcm90b2NvbCwgbzogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisvLy8gICAgICAgICB1bmltcGxlbWVudGVkISgpOworLy8vICAgICB9CisvLy8gfQorLy8vCisvLy8gLy8gc2VydmljZSBmdW5jdGlvbnMgZm9yIFNpbXBsZVNlcnZpY2UKKy8vLyB0cmFpdCBTaW1wbGVTZXJ2aWNlU3luY0hhbmRsZXIgeworLy8vICAgICBmbiBzZXJ2aWNlX2NhbGwoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PCgpPjsKKy8vLyB9CisvLy8KKy8vLyAvLworLy8vIC8vIHVzZXItY29kZSBmb2xsb3dzCisvLy8gLy8KKy8vLworLy8vIC8vIGRlZmluZSBhIGhhbmRsZXIgdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbiBgc2VydmljZV9jYWxsYCBpcyByZWNlaXZlZAorLy8vIHN0cnVjdCBTaW1wbGVTZXJ2aWNlSGFuZGxlckltcGw7CisvLy8gaW1wbCBTaW1wbGVTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIFNpbXBsZVNlcnZpY2VIYW5kbGVySW1wbCB7CisvLy8gICAgIGZuIHNlcnZpY2VfY2FsbCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKy8vLyAgICAgICAgIHVuaW1wbGVtZW50ZWQhKCk7CisvLy8gICAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBpbnN0YW50aWF0ZSB0aGUgcHJvY2Vzc29yCisvLy8gbGV0IHByb2Nlc3NvciA9IFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yOjpuZXcoU2ltcGxlU2VydmljZUhhbmRsZXJJbXBsIHt9KTsKKy8vLworLy8vIC8vIGF0IHRoaXMgcG9pbnQgeW91IGNhbiBwYXNzIHRoZSBwcm9jZXNzb3IgdG8gdGhlIHNlcnZlcgorLy8vIC8vIGxldCBzZXJ2ZXIgPSBUU2VydmVyOjpuZXcoLi4uLCBwcm9jZXNzb3IpOworLy8vIGBgYAorcHViIHRyYWl0IFRQcm9jZXNzb3IgeworICAgIC8vLyBQcm9jZXNzIGEgVGhyaWZ0IHNlcnZpY2UgY2FsbC4KKyAgICAvLy8KKyAgICAvLy8gUmVhZHMgYXJndW1lbnRzIGZyb20gYGlgLCBleGVjdXRlcyB0aGUgdXNlcidzIGhhbmRsZXIgY29kZSwgYW5kIHdyaXRlcworICAgIC8vLyB0aGUgcmVzcG9uc2UgdG8gYG9gLgorICAgIC8vLworICAgIC8vLyBSZXR1cm5zIGAoKWAgaWYgdGhlIGhhbmRsZXIgd2FzIGV4ZWN1dGVkOyBgRXJyYCBvdGhlcndpc2UuCisgICAgZm4gcHJvY2Vzcygmc2VsZiwgaTogJm11dCBUSW5wdXRQcm90b2NvbCwgbzogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IDo6UmVzdWx0PCgpPjsKK30KKworLy8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIHVzZWQgaW4gZ2VuZXJhdGVkIGBUUHJvY2Vzc29yYCBpbXBsZW1lbnRhdGlvbnMgdG8KKy8vLyByZXR1cm4gYW4gYEFwcGxpY2F0aW9uRXJyb3JgIGlmIHRocmlmdCBtZXNzYWdlIHByb2Nlc3NpbmcgZmFpbGVkLgorcHViIGZuIGhhbmRsZV9wcm9jZXNzX3Jlc3VsdCgKKyAgICBtc2dfaWRlbnQ6ICZUTWVzc2FnZUlkZW50aWZpZXIsCisgICAgcmVzOiA6OlJlc3VsdDwoKT4sCisgICAgb19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCwKKykgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICBpZiBsZXQgRXJyKGUpID0gcmVzIHsKKyAgICAgICAgbGV0IGUgPSBtYXRjaCBlIHsKKyAgICAgICAgICAgIDo6RXJyb3I6OkFwcGxpY2F0aW9uKGEpID0+IGEsCisgICAgICAgICAgICBfID0+IEFwcGxpY2F0aW9uRXJyb3I6Om5ldyhBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwgZm9ybWF0ISgiezo/fSIsIGUpKSwKKyAgICAgICAgfTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygKKyAgICAgICAgICAgIG1zZ19pZGVudC5uYW1lLmNsb25lKCksCisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OkV4Y2VwdGlvbiwKKyAgICAgICAgICAgIG1zZ19pZGVudC5zZXF1ZW5jZV9udW1iZXIsCisgICAgICAgICk7CisKKyAgICAgICAgb19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50KT87CisgICAgICAgIDo6RXJyb3I6OndyaXRlX2FwcGxpY2F0aW9uX2Vycm9yX3RvX291dF9wcm90b2NvbCgmZSwgb19wcm90KT87CisgICAgICAgIG9fcHJvdC53cml0ZV9tZXNzYWdlX2VuZCgpPzsKKyAgICAgICAgb19wcm90LmZsdXNoKCkKKyAgICB9IGVsc2UgeworICAgICAgICBPaygoKSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3NlcnZlci9tdWx0aXBsZXhlZC5ycyBiL2xpYi9ycy9zcmMvc2VydmVyL211bHRpcGxleGVkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MzM3OTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3NlcnZlci9tdWx0aXBsZXhlZC5ycwpAQCAtMCwwICsxLDM1MSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2Ugc3RkOjpjb2xsZWN0aW9uczo6SGFzaE1hcDsKK3VzZSBzdGQ6OmNvbnZlcnQ6OkludG87Cit1c2Ugc3RkOjpmbXQ7Cit1c2Ugc3RkOjpmbXQ6OntEZWJ1ZywgRm9ybWF0dGVyfTsKK3VzZSBzdGQ6OnN5bmM6OntBcmMsIE11dGV4fTsKKwordXNlIHByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRNZXNzYWdlSWRlbnRpZmllciwgVE91dHB1dFByb3RvY29sLCBUU3RvcmVkSW5wdXRQcm90b2NvbH07CisKK3VzZSBzdXBlcjo6e2hhbmRsZV9wcm9jZXNzX3Jlc3VsdCwgVFByb2Nlc3Nvcn07CisKK2NvbnN0IE1JU1NJTkdfU0VQQVJBVE9SX0FORF9OT19ERUZBVUxUOiAmJ3N0YXRpYyBzdHIgPQorICAgICJtaXNzaW5nIHNlcnZpY2Ugc2VwYXJhdG9yIGFuZCBubyBkZWZhdWx0IHByb2Nlc3NvciBzZXQiOwordHlwZSBUaHJlYWRTYWZlUHJvY2Vzc29yID0gQm94PFRQcm9jZXNzb3IgKyBTZW5kICsgU3luYz47CisKKy8vLyBBIGBUUHJvY2Vzc29yYCB0aGF0IGNhbiBkZW11eCBzZXJ2aWNlIGNhbGxzIHRvIG11bHRpcGxlIHVuZGVybHlpbmcKKy8vLyBUaHJpZnQgc2VydmljZXMuCisvLy8KKy8vLyBVc2VycyByZWdpc3RlciBzZXJ2aWNlLXNwZWNpZmljIGBUUHJvY2Vzc29yYCBpbnN0YW5jZXMgd2l0aCBhCisvLy8gYFRNdWx0aXBsZXhlZFByb2Nlc3NvcmAsIGFuZCB0aGVuIHJlZ2lzdGVyIHRoYXQgcHJvY2Vzc29yIHdpdGggYSBzZXJ2ZXIKKy8vLyBpbXBsZW1lbnRhdGlvbi4gRm9sbG93aW5nIHRoYXQsIGFsbCBpbmNvbWluZyBzZXJ2aWNlIGNhbGxzIGFyZSBhdXRvbWF0aWNhbGx5CisvLy8gcm91dGVkIHRvIHRoZSBzZXJ2aWNlLXNwZWNpZmljIGBUUHJvY2Vzc29yYC4KKy8vLworLy8vIEEgYFRNdWx0aXBsZXhlZFByb2Nlc3NvcmAgY2FuIG9ubHkgaGFuZGxlIG1lc3NhZ2VzIHNlbnQgYnkgYQorLy8vIGBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVE11bHRpcGxleGVkUHJvY2Vzc29yIHsKKyAgICBzdG9yZWQ6IE11dGV4PFN0b3JlZFByb2Nlc3NvcnM+LAorfQorCisjW2Rlcml2ZShEZWZhdWx0KV0KK3N0cnVjdCBTdG9yZWRQcm9jZXNzb3JzIHsKKyAgICBwcm9jZXNzb3JzOiBIYXNoTWFwPFN0cmluZywgQXJjPFRocmVhZFNhZmVQcm9jZXNzb3I+PiwKKyAgICBkZWZhdWx0X3Byb2Nlc3NvcjogT3B0aW9uPEFyYzxUaHJlYWRTYWZlUHJvY2Vzc29yPj4sCit9CisKK2ltcGwgVE11bHRpcGxleGVkUHJvY2Vzc29yIHsKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IGBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JgIHdpdGggbm8gcmVnaXN0ZXJlZCBzZXJ2aWNlLXNwZWNpZmljCisgICAgLy8vIHByb2Nlc3NvcnMuCisgICAgcHViIGZuIG5ldygpIC0+IFRNdWx0aXBsZXhlZFByb2Nlc3NvciB7CisgICAgICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB7CisgICAgICAgICAgICBzdG9yZWQ6IE11dGV4OjpuZXcoU3RvcmVkUHJvY2Vzc29ycyB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc29yczogSGFzaE1hcDo6bmV3KCksCisgICAgICAgICAgICAgICAgZGVmYXVsdF9wcm9jZXNzb3I6IE5vbmUsCisgICAgICAgICAgICB9KSwKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBSZWdpc3RlciBhIHNlcnZpY2Utc3BlY2lmaWMgYHByb2Nlc3NvcmAgZm9yIHRoZSBzZXJ2aWNlIG5hbWVkCisgICAgLy8vIGBzZXJ2aWNlX25hbWVgLiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGFsc28gYmFja3dhcmRzLWNvbXBhdGlibGUgd2l0aAorICAgIC8vLyBub24tbXVsdGlwbGV4ZWQgY2xpZW50cy4gU2V0IGBhc19kZWZhdWx0YCB0byBgdHJ1ZWAgdG8gYWxsb3cKKyAgICAvLy8gbm9uLW5hbWVzcGFjZWQgcmVxdWVzdHMgdG8gYmUgZGlzcGF0Y2hlZCB0byBhIGRlZmF1bHQgcHJvY2Vzc29yLgorICAgIC8vLworICAgIC8vLyBSZXR1cm5zIHN1Y2Nlc3MgaWYgYSBuZXcgZW50cnkgd2FzIGluc2VydGVkLiBSZXR1cm5zIGFuIGVycm9yIGlmOgorICAgIC8vLyAqIEEgcHJvY2Vzc29yIGV4aXN0cyBmb3IgYHNlcnZpY2VfbmFtZWAKKyAgICAvLy8gKiBZb3UgYXR0ZW1wdCB0byByZWdpc3RlciBhIHByb2Nlc3NvciBhcyBkZWZhdWx0LCBhbmQgYW4gZXhpc3RpbmcgZGVmYXVsdCBleGlzdHMKKyAgICAjW2NmZ19hdHRyKGZlYXR1cmUgPSAiY2FyZ28tY2xpcHB5IiwgYWxsb3cobWFwX2VudHJ5KSldCisgICAgcHViIGZuIHJlZ2lzdGVyPFM6IEludG88U3RyaW5nPj4oCisgICAgICAgICZtdXQgc2VsZiwKKyAgICAgICAgc2VydmljZV9uYW1lOiBTLAorICAgICAgICBwcm9jZXNzb3I6IEJveDxUUHJvY2Vzc29yICsgU2VuZCArIFN5bmM+LAorICAgICAgICBhc19kZWZhdWx0OiBib29sLAorICAgICkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IG11dCBzdG9yZWQgPSBzZWxmLnN0b3JlZC5sb2NrKCkudW53cmFwKCk7CisKKyAgICAgICAgbGV0IG5hbWUgPSBzZXJ2aWNlX25hbWUuaW50bygpOworICAgICAgICBpZiAhc3RvcmVkLnByb2Nlc3NvcnMuY29udGFpbnNfa2V5KCZuYW1lKSB7CisgICAgICAgICAgICBsZXQgcHJvY2Vzc29yID0gQXJjOjpuZXcocHJvY2Vzc29yKTsKKworICAgICAgICAgICAgaWYgYXNfZGVmYXVsdCB7CisgICAgICAgICAgICAgICAgaWYgc3RvcmVkLmRlZmF1bHRfcHJvY2Vzc29yLmlzX25vbmUoKSB7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlZC5wcm9jZXNzb3JzLmluc2VydChuYW1lLCBwcm9jZXNzb3IuY2xvbmUoKSk7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlZC5kZWZhdWx0X3Byb2Nlc3NvciA9IFNvbWUocHJvY2Vzc29yLmNsb25lKCkpOworICAgICAgICAgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBFcnIoImNhbm5vdCByZXNldCBkZWZhdWx0IHByb2Nlc3NvciIuaW50bygpKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RvcmVkLnByb2Nlc3NvcnMuaW5zZXJ0KG5hbWUsIHByb2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgT2soKCkpCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFcnIoZm9ybWF0ISgiY2Fubm90IG92ZXJ3cml0ZSBleGlzdGluZyBwcm9jZXNzb3IgZm9yIHNlcnZpY2Uge30iLCBuYW1lKS5pbnRvKCkpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiBwcm9jZXNzX21lc3NhZ2UoCisgICAgICAgICZzZWxmLAorICAgICAgICBtc2dfaWRlbnQ6ICZUTWVzc2FnZUlkZW50aWZpZXIsCisgICAgICAgIGlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCwKKyAgICAgICAgb19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCwKKyAgICApIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCAoc3ZjX25hbWUsIHN2Y19jYWxsKSA9IHNwbGl0X2lkZW50X25hbWUoJm1zZ19pZGVudC5uYW1lKTsKKyAgICAgICAgZGVidWchKCJyb3V0aW5nIHN2Y19uYW1lIHs6P30gc3ZjX2NhbGwge30iLCAmc3ZjX25hbWUsICZzdmNfY2FsbCk7CisKKyAgICAgICAgbGV0IHByb2Nlc3NvcjogT3B0aW9uPEFyYzxUaHJlYWRTYWZlUHJvY2Vzc29yPj4gPSB7CisgICAgICAgICAgICBsZXQgc3RvcmVkID0gc2VsZi5zdG9yZWQubG9jaygpLnVud3JhcCgpOworICAgICAgICAgICAgaWYgbGV0IFNvbWUobmFtZSkgPSBzdmNfbmFtZSB7CisgICAgICAgICAgICAgICAgc3RvcmVkLnByb2Nlc3NvcnMuZ2V0KG5hbWUpLmNsb25lZCgpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0b3JlZC5kZWZhdWx0X3Byb2Nlc3Nvci5jbG9uZSgpCisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgbWF0Y2ggcHJvY2Vzc29yIHsKKyAgICAgICAgICAgIFNvbWUoYXJjKSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IG5ld19tc2dfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygKKyAgICAgICAgICAgICAgICAgICAgc3ZjX2NhbGwsCisgICAgICAgICAgICAgICAgICAgIG1zZ19pZGVudC5tZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgIG1zZ19pZGVudC5zZXF1ZW5jZV9udW1iZXIsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBsZXQgbXV0IHByb3h5X2lfcHJvdCA9IFRTdG9yZWRJbnB1dFByb3RvY29sOjpuZXcoaV9wcm90LCBuZXdfbXNnX2lkZW50KTsKKyAgICAgICAgICAgICAgICAoKmFyYykucHJvY2VzcygmbXV0IHByb3h5X2lfcHJvdCwgb19wcm90KQorICAgICAgICAgICAgfQorICAgICAgICAgICAgTm9uZSA9PiBFcnIobWlzc2luZ19wcm9jZXNzb3JfbWVzc2FnZShzdmNfbmFtZSkuaW50bygpKSwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBUUHJvY2Vzc29yIGZvciBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgeworICAgIGZuIHByb2Nlc3MoJnNlbGYsIGlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCwgb19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IG1zZ19pZGVudCA9IGlfcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4oKT87CisKKyAgICAgICAgZGVidWchKCJwcm9jZXNzIGluY29taW5nIG1zZyBpZDp7Oj99IiwgJm1zZ19pZGVudCk7CisgICAgICAgIGxldCByZXMgPSBzZWxmLnByb2Nlc3NfbWVzc2FnZSgmbXNnX2lkZW50LCBpX3Byb3QsIG9fcHJvdCk7CisKKyAgICAgICAgaGFuZGxlX3Byb2Nlc3NfcmVzdWx0KCZtc2dfaWRlbnQsIHJlcywgb19wcm90KQorICAgIH0KK30KKworaW1wbCBEZWJ1ZyBmb3IgVE11bHRpcGxleGVkUHJvY2Vzc29yIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIGxldCBzdG9yZWQgPSBzZWxmLnN0b3JlZC5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIHdyaXRlISgKKyAgICAgICAgICAgIGYsCisgICAgICAgICAgICAiVE11bHRpcGxleGVkUHJvY2VzcyB7eyByZWdpc3RlcmVkX2NvdW50OiB7Oj99IGRlZmF1bHQ6IHs6P30gfX0iLAorICAgICAgICAgICAgc3RvcmVkLnByb2Nlc3NvcnMua2V5cygpLmxlbigpLAorICAgICAgICAgICAgc3RvcmVkLmRlZmF1bHRfcHJvY2Vzc29yLmlzX3NvbWUoKQorICAgICAgICApCisgICAgfQorfQorCitmbiBzcGxpdF9pZGVudF9uYW1lKGlkZW50X25hbWU6ICZzdHIpIC0+IChPcHRpb248JnN0cj4sICZzdHIpIHsKKyAgICBpZGVudF9uYW1lCisgICAgICAgIC5maW5kKCc6JykKKyAgICAgICAgLm1hcCh8cG9zfCB7CisgICAgICAgICAgICBsZXQgKHN2Y19uYW1lLCBzdmNfY2FsbCkgPSBpZGVudF9uYW1lLnNwbGl0X2F0KHBvcyk7CisgICAgICAgICAgICBsZXQgKF8sIHN2Y19jYWxsKSA9IHN2Y19jYWxsLnNwbGl0X2F0KDEpOyAvLyByZW1vdmUgY29sb24gZnJvbSBzZXJ2aWNlIGNhbGwgbmFtZQorICAgICAgICAgICAgKFNvbWUoc3ZjX25hbWUpLCBzdmNfY2FsbCkKKyAgICAgICAgfSkKKyAgICAgICAgLm9yX2Vsc2UofHwgU29tZSgoTm9uZSwgaWRlbnRfbmFtZSkpKQorICAgICAgICAudW53cmFwKCkKK30KKworZm4gbWlzc2luZ19wcm9jZXNzb3JfbWVzc2FnZShzdmNfbmFtZTogT3B0aW9uPCZzdHI+KSAtPiBTdHJpbmcgeworICAgIG1hdGNoIHN2Y19uYW1lIHsKKyAgICAgICAgU29tZShuYW1lKSA9PiBmb3JtYXQhKCJubyBwcm9jZXNzb3IgZm91bmQgZm9yIHNlcnZpY2Uge30iLCBuYW1lKSwKKyAgICAgICAgTm9uZSA9PiBNSVNTSU5HX1NFUEFSQVRPUl9BTkRfTk9fREVGQVVMVC50b19vd25lZCgpLAorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdGQ6OmNvbnZlcnQ6OkludG87CisgICAgdXNlIHN0ZDo6c3luYzo6YXRvbWljOjp7QXRvbWljQm9vbCwgT3JkZXJpbmd9OworICAgIHVzZSBzdGQ6OnN5bmM6OkFyYzsKKworICAgIHVzZSBwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sLCBUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRNZXNzYWdlSWRlbnRpZmllciwgVE1lc3NhZ2VUeXBlfTsKKyAgICB1c2UgdHJhbnNwb3J0Ojp7UmVhZEhhbGYsIFRCdWZmZXJDaGFubmVsLCBUSW9DaGFubmVsLCBXcml0ZUhhbGZ9OworICAgIHVzZSB7QXBwbGljYXRpb25FcnJvciwgQXBwbGljYXRpb25FcnJvcktpbmR9OworCisgICAgdXNlIHN1cGVyOjoqOworCisgICAgI1t0ZXN0XQorICAgIGZuIHNob3VsZF9zcGxpdF9uYW1lX2ludG9fcHJvcGVyX3NlcGFyYXRvcl9hbmRfc2VydmljZV9jYWxsKCkgeworICAgICAgICBsZXQgaWRlbnRfbmFtZSA9ICJmb286YmFyX2NhbGwiOworICAgICAgICBsZXQgKHNlcnYsIGNhbGwpID0gc3BsaXRfaWRlbnRfbmFtZSgmaWRlbnRfbmFtZSk7CisgICAgICAgIGFzc2VydF9lcSEoc2VydiwgU29tZSgiZm9vIikpOworICAgICAgICBhc3NlcnRfZXEhKGNhbGwsICJiYXJfY2FsbCIpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBzaG91bGRfcmV0dXJuX2Z1bGxfaWRlbnRfaWZfbm9fc2VwYXJhdG9yX2V4aXN0cygpIHsKKyAgICAgICAgbGV0IGlkZW50X25hbWUgPSAiYmFyX2NhbGwiOworICAgICAgICBsZXQgKHNlcnYsIGNhbGwpID0gc3BsaXRfaWRlbnRfbmFtZSgmaWRlbnRfbmFtZSk7CisgICAgICAgIGFzc2VydF9lcSEoc2VydiwgTm9uZSk7CisgICAgICAgIGFzc2VydF9lcSEoY2FsbCwgImJhcl9jYWxsIik7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHNob3VsZF93cml0ZV9lcnJvcl9pZl9ub19zZXBhcmF0b3JfZm91bmRfYW5kX25vX2RlZmF1bHRfcHJvY2Vzc29yX2V4aXN0cygpIHsKKyAgICAgICAgbGV0IChtdXQgaSwgbXV0IG8pID0gYnVpbGRfb2JqZWN0cygpOworCisgICAgICAgIGxldCBzZW50X2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMTApOworICAgICAgICBvLndyaXRlX21lc3NhZ2VfYmVnaW4oJnNlbnRfaWRlbnQpLnVud3JhcCgpOworICAgICAgICBvLmZsdXNoKCkudW53cmFwKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmVtcHR5X3dyaXRlX2J1ZmZlcigpOworCisgICAgICAgIGxldCBwID0gVE11bHRpcGxleGVkUHJvY2Vzc29yOjpuZXcoKTsKKyAgICAgICAgcC5wcm9jZXNzKCZtdXQgaSwgJm11dCBvKS51bndyYXAoKTsgLy8gYXQgdGhpcyBwb2ludCBhbiBlcnJvciBzaG91bGQgYmUgd3JpdHRlbiBvdXQKKworICAgICAgICBpLnRyYW5zcG9ydC5zZXRfcmVhZGFibGVfYnl0ZXMoJm8udHJhbnNwb3J0LndyaXRlX2J5dGVzKCkpOworICAgICAgICBsZXQgcmN2ZF9pZGVudCA9IGkucmVhZF9tZXNzYWdlX2JlZ2luKCkudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUTWVzc2FnZVR5cGU6OkV4Y2VwdGlvbiwgMTApOworICAgICAgICBhc3NlcnRfZXEhKHJjdmRfaWRlbnQsIGV4cGVjdGVkX2lkZW50KTsKKyAgICAgICAgbGV0IHJjdmRfZXJyID0gOjpFcnJvcjo6cmVhZF9hcHBsaWNhdGlvbl9lcnJvcl9mcm9tX2luX3Byb3RvY29sKCZtdXQgaSkudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9lcnIgPSBBcHBsaWNhdGlvbkVycm9yOjpuZXcoCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgIE1JU1NJTkdfU0VQQVJBVE9SX0FORF9OT19ERUZBVUxULAorICAgICAgICApOworICAgICAgICBhc3NlcnRfZXEhKHJjdmRfZXJyLCBleHBlY3RlZF9lcnIpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBzaG91bGRfd3JpdGVfZXJyb3JfaWZfc2VwYXJhdG9yX2V4aXN0c19hbmRfbm9fcHJvY2Vzc29yX2ZvdW5kKCkgeworICAgICAgICBsZXQgKG11dCBpLCBtdXQgbykgPSBidWlsZF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IHNlbnRfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygibWlzc2luZzpjYWxsIiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxMCk7CisgICAgICAgIG8ud3JpdGVfbWVzc2FnZV9iZWdpbigmc2VudF9pZGVudCkudW53cmFwKCk7CisgICAgICAgIG8uZmx1c2goKS51bndyYXAoKTsKKyAgICAgICAgby50cmFuc3BvcnQuY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIoKTsKKyAgICAgICAgby50cmFuc3BvcnQuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisKKyAgICAgICAgbGV0IHAgPSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6Om5ldygpOworICAgICAgICBwLnByb2Nlc3MoJm11dCBpLCAmbXV0IG8pLnVud3JhcCgpOyAvLyBhdCB0aGlzIHBvaW50IGFuIGVycm9yIHNob3VsZCBiZSB3cml0dGVuIG91dAorCisgICAgICAgIGkudHJhbnNwb3J0LnNldF9yZWFkYWJsZV9ieXRlcygmby50cmFuc3BvcnQud3JpdGVfYnl0ZXMoKSk7CisgICAgICAgIGxldCByY3ZkX2lkZW50ID0gaS5yZWFkX21lc3NhZ2VfYmVnaW4oKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoIm1pc3Npbmc6Y2FsbCIsIFRNZXNzYWdlVHlwZTo6RXhjZXB0aW9uLCAxMCk7CisgICAgICAgIGFzc2VydF9lcSEocmN2ZF9pZGVudCwgZXhwZWN0ZWRfaWRlbnQpOworICAgICAgICBsZXQgcmN2ZF9lcnIgPSA6OkVycm9yOjpyZWFkX2FwcGxpY2F0aW9uX2Vycm9yX2Zyb21faW5fcHJvdG9jb2woJm11dCBpKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX2VyciA9IEFwcGxpY2F0aW9uRXJyb3I6Om5ldygKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgbWlzc2luZ19wcm9jZXNzb3JfbWVzc2FnZShTb21lKCJtaXNzaW5nIikpLAorICAgICAgICApOworICAgICAgICBhc3NlcnRfZXEhKHJjdmRfZXJyLCBleHBlY3RlZF9lcnIpOworICAgIH0KKworICAgICNbZGVyaXZlKERlZmF1bHQpXQorICAgIHN0cnVjdCBTZXJ2aWNlIHsKKyAgICAgICAgcHViIGludm9rZWQ6IEFyYzxBdG9taWNCb29sPiwKKyAgICB9CisKKyAgICBpbXBsIFRQcm9jZXNzb3IgZm9yIFNlcnZpY2UgeworICAgICAgICBmbiBwcm9jZXNzKCZzZWxmLCBfOiAmbXV0IFRJbnB1dFByb3RvY29sLCBfOiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgICAgIGxldCByZXMgPSBzZWxmCisgICAgICAgICAgICAgICAgLmludm9rZWQKKyAgICAgICAgICAgICAgICAuY29tcGFyZV9hbmRfc3dhcChmYWxzZSwgdHJ1ZSwgT3JkZXJpbmc6OlJlbGF4ZWQpOworICAgICAgICAgICAgaWYgcmVzIHsKKyAgICAgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRXJyKCJmYWlsZWQgc3dhcCIuaW50bygpKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHNob3VsZF9yb3V0ZV9jYWxsX3RvX2NvcnJlY3RfcHJvY2Vzc29yKCkgeworICAgICAgICBsZXQgKG11dCBpLCBtdXQgbykgPSBidWlsZF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gYnVpbGQgdGhlIHNlcnZpY2VzCisgICAgICAgIGxldCBzdmNfMSA9IFNlcnZpY2UgeworICAgICAgICAgICAgaW52b2tlZDogQXJjOjpuZXcoQXRvbWljQm9vbDo6bmV3KGZhbHNlKSksCisgICAgICAgIH07CisgICAgICAgIGxldCBhdG1fMSA9IHN2Y18xLmludm9rZWQuY2xvbmUoKTsKKyAgICAgICAgbGV0IHN2Y18yID0gU2VydmljZSB7CisgICAgICAgICAgICBpbnZva2VkOiBBcmM6Om5ldyhBdG9taWNCb29sOjpuZXcoZmFsc2UpKSwKKyAgICAgICAgfTsKKyAgICAgICAgbGV0IGF0bV8yID0gc3ZjXzIuaW52b2tlZC5jbG9uZSgpOworCisgICAgICAgIC8vIHJlZ2lzdGVyIHRoZW0KKyAgICAgICAgbGV0IG11dCBwID0gVE11bHRpcGxleGVkUHJvY2Vzc29yOjpuZXcoKTsKKyAgICAgICAgcC5yZWdpc3Rlcigic2VydmljZV8xIiwgQm94OjpuZXcoc3ZjXzEpLCBmYWxzZSkudW53cmFwKCk7CisgICAgICAgIHAucmVnaXN0ZXIoInNlcnZpY2VfMiIsIEJveDo6bmV3KHN2Y18yKSwgZmFsc2UpLnVud3JhcCgpOworCisgICAgICAgIC8vIG1ha2UgdGhlIHNlcnZpY2UgY2FsbAorICAgICAgICBsZXQgc2VudF9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJzZXJ2aWNlXzE6Y2FsbCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMTApOworICAgICAgICBvLndyaXRlX21lc3NhZ2VfYmVnaW4oJnNlbnRfaWRlbnQpLnVud3JhcCgpOworICAgICAgICBvLmZsdXNoKCkudW53cmFwKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmVtcHR5X3dyaXRlX2J1ZmZlcigpOworCisgICAgICAgIHAucHJvY2VzcygmbXV0IGksICZtdXQgbykudW53cmFwKCk7CisKKyAgICAgICAgLy8gc2VydmljZSAxIHNob3VsZCBoYXZlIGJlZW4gaW52b2tlZCwgbm90IHNlcnZpY2UgMgorICAgICAgICBhc3NlcnRfZXEhKGF0bV8xLmxvYWQoT3JkZXJpbmc6OlJlbGF4ZWQpLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0X2VxIShhdG1fMi5sb2FkKE9yZGVyaW5nOjpSZWxheGVkKSwgZmFsc2UpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBzaG91bGRfcm91dGVfY2FsbF90b19jb3JyZWN0X3Byb2Nlc3Nvcl9pZl9ub19zZXBhcmF0b3JfZXhpc3RzX2FuZF9kZWZhdWx0X3Byb2Nlc3Nvcl9zZXQoKSB7CisgICAgICAgIGxldCAobXV0IGksIG11dCBvKSA9IGJ1aWxkX29iamVjdHMoKTsKKworICAgICAgICAvLyBidWlsZCB0aGUgc2VydmljZXMKKyAgICAgICAgbGV0IHN2Y18xID0gU2VydmljZSB7CisgICAgICAgICAgICBpbnZva2VkOiBBcmM6Om5ldyhBdG9taWNCb29sOjpuZXcoZmFsc2UpKSwKKyAgICAgICAgfTsKKyAgICAgICAgbGV0IGF0bV8xID0gc3ZjXzEuaW52b2tlZC5jbG9uZSgpOworICAgICAgICBsZXQgc3ZjXzIgPSBTZXJ2aWNlIHsKKyAgICAgICAgICAgIGludm9rZWQ6IEFyYzo6bmV3KEF0b21pY0Jvb2w6Om5ldyhmYWxzZSkpLAorICAgICAgICB9OworICAgICAgICBsZXQgYXRtXzIgPSBzdmNfMi5pbnZva2VkLmNsb25lKCk7CisKKyAgICAgICAgLy8gcmVnaXN0ZXIgdGhlbQorICAgICAgICBsZXQgbXV0IHAgPSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6Om5ldygpOworICAgICAgICBwLnJlZ2lzdGVyKCJzZXJ2aWNlXzEiLCBCb3g6Om5ldyhzdmNfMSksIGZhbHNlKS51bndyYXAoKTsKKyAgICAgICAgcC5yZWdpc3Rlcigic2VydmljZV8yIiwgQm94OjpuZXcoc3ZjXzIpLCB0cnVlKS51bndyYXAoKTsgLy8gc2Vjb25kIHByb2Nlc3NvciBpcyBkZWZhdWx0CisKKyAgICAgICAgLy8gbWFrZSB0aGUgc2VydmljZSBjYWxsIChpdCdzIGFuIG9sZCBjbGllbnQsIHNvIHdlIGhhdmUgdG8gYmUgYmFja3dhcmRzIGNvbXBhdGlibGUpCisgICAgICAgIGxldCBzZW50X2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoIm9sZF9jYWxsIiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxMCk7CisgICAgICAgIG8ud3JpdGVfbWVzc2FnZV9iZWdpbigmc2VudF9pZGVudCkudW53cmFwKCk7CisgICAgICAgIG8uZmx1c2goKS51bndyYXAoKTsKKyAgICAgICAgby50cmFuc3BvcnQuY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIoKTsKKyAgICAgICAgby50cmFuc3BvcnQuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisKKyAgICAgICAgcC5wcm9jZXNzKCZtdXQgaSwgJm11dCBvKS51bndyYXAoKTsKKworICAgICAgICAvLyBzZXJ2aWNlIDIgc2hvdWxkIGhhdmUgYmVlbiBpbnZva2VkLCBub3Qgc2VydmljZSAxCisgICAgICAgIGFzc2VydF9lcSEoYXRtXzEubG9hZChPcmRlcmluZzo6UmVsYXhlZCksIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0X2VxIShhdG1fMi5sb2FkKE9yZGVyaW5nOjpSZWxheGVkKSwgdHJ1ZSk7CisgICAgfQorCisgICAgZm4gYnVpbGRfb2JqZWN0cygpIC0+ICgKKyAgICAgICAgVEJpbmFyeUlucHV0UHJvdG9jb2w8UmVhZEhhbGY8VEJ1ZmZlckNoYW5uZWw+PiwKKyAgICAgICAgVEJpbmFyeU91dHB1dFByb3RvY29sPFdyaXRlSGFsZjxUQnVmZmVyQ2hhbm5lbD4+LAorICAgICkgeworICAgICAgICBsZXQgYyA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEyOCwgMTI4KTsKKyAgICAgICAgbGV0IChyX2MsIHdfYykgPSBjLnNwbGl0KCkudW53cmFwKCk7CisgICAgICAgICgKKyAgICAgICAgICAgIFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcocl9jLCB0cnVlKSwKKyAgICAgICAgICAgIFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KHdfYywgdHJ1ZSksCisgICAgICAgICkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3NlcnZlci90aHJlYWRlZC5ycyBiL2xpYi9ycy9zcmMvc2VydmVyL3RocmVhZGVkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMzlhNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3NlcnZlci90aHJlYWRlZC5ycwpAQCAtMCwwICsxLDIzNCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2Ugc3RkOjpuZXQ6OntUY3BMaXN0ZW5lciwgVGNwU3RyZWFtfTsKK3VzZSBzdGQ6OnN5bmM6OkFyYzsKK3VzZSB0aHJlYWRwb29sOjpUaHJlYWRQb29sOworCit1c2UgcHJvdG9jb2w6OntUSW5wdXRQcm90b2NvbCwgVElucHV0UHJvdG9jb2xGYWN0b3J5LCBUT3V0cHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbEZhY3Rvcnl9OwordXNlIHRyYW5zcG9ydDo6e1RJb0NoYW5uZWwsIFRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVFRjcENoYW5uZWwsIFRXcml0ZVRyYW5zcG9ydEZhY3Rvcnl9OwordXNlIHtBcHBsaWNhdGlvbkVycm9yLCBBcHBsaWNhdGlvbkVycm9yS2luZH07CisKK3VzZSBzdXBlcjo6VFByb2Nlc3NvcjsKKworLy8vIEZpeGVkLXNpemUgdGhyZWFkLXBvb2wgYmxvY2tpbmcgVGhyaWZ0IHNlcnZlci4KKy8vLworLy8vIEEgYFRTZXJ2ZXJgIGxpc3RlbnMgb24gYSBnaXZlbiBhZGRyZXNzIGFuZCBzdWJtaXRzIGFjY2VwdGVkIGNvbm5lY3Rpb25zCisvLy8gdG8gYW4gKip1bmJvdW5kZWQqKiBxdWV1ZS4gQ29ubmVjdGlvbnMgZnJvbSB0aGlzIHF1ZXVlIGFyZSBzZXJ2aWNlZCBieQorLy8vIHRoZSBmaXJzdCBhdmFpbGFibGUgd29ya2VyIHRocmVhZCBmcm9tIGEgKipmaXhlZC1zaXplKiogdGhyZWFkIHBvb2wuIEVhY2gKKy8vLyBhY2NlcHRlZCBjb25uZWN0aW9uIGlzIGhhbmRsZWQgYnkgdGhhdCB3b3JrZXIgdGhyZWFkLCBhbmQgY29tbXVuaWNhdGlvbgorLy8vIG92ZXIgdGhpcyB0aHJlYWQgb2NjdXJzIHNlcXVlbnRpYWxseSBhbmQgc3luY2hyb25vdXNseSAoaS5lLiBjYWxscyBibG9jaykuCisvLy8gQWNjZXB0ZWQgY29ubmVjdGlvbnMgaGF2ZSBhbiBpbnB1dCBoYWxmIGFuZCBhbiBvdXRwdXQgaGFsZiwgZWFjaCBvZiB3aGljaAorLy8vIHVzZXMgYSBgVFRyYW5zcG9ydGAgYW5kIGBUSW5wdXRQcm90b2NvbGAvYFRPdXRwdXRQcm90b2NvbGAgdG8gdHJhbnNsYXRlCisvLy8gbWVzc2FnZXMgdG8gYW5kIGZyb20gYnllcy4gQW55IGNvbWJpbmF0aW9uIG9mIGBUSW5wdXRQcm90b2NvbGAsIGBUT3V0cHV0UHJvdG9jb2xgCisvLy8gYW5kIGBUVHJhbnNwb3J0YCBtYXkgYmUgdXNlZC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0aW5nIGFuZCBydW5uaW5nIGEgYFRTZXJ2ZXJgIHVzaW5nIFRocmlmdC1jb21waWxlci1nZW5lcmF0ZWQKKy8vLyBzZXJ2aWNlIGNvZGUuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0OworLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VElucHV0UHJvdG9jb2xGYWN0b3J5LCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5fTsKKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSwgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeX07CisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUSW5wdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntUQnVmZmVyZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5LAorLy8vICAgICAgICAgICAgICAgICAgICAgICAgIFRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeX07CisvLy8gdXNlIHRocmlmdDo6c2VydmVyOjp7VFByb2Nlc3NvciwgVFNlcnZlcn07CisvLy8KKy8vLyAvLworLy8vIC8vIGF1dG8tZ2VuZXJhdGVkCisvLy8gLy8KKy8vLworLy8vIC8vIHByb2Nlc3NvciBmb3IgYFNpbXBsZVNlcnZpY2VgCisvLy8gc3RydWN0IFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yOworLy8vIGltcGwgU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3IgeworLy8vICAgICBmbiBuZXc8SDogU2ltcGxlU2VydmljZVN5bmNIYW5kbGVyPihwcm9jZXNzb3I6IEgpIC0+IFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yIHsKKy8vLyAgICAgICAgIHVuaW1wbGVtZW50ZWQhKCk7CisvLy8gICAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBgVFByb2Nlc3NvcmAgaW1wbGVtZW50YXRpb24gZm9yIGBTaW1wbGVTZXJ2aWNlYAorLy8vIGltcGwgVFByb2Nlc3NvciBmb3IgU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3IgeworLy8vICAgICBmbiBwcm9jZXNzKCZzZWxmLCBpOiAmbXV0IFRJbnB1dFByb3RvY29sLCBvOiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKy8vLyAgICAgICAgIHVuaW1wbGVtZW50ZWQhKCk7CisvLy8gICAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBzZXJ2aWNlIGZ1bmN0aW9ucyBmb3IgU2ltcGxlU2VydmljZQorLy8vIHRyYWl0IFNpbXBsZVNlcnZpY2VTeW5jSGFuZGxlciB7CisvLy8gICAgIGZuIHNlcnZpY2VfY2FsbCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+OworLy8vIH0KKy8vLworLy8vIC8vCisvLy8gLy8gdXNlci1jb2RlIGZvbGxvd3MKKy8vLyAvLworLy8vCisvLy8gLy8gZGVmaW5lIGEgaGFuZGxlciB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuIGBzZXJ2aWNlX2NhbGxgIGlzIHJlY2VpdmVkCisvLy8gc3RydWN0IFNpbXBsZVNlcnZpY2VIYW5kbGVySW1wbDsKKy8vLyBpbXBsIFNpbXBsZVNlcnZpY2VTeW5jSGFuZGxlciBmb3IgU2ltcGxlU2VydmljZUhhbmRsZXJJbXBsIHsKKy8vLyAgICAgZm4gc2VydmljZV9jYWxsKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworLy8vICAgICAgICAgdW5pbXBsZW1lbnRlZCEoKTsKKy8vLyAgICAgfQorLy8vIH0KKy8vLworLy8vIC8vIGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IKKy8vLyBsZXQgcHJvY2Vzc29yID0gU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3I6Om5ldyhTaW1wbGVTZXJ2aWNlSGFuZGxlckltcGwge30pOworLy8vCisvLy8gLy8gaW5zdGFudGlhdGUgdGhlIHNlcnZlcgorLy8vIGxldCBpX3RyX2ZhY3Q6IEJveDxUUmVhZFRyYW5zcG9ydEZhY3Rvcnk+ID0gQm94OjpuZXcoVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpKTsKKy8vLyBsZXQgaV9wcl9mYWN0OiBCb3g8VElucHV0UHJvdG9jb2xGYWN0b3J5PiA9IEJveDo6bmV3KFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCkpOworLy8vIGxldCBvX3RyX2ZhY3Q6IEJveDxUV3JpdGVUcmFuc3BvcnRGYWN0b3J5PiA9IEJveDo6bmV3KFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCkpOworLy8vIGxldCBvX3ByX2ZhY3Q6IEJveDxUT3V0cHV0UHJvdG9jb2xGYWN0b3J5PiA9IEJveDo6bmV3KFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKTsKKy8vLworLy8vIGxldCBtdXQgc2VydmVyID0gVFNlcnZlcjo6bmV3KAorLy8vICAgICBpX3RyX2ZhY3QsCisvLy8gICAgIGlfcHJfZmFjdCwKKy8vLyAgICAgb190cl9mYWN0LAorLy8vICAgICBvX3ByX2ZhY3QsCisvLy8gICAgIHByb2Nlc3NvciwKKy8vLyAgICAgMTAKKy8vLyApOworLy8vCisvLy8gLy8gc3RhcnQgbGlzdGVuaW5nIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucworLy8vIG1hdGNoIHNlcnZlci5saXN0ZW4oIjEyNy4wLjAuMTo4MDgwIikgeworLy8vICAgT2soXykgID0+IHByaW50bG4hKCJsaXN0ZW4gY29tcGxldGVkIiksCisvLy8gICBFcnIoZSkgPT4gcHJpbnRsbiEoImxpc3RlbiBmYWlsZWQgd2l0aCBlcnJvciB7Oj99IiwgZSksCisvLy8gfQorLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUU2VydmVyPFBSQywgUlRGLCBJUEYsIFdURiwgT1BGPgord2hlcmUKKyAgICBQUkM6IFRQcm9jZXNzb3IgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgUlRGOiBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIElQRjogVElucHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBXVEY6IFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIE9QRjogVE91dHB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCit7CisgICAgcl90cmFuc19mYWN0b3J5OiBSVEYsCisgICAgaV9wcm90b19mYWN0b3J5OiBJUEYsCisgICAgd190cmFuc19mYWN0b3J5OiBXVEYsCisgICAgb19wcm90b19mYWN0b3J5OiBPUEYsCisgICAgcHJvY2Vzc29yOiBBcmM8UFJDPiwKKyAgICB3b3JrZXJfcG9vbDogVGhyZWFkUG9vbCwKK30KKworaW1wbDxQUkMsIFJURiwgSVBGLCBXVEYsIE9QRj4gVFNlcnZlcjxQUkMsIFJURiwgSVBGLCBXVEYsIE9QRj4KK3doZXJlCisgICAgUFJDOiBUUHJvY2Vzc29yICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgIFJURjogVFJlYWRUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBJUEY6IFRJbnB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCisgICAgV1RGOiBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBPUEY6IFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAoreworICAgIC8vLyBDcmVhdGUgYSBgVFNlcnZlcmAuCisgICAgLy8vCisgICAgLy8vIEVhY2ggYWNjZXB0ZWQgY29ubmVjdGlvbiBoYXMgYW4gaW5wdXQgYW5kIG91dHB1dCBoYWxmLCBlYWNoIG9mIHdoaWNoCisgICAgLy8vIHJlcXVpcmVzIGEgYFRUcmFuc3BvcnRgIGFuZCBgVFByb3RvY29sYC4gYFRTZXJ2ZXJgIHVzZXMKKyAgICAvLy8gYHJlYWRfdHJhbnNwb3J0X2ZhY3RvcnlgIGFuZCBgaW5wdXRfcHJvdG9jb2xfZmFjdG9yeWAgdG8gY3JlYXRlCisgICAgLy8vIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIGlucHV0LCBhbmQgYHdyaXRlX3RyYW5zcG9ydF9mYWN0b3J5YCBhbmQKKyAgICAvLy8gYG91dHB1dF9wcm90b2NvbF9mYWN0b3J5YCB0byBjcmVhdGUgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgb3V0cHV0LgorICAgIHB1YiBmbiBuZXcoCisgICAgICAgIHJlYWRfdHJhbnNwb3J0X2ZhY3Rvcnk6IFJURiwKKyAgICAgICAgaW5wdXRfcHJvdG9jb2xfZmFjdG9yeTogSVBGLAorICAgICAgICB3cml0ZV90cmFuc3BvcnRfZmFjdG9yeTogV1RGLAorICAgICAgICBvdXRwdXRfcHJvdG9jb2xfZmFjdG9yeTogT1BGLAorICAgICAgICBwcm9jZXNzb3I6IFBSQywKKyAgICAgICAgbnVtX3dvcmtlcnM6IHVzaXplLAorICAgICkgLT4gVFNlcnZlcjxQUkMsIFJURiwgSVBGLCBXVEYsIE9QRj4geworICAgICAgICBUU2VydmVyIHsKKyAgICAgICAgICAgIHJfdHJhbnNfZmFjdG9yeTogcmVhZF90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgIGlfcHJvdG9fZmFjdG9yeTogaW5wdXRfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgIHdfdHJhbnNfZmFjdG9yeTogd3JpdGVfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICBvX3Byb3RvX2ZhY3Rvcnk6IG91dHB1dF9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgcHJvY2Vzc29yOiBBcmM6Om5ldyhwcm9jZXNzb3IpLAorICAgICAgICAgICAgd29ya2VyX3Bvb2w6IFRocmVhZFBvb2w6OndpdGhfbmFtZSgiVGhyaWZ0IHNlcnZpY2UgcHJvY2Vzc29yIi50b19vd25lZCgpLCBudW1fd29ya2VycyksCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gTGlzdGVuIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucyBvbiBgbGlzdGVuX2FkZHJlc3NgLgorICAgIC8vLworICAgIC8vLyBgbGlzdGVuX2FkZHJlc3NgIHNob3VsZCBiZSBpbiB0aGUgZm9ybSBgaG9zdDpwb3J0YCwKKyAgICAvLy8gZm9yIGV4YW1wbGU6IGAxMjcuMC4wLjE6ODA4MGAuCisgICAgLy8vCisgICAgLy8vIFJldHVybiBgKClgIGlmIHN1Y2Nlc3NmdWwuCisgICAgLy8vCisgICAgLy8vIFJldHVybiBgRXJyYCB3aGVuIHRoZSBzZXJ2ZXIgY2Fubm90IGJpbmQgdG8gYGxpc3Rlbl9hZGRyZXNzYCBvciB0aGVyZQorICAgIC8vLyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgIHB1YiBmbiBsaXN0ZW4oJm11dCBzZWxmLCBsaXN0ZW5fYWRkcmVzczogJnN0cikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IGxpc3RlbmVyID0gVGNwTGlzdGVuZXI6OmJpbmQobGlzdGVuX2FkZHJlc3MpPzsKKyAgICAgICAgZm9yIHN0cmVhbSBpbiBsaXN0ZW5lci5pbmNvbWluZygpIHsKKyAgICAgICAgICAgIG1hdGNoIHN0cmVhbSB7CisgICAgICAgICAgICAgICAgT2socykgPT4geworICAgICAgICAgICAgICAgICAgICBsZXQgKGlfcHJvdCwgb19wcm90KSA9IHNlbGYubmV3X3Byb3RvY29sc19mb3JfY29ubmVjdGlvbihzKT87CisgICAgICAgICAgICAgICAgICAgIGxldCBwcm9jZXNzb3IgPSBzZWxmLnByb2Nlc3Nvci5jbG9uZSgpOworICAgICAgICAgICAgICAgICAgICBzZWxmLndvcmtlcl9wb29sCisgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZShtb3ZlIHx8IGhhbmRsZV9pbmNvbWluZ19jb25uZWN0aW9uKHByb2Nlc3NvciwgaV9wcm90LCBvX3Byb3QpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgd2FybiEoImZhaWxlZCB0byBhY2NlcHQgcmVtb3RlIGNvbm5lY3Rpb24gd2l0aCBlcnJvciB7Oj99IiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgRXJyKDo6RXJyb3I6OkFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDogQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICBtZXNzYWdlOiAiYWJvcnRlZCBsaXN0ZW4gbG9vcCIuaW50bygpLAorICAgICAgICB9KSkKKyAgICB9CisKKyAgICBmbiBuZXdfcHJvdG9jb2xzX2Zvcl9jb25uZWN0aW9uKAorICAgICAgICAmbXV0IHNlbGYsCisgICAgICAgIHN0cmVhbTogVGNwU3RyZWFtLAorICAgICkgLT4gOjpSZXN1bHQ8KEJveDxUSW5wdXRQcm90b2NvbCArIFNlbmQ+LCBCb3g8VE91dHB1dFByb3RvY29sICsgU2VuZD4pPiB7CisgICAgICAgIC8vIGNyZWF0ZSB0aGUgc2hhcmVkIHRjcCBzdHJlYW0KKyAgICAgICAgbGV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6d2l0aF9zdHJlYW0oc3RyZWFtKTsKKworICAgICAgICAvLyBzcGxpdCBpdCBpbnRvIHR3byAtIG9uZSB0byBiZSBvd25lZCBieSB0aGUKKyAgICAgICAgLy8gaW5wdXQgdHJhbi9wcm90byBhbmQgdGhlIG90aGVyIGJ5IHRoZSBvdXRwdXQKKyAgICAgICAgbGV0IChyX2NoYW4sIHdfY2hhbikgPSBjaGFubmVsLnNwbGl0KCk/OworCisgICAgICAgIC8vIGlucHV0IHByb3RvY29sIGFuZCB0cmFuc3BvcnQKKyAgICAgICAgbGV0IHJfdHJhbiA9IHNlbGYucl90cmFuc19mYWN0b3J5LmNyZWF0ZShCb3g6Om5ldyhyX2NoYW4pKTsKKyAgICAgICAgbGV0IGlfcHJvdCA9IHNlbGYuaV9wcm90b19mYWN0b3J5LmNyZWF0ZShyX3RyYW4pOworCisgICAgICAgIC8vIG91dHB1dCBwcm90b2NvbCBhbmQgdHJhbnNwb3J0CisgICAgICAgIGxldCB3X3RyYW4gPSBzZWxmLndfdHJhbnNfZmFjdG9yeS5jcmVhdGUoQm94OjpuZXcod19jaGFuKSk7CisgICAgICAgIGxldCBvX3Byb3QgPSBzZWxmLm9fcHJvdG9fZmFjdG9yeS5jcmVhdGUod190cmFuKTsKKworICAgICAgICBPaygoaV9wcm90LCBvX3Byb3QpKQorICAgIH0KK30KKworZm4gaGFuZGxlX2luY29taW5nX2Nvbm5lY3Rpb248UFJDPigKKyAgICBwcm9jZXNzb3I6IEFyYzxQUkM+LAorICAgIGlfcHJvdDogQm94PFRJbnB1dFByb3RvY29sPiwKKyAgICBvX3Byb3Q6IEJveDxUT3V0cHV0UHJvdG9jb2w+LAorKSB3aGVyZQorICAgIFBSQzogVFByb2Nlc3NvciwKK3sKKyAgICBsZXQgbXV0IGlfcHJvdCA9IGlfcHJvdDsKKyAgICBsZXQgbXV0IG9fcHJvdCA9IG9fcHJvdDsKKyAgICBsb29wIHsKKyAgICAgICAgbGV0IHIgPSBwcm9jZXNzb3IucHJvY2VzcygmbXV0ICppX3Byb3QsICZtdXQgKm9fcHJvdCk7CisgICAgICAgIGlmIGxldCBFcnIoZSkgPSByIHsKKyAgICAgICAgICAgIHdhcm4hKCJwcm9jZXNzb3IgY29tcGxldGVkIHdpdGggZXJyb3I6IHs6P30iLCBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy90cmFuc3BvcnQvYnVmZmVyZWQucnMgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9idWZmZXJlZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2NmZWZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvYnVmZmVyZWQucnMKQEAgLTAsMCArMSw0ODMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIHN0ZDo6Y21wOwordXNlIHN0ZDo6aW87Cit1c2Ugc3RkOjppbzo6e1JlYWQsIFdyaXRlfTsKKwordXNlIHN1cGVyOjp7VFJlYWRUcmFuc3BvcnQsIFRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVFdyaXRlVHJhbnNwb3J0LCBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5fTsKKworLy8vIERlZmF1bHQgY2FwYWNpdHkgb2YgdGhlIHJlYWQgYnVmZmVyIGluIGJ5dGVzLgorY29uc3QgUkVBRF9DQVBBQ0lUWTogdXNpemUgPSA0MDk2OworCisvLy8gRGVmYXVsdCBjYXBhY2l0eSBvZiB0aGUgd3JpdGUgYnVmZmVyIGluIGJ5dGVzLi4KK2NvbnN0IFdSSVRFX0NBUEFDSVRZOiB1c2l6ZSA9IDQwOTY7CisKKy8vLyBUcmFuc3BvcnQgdGhhdCByZWFkcyBtZXNzYWdlcyB2aWEgYW4gaW50ZXJuYWwgYnVmZmVyLgorLy8vCisvLy8gQSBgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydGAgbWFpbnRhaW5zIGEgZml4ZWQtc2l6ZSBpbnRlcm5hbCByZWFkIGJ1ZmZlci4KKy8vLyBPbiBhIGNhbGwgdG8gYFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6OnJlYWQoLi4uKWAgb25lIGZ1bGwgbWVzc2FnZSAtIGJvdGgKKy8vLyBmaXhlZC1sZW5ndGggaGVhZGVyIGFuZCBieXRlcyAtIGlzIHJlYWQgZnJvbSB0aGUgd3JhcHBlZCBjaGFubmVsIGFuZCBidWZmZXJlZC4KKy8vLyBTdWJzZXF1ZW50IHJlYWQgY2FsbHMgYXJlIHNlcnZpY2VkIGZyb20gdGhlIGludGVybmFsIGJ1ZmZlciB1bnRpbCBpdCBpcworLy8vIGV4aGF1c3RlZCwgYXQgd2hpY2ggcG9pbnQgdGhlIG5leHQgZnVsbCBtZXNzYWdlIGlzIHJlYWQgZnJvbSB0aGUgd3JhcHBlZAorLy8vIGNoYW5uZWwuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0YC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSBzdGQ6OmlvOjpSZWFkOworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1RCdWZmZXJlZFJlYWRUcmFuc3BvcnQsIFRUY3BDaGFubmVsfTsKKy8vLworLy8vIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHQgPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0OjpuZXcoYyk7CisvLy8KKy8vLyB0LnJlYWQoJm11dCB2ZWMhWzB1ODsgMV0pLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgYnVmOiBCb3g8W3U4XT4sCisgICAgcG9zOiB1c2l6ZSwKKyAgICBjYXA6IHVzaXplLAorICAgIGNoYW46IEMsCit9CisKK2ltcGw8Qz4gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIC8vLyBDcmVhdGUgYSBgVEJ1ZmZlcmVkVHJhbnNwb3J0YCB3aXRoIGRlZmF1bHQtc2l6ZWQgaW50ZXJuYWwgcmVhZCBhbmQKKyAgICAvLy8gd3JpdGUgYnVmZmVycyB0aGF0IHdyYXBzIHRoZSBnaXZlbiBgVElvQ2hhbm5lbGAuCisgICAgcHViIGZuIG5ldyhjaGFubmVsOiBDKSAtPiBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0PEM+IHsKKyAgICAgICAgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eShSRUFEX0NBUEFDSVRZLCBjaGFubmVsKQorICAgIH0KKworICAgIC8vLyBDcmVhdGUgYSBgVEJ1ZmZlcmVkVHJhbnNwb3J0YCB3aXRoIGFuIGludGVybmFsIHJlYWQgYnVmZmVyIG9mIHNpemUKKyAgICAvLy8gYHJlYWRfY2FwYWNpdHlgIGFuZCBhbiBpbnRlcm5hbCB3cml0ZSBidWZmZXIgb2Ygc2l6ZQorICAgIC8vLyBgd3JpdGVfY2FwYWNpdHlgIHRoYXQgd3JhcHMgdGhlIGdpdmVuIGBUSW9DaGFubmVsYC4KKyAgICBwdWIgZm4gd2l0aF9jYXBhY2l0eShyZWFkX2NhcGFjaXR5OiB1c2l6ZSwgY2hhbm5lbDogQykgLT4gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDxDPiB7CisgICAgICAgIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQgeworICAgICAgICAgICAgYnVmOiB2ZWMhWzA7IHJlYWRfY2FwYWNpdHldLmludG9fYm94ZWRfc2xpY2UoKSwKKyAgICAgICAgICAgIHBvczogMCwKKyAgICAgICAgICAgIGNhcDogMCwKKyAgICAgICAgICAgIGNoYW46IGNoYW5uZWwsCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiBnZXRfYnl0ZXMoJm11dCBzZWxmKSAtPiBpbzo6UmVzdWx0PCZbdThdPiB7CisgICAgICAgIGlmIHNlbGYuY2FwIC0gc2VsZi5wb3MgPT0gMCB7CisgICAgICAgICAgICBzZWxmLnBvcyA9IDA7CisgICAgICAgICAgICBzZWxmLmNhcCA9IHNlbGYuY2hhbi5yZWFkKCZtdXQgc2VsZi5idWYpPzsKKyAgICAgICAgfQorCisgICAgICAgIE9rKCZzZWxmLmJ1ZltzZWxmLnBvcy4uc2VsZi5jYXBdKQorICAgIH0KKworICAgIGZuIGNvbnN1bWUoJm11dCBzZWxmLCBjb25zdW1lZDogdXNpemUpIHsKKyAgICAgICAgLy8gVE9ETzogd2FzIGEgYnVnIGhlcmUgKz0gPC0tIHRlc3Qgc29tZWhvdworICAgICAgICBzZWxmLnBvcyA9IGNtcDo6bWluKHNlbGYuY2FwLCBzZWxmLnBvcyArIGNvbnN1bWVkKTsKKyAgICB9Cit9CisKK2ltcGw8Qz4gUmVhZCBmb3IgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIGZuIHJlYWQoJm11dCBzZWxmLCBidWY6ICZtdXQgW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBsZXQgbXV0IGJ5dGVzX3JlYWQgPSAwOworCisgICAgICAgIGxvb3AgeworICAgICAgICAgICAgbGV0IG5yZWFkID0geworICAgICAgICAgICAgICAgIGxldCBhdmFpbF9ieXRlcyA9IHNlbGYuZ2V0X2J5dGVzKCk/OworICAgICAgICAgICAgICAgIGxldCBhdmFpbF9zcGFjZSA9IGJ1Zi5sZW4oKSAtIGJ5dGVzX3JlYWQ7CisgICAgICAgICAgICAgICAgbGV0IG5yZWFkID0gY21wOjptaW4oYXZhaWxfc3BhY2UsIGF2YWlsX2J5dGVzLmxlbigpKTsKKyAgICAgICAgICAgICAgICBidWZbYnl0ZXNfcmVhZC4uKGJ5dGVzX3JlYWQgKyBucmVhZCldLmNvcHlfZnJvbV9zbGljZSgmYXZhaWxfYnl0ZXNbLi5ucmVhZF0pOworICAgICAgICAgICAgICAgIG5yZWFkCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzZWxmLmNvbnN1bWUobnJlYWQpOworICAgICAgICAgICAgYnl0ZXNfcmVhZCArPSBucmVhZDsKKworICAgICAgICAgICAgaWYgYnl0ZXNfcmVhZCA9PSBidWYubGVuKCkgfHwgbnJlYWQgPT0gMCB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBPayhieXRlc19yZWFkKQorICAgIH0KK30KKworLy8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3Rvcnk7CisKK2ltcGwgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3RvcnkgeworICAgIHB1YiBmbiBuZXcoKSAtPiBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgICAgIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5IHt9CisgICAgfQorfQorCitpbXBsIFRSZWFkVHJhbnNwb3J0RmFjdG9yeSBmb3IgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydGAuCisgICAgZm4gY3JlYXRlKCZzZWxmLCBjaGFubmVsOiBCb3g8UmVhZCArIFNlbmQ+KSAtPiBCb3g8VFJlYWRUcmFuc3BvcnQgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6Om5ldyhjaGFubmVsKSkKKyAgICB9Cit9CisKKy8vLyBUcmFuc3BvcnQgdGhhdCB3cml0ZXMgbWVzc2FnZXMgdmlhIGFuIGludGVybmFsIGJ1ZmZlci4KKy8vLworLy8vIEEgYFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0YCBtYWludGFpbnMgYSBmaXhlZC1zaXplIGludGVybmFsIHdyaXRlIGJ1ZmZlci4KKy8vLyBBbGwgd3JpdGVzIGFyZSBtYWRlIHRvIHRoaXMgYnVmZmVyIGFuZCBhcmUgc2VudCB0byB0aGUgd3JhcHBlZCBjaGFubmVsIG9ubHkKKy8vLyB3aGVuIGBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6Zmx1c2goKWAgaXMgY2FsbGVkLiBPbiBhIGZsdXNoIGEgZml4ZWQtbGVuZ3RoCisvLy8gaGVhZGVyIHdpdGggYSBjb3VudCBvZiB0aGUgYnVmZmVyZWQgYnl0ZXMgaXMgd3JpdHRlbiwgZm9sbG93ZWQgYnkgdGhlIGJ5dGVzCisvLy8gdGhlbXNlbHZlcy4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0YC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSBzdGQ6OmlvOjpXcml0ZTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydCwgVFRjcENoYW5uZWx9OworLy8vCisvLy8gbGV0IG11dCBjID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGMub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgdCA9IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpuZXcoYyk7CisvLy8KKy8vLyB0LndyaXRlKCZbMHgwMF0pLnVud3JhcCgpOworLy8vIHQuZmx1c2goKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgYnVmOiBWZWM8dTg+LAorICAgIGNhcDogdXNpemUsCisgICAgY2hhbm5lbDogQywKK30KKworaW1wbDxDPiBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRCdWZmZXJlZFRyYW5zcG9ydGAgd2l0aCBkZWZhdWx0LXNpemVkIGludGVybmFsIHJlYWQgYW5kCisgICAgLy8vIHdyaXRlIGJ1ZmZlcnMgdGhhdCB3cmFwcyB0aGUgZ2l2ZW4gYFRJb0NoYW5uZWxgLgorICAgIHB1YiBmbiBuZXcoY2hhbm5lbDogQykgLT4gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ8Qz4geworICAgICAgICBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eShXUklURV9DQVBBQ0lUWSwgY2hhbm5lbCkKKyAgICB9CisKKyAgICAvLy8gQ3JlYXRlIGEgYFRCdWZmZXJlZFRyYW5zcG9ydGAgd2l0aCBhbiBpbnRlcm5hbCByZWFkIGJ1ZmZlciBvZiBzaXplCisgICAgLy8vIGByZWFkX2NhcGFjaXR5YCBhbmQgYW4gaW50ZXJuYWwgd3JpdGUgYnVmZmVyIG9mIHNpemUKKyAgICAvLy8gYHdyaXRlX2NhcGFjaXR5YCB0aGF0IHdyYXBzIHRoZSBnaXZlbiBgVElvQ2hhbm5lbGAuCisgICAgcHViIGZuIHdpdGhfY2FwYWNpdHkod3JpdGVfY2FwYWNpdHk6IHVzaXplLCBjaGFubmVsOiBDKSAtPiBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDxDPiB7CisgICAgICAgIGFzc2VydCEoCisgICAgICAgICAgICB3cml0ZV9jYXBhY2l0eSA+IDAsCisgICAgICAgICAgICAid3JpdGUgYnVmZmVyIHNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiCisgICAgICAgICk7CisKKyAgICAgICAgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQgeworICAgICAgICAgICAgYnVmOiBWZWM6OndpdGhfY2FwYWNpdHkod3JpdGVfY2FwYWNpdHkpLAorICAgICAgICAgICAgY2FwOiB3cml0ZV9jYXBhY2l0eSwKKyAgICAgICAgICAgIGNoYW5uZWw6IGNoYW5uZWwsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGw8Qz4gV3JpdGUgZm9yIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIGZuIHdyaXRlKCZtdXQgc2VsZiwgYnVmOiAmW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBpZiAhYnVmLmlzX2VtcHR5KCkgeworICAgICAgICAgICAgbGV0IG11dCBhdmFpbF9ieXRlczsKKworICAgICAgICAgICAgbG9vcCB7CisgICAgICAgICAgICAgICAgYXZhaWxfYnl0ZXMgPSBjbXA6Om1pbihidWYubGVuKCksIHNlbGYuY2FwIC0gc2VsZi5idWYubGVuKCkpOworCisgICAgICAgICAgICAgICAgaWYgYXZhaWxfYnl0ZXMgPT0gMCB7CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmx1c2goKT87CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZXQgYXZhaWxfYnl0ZXMgPSBhdmFpbF9ieXRlczsKKworICAgICAgICAgICAgc2VsZi5idWYuZXh0ZW5kX2Zyb21fc2xpY2UoJmJ1ZlsuLmF2YWlsX2J5dGVzXSk7CisgICAgICAgICAgICBhc3NlcnQhKHNlbGYuYnVmLmxlbigpIDw9IHNlbGYuY2FwLCAiY29weSBvdmVyZmxvd2VkIGJ1ZmZlciIpOworCisgICAgICAgICAgICBPayhhdmFpbF9ieXRlcykKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9rKDApCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IGlvOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5jaGFubmVsLndyaXRlX2FsbCgmc2VsZi5idWYpPzsKKyAgICAgICAgc2VsZi5jaGFubmVsLmZsdXNoKCk/OworICAgICAgICBzZWxmLmJ1Zi5jbGVhcigpOworICAgICAgICBPaygoKSkKKyAgICB9Cit9CisKKy8vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0YC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydEZhY3Rvcnk7CisKK2ltcGwgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICBwdWIgZm4gbmV3KCkgLT4gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAgICAgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHt9CisgICAgfQorfQorCitpbXBsIFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgZm9yIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydGAuCisgICAgZm4gY3JlYXRlKCZzZWxmLCBjaGFubmVsOiBCb3g8V3JpdGUgKyBTZW5kPikgLT4gQm94PFRXcml0ZVRyYW5zcG9ydCArIFNlbmQ+IHsKKyAgICAgICAgQm94OjpuZXcoVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhjaGFubmVsKSkKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3RkOjppbzo6e1JlYWQsIFdyaXRlfTsKKworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgdHJhbnNwb3J0OjpUQnVmZmVyQ2hhbm5lbDsKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JldHVybl96ZXJvX2lmX3JlYWRfYnVmZmVyX2lzX2VtcHR5KCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDApOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDEwLCBtZW0pOworCisgICAgICAgIGxldCBtdXQgYiA9IHZlYyFbMDsgMTBdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBiKTsKKworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAwKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZXR1cm5femVyb19pZl9jYWxsZXJfcmVhZHNfaW50b196ZXJvX2NhcGFjaXR5X2J1ZmZlcigpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgxMCwgbWVtKTsKKworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBbXSk7CisKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmV0dXJuX3plcm9faWZfbm90aGluZ19tb3JlX2Nhbl9iZV9yZWFkKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoNCwgMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoNCwgbWVtKTsKKworICAgICAgICB0LmNoYW4uc2V0X3JlYWRhYmxlX2J5dGVzKCZbMCwgMSwgMiwgM10pOworCisgICAgICAgIC8vIHJlYWQgYnVmZmVyIGlzIGV4YWN0bHkgdGhlIHNhbWUgc2l6ZSBhcyBieXRlcyBhdmFpbGFibGUKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzB1ODsgNF07CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IGJ1Zik7CisKKyAgICAgICAgLy8gd2UndmUgcmVhZCBleGFjdGx5IDQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgNCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZiwgJlswLCAxLCAyLCAzXSk7CisKKyAgICAgICAgLy8gdHJ5IHJlYWQgYWdhaW4KKyAgICAgICAgbGV0IGJ1Zl9hZ2FpbiA9IHZlYyFbMHU4OyA0XTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgYnVmKTsKKworICAgICAgICAvLyB0aGlzIHRpbWUsIDAgYnl0ZXMgYW5kIHdlIGhhdmVuJ3QgY2hhbmdlZCB0aGUgYnVmZmVyCisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDApOworICAgICAgICBhc3NlcnRfZXEhKCZidWZfYWdhaW4sICZbMCwgMCwgMCwgMF0pCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfZmlsbF91c2VyX2J1ZmZlcl93aXRoX29ubHlfYXNfbWFueV9ieXRlc19hc19hdmFpbGFibGUoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSg0LCAwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSg0LCBtZW0pOworCisgICAgICAgIHQuY2hhbi5zZXRfcmVhZGFibGVfYnl0ZXMoJlswLCAxLCAyLCAzXSk7CisKKyAgICAgICAgLy8gcmVhZCBidWZmZXIgaXMgbXVjaCBsYXJnZXIgdGhhbiB0aGUgYnl0ZXMgYXZhaWxhYmxlCisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IDhdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBidWYpOworCisgICAgICAgIC8vIHdlJ3ZlIHJlYWQgZXhhY3RseSA0IGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDQpOworICAgICAgICBhc3NlcnRfZXEhKCZidWZbLi40XSwgJlswLCAxLCAyLCAzXSk7CisKKyAgICAgICAgLy8gdHJ5IHJlYWQgYWdhaW4KKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgYnVmWzQuLl0pOworCisgICAgICAgIC8vIHRoaXMgdGltZSwgMCBieXRlcyBhbmQgd2UgaGF2ZW4ndCBjaGFuZ2VkIHRoZSBidWZmZXIKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZiwgJlswLCAxLCAyLCAzLCAwLCAwLCAwLCAwXSkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX3N1Y2Nlc3NmdWxseSgpIHsKKyAgICAgICAgLy8gdGhpcyB0ZXN0IGludm9sdmVzIGEgZmV3IGxvb3BzIHdpdGhpbiB0aGUgYnVmZmVyZWQgdHJhbnNwb3J0CisgICAgICAgIC8vIGl0c2VsZiB3aGVyZSBpdCBoYXMgdG8gZHJhaW4gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGluIG9yZGVyCisgICAgICAgIC8vIHRvIHNlcnZpY2UgYSByZWFkCisKKyAgICAgICAgLy8gd2UgaGF2ZSBhIG11Y2ggc21hbGxlciBidWZmZXIgdGhhbiB0aGUKKyAgICAgICAgLy8gdW5kZXJseWluZyB0cmFuc3BvcnQgaGFzIGJ5dGVzIGF2YWlsYWJsZQorICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDApOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDIsIG1lbSk7CisKKyAgICAgICAgLy8gZmlsbCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQncyBieXRlIGJ1ZmZlcgorICAgICAgICBsZXQgbXV0IHJlYWRhYmxlX2J5dGVzID0gWzB1ODsgMTBdOworICAgICAgICBmb3IgaSBpbiAwLi4xMCB7CisgICAgICAgICAgICByZWFkYWJsZV9ieXRlc1tpXSA9IGkgYXMgdTg7CisgICAgICAgIH0KKworICAgICAgICB0LmNoYW4uc2V0X3JlYWRhYmxlX2J5dGVzKCZyZWFkYWJsZV9ieXRlcyk7CisKKyAgICAgICAgLy8gd2UgYXNrIHRvIHJlYWQgaW50byBhIGJ1ZmZlciB0aGF0J3MgbXVjaCBsYXJnZXIKKyAgICAgICAgLy8gdGhhbiB0aGUgb25lIHRoZSBidWZmZXJlZCB0cmFuc3BvcnQgaGFzOyBhcyBhIHJlc3VsdAorICAgICAgICAvLyBpdCdzIGdvaW5nIHRvIGhhdmUgdG8ga2VlcCBhc2tpbmcgdGhlIHVuZGVybHlpbmcKKyAgICAgICAgLy8gdHJhbnNwb3J0IGZvciBtb3JlIGJ5dGVzCisgICAgICAgIGxldCBtdXQgYnVmID0gWzB1ODsgOF07CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IGJ1Zik7CisKKyAgICAgICAgLy8gd2Ugc2hvdWxkIGhhdmUgcmVhZCA4IGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDgpOworICAgICAgICBhc3NlcnRfZXEhKCZidWYsICZbMCwgMSwgMiwgMywgNCwgNSwgNiwgN10pOworCisgICAgICAgIC8vIGxldCdzIGNsZWFyIG91dCB0aGUgYnVmZmVyIGFuZCB0cnkgcmVhZCBhZ2FpbgorICAgICAgICBmb3IgaSBpbiAwLi44IHsKKyAgICAgICAgICAgIGJ1ZltpXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgYnVmKTsKKworICAgICAgICAvLyB0aGlzIHRpbWUgd2Ugd2VyZSBvbmx5IGFibGUgdG8gcmVhZCAyIGJ5dGVzCisgICAgICAgIC8vIChhbGwgdGhhdCdzIHJlbWFpbmluZyBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCkKKyAgICAgICAgLy8gbGV0J3MgYWxzbyBjaGVjayB0aGF0IHRoZSByZW1haW5pbmcgYnl0ZXMgYXJlIHVudG91Y2hlZAorICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAyKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWzAuLjJdLCAmWzgsIDldKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWzIuLl0sICZbMCwgMCwgMCwgMCwgMCwgMF0pOworCisgICAgICAgIC8vIHRyeSByZWFkIGFnYWluICh3ZSBzaG91bGQgZ2V0IDApCisgICAgICAgIC8vIGFuZCBhbGwgdGhlIGV4aXN0aW5nIGJ5dGVzIHdlcmUgdW50b3VjaGVkCisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IGJ1Zik7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDApOworICAgICAgICBhc3NlcnRfZXEhKCZidWZbMC4uMl0sICZbOCwgOV0pOworICAgICAgICBhc3NlcnRfZXEhKCZidWZbMi4uXSwgJlswLCAwLCAwLCAwLCAwLCAwXSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmV0dXJuX2Vycm9yX3doZW5fbm90aGluZ19jYW5fYmVfd3JpdHRlbl90b191bmRlcmx5aW5nX2NoYW5uZWwoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMSwgbWVtKTsKKworICAgICAgICBsZXQgYiA9IHZlYyFbMDsgMTBdOworICAgICAgICBsZXQgciA9IHQud3JpdGUoJmIpOworCisgICAgICAgIC8vIHNob3VsZCBoYXZlIHdyaXR0ZW4gMSBieXRlCisgICAgICAgIGFzc2VydF9lcSEoci51bndyYXAoKSwgMSk7CisKKyAgICAgICAgLy8gbGV0J3MgdHJ5IGFnYWluLi4uCisgICAgICAgIGxldCByID0gdC53cml0ZSgmYlsxLi5dKTsKKworICAgICAgICAvLyB0aGlzIHRpbWUgd2UnbGwgZXJyb3Igb3V0IGJlY2F1c2UgdGhlIGF1dG8tZmx1c2ggZmFpbGVkCisgICAgICAgIGFzc2VydCEoci5pc19lcnIoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmV0dXJuX3plcm9faWZfY2FsbGVyX2NhbGxzX3dyaXRlX3dpdGhfZW1wdHlfYnVmZmVyKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMTApOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgxMCwgbWVtKTsKKworICAgICAgICBsZXQgciA9IHQud3JpdGUoJltdKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDBdID0gW107CisKKyAgICAgICAgYXNzZXJ0X2VxIShyLnVud3JhcCgpLCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYXV0b19mbHVzaF9pZl93cml0ZV9idWZmZXJfZnVsbCgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDgpOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSg0LCBtZW0pOworCisgICAgICAgIGxldCBiMCA9IFsweDAwLCAweDAxLCAweDAyLCAweDAzXTsKKyAgICAgICAgbGV0IGIxID0gWzB4MDQsIDB4MDUsIDB4MDYsIDB4MDddOworCisgICAgICAgIC8vIHdyaXRlIHRoZSBmaXJzdCA0IGJ5dGVzOyB3ZSd2ZSBub3cgZmlsbGVkIHRoZSB0cmFuc3BvcnQncyB3cml0ZSBidWZmZXIKKyAgICAgICAgbGV0IHIgPSB0LndyaXRlKCZiMCk7CisgICAgICAgIGFzc2VydF9lcSEoci51bndyYXAoKSwgNCk7CisKKyAgICAgICAgLy8gdHJ5IHdyaXRlIHRoZSBuZXh0IDQgYnl0ZXM7IHRoaXMgY2F1c2VzIHRoZSB0cmFuc3BvcnQgdG8gYXV0by1mbHVzaCB0aGUgZmlyc3QgNCBieXRlcworICAgICAgICBsZXQgciA9IHQud3JpdGUoJmIxKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyLnVud3JhcCgpLCA0KTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IGluIHdyaXRpbmcgdGhlIHNlY29uZCA0IGJ5dGVzIHdlIGF1dG8tZmx1c2hlZCB0aGUgZmlyc3QgNCBieXRlcworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X251bV93cml0dGVuX2J5dGVzISh0LCA0KTsKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBiMCk7CisgICAgICAgIHQuY2hhbm5lbC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKworICAgICAgICAvLyBub3cgZmx1c2ggdGhlIHRyYW5zcG9ydCB0byBwdXNoIHRoZSBzZWNvbmQgNCBieXRlcyB0byB0aGUgdW5kZXJseWluZyBjaGFubmVsCisgICAgICAgIGFzc2VydCEodC5mbHVzaCgpLmlzX29rKCkpOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgd2Ugd3JvdGUgb3V0IHRoZSBzZWNvbmQgNCBieXRlcworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGIxKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV90b19pbm5lcl90cmFuc3BvcnRfb25fZmx1c2goKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMCwgMTApOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6bmV3KG1lbSk7CisKKyAgICAgICAgbGV0IGI6IFt1ODsgNV0gPSBbMCwgMSwgMiwgMywgNF07CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmYikudW53cmFwKCksIDUpOworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X251bV93cml0dGVuX2J5dGVzISh0LCAwKTsKKworICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGIpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N1Y2Nlc3NmdWxseV9hZnRlcl9mbHVzaCgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDUpOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSg1LCBtZW0pOworCisgICAgICAgIC8vIHdyaXRlIGFuZCBmbHVzaAorICAgICAgICBsZXQgYjogW3U4OyA1XSA9IFswLCAxLCAyLCAzLCA0XTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZiKS51bndyYXAoKSwgNSk7CisgICAgICAgIGFzc2VydCEodC5mbHVzaCgpLmlzX29rKCkpOworCisgICAgICAgIC8vIGNoZWNrIHRoZSBmbHVzaGVkIGJ5dGVzCisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgYik7CisKKyAgICAgICAgLy8gcmVzZXQgb3VyIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICAgIHQuY2hhbm5lbC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKworICAgICAgICAvLyB3cml0ZSBhbmQgZmx1c2ggYWdhaW4KKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZiKS51bndyYXAoKSwgNSk7CisgICAgICAgIGFzc2VydCEodC5mbHVzaCgpLmlzX29rKCkpOworCisgICAgICAgIC8vIGNoZWNrIHRoZSBmbHVzaGVkIGJ5dGVzCisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgYik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy90cmFuc3BvcnQvZnJhbWVkLnJzIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvZnJhbWVkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMDkzMDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9mcmFtZWQucnMKQEAgLTAsMCArMSw0NTkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIGJ5dGVvcmRlcjo6e0JpZ0VuZGlhbiwgUmVhZEJ5dGVzRXh0LCBXcml0ZUJ5dGVzRXh0fTsKK3VzZSBzdGQ6OmNtcDsKK3VzZSBzdGQ6OmlvOwordXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07CisKK3VzZSBzdXBlcjo6e1RSZWFkVHJhbnNwb3J0LCBUUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRXcml0ZVRyYW5zcG9ydCwgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeX07CisKKy8vLyBEZWZhdWx0IGNhcGFjaXR5IG9mIHRoZSByZWFkIGJ1ZmZlciBpbiBieXRlcy4KK2NvbnN0IFJFQURfQ0FQQUNJVFk6IHVzaXplID0gNDA5NjsKKworLy8vIERlZmF1bHQgY2FwYWNpdHkgb2YgdGhlIHdyaXRlIGJ1ZmZlciBpbiBieXRlcy4KK2NvbnN0IFdSSVRFX0NBUEFDSVRZOiB1c2l6ZSA9IDQwOTY7CisKKy8vLyBUcmFuc3BvcnQgdGhhdCByZWFkcyBmcmFtZWQgbWVzc2FnZXMuCisvLy8KKy8vLyBBIGBURnJhbWVkUmVhZFRyYW5zcG9ydGAgbWFpbnRhaW5zIGEgZml4ZWQtc2l6ZSBpbnRlcm5hbCByZWFkIGJ1ZmZlci4KKy8vLyBPbiBhIGNhbGwgdG8gYFRGcmFtZWRSZWFkVHJhbnNwb3J0OjpyZWFkKC4uLilgIG9uZSBmdWxsIG1lc3NhZ2UgLSBib3RoCisvLy8gZml4ZWQtbGVuZ3RoIGhlYWRlciBhbmQgYnl0ZXMgLSBpcyByZWFkIGZyb20gdGhlIHdyYXBwZWQgY2hhbm5lbCBhbmQKKy8vLyBidWZmZXJlZC4gU3Vic2VxdWVudCByZWFkIGNhbGxzIGFyZSBzZXJ2aWNlZCBmcm9tIHRoZSBpbnRlcm5hbCBidWZmZXIKKy8vLyB1bnRpbCBpdCBpcyBleGhhdXN0ZWQsIGF0IHdoaWNoIHBvaW50IHRoZSBuZXh0IGZ1bGwgbWVzc2FnZSBpcyByZWFkCisvLy8gZnJvbSB0aGUgd3JhcHBlZCBjaGFubmVsLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVEZyYW1lZFJlYWRUcmFuc3BvcnRgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHN0ZDo6aW86OlJlYWQ7CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VEZyYW1lZFJlYWRUcmFuc3BvcnQsIFRUY3BDaGFubmVsfTsKKy8vLworLy8vIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHQgPSBURnJhbWVkUmVhZFRyYW5zcG9ydDo6bmV3KGMpOworLy8vCisvLy8gdC5yZWFkKCZtdXQgdmVjIVswdTg7IDFdKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVEZyYW1lZFJlYWRUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICBidWY6IFZlYzx1OD4sCisgICAgcG9zOiB1c2l6ZSwKKyAgICBjYXA6IHVzaXplLAorICAgIGNoYW46IEMsCit9CisKK2ltcGw8Qz4gVEZyYW1lZFJlYWRUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRGcmFtZWRSZWFkVHJhbnNwb3J0YCB3aXRoIGEgZGVmYXVsdC1zaXplZAorICAgIC8vLyBpbnRlcm5hbCByZWFkIGJ1ZmZlciB0aGF0IHdyYXBzIHRoZSBnaXZlbiBgVElvQ2hhbm5lbGAuCisgICAgcHViIGZuIG5ldyhjaGFubmVsOiBDKSAtPiBURnJhbWVkUmVhZFRyYW5zcG9ydDxDPiB7CisgICAgICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KFJFQURfQ0FQQUNJVFksIGNoYW5uZWwpCisgICAgfQorCisgICAgLy8vIENyZWF0ZSBhIGBURnJhbWVkVHJhbnNwb3J0YCB3aXRoIGFuIGludGVybmFsIHJlYWQgYnVmZmVyCisgICAgLy8vIG9mIHNpemUgYHJlYWRfY2FwYWNpdHlgIHRoYXQgd3JhcHMgdGhlIGdpdmVuIGBUSW9DaGFubmVsYC4KKyAgICBwdWIgZm4gd2l0aF9jYXBhY2l0eShyZWFkX2NhcGFjaXR5OiB1c2l6ZSwgY2hhbm5lbDogQykgLT4gVEZyYW1lZFJlYWRUcmFuc3BvcnQ8Qz4geworICAgICAgICBURnJhbWVkUmVhZFRyYW5zcG9ydCB7CisgICAgICAgICAgICBidWY6IHZlYyFbMDsgcmVhZF9jYXBhY2l0eV0sIC8vIEZJWE1FOiBkbyBJIGFjdHVhbGx5IGhhdmUgdG8gZG8gdGhpcz8KKyAgICAgICAgICAgIHBvczogMCwKKyAgICAgICAgICAgIGNhcDogMCwKKyAgICAgICAgICAgIGNoYW46IGNoYW5uZWwsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGw8Qz4gUmVhZCBmb3IgVEZyYW1lZFJlYWRUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICBmbiByZWFkKCZtdXQgc2VsZiwgYjogJm11dCBbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIGlmIHNlbGYuY2FwIC0gc2VsZi5wb3MgPT0gMCB7CisgICAgICAgICAgICBsZXQgbWVzc2FnZV9zaXplID0gc2VsZi5jaGFuLnJlYWRfaTMyOjo8QmlnRW5kaWFuPigpPyBhcyB1c2l6ZTsKKworICAgICAgICAgICAgbGV0IGJ1Zl9jYXBhY2l0eSA9IGNtcDo6bWF4KG1lc3NhZ2Vfc2l6ZSwgUkVBRF9DQVBBQ0lUWSk7CisgICAgICAgICAgICBzZWxmLmJ1Zi5yZXNpemUoYnVmX2NhcGFjaXR5LCAwKTsKKworICAgICAgICAgICAgc2VsZi5jaGFuLnJlYWRfZXhhY3QoJm11dCBzZWxmLmJ1ZlsuLm1lc3NhZ2Vfc2l6ZV0pPzsKKyAgICAgICAgICAgIHNlbGYuY2FwID0gbWVzc2FnZV9zaXplIGFzIHVzaXplOworICAgICAgICAgICAgc2VsZi5wb3MgPSAwOworICAgICAgICB9CisKKyAgICAgICAgbGV0IG5yZWFkID0gY21wOjptaW4oYi5sZW4oKSwgc2VsZi5jYXAgLSBzZWxmLnBvcyk7CisgICAgICAgIGJbLi5ucmVhZF0uY2xvbmVfZnJvbV9zbGljZSgmc2VsZi5idWZbc2VsZi5wb3MuLnNlbGYucG9zICsgbnJlYWRdKTsKKyAgICAgICAgc2VsZi5wb3MgKz0gbnJlYWQ7CisKKyAgICAgICAgT2sobnJlYWQpCisgICAgfQorfQorCisvLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIGBURnJhbWVkUmVhZFRyYW5zcG9ydGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5OworCitpbXBsIFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgcHViIGZuIG5ldygpIC0+IFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7fQorICAgIH0KK30KKworaW1wbCBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgZm9yIFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBURnJhbWVkUmVhZFRyYW5zcG9ydGAuCisgICAgZm4gY3JlYXRlKCZzZWxmLCBjaGFubmVsOiBCb3g8UmVhZCArIFNlbmQ+KSAtPiBCb3g8VFJlYWRUcmFuc3BvcnQgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRGcmFtZWRSZWFkVHJhbnNwb3J0OjpuZXcoY2hhbm5lbCkpCisgICAgfQorfQorCisvLy8gVHJhbnNwb3J0IHRoYXQgd3JpdGVzIGZyYW1lZCBtZXNzYWdlcy4KKy8vLworLy8vIEEgYFRGcmFtZWRXcml0ZVRyYW5zcG9ydGAgbWFpbnRhaW5zIGEgZml4ZWQtc2l6ZSBpbnRlcm5hbCB3cml0ZSBidWZmZXIuIEFsbAorLy8vIHdyaXRlcyBhcmUgbWFkZSB0byB0aGlzIGJ1ZmZlciBhbmQgYXJlIHNlbnQgdG8gdGhlIHdyYXBwZWQgY2hhbm5lbCBvbmx5CisvLy8gd2hlbiBgVEZyYW1lZFdyaXRlVHJhbnNwb3J0OjpmbHVzaCgpYCBpcyBjYWxsZWQuIE9uIGEgZmx1c2ggYSBmaXhlZC1sZW5ndGgKKy8vLyBoZWFkZXIgd2l0aCBhIGNvdW50IG9mIHRoZSBidWZmZXJlZCBieXRlcyBpcyB3cml0dGVuLCBmb2xsb3dlZCBieSB0aGUgYnl0ZXMKKy8vLyB0aGVtc2VsdmVzLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVEZyYW1lZFdyaXRlVHJhbnNwb3J0YC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSBzdGQ6OmlvOjpXcml0ZTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntURnJhbWVkV3JpdGVUcmFuc3BvcnQsIFRUY3BDaGFubmVsfTsKKy8vLworLy8vIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHQgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhjKTsKKy8vLworLy8vIHQud3JpdGUoJlsweDAwXSkudW53cmFwKCk7CisvLy8gdC5mbHVzaCgpLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBURnJhbWVkV3JpdGVUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgYnVmOiBWZWM8dTg+LAorICAgIGNoYW5uZWw6IEMsCit9CisKK2ltcGw8Qz4gVEZyYW1lZFdyaXRlVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIC8vLyBDcmVhdGUgYSBgVEZyYW1lZFdyaXRlVHJhbnNwb3J0YCB3aXRoIGRlZmF1bHQtc2l6ZWQgaW50ZXJuYWwKKyAgICAvLy8gd3JpdGUgYnVmZmVyIHRoYXQgd3JhcHMgdGhlIGdpdmVuIGBUSW9DaGFubmVsYC4KKyAgICBwdWIgZm4gbmV3KGNoYW5uZWw6IEMpIC0+IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDxDPiB7CisgICAgICAgIFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eShXUklURV9DQVBBQ0lUWSwgY2hhbm5lbCkKKyAgICB9CisKKyAgICAvLy8gQ3JlYXRlIGEgYFRGcmFtZWRXcml0ZVRyYW5zcG9ydGAgd2l0aCBhbiBpbnRlcm5hbCB3cml0ZSBidWZmZXIKKyAgICAvLy8gb2Ygc2l6ZSBgd3JpdGVfY2FwYWNpdHlgIHRoYXQgd3JhcHMgdGhlIGdpdmVuIGBUSW9DaGFubmVsYC4KKyAgICBwdWIgZm4gd2l0aF9jYXBhY2l0eSh3cml0ZV9jYXBhY2l0eTogdXNpemUsIGNoYW5uZWw6IEMpIC0+IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDxDPiB7CisgICAgICAgIFRGcmFtZWRXcml0ZVRyYW5zcG9ydCB7CisgICAgICAgICAgICBidWY6IFZlYzo6d2l0aF9jYXBhY2l0eSh3cml0ZV9jYXBhY2l0eSksCisgICAgICAgICAgICBjaGFubmVsLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsPEM+IFdyaXRlIGZvciBURnJhbWVkV3JpdGVUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgZm4gd3JpdGUoJm11dCBzZWxmLCBiOiAmW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBsZXQgY3VycmVudF9jYXBhY2l0eSA9IHNlbGYuYnVmLmNhcGFjaXR5KCk7CisgICAgICAgIGxldCBhdmFpbGFibGVfc3BhY2UgPSBjdXJyZW50X2NhcGFjaXR5IC0gc2VsZi5idWYubGVuKCk7CisgICAgICAgIGlmIGIubGVuKCkgPiBhdmFpbGFibGVfc3BhY2UgeworICAgICAgICAgICAgbGV0IGFkZGl0aW9uYWxfc3BhY2UgPSBjbXA6Om1heChiLmxlbigpIC0gYXZhaWxhYmxlX3NwYWNlLCBjdXJyZW50X2NhcGFjaXR5KTsKKyAgICAgICAgICAgIHNlbGYuYnVmLnJlc2VydmUoYWRkaXRpb25hbF9zcGFjZSk7CisgICAgICAgIH0KKworICAgICAgICBzZWxmLmJ1Zi5leHRlbmRfZnJvbV9zbGljZShiKTsKKyAgICAgICAgT2soYi5sZW4oKSkKKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IGlvOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IG1lc3NhZ2Vfc2l6ZSA9IHNlbGYuYnVmLmxlbigpOworCisgICAgICAgIGlmIGxldCAwID0gbWVzc2FnZV9zaXplIHsKKyAgICAgICAgICAgIHJldHVybiBPaygoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmLmNoYW5uZWwud3JpdGVfaTMyOjo8QmlnRW5kaWFuPihtZXNzYWdlX3NpemUgYXMgaTMyKT87CisgICAgICAgIH0KKworICAgICAgICAvLyB3aWxsIHNwaW4gaWYgdGhlIHVuZGVybHlpbmcgY2hhbm5lbCBjYW4ndCBiZSB3cml0dGVuIHRvCisgICAgICAgIGxldCBtdXQgYnl0ZV9pbmRleCA9IDA7CisgICAgICAgIHdoaWxlIGJ5dGVfaW5kZXggPCBtZXNzYWdlX3NpemUgeworICAgICAgICAgICAgbGV0IG53cml0ZSA9IHNlbGYuY2hhbm5lbC53cml0ZSgmc2VsZi5idWZbYnl0ZV9pbmRleC4ubWVzc2FnZV9zaXplXSk/OworICAgICAgICAgICAgYnl0ZV9pbmRleCA9IGNtcDo6bWluKGJ5dGVfaW5kZXggKyBud3JpdGUsIG1lc3NhZ2Vfc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBsZXQgYnVmX2NhcGFjaXR5ID0gY21wOjptaW4oc2VsZi5idWYuY2FwYWNpdHkoKSwgV1JJVEVfQ0FQQUNJVFkpOworICAgICAgICBzZWxmLmJ1Zi5yZXNpemUoYnVmX2NhcGFjaXR5LCAwKTsKKyAgICAgICAgc2VsZi5idWYuY2xlYXIoKTsKKworICAgICAgICBzZWxmLmNoYW5uZWwuZmx1c2goKQorICAgIH0KK30KKworLy8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBgVEZyYW1lZFdyaXRlVHJhbnNwb3J0YC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5OworCitpbXBsIFRGcmFtZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgeworICAgIHB1YiBmbiBuZXcoKSAtPiBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAgICAgVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7fQorICAgIH0KK30KKworaW1wbCBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5IGZvciBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRGcmFtZWRXcml0ZVRyYW5zcG9ydGAuCisgICAgZm4gY3JlYXRlKCZzZWxmLCBjaGFubmVsOiBCb3g8V3JpdGUgKyBTZW5kPikgLT4gQm94PFRXcml0ZVRyYW5zcG9ydCArIFNlbmQ+IHsKKyAgICAgICAgQm94OjpuZXcoVEZyYW1lZFdyaXRlVHJhbnNwb3J0OjpuZXcoY2hhbm5lbCkpCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSB0cmFuc3BvcnQ6Om1lbTo6VEJ1ZmZlckNoYW5uZWw7CisKKyAgICAvLyBGSVhNRTogdGVzdCBhIGZvcmNlZCByZXNlcnZlCisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX21lc3NhZ2Vfc21hbGxlcl90aGFuX2luaXRpYWxfYnVmZmVyX3NpemUoKSB7CisgICAgICAgIGxldCBjID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDEwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoOCwgYyk7CisKKyAgICAgICAgdC5jaGFuLnNldF9yZWFkYWJsZV9ieXRlcygmWworICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgLyogbWVzc2FnZSBzaXplICovCisgICAgICAgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAvKiBtZXNzYWdlIGJvZHkgKi8KKyAgICAgICAgXSk7CisKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzA7IDhdOworCisgICAgICAgIC8vIHdlJ3ZlIHJlYWQgZXhhY3RseSA0IGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkKCZtdXQgYnVmKS51bndyYXAoKSwgNCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZlsuLjRdLCAmWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX21lc3NhZ2VfZ3JlYXRlcl90aGFuX2luaXRpYWxfYnVmZmVyX3NpemUoKSB7CisgICAgICAgIGxldCBjID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDEwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMiwgYyk7CisKKyAgICAgICAgdC5jaGFuLnNldF9yZWFkYWJsZV9ieXRlcygmWworICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgLyogbWVzc2FnZSBzaXplICovCisgICAgICAgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAvKiBtZXNzYWdlIGJvZHkgKi8KKyAgICAgICAgXSk7CisKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzA7IDhdOworCisgICAgICAgIC8vIHdlJ3ZlIHJlYWQgZXhhY3RseSA0IGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkKCZtdXQgYnVmKS51bndyYXAoKSwgNCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZlsuLjRdLCAmWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX211bHRpcGxlX21lc3NhZ2VzX2luX3NlcXVlbmNlX2NvcnJlY3RseSgpIHsKKyAgICAgICAgbGV0IGMgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMCwgMTApOworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgyLCBjKTsKKworICAgICAgICAvLworICAgICAgICAvLyAxc3QgbWVzc2FnZQorICAgICAgICAvLworCisgICAgICAgIHQuY2hhbi5zZXRfcmVhZGFibGVfYnl0ZXMoJlsKKyAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIC8qIG1lc3NhZ2Ugc2l6ZSAqLworICAgICAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgLyogbWVzc2FnZSBib2R5ICovCisgICAgICAgIF0pOworCisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswOyA4XTsKKworICAgICAgICAvLyB3ZSd2ZSByZWFkIGV4YWN0bHkgNCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZCgmbXV0IGJ1ZikudW53cmFwKCksIDQpOworICAgICAgICBhc3NlcnRfZXEhKCZidWYsICZbMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pOworCisgICAgICAgIC8vCisgICAgICAgIC8vIDJuZCBtZXNzYWdlCisgICAgICAgIC8vCisKKyAgICAgICAgdC5jaGFuLnNldF9yZWFkYWJsZV9ieXRlcygmWworICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgLyogbWVzc2FnZSBzaXplICovCisgICAgICAgICAgICAweDA0LCAvKiBtZXNzYWdlIGJvZHkgKi8KKyAgICAgICAgXSk7CisKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzA7IDhdOworCisgICAgICAgIC8vIHdlJ3ZlIHJlYWQgZXhhY3RseSAxIGJ5dGUKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWQoJm11dCBidWYpLnVud3JhcCgpLCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmLCAmWzB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tZXNzYWdlX3NtYWxsZXJfdGhhbl9idWZmZXJfc2l6ZSgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDApOworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMjAsIG1lbSk7CisKKyAgICAgICAgbGV0IGIgPSB2ZWMhWzA7IDEwXTsKKworICAgICAgICAvLyBzaG91bGQgaGF2ZSB3cml0dGVuIDEwIGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmYikudW53cmFwKCksIDEwKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZXR1cm5femVyb19pZl9jYWxsZXJfY2FsbHNfd3JpdGVfd2l0aF9lbXB0eV9idWZmZXIoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAxMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgxMCwgbWVtKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMF0gPSBbXTsKKworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJltdKS51bndyYXAoKSwgMCk7CisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3RvX2lubmVyX3RyYW5zcG9ydF9vbl9mbHVzaCgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAxMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6bmV3KG1lbSk7CisKKyAgICAgICAgbGV0IGI6IFt1ODsgNV0gPSBbMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNF07CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmYikudW53cmFwKCksIDUpOworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X251bV93cml0dGVuX2J5dGVzISh0LCAwKTsKKworICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWRfYnl0ZXMgPSBbCisgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDA1LCAvKiBtZXNzYWdlIHNpemUgKi8KKyAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIC8qIG1lc3NhZ2UgYm9keSAqLworICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgZXhwZWN0ZWRfYnl0ZXMpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21lc3NhZ2VfZ3JlYXRlcl90aGFuX2J1ZmZlcl9zaXplXzAwKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMTApOworCisgICAgICAgIC8vIElNUE9SVEFOVDogRE8gKipOT1QqKiBDSEFOR0UgVEhFIFdSSVRFX0NBUEFDSVRZIE9SIFRIRSBOVU1CRVIgT0YgQllURVMgVE8gQkUgV1JJVFRFTiEKKyAgICAgICAgLy8gdGhlc2UgbGVuZ3RocyB3ZXJlIGNob3NlbiB0byBiZSBqdXN0IGxvbmcgZW5vdWdoCisgICAgICAgIC8vIHRoYXQgZG91YmxpbmcgdGhlIGNhcGFjaXR5IGlzIGEgKip3b3JzZSoqIGNob2ljZSB0aGFuCisgICAgICAgIC8vIHNpbXBseSByZXNpemluZyB0aGUgYnVmZmVyIHRvIGIubGVuKCkKKworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMSwgbWVtKTsKKyAgICAgICAgbGV0IGIgPSBbMHgwMCwgMHgwMSwgMHgwMl07CisKKyAgICAgICAgLy8gc2hvdWxkIGhhdmUgd3JpdHRlbiAzIGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmYikudW53cmFwKCksIDMpOworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X251bV93cml0dGVuX2J5dGVzISh0LCAwKTsKKworICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWRfYnl0ZXMgPSBbCisgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAzLCAvKiBtZXNzYWdlIHNpemUgKi8KKyAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIC8qIG1lc3NhZ2UgYm9keSAqLworICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgZXhwZWN0ZWRfYnl0ZXMpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21lc3NhZ2VfZ3JlYXRlcl90aGFuX2J1ZmZlcl9zaXplXzAxKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMTApOworCisgICAgICAgIC8vIElNUE9SVEFOVDogRE8gKipOT1QqKiBDSEFOR0UgVEhFIFdSSVRFX0NBUEFDSVRZIE9SIFRIRSBOVU1CRVIgT0YgQllURVMgVE8gQkUgV1JJVFRFTiEKKyAgICAgICAgLy8gdGhlc2UgbGVuZ3RocyB3ZXJlIGNob3NlbiB0byBiZSBqdXN0IGxvbmcgZW5vdWdoCisgICAgICAgIC8vIHRoYXQgZG91YmxpbmcgdGhlIGNhcGFjaXR5IGlzIGEgKipiZXR0ZXIqKiBjaG9pY2UgdGhhbgorICAgICAgICAvLyBzaW1wbHkgcmVzaXppbmcgdGhlIGJ1ZmZlciB0byBiLmxlbigpCisKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDIsIG1lbSk7CisgICAgICAgIGxldCBiID0gWzB4MDAsIDB4MDEsIDB4MDJdOworCisgICAgICAgIC8vIHNob3VsZCBoYXZlIHdyaXR0ZW4gMyBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmIpLnVud3JhcCgpLCAzKTsKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF9udW1fd3JpdHRlbl9ieXRlcyEodCwgMCk7CisKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkX2J5dGVzID0gWworICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgLyogbWVzc2FnZSBzaXplICovCisgICAgICAgICAgICAweDAwLCAweDAxLCAweDAyLCAvKiBtZXNzYWdlIGJvZHkgKi8KKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGV4cGVjdGVkX2J5dGVzKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZXR1cm5fZXJyb3JfaWZfbm90aGluZ19jYW5fYmVfd3JpdHRlbl90b19pbm5lcl90cmFuc3BvcnRfb25fZmx1c2goKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDEsIG1lbSk7CisKKyAgICAgICAgbGV0IGIgPSB2ZWMhWzA7IDEwXTsKKworICAgICAgICAvLyBzaG91bGQgaGF2ZSB3cml0dGVuIDEwIGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmYikudW53cmFwKCksIDEwKTsKKworICAgICAgICAvLyBsZXQncyBmbHVzaAorICAgICAgICBsZXQgciA9IHQuZmx1c2goKTsKKworICAgICAgICAvLyB0aGlzIHRpbWUgd2UnbGwgZXJyb3Igb3V0IGJlY2F1c2UgdGhlIGZsdXNoIGNhbid0IHdyaXRlIHRvIHRoZSB1bmRlcmx5aW5nIGNoYW5uZWwKKyAgICAgICAgYXNzZXJ0IShyLmlzX2VycigpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdWNjZXNzZnVsbHlfYWZ0ZXJfZmx1c2goKSB7CisgICAgICAgIC8vIElNUE9SVEFOVDogd3JpdGUgY2FwYWNpdHkgKk1VU1QqIGJlIGdyZWF0ZXIKKyAgICAgICAgLy8gdGhhbiBtZXNzYWdlIHNpemVzIHVzZWQgaW4gdGhpcyB0ZXN0ICsgNC1ieXRlIGZyYW1lIGhlYWRlcgorICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMTApOworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoNSwgbWVtKTsKKworICAgICAgICAvLyB3cml0ZSBhbmQgZmx1c2gKKyAgICAgICAgbGV0IGZpcnN0X21lc3NhZ2U6IFt1ODsgNV0gPSBbMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNF07CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmZmlyc3RfbWVzc2FnZSkudW53cmFwKCksIDUpOworICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICBsZXQgbXV0IGV4cGVjdGVkID0gVmVjOjpuZXcoKTsKKyAgICAgICAgZXhwZWN0ZWQud3JpdGVfYWxsKCZbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNV0pLnVud3JhcCgpOyAvLyBtZXNzYWdlIHNpemUKKyAgICAgICAgZXhwZWN0ZWQuZXh0ZW5kX2Zyb21fc2xpY2UoJmZpcnN0X21lc3NhZ2UpOworCisgICAgICAgIC8vIGNoZWNrIHRoZSBmbHVzaGVkIGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC5jaGFubmVsLndyaXRlX2J5dGVzKCksIGV4cGVjdGVkKTsKKworICAgICAgICAvLyByZXNldCBvdXIgdW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAgICAgdC5jaGFubmVsLmVtcHR5X3dyaXRlX2J1ZmZlcigpOworCisgICAgICAgIGxldCBzZWNvbmRfbWVzc2FnZTogW3U4OyAzXSA9IFsweDA1LCAweDA2LCAweDA3XTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZzZWNvbmRfbWVzc2FnZSkudW53cmFwKCksIDMpOworICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICBleHBlY3RlZC5jbGVhcigpOworICAgICAgICBleHBlY3RlZC53cml0ZV9hbGwoJlsweDAwLCAweDAwLCAweDAwLCAweDAzXSkudW53cmFwKCk7IC8vIG1lc3NhZ2Ugc2l6ZQorICAgICAgICBleHBlY3RlZC5leHRlbmRfZnJvbV9zbGljZSgmc2Vjb25kX21lc3NhZ2UpOworCisgICAgICAgIC8vIGNoZWNrIHRoZSBmbHVzaGVkIGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC5jaGFubmVsLndyaXRlX2J5dGVzKCksIGV4cGVjdGVkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3RyYW5zcG9ydC9tZW0ucnMgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9tZW0ucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJjNGI1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L21lbS5ycwpAQCAtMCwwICsxLDM4NSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2Ugc3RkOjpjbXA7Cit1c2Ugc3RkOjppbzsKK3VzZSBzdGQ6OnN5bmM6OntBcmMsIE11dGV4fTsKKwordXNlIHN1cGVyOjp7UmVhZEhhbGYsIFRJb0NoYW5uZWwsIFdyaXRlSGFsZn07CisKKy8vLyBJbi1tZW1vcnkgcmVhZCBhbmQgd3JpdGUgY2hhbm5lbCB3aXRoIGZpeGVkLXNpemUgcmVhZCBhbmQgd3JpdGUgYnVmZmVycy4KKy8vLworLy8vIE9uIGEgYHdyaXRlYCBieXRlcyBhcmUgd3JpdHRlbiB0byB0aGUgaW50ZXJuYWwgd3JpdGUgYnVmZmVyLiBXcml0ZXMgYXJlIG5vCisvLy8gbG9uZ2VyIGFjY2VwdGVkIG9uY2UgdGhpcyBidWZmZXIgaXMgZnVsbC4gQ2FsbGVycyBtdXN0IGBlbXB0eV93cml0ZV9idWZmZXIoKWAKKy8vLyBiZWZvcmUgc3Vic2VxdWVudCB3cml0ZXMgYXJlIGFjY2VwdGVkLgorLy8vCisvLy8gWW91IGNhbiBzZXQgcmVhZGFibGUgYnl0ZXMgaW4gdGhlIGludGVybmFsIHJlYWQgYnVmZmVyIGJ5IGZpbGxpbmcgaXQgd2l0aAorLy8vIGBzZXRfcmVhZGFibGVfYnl0ZXMoLi4uKWAuIENhbGxlcnMgY2FuIHRoZW4gcmVhZCB1bnRpbCB0aGUgYnVmZmVyIGlzCisvLy8gZGVwbGV0ZWQuIE5vIGZ1cnRoZXIgcmVhZHMgYXJlIGFjY2VwdGVkIHVudGlsIHRoZSBpbnRlcm5hbCByZWFkIGJ1ZmZlciBpcworLy8vIHJlcGxlbmlzaGVkIGFnYWluLgorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUQnVmZmVyQ2hhbm5lbCB7CisgICAgcmVhZDogQXJjPE11dGV4PFJlYWREYXRhPj4sCisgICAgd3JpdGU6IEFyYzxNdXRleDxXcml0ZURhdGE+PiwKK30KKworI1tkZXJpdmUoRGVidWcpXQorc3RydWN0IFJlYWREYXRhIHsKKyAgICBidWY6IEJveDxbdThdPiwKKyAgICBwb3M6IHVzaXplLAorICAgIGlkeDogdXNpemUsCisgICAgY2FwOiB1c2l6ZSwKK30KKworI1tkZXJpdmUoRGVidWcpXQorc3RydWN0IFdyaXRlRGF0YSB7CisgICAgYnVmOiBCb3g8W3U4XT4sCisgICAgcG9zOiB1c2l6ZSwKKyAgICBjYXA6IHVzaXplLAorfQorCitpbXBsIFRCdWZmZXJDaGFubmVsIHsKKyAgICAvLy8gQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgYFRCdWZmZXJDaGFubmVsYCB3aXRoIHRoZSBnaXZlbgorICAgIC8vLyByZWFkIGJ1ZmZlciBjYXBhY2l0eSBhbmQgd3JpdGUgYnVmZmVyIGNhcGFjaXR5LgorICAgIHB1YiBmbiB3aXRoX2NhcGFjaXR5KHJlYWRfY2FwYWNpdHk6IHVzaXplLCB3cml0ZV9jYXBhY2l0eTogdXNpemUpIC0+IFRCdWZmZXJDaGFubmVsIHsKKyAgICAgICAgVEJ1ZmZlckNoYW5uZWwgeworICAgICAgICAgICAgcmVhZDogQXJjOjpuZXcoTXV0ZXg6Om5ldyhSZWFkRGF0YSB7CisgICAgICAgICAgICAgICAgYnVmOiB2ZWMhWzA7IHJlYWRfY2FwYWNpdHldLmludG9fYm94ZWRfc2xpY2UoKSwKKyAgICAgICAgICAgICAgICBpZHg6IDAsCisgICAgICAgICAgICAgICAgcG9zOiAwLAorICAgICAgICAgICAgICAgIGNhcDogcmVhZF9jYXBhY2l0eSwKKyAgICAgICAgICAgIH0pKSwKKyAgICAgICAgICAgIHdyaXRlOiBBcmM6Om5ldyhNdXRleDo6bmV3KFdyaXRlRGF0YSB7CisgICAgICAgICAgICAgICAgYnVmOiB2ZWMhWzA7IHdyaXRlX2NhcGFjaXR5XS5pbnRvX2JveGVkX3NsaWNlKCksCisgICAgICAgICAgICAgICAgcG9zOiAwLAorICAgICAgICAgICAgICAgIGNhcDogd3JpdGVfY2FwYWNpdHksCisgICAgICAgICAgICB9KSksCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIGEgY29weSBvZiB0aGUgYnl0ZXMgaGVsZCBieSB0aGUgaW50ZXJuYWwgcmVhZCBidWZmZXIuCisgICAgLy8vIFJldHVybnMgYW4gZW1wdHkgdmVjdG9yIGlmIG5vIHJlYWRhYmxlIGJ5dGVzIGFyZSBwcmVzZW50LgorICAgIHB1YiBmbiByZWFkX2J5dGVzKCZzZWxmKSAtPiBWZWM8dTg+IHsKKyAgICAgICAgbGV0IHJkYXRhID0gc2VsZi5yZWFkLmFzX3JlZigpLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzB1ODsgcmRhdGEuaWR4XTsKKyAgICAgICAgYnVmLmNvcHlfZnJvbV9zbGljZSgmcmRhdGEuYnVmWy4ucmRhdGEuaWR4XSk7CisgICAgICAgIGJ1ZgorICAgIH0KKworICAgIC8vIEZJWE1FOiBkbyBJIHJlYWxseSBuZWVkIHRoaXMgQVBJIGNhbGw/CisgICAgLy8gRklYTUU6IHNob3VsZCB0aGlzIHNpbXBseSByZXNldCB0byB0aGUgbGFzdCBzZXQgb2YgcmVhZGFibGUgYnl0ZXM/CisgICAgLy8vIFJlc2V0IHRoZSBudW1iZXIgb2YgcmVhZGFibGUgYnl0ZXMgdG8gemVyby4KKyAgICAvLy8KKyAgICAvLy8gU3Vic2VxdWVudCBjYWxscyB0byBgcmVhZGAgd2lsbCByZXR1cm4gbm90aGluZy4KKyAgICBwdWIgZm4gZW1wdHlfcmVhZF9idWZmZXIoJm11dCBzZWxmKSB7CisgICAgICAgIGxldCBtdXQgcmRhdGEgPSBzZWxmLnJlYWQuYXNfcmVmKCkubG9jaygpLnVud3JhcCgpOworICAgICAgICByZGF0YS5wb3MgPSAwOworICAgICAgICByZGF0YS5pZHggPSAwOworICAgIH0KKworICAgIC8vLyBDb3B5IGJ5dGVzIGZyb20gdGhlIHNvdXJjZSBidWZmZXIgYGJ1ZmAgaW50byB0aGUgaW50ZXJuYWwgcmVhZCBidWZmZXIsCisgICAgLy8vIG92ZXJ3cml0aW5nIGFueSBleGlzdGluZyBieXRlcy4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCwKKyAgICAvLy8gd2hpY2ggaXMgYG1pbihidWYubGVuKCksIGludGVybmFsX3JlYWRfYnVmLmxlbigpKWAuCisgICAgcHViIGZuIHNldF9yZWFkYWJsZV9ieXRlcygmbXV0IHNlbGYsIGJ1ZjogJlt1OF0pIC0+IHVzaXplIHsKKyAgICAgICAgc2VsZi5lbXB0eV9yZWFkX2J1ZmZlcigpOworICAgICAgICBsZXQgbXV0IHJkYXRhID0gc2VsZi5yZWFkLmFzX3JlZigpLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgbGV0IG1heF9ieXRlcyA9IGNtcDo6bWluKHJkYXRhLmNhcCwgYnVmLmxlbigpKTsKKyAgICAgICAgcmRhdGEuYnVmWy4ubWF4X2J5dGVzXS5jbG9uZV9mcm9tX3NsaWNlKCZidWZbLi5tYXhfYnl0ZXNdKTsKKyAgICAgICAgcmRhdGEuaWR4ID0gbWF4X2J5dGVzOworICAgICAgICBtYXhfYnl0ZXMKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIGEgY29weSBvZiB0aGUgYnl0ZXMgaGVsZCBieSB0aGUgaW50ZXJuYWwgd3JpdGUgYnVmZmVyLgorICAgIC8vLyBSZXR1cm5zIGFuIGVtcHR5IHZlY3RvciBpZiBubyBieXRlcyB3ZXJlIHdyaXR0ZW4uCisgICAgcHViIGZuIHdyaXRlX2J5dGVzKCZzZWxmKSAtPiBWZWM8dTg+IHsKKyAgICAgICAgbGV0IHdkYXRhID0gc2VsZi53cml0ZS5hc19yZWYoKS5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IHdkYXRhLnBvc107CisgICAgICAgIGJ1Zi5jb3B5X2Zyb21fc2xpY2UoJndkYXRhLmJ1ZlsuLndkYXRhLnBvc10pOworICAgICAgICBidWYKKyAgICB9CisKKyAgICAvLy8gUmVzZXRzIHRoZSBpbnRlcm5hbCB3cml0ZSBidWZmZXIsIG1ha2luZyBpdCBzZWVtIGxpa2Ugbm8gYnl0ZXMgd2VyZQorICAgIC8vLyB3cml0dGVuLiBDYWxsaW5nIGB3cml0ZV9idWZmZXJgIGFmdGVyIHRoaXMgcmV0dXJucyBhbiBlbXB0eSB2ZWN0b3IuCisgICAgcHViIGZuIGVtcHR5X3dyaXRlX2J1ZmZlcigmbXV0IHNlbGYpIHsKKyAgICAgICAgbGV0IG11dCB3ZGF0YSA9IHNlbGYud3JpdGUuYXNfcmVmKCkubG9jaygpLnVud3JhcCgpOworICAgICAgICB3ZGF0YS5wb3MgPSAwOworICAgIH0KKworICAgIC8vLyBPdmVyd3JpdGVzIHRoZSBjb250ZW50cyBvZiB0aGUgcmVhZCBidWZmZXIgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlCisgICAgLy8vIHdyaXRlIGJ1ZmZlci4gVGhlIHdyaXRlIGJ1ZmZlciBpcyBlbXB0aWVkIGFmdGVyIHRoaXMgb3BlcmF0aW9uLgorICAgIHB1YiBmbiBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlcigmbXV0IHNlbGYpIHsKKyAgICAgICAgLy8gRklYTUU6IHJlZG8gdGhpcyBlbnRpcmUgbWV0aG9kCisgICAgICAgIGxldCBidWYgPSB7CisgICAgICAgICAgICBsZXQgd2RhdGEgPSBzZWxmLndyaXRlLmFzX3JlZigpLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgICAgIGxldCBiID0gJndkYXRhLmJ1ZlsuLndkYXRhLnBvc107CisgICAgICAgICAgICBsZXQgbXV0IGJfcmV0ID0gdmVjIVswOyBiLmxlbigpXTsKKyAgICAgICAgICAgIGJfcmV0LmNvcHlfZnJvbV9zbGljZShiKTsKKyAgICAgICAgICAgIGJfcmV0CisgICAgICAgIH07CisKKyAgICAgICAgbGV0IGJ5dGVzX2NvcGllZCA9IHNlbGYuc2V0X3JlYWRhYmxlX2J5dGVzKCZidWYpOworICAgICAgICBhc3NlcnRfZXEhKGJ5dGVzX2NvcGllZCwgYnVmLmxlbigpKTsKKworICAgICAgICBzZWxmLmVtcHR5X3dyaXRlX2J1ZmZlcigpOworICAgIH0KK30KKworaW1wbCBUSW9DaGFubmVsIGZvciBUQnVmZmVyQ2hhbm5lbCB7CisgICAgZm4gc3BsaXQoc2VsZikgLT4gOjpSZXN1bHQ8KFJlYWRIYWxmPFNlbGY+LCBXcml0ZUhhbGY8U2VsZj4pPgorICAgIHdoZXJlCisgICAgICAgIFNlbGY6IFNpemVkLAorICAgIHsKKyAgICAgICAgT2soKAorICAgICAgICAgICAgUmVhZEhhbGYgeworICAgICAgICAgICAgICAgIGhhbmRsZTogVEJ1ZmZlckNoYW5uZWwgeworICAgICAgICAgICAgICAgICAgICByZWFkOiBzZWxmLnJlYWQuY2xvbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgd3JpdGU6IHNlbGYud3JpdGUuY2xvbmUoKSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIFdyaXRlSGFsZiB7CisgICAgICAgICAgICAgICAgaGFuZGxlOiBUQnVmZmVyQ2hhbm5lbCB7CisgICAgICAgICAgICAgICAgICAgIHJlYWQ6IHNlbGYucmVhZC5jbG9uZSgpLAorICAgICAgICAgICAgICAgICAgICB3cml0ZTogc2VsZi53cml0ZS5jbG9uZSgpLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICB9LAorICAgICAgICApKQorICAgIH0KK30KKworaW1wbCBpbzo6UmVhZCBmb3IgVEJ1ZmZlckNoYW5uZWwgeworICAgIGZuIHJlYWQoJm11dCBzZWxmLCBidWY6ICZtdXQgW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBsZXQgbXV0IHJkYXRhID0gc2VsZi5yZWFkLmFzX3JlZigpLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgbGV0IG5yZWFkID0gY21wOjptaW4oYnVmLmxlbigpLCByZGF0YS5pZHggLSByZGF0YS5wb3MpOworICAgICAgICBidWZbLi5ucmVhZF0uY2xvbmVfZnJvbV9zbGljZSgmcmRhdGEuYnVmW3JkYXRhLnBvcy4ucmRhdGEucG9zICsgbnJlYWRdKTsKKyAgICAgICAgcmRhdGEucG9zICs9IG5yZWFkOworICAgICAgICBPayhucmVhZCkKKyAgICB9Cit9CisKK2ltcGwgaW86OldyaXRlIGZvciBUQnVmZmVyQ2hhbm5lbCB7CisgICAgZm4gd3JpdGUoJm11dCBzZWxmLCBidWY6ICZbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIGxldCBtdXQgd2RhdGEgPSBzZWxmLndyaXRlLmFzX3JlZigpLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgbGV0IG53cml0ZSA9IGNtcDo6bWluKGJ1Zi5sZW4oKSwgd2RhdGEuY2FwIC0gd2RhdGEucG9zKTsKKyAgICAgICAgbGV0IChzdGFydCwgZW5kKSA9ICh3ZGF0YS5wb3MsIHdkYXRhLnBvcyArIG53cml0ZSk7CisgICAgICAgIHdkYXRhLmJ1ZltzdGFydC4uZW5kXS5jbG9uZV9mcm9tX3NsaWNlKCZidWZbLi5ud3JpdGVdKTsKKyAgICAgICAgd2RhdGEucG9zICs9IG53cml0ZTsKKyAgICAgICAgT2sobndyaXRlKQorICAgIH0KKworICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gaW86OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkgLy8gbm90aGluZyB0byBkbyBvbiBmbHVzaAorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdGQ6OmlvOjp7UmVhZCwgV3JpdGV9OworCisgICAgdXNlIHN1cGVyOjpUQnVmZmVyQ2hhbm5lbDsKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2VtcHR5X3dyaXRlX2J1ZmZlcigpIHsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMSk7CisKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3dyaXRlOiBbdTg7IDFdID0gWzB4MDFdOworICAgICAgICBsZXQgcmVzdWx0ID0gdC53cml0ZSgmYnl0ZXNfdG9fd3JpdGUpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdC51bndyYXAoKSwgMSk7CisgICAgICAgIGFzc2VydF9lcSEoJnQud3JpdGVfYnl0ZXMoKSwgJmJ5dGVzX3RvX3dyaXRlKTsKKworICAgICAgICB0LmVtcHR5X3dyaXRlX2J1ZmZlcigpOworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGVfYnl0ZXMoKS5sZW4oKSwgMCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYWNjZXB0X3dyaXRlc19hZnRlcl9idWZmZXJfZW1wdGllZCgpIHsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMik7CisKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3dyaXRlOiBbdTg7IDJdID0gWzB4MDEsIDB4MDJdOworCisgICAgICAgIC8vIGZpcnN0IHdyaXRlIChhbGwgYnl0ZXMgd3JpdHRlbikKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQudW53cmFwKCksIDIpOworICAgICAgICBhc3NlcnRfZXEhKCZ0LndyaXRlX2J5dGVzKCksICZieXRlc190b193cml0ZSk7CisKKyAgICAgICAgLy8gdHJ5IHdyaXRlIGFnYWluIChub3RoaW5nIHNob3VsZCBiZSB3cml0dGVuKQorICAgICAgICBsZXQgcmVzdWx0ID0gdC53cml0ZSgmYnl0ZXNfdG9fd3JpdGUpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdC51bndyYXAoKSwgMCk7CisgICAgICAgIGFzc2VydF9lcSEoJnQud3JpdGVfYnl0ZXMoKSwgJmJ5dGVzX3RvX3dyaXRlKTsgLy8gc3RpbGwgdGhlIHNhbWUgYXMgYmVmb3JlCisKKyAgICAgICAgLy8gbm93IHJlc2V0IHRoZSBidWZmZXIKKyAgICAgICAgdC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlX2J5dGVzKCkubGVuKCksIDApOworCisgICAgICAgIC8vIG5vdyB0cnkgd3JpdGUgYWdhaW4gLSB0aGUgd3JpdGUgc2hvdWxkIHN1Y2NlZWQKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQudW53cmFwKCksIDIpOworICAgICAgICBhc3NlcnRfZXEhKCZ0LndyaXRlX2J5dGVzKCksICZieXRlc190b193cml0ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYWNjZXB0X211bHRpcGxlX3dyaXRlc191bnRpbF9idWZmZXJfaXNfZnVsbCgpIHsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMTApOworCisgICAgICAgIC8vIGZpcnN0IHdyaXRlIChhbGwgYnl0ZXMgd3JpdHRlbikKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3dyaXRlXzA6IFt1ODsgMl0gPSBbMHgwMSwgMHg0MV07CisgICAgICAgIGxldCB3cml0ZV8wX3Jlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlXzApOworICAgICAgICBhc3NlcnRfZXEhKHdyaXRlXzBfcmVzdWx0LnVud3JhcCgpLCAyKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlX2J5dGVzKCksICZieXRlc190b193cml0ZV8wKTsKKworICAgICAgICAvLyBzZWNvbmQgd3JpdGUgKGFsbCBieXRlcyB3cml0dGVuLCBzdGFydGluZyBhdCBpbmRleCAyKQorICAgICAgICBsZXQgYnl0ZXNfdG9fd3JpdGVfMTogW3U4OyA3XSA9IFsweDI0LCAweDQxLCAweDMyLCAweDMzLCAweDExLCAweDk4LCAweEFGXTsKKyAgICAgICAgbGV0IHdyaXRlXzFfcmVzdWx0ID0gdC53cml0ZSgmYnl0ZXNfdG9fd3JpdGVfMSk7CisgICAgICAgIGFzc2VydF9lcSEod3JpdGVfMV9yZXN1bHQudW53cmFwKCksIDcpOworICAgICAgICBhc3NlcnRfZXEhKCZ0LndyaXRlX2J5dGVzKClbMi4uXSwgJmJ5dGVzX3RvX3dyaXRlXzEpOworCisgICAgICAgIC8vIHRoaXJkIHdyaXRlIChvbmx5IDEgYnl0ZSB3cml0dGVuIC0gdGhhdCdzIGFsbCB3ZSBoYXZlIHNwYWNlIGZvcikKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3dyaXRlXzI6IFt1ODsgM10gPSBbMHhCRiwgMHhEQSwgMHg5OF07CisgICAgICAgIGxldCB3cml0ZV8yX3Jlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlXzIpOworICAgICAgICBhc3NlcnRfZXEhKHdyaXRlXzJfcmVzdWx0LnVud3JhcCgpLCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmdC53cml0ZV9ieXRlcygpWzkuLl0sICZieXRlc190b193cml0ZV8yWzAuLjFdKTsgLy8gaG93IGRvZXMgdGhpcyBzeW50YXggd29yaz8hCisKKyAgICAgICAgLy8gZm91cnRoIHdyaXRlIChubyB3cml0ZXMgYXJlIGFjY2VwdGVkKQorICAgICAgICBsZXQgYnl0ZXNfdG9fd3JpdGVfMzogW3U4OyAzXSA9IFsweEJGLCAweEFBLCAweEZEXTsKKyAgICAgICAgbGV0IHdyaXRlXzNfcmVzdWx0ID0gdC53cml0ZSgmYnl0ZXNfdG9fd3JpdGVfMyk7CisgICAgICAgIGFzc2VydF9lcSEod3JpdGVfM19yZXN1bHQudW53cmFwKCksIDApOworCisgICAgICAgIC8vIGNoZWNrIHRoZSBmdWxsIHdyaXRlIGJ1ZmZlcgorICAgICAgICBsZXQgbXV0IGV4cGVjdGVkOiBWZWM8dTg+ID0gVmVjOjp3aXRoX2NhcGFjaXR5KDEwKTsKKyAgICAgICAgZXhwZWN0ZWQuZXh0ZW5kX2Zyb21fc2xpY2UoJmJ5dGVzX3RvX3dyaXRlXzApOworICAgICAgICBleHBlY3RlZC5leHRlbmRfZnJvbV9zbGljZSgmYnl0ZXNfdG9fd3JpdGVfMSk7CisgICAgICAgIGV4cGVjdGVkLmV4dGVuZF9mcm9tX3NsaWNlKCZieXRlc190b193cml0ZV8yWzAuLjFdKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlX2J5dGVzKCksICZleHBlY3RlZFsuLl0pOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2VtcHR5X3JlYWRfYnVmZmVyKCkgeworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxLCAwKTsKKworICAgICAgICBsZXQgYnl0ZXNfdG9fcmVhZDogW3U4OyAxXSA9IFsweDAxXTsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQuc2V0X3JlYWRhYmxlX2J5dGVzKCZieXRlc190b19yZWFkKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQsIDEpOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLCAmYnl0ZXNfdG9fcmVhZCk7CisKKyAgICAgICAgdC5lbXB0eV9yZWFkX2J1ZmZlcigpOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLmxlbigpLCAwKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9hbGxvd19yZWFkYWJsZV9ieXRlc190b19iZV9zZXRfYWZ0ZXJfcmVhZF9idWZmZXJfZW1wdGllZCgpIHsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMSwgMCk7CisKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3JlYWRfMDogW3U4OyAxXSA9IFsweDAxXTsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQuc2V0X3JlYWRhYmxlX2J5dGVzKCZieXRlc190b19yZWFkXzApOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgMSk7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCksICZieXRlc190b19yZWFkXzApOworCisgICAgICAgIHQuZW1wdHlfcmVhZF9idWZmZXIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKS5sZW4oKSwgMCk7CisKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3JlYWRfMTogW3U4OyAxXSA9IFsweDAyXTsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQuc2V0X3JlYWRhYmxlX2J5dGVzKCZieXRlc190b19yZWFkXzEpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgMSk7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCksICZieXRlc190b19yZWFkXzEpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2FjY2VwdF9tdWx0aXBsZV9yZWFkc191bnRpbF9hbGxfYnl0ZXNfcmVhZCgpIHsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDApOworCisgICAgICAgIGxldCByZWFkYWJsZV9ieXRlczogW3U4OyAxMF0gPSBbMHhGRiwgMHhFRSwgMHhERCwgMHhDQywgMHhCQiwgMHgwMCwgMHgxQSwgMHgyQiwgMHgzQywgMHg0RF07CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB3ZSdyZSBhYmxlIHRvIHNldCB0aGUgYnl0ZXMgdG8gYmUgcmVhZAorICAgICAgICBsZXQgcmVzdWx0ID0gdC5zZXRfcmVhZGFibGVfYnl0ZXMoJnJlYWRhYmxlX2J5dGVzKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQsIDEwKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKSwgJnJlYWRhYmxlX2J5dGVzKTsKKworICAgICAgICAvLyBmaXJzdCByZWFkCisgICAgICAgIGxldCBtdXQgcmVhZF9idWZfMCA9IHZlYyFbMDsgNV07CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IHJlYWRfYnVmXzApOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCA1KTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX2J1Zl8wLmFzX3NsaWNlKCksICYocmVhZGFibGVfYnl0ZXNbMC4uNV0pKTsKKworICAgICAgICAvLyBzZWNvbmQgcmVhZAorICAgICAgICBsZXQgbXV0IHJlYWRfYnVmXzEgPSB2ZWMhWzA7IDRdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCByZWFkX2J1Zl8xKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgNCk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9idWZfMS5hc19zbGljZSgpLCAmKHJlYWRhYmxlX2J5dGVzWzUuLjldKSk7CisKKyAgICAgICAgLy8gdGhpcmQgcmVhZCAob25seSAxIGJ5dGUgcmVtYWlucyB0byBiZSByZWFkKQorICAgICAgICBsZXQgbXV0IHJlYWRfYnVmXzIgPSB2ZWMhWzA7IDNdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCByZWFkX2J1Zl8yKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMSk7CisgICAgICAgIHJlYWRfYnVmXzIudHJ1bmNhdGUoMSk7IC8vIEZJWE1FOiBkb2VzIHRoZSBjYWxsZXIgaGF2ZSB0byBkbyB0aGlzPworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfYnVmXzIuYXNfc2xpY2UoKSwgJihyZWFkYWJsZV9ieXRlc1s5Li5dKSk7CisKKyAgICAgICAgLy8gZm91cnRoIHJlYWQgKG5vdGhpbmcgc2hvdWxkIGJlIHJlYWRhYmxlKQorICAgICAgICBsZXQgbXV0IHJlYWRfYnVmXzMgPSB2ZWMhWzA7IDEwXTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgcmVhZF9idWZfMyk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDApOworICAgICAgICByZWFkX2J1Zl8zLnRydW5jYXRlKDApOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgYWxsIHRoZSBieXRlcyB3ZSByZWNlaXZlZCBtYXRjaCB0aGUgb3JpZ2luYWwgKGFnYWluISkKKyAgICAgICAgbGV0IG11dCBieXRlc19yZWFkID0gVmVjOjp3aXRoX2NhcGFjaXR5KDEwKTsKKyAgICAgICAgYnl0ZXNfcmVhZC5leHRlbmRfZnJvbV9zbGljZSgmcmVhZF9idWZfMCk7CisgICAgICAgIGJ5dGVzX3JlYWQuZXh0ZW5kX2Zyb21fc2xpY2UoJnJlYWRfYnVmXzEpOworICAgICAgICBieXRlc19yZWFkLmV4dGVuZF9mcm9tX3NsaWNlKCZyZWFkX2J1Zl8yKTsKKyAgICAgICAgYnl0ZXNfcmVhZC5leHRlbmRfZnJvbV9zbGljZSgmcmVhZF9idWZfMyk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ5dGVzX3JlYWQsICZyZWFkYWJsZV9ieXRlcyk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYWxsb3dfcmVhZHNfdG9fc3VjY2VlZF9hZnRlcl9yZWFkX2J1ZmZlcl9yZXBsZW5pc2hlZCgpIHsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMywgMCk7CisKKyAgICAgICAgbGV0IHJlYWRhYmxlX2J5dGVzXzA6IFt1ODsgM10gPSBbMHgwMiwgMHhBQiwgMHgzM107CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB3ZSdyZSBhYmxlIHRvIHNldCB0aGUgYnl0ZXMgdG8gYmUgcmVhZAorICAgICAgICBsZXQgcmVzdWx0ID0gdC5zZXRfcmVhZGFibGVfYnl0ZXMoJnJlYWRhYmxlX2J5dGVzXzApOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgMyk7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCksICZyZWFkYWJsZV9ieXRlc18wKTsKKworICAgICAgICBsZXQgbXV0IHJlYWRfYnVmID0gdmVjIVswOyA0XTsKKworICAgICAgICAvLyBkcmFpbiB0aGUgcmVhZCBidWZmZXIKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgcmVhZF9idWYpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAzKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKSwgJnJlYWRfYnVmWzAuLjNdKTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IGEgc3Vic2VxdWVudCByZWFkIGZhaWxzCisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IHJlYWRfYnVmKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMCk7CisKKyAgICAgICAgLy8gd2UgZG9uJ3QgbW9kaWZ5IHRoZSByZWFkIGJ1ZmZlciBvbiBmYWlsdXJlCisgICAgICAgIGxldCBtdXQgZXhwZWN0ZWRfYnl0ZXMgPSBWZWM6OndpdGhfY2FwYWNpdHkoNCk7CisgICAgICAgIGV4cGVjdGVkX2J5dGVzLmV4dGVuZF9mcm9tX3NsaWNlKCZyZWFkYWJsZV9ieXRlc18wKTsKKyAgICAgICAgZXhwZWN0ZWRfYnl0ZXMucHVzaCgweDAwKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVhZF9idWYsICZleHBlY3RlZF9ieXRlcyk7CisKKyAgICAgICAgLy8gcmVwbGVuaXNoIHRoZSByZWFkIGJ1ZmZlciBhZ2FpbgorICAgICAgICBsZXQgcmVhZGFibGVfYnl0ZXNfMTogW3U4OyAyXSA9IFsweDkxLCAweEFBXTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IHdlJ3JlIGFibGUgdG8gc2V0IHRoZSBieXRlcyB0byBiZSByZWFkCisgICAgICAgIGxldCByZXN1bHQgPSB0LnNldF9yZWFkYWJsZV9ieXRlcygmcmVhZGFibGVfYnl0ZXNfMSk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LCAyKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKSwgJnJlYWRhYmxlX2J5dGVzXzEpOworCisgICAgICAgIC8vIHJlYWQgYWdhaW4KKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgcmVhZF9idWYpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAyKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKSwgJnJlYWRfYnVmWzAuLjJdKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3RyYW5zcG9ydC9tb2QucnMgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9tb2QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYyMzM1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L21vZC5ycwpAQCAtMCwwICsxLDI5MSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyEgVHlwZXMgdXNlZCB0byBzZW5kIGFuZCByZWNlaXZlIGJ5dGVzIG92ZXIgYW4gSS9PIGNoYW5uZWwuCisvLyEKKy8vISBUaGUgY29yZSB0eXBlcyBhcmUgdGhlIGBUUmVhZFRyYW5zcG9ydGAsIGBUV3JpdGVUcmFuc3BvcnRgIGFuZCB0aGUKKy8vISBgVElvQ2hhbm5lbGAgdHJhaXRzLCB0aHJvdWdoIHdoaWNoIGBUSW5wdXRQcm90b2NvbGAgb3IKKy8vISBgVE91dHB1dFByb3RvY29sYCBjYW4gcmVjZWl2ZSBhbmQgc2VuZCBwcmltaXRpdmVzIG92ZXIgdGhlIHdpcmUuIFdoaWxlCisvLyEgYFRJbnB1dFByb3RvY29sYCBhbmQgYFRPdXRwdXRQcm90b2NvbGAgaW5zdGFuY2VzIGRlYWwgd2l0aCBsYW5ndWFnZSBwcmltaXRpdmVzCisvLyEgdGhlIHR5cGVzIGluIHRoaXMgbW9kdWxlIHVuZGVyc3RhbmQgb25seSBieXRlcy4KKwordXNlIHN0ZDo6aW87Cit1c2Ugc3RkOjppbzo6e1JlYWQsIFdyaXRlfTsKK3VzZSBzdGQ6Om9wczo6e0RlcmVmLCBEZXJlZk11dH07CisKKyNbY2ZnKHRlc3QpXQorbWFjcm9fcnVsZXMhIGFzc2VydF9lcV90cmFuc3BvcnRfbnVtX3dyaXR0ZW5fYnl0ZXMgeworICAgICgkdHJhbnNwb3J0OmlkZW50LCAkbnVtX3dyaXR0ZW5fYnl0ZXM6ZXhwcikgPT4ge3sKKyAgICAgICAgYXNzZXJ0X2VxISgkdHJhbnNwb3J0LmNoYW5uZWwud3JpdGVfYnl0ZXMoKS5sZW4oKSwgJG51bV93cml0dGVuX2J5dGVzKTsKKyAgICB9fTsKK30KKworI1tjZmcodGVzdCldCittYWNyb19ydWxlcyEgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzIHsKKyAgICAoJHRyYW5zcG9ydDppZGVudCwgJGV4cGVjdGVkX2J5dGVzOmlkZW50KSA9PiB7eworICAgICAgICBhc3NlcnRfZXEhKCR0cmFuc3BvcnQuY2hhbm5lbC53cml0ZV9ieXRlcygpLCAmJGV4cGVjdGVkX2J5dGVzKTsKKyAgICB9fTsKK30KKworbW9kIGJ1ZmZlcmVkOworbW9kIGZyYW1lZDsKK21vZCBtZW07Cittb2Qgc29ja2V0OworCitwdWIgdXNlIHNlbGY6OmJ1ZmZlcmVkOjp7CisgICAgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydCwgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0LAorICAgIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSwKK307CitwdWIgdXNlIHNlbGY6OmZyYW1lZDo6eworICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0LCBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRGcmFtZWRXcml0ZVRyYW5zcG9ydCwKKyAgICBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5LAorfTsKK3B1YiB1c2Ugc2VsZjo6bWVtOjpUQnVmZmVyQ2hhbm5lbDsKK3B1YiB1c2Ugc2VsZjo6c29ja2V0OjpUVGNwQ2hhbm5lbDsKKworLy8vIElkZW50aWZpZXMgYSB0cmFuc3BvcnQgdXNlZCBieSBhIGBUSW5wdXRQcm90b2NvbGAgdG8gcmVjZWl2ZSBieXRlcy4KK3B1YiB0cmFpdCBUUmVhZFRyYW5zcG9ydDogUmVhZCB7fQorCisvLy8gSGVscGVyIHR5cGUgdXNlZCBieSBhIHNlcnZlciB0byBjcmVhdGUgYFRSZWFkVHJhbnNwb3J0YCBpbnN0YW5jZXMgZm9yCisvLy8gYWNjZXB0ZWQgY2xpZW50IGNvbm5lY3Rpb25zLgorcHViIHRyYWl0IFRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBUVHJhbnNwb3J0YCB0aGF0IHdyYXBzIGEgY2hhbm5lbCBvdmVyIHdoaWNoIGJ5dGVzIGFyZSB0byBiZSByZWFkLgorICAgIGZuIGNyZWF0ZSgmc2VsZiwgY2hhbm5lbDogQm94PFJlYWQgKyBTZW5kPikgLT4gQm94PFRSZWFkVHJhbnNwb3J0ICsgU2VuZD47Cit9CisKKy8vLyBJZGVudGlmaWVzIGEgdHJhbnNwb3J0IHVzZWQgYnkgYFRPdXRwdXRQcm90b2NvbGAgdG8gc2VuZCBieXRlcy4KK3B1YiB0cmFpdCBUV3JpdGVUcmFuc3BvcnQ6IFdyaXRlIHt9CisKKy8vLyBIZWxwZXIgdHlwZSB1c2VkIGJ5IGEgc2VydmVyIHRvIGNyZWF0ZSBgVFdyaXRlVHJhbnNwb3J0YCBpbnN0YW5jZXMgZm9yCisvLy8gYWNjZXB0ZWQgY2xpZW50IGNvbm5lY3Rpb25zLgorcHViIHRyYWl0IFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVFRyYW5zcG9ydGAgdGhhdCB3cmFwcyBhIGNoYW5uZWwgb3ZlciB3aGljaCBieXRlcyBhcmUgdG8gYmUgc2VudC4KKyAgICBmbiBjcmVhdGUoJnNlbGYsIGNoYW5uZWw6IEJveDxXcml0ZSArIFNlbmQ+KSAtPiBCb3g8VFdyaXRlVHJhbnNwb3J0ICsgU2VuZD47Cit9CisKK2ltcGw8VD4gVFJlYWRUcmFuc3BvcnQgZm9yIFQgd2hlcmUgVDogUmVhZCB7fQorCitpbXBsPFQ+IFRXcml0ZVRyYW5zcG9ydCBmb3IgVCB3aGVyZSBUOiBXcml0ZSB7fQorCisvLyBGSVhNRTogaW1wbGVtZW50IHRoZSBEZWJ1ZyB0cmFpdCBmb3IgYm94ZWQgdHJhbnNwb3J0cworCitpbXBsPFQ+IFRSZWFkVHJhbnNwb3J0RmFjdG9yeSBmb3IgQm94PFQ+Cit3aGVyZQorICAgIFQ6IFRSZWFkVHJhbnNwb3J0RmFjdG9yeSArID9TaXplZCwKK3sKKyAgICBmbiBjcmVhdGUoJnNlbGYsIGNoYW5uZWw6IEJveDxSZWFkICsgU2VuZD4pIC0+IEJveDxUUmVhZFRyYW5zcG9ydCArIFNlbmQ+IHsKKyAgICAgICAgKCoqc2VsZikuY3JlYXRlKGNoYW5uZWwpCisgICAgfQorfQorCitpbXBsPFQ+IFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgZm9yIEJveDxUPgord2hlcmUKKyAgICBUOiBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5ICsgP1NpemVkLAoreworICAgIGZuIGNyZWF0ZSgmc2VsZiwgY2hhbm5lbDogQm94PFdyaXRlICsgU2VuZD4pIC0+IEJveDxUV3JpdGVUcmFuc3BvcnQgKyBTZW5kPiB7CisgICAgICAgICgqKnNlbGYpLmNyZWF0ZShjaGFubmVsKQorICAgIH0KK30KKworLy8vIElkZW50aWZpZXMgYSBzcGxpdHRhYmxlIGJpZGlyZWN0aW9uYWwgSS9PIGNoYW5uZWwgdXNlZCB0byBzZW5kIGFuZCByZWNlaXZlIGJ5dGVzLgorcHViIHRyYWl0IFRJb0NoYW5uZWw6IFJlYWQgKyBXcml0ZSB7CisgICAgLy8vIFNwbGl0IHRoZSBjaGFubmVsIGludG8gYSByZWFkYWJsZSBoYWxmIGFuZCBhIHdyaXRhYmxlIGhhbGYsIHdoZXJlIHRoZQorICAgIC8vLyByZWFkYWJsZSBoYWxmIGltcGxlbWVudHMgYGlvOjpSZWFkYCBhbmQgdGhlIHdyaXRhYmxlIGhhbGYgaW1wbGVtZW50cworICAgIC8vLyBgaW86OldyaXRlYC4gUmV0dXJucyBgTm9uZWAgaWYgdGhlIGNoYW5uZWwgd2FzIG5vdCBpbml0aWFsaXplZCwgb3IgaWYgaXQKKyAgICAvLy8gY2Fubm90IGJlIHNwbGl0IHNhZmVseS4KKyAgICAvLy8KKyAgICAvLy8gUmV0dXJuZWQgaGFsdmVzIG1heSBzaGFyZSB0aGUgdW5kZXJseWluZyBPUyBjaGFubmVsIG9yIGJ1ZmZlciByZXNvdXJjZXMuCisgICAgLy8vIEltcGxlbWVudGF0aW9ucyAqKnNob3VsZCBlbnN1cmUqKiB0aGF0IHRoZXNlIHR3byBoYWx2ZXMgY2FuIGJlIHNhZmVseQorICAgIC8vLyB1c2VkIGluZGVwZW5kZW50bHkgYnkgY29uY3VycmVudCB0aHJlYWRzLgorICAgIGZuIHNwbGl0KHNlbGYpIC0+IDo6UmVzdWx0PCg6OnRyYW5zcG9ydDo6UmVhZEhhbGY8U2VsZj4sIDo6dHJhbnNwb3J0OjpXcml0ZUhhbGY8U2VsZj4pPgorICAgIHdoZXJlCisgICAgICAgIFNlbGY6IFNpemVkOworfQorCisvLy8gVGhlIHJlYWRhYmxlIGhhbGYgb2YgYW4gb2JqZWN0IHJldHVybmVkIGZyb20gYFRJb0NoYW5uZWw6OnNwbGl0YC4KKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgUmVhZEhhbGY8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICBoYW5kbGU6IEMsCit9CisKKy8vLyBUaGUgd3JpdGFibGUgaGFsZiBvZiBhbiBvYmplY3QgcmV0dXJuZWQgZnJvbSBgVElvQ2hhbm5lbDo6c3BsaXRgLgorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBXcml0ZUhhbGY8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgaGFuZGxlOiBDLAorfQorCitpbXBsPEM+IFJlYWRIYWxmPEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgLy8vIENyZWF0ZSBhIGBSZWFkSGFsZmAgYXNzb2NpYXRlZCB3aXRoIHJlYWRhYmxlIGBoYW5kbGVgCisgICAgcHViIGZuIG5ldyhoYW5kbGU6IEMpIC0+IFJlYWRIYWxmPEM+IHsKKyAgICAgICAgUmVhZEhhbGYgeyBoYW5kbGUgfQorICAgIH0KK30KKworaW1wbDxDPiBXcml0ZUhhbGY8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgLy8vIENyZWF0ZSBhIGBXcml0ZUhhbGZgIGFzc29jaWF0ZWQgd2l0aCB3cml0YWJsZSBgaGFuZGxlYAorICAgIHB1YiBmbiBuZXcoaGFuZGxlOiBDKSAtPiBXcml0ZUhhbGY8Qz4geworICAgICAgICBXcml0ZUhhbGYgeyBoYW5kbGUgfQorICAgIH0KK30KKworaW1wbDxDPiBSZWFkIGZvciBSZWFkSGFsZjxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIGZuIHJlYWQoJm11dCBzZWxmLCBidWY6ICZtdXQgW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBzZWxmLmhhbmRsZS5yZWFkKGJ1ZikKKyAgICB9Cit9CisKK2ltcGw8Qz4gV3JpdGUgZm9yIFdyaXRlSGFsZjxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICBmbiB3cml0ZSgmbXV0IHNlbGYsIGJ1ZjogJlt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgc2VsZi5oYW5kbGUud3JpdGUoYnVmKQorICAgIH0KKworICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gaW86OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmhhbmRsZS5mbHVzaCgpCisgICAgfQorfQorCitpbXBsPEM+IERlcmVmIGZvciBSZWFkSGFsZjxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIHR5cGUgVGFyZ2V0ID0gQzsKKworICAgIGZuIGRlcmVmKCZzZWxmKSAtPiAmU2VsZjo6VGFyZ2V0IHsKKyAgICAgICAgJnNlbGYuaGFuZGxlCisgICAgfQorfQorCitpbXBsPEM+IERlcmVmTXV0IGZvciBSZWFkSGFsZjxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIGZuIGRlcmVmX211dCgmbXV0IHNlbGYpIC0+ICZtdXQgQyB7CisgICAgICAgICZtdXQgc2VsZi5oYW5kbGUKKyAgICB9Cit9CisKK2ltcGw8Qz4gRGVyZWYgZm9yIFdyaXRlSGFsZjxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICB0eXBlIFRhcmdldCA9IEM7CisKKyAgICBmbiBkZXJlZigmc2VsZikgLT4gJlNlbGY6OlRhcmdldCB7CisgICAgICAgICZzZWxmLmhhbmRsZQorICAgIH0KK30KKworaW1wbDxDPiBEZXJlZk11dCBmb3IgV3JpdGVIYWxmPEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIGZuIGRlcmVmX211dCgmbXV0IHNlbGYpIC0+ICZtdXQgQyB7CisgICAgICAgICZtdXQgc2VsZi5oYW5kbGUKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKworICAgIHVzZSBzdGQ6OmlvOjpDdXJzb3I7CisKKyAgICB1c2Ugc3VwZXI6Oio7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX3JlYWRfY2hhbm5lbF9mcm9tX2NvbmNyZXRlX3JlYWRfdHlwZSgpIHsKKyAgICAgICAgbGV0IHIgPSBDdXJzb3I6Om5ldyhbMCwgMSwgMl0pOworICAgICAgICBsZXQgXyA9IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6Om5ldyhyKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX3JlYWRfY2hhbm5lbF9mcm9tX2JveGVkX3JlYWQoKSB7CisgICAgICAgIGxldCByOiBCb3g8UmVhZD4gPSBCb3g6Om5ldyhDdXJzb3I6Om5ldyhbMCwgMSwgMl0pKTsKKyAgICAgICAgbGV0IF8gPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0OjpuZXcocik7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV93cml0ZV9jaGFubmVsX2Zyb21fY29uY3JldGVfd3JpdGVfdHlwZSgpIHsKKyAgICAgICAgbGV0IHcgPSB2ZWMhWzB1ODsgMTBdOworICAgICAgICBsZXQgXyA9IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpuZXcodyk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV93cml0ZV9jaGFubmVsX2Zyb21fYm94ZWRfd3JpdGUoKSB7CisgICAgICAgIGxldCB3OiBCb3g8V3JpdGU+ID0gQm94OjpuZXcodmVjIVswdTg7IDEwXSk7CisgICAgICAgIGxldCBfID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6Om5ldyh3KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX3JlYWRfdHJhbnNwb3J0X2Zyb21fY29uY3JldGVfcmVhZF90cmFuc3BvcnQoKSB7CisgICAgICAgIGxldCByID0gQ3Vyc29yOjpuZXcoWzAsIDEsIDJdKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6bmV3KHIpOworICAgICAgICB0YWtlc19yZWFkX3RyYW5zcG9ydCgmbXV0IHQpCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV9yZWFkX3RyYW5zcG9ydF9mcm9tX2JveGVkX3JlYWQoKSB7CisgICAgICAgIGxldCByID0gQ3Vyc29yOjpuZXcoWzAsIDEsIDJdKTsKKyAgICAgICAgbGV0IG11dCB0OiBCb3g8VFJlYWRUcmFuc3BvcnQ+ID0gQm94OjpuZXcoVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6bmV3KHIpKTsKKyAgICAgICAgdGFrZXNfcmVhZF90cmFuc3BvcnQoJm11dCB0KQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfd3JpdGVfdHJhbnNwb3J0X2Zyb21fY29uY3JldGVfd3JpdGVfdHJhbnNwb3J0KCkgeworICAgICAgICBsZXQgdyA9IHZlYyFbMHU4OyAxMF07CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpuZXcodyk7CisgICAgICAgIHRha2VzX3dyaXRlX3RyYW5zcG9ydCgmbXV0IHQpCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV93cml0ZV90cmFuc3BvcnRfZnJvbV9ib3hlZF93cml0ZSgpIHsKKyAgICAgICAgbGV0IHcgPSB2ZWMhWzB1ODsgMTBdOworICAgICAgICBsZXQgbXV0IHQ6IEJveDxUV3JpdGVUcmFuc3BvcnQ+ID0gQm94OjpuZXcoVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6Om5ldyh3KSk7CisgICAgICAgIHRha2VzX3dyaXRlX3RyYW5zcG9ydCgmbXV0IHQpCisgICAgfQorCisgICAgZm4gdGFrZXNfcmVhZF90cmFuc3BvcnQ8Uj4odDogJm11dCBSKQorICAgIHdoZXJlCisgICAgICAgIFI6IFRSZWFkVHJhbnNwb3J0LAorICAgIHsKKyAgICAgICAgdC5ieXRlcygpOworICAgIH0KKworICAgIGZuIHRha2VzX3dyaXRlX3RyYW5zcG9ydDxXPih0OiAmbXV0IFcpCisgICAgd2hlcmUKKyAgICAgICAgVzogVFdyaXRlVHJhbnNwb3J0LAorICAgIHsKKyAgICAgICAgdC5mbHVzaCgpLnVud3JhcCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvdHJhbnNwb3J0L3NvY2tldC5ycyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L3NvY2tldC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmVmNjdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvc29ja2V0LnJzCkBAIC0wLDAgKzEsMTY4IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBzdGQ6OmNvbnZlcnQ6OkZyb207Cit1c2Ugc3RkOjppbzsKK3VzZSBzdGQ6OmlvOjp7RXJyb3JLaW5kLCBSZWFkLCBXcml0ZX07Cit1c2Ugc3RkOjpuZXQ6OntTaHV0ZG93biwgVGNwU3RyZWFtfTsKKwordXNlIHN1cGVyOjp7UmVhZEhhbGYsIFRJb0NoYW5uZWwsIFdyaXRlSGFsZn07Cit1c2Uge25ld190cmFuc3BvcnRfZXJyb3IsIFRyYW5zcG9ydEVycm9yS2luZH07CisKKy8vLyBCaWRpcmVjdGlvbmFsIFRDUC9JUCBjaGFubmVsLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGEgYFRUY3BDaGFubmVsYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSBzdGQ6OmlvOjp7UmVhZCwgV3JpdGV9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGMgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gYy5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCBidWYgPSB2ZWMhWzB1ODsgNF07CisvLy8gYy5yZWFkKCZtdXQgYnVmKS51bndyYXAoKTsKKy8vLyBjLndyaXRlKCZ2ZWMhWzAsIDEsIDJdKS51bndyYXAoKTsKKy8vLyBgYGAKKy8vLworLy8vIENyZWF0ZSBhIGBUVGNwQ2hhbm5lbGAgYnkgd3JhcHBpbmcgYW4gZXhpc3RpbmcgYFRjcFN0cmVhbWAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2Ugc3RkOjppbzo6e1JlYWQsIFdyaXRlfTsKKy8vLyB1c2Ugc3RkOjpuZXQ6OlRjcFN0cmVhbTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IHN0cmVhbSA9IFRjcFN0cmVhbTo6Y29ubmVjdCgiMTI3LjAuMC4xOjkxODkiKS51bndyYXAoKTsKKy8vLworLy8vIC8vIG5vIG5lZWQgdG8gY2FsbCBjLm9wZW4oKSBzaW5jZSB3ZSd2ZSBhbHJlYWR5IGNvbm5lY3RlZCBhYm92ZQorLy8vIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjp3aXRoX3N0cmVhbShzdHJlYW0pOworLy8vCisvLy8gbGV0IG11dCBidWYgPSB2ZWMhWzB1ODsgNF07CisvLy8gYy5yZWFkKCZtdXQgYnVmKS51bndyYXAoKTsKKy8vLyBjLndyaXRlKCZ2ZWMhWzAsIDEsIDJdKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnLCBEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVFRjcENoYW5uZWwgeworICAgIHN0cmVhbTogT3B0aW9uPFRjcFN0cmVhbT4sCit9CisKK2ltcGwgVFRjcENoYW5uZWwgeworICAgIC8vLyBDcmVhdGUgYW4gdW5pbml0aWFsaXplZCBgVFRjcENoYW5uZWxgLgorICAgIC8vLworICAgIC8vLyBUaGUgcmV0dXJuZWQgaW5zdGFuY2UgbXVzdCBiZSBvcGVuZWQgdXNpbmcgYFRUY3BDaGFubmVsOjpvcGVuKC4uLilgCisgICAgLy8vIGJlZm9yZSBpdCBjYW4gYmUgdXNlZC4KKyAgICBwdWIgZm4gbmV3KCkgLT4gVFRjcENoYW5uZWwgeworICAgICAgICBUVGNwQ2hhbm5lbCB7IHN0cmVhbTogTm9uZSB9CisgICAgfQorCisgICAgLy8vIENyZWF0ZSBhIGBUVGNwQ2hhbm5lbGAgdGhhdCB3cmFwcyBhbiBleGlzdGluZyBgVGNwU3RyZWFtYC4KKyAgICAvLy8KKyAgICAvLy8gVGhlIHBhc3NlZC1pbiBzdHJlYW0gaXMgYXNzdW1lZCB0byBoYXZlIGJlZW4gb3BlbmVkIGJlZm9yZSBiZWluZyB3cmFwcGVkCisgICAgLy8vIGJ5IHRoZSBjcmVhdGVkIGBUVGNwQ2hhbm5lbGAgaW5zdGFuY2UuCisgICAgcHViIGZuIHdpdGhfc3RyZWFtKHN0cmVhbTogVGNwU3RyZWFtKSAtPiBUVGNwQ2hhbm5lbCB7CisgICAgICAgIFRUY3BDaGFubmVsIHsKKyAgICAgICAgICAgIHN0cmVhbTogU29tZShzdHJlYW0pLAorICAgICAgICB9CisgICAgfQorCisgICAgLy8vIENvbm5lY3QgdG8gYHJlbW90ZV9hZGRyZXNzYCwgd2hpY2ggc2hvdWxkIGhhdmUgdGhlIGZvcm0gYGhvc3Q6cG9ydGAuCisgICAgcHViIGZuIG9wZW4oJm11dCBzZWxmLCByZW1vdGVfYWRkcmVzczogJnN0cikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgaWYgc2VsZi5zdHJlYW0uaXNfc29tZSgpIHsKKyAgICAgICAgICAgIEVycihuZXdfdHJhbnNwb3J0X2Vycm9yKAorICAgICAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6QWxyZWFkeU9wZW4sCisgICAgICAgICAgICAgICAgInRjcCBjb25uZWN0aW9uIHByZXZpb3VzbHkgb3BlbmVkIiwKKyAgICAgICAgICAgICkpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXRjaCBUY3BTdHJlYW06OmNvbm5lY3QoJnJlbW90ZV9hZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgT2socykgPT4geworICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbSA9IFNvbWUocyk7CisgICAgICAgICAgICAgICAgICAgIE9rKCgpKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBFcnIoZSkgPT4gRXJyKEZyb206OmZyb20oZSkpLAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8vIFNodXQgZG93biB0aGlzIGNoYW5uZWwuCisgICAgLy8vCisgICAgLy8vIEJvdGggc2VuZCBhbmQgcmVjZWl2ZSBoYWx2ZXMgYXJlIGNsb3NlZCwgYW5kIHRoaXMgaW5zdGFuY2UgY2FuIG5vCisgICAgLy8vIGxvbmdlciBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggYW5vdGhlciBlbmRwb2ludC4KKyAgICBwdWIgZm4gY2xvc2UoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlmX3NldCh8c3wgcy5zaHV0ZG93bihTaHV0ZG93bjo6Qm90aCkpCisgICAgICAgICAgICAubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIGlmX3NldDxGLCBUPigmbXV0IHNlbGYsIG11dCBzdHJlYW1fb3BlcmF0aW9uOiBGKSAtPiBpbzo6UmVzdWx0PFQ+CisgICAgd2hlcmUKKyAgICAgICAgRjogRm5NdXQoJm11dCBUY3BTdHJlYW0pIC0+IGlvOjpSZXN1bHQ8VD4sCisgICAgeworICAgICAgICBpZiBsZXQgU29tZShyZWYgbXV0IHMpID0gc2VsZi5zdHJlYW0geworICAgICAgICAgICAgc3RyZWFtX29wZXJhdGlvbihzKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRXJyKGlvOjpFcnJvcjo6bmV3KAorICAgICAgICAgICAgICAgIEVycm9yS2luZDo6Tm90Q29ubmVjdGVkLAorICAgICAgICAgICAgICAgICJ0Y3AgZW5kcG9pbnQgbm90IGNvbm5lY3RlZCIsCisgICAgICAgICAgICApKQorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIFRJb0NoYW5uZWwgZm9yIFRUY3BDaGFubmVsIHsKKyAgICBmbiBzcGxpdChzZWxmKSAtPiA6OlJlc3VsdDwoUmVhZEhhbGY8U2VsZj4sIFdyaXRlSGFsZjxTZWxmPik+CisgICAgd2hlcmUKKyAgICAgICAgU2VsZjogU2l6ZWQsCisgICAgeworICAgICAgICBsZXQgbXV0IHMgPSBzZWxmOworCisgICAgICAgIHMuc3RyZWFtCisgICAgICAgICAgICAuYXNfbXV0KCkKKyAgICAgICAgICAgIC5hbmRfdGhlbih8c3wgcy50cnlfY2xvbmUoKS5vaygpKQorICAgICAgICAgICAgLm1hcCh8Y2xvbmVkfCB7CisgICAgICAgICAgICAgICAgbGV0IHJlYWRfaGFsZiA9IFJlYWRIYWxmOjpuZXcoVFRjcENoYW5uZWwgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW06IHMuc3RyZWFtLnRha2UoKSwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBsZXQgd3JpdGVfaGFsZiA9IFdyaXRlSGFsZjo6bmV3KFRUY3BDaGFubmVsIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtOiBTb21lKGNsb25lZCksCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgKHJlYWRfaGFsZiwgd3JpdGVfaGFsZikKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICAub2tfb3JfZWxzZSh8fCB7CisgICAgICAgICAgICAgICAgbmV3X3RyYW5zcG9ydF9lcnJvcigKKyAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGNsb25lIHVuZGVybHlpbmcgdGNwIHN0cmVhbSIsCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKKyAgICB9Cit9CisKK2ltcGwgUmVhZCBmb3IgVFRjcENoYW5uZWwgeworICAgIGZuIHJlYWQoJm11dCBzZWxmLCBiOiAmbXV0IFt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgc2VsZi5pZl9zZXQofHN8IHMucmVhZChiKSkKKyAgICB9Cit9CisKK2ltcGwgV3JpdGUgZm9yIFRUY3BDaGFubmVsIHsKKyAgICBmbiB3cml0ZSgmbXV0IHNlbGYsIGI6ICZbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIHNlbGYuaWZfc2V0KHxzfCBzLndyaXRlKGIpKQorICAgIH0KKworICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gaW86OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlmX3NldCh8c3wgcy5mbHVzaCgpKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy90ZXN0L0NhcmdvLnRvbWwgYi9saWIvcnMvdGVzdC9DYXJnby50b21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZGVjMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC9DYXJnby50b21sCkBAIC0wLDAgKzEsMTUgQEAKK1twYWNrYWdlXQorbmFtZSA9ICJraXRjaGVuLXNpbmsiCit2ZXJzaW9uID0gIjAuMS4wIgorbGljZW5zZSA9ICJBcGFjaGUtMi4wIgorYXV0aG9ycyA9IFsiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Il0KK3B1Ymxpc2ggPSBmYWxzZQorCitbZGVwZW5kZW5jaWVzXQorY2xhcCA9ICI8Mi4yOC4wIgorb3JkZXJlZC1mbG9hdCA9ICIwLjMuMCIKK3RyeV9mcm9tID0gIjAuMi4wIgorCitbZGVwZW5kZW5jaWVzLnRocmlmdF0KK3BhdGggPSAiLi4vIgorCmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9ycy90ZXN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZGQ3NTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDU0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKKworc3R1YnM6IHRocmlmdHMvQmFzZV9PbmUudGhyaWZ0IHRocmlmdHMvQmFzZV9Ud28udGhyaWZ0IHRocmlmdHMvTWlkbGF5ZXIudGhyaWZ0IHRocmlmdHMvVWx0aW1hdGUudGhyaWZ0ICQodG9wX2J1aWxkZGlyKS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgJChUSFJJRlQpCisJJChUSFJJRlQpIC1JIC4vdGhyaWZ0cyAtb3V0IHNyYyAtLWdlbiBycyB0aHJpZnRzL0Jhc2VfT25lLnRocmlmdAorCSQoVEhSSUZUKSAtSSAuL3RocmlmdHMgLW91dCBzcmMgLS1nZW4gcnMgdGhyaWZ0cy9CYXNlX1R3by50aHJpZnQKKwkkKFRIUklGVCkgLUkgLi90aHJpZnRzIC1vdXQgc3JjIC0tZ2VuIHJzIHRocmlmdHMvTWlkbGF5ZXIudGhyaWZ0CisJJChUSFJJRlQpIC1JIC4vdGhyaWZ0cyAtb3V0IHNyYyAtLWdlbiBycyB0aHJpZnRzL1VsdGltYXRlLnRocmlmdAorCSQoVEhSSUZUKSAtb3V0IHNyYyAtLWdlbiBycyAkKHRvcF9idWlsZGRpcikvdGVzdC9SZWN1cnNpdmUudGhyaWZ0CisKK2NoZWNrOiBzdHVicworCSQoQ0FSR08pIGJ1aWxkCisJJChDQVJHTykgdGVzdAorCVsgLWQgYmluIF0gfHwgbWtkaXIgYmluCisJY3AgdGFyZ2V0L2RlYnVnL2tpdGNoZW5fc2lua19zZXJ2ZXIgYmluL2tpdGNoZW5fc2lua19zZXJ2ZXIKKwljcCB0YXJnZXQvZGVidWcva2l0Y2hlbl9zaW5rX2NsaWVudCBiaW4va2l0Y2hlbl9zaW5rX2NsaWVudAorCitjbGVhbi1sb2NhbDoKKwkkKENBUkdPKSBjbGVhbgorCS0kKFJNKSBDYXJnby5sb2NrCisJLSQoUk0pIHNyYy9iYXNlX29uZS5ycworCS0kKFJNKSBzcmMvYmFzZV90d28ucnMKKwktJChSTSkgc3JjL21pZGxheWVyLnJzCisJLSQoUk0pIHNyYy91bHRpbWF0ZS5ycworCS0kKFJNKSAtciBiaW4KKworRVhUUkFfRElTVCA9IFwKKwlDYXJnby50b21sIFwKKwl0aHJpZnRzL0Jhc2VfT25lLnRocmlmdCBcCisJdGhyaWZ0cy9CYXNlX1R3by50aHJpZnQgXAorCXRocmlmdHMvTWlkbGF5ZXIudGhyaWZ0IFwKKwl0aHJpZnRzL1VsdGltYXRlLnRocmlmdCBcCisJc3JjL2xpYi5ycyBcCisJc3JjL2Jpbi9raXRjaGVuX3Npbmtfc2VydmVyLnJzIFwKKwlzcmMvYmluL2tpdGNoZW5fc2lua19jbGllbnQucnMKKwpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3Qvc3JjL2Jpbi9raXRjaGVuX3NpbmtfY2xpZW50LnJzIGIvbGliL3JzL3Rlc3Qvc3JjL2Jpbi9raXRjaGVuX3NpbmtfY2xpZW50LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOTVjODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC9zcmMvYmluL2tpdGNoZW5fc2lua19jbGllbnQucnMKQEAgLTAsMCArMSwyMzkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI1ttYWNyb191c2VdCitleHRlcm4gY3JhdGUgY2xhcDsKKworZXh0ZXJuIGNyYXRlIGtpdGNoZW5fc2luazsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CisKK3VzZSBzdGQ6OmNvbnZlcnQ6OkludG87CisKK3VzZSBraXRjaGVuX3Npbms6OmJhc2VfdHdvOjp7VE5hcGtpblNlcnZpY2VTeW5jQ2xpZW50LCBUUmFtZW5TZXJ2aWNlU3luY0NsaWVudH07Cit1c2Uga2l0Y2hlbl9zaW5rOjptaWRsYXllcjo6e01lYWxTZXJ2aWNlU3luY0NsaWVudCwgVE1lYWxTZXJ2aWNlU3luY0NsaWVudH07Cit1c2Uga2l0Y2hlbl9zaW5rOjpyZWN1cnNpdmU7Cit1c2Uga2l0Y2hlbl9zaW5rOjpyZWN1cnNpdmU6OntDb1JlYywgQ29SZWMyLCBSZWNMaXN0LCBSZWNUcmVlLCBUVGVzdFNlcnZpY2VTeW5jQ2xpZW50fTsKK3VzZSBraXRjaGVuX3Npbms6OnVsdGltYXRlOjp7RnVsbE1lYWxTZXJ2aWNlU3luY0NsaWVudCwgVEZ1bGxNZWFsU2VydmljZVN5bmNDbGllbnR9OwordXNlIHRocmlmdDo6cHJvdG9jb2w6OnsKKyAgICBUQmluYXJ5SW5wdXRQcm90b2NvbCwgVEJpbmFyeU91dHB1dFByb3RvY29sLCBUQ29tcGFjdElucHV0UHJvdG9jb2wsIFRDb21wYWN0T3V0cHV0UHJvdG9jb2wsCisgICAgVElucHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbCwKK307Cit1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OnsKKyAgICBSZWFkSGFsZiwgVEZyYW1lZFJlYWRUcmFuc3BvcnQsIFRGcmFtZWRXcml0ZVRyYW5zcG9ydCwgVElvQ2hhbm5lbCwgVFRjcENoYW5uZWwsIFdyaXRlSGFsZiwKK307CisKK2ZuIG1haW4oKSB7CisgICAgbWF0Y2ggcnVuKCkgeworICAgICAgICBPaygoKSkgPT4gcHJpbnRsbiEoImtpdGNoZW4gc2luayBjbGllbnQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSIpLAorICAgICAgICBFcnIoZSkgPT4geworICAgICAgICAgICAgcHJpbnRsbiEoImtpdGNoZW4gc2luayBjbGllbnQgZmFpbGVkIHdpdGggZXJyb3Igezo/fSIsIGUpOworICAgICAgICAgICAgc3RkOjpwcm9jZXNzOjpleGl0KDEpOworICAgICAgICB9CisgICAgfQorfQorCitmbiBydW4oKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIGxldCBtYXRjaGVzID0gY2xhcF9hcHAhKHJ1c3Rfa2l0Y2hlbl9zaW5rX2NsaWVudCA9PgorICAgICAgICAodmVyc2lvbjogIjAuMS4wIikKKyAgICAgICAgKGF1dGhvcjogIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiIpCisgICAgICAgIChhYm91dDogIlRocmlmdCBSdXN0IGtpdGNoZW4gc2luayBjbGllbnQiKQorICAgICAgICAoQGFyZyBob3N0OiAtLWhvc3QgK3Rha2VzX3ZhbHVlICJIb3N0IG9uIHdoaWNoIHRoZSBUaHJpZnQgdGVzdCBzZXJ2ZXIgaXMgbG9jYXRlZCIpCisgICAgICAgIChAYXJnIHBvcnQ6IC0tcG9ydCArdGFrZXNfdmFsdWUgIlBvcnQgb24gd2hpY2ggdGhlIFRocmlmdCB0ZXN0IHNlcnZlciBpcyBsaXN0ZW5pbmciKQorICAgICAgICAoQGFyZyBwcm90b2NvbDogLS1wcm90b2NvbCArdGFrZXNfdmFsdWUgIlRocmlmdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiB0byB1c2UgKFwiYmluYXJ5XCIsIFwiY29tcGFjdFwiKSIpCisgICAgICAgIChAYXJnIHNlcnZpY2U6IC0tc2VydmljZSArdGFrZXNfdmFsdWUgIlNlcnZpY2UgdHlwZSB0byBjb250YWN0IChcInBhcnRcIiwgXCJmdWxsXCIsIFwicmVjdXJzaXZlXCIpIikKKyAgICApCisgICAgICAgICAgICAuZ2V0X21hdGNoZXMoKTsKKworICAgIGxldCBob3N0ID0gbWF0Y2hlcy52YWx1ZV9vZigiaG9zdCIpLnVud3JhcF9vcigiMTI3LjAuMC4xIik7CisgICAgbGV0IHBvcnQgPSB2YWx1ZV90IShtYXRjaGVzLCAicG9ydCIsIHUxNikudW53cmFwX29yKDkwOTApOworICAgIGxldCBwcm90b2NvbCA9IG1hdGNoZXMudmFsdWVfb2YoInByb3RvY29sIikudW53cmFwX29yKCJjb21wYWN0Iik7CisgICAgbGV0IHNlcnZpY2UgPSBtYXRjaGVzLnZhbHVlX29mKCJzZXJ2aWNlIikudW53cmFwX29yKCJwYXJ0Iik7CisKKyAgICBsZXQgKGlfY2hhbiwgb19jaGFuKSA9IHRjcF9jaGFubmVsKGhvc3QsIHBvcnQpPzsKKyAgICBsZXQgKGlfdHJhbiwgb190cmFuKSA9ICgKKyAgICAgICAgVEZyYW1lZFJlYWRUcmFuc3BvcnQ6Om5ldyhpX2NoYW4pLAorICAgICAgICBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhvX2NoYW4pLAorICAgICk7CisKKyAgICBsZXQgKGlfcHJvdCwgb19wcm90KTogKEJveDxUSW5wdXRQcm90b2NvbD4sIEJveDxUT3V0cHV0UHJvdG9jb2w+KSA9IG1hdGNoIHByb3RvY29sIHsKKyAgICAgICAgImJpbmFyeSIgPT4gKAorICAgICAgICAgICAgQm94OjpuZXcoVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhpX3RyYW4sIHRydWUpKSwKKyAgICAgICAgICAgIEJveDo6bmV3KFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KG9fdHJhbiwgdHJ1ZSkpLAorICAgICAgICApLAorICAgICAgICAiY29tcGFjdCIgPT4gKAorICAgICAgICAgICAgQm94OjpuZXcoVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcoaV90cmFuKSksCisgICAgICAgICAgICBCb3g6Om5ldyhUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcob190cmFuKSksCisgICAgICAgICksCisgICAgICAgIHVubWF0Y2hlZCA9PiByZXR1cm4gRXJyKGZvcm1hdCEoInVuc3VwcG9ydGVkIHByb3RvY29sIHt9IiwgdW5tYXRjaGVkKS5pbnRvKCkpLAorICAgIH07CisKKyAgICBydW5fY2xpZW50KHNlcnZpY2UsIGlfcHJvdCwgb19wcm90KQorfQorCitmbiBydW5fY2xpZW50KAorICAgIHNlcnZpY2U6ICZzdHIsCisgICAgaV9wcm90OiBCb3g8VElucHV0UHJvdG9jb2w+LAorICAgIG9fcHJvdDogQm94PFRPdXRwdXRQcm90b2NvbD4sCispIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgbWF0Y2ggc2VydmljZSB7CisgICAgICAgICJmdWxsIiA9PiBleGVjX2Z1bGxfbWVhbF9jbGllbnQoaV9wcm90LCBvX3Byb3QpLAorICAgICAgICAicGFydCIgPT4gZXhlY19tZWFsX2NsaWVudChpX3Byb3QsIG9fcHJvdCksCisgICAgICAgICJyZWN1cnNpdmUiID0+IGV4ZWNfcmVjdXJzaXZlX2NsaWVudChpX3Byb3QsIG9fcHJvdCksCisgICAgICAgIF8gPT4gRXJyKHRocmlmdDo6RXJyb3I6OmZyb20oZm9ybWF0ISgKKyAgICAgICAgICAgICJ1bmtub3duIHNlcnZpY2UgdHlwZSB7fSIsCisgICAgICAgICAgICBzZXJ2aWNlCisgICAgICAgICkpKSwKKyAgICB9Cit9CisKK2ZuIHRjcF9jaGFubmVsKAorICAgIGhvc3Q6ICZzdHIsCisgICAgcG9ydDogdTE2LAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoUmVhZEhhbGY8VFRjcENoYW5uZWw+LCBXcml0ZUhhbGY8VFRjcENoYW5uZWw+KT4geworICAgIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKyAgICBjLm9wZW4oJmZvcm1hdCEoInt9Ont9IiwgaG9zdCwgcG9ydCkpPzsKKyAgICBjLnNwbGl0KCkKK30KKworZm4gZXhlY19tZWFsX2NsaWVudCgKKyAgICBpX3Byb3Q6IEJveDxUSW5wdXRQcm90b2NvbD4sCisgICAgb19wcm90OiBCb3g8VE91dHB1dFByb3RvY29sPiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgbXV0IGNsaWVudCA9IE1lYWxTZXJ2aWNlU3luY0NsaWVudDo6bmV3KGlfcHJvdCwgb19wcm90KTsKKworICAgIC8vIGNsaWVudC5mdWxsX21lYWwoKTsgLy8gPC0tIElNUE9SVEFOVDogaWYgeW91IHVuY29tbWVudCB0aGlzLCBjb21waWxhdGlvbiAqc2hvdWxkKiBmYWlsCisgICAgLy8gdGhpcyBpcyBiZWNhdXNlIHRoZSBNZWFsU2VydmljZSBzdHJ1Y3QgZG9lcyBub3QgY29udGFpbiB0aGUgYXBwcm9wcmlhdGUgc2VydmljZSBtYXJrZXIKKworICAgIC8vIG9ubHkgdGhlIGZvbGxvd2luZyB0aHJlZSBjYWxscyB3b3JrCisgICAgZXhlY3V0ZV9jYWxsKCJwYXJ0IiwgInJhbWVuIiwgfHwgY2xpZW50LnJhbWVuKDUwKSkubWFwKHxffCAoKSk/OworICAgIGV4ZWN1dGVfY2FsbCgicGFydCIsICJtZWFsIiwgfHwgY2xpZW50Lm1lYWwoKSkubWFwKHxffCAoKSk/OworICAgIGV4ZWN1dGVfY2FsbCgicGFydCIsICJuYXBraW4iLCB8fCBjbGllbnQubmFwa2luKCkpLm1hcCh8X3wgKCkpPzsKKworICAgIE9rKCgpKQorfQorCitmbiBleGVjX2Z1bGxfbWVhbF9jbGllbnQoCisgICAgaV9wcm90OiBCb3g8VElucHV0UHJvdG9jb2w+LAorICAgIG9fcHJvdDogQm94PFRPdXRwdXRQcm90b2NvbD4sCispIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgbGV0IG11dCBjbGllbnQgPSBGdWxsTWVhbFNlcnZpY2VTeW5jQ2xpZW50OjpuZXcoaV9wcm90LCBvX3Byb3QpOworCisgICAgZXhlY3V0ZV9jYWxsKCJmdWxsIiwgInJhbWVuIiwgfHwgY2xpZW50LnJhbWVuKDEwMCkpLm1hcCh8X3wgKCkpPzsKKyAgICBleGVjdXRlX2NhbGwoImZ1bGwiLCAibWVhbCIsIHx8IGNsaWVudC5tZWFsKCkpLm1hcCh8X3wgKCkpPzsKKyAgICBleGVjdXRlX2NhbGwoImZ1bGwiLCAibmFwa2luIiwgfHwgY2xpZW50Lm5hcGtpbigpKS5tYXAofF98ICgpKT87CisgICAgZXhlY3V0ZV9jYWxsKCJmdWxsIiwgImZ1bGwgbWVhbCIsIHx8IGNsaWVudC5mdWxsX21lYWwoKSkubWFwKHxffCAoKSk/OworCisgICAgT2soKCkpCit9CisKK2ZuIGV4ZWNfcmVjdXJzaXZlX2NsaWVudCgKKyAgICBpX3Byb3Q6IEJveDxUSW5wdXRQcm90b2NvbD4sCisgICAgb19wcm90OiBCb3g8VE91dHB1dFByb3RvY29sPiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgbXV0IGNsaWVudCA9IHJlY3Vyc2l2ZTo6VGVzdFNlcnZpY2VTeW5jQ2xpZW50OjpuZXcoaV9wcm90LCBvX3Byb3QpOworCisgICAgbGV0IHRyZWUgPSBSZWNUcmVlIHsKKyAgICAgICAgY2hpbGRyZW46IFNvbWUodmVjIVtCb3g6Om5ldyhSZWNUcmVlIHsKKyAgICAgICAgICAgIGNoaWxkcmVuOiBTb21lKHZlYyFbCisgICAgICAgICAgICAgICAgQm94OjpuZXcoUmVjVHJlZSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBOb25lLAorICAgICAgICAgICAgICAgICAgICBpdGVtOiBTb21lKDMpLAorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgIEJveDo6bmV3KFJlY1RyZWUgeworICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgaXRlbTogU29tZSg0KSwKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgIF0pLAorICAgICAgICAgICAgaXRlbTogU29tZSgyKSwKKyAgICAgICAgfSldKSwKKyAgICAgICAgaXRlbTogU29tZSgxKSwKKyAgICB9OworCisgICAgbGV0IGV4cGVjdGVkX3RyZWUgPSBSZWNUcmVlIHsKKyAgICAgICAgY2hpbGRyZW46IFNvbWUodmVjIVtCb3g6Om5ldyhSZWNUcmVlIHsKKyAgICAgICAgICAgIGNoaWxkcmVuOiBTb21lKHZlYyFbCisgICAgICAgICAgICAgICAgQm94OjpuZXcoUmVjVHJlZSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBTb21lKFZlYzo6bmV3KCkpLCAvLyByZW1vdGUgcmV0dXJucyBhbiBlbXB0eSBsaXN0CisgICAgICAgICAgICAgICAgICAgIGl0ZW06IFNvbWUoMyksCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgQm94OjpuZXcoUmVjVHJlZSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBTb21lKFZlYzo6bmV3KCkpLCAvLyByZW1vdGUgcmV0dXJucyBhbiBlbXB0eSBsaXN0CisgICAgICAgICAgICAgICAgICAgIGl0ZW06IFNvbWUoNCksCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICBdKSwKKyAgICAgICAgICAgIGl0ZW06IFNvbWUoMiksCisgICAgICAgIH0pXSksCisgICAgICAgIGl0ZW06IFNvbWUoMSksCisgICAgfTsKKworICAgIGxldCByZXR1cm5lZF90cmVlID0gZXhlY3V0ZV9jYWxsKCJyZWN1cnNpdmUiLCAiZWNob190cmVlIiwgfHwgY2xpZW50LmVjaG9fdHJlZSh0cmVlLmNsb25lKCkpKT87CisgICAgaWYgcmV0dXJuZWRfdHJlZSAhPSBleHBlY3RlZF90cmVlIHsKKyAgICAgICAgcmV0dXJuIEVycihmb3JtYXQhKAorICAgICAgICAgICAgIm1pc21hdGNoZWQgcmVjdXJzaXZlIHRyZWUgezo/fSB7Oj99IiwKKyAgICAgICAgICAgIGV4cGVjdGVkX3RyZWUsIHJldHVybmVkX3RyZWUKKyAgICAgICAgKQorICAgICAgICAuaW50bygpKTsKKyAgICB9CisKKyAgICBsZXQgbGlzdCA9IFJlY0xpc3QgeworICAgICAgICBuZXh0aXRlbTogU29tZShCb3g6Om5ldyhSZWNMaXN0IHsKKyAgICAgICAgICAgIG5leHRpdGVtOiBTb21lKEJveDo6bmV3KFJlY0xpc3QgeworICAgICAgICAgICAgICAgIG5leHRpdGVtOiBOb25lLAorICAgICAgICAgICAgICAgIGl0ZW06IFNvbWUoMyksCisgICAgICAgICAgICB9KSksCisgICAgICAgICAgICBpdGVtOiBTb21lKDIpLAorICAgICAgICB9KSksCisgICAgICAgIGl0ZW06IFNvbWUoMSksCisgICAgfTsKKyAgICBsZXQgcmV0dXJuZWRfbGlzdCA9IGV4ZWN1dGVfY2FsbCgicmVjdXJzaXZlIiwgImVjaG9fbGlzdCIsIHx8IGNsaWVudC5lY2hvX2xpc3QobGlzdC5jbG9uZSgpKSk/OworICAgIGlmIHJldHVybmVkX2xpc3QgIT0gbGlzdCB7CisgICAgICAgIHJldHVybiBFcnIoZm9ybWF0ISgibWlzbWF0Y2hlZCByZWN1cnNpdmUgbGlzdCB7Oj99IHs6P30iLCBsaXN0LCByZXR1cm5lZF9saXN0KS5pbnRvKCkpOworICAgIH0KKworICAgIGxldCBjb19yZWMgPSBDb1JlYyB7CisgICAgICAgIG90aGVyOiBTb21lKEJveDo6bmV3KENvUmVjMiB7CisgICAgICAgICAgICBvdGhlcjogU29tZShDb1JlYyB7CisgICAgICAgICAgICAgICAgb3RoZXI6IFNvbWUoQm94OjpuZXcoQ29SZWMyIHsgb3RoZXI6IE5vbmUgfSkpLAorICAgICAgICAgICAgfSksCisgICAgICAgIH0pKSwKKyAgICB9OworICAgIGxldCByZXR1cm5lZF9jb19yZWMgPSBleGVjdXRlX2NhbGwoInJlY3Vyc2l2ZSIsICJlY2hvX2NvX3JlYyIsIHx8IHsKKyAgICAgICAgY2xpZW50LmVjaG9fY29fcmVjKGNvX3JlYy5jbG9uZSgpKQorICAgIH0pPzsKKyAgICBpZiByZXR1cm5lZF9jb19yZWMgIT0gY29fcmVjIHsKKyAgICAgICAgcmV0dXJuIEVycihmb3JtYXQhKCJtaXNtYXRjaGVkIGNvX3JlYyB7Oj99IHs6P30iLCBjb19yZWMsIHJldHVybmVkX2NvX3JlYykuaW50bygpKTsKKyAgICB9CisKKyAgICBPaygoKSkKK30KKworZm4gZXhlY3V0ZV9jYWxsPEYsIFI+KHNlcnZpY2VfdHlwZTogJnN0ciwgY2FsbF9uYW1lOiAmc3RyLCBtdXQgZjogRikgLT4gdGhyaWZ0OjpSZXN1bHQ8Uj4KK3doZXJlCisgICAgRjogRm5NdXQoKSAtPiB0aHJpZnQ6OlJlc3VsdDxSPiwKK3sKKyAgICBsZXQgcmVzID0gZigpOworCisgICAgbWF0Y2ggcmVzIHsKKyAgICAgICAgT2soXykgPT4gcHJpbnRsbiEoInt9OiBjb21wbGV0ZWQge30gY2FsbCIsIHNlcnZpY2VfdHlwZSwgY2FsbF9uYW1lKSwKKyAgICAgICAgRXJyKHJlZiBlKSA9PiBwcmludGxuISgKKyAgICAgICAgICAgICJ7fTogZmFpbGVkIHt9IGNhbGwgd2l0aCBlcnJvciB7Oj99IiwKKyAgICAgICAgICAgIHNlcnZpY2VfdHlwZSwgY2FsbF9uYW1lLCBlCisgICAgICAgICksCisgICAgfQorCisgICAgcmVzCit9CmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC9zcmMvYmluL2tpdGNoZW5fc2lua19zZXJ2ZXIucnMgYi9saWIvcnMvdGVzdC9zcmMvYmluL2tpdGNoZW5fc2lua19zZXJ2ZXIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM4MDFlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy90ZXN0L3NyYy9iaW4va2l0Y2hlbl9zaW5rX3NlcnZlci5ycwpAQCAtMCwwICsxLDMxMyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjW21hY3JvX3VzZV0KK2V4dGVybiBjcmF0ZSBjbGFwOworZXh0ZXJuIGNyYXRlIGtpdGNoZW5fc2luazsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CisKK3VzZSB0aHJpZnQ6OnByb3RvY29sOjp7CisgICAgVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5LCBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgIFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBUSW5wdXRQcm90b2NvbEZhY3RvcnksIFRPdXRwdXRQcm90b2NvbEZhY3RvcnksCit9OwordXNlIHRocmlmdDo6c2VydmVyOjpUU2VydmVyOwordXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7CisgICAgVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5LCBUUmVhZFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSwKK307CisKK3VzZSBraXRjaGVuX3Npbms6OmJhc2Vfb25lOjpOb29kbGU7Cit1c2Uga2l0Y2hlbl9zaW5rOjpiYXNlX3R3bzo6eworICAgIEJyb3RoVHlwZSwgTmFwa2luLCBOYXBraW5TZXJ2aWNlU3luY0hhbmRsZXIsIFJhbWVuLCBSYW1lblNlcnZpY2VTeW5jSGFuZGxlciwKK307Cit1c2Uga2l0Y2hlbl9zaW5rOjptaWRsYXllcjo6eworICAgIERlc3NlcnQsIE1lYWwsIE1lYWxTZXJ2aWNlU3luY0hhbmRsZXIsIE1lYWxTZXJ2aWNlU3luY1Byb2Nlc3NvciwgUGllLAorfTsKK3VzZSBraXRjaGVuX3Npbms6OnJlY3Vyc2l2ZTsKK3VzZSBraXRjaGVuX3Npbms6OnVsdGltYXRlOjpGdWxsTWVhbEFuZERyaW5rc1NlcnZpY2VTeW5jSGFuZGxlcjsKK3VzZSBraXRjaGVuX3Npbms6OnVsdGltYXRlOjp7CisgICAgRHJpbmssIEZ1bGxNZWFsLCBGdWxsTWVhbEFuZERyaW5rcywgRnVsbE1lYWxBbmREcmlua3NTZXJ2aWNlU3luY1Byb2Nlc3NvciwKKyAgICBGdWxsTWVhbFNlcnZpY2VTeW5jSGFuZGxlciwKK307CisKK2ZuIG1haW4oKSB7CisgICAgbWF0Y2ggcnVuKCkgeworICAgICAgICBPaygoKSkgPT4gcHJpbnRsbiEoImtpdGNoZW4gc2luayBzZXJ2ZXIgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSIpLAorICAgICAgICBFcnIoZSkgPT4geworICAgICAgICAgICAgcHJpbnRsbiEoImtpdGNoZW4gc2luayBzZXJ2ZXIgZmFpbGVkIHdpdGggZXJyb3Igezo/fSIsIGUpOworICAgICAgICAgICAgc3RkOjpwcm9jZXNzOjpleGl0KDEpOworICAgICAgICB9CisgICAgfQorfQorCitmbiBydW4oKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIGxldCBtYXRjaGVzID0gY2xhcF9hcHAhKHJ1c3Rfa2l0Y2hlbl9zaW5rX3NlcnZlciA9PgorICAgICAgICAodmVyc2lvbjogIjAuMS4wIikKKyAgICAgICAgKGF1dGhvcjogIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiIpCisgICAgICAgIChhYm91dDogIlRocmlmdCBSdXN0IGtpdGNoZW4gc2luayB0ZXN0IHNlcnZlciIpCisgICAgICAgIChAYXJnIHBvcnQ6IC0tcG9ydCArdGFrZXNfdmFsdWUgInBvcnQgb24gd2hpY2ggdGhlIHRlc3Qgc2VydmVyIGxpc3RlbnMiKQorICAgICAgICAoQGFyZyBwcm90b2NvbDogLS1wcm90b2NvbCArdGFrZXNfdmFsdWUgIlRocmlmdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiB0byB1c2UgKFwiYmluYXJ5XCIsIFwiY29tcGFjdFwiKSIpCisgICAgICAgIChAYXJnIHNlcnZpY2U6IC0tc2VydmljZSArdGFrZXNfdmFsdWUgIlNlcnZpY2UgdHlwZSB0byBjb250YWN0IChcInBhcnRcIiwgXCJmdWxsXCIsIFwicmVjdXJzaXZlXCIpIikKKyAgICApCisgICAgICAgICAgICAuZ2V0X21hdGNoZXMoKTsKKworICAgIGxldCBwb3J0ID0gdmFsdWVfdCEobWF0Y2hlcywgInBvcnQiLCB1MTYpLnVud3JhcF9vcig5MDkwKTsKKyAgICBsZXQgcHJvdG9jb2wgPSBtYXRjaGVzLnZhbHVlX29mKCJwcm90b2NvbCIpLnVud3JhcF9vcigiY29tcGFjdCIpOworICAgIGxldCBzZXJ2aWNlID0gbWF0Y2hlcy52YWx1ZV9vZigic2VydmljZSIpLnVud3JhcF9vcigicGFydCIpOworICAgIGxldCBsaXN0ZW5fYWRkcmVzcyA9IGZvcm1hdCEoIjEyNy4wLjAuMTp7fSIsIHBvcnQpOworCisgICAgcHJpbnRsbiEoImJpbmRpbmcgdG8ge30iLCBsaXN0ZW5fYWRkcmVzcyk7CisKKyAgICBsZXQgcl90cmFuc3BvcnRfZmFjdG9yeSA9IFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCk7CisgICAgbGV0IHdfdHJhbnNwb3J0X2ZhY3RvcnkgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5OjpuZXcoKTsKKworICAgIGxldCAoaV9wcm90b2NvbF9mYWN0b3J5LCBvX3Byb3RvY29sX2ZhY3RvcnkpOiAoCisgICAgICAgIEJveDxUSW5wdXRQcm90b2NvbEZhY3Rvcnk+LAorICAgICAgICBCb3g8VE91dHB1dFByb3RvY29sRmFjdG9yeT4sCisgICAgKSA9IG1hdGNoICYqcHJvdG9jb2wgeworICAgICAgICAiYmluYXJ5IiA9PiAoCisgICAgICAgICAgICBCb3g6Om5ldyhUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKSwKKyAgICAgICAgICAgIEJveDo6bmV3KFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKSwKKyAgICAgICAgKSwKKyAgICAgICAgImNvbXBhY3QiID0+ICgKKyAgICAgICAgICAgIEJveDo6bmV3KFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKSwKKyAgICAgICAgICAgIEJveDo6bmV3KFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSksCisgICAgICAgICksCisgICAgICAgIHVua25vd24gPT4geworICAgICAgICAgICAgcmV0dXJuIEVycihmb3JtYXQhKCJ1bnN1cHBvcnRlZCB0cmFuc3BvcnQgdHlwZSB7fSIsIHVua25vd24pLmludG8oKSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gRklYTUU6IHNob3VsZCBwcm9jZXNzb3IgYmUgYm94ZWQgYXMgd2VsbD8KKyAgICAvLworICAgIC8vIFtzaWdoXSBJIGhhdGUgUnVzdCBnZW5lcmljcyBpbXBsZW1lbnRhdGlvbgorICAgIC8vCisgICAgLy8gSSB3b3VsZCBoYXZlIHByZWZlcnJlZCB0byBidWlsZCBhIHNlcnZlciBoZXJlLCByZXR1cm4gaXQsIGFuZCB0aGVuIGRvCisgICAgLy8gdGhlIGNvbW1vbiBsaXN0ZW4tYW5kLWhhbmRsZSBzdHVmZiwgYnV0IHNpbmNlIHRoZSBzZXJ2ZXIgZG9lc24ndCBoYXZlIGEKKyAgICAvLyBjb21tb24gdHlwZSAoYmVjYXVzZSBlYWNoIG1hdGNoIGFybSBpbnN0YW50aWF0ZXMgYSBzZXJ2ZXIgd2l0aCBhCisgICAgLy8gZGlmZmVyZW50IHByb2Nlc3NvcikgdGhpcyBpc24ndCBwb3NzaWJsZS4KKyAgICAvLworICAgIC8vIFNpbmNlIHdoYXQgSSdtIGRvaW5nIGlzIHVuY29tbW9uIEknbSBqdXN0IGdvaW5nIHRvIGR1cGxpY2F0ZSB0aGUgY29kZQorICAgIG1hdGNoICYqc2VydmljZSB7CisgICAgICAgICJwYXJ0IiA9PiBydW5fbWVhbF9zZXJ2ZXIoCisgICAgICAgICAgICAmbGlzdGVuX2FkZHJlc3MsCisgICAgICAgICAgICByX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgaV9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgd190cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgIG9fcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgKSwKKyAgICAgICAgImZ1bGwiID0+IHJ1bl9mdWxsX21lYWxfc2VydmVyKAorICAgICAgICAgICAgJmxpc3Rlbl9hZGRyZXNzLAorICAgICAgICAgICAgcl90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgIGlfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgIHdfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICBvX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICksCisgICAgICAgICJyZWN1cnNpdmUiID0+IHJ1bl9yZWN1cnNpdmVfc2VydmVyKAorICAgICAgICAgICAgJmxpc3Rlbl9hZGRyZXNzLAorICAgICAgICAgICAgcl90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgIGlfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgIHdfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICBvX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICksCisgICAgICAgIHVua25vd24gPT4gRXJyKGZvcm1hdCEoInVuc3VwcG9ydGVkIHNlcnZpY2UgdHlwZSB7fSIsIHVua25vd24pLmludG8oKSksCisgICAgfQorfQorCitmbiBydW5fbWVhbF9zZXJ2ZXI8UlRGLCBJUEYsIFdURiwgT1BGPigKKyAgICBsaXN0ZW5fYWRkcmVzczogJnN0ciwKKyAgICByX3RyYW5zcG9ydF9mYWN0b3J5OiBSVEYsCisgICAgaV9wcm90b2NvbF9mYWN0b3J5OiBJUEYsCisgICAgd190cmFuc3BvcnRfZmFjdG9yeTogV1RGLAorICAgIG9fcHJvdG9jb2xfZmFjdG9yeTogT1BGLAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4KK3doZXJlCisgICAgUlRGOiBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIElQRjogVElucHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBXVEY6IFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIE9QRjogVE91dHB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCit7CisgICAgbGV0IHByb2Nlc3NvciA9IE1lYWxTZXJ2aWNlU3luY1Byb2Nlc3Nvcjo6bmV3KFBhcnRIYW5kbGVyIHt9KTsKKyAgICBsZXQgbXV0IHNlcnZlciA9IFRTZXJ2ZXI6Om5ldygKKyAgICAgICAgcl90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgaV9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICB3X3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICBvX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgIHByb2Nlc3NvciwKKyAgICAgICAgMSwKKyAgICApOworCisgICAgc2VydmVyLmxpc3RlbihsaXN0ZW5fYWRkcmVzcykKK30KKworZm4gcnVuX2Z1bGxfbWVhbF9zZXJ2ZXI8UlRGLCBJUEYsIFdURiwgT1BGPigKKyAgICBsaXN0ZW5fYWRkcmVzczogJnN0ciwKKyAgICByX3RyYW5zcG9ydF9mYWN0b3J5OiBSVEYsCisgICAgaV9wcm90b2NvbF9mYWN0b3J5OiBJUEYsCisgICAgd190cmFuc3BvcnRfZmFjdG9yeTogV1RGLAorICAgIG9fcHJvdG9jb2xfZmFjdG9yeTogT1BGLAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4KK3doZXJlCisgICAgUlRGOiBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIElQRjogVElucHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBXVEY6IFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIE9QRjogVE91dHB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCit7CisgICAgbGV0IHByb2Nlc3NvciA9IEZ1bGxNZWFsQW5kRHJpbmtzU2VydmljZVN5bmNQcm9jZXNzb3I6Om5ldyhGdWxsSGFuZGxlciB7fSk7CisgICAgbGV0IG11dCBzZXJ2ZXIgPSBUU2VydmVyOjpuZXcoCisgICAgICAgIHJfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgIGlfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgd190cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgb19wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICBwcm9jZXNzb3IsCisgICAgICAgIDEsCisgICAgKTsKKworICAgIHNlcnZlci5saXN0ZW4obGlzdGVuX2FkZHJlc3MpCit9CisKK3N0cnVjdCBQYXJ0SGFuZGxlcjsKKworaW1wbCBNZWFsU2VydmljZVN5bmNIYW5kbGVyIGZvciBQYXJ0SGFuZGxlciB7CisgICAgZm4gaGFuZGxlX21lYWwoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PE1lYWw+IHsKKyAgICAgICAgcHJpbnRsbiEoInBhcnQ6IGhhbmRsaW5nIG1lYWwgY2FsbCIpOworICAgICAgICBPayhtZWFsKCkpCisgICAgfQorfQorCitpbXBsIFJhbWVuU2VydmljZVN5bmNIYW5kbGVyIGZvciBQYXJ0SGFuZGxlciB7CisgICAgZm4gaGFuZGxlX3JhbWVuKCZzZWxmLCBfOiBpMzIpIC0+IHRocmlmdDo6UmVzdWx0PFJhbWVuPiB7CisgICAgICAgIHByaW50bG4hKCJwYXJ0OiBoYW5kbGluZyByYW1lbiBjYWxsIik7CisgICAgICAgIE9rKHJhbWVuKCkpCisgICAgfQorfQorCitpbXBsIE5hcGtpblNlcnZpY2VTeW5jSGFuZGxlciBmb3IgUGFydEhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9uYXBraW4oJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PE5hcGtpbj4geworICAgICAgICBwcmludGxuISgicGFydDogaGFuZGxpbmcgbmFwa2luIGNhbGwiKTsKKyAgICAgICAgT2sobmFwa2luKCkpCisgICAgfQorfQorCisvLyBmdWxsIHNlcnZpY2UKKy8vCisKK3N0cnVjdCBGdWxsSGFuZGxlcjsKKworaW1wbCBGdWxsTWVhbEFuZERyaW5rc1NlcnZpY2VTeW5jSGFuZGxlciBmb3IgRnVsbEhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9mdWxsX21lYWxfYW5kX2RyaW5rcygmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8RnVsbE1lYWxBbmREcmlua3M+IHsKKyAgICAgICAgcHJpbnRsbiEoImZ1bGxfbWVhbF9hbmRfZHJpbmtzOiBoYW5kbGluZyBmdWxsIG1lYWwgYW5kIGRyaW5rcyBjYWxsIik7CisgICAgICAgIE9rKEZ1bGxNZWFsQW5kRHJpbmtzOjpuZXcoZnVsbF9tZWFsKCksIERyaW5rOjpDYW5hZGlhbldoaXNreSkpCisgICAgfQorCisgICAgZm4gaGFuZGxlX2Jlc3RfcGllKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDxQaWU+IHsKKyAgICAgICAgcHJpbnRsbiEoImZ1bGxfbWVhbF9hbmRfZHJpbmtzOiBoYW5kbGluZyBwaWUgY2FsbCIpOworICAgICAgICBPayhQaWU6Ok1pc3Npc3NpcHBpTXVkKSAvLyBJIHByZWZlciBQaWU6OlB1bXBraW4sIGJ1dCBJIGhhdmUgdG8gY2hlY2sgdGhhdCBjYXNpbmcgd29ya3MKKyAgICB9Cit9CisKK2ltcGwgRnVsbE1lYWxTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIEZ1bGxIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfZnVsbF9tZWFsKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDxGdWxsTWVhbD4geworICAgICAgICBwcmludGxuISgiZnVsbDogaGFuZGxpbmcgZnVsbCBtZWFsIGNhbGwiKTsKKyAgICAgICAgT2soZnVsbF9tZWFsKCkpCisgICAgfQorfQorCitpbXBsIE1lYWxTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIEZ1bGxIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfbWVhbCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8TWVhbD4geworICAgICAgICBwcmludGxuISgiZnVsbDogaGFuZGxpbmcgbWVhbCBjYWxsIik7CisgICAgICAgIE9rKG1lYWwoKSkKKyAgICB9Cit9CisKK2ltcGwgUmFtZW5TZXJ2aWNlU3luY0hhbmRsZXIgZm9yIEZ1bGxIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfcmFtZW4oJnNlbGYsIF86IGkzMikgLT4gdGhyaWZ0OjpSZXN1bHQ8UmFtZW4+IHsKKyAgICAgICAgcHJpbnRsbiEoImZ1bGw6IGhhbmRsaW5nIHJhbWVuIGNhbGwiKTsKKyAgICAgICAgT2socmFtZW4oKSkKKyAgICB9Cit9CisKK2ltcGwgTmFwa2luU2VydmljZVN5bmNIYW5kbGVyIGZvciBGdWxsSGFuZGxlciB7CisgICAgZm4gaGFuZGxlX25hcGtpbigmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8TmFwa2luPiB7CisgICAgICAgIHByaW50bG4hKCJmdWxsOiBoYW5kbGluZyBuYXBraW4gY2FsbCIpOworICAgICAgICBPayhuYXBraW4oKSkKKyAgICB9Cit9CisKK2ZuIGZ1bGxfbWVhbCgpIC0+IEZ1bGxNZWFsIHsKKyAgICBGdWxsTWVhbDo6bmV3KG1lYWwoKSwgRGVzc2VydDo6UG9ydCgiR3JhaGFtJ3MgVGF3bnkiLnRvX293bmVkKCkpKQorfQorCitmbiBtZWFsKCkgLT4gTWVhbCB7CisgICAgTWVhbDo6bmV3KG5vb2RsZSgpLCByYW1lbigpKQorfQorCitmbiBub29kbGUoKSAtPiBOb29kbGUgeworICAgIE5vb2RsZTo6bmV3KCJzcGVsdCIudG9fb3duZWQoKSwgMTAwKQorfQorCitmbiByYW1lbigpIC0+IFJhbWVuIHsKKyAgICBSYW1lbjo6bmV3KCJNciBSYW1lbiIudG9fb3duZWQoKSwgNzIsIEJyb3RoVHlwZTo6TWlzbykKK30KKworZm4gbmFwa2luKCkgLT4gTmFwa2luIHsKKyAgICBOYXBraW4ge30KK30KKworZm4gcnVuX3JlY3Vyc2l2ZV9zZXJ2ZXI8UlRGLCBJUEYsIFdURiwgT1BGPigKKyAgICBsaXN0ZW5fYWRkcmVzczogJnN0ciwKKyAgICByX3RyYW5zcG9ydF9mYWN0b3J5OiBSVEYsCisgICAgaV9wcm90b2NvbF9mYWN0b3J5OiBJUEYsCisgICAgd190cmFuc3BvcnRfZmFjdG9yeTogV1RGLAorICAgIG9fcHJvdG9jb2xfZmFjdG9yeTogT1BGLAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4KK3doZXJlCisgICAgUlRGOiBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIElQRjogVElucHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBXVEY6IFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIE9QRjogVE91dHB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCit7CisgICAgbGV0IHByb2Nlc3NvciA9IHJlY3Vyc2l2ZTo6VGVzdFNlcnZpY2VTeW5jUHJvY2Vzc29yOjpuZXcoUmVjdXJzaXZlVGVzdFNlcnZlckhhbmRsZXIge30pOworICAgIGxldCBtdXQgc2VydmVyID0gVFNlcnZlcjo6bmV3KAorICAgICAgICByX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICBpX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgIHdfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgIG9fcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgcHJvY2Vzc29yLAorICAgICAgICAxLAorICAgICk7CisKKyAgICBzZXJ2ZXIubGlzdGVuKGxpc3Rlbl9hZGRyZXNzKQorfQorCitzdHJ1Y3QgUmVjdXJzaXZlVGVzdFNlcnZlckhhbmRsZXI7CitpbXBsIHJlY3Vyc2l2ZTo6VGVzdFNlcnZpY2VTeW5jSGFuZGxlciBmb3IgUmVjdXJzaXZlVGVzdFNlcnZlckhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9lY2hvX3RyZWUoJnNlbGYsIHRyZWU6IHJlY3Vyc2l2ZTo6UmVjVHJlZSkgLT4gdGhyaWZ0OjpSZXN1bHQ8cmVjdXJzaXZlOjpSZWNUcmVlPiB7CisgICAgICAgIHByaW50bG4hKCJ7Oj99IiwgdHJlZSk7CisgICAgICAgIE9rKHRyZWUpCisgICAgfQorCisgICAgZm4gaGFuZGxlX2VjaG9fbGlzdCgmc2VsZiwgbHN0OiByZWN1cnNpdmU6OlJlY0xpc3QpIC0+IHRocmlmdDo6UmVzdWx0PHJlY3Vyc2l2ZTo6UmVjTGlzdD4geworICAgICAgICBwcmludGxuISgiezo/fSIsIGxzdCk7CisgICAgICAgIE9rKGxzdCkKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfZWNob19jb19yZWMoJnNlbGYsIGl0ZW06IHJlY3Vyc2l2ZTo6Q29SZWMpIC0+IHRocmlmdDo6UmVzdWx0PHJlY3Vyc2l2ZTo6Q29SZWM+IHsKKyAgICAgICAgcHJpbnRsbiEoIns6P30iLCBpdGVtKTsKKyAgICAgICAgT2soaXRlbSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC9zcmMvbGliLnJzIGIvbGliL3JzL3Rlc3Qvc3JjL2xpYi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWUxNzZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3Qvc3JjL2xpYi5ycwpAQCAtMCwwICsxLDU3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2V4dGVybiBjcmF0ZSBvcmRlcmVkX2Zsb2F0OworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0cnlfZnJvbTsKKworcHViIG1vZCBiYXNlX29uZTsKK3B1YiBtb2QgYmFzZV90d287CitwdWIgbW9kIG1pZGxheWVyOworcHViIG1vZCB1bHRpbWF0ZTsKK3B1YiBtb2QgcmVjdXJzaXZlOworCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisKKyAgICB1c2Ugc3RkOjpkZWZhdWx0OjpEZWZhdWx0OworCisgICAgdXNlIHN1cGVyOjoqOworCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYmVfYWJsZV90b191c2VfY29uc3RydWN0b3IoKSB7CisgICAgICAgIGxldCBfID0gbWlkbGF5ZXI6Ok1lYWw6Om5ldyhTb21lKGJhc2Vfb25lOjpOb29kbGU6OmRlZmF1bHQoKSksIE5vbmUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2JlX2FibGVfdG9fdXNlX2NvbnN0cnVjdG9yX3dpdGhfbm9fZmllbGRzKCkgeworICAgICAgICBsZXQgXyA9IG1pZGxheWVyOjpNZWFsOjpuZXcoTm9uZSwgTm9uZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYmVfYWJsZV90b191c2VfY29uc3RydWN0b3Jfd2l0aG91dF9vcHRpb25fd3JhcCgpIHsKKyAgICAgICAgbGV0IF8gPSBtaWRsYXllcjo6TWVhbDo6bmV3KGJhc2Vfb25lOjpOb29kbGU6OmRlZmF1bHQoKSwgTm9uZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYmVfYWJsZV90b191c2VfZGVmYXVsdHMoKSB7CisgICAgICAgIGxldCBfID0gbWlkbGF5ZXI6Ok1lYWwgeworICAgICAgICAgICAgbm9vZGxlOiBTb21lKGJhc2Vfb25lOjpOb29kbGU6OmRlZmF1bHQoKSksCisgICAgICAgICAgICAuLkRlZmF1bHQ6OmRlZmF1bHQoKQorICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy90ZXN0L3RocmlmdHMvQmFzZV9PbmUudGhyaWZ0IGIvbGliL3JzL3Rlc3QvdGhyaWZ0cy9CYXNlX09uZS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmYTZjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy90ZXN0L3RocmlmdHMvQmFzZV9PbmUudGhyaWZ0CkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK3R5cGVkZWYgaTY0IFRlbXBlcmF0dXJlCisKK3R5cGVkZWYgaTggU2l6ZQorCit0eXBlZGVmIHN0cmluZyBMb2NhdGlvbgorCitjb25zdCBpMzIgQm9pbGluZ1BvaW50ID0gMTAwCisKK2NvbnN0IGxpc3Q8VGVtcGVyYXR1cmU+IFRlbXBlcmF0dXJlcyA9IFsxMCwgMTEsIDIyLCAzM10KKworLy8gSU1QT1JUQU5UOiB0ZW1wcyBzaG91bGQgZW5kIHdpdGggIi4wIiBiZWNhdXNlIHRoaXMgdGVzdHMKKy8vIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhIHByb2JsZW0gd2l0aCBjb25zdCBmbG9hdCBsaXN0IGdlbmVyYXRpb24KK2NvbnN0IGxpc3Q8ZG91YmxlPiBDb21tb25UZW1wZXJhdHVyZXMgPSBbMzAwLjAsIDQ1MC4wXQorCitjb25zdCBkb3VibGUgTWVhbHNQZXJEYXkgPSAyLjU7CisKK2NvbnN0IHN0cmluZyBEZWZhdWx0UmVjaXBlTmFtZSA9ICJTb3VwLXJpc2Ugb2YgdGhlIERheSIKK2NvbnN0IGJpbmFyeSBEZWZhdWx0UmVjaXBlQmluYXJ5ID0gIlNvdXAtcmlzZSBvZiB0aGUgMDEwMTAxMDEiCisKK3N0cnVjdCBOb29kbGUgeworICAxOiBzdHJpbmcgZmxvdXJUeXBlCisgIDI6IFRlbXBlcmF0dXJlIGNvb2tUZW1wCit9CisKK3N0cnVjdCBTcGFnaGV0dGkgeworICAxOiBvcHRpb25hbCBsaXN0PE5vb2RsZT4gbm9vZGxlcworfQorCitjb25zdCBOb29kbGUgU3BlbHROb29kbGUgPSB7ICJmbG91clR5cGUiOiAic3BlbHQiLCAiY29va1RlbXAiOiAxMTAgfQorCitzdHJ1Y3QgTWVhc3VyaW5nU3Bvb24geworICAxOiBTaXplIHNpemUKK30KKworc3RydWN0IE1lYXN1cmluZ0N1cCB7CisgIDE6IGRvdWJsZSBtaWxsaXMKK30KKwordW5pb24gTWVhc3VyaW5nQWlkcyB7CisgIDE6IE1lYXN1cmluZ1Nwb29uIHNwb29uCisgIDI6IE1lYXN1cmluZ0N1cCBjdXAKK30KKworc3RydWN0IENvb2tpbmdUZW1wZXJhdHVyZXMgeworICAxOiBzZXQ8ZG91YmxlPiBjb21tb25UZW1wZXJhdHVyZXMKKyAgMjogbGlzdDxkb3VibGU+IHVzZWRUZW1wZXJhdHVyZXMKKyAgMzogbWFwPGRvdWJsZSwgZG91YmxlPiBmYWhyZW5oZWl0VG9DZW50aWdyYWRlQ29udmVyc2lvbnMKK30KKworc3RydWN0IFJlY2lwZSB7CisgIDE6IHN0cmluZyByZWNpcGVOYW1lCisgIDI6IHN0cmluZyBjdWlzaW5lCisgIDM6IGk4IHBhZ2UKK30KKwordW5pb24gQ29va2luZ1Rvb2xzIHsKKyAgMTogc2V0PE1lYXN1cmluZ1Nwb29uPiBtZWFzdXJpbmdTcG9vbnMKKyAgMjogbWFwPFNpemUsIExvY2F0aW9uPiBtZWFzdXJpbmdDdXBzLAorICAzOiBsaXN0PFJlY2lwZT4gcmVjaXBlcworfQorCmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC90aHJpZnRzL0Jhc2VfVHdvLnRocmlmdCBiL2xpYi9ycy90ZXN0L3RocmlmdHMvQmFzZV9Ud28udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYTZhY2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC90aHJpZnRzL0Jhc2VfVHdvLnRocmlmdApAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCitjb25zdCBpMzIgV2F0ZXJXZWlnaHQgPSAyMDAKKworZW51bSBicm90aFR5cGUgeworICBNaXNvLAorICBzaG91eXUsCit9CisKK3N0cnVjdCBSYW1lbiB7CisgIDE6IG9wdGlvbmFsIHN0cmluZyByYW1lblR5cGUKKyAgMjogcmVxdWlyZWQgaTMyIG5vb2RsZUNvdW50CisgIDM6IGJyb3RoVHlwZSBicm90aAorfQorCitzdHJ1Y3QgTmFwa2luIHsKKyAgLy8gZW1wdHkKK30KKworc2VydmljZSBOYXBraW5TZXJ2aWNlIHsKKyAgTmFwa2luIG5hcGtpbigpCit9CisKK3NlcnZpY2UgUmFtZW5TZXJ2aWNlIGV4dGVuZHMgTmFwa2luU2VydmljZSB7CisgIFJhbWVuIHJhbWVuKDE6IGkzMiByZXF1ZXN0ZWROb29kbGVDb3VudCkKK30KKworLyogY29uc3Qgc3RydWN0IENvb2tlZFJhbWVuID0geyAiYmFyIjogMTAgfSAqLworCmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC90aHJpZnRzL01pZGxheWVyLnRocmlmdCBiL2xpYi9ycy90ZXN0L3RocmlmdHMvTWlkbGF5ZXIudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZmY0OWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC90aHJpZnRzL01pZGxheWVyLnRocmlmdApAQCAtMCwwICsxLDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCitpbmNsdWRlICJCYXNlX09uZS50aHJpZnQiCitpbmNsdWRlICJCYXNlX1R3by50aHJpZnQiCisKK2NvbnN0IGkzMiBXYXRlckJvaWxpbmdQb2ludCA9IEJhc2VfT25lLkJvaWxpbmdQb2ludAorCitjb25zdCBtYXA8c3RyaW5nLCBCYXNlX09uZS5UZW1wZXJhdHVyZT4gVGVtcGVyYXR1cmVOYW1lcyA9IHsgImZyZWV6aW5nIjogMCwgImJvaWxpbmciOiAxMDAgfQorCitjb25zdCBtYXA8c2V0PGkzMj4sIG1hcDxsaXN0PHN0cmluZz4sIHN0cmluZz4+IE15Q29uc3ROZXN0ZWRNYXAgPSB7CisgIFswLCAxLCAyLCAzXTogeyBbImZvbyJdOiAiYmFyIiB9LAorICBbMjBdOiB7IFsibnV0IiwgInRvbiJdIDogImJhciIgfSwKKyAgWzMwLCA0MF06IHsgWyJib3VuY3kiLCAidGlua2x5Il06ICJjYXN0bGUiIH0KK30KKworY29uc3QgbGlzdDxsaXN0PGkzMj4+IE15Q29uc3ROZXN0ZWRMaXN0ID0gWworICBbMCwgMSwgMl0sCisgIFszLCA0LCA1XSwKKyAgWzYsIDcsIDhdCitdCisKK2NvbnN0IHNldDxzZXQ8aTMyPj4gTXlDb25zdE5lc3RlZFNldCA9IFsKKyAgWzAsIDEsIDJdLAorICBbMywgNCwgNV0sCisgIFs2LCA3LCA4XQorXQorCitlbnVtIFBpZSB7CisgIFBVTVBLSU4sCisgIGFwcGxlLCAvLyBpbnRlbnRpb25hbGx5IHBvb3JseSBjYXNlZAorICBTVFJBV0JFUlJZX1JIVUJBUkIsCisgIEtleV9MaW1lLCAvLyBpbnRlbnRpb25hbGx5IHBvb3JseSBjYXNlZAorICBjb2NvbnV0X0NyZWFtLCAvLyBpbnRlbnRpb25hbGx5IHBvb3JseSBjYXNlZAorICBtaXNzaXNzaXBwaV9tdWQsIC8vIGludGVudGlvbmFsbHkgcG9vcmx5IGNhc2VkCit9CisKK3N0cnVjdCBNZWFsIHsKKyAgMTogQmFzZV9PbmUuTm9vZGxlIG5vb2RsZQorICAyOiBCYXNlX1R3by5SYW1lbiByYW1lbgorfQorCit1bmlvbiBEZXNzZXJ0ICB7CisgIDE6IHN0cmluZyBwb3J0CisgIDI6IHN0cmluZyBpY2VXaW5lCit9CisKK3NlcnZpY2UgTWVhbFNlcnZpY2UgZXh0ZW5kcyBCYXNlX1R3by5SYW1lblNlcnZpY2UgeworICBNZWFsIG1lYWwoKQorfQorCmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC90aHJpZnRzL1VsdGltYXRlLnRocmlmdCBiL2xpYi9ycy90ZXN0L3RocmlmdHMvVWx0aW1hdGUudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZmExMDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC90aHJpZnRzL1VsdGltYXRlLnRocmlmdApAQCAtMCwwICsxLDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCitpbmNsdWRlICJNaWRsYXllci50aHJpZnQiCisKK2VudW0gRHJpbmsgeworICBXQVRFUiwKKyAgV0hJU0tFWSwKKyAgV0lORSwKKyAgc2NvdGNoLCAvLyBpbnRlbnRpb25hbGx5IHBvb3JseSBjYXNlZAorICBMQVRFX0hBUlZFU1RfV0lORSwKKyAgSW5kaWFfUGFsZV9BbGUsIC8vIGludGVudGlvbmFsbHkgcG9vcmx5IGNhc2VkCisgIGFwcGxlX2NpZGVyLCAvLyBpbnRlbnRpYWxseSBwb29ybHkgY2FzZWQKKyAgYmVsZ2lhbl9BbGUsIC8vIGludGVudGlvbmFsbHkgcG9vcmx5IGNhc2VkCisgIENhbmFkaWFuX3doaXNreSwgLy8gaW50ZW50aW9uYWxseSBwb29ybHkgY2FzZWQKK30KKworY29uc3QgbWFwPGk4LCBNaWRsYXllci5QaWU+IFJhbmtlZFBpZXMgPSB7CisgIDE6IE1pZGxheWVyLlBpZS5QVU1QS0lOLAorICAyOiBNaWRsYXllci5QaWUuU1RSQVdCRVJSWV9SSFVCQVJCLAorICAzOiBNaWRsYXllci5QaWUuYXBwbGUsCisgIDQ6IE1pZGxheWVyLlBpZS5taXNzaXNzaXBwaV9tdWQsCisgIDU6IE1pZGxheWVyLlBpZS5jb2NvbnV0X0NyZWFtLAorICA2OiBNaWRsYXllci5QaWUuS2V5X0xpbWUsCit9CisKK3N0cnVjdCBGdWxsTWVhbCB7CisgIDE6IHJlcXVpcmVkIE1pZGxheWVyLk1lYWwgbWVhbAorICAyOiByZXF1aXJlZCBNaWRsYXllci5EZXNzZXJ0IGRlc3NlcnQKK30KKworc3RydWN0IEZ1bGxNZWFsQW5kRHJpbmtzIHsKKyAgMTogcmVxdWlyZWQgRnVsbE1lYWwgZnVsbE1lYWwKKyAgMjogb3B0aW9uYWwgRHJpbmsgZHJpbmsKK30KKworc2VydmljZSBGdWxsTWVhbFNlcnZpY2UgZXh0ZW5kcyBNaWRsYXllci5NZWFsU2VydmljZSB7CisgIEZ1bGxNZWFsIGZ1bGxNZWFsKCkKK30KKworc2VydmljZSBGdWxsTWVhbEFuZERyaW5rc1NlcnZpY2UgZXh0ZW5kcyBGdWxsTWVhbFNlcnZpY2UgeworICBGdWxsTWVhbEFuZERyaW5rcyBmdWxsTWVhbEFuZERyaW5rcygpCisKKyAgTWlkbGF5ZXIuUGllIGJlc3RQaWUoKQorfQorCmRpZmYgLS1naXQgYS9saWIvc3QvUkVBRE1FIGIvbGliL3N0L1JFQURNRS5tZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL3N0L1JFQURNRQpyZW5hbWUgdG8gbGliL3N0L1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL3N0L2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvc3QvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N0L2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvc3QvcGFja2FnZS54bWwgYi9saWIvc3QvcGFja2FnZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgzOTM2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zdC9wYWNrYWdlLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+Cis8IS0tIEFwYWNoZSBUaHJpZnQgU21hbGx0YWxrIGxpYnJhcnkgdmVyc2lvbiAxLjAuMCAtLT4KKzxwYWNrYWdlPgorICA8bmFtZT5saWJ0aHJpZnQtc3Q8L25hbWU+CisgIDxmaWxlPnRocmlmdC5zdDwvZmlsZT4KKyAgPGZpbGVpbj50aHJpZnQuc3Q8L2ZpbGVpbj4KKzwvcGFja2FnZT4KKwpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L01ha2VmaWxlLmFtIGIvbGliL3N3aWZ0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiODhiMDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1NVQkRJUlMgPSAuCisKK2FsbC1sb2NhbDoKKwlzd2lmdCBidWlsZCAtLWNvbmZpZ3VyYXRpb24gcmVsZWFzZQorCitpbnN0YWxsLWV4ZWMtaG9vazoKKwlzd2lmdCBpbnN0YWxsCisKK2NsZWFuLWxvY2FsOgorCXN3aWZ0IHBhY2thZ2UgY2xlYW4KKwlybSAtcmYgLmJ1aWxkCisKK3ByZWNyb3NzOgorCXN3aWZ0CisKK2NoZWNrLWxvY2FsOgorCXN3aWZ0IHRlc3QKKworRVhUUkFfRElTVCA9IFwKKwlQYWNrYWdlLnN3aWZ0IFwKKwlTb3VyY2VzIFwKKwlUZXN0cyBcCisJUkVBRE1FLm1kCisKK01BSU5UQUlORVJDTEVBTkZJTEVTID0gXAorCU1ha2VmaWxlIFwKKwlNYWtlZmlsZS5pbgpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1BhY2thZ2Uuc3dpZnQgYi9saWIvc3dpZnQvUGFja2FnZS5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTMzZjYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1BhY2thZ2Uuc3dpZnQKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgUGFja2FnZURlc2NyaXB0aW9uCisKK2xldCBwYWNrYWdlID0gUGFja2FnZSgKKwluYW1lOiAiVGhyaWZ0IgorKQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1JFQURNRS5tZCBiL2xpYi9zd2lmdC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYxMDk2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9SRUFETUUubWQKQEAgLTAsMCArMSwyMTUgQEAKK1RocmlmdCBTd2lmdCBMaWJyYXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK0xpY2Vuc2UKKy0tLS0tLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCisKKyMjIEJ1aWxkCisgICAgc3dpZnQgYnVpbGQKKworIyMgVGVzdAorICAgIHN3aWZ0IHRlc3QKKworIyMgSW5zdGFsbCBMaWJyYXJ5CisjIyMjIyBDb2NvYXBvZHMKK0FkZCB0aGUgZm9sbG93aW5nIHRvIHlvdXIgcG9kZmlsZQorYGBgcnVieQorICAgIHBvZCAnVGhyaWZ0LXN3aWZ0MycsIDpnaXQgPT4gJ2dpdEBnaXRodWIuY29tOmFwYWNoZS90aHJpZnQuZ2l0JywgOmJyYW5jaCA9PiAnbWFzdGVyJworYGBgCisKKyMjIyMjIFNQTQorVW5mb3J0dW5hdGVseSBkdWUgdG8gc29tZSBsaW1pdGF0aW9ucyBpbiBTUE0sIHRoZSBQYWNrYWdlIG1hbmlmZXN0IGFuZCBTb3VyY2VzIGRpcmVjdG9yeSBtdXN0IGJlIGF0IHRoZSByb290IG9mIHRoZSBwcm9qZWN0LgorVG8gZ2V0IGFyb3VuZCB0aGF0IGZvciB0aGUgdGltZSBiZWluZywgeW91IGNhbiB1c2UgdGhpcyBtaXJyb3JlZCByZXBvLgorQWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciBQYWNrYWdlLnN3aWZ0CitgYGBzd2lmdAorZGVwZW5kZW5jaWVzOiBbCisgICAgLlBhY2thZ2UodXJsOiAiaHR0cHM6Ly9naXRodWIuY29tL2Fwb2NvbGlwc2UvVGhyaWZ0LVN3aWZ0LmdpdCIsIG1ham9yVmVyc2lvbjogMSkKK10KK2BgYAorCisjIyBUaHJpZnQgQ29tcGlsZXIKKworWW91IGNhbiBjb21waWxlIElETCBzb3VyY2VzIGZvciBTd2lmdCAzIHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kOgorCisgICAgdGhyaWZ0IC0tZ2VuIHN3aWZ0IHRocmlmdF9maWxlCisKKyMjIENsaWVudCBFeGFtcGxlCitgYGBzd2lmdAorbGV0IHRyYW5zcG9ydCA9IFRTb2NrZXRUcmFuc3BvcnQoaG9zdG5hbWU6ICJsb2NhbGhvc3QiLCBwb3J0OiA5MDkwKSEKKworLy8gIHZhciBwcm90byA9IFRDb21wYWN0UHJvdG9jb2wodHJhbnNwb3J0OiB0cmFuc3BvcnQpCitsZXQgcHJvdG8gPSBUQmluYXJ5UHJvdG9jb2wob246IHRyYW5zcG9ydCkKKy8vICB2YXIgY2xpZW50ID0gSGVybWVzQ2xpZW50KGlub3V0UHJvdG9jb2w6IHByb3RvKQorbGV0IGNsaWVudCA9IFRocmlmdFRlc3RDbGllbnQoaW5vdXRQcm90b2NvbDogcHJvdG8pCitkbyB7CisgICAgdHJ5IGNsaWVudC50ZXN0Vm9pZCgpCit9IGNhdGNoIGxldCBlcnJvciB7CisgICAgcHJpbnQoIlwoZXJyb3IpIikKK30KK2BgYAorCisjIyBMaWJyYXJ5IE5vdGVzCistIEVsaW1pbmF0ZWQgUHJvdG9jb2wgRmFjdG9yaWVzLCBUaGV5IHdlcmUgb25seSB1c2VkIGluIGFzeW5jIGNsaWVudHMgYW5kIHNlcnZlciBpbXBsZW1lbnRhdGlvbnMsIHdoZXJlIEdlbmVyaWNzIHByb3ZpZGUgYSBiZXR0ZXIgYWx0ZXJuYXRpdmUuCistIFN3aWZ0eSBFcnJvcnMsIEFsbCBgVEVycm9yYCB0eXBlcyBoYXZlIGEgbmVzdGVkIGBFcnJvckNvZGVgIEVudW0gYXMgd2VsbCBhcyBzb21lIGV4dHJhIGZsYXZvciB3aGVyZSBuZWVkZWQuCistIFZhbHVlIHR5cGVkIGV2ZXJ5dGhpbmcuICBgVFRyYW5zcG9ydGAgb3BlcmF0ZXMgb24gdmFsdWUgdHlwZWQgYERhdGFgIHJhdGhlciB0aGFuIHJlZmVyZW5jZSB0eXBlZCBgTlNEYXRhYCBvciBgVW5zYWZlQnVmZmVyUG9pbnRlcmBzCistIFN3aWZ0IDMgTmFtZWQgcHJvdG9jb2xzLiAgU3dpZnQgMyBuYW1pbmcgY29udmVudGlvbnMgc3VnZ2VzdCB0aGUgZWxpbWluYXRpb24gb2YgcmVkdW5kYW50IHdvcmRzIHRoYXQgY2FuIGJlIGluZmVycmVkIGZyb20gdmFyaWFibGUvZnVuY3Rpb24gc2lnbmF0dXJlcy4gIFRoaXMgcmVuYW1pbmcgaXMgYXBwbGllZCB0aHJvdWdob3V0IHRoZSBTd2lmdCAzIGxpYnJhcnkgY29udmVydGluZyBtb3N0IG5hbWluZyBjb252ZW50aW9ucyB1c2VkIGluIHRoZSBTd2lmdDIvQ29jb2EgbGlicmFyeSB0byBTd2lmdCAzLWVzcXVlIG5hbWluZyBjb252ZW50aW9ucy4gZWcuCitgYGBzd2lmdAorZnVuYyByZWFkU3RyaW5nKCkgdGhyb3dzIC0+IFN0cmluZworZnVuYyB3cml0ZVN0cmluZyhfIHZhbDogU3RyaW5nKSB0aHJvd3MKK2BgYAoraGF2ZSBiZWVuIHJlbmFtZWQgdG8gZWxpbWluYXRlIHJlZHVuZGFudCB3b3JkczoKK2BgYHN3aWZ0CitmdW5jIHJlYWQoKSB0aHJvd3MgLT4gU3RyaW5nCitmdW5jIHdyaXRlKF8gdmFsOiBTdHJpbmcpIHRocm93cworYGBgCisKKy0gRWxpbWluYXRlZCBgVEhUVFBUcmFuc3BvcnRgIHRoYXQgdXNlcyBgTlNVUkxDb25uZWN0aW9uYCBkdWUgdG8gaXQgYmVpbmcgZGVwcmVjYXRlZCBhbmQgbm90IGF2YWlsYWJsZSBhdCBhbGwgaW4gU3dpZnQgMyBmb3IgTGludXguICBgVEhUVFBTZXNzaW9uVHJhbnNwb3J0YCBmcm9tIHRoZSBTd2lmdDIvQ29jb2EgbGlicmFyeSB0aGF0IHVzZXMgYE5TVVJMU2Vzc2lvbmAgaGFzIGJlZW4gcmVuYW1lZCB0byBgVEhUVFBUcmFuc3BvcnRgIGZvciB0aGlzIGxpYnJhcnkgYW5kIGxldmVyYWdlcyBgVVJMU2Vzc2lvbmAsIHByb3ZpZGluZyBib3RoIHN5bmNocm9ub3VzICh3aXRoIHNlbWFwaG9yZXMpIGFuZCBhc3luY2hyb25vdXMgYmVoYXZpb3IuCistIFByb2JhYmx5IHNvbWUgTW9yZSB0aGluZ3MgSSd2ZSBtaXNzZWQgaGVyZS4KKworIyMgR2VuZXJhdG9yIE5vdGVzCisjIyMjIEdlbmVyYXRvciBGbGFncworfCBGbGFnICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgIHwKK3wgLS0tLS0tLS0tLS0tLSB8Oi0tLS0tLS0tLS0tLS06fAorfCBhc3luY19jbGllbnRzIHwgR2VuZXJhdGUgY2xpZW50cyB3aGljaCBpbnZva2UgYXN5bmNocm9ub3VzbHkgdmlhIGJsb2NrIHN5bnRheC4gQXN5bmNocm9ub3VzIGNsYXNzZXMgYXJlIGFwcGVuZGVkIHdpdGggYF9Bc3luY2AgfAorfCBub19zdHJpY3QqICAgIHwgR2VuZXJhdGVzIG5vbi1zdHJpY3Qgc3RydWN0cyAgICAgIHwKK3wgZGVidWdfZGVzY3JpcHRpb25zIHwgQWxsb3cgdXNlIG9mIGRlYnVnRGVzY3JpcHRpb24gc28gdGhlIGFwcCBjYW4gYWRkIGRlc2NyaXB0aW9uIHZpYSBhIGNhdGVvZ29yeS9leHRlbnNpb24gICAgICB8Cit8IGxvZ191bmV4cGVjdGVkIHwgTG9nIGV2ZXJ5IHRpbWUgYW4gdW5leHBlY3RlZCBmaWVsZCBJRCBvciB0eXBlIGlzIGVuY291bnRlcmVkLiB8Cit8IHNhZmVfZW51bXMgICAgIHwgR2VuZXJhdGUgZW51bSB0eXBlcyB3aXRoIGFuIHVua25vd24gY2FzZSB0byBoYW5kbGUgdW5zcGVjaWZpZWQgdmFsdWVzIHJhdGhlciB0aGFuIHRocm93IGEgc2VyaWFsaXphdGlvbiBlcnJvciAgfAorCisKKworKk1vc3QgdGhyaWZ0IGxpYnJhcmllcyBhbGxvdyBlbXB0eSBpbml0aWFsaXphdGlvbiBvZiBTdHJ1Y3RzLCBpbml0aWFsaXppbmcgYHJlcXVpcmVkYCBmaWVsZHMgd2l0aCBuaWwvbnVsbC9Ob25lIChQeXRob24gYW5kIE5vZGUgZ2VuZXJhdG9ycykuICBTd2lmdCBvbiB0aGUgb3RoZXIgaGFuZCByZXF1aXJlcyBpbml0aWFsaXplcnMgdG8gaW5pdGlhbGl6ZSBhbGwgbm9uLU9wdGlvbmFsIGZpZWxkcywgYW5kIHRodXMgdGhlIFN3aWZ0IDMgZ2VuZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgZGVmYXVsdCB2YWx1ZXMgKHVubGlrZSB0aGUgU3dpZnQgMi9Db2NvYSBnZW5lcmF0b3IpLiAgSW4gb3RoZXIgbGFuZ3VhZ2VzLCB0aGlzIGFsbG93cyB0aGUgc2VuZGluZyBvZiBOVUxMIHZhbHVlcyBpbiBmaWVsZHMgdGhhdCBhcmUgbWFya2VkIGByZXF1aXJlZGAsIGFuZCB0aHVzIHdpbGwgdGhyb3cgYW4gZXJyb3IgaW4gU3dpZnQgY2xpZW50cyBhdHRlbXB0aW5nIHRvIHZhbGlkYXRlIGZpZWxkcy4gIFRoZSBgbm9fc3RyaWN0YCBvcHRpb24gaGVyZSB3aWxsIGlnbm9yZSB0aGUgdmFsaWRhdGlvbiBjaGVjaywgYXMgd2VsbCBhcyBiZWhhdmUgc2ltaWxhciB0byB0aGUgU3dpZnQyL0NvY29hIGdlbmVyYXRvciBhbmQgaW5pdGlhbGl6ZSByZXF1aXJlZCBmaWVsZHMgd2l0aCBlbXB0eSBpbml0aWFsaXplcnMgKHdoZXJlIHBvc3NpYmxlKS4KKworCisjIyBXaGF0cyBpbXBsZW1lbnRlZAorIyMjIyBMaWJyYXJ5CisjIyMjIyBUcmFuc3BvcnRzCistIFt4XSBUU29ja2V0VHJhbnNwb3J0IC0gQ0ZTb2NrZXQgYW5kIFBvc2l4U29ja2V0IHZhcmlhbnRzIGF2YWlsYWJsZS4gQ0ZTb2NrZXQgdmFyaWFudCBvbmx5IGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIERhcndpbiBwbGF0Zm9ybXMKKy0gW3hdIFRIVFRQVHJhbnNwb3J0IC0gQ3VycmVudGx5IG9ubHkgYXZhaWxhYmxlIGZvciBEYXJ3aW4gcGxhdGZvcm1zLCBTd2lmdCBGb3VuZGF0aW9uIFVSTFNlc3Npb24gaW1wbGVtZW50YXRpb24gbmVlZHMgY29tcGxldGlvbiBvbiBsaW51eC4KKy0gW3hdIFRTb2NrZXRTZXJ2ZXIgLSBVc2VzIENGU29ja2V0cyBvbmx5IGZvciBiaW5kaW5nLCBzaG91bGQgYmUgd29ya2luZyBvbiBsaW51eAorLSBbeF0gVEZyYW1lZFRyYW5zcG9ydAorLSBbeF0gVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydAorLSBbeF0gVEZpbGVUcmFuc3BvcnQgLSBBIGZldyB2YXJpYW50cyB1c2luZyBGaWxlIGhhbmRsZXMgYW5kIGZpbGUgZGVzY3JpcHRvcnMuCistIFt4XSBUU3RyZWFtVHJhbnNwb3J0IC0gRnVsbHkgZnVuY3Rpb25hbCBpbiBEYXJ3aW4sIEZvdW5kYXRpb24gYmFja2luZyBub3QgeWV0IGNvbXBsZXRlZCBpbiBMaW51eCAoVGhpcyBsaW1pdHMgVENGU29ja2V0VHJhbnNwb3J0IHRvIERhcndpbikKKy0gWyBdIEhUVFBTZXJ2ZXIgLSBDdXJyZW50bHkgdGhlcmUgaXMgbm8gbGlnaHR3ZWlnaHQgIEhUVFBTZXJ2ZXIgaW1wbGVtZW50YXRpb24gdGhlIFN3aWZ0IFN0YW5kYXJkIExpYnJhcnksIHNvIG90aGVyIDNyZCBwYXJ0eSBhbHRlcm5hdGl2ZXMgYXJlIHJlcXVpcmVkIGFuZCBvdXQgb2Ygc2NvcGUgZm9yIHRoZSBUaHJpZnQgbGlicmFyeS4gIEV4YW1wbGVzIHVzaW5nIFBlcmZlY3Qgd2lsbCBiZSBwcm92aWRlZC4KKy0gWyBdIE90aGVyIChneiwgZXRjKQorCisjIyMjIyBQcm90b2NvbHMKKy0gW3hdIFRCaW5hcnlQcm90b2NvbAorLSBbeF0gVENvbXBhY3RQcm90b2NvbAorLSBbIF0gVEpTT05Qcm90b2NvbCAtIFRoaXMgd2lsbCBuZWVkIHRvIGJlIGltcGxlbWVudGVkCisKKyMjIyMjIEdlbmVyYXRvcgorLSBbeF0gQ29kZSBDb21wbGV0ZSBHZW5lcmF0b3IKKy0gW3hdIEFzeW5jIGNsaWVudHMKKy0gW3hdIERvY3VtZW50YXRpb24gR2VuZXJhdGlvbiAtIEdlbmVyYXRvciB3aWxsIHRyYW5zcGxhbnQgSURMIGRvY3MgdG8gU3dpZnQgY29kZSBmb3IgZWFzeSBsb29rdXAgaW4gWGNvZGUKKy0gWyBdIERlZmF1bHQgVmFsdWVzIC0gVE9ETworLSBbIF0gbm9fc3RyaWN0IG1vZGUgLSBUT0RPCistIFsgXSBOYW1lc3BhY2luZyAtIFN0aWxsIGhhdmVuJ3QgbmFpbGVkIGRvd24gYSBnb29kIHBhcmFkaWdtIGZvciBuYW1lc3BhY2luZy4gIEl0IHdpbGwgbGlrZWx5IGludm9sdmUgY3JlYXRpbmcgc3ViZGlyZWN0b3JpZXMgZm9yIGRpZmZlcmVudCBuYW1lc3BhY2VzIGFuZCBleHBlY3RpbmcgdGhlIGRldmVsb3BlciB0byBpbXBvcnQgZWFjaCBzdWJkaXJlY3RvcnkgYXMgc2VwYXJhdGUgbW9kdWxlcy4gIEl0IGNvdWxkIGV4dGVuZCB0byBjcmVhdGluZyBTUE0gUGFja2FnZSBtYW5pZmVzdHMgd2l0aCBzdWItbW9kdWxlcyB3aXRoaW4gdGhlIGdlbmVyYXRlZCBtb2R1bGUKKworCisKKyMjIEV4YW1wbGUgSFRUUCBTZXJ2ZXIgd2l0aCBQZXJmZWN0CitgYGBzd2lmdAoraW1wb3J0IFBlcmZlY3RMaWIKK2ltcG9ydCBQZXJmZWN0SFRUUAoraW1wb3J0IFBlcmZlY3RIVFRQU2VydmVyCitpbXBvcnQgRGlzcGF0Y2gKKworbGV0IGxvZ1F1ZXVlID0gRGlzcGF0Y2hRdWV1ZShsYWJlbDogImxvZyIsIHFvczogLmJhY2tncm91bmQsIGF0dHJpYnV0ZXM6IC5jb25jdXJyZW50KQorbGV0IHBRdWV1ZSA9IERpc3BhdGNoUXVldWUobGFiZWw6ICJsb2ciLCBxb3M6IC51c2VySW5pdGlhdGVkLCBhdHRyaWJ1dGVzOiAuY29uY3VycmVudCkKKworCitjbGFzcyBUUGVyZmVjdFNlcnZlcjxJblByb3RvY29sOiBUUHJvdG9jb2wsIE91dFByb3RvY29sOiBUUHJvdG9jb2w+IHsKKworIHByaXZhdGUgdmFyIHNlcnZlciA9IEhUVFBTZXJ2ZXIoKQorIHByaXZhdGUgdmFyIHByb2Nlc3NvcjogVFByb2Nlc3NvcgorCisgaW5pdChhZGRyZXNzOiBTdHJpbmc/ID0gbmlsLAorICAgICAgcGF0aDogU3RyaW5nPyA9IG5pbCwKKyAgICAgIHBvcnQ6IEludCwKKyAgICAgIHByb2Nlc3NvcjogVFByb2Nlc3NvciwKKyAgICAgIGluUHJvdG9jb2w6IEluUHJvdG9jb2wuVHlwZSwKKyAgICAgIG91dFByb3RvY29sOiBPdXRQcm90b2NvbC5UeXBlKSB0aHJvd3MgeworCisgICBzZWxmLnByb2Nlc3NvciA9IHByb2Nlc3NvcgorCisgICBpZiBsZXQgYWRkcmVzcyA9IGFkZHJlc3MgeworICAgICBzZXJ2ZXIuc2VydmVyQWRkcmVzcyA9IGFkZHJlc3MKKyAgIH0KKyAgIHNlcnZlci5zZXJ2ZXJQb3J0ID0gVUludDE2KHBvcnQpCisKKyAgIHZhciByb3V0ZXMgPSBSb3V0ZXMoKQorICAgdmFyIHVyaSA9ICIvIgorICAgaWYgbGV0IHBhdGggPSBwYXRoIHsKKyAgICAgdXJpICs9IHBhdGgKKyAgIH0KKyAgIHJvdXRlcy5hZGQobWV0aG9kOiAucG9zdCwgdXJpOiB1cmkpIHsgcmVxdWVzdCwgcmVzcG9uc2UgaW4KKyAgICAgcFF1ZXVlLmFzeW5jIHsKKyAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoLmNvbnRlbnRUeXBlLCB2YWx1ZTogImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKKworICAgICAgIGxldCBpdHJhbnMgPSBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0KCkKKyAgICAgICBpZiBsZXQgYnl0ZXMgPSByZXF1ZXN0LnBvc3RCb2R5Qnl0ZXMgeworICAgICAgICAgbGV0IGRhdGEgPSBEYXRhKGJ5dGVzOiBieXRlcykKKyAgICAgICAgIGl0cmFucy5yZXNldChyZWFkQnVmZmVyOiBkYXRhKQorICAgICAgIH0KKworICAgICAgIGxldCBvdHJhbnMgPSBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0KGZsdXNoSGFuZGxlcjogeyB0cmFucywgYnVmZiBpbgorICAgICAgICAgbGV0IGFycmF5ID0gYnVmZi53aXRoVW5zYWZlQnl0ZXMgeworICAgICAgICAgICBBcnJheTxVSW50OD4oVW5zYWZlQnVmZmVyUG9pbnRlcihzdGFydDogJDAsIGNvdW50OiBidWZmLmNvdW50KSkKKyAgICAgICAgIH0KKyAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyA9IC5vaworICAgICAgICAgcmVzcG9uc2Uuc2V0Qm9keShieXRlczogYXJyYXkpCisgICAgICAgICByZXNwb25zZS5jb21wbGV0ZWQoKQorICAgICAgIH0pCisKKyAgICAgICBsZXQgaW5wcm90byA9IEluUHJvdG9jb2wob246IGl0cmFucykKKyAgICAgICBsZXQgb3V0cHJvdG8gPSBPdXRQcm90b2NvbChvbjogb3RyYW5zKQorCisgICAgICAgZG8geworICAgICAgICAgdHJ5IHByb2Nlc3Nvci5wcm9jZXNzKG9uOiBpbnByb3RvLCBvdXRQcm90b2NvbDogb3V0cHJvdG8pCisgICAgICAgICB0cnkgb3RyYW5zLmZsdXNoKCkKKyAgICAgICB9IGNhdGNoIHsKKyAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyA9IC5iYWRSZXF1ZXN0CisgICAgICAgICByZXNwb25zZS5jb21wbGV0ZWQoKQorICAgICAgIH0KKyAgICAgfQorICAgfQorICAgc2VydmVyLmFkZFJvdXRlcyhyb3V0ZXMpCisgfQorCisgZnVuYyBzZXJ2ZSgpIHRocm93cyB7CisgICB0cnkgc2VydmVyLnN0YXJ0KCkKKyB9Cit9CitgYGAKKworIyMjIyBFeGFtcGxlIFVzYWdlCitgYGBzd2lmdAorY2xhc3MgU2VydmljZUhhbmRsZXIgOiBTZXJ2aWNlIHsKKyAgICAuLi4KK30KK2xldCBzZXJ2ZXIgPSB0cnk/IFRQZXJmZWN0U2VydmVyKHBvcnQ6IDkwOTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvcjogU2VydmljZVByb2Nlc3NvcihzZXJ2aWNlOiBTZXJ2aWNlSGFuZGxlcigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm90b2NvbDogVEJpbmFyeVByb3RvY29sLnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFByb3RvY29sOiBUQmluYXJ5UHJvdG9jb2wuc2VsZikKKwordHJ5PyBzZXJ2ZXI/LnNlcnZlKCkKK2BgYApkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvTGludXhIZWxwZXIuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9MaW51eEhlbHBlci5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmQ5MmJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvTGludXhIZWxwZXIuc3dpZnQKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK2ltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgQ29yZUZvdW5kYXRpb24KKworI2lmIG9zKExpbnV4KQorLy8vIEV4dGVuc2lvbnMgZm9yIExpbnV4IGZvciBpbmNvbXBsZXRlIEZvdW5kYXRpb24gQVBJJ3MuCisvLy8gc3dpZnQtY29yZWxpYnMtZm91bmRhdGlvbiBpcyBub3QgeWV0IDE6MSB3aXRoIE9TWC9pT1MgRm91bmRhdGlvbgorCitleHRlbnNpb24gQ0ZTb2NrZXRFcnJvciB7CisgIHB1YmxpYyBzdGF0aWMgbGV0IHN1Y2Nlc3MgPSBrQ0ZTb2NrZXRTdWNjZXNzCit9CisgIAorZXh0ZW5zaW9uIFVJbnQgeworICBwdWJsaWMgc3RhdGljIGZ1bmMgJihsaHM6IFVJbnQsIHJoczogSW50KSAtPiBVSW50IHsKKyAgICBsZXQgY2FzdCA9IHVuc2FmZUJpdENhc3QocmhzLCB0bzogVUludC5zZWxmKQorICAgIHJldHVybiBsaHMgJiBjYXN0CisgIH0KK30KKworI2Vsc2UKK2V4dGVuc2lvbiBDRlN0cmVhbVByb3BlcnR5S2V5IHsKKyAgc3RhdGljIGxldCBzaG91bGRDbG9zZU5hdGl2ZVNvY2tldCAgPSBDRlN0cmVhbVByb3BlcnR5S2V5KGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQpCisgIC8vIEV4aXN0cyBhcyBTdHJlYW0uUHJvcGVydHlLZXkuc29ja2V0U2VjdXJpdHlsZXZlbEtleSBidXQgZG9lc24ndCB3b3JrIHdpdGggQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkKKyAgc3RhdGljIGxldCBzb2NrZXRTZWN1cml0eUxldmVsICAgICAgPSBDRlN0cmVhbVByb3BlcnR5S2V5KGtDRlN0cmVhbVByb3BlcnR5U29ja2V0U2VjdXJpdHlMZXZlbCkKKyAgc3RhdGljIGxldCBTU0xTZXR0aW5ncyAgICAgICAgICAgICAgPSBDRlN0cmVhbVByb3BlcnR5S2V5KGtDRlN0cmVhbVByb3BlcnR5U1NMU2V0dGluZ3MpCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RBcHBsaWNhdGlvbkVycm9yLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEFwcGxpY2F0aW9uRXJyb3Iuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMzOTM5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RBcHBsaWNhdGlvbkVycm9yLnN3aWZ0CkBAIC0wLDAgKzEsMTU3IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKK3B1YmxpYyBzdHJ1Y3QgVEFwcGxpY2F0aW9uRXJyb3IgOiBURXJyb3IgeworICBwdWJsaWMgZW51bSBDb2RlIDogVEVycm9yQ29kZSB7CisgICAgY2FzZSB1bmtub3duCisgICAgY2FzZSB1bmtub3duTWV0aG9kKG1ldGhvZE5hbWU6IFN0cmluZz8pCisgICAgY2FzZSBpbnZhbGlkTWVzc2FnZVR5cGUKKyAgICBjYXNlIHdyb25nTWV0aG9kTmFtZShtZXRob2ROYW1lOiBTdHJpbmc/KQorICAgIGNhc2UgYmFkU2VxdWVuY2VJZAorICAgIGNhc2UgbWlzc2luZ1Jlc3VsdChtZXRob2ROYW1lOiBTdHJpbmc/KQorICAgIGNhc2UgaW50ZXJuYWxFcnJvcgorICAgIGNhc2UgcHJvdG9jb2xFcnJvcgorICAgIGNhc2UgaW52YWxpZFRyYW5zZm9ybQorICAgIGNhc2UgaW52YWxpZFByb3RvY29sCisgICAgY2FzZSB1bnN1cHBvcnRlZENsaWVudFR5cGUKKyAgICAKKyAgICAKKyAgICAvLy8gSW5pdGlhbGl6ZSBhIFRBcHBsaWNhdGlvbkVycm9yIHdpdGggYSBUaHJpZnQgZXJyb3IgY29kZQorICAgIC8vLyBOb3JtYWxseSB0aGlzIHdvdWxkIGJlIGFjaGlldmVkIHdpdGggUmF3UmVwcmVzZW50YWJsZSBob3dldmVyCisgICAgLy8vIGJ5IGRvaW5nIHRoaXMgd2UgY2FuIGFsbG93IGZvciBhc3NvY2lhdGVkIHByb3BlcnRpZXMgb24gZW51bSBjYXNlcyBmb3IKKyAgICAvLy8gY2FzZSBzcGVjaWZpYyBjb250ZXh0IGRhdGEgaW4gYSBTd2lmdHksIHR5cGUtc2FmZSBtYW5uZXIuCisgICAgLy8vCisgICAgLy8vIC0gcGFyYW1ldGVyIHRocmlmdEVycm9yQ29kZTogSW50ZWdlciBUQXBwbGljYXRpb25FcnJvcihleGNlcHRpb24pIGVycm9yIGNvZGUuICAKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHRvIDAgKC51bmtub3duKQorICAgIHB1YmxpYyBpbml0KHRocmlmdEVycm9yQ29kZTogSW50KSB7CisgICAgICBzd2l0Y2ggdGhyaWZ0RXJyb3JDb2RlIHsKKyAgICAgIGNhc2UgMTogIHNlbGYgPSAudW5rbm93bk1ldGhvZChtZXRob2ROYW1lOiBuaWwpCisgICAgICBjYXNlIDI6ICBzZWxmID0gLmludmFsaWRNZXNzYWdlVHlwZQorICAgICAgY2FzZSAzOiAgc2VsZiA9IC53cm9uZ01ldGhvZE5hbWUobWV0aG9kTmFtZTogbmlsKQorICAgICAgY2FzZSA0OiAgc2VsZiA9IC5iYWRTZXF1ZW5jZUlkCisgICAgICBjYXNlIDU6ICBzZWxmID0gLm1pc3NpbmdSZXN1bHQobWV0aG9kTmFtZTogbmlsKQorICAgICAgY2FzZSA2OiAgc2VsZiA9IC5pbnRlcm5hbEVycm9yCisgICAgICBjYXNlIDc6ICBzZWxmID0gLnByb3RvY29sRXJyb3IKKyAgICAgIGNhc2UgODogIHNlbGYgPSAuaW52YWxpZFByb3RvY29sCisgICAgICBjYXNlIDk6ICBzZWxmID0gLmludmFsaWRUcmFuc2Zvcm0KKyAgICAgIGNhc2UgMTA6IHNlbGYgPSAudW5zdXBwb3J0ZWRDbGllbnRUeXBlCisgICAgICBkZWZhdWx0OiBzZWxmID0gLnVua25vd24KKyAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHZhciB0aHJpZnRFcnJvckNvZGU6IEludCB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC51bmtub3duOiAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgY2FzZSAudW5rbm93bk1ldGhvZDogICAgICAgICAgcmV0dXJuIDEKKyAgICAgIGNhc2UgLmludmFsaWRNZXNzYWdlVHlwZTogICAgIHJldHVybiAyCisgICAgICBjYXNlIC53cm9uZ01ldGhvZE5hbWU6ICAgICAgICByZXR1cm4gMworICAgICAgY2FzZSAuYmFkU2VxdWVuY2VJZDogICAgICAgICAgcmV0dXJuIDQKKyAgICAgIGNhc2UgLm1pc3NpbmdSZXN1bHQ6ICAgICAgICAgIHJldHVybiA1CisgICAgICBjYXNlIC5pbnRlcm5hbEVycm9yOiAgICAgICAgICByZXR1cm4gNgorICAgICAgY2FzZSAucHJvdG9jb2xFcnJvcjogICAgICAgICAgcmV0dXJuIDcKKyAgICAgIGNhc2UgLmludmFsaWRQcm90b2NvbDogICAgICAgIHJldHVybiA4CisgICAgICBjYXNlIC5pbnZhbGlkVHJhbnNmb3JtOiAgICAgICByZXR1cm4gOQorICAgICAgY2FzZSAudW5zdXBwb3J0ZWRDbGllbnRUeXBlOiAgcmV0dXJuIDEwCisgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb246IFN0cmluZyB7CisgICAgICAvLy8gT3V0cHV0ICJmb3IgI21ldGhvZE5hbWUiIGlmIG1ldGhvZCBpcyBub3QgbmlsIGVsc2UgZW1wdHkKKyAgICAgIGxldCBtZXRob2RVbndyYXA6IChTdHJpbmc/KSAtPiBTdHJpbmcgPSAgeyBtZXRob2QgaW4KKyAgICAgICAgcmV0dXJuICJcKG1ldGhvZCA9PSBuaWwgPyAiIiA6ICIgZm9yIFwobWV0aG9kID8/ICIiKSIpIgorICAgICAgfQorICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAudW5rbm93bjogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIFRBcHBsaWNhdGlvbkVycm9yIgorICAgICAgY2FzZSAudW5rbm93bk1ldGhvZChsZXQgbWV0aG9kKTogICAgcmV0dXJuICJVbmtub3duIE1ldGhvZFwobWV0aG9kVW53cmFwKG1ldGhvZCkpIgorICAgICAgY2FzZSAuaW52YWxpZE1lc3NhZ2VUeXBlOiAgICAgICAgICAgcmV0dXJuICJJbnZhbGlkIE1lc3NhZ2UgVHlwZSIKKyAgICAgIGNhc2UgLndyb25nTWV0aG9kTmFtZShsZXQgbWV0aG9kKTogIHJldHVybiAiV3JvbmcgTWV0aG9kIE5hbWVcKG1ldGhvZFVud3JhcChtZXRob2QpKSIKKyAgICAgIGNhc2UgLmJhZFNlcXVlbmNlSWQ6ICAgICAgICAgICAgICAgIHJldHVybiAiQmFkIFNlcXVlbmNlIElEIgorICAgICAgY2FzZSAubWlzc2luZ1Jlc3VsdChsZXQgbWV0aG9kKTogICAgcmV0dXJuICJNaXNzaW5nIFJlc3VsdFwobWV0aG9kVW53cmFwKG1ldGhvZCkpIgorICAgICAgY2FzZSAuaW50ZXJuYWxFcnJvcjogICAgICAgICAgICAgICAgcmV0dXJuICJJbnRlcm5hbCBFcnJvciIKKyAgICAgIGNhc2UgLnByb3RvY29sRXJyb3I6ICAgICAgICAgICAgICAgIHJldHVybiAiUHJvdG9jb2wgRXJyb3IiCisgICAgICBjYXNlIC5pbnZhbGlkUHJvdG9jb2w6ICAgICAgICAgICAgICByZXR1cm4gIkludmFsaWQgUHJvdG9jb2wiCisgICAgICBjYXNlIC5pbnZhbGlkVHJhbnNmb3JtOiAgICAgICAgICAgICByZXR1cm4gIkludmFsaWQgVHJhbnNmb3JtIgorICAgICAgY2FzZSAudW5zdXBwb3J0ZWRDbGllbnRUeXBlOiAgICAgICAgcmV0dXJuICJVbnN1cHBvcnRlZCBDbGllbnQgVHlwZSIKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwdWJsaWMgaW5pdCgpIHsgfQorICAKKyAgcHVibGljIGluaXQodGhyaWZ0RXJyb3JDb2RlIGNvZGU6IEludCwgbWVzc2FnZTogU3RyaW5nPyA9IG5pbCkgeworICAgIHNlbGYuZXJyb3IgPSBDb2RlKHRocmlmdEVycm9yQ29kZTogY29kZSkKKyAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZXJyb3I6IENvZGUgPSAudW5rbm93bgorICBwdWJsaWMgdmFyIG1lc3NhZ2U6IFN0cmluZz8gPSBuaWwKKyAgcHVibGljIHN0YXRpYyB2YXIgZGVmYXVsdENhc2U6IENvZGUgeyByZXR1cm4gLnVua25vd24gfQorfQorCitleHRlbnNpb24gVEFwcGxpY2F0aW9uRXJyb3IgOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLnN0cnVjdCB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBUQXBwbGljYXRpb25FcnJvciB7CisgICAgdmFyIGVycm9yQ29kZTogSW50ID0gMAorICAgIHZhciBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsCisgICAgXyA9IHRyeSBwcm90by5yZWFkU3RydWN0QmVnaW4oKQorICAgIGZpZWxkczogd2hpbGUgdHJ1ZSB7CisgICAgICBsZXQgKF8sIGZpZWxkVHlwZSwgZmllbGRJRCkgPSB0cnkgcHJvdG8ucmVhZEZpZWxkQmVnaW4oKQorICAgICAgCisgICAgICBzd2l0Y2ggKGZpZWxkSUQsIGZpZWxkVHlwZSkgeworICAgICAgY2FzZSAoXywgLnN0b3ApOgorICAgICAgICBicmVhayBmaWVsZHMKKyAgICAgIGNhc2UgKDEsIC5zdHJpbmcpOgorICAgICAgICBtZXNzYWdlID0gdHJ5IHByb3RvLnJlYWQoKQorICAgICAgY2FzZSAoMiwgLmkzMik6CisgICAgICAgIGVycm9yQ29kZSA9IEludCh0cnkgcHJvdG8ucmVhZCgpIGFzIEludDMyKQorICAgICAgCisgICAgICBjYXNlIGxldCAoXywgdW5rbm93blR5cGUpOgorICAgICAgICB0cnkgcHJvdG8uc2tpcCh0eXBlOiB1bmtub3duVHlwZSkKKyAgICAgIH0KKyAgICAgIAorICAgICAgdHJ5IHByb3RvLnJlYWRGaWVsZEVuZCgpCisgICAgfQorICAgIHRyeSBwcm90by5yZWFkU3RydWN0RW5kKCkKKyAgICByZXR1cm4gVEFwcGxpY2F0aW9uRXJyb3IodGhyaWZ0RXJyb3JDb2RlOiBlcnJvckNvZGUsIG1lc3NhZ2U6IG1lc3NhZ2UpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZVN0cnVjdEJlZ2luKG5hbWU6ICJUQXBwbGljYXRpb25FeGNlcHRpb24iKQorICAgIAorICAgIHRyeSBwcm90by53cml0ZUZpZWxkQmVnaW4obmFtZTogIm1lc3NhZ2UiLCB0eXBlOiAuc3RyaW5nLCBmaWVsZElEOiAxKQorICAgIHRyeSBwcm90by53cml0ZShtZXNzYWdlID8/ICIiKQorICAgIHRyeSBwcm90by53cml0ZUZpZWxkRW5kKCkKKyAgICAKKyAgICB0cnkgcHJvdG8ud3JpdGVGaWVsZEJlZ2luKG5hbWU6ICJ0eXBlIiwgdHlwZTogLmkzMiwgZmllbGRJRDogMikKKyAgICBsZXQgdmFsID0gSW50MzIoZXJyb3IudGhyaWZ0RXJyb3JDb2RlKQorICAgIHRyeSBwcm90by53cml0ZSh2YWwpCisgICAgdHJ5IHByb3RvLndyaXRlRmllbGRFbmQoKQorICAgIHRyeSBwcm90by53cml0ZUZpZWxkU3RvcCgpCisgICAgdHJ5IHByb3RvLndyaXRlU3RydWN0RW5kKCkKKyAgfQorICAKKyAgcHVibGljIHZhciBoYXNoVmFsdWU6IEludCB7CisgICAgcmV0dXJuIGVycm9yLnRocmlmdEVycm9yQ29kZSAmKyAobWVzc2FnZT8uaGFzaFZhbHVlID8/IDApCisgIH0KK30KKworcHVibGljIGZ1bmMgPT0obGhzOiBUQXBwbGljYXRpb25FcnJvciwgcmhzOiBUQXBwbGljYXRpb25FcnJvcikgLT4gQm9vbCB7CisgIHJldHVybiBsaHMuZXJyb3IudGhyaWZ0RXJyb3JDb2RlID09IHJocy5lcnJvci50aHJpZnRFcnJvckNvZGUgJiYgbGhzLm1lc3NhZ2UgPT0gcmhzLm1lc3NhZ2UKK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RCaW5hcnkuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UQmluYXJ5LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZTU2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UQmluYXJ5LnN3aWZ0CkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworZXh0ZW5zaW9uIERhdGEgOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLnN0cmluZyB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBEYXRhIHsKKyAgICByZXR1cm4gdHJ5IHByb3RvLnJlYWQoKSBhcyBEYXRhCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlKHNlbGYpCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RCaW5hcnlQcm90b2NvbC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RCaW5hcnlQcm90b2NvbC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTcyNDlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEJpbmFyeVByb3RvY29sLnN3aWZ0CkBAIC0wLDAgKzEsMzg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKK3B1YmxpYyBzdHJ1Y3QgVEJpbmFyeVByb3RvY29sVmVyc2lvbiB7CisgIHN0YXRpYyBsZXQgdmVyc2lvbjEgICAgPSBJbnQzMihiaXRQYXR0ZXJuOiAweDgwMDEwMDAwKQorICBzdGF0aWMgbGV0IHZlcnNpb25NYXNrID0gSW50MzIoYml0UGF0dGVybjogMHhmZmZmMDAwMCkKK30KKworcHVibGljIGNsYXNzIFRCaW5hcnlQcm90b2NvbDogVFByb3RvY29sIHsKKyAgcHVibGljIHZhciBtZXNzYWdlU2l6ZUxpbWl0OiBVSW50MzIgID0gMAorICAKKyAgcHVibGljIHZhciB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQKKyAgCisgIC8vIGNsYXNzIGxldmVsIHByb3BlcnRpZXMgZm9yIHNldHRpbmcgZ2xvYmFsIGNvbmZpZyAodXNlZnVsIGZvciBzZXJ2ZXIgaW4gbGlldSBvZiBGYWN0b3J5IGRlc2lnbikKKyAgcHVibGljIHN0YXRpYyB2YXIgc3RyaWN0UmVhZDogQm9vbCA9IGZhbHNlCisgIHB1YmxpYyBzdGF0aWMgdmFyIHN0cmljdFdyaXRlOiBCb29sID0gdHJ1ZQorCisgIHByaXZhdGUgdmFyIHN0cmljdFJlYWQ6IEJvb2wKKyAgcHJpdmF0ZSB2YXIgc3RyaWN0V3JpdGU6IEJvb2wKKyAgCisgIHZhciBjdXJyZW50TWVzc2FnZU5hbWU6IFN0cmluZz8KKyAgdmFyIGN1cnJlbnRGaWVsZE5hbWU6IFN0cmluZz8KKyAgCisgIAorICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdCh0cmFuc3BvcnQ6IFRUcmFuc3BvcnQsIHN0cmljdFJlYWQ6IEJvb2wsIHN0cmljdFdyaXRlOiBCb29sKSB7CisgICAgc2VsZi5pbml0KG9uOiB0cmFuc3BvcnQpCisgICAgc2VsZi5zdHJpY3RSZWFkID0gc3RyaWN0UmVhZAorICAgIHNlbGYuc3RyaWN0V3JpdGUgPSBzdHJpY3RXcml0ZQorICB9CisgIAorICBwdWJsaWMgcmVxdWlyZWQgaW5pdChvbiB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQpIHsKKyAgICBzZWxmLnRyYW5zcG9ydCA9IHRyYW5zcG9ydAorICAgIHNlbGYuc3RyaWN0V3JpdGUgPSBUQmluYXJ5UHJvdG9jb2wuc3RyaWN0V3JpdGUKKyAgICBzZWxmLnN0cmljdFJlYWQgPSBUQmluYXJ5UHJvdG9jb2wuc3RyaWN0UmVhZAorICB9CisgIAorICBmdW5jIHJlYWRTdHJpbmdCb2R5KF8gc2l6ZTogSW50KSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICAKKyAgICB2YXIgZGF0YSA9IERhdGEoKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpKSB7CisgICAgICBkYXRhID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogc2l6ZSkKKyAgICB9CisgICAgCisgICAgcmV0dXJuIFN0cmluZyhkYXRhOiBkYXRhLCBlbmNvZGluZzogU3RyaW5nLkVuY29kaW5nLnV0ZjgpID8/ICIiCisgIH0KKyAgCisgIC8vLyBNYXJrOiAtIFRQcm90b2NvbAorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nLCBUTWVzc2FnZVR5cGUsIEludDMyKSB7CisgICAgbGV0IHNpemU6IEludDMyID0gdHJ5IHJlYWQoKQorICAgIHZhciBtZXNzYWdlTmFtZSA9ICIiCisgICAgdmFyIHR5cGUgPSBUTWVzc2FnZVR5cGUuZXhjZXB0aW9uCisgICAgCisgICAgaWYgc2l6ZSA8IDAgeworICAgICAgbGV0IHZlcnNpb24gPSBzaXplICYgVEJpbmFyeVByb3RvY29sVmVyc2lvbi52ZXJzaW9uTWFzaworICAgICAgaWYgdmVyc2lvbiAhPSBUQmluYXJ5UHJvdG9jb2xWZXJzaW9uLnZlcnNpb24xIHsKKyAgICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5iYWRWZXJzaW9uKGV4cGVjdGVkOiAiXChUQmluYXJ5UHJvdG9jb2xWZXJzaW9uLnZlcnNpb24xKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3Q6ICJcKHZlcnNpb24pIikpCisgICAgICB9CisgICAgICB0eXBlID0gVE1lc3NhZ2VUeXBlKHJhd1ZhbHVlOiBJbnQzMihzaXplKSAmIDB4MDBGRikgPz8gdHlwZQorICAgICAgbWVzc2FnZU5hbWUgPSB0cnkgcmVhZCgpCisgICAgfSBlbHNlIHsKKyAgICAgIGlmIHN0cmljdFJlYWQgeworICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gIk1pc3NpbmcgbWVzc2FnZSB2ZXJzaW9uLCBvbGQgY2xpZW50PyBNZXNzYWdlIE5hbWU6IFwoY3VycmVudE1lc3NhZ2VOYW1lID8/ICIiKSIKKyAgICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5pbnZhbGlkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlKQorICAgICAgfQorICAgICAgaWYgbWVzc2FnZVNpemVMaW1pdCA+IDAgJiYgc2l6ZSA+IEludDMyKG1lc3NhZ2VTaXplTGltaXQpIHsKKyAgICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5zaXplTGltaXQobGltaXQ6IEludChtZXNzYWdlU2l6ZUxpbWl0KSwgZ290OiBJbnQoc2l6ZSkpKQorICAgICAgfQorICAgICAgCisgICAgICBtZXNzYWdlTmFtZSA9IHRyeSByZWFkU3RyaW5nQm9keShJbnQoc2l6ZSkpCisgICAgICB0eXBlID0gVE1lc3NhZ2VUeXBlKHJhd1ZhbHVlOiBJbnQzMih0cnkgcmVhZCgpIGFzIFVJbnQ4KSkgPz8gdHlwZQorICAgIH0KKyAgICAKKyAgICBsZXQgc2VxSUQ6IEludDMyID0gdHJ5IHJlYWQoKQorICAgIHJldHVybiAobWVzc2FnZU5hbWUsIHR5cGUsIHNlcUlEKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWVzc2FnZUVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTdHJ1Y3RCZWdpbigpIHRocm93cyAtPiBTdHJpbmcgeworICAgIHJldHVybiAiIgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU3RydWN0RW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEZpZWxkQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZywgVFR5cGUsIEludDMyKSB7CisgICAgCisgICAgbGV0IGZpZWxkVHlwZSA9IFRUeXBlKHJhd1ZhbHVlOiBJbnQzMih0cnkgcmVhZCgpIGFzIFVJbnQ4KSkgPz8gVFR5cGUuc3RvcAorICAgIHZhciBmaWVsZElEOiBJbnQzMiA9IDAKKyAgICAKKyAgICBpZiBmaWVsZFR5cGUgIT0gLnN0b3AgeworICAgICAgZmllbGRJRCA9IEludDMyKHRyeSByZWFkKCkgYXMgSW50MTYpCisgICAgfQorICAgIAorICAgIHJldHVybiAoIiIsIGZpZWxkVHlwZSwgZmllbGRJRCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEZpZWxkRW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgVFR5cGUsIEludDMyKSB7CisgICAgdmFyIHJhdyA9IEludDMyKHRyeSByZWFkKCkgYXMgVUludDgpCisgICAgZ3VhcmQgbGV0IGtleVR5cGUgPSBUVHlwZShyYXdWYWx1ZTogcmF3KSBlbHNlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJVbmtub3duIHZhbHVlIGZvciBrZXlUeXBlIFRUeXBlOiBcKHJhdykiKQorICAgIH0KKyAgICAKKyAgICByYXcgPSBJbnQzMih0cnkgcmVhZCgpIGFzIFVJbnQ4KQorICAgIGd1YXJkIGxldCB2YWx1ZVR5cGUgPSBUVHlwZShyYXdWYWx1ZTogcmF3KSBlbHNlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJVbmtub3duIHZhbHVlIGZvciB2YWx1ZVR5cGUgVFR5cGU6IFwocmF3KSIpCisgICAgfQorICAgIGxldCBzaXplOiBJbnQzMiA9IHRyeSByZWFkKCkKKyAgICAKKyAgICByZXR1cm4gKGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1hcEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTZXRCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgbGV0IHJhdyA9IEludDMyKHRyeSByZWFkKCkgYXMgVUludDgpCisgICAgZ3VhcmQgbGV0IGVsZW1lbnRUeXBlID0gVFR5cGUocmF3VmFsdWU6IHJhdykgZWxzZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVW5rbm93biB2YWx1ZSBmb3IgZWxlbWVudFR5cGUgVFR5cGU6IFwocmF3KSIpCisgICAgfQorICAgIAorICAgIGxldCBzaXplOiBJbnQzMiA9IHRyeSByZWFkKCkKKyAgICAKKyAgICByZXR1cm4gKGVsZW1lbnRUeXBlLCBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU2V0RW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZExpc3RCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgbGV0IHJhdyA9IEludDMyKHRyeSByZWFkKCkgYXMgVUludDgpCisgICAgZ3VhcmQgbGV0IGVsZW1lbnRUeXBlID0gVFR5cGUocmF3VmFsdWU6IHJhdykgZWxzZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVW5rbm93biB2YWx1ZSBmb3IgZWxlbWVudFR5cGUgVFR5cGU6IFwocmF3KSIpCisgICAgfQorICAgIGxldCBzaXplOiBJbnQzMiA9IHRyeSByZWFkKCkKKyAgICAKKyAgICByZXR1cm4gKGVsZW1lbnRUeXBlLCBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTGlzdEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICBsZXQgZGF0YTogRGF0YSA9IHRyeSByZWFkKCkKKyAgICBndWFyZCBsZXQgc3RyID0gU3RyaW5nLmluaXQoZGF0YTogZGF0YSwgZW5jb2Rpbmc6IC51dGY4KSBlbHNlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAuaW52YWxpZERhdGEsIG1lc3NhZ2U6ICJDb3VsZG4ndCBlbmNvZGUgVVRGLTggZnJvbSBkYXRhIHJlYWQiKQorICAgIH0KKyAgICByZXR1cm4gc3RyCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gQm9vbCB7CisgICAgcmV0dXJuICh0cnkgcmVhZCgpIGFzIFVJbnQ4KSA9PSAxCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gVUludDggeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFJlYWQgRmFpbGVkIikpIHsKKyAgICAgIGJ1ZmYgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiAxKQorICAgIH0KKyAgICByZXR1cm4gYnVmZlswXQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDE2IHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBSZWFkIEZhaWxlZCIpKSB7CisgICAgICBidWZmID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogMikKKyAgICB9CisgICAgdmFyIHJldCA9IEludDE2KGJ1ZmZbMF0gJiAweGZmKSA8PCA4CisgICAgcmV0IHw9ICAgIEludDE2KGJ1ZmZbMV0gJiAweGZmKQorICAgIHJldHVybiByZXQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQzMiB7CisgICAgdmFyIGJ1ZmYgPSBEYXRhKCkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgUmVhZCBGYWlsZWQiKSkgeworICAgICAgYnVmZiA9IHRyeSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IDQpCisgICAgfQorICAgIHZhciByZXQgPSBJbnQzMihidWZmWzBdICYgMHhmZikgPDwgMjQKKyAgICByZXQgfD0gICAgSW50MzIoYnVmZlsxXSAmIDB4ZmYpIDw8IDE2CisgICAgcmV0IHw9ICAgIEludDMyKGJ1ZmZbMl0gJiAweGZmKSA8PCA4CisgICAgcmV0IHw9ICAgIEludDMyKGJ1ZmZbM10gJiAweGZmKQorICAgIAorICAgIHJldHVybiByZXQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQ2NCB7CisgICAgdmFyIGJ1ZmYgPSBEYXRhKCkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgUmVhZCBGYWlsZWQiKSkgeworICAgICAgYnVmZiA9IHRyeSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IDgpCisgICAgfQorICAgIHZhciByZXQgPSBJbnQ2NChidWZmWzBdICYgMHhmZikgPDwgNTYKKyAgICByZXQgfD0gICAgSW50NjQoYnVmZlsxXSAmIDB4ZmYpIDw8IDQ4CisgICAgcmV0IHw9ICAgIEludDY0KGJ1ZmZbMl0gJiAweGZmKSA8PCA0MAorICAgIHJldCB8PSAgICBJbnQ2NChidWZmWzNdICYgMHhmZikgPDwgMzIKKyAgICByZXQgfD0gICAgSW50NjQoYnVmZls0XSAmIDB4ZmYpIDw8IDI0CisgICAgcmV0IHw9ICAgIEludDY0KGJ1ZmZbNV0gJiAweGZmKSA8PCAxNgorICAgIHJldCB8PSAgICBJbnQ2NChidWZmWzZdICYgMHhmZikgPDwgOAorICAgIHJldCB8PSAgICBJbnQ2NChidWZmWzddICYgMHhmZikKKyAgICAKKyAgICByZXR1cm4gcmV0CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gRG91YmxlIHsKKyAgICBsZXQgdmFsID0gdHJ5IHJlYWQoKSBhcyBJbnQ2NAorICAgIHJldHVybiBEb3VibGUoYml0UGF0dGVybjogVUludDY0KGJpdFBhdHRlcm46IHZhbCkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gRGF0YSB7CisgICAgbGV0IHNpemUgPSBJbnQodHJ5IHJlYWQoKSBhcyBJbnQzMikKKyAgICB2YXIgZGF0YSA9IERhdGEoKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBSZWFkIEZhaWxlZCIpKSB7CisgICAgICBkYXRhID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogc2l6ZSkKKyAgICB9CisgICAgCisgICAgcmV0dXJuIGRhdGEKKyAgfQorICAKKyAgLy8gV3JpdGUgbWV0aG9kcworICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNZXNzYWdlQmVnaW4obmFtZTogU3RyaW5nLCB0eXBlIG1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGUsIHNlcXVlbmNlSUQ6IEludDMyKSB0aHJvd3MgeworICAgIGlmIHN0cmljdFdyaXRlIHsKKyAgICAgIGxldCB2ZXJzaW9uID0gVEJpbmFyeVByb3RvY29sVmVyc2lvbi52ZXJzaW9uMSB8IEludDMyKG1lc3NhZ2VUeXBlLnJhd1ZhbHVlKQorICAgICAgdHJ5IHdyaXRlKHZlcnNpb24pCisgICAgICB0cnkgd3JpdGUobmFtZSkKKyAgICAgIHRyeSB3cml0ZShzZXF1ZW5jZUlEKQorICAgIH0gZWxzZSB7CisgICAgICB0cnkgd3JpdGUobmFtZSkKKyAgICAgIHRyeSB3cml0ZShVSW50OChtZXNzYWdlVHlwZS5yYXdWYWx1ZSkpCisgICAgICB0cnkgd3JpdGUoc2VxdWVuY2VJRCkKKyAgICB9CisgICAgY3VycmVudE1lc3NhZ2VOYW1lID0gbmFtZQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VFbmQoKSB0aHJvd3MgeworICAgIGN1cnJlbnRNZXNzYWdlTmFtZSA9IG5pbAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVN0cnVjdEJlZ2luKG5hbWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTdHJ1Y3RFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkQmVnaW4obmFtZTogU3RyaW5nLCB0eXBlIGZpZWxkVHlwZTogVFR5cGUsIGZpZWxkSUQ6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZShVSW50OChmaWVsZFR5cGUucmF3VmFsdWUpKQorICAgIHRyeSB3cml0ZShJbnQxNihmaWVsZElEKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZFN0b3AoKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZShVSW50OChUVHlwZS5zdG9wLnJhd1ZhbHVlKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWFwQmVnaW4oa2V5VHlwZTogVFR5cGUsIHZhbHVlVHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZShVSW50OChrZXlUeXBlLnJhd1ZhbHVlKSkKKyAgICB0cnkgd3JpdGUoVUludDgodmFsdWVUeXBlLnJhd1ZhbHVlKSkKKyAgICB0cnkgd3JpdGUoc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNYXBFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVNldEJlZ2luKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlKFVJbnQ4KGVsZW1lbnRUeXBlLnJhd1ZhbHVlKSkKKyAgICB0cnkgd3JpdGUoc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTZXRFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUxpc3RCZWdpbihlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZShVSW50OChlbGVtZW50VHlwZS5yYXdWYWx1ZSkpCisgICAgdHJ5IHdyaXRlKHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTGlzdEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGUodmFsdWUuZGF0YSh1c2luZzogLnV0ZjgpISkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogQm9vbCkgdGhyb3dzIHsKKyAgICBsZXQgYnl0ZVZhbDogVUludDggPSB2YWx1ZSA/IDEgOiAwCisgICAgdHJ5IHdyaXRlKGJ5dGVWYWwpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IFVJbnQ4KSB0aHJvd3MgeworICAgIGxldCBidWZmID0gRGF0YShieXRlczogW3ZhbHVlXSkKKyAgICAKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBidWZmKQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50MTYpIHRocm93cyB7CisgICAgdmFyIGJ1ZmYgPSBEYXRhKCkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiA4KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSkpXSkpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogYnVmZikKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDMyKSB0aHJvd3MgeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gMjQpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDE2KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiA4KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSkpXSkpCisgICAgCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogYnVmZikKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDY0KSB0aHJvd3MgeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gNTYpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDQ4KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiA0MCkpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gMzIpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDI0KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiAxNikpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gOCkpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUpKV0pKQorICAgIAorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IGJ1ZmYpCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBEb3VibGUpIHRocm93cyB7CisgICAgLy8gTm90YWJseSB1bnNhZmUsIHNpbmNlIERvdWJsZSBhbmQgSW50NjQgYXJlIHRoZSBzYW1lIHNpemUsIHRoaXMgc2hvdWxkIHdvcmsgZmluZQorICAgIHRyeSBzZWxmLndyaXRlKEludDY0KGJpdFBhdHRlcm46IHZhbHVlLmJpdFBhdHRlcm4pKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlKEludDMyKGRhdGEuY291bnQpKQorICAgIAorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IGRhdGEpCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UQ2xpZW50LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVENsaWVudC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzMyODhhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVENsaWVudC5zd2lmdApAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworb3BlbiBjbGFzcyBUQ2xpZW50IHsKKyAgcHVibGljIGxldCBpblByb3RvY29sOiBUUHJvdG9jb2wKKyAgcHVibGljIGxldCBvdXRQcm90b2NvbDogVFByb3RvY29sCisKKyAgcmVxdWlyZWQgcHVibGljIGluaXQoaW5vdXRQcm90b2NvbDogVFByb3RvY29sKSB7CisgICAgc2VsZi5pblByb3RvY29sID0gaW5vdXRQcm90b2NvbAorICAgIHNlbGYub3V0UHJvdG9jb2wgPSBpbm91dFByb3RvY29sCisgIH0KKworICByZXF1aXJlZCBwdWJsaWMgaW5pdChpblByb3RvY29sOiBUUHJvdG9jb2wsIG91dFByb3RvY29sOiBUUHJvdG9jb2wpIHsKKyAgICBzZWxmLmluUHJvdG9jb2wgPSBpblByb3RvY29sCisgICAgc2VsZi5vdXRQcm90b2NvbCA9IG91dFByb3RvY29sCisgIH0KK30KKworCitvcGVuIGNsYXNzIFRBc3luY0NsaWVudDxQcm90b2NvbDogVFByb3RvY29sLCBGYWN0b3J5OiBUQXN5bmNUcmFuc3BvcnRGYWN0b3J5PiB7CisgIHB1YmxpYyB2YXIgZmFjdG9yeTogRmFjdG9yeQorICBwdWJsaWMgaW5pdCh3aXRoIHByb3RvY29sOiBQcm90b2NvbC5UeXBlLCBmYWN0b3J5OiBGYWN0b3J5KSB7CisgICAgc2VsZi5mYWN0b3J5ID0gZmFjdG9yeQorICB9Cit9CisKKworcHVibGljIGVudW0gVEFzeW5jUmVzdWx0PFQ+IHsKKyAgY2FzZSBzdWNjZXNzKFQpCisgIGNhc2UgZXJyb3IoU3dpZnQuRXJyb3IpCisgIAorICBwdWJsaWMgZnVuYyB2YWx1ZSgpIHRocm93cyAtPiBUIHsKKyAgICBzd2l0Y2ggc2VsZiB7CisgICAgY2FzZSAuc3VjY2VzcyhsZXQgdCk6IHJldHVybiB0CisgICAgY2FzZSAuZXJyb3IobGV0IGUpOiB0aHJvdyBlCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UQ29tcGFjdFByb3RvY29sLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVENvbXBhY3RQcm90b2NvbC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTc3M2MzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVENvbXBhY3RQcm90b2NvbC5zd2lmdApAQCAtMCwwICsxLDU3NSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KK2ltcG9ydCBDb3JlRm91bmRhdGlvbgorCitwdWJsaWMgZW51bSBUQ1R5cGU6IFVJbnQ4IHsKKyAgY2FzZSBzdG9wICAgICAgICAgID0gMHgwMAorICBjYXNlIGJvb2xlYW5fVFJVRSAgPSAweDAxCisgIGNhc2UgYm9vbGVhbl9GQUxTRSA9IDB4MDIKKyAgY2FzZSBpOCAgICAgICAgICAgID0gMHgwMworICBjYXNlIGkxNiAgICAgICAgICAgPSAweDA0CisgIGNhc2UgaTMyICAgICAgICAgICA9IDB4MDUKKyAgY2FzZSBpNjQgICAgICAgICAgID0gMHgwNgorICBjYXNlIGRvdWJsZSAgICAgICAgPSAweDA3CisgIGNhc2UgYmluYXJ5ICAgICAgICA9IDB4MDgKKyAgY2FzZSBsaXN0ICAgICAgICAgID0gMHgwOQorICBjYXNlIHNldCAgICAgICAgICAgPSAweDBBCisgIGNhc2UgbWFwICAgICAgICAgICA9IDB4MEIKKyAgY2FzZSBgc3RydWN0YCAgICAgID0gMHgwQworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdHlwZU1hc2s6IFVJbnQ4ID0gMHhFMCAvLyAxMTEwIDAwMDAKKyAgcHVibGljIHN0YXRpYyBsZXQgdHlwZUJpdHM6IFVJbnQ4ID0gMHgwNyAvLyAwMDAwIDAxMTEKKyAgcHVibGljIHN0YXRpYyBsZXQgdHlwZVNoaWZ0QW1vdW50ID0gNQorIAorfQorCisKK3B1YmxpYyBjbGFzcyBUQ29tcGFjdFByb3RvY29sOiBUUHJvdG9jb2wgeworICBwdWJsaWMgc3RhdGljIGxldCBwcm90b2NvbElEOiBVSW50OCAgPSAweDgyCisgIHB1YmxpYyBzdGF0aWMgbGV0IHZlcnNpb246IFVJbnQ4ICAgICA9IDEKKyAgcHVibGljIHN0YXRpYyBsZXQgdmVyc2lvbk1hc2s6IFVJbnQ4ID0gMHgxRiAvLyAwMDAxIDExMTEKKyAgCisgIHB1YmxpYyB2YXIgdHJhbnNwb3J0OiBUVHJhbnNwb3J0CisgIAorICB2YXIgbGFzdEZpZWxkOiBbVUludDhdID0gW10KKyAgdmFyIGxhc3RGaWVsZElkOiBVSW50OCA9IDAKKyAgCisgIHZhciBib29sRmllbGROYW1lOiBTdHJpbmc/CisgIHZhciBib29sRmllbGRUeXBlOiBUVHlwZT8KKyAgdmFyIGJvb2xGaWVsZElkOiBJbnQzMj8KKyAgdmFyIGJvb2xlYW5WYWx1ZTogQm9vbD8KKyAgCisgIHZhciBjdXJyZW50TWVzc2FnZU5hbWU6IFN0cmluZz8KKworICBwdWJsaWMgcmVxdWlyZWQgaW5pdChvbiB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQpIHsKKyAgICBzZWxmLnRyYW5zcG9ydCA9IHRyYW5zcG9ydAorICB9CisKKyAgCisgIC8vLyBNYXJrOiAtIFRDb21wYWN0UHJvdG9jb2wgaGVscGVycworICAKKyAgZnVuYyB3cml0ZWJ5dGVEaXJlY3QoXyBieXRlOiBVSW50OCkgdGhyb3dzIHsKKyAgICBsZXQgYnl0ZSA9IERhdGEoYnl0ZXM6IFtieXRlXSkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgV3JpdGUgRmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBieXRlKQorICAgIH0KKyAgfQorICAKKyAgZnVuYyB3cml0ZVZhcmludDMyKF8gdmFsOiBVSW50MzIpIHRocm93cyB7CisgICAgdmFyIHZhbCA9IHZhbAorICAgIHZhciBpMzJidWYgPSBbVUludDhdKHJlcGVhdGluZzogMCwgY291bnQ6IDUpCisgICAgdmFyIGlkeCA9IDAKKyAgICB3aGlsZSB0cnVlIHsKKyAgICAgIGlmICh2YWwgJiB+MHg3RikgPT0gMCB7CisgICAgICAgIGkzMmJ1ZltpZHhdID0gVUludDgodmFsKQorICAgICAgICBpZHggKz0gMQorICAgICAgICBicmVhaworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaTMyYnVmW2lkeF0gPSBVSW50OCgodmFsICYgMHg3RikgfCAweDgwKQorICAgICAgICBpZHggKz0gMQorICAgICAgICB2YWwgPj49IDcKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFdyaXRlIEZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogRGF0YShieXRlczogaTMyYnVmWzAuLjxpZHhdKSkKKyAgICB9CisgIH0KKyAgCisgIGZ1bmMgd3JpdGVWYXJpbnQ2NChfIHZhbDogVUludDY0KSB0aHJvd3MgeworICAgIHZhciB2YWwgPSB2YWwKKyAgICB2YXIgdmFyaW50NjRvdXQgPSBbVUludDhdKHJlcGVhdGluZzogMCwgY291bnQ6IDEwKQorICAgIHZhciBpZHggPSAwCisgICAgd2hpbGUgdHJ1ZSB7CisgICAgICBpZiAodmFsICYgfjB4N0YpID09IDB7CisgICAgICAgIHZhcmludDY0b3V0W2lkeF0gPSBVSW50OCh2YWwpCisgICAgICAgIGlkeCArPSAxCisgICAgICAgIGJyZWFrCisgICAgICB9IGVsc2UgeworICAgICAgICB2YXJpbnQ2NG91dFtpZHhdID0gVUludDgodmFsICYgMHg3RikgfCAweDgwCisgICAgICAgIGlkeCArPSAxCisgICAgICAgIHZhbCA+Pj0gNworICAgICAgfQorICAgIH0KKyAgICAKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgV3JpdGUgRmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBEYXRhKGJ5dGVzOiB2YXJpbnQ2NG91dFswLi48aWR4XSkpCisgICAgfQorICAKKyAgfQorICAKKyAgZnVuYyB3cml0ZUNvbGxlY3Rpb25CZWdpbihfIGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgbGV0IGN0eXBlID0gY29tcGFjdFR5cGUoZWxlbWVudFR5cGUpLnJhd1ZhbHVlCisgICAgaWYgc2l6ZSA8PSAxNCB7CisgICAgICB0cnkgd3JpdGVieXRlRGlyZWN0KFVJbnQ4KHNpemUgPDwgNCkgfCBjdHlwZSkKKyAgICB9IGVsc2UgeworICAgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdCgweEYwIHwgY3R5cGUpCisgICAgICB0cnkgd3JpdGVWYXJpbnQzMihVSW50MzIoc2l6ZSkpCisgICAgfQorICB9CisgIAorICBmdW5jIHJlYWRCaW5hcnkoXyBzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICB2YXIgcmVzdWx0ID0gRGF0YSgpCisgICAgaWYgc2l6ZSAhPSAwIHsKKyAgICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBSZWFkIEZhaWxlZCIpKSB7CisgICAgICAgIHJlc3VsdCA9IHRyeSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IHNpemUpCisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgZnVuYyByZWFkVmFyaW50MzIoKSB0aHJvd3MgLT4gVUludDMyIHsKKyAgICB2YXIgcmVzdWx0OiBVSW50MzIgPSAwCisgICAgdmFyIHNoaWZ0OiBVSW50MzIgPSAwCisgICAgd2hpbGUgdHJ1ZSB7CisgICAgICBsZXQgYnl0ZTogVUludDggPSB0cnkgcmVhZCgpCisgICAgICAKKyAgICAgIHJlc3VsdCB8PSBVSW50MzIoYnl0ZSAmIDB4N0YpIDw8IHNoaWZ0CisgICAgICBpZiAoYnl0ZSAmIDB4ODApID09IDAgeworICAgICAgICBicmVhaworICAgICAgfQorICAgICAgCisgICAgICBzaGlmdCArPSA3CisgICAgfQorICAgIAorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgZnVuYyByZWFkVmFyaW50NjQoKSB0aHJvd3MgLT4gVUludDY0IHsKKyAgICB2YXIgcmVzdWx0OiBVSW50NjQgPSAwCisgICAgdmFyIHNoaWZ0OiBVSW50NjQgPSAwCisgICAgCisgICAgd2hpbGUgdHJ1ZSB7CisgICAgICBsZXQgYnl0ZTogVUludDggPSB0cnkgcmVhZCgpCisgICAgICAKKyAgICAgIHJlc3VsdCB8PSBVSW50NjQoYnl0ZSAmIDB4N0YpIDw8IHNoaWZ0CisgICAgICBpZiAoYnl0ZSAmIDB4ODApID09IDAgeworICAgICAgICBicmVhaworICAgICAgfQorICAgICAgCisgICAgICBzaGlmdCArPSA3CisgICAgfQorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKworICBmdW5jIHR0eXBlKF8gY29tcGFjdFR5cGVWYWw6IFVJbnQ4KSB0aHJvd3MgLT4gVFR5cGUgeworICAgIGd1YXJkIGxldCBjb21wYWN0VHlwZSA9IFRDVHlwZShyYXdWYWx1ZTogY29tcGFjdFR5cGVWYWwpIGVsc2UgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlVua25vd24gVENUeXBlIHZhbHVlOiBcKGNvbXBhY3RUeXBlVmFsKSIpCisgICAgfQorICAgIAorICAgIHN3aXRjaCBjb21wYWN0VHlwZSB7CisgICAgY2FzZSAuc3RvcDogcmV0dXJuIC5zdG9wOworICAgIGNhc2UgLmJvb2xlYW5fRkFMU0UsIC5ib29sZWFuX1RSVUU6IHJldHVybiAuYm9vbDsKKyAgICBjYXNlIC5pODogcmV0dXJuIC5pODsKKyAgICBjYXNlIC5pMTY6IHJldHVybiAuaTE2OworICAgIGNhc2UgLmkzMjogcmV0dXJuIC5pMzI7CisgICAgY2FzZSAuaTY0OiByZXR1cm4gLmk2NDsKKyAgICBjYXNlIC5kb3VibGU6IHJldHVybiAuZG91YmxlOworICAgIGNhc2UgLmJpbmFyeTogcmV0dXJuIC5zdHJpbmc7CisgICAgY2FzZSAubGlzdDogcmV0dXJuIC5saXN0OworICAgIGNhc2UgLnNldDogcmV0dXJuIC5zZXQ7CisgICAgY2FzZSAubWFwOiByZXR1cm4gLm1hcDsKKyAgICBjYXNlIC5zdHJ1Y3Q6IHJldHVybiAuc3RydWN0OworICAgIH0KKyAgfQorICAKKyAgZnVuYyBjb21wYWN0VHlwZShfIHR0eXBlOiBUVHlwZSkgLT4gVENUeXBlIHsKKyAgICBzd2l0Y2ggdHR5cGUgeworICAgIGNhc2UgLnN0b3A6ICAgcmV0dXJuIC5zdG9wCisgICAgY2FzZSAudm9pZDogICByZXR1cm4gLmk4CisgICAgY2FzZSAuYm9vbDogICByZXR1cm4gLmJvb2xlYW5fRkFMU0UKKyAgICBjYXNlIC5pODogICByZXR1cm4gLmk4CisgICAgY2FzZSAuZG91YmxlOiByZXR1cm4gLmRvdWJsZQorICAgIGNhc2UgLmkxNjogICAgcmV0dXJuIC5pMTYKKyAgICBjYXNlIC5pMzI6ICAgIHJldHVybiAuaTMyCisgICAgY2FzZSAuaTY0OiAgICByZXR1cm4gLmk2NAorICAgIGNhc2UgLnN0cmluZzogcmV0dXJuIC5iaW5hcnkKKyAgICBjYXNlIC5zdHJ1Y3Q6IHJldHVybiAuc3RydWN0CisgICAgY2FzZSAubWFwOiAgICByZXR1cm4gLm1hcAorICAgIGNhc2UgLnNldDogICAgcmV0dXJuIC5zZXQKKyAgICBjYXNlIC5saXN0OiAgIHJldHVybiAubGlzdAorICAgIGNhc2UgLnV0Zjg6ICAgcmV0dXJuIC5iaW5hcnkKKyAgICBjYXNlIC51dGYxNjogIHJldHVybiAuYmluYXJ5CisgICAgfQorICB9CisgIAorICAvLy8gWmlnWmFnIGVuY29kaW5nIG1hcHMgc2lnbmVkIGludGVnZXJzIHRvIHVuc2lnbmVkIGludGVnZXJzIHNvIHRoYXQKKyAgLy8vIG51bWJlcnMgd2l0aCBhIHNtYWxsIGFic29sdXRlIHZhbHVlIChmb3IgaW5zdGFuY2UsIC0xKSBoYXZlCisgIC8vLyBhIHNtYWxsIHZhcmludCBlbmNvZGVkIHZhbHVlIHRvby4gSXQgZG9lcyB0aGlzIGluIGEgd2F5IHRoYXQKKyAgLy8vICJ6aWctemFncyIgYmFjayBhbmQgZm9ydGggdGhyb3VnaCB0aGUgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGludGVnZXJzLAorICAvLy8gc28gdGhhdCAtMSBpcyBlbmNvZGVkIGFzIDEsIDEgaXMgZW5jb2RlZCBhcyAyLCAtMiBpcyBlbmNvZGVkIGFzIDMsIGFuZCBzbworICAvLy8KKyAgLy8vIC0gcGFyYW1ldGVyIG46IG51bWJlciB0byB6aWd6YWcKKyAgLy8vCisgIC8vLyAtIHJldHVybnM6IHppZ3phZ2VkIFVJbnQzMgorICBmdW5jIGkzMlRvWmlnWmFnKF8gbiA6IEludDMyKSAtPiBVSW50MzIgeworICAgIHJldHVybiBVSW50MzIoYml0UGF0dGVybjogSW50MzIobiA8PCAxKSBeIEludDMyKG4gPj4gMzEpKQorICB9CisKKyAgZnVuYyBpNjRUb1ppZ1phZyhfIG4gOiBJbnQ2NCkgLT4gVUludDY0IHsKKyAgICByZXR1cm4gVUludDY0KGJpdFBhdHRlcm46IEludDY0KG4gPDwgMSkgXiBJbnQ2NChuID4+IDYzKSkKKyAgfQorCisgIGZ1bmMgemlnWmFnVG9pMzIoXyBuOiBVSW50MzIpIC0+IEludDMyIHsKKyAgICByZXR1cm4gSW50MzIobiA+PiAxKSBeICgtSW50MzIobiAmIDEpKQorICB9CisgIAorICBmdW5jIHppZ1phZ1RvaTY0KF8gbjogVUludDY0KSAtPiBJbnQ2NCB7CisgICAgcmV0dXJuIEludDY0KG4gPj4gMSkgXiAoLUludDY0KG4gJiAxKSkKKyAgfQorICAKKyAgCisgIAorICAvLy8gTWFyazogLSBUUHJvdG9jb2wgIAorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nLCBUTWVzc2FnZVR5cGUsIEludDMyKSB7CisgICAgbGV0IHByb3RvY29sSWQ6IFVJbnQ4ID0gdHJ5IHJlYWQoKQorICAgIAorICAgIGlmIHByb3RvY29sSWQgIT0gVENvbXBhY3RQcm90b2NvbC5wcm90b2NvbElEIHsKKyAgICAgIGxldCBleHBlY3RlZCA9IFN0cmluZyhmb3JtYXQ6IiUyWCIsIFRDb21wYWN0UHJvdG9jb2wucHJvdG9jb2xJRCkKKyAgICAgIGxldCBnb3QgICAgICA9IFN0cmluZyhmb3JtYXQ6IiUyWCIsIHByb3RvY29sSWQpCisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiV3JvbmcgUHJvdG9jb2wgSUQgXChnb3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkRXJyb3I6IC5taXNtYXRjaGVkUHJvdG9jb2woZXhwZWN0ZWQ6IGV4cGVjdGVkLCBnb3Q6IGdvdCkpCisKKyAgICB9CisKKyAgICBsZXQgdmVyc2lvbkFuZFR5cGU6IFVJbnQ4ID0gdHJ5IHJlYWQoKQorICAgIGxldCB2ZXJzaW9uOiBVSW50OCA9IHZlcnNpb25BbmRUeXBlICYgVENvbXBhY3RQcm90b2NvbC52ZXJzaW9uTWFzaworICAgIGlmIHZlcnNpb24gIT0gVENvbXBhY3RQcm90b2NvbC52ZXJzaW9uIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAuYmFkVmVyc2lvbihleHBlY3RlZDogIlwoVENvbXBhY3RQcm90b2NvbC52ZXJzaW9uKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290OiJcKHZlcnNpb24pIikpCisKKyAgICB9CisgICAgCisgICAgbGV0IHR5cGUgPSAodmVyc2lvbkFuZFR5cGUgPj4gVUludDgoVENUeXBlLnR5cGVTaGlmdEFtb3VudCkpICYgVENUeXBlLnR5cGVCaXRzCisgICAgZ3VhcmQgbGV0IG10eXBlID0gVE1lc3NhZ2VUeXBlKHJhd1ZhbHVlOiBJbnQzMih0eXBlKSkgZWxzZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVW5rbm93biBUTWVzc2FnZVR5cGUgdmFsdWU6IFwodHlwZSkiKQorICAgIH0KKyAgICBsZXQgc2VxdWVuY2VJZCA9IHRyeSByZWFkVmFyaW50MzIoKQorICAgIGxldCBuYW1lOiBTdHJpbmcgPSB0cnkgcmVhZCgpCisgICAgCisgICAgcmV0dXJuIChuYW1lLCBtdHlwZSwgSW50MzIoc2VxdWVuY2VJZCkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzIHsgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFN0cnVjdEJlZ2luKCkgdGhyb3dzIC0+IFN0cmluZyB7CisgICAgbGFzdEZpZWxkLmFwcGVuZChsYXN0RmllbGRJZCkKKyAgICBsYXN0RmllbGRJZCA9IDAKKyAgICByZXR1cm4gIiIKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFN0cnVjdEVuZCgpIHRocm93cyB7CisgICAgbGFzdEZpZWxkSWQgPSBsYXN0RmllbGQubGFzdCA/PyAwCisgICAgbGFzdEZpZWxkLnJlbW92ZUxhc3QoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkRmllbGRCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nLCBUVHlwZSwgSW50MzIpIHsKKyAgICBsZXQgYnl0ZTogVUludDggPSB0cnkgcmVhZCgpCisgICAgZ3VhcmQgbGV0IHR5cGUgPSBUQ1R5cGUocmF3VmFsdWU6IGJ5dGUgJiAweDBGKSBlbHNlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJVbmtub3duIFRDVHlwZSBcKGJ5dGUgJiAweDBGKSIpCisgICAgfQorICAgIAorICAgIC8vIGlmIGl0J3MgYSBzdG9wLCB0aGVuIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHksIGFzIHRoZSBzdHJ1Y3QgaXMgb3ZlcgorICAgIGlmIHR5cGUgPT0gLnN0b3AgeworICAgICAgcmV0dXJuICgiIiwgLnN0b3AsIDApCisgICAgfQorICAgIAorICAgIHZhciBmaWVsZElkOiBJbnQxNiA9IDAKKyAgICAKKyAgICAvLyBtYXNrIG9mZiB0aGUgNE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuICBpdCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQgZGVsdGEKKyAgICBsZXQgbW9kaWZpZXIgPSAoYnl0ZSAmIDB4RjApID4+IDQKKyAgICBpZiBtb2RpZmllciA9PSAwIHsKKyAgICAgIC8vIG5vdCBhIGRlbHRhLiAgbG9vayBhaGVhZCBmb3IgdGhlIHppZ3phZyB2YXJpbnQgZmllbGQgaWQKKyAgICAgIGZpZWxkSWQgPSB0cnkgcmVhZCgpCisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGhhcyBhIGRlbHRhLiAgYWRkIHRoZSBkZWx0YSB0byB0aGUgbGFzdCBSZWFkIGZpZWxkIGlkLgorICAgICAgZmllbGRJZCA9IEludDE2KGxhc3RGaWVsZElkICsgbW9kaWZpZXIpCisgICAgfQorICAgIAorICAgIGxldCBmaWVsZFR5cGUgPSB0cnkgdHR5cGUodHlwZS5yYXdWYWx1ZSkKKyAgICAKKyAgICAvLyBpZiB0aGlzIGhhcHBlbnMgdG8gYmUgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgdHlwZQorICAgIGlmIHR5cGUgPT0gLmJvb2xlYW5fVFJVRSB8fCB0eXBlID09IC5ib29sZWFuX0ZBTFNFIHsKKyAgICAgIC8vIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlCisgICAgICBib29sZWFuVmFsdWUgPSB0eXBlID09IC5ib29sZWFuX1RSVUUKKyAgICB9CisgICAgCisgICAgLy8gcHVzaCB0aGUgbmV3IGZpZWxkIG9udG8gdGhlIGZpZWxkIHN0YWNrIHNvIHdlIGNhbiBrZWVwIHRoZSBkZWx0YXMgZ29pbmcKKyAgICBsYXN0RmllbGRJZCA9IFVJbnQ4KGZpZWxkSWQpCisgICAgcmV0dXJuICgiIiwgZmllbGRUeXBlLCBJbnQzMihmaWVsZElkKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEZpZWxkRW5kKCkgdGhyb3dzIHsgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBTdHJpbmcgeworICAgIGxldCBsZW5ndGggPSB0cnkgcmVhZFZhcmludDMyKCkKKyAgICAKKyAgICB2YXIgcmVzdWx0OiBTdHJpbmcKKyAgICAKKyAgICBpZiBsZW5ndGggIT0gMCB7CisgICAgICBsZXQgZGF0YSA9IHRyeSByZWFkQmluYXJ5KEludChsZW5ndGgpKQorICAgICAgcmVzdWx0ID0gU3RyaW5nKGRhdGE6IGRhdGEsIGVuY29kaW5nOiBTdHJpbmcuRW5jb2RpbmcudXRmOCkgPz8gIiIKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ID0gIiIKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEJvb2wgeworICAgIGlmIGxldCB2YWwgPSBib29sZWFuVmFsdWUgeworICAgICAgc2VsZi5ib29sZWFuVmFsdWUgPSBuaWwKKyAgICAgIHJldHVybiB2YWwKKyAgICB9IGVsc2UgeworICAgICAgbGV0IHJlc3VsdCA9IHRyeSByZWFkKCkgYXMgVUludDgKKyAgICAgIHJldHVybiBUQ1R5cGUocmF3VmFsdWU6IHJlc3VsdCkgPT0gLmJvb2xlYW5fVFJVRQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBVSW50OCB7CisgICAgdmFyIGJ1ZmY6IFVJbnQ4ID0gMAorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBSZWFkIEZhaWxlZCIpKSB7CisgICAgICBidWZmID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogMSlbMF0KKyAgICB9CisgICAgcmV0dXJuIGJ1ZmYKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQxNiB7CisgICAgbGV0IHYgPSB0cnkgcmVhZFZhcmludDMyKCkKKyAgICByZXR1cm4gSW50MTYoemlnWmFnVG9pMzIodikpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50MzIgeworICAgIGxldCB2ID0gdHJ5IHJlYWRWYXJpbnQzMigpCisgICAgcmV0dXJuIHppZ1phZ1RvaTMyKHYpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50NjQgeworICAgIGxldCB2ID0gdHJ5IHJlYWRWYXJpbnQ2NCgpCisgICAgcmV0dXJuIHppZ1phZ1RvaTY0KHYpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gRG91YmxlIHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBSZWFkIEZhaWxlZCIpKSB7CisgICAgICBidWZmID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogOCkKKyAgICB9CisgICAgCisgICAgbGV0IGk2NDogVUludDY0ID0gYnVmZi53aXRoVW5zYWZlQnl0ZXMgeyAocHRyOiBVbnNhZmVQb2ludGVyPFVJbnQ4PikgLT4gVUludDY0IGluCisgICAgICByZXR1cm4gVW5zYWZlUG9pbnRlcjxVSW50NjQ+KE9wYXF1ZVBvaW50ZXIocHRyKSkucG9pbnRlZQorICAgIH0KKyAgICBsZXQgYml0cyA9IENGU3dhcEludDY0TGl0dGxlVG9Ib3N0KGk2NCkKKyAgICByZXR1cm4gRG91YmxlKGJpdFBhdHRlcm46IGJpdHMpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gRGF0YSB7CisgICAgbGV0IGxlbmd0aCA9IHRyeSByZWFkVmFyaW50MzIoKQorICAgIHJldHVybiB0cnkgcmVhZEJpbmFyeShJbnQobGVuZ3RoKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgVFR5cGUsIEludDMyKSB7CisgICAgdmFyIGtleUFuZFZhbHVlVHlwZTogVUludDggPSA4CisgICAgbGV0IHNpemUgPSB0cnkgcmVhZFZhcmludDMyKCkKKyAgICBpZiBzaXplICE9IDAgeworICAgICAga2V5QW5kVmFsdWVUeXBlID0gdHJ5IHJlYWQoKQorICAgIH0KKyAgICAKKyAgICBsZXQga2V5VHlwZSA9IHRyeSB0dHlwZShrZXlBbmRWYWx1ZVR5cGUgPj4gNCkKKyAgICBsZXQgdmFsdWVUeXBlID0gdHJ5IHR0eXBlKGtleUFuZFZhbHVlVHlwZSAmIDB4RikKKyAgICAKKyAgICByZXR1cm4gKGtleVR5cGUsIHZhbHVlVHlwZSwgSW50MzIoc2l6ZSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNYXBFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU2V0QmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBJbnQzMikgeworICAgIHJldHVybiB0cnkgcmVhZExpc3RCZWdpbigpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTZXRFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTGlzdEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpIHsKKyAgICBsZXQgc2l6ZUFuZFR5cGU6IFVJbnQ4ID0gdHJ5IHJlYWQoKQorICAgIHZhciBzaXplOiBVSW50MzIgPSBVSW50MzIoc2l6ZUFuZFR5cGUgPj4gNCkgJiAweDBmCisgICAgaWYgc2l6ZSA9PSAxNSB7CisgICAgICBzaXplID0gdHJ5IHJlYWRWYXJpbnQzMigpCisgICAgfQorICAgIGxldCBlbGVtZW50VHlwZSA9IHRyeSB0dHlwZShzaXplQW5kVHlwZSAmIDB4MEYpCisgICAgCisgICAgcmV0dXJuIChlbGVtZW50VHlwZSwgSW50MzIoc2l6ZSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRMaXN0RW5kKCkgdGhyb3dzIHsgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNZXNzYWdlQmVnaW4obmFtZTogU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIG1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QoVENvbXBhY3RQcm90b2NvbC5wcm90b2NvbElEKQorICAgIGxldCBuZXh0Qnl0ZTogVUludDggPSAoVENvbXBhY3RQcm90b2NvbC52ZXJzaW9uICYgVENvbXBhY3RQcm90b2NvbC52ZXJzaW9uTWFzaykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAoVUludDgoKFVJbnQzMihtZXNzYWdlVHlwZS5yYXdWYWx1ZSkgPDwgVUludDMyKFRDVHlwZS50eXBlU2hpZnRBbW91bnQpKSkgJgorICAgICAgICAgICAgICAgICAgICAgICAgICBUQ1R5cGUudHlwZU1hc2spCisgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdChuZXh0Qnl0ZSkKKyAgICB0cnkgd3JpdGVWYXJpbnQzMihVSW50MzIoc2VxdWVuY2VJRCkpCisgICAgdHJ5IHdyaXRlKG5hbWUpCisgICAgCisgICAgY3VycmVudE1lc3NhZ2VOYW1lID0gbmFtZQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VFbmQoKSB0aHJvd3MgeworICAgIGN1cnJlbnRNZXNzYWdlTmFtZSA9IG5pbAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVN0cnVjdEJlZ2luKG5hbWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICBsYXN0RmllbGQuYXBwZW5kKGxhc3RGaWVsZElkKQorICAgIGxhc3RGaWVsZElkID0gMAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVN0cnVjdEVuZCgpIHRocm93cyB7CisgICAgbGFzdEZpZWxkSWQgPSBsYXN0RmllbGQubGFzdCA/PyAwCisgICAgbGFzdEZpZWxkLnJlbW92ZUxhc3QoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkQmVnaW4obmFtZTogU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBmaWVsZFR5cGU6IFRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDogSW50MzIpIHRocm93cyB7CisgICAgaWYgZmllbGRUeXBlID09IC5ib29sIHsKKyAgICAgIGJvb2xGaWVsZE5hbWUgPSBuYW1lCisgICAgICBib29sRmllbGRUeXBlID0gZmllbGRUeXBlCisgICAgICBib29sRmllbGRJZCA9IGZpZWxkSUQKKyAgICAgIHJldHVybgorICAgIH0gZWxzZSB7CisgICAgICB0cnkgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwobmFtZTogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDogZmllbGRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlcnJpZGU6IDB4RkYpCisgICAgfQorICB9CisgIAorICBmdW5jIHdyaXRlRmllbGRCZWdpbkludGVybmFsKG5hbWU6IFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGZpZWxkVHlwZTogVFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDogSW50MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU92ZXJyaWRlOiBVSW50OCkgdGhyb3dzIHsKKyAgICAKKyAgICBsZXQgdHlwZVRvV3JpdGUgPSB0eXBlT3ZlcnJpZGUgPT0gMHhGRiA/IGNvbXBhY3RUeXBlKGZpZWxkVHlwZSkucmF3VmFsdWUgOiB0eXBlT3ZlcnJpZGUKKyAgICAKKyAgICAvLyBjaGVjayBpZiB3ZSBjYW4gdXNlIGRlbHRhIGVuY29kaW5nIGZvciB0aGUgZmllbGQgaWQKKyAgICBsZXQgZGlmZiA9IFVJbnQ4KGZpZWxkSUQpIC0gbGFzdEZpZWxkSWQKKyAgICBpZiAoVUludDgoZmllbGRJRCkgPiBsYXN0RmllbGRJZCkgJiYgKGRpZmYgPD0gMTUpIHsKKyAgICAgIC8vIFdyaXRlIHRoZW0gdG9nZXRoZXIKKyAgICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QoKFVJbnQ4KGZpZWxkSUQpIC0gbGFzdEZpZWxkSWQpIDw8IDQgfCB0eXBlVG9Xcml0ZSkKKyAgICAgIAorICAgIH0gZWxzZSB7CisgICAgICAvLyBXcml0ZSB0aGVtIHNlcGFyYXRlCisgICAgICB0cnkgd3JpdGVieXRlRGlyZWN0KHR5cGVUb1dyaXRlKQorICAgICAgdHJ5IHdyaXRlKEludDE2KGZpZWxkSUQpKQorICAgIH0KKyAgICAKKyAgICBsYXN0RmllbGRJZCA9IFVJbnQ4KGZpZWxkSUQpCisgICAgICAKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZFN0b3AoKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QoVENUeXBlLnN0b3AucmF3VmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1hcEJlZ2luKGtleVR5cGU6IFRUeXBlLCB2YWx1ZVR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICBpZiBzaXplID09IDAgeworICAgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdCgwKQorICAgIH0gZWxzZSB7CisgICAgICB0cnkgd3JpdGVWYXJpbnQzMihVSW50MzIoc2l6ZSkpCisgICAgICAKKyAgICAgIGxldCBjb21wYWN0ZWRUeXBlcyA9IGNvbXBhY3RUeXBlKGtleVR5cGUpLnJhd1ZhbHVlIDw8IDQgfCBjb21wYWN0VHlwZSh2YWx1ZVR5cGUpLnJhd1ZhbHVlCisgICAgICB0cnkgd3JpdGVieXRlRGlyZWN0KGNvbXBhY3RlZFR5cGVzKQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNYXBFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVNldEJlZ2luKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1lbnRUeXBlLCBzaXplOiBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVNldEVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTGlzdEJlZ2luKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1lbnRUeXBlLCBzaXplOiBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUxpc3RFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBTdHJpbmcpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlKHZhbHVlLmRhdGEodXNpbmc6IFN0cmluZy5FbmNvZGluZy51dGY4KSEpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEJvb2wpIHRocm93cyB7CisgICAgaWYgbGV0IGJvb2xGaWVsZElkID0gYm9vbEZpZWxkSWQsIGxldCBib29sRmllbGRUeXBlID0gYm9vbEZpZWxkVHlwZSwKKyAgICAgICBsZXQgYm9vbEZpZWxkTmFtZSA9IGJvb2xGaWVsZE5hbWUgeworICAgICAgCisgICAgICAvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKKyAgICAgIGxldCBjb21wYWN0VHlwZTogVENUeXBlID0gdmFsdWUgPyAuYm9vbGVhbl9UUlVFIDogLmJvb2xlYW5fRkFMU0UKKyAgICAgIHRyeSB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lOiBib29sRmllbGROYW1lLCB0eXBlOiBib29sRmllbGRUeXBlLCBmaWVsZElEOiBib29sRmllbGRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlcnJpZGU6IGNvbXBhY3RUeXBlLnJhd1ZhbHVlKQorICAgICAgc2VsZi5ib29sRmllbGRJZCA9IG5pbAorICAgICAgc2VsZi5ib29sRmllbGRUeXBlID0gbmlsCisgICAgICBzZWxmLmJvb2xGaWVsZE5hbWUgPSBuaWwKKyAgICB9IGVsc2UgeworICAgICAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCB3cml0ZSB0aGUgdmFsdWUuCisgICAgICB0cnkgd3JpdGVieXRlRGlyZWN0KHZhbHVlID8gVENUeXBlLmJvb2xlYW5fVFJVRS5yYXdWYWx1ZSA6IFRDVHlwZS5ib29sZWFuX0ZBTFNFLnJhd1ZhbHVlKQorICAgIH0KKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IFVJbnQ4KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QodmFsdWUpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQxNikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVWYXJpbnQzMihpMzJUb1ppZ1phZyhJbnQzMih2YWx1ZSkpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVWYXJpbnQzMihpMzJUb1ppZ1phZyh2YWx1ZSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDY0KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZVZhcmludDY0KGk2NFRvWmlnWmFnKHZhbHVlKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogRG91YmxlKSB0aHJvd3MgeworICAgIHZhciBiaXRzID0gQ0ZTd2FwSW50NjRIb3N0VG9MaXR0bGUodmFsdWUuYml0UGF0dGVybikKKyAgICBsZXQgZGF0YSA9IHdpdGhVbnNhZmVQb2ludGVyKHRvOiAmYml0cykgeworICAgICAgcmV0dXJuIERhdGEoYnl0ZXM6IFVuc2FmZVBvaW50ZXI8VUludDg+KE9wYXF1ZVBvaW50ZXIoJDApKSwgY291bnQ6IE1lbW9yeUxheW91dDxVSW50NjQ+LnNpemUpCisgICAgfQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBXcml0ZSBGYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IGRhdGEpCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlVmFyaW50MzIoVUludDMyKGRhdGEuY291bnQpKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBXcml0ZSBGYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IGRhdGEpCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9URW51bS5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RFbnVtLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZGZkYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9URW51bS5zd2lmdApAQCAtMCwwICsxLDMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcHVibGljIHByb3RvY29sIFRFbnVtIDogVFNlcmlhbGl6YWJsZSwgSGFzaGFibGUgeworICB2YXIgcmF3VmFsdWU6IEludDMyIHsgZ2V0IH0KK30KKworZXh0ZW5zaW9uIFRFbnVtIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLmkzMiB9CisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlOiBJbnQgeyByZXR1cm4gcmF3VmFsdWUuaGFzaFZhbHVlIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShyYXdWYWx1ZSkKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEVycm9yLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEVycm9yLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZWRiYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9URXJyb3Iuc3dpZnQKQEAgLTAsMCArMSw3NyBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCisvLy8gVEVycm9yQ29kZQorLy8vCisvLy8gUHJvdG9jb2wgZm9yIFRFcnJvciBjb25mb3JtZXJzJyBlbnVtJ3MgdG8gY29uZm9ybSB0by4KKy8vLyBHZW5lcmljIEludCBUaHJpZnQgZXJyb3IgY29kZSB0byBhbGxvdyBlcnJvciBjYXNlcyB0byBoYXZlCisvLy8gYXNzb2NpYXRlZCB2YWx1ZXMuCitwdWJsaWMgcHJvdG9jb2wgVEVycm9yQ29kZSA6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlIHsKKyAgdmFyIHRocmlmdEVycm9yQ29kZTogSW50IHsgZ2V0IH0KK30KKworLy8vIFRFcnJvcgorLy8vCisvLy8gQmFzZSBwcm90b2NvbCBmb3IgYWxsIFRocmlmdCBFcnJvcihFeGNlcHRpb24pIHR5cGVzIHRvIGNvbmZvcm0gdG8KK3B1YmxpYyBwcm90b2NvbCBURXJyb3IgOiBFcnJvciwgQ3VzdG9tU3RyaW5nQ29udmVydGlibGUgeworCisgIC8vLyBFbnVtIGZvciBlcnJvciBjYXNlcy4gIENhbiBiZSB0eXBlYWxpYXNlZCB0byBhbnkgY29uZm9ybWluZyBlbnVtCisgIC8vLyBvciBkZWZpbmVkIG5lc3RlZC4KKyAgYXNzb2NpYXRlZHR5cGUgQ29kZTogVEVycm9yQ29kZQorICAKKyAgLy8vIEVycm9yIENhc2UsIHZhbHVlIGZyb20gaW50ZXJuYWwgZW51bQorICB2YXIgZXJyb3I6IENvZGUgeyBnZXQgc2V0IH0KKyAgCisgIC8vLyBPcHRpb25hbCBhZGRpdGlvbmFsIG1lc3NhZ2UKKyAgdmFyIG1lc3NhZ2U6IFN0cmluZz8geyBnZXQgc2V0IH0KKyAgCisgIC8vLyBEZWZhdWx0IGVycm9yIGNhc2UgZm9yIHRoZSBlcnJvciB0eXBlLCB1c2VkIGZvciBnZW5lcmljIGluaXQoKQorICBzdGF0aWMgdmFyIGRlZmF1bHRDYXNlOiBDb2RlIHsgZ2V0IH0KKyAgCisgIGluaXQoKQorfQorCitleHRlbnNpb24gVEVycm9yIHsKKyAgLy8vIEh1bWFuIHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIGVycm9yLiBEZWZhdWx0IHByb3ZpZGVkIGZvciB5b3UgaW4gdGhlCisgIC8vLyBmb3JtYXQgXChTZWxmLnNlbGYpOiBcKGVycm9yLmVycm9yRGVzY3JpcHRpb24pIFxuIG1lc3NhZ2UKKyAgLy8vIGVnOgorICAvLy8KKyAgLy8vICAgICBUQXBwbGljYXRpb25FcnJvciAoMSk6IEludmFsaWQgTWVzc2FnZSBUeXBlCisgIC8vLyAgICAgQW4gdW5rbm93biBFcnJvciBoYXMgb2NjdXJlZC4KKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICB2YXIgb3V0ID0gIlwoU2VsZi5zZWxmKSAoXChlcnJvci50aHJpZnRFcnJvckNvZGUpKTogIiArIGVycm9yLmRlc2NyaXB0aW9uICsgIlxuIgorICAgIGlmIGxldCBtZXNzYWdlID0gbWVzc2FnZSB7CisgICAgICBvdXQgKz0gIk1lc3NhZ2U6IFwobWVzc2FnZSkiCisgICAgfQorICAgIHJldHVybiBvdXQKKyAgfQorCisgIC8vLyBTaW1wbGUgZGVmYXVsdCBJbml0aWFsaXplciBmb3IgVEVycm9yJ3MKKyAgLy8vCisgIC8vLyAtIHBhcmFtZXRlciBlcnJvcjogICBFcnJvckNvZGUgdmFsdWUuICBEZWZhdWx0OiBkZWZhdWx0Q2FzZQorICAvLy8gLSBwYXJhbWV0ZXIgbWVzc2FnZTogQ3VzdG9tIG1lc3NhZ2Ugd2l0aCBlcnJvci4gIE9wdGlvbmFsCisgIC8vLworICAvLy8gLSByZXR1cm5zOiA8I3JldHVybiB2YWx1ZSBkZXNjcmlwdGlvbiM+CisgIHB1YmxpYyBpbml0KGVycm9yOiBDb2RlLCBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsKSB7CisgICAgc2VsZi5pbml0KCkKKyAgICBzZWxmLmVycm9yID0gZXJyb3IKKyAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RGaWxlSGFuZGxlVHJhbnNwb3J0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEZpbGVIYW5kbGVUcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMxNWZlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RGaWxlSGFuZGxlVHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsNTYgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKK3B1YmxpYyBjbGFzcyBURmlsZUhhbmRsZVRyYW5zcG9ydDogVFRyYW5zcG9ydCB7CisgIHZhciBpbnB1dEZpbGVIYW5kbGU6IEZpbGVIYW5kbGUKKyAgdmFyIG91dHB1dEZpbGVIYW5kbGU6IEZpbGVIYW5kbGUKKyAgCisgIHB1YmxpYyBpbml0KGlucHV0RmlsZUhhbmRsZTogRmlsZUhhbmRsZSwgb3V0cHV0RmlsZUhhbmRsZTogRmlsZUhhbmRsZSkgeworICAgIHNlbGYuaW5wdXRGaWxlSGFuZGxlID0gaW5wdXRGaWxlSGFuZGxlCisgICAgc2VsZi5vdXRwdXRGaWxlSGFuZGxlID0gb3V0cHV0RmlsZUhhbmRsZQorICB9CisgIAorICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdChmaWxlSGFuZGxlOiBGaWxlSGFuZGxlKSB7CisgICAgc2VsZi5pbml0KGlucHV0RmlsZUhhbmRsZTogZmlsZUhhbmRsZSwgb3V0cHV0RmlsZUhhbmRsZTogZmlsZUhhbmRsZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICB2YXIgZGF0YSA9IERhdGEoKQorICAgIHdoaWxlIGRhdGEuY291bnQgPCBzaXplIHsKKyAgICAgIGxldCByZWFkID0gaW5wdXRGaWxlSGFuZGxlLnJlYWREYXRhKG9mTGVuZ3RoOiBzaXplIC0gZGF0YS5jb3VudCkKKyAgICAgIGRhdGEuYXBwZW5kKHJlYWQpCisgICAgICBpZiByZWFkLmNvdW50ID09IDAgeworICAgICAgICBicmVhaworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGF0YQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShkYXRhOiBEYXRhKSB0aHJvd3MgeworICAgIG91dHB1dEZpbGVIYW5kbGUud3JpdGUoZGF0YSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZmx1c2goKSB0aHJvd3MgeworICAgIHJldHVybgorICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEZpbGVUcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9URmlsZVRyYW5zcG9ydC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTIyNTNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEZpbGVUcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKyNpZiBvcyhPU1gpIHx8IG9zKGlPUykgfHwgb3Mod2F0Y2hPUykgfHwgb3ModHZPUykKKyAgaW1wb3J0IERhcndpbgorI2Vsc2VpZiBvcyhMaW51eCkgfHwgb3MoRnJlZUJTRCkgfHwgb3MoUFM0KSB8fCBvcyhBbmRyb2lkKQorICBpbXBvcnQgR2xpYmMKKyNlbmRpZgorCisvLy8gVEZpbGVUcmFuc3BvcnQKKy8vLyBGb3VuZGF0aW9uLWxlc3MgU3dpZnQgRmlsZSB0cmFuc3BvcnQuCisvLy8gVXNlcyBDIGZvcGVuL2ZyZWFkL2Z3cml0ZSwKKy8vLyBwcm92aWRlZCBieSBHbGliYyBpbiBsaW51eCBhbmQgRGFyd2luIG9uIE9TWC9pT1MKK3B1YmxpYyBjbGFzcyBURmlsZVRyYW5zcG9ydDogVFRyYW5zcG9ydCB7CisgIHZhciBmaWxlSGFuZGxlOiBVbnNhZmVNdXRhYmxlUG9pbnRlcjxGSUxFPj8gPSBuaWwKKyAgCisgIHB1YmxpYyBpbml0IChmaWxlSGFuZGxlOiBVbnNhZmVNdXRhYmxlUG9pbnRlcjxGSUxFPikgeworICAgIHNlbGYuZmlsZUhhbmRsZSA9IGZpbGVIYW5kbGUKKyAgfQorCisgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KGZpbGVuYW1lOiBTdHJpbmcpIHRocm93cyB7CisgICAgdmFyIGZpbGVIYW5kbGU6IFVuc2FmZU11dGFibGVQb2ludGVyPEZJTEU+PworICAgIGZpbGVuYW1lLndpdGhDU3RyaW5nKHsgY0ZpbGVuYW1lIGluCisgICAgICAicnciLndpdGhDU3RyaW5nKHsgY01vZGUgaW4KKyAgICAgICAgZmlsZUhhbmRsZSA9IGZvcGVuKGNGaWxlbmFtZSwgY01vZGUpCisgICAgICB9KQorICAgIH0pCisgICAgaWYgbGV0IGZpbGVIYW5kbGUgPSBmaWxlSGFuZGxlIHsKKyAgICAgIHNlbGYuaW5pdChmaWxlSGFuZGxlOiBmaWxlSGFuZGxlKQorICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5ub3RPcGVuKQorICAgIH0KKyAgfQorICAKKyAgZGVpbml0IHsKKyAgICBmY2xvc2Uoc2VsZi5maWxlSGFuZGxlKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkQWxsKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIGxldCByZWFkID0gdHJ5IHNlbGYucmVhZChzaXplOiBzaXplKQorICAgIAorICAgIGlmIHJlYWQuY291bnQgIT0gc2l6ZSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5lbmRPZkZpbGUpCisgICAgfQorICAgIHJldHVybiByZWFkCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgLy8gc2V0IHVwIHJlYWQgYnVmZmVyLCBwb3NpdGlvbiAwCisgICAgdmFyIHJlYWQgPSBEYXRhKGNhcGFjaXR5OiBzaXplKQorICAgIHZhciBwb3NpdGlvbiA9IDAKKyAgICAKKyAgICAvLyByZWFkIGNoYXJhY3RlciBidWZmZXIKKyAgICB2YXIgbmV4dENoYXI6IFVJbnQ4ID0gMAorICAgIAorICAgIC8vIGNvbnRpbnVlIHVudGlsIHdlJ3ZlIHJlYWQgc2l6ZSBieXRlcworICAgIHdoaWxlIHJlYWQuY291bnQgPCBzaXplIHsKKyAgICAgIGlmIGZyZWFkKCZuZXh0Q2hhciwgMSwgMSwgc2VsZi5maWxlSGFuZGxlKSA9PSAxIHsKKyAgICAgICAgcmVhZFtwb3NpdGlvbl0gPSBuZXh0Q2hhcgorCisgICAgICAgIC8vIEluY3JlbWVudCBvdXRwdXQgYnl0ZSBwb2ludGVyCisgICAgICAgIHBvc2l0aW9uICs9IDEKKyAgICAgICAgCisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5lbmRPZkZpbGUpCisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZWFkCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgbGV0IGJ5dGVzV3JpdHRlbiA9IGRhdGEud2l0aFVuc2FmZUJ5dGVzIHsKKyAgICAgIGZ3cml0ZSgkMCwgMSwgZGF0YS5jb3VudCwgc2VsZi5maWxlSGFuZGxlKQorICAgIH0KKyAgICBpZiBieXRlc1dyaXR0ZW4gIT0gZGF0YS5jb3VudCB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC51bmtub3duKQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZmx1c2goKSB0aHJvd3MgeworICAgIHJldHVybgorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9URnJhbWVkVHJhbnNwb3J0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEZyYW1lZFRyYW5zcG9ydC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTM4NWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEZyYW1lZFRyYW5zcG9ydC5zd2lmdApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworcHVibGljIGNsYXNzIFRGcmFtZWRUcmFuc3BvcnQ6IFRUcmFuc3BvcnQgeworICBwdWJsaWMgc3RhdGljIGxldCBoZWFkZXJTaXplICAgID0gNAorICBwdWJsaWMgc3RhdGljIGxldCBpbml0RnJhbWVTaXplID0gMTAyNAorICBwcml2YXRlIHN0YXRpYyBsZXQgZGVmYXVsdE1heExlbmd0aCA9IDE2Mzg0MDAwCisKKyAgcHVibGljIHZhciB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQKKyAgcHJpdmF0ZSB2YXIgd3JpdGVCdWZmZXIgPSBEYXRhKCkKKworICBwcml2YXRlIHZhciBtYXhTaXplICAgICA9IFRGcmFtZWRUcmFuc3BvcnQuZGVmYXVsdE1heExlbmd0aAorICBwcml2YXRlIHZhciByZW1haW5pbmdCeXRlcyA9IDAKKworCisgIHB1YmxpYyBpbml0KHRyYW5zcG9ydDogVFRyYW5zcG9ydCwgbWF4U2l6ZTogSW50KSB7CisgICAgc2VsZi50cmFuc3BvcnQgPSB0cmFuc3BvcnQKKyAgICBzZWxmLm1heFNpemUgPSBtYXhTaXplCisgIH0KKworICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdCh0cmFuc3BvcnQ6IFRUcmFuc3BvcnQpIHsKKyAgICBzZWxmLmluaXQodHJhbnNwb3J0OiB0cmFuc3BvcnQsIG1heFNpemU6IFRGcmFtZWRUcmFuc3BvcnQuZGVmYXVsdE1heExlbmd0aCkKKyAgfQorCisgIGZ1bmMgcmVhZEhlYWRlcigpIHRocm93cyB7CisgICAgbGV0IHJlYWQgPSB0cnkgdHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogVEZyYW1lZFRyYW5zcG9ydC5oZWFkZXJTaXplKQorICAgIHJlbWFpbmluZ0J5dGVzID0gSW50KGRlY29kZUZyYW1lU2l6ZShkYXRhOiByZWFkKSkKKyAgfQorCisgIC8vLyBNYXJrOiAtIFRUcmFuc3BvcnQKKworICBwdWJsaWMgZnVuYyByZWFkKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIHdoaWxlIChyZW1haW5pbmdCeXRlcyA8PSAwKSB7CisgICAgICAgIHRyeSByZWFkSGVhZGVyKCkKKyAgICB9CisKKyAgICBsZXQgdG9SZWFkID0gbWluKHNpemUsIHJlbWFpbmluZ0J5dGVzKQorCisgICAgaWYgdG9SZWFkIDwgMCB7CisgICAgICAgIHRyeSBjbG9zZSgpCisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLm5lZ2F0aXZlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICAiUmVhZCBhIG5lZ2F0aXZlIGZyYW1lIHNpemUgKFwodG9SZWFkKSkhIikKKyAgICB9CisKKyAgICBpZiB0b1JlYWQgPiBtYXhTaXplIHsKKyAgICAgICAgdHJ5IGNsb3NlKCkKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAuc2l6ZUxpbWl0KGxpbWl0OiBtYXhTaXplLCBnb3Q6IHRvUmVhZCkpCisgICAgfQorCisgICAgcmV0dXJuIHRyeSB0cmFuc3BvcnQucmVhZEFsbChzaXplOiB0b1JlYWQpCisgIH0KKworICBwdWJsaWMgZnVuYyBmbHVzaCgpIHRocm93cyB7CisgICAgLy8gY29weSBidWZmZXIgYW5kIHJlc2V0CisgICAgbGV0IGJ1ZmYgPSB3cml0ZUJ1ZmZlcgorICAgIHdyaXRlQnVmZmVyID0gRGF0YSgpCisKKyAgICBpZiBidWZmLmNvdW50IC0gVEZyYW1lZFRyYW5zcG9ydC5oZWFkZXJTaXplIDwgMCB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC51bmtub3duKQorICAgIH0KKworICAgIGxldCBmcmFtZVNpemUgPSBlbmNvZGVGcmFtZVNpemUoc2l6ZTogVUludDMyKGJ1ZmYuY291bnQpKQorCisgICAgdHJ5IHRyYW5zcG9ydC53cml0ZShkYXRhOiBmcmFtZVNpemUpCisgICAgdHJ5IHRyYW5zcG9ydC53cml0ZShkYXRhOiBidWZmKQorICAgIHRyeSB0cmFuc3BvcnQuZmx1c2goKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUoZGF0YTogRGF0YSkgdGhyb3dzIHsKKyAgICB3cml0ZUJ1ZmZlci5hcHBlbmQoZGF0YSkKKyAgfQorCisKKworICBwcml2YXRlIGZ1bmMgZW5jb2RlRnJhbWVTaXplKHNpemU6IFVJbnQzMikgLT4gRGF0YSB7CisgICAgdmFyIGRhdGEgPSBEYXRhKCkKKyAgICBkYXRhLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmIChzaXplID4+IDI0KSldKSkKKyAgICBkYXRhLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmIChzaXplID4+IDE2KSldKSkKKyAgICBkYXRhLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmIChzaXplID4+IDgpKV0pKQorICAgIGRhdGEuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHNpemUpKV0pKQorCisgICAgcmV0dXJuIGRhdGEKKyAgfQorCisgIHByaXZhdGUgZnVuYyBkZWNvZGVGcmFtZVNpemUoZGF0YTogRGF0YSkgLT4gVUludDMyIHsKKyAgICB2YXIgc2l6ZTogVUludDMyCisgICAgc2l6ZSAgPSAoVUludDMyKGRhdGFbMF0gJiAweGZmKSA8PCAyNCkKKyAgICBzaXplIHw9IChVSW50MzIoZGF0YVsxXSAmIDB4ZmYpIDw8IDE2KQorICAgIHNpemUgfD0gKFVJbnQzMihkYXRhWzJdICYgMHhmZikgPDwgIDgpCisgICAgc2l6ZSB8PSAoVUludDMyKGRhdGFbM10gJiAweGZmKSkKKyAgICByZXR1cm4gc2l6ZQorICB9CisKKyAgcHVibGljIGZ1bmMgY2xvc2UoKSB0aHJvd3MgeworICAgIHRyeSB0cmFuc3BvcnQuY2xvc2UoKQorICB9CisKKyAgcHVibGljIGZ1bmMgb3BlbigpIHRocm93cyB7CisgICAgdHJ5IHRyYW5zcG9ydC5vcGVuKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIGlzT3BlbigpIHRocm93cyAtPiBCb29sIHsKKyAgICByZXR1cm4gdHJ5IHRyYW5zcG9ydC5pc09wZW4oKQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9USFRUUFNlc3Npb25UcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9USFRUUFNlc3Npb25UcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MwYWY4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5zd2lmdApAQCAtMCwwICsxLDE4NCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KK2ltcG9ydCBEaXNwYXRjaAorCisKK3B1YmxpYyBjbGFzcyBUSFRUUFNlc3Npb25UcmFuc3BvcnQ6IFRBc3luY1RyYW5zcG9ydCB7CisgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogVEFzeW5jVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgcHVibGljIHZhciByZXNwb25zZVZhbGlkYXRlOiAoKEhUVFBVUkxSZXNwb25zZT8sIERhdGE/KSB0aHJvd3MgLT4gVm9pZCk/CisgICAgCisgICAgdmFyIHNlc3Npb246IFVSTFNlc3Npb24KKyAgICB2YXIgdXJsOiBVUkwKKyAgICAKKyAgICBwdWJsaWMgY2xhc3MgZnVuYyBzZXR1cERlZmF1bHRzRm9yU2Vzc2lvbkNvbmZpZ3VyYXRpb24oXyBjb25maWc6IFVSTFNlc3Npb25Db25maWd1cmF0aW9uLCB3aXRoUHJvdG9jb2xOYW1lIHByb3RvY29sTmFtZTogU3RyaW5nPykgeworICAgICAgdmFyIHRocmlmdENvbnRlbnRUeXBlID0gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IgorICAgICAgCisgICAgICBpZiBsZXQgcHJvdG9jb2xOYW1lID0gcHJvdG9jb2xOYW1lIHsKKyAgICAgICAgdGhyaWZ0Q29udGVudFR5cGUgKz0gIjsgcD1cKHByb3RvY29sTmFtZSkiCisgICAgICB9CisgICAgICAKKyAgICAgIGNvbmZpZy5yZXF1ZXN0Q2FjaGVQb2xpY3kgPSAucmVsb2FkSWdub3JpbmdMb2NhbENhY2hlRGF0YQorICAgICAgY29uZmlnLnVybENhY2hlID0gbmlsCisgICAgICAKKyAgICAgIGNvbmZpZy5odHRwU2hvdWxkVXNlUGlwZWxpbmluZyAgPSB0cnVlCisgICAgICBjb25maWcuaHR0cFNob3VsZFNldENvb2tpZXMgICAgID0gdHJ1ZQorICAgICAgY29uZmlnLmh0dHBBZGRpdGlvbmFsSGVhZGVycyAgICA9IFsiQ29udGVudC1UeXBlIjogdGhyaWZ0Q29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY2NlcHQiOiB0aHJpZnRDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZXItQWdlbnQiOiAiVGhyaWZ0L1N3aWZ0IChTZXNzaW9uKSJdCisgICAgICAKKyAgICAgIAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW5pdChzZXNzaW9uOiBVUkxTZXNzaW9uLCB1cmw6IFVSTCkgeworICAgICAgc2VsZi5zZXNzaW9uID0gc2Vzc2lvbgorICAgICAgc2VsZi51cmwgPSB1cmwKKyAgICB9CisgICAgCisgICAgcHVibGljIGZ1bmMgbmV3VHJhbnNwb3J0KCkgLT4gVEhUVFBTZXNzaW9uVHJhbnNwb3J0IHsKKyAgICAgIHJldHVybiBUSFRUUFNlc3Npb25UcmFuc3BvcnQoZmFjdG9yeTogc2VsZikKKyAgICB9CisgICAgCisgICAgZnVuYyB2YWxpZGF0ZVJlc3BvbnNlKF8gcmVzcG9uc2U6IEhUVFBVUkxSZXNwb25zZT8sIGRhdGE6IERhdGE/KSB0aHJvd3MgeworICAgICAgdHJ5IHJlc3BvbnNlVmFsaWRhdGU/KHJlc3BvbnNlLCBkYXRhKQorICAgIH0KKyAgICAKKyAgICBmdW5jIHRhc2tXaXRoUmVxdWVzdChfIHJlcXVlc3Q6IFVSTFJlcXVlc3QsIGNvbXBsZXRpb25IYW5kbGVyOiBAZXNjYXBpbmcgKERhdGE/LCBVUkxSZXNwb25zZT8sIEVycm9yPykgLT4gKCkpIHRocm93cyAtPiBVUkxTZXNzaW9uVGFzayB7CisgICAgICAKKyAgICAgIGxldCBuZXdUYXNrOiBVUkxTZXNzaW9uVGFzaz8gPSBzZXNzaW9uLmRhdGFUYXNrKHdpdGg6IHJlcXVlc3QsIGNvbXBsZXRpb25IYW5kbGVyOiBjb21wbGV0aW9uSGFuZGxlcikKKyAgICAgIGlmIGxldCBuZXdUYXNrID0gbmV3VGFzayB7CisgICAgICAgIHJldHVybiBuZXdUYXNrCisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC51bmtub3duLCBtZXNzYWdlOiAiRmFpbGVkIHRvIGNyZWF0ZSBzZXNzaW9uIGRhdGEgdGFzayIpCisgICAgICB9CisgICAgfSAgICAKKyAgfQorICAKKyAgdmFyIGZhY3Rvcnk6IEZhY3RvcnkKKyAgdmFyIHJlcXVlc3REYXRhID0gRGF0YSgpCisgIHZhciByZXNwb25zZURhdGEgPSBEYXRhKCkKKyAgdmFyIHJlc3BvbnNlRGF0YU9mZnNldDogSW50ID0gMAorICAKKyAgaW5pdChmYWN0b3J5OiBGYWN0b3J5KSB7CisgICAgc2VsZi5mYWN0b3J5ID0gZmFjdG9yeQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkQWxsKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIGxldCByZWFkID0gdHJ5IHNlbGYucmVhZChzaXplOiBzaXplKQorICAgIGlmIHJlYWQuY291bnQgIT0gc2l6ZSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5lbmRPZkZpbGUpCisgICAgfQorICAgIHJldHVybiByZWFkCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgbGV0IGF2YWlsID0gcmVzcG9uc2VEYXRhLmNvdW50IC0gcmVzcG9uc2VEYXRhT2Zmc2V0CisgICAgbGV0IChzdGFydCwgc3RvcCkgPSAocmVzcG9uc2VEYXRhT2Zmc2V0LCByZXNwb25zZURhdGFPZmZzZXQgKyBtaW4oc2l6ZSwgYXZhaWwpKQorICAgIGxldCByZWFkID0gcmVzcG9uc2VEYXRhLnN1YmRhdGEoaW46IHN0YXJ0Li48c3RvcCkKKyAgICByZXNwb25zZURhdGFPZmZzZXQgKz0gcmVhZC5jb3VudAorICAgIHJldHVybiByZWFkCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgcmVxdWVzdERhdGEuYXBwZW5kKGRhdGEpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGZsdXNoKF8gY29tcGxldGVkOiBAZXNjYXBpbmcgKFRBc3luY1RyYW5zcG9ydCwgRXJyb3I/KSAtPiBWb2lkKSB7CisgICAgdmFyIGVycm9yOiBFcnJvcj8KKyAgICB2YXIgdGFzazogVVJMU2Vzc2lvblRhc2s/CisgICAgCisgICAgdmFyIHJlcXVlc3QgPSBVUkxSZXF1ZXN0KHVybDogZmFjdG9yeS51cmwpCisgICAgcmVxdWVzdC5odHRwTWV0aG9kID0gIlBPU1QiCisgICAgcmVxdWVzdC5odHRwQm9keSA9ICByZXF1ZXN0RGF0YQorCisgICAgcmVxdWVzdERhdGEgPSBEYXRhKCkKKworICAgIGRvIHsKKyAgICAgIHRhc2sgPSB0cnkgZmFjdG9yeS50YXNrV2l0aFJlcXVlc3QocmVxdWVzdCwgY29tcGxldGlvbkhhbmRsZXI6IHsgKGRhdGEsIHJlc3BvbnNlLCB0YXNrRXJyb3IpIGluCisKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdpdGggdGhlIG5ldHdvcmsKKyAgICAgICAgaWYgdGFza0Vycm9yICE9IG5pbCB7CisgICAgICAgICAgICBlcnJvciA9IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnRpbWVkT3V0KQorICAgICAgICAgICAgY29tcGxldGVkKHNlbGYsIGVycm9yKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayByZXNwb25zZSB0eXBlCisgICAgICAgIGlmIHRhc2tFcnJvciA9PSBuaWwgJiYgIShyZXNwb25zZSBpcyBIVFRQVVJMUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIGVycm9yID0gVEhUVFBUcmFuc3BvcnRFcnJvcihlcnJvcjogLmludmFsaWRSZXNwb25zZSkKKyAgICAgICAgICAgIGNvbXBsZXRlZChzZWxmLCBlcnJvcikKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBDaGVjayBzdGF0dXMgY29kZQorICAgICAgICBpZiBsZXQgaHR0cFJlc3BvbnNlID0gcmVzcG9uc2UgYXM/IEhUVFBVUkxSZXNwb25zZSB7CisgICAgICAgICAgaWYgdGFza0Vycm9yID09IG5pbCAmJiBodHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSAhPSAyMDAgeworICAgICAgICAgICAgaWYgaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUgPT0gNDAxIHsKKyAgICAgICAgICAgICAgZXJyb3IgPSBUSFRUUFRyYW5zcG9ydEVycm9yKGVycm9yOiAuYXV0aGVudGljYXRpb24pCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBlcnJvciA9IFRIVFRQVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5pbnZhbGlkU3RhdHVzKHN0YXR1c0NvZGU6IGh0dHBSZXNwb25zZS5zdGF0dXNDb2RlKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgLy8gQWxsb3cgZmFjdG9yeSB0byBjaGVjaworICAgICAgICAgIGlmIGVycm9yICE9IG5pbCB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgIHRyeSBzZWxmLmZhY3RvcnkudmFsaWRhdGVSZXNwb25zZShodHRwUmVzcG9uc2UsIGRhdGE6IGRhdGEpCisgICAgICAgICAgICB9IGNhdGNoIGxldCB2YWxpZGF0ZUVycm9yIHsKKyAgICAgICAgICAgICAgZXJyb3IgPSB2YWxpZGF0ZUVycm9yCisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIHNlbGYucmVzcG9uc2VEYXRhT2Zmc2V0ID0gMAorICAgICAgICAgIGlmIGVycm9yICE9IG5pbCB7CisgICAgICAgICAgICBzZWxmLnJlc3BvbnNlRGF0YSA9IERhdGEoKQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmLnJlc3BvbnNlRGF0YSA9IGRhdGEgPz8gRGF0YSgpCisgICAgICAgICAgfQorICAgICAgICAgIGNvbXBsZXRlZChzZWxmLCBlcnJvcikKKyAgICAgICAgfQorICAgICAgfSkKKyAgICAgIAorICAgIH0gY2F0Y2ggbGV0IHRhc2tFcnJvciB7CisgICAgICBlcnJvciA9IHRhc2tFcnJvcgorICAgIH0KKyAgICAKKyAgICBpZiBsZXQgZXJyb3IgPSBlcnJvciwgdGFzayA9PSBuaWwgeworICAgICAgY29tcGxldGVkKHNlbGYsIGVycm9yKQorICAgIH0KKyAgICB0YXNrPy5yZXN1bWUoKQorICB9CisKKyAgcHVibGljIGZ1bmMgZmx1c2goKSB0aHJvd3MgeworICAgIGxldCBjb21wbGV0ZWQgPSBEaXNwYXRjaFNlbWFwaG9yZSh2YWx1ZTogMCkKKyAgICB2YXIgaW50ZXJuYWxFcnJvcjogRXJyb3I/CisgICAgCisgICAgZmx1c2goKSB7IF8sIGVycm9yIGluCisgICAgICBpbnRlcm5hbEVycm9yID0gZXJyb3IKKyAgICAgIGNvbXBsZXRlZC5zaWduYWwoKQorICAgIH0KKyAgICAKKyAgICBfID0gY29tcGxldGVkLndhaXQodGltZW91dDogRGlzcGF0Y2hUaW1lLmRpc3RhbnRGdXR1cmUpCisgICAgCisgICAgaWYgbGV0IGVycm9yID0gaW50ZXJuYWxFcnJvciB7CisgICAgICB0aHJvdyBlcnJvcgorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVExpc3Quc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UTGlzdC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjM5ZDEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVExpc3Quc3dpZnQKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcHVibGljIHN0cnVjdCBUTGlzdDxFbGVtZW50IDogVFNlcmlhbGl6YWJsZT4gOiBSYW5kb21BY2Nlc3NDb2xsZWN0aW9uLCBNdXRhYmxlQ29sbGVjdGlvbiwgRXhwcmVzc2libGVCeUFycmF5TGl0ZXJhbCwgVFNlcmlhbGl6YWJsZSwgSGFzaGFibGUgeworICBwdWJsaWMgdHlwZWFsaWFzIFN0b3JhZ2UgPSBBcnJheTxFbGVtZW50PgorICBwdWJsaWMgdHlwZWFsaWFzIEluZGljZXMgPSBTdG9yYWdlLkluZGljZXMKKworICBpbnRlcm5hbCB2YXIgc3RvcmFnZSA9IFN0b3JhZ2UoKQorICBwdWJsaWMgaW5pdCgpIHsgfQorICBwdWJsaWMgaW5pdChhcnJheUxpdGVyYWwgZWxlbWVudHM6IEVsZW1lbnQuLi4pIHsKKyAgICBzZWxmLnN0b3JhZ2UgPSBTdG9yYWdlKGVsZW1lbnRzKQorICB9CisgIHB1YmxpYyBpbml0PFNvdXJjZSA6IFNlcXVlbmNlPihfIHNlcXVlbmNlOiBTb3VyY2UpIHdoZXJlIFNvdXJjZS5JdGVyYXRvci5FbGVtZW50ID09IEVsZW1lbnQgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKHNlcXVlbmNlKQorICB9CisKKyAgLy8vIE1hcms6IEhhc2hhYmxlCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlIDogSW50IHsKKyAgICBsZXQgcHJpbWUgPSAzMQorICAgIHZhciByZXN1bHQgPSAxCisgICAgZm9yIGVsZW1lbnQgaW4gc3RvcmFnZSB7CisgICAgICByZXN1bHQgPSBwcmltZSAmKiByZXN1bHQgJisgZWxlbWVudC5oYXNoVmFsdWUKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICAvLy8gTWFyazogVFNlcmlhbGl6YWJsZQorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gLmxpc3QgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFRMaXN0IHsKKyAgICBsZXQgKGVsZW1lbnRUeXBlLCBzaXplKSA9IHRyeSBwcm90by5yZWFkTGlzdEJlZ2luKCkKKyAgICBpZiBlbGVtZW50VHlwZSAhPSBFbGVtZW50LnRocmlmdFR5cGUgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5pbnZhbGlkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkRXJyb3I6IC51bmV4cGVjdGVkVHlwZSh0eXBlOiBlbGVtZW50VHlwZSkpCisgICAgfQorICAgIHZhciBsaXN0ID0gVExpc3QoKQorICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgIGxldCBlbGVtZW50ID0gdHJ5IEVsZW1lbnQucmVhZChmcm9tOiBwcm90bykKKyAgICAgIGxpc3Quc3RvcmFnZS5hcHBlbmQoZWxlbWVudCkKKyAgICB9CisgICAgdHJ5IHByb3RvLnJlYWRMaXN0RW5kKCkKKyAgICByZXR1cm4gbGlzdAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUxpc3RCZWdpbihlbGVtZW50VHlwZTogRWxlbWVudC50aHJpZnRUeXBlLCBzaXplOiBJbnQzMihzZWxmLmNvdW50KSkKKyAgICBmb3IgZWxlbWVudCBpbiBzZWxmLnN0b3JhZ2UgeworICAgICAgdHJ5IEVsZW1lbnQud3JpdGUoZWxlbWVudCwgdG86IHByb3RvKQorICAgIH0KKyAgICB0cnkgcHJvdG8ud3JpdGVMaXN0RW5kKCkKKyAgfQorCisgIC8vLyBNYXJrOiBNdXRhYmxlQ29sbGVjdGlvbgorICAKKyAgcHVibGljIHR5cGVhbGlhcyBTdWJTZXF1ZW5jZSA9IFN0b3JhZ2UuU3ViU2VxdWVuY2UKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRleCA9IFN0b3JhZ2UuSW5kZXgKKyAgCisgIHB1YmxpYyBzdWJzY3JpcHQocG9zaXRpb246IFN0b3JhZ2UuSW5kZXgpIC0+IEVsZW1lbnQgeworICAgIGdldCB7CisgICAgICByZXR1cm4gc3RvcmFnZVtwb3NpdGlvbl0KKyAgICB9CisgICAgc2V0IHsKKyAgICAgIHN0b3JhZ2VbcG9zaXRpb25dID0gbmV3VmFsdWUKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBzdWJzY3JpcHQocmFuZ2U6IFJhbmdlPEluZGV4PikgLT4gU3ViU2VxdWVuY2UgeworICAgIGdldCB7CisgICAgICByZXR1cm4gc3RvcmFnZVtyYW5nZV0KKyAgICB9CisgICAgc2V0IHsKKyAgICAgIHN0b3JhZ2VbcmFuZ2VdID0gbmV3VmFsdWUKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyB2YXIgc3RhcnRJbmRleDogSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLnN0YXJ0SW5kZXgKKyAgfQorICBwdWJsaWMgdmFyIGVuZEluZGV4OiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZW5kSW5kZXgKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZm9ybUluZGV4KGFmdGVyIGk6IGlub3V0IEluZGV4KSB7CisgICAgc3RvcmFnZS5mb3JtSW5kZXgoYWZ0ZXI6ICZpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBmb3JtSW5kZXgoYmVmb3JlIGk6IGlub3V0IEludCkgeworICAgIHN0b3JhZ2UuZm9ybUluZGV4KGJlZm9yZTogJmkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGluZGV4KGFmdGVyIGk6IEluZGV4KSAtPiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoYWZ0ZXI6IGkpCisgIH0KKworICBwdWJsaWMgZnVuYyBpbmRleChiZWZvcmUgaTogSW50KSAtPiBJbnQgeworICAgIHJldHVybiBzdG9yYWdlLmluZGV4KGJlZm9yZTogaSkKKyAgfQorCit9CisKK2V4dGVuc2lvbiBUTGlzdCA6IFJhbmdlUmVwbGFjZWFibGVDb2xsZWN0aW9uIHsKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVwbGFjZVN1YnJhbmdlPEM6IENvbGxlY3Rpb24+KF8gc3VicmFuZ2U6IFJhbmdlPEluZGV4Piwgd2l0aCBuZXdFbGVtZW50czogQykKKyAgICB3aGVyZSBDLkl0ZXJhdG9yLkVsZW1lbnQgPT0gRWxlbWVudCB7CisgICAgc3RvcmFnZS5yZXBsYWNlU3VicmFuZ2Uoc3VicmFuZ2UsIHdpdGg6IG5ld0VsZW1lbnRzKQorICB9Cit9CisKK2V4dGVuc2lvbiBUTGlzdCA6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIHsKKyAgCisgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlc2NyaXB0aW9uCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZGVidWdEZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVidWdEZXNjcmlwdGlvbgorICB9CisgIAorfQorCitwdWJsaWMgZnVuYyA9PTxFbGVtZW50PihsaHM6IFRMaXN0PEVsZW1lbnQ+LCByaHM6IFRMaXN0PEVsZW1lbnQ+KSAtPiBCb29sIHsKKyAgcmV0dXJuIGxocy5zdG9yYWdlLmVsZW1lbnRzRXF1YWwocmhzLnN0b3JhZ2UpIHsgJDAgPT0gJDEgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVE1hcC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RNYXAuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk4MDM3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RNYXAuc3dpZnQKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcHVibGljIHN0cnVjdCBUTWFwPEtleSA6IFRTZXJpYWxpemFibGUgJiBIYXNoYWJsZSwgVmFsdWUgOiBUU2VyaWFsaXphYmxlPjogQ29sbGVjdGlvbiwgRXhwcmVzc2libGVCeURpY3Rpb25hcnlMaXRlcmFsLCBIYXNoYWJsZSwgVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyB0eXBlYWxpYXMgU3RvcmFnZSA9IERpY3Rpb25hcnk8S2V5LCBWYWx1ZT4KKyAgcHVibGljIHR5cGVhbGlhcyBFbGVtZW50ID0gU3RvcmFnZS5FbGVtZW50CisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kZXggPSBTdG9yYWdlLkluZGV4CisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kZXhEaXN0YW5jZSA9IFN0b3JhZ2UuSW5kZXhEaXN0YW5jZQorICBwdWJsaWMgdHlwZWFsaWFzIEluZGljZXMgPSBTdG9yYWdlLkluZGljZXMKKyAgcHVibGljIHR5cGVhbGlhcyBTdWJTZXF1ZW5jZSA9IFN0b3JhZ2UuU3ViU2VxdWVuY2UKKyAgaW50ZXJuYWwgdmFyIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgCisgIC8vLyBNYXJrOiBCZSBMaWtlIERpY3Rpb25hcnkKKyAgCisgIHB1YmxpYyBmdW5jIGluZGV4Rm9yS2V5KF8ga2V5OiBLZXkpIC0+IEluZGV4PyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoZm9yS2V5OiBrZXkpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHVwZGF0ZVZhbHVlKF8gdmFsdWU6IFZhbHVlLCBmb3JLZXkga2V5OiBLZXkpIC0+IFZhbHVlPyB7CisgICAgcmV0dXJuIHVwZGF0ZVZhbHVlKHZhbHVlLCBmb3JLZXk6IGtleSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlQXRJbmRleChfIGluZGV4OiBEaWN0aW9uYXJ5SW5kZXg8S2V5LCBWYWx1ZT4pIC0+IChLZXksIFZhbHVlKSB7CisgICAgcmV0dXJuIHJlbW92ZUF0SW5kZXgoaW5kZXgpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZVZhbHVlRm9yS2V5KF8ga2V5OiBLZXkpIC0+IFZhbHVlPyB7CisgICAgcmV0dXJuIHN0b3JhZ2UucmVtb3ZlVmFsdWUoZm9yS2V5OiBrZXkpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KG1pbmltdW1DYXBhY2l0eTogSW50KSB7CisgICAgc3RvcmFnZSA9IFN0b3JhZ2UobWluaW11bUNhcGFjaXR5OiBtaW5pbXVtQ2FwYWNpdHkpCisgIH0KKyAgCisgIC8vLyBpbml0IGZyb20gRGljdGlvbmFyeTxLLFY+CisgIHB1YmxpYyBpbml0KF8gZGljdDogW0tleTogVmFsdWVdKSB7CisgICAgc3RvcmFnZSA9IGRpY3QKKyAgfQorCisgIC8vLyByZWFkIG9ubHkgYWNjZXNzIHRvIHN0b3JhZ2UgaWYgbmVlZGVkIGFzIERpY3Rpb25hcnk8SyxWPgorICBwdWJsaWMgdmFyIGRpY3Rpb25hcnk6IFtLZXk6IFZhbHVlXSB7CisgICAgcmV0dXJuIHN0b3JhZ2UKKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdCAoa2V5OiBLZXkpIC0+IFZhbHVlPyB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBzdG9yYWdlW2tleV0KKyAgICB9CisgICAgc2V0IHsKKyAgICAgIHN0b3JhZ2Vba2V5XSA9IG5ld1ZhbHVlCisgICAgfQorICB9CisgIAorICAvLy8gTWFyazogQ29sbGVjdGlvbgorICAKKyAgcHVibGljIHZhciBpbmRpY2VzOiBJbmRpY2VzIHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRpY2VzCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGRpc3RhbmNlKGZyb20gc3RhcnQ6IEluZGV4LCB0byBlbmQ6IEluZGV4KSAtPiBJbmRleERpc3RhbmNlIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kaXN0YW5jZShmcm9tOiBzdGFydCwgdG86IGVuZCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgaW5kZXgoXyBpOiBJbmRleCwgb2Zmc2V0QnkgbjogSW5kZXhEaXN0YW5jZSkgLT4gSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLmluZGV4KGksIG9mZnNldEJ5OiBuKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpbmRleChfIGk6IEluZGV4LCBvZmZzZXRCeSBuOiBJbmRleERpc3RhbmNlLCBsaW1pdGVkQnkgbGltaXQ6IEluZGV4KSAtPiBJbmRleD8geworICAgIHJldHVybiBzdG9yYWdlLmluZGV4KGksIG9mZnNldEJ5OiBuLCBsaW1pdGVkQnk6IGxpbWl0KQorICB9CisgIAorICBwdWJsaWMgc3Vic2NyaXB0KHBvc2l0aW9uOiBJbmRleCkgLT4gRWxlbWVudCB7CisgICAgcmV0dXJuIHN0b3JhZ2VbcG9zaXRpb25dCisgIH0KKyAgCisgIC8vLyBNYXJrOiBJbmRleGFibGVCYXNlCisgIAorICBwdWJsaWMgdmFyIHN0YXJ0SW5kZXg6IEluZGV4IHsgcmV0dXJuIHN0b3JhZ2Uuc3RhcnRJbmRleCB9CisgIHB1YmxpYyB2YXIgZW5kSW5kZXg6IEluZGV4IHsgcmV0dXJuIHN0b3JhZ2UuZW5kSW5kZXggfQorICBwdWJsaWMgZnVuYyBpbmRleChhZnRlciBpOiBJbmRleCkgLT4gSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLmluZGV4KGFmdGVyOiBpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBmb3JtSW5kZXgoYWZ0ZXIgaTogaW5vdXQgSW5kZXgpIHsKKyAgICBzdG9yYWdlLmZvcm1JbmRleChhZnRlcjogJmkpCisgIH0KKyAgCisgIHB1YmxpYyBzdWJzY3JpcHQoYm91bmRzOiBSYW5nZTxJbmRleD4pIC0+IFN1YlNlcXVlbmNlIHsKKyAgICByZXR1cm4gc3RvcmFnZVtib3VuZHNdCisgIH0KKyAgCisgIC8vLyBNYXJrOiBEaWN0aW9uYXJ5TGl0ZXJhbENvbnZlcnRpYmxlCisgIAorICBwdWJsaWMgaW5pdChkaWN0aW9uYXJ5TGl0ZXJhbCBlbGVtZW50czogKEtleSwgVmFsdWUpLi4uKSB7CisgICAgc3RvcmFnZSA9IFN0b3JhZ2UoKQorICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4gZWxlbWVudHMgeworICAgICAgc3RvcmFnZVtrZXldID0gdmFsdWUKKyAgICB9CisgIH0KKworICAvLy8gTWFyazogSGFzaGFibGUKKyAgCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlOiBJbnQgeworICAgIGxldCBwcmltZSA9IDMxCisgICAgdmFyIHJlc3VsdCA9IDEKKyAgICBmb3IgKGtleSwgdmFsdWUpIGluIHN0b3JhZ2UgeworICAgICAgcmVzdWx0ID0gcHJpbWUgJiogcmVzdWx0ICYrIGtleS5oYXNoVmFsdWUKKyAgICAgIHJlc3VsdCA9IHByaW1lICYqIHJlc3VsdCAmKyB2YWx1ZS5oYXNoVmFsdWUKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICAvLy8gTWFyazogVFNlcmlhbGl6YWJsZQorICAKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZSA6IFRUeXBlIHsgcmV0dXJuIC5tYXAgfQorICBwdWJsaWMgaW5pdCgpIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZSgpCisgIH0KKyAgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBUTWFwIHsKKworICAgIGxldCAoa2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplKSA9IHRyeSBwcm90by5yZWFkTWFwQmVnaW4oKQorICAgIGlmIHNpemUgPiAwIHsKKyAgICAgIGlmIGtleVR5cGUgIT0gS2V5LnRocmlmdFR5cGUgeworICAgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmludmFsaWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAiVW5leHBlY3RlZCBUTWFwIEtleSBUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRFcnJvcjogLnVuZXhwZWN0ZWRUeXBlKHR5cGU6IGtleVR5cGUpKQorICAgICAgfQorICAgICAgaWYgdmFsdWVUeXBlICE9IFZhbHVlLnRocmlmdFR5cGUgeworICAgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmludmFsaWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAiVW5leHBlY3RlZCBUTWFwIFZhbHVlIFR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZEVycm9yOiAudW5leHBlY3RlZFR5cGUodHlwZTogdmFsdWVUeXBlKSkKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgbWFwID0gVE1hcCgpCisgICAgZm9yIF8gaW4gMC4uPHNpemUgeworICAgICAgbGV0IGtleSA9IHRyeSBLZXkucmVhZChmcm9tOiBwcm90bykKKyAgICAgIGxldCB2YWx1ZSA9IHRyeSBWYWx1ZS5yZWFkKGZyb206IHByb3RvKQorICAgICAgbWFwLnN0b3JhZ2Vba2V5XSA9IHZhbHVlCisgICAgfQorICAgIHRyeSBwcm90by5yZWFkTWFwRW5kKCkKKyAgICByZXR1cm4gbWFwCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlTWFwQmVnaW4oa2V5VHlwZTogS2V5LnRocmlmdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOiBWYWx1ZS50aHJpZnRUeXBlLCBzaXplOiBJbnQzMihzZWxmLmNvdW50KSkKKyAgICBmb3IgKGtleSwgdmFsdWUpIGluIHNlbGYuc3RvcmFnZSB7CisgICAgICB0cnkgS2V5LndyaXRlKGtleSwgdG86IHByb3RvKQorICAgICAgdHJ5IFZhbHVlLndyaXRlKHZhbHVlLCB0bzogcHJvdG8pCisgICAgfQorICAgIHRyeSBwcm90by53cml0ZU1hcEVuZCgpCisgIH0KK30KKworLy8vIE1hcms6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlCisKK2V4dGVuc2lvbiBUTWFwIDogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUsIEN1c3RvbURlYnVnU3RyaW5nQ29udmVydGlibGUgeworICAKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVzY3JpcHRpb24KKyAgfQorICAKKyAgcHVibGljIHZhciBkZWJ1Z0Rlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZWJ1Z0Rlc2NyaXB0aW9uCisgIH0KKyAgCit9CisKKy8vLyBNYXJrOiBFcXVhdGFibGUKKworcHVibGljIGZ1bmMgPT08S2V5LCBWYWx1ZT4obGhzOiBUTWFwPEtleSxWYWx1ZT4sIHJoczogVE1hcDxLZXksIFZhbHVlPikgLT4gQm9vbCB7CisgIGlmIGxocy5jb3VudCAhPSByaHMuY291bnQgeworICAgIHJldHVybiBmYWxzZQorICB9CisgIHJldHVybiBsaHMuc3RvcmFnZS5lbGVtZW50c0VxdWFsKHJocy5zdG9yYWdlKSB7ICQwLmtleSA9PSAkMS5rZXkgJiYgJDAudmFsdWUgPT0gJDEudmFsdWUgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RNZW1vcnlCdWZmZXJUcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ1OGI2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RNZW1vcnlCdWZmZXJUcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitwdWJsaWMgY2xhc3MgVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydCA6IFRUcmFuc3BvcnQgeworICBwdWJsaWMgcHJpdmF0ZShzZXQpIHZhciByZWFkQnVmZmVyID0gRGF0YSgpCisgIHB1YmxpYyBwcml2YXRlKHNldCkgdmFyIHdyaXRlQnVmZmVyID0gRGF0YSgpCisgIAorICBwdWJsaWMgcHJpdmF0ZShzZXQpIHZhciBwb3NpdGlvbiA9IDAKKworICBwdWJsaWMgdmFyIGJ5dGVzUmVtYWluaW5nSW5CdWZmZXI6IEludCB7CisgICAgcmV0dXJuIHJlYWRCdWZmZXIuY291bnQgLSBwb3NpdGlvbgorICB9CisgIAorICBwdWJsaWMgZnVuYyBjb25zdW1lQnVmZmVyKHNpemU6IEludCkgeworICAgIHBvc2l0aW9uICs9IHNpemUKKyAgfQorICBwdWJsaWMgZnVuYyBjbGVhcigpIHsKKyAgICByZWFkQnVmZmVyID0gRGF0YSgpCisgICAgd3JpdGVCdWZmZXIgPSBEYXRhKCkKKyAgfQorICAKKyAgCisgIHByaXZhdGUgdmFyIGZsdXNoSGFuZGxlcjogKChUTWVtb3J5QnVmZmVyVHJhbnNwb3J0LCBEYXRhKSAtPiAoKSk/CisgIAorICBwdWJsaWMgaW5pdChmbHVzaEhhbmRsZXI6ICgoVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydCwgRGF0YSkgLT4gKCkpPyA9IG5pbCkgeworICAgIHNlbGYuZmx1c2hIYW5kbGVyID0gZmx1c2hIYW5kbGVyCisgIH0KKyAgCisgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KHJlYWRCdWZmZXI6IERhdGEsIGZsdXNoSGFuZGxlcjogKChUTWVtb3J5QnVmZmVyVHJhbnNwb3J0LCBEYXRhKSAtPiAoKSk/ID0gbmlsKSB7CisgICAgc2VsZi5pbml0KCkKKyAgICBzZWxmLnJlYWRCdWZmZXIgPSByZWFkQnVmZmVyCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlc2V0KHJlYWRCdWZmZXI6IERhdGEgPSBEYXRhKCksIHdyaXRlQnVmZmVyOiBEYXRhID0gRGF0YSgpKSB7CisgICAgc2VsZi5yZWFkQnVmZmVyID0gcmVhZEJ1ZmZlcgorICAgIHNlbGYud3JpdGVCdWZmZXIgPSB3cml0ZUJ1ZmZlcgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIGxldCBhbW91bnRUb1JlYWQgPSBtaW4oYnl0ZXNSZW1haW5pbmdJbkJ1ZmZlciwgc2l6ZSkKKyAgICBpZiBhbW91bnRUb1JlYWQgPiAwIHsKKyAgICAgIGxldCByZXQgPSByZWFkQnVmZmVyLnN1YmRhdGEoaW46IFJhbmdlKHVuY2hlY2tlZEJvdW5kczogKGxvd2VyOiBwb3NpdGlvbiwgdXBwZXI6IHBvc2l0aW9uICsgYW1vdW50VG9SZWFkKSkpCisgICAgICBwb3NpdGlvbiArPSByZXQuY291bnQKKyAgICAgIHJldHVybiByZXQKKyAgICB9CisgICAgcmV0dXJuIERhdGEoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShkYXRhOiBEYXRhKSB0aHJvd3MgeworICAgIHdyaXRlQnVmZmVyLmFwcGVuZChkYXRhKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBmbHVzaCgpIHRocm93cyB7CisgICAgZmx1c2hIYW5kbGVyPyhzZWxmLCB3cml0ZUJ1ZmZlcikKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVE11bHRpcGxleGVkUHJvdG9jb2wuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UTXVsdGlwbGV4ZWRQcm90b2NvbC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2E4ZDUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVE11bHRpcGxleGVkUHJvdG9jb2wuc3dpZnQKQEAgLTAsMCArMSw0NyBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcHVibGljIGNsYXNzIFRNdWx0aXBsZXhlZFByb3RvY29sPFByb3RvY29sOiBUUHJvdG9jb2w+OiBUV3JhcHBlZFByb3RvY29sPFByb3RvY29sPiB7CisgIHB1YmxpYyBsZXQgc2VwYXJhdG9yID0gIjoiCisKKyAgcHVibGljIHZhciBzZXJ2aWNlTmFtZSA9ICIiCisgIAorICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdChvbiB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQsIHNlcnZpY2VOYW1lOiBTdHJpbmcpIHsKKyAgICBzZWxmLmluaXQob246IHRyYW5zcG9ydCkKKyAgICBzZWxmLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWUgICAgCisgIH0KKworICBvdmVycmlkZSBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgbWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogSW50MzIpIHRocm93cyB7CisgICAgc3dpdGNoIG1lc3NhZ2VUeXBlIHsKKyAgICBjYXNlIC5jYWxsLCAub25ld2F5OgorICAgICAgdmFyIHNlcnZpY2VGdW5jdGlvbiA9IHNlcnZpY2VOYW1lCisgICAgICBzZXJ2aWNlRnVuY3Rpb24gKz0gc2VydmljZU5hbWUgPT0gIiIgPyAiIiA6IHNlcGFyYXRvcgorICAgICAgc2VydmljZUZ1bmN0aW9uICs9IG5hbWUKKyAgICAgIHJldHVybiB0cnkgc3VwZXIud3JpdGVNZXNzYWdlQmVnaW4obmFtZTogc2VydmljZUZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogc2VxdWVuY2VJRCkKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHRyeSBzdXBlci53cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogc2VxdWVuY2VJRCkKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm9jZXNzb3Iuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UUHJvY2Vzc29yLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZjIyMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UUHJvY2Vzc29yLnN3aWZ0CkBAIC0wLDAgKzEsMjkgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworcHVibGljIHR5cGVhbGlhcyBUUHJvY2Vzc29yTWVzc2FnZUhhbmRsZXI8VD4gPSAoSW50LCBUUHJvdG9jb2wsIFRQcm90b2NvbCwgVCkgLT4gVm9pZAorCitwdWJsaWMgcHJvdG9jb2wgVFByb2Nlc3NvciB7CisgIGFzc29jaWF0ZWR0eXBlIFNlcnZpY2UKKyAgdmFyIHNlcnZpY2U6IFNlcnZpY2UgeyBnZXQgc2V0IH0KKyAgZnVuYyBwcm9jZXNzKG9uIGluUHJvdG9jb2w6IFRQcm90b2NvbCwgb3V0UHJvdG9jb2w6IFRQcm90b2NvbCkgdGhyb3dzCisgIGluaXQoc2VydmljZTogU2VydmljZSkKK30KKwpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFByb3RvY29sLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFByb3RvY29sLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZTRhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UUHJvdG9jb2wuc3dpZnQKQEAgLTAsMCArMSwxODIgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisvLworCitwdWJsaWMgZW51bSBUTWVzc2FnZVR5cGU6IEludDMyIHsKKyAgY2FzZSBjYWxsID0gMQorICBjYXNlIHJlcGx5ID0gMgorICBjYXNlIGV4Y2VwdGlvbiA9IDMKKyAgY2FzZSBvbmV3YXkgPSA0Cit9CisKK3B1YmxpYyBlbnVtIFRUeXBlOiBJbnQzMiB7CisgIGNhc2Ugc3RvcCAgICAgPSAwCisgIGNhc2Ugdm9pZCAgICAgPSAxCisgIGNhc2UgYm9vbCAgICAgPSAyCisgIGNhc2UgaTggICAgICAgPSAzCisgIGNhc2UgZG91YmxlICAgPSA0CisgIGNhc2UgaTE2ICAgICAgPSA2CisgIGNhc2UgaTMyICAgICAgPSA4CisgIGNhc2UgaTY0ICAgICAgPSAxMAorICBjYXNlIHN0cmluZyAgID0gMTEKKyAgY2FzZSBgc3RydWN0YCA9IDEyCisgIGNhc2UgbWFwICAgICAgPSAxMworICBjYXNlIHNldCAgICAgID0gMTQKKyAgY2FzZSBsaXN0ICAgICA9IDE1CisgIGNhc2UgdXRmOCAgICAgPSAxNgorICBjYXNlIHV0ZjE2ICAgID0gMTcKK30KKworcHVibGljIHByb3RvY29sIFRQcm90b2NvbCB7CisgIHZhciB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQgeyBnZXQgc2V0IH0KKyAgaW5pdChvbiB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQpCisgIC8vIFJlYWRpbmcgTWV0aG9kcworICAKKyAgZnVuYyByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRNZXNzYWdlVHlwZSwgSW50MzIpCisgIGZ1bmMgcmVhZE1lc3NhZ2VFbmQoKSB0aHJvd3MKKyAgZnVuYyByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgLT4gU3RyaW5nCisgIGZ1bmMgcmVhZFN0cnVjdEVuZCgpIHRocm93cworICBmdW5jIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRUeXBlLCBJbnQzMikKKyAgZnVuYyByZWFkRmllbGRFbmQoKSB0aHJvd3MKKyAgZnVuYyByZWFkTWFwQmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBUVHlwZSwgSW50MzIpCisgIGZ1bmMgcmVhZE1hcEVuZCgpIHRocm93cworICBmdW5jIHJlYWRTZXRCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKQorICBmdW5jIHJlYWRTZXRFbmQoKSB0aHJvd3MKKyAgZnVuYyByZWFkTGlzdEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpCisgIGZ1bmMgcmVhZExpc3RFbmQoKSB0aHJvd3MKKyAgCisgIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBTdHJpbmcKKyAgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEJvb2wKKyAgZnVuYyByZWFkKCkgdGhyb3dzIC0+IFVJbnQ4CisgIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQxNgorICBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50MzIKKyAgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDY0CisgIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBEb3VibGUKKyAgZnVuYyByZWFkKCkgdGhyb3dzIC0+IERhdGEKKyAgCisgIC8vIFdyaXRpbmcgbWV0aG9kcworICAKKyAgZnVuYyB3cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBTdHJpbmcsIHR5cGUgbWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZSwgc2VxdWVuY2VJRDogSW50MzIpIHRocm93cworICBmdW5jIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cworICBmdW5jIHdyaXRlU3RydWN0QmVnaW4obmFtZTogU3RyaW5nKSB0aHJvd3MKKyAgZnVuYyB3cml0ZVN0cnVjdEVuZCgpIHRocm93cworICBmdW5jIHdyaXRlRmllbGRCZWdpbihuYW1lOiBTdHJpbmcsIHR5cGUgZmllbGRUeXBlOiBUVHlwZSwgZmllbGRJRDogSW50MzIpIHRocm93cworICBmdW5jIHdyaXRlRmllbGRTdG9wKCkgdGhyb3dzCisgIGZ1bmMgd3JpdGVGaWVsZEVuZCgpIHRocm93cworICBmdW5jIHdyaXRlTWFwQmVnaW4oa2V5VHlwZTogVFR5cGUsIHZhbHVlVHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MKKyAgZnVuYyB3cml0ZU1hcEVuZCgpIHRocm93cworICBmdW5jIHdyaXRlU2V0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzCisgIGZ1bmMgd3JpdGVTZXRFbmQoKSB0aHJvd3MKKyAgZnVuYyB3cml0ZUxpc3RCZWdpbihlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MKKyAgZnVuYyB3cml0ZUxpc3RFbmQoKSB0aHJvd3MKKworICBmdW5jIHdyaXRlKF8gdmFsdWU6IFN0cmluZykgdGhyb3dzCisgIGZ1bmMgd3JpdGUoXyB2YWx1ZTogQm9vbCkgdGhyb3dzCisgIGZ1bmMgd3JpdGUoXyB2YWx1ZTogVUludDgpIHRocm93cworICBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDE2KSB0aHJvd3MKKyAgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQzMikgdGhyb3dzCisgIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50NjQpIHRocm93cworICBmdW5jIHdyaXRlKF8gdmFsdWU6IERvdWJsZSkgdGhyb3dzCisgIGZ1bmMgd3JpdGUoXyB2YWx1ZTogRGF0YSkgdGhyb3dzCit9CisKK3B1YmxpYyBleHRlbnNpb24gVFByb3RvY29sIHsKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZFZhbHVlKF8gdmFsdWU6IFRTZXJpYWxpemFibGUsIG5hbWU6IFN0cmluZywgdHlwZTogVFR5cGUsIGlkOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVGaWVsZEJlZ2luKG5hbWU6IG5hbWUsIHR5cGU6IHR5cGUsIGZpZWxkSUQ6IGlkKQorICAgIHRyeSB2YWx1ZS53cml0ZSh0bzogc2VsZikKKyAgICB0cnkgd3JpdGVGaWVsZEVuZCgpCisgIH0KKworICBwdWJsaWMgZnVuYyB2YWxpZGF0ZVZhbHVlKF8gdmFsdWU6IEFueT8sIG5hbWVkIG5hbWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICBpZiB2YWx1ZSA9PSBuaWwgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC51bmtub3duLCBtZXNzYWdlOiAiTWlzc2luZyByZXF1aXJlZCB2YWx1ZSBmb3IgZmllbGQ6IFwobmFtZSkiKQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFJlc3VsdE1lc3NhZ2VCZWdpbigpIHRocm93cyB7CisgICAgbGV0IChfLCB0eXBlLCBfKSA9IHRyeSByZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgaWYgdHlwZSA9PSAuZXhjZXB0aW9uIHsKKyAgICAgIGxldCB4ID0gdHJ5IHJlYWRFeGNlcHRpb24oKQorICAgICAgdGhyb3cgeAorICAgIH0KKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEV4Y2VwdGlvbigpIHRocm93cyAtPiBUQXBwbGljYXRpb25FcnJvciB7CisgICAgcmV0dXJuIHRyeSBUQXBwbGljYXRpb25FcnJvci5yZWFkKGZyb206IHNlbGYpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRXhjZXB0aW9uKG1lc3NhZ2VOYW1lIG5hbWU6IFN0cmluZywgc2VxdWVuY2VJRDogSW50MzIsIGV4OiBUQXBwbGljYXRpb25FcnJvcikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVNZXNzYWdlQmVnaW4obmFtZTogbmFtZSwgdHlwZTogLmV4Y2VwdGlvbiwgc2VxdWVuY2VJRDogc2VxdWVuY2VJRCkKKyAgICB0cnkgZXgud3JpdGUodG86IHNlbGYpCisgICAgdHJ5IHdyaXRlTWVzc2FnZUVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHNraXAodHlwZTogVFR5cGUpIHRocm93cyB7CisgICAgc3dpdGNoIHR5cGUgeworICAgIGNhc2UgLmJvb2w6ICAgXyA9IHRyeSByZWFkKCkgYXMgQm9vbAorICAgIGNhc2UgLmk4OiAgIF8gPSB0cnkgcmVhZCgpIGFzIFVJbnQ4CisgICAgY2FzZSAuaTE2OiAgICBfID0gdHJ5IHJlYWQoKSBhcyBJbnQxNgorICAgIGNhc2UgLmkzMjogICAgXyA9IHRyeSByZWFkKCkgYXMgSW50MzIKKyAgICBjYXNlIC5pNjQ6ICAgIF8gPSB0cnkgcmVhZCgpIGFzIEludDY0CisgICAgY2FzZSAuZG91YmxlOiBfID0gdHJ5IHJlYWQoKSBhcyBEb3VibGUKKyAgICBjYXNlIC5zdHJpbmc6IF8gPSB0cnkgcmVhZCgpIGFzIFN0cmluZworICAgICAgCisgICAgY2FzZSAuc3RydWN0OgorICAgICAgXyA9IHRyeSByZWFkU3RydWN0QmVnaW4oKQorICAgICAgd2hpbGUgdHJ1ZSB7CisgICAgICAgIGxldCAoXywgZmllbGRUeXBlLCBfKSA9IHRyeSByZWFkRmllbGRCZWdpbigpCisgICAgICAgIGlmIGZpZWxkVHlwZSA9PSAuc3RvcCB7CisgICAgICAgICAgYnJlYWsKKyAgICAgICAgfQorICAgICAgICB0cnkgc2tpcCh0eXBlOiBmaWVsZFR5cGUpCisgICAgICAgIHRyeSByZWFkRmllbGRFbmQoKQorICAgICAgfQorICAgICAgdHJ5IHJlYWRTdHJ1Y3RFbmQoKQorICAgICAgCisgICAgICAKKyAgICBjYXNlIC5tYXA6CisgICAgICBsZXQgKGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSkgPSB0cnkgcmVhZE1hcEJlZ2luKCkKKyAgICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgICAgdHJ5IHNraXAodHlwZToga2V5VHlwZSkKKyAgICAgICAgdHJ5IHNraXAodHlwZTogdmFsdWVUeXBlKQorICAgICAgfQorICAgICAgdHJ5IHJlYWRNYXBFbmQoKQorICAgICAgCisgICAgICAKKyAgICBjYXNlIC5zZXQ6CisgICAgICBsZXQgKGVsZW1UeXBlLCBzaXplKSA9IHRyeSByZWFkU2V0QmVnaW4oKQorICAgICAgZm9yIF8gaW4gMC4uPHNpemUgeworICAgICAgICB0cnkgc2tpcCh0eXBlOiBlbGVtVHlwZSkKKyAgICAgIH0KKyAgICAgIHRyeSByZWFkU2V0RW5kKCkKKyAgICAgIAorICAgIGNhc2UgLmxpc3Q6CisgICAgICBsZXQgKGVsZW1UeXBlLCBzaXplKSA9IHRyeSByZWFkTGlzdEJlZ2luKCkKKyAgICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgICAgdHJ5IHNraXAodHlwZTogZWxlbVR5cGUpCisgICAgICB9CisgICAgICB0cnkgcmVhZExpc3RFbmQoKQorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm90b2NvbEVycm9yLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFByb3RvY29sRXJyb3Iuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVkMTRmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm90b2NvbEVycm9yLnN3aWZ0CkBAIC0wLDAgKzEsMTQ2IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitwdWJsaWMgc3RydWN0IFRQcm90b2NvbEVycm9yIDogVEVycm9yIHsKKyAgcHVibGljIGluaXQoKSB7IH0KKworICBwdWJsaWMgZW51bSBDb2RlIDogVEVycm9yQ29kZSB7CisgICAgY2FzZSB1bmtub3duCisgICAgY2FzZSBpbnZhbGlkRGF0YQorICAgIGNhc2UgbmVnYXRpdmVTaXplCisgICAgY2FzZSBzaXplTGltaXQobGltaXQ6IEludCwgZ290OiBJbnQpCisgICAgY2FzZSBiYWRWZXJzaW9uKGV4cGVjdGVkOiBTdHJpbmcsIGdvdDogU3RyaW5nKQorICAgIGNhc2Ugbm90SW1wbGVtZW50ZWQKKyAgICBjYXNlIGRlcHRoTGltaXQKKworICAgIHB1YmxpYyB2YXIgdGhyaWZ0RXJyb3JDb2RlOiBJbnQgeworICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAudW5rbm93bjogICAgICAgIHJldHVybiAwCisgICAgICBjYXNlIC5pbnZhbGlkRGF0YTogICAgcmV0dXJuIDEKKyAgICAgIGNhc2UgLm5lZ2F0aXZlU2l6ZTogICByZXR1cm4gMgorICAgICAgY2FzZSAuc2l6ZUxpbWl0OiAgICAgIHJldHVybiAzCisgICAgICBjYXNlIC5iYWRWZXJzaW9uOiAgICAgcmV0dXJuIDQKKyAgICAgIGNhc2UgLm5vdEltcGxlbWVudGVkOiByZXR1cm4gNQorICAgICAgY2FzZSAuZGVwdGhMaW1pdDogICAgIHJldHVybiA2CisgICAgICB9CisKKyAgICB9CisgICAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLnVua25vd246ICAgICAgICByZXR1cm4gIlVua25vd24gVFByb3RvY29sRXJyb3IiCisgICAgICBjYXNlIC5pbnZhbGlkRGF0YTogICAgcmV0dXJuICJJbnZhbGlkIERhdGEiCisgICAgICBjYXNlIC5uZWdhdGl2ZVNpemU6ICAgcmV0dXJuICJOZWdhdGl2ZSBTaXplIgorICAgICAgY2FzZSAuc2l6ZUxpbWl0KGxldCBsaW1pdCwgbGV0IGdvdCk6CisgICAgICAgIHJldHVybiAiTWVzc2FnZSBleGNlZWRzIHNpemUgbGltaXQgb2YgXChsaW1pdCkgKHJlY2VpdmVkOiBcKGdvdCkiCisgICAgICBjYXNlIC5iYWRWZXJzaW9uKGxldCBleHBlY3RlZCwgbGV0IGdvdCk6CisgICAgICAgIHJldHVybiAiQmFkIFZlcnNpb24uIChFeHBlY3RlZDogXChleHBlY3RlZCksIEdvdDogXChnb3QpIgorICAgICAgY2FzZSAubm90SW1wbGVtZW50ZWQ6IHJldHVybiAiTm90IEltcGxlbWVudGVkIgorICAgICAgY2FzZSAuZGVwdGhMaW1pdDogICAgIHJldHVybiAiRGVwdGggTGltaXQiCisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIGVudW0gRXh0ZW5kZWRFcnJvckNvZGUgOiBURXJyb3JDb2RlIHsKKyAgICBjYXNlIHVua25vd24KKyAgICBjYXNlIG1pc3NpbmdSZXF1aXJlZEZpZWxkKGZpZWxkTmFtZTogU3RyaW5nKQorICAgIGNhc2UgdW5leHBlY3RlZFR5cGUodHlwZTogVFR5cGUpCisgICAgY2FzZSBtaXNtYXRjaGVkUHJvdG9jb2woZXhwZWN0ZWQ6IFN0cmluZywgZ290OiBTdHJpbmcpCisgICAgcHVibGljIHZhciB0aHJpZnRFcnJvckNvZGU6IEludCB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC51bmtub3duOiAgICAgICAgICAgICAgcmV0dXJuIDEwMDAKKyAgICAgIGNhc2UgLm1pc3NpbmdSZXF1aXJlZEZpZWxkOiByZXR1cm4gMTAwMQorICAgICAgY2FzZSAudW5leHBlY3RlZFR5cGU6ICAgICAgIHJldHVybiAxMDAyCisgICAgICBjYXNlIC5taXNtYXRjaGVkUHJvdG9jb2w6ICAgcmV0dXJuIDEwMDMKKyAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLnVua25vd246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIFRQcm90b2NvbEV4dGVuZGVkRXJyb3IiCisgICAgICBjYXNlIC5taXNzaW5nUmVxdWlyZWRGaWVsZChsZXQgZmllbGROYW1lKTogICAgICAgIHJldHVybiAiTWlzc2luZyBSZXF1aXJlZCBGaWVsZDogXChmaWVsZE5hbWUpIgorICAgICAgY2FzZSAudW5leHBlY3RlZFR5cGUobGV0IHR5cGUpOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIlVuZXhwZWN0ZWQgVHlwZSBcKHR5cGUuc2VsZikiCisgICAgICBjYXNlIC5taXNtYXRjaGVkUHJvdG9jb2wobGV0IGV4cGVjdGVkLCBsZXQgZ290KTogIHJldHVybiAiTWlzbWF0Y2hlZCBQcm90b2NvbC4gIChFeHBlY3RlZDogXChleHBlY3RlZCksIGdvdCBcKGdvdCkpIgorICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2YXIgZXh0ZW5kZWRFcnJvcjogRXh0ZW5kZWRFcnJvckNvZGU/ID0gbmlsCisKKyAgcHVibGljIGluaXQoZXJyb3I6IENvZGUgPSAudW5rbm93biwKKyAgICAgICAgICAgICAgbWVzc2FnZTogU3RyaW5nPyA9IG5pbCwKKyAgICAgICAgICAgICAgZXh0ZW5kZWRFcnJvcjogRXh0ZW5kZWRFcnJvckNvZGU/ID0gbmlsKSB7CisgICAgc2VsZi5lcnJvciA9IGVycm9yCisgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQorICAgIHNlbGYuZXh0ZW5kZWRFcnJvciA9IGV4dGVuZGVkRXJyb3IKKyAgfQorCisgIC8vLyBNYXJrOiBURXJyb3IKKyAgcHVibGljIHZhciBlcnJvcjogQ29kZSA9IC51bmtub3duCisgIHB1YmxpYyB2YXIgbWVzc2FnZTogU3RyaW5nPyA9IG5pbAorICBwdWJsaWMgc3RhdGljIHZhciBkZWZhdWx0Q2FzZTogQ29kZSB7IHJldHVybiAudW5rbm93biB9CisKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICB2YXIgb3V0ID0gIlwoVFByb3RvY29sRXJyb3Iuc2VsZik6ICAoXChlcnJvci50aHJpZnRFcnJvckNvZGUpIFwoZXJyb3IuZGVzY3JpcHRpb24pXG4iCisgICAgaWYgbGV0IGV4dGVuZGVkRXJyb3IgPSBleHRlbmRlZEVycm9yIHsKKyAgICAgIG91dCArPSAiVFByb3RvY29sRXh0ZW5kZWRFcnJvciAoXChleHRlbmRlZEVycm9yLnRocmlmdEVycm9yQ29kZSkpOiBcKGV4dGVuZGVkRXJyb3IuZGVzY3JpcHRpb24pIgorICAgIH0KKyAgICBpZiBsZXQgbWVzc2FnZSA9IG1lc3NhZ2UgeworICAgICAgb3V0ICs9ICJNZXNzYWdlOiBcKG1lc3NhZ2UpIgorICAgIH0KKyAgICByZXR1cm4gb3V0CisgIH0KK30KKworCisvLy8gV3JhcHBlciBmb3IgVHJhbnNwb3J0IGVycm9ycyBpbiBQcm90b2NvbHMuICBJbnNwaXJlZCBieSBUaHJpZnQtQ29jb2EgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SCisvLy8gbWFjcm8uICBNb2RpZmllZCB0byBiZSBtb3JlIFN3aWZ0LXkuICBDYXRjaGVzIGFueSBURXJyb3IgdGhyb3duIHdpdGhpbiB0aGUgYmxvY2sgYW5kCisvLy8gcmV0aHJvd3MgYSBnaXZlbiBUUHJvdG9jb2xFcnJvciwgdGhlIG9yaWdpbmFsIGVycm9yJ3MgZGVzY3JpcHRpb24gaXMgYXBwZW5kZWQgdG8gdGhlIG5ldworLy8vIFRQcm90b2NvbEVycm9yJ3MgbWVzc2FnZS4gIHNvdXJjZUZpbGUsIHNvdXJjZUxpbmUsIHNvdXJjZU1ldGhvZCBhcmUgYXV0by1wb3B1bGF0ZWQgYW5kIHNob3VsZAorLy8vIGJlIGlnbm9yZWQgd2hlbiBjYWxsaW5nLgorLy8vCisvLy8gLSBwYXJhbWV0ZXIgZXJyb3I6ICAgICAgICBUUHJvdG9jb2xFcnJvciB0byB0aHJvdyBpZiB0aGUgYmxvY2sgdGhyb3dzCisvLy8gLSBwYXJhbWV0ZXIgc291cmNlRmlsZTogICB0aHJvd2luZyBmaWxlLCBhdXRvcG9wdWxhdGVkCisvLy8gLSBwYXJhbWV0ZXIgc291cmNlTGluZTogICB0aHJvd2luZyBsaW5lLCBhdXRvcG9wdWxhdGVkCisvLy8gLSBwYXJhbWV0ZXIgc291cmNlTWV0aG9kOiB0aHJvd2luZyBtZXRob2QsIGF1dG9wb3B1bGF0ZWQKKy8vLyAtIHBhcmFtZXRlciBibG9jazogICAgICAgIHRocm93aW5nIGJsb2NrCisvLy8KKy8vLyAtIHRocm93czogVFByb3RvY29sRXJyb3IgIERlZmF1bHQgaXMgVFByb3RvY29sRXJyb3IuRXJyb3JDb2RlLnVua25vd24uICBVbmRlcmx5aW5nCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcidzIGRlc2NyaXB0aW9uIGFwcGVuZGVkIHRvIFRQcm90b2NvbEVycm9yLm1lc3NhZ2UKK2Z1bmMgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yID0gVFByb3RvY29sRXJyb3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZTogU3RyaW5nID0gI2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUxpbmU6IEludCA9ICNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VNZXRob2Q6IFN0cmluZyA9ICNmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2s6ICgpIHRocm93cyAtPiAoKSkgdGhyb3dzIHsKKyAgLy8gTmVlZCBtdXRhYmxlIGNvcHkKKyAgdmFyIGVycm9yID0gZXJyb3IKKyAgZG8geworICAgIHRyeSBibG9jaygpCisgIH0gY2F0Y2ggbGV0IGVyciBhcyBURXJyb3IgeworICAgIHZhciBtZXNzYWdlID0gZXJyb3IubWVzc2FnZSA/PyAiIgorICAgIG1lc3NhZ2UgKz0gIlxuRmlsZTogXChzb3VyY2VGaWxlKVxuIgorICAgIG1lc3NhZ2UgKz0gIkxpbmU6IFwoc291cmNlTGluZSlcbiIKKyAgICBtZXNzYWdlICs9ICJNZXRob2Q6IFwoc291cmNlTWV0aG9kKSIKKyAgICBtZXNzYWdlICs9ICJcbk9yaWdpbmFsIEVycm9yOlxuIiArIGVyci5kZXNjcmlwdGlvbgorICAgIGVycm9yLm1lc3NhZ2UgPSBtZXNzYWdlCisgICAgdGhyb3cgZXJyb3IKKyAgfQorfQorCisKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTU0xTb2NrZXRUcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU1NMU29ja2V0VHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYjU5MDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU1NMU29ja2V0VHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsMjI5IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgoraW1wb3J0IENvcmVGb3VuZGF0aW9uCisKKyNpZiBvcyhMaW51eCkKK3B1YmxpYyBjbGFzcyBUU1NMU29ja2V0VHJhbnNwb3J0IHsKKyAgaW5pdChob3N0bmFtZTogU3RyaW5nLCBwb3J0OiBVSW50MTYpIHsKKyAgICAvLyBGSVhNRSEKKyAgICBhc3NlcnQoZmFsc2UsICJTZWN1cml0eSBub3QgYXZhaWxhYmxlIGluIExpbnV4LCBUU1NMU29ja2V0VHJhbnNwb3J0IFVuYXZpbGFibGUgZm9yIG5vdyIpCisgIH0KK30KKyNlbHNlCitsZXQgaXNMaXR0bGVFbmRpYW4gPSBJbnQoT1NIb3N0Qnl0ZU9yZGVyKCkpID09IE9TTGl0dGxlRW5kaWFuCitsZXQgaHRvbnMgID0gaXNMaXR0bGVFbmRpYW4gPyBfT1NTd2FwSW50MTYgOiB7ICQwIH0KK2xldCBodG9ubCAgPSBpc0xpdHRsZUVuZGlhbiA/IF9PU1N3YXBJbnQzMiA6IHsgJDAgfQorCitwdWJsaWMgY2xhc3MgVFNTTFNvY2tldFRyYW5zcG9ydDogVFN0cmVhbVRyYW5zcG9ydCB7CisgIHZhciBzc2xIb3N0bmFtZTogU3RyaW5nCisgIHZhciBzZDogSW50MzIgPSAwCisgIAorICBwdWJsaWMgaW5pdChob3N0bmFtZTogU3RyaW5nLCBwb3J0OiBVSW50MTYpIHRocm93cyB7CisgICAgc3NsSG9zdG5hbWUgPSBob3N0bmFtZQorICAgIHZhciByZWFkU3RyZWFtOiBVbm1hbmFnZWQ8Q0ZSZWFkU3RyZWFtPj8KKyAgICB2YXIgd3JpdGVTdHJlYW06IFVubWFuYWdlZDxDRldyaXRlU3RyZWFtPj8KKyAgICAKKyAgICAvKiBjcmVhdGUgYSBzb2NrZXQgc3RydWN0dXJlICovCisgICAgdmFyIHBpbjogc29ja2FkZHJfaW4gPSBzb2NrYWRkcl9pbigpCisgICAgdmFyIGhwOiBVbnNhZmVNdXRhYmxlUG9pbnRlcjxob3N0ZW50Pj8gPSBuaWwKKyAgICBmb3IgaSBpbiAwLi48MTAgeworICAgICAgCisgICAgICBocCA9IGdldGhvc3RieW5hbWUoaG9zdG5hbWUuY1N0cmluZyh1c2luZzogU3RyaW5nLkVuY29kaW5nLnV0ZjgpISkKKyAgICAgIGlmIGhwID09IG5pbCB7CisgICAgICAgIHByaW50KCJmYWlsZWQgdG8gcmVzb2x2ZSBob3N0bmFtZSBcKGhvc3RuYW1lKSIpCisgICAgICAgIGhlcnJvcigicmVzb2x2IikKKyAgICAgICAgaWYgaSA9PSA5IHsKKyAgICAgICAgICBzdXBlci5pbml0KGlucHV0U3RyZWFtOiBuaWwsIG91dHB1dFN0cmVhbTogbmlsKSAvLyBoYXZlIHRvIGluaXQgYmVmb3JlIHRocm93aW5nCisgICAgICAgICAgdGhyb3cgVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yKGVycm9yOiAuaG9zdGFuYW1lUmVzb2x1dGlvbihob3N0bmFtZTogaG9zdG5hbWUpKQorICAgICAgICB9CisgICAgICAgIFRocmVhZC5zbGVlcChmb3JUaW1lSW50ZXJ2YWw6IDAuMikKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrCisgICAgICB9CisgICAgfQorICAgIHBpbi5zaW5fZmFtaWx5ICA9IFVJbnQ4KEFGX0lORVQpCisgICAgcGluLnNpbl9hZGRyICAgID0gaW5fYWRkcihzX2FkZHI6IFVJbnQzMigoaHA/LnBvaW50ZWUuaF9hZGRyX2xpc3QucG9pbnRlZT8ucG9pbnRlZSkhKSkgLy8gSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGdldCB0aGlzPz8/CisgICAgcGluLnNpbl9wb3J0ICAgID0gaHRvbnMocG9ydCkKKyAgICAKKyAgICAvKiBjcmVhdGUgdGhlIHNvY2tldCAqLworICAgIHNkID0gc29ja2V0KEludDMyKEFGX0lORVQpLCBJbnQzMihTT0NLX1NUUkVBTSksIEludDMyKElQUFJPVE9fVENQKSkKKyAgICBpZiBzZCA9PSAtMSB7CisgICAgICBzdXBlci5pbml0KGlucHV0U3RyZWFtOiBuaWwsIG91dHB1dFN0cmVhbTogbmlsKSAvLyBoYXZlIHRvIGluaXQgYmVmb3JlIHRocm93aW5nCisgICAgICB0aHJvdyBUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5zb2NrZXRDcmVhdGUocG9ydDogSW50KHBvcnQpKSkKKyAgICB9CisgICAgCisgICAgLyogb3BlbiBhIGNvbm5lY3Rpb24gKi8KKyAgICAvLyBuZWVkIGEgbm9uLXNlbGYgcmVmIHRvIHNkLCBvdGhlcndpc2UgdGhlIGogY29tcGxhaW5zCisgICAgbGV0IHNkX2xvY2FsID0gc2QKKyAgICBsZXQgY29ubmVjdFJlc3VsdCA9IHdpdGhVbnNhZmVQb2ludGVyKHRvOiAmcGluKSB7CisgICAgICBjb25uZWN0KHNkX2xvY2FsLCBVbnNhZmVQb2ludGVyPHNvY2thZGRyPihPcGFxdWVQb2ludGVyKCQwKSksIHNvY2tsZW5fdChNZW1vcnlMYXlvdXQ8c29ja2FkZHJfaW4+LnNpemUpKQorICAgIH0KKyAgICBpZiBjb25uZWN0UmVzdWx0ID09IC0xIHsKKyAgICAgIHN1cGVyLmluaXQoaW5wdXRTdHJlYW06IG5pbCwgb3V0cHV0U3RyZWFtOiBuaWwpIC8vIGhhdmUgdG8gaW5pdCBiZWZvcmUgdGhyb3dpbmcKKyAgICAgIHRocm93IFRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvcihlcnJvcjogLmNvbm5lY3QpCisgICAgfQorICAgIAorICAgIENGU3RyZWFtQ3JlYXRlUGFpcldpdGhTb2NrZXQoa0NGQWxsb2NhdG9yRGVmYXVsdCwgc2QsICZyZWFkU3RyZWFtLCAmd3JpdGVTdHJlYW0pCisgICAgCisgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkocmVhZFN0cmVhbT8udGFrZVJldGFpbmVkVmFsdWUoKSwgLnNvY2tldE5hdGl2ZUhhbmRsZSwga0NGQm9vbGVhblRydWUpCisgICAgQ0ZXcml0ZVN0cmVhbVNldFByb3BlcnR5KHdyaXRlU3RyZWFtPy50YWtlUmV0YWluZWRWYWx1ZSgpLCAuc29ja2V0TmF0aXZlSGFuZGxlLCBrQ0ZCb29sZWFuVHJ1ZSkKKyAgICAKKyAgICB2YXIgaW5wdXRTdHJlYW06IElucHV0U3RyZWFtPyA9IG5pbAorICAgIHZhciBvdXRwdXRTdHJlYW06IE91dHB1dFN0cmVhbT8gPSBuaWwKKyAgICBpZiByZWFkU3RyZWFtICE9IG5pbCAmJiB3cml0ZVN0cmVhbSAhPSBuaWwgeworICAgICAgCisgICAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtPy50YWtlUmV0YWluZWRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvY2tldFNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJlYW1Tb2NrZXRTZWN1cml0eUxldmVsVExTdjEpCisgICAgICAKKyAgICAgIGxldCBzZXR0aW5nczogW1N0cmluZzogQm9vbF0gPSBba0NGU3RyZWFtU1NMVmFsaWRhdGVzQ2VydGlmaWNhdGVDaGFpbiBhcyBTdHJpbmc6IHRydWVdCisgICAgICAKKyAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0/LnRha2VSZXRhaW5lZFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU1NMU2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyBhcyBDRlR5cGVSZWYhKQorICAgICAgCisgICAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkod3JpdGVTdHJlYW0/LnRha2VSZXRhaW5lZFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU1NMU2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyBhcyBDRlR5cGVSZWYhKQorICAgICAgCisgICAgICBpbnB1dFN0cmVhbSA9IHJlYWRTdHJlYW0hLnRha2VSZXRhaW5lZFZhbHVlKCkKKyAgICAgIGlucHV0U3RyZWFtPy5zY2hlZHVsZShpbjogLmN1cnJlbnQsIGZvck1vZGU6IC5kZWZhdWx0UnVuTG9vcE1vZGUpCisgICAgICBpbnB1dFN0cmVhbT8ub3BlbigpCisgICAgICAKKyAgICAgIG91dHB1dFN0cmVhbSA9IHdyaXRlU3RyZWFtIS50YWtlUmV0YWluZWRWYWx1ZSgpCisgICAgICBvdXRwdXRTdHJlYW0/LnNjaGVkdWxlKGluOiAuY3VycmVudCwgZm9yTW9kZTogLmRlZmF1bHRSdW5Mb29wTW9kZSkKKyAgICAgIG91dHB1dFN0cmVhbT8ub3BlbigpCisgICAgICAKKyAgICAgIHJlYWRTdHJlYW0/LnJlbGVhc2UoKQorICAgICAgd3JpdGVTdHJlYW0/LnJlbGVhc2UoKQorICAgIH0KKyAgICAKKyAgICAKKyAgICBzdXBlci5pbml0KGlucHV0U3RyZWFtOiBpbnB1dFN0cmVhbSwgb3V0cHV0U3RyZWFtOiBvdXRwdXRTdHJlYW0pCisgICAgc2VsZi5pbnB1dD8uZGVsZWdhdGUgPSBzZWxmCisgICAgc2VsZi5vdXRwdXQ/LmRlbGVnYXRlID0gc2VsZgorICB9CisgIAorICBmdW5jIHJlY292ZXJGcm9tVHJ1c3RGYWlsdXJlKF8gbXlUcnVzdDogU2VjVHJ1c3QsIGxhc3RUcnVzdFJlc3VsdDogU2VjVHJ1c3RSZXN1bHRUeXBlKSAtPiBCb29sIHsKKyAgICBsZXQgdHJ1c3RUaW1lID0gU2VjVHJ1c3RHZXRWZXJpZnlUaW1lKG15VHJ1c3QpCisgICAgbGV0IGN1cnJlbnRUaW1lID0gQ0ZBYnNvbHV0ZVRpbWVHZXRDdXJyZW50KCkKKyAgICAKKyAgICBsZXQgdGltZUluY3JlbWVudCA9IDMxNTM2MDAwIC8vIGZyb20gVFNTTFNvY2tldFRyYW5zcG9ydC5tCisgICAgbGV0IG5ld1RpbWUgPSBjdXJyZW50VGltZSAtIERvdWJsZSh0aW1lSW5jcmVtZW50KQorICAgIAorICAgIGlmIHRydXN0VGltZSAtIG5ld1RpbWUgIT0gMCB7CisgICAgICBsZXQgbmV3RGF0ZSA9IENGRGF0ZUNyZWF0ZShuaWwsIG5ld1RpbWUpCisgICAgICBTZWNUcnVzdFNldFZlcmlmeURhdGUobXlUcnVzdCwgbmV3RGF0ZSEpCisgICAgICAKKyAgICAgIHZhciB0ciA9IGxhc3RUcnVzdFJlc3VsdAorICAgICAgbGV0IHN1Y2Nlc3MgPSB3aXRoVW5zYWZlTXV0YWJsZVBvaW50ZXIodG86ICZ0cikgeyB0clB0ciAtPiBCb29sIGluCisgICAgICAgIGlmIFNlY1RydXN0RXZhbHVhdGUobXlUcnVzdCwgdHJQdHIpICE9IGVyclNlY1N1Y2Nlc3MgeworICAgICAgICAgIHJldHVybiBmYWxzZQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlCisgICAgICB9CisgICAgICBpZiAhc3VjY2VzcyB7IHJldHVybiBmYWxzZSB9CisgICAgfQorICAgIGlmIGxhc3RUcnVzdFJlc3VsdCA9PSAucHJvY2VlZCB8fCBsYXN0VHJ1c3RSZXN1bHQgPT0gLnVuc3BlY2lmaWVkIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlCisgICAgfQorCisgICAgcHJpbnQoIlRTU0xTb2NrZXRUcmFuc3BvcnQ6IFVuYWJsZSB0byByZWNvdmVyIGNlcnRpZmljYXRlIHRydXN0IGZhaWx1cmUiKQorICAgIHJldHVybiB0cnVlCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGlzT3BlbigpIC0+IEJvb2wgeworICAgIHJldHVybiBzZCA+IDAKKyAgfQorfQorCitleHRlbnNpb24gVFNTTFNvY2tldFRyYW5zcG9ydDogU3RyZWFtRGVsZWdhdGUgeworICBwdWJsaWMgZnVuYyBzdHJlYW0oXyBhU3RyZWFtOiBTdHJlYW0sIGhhbmRsZSBldmVudENvZGU6IFN0cmVhbS5FdmVudCkgeworICAgIAorICAgIHN3aXRjaCBldmVudENvZGUgeworICAgIGNhc2UgU3RyZWFtLkV2ZW50KCk6IGJyZWFrCisgICAgY2FzZSBTdHJlYW0uRXZlbnQuaGFzQnl0ZXNBdmFpbGFibGU6IGJyZWFrCisgICAgY2FzZSBTdHJlYW0uRXZlbnQub3BlbkNvbXBsZXRlZDogYnJlYWsKKyAgICBjYXNlIFN0cmVhbS5FdmVudC5oYXNTcGFjZUF2YWlsYWJsZToKKyAgICAgIHZhciBwcm9jZWVkID0gZmFsc2UKKyAgICAgIHZhciB0cnVzdFJlc3VsdDogU2VjVHJ1c3RSZXN1bHRUeXBlID0gLmludmFsaWQKKworICAgICAgdmFyIG5ld1BvbGljaWVzOiBDRk11dGFibGVBcnJheT8KKyAgICAgIAorICAgICAgcmVwZWF0IHsKKyAgICAgICAgbGV0IHRydXN0OiBTZWNUcnVzdCA9IGFTdHJlYW0ucHJvcGVydHkoZm9yS2V5OiAuU1NMUGVlclRydXN0KSBhcyEgU2VjVHJ1c3QKKyAgICAgICAgCisgICAgICAgIC8vIEFkZCBuZXcgcG9saWN5IHRvIGN1cnJlbnQgbGlzdCBvZiBwb2xpY2llcworICAgICAgICBsZXQgcG9saWN5ID0gU2VjUG9saWN5Q3JlYXRlU1NMKGZhbHNlLCBzc2xIb3N0bmFtZSBhcyBDRlN0cmluZz8pCisgICAgICAgIHZhciBwcG9saWN5ID0gcG9saWN5IC8vIG11dGFibGUgZm9yIHBvaW50ZXIKKyAgICAgICAgbGV0IHBvbGljaWVzOiBVbnNhZmVNdXRhYmxlUG9pbnRlcjxDRkFycmF5Pz4/ID0gbmlsCisgICAgICAgIGlmIFNlY1RydXN0Q29weVBvbGljaWVzKHRydXN0LCBwb2xpY2llcyEpICE9IGVyclNlY1N1Y2Nlc3MgeworICAgICAgICAgIGJyZWFrCisgICAgICAgIH0KKyAgICAgICAgd2l0aFVuc2FmZU11dGFibGVQb2ludGVyKHRvOiAmcHBvbGljeSkgeyBwdHIgaW4KKyAgICAgICAgICBuZXdQb2xpY2llcyA9IENGQXJyYXlDcmVhdGVNdXRhYmxlQ29weShuaWwsIDAsIHBvbGljaWVzPy5wb2ludGVlKQorICAgICAgICAgIENGQXJyYXlBcHBlbmRWYWx1ZShuZXdQb2xpY2llcywgcHRyKQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyB1cGRhdGUgdHJ1c3QgcG9saWNpZXMKKyAgICAgICAgaWYgU2VjVHJ1c3RTZXRQb2xpY2llcyh0cnVzdCwgbmV3UG9saWNpZXMhKSAhPSBlcnJTZWNTdWNjZXNzIHsKKyAgICAgICAgICBicmVhaworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBFdmFsdWF0ZSB0aGUgdHJ1c3QgY2hhaW4KKyAgICAgICAgbGV0IHN1Y2Nlc3MgPSB3aXRoVW5zYWZlTXV0YWJsZVBvaW50ZXIodG86ICZ0cnVzdFJlc3VsdCkgeyB0cnVzdFB0ciAtPiBCb29sIGluCisgICAgICAgICAgaWYgU2VjVHJ1c3RFdmFsdWF0ZSh0cnVzdCwgdHJ1c3RQdHIpICE9IGVyclNlY1N1Y2Nlc3MgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlCisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiB0cnVlCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICFzdWNjZXNzIHsKKyAgICAgICAgICBicmVhaworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgc3dpdGNoIHRydXN0UmVzdWx0IHsKKyAgICAgICAgY2FzZSAucHJvY2VlZDogICAgICBwcm9jZWVkID0gdHJ1ZQorICAgICAgICBjYXNlIC51bnNwZWNpZmllZDogIHByb2NlZWQgPSB0cnVlCisgICAgICAgIGNhc2UgLnJlY292ZXJhYmxlVHJ1c3RGYWlsdXJlOgorICAgICAgICAgIHByb2NlZWQgPSBzZWxmLnJlY292ZXJGcm9tVHJ1c3RGYWlsdXJlKHRydXN0LCBsYXN0VHJ1c3RSZXN1bHQ6IHRydXN0UmVzdWx0KQorICAgICAgICAgIAorICAgICAgICBjYXNlIC5kZW55OiAgICAgICAgIGJyZWFrCisgICAgICAgIGNhc2UgLmZhdGFsVHJ1c3RGYWlsdXJlOiBicmVhaworICAgICAgICBjYXNlIC5vdGhlckVycm9yOiAgIGJyZWFrCisgICAgICAgIGNhc2UgLmludmFsaWQ6ICAgICAgYnJlYWsKKyAgICAgICAgZGVmYXVsdDogYnJlYWsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSBmYWxzZQorICAKKyAgICAgIGlmICFwcm9jZWVkIHsKKyAgICAgICAgcHJpbnQoIlRTU0xTb2NrZXRUcmFuc3BvcnQ6IENhbm5vdCB0cnVzdCBjZXJ0aWZpY2F0ZS4gIFJlc3VsdDogXCh0cnVzdFJlc3VsdCkiKQorICAgICAgICBhU3RyZWFtLmNsb3NlKCkKKyAgICAgIH0KKyAgICAgIAorICAgIGNhc2UgU3RyZWFtLkV2ZW50LmVycm9yT2NjdXJyZWQ6IGJyZWFrCisgICAgY2FzZSBTdHJlYW0uRXZlbnQuZW5kRW5jb3VudGVyZWQ6IGJyZWFrCisgICAgZGVmYXVsdDogYnJlYWsKKyAgICB9CisgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYTE2MmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3Iuc3dpZnQKQEAgLTAsMCArMSw0OCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcHVibGljIHN0cnVjdCBUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3I6IFRFcnJvciB7CisgIHB1YmxpYyBlbnVtIEVycm9yQ29kZTogVEVycm9yQ29kZSB7CisgICAgY2FzZSBob3N0YW5hbWVSZXNvbHV0aW9uKGhvc3RuYW1lOiBTdHJpbmcpCisgICAgY2FzZSBzb2NrZXRDcmVhdGUocG9ydDogSW50KQorICAgIGNhc2UgY29ubmVjdAorICAKKyAgICBwdWJsaWMgdmFyIHRocmlmdEVycm9yQ29kZTogSW50IHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLmhvc3RhbmFtZVJlc29sdXRpb246ICByZXR1cm4gLTEwMDAwCisgICAgICBjYXNlIC5zb2NrZXRDcmVhdGU6ICAgICAgICAgcmV0dXJuIC0xMDAwMQorICAgICAgY2FzZSAuY29ubmVjdDogICAgICAgICAgICAgIHJldHVybiAtMTAwMDIKKyAgICAgIH0KKyAgICB9CisgIAorICAgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb246IFN0cmluZyB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC5ob3N0YW5hbWVSZXNvbHV0aW9uKGxldCBob3N0bmFtZSk6ICByZXR1cm4gIkZhaWxlZCB0byByZXNvbHZlIGhvc3RuYW1lOiBcKGhvc3RuYW1lKSIKKyAgICAgIGNhc2UgLnNvY2tldENyZWF0ZShsZXQgcG9ydCk6ICAgICAgICAgICAgIHJldHVybiAiQ291bGQgbm90IGNyZWF0ZSBzb2NrZXQgb24gcG9ydDogXChwb3J0KSIKKyAgICAgIGNhc2UgLmNvbm5lY3Q6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQ29ubmVjdCBlcnJvciIKKyAgICAgIH0KKyAgICB9CisgIAorICB9CisgIHB1YmxpYyB2YXIgZXJyb3I6IEVycm9yQ29kZSA9IC5jb25uZWN0CisgIHB1YmxpYyB2YXIgbWVzc2FnZTogU3RyaW5nPworICBwdWJsaWMgc3RhdGljIHZhciBkZWZhdWx0Q2FzZTogRXJyb3JDb2RlIHsgcmV0dXJuIC5jb25uZWN0IH0KKyAgCisgIHB1YmxpYyBpbml0KCkgeyB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UU2VyaWFsaXphYmxlLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNlcmlhbGl6YWJsZS5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDUwOTZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNlcmlhbGl6YWJsZS5zd2lmdApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCisKK3B1YmxpYyBwcm90b2NvbCBUU2VyaWFsaXphYmxlIHsKKyAgdmFyIGhhc2hWYWx1ZTogSW50IHsgZ2V0IH0KKworICAvLy8gVFR5cGUgZm9yIGluc3RhbmNlCisgIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyBnZXQgfQorCisgIC8vLyBSZWFkIFRTZXJpYWxpemFibGUgaW5zdGFuY2UgZnJvbSBQcm90b2NvbAorICBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFNlbGYKKworICAvLy8gV3JpdGUgVFNlcmlhbGl6YWJsZSBpbnN0YW5jZSB0byBQcm90b2NvbAorICBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cworCit9CisKK2V4dGVuc2lvbiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IFNlbGYsIHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHZhbHVlLndyaXRlKHRvOiBwcm90bykKKyAgfQorCisgIC8vLyBjb252ZW5pZW5jZSBmb3IgbWVtYmVyIGFjY2VzcworICBwdWJsaWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIFNlbGYudGhyaWZ0VHlwZSB9Cit9CisKK3B1YmxpYyBmdW5jID09PFQ+KGxoczogVCwgcmhzOiBUKSAtPiBCb29sIHdoZXJlIFQgOiBUU2VyaWFsaXphYmxlIHsKKyAgcmV0dXJuIGxocy5oYXNoVmFsdWUgPT0gcmhzLmhhc2hWYWx1ZQorfQorCisvLy8gRGVmYXVsdCByZWFkL3dyaXRlIGZvciBwcmltaXRhdmUgVGhyaWZ0IHR5cGVzOgorLy8vIEJvb2wsIEludDggKGJ5dGUpLCBJbnQxNiwgSW50MzIsIEludDY0LCBEb3VibGUsIFN0cmluZworCitleHRlbnNpb24gQm9vbCA6IFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuYm9vbCB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gQm9vbCB7CisgICAgcmV0dXJuIHRyeSBwcm90by5yZWFkKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlKHNlbGYpCisgIH0KK30KKworZXh0ZW5zaW9uIEludDggOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLmk4IH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBJbnQ4IHsKKyAgICByZXR1cm4gSW50OCh0cnkgcHJvdG8ucmVhZCgpIGFzIFVJbnQ4KQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUoVUludDgoc2VsZikpCisgIH0KK30KKworZXh0ZW5zaW9uIEludDE2IDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5pMTYgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludDE2IHsKKyAgICByZXR1cm4gdHJ5IHByb3RvLnJlYWQoKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUoc2VsZikKKyAgfQorfQorCitleHRlbnNpb24gSW50MzIgOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLmkzMiB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50MzIgeworICAgIHJldHVybiB0cnkgcHJvdG8ucmVhZCgpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShzZWxmKQorICB9Cit9CisKKworZXh0ZW5zaW9uIEludDY0IDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5pNjQgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludDY0IHsKKyAgICByZXR1cm4gdHJ5IHByb3RvLnJlYWQoKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUoc2VsZikKKyAgfQorfQorCitleHRlbnNpb24gRG91YmxlIDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5kb3VibGUgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IERvdWJsZSB7CisgICAgcmV0dXJuIHRyeSBwcm90by5yZWFkKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlKHNlbGYpCisgIH0KK30KKworZXh0ZW5zaW9uIFN0cmluZyA6IFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuc3RyaW5nIH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBTdHJpbmcgeworICAgIHJldHVybiB0cnkgcHJvdG8ucmVhZCgpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShzZWxmKQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UU2V0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNldC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWNkMTcwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNldC5zd2lmdApAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitwdWJsaWMgc3RydWN0IFRTZXQ8RWxlbWVudCA6IFRTZXJpYWxpemFibGUgJiBIYXNoYWJsZT4gOiBTZXRBbGdlYnJhLCBIYXNoYWJsZSwgQ29sbGVjdGlvbiwgRXhwcmVzc2libGVCeUFycmF5TGl0ZXJhbCwgVFNlcmlhbGl6YWJsZSB7CisgIC8vLyBUeXBlYWxpYXMgZm9yIFN0b3JhZ2UgdHlwZQorICBwdWJsaWMgdHlwZWFsaWFzIFN0b3JhZ2UgPSBTZXQ8RWxlbWVudD4KKyAgCisgIAorICAvLy8gSW50ZXJuYWwgU3RvcmFnZSB1c2VkIGZvciBUU2V0IChTZXRcPEVsZW1lbnRcPikKKyAgaW50ZXJuYWwgdmFyIHN0b3JhZ2UgOiBTdG9yYWdlCisgIAorICAKKyAgLy8vIE1hcms6IENvbGxlY3Rpb24KKyAgCisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kaWNlcyA9IFN0b3JhZ2UuSW5kaWNlcworICBwdWJsaWMgdHlwZWFsaWFzIEluZGV4ID0gU3RvcmFnZS5JbmRleAorICBwdWJsaWMgdHlwZWFsaWFzIEluZGV4RGlzdGFuY2UgPSBTdG9yYWdlLkluZGV4RGlzdGFuY2UKKyAgcHVibGljIHR5cGVhbGlhcyBTdWJTZXF1ZW5jZSA9IFN0b3JhZ2UuU3ViU2VxdWVuY2UKKyAgCisgIAorICBwdWJsaWMgdmFyIGluZGljZXM6IEluZGljZXMgeyByZXR1cm4gc3RvcmFnZS5pbmRpY2VzIH0KKyAgCisgIC8vIE11c3QgaW1wbGVtZW50IGlzRW1wdHkgZXZlbiB0aG91Z2ggYm90aCBTZXRBbGdlYnJhIGFuZCBDb2xsZWN0aW9uIHByb3ZpZGUgaXQgZHVlIHRvIHRoZWlyIGNvbmZsY2l0aW5nIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zCisgIHB1YmxpYyB2YXIgaXNFbXB0eTogQm9vbCB7IHJldHVybiBzdG9yYWdlLmlzRW1wdHkgfQorICAKKyAgcHVibGljIGZ1bmMgZGlzdGFuY2UoZnJvbSBzdGFydDogSW5kZXgsIHRvIGVuZDogSW5kZXgpIC0+IEluZGV4RGlzdGFuY2UgeworICAgIHJldHVybiBzdG9yYWdlLmRpc3RhbmNlKGZyb206IHN0YXJ0LCB0bzogZW5kKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpbmRleChfIGk6IEluZGV4LCBvZmZzZXRCeSBuOiBJbmRleERpc3RhbmNlKSAtPiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoaSwgb2Zmc2V0Qnk6IG4pCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGluZGV4KF8gaTogSW5kZXgsIG9mZnNldEJ5IG46IEluZGV4RGlzdGFuY2UsIGxpbWl0ZWRCeSBsaW1pdDogSW5kZXgpIC0+IEluZGV4PyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoaSwgb2Zmc2V0Qnk6IG4sIGxpbWl0ZWRCeTogbGltaXQpCisgIH0KKyAgCisgICNpZiBzd2lmdCg+PTMuMikKKyAgcHVibGljIHN1YnNjcmlwdCAocG9zaXRpb246IFN0b3JhZ2UuSW5kZXgpIC0+IEVsZW1lbnQgeworICAgICAgcmV0dXJuIHN0b3JhZ2VbcG9zaXRpb25dCisgICAgfQorICAjZWxzZQorICBwdWJsaWMgc3Vic2NyaXB0IChwb3NpdGlvbjogU3RvcmFnZS5JbmRleCkgLT4gRWxlbWVudD8geworICAgIHJldHVybiBzdG9yYWdlW3Bvc2l0aW9uXQorICB9CisgICNlbmRpZgorICAKKyAgLy8vIE1hcms6IFNldEFsZ2VicmEKKyAgaW50ZXJuYWwgaW5pdChzdG9yYWdlOiBTZXQ8RWxlbWVudD4pIHsKKyAgICBzZWxmLnN0b3JhZ2UgPSBzdG9yYWdlCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGNvbnRhaW5zKF8gbWVtYmVyOiBFbGVtZW50KSAtPiBCb29sIHsKKyAgICByZXR1cm4gc3RvcmFnZS5jb250YWlucyhtZW1iZXIpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGluc2VydChfIG5ld01lbWJlcjogRWxlbWVudCkgLT4gKGluc2VydGVkOiBCb29sLCBtZW1iZXJBZnRlckluc2VydDogRWxlbWVudCkgeworICAgIHJldHVybiBzdG9yYWdlLmluc2VydChuZXdNZW1iZXIpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZShfIG1lbWJlcjogRWxlbWVudCkgLT4gRWxlbWVudD8geworICAgIHJldHVybiBzdG9yYWdlLnJlbW92ZShtZW1iZXIpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHVuaW9uKF8gb3RoZXI6IFRTZXQ8RWxlbWVudD4pIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2U6IHN0b3JhZ2UudW5pb24ob3RoZXIuc3RvcmFnZSkpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGZvcm1JbnRlcnNlY3Rpb24oXyBvdGhlcjogVFNldDxFbGVtZW50PikgeworICAgIHJldHVybiBzdG9yYWdlLmZvcm1JbnRlcnNlY3Rpb24ob3RoZXIuc3RvcmFnZSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgZm9ybVN5bW1ldHJpY0RpZmZlcmVuY2UoXyBvdGhlcjogVFNldDxFbGVtZW50PikgeworICAgIHJldHVybiBzdG9yYWdlLmZvcm1TeW1tZXRyaWNEaWZmZXJlbmNlKG90aGVyLnN0b3JhZ2UpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGZvcm1VbmlvbihfIG90aGVyOiBUU2V0PEVsZW1lbnQ+KSB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZm9ybVVuaW9uKG90aGVyLnN0b3JhZ2UpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGludGVyc2VjdGlvbihfIG90aGVyOiBUU2V0PEVsZW1lbnQ+KSAtPiBUU2V0IHsKKyAgICByZXR1cm4gVFNldChzdG9yYWdlOiBzdG9yYWdlLmludGVyc2VjdGlvbihvdGhlci5zdG9yYWdlKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgc3ltbWV0cmljRGlmZmVyZW5jZShfIG90aGVyOiBUU2V0PEVsZW1lbnQ+KSAtPiBUU2V0IHsKKyAgICByZXR1cm4gVFNldChzdG9yYWdlOiBzdG9yYWdlLnN5bW1ldHJpY0RpZmZlcmVuY2Uob3RoZXIuc3RvcmFnZSkpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHVwZGF0ZSh3aXRoIG5ld01lbWJlcjogRWxlbWVudCkgLT4gRWxlbWVudD8geworICAgIHJldHVybiBzdG9yYWdlLnVwZGF0ZSh3aXRoOiBuZXdNZW1iZXIpCisgIH0KKyAgCisgIC8vLyBNYXJrOiBJbmRleGFibGVCYXNlCisgIAorICBwdWJsaWMgdmFyIHN0YXJ0SW5kZXg6IEluZGV4IHsgcmV0dXJuIHN0b3JhZ2Uuc3RhcnRJbmRleCB9CisgIHB1YmxpYyB2YXIgZW5kSW5kZXg6IEluZGV4IHsgcmV0dXJuIHN0b3JhZ2UuZW5kSW5kZXggfQorICBwdWJsaWMgZnVuYyBpbmRleChhZnRlciBpOiBJbmRleCkgLT4gSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLmluZGV4KGFmdGVyOiBpKQorICB9CisKKyAgcHVibGljIGZ1bmMgZm9ybUluZGV4KGFmdGVyIGk6IGlub3V0IFN0b3JhZ2UuSW5kZXgpIHsKKyAgICBzdG9yYWdlLmZvcm1JbmRleChhZnRlcjogJmkpCisgIH0KKyAgCisgIHB1YmxpYyBzdWJzY3JpcHQoYm91bmRzOiBSYW5nZTxJbmRleD4pIC0+IFN1YlNlcXVlbmNlIHsKKyAgICByZXR1cm4gc3RvcmFnZVtib3VuZHNdCisgIH0KKworICAKKyAgLy8vIE1hcms6IEhhc2hhYmxlCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlIDogSW50IHsKKyAgICBsZXQgcHJpbWUgPSAzMQorICAgIHZhciByZXN1bHQgPSAxCisgICAgZm9yIGVsZW1lbnQgaW4gc3RvcmFnZSB7CisgICAgICByZXN1bHQgPSBwcmltZSAmKiByZXN1bHQgJisgZWxlbWVudC5oYXNoVmFsdWUKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICAvLy8gTWFyazogVFNlcmlhbGl6YWJsZQorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gLnNldCB9CisgIAorICBwdWJsaWMgaW5pdCgpIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZSgpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KGFycmF5TGl0ZXJhbCBlbGVtZW50czogRWxlbWVudC4uLikgeworICAgIHNlbGYuc3RvcmFnZSA9IFN0b3JhZ2UoZWxlbWVudHMpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0PFNvdXJjZSA6IFNlcXVlbmNlPihfIHNlcXVlbmNlOiBTb3VyY2UpIHdoZXJlIFNvdXJjZS5JdGVyYXRvci5FbGVtZW50ID09IEVsZW1lbnQgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKHNlcXVlbmNlKQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBUU2V0IHsKKyAgICBsZXQgKGVsZW1lbnRUeXBlLCBzaXplKSA9IHRyeSBwcm90by5yZWFkU2V0QmVnaW4oKQorICAgIGlmIGVsZW1lbnRUeXBlICE9IEVsZW1lbnQudGhyaWZ0VHlwZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmludmFsaWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRFcnJvcjogLnVuZXhwZWN0ZWRUeXBlKHR5cGU6IGVsZW1lbnRUeXBlKSkKKyAgICB9CisgICAgdmFyIHNldCA9IFRTZXQoKQorICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgIGxldCBlbGVtZW50ID0gdHJ5IEVsZW1lbnQucmVhZChmcm9tOiBwcm90bykKKyAgICAgIHNldC5zdG9yYWdlLmluc2VydChlbGVtZW50KQorICAgIH0KKyAgICB0cnkgcHJvdG8ucmVhZFNldEVuZCgpCisgICAgcmV0dXJuIHNldAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZVNldEJlZ2luKGVsZW1lbnRUeXBlOiBFbGVtZW50LnRocmlmdFR5cGUsIHNpemU6IEludDMyKHNlbGYuY291bnQpKQorICAgIGZvciBlbGVtZW50IGluIHNlbGYuc3RvcmFnZSB7CisgICAgICB0cnkgRWxlbWVudC53cml0ZShlbGVtZW50LCB0bzogcHJvdG8pCisgICAgfQorICAgIHRyeSBwcm90by53cml0ZVNldEVuZCgpCisgIH0KK30KKworZXh0ZW5zaW9uIFRTZXQ6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIHsKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVzY3JpcHRpb24KKyAgfQorICBwdWJsaWMgdmFyIGRlYnVnRGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlYnVnRGVzY3JpcHRpb24KKyAgfQorICAKK30KKworcHVibGljIGZ1bmMgPT08RWxlbWVudD4obGhzOiBUU2V0PEVsZW1lbnQ+LCByaHM6IFRTZXQ8RWxlbWVudD4pIC0+IEJvb2wgeworICByZXR1cm4gbGhzLnN0b3JhZ2UgPT0gcmhzLnN0b3JhZ2UKK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTb2NrZXRTZXJ2ZXIuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU29ja2V0U2VydmVyLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMjRlNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU29ja2V0U2VydmVyLnN3aWZ0CkBAIC0wLDAgKzEsMTQ5IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWYgb3MoT1NYKSB8fCBvcyhpT1MpIHx8IG9zKHdhdGNoT1MpIHx8IG9zKHR2T1MpCisgIGltcG9ydCBEYXJ3aW4KKyNlbHNlaWYgb3MoTGludXgpIHx8IG9zKEZyZWVCU0QpIHx8IG9zKFBTNCkgfHwgb3MoQW5kcm9pZCkKKyAgaW1wb3J0IEdsaWJjCisgIGltcG9ydCBEaXNwYXRjaAorI2VuZGlmCisKK2ltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgQ29yZUZvdW5kYXRpb24KKworcHVibGljIGxldCBUU29ja2V0U2VydmVyQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkID0gIlRTb2NrZXRTZXJ2ZXJDbGllbnRDb25uZWN0aW9uRmluaXNoZWQiCitwdWJsaWMgbGV0IFRTb2NrZXRTZXJ2ZXJQcm9jZXNzb3JLZXkgPSAiVFNvY2tldFNlcnZlclByb2Nlc3NvciIKK3B1YmxpYyBsZXQgVFNvY2tldFNlcnZlclRyYW5zcG9ydEtleSA9ICJUU29ja2V0U2VydmVyVHJhbnNwb3J0IgorCitjbGFzcyBUU29ja2V0U2VydmVyPEluUHJvdG9jb2w6IFRQcm90b2NvbCwgT3V0UHJvdG9jb2w6IFRQcm90b2NvbCwgUHJvY2Vzc29yOiBUUHJvY2Vzc29yLCBTZXJ2aWNlPiB3aGVyZSBQcm9jZXNzb3IuU2VydmljZSA9PSBTZXJ2aWNlIHsKKyAgdmFyIHNvY2tldEZpbGVIYW5kbGU6IEZpbGVIYW5kbGUKKyAgdmFyIHByb2Nlc3NpbmdRdWV1ZSA9ICBEaXNwYXRjaFF1ZXVlKGxhYmVsOiAiVFNvY2tldFNlcnZlci5wcm9jZXNzaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFvczogLmJhY2tncm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiAuY29uY3VycmVudCkKKyAgdmFyIHNlcnZpY2VIYW5kbGVyOiBTZXJ2aWNlCisKKyAgcHVibGljIGluaXQocG9ydDogSW50LAorICAgICAgICAgICAgICBzZXJ2aWNlOiBTZXJ2aWNlLAorICAgICAgICAgICAgICBpblByb3RvY29sOiBJblByb3RvY29sLlR5cGUsCisgICAgICAgICAgICAgIG91dFByb3RvY29sOiBPdXRQcm90b2NvbC5UeXBlLAorICAgICAgICAgICAgICBwcm9jZXNzb3I6IFByb2Nlc3Nvci5UeXBlKSB0aHJvd3MgeworICAgIC8vIHNldCBzZXJ2aWNlIGhhbmRsZXIKKyAgICBzZWxmLnNlcnZpY2VIYW5kbGVyID0gc2VydmljZQorCisgICAgLy8gY3JlYXRlIGEgc29ja2V0CisgICAgdmFyIGZkOiBJbnQzMiA9IC0xCisgICAgI2lmIG9zKExpbnV4KQorICAgICAgbGV0IHNvY2sgPSBDRlNvY2tldENyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBQRl9JTkVULCBJbnQzMihTT0NLX1NUUkVBTS5yYXdWYWx1ZSksIEludDMyKElQUFJPVE9fVENQKSwgMCwgbmlsLCBuaWwpCisgICAgI2Vsc2UKKyAgICAgIGxldCBzb2NrID0gQ0ZTb2NrZXRDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQLCAwLCBuaWwsIG5pbCkKKyAgICAjZW5kaWYKKyAgICBpZiBzb2NrICE9IG5pbCB7CisgICAgICBDRlNvY2tldFNldFNvY2tldEZsYWdzKHNvY2ssIENGU29ja2V0R2V0U29ja2V0RmxhZ3Moc29jaykgJiB+a0NGU29ja2V0Q2xvc2VPbkludmFsaWRhdGUpCisKKyAgICAgIGZkID0gQ0ZTb2NrZXRHZXROYXRpdmUoc29jaykKKyAgICAgIHZhciB5ZXMgPSAxCisgICAgICBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZ5ZXMsIFVJbnQzMihNZW1vcnlMYXlvdXQ8SW50Pi5zaXplKSkKKworICAgICAgI2lmIG9zKExpbnV4KQorICAgICAgICB2YXIgYWRkciA9IHNvY2thZGRyX2luKHNpbl9mYW1pbHk6IHNhX2ZhbWlseV90KEFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9wb3J0OiBpbl9wb3J0X3QocG9ydC5iaWdFbmRpYW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9hZGRyOiBpbl9hZGRyKHNfYWRkcjogaW5fYWRkcl90KDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5femVybzogKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApKQorICAgICAgI2Vsc2UKKyAgICAgICAgdmFyIGFkZHIgPSBzb2NrYWRkcl9pbihzaW5fbGVuOiBVSW50OChNZW1vcnlMYXlvdXQ8c29ja2FkZHJfaW4+LnNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9mYW1pbHk6IHNhX2ZhbWlseV90KEFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9wb3J0OiBpbl9wb3J0X3QocG9ydC5iaWdFbmRpYW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9hZGRyOiBpbl9hZGRyKHNfYWRkcjogaW5fYWRkcl90KDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5femVybzogKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApKQorICAgICAgI2VuZGlmCisKKyAgICAgIGxldCBwdHIgPSB3aXRoVW5zYWZlUG9pbnRlcih0bzogJmFkZHIpIHsKKyAgICAgICAgcmV0dXJuIFVuc2FmZVBvaW50ZXI8VUludDg+KE9wYXF1ZVBvaW50ZXIoJDApKQorICAgICAgfQorCisgICAgICBsZXQgYWRkcmVzcyA9IERhdGEoYnl0ZXM6IHB0ciwgY291bnQ6IE1lbW9yeUxheW91dDxzb2NrYWRkcl9pbj4uc2l6ZSkKKworICAgICAgbGV0IGNmYWRkciA9IGFkZHJlc3Mud2l0aFVuc2FmZUJ5dGVzIHsKKyAgICAgICAgQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5KGtDRkFsbG9jYXRvckRlZmF1bHQsICQwLCBhZGRyZXNzLmNvdW50LCBuaWwpCisgICAgICB9CisgICAgICBpZiBDRlNvY2tldFNldEFkZHJlc3Moc29jaywgY2ZhZGRyKSAhPSBDRlNvY2tldEVycm9yLnN1Y2Nlc3MgeyAvL2tDRlNvY2tldFN1Y2Nlc3MgeworICAgICAgICBDRlNvY2tldEludmFsaWRhdGUoc29jaykKKyAgICAgICAgcHJpbnQoIlRTb2NrZXRTZXJ2ZXI6IENvdWxkIG5vdCBiaW5kIHRvIGFkZHJlc3MiKQorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5ub3RPcGVuLCBtZXNzYWdlOiAiQ291bGQgbm90IGJpbmQgdG8gYWRkcmVzcyIpCisgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnQoIlRTb2NrZXRTZXJ2ZXI6IE5vIHNlcnZlciBzb2NrZXQiKQorICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAubm90T3BlbiwgbWVzc2FnZTogIkNvdWxkIG5vdCBjcmVhdGUgc29ja2V0IikKKyAgICB9CisKKyAgICAvLyB3cmFwIGl0IGluIGEgZmlsZSBoYW5kbGUgc28gd2UgY2FuIGdldCBtZXNzYWdlcyBmcm9tIGl0CisgICAgc29ja2V0RmlsZUhhbmRsZSA9IEZpbGVIYW5kbGUoZmlsZURlc2NyaXB0b3I6IGZkLCBjbG9zZU9uRGVhbGxvYzogdHJ1ZSkKKworICAgIC8vIHRocm93IGF3YXkgb3VyIHNvY2tldAorICAgIENGU29ja2V0SW52YWxpZGF0ZShzb2NrKQorCisgICAgLy8gcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnMgb2YgYWNjZXB0ZWQgaW5jb21pbmcgY29ubmVjdGlvbnMKKyAgICBfID0gTm90aWZpY2F0aW9uQ2VudGVyLmRlZmF1bHQuYWRkT2JzZXJ2ZXIoZm9yTmFtZTogLk5TRmlsZUhhbmRsZUNvbm5lY3Rpb25BY2NlcHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0OiBuaWwsIHF1ZXVlOiBuaWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt3ZWFrIHNlbGZdIG5vdGlmaWNhdGlvbiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VhcmQgbGV0IHN0cm9uZ1NlbGYgPSBzZWxmIGVsc2UgeyByZXR1cm4gfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb25nU2VsZi5jb25uZWN0aW9uQWNjZXB0ZWQoc3Ryb25nU2VsZi5zb2NrZXRGaWxlSGFuZGxlKQorCisgICAgfQorCisgICAgLy8gdGVsbCBzb2NrZXQgdG8gbGlzdGVuCisgICAgc29ja2V0RmlsZUhhbmRsZS5hY2NlcHRDb25uZWN0aW9uSW5CYWNrZ3JvdW5kQW5kTm90aWZ5KCkKKworICAgIHByaW50KCJUU29ja2V0U2VydmVyOiBMaXN0ZW5pbmcgb24gVENQIHBvcnQgXChwb3J0KSIpCisgIH0KKworICBkZWluaXQgeworICAgIE5vdGlmaWNhdGlvbkNlbnRlci5kZWZhdWx0LnJlbW92ZU9ic2VydmVyKHNlbGYpCisgIH0KKworICBmdW5jIGNvbm5lY3Rpb25BY2NlcHRlZChfIHNvY2tldDogRmlsZUhhbmRsZSkgeworICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSBjbGllbnQgY29ubmVjdGVkLCBoYW5kbGUgdGhlIHJlcXVlc3Qgb24gcXVldWUKKyAgICBwcm9jZXNzaW5nUXVldWUuYXN5bmMgeworICAgICAgc2VsZi5oYW5kbGVDbGllbnRDb25uZWN0aW9uKHNvY2tldCkKKyAgICB9CisgIH0KKworICBmdW5jIGhhbmRsZUNsaWVudENvbm5lY3Rpb24oXyBjbGllbnRTb2NrZXQ6IEZpbGVIYW5kbGUpIHsKKworICAgIGxldCB0cmFuc3BvcnQgPSBURmlsZUhhbmRsZVRyYW5zcG9ydChmaWxlSGFuZGxlOiBjbGllbnRTb2NrZXQpCisgICAgbGV0IHByb2Nlc3NvciA9IFByb2Nlc3NvcihzZXJ2aWNlOiBzZXJ2aWNlSGFuZGxlcikKKworICAgIGxldCBpblByb3RvY29sID0gSW5Qcm90b2NvbChvbjogdHJhbnNwb3J0KQorICAgIGxldCBvdXRQcm90b2NvbCA9IE91dFByb3RvY29sKG9uOiB0cmFuc3BvcnQpCisKKyAgICBkbyB7CisgICAgICB0cnkgcHJvY2Vzc29yLnByb2Nlc3Mob246IGluUHJvdG9jb2wsIG91dFByb3RvY29sOiBvdXRQcm90b2NvbCkKKyAgICB9IGNhdGNoIGxldCBlcnJvciB7CisgICAgICBwcmludCgiRXJyb3IgcHJvY2Vzc2lnbiByZXF1ZXN0OiBcKGVycm9yKSIpCisgICAgfQorICAgIERpc3BhdGNoUXVldWUubWFpbi5hc3luYyB7CisgICAgICBOb3RpZmljYXRpb25DZW50ZXIuZGVmYXVsdAorICAgICAgICAucG9zdChuYW1lOiBOb3RpZmljYXRpb24uTmFtZShyYXdWYWx1ZTogVFNvY2tldFNlcnZlckNsaWVudENvbm5lY3Rpb25GaW5pc2hlZCksCisgICAgICAgICAgICAgIG9iamVjdDogc2VsZiwKKyAgICAgICAgICAgICAgdXNlckluZm86IFtUU29ja2V0U2VydmVyUHJvY2Vzc29yS2V5OiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFNvY2tldFNlcnZlclRyYW5zcG9ydEtleTogdHJhbnNwb3J0XSkKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTb2NrZXRUcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU29ja2V0VHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMTZlMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU29ja2V0VHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsMjEwIEBACisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaWYgb3MoT1NYKSB8fCBvcyhpT1MpIHx8IG9zKHdhdGNoT1MpIHx8IG9zKHR2T1MpCisgIGltcG9ydCBEYXJ3aW4KKyNlbHNlaWYgb3MoTGludXgpIHx8IG9zKEZyZWVCU0QpIHx8IG9zKFBTNCkgfHwgb3MoQW5kcm9pZCkKKyAgaW1wb3J0IEdsaWJjCisgIGltcG9ydCBEaXNwYXRjaAorI2VuZGlmCisKK2ltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgQ29yZUZvdW5kYXRpb24KKworcHJpdmF0ZSBzdHJ1Y3QgU3lzIHsKKyAgI2lmIG9zKExpbnV4KQorICBzdGF0aWMgbGV0IHJlYWQgPSBHbGliYy5yZWFkCisgIHN0YXRpYyBsZXQgd3JpdGUgPSBHbGliYy53cml0ZQorICBzdGF0aWMgbGV0IGNsb3NlID0gR2xpYmMuY2xvc2UKKyAgI2Vsc2UKKyAgc3RhdGljIGxldCByZWFkID0gRGFyd2luLnJlYWQKKyAgc3RhdGljIGxldCB3cml0ZSA9IERhcndpbi53cml0ZQorICBzdGF0aWMgbGV0IGNsb3NlID0gRGFyd2luLmNsb3NlCisgICNlbmRpZgorfQorCitleHRlbnNpb24gaW5fYWRkciB7CisgIHB1YmxpYyBpbml0Pyhob3N0ZW50OiBob3N0ZW50PykgeworICAgIGd1YXJkIGxldCBob3N0ID0gaG9zdGVudCwgaG9zdC5oX2FkZHJfbGlzdCAhPSBuaWwsIGhvc3QuaF9hZGRyX2xpc3QucG9pbnRlZSAhPSBuaWwgZWxzZSB7CisgICAgICByZXR1cm4gbmlsCisgICAgfQorICAgIHNlbGYuaW5pdCgpCisgICAgbWVtY3B5KCZzZWxmLCBob3N0LmhfYWRkcl9saXN0LnBvaW50ZWUhLCBJbnQoaG9zdC5oX2xlbmd0aCkpCisgICAgCisgIH0KK30KKworCisjaWYgb3MoTGludXgpCisgIC8vLyBUQ0ZTb2NrZXRUcmFuc3BvcnQgY3VycmVudGx5IHVuYXZhaWxhYmxlCisgIC8vLyByZW1vdmUgY29tbWVudHMgYW5kIGJ1aWxkIHRvIHNlZSB3aHkvZml4CisgIC8vLyBjdXJyZW50bHkgQ0ZbUmVhZHxXcml0ZV1TdHJlYW0ncyBjYW4ndCBjYXN0IHRvIFtJbnB1dHxPdXRwdXRdU3RyZWFtcyB3aGljaCBicmVha3MgdGhpZ25zCisjZWxzZQorZXh0ZW5zaW9uIFN0cmVhbS5Qcm9wZXJ0eUtleSB7CisgIHN0YXRpYyBsZXQgU1NMUGVlclRydXN0ID0gU3RyZWFtLlByb3BlcnR5S2V5KGtDRlN0cmVhbVByb3BlcnR5U1NMUGVlclRydXN0IGFzIFN0cmluZykKK30KKworLy8vIFRDRlNvY2tldFRyYW5zcG9ydCwgdXNlcyBDRlNvY2tldHMgYW5kIChOUylTdHJlYW0ncworcHVibGljIGNsYXNzIFRDRlNvY2tldFRyYW5zcG9ydDogVFN0cmVhbVRyYW5zcG9ydCB7CisgICAgcHVibGljIGluaXQ/KGhvc3RuYW1lOiBTdHJpbmcsIHBvcnQ6IEludCwgc2VjdXJlOiBCb29sID0gZmFsc2UpIHsKKyAgICAKKyAgICB2YXIgaW5wdXRTdHJlYW06IElucHV0U3RyZWFtCisgICAgdmFyIG91dHB1dFN0cmVhbTogT3V0cHV0U3RyZWFtCisgICAgCisgICAgdmFyIHJlYWRTdHJlYW06ICBVbm1hbmFnZWQ8Q0ZSZWFkU3RyZWFtPj8KKyAgICB2YXIgd3JpdGVTdHJlYW06ICBVbm1hbmFnZWQ8Q0ZXcml0ZVN0cmVhbT4/CisgICAgQ0ZTdHJlYW1DcmVhdGVQYWlyV2l0aFNvY2tldFRvSG9zdChrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdG5hbWUgYXMgQ0ZTdHJpbmchLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyKHBvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd3JpdGVTdHJlYW0pCisgICAgCisgICAgaWYgbGV0IHJlYWRTdHJlYW0gPSByZWFkU3RyZWFtPy50YWtlUmV0YWluZWRWYWx1ZSgpLAorICAgICAgbGV0IHdyaXRlU3RyZWFtID0gd3JpdGVTdHJlYW0/LnRha2VSZXRhaW5lZFZhbHVlKCkgeworICAgICAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtLCAuc2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKQorICAgICAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkod3JpdGVTdHJlYW0sIC5zaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpCisgICAgICAKKyAgICAgICAgaWYgc2VjdXJlIHsKKyAgICAgICAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0sIC5zb2NrZXRTZWN1cml0eUxldmVsLCBTdHJlYW1Tb2NrZXRTZWN1cml0eUxldmVsLm5lZ290aWF0ZWRTU0wucmF3VmFsdWUgYXMgQ0ZTdHJpbmcpCisgICAgICAgICAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkod3JpdGVTdHJlYW0sIC5zb2NrZXRTZWN1cml0eUxldmVsLCBTdHJlYW1Tb2NrZXRTZWN1cml0eUxldmVsLm5lZ290aWF0ZWRTU0wucmF3VmFsdWUgYXMgQ0ZTdHJpbmcpCisgICAgICAgIH0KKworICAgICAgaW5wdXRTdHJlYW0gPSByZWFkU3RyZWFtIGFzIElucHV0U3RyZWFtCisgICAgICBpbnB1dFN0cmVhbS5zY2hlZHVsZShpbjogLmN1cnJlbnQsIGZvck1vZGU6IC5kZWZhdWx0UnVuTG9vcE1vZGUpCisgICAgICBpbnB1dFN0cmVhbS5vcGVuKCkKKyAgICAgIAorICAgICAgb3V0cHV0U3RyZWFtID0gd3JpdGVTdHJlYW0gYXMgT3V0cHV0U3RyZWFtCisgICAgICBvdXRwdXRTdHJlYW0uc2NoZWR1bGUoaW46IC5jdXJyZW50LCBmb3JNb2RlOiAuZGVmYXVsdFJ1bkxvb3BNb2RlKQorICAgICAgb3V0cHV0U3RyZWFtLm9wZW4oKQorICAgICAgCisgICAgfSBlbHNlIHsKKyAgICAgIAorICAgICAgaWYgcmVhZFN0cmVhbSAhPSBuaWwgeworICAgICAgICByZWFkU3RyZWFtPy5yZWxlYXNlKCkKKyAgICAgIH0KKyAgICAgIGlmIHdyaXRlU3RyZWFtICE9IG5pbCB7CisgICAgICAgIHdyaXRlU3RyZWFtPy5yZWxlYXNlKCkKKyAgICAgIH0KKyAgICAgIHN1cGVyLmluaXQoaW5wdXRTdHJlYW06IG5pbCwgb3V0cHV0U3RyZWFtOiBuaWwpCisgICAgICByZXR1cm4gbmlsCisgICAgfQorICAgIAorICAgIHN1cGVyLmluaXQoaW5wdXRTdHJlYW06IGlucHV0U3RyZWFtLCBvdXRwdXRTdHJlYW06IG91dHB1dFN0cmVhbSkKKyAgICAKKyAgICBzZWxmLmlucHV0Py5kZWxlZ2F0ZSA9IHNlbGYKKyAgICBzZWxmLm91dHB1dD8uZGVsZWdhdGUgPSBzZWxmCisgIH0KK30KKworZXh0ZW5zaW9uIFRDRlNvY2tldFRyYW5zcG9ydDogU3RyZWFtRGVsZWdhdGUgeyB9CisjZW5kaWYKKworCisvLy8gVFNvY2tldFRyYW5zcG9ydCwgcG9zaXggc29ja2V0cy4gIFN1cHBvcnRzIElQdjQgb25seSBmb3Igbm93CitwdWJsaWMgY2xhc3MgVFNvY2tldFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQgeworICBwdWJsaWMgdmFyIHNvY2tldERlc2NyaXB0b3I6IEludDMyCisgIAorICAKKyAgCisgIC8vLyBJbml0aWFsaXplIGZyb20gYW4gYWxyZWFkeSBzZXQgdXAgc29ja2V0RGVzY3JpcHRvci4KKyAgLy8vIEV4cGVjdHMgc29ja2V0IHRoYXRzIGFscmVhZHkgYm91bmQvY29ubmVjdGVkIChpLmUuIGZyb20gbGlzdGVuaW5nKQorICAvLy8KKyAgLy8vIC0gcGFyYW1ldGVyIHNvY2tldERlc2NyaXB0b3I6IHBvc2l4IHNvY2tldCBkZXNjcmlwdG9yIChJbnQzMikKKyAgcHVibGljIGluaXQoc29ja2V0RGVzY3JpcHRvcjogSW50MzIpIHsKKyAgICBzZWxmLnNvY2tldERlc2NyaXB0b3IgPSBzb2NrZXREZXNjcmlwdG9yCisgIH0KKyAgCisgIAorICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdChob3N0bmFtZTogU3RyaW5nLCBwb3J0OiBJbnQpIHRocm93cyB7CisgICAgZ3VhcmQgbGV0IGhwID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZS5jU3RyaW5nKHVzaW5nOiAudXRmOCkhKT8ucG9pbnRlZSwKKyAgICAgIGxldCBob3N0QWRkciA9IGluX2FkZHIoaG9zdGVudDogaHApIGVsc2UgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC51bmtub3duLCBtZXNzYWdlOiAiSW52YWxpZCBhZGRyZXNzOiBcKGhvc3RuYW1lKSIpCisgICAgfQorICAgIAorICAgIAorICAgIAorICAgICNpZiBvcyhMaW51eCkKKyAgICAgIGxldCBzb2NrID0gc29ja2V0KEFGX0lORVQsIEludDMyKFNPQ0tfU1RSRUFNLnJhd1ZhbHVlKSwgMCkKKyAgICAgIHZhciBhZGRyID0gc29ja2FkZHJfaW4oc2luX2ZhbWlseTogc2FfZmFtaWx5X3QoQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9wb3J0OiBpbl9wb3J0X3QoaHRvbnMoVUludDE2KHBvcnQpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9hZGRyOiBob3N0QWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX3plcm86ICgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKSkKKyAgICAjZWxzZQorICAgICAgbGV0IHNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApCisgICAgICAKKyAgICAgIHZhciBhZGRyID0gc29ja2FkZHJfaW4oc2luX2xlbjogVUludDgoTWVtb3J5TGF5b3V0PHNvY2thZGRyX2luPi5zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX2ZhbWlseTogc2FfZmFtaWx5X3QoQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9wb3J0OiBpbl9wb3J0X3QoaHRvbnMoVUludDE2KHBvcnQpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9hZGRyOiBpbl9hZGRyKHNfYWRkcjogaW5fYWRkcl90KDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX3plcm86ICgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKSkKKyAgICAgIAorICAgICNlbmRpZgorICAgIAorICAgIGxldCBhZGRyUHRyID0gd2l0aFVuc2FmZVBvaW50ZXIodG86ICZhZGRyKXsgVW5zYWZlUG9pbnRlcjxzb2NrYWRkcj4oT3BhcXVlUG9pbnRlcigkMCkpIH0KKyAgICAKKyAgICBsZXQgY29ubmVjdGVkID0gY29ubmVjdChzb2NrLCBhZGRyUHRyLCBVSW50MzIoTWVtb3J5TGF5b3V0PHNvY2thZGRyX2luPi5zaXplKSkKKyAgICBpZiBjb25uZWN0ZWQgIT0gMCB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5ub3RPcGVuLCBtZXNzYWdlOiAiRXJyb3IgYmluZGluZyB0byBob3N0OiBcKGhvc3RuYW1lKSBcKHBvcnQpIikKKyAgICB9CisgICAgCisgICAgc2VsZi5pbml0KHNvY2tldERlc2NyaXB0b3I6IHNvY2spCisgIH0KKyAgCisgIGRlaW5pdCB7CisgICAgY2xvc2UoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkQWxsKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIHZhciBvdXQgPSBEYXRhKCkKKyAgICB3aGlsZSBvdXQuY291bnQgPCBzaXplIHsKKyAgICAgIG91dC5hcHBlbmQodHJ5IHNlbGYucmVhZChzaXplOiBzaXplKSkKKyAgICB9CisgICAgcmV0dXJuIG91dAorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIHZhciBidWZmID0gQXJyYXk8VUludDg+LmluaXQocmVwZWF0aW5nOiAwLCBjb3VudDogc2l6ZSkKKyAgICBsZXQgcmVhZEJ5dGVzID0gU3lzLnJlYWQoc29ja2V0RGVzY3JpcHRvciwgJmJ1ZmYsIHNpemUpCisgICAgCisgICAgcmV0dXJuIERhdGEoYnl0ZXM6IGJ1ZmZbMC4uPHJlYWRCeXRlc10pCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHsKKyAgICB2YXIgYnl0ZXNUb1dyaXRlID0gZGF0YS5jb3VudAorICAgIHZhciB3cml0ZUJ1ZmZlciA9IGRhdGEKKyAgICB3aGlsZSBieXRlc1RvV3JpdGUgPiAwIHsKKyAgICAgIGxldCB3cml0dGVuID0gd3JpdGVCdWZmZXIud2l0aFVuc2FmZUJ5dGVzIHsKKyAgICAgICAgU3lzLndyaXRlKHNvY2tldERlc2NyaXB0b3IsICQwLCB3cml0ZUJ1ZmZlci5jb3VudCkKKyAgICAgIH0KKyAgICAgIHdyaXRlQnVmZmVyID0gd3JpdGVCdWZmZXIuc3ViZGF0YShpbjogd3JpdHRlbiAuLjwgd3JpdGVCdWZmZXIuY291bnQpCisgICAgICBieXRlc1RvV3JpdGUgLT0gd3JpdHRlbgorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZmx1c2goKSB0aHJvd3MgeworICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgY2xvc2UoKSB7CisgICAgc2h1dGRvd24oc29ja2V0RGVzY3JpcHRvciwgSW50MzIoU0hVVF9SRFdSKSkKKyAgICBfID0gU3lzLmNsb3NlKHNvY2tldERlc2NyaXB0b3IpCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTdHJlYW1UcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU3RyZWFtVHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YmMxYjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU3RyZWFtVHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgQ29yZUZvdW5kYXRpb24KKworI2lmIG9zKExpbnV4KQorICAvLy8gQ3VycmVudGx5IHVuYXZhaWxhYmxlIGluIExpbnV4CisgIC8vLyBSZW1vdmUgY29tbWVudHMgYW5kIGJ1aWxkIHRvIGZpeAorICAvLy8gQ3VycmVudGx5IGtDb25zdGFudHMgZm9yIENGU29ja2V0cyBkb24ndCBleGlzdCBpbiBsaW51eCBhbmQgbm90IGFsbCBoYXZlIGJlZW4gbW92ZWQKKyAgLy8vIHRvIHByb3BlcnR5IHN0cnVjdHMgeWV0CisjZWxzZQorICAvLyBNdXN0IGluaGVyaXQgTlNPYmplY3QgZm9yIE5TU3RyZWFtRGVsZWdhdGUgY29uZm9ybWFuY2UKKyAgcHVibGljIGNsYXNzIFRTdHJlYW1UcmFuc3BvcnQgOiBOU09iamVjdCwgVFRyYW5zcG9ydCB7CisgICAgcHVibGljIHZhciBpbnB1dDogSW5wdXRTdHJlYW0/ID0gbmlsCisgICAgcHVibGljIHZhciBvdXRwdXQ6IE91dHB1dFN0cmVhbT8gPSBuaWwKKyAgICAKKyAgICBwdWJsaWMgaW5pdChpbnB1dFN0cmVhbTogSW5wdXRTdHJlYW0/LCBvdXRwdXRTdHJlYW06IE91dHB1dFN0cmVhbT8pIHsKKyAgICAgIGlucHV0ICAgPSBpbnB1dFN0cmVhbQorICAgICAgb3V0cHV0ICA9IG91dHB1dFN0cmVhbQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdChpbnB1dFN0cmVhbTogSW5wdXRTdHJlYW0/KSB7CisgICAgICBzZWxmLmluaXQoaW5wdXRTdHJlYW06IGlucHV0U3RyZWFtLCBvdXRwdXRTdHJlYW06IG5pbCkKKyAgICB9CisgICAgCisgICAgcHVibGljIGNvbnZlbmllbmNlIGluaXQob3V0cHV0U3RyZWFtOiBPdXRwdXRTdHJlYW0/KSB7CisgICAgICBzZWxmLmluaXQoaW5wdXRTdHJlYW06IG5pbCwgb3V0cHV0U3RyZWFtOiBvdXRwdXRTdHJlYW0pCisgICAgfQorICAgIAorICAgIGRlaW5pdCB7CisgICAgICBjbG9zZSgpCisgICAgfQorICAgIAorICAgIHB1YmxpYyBmdW5jIHJlYWRBbGwoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgICBndWFyZCBsZXQgaW5wdXQgPSBpbnB1dCBlbHNlIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAudW5rbm93bikKKyAgICAgIH0KKyAgICAgIAorICAgICAgdmFyIHJlYWQgPSBEYXRhKCkKKyAgICAgIHdoaWxlIHJlYWQuY291bnQgPCBzaXplIHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IEFycmF5PFVJbnQ4PihyZXBlYXRpbmc6IDAsIGNvdW50OiBzaXplIC0gcmVhZC5jb3VudCkKKyAgICAgICAgCisgICAgICAgIGxldCBieXRlc1JlYWQgPSBidWZmZXIud2l0aFVuc2FmZU11dGFibGVCdWZmZXJQb2ludGVyIHsgYnVmZmVyUHRyIGluCisgICAgICAgICAgcmV0dXJuIGlucHV0LnJlYWQoYnVmZmVyUHRyLmJhc2VBZGRyZXNzISwgbWF4TGVuZ3RoOiBzaXplIC0gcmVhZC5jb3VudCkKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgYnl0ZXNSZWFkIDw9IDAgeworICAgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLm5vdE9wZW4pCisgICAgICAgIH0KKyAgICAgICAgcmVhZC5hcHBlbmQoRGF0YShieXRlczogYnVmZmVyKSkKKyAgICAgIH0KKyAgICAgIHJldHVybiByZWFkCisgICAgfQorICAgIAorICAgIHB1YmxpYyBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgICBndWFyZCBsZXQgaW5wdXQgPSBpbnB1dCBlbHNlIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAudW5rbm93bikKKyAgICAgIH0KKyAgICAgIAorICAgICAgdmFyIHJlYWQgPSBEYXRhKCkKKyAgICAgIHdoaWxlIHJlYWQuY291bnQgPCBzaXplIHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IEFycmF5PFVJbnQ4PihyZXBlYXRpbmc6IDAsIGNvdW50OiBzaXplIC0gcmVhZC5jb3VudCkKKyAgICAgICAgbGV0IGJ5dGVzUmVhZCA9IGJ1ZmZlci53aXRoVW5zYWZlTXV0YWJsZUJ1ZmZlclBvaW50ZXIgeworICAgICAgICAgIGlucHV0LnJlYWQoJDAuYmFzZUFkZHJlc3MhLCBtYXhMZW5ndGg6IHNpemUgLSByZWFkLmNvdW50KQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiBieXRlc1JlYWQgPD0gMCB7CisgICAgICAgICAgYnJlYWsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmVhZC5hcHBlbmQoRGF0YShieXRlczogYnVmZmVyKSkKKyAgICAgIH0KKyAgICAgIHJldHVybiByZWFkCisgICAgfQorICAgIAorICAgIHB1YmxpYyBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgICBndWFyZCBsZXQgb3V0cHV0ID0gb3V0cHV0IGVsc2UgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC51bmtub3duKQorICAgICAgfQorICAgICAgCisgICAgICB2YXIgYnl0ZXNXcml0dGVuID0gMAorICAgICAgd2hpbGUgYnl0ZXNXcml0dGVuIDwgZGF0YS5jb3VudCB7CisgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGRhdGEud2l0aFVuc2FmZUJ5dGVzIHsKKyAgICAgICAgICByZXR1cm4gb3V0cHV0LndyaXRlKCQwLCBtYXhMZW5ndGg6IGRhdGEuY291bnQpCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIGJ5dGVzV3JpdHRlbiA9PSAtMSB7CisgICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAubm90T3BlbikKKyAgICAgICAgfSBlbHNlIGlmIGJ5dGVzV3JpdHRlbiA9PSAwIHsKKyAgICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5lbmRPZkZpbGUpCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgcHVibGljIGZ1bmMgZmx1c2goKSB0aHJvd3MgeworICAgICAgcmV0dXJuCisgICAgfQorICAgIAorICAgIHB1YmxpYyBmdW5jIGNsb3NlKCkgeworICAgICAgCisgICAgICBpZiBpbnB1dCAhPSBuaWwgeworICAgICAgICAvLyBDbG9zZSBhbmQgcmVzZXQgaW5wdXRzdHJlYW0KKyAgICAgICAgaWYgbGV0IGNmOiBDRlJlYWRTdHJlYW0gPSBpbnB1dCB7CisgICAgICAgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkoY2YsIC5zaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlucHV0Py5kZWxlZ2F0ZSA9IG5pbAorICAgICAgICBpbnB1dD8uY2xvc2UoKQorICAgICAgICBpbnB1dD8ucmVtb3ZlKGZyb206IC5jdXJyZW50LCBmb3JNb2RlOiAuZGVmYXVsdFJ1bkxvb3BNb2RlKQorICAgICAgICBpbnB1dCA9IG5pbAorICAgICAgfQorICAgICAgCisgICAgICBpZiBvdXRwdXQgIT0gbmlsIHsKKyAgICAgICAgLy8gQ2xvc2UgYW5kIHJlc2V0IG91dHB1dCBzdHJlYW0KKyAgICAgICAgaWYgbGV0IGNmOiBDRldyaXRlU3RyZWFtID0gb3V0cHV0IHsKKyAgICAgICAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkoY2YsIC5zaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpCisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0Py5kZWxlZ2F0ZSA9IG5pbAorICAgICAgICBvdXRwdXQ/LmNsb3NlKCkKKyAgICAgICAgb3V0cHV0Py5yZW1vdmUoZnJvbTogLmN1cnJlbnQsIGZvck1vZGU6IC5kZWZhdWx0UnVuTG9vcE1vZGUpCisgICAgICAgIG91dHB1dCA9IG5pbAorICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UU3RydWN0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFN0cnVjdC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTcyYTMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFN0cnVjdC5zd2lmdApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8vLyBQcm90b2NvbCBmb3IgR2VuZXJhdGVkIFN0cnVjdHMgdG8gY29uZm9ybSB0bworLy8vIERpY3Rpb25hcnkgbWFwcyBmaWVsZCBuYW1lcyB0byBpbnRlcm5hbCBJRHMgYW5kIHVzZXMgUmVmbGVjdGlvbgorLy8vIHRvIGl0ZXJhdGUgdGhyb3VnaCBhbGwgZmllbGRzLiAgCisvLy8gYHdyaXRlRmllbGRWYWx1ZShfOm5hbWU6dHlwZTppZDopYCBjYWxscyBgVFNlcmlhbGl6YWJsZS53cml0ZSh0bzopYCBpbnRlcm5hbGx5CisvLy8gZ2l2aW5nIGEgbmljZSByZWN1cnNpdmUgYmVoYXZpb3IgZm9yIG5lc3RlZCBUU3RydWN0cywgVExpc3RzLCBUTWFwcywgYW5kIFRTZXRzCitwdWJsaWMgcHJvdG9jb2wgVFN0cnVjdCA6IFRTZXJpYWxpemFibGUgeworICBzdGF0aWMgdmFyIGZpZWxkSWRzOiBbU3RyaW5nOiBJbnQzMl0geyBnZXQgfQorICBzdGF0aWMgdmFyIHN0cnVjdE5hbWU6IFN0cmluZyB7IGdldCB9Cit9CisKK3B1YmxpYyBleHRlbnNpb24gVFN0cnVjdCB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIGZpZWxkSWRzOiBbU3RyaW5nOiAoaWQ6IEludDMyLCB0eXBlOiBUVHlwZSldIHsgcmV0dXJuIFs6XSB9CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5zdHJ1Y3QgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICAvLyBXcml0ZSBzdHJ1Y3QgbmFtZSBmaXJzdAorICAgIHRyeSBwcm90by53cml0ZVN0cnVjdEJlZ2luKG5hbWU6IFNlbGYuc3RydWN0TmFtZSkKKyAgICAKKyAgICB0cnkgc2VsZi5mb3JFYWNoIHsgbmFtZSwgdmFsdWUsIGlkIGluCisgICAgICAvLyBXcml0ZSB0byBwcm90b2NvbAorICAgICAgdHJ5IHByb3RvLndyaXRlRmllbGRWYWx1ZSh2YWx1ZSwgbmFtZTogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdmFsdWUudGhyaWZ0VHlwZSwgaWQ6IGlkKQorICAgIH0KKyAgICB0cnkgcHJvdG8ud3JpdGVGaWVsZFN0b3AoKQorICAgIHRyeSBwcm90by53cml0ZVN0cnVjdEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlOiBJbnQgeworICAgIGxldCBwcmltZSA9IDMxCisgICAgdmFyIHJlc3VsdCA9IDEKKyAgICBzZWxmLmZvckVhY2ggeyBfLCB2YWx1ZSwgXyBpbgorICAgICAgcmVzdWx0ID0gcHJpbWUgJiogcmVzdWx0ICYrICh2YWx1ZS5oYXNoVmFsdWUpCisgICAgfQorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgLy8vIFByb3ZpZGVzIGEgYmxvY2sgZm9yIGhhbmRsaW5nIGVhY2ggKGF2YWlsYWJsZSkgdGhyaWZ0IHByb3BlcnR5IHVzaW5nIHJlZmxlY3Rpb24KKyAgLy8vIENhdmVhdDogU2tpcHMgb3ZlciBvcHRpb25hbCB2YWx1ZXMKKyAgCisgIAorICAvLy8gUHJvdmlkZXMgYSBibG9jayBmb3IgaGFuZGxpbmcgZWFjaCAoYXZhaWxhYmxlKSB0aHJpZnQgcHJvcGVydHkgdXNpbmcgcmVmbGVjdGlvbgorICAvLy8KKyAgLy8vIC0gcGFyYW1ldGVyIGJsb2NrOiBibG9jayBmb3IgaGFuZGxpbmcgcHJvcGVydHkKKyAgLy8vCisgIC8vLyAtIHRocm93czogcmV0aHJvd3MgYW55IEVycm9yIHRocm93biBpbiBibG9jaworICBwcml2YXRlIGZ1bmMgZm9yRWFjaChfIGJsb2NrOiAoXyBuYW1lOiBTdHJpbmcsIF8gdmFsdWU6IFRTZXJpYWxpemFibGUsIF8gaWQ6IEludDMyKSB0aHJvd3MgLT4gVm9pZCkgcmV0aHJvd3MgeworICAgIC8vIE1pcnJvciB0aGUgb2JqZWN0LCBnZXR0aW5nIChuYW1lOiBTdHJpbmc/LCB2YWx1ZTogQW55KSBmb3IgZXZlcnkgcHJvcGVydHkKKyAgICBsZXQgbWlycm9yID0gTWlycm9yKHJlZmxlY3Rpbmc6IHNlbGYpCisgICAgCisgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBjaGlsZHJlbiwgaWdub3JlIGVtcHR5IHByb3BlcnR5IG5hbWVzCisgICAgZm9yIChwcm9wTmFtZSwgcHJvcFZhbHVlKSBpbiBtaXJyb3IuY2hpbGRyZW4geworICAgICAgZ3VhcmQgbGV0IHByb3BOYW1lID0gcHJvcE5hbWUgZWxzZSB7IGNvbnRpbnVlIH0KKworICAgICAgaWYgbGV0IHR2YWwgPSB1bndyYXAoYW55OiBwcm9wVmFsdWUpIGFzPyBUU2VyaWFsaXphYmxlLCBsZXQgaWQgPSBTZWxmLmZpZWxkSWRzW3Byb3BOYW1lXSB7CisgICAgICAgIHRyeSBibG9jayhwcm9wTmFtZSwgdHZhbCwgaWQpCisgICAgICB9CisgICAgfQorICB9CisgIAorICAKKyAgLy8vIEFueSBjYW4gbXlzdGVyaW91c2x5IGJlIGFuIE9wdGlvbmFsPEFueT4gYXQgdGhlIHNhbWUgdGltZSwKKyAgLy8vIHRoaXMgY2hlY2tzIGFuZCBhbHdheXMgcmV0dXJucyBPcHRpb25hbDxBbnk+IHdpdGhvdXQgZG91YmxlIHdyYXBwaW5nCisgIC8vLyB3ZSB0aGVuIHRyeSB0byBiaW5kIHZhbHVlIGFzIFRTZXJpYWxpemFibGUgdG8gaWdub3JlIGFueSBleHRlbnNpb24gcHJvcGVydGllcworICAvLy8gYW5kIHRoZSBsaWtlIGFuZCB2ZXJpZnkgdGhlIHByb3BlcnR5IGV4aXN0cyBhbmQgZ3JhYiB0aGUgVGhyaWZ0CisgIC8vLyBwcm9wZXJ0eSBJRCBhdCB0aGUgc2FtZSB0aW1lCisgIC8vLworICAvLy8gLSBwYXJhbWV0ZXIgYW55OiBBbnkgaW5zdGFuY2UgdG8gYXR0ZW1wdCB0byB1bndyYXAKKyAgLy8vCisgIC8vLyAtIHJldHVybnM6IFVud3JhcHBlZCBBbnkgYXMgT3B0aW9uYWw8QW55PgorICBwcml2YXRlIGZ1bmMgdW53cmFwKGFueTogQW55KSAtPiBBbnk/IHsKKyAgICBsZXQgbWkgPSBNaXJyb3IocmVmbGVjdGluZzogYW55KQorICAgIAorICAgIGlmIG1pLmRpc3BsYXlTdHlsZSAhPSAub3B0aW9uYWwgeyByZXR1cm4gYW55IH0KKyAgICBpZiBtaS5jaGlsZHJlbi5jb3VudCA9PSAwIHsgcmV0dXJuIG5pbCB9CisgICAgCisgICAgbGV0IChfLCBzb21lKSA9IG1pLmNoaWxkcmVuLmZpcnN0IQorICAgIHJldHVybiBzb21lCisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RUcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyYmJlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RUcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSw2NCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworcHVibGljIHByb3RvY29sIFRUcmFuc3BvcnQgeworICAKKyAgLy8gUmVxdWlyZWQKKyAgZnVuYyByZWFkKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEKKyAgZnVuYyB3cml0ZShkYXRhOiBEYXRhKSB0aHJvd3MKKyAgZnVuYyBmbHVzaCgpIHRocm93cworCisgIC8vIE9wdGlvbmFsIChkZWZhdWx0IHByb3ZpZGVkKQorICBmdW5jIHJlYWRBbGwoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YQorICBmdW5jIGlzT3BlbigpIHRocm93cyAtPiBCb29sCisgIGZ1bmMgb3BlbigpIHRocm93cworICBmdW5jIGNsb3NlKCkgdGhyb3dzCit9CisKK3B1YmxpYyBleHRlbnNpb24gVFRyYW5zcG9ydCB7CisgIGZ1bmMgaXNPcGVuKCkgdGhyb3dzIC0+IEJvb2wgeyByZXR1cm4gdHJ1ZSB9CisgIGZ1bmMgb3BlbigpIHRocm93cyB7IH0KKyAgZnVuYyBjbG9zZSgpIHRocm93cyB7IH0KKyAgCisgIGZ1bmMgcmVhZEFsbChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIHZhciBoYXZlID0gMAorICAgIHdoaWxlIGhhdmUgPCBzaXplIHsKKyAgICAgIGxldCBjaHVuayA9IHRyeSBzZWxmLnJlYWQoc2l6ZTogc2l6ZSAtIGhhdmUpCisgICAgICBoYXZlICs9IGNodW5rLmNvdW50CisgICAgICBidWZmLmFwcGVuZChjaHVuaykKKyAgICAgIGlmIGNodW5rLmNvdW50ID09IDAgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5lbmRPZkZpbGUpCisgICAgICB9CisgICAgfQorICAgIHJldHVybiBidWZmCisgIH0KK30KKworcHVibGljIHByb3RvY29sIFRBc3luY1RyYW5zcG9ydCA6IFRUcmFuc3BvcnQgeworICAvLyBGYWN0b3J5CisgIGZ1bmMgZmx1c2goXyBjb21wbGV0aW9uOiBAZXNjYXBpbmcgKFRBc3luY1RyYW5zcG9ydCwgRXJyb3I/KSAtPigpKQorfQorCitwdWJsaWMgcHJvdG9jb2wgVEFzeW5jVHJhbnNwb3J0RmFjdG9yeSB7CisgIGFzc29jaWF0ZWR0eXBlIFRyYW5zcG9ydCA6IFRBc3luY1RyYW5zcG9ydAorICBmdW5jIG5ld1RyYW5zcG9ydCgpIC0+IFRyYW5zcG9ydAorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFRyYW5zcG9ydEVycm9yLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFRyYW5zcG9ydEVycm9yLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZDAwNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UVHJhbnNwb3J0RXJyb3Iuc3dpZnQKQEAgLTAsMCArMSw4NiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcHVibGljIHN0cnVjdCBUVHJhbnNwb3J0RXJyb3I6IFRFcnJvciB7CisgIHB1YmxpYyBlbnVtIEVycm9yQ29kZTogVEVycm9yQ29kZSB7CisgICAgY2FzZSB1bmtub3duCisgICAgY2FzZSBub3RPcGVuCisgICAgY2FzZSBhbHJlYWR5T3BlbgorICAgIGNhc2UgdGltZWRPdXQKKyAgICBjYXNlIGVuZE9mRmlsZQorICAgIGNhc2UgbmVnYXRpdmVTaXplCisgICAgY2FzZSBzaXplTGltaXQobGltaXQ6IEludCwgZ290OiBJbnQpCisgICAgCisgICAgcHVibGljIHZhciB0aHJpZnRFcnJvckNvZGU6IEludCB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC51bmtub3duOiAgICAgIHJldHVybiAwCisgICAgICBjYXNlIC5ub3RPcGVuOiAgICAgIHJldHVybiAxCisgICAgICBjYXNlIC5hbHJlYWR5T3BlbjogIHJldHVybiAyCisgICAgICBjYXNlIC50aW1lZE91dDogICAgIHJldHVybiAzCisgICAgICBjYXNlIC5lbmRPZkZpbGU6ICAgIHJldHVybiA0CisgICAgICBjYXNlIC5uZWdhdGl2ZVNpemU6IHJldHVybiA1CisgICAgICBjYXNlIC5zaXplTGltaXQ6ICAgIHJldHVybiA2CisgICAgICB9CisgICAgfQorICAgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb246IFN0cmluZyB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC51bmtub3duOiAgICAgIHJldHVybiAiVW5rbm93biBUVHJhbnNwb3J0RXJyb3IiCisgICAgICBjYXNlIC5ub3RPcGVuOiAgICAgIHJldHVybiAiTm90IE9wZW4iCisgICAgICBjYXNlIC5hbHJlYWR5T3BlbjogIHJldHVybiAiQWxyZWFkeSBPcGVuIgorICAgICAgY2FzZSAudGltZWRPdXQ6ICAgICByZXR1cm4gIlRpbWVkIE91dCIKKyAgICAgIGNhc2UgLmVuZE9mRmlsZTogICAgcmV0dXJuICJFbmQgT2YgRmlsZSIKKyAgICAgIGNhc2UgLm5lZ2F0aXZlU2l6ZTogcmV0dXJuICJOZWdhdGl2ZSBTaXplIgorICAgICAgY2FzZSAuc2l6ZUxpbWl0KGxldCBsaW1pdCwgbGV0IGdvdCk6CisgICAgICAgIHJldHVybiAiTWVzc2FnZSBleGNlZWRzIHNpemUgbGltaXQgb2YgXChsaW1pdCkgKHJlY2VpdmVkOiBcKGdvdCkiCisgICAgICB9CisgICAgfQorICB9CisgIHB1YmxpYyB2YXIgZXJyb3I6IEVycm9yQ29kZSA9IC51bmtub3duCisgIHB1YmxpYyB2YXIgbWVzc2FnZTogU3RyaW5nPyA9IG5pbAorICBwdWJsaWMgc3RhdGljIHZhciBkZWZhdWx0Q2FzZTogRXJyb3JDb2RlIHsgcmV0dXJuIC51bmtub3duIH0KKyAgCisgIHB1YmxpYyBpbml0KCkgeyB9CisKK30KKworLy8vIFRIVFRQVHJhbnNwb3J0RXJyb3IKKy8vLworLy8vIEVycm9yJ3MgdGhyb3duIG9uIEhUVFAgVHJhbnNwb3J0CitwdWJsaWMgc3RydWN0IFRIVFRQVHJhbnNwb3J0RXJyb3I6IFRFcnJvciB7CisgIHB1YmxpYyBlbnVtIEVycm9yQ29kZTogVEVycm9yQ29kZSB7CisgICAgY2FzZSBpbnZhbGlkUmVzcG9uc2UKKyAgICBjYXNlIGludmFsaWRTdGF0dXMoc3RhdHVzQ29kZTogSW50KQorICAgIGNhc2UgYXV0aGVudGljYXRpb24KKyAgICAKKyAgICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uOiBTdHJpbmcgeworICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAuaW52YWxpZFJlc3BvbnNlOiAgICAgICAgICAgICAgICByZXR1cm4gIkludmFsaWQgSFRUUCBSZXNwb25zZSIKKyAgICAgIGNhc2UgLmludmFsaWRTdGF0dXMobGV0IHN0YXR1c0NvZGUpOiAgcmV0dXJuICJJbnZhbGlkIEhUVFAgU3RhdHVzIENvZGUgKFwoc3RhdHVzQ29kZSkpIgorICAgICAgY2FzZSAuYXV0aGVudGljYXRpb246ICAgICAgICAgICAgICAgICByZXR1cm4gIkF1dGhlbnRpY2F0aW9uIEVycm9yIgorICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgdmFyIHRocmlmdEVycm9yQ29kZTogSW50IHsgcmV0dXJuIDAgfQorICB9CisgIHB1YmxpYyB2YXIgZXJyb3I6IEVycm9yQ29kZSA9IC5pbnZhbGlkUmVzcG9uc2UKKyAgcHVibGljIHZhciBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsCisgIHB1YmxpYyBzdGF0aWMgdmFyIGRlZmF1bHRDYXNlOiBFcnJvckNvZGUgeyByZXR1cm4gLmludmFsaWRSZXNwb25zZSB9CisgIAorICBwdWJsaWMgaW5pdCgpIHsgfQorfQorCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UV3JhcHBlZFByb3RvY29sLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFdyYXBwZWRQcm90b2NvbC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTg1NzdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFdyYXBwZWRQcm90b2NvbC5zd2lmdApAQCAtMCwwICsxLDIwOCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24gLy8gRm9yIChOUylEYXRhCisKKworLy8vIEdlbmVyaWMgcHJvdG9jb2wsIGltcGxlbWVudGVzIFRQcm90b2NvbCBhbmQgd3JhcHMgYSBjb25jcmV0ZSBwcm90b2NvbC4KKy8vLyBVc2VmdWwgZm9yIGdlbmVyaWNhbGx5IHN1YmNsYXNzaW5nIHByb3RvY29scyB0byBvdmVycmlkZSBzcGVjaWZpYyBtZXRob2RzIAorLy8vIChpLmUuIFRNdWx0aXBsZXhlZFByb3RvY29sKQorb3BlbiBjbGFzcyBUV3JhcHBlZFByb3RvY29sPFByb3RvY29sOiBUUHJvdG9jb2w+IDogVFByb3RvY29sIHsKKyAgdmFyIGNvbmNyZXRlUHJvdG9jb2w6IFByb3RvY29sCisgIAorICBwdWJsaWMgdmFyIHRyYW5zcG9ydDogVFRyYW5zcG9ydCB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnRyYW5zcG9ydAorICAgIH0KKyAgICBzZXQgeworICAgICAgY29uY3JldGVQcm90b2NvbC50cmFuc3BvcnQgPSBuZXdWYWx1ZQorICAgIH0KKyAgfQorCisgIHB1YmxpYyByZXF1aXJlZCBpbml0KG9uIHRyYW5zcG9ydDogVFRyYW5zcG9ydCkgeworICAgIHNlbGYuY29uY3JldGVQcm90b2NvbCA9IFByb3RvY29sKG9uOiB0cmFuc3BvcnQpCisgIH0KKyAgCisgIC8vIFJlYWQgbWV0aG9kcworICAKKyAgcHVibGljIGZ1bmMgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nLCBUTWVzc2FnZVR5cGUsIEludDMyKSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWVzc2FnZUVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZFN0cnVjdEJlZ2luKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFN0cnVjdEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZFN0cnVjdEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRUeXBlLCBJbnQzMikgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkRmllbGRCZWdpbigpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRGaWVsZEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZEZpZWxkRW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgVFR5cGUsIEludDMyKSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRNYXBCZWdpbigpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNYXBFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRNYXBFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU2V0QmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBJbnQzMikgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkU2V0QmVnaW4oKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU2V0RW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkU2V0RW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZExpc3RCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRMaXN0QmVnaW4oKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTGlzdEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZExpc3RFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IFN0cmluZyB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEJvb2wgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBVSW50OCB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDE2IHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50MzIgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQ2NCB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IERvdWJsZSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IERhdGEgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkKCkKKyAgfQorICAKKyAgLy8gV3JpdGUgbWV0aG9kcworICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNZXNzYWdlQmVnaW4obmFtZTogU3RyaW5nLCB0eXBlIG1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGUsIHNlcXVlbmNlSUQ6IEludDMyKSB0aHJvd3MgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBuYW1lLCB0eXBlOiBtZXNzYWdlVHlwZSwgc2VxdWVuY2VJRDogc2VxdWVuY2VJRCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNZXNzYWdlRW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVN0cnVjdEJlZ2luKG5hbWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKG5hbWU6IG5hbWUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU3RydWN0RW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZVN0cnVjdEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRCZWdpbihuYW1lOiBTdHJpbmcsIHR5cGUgZmllbGRUeXBlOiBUVHlwZSwgZmllbGRJRDogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVGaWVsZEJlZ2luKG5hbWU6IG5hbWUsIHR5cGU6IGZpZWxkVHlwZSwgZmllbGRJRDogZmllbGRJRCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZFN0b3AoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlRmllbGRTdG9wKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVGaWVsZEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWFwQmVnaW4oa2V5VHlwZTogVFR5cGUsIHZhbHVlVHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlTWFwQmVnaW4oa2V5VHlwZToga2V5VHlwZSwgdmFsdWVUeXBlOiB2YWx1ZVR5cGUsIHNpemU6IHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWFwRW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZU1hcEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU2V0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZVNldEJlZ2luKGVsZW1lbnRUeXBlOiBlbGVtZW50VHlwZSwgc2l6ZTogc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTZXRFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlU2V0RW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVMaXN0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZUxpc3RCZWdpbihlbGVtZW50VHlwZTogZWxlbWVudFR5cGUsIHNpemU6IHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTGlzdEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVMaXN0RW5kKCkKKyAgfQorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBTdHJpbmcpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEJvb2wpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IFVJbnQ4KSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlKHZhbHVlKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50MTYpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlKHZhbHVlKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQ2NCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZSh2YWx1ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogRG91YmxlKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlKHZhbHVlKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyBkYXRhOiBEYXRhKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlKGRhdGEpCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RocmlmdC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RocmlmdC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmQxNzU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVGhyaWZ0LnN3aWZ0CkBAIC0wLDAgKzEsMyBAQAorY2xhc3MgVGhyaWZ0IHsKKwlsZXQgdmVyc2lvbiA9ICIxLjEuMCIKK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9UZXN0cy9MaW51eE1haW4uc3dpZnQgYi9saWIvc3dpZnQvVGVzdHMvTGludXhNYWluLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4OGZlYzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvVGVzdHMvTGludXhNYWluLnN3aWZ0CkBAIC0wLDAgKzEsOCBAQAoraW1wb3J0IFhDVGVzdAorQHRlc3RhYmxlIGltcG9ydCBUaHJpZnRUZXN0cworCitYQ1RNYWluKFsKKyAgICAgdGVzdENhc2UoVGhyaWZ0VGVzdHMuYWxsVGVzdHMpLAorICAgICB0ZXN0Q2FzZShUQmluYXJ5UHJvdG9jb2xUZXN0cy5hbGxUZXN0cyksCisgICAgIHRlc3RDYXNlKFRDb21wYWN0UHJvdG9jb2xUZXN0cy5hbGxUZXN0cyksCitdKQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1Rlc3RzL1RocmlmdFRlc3RzL1RCaW5hcnlQcm90b2NvbFRlc3RzLnN3aWZ0IGIvbGliL3N3aWZ0L1Rlc3RzL1RocmlmdFRlc3RzL1RCaW5hcnlQcm90b2NvbFRlc3RzLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YTU1NzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVEJpbmFyeVByb3RvY29sVGVzdHMuc3dpZnQKQEAgLTAsMCArMSwxNjggQEAKKy8vCisvLyAgVEJpbmFyeVByb3RvY29sVGVzdHMuc3dpZnQKKy8vICBUaHJpZnQKKy8vCisvLyAgQ3JlYXRlZCBieSBDaHJpc3RvcGhlciBTaW1wc29uIG9uIDgvMTgvMTYuCisvLworLy8KKworaW1wb3J0IFhDVGVzdAoraW1wb3J0IEZvdW5kYXRpb24KK0B0ZXN0YWJsZSBpbXBvcnQgVGhyaWZ0CisKKworLy8vIFRlc3RpbmcgQmluYXJ5IHByb3RvY29sIHJlYWQvd3JpdGUgYWdhaW5zdCBpdHNlbGYKKy8vLyBVc2VzIHNlcGFyYXRlIHJlYWQvd3JpdGUgdHJhbnNwb3J0L3Byb3RvY29scyAKK2NsYXNzIFRCaW5hcnlQcm90b2NvbFRlc3RzOiBYQ1Rlc3RDYXNlIHsKKyAgdmFyIHRyYW5zcG9ydDogVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydCA9IFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQoZmx1c2hIYW5kbGVyOiB7CisgICAgJDAucmVzZXQocmVhZEJ1ZmZlcjogJDEpCisgIH0pCisgIAorICB2YXIgcHJvdG86IFRCaW5hcnlQcm90b2NvbCEKKyAgCisgIG92ZXJyaWRlIGZ1bmMgc2V0VXAoKSB7CisgICAgc3VwZXIuc2V0VXAoKQorICAgIHByb3RvID0gVEJpbmFyeVByb3RvY29sKG9uOiB0cmFuc3BvcnQpCisgICAgdHJhbnNwb3J0LnJlc2V0KCkKKyAgfQorICAKKyAgb3ZlcnJpZGUgZnVuYyB0ZWFyRG93bigpIHsKKyAgICBzdXBlci50ZWFyRG93bigpCisgICAgdHJhbnNwb3J0LnJlc2V0KCkKKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50OFdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IFVJbnQ4ID0gMjUwCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogVUludDggPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggVUludDgsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RJbnQxNldyaXRlUmVhZCgpIHsKKworICAgIGxldCB3cml0ZVZhbDogSW50MTYgPSAxMjMxMgorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorICAgIGxldCByZWFkVmFsOiBJbnQxNiA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBJbnQxNiwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEludDMyV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogSW50MzIgPSAyMDI5MjM0CisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogSW50MzIgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggSW50MzIsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RJbnQ2NFdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IEludDY0ID0gMjM0MjM0OTgxMzc0MTM0CisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogSW50NjQgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggSW50NjQsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3REb3VibGVXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBEb3VibGUgPSAzLjE0MTU5MjYKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBEb3VibGUgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAuMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBEb3VibGUsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RCb29sV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogQm9vbCA9IHRydWUKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBCb29sID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyBmYWxzZQorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBCb29sLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0U3RyaW5nV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogU3RyaW5nID0gIkhlbGxvIFdvcmxkIgorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IFN0cmluZyEKKyAgICBkbyB7CisgICAgICByZWFkVmFsID0gdHJ5IHByb3RvLnJlYWQoKQorICAgIH0gY2F0Y2ggbGV0IGVycm9yIHsKKyAgICAgIFhDVEFzc2VydEZhbHNlKHRydWUsICJFcnJvciByZWFkaW5nIFwoZXJyb3IpIikKKyAgICAgIHJldHVybgorICAgIH0KKyAgICAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggU3RyaW5nLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0RGF0YVdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IERhdGEgPSAiRGF0YSBXb3JsZCIuZGF0YSh1c2luZzogLnV0ZjgpIQorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IERhdGEgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/ICJHb29kYnllIFdvcmxkIi5kYXRhKHVzaW5nOiAudXRmOCkhCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIERhdGEsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RTdHJ1Y3RXcml0ZVJlYWQoKSB7CisgICAgbGV0IG1zZyA9ICJUZXN0IFByb3RvY29sIEVycm9yIgorICAgIGxldCB3cml0ZVZhbCA9IFRBcHBsaWNhdGlvbkVycm9yKGVycm9yOiAucHJvdG9jb2xFcnJvciwgbWVzc2FnZTogbXNnKQorICAgIGRvIHsKKyAgICAgIHRyeSB3cml0ZVZhbC53cml0ZSh0bzogcHJvdG8pCisgICAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICB9IGNhdGNoIGxldCBlcnJvciB7CisgICAgICBYQ1RBc3NlcnRGYWxzZSh0cnVlLCAiQ2F1Z2h0IEVycm9yIGF0dGVtcHRpbmcgdG8gd3JpdGUgXChlcnJvcikiKQorICAgIH0KKyAgICAKKyAgICBkbyB7CisgICAgICBsZXQgcmVhZFZhbCA9IHRyeSBUQXBwbGljYXRpb25FcnJvci5yZWFkKGZyb206IHByb3RvKQorICAgICAgWENUQXNzZXJ0RXF1YWwocmVhZFZhbC5lcnJvci50aHJpZnRFcnJvckNvZGUsIHdyaXRlVmFsLmVycm9yLnRocmlmdEVycm9yQ29kZSwgIkVycm9yIGNhc2UgbWlzbWF0Y2gsIGV4cGVjdGVkIFwocmVhZFZhbC5lcnJvcikgZ290IFwod3JpdGVWYWwuZXJyb3IpIikKKyAgICAgIFhDVEFzc2VydEVxdWFsKHJlYWRWYWwubWVzc2FnZSwgd3JpdGVWYWwubWVzc2FnZSwgIkVycm9yIG1lc3NhZ2UgbWlzbWF0Y2gsIGV4cGVjdGVkIFwocmVhZFZhbC5tZXNzYWdlKSBnb3QgXCh3cml0ZVZhbC5tZXNzYWdlKSIpCisgICAgfSBjYXRjaCBsZXQgZXJyb3IgeworICAgICAgWENUQXNzZXJ0RmFsc2UodHJ1ZSwgIkNhdWdodCBFcnJvciBhdHRlbXB0aW5nIHRvIHJlYWQgXChlcnJvcikiKQorICAgIH0KKyAgfQorICBmdW5jIHRlc3RVbnNhZmVCaXRjYXN0VXBkYXRlKCkgeworICAgIGxldCB2YWx1ZTogRG91YmxlID0gMy4xNDE1OQorICAgIGxldCB2YWw6IEludDY0ID0gMzE0MTU5MjYKKyAgICBsZXQgdXZhbDogVUludDY0ID0gMzE0MTU5MjYKKyAgICAKKyAgICBsZXQgaTY0ID0gSW50NjQoYml0UGF0dGVybjogdmFsdWUuYml0UGF0dGVybikKKyAgICBsZXQgdWJjID0gdW5zYWZlQml0Q2FzdCh2YWx1ZSwgdG86IEludDY0LnNlbGYpCisgICAgCisgICAgWENUQXNzZXJ0RXF1YWwoaTY0LCB1YmMsICJCaXRjYXN0IERvdWJsZS0+IGk2NCBWYWx1ZXMgZG9uJ3QgbWF0Y2giKQorICAgIAorICAgIGxldCBkYmwgPSBEb3VibGUoYml0UGF0dGVybjogVUludDY0KHZhbCkpCisgICAgbGV0IHViZGIgPSB1bnNhZmVCaXRDYXN0KHZhbCwgdG86IERvdWJsZS5zZWxmKQorICAgIAorICAgIFhDVEFzc2VydEVxdWFsKGRibCwgdWJkYiwgIkJpdGNhc3QgaTY0IC0+IERvdWJsZSBWYWx1ZXMgZG9uJ3QgbWF0Y2giKQorICAgIAorICAgIGxldCBkYjIgPSBEb3VibGUoYml0UGF0dGVybjogdXZhbCkKKyAgICBsZXQgdXNiYzIgPSB1bnNhZmVCaXRDYXN0KHV2YWwsIHRvOiBEb3VibGUuc2VsZikKKyAgICAKKyAgICBYQ1RBc3NlcnRFcXVhbChkYjIsIHVzYmMyLCAiQml0Y2FzdCB1NjQgLT4gRG91YmxlIFZhbHVlcyBkb24ndCBtYXRjaCIpCisKKyAgICAKKyAgfQorICAKKyAgc3RhdGljIHZhciBhbGxUZXN0cyA6IFsoU3RyaW5nLCAoVEJpbmFyeVByb3RvY29sVGVzdHMpIC0+ICgpIHRocm93cyAtPiBWb2lkKV0geworICAgIHJldHVybiBbCisgICAgICAoInRlc3RJbnQ4V3JpdGVSZWFkIiwgdGVzdEludDhXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0SW50MTZXcml0ZVJlYWQiLCB0ZXN0SW50MTZXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0SW50MzJXcml0ZVJlYWQiLCB0ZXN0SW50MzJXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0SW50NjRXcml0ZVJlYWQiLCB0ZXN0SW50NjRXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0RG91YmxlV3JpdGVSZWFkIiwgdGVzdERvdWJsZVdyaXRlUmVhZCksCisgICAgICAoInRlc3RCb29sV3JpdGVSZWFkIiwgdGVzdEJvb2xXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0U3RyaW5nV3JpdGVSZWFkIiwgdGVzdFN0cmluZ1dyaXRlUmVhZCksCisgICAgICAoInRlc3REYXRhV3JpdGVSZWFkIiwgdGVzdERhdGFXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0U3RydWN0V3JpdGVSZWFkIiwgdGVzdFN0cnVjdFdyaXRlUmVhZCkKKyAgICBdCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UQ29tcGFjdFByb3RvY29sVGVzdHMuc3dpZnQgYi9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVENvbXBhY3RQcm90b2NvbFRlc3RzLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MmMyNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVENvbXBhY3RQcm90b2NvbFRlc3RzLnN3aWZ0CkBAIC0wLDAgKzEsMjEwIEBACisvLworLy8gIFRDb21wYWN0UHJvdG9jb2xUZXN0cy5zd2lmdAorLy8gIFRocmlmdAorLy8KKy8vICBDcmVhdGVkIGJ5IENocmlzdG9waGVyIFNpbXBzb24gb24gOC8xOS8xNi4KKy8vCisvLworCitpbXBvcnQgWENUZXN0CitpbXBvcnQgRm91bmRhdGlvbgorQHRlc3RhYmxlIGltcG9ydCBUaHJpZnQKKworCisvLy8gVGVzdGluZyBCaW5hcnkgcHJvdG9jb2wgcmVhZC93cml0ZSBhZ2FpbnN0IGl0c2VsZgorLy8vIFVzZXMgc2VwYXJhdGUgcmVhZC93cml0ZSB0cmFuc3BvcnQvcHJvdG9jb2xzCitjbGFzcyBUQ29tcGFjdFByb3RvY29sVGVzdHM6IFhDVGVzdENhc2UgeworICB2YXIgdHJhbnNwb3J0OiBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0ID0gVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydChmbHVzaEhhbmRsZXI6IHsKKyAgICAkMC5yZXNldChyZWFkQnVmZmVyOiAkMSkKKyAgfSkKKyAgdmFyIHByb3RvOiBUQ29tcGFjdFByb3RvY29sIQorICAKKyAgb3ZlcnJpZGUgZnVuYyBzZXRVcCgpIHsKKyAgICBzdXBlci5zZXRVcCgpCisgICAgcHJvdG8gPSBUQ29tcGFjdFByb3RvY29sKG9uOiB0cmFuc3BvcnQpCisgICAgdHJhbnNwb3J0LnJlc2V0KCkKKyAgfQorICAKKyAgb3ZlcnJpZGUgZnVuYyB0ZWFyRG93bigpIHsKKyAgICBzdXBlci50ZWFyRG93bigpCisgICAgdHJhbnNwb3J0LnJlc2V0KCkKKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50OFdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IFVJbnQ4ID0gMjUwCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisgICAgbGV0IHJlYWRWYWw6IFVJbnQ4ID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIFVJbnQ4LCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50MTZXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBJbnQxNiA9IDEyMzEyCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogSW50MTYgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggSW50MTYsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RJbnQzMldyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IEludDMyID0gMjAyOTIzNAorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IEludDMyID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIEludDMyLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50NjRXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBJbnQ2NCA9IDIzNDIzNDk4MTM3NDEzNAorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IEludDY0ID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIEludDY0LCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0RG91YmxlV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogRG91YmxlID0gMy4xNDE1OTI2CisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogRG91YmxlID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwLjAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggRG91YmxlLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0Qm9vbFdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IEJvb2wgPSB0cnVlCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogQm9vbCA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gZmFsc2UKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggQm9vbCwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdFN0cmluZ1dyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IFN0cmluZyA9ICJIZWxsbyBXb3JsZCIKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBTdHJpbmchCisgICAgZG8geworICAgICAgcmVhZFZhbCA9IHRyeSBwcm90by5yZWFkKCkKKyAgICB9IGNhdGNoIGxldCBlcnJvciB7CisgICAgICBYQ1RBc3NlcnRGYWxzZSh0cnVlLCAiRXJyb3IgcmVhZGluZyBcKGVycm9yKSIpCisgICAgICByZXR1cm4KKyAgICB9CisgICAgCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIFN0cmluZywgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdERhdGFXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBEYXRhID0gIkRhdGEgV29ybGQiLmRhdGEodXNpbmc6IC51dGY4KSEKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBEYXRhID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAiR29vZGJ5ZSBXb3JsZCIuZGF0YSh1c2luZzogLnV0ZjgpIQorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBEYXRhLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0U3RydWN0V3JpdGVSZWFkKCkgeworICAgIGxldCBtc2cgPSAiVGVzdCBQcm90b2NvbCBFcnJvciIKKyAgICBsZXQgd3JpdGVWYWwgPSBUQXBwbGljYXRpb25FcnJvcihlcnJvcjogLnByb3RvY29sRXJyb3IsIG1lc3NhZ2U6IG1zZykKKyAgICBkbyB7CisgICAgICB0cnkgd3JpdGVWYWwud3JpdGUodG86IHByb3RvKQorICAgICAgdHJ5IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICB9IGNhdGNoIGxldCBlcnJvciB7CisgICAgICBYQ1RBc3NlcnRGYWxzZSh0cnVlLCAiQ2F1Z2h0IEVycm9yIGF0dGVtcHRpbmcgdG8gd3JpdGUgXChlcnJvcikiKQorICAgIH0KKyAgICAKKyAgICBkbyB7CisgICAgICBsZXQgcmVhZFZhbCA9IHRyeSBUQXBwbGljYXRpb25FcnJvci5yZWFkKGZyb206IHByb3RvKQorICAgICAgWENUQXNzZXJ0RXF1YWwocmVhZFZhbC5lcnJvci50aHJpZnRFcnJvckNvZGUsIHdyaXRlVmFsLmVycm9yLnRocmlmdEVycm9yQ29kZSwgIkVycm9yIGNhc2UgbWlzbWF0Y2gsIGV4cGVjdGVkIFwocmVhZFZhbC5lcnJvcikgZ290IFwod3JpdGVWYWwuZXJyb3IpIikKKyAgICAgIFhDVEFzc2VydEVxdWFsKHJlYWRWYWwubWVzc2FnZSwgd3JpdGVWYWwubWVzc2FnZSwgIkVycm9yIG1lc3NhZ2UgbWlzbWF0Y2gsIGV4cGVjdGVkIFwocmVhZFZhbC5tZXNzYWdlKSBnb3QgXCh3cml0ZVZhbC5tZXNzYWdlKSIpCisgICAgfSBjYXRjaCBsZXQgZXJyb3IgeworICAgICAgWENUQXNzZXJ0RmFsc2UodHJ1ZSwgIkNhdWdodCBFcnJvciBhdHRlbXB0aW5nIHRvIHJlYWQgXChlcnJvcikiKQorICAgIH0KKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50MzJaaWdaYWcoKSB7CisgICAgbGV0IHplcm86IEludDMyID0gMAorICAgIGxldCBvbmU6IEludDMyID0gMQorICAgIGxldCBuT25lOiBJbnQzMiA9IC0xCisgICAgbGV0IHR3bzogSW50MzIgPSAyCisgICAgbGV0IG5Ud286IEludDMyID0gLTIKKyAgICBsZXQgbWF4ID0gSW50MzIubWF4CisgICAgbGV0IG1pbiA9IEludDMyLm1pbgorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTMyVG9aaWdaYWcoemVybyksIFVJbnQzMigwKSwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKHplcm8pIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2kzMigwKSwgemVybywgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKHplcm8pIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmkzMlRvWmlnWmFnKG5PbmUpLCBVSW50MzIoMSksICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChuT25lKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pMzIoMSksIG5PbmUsICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChuT25lKSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pMzJUb1ppZ1phZyhvbmUpLCBVSW50MzIoMiksICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChvbmUpIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2kzMigyKSwgb25lLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwob25lKSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pMzJUb1ppZ1phZyhuVHdvKSwgVUludDMyKDMpLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwoblR3bykiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTMyKDMpLCBuVHdvLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwoblR3bykiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTMyVG9aaWdaYWcodHdvKSwgVUludDMyKDQpLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwodHdvKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pMzIoNCksIHR3bywgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKHR3bykiKQorCisgICAgbGV0IHVNYXhNaW51c09uZTogVUludDMyID0gVUludDMyLm1heCAtIDEKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pMzJUb1ppZ1phZyhtYXgpLCB1TWF4TWludXNPbmUsICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChtYXgpIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2kzMih1TWF4TWludXNPbmUpLCBtYXgsICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChtYXgpIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmkzMlRvWmlnWmFnKG1pbiksIFVJbnQzMi5tYXgsICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChtaW4pIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2kzMihVSW50MzIubWF4KSwgbWluLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwobWluKSIpCisgIH0KKworICBmdW5jIHRlc3RJbnQ2NFppZ1phZygpIHsKKyAgICBsZXQgemVybzogSW50NjQgPSAwCisgICAgbGV0IG9uZTogSW50NjQgPSAxCisgICAgbGV0IG5PbmU6IEludDY0ID0gLTEKKyAgICBsZXQgdHdvOiBJbnQ2NCA9IDIKKyAgICBsZXQgblR3bzogSW50NjQgPSAtMgorICAgIGxldCBtYXggPSBJbnQ2NC5tYXgKKyAgICBsZXQgbWluID0gSW50NjQubWluCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pNjRUb1ppZ1phZyh6ZXJvKSwgVUludDY0KDApLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwoemVybykiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTY0KDApLCB6ZXJvLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwoemVybykiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTY0VG9aaWdaYWcobk9uZSksIFVJbnQ2NCgxKSwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG5PbmUpIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2k2NCgxKSwgbk9uZSwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG5PbmUpIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmk2NFRvWmlnWmFnKG9uZSksIFVJbnQ2NCgyKSwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG9uZSkiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTY0KDIpLCBvbmUsICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChvbmUpIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmk2NFRvWmlnWmFnKG5Ud28pLCBVSW50NjQoMyksICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChuVHdvKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pNjQoMyksIG5Ud28sICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChuVHdvKSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pNjRUb1ppZ1phZyh0d28pLCBVSW50NjQoNCksICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXCh0d28pIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2k2NCg0KSwgdHdvLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwodHdvKSIpCisKKyAgICBsZXQgdU1heE1pbnVzT25lOiBVSW50NjQgPSBVSW50NjQubWF4IC0gMQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmk2NFRvWmlnWmFnKG1heCksIHVNYXhNaW51c09uZSwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG1heCkiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTY0KHVNYXhNaW51c09uZSksIG1heCwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG1heCkiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTY0VG9aaWdaYWcobWluKSwgVUludDY0Lm1heCwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG1pbikiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTY0KFVJbnQ2NC5tYXgpLCBtaW4sICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChtaW4pIikKKyAgfQorICAKKyAgc3RhdGljIHZhciBhbGxUZXN0cyA6IFsoU3RyaW5nLCAoVENvbXBhY3RQcm90b2NvbFRlc3RzKSAtPiAoKSB0aHJvd3MgLT4gVm9pZCldIHsKKyAgICByZXR1cm4gWworICAgICAgKCJ0ZXN0SW50OFdyaXRlUmVhZCIsIHRlc3RJbnQ4V3JpdGVSZWFkKSwKKyAgICAgICgidGVzdEludDE2V3JpdGVSZWFkIiwgdGVzdEludDE2V3JpdGVSZWFkKSwKKyAgICAgICgidGVzdEludDMyV3JpdGVSZWFkIiwgdGVzdEludDMyV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdEludDY0V3JpdGVSZWFkIiwgdGVzdEludDY0V3JpdGVSZWFkKSwKKyAgICAgICgidGVzdERvdWJsZVdyaXRlUmVhZCIsIHRlc3REb3VibGVXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0Qm9vbFdyaXRlUmVhZCIsIHRlc3RCb29sV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdFN0cmluZ1dyaXRlUmVhZCIsIHRlc3RTdHJpbmdXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0RGF0YVdyaXRlUmVhZCIsIHRlc3REYXRhV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdFN0cnVjdFdyaXRlUmVhZCIsIHRlc3RTdHJ1Y3RXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0SW50MzJaaWdaYWciLCB0ZXN0SW50MzJaaWdaYWcpLAorICAgICAgKCJ0ZXN0SW50NjRaaWdaYWciLCB0ZXN0SW50NjRaaWdaYWcpCisgICAgXQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVGhyaWZ0VGVzdHMuc3dpZnQgYi9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVGhyaWZ0VGVzdHMuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxNjEwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UaHJpZnRUZXN0cy5zd2lmdApAQCAtMCwwICsxLDE4IEBACitpbXBvcnQgWENUZXN0CitAdGVzdGFibGUgaW1wb3J0IFRocmlmdAorCitjbGFzcyBUaHJpZnRUZXN0czogWENUZXN0Q2FzZSB7CisgIGZ1bmMgdGVzdFZlcnNpb24oKSB7CisgICAgWENUQXNzZXJ0RXF1YWwoVGhyaWZ0KCkudmVyc2lvbiwgIjEuMS4wIikKKyAgfQorCisgIGZ1bmMgdGVzdF9pbl9hZGRyX2V4dGVuc2lvbigpIHsKKworICB9CisKKyAgc3RhdGljIHZhciBhbGxUZXN0cyA6IFsoU3RyaW5nLCAoVGhyaWZ0VGVzdHMpIC0+ICgpIHRocm93cyAtPiBWb2lkKV0geworICAgIHJldHVybiBbCisgICAgICAoInRlc3RWZXJzaW9uIiwgdGVzdFZlcnNpb24pLAorICAgIF0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3RzL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvdHMvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3RzL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvdHMvdGhyaWZ0LmQudHMgYi9saWIvdHMvdGhyaWZ0LmQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJhNDZjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90cy90aHJpZnQuZC50cwpAQCAtMCwwICsxLDY5OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitkZWNsYXJlIG1vZHVsZSBUaHJpZnQgeworICAvKioKKyAgICogVGhyaWZ0IEphdmFTY3JpcHQgbGlicmFyeSB2ZXJzaW9uLgorICAgKi8KKyAgdmFyIFZlcnNpb246IHN0cmluZzsKKworICAvKioKKyAgICogVGhyaWZ0IElETCB0eXBlIHN0cmluZyB0byBJZCBtYXBwaW5nLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIFNUT1AgICAtIEVuZCBvZiBhIHNldCBvZiBmaWVsZHMuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVk9JRCAgIC0gTm8gdmFsdWUgKG9ubHkgbGVnYWwgZm9yIHJldHVybiB0eXBlcykuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQk9PTCAgIC0gVHJ1ZS9GYWxzZSBpbnRlZ2VyLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIEJZVEUgICAtIFNpZ25lZCA4IGJpdCBpbnRlZ2VyLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIEkwOCAgICAtIFNpZ25lZCA4IGJpdCBpbnRlZ2VyLiAgICAgCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgRE9VQkxFIC0gNjQgYml0IElFRUUgODU0IGZsb2F0aW5nIHBvaW50LgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIEkxNiAgICAtIFNpZ25lZCAxNiBiaXQgaW50ZWdlci4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBJMzIgICAgLSBTaWduZWQgMzIgYml0IGludGVnZXIuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSTY0ICAgIC0gU2lnbmVkIDY0IGJpdCBpbnRlZ2VyLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIFNUUklORyAtIEFycmF5IG9mIGJ5dGVzIHJlcHJlc2VudGluZyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIFVURjcgICAtIEFycmF5IG9mIGJ5dGVzIHJlcHJlc2VudGluZyBhIHN0cmluZyBvZiBVVEY3IGVuY29kZWQgY2hhcmFjdGVycy4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBTVFJVQ1QgLSBBIG11bHRpZmllbGQgdHlwZS4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBNQVAgICAgLSBBIGNvbGxlY3Rpb24gdHlwZSAobWFwL2Fzc29jaWF0aXZlLWFycmF5L2RpY3Rpb25hcnkpLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIFNFVCAgICAtIEEgY29sbGVjdGlvbiB0eXBlICh1bm9yZGVyZWQgYW5kIHdpdGhvdXQgcmVwZWF0ZWQgdmFsdWVzKS4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBMSVNUICAgLSBBIGNvbGxlY3Rpb24gdHlwZSAodW5vcmRlcmVkKS4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBVVEY4ICAgLSBBcnJheSBvZiBieXRlcyByZXByZXNlbnRpbmcgYSBzdHJpbmcgb2YgVVRGOCBlbmNvZGVkIGNoYXJhY3RlcnMuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVVRGMTYgIC0gQXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIGEgc3RyaW5nIG9mIFVURjE2IGVuY29kZWQgY2hhcmFjdGVycy4KKyAgICovCisgIGludGVyZmFjZSBUeXBlIHsKKyAgICAnU1RPUCc6IG51bWJlcjsKKyAgICAnVk9JRCc6IG51bWJlcjsKKyAgICAnQk9PTCc6IG51bWJlcjsKKyAgICAnQllURSc6IG51bWJlcjsKKyAgICAnSTA4JzogbnVtYmVyOworICAgICdET1VCTEUnOiBudW1iZXI7CisgICAgJ0kxNic6IG51bWJlcjsKKyAgICAnSTMyJzogbnVtYmVyOworICAgICdJNjQnOiBudW1iZXI7CisgICAgJ1NUUklORyc6IG51bWJlcjsKKyAgICAnVVRGNyc6IG51bWJlcjsKKyAgICAnU1RSVUNUJzogbnVtYmVyOworICAgICdNQVAnOiBudW1iZXI7CisgICAgJ1NFVCc6IG51bWJlcjsKKyAgICAnTElTVCc6IG51bWJlcjsKKyAgICAnVVRGOCc6IG51bWJlcjsKKyAgICAnVVRGMTYnOiBudW1iZXI7CisgIH0KKyAgdmFyIFR5cGU6IFR5cGU7CisKKyAgLyoqCisgICAqIFRocmlmdCBSUEMgbWVzc2FnZSB0eXBlIHN0cmluZyB0byBJZCBtYXBwaW5nLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIENBTEwgICAgICAtIFJQQyBjYWxsIHNlbnQgZnJvbSBjbGllbnQgdG8gc2VydmVyLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIFJFUExZICAgICAtIFJQQyBjYWxsIG5vcm1hbCByZXNwb25zZSBmcm9tIHNlcnZlciB0byBjbGllbnQuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgRVhDRVBUSU9OIC0gUlBDIGNhbGwgZXhjZXB0aW9uIHJlc3BvbnNlIGZyb20gc2VydmVyIHRvIGNsaWVudC4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBPTkVXQVkgICAgLSBPbmV3YXkgUlBDIGNhbGwgZnJvbSBjbGllbnQgdG8gc2VydmVyIHdpdGggbm8gcmVzcG9uc2UuCisgICAqLworICBpbnRlcmZhY2UgTWVzc2FnZVR5cGUgeworICAgICdDQUxMJzogbnVtYmVyOworICAgICdSRVBMWSc6IG51bWJlcjsKKyAgICAnRVhDRVBUSU9OJzogbnVtYmVyOworICAgICdPTkVXQVknOiBudW1iZXI7CisgIH0KKyAgdmFyIE1lc3NhZ2VUeXBlOiBNZXNzYWdlVHlwZTsKKworICAvKioKKyAgICogVXRpbGl0eSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvdW50IG9mIGFuIG9iamVjdCdzIG93biBwcm9wZXJ0aWVzLgorICAgKiBAcGFyYW0ge29iamVjdH0gb2JqIC0gT2JqZWN0IHRvIHRlc3QuCisgICAqIEByZXR1cm5zIHtudW1iZXJ9IG51bWJlciBvZiBvYmplY3QncyBvd24gcHJvcGVydGllcworICAgKi8KKyAgZnVuY3Rpb24gb2JqZWN0TGVuZ3RoKG9iajogT2JqZWN0KTogbnVtYmVyOworCisgIC8qKgorICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGVzdGFibGlzaCBwcm90b3R5cGUgaW5oZXJpdGFuY2UuCisgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNvbnN0cnVjdG9yIC0gQ29udHN0cnVjdG9yIGZ1bmN0aW9uIHRvIHNldCBhcyBkZXJpdmVkLgorICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckNvbnN0cnVjdG9yIC0gQ29udHN0cnVjdG9yIGZ1bmN0aW9uIHRvIHNldCBhcyBiYXNlLgorICAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdIC0gVHlwZSBuYW1lIHRvIHNldCBhcyBuYW1lIHByb3BlcnR5IGluIGRlcml2ZWQgcHJvdG90eXBlLgorICAgKi8KKyAgZnVuY3Rpb24gaW5oZXJpdHMoY29uc3RydWN0b3I6IEZ1bmN0aW9uLCBzdXBlckNvbnN0cnVjdG9yOiBGdW5jdGlvbiwgbmFtZT86IHN0cmluZyk6IHZvaWQ7CisKKyAgLyoqCisgICAqIFRFeGNlcHRpb24gaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBUaHJpZnQgZXhjZXB0aW9ucyB0eXBlcy4KKyAgICovCisgIGNsYXNzIFRFeGNlcHRpb24gaW1wbGVtZW50cyBFcnJvciB7CisgICAgbmFtZTogc3RyaW5nOworICAgIG1lc3NhZ2U6IHN0cmluZzsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIGEgVGhyaWZ0IFRFeGNlcHRpb24gaW5zdGFuY2UuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBUaGUgVEV4Y2VwdGlvbiBtZXNzYWdlIChkaXN0aW5jdCBmcm9tIHRoZSBFcnJvciBtZXNzYWdlKS4KKyAgICAgKi8KKyAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWVzc2FnZSBzZXQgb24gdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBleGNlcHRpb24gbWVzc2FnZQorICAgICAqLworICAgIGdldE1lc3NhZ2UoKTogc3RyaW5nOworICB9CisKKyAgLyoqCisgICAqIFRocmlmdCBBcHBsaWNhdGlvbiBFeGNlcHRpb24gdHlwZSBzdHJpbmcgdG8gSWQgbWFwcGluZy4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBVTktOT1dOICAgICAgICAgICAgICAgICAtIFVua25vd24vdW5kZWZpbmVkLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIFVOS05PV05fTUVUSE9EICAgICAgICAgIC0gQ2xpZW50IGF0dGVtcHRlZCB0byBjYWxsIGEgbWV0aG9kIHVua25vd24gdG8gdGhlIHNlcnZlci4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBJTlZBTElEX01FU1NBR0VfVFlQRSAgICAtIENsaWVudCBwYXNzZWQgYW4gdW5rbm93bi91bnN1cHBvcnRlZCBNZXNzYWdlVHlwZS4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBXUk9OR19NRVRIT0RfTkFNRSAgICAgICAtIFVudXNlZC4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBCQURfU0VRVUVOQ0VfSUQgICAgICAgICAtIFVudXNlZCBpbiBUaHJpZnQgUlBDLCB1c2VkIHRvIGZsYWcgcHJvcHJpZXRhcnkgc2VxdWVuY2UgbnVtYmVyIGVycm9ycy4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBNSVNTSU5HX1JFU1VMVCAgICAgICAgICAtIFJhaXNlZCBieSBhIHNlcnZlciBwcm9jZXNzb3IgaWYgYSBoYW5kbGVyIGZhaWxzIHRvIHN1cHBseSB0aGUgcmVxdWlyZWQgcmV0dXJuIHJlc3VsdC4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBJTlRFUk5BTF9FUlJPUiAgICAgICAgICAtIFNvbWV0aGluZyBiYWQgaGFwcGVuZWQuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgUFJPVE9DT0xfRVJST1IgICAgICAgICAgLSBUaGUgcHJvdG9jb2wgbGF5ZXIgZmFpbGVkIHRvIHNlcmlhbGl6ZSBvciBkZXNlcmlhbGl6ZSBkYXRhLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIElOVkFMSURfVFJBTlNGT1JNICAgICAgIC0gVW51c2VkLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIElOVkFMSURfUFJPVE9DT0wgICAgICAgIC0gVGhlIHByb3RvY29sIChvciB2ZXJzaW9uKSBpcyBub3Qgc3VwcG9ydGVkLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFIC0gVW51c2VkLgorICAgKi8KKyAgaW50ZXJmYWNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgeworICAgICdVTktOT1dOJzogbnVtYmVyOworICAgICdVTktOT1dOX01FVEhPRCc6IG51bWJlcjsKKyAgICAnSU5WQUxJRF9NRVNTQUdFX1RZUEUnOiBudW1iZXI7CisgICAgJ1dST05HX01FVEhPRF9OQU1FJzogbnVtYmVyOworICAgICdCQURfU0VRVUVOQ0VfSUQnOiBudW1iZXI7CisgICAgJ01JU1NJTkdfUkVTVUxUJzogbnVtYmVyOworICAgICdJTlRFUk5BTF9FUlJPUic6IG51bWJlcjsKKyAgICAnUFJPVE9DT0xfRVJST1InOiBudW1iZXI7CisgICAgJ0lOVkFMSURfVFJBTlNGT1JNJzogbnVtYmVyOworICAgICdJTlZBTElEX1BST1RPQ09MJzogbnVtYmVyOworICAgICdVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSc6IG51bWJlcjsKKyAgfQorICB2YXIgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZTsKKworICAvKioKKyAgICogVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGlzIHRoZSBleGNlcHRpb24gY2xhc3MgdXNlZCB0byBwcm9wYWdhdGUgZXhjZXB0aW9ucyBmcm9tIGFuIFJQQyBzZXJ2ZXIgYmFjayB0byBhIGNhbGxpbmcgY2xpZW50LgorICAgKi8KKyAgY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7CisgICAgbWVzc2FnZTogc3RyaW5nOworICAgIGNvZGU6IG51bWJlcjsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIGEgVGhyaWZ0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFRoZSBUQXBwbGljYXRpb25FeGNlcHRpb24gbWVzc2FnZSAoZGlzdGluY3QgZnJvbSB0aGUgRXJyb3IgbWVzc2FnZSkuCisgICAgICogQHBhcmFtIHtUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZX0gW2NvZGVdIC0gVGhlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgY29kZS4KKyAgICAgKi8KKyAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGNvZGU/OiBudW1iZXIpOworCisgICAgLyoqCisgICAgICogUmVhZCBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBmcm9tIHRoZSBzdXBwbGllZCBwcm90b2NvbC4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBUaGUgaW5wdXQgcHJvdG9jb2wgdG8gcmVhZCBmcm9tLgorICAgICAqLworICAgIHJlYWQoaW5wdXQ6IE9iamVjdCk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB0byB0aGUgc3VwcGxpZWQgcHJvdG9jb2wuCisgICAgICogQHBhcmFtIHtvYmplY3R9IG91dHB1dCAtIFRoZSBvdXRwdXQgcHJvdG9jb2wgdG8gd3JpdGUgdG8uCisgICAgICovCisgICAgd3JpdGUob3V0cHV0OiBPYmplY3QpOiB2b2lkOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYXBwbGljYXRpb24gZXhjZXB0aW9uIGNvZGUgc2V0IG9uIHRoZSBleGNlcHRpb24uCisgICAgICogQHJldHVybnMge1RocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlfSBleGNlcHRpb24gY29kZQorICAgICAqLworICAgIGdldENvZGUoKTogbnVtYmVyOworICB9CisKKyAgLyoqCisgICAqIFRoZSBBcGFjaGUgVGhyaWZ0IFRyYW5zcG9ydCBsYXllciBwZXJmb3JtcyBieXRlIGxldmVsIEkvTyBiZXR3ZWVuIFJQQworICAgKiBjbGllbnRzIGFuZCBzZXJ2ZXJzLiBUaGUgSmF2YVNjcmlwdCBUcmFuc3BvcnQgb2JqZWN0IHR5cGUgdXNlcyBIdHRwW3NdL1hIUiBhbmQgaXMKKyAgICogdGhlIHNvbGUgYnJvd3NlciBiYXNlZCBUaHJpZnQgdHJhbnNwb3J0LiBUYXJnZXQgc2VydmVycyBtdXN0IGltcGxlbWVudCB0aGUgaHR0cFtzXSAKKyAgICogdHJhbnNwb3J0IChzZWU6IG5vZGUuanMgZXhhbXBsZSBzZXJ2ZXIpLgorICAgKi8KKyAgY2xhc3MgVFhIUlRyYW5zcG9ydCB7CisgICAgdXJsOiBzdHJpbmc7CisgICAgd3BvczogbnVtYmVyOworICAgIHJwb3M6IG51bWJlcjsKKyAgICB1c2VDT1JTOiBhbnk7CisgICAgc2VuZF9idWY6IHN0cmluZzsKKyAgICByZWN2X2J1Zjogc3RyaW5nOworCisgICAgLyoqCisgICAgICogSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgdXJsIHRoZW4geW91IG11c3QgaGFuZGxlIFhIUiBvcGVyYXRpb25zIG9uCisgICAgICogeW91ciBvd24uIFRoaXMgdHlwZSBjYW4gYWxzbyBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgVHJhbnNwb3J0IGFsaWFzCisgICAgICogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIFVSTCB0byBjb25uZWN0IHRvLgorICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBPcHRpb25zLgorICAgICAqLworICAgIGNvbnN0cnVjdG9yKHVybD86IHN0cmluZywgb3B0aW9ucz86IE9iamVjdCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBicm93c2VyIHNwZWNpZmljIFhtbEh0dHBSZXF1ZXN0IE9iamVjdC4KKyAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSB0aGUgYnJvd3NlciBYSFIgaW50ZXJmYWNlIG9iamVjdAorICAgICAqLworICAgIGdldFhtbEh0dHBSZXF1ZXN0T2JqZWN0KCk6IE9iamVjdDsKKworICAgIC8qKgorICAgICAqIFNlbmRzIHRoZSBjdXJyZW50IFhSSCByZXF1ZXN0IGlmIHRoZSB0cmFuc3BvcnQgd2FzIGNyZWF0ZWQgd2l0aCBhIFVSTCBhbmQKKyAgICAgKiB0aGUgYXN5bmMgcGFyYW1ldGVyIGlmIGZhbHNlLiBJZiB0aGUgdHJhbnNwb3J0IHdhcyBub3QgY3JlYXRlZCB3aXRoIGEgVVJMCisgICAgICogb3IgdGhlIGFzeW5jIHBhcmFtZXRlciBpcyBUcnVlIG9yIHRoZSBVUkwgaXMgYW4gZW1wdHkgc3RyaW5nLCB0aGUgY3VycmVudCAKKyAgICAgKiBzZW5kIGJ1ZmZlciBpcyByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gYXN5bmMgLSBJZiB0cnVlIHRoZSBjdXJyZW50IHNlbmQgYnVmZmVyIGlzIHJldHVybmVkLgorICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gT3B0aW9uYWwgYXN5bmMgY29tcGxldGlvbiBjYWxsYmFjay4KKyAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfHN0cmluZ30gTm90aGluZyBvciB0aGUgY3VycmVudCBzZW5kIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBmbHVzaChhc3luYzogYW55LCBjYWxsYmFjaz86IEZ1bmN0aW9uKTogc3RyaW5nOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGpRdWVyeSBYSFIgb2JqZWN0IHRvIGJlIHVzZWQgZm9yIGEgVGhyaWZ0IHNlcnZlciBjYWxsLgorICAgICAqIEBwYXJhbSB7b2JqZWN0fSBjbGllbnQgLSBUaGUgVGhyaWZ0IFNlcnZpY2UgY2xpZW50IG9iamVjdCBnZW5lcmF0ZWQgYnkgdGhlIElETCBjb21waWxlci4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gcG9zdERhdGEgLSBUaGUgbWVzc2FnZSB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIuCisgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gYXJncyAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIGlmIHRoZSByZXF1ZXN0IHN1Y2NlZWRzLgorICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHJlY3ZfbWV0aG9kIC0gVGhlIFRocmlmdCBTZXJ2aWNlIENsaWVudCByZWNlaXZlIG1ldGhvZCBmb3IgdGhlIGNhbGwuCisgICAgICogQHJldHVybnMge29iamVjdH0gQSBuZXcgalF1ZXJ5IFhIUiBvYmplY3QuCisgICAgICovCisgICAganFSZXF1ZXN0KGNsaWVudDogT2JqZWN0LCBwb3N0RGF0YTogYW55LCBhcmdzOiBGdW5jdGlvbiwgcmVjdl9tZXRob2Q6IEZ1bmN0aW9uKTogT2JqZWN0OworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYnVmZmVyIHRvIHVzZSB3aGVuIHJlY2VpdmluZyBzZXJ2ZXIgcmVzcG9uc2VzLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHJlY2VpdmUgc2VydmVyIHJlc3BvbnNlcy4KKyAgICAgKi8KKyAgICBzZXRSZWN2QnVmZmVyKGJ1Zjogc3RyaW5nKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4sIGluIGJyb3dzZXIgYmFzZWQgSmF2YVNjcmlwdAorICAgICAqIHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgdHJ1ZS4KKyAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQWx3YXlzIFRydWUuCisgICAgICovCisgICAgaXNPcGVuKCk6IGJvb2xlYW47CisKKyAgICAvKioKKyAgICAgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24sIGluIGJyb3dzZXIgYmFzZWQgSmF2YVNjcmlwdAorICAgICAqIHRoaXMgZnVuY3Rpb24gaXMgYSBub3AuCisgICAgICovCisgICAgb3BlbigpOiB2b2lkOworCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbiwgaW4gYnJvd3NlciBiYXNlZCBKYXZhU2NyaXB0CisgICAgICogdGhpcyBmdW5jdGlvbiBpcyBhIG5vcC4KKyAgICAgKi8KKyAgICBjbG9zZSgpOiB2b2lkOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIHJlc3BvbnNlCisgICAgICogYnVmZmVyLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZW4gLSBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmV0dXJuLgorICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICAgICAqLworICAgIHJlYWQobGVuOiBudW1iZXIpOiBzdHJpbmc7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBlbnRpcmUgcmVzcG9uc2UgYnVmZmVyLgorICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICAgICAqLworICAgIHJlYWRBbGwoKTogc3RyaW5nOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2VuZCBidWZmZXIgdG8gYnVmLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHNlbmQuCisgICAgICovCisgICAgd3JpdGUoYnVmOiBzdHJpbmcpOiB2b2lkOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2VuZCBidWZmZXIuCisgICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIHNlbmQgYnVmZmVyLgorICAgICAqLworICAgIGdldFNlbmRCdWZmZXIoKTogc3RyaW5nOworICB9CisKKyAgLyoqCisgICAqIE9sZCBhbGlhcyBvZiB0aGUgVFhIUlRyYW5zcG9ydCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgICAqLworICBjbGFzcyBUcmFuc3BvcnQgZXh0ZW5kcyBUWEhSVHJhbnNwb3J0IHsgfQorCisgIC8qKgorICAgKiBUaGUgQXBhY2hlIFRocmlmdCBUcmFuc3BvcnQgbGF5ZXIgcGVyZm9ybXMgYnl0ZSBsZXZlbCBJL08gCisgICAqIGJldHdlZW4gUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuIFRoZSBKYXZhU2NyaXB0IFRXZWJTb2NrZXRUcmFuc3BvcnQgb2JqZWN0IAorICAgKiB1c2VzIHRoZSBXZWJTb2NrZXQgcHJvdG9jb2wuIFRhcmdldCBzZXJ2ZXJzIG11c3QgaW1wbGVtZW50IFdlYlNvY2tldC4KKyAgICovCisgIGNsYXNzIFRXZWJTb2NrZXRUcmFuc3BvcnQgeworICAgIHVybDogc3RyaW5nOyAgICAgICAgICAgLy9XaGVyZSB0byBjb25uZWN0CisgICAgc29ja2V0OiBhbnk7ICAgICAgICAgICAvL1RoZSB3ZWIgc29ja2V0CisgICAgY2FsbGJhY2tzOiBGdW5jdGlvbltdOyAvL1BlbmRpbmcgY2FsbGJhY2tzCisgICAgc2VuZF9wZW5kaW5nOiBhbnlbXTsgICAvL0J1ZmZlcnMvQ2FsbGJhY2sgcGFpcnMgd2FpdGluZyB0byBiZSBzZW50CisgICAgc2VuZF9idWY6IHN0cmluZzsgICAgICAvL091dGJvdW5kIGRhdGEsIGltbXV0YWJsZSB1bnRpbCBzZW50CisgICAgcmVjdl9idWY6IHN0cmluZzsgICAgICAvL0luYm91bmQgZGF0YQorICAgIHJiX3dwb3M6IG51bWJlcjsgICAgICAgLy9OZXR3b3JrIHdyaXRlIHBvc2l0aW9uIGluIHJlY2VpdmUgYnVmZmVyCisgICAgcmJfcnBvczogbnVtYmVyOyAgICAgICAvL0NsaWVudCByZWFkIHBvc2l0aW9uIGluIHJlY2VpdmUgYnVmZmVyCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBGdW5jdGlvbiBmb3IgdGhlIFdlYlNvY2tldCB0cmFuc3BvcnQuCisgICAgICogQHBhcmFtIHtzdHJpbmcgfSBbdXJsXSAtIFRoZSBVUkwgdG8gY29ubmVjdCB0by4KKyAgICAgKi8KKyAgICBjb25zdHJ1Y3Rvcih1cmw6IHN0cmluZyk7CisKKyAgICBfX3Jlc2V0KHVybDogc3RyaW5nKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFNlbmRzIHRoZSBjdXJyZW50IFdTIHJlcXVlc3QgYW5kIHJlZ2lzdGVycyBjYWxsYmFjay4gVGhlIGFzeW5jIAorICAgICAqIHBhcmFtZXRlciBpcyBpZ25vcmVkIChXUyBmbHVzaCBpcyBhbHdheXMgYXN5bmMpIGFuZCB0aGUgY2FsbGJhY2sgCisgICAgICogZnVuY3Rpb24gcGFyYW1ldGVyIGlzIHJlcXVpcmVkLgorICAgICAqIEBwYXJhbSB7b2JqZWN0fSBhc3luYyAtIElnbm9yZWQuCisgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBUaGUgY2xpZW50IGNvbXBsZXRpb24gY2FsbGJhY2suCisgICAgICogQHJldHVybnMge3VuZGVmaW5lZHxzdHJpbmd9IE5vdGhpbmcgKHVuZGVmaW5lZCkgCisgICAgICovCisgICAgZmx1c2goYXN5bmM6IGFueSwgY2FsbGJhY2s6IEZ1bmN0aW9uKTogc3RyaW5nOworCisgICAgX19vbk9wZW4oKTogdm9pZDsKKworICAgIF9fb25DbG9zZSgpOiB2b2lkOworCisgICAgX19vbk1lc3NhZ2UoKTogdm9pZDsKKworICAgIF9fb25FcnJvcigpOiB2b2lkOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYnVmZmVyIHRvIHVzZSB3aGVuIHJlY2VpdmluZyBzZXJ2ZXIgcmVzcG9uc2VzLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHJlY2VpdmUgc2VydmVyIHJlc3BvbnNlcy4KKyAgICAgKi8KKyAgICBzZXRSZWN2QnVmZmVyKGJ1Zjogc3RyaW5nKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4KKyAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gCisgICAgICovCisgICAgaXNPcGVuKCk6IGJvb2xlYW47CisKKyAgICAvKioKKyAgICAgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24KKyAgICAgKi8KKyAgICBvcGVuKCk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uCisgICAgICovCisgICAgY2xvc2UoKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSByZXNwb25zZQorICAgICAqIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuIC0gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJldHVybi4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaGFyYWN0ZXJzIHNlbnQgYnkgdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICByZWFkKGxlbjogbnVtYmVyKTogc3RyaW5nOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZW50aXJlIHJlc3BvbnNlIGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaGFyYWN0ZXJzIHNlbnQgYnkgdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICByZWFkQWxsKCk6IHN0cmluZzsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNlbmQgYnVmZmVyIHRvIGJ1Zi4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzZW5kLgorICAgICAqLworICAgIHdyaXRlKGJ1Zjogc3RyaW5nKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNlbmQgYnVmZmVyLgorICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzZW5kIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBnZXRTZW5kQnVmZmVyKCk6IHN0cmluZzsKKyAgfQorCisgIC8qKgorICAgKiBBcGFjaGUgVGhyaWZ0IFByb3RvY29scyBwZXJmb3JtIHNlcmlhbGl6YXRpb24gd2hpY2ggZW5hYmxlcyBjcm9zcyAKKyAgICogbGFuZ3VhZ2UgUlBDLiBUaGUgUHJvdG9jb2wgdHlwZSBpcyB0aGUgSmF2YVNjcmlwdCBicm93c2VyIGltcGxlbWVudGF0aW9uIAorICAgKiBvZiB0aGUgQXBhY2hlIFRocmlmdCBUSlNPTlByb3RvY29sLgorICAgKi8KKyAgY2xhc3MgVEpTT05Qcm90b2NvbCB7CisgICAgdHJhbnNwb3J0OiBPYmplY3Q7CisKKyAgICAvKioKKyAgICAgKiBUaHJpZnQgSURMIHR5cGUgSWQgdG8gc3RyaW5nIG1hcHBpbmcuCisgICAgICogVGhlIG1hcHBpbmcgdGFibGUgbG9va3MgYXMgZm9sbG93czoKKyAgICAgKiBUaHJpZnQuVHlwZS5CT09MICAgLT4gInRmIjogVHJ1ZS9GYWxzZSBpbnRlZ2VyLgorICAgICAqIFRocmlmdC5UeXBlLkJZVEUgICAtPiAiaTgiOiBTaWduZWQgOCBiaXQgaW50ZWdlci4KKyAgICAgKiBUaHJpZnQuVHlwZS5JMTYgICAgLT4gImkxNiI6IFNpZ25lZCAxNiBiaXQgaW50ZWdlci4KKyAgICAgKiBUaHJpZnQuVHlwZS5JMzIgICAgLT4gImkzMiI6IFNpZ25lZCAzMiBiaXQgaW50ZWdlci4KKyAgICAgKiBUaHJpZnQuVHlwZS5JNjQgICAgLT4gImk2NCI6IFNpZ25lZCA2NCBiaXQgaW50ZWdlci4KKyAgICAgKiBUaHJpZnQuVHlwZS5ET1VCTEUgLT4gImRibCI6IDY0IGJpdCBJRUVFIDg1NCBmbG9hdGluZyBwb2ludC4KKyAgICAgKiBUaHJpZnQuVHlwZS5TVFJVQ1QgLT4gInJlYyI6IEEgbXVsdGlmaWVsZCB0eXBlLgorICAgICAqIFRocmlmdC5UeXBlLlNUUklORyAtPiAic3RyIjogQXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMuCisgICAgICogVGhyaWZ0LlR5cGUuTUFQICAgIC0+ICJtYXAiOiBBIGNvbGxlY3Rpb24gdHlwZSAobWFwL2Fzc29jaWF0aXZlLWFycmF5L2RpY3Rpb25hcnkpLgorICAgICAqIFRocmlmdC5UeXBlLkxJU1QgICAtPiAibHN0IjogQSBjb2xsZWN0aW9uIHR5cGUgKHVub3JkZXJlZCkuCisgICAgICogVGhyaWZ0LlR5cGUuU0VUICAgIC0+ICJzZXQiOiBBIGNvbGxlY3Rpb24gdHlwZSAodW5vcmRlcmVkIGFuZCB3aXRob3V0IHJlcGVhdGVkIHZhbHVlcykuCisgICAgICovCisgICAgVHlwZTogeyBbazogbnVtYmVyXTogc3RyaW5nIH07CisKKyAgICAvKioKKyAgICAgKiBUaHJpZnQgSURMIHR5cGUgc3RyaW5nIHRvIElkIG1hcHBpbmcuCisgICAgICogVGhlIG1hcHBpbmcgdGFibGUgbG9va3MgYXMgZm9sbG93czoKKyAgICAgKiAidGYiICAtPiBUaHJpZnQuVHlwZS5CT09MICAKKyAgICAgKiAiaTgiICAtPiBUaHJpZnQuVHlwZS5CWVRFICAKKyAgICAgKiAiaTE2IiAtPiBUaHJpZnQuVHlwZS5JMTYgICAKKyAgICAgKiAiaTMyIiAtPiBUaHJpZnQuVHlwZS5JMzIgICAKKyAgICAgKiAiaTY0IiAtPiBUaHJpZnQuVHlwZS5JNjQgICAKKyAgICAgKiAiZGJsIiAtPiBUaHJpZnQuVHlwZS5ET1VCTEUKKyAgICAgKiAicmVjIiAtPiBUaHJpZnQuVHlwZS5TVFJVQ1QKKyAgICAgKiAic3RyIiAtPiBUaHJpZnQuVHlwZS5TVFJJTkcKKyAgICAgKiAibWFwIiAtPiBUaHJpZnQuVHlwZS5NQVAgICAKKyAgICAgKiAibHN0IiAtPiBUaHJpZnQuVHlwZS5MSVNUICAKKyAgICAgKiAic2V0IiAtPiBUaHJpZnQuVHlwZS5TRVQgICAKKyAgICAgKi8KKyAgICBSVHlwZTogeyBbazogc3RyaW5nXTogbnVtYmVyIH07CisKKyAgICAvKioKKyAgICAgKiBUaGUgVEpTT05Qcm90b2NvbCB2ZXJzaW9uIG51bWJlci4KKyAgICAgKi8KKyAgICBWZXJzaW9uOiBudW1iZXI7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyBhIFRocmlmdCBKU09OIHByb3RvY29sIGluc3RhbmNlLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlRyYW5zcG9ydH0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCB0byBzZXJpYWxpemUgdG8vZnJvbS4KKyAgICAgKi8KKyAgICBjb25zdHJ1Y3Rvcih0cmFuc3BvcnQ6IE9iamVjdCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICAgKiBAcmV0dXJucyB7VGhyaWZ0LlRyYW5zcG9ydH0gVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICAgICAqLworICAgIGdldFRyYW5zcG9ydCgpOiBPYmplY3Q7CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBUaHJpZnQgUlBDIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgc2VydmljZSBtZXRob2QgdG8gY2FsbC4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5NZXNzYWdlVHlwZX0gbWVzc2FnZVR5cGUgLSBUaGUgdHlwZSBvZiBtZXRob2QgY2FsbC4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gc2VxaWQgLSBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoaXMgY2FsbCAoYWx3YXlzIDAgaW4gQXBhY2hlIFRocmlmdCkuCisgICAgICovCisgICAgd3JpdGVNZXNzYWdlQmVnaW4obmFtZTogc3RyaW5nLCBtZXNzYWdlVHlwZTogbnVtYmVyLCBzZXFpZDogbnVtYmVyKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIFRocmlmdCBSUEMgbWVzc2FnZS4KKyAgICAgKi8KKyAgICB3cml0ZU1lc3NhZ2VFbmQoKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIHN0cnVjdC4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QuCisgICAgICovCisgICAgd3JpdGVTdHJ1Y3RCZWdpbihuYW1lPzogc3RyaW5nKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIHN0cnVjdC4KKyAgICAgKi8KKyAgICB3cml0ZVN0cnVjdEVuZCgpOiB2b2lkOworCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3RydWN0IGZpZWxkLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlByb3RvY29sLlR5cGV9IGZpZWxkVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGZpZWxkLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZElkIC0gVGhlIGZpZWxkJ3MgdW5pcXVlIGlkZW50aWZpZXIuCisgICAgICovCisgICAgd3JpdGVGaWVsZEJlZ2luKG5hbWU6IHN0cmluZywgZmllbGRUeXBlOiBudW1iZXIsIGZpZWxkSWQ6IG51bWJlcik6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBmaWVsZC4KKyAgICAgKi8KKyAgICB3cml0ZUZpZWxkRW5kKCk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgdGhlIHNldCBvZiBmaWVsZHMgZm9yIGEgc3RydWN0LgorICAgICAqLworICAgIHdyaXRlRmllbGRTdG9wKCk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBtYXAgY29sbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSBrZXlUeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUga2V5LgorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlR5cGV9IHZhbFR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSB2YWx1ZS4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NpemVdIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbWFwIChpZ25vcmVkKS4KKyAgICAgKi8KKyAgICB3cml0ZU1hcEJlZ2luKGtleVR5cGU6IG51bWJlciwgdmFsVHlwZTogbnVtYmVyLCBzaXplPzogbnVtYmVyKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIG1hcC4KKyAgICAgKi8KKyAgICB3cml0ZU1hcEVuZCgpOiB2b2lkOworCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbGlzdCBjb2xsZWN0aW9uLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlR5cGV9IGVsZW1UeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZWxlbWVudHMuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICAgICAqLworICAgIHdyaXRlTGlzdEJlZ2luKGVsZW1UeXBlOiBudW1iZXIsIHNpemU6IG51bWJlcik6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBsaXN0LgorICAgICAqLworICAgIHdyaXRlTGlzdEVuZCgpOiB2b2lkOworCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc2V0IGNvbGxlY3Rpb24uCisgICAgICogQHBhcmFtIHtUaHJpZnQuVHlwZX0gZWxlbVR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBlbGVtZW50cy4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QuCisgICAgICovCisgICAgd3JpdGVTZXRCZWdpbihlbGVtVHlwZTogbnVtYmVyLCBzaXplOiBudW1iZXIpOiB2b2lkOworCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc2V0LgorICAgICAqLworICAgIHdyaXRlU2V0RW5kKCk6IHZvaWQ7CisKKyAgICAvKiogU2VyaWFsaXplcyBhIGJvb2xlYW4gKi8KKyAgICB3cml0ZUJvb2wodmFsdWU6IGJvb2xlYW4pOiB2b2lkOworCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KKyAgICB3cml0ZUJ5dGUoaTg6IG51bWJlcik6IHZvaWQ7CisKKyAgICAvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworICAgIHdyaXRlSTE2KGkxNjogbnVtYmVyKTogdm9pZDsKKworICAgIC8qKiBTZXJpYWxpemVzIGEgbnVtYmVyICovCisgICAgd3JpdGVJMzIoaTMyOiBudW1iZXIpOiB2b2lkOworCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KKyAgICB3cml0ZUk2NChpNjQ6IG51bWJlcik6IHZvaWQ7CisKKyAgICAvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworICAgIHdyaXRlRG91YmxlKGRibDogbnVtYmVyKTogdm9pZDsKKworICAgIC8qKiBTZXJpYWxpemVzIGEgc3RyaW5nICovCisgICAgd3JpdGVTdHJpbmcoc3RyOiBzdHJpbmcpOiB2b2lkOworCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBzdHJpbmcgKi8KKyAgICB3cml0ZUJpbmFyeShzdHI6IHN0cmluZyk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgICBAY2xhc3MKKyAgICAgICBAbmFtZSBBbm9uUmVhZE1lc3NhZ2VCZWdpblJldHVybgorICAgICAgIEBwcm9wZXJ0eSB7c3RyaW5nfSBmbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIG1ldGhvZC4KKyAgICAgICBAcHJvcGVydHkge1RocmlmdC5NZXNzYWdlVHlwZX0gbXR5cGUgLSBUaGUgdHlwZSBvZiBtZXNzYWdlIGNhbGwuCisgICAgICAgQHByb3BlcnR5IHtudW1iZXJ9IHJzZXFpZCAtIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIG1lc3NhZ2UgKDAgaW4gVGhyaWZ0IFJQQykuCisgICAgICovCisgICAgLyoqIAorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWVzc2FnZS4gCisgICAgICogQHJldHVybnMge0Fub25SZWFkTWVzc2FnZUJlZ2luUmV0dXJufQorICAgICAqLworICAgIHJlYWRNZXNzYWdlQmVnaW4oKTogeyBmbmFtZTogc3RyaW5nOyBtdHlwZTogbnVtYmVyOyByc2VxaWQ6IG51bWJlciB9OworCisgICAgLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbWVzc2FnZS4gKi8KKyAgICByZWFkTWVzc2FnZUVuZCgpOiB2b2lkOworCisgICAgLyoqIAorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3RydWN0LiAKKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdIC0gVGhlIG5hbWUgb2YgdGhlIHN0cnVjdCAoaWdub3JlZCkuCisgICAgICogQHJldHVybnMge29iamVjdH0gLSBBbiBvYmplY3Qgd2l0aCBhbiBlbXB0eSBzdHJpbmcgZm5hbWUgcHJvcGVydHkuCisgICAgICovCisgICAgcmVhZFN0cnVjdEJlZ2luKG5hbWU/OiBzdHJpbmcpOiB7IGZuYW1lOiBzdHJpbmcgfTsKKworICAgIC8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIHN0cnVjdC4gKi8KKyAgICByZWFkU3RydWN0RW5kKCk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgICBAY2xhc3MKKyAgICAgICBAbmFtZSBBbm9uUmVhZEZpZWxkQmVnaW5SZXR1cm4KKyAgICAgICBAcHJvcGVydHkge3N0cmluZ30gZm5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZmllbGQgKGFsd2F5cyAnJykuCisgICAgICAgQHByb3BlcnR5IHtUaHJpZnQuVHlwZX0gZnR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBmaWVsZC4KKyAgICAgICBAcHJvcGVydHkge251bWJlcn0gZmlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBmaWVsZC4KKyAgICAgKi8KKyAgICAvKiogCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBmaWVsZC4gCisgICAgICogQHJldHVybnMge0Fub25SZWFkRmllbGRCZWdpblJldHVybn0KKyAgICAgKi8KKyAgICByZWFkRmllbGRCZWdpbigpOiB7IGZuYW1lOiBzdHJpbmc7IGZ0eXBlOiBudW1iZXI7IGZpZDogbnVtYmVyIH07CisKKyAgICAvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBmaWVsZC4gKi8KKyAgICByZWFkRmllbGRFbmQoKTogdm9pZDsKKworICAgIC8qKgorICAgICAgIEBjbGFzcworICAgICAgIEBuYW1lIEFub25SZWFkTWFwQmVnaW5SZXR1cm4KKyAgICAgICBAcHJvcGVydHkge1RocmlmdC5UeXBlfSBrdHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGtleS4KKyAgICAgICBAcHJvcGVydHkge1RocmlmdC5UeXBlfSB2dHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhbHVlLgorICAgICAgIEBwcm9wZXJ0eSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbWFwLgorICAgICAqLworICAgIC8qKiAKKyAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIG1hcC4gCisgICAgICogQHJldHVybnMge0Fub25SZWFkTWFwQmVnaW5SZXR1cm59CisgICAgICovCisgICAgcmVhZE1hcEJlZ2luKCk6IHsga3R5cGU6IG51bWJlcjsgdnR5cGU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH07CisKKyAgICAvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBtYXAuICovCisgICAgcmVhZE1hcEVuZCgpOiB2b2lkOworCisgICAgLyoqCisgICAgICAgQGNsYXNzCisgICAgICAgQG5hbWUgQW5vblJlYWRDb2xCZWdpblJldHVybgorICAgICAgIEBwcm9wZXJ0eSB7VGhyaWZ0LlR5cGV9IGV0eXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZWxlbWVudC4KKyAgICAgICBAcHJvcGVydHkge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgLyoqIAorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbGlzdC4gCisgICAgICogQHJldHVybnMge0Fub25SZWFkQ29sQmVnaW5SZXR1cm59CisgICAgICovCisgICAgcmVhZExpc3RCZWdpbigpOiB7IGV0eXBlOiBudW1iZXI7IHNpemU6IG51bWJlciB9OworCisgICAgLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbGlzdC4gKi8KKyAgICByZWFkTGlzdEVuZCgpOiB2b2lkOworCisgICAgLyoqIAorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc2V0LiAKKyAgICAgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSBlbGVtVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGVsZW1lbnRzIChpZ25vcmVkKS4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgKGlnbm9yZWQpLgorICAgICAqIEByZXR1cm5zIHtBbm9uUmVhZENvbEJlZ2luUmV0dXJufQorICAgICAqLworICAgIHJlYWRTZXRCZWdpbihlbGVtVHlwZT86IG51bWJlciwgc2l6ZT86IG51bWJlcik6IHsgZXR5cGU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH07CisKKyAgICAvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBzZXQuICovCisgICAgcmVhZFNldEVuZCgpOiB2b2lkOworCisgICAgLyoqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gCisgICAgICogIEZhbHNlIHVubGVzcyB0aGUgbmV4dCBudW1iZXIgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAKKyAgICAgKiAgaXMgMSwgaW4gd2hpY2ggY2FzZSB0aGUgdmFsdWUgcHJvcGVydHkgaXMgVHJ1ZS4gKi8KKyAgICByZWFkQm9vbCgpOiBPYmplY3Q7CisKKyAgICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUgCisgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlci4gKi8KKyAgICByZWFkQnl0ZSgpOiBPYmplY3Q7CisKKyAgICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUgCisgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlci4gKi8KKyAgICByZWFkSTE2KCk6IE9iamVjdDsKKworICAgIC8qKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZSAKKyAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyLiAqLworICAgIHJlYWRJMzIoZj86IGFueSk6IE9iamVjdDsKKworICAgIC8qKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZSAKKyAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyLiAqLworICAgIHJlYWRJNjQoKTogT2JqZWN0OworCisgICAgLyoqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlIAorICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIuICovCisgICAgcmVhZERvdWJsZSgpOiBPYmplY3Q7CisKKyAgICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUgCisgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlci4gKi8KKyAgICByZWFkU3RyaW5nKCk6IE9iamVjdDsKKworICAgIC8qKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZSAKKyAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyLiAqLworICAgIHJlYWRCaW5hcnkoKTogT2JqZWN0OworCisgICAgLyoqIAorICAgICAqIE1ldGhvZCB0byBhcmJpdHJhcmlseSBza2lwIG92ZXIgZGF0YSAobm90IGltcGxlbWVudGVkKS4KKyAgICAgKi8KKyAgICBza2lwKHR5cGU6IG51bWJlcik6IHZvaWQ7CisgIH0KKworICAvKioKKyAgICogT2xkIGFsaWFzIG9mIHRoZSBUWEhSVHJhbnNwb3J0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyAgICovCisgIGNsYXNzIFByb3RvY29sIGV4dGVuZHMgVEpTT05Qcm90b2NvbCB7IH0KKworICBjbGFzcyBNdWx0aXBsZXhQcm90b2NvbCBleHRlbmRzIFRKU09OUHJvdG9jb2wgeworICAgIHNlcnZpY2VOYW1lOiBzdHJpbmc7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyBhIE11dGlscGxleFByb3RvY29sIEltcGxlbWVudGF0aW9uIGFzIGEgV3JhcHBlciBmb3IgVGhyaWZ0LlByb3RvY29sLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzcnZOYW1lCisgICAgICogQHBhcmFtIHtUaHJpZnQuVHJhbnNwb3J0fSB0cmFucworICAgICAqIEBwYXJhbSB7YW55fSBbc3RyaWN0UmVhZF0KKyAgICAgKiBAcGFyYW0ge2FueX0gW3N0cmljdFdyaXRlXQorICAgICAqLworICAgIGNvbnN0cnVjdG9yKHNydk5hbWU6IHN0cmluZywgdHJhbnM6IE9iamVjdCwgc3RyaWN0UmVhZD86IGFueSwgc3RyaWN0V3JpdGU/OiBhbnkpOworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgd3JpdGVNZXNzYWdlQmVnaW4gbWV0aG9kIG9mIHByb3RvdHlwZQorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBSUEMgbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBzZXJ2aWNlIG1ldGhvZCB0byBjYWxsLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0Lk1lc3NhZ2VUeXBlfSBtZXNzYWdlVHlwZSAtIFRoZSB0eXBlIG9mIG1ldGhvZCBjYWxsLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzZXFpZCAtIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhpcyBjYWxsIChhbHdheXMgMCBpbiBBcGFjaGUgVGhyaWZ0KS4KKyAgICAgKi8KKyAgICB3cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBzdHJpbmcsIHR5cGU6IG51bWJlciwgc2VxaWQ6IG51bWJlcik6IHZvaWQ7CisgIH0KKworICBjbGFzcyBNdWx0aXBsZXhlciB7CisgICAgc2VxaWQ6IG51bWJlcjsKKworICAgIC8qKgorICAgICAqIEluc3RhbnRpYXRlcyBhIG11bHRpcGxleGVkIGNsaWVudCBmb3IgYSBzcGVjaWZpYyBzZXJ2aWNlLgorICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzZXJ2aWNlTmFtZSAtIFRoZSB0cmFuc3BvcnQgdG8gc2VyaWFsaXplIHRvL2Zyb20uCisgICAgICogQHBhcmFtIHtUaHJpZnQuU2VydmljZUNsaWVudH0gU0NsIC0gVGhlIFNlcnZpY2UgQ2xpZW50IENsYXNzLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlRyYW5zcG9ydH0gdHJhbnNwb3J0IC0gVGhyaWZ0LlRyYW5zcG9ydCBpbnN0YW5jZSB3aGljaCBwcm92aWRlcyByZW1vdGUgaG9zdDpwb3J0LgorICAgICAqLworICAgIGNyZWF0ZUNsaWVudChzZXJ2aWNlTmFtZTogc3RyaW5nLCBTQ2w6IGFueSwgdHJhbnNwb3J0OiBPYmplY3QpOiBhbnk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi94bWwvTWFrZWZpbGUuYW0gYi9saWIveG1sL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYWQ2YmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIveG1sL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0KKworaWYgV0lUSF9KQVZBCisjIFNjaGVtYSB2YWxpZGF0aW9uIHRlc3QgZGVwZW5kcyBvbiBqYXZhCitTVUJESVJTICs9IHRlc3QKK2VuZGlmCisKK0VYVFJBX0RJU1QgPSBcCisgIHRocmlmdC1pZGwueHNkIFwKKyAgdGVzdApkaWZmIC0tZ2l0IGEvbGliL3htbC90ZXN0L01ha2VmaWxlLmFtIGIvbGliL3htbC90ZXN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiODdhNTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIveG1sL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyNiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2NoZWNrOgorCSQoQU5UKSAkKEFOVF9GTEFHUykgdGVzdAorCisjIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBhbnQgaXMgbm90IGNvbmZpZ3VyZWQuCitjbGVhbi1sb2NhbDoKKwlBTlQ9JChBTlQpIDsgaWYgdGVzdCAteiAiJCRBTlQiIDsgdGhlbiBBTlQ9OiA7IGZpIDsgXAorCSQkQU5UICQoQU5UX0ZMQUdTKSBjbGVhbgpkaWZmIC0tZ2l0IGEvbGliL3htbC90ZXN0L2J1aWxkLnhtbCBiL2xpYi94bWwvdGVzdC9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlOTVjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi94bWwvdGVzdC9idWlsZC54bWwKQEAgLTAsMCArMSwxMTIgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJYTUwgU2NoZW1hIFRlc3QiIGRlZmF1bHQ9InRlc3QiIGJhc2VkaXI9Ii4iPgorCisgIDxkZXNjcmlwdGlvbj5YTUwgU2NoZW1hIFZhbGlkYXRpb24gVGVzdDwvZGVzY3JpcHRpb24+CisKKyAgPHByb3BlcnR5IG5hbWU9InhtbC5kaXIiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uIiAvPgorICA8cHJvcGVydHkgbmFtZT0iZ2VuLnhtbC5kaXIiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uL2dlbi14bWwiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJpZGwueG1sLnNjaGVtYSIgbG9jYXRpb249IiR7eG1sLmRpcn0vdGhyaWZ0LWlkbC54c2QiIC8+CisKKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5kaXIiIGxvY2F0aW9uPSIuLi8uLi8uLi8iIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQudGVzdC5kaXIiIGxvY2F0aW9uPSIke3RocmlmdC5kaXJ9L3Rlc3QiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuY29tcGlsZXIiIGxvY2F0aW9uPSIke3RocmlmdC5kaXJ9L2NvbXBpbGVyL2NwcC90aHJpZnQiIC8+CisKKyAgPHByb3BlcnR5IGZpbGU9IiR7YmFzZWRpcn0vYnVpbGQucHJvcGVydGllcyIgLz4KKworICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGVyLmNoZWNrIj4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjEiPgorICAgICAgICAgICAgPGZpbGVzZXQgaWQ9ImZzIiBmaWxlPSIke3RocmlmdC5jb21waWxlcn0iLz4KKyAgICAgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgICBUaHJpZnQgY29tcGlsZXIgaXMgbWlzc2luZyAhCisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9ImNvbXBpbGVyLmNoZWNrLCBta2RpcnMiPgorICAgIDx0c3RhbXAgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJta2RpcnMiPgorICAgIDxta2RpciBkaXI9IiR7Z2VuLnhtbC5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUiIGRlcGVuZHM9ImluaXQiPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L1RocmlmdFRlc3QudGhyaWZ0Ii8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vSW5jbHVkZS50aHJpZnQiLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9SZWN1cnNpdmUudGhyaWZ0Ii8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vTWFueU9wdGlvbmFscy50aHJpZnQiLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQiLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9Db25zdGFudHNEZW1vLnRocmlmdCIvPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L1R5cGVkZWZUZXN0LnRocmlmdCIgLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9Bbm5vdGF0aW9uVGVzdC50aHJpZnQiIC8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vRG9jVGVzdC50aHJpZnQiIC8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vRW51bVRlc3QudGhyaWZ0IiAvPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L01hbnlUeXBlZGVmcy50aHJpZnQiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249InJ1biBzY2hlbWEgdmFsaWRhdGlvbiIKKyAgICAgICAgICBkZXBlbmRzPSJ2YWxpZGF0ZS1nZW5lcmF0ZWQteG1sIi8+CisgICAgCisgIDx0YXJnZXQgbmFtZT0idmFsaWRhdGUtZ2VuZXJhdGVkLXhtbCIgZGVwZW5kcz0iaW5pdCwgZ2VuZXJhdGUiPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vVGhyaWZ0VGVzdC54bWwiLz4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L0luY2x1ZGUueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9SZWN1cnNpdmUueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9NYW55T3B0aW9uYWxzLnhtbCIvPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vT3B0aW9uYWxSZXF1aXJlZFRlc3QueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9Db25zdGFudHNEZW1vLnhtbCIvPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vVHlwZWRlZlRlc3QueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9Bbm5vdGF0aW9uVGVzdC54bWwiLz4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L0RvY1Rlc3QueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9FbnVtVGVzdC54bWwiLz4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L01hbnlUeXBlZGVmcy54bWwiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIgLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtnZW4ueG1sLmRpcn0iIC8+CisgIDwvdGFyZ2V0PgorCisgIDxtYWNyb2RlZiBuYW1lPSJnZW5lcmF0ZS14bWwiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgLz4KKyAgICA8c2VxdWVudGlhbD4KKyAgICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7dGhyaWZ0LmNvbXBpbGVyfSIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgICA8YXJnIGxpbmU9Ii1nZW4geG1sOm1lcmdlIi8+CisgICAgICAgIDxhcmcgbGluZT0iLW91dCAke2dlbi54bWwuZGlyfSIvPgorICAgICAgICA8YXJnIGxpbmU9IkB7ZmlsZX0iLz4KKyAgICAgIDwvZXhlYz4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKyAgPG1hY3JvZGVmIG5hbWU9InZhbGlkYXRlLXhtbCI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiAvPgorICAgIDxzZXF1ZW50aWFsPgorICAgICAgPGVjaG8gbWVzc2FnZT0idmFsaWRhdGluZyBnZW5lcmF0ZWQgWE1MOiBAe2ZpbGV9IiAvPgorICAgICAgPHNjaGVtYXZhbGlkYXRlIGZpbGU9IkB7ZmlsZX0iPgorICAgICAgICA8c2NoZW1hIG5hbWVzcGFjZT0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL3htbC9pZGwiIAorICAgICAgICAgICAgICAgIGZpbGU9IiR7aWRsLnhtbC5zY2hlbWF9IiAvPgorICAgICAgPC9zY2hlbWF2YWxpZGF0ZT4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi94bWwvdGhyaWZ0LWlkbC54c2QgYi9saWIveG1sL3RocmlmdC1pZGwueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZGQ2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIveG1sL3RocmlmdC1pZGwueHNkCkBAIC0wLDAgKzEsMjgzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL3htbC9pZGwiIAorICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy94bWwvaWRsIiAKKyAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgorCisgIDxlbGVtZW50IG5hbWU9ImlkbCIgdHlwZT0idG5zOklETCIgLz4KKyAgPGVsZW1lbnQgbmFtZT0iZG9jdW1lbnQiIHR5cGU9InRuczpEb2N1bWVudCIgLz4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iSURMIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCByZWY9InRuczpkb2N1bWVudCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwvc2VxdWVuY2U+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkRvY3VtZW50Ij4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJpbmNsdWRlIiB0eXBlPSJ0bnM6SW5jbHVkZSIgLz4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ0bnM6TmFtZXNwYWNlIiAvPgorICAgICAgPC9jaG9pY2U+CisgICAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJleGNlcHRpb24iIHR5cGU9InRuczpFeGNlcHRpb24iIC8+CisgICAgICAgIDxlbGVtZW50IG5hbWU9InR5cGVkZWYiIHR5cGU9InRuczpUeXBlZGVmIiAvPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJzZXJ2aWNlIiB0eXBlPSJ0bnM6U2VydmljZSIgLz4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0ic3RydWN0IiB0eXBlPSJ0bnM6U3RydWN0IiAvPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJjb25zdCIgdHlwZT0idG5zOkNvbnN0IiAvPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJ1bmlvbiIgdHlwZT0idG5zOlVuaW9uIiAvPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJlbnVtIiB0eXBlPSJ0bnM6RW51bSIgLz4KKyAgICAgIDwvY2hvaWNlPgorICAgIDwvc2VxdWVuY2U+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIHR5cGU9ImFueVVSSSIgdXNlPSJvcHRpb25hbCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImRvYyIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJJbmNsdWRlIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iTmFtZXNwYWNlIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiB0eXBlPSJ0bnM6QW5ub3RhdGlvbiIgCisgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgIDwvc2VxdWVuY2U+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGdyb3VwIG5hbWU9IkFic3RyYWN0U3RydWN0Ij4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0idG5zOkZpZWxkIiAKKyAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiB0eXBlPSJ0bnM6QW5ub3RhdGlvbiIgCisgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgIDwvc2VxdWVuY2U+CisgIDwvZ3JvdXA+CisKKyAgPGF0dHJpYnV0ZUdyb3VwIG5hbWU9IlN0cnVjdEF0dHJpYnV0ZXMiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+CisgIDwvYXR0cmlidXRlR3JvdXA+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkV4Y2VwdGlvbiI+CisgICAgPGdyb3VwIHJlZj0idG5zOkFic3RyYWN0U3RydWN0IiAvPgorICAgIDxhdHRyaWJ1dGVHcm91cCByZWY9InRuczpTdHJ1Y3RBdHRyaWJ1dGVzIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJTZXJ2aWNlIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJtZXRob2QiIHR5cGU9InRuczpNZXRob2QiIAorICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImFubm90YXRpb24iIHR5cGU9InRuczpBbm5vdGF0aW9uIiAKKyAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgPC9zZXF1ZW5jZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldE5hbWVzcGFjZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFyZW50LW1vZHVsZSIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFyZW50LWlkIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+IAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZCI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0icmV0dXJucyIgdHlwZT0idG5zOlRocmlmdFR5cGUiIC8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJhcmciIHR5cGU9InRuczpGaWVsZCIgCisgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgICAgPGVsZW1lbnQgbmFtZT0idGhyb3dzIiB0eXBlPSJ0bnM6RmllbGQiIAorICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImFubm90YXRpb24iIHR5cGU9InRuczpBbm5vdGF0aW9uIiAKKyAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgPC9zZXF1ZW5jZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im9uZXdheSIgdHlwZT0iYm9vbGVhbiIgdXNlPSJvcHRpb25hbCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImRvYyIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJUeXBlZGVmIj4KKyAgICA8Y29tcGxleENvbnRlbnQ+CisgICAgICA8ZXh0ZW5zaW9uIGJhc2U9InRuczpUaHJpZnRUeXBlIj4KKyAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImFubm90YXRpb24iIHR5cGU9InRuczpBbm5vdGF0aW9uIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2MiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KKyAgICAgIDwvZXh0ZW5zaW9uPgorICAgIDwvY29tcGxleENvbnRlbnQ+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IlN0cnVjdCI+CisgICAgPGdyb3VwIHJlZj0idG5zOkFic3RyYWN0U3RydWN0IiAvPgorICAgIDxhdHRyaWJ1dGVHcm91cCByZWY9InRuczpTdHJ1Y3RBdHRyaWJ1dGVzIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJVbmlvbiI+CisgICAgPGdyb3VwIHJlZj0idG5zOkFic3RyYWN0U3RydWN0IiAvPgorICAgIDxhdHRyaWJ1dGVHcm91cCByZWY9InRuczpTdHJ1Y3RBdHRyaWJ1dGVzIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJFbnVtIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJtZW1iZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iYW5ub3RhdGlvbiIgdHlwZT0idG5zOkFubm90YXRpb24iIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9ImludCIgLz4KKyAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4cGxpY2l0IiB0eXBlPSJib29sZWFuIiAvPgorICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIC8+CisgICAgICAgIDwvY29tcGxleFR5cGU+CisgICAgICA8L2VsZW1lbnQ+CisgICAgICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiB0eXBlPSJ0bnM6QW5ub3RhdGlvbiIgCisgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICA8L3NlcXVlbmNlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkZpZWxkIj4KKyAgICA8Y29tcGxleENvbnRlbnQ+CisgICAgICA8ZXh0ZW5zaW9uIGJhc2U9InRuczpUaHJpZnRUeXBlIj4KKyAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImRlZmF1bHQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KKyAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgPGdyb3VwIHJlZj0idG5zOkNvbnN0VmFsdWUiIC8+CisgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgorICAgICAgICAgIDwvZWxlbWVudD4KKyAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiB0eXBlPSJ0bnM6QW5ub3RhdGlvbiIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWVsZC1pZCIgdHlwZT0ibG9uZyIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVxdWlyZWQiIHR5cGU9InRuczpSZXF1aXJlZG5lc3MiIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIC8+CisgICAgICA8L2V4dGVuc2lvbj4KKyAgICA8L2NvbXBsZXhDb250ZW50PgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxzaW1wbGVUeXBlIG5hbWU9IlJlcXVpcmVkbmVzcyI+CisgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InJlcXVpcmVkIiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJvcHRpb25hbCIgLz4KKyAgICA8L3Jlc3RyaWN0aW9uPgorICA8L3NpbXBsZVR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkFubm90YXRpb24iPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ia2V5IiB0eXBlPSJzdHJpbmciIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ic3RyaW5nIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJDb25zdCI+CisgICAgPGNvbXBsZXhDb250ZW50PgorICAgICAgPGV4dGVuc2lvbiBiYXNlPSJ0bnM6VGhyaWZ0VHlwZSI+CisgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICA8Z3JvdXAgcmVmPSJ0bnM6Q29uc3RWYWx1ZSIgLz4KKyAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIC8+CisgICAgICA8L2V4dGVuc2lvbj4KKyAgICA8L2NvbXBsZXhDb250ZW50PgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJDb25zdExpc3QiPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImVudHJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgIDxncm91cCByZWY9InRuczpDb25zdFZhbHVlIiAvPgorICAgICAgICA8L2NvbXBsZXhUeXBlPgorICAgICAgPC9lbGVtZW50PgorICAgIDwvc2VxdWVuY2U+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkNvbnN0TWFwIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJlbnRyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJrZXkiPgorICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgPGdyb3VwIHJlZj0idG5zOkNvbnN0VmFsdWUiIC8+CisgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+CisgICAgICAgICAgICA8L2VsZW1lbnQ+CisgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YWx1ZSI+CisgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICA8Z3JvdXAgcmVmPSJ0bnM6Q29uc3RWYWx1ZSIgLz4KKyAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwvZWxlbWVudD4KKyAgICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICA8L2NvbXBsZXhUeXBlPgorICAgICAgPC9lbGVtZW50PgorICAgIDwvc2VxdWVuY2U+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGdyb3VwIG5hbWU9IkNvbnN0VmFsdWUiPgorICAgIDxjaG9pY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJzdHJpbmciIHR5cGU9InN0cmluZyIgLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImRvdWJsZSIgdHlwZT0iZG91YmxlIiAvPgorICAgICAgPGVsZW1lbnQgbmFtZT0ibGlzdCIgdHlwZT0idG5zOkNvbnN0TGlzdCIgLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9Im1hcCIgdHlwZT0idG5zOkNvbnN0TWFwIiAvPgorICAgICAgPGVsZW1lbnQgbmFtZT0iaW50IiB0eXBlPSJsb25nIiAvPgorICAgIDwvY2hvaWNlPgorICA8L2dyb3VwPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJUaHJpZnRUeXBlIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWxlbVR5cGUiIHR5cGU9InRuczpUaHJpZnRUeXBlIiAvPgorICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ia2V5VHlwZSIgdHlwZT0idG5zOlRocmlmdFR5cGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgorICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhbHVlVHlwZSIgdHlwZT0idG5zOlRocmlmdFR5cGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgorICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgPC9jaG9pY2U+CisgICAgPC9zZXF1ZW5jZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InRuczpUeXBlSWRlbnRpZmllciIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUtbW9kdWxlIiB0eXBlPSJzdHJpbmciIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlLWlkIiB0eXBlPSJzdHJpbmciIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPHNpbXBsZVR5cGUgbmFtZT0iVHlwZUlkZW50aWZpZXIiPgorICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJ2b2lkIiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJib29sIiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJieXRlIiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJpOCIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iaTE2IiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJpMzIiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Imk2NCIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZG91YmxlIiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJiaW5hcnkiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InN0cmluZyIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iaWQiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Im1hcCIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ic2V0IiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJsaXN0IiAvPgorICAgIDwvcmVzdHJpY3Rpb24+CisgIDwvc2ltcGxlVHlwZT4KKworPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wYWNrYWdlLWxvY2suanNvbiBiL3BhY2thZ2UtbG9jay5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNjVhYTYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlLWxvY2suanNvbgpAQCAtMCwwICsxLDIxODMgQEAKK3sKKyAgIm5hbWUiOiAidGhyaWZ0IiwKKyAgInZlcnNpb24iOiAiMS4wLjAiLAorICAibG9ja2ZpbGVWZXJzaW9uIjogMSwKKyAgInJlcXVpcmVzIjogdHJ1ZSwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAiQGJhYmVsL2NvZGUtZnJhbWUiOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGJhYmVsL2NvZGUtZnJhbWUvLS9jb2RlLWZyYW1lLTcuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PZkMydWVtYWtuWHI4N2JkTFVrV29nN25ZdWxpTTlJajVIVWNhanNWY01DcFFyY0xtdHhSYlZGVElxbWNTa1NlWVJCRkJSeHMyRmlVcUZKRExkaWViQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiQGJhYmVsL2hpZ2hsaWdodCI6ICJeNy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiQGJhYmVsL2hpZ2hsaWdodCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjcuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AYmFiZWwvaGlnaGxpZ2h0Ly0vaGlnaGxpZ2h0LTcuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1VRk1DNFplRkM0OFRwdmo3QzhVZ0x2dGthVXVvdlFYKzV4Tldyc0lvTUc4bzJ6K1hGS2pLYU45aVZtUzg0ZFB3Vk4wMFc0d1BtcXZZb1pGM0VHQXNmdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhbGsiOiAiXjIuMC4wIiwKKyAgICAgICAgImVzdXRpbHMiOiAiXjIuMC4yIiwKKyAgICAgICAgImpzLXRva2VucyI6ICJeNC4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiQHR5cGVzL25vZGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxMC4xMi42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdHlwZXMvbm9kZS8tL25vZGUtMTAuMTIuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItK1pXQjVFYzFpa2k5OXhRRnpCbGl2bEt4U1pRK2Z1VUtCb3R0OFN0Qk9uTE40ZFdiUkhsZ2RnMVhrbnBXNmcwdHdlbmlONURjT3FBNjRDSnlPVVBTQXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIkB0eXBlcy9xIjogeworICAgICAgInZlcnNpb24iOiAiMS41LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B0eXBlcy9xLy0vcS0xLjUuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZXF6OGMvMGt3TmkvT0VIUWZ2SXVKVkxUc3QzaW4wZTd1VEtldVkrV0wvemZLbjB4VnVqT1RwNDJiUy92VVVva2hLNVAyQnBwTGQ5SlhNT01IY2diakE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFiYnJldiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hYmJyZXYvLS9hYmJyZXYtMS4wLjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1rYlI1SllpbmM0d2w4MTNXOWpkU292aDNZVFU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYWNvcm4iOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYWNvcm4vLS9hY29ybi02LjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItR1htS0l2YnJOM1RWN2FWcUF6VkZhTVc4Rjh3elZYN3ZvRUJSTzNiREE2NCtFWDM3WVNheWdnUkpQNVhpZzZIWUhCa1dLcEZnOVc1Z2c2b3JrbHViaGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFjb3JuLWpzeCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hY29ybi1qc3gvLS9hY29ybi1qc3gtNS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVhrQjUwZm4wTVVSRHl3dzkrVVlMM2MxeUxiT0J6MFpGdnJkWWxHQjhsK0lqZTFvU0M3NXFBcXJ6U1BqWVFiZG5RVXpobFVHTkt1ZXNyeUF2MGd4Wk9nPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhanYiOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjUuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYWp2Ly0vYWp2LTYuNS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi00V3lqdDgrdDZZc3pxYVhuTERmTW1HLzhBbE81WmJjc3kzQVRIbmNDempXL05vUHpBSWQ4QUs2NzQ5WWJqbWR0K2tVWTFnUDYwZkN1NDZvRHhQdi9tZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZmFzdC1kZWVwLWVxdWFsIjogIl4yLjAuMSIsCisgICAgICAgICJmYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeSI6ICJeMi4wLjAiLAorICAgICAgICAianNvbi1zY2hlbWEtdHJhdmVyc2UiOiAiXjAuNC4xIiwKKyAgICAgICAgInVyaS1qcyI6ICJeNC4yLjIiCisgICAgICB9CisgICAgfSwKKyAgICAiYW1kZWZpbmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW1kZWZpbmUvLS9hbWRlZmluZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVNsS0NyQlpIS2VrMkdiejlPdEZSK0JmT2tmVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiYW5zaS1lc2NhcGVzIjogeworICAgICAgInZlcnNpb24iOiAiMy4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktZXNjYXBlcy8tL2Fuc2ktZXNjYXBlcy0zLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVWdBYjhIOUQ0MUFRbnUvUGJXbENvZlFWY25WNEdzMmJCSmk5ZVpQeGZVL2hnZ2xGaDNTTURNRU5SSXFkcjdINlhGblhkb2tuY3RGQnlWc0NPb3RUVnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFuc2ktcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1yZWdleC8tL2Fuc2ktcmVnZXgtMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03UU1Yd3lJR1QzbEdiQUtXYTkyMkJhczMyWmc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYW5zaS1zdHlsZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1zdHlsZXMvLS9hbnNpLXN0eWxlcy0zLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVlQwWkk2a1pSZFRoOFl5SnczU01iWW0vdStOcWZzQXhFcFdPMFBmOXNxOC9lOTRXeHhPcFBLeDlGUjFGbHlDdE9WRE5PUSs4bnRscUZ4aVJjK3I1cUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbG9yLWNvbnZlcnQiOiAiXjEuOS4wIgorICAgICAgfQorICAgIH0sCisgICAgImFwcm9iYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcHJvYmEvLS9hcHJvYmEtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVk5SjZaalh0b1loOFJuWFZDTU9VL3R0RG1rMWFCanVucTl2TzB0YTV4ODVXRFFpUWZVRjlzSVBCSVRkYmlpSVZjQm8wM0hpM2pNeGlnQnRzZGRsWFJ3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcmUtd2UtdGhlcmUteWV0IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FyZS13ZS10aGVyZS15ZXQvLS9hcmUtd2UtdGhlcmUteWV0LTEuMS41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi01aFlkQWtabGNHOHRPTHVqVkRUZ0NUK3VQWDBWbnBBSDI4Z1dzTGZ6cFhZbTd3UDZtcDVRL2dZeVI3WVEwY0tWSmNYSm5sM2oya3BCYW4xM1B0UWY2dz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVsZWdhdGVzIjogIl4xLjAuMCIsCisgICAgICAgICJyZWFkYWJsZS1zdHJlYW0iOiAiXjIuMC42IgorICAgICAgfQorICAgIH0sCisgICAgImFyZ3BhcnNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEwIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcmdwYXJzZS8tL2FyZ3BhcnNlLTEuMC4xMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbzVSb3k2dE5HNFNML0ZPa0NBTjZSemppYWtaUzI1UkxZRnJjTXR0SnFiZGQ4QldybkErZkd6NTdpTjVQYjA2cHZCR3ZsNWdRMEI0OGRKbHNsWHZvVGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNwcmludGYtanMiOiAifjEuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgImFycmF5LXVuaW9uIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LXVuaW9uLy0vYXJyYXktdW5pb24tMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1talJCRGs5T1BhSTk2amRiNWI1dzhrZDQ3RGs9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyYXktdW5pcSI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiYXJyYXktdW5pcSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnJheS11bmlxLy0vYXJyYXktdW5pcS0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXIycklkNkpjeC9kT0JZaVVkVGhZMzlzay9iWT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnJpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyaWZ5Ly0vYXJyaWZ5LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaVlVSTJpSW04NERma0Vjb1JXaEp3VkFhU3cwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzeW5jIjogeworICAgICAgInZlcnNpb24iOiAiMS41LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXN5bmMvLS9hc3luYy0xLjUuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTdHcGhybFpJREF3OHNrSEpWaGppQ0pMNVp5bz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhc3luYy1saW1pdGVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5jLWxpbWl0ZXIvLS9hc3luYy1saW1pdGVyLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qcC91Rm5vb09pTytMMjExZVpPb1N5enBPSVRNWHgxckJJVGF1WXlrRzNCUllQdThoMFVjeHNQTkIwNFJSNXZvNFR5ejMrYXkxN3RSNkpWZjlxellXZz09IgorICAgIH0sCisgICAgImJhYnlsb24iOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjAuMC1iZXRhLjE5IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iYWJ5bG9uLy0vYmFieWxvbi03LjAuMC1iZXRhLjE5LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1WZzBDOXMvUkVYNi9XSVhOMzdVS3B2NVpoUmk2QTRwakhscGtFMzQrOC9hNmMyVzFRNjkybjNobWMrU1pHNWxLUm5hRXhMVWJ4dEoxU1ZUK0thQ1EvQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYmFsYW5jZWQtbWF0Y2giOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmFsYW5jZWQtbWF0Y2gvLS9iYWxhbmNlZC1tYXRjaC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWliVFJtYXNyN2tuZUZrNmdLNG5PUmkxeHQyYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJiaW5kaW5ncyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iaW5kaW5ncy8tL2JpbmRpbmdzLTEuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1EcExoNUV6TVIya3p2WDFLSWxWQzBWa0MzaVp0SEtUZ2R0WjBhM3BnbEJaZGFRRmp0NVM5Zzl4ZDFsRStZdlh5ZmQ2bXRDZVJuclVmT0xZaVRNbE5Tdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYmwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ibC8tL2JsLTEuMi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lOHRRWW5ab2RtZWJZRFdHSDdLTVJ2dHpLWGFKSHgzQmJpbHJnWkNmdnlMVVlkS3BLMXQ1UFNQbXBrbnkvU2dpVFNDbmpmTFc3djVybE9OWFZGa1FFQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIl4yLjMuNSIsCisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJeNS4xLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiYmx1ZWJpcmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmx1ZWJpcmQvLS9ibHVlYmlyZC0zLjUuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZGhIVFdNSTdrTXg1d2hNUW50bDdWcjlDNkJ2VjEwbEZYREFhc25xbnJNWWhYVkN6ems2SU85Rm8yTDc1alhIVDA3V3JPbmdMMVdEWE9wK3lZUzkxWWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJyYWNlLWV4cGFuc2lvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnJhY2UtZXhwYW5zaW9uLy0vYnJhY2UtZXhwYW5zaW9uLTEuMS4xMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItaUN1UEhERmdySFg3SDJ2RUkvNXhwejA3elNIQjAwVHB1Z3FobVl0Vm1NTzY1MThtQ3VSTW9PWUZsZEVCbDBnMTg3dWZvemRhSGdXS2NZRmI2MXFHaUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJhbGFuY2VkLW1hdGNoIjogIl4xLjAuMCIsCisgICAgICAgICJjb25jYXQtbWFwIjogIjAuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImJ1ZmZlci1hbGxvYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXItYWxsb2MvLS9idWZmZXItYWxsb2MtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUNGc0hRZ2p0VzFVQ2hkWGdieUpHdG5tK08vdUxRZVpkdGJEbzhtZlVnWVhDSFNNMXdnclZ4WG02YlN5clV1RXJFYis0c1lWR0N6QVNCUm90N3p5cm93PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJidWZmZXItYWxsb2MtdW5zYWZlIjogIl4xLjEuMCIsCisgICAgICAgICJidWZmZXItZmlsbCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYnVmZmVyLWFsbG9jLXVuc2FmZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXItYWxsb2MtdW5zYWZlLy0vYnVmZmVyLWFsbG9jLXVuc2FmZS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVEVNMmlNSUVRZEoyeWpQSm9TSXNsZG5sZVZhQWsxb1czREJWVXlreU9Mc0VzRm1FYzlrbitTRkZQeitnbDU0S1FOeGxEbkF3Q1hvc09TOU9reDJ4QWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJ1ZmZlci1lcXVhbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXItZXF1YWxzLy0vYnVmZmVyLWVxdWFscy0xLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUExTzFUOUIvMlZaQmNHY2E1dlpyblBFTkovVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJidWZmZXItZmlsbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXItZmlsbC8tL2J1ZmZlci1maWxsLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtK1BlTGRuaVlpTzg1OGdYTlkzOW81d0lTS3l3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNhbGxlci1wYXRoIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NhbGxlci1wYXRoLy0vY2FsbGVyLXBhdGgtMC4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sQWhlOWpXQjdOUGFxU1JFcVA2VTZDVjNkUjg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2FsbHNpdGVzIjogIl4wLjIuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjYWxsc2l0ZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2FsbHNpdGVzLy0vY2FsbHNpdGVzLTAuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcjZ1V0ppa1FwL004R2FWM1dDWEduelRqVU1vPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNhdGhhcnNpcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuOC45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYXRoYXJzaXMvLS9jYXRoYXJzaXMtMC44LjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tTXlKREtaUzNTN3c1d3Mza2xNUS81NlEvSXM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidW5kZXJzY29yZS1jb250cmliIjogIn4wLjMuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjaGFsayI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaGFsay8tL2NoYWxrLTIuNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PYk42aDF2MmZUSlNtVVhvUzNuTVE5MkxiREs5YmU0VFYrNkcrb21RbEdKRmRjVVg1aGVLaTFMWjFZblJNSWd3VExFajNFMjRiVDZ0WW5pNTBybENmUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYW5zaS1zdHlsZXMiOiAiXjMuMi4xIiwKKyAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuNSIsCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6ICJeNS4zLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2hhcmRldCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaGFyZGV0Ly0vY2hhcmRldC0wLjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbVQ4aURjcmgwM3FER1JSbW9BMmhtQkpueHBsbE1SKzAvMHFsempxWkVTNk5kaVdEY1prQ05BazRyUEZaOVE4NXIyN3Vua2lOTmc4Wk9pd1pYQkh3Y0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNob3duciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaG93bnIvLS9jaG93bnItMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWozOEV2TzUrTEhYODRqbG82aDRVem1Pd2kwVWdXNjFXUnlQdEp6NHFhYWRLNWVZM0JUUzVUWS9TMVN0YzNVazJsSU02VFBldkFsVUxpRUp3aWU4NjBnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjaXJjdWxhci1qc29uIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NpcmN1bGFyLWpzb24vLS9jaXJjdWxhci1qc29uLTAuMy4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1VWkszTkJ4Mk1jYStiNUxzRzdiWTE4M3BIV3Q1WTF4dHM0UDNQejdFTlR3R1ZuSk9VV2JSYjNvY2p2WDdoeDl0cS95VEFkY2xYbTlzWjM4Z051ZW00QT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2xpLWN1cnNvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jbGktY3Vyc29yLy0vY2xpLWN1cnNvci0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXMxMnNOMlI1K3N3K2xIUjlRZERROVNPUC9MVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJyZXN0b3JlLWN1cnNvciI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2xpLXdpZHRoIjogeworICAgICAgInZlcnNpb24iOiAiMi4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NsaS13aWR0aC8tL2NsaS13aWR0aC0yLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLS94bnQ2S21sNVhreVFVZXd3UjhQdkxxKzFqaz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb2RlLXBvaW50LWF0IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvZGUtcG9pbnQtYXQvLS9jb2RlLXBvaW50LWF0LTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRFFjTFRRUTZXK296b3ZHa0RpN2JQWnBNejNjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbG9yLWNvbnZlcnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjkuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29sb3ItY29udmVydC8tL2NvbG9yLWNvbnZlcnQtMS45LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVFmQVV0ZCt2RmRBdEZRY0M4Q0N5WXQxZllXeFNxQWlLMmNTRDZ6REI4TjNjcHNFQkF2UnhwOXpPR2c2Ry9TSEhKWUFUODgvYXovSXVER0FMc05WYkdnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb2xvci1uYW1lIjogIjEuMS4zIgorICAgICAgfQorICAgIH0sCisgICAgImNvbG9yLW5hbWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29sb3ItbmFtZS8tL2NvbG9yLW5hbWUtMS4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1wOUJWaTlpY1F2ZVYzVUl5ajNRSU1jcFR2Q1U9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29tbWFuZGVyIjogeworICAgICAgInZlcnNpb24iOiAiMi4xOS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb21tYW5kZXIvLS9jb21tYW5kZXItMi4xOS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi02dHZBT08rRDZPRU52UkFoNTI0RGg5amNmS1RZRFFBcXZxZXpiQ1c4MnhqNVgwcFNyY3B4dHZSS0hMRzB5Qlk2U0Q3UFNEckphaiswQWlPY0tWZDFYZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29uY2F0LW1hcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb25jYXQtbWFwLy0vY29uY2F0LW1hcC0wLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTJLbHIxMy9XamZkNU9uTURhanVnMVVCZFIzcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb25uZWN0IjogeworICAgICAgInZlcnNpb24iOiAiMy42LjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Nvbm5lY3QvLS9jb25uZWN0LTMuNi42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQ2UvMnhWcjNJMjRUY1RXbkpYU0ZpMmVHOVNRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlYnVnIjogIjIuNi45IiwKKyAgICAgICAgImZpbmFsaGFuZGxlciI6ICIxLjEuMCIsCisgICAgICAgICJwYXJzZXVybCI6ICJ+MS4zLjIiLAorICAgICAgICAidXRpbHMtbWVyZ2UiOiAiMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiY29uc29sZS1jb250cm9sLXN0cmluZ3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29uc29sZS1jb250cm9sLXN0cmluZ3MvLS9jb25zb2xlLWNvbnRyb2wtc3RyaW5ncy0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVBYejBSazIyUkc2bVJMOUxPVkIvbUZFQWpvND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb3JlLXV0aWwtaXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29yZS11dGlsLWlzLy0vY29yZS11dGlsLWlzLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdGYxVUlncWl2RnExZXF0eFFNbEFkVVVEd2FjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNyb3NzLXNwYXduIjogeworICAgICAgInZlcnNpb24iOiAiNi4wLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Nyb3NzLXNwYXduLy0vY3Jvc3Mtc3Bhd24tNi4wLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVUVkxyQlN0N2ZqYkR5Z3o4MDVwTW5zdElzMlZUQk5rUm0wcXhaZCtNN0E1WERkeFZSV081TXhHQlhaaGpZNGNxTFlMZHRyR3FSZjhtQlBtendTcFdRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJuaWNlLXRyeSI6ICJeMS4wLjQiLAorICAgICAgICAicGF0aC1rZXkiOiAiXjIuMC4xIiwKKyAgICAgICAgInNlbXZlciI6ICJeNS41LjAiLAorICAgICAgICAic2hlYmFuZy1jb21tYW5kIjogIl4xLjIuMCIsCisgICAgICAgICJ3aGljaCI6ICJeMS4yLjkiCisgICAgICB9CisgICAgfSwKKyAgICAiZGVidWciOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjYuOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVidWcvLS9kZWJ1Zy0yLjYuOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYkM3RWxyZEphSm5QYkFQKzFFb3RZdnFac2IzZWNsNXdpNkJmaTZCSlRVY05vd3A2Y3ZzcGcwalh6blJUS0RqbS9FN0FkZ0ZCVmVBUFZNTmNLR3NITUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1zIjogIjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImRlY29tcHJlc3MtcmVzcG9uc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVjb21wcmVzcy1yZXNwb25zZS8tL2RlY29tcHJlc3MtcmVzcG9uc2UtMy4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1nS1RkTWpkSU9FdjZKSUNEWWlydDdKZ3EzL009IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWltaWMtcmVzcG9uc2UiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImRlZXAtZXF1YWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVlcC1lcXVhbC8tL2RlZXAtZXF1YWwtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05ZEpnS1N0bURnaE8vMHpieWZDSzB5UjBTTFU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGVlcC1leHRlbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjYuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVlcC1leHRlbmQvLS9kZWVwLWV4dGVuZC0wLjYuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTE9IeElPYVBZZEhsSlJ0Q1FmRElWWnRmdy91Zk04K3JWajY0OVJJSHpjbS92R3dRUlhGdDZPUHFJRldzbTJYRU1yTklFdFdSNjRzWTFMRUtEMnZBT0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRlZXAtaXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVlcC1pcy8tL2RlZXAtaXMtMC4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1zMm5XKzEyOEUrN1BVaytSc0hEKzdjTlh6elE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGVmaW5lLXByb3BlcnRpZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnRpZXMvLS9kZWZpbmUtcHJvcGVydGllcy0xLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItM01xZllLajJsTHpkTVNmOFpJWkUvVitadXkrQmdENmYxNjRlOEsydzdkZ25wS0FyQkRlckdZcE00NklZWWNqbmtkUE5NalBrOUE2VkZCOCszU0tsWFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm9iamVjdC1rZXlzIjogIl4xLjAuMTIiCisgICAgICB9CisgICAgfSwKKyAgICAiZGVmaW5lZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmVkLy0vZGVmaW5lZC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXlZMmJ6dmRXZEJpT0VRbHBGUkdaNDVzZnBwTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkZWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVsLy0vZGVsLTIuMi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtd1N5WUhRWjRSc2hMeXZoaXova3cyUWYvMGFnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdsb2JieSI6ICJeNS4wLjAiLAorICAgICAgICAiaXMtcGF0aC1jd2QiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzLXBhdGgtaW4tY3dkIjogIl4xLjAuMCIsCisgICAgICAgICJvYmplY3QtYXNzaWduIjogIl40LjAuMSIsCisgICAgICAgICJwaWZ5IjogIl4yLjAuMCIsCisgICAgICAgICJwaW5raWUtcHJvbWlzZSI6ICJeMi4wLjAiLAorICAgICAgICAicmltcmFmIjogIl4yLjIuOCIKKyAgICAgIH0KKyAgICB9LAorICAgICJkZWxlZ2F0ZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVsZWdhdGVzLy0vZGVsZWdhdGVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaE1iaFdiZ1pCUDNLV2FEdlJNMkhEVEVsRDVvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRldGVjdC1saWJjIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RldGVjdC1saWJjLy0vZGV0ZWN0LWxpYmMtMS4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0raE44UzlhWTdmVmMxYzBDckZXZmthVEV1cHM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZG9jdHJpbmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9jdHJpbmUvLS9kb2N0cmluZS0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMzVtU2t1NFpYSzB2ZkN1SEVEQXd0NTVkZzJqTmFqSFoxb2R2Ris4U1NyODJFc1pZNFFtWGZ1V3NvOG9FZDh6UmhWT2JTTjE4YU0wQ2pTZG9CWDd6SXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzdXRpbHMiOiAiXjIuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgImVlLWZpcnN0IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VlLWZpcnN0Ly0vZWUtZmlyc3QtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XUXhoRldzSzR2VHdKVmN5b1ZpeVpyeFdzaDA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZW5jb2RldXJsIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VuY29kZXVybC8tL2VuY29kZXVybC0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXJULzB5RzdDMENreUwxb0N3Nm1tQnNsYlAxaz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlbmQtb2Ytc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VuZC1vZi1zdHJlYW0vLS9lbmQtb2Ytc3RyZWFtLTEuNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0xTWtyWk52V1RLQ2FpZ2JuK1cxNWVscTJCQi9MMjJucXJTWTVES2xvM1g2K3ZjbEptOEJiNWRqWEpCbUVYNmZTMyt6Q2gvRjRWQks1WjJLeEp0NHMyUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib25jZSI6ICJeMS40LjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZXMtYWJzdHJhY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEyLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzLWFic3RyYWN0Ly0vZXMtYWJzdHJhY3QtMS4xMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1DOEZ4LzBqRm1WNUlQb01PRlBBOVA5RzVOdHFXKzRjT1BpdDNNSXV2UjJ0N0FnMksxNUVKVHB4bkhBWVR6TCthWVFKSUVTWWVYWm1EQmZPQkUxSGNwQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXMtdG8tcHJpbWl0aXZlIjogIl4xLjEuMSIsCisgICAgICAgICJmdW5jdGlvbi1iaW5kIjogIl4xLjEuMSIsCisgICAgICAgICJoYXMiOiAiXjEuMC4xIiwKKyAgICAgICAgImlzLWNhbGxhYmxlIjogIl4xLjEuMyIsCisgICAgICAgICJpcy1yZWdleCI6ICJeMS4wLjQiCisgICAgICB9CisgICAgfSwKKyAgICAiZXMtdG8tcHJpbWl0aXZlIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzLXRvLXByaW1pdGl2ZS8tL2VzLXRvLXByaW1pdGl2ZS0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcVpyeUJPSmpWLy9MYXhMVFY2VUMvL1dld25lQjNMY1hPTDlOUCsrb3pLVlhzSUlJcG0vMmMxM1VEaUQ5SnAyZVRoc2VjdzltM2pQcUR3VHlvYmNkYmc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWNhbGxhYmxlIjogIl4xLjEuNCIsCisgICAgICAgICJpcy1kYXRlLW9iamVjdCI6ICJeMS4wLjEiLAorICAgICAgICAiaXMtc3ltYm9sIjogIl4xLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJlc2NhcGUtaHRtbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2NhcGUtaHRtbC8tL2VzY2FwZS1odG1sLTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQWxqcTVOUFF3SmRONGNGcEdJN3dCUjBkR1lnPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzY2FwZS1zdHJpbmctcmVnZXhwLy0vZXNjYXBlLXN0cmluZy1yZWdleHAtMS4wLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HMkhBVmlHUXFOLzJyanV5endJQXloTUxodFE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXNjb2RlZ2VuIjogeworICAgICAgInZlcnNpb24iOiAiMS44LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzY29kZWdlbi8tL2VzY29kZWdlbi0xLjguMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdsdFRyMGFURVF2cnNJWjZvME1OMDdjS0VCZz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlc3ByaW1hIjogIl4yLjcuMSIsCisgICAgICAgICJlc3RyYXZlcnNlIjogIl4xLjkuMSIsCisgICAgICAgICJlc3V0aWxzIjogIl4yLjAuMiIsCisgICAgICAgICJvcHRpb25hdG9yIjogIl4wLjguMSIsCisgICAgICAgICJzb3VyY2UtbWFwIjogIn4wLjIuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXNwcmltYSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjcuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcHJpbWEvLS9lc3ByaW1hLTIuNy4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWx1TzNEVmQ1OXExSnpRTW1jOUhERW5aN3BZRT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJlc3RyYXZlcnNlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuOS4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXN0cmF2ZXJzZS8tL2VzdHJhdmVyc2UtMS45LjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcjJmeTNKSWxna0ZaVUpKZ2thUUFYU25KdTBRPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImVzbGludCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuNy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2xpbnQvLS9lc2xpbnQtNS43LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXpZQ2VGUWFoc3hmZkdsODdVMmFKN0RQeUg4Q2JXZ3hCQzIxM1k4K1RDYW5oVVRmMmdFdmZxM0VLcEhtRWNvelRMeVBtR2U5TFpkTUF3Qy9DcEpCTTVBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJAYmFiZWwvY29kZS1mcmFtZSI6ICJeNy4wLjAiLAorICAgICAgICAiYWp2IjogIl42LjUuMyIsCisgICAgICAgICJjaGFsayI6ICJeMi4xLjAiLAorICAgICAgICAiY3Jvc3Mtc3Bhd24iOiAiXjYuMC41IiwKKyAgICAgICAgImRlYnVnIjogIl40LjAuMSIsCisgICAgICAgICJkb2N0cmluZSI6ICJeMi4xLjAiLAorICAgICAgICAiZXNsaW50LXNjb3BlIjogIl40LjAuMCIsCisgICAgICAgICJlc2xpbnQtdXRpbHMiOiAiXjEuMy4xIiwKKyAgICAgICAgImVzbGludC12aXNpdG9yLWtleXMiOiAiXjEuMC4wIiwKKyAgICAgICAgImVzcHJlZSI6ICJeNC4wLjAiLAorICAgICAgICAiZXNxdWVyeSI6ICJeMS4wLjEiLAorICAgICAgICAiZXN1dGlscyI6ICJeMi4wLjIiLAorICAgICAgICAiZmlsZS1lbnRyeS1jYWNoZSI6ICJeMi4wLjAiLAorICAgICAgICAiZnVuY3Rpb25hbC1yZWQtYmxhY2stdHJlZSI6ICJeMS4wLjEiLAorICAgICAgICAiZ2xvYiI6ICJeNy4xLjIiLAorICAgICAgICAiZ2xvYmFscyI6ICJeMTEuNy4wIiwKKyAgICAgICAgImlnbm9yZSI6ICJeNC4wLjYiLAorICAgICAgICAiaW11cm11cmhhc2giOiAiXjAuMS40IiwKKyAgICAgICAgImlucXVpcmVyIjogIl42LjEuMCIsCisgICAgICAgICJpcy1yZXNvbHZhYmxlIjogIl4xLjEuMCIsCisgICAgICAgICJqcy15YW1sIjogIl4zLjEyLjAiLAorICAgICAgICAianNvbi1zdGFibGUtc3RyaW5naWZ5LXdpdGhvdXQtanNvbmlmeSI6ICJeMS4wLjEiLAorICAgICAgICAibGV2biI6ICJeMC4zLjAiLAorICAgICAgICAibG9kYXNoIjogIl40LjE3LjUiLAorICAgICAgICAibWluaW1hdGNoIjogIl4zLjAuNCIsCisgICAgICAgICJta2RpcnAiOiAiXjAuNS4xIiwKKyAgICAgICAgIm5hdHVyYWwtY29tcGFyZSI6ICJeMS40LjAiLAorICAgICAgICAib3B0aW9uYXRvciI6ICJeMC44LjIiLAorICAgICAgICAicGF0aC1pcy1pbnNpZGUiOiAiXjEuMC4yIiwKKyAgICAgICAgInBsdXJhbGl6ZSI6ICJeNy4wLjAiLAorICAgICAgICAicHJvZ3Jlc3MiOiAiXjIuMC4wIiwKKyAgICAgICAgInJlZ2V4cHAiOiAiXjIuMC4xIiwKKyAgICAgICAgInJlcXVpcmUtdW5jYWNoZWQiOiAiXjEuMC4zIiwKKyAgICAgICAgInNlbXZlciI6ICJeNS41LjEiLAorICAgICAgICAic3RyaXAtYW5zaSI6ICJeNC4wLjAiLAorICAgICAgICAic3RyaXAtanNvbi1jb21tZW50cyI6ICJeMi4wLjEiLAorICAgICAgICAidGFibGUiOiAiXjUuMC4yIiwKKyAgICAgICAgInRleHQtdGFibGUiOiAiXjAuMi4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWJ1ZyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI0LjEuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlYnVnLy0vZGVidWctNC4xLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1oZU5QSlVKSXFDK3hCNmF5TEFNSGFJcm1OOUhLYTdhUU84TUdxS3B2Q0ErdUpZVmN2UjZsNWtnZHJoUnV3UEZIVTdQNS9BMXcwQmpCeVBId3BmVERLZz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAibXMiOiAiXjIuMS4xIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgIm1zIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbXMvLS9tcy0yLjEuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXRncCtkbDVjR2syOHV0WWt0QnNyRnFBN0hLZ3JoZ1BzZzZaL0VmaFdJNGdsMUh3cThCL0dtWS8wb1haNm5GOGhEVmVzUy9GcG5ZYUQva09XaFlRdnlnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJlc2xpbnQtY29uZmlnLXByZXR0aWVyIjogeworICAgICAgInZlcnNpb24iOiAiMy4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzbGludC1jb25maWctcHJldHRpZXIvLS9lc2xpbnQtY29uZmlnLXByZXR0aWVyLTMuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1RWUdmbXp1YzRxNEo2WElobHA4dlJLZEkvZkkwdFFmUVB5MWRNRTNVT0xwckUrdjRzc0gvM1c5TE0yUTdoNXFCY3k1bTBlaENyQkRVMllGOHE2T1k4dz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2V0LXN0ZGluIjogIl42LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJlc2xpbnQtcGx1Z2luLXByZXR0aWVyIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzbGludC1wbHVnaW4tcHJldHRpZXIvLS9lc2xpbnQtcGx1Z2luLXByZXR0aWVyLTMuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi00ZzExb3B6aHFxLzgrQU1tbzVWYzJHbjd6OWFsWjRKcXJiWitENGk4S2xTeXhlUWhaSGxtSXJZOFU5QWtmNTE0TW9FaG9nUGE4N0pna3E4N2FaMk9odz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicHJldHRpZXItbGludGVyLWhlbHBlcnMiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImVzbGludC1zY29wZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2xpbnQtc2NvcGUvLS9lc2xpbnQtc2NvcGUtNC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTFHNlVURGk3SmMxRUxGd25SNThIVjRmSzlPUUs0UzZOOTg1ZjE2NnhxWHhwalU2cGx4RklTSmEyQmE5S0NRdUZhOFJDbmovbFNGSmJIbzdVRkRCblVBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlc3JlY3Vyc2UiOiAiXjQuMS4wIiwKKyAgICAgICAgImVzdHJhdmVyc2UiOiAiXjQuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgImVzbGludC11dGlscyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2xpbnQtdXRpbHMvLS9lc2xpbnQtdXRpbHMtMS4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVo3WWpuSWxkWCsyWE1janI3WmtnRXNPai9iUkVPTlY2MHFZZUIvYmpNQXFxcVo0enhLeVdYK0JPVWtkbVJtQTlyaWlJUFZ2bzV4ODZtNWVsdmlPazBRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlc2xpbnQtdmlzaXRvci1rZXlzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzbGludC12aXNpdG9yLWtleXMvLS9lc2xpbnQtdmlzaXRvci1rZXlzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1xem0vWHhJYnhtL0ZIeUgzNDFacmJuTVVwZSs1Qm9jdGU5eGttRk16UE1qUmFaTWNYd3crTXBCcHRGdnRVKzc5TDM2Mm5xaUxoZWtDeEN4RFBhVU1CUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXNwcmVlIjogeworICAgICAgInZlcnNpb24iOiAiNC4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcHJlZS8tL2VzcHJlZS00LjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItSTVCeWNaVzZGQ1ZJdWI5M1RlVlkxczd2amhQOUNZNmNYQ3puSVJmaWlnN25SdmlLWllkUm5qL3NIRVdDNkE3V0U5UkRXT0ZxOSs3T3NXU1l6OHF2Mnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFjb3JuIjogIl42LjAuMiIsCisgICAgICAgICJhY29ybi1qc3giOiAiXjUuMC4wIiwKKyAgICAgICAgImVzbGludC12aXNpdG9yLWtleXMiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImVzcHJpbWEiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNwcmltYS8tL2VzcHJpbWEtNC4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVHdUZGdzdVcGRhK2c0cCtRSHZuVzBSeVRYL1NWZUpCRE0vZ0N0TUFSTzBjTHVUMkhjRUtuVFB2aGpWNmFHZXFyQ0Ivc2JOb3AwS3N6bTBqc2FXVTRBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlc3F1ZXJ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcXVlcnkvLS9lc3F1ZXJ5LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1TbWl5WjV6SVdIOVZNK1NSVVJlTFM1UThhN0d4dFJkeEVCVlpwbTk4ckpNN1NiK0E5RFZDbmRYZmtlRlVkM2J5ZGVyZytFYkRrZm5ldmZDd3luV2FOQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXN0cmF2ZXJzZSI6ICJeNC4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZXNyZWN1cnNlIjogeworICAgICAgInZlcnNpb24iOiAiNC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcmVjdXJzZS8tL2VzcmVjdXJzZS00LjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNjRSQkIrK2ZJT0FYUHczUDljeTg5cWZNbHZaRVhaa3FxSmtqcXFYSXZ6UDVlelJaalcrbFBXanczNVVYLzNFaFVQRlliZzVFUjRKWWdEdzQwMDcvRFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzdHJhdmVyc2UiOiAiXjQuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgImVzdHJhdmVyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXN0cmF2ZXJzZS8tL2VzdHJhdmVyc2UtNC4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1EZTQvN1RIODFHbGhqT2MwSUpuOEd2b0wyeE09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXN1dGlscyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3V0aWxzLy0vZXN1dGlscy0yLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUNyOVBIS3BieXg5Nm5Zck1iZXBQcXFCTHJKcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJleHBhbmQtdGVtcGxhdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXhwYW5kLXRlbXBsYXRlLy0vZXhwYW5kLXRlbXBsYXRlLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jZWJxTHRWOEtPWmZ3MFVJOFRFRld4dGN6eHhDMWp2eVV2eDZINGZ5cDFLMUZON0E0USt1Z2dWVWxPc0kxSzhBR1UwcndPR3FQOG5DYXBkcnc4Q1lRZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXh0ZXJuYWwtZWRpdG9yIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVybmFsLWVkaXRvci8tL2V4dGVybmFsLWVkaXRvci0zLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYm43MUg5K3FXb09RS3laRG8yNW1PTVZwU21YUk9Bc1RKVlZWWXpycnRvbDNkNHkrQXNLamY0SXdsMlErSXVUMGtGU1ExcW8xNjZVdUl3cVlxN21HbkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNoYXJkZXQiOiAiXjAuNy4wIiwKKyAgICAgICAgImljb252LWxpdGUiOiAiXjAuNC4yNCIsCisgICAgICAgICJ0bXAiOiAiXjAuMC4zMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJmYXN0LWRlZXAtZXF1YWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmFzdC1kZWVwLWVxdWFsLy0vZmFzdC1kZWVwLWVxdWFsLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZXdVaGpkK1daNzkvTnd2My9iTExGZjNRcWtrPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZhc3QtZGlmZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mYXN0LWRpZmYvLS9mYXN0LWRpZmYtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXhKdW9UNStMOTlYbFo4dHdlZGFSZjZBeDJUZ1FWeHZnWk9Zb1BLcVp1Zm1KaWIwdEwydGVnUEJPWmIxcFZOZ0lobHFEbEEwZU8wYzN3QnZRY216eDR3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeS8tL2Zhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5LTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMVJRc0RLN21zUmlmaDlPbllSRUdUNGJJdS9JPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZhc3QtbGV2ZW5zaHRlaW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmFzdC1sZXZlbnNodGVpbi8tL2Zhc3QtbGV2ZW5zaHRlaW4tMi4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QWXBjWm9nNkZxTU1xR1EraFI4WnVxZDVlUmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZmlndXJlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9maWd1cmVzLy0vZmlndXJlcy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU9yR2kwcVlzaS90REdneVV5M2w2TDg0bnlXST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjUiCisgICAgICB9CisgICAgfSwKKyAgICAiZmlsZS1lbnRyeS1jYWNoZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9maWxlLWVudHJ5LWNhY2hlLy0vZmlsZS1lbnRyeS1jYWNoZS0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXc1S1pERDVvUjRQWU9MaklTa1hZb0VoRmcyRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmbGF0LWNhY2hlIjogIl4xLjIuMSIsCisgICAgICAgICJvYmplY3QtYXNzaWduIjogIl40LjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJmaW5hbGhhbmRsZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmluYWxoYW5kbGVyLy0vZmluYWxoYW5kbGVyLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtemd0b1ZiUllVK2VSc3Z6R2dBUnRpQ1U5MS9VPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlYnVnIjogIjIuNi45IiwKKyAgICAgICAgImVuY29kZXVybCI6ICJ+MS4wLjEiLAorICAgICAgICAiZXNjYXBlLWh0bWwiOiAifjEuMC4zIiwKKyAgICAgICAgIm9uLWZpbmlzaGVkIjogIn4yLjMuMCIsCisgICAgICAgICJwYXJzZXVybCI6ICJ+MS4zLjIiLAorICAgICAgICAic3RhdHVzZXMiOiAifjEuMy4xIiwKKyAgICAgICAgInVucGlwZSI6ICJ+MS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZmxhdC1jYWNoZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mbGF0LWNhY2hlLy0vZmxhdC1jYWNoZS0xLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTB3TUxNck9CVlBUanQrbkhDZlNROSsrWHhJRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaXJjdWxhci1qc29uIjogIl4wLjMuMSIsCisgICAgICAgICJkZWwiOiAiXjIuMC4yIiwKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuMiIsCisgICAgICAgICJ3cml0ZSI6ICJeMC4yLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZm9yLWVhY2giOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZm9yLWVhY2gvLS9mb3ItZWFjaC0wLjMuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItanFZZkxwN21vOXZJeVFmOHlrVzJ2N0ErMk40UWplQ2VJNStEejlYcmFpTzFpZ244MXdqaUg3RmI5dlNPV3ZRZk50bVNhNEgyUm9RVHJyWGl2ZFVabXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWNhbGxhYmxlIjogIl4xLjEuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJmcy1jb25zdGFudHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnMtY29uc3RhbnRzLy0vZnMtY29uc3RhbnRzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15Nk9Bd29TSWY3RnlqTUl2OTR1K2I1cmRoZVpFanpSNjNHVHlaSm01cWg0QmkrMllnd0xDY0kvZlBGWmtMNVBTaXhPdDZaTkttK3crSGZwL0JjaXdvdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZnMucmVhbHBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnMucmVhbHBhdGgvLS9mcy5yZWFscGF0aC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUZRU3RKU01WaktwQTIwb25oOHNCUVJtVTZrOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmdW5jdGlvbi1iaW5kIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Z1bmN0aW9uLWJpbmQvLS9mdW5jdGlvbi1iaW5kLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15SW92QXpNWDQ5c0Y4WWw1OGZTQ1dKNXN2U0x1YWliUHhYUUpGTG1CT2JUdUNyME1mMUtpUG9wR005TmlGamlZQkNiZmFhMkZoNmJyZVE2QU5WVEkwQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZnVuY3Rpb25hbC1yZWQtYmxhY2stdHJlZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mdW5jdGlvbmFsLXJlZC1ibGFjay10cmVlLy0vZnVuY3Rpb25hbC1yZWQtYmxhY2stdHJlZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUd3cXp2VlU3S2cxam1kS2NEajZnc2xJSGd5Yz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnYXVnZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNy40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nYXVnZS8tL2dhdWdlLTIuNy40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTEFOQVhIVTR3NTErczNzeGNDTGpKZnNCaS9jPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFwcm9iYSI6ICJeMS4wLjMiLAorICAgICAgICAiY29uc29sZS1jb250cm9sLXN0cmluZ3MiOiAiXjEuMC4wIiwKKyAgICAgICAgImhhcy11bmljb2RlIjogIl4yLjAuMCIsCisgICAgICAgICJvYmplY3QtYXNzaWduIjogIl40LjEuMCIsCisgICAgICAgICJzaWduYWwtZXhpdCI6ICJeMy4wLjAiLAorICAgICAgICAic3RyaW5nLXdpZHRoIjogIl4xLjAuMSIsCisgICAgICAgICJzdHJpcC1hbnNpIjogIl4zLjAuMSIsCisgICAgICAgICJ3aWRlLWFsaWduIjogIl4xLjEuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYW5zaS1yZWdleCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktcmVnZXgvLS9hbnNpLXJlZ2V4LTIuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXc3TTZ0ZTQyRFliZzVpandSb3JuN3lmV1ZOOD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJpcy1mdWxsd2lkdGgtY29kZS1wb2ludCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWZ1bGx3aWR0aC1jb2RlLXBvaW50Ly0vaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQtMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNzU0eE9HOERHbjhOWkRyNEw5NVF4RmZ2QU1zPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgIm51bWJlci1pcy1uYW4iOiAiXjEuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN0cmluZy13aWR0aCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmluZy13aWR0aC8tL3N0cmluZy13aWR0aC0xLjAuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1FWXZmVzR6Y1VhS241dzBoSGdmaXNMbXhCOU09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiY29kZS1wb2ludC1hdCI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWZ1bGx3aWR0aC1jb2RlLXBvaW50IjogIl4xLjAuMCIsCisgICAgICAgICAgICAic3RyaXAtYW5zaSI6ICJeMy4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic3RyaXAtYW5zaSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaXAtYW5zaS8tL3N0cmlwLWFuc2ktMy4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYWpoZnVJVTlsUzFmOEYwT2lxK1VKNDNHUGM4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImFuc2ktcmVnZXgiOiAiXjIuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdldC1zdGRpbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nZXQtc3RkaW4vLS9nZXQtc3RkaW4tNi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpwNHRIYXd5VjcrZmtrU0t5dmp1TFpzd2JsVXR6K1NRS3pTV25CYmlpMTZCdVprc0psVTF3dUJZWFk3NXIrZHVoL2xsRjF1cjZvTndpKzJaempLWjdnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnaXRodWItZnJvbS1wYWNrYWdlIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dpdGh1Yi1mcm9tLXBhY2thZ2UvLS9naXRodWItZnJvbS1wYWNrYWdlLTAuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbC90ZGxyL2VpWE14UHlEb0tJNzVvV2Y2Wk00PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImdsb2IiOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYi8tL2dsb2ItNy4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXZjZnVpSXhvZ0xWNERsR0JISVVPd0kwSWJySjhIV1BjNE1VN0h6dmlHZU5oby9VSkRmaTZCNXAzc0hlV0lRMEtHSVUwSnB4aTVaSHhlbVFmTGtrQXdRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmcy5yZWFscGF0aCI6ICJeMS4wLjAiLAorICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgImluaGVyaXRzIjogIjIiLAorICAgICAgICAibWluaW1hdGNoIjogIl4zLjAuNCIsCisgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICJwYXRoLWlzLWFic29sdXRlIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJnbG9iYWxzIjogeworICAgICAgInZlcnNpb24iOiAiMTEuOC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iYWxzLy0vZ2xvYmFscy0xMS44LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWlvNkxreVBWdXpDSEJTUVY5Zm1Pd3haa1VrNm5JYUdteGhlTERnbXVGdjg5ajBmbTJhcURiSVhLQUdmekNNSHF6M0hMRjJaZjhXU0c2VnFNaDJxRm1BPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnbG9iYnkiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYmJ5Ly0vZ2xvYmJ5LTUuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNjloR1o4b051ek1MbWJ6OGFPckN2RlEzRGcwPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFycmF5LXVuaW9uIjogIl4xLjAuMSIsCisgICAgICAgICJhcnJpZnkiOiAiXjEuMC4wIiwKKyAgICAgICAgImdsb2IiOiAiXjcuMC4zIiwKKyAgICAgICAgIm9iamVjdC1hc3NpZ24iOiAiXjQuMC4xIiwKKyAgICAgICAgInBpZnkiOiAiXjIuMC4wIiwKKyAgICAgICAgInBpbmtpZS1wcm9taXNlIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJncmFjZWZ1bC1mcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMS4xMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3JhY2VmdWwtZnMvLS9ncmFjZWZ1bC1mcy00LjEuMTEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Eb3ZmNU5IZHVJVk5aT0JPcDhBT0tnSnVWbGc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaGFuZGxlYmFycyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4xMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFuZGxlYmFycy8tL2hhbmRsZWJhcnMtNC4wLjEyLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SaG1UZWtQK0ZaTCtYTmh3UzFXZitiVFRacGRMb3Vnd3Q1cGNnQTF0dXo2SmN4MGZwSC83ejBxZDcxUktuWkhCQ3hJUkJIZkJPbmlvNGdWaVBlbU56QT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXN5bmMiOiAiXjIuNS4wIiwKKyAgICAgICAgIm9wdGltaXN0IjogIl4wLjYuMSIsCisgICAgICAgICJzb3VyY2UtbWFwIjogIl4wLjYuMSIsCisgICAgICAgICJ1Z2xpZnktanMiOiAiXjMuMS40IgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJhc3luYyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjYuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5jLy0vYXN5bmMtMi42LjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1mTkVpTDIrQVp0NkFsQXcvMjlDcjBVRGU0c1JBSENwRUhoNTRXTXorQmI3UWZOY0Z3NGgzbG9vZnlKcExlUXM0WXg3eXVxdS8yZExnTTVoS09zNkhsUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAibG9kYXNoIjogIl40LjE3LjEwIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInNvdXJjZS1tYXAiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC42LjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zb3VyY2UtbWFwLy0vc291cmNlLW1hcC0wLjYuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVVqZ2FwdW1XbGJNaGtCZ3pUN1lrYzVZWFVUNDZGMGlLdThTR1hxMGJjd1A1ZHovaDBQbGo2ZW5KcWp6MVpicTJsNVdhcVluclZid1dPV015RjNGNDdnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJoYXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLy0vaGFzLTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1mMmR2TzBWVTZPZWo3UmtXSkdyZWhqYnpNQWpGcDUvVktQcDV0VHBXSVY0SkhIWksxL0J4YkZSdGYvc2lBMlNXVGUwOWNhRG1WdFlZeldFSWJCUzR6dz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZnVuY3Rpb24tYmluZCI6ICJeMS4xLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaGFzLWZsYWciOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLWZsYWcvLS9oYXMtZmxhZy0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRkUlUzQ0dacmlKV21mTkdmbG9IODdsVnV2MD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJoYXMtc3ltYm9scyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtc3ltYm9scy8tL2hhcy1zeW1ib2xzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdWhxUEd2S2cvRGxsRDF5RkEyZHdRU0lHTzBRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImhhcy11bmljb2RlIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy11bmljb2RlLy0vaGFzLXVuaWNvZGUtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS00T2IrYWlqUFVST0lWZUNHMFdrZWR4M2lxTGs9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaWNvbnYtbGl0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4yNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaWNvbnYtbGl0ZS8tL2ljb252LWxpdGUtMC40LjI0LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi12M01YblpBY3ZueXdrVFVFWm9tSUFjdGxlN1JYWGVlZE9SMzF3d2w3Vmx5b1hPNFFpOWFydlNlbk5RV25lMVRjUndoQ0wxSHdMSTIxYkVxZHBqOC9yQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2FmZXItYnVmZmVyIjogIj49IDIuMS4yIDwgMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJpZ25vcmUiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaWdub3JlLy0vaWdub3JlLTQuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jeUZES3JxYy9ZZGNXRm5pSmh6STQyK0F6UytnTndtVXpPU0ZjUkNRWXd5U3VCQkJ5L0tqdXhXTFovRkhFSDZNb3ExTml6TU9CV3lUY3Y4TzRPWklNZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaW11cm11cmhhc2giOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW11cm11cmhhc2gvLS9pbXVybXVyaGFzaC0wLjEuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWtoaTVzcmtvb2ppeFBjVDdhMjFYYnlNVVUrbz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpbmZsaWdodCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbmZsaWdodC8tL2luZmxpZ2h0LTEuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtU2Ixak1kZlFMUXdKdkpFS0VIVzZnV1cxYmZrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm9uY2UiOiAiXjEuMy4wIiwKKyAgICAgICAgIndyYXBweSI6ICIxIgorICAgICAgfQorICAgIH0sCisgICAgImluaGVyaXRzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2luaGVyaXRzLy0vaW5oZXJpdHMtMi4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZendzZytQYVFxVUM5U1JtQWlTQTlDQ0NZZDQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaW5pIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2luaS8tL2luaS0xLjMuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUlpZNWh1SUtDTVJXRFVxWmxFaTcyZi9sbVhLTXZ1c3pjTUJkdWxpUTNubldieDlYL1pCUU83RGlqTUVZUzlFaEhCYjJxYWNSVU10Qzdzdkx3ZTBsY3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlucXVpcmVyIjogeworICAgICAgInZlcnNpb24iOiAiNi4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lucXVpcmVyLy0vaW5xdWlyZXItNi4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVFJRVFHNFl5UTJVWVpHREM0c3JNWjdCakhPbU5rMWxSMkpRajVVa25CYXBrbG02V0hBK1ZWSDdOK3NVZFgzQTdOZUNmR0Y4bzRYMVMzQW83bkFjSWVnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhbnNpLWVzY2FwZXMiOiAiXjMuMC4wIiwKKyAgICAgICAgImNoYWxrIjogIl4yLjAuMCIsCisgICAgICAgICJjbGktY3Vyc29yIjogIl4yLjEuMCIsCisgICAgICAgICJjbGktd2lkdGgiOiAiXjIuMC4wIiwKKyAgICAgICAgImV4dGVybmFsLWVkaXRvciI6ICJeMy4wLjAiLAorICAgICAgICAiZmlndXJlcyI6ICJeMi4wLjAiLAorICAgICAgICAibG9kYXNoIjogIl40LjE3LjEwIiwKKyAgICAgICAgIm11dGUtc3RyZWFtIjogIjAuMC43IiwKKyAgICAgICAgInJ1bi1hc3luYyI6ICJeMi4yLjAiLAorICAgICAgICAicnhqcyI6ICJeNi4xLjAiLAorICAgICAgICAic3RyaW5nLXdpZHRoIjogIl4yLjEuMCIsCisgICAgICAgICJzdHJpcC1hbnNpIjogIl40LjAuMCIsCisgICAgICAgICJ0aHJvdWdoIjogIl4yLjMuNiIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1jYWxsYWJsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1jYWxsYWJsZS8tL2lzLWNhbGxhYmxlLTEuMS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1yNXA5c3hKalluQXJMak9icGpBNHh1NUVLSTNDdUtIa0pYTWhUN2t3YnBVeUlGRDFuNVBNQXNvUHZXbnZ0WmlOejdMamtZRFJaaGQ3RmxJMGVNaWpFQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtZGF0ZS1vYmplY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGF0ZS1vYmplY3QvLS9pcy1kYXRlLW9iamVjdC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1xSU90cTdydi9kL3ZUUG5US0FiTTFnZE9oWT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1mdWxsd2lkdGgtY29kZS1wb2ludCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1mdWxsd2lkdGgtY29kZS1wb2ludC8tL2lzLWZ1bGx3aWR0aC1jb2RlLXBvaW50LTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbzdNS1hFOFprWU1XZXFxNU8rNzY0OTM3WlU4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLXBhdGgtY3dkIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXBhdGgtY3dkLy0vaXMtcGF0aC1jd2QtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0waVhzSXhNdWllM1RqOXAyZEhMbUxtWHhFRzA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtcGF0aC1pbi1jd2QiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtcGF0aC1pbi1jd2QvLS9pcy1wYXRoLWluLWN3ZC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItRmpWMVJUVzQ4RTdDV003ZUUvSjJOSnZBRUVWZWt0ZWNEQlZCRTVIaDNuTTFKZDBrdmhIdFg2OFByM3hzRGY4NTd4dDNZNEFrd1ZVTEsxVmt1NjJhYVE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLXBhdGgtaW5zaWRlIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1wYXRoLWluc2lkZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1wYXRoLWluc2lkZS8tL2lzLXBhdGgtaW5zaWRlLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtanZXMzNsQkRlai9jcHJUb1plOTZwVnkwZ0RZPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBhdGgtaXMtaW5zaWRlIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1wcm9taXNlIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXByb21pc2UvLS9pcy1wcm9taXNlLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZWFLcDdPZndsdWdQTnRLeTg3d1d3ZjlMOC9vPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLXJlZ2V4IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXJlZ2V4Ly0vaXMtcmVnZXgtMS4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1WUmRJbTFSd2tiQ1REZ2xXVk03U1h1bCtsSkU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaGFzIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1yZXNvbHZhYmxlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXJlc29sdmFibGUvLS9pcy1yZXNvbHZhYmxlLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1xZ0RZWEZTUjVXdkVmdVM1ZE1qNm9UTUVicnJTYU0wQ3JGazJZaXEvZ1huQnZEOXBNYTJqR1h4eWhHTGZ2aFpwdU1aZTE4Q0pwRnhBdDNDUnM0Mk5NZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtc3ltYm9sIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXN5bWJvbC8tL2lzLXN5bWJvbC0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItSFM4Ylo5b3g2MHlDSkxIOXNuQnBJd3Y5cFlVQWtjdUxoU0Exb2VybzFVQjV5OWFpUXBSQTh5MmV4OTQ1QU90Q1pMMWxKRGVJazNHNUx0aHN3STQ2THc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhhcy1zeW1ib2xzIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJpc2FycmF5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzYXJyYXkvLS9pc2FycmF5LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdTVOZFNGZ3N1aGFNQm9OSlY2VktQZ2NTVHhFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzZXhlIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzZXhlLy0vaXNleGUtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS02UHZ6ZE54VmIvaVVlaERjc0ZjdFl6OHMraEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXN0YW5idWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXN0YW5idWwvLS9pc3RhbmJ1bC0wLjQuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVpjZlhQVXhOcUUxUE9zTVF1Umo3QzRBemN6cz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhYmJyZXYiOiAiMS4wLngiLAorICAgICAgICAiYXN5bmMiOiAiMS54IiwKKyAgICAgICAgImVzY29kZWdlbiI6ICIxLjgueCIsCisgICAgICAgICJlc3ByaW1hIjogIjIuNy54IiwKKyAgICAgICAgImdsb2IiOiAiXjUuMC4xNSIsCisgICAgICAgICJoYW5kbGViYXJzIjogIl40LjAuMSIsCisgICAgICAgICJqcy15YW1sIjogIjMueCIsCisgICAgICAgICJta2RpcnAiOiAiMC41LngiLAorICAgICAgICAibm9wdCI6ICIzLngiLAorICAgICAgICAib25jZSI6ICIxLngiLAorICAgICAgICAicmVzb2x2ZSI6ICIxLjEueCIsCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6ICJeMy4xLjAiLAorICAgICAgICAid2hpY2giOiAiXjEuMS4xIiwKKyAgICAgICAgIndvcmR3cmFwIjogIl4xLjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXNwcmltYSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjcuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcHJpbWEvLS9lc3ByaW1hLTIuNy4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWx1TzNEVmQ1OXExSnpRTW1jOUhERW5aN3BZRT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJnbG9iIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjUuMC4xNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2IvLS9nbG9iLTUuMC4xNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HOGsydWVBdlNtQS96Q0l1ejNZejB3dUxrN0U9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICIyIiwKKyAgICAgICAgICAgICJtaW5pbWF0Y2giOiAiMiB8fCAzIiwKKyAgICAgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaGFzLWZsYWciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtZmxhZy8tL2hhcy1mbGFnLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLW5aNTVNV1hPQVhvQThBUVl4RCtVS25zZEVmbz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItMy4yLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWmF3RkJMT1ZRWEhZcGtsR3NxNDh1NHBmVlBZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImhhcy1mbGFnIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJqcy10b2tlbnMiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanMtdG9rZW5zLy0vanMtdG9rZW5zLTQuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SZEpVZmxjRTNjVXpLaU1xUWdzQ3UwNkZQdTlVZElKTzBiZVliUGhITjRrNmFwZ0p0aWZjb0N0VDliY3hPcFlCdHBEMmtDTTZTYnpnNENhdXNXL1BLUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAianMteWFtbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMTIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanMteWFtbC8tL2pzLXlhbWwtMy4xMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1QSXQyY253bVBmTDRoS053cWVpdXo0YktmbnpIVEJ2Nkh5VmdqYWhBNm1QTHdQRHpqRFdycGxKQk1qSFVGeGt1L04zRmxtcmJ5UGNsYWQrSSs0bUozQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJncGFyc2UiOiAiXjEuMC43IiwKKyAgICAgICAgImVzcHJpbWEiOiAiXjQuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImpzMnhtbHBhcnNlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qczJ4bWxwYXJzZXIvLS9qczJ4bWxwYXJzZXItMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QN1lPcWdpY1ZFRDVNWjlSZGd6TkIrSkpsek09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAieG1sY3JlYXRlIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJqc2RvYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNS41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc2RvYy8tL2pzZG9jLTMuNS41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi02UHhCNjVUQVU0V08wV3p5ci80L1lobEdvdlhsMEVWWWZwS2JwU3JvU2owcUJ4VDQveG9kL2w0ME9wa20zOGRSSFJkUWdkZVk4MzZNMHVWbkpRRzdrZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYmFieWxvbiI6ICI3LjAuMC1iZXRhLjE5IiwKKyAgICAgICAgImJsdWViaXJkIjogIn4zLjUuMCIsCisgICAgICAgICJjYXRoYXJzaXMiOiAifjAuOC45IiwKKyAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIn4xLjAuNSIsCisgICAgICAgICJqczJ4bWxwYXJzZXIiOiAifjMuMC4wIiwKKyAgICAgICAgImtsYXciOiAifjIuMC4wIiwKKyAgICAgICAgIm1hcmtlZCI6ICJ+MC4zLjYiLAorICAgICAgICAibWtkaXJwIjogIn4wLjUuMSIsCisgICAgICAgICJyZXF1aXp6bGUiOiAifjAuMi4xIiwKKyAgICAgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiAifjIuMC4xIiwKKyAgICAgICAgInRhZmZ5ZGIiOiAiMi42LjIiLAorICAgICAgICAidW5kZXJzY29yZSI6ICJ+MS44LjMiCisgICAgICB9CisgICAgfSwKKyAgICAianNvbi1zY2hlbWEtdHJhdmVyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNvbi1zY2hlbWEtdHJhdmVyc2UvLS9qc29uLXNjaGVtYS10cmF2ZXJzZS0wLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTIteGJiQ0g1ZENZVTVUOExjRWhodWg3SEo4OEhYdVczcXNJM1kwek9aRktmWkVIY3BXaUhVL0p4ems2MjlCcnNhYi9tTWlIUXRpOXdNUCs4NDVSUGUzVmc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImpzb24tc3RhYmxlLXN0cmluZ2lmeS13aXRob3V0LWpzb25pZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNvbi1zdGFibGUtc3RyaW5naWZ5LXdpdGhvdXQtanNvbmlmeS8tL2pzb24tc3RhYmxlLXN0cmluZ2lmeS13aXRob3V0LWpzb25pZnktMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1uYmUxbEphdFB6eis4d3AxRkMwdGt3clhKbEU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAia2xhdyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9rbGF3Ly0va2xhdy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdjRW80TnhjNUJBZ0VWRVpUdXVjdjRXR1VQWT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjkiCisgICAgICB9CisgICAgfSwKKyAgICAibGV2biI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sZXZuLy0vbGV2bi0wLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU93bVNUdCtmQ0R3RWtQM1V3THhFSWVCSFpPND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwcmVsdWRlLWxzIjogIn4xLjEuMiIsCisgICAgICAgICJ0eXBlLWNoZWNrIjogIn4wLjMuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJsb2Rhc2giOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjE3LjExIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sb2Rhc2gvLS9sb2Rhc2gtNC4xNy4xMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItY1FLaDhpZ281UVVoWjdsZzM4RFlXQXhNdmpTQUtHMEE4d0dTVmltUDA3U0lVRUsyVU8rYXJTUktiUlpXdGVsTXRONVYwSGt3aDVyeU90by9Tc2hZSWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm1hcmtlZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4xOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYXJrZWQvLS9tYXJrZWQtMC4zLjE5LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lYTJlR1dPcU54UGNYdjhkeUVSZFNyLzZGbXp2V3d6ak14cGZHQi9zYk1jY1hvY3QreFkrWXVrUEQrUVRVWnd5dks3Qlp3Y3I0bTIxV0JPVzQxcEFrZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWltaWMtZm4iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWltaWMtZm4vLS9taW1pYy1mbi0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItamY4NHV4endpdWlJVktpT0xwZllrN040NlRTeTh1YlRvbm1uZVk5dnJwSE5BbnAwUUJ0MkJ4V1Y5ZE8zL2orQm9WQWIrYTVHNllEUFczTTVIT2RNV1E9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm1pbWljLXJlc3BvbnNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pbWljLXJlc3BvbnNlLy0vbWltaWMtcmVzcG9uc2UtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWo1RWN0bmtIN2FtZlYvcTVIZ21vYWwxZzJRSEZKUnJhT3RteDBKcElxa3hoQmhJL2xKU2wxbk1wUTQ1aFZhcndORVRPb1dFaW1uZFo0UUswUkh4dXhRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtaW5pbWF0Y2giOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1hdGNoLy0vbWluaW1hdGNoLTMuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15SkhWUUVoeXFQTFVUZ3Q5QjgzUFh1Nlczcng0TXZ2SHZTVXZUb29ncHdvR0RPVVEreURyUjBIUm90K3lPQ2RDTzd1NGhYM3BXZnQ2a1dCQmNxaDBVQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYnJhY2UtZXhwYW5zaW9uIjogIl4xLjEuNyIKKyAgICAgIH0KKyAgICB9LAorICAgICJtaW5pbWlzdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC44IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltaXN0Ly0vbWluaW1pc3QtMC4wLjgudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oWC9LdjhNNWZTWWx1Q0tDWXVocXA2QVJzRjA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWtkaXJwIjogeworICAgICAgInZlcnNpb24iOiAiMC41LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWtkaXJwLy0vbWtkaXJwLTAuNS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTUFWME9Pckd6MytNUjJmemhraldhWDExeVFNPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1pbmltaXN0IjogIjAuMC44IgorICAgICAgfQorICAgIH0sCisgICAgIm1zIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21zLy0vbXMtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1WZ2l1cmZ3QXZtd3BBZDlmbUdGNGplRFZsOGc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibXV0ZS1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuNyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbXV0ZS1zdHJlYW0vLS9tdXRlLXN0cmVhbS0wLjAuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU1IWE9rN3dodVBxMFBodkUybjZCRmUwZWU2cz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJuYW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEwLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbmFuLy0vbmFuLTIuMTAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYkFkSnY3ZkJMaFdDKy9CbHMwT3phK212VGFOUXRQKzFSeWhoaHZEOTVwZ1VKejZYTTVJemdteE9rSXRKOXRrb0NpcGx2QW5YSTF0Tm1tVUQvZVNjeUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm5hdHVyYWwtY29tcGFyZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9uYXR1cmFsLWNvbXBhcmUvLS9uYXR1cmFsLWNvbXBhcmUtMS40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1TcjYvN3RkVUh5d25yUHNwdmJ2UlhJMWJwUGM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibmljZS10cnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbmljZS10cnkvLS9uaWNlLXRyeS0xLjAuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMW5oNDVkZWViNW9sTlk3ZVg4MkJrUE83U1N4UjVTU1lKaVBUclRkRlVWWXdBbDhDS01BNU45UGpUWWtIaVJqaXNWY3hjUTFIWGRMaHgycXh4SnpMTlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm5vZGUtYWJpIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vZGUtYWJpLy0vbm9kZS1hYmktMi40LjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWFhL1VDNk5yMyt0cWhIR1JzQXV3L2VkejcvcTlubmV0QnJLV3hqNnJwVHRtKzBYOVQxcVU3bElFSE1TM3lOOUp3QWJSaUtVYlJSRnkxUEx6L3kzYWFBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzZW12ZXIiOiAiXjUuNC4xIgorICAgICAgfQorICAgIH0sCisgICAgIm5vZGUtaW50NjQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbm9kZS1pbnQ2NC8tL25vZGUtaW50NjQtMC40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oNmtHWE5zMVhUR0MyUGxNNFJHSXVDWEdpanM9IgorICAgIH0sCisgICAgIm5vb3AtbG9nZ2VyIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vb3AtbG9nZ2VyLy0vbm9vcC1sb2dnZXItMC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sS0t4WXp4UEV4ZFZNQWZZbG0vUTZFRzJwTUk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibm9wdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ub3B0Ly0vbm9wdC0zLjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXhrWmR2d2lyelUyeldURi9lYXhvcGtheWovaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhYmJyZXYiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJucG1sb2ciOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbnBtbG9nLy0vbnBtbG9nLTQuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0ydVVxYXp1S2xUYVNJL2RDOEF6aWNVY2s3K0lyRWFPbk4vZTBqZDNYdHQxS2NHcHd4MzB2NTBtTDdvUHlyL2g5YkwzRTRhWmNjVndwd1ArNVc5VmprZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJlLXdlLXRoZXJlLXlldCI6ICJ+MS4xLjIiLAorICAgICAgICAiY29uc29sZS1jb250cm9sLXN0cmluZ3MiOiAifjEuMS4wIiwKKyAgICAgICAgImdhdWdlIjogIn4yLjcuMyIsCisgICAgICAgICJzZXQtYmxvY2tpbmciOiAifjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm51bWJlci1pcy1uYW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbnVtYmVyLWlzLW5hbi8tL251bWJlci1pcy1uYW4tMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1DWHRnSzFOQ0tsSXNHdnVIa0RHRE5wUWFBUjA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib2JqZWN0LWFzc2lnbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QtYXNzaWduLy0vb2JqZWN0LWFzc2lnbi00LjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlRbXR4NVpZaDgvQVhMdlVRc3JJdjdzMkNHTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJvYmplY3QtaW5zcGVjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QtaW5zcGVjdC8tL29iamVjdC1pbnNwZWN0LTEuNi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1HSnpmQlo2RGdEQW1udWFNMzEwNGpSNHMxTXl4cjNZM3pmSXlONHozVWRxTjY5b1NSYWNOSzhVaG5vYkRkQys3SjJBSENqR3d4UXViTkpmRTcwU1hYUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib2JqZWN0LWtleXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMTIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC1rZXlzLy0vb2JqZWN0LWtleXMtMS4wLjEyLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1GVE15RlVtMndCY0dIbkgyZVhtejd0QzZJd2xxUVo2bVZaKzZkbTZ2WjRJUUlIanM2RmROc1FCdUtHUHVVVVVZNk5mSncyUHNoQzA4VG42THpMRE9hZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib24tZmluaXNoZWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb24tZmluaXNoZWQvLS9vbi1maW5pc2hlZC0yLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlQRXpaSUd3ZzgxMU0zbVNvV2x4cWkyUWFVYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlZS1maXJzdCI6ICIxLjEuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJvbmNlIjogeworICAgICAgInZlcnNpb24iOiAiMS40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29uY2UvLS9vbmNlLTEuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV0RzYXAzV1dIVXNST3NGOW5GQzY3NTNYYTlFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIndyYXBweSI6ICIxIgorICAgICAgfQorICAgIH0sCisgICAgIm9uZXRpbWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb25ldGltZS8tL29uZXRpbWUtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1CblFvSXcvV2RFT3llVXNpdTZVb3RvWjVZdFE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWltaWMtZm4iOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm9wdGltaXN0IjogeworICAgICAgInZlcnNpb24iOiAiMC42LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29wdGltaXN0Ly0vb3B0aW1pc3QtMC42LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0yajZuUm9iNklhR2FFUnd5YnBEckZhQVpab1k9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWluaW1pc3QiOiAifjAuMC4xIiwKKyAgICAgICAgIndvcmR3cmFwIjogIn4wLjAuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAid29yZHdyYXAiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4wLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93b3Jkd3JhcC8tL3dvcmR3cmFwLTAuMC4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLW85WGFiTlhBdkFBSTAzSTB1NjhiN1dNRmtRYz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJvcHRpb25hdG9yIjogeworICAgICAgInZlcnNpb24iOiAiMC44LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29wdGlvbmF0b3IvLS9vcHRpb25hdG9yLTAuOC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTmt4ZVFKMC9UV01CMXNDMHdGdTZVQmdLNjJRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZXAtaXMiOiAifjAuMS4zIiwKKyAgICAgICAgImZhc3QtbGV2ZW5zaHRlaW4iOiAifjIuMC40IiwKKyAgICAgICAgImxldm4iOiAifjAuMy4wIiwKKyAgICAgICAgInByZWx1ZGUtbHMiOiAifjEuMS4yIiwKKyAgICAgICAgInR5cGUtY2hlY2siOiAifjAuMy4yIiwKKyAgICAgICAgIndvcmR3cmFwIjogIn4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJvcy1ob21lZGlyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29zLWhvbWVkaXIvLS9vcy1ob21lZGlyLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtLzd4SmlETnVEb005NE1Gb3grOFZJU0dxZjdNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm9zLXRtcGRpciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vcy10bXBkaXIvLS9vcy10bXBkaXItMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS11K1owQnNlYXFGeGMvc2RtL2xjMFZWMzZFblE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGFyc2V1cmwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGFyc2V1cmwvLS9wYXJzZXVybC0xLjMuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLS9DaWRUdGlaTVJsR0RCVmlVeVlzM0kzbVcvTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLWlzLWFic29sdXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtaXMtYWJzb2x1dGUvLS9wYXRoLWlzLWFic29sdXRlLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRjB1U2FITlZOUCs4ZXM1cjlUcGFuaHRjWDE4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhdGgtaXMtaW5zaWRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtaXMtaW5zaWRlLy0vcGF0aC1pcy1pbnNpZGUtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ObFFYM3Q1RVF3MGNFYTloQW4rczhIUzkvRk09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGF0aC1rZXkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1rZXkvLS9wYXRoLWtleS0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVFSeXR0WFRGb1VEVHBMR1JEVURZRE1uMEMwQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLXBhcnNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtcGFyc2UvLS9wYXRoLXBhcnNlLTEuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1HU21PVDJFYkhySU5CZjlTUjdDREVMd2xKOEFFTmszUW43T2lrSzRuRllBdTNPdGUyK0pZTlZ2a3BBRVFtMy9UTE5FSkZEL3haSmp6eXhnM0tCV096dz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3BpZnkvLS9waWZ5LTIuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtN1JRYWFzQkRxRW5xV0lTWTU5eW9zVk13NlF3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBpbmtpZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9waW5raWUvLS9waW5raWUtMi4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jbFZyZ00rZzFJcVhUb0RuY2tqb0R0VDMrSEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGlua2llLXByb21pc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGlua2llLXByb21pc2UvLS9waW5raWUtcHJvbWlzZS0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlUWFczNmVqV01CcHJKc1hoM1lvZ2loRkQvbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwaW5raWUiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInBsdXJhbGl6ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjcuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wbHVyYWxpemUvLS9wbHVyYWxpemUtNy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUFSaEJPZHpTM2U0MUZia1cvWFdyVEV0dWtxcUxvSzUrWi80VWVEYUx1U1crMzlKUGVGZ3M0Z0NHcXNySkhWWlgwZlVyeC8vNE9GMEsxQ1VHd2xJRm93PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwcmVidWlsZC1pbnN0YWxsIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ByZWJ1aWxkLWluc3RhbGwvLS9wcmVidWlsZC1pbnN0YWxsLTQuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi03dGF5eGVZYm9KWDBSYlZ6ZG5LeUdsMnZoUVJXcjZxZkNsRVhEaE9rWGp1YU9LQ3cycThhaXVGaE9OUllWc0cvY3ppYTdLaHB5a0lsSTJTMlZhUHVuQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGV0ZWN0LWxpYmMiOiAiXjEuMC4zIiwKKyAgICAgICAgImV4cGFuZC10ZW1wbGF0ZSI6ICJeMS4wLjIiLAorICAgICAgICAiZ2l0aHViLWZyb20tcGFja2FnZSI6ICIwLjAuMCIsCisgICAgICAgICJtaW5pbWlzdCI6ICJeMS4yLjAiLAorICAgICAgICAibWtkaXJwIjogIl4wLjUuMSIsCisgICAgICAgICJub2RlLWFiaSI6ICJeMi4yLjAiLAorICAgICAgICAibm9vcC1sb2dnZXIiOiAiXjAuMS4xIiwKKyAgICAgICAgIm5wbWxvZyI6ICJeNC4wLjEiLAorICAgICAgICAib3MtaG9tZWRpciI6ICJeMS4wLjEiLAorICAgICAgICAicHVtcCI6ICJeMi4wLjEiLAorICAgICAgICAicmMiOiAiXjEuMS42IiwKKyAgICAgICAgInNpbXBsZS1nZXQiOiAiXjIuNy4wIiwKKyAgICAgICAgInRhci1mcyI6ICJeMS4xMy4wIiwKKyAgICAgICAgInR1bm5lbC1hZ2VudCI6ICJeMC42LjAiLAorICAgICAgICAid2hpY2gtcG0tcnVucyI6ICJeMS4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgIm1pbmltaXN0IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWlzdC8tL21pbmltaXN0LTEuMi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLW8xQUlzZzlCT0Q3c0g3a1U5TTFkOTVvbVFvUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJwcmVsdWRlLWxzIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ByZWx1ZGUtbHMvLS9wcmVsdWRlLWxzLTEuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSVpNcVZKOWVVdi9acUNmMWNPQkw1aXFYMmxRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInByZXR0aWVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4xNC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wcmV0dGllci8tL3ByZXR0aWVyLTEuMTQuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcVpEVm5Dcm5wc1JKSnE1blNzaUhDRTNCWU1FRDJPdHNJK2Ntekl6RjFRSWZxbTVBTGY4dEVKY08yN3pWMWdLTktSUGRoak8wZE5XbnJ6c3NEUTF0Rmc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInByZXR0aWVyLWxpbnRlci1oZWxwZXJzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ByZXR0aWVyLWxpbnRlci1oZWxwZXJzLy0vcHJldHRpZXItbGludGVyLWhlbHBlcnMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUdiSzJjUDlucmFTU1VGOU4yWHdVd3FmemxBRmxNTllZbCtTaEUvVitIOGE5dU5sL29VcUIxdzJFTDU0SmgwT2x5UlNkOFJmV1lKM2NvVlM0VFJPUDJ3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmYXN0LWRpZmYiOiAiXjEuMS4yIgorICAgICAgfQorICAgIH0sCisgICAgInByb2Nlc3MtbmV4dGljay1hcmdzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2Nlc3MtbmV4dGljay1hcmdzLy0vcHJvY2Vzcy1uZXh0aWNrLWFyZ3MtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU10RUMxVHFOMEVVNW5lcGhhSjRyQXRUaEh0Qzg2ZE5OOXFDdUVodHNodnBWQmtBVzVaTzdCQVNOOVJFbkY5ZW9YR2NSdWIrcEZ1S0VwT0hFK0hiRU13PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwcm9ncmVzcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wcm9ncmVzcy8tL3Byb2dyZXNzLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PRSthNnZ6cWF6YytLNkx4SnJYNVVQeUtGdkduTDVDWW1xMmpGR05JQldIcGM0UXlFNDkvWU91bWNycFFGSnBmZWptdlJ0Ykp6Z08xelBtTUNxbGJCZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHVtcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wdW1wLy0vcHVtcC0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcnVQTU5Sa04zTUhQMWNXSmM5T1dyK1QveERQMGpoWFlDTGZKY0J1WDU0aGhmSUJuYVFtQVVNZkRjRzRETTVVTVdCeUJiSlk2OVFTcGhtM2p0REtJa0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVuZC1vZi1zdHJlYW0iOiAiXjEuMS4wIiwKKyAgICAgICAgIm9uY2UiOiAiXjEuMy4xIgorICAgICAgfQorICAgIH0sCisgICAgInB1bnljb2RlIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3B1bnljb2RlLy0vcHVueWNvZGUtMi4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVhSc1JqZGYrajVtbCt5LzZHS0hQWmJyRi84cDJZZ2EwSlB0ZHFUSVkyWGU1b2hKUEQ5c2FESkpMUHZwOStOU0JwclZ2ZXZkWFp5Ym5qMmN2OE9FZDBBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJxIjogeworICAgICAgInZlcnNpb24iOiAiMS41LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3EvLS9xLTEuNS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZmpMM1cwRTRFcEhRUmhIeHZ4UVFtc0FHVWRjPSIKKyAgICB9LAorICAgICJyYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi44IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yYy8tL3JjLTEuMi44LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15M2JHZ3FLajNRQmR4TGJMa29tbG9oa3ZzQThnZEFpVVFsU0JKbkJoZm4rQlB4ZzRiYzYyZDhUY0JXMTV3YXZEZmdleENnY2Nja2hjWnZ5d3lRWVBPdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVlcC1leHRlbmQiOiAiXjAuNi4wIiwKKyAgICAgICAgImluaSI6ICJ+MS4zLjAiLAorICAgICAgICAibWluaW1pc3QiOiAiXjEuMi4wIiwKKyAgICAgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiAifjIuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJtaW5pbWlzdCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1pc3QvLS9taW5pbWlzdC0xLjIuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1vMUFJc2c5Qk9EN3NIN2tVOU0xZDk1b21Rb1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAicmVhZGFibGUtc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhZGFibGUtc3RyZWFtLy0vcmVhZGFibGUtc3RyZWFtLTIuMy42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10UXRLQTlXSUFoQkYzK1ZMQXNleU1xWmVCalcwQUhKb3hPdFlxU1VaTkp4YXVFcm1MYlZtMkZXMXkrSi9ZQTlkVXJBQzM5SVRlamxaV2hWSXdhd2tLdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29yZS11dGlsLWlzIjogIn4xLjAuMCIsCisgICAgICAgICJpbmhlcml0cyI6ICJ+Mi4wLjMiLAorICAgICAgICAiaXNhcnJheSI6ICJ+MS4wLjAiLAorICAgICAgICAicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOiAifjIuMC4wIiwKKyAgICAgICAgInNhZmUtYnVmZmVyIjogIn41LjEuMSIsCisgICAgICAgICJzdHJpbmdfZGVjb2RlciI6ICJ+MS4xLjEiLAorICAgICAgICAidXRpbC1kZXByZWNhdGUiOiAifjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInJlZ2V4cHAiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVnZXhwcC8tL3JlZ2V4cHAtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWx2ME02K1RrRFZuaUEzYUQxRWcwRFZwZlUvYm9vU3U3RWV2M1RETy9tWktIQmZWamdDR1RWNHQ0YnVwcEVTRVlEdGtBcllGT3hUSld2NlM1QytpYU53PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyZXF1aXJlLXVuY2FjaGVkIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcXVpcmUtdW5jYWNoZWQvLS9yZXF1aXJlLXVuY2FjaGVkLTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVGcxVzFzbG1MOU1lUXdFY1M1V3FTWlZVSWRNPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNhbGxlci1wYXRoIjogIl4wLjEuMCIsCisgICAgICAgICJyZXNvbHZlLWZyb20iOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlcXVpenpsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXF1aXp6bGUvLS9yZXF1aXp6bGUtMC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1hVVBEVXd4Tm1uNUc4YzNkVWNGWS9HY00yOTQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidW5kZXJzY29yZSI6ICJ+MS42LjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS42LjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLy0vdW5kZXJzY29yZS0xLjYuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1peml4REt6ZTlqTTN1TEpPVC9odFJhNmxLYWc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAicmVzb2x2ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXNvbHZlLy0vcmVzb2x2ZS0xLjEuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlERVUyQ3JTeGUyZWpnUVJzNU1vZGVpSjZYcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyZXNvbHZlLWZyb20iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzb2x2ZS1mcm9tLy0vcmVzb2x2ZS1mcm9tLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSnN2K2sxMGE3dXE3S2J3LzVhNndIcFBVUWlZPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInJlc3RvcmUtY3Vyc29yIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc3RvcmUtY3Vyc29yLy0vcmVzdG9yZS1jdXJzb3ItMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1uMzdpaC9ndjB5YlUvUllwSTlZaEtlN2czNjg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib25ldGltZSI6ICJeMi4wLjAiLAorICAgICAgICAic2lnbmFsLWV4aXQiOiAiXjMuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgInJlc3VtZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzdW1lci8tL3Jlc3VtZXItMC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04ZWowWWVRR1M2T2VncTg4M0NxTWlUMEhaMWs9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidGhyb3VnaCI6ICJ+Mi4zLjQiCisgICAgICB9CisgICAgfSwKKyAgICAicmltcmFmIjogeworICAgICAgInZlcnNpb24iOiAiMi42LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JpbXJhZi8tL3JpbXJhZi0yLjYuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbHJlZXdMSy9CbGdobXh0ZkgzNllZVmcxaThJQWNlNFRJN29hbzc1STFnMjQ1KzZCY3RxVFZRaUJQM1lVSjlDNkRRT1hKbWtZUjlYOWZDTHRDT0pjNXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdsb2IiOiAiXjcuMC41IgorICAgICAgfQorICAgIH0sCisgICAgInJ1bi1hc3luYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ydW4tYXN5bmMvLS9ydW4tYXN5bmMtMi4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1BM0dyU3VDOTF5RFVGbTE5L2FaUDk2UkZwc0E9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtcHJvbWlzZSI6ICJeMi4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicnhqcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMy4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yeGpzLy0vcnhqcy02LjMuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItSlRXbW9ZOXRXQ3M3enZJay9DdlJqaGpHYU9kK09WQk05ODdteEZvK09XNjZjR3BkS2paY3BtYzc0RVMxc0IvLzdLbC9QQWU4K3dFYWt1aEc0cGNnT3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInRzbGliIjogIl4xLjkuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzYWZlLWJ1ZmZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zYWZlLWJ1ZmZlci8tL3NhZmUtYnVmZmVyLTUuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1HZDJVWkJKRGtYbFk3R2JKeGZzRTgvbnZLa1VFVTFHMzhjMXNpTjZRUDZhOVBUOU1tSEI4R25wc2NTbU1KU29GOExPSXJ0OHVkL3dQdG9qeXM0RzYrZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2FmZXItYnVmZmVyIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NhZmVyLWJ1ZmZlci8tL3NhZmVyLWJ1ZmZlci0yLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItWVpvM0s4MlNEN1JpeWkwRTFFUVBvakx6N2twZXBuU1FJOUl5UGJISGcxWFhYZXZiNWRKSTd0cHlOMkFEeEdjUWJIRzd2Y3lSSGswY2J3cWNRcmlVdGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNlbXZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zZW12ZXIvLS9zZW12ZXItNS42LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJTOVI2UjM1TllnUW4rK2ZrRFdhT21xR29qNEVrOWdHcytEUHhOVVpLdXdFMTgzeGpKcm9LdnlvMUl6VkZlWHZVcnZtQUx5NkZXRDV4cmRKVDI1Z01nPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzZXQtYmxvY2tpbmciOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2V0LWJsb2NraW5nLy0vc2V0LWJsb2NraW5nLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQkYrWGd0QVJycHBvQTkzVGdySkRrclBZa1BjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNoZWJhbmctY29tbWFuZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaGViYW5nLWNvbW1hbmQvLS9zaGViYW5nLWNvbW1hbmQtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1SS3JHVzJsYkF6bUphTU9mTmovdVhlcjk4ZW89IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2hlYmFuZy1yZWdleCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic2hlYmFuZy1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaGViYW5nLXJlZ2V4Ly0vc2hlYmFuZy1yZWdleC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTJrTDBsMERBdEMyeXlwY29WeHl4a01tTy9xTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzaWduYWwtZXhpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaWduYWwtZXhpdC8tL3NpZ25hbC1leGl0LTMuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdGYzQWp4S0g2aEY0WW81QlhpVVRLM05rYkcwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNpbXBsZS1jb25jYXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2ltcGxlLWNvbmNhdC8tL3NpbXBsZS1jb25jYXQtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jMFRMdUxiaWI3Sjlackw4aHZuMjFabDFJY1k9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2ltcGxlLWdldCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuOC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaW1wbGUtZ2V0Ly0vc2ltcGxlLWdldC0yLjguMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbFNTSFJTdzNtUU5VR1BBWVJxbzd4eTlkaEtteEZYSWpManA0S0hwZjk5R0VIMlZIN0MzQU0rUWZ4NmR1NmpoZlVpNlZtN1huYkVWRWY3V2I2TjhqUnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlY29tcHJlc3MtcmVzcG9uc2UiOiAiXjMuMy4wIiwKKyAgICAgICAgIm9uY2UiOiAiXjEuMy4xIiwKKyAgICAgICAgInNpbXBsZS1jb25jYXQiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInNsaWNlLWFuc2kiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2xpY2UtYW5zaS8tL3NsaWNlLWFuc2ktMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVBPcXhCSzZMYjNxNnMwNDdEL1hzRFZOUG5GOURsOEpTYXFlOWg5bFVSbDBPZE5xeS91akRyT2lJSHRzcVhNR2JXV1RJb21SekFNYVR5YXdBVS8vUmVnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1mdWxsd2lkdGgtY29kZS1wb2ludCI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic291cmNlLW1hcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zb3VyY2UtbWFwLy0vc291cmNlLW1hcC0wLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTJyYy92UHdycUJtMDNnTzliMjZxU0JaTFA1MD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYW1kZWZpbmUiOiAiPj0wLjAuNCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzcHJpbnRmLWpzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwcmludGYtanMvLS9zcHJpbnRmLWpzLTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQk9hU2IyWW9sVFZQUGRBVklEWXp1RmNwZml3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInN0YXR1c2VzIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0YXR1c2VzLy0vc3RhdHVzZXMtMS4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0rdlVibnJkS3J2T3pyUFN0WDJHcjhreTN1VDQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3RyaW5nLXdpZHRoIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmluZy13aWR0aC8tL3N0cmluZy13aWR0aC0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbk9xSDU5ZGVDcTlTUkhseHExQXc4NUpudDR3Nkt2TEtxV1ZpazZvQTlaa2xYTE5JT2xxZzRGMnlyVDFNVmFUakFxdlZ3ZGZlWjd3N2FDdkpEN3Vna3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWZ1bGx3aWR0aC1jb2RlLXBvaW50IjogIl4yLjAuMCIsCisgICAgICAgICJzdHJpcC1hbnNpIjogIl40LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJpbmcucHJvdG90eXBlLnRyaW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nLnByb3RvdHlwZS50cmltLy0vc3RyaW5nLnByb3RvdHlwZS50cmltLTEuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMEUzaXlKNFRmMDE5SUc4SWExN1MrdWErak9vPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0aWVzIjogIl4xLjEuMiIsCisgICAgICAgICJlcy1hYnN0cmFjdCI6ICJeMS41LjAiLAorICAgICAgICAiZnVuY3Rpb24tYmluZCI6ICJeMS4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAic3RyaW5nX2RlY29kZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nX2RlY29kZXIvLS9zdHJpbmdfZGVjb2Rlci0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbi9TaG52RGk2RkhiYlZmdmlybytXb2ppRnp2K3M4TVBNSEJjelZlUGZVcERKTHdvTFQwaHQxbDRZd0JDYmk4cEpBdmVFRWRua0h5UHlUUC9telJmd2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNhZmUtYnVmZmVyIjogIn41LjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJpcC1hbnNpIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWFuc2kvLS9zdHJpcC1hbnNpLTQuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcUVlUUl1c2F3MmlvY1RpYlkxSml4UVh1Tm84PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktcmVnZXgiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaXAtanNvbi1jb21tZW50cy8tL3N0cmlwLWpzb24tY29tbWVudHMtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QRk1aUXVrSXdtbDhEc05FaFl3b2JIeWdwZ289IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3VwcG9ydHMtY29sb3IiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjUuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3VwcG9ydHMtY29sb3IvLS9zdXBwb3J0cy1jb2xvci01LjUuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUWpWandkWEl0NDA4TUlpQXFDWDRvVUtzZ1UyRXFBR3pzMlBwa200YVFZYmptK1pFV0VjVzRTZkZOVHI0dU1OWm1hMGV5NGY1bGdMcmtCMGFYMFFNb3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhhcy1mbGFnIjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0YWJsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90YWJsZS8tL3RhYmxlLTUuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lNTQyaW4yMlpMaEQvZk9JdVhzLzh5RFo5VzYxbHRGOGRhTTg4cmtSTnRnVEljdCt2STJmVG5BeXUvRGIyVENmRWNJOGk3bWpaejZtZUxxMG5XN1RZZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWp2IjogIl42LjUuMyIsCisgICAgICAgICJsb2Rhc2giOiAiXjQuMTcuMTAiLAorICAgICAgICAic2xpY2UtYW5zaSI6ICIxLjAuMCIsCisgICAgICAgICJzdHJpbmctd2lkdGgiOiAiXjIuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgInRhZmZ5ZGIiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGFmZnlkYi8tL3RhZmZ5ZGItMi42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1mTHkyUzFvVUcyb3UvQ3hkTEdlMDRWQ3lvbWc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidGFwZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuOS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90YXBlLy0vdGFwZS00LjkuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNmZLSVhrbkxwb2UvSnA0cnpIS0ZQcEpVSERIRHFuOGp1czk5SWZQbkhJanl6NzhIWWxlZlRHRDNiNUVrYlF6dUxmYUV2bWZQSzNJb2xMZ3EyeFQza3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZXAtZXF1YWwiOiAifjEuMC4xIiwKKyAgICAgICAgImRlZmluZWQiOiAifjEuMC4wIiwKKyAgICAgICAgImZvci1lYWNoIjogIn4wLjMuMyIsCisgICAgICAgICJmdW5jdGlvbi1iaW5kIjogIn4xLjEuMSIsCisgICAgICAgICJnbG9iIjogIn43LjEuMiIsCisgICAgICAgICJoYXMiOiAifjEuMC4zIiwKKyAgICAgICAgImluaGVyaXRzIjogIn4yLjAuMyIsCisgICAgICAgICJtaW5pbWlzdCI6ICJ+MS4yLjAiLAorICAgICAgICAib2JqZWN0LWluc3BlY3QiOiAifjEuNi4wIiwKKyAgICAgICAgInJlc29sdmUiOiAifjEuNy4xIiwKKyAgICAgICAgInJlc3VtZXIiOiAifjAuMC4wIiwKKyAgICAgICAgInN0cmluZy5wcm90b3R5cGUudHJpbSI6ICJ+MS4xLjIiLAorICAgICAgICAidGhyb3VnaCI6ICJ+Mi4zLjgiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgIm1pbmltaXN0IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWlzdC8tL21pbmltaXN0LTEuMi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLW8xQUlzZzlCT0Q3c0g3a1U5TTFkOTVvbVFvUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJyZXNvbHZlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuNy4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzb2x2ZS8tL3Jlc29sdmUtMS43LjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jN3J3TG9mcDhnMVUraDFLTnlITC9qaWNyS2cxRWs0cStMcjMzQUw2NXVaVGluVVpIZTMwRDVIbHlONVY5TlcwSlgxRDVkWFE0anFXNWw3U3kva0dmdz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAicGF0aC1wYXJzZSI6ICJeMS4wLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidGFyLWZzIjogeworICAgICAgInZlcnNpb24iOiAiMS4xNi4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90YXItZnMvLS90YXItZnMtMS4xNi4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1OdkNlWHBZeDdPc21PaDh6SU9QL2ViRzU1elpteExFMGV0ZldSYldvaytxMlFvOHgvdk9SL0lKVDF0YUFEWFBlK2pzaXU5YXhEYjNYNEIraUlnTmxLdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hvd25yIjogIl4xLjAuMSIsCisgICAgICAgICJta2RpcnAiOiAiXjAuNS4xIiwKKyAgICAgICAgInB1bXAiOiAiXjEuMC4wIiwKKyAgICAgICAgInRhci1zdHJlYW0iOiAiXjEuMS4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJwdW1wIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHVtcC8tL3B1bXAtMS4wLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi04azBKdXBXbWU1NSs5dENWRStGUzVVTFQzSzZBYmdxckdhNThsVFQ0OVJweWZ3d2NHZWRIcWFDNUxsUU5kRUF1bW4vd0ZzdTZhUHdrdVBNaW95OGtxdz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiZW5kLW9mLXN0cmVhbSI6ICJeMS4xLjAiLAorICAgICAgICAgICAgIm9uY2UiOiAiXjEuMy4xIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInRhci1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGFyLXN0cmVhbS8tL3Rhci1zdHJlYW0tMS42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXJ6UzBoZWlOZjhYbjcvbXBkU1ZWU01BV0FveTliZmIxV09UWUM3OFowVVFLZUthL0NXUzhGT3EwbEtHTmE4RFdLQW45Z3hqQ3ZNTFljNVBHWFlsSzJBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJibCI6ICJeMS4wLjAiLAorICAgICAgICAiYnVmZmVyLWFsbG9jIjogIl4xLjIuMCIsCisgICAgICAgICJlbmQtb2Ytc3RyZWFtIjogIl4xLjAuMCIsCisgICAgICAgICJmcy1jb25zdGFudHMiOiAiXjEuMC4wIiwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6ICJeMi4zLjAiLAorICAgICAgICAidG8tYnVmZmVyIjogIl4xLjEuMSIsCisgICAgICAgICJ4dGVuZCI6ICJeNC4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAidGV4dC10YWJsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90ZXh0LXRhYmxlLy0vdGV4dC10YWJsZS0wLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWYxN29JNjZBVWdmQUN2TGZTb1RzUDgrbGNMUT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0aHJvdWdoIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGhyb3VnaC8tL3Rocm91Z2gtMi4zLjgudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1EZFRKLzZxOE5YbGdzYmNrRVYxK0RvYWk0ZlU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidG1wIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjMzIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90bXAvLS90bXAtMC4wLjMzLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qUkNKbG9qS25aM2FkZHRUT2pkSXFvUnVQRUtCdk5YY0dZcXpPNnpXWlg4S2ZLRXBuR1k1amZnZ0pRM0VqS3V1OEQ0YkpScjB5K2NZSkZtWWJJbVhHdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib3MtdG1wZGlyIjogIn4xLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0by1idWZmZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdG8tYnVmZmVyLy0vdG8tYnVmZmVyLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1seDlCNWl2N21zdUZZRTNkeXRUK0tFNXRhcCtyTll3K0s0alZrYjlSL2FzQWIrcGJCU00xN2p0dW5IcGxoQmU2UlJKZFp4M1BuMkpwaDI0TzMybU9WZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidHNsaWIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjkuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHNsaWIvLS90c2xpYi0xLjkuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNGtyRjhzY3BlamhhT2dxekJFY0dNN3lESUVmaTAvOCs4ekRSWmhOWloya2ptSEo0aHYzekNiUVd4b0pHejFpdzVVMEpsMG5tYTEzeHpIWGNuY01hdlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInR1bm5lbC1hZ2VudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90dW5uZWwtYWdlbnQvLS90dW5uZWwtYWdlbnQtMC42LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1KNlhlb0dzMnNFb0ttV1ozU3lrSWFQRDhRUDA9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2FmZS1idWZmZXIiOiAiXjUuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInR5cGUtY2hlY2siOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHlwZS1jaGVjay8tL3R5cGUtY2hlY2stMC4zLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XSVRLdFJMUEhUVmVQN2VFOHdnRXNyVWcyM0k9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicHJlbHVkZS1scyI6ICJ+MS4xLjIiCisgICAgICB9CisgICAgfSwKKyAgICAidHlwZXNjcmlwdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90eXBlc2NyaXB0Ly0vdHlwZXNjcmlwdC0zLjEuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItdERNWWZWdHZwYjk2bXNTMWxEWDlNRWRIclc0eU91WjRLZGM0SGltOW9VNzk2WGxkUFlGL3QyK3VLb1gwQkJhMGhYWHdEbHFZUWJYWTVSemp6YzVoQkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVnbGlmeS1qcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNC45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91Z2xpZnktanMvLS91Z2xpZnktanMtMy40LjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLThDSnNiS090RWJuSnNUeXY2TEU2bTZaS25pcU1pRldtbTlzUmJvcGJrR3MzZ01QUGZkM0ZoOGlJQTRZa3Y1TWdhVGJxSHI0QmFvR0xKTFpOaHNyVzFRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29tbWFuZGVyIjogIn4yLjE3LjEiLAorICAgICAgICAic291cmNlLW1hcCI6ICJ+MC42LjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImNvbW1hbmRlciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjE3LjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb21tYW5kZXIvLS9jb21tYW5kZXItMi4xNy4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItd1BNVXQ2Rm5IMnl6Rzk1U0E2bXpqUU9FS1VVM2FMYURFbXpzMXRpKzFFOWgrQ3NyWmdoUmxxRU0vRUo0S3Njc1FWRzh1Tk40dVZyZVVlVDgrZHJsZ2c9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAic291cmNlLW1hcCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjYuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NvdXJjZS1tYXAvLS9zb3VyY2UtbWFwLTAuNi4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItVWpnYXB1bVdsYk1oa0JnelQ3WWtjNVlYVVQ0NkYwaUt1OFNHWHEwYmN3UDVkei9oMFBsajZlbkpxanoxWmJxMmw1V2FxWW5yVmJ3V09XTXlGM0Y0N2c9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidW5kZXJzY29yZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuOC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLy0vdW5kZXJzY29yZS0xLjguMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVR6KzFPeEJ1WUpmOCtjdEJDZktsNmIzNlVDST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1bmRlcnNjb3JlLWNvbnRyaWIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS1jb250cmliLy0vdW5kZXJzY29yZS1jb250cmliLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWmx0bXdrZUQrUG9yR01uNHk3RGl4OVNNSnNjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiAiMS42LjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS42LjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLy0vdW5kZXJzY29yZS0xLjYuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1peml4REt6ZTlqTTN1TEpPVC9odFJhNmxLYWc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidW5waXBlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VucGlwZS8tL3VucGlwZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXNyOU82RkZLcm1GbHRJRjRLZEliTHZTWkJPdz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1cmktanMiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXJpLWpzLy0vdXJpLWpzLTQuMi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1LWTlGcm1pcnFsOTFYMlFnanJ5MFdkNFkrWVRkcmRaaGVTOFRGd3ZrYkxXZi9HNUtOSkRDaDZwS0w1T1pjdEVXNCswQmFhNWlkSzJaUXVFTFJ3UHpuUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicHVueWNvZGUiOiAiXjIuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInV0Zi04LXZhbGlkYXRlIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3V0Zi04LXZhbGlkYXRlLy0vdXRmLTgtdmFsaWRhdGUtNC4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUNTNjNTc3A2enluQlE0SXhWemdqUDVBYmRvNkx1Sjg3SEZJY2dJaVZVZVk5NitNVEhrcUt0clVocGhid1E2alg4YVNHWnY4elg2bDFEQ1BwZmNBbnhBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJiaW5kaW5ncyI6ICJ+MS4zLjAiLAorICAgICAgICAibmFuIjogIn4yLjEwLjAiLAorICAgICAgICAicHJlYnVpbGQtaW5zdGFsbCI6ICJ+NC4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAidXRpbC1kZXByZWNhdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXRpbC1kZXByZWNhdGUvLS91dGlsLWRlcHJlY2F0ZS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVJRMU55ZnB3M25Nbll2dlMxS0tKZ1VHYURNOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1dGlscy1tZXJnZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91dGlscy1tZXJnZS8tL3V0aWxzLW1lcmdlLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbjVWeEQxQ2laNVI3TE13U1IwSEJBb1FuNXhNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIndoaWNoIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3doaWNoLy0vd2hpY2gtMS4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUh4SmRZV3ExTVRJUWJKM253MGNxc3NIb1ROVTI2N0tsckR1R1oxV1lseERTdFV0S1VoT2FKbWgxMTIvVFptSHh4VWZ1SnFQWFNPbTd0RHlhczBPU0lRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpc2V4ZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAid2hpY2gtcG0tcnVucyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93aGljaC1wbS1ydW5zLy0vd2hpY2gtcG0tcnVucy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVp3czYrOFZTNExWZDlyZDRES2RHRmZJNjBjcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ3aWRlLWFsaWduIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dpZGUtYWxpZ24vLS93aWRlLWFsaWduLTEuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1RR2tPUWM4WEw2QnQ1UHduc0V4S0JQdU1LQnhuR3hXV1czZlU1NVh0NGZlSG96TVVoZFVNYUJDazI5MHFwbS93RzV1L1JTS3p3ZEFDNGk1MVlpZ2loQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic3RyaW5nLXdpZHRoIjogIl4xLjAuMiB8fCAyIgorICAgICAgfQorICAgIH0sCisgICAgIndvcmR3cmFwIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dvcmR3cmFwLy0vd29yZHdyYXAtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1KMWhJRUlrVVZxUVhISTBDSmtRYTNwREx5dXM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid3JhcHB5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dyYXBweS8tL3dyYXBweS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRTUTlqejdCcWpYeE5rWUZ2QTBRTnVNS3RwOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ3cml0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93cml0ZS8tL3dyaXRlLTAuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWDhBNEtPSmt6cVAra1VWVWR2ZWp4V2JMQjFjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1rZGlycCI6ICJeMC41LjEiCisgICAgICB9CisgICAgfSwKKyAgICAid3MiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd3MvLS93cy01LjIuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItamFIRkQ2UEZ2NlVnb0lWZGE2cVpsbHB0UXNNbERFSmtUUWN5Ynp6WERZTTFYTzlZOGVtNjkxRkdNUG1NNDZXR3lMVTR6OUtNZ1FOK3FydXgvbmhsSEE9PSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luYy1saW1pdGVyIjogIn4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ4bWxjcmVhdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcveG1sY3JlYXRlLy0veG1sY3JlYXRlLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtK212M1lxWUtRVCt6M1k5TEE4V3lhU09OTUk4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInh0ZW5kIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3h0ZW5kLy0veHRlbmQtNC4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1wY2JWTXI1bGJpUGJnZzc3bERvZkJKbU5ZNjg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlLmpzb24gYi9wYWNrYWdlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1NTNlZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2UuanNvbgpAQCAtMCwwICsxLDY2IEBACit7CisgICJuYW1lIjogInRocmlmdCIsCisgICJkZXNjcmlwdGlvbiI6ICJub2RlLmpzIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtIiwKKyAgImhvbWVwYWdlIjogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy8iLAorICAicmVwb3NpdG9yeSI6IHsKKyAgICAidHlwZSI6ICJnaXQiLAorICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IgorICB9LAorICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICJhdXRob3IiOiB7CisgICAgIm5hbWUiOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIiwKKyAgICAiZW1haWwiOiAiZGV2QHRocmlmdC5hcGFjaGUub3JnIiwKKyAgICAidXJsIjogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKKyAgfSwKKyAgImxpY2Vuc2UiOiAiQXBhY2hlLTIuMCIsCisgICJsaWNlbnNlcyI6IFsKKyAgICB7CisgICAgICAidHlwZSI6ICJBcGFjaGUtMi4wIiwKKyAgICAgICJ1cmwiOiAiaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIgorICAgIH0KKyAgXSwKKyAgImJ1Z3MiOiB7CisgICAgIm1haWwiOiAiZGV2QHRocmlmdC5hcGFjaGUub3JnIiwKKyAgICAidXJsIjogImh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUIgorICB9LAorICAiZmlsZXMiOiBbCisgICAgImxpYi9ub2RlanMvbGliL3RocmlmdCIsCisgICAgImxpYi9ub2RlanMvUkVBRE1FLm1kIgorICBdLAorICAiZGlyZWN0b3JpZXMiOiB7CisgICAgImxpYiI6ICIuL2xpYi9ub2RlanMvbGliL3RocmlmdCIKKyAgfSwKKyAgIm1haW4iOiAiLi9saWIvbm9kZWpzL2xpYi90aHJpZnQiLAorICAiZW5naW5lcyI6IHsKKyAgICAibm9kZSI6ICI+PSA0LjEuMCIKKyAgfSwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAibm9kZS1pbnQ2NCI6ICJeMC40LjAiLAorICAgICJxIjogIl4xLjUuMCIsCisgICAgIndzIjogIl41LjAuMCIKKyAgfSwKKyAgImRldkRlcGVuZGVuY2llcyI6IHsKKyAgICAiYnVmZmVyLWVxdWFscyI6ICJeMS4wLjQiLAorICAgICJjb21tYW5kZXIiOiAiXjIuMTQuMSIsCisgICAgImNvbm5lY3QiOiAiXjMuNi42IiwKKyAgICAiZXNsaW50IjogIl41LjcuMCIsCisgICAgImVzbGludC1jb25maWctcHJldHRpZXIiOiAiXjMuMS4wIiwKKyAgICAiZXNsaW50LXBsdWdpbi1wcmV0dGllciI6ICJeMy4wLjAiLAorICAgICJpc3RhbmJ1bCI6ICJeMC40LjUiLAorICAgICJqc2RvYyI6ICJeMy41LjUiLAorICAgICJwcmV0dGllciI6ICJeMS4xNC4zIiwKKyAgICAidGFwZSI6ICJeNC45LjAiLAorICAgICJ1dGYtOC12YWxpZGF0ZSI6ICJeNC4wLjAiLAorICAgICJ0eXBlc2NyaXB0IjogIl4zLjEuNiIsCisgICAgIkB0eXBlcy9ub2RlIjogIl4xMC4xMi42IiwKKyAgICAiQHR5cGVzL3EiOiAiXjEuNS4xIgorICB9LAorICAic2NyaXB0cyI6IHsKKyAgICAiY292ZXIiOiAibGliL25vZGVqcy90ZXN0L3Rlc3RBbGwuc2ggQ09WRVIiLAorICAgICJ0ZXN0IjogImxpYi9ub2RlanMvdGVzdC90ZXN0QWxsLnNoIiwKKyAgICAidGVzdC10cyI6ICJsaWIvbm9kZXRzL3Rlc3QvdGVzdEFsbC5zaCIsCisgICAgInByZXR0aWVyIjogInByZXR0aWVyIC0td3JpdGUgJyoqLyouanMnIiwKKyAgICAibGludCI6ICJlc2xpbnQgbGliL25vZGVqcy8uIC0tZXh0IC5qcyIsCisgICAgImxpbnQtdGVzdHMiOiAiZXNsaW50IGxpYi9ub2RlanMvdGVzdC8uIC0tZXh0IC5qcyIKKyAgfQorfQpkaWZmIC0tZ2l0IGEvcGhwY3MueG1sLmRpc3QgYi9waHBjcy54bWwuZGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODAzODhhCi0tLSAvZGV2L251bGwKKysrIGIvcGhwY3MueG1sLmRpc3QKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8cnVsZXNldCBuYW1lPSJBcGFjaGVfVGhyaWZ0Ij4KKyAgICA8ZGVzY3JpcHRpb24+VGhlIGNvZGluZyBzdGFuZGFyZCBmb3IgdGhyaWZ0LjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZmlsZT5saWIvcGhwL2xpYjwvZmlsZT4KKyAgICA8ZmlsZT5saWIvcGhwL3Rlc3Q8L2ZpbGU+CisgICAgPGV4Y2x1ZGUtcGF0dGVybj5saWIvcGhwL3Rlc3QvcGFja2FnZXMvKjwvZXhjbHVkZS1wYXR0ZXJuPgorCisgICAgPGFyZyBuYW1lPSJiYXNlcGF0aCIgdmFsdWU9Ii4iLz4KKyAgICA8YXJnIG5hbWU9ImNvbG9ycyIgLz4KKyAgICA8YXJnIG5hbWU9InBhcmFsbGVsIiB2YWx1ZT0iNCIgLz4KKworICAgIDxydWxlIHJlZj0iUFNSMiI+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IlBTUjIuTWV0aG9kcy5NZXRob2REZWNsYXJhdGlvbi5VbmRlcnNjb3JlIi8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IlBTUjIuQ2xhc3Nlcy5Qcm9wZXJ0eURlY2xhcmF0aW9uLlVuZGVyc2NvcmUiLz4KKyAgICA8L3J1bGU+CisKKyAgICA8cnVsZSByZWY9IlBTUjEuRmlsZXMuU2lkZUVmZmVjdHMiPgorICAgICAgICA8ZXhjbHVkZS1wYXR0ZXJuPmxpYi9waHAvdGVzdC8qPC9leGNsdWRlLXBhdHRlcm4+CisgICAgPC9ydWxlPgorICAgIDxydWxlIHJlZj0iR2VuZXJpYy5GaWxlcy5MaW5lTGVuZ3RoIj4KKyAgICAgICAgPGV4Y2x1ZGUtcGF0dGVybj5saWIvcGhwL3Rlc3QvKjwvZXhjbHVkZS1wYXR0ZXJuPgorICAgIDwvcnVsZT4KKworPC9ydWxlc2V0PgpkaWZmIC0tZ2l0IGEvcHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kIGIvcHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNjk2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9wdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQKQEAgLTAsMCArMSwxOSBAQAorU29tZSBoZWxwZnVsIHRpcHMgZm9yIGEgc3VjY2Vzc2Z1bCBBcGFjaGUgVGhyaWZ0IFBSOgorCisqIERpZCB5b3UgdGVzdCB5b3VyIGNoYW5nZXMgbG9jYWxseSBvciB1c2luZyBDSSBpbiB5b3VyIGZvcms/CisqIElzIHRoZSBBcGFjaGUgSmlyYSBUSFJJRlQgdGlja2V0IGlkZW50aWZpZXIgaW4gdGhlIFBSIHRpdGxlPworKiBJcyB0aGUgQXBhY2hlIEppcmEgVEhSSUZUIHRpY2tldCBpZGVudGlmaWVyIGluIHRoZSBjb21taXQgbWVzc2FnZT8KKyogRGlkIHlvdSBzcXVhc2ggeW91ciBjaGFuZ2VzIHRvIGEgc2luZ2xlIGNvbW1pdD8KKyogQXJlIHRoZXNlIGNoYW5nZXMgYmFja3dhcmRzIGNvbXBhdGlibGU/IChwbGVhc2Ugc2F5IHNvIGluIFBSIGRlc2NyaXB0aW9uKQorKiBEbyB5b3UgbmVlZCB0byB1cGRhdGUgdGhlIGxhbmd1YWdlLXNwZWNpZmljIFJFQURNRT8KKworRXhhbXBsZSBpZGVhbCBwdWxsIHJlcXVlc3QgdGl0bGU6CisKKyAgICAgICAgVEhSSUZULTk5OTk6IGFuIGV4YW1wbGUgcHVsbCByZXF1ZXN0IHRpdGxlCisKK0V4YW1wbGUgaWRlYWwgY29tbWl0IG1lc3NhZ2U6CisKKyAgICAgICAgVEhSSUZULTk5OTk6IFtzdW1tYXJ5IG9mIGZpeCwgb25lIGxpbmUgaWYgcG9zc2libGVdCisgICAgICAgIENsaWVudDogW2xhbmd1YWdlKHMpIGFmZmVjdGVkLCBjb21tYSBzZXBhcmF0ZWQsIHVzZSBsaWIvIGRpcmVjdG9yeSBuYW1lcyBwbGVhc2VdCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNvbW1pdHRpbmcsIHNlZSBDT05UUklCVVRJTkcubWQKZGlmZiAtLWdpdCBhL3JhdF9leGNsdWRlIGIvcmF0X2V4Y2x1ZGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwY2NlZDUuLjAwMDAwMDAKLS0tIGEvcmF0X2V4Y2x1ZGUKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0uZ2l0aWdub3JlCi1DSEFOR0VTCi1DT05UUklCVVRPUlMKLWF1dG9zY2FuLmxvZwotY29uZmlnLmd1ZXNzCi1jb25maWcubG9nCi1jb25maWcuc3RhdHVzCi1jb25maWcuc3ViCi1jb25maWd1cmUKLWNvbmZpZ3VyZS5zY2FuCi1kZXBjb21wCi1pbnN0YWxsLXNoCi1saWJ0b29sCi1sdG1haW4uc2gKLW1pc3NpbmcKLXN0YW1wLWgxCi15bHdyYXAKLSoubTQKLWF1dG9tNHRlLmNhY2hlCi10aHJpZnR5LmgKLXZlcnNpb24uaAotdmVyc2lvbi5oLmluCi1tZDUuYwotbWQ1LmgKLWRvYwotbGliL2VybC92c24ubWsKLS9saWIvZXJsL2J1aWxkLyoqLyoKLWxpYi9lcmwvc3JjL01ha2VmaWxlCi10aHJpZnQuYXBwdXAuc3JjCi1PQ2FtbE1ha2VmaWxlCi1SRUFETUUtT0NhbWxNYWtlZmlsZQotVE9ETwotTWFuaWZlc3QKLXNldHVwLnJiCmRpZmYgLS1naXQgYS9zb25hci1wcm9qZWN0LnByb3BlcnRpZXMgYi9zb25hci1wcm9qZWN0LnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmQ1ZWNjMgotLS0gL2Rldi9udWxsCisrKyBiL3NvbmFyLXByb2plY3QucHJvcGVydGllcwpAQCAtMCwwICsxLDE0MCBAQAor77u/IyBBcGFjaGUgVGhyaWZ0IMKpIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKworIyBGaWxlOiBzb25hci1wcm9qZWN0LnByb3BlcnRpZXMKKyMgQXBhY2hlIFRocmlmdCBjb25maWd1cmF0aW9uIGZpbGUgZm9yIFNvbmFyIGh0dHBzOi8vYW5hbHlzaXMuYXBhY2hlLm9yZy8KKyMgU29uYXIgaXMgYW4gb3BlbiBwbGF0Zm9ybSB0byBtYW5hZ2UgY29kZSBxdWFsaXR5IGh0dHA6Ly93d3cuc29uYXJzb3VyY2Uub3JnLworCisKKyMgcmVxdWlyZWQgbWV0YWRhdGEKK3NvbmFyLnByb2plY3RLZXk9b3JnLmFwYWNoZS50aHJpZnQKK3NvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQKK3NvbmFyLnByb2plY3REZXNjcmlwdGlvbj0KK1RoZSBBcGFjaGUgVGhyaWZ0IHNvZnR3YXJlIGZyYW1ld29yaywgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCitkZXZlbG9wbWVudCwgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0byBidWlsZAorc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5IGJldHdlZW4gYWxsIG1ham9yIGxhbmd1YWdlcy4KKworIyBBcGFjaGUgVGhyaWZ0IFZlcnNpb24KK3NvbmFyLnByb2plY3RWZXJzaW9uPTEuMC4wCisjIHVzZSB0aGlzIHRvIHNldCBhbm90aGVyIHZlcnNpb24gc3RyaW5nCisjICQgc29uYXItcnVubmVyIC1EIHNvbmFyLnByb2plY3RWZXJzaW9uPWBnaXQgcmV2LXBhcnNlIEhFQURgCisjIHNldCBwcm9qZWN0RGF0ZSBpbiBjb21iaW5hdGlvbiB3aXRoIHByb2plY3RWZXJzaW9uIGZvciBpbXBvcnRzIG9mIG9sZCByZWxlYXNlcworI3NvbmFyLnByb2plY3REYXRlPXl5eXktTU0tZGQKKworIyBUT0RPIGFkZCB3ZWJzaXRlIChzb25hci5wcm9qZWN0VXJsIGRvZXMgbm90IHdvcmspCisjc29uYXIuWFhYWD1odHRwLy90aHJpZnQuYXBhY2hlLm9yZworCisjIFNvbWUgcHJvcGVydGllcyB0aGF0IHdpbGwgYmUgaW5oZXJpdGVkIGJ5IHRoZSBtb2R1bGVzCitzb25hci5zb3VyY2VzPXNyYworc29uYXIubGFuZ3VhZ2U9amF2YSxqcyxjKysscHksYworc29uYXIuc291cmNlRW5jb2Rpbmc9VVRGLTgKKworIyBzY20KK3NvbmFyLnNjbS51cmw9c2NtOmdpdDpodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQKKworIyBjcHBjaGVjayAtcSAtLWVycm9yLWV4aXRjb2RlPTAgLS14bWwgLiAyPiBjcHBjaGVjay1yZXN1bHQueG1sCitzb25hci5jeHguY3BwY2hlY2sucmVwb3J0UGF0aD1jcHBjaGVjay1yZXN1bHQueG1sCisKKyMgTGlzdCBvZiB0aGUgbW9kdWxlIGlkZW50aWZpZXJzCitzb25hci5tb2R1bGVzPW1vZHVsZTEsbW9kdWxlMyxtb2R1bGU0LG1vZHVsZTUsbW9kdWxlNixtb2R1bGU3LG1vZHVsZTgsbW9kdWxlOSxtb2R1bGUxMCxtb2R1bGUxMSxtb2R1bGUxMixtb2R1bGUxNAorCisKKworIyB3ZSBuZWVkIHNvbmFyLXJ1bm5lciAyLjEgZm9yIHRoaXMsIHNlZSBodHRwOi8vamlyYS5jb2RlaGF1cy5vcmcvYnJvd3NlL1NPTkFSUExVR0lOUy0yNDIxCisjc29uYXIubW9kdWxlcz1tb2R1bGUyCisKKyMgZGVscGggcGx1Z2luIGlzIGJyb2tlbgorI3NvbmFyLm1vZHVsZXM9bW9kdWxlMTMKKworIyBwaHB1bml0IHBsdWdpbiBpcyBicm9rZW4KKyNzb25hci5tb2R1bGVzPW1vZHVsZTE1CisKK21vZHVsZTEuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIEphdmEgTGlicmFyeQorbW9kdWxlMS5zb25hci5wcm9qZWN0QmFzZURpcj1saWIvamF2YQorbW9kdWxlMS5zb25hci5zb3VyY2VzPXNyYworbW9kdWxlMS5zb25hci50ZXN0cz10ZXN0Cittb2R1bGUxLnNvbmFyLmJpbmFyaWVzPWJ1aWxkL2xpYnMvbGlidGhyaWZ0LTEuMC4wLmphcgorbW9kdWxlMS5zb25hci5saWJyYXJpZXM9YnVpbGQvZGVwcy8qLmphcgorbW9kdWxlMS5zb25hci5sYW5ndWFnZT1qYXZhCisKK21vZHVsZTIuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIEphdmEgVHV0b3JpYWwKK21vZHVsZTIuc29uYXIucHJvamVjdEJhc2VEaXI9LgorbW9kdWxlMi5zb25hci5zb3VyY2VzPXR1dG9yaWFsL2phdmEvc3JjLCB0dXRvcmlhbC9qYXZhL2dlbi1qYXZhCittb2R1bGUyLnNvbmFyLmJpbmFyaWVzPXR1dG9yaWFsL2phdmEvdHV0b3JpYWwuamFyCittb2R1bGUyLnNvbmFyLmxpYnJhcmllcz1saWIvamF2YS9idWlsZC9kZXBzLyouamFyLGxpYi9qYXZhL2J1aWxkL2xpYnMvbGlidGhyaWZ0LTEuMC4wLmphcgorbW9kdWxlMi5zb25hci5sYW5ndWFnZT1qYXZhCisKK21vZHVsZTMuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIEphdmFTY3JpcHQgTGlicmFyeQorbW9kdWxlMy5zb25hci5wcm9qZWN0QmFzZURpcj1saWIvanMKK21vZHVsZTMuc29uYXIuc291cmNlcz0uCittb2R1bGUzLnNvbmFyLmV4Y2x1c2lvbnM9dGVzdC8qKi8qCittb2R1bGUzLnNvbmFyLmxhbmd1YWdlPWpzCisKK21vZHVsZTQuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIEphdmFTY3JpcHQgVHV0b3JpYWwKK21vZHVsZTQuc29uYXIucHJvamVjdEJhc2VEaXI9dHV0b3JpYWwvanMKK21vZHVsZTQuc29uYXIuc291cmNlcz0uCittb2R1bGU0LnNvbmFyLmxhbmd1YWdlPXdlYgorCittb2R1bGU1LnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBDKysgTGlicmFyeQorbW9kdWxlNS5zb25hci5wcm9qZWN0QmFzZURpcj1saWIvY3BwCittb2R1bGU1LnNvbmFyLnNvdXJjZXM9c3JjCittb2R1bGU1LnNvbmFyLnRlc3RzPXRlc3QKK21vZHVsZTUuc29uYXIubGFuZ3VhZ2U9YysrCisKK21vZHVsZTYuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIEMrKyBUdXRvcmlhbAorbW9kdWxlNi5zb25hci5wcm9qZWN0QmFzZURpcj10dXRvcmlhbC9jcHAKK21vZHVsZTYuc29uYXIuc291cmNlcz0uCittb2R1bGU2LnNvbmFyLmV4Y2x1c2lvbnM9Z2VuLWNwcC8qKi8qCittb2R1bGU2LnNvbmFyLmxhbmd1YWdlPWMrKworCittb2R1bGU3LnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBDKysgQ3Jvc3MgTGFuZ3VhZ2UgVGVzdAorbW9kdWxlNy5zb25hci5wcm9qZWN0QmFzZURpcj10ZXN0L2NwcAorbW9kdWxlNy5zb25hci5zb3VyY2VzPXNyYworbW9kdWxlNy5zb25hci5sYW5ndWFnZT1jKysKKworbW9kdWxlOC5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gQ29tcGlsZXIKK21vZHVsZTguc29uYXIucHJvamVjdEJhc2VEaXI9Y29tcGlsZXIvY3BwCittb2R1bGU4LnNvbmFyLnNvdXJjZXM9c3JjCittb2R1bGU4LnNvbmFyLmxhbmd1YWdlPWMrKworCittb2R1bGU5LnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBQeXRob24gTGlicmFyeQorbW9kdWxlOS5zb25hci5wcm9qZWN0QmFzZURpcj1saWIvcHkKK21vZHVsZTkuc29uYXIuc291cmNlcz1zcmMKK21vZHVsZTkuc29uYXIubGFuZ3VhZ2U9cHkKKworbW9kdWxlMTAuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIFB5dGhvbiBUdXRvcmlhbAorbW9kdWxlMTAuc29uYXIucHJvamVjdEJhc2VEaXI9dHV0b3JpYWwvcHkKK21vZHVsZTEwLnNvbmFyLnNvdXJjZXM9LgorbW9kdWxlMTAuc29uYXIuZXhjbHVzaW9ucz1nZW4tcHkvKiovKgorbW9kdWxlMTAuc29uYXIubGFuZ3VhZ2U9cHkKKworbW9kdWxlMTEuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIFB5dGhvbiBDcm9zcyBMYW5ndWFnZSBUZXN0Cittb2R1bGUxMS5zb25hci5wcm9qZWN0QmFzZURpcj10ZXN0L3B5Cittb2R1bGUxMS5zb25hci5zb3VyY2VzPS4KK21vZHVsZTExLnNvbmFyLmV4Y2x1c2lvbnM9Z2VuLSovKiovKgorbW9kdWxlMTEuc29uYXIubGFuZ3VhZ2U9cHkKKworbW9kdWxlMTIuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIGNfZ2xpYiBMaWJyYXJ5Cittb2R1bGUxMi5zb25hci5wcm9qZWN0QmFzZURpcj1saWIvY19nbGliCittb2R1bGUxMi5zb25hci5zb3VyY2VzPXNyYworbW9kdWxlMTIuc29uYXIubGFuZ3VhZ2U9YworCittb2R1bGUxMy5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gRGVscGhpIExpYnJhcnkKK21vZHVsZTEzLnNvbmFyLnByb2plY3RCYXNlRGlyPWxpYi9kZWxwaGkKK21vZHVsZTEzLnNvbmFyLnNvdXJjZXM9c3JjCittb2R1bGUxMy5zb25hci50ZXN0cz10ZXN0Cittb2R1bGUxMy5zb25hci5sYW5ndWFnZT1kZWxwaAorCittb2R1bGUxNC5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gRmxleCAoYXMzKSBMaWJyYXJ5Cittb2R1bGUxNC5zb25hci5wcm9qZWN0QmFzZURpcj1saWIvYXMzCittb2R1bGUxNC5zb25hci5zb3VyY2VzPXNyYworbW9kdWxlMTQuc29uYXIubGFuZ3VhZ2U9ZmxleAorCittb2R1bGUxNS5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gUEhQIExpYnJhcnkKK21vZHVsZTE1LnNvbmFyLnByb2plY3RCYXNlRGlyPWxpYi9waHAKK21vZHVsZTE1LnNvbmFyLnNvdXJjZXM9c3JjCittb2R1bGUxNS5zb25hci5sYW5ndWFnZT1waHAKKworIyBUT0RPIGFkZCBzb21lIG1vcmUgbGFuZ3VhZ2VzIGhlcmUKKwpkaWZmIC0tZ2l0IGEvdGVzdC9Bbm5vdGF0aW9uVGVzdC50aHJpZnQgYi90ZXN0L0Fubm90YXRpb25UZXN0LnRocmlmdAppbmRleCAxYTM0MzIwLi43ZTI0ZTFjIDEwMDY0NAotLS0gYS90ZXN0L0Fubm90YXRpb25UZXN0LnRocmlmdAorKysgYi90ZXN0L0Fubm90YXRpb25UZXN0LnRocmlmdApAQCAtMjgsNyArMjgsNDUgQEAKICAgY3BwLnR5cGUgPSAiRGVuc2VGb28iLAogICBweXRob24udHlwZSA9ICJEZW5zZUZvbyIsCiAgIGphdmEuZmluYWwgPSAiIiwKKyAgYW5ub3RhdGlvbi53aXRob3V0LnZhbHVlLAogKQogCi10eXBlZGVmIHN0cmluZyAoIHVuaWNvZGUuZW5jb2RpbmcgPSAiVVRGLTE2IiApIG5vbl9sYXRpbl9zdHJpbmcKK2V4Y2VwdGlvbiBmb29fZXJyb3IgeworICAxOiBpMzIgZXJyb3JfY29kZSAoIGZvbz0iYmFyIiApCisgIDI6IHN0cmluZyBlcnJvcl9tc2cKK30gKGZvbyA9ICJiYXIiKQorCit0eXBlZGVmIHN0cmluZyAoIHVuaWNvZGUuZW5jb2RpbmcgPSAiVVRGLTE2IiApIG5vbl9sYXRpbl9zdHJpbmcgKGZvbz0iYmFyIikKIHR5cGVkZWYgbGlzdDwgZG91YmxlICggY3BwLmZpeGVkX3BvaW50ID0gIjE2IiApID4gdGlueV9mbG9hdF9saXN0CisKK2VudW0gd2Vla2RheXMgeworICBTVU5EQVkgKCB3ZWVrZW5kID0gInllcyIgKSwKKyAgTU9OREFZLAorICBUVUVTREFZLAorICBXRURORVNEQVksCisgIFRIVVJTREFZLAorICBGUklEQVksCisgIFNBVFVSREFZICggd2Vla2VuZCA9ICJ5ZXMiICkKK30gKGZvby5iYXI9ImJheiIpCisKKy8qIE5vdGUgdGhhdCBhbm5vdGF0aW9ucyBvbiBzZW51bSB2YWx1ZXMgYXJlIG5vdCBzdXBwb3J0ZWQuICovCitzZW51bSBzZWFzb25zIHsKKyAgIlNwcmluZyIsCisgICJTdW1tZXIiLAorICAiRmFsbCIsCisgICJXaW50ZXIiCit9ICggZm9vID0gImJhciIgKQorCitzdHJ1Y3Qgb3N0cl9kZWZhdWx0IHsKKyAgMTogaTMyIGJhcjsKK30KKworc3RydWN0IG9zdHJfY3VzdG9tIHsKKyAgMTogaTMyIGJhcjsKK30gKGNwcC5jdXN0b21vc3RyZWFtKQorCisKK3NlcnZpY2UgZm9vX3NlcnZpY2UgeworICB2b2lkIGZvbygpICggZm9vID0gImJhciIgKQorfSAoYS5iPSJjIikKKwpkaWZmIC0tZ2l0IGEvdGVzdC9Db25zdGFudHNEZW1vLnRocmlmdCBiL3Rlc3QvQ29uc3RhbnRzRGVtby50aHJpZnQKaW5kZXggN2Q5NzFlNi4uYTU0NTM0ZCAxMDA2NDQKLS0tIGEvdGVzdC9Db25zdGFudHNEZW1vLnRocmlmdAorKysgYi90ZXN0L0NvbnN0YW50c0RlbW8udGhyaWZ0CkBAIC0xOCw2ICsxOCw3IEBACiAgKi8KIAogbmFtZXNwYWNlIGNwcCB5b3pvbmUKK25hbWVzcGFjZSBlcmwgY29uc3RzXwogCiBzdHJ1Y3QgdGhpbmcgewogICAxOiBpMzIgaGVsbG8sCkBAIC00MCwxMiArNDEsMTYgQEAKIC8vY29uc3QgbWFwPGVudW1jb25zdGFudHMsc3RyaW5nPiBHRU5fRU5VTV9OQU1FUyA9IHtPTkUgOiAiSE9XRFkiLCBUV086ICJQQVJUTkVSIn0KIAogY29uc3QgaTMyIGhleF9jb25zdCA9IDB4MDAwMUYKK2NvbnN0IGkzMiBuZWdhdGl2ZV9oZXhfY29uc3RhbnQgPSAtMHgwMDAxRgogCiBjb25zdCBpMzIgR0VOX01FID0gLTM1MjM1NTMKIGNvbnN0IGRvdWJsZSBHRW5fRFVCID0gMzI1LjUzMgogY29uc3QgZG91YmxlIEdFbl9EVSA9IDA4NS4yMzU1CiBjb25zdCBzdHJpbmcgR0VOX1NUUklORyA9ICJhc2xka2phc2ZkIgogCitjb25zdCBkb3VibGUgZTEwID0gMWUxMCAgIC8vIGZhaWxzIHdpdGggMC45LjMgYW5kIGVhcmxpZXIKK2NvbnN0IGRvdWJsZSBlMTEgPSAtMWUxMCAgCisKIGNvbnN0IG1hcDxpMzIsaTMyPiBHRU5fTUFQID0geyAzNTUzMiA6IDIzMywgNDM1MjMgOiA4NTMgfQogY29uc3QgbGlzdDxpMzI+IEdFTl9MSVNUID0gWyAyMzUyMzUsIDIzNTk4MzUyLCAzMjUzNTIzIF0KIApkaWZmIC0tZ2l0IGEvdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgYi90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAppbmRleCAyM2Q1ZDk3Li5iNmE3NjU5IDEwMDY0NAotLS0gYS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAorKysgYi90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdApAQCAtMjAsNiArMjAsNyBAQAogbmFtZXNwYWNlIGNfZ2xpYiBUVGVzdAogbmFtZXNwYWNlIGNwcCB0aHJpZnQudGVzdC5kZWJ1ZwogbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKK25hbWVzcGFjZSByYiB0aHJpZnQudGVzdAogCiBzdHJ1Y3QgRG91YmxlcyB7CiAgMTogZG91YmxlIG5hbiwKQEAgLTI3LDcgKzI4LDcgQEAKICAzOiBkb3VibGUgbmVnaW5mLAogIDQ6IGRvdWJsZSByZXBlYXRpbmcsCiAgNTogZG91YmxlIGJpZywKLSA2OiBkb3VibGUgc21hbGwsCisgNjogZG91YmxlIHRpbnksCiAgNzogZG91YmxlIHplcm8sCiAgODogZG91YmxlIG5lZ3plcm8sCiB9CkBAIC0zNSw3ICszNiw3IEBACiBzdHJ1Y3QgT25lT2ZFYWNoIHsKICAgMTogYm9vbCBpbV90cnVlLAogICAyOiBib29sIGltX2ZhbHNlLAotICAzOiBieXRlIGFfYml0ZSA9IDB4N2YsCisgIDM6IGk4IGFfYml0ZSA9IDB4N2YsCiAgIDQ6IGkxNiBpbnRlZ2VyMTYgPSAweDdmZmYsCiAgIDU6IGkzMiBpbnRlZ2VyMzIsCiAgIDY6IGk2NCBpbnRlZ2VyNjQgPSAxMDAwMDAwMDAwMCwKQEAgLTQ0LDcgKzQ1LDcgQEAKICAgOTogc3RyaW5nIHpvbWdfdW5pY29kZSwKICAgMTA6IGJvb2wgd2hhdF93aG8sCiAgIDExOiBiaW5hcnkgYmFzZTY0LAotICAxMjogbGlzdDxieXRlPiBieXRlX2xpc3QgPSBbMSwgMiwgM10sCisgIDEyOiBsaXN0PGk4PiBieXRlX2xpc3QgPSBbMSwgMiwgM10sCiAgIDEzOiBsaXN0PGkxNj4gaTE2X2xpc3QgPSBbMSwyLDNdLAogICAxNDogbGlzdDxpNjQ+IGk2NF9saXN0ID0gWzEsMiwzXQogfQpAQCAtNjEsNyArNjIsNyBAQAogCiBzdHJ1Y3QgSG9seU1vbGV5IHsKICAgMTogbGlzdDxPbmVPZkVhY2g+IGJpZywKLSAgMjogc2V0PGxpc3Q8c3RyaW5nPj4gY29udGFpbiwKKyAgMjogc2V0PGxpc3Q8c3RyaW5nPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4gY29udGFpbiwKICAgMzogbWFwPHN0cmluZyxsaXN0PEJvbms+PiBib25rcywKIH0KIApAQCAtNzEsMTEgKzcyLDE1IEBACiB9CiAKIHN0cnVjdCBFbXB0eSB7Ci19Cit9ICgKKyAgcHl0aG9uLmltbXV0YWJsZSA9ICIiLAorKQogCiBzdHJ1Y3QgV3JhcHBlciB7CiAgIDE6IEVtcHR5IGZvbwotfQorfSAoCisgIHB5dGhvbi5pbW11dGFibGUgPSAiIiwKKykKIAogc3RydWN0IFJhbmRvbVN0dWZmIHsKICAgMTogaTMyIGEsCkBAIC0xMDAsNyArMTA1LDcgQEAKIAogc3RydWN0IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QgewogICAvLyBwcmltaXRpdmUgZmllbGRzCi0gIDE6IGJ5dGUgICBhX2J5dGU7CisgIDE6IGk4ICAgICBhX2J5dGU7CiAgIDI6IGkxNiAgICBhX2kxNjsKICAgMzogaTMyICAgIGFfaTMyOwogICA0OiBpNjQgICAgYV9pNjQ7CkBAIC0xMTAsOSArMTE1LDkgQEAKICAgODogYm9vbCAgIHRydWVfZmllbGQ7CiAgIDk6IGJvb2wgICBmYWxzZV9maWVsZDsKICAgMTA6IEVtcHR5IGVtcHR5X3N0cnVjdF9maWVsZDsKLSAgCisKICAgLy8gcHJpbWl0aXZlcyBpbiBsaXN0cwotICAxMTogbGlzdDxieXRlPiAgICBieXRlX2xpc3Q7CisgIDExOiBsaXN0PGk4PiAgICAgIGJ5dGVfbGlzdDsKICAgMTI6IGxpc3Q8aTE2PiAgICAgaTE2X2xpc3Q7CiAgIDEzOiBsaXN0PGkzMj4gICAgIGkzMl9saXN0OwogICAxNDogbGlzdDxpNjQ+ICAgICBpNjRfbGlzdDsKQEAgLTEyMSw5ICsxMjYsOSBAQAogICAxNzogbGlzdDxiaW5hcnk+ICBiaW5hcnlfbGlzdDsKICAgMTg6IGxpc3Q8Ym9vbD4gICAgYm9vbGVhbl9saXN0OwogICAxOTogbGlzdDxFbXB0eT4gICBzdHJ1Y3RfbGlzdDsKLSAgCisKICAgLy8gcHJpbWl0aXZlcyBpbiBzZXRzCi0gIDIwOiBzZXQ8Ynl0ZT4gICAgIGJ5dGVfc2V0OworICAyMDogc2V0PGk4PiAgICAgICBieXRlX3NldDsKICAgMjE6IHNldDxpMTY+ICAgICAgaTE2X3NldDsKICAgMjI6IHNldDxpMzI+ICAgICAgaTMyX3NldDsKICAgMjM6IHNldDxpNjQ+ICAgICAgaTY0X3NldDsKQEAgLTEzMiwzNSArMTM3LDM5IEBACiAgIDI2OiBzZXQ8YmluYXJ5PiAgIGJpbmFyeV9zZXQ7CiAgIDI3OiBzZXQ8Ym9vbD4gICAgIGJvb2xlYW5fc2V0OwogICAyODogc2V0PEVtcHR5PiAgICBzdHJ1Y3Rfc2V0OwotICAKKwogICAvLyBtYXBzCiAgIC8vIHByaW1pdGl2ZXMgYXMga2V5cwotICAyOTogbWFwPGJ5dGUsIGJ5dGU+ICAgICAgICAgICAgIGJ5dGVfYnl0ZV9tYXA7Ci0gIDMwOiBtYXA8aTE2LCBieXRlPiAgICAgICAgICAgICAgaTE2X2J5dGVfbWFwOwotICAzMTogbWFwPGkzMiwgYnl0ZT4gICAgICAgICAgICAgIGkzMl9ieXRlX21hcDsKLSAgMzI6IG1hcDxpNjQsIGJ5dGU+ICAgICAgICAgICAgICBpNjRfYnl0ZV9tYXA7Ci0gIDMzOiBtYXA8ZG91YmxlLCBieXRlPiAgICAgICAgICAgZG91YmxlX2J5dGVfbWFwOwotICAzNDogbWFwPHN0cmluZywgYnl0ZT4gICAgICAgICAgIHN0cmluZ19ieXRlX21hcDsKLSAgMzU6IG1hcDxiaW5hcnksIGJ5dGU+ICAgICAgICAgICBiaW5hcnlfYnl0ZV9tYXA7Ci0gIDM2OiBtYXA8Ym9vbCwgYnl0ZT4gICAgICAgICAgICAgYm9vbGVhbl9ieXRlX21hcDsKKyAgMjk6IG1hcDxpOCwgaTg+ICAgICAgICAgICAgICAgYnl0ZV9ieXRlX21hcDsKKyAgMzA6IG1hcDxpMTYsIGk4PiAgICAgICAgICAgICAgaTE2X2J5dGVfbWFwOworICAzMTogbWFwPGkzMiwgaTg+ICAgICAgICAgICAgICBpMzJfYnl0ZV9tYXA7CisgIDMyOiBtYXA8aTY0LCBpOD4gICAgICAgICAgICAgIGk2NF9ieXRlX21hcDsKKyAgMzM6IG1hcDxkb3VibGUsIGk4PiAgICAgICAgICAgZG91YmxlX2J5dGVfbWFwOworICAzNDogbWFwPHN0cmluZywgaTg+ICAgICAgICAgICBzdHJpbmdfYnl0ZV9tYXA7CisgIDM1OiBtYXA8YmluYXJ5LCBpOD4gICAgICAgICAgIGJpbmFyeV9ieXRlX21hcDsKKyAgMzY6IG1hcDxib29sLCBpOD4gICAgICAgICAgICAgYm9vbGVhbl9ieXRlX21hcDsKICAgLy8gcHJpbWl0aXZlcyBhcyB2YWx1ZXMKLSAgMzc6IG1hcDxieXRlLCBpMTY+ICAgICAgICAgICAgICBieXRlX2kxNl9tYXA7Ci0gIDM4OiBtYXA8Ynl0ZSwgaTMyPiAgICAgICAgICAgICAgYnl0ZV9pMzJfbWFwOwotICAzOTogbWFwPGJ5dGUsIGk2ND4gICAgICAgICAgICAgIGJ5dGVfaTY0X21hcDsKLSAgNDA6IG1hcDxieXRlLCBkb3VibGU+ICAgICAgICAgICBieXRlX2RvdWJsZV9tYXA7Ci0gIDQxOiBtYXA8Ynl0ZSwgc3RyaW5nPiAgICAgICAgICAgYnl0ZV9zdHJpbmdfbWFwOwotICA0MjogbWFwPGJ5dGUsIGJpbmFyeT4gICAgICAgICAgIGJ5dGVfYmluYXJ5X21hcDsKLSAgNDM6IG1hcDxieXRlLCBib29sPiAgICAgICAgICAgICBieXRlX2Jvb2xlYW5fbWFwOworICAzNzogbWFwPGk4LCBpMTY+ICAgICAgICAgICAgICBieXRlX2kxNl9tYXA7CisgIDM4OiBtYXA8aTgsIGkzMj4gICAgICAgICAgICAgIGJ5dGVfaTMyX21hcDsKKyAgMzk6IG1hcDxpOCwgaTY0PiAgICAgICAgICAgICAgYnl0ZV9pNjRfbWFwOworICA0MDogbWFwPGk4LCBkb3VibGU+ICAgICAgICAgICBieXRlX2RvdWJsZV9tYXA7CisgIDQxOiBtYXA8aTgsIHN0cmluZz4gICAgICAgICAgIGJ5dGVfc3RyaW5nX21hcDsKKyAgNDI6IG1hcDxpOCwgYmluYXJ5PiAgICAgICAgICAgYnl0ZV9iaW5hcnlfbWFwOworICA0MzogbWFwPGk4LCBib29sPiAgICAgICAgICAgICBieXRlX2Jvb2xlYW5fbWFwOwogICAvLyBjb2xsZWN0aW9ucyBhcyBrZXlzCi0gIDQ0OiBtYXA8bGlzdDxieXRlPiwgYnl0ZT4gICAgICAgbGlzdF9ieXRlX21hcDsKLSAgNDU6IG1hcDxzZXQ8Ynl0ZT4sIGJ5dGU+ICAgICAgICBzZXRfYnl0ZV9tYXA7Ci0gIDQ2OiBtYXA8bWFwPGJ5dGUsYnl0ZT4sIGJ5dGU+ICAgbWFwX2J5dGVfbWFwOworICA0NDogbWFwPGxpc3Q8aTg+IChweXRob24uaW1tdXRhYmxlID0gIiIpLCBpOD4gICAgICAgbGlzdF9ieXRlX21hcDsKKyAgNDU6IG1hcDxzZXQ8aTg+IChweXRob24uaW1tdXRhYmxlID0gIiIpLCBpOD4gICAgICAgIHNldF9ieXRlX21hcDsKKyAgNDY6IG1hcDxtYXA8aTgsaTg+IChweXRob24uaW1tdXRhYmxlID0gIiIpLCBpOD4gICAgIG1hcF9ieXRlX21hcDsKICAgLy8gY29sbGVjdGlvbnMgYXMgdmFsdWVzCi0gIDQ3OiBtYXA8Ynl0ZSwgbWFwPGJ5dGUsYnl0ZT4+ICAgYnl0ZV9tYXBfbWFwOwotICA0ODogbWFwPGJ5dGUsIHNldDxieXRlPj4gICAgICAgIGJ5dGVfc2V0X21hcDsKLSAgNDk6IG1hcDxieXRlLCBsaXN0PGJ5dGU+PiAgICAgICBieXRlX2xpc3RfbWFwOworICA0NzogbWFwPGk4LCBtYXA8aTgsaTg+PiAgICAgYnl0ZV9tYXBfbWFwOworICA0ODogbWFwPGk4LCBzZXQ8aTg+PiAgICAgICAgYnl0ZV9zZXRfbWFwOworICA0OTogbWFwPGk4LCBsaXN0PGk4Pj4gICAgICAgYnl0ZV9saXN0X21hcDsKIH0KIAorLy8gVG8gYmUgdXNlZCB0byB0ZXN0IHRoZSBzZXJpYWxpemF0aW9uIG9mIGFuIGVtcHR5IG1hcAorc3RydWN0IFNpbmdsZU1hcFRlc3RTdHJ1Y3QgeworICAxOiByZXF1aXJlZCBtYXA8aTMyLCBpMzI+ICAgICAgIGkzMl9tYXA7Cit9CiAKIGNvbnN0IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QgQ09NUEFDVF9URVNUID0gewogICAnYV9ieXRlJyAgICAgICAgICAgICA6IDEyNywKQEAgLTIzOSw2ICsyNDgsOCBAQAogICB2b2lkIG1ldGhvZFdpdGhEZWZhdWx0QXJncygxOiBpMzIgc29tZXRoaW5nID0gTVlDT05TVCk7CiAKICAgb25ld2F5IHZvaWQgb25ld2F5TWV0aG9kKCk7CisKKyAgYm9vbCBkZWNsYXJlZEV4Y2VwdGlvbk1ldGhvZCgxOiBib29sIHNob3VsZFRocm93KSB0aHJvd3MgKDE6IEV4Y2VwdGlvbldpdGhBTWFwIHh3YW1hcCk7CiB9CiAKIHNlcnZpY2UgSW5oZXJpdGVkIGV4dGVuZHMgU3J2IHsKQEAgLTI1MCwxMCArMjYxLDEwIEBACiAvLyBUaGUgb25seSBwdXJwb3NlIG9mIHRoaXMgdGhpbmcgaXMgdG8gaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlCiAvLyBzbyB0aGF0IFpsaWJUZXN0IGhhcyBtb3JlIGhpZ2hseSBjb21wcmVzc2libGUgZGF0YSB0byBwbGF5IHdpdGguCiBzdHJ1Y3QgQmxvd1VwIHsKLSAgMTogbWFwPGxpc3Q8aTMyPixzZXQ8bWFwPGkzMixzdHJpbmc+Pj4gYjE7Ci0gIDI6IG1hcDxsaXN0PGkzMj4sc2V0PG1hcDxpMzIsc3RyaW5nPj4+IGIyOwotICAzOiBtYXA8bGlzdDxpMzI+LHNldDxtYXA8aTMyLHN0cmluZz4+PiBiMzsKLSAgNDogbWFwPGxpc3Q8aTMyPixzZXQ8bWFwPGkzMixzdHJpbmc+Pj4gYjQ7CisgIDE6IG1hcDxsaXN0PGkzMj4ocHl0aG9uLmltbXV0YWJsZSA9ICIiKSxzZXQ8bWFwPGkzMixzdHJpbmc+IChweXRob24uaW1tdXRhYmxlID0gIiIpPj4gYjE7CisgIDI6IG1hcDxsaXN0PGkzMj4ocHl0aG9uLmltbXV0YWJsZSA9ICIiKSxzZXQ8bWFwPGkzMixzdHJpbmc+IChweXRob24uaW1tdXRhYmxlID0gIiIpPj4gYjI7CisgIDM6IG1hcDxsaXN0PGkzMj4ocHl0aG9uLmltbXV0YWJsZSA9ICIiKSxzZXQ8bWFwPGkzMixzdHJpbmc+IChweXRob24uaW1tdXRhYmxlID0gIiIpPj4gYjM7CisgIDQ6IG1hcDxsaXN0PGkzMj4ocHl0aG9uLmltbXV0YWJsZSA9ICIiKSxzZXQ8bWFwPGkzMixzdHJpbmc+IChweXRob24uaW1tdXRhYmxlID0gIiIpPj4gYjQ7CiB9CiAKIApAQCAtMzQ3LDMgKzM1OCwyMSBAQAogICAzOiBpMzIgZmllbGQzOwogfQogCitzdHJ1Y3QgVHVwbGVQcm90b2NvbFRlc3RTdHJ1Y3QgeworICBvcHRpb25hbCBpMzIgZmllbGQxOworICBvcHRpb25hbCBpMzIgZmllbGQyOworICBvcHRpb25hbCBpMzIgZmllbGQzOworICBvcHRpb25hbCBpMzIgZmllbGQ0OworICBvcHRpb25hbCBpMzIgZmllbGQ1OworICBvcHRpb25hbCBpMzIgZmllbGQ2OworICBvcHRpb25hbCBpMzIgZmllbGQ3OworICBvcHRpb25hbCBpMzIgZmllbGQ4OworICBvcHRpb25hbCBpMzIgZmllbGQ5OworICBvcHRpb25hbCBpMzIgZmllbGQxMDsKKyAgb3B0aW9uYWwgaTMyIGZpZWxkMTE7CisgIG9wdGlvbmFsIGkzMiBmaWVsZDEyOworfQorCitzdHJ1Y3QgTGlzdERvdWJsZVBlcmYgeworICAxOiBsaXN0PGRvdWJsZT4gZmllbGQ7Cit9CmRpZmYgLS1naXQgYS90ZXN0L0RlbnNlTGlua2luZ1Rlc3QudGhyaWZ0IGIvdGVzdC9EZW5zZUxpbmtpbmdUZXN0LnRocmlmdAppbmRleCBjZjYxNDk2Li4zYTViOTU3IDEwMDY0NAotLS0gYS90ZXN0L0RlbnNlTGlua2luZ1Rlc3QudGhyaWZ0CisrKyBiL3Rlc3QvRGVuc2VMaW5raW5nVGVzdC50aHJpZnQKQEAgLTM0LDYgKzM0LDcgQEAKICovCiAKIG5hbWVzcGFjZSBjcHAgdGhyaWZ0LnRlc3QKK25hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0CiAKIHN0cnVjdCBPbmVPZkVhY2haWiB7CiAgIDE6IGJvb2wgaW1fdHJ1ZSwKQEAgLTkwLDMgKzkxLDggQEAKIHNlcnZpY2UgU3J2IHsKICAgaTMyIEphbmt5KDE6IGkzMiBhcmcpCiB9CisKK3NlcnZpY2UgVW5kZXJzY29yZVNydiB7CisgIGk2NCBzb21lX3JwY19jYWxsKDE6IHN0cmluZyBtZXNzYWdlKQorfQorCmRpZmYgLS1naXQgYS90ZXN0L0RvY1Rlc3QudGhyaWZ0IGIvdGVzdC9Eb2NUZXN0LnRocmlmdAppbmRleCBjYjM1NWFlLi5kNzAyYjJjIDEwMDY0NAotLS0gYS90ZXN0L0RvY1Rlc3QudGhyaWZ0CisrKyBiL3Rlc3QvRG9jVGVzdC50aHJpZnQKQEAgLTU4LDcgKzU4LDcgQEAKICAgMTogIHN0cmluZyBzdHJpbmdfdGhpbmcKIAogICAvKiogZG9jdCB0ZXh0IGdvZXMgYmVmb3JlIGEgY29tbWEgKi8KLSAgNDogIGJ5dGUgICBieXRlX3RoaW5nLAorICA0OiAgaTggICAgIGJ5dGVfdGhpbmcsCiAKICAgOTogIGkzMiAgICBpMzJfdGhpbmcsCiAgIDExOiBpNjQgICAgaTY0X3RoaW5nCkBAIC03NCw3ICs3NCw3IEBACiAKIHN0cnVjdCBYdHJ1Y3QyCiB7Ci0gIDE6IGJ5dGUgICBieXRlX3RoaW5nLAorICAxOiBpOCAgICAgYnl0ZV90aGluZywKICAgMjogWHRydWN0IHN0cnVjdF90aGluZywKICAgMzogaTMyICAgIGkzMl90aGluZwogfQpAQCAtMTE3LDcgKzExNyw3IEBACiAgIC8qKiBBbmQgdGhpcyBpcyBob3cgeW91IHdvdWxkIGRvY3VtZW50IGZ1bmN0aW9ucyBpbiBhIHNlcnZpY2UgKi8KICAgdm9pZCAgICAgICAgIHRlc3RWb2lkKCksCiAgIHN0cmluZyAgICAgICB0ZXN0U3RyaW5nKDE6IHN0cmluZyB0aGluZyksCi0gIGJ5dGUgICAgICAgICB0ZXN0Qnl0ZSgxOiBieXRlIHRoaW5nKSwKKyAgaTggICAgICAgICAgIHRlc3RCeXRlKDE6IGJ5dGUgdGhpbmcpLAogICBpMzIgICAgICAgICAgdGVzdEkzMigxOiBpMzIgdGhpbmcpLAogCiAgIC8qKiBMaWtlIHRoaXMgb25lICovCkBAIC0xNTUsNyArMTU1LDcgQEAKIHR5cGVkZWYgaTMyIFRyaXZpYWxNdWx0aUxpbmUKIAogLyoqCi0gKiBUaGlzIGlzIHRoZSBjYW5ub25pY2FsIGV4YW1wbGUKKyAqIFRoaXMgaXMgdGhlIGNhbm9uaWNhbCBleGFtcGxlCiAgKiBvZiBhIG11bHRpbGluZSBkb2NzdHJpbmcuCiAgKi8KIHR5cGVkZWYgaTMyIFN0YW5kYXJkTXVsdGlMaW5lCkBAIC0yNDQsNCArMjQ0LDQ0IEBACiAqLwogdHlwZWRlZiBpMzIgVG90YWxseURlZ2VuZXJhdGUKIAorLyoqbm8gcm9vbSBmb3IgbmV3bGluZSBoZXJlKi8KKworLyogKiAvICovCit0eXBlZGVmIGkzMiBUZXN0Rm9yMzUwMWEKKworLyoqCisgKiAvCisgKi8KK3R5cGVkZWYgaTMyIFRlc3RGb3IzNTAxYgorCisKKy8qIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqLworc3RydWN0IFRlc3RGb3IzNzA5XzAwIHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKy8qIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqKi8KK3N0cnVjdCBUZXN0Rm9yMzcwOV8wMSB7IC8qID8gKi8gMTogaTMyIGZvbyB9CisvKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKioqLworc3RydWN0IFRlc3RGb3IzNzA5XzAyIHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKy8qKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKi8KK3N0cnVjdCBUZXN0Rm9yMzcwOV8wMyB7IC8qID8gKi8gMTogaTMyIGZvbyB9CisvKiogQ29tbWVudC1lbmQgdG9rZW5zIGNhbiBvZiBjb3Vyc2UgaGF2ZSBtb3JlIHRoYW4gb25lIGFzdGVyaXNrICoqLworc3RydWN0IFRlc3RGb3IzNzA5XzA0IHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKy8qKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKioqLworc3RydWN0IFRlc3RGb3IzNzA5XzA1IHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKy8qKiogQ29tbWVudC1lbmQgdG9rZW5zIGNhbiBvZiBjb3Vyc2UgaGF2ZSBtb3JlIHRoYW4gb25lIGFzdGVyaXNrICovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDYgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyoqKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKiovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDcgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyoqKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKioqLworc3RydWN0IFRlc3RGb3IzNzA5XzA4IHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKworc3RydWN0IFRlc3RGb3IzNzA5IHsKKyAgLyoqIFRoaXMgaXMgYSBjb21tZW50ICovCisgIDE6IHJlcXVpcmVkIHN0cmluZyBpZCwKKyAgLyoqIFRoaXMgaXMgYWxzbyBhIGNvbW1lbnQgKiovCisgIDI6IHJlcXVpcmVkIHN0cmluZyB0eXBlSWQsCisgIC8qKiBZZXQgYW5vdGhlciBjb21tZW50ISAqLworICAzOiByZXF1aXJlZCBpMzIgZW5kVGltZXN0YW1wCit9CisKKwogLyogVEhFIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBiL3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkyMTJhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQKQEAgLTAsMCArMSwxNyBAQAorbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKK25hbWVzcGFjZSBjcHAgdGhyaWZ0LnRlc3QKKworLy8gbW9yZSB0ZXN0cyBvbiBkb3VibGUgY29uc3RhbnRzIChwcmVjaXNpb24gYW5kIHR5cGUgY2hlY2tzKQorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCA9IDEKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QgPSAtMTAwCitjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3Citjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDcKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUID0gMy4xNDE1OTI2NTM1OQorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUID0gMTAwMDAwMC4xCitjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QgPSAtMTAwMDAwMC4xCitjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUID0gMS43ZSszMDgKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCA9IDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QgPSAtMS43ZSszMDgKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QgPSAtOTIyMzM3MjAzNjg1NDc3NTgxNi40MworCitjb25zdCBsaXN0PGRvdWJsZT4gRE9VQkxFX0xJU1RfVEVTVCA9IFsxLC0xMDAsMTAwLDkyMjMzNzIwMzY4NTQ3NzU4MDcsLTkyMjMzNzIwMzY4NTQ3NzU4MDcsMy4xNDE1OTI2NTM1OSwxMDAwMDAwLjEsLTEwMDAwMDAuMSwxLjdlKzMwOCwtMS43ZSszMDgsOTIyMzM3MjAzNjg1NDc3NTgxNi40MywtOTIyMzM3MjAzNjg1NDc3NTgxNi40M10KZGlmZiAtLWdpdCBhL3Rlc3QvRW51bUNvbnRhaW5lcnNUZXN0LnRocmlmdCBiL3Rlc3QvRW51bUNvbnRhaW5lcnNUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjY0MDhmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9FbnVtQ29udGFpbmVyc1Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QuZW51bWNvbnRhaW5lcnMKKworZW51bSBHcmVla0dvZEdvZGRlc3MgeworICAgIEFSRVMsCisgICAgQVBIUk9ESVRFLAorICAgIFpFVVMsCisgICAgUE9TRUlET04sCisgICAgSEVSQSwKK30KKwordHlwZWRlZiBHcmVla0dvZEdvZGRlc3MgR3JlZWtHb2RHb2RkZXNzVHlwZQordHlwZWRlZiBpMzIgUG93ZXIKKworc3RydWN0IEdvZEJlYW4geworICAgIDE6IG9wdGlvbmFsIG1hcDxHcmVla0dvZEdvZGRlc3NUeXBlLCBQb3dlcj4gcG93ZXIsCisgICAgMjogb3B0aW9uYWwgc2V0PEdyZWVrR29kR29kZGVzc1R5cGU+IGdvZGRlc3MsCisgICAgMzogb3B0aW9uYWwgbWFwPHN0cmluZywgR3JlZWtHb2RHb2RkZXNzPiBieUFsaWFzLAorICAgIDQ6IG9wdGlvbmFsIHNldDxzdHJpbmc+IGltYWdlcywKK30KKworY29uc3QgbWFwPEdyZWVrR29kR29kZGVzc1R5cGUsIHN0cmluZz4gQVRUUklCVVRFUyA9Cit7CisgICAgR3JlZWtHb2RHb2RkZXNzLlpFVVM6ICJsaWdodG5pbmcgYm9sdCIsCisgICAgR3JlZWtHb2RHb2RkZXNzLlBPU0VJRE9OOiAidHJpZGVudCIsCit9CisKK2NvbnN0IHNldDxHcmVla0dvZEdvZGRlc3NUeXBlPiBCRUFVVFkgPSBbIEdyZWVrR29kR29kZGVzcy5BUEhST0RJVEUsIEdyZWVrR29kR29kZGVzcy5IRVJBIF0KZGlmZiAtLWdpdCBhL3Rlc3QvRW51bVRlc3QudGhyaWZ0IGIvdGVzdC9FbnVtVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk2MWYzOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvRW51bVRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCituYW1lc3BhY2UgY19nbGliIFRUZXN0CisKK2VudW0gTXlFbnVtMSB7CisgIE1FMV8wID0gMCwKKyAgTUUxXzEgPSAxLAorICBNRTFfMiwKKyAgTUUxXzMsCisgIE1FMV81ID0gNSwKKyAgTUUxXzYsCit9CisKK2VudW0gTXlFbnVtMiB7CisgIE1FMl8wLAorICBNRTJfMSwKKyAgTUUyXzIsCit9CisKK2VudW0gTXlFbnVtMl9hZ2FpbiB7CisgIC8vIGVudW0gdmFsdWUgaWRlbnRpZmllcnMgbWF5IGFwcGVhciBhZ2FpbiBpbiBhbm90aGVyIGVudW0gdHlwZQorICBNRTBfMSwKKyAgTUUxXzEsCisgIE1FMl8xLAorICBNRTNfMSwKK30KKworZW51bSBNeUVudW0zIHsKKyAgTUUzXzAsCisgIE1FM18xLAorICBNRTNfTjIgPSAtMiwKKyAgTUUzX04xLAorICBNRTNfRDAsCisgIE1FM19EMSwKKyAgTUUzXzkgPSA5LAorICBNRTNfMTAsCit9CisKK2VudW0gTXlFbnVtNCB7CisgIE1FNF9BID0gMHg3ZmZmZmZmZAorICBNRTRfQgorICBNRTRfQworICAvLyBhdHRlbXB0aW5nIHRvIGRlZmluZSBhbm90aGVyIGVudW0gdmFsdWUgaGVyZSBmYWlscworICAvLyB3aXRoIGFuIG92ZXJmbG93IGVycm9yLCBhcyB3ZSBvdmVyZmxvdyB2YWx1ZXMgdGhhdCBjYW4gYmUKKyAgLy8gcmVwcmVzZW50ZWQgd2l0aCBhbiBpMzIuCit9CisKK2VudW0gTXlFbnVtNSB7CisgIGUxICAgICAgICAvLyBmYWlscyB3aXRoIDAuOS4zIGFuZCBlYXJsaWVyCisgIGUyID0gNDIgICAvLyBmYWlscyB3aXRoIDAuOS4zIGFuZCBlYXJsaWVyCit9CisKK2VudW0gTXlFbnVtV2l0aEN1c3RvbU9zdHJlYW0geworICBjdXN0b20xID0gMSwKKyAgQ3VzdG9NMgorfSAoY3BwLmN1c3RvbW9zdHJlYW0pCisKK3N0cnVjdCBNeVN0cnVjdCB7CisgIDE6IE15RW51bTIgbWUyXzIgPSBNeUVudW0xLk1FMl8yCisgIDI6IE15RW51bTMgbWUzX24yID0gTXlFbnVtMy5NRTNfTjIKKyAgMzogTXlFbnVtMyBtZTNfZDEgPSBNeUVudW0zLk1FM19EMQorfQorCitzdHJ1Y3QgRW51bVRlc3RTdHJ1Y3QgeworICAxOiBNeUVudW0zIGFfZW51bTsKKyAgMjogbGlzdDxNeUVudW0zPiBlbnVtX2xpc3Q7CisgIDM6IHNldDxNeUVudW0zPiBlbnVtX3NldDsKKyAgNDogbWFwPE15RW51bTMsIE15RW51bTM+IGVudW1fZW51bV9tYXA7CisgIC8vIGNvbGxlY3Rpb25zIGFzIGtleXMKKyAgNDQ6IG1hcDxsaXN0PE15RW51bTM+IChweXRob24uaW1tdXRhYmxlID0gIiIpLCBNeUVudW0zPiBsaXN0X2VudW1fbWFwOworICA0NTogbWFwPHNldDxNeUVudW0zPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKSwgTXlFbnVtMz4gc2V0X2VudW1fbWFwOworICA0NjogbWFwPG1hcDxNeUVudW0zLE15RW51bTM+IChweXRob24uaW1tdXRhYmxlID0gIiIpLCBNeUVudW0zPiBtYXBfZW51bV9tYXA7CisgIC8vIGNvbGxlY3Rpb25zIGFzIHZhbHVlcworICA0NzogbWFwPE15RW51bTMsIG1hcDxNeUVudW0zLCBNeUVudW0zPj4gZW51bV9tYXBfbWFwOworICA0ODogbWFwPE15RW51bTMsIHNldDxNeUVudW0zPj4gZW51bV9zZXRfbWFwOworICA0OTogbWFwPE15RW51bTMsIGxpc3Q8TXlFbnVtMz4+IGVudW1fbGlzdF9tYXA7Cit9CisKK2NvbnN0IEVudW1UZXN0U3RydWN0IEVOVU1fVEVTVCA9IHsKKyAgJ2FfZW51bSc6IE15RW51bTMuTUUzX0QxLAorICAnZW51bV9saXN0JzogW015RW51bTMuTUUzX0QxLCBNeUVudW0zLk1FM18wLCBNeUVudW0zLk1FM19OMl0sCisgICdlbnVtX3NldCc6IFtNeUVudW0zLk1FM19EMSwgTXlFbnVtMy5NRTNfTjFdLAorICAnZW51bV9lbnVtX21hcCc6IHtNeUVudW0zLk1FM19EMTogTXlFbnVtMy5NRTNfMCwgTXlFbnVtMy5NRTNfMDogTXlFbnVtMy5NRTNfRDF9LAorICAnbGlzdF9lbnVtX21hcCc6IHtbTXlFbnVtMy5NRTNfRDEsIE15RW51bTMuTUUzXzBdOiBNeUVudW0zLk1FM18wLCBbTXlFbnVtMy5NRTNfRDFdOiBNeUVudW0zLk1FM18wLCBbTXlFbnVtMy5NRTNfMF06IE15RW51bTMuTUUzX0QxfSwKKyAgJ3NldF9lbnVtX21hcCc6IHtbTXlFbnVtMy5NRTNfRDEsIE15RW51bTMuTUUzXzBdOiBNeUVudW0zLk1FM18wLCBbTXlFbnVtMy5NRTNfRDFdOiBNeUVudW0zLk1FM18wfSwKKyAgJ21hcF9lbnVtX21hcCc6IHt7TXlFbnVtMy5NRTNfTjE6IE15RW51bTMuTUUzXzEwfTogTXlFbnVtMy5NRTNfMX0sCisgICdlbnVtX21hcF9tYXAnOiB7TXlFbnVtMy5NRTNfTjE6IHtNeUVudW0zLk1FM19EMTogTXlFbnVtMy5NRTNfRDF9fSwKKyAgJ2VudW1fc2V0X21hcCc6IHtNeUVudW0zLk1FM19OMjogW015RW51bTMuTUUzX0QxLCBNeUVudW0zLk1FM19OMV0sIE15RW51bTMuTUUzXzEwOiBbTXlFbnVtMy5NRTNfRDEsIE15RW51bTMuTUUzX04xXX0sCisgICdlbnVtX2xpc3RfbWFwJzoge015RW51bTMuTUUzX0QxOiBbTXlFbnVtMy5NRTNfMTBdLCBNeUVudW0zLk1FM18wOiBbTXlFbnVtMy5NRTNfOSwgTXlFbnVtMy5NRTNfMTBdfSwKK30KKworc2VydmljZSBFbnVtVGVzdFNlcnZpY2UgeworICBNeUVudW0zIHRlc3RFbnVtKDE6IE15RW51bTMgZW51bTEpLAorICBsaXN0PE15RW51bTM+IHRlc3RFbnVtTGlzdCgxOiBsaXN0PE15RW51bTM+IGVudW0xKSwKKyAgc2V0PE15RW51bTM+IHRlc3RFbnVtU2V0KDE6IHNldDxNeUVudW0zPiBlbnVtMSksCisgIG1hcDxNeUVudW0zLCBNeUVudW0zPiB0ZXN0RW51bU1hcCgxOiBtYXA8TXlFbnVtMywgTXlFbnVtMz4gZW51bTEpLAorICBFbnVtVGVzdFN0cnVjdCB0ZXN0RW51bVN0cnVjdCgxOiBFbnVtVGVzdFN0cnVjdCBlbnVtMSksCit9CmRpZmYgLS1naXQgYS90ZXN0L0Zhc3RiaW5hcnlUZXN0LnB5IGIvdGVzdC9GYXN0YmluYXJ5VGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2Y2ZWZhZS4uMDAwMDAwMAotLS0gYS90ZXN0L0Zhc3RiaW5hcnlUZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotciIiIgotdGhyaWZ0IC0tZ2VuIHB5IERlYnVnUHJvdG9UZXN0LnRocmlmdAotLi9GYXN0YmluYXJ5VGVzdC5weQotIiIiCi0KLSMgVE9ETyhkcmVpc3MpOiBUZXN0IGVycm9yIGNhc2VzLiAgQ2hlY2sgZm9yIG1lbW9yeSBsZWFrcy4KLQotaW1wb3J0IHN5cwotc3lzLnBhdGguYXBwZW5kKCcuL2dlbi1weScpCi0KLWltcG9ydCBtYXRoCi1mcm9tIERlYnVnUHJvdG9UZXN0IGltcG9ydCBTcnYKLWZyb20gRGVidWdQcm90b1Rlc3QudHR5cGVzIGltcG9ydCAqCi1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKLWZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKLQotaW1wb3J0IHRpbWVpdAotZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCi1mcm9tIGNvcHkgaW1wb3J0IGRlZXBjb3B5Ci1mcm9tIHBwcmludCBpbXBvcnQgcHByaW50Ci0KLWNsYXNzIFREZXZOdWxsVHJhbnNwb3J0KFRUcmFuc3BvcnQuVFRyYW5zcG9ydEJhc2UpOgotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgcGFzcwotICBkZWYgaXNPcGVuKHNlbGYpOgotICAgIHJldHVybiBUcnVlCi0KLW9vZTEgPSBPbmVPZkVhY2goKQotb29lMS5pbV90cnVlICAgPSBUcnVlOwotb29lMS5pbV9mYWxzZSAgPSBGYWxzZTsKLW9vZTEuYV9iaXRlICAgID0gMHhkNjsKLW9vZTEuaW50ZWdlcjE2ID0gMjcwMDA7Ci1vb2UxLmludGVnZXIzMiA9IDE8PDI0Owotb29lMS5pbnRlZ2VyNjQgPSA2MDAwICogMTAwMCAqIDEwMDA7Ci1vb2UxLmRvdWJsZV9wcmVjaXNpb24gPSBtYXRoLnBpOwotb29lMS5zb21lX2NoYXJhY3RlcnMgID0gIkRlYnVnIFRISVMhIjsKLW9vZTEuem9tZ191bmljb2RlICAgICA9ICJceGQ3XG5cYVx0IjsKLQotb29lMiA9IE9uZU9mRWFjaCgpOwotb29lMi5pbnRlZ2VyMTYgPSAxNjsKLW9vZTIuaW50ZWdlcjMyID0gMzI7Ci1vb2UyLmludGVnZXI2NCA9IDY0Owotb29lMi5kb3VibGVfcHJlY2lzaW9uID0gKG1hdGguc3FydCg1KSsxKS8yOwotb29lMi5zb21lX2NoYXJhY3RlcnMgID0gIjpSIChtZSBnb2luZyBcInJycnJcIikiOwotb29lMi56b21nX3VuaWNvZGUgICAgID0gIlx4ZDNceDgwXHhlMlx4ODVceGFlXHhjZVx4OWRceDIwIlwKLSAgICAgICAgICAgICAgICAgICAgICAgICJceGQwXHg5ZFx4Y2VceGJmXHhlMlx4ODVceGJmXHhkMFx4YmUiXAotICAgICAgICAgICAgICAgICAgICAgICAgIlx4YzlceGExXHhkMFx4YjNceGQwXHhiMFx4Y2ZceDgxXHhlMlx4ODRceDhlIlwKLSAgICAgICAgICAgICAgICAgICAgICAgICJceDIwXHhjZVx4OTFceDc0XHg3NFx4Y2VceGIxXHhlMlx4ODVceGJkXHhjZVx4YmEiXAotICAgICAgICAgICAgICAgICAgICAgICAgIlx4YzdceDgzXHhlMlx4ODBceGJjIjsKLQotaG0gPSBIb2x5TW9sZXkoeyJiaWciOltdLCAiY29udGFpbiI6c2V0KCksICJib25rcyI6e319KQotaG0uYmlnLmFwcGVuZChvb2UxKQotaG0uYmlnLmFwcGVuZChvb2UyKQotaG0uYmlnWzBdLmFfYml0ZSA9IDB4MjI7Ci1obS5iaWdbMV0uYV9iaXRlID0gMHgyMjsKLQotaG0uY29udGFpbi5hZGQoKCJhbmQgYSBvbmUiLCAiYW5kIGEgdHdvIikpCi1obS5jb250YWluLmFkZCgoInRoZW4gYSBvbmUsIHR3byIsICJ0aHJlZSEiLCAiRk9VUiEiKSkKLWhtLmNvbnRhaW4uYWRkKCgpKQotCi1obS5ib25rc1sibm90aGluZyJdID0gW107Ci1obS5ib25rc1sic29tZXRoaW5nIl0gPSBbCi0gIEJvbmsoeyJ0eXBlIjoxLCAibWVzc2FnZSI6IldhaXQuIn0pLAotICBCb25rKHsidHlwZSI6MiwgIm1lc3NhZ2UiOiJXaGF0PyJ9KSwKLV0KLWhtLmJvbmtzWyJwb2UiXSA9IFsKLSAgQm9uayh7InR5cGUiOjMsICJtZXNzYWdlIjoicXVvdGgifSksCi0gIEJvbmsoeyJ0eXBlIjo0LCAibWVzc2FnZSI6InRoZSByYXZlbiJ9KSwKLSAgQm9uayh7InR5cGUiOjUsICJtZXNzYWdlIjoibmV2ZXJtb3JlIn0pLAotXQotCi1ycyA9IFJhbmRvbVN0dWZmKCkKLXJzLmEgPSAxCi1ycy5iID0gMgotcnMuYyA9IDMKLXJzLm15aW50bGlzdCA9IHJhbmdlKDIwKQotcnMubWFwcyA9IHsxOldyYXBwZXIoeyJmb28iOkVtcHR5KCl9KSwyOldyYXBwZXIoeyJmb28iOkVtcHR5KCl9KX0KLXJzLmJpZ2ludCA9IDEyNDUyMzQ1MjQzNUwKLXJzLnRyaXBsZSA9IDMuMTQKLQotIyBtYWtlIHN1cmUgdGhpcyBzcGxpdHMgdHdvIGJ1ZmZlcnMgaW4gYSBidWZmZXJlZCBwcm90b2NvbAotcnNodWdlID0gUmFuZG9tU3R1ZmYoKQotcnNodWdlLm15aW50bGlzdD1yYW5nZSgxMDAwMCkKLQotbXlfemVybyA9IFNydi5KYW5reV9yZXN1bHQoeyJhcmciOjV9KQotCi1kZWYgY2hlY2tXcml0ZShvKToKLSAgdHJhbnNfZmFzdCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gIHRyYW5zX3Nsb3cgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICBwcm90X2Zhc3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQodHJhbnNfZmFzdCkKLSAgcHJvdF9zbG93ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFuc19zbG93KQotCi0gIG8ud3JpdGUocHJvdF9mYXN0KQotICBvLndyaXRlKHByb3Rfc2xvdykKLSAgT1JJRyA9IHRyYW5zX3Nsb3cuZ2V0dmFsdWUoKQotICBNSU5FID0gdHJhbnNfZmFzdC5nZXR2YWx1ZSgpCi0gIGlmIE9SSUcgIT0gTUlORToKLSAgICBwcmludCAibWluZTogJXNcbm9yaWc6ICVzIiAlIChyZXByKE1JTkUpLCByZXByKE9SSUcpKQotCi1kZWYgY2hlY2tSZWFkKG8pOgotICBwcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKSkKLSAgby53cml0ZShwcm90KQotCi0gIHNsb3dfdmVyc2lvbl9iaW5hcnkgPSBwcm90LnRyYW5zLmdldHZhbHVlKCkKLQotICBwcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKAotICAgICAgICAgICBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoc2xvd192ZXJzaW9uX2JpbmFyeSkpCi0gIGMgPSBvLl9fY2xhc3NfXygpCi0gIGMucmVhZChwcm90KQotICBpZiBjICE9IG86Ci0gICAgcHJpbnQgImNvcHk6ICIKLSAgICBwcHJpbnQoZXZhbChyZXByKGMpKSkKLSAgICBwcmludCAib3JpZzogIgotICAgIHBwcmludChldmFsKHJlcHIobykpKQotCi0gIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQoCi0gICAgICAgICAgIFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KAotICAgICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzbG93X3ZlcnNpb25fYmluYXJ5KSkpCi0gIGMgPSBvLl9fY2xhc3NfXygpCi0gIGMucmVhZChwcm90KQotICBpZiBjICE9IG86Ci0gICAgcHJpbnQgImNvcHk6ICIKLSAgICBwcHJpbnQoZXZhbChyZXByKGMpKSkKLSAgICBwcmludCAib3JpZzogIgotICAgIHBwcmludChldmFsKHJlcHIobykpKQotCi0KLWRlZiBkb1Rlc3QoKToKLSAgY2hlY2tXcml0ZShobSkKLSAgbm9fc2V0ID0gZGVlcGNvcHkoaG0pCi0gIG5vX3NldC5jb250YWluID0gc2V0KCkKLSAgY2hlY2tSZWFkKG5vX3NldCkKLSAgY2hlY2tXcml0ZShycykKLSAgY2hlY2tSZWFkKHJzKQotICBjaGVja1dyaXRlKHJzaHVnZSkKLSAgY2hlY2tSZWFkKHJzaHVnZSkKLSAgY2hlY2tXcml0ZShteV96ZXJvKQotICBjaGVja1JlYWQobXlfemVybykKLSAgY2hlY2tSZWFkKEJhY2t3YXJkcyh7ImZpcnN0X3RhZzIiOjQsICJzZWNvbmRfdGFnMSI6Mn0pKQotCi0gICMgT25lIGNhc2Ugd2hlcmUgdGhlIHNlcmlhbGl6ZWQgZm9ybSBjaGFuZ2VzLCBidXQgb25seSBzdXBlcmZpY2lhbGx5LgotICBvID0gQmFja3dhcmRzKHsiZmlyc3RfdGFnMiI6NCwgInNlY29uZF90YWcxIjoyfSkKLSAgdHJhbnNfZmFzdCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gIHRyYW5zX3Nsb3cgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICBwcm90X2Zhc3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQodHJhbnNfZmFzdCkKLSAgcHJvdF9zbG93ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFuc19zbG93KQotCi0gIG8ud3JpdGUocHJvdF9mYXN0KQotICBvLndyaXRlKHByb3Rfc2xvdykKLSAgT1JJRyA9IHRyYW5zX3Nsb3cuZ2V0dmFsdWUoKQotICBNSU5FID0gdHJhbnNfZmFzdC5nZXR2YWx1ZSgpCi0gIGlmIE9SSUcgPT0gTUlORToKLSAgICBwcmludCAiVGhhdCBzaG91bGRuJ3QgaGFwcGVuLiIKLQotCi0gIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQoVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkpCi0gIG8ud3JpdGUocHJvdCkKLSAgcHJvdCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2woCi0gICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigKLSAgICAgICAgICAgICBwcm90LnRyYW5zLmdldHZhbHVlKCkpKQotICBjID0gby5fX2NsYXNzX18oKQotICBjLnJlYWQocHJvdCkKLSAgaWYgYyAhPSBvOgotICAgIHByaW50ICJjb3B5OiAiCi0gICAgcHByaW50KGV2YWwocmVwcihjKSkpCi0gICAgcHJpbnQgIm9yaWc6ICIKLSAgICBwcHJpbnQoZXZhbChyZXByKG8pKSkKLQotCi0KLWRlZiBkb0JlbmNobWFyaygpOgotCi0gIGl0ZXJzID0gMjUwMDAKLQotICBzZXR1cCA9ICIiIgotZnJvbSBfX21haW5fXyBpbXBvcnQgaG0sIHJzLCBURGV2TnVsbFRyYW5zcG9ydAotZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAotdHJhbnMgPSBURGV2TnVsbFRyYW5zcG9ydCgpCi1wcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCVzKHRyYW5zKQotIiIiCi0KLSAgc2V0dXBfZmFzdCA9IHNldHVwICUgIkFjY2VsZXJhdGVkIgotICBzZXR1cF9zbG93ID0gc2V0dXAgJSAiIgotCi0gIHByaW50ICJTdGFydGluZyBCZW5jaG1hcmtzIgotCi0gIHByaW50ICJIb2x5TW9sZXkgU3RhbmRhcmQgPSAlZiIgJSBcCi0gICAgICB0aW1laXQuVGltZXIoJ2htLndyaXRlKHByb3QpJywgc2V0dXBfc2xvdykudGltZWl0KG51bWJlcj1pdGVycykKLSAgcHJpbnQgIkhvbHlNb2xleSBBY2NlbGVyLiA9ICVmIiAlIFwKLSAgICAgIHRpbWVpdC5UaW1lcignaG0ud3JpdGUocHJvdCknLCBzZXR1cF9mYXN0KS50aW1laXQobnVtYmVyPWl0ZXJzKQotCi0gIHByaW50ICJGYXN0U3RydWN0IFN0YW5kYXJkID0gJWYiICUgXAotICAgICAgdGltZWl0LlRpbWVyKCdycy53cml0ZShwcm90KScsIHNldHVwX3Nsb3cpLnRpbWVpdChudW1iZXI9aXRlcnMpCi0gIHByaW50ICJGYXN0U3RydWN0IEFjY2VsZXIuID0gJWYiICUgXAotICAgICAgdGltZWl0LlRpbWVyKCdycy53cml0ZShwcm90KScsIHNldHVwX2Zhc3QpLnRpbWVpdChudW1iZXI9aXRlcnMpCi0KLQotCi1kb1Rlc3QoKQotZG9CZW5jaG1hcmsoKQotCmRpZmYgLS1naXQgYS90ZXN0L0Z1bGxDYW1lbFRlc3QudGhyaWZ0IGIvdGVzdC9GdWxsQ2FtZWxUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWU0ZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9GdWxsQ2FtZWxUZXN0LnRocmlmdApAQCAtMCwwICsxLDM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0LmZ1bGxjYW1lbAorCitzdHJ1Y3QgT25lT2ZFYWNoWlogeworICAxOiBib29sIGltX3RydWUsCisgIDI6IGJvb2wgaW1fZmFsc2UsCisgIDM6IGJ5dGUgYV9iaXRlLAorICA0OiBpMTYgaW50ZWdlcjE2LAorICA1OiBpMzIgaW50ZWdlcjMyLAorICA2OiBpNjQgaW50ZWdlcjY0LAorICA3OiBkb3VibGUgZG91YmxlX3ByZWNpc2lvbiwKKyAgODogc3RyaW5nIHNvbWVfY2hhcmFjdGVycywKKyAgOTogc3RyaW5nIHpvbWdfdW5pY29kZSwKKyAgMTA6IGJvb2wgd2hhdF93aG8sCit9CisKK3NlcnZpY2UgVW5kZXJzY29yZVNydiB7CisgIGk2NCBzb21lX3JwY19jYWxsKDE6IHN0cmluZyBtZXNzYWdlKQorfQorCmRpZmYgLS1naXQgYS90ZXN0L0luY2x1ZGUudGhyaWZ0IGIvdGVzdC9JbmNsdWRlLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjIzMTliCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9JbmNsdWRlLnRocmlmdApAQCAtMCwwICsxLDI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2luY2x1ZGUgIlRocmlmdFRlc3QudGhyaWZ0IgorCitzdHJ1Y3QgSW5jbHVkZVRlc3QgeworICAxOiByZXF1aXJlZCBUaHJpZnRUZXN0LkJvb2xzIGJvb2xzCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9KYXZhRGVlcENvcHlUZXN0LnRocmlmdCBiL3Rlc3QvSmF2YURlZXBDb3B5VGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM5NzRhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvSmF2YURlZXBDb3B5VGVzdC50aHJpZnQKQEAgLTAsMCArMSwxOSBAQAoraW5jbHVkZSAiSmF2YVR5cGVzLnRocmlmdCIKKworbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKKworc3RydWN0IERlZXBDb3B5Rm9vIHsKKyAgMTogb3B0aW9uYWwgbGlzdDxEZWVwQ29weUJhcj4gbCwKKyAgMjogb3B0aW9uYWwgc2V0PERlZXBDb3B5QmFyPiBzLAorICAzOiBvcHRpb25hbCBtYXA8c3RyaW5nLCBEZWVwQ29weUJhcj4gbSwKKyAgNDogb3B0aW9uYWwgbGlzdDxKYXZhVHlwZXMuT2JqZWN0PiBsaSwKKyAgNTogb3B0aW9uYWwgc2V0PEphdmFUeXBlcy5PYmplY3Q+IHNpLAorICA2OiBvcHRpb25hbCBtYXA8c3RyaW5nLCBKYXZhVHlwZXMuT2JqZWN0PiBtaSwKKyAgNzogb3B0aW9uYWwgRGVlcENvcHlCYXIgYmFyLAorfQorCitzdHJ1Y3QgRGVlcENvcHlCYXIgeworICAxOiBvcHRpb25hbCBzdHJpbmcgYSwKKyAgMjogb3B0aW9uYWwgaTMyIGIsCisgIDM6IG9wdGlvbmFsIGJvb2wgYywKK30KZGlmZiAtLWdpdCBhL3Rlc3QvSmF2YVR5cGVzLnRocmlmdCBiL3Rlc3QvSmF2YVR5cGVzLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzczM2FkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9KYXZhVHlwZXMudGhyaWZ0CkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0CisKK3N0cnVjdCBJbnRlZ2VyIHsKKyAgMTogaTMyIHZhbAorfQorCitzdHJ1Y3QgU3RyaW5nIHsKKyAgMTogc3RyaW5nIHZhbAorfQorCitzdHJ1Y3QgQm9vbGVhbiB7CisgIDE6IGJvb2wgdmFsCit9CisKK3N0cnVjdCBEb3VibGUgeworICAxOiBkb3VibGUgdmFsCit9CisKK3N0cnVjdCBMb25nIHsKKyAgMTogaTY0IHZhbAorfQorCitzdHJ1Y3QgQnl0ZSB7CisgIDE6IGJ5dGUgdmFsCit9CisKK3N0cnVjdCBGbG9hdCB7CisgIDE6IGRvdWJsZSB2YWwKK30KKworc3RydWN0IExpc3QgeworICAxOiBsaXN0PHN0cmluZz4gdmFscworfQorCitzdHJ1Y3QgQXJyYXlMaXN0IHsKKyAgMTogbGlzdDxzdHJpbmc+IHZhbHMKK30KKworc3RydWN0IFNvcnRlZE1hcCB7CisgIDE6IG1hcDxzdHJpbmcsIHN0cmluZz4gdmFscworfQorCitzdHJ1Y3QgVHJlZU1hcCB7CisgIDE6IG1hcDxzdHJpbmcsIHN0cmluZz4gdmFscworfQorCitzdHJ1Y3QgSGFzaE1hcCB7CisgIDE6IG1hcDxzdHJpbmcsIFN0cmluZz4gdmFscworfQorCitzdHJ1Y3QgTWFwIHsKKyAgMTogbWFwPGRvdWJsZSwgRG91YmxlPiB2YWxzCit9CisKK3N0cnVjdCBPYmplY3QgeworICAxOiBJbnRlZ2VyIGludGVnZXIsCisgIDI6IFN0cmluZyBzdHIsCisgIDM6IEJvb2xlYW4gYm9vbGVhbl9maWVsZCwKKyAgNDogRG91YmxlIGRibCwKKyAgNTogQnl0ZSBiaXRlLAorICA2OiBtYXA8aTMyLCBJbnRlZ2VyPiBpbnRtYXAsCisgIDc6IE1hcCBzb21lbWFwLAorfQorCitleGNlcHRpb24gRXhjZXB0aW9uIHsKKyAgMTogc3RyaW5nIG1zZworfQorCitzZXJ2aWNlIEFzeW5jTm9uYmxvY2tpbmdTZXJ2aWNlIHsKKyAgT2JqZWN0IG15bWV0aG9kKAorICAgIDE6IEludGVnZXIgaW50ZWdlciwKKyAgICAyOiBTdHJpbmcgc3RyLAorICAgIDM6IEJvb2xlYW4gYm9vbGVhbl9maWVsZCwKKyAgICA0OiBEb3VibGUgZGJsLAorICAgIDU6IEJ5dGUgYml0ZSwKKyAgICA2OiBtYXA8aTMyLCBJbnRlZ2VyPiBpbnRtYXAsCisgICAgNzogTWFwIHNvbWVtYXAsCisgICkgdGhyb3dzICgxOkV4Y2VwdGlvbiBleCk7Cit9CisKK3N0cnVjdCBTYWZlQnl0ZXMgeworICAxOiBiaW5hcnkgYnl0ZXM7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdCBiL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjUxMjZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMTggQEAKK3N0cnVjdCBTaW1wbGUgeworICAxOiBzdHJpbmcgdmFsdWUKK30KKworc3RydWN0IENvbXBsZXggeworICAxOiBTaW1wbGUgc3RydWN0X2ZpZWxkCisgIDI6IGxpc3Q8U2ltcGxlPiBzdHJ1Y3RfbGlzdF9maWVsZAorICAzOiBzZXQ8U2ltcGxlPiBzdHJ1Y3Rfc2V0X2ZpZWxkCisgIDQ6IG1hcDxzdHJpbmcsU2ltcGxlPiBzdHJ1Y3RfbWFwX2ZpZWxkCisgIDU6IGxpc3Q8c2V0PG1hcDxzdHJpbmcsbGlzdDxTaW1wbGU+Pj4+IHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZAorICA2OiBtYXA8c3RyaW5nLCBsaXN0PG1hcDxzdHJpbmcsU2ltcGxlPj4gPiBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyCisgIDc6IGxpc3Q8bGlzdDxzdHJpbmc+PiBsaXN0X29mX2xpc3RfZmllbGQKKyAgODogbGlzdDxsaXN0PGxpc3Q8c3RyaW5nPj4+IGxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkCit9CisKK3N0cnVjdCBDb21wbGV4TGlzdCB7CisgIDE6IGxpc3Q8Q29tcGxleD4gc3RydWN0X2xpc3RfZmllbGQ7Cit9CmRpZmYgLS1naXQgYS90ZXN0L01ha2VmaWxlLmFtIGIvdGVzdC9NYWtlZmlsZS5hbQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDVjYTIwZDAuLjY4ZjE5ODYKLS0tIGEvdGVzdC9NYWtlZmlsZS5hbQorKysgYi90ZXN0L01ha2VmaWxlLmFtCkBAIC0xNyw0NiArMTcsMTU0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1TVUJESVJTID0KK1NVQkRJUlMgPSBmZWF0dXJlcworUFJFQ1JPU1NfVEFSR0VUID0KKworaWYgV0lUSF9DX0dMSUIKK1NVQkRJUlMgKz0gY19nbGliCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtY19nbGliCitlbmRpZgorCitpZiBXSVRIX0NMCitTVUJESVJTICs9IGNsCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtY2wKK2VuZGlmCisKK2lmIFdJVEhfTU9OTworU1VCRElSUyArPSBjc2hhcnAKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1jc2hhcnAKK2VuZGlmCiAKIGlmIFdJVEhfQ1BQCiBTVUJESVJTICs9IGNwcAorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWNwcAorZW5kaWYKKworaWYgV0lUSF9QRVJMCitTVUJESVJTICs9IHBlcmwKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1wZXJsCitlbmRpZgorCitpZiBXSVRIX1BIUAorU1VCRElSUyArPSBwaHAKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1waHAKK2VuZGlmCisKK2lmIFdJVEhfREFSVAorU1VCRElSUyArPSBkYXJ0CitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtZGFydAogZW5kaWYKIAogaWYgV0lUSF9QWVRIT04KIFNVQkRJUlMgKz0gcHkKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1weQorU1VCRElSUyArPSBweS50b3JuYWRvCitpZiBXSVRIX1RXSVNURURfVEVTVAogU1VCRElSUyArPSBweS50d2lzdGVkCiBlbmRpZgorZW5kaWYKIAogaWYgV0lUSF9SVUJZCiBTVUJESVJTICs9IHJiCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtcmIKIGVuZGlmCiAKIGlmIFdJVEhfSEFTS0VMTAogU1VCRElSUyArPSBocwogZW5kaWYKIAoraWYgV0lUSF9IQVhFCitTVUJESVJTICs9IGhheGUKK2VuZGlmCisKK2lmIFdJVEhfRE9UTkVUQ09SRQorU1VCRElSUyArPSBuZXRjb3JlCitlbmRpZgorCitpZiBXSVRIX0dPCitTVUJESVJTICs9IGdvCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtZ28KK2VuZGlmCisKK2lmIFdJVEhfRVJMQU5HCitTVUJESVJTICs9IGVybAorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWVybAorZW5kaWYKKworaWYgV0lUSF9MVUEKK1NVQkRJUlMgKz0gbHVhCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtbHVhCitlbmRpZgorCitpZiBXSVRIX1JTCitTVUJESVJTICs9IHJzCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtcnMKK2VuZGlmCisKKyMKKyMgZ2VuZXJhdGUgaHRtbCBmb3IgVGhyaWZ0VGVzdC50aHJpZnQKKyMKK2NoZWNrLWxvY2FsOgorCSQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGh0bWwgLXIgJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisKK2NsZWFuLWxvY2FsOgorCXJtIC1yZiAkKHRvcF9zcmNkaXIpL3Rlc3QvZ2VuLWh0bWwKKwogRVhUUkFfRElTVCA9IFwKKwlhdWRpdCBcCisJY3Jvc3NydW5uZXIgXAorCWtleXMgXAorCWNfZ2xpYiBcCisJY2wgXAogCWNwcCBcCi0JdGhyZWFkcyBcCi0JY3NoYXJwIFwKLQlweSBcCi0JcHkudHdpc3RlZCBcCi0JcmIgXAorCWRhcnQgXAorCWVybCBcCisJaHMgXAorCWx1YSBcCisJb2NhbWwgXAogCXBlcmwgXAogCXBocCBcCi0JaHMgXAotCW9jYW1sIFwKKwlweSBcCisJcHkudHdpc3RlZCBcCisJcHkudG9ybmFkbyBcCisJcmIgXAorCXJzIFwKKwl0aHJlYWRzIFwKIAlBbm5vdGF0aW9uVGVzdC50aHJpZnQgXAogCUJyb2tlbkNvbnN0YW50cy50aHJpZnQgXAogCUNvbnN0YW50c0RlbW8udGhyaWZ0IFwKIAlEZWJ1Z1Byb3RvVGVzdC50aHJpZnQgXAorCURvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IFwKIAlEZW5zZUxpbmtpbmdUZXN0LnRocmlmdCBcCiAJRG9jVGVzdC50aHJpZnQgXAorCUVudW1UZXN0LnRocmlmdCBcCisJRnVsbENhbWVsVGVzdC50aHJpZnQgXAorCUluY2x1ZGUudGhyaWZ0IFwKIAlKYXZhQmVhbnNUZXN0LnRocmlmdCBcCisJSmF2YURlZXBDb3B5VGVzdC50aHJpZnQgXAorCUphdmFUeXBlcy50aHJpZnQgXAorCUpzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQgXAorCU1hbnlPcHRpb25hbHMudGhyaWZ0IFwKIAlNYW55VHlwZWRlZnMudGhyaWZ0IFwKKwlOYW1lQ29uZmxpY3RUZXN0LnRocmlmdCBcCiAJT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0IFwKKwlSZWN1cnNpdmUudGhyaWZ0IFwKKwlSZXVzZU9iamVjdHMudGhyaWZ0IFwKKwlFbnVtQ29udGFpbmVyc1Rlc3QudGhyaWZ0IFwKIAlTbWFsbFRlc3QudGhyaWZ0IFwKIAlTdHJlc3NUZXN0LnRocmlmdCBcCiAJVGhyaWZ0VGVzdC50aHJpZnQgXAotCUZhc3RiaW5hcnlUZXN0LnB5CisJVHlwZWRlZlRlc3QudGhyaWZ0IFwKKwlVbnNhZmVUeXBlcy50aHJpZnQgXAorCWtub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24gXAorCXRlc3QucHkgXAorCXRlc3RzLmpzb24gXAorCXJlYnVpbGRfa25vd25fZmFpbHVyZXMuc2ggXAorCXJlc3VsdC5qcyBcCisJaW5kZXguaHRtbCBcCisJUkVBRE1FLm1kIFwKKwl2YWxncmluZC5zdXBwcmVzcworCitwcmVjcm9zcy0lOgorCSQoTUFLRSkgLUMgJCogcHJlY3Jvc3MKK3ByZWNyb3NzOiAkKFBSRUNST1NTX1RBUkdFVCkKZGlmZiAtLWdpdCBhL3Rlc3QvTWFueU9wdGlvbmFscy50aHJpZnQgYi90ZXN0L01hbnlPcHRpb25hbHMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYjFkNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01hbnlPcHRpb25hbHMudGhyaWZ0CkBAIC0wLDAgKzEsMjMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFRoZSBqYXZhIGNvZGVnZW5lcmF0b3IgaGFzIGEgZmV3IGRpZmZlcmVudCBjb2RlcGF0aHMgZGVwZW5kaW5nCisvLyBvbiBob3cgbWFueSBvcHRpb25hbHMgdGhlIHN0cnVjdCBoYXM7IHRoaXMgYXR0ZW1wdHMgdG8gZXhlcmNpc2UKKy8vIHRoZW0uCisKK25hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0CisKK3N0cnVjdCBPcHQ0IHsKKyAgMTogaTMyIGRlZjE7CisgIDI6IGkzMiBkZWYyOworICAzOiBpMzIgZGVmMzsKKyAgNDogaTMyIGRlZjQ7Cit9CisKK3N0cnVjdCBPcHQxMyB7CisgIDE6IGkzMiBkZWYxOworICAyOiBpMzIgZGVmMjsKKyAgMzogaTMyIGRlZjM7CisgIDQ6IGkzMiBkZWY0OworICA1OiBpMzIgZGVmNTsKKyAgNjogaTMyIGRlZjY7CisgIDc6IGkzMiBkZWY3OworICA4OiBpMzIgZGVmODsKKyAgOTogaTMyIGRlZjk7CisgIDEwOiBpMzIgZGVmMTA7CisgIDExOiBpMzIgZGVmMTE7CisgIDEyOiBpMzIgZGVmMTI7CisgIDEzOiBpMzIgZGVmMTM7Cit9CisKK3N0cnVjdCBPcHQzMCB7CisgIDE6IGkzMiBkZWYxOworICAyOiBpMzIgZGVmMjsKKyAgMzogaTMyIGRlZjM7CisgIDQ6IGkzMiBkZWY0OworICA1OiBpMzIgZGVmNTsKKyAgNjogaTMyIGRlZjY7CisgIDc6IGkzMiBkZWY3OworICA4OiBpMzIgZGVmODsKKyAgOTogaTMyIGRlZjk7CisgIDEwOiBpMzIgZGVmMTA7CisgIDExOiBpMzIgZGVmMTE7CisgIDEyOiBpMzIgZGVmMTI7CisgIDEzOiBpMzIgZGVmMTM7CisgIDE0OiBpMzIgZGVmMTQ7CisgIDE1OiBpMzIgZGVmMTU7CisgIDE2OiBpMzIgZGVmMTY7CisgIDE3OiBpMzIgZGVmMTc7CisgIDE4OiBpMzIgZGVmMTg7CisgIDE5OiBpMzIgZGVmMTk7CisgIDIwOiBpMzIgZGVmMjA7CisgIDIxOiBpMzIgZGVmMjE7CisgIDIyOiBpMzIgZGVmMjI7CisgIDIzOiBpMzIgZGVmMjM7CisgIDI0OiBpMzIgZGVmMjQ7CisgIDI1OiBpMzIgZGVmMjU7CisgIDI2OiBpMzIgZGVmMjY7CisgIDI3OiBpMzIgZGVmMjc7CisgIDI4OiBpMzIgZGVmMjg7CisgIDI5OiBpMzIgZGVmMjk7CisgIDMwOiBpMzIgZGVmMzA7Cit9CisKK3N0cnVjdCBPcHQ2NCB7CisgIDE6IGkzMiBkZWYxOworICAyOiBpMzIgZGVmMjsKKyAgMzogaTMyIGRlZjM7CisgIDQ6IGkzMiBkZWY0OworICA1OiBpMzIgZGVmNTsKKyAgNjogaTMyIGRlZjY7CisgIDc6IGkzMiBkZWY3OworICA4OiBpMzIgZGVmODsKKyAgOTogaTMyIGRlZjk7CisgIDEwOiBpMzIgZGVmMTA7CisgIDExOiBpMzIgZGVmMTE7CisgIDEyOiBpMzIgZGVmMTI7CisgIDEzOiBpMzIgZGVmMTM7CisgIDE0OiBpMzIgZGVmMTQ7CisgIDE1OiBpMzIgZGVmMTU7CisgIDE2OiBpMzIgZGVmMTY7CisgIDE3OiBpMzIgZGVmMTc7CisgIDE4OiBpMzIgZGVmMTg7CisgIDE5OiBpMzIgZGVmMTk7CisgIDIwOiBpMzIgZGVmMjA7CisgIDIxOiBpMzIgZGVmMjE7CisgIDIyOiBpMzIgZGVmMjI7CisgIDIzOiBpMzIgZGVmMjM7CisgIDI0OiBpMzIgZGVmMjQ7CisgIDI1OiBpMzIgZGVmMjU7CisgIDI2OiBpMzIgZGVmMjY7CisgIDI3OiBpMzIgZGVmMjc7CisgIDI4OiBpMzIgZGVmMjg7CisgIDI5OiBpMzIgZGVmMjk7CisgIDMwOiBpMzIgZGVmMzA7CisgIDMxOiBpMzIgZGVmMzE7CisgIDMyOiBpMzIgZGVmMzI7CisgIDMzOiBpMzIgZGVmMzM7CisgIDM0OiBpMzIgZGVmMzQ7CisgIDM1OiBpMzIgZGVmMzU7CisgIDM2OiBpMzIgZGVmMzY7CisgIDM3OiBpMzIgZGVmMzc7CisgIDM4OiBpMzIgZGVmMzg7CisgIDM5OiBpMzIgZGVmMzk7CisgIDQwOiBpMzIgZGVmNDA7CisgIDQxOiBpMzIgZGVmNDE7CisgIDQyOiBpMzIgZGVmNDI7CisgIDQzOiBpMzIgZGVmNDM7CisgIDQ0OiBpMzIgZGVmNDQ7CisgIDQ1OiBpMzIgZGVmNDU7CisgIDQ2OiBpMzIgZGVmNDY7CisgIDQ3OiBpMzIgZGVmNDc7CisgIDQ4OiBpMzIgZGVmNDg7CisgIDQ5OiBpMzIgZGVmNDk7CisgIDUwOiBpMzIgZGVmNTA7CisgIDUxOiBpMzIgZGVmNTE7CisgIDUyOiBpMzIgZGVmNTI7CisgIDUzOiBpMzIgZGVmNTM7CisgIDU0OiBpMzIgZGVmNTQ7CisgIDU1OiBpMzIgZGVmNTU7CisgIDU2OiBpMzIgZGVmNTY7CisgIDU3OiBpMzIgZGVmNTc7CisgIDU4OiBpMzIgZGVmNTg7CisgIDU5OiBpMzIgZGVmNTk7CisgIDYwOiBpMzIgZGVmNjA7CisgIDYxOiBpMzIgZGVmNjE7CisgIDYyOiBpMzIgZGVmNjI7CisgIDYzOiBpMzIgZGVmNjM7CisgIDY0OiBpMzIgZGVmNjQ7Cit9CisKK3N0cnVjdCBPcHQ4MCB7CisgIDE6IGkzMiBkZWYxOworICAyOiBpMzIgZGVmMjsKKyAgMzogaTMyIGRlZjM7CisgIDQ6IGkzMiBkZWY0OworICA1OiBpMzIgZGVmNTsKKyAgNjogaTMyIGRlZjY7CisgIDc6IGkzMiBkZWY3OworICA4OiBpMzIgZGVmODsKKyAgOTogaTMyIGRlZjk7CisgIDEwOiBpMzIgZGVmMTA7CisgIDExOiBpMzIgZGVmMTE7CisgIDEyOiBpMzIgZGVmMTI7CisgIDEzOiBpMzIgZGVmMTM7CisgIDE0OiBpMzIgZGVmMTQ7CisgIDE1OiBpMzIgZGVmMTU7CisgIDE2OiBpMzIgZGVmMTY7CisgIDE3OiBpMzIgZGVmMTc7CisgIDE4OiBpMzIgZGVmMTg7CisgIDE5OiBpMzIgZGVmMTk7CisgIDIwOiBpMzIgZGVmMjA7CisgIDIxOiBpMzIgZGVmMjE7CisgIDIyOiBpMzIgZGVmMjI7CisgIDIzOiBpMzIgZGVmMjM7CisgIDI0OiBpMzIgZGVmMjQ7CisgIDI1OiBpMzIgZGVmMjU7CisgIDI2OiBpMzIgZGVmMjY7CisgIDI3OiBpMzIgZGVmMjc7CisgIDI4OiBpMzIgZGVmMjg7CisgIDI5OiBpMzIgZGVmMjk7CisgIDMwOiBpMzIgZGVmMzA7CisgIDMxOiBpMzIgZGVmMzE7CisgIDMyOiBpMzIgZGVmMzI7CisgIDMzOiBpMzIgZGVmMzM7CisgIDM0OiBpMzIgZGVmMzQ7CisgIDM1OiBpMzIgZGVmMzU7CisgIDM2OiBpMzIgZGVmMzY7CisgIDM3OiBpMzIgZGVmMzc7CisgIDM4OiBpMzIgZGVmMzg7CisgIDM5OiBpMzIgZGVmMzk7CisgIDQwOiBpMzIgZGVmNDA7CisgIDQxOiBpMzIgZGVmNDE7CisgIDQyOiBpMzIgZGVmNDI7CisgIDQzOiBpMzIgZGVmNDM7CisgIDQ0OiBpMzIgZGVmNDQ7CisgIDQ1OiBpMzIgZGVmNDU7CisgIDQ2OiBpMzIgZGVmNDY7CisgIDQ3OiBpMzIgZGVmNDc7CisgIDQ4OiBpMzIgZGVmNDg7CisgIDQ5OiBpMzIgZGVmNDk7CisgIDUwOiBpMzIgZGVmNTA7CisgIDUxOiBpMzIgZGVmNTE7CisgIDUyOiBpMzIgZGVmNTI7CisgIDUzOiBpMzIgZGVmNTM7CisgIDU0OiBpMzIgZGVmNTQ7CisgIDU1OiBpMzIgZGVmNTU7CisgIDU2OiBpMzIgZGVmNTY7CisgIDU3OiBpMzIgZGVmNTc7CisgIDU4OiBpMzIgZGVmNTg7CisgIDU5OiBpMzIgZGVmNTk7CisgIDYwOiBpMzIgZGVmNjA7CisgIDYxOiBpMzIgZGVmNjE7CisgIDYyOiBpMzIgZGVmNjI7CisgIDYzOiBpMzIgZGVmNjM7CisgIDY0OiBpMzIgZGVmNjQ7CisgIDY1OiBpMzIgZGVmNjU7CisgIDY2OiBpMzIgZGVmNjY7CisgIDY3OiBpMzIgZGVmNjc7CisgIDY4OiBpMzIgZGVmNjg7CisgIDY5OiBpMzIgZGVmNjk7CisgIDcwOiBpMzIgZGVmNzA7CisgIDcxOiBpMzIgZGVmNzE7CisgIDcyOiBpMzIgZGVmNzI7CisgIDczOiBpMzIgZGVmNzM7CisgIDc0OiBpMzIgZGVmNzQ7CisgIDc1OiBpMzIgZGVmNzU7CisgIDc2OiBpMzIgZGVmNzY7CisgIDc3OiBpMzIgZGVmNzc7CisgIDc4OiBpMzIgZGVmNzg7CisgIDc5OiBpMzIgZGVmNzk7CisgIDgwOiBpMzIgZGVmODA7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvTmFtZUNvbmZsaWN0VGVzdC50aHJpZnQgYi90ZXN0L05hbWVDb25mbGljdFRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZWZiNDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L05hbWVDb25mbGljdFRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMTEwIEBACisvLyBOYW1pbmcgdGVzdGNhc2VzLCBzZXBjaWZpY2FsbHkgZm9yIHRoZXNlIHRpY2tldHMgKGJ1dCBub3QgbGltaXRlZCB0byB0aGVtKQorLy8gVEhSSUZULTI1MDggVW5jb21waWxlYWJsZSBDIyBjb2RlIGR1ZSB0byBsYW5ndWFnZSBrZXl3b3JkcyBpbiBJREwKKy8vIFRIUklGVC0yNTU3IGVycm9yIENTMDU0MiBtZW1iZXIgbmFtZXMgY2Fubm90IGJlIHRoZSBzYW1lIGFzIHRoZWlyIGVuY2xvc2luZyB0eXBlCisKKworc3RydWN0IHVzaW5nIHsKKyAgICAxOiBkb3VibGUgc2luZ2xlCisgICAgMjogZG91YmxlIGludGVnZXIKK30KKworc3RydWN0IGRlbGVnYXRlIHsKKyAgICAxOiBzdHJpbmcgcGFydGlhbAorICAgIDI6IGRlbGVnYXRlIGRlbGVnYXRlCit9CisKK3N0cnVjdCBnZXQgeworICAgIDE6IGJvb2wgc2J5dGUKK30KKworc3RydWN0IHBhcnRpYWwgeworICAgIDE6IHVzaW5nIHVzaW5nCisgICAgMjogYm9vbCByZWFkCisgICAgMzogYm9vbCB3cml0ZQorfQorCitlbnVtIE1heWJlIHsKKyAgSlVTVCA9IDEsCisgIFRSVUUgPSAyLAorICBGQUxTRSA9IDMKK30KKworZW51bSBFaXRoZXIgeworICBMRUZUID0gMSwKKyAgUklHSFQgPSAyCit9CisKK3N0cnVjdCBmb2xkciB7CisgIDE6IHN0cmluZyBpZAorfQorCitzdHJ1Y3Qgb2YgeworICAxOiBzdHJpbmcgbGV0CisgIDI6IHN0cmluZyB3aGVyZQorfQorCitzdHJ1Y3Qgb2ZPZiB7CisgIDE6IG9mIE9mCit9CisKKworc3RydWN0IENsYXNzQW5kUHJvcCB7CisgIDE6IGJvb2wgQ2xhc3NBbmRQcm9wCisgIDI6IGJvb2wgQ2xhc3NBbmRQcm9wXworICAzOiBib29sIENsYXNzQW5kUHJvcF9fCisgIDQ6IGJvb2wgQ2xhc3NBbmRQcm9wZXIKK30KKworc3RydWN0IHNlY29uZF9jaGFuY2UgeworICAxOiBib29sIFNFQ09ORF9DSEFOQ0UKKyAgMjogYm9vbCBTRUNPTkRfQ0hBTkNFXworICAzOiBib29sIFNFQ09ORF9DSEFOQ0VfXworICA0OiBib29sIFNFQ09ORF9DSEFOQ0VTCit9CisKK3N0cnVjdCBOT1dfRUFUX1RISVMgeworICAxOiBib29sIG5vd19lYXRfdGhpcworICAyOiBib29sIG5vd19lYXRfdGhpc18KKyAgMzogYm9vbCBub3dfZWF0X3RoaXNfXworICA0OiBib29sIG5vd19lYXRfdGhpc19hbmRfdGhpcworfQorCitzdHJ1Y3QgVGhlRWRnZUNhc2UgeworICAxOiBib29sIHRoZUVkZ2VDYXNlCisgIDI6IGJvb2wgdGhlRWRnZUNhc2VfCisgIDM6IGJvb2wgdGhlRWRnZUNhc2VfXworICA0OiBib29sIFRoZUVkZ2VDYXNlCisgIDU6IGJvb2wgVGhlRWRnZUNhc2VfCisgIDY6IGJvb2wgVGhlRWRnZUNhc2VfXworfQorCitzdHJ1Y3QgVHJpY2t5XyB7CisgIDE6IGJvb2wgdHJpY2t5CisgIDI6IGJvb2wgVHJpY2t5Cit9CisKK3N0cnVjdCBOZXN0ZWQgeworICAxOiBDbGFzc0FuZFByb3AgQ2xhc3NBbmRQcm9wCisgIDI6IHNlY29uZF9jaGFuY2Ugc2Vjb25kX2NoYW5jZQorICAzOiBOT1dfRUFUX1RISVMgTk9XX0VBVF9USElTCisgIDQ6IFRoZUVkZ2VDYXNlIFRoZUVkZ2VDYXNlCisgIDU6IFRyaWNreV8gVHJpY2t5XworICA2OiBOZXN0ZWQgTmVzdGVkCit9CisKK2V4Y2VwdGlvbiBQcm9ibGVtXyB7CisgIDE6IGJvb2wgcHJvYmxlbQorICAyOiBib29sIFByb2JsZW0KK30KKworCitzZXJ2aWNlIGV4dGVybiB7CisgICAgZGVsZWdhdGUgZXZlbnQoMTogcGFydGlhbCBnZXQpCisgICAgdm9pZCBGb28oMTogTmVzdGVkIEZvb19hcmdzKSB0aHJvd3MgKDE6IFByb2JsZW1fIEZvb19yZXN1bHQpCit9CisKK3NlcnZpY2UgcXVhbGlmaWVkIHsKKyAgICBNYXliZSBtYXliZSgxOiBNYXliZSBmb2xkcikKKyAgICBFaXRoZXIgZWl0aGVyKDE6IGZvbGRyIG9mKQorfQorLy8gZW9mCmRpZmYgLS1naXQgYS90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdCBiL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CmluZGV4IDgxMDhhN2YuLmE2MDg4OTggMTAwNjQ0Ci0tLSBhL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CisrKyBiL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CkBAIC00OSw2ICs0OSwxMSBAQAogICAxOiByZXF1aXJlZCBpMTYgaW1fcmVxdWlyZWQ7CiB9CiAKK3N0cnVjdCBPcHRpb25hbERlZmF1bHQgeworICAxOiBvcHRpb25hbCBpMTYgb3B0X2ludCA9IDEyMzQ7CisgIDI6IG9wdGlvbmFsIHN0cmluZyBvcHRfc3RyID0gImRlZmF1bHQiOworfQorCiBzdHJ1Y3QgQ29tcGxleCB7CiAgIDE6ICAgICAgICAgIGkxNiBjcF9kZWZhdWx0OwogICAyOiByZXF1aXJlZCBpMTYgY3BfcmVxdWlyZWQ7CkBAIC03NSwzICs4MCw5IEBACiAgIDU6IHJlcXVpcmVkIGJpbmFyeSByZXFfYmluOwogICA2OiBvcHRpb25hbCBiaW5hcnkgb3B0X2JpbjsKIH0KKworc3RydWN0IEJpbmFyaWVzIHsKKyAgNDogYmluYXJ5IGJpbjsKKyAgNTogcmVxdWlyZWQgYmluYXJ5IHJlcV9iaW47CisgIDY6IG9wdGlvbmFsIGJpbmFyeSBvcHRfYmluOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9SRUFETUUubWQgYi90ZXN0L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNjgyZjVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9SRUFETUUubWQKQEAgLTAsMCArMSwxODUgQEAKKyMgQXBhY2hlIFRocmlmdCAtIGludGVncmF0aW9uIHRlc3Qgc3VpdGUKKworVGhpcyBpcyB0aGUgY3Jvc3MgZXZlcnl0aGluZyBpbnRlZ3JhdGlvbiB0ZXN0IHN1aXRlIGZvciBBcGFjaGUgVGhyaWZ0LgorCisjIyBSdW4KKworIyMjIEEuIFVzaW5nIE1ha2UKKworVGhlIHRlc3QgY2FuIGJlIGV4ZWN1dGVkIGJ5OgorCisgICAgbWFrZSBjcm9zcworCitUaGlzIHN0YXJ0cyB0aGUgW3Rlc3QucHldKHRlc3QucHkpIHNjcmlwdCB3aGljaCBkb2VzIHRoZSByZWFsIGNyb3NzIHRlc3Qgd2l0aAorZGlmZmVyZW50IHRyYW5zcG9ydHMsIHByb3RvY29scyBhbmQgbGFuZ3VhZ2VzLgorCitOb3RlIHRoYXQgdGhpcyBza2lwcyBhbnkgbGFuZ3VhZ2UgdGhhdCBpcyBub3QgYnVpbHQgbG9jYWxseS4gSXQgYWxzbyBza2lwcwordGVzdHMgdGhhdCBhcmUga25vd24gdG8gYmUgZmFpbGluZy4gSWYgeW91IG5lZWQgbW9yZSBjb250cm9sIG92ZXIgd2hpY2ggdGVzdHMKK3RvIHJ1biwgcmVhZCBmb2xsb3dpbmcgc2VjdGlvbi4KKworIyMjIEIuIFVzaW5nIHRlc3Qgc2NyaXB0IGRpcmVjdGx5CisKK0FsdGVybmF0aXZlbHksIHlvdSBjYW4gaW52b2tlIFt0ZXN0LnB5XSh0ZXN0LnB5KSBkaXJlY3RseS4gWW91IG5lZWQgdG8gcnVuYG1ha2UKK3ByZWNyb3NzYCBvbmNlIGJlZm9yZSBleGVjdXRpbmcgaXQgZm9yIHRoZSBmaXJzdCB0aW1lLgorCitGb3IgZXhhbXBsZSwgaWYgeW91IGNoYW5nZWQgc29tZXRoaW5nIGluIGBub2RlanNgIGxpYnJhcnkgYW5kIG5lZWQgdG8gdmVyaWZ5Cit0aGUgcGF0Y2gsIHlvdSBjYW4gc2tpcCBldmVyeXRoaW5nIGV4Y2VwdCBgbm9kZWpzYCBpdHNlbGYgYW5kIHNvbWUgcmVmZXJlbmNlCitpbXBsZW1lbnRhdGlvbiAoY3VycmVudGx5IGBjcHBgIGFuZCBgamF2YWAgYXJlIHJlY29tbWVuZGVkKSBsaWtlIHRoaXM6CisKKyAgICAuL2NvbmZpZ3VyZSAtLXdpdGhvdXQtY19nbGliIC13aXRob3V0LWNzaGFycCAtLXdpdGhvdXQtZXJsYW5nIC0td2l0aG91dC1sdWEgLi4uCisgICAgbWFrZSBwcmVjcm9zcyAtajgKKyAgICB0ZXN0L3Rlc3QucHkgLS1zZXJ2ZXIgY3BwLGphdmEgLS1jbGllbnQgbm9kZWpzCisgICAgdGVzdC90ZXN0LnB5IC0tc2VydmVyIG5vZGVqcyAtLWNsaWVudCBjcHAsamF2YQorCitBbm90aGVyIHVzZWZ1bCBmbGFnIGlzIC0tcmVnZXguIEZvciBleGFtcGxlLCB0byBydW4gYWxsIHRlc3RzIHRoYXQgaW52b2x2ZQorSmF2YSBUQmluYXJ5UHJvdG9jb2w6CisKKyAgICB0ZXN0L3Rlc3QucHkgLS1yZWdleCAiamF2YS4qYmluYXJ5IgorCisjIyBUZXN0IGNhc2UgZGVmaW5pdGlvbiBmaWxlCisKK1RoZSBjcm9zcyB0ZXN0IGNhc2VzIGFyZSBkZWZpbmVkIGluIFt0ZXN0cy5qc29uXSh0ZXN0cy5qc29uKS4KK1RoZSByb290IGVsZW1lbnQgaXMgY29sbGVjdGlvbiBvZiB0ZXN0IHRhcmdldCBkZWZpbml0aW9ucy4KK0VhY2ggdGVzdCB0YXJnZXQgZGVmaW5pdGlvbiBsb29rcyBsaWtlIHRoaXM6CisKKyAgICB7CisgICAgICAibmFtZSI6ICJzb21lbGliIiwKKworICAgICAgImNsaWVudCI6IHsKKyAgICAgICAgImNvbW1hbmQiOiBbInNvbWVsaWJfY2xpZW50X2V4ZWN1dGFibGUiXSwKKyAgICAgICAgIndvcmtkaXIiOiAic29tZWxpYi9iaW4iLAorICAgICAgICAicHJvdG9jb2xzIjogWyJiaW5hcnkiXSwKKyAgICAgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgICAgICJzb2NrZXRzIjogWyJpcCJdLAorICAgICAgfSwKKyAgICAgICJzZXJ2ZXIiOiB7CisgICAgICAgICJjb21tYW5kIjogWyJzb21lbGliX3NlcnZlcl9leGVjdXRhYmxlIl0sCisgICAgICAgICJ3b3JrZGlyIjogInNvbWVsaWIvYmluIiwKKyAgICAgICAgInByb3RvY29scyI6IFsiYmluYXJ5Il0sCisgICAgICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICAgICAic29ja2V0cyI6IFsiaXAiLCAiaXAtc3NsIl0sCisgICAgICB9CisgICAgfQorCitFaXRoZXIgY2xpZW50IG9yIHNlcnZlciBkZWZpbml0aW9uIG9yIGJvdGggc2hvdWxkIGJlIHByZXNlbnQuCisKK1BhcmFtZXRlcnMgdGhhdCBhcmUgY29tbW9uIHRvIGJvdGggYGNsaWVudGAgYW5kIGBzZXJ2ZXJgIGNhbiBiZSBwdXQgdG8gdGFyZ2V0CitkZWZpbml0aW9uIHJvb3Q6CisKKyAgICB7CisgICAgICAibmFtZSI6ICJzb21lbGliIiwKKworICAgICAgIndvcmtkaXIiOiAic29tZWxpYi9iaW4iLAorICAgICAgInByb3RvY29scyI6IFsiYmluYXJ5Il0sCisgICAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAgICJzb2NrZXRzIjogWyJpcCJdLAorCisgICAgICAiY2xpZW50IjogeyAiY29tbWFuZCI6IFsic29tZWxpYl9jbGllbnRfZXhlY3V0YWJsZSJdIH0sCisgICAgICAic2VydmVyIjogeworICAgICAgICAiY29tbWFuZCI6IFsic29tZWxpYl9zZXJ2ZXJfZXhlY3V0YWJsZSJdLAorICAgICAgICAic29ja2V0cyI6IFsiaXAtc3NsIl0KKyAgICAgIH0KKyAgICB9CisKK0ZvciB0aGUgY29tcGxldGUgbGlzdCBvZiBzdXBwb3J0ZWQga2V5cyBhbmQgdGhlaXIgZWZmZWN0LCBzZWUgc291cmNlIGNvZGUKK2NvbW1lbnQgYXQgdGhlIG9wdCBvZiBbY3Jvc3NydW5uZXIvY29sbGVjdC5weV0oY3Jvc3NydW5uZXIvY29sbGVjdC5weSkuCisKKworIyMgTGlzdCBvZiBrbm93biBmYWlsdXJlcworCitTaW5jZSBtYW55IGNyb3NzIHRlc3RzIGN1cnJlbnRseSBmYWlsIChtYWlubHkgZHVlIHRvIHBhcnRpYWwgaW5jb21wYXRpYmlsaXR5Cithcm91bmQgZXhjZXB0aW9uIGhhbmRsaW5nKSwgdGhlIHRlc3Qgc2NyaXB0IHNwZWNpZmljYWxseSByZXBvcnQgZm9yICJub3Qga25vd24KK2JlZm9yZSIgZmFpbHVyZXMuCisKK0ZvciB0aGlzIHB1cnBvc2UsIHRlc3QgY2FzZXMga25vd24gdG8gKG9jY2FzaW9uYWxseSkgZmFpbCBhcmUgbGlzdGVkIGluCitga25vd25fZmFpbHVyZXNfPHBsYXRmb3JtPi5qc29uYCB3aGVyZSBgPHBsYXRmb3JtPmAgbWF0Y2hlcyB3aXRoIHB5dGhvbgorYHBsYXRmb3JtLnN5c3RlbSgpYCBzdHJpbmcuCisKK0N1cnJlbnRseSwgb25seSBMaW51eCB2ZXJzaW9uIGlzIGluY2x1ZGVkLgorCitGWUksIHRoZSBmaWxlIGlzIGluaXRpYWxseSBnZW5lcmF0ZWQgYnkKKworICAgIHRlc3QvdGVzdC5weSAtLXVwZGF0ZS1leHBlY3RlZC1mYWlsdXJlcz1vdmVyd3JpdGUKKworYWZ0ZXIgYSBmdWxsIHRlc3QgcnVuLCB0aGVuIHJlcGVhdGVkbHkKKworICAgIHRlc3QvdGVzdC5weSAtLXNraXAta25vd24tZmFpbHVyZXMKKyAgICB0ZXN0L3Rlc3QucHkgLS11cGRhdGUtZXhwZWN0ZWQtZmFpbHVyZXM9bWVyZ2UKKwordG8gdXBkYXRlIHRoZSBrbm93biBmYWlsdXJlcywgcnVuCisKKyAgICBtYWtlIGZhaWwKKworIyMgVGVzdCBleGVjdXRhYmxlIHNwZWNpZmljYXRpb24KKworIyMjIENvbW1hbmQgbGluZSBwYXJhbWV0ZXJzCisKK1VuaXQgdGVzdHMgZm9yIGxhbmd1YWdlcyBhcmUgdXN1YWxseSBsb2NhdGVkIHVuZGVyIGxpYi88bGFuZz4vdGVzdC8KK2Nyb3NzIGxhbmd1YWdlIHRlc3RzIGFjY29yZGluZyB0byBbVGhyaWZ0VGVzdC50aHJpZnRdKFRocmlmdFRlc3QudGhyaWZ0KSBzaGFsbCBiZQorcHJvdmlkZWQgZm9yIGV2ZXJ5IGxhbmd1YWdlIGluY2x1ZGluZyBleGVjdXRhYmxlcyB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZAorbGluZSBpbnRlcmZhY2U6CisKKyoqU2VydmVyIGNvbW1hbmQgbGluZSBpbnRlcmZhY2U6KioKKworICAgICQgLi9jcHAvVGVzdFNlcnZlciAtaAorICAgIEFsbG93ZWQgb3B0aW9uczoKKyAgICAgIC1oIFsgLS1oZWxwIF0gICAgICAgICAgICAgICBwcm9kdWNlIGhlbHAgbWVzc2FnZQorICAgICAgLS1wb3J0IGFyZyAoPTkwOTApICAgICAgICAgIFBvcnQgbnVtYmVyIHRvIGxpc3RlbgorICAgICAgLS1kb21haW4tc29ja2V0IGFyZyAgICAgICAgIFVuaXggRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KQorICAgICAgLS1uYW1lZC1waXBlIGFyZyAgICAgICAgICAgIFdpbmRvd3MgTmFtZWQgUGlwZSAoZS5nLiBNeVRocmlmdFBpcGUpCisgICAgICAtLXNlcnZlci10eXBlIGFyZyAoPXNpbXBsZSkgdHlwZSBvZiBzZXJ2ZXIsICJzaW1wbGUiLCAidGhyZWFkLXBvb2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRlZCIsIG9yICJub25ibG9ja2luZyIKKyAgICAgIC0tdHJhbnNwb3J0IGFyZyAoPWJ1ZmZlcmVkKSB0cmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIGFub25waXBlCisgICAgICAtLXByb3RvY29sIGFyZyAoPWJpbmFyeSkgICAgcHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbgorICAgICAgLS1zc2wgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMCisgICAgICAtLXByb2Nlc3Nvci1ldmVudHMgICAgICAgICAgcHJvY2Vzc29yLWV2ZW50cworICAgICAgLW4gWyAtLXdvcmtlcnMgXSBhcmcgKD00KSAgIE51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gT25seSB2YWxpZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC1wb29sIHNlcnZlciB0eXBlCisKKyoqQ2xpZW50IGNvbW1hbmQgbGluZSBpbnRlcmZhY2U6KioKKworICAgICQgLi9jcHAvVGVzdENsaWVudCAtaAorICAgIEFsbG93ZWQgb3B0aW9uczoKKyAgICAgIC1oIFsgLS1oZWxwIF0gICAgICAgICAgICAgICBwcm9kdWNlIGhlbHAgbWVzc2FnZQorICAgICAgLS1ob3N0IGFyZyAoPWxvY2FsaG9zdCkgICAgIEhvc3QgdG8gY29ubmVjdAorICAgICAgLS1wb3J0IGFyZyAoPTkwOTApICAgICAgICAgIFBvcnQgbnVtYmVyIHRvIGNvbm5lY3QKKyAgICAgIC0tZG9tYWluLXNvY2tldCBhcmcgICAgICAgICBEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgaG9zdCBhbmQgcG9ydAorICAgICAgLS1uYW1lZC1waXBlIGFyZyAgICAgICAgICAgIFdpbmRvd3MgTmFtZWQgUGlwZSAoZS5nLiBNeVRocmlmdFBpcGUpCisgICAgICAtLWFub24tcGlwZXMgaFJlYWQgaFdyaXRlICAgV2luZG93cyBBbm9ueW1vdXMgUGlwZXMgcGFpciAoaGFuZGxlcykKKyAgICAgIC0tdHJhbnNwb3J0IGFyZyAoPWJ1ZmZlcmVkKSBUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIGV2aHR0cAorICAgICAgLS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpICAgIFByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb24KKyAgICAgIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTAorICAgICAgLW4gWyAtLXRlc3Rsb29wcyBdIGFyZyAoPTEpIE51bWJlciBvZiBUZXN0cworICAgICAgLXQgWyAtLXRocmVhZHMgXSBhcmcgKD0xKSAgIE51bWJlciBvZiBUZXN0IHRocmVhZHMKKworSWYgeW91IGhhdmUgZXhlY3V0ZWQgdGhlICoqbWFrZSBjaGVjayoqIG9yICoqbWFrZSBjcm9zcyoqIHRoZW4geW91IHdpbGwgYmUgYWJsZSB0byBicm93c2UKK1tnZW4taHRtbC9UaHJpZnRUZXN0Lmh0bWxdKGdlbi1odG1sL1RocmlmdFRlc3QuaHRtbCkgd2l0aCB0aGUgdGVzdCBkb2N1bWVudGF0aW9uLgorCisjIyMgUmV0dXJuIGNvZGUKKworVGhlIHJldHVybiBjb2RlIChleGl0IGNvZGUpIHNoYWxsIGJlIDAgb24gc3VjY2Vzcywgb3IgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2UgMSAtIDI1NSBvbiBlcnJvcnMuCitJbiBvcmRlciB0byBzaWduYWwgZmFpbGVkIHRlc3RzLCB0aGUgcmV0dXJuIGNvZGUgc2hhbGwgYmUgY29tcG9zZWQgZnJvbSB0aGVzZSBiaXRzIHRvIGluZGljYXRlCitmYWlsaW5nIHRlc3RzOgorCisgICAgICAjZGVmaW5lIFRFU1RfQkFTRVRZUEVTICAgICAxICAvLyAwMDAwIDAwMDEKKyAgICAgICNkZWZpbmUgVEVTVF9TVFJVQ1RTICAgICAgIDIgIC8vIDAwMDAgMDAxMAorICAgICAgI2RlZmluZSBURVNUX0NPTlRBSU5FUlMgICAgNCAgLy8gMDAwMCAwMTAwCisgICAgICAjZGVmaW5lIFRFU1RfRVhDRVBUSU9OUyAgICA4ICAvLyAwMDAwIDEwMDAKKyAgICAgICNkZWZpbmUgVEVTVF9VTktOT1dOICAgICAgNjQgIC8vIDAxMDAgMDAwMCAoRmFpbGVkIHRvIHByZXBhcmUgZW52aXJvbmVtdCBldGMuKQorICAgICAgI2RlZmluZSBURVNUX1RJTUVPVVQgICAgIDEyOCAgLy8gMTAwMCAwMDAwCisgICAgICAjZGVmaW5lIFRFU1RfTk9UVVNFRCAgICAgIDQ4ICAvLyAwMDExIDAwMDAgKHJlc2VydmVkIGJpdHMpCisKK1Rlc3RzIHRoYXQgaGF2ZSBub3QgYmVlbiBleGVjdXRlZCBhdCBhbGwgY291bnQgYXMgZXJyb3JzLgorCisqKkV4YW1wbGU6KioKKworRHVyaW5nIHRlc3RzLCB0aGUgdGVzdCBjbGllbnQgbm90aWNlcyB0aGF0IHNvbWUgb2YgdGhlIFN0cnVjdCB0ZXN0cyBmYWlsLgorRnVydGhlcm1vcmUsIGR1ZSB0byBzb21lIG90aGVyIHByb2JsZW0gbm9uZSBvZiB0aGUgRXhjZXB0aW9uIHRlc3RzIGlzIGV4ZWN1dGVkLgorVGhlcmVmb3JlLCB0aGUgdGVzdCBjbGllbnQgcmV0dXJucyB0aGUgY29kZSBgMTAgPSAyIHwgOGAsIGluZGljYXRpbmcgdGhlIGZhaWx1cmUKK29mIGJvdGggdGVzdCAyIChURVNUX1NUUlVDVFMpIGFuZCB0ZXN0IDggKFRFU1RfRVhDRVBUSU9OUykuCisKKworIyMgU1NMCitUZXN0IEtleXMgYW5kIENlcnRpZmljYXRlcyBhcmUgcHJvdmlkZWQgaW4gbXVsdGlwbGUgZm9ybWF0cyB1bmRlciB0aGUgZm9sbG93aW5nCitkaXJlY3RvcnkgW3Rlc3Qva2V5c10oa2V5cykKZGlmZiAtLWdpdCBhL3Rlc3QvUmVjdXJzaXZlLnRocmlmdCBiL3Rlc3QvUmVjdXJzaXZlLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTgyNTgyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9SZWN1cnNpdmUudGhyaWZ0CkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworc3RydWN0IFJlY1RyZWUgeworICAxOiBsaXN0PFJlY1RyZWU+IGNoaWxkcmVuCisgIDI6IGkxNiBpdGVtCit9CisKK3N0cnVjdCBSZWNMaXN0IHsKKyAgMTogUmVjTGlzdCAmIG5leHRpdGVtCisgIDM6IGkxNiBpdGVtCit9CisKK3N0cnVjdCBDb1JlYyB7CisgIDE6ICBDb1JlYzIgJiBvdGhlcgorfQorCitzdHJ1Y3QgQ29SZWMyIHsKKyAgMTogQ29SZWMgb3RoZXIKK30KKworc3RydWN0IFZlY3RvclRlc3QgeworICAxOiBsaXN0PFJlY0xpc3Q+IGxpc3RlcjsKK30KKworc2VydmljZSBUZXN0U2VydmljZQoreworICBSZWNUcmVlIGVjaG9UcmVlKDE6UmVjVHJlZSB0cmVlKQorICBSZWNMaXN0IGVjaG9MaXN0KDE6UmVjTGlzdCBsc3QpCisgIENvUmVjIGVjaG9Db1JlYygxOkNvUmVjIGl0ZW0pCit9CmRpZmYgLS1naXQgYS90ZXN0L1JldXNlT2JqZWN0cy50aHJpZnQgYi90ZXN0L1JldXNlT2JqZWN0cy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkNmM2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvUmV1c2VPYmplY3RzLnRocmlmdApAQCAtMCwwICsxLDMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFRoZSBqYXZhIGNvZGVnZW5lcmF0b3IgaGFzIG9wdGlvbiB0byByZXVzZSBvYmplY3RzIGZvciBkZXNlcmlhbGl6YXRpb24KKworbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKKworaW5jbHVkZSAiVGhyaWZ0VGVzdC50aHJpZnQiCisKK3N0cnVjdCBSZXVzZSB7CisgIDE6IGkzMiB2YWwxOworICAyOiBzZXQ8c3RyaW5nPiB2YWwyOworfQorCmRpZmYgLS1naXQgYS90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0IGIvdGVzdC9TdHJlc3NUZXN0LnRocmlmdAppbmRleCA4N2M2ZTQ3Li40MzE4MTFiIDEwMDY0NAotLS0gYS90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0CisrKyBiL3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQKQEAgLTE4LDE2ICsxOCwxOCBAQAogICovCiAKIG5hbWVzcGFjZSBjcHAgdGVzdC5zdHJlc3MKK25hbWVzcGFjZSBkIHRocmlmdC50ZXN0LnN0cmVzcworbmFtZXNwYWNlIGdvIHN0cmVzcwogCiBzZXJ2aWNlIFNlcnZpY2UgewogCiAgIHZvaWQgZWNob1ZvaWQoKSwKLSAgYnl0ZSBlY2hvQnl0ZSgxOiBieXRlIGFyZyksCisgIGk4IGVjaG9CeXRlKDE6IGk4IGFyZyksCiAgIGkzMiBlY2hvSTMyKDE6IGkzMiBhcmcpLAogICBpNjQgZWNob0k2NCgxOiBpNjQgYXJnKSwKICAgc3RyaW5nIGVjaG9TdHJpbmcoMTogc3RyaW5nIGFyZyksCi0gIGxpc3Q8Ynl0ZT4gIGVjaG9MaXN0KDE6IGxpc3Q8Ynl0ZT4gYXJnKSwKLSAgc2V0PGJ5dGU+ICBlY2hvU2V0KDE6IHNldDxieXRlPiBhcmcpLAotICBtYXA8Ynl0ZSwgYnl0ZT4gIGVjaG9NYXAoMTogbWFwPGJ5dGUsIGJ5dGU+IGFyZyksCisgIGxpc3Q8aTg+ICBlY2hvTGlzdCgxOiBsaXN0PGk4PiBhcmcpLAorICBzZXQ8aTg+ICBlY2hvU2V0KDE6IHNldDxpOD4gYXJnKSwKKyAgbWFwPGk4LCBpOD4gIGVjaG9NYXAoMTogbWFwPGk4LCBpOD4gYXJnKSwKIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCBiL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKaW5kZXggYjZjZDkzOS4uMzQ5OWFiNSAxMDA2NDQKLS0tIGEvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorKysgYi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CkBAIC0zMSw4ICszMSwxOSBAQAogbmFtZXNwYWNlIHN0IFRocmlmdFRlc3QKIG5hbWVzcGFjZSBweSBUaHJpZnRUZXN0CiBuYW1lc3BhY2UgcHkudHdpc3RlZCBUaHJpZnRUZXN0Ci1uYW1lc3BhY2UgZ28gVGhyaWZ0VGVzdAorbmFtZXNwYWNlIGdvIHRocmlmdHRlc3QKIG5hbWVzcGFjZSBwaHAgVGhyaWZ0VGVzdAorbmFtZXNwYWNlIGRlbHBoaSBUaHJpZnQuVGVzdAorbmFtZXNwYWNlIGNvY29hIFRocmlmdFRlc3QKK25hbWVzcGFjZSBsdWEgVGhyaWZ0VGVzdAorbmFtZXNwYWNlIHhzZCB0ZXN0ICh1cmkgPSAnaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL25zL1RocmlmdFRlc3QnKQorbmFtZXNwYWNlIG5ldGNvcmUgVGhyaWZ0VGVzdAorCisvLyBQcmVzZW5jZSBvZiBuYW1lc3BhY2VzIGFuZCBzdWItbmFtZXNwYWNlcyBmb3Igd2hpY2ggdGhlcmUgaXMKKy8vIG5vIGdlbmVyYXRvciBzaG91bGQgY29tcGlsZSB3aXRoIHdhcm5pbmdzIG9ubHkKK25hbWVzcGFjZSBub2V4aXN0IFRocmlmdFRlc3QKK25hbWVzcGFjZSBjcHAubm9leGlzdCBUaHJpZnRUZXN0CisKIG5hbWVzcGFjZSAqIHRocmlmdC50ZXN0CiAKIC8qKgpAQCAtNjAsNiArNzEsOCBAQAogICAyOiBpMzIgdHlwZQogfQogCit0eXBlZGVmIG1hcDxzdHJpbmcsQm9uaz4gTWFwVHlwZQorCiBzdHJ1Y3QgQm9vbHMgewogICAxOiBib29sIGltX3RydWUsCiAgIDI6IGJvb2wgaW1fZmFsc2UsCkBAIC02OCwxNCArODEsMTQgQEAKIHN0cnVjdCBYdHJ1Y3QKIHsKICAgMTogIHN0cmluZyBzdHJpbmdfdGhpbmcsCi0gIDQ6ICBieXRlICAgYnl0ZV90aGluZywKKyAgNDogIGk4ICAgICBieXRlX3RoaW5nLAogICA5OiAgaTMyICAgIGkzMl90aGluZywKICAgMTE6IGk2NCAgICBpNjRfdGhpbmcKIH0KIAogc3RydWN0IFh0cnVjdDIKIHsKLSAgMTogYnl0ZSAgIGJ5dGVfdGhpbmcsCisgIDE6IGk4ICAgICBieXRlX3RoaW5nLCAgLy8gdXNlZCB0byBiZSBieXRlLCBoZW5jZSB0aGUgbmFtZQogICAyOiBYdHJ1Y3Qgc3RydWN0X3RoaW5nLAogICAzOiBpMzIgICAgaTMyX3RoaW5nCiB9CkBAIC05MywxNSArMTA2LDI0IEBACiB7CiAgIDE6IG1hcDxOdW1iZXJ6LCBVc2VySWQ+IHVzZXJNYXAsCiAgIDI6IGxpc3Q8WHRydWN0PiB4dHJ1Y3RzCi19Cit9IChweXRob24uaW1tdXRhYmxlPSAiIikKIAogc3RydWN0IENyYXp5TmVzdGluZyB7CiAgIDE6IHN0cmluZyBzdHJpbmdfZmllbGQsCiAgIDI6IG9wdGlvbmFsIHNldDxJbnNhbml0eT4gc2V0X2ZpZWxkLAotICAzOiByZXF1aXJlZCBsaXN0PCBtYXA8c2V0PGkzMj4sbWFwPGkzMixzZXQ8bGlzdDxtYXA8SW5zYW5pdHksc3RyaW5nPj4+Pj4+IGxpc3RfZmllbGQsCisgIC8vIERvIG5vdCBpbnNlcnQgbGluZSBicmVhayBhcyB0ZXN0L2dvL01ha2VmaWxlLmFtIGlzIHJlbW92aW5nIHRoaXMgbGluZSB3aXRoIHBhdHRlcm4gbWF0Y2gKKyAgMzogcmVxdWlyZWQgbGlzdDxtYXA8c2V0PGkzMj4gKHB5dGhvbi5pbW11dGFibGUgPSAiIiksIG1hcDxpMzIsc2V0PGxpc3Q8bWFwPEluc2FuaXR5LHN0cmluZz4ocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4gKHB5dGhvbi5pbW11dGFibGUgPSAiIik+Pj4+IGxpc3RfZmllbGQsCiAgIDQ6IGJpbmFyeSBiaW5hcnlfZmllbGQKIH0KIAordW5pb24gU29tZVVuaW9uIHsKKyAgMTogbWFwPE51bWJlcnosIFVzZXJJZD4gbWFwX3RoaW5nLAorICAyOiBzdHJpbmcgc3RyaW5nX3RoaW5nLAorICAzOiBpMzIgaTMyX3RoaW5nLAorICA0OiBYdHJ1Y3QzIHh0cnVjdF90aGluZywKKyAgNTogSW5zYW5pdHkgaW5zYW5pdHlfdGhpbmcKK30KKwogZXhjZXB0aW9uIFhjZXB0aW9uIHsKICAgMTogaTMyIGVycm9yQ29kZSwKICAgMjogc3RyaW5nIG1lc3NhZ2UKQEAgLTEyMCw0NCArMTQyLDE5MSBAQAogCiBzZXJ2aWNlIFRocmlmdFRlc3QKIHsKKyAgLyoqCisgICAqIFByaW50cyAidGVzdFZvaWQoKSIgYW5kIHJldHVybnMgbm90aGluZy4KKyAgICovCiAgIHZvaWQgICAgICAgICB0ZXN0Vm9pZCgpLAorCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RTdHJpbmcoIiVzIiknIHdpdGggdGhpbmcgYXMgJyVzJworICAgKiBAcGFyYW0gc3RyaW5nIHRoaW5nIC0gdGhlIHN0cmluZyB0byBwcmludAorICAgKiBAcmV0dXJuIHN0cmluZyAtIHJldHVybnMgdGhlIHN0cmluZyAndGhpbmcnCisgICAqLwogICBzdHJpbmcgICAgICAgdGVzdFN0cmluZygxOiBzdHJpbmcgdGhpbmcpLAotICBieXRlICAgICAgICAgdGVzdEJ5dGUoMTogYnl0ZSB0aGluZyksCisKKyAgLyoqCisgICAqIFByaW50cyAndGVzdEJvb2woIiVzIiknIHdoZXJlICclcycgd2l0aCB0aGluZyBhcyAndHJ1ZScgb3IgJ2ZhbHNlJworICAgKiBAcGFyYW0gYm9vbCAgdGhpbmcgLSB0aGUgYm9vbCBkYXRhIHRvIHByaW50CisgICAqIEByZXR1cm4gYm9vbCAgLSByZXR1cm5zIHRoZSBib29sICd0aGluZycKKyAgICovCisgIGJvb2wgICAgICAgICB0ZXN0Qm9vbCgxOiBib29sIHRoaW5nKSwKKworICAvKioKKyAgICogUHJpbnRzICd0ZXN0Qnl0ZSgiJWQiKScgd2l0aCB0aGluZyBhcyAnJWQnCisgICAqIFRoZSB0eXBlcyBpOCBhbmQgYnl0ZSBhcmUgc3lub255bXMsIHVzZSBvZiBpOCBpcyBlbmNvdXJhZ2VkLCBieXRlIHN0aWxsIGV4aXN0cyBmb3IgdGhlIHNha2Ugb2YgY29tcGF0aWJpbGl0eS4KKyAgICogQHBhcmFtIGJ5dGUgdGhpbmcgLSB0aGUgaTgvYnl0ZSB0byBwcmludAorICAgKiBAcmV0dXJuIGk4IC0gcmV0dXJucyB0aGUgaTgvYnl0ZSAndGhpbmcnCisgICAqLworICBpOCAgICAgICAgICAgdGVzdEJ5dGUoMTogaTggdGhpbmcpLAorCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RJMzIoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJworICAgKiBAcGFyYW0gaTMyIHRoaW5nIC0gdGhlIGkzMiB0byBwcmludAorICAgKiBAcmV0dXJuIGkzMiAtIHJldHVybnMgdGhlIGkzMiAndGhpbmcnCisgICAqLwogICBpMzIgICAgICAgICAgdGVzdEkzMigxOiBpMzIgdGhpbmcpLAorCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RJNjQoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJworICAgKiBAcGFyYW0gaTY0IHRoaW5nIC0gdGhlIGk2NCB0byBwcmludAorICAgKiBAcmV0dXJuIGk2NCAtIHJldHVybnMgdGhlIGk2NCAndGhpbmcnCisgICAqLwogICBpNjQgICAgICAgICAgdGVzdEk2NCgxOiBpNjQgdGhpbmcpLAorCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3REb3VibGUoIiVmIiknIHdpdGggdGhpbmcgYXMgJyVmJworICAgKiBAcGFyYW0gZG91YmxlIHRoaW5nIC0gdGhlIGRvdWJsZSB0byBwcmludAorICAgKiBAcmV0dXJuIGRvdWJsZSAtIHJldHVybnMgdGhlIGRvdWJsZSAndGhpbmcnCisgICAqLwogICBkb3VibGUgICAgICAgdGVzdERvdWJsZSgxOiBkb3VibGUgdGhpbmcpLAorCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RCaW5hcnkoIiVzIiknIHdoZXJlICclcycgaXMgYSBoZXgtZm9ybWF0dGVkIHN0cmluZyBvZiB0aGluZydzIGRhdGEKKyAgICogQHBhcmFtIGJpbmFyeSAgdGhpbmcgLSB0aGUgYmluYXJ5IGRhdGEgdG8gcHJpbnQKKyAgICogQHJldHVybiBiaW5hcnkgIC0gcmV0dXJucyB0aGUgYmluYXJ5ICd0aGluZycKKyAgICovCisgIGJpbmFyeSAgICAgICB0ZXN0QmluYXJ5KDE6IGJpbmFyeSB0aGluZyksCisKKyAgLyoqCisgICAqIFByaW50cyAndGVzdFN0cnVjdCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBhIHN0cmluZyBvZiBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzCisgICAqIEBwYXJhbSBYdHJ1Y3QgdGhpbmcgLSB0aGUgWHRydWN0IHRvIHByaW50CisgICAqIEByZXR1cm4gWHRydWN0IC0gcmV0dXJucyB0aGUgWHRydWN0ICd0aGluZycKKyAgICovCiAgIFh0cnVjdCAgICAgICB0ZXN0U3RydWN0KDE6IFh0cnVjdCB0aGluZyksCisKKyAgLyoqCisgICAqIFByaW50cyAndGVzdE5lc3QoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgdGhlIG5lc3RlZCBzdHJ1Y3QKKyAgICogQHBhcmFtIFh0cnVjdDIgdGhpbmcgLSB0aGUgWHRydWN0MiB0byBwcmludAorICAgKiBAcmV0dXJuIFh0cnVjdDIgLSByZXR1cm5zIHRoZSBYdHJ1Y3QyICd0aGluZycKKyAgICovCiAgIFh0cnVjdDIgICAgICB0ZXN0TmVzdCgxOiBYdHJ1Y3QyIHRoaW5nKSwKKworICAvKioKKyAgICogUHJpbnRzICd0ZXN0TWFwKCJ7JXMiKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgICdrZXkgPT4gdmFsdWUnIHBhaXJzCisgICAqICBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKKyAgICogQHBhcmFtIG1hcDxpMzIsaTMyPiB0aGluZyAtIHRoZSBtYXA8aTMyLGkzMj4gdG8gcHJpbnQKKyAgICogQHJldHVybiBtYXA8aTMyLGkzMj4gLSByZXR1cm5zIHRoZSBtYXA8aTMyLGkzMj4gJ3RoaW5nJworICAgKi8KICAgbWFwPGkzMixpMzI+IHRlc3RNYXAoMTogbWFwPGkzMixpMzI+IHRoaW5nKSwKKworICAvKioKKyAgICogUHJpbnRzICd0ZXN0U3RyaW5nTWFwKCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nIG9mICAna2V5ID0+IHZhbHVlJyBwYWlycworICAgKiAgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCisgICAqIEBwYXJhbSBtYXA8c3RyaW5nLHN0cmluZz4gdGhpbmcgLSB0aGUgbWFwPHN0cmluZyxzdHJpbmc+IHRvIHByaW50CisgICAqIEByZXR1cm4gbWFwPHN0cmluZyxzdHJpbmc+IC0gcmV0dXJucyB0aGUgbWFwPHN0cmluZyxzdHJpbmc+ICd0aGluZycKKyAgICovCiAgIG1hcDxzdHJpbmcsc3RyaW5nPiB0ZXN0U3RyaW5nTWFwKDE6IG1hcDxzdHJpbmcsc3RyaW5nPiB0aGluZyksCisKKyAgLyoqCisgICAqIFByaW50cyAndGVzdFNldCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBhIHN0cmluZyBvZiAgdmFsdWVzCisgICAqICBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKKyAgICogQHBhcmFtIHNldDxpMzI+IHRoaW5nIC0gdGhlIHNldDxpMzI+IHRvIHByaW50CisgICAqIEByZXR1cm4gc2V0PGkzMj4gLSByZXR1cm5zIHRoZSBzZXQ8aTMyPiAndGhpbmcnCisgICAqLwogICBzZXQ8aTMyPiAgICAgdGVzdFNldCgxOiBzZXQ8aTMyPiB0aGluZyksCisKKyAgLyoqCisgICAqIFByaW50cyAndGVzdExpc3QoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgIHZhbHVlcworICAgKiAgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCisgICAqIEBwYXJhbSBsaXN0PGkzMj4gdGhpbmcgLSB0aGUgbGlzdDxpMzI+IHRvIHByaW50CisgICAqIEByZXR1cm4gbGlzdDxpMzI+IC0gcmV0dXJucyB0aGUgbGlzdDxpMzI+ICd0aGluZycKKyAgICovCiAgIGxpc3Q8aTMyPiAgICB0ZXN0TGlzdCgxOiBsaXN0PGkzMj4gdGhpbmcpLAorCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RFbnVtKCIlZCIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBpdCdzIG51bWVyaWMgdmFsdWUKKyAgICogQHBhcmFtIE51bWJlcnogdGhpbmcgLSB0aGUgTnVtYmVyeiB0byBwcmludAorICAgKiBAcmV0dXJuIE51bWJlcnogLSByZXR1cm5zIHRoZSBOdW1iZXJ6ICd0aGluZycKKyAgICovCiAgIE51bWJlcnogICAgICB0ZXN0RW51bSgxOiBOdW1iZXJ6IHRoaW5nKSwKKworICAvKioKKyAgICogUHJpbnRzICd0ZXN0VHlwZWRlZigiJWQiKScgd2l0aCB0aGluZyBhcyAnJWQnCisgICAqIEBwYXJhbSBVc2VySWQgdGhpbmcgLSB0aGUgVXNlcklkIHRvIHByaW50CisgICAqIEByZXR1cm4gVXNlcklkIC0gcmV0dXJucyB0aGUgVXNlcklkICd0aGluZycKKyAgICovCiAgIFVzZXJJZCAgICAgICB0ZXN0VHlwZWRlZigxOiBVc2VySWQgdGhpbmcpLAogCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RNYXBNYXAoIiVkIiknIHdpdGggaGVsbG8gYXMgJyVkJworICAgKiBAcGFyYW0gaTMyIGhlbGxvIC0gdGhlIGkzMiB0byBwcmludAorICAgKiBAcmV0dXJuIG1hcDxpMzIsbWFwPGkzMixpMzI+PiAtIHJldHVybnMgYSBkaWN0aW9uYXJ5IHdpdGggdGhlc2UgdmFsdWVzOgorICAgKiAgIHstNCA9PiB7LTQgPT4gLTQsIC0zID0+IC0zLCAtMiA9PiAtMiwgLTEgPT4gLTEsIH0sIDQgPT4gezEgPT4gMSwgMiA9PiAyLCAzID0+IDMsIDQgPT4gNCwgfSwgfQorICAgKi8KICAgbWFwPGkzMixtYXA8aTMyLGkzMj4+IHRlc3RNYXBNYXAoMTogaTMyIGhlbGxvKSwKIAotICAvKiBTbyB5b3UgdGhpbmsgeW91J3ZlIGdvdCB0aGlzIGFsbCB3b3JrZWQsIG91dCBlaD8gKi8KKyAgLyoqCisgICAqIFNvIHlvdSB0aGluayB5b3UndmUgZ290IHRoaXMgYWxsIHdvcmtlZCwgb3V0IGVoPworICAgKgorICAgKiBDcmVhdGVzIGEgdGhlIHJldHVybmVkIG1hcCB3aXRoIHRoZXNlIHZhbHVlcyBhbmQgcHJpbnRzIGl0IG91dDoKKyAgICogICB7IDEgPT4geyAyID0+IGFyZ3VtZW50LAorICAgKiAgICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisgICAqICAgICAgICAgIH0sCisgICAqICAgICAyID0+IHsgNiA9PiA8ZW1wdHkgSW5zYW5pdHkgc3RydWN0PiwgfSwKKyAgICogICB9CisgICAqIEByZXR1cm4gbWFwPFVzZXJJZCwgbWFwPE51bWJlcnosSW5zYW5pdHk+PiAtIGEgbWFwIHdpdGggdGhlIGFib3ZlIHZhbHVlcworICAgKi8KICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcnosSW5zYW5pdHk+PiB0ZXN0SW5zYW5pdHkoMTogSW5zYW5pdHkgYXJndW1lbnQpLAogCi0gIC8qIE11bHRpcGxlIHBhcmFtZXRlcnMgKi8KLSAgWHRydWN0IHRlc3RNdWx0aSgxOiBieXRlIGFyZzAsIDI6IGkzMiBhcmcxLCAzOiBpNjQgYXJnMiwgNDogbWFwPGkxNiwgc3RyaW5nPiBhcmczLCA1OiBOdW1iZXJ6IGFyZzQsIDY6IFVzZXJJZCBhcmc1KSwKKyAgLyoqCisgICAqIFByaW50cyAndGVzdE11bHRpKCknCisgICAqIEBwYXJhbSBpOCBhcmcwIC0KKyAgICogQHBhcmFtIGkzMiBhcmcxIC0KKyAgICogQHBhcmFtIGk2NCBhcmcyIC0KKyAgICogQHBhcmFtIG1hcDxpMTYsIHN0cmluZz4gYXJnMyAtCisgICAqIEBwYXJhbSBOdW1iZXJ6IGFyZzQgLQorICAgKiBAcGFyYW0gVXNlcklkIGFyZzUgLQorICAgKiBAcmV0dXJuIFh0cnVjdCAtIHJldHVybnMgYW4gWHRydWN0IHdpdGggc3RyaW5nX3RoaW5nID0gIkhlbGxvMiwgYnl0ZV90aGluZyA9IGFyZzAsIGkzMl90aGluZyA9IGFyZzEKKyAgICogICAgYW5kIGk2NF90aGluZyA9IGFyZzIKKyAgICovCisgIFh0cnVjdCB0ZXN0TXVsdGkoMTogaTggYXJnMCwgMjogaTMyIGFyZzEsIDM6IGk2NCBhcmcyLCA0OiBtYXA8aTE2LCBzdHJpbmc+IGFyZzMsIDU6IE51bWJlcnogYXJnNCwgNjogVXNlcklkIGFyZzUpLAogCi0gIC8qIEV4Y2VwdGlvbiBzcGVjaWZpZXIgKi8KLQorICAvKioKKyAgICogUHJpbnQgJ3Rlc3RFeGNlcHRpb24oJXMpJyB3aXRoIGFyZyBhcyAnJXMnCisgICAqIEBwYXJhbSBzdHJpbmcgYXJnIC0gYSBzdHJpbmcgaW5kaWNhdGlvbiB3aGF0IHR5cGUgb2YgZXhjZXB0aW9uIHRvIHRocm93CisgICAqIGlmIGFyZyA9PSAiWGNlcHRpb24iIHRocm93IFhjZXB0aW9uIHdpdGggZXJyb3JDb2RlID0gMTAwMSBhbmQgbWVzc2FnZSA9IGFyZworICAgKiBlbHNlbiBpZiBhcmcgPT0gIlRFeGNlcHRpb24iIHRocm93IFRFeGNlcHRpb24KKyAgICogZWxzZSBkbyBub3QgdGhyb3cgYW55dGhpbmcKKyAgICovCiAgIHZvaWQgdGVzdEV4Y2VwdGlvbigxOiBzdHJpbmcgYXJnKSB0aHJvd3MoMTogWGNlcHRpb24gZXJyMSksCiAKLSAgLyogTXVsdGlwbGUgZXhjZXB0aW9ucyBzcGVjaWZpZXIgKi8KLQorICAvKioKKyAgICogUHJpbnQgJ3Rlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpJyB3aXRoIGFyZzAgYXMgJyVzJyBhbmQgYXJnMSBhcyAnJXMnCisgICAqIEBwYXJhbSBzdHJpbmcgYXJnIC0gYSBzdHJpbmcgaW5kaWNhdGlvbiB3aGF0IHR5cGUgb2YgZXhjZXB0aW9uIHRvIHRocm93CisgICAqIGlmIGFyZzAgPT0gIlhjZXB0aW9uIiB0aHJvdyBYY2VwdGlvbiB3aXRoIGVycm9yQ29kZSA9IDEwMDEgYW5kIG1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIKKyAgICogZWxzZW4gaWYgYXJnMCA9PSAiWGNlcHRpb24yIiB0aHJvdyBYY2VwdGlvbjIgd2l0aCBlcnJvckNvZGUgPSAyMDAyIGFuZCBzdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIgorICAgKiBlbHNlIGRvIG5vdCB0aHJvdyBhbnl0aGluZworICAgKiBAcmV0dXJuIFh0cnVjdCAtIGFuIFh0cnVjdCB3aXRoIHN0cmluZ190aGluZyA9IGFyZzEKKyAgICovCiAgIFh0cnVjdCB0ZXN0TXVsdGlFeGNlcHRpb24oMTogc3RyaW5nIGFyZzAsIDI6IHN0cmluZyBhcmcxKSB0aHJvd3MoMTogWGNlcHRpb24gZXJyMSwgMjogWGNlcHRpb24yIGVycjIpCiAKLSAgLyogVGVzdCBvbmV3YXkgdm9pZCAqLworICAvKioKKyAgICogUHJpbnQgJ3Rlc3RPbmV3YXkoJWQpOiBTbGVlcGluZy4uLicgd2l0aCBzZWNvbmRzVG9TbGVlcCBhcyAnJWQnCisgICAqIHNsZWVwICdzZWNvbmRzVG9TbGVlcCcKKyAgICogUHJpbnQgJ3Rlc3RPbmV3YXkoJWQpOiBkb25lIHNsZWVwaW5nIScgd2l0aCBzZWNvbmRzVG9TbGVlcCBhcyAnJWQnCisgICAqIEBwYXJhbSBpMzIgc2Vjb25kc1RvU2xlZXAgLSB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gc2xlZXAKKyAgICovCiAgIG9uZXdheSB2b2lkIHRlc3RPbmV3YXkoMTppMzIgc2Vjb25kc1RvU2xlZXApCiB9CiAKIHNlcnZpY2UgU2Vjb25kU2VydmljZQogewotICB2b2lkIGJsYWhCbGFoKCkKKyAgLyoqCisgICAqIFByaW50cyAndGVzdFN0cmluZygiJXMiKScgd2l0aCB0aGluZyBhcyAnJXMnCisgICAqIEBwYXJhbSBzdHJpbmcgdGhpbmcgLSB0aGUgc3RyaW5nIHRvIHByaW50CisgICAqIEByZXR1cm4gc3RyaW5nIC0gcmV0dXJucyB0aGUgc3RyaW5nICd0aGluZycKKyAgICovCisgIHN0cmluZyBzZWNvbmR0ZXN0U3RyaW5nKDE6IHN0cmluZyB0aGluZykKIH0KIAogc3RydWN0IFZlcnNpb25pbmdUZXN0VjEgewpAQCAtMTcwLDcgKzMzOSw3IEBACiAgICAgICAgMTogaTMyIGJlZ2luX2luX2JvdGgsCiAKICAgICAgICAyOiBpMzIgbmV3aW50LAotICAgICAgIDM6IGJ5dGUgbmV3Ynl0ZSwKKyAgICAgICAzOiBpOCBuZXdieXRlLAogICAgICAgIDQ6IGkxNiBuZXdzaG9ydCwKICAgICAgICA1OiBpNjQgbmV3bG9uZywKICAgICAgICA2OiBkb3VibGUgbmV3ZG91YmxlCkBAIC0yMDgsMyArMzc3LDM1IEBACiAgIDMwMDA6IFZlcnNpb25pbmdUZXN0VjIgdmVydHdvMzAwMCwKICAgNDAwMDogbGlzdDxpMzI+IGJpZ19udW1iZXJzCiB9CisKK3N0cnVjdCBOZXN0ZWRMaXN0c0kzMngyIHsKKyAgMTogbGlzdDxsaXN0PGkzMj4+IGludGVnZXJsaXN0Cit9CitzdHJ1Y3QgTmVzdGVkTGlzdHNJMzJ4MyB7CisgIDE6IGxpc3Q8bGlzdDxsaXN0PGkzMj4+PiBpbnRlZ2VybGlzdAorfQorc3RydWN0IE5lc3RlZE1peGVkeDIgeworICAxOiBsaXN0PHNldDxpMzI+PiBpbnRfc2V0X2xpc3QKKyAgMjogbWFwPGkzMixzZXQ8c3RyaW5nPj4gbWFwX2ludF9zdHJzZXQKKyAgMzogbGlzdDxtYXA8aTMyLHNldDxzdHJpbmc+Pj4gbWFwX2ludF9zdHJzZXRfbGlzdAorfQorc3RydWN0IExpc3RCb25rcyB7CisgIDE6IGxpc3Q8Qm9uaz4gYm9uaworfQorc3RydWN0IE5lc3RlZExpc3RzQm9uayB7CisgIDE6IGxpc3Q8bGlzdDxsaXN0PEJvbms+Pj4gYm9uaworfQorCitzdHJ1Y3QgQm9vbFRlc3QgeworICAxOiBvcHRpb25hbCBib29sIGIgPSB0cnVlOworICAyOiBvcHRpb25hbCBzdHJpbmcgcyA9ICJ0cnVlIjsKK30KKworc3RydWN0IFN0cnVjdEEgeworICAxOiByZXF1aXJlZCBzdHJpbmcgczsKK30KKworc3RydWN0IFN0cnVjdEIgeworICAxOiBvcHRpb25hbCBTdHJ1Y3RBIGFhOworICAyOiByZXF1aXJlZCBTdHJ1Y3RBIGFiOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9UeXBlZGVmVGVzdC50aHJpZnQgYi90ZXN0L1R5cGVkZWZUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDM3NDc4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9UeXBlZGVmVGVzdC50aHJpZnQKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworbmFtZXNwYWNlIGNwcCB0aHJpZnQudGVzdAorCit0eXBlZGVmIGkzMiBNeUludDMyCit0eXBlZGVmIHN0cmluZyBNeVN0cmluZzsKKworc3RydWN0IFR5cGVkZWZUZXN0U3RydWN0IHsKKyAgMTogTXlJbnQzMiBmaWVsZF9NeUludDMyOworICAyOiBNeVN0cmluZyBmaWVsZF9NeVN0cmluZzsKKyAgMzogaTMyIGZpZWxkX0ludDMyOworICA0OiBzdHJpbmcgZmllbGRfU3RyaW5nOworfQorCit0eXBlZGVmIFR5cGVkZWZUZXN0U3RydWN0IE15U3RydWN0LApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvVW5zYWZlVHlwZXMudGhyaWZ0IGIvdGVzdC9VbnNhZmVUeXBlcy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4YzkwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvVW5zYWZlVHlwZXMudGhyaWZ0CkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKKworc3RydWN0IFVuc2FmZUJ5dGVzIHsKKyAgMTogYmluYXJ5IGJ5dGVzOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9SRUFETUUubWQgYi90ZXN0L2F1ZGl0L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTJmOGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9SRUFETUUubWQKQEAgLTAsMCArMSw0MCBAQAorVHlwaWNhbCB1c2FnZQorPT09PT09PT09PT09PQorYGBgCit0aHJpZnQuZXhlIC0tYXVkaXQgPG9sZEZpbGU+IDxuZXdGaWxlPgorYGBgCitFeGFtcGxlIHJ1bgorPT09PT09PT09PT0KK2BgYAorPiB0aHJpZnQuZXhlIC0tYXVkaXQgdGVzdC50aHJpZnQgYnJlYWsxLnRocmlmdAorW1RocmlmdCBBdWRpdCBGYWlsdXJlOmJyZWFrMS50aHJpZnRdIE5ldyBUaHJpZnQgRmlsZSBoYXMgbWlzc2luZyBmdW5jdGlvbiBiYXNlX2Z1bmN0aW9uMworW1RocmlmdCBBdWRpdCBXYXJuaW5nOmJyZWFrMS50aHJpZnRdIENvbnN0YW50IGNvbnN0MyBoYXMgZGlmZmVyZW50IHZhbHVlCitgYGAKKworUHJvYmxlbXMgdGhhdCB0aGUgYXVkaXQgdG9vbCBjYW4gY2F0Y2gKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitFcnJvcnMKKyogUmVtb3ZpbmcgYW4gZW51bSB2YWx1ZQorKiBDaGFuZ2luZyB0aGUgdHlwZSBvZiBhIHN0cnVjdCBmaWVsZAorKiBDaGFuZ2luZyB0aGUgcmVxdWlyZWQtbmVzcyBvZiBhIHN0cnVjdCBmaWVsZAorKiBSZW1vdmluZyBhIHN0cnVjdCBmaWVsZAorKiBBZGRpbmcgYSByZXF1aXJlZCBzdHJ1Y3QgZmllbGQKKyogQWRkaW5nIGEgc3RydWN0IGZpZWxkICdpbiB0aGUgbWlkZGxlJy4gIFRoaXMgdXN1YWxseSBpbmRpY2F0ZXMgYW4gb2xkIElEIGhhcyBiZWVuIHJlY3ljbGVkCisqIFN0cnVjdCByZW1vdmVkCisqIE9uZXdheS1uZXNzIGNoYW5nZQorKiBSZXR1cm4gdHlwZSBjaGFuZ2UKKyogTWlzc2luZyBmdW5jdGlvbgorKiBNaXNzaW5nIHNlcnZpY2UKKyogQ2hhbmdlIGluIHNlcnZpY2UgaW5oZXJpdGFuY2UKKworV2FybmluZ3MKKyogUmVtb3ZpbmcgYSBsYW5ndWFnZSBuYW1lc3BhY2UgZGVjbGFyYXRpb24KKyogQ2hhbmdpbmcgYSBuYW1lc3BhY2UKKyogQ2hhbmdpbmcgYW4gZW51bSB2YWx1ZSdzIG5hbWUKKyogUmVtb3ZpbmcgYW4gZW51bSBjbGFzcworKiBEZWZhdWx0IHZhbHVlIGNoYW5nZWQKKyogU3RydWN0IGZpZWxkIG5hbWUgY2hhbmdlCisqIFJlbW92ZWQgY29uc3RhbnQKKyogVHlwZSBvZiBjb25zdGFudCBjaGFuZ2VkCisqIFZhbHVlIG9mIGNvbnN0YW50IGNoYW5nZWQKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMS50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3ZjY3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsxLnRocmlmdApAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL1RocmlmdCBNZXRob2QgcmVtb3ZlZCBmcm9tIHNlcnZpY2UgYmFzZS4KKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vY29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzPSBbMjMsIDMyXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMTAudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazEwLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDY5MGFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazEwLnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMTAgLSBTdHJ1Y3QgZmllbGQgcmVtb3ZlZCBmcm9tIHN0cnVjdDIgaWQgPTEKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMl0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazExLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsxMS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRlMGE3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsxMS50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazExIC0gU3RydWN0IGZpZWxkIHJlbW92ZWQgZnJvbSBzdHJ1Y3QzIGlkID03CisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMTIudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazEyLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTUyMmVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazEyLnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBkZXJpdmVkMV9mdW5jdGlvbjEgcmV0dXJuIHR5cGUgY2hhbmdlZCBmcm9tIGVudW0xIHRvIGVudW0yCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMiBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsxMy50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMTMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OTc1Y2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMTMudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGRlcml2ZWQxX2Z1bmN0aW9uNiByZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gc3RydWN0MSB0byBzdHJ1Y3QyCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDIgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsxNC50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMTQudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjY2Q1MDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMTQudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGRlcml2ZWQxX2Z1bmN0aW9uNiByZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gc3RyaW5nIHRvIGRvdWJsZSAKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsxNS50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMTUudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZjY5ZTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMTUudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGJyZWFrMTUgLSBkZXJpdmVkMl9mdW5jdGlvbjEgcmV0dXJuIHR5cGUgY2hhbmdlZCBmcm9tIGxpc3Q8aTMyPiB0byBsaXN0PGkxNj4KK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTE2PiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsxNi50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMTYudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkY2ZmN2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMTYudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGJyZWFrIDE2IC0gZGVyaXZlZDJfZnVuY3Rpb241IHJldHVybiB0eXBlIGNoYW5nZWQgZnJvbSBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gdG8gbWFwPHRlc3RfZW51bTMsIHRlc3RfZW51bTI+CisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMywgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsxNy50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMTcudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1M2IxNDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMTcudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWsxNyAtIGRlcml2ZWQyX2Z1bmN0aW9uNiByZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gbWFwPHN0cnVjdDEsc3RydWN0Mj4gdG8gbWFwPHN0cnVjdDEsIHN0cnVjdDM+CisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mz4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsxOC50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMTgudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NzhiNmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMTgudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWsxOC0gb25ld2F5IHJlbW92ZWQgZnJvbSBiYXNlX29uZXdheQorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsxOS50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMTkudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMGIyMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMTkudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWsxOSAtIG9uZXdheSBhZGRlZCB0byBiYXNlX2Z1bmN0aW9uMQorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICBvbmV3YXkgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazIudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazIudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNGZlMmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMi50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9TdHJ1Y3QgZmllbGQgY2hhbmdlZCBpbiB0ZXN0X3N0cnVjdDEKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkzMiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMl0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazIwLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsyMC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFlNWYwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsyMC50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gYnJlYWsgMjAgLSBmaXJzdCBlbnVtIHZhbHVlIHJlbW92ZWQgZnJvbSBlbnVtMQorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazIxLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsyMS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkYTQwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsyMS50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazIxLSBsYXN0IGVudW0gdmFsdWUgcmVtb3ZlZCBmcm9tIGVudW0yCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazIyLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsyMi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgwODM0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsyMi50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazIyIC0gaW4tYmV0d2VlbiBlbnVtIHZhbHVlIHJlbW92ZWQgZnJvbSBlbnVtMQorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazIzLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsyMy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY5NWE0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsyMy50aHJpZnQKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazIzIC0gcmVxdWlyZWQgc3RydWN0IGZpZWxkIGFkZGVkIHRvIHN0cnVjdDQKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIsCisgICAgMzogcmVxdWlyZWQgaTY0IHN0cnVjdDRfbWVtYmVyMworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMjQudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazI0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjRkNWI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazI0LnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMjQgLSByZW1vdmVkIGluaGVyaXRhbmNlIGZyb20gZGVyaXZlZDEuCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazI1LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsyNS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVmZTk3ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsyNS50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9DaGFuZ2VkIGluaGVyaXRhbmNlIG9mIGRlcml2ZWQyCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBkZXJpdmVkMSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMjYudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazI2LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTc2ZDliCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazI2LnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMjYgLSBGaWVsZCB0eXBlIGNoYW5nZWQgaW4gYmFzZV9mdW5jdGlvbjEgYXJndW1lbnQgaWQ9MworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQorCmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMjcudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazI3LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTU2NzA2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazI3LnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBicmVhazI3IC0gYXJndW1lbnQgY2hhbmdlZCBiYXNlX2Z1bmN0aW9uMiBsaXN0PGVudW0xPiB0byBsaXN0PGVudW0zPiBpZCA9OAorbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0zPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazI4LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsyOC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY0ZTU1OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsyOC50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazI4LSBkZXJpdmVkMV9mdW5jdGlvbjUgYXJndWVtZW50IHR5cGUgY2hhbmdlZCBtYXA8aTY0LCBkb3VibGU+IHRvIGxpc3Q8aTY0PgorbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMjkudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazI5LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmYzMDgxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazI5LnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMjkgLSBiYXNlX2Z1bmN0aW9uMiBhcmd1ZW1udCB0eXBlIGNoYW5nZWQgbGlzdDxzdHJpbmc+IHRvIHN0cmluZworCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMy50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVkOTk3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWszLnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMyAtIFN0cnVjdCBmaWVsZCBjaGFuZ2VkIGluIHRlc3Rfc3RydWN0MShlbnVtMSB0byBlbnVtMikKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMiBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMzAudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazMwLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MThkZDZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazMwLnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBicmVhazMwLSBkZXJpdmVkMV9mdW5jdGlvbjYgYXJndW1lbnQgY2hhbmdlZCBzdHJ1Y3QxIHRvIG1hcDxzdHJ1Y3QxLHN0cnVjdDE+CituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMzEudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazMxLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2EzODA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazMxLnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMzEgLSBFeGNlcHRpb24gcmVtb3ZlZCB0byBiYXNlX2Z1bmN0aW9uMgorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazMyLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWszMi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EzZjhhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWszMi50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazMyLSBFeGNlcHRpb24xIGZpZWxkIHR5cGUgY2hhbmdlZCBmb3IgaWQgPTEKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGk2NCBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazMzLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWszMy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkYmI4MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWszMy50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazMzIC0gZGVyaXZlZDFfZnVuY3Rpb24xIGV4Y2VwdGlvbiB0eXBlIGNoYW5nZWQuCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24xIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWszNC50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMzQudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOTNlNjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMzQudGhyaWZ0CkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWszNCAtIEZpZWxkIGFkZGVkIHRvIHN0cnVjdCB3aXRoIEZpZWxkIElEIGJlaW5nIGluIGJldHdlZW4gdHdvIGV4aXN0aW5nIGZpZWxkIElEcworCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDY6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBzdHJ1Y3QzX21lbWJlcjYsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWs0LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWs0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTI4ZWMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazQudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vRmllbGQgdHlwZSBjaGFuZ2VkIGluIHRlc3Rfc3RydWN0MShib29sIHRvIHN0cmluZykKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPVsyMywgMzJdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWs1LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWs1LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGMyMmQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazUudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIG1lbWJlciBmaWVsZCB0eXBlIGNoYW5nZWQgaW4gdGVzdF9zdHJ1Y3QxKGJvb2wgdG8gbGlzdDxib29sPikKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWs2LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWs2LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjdhMzAwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazYudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZpZWxkIHR5cGUgY2hhbmdlZCBpbiB0ZXN0X3N0cnVjdDIgKGxpc3Q8ZG91YmxlPiB0byBsaXN0PGkxNj4pCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWs3LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWs3LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzFjMmRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazcudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWs3IC0gcmVxdWlyZWRuZXNzIHJlbW92ZWQgaW4gc3RydWN0NgorCituYW1lc3BhY2UgY3BwIHRlc3QKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazgudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazgudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhY2FjMDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrOC50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazggLSByZXF1aXJlZG5lc3MgYWRkZWRkIGluIHN0cnVjdDUKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazkudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazkudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYjMxOWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrOS50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazkgLSBTdHJ1Y3QgZmllbGQgcmVtb3ZlZCBmcm9tIHN0cnVjdDEKKworCituYW1lc3BhY2UgY3BwIHRlc3QKKy8vQ29uc3RhbnRzCisKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC90ZXN0LnRocmlmdCBiL3Rlc3QvYXVkaXQvdGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4MzRiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvdGVzdC50aHJpZnQKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC90aHJpZnRfYXVkaXRfdGVzdC5wbCBiL3Rlc3QvYXVkaXQvdGhyaWZ0X2F1ZGl0X3Rlc3QucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllZDRkYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvdGhyaWZ0X2F1ZGl0X3Rlc3QucGwKQEAgLTAsMCArMSwyNjEgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworCisjYnJlYWsxIC0gVGhyaWZ0IG1ldGhvZCByZW1vdmVkIGZyb20gc2VydmljZSBiYXNlCisjYnJlYWsyIC0gU3RydWN0IGZpZWxkIGNoYW5nZWQgaW4gdGVzdF9zdHJ1Y3QxKGkxNiB0byBpMzIpCisjYnJlYWszIC0gU3RydWN0IGZpZWxkIGNoYW5nZWQgaW4gdGVzdF9zdHJ1Y3QxKGVudW0xIHRvIGVudW0yKQorI2JyZWFrNCAtIEZpZWxkIHR5cGUgY2hhbmdlZCBpbiB0ZXN0X3N0cnVjdDEoYm9vbCB0byBzdHJpbmcpCisjYnJlYWs1LSBtZW1iZXIgZmllbGQgdHlwZSBjaGFuZ2VkIGluIHRlc3Rfc3RydWN0MShib29sIHRvIGxpc3Q8Ym9vbD4pCisjYnJlYWs2LSAgRmllbGQgdHlwZSBjaGFuZ2VkIGluIHRlc3Rfc3RydWN0MiAobGlzdDxkb3VibGU+IHRvIGxpc3Q8aTE2PikKKyNicmVhazcgLSByZXF1aXJlZG5lc3MgcmVtb3ZlZCBpbiBzdHJ1Y3Q2CisjYnJlYWs4IC0gcmVxdWlyZWRuZXNzIGFkZGVkZCBpbiBzdHJ1Y3Q1CisjYnJlYWs5IC0gU3RydWN0IGZpZWxkIHJlbW92ZWQgZnJvbSBzdHJ1Y3QxCisjYnJlYWsxMCAtIFN0cnVjdCBmaWVsZCByZW1vdmVkIGZyb20gc3RydWN0MiBpZCA9IDEKKyNicmVhazExIC0gU3RydWN0IGZpZWxkIHJlbW92ZWQgZnJvbSBzdHJ1Y3QzIGxhc3QgaWQKKyNicmVhazEyIC0gIGRlcml2ZWQxX2Z1bmN0aW9uMSByZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gZW51bTEgdG8gZW51bTIKKyNicmVhazEzIC0gZGVyaXZlZDFfZnVuY3Rpb242IHJldHVybiB0eXBlIGNoYW5nZWQgZnJvbSBzdHJ1Y3QxIHRvIHN0cnVjdDIKKyNicmVhazE0IC0gIGRlcml2ZWQxX2Z1bmN0aW9uNCByZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gc3RyaW5nIHRvIGRvdWJsZSAKKyNicmVhazE1IC0gZGVyaXZlZDJfZnVuY3Rpb24xIHJldHVybiB0eXBlIGNoYW5nZWQgZnJvbSBsaXN0PGkzMj4gdG8gbGlzdDxpMTY+CisjYnJlYWsxNiAtIGRlcml2ZWQyX2Z1bmN0aW9uNSByZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gbWFwPHRlc3RfZW51bTEsdGVzdF9lbnVtMj4gdG8gbWFwPHRlc3RfZW51bTMsIHRlc3RfZW51bTI+CisjYnJlYWsxNyAtIGRlcml2ZWQyX2Z1bmN0aW9uNiByZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gbWFwPHN0cnVjdDEsc3RydWN0Mj4gdG8gbWFwPHN0cnVjdDEsIHN0cnVjdDM+CisjYnJlYWsxOC0gb25ld2F5IHJlbW92ZWQgZnJvbSBiYXNlX29uZXdheQorI2JyZWFrMTkgLSBvbmV3YXkgYWRkZWQgdG8gYmFzZV9mdW5jdGlvbjEKKyNicmVhazIwIC0gZmlyc3QgZW51bSB2YWx1ZSByZW1vdmVkIGZyb20gZW51bTEKKyNicmVhazIxLSBsYXN0IGVudW0gdmFsdWUgcmVtb3ZlZCBmcm9tIGVudW0yCisjYnJlYWsyMiAtIGluLWJldHdlZW4gZW51bSB2YWx1ZSByZW1vdmVkIGZyb20gZW51bTEKKyNicmVhazIzIC0gcmVxdWlyZWQgc3RydWN0IGZpZWxkIGFkZGVkIHRvIHN0cnVjdDQKKyNicmVhazI0IC0gcmVtb3ZlZCBpbmhlcml0YW5jZSBvZiBkZXJpdmVkMS4KKyNicmVhazI1IC0gY2hhbmdlZCBpbmhlcml0YW5jZSBvZiBkZXJpdmVkMi4KKyNicmVhazI2IC0gRmllbGQgdHlwZSBjaGFuZ2VkIGluIGJhc2VfZnVuY3Rpb24xIGFyZ3VtZW50IGlkPTMKKyNicmVhazI3IC0gYXJndW1lbnQgY2hhbmdlZCBiYXNlX2Z1bmN0aW9uMiBsaXN0PGVudW0xPiB0byBsaXN0PGVudW0zPiBpZCA9OAorI2JyZWFrMjgtIGRlcml2ZWQxX2Z1bmN0aW9uNSBhcmd1ZW1lbnQgdHlwZSBjaGFuZ2VkIG1hcDxpNjQsIGRvdWJsZT4gdG8gbGlzdDxpNjQ+CisjYnJlYWsyOSAtIGJhc2VfZnVuY3Rpb24yIGFyZ3VlbW50IHR5cGUgY2hhbmdlZCBsaXN0PHN0cmluZz4gdG8gc3RyaW5nCisjYnJlYWszMC0gZGVyaXZlZDFfZnVuY3Rpb242IGFyZ3VtZW50IGNoYW5nZWQgc3RydWN0MSB0byBtYXA8c3RydWN0MSxzdHJ1Y3QxPgorI2JyZWFrMzEgLSBFeGNlcHRpb24gcmVtb3ZlZCB0byBiYXNlX2Z1bmN0aW9uMgorI2JyZWFrMzItIEV4Y2VwdGlvbjEgZmllbGQgdHlwZSBjaGFuZ2VkIGZvciBpZCA9MQorI2JyZWFrMzMgLSBkZXJpdmVkMV9mdW5jdGlvbjEgZXhjZXB0aW9uIHR5cGUgY2hhbmdlZC4KKyNicmVhazM0IC0gRmllbGQgYWRkZWQgdG8gc3RydWN0IHdpdGggRmllbGQgSUQgYmVpbmcgaW4gYmV0d2VlbiB0d28gZXhpc3RpbmcgZmllbGQgSURzCisKKyN3YXJuaW5nLnRocmlmdAorI0NoYW5naW5nIGRlZmF1bHRzCisjSWQ9MSBzdHJ1Y3Q1CisjaWQ9MiBzdHJ1Y3Q1IAorI2lkPTQgc3RydWN0MihsaXN0PGRvdWJsZT4pCisjaWQ9MyBzdHJ1Y3QyKGxpc3Q8aTY0PiAgZGVmYXVsdCB2YWx1ZXMgcmVtb3ZlZCkKKyNpZCA0IHN0cnVjdDEgY2hhbmdlIGluIGRvdWJsZSB2YWx1ZQorI2lkIDUgc3RydWN0MSAoZGVmYXVsdCBzdHJpbmcgdmFsdWUgcmVtb3ZlZCkKKyNpZD0xIHN0cnVjdDMgKGNoYW5nZSBpbiBtYXAgdmFsdWVzKQorI2lkMiBzdHJ1Y3QzIChjaGFuZ2UgaW4gbWFwIGtleXMpCisKKyNjaGFuZ2UgaW4gaW5oZXJpdGFuY2UgZm9yIGRlcml2ZWQxIGFuZCBkZXJpdmVkMgorCisjY2hhbmdlIGluIHN0cnVjdCBmaWVsZCBuYW1lcworI2lkOSBzdHJ1Y3QxCisjaWQyIHN0cnVjdDIKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBHZXRvcHQ6OlN0ZDsKKworIyBnbG9iYWxzCitteSAkZ0FyZ3VtZW50cyA9ICIiOyAgICAgICAgICAgICAgICAjIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIEF1ZGl0VG9vbAorbXkgJGdBdWRpdFRvb2xQYXRoID0gIiI7CitteSAkZ1ByZXZpb3VzVGhyaWZ0UGF0aDsgICAgICAgICAgICAjIHByZXZpb3VzIHRocmlmdCBwYXRoCitteSAkZ0N1cnJlbnRUaHJpZnRQYXRoOyAgICAgICAgICAgICAjIGN1cnJlbnQgdGhyaWZ0IHBhdGgKK215ICRnVGhyaWZ0RmlsZUZvbGRlcjsKK215ICRnQnJlYWtpbmdGaWxlc0NvdW50ID0zNDsgCisKK215ICRnVmVyYm9zZSA9IDA7CisjZnVuY3Rpb25zCitzdWIgYXVkaXRCcmVha2luZ0NoYW5nZXM7CitzdWIgYXVkaXROb25CcmVha2luZ0NoYW5nZXM7CisKK21haW4oKTsKKworc3ViIG1haW4KK3sKKyAgICBwYXJzZU9wdGlvbnMoKTsKKyAgICBhdWRpdEJyZWFraW5nQ2hhbmdlcygpOworICAgIGF1ZGl0Tm9uQnJlYWtpbmdDaGFuZ2VzKCk7Cit9CisKK3N1YiBwYXJzZU9wdGlvbnMKK3sKKyAgICBteSAlb3B0aW9ucyA9ICgpOworICAgIGlmICggZ2V0b3B0cyAoJ3ZmOm86dDonLFwlb3B0aW9ucykgKQorICAgIHsKKyAgICAgICAgIyBjdXJyZW50IChuZXcpIHRocmlmdCBmb2xkZXIKKyAgICAgICAgaWYgKCRvcHRpb25zeydmJ30pCisgICAgICAgIHsKKyAgICAgICAgICAgICRnVGhyaWZ0RmlsZUZvbGRlciA9ICRvcHRpb25zeydmJ307CisgICAgICAgICAgICAkZ1ByZXZpb3VzVGhyaWZ0UGF0aCA9ICRnVGhyaWZ0RmlsZUZvbGRlci4iL3Rlc3QudGhyaWZ0IjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpZSAiTWlzc2luZyBGb2xkZXIgY29udGFpbmluZyB0aHJpZnQgZmlsZXNcbiI7CisgICAgICAgIH0KKworICAgICAgICBpZigkb3B0aW9uc3sndCd9KQorICAgICAgICB7CisgICAgICAgICAgICAkZ0F1ZGl0VG9vbFBhdGggPSAkb3B0aW9uc3sndCd9OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGllICJBdWRpdCBUb29sIFBhdGggcmVxdWlyZWQgXG4iOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCRvcHRpb25zeyd2J30pCisgICAgICAgIHsKKyAgICAgICAgICAgICRnVmVyYm9zZSA9IDE7CisgICAgICAgIH0KKworICAgIH0KK30KKworc3ViIGF1ZGl0QnJlYWtpbmdDaGFuZ2VzCit7CisgICAgbXkgJGJyZWFraW5nRmlsZUJhc2VOYW1lID0gJGdUaHJpZnRGaWxlRm9sZGVyLiIvYnJlYWsiOworICAgIG15ICRuZXdUaHJpZnRGaWxlOworICAgIGZvcihteSAkaT0xOyAkaSA8PSAkZ0JyZWFraW5nRmlsZXNDb3VudDsgJGkrKykKKyAgICB7CisgICAgICAgICRuZXdUaHJpZnRGaWxlID0gJGJyZWFraW5nRmlsZUJhc2VOYW1lLiIkaS50aHJpZnQiOworICAgICAgICBteSAkYXJndW1lbnRzID0gICRnUHJldmlvdXNUaHJpZnRQYXRoLiIgIi4kbmV3VGhyaWZ0RmlsZTsKKyAgICAgICAgbXkgKCRleGl0Q29kZSwgJG91dHB1dCkgPSBjYWxsVGhyaWZ0QXVkaXRUb29sKCRhcmd1bWVudHMpOworICAgICAgICBwcmludCAkb3V0cHV0IGlmICRnVmVyYm9zZSBlcSAxOworCisgICAgICAgIGlmKCRleGl0Q29kZSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICAjIHRocmlmdF9hdWRpdCByZXR1cm5zIDEgd2hlbiBpdCBpcyBub3QgYWJsZSB0byBmaW5kIGZpbGVzIG9yIG90aGVyIG5vbi1hdWRpdCBmYWlsdXJlcworICAgICAgICAgICAgcHJpbnQgImV4aXRpbmcgd2l0aCBleGl0IGNvZGUgPTEgaSA9ICIuJGkuIlxuIjsKKyAgICAgICAgICAgIHByaW50ICRvdXRwdXQ7CisgICAgICAgICAgICBleGl0ICRleGl0Q29kZTsKKyAgICAgICAgfQorICAgICAgICBpZigkZXhpdENvZGUgIT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgIyB0aHJpZnQtYXVkaXQgcmV0dXJuIDIgZm9yIGF1ZGl0IGZhaWx1cmVzLiBTbyBmb3IgQnJlYWtpbmcgY2hhbmdlcyB3ZSBzaG91bGQgZ2V0IDIgYXMgcmV0dXJuIHZhbHVlLgorICAgICAgICAgICAgcHJpbnQgJG91dHB1dDsKKyAgICAgICAgICAgIGRpZSAiXG5URVNUIEZBSUxVUkU6IEJyZWFraW5nIENoYW5nZSBub3QgZGV0ZWN0ZWQgZm9yIHRocmlmdCBmaWxlICRuZXdUaHJpZnRGaWxlLCBjb2RlPSRleGl0Q29kZSBcbiI7CisgICAgICAgIH0KKyAgICAgICAgaWYoaW5kZXgoJG91dHB1dCxnZXRNZXNzYWdlU3ViU3RyaW5nKCJicmVhayRpIikpID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgICAjQXVkaXQgdG9vbCBkZXRlY3RlZCBmYWlsdXJlLCBidXQgbm90IHRoZSBleHBlY3RlZCBvbmUuIFRoZSBjaGFuZ2UgaW4gYnJlYWtpbmcgdGhyaWZ0IGZpbGUgZG9lcyBub3QgbWF0Y2ggZ2V0TWVzc2FnZVN1YlN0cmluZygpCisgICAgICAgICAgICBwcmludCAkb3V0cHV0OworICAgICAgICAgICAgZGllICJcblRlc3QgRkFJTFVSRTogQXVkaXQgdG9vbCBkZXRlY3RlZCBmYWlsdXJlLCBidXQgbm90IHRoZSBleHBlY3RlZCBvbmUhXG4iOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgI1RocmlmdCBhdWRpdCB0b29sIGhhcyBkZXRlY3RlZCBhdWRpdCBmYWlsdXJlIGFuZCBoYXMgcmV0dXJuZWQgZXhpdGVkIHRvIHN0YXR1cyBjb2RlIDIKKyAgICAgICAgICAgIHByaW50ICJUZXN0IFBhc3M6IEF1ZGl0IEZhaWx1cmUgZGV0ZWN0ZWQgZm9yIHRocmlmdCBmaWxlIGJyZWFrJGkudGhyaWZ0IFxuIjsKKyAgICAgICAgfQorICAgIH0KKworfQorCitzdWIgYXVkaXROb25CcmVha2luZ0NoYW5nZXMKK3sKKyAgICBteSAkYnJlYWtpbmdGaWxlQmFzZU5hbWUgPSAkZ1RocmlmdEZpbGVGb2xkZXIuIi93YXJuaW5nIjsKKyAgICBteSAkbmV3VGhyaWZ0RmlsZTsKKyAgICAkbmV3VGhyaWZ0RmlsZSA9ICRicmVha2luZ0ZpbGVCYXNlTmFtZS4iLnRocmlmdCI7CisgICAgbXkgJGFyZ3VtZW50cyA9ICAkZ1ByZXZpb3VzVGhyaWZ0UGF0aC4iICIuJG5ld1RocmlmdEZpbGU7CisgICAgbXkgKCRleGl0Q29kZSwgJG91dHB1dCkgPSBjYWxsVGhyaWZ0QXVkaXRUb29sKCRhcmd1bWVudHMpOworICAgIHByaW50ICRvdXRwdXQgaWYgJGdWZXJib3NlIGVxIDE7CisKKyAgICBpZigkZXhpdENvZGUgPT0gMSkKKyAgICB7CisgICAgICAgICMgdGhyaWZ0X2F1ZGl0IHJldHVybnMgMSB3aGVuIGl0IGlzIG5vdCBhYmxlIHRvIGZpbmQgZmlsZXMgb3Igb3RoZXIgbm9uLWF1ZGl0IGZhaWx1cmVzCisgICAgICAgIHByaW50ICJleGl0aW5nIHdpdGggZXhpdCBjb2RlID0gMSAgZm9yIGZpbGUgd2FybmluZy50aHJpZnRcbiI7CisgICAgICAgIGV4aXQgJGV4aXRDb2RlOworICAgIH0KKyAgICBlbHNpZigkZXhpdENvZGUgIT0gMCkKKyAgICB7CisgICAgICAgICMgdGhyaWZ0LWF1ZGl0IHJldHVybiAwIGlmIHRoZXJlIGFyZSBubyBhdWRpdCBmYWlsdXJlcy4KKyAgICAgICAgZGllICJcblRFU1QgRkFJTFVSRTogTm9uIEJyZWFraW5nIGNoYW5nZXMgcmV0dXJuZWQgZmFpbHVyZSBmb3IgdGhyaWZ0IGZpbGUgJG5ld1RocmlmdEZpbGUgXG4iOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAjVGhyaWZ0IGF1ZGl0IHRvb2wgaGFzIGV4aXRlZCB3aXRoIHN0YXR1cyAwLiAKKyAgICAgICAgcHJpbnQgIlRlc3QgUGFzczogQXVkaXQgdG9vbCBleGl0cyB3aXRoIHN1Y2Nlc3MgZm9yIHdhcm5pbmdzIFxuIjsKKyAgICB9CisKKworfQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNhbGwgdGhyaWZ0QXVkaXRUb29sIHNjcmlwdAorc3ViIGNhbGxUaHJpZnRBdWRpdFRvb2wgKCAkICkKK3sKKyAgICBteSAkYXJncyA9IHNoaWZ0OworCisgICAgbXkgJGNvbW1hbmQgPSAiJGdBdWRpdFRvb2xQYXRoIC0tYXVkaXQgJGFyZ3MiOworICAgIG15ICRvdXRwdXQgPSBgJGNvbW1hbmQgMj4mMWA7CisgICAgbXkgJGV4aXRDb2RlID0gJD8gPj4gODsKKworICAgIHJldHVybiAoJGV4aXRDb2RlLCRvdXRwdXQpOworfQorCitzdWIgZ2V0TWVzc2FnZVN1YlN0cmluZyggJCApCit7CisgICAgbXkgJGZpbGVOYW1lID0gc2hpZnQ7CisgICAgbXkgJWxvb2t1cFRhYmxlID0gKAorICAgICAgICAiYnJlYWsxIiAgPT4gImJhc2VfZnVuY3Rpb24zIiwKKyAgICAgICAgImJyZWFrMiIgID0+ICJ0ZXN0X3N0cnVjdDEiLAorICAgICAgICAiYnJlYWszIiAgPT4gInRlc3Rfc3RydWN0MSIsCisgICAgICAgICJicmVhazQiICA9PiAidGVzdF9zdHJ1Y3QxIiwKKyAgICAgICAgImJyZWFrNSIgID0+ICJ0ZXN0X3N0cnVjdDEiLAorICAgICAgICAiYnJlYWs2IiAgPT4gInRlc3Rfc3RydWN0MiIsCisgICAgICAgICJicmVhazciICA9PiAidGVzdF9zdHJ1Y3Q2IiwKKyAgICAgICAgImJyZWFrOCIgID0+ICJ0ZXN0X3N0cnVjdDUiLAorICAgICAgICAiYnJlYWs5IiAgPT4gInRlc3Rfc3RydWN0MSIsCisgICAgICAgICJicmVhazEwIiA9PiAidGVzdF9zdHJ1Y3QyIiwKKyAgICAgICAgImJyZWFrMTEiID0+ICJ0ZXN0X3N0cnVjdDMiLAorICAgICAgICAiYnJlYWsxMiIgPT4gImRlcml2ZWQxX2Z1bmN0aW9uMSIsCisgICAgICAgICJicmVhazEzIiA9PiAiZGVyaXZlZDFfZnVuY3Rpb242IiwKKyAgICAgICAgImJyZWFrMTQiID0+ICJkZXJpdmVkMV9mdW5jdGlvbjQiLAorICAgICAgICAiYnJlYWsxNSIgPT4gImRlcml2ZWQyX2Z1bmN0aW9uMSIsCisgICAgICAgICJicmVhazE2IiA9PiAiZGVyaXZlZDJfZnVuY3Rpb241IiwKKyAgICAgICAgImJyZWFrMTciID0+ICJkZXJpdmVkMl9mdW5jdGlvbjYiLAorICAgICAgICAiYnJlYWsxOCIgPT4gImJhc2Vfb25ld2F5IiwKKyAgICAgICAgImJyZWFrMTkiID0+ICJiYXNlX2Z1bmN0aW9uMSIsCisgICAgICAgICJicmVhazIwIiA9PiAidGVzdF9lbnVtMSIsCisgICAgICAgICJicmVhazIxIiA9PiAidGVzdF9lbnVtMiIsCisgICAgICAgICJicmVhazIyIiA9PiAidGVzdF9lbnVtMSIsCisgICAgICAgICJicmVhazIzIiA9PiAidGVzdF9zdHJ1Y3Q0IiwKKyAgICAgICAgImJyZWFrMjQiID0+ICJkZXJpdmVkMSIsCisgICAgICAgICJicmVhazI1IiA9PiAiZGVyaXZlZDIiLAorICAgICAgICAiYnJlYWsyNiIgPT4gImJhc2VfZnVuY3Rpb24xIiwKKyAgICAgICAgImJyZWFrMjciID0+ICJiYXNlX2Z1bmN0aW9uMl9hcmdzIiwKKyAgICAgICAgImJyZWFrMjgiID0+ICJkZXJpdmVkMV9mdW5jdGlvbjVfYXJncyIsCisgICAgICAgICJicmVhazI5IiA9PiAiYmFzZV9mdW5jdGlvbjJfYXJncyIsCisgICAgICAgICJicmVhazMwIiA9PiAiZGVyaXZlZDFfZnVuY3Rpb242IiwKKyAgICAgICAgImJyZWFrMzEiID0+ICJiYXNlX2Z1bmN0aW9uMl9leGNlcHRpb24iLAorICAgICAgICAiYnJlYWszMiIgPT4gInRlc3RfZXhjZXB0aW9uMSIsCisgICAgICAgICJicmVhazMzIiA9PiAiZGVyaXZlZDFfZnVuY3Rpb24xX2V4Y2VwdGlvbiIsCisgICAgICAgICJicmVhazM0IiA9PiAidGVzdF9zdHJ1Y3QzIiwKKyAgICApOworICAgIGlmIChub3QgZXhpc3RzICRsb29rdXBUYWJsZXsgJGZpbGVOYW1lIH0pCisgICAgeworICAgICAgICBwcmludCAiaW4gdGhlIG51bGwgY2FzZVxuIjsKKyAgICAgICAgcmV0dXJuICJOVUxMIjsKKyAgICB9CisgICAgCisgICAgbXkgJHJldHZhbCA9ICRsb29rdXBUYWJsZXsgJGZpbGVOYW1lIH07CisgICAgcHJpbnQgIiRmaWxlTmFtZSA9PiAkcmV0dmFsXG4iOworICAgIHJldHVybiAkbG9va3VwVGFibGV7ICRmaWxlTmFtZSB9OworfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC93YXJuaW5nLnRocmlmdCBiL3Rlc3QvYXVkaXQvd2FybmluZy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM5MmQ1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvd2FybmluZy50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKKworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4yOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJjbGFzcyIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi40LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIGNoYW5nZWQxOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBjaGFuZ2VkMjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMywKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0ID1bMS4wLCAyLjFdLAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjEwLCAyOjIwfSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxOjEuMSwgMjoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEgPSAxLjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzcyIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2V7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvY19nbGliL01ha2VmaWxlLmFtIGIvdGVzdC9jX2dsaWIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGEwM2QyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY19nbGliL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNzQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzIHNlcmlhbC10ZXN0cworCitub2luc3RfTFRMSUJSQVJJRVMgPSBsaWJ0ZXN0Y2dsaWIubGEKK25vZGlzdF9saWJ0ZXN0Y2dsaWJfbGFfU09VUkNFUyA9IFwKKwlnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5jIFwKKwlnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oIFwKKwlnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5jIFwKKwlnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oIFwKKwlnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5jIFwKKwlnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oCisKK2xpYnRlc3RjZ2xpYl9sYV9MSUJBREQgPSAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9saWJ0aHJpZnRfY19nbGliLmxhCisKK3ByZWNyb3NzOiBsaWJ0ZXN0Y2dsaWIubGEgdGVzdF9jbGllbnQgdGVzdF9zZXJ2ZXIKKworY2hlY2tfUFJPR1JBTVMgPSBcCisJdGVzdF9jbGllbnQgXAorCXRlc3Rfc2VydmVyCisKK3Rlc3RfY2xpZW50X1NPVVJDRVMgPSBcCisJc3JjL3Rlc3RfY2xpZW50LmMKKwordGVzdF9jbGllbnRfTERBREQgPSBcCisJbGlidGVzdGNnbGliLmxhIFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9saWJ0aHJpZnRfY19nbGliLmxhCisKK3Rlc3Rfc2VydmVyX1NPVVJDRVMgPSBcCisJc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuYyBcCisJc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuaCBcCisJc3JjL3RocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmMgXAorCXNyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5oIFwKKwlzcmMvdGVzdF9zZXJ2ZXIuYworCit0ZXN0X3NlcnZlcl9MREFERCA9IFwKKwlsaWJ0ZXN0Y2dsaWIubGEgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL2xpYnRocmlmdF9jX2dsaWIubGEKKworIworIyBDb21tb24gdGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBydWxlcworIworZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuYyAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuaCAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuYyAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuaCAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuYyAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0ICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtLWdlbiBjX2dsaWIgLXIgJDwKKworQU1fQ0ZMQUdTID0gLWcgLVdhbGwgLVdleHRyYSAkKEdMSUJfQ0ZMQUdTKSAkKEdPQkpFQ1RfQ0ZMQUdTKQorQU1fQ1hYRkxBR1MgPSAkKEFNX0NGTEFHUykKK0FNX0NQUEZMQUdTID0gLUkkKHRvcF9zcmNkaXIpL2xpYi9jX2dsaWIvc3JjIC1JZ2VuLWNfZ2xpYgorQU1fTERGTEFHUyA9ICQoR0xJQl9MSUJTKSAkKEdPQkpFQ1RfTElCUykgQEdDT1ZfTERGTEFHU0AKKworY2xlYW4tbG9jYWw6CisJJChSTSkgZ2VuLWNfZ2xpYi8qCisKK0VYVFJBX0RJU1QgPSBcCisJc3JjL3Rlc3RfY2xpZW50LmMgXAorCXNyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmMgXAorCXNyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmggXAorCXNyYy90ZXN0X3NlcnZlci5jCmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGVzdF9jbGllbnQuYyBiL3Rlc3QvY19nbGliL3NyYy90ZXN0X2NsaWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMjRhYjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NfZ2xpYi9zcmMvdGVzdF9jbGllbnQuYwpAQCAtMCwwICsxLDE4MDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorCisjaW5jbHVkZSAiLi4vZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuaCIKKyNpbmNsdWRlICIuLi9nZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oIgorCisvKiBIYW5kbGUgU0lHUElQRSBzaWduYWxzIChpbmRpY2F0aW5nIHRoZSBzZXJ2ZXIgaGFzIGNsb3NlZCB0aGUKKyAgIGNvbm5lY3Rpb24gcHJlbWF0dXJlbHkpIGJ5IG91dHB1dHRpbmcgYW4gZXJyb3IgbWVzc2FnZSBiZWZvcmUKKyAgIGV4aXRpbmcuICovCitzdGF0aWMgdm9pZAorc2lncGlwZV9oYW5kbGVyIChpbnQgc2lnbmFsX251bWJlcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHNpZ25hbF9udW1iZXIpOworCisgIC8qIEZsdXNoIHN0YW5kYXJkIG91dHB1dCB0byBtYWtlIHN1cmUgdGhlIHRlc3QgcmVzdWx0cyBzbyBmYXIgYXJlCisgICAgIGxvZ2dlZCAqLworICBmZmx1c2ggKHN0ZG91dCk7CisKKyAgZnB1dHMgKCJCcm9rZW4gcGlwZSAoc2VydmVyIGNsb3NlZCBjb25uZWN0aW9uIHByZW1hdHVyZWx5KVxuIiwgc3RkZXJyKTsKKyAgZmZsdXNoIChzdGRlcnIpOworCisgIC8qIFJlLXJhaXNlIHRoZSBzaWduYWwsIHRoaXMgdGltZSBpbnZva2luZyB0aGUgZGVmYXVsdCBzaWduYWwKKyAgICAgaGFuZGxlciwgdG8gdGVybWluYXRlIHRoZSBwcm9ncmFtICovCisgIHJhaXNlIChTSUdQSVBFKTsKK30KKworLyogQ29tcGFyZSB0d28gZ2ludDMyIHZhbHVlcy4gVXNlZCBmb3Igc29ydGluZyBhbmQgZmluZGluZyBpbnRlZ2VyCisgICB2YWx1ZXMgd2l0aGluIGEgR0xpc3QuICovCitzdGF0aWMgZ2ludAorZ2ludDMyX2NvbXBhcmUgKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKQoreworICBnaW50MzIgaW50MzJfYSA9ICooZ2ludDMyICopYTsKKyAgZ2ludDMyIGludDMyX2IgPSAqKGdpbnQzMiAqKWI7CisgIGludCByZXN1bHQgPSAwOworCisgIGlmIChpbnQzMl9hIDwgaW50MzJfYikKKyAgICByZXN1bHQgPSAtMTsKKyAgZWxzZSBpZiAoaW50MzJfYSA+IGludDMyX2IpCisgICAgcmVzdWx0ID0gMTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEl0IGdldHMgYSBtdWx0aXBsZXhlZCBwcm90b2NvbCB3aGljaCB1c2VzIGEgY29uY3JldGUgcHJvdG9jb2wgdW5kZXJuZWF0aAorICogQHBhcmFtICBwcm90b2NvbF9uYW1lICB0aGUgZnVsbHkgcXVhbGlmaWVkIHByb3RvY29sIHBhdGggKGUuZy4gImJpbmFyeTptdWx0aSIpCisgKiBAcGFyYW0gIHRyYW5zcG9ydCAgICAgIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICogQHBhcmFtICBzZXJ2aWNlX25hbWUgICB0aGUgc2luZ2xlIHN1cHBvcnRlZCBzZXJ2aWNlIG5hbWUKKyAqIEB0b2RvICAgICAgICAgICAgICAgICAgbmVlZCB0byBhbGxvdyBtdWx0aXBsZSBzZXJ2aWNlcyB0byBmdWxseSB0ZXN0IG11bHRpcGxleGVkCisgKiBAcmV0dXJuICAgICAgICAgICAgICAgIGEgbXVsdGlwbGV4ZWQgcHJvdG9jb2wgd3JhcHBpbmcgdGhlIGNvcnJlY3QgdW5kZXJseWluZyBwcm90b2NvbAorICovCitUaHJpZnRQcm90b2NvbCAqCitnZXRfbXVsdGlwbGV4ZWRfcHJvdG9jb2woZ2NoYXIgKnByb3RvY29sX25hbWUsIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBnY2hhciAqc2VydmljZV9uYW1lKQoreworICBUaHJpZnRQcm90b2NvbCAqIG11bHRpcGxleGVkX3Byb3RvY29sID0gTlVMTDsKKworICBpZiAoIHN0cm5jbXAocHJvdG9jb2xfbmFtZSwgImJpbmFyeToiLCA3KSA9PSAwKSB7CisgICAgbXVsdGlwbGV4ZWRfcHJvdG9jb2wgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgTlVMTCk7CisgIH0gZWxzZSBpZiAoIHN0cm5jbXAocHJvdG9jb2xfbmFtZSwgImNvbXBhY3Q6IiwgOCkgPT0gMCkgeworICAgIG11bHRpcGxleGVkX3Byb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLAorICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gbXVsdGlwbGV4IHByb3RvY29sIG5hbWU6ICVzXG4iLCBwcm90b2NvbF9uYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MLAorICAgICAgICAgICJ0cmFuc3BvcnQiLCAgICAgIHRyYW5zcG9ydCwKKyAgICAgICAgICAicHJvdG9jb2wiLCAgICAgICBtdWx0aXBsZXhlZF9wcm90b2NvbCwKKyAgICAgICAgICAic2VydmljZS1uYW1lIiwgICBzZXJ2aWNlX25hbWUsCisgICAgICAgICAgTlVMTCk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBzdGF0aWMgZ2NoYXIgKiAgaG9zdCA9IE5VTEw7CisgIHN0YXRpYyBnaW50ICAgICBwb3J0ID0gOTA5MDsKKyAgc3RhdGljIGdib29sZWFuIHNzbCAgPSBGQUxTRTsKKyAgc3RhdGljIGdjaGFyICogIHRyYW5zcG9ydF9vcHRpb24gPSBOVUxMOworICBzdGF0aWMgZ2NoYXIgKiAgcHJvdG9jb2xfb3B0aW9uID0gTlVMTDsKKyAgc3RhdGljIGdpbnQgICAgIG51bV90ZXN0cyA9IDE7CisKKyAgc3RhdGljCisgICAgR09wdGlvbkVudHJ5IG9wdGlvbl9lbnRyaWVzW10gPXsKKyAgICB7ICJob3N0IiwgICAgICAgICAgICAnaCcsIDAsIEdfT1BUSU9OX0FSR19TVFJJTkcsICAgJmhvc3QsCisgICAgICAiSG9zdCB0byBjb25uZWN0ICg9bG9jYWxob3N0KSIsIE5VTEwgfSwKKyAgICB7ICJwb3J0IiwgICAgICAgICAgICAncCcsIDAsIEdfT1BUSU9OX0FSR19JTlQsICAgICAgJnBvcnQsCisgICAgICAiUG9ydCBudW1iZXIgdG8gY29ubmVjdCAoPTkwOTApIiwgTlVMTCB9LAorICAgIHsgInNzbCIsICAgICAgICAgICAgICdzJywgMCwgR19PUFRJT05fQVJHX05PTkUsICAgICAmc3NsLAorICAgICAgIkVuYWJsZSBTU0wiLCBOVUxMIH0sCisgICAgeyAidHJhbnNwb3J0IiwgICAgICAgJ3QnLCAwLCBHX09QVElPTl9BUkdfU1RSSU5HLCAgICZ0cmFuc3BvcnRfb3B0aW9uLAorICAgICAgIlRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCAoPWJ1ZmZlcmVkKSIsIE5VTEwgfSwKKyAgICB7ICJwcm90b2NvbCIsICAgICAgICAncicsIDAsIEdfT1BUSU9OX0FSR19TVFJJTkcsICAgJnByb3RvY29sX29wdGlvbiwKKyAgICAgICJQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBtdWx0aSwgbXVsdGljICg9YmluYXJ5KSIsIE5VTEwgfSwKKyAgICB7ICJ0ZXN0bG9vcHMiLCAgICAgICAnbicsIDAsIEdfT1BUSU9OX0FSR19JTlQsICAgICAgJm51bV90ZXN0cywKKyAgICAgICJOdW1iZXIgb2YgdGVzdHMgKD0xKSIsIE5VTEwgfSwKKyAgICB7IE5VTEwgfQorICB9OworCisgIHN0cnVjdCBzaWdhY3Rpb24gc2lncGlwZV9hY3Rpb247CisKKyAgR1R5cGUgIHNvY2tldF90eXBlICAgID0gVEhSSUZUX1RZUEVfU09DS0VUOworICBnY2hhciAqc29ja2V0X25hbWUgICAgPSAiaXAiOworICBHVHlwZSAgdHJhbnNwb3J0X3R5cGUgPSBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQ7CisgIGdjaGFyICp0cmFuc3BvcnRfbmFtZSA9ICJidWZmZXJlZCI7CisgIEdUeXBlICBwcm90b2NvbF90eXBlICA9IFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTDsKKyAgZ2NoYXIgKnByb3RvY29sX25hbWUgID0gImJpbmFyeSI7CisKKyAgVGhyaWZ0U29ja2V0ICAgICpzb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICAqcHJvdG9jb2wgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAgKnByb3RvY29sMiA9IE5VTEw7ICAgICAgICAgICAgLy8gZm9yIG11bHRpcGxleGVkIHRlc3RzCisKKyAgVFRlc3RUaHJpZnRUZXN0SWYgKnRlc3RfY2xpZW50ID0gTlVMTDsKKyAgVFRlc3RTZWNvbmRTZXJ2aWNlSWYgKnNlY29uZF9zZXJ2aWNlID0gTlVMTDsgIC8vIGZvciBtdWx0aXBsZXhlZCB0ZXN0cworCisgIHN0cnVjdCB0aW1ldmFsIHRpbWVfc3RhcnQsIHRpbWVfc3RvcCwgdGltZV9lbGFwc2VkOworICBndWludDY0IHRpbWVfZWxhcHNlZF91c2VjLCB0aW1lX3RvdGFsX3VzZWMgPSAwOworICBndWludDY0IHRpbWVfbWluX3VzZWMgPSBHX01BWFVJTlQ2NCwgdGltZV9tYXhfdXNlYyA9IDAsIHRpbWVfYXZnX3VzZWM7CisKKyAgR09wdGlvbkNvbnRleHQgKm9wdGlvbl9jb250ZXh0OworICBnYm9vbGVhbiBvcHRpb25zX3ZhbGlkID0gVFJVRTsKKyAgaW50IHRlc3RfbnVtID0gMDsKKyAgaW50IGZhaWxfY291bnQgPSAwOworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0ICgpOworI2VuZGlmCisKKyAgLyogQ29uZmlndXJlIGFuZCBwYXJzZSBvdXIgY29tbWFuZC1saW5lIG9wdGlvbnMgKi8KKyAgb3B0aW9uX2NvbnRleHQgPSBnX29wdGlvbl9jb250ZXh0X25ldyAoTlVMTCk7CisgIGdfb3B0aW9uX2NvbnRleHRfYWRkX21haW5fZW50cmllcyAob3B0aW9uX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uX2VudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGlmICghZ19vcHRpb25fY29udGV4dF9wYXJzZSAob3B0aW9uX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyZ2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgIGZwcmludGYgKHN0ZGVyciwgIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgcmV0dXJuIDI1NTsKKyAgfQorICBnX29wdGlvbl9jb250ZXh0X2ZyZWUgKG9wdGlvbl9jb250ZXh0KTsKKworICAvKiBTZXQgcmVtYWluaW5nIGRlZmF1bHQgdmFsdWVzIGZvciB1bnNwZWNpZmllZCBvcHRpb25zICovCisgIGlmIChob3N0ID09IE5VTEwpCisgICAgaG9zdCA9IGdfc3RyZHVwICgibG9jYWxob3N0Iik7CisKKyAgLyogVmFsaWRhdGUgdGhlIHBhcnNlZCBvcHRpb25zICovCisgIGlmIChwcm90b2NvbF9vcHRpb24gIT0gTlVMTCkgeworICAgIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJjb21wYWN0IiwgOCkgPT0gMCkgeworICAgICAgcHJvdG9jb2xfdHlwZSA9IFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0w7CisgICAgICBwcm90b2NvbF9uYW1lID0gImNvbXBhY3QiOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJtdWx0aSIsIDYpID09IDApIHsKKyAgICAgIHByb3RvY29sX3R5cGUgPSBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTDsKKyAgICAgIHByb3RvY29sX25hbWUgPSAiYmluYXJ5Om11bHRpIjsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RybmNtcCAocHJvdG9jb2xfb3B0aW9uLCAibXVsdGljIiwgNykgPT0gMCkgeworICAgICAgcHJvdG9jb2xfdHlwZSA9IFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MOworICAgICAgcHJvdG9jb2xfbmFtZSA9ICJjb21wYWN0Om11bHRpYyI7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgImJpbmFyeSIsIDcpID09IDApIHsKKyAgICAgIHByaW50ZigiV2UgYXJlIGdvaW5nIHdpdGggZGVmYXVsdCBwcm90b2NvbFxuIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVW5rbm93biBwcm90b2NvbCB0eXBlICVzXG4iLCBwcm90b2NvbF9vcHRpb24pOworICAgICAgb3B0aW9uc192YWxpZCA9IEZBTFNFOworICAgIH0KKyAgfQorCisgIGlmICh0cmFuc3BvcnRfb3B0aW9uICE9IE5VTEwpIHsKKyAgICBpZiAoc3RybmNtcCAodHJhbnNwb3J0X29wdGlvbiwgImZyYW1lZCIsIDcpID09IDApIHsKKyAgICAgIHRyYW5zcG9ydF90eXBlID0gVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVDsKKyAgICAgIHRyYW5zcG9ydF9uYW1lID0gImZyYW1lZCI7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jbXAgKHRyYW5zcG9ydF9vcHRpb24sICJidWZmZXJlZCIsIDkpICE9IDApIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVua25vd24gdHJhbnNwb3J0IHR5cGUgJXNcbiIsIHRyYW5zcG9ydF9vcHRpb24pOworICAgICAgb3B0aW9uc192YWxpZCA9IEZBTFNFOworICAgIH0KKyAgfQorCisgIGlmIChzc2wpIHsKKyAgICBzb2NrZXRfdHlwZSA9IFRIUklGVF9UWVBFX1NTTF9TT0NLRVQ7CisgICAgc29ja2V0X25hbWUgPSAiaXAtc3NsIjsKKyAgICBwcmludGYoIlR5cGUgbmFtZSAlc1xuIiwgZ190eXBlX25hbWUgKHNvY2tldF90eXBlKSk7CisgIH0KKworICBpZiAoIW9wdGlvbnNfdmFsaWQpCisgICAgcmV0dXJuIDI1NDsKKworICBwcmludGYgKCJDb25uZWN0aW5nICglcy8lcykgdG86ICVzLyVzOiVkXG4iLAorICAgICAgICAgIHRyYW5zcG9ydF9uYW1lLAorICAgICAgICAgIHByb3RvY29sX25hbWUsCisgICAgICAgICAgc29ja2V0X25hbWUsCisgICAgICAgICAgaG9zdCwKKyAgICAgICAgICBwb3J0KTsKKworICAvKiBJbnN0YWxsIG91ciBTSUdQSVBFIGhhbmRsZXIsIHdoaWNoIG91dHB1dHMgYW4gZXJyb3IgbWVzc2FnZSB0bworICAgICBzdGFuZGFyZCBlcnJvciBiZWZvcmUgZXhpdGluZyBzbyB0ZXN0ZXJzIGNhbiBrbm93IHdoYXQKKyAgICAgaGFwcGVuZWQgKi8KKyAgbWVtc2V0ICgmc2lncGlwZV9hY3Rpb24sIDAsIHNpemVvZiAoc2lncGlwZV9hY3Rpb24pKTsKKyAgc2lncGlwZV9hY3Rpb24uc2FfaGFuZGxlciA9IHNpZ3BpcGVfaGFuZGxlcjsKKyAgc2lncGlwZV9hY3Rpb24uc2FfZmxhZ3MgPSBTQV9SRVNFVEhBTkQ7CisgIHNpZ2FjdGlvbiAoU0lHUElQRSwgJnNpZ3BpcGVfYWN0aW9uLCBOVUxMKTsKKworICBpZiAoc3NsKSB7CisgICAgdGhyaWZ0X3NzbF9zb2NrZXRfaW5pdGlhbGl6ZV9vcGVuc3NsKCk7CisgIH0KKworICAvKiBFc3RhYmxpc2ggYWxsIG91ciBjb25uZWN0aW9uIG9iamVjdHMgKi8KKyAgc29ja2V0ID0gZ19vYmplY3RfbmV3IChzb2NrZXRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUiLCBob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgICAgIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgaWYgKHNzbCAmJiAhdGhyaWZ0X3NzbF9sb2FkX2NlcnRfZnJvbV9maWxlKFRIUklGVF9TU0xfU09DS0VUKHNvY2tldCksICIuLi9rZXlzL0NBLnBlbSIpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gbG9hZCB2YWxpZGF0aW9uIGNlcnRpZmljYXRlIC4uL2tleXMvQ0EucGVtIC0gZGlkIHlvdSBydW4gaW4gdGhlIHRlc3QvY19nbGliIGRpcmVjdG9yeT9cbiIpOworICAgIGdfY2xlYXJfb2JqZWN0ICgmc29ja2V0KTsKKyAgICByZXR1cm4gMjUzOworICB9CisKKyAgdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3ICh0cmFuc3BvcnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0Iiwgc29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGlmKHByb3RvY29sX3R5cGU9PVRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MKSB7CisgICAgLy8gVE9ETzogQSBtdWx0aXBsZXhlZCB0ZXN0IHNob3VsZCBhbHNvIHRlc3QgIlNlY29uZCIgKHNlZSBKYXZhIFRlc3RTZXJ2ZXIpCisgICAgLy8gVGhlIGNvbnRleHQgY29tZXMgZnJvbSB0aGUgbmFtZSBvZiB0aGUgdGhyaWZ0IGZpbGUuIElmIG11bHRpcGxlIHRocmlmdAorICAgIC8vIHNjaGVtYXMgYXJlIHVzZWQgd2UgaGF2ZSB0byByZWRvIHRoZSB3YXkgdGhpcyBpcyBkb25lLgorICAgIHByb3RvY29sID0gZ2V0X211bHRpcGxleGVkX3Byb3RvY29sKHByb3RvY29sX25hbWUsIHRyYW5zcG9ydCwgIlRocmlmdFRlc3QiKTsKKyAgICBpZiAoTlVMTCA9PSBwcm90b2NvbCkgeworICAgICAgZ19jbGVhcl9vYmplY3QgKCZ0cmFuc3BvcnQpOworICAgICAgZ19jbGVhcl9vYmplY3QgKCZzb2NrZXQpOworICAgICAgcmV0dXJuIDI1MjsKKyAgICB9CisKKyAgICAvLyBNYWtlIGEgc2Vjb25kIHByb3RvY29sIGFuZCBjbGllbnQgcnVubmluZyBvbiB0aGUgc2FtZSBtdWx0aXBsZXhlZCB0cmFuc3BvcnQKKyAgICBwcm90b2NvbDIgPSBnZXRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wocHJvdG9jb2xfbmFtZSwgdHJhbnNwb3J0LCAiU2Vjb25kU2VydmljZSIpOworICAgIHNlY29uZF9zZXJ2aWNlID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9TRUNPTkRfU0VSVklDRV9DTElFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dF9wcm90b2NvbCIsICBwcm90b2NvbDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXRfcHJvdG9jb2wiLCBwcm90b2NvbDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIH1lbHNleworICAgIHByb3RvY29sID0gZ19vYmplY3RfbmV3IChwcm90b2NvbF90eXBlLAorICAgICAgICAgICAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LAorICAgICAgICAgICBOVUxMKTsKKyAgfQorCisgIHRlc3RfY2xpZW50ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9USFJJRlRfVEVTVF9DTElFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXRfcHJvdG9jb2wiLCAgcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0X3Byb3RvY29sIiwgcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiBFeGVjdXRlIHRoZSBhY3R1YWwgdGVzdHMgKi8KKyAgZm9yICh0ZXN0X251bSA9IDA7IHRlc3RfbnVtIDwgbnVtX3Rlc3RzOyArK3Rlc3RfbnVtKSB7CisgICAgaWYgKHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpKSB7CisgICAgICBnY2hhciAgICpzdHJpbmcgID0gTlVMTDsKKyAgICAgIGdib29sZWFuIGJvb2xlYW4gPSAwOworICAgICAgZ2ludDggICAgYnl0ZSAgICA9IDA7CisgICAgICBnaW50MzIgICBpbnQzMiAgID0gMDsKKyAgICAgIGdpbnQ2NCAgIGludDY0ICAgPSAwOworICAgICAgZ2RvdWJsZSAgZHViICAgICA9IDA7CisKKyAgICAgIGdpbnQgYnl0ZV90aGluZywgaTMyX3RoaW5nLCBpbm5lcl9ieXRlX3RoaW5nLCBpbm5lcl9pMzJfdGhpbmc7CisgICAgICBnaW50NjQgaTY0X3RoaW5nLCBpbm5lcl9pNjRfdGhpbmc7CisKKyAgICAgIFRUZXN0WHRydWN0ICAqeHRydWN0X291dCwgICp4dHJ1Y3Rfb3V0MiwgKnh0cnVjdF9pbiwgICppbm5lcl94dHJ1Y3RfaW47CisgICAgICBUVGVzdFh0cnVjdDIgKnh0cnVjdDJfb3V0LCAqeHRydWN0Ml9pbjsKKworICAgICAgR0hhc2hUYWJsZSAqbWFwX291dCwgKm1hcF9pbiwgKmlubmVyX21hcF9pbjsKKyAgICAgIEdIYXNoVGFibGUgKnNldF9vdXQsICpzZXRfaW47CisgICAgICBncG9pbnRlciBrZXksIHZhbHVlOworICAgICAgZ2ludDMyICppMzJfa2V5X3B0ciwgKmkzMl92YWx1ZV9wdHI7CisgICAgICBHSGFzaFRhYmxlSXRlciBoYXNoX3RhYmxlX2l0ZXIsIGlubmVyX2hhc2hfdGFibGVfaXRlcjsKKyAgICAgIEdMaXN0ICprZXlzX291dCwgKmtleXNfaW4sICprZXlzX2VsZW07CisKKyAgICAgIEdBcnJheSAqbGlzdF9vdXQsICpsaXN0X2luOworCisgICAgICBUVGVzdE51bWJlcnogbnVtYmVyejsKKyAgICAgIFRUZXN0TnVtYmVyeiBudW1iZXJ6MjsKKworICAgICAgVFRlc3RVc2VySWQgdXNlcl9pZCwgKnVzZXJfaWRfcHRyLCAqdXNlcl9pZF9wdHIyOworCisgICAgICBUVGVzdEluc2FuaXR5ICppbnNhbml0eV9vdXQsICppbnNhbml0eV9pbjsKKyAgICAgIEdIYXNoVGFibGUgKnVzZXJfbWFwOworICAgICAgR0hhc2hUYWJsZUl0ZXIgdXNlcl9tYXBfaXRlcjsKKyAgICAgIEdQdHJBcnJheSAqeHRydWN0czsKKworICAgICAgVFRlc3RYY2VwdGlvbiAgKnhjZXB0aW9uICA9IE5VTEw7CisgICAgICBUVGVzdFhjZXB0aW9uMiAqeGNlcHRpb24yID0gTlVMTDsKKworICAgICAgZ2Jvb2xlYW4gb25ld2F5X3Jlc3VsdDsKKyAgICAgIHN0cnVjdCB0aW1ldmFsIG9uZXdheV9zdGFydCwgb25ld2F5X2VuZCwgb25ld2F5X2VsYXBzZWQ7CisgICAgICBnaW50IG9uZXdheV9lbGFwc2VkX3VzZWM7CisKKyAgICAgIGdib29sZWFuIGZpcnN0OworICAgICAgZ2ludDMyIGksIGo7CisKKyAgICAgIHByaW50ZiAoIlRlc3QgIyVkLCBjb25uZWN0ICVzOiVkXG4iLCB0ZXN0X251bSArIDEsIGhvc3QsIHBvcnQpOworICAgICAgZ2V0dGltZW9mZGF5ICgmdGltZV9zdGFydCwgTlVMTCk7CisKKyAgICAgIC8qIFRoZXNlIHRlc3Qgcm91dGluZXMgaGF2ZSBiZWVuIHBvcnRlZCBmcm9tIHRoZSBDKysgdGVzdAorICAgICAgICAgY2xpZW50LCBjYXJlIGJlaW5nIHRha2VuIHRvIGVuc3VyZSB0aGVpciBvdXRwdXQgcmVtYWlucyBhcworICAgICAgICAgY2xvc2UgYXMgcG9zc2libGUgdG8gdGhlIG9yaWdpbmFsIHRvIGZhY2lsaXRhdGUgZGlmZnMuCisKKyAgICAgICAgIEZvciBzaW1wbGljaXR5IGNvbW1lbnRzIGhhdmUgYmVlbiBvbWl0dGVkLCBidXQgZXZlcnkgcm91dGluZQorICAgICAgICAgaGFzIHRoZSBzYW1lIGJhc2ljIHN0cnVjdHVyZToKKworICAgICAgICAgLSBDcmVhdGUgYW5kIHBvcHVsYXRlIGRhdGEgc3RydWN0dXJlcyBhcyBuZWNlc3NhcnkuCisKKyAgICAgICAgIC0gRm9ybWF0IGFuZCBvdXRwdXQgKHRvIHRoZSBjb25zb2xlKSBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorICAgICAgICAgICBvdXRnb2luZyBkYXRhLgorCisgICAgICAgICAtIElzc3VlIHRoZSByZW1vdGUgbWV0aG9kIGNhbGwgdG8gdGhlIHNlcnZlci4KKworICAgICAgICAgLSBGb3JtYXQgYW5kIG91dHB1dCBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXR1cm5lZCBkYXRhLgorCisgICAgICAgICAtIFZlcmlmeSB0aGUgcmV0dXJuZWQgZGF0YSBtYXRjaGVzIHdoYXQgd2FzIGV4cGVjdGVkLgorCisgICAgICAgICAtIERlYWxsb2NhdGUgYW55IGNyZWF0ZWQgZGF0YSBzdHJ1Y3R1cmVzLgorCisgICAgICAgICBOb3RlIHRoZSByZWNvZ25pemVkIHZhbHVlcyBhbmQgZXhwZWN0ZWQgYmVoYXZpb3VyIG9mIGVhY2gKKyAgICAgICAgIHJlbW90ZSBtZXRob2QgYXJlIGRlc2NyaWJlZCBpbiBUaHJpZnRUZXN0LnRocmlmdCwgd2hpY2gKKyAgICAgICAgIHlvdSdsbCBmaW5kIGluIHRoZSB0b3AtbGV2ZWwgInRlc3QiIGZvbGRlci4gKi8KKworICAgICAgLyoqCisgICAgICAgKiBWT0lEIFRFU1QKKyAgICAgICAqLworICAgICAgcHJpbnRmICgidGVzdFZvaWQoKSIpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X3ZvaWQgKHRlc3RfY2xpZW50LCAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZiAoIiA9IHZvaWRcbiIpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlmKGVycm9yIT1OVUxMKXsKKyAgICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICAgIGVycm9yID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogU1RSSU5HIFRFU1QKKyAgICAgICAqLworICAgICAgcHJpbnRmICgidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9zdHJpbmcgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmICgiID0gXCIlc1wiXG4iLCBzdHJpbmcpOworICAgICAgICBpZiAoc3RybmNtcCAoc3RyaW5nLCAiVGVzdCIsIDUpICE9IDApCisgICAgICAgICAgZmFpbF9jb3VudCsrOworCisgICAgICAgIGdfZnJlZSAoc3RyaW5nKTsKKyAgICAgICAgc3RyaW5nID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBNdWx0aXBsZXhlZCBUZXN0IC0gZG8gdGhpcyByaWdodCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBub3JtYWwgVGVzdCBDbGllbnQgcnVuCisgICAgICAgKi8KKyAgICAgIGlmIChzZWNvbmRfc2VydmljZSkgeworICAgICAgICBwcmludGYgKCJ0ZXN0U2Vjb25kU2VydmljZU11bHRpcGxleFNlY29uZFRlc3RTdHJpbmcoXCIybmRcIikiKTsKKyAgICAgICAgaWYgKHRfdGVzdF9zZWNvbmRfc2VydmljZV9pZl9zZWNvbmR0ZXN0X3N0cmluZyAoc2Vjb25kX3NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIybmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgICAgcHJpbnRmICgiID0gXCIlc1wiXG4iLCBzdHJpbmcpOworICAgICAgICAgIGlmIChzdHJjbXAgKHN0cmluZywgInRlc3RTdHJpbmcoXCIybmRcIikiKSAhPSAwKSB7CisgICAgICAgICAgICArK2ZhaWxfY291bnQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgZ19mcmVlIChzdHJpbmcpOworICAgICAgICAgIHN0cmluZyA9IE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgICArK2ZhaWxfY291bnQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBCT09MIFRFU1QKKyAgICAgICAqLworICAgICAgcHJpbnRmICgidGVzdEJ5dGUodHJ1ZSkiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9ib29sICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm9vbGVhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmICgiID0gJXNcbiIsIGJvb2xlYW4gPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgaWYgKGJvb2xlYW4gIT0gMSkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBwcmludGYgKCJ0ZXN0Qnl0ZShmYWxzZSkiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9ib29sICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm9vbGVhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmICgiID0gJXNcbiIsIGJvb2xlYW4gPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgaWYgKGJvb2xlYW4gIT0gMCkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQllURSBURVNUCisgICAgICAgKi8KKyAgICAgIHByaW50ZiAoInRlc3RCeXRlKDEpIik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfYnl0ZSAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZiAoIiA9ICVkXG4iLCBieXRlKTsKKyAgICAgICAgaWYgKGJ5dGUgIT0gMSkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBwcmludGYgKCJ0ZXN0Qnl0ZSgtMSkiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9ieXRlICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZiAoIiA9ICVkXG4iLCBieXRlKTsKKyAgICAgICAgaWYgKGJ5dGUgIT0gLTEpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEkzMiBURVNUCisgICAgICAgKi8KKyAgICAgIHByaW50ZiAoInRlc3RJMzIoLTEpIik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfaTMyICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYgKCIgPSAlZFxuIiwgaW50MzIpOworICAgICAgICBpZiAoaW50MzIgIT0gLTEpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEk2NCBURVNUCisgICAgICAgKi8KKyAgICAgIHByaW50ZiAoInRlc3RJNjQoLTM0MzU5NzM4MzY4KSIpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2k2NCAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50NjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDY0KS0zNDM1OTczODM2OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmICgiID0gJSIgUFJJZDY0ICJcbiIsIGludDY0KTsKKyAgICAgICAgaWYgKGludDY0ICE9IChnaW50NjQpLTM0MzU5NzM4MzY4KQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBET1VCTEUgVEVTVAorICAgICAgICovCisgICAgICBwcmludGYoInRlc3REb3VibGUoLTUuMjA5ODUyMykiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9kb3VibGUgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC01LjIwOTg1MjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZiAoIiA9ICVmXG4iLCBkdWIpOworICAgICAgICBpZiAoKGR1YiAtICgtNS4yMDk4NTIzKSkgPiAwLjAwMSkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQklOQVJZIFRFU1QKKyAgICAgICAqLworICAgICAgcHJpbnRmICgidGVzdEJpbmFyeShlbXB0eSkiKTsKKyAgICAgIEdCeXRlQXJyYXkgKmVtcHR5QXJyYXkgPSBnX2J5dGVfYXJyYXlfbmV3KCk7CisgICAgICBHQnl0ZUFycmF5ICpyZXN1bHQgPSBOVUxMOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2JpbmFyeSAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgR0J5dGVzICpyZXNwb25zZSA9IGdfYnl0ZV9hcnJheV9mcmVlX3RvX2J5dGVzKHJlc3VsdCk7ICAvLyBmcmVlcyByZXN1bHQKKyAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgZ3NpemUgc2l6ID0gZ19ieXRlc19nZXRfc2l6ZShyZXNwb25zZSk7CisgICAgICAgIGlmIChzaXogPT0gMCkgeworICAgICAgICAgIHByaW50ZigiID0gZW1wdHlcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByaW50ZigiID0gbm90IGVtcHR5ICglbGQgYnl0ZXMpXG4iLCAobG9uZylzaXopOworICAgICAgICAgICsrZmFpbF9jb3VudDsKKyAgICAgICAgfQorICAgICAgICBnX2J5dGVzX3VucmVmKHJlc3BvbnNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZ19ieXRlX2FycmF5X3VucmVmKGVtcHR5QXJyYXkpOworICAgICAgZW1wdHlBcnJheSA9IE5VTEw7CisKKyAgICAgIC8vIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkgd2l0aCBkYXRhCisgICAgICBwcmludGYgKCJ0ZXN0QmluYXJ5KFstMTI4Li4xMjddKSA9IHsiKTsKKyAgICAgIGNvbnN0IHNpZ25lZCBjaGFyIGJpbl9kYXRhWzI1Nl0KKyAgICAgICAgPSB7LTEyOCwgLTEyNywgLTEyNiwgLTEyNSwgLTEyNCwgLTEyMywgLTEyMiwgLTEyMSwgLTEyMCwgLTExOSwgLTExOCwgLTExNywgLTExNiwgLTExNSwgLTExNCwKKyAgICAgICAgICAgLTExMywgLTExMiwgLTExMSwgLTExMCwgLTEwOSwgLTEwOCwgLTEwNywgLTEwNiwgLTEwNSwgLTEwNCwgLTEwMywgLTEwMiwgLTEwMSwgLTEwMCwgLTk5LAorICAgICAgICAgICAtOTgsICAtOTcsICAtOTYsICAtOTUsICAtOTQsICAtOTMsICAtOTIsICAtOTEsICAtOTAsICAtODksICAtODgsICAtODcsICAtODYsICAtODUsICAtODQsCisgICAgICAgICAgIC04MywgIC04MiwgIC04MSwgIC04MCwgIC03OSwgIC03OCwgIC03NywgIC03NiwgIC03NSwgIC03NCwgIC03MywgIC03MiwgIC03MSwgIC03MCwgIC02OSwKKyAgICAgICAgICAgLTY4LCAgLTY3LCAgLTY2LCAgLTY1LCAgLTY0LCAgLTYzLCAgLTYyLCAgLTYxLCAgLTYwLCAgLTU5LCAgLTU4LCAgLTU3LCAgLTU2LCAgLTU1LCAgLTU0LAorICAgICAgICAgICAtNTMsICAtNTIsICAtNTEsICAtNTAsICAtNDksICAtNDgsICAtNDcsICAtNDYsICAtNDUsICAtNDQsICAtNDMsICAtNDIsICAtNDEsICAtNDAsICAtMzksCisgICAgICAgICAgIC0zOCwgIC0zNywgIC0zNiwgIC0zNSwgIC0zNCwgIC0zMywgIC0zMiwgIC0zMSwgIC0zMCwgIC0yOSwgIC0yOCwgIC0yNywgIC0yNiwgIC0yNSwgIC0yNCwKKyAgICAgICAgICAgLTIzLCAgLTIyLCAgLTIxLCAgLTIwLCAgLTE5LCAgLTE4LCAgLTE3LCAgLTE2LCAgLTE1LCAgLTE0LCAgLTEzLCAgLTEyLCAgLTExLCAgLTEwLCAgLTksCisgICAgICAgICAgIC04LCAgIC03LCAgIC02LCAgIC01LCAgIC00LCAgIC0zLCAgIC0yLCAgIC0xLCAgIDAsICAgIDEsICAgIDIsICAgIDMsICAgIDQsICAgIDUsICAgIDYsCisgICAgICAgICAgIDcsICAgIDgsICAgIDksICAgIDEwLCAgIDExLCAgIDEyLCAgIDEzLCAgIDE0LCAgIDE1LCAgIDE2LCAgIDE3LCAgIDE4LCAgIDE5LCAgIDIwLCAgIDIxLAorICAgICAgICAgICAyMiwgICAyMywgICAyNCwgICAyNSwgICAyNiwgICAyNywgICAyOCwgICAyOSwgICAzMCwgICAzMSwgICAzMiwgICAzMywgICAzNCwgICAzNSwgICAzNiwKKyAgICAgICAgICAgMzcsICAgMzgsICAgMzksICAgNDAsICAgNDEsICAgNDIsICAgNDMsICAgNDQsICAgNDUsICAgNDYsICAgNDcsICAgNDgsICAgNDksICAgNTAsICAgNTEsCisgICAgICAgICAgIDUyLCAgIDUzLCAgIDU0LCAgIDU1LCAgIDU2LCAgIDU3LCAgIDU4LCAgIDU5LCAgIDYwLCAgIDYxLCAgIDYyLCAgIDYzLCAgIDY0LCAgIDY1LCAgIDY2LAorICAgICAgICAgICA2NywgICA2OCwgICA2OSwgICA3MCwgICA3MSwgICA3MiwgICA3MywgICA3NCwgICA3NSwgICA3NiwgICA3NywgICA3OCwgICA3OSwgICA4MCwgICA4MSwKKyAgICAgICAgICAgODIsICAgODMsICAgODQsICAgODUsICAgODYsICAgODcsICAgODgsICAgODksICAgOTAsICAgOTEsICAgOTIsICAgOTMsICAgOTQsICAgOTUsICAgOTYsCisgICAgICAgICAgIDk3LCAgIDk4LCAgIDk5LCAgIDEwMCwgIDEwMSwgIDEwMiwgIDEwMywgIDEwNCwgIDEwNSwgIDEwNiwgIDEwNywgIDEwOCwgIDEwOSwgIDExMCwgIDExMSwKKyAgICAgICAgICAgMTEyLCAgMTEzLCAgMTE0LCAgMTE1LCAgMTE2LCAgMTE3LCAgMTE4LCAgMTE5LCAgMTIwLCAgMTIxLCAgMTIyLCAgMTIzLCAgMTI0LCAgMTI1LCAgMTI2LAorICAgICAgICAgICAxMjd9OworICAgICAgR0J5dGVBcnJheSAqZnVsbEFycmF5ID0gZ19ieXRlX2FycmF5X25ldygpOworICAgICAgZ19ieXRlX2FycmF5X2FwcGVuZChmdWxsQXJyYXksIChndWludDggKikoJmJpbl9kYXRhWzBdKSwgMjU2KTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9iaW5hcnkgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgR0J5dGVzICpyZXNwb25zZSA9IGdfYnl0ZV9hcnJheV9mcmVlX3RvX2J5dGVzKHJlc3VsdCk7ICAvLyBmcmVlcyByZXN1bHQKKyAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgZ3NpemUgc2l6ID0gZ19ieXRlc19nZXRfc2l6ZShyZXNwb25zZSk7CisgICAgICAgIGdjb25zdHBvaW50ZXIgcHRyID0gZ19ieXRlc19nZXRfZGF0YShyZXNwb25zZSwgJnNpeik7CisgICAgICAgIGlmIChzaXogPT0gMjU2KSB7CisgICAgICAgICAgZ2Jvb2xlYW4gZmlyc3QgPSAxOworICAgICAgICAgIGdib29sZWFuIGZhaWxlZCA9IDA7CisgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgICAgICAgIGlmICghZmlyc3QpCisgICAgICAgICAgICAgIHByaW50ZigiLCIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBmaXJzdCA9IDA7CisgICAgICAgICAgICBpbnQgdmFsID0gKChzaWduZWQgY2hhciAqKXB0cilbaV07CisgICAgICAgICAgICBwcmludGYoIiVkIiwgdmFsKTsKKyAgICAgICAgICAgIGlmICghZmFpbGVkICYmIHZhbCAhPSBpIC0gMTI4KSB7CisgICAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHByaW50ZigifSAiKTsKKyAgICAgICAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgICAgICBwcmludGYoIkZBSUwgKGJhZCBjb250ZW50KSBzaXplICVsZCBPS1xuIiwgKGxvbmcpc2l6KTsKKyAgICAgICAgICAgICsrZmFpbF9jb3VudDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCJPSyBzaXplICVsZCBPS1xuIiwgKGxvbmcpc2l6KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJpbnRmKCIgPSBiYWQgc2l6ZSAlbGRcbiIsIChsb25nKXNpeik7CisgICAgICAgICAgKytmYWlsX2NvdW50OworICAgICAgICB9CisgICAgICAgIGdfYnl0ZXNfdW5yZWYocmVzcG9uc2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBnX2J5dGVfYXJyYXlfdW5yZWYoZnVsbEFycmF5KTsKKyAgICAgIGZ1bGxBcnJheSA9IE5VTEw7CisKKyAgICAgIC8qKgorICAgICAgICogU1RSVUNUIFRFU1QKKyAgICAgICAqLworICAgICAgcHJpbnRmICgidGVzdFN0cnVjdCh7XCJaZXJvXCIsIDEsIC0zLCAtNX0pIik7CisgICAgICB4dHJ1Y3Rfb3V0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgIlplcm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICAgICAgLTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgICAtNUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICB4dHJ1Y3RfaW4gPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwgTlVMTCk7CisKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9zdHJ1Y3QgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnh0cnVjdF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh0cnVjdF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIGdfb2JqZWN0X2dldCAoeHRydWN0X2luLAorICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCAmc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICAmYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgJmkzMl90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgJmk2NF90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICBwcmludGYgKCIgPSB7XCIlc1wiLCAlZCwgJWQsICUiIFBSSWQ2NCAifVxuIiwKKyAgICAgICAgICAgICAgICBzdHJpbmcsCisgICAgICAgICAgICAgICAgYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICBpMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgaTY0X3RoaW5nKTsKKyAgICAgICAgaWYgKChzdHJpbmcgPT0gTlVMTCB8fCBzdHJuY21wIChzdHJpbmcsICJaZXJvIiwgNSkgIT0gMCkgfHwKKyAgICAgICAgICAgIGJ5dGVfdGhpbmcgIT0gMSB8fAorICAgICAgICAgICAgaTMyX3RoaW5nICE9IC0zIHx8CisgICAgICAgICAgICBpNjRfdGhpbmcgIT0gKGdpbnQ2NCktNSkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisKKyAgICAgICAgaWYgKHN0cmluZykgeworICAgICAgICAgIGdfZnJlZSAoc3RyaW5nKTsKKyAgICAgICAgICBzdHJpbmcgPSBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICAvLyBnX2NsZWFyX29iamVjdCgmeHRydWN0X291dCk7IHVzZWQgYmVsb3cKKyAgICAgIGdfY2xlYXJfb2JqZWN0KCZ4dHJ1Y3RfaW4pOworCisgICAgICAvKioKKyAgICAgICAqIE5FU1RFRCBTVFJVQ1QgVEVTVAorICAgICAgICovCisgICAgICBwcmludGYgKCJ0ZXN0TmVzdCh7MSwge1wiWmVyb1wiLCAxLCAtMywgLTV9KSwgNX0iKTsKKyAgICAgIHh0cnVjdDJfb3V0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJ1Y3RfdGhpbmciLCB4dHJ1Y3Rfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICAgICAgICAgICA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgeHRydWN0Ml9pbiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNUMiwgTlVMTCk7CisKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9uZXN0ICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeHRydWN0Ml9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dHJ1Y3QyX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIGdfb2JqZWN0X2dldCAoeHRydWN0Ml9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgJmJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgInN0cnVjdF90aGluZyIsICZ4dHJ1Y3RfaW4sCisgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgICZpMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIGdfb2JqZWN0X2dldCAoeHRydWN0X2luLAorICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCAmc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICAmaW5uZXJfYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgJmlubmVyX2kzMl90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgJmlubmVyX2k2NF90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICBwcmludGYgKCIgPSB7JWQsIHtcIiVzXCIsICVkLCAlZCwgJSIgUFJJZDY0ICJ9LCAlZH1cbiIsCisgICAgICAgICAgICAgICAgYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICBzdHJpbmcsCisgICAgICAgICAgICAgICAgaW5uZXJfYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICBpbm5lcl9pMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgaW5uZXJfaTY0X3RoaW5nLAorICAgICAgICAgICAgICAgIGkzMl90aGluZyk7CisgICAgICAgIGlmIChieXRlX3RoaW5nICE9IDEgfHwKKyAgICAgICAgICAgIChzdHJpbmcgPT0gTlVMTCB8fCBzdHJuY21wIChzdHJpbmcsICJaZXJvIiwgNSkgIT0gMCkgfHwKKyAgICAgICAgICAgIGlubmVyX2J5dGVfdGhpbmcgIT0gMSB8fAorICAgICAgICAgICAgaW5uZXJfaTMyX3RoaW5nICE9IC0zIHx8CisgICAgICAgICAgICBpbm5lcl9pNjRfdGhpbmcgIT0gKGdpbnQ2NCktNSB8fAorICAgICAgICAgICAgaTMyX3RoaW5nICE9IDUpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworCisgICAgICAgIGlmIChzdHJpbmcpIHsKKyAgICAgICAgICBnX2ZyZWUoc3RyaW5nKTsKKyAgICAgICAgICBzdHJpbmcgPSBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIGdfY2xlYXJfb2JqZWN0KCZ4dHJ1Y3RfaW4pOworICAgICAgZ19jbGVhcl9vYmplY3QoJnh0cnVjdDJfaW4pOworICAgICAgZ19jbGVhcl9vYmplY3QoJnh0cnVjdDJfb3V0KTsKKyAgICAgIGdfY2xlYXJfb2JqZWN0KCZ4dHJ1Y3Rfb3V0KTsKKworICAgICAgLyoqCisgICAgICAgKiBNQVAgVEVTVAorICAgICAgICovCisgICAgICBtYXBfb3V0ID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChnX2ludF9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19pbnRfZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUpOworICAgICAgZm9yIChpID0gMDsgaSA8IDU7ICsraSkgeworICAgICAgICBpMzJfa2V5X3B0ciAgID0gZ19tYWxsb2MgKHNpemVvZiAqaTMyX2tleV9wdHIpOworICAgICAgICBpMzJfdmFsdWVfcHRyID0gZ19tYWxsb2MgKHNpemVvZiAqaTMyX3ZhbHVlX3B0cik7CisKKyAgICAgICAgKmkzMl9rZXlfcHRyICAgPSBpOworICAgICAgICAqaTMyX3ZhbHVlX3B0ciA9IGkgLSAxMDsKKworICAgICAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChtYXBfb3V0LCBpMzJfa2V5X3B0ciwgaTMyX3ZhbHVlX3B0cik7CisgICAgICB9CisgICAgICBwcmludGYgKCJ0ZXN0TWFwKHsiKTsKKyAgICAgIGZpcnN0ID0gVFJVRTsKKyAgICAgIGdfaGFzaF90YWJsZV9pdGVyX2luaXQgKCZoYXNoX3RhYmxlX2l0ZXIsIG1hcF9vdXQpOworICAgICAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZoYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKSB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICBmaXJzdCA9IEZBTFNFOworICAgICAgICBlbHNlCisgICAgICAgICAgcHJpbnRmICgiLCAiKTsKKworICAgICAgICBwcmludGYgKCIlZCA9PiAlZCIsICooZ2ludDMyICopa2V5LCAqKGdpbnQzMiAqKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZiAoIn0pIik7CisKKyAgICAgIG1hcF9pbiA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19pbnRfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19pbnRfZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19mcmVlKTsKKworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X21hcCAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFwX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmICgiID0geyIpOworICAgICAgICBmaXJzdCA9IFRSVUU7CisgICAgICAgIGdfaGFzaF90YWJsZV9pdGVyX2luaXQgKCZoYXNoX3RhYmxlX2l0ZXIsIG1hcF9pbik7CisgICAgICAgIHdoaWxlIChnX2hhc2hfdGFibGVfaXRlcl9uZXh0ICgmaGFzaF90YWJsZV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICBmaXJzdCA9IEZBTFNFOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZiAoIiwgIik7CisKKyAgICAgICAgICBwcmludGYgKCIlZCA9PiAlZCIsICooZ2ludDMyICopa2V5LCAqKGdpbnQzMiAqKXZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYgKCJ9XG4iKTsKKworICAgICAgICBpZiAoZ19oYXNoX3RhYmxlX3NpemUgKG1hcF9pbikgIT0gZ19oYXNoX3RhYmxlX3NpemUgKG1hcF9vdXQpKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmhhc2hfdGFibGVfaXRlciwgbWFwX291dCk7CisgICAgICAgICAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZoYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGdwb2ludGVyIGluX3ZhbHVlID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAobWFwX2luLCBrZXkpOworICAgICAgICAgICAgaWYgKGluX3ZhbHVlID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAqKGdpbnQzMiAqKWluX3ZhbHVlICE9ICooZ2ludDMyICopdmFsdWUpIHsKKyAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgZ19oYXNoX3RhYmxlX3VucmVmIChtYXBfaW4pOworICAgICAgZ19oYXNoX3RhYmxlX3VucmVmIChtYXBfb3V0KTsKKworICAgICAgLyoqCisgICAgICAgKiBTVFJJTkcgTUFQIFRFU1QKKyAgICAgICAqLworICAgICAgbWFwX291dCA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19zdHJfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfc3RyX2VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgZ19oYXNoX3RhYmxlX2luc2VydCAobWFwX291dCwgImEiLCAgICAiMiIpOworICAgICAgZ19oYXNoX3RhYmxlX2luc2VydCAobWFwX291dCwgImIiLCAgICAiYmxhaCIpOworICAgICAgZ19oYXNoX3RhYmxlX2luc2VydCAobWFwX291dCwgInNvbWUiLCAidGhpbmciKTsKKyAgICAgIHByaW50ZiAoInRlc3RTdHJpbmdNYXAoeyIpOworICAgICAgZmlyc3QgPSBUUlVFOworICAgICAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmhhc2hfdGFibGVfaXRlciwgbWFwX291dCk7CisgICAgICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJmhhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgIGZpcnN0ID0gRkFMU0U7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYgKCIsICIpOworCisgICAgICAgIHByaW50ZiAoIlwiJXNcIiA9PiBcIiVzXCIiLCAoZ2NoYXIgKilrZXksIChnY2hhciAqKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZiAoIil9Iik7CisKKyAgICAgIG1hcF9pbiA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19zdHJfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19zdHJfZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19mcmVlKTsKKworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X3N0cmluZ19tYXAgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXBfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZiAoIiA9IHsiKTsKKyAgICAgICAgZmlyc3QgPSBUUlVFOworICAgICAgICBnX2hhc2hfdGFibGVfaXRlcl9pbml0ICgmaGFzaF90YWJsZV9pdGVyLCBtYXBfaW4pOworICAgICAgICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJmhhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKSB7CisgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgZmlyc3QgPSBGQUxTRTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYgKCIsICIpOworCisgICAgICAgICAgcHJpbnRmICgiXCIlc1wiID0+IFwiJXNcIiIsIChnY2hhciAqKWtleSwgKGdjaGFyICopdmFsdWUpOworICAgICAgICB9CisgICAgICAgIHByaW50ZiAoIn1cbiIpOworCisgICAgICAgIGlmIChnX2hhc2hfdGFibGVfc2l6ZSAobWFwX2luKSAhPSBnX2hhc2hfdGFibGVfc2l6ZSAobWFwX291dCkpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBnX2hhc2hfdGFibGVfaXRlcl9pbml0ICgmaGFzaF90YWJsZV9pdGVyLCBtYXBfb3V0KTsKKyAgICAgICAgICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJmhhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkgeworICAgICAgICAgICAgZ3BvaW50ZXIgaW5fdmFsdWUgPSBnX2hhc2hfdGFibGVfbG9va3VwIChtYXBfaW4sIGtleSk7CisgICAgICAgICAgICBpZiAoaW5fdmFsdWUgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgIHN0cmNtcCAoKGdjaGFyICopaW5fdmFsdWUsIChnY2hhciAqKXZhbHVlKSAhPSAwKSB7CisgICAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIGdfaGFzaF90YWJsZV91bnJlZiAobWFwX2luKTsKKyAgICAgIGdfaGFzaF90YWJsZV91bnJlZiAobWFwX291dCk7CisKKyAgICAgIC8qKgorICAgICAgICogU0VUIFRFU1QKKyAgICAgICAqLworICAgICAgc2V0X291dCA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19pbnRfaGFzaCwgZ19pbnRfZXF1YWwsIGdfZnJlZSwgTlVMTCk7CisgICAgICBmb3IgKGkgPSAtMjsgaSA8IDM7ICsraSkgeworICAgICAgICBpMzJfa2V5X3B0ciA9IGdfbWFsbG9jIChzaXplb2YgKmkzMl9rZXlfcHRyKTsKKyAgICAgICAgKmkzMl9rZXlfcHRyID0gaTsKKworICAgICAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChzZXRfb3V0LCBpMzJfa2V5X3B0ciwgTlVMTCk7CisgICAgICB9CisgICAgICBwcmludGYgKCJ0ZXN0U2V0KHsiKTsKKyAgICAgIGZpcnN0ID0gVFJVRTsKKyAgICAgIGtleXNfb3V0ID0gZ19oYXNoX3RhYmxlX2dldF9rZXlzIChzZXRfb3V0KTsKKyAgICAgIGtleXNfZWxlbSA9IGtleXNfb3V0OworICAgICAgd2hpbGUgKGtleXNfZWxlbSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICBmaXJzdCA9IEZBTFNFOworICAgICAgICBlbHNlCisgICAgICAgICAgcHJpbnRmICgiLCAiKTsKKworICAgICAgICBwcmludGYgKCIlZCIsICooZ2ludDMyICopa2V5c19lbGVtLT5kYXRhKTsKKworICAgICAgICBrZXlzX2VsZW0gPSBrZXlzX2VsZW0tPm5leHQ7CisgICAgICB9CisgICAgICBwcmludGYgKCJ9KSIpOworCisgICAgICBzZXRfaW4gPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfaW50X2hhc2gsIGdfaW50X2VxdWFsLCBnX2ZyZWUsIE5VTEwpOworCisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3Rfc2V0ICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXRfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYoIiA9IHsiKTsKKyAgICAgICAgZmlyc3QgPSBUUlVFOworICAgICAgICBrZXlzX2luID0gZ19oYXNoX3RhYmxlX2dldF9rZXlzIChzZXRfaW4pOworICAgICAgICBrZXlzX2VsZW0gPSBrZXlzX2luOworICAgICAgICB3aGlsZSAoa2V5c19lbGVtICE9IE5VTEwpIHsKKyAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICBmaXJzdCA9IEZBTFNFOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZiAoIiwgIik7CisKKyAgICAgICAgICBwcmludGYgKCIlZCIsICooZ2ludDMyICopa2V5c19lbGVtLT5kYXRhKTsKKworICAgICAgICAgIGtleXNfZWxlbSA9IGtleXNfZWxlbS0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICBwcmludGYgKCJ9XG4iKTsKKworICAgICAgICBpZiAoZ19saXN0X2xlbmd0aCAoa2V5c19pbikgIT0gZ19saXN0X2xlbmd0aCAoa2V5c19vdXQpKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAga2V5c19lbGVtID0ga2V5c19vdXQ7CisgICAgICAgICAgd2hpbGUgKGtleXNfZWxlbSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoZ19saXN0X2ZpbmRfY3VzdG9tIChrZXlzX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c19lbGVtLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyX2NvbXBhcmUpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAga2V5c19lbGVtID0ga2V5c19lbGVtLT5uZXh0OworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGdfbGlzdF9mcmVlIChrZXlzX2luKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgZ19oYXNoX3RhYmxlX3VucmVmIChzZXRfaW4pOworICAgICAgZ19saXN0X2ZyZWUgKGtleXNfb3V0KTsKKyAgICAgIGdfaGFzaF90YWJsZV91bnJlZiAoc2V0X291dCk7CisKKyAgICAgIC8qKgorICAgICAgICogTElTVCBURVNUCisgICAgICAgKi8KKyAgICAgIGxpc3Rfb3V0ID0gZ19hcnJheV9uZXcgKEZBTFNFLCBUUlVFLCBzaXplb2YgKGdpbnQzMikpOworICAgICAgZm9yIChpID0gLTI7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgZ19hcnJheV9hcHBlbmRfdmFsIChsaXN0X291dCwgaSk7CisgICAgICB9CisgICAgICBwcmludGYgKCJ0ZXN0TGlzdCh7Iik7CisgICAgICBmaXJzdCA9IFRSVUU7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgKGdpbnQzMilsaXN0X291dC0+bGVuOyArK2kpIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgIGZpcnN0ID0gRkFMU0U7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYgKCIsICIpOworCisgICAgICAgIHByaW50ZiAoIiVkIiwgZ19hcnJheV9pbmRleCAobGlzdF9vdXQsIGdpbnQzMiwgaSkpOworICAgICAgfQorICAgICAgcHJpbnRmICgifSkiKTsKKworICAgICAgbGlzdF9pbiA9IGdfYXJyYXlfbmV3IChGQUxTRSwgVFJVRSwgc2l6ZW9mIChnaW50MzIpKTsKKworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2xpc3QgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXN0X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Rfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmICgiID0geyIpOworICAgICAgICBmaXJzdCA9IFRSVUU7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoZ2ludDMyKWxpc3RfaW4tPmxlbjsgKytpKSB7CisgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgZmlyc3QgPSBGQUxTRTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYgKCIsICIpOworCisgICAgICAgICAgcHJpbnRmICgiJWQiLCBnX2FycmF5X2luZGV4IChsaXN0X2luLCBnaW50MzIsIGkpKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYgKCJ9XG4iKTsKKworICAgICAgICBpZiAobGlzdF9pbi0+bGVuICE9IGxpc3Rfb3V0LT5sZW4gfHwKKyAgICAgICAgICAgIG1lbWNtcCAobGlzdF9pbi0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgbGlzdF9vdXQtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgIGxpc3RfaW4tPmxlbiAqIHNpemVvZiAoZ2ludDMyKSkgIT0gMCkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIGdfYXJyYXlfdW5yZWYgKGxpc3RfaW4pOworICAgICAgZ19hcnJheV91bnJlZiAobGlzdF9vdXQpOworCisgICAgICAvKioKKyAgICAgICAqIEVOVU0gVEVTVAorICAgICAgICovCisgICAgICBwcmludGYoInRlc3RFbnVtKE9ORSkiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9lbnVtICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX1RFU1RfTlVNQkVSWl9PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYoIiA9ICVkXG4iLCBudW1iZXJ6KTsKKyAgICAgICAgaWYgKG51bWJlcnogIT0gVF9URVNUX05VTUJFUlpfT05FKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgcHJpbnRmKCJ0ZXN0RW51bShUV08pIik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfZW51bSAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bWJlcnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9URVNUX05VTUJFUlpfVFdPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmKCIgPSAlZFxuIiwgbnVtYmVyeik7CisgICAgICAgIGlmIChudW1iZXJ6ICE9IFRfVEVTVF9OVU1CRVJaX1RXTykKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIHByaW50ZigidGVzdEVudW0oVEhSRUUpIik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfZW51bSAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bWJlcnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9URVNUX05VTUJFUlpfVEhSRUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYoIiA9ICVkXG4iLCBudW1iZXJ6KTsKKyAgICAgICAgaWYgKG51bWJlcnogIT0gVF9URVNUX05VTUJFUlpfVEhSRUUpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICBwcmludGYoInRlc3RFbnVtKEZJVkUpIik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfZW51bSAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bWJlcnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9URVNUX05VTUJFUlpfRklWRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZigiID0gJWRcbiIsIG51bWJlcnopOworICAgICAgICBpZiAobnVtYmVyeiAhPSBUX1RFU1RfTlVNQkVSWl9GSVZFKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgcHJpbnRmKCJ0ZXN0RW51bShFSUdIVCkiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9lbnVtICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX1RFU1RfTlVNQkVSWl9FSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZigiID0gJWRcbiIsIG51bWJlcnopOworICAgICAgICBpZiAobnVtYmVyeiAhPSBUX1RFU1RfTlVNQkVSWl9FSUdIVCkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogVFlQRURFRiBURVNUCisgICAgICAgKi8KKyAgICAgIHByaW50ZiAoInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF90eXBlZGVmICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlcl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDk4NTgyMzUwODI1MjNMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZigiID0gJSIgUFJJZDY0ICJcbiIsIHVzZXJfaWQpOworICAgICAgICBpZiAodXNlcl9pZCAhPSAzMDk4NTgyMzUwODI1MjNMTCkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogTkVTVEVEIE1BUCBURVNUCisgICAgICAgKi8KKyAgICAgIHByaW50ZiAoInRlc3RNYXBNYXAoMSkiKTsKKyAgICAgIG1hcF9pbiA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19pbnRfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19pbnRfZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdEZXN0cm95Tm90aWZ5KWdfaGFzaF90YWJsZV91bnJlZik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfbWFwX21hcCAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmhhc2hfdGFibGVfaXRlciwgbWFwX2luKTsKKworICAgICAgICBwcmludGYgKCIgPSB7Iik7CisgICAgICAgIHdoaWxlIChnX2hhc2hfdGFibGVfaXRlcl9uZXh0ICgmaGFzaF90YWJsZV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICAgICAgICBwcmludGYgKCIlZCA9PiB7IiwgKihnaW50MzIgKilrZXkpOworCisgICAgICAgICAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmlubmVyX2hhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR0hhc2hUYWJsZSAqKXZhbHVlKTsKKyAgICAgICAgICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJmlubmVyX2hhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkgeworICAgICAgICAgICAgcHJpbnRmICgiJWQgPT4gJWQsICIsICooZ2ludDMyICopa2V5LCAqKGdpbnQzMiAqKXZhbHVlKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBwcmludGYgKCJ9LCAiKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYgKCJ9XG4iKTsKKworICAgICAgICBpZiAoZ19oYXNoX3RhYmxlX3NpemUgKG1hcF9pbikgIT0gMikKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGdpbnQzMiBpbm5lcl9rZXlzW10gPSB7MSwgMiwgMywgNH07CisgICAgICAgICAgZ2ludDMyIGkzMl9rZXk7CisKKyAgICAgICAgICBpMzJfa2V5ID0gLTQ7CisgICAgICAgICAgaW5uZXJfbWFwX2luID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAobWFwX2luLCAmaTMyX2tleSk7CisgICAgICAgICAgaWYgKGlubmVyX21hcF9pbiA9PSBOVUxMIHx8CisgICAgICAgICAgICAgIGdfaGFzaF90YWJsZV9zaXplIChpbm5lcl9tYXBfaW4pICE9IDQpCisgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBrZXlzX2luID0gZ19oYXNoX3RhYmxlX2dldF9rZXlzIChpbm5lcl9tYXBfaW4pOworICAgICAgICAgICAga2V5c19pbiA9IGdfbGlzdF9zb3J0IChrZXlzX2luLCBnaW50MzJfY29tcGFyZSk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAga2V5c19lbGVtID0gZ19saXN0X250aCAoa2V5c19pbiwgMyAtIGkpOworCisgICAgICAgICAgICAgIGlmICgqKGdpbnQzMiAqKWtleXNfZWxlbS0+ZGF0YSAhPSAoLTEgKiBpbm5lcl9rZXlzW2ldKSB8fAorICAgICAgICAgICAgICAgICAgKihnaW50MzIgKilnX2hhc2hfdGFibGVfbG9va3VwIChpbm5lcl9tYXBfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXNfZWxlbS0+ZGF0YSkgIT0KKyAgICAgICAgICAgICAgICAgICgtMSAqIGlubmVyX2tleXNbaV0pKSB7CisgICAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdfbGlzdF9mcmVlIChrZXlzX2luKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpMzJfa2V5ID0gNDsKKyAgICAgICAgICBpbm5lcl9tYXBfaW4gPSBnX2hhc2hfdGFibGVfbG9va3VwIChtYXBfaW4sICZpMzJfa2V5KTsKKyAgICAgICAgICBpZiAoaW5uZXJfbWFwX2luID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgZ19oYXNoX3RhYmxlX3NpemUgKGlubmVyX21hcF9pbikgIT0gNCkKKyAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGtleXNfaW4gPSBnX2hhc2hfdGFibGVfZ2V0X2tleXMgKGlubmVyX21hcF9pbik7CisgICAgICAgICAgICBrZXlzX2luID0gZ19saXN0X3NvcnQgKGtleXNfaW4sIGdpbnQzMl9jb21wYXJlKTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgICBrZXlzX2VsZW0gPSBnX2xpc3RfbnRoIChrZXlzX2luLCBpKTsKKworICAgICAgICAgICAgICBpZiAoKihnaW50MzIgKilrZXlzX2VsZW0tPmRhdGEgIT0gaW5uZXJfa2V5c1tpXSB8fAorICAgICAgICAgICAgICAgICAgKihnaW50MzIgKilnX2hhc2hfdGFibGVfbG9va3VwIChpbm5lcl9tYXBfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXNfZWxlbS0+ZGF0YSkgIT0KKyAgICAgICAgICAgICAgICAgIGlubmVyX2tleXNbaV0pIHsKKyAgICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ19saXN0X2ZyZWUgKGtleXNfaW4pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICBnX2hhc2hfdGFibGVfdW5yZWYgKG1hcF9pbik7CisKKyAgICAgIC8qKgorICAgICAgICogSU5TQU5JVFkgVEVTVAorICAgICAgICovCisgICAgICBpbnNhbml0eV9vdXQgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0lOU0FOSVRZLCBOVUxMKTsKKyAgICAgIGdfb2JqZWN0X2dldCAoaW5zYW5pdHlfb3V0LAorICAgICAgICAgICAgICAgICAgICAidXNlck1hcCIsICZ1c2VyX21hcCwKKyAgICAgICAgICAgICAgICAgICAgInh0cnVjdHMiLCAmeHRydWN0cywKKyAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgIG51bWJlcnogPSBUX1RFU1RfTlVNQkVSWl9GSVZFOworICAgICAgbnVtYmVyejIgPSBUX1RFU1RfTlVNQkVSWl9FSUdIVDsKKyAgICAgIHVzZXJfaWRfcHRyID0gZ19tYWxsb2MgKHNpemVvZiAqdXNlcl9pZF9wdHIpOworICAgICAgKnVzZXJfaWRfcHRyID0gNTsKKyAgICAgIHVzZXJfaWRfcHRyMiA9IGdfbWFsbG9jIChzaXplb2YgKnVzZXJfaWRfcHRyKTsKKyAgICAgICp1c2VyX2lkX3B0cjIgPSA4OworICAgICAgZ19oYXNoX3RhYmxlX2luc2VydCAodXNlcl9tYXAsIChncG9pbnRlciludW1iZXJ6LCB1c2VyX2lkX3B0cik7CisgICAgICBnX2hhc2hfdGFibGVfaW5zZXJ0ICh1c2VyX21hcCwgKGdwb2ludGVyKW51bWJlcnoyLCB1c2VyX2lkX3B0cjIpOworICAgICAgZ19oYXNoX3RhYmxlX3VucmVmICh1c2VyX21hcCk7CisKKyAgICAgIHh0cnVjdF9vdXQgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCAiSGVsbG8yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgMkxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICB4dHJ1Y3Rfb3V0MiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICJHb29kYnllNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgIDRMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgZ19wdHJfYXJyYXlfYWRkICh4dHJ1Y3RzLCB4dHJ1Y3Rfb3V0Mik7CisgICAgICBnX3B0cl9hcnJheV9hZGQgKHh0cnVjdHMsIHh0cnVjdF9vdXQpOworICAgICAgZ19wdHJfYXJyYXlfdW5yZWYgKHh0cnVjdHMpOworCisgICAgICBtYXBfaW4gPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfaW50NjRfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19pbnQ2NF9lcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR0Rlc3Ryb3lOb3RpZnkpZ19oYXNoX3RhYmxlX3VucmVmKTsKKworICAgICAgcHJpbnRmKCJ0ZXN0SW5zYW5pdHkoKSIpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2luc2FuaXR5ICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zYW5pdHlfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZiAoIiA9IHsiKTsKKyAgICAgICAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmhhc2hfdGFibGVfaXRlciwgbWFwX2luKTsKKyAgICAgICAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZoYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkgeworICAgICAgICAgIHByaW50ZiAoIiUiIFBSSWQ2NCAiID0+IHsiLCAqKFRUZXN0VXNlcklkICopa2V5KTsKKworICAgICAgICAgIGdfaGFzaF90YWJsZV9pdGVyX2luaXQgKCZpbm5lcl9oYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdIYXNoVGFibGUgKil2YWx1ZSk7CisgICAgICAgICAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZpbm5lcl9oYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIHByaW50ZiAoIiVkID0+IHsiLCAoVFRlc3ROdW1iZXJ6KWtleSk7CisKKyAgICAgICAgICAgIGdfb2JqZWN0X2dldCAoKFRUZXN0SW5zYW5pdHkgKil2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZXJNYXAiLCAmdXNlcl9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ4dHJ1Y3RzIiwgJnh0cnVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgICAgICBwcmludGYgKCJ7Iik7CisgICAgICAgICAgICBnX2hhc2hfdGFibGVfaXRlcl9pbml0ICgmdXNlcl9tYXBfaXRlciwgdXNlcl9tYXApOworICAgICAgICAgICAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZ1c2VyX21hcF9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkgeworICAgICAgICAgICAgICBwcmludGYgKCIlZCA9PiAlIiBQUklkNjQgIiwgIiwKKyAgICAgICAgICAgICAgICAgICAgICAoVFRlc3ROdW1iZXJ6KWtleSwKKyAgICAgICAgICAgICAgICAgICAgICAqKFRUZXN0VXNlcklkICopdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRmICgifSwgIik7CisgICAgICAgICAgICBnX2hhc2hfdGFibGVfdW5yZWYgKHVzZXJfbWFwKTsKKworICAgICAgICAgICAgcHJpbnRmKCJ7Iik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGdpbnQzMil4dHJ1Y3RzLT5sZW47ICsraSkgeworICAgICAgICAgICAgICB4dHJ1Y3RfaW4gPSBnX3B0cl9hcnJheV9pbmRleCAoeHRydWN0cywgaSk7CisgICAgICAgICAgICAgIGdfb2JqZWN0X2dldCAoeHRydWN0X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCAmc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICAmYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgJmkzMl90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgJmk2NF90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICAgICAgICBwcmludGYgKCJ7XCIlc1wiLCAlZCwgJWQsICUiIFBSSWQ2NCAifSwgIiwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZiAoIn0iKTsKKyAgICAgICAgICAgIGdfcHRyX2FycmF5X3VucmVmICh4dHJ1Y3RzKTsKKworICAgICAgICAgICAgcHJpbnRmICgifSwgIik7CisgICAgICAgICAgfQorICAgICAgICAgIHByaW50ZigifSwgIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJ9XG4iKTsKKworICAgICAgICBpZiAoZ19oYXNoX3RhYmxlX3NpemUgKG1hcF9pbikgIT0gMikKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIFRUZXN0TnVtYmVyeiBudW1iZXJ6X2tleV92YWx1ZXNbXSA9IHsKKyAgICAgICAgICAgIFRfVEVTVF9OVU1CRVJaX1RXTywgVF9URVNUX05VTUJFUlpfVEhSRUUKKyAgICAgICAgICB9OworICAgICAgICAgIGdpbnQgdXNlcl9tYXBfdmFsdWVzW10gPSB7IDUsIDggfTsKKyAgICAgICAgICBUVGVzdFVzZXJJZCB1c2VyX2lkX2tleTsKKworICAgICAgICAgIHVzZXJfaWRfa2V5ID0gMTsKKyAgICAgICAgICBpbm5lcl9tYXBfaW4gPSBnX2hhc2hfdGFibGVfbG9va3VwIChtYXBfaW4sICZ1c2VyX2lkX2tleSk7CisgICAgICAgICAgaWYgKGlubmVyX21hcF9pbiA9PSBOVUxMIHx8CisgICAgICAgICAgICAgIGdfaGFzaF90YWJsZV9zaXplIChpbm5lcl9tYXBfaW4pICE9IDIpCisgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBUVGVzdE51bWJlcnogbnVtYmVyel9rZXk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgICAgICAgICAgbnVtYmVyel9rZXkgPSBudW1iZXJ6X2tleV92YWx1ZXNbaV07CisgICAgICAgICAgICAgIGluc2FuaXR5X2luID0KKyAgICAgICAgICAgICAgICBnX2hhc2hfdGFibGVfbG9va3VwIChpbm5lcl9tYXBfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdjb25zdHBvaW50ZXIpbnVtYmVyel9rZXkpOworICAgICAgICAgICAgICBpZiAoaW5zYW5pdHlfaW4gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGdfb2JqZWN0X2dldCAoaW5zYW5pdHlfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlck1hcCIsICZ1c2VyX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4dHJ1Y3RzIiwgJnh0cnVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICAgICAgICAgIGlmICh1c2VyX21hcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgaWYgKGdfaGFzaF90YWJsZV9zaXplICh1c2VyX21hcCkgIT0gMikKKyAgICAgICAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICBudW1iZXJ6X2tleSA9IChUVGVzdE51bWJlcnopdXNlcl9tYXBfdmFsdWVzW2pdOworCisgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgZ19oYXNoX3RhYmxlX2xvb2t1cCAodXNlcl9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2NvbnN0cG9pbnRlciludW1iZXJ6X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKihUVGVzdFVzZXJJZCAqKXZhbHVlICE9IChUVGVzdFVzZXJJZCl1c2VyX21hcF92YWx1ZXNbal0pCisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgZ19oYXNoX3RhYmxlX3VucmVmICh1c2VyX21hcCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHh0cnVjdHMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGlmICh4dHJ1Y3RzLT5sZW4gIT0gMikKKyAgICAgICAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHh0cnVjdF9pbiA9IGdfcHRyX2FycmF5X2luZGV4ICh4dHJ1Y3RzLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgZ19vYmplY3RfZ2V0ICh4dHJ1Y3RfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICZzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgICZieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICAmaTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICAmaTY0X3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cmluZyA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNtcCAoc3RyaW5nLCAiR29vZGJ5ZTQiLCA5KSAhPSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyAhPSA0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgIT0gNCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nICE9IDQpCisgICAgICAgICAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmcgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUgKHN0cmluZyk7CisKKyAgICAgICAgICAgICAgICAgICAgeHRydWN0X2luID0gZ19wdHJfYXJyYXlfaW5kZXggKHh0cnVjdHMsIDEpOworICAgICAgICAgICAgICAgICAgICBnX29iamVjdF9nZXQgKHh0cnVjdF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgJnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgJmJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgICZpMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgICZpNjRfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoc3RyaW5nID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJuY21wIChzdHJpbmcsICJIZWxsbzIiLCA3KSAhPSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyAhPSAyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgIT0gMiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nICE9IDIpCisgICAgICAgICAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmcgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUgKHN0cmluZyk7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGdfcHRyX2FycmF5X3VucmVmICh4dHJ1Y3RzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICB1c2VyX2lkX2tleSA9IDI7CisgICAgICAgICAgaW5uZXJfbWFwX2luID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAobWFwX2luLCAmdXNlcl9pZF9rZXkpOworICAgICAgICAgIGlmIChpbm5lcl9tYXBfaW4gPT0gTlVMTCB8fAorICAgICAgICAgICAgICBnX2hhc2hfdGFibGVfc2l6ZSAoaW5uZXJfbWFwX2luKSAhPSAxKQorICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW5zYW5pdHlfaW4gPQorICAgICAgICAgICAgICBnX2hhc2hfdGFibGVfbG9va3VwIChpbm5lcl9tYXBfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnY29uc3Rwb2ludGVyKVRfVEVTVF9OVU1CRVJaX1NJWCk7CisgICAgICAgICAgICBpZiAoaW5zYW5pdHlfaW4gPT0gTlVMTCkKKyAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIGdfb2JqZWN0X2dldCAoaW5zYW5pdHlfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZXJNYXAiLCAmdXNlcl9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInh0cnVjdHMiLCAmeHRydWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICAgICAgICBpZiAodXNlcl9tYXAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChnX2hhc2hfdGFibGVfc2l6ZSAodXNlcl9tYXApICE9IDApCisgICAgICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisKKyAgICAgICAgICAgICAgICBnX2hhc2hfdGFibGVfdW5yZWYgKHVzZXJfbWFwKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmICh4dHJ1Y3RzID09IE5VTEwpCisgICAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoeHRydWN0cy0+bGVuICE9IDApCisgICAgICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisKKyAgICAgICAgICAgICAgICBnX3B0cl9hcnJheV91bnJlZiAoeHRydWN0cyk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgZ19oYXNoX3RhYmxlX3VucmVmIChtYXBfaW4pOworICAgICAgZ19jbGVhcl9vYmplY3QgKCZpbnNhbml0eV9vdXQpOworCisgICAgICAvKiB0ZXN0IGV4Y2VwdGlvbiAqLworICAgICAgcHJpbnRmICgidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiWGNlcHRpb25cIikgPT4iKTsKKyAgICAgIGlmICghdF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfZXhjZXB0aW9uICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpICYmCisgICAgICAgICAgeGNlcHRpb24gIT0gTlVMTCkgeworICAgICAgICBnX29iamVjdF9nZXQgKHhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICJlcnJvckNvZGUiLCAmaW50MzIsCisgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiLCAgICZzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIHByaW50ZiAoIiAgeyV1LCBcIiVzXCJ9XG4iLCBpbnQzMiwgc3RyaW5nKTsKKyAgICAgICAgZ19mcmVlIChzdHJpbmcpOworCisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeGNlcHRpb24pOworCisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiICB2b2lkXG5GQUlMVVJFXG4iKTsKKyAgICAgICAgZmFpbF9jb3VudCsrOworCisgICAgICAgIGlmICh4Y2VwdGlvbiAhPSBOVUxMKSB7CisgICAgICAgICAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKKyAgICAgICAgICB4Y2VwdGlvbiA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyb3IgIT0gTlVMTCkgeworICAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICAgIGVycm9yID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBwcmludGYgKCJ0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oXCJURXhjZXB0aW9uXCIpID0+Iik7CisgICAgICBpZiAoIXRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2V4Y2VwdGlvbiAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpICYmCisgICAgICAgICAgeGNlcHRpb24gPT0gTlVMTCAmJgorICAgICAgICAgIGVycm9yICE9IE5VTEwpIHsKKyAgICAgICAgcHJpbnRmICgiICBDYXVnaHQgVEV4Y2VwdGlvblxuIik7CisKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIgIHZvaWRcbkZBSUxVUkVcbiIpOworICAgICAgICBmYWlsX2NvdW50Kys7CisKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbik7CisKKyAgICAgICAgaWYgKGVycm9yICE9IE5VTEwpIHsKKyAgICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgICBlcnJvciA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcHJpbnRmICgidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwic3VjY2Vzc1wiKSA9PiIpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2V4Y2VwdGlvbiAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VjY2VzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKQorICAgICAgICBwcmludGYgKCIgIHZvaWRcbiIpOworICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiAgdm9pZFxuRkFJTFVSRVxuIik7CisgICAgICAgIGZhaWxfY291bnQrKzsKKworICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uKTsKKworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworICAgICAgfQorCisgICAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisKKyAgICAgIC8qIHRlc3QgbXVsdGkgZXhjZXB0aW9uICovCisgICAgICBwcmludGYgKCJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uXCIsIFwidGVzdCAxXCIpID0+Iik7CisgICAgICB4dHJ1Y3RfaW4gPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwgTlVMTCk7CisgICAgICBpZiAoIXRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X211bHRpX2V4Y2VwdGlvbiAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnh0cnVjdF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeGNlcHRpb24yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikgJiYKKyAgICAgICAgICB4Y2VwdGlvbiAhPSBOVUxMICYmCisgICAgICAgICAgeGNlcHRpb24yID09IE5VTEwpIHsKKyAgICAgICAgZ19vYmplY3RfZ2V0ICh4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JDb2RlIiwgJmludDMyLAorICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiwgICAmc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBwcmludGYgKCIgIHsldSwgXCIlc1wifVxuIiwgaW50MzIsIHN0cmluZyk7CisgICAgICAgIGdfZnJlZSAoc3RyaW5nKTsKKworICAgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOworICAgICAgICB4Y2VwdGlvbiA9IE5VTEw7CisKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIgIHJlc3VsdFxuRkFJTFVSRVxuIik7CisgICAgICAgIGZhaWxfY291bnQrKzsKKworICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uKTsKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbjIpOworCisgICAgICAgIGlmIChlcnJvciAhPSBOVUxMKSB7CisgICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgICAgZXJyb3IgPSBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBnX29iamVjdF91bnJlZiAoeHRydWN0X2luKTsKKworICAgICAgcHJpbnRmICgidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvbjJcIiwgXCJ0ZXN0IDJcIikgPT4iKTsKKyAgICAgIHh0cnVjdF9pbiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULCBOVUxMKTsKKyAgICAgIGlmICghdF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfbXVsdGlfZXhjZXB0aW9uICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeHRydWN0X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJYY2VwdGlvbjIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IDIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeGNlcHRpb24yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikgJiYKKyAgICAgICAgICB4Y2VwdGlvbiA9PSBOVUxMICYmCisgICAgICAgICAgeGNlcHRpb24yICE9IE5VTEwpIHsKKyAgICAgICAgZ19vYmplY3RfZ2V0ICh4Y2VwdGlvbjIsCisgICAgICAgICAgICAgICAgICAgICAgImVycm9yQ29kZSIsICAgICZpbnQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAic3RydWN0X3RoaW5nIiwgJmlubmVyX3h0cnVjdF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgZ19vYmplY3RfZ2V0IChpbm5lcl94dHJ1Y3RfaW4sCisgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICZzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIHByaW50ZiAoIiAgeyV1LCB7XCIlc1wifX1cbiIsIGludDMyLCBzdHJpbmcpOworICAgICAgICBnX2ZyZWUgKHN0cmluZyk7CisKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZpbm5lcl94dHJ1Y3RfaW4pOworICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uMik7CisKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIgIHJlc3VsdFxuRkFJTFVSRVxuIik7CisgICAgICAgIGZhaWxfY291bnQrKzsKKworICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uKTsKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbjIpOworCisgICAgICAgIGlmIChlcnJvciAhPSBOVUxMKSB7CisgICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgICAgZXJyb3IgPSBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBnX2NsZWFyX29iamVjdCAoJnh0cnVjdF9pbik7CisKKyAgICAgIHByaW50ZiAoInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwic3VjY2Vzc1wiLCBcInRlc3QgM1wiKSA9PiIpOworICAgICAgeHRydWN0X2luID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsIE5VTEwpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X211bHRpX2V4Y2VwdGlvbiAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeHRydWN0X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QgMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeGNlcHRpb24yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSAmJgorICAgICAgICAgIHhjZXB0aW9uID09IE5VTEwgJiYKKyAgICAgICAgICB4Y2VwdGlvbjIgPT0gTlVMTCkgeworICAgICAgICBnX29iamVjdF9nZXQgKHh0cnVjdF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgJnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgcHJpbnRmICgiICB7e1wiJXNcIn19XG4iLCBzdHJpbmcpOworICAgICAgICBnX2ZyZWUgKHN0cmluZyk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiICByZXN1bHRcbkZBSUxVUkVcbiIpOworICAgICAgICBmYWlsX2NvdW50Kys7CisKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbik7CisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeGNlcHRpb24yKTsKKworICAgICAgICBpZiAoZXJyb3IgIT0gTlVMTCkgeworICAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICAgIGVycm9yID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4dHJ1Y3RfaW4pOworCisgICAgICAvKiB0ZXN0IG9uZXdheSB2b2lkICovCisgICAgICBwcmludGYgKCJ0ZXN0Q2xpZW50LnRlc3RPbmV3YXkoMSkgPT4iKTsKKyAgICAgIGdldHRpbWVvZmRheSAoJm9uZXdheV9zdGFydCwgTlVMTCk7CisgICAgICBvbmV3YXlfcmVzdWx0ID0gdF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3Rfb25ld2F5ICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpOworICAgICAgZ2V0dGltZW9mZGF5ICgmb25ld2F5X2VuZCwgTlVMTCk7CisgICAgICB0aW1lcnN1YiAoJm9uZXdheV9lbmQsICZvbmV3YXlfc3RhcnQsICZvbmV3YXlfZWxhcHNlZCk7CisgICAgICBvbmV3YXlfZWxhcHNlZF91c2VjID0KKyAgICAgICAgb25ld2F5X2VsYXBzZWQudHZfc2VjICogMTAwMCAqIDEwMDAgKyBvbmV3YXlfZWxhcHNlZC50dl91c2VjOworCisgICAgICBpZiAob25ld2F5X3Jlc3VsdCkgeworICAgICAgICBpZiAob25ld2F5X2VsYXBzZWRfdXNlYyA+IDIwMCAqIDEwMDApIHsKKyAgICAgICAgICBwcmludGYgKCIgIEZBSUxVUkUgLSB0b29rICUuMmYgbXNcbiIsCisgICAgICAgICAgICAgICAgICAoZG91YmxlKW9uZXdheV9lbGFwc2VkX3VzZWMgLyAxMDAwLjApOworICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgcHJpbnRmICgiICBzdWNjZXNzIC0gdG9vayAlLjJmIG1zXG4iLAorICAgICAgICAgICAgICAgICAgKGRvdWJsZSlvbmV3YXlfZWxhcHNlZF91c2VjIC8gMTAwMC4wKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiByZWRvIGEgc2ltcGxlIHRlc3QgYWZ0ZXIgdGhlIG9uZXdheSB0byBtYWtlIHN1cmUgd2UgYXJlbid0ICJvZmYgYnkKKyAgICAgICAqIG9uZSIgLS0gaWYgdGhlIHNlcnZlciB0cmVhdGVkIG9uZXdheSB2b2lkIGxpa2Ugbm9ybWFsIHZvaWQsIHRoaXMgbmV4dAorICAgICAgICogdGVzdCB3aWxsIGZhaWwgc2luY2UgaXQgd2lsbCBnZXQgdGhlIHZvaWQgY29uZmlybWF0aW9uIHJhdGhlciB0aGFuCisgICAgICAgKiB0aGUgY29ycmVjdCByZXN1bHQuIEluIHRoaXMgY2lyY3Vtc3RhbmNlLCB0aGUgY2xpZW50IHdpbGwgcmVjZWl2ZSB0aGUKKyAgICAgICAqIGVycm9yOgorICAgICAgICoKKyAgICAgICAqICAgYXBwbGljYXRpb24gZXJyb3I6IFdyb25nIG1ldGhvZCBuYW1lCisgICAgICAgKi8KKyAgICAgIC8qKgorICAgICAgICogSTMyIFRFU1QKKyAgICAgICAqLworICAgICAgcHJpbnRmICgicmUtdGVzdCB0ZXN0STMyKC0xKSIpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2kzMiAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmICgiID0gJWRcbiIsIGludDMyKTsKKyAgICAgICAgaWYgKGludDMyICE9IC0xKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgZ2V0dGltZW9mZGF5ICgmdGltZV9zdG9wLCBOVUxMKTsKKyAgICAgIHRpbWVyc3ViICgmdGltZV9zdG9wLCAmdGltZV9zdGFydCwgJnRpbWVfZWxhcHNlZCk7CisgICAgICB0aW1lX2VsYXBzZWRfdXNlYyA9CisgICAgICAgIHRpbWVfZWxhcHNlZC50dl9zZWMgKiAxMDAwICogMTAwMCArIHRpbWVfZWxhcHNlZC50dl91c2VjOworCisgICAgICBwcmludGYoIlRvdGFsIHRpbWU6ICUiIFBSSXU2NCAiIHVzXG4iLCB0aW1lX2VsYXBzZWRfdXNlYyk7CisKKyAgICAgIHRpbWVfdG90YWxfdXNlYyArPSB0aW1lX2VsYXBzZWRfdXNlYzsKKyAgICAgIGlmICh0aW1lX2VsYXBzZWRfdXNlYyA8IHRpbWVfbWluX3VzZWMpCisgICAgICAgIHRpbWVfbWluX3VzZWMgPSB0aW1lX2VsYXBzZWRfdXNlYzsKKyAgICAgIGlmICh0aW1lX2VsYXBzZWRfdXNlYyA+IHRpbWVfbWF4X3VzZWMpCisgICAgICAgIHRpbWVfbWF4X3VzZWMgPSB0aW1lX2VsYXBzZWRfdXNlYzsKKworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCAmZXJyb3IpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHByaW50ZiAoIkNvbm5lY3QgZmFpbGVkOiAlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIC8qIEFsbCBkb25lLS0tb3V0cHV0IHN0YXRpc3RpY3MgKi8KKyAgcHV0cyAoIlxuQWxsIHRlc3RzIGRvbmUuIik7CisgIHByaW50ZigiTnVtYmVyIG9mIGZhaWx1cmVzOiAlZFxuIiwgZmFpbF9jb3VudCk7CisKKyAgdGltZV9hdmdfdXNlYyA9IHRpbWVfdG90YWxfdXNlYyAvIG51bV90ZXN0czsKKworICBwcmludGYgKCJNaW4gdGltZTogJSIgUFJJdTY0ICIgdXNcbiIsIHRpbWVfbWluX3VzZWMpOworICBwcmludGYgKCJNYXggdGltZTogJSIgUFJJdTY0ICIgdXNcbiIsIHRpbWVfbWF4X3VzZWMpOworICBwcmludGYgKCJBdmcgdGltZTogJSIgUFJJdTY0ICIgdXNcbiIsIHRpbWVfYXZnX3VzZWMpOworCisgIGdfY2xlYXJfb2JqZWN0KCZzZWNvbmRfc2VydmljZSk7CisgIGdfY2xlYXJfb2JqZWN0KCZwcm90b2NvbDIpOworICBnX2NsZWFyX29iamVjdCgmdGVzdF9jbGllbnQpOworICBnX2NsZWFyX29iamVjdCgmcHJvdG9jb2wpOworICBnX2NsZWFyX29iamVjdCgmdHJhbnNwb3J0KTsKKyAgZ19jbGVhcl9vYmplY3QoJnNvY2tldCk7CisKKyAgaWYgKHNzbCkgeworICAgIHRocmlmdF9zc2xfc29ja2V0X2ZpbmFsaXplX29wZW5zc2woKTsKKyAgfQorCisgIHJldHVybiBmYWlsX2NvdW50OworfQpkaWZmIC0tZ2l0IGEvdGVzdC9jX2dsaWIvc3JjL3Rlc3Rfc2VydmVyLmMgYi90ZXN0L2NfZ2xpYi9zcmMvdGVzdF9zZXJ2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDcxNmVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jX2dsaWIvc3JjL3Rlc3Rfc2VydmVyLmMKQEAgLTAsMCArMSwyOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5Lmg+CisKKyNpbmNsdWRlICIuLi9nZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oIgorI2luY2x1ZGUgIi4uL2dlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmgiCisKKyNpbmNsdWRlICJ0aHJpZnRfdGVzdF9oYW5kbGVyLmgiCisjaW5jbHVkZSAidGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaCIKKworLyogT3VyIHNlcnZlciBvYmplY3QsIGRlY2xhcmVkIGdsb2JhbGx5IHNvIGl0IGlzIGFjY2Vzc2libGUgd2l0aGluIHRoZSBTSUdJTlQKKyAgIHNpZ25hbCBoYW5kbGVyICovCitUaHJpZnRTZXJ2ZXIgKnNlcnZlciA9IE5VTEw7CisKKy8qIEEgZmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBzZXJ2ZXIgd2FzIGludGVycnVwdGVkIHdpdGggU0lHSU5UCisgICAoaS5lLiBDdHJsLUMpIHNvIHdlIGNhbiB0ZWxsIHdoZXRoZXIgaXRzIHRlcm1pbmF0aW9uIHdhcyBhYm5vcm1hbCAqLworZ2Jvb2xlYW4gc2lnaW50X3JlY2VpdmVkID0gRkFMU0U7CisKKy8qIEhhbmRsZSBTSUdJTlQgKCJDdHJsLUMiKSBzaWduYWxzIGJ5IGdyYWNlZnVsbHkgc3RvcHBpbmcgdGhlIHNlcnZlciAqLworc3RhdGljIHZvaWQKK3NpZ2ludF9oYW5kbGVyIChpbnQgc2lnbmFsX251bWJlcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHNpZ25hbF9udW1iZXIpOworCisgIC8qIFRha2Ugbm90ZSB3ZSB3ZXJlIGNhbGxlZCAqLworICBzaWdpbnRfcmVjZWl2ZWQgPSBUUlVFOworCisgIC8qIFNodXQgZG93biB0aGUgc2VydmVyIGdyYWNlZnVsbHkgKi8KKyAgaWYgKHNlcnZlciAhPSBOVUxMKQorICAgIHRocmlmdF9zZXJ2ZXJfc3RvcCAoc2VydmVyKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIHN0YXRpYyBnaW50ICAgcG9ydCA9IDkwOTA7CisgIHN0YXRpYyBnY2hhciAqc2VydmVyX3R5cGVfb3B0aW9uID0gTlVMTDsKKyAgc3RhdGljIGdjaGFyICp0cmFuc3BvcnRfb3B0aW9uID0gTlVMTDsKKyAgc3RhdGljIGdjaGFyICpwcm90b2NvbF9vcHRpb24gPSBOVUxMOworICBzdGF0aWMgZ2ludCAgIHN0cmluZ19saW1pdCA9IDA7CisgIHN0YXRpYyBnaW50ICAgY29udGFpbmVyX2xpbWl0ID0gMDsKKworICBzdGF0aWMKKyAgICBHT3B0aW9uRW50cnkgb3B0aW9uX2VudHJpZXNbXSA9IHsKKyAgICB7ICJwb3J0IiwgICAgICAgICAgICAwLCAwLCBHX09QVElPTl9BUkdfSU5ULCAgICAgICZwb3J0LAorICAgICAgIlBvcnQgbnVtYmVyIHRvIGNvbm5lY3QgKD05MDkwKSIsIE5VTEwgfSwKKyAgICB7ICJzZXJ2ZXItdHlwZSIsICAgICAwLCAwLCBHX09QVElPTl9BUkdfU1RSSU5HLCAgICZzZXJ2ZXJfdHlwZV9vcHRpb24sCisgICAgICAiVHlwZSBvZiBzZXJ2ZXI6IHNpbXBsZSAoPXNpbXBsZSkiLCBOVUxMIH0sCisgICAgeyAidHJhbnNwb3J0IiwgICAgICAgMCwgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmdHJhbnNwb3J0X29wdGlvbiwKKyAgICAgICJUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQgKD1idWZmZXJlZCkiLCBOVUxMIH0sCisgICAgeyAicHJvdG9jb2wiLCAgICAgICAgMCwgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmcHJvdG9jb2xfb3B0aW9uLAorICAgICAgIlByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QgKD1iaW5hcnkpIiwgTlVMTCB9LAorICAgIHsgInN0cmluZy1saW1pdCIsICAgIDAsIDAsIEdfT1BUSU9OX0FSR19JTlQsICAgICAgJnN0cmluZ19saW1pdCwKKyAgICAgICJNYXggc3RyaW5nIGxlbmd0aCAoPW5vbmUpIiwgTlVMTCB9LAorICAgIHsgImNvbnRhaW5lci1saW1pdCIsIDAsIDAsIEdfT1BUSU9OX0FSR19JTlQsICAgICAgJmNvbnRhaW5lcl9saW1pdCwKKyAgICAgICJNYXggY29udGFpbmVyIGxlbmd0aCAoPW5vbmUpIiwgTlVMTCB9LAorICAgIHsgTlVMTCB9CisgIH07CisKKyAgZ2NoYXIgKnNlcnZlcl9uYW1lICAgICAgICAgICAgPSAic2ltcGxlIjsKKyAgZ2NoYXIgKnRyYW5zcG9ydF9uYW1lICAgICAgICAgPSAiYnVmZmVyZWQiOworICBHVHlwZSAgdHJhbnNwb3J0X2ZhY3RvcnlfdHlwZSA9IFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZOworICBnY2hhciAqcHJvdG9jb2xfbmFtZSAgICAgICAgICA9ICJiaW5hcnkiOworICBHVHlwZSAgcHJvdG9jb2xfZmFjdG9yeV90eXBlICA9IFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZOworCisgIFRUZXN0VGhyaWZ0VGVzdEhhbmRsZXIgKmhhbmRsZXI7CisgIFRUZXN0VGhyaWZ0VGVzdEhhbmRsZXIgKmhhbmRsZXJfc2Vjb25kX3NlcnZpY2UgPSBOVUxMOworICBUaHJpZnRQcm9jZXNzb3IgICAgICAgICpwcm9jZXNzb3I7CisgIFRocmlmdFByb2Nlc3NvciAgICAgICAgKnByb2Nlc3Nvcl90ZXN0ID0gTlVMTDsKKyAgVGhyaWZ0UHJvY2Vzc29yICAgICAgICAqcHJvY2Vzc29yX3NlY29uZF9zZXJ2aWNlID0gTlVMTDsKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICAqc2VydmVyX3RyYW5zcG9ydDsKKyAgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqdHJhbnNwb3J0X2ZhY3Rvcnk7CisgIFRocmlmdFByb3RvY29sRmFjdG9yeSAgKnByb3RvY29sX2ZhY3Rvcnk7CisKKyAgc3RydWN0IHNpZ2FjdGlvbiBzaWdpbnRfYWN0aW9uOworCisgIEdPcHRpb25Db250ZXh0ICpvcHRpb25fY29udGV4dDsKKyAgZ2Jvb2xlYW4gICAgICAgIG9wdGlvbnNfdmFsaWQgPSBUUlVFOworCisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworCisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQgKCk7CisjZW5kaWYKKworICAvKiBDb25maWd1cmUgYW5kIHBhcnNlIG91ciBjb21tYW5kLWxpbmUgb3B0aW9ucyAqLworICBvcHRpb25fY29udGV4dCA9IGdfb3B0aW9uX2NvbnRleHRfbmV3IChOVUxMKTsKKyAgZ19vcHRpb25fY29udGV4dF9hZGRfbWFpbl9lbnRyaWVzIChvcHRpb25fY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25fZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgaWYgKGdfb3B0aW9uX2NvbnRleHRfcGFyc2UgKG9wdGlvbl9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyZ2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikgPT0gRkFMU0UpIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsICIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgIHJldHVybiAyNTU7CisgIH0KKyAgZ19vcHRpb25fY29udGV4dF9mcmVlIChvcHRpb25fY29udGV4dCk7CisKKyAgLyogVmFsaWRhdGUgdGhlIHBhcnNlZCBvcHRpb25zICovCisgIGlmIChzZXJ2ZXJfdHlwZV9vcHRpb24gIT0gTlVMTCAmJgorICAgICAgc3RybmNtcCAoc2VydmVyX3R5cGVfb3B0aW9uLCAic2ltcGxlIiwgNykgIT0gMCkgeworICAgIGZwcmludGYgKHN0ZGVyciwgIlVua25vd24gc2VydmVyIHR5cGUgJXNcbiIsIHByb3RvY29sX29wdGlvbik7CisgICAgb3B0aW9uc192YWxpZCA9IEZBTFNFOworICB9CisKKyAgaWYgKHByb3RvY29sX29wdGlvbiAhPSBOVUxMKSB7CisgICAgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgImNvbXBhY3QiLCA4KSA9PSAwKSB7CisgICAgICBwcm90b2NvbF9mYWN0b3J5X3R5cGUgPSBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlk7CisgICAgICBwcm90b2NvbF9uYW1lID0gImNvbXBhY3QiOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJtdWx0aSIsIDYpID09IDApIHsKKwlwcm90b2NvbF9uYW1lID0gImJpbmFyeTptdWx0aSI7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgIm11bHRpYyIsIDcpID09IDApIHsKKwlwcm90b2NvbF9mYWN0b3J5X3R5cGUgPSBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlk7CisJcHJvdG9jb2xfbmFtZSA9ICJjb21wYWN0Om11bHRpYyI7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgImJpbmFyeSIsIDcpICE9IDApIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVua25vd24gcHJvdG9jb2wgdHlwZSAlc1xuIiwgcHJvdG9jb2xfb3B0aW9uKTsKKyAgICAgIG9wdGlvbnNfdmFsaWQgPSBGQUxTRTsKKyAgICB9CisgIH0KKworICBpZiAodHJhbnNwb3J0X29wdGlvbiAhPSBOVUxMKSB7CisgICAgaWYgKHN0cm5jbXAgKHRyYW5zcG9ydF9vcHRpb24sICJmcmFtZWQiLCA3KSA9PSAwKSB7CisgICAgICB0cmFuc3BvcnRfZmFjdG9yeV90eXBlID0gVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZOworICAgICAgdHJhbnNwb3J0X25hbWUgPSAiZnJhbWVkIjsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RybmNtcCAodHJhbnNwb3J0X29wdGlvbiwgImJ1ZmZlcmVkIiwgOSkgIT0gMCkgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVW5rbm93biB0cmFuc3BvcnQgdHlwZSAlc1xuIiwgdHJhbnNwb3J0X29wdGlvbik7CisgICAgICBvcHRpb25zX3ZhbGlkID0gRkFMU0U7CisgICAgfQorICB9CisKKyAgaWYgKCFvcHRpb25zX3ZhbGlkKQorICAgIHJldHVybiAyNTQ7CisKKyAgLyogRXN0YWJsaXNoIGFsbCBvdXIgY29ubmVjdGlvbiBvYmplY3RzICovCisgIGhhbmRsZXIgICAgICAgICAgID0gZ19vYmplY3RfbmV3IChUWVBFX1RIUklGVF9URVNUX0hBTkRMRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworCisKKyAgaWYoc3Ryc3RyKHByb3RvY29sX25hbWUsICI6bXVsdGkiKSl7CisgICAgICAvKiBXaGVuIGEgbXVsdGlwbGV4ZWQgcHJvY2Vzc29yIGlzIGludm9sdmVkIHRoZSBoYW5kbGVyIGlzIG5vdAorICAgICAgICAgcmVnaXN0ZXJlZCBhcyB1c3VhbC4gV2UgY3JlYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZSByZWFsCisgICAgICAgICBwcm9jZXNzb3IgaXMgcmVnaXN0ZXJlZC4gTXVsdGlwbGUgcHJvY2Vzc29ycyBjYW4gYmUgcmVnaXN0ZXJlZAorICAgICAgICAgYXQgb25jZS4gVGhpcyBpcyB3aHkgd2UgZG9uJ3QgaGF2ZSBhIGNvbnN0cnVjdG9yIHByb3BlcnR5ICovCisgICAgICBwcm9jZXNzb3IgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUiwKKwkJCQkJIE5VTEwpOworCisgICAgICBoYW5kbGVyX3NlY29uZF9zZXJ2aWNlID0gZ19vYmplY3RfbmV3IChUWVBFX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVIsCisgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgcHJvY2Vzc29yX3Rlc3QgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1RIUklGVF9URVNUX1BST0NFU1NPUiwKKwkJCQkgICAgImhhbmRsZXIiLCBoYW5kbGVyLAorCQkJCSAgICBOVUxMKTsKKyAgICAgIHByb2Nlc3Nvcl9zZWNvbmRfc2VydmljZSA9ICAgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9TRUNPTkRfU0VSVklDRV9QUk9DRVNTT1IsCisJCQkJICAgICJoYW5kbGVyIiwgaGFuZGxlcl9zZWNvbmRfc2VydmljZSwKKwkJCQkgICAgTlVMTCk7CisKKyAgICAgIC8qIFdlIHJlZ2lzdGVyIGEgdGVzdCBwcm9jZXNzb3Igd2l0aCBNdWx0aXBsZXhlZCBuYW1lIFRocmlmdFRlc3QgKi8KKyAgICAgIGlmKCF0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3JlZ2lzdGVyX3Byb2Nlc3Nvcihwcm9jZXNzb3IsCisJCQkJCQkgICAgICAiVGhyaWZ0VGVzdCIsIHByb2Nlc3Nvcl90ZXN0LAorCQkJCQkJICAgICAgJmVycm9yKSl7CisJICAgIGdfbWVzc2FnZSAoInRocmlmdF9zZXJ2ZXJfc2VydmU6ICVzIiwKKwkgICAgICAgICAgICAgICBlcnJvciAhPSBOVUxMID8gZXJyb3ItPm1lc3NhZ2UgOiAiKG51bGwpIik7CisJICAgIGdfY2xlYXJfZXJyb3IgKCZlcnJvcik7CisgICAgICB9CisgICAgICAvKiBXZSByZWdpc3RlciBhIHNlY29uZCB0ZXN0IHByb2Nlc3NvciB3aXRoIE11bHRpcGxleGVkIG5hbWUgU2Vjb25kU2VydmljZQorICAgICAgICogd2UgYXJlIHJlc3BvbnNpYmxlIG9mIGZyZWVpbmcgdGhlIHByb2Nlc3NvciB3aGVuIGl0J3Mgbm90IHVzZWQgYW55bW9yZSAqLworICAgICAgaWYoIXRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcmVnaXN0ZXJfcHJvY2Vzc29yKHByb2Nlc3NvciwKKwkJCQkJCSAgICAgICJTZWNvbmRTZXJ2aWNlIiwgcHJvY2Vzc29yX3NlY29uZF9zZXJ2aWNlLAorCQkJCQkJICAgICAgJmVycm9yKSl7CisJICAgIGdfbWVzc2FnZSAoInRocmlmdF9zZXJ2ZXJfc2VydmU6ICVzIiwKKwkgICAgICAgICAgICAgICBlcnJvciAhPSBOVUxMID8gZXJyb3ItPm1lc3NhZ2UgOiAiKG51bGwpIik7CisJICAgIGdfY2xlYXJfZXJyb3IgKCZlcnJvcik7CisgICAgICB9CisKKyAgfWVsc2V7CisgICAgICBwcm9jZXNzb3IgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1RIUklGVF9URVNUX1BST0NFU1NPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFuZGxlciIsIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIH0KKyAgc2VydmVyX3RyYW5zcG9ydCAgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgdHJhbnNwb3J0X2ZhY3RvcnkgPSBnX29iamVjdF9uZXcgKHRyYW5zcG9ydF9mYWN0b3J5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICBpZiAoc3Ryc3RyIChwcm90b2NvbF9uYW1lLCAiY29tcGFjdCIpICE9IE5VTEwpIHsKKyAgICBwcm90b2NvbF9mYWN0b3J5ICA9IGdfb2JqZWN0X25ldyAocHJvdG9jb2xfZmFjdG9yeV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX2xpbWl0Iiwgc3RyaW5nX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGFpbmVyX2xpbWl0IiwgY29udGFpbmVyX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBwcm90b2NvbF9mYWN0b3J5ICA9IGdfb2JqZWN0X25ldyAocHJvdG9jb2xfZmFjdG9yeV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgfQorCisgIHNlcnZlciA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicHJvY2Vzc29yIiwgICAgICAgICAgICAgICAgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXJfdHJhbnNwb3J0IiwgICAgICAgICBzZXJ2ZXJfdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dF90cmFuc3BvcnRfZmFjdG9yeSIsICB0cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5IiwgdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0X3Byb3RvY29sX2ZhY3RvcnkiLCAgIHByb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dF9wcm90b2NvbF9mYWN0b3J5IiwgIHByb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgLyogSW5zdGFsbCBvdXIgU0lHSU5UIGhhbmRsZXIsIHdoaWNoIGhhbmRsZXMgQ3RybC1DIGJlaW5nIHByZXNzZWQgYnkgc3RvcHBpbmcKKyAgICAgdGhlIHNlcnZlciBncmFjZWZ1bGx5ICovCisgIG1lbXNldCAoJnNpZ2ludF9hY3Rpb24sIDAsIHNpemVvZiAoc2lnaW50X2FjdGlvbikpOworICBzaWdpbnRfYWN0aW9uLnNhX2hhbmRsZXIgPSBzaWdpbnRfaGFuZGxlcjsKKyAgc2lnaW50X2FjdGlvbi5zYV9mbGFncyA9IFNBX1JFU0VUSEFORDsKKyAgc2lnYWN0aW9uIChTSUdJTlQsICZzaWdpbnRfYWN0aW9uLCBOVUxMKTsKKworICBwcmludGYgKCJTdGFydGluZyBcIiVzXCIgc2VydmVyICglcy8lcykgbGlzdGVuIG9uOiAlZFxuIiwKKyAgICAgICAgICBzZXJ2ZXJfbmFtZSwKKyAgICAgICAgICB0cmFuc3BvcnRfbmFtZSwKKyAgICAgICAgICBwcm90b2NvbF9uYW1lLAorICAgICAgICAgIHBvcnQpOworICBmZmx1c2ggKHN0ZG91dCk7CisKKyAgLyogU2VydmUgY2xpZW50cyB1bnRpbCBTSUdJTlQgaXMgcmVjZWl2ZWQgKEN0cmwtQyBpcyBwcmVzc2VkKSAqLworICB0aHJpZnRfc2VydmVyX3NlcnZlIChzZXJ2ZXIsICZlcnJvcik7CisKKyAgLyogSWYgdGhlIHNlcnZlciBzdG9wcGVkIGZvciBhbnkgcmVhc29uIG90aGVyIHRoYW4gYmVpbmcgaW50ZXJydXB0ZWQgYnkgdGhlCisgICAgIHVzZXIsIHJlcG9ydCB0aGUgZXJyb3IgKi8KKyAgaWYgKCFzaWdpbnRfcmVjZWl2ZWQpIHsKKyAgICBnX21lc3NhZ2UgKCJ0aHJpZnRfc2VydmVyX3NlcnZlOiAlcyIsCisgICAgICAgICAgICAgICBlcnJvciAhPSBOVUxMID8gZXJyb3ItPm1lc3NhZ2UgOiAiKG51bGwpIik7CisgICAgZ19jbGVhcl9lcnJvciAoJmVycm9yKTsKKyAgfQorCisgIHB1dHMgKCJkb25lLiIpOworCisgIGdfb2JqZWN0X3VucmVmIChzZXJ2ZXIpOworICBnX29iamVjdF91bnJlZiAocHJvdG9jb2xfZmFjdG9yeSk7CisgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnRfZmFjdG9yeSk7CisgIGdfb2JqZWN0X3VucmVmIChzZXJ2ZXJfdHJhbnNwb3J0KTsKKyAgZ19vYmplY3RfdW5yZWYgKHByb2Nlc3Nvcik7CisgIGdfb2JqZWN0X3VucmVmIChoYW5kbGVyKTsKKyAgaWYoaGFuZGxlcl9zZWNvbmRfc2VydmljZSl7CisgICAgICBnX29iamVjdF91bnJlZiAoaGFuZGxlcl9zZWNvbmRfc2VydmljZSk7CisgIH0KKyAgaWYocHJvY2Vzc29yX3Rlc3QpeworICAgICAgZ19vYmplY3RfdW5yZWYgKHByb2Nlc3Nvcl90ZXN0KTsKKyAgfQorICBpZihwcm9jZXNzb3Jfc2Vjb25kX3NlcnZpY2UpeworICAgICAgZ19vYmplY3RfdW5yZWYgKHByb2Nlc3Nvcl9zZWNvbmRfc2VydmljZSk7CisgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5jIGIvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZhYzdiYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oPgorCisjaW5jbHVkZSAidGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaCIKKworLyogQSBoYW5kbGVyIHRoYXQgaW1wbGVtZW50cyB0aGUgVFRlc3RTZWNvbmRTZXJ2aWNlSWYgaW50ZXJmYWNlICovCisKK0dfREVGSU5FX1RZUEUgKFNlY29uZFNlcnZpY2VIYW5kbGVyLAorICAgICAgICAgICAgICAgc2Vjb25kX3NlcnZpY2VfaGFuZGxlciwKKwkgICAgICAgVF9URVNUX1RZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUik7CisKKworZ2Jvb2xlYW4KK3NlY29uZF9zZXJ2aWNlX2hhbmRsZXJfc2Vjb25kdGVzdF9zdHJpbmcgKFRUZXN0U2Vjb25kU2VydmljZUlmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAgICAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgZ2NoYXIgYnVmZmVyWzI1Nl07CisKKyAgcHJpbnRmICgidGVzdFNlY29uZFNlcnZpY2VNdWx0aXBsZXhTZWNvbmRUZXN0U3RyaW5nKFwiJXNcIilcbiIsIHRoaW5nKTsKKyAgc25wcmludGYoYnVmZmVyLCAyNTUsICJ0ZXN0U3RyaW5nKFwiJXNcIikiLCB0aGluZyk7CisgICpfcmV0dXJuID0gZ19zdHJkdXAgKGJ1ZmZlcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitzZWNvbmRfc2VydmljZV9oYW5kbGVyX2luaXQgKFNlY29uZFNlcnZpY2VIYW5kbGVyICpzZWxmKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoc2VsZik7Cit9CisKK3N0YXRpYyB2b2lkCitzZWNvbmRfc2VydmljZV9oYW5kbGVyX2NsYXNzX2luaXQgKFNlY29uZFNlcnZpY2VIYW5kbGVyQ2xhc3MgKmtsYXNzKQoreworICBUVGVzdFNlY29uZFNlcnZpY2VIYW5kbGVyQ2xhc3MgKmJhc2VfY2xhc3MgPQorICAgICAgVF9URVNUX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVJfQ0xBU1MgKGtsYXNzKTsKKworCisgIGJhc2VfY2xhc3MtPnNlY29uZHRlc3Rfc3RyaW5nID0KKyAgICAgIHNlY29uZF9zZXJ2aWNlX2hhbmRsZXJfc2Vjb25kdGVzdF9zdHJpbmc7CisKK30KZGlmZiAtLWdpdCBhL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5oIGIvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlMDQ4YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfU0VDT05EX1NFUlZJQ0VfSEFORExFUl9ICisjZGVmaW5lIF9TRUNPTkRfU0VSVklDRV9IQU5ETEVSX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIi4uL2dlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmgiCisKK0dfQkVHSU5fREVDTFMKKworLyogQSBoYW5kbGVyIHRoYXQgaW1wbGVtZW50cyB0aGUgVFRlc3RTZWNvbmRTZXJ2aWNlSWYgaW50ZXJmYWNlICovCisKKyNkZWZpbmUgVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSIChzZWNvbmRfc2VydmljZV9oYW5kbGVyX2dldF90eXBlICgpKQorCisjZGVmaW5lIFNFQ09ORF9TRVJWSUNFX0hBTkRMRVIob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVIsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vjb25kU2VydmljZUhhbmRsZXIpKQorI2RlZmluZSBJU19TRUNPTkRfU0VSVklDRV9IQU5ETEVSKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSKSkKKyNkZWZpbmUgU0VDT05EX1NFUlZJQ0VfSEFORExFUl9DTEFTUyhjKSAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzKSkKKyNkZWZpbmUgSVNfU0VDT05EX1NFUlZJQ0VfSEFORExFUl9DTEFTUyhjKSAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSKSkKKyNkZWZpbmUgU0VDT05EX1NFUlZJQ0VfSEFORExFUl9HRVRfQ0xBU1Mob2JqKSAgICAgICAgICAgICAgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY29uZFNlcnZpY2VIYW5kbGVyQ2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfU2Vjb25kU2VydmljZUhhbmRsZXIgU2Vjb25kU2VydmljZUhhbmRsZXI7Cit0eXBlZGVmIHN0cnVjdCBfU2Vjb25kU2VydmljZUhhbmRsZXJDbGFzcyBTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzOworCitzdHJ1Y3QgX1NlY29uZFNlcnZpY2VIYW5kbGVyIHsKKyAgVFRlc3RTZWNvbmRTZXJ2aWNlSGFuZGxlciBwYXJlbnQ7Cit9OworCitzdHJ1Y3QgX1NlY29uZFNlcnZpY2VIYW5kbGVyQ2xhc3MgeworICBUVGVzdFNlY29uZFNlcnZpY2VIYW5kbGVyQ2xhc3MgcGFyZW50OworCit9OworCisvKiBVc2VkIGJ5IFNFQ09ORF9TRVJWSUNFX0hBTkRMRVJfR0VUX1RZUEUgKi8KK0dUeXBlIHNlY29uZF9zZXJ2aWNlX2hhbmRsZXJfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBzZWNvbmRfc2VydmljZV9oYW5kbGVyX2JsYWhfYmxhaCAoVFRlc3RTZWNvbmRTZXJ2aWNlSWYgKmlmYWNlLCBHRXJyb3IgKiplcnJvcik7CitnYm9vbGVhbiBzZWNvbmRfc2VydmljZV9oYW5kbGVyX3NlY29uZHRlc3Rfc3RyaW5nICAgICAgICAgIChUVGVzdFNlY29uZFNlcnZpY2VJZiAqaWZhY2UsIGdjaGFyICoqIF9yZXR1cm4sIGNvbnN0IGdjaGFyICogdGhpbmcsIEdFcnJvciAqKmVycm9yKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9TRUNPTkRfU0VSVklDRV9IQU5ETEVSX0ggKi8KZGlmZiAtLWdpdCBhL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmMgYi90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOGJjYjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5jCkBAIC0wLDAgKzEsODM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaD4KKworI2luY2x1ZGUgInRocmlmdF90ZXN0X2hhbmRsZXIuaCIKKworLyogQSBoYW5kbGVyIHRoYXQgaW1wbGVtZW50cyB0aGUgVFRlc3RUaHJpZnRUZXN0SWYgaW50ZXJmYWNlICovCisKK0dfREVGSU5FX1RZUEUgKFRocmlmdFRlc3RIYW5kbGVyLAorICAgICAgICAgICAgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlciwKKyAgICAgICAgICAgICAgIFRfVEVTVF9UWVBFX1RIUklGVF9URVNUX0hBTkRMRVIpOworCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X3ZvaWQgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0Vm9pZCgpXG4iKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9zdHJpbmcgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAgICAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0U3RyaW5nKFwiJXNcIilcbiIsIHRoaW5nKTsKKyAgKl9yZXR1cm4gPSBnX3N0cmR1cCAodGhpbmcpOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2Jvb2wgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Jvb2xlYW4gICAgICAgICAgICpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdib29sZWFuICAgICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0Qm9vbCglcylcbiIsIHRoaW5nID8gInRydWUiIDogImZhbHNlIik7CisgICpfcmV0dXJuID0gdGhpbmc7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfYnl0ZSAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50OCAgICAgICAgICAgICAgKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDggICAgICAgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RCeXRlKCVkKVxuIiwgKGdpbnQpdGhpbmcpOworICAqX3JldHVybiA9IHRoaW5nOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2kzMiAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMiAgICAgICAgICAgICAqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgICAgICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RJMzIoJWQpXG4iLCB0aGluZyk7CisgICpfcmV0dXJuID0gdGhpbmc7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfaTY0IChUVGVzdFRocmlmdFRlc3RJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDY0ICAgICAgICAgICAgICpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDY0ICAgICAgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcHJpbnRmICgidGVzdEk2NCglIiBQUklkNjQgIilcbiIsIHRoaW5nKTsKKyAgKl9yZXR1cm4gPSB0aGluZzsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9kb3VibGUgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlICAgICAgICAgICAgKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZG91YmxlICAgICAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0RG91YmxlKCVmKVxuIiwgdGhpbmcpOworICAqX3JldHVybiA9IHRoaW5nOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbiAKK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9iaW5hcnkgKFRUZXN0VGhyaWZ0VGVzdElmICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdCeXRlQXJyYXkgKiogX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdCeXRlQXJyYXkgKiB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RCaW5hcnkoKVxuIik7ICAvLyBUT0RPOiBoZXggb3V0cHV0CisgIGdfYnl0ZV9hcnJheV9yZWYoKEdCeXRlQXJyYXkgKil0aGluZyk7CisgICpfcmV0dXJuID0gKEdCeXRlQXJyYXkgKil0aGluZzsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9zdHJ1Y3QgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFh0cnVjdCAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdFh0cnVjdCAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgZ2NoYXIgKnN0cmluZ190aGluZyA9IE5VTEw7CisgIGdpbnQgICBieXRlX3RoaW5nOworICBnaW50ICAgaTMyX3RoaW5nOworICBnaW50NjQgaTY0X3RoaW5nOworCisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgZ19vYmplY3RfZ2V0ICgoVFRlc3RYdHJ1Y3QgKil0aGluZywKKyAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgJnN0cmluZ190aGluZywKKyAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgJmJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgICZpMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgICZpNjRfdGhpbmcsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgcHJpbnRmICgidGVzdFN0cnVjdCh7XCIlc1wiLCAlZCwgJWQsICUiIFBSSWQ2NCAifSlcbiIsCisgICAgICAgICAgc3RyaW5nX3RoaW5nLAorICAgICAgICAgIChnaW50KWJ5dGVfdGhpbmcsCisgICAgICAgICAgaTMyX3RoaW5nLAorICAgICAgICAgIGk2NF90aGluZyk7CisKKyAgZ19vYmplY3Rfc2V0ICgqX3JldHVybiwKKyAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgc3RyaW5nX3RoaW5nLAorICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICBieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICBpMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgIGk2NF90aGluZywKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBpZiAoc3RyaW5nX3RoaW5nICE9IE5VTEwpCisgICAgZ19mcmVlIChzdHJpbmdfdGhpbmcpOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X25lc3QgKFRUZXN0VGhyaWZ0VGVzdElmICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WHRydWN0MiAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3RYdHJ1Y3QyICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICoqZXJyb3IpCit7CisgIGdjaGFyICppbm5lcl9zdHJpbmdfdGhpbmcgPSBOVUxMOworICBnaW50ICAgYnl0ZV90aGluZywgaW5uZXJfYnl0ZV90aGluZzsKKyAgZ2ludCAgIGkzMl90aGluZywgaW5uZXJfaTMyX3RoaW5nOworICBnaW50NjQgaW5uZXJfaTY0X3RoaW5nOworICBUVGVzdFh0cnVjdCAqc3RydWN0X3RoaW5nOworCisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgZ19vYmplY3RfZ2V0ICgoVFRlc3RYdHJ1Y3QyICopdGhpbmcsCisgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgICZieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICJzdHJ1Y3RfdGhpbmciLCAmc3RydWN0X3RoaW5nLAorICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICAmaTMyX3RoaW5nLAorICAgICAgICAgICAgICAgIE5VTEwpOworICBnX29iamVjdF9nZXQgKHN0cnVjdF90aGluZywKKyAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgJmlubmVyX3N0cmluZ190aGluZywKKyAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgJmlubmVyX2J5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgICZpbm5lcl9pMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgICZpbm5lcl9pNjRfdGhpbmcsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgcHJpbnRmICgidGVzdE5lc3QoeyVkLCB7XCIlc1wiLCAlZCwgJWQsICUiIFBSSWQ2NCAifSwgJWR9KVxuIiwKKyAgICAgICAgICBieXRlX3RoaW5nLAorICAgICAgICAgIGlubmVyX3N0cmluZ190aGluZywKKyAgICAgICAgICBpbm5lcl9ieXRlX3RoaW5nLAorICAgICAgICAgIGlubmVyX2kzMl90aGluZywKKyAgICAgICAgICBpbm5lcl9pNjRfdGhpbmcsCisgICAgICAgICAgaTMyX3RoaW5nKTsKKworICBnX29iamVjdF9zZXQgKCpfcmV0dXJuLAorICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICBieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICJzdHJ1Y3RfdGhpbmciLCBzdHJ1Y3RfdGhpbmcsCisgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgIGkzMl90aGluZywKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBpZiAoaW5uZXJfc3RyaW5nX3RoaW5nICE9IE5VTEwpCisgICAgZ19mcmVlIChpbm5lcl9zdHJpbmdfdGhpbmcpOworICBnX29iamVjdF91bnJlZiAoc3RydWN0X3RoaW5nKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9tYXAgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSGFzaFRhYmxlICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHSGFzaFRhYmxlICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgR0hhc2hUYWJsZUl0ZXIgaGFzaF90YWJsZV9pdGVyOworICBncG9pbnRlciBrZXk7CisgIGdwb2ludGVyIHZhbHVlOworICBnYm9vbGVhbiBmaXJzdCA9IFRSVUU7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0TWFwKHsiKTsKKyAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmhhc2hfdGFibGVfaXRlciwgKEdIYXNoVGFibGUgKil0aGluZyk7CisgIHdoaWxlIChnX2hhc2hfdGFibGVfaXRlcl9uZXh0ICgmaGFzaF90YWJsZV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICBnaW50MzIgKm5ld19rZXk7CisgICAgZ2ludDMyICpuZXdfdmFsdWU7CisKKyAgICBpZiAoZmlyc3QpCisgICAgICBmaXJzdCA9IEZBTFNFOworICAgIGVsc2UKKyAgICAgIHByaW50ZiAoIiwgIik7CisKKyAgICBwcmludGYgKCIlZCA9PiAlZCIsICooZ2ludDMyICopa2V5LCAqKGdpbnQzMiAqKXZhbHVlKTsKKworICAgIG5ld19rZXkgPSBnX21hbGxvYyAoc2l6ZW9mICpuZXdfa2V5KTsKKyAgICAqbmV3X2tleSA9ICooZ2ludDMyICopa2V5OworICAgIG5ld192YWx1ZSA9IGdfbWFsbG9jIChzaXplb2YgKm5ld192YWx1ZSk7CisgICAgKm5ld192YWx1ZSA9ICooZ2ludDMyICopdmFsdWU7CisgICAgZ19oYXNoX3RhYmxlX2luc2VydCAoKl9yZXR1cm4sIG5ld19rZXksIG5ld192YWx1ZSk7CisgIH0KKyAgcHJpbnRmICgifSlcbiIpOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X3N0cmluZ19tYXAgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0hhc2hUYWJsZSAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdIYXNoVGFibGUgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgR0hhc2hUYWJsZUl0ZXIgaGFzaF90YWJsZV9pdGVyOworICBncG9pbnRlciBrZXk7CisgIGdwb2ludGVyIHZhbHVlOworICBnYm9vbGVhbiBmaXJzdCA9IFRSVUU7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0U3RyaW5nTWFwKHsiKTsKKyAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmhhc2hfdGFibGVfaXRlciwgKEdIYXNoVGFibGUgKil0aGluZyk7CisgIHdoaWxlIChnX2hhc2hfdGFibGVfaXRlcl9uZXh0ICgmaGFzaF90YWJsZV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICBnY2hhciAqbmV3X2tleTsKKyAgICBnY2hhciAqbmV3X3ZhbHVlOworCisgICAgaWYgKGZpcnN0KQorICAgICAgZmlyc3QgPSBGQUxTRTsKKyAgICBlbHNlCisgICAgICBwcmludGYgKCIsICIpOworCisgICAgcHJpbnRmICgiJXMgPT4gJXMiLCAoZ2NoYXIgKilrZXksIChnY2hhciAqKXZhbHVlKTsKKworICAgIG5ld19rZXkgPSBnX3N0cmR1cCAoKGdjaGFyICopa2V5KTsKKyAgICBuZXdfdmFsdWUgPSBnX3N0cmR1cCAoKGdjaGFyICopdmFsdWUpOworICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKCpfcmV0dXJuLCBuZXdfa2V5LCBuZXdfdmFsdWUpOworICB9CisgIHByaW50ZiAoIn0pXG4iKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9zZXQgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSGFzaFRhYmxlICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHSGFzaFRhYmxlICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgR0hhc2hUYWJsZUl0ZXIgaGFzaF90YWJsZV9pdGVyOworICBncG9pbnRlciBrZXk7CisgIGdib29sZWFuIGZpcnN0ID0gVFJVRTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RTZXQoeyIpOworICBnX2hhc2hfdGFibGVfaXRlcl9pbml0ICgmaGFzaF90YWJsZV9pdGVyLCAoR0hhc2hUYWJsZSAqKXRoaW5nKTsKKyAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZoYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpIHsKKyAgICBnaW50MzIgKm5ld19rZXk7CisKKyAgICBpZiAoZmlyc3QpCisgICAgICBmaXJzdCA9IEZBTFNFOworICAgIGVsc2UKKyAgICAgIHByaW50ZiAoIiwgIik7CisKKyAgICBwcmludGYgKCIlZCIsICooZ2ludDMyICopa2V5KTsKKworICAgIG5ld19rZXkgPSBnX21hbGxvYyAoc2l6ZW9mICpuZXdfa2V5KTsKKyAgICAqbmV3X2tleSA9ICooZ2ludDMyICopa2V5OworICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKCpfcmV0dXJuLCBuZXdfa2V5LCBOVUxMKTsKKyAgfQorICBwcmludGYgKCJ9KVxuIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfbGlzdCAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQXJyYXkgICAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0FycmF5ICAgICAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBndWludCBpOworICBnYm9vbGVhbiBmaXJzdCA9IFRSVUU7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0TGlzdCh7Iik7CisgIGZvciAoaSA9IDA7IGkgPCB0aGluZy0+bGVuOyBpICs9IDEpIHsKKyAgICBnaW50MzIgdmFsdWU7CisgICAgZ2ludDMyICpuZXdfdmFsdWU7CisKKyAgICBpZiAoZmlyc3QpCisgICAgICBmaXJzdCA9IEZBTFNFOworICAgIGVsc2UKKyAgICAgIHByaW50ZiAoIiwgIik7CisKKyAgICB2YWx1ZSA9IGdfYXJyYXlfaW5kZXggKHRoaW5nLCBnaW50MzIsIGkpOworICAgIHByaW50ZiAoIiVkIiwgdmFsdWUpOworCisgICAgbmV3X3ZhbHVlID0gZ19tYWxsb2MgKHNpemVvZiAqbmV3X3ZhbHVlKTsKKyAgICAqbmV3X3ZhbHVlID0gdmFsdWU7CisgICAgZ19hcnJheV9hcHBlbmRfdmFsICgqX3JldHVybiwgKm5ld192YWx1ZSk7CisgIH0KKyAgcHJpbnRmICgifSlcbiIpOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2VudW0gKFRUZXN0VGhyaWZ0VGVzdElmICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0TnVtYmVyeiAgICAgICAgKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3ROdW1iZXJ6ICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcHJpbnRmICgidGVzdEVudW0oJWQpXG4iLCB0aGluZyk7CisgICpfcmV0dXJuID0gdGhpbmc7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfdHlwZWRlZiAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFVzZXJJZCAgICAgICAgKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3RVc2VySWQgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RUeXBlZGVmKCUiIFBSSWQ2NCAiKVxuIiwgdGhpbmcpOworICAqX3JldHVybiA9IHRoaW5nOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X21hcF9tYXAgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0hhc2hUYWJsZSAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgICAgICAgaGVsbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgR0hhc2hUYWJsZSAqcG9zaXRpdmU7CisgIEdIYXNoVGFibGUgKm5lZ2F0aXZlOworICBnaW50MzIgKmtleTsKKyAgZ2ludDMyICp2YWx1ZTsKKyAgZ3VpbnQgaTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RNYXBNYXAoJWQpXG4iLCBoZWxsbyk7CisKKyAgcG9zaXRpdmUgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfaW50X2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ludF9lcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZnJlZSk7CisgIG5lZ2F0aXZlID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChnX2ludF9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19pbnRfZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUpOworCisgIGZvciAoaSA9IDE7IGkgPCA1OyBpICs9IDEpIHsKKyAgICBrZXkgPSBnX21hbGxvYyAoc2l6ZW9mICprZXkpOworICAgIHZhbHVlID0gZ19tYWxsb2MgKHNpemVvZiAqdmFsdWUpOworICAgICprZXkgPSBpOworICAgICp2YWx1ZSA9IGk7CisgICAgZ19oYXNoX3RhYmxlX2luc2VydCAocG9zaXRpdmUsIGtleSwgdmFsdWUpOworCisgICAga2V5ID0gZ19tYWxsb2MgKHNpemVvZiAqa2V5KTsKKyAgICB2YWx1ZSA9IGdfbWFsbG9jIChzaXplb2YgKnZhbHVlKTsKKyAgICAqa2V5ID0gLWk7CisgICAgKnZhbHVlID0gLWk7CisgICAgZ19oYXNoX3RhYmxlX2luc2VydCAobmVnYXRpdmUsIGtleSwgdmFsdWUpOworICB9CisKKyAga2V5ID0gZ19tYWxsb2MgKHNpemVvZiAqa2V5KTsKKyAgKmtleSA9IDQ7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKCpfcmV0dXJuLCBrZXksIHBvc2l0aXZlKTsKKworICBrZXkgPSBnX21hbGxvYyAoc2l6ZW9mICprZXkpOworICAqa2V5ID0gLTQ7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKCpfcmV0dXJuLCBrZXksIG5lZ2F0aXZlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9pbnNhbml0eSAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSGFzaFRhYmxlICAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3RJbnNhbml0eSAgKmFyZ3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpCit7CisgIFRUZXN0WHRydWN0ICp4dHJ1Y3RfaW47CisKKyAgZ2NoYXIgKnN0cmluZ190aGluZyA9IE5VTEw7CisgIGdpbnQgICBieXRlX3RoaW5nOworICBnaW50ICAgaTMyX3RoaW5nOworICBnaW50NjQgaTY0X3RoaW5nOworCisgIEdQdHJBcnJheSAqeHRydWN0czsKKworICBUVGVzdEluc2FuaXR5ICpsb29uZXk7CisKKyAgR0hhc2hUYWJsZSAqdXNlcl9tYXA7CisgIEdIYXNoVGFibGUgKmZpcnN0X21hcDsKKyAgR0hhc2hUYWJsZSAqc2Vjb25kX21hcDsKKworICBHSGFzaFRhYmxlSXRlciBoYXNoX3RhYmxlX2l0ZXI7CisgIEdIYXNoVGFibGVJdGVyIGlubmVyX2hhc2hfdGFibGVfaXRlcjsKKyAgR0hhc2hUYWJsZUl0ZXIgdXNlcl9tYXBfaXRlcjsKKworICBncG9pbnRlciBrZXk7CisgIGdwb2ludGVyIHZhbHVlOworCisgIFRUZXN0VXNlcklkICp1c2VyX2lkOworCisgIGd1aW50IGk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0SW5zYW5pdHkoKVxuIik7CisKKyAgZmlyc3RfbWFwID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChnX2RpcmVjdF9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZGlyZWN0X2VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19vYmplY3RfdW5yZWYpOworICBzZWNvbmRfbWFwID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChnX2RpcmVjdF9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2RpcmVjdF9lcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19vYmplY3RfdW5yZWYpOworCisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGZpcnN0X21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgR0lOVF9UT19QT0lOVEVSIChUX1RFU1RfTlVNQkVSWl9UV08pLAorICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpYXJndW1lbnQpOworICBnX2hhc2hfdGFibGVfaW5zZXJ0IChmaXJzdF9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgIEdJTlRfVE9fUE9JTlRFUiAoVF9URVNUX05VTUJFUlpfVEhSRUUpLAorICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpYXJndW1lbnQpOworCisgIC8qIEluY3JlbWVudCBhcmd1bWVudCdzIHJlZiBjb3VudCBieSB0d28gYmVjYXVzZSBmaXJzdF9tYXAgbm93IGhvbGRzCisgICAgIHR3byByZWZlcmVuY2VzIHRvIGl0IGFuZCB0aGUgY2FsbGVyIGlzIG5vdCBhd2FyZSB3ZSBoYXZlIG1hZGUgYW55CisgICAgIGFkZGl0aW9uYWwgcmVmZXJlbmNlcyB0byBhcmd1bWVudC4gIChUaGF0IGlzLCBjYWxsZXIgb3ducyBhcmd1bWVudAorICAgICBhbmQgd2lsbCB1bnJlZiBpdCBleHBsaWNpdGx5IGluIGFkZGl0aW9uIHRvIHVucmVmLWluZyAqX3JldHVybi4pCisKKyAgICAgV2UgZG8gdGhpcyBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgY29weSBvZiBhcmd1bWVudCBpbiBvcmRlciB0byBtaW1pYworICAgICB0aGUgQysrIGltcGxlbWVudGF0aW9uIChhbmQgc2luY2UsIGZyYW5rbHksIHRoZSB3b3JsZCBuZWVkcyBsZXNzCisgICAgIGFyZ3VtZW50LCBub3QgbW9yZSkuICovCisgIGdfb2JqZWN0X3JlZiAoKGdwb2ludGVyKWFyZ3VtZW50KTsKKyAgZ19vYmplY3RfcmVmICgoZ3BvaW50ZXIpYXJndW1lbnQpOworCisgIGxvb25leSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfSU5TQU5JVFksIE5VTEwpOworICBnX2hhc2hfdGFibGVfaW5zZXJ0IChzZWNvbmRfbWFwLAorICAgICAgICAgICAgICAgICAgICAgICBHSU5UX1RPX1BPSU5URVIgKFRfVEVTVF9OVU1CRVJaX1NJWCksCisgICAgICAgICAgICAgICAgICAgICAgIGxvb25leSk7CisKKyAgdXNlcl9pZCA9IGdfbWFsbG9jIChzaXplb2YgKnVzZXJfaWQpOworICAqdXNlcl9pZCA9IDE7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKCpfcmV0dXJuLCB1c2VyX2lkLCBmaXJzdF9tYXApOworCisgIHVzZXJfaWQgPSBnX21hbGxvYyAoc2l6ZW9mICp1c2VyX2lkKTsKKyAgKnVzZXJfaWQgPSAyOworICBnX2hhc2hfdGFibGVfaW5zZXJ0ICgqX3JldHVybiwgdXNlcl9pZCwgc2Vjb25kX21hcCk7CisKKyAgcHJpbnRmICgicmV0dXJuIik7CisgIHByaW50ZiAoIiA9IHsiKTsKKyAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmhhc2hfdGFibGVfaXRlciwgKl9yZXR1cm4pOworICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJmhhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKSB7CisgICAgcHJpbnRmICgiJSIgUFJJZDY0ICIgPT4geyIsICooVFRlc3RVc2VySWQgKilrZXkpOworCisgICAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmlubmVyX2hhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR0hhc2hUYWJsZSAqKXZhbHVlKTsKKyAgICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJmlubmVyX2hhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkgeworICAgICAgcHJpbnRmICgiJWQgPT4geyIsIChUVGVzdE51bWJlcnopa2V5KTsKKworICAgICAgZ19vYmplY3RfZ2V0ICgoVFRlc3RJbnNhbml0eSAqKXZhbHVlLAorICAgICAgICAgICAgICAgICAgICAidXNlck1hcCIsICZ1c2VyX21hcCwKKyAgICAgICAgICAgICAgICAgICAgInh0cnVjdHMiLCAmeHRydWN0cywKKyAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgIHByaW50ZiAoInsiKTsKKyAgICAgIGdfaGFzaF90YWJsZV9pdGVyX2luaXQgKCZ1c2VyX21hcF9pdGVyLCB1c2VyX21hcCk7CisgICAgICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJnVzZXJfbWFwX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKSB7CisgICAgICAgIHByaW50ZiAoIiVkID0+ICUiIFBSSWQ2NCAiLCAiLAorICAgICAgICAgICAgICAgIChUVGVzdE51bWJlcnopa2V5LAorICAgICAgICAgICAgICAgICooVFRlc3RVc2VySWQgKil2YWx1ZSk7CisgICAgICB9CisgICAgICBwcmludGYgKCJ9LCAiKTsKKyAgICAgIGdfaGFzaF90YWJsZV91bnJlZiAodXNlcl9tYXApOworCisgICAgICBwcmludGYgKCJ7Iik7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgeHRydWN0cy0+bGVuOyArK2kpIHsKKyAgICAgICAgeHRydWN0X2luID0gZ19wdHJfYXJyYXlfaW5kZXggKHh0cnVjdHMsIGkpOworICAgICAgICBnX29iamVjdF9nZXQgKHh0cnVjdF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgJnN0cmluZ190aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgJmJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgICZpMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgICZpNjRfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgcHJpbnRmICgie1wiJXNcIiwgJWQsICVkLCAlIiBQUklkNjQgIn0sICIsCisgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nLAorICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgaTMyX3RoaW5nLAorICAgICAgICAgICAgICAgIGk2NF90aGluZyk7CisgICAgICB9CisgICAgICBwcmludGYgKCJ9Iik7CisgICAgICBnX3B0cl9hcnJheV91bnJlZiAoeHRydWN0cyk7CisKKyAgICAgIHByaW50ZiAoIn0sICIpOworICAgIH0KKyAgICBwcmludGYgKCJ9LCAiKTsKKyAgfQorICBwcmludGYgKCJ9XG4iKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9tdWx0aSAoVFRlc3RUaHJpZnRUZXN0SWYgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WHRydWN0ICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQ4ICAgICAgICAgIGFyZzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgICAgICAgIGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQ2NCAgICAgICAgIGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdIYXNoVGFibGUgICAgKmFyZzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0TnVtYmVyeiAgIGFyZzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0VXNlcklkICAgIGFyZzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoYXJnMyk7CisgIFRIUklGVF9VTlVTRURfVkFSIChhcmc0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGFyZzUpOworCisgIHByaW50ZiAoInRlc3RNdWx0aSgpXG4iKTsKKworICBnX29iamVjdF9zZXQgKCpfcmV0dXJuLAorICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCBnX3N0cmR1cCAoIkhlbGxvMiIpLAorICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICBhcmcwLAorICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICBhcmcxLAorICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICBhcmcyLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2V4Y2VwdGlvbiAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICAgICAgICAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYY2VwdGlvbiAgICAgKiplcnIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKworICBUVGVzdFh0cnVjdCAqeHRydWN0OworICBnYm9vbGVhbiByZXN1bHQ7CisKKyAgcHJpbnRmICgidGVzdEV4Y2VwdGlvbiglcylcbiIsIGFyZyk7CisKKyAgLyogVW5saWtlIGFyZ3VtZW50IG9iamVjdHMsIGV4Y2VwdGlvbiBvYmplY3RzIGFyZSBub3QgcHJlLWNyZWF0ZWQgKi8KKyAgZ19hc3NlcnQgKCplcnIxID09IE5VTEwpOworCisgIGlmIChzdHJuY21wIChhcmcsICJYY2VwdGlvbiIsIDkpID09IDApIHsKKyAgICAvKiAiVGhyb3ciIGEgY3VzdG9tIGV4Y2VwdGlvbjogU2V0IHRoZSBjb3JyZXNwb25kaW5nIGV4Y2VwdGlvbgorICAgICAgIGFyZ3VtZW50LCBzZXQgKmVycm9yIHRvIE5VTEwgYW5kIHJldHVybiBGQUxTRSAqLworICAgICplcnIxID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YQ0VQVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yQ29kZSIsIDEwMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiwgICBnX3N0cmR1cCAoYXJnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgKmVycm9yID0gTlVMTDsKKyAgICByZXN1bHQgPSBGQUxTRTsKKyAgfQorICBlbHNlIGlmIChzdHJuY21wIChhcmcsICJURXhjZXB0aW9uIiwgMTEpID09IDApIHsKKyAgICAvKiAiVGhyb3ciIGEgZ2VuZXJpYyBURXhjZXB0aW9uIChUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbik6IFNldAorICAgICAgIGFsbCBleGNlcHRpb24gYXJndW1lbnRzIHRvIE5VTEwsIHNldCAqZXJyb3IgYW5kIHJldHVybiBGQUxTRSAqLworICAgICplcnIxID0gTlVMTDsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgIHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fZXJyb3JfcXVhcmsgKCksCisgICAgICAgICAgICAgICAgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgIkRlZmF1bHQgVEV4Y2VwdGlvbi4iKTsKKyAgICByZXN1bHQgPSBGQUxTRTsKKyAgfQorICBlbHNlIHsKKyAgICAqZXJyMSA9IE5VTEw7CisgICAgKmVycm9yID0gTlVMTDsKKworICAgIC8qIFRoaXMgY29kZSBpcyBkdXBsaWNhdGVkIGZyb20gdGhlIEMrKyB0ZXN0IHN1aXRlLCB0aG91Z2ggaXQKKyAgICAgICBhcHBlYXJzIHRvIHNlcnZlIG5vIHB1cnBvc2UgKi8KKyAgICB4dHJ1Y3QgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCBnX3N0cmR1cCAoYXJnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGdfb2JqZWN0X3VucmVmICh4dHJ1Y3QpOworCisgICAgcmVzdWx0ID0gVFJVRTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfbXVsdGlfZXhjZXB0aW9uIChUVGVzdFRocmlmdFRlc3RJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYdHJ1Y3QgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICphcmcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICphcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYY2VwdGlvbiAgICAgKiplcnIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYY2VwdGlvbjIgICAgKiplcnIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBUVGVzdFh0cnVjdCAqc3RydWN0X3RoaW5nOworICBnYm9vbGVhbiByZXN1bHQ7CisKKyAgcHJpbnRmICgidGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcylcbiIsIGFyZzAsIGFyZzEpOworCisgIGdfYXNzZXJ0ICgqZXJyMSA9PSBOVUxMKTsKKyAgZ19hc3NlcnQgKCplcnIyID09IE5VTEwpOworCisgIGlmIChzdHJuY21wIChhcmcwLCAiWGNlcHRpb24iLCA4KSA9PSAwICYmIHN0cmxlbihhcmcwKSA9PSA4KSB7CisgICAgKmVycjEgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hDRVBUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JDb2RlIiwgMTAwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiLCAgIGdfc3RyZHVwICgiVGhpcyBpcyBhbiBYY2VwdGlvbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICByZXN1bHQgPSBGQUxTRTsKKyAgfQorICBlbHNlIGlmIChzdHJuY21wIChhcmcwLCAiWGNlcHRpb24yIiwgOSkgPT0gMCkgeworICAgICplcnIyID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YQ0VQVElPTjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvckNvZGUiLCAyMDAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgIGdfb2JqZWN0X2dldCAoKmVycjIsCisgICAgICAgICAgICAgICAgICAic3RydWN0X3RoaW5nIiwgJnN0cnVjdF90aGluZywKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGdfb2JqZWN0X3NldCAoc3RydWN0X3RoaW5nLAorICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsIGdfc3RyZHVwICgiVGhpcyBpcyBhbiBYY2VwdGlvbjIiKSwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGdfb2JqZWN0X3NldCAoKmVycjIsCisgICAgICAgICAgICAgICAgICAic3RydWN0X3RoaW5nIiwgc3RydWN0X3RoaW5nLAorICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHN0cnVjdF90aGluZyk7CisKKyAgICByZXN1bHQgPSBGQUxTRTsKKyAgfQorICBlbHNlIHsKKyAgICBnX29iamVjdF9zZXQgKCpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsIGdfc3RyZHVwIChhcmcxKSwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIHJlc3VsdCA9IFRSVUU7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X29uZXdheSAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgICAgICAgc2Vjb25kc1RvU2xlZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RPbmV3YXkoJWQpOiBTbGVlcGluZy4uLlxuIiwgc2Vjb25kc1RvU2xlZXApOworICBzbGVlcCAoc2Vjb25kc1RvU2xlZXApOworICBwcmludGYgKCJ0ZXN0T25ld2F5KCVkKTogZG9uZSBzbGVlcGluZyFcbiIsIHNlY29uZHNUb1NsZWVwKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF90ZXN0X2hhbmRsZXJfaW5pdCAoVGhyaWZ0VGVzdEhhbmRsZXIgKnNlbGYpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChzZWxmKTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF90ZXN0X2hhbmRsZXJfY2xhc3NfaW5pdCAoVGhyaWZ0VGVzdEhhbmRsZXJDbGFzcyAqa2xhc3MpCit7CisgIFRUZXN0VGhyaWZ0VGVzdEhhbmRsZXJDbGFzcyAqYmFzZV9jbGFzcyA9CisgICAgVF9URVNUX1RIUklGVF9URVNUX0hBTkRMRVJfQ0xBU1MgKGtsYXNzKTsKKworICBiYXNlX2NsYXNzLT50ZXN0X3ZvaWQgPQorICAgIGtsYXNzLT50ZXN0X3ZvaWQgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF92b2lkOworICBiYXNlX2NsYXNzLT50ZXN0X3N0cmluZyA9CisgICAga2xhc3MtPnRlc3Rfc3RyaW5nID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfc3RyaW5nOworICBiYXNlX2NsYXNzLT50ZXN0X2Jvb2wgPQorICAgIGtsYXNzLT50ZXN0X2Jvb2wgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9ib29sOworICBiYXNlX2NsYXNzLT50ZXN0X2J5dGUgPQorICAgIGtsYXNzLT50ZXN0X2J5dGUgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9ieXRlOworICBiYXNlX2NsYXNzLT50ZXN0X2kzMiA9CisgICAga2xhc3MtPnRlc3RfaTMyID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfaTMyOworICBiYXNlX2NsYXNzLT50ZXN0X2k2NCA9CisgICAga2xhc3MtPnRlc3RfaTY0ID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfaTY0OworICBiYXNlX2NsYXNzLT50ZXN0X2RvdWJsZSA9CisgICAga2xhc3MtPnRlc3RfZG91YmxlID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfZG91YmxlOworICBiYXNlX2NsYXNzLT50ZXN0X2JpbmFyeSA9CisgICAga2xhc3MtPnRlc3RfYmluYXJ5ID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfYmluYXJ5OworICBiYXNlX2NsYXNzLT50ZXN0X3N0cnVjdCA9CisgICAga2xhc3MtPnRlc3Rfc3RydWN0ID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfc3RydWN0OworICBiYXNlX2NsYXNzLT50ZXN0X25lc3QgPQorICAgIGtsYXNzLT50ZXN0X25lc3QgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9uZXN0OworICBiYXNlX2NsYXNzLT50ZXN0X21hcCA9CisgICAga2xhc3MtPnRlc3RfbWFwID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfbWFwOworICBiYXNlX2NsYXNzLT50ZXN0X3N0cmluZ19tYXAgPQorICAgIGtsYXNzLT50ZXN0X3N0cmluZ19tYXAgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9zdHJpbmdfbWFwOworICBiYXNlX2NsYXNzLT50ZXN0X3NldCA9CisgICAga2xhc3MtPnRlc3Rfc2V0ID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfc2V0OworICBiYXNlX2NsYXNzLT50ZXN0X2xpc3QgPQorICAgIGtsYXNzLT50ZXN0X2xpc3QgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9saXN0OworICBiYXNlX2NsYXNzLT50ZXN0X2VudW0gPQorICAgIGtsYXNzLT50ZXN0X2VudW0gPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9lbnVtOworICBiYXNlX2NsYXNzLT50ZXN0X3R5cGVkZWYgPQorICAgIGtsYXNzLT50ZXN0X3R5cGVkZWYgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF90eXBlZGVmOworICBiYXNlX2NsYXNzLT50ZXN0X21hcF9tYXAgPQorICAgIGtsYXNzLT50ZXN0X21hcF9tYXAgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9tYXBfbWFwOworICBiYXNlX2NsYXNzLT50ZXN0X2luc2FuaXR5ID0KKyAgICBrbGFzcy0+dGVzdF9pbnNhbml0eSA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2luc2FuaXR5OworICBiYXNlX2NsYXNzLT50ZXN0X211bHRpID0KKyAgICBrbGFzcy0+dGVzdF9tdWx0aSA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X211bHRpOworICBiYXNlX2NsYXNzLT50ZXN0X2V4Y2VwdGlvbiA9CisgICAga2xhc3MtPnRlc3RfZXhjZXB0aW9uID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfZXhjZXB0aW9uOworICBiYXNlX2NsYXNzLT50ZXN0X211bHRpX2V4Y2VwdGlvbiA9CisgICAga2xhc3MtPnRlc3RfbXVsdGlfZXhjZXB0aW9uID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfbXVsdGlfZXhjZXB0aW9uOworICBiYXNlX2NsYXNzLT50ZXN0X29uZXdheSA9CisgICAga2xhc3MtPnRlc3Rfb25ld2F5ID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfb25ld2F5OworfQpkaWZmIC0tZ2l0IGEvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuaCBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY0Y2IxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmgKQEAgLTAsMCArMSwyNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RFU1RfSEFORExFUl9ICisjZGVmaW5lIF9USFJJRlRfVEVTVF9IQU5ETEVSX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIi4uL2dlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmgiCisKK0dfQkVHSU5fREVDTFMKKworLyogQSBoYW5kbGVyIHRoYXQgaW1wbGVtZW50cyB0aGUgVFRlc3RUaHJpZnRUZXN0SWYgaW50ZXJmYWNlICovCisKKyNkZWZpbmUgVFlQRV9USFJJRlRfVEVTVF9IQU5ETEVSICh0aHJpZnRfdGVzdF9oYW5kbGVyX2dldF90eXBlICgpKQorCisjZGVmaW5lIFRIUklGVF9URVNUX0hBTkRMRVIob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1RIUklGVF9URVNUX0hBTkRMRVIsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VGVzdEhhbmRsZXIpKQorI2RlZmluZSBJU19USFJJRlRfVEVTVF9IQU5ETEVSKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9USFJJRlRfVEVTVF9IQU5ETEVSKSkKKyNkZWZpbmUgVEhSSUZUX1RFU1RfSEFORExFUl9DTEFTUyhjKSAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9USFJJRlRfVEVTVF9IQU5ETEVSLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUZXN0SGFuZGxlckNsYXNzKSkKKyNkZWZpbmUgSVNfVEhSSUZUX1RFU1RfSEFORExFUl9DTEFTUyhjKSAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9USFJJRlRfVEVTVF9IQU5ETEVSKSkKKyNkZWZpbmUgVEhSSUZUX1RFU1RfSEFORExFUl9HRVRfQ0xBU1Mob2JqKSAgICAgICAgICAgICAgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1RIUklGVF9URVNUX0hBTkRMRVIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRlc3RIYW5kbGVyQ2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0VGVzdEhhbmRsZXIgVGhyaWZ0VGVzdEhhbmRsZXI7Cit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0VGVzdEhhbmRsZXJDbGFzcyBUaHJpZnRUZXN0SGFuZGxlckNsYXNzOworCitzdHJ1Y3QgX1RocmlmdFRlc3RIYW5kbGVyIHsKKyAgVFRlc3RUaHJpZnRUZXN0SGFuZGxlciBwYXJlbnQ7Cit9OworCitzdHJ1Y3QgX1RocmlmdFRlc3RIYW5kbGVyQ2xhc3MgeworICBUVGVzdFRocmlmdFRlc3RIYW5kbGVyQ2xhc3MgcGFyZW50OworCisgIGdib29sZWFuICgqdGVzdF92b2lkKSAgICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3Rfc3RyaW5nKSAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgICAgICAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfYm9vbCkgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Jvb2xlYW4qX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdib29sZWFuICAgICAgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9ieXRlKSAgICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50OCpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDggICAgICAgICAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X2kzMikgICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyICAgICAgICAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X2k2NCkgICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQ2NCpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDY0ICAgICAgICAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X2RvdWJsZSkgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdkb3VibGUgICAgICAgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9iaW5hcnkpICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQnl0ZUFycmF5ICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHQnl0ZUFycmF5ICAgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3Rfc3RydWN0KSAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYdHJ1Y3QgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdFh0cnVjdCAgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfbmVzdCkgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYdHJ1Y3QyICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdFh0cnVjdDIgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfbWFwKSAgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0hhc2hUYWJsZSAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHSGFzaFRhYmxlICAgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3Rfc3RyaW5nX21hcCkgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0hhc2hUYWJsZSAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHSGFzaFRhYmxlICAgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3Rfc2V0KSAgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0hhc2hUYWJsZSAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHSGFzaFRhYmxlICAgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfbGlzdCkgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FycmF5ICAgICAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHQXJyYXkgICAgICAgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfZW51bSkgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3ROdW1iZXJ6Kl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdE51bWJlcnogICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfdHlwZWRlZikgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RVc2VySWQqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0VXNlcklkICAgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9tYXBfbWFwKSAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSGFzaFRhYmxlICAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgICAgICAgICBoZWxsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9pbnNhbml0eSkgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSGFzaFRhYmxlICAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0SW5zYW5pdHkgICphcmd1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9tdWx0aSkgICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFh0cnVjdCAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQ4ICAgICAgICAgICBhcmcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyICAgICAgICAgIGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50NjQgICAgICAgICAgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdIYXNoVGFibGUgICAgICphcmczLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3ROdW1iZXJ6ICAgIGFyZzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdFVzZXJJZCAgICAgYXJnNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9leGNlcHRpb24pICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgICAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYY2VwdGlvbiAgICAgICAqKmVycjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfbXVsdGlfZXhjZXB0aW9uKSAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYdHJ1Y3QgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgICAqYXJnMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICAgICAgICAgICphcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYY2VwdGlvbiAgICAgICAqKmVycjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFhjZXB0aW9uMiAgICAgICoqZXJyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9vbmV3YXkpICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgICAgICAgICAgc2Vjb25kc1RvU2xlZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworfTsKKworLyogVXNlZCBieSBUSFJJRlRfVEVTVF9IQU5ETEVSX0dFVF9UWVBFICovCitHVHlwZSB0aHJpZnRfdGVzdF9oYW5kbGVyX2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X3ZvaWQgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9zdHJpbmcgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICAgICAgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9ieXRlICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQ4Kl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50OCAgICAgICAgICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfaTMyICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgICAgICAgICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2k2NCAgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDY0Kl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50NjQgICAgICAgICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2RvdWJsZSAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2RvdWJsZSAgICAgICAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9zdHJ1Y3QgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WHRydWN0ICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3RYdHJ1Y3QgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9uZXN0ICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WHRydWN0MiAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3RYdHJ1Y3QyICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9tYXAgICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdIYXNoVGFibGUgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0hhc2hUYWJsZSAgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9zdHJpbmdfbWFwICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdIYXNoVGFibGUgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0hhc2hUYWJsZSAgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9zZXQgICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdIYXNoVGFibGUgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0hhc2hUYWJsZSAgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9saXN0ICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBcnJheSAgICAgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0FycmF5ICAgICAgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF90eXBlZGVmICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0VXNlcklkKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdFVzZXJJZCAgICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X21hcF9tYXAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0hhc2hUYWJsZSAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgICAgICAgICAgaGVsbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2luc2FuaXR5ICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0hhc2hUYWJsZSAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdEluc2FuaXR5ICAqYXJndW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X211bHRpICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYdHJ1Y3QgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50OCAgICAgICAgICAgYXJnMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgICAgICAgICBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDY0ICAgICAgICAgIGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHSGFzaFRhYmxlICAgICAqYXJnMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0TnVtYmVyeiAgICBhcmc0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3RVc2VySWQgICAgIGFyZzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2V4Y2VwdGlvbiAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICAgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WGNlcHRpb24gICAgICAgKiplcnIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9tdWx0aV9leGNlcHRpb24gKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WHRydWN0ICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICAgKmFyZzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgICAqYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WGNlcHRpb24gICAgICAgKiplcnIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYY2VwdGlvbjIgICAgICAqKmVycjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X29uZXdheSAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyICAgICAgICAgIHNlY29uZHNUb1NsZWVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfVEVTVF9IQU5ETEVSX0ggKi8KZGlmZiAtLWdpdCBhL3Rlc3QvY2wvTWFrZWZpbGUuYW0gYi90ZXN0L2NsL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI1ZTcyYmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NsL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCitzdHViczogLi4vVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY2wgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKworVGVzdFNlcnZlcjogbWFrZS10ZXN0LXNlcnZlci5saXNwCisJJChTQkNMKSAtLXNjcmlwdCBtYWtlLXRlc3Qtc2VydmVyLmxpc3AKKworVGVzdENsaWVudDogbWFrZS10ZXN0LWNsaWVudC5saXNwCisJJChTQkNMKSAtLXNjcmlwdCBtYWtlLXRlc3QtY2xpZW50Lmxpc3AKKworcHJlY3Jvc3M6IHN0dWJzIFRlc3RTZXJ2ZXIgVGVzdENsaWVudAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tY2wKKwkkKFJNKSBUZXN0U2VydmVyCisJJChSTSkgVGVzdENsaWVudAorCitFWFRSQV9ESVNUID0gXAorCWltcGxlbWVudGF0aW9uLmxpc3AgXAorCW1ha2UtdGVzdC1jbGllbnQubGlzcCBcCisJbWFrZS10ZXN0LXNlcnZlci5saXNwIFwKKwl0ZXN0cy5saXNwCmRpZmYgLS1naXQgYS90ZXN0L2NsL2ltcGxlbWVudGF0aW9uLmxpc3AgYi90ZXN0L2NsL2ltcGxlbWVudGF0aW9uLmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhZjdiZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY2wvaW1wbGVtZW50YXRpb24ubGlzcApAQCAtMCwwICsxLDEzNiBAQAorKGluLXBhY2thZ2UgIzp0aHJpZnQudGVzdC1pbXBsZW1lbnRhdGlvbikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC12b2lkICgpCisgIChmb3JtYXQgdCAidGVzdFZvaWQoKX4lIikpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LXN0cmluZyAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdFN0cmluZyh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1ib29sICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0Qm9vbCh+YSl+JSIgKGlmIHRoaW5nICJ0cnVlIiAiZmFsc2UiKSkKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWJ5dGUgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RCeXRlKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWkzMiAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdEkzMih+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1pNjQgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RJNjQofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtZG91YmxlICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0RG91YmxlKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWJpbmFyeSAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdEJpbmFyeSh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1zdHJ1Y3QgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RTdHJ1Y3QofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtbmVzdCAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdE5lc3QofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtbWFwICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0TWFwKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LXN0cmluZy1tYXAgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RTdHJpbmdNYXAofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3Qtc2V0ICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0U2V0KH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWxpc3QgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RMaXN0KH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWVudW0gKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RFbnVtKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LXR5cGVkZWYgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RUeXBlZGVmKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LW1hcC1tYXAgKGhlbGxvKQorICAoZm9ybWF0IHQgInRlc3RNYXBNYXAofmEpfiUiIGhlbGxvKQorICAnKCgtNCAuICgoLTQgLiAtNCkgKC0zIC4gLTMpICgtMiAuIC0yKSAoLTEgLiAtMSkpKSAoNCAuICgoMSAuIDEpICgyIC4gMikgKDMgLiAzKSAoNCAuIDQpKSkpKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1pbnNhbml0eSAoYXJndW1lbnQpCisgIChsZXQgKChyZXN1bHQgYCgoMSAuICgoMiAuICxhcmd1bWVudCkgKDMgLiAsYXJndW1lbnQpKSkKKyAgICAgICAgICAgICAgICAgICgyIC4gKCg2IC4gLCh0aHJpZnQudGVzdDo6bWFrZS1pbnNhbml0eSA6dXNlci1tYXAgbmlsIDp4dHJ1Y3RzIG5pbCkpKSkpKSkKKyAgICAoZm9ybWF0IHQgIn5hfiUiIHJlc3VsdCkKKyAgICByZXN1bHQpKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1tdWx0aSAoYXJnMCBhcmcxIGFyZzIgYXJnMyBhcmc0IGFyZzUpCisgIChkZWNsYXJlIChpZ25vcmFibGUgYXJnMyBhcmc0IGFyZzUpKQorICAoZm9ybWF0IHQgInRlc3RNdWx0aSgpfiUiKQorICAodGhyaWZ0LnRlc3Q6bWFrZS14dHJ1Y3QgOnN0cmluZy10aGluZyAiSGVsbG8yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmJ5dGUtdGhpbmcgYXJnMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmkzMi10aGluZyBhcmcxCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6aTY0LXRoaW5nIGFyZzIpKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1leGNlcHRpb24gKGFyZykKKyAgKGZvcm1hdCB0ICJ0ZXN0RXhjZXB0aW9uKH5hKX4lIiBhcmcpCisgIChjb25kCisgICAgKChzdHJpbmc9IGFyZyAiWGNlcHRpb24iKSAoZXJyb3IgJ3RocmlmdC50ZXN0OnhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmVycm9yLWNvZGUgMTAwMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptZXNzYWdlIGFyZykpCisgICAgKChzdHJpbmc9IGFyZyAiVEV4Y2VwdGlvbiIpIChlcnJvciAndGhyaWZ0LnRlc3Q6eGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDplcnJvci1jb2RlIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptZXNzYWdlICJTdHVmZiEiKSkpKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1tdWx0aS1leGNlcHRpb24gKGFyZzAgYXJnMSkKKyAgKGZvcm1hdCB0ICJ0ZXN0TXVsdGlFeGNlcHRpb24ofmEsIH5hKX4lIiBhcmcwIGFyZzEpCisgIChjb25kCisgICAgKChzdHJpbmc9IGFyZzAgIlhjZXB0aW9uIikgKGVycm9yICd0aHJpZnQudGVzdDp4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDplcnJvci1jb2RlIDEwMDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bWVzc2FnZSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIpKQorICAgICgoc3RyaW5nPSBhcmcwICJYY2VwdGlvbjIiKSAoZXJyb3IgJ3RocmlmdC50ZXN0OnhjZXB0aW9uMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDplcnJvci1jb2RlIDIwMDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6c3RydWN0LXRoaW5nICh0aHJpZnQudGVzdDptYWtlLXh0cnVjdCA6c3RyaW5nLXRoaW5nICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Ynl0ZS10aGluZyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmkzMi10aGluZyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmk2NC10aGluZyAwKSkpKQorICAodGhyaWZ0LnRlc3Q6bWFrZS14dHJ1Y3QgOnN0cmluZy10aGluZyBhcmcxCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6Ynl0ZS10aGluZyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6aTMyLXRoaW5nIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDppNjQtdGhpbmcgMCkpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LW9uZXdheSAoc2Vjb25kcykKKyAgKGZvcm1hdCB0ICJ0ZXN0T25ld2F5KH5hKTogU2xlZXBpbmcuLi5+JSIgc2Vjb25kcykKKyAgKHNsZWVwIHNlY29uZHMpCisgIChmb3JtYXQgdCAidGVzdE9uZXdheSh+YSk6IGRvbmUgc2xlZXBpbmchfiUiIHNlY29uZHMpKQorCis7OzsgUmVtb3ZlZCBmcm9tIHRoZSBJREwgZGVmaW5pdGlvbi4KKyMrKG9yKQorKGRlZnVuIHRocmlmdC50ZXN0LnNlY29uZC1zZXJ2aWNlLWltcGxlbWVudGF0aW9uOmJsYWgtYmxhaCAoKQorICAoZm9ybWF0IHQgImJsYWhCbGFoKCl+JSIpKQorCisoZGVmdW4gdGhyaWZ0LnRlc3Quc2Vjb25kLXNlcnZpY2UtaW1wbGVtZW50YXRpb246c2Vjb25kdGVzdC1zdHJpbmcgKHRoaW5nKQorICAoZm9ybWF0IHQgInNlY29uZHRlc3RTdHJpbmcofmEpfiUiIHRoaW5nKQorICAoY29uY2F0ZW5hdGUgJ3N0cmluZyAidGVzdFN0cmluZyhcIiIgdGhpbmcgIlwiKSIpKQorCmRpZmYgLS1naXQgYS90ZXN0L2NsL21ha2UtdGVzdC1jbGllbnQubGlzcCBiL3Rlc3QvY2wvbWFrZS10ZXN0LWNsaWVudC5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOTY2OWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NsL21ha2UtdGVzdC1jbGllbnQubGlzcApAQCAtMCwwICsxLDkzIEBACisoaW4tcGFja2FnZSAjOmNsLXVzZXIpCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIysob3IpICh3aGVuIChub3QgKGJvdW5kcCAnc2ItaW1wbDo6ZGVmYXVsdC1leHRlcm5hbC1mb3JtYXQpCisgICAgICAgICAgICAgICAgIChzZXRmIHNiLWltcGw6OmRlZmF1bHQtZXh0ZXJuYWwtZm9ybWF0IDpVVEYtOCkpKQorCisocmVxdWlyZSAiYXNkZiIpCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICIuLi8uLi9saWIvY2wvbG9hZC1sb2NhbGx5Lmxpc3AiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6bmV0LmRpZGllcnZlcm5hLmNsb24pCisoYXNkZjpsb2FkLXN5c3RlbSA6Zmlhc2NvKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAiZ2VuLWNsL1RocmlmdFRlc3QvdGhyaWZ0LWdlbi1UaHJpZnRUZXN0LmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDp0aHJpZnQtZ2VuLXRocmlmdHRlc3QpCisKKyhuZXQuZGlkaWVydmVybmEuY2xvbjpuaWNrbmFtZS1wYWNrYWdlKQorCisoZGVmcGFja2FnZSAjOnRocmlmdC1jcm9zcworICAoOnVzZSAjOmNvbW1vbi1saXNwICM6Zmlhc2NvKQorICAoOmV4cG9ydCAjOmNyb3NzLXRlc3QpKQorCisoaW4tcGFja2FnZSAjOnRocmlmdC1jcm9zcykKKworKGRlZnBhcmFtZXRlciAqcHJvdCogbmlsKQorCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICJ0ZXN0cy5saXNwIiAqbG9hZC10cnVlbmFtZSopIDpleHRlcm5hbC1mb3JtYXQgOlVURi04KQorCisoY2xvbjpkZWZzeW5vcHNpcyAoKQorICAodGV4dCA6Y29udGVudHMgIlRoZSBDb21tb24gTGlzcCBjbGllbnQgZm9yIFRocmlmdCdzIGNyb3NzLWxhbmd1YWdlIHRlc3Qgc3VpdGUuIikKKyAgKGdyb3VwICg6aGVhZGVyICJBbGxvd2VkIG9wdGlvbnM6IikKKyAgICAoZmxhZyA6c2hvcnQtbmFtZSAiaCIgOmxvbmctbmFtZSAiaGVscCIKKyAgICAgICAgICA6ZGVzY3JpcHRpb24gIlByaW50IHRoaXMgaGVscCBhbmQgZXhpdC4iKQorICAgIChzdHJvcHQgOmxvbmctbmFtZSAiaG9zdCIKKyAgICAgICAgICAgIDpkZXNjcmlwdGlvbiAiVGhlIGhvc3QgdG8gY29ubmVjdCB0by4iCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAibG9jYWxob3N0IgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJwb3J0IgorICAgICAgICAgICAgOmRlc2NyaXB0aW9uICJOdW1iZXIgb2YgdGhlIHBvcnQgdG8gbGlzdGVuIGZvciBjb25uZWN0aW9ucyBvbi4iCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAiOTA5MCIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciCisgICAgICAgICAgICA6YXJndW1lbnQtdHlwZSA6b3B0aW9uYWwpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJ0cmFuc3BvcnQiCisgICAgICAgICAgICA6ZGVzY3JpcHRpb24gIlRyYW5zcG9ydDogdHJhbnNwb3J0IHRvIHVzZSAoXCJidWZmZXJlZFwiLCBcImZyYW1lZFwiKSIKKyAgICAgICAgICAgIDpkZWZhdWx0LXZhbHVlICJidWZmZXJlZCIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciKQorICAgIChzdHJvcHQgOmxvbmctbmFtZSAicHJvdG9jb2wiCisgICAgICAgICAgICA6ZGVzY3JpcHRpb24gIlByb3RvY29sOiBwcm90b2NvbCB0byB1c2UgKFwiYmluYXJ5XCIsIFwibXVsdGlcIikiCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAiYmluYXJ5IgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIpKSkKKworKGRlZnVuIG1haW4gKCkKKyAgIkVudHJ5IHBvaW50IGZvciBvdXIgc3RhbmRhbG9uZSBhcHBsaWNhdGlvbi4iCisgIChjbG9uOm1ha2UtY29udGV4dCkKKyAgKHdoZW4gKGNsb246Z2V0b3B0IDpzaG9ydC1uYW1lICJoIikKKyAgICAoY2xvbjpoZWxwKQorICAgIChjbG9uOmV4aXQpKQorICAobGV0ICgocG9ydCAiOTA5MCIpCisgICAgICAgIChob3N0ICJsb2NhbGhvc3QiKQorICAgICAgICAoZnJhbWVkIG5pbCkKKyAgICAgICAgKG11bHRpcGxleGVkIG5pbCkpCisgICAgKGNsb246ZG8tY21kbGluZS1vcHRpb25zIChvcHRpb24gbmFtZSB2YWx1ZSBzb3VyY2UpCisgICAgICAocHJpbnQgKGxpc3Qgb3B0aW9uIG5hbWUgdmFsdWUgc291cmNlKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJob3N0IikKKyAgICAgICAgICAoc2V0ZiBob3N0IHZhbHVlKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJwb3J0IikKKyAgICAgICAgICAoc2V0ZiBwb3J0IHZhbHVlKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJ0cmFuc3BvcnQiKQorICAgICAgICAgIChjb25kICgoc3RyaW5nPSB2YWx1ZSAiYnVmZmVyZWQiKSAoc2V0ZiBmcmFtZWQgbmlsKSkKKyAgICAgICAgICAgICAgICAoKHN0cmluZz0gdmFsdWUgImZyYW1lZCIpIChzZXRmIGZyYW1lZCB0KSkKKyAgICAgICAgICAgICAgICAodCAoZXJyb3IgIlVuc3VwcG9ydGVkIHRyYW5zcG9ydC4iKSkpKQorICAgICAgKGlmIChzdHJpbmc9IG5hbWUgInByb3RvY29sIikKKyAgICAgICAgICAoY29uZCAoKHN0cmluZz0gdmFsdWUgImJpbmFyeSIpIChzZXRmIG11bHRpcGxleGVkIG5pbCkpCisgICAgICAgICAgICAgICAgKChzdHJpbmc9IHZhbHVlICJtdWx0aSIpIChzZXRmIG11bHRpcGxleGVkIHQpKQorICAgICAgICAgICAgICAgICh0IChlcnJvciAiVW5zdXBwb3J0ZWQgcHJvdG9jb2wuIikpKSkpCisgICAgKHRlcnByaSkKKyAgICAoc2V0ZiAqcHJvdCogKHRocmlmdC5pbXBsZW1lbnRhdGlvbjo6Y2xpZW50IChwdXJpOnBhcnNlLXVyaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25jYXRlbmF0ZSAnc3RyaW5nICJ0aHJpZnQ6Ly8iIGhvc3QgIjoiIHBvcnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZyYW1lZCBmcmFtZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptdWx0aXBsZXhlZCBtdWx0aXBsZXhlZCkpCisgICAgKGxldCAoKHJlc3VsdCAoY3Jvc3MtdGVzdCA6bXVsdGlwbGV4ZWQgbXVsdGlwbGV4ZWQpKSkKKyAgICAgICh0aHJpZnQuaW1wbGVtZW50YXRpb246OmNsb3NlICpwcm90KikKKyAgICAgIChjbG9uOmV4aXQgcmVzdWx0KSkpKQorCisoY2xvbjpkdW1wICJUZXN0Q2xpZW50IiBtYWluKQpkaWZmIC0tZ2l0IGEvdGVzdC9jbC9tYWtlLXRlc3Qtc2VydmVyLmxpc3AgYi90ZXN0L2NsL21ha2UtdGVzdC1zZXJ2ZXIubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTNjODc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jbC9tYWtlLXRlc3Qtc2VydmVyLmxpc3AKQEAgLTAsMCArMSw4MCBAQAorKGluLXBhY2thZ2UgIzpjbC11c2VyKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyhyZXF1aXJlICJhc2RmIikKKyhsb2FkIChtZXJnZS1wYXRobmFtZXMgIi4uLy4uL2xpYi9jbC9sb2FkLWxvY2FsbHkubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDpuZXQuZGlkaWVydmVybmEuY2xvbikKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgImdlbi1jbC9UaHJpZnRUZXN0L3RocmlmdC1nZW4tVGhyaWZ0VGVzdC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6dGhyaWZ0LWdlbi10aHJpZnR0ZXN0KQorKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAiaW1wbGVtZW50YXRpb24ubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKworKG5ldC5kaWRpZXJ2ZXJuYS5jbG9uOm5pY2tuYW1lLXBhY2thZ2UpCisKKyhjbG9uOmRlZnN5bm9wc2lzICgpCisgICh0ZXh0IDpjb250ZW50cyAiVGhlIENvbW1vbiBMaXNwIHNlcnZlciBmb3IgVGhyaWZ0J3MgY3Jvc3MtbGFuZ3VhZ2UgdGVzdCBzdWl0ZS4iKQorICAoZ3JvdXAgKDpoZWFkZXIgIkFsbG93ZWQgb3B0aW9uczoiKQorICAgIChmbGFnIDpzaG9ydC1uYW1lICJoIiA6bG9uZy1uYW1lICJoZWxwIgorICAgICAgICAgIDpkZXNjcmlwdGlvbiAiUHJpbnQgdGhpcyBoZWxwIGFuZCBleGl0LiIpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJwb3J0IgorICAgICAgICAgICAgOmRlc2NyaXB0aW9uICJOdW1iZXIgb2YgdGhlIHBvcnQgdG8gbGlzdGVuIGZvciBjb25uZWN0aW9ucyBvbi4iCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAiOTA5MCIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciCisgICAgICAgICAgICA6YXJndW1lbnQtdHlwZSA6b3B0aW9uYWwpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJzZXJ2ZXItdHlwZSIKKyAgICAgICAgICAgIDpkZXNjcmlwdGlvbiAiVGhlIHR5cGUgb2Ygc2VydmVyLCBjdXJyZW50bHkgb25seSBcInNpbXBsZVwiIGlzIGF2YWlsYWJsZS4iCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAic2ltcGxlIgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJ0cmFuc3BvcnQiCisgICAgICAgICAgICA6ZGVzY3JpcHRpb24gIlRyYW5zcG9ydDogdHJhbnNwb3J0IHRvIHVzZSAoXCJidWZmZXJlZFwiIG9yIFwiZnJhbWVkXCIpIgorICAgICAgICAgICAgOmRlZmF1bHQtdmFsdWUgImJ1ZmZlcmVkIgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJwcm90b2NvbCIKKyAgICAgICAgICAgIDpkZXNjcmlwdGlvbiAiUHJvdG9jb2w6IHByb3RvY29sIHRvIHVzZSAoXCJiaW5hcnlcIiBvciBcIm11bHRpXCIpIgorICAgICAgICAgICAgOmRlZmF1bHQtdmFsdWUgImJpbmFyeSIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciKSkpCisKKyhkZWZ1biBtYWluICgpCisgICJFbnRyeSBwb2ludCBmb3Igb3VyIHN0YW5kYWxvbmUgYXBwbGljYXRpb24uIgorICAoY2xvbjptYWtlLWNvbnRleHQpCisgICh3aGVuIChjbG9uOmdldG9wdCA6c2hvcnQtbmFtZSAiaCIpCisgICAgKGNsb246aGVscCkKKyAgICAoY2xvbjpleGl0KSkKKyAgKGxldCAoKHBvcnQgIjkwOTAiKQorICAgICAgICAoZnJhbWVkIG5pbCkKKyAgICAgICAgKG11bHRpcGxleGVkIG5pbCkpCisgICAgKGNsb246ZG8tY21kbGluZS1vcHRpb25zIChvcHRpb24gbmFtZSB2YWx1ZSBzb3VyY2UpCisgICAgICAocHJpbnQgKGxpc3Qgb3B0aW9uIG5hbWUgdmFsdWUgc291cmNlKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJwb3J0IikKKyAgICAgICAgICAoc2V0ZiBwb3J0IHZhbHVlKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJ0cmFuc3BvcnQiKQorICAgICAgICAgIChjb25kICgoc3RyaW5nPSB2YWx1ZSAiYnVmZmVyZWQiKSAoc2V0ZiBmcmFtZWQgbmlsKSkKKyAgICAgICAgICAgICAgICAoKHN0cmluZz0gdmFsdWUgImZyYW1lZCIpIChzZXRmIGZyYW1lZCB0KSkKKyAgICAgICAgICAgICAgICAodCAoZXJyb3IgIlVuc3VwcG9ydGVkIHRyYW5zcG9ydC4iKSkpKQorICAgICAgKGlmIChzdHJpbmc9IG5hbWUgInByb3RvY29sIikKKyAgICAgICAgICAoY29uZCAoKHN0cmluZz0gdmFsdWUgImJpbmFyeSIpIChzZXRmIG11bHRpcGxleGVkIG5pbCkpCisgICAgICAgICAgICAgICAgKChzdHJpbmc9IHZhbHVlICJtdWx0aSIpIChzZXRmIG11bHRpcGxleGVkIHQpKQorICAgICAgICAgICAgICAgICh0IChlcnJvciAiVW5zdXBwb3J0ZWQgcHJvdG9jb2wuIikpKSkpCisgICAgKHRlcnByaSkKKyAgICAobGV0ICgoc2VydmljZXMgKGlmIG11bHRpcGxleGVkCisgICAgICAgICAgICAgICAgICAgICAgICAobGlzdCB0aHJpZnQudGVzdDp0aHJpZnQtdGVzdCB0aHJpZnQudGVzdDpzZWNvbmQtc2VydmljZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdC50ZXN0OnRocmlmdC10ZXN0KSkpCisgICAgICAodGhyaWZ0OnNlcnZlIChwdXJpOnBhcnNlLXVyaSAoY29uY2F0ZW5hdGUgJ3N0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJpZnQ6Ly8xMjcuMC4wLjE6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQpKQorICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlcworICAgICAgICAgICAgICAgICAgICA6ZnJhbWVkIGZyYW1lZAorICAgICAgICAgICAgICAgICAgICA6bXVsdGlwbGV4ZWQgbXVsdGlwbGV4ZWQpKSkKKyAgKGNsb246ZXhpdCkpCisKKyhjbG9uOmR1bXAgIlRlc3RTZXJ2ZXIiIG1haW4pCmRpZmYgLS1naXQgYS90ZXN0L2NsL3Rlc3RzLmxpc3AgYi90ZXN0L2NsL3Rlc3RzLmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUwMzVmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY2wvdGVzdHMubGlzcApAQCAtMCwwICsxLDI0MCBAQAorKGluLXBhY2thZ2UgIzp0aHJpZnQtY3Jvc3MpCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOzs7OyBUaGUgdGVzdHMgaGVyZSBvbmx5IG1ha2Ugc2Vuc2UgaW4gdGhlIGNvbnRleHQgb2YgYSBUZXN0U2VydmVyCis7Ozs7IHJ1bm5pbmcgYW5kIHRoZSBkeW5hbWljIHZhcmlhYmxlIHRocmlmdC1jcm9zczo6KnByb3QqCis7Ozs7IGJlaW5nIHNldCB3aXRoIGEgY2xpZW50IGNvbm5lY3Rpb24gdG8gdGhlIFRlc3RTZXJ2ZXIuIE5vcm1hbGx5LAorOzs7OyB0aGlzIGlzIGhhbmRsZWQgaW4gbWFrZS10ZXN0LWNsaWVudC5saXNwLgorCisKKzs7OyBTdGFuZGFyZCBUaHJpZnQgY3Jvc3MtdGVzdCBlcnJvciBjb2RlcworKGRlZnBhcmFtZXRlciAqdGVzdF9iYXNldHlwZXMqIDEpCisoZGVmcGFyYW1ldGVyICp0ZXN0X3N0cnVjdHMqIDIpCisoZGVmcGFyYW1ldGVyICp0ZXN0X2NvbnRhaW5lcnMqIDQpCisoZGVmcGFyYW1ldGVyICp0ZXN0X2V4Y2VwdGlvbnMqIDgpCisoZGVmcGFyYW1ldGVyICp0ZXN0X3Vua25vd24qIDY0KQorKGRlZnBhcmFtZXRlciAqdGVzdF90aW1lb3V0KiAxMjgpCisKKyhkZWZ1biBjcm9zcy10ZXN0ICgma2V5IChtdWx0aXBsZXhlZCBuaWwpKQorICAiVGhlIG1haW4gY3Jvc3MtdGVzdCBydW5uZXIuIgorICAobGV0ICgocmVzdWx0IG5pbCkpCisgICAgKGhhbmRsZXItY2FzZQorICAgICAgICAocHJvZ24KKyAgICAgICAgICAodW5sZXNzIChydW4tcGFja2FnZS10ZXN0cyA6cGFja2FnZSA6YmFzZS10eXBlcykKKyAgICAgICAgICAgIChwdXNobmV3ICp0ZXN0X2Jhc2V0eXBlcyogcmVzdWx0KSkKKyAgICAgICAgICAodW5sZXNzIChydW4tcGFja2FnZS10ZXN0cyA6cGFja2FnZSA6c3RydWN0cykKKyAgICAgICAgICAgIChwdXNobmV3ICp0ZXN0X3N0cnVjdHMqIHJlc3VsdCkpCisgICAgICAgICAgKHVubGVzcyAocnVuLXBhY2thZ2UtdGVzdHMgOnBhY2thZ2UgOmNvbnRhaW5lcnMpCisgICAgICAgICAgICAocHVzaG5ldyAqdGVzdF9jb250YWluZXJzKiByZXN1bHQpKQorICAgICAgICAgICh1bmxlc3MgKHJ1bi1wYWNrYWdlLXRlc3RzIDpwYWNrYWdlIDpleGNlcHRpb25zKQorICAgICAgICAgICAgKHB1c2huZXcgKnRlc3RfZXhjZXB0aW9ucyogcmVzdWx0KSkKKyAgICAgICAgICAodW5sZXNzIChydW4tcGFja2FnZS10ZXN0cyA6cGFja2FnZSA6bWlzYykKKyAgICAgICAgICAgIChwdXNobmV3ICp0ZXN0X3Vua25vd24qIHJlc3VsdCkpCisKKyAgICAgICAgICA7OyBJdCBkb2Vzbid0IHNlZW0gbGlrZSBhbnlvbmUgYWN0dWFsbHkgdXNlcworICAgICAgICAgIDs7IHRoZSBzZWNvbmQgdGVzdCBzZXJ2aWNlIHdoZW4gdGVzdGluZyBtdWx0aXBsZXhpbmcsCisgICAgICAgICAgOzsgc28gdGhpcyB3b3VsZCBmYWlsIGFnYWluc3Qgc2VydmVycyBpbiBvdGhlcgorICAgICAgICAgIDs7IGxhbmd1YWdlcy4gRm9yIG5vdywgYW55d2F5LgorICAgICAgICAgICMrKG9yKQorICAgICAgICAgICh3aGVuIG11bHRpcGxleGVkCisgICAgICAgICAgICAodW5sZXNzIChydW4tcGFja2FnZS10ZXN0cyA6cGFja2FnZSA6bXVsdGlwbGV4KQorICAgICAgICAgICAgICAocHVzaG5ldyAqdGVzdF91bmtub3duKiByZXN1bHQpKSkpCisgICAgICAoZXJyb3IgKGUpIChwdXNobmV3ICp0ZXN0X3Vua25vd24qIHJlc3VsdCkpKQorICAgIChhcHBseSAjJysgcmVzdWx0KSkpCisKKyhmaWFzY286ZGVmaW5lLXRlc3QtcGFja2FnZSAjOmJhc2UtdHlwZXMpCisKKyhpbi1wYWNrYWdlICM6YmFzZS10eXBlcykKKworKGRlZmNvbnN0YW50ICpsYW5nLXN0cmluZyogIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhIE1lbGF5dSwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIE5vcmZ1ayAvIFBpdGtlcm4sIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iKQorCisoZGVmcGFyYW1ldGVyICp0cmljay1zdHJpbmcqIChmb3JtYXQgbmlsICJxdW90ZTogXCIgYmFja3NsYXNoOiBcXCBuZXdsaW5lOiB+JSBiYWNrc3BhY2U6IH5DIH4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYjogflQganVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCIgI1xiYWNrc3BhY2UpKQorCisoZGVmY29uc3RhbnQgKmJpbmFyeS1zZXF1ZW5jZSogIygxMjggMTI5IDEzMCAxMzEgMTMyIDEzMyAxMzQgMTM1IDEzNiAxMzcgMTM4IDEzOSAxNDAgMTQxIDE0MiAxNDMgMTQ0IDE0NSAxNDYgMTQ3IDE0OCAxNDkgMTUwIDE1MSAxNTIgMTUzIDE1NCAxNTUgMTU2IDE1NyAxNTggMTU5IDE2MCAxNjEgMTYyIDE2MyAxNjQgMTY1IDE2NiAxNjcgMTY4IDE2OSAxNzAgMTcxIDE3MiAxNzMgMTc0IDE3NSAxNzYgMTc3IDE3OCAxNzkgMTgwIDE4MSAxODIgMTgzIDE4NCAxODUgMTg2IDE4NyAxODggMTg5IDE5MCAxOTEgMTkyIDE5MyAxOTQgMTk1IDE5NiAxOTcgMTk4IDE5OSAyMDAgMjAxIDIwMiAyMDMgMjA0IDIwNSAyMDYgMjA3IDIwOCAyMDkgMjEwIDIxMSAyMTIgMjEzIDIxNCAyMTUgMjE2IDIxNyAyMTggMjE5IDIyMCAyMjEgMjIyIDIyMyAyMjQgMjI1IDIyNiAyMjcgMjI4IDIyOSAyMzAgMjMxIDIzMiAyMzMgMjM0IDIzNSAyMzYgMjM3IDIzOCAyMzkgMjQwIDI0MSAyNDIgMjQzIDI0NCAyNDUgMjQ2IDI0NyAyNDggMjQ5IDI1MCAyNTEgMjUyIDI1MyAyNTQgMjU1IDAgMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgMjggMjkgMzAgMzEgMzIgMzMgMzQgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNDUgNDYgNDcgNDggNDkgNTAgNTEgNTIgNTMgNTQgNTUgNTYgNTcgNTggNTkgNjAgNjEgNjIgNjMgNjQgNjUgNjYgNjcgNjggNjkgNzAgNzEgNzIgNzMgNzQgNzUgNzYgNzcgNzggNzkgODAgODEgODIgODMgODQgODUgODYgODcgODggODkgOTAgOTEgOTIgOTMgOTQgOTUgOTYgOTcgOTggOTkgMTAwIDEwMSAxMDIgMTAzIDEwNCAxMDUgMTA2IDEwNyAxMDggMTA5IDExMCAxMTEgMTEyIDExMyAxMTQgMTE1IDExNiAxMTcgMTE4IDExOSAxMjAgMTIxIDEyMiAxMjMgMTI0IDEyNSAxMjYgMTI3KSkKKworKGRlZnRlc3Qgdm9pZC10ZXN0ICgpCisgIChpcyAobnVsbCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC12b2lkIHRocmlmdC1jcm9zczo6KnByb3QqKSkpKQorCisoZGVmdGVzdCBib29sZWFuLXRlc3QgKCkKKyAgKGlzICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJvb2wgdGhyaWZ0LWNyb3NzOjoqcHJvdCogdCkpCisgIChpcyAobm90ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJvb2wgdGhyaWZ0LWNyb3NzOjoqcHJvdCogbmlsKSkpKQorCisoZGVmdGVzdCBpbnRlZ2VyLXRlc3QgKCkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJ5dGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMTI3KSAxMjcpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYnl0ZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAtMTI4KSAtMTI4KSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJ5dGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogNDIpIDQyKSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJ5dGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMCkgMCkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1pMzIgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMCkgMCkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1pMzIgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMjE0NzQ4MzY0NykgMjE0NzQ4MzY0NykpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1pMzIgdGhyaWZ0LWNyb3NzOjoqcHJvdCogLTIxNDc0ODM2NDgpIC0yMTQ3NDgzNjQ4KSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWk2NCB0aHJpZnQtY3Jvc3M6Oipwcm90KiAwKSAwKSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWk2NCB0aHJpZnQtY3Jvc3M6Oipwcm90KiA5MjIzMzcyMDM2ODU0Nzc1ODA3KSA5MjIzMzcyMDM2ODU0Nzc1ODA3KSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWk2NCB0aHJpZnQtY3Jvc3M6Oipwcm90KiAtOTIyMzM3MjAzNjg1NDc3NTgwOCkgLTkyMjMzNzIwMzY4NTQ3NzU4MDgpKSkKKworKGRlZnRlc3QgZG91YmxlLXRlc3QgKCkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWRvdWJsZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAwLjApIDApKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZG91YmxlIHRocmlmdC1jcm9zczo6KnByb3QqIDQyLjApIDQyKSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWRvdWJsZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAtNTU1LjApIC01NTUpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZG91YmxlIHRocmlmdC1jcm9zczo6KnByb3QqIC01Mi4zNjc4KSAtNTIuMzY3OCkpKQorCisoZGVmdGVzdCBzdHJpbmctdGVzdCAoKQorICAoaXMgKHN0cmluZz0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtc3RyaW5nIHRocmlmdC1jcm9zczo6KnByb3QqICIiKSAiIikpCisgIChpcyAoc3RyaW5nPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1zdHJpbmcgdGhyaWZ0LWNyb3NzOjoqcHJvdCogIihkZWZ1biBib3RzYnVpbGRib3RzICgpIChib3RzYnVpbHNib3RzKSkiKQorICAgICAgICAgICAgICAgIihkZWZ1biBib3RzYnVpbGRib3RzICgpIChib3RzYnVpbHNib3RzKSkiKSkKKyAgKGlzIChzdHJpbmc9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXN0cmluZyB0aHJpZnQtY3Jvc3M6Oipwcm90KiAqbGFuZy1zdHJpbmcqKSAqbGFuZy1zdHJpbmcqKSkKKyAgKGlzIChzdHJpbmc9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXN0cmluZyB0aHJpZnQtY3Jvc3M6Oipwcm90KiAqdHJpY2stc3RyaW5nKikgKnRyaWNrLXN0cmluZyopKSkKKworKGRlZnRlc3QgYmluYXJ5LXRlc3QgKCkKKyAgKGlzIChlcXVhbHAgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYmluYXJ5IHRocmlmdC1jcm9zczo6KnByb3QqICMoKSkgIygpKSkKKyAgKGlzIChlcXVhbHAgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYmluYXJ5IHRocmlmdC1jcm9zczo6KnByb3QqICpiaW5hcnktc2VxdWVuY2UqKSAqYmluYXJ5LXNlcXVlbmNlKikpKQorCisoZGVmdGVzdCBlbnVtLXRlc3QgKCkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWVudW0gdGhyaWZ0LWNyb3NzOjoqcHJvdCogdGhyaWZ0LnRlc3Q6bnVtYmVyei5maXZlKSB0aHJpZnQudGVzdDpudW1iZXJ6LmZpdmUpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZW51bSB0aHJpZnQtY3Jvc3M6Oipwcm90KiB0aHJpZnQudGVzdDpudW1iZXJ6LmVpZ2h0KSB0aHJpZnQudGVzdDpudW1iZXJ6LmVpZ2h0KSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWVudW0gdGhyaWZ0LWNyb3NzOjoqcHJvdCogdGhyaWZ0LnRlc3Q6bnVtYmVyei5vbmUpIHRocmlmdC50ZXN0Om51bWJlcnoub25lKSkpCisKKyhkZWZ0ZXN0IHR5cGVkZWYtdGVzdCAoKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtdHlwZWRlZiB0aHJpZnQtY3Jvc3M6Oipwcm90KiAzMDk4NTgyMzUwODI1MjMpIDMwOTg1ODIzNTA4MjUyMykpKQorCisoZmlhc2NvOmRlZmluZS10ZXN0LXBhY2thZ2UgIzpzdHJ1Y3RzKQorCisoaW4tcGFja2FnZSAjOnN0cnVjdHMpCisKKyhkZWZwYXJhbWV0ZXIgKnRlc3Qtc3RydWN0KiAodGhyaWZ0LnRlc3Q6bWFrZS14dHJ1Y3QgOnN0cmluZy10aGluZyAiSGVsbCBpcyBlbXB0eS4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpieXRlLXRoaW5nIC0yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDppMzItdGhpbmcgNDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmk2NC10aGluZyA0MjQyNDI0MikpCisKKyhkZWZwYXJhbWV0ZXIgKnRlc3QtbmVzdCogKHRocmlmdC50ZXN0Om1ha2UteHRydWN0MiA6Ynl0ZS10aGluZyA0MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpzdHJ1Y3QtdGhpbmcgKnRlc3Qtc3RydWN0KgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDppMzItdGhpbmcgLTQyKSkKKworKGRlZnRlc3Qgc3RydWN0LXRlc3QgKCkKKyAgKGxldCAoKHJlYy1zdHJ1Y3QgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtc3RydWN0IHRocmlmdC1jcm9zczo6KnByb3QqICp0ZXN0LXN0cnVjdCopKSkKKyAgICAoaXMgKHN0cmluZz0gKHRocmlmdC50ZXN0Onh0cnVjdC1zdHJpbmctdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1zdHJpbmctdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0LWJ5dGUtdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1ieXRlLXRoaW5nIHJlYy1zdHJ1Y3QpKSkKKyAgICAoaXMgKD0gKHRocmlmdC50ZXN0Onh0cnVjdC1pMzItdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1pMzItdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0LWk2NC10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LWk2NC10aGluZyByZWMtc3RydWN0KSkpKSkKKworKGRlZnRlc3QgbmVzdC10ZXN0ICgpCisgIChsZXQqICgocmVjLW5lc3QgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbmVzdCB0aHJpZnQtY3Jvc3M6Oipwcm90KiAqdGVzdC1uZXN0KikpCisgICAgICAgICAocmVjLXN0cnVjdCAodGhyaWZ0LnRlc3Q6eHRydWN0Mi1zdHJ1Y3QtdGhpbmcgcmVjLW5lc3QpKSkKKyAgICAoaXMgKHN0cmluZz0gKHRocmlmdC50ZXN0Onh0cnVjdC1zdHJpbmctdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1zdHJpbmctdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0LWJ5dGUtdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1ieXRlLXRoaW5nIHJlYy1zdHJ1Y3QpKSkKKyAgICAoaXMgKD0gKHRocmlmdC50ZXN0Onh0cnVjdC1pMzItdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1pMzItdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0LWk2NC10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LWk2NC10aGluZyByZWMtc3RydWN0KSkpCisgICAgKGlzICg9ICh0aHJpZnQudGVzdDp4dHJ1Y3QyLWJ5dGUtdGhpbmcgKnRlc3QtbmVzdCopCisgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3QyLWJ5dGUtdGhpbmcgcmVjLW5lc3QpKSkKKyAgICAoaXMgKD0gKHRocmlmdC50ZXN0Onh0cnVjdDItaTMyLXRoaW5nICp0ZXN0LW5lc3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0Mi1pMzItdGhpbmcgcmVjLW5lc3QpKSkpKQorCisoZmlhc2NvOmRlZmluZS10ZXN0LXBhY2thZ2UgIzpjb250YWluZXJzKQorCisoaW4tcGFja2FnZSAjOmNvbnRhaW5lcnMpCisKKyhkZWZ0ZXN0IGxpc3QtdGVzdCAoKQorICAoaXMgKG51bGwgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbGlzdCB0aHJpZnQtY3Jvc3M6Oipwcm90KiBuaWwpKSkKKyAgKGlzIChlcXVhbCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1saXN0IHRocmlmdC1jcm9zczo6KnByb3QqICcoNDIgLTQyIDAgNSkpICcoNDIgLTQyIDAgNSkpKSkKKworKGRlZnRlc3Qgc2V0LXRlc3QgKCkKKyAgKGlzIChudWxsICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXNldCB0aHJpZnQtY3Jvc3M6Oipwcm90KiBuaWwpKSkKKyAgKGlzIChlcXVhbCAoc29ydCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1zZXQgdGhyaWZ0LWNyb3NzOjoqcHJvdCogKGxpc3QgNDIgLTQyIDAgNSkpICMnPCkKKyAgICAgICAgICAgICAnKC00MiAwIDUgNDIpKSkpCisKKyhkZWZ1biBtYXA9IChtYXAxIG1hcDIgJmtleSAoY2FyLXByZWRpY2F0ZSAjJ2VxdWFsKSAoY2RyLXByZWRpY2F0ZSAjJ2VxdWFsKSkKKyAgIkNvbXBhcmUgdHdvIGFzc29jIG1hcHMgYWNjb3JkaW5nIHRvIHRoZSBwcmVkaWNhdGVzIGdpdmVuLiIKKyAgKG5vdCAoc2V0LWV4Y2x1c2l2ZS1vciBtYXAxIG1hcDIgOnRlc3QgKGxhbWJkYSAoZWwxIGVsMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIChmdW5jYWxsIGNhci1wcmVkaWNhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYXIgZWwxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhciBlbDIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmNhbGwgY2RyLXByZWRpY2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNkciBlbDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2RyIGVsMikpKSkpKSkKKworKGRlZnRlc3QgbWFwLXRlc3QgKCkKKyAgKGlzIChudWxsICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW1hcCB0aHJpZnQtY3Jvc3M6Oipwcm90KiBuaWwpKSkKKyAgKGlzIChtYXA9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW1hcCB0aHJpZnQtY3Jvc3M6Oipwcm90KiAnKCgwIC4gMSkgKDQyIC4gLTQyKSAoNSAuIDUpKSkKKyAgICAgICAgICAgICcoKDAgLiAxKSAoNDIgLiAtNDIpICg1IC4gNSkpKSkKKyAgKGlzIChtYXA9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW1hcC1tYXAgdGhyaWZ0LWNyb3NzOjoqcHJvdCogNDIpCisgICAgICAgICAgICAnKCgtNCAuICgoLTQgLiAtNCkgKC0zIC4gLTMpICgtMiAuIC0yKSAoLTEgLiAtMSkpKQorICAgICAgICAgICAgICAoNCAuICgoMSAuIDEpICgyIC4gMikgKDMgLiAzKSAoNCAuIDQpKSkpCisgICAgICAgICAgICA6Y2RyLXByZWRpY2F0ZSAjJ21hcD0pKSkKKworKGZpYXNjbzpkZWZpbmUtdGVzdC1wYWNrYWdlICM6ZXhjZXB0aW9ucykKKworKGluLXBhY2thZ2UgIzpleGNlcHRpb25zKQorCisoZGVmdW4gdGVzdC14Y2VwdGlvbiAoZXhwZWN0ZWQtY29kZSBleHBlY3RlZC1tZXNzYWdlIGZ1bmN0aW9uICZyZXN0IGFyZ3MpCisgICJBIGhlbHBlciBmdW5jdGlvbiB0byB0ZXN0IHdoZXRoZXIgeGNlcHRpb24gaXMgc2lnbmFsbGVkLCBhbmQgd2hldGhlciBpdHMgZmllbGRzIGhhdmUgdGhlIGV4cGVjdGVkIHZhbHVlcy4iCisgIChoYW5kbGVyLWNhc2UgKHByb2duIChhcHBseSBmdW5jdGlvbiBhcmdzKQorICAgICAgICAgICAgICAgICAgICAgICBuaWwpCisgICAgKHRocmlmdC50ZXN0OnhjZXB0aW9uIChleCkgKGFuZCAoPSAodGhyaWZ0LnRlc3Q6OnhjZXB0aW9uLWVycm9yLWNvZGUgZXgpIGV4cGVjdGVkLWNvZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nPSAodGhyaWZ0LnRlc3Q6OnhjZXB0aW9uLW1lc3NhZ2UgZXgpIGV4cGVjdGVkLW1lc3NhZ2UpKSkpKQorCisoZGVmdW4gdGVzdC14Y2VwdGlvbjIgKGV4cGVjdGVkLWNvZGUgZXhwZWN0ZWQtbWVzc2FnZSBmdW5jdGlvbiAmcmVzdCBhcmdzKQorICAiQSBoZWxwZXIgZnVuY3Rpb24gdG8gdGVzdCB3aGV0aGVyIHhjZXB0aW9uMiBpcyBzaWduYWxsZWQsIGFuZCB3aGV0aGVyIGl0cyBmaWVsZHMgaGF2ZSB0aGUgZXhwZWN0ZWQgdmFsdWVzLiIKKyAgKGhhbmRsZXItY2FzZSAocHJvZ24gKGFwcGx5IGZ1bmN0aW9uIGFyZ3MpCisgICAgICAgICAgICAgICAgICAgICAgIG5pbCkKKyAgICAodGhyaWZ0LnRlc3Q6eGNlcHRpb24yIChleCkgKGFuZCAoPSAodGhyaWZ0LnRlc3Q6OnhjZXB0aW9uMi1lcnJvci1jb2RlIGV4KSBleHBlY3RlZC1jb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmc9ICh0aHJpZnQudGVzdDo6eHRydWN0LXN0cmluZy10aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhyaWZ0LnRlc3Q6OnhjZXB0aW9uMi1zdHJ1Y3QtdGhpbmcgZXgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLW1lc3NhZ2UpKSkpKQorCisoZGVmdGVzdCBleGNlcHRpb24tdGVzdCAoKQorICAoaXMgKHRlc3QteGNlcHRpb24gMTAwMSAiWGNlcHRpb24iICMndGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1leGNlcHRpb24gdGhyaWZ0LWNyb3NzOjoqcHJvdCogIlhjZXB0aW9uIikpCisgIChzaWduYWxzIHRocmlmdDphcHBsaWNhdGlvbi1lcnJvciAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1leGNlcHRpb24gdGhyaWZ0LWNyb3NzOjoqcHJvdCogIlRFeGNlcHRpb24iKSkKKyAgKGZpbmlzaGVzICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWV4Y2VwdGlvbiB0aHJpZnQtY3Jvc3M6Oipwcm90KiAic3VjY2VzcyIpKSkKKworKGRlZnRlc3QgbXVsdGktZXhjZXB0aW9uLXRlc3QgKCkKKyAgKGlzICh0ZXN0LXhjZXB0aW9uIDEwMDEKKyAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGFuIFhjZXB0aW9uIgorICAgICAgICAgICAgICAgICAgICAgIyd0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW11bHRpLWV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0LWNyb3NzOjoqcHJvdCoKKyAgICAgICAgICAgICAgICAgICAgICJYY2VwdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICJtZWFuaW5nbGVzcyIpKQorICAoaXMgKHRlc3QteGNlcHRpb24yIDIwMDIKKyAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiCisgICAgICAgICAgICAgICAgICAgICAgIyd0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW11bHRpLWV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgIHRocmlmdC1jcm9zczo6KnByb3QqCisgICAgICAgICAgICAgICAgICAgICAgIlhjZXB0aW9uMiIKKyAgICAgICAgICAgICAgICAgICAgICAibWVhbmluZ2xlc3MgdG9vISIpKQorICAoaXMgKHN0cmluZz0gImZvb2JhciIgKHRocmlmdC50ZXN0Onh0cnVjdC1zdHJpbmctdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1tdWx0aS1leGNlcHRpb24gdGhyaWZ0LWNyb3NzOjoqcHJvdCoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3MhIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vYmFyIikpKSkpCisKKyhmaWFzY286ZGVmaW5lLXRlc3QtcGFja2FnZSAjOm1pc2MpCisKKyhpbi1wYWNrYWdlICM6bWlzYykKKworKGRlZnRlc3Qgb25ld2F5LXRlc3QgKCkKKyAgKGlzIChudWxsICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW9uZXdheSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAxKSkpKQorCisoZmlhc2NvOmRlZmluZS10ZXN0LXBhY2thZ2UgIzptdWx0aXBsZXgpCisKKyhpbi1wYWNrYWdlICM6bXVsdGlwbGV4KQorCisoZGVmdGVzdCBtdWx0aXBsZXgtdGVzdCAoKQorICA7OyBSZW1vdmVkIGZyb20gdGhlIElETCBkZWZpbml0aW9uLgorICA7OyAoZmluaXNoZXMgKHRocmlmdC50ZXN0LnNlY29uZC1zZXJ2aWNlOmJsYWgtYmxhaCB0aHJpZnQtY3Jvc3M6Oipwcm90KikpCisgIChpcyAoc3RyaW5nPSAiYXNkIiAodGhyaWZ0LnRlc3Quc2Vjb25kLXNlcnZpY2U6c2Vjb25kdGVzdC1zdHJpbmcgdGhyaWZ0LWNyb3NzOjoqcHJvdCogImFzZCIpKSkpCmRpZmYgLS1naXQgYS90ZXN0L2NwcC9DTWFrZUxpc3RzLnR4dCBiL3Rlc3QvY3BwL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk1ZDI5OTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NwcC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDkyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBDb250YWlucyB0aGUgdGhyaWZ0IHNwZWNpZmljIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWQoraW5jbHVkZShUaHJpZnRNYWNyb3MpCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICIke0Jvb3N0X0lOQ0xVREVfRElSU30iKQorCitmaW5kX3BhY2thZ2UoT3BlblNTTCBSRVFVSVJFRCkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICIke09QRU5TU0xfSU5DTFVERV9ESVJ9IikKKworZmluZF9wYWNrYWdlKExpYmV2ZW50IFJFUVVJUkVEKSAgIyBMaWJldmVudCBjb21lcyB3aXRoIENNYWtlIHN1cHBvcnQgZnJvbSB1cHN0cmVhbQoraW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gJHtMSUJFVkVOVF9JTkNMVURFX0RJUlN9KQorCitmaW5kX3BhY2thZ2UoWkxJQiBSRVFVSVJFRCkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICR7WkxJQl9JTkNMVURFX0RJUlN9KQorCisjTWFrZSBzdXJlIGdlbi1jcHAgZmlsZXMgY2FuIGJlIGluY2x1ZGVkCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iKQoraW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1jcHAiKQoraW5jbHVkZV9kaXJlY3RvcmllcygiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2xpYi9jcHAvc3JjIikKKworc2V0KGNyb3NzdGVzdGdlbmNwcF9TT1VSQ0VTCisgICAgZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmNwcAorICAgIGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAKKyAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAKKyAgICBzcmMvVGhyaWZ0VGVzdF9leHRyYXMuY3BwCispCithZGRfbGlicmFyeShjcm9zc3Rlc3RnZW5jcHAgU1RBVElDICR7Y3Jvc3N0ZXN0Z2VuY3BwX1NPVVJDRVN9KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKGNyb3NzdGVzdGdlbmNwcCB0aHJpZnQpCisKK3NldChjcm9zc3N0cmVzc2dlbmNwcF9TT1VSQ0VTCisgICAgZ2VuLWNwcC9TZXJ2aWNlLmNwcAorICAgIGdlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHAKKyAgICBnZW4tY3BwL1N0cmVzc1Rlc3RfY29uc3RhbnRzLmNwcAorKQorYWRkX2xpYnJhcnkoY3Jvc3NzdHJlc3NnZW5jcHAgU1RBVElDICR7Y3Jvc3NzdHJlc3NnZW5jcHBfU09VUkNFU30pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoY3Jvc3NzdHJlc3NnZW5jcHAgdGhyaWZ0KQorCithZGRfZXhlY3V0YWJsZShUZXN0U2VydmVyIHNyYy9UZXN0U2VydmVyLmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUZXN0U2VydmVyIGNyb3NzdGVzdGdlbmNwcCAke0Jvb3N0X0xJQlJBUklFU30gJHtMSUJFVkVOVF9MSUJ9KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRlc3RTZXJ2ZXIgdGhyaWZ0KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRlc3RTZXJ2ZXIgdGhyaWZ0bmIpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVGVzdFNlcnZlciB0aHJpZnR6KQorCithZGRfZXhlY3V0YWJsZShUZXN0Q2xpZW50IHNyYy9UZXN0Q2xpZW50LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUZXN0Q2xpZW50IGNyb3NzdGVzdGdlbmNwcCAke0Jvb3N0X0xJQlJBUklFU30gJHtMSUJFVkVOVF9MSUJ9KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRlc3RDbGllbnQgdGhyaWZ0KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRlc3RDbGllbnQgdGhyaWZ0bmIpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVGVzdENsaWVudCB0aHJpZnR6KQorCithZGRfZXhlY3V0YWJsZShTdHJlc3NUZXN0IHNyYy9TdHJlc3NUZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhTdHJlc3NUZXN0IGNyb3Nzc3RyZXNzZ2VuY3BwICR7Qm9vc3RfTElCUkFSSUVTfSAke0xJQkVWRU5UX0xJQn0pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoU3RyZXNzVGVzdCB0aHJpZnQpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoU3RyZXNzVGVzdCB0aHJpZnRuYikKK2FkZF90ZXN0KE5BTUUgU3RyZXNzVGVzdCBDT01NQU5EIFN0cmVzc1Rlc3QpCisKK2FkZF9leGVjdXRhYmxlKFN0cmVzc1Rlc3ROb25CbG9ja2luZyBzcmMvU3RyZXNzVGVzdE5vbkJsb2NraW5nLmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhTdHJlc3NUZXN0Tm9uQmxvY2tpbmcgY3Jvc3NzdHJlc3NnZW5jcHAgJHtCb29zdF9MSUJSQVJJRVN9ICR7TElCRVZFTlRfTElCfSkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShTdHJlc3NUZXN0Tm9uQmxvY2tpbmcgdGhyaWZ0KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFN0cmVzc1Rlc3ROb25CbG9ja2luZyB0aHJpZnRuYikKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShTdHJlc3NUZXN0Tm9uQmxvY2tpbmcgdGhyaWZ0eikKK2FkZF90ZXN0KE5BTUUgU3RyZXNzVGVzdE5vbkJsb2NraW5nIENPTU1BTkQgU3RyZXNzVGVzdE5vbkJsb2NraW5nKQorCisjCisjIENvbW1vbiB0aHJpZnQgY29kZSBnZW5lcmF0aW9uIHJ1bGVzCisjCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmNwcCBnZW4tY3BwL1NlY29uZFNlcnZpY2UuaCBnZW4tY3BwL1RocmlmdFRlc3QuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdC5oIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHA6dGVtcGxhdGVzLGNvYl9zdHlsZSAtciAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9TdHJlc3NUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9TZXJ2aWNlLmNwcAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9TdHJlc3NUZXN0LnRocmlmdAorKQpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvTWFrZWZpbGUuYW0gYi90ZXN0L2NwcC9NYWtlZmlsZS5hbQppbmRleCA2YzYyY2ZiLi5lOGJlODBhIDEwMDc1NQotLS0gYS90ZXN0L2NwcC9NYWtlZmlsZS5hbQorKysgYi90ZXN0L2NwcC9NYWtlZmlsZS5hbQpAQCAtMTYsMTQgKzE2LDMwIEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMgc2VyaWFsLXRlc3RzCisKK0JVSUxUX1NPVVJDRVMgPSBnZW4tY3BwL1RocmlmdFRlc3QuY3BwIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmNwcCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9TdHJlc3NUZXN0X2NvbnN0YW50cy5jcHAgXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvU2VydmljZS5jcHAKKwogbm9pbnN0X0xUTElCUkFSSUVTID0gbGlidGVzdGdlbmNwcC5sYSBsaWJzdHJlc3N0ZXN0Z2VuY3BwLmxhCiBub2Rpc3RfbGlidGVzdGdlbmNwcF9sYV9TT1VSQ0VTID0gXAorCWdlbi1jcHAvU2Vjb25kU2VydmljZS5jcHAgXAorCWdlbi1jcHAvU2Vjb25kU2VydmljZS5oIFwKKwlnZW4tY3BwL1NlY29uZFNlcnZpY2UudGNjIFwKIAlnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcCBcCi0JZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBcCiAJZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5oIFwKKwlnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIFwKIAlnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaCBcCiAJZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLnRjYyBcCi0JZ2VuLWNwcC9UaHJpZnRUZXN0LnRjYworCWdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgXAorCWdlbi1jcHAvVGhyaWZ0VGVzdC5oIFwKKwlnZW4tY3BwL1RocmlmdFRlc3QudGNjIFwKKwlzcmMvVGhyaWZ0VGVzdF9leHRyYXMuY3BwCiAKIGxpYnRlc3RnZW5jcHBfbGFfTElCQUREID0gJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhCiAKQEAgLTM3LDYgKzUzLDggQEAKIAogbGlic3RyZXNzdGVzdGdlbmNwcF9sYV9MSUJBREQgPSAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEKIAorcHJlY3Jvc3M6IFRlc3RTZXJ2ZXIgVGVzdENsaWVudAorCiBjaGVja19QUk9HUkFNUyA9IFwKIAlUZXN0U2VydmVyIFwKIAlUZXN0Q2xpZW50IFwKQEAgLTU1LDcgKzczLDcgQEAKIAkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEgXAogCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdHoubGEgXAogCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdG5iLmxhIFwKLQktbGV2ZW50IC1sYm9vc3RfcHJvZ3JhbV9vcHRpb25zCisJLWxldmVudCAtbGJvb3N0X3Byb2dyYW1fb3B0aW9ucyAtbGJvb3N0X3N5c3RlbSAtbGJvb3N0X2ZpbGVzeXN0ZW0gJChaTElCX0xJQlMpCiAKIFRlc3RDbGllbnRfU09VUkNFUyA9IFwKIAlzcmMvVGVzdENsaWVudC5jcHAKQEAgLTY1LDcgKzgzLDcgQEAKIAkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEgXAogCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdHoubGEgXAogCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdG5iLmxhIFwKLQktbGV2ZW50IC1sYm9vc3RfcHJvZ3JhbV9vcHRpb25zCisJLWxldmVudCAtbGJvb3N0X3Byb2dyYW1fb3B0aW9ucyAtbGJvb3N0X3N5c3RlbSAtbGJvb3N0X2ZpbGVzeXN0ZW0gJChaTElCX0xJQlMpCiAKIFN0cmVzc1Rlc3RfU09VUkNFUyA9IFwKIAlzcmMvU3RyZXNzVGVzdC5jcHAKQEAgLTg0LDMwICsxMDIsMjQgQEAKICMKICMgQ29tbW9uIHRocmlmdCBjb2RlIGdlbmVyYXRpb24gcnVsZXMKICMKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KLWdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcDogJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CitnZW4tY3BwL1RocmlmdFRlc3QuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmNwcCBnZW4tY3BwL1NlY29uZFNlcnZpY2UuaCBnZW4tY3BwL1NlY29uZFNlcnZpY2UudGNjOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgJChUSFJJRlQpCiAJJChUSFJJRlQpIC0tZ2VuIGNwcDp0ZW1wbGF0ZXMsY29iX3N0eWxlIC1yICQ8CiAKLWdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1N0cmVzc1Rlc3RfY29uc3RhbnRzLmNwcDogJCh0b3Bfc3JjZGlyKS90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0CitnZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuY3BwIGdlbi1jcHAvU3RyZXNzVGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvU2VydmljZS5jcHA6ICQodG9wX3NyY2RpcikvdGVzdC9TdHJlc3NUZXN0LnRocmlmdCAkKFRIUklGVCkKIAkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CiAKLUlOQ0xVREVTID0gXAotCS1JJCh0b3Bfc3JjZGlyKS9saWIvY3BwL3NyYyAtSWdlbi1jcHAKLQotQU1fQ1BQRkxBR1MgPSAkKEJPT1NUX0NQUEZMQUdTKQotQU1fQ1hYRkxBR1MgPSAtV2FsbAotQU1fTERGTEFHUyA9ICQoQk9PU1RfTERGTEFHUykKK0FNX0NQUEZMQUdTID0gJChCT09TVF9DUFBGTEFHUykgJChMSUJFVkVOVF9DUFBGTEFHUykgLUkkKHRvcF9zcmNkaXIpL2xpYi9jcHAvc3JjIC1JZ2VuLWNwcAorQU1fQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYyAtRF9fU1REQ19GT1JNQVRfTUFDUk9TIC1EX19TVERDX0xJTUlUX01BQ1JPUworQU1fTERGTEFHUyA9ICQoQk9PU1RfTERGTEFHUykgJChMSUJFVkVOVF9MREZMQUdTKSAkKFpMSUJfTElCUykKIAogY2xlYW4tbG9jYWw6Ci0JJChSTSkgLXIgZ2VuLWNwcAorCSQoUk0pIGdlbi1jcHAvKgorCitzdHlsZS1sb2NhbDoKKwkkKENQUFNUWUxFX0NNRCkKIAogRVhUUkFfRElTVCA9IFwKIAlzcmMvVGVzdENsaWVudC5jcHAgXAogCXNyYy9UZXN0U2VydmVyLmNwcCBcCiAJc3JjL1N0cmVzc1Rlc3QuY3BwIFwKLQlzcmMvU3RyZXNzVGVzdE5vbkJsb2NraW5nLmNwcCBcCi0JcmVhbGxvYy9yZWFsbG9jX3Rlc3QuYyBcCi0JcmVhbGxvYy9NYWtlZmlsZQotCQotCQorCXNyYy9TdHJlc3NUZXN0Tm9uQmxvY2tpbmcuY3BwCmRpZmYgLS1naXQgYS90ZXN0L2NwcC9yZWFsbG9jL01ha2VmaWxlIGIvdGVzdC9jcHAvcmVhbGxvYy9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg5YmJiMy4uMDAwMDAwMAotLS0gYS90ZXN0L2NwcC9yZWFsbG9jL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgVGhpcyBwcm9iYWJseSBzaG91bGQgbm90IGdvIGludG8gIm1ha2UgY2hlY2siLCBiZWNhdXNlIGl0IGlzIGFuIGV4cGVyaW1lbnQsCi0jIG5vdCBhIHRlc3QuICBTcGVjaWZpY2FsbHksIGl0IGlzIG1lYW50IHRvIGRldGVybWluZSBob3cgbGlrZWx5IHJlYWxsb2MgaXMKLSMgdG8gYXZvaWQgYSBjb3B5LiAgVGhpcyBpcyBwb29ybHkgZG9jdW1lbnRlZC4KLQotcnVuOiByZWFsbG9jX3Rlc3QKLQlmb3IgaXQgaW4gMSA0IDY0IDsgZG8gXAotCQlmb3IgbmIgaW4gMSA4IDY0IDUxMiA7IGRvIFwKLQkJCWZvciBtaW5zIGluIDY0IDUxMiA7IGRvIFwKLQkJCQlmb3IgbWF4cyBpbiAyMDQ4IDI2MjE0NCA7IGRvIFwKLQkJCQkJZm9yIGRiIGluIDggNjQgOyBkbyBcCi0JCQkJCQkuL3JlYWxsb2NfdGVzdCAkJG5iICQkbWlucyAkJG1heHMgJCRkYiAkJGl0IFwKLQkJCQkJOyBkb25lIFwKLQkJCQk7IGRvbmUgXAotCQkJOyBkb25lIFwKLQkJOyBkb25lIFwKLQk7IGRvbmUgXAotCT4gcmF3X3N0YXRzCi0KLUNGTEFHUyA9IC1XYWxsIC1nIC1zdGQ9Yzk5Ci1MRExJQlMgPSAtbGRsCi1yZWFsbG9jX3Rlc3Q6IHJlYWxsb2NfdGVzdC5jCmRpZmYgLS1naXQgYS90ZXN0L2NwcC9yZWFsbG9jL3JlYWxsb2NfdGVzdC5jIGIvdGVzdC9jcHAvcmVhbGxvYy9yZWFsbG9jX3Rlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk3NjNhZC4uMDAwMDAwMAotLS0gYS90ZXN0L2NwcC9yZWFsbG9jL3JlYWxsb2NfdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBfR05VX1NPVVJDRQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0KLWludCBjb3BpZXM7Ci1pbnQgbm9uX2NvcGllczsKLQotdm9pZCAqcmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBzaXplKSB7Ci0gIHN0YXRpYyB2b2lkICooKnJlYWxfcmVhbGxvYykodm9pZCosIHNpemVfdCkgPSBOVUxMOwotICBpZiAocmVhbF9yZWFsbG9jID09IE5VTEwpIHsKLSAgICByZWFsX3JlYWxsb2MgPSAodm9pZCogKCopICh2b2lkKiwgc2l6ZV90KSkgZGxzeW0oUlRMRF9ORVhULCAicmVhbGxvYyIpOwotICB9Ci0KLSAgdm9pZCAqcmV0X3B0ciA9ICgqcmVhbF9yZWFsbG9jKShwdHIsIHNpemUpOwotCi0gIGlmIChyZXRfcHRyID09IHB0cikgewotICAgIG5vbl9jb3BpZXMrKzsKLSAgfSBlbHNlIHsKLSAgICBjb3BpZXMrKzsKLSAgfQotCi0gIHJldHVybiByZXRfcHRyOwotfQotCi0KLXN0cnVjdCBUTWVtb3J5QnVmZmVyIHsKLSAgdm9pZCogcHRyOwotICBpbnQgc2l6ZTsKLX07Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKLSAgaW50IG51bV9idWZmZXJzOwotICBpbnQgaW5pdF9zaXplOwotICBpbnQgbWF4X3NpemU7Ci0gIGludCBkb3VibGluZ3M7Ci0gIGludCBpdGVyYXRpb25zOwotCi0gIGlmIChhcmdjIDwgNiB8fAotICAgICAgYXJnYyA+IDcgfHwKLSAgICAgIChudW1fYnVmZmVycyA9IGF0b2koYXJndlsxXSkpID09IDAgfHwKLSAgICAgIChpbml0X3NpemUgPSBhdG9pKGFyZ3ZbMl0pKSA9PSAwIHx8Ci0gICAgICAobWF4X3NpemUgPSBhdG9pKGFyZ3ZbM10pKSA9PSAwIHx8Ci0gICAgICBpbml0X3NpemUgPiBtYXhfc2l6ZSB8fAotICAgICAgKGl0ZXJhdGlvbnMgPSBhdG9pKGFyZ3ZbNF0pKSA9PSAwIHx8Ci0gICAgICAoZG91YmxpbmdzID0gYXRvaShhcmd2WzVdKSkgPT0gMCB8fAotICAgICAgKGFyZ2MgPT0gNyAmJiBhdG9pKGFyZ3ZbNl0pID09IDApKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogcmVhbGxvY190ZXN0IDxudW1fYnVmZmVycz4gPGluaXRfc2l6ZT4gPG1heF9zaXplPiA8ZG91YmxpbmdzPiA8aXRlcmF0aW9ucz4gW3NlZWRdXG4iKTsKLSAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gIH0KLQotICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgYXJnYyA7IGkrKyApIHsKLSAgICBwcmludGYoIiVzICIsIGFyZ3ZbaV0pOwotICB9Ci0gIHByaW50ZigiXG4iKTsKLQotICBpZiAoYXJnYyA9PSA3KSB7Ci0gICAgc3JhbmQoYXRvaShhcmd2WzZdKSk7Ci0gIH0gZWxzZSB7Ci0gICAgc3JhbmQodGltZShOVUxMKSk7Ci0gIH0KLQotICBzdHJ1Y3QgVE1lbW9yeUJ1ZmZlciogYnVmZmVycyA9IGNhbGxvYyhudW1fYnVmZmVycywgc2l6ZW9mKCpidWZmZXJzKSk7Ci0gIGlmIChidWZmZXJzID09IE5VTEwpIGFib3J0KCk7Ci0KLSAgZm9yICggaW50IGkgPSAwIDsgaSA8IG51bV9idWZmZXJzIDsgaSsrICkgewotICAgIGJ1ZmZlcnNbaV0uc2l6ZSA9IG1heF9zaXplOwotICB9Ci0KLSAgd2hpbGUgKGl0ZXJhdGlvbnMgLS0+IDApIHsKLSAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgZG91YmxpbmdzICogbnVtX2J1ZmZlcnMgOyBpKysgKSB7Ci0gICAgICBzdHJ1Y3QgVE1lbW9yeUJ1ZmZlciogYnVmID0gJmJ1ZmZlcnNbcmFuZCgpICUgbnVtX2J1ZmZlcnNdOwotICAgICAgYnVmLT5zaXplICo9IDI7Ci0gICAgICBpZiAoYnVmLT5zaXplIDw9IG1heF9zaXplKSB7Ci0gICAgICAgIGJ1Zi0+cHRyID0gcmVhbGxvYyhidWYtPnB0ciwgYnVmLT5zaXplKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZyZWUoYnVmLT5wdHIpOwotICAgICAgICBidWYtPnNpemUgPSBpbml0X3NpemU7Ci0gICAgICAgIGJ1Zi0+cHRyID0gbWFsbG9jKGJ1Zi0+c2l6ZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoYnVmLT5wdHIgPT0gTlVMTCkgYWJvcnQoKTsKLSAgICB9Ci0gIH0KLQotICBwcmludGYoIk5vbi1jb3BpZWQgJWQvJWQgKCUuMmYlJSlcbiIsIG5vbl9jb3BpZXMsIGNvcGllcyArIG5vbl9jb3BpZXMsIDEwMC4wICogbm9uX2NvcGllcyAvIChjb3BpZXMgKyBub25fY29waWVzKSk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvc3JjL1N0cmVzc1Rlc3QuY3BwIGIvdGVzdC9jcHAvc3JjL1N0cmVzc1Rlc3QuY3BwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNDg5MjcyMi4uNTg1Zjg5YQotLS0gYS90ZXN0L2NwcC9zcmMvU3RyZXNzVGVzdC5jcHAKKysrIGIvdGVzdC9jcHAvc3JjL1N0cmVzc1Rlc3QuY3BwCkBAIC0xNywzMSArMTcsMzIgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvTW9uaXRvci5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1V0aWwuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9NdXRleC5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgotI2luY2x1ZGUgPHNlcnZlci9UU2ltcGxlU2VydmVyLmg+Ci0jaW5jbHVkZSA8c2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmg+Ci0jaW5jbHVkZSA8c2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTb2NrZXQuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8VExvZ2dpbmcuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9UTG9nZ2luZy5oPgogCiAjaW5jbHVkZSAiU2VydmljZS5oIgotCiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KICNpbmNsdWRlIDxzc3RyZWFtPgogI2luY2x1ZGUgPG1hcD4KKyNpZiBfV0lOMzIKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgorI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgYm9vc3Q7CiAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CkBAIC01MiwyMyArNTMsMTggQEAKIHVzaW5nIG5hbWVzcGFjZSB0ZXN0OjpzdHJlc3M7CiAKIHN0cnVjdCBlcXN0ciB7Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RyY21wKHMxLCBzMikgPT0gMDsKLSAgfQorICBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSBjb25zdCB7IHJldHVybiBzdHJjbXAoczEsIHMyKSA9PSAwOyB9CiB9OwogCiBzdHJ1Y3QgbHRzdHIgewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cmNtcChzMSwgczIpIDwgMDsKLSAgfQorICBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSBjb25zdCB7IHJldHVybiBzdHJjbXAoczEsIHMyKSA8IDA7IH0KIH07CiAKLQogLy8gdHlwZWRlZiBoYXNoX21hcDxjb25zdCBjaGFyKiwgaW50LCBoYXNoPGNvbnN0IGNoYXIqPiwgZXFzdHI+IGNvdW50X21hcDsKIHR5cGVkZWYgbWFwPGNvbnN0IGNoYXIqLCBpbnQsIGx0c3RyPiBjb3VudF9tYXA7CiAKIGNsYXNzIFNlcnZlciA6IHB1YmxpYyBTZXJ2aWNlSWYgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgU2VydmVyKCkge30KIAogICB2b2lkIGNvdW50KGNvbnN0IGNoYXIqIG1ldGhvZCkgewpAQCAtODcsNjcgKzgzLDkyIEBACiAgICAgcmV0dXJuIGNvdW50c187CiAgIH0KIAotICBpbnQ4X3QgZWNob0J5dGUoY29uc3QgaW50OF90IGFyZykge3JldHVybiBhcmc7fQotICBpbnQzMl90IGVjaG9JMzIoY29uc3QgaW50MzJfdCBhcmcpIHtyZXR1cm4gYXJnO30KLSAgaW50NjRfdCBlY2hvSTY0KGNvbnN0IGludDY0X3QgYXJnKSB7cmV0dXJuIGFyZzt9Ci0gIHZvaWQgZWNob1N0cmluZyhzdHJpbmcmIG91dCwgY29uc3Qgc3RyaW5nICZhcmcpIHsKKyAgaW50OF90IGVjaG9CeXRlKGNvbnN0IGludDhfdCBhcmcpIHsgcmV0dXJuIGFyZzsgfQorICBpbnQzMl90IGVjaG9JMzIoY29uc3QgaW50MzJfdCBhcmcpIHsgcmV0dXJuIGFyZzsgfQorICBpbnQ2NF90IGVjaG9JNjQoY29uc3QgaW50NjRfdCBhcmcpIHsgcmV0dXJuIGFyZzsgfQorICB2b2lkIGVjaG9TdHJpbmcoc3RyaW5nJiBvdXQsIGNvbnN0IHN0cmluZyYgYXJnKSB7CiAgICAgaWYgKGFyZyAhPSAiaGVsbG8iKSB7CiAgICAgICBUX0VSUk9SX0FCT1JUKCJXUk9ORyBTVFJJTkcgKCVzKSEhISEiLCBhcmcuY19zdHIoKSk7CiAgICAgfQogICAgIG91dCA9IGFyZzsKICAgfQotICB2b2lkIGVjaG9MaXN0KHZlY3RvcjxpbnQ4X3Q+ICZvdXQsIGNvbnN0IHZlY3RvcjxpbnQ4X3Q+ICZhcmcpIHsgb3V0ID0gYXJnOyB9Ci0gIHZvaWQgZWNob1NldChzZXQ8aW50OF90PiAmb3V0LCBjb25zdCBzZXQ8aW50OF90PiAmYXJnKSB7IG91dCA9IGFyZzsgfQotICB2b2lkIGVjaG9NYXAobWFwPGludDhfdCwgaW50OF90PiAmb3V0LCBjb25zdCBtYXA8aW50OF90LCBpbnQ4X3Q+ICZhcmcpIHsgb3V0ID0gYXJnOyB9CisgIHZvaWQgZWNob0xpc3QodmVjdG9yPGludDhfdD4mIG91dCwgY29uc3QgdmVjdG9yPGludDhfdD4mIGFyZykgeyBvdXQgPSBhcmc7IH0KKyAgdm9pZCBlY2hvU2V0KHNldDxpbnQ4X3Q+JiBvdXQsIGNvbnN0IHNldDxpbnQ4X3Q+JiBhcmcpIHsgb3V0ID0gYXJnOyB9CisgIHZvaWQgZWNob01hcChtYXA8aW50OF90LCBpbnQ4X3Q+JiBvdXQsIGNvbnN0IG1hcDxpbnQ4X3QsIGludDhfdD4mIGFyZykgeyBvdXQgPSBhcmc7IH0KIAogcHJpdmF0ZToKICAgY291bnRfbWFwIGNvdW50c187CiAgIE11dGV4IGxvY2tfOwotCiB9OwogCi1jbGFzcyBDbGllbnRUaHJlYWQ6IHB1YmxpYyBSdW5uYWJsZSB7CitlbnVtIFRyYW5zcG9ydE9wZW5DbG9zZUJlaGF2aW9yIHsKKyAgT3BlbkFuZENsb3NlVHJhbnNwb3J0SW5UaHJlYWQsCisgIERvbnRPcGVuQW5kQ2xvc2VUcmFuc3BvcnRJblRocmVhZAorfTsKK2NsYXNzIENsaWVudFRocmVhZCA6IHB1YmxpYyBSdW5uYWJsZSB7CiBwdWJsaWM6Ci0KLSAgQ2xpZW50VGhyZWFkKHNoYXJlZF9wdHI8VFRyYW5zcG9ydD50cmFuc3BvcnQsIHNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gY2xpZW50LCBNb25pdG9yJiBtb25pdG9yLCBzaXplX3QmIHdvcmtlckNvdW50LCBzaXplX3QgbG9vcENvdW50LCBUVHlwZSBsb29wVHlwZSkgOgotICAgIF90cmFuc3BvcnQodHJhbnNwb3J0KSwKLSAgICBfY2xpZW50KGNsaWVudCksCi0gICAgX21vbml0b3IobW9uaXRvciksCi0gICAgX3dvcmtlckNvdW50KHdvcmtlckNvdW50KSwKLSAgICBfbG9vcENvdW50KGxvb3BDb3VudCksCi0gICAgX2xvb3BUeXBlKGxvb3BUeXBlKQotICB7fQorICBDbGllbnRUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlSWY+IGNsaWVudCwKKyAgICAgICAgICAgICAgIE1vbml0b3ImIG1vbml0b3IsCisgICAgICAgICAgICAgICBzaXplX3QmIHdvcmtlckNvdW50LAorICAgICAgICAgICAgICAgc2l6ZV90IGxvb3BDb3VudCwKKyAgICAgICAgICAgICAgIFRUeXBlIGxvb3BUeXBlLAorICAgICAgICAgICAgICAgVHJhbnNwb3J0T3BlbkNsb3NlQmVoYXZpb3IgYmVoYXZpb3IpCisgICAgOiBfdHJhbnNwb3J0KHRyYW5zcG9ydCksCisgICAgICBfY2xpZW50KGNsaWVudCksCisgICAgICBfbW9uaXRvcihtb25pdG9yKSwKKyAgICAgIF93b3JrZXJDb3VudCh3b3JrZXJDb3VudCksCisgICAgICBfbG9vcENvdW50KGxvb3BDb3VudCksCisgICAgICBfbG9vcFR5cGUobG9vcFR5cGUpLAorICAgICAgX2JlaGF2aW9yKGJlaGF2aW9yKSB7fQogCiAgIHZvaWQgcnVuKCkgewogCiAgICAgLy8gV2FpdCBmb3IgYWxsIHdvcmtlciB0aHJlYWRzIHRvIHN0YXJ0CiAKLSAgICB7U3luY2hyb25pemVkIHMoX21vbml0b3IpOwotICAgICAgd2hpbGUoX3dvcmtlckNvdW50ID09IDApIHsKKyAgICB7CisgICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisgICAgICB3aGlsZSAoX3dvcmtlckNvdW50ID09IDApIHsKICAgICAgICAgX21vbml0b3Iud2FpdCgpOwogICAgICAgfQogICAgIH0KIAogICAgIF9zdGFydFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOworICAgIGlmKF9iZWhhdmlvciA9PSBPcGVuQW5kQ2xvc2VUcmFuc3BvcnRJblRocmVhZCkgeworICAgICAgX3RyYW5zcG9ydC0+b3BlbigpOworICAgIH0KIAotICAgIF90cmFuc3BvcnQtPm9wZW4oKTsKLQotICAgIHN3aXRjaChfbG9vcFR5cGUpIHsKLSAgICBjYXNlIFRfVk9JRDogbG9vcEVjaG9Wb2lkKCk7IGJyZWFrOwotICAgIGNhc2UgVF9CWVRFOiBsb29wRWNob0J5dGUoKTsgYnJlYWs7Ci0gICAgY2FzZSBUX0kzMjogbG9vcEVjaG9JMzIoKTsgYnJlYWs7Ci0gICAgY2FzZSBUX0k2NDogbG9vcEVjaG9JNjQoKTsgYnJlYWs7Ci0gICAgY2FzZSBUX1NUUklORzogbG9vcEVjaG9TdHJpbmcoKTsgYnJlYWs7Ci0gICAgZGVmYXVsdDogY2VyciA8PCAiVW5leHBlY3RlZCBsb29wIHR5cGUiIDw8IF9sb29wVHlwZSA8PCBlbmRsOyBicmVhazsKKyAgICBzd2l0Y2ggKF9sb29wVHlwZSkgeworICAgIGNhc2UgVF9WT0lEOgorICAgICAgbG9vcEVjaG9Wb2lkKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfQllURToKKyAgICAgIGxvb3BFY2hvQnl0ZSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0kzMjoKKyAgICAgIGxvb3BFY2hvSTMyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfSTY0OgorICAgICAgbG9vcEVjaG9JNjQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9TVFJJTkc6CisgICAgICBsb29wRWNob1N0cmluZygpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGNlcnIgPDwgIlVuZXhwZWN0ZWQgbG9vcCB0eXBlIiA8PCBfbG9vcFR5cGUgPDwgZW5kbDsKKyAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIF9lbmRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKIAotICAgIF90cmFuc3BvcnQtPmNsb3NlKCk7CisgICAgaWYoX2JlaGF2aW9yID09IE9wZW5BbmRDbG9zZVRyYW5zcG9ydEluVGhyZWFkKSB7CisgICAgICBfdHJhbnNwb3J0LT5jbG9zZSgpOworICAgIH0KIAogICAgIF9kb25lID0gdHJ1ZTsKIAotICAgIHtTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisgICAgeworICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOwogCiAgICAgICBfd29ya2VyQ291bnQtLTsKIApAQCAtMTY4LDcgKzE4OSw4IEBACiAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKICAgICAgIGludDhfdCBhcmcgPSAxOwogICAgICAgaW50OF90IHJlc3VsdDsKLSAgICAgIHJlc3VsdCA9X2NsaWVudC0+ZWNob0J5dGUoYXJnKTsKKyAgICAgIHJlc3VsdCA9IF9jbGllbnQtPmVjaG9CeXRlKGFyZyk7CisgICAgICAodm9pZClyZXN1bHQ7CiAgICAgICBhc3NlcnQocmVzdWx0ID09IGFyZyk7CiAgICAgfQogICB9CkBAIC0xNzcsNyArMTk5LDggQEAKICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgewogICAgICAgaW50MzJfdCBhcmcgPSAxOwogICAgICAgaW50MzJfdCByZXN1bHQ7Ci0gICAgICByZXN1bHQgPV9jbGllbnQtPmVjaG9JMzIoYXJnKTsKKyAgICAgIHJlc3VsdCA9IF9jbGllbnQtPmVjaG9JMzIoYXJnKTsKKyAgICAgICh2b2lkKXJlc3VsdDsKICAgICAgIGFzc2VydChyZXN1bHQgPT0gYXJnKTsKICAgICB9CiAgIH0KQEAgLTE4Niw3ICsyMDksOCBAQAogICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7CiAgICAgICBpbnQ2NF90IGFyZyA9IDE7CiAgICAgICBpbnQ2NF90IHJlc3VsdDsKLSAgICAgIHJlc3VsdCA9X2NsaWVudC0+ZWNob0k2NChhcmcpOworICAgICAgcmVzdWx0ID0gX2NsaWVudC0+ZWNob0k2NChhcmcpOworICAgICAgKHZvaWQpcmVzdWx0OwogICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOwogICAgIH0KICAgfQpAQCAtMjAwLDggKzIyNCw4IEBACiAgICAgfQogICB9CiAKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBfdHJhbnNwb3J0OwotICBzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IF9jbGllbnQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBfdHJhbnNwb3J0OworICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZUlmPiBfY2xpZW50OwogICBNb25pdG9yJiBfbW9uaXRvcjsKICAgc2l6ZV90JiBfd29ya2VyQ291bnQ7CiAgIHNpemVfdCBfbG9vcENvdW50OwpAQCAtMjEwLDE4ICsyMzQsNDEgQEAKICAgaW50NjRfdCBfZW5kVGltZTsKICAgYm9vbCBfZG9uZTsKICAgTW9uaXRvciBfc2xlZXA7CisgIFRyYW5zcG9ydE9wZW5DbG9zZUJlaGF2aW9yIF9iZWhhdmlvcjsKIH07CiAKK2NsYXNzIFRTdGFydE9ic2VydmVyIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXIgeworcHVibGljOgorICBUU3RhcnRPYnNlcnZlcigpIDogYXdha2VfKGZhbHNlKSB7fQorICB2aXJ0dWFsIHZvaWQgcHJlU2VydmUoKSB7CisgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQgcyhtXyk7CisgICAgYXdha2VfID0gdHJ1ZTsKKyAgICBtXy5ub3RpZnlBbGwoKTsKKyAgfQorICB2b2lkIHdhaXRGb3JTZXJ2aWNlKCkgeworICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3luY2hyb25pemVkIHMobV8pOworICAgIHdoaWxlICghYXdha2VfKQorICAgICAgbV8ud2FpdEZvcmV2ZXIoKTsKKyAgfQogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKK3ByaXZhdGU6CisgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvciBtXzsKKyAgYm9vbCBhd2FrZV87Cit9OworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyNpZiBfV0lOMzIKKyAgdHJhbnNwb3J0OjpUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CisjZW5kaWYKIAogICBpbnQgcG9ydCA9IDkwOTE7CisgIHN0cmluZyBjbGllbnRUeXBlID0gInJlZ3VsYXIiOwogICBzdHJpbmcgc2VydmVyVHlwZSA9ICJ0aHJlYWQtcG9vbCI7CiAgIHN0cmluZyBwcm90b2NvbFR5cGUgPSAiYmluYXJ5IjsKICAgc2l6ZV90IHdvcmtlckNvdW50ID0gNDsKICAgc2l6ZV90IGNsaWVudENvdW50ID0gMjA7CiAgIHNpemVfdCBsb29wQ291bnQgPSA1MDAwMDsKLSAgVFR5cGUgbG9vcFR5cGUgID0gVF9WT0lEOworICBUVHlwZSBsb29wVHlwZSA9IFRfVk9JRDsKICAgc3RyaW5nIGNhbGxOYW1lID0gImVjaG9Wb2lkIjsKICAgYm9vbCBydW5TZXJ2ZXIgPSB0cnVlOwogICBib29sIGxvZ1JlcXVlc3RzID0gZmFsc2U7CkBAIC0yMzAsMjggKzI3NywzNCBAQAogCiAgIG9zdHJpbmdzdHJlYW0gdXNhZ2U7CiAKLSAgdXNhZ2UgPDwKLSAgICBhcmd2WzBdIDw8ICIgWy0tcG9ydD08cG9ydCBudW1iZXI+XSBbLS1zZXJ2ZXJdIFstLXNlcnZlci10eXBlPTxzZXJ2ZXItdHlwZT5dIFstLXByb3RvY29sLXR5cGU9PHByb3RvY29sLXR5cGU+XSBbLS13b3JrZXJzPTx3b3JrZXItY291bnQ+XSBbLS1jbGllbnRzPTxjbGllbnQtY291bnQ+XSBbLS1sb29wPTxsb29wLWNvdW50Pl0iIDw8IGVuZGwgPDwKLSAgICAiXHRjbGllbnRzICAgICAgICBOdW1iZXIgb2YgY2xpZW50IHRocmVhZHMgdG8gY3JlYXRlIC0gMCBpbXBsaWVzIG5vIGNsaWVudHMsIGkuZS4gc2VydmVyIG9ubHkuICBEZWZhdWx0IGlzICIgPDwgY2xpZW50Q291bnQgPDwgZW5kbCA8PAotICAgICJcdGhlbHAgICAgICAgICAgIFByaW50cyB0aGlzIGhlbHAgdGV4dC4iIDw8IGVuZGwgPDwKLSAgICAiXHRjYWxsICAgICAgICAgICBTZXJ2aWNlIG1ldGhvZCB0byBjYWxsLiAgRGVmYXVsdCBpcyAiIDw8IGNhbGxOYW1lIDw8IGVuZGwgPDwKLSAgICAiXHRsb29wICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJlbW90ZSB0aHJpZnQgY2FsbHMgZWFjaCBjbGllbnQgbWFrZXMuICBEZWZhdWx0IGlzICIgPDwgbG9vcENvdW50IDw8IGVuZGwgPDwKLSAgICAiXHRwb3J0ICAgICAgICAgICBUaGUgcG9ydCB0aGUgc2VydmVyIGFuZCBjbGllbnRzIHNob3VsZCBiaW5kIHRvIGZvciB0aHJpZnQgbmV0d29yayBjb25uZWN0aW9ucy4gIERlZmF1bHQgaXMgIiA8PCBwb3J0IDw8IGVuZGwgPDwKLSAgICAiXHRzZXJ2ZXIgICAgICAgICBSdW4gdGhlIFRocmlmdCBzZXJ2ZXIgaW4gdGhpcyBwcm9jZXNzLiAgRGVmYXVsdCBpcyAiIDw8IHJ1blNlcnZlciA8PCBlbmRsIDw8Ci0gICAgIlx0c2VydmVyLXR5cGUgICAgVHlwZSBvZiBzZXJ2ZXIsIFwic2ltcGxlXCIgb3IgXCJ0aHJlYWQtcG9vbFwiLiAgRGVmYXVsdCBpcyAiIDw8IHNlcnZlclR5cGUgPDwgZW5kbCA8PAotICAgICJcdHByb3RvY29sLXR5cGUgIFR5cGUgb2YgcHJvdG9jb2wsIFwiYmluYXJ5XCIsIFwiYXNjaWlcIiwgb3IgXCJ4bWxcIi4gIERlZmF1bHQgaXMgIiA8PCBwcm90b2NvbFR5cGUgPDwgZW5kbCA8PAotICAgICJcdGxvZy1yZXF1ZXN0ICAgIExvZyBhbGwgcmVxdWVzdCB0byAuL3JlcXVlc3Rsb2cudGxvZy4gRGVmYXVsdCBpcyAiIDw8IGxvZ1JlcXVlc3RzIDw8IGVuZGwgPDwKLSAgICAiXHRyZXBsYXktcmVxdWVzdCBSZXBsYXkgcmVxdWVzdHMgZnJvbSBsb2cgZmlsZSAoLi9yZXF1ZXN0bG9nLnRsb2cpIERlZmF1bHQgaXMgIiA8PCByZXBsYXlSZXF1ZXN0cyA8PCBlbmRsIDw8Ci0gICAgIlx0d29ya2VycyAgICAgICAgTnVtYmVyIG9mIHRocmVhZCBwb29scyB3b3JrZXJzLiAgT25seSB2YWxpZCBmb3IgdGhyZWFkLXBvb2wgc2VydmVyIHR5cGUuICBEZWZhdWx0IGlzICIgPDwgd29ya2VyQ291bnQgPDwgZW5kbDsKKyAgdXNhZ2UgPDwgYXJndlswXSA8PCAiIFstLXBvcnQ9PHBvcnQgbnVtYmVyPl0gWy0tc2VydmVyXSBbLS1zZXJ2ZXItdHlwZT08c2VydmVyLXR5cGU+XSAiCisgICAgICAgICAgICAgICAgICAgICAgIlstLXByb3RvY29sLXR5cGU9PHByb3RvY29sLXR5cGU+XSBbLS13b3JrZXJzPTx3b3JrZXItY291bnQ+XSAiCisgICAgICAgICAgICAgICAgICAgICAgIlstLWNsaWVudHM9PGNsaWVudC1jb3VudD5dIFstLWxvb3A9PGxvb3AtY291bnQ+XSAiCisgICAgICAgICAgICAgICAgICAgICAgIlstLWNsaWVudC10eXBlPTxjbGllbnQtdHlwZT5dIiA8PCBlbmRsCisgICAgICAgIDw8ICJcdGNsaWVudHMgICAgICAgIE51bWJlciBvZiBjbGllbnQgdGhyZWFkcyB0byBjcmVhdGUgLSAwIGltcGxpZXMgbm8gY2xpZW50cywgaS5lLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBvbmx5LiAgRGVmYXVsdCBpcyAiIDw8IGNsaWVudENvdW50IDw8IGVuZGwKKyAgICAgICAgPDwgIlx0aGVscCAgICAgICAgICAgUHJpbnRzIHRoaXMgaGVscCB0ZXh0LiIgPDwgZW5kbAorICAgICAgICA8PCAiXHRjYWxsICAgICAgICAgICBTZXJ2aWNlIG1ldGhvZCB0byBjYWxsLiAgRGVmYXVsdCBpcyAiIDw8IGNhbGxOYW1lIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0bG9vcCAgICAgICAgICAgVGhlIG51bWJlciBvZiByZW1vdGUgdGhyaWZ0IGNhbGxzIGVhY2ggY2xpZW50IG1ha2VzLiAgRGVmYXVsdCBpcyAiIDw8IGxvb3BDb3VudCA8PCBlbmRsCisgICAgICAgIDw8ICJcdHBvcnQgICAgICAgICAgIFRoZSBwb3J0IHRoZSBzZXJ2ZXIgYW5kIGNsaWVudHMgc2hvdWxkIGJpbmQgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgdGhyaWZ0IG5ldHdvcmsgY29ubmVjdGlvbnMuICBEZWZhdWx0IGlzICIgPDwgcG9ydCA8PCBlbmRsCisgICAgICAgIDw8ICJcdHNlcnZlciAgICAgICAgIFJ1biB0aGUgVGhyaWZ0IHNlcnZlciBpbiB0aGlzIHByb2Nlc3MuICBEZWZhdWx0IGlzICIgPDwgcnVuU2VydmVyIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0c2VydmVyLXR5cGUgICAgVHlwZSBvZiBzZXJ2ZXIsIFwic2ltcGxlXCIgb3IgXCJ0aHJlYWQtcG9vbFwiLiAgRGVmYXVsdCBpcyAiIDw8IHNlcnZlclR5cGUgPDwgZW5kbAorICAgICAgICA8PCAiXHRwcm90b2NvbC10eXBlICBUeXBlIG9mIHByb3RvY29sLCBcImJpbmFyeVwiLCBcImFzY2lpXCIsIG9yIFwieG1sXCIuICBEZWZhdWx0IGlzICIgPDwgcHJvdG9jb2xUeXBlIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0bG9nLXJlcXVlc3QgICAgTG9nIGFsbCByZXF1ZXN0IHRvIC4vcmVxdWVzdGxvZy50bG9nLiBEZWZhdWx0IGlzICIgPDwgbG9nUmVxdWVzdHMgPDwgZW5kbAorICAgICAgICA8PCAiXHRyZXBsYXktcmVxdWVzdCBSZXBsYXkgcmVxdWVzdHMgZnJvbSBsb2cgZmlsZSAoLi9yZXF1ZXN0bG9nLnRsb2cpIERlZmF1bHQgaXMgIiA8PCByZXBsYXlSZXF1ZXN0cyA8PCBlbmRsCisgICAgICAgIDw8ICJcdHdvcmtlcnMgICAgICAgIE51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gIE9ubHkgdmFsaWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgdGhyZWFkLXBvb2wgc2VydmVyIHR5cGUuICBEZWZhdWx0IGlzICIgPDwgd29ya2VyQ291bnQgPDwgZW5kbAorICAgICAgICA8PCAiXHRjbGllbnQtdHlwZSAgICBUeXBlIG9mIGNsaWVudCwgXCJyZWd1bGFyXCIgb3IgXCJjb25jdXJyZW50XCIuICBEZWZhdWx0IGlzICIgPDwgY2xpZW50VHlwZSA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CiAKLQotICBtYXA8c3RyaW5nLCBzdHJpbmc+ICBhcmdzOworICBtYXA8c3RyaW5nLCBzdHJpbmc+IGFyZ3M7CiAKICAgZm9yIChpbnQgaXggPSAxOyBpeCA8IGFyZ2M7IGl4KyspIHsKIAogICAgIHN0cmluZyBhcmcoYXJndltpeF0pOwogCi0gICAgaWYgKGFyZy5jb21wYXJlKDAsMiwgIi0tIikgPT0gMCkgeworICAgIGlmIChhcmcuY29tcGFyZSgwLCAyLCAiLS0iKSA9PSAwKSB7CiAKICAgICAgIHNpemVfdCBlbmQgPSBhcmcuZmluZF9maXJzdF9vZigiPSIsIDIpOwogCkBAIC0yNjMsNyArMzE2LDcgQEAKICAgICAgICAgYXJnc1trZXldID0gInRydWUiOwogICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmV4Y2VwdGVkIGNvbW1hbmQgbGluZSB0b2tlbjogIithcmcpOworICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5leGNlcHRlZCBjb21tYW5kIGxpbmUgdG9rZW46ICIgKyBhcmcpOwogICAgIH0KICAgfQogCkBAIC0zMTMsMTQ1ICszNjYsMTg5IEBACiAKICAgICAgIH0gZWxzZSB7CiAKLSAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBzZXJ2ZXIgdHlwZSAiK3NlcnZlclR5cGUpOworICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHNlcnZlciB0eXBlICIgKyBzZXJ2ZXJUeXBlKTsKICAgICAgIH0KICAgICB9CisgICAgaWYgKCFhcmdzWyJjbGllbnQtdHlwZSJdLmVtcHR5KCkpIHsKKyAgICAgIGNsaWVudFR5cGUgPSBhcmdzWyJjbGllbnQtdHlwZSJdOwogCisgICAgICBpZiAoY2xpZW50VHlwZSA9PSAicmVndWxhciIpIHsKKworICAgICAgfSBlbHNlIGlmIChjbGllbnRUeXBlID09ICJjb25jdXJyZW50IikgeworCisgICAgICB9IGVsc2UgeworCisgICAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gY2xpZW50IHR5cGUgIiArIGNsaWVudFR5cGUpOworICAgICAgfQorICAgIH0KICAgICBpZiAoIWFyZ3NbIndvcmtlcnMiXS5lbXB0eSgpKSB7CiAgICAgICB3b3JrZXJDb3VudCA9IGF0b2koYXJnc1sid29ya2VycyJdLmNfc3RyKCkpOwogICAgIH0KIAotICB9IGNhdGNoKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CisgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CiAgICAgY2VyciA8PCBlLndoYXQoKSA8PCBlbmRsOwotICAgIGNlcnIgPDwgdXNhZ2U7CisgICAgY2VyciA8PCB1c2FnZS5zdHIoKTsKICAgfQogCi0gIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5ID0gc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+KG5ldyBQb3NpeFRocmVhZEZhY3RvcnkoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkKKyAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKTsKIAogICAvLyBEaXNwYXRjaGVyCi0gIHNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOworICBzdGQ6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOwogCiAgIGlmIChyZXBsYXlSZXF1ZXN0cykgewotICAgIHNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOwotICAgIHNoYXJlZF9wdHI8U2VydmljZVByb2Nlc3Nvcj4gc2VydmljZVByb2Nlc3NvcihuZXcgU2VydmljZVByb2Nlc3NvcihzZXJ2aWNlSGFuZGxlcikpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2ZXI+IHNlcnZpY2VIYW5kbGVyKG5ldyBTZXJ2ZXIoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKIAogICAgIC8vIFRyYW5zcG9ydHMKLSAgICBzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVRyYW5zcG9ydD4gZmlsZVRyYW5zcG9ydChuZXcgVEZpbGVUcmFuc3BvcnQocmVxdWVzdExvZ1BhdGgpKTsKICAgICBmaWxlVHJhbnNwb3J0LT5zZXRDaHVua1NpemUoMiAqIDEwMjQgKiAxMDI0KTsKICAgICBmaWxlVHJhbnNwb3J0LT5zZXRNYXhFdmVudFNpemUoMTAyNCAqIDE2KTsKICAgICBmaWxlVHJhbnNwb3J0LT5zZWVrVG9FbmQoKTsKIAogICAgIC8vIFByb3RvY29sIEZhY3RvcnkKLSAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOwogCi0gICAgVEZpbGVQcm9jZXNzb3IgZmlsZVByb2Nlc3NvcihzZXJ2aWNlUHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVRyYW5zcG9ydCk7CisgICAgVEZpbGVQcm9jZXNzb3IgZmlsZVByb2Nlc3NvcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIGZpbGVUcmFuc3BvcnQpOwogCiAgICAgZmlsZVByb2Nlc3Nvci5wcm9jZXNzKDAsIHRydWUpOwogICAgIGV4aXQoMCk7CiAgIH0KIAotCiAgIGlmIChydW5TZXJ2ZXIpIHsKIAotICAgIHNoYXJlZF9wdHI8U2VydmljZVByb2Nlc3Nvcj4gc2VydmljZVByb2Nlc3NvcihuZXcgU2VydmljZVByb2Nlc3NvcihzZXJ2aWNlSGFuZGxlcikpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7CiAKICAgICAvLyBUcmFuc3BvcnQKLSAgICBzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNlcnZlclNvY2tldChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNlcnZlclNvY2tldChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7CiAKICAgICAvLyBUcmFuc3BvcnQgRmFjdG9yeQotICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkobmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOwogCiAgICAgLy8gUHJvdG9jb2wgRmFjdG9yeQotICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CiAKICAgICBpZiAobG9nUmVxdWVzdHMpIHsKICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGxvZyBmaWxlCi0gICAgICBzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOwogICAgICAgZmlsZVRyYW5zcG9ydC0+c2V0Q2h1bmtTaXplKDIgKiAxMDI0ICogMTAyNCk7CiAgICAgICBmaWxlVHJhbnNwb3J0LT5zZXRNYXhFdmVudFNpemUoMTAyNCAqIDE2KTsKIAotICAgICAgdHJhbnNwb3J0RmFjdG9yeSA9Ci0gICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KGZpbGVUcmFuc3BvcnQpKTsKKyAgICAgIHRyYW5zcG9ydEZhY3RvcnkKKyAgICAgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoZmlsZVRyYW5zcG9ydCkpOwogICAgIH0KIAotICAgIHNoYXJlZF9wdHI8VGhyZWFkPiBzZXJ2ZXJUaHJlYWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXI+IHNlcnZlcjsKIAogICAgIGlmIChzZXJ2ZXJUeXBlID09ICJzaW1wbGUiKSB7CiAKLSAgICAgIHNlcnZlclRocmVhZCA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzaGFyZWRfcHRyPFRTZXJ2ZXI+KG5ldyBUU2ltcGxlU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSkpOworICAgICAgc2VydmVyLnJlc2V0KAorICAgICAgICAgIG5ldyBUU2ltcGxlU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSk7CiAKICAgICB9IGVsc2UgaWYgKHNlcnZlclR5cGUgPT0gInRocmVhZGVkIikgewogCi0gICAgICBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc2hhcmVkX3B0cjxUU2VydmVyPihuZXcgVFRocmVhZGVkU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSkpOworICAgICAgc2VydmVyLnJlc2V0KAorICAgICAgICAgIG5ldyBUVGhyZWFkZWRTZXJ2ZXIoc2VydmljZVByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKTsKIAogICAgIH0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSAidGhyZWFkLXBvb2wiKSB7CiAKLSAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2VyQ291bnQpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIKKyAgICAgICAgICA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2VyQ291bnQpOwogCiAgICAgICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOwogICAgICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKLSAgICAgIHNlcnZlclRocmVhZCA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzaGFyZWRfcHRyPFRTZXJ2ZXI+KG5ldyBUVGhyZWFkUG9vbFNlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgdGhyZWFkTWFuYWdlcikpKTsKKyAgICAgIHNlcnZlci5yZXNldChuZXcgVFRocmVhZFBvb2xTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyU29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZE1hbmFnZXIpKTsKICAgICB9CiAKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFN0YXJ0T2JzZXJ2ZXI+IG9ic2VydmVyKG5ldyBUU3RhcnRPYnNlcnZlcik7CisgICAgc2VydmVyLT5zZXRTZXJ2ZXJFdmVudEhhbmRsZXIob2JzZXJ2ZXIpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHNlcnZlclRocmVhZCA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzZXJ2ZXIpOworCiAgICAgY2VyciA8PCAiU3RhcnRpbmcgdGhlIHNlcnZlciBvbiBwb3J0ICIgPDwgcG9ydCA8PCBlbmRsOwogCiAgICAgc2VydmVyVGhyZWFkLT5zdGFydCgpOworICAgIG9ic2VydmVyLT53YWl0Rm9yU2VydmljZSgpOwogCiAgICAgLy8gSWYgd2UgYXJlbid0IHJ1bm5pbmcgY2xpZW50cywganVzdCB3YWl0IGZvcmV2ZXIgZm9yIGV4dGVybmFsIGNsaWVudHMKLQogICAgIGlmIChjbGllbnRDb3VudCA9PSAwKSB7CiAgICAgICBzZXJ2ZXJUaHJlYWQtPmpvaW4oKTsKICAgICB9CiAgIH0KIAotICBpZiAoY2xpZW50Q291bnQgPiAwKSB7CisgIGlmIChjbGllbnRDb3VudCA+IDApIHsgLy9GSVhNRTogc3RhcnQgaGVyZSBmb3IgY2xpZW50IHR5cGU/CiAKICAgICBNb25pdG9yIG1vbml0b3I7CiAKICAgICBzaXplX3QgdGhyZWFkQ291bnQgPSAwOwogCi0gICAgc2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+IGNsaWVudFRocmVhZHM7CisgICAgc2V0PHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+ID4gY2xpZW50VGhyZWFkczsKIAotICAgIGlmIChjYWxsTmFtZSA9PSAiZWNob1ZvaWQiKSB7IGxvb3BUeXBlID0gVF9WT0lEO30KLSAgICBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0J5dGUiKSB7IGxvb3BUeXBlID0gVF9CWVRFO30KLSAgICBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0kzMiIpIHsgbG9vcFR5cGUgPSBUX0kzMjt9Ci0gICAgZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9JNjQiKSB7IGxvb3BUeXBlID0gVF9JNjQ7fQotICAgIGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvU3RyaW5nIikgeyBsb29wVHlwZSA9IFRfU1RSSU5HO30KLSAgICBlbHNlIHt0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHNlcnZpY2UgY2FsbCAiK2NhbGxOYW1lKTt9Ci0KLSAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgY2xpZW50Q291bnQ7IGl4KyspIHsKLQotICAgICAgc2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHBvcnQpKTsKLSAgICAgIHNoYXJlZF9wdHI8VEJ1ZmZlcmVkVHJhbnNwb3J0PiBidWZmZXJlZFNvY2tldChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCwgMjA0OCkpOwotICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmZmVyZWRTb2NrZXQpKTsKLSAgICAgIHNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gc2VydmljZUNsaWVudChuZXcgU2VydmljZUNsaWVudChwcm90b2NvbCkpOwotCi0gICAgICBjbGllbnRUaHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+KG5ldyBDbGllbnRUaHJlYWQoc29ja2V0LCBzZXJ2aWNlQ2xpZW50LCBtb25pdG9yLCB0aHJlYWRDb3VudCwgbG9vcENvdW50LCBsb29wVHlwZSkpKSk7CisgICAgaWYgKGNhbGxOYW1lID09ICJlY2hvVm9pZCIpIHsKKyAgICAgIGxvb3BUeXBlID0gVF9WT0lEOworICAgIH0gZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9CeXRlIikgeworICAgICAgbG9vcFR5cGUgPSBUX0JZVEU7CisgICAgfSBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0kzMiIpIHsKKyAgICAgIGxvb3BUeXBlID0gVF9JMzI7CisgICAgfSBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0k2NCIpIHsKKyAgICAgIGxvb3BUeXBlID0gVF9JNjQ7CisgICAgfSBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob1N0cmluZyIpIHsKKyAgICAgIGxvb3BUeXBlID0gVF9TVFJJTkc7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gc2VydmljZSBjYWxsICIgKyBjYWxsTmFtZSk7CiAgICAgfQogCi0gICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPjo6Y29uc3RfaXRlcmF0b3IgdGhyZWFkID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOyB0aHJlYWQgIT0gY2xpZW50VGhyZWFkcy5lbmQoKTsgdGhyZWFkKyspIHsKKyAgICBpZihjbGllbnRUeXBlID09ICJyZWd1bGFyIikgeworICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IGNsaWVudENvdW50OyBpeCsrKSB7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgcG9ydCkpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEJ1ZmZlcmVkVHJhbnNwb3J0PiBidWZmZXJlZFNvY2tldChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCwgMjA0OCkpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKGJ1ZmZlcmVkU29ja2V0KSk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBzZXJ2aWNlQ2xpZW50KG5ldyBTZXJ2aWNlQ2xpZW50KHByb3RvY29sKSk7CisKKyAgICAgICAgY2xpZW50VGhyZWFkcy5pbnNlcnQodGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+KAorICAgICAgICAgICAgbmV3IENsaWVudFRocmVhZChzb2NrZXQsIHNlcnZpY2VDbGllbnQsIG1vbml0b3IsIHRocmVhZENvdW50LCBsb29wQ291bnQsIGxvb3BUeXBlLCBPcGVuQW5kQ2xvc2VUcmFuc3BvcnRJblRocmVhZCkpKSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmKGNsaWVudFR5cGUgPT0gImNvbmN1cnJlbnQiKSB7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBwb3J0KSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEJ1ZmZlcmVkVHJhbnNwb3J0PiBidWZmZXJlZFNvY2tldChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCwgMjA0OCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbChidWZmZXJlZFNvY2tldCkpOworICAgICAgLy9zdGQ6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gc2VydmljZUNsaWVudChuZXcgU2VydmljZUNsaWVudChwcm90b2NvbCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VDb25jdXJyZW50Q2xpZW50PiBzZXJ2aWNlQ2xpZW50KG5ldyBTZXJ2aWNlQ29uY3VycmVudENsaWVudChwcm90b2NvbCkpOworICAgICAgc29ja2V0LT5vcGVuKCk7CisgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgY2xpZW50Q291bnQ7IGl4KyspIHsKKyAgICAgICAgY2xpZW50VGhyZWFkcy5pbnNlcnQodGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+KAorICAgICAgICAgICAgbmV3IENsaWVudFRocmVhZChzb2NrZXQsIHNlcnZpY2VDbGllbnQsIG1vbml0b3IsIHRocmVhZENvdW50LCBsb29wQ291bnQsIGxvb3BUeXBlLCBEb250T3BlbkFuZENsb3NlVHJhbnNwb3J0SW5UaHJlYWQpKSkpOworICAgICAgfQorICAgIH0KKworICAgIGZvciAoc3RkOjpzZXQ8c3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gPjo6Y29uc3RfaXRlcmF0b3IgdGhyZWFkID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOworICAgICAgICAgdGhyZWFkICE9IGNsaWVudFRocmVhZHMuZW5kKCk7CisgICAgICAgICB0aHJlYWQrKykgewogICAgICAgKCp0aHJlYWQpLT5zdGFydCgpOwogICAgIH0KIAogICAgIGludDY0X3QgdGltZTAwOwogICAgIGludDY0X3QgdGltZTAxOwogCi0gICAge1N5bmNocm9uaXplZCBzKG1vbml0b3IpOworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwogICAgICAgdGhyZWFkQ291bnQgPSBjbGllbnRDb3VudDsKIAotICAgICAgY2VyciA8PCAiTGF1bmNoICI8PCBjbGllbnRDb3VudCA8PCAiIGNsaWVudCB0aHJlYWRzIiA8PCBlbmRsOworICAgICAgY2VyciA8PCAiTGF1bmNoICIgPDwgY2xpZW50Q291bnQgPDwgIiAiIDw8IGNsaWVudFR5cGUgPDwgIiBjbGllbnQgdGhyZWFkcyIgPDwgZW5kbDsKIAotICAgICAgdGltZTAwID0gIFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgICB0aW1lMDAgPSBVdGlsOjpjdXJyZW50VGltZSgpOwogCiAgICAgICBtb25pdG9yLm5vdGlmeUFsbCgpOwogCi0gICAgICB3aGlsZSh0aHJlYWRDb3VudCA+IDApIHsKKyAgICAgIHdoaWxlICh0aHJlYWRDb3VudCA+IDApIHsKICAgICAgICAgbW9uaXRvci53YWl0KCk7CiAgICAgICB9CiAKLSAgICAgIHRpbWUwMSA9ICBVdGlsOjpjdXJyZW50VGltZSgpOworICAgICAgdGltZTAxID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKICAgICB9CiAKICAgICBpbnQ2NF90IGZpcnN0VGltZSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdMTDsKQEAgLTQ2MSw5ICs1NTgsMTIgQEAKICAgICBpbnQ2NF90IG1pblRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7CiAgICAgaW50NjRfdCBtYXhUaW1lID0gMDsKIAotICAgIGZvciAoc2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+OjppdGVyYXRvciBpeCA9IGNsaWVudFRocmVhZHMuYmVnaW4oKTsgaXggIT0gY2xpZW50VGhyZWFkcy5lbmQoKTsgaXgrKykgeworICAgIGZvciAoc2V0PHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+ID46Oml0ZXJhdG9yIGl4ID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOworICAgICAgICAgaXggIT0gY2xpZW50VGhyZWFkcy5lbmQoKTsKKyAgICAgICAgIGl4KyspIHsKIAotICAgICAgc2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+IGNsaWVudCA9IGR5bmFtaWNfcG9pbnRlcl9jYXN0PENsaWVudFRocmVhZD4oKCppeCktPnJ1bm5hYmxlKCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPENsaWVudFRocmVhZD4gY2xpZW50CisgICAgICAgICAgPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PENsaWVudFRocmVhZD4oKCppeCktPnJ1bm5hYmxlKCkpOwogCiAgICAgICBpbnQ2NF90IGRlbHRhID0gY2xpZW50LT5fZW5kVGltZSAtIGNsaWVudC0+X3N0YXJ0VGltZTsKIApAQCAtNDg1LDEzICs1ODUsMTMgQEAKICAgICAgICAgbWF4VGltZSA9IGRlbHRhOwogICAgICAgfQogCi0gICAgICBhdmVyYWdlVGltZSs9IGRlbHRhOworICAgICAgYXZlcmFnZVRpbWUgKz0gZGVsdGE7CiAgICAgfQogCiAgICAgYXZlcmFnZVRpbWUgLz0gY2xpZW50Q291bnQ7CiAKLQotICAgIGNvdXQgPDwgICJ3b3JrZXJzIDoiIDw8IHdvcmtlckNvdW50IDw8ICIsIGNsaWVudCA6ICIgPDwgY2xpZW50Q291bnQgPDwgIiwgbG9vcHMgOiAiIDw8IGxvb3BDb3VudCA8PCAiLCByYXRlIDogIiA8PCAoY2xpZW50Q291bnQgKiBsb29wQ291bnQgKiAxMDAwKSAvICgoZG91YmxlKSh0aW1lMDEgLSB0aW1lMDApKSA8PCBlbmRsOworICAgIGNvdXQgPDwgIndvcmtlcnMgOiIgPDwgd29ya2VyQ291bnQgPDwgIiwgY2xpZW50IDogIiA8PCBjbGllbnRDb3VudCA8PCAiLCBsb29wcyA6ICIgPDwgbG9vcENvdW50CisgICAgICAgICA8PCAiLCByYXRlIDogIiA8PCAoY2xpZW50Q291bnQgKiBsb29wQ291bnQgKiAxMDAwKSAvICgoZG91YmxlKSh0aW1lMDEgLSB0aW1lMDApKSA8PCBlbmRsOwogCiAgICAgY291bnRfbWFwIGNvdW50ID0gc2VydmljZUhhbmRsZXItPmdldENvdW50KCk7CiAgICAgY291bnRfbWFwOjppdGVyYXRvciBpdGVyOwpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvc3JjL1N0cmVzc1Rlc3ROb25CbG9ja2luZy5jcHAgYi90ZXN0L2NwcC9zcmMvU3RyZXNzVGVzdE5vbkJsb2NraW5nLmNwcApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDBkOGJjM2EuLjFkM2VkNzMKLS0tIGEvdGVzdC9jcHAvc3JjL1N0cmVzc1Rlc3ROb25CbG9ja2luZy5jcHAKKysrIGIvdGVzdC9jcHAvc3JjL1N0cmVzc1Rlc3ROb25CbG9ja2luZy5jcHAKQEAgLTE3LDM1ICsxNywzNSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9Nb25pdG9yLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvVXRpbC5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L011dGV4Lmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+Ci0jaW5jbHVkZSA8c2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+Ci0jaW5jbHVkZSA8c2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTb2NrZXQuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8VExvZ2dpbmcuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVExvZ2dpbmcuaD4KIAogI2luY2x1ZGUgIlNlcnZpY2UuaCIKIAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotCiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KICNpbmNsdWRlIDxzc3RyZWFtPgogI2luY2x1ZGUgPG1hcD4KKyNpZiBfV0lOMzIKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgorI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgYm9vc3Q7CiAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CkBAIC01NiwyMyArNTYsMTggQEAKIHVzaW5nIG5hbWVzcGFjZSB0ZXN0OjpzdHJlc3M7CiAKIHN0cnVjdCBlcXN0ciB7Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RyY21wKHMxLCBzMikgPT0gMDsKLSAgfQorICBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSBjb25zdCB7IHJldHVybiBzdHJjbXAoczEsIHMyKSA9PSAwOyB9CiB9OwogCiBzdHJ1Y3QgbHRzdHIgewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cmNtcChzMSwgczIpIDwgMDsKLSAgfQorICBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSBjb25zdCB7IHJldHVybiBzdHJjbXAoczEsIHMyKSA8IDA7IH0KIH07CiAKLQogLy8gdHlwZWRlZiBoYXNoX21hcDxjb25zdCBjaGFyKiwgaW50LCBoYXNoPGNvbnN0IGNoYXIqPiwgZXFzdHI+IGNvdW50X21hcDsKIHR5cGVkZWYgbWFwPGNvbnN0IGNoYXIqLCBpbnQsIGx0c3RyPiBjb3VudF9tYXA7CiAKIGNsYXNzIFNlcnZlciA6IHB1YmxpYyBTZXJ2aWNlSWYgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgU2VydmVyKCkge30KIAogICB2b2lkIGNvdW50KGNvbnN0IGNoYXIqIG1ldGhvZCkgewpAQCAtODQsNyArNzksNyBAQAogICB2b2lkIGVjaG9Wb2lkKCkgewogICAgIGNvdW50KCJlY2hvVm9pZCIpOwogICAgIC8vIFNsZWVwIHRvIHNpbXVsYXRlIHdvcmsKLSAgICB1c2xlZXAoNTAwMCk7CisgICAgVEhSSUZUX1NMRUVQX1VTRUMoMSk7CiAgICAgcmV0dXJuOwogICB9CiAKQEAgLTkzLDU4ICs4OCw3MyBAQAogICAgIHJldHVybiBjb3VudHNfOwogICB9CiAKLSAgaW50OF90IGVjaG9CeXRlKGNvbnN0IGludDhfdCBhcmcpIHtyZXR1cm4gYXJnO30KLSAgaW50MzJfdCBlY2hvSTMyKGNvbnN0IGludDMyX3QgYXJnKSB7cmV0dXJuIGFyZzt9Ci0gIGludDY0X3QgZWNob0k2NChjb25zdCBpbnQ2NF90IGFyZykge3JldHVybiBhcmc7fQotICB2b2lkIGVjaG9TdHJpbmcoc3RyaW5nJiBvdXQsIGNvbnN0IHN0cmluZyAmYXJnKSB7CisgIGludDhfdCBlY2hvQnl0ZShjb25zdCBpbnQ4X3QgYXJnKSB7IHJldHVybiBhcmc7IH0KKyAgaW50MzJfdCBlY2hvSTMyKGNvbnN0IGludDMyX3QgYXJnKSB7IHJldHVybiBhcmc7IH0KKyAgaW50NjRfdCBlY2hvSTY0KGNvbnN0IGludDY0X3QgYXJnKSB7IHJldHVybiBhcmc7IH0KKyAgdm9pZCBlY2hvU3RyaW5nKHN0cmluZyYgb3V0LCBjb25zdCBzdHJpbmcmIGFyZykgewogICAgIGlmIChhcmcgIT0gImhlbGxvIikgewogICAgICAgVF9FUlJPUl9BQk9SVCgiV1JPTkcgU1RSSU5HICglcykhISEhIiwgYXJnLmNfc3RyKCkpOwogICAgIH0KICAgICBvdXQgPSBhcmc7CiAgIH0KLSAgdm9pZCBlY2hvTGlzdCh2ZWN0b3I8aW50OF90PiAmb3V0LCBjb25zdCB2ZWN0b3I8aW50OF90PiAmYXJnKSB7IG91dCA9IGFyZzsgfQotICB2b2lkIGVjaG9TZXQoc2V0PGludDhfdD4gJm91dCwgY29uc3Qgc2V0PGludDhfdD4gJmFyZykgeyBvdXQgPSBhcmc7IH0KLSAgdm9pZCBlY2hvTWFwKG1hcDxpbnQ4X3QsIGludDhfdD4gJm91dCwgY29uc3QgbWFwPGludDhfdCwgaW50OF90PiAmYXJnKSB7IG91dCA9IGFyZzsgfQorICB2b2lkIGVjaG9MaXN0KHZlY3RvcjxpbnQ4X3Q+JiBvdXQsIGNvbnN0IHZlY3RvcjxpbnQ4X3Q+JiBhcmcpIHsgb3V0ID0gYXJnOyB9CisgIHZvaWQgZWNob1NldChzZXQ8aW50OF90PiYgb3V0LCBjb25zdCBzZXQ8aW50OF90PiYgYXJnKSB7IG91dCA9IGFyZzsgfQorICB2b2lkIGVjaG9NYXAobWFwPGludDhfdCwgaW50OF90PiYgb3V0LCBjb25zdCBtYXA8aW50OF90LCBpbnQ4X3Q+JiBhcmcpIHsgb3V0ID0gYXJnOyB9CiAKIHByaXZhdGU6CiAgIGNvdW50X21hcCBjb3VudHNfOwogICBNdXRleCBsb2NrXzsKLQogfTsKIAotY2xhc3MgQ2xpZW50VGhyZWFkOiBwdWJsaWMgUnVubmFibGUgeworY2xhc3MgQ2xpZW50VGhyZWFkIDogcHVibGljIFJ1bm5hYmxlIHsKIHB1YmxpYzoKLQotICBDbGllbnRUaHJlYWQoc2hhcmVkX3B0cjxUVHJhbnNwb3J0PnRyYW5zcG9ydCwgc2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBjbGllbnQsIE1vbml0b3ImIG1vbml0b3IsIHNpemVfdCYgd29ya2VyQ291bnQsIHNpemVfdCBsb29wQ291bnQsIFRUeXBlIGxvb3BUeXBlKSA6Ci0gICAgX3RyYW5zcG9ydCh0cmFuc3BvcnQpLAotICAgIF9jbGllbnQoY2xpZW50KSwKLSAgICBfbW9uaXRvcihtb25pdG9yKSwKLSAgICBfd29ya2VyQ291bnQod29ya2VyQ291bnQpLAotICAgIF9sb29wQ291bnQobG9vcENvdW50KSwKLSAgICBfbG9vcFR5cGUobG9vcFR5cGUpCi0gIHt9CisgIENsaWVudFRocmVhZChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IGNsaWVudCwKKyAgICAgICAgICAgICAgIE1vbml0b3ImIG1vbml0b3IsCisgICAgICAgICAgICAgICBzaXplX3QmIHdvcmtlckNvdW50LAorICAgICAgICAgICAgICAgc2l6ZV90IGxvb3BDb3VudCwKKyAgICAgICAgICAgICAgIFRUeXBlIGxvb3BUeXBlKQorICAgIDogX3RyYW5zcG9ydCh0cmFuc3BvcnQpLAorICAgICAgX2NsaWVudChjbGllbnQpLAorICAgICAgX21vbml0b3IobW9uaXRvciksCisgICAgICBfd29ya2VyQ291bnQod29ya2VyQ291bnQpLAorICAgICAgX2xvb3BDb3VudChsb29wQ291bnQpLAorICAgICAgX2xvb3BUeXBlKGxvb3BUeXBlKSB7fQogCiAgIHZvaWQgcnVuKCkgewogCiAgICAgLy8gV2FpdCBmb3IgYWxsIHdvcmtlciB0aHJlYWRzIHRvIHN0YXJ0CiAKLSAgICB7U3luY2hyb25pemVkIHMoX21vbml0b3IpOwotICAgICAgICB3aGlsZShfd29ya2VyQ291bnQgPT0gMCkgewotICAgICAgICAgIF9tb25pdG9yLndhaXQoKTsKLSAgICAgICAgfQorICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKyAgICAgIHdoaWxlIChfd29ya2VyQ291bnQgPT0gMCkgeworICAgICAgICBfbW9uaXRvci53YWl0KCk7CisgICAgICB9CiAgICAgfQogCiAgICAgX3N0YXJ0VGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CiAKICAgICBfdHJhbnNwb3J0LT5vcGVuKCk7CiAKLSAgICBzd2l0Y2goX2xvb3BUeXBlKSB7Ci0gICAgY2FzZSBUX1ZPSUQ6IGxvb3BFY2hvVm9pZCgpOyBicmVhazsKLSAgICBjYXNlIFRfQllURTogbG9vcEVjaG9CeXRlKCk7IGJyZWFrOwotICAgIGNhc2UgVF9JMzI6IGxvb3BFY2hvSTMyKCk7IGJyZWFrOwotICAgIGNhc2UgVF9JNjQ6IGxvb3BFY2hvSTY0KCk7IGJyZWFrOwotICAgIGNhc2UgVF9TVFJJTkc6IGxvb3BFY2hvU3RyaW5nKCk7IGJyZWFrOwotICAgIGRlZmF1bHQ6IGNlcnIgPDwgIlVuZXhwZWN0ZWQgbG9vcCB0eXBlIiA8PCBfbG9vcFR5cGUgPDwgZW5kbDsgYnJlYWs7CisgICAgc3dpdGNoIChfbG9vcFR5cGUpIHsKKyAgICBjYXNlIFRfVk9JRDoKKyAgICAgIGxvb3BFY2hvVm9pZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0JZVEU6CisgICAgICBsb29wRWNob0J5dGUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9JMzI6CisgICAgICBsb29wRWNob0kzMigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0k2NDoKKyAgICAgIGxvb3BFY2hvSTY0KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfU1RSSU5HOgorICAgICAgbG9vcEVjaG9TdHJpbmcoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBjZXJyIDw8ICJVbmV4cGVjdGVkIGxvb3AgdHlwZSIgPDwgX2xvb3BUeXBlIDw8IGVuZGw7CisgICAgICBicmVhazsKICAgICB9CiAKICAgICBfZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CkBAIC0xNTMsNyArMTYzLDggQEAKIAogICAgIF9kb25lID0gdHJ1ZTsKIAotICAgIHtTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisgICAgeworICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOwogCiAgICAgICBfd29ya2VyQ291bnQtLTsKIApAQCAtMTc0LDcgKzE4NSw4IEBACiAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKICAgICAgIGludDhfdCBhcmcgPSAxOwogICAgICAgaW50OF90IHJlc3VsdDsKLSAgICAgIHJlc3VsdCA9X2NsaWVudC0+ZWNob0J5dGUoYXJnKTsKKyAgICAgIHJlc3VsdCA9IF9jbGllbnQtPmVjaG9CeXRlKGFyZyk7CisgICAgICAodm9pZClyZXN1bHQ7CiAgICAgICBhc3NlcnQocmVzdWx0ID09IGFyZyk7CiAgICAgfQogICB9CkBAIC0xODMsNyArMTk1LDggQEAKICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgewogICAgICAgaW50MzJfdCBhcmcgPSAxOwogICAgICAgaW50MzJfdCByZXN1bHQ7Ci0gICAgICByZXN1bHQgPV9jbGllbnQtPmVjaG9JMzIoYXJnKTsKKyAgICAgIHJlc3VsdCA9IF9jbGllbnQtPmVjaG9JMzIoYXJnKTsKKyAgICAgICh2b2lkKXJlc3VsdDsKICAgICAgIGFzc2VydChyZXN1bHQgPT0gYXJnKTsKICAgICB9CiAgIH0KQEAgLTE5Miw3ICsyMDUsOCBAQAogICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7CiAgICAgICBpbnQ2NF90IGFyZyA9IDE7CiAgICAgICBpbnQ2NF90IHJlc3VsdDsKLSAgICAgIHJlc3VsdCA9X2NsaWVudC0+ZWNob0k2NChhcmcpOworICAgICAgcmVzdWx0ID0gX2NsaWVudC0+ZWNob0k2NChhcmcpOworICAgICAgKHZvaWQpcmVzdWx0OwogICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOwogICAgIH0KICAgfQpAQCAtMjA2LDggKzIyMCw4IEBACiAgICAgfQogICB9CiAKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBfdHJhbnNwb3J0OwotICBzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IF9jbGllbnQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBfdHJhbnNwb3J0OworICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gX2NsaWVudDsKICAgTW9uaXRvciYgX21vbml0b3I7CiAgIHNpemVfdCYgX3dvcmtlckNvdW50OwogICBzaXplX3QgX2xvb3BDb3VudDsKQEAgLTIxOCwxNiArMjMyLDE4IEBACiAgIE1vbml0b3IgX3NsZWVwOwogfTsKIAotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworI2lmIF9XSU4zMgorICB0cmFuc3BvcnQ6OlRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUoKTsKKyNlbmRpZgogCiAgIGludCBwb3J0ID0gOTA5MTsKICAgc3RyaW5nIHNlcnZlclR5cGUgPSAic2ltcGxlIjsKICAgc3RyaW5nIHByb3RvY29sVHlwZSA9ICJiaW5hcnkiOwotICBzaXplX3Qgd29ya2VyQ291bnQgPSA0OwotICBzaXplX3QgY2xpZW50Q291bnQgPSAyMDsKLSAgc2l6ZV90IGxvb3BDb3VudCA9IDUwMDAwOwotICBUVHlwZSBsb29wVHlwZSAgPSBUX1ZPSUQ7CisgIHVpbnQzMl90IHdvcmtlckNvdW50ID0gNDsKKyAgdWludDMyX3QgY2xpZW50Q291bnQgPSAyMDsKKyAgdWludDMyX3QgbG9vcENvdW50ID0gMTAwMDsKKyAgVFR5cGUgbG9vcFR5cGUgPSBUX1ZPSUQ7CiAgIHN0cmluZyBjYWxsTmFtZSA9ICJlY2hvVm9pZCI7CiAgIGJvb2wgcnVuU2VydmVyID0gdHJ1ZTsKICAgYm9vbCBsb2dSZXF1ZXN0cyA9IGZhbHNlOwpAQCAtMjM2LDI4ICsyNTIsMzQgQEAKIAogICBvc3RyaW5nc3RyZWFtIHVzYWdlOwogCi0gIHVzYWdlIDw8Ci0gICAgYXJndlswXSA8PCAiIFstLXBvcnQ9PHBvcnQgbnVtYmVyPl0gWy0tc2VydmVyXSBbLS1zZXJ2ZXItdHlwZT08c2VydmVyLXR5cGU+XSBbLS1wcm90b2NvbC10eXBlPTxwcm90b2NvbC10eXBlPl0gWy0td29ya2Vycz08d29ya2VyLWNvdW50Pl0gWy0tY2xpZW50cz08Y2xpZW50LWNvdW50Pl0gWy0tbG9vcD08bG9vcC1jb3VudD5dIiA8PCBlbmRsIDw8Ci0gICAgIlx0Y2xpZW50cyAgICAgICAgTnVtYmVyIG9mIGNsaWVudCB0aHJlYWRzIHRvIGNyZWF0ZSAtIDAgaW1wbGllcyBubyBjbGllbnRzLCBpLmUuIHNlcnZlciBvbmx5LiAgRGVmYXVsdCBpcyAiIDw8IGNsaWVudENvdW50IDw8IGVuZGwgPDwKLSAgICAiXHRoZWxwICAgICAgICAgICBQcmludHMgdGhpcyBoZWxwIHRleHQuIiA8PCBlbmRsIDw8Ci0gICAgIlx0Y2FsbCAgICAgICAgICAgU2VydmljZSBtZXRob2QgdG8gY2FsbC4gIERlZmF1bHQgaXMgIiA8PCBjYWxsTmFtZSA8PCBlbmRsIDw8Ci0gICAgIlx0bG9vcCAgICAgICAgICAgVGhlIG51bWJlciBvZiByZW1vdGUgdGhyaWZ0IGNhbGxzIGVhY2ggY2xpZW50IG1ha2VzLiAgRGVmYXVsdCBpcyAiIDw8IGxvb3BDb3VudCA8PCBlbmRsIDw8Ci0gICAgIlx0cG9ydCAgICAgICAgICAgVGhlIHBvcnQgdGhlIHNlcnZlciBhbmQgY2xpZW50cyBzaG91bGQgYmluZCB0byBmb3IgdGhyaWZ0IG5ldHdvcmsgY29ubmVjdGlvbnMuICBEZWZhdWx0IGlzICIgPDwgcG9ydCA8PCBlbmRsIDw8Ci0gICAgIlx0c2VydmVyICAgICAgICAgUnVuIHRoZSBUaHJpZnQgc2VydmVyIGluIHRoaXMgcHJvY2Vzcy4gIERlZmF1bHQgaXMgIiA8PCBydW5TZXJ2ZXIgPDwgZW5kbCA8PAotICAgICJcdHNlcnZlci10eXBlICAgIFR5cGUgb2Ygc2VydmVyLCBcInNpbXBsZVwiIG9yIFwidGhyZWFkLXBvb2xcIi4gIERlZmF1bHQgaXMgIiA8PCBzZXJ2ZXJUeXBlIDw8IGVuZGwgPDwKLSAgICAiXHRwcm90b2NvbC10eXBlICBUeXBlIG9mIHByb3RvY29sLCBcImJpbmFyeVwiLCBcImFzY2lpXCIsIG9yIFwieG1sXCIuICBEZWZhdWx0IGlzICIgPDwgcHJvdG9jb2xUeXBlIDw8IGVuZGwgPDwKLSAgICAiXHRsb2ctcmVxdWVzdCAgICBMb2cgYWxsIHJlcXVlc3QgdG8gLi9yZXF1ZXN0bG9nLnRsb2cuIERlZmF1bHQgaXMgIiA8PCBsb2dSZXF1ZXN0cyA8PCBlbmRsIDw8Ci0gICAgIlx0cmVwbGF5LXJlcXVlc3QgUmVwbGF5IHJlcXVlc3RzIGZyb20gbG9nIGZpbGUgKC4vcmVxdWVzdGxvZy50bG9nKSBEZWZhdWx0IGlzICIgPDwgcmVwbGF5UmVxdWVzdHMgPDwgZW5kbCA8PAotICAgICJcdHdvcmtlcnMgICAgICAgIE51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gIE9ubHkgdmFsaWQgZm9yIHRocmVhZC1wb29sIHNlcnZlciB0eXBlLiAgRGVmYXVsdCBpcyAiIDw8IHdvcmtlckNvdW50IDw8IGVuZGw7CisgIHVzYWdlIDw8IGFyZ3ZbMF0gPDwgIiBbLS1wb3J0PTxwb3J0IG51bWJlcj5dIFstLXNlcnZlcl0gWy0tc2VydmVyLXR5cGU9PHNlcnZlci10eXBlPl0gIgorICAgICAgICAgICAgICAgICAgICAgICJbLS1wcm90b2NvbC10eXBlPTxwcm90b2NvbC10eXBlPl0gWy0td29ya2Vycz08d29ya2VyLWNvdW50Pl0gIgorICAgICAgICAgICAgICAgICAgICAgICJbLS1jbGllbnRzPTxjbGllbnQtY291bnQ+XSBbLS1sb29wPTxsb29wLWNvdW50Pl0iIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0Y2xpZW50cyAgICAgICAgTnVtYmVyIG9mIGNsaWVudCB0aHJlYWRzIHRvIGNyZWF0ZSAtIDAgaW1wbGllcyBubyBjbGllbnRzLCBpLmUuICIKKyAgICAgICAgICAgInNlcnZlciBvbmx5LiAgRGVmYXVsdCBpcyAiIDw8IGNsaWVudENvdW50IDw8IGVuZGwKKyAgICAgICAgPDwgIlx0aGVscCAgICAgICAgICAgUHJpbnRzIHRoaXMgaGVscCB0ZXh0LiIgPDwgZW5kbAorICAgICAgICA8PCAiXHRjYWxsICAgICAgICAgICBTZXJ2aWNlIG1ldGhvZCB0byBjYWxsLiAgRGVmYXVsdCBpcyAiIDw8IGNhbGxOYW1lIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0bG9vcCAgICAgICAgICAgVGhlIG51bWJlciBvZiByZW1vdGUgdGhyaWZ0IGNhbGxzIGVhY2ggY2xpZW50IG1ha2VzLiAgRGVmYXVsdCBpcyAiCisgICAgICAgIDw8IGxvb3BDb3VudCA8PCBlbmRsIDw8ICJcdHBvcnQgICAgICAgICAgIFRoZSBwb3J0IHRoZSBzZXJ2ZXIgYW5kIGNsaWVudHMgc2hvdWxkIGJpbmQgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHRocmlmdCBuZXR3b3JrIGNvbm5lY3Rpb25zLiAgRGVmYXVsdCBpcyAiIDw8IHBvcnQgPDwgZW5kbAorICAgICAgICA8PCAiXHRzZXJ2ZXIgICAgICAgICBSdW4gdGhlIFRocmlmdCBzZXJ2ZXIgaW4gdGhpcyBwcm9jZXNzLiAgRGVmYXVsdCBpcyAiIDw8IHJ1blNlcnZlcgorICAgICAgICA8PCBlbmRsIDw8ICJcdHNlcnZlci10eXBlICAgIFR5cGUgb2Ygc2VydmVyLCBcInNpbXBsZVwiIG9yIFwidGhyZWFkLXBvb2xcIi4gIERlZmF1bHQgaXMgIgorICAgICAgICA8PCBzZXJ2ZXJUeXBlIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0cHJvdG9jb2wtdHlwZSAgVHlwZSBvZiBwcm90b2NvbCwgXCJiaW5hcnlcIiwgXCJhc2NpaVwiLCBvciBcInhtbFwiLiAgRGVmYXVsdCBpcyAiCisgICAgICAgIDw8IHByb3RvY29sVHlwZSA8PCBlbmRsCisgICAgICAgIDw8ICJcdGxvZy1yZXF1ZXN0ICAgIExvZyBhbGwgcmVxdWVzdCB0byAuL3JlcXVlc3Rsb2cudGxvZy4gRGVmYXVsdCBpcyAiIDw8IGxvZ1JlcXVlc3RzCisgICAgICAgIDw8IGVuZGwgPDwgIlx0cmVwbGF5LXJlcXVlc3QgUmVwbGF5IHJlcXVlc3RzIGZyb20gbG9nIGZpbGUgKC4vcmVxdWVzdGxvZy50bG9nKSBEZWZhdWx0IGlzICIKKyAgICAgICAgPDwgcmVwbGF5UmVxdWVzdHMgPDwgZW5kbCA8PCAiXHR3b3JrZXJzICAgICAgICBOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuICBPbmx5IHZhbGlkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHRocmVhZC1wb29sIHNlcnZlciB0eXBlLiAgRGVmYXVsdCBpcyAiIDw8IHdvcmtlckNvdW50CisgICAgICAgIDw8IGVuZGw7CiAKLQotICBtYXA8c3RyaW5nLCBzdHJpbmc+ICBhcmdzOworICBtYXA8c3RyaW5nLCBzdHJpbmc+IGFyZ3M7CiAKICAgZm9yIChpbnQgaXggPSAxOyBpeCA8IGFyZ2M7IGl4KyspIHsKIAogICAgIHN0cmluZyBhcmcoYXJndltpeF0pOwogCi0gICAgaWYgKGFyZy5jb21wYXJlKDAsMiwgIi0tIikgPT0gMCkgeworICAgIGlmIChhcmcuY29tcGFyZSgwLCAyLCAiLS0iKSA9PSAwKSB7CiAKICAgICAgIHNpemVfdCBlbmQgPSBhcmcuZmluZF9maXJzdF9vZigiPSIsIDIpOwogCkBAIC0yNjksNyArMjkxLDcgQEAKICAgICAgICAgYXJnc1trZXldID0gInRydWUiOwogICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmV4Y2VwdGVkIGNvbW1hbmQgbGluZSB0b2tlbjogIithcmcpOworICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5leGNlcHRlZCBjb21tYW5kIGxpbmUgdG9rZW46ICIgKyBhcmcpOwogICAgIH0KICAgfQogCkBAIC0zMTYsNzQgKzMzOCw4MyBAQAogICAgICAgd29ya2VyQ291bnQgPSBhdG9pKGFyZ3NbIndvcmtlcnMiXS5jX3N0cigpKTsKICAgICB9CiAKLSAgfSBjYXRjaChzdGQ6OmV4Y2VwdGlvbiYgZSkgeworICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZSkgewogICAgIGNlcnIgPDwgZS53aGF0KCkgPDwgZW5kbDsKLSAgICBjZXJyIDw8IHVzYWdlOworICAgIGNlcnIgPDwgdXNhZ2Uuc3RyKCk7CiAgIH0KIAotICBzaGFyZWRfcHRyPFBvc2l4VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSA9IHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KCkpOworICBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5CisgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSk7CiAKICAgLy8gRGlzcGF0Y2hlcgotICBzaGFyZWRfcHRyPFNlcnZlcj4gc2VydmljZUhhbmRsZXIobmV3IFNlcnZlcigpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFNlcnZlcj4gc2VydmljZUhhbmRsZXIobmV3IFNlcnZlcigpKTsKIAogICBpZiAocmVwbGF5UmVxdWVzdHMpIHsKLSAgICBzaGFyZWRfcHRyPFNlcnZlcj4gc2VydmljZUhhbmRsZXIobmV3IFNlcnZlcigpKTsKLSAgICBzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7CiAKICAgICAvLyBUcmFuc3BvcnRzCi0gICAgc2hhcmVkX3B0cjxURmlsZVRyYW5zcG9ydD4gZmlsZVRyYW5zcG9ydChuZXcgVEZpbGVUcmFuc3BvcnQocmVxdWVzdExvZ1BhdGgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVUcmFuc3BvcnQ+IGZpbGVUcmFuc3BvcnQobmV3IFRGaWxlVHJhbnNwb3J0KHJlcXVlc3RMb2dQYXRoKSk7CiAgICAgZmlsZVRyYW5zcG9ydC0+c2V0Q2h1bmtTaXplKDIgKiAxMDI0ICogMTAyNCk7CiAgICAgZmlsZVRyYW5zcG9ydC0+c2V0TWF4RXZlbnRTaXplKDEwMjQgKiAxNik7CiAgICAgZmlsZVRyYW5zcG9ydC0+c2Vla1RvRW5kKCk7CiAKICAgICAvLyBQcm90b2NvbCBGYWN0b3J5Ci0gICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKIAotICAgIFRGaWxlUHJvY2Vzc29yIGZpbGVQcm9jZXNzb3Ioc2VydmljZVByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVUcmFuc3BvcnQpOworICAgIFRGaWxlUHJvY2Vzc29yIGZpbGVQcm9jZXNzb3Ioc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBmaWxlVHJhbnNwb3J0KTsKIAogICAgIGZpbGVQcm9jZXNzb3IucHJvY2VzcygwLCB0cnVlKTsKICAgICBleGl0KDApOwogICB9CiAKLQogICBpZiAocnVuU2VydmVyKSB7CiAKLSAgICBzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZVByb2Nlc3Nvcj4gc2VydmljZVByb2Nlc3NvcihuZXcgU2VydmljZVByb2Nlc3NvcihzZXJ2aWNlSGFuZGxlcikpOwogCiAgICAgLy8gUHJvdG9jb2wgRmFjdG9yeQotICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CiAKICAgICAvLyBUcmFuc3BvcnQgRmFjdG9yeQotICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+ICAgICAgdHJhbnNwb3J0RmFjdG9yeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3Rvcnk7CiAKICAgICBpZiAobG9nUmVxdWVzdHMpIHsKICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGxvZyBmaWxlCi0gICAgICBzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOwogICAgICAgZmlsZVRyYW5zcG9ydC0+c2V0Q2h1bmtTaXplKDIgKiAxMDI0ICogMTAyNCk7CiAgICAgICBmaWxlVHJhbnNwb3J0LT5zZXRNYXhFdmVudFNpemUoMTAyNCAqIDE2KTsKIAotICAgICAgdHJhbnNwb3J0RmFjdG9yeSA9Ci0gICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KGZpbGVUcmFuc3BvcnQpKTsKKyAgICAgIHRyYW5zcG9ydEZhY3RvcnkKKyAgICAgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoZmlsZVRyYW5zcG9ydCkpOwogICAgIH0KIAotICAgIHNoYXJlZF9wdHI8VGhyZWFkPiBzZXJ2ZXJUaHJlYWQ7Ci0gICAgc2hhcmVkX3B0cjxUaHJlYWQ+IHNlcnZlclRocmVhZDI7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gc2VydmVyVGhyZWFkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHNlcnZlclRocmVhZDI7CisgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0PiBuYlNvY2tldDE7CisgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0PiBuYlNvY2tldDI7CiAKICAgICBpZiAoc2VydmVyVHlwZSA9PSAic2ltcGxlIikgewogCi0gICAgICBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc2hhcmVkX3B0cjxUU2VydmVyPihuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcG9ydCkpKTsKLSAgICAgIHNlcnZlclRocmVhZDIgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc2hhcmVkX3B0cjxUU2VydmVyPihuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcG9ydCsxKSkpOworICAgICAgbmJTb2NrZXQxLnJlc2V0KG5ldyB0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0KSk7CisgICAgICBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXI+KAorICAgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBuYlNvY2tldDEpKSk7CisgICAgICBuYlNvY2tldDIucmVzZXQobmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQgKyAxKSk7CisgICAgICBzZXJ2ZXJUaHJlYWQyID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyPigKKyAgICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgbmJTb2NrZXQyKSkpOwogCiAgICAgfSBlbHNlIGlmIChzZXJ2ZXJUeXBlID09ICJ0aHJlYWQtcG9vbCIpIHsKIAotICAgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcgorICAgICAgICAgID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCk7CiAKICAgICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CiAgICAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwotICAgICAgc2VydmVyVGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHNoYXJlZF9wdHI8VFNlcnZlcj4obmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHBvcnQsIHRocmVhZE1hbmFnZXIpKSk7Ci0gICAgICBzZXJ2ZXJUaHJlYWQyID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHNoYXJlZF9wdHI8VFNlcnZlcj4obmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHBvcnQrMSwgdGhyZWFkTWFuYWdlcikpKTsKKyAgICAgIG5iU29ja2V0MS5yZXNldChuZXcgdHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgICAgc2VydmVyVGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyPigKKyAgICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgbmJTb2NrZXQxLCB0aHJlYWRNYW5hZ2VyKSkpOworICAgICAgbmJTb2NrZXQyLnJlc2V0KG5ldyB0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0ICsgMSkpOworICAgICAgc2VydmVyVGhyZWFkMiA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlcj4oCisgICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIG5iU29ja2V0MiwgdGhyZWFkTWFuYWdlcikpKTsKICAgICB9CiAKICAgICBjZXJyIDw8ICJTdGFydGluZyB0aGUgc2VydmVyIG9uIHBvcnQgIiA8PCBwb3J0IDw8ICIgYW5kICIgPDwgKHBvcnQgKyAxKSA8PCBlbmRsOwpAQCAtMzk3LDcgKzQyOCw3IEBACiAgICAgICBzZXJ2ZXJUaHJlYWQyLT5qb2luKCk7CiAgICAgfQogICB9Ci0gIHNsZWVwKDEpOworICBUSFJJRlRfU0xFRVBfU0VDKDEpOwogCiAgIGlmIChjbGllbnRDb3VudCA+IDApIHsKIApAQCAtNDA1LDQ2ICs0MzYsNTcgQEAKIAogICAgIHNpemVfdCB0aHJlYWRDb3VudCA9IDA7CiAKLSAgICBzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID4gY2xpZW50VGhyZWFkczsKKyAgICBzZXQ8c3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gPiBjbGllbnRUaHJlYWRzOwogCi0gICAgaWYgKGNhbGxOYW1lID09ICJlY2hvVm9pZCIpIHsgbG9vcFR5cGUgPSBUX1ZPSUQ7fQotICAgIGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvQnl0ZSIpIHsgbG9vcFR5cGUgPSBUX0JZVEU7fQotICAgIGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvSTMyIikgeyBsb29wVHlwZSA9IFRfSTMyO30KLSAgICBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0k2NCIpIHsgbG9vcFR5cGUgPSBUX0k2NDt9Ci0gICAgZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9TdHJpbmciKSB7IGxvb3BUeXBlID0gVF9TVFJJTkc7fQotICAgIGVsc2Uge3Rocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gc2VydmljZSBjYWxsICIrY2FsbE5hbWUpO30KLQotICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBjbGllbnRDb3VudDsgaXgrKykgewotCi0gICAgICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgcG9ydCArIChpeCAlIDIpKSk7Ci0gICAgICBzaGFyZWRfcHRyPFRGcmFtZWRUcmFuc3BvcnQ+IGZyYW1lZFNvY2tldChuZXcgVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpKTsKLSAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKGZyYW1lZFNvY2tldCkpOwotICAgICAgc2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBzZXJ2aWNlQ2xpZW50KG5ldyBTZXJ2aWNlQ2xpZW50KHByb3RvY29sKSk7Ci0KLSAgICAgIGNsaWVudFRocmVhZHMuaW5zZXJ0KHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzaGFyZWRfcHRyPENsaWVudFRocmVhZD4obmV3IENsaWVudFRocmVhZChzb2NrZXQsIHNlcnZpY2VDbGllbnQsIG1vbml0b3IsIHRocmVhZENvdW50LCBsb29wQ291bnQsIGxvb3BUeXBlKSkpKTsKKyAgICBpZiAoY2FsbE5hbWUgPT0gImVjaG9Wb2lkIikgeworICAgICAgbG9vcFR5cGUgPSBUX1ZPSUQ7CisgICAgfSBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0J5dGUiKSB7CisgICAgICBsb29wVHlwZSA9IFRfQllURTsKKyAgICB9IGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvSTMyIikgeworICAgICAgbG9vcFR5cGUgPSBUX0kzMjsKKyAgICB9IGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvSTY0IikgeworICAgICAgbG9vcFR5cGUgPSBUX0k2NDsKKyAgICB9IGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvU3RyaW5nIikgeworICAgICAgbG9vcFR5cGUgPSBUX1NUUklORzsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBzZXJ2aWNlIGNhbGwgIiArIGNhbGxOYW1lKTsKICAgICB9CiAKLSAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7IHRocmVhZCAhPSBjbGllbnRUaHJlYWRzLmVuZCgpOyB0aHJlYWQrKykgeworICAgIGZvciAodWludDMyX3QgaXggPSAwOyBpeCA8IGNsaWVudENvdW50OyBpeCsrKSB7CisKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHBvcnQgKyAoaXggJSAyKSkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRGcmFtZWRUcmFuc3BvcnQ+IGZyYW1lZFNvY2tldChuZXcgVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2woZnJhbWVkU29ja2V0KSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gc2VydmljZUNsaWVudChuZXcgU2VydmljZUNsaWVudChwcm90b2NvbCkpOworCisgICAgICBjbGllbnRUaHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPENsaWVudFRocmVhZD4oCisgICAgICAgICAgbmV3IENsaWVudFRocmVhZChzb2NrZXQsIHNlcnZpY2VDbGllbnQsIG1vbml0b3IsIHRocmVhZENvdW50LCBsb29wQ291bnQsIGxvb3BUeXBlKSkpKTsKKyAgICB9CisKKyAgICBmb3IgKHN0ZDo6c2V0PHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+ID46OmNvbnN0X2l0ZXJhdG9yIHRocmVhZCA9IGNsaWVudFRocmVhZHMuYmVnaW4oKTsKKyAgICAgICAgIHRocmVhZCAhPSBjbGllbnRUaHJlYWRzLmVuZCgpOworICAgICAgICAgdGhyZWFkKyspIHsKICAgICAgICgqdGhyZWFkKS0+c3RhcnQoKTsKICAgICB9CiAKICAgICBpbnQ2NF90IHRpbWUwMDsKICAgICBpbnQ2NF90IHRpbWUwMTsKIAotICAgIHtTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKKyAgICB7CisgICAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKICAgICAgIHRocmVhZENvdW50ID0gY2xpZW50Q291bnQ7CiAKLSAgICAgIGNlcnIgPDwgIkxhdW5jaCAiPDwgY2xpZW50Q291bnQgPDwgIiBjbGllbnQgdGhyZWFkcyIgPDwgZW5kbDsKKyAgICAgIGNlcnIgPDwgIkxhdW5jaCAiIDw8IGNsaWVudENvdW50IDw8ICIgY2xpZW50IHRocmVhZHMiIDw8IGVuZGw7CiAKLSAgICAgIHRpbWUwMCA9ICBVdGlsOjpjdXJyZW50VGltZSgpOworICAgICAgdGltZTAwID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKIAogICAgICAgbW9uaXRvci5ub3RpZnlBbGwoKTsKIAotICAgICAgd2hpbGUodGhyZWFkQ291bnQgPiAwKSB7CisgICAgICB3aGlsZSAodGhyZWFkQ291bnQgPiAwKSB7CiAgICAgICAgIG1vbml0b3Iud2FpdCgpOwogICAgICAgfQogCi0gICAgICB0aW1lMDEgPSAgVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICAgIHRpbWUwMSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CiAgICAgfQogCiAgICAgaW50NjRfdCBmaXJzdFRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7CkBAIC00NTQsOSArNDk2LDEyIEBACiAgICAgaW50NjRfdCBtaW5UaW1lID0gOTIyMzM3MjAzNjg1NDc3NTgwN0xMOwogICAgIGludDY0X3QgbWF4VGltZSA9IDA7CiAKLSAgICBmb3IgKHNldDxzaGFyZWRfcHRyPFRocmVhZD4gPjo6aXRlcmF0b3IgaXggPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7IGl4ICE9IGNsaWVudFRocmVhZHMuZW5kKCk7IGl4KyspIHsKKyAgICBmb3IgKHNldDxzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiA+OjppdGVyYXRvciBpeCA9IGNsaWVudFRocmVhZHMuYmVnaW4oKTsKKyAgICAgICAgIGl4ICE9IGNsaWVudFRocmVhZHMuZW5kKCk7CisgICAgICAgICBpeCsrKSB7CiAKLSAgICAgIHNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPiBjbGllbnQgPSBkeW5hbWljX3BvaW50ZXJfY2FzdDxDbGllbnRUaHJlYWQ+KCgqaXgpLT5ydW5uYWJsZSgpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+IGNsaWVudAorICAgICAgICAgID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxDbGllbnRUaHJlYWQ+KCgqaXgpLT5ydW5uYWJsZSgpKTsKIAogICAgICAgaW50NjRfdCBkZWx0YSA9IGNsaWVudC0+X2VuZFRpbWUgLSBjbGllbnQtPl9zdGFydFRpbWU7CiAKQEAgLTQ3OCwxMyArNTIzLDEzIEBACiAgICAgICAgIG1heFRpbWUgPSBkZWx0YTsKICAgICAgIH0KIAotICAgICAgYXZlcmFnZVRpbWUrPSBkZWx0YTsKKyAgICAgIGF2ZXJhZ2VUaW1lICs9IGRlbHRhOwogICAgIH0KIAogICAgIGF2ZXJhZ2VUaW1lIC89IGNsaWVudENvdW50OwogCi0KLSAgICBjb3V0IDw8ICAid29ya2VycyA6IiA8PCB3b3JrZXJDb3VudCA8PCAiLCBjbGllbnQgOiAiIDw8IGNsaWVudENvdW50IDw8ICIsIGxvb3BzIDogIiA8PCBsb29wQ291bnQgPDwgIiwgcmF0ZSA6ICIgPDwgKGNsaWVudENvdW50ICogbG9vcENvdW50ICogMTAwMCkgLyAoKGRvdWJsZSkodGltZTAxIC0gdGltZTAwKSkgPDwgZW5kbDsKKyAgICBjb3V0IDw8ICJ3b3JrZXJzIDoiIDw8IHdvcmtlckNvdW50IDw8ICIsIGNsaWVudCA6ICIgPDwgY2xpZW50Q291bnQgPDwgIiwgbG9vcHMgOiAiIDw8IGxvb3BDb3VudAorICAgICAgICAgPDwgIiwgcmF0ZSA6ICIgPDwgKGNsaWVudENvdW50ICogbG9vcENvdW50ICogMTAwMCkgLyAoKGRvdWJsZSkodGltZTAxIC0gdGltZTAwKSkgPDwgZW5kbDsKIAogICAgIGNvdW50X21hcCBjb3VudCA9IHNlcnZpY2VIYW5kbGVyLT5nZXRDb3VudCgpOwogICAgIGNvdW50X21hcDo6aXRlcmF0b3IgaXRlcjsKZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL3NyYy9UZXN0Q2xpZW50LmNwcCBiL3Rlc3QvY3BwL3NyYy9UZXN0Q2xpZW50LmNwcApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDlhZWQ1NTEuLjg5ZjNmZDEKLS0tIGEvdGVzdC9jcHAvc3JjL1Rlc3RDbGllbnQuY3BwCisrKyBiL3Rlc3QvY3BwL3NyYy9UZXN0Q2xpZW50LmNwcApAQCAtMSw0ICsxLDQgQEAKLS8qCivvu78vKgogICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKICAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCkBAIC0xNywyMDcgKzE3LDMzNSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUwotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bG9jYWxlPgorI2luY2x1ZGUgPGlvcz4KICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEh0dHBDbGllbnQuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTb2NrZXQuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNTTFNvY2tldC5oPgotI2luY2x1ZGUgPGFzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmg+Ci0jaW5jbHVkZSA8c2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oPiAvLyA8ZXZlbnQuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oPiAvLyA8ZXZlbnQuaD4KIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2lmZGVmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGJvb3N0L2FsZ29yaXRobS9zdHJpbmcuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0uaHBwPgogI2luY2x1ZGUgPGJvb3N0L3Byb2dyYW1fb3B0aW9ucy5ocHA+Ci0jaW5jbHVkZSA8dHIxL2Z1bmN0aW9uYWw+CisjaW5jbHVkZSA8Ym9vc3QvcmFuZG9tL3JhbmRvbV9kZXZpY2UuaHBwPgorI2lmIF9XSU4zMgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmg+CisjZW5kaWYKIAorI2luY2x1ZGUgIlNlY29uZFNlcnZpY2UuaCIKICNpbmNsdWRlICJUaHJpZnRUZXN0LmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBib29zdDsKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmFzeW5jOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogdXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6YXN5bmM7Ci0KLXVzaW5nIHN0ZDo6dHIxOjpwbGFjZWhvbGRlcnM6Ol8xOwotCi0vL2V4dGVybiB1aW50MzJfdCBnX3NvY2tldF9zeXNjYWxsczsKIAogLy8gQ3VycmVudCB0aW1lLCBtaWNyb3NlY29uZHMgc2luY2UgdGhlIGVwb2NoCi11aW50NjRfdCBub3coKQotewordWludDY0X3Qgbm93KCkgewogICBpbnQ2NF90IHJldDsKICAgc3RydWN0IHRpbWV2YWwgdHY7CiAKLSAgZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJnR2LCBOVUxMKTsKICAgcmV0ID0gdHYudHZfc2VjOwotICByZXQgPSByZXQqMTAwMCoxMDAwICsgdHYudHZfdXNlYzsKKyAgcmV0ID0gcmV0ICogMTAwMCAqIDEwMDAgKyB0di50dl91c2VjOwogICByZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0U3RyaW5nX2NsaWVudFJldHVybihjb25zdCBjaGFyKiBob3N0LCBpbnQgcG9ydCwgZXZlbnRfYmFzZSAqYmFzZSwgVFByb3RvY29sRmFjdG9yeSogcHJvdG9jb2xGYWN0b3J5LCBUaHJpZnRUZXN0Q29iQ2xpZW50KiBjbGllbnQpIHsKLSAgKHZvaWQpIGhvc3Q7Ci0gICh2b2lkKSBwb3J0OwotICAodm9pZCkgcHJvdG9jb2xGYWN0b3J5Oworc3RhdGljIHZvaWQgdGVzdFN0cmluZ19jbGllbnRSZXR1cm4oZXZlbnRfYmFzZSogYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0ZXN0TnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUZXN0Q29iQ2xpZW50KiBjbGllbnQpIHsKICAgdHJ5IHsKICAgICBzdHJpbmcgczsKICAgICBjbGllbnQtPnJlY3ZfdGVzdFN0cmluZyhzKTsKLSAgICBjb3V0IDw8ICJ0ZXN0U3RyaW5nOiAiIDw8IHMgPDwgZW5kbDsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgb3MgPDwgInRlc3QiIDw8IHRlc3ROcjsKKyAgICBjb25zdCBib29sIG9rID0gKHMgPT0gb3Muc3RyKCkpOworICAgIGNvdXQgPDwgInRlc3RTdHJpbmc6ICIgPDwgcyA8PCAiICIgPDwgKChvaykgPyAib2siIDogImZhaWxlZCIpIDw8IGVuZGw7CiAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIGV4bikgewotICAgIGNvdXQgPDwgIkVycm9yOiAiIDw8IGV4bi53aGF0KCkgPDwgZW5kbDsgICAgCisgICAgY291dCA8PCAiRXJyb3I6ICIgPDwgZXhuLndoYXQoKSA8PCBlbmRsOwogICB9CiAKLSAgZXZlbnRfYmFzZV9sb29wYnJlYWsoYmFzZSk7IC8vIGVuZCB0ZXN0CisgIGlmICh0ZXN0TnIgPT0gOSkKKyAgICBldmVudF9iYXNlX2xvb3BicmVhayhiYXNlKTsgLy8gZW5kIHRlc3QKIH0KIAotc3RhdGljIHZvaWQgdGVzdFZvaWRfY2xpZW50UmV0dXJuKGNvbnN0IGNoYXIqIGhvc3QsIGludCBwb3J0LCBldmVudF9iYXNlICpiYXNlLCBUUHJvdG9jb2xGYWN0b3J5KiBwcm90b2NvbEZhY3RvcnksIFRocmlmdFRlc3RDb2JDbGllbnQqIGNsaWVudCkgeworc3RhdGljIHZvaWQgdGVzdFZvaWRfY2xpZW50UmV0dXJuKGV2ZW50X2Jhc2UqIGJhc2UsIFRocmlmdFRlc3RDb2JDbGllbnQqIGNsaWVudCkgewogICB0cnkgewogICAgIGNsaWVudC0+cmVjdl90ZXN0Vm9pZCgpOwogICAgIGNvdXQgPDwgInRlc3RWb2lkIiA8PCBlbmRsOwogCi0gICAgLy8gbmV4dCB0ZXN0Ci0gICAgZGVsZXRlIGNsaWVudDsKLSAgICBzaGFyZWRfcHRyPFRBc3luY0NoYW5uZWw+IGNoYW5uZWwobmV3IFRFdmh0dHBDbGllbnRDaGFubmVsKGhvc3QsICIvIiwgaG9zdCwgcG9ydCwgYmFzZSkpOwotICAgIGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0Q29iQ2xpZW50KGNoYW5uZWwsIHByb3RvY29sRmFjdG9yeSk7Ci0gICAgY2xpZW50LT50ZXN0U3RyaW5nKHRyMTo6YmluZCh0ZXN0U3RyaW5nX2NsaWVudFJldHVybiwgaG9zdCwgcG9ydCwgYmFzZSwgcHJvdG9jb2xGYWN0b3J5LCBfMSksICJUZXN0Iik7CisgICAgZm9yIChpbnQgdGVzdE5yID0gMDsgdGVzdE5yIDwgMTA7ICsrdGVzdE5yKSB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAidGVzdCIgPDwgdGVzdE5yOworICAgICAgY2xpZW50LT50ZXN0U3RyaW5nKHN0ZDo6YmluZCh0ZXN0U3RyaW5nX2NsaWVudFJldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0TnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpLAorICAgICAgICAgICAgICAgICAgICAgICBvcy5zdHIoKSk7CisgICAgfQogICB9IGNhdGNoIChURXhjZXB0aW9uJiBleG4pIHsKLSAgICBjb3V0IDw8ICJFcnJvcjogIiA8PCBleG4ud2hhdCgpIDw8IGVuZGw7ICAgIAorICAgIGNvdXQgPDwgIkVycm9yOiAiIDw8IGV4bi53aGF0KCkgPDwgZW5kbDsKICAgfQogfQogCisvLyBXb3JrYXJvdW5kIGZvciBhYnNlbnNlIG9mIEMrKzExICJhdXRvIiBrZXl3b3JkLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIHByaW50X2VxKFQgZXhwZWN0ZWQsIFQgYWN0dWFsKSB7CisgIGNvdXQgPDwgIigiIDw8IGFjdHVhbCA8PCAiKSIgPDwgZW5kbDsKKyAgaWYgKGV4cGVjdGVkICE9IGFjdHVhbCkgeworICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8ICJFeHBlY3RlZDogIiA8PCBleHBlY3RlZCA8PCAiIGJ1dCBnb3Q6ICIgPDwgYWN0dWFsIDw8IGVuZGw7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisjZGVmaW5lIEJBU0VUWVBFX0lERU5USVRZX1RFU1QoZnVuYywgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvdXQgPDwgI2Z1bmMgIigiIDw8IHZhbHVlIDw8ICIpID0gIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFwcmludF9lcSh2YWx1ZSwgdGVzdENsaWVudC5mdW5jKHZhbHVlKSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGhyb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gY2F0Y2ggKGV4Y2VwdGlvbiAmIGV4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworaW50IGJpbmFyeV90ZXN0KFRocmlmdFRlc3RDbGllbnQmIHRlc3RDbGllbnQsIHN0cmluZzo6c2l6ZV90eXBlIHNpeik7CisKK0JPT1NUX0NPTlNURVhQUl9PUl9DT05TVCBpbnQgRVJSX0JBU0VUWVBFUyA9IDE7CitCT09TVF9DT05TVEVYUFJfT1JfQ09OU1QgaW50IEVSUl9TVFJVQ1RTID0gMjsKK0JPT1NUX0NPTlNURVhQUl9PUl9DT05TVCBpbnQgRVJSX0NPTlRBSU5FUlMgPSA0OworQk9PU1RfQ09OU1RFWFBSX09SX0NPTlNUIGludCBFUlJfRVhDRVBUSU9OUyA9IDg7CitCT09TVF9DT05TVEVYUFJfT1JfQ09OU1QgaW50IEVSUl9VTktOT1dOID0gNjQ7CisKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICBjb3V0LnByZWNpc2lvbigxOSk7CisKKyAgc3RyaW5nIHRlc3REaXIgID0gYm9vc3Q6OmZpbGVzeXN0ZW06OnN5c3RlbV9jb21wbGV0ZShhcmd2WzBdKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5zdHJpbmcoKTsKKyAgc3RyaW5nIGNhUGF0aCAgID0gdGVzdERpciArICIva2V5cy9DQS5wZW0iOworICBzdHJpbmcgY2VydFBhdGggPSB0ZXN0RGlyICsgIi9rZXlzL2NsaWVudC5jcnQiOworICBzdHJpbmcga2V5UGF0aCAgPSB0ZXN0RGlyICsgIi9rZXlzL2NsaWVudC5rZXkiOworCisjaWYgX1dJTjMyCisgIHRyYW5zcG9ydDo6VFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOworI2VuZGlmCiAgIHN0cmluZyBob3N0ID0gImxvY2FsaG9zdCI7CiAgIGludCBwb3J0ID0gOTA5MDsKICAgaW50IG51bVRlc3RzID0gMTsKICAgYm9vbCBzc2wgPSBmYWxzZTsKKyAgYm9vbCB6bGliID0gZmFsc2U7CiAgIHN0cmluZyB0cmFuc3BvcnRfdHlwZSA9ICJidWZmZXJlZCI7CiAgIHN0cmluZyBwcm90b2NvbF90eXBlID0gImJpbmFyeSI7CiAgIHN0cmluZyBkb21haW5fc29ja2V0ID0gIiI7CisgIGJvb2wgYWJzdHJhY3RfbmFtZXNwYWNlID0gZmFsc2U7CisgIGJvb2wgbm9pbnNhbmUgPSBmYWxzZTsKIAotICBwcm9ncmFtX29wdGlvbnM6Om9wdGlvbnNfZGVzY3JpcHRpb24gZGVzYygiQWxsb3dlZCBvcHRpb25zIik7CisgIGludCByZXR1cm5fY29kZSA9IDA7CisKKyAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6b3B0aW9uc19kZXNjcmlwdGlvbiBkZXNjKCJBbGxvd2VkIG9wdGlvbnMiKTsKICAgZGVzYy5hZGRfb3B0aW9ucygpCiAgICAgICAoImhlbHAsaCIsICJwcm9kdWNlIGhlbHAgbWVzc2FnZSIpCi0gICAgICAoImhvc3QiLCBwcm9ncmFtX29wdGlvbnM6OnZhbHVlPHN0cmluZz4oJmhvc3QpLT5kZWZhdWx0X3ZhbHVlKGhvc3QpLCAiSG9zdCB0byBjb25uZWN0IikKLSAgICAgICgicG9ydCIsIHByb2dyYW1fb3B0aW9uczo6dmFsdWU8aW50PigmcG9ydCktPmRlZmF1bHRfdmFsdWUocG9ydCksICJQb3J0IG51bWJlciB0byBjb25uZWN0IikKLQkgICgiZG9tYWluLXNvY2tldCIsIHByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmZG9tYWluX3NvY2tldCktPmRlZmF1bHRfdmFsdWUoZG9tYWluX3NvY2tldCksICJEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpLCBpbnN0ZWFkIG9mIGhvc3QgYW5kIHBvcnQiKQotICAgICAgKCJ0cmFuc3BvcnQiLCBwcm9ncmFtX29wdGlvbnM6OnZhbHVlPHN0cmluZz4oJnRyYW5zcG9ydF90eXBlKS0+ZGVmYXVsdF92YWx1ZSh0cmFuc3BvcnRfdHlwZSksICJUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIGV2aHR0cCIpCi0gICAgICAoInByb3RvY29sIiwgcHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZwcm90b2NvbF90eXBlKS0+ZGVmYXVsdF92YWx1ZShwcm90b2NvbF90eXBlKSwgIlByb3RvY29sOiBiaW5hcnksIGpzb24iKQotCSAgKCJzc2wiLCAiRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKQotICAgICAgKCJ0ZXN0bG9vcHMsbiIsIHByb2dyYW1fb3B0aW9uczo6dmFsdWU8aW50PigmbnVtVGVzdHMpLT5kZWZhdWx0X3ZhbHVlKG51bVRlc3RzKSwgIk51bWJlciBvZiBUZXN0cyIpCi0gIDsKKyAgICAgICgiaG9zdCIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmaG9zdCktPmRlZmF1bHRfdmFsdWUoaG9zdCksCisgICAgICAgICAgIkhvc3QgdG8gY29ubmVjdCIpCisgICAgICAoInBvcnQiLAorICAgICAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPGludD4oJnBvcnQpLT5kZWZhdWx0X3ZhbHVlKHBvcnQpLAorICAgICAgICAgICJQb3J0IG51bWJlciB0byBjb25uZWN0IikKKyAgICAgICgiZG9tYWluLXNvY2tldCIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmZG9tYWluX3NvY2tldCktPmRlZmF1bHRfdmFsdWUoZG9tYWluX3NvY2tldCksCisgICAgICAgICAgIkRvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCksIGluc3RlYWQgb2YgaG9zdCBhbmQgcG9ydCIpCisgICAgICAoImFic3RyYWN0LW5hbWVzcGFjZSIsCisgICAgICAgICAgIkxvb2sgZm9yIHRoZSBkb21haW4gc29ja2V0IGluIHRoZSBBYnN0cmFjdCBOYW1lc3BhY2UiCisgICAgICAgICAgIiAobm8gY29ubmVjdGlvbiB3aXRoIGZpbGVzeXN0ZW0gcGF0aG5hbWVzKSIpCisgICAgICAoInRyYW5zcG9ydCIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmdHJhbnNwb3J0X3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHRyYW5zcG9ydF90eXBlKSwKKyAgICAgICAgICAiVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBldmh0dHAsIHpsaWIiKQorICAgICAgKCJwcm90b2NvbCIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmcHJvdG9jb2xfdHlwZSktPmRlZmF1bHRfdmFsdWUocHJvdG9jb2xfdHlwZSksCisgICAgICAgICAgIlByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGhlYWRlciwganNvbiwgbXVsdGksIG11bHRpYywgbXVsdGloLCBtdWx0aWoiKQorICAgICAgKCJzc2wiLAorICAgICAgICAgICJFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTCIpCisgICAgICAoInpsaWIiLAorICAgICAgICAgICJXcmFwIFRyYW5zcG9ydCB3aXRoIFpsaWIiKQorICAgICAgKCJ0ZXN0bG9vcHMsbiIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8aW50PigmbnVtVGVzdHMpLT5kZWZhdWx0X3ZhbHVlKG51bVRlc3RzKSwKKyAgICAgICAgICAiTnVtYmVyIG9mIFRlc3RzIikKKyAgICAgICgibm9pbnNhbmUiLAorICAgICAgICAgICJEbyBub3QgcnVuIGluc2FuaXR5IHRlc3QiKTsKIAotICBwcm9ncmFtX29wdGlvbnM6OnZhcmlhYmxlc19tYXAgdm07Ci0gIHByb2dyYW1fb3B0aW9uczo6c3RvcmUocHJvZ3JhbV9vcHRpb25zOjpwYXJzZV9jb21tYW5kX2xpbmUoYXJnYywgYXJndiwgZGVzYyksIHZtKTsKLSAgcHJvZ3JhbV9vcHRpb25zOjpub3RpZnkodm0pOyAgICAKKyAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFyaWFibGVzX21hcCB2bTsKKyAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6c3RvcmUoYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6cGFyc2VfY29tbWFuZF9saW5lKGFyZ2MsIGFyZ3YsIGRlc2MpLCB2bSk7CisgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6Om5vdGlmeSh2bSk7CiAKICAgaWYgKHZtLmNvdW50KCJoZWxwIikpIHsKLSAgICBjb3V0IDw8IGRlc2MgPDwgIlxuIjsKLSAgICByZXR1cm4gMTsKKyAgICBjb3V0IDw8IGRlc2MgPDwgZW5kbDsKKyAgICByZXR1cm4gRVJSX1VOS05PV047CiAgIH0KIAotICB0cnkgeyAgIAorICB0cnkgewogICAgIGlmICghcHJvdG9jb2xfdHlwZS5lbXB0eSgpKSB7CiAgICAgICBpZiAocHJvdG9jb2xfdHlwZSA9PSAiYmluYXJ5IikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJjb21wYWN0IikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJoZWFkZXIiKSB7CiAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImpzb24iKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpIikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJtdWx0aWMiKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpaCIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGlqIikgewogICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHByb3RvY29sIHR5cGUgIitwcm90b2NvbF90eXBlKTsKKyAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBwcm90b2NvbCB0eXBlICIgKyBwcm90b2NvbF90eXBlKTsKICAgICAgIH0KICAgICB9CiAKLQlpZiAoIXRyYW5zcG9ydF90eXBlLmVtcHR5KCkpIHsKKyAgICBpZiAoIXRyYW5zcG9ydF90eXBlLmVtcHR5KCkpIHsKICAgICAgIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiYnVmZmVyZWQiKSB7CiAgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJmcmFtZWQiKSB7CiAgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJodHRwIikgewogICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiZXZodHRwIikgeworICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiemxpYiIpIHsKKyAgICAgICAgLy8gY3Jvc3N0ZXN0IHdpbGwgcGFzcyB6bGliIGFzIGEgdHJhbnNwb3J0IGFuZCBhcyBhIGZsYWcgcmlnaHQgbm93Li4KICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biB0cmFuc3BvcnQgdHlwZSAiK3RyYW5zcG9ydF90eXBlKTsKKyAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biB0cmFuc3BvcnQgdHlwZSAiICsgdHJhbnNwb3J0X3R5cGUpOwogICAgICAgfQogICAgIH0KIAotICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZSkgeworICB9IGNhdGNoIChleGNlcHRpb24mIGUpIHsKICAgICBjZXJyIDw8IGUud2hhdCgpIDw8IGVuZGw7Ci0gICAgY291dCA8PCBkZXNjIDw8ICJcbiI7Ci0gICAgcmV0dXJuIDE7CisgICAgY291dCA8PCBkZXNjIDw8IGVuZGw7CisgICAgcmV0dXJuIEVSUl9VTktOT1dOOwogICB9CiAKICAgaWYgKHZtLmNvdW50KCJzc2wiKSkgewogICAgIHNzbCA9IHRydWU7CiAgIH0KIAotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sOworICBpZiAodm0uY291bnQoInpsaWIiKSkgeworICAgIHpsaWIgPSB0cnVlOworICB9CiAKLSAgc2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQ7Ci0gIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3Rvcnk7CisgIGlmICh2bS5jb3VudCgiYWJzdHJhY3QtbmFtZXNwYWNlIikpIHsKKyAgICBhYnN0cmFjdF9uYW1lc3BhY2UgPSB0cnVlOworICB9CisKKyAgaWYgKHZtLmNvdW50KCJub2luc2FuZSIpKSB7CisgICAgbm9pbnNhbmUgPSB0cnVlOworICB9CisKKyAgLy8gVEhSSUZULTQxNjQ6IFRoZSBmYWN0b3J5IE1VU1Qgb3V0bGl2ZSBhbnkgc29ja2V0cyBpdCBjcmVhdGVzIGZvciBjb3JyZWN0IGJlaGF2aW9yIQorICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3Rvcnk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbDI7ICAvLyBTZWNvbmRTZXJ2aWNlIGZvciBtdWx0aXBsZXhlZAogCiAgIGlmIChzc2wpIHsKLSAgICBmYWN0b3J5ID0gc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4obmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOworICAgIGNvdXQgPDwgIkNsaWVudCBDZXJ0aWZpY2F0ZSBGaWxlOiAiIDw8IGNlcnRQYXRoIDw8IGVuZGw7CisgICAgY291dCA8PCAiQ2xpZW50IEtleSAgICAgICAgIEZpbGU6ICIgPDwga2V5UGF0aCA8PCBlbmRsOworICAgIGNvdXQgPDwgIkNBICAgICAgICAgICAgICAgICBGaWxlOiAiIDw8IGNhUGF0aCA8PCBlbmRsOworCisgICAgZmFjdG9yeSA9IHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4obmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOwogICAgIGZhY3RvcnktPmNpcGhlcnMoIkFMTDohQURIOiFMT1c6IUVYUDohTUQ1OkBTVFJFTkdUSCIpOwotICAgIGZhY3RvcnktPmxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKCIuL3RydXN0ZWQtY2EtY2VydGlmaWNhdGUucGVtIik7CisgICAgZmFjdG9yeS0+bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY2FQYXRoLmNfc3RyKCkpOworICAgIGZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZShjZXJ0UGF0aC5jX3N0cigpKTsKKyAgICBmYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShrZXlQYXRoLmNfc3RyKCkpOwogICAgIGZhY3RvcnktPmF1dGhlbnRpY2F0ZSh0cnVlKTsKICAgICBzb2NrZXQgPSBmYWN0b3J5LT5jcmVhdGVTb2NrZXQoaG9zdCwgcG9ydCk7CiAgIH0gZWxzZSB7CiAgICAgaWYgKGRvbWFpbl9zb2NrZXQgIT0gIiIpIHsKLSAgICAgIHNvY2tldCA9IHNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoZG9tYWluX3NvY2tldCkpOworICAgICAgaWYgKGFic3RyYWN0X25hbWVzcGFjZSkgeworICAgICAgICBzdGQ6OnN0cmluZyBhYnN0cmFjdF9zb2NrZXQoIlwwIiwgMSk7CisgICAgICAgIGFic3RyYWN0X3NvY2tldCArPSBkb21haW5fc29ja2V0OworICAgICAgICBzb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoYWJzdHJhY3Rfc29ja2V0KSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoZG9tYWluX3NvY2tldCkpOworICAgICAgfQogICAgICAgcG9ydCA9IDA7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgc29ja2V0ID0gc2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChob3N0LCBwb3J0KSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNvY2tldCA9IHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChob3N0LCBwb3J0KSk7CiAgICAgfQogICB9CiAKICAgaWYgKHRyYW5zcG9ydF90eXBlLmNvbXBhcmUoImh0dHAiKSA9PSAwKSB7Ci0gICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBodHRwU29ja2V0KG5ldyBUSHR0cENsaWVudChzb2NrZXQsIGhvc3QsICIvc2VydmljZSIpKTsKLSAgICB0cmFuc3BvcnQgPSBodHRwU29ja2V0OwotICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlLmNvbXBhcmUoImZyYW1lZCIpID09IDApewotICAgIHNoYXJlZF9wdHI8VEZyYW1lZFRyYW5zcG9ydD4gZnJhbWVkU29ja2V0KG5ldyBURnJhbWVkVHJhbnNwb3J0KHNvY2tldCkpOwotICAgIHRyYW5zcG9ydCA9IGZyYW1lZFNvY2tldDsKLSAgfSBlbHNlewotICAgIHNoYXJlZF9wdHI8VEJ1ZmZlcmVkVHJhbnNwb3J0PiBidWZmZXJlZFNvY2tldChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkpOwotICAgIHRyYW5zcG9ydCA9IGJ1ZmZlcmVkU29ja2V0OworICAgIHRyYW5zcG9ydCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEh0dHBDbGllbnQ+KHNvY2tldCwgaG9zdCwgIi9zZXJ2aWNlIik7CisgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUuY29tcGFyZSgiZnJhbWVkIikgPT0gMCkgeworICAgIHRyYW5zcG9ydCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEZyYW1lZFRyYW5zcG9ydD4oc29ja2V0KTsKKyAgfSBlbHNlIHsKKyAgICB0cmFuc3BvcnQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydD4oc29ja2V0KTsKICAgfQogCi0gIGlmIChwcm90b2NvbF90eXBlLmNvbXBhcmUoImpzb24iKSA9PSAwKSB7Ci0gICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGpzb25Qcm90b2NvbChuZXcgVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpKTsKLSAgICBwcm90b2NvbCA9IGpzb25Qcm90b2NvbDsKLSAgfSBlbHNlewotICAgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBiaW5hcnlQcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOwotICAgIHByb3RvY29sID0gYmluYXJ5UHJvdG9jb2w7CisgIGlmICh6bGliKSB7CisgICAgdHJhbnNwb3J0ID0gc3RkOjptYWtlX3NoYXJlZDxUWmxpYlRyYW5zcG9ydD4odHJhbnNwb3J0KTsKKyAgfQorCisgIGlmIChwcm90b2NvbF90eXBlID09ICJqc29uIiB8fCBwcm90b2NvbF90eXBlID09ICJtdWx0aWoiKSB7CisgICAgcHJvdG9jb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRKU09OUHJvdG9jb2w+KHRyYW5zcG9ydCk7CisgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAiY29tcGFjdCIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGljIikgeworICAgIHByb3RvY29sID0gc3RkOjptYWtlX3NoYXJlZDxUQ29tcGFjdFByb3RvY29sPih0cmFuc3BvcnQpOworICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImhlYWRlciIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGloIikgeworICAgIHByb3RvY29sID0gc3RkOjptYWtlX3NoYXJlZDxUSGVhZGVyUHJvdG9jb2w+KHRyYW5zcG9ydCk7CisgIH0gZWxzZSB7CisgICAgcHJvdG9jb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRCaW5hcnlQcm90b2NvbD4odHJhbnNwb3J0KTsKKyAgfQorCisgIGlmIChib29zdDo6c3RhcnRzX3dpdGgocHJvdG9jb2xfdHlwZSwgIm11bHRpIikpIHsKKyAgcHJvdG9jb2wyID0gc3RkOjptYWtlX3NoYXJlZDxUTXVsdGlwbGV4ZWRQcm90b2NvbD4ocHJvdG9jb2wsICJTZWNvbmRTZXJ2aWNlIik7CisgIC8vIHdlIGRvbid0IG5lZWQgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBwcm90b2NvbCBhbnkgbW9yZSwgc28uLi4KKyAgcHJvdG9jb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRNdWx0aXBsZXhlZFByb3RvY29sPihwcm90b2NvbCwgIlRocmlmdFRlc3QiKTsKICAgfQogCiAgIC8vIENvbm5lY3Rpb24gaW5mbwotICBjb3V0IDw8ICJDb25uZWN0aW5nICgiIDw8IHRyYW5zcG9ydF90eXBlIDw8ICIvIiA8PCBwcm90b2NvbF90eXBlIDw8ICIpIHRvOiAiIDw8IGRvbWFpbl9zb2NrZXQ7CisgIGNvdXQgPDwgIkNvbm5lY3RpbmcgKCIgPDwgdHJhbnNwb3J0X3R5cGUgPDwgIi8iIDw8IHByb3RvY29sX3R5cGUgPDwgIikgdG86ICI7CisgIGlmIChhYnN0cmFjdF9uYW1lc3BhY2UpIHsKKyAgICBjb3V0IDw8ICdAJzsKKyAgfQorICBjb3V0IDw8IGRvbWFpbl9zb2NrZXQ7CiAgIGlmIChwb3J0ICE9IDApIHsKICAgICBjb3V0IDw8IGhvc3QgPDwgIjoiIDw8IHBvcnQ7CiAgIH0KICAgY291dCA8PCBlbmRsOwogCiAgIGlmICh0cmFuc3BvcnRfdHlwZS5jb21wYXJlKCJldmh0dHAiKSA9PSAwKSB7Ci0gICAgZXZlbnRfYmFzZSAqYmFzZSA9IGV2ZW50X2Jhc2VfbmV3KCk7CisgICAgZXZlbnRfYmFzZSogYmFzZSA9IGV2ZW50X2Jhc2VfbmV3KCk7CiAgICAgY291dCA8PCAiTGliZXZlbnQgVmVyc2lvbjogIiA8PCBldmVudF9nZXRfdmVyc2lvbigpIDw8IGVuZGw7CiAgICAgY291dCA8PCAiTGliZXZlbnQgTWV0aG9kOiAiIDw8IGV2ZW50X2Jhc2VfZ2V0X21ldGhvZChiYXNlKSA8PCBlbmRsOwogI2lmIExJQkVWRU5UX1ZFUlNJT05fTlVNQkVSID49IDB4MDIwMDAwMDAKICAgICBjb3V0IDw8ICJMaWJldmVudCBGZWF0dXJlczogMHgiIDw8IGhleCA8PCBldmVudF9iYXNlX2dldF9mZWF0dXJlcyhiYXNlKSA8PCBlbmRsOwogI2VuZGlmCiAKLSAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOwogCi0gICAgc2hhcmVkX3B0cjxUQXN5bmNDaGFubmVsPiBjaGFubmVsKG5ldyBURXZodHRwQ2xpZW50Q2hhbm5lbChob3N0LmNfc3RyKCksICIvIiwgaG9zdC5jX3N0cigpLCBwb3J0LCBiYXNlKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY0NoYW5uZWw+IGNoYW5uZWwoCisgICAgICAgIG5ldyBURXZodHRwQ2xpZW50Q2hhbm5lbChob3N0LmNfc3RyKCksICIvIiwgaG9zdC5jX3N0cigpLCBwb3J0LCBiYXNlKSk7CiAgICAgVGhyaWZ0VGVzdENvYkNsaWVudCogY2xpZW50ID0gbmV3IFRocmlmdFRlc3RDb2JDbGllbnQoY2hhbm5lbCwgcHJvdG9jb2xGYWN0b3J5LmdldCgpKTsKLSAgICBjbGllbnQtPnRlc3RWb2lkKHRyMTo6YmluZCh0ZXN0Vm9pZF9jbGllbnRSZXR1cm4sIGhvc3QuY19zdHIoKSwgcG9ydCwgYmFzZSwgcHJvdG9jb2xGYWN0b3J5LmdldCgpLCBfMSkpOwotICAgIAorICAgIGNsaWVudC0+dGVzdFZvaWQoc3RkOjpiaW5kKHRlc3RWb2lkX2NsaWVudFJldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisKICAgICBldmVudF9iYXNlX2xvb3AoYmFzZSwgMCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAotCiAgIFRocmlmdFRlc3RDbGllbnQgdGVzdENsaWVudChwcm90b2NvbCk7CiAKICAgdWludDY0X3QgdGltZV9taW4gPSAwOwpAQCAtMjI5LDE1ICszNTcsMTUgQEAKIAogICAgIHRyeSB7CiAgICAgICB0cmFuc3BvcnQtPm9wZW4oKTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIHByaW50ZigiQ29ubmVjdCBmYWlsZWQ6ICVzXG4iLCB0dHgud2hhdCgpKTsKLSAgICAgIGNvbnRpbnVlOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICJDb25uZWN0IGZhaWxlZDogIiA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybiBFUlJfVU5LTk9XTjsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDT05ORUNUIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoIlRlc3QgIyVkLCBjb25uZWN0ICVzOiVkXG4iLCB0ZXN0KzEsIGhvc3QuY19zdHIoKSwgcG9ydCk7CisgICAgcHJpbnRmKCJUZXN0ICMlZCwgY29ubmVjdCAlczolZFxuIiwgdGVzdCArIDEsIGhvc3QuY19zdHIoKSwgcG9ydCk7CiAKICAgICB1aW50NjRfdCBzdGFydCA9IG5vdygpOwogCkBAIC0yNDUsNTMgKzM3MywyMjUgQEAKICAgICAgKiBWT0lEIFRFU1QKICAgICAgKi8KICAgICB0cnkgewotICAgICAgcHJpbnRmKCJ0ZXN0Vm9pZCgpIik7CisgICAgICBjb3V0IDw8ICJ0ZXN0Vm9pZCgpIiA8PCBmbHVzaDsKICAgICAgIHRlc3RDbGllbnQudGVzdFZvaWQoKTsKLSAgICAgIHByaW50ZigiID0gdm9pZFxuIik7Ci0gICAgfSBjYXRjaCAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHRheCkgewotICAgICAgcHJpbnRmKCIlc1xuIiwgdGF4LndoYXQoKSk7CisgICAgICBjb3V0IDw8ICIgPSB2b2lkIiA8PCBlbmRsOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICAvLyBTdG9wIGhlcmUgaWYgdHJhbnNwb3J0IGdvdCBicm9rZW4KKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBTVFJJTkcgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0U3RyaW5nKFwiVGVzdFwiKSIgPDwgZmx1c2g7CiAgICAgc3RyaW5nIHM7CiAgICAgdGVzdENsaWVudC50ZXN0U3RyaW5nKHMsICJUZXN0Iik7Ci0gICAgcHJpbnRmKCIgPSBcIiVzXCJcbiIsIHMuY19zdHIoKSk7CisgICAgY291dCA8PCAiID0gIiA8PCBzIDw8IGVuZGw7CisgICAgaWYgKHMgIT0gIlRlc3QiKSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBNdWx0aXBsZXhlZCBwcm90b2NvbCAtIGNhbGwgYW5vdGhlciBzZXJ2aWNlIG1ldGhvZAorICAgIC8vIGluIHRoZSBtaWRkbGUgb2YgdGhlIFRocmlmdFRlc3QKKyAgICAvLworICAgIGlmIChib29zdDo6c3RhcnRzX3dpdGgocHJvdG9jb2xfdHlwZSwgIm11bHRpIikpIHsKKyAgICBTZWNvbmRTZXJ2aWNlQ2xpZW50IHNzYyhwcm90b2NvbDIpOworICAgIC8vIHRyYW5zcG9ydCBpcyBhbHJlYWR5IG9wZW4uLi4KKworICAgICAgICB0cnkgeworICAgICAgICAgIGNvdXQgPDwgInNlY29uZFNlcnZpY2Uuc2Vjb25kVGVzdFN0cmluZyhcImZvb1wiKSA9PiAiIDw8IGZsdXNoOworICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgICBzc2Muc2Vjb25kdGVzdFN0cmluZyhyZXN1bHQsICJmb28iKTsKKyAgICAgIGNvdXQgPDwgInsiIDw8IHJlc3VsdCA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CisgICAgICBjb3V0IDw8ICIgICoqKiBGQUlMRUQgKioqICIgPDwgZS53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOworICAgIH0KKyAgICB9CisKKyAgICB0cnkgeworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDU2NiApCisjZW5kaWYKKyAgICAgIHN0cmluZyBzdHIoCisgICAgICAgICAgIn17QWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksICIKKyAgICAgICAgICAiQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsICIKKyAgICAgICAgICAi0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCAiCisgICAgICAgICAgIuCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgIgorICAgICAgICAgICJDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsICIKKyAgICAgICAgICAiRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCAiCisgICAgICAgICAgIkVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgIgorICAgICAgICAgICJGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sICIKKyAgICAgICAgICAiQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgIgorICAgICAgICAgICJLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCAiCisgICAgICAgICAgIklsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwgIgorICAgICAgICAgICLhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsICIKKyAgICAgICAgICAiUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCAiCisgICAgICAgICAgIkzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhICIKKyAgICAgICAgICAiQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhICIKKyAgICAgICAgICAiTWVsYXl1LCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqIgorICAgICAgICAgICJOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsICIKKyAgICAgICAgICAiT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsICIKKyAgICAgICAgICAiTm9yZnVrIC8gUGl0a2VybiwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsICIKKyAgICAgICAgICAi0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSAiCisgICAgICAgICAgIkVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgIgorICAgICAgICAgICJTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csICIKKyAgICAgICAgICAiVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgIgorICAgICAgICAgICJXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCAiCisgICAgICAgICAgIkLDom4tbMOibS1nw7osIOeyteiqniIpOworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcoIHBvcCApCisjZW5kaWYKKyAgICAgIGNvdXQgPDwgInRlc3RTdHJpbmcoIiA8PCBzdHIgPDwgIikgPSAiIDw8IGZsdXNoOworICAgICAgdGVzdENsaWVudC50ZXN0U3RyaW5nKHMsIHN0cik7CisgICAgICBjb3V0IDw8IHMgPDwgZW5kbDsKKyAgICAgIGlmIChzICE9IHN0cikgeworICAgICAgICBjb3V0LmltYnVlKGxvY2FsZSgiZW5fVVMuVVRGOCIpKTsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgIkV4cGVjdGVkIHN0cmluZzogIiA8PCBzdHIgPDwgIiBidXQgZ290OiAiIDw8IHMgPDwgZW5kbCA8PCAiQ0xFQVIiOworICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICByZXR1cm4gcmV0dXJuX2NvZGU7CisgICAgfQorICAgIHRyeSB7CisgICAgICBzdHJpbmcgc3RyKAorICAgICAgICAgICJxdW90ZTogXCIgYmFja3NsYXNoOiIKKyAgICAgICAgICAiIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcXC8gIgorICAgICAgICAgICIgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICIKKyAgICAgICAgICAiIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogXCJcXFxcL1xiXG5cclx0IgorICAgICAgICAgICIgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCIKKyAgICAgICAgICAiIGNoYXItdG8tdGVzdC1qc29uLXBhcnNpbmc6IF1dIFwiXV0gXFxcIiB9fX17IFtbWyAiKTsKKyAgICAgIGNvdXQgPDwgInRlc3RTdHJpbmcoIiA8PCBzdHIgPDwgIikgPSAiIDw8IGZsdXNoOworICAgICAgdGVzdENsaWVudC50ZXN0U3RyaW5nKHMsIHN0cik7CisgICAgICBjb3V0IDw8IHMgPDwgZW5kbDsKKyAgICAgIGlmIChzICE9IHN0cikgeworICAgICAgICBjb3V0LmltYnVlKGxvY2FsZSgiZW5fVVMuVVRGOCIpKTsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgc3RyaW5nOiAiIDw8IHN0ciA8PCAiIGJ1dCBnb3Q6ICIgPDwgcyA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIkNMRUFSIjsKKyAgICAgICAgOworICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICByZXR1cm4gcmV0dXJuX2NvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQk9PTCBURVNUCisgICAgICovCisgICAgY291dCA8PCBib29sYWxwaGE7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qm9vbCwgdHJ1ZSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qm9vbCwgZmFsc2UpOwogCiAgICAgLyoqCiAgICAgICogQllURSBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0Qnl0ZSgxKSIpOwotICAgIHVpbnQ4X3QgdTggPSB0ZXN0Q2xpZW50LnRlc3RCeXRlKDEpOwotICAgIHByaW50ZigiID0gJWRcbiIsIChpbnQpdTgpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEJ5dGUsIChpbnQ4X3QpMCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qnl0ZSwgKGludDhfdCktMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qnl0ZSwgKGludDhfdCk0Mik7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qnl0ZSwgKGludDhfdCktNDIpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEJ5dGUsIChpbnQ4X3QpMTI3KTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RCeXRlLCAoaW50OF90KS0xMjgpOwogCiAgICAgLyoqCiAgICAgICogSTMyIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3RJMzIoLTEpIik7Ci0gICAgaW50MzJfdCBpMzIgPSB0ZXN0Q2xpZW50LnRlc3RJMzIoLTEpOwotICAgIHByaW50ZigiID0gJWRcbiIsIGkzMik7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAwKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJMzIsIC0xKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJMzIsIDE5MDAwMDAxMyk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAtMTkwMDAwMDEzKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJMzIsIChudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJMzIsIChudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKSgpKTsKIAogICAgIC8qKgogICAgICAqIEk2NCBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKLSAgICBpbnQ2NF90IGk2NCA9IHRlc3RDbGllbnQudGVzdEk2NCgtMzQzNTk3MzgzNjhMTCk7Ci0gICAgcHJpbnRmKCIgPSAlIlBSSWQ2NCJcbiIsIGk2NCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdCkwKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KS0xKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KTcwMDAwMDAwMDAwMDAwMDAxMjNMTCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdCktNzAwMDAwMDAwMDAwMDAwMDEyM0xMKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDJMTCksIDMyKSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdCktcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMkxMKSwgMzIpKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDJMTCksIDMyKSArIDEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKGludDY0X3QpLXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDJMTCksIDMyKSAtIDEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKG51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgpKCkpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKG51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptaW4pKCkpOwogCiAgICAgLyoqCiAgICAgICogRE9VQkxFIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3REb3VibGUoLTUuMjA5ODUyMykiKTsKLSAgICBkb3VibGUgZHViID0gdGVzdENsaWVudC50ZXN0RG91YmxlKC01LjIwOTg1MjMpOwotICAgIHByaW50ZigiID0gJWZcbiIsIGR1Yik7CisgICAgLy8gQ29tcGFyaW5nIGRvdWJsZSB2YWx1ZXMgd2l0aCBwbGFpbiBlcXVhbGl0eSBiZWNhdXNlIFRocmlmdCBoYW5kbGVzIGZ1bGwgcHJlY2lzaW9uIG9mIGRvdWJsZQorICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgMC4wKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIC0xLjApOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgLTUuMjA5ODUyMyk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCAtMC4wMDAzNDEwMTI0Mzk2Mzg1OTgyNzkpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMiksIDMyKSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCBwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyKSwgMzIpICsgMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCBwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyKSwgNTMpIC0gMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCAtcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMiksIDMyKSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCAtcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMiksIDMyKSAtIDEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgLXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDIpLCA1MykgKyAxKTsKKworICAgIHRyeSB7CisgICAgICBkb3VibGUgZXhwZWN0ZWQgPSBwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigxMCksIDMwNyk7CisgICAgICBjb3V0IDw8ICJ0ZXN0RG91YmxlKCIgPDwgZXhwZWN0ZWQgPDwgIikgPSAiIDw8IGZsdXNoOworICAgICAgZG91YmxlIGFjdHVhbCA9IHRlc3RDbGllbnQudGVzdERvdWJsZShleHBlY3RlZCk7CisgICAgICBjb3V0IDw8ICIoIiA8PCBhY3R1YWwgPDwgIikiIDw8IGVuZGw7CisgICAgICBpZiAoZXhwZWN0ZWQgLSBhY3R1YWwgPiBwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigxMCksIDI5MikpIHsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWQgPDwgIiBidXQgZ290OiAiIDw8IGFjdHVhbCA8PCBlbmRsOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGRvdWJsZSBleHBlY3RlZCA9IHBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDEwKSwgLTI5Mik7CisgICAgICBjb3V0IDw8ICJ0ZXN0RG91YmxlKCIgPDwgZXhwZWN0ZWQgPDwgIikgPSAiIDw8IGZsdXNoOworICAgICAgZG91YmxlIGFjdHVhbCA9IHRlc3RDbGllbnQudGVzdERvdWJsZShleHBlY3RlZCk7CisgICAgICBjb3V0IDw8ICIoIiA8PCBhY3R1YWwgPDwgIikiIDw8IGVuZGw7CisgICAgICBpZiAoZXhwZWN0ZWQgLSBhY3R1YWwgPiBwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigxMCksIC0zMDcpKSB7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICIgYnV0IGdvdDogIiA8PCBhY3R1YWwgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgdGhyb3c7CisgICAgfSBjYXRjaCAoZXhjZXB0aW9uJiBleCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJJTkFSWSBURVNUCisgICAgICovCisgICAgZm9yIChzdHJpbmc6OnNpemVfdHlwZSBpID0gMDsgaSA8IDEzMTA3MyAmJiAhcmV0dXJuX2NvZGU7ICkgeworICAgICAgcmV0dXJuX2NvZGUgfD0gYmluYXJ5X3Rlc3QodGVzdENsaWVudCwgaSk7CisgICAgICBpZiAoaSA+IDApIHsgaSAqPSAyOyB9IGVsc2UgeyArK2k7IH0KKyAgICB9CisKIAogICAgIC8qKgogICAgICAqIFNUUlVDVCBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0U3RydWN0KHtcIlplcm9cIiwgMSwgLTMsIC01fSkiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0U3RydWN0KHtcIlplcm9cIiwgMSwgLTMsIC01fSkiIDw8IGZsdXNoOwogICAgIFh0cnVjdCBvdXQ7CiAgICAgb3V0LnN0cmluZ190aGluZyA9ICJaZXJvIjsKICAgICBvdXQuYnl0ZV90aGluZyA9IDE7CkBAIC0yOTksMTYgKzU5OSwyMCBAQAogICAgIG91dC5pNjRfdGhpbmcgPSAtNTsKICAgICBYdHJ1Y3QgaW47CiAgICAgdGVzdENsaWVudC50ZXN0U3RydWN0KGluLCBvdXQpOwotICAgIHByaW50ZigiID0ge1wiJXNcIiwgJWQsICVkLCAlIlBSSWQ2NCJ9XG4iLAorICAgIHByaW50ZigiID0ge1wiJXNcIiwgJWQsICVkLCAlIiBQUklkNjQgIn1cbiIsCiAgICAgICAgICAgIGluLnN0cmluZ190aGluZy5jX3N0cigpLAogICAgICAgICAgICAoaW50KWluLmJ5dGVfdGhpbmcsCiAgICAgICAgICAgIGluLmkzMl90aGluZywKICAgICAgICAgICAgaW4uaTY0X3RoaW5nKTsKKyAgICBpZiAoaW4gIT0gb3V0KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOworICAgIH0KIAogICAgIC8qKgogICAgICAqIE5FU1RFRCBTVFJVQ1QgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSksIDV9Iik7CisgICAgY291dCA8PCAidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSksIDV9IiA8PCBmbHVzaDsKICAgICBYdHJ1Y3QyIG91dDI7CiAgICAgb3V0Mi5ieXRlX3RoaW5nID0gMTsKICAgICBvdXQyLnN0cnVjdF90aGluZyA9IG91dDsKQEAgLTMxNiw0NiArNjIwLDg1IEBACiAgICAgWHRydWN0MiBpbjI7CiAgICAgdGVzdENsaWVudC50ZXN0TmVzdChpbjIsIG91dDIpOwogICAgIGluID0gaW4yLnN0cnVjdF90aGluZzsKLSAgICBwcmludGYoIiA9IHslZCwge1wiJXNcIiwgJWQsICVkLCAlIlBSSWQ2NCJ9LCAlZH1cbiIsCisgICAgcHJpbnRmKCIgPSB7JWQsIHtcIiVzXCIsICVkLCAlZCwgJSIgUFJJZDY0ICJ9LCAlZH1cbiIsCiAgICAgICAgICAgIGluMi5ieXRlX3RoaW5nLAogICAgICAgICAgICBpbi5zdHJpbmdfdGhpbmcuY19zdHIoKSwKICAgICAgICAgICAgKGludClpbi5ieXRlX3RoaW5nLAogICAgICAgICAgICBpbi5pMzJfdGhpbmcsCiAgICAgICAgICAgIGluLmk2NF90aGluZywKICAgICAgICAgICAgaW4yLmkzMl90aGluZyk7CisgICAgaWYgKGluMiAhPSBvdXQyKSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOworICAgIH0KIAogICAgIC8qKgogICAgICAqIE1BUCBURVNUCiAgICAgICovCi0gICAgbWFwPGludDMyX3QsaW50MzJfdD4gbWFwb3V0OworICAgIG1hcDxpbnQzMl90LCBpbnQzMl90PiBtYXBvdXQ7CiAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgNTsgKytpKSB7Ci0gICAgICBtYXBvdXQuaW5zZXJ0KG1ha2VfcGFpcihpLCBpLTEwKSk7CisgICAgICBtYXBvdXQuaW5zZXJ0KG1ha2VfcGFpcihpLCBpIC0gMTApKTsKICAgICB9Ci0gICAgcHJpbnRmKCJ0ZXN0TWFwKHsiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0TWFwKHsiIDw8IGZsdXNoOwogICAgIG1hcDxpbnQzMl90LCBpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwogICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgIGZvciAobV9pdGVyID0gbWFwb3V0LmJlZ2luKCk7IG1faXRlciAhPSBtYXBvdXQuZW5kKCk7ICsrbV9pdGVyKSB7CiAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgICAgY291dCA8PCAiLCI7CiAgICAgICB9Ci0gICAgICBwcmludGYoIiVkID0+ICVkIiwgbV9pdGVyLT5maXJzdCwgbV9pdGVyLT5zZWNvbmQpOworICAgICAgY291dCA8PCBtX2l0ZXItPmZpcnN0IDw8ICIgPT4gIiA8PCBtX2l0ZXItPnNlY29uZDsKICAgICB9Ci0gICAgcHJpbnRmKCJ9KSIpOwotICAgIG1hcDxpbnQzMl90LGludDMyX3Q+IG1hcGluOworICAgIGNvdXQgPDwgIn0pIjsKKyAgICBtYXA8aW50MzJfdCwgaW50MzJfdD4gbWFwaW47CiAgICAgdGVzdENsaWVudC50ZXN0TWFwKG1hcGluLCBtYXBvdXQpOwotICAgIHByaW50ZigiID0geyIpOworICAgIGNvdXQgPDwgIiA9IHsiOwogICAgIGZpcnN0ID0gdHJ1ZTsKICAgICBmb3IgKG1faXRlciA9IG1hcGluLmJlZ2luKCk7IG1faXRlciAhPSBtYXBpbi5lbmQoKTsgKyttX2l0ZXIpIHsKICAgICAgIGlmIChmaXJzdCkgewogICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCIsICIpOworICAgICAgICBjb3V0IDw8ICIsIjsKICAgICAgIH0KLSAgICAgIHByaW50ZigiJWQgPT4gJWQiLCBtX2l0ZXItPmZpcnN0LCBtX2l0ZXItPnNlY29uZCk7CisgICAgICBjb3V0IDw8IG1faXRlci0+Zmlyc3QgPDwgIiA9PiAiIDw8IG1faXRlci0+c2Vjb25kOwogICAgIH0KLSAgICBwcmludGYoIn1cbiIpOworICAgIGNvdXQgPDwgIn0iIDw8IGVuZGw7CisgICAgaWYgKG1hcGluICE9IG1hcG91dCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTVFJJTkcgTUFQIFRFU1QKKyAgICAgKi8KKyAgICBjb3V0IDw8ICJ0ZXN0U3RyaW5nTWFwKHthID0+IDIsIGIgPT4gYmxhaCwgc29tZSA9PiB0aGluZ30pID0geyIgPDwgZmx1c2g7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBzbWFwaW47CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBzbWFwb3V0OworICAgIHNtYXBpblsiYSJdID0gIjIiOworICAgIHNtYXBpblsiYiJdID0gImJsYWgiOworICAgIHNtYXBpblsic29tZSJdID0gInRoaW5nIjsKKyAgICB0cnkgeworICAgICAgdGVzdENsaWVudC50ZXN0U3RyaW5nTWFwKHNtYXBvdXQsIHNtYXBpbik7CisgICAgICBmaXJzdCA9IHRydWU7CisgICAgICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc21hcG91dC5iZWdpbigpOyBpdCAhPSBzbWFwb3V0LmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICBjb3V0IDw8ICIsIjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIGNvdXQgPDwgaXQtPmZpcnN0IDw8ICIgPT4gIiA8PCBpdC0+c2Vjb25kOworICAgICAgfQorICAgICAgY291dCA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGlmIChzbWFwaW4gIT0gc21hcG91dCkgeworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogU0VUIFRFU1QKQEAgLTM2NCwyMjIgKzcwNywzNjcgQEAKICAgICBmb3IgKGludDMyX3QgaSA9IC0yOyBpIDwgMzsgKytpKSB7CiAgICAgICBzZXRvdXQuaW5zZXJ0KGkpOwogICAgIH0KLSAgICBwcmludGYoInRlc3RTZXQoeyIpOworICAgIGNvdXQgPDwgInRlc3RTZXQoeyIgPDwgZmx1c2g7CiAgICAgc2V0PGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7CiAgICAgZmlyc3QgPSB0cnVlOwogICAgIGZvciAoc19pdGVyID0gc2V0b3V0LmJlZ2luKCk7IHNfaXRlciAhPSBzZXRvdXQuZW5kKCk7ICsrc19pdGVyKSB7CiAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgICAgY291dCA8PCAiLCI7CiAgICAgICB9Ci0gICAgICBwcmludGYoIiVkIiwgKnNfaXRlcik7CisgICAgICBjb3V0IDw8ICpzX2l0ZXI7CiAgICAgfQotICAgIHByaW50ZigifSkiKTsKKyAgICBjb3V0IDw8ICJ9KSI7CiAgICAgc2V0PGludDMyX3Q+IHNldGluOwogICAgIHRlc3RDbGllbnQudGVzdFNldChzZXRpbiwgc2V0b3V0KTsKLSAgICBwcmludGYoIiA9IHsiKTsKKyAgICBjb3V0IDw8ICIgPSB7IjsKICAgICBmaXJzdCA9IHRydWU7CiAgICAgZm9yIChzX2l0ZXIgPSBzZXRpbi5iZWdpbigpOyBzX2l0ZXIgIT0gc2V0aW4uZW5kKCk7ICsrc19pdGVyKSB7CiAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgICAgY291dCA8PCAiLCI7CiAgICAgICB9Ci0gICAgICBwcmludGYoIiVkIiwgKnNfaXRlcik7CisgICAgICBjb3V0IDw8ICpzX2l0ZXI7CiAgICAgfQotICAgIHByaW50ZigifVxuIik7CisgICAgY291dCA8PCAifSIgPDwgZW5kbDsKKyAgICBpZiAoc2V0aW4gIT0gc2V0b3V0KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgIH0KIAogICAgIC8qKgogICAgICAqIExJU1QgVEVTVAogICAgICAqLwotICAgIHZlY3RvcjxpbnQzMl90PiBsaXN0b3V0OwotICAgIGZvciAoaW50MzJfdCBpID0gLTI7IGkgPCAzOyArK2kpIHsKLSAgICAgIGxpc3RvdXQucHVzaF9iYWNrKGkpOwotICAgIH0KLSAgICBwcmludGYoInRlc3RMaXN0KHsiKTsKLSAgICB2ZWN0b3I8aW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIGxfaXRlcjsKLSAgICBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChsX2l0ZXIgPSBsaXN0b3V0LmJlZ2luKCk7IGxfaXRlciAhPSBsaXN0b3V0LmVuZCgpOyArK2xfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiwgIik7CisgICAgY291dCA8PCAidGVzdExpc3QoZW1wdHkpIiA8PCBmbHVzaDsKKyAgICB0cnkgeworICAgICAgdmVjdG9yPGludDMyX3Q+IGxpc3RvdXQ7CisgICAgICB0ZXN0Q2xpZW50LnRlc3RMaXN0KGxpc3RvdXQsIHZlY3RvcjxpbnQzMl90PigpKTsKKyAgICAgIGlmICghbGlzdG91dC5lbXB0eSgpKSB7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgICBjb3V0IDw8ICJpbnZhbGlkIGxlbmd0aDogIiA8PCBsaXN0b3V0LnNpemUoKSA8PCBlbmRsOworICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKICAgICAgIH0KLSAgICAgIHByaW50ZigiJWQiLCAqbF9pdGVyKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgdGhyb3c7CisgICAgfSBjYXRjaCAoZXhjZXB0aW9uJiBleCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKICAgICB9Ci0gICAgcHJpbnRmKCJ9KSIpOwotICAgIHZlY3RvcjxpbnQzMl90PiBsaXN0aW47Ci0gICAgdGVzdENsaWVudC50ZXN0TGlzdChsaXN0aW4sIGxpc3RvdXQpOwotICAgIHByaW50ZigiID0geyIpOwotICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGxfaXRlciA9IGxpc3Rpbi5iZWdpbigpOyBsX2l0ZXIgIT0gbGlzdGluLmVuZCgpOyArK2xfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiwgIik7CisgICAgdHJ5IHsKKyAgICAgIHZlY3RvcjxpbnQzMl90PiBsaXN0b3V0OworICAgICAgZm9yIChpbnQzMl90IGkgPSAtMjsgaSA8IDM7ICsraSkgeworICAgICAgICBsaXN0b3V0LnB1c2hfYmFjayhpKTsKICAgICAgIH0KLSAgICAgIHByaW50ZigiJWQiLCAqbF9pdGVyKTsKKyAgICAgIGNvdXQgPDwgInRlc3RMaXN0KHsiIDw8IGZsdXNoOworICAgICAgdmVjdG9yPGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBsX2l0ZXI7CisgICAgICBmaXJzdCA9IHRydWU7CisgICAgICBmb3IgKGxfaXRlciA9IGxpc3RvdXQuYmVnaW4oKTsgbF9pdGVyICE9IGxpc3RvdXQuZW5kKCk7ICsrbF9pdGVyKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY291dCA8PCAiLCI7CisgICAgICAgIH0KKyAgICAgICAgY291dCA8PCAqbF9pdGVyOworICAgICAgfQorICAgICAgY291dCA8PCAifSkiOworICAgICAgdmVjdG9yPGludDMyX3Q+IGxpc3RpbjsKKyAgICAgIHRlc3RDbGllbnQudGVzdExpc3QobGlzdGluLCBsaXN0b3V0KTsKKyAgICAgIGNvdXQgPDwgIiA9IHsiOworICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgZm9yIChsX2l0ZXIgPSBsaXN0aW4uYmVnaW4oKTsgbF9pdGVyICE9IGxpc3Rpbi5lbmQoKTsgKytsX2l0ZXIpIHsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb3V0IDw8ICIsIjsKKyAgICAgICAgfQorICAgICAgICBjb3V0IDw8ICpsX2l0ZXI7CisgICAgICB9CisgICAgICBjb3V0IDw8ICJ9IiA8PCBlbmRsOworICAgICAgaWYgKGxpc3RpbiAhPSBsaXN0b3V0KSB7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgdGhyb3c7CisgICAgfSBjYXRjaCAoZXhjZXB0aW9uJiBleCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKICAgICB9Ci0gICAgcHJpbnRmKCJ9XG4iKTsKIAogICAgIC8qKgogICAgICAqIEVOVU0gVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdEVudW0oT05FKSIpOworICAgIGNvdXQgPDwgInRlc3RFbnVtKE9ORSkiIDw8IGZsdXNoOwogICAgIE51bWJlcno6OnR5cGUgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6OjpPTkUpOwotICAgIHByaW50ZigiID0gJWRcbiIsIHJldCk7CisgICAgY291dCA8PCAiID0gIiA8PCByZXQgPDwgZW5kbDsKKyAgICBpZiAocmV0ICE9IE51bWJlcno6Ok9ORSkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICB9CiAKLSAgICBwcmludGYoInRlc3RFbnVtKFRXTykiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0RW51bShUV08pIiA8PCBmbHVzaDsKICAgICByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcno6OlRXTyk7Ci0gICAgcHJpbnRmKCIgPSAlZFxuIiwgcmV0KTsKKyAgICBjb3V0IDw8ICIgPSAiIDw8IHJldCA8PCBlbmRsOworICAgIGlmIChyZXQgIT0gTnVtYmVyejo6VFdPKSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOworICAgIH0KIAotICAgIHByaW50ZigidGVzdEVudW0oVEhSRUUpIik7CisgICAgY291dCA8PCAidGVzdEVudW0oVEhSRUUpIiA8PCBmbHVzaDsKICAgICByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcno6OlRIUkVFKTsKLSAgICBwcmludGYoIiA9ICVkXG4iLCByZXQpOworICAgIGNvdXQgPDwgIiA9ICIgPDwgcmV0IDw8IGVuZGw7CisgICAgaWYgKHJldCAhPSBOdW1iZXJ6OjpUSFJFRSkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICB9CiAKLSAgICBwcmludGYoInRlc3RFbnVtKEZJVkUpIik7CisgICAgY291dCA8PCAidGVzdEVudW0oRklWRSkiIDw8IGZsdXNoOwogICAgIHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oTnVtYmVyejo6RklWRSk7Ci0gICAgcHJpbnRmKCIgPSAlZFxuIiwgcmV0KTsKKyAgICBjb3V0IDw8ICIgPSAiIDw8IHJldCA8PCBlbmRsOworICAgIGlmIChyZXQgIT0gTnVtYmVyejo6RklWRSkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICB9CiAKLSAgICBwcmludGYoInRlc3RFbnVtKEVJR0hUKSIpOworICAgIGNvdXQgPDwgInRlc3RFbnVtKEVJR0hUKSIgPDwgZmx1c2g7CiAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6OjpFSUdIVCk7Ci0gICAgcHJpbnRmKCIgPSAlZFxuIiwgcmV0KTsKKyAgICBjb3V0IDw8ICIgPSAiIDw8IHJldCA8PCBlbmRsOworICAgIGlmIChyZXQgIT0gTnVtYmVyejo6RUlHSFQpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogVFlQRURFRiBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CisgICAgY291dCA8PCAidGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSIgPDwgZmx1c2g7CiAgICAgVXNlcklkIHVpZCA9IHRlc3RDbGllbnQudGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzTEwpOwotICAgIHByaW50ZigiID0gJSJQUklkNjQiXG4iLCB1aWQpOworICAgIGNvdXQgPDwgIiA9ICIgPDwgdWlkIDw8IGVuZGw7CisgICAgaWYgKHVpZCAhPSAzMDk4NTgyMzUwODI1MjNMTCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBORVNURUQgTUFQIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3RNYXBNYXAoMSkiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0TWFwTWFwKDEpIiA8PCBmbHVzaDsKICAgICBtYXA8aW50MzJfdCwgbWFwPGludDMyX3QsIGludDMyX3Q+ID4gbW07CiAgICAgdGVzdENsaWVudC50ZXN0TWFwTWFwKG1tLCAxKTsKLSAgICBwcmludGYoIiA9IHsiKTsKKyAgICBjb3V0IDw8ICIgPSB7IjsKICAgICBtYXA8aW50MzJfdCwgbWFwPGludDMyX3QsIGludDMyX3Q+ID46OmNvbnN0X2l0ZXJhdG9yIG1pOwogICAgIGZvciAobWkgPSBtbS5iZWdpbigpOyBtaSAhPSBtbS5lbmQoKTsgKyttaSkgewogICAgICAgcHJpbnRmKCIlZCA9PiB7IiwgbWktPmZpcnN0KTsKICAgICAgIG1hcDxpbnQzMl90LCBpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgbWkyOwogICAgICAgZm9yIChtaTIgPSBtaS0+c2Vjb25kLmJlZ2luKCk7IG1pMiAhPSBtaS0+c2Vjb25kLmVuZCgpOyArK21pMikgewotICAgICAgICBwcmludGYoIiVkID0+ICVkLCAiLCBtaTItPmZpcnN0LCBtaTItPnNlY29uZCk7CisgICAgICAgIGNvdXQgPDwgbWkyLT5maXJzdCA8PCAiID0+ICIgPDwgbWkyLT5zZWNvbmQ7CiAgICAgICB9Ci0gICAgICBwcmludGYoIn0sICIpOworICAgICAgY291dCA8PCAifSwgIjsKICAgICB9Ci0gICAgcHJpbnRmKCJ9XG4iKTsKKyAgICBjb3V0IDw8ICJ9IiA8PCBlbmRsOworICAgIGlmIChtbS5zaXplKCkgIT0gMiB8fAorICAgICAgICBtbVstNF1bLTRdICE9IC00IHx8CisgICAgICAgIG1tWy00XVstM10gIT0gLTMgfHwKKyAgICAgICAgbW1bLTRdWy0yXSAhPSAtMiB8fAorICAgICAgICBtbVstNF1bLTFdICE9IC0xIHx8CisgICAgICAgIG1tWzRdWzRdICE9IDQgfHwKKyAgICAgICAgbW1bNF1bM10gIT0gMyB8fAorICAgICAgICBtbVs0XVsyXSAhPSAyIHx8CisgICAgICAgIG1tWzRdWzFdICE9IDEpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogSU5TQU5JVFkgVEVTVAogICAgICAqLwotICAgIEluc2FuaXR5IGluc2FuZTsKLSAgICBpbnNhbmUudXNlck1hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OkZJVkUsIDUwMDApKTsKLSAgICBYdHJ1Y3QgdHJ1Y2s7Ci0gICAgdHJ1Y2suc3RyaW5nX3RoaW5nID0gIlRydWNrIjsKLSAgICB0cnVjay5ieXRlX3RoaW5nID0gODsKLSAgICB0cnVjay5pMzJfdGhpbmcgPSA4OwotICAgIHRydWNrLmk2NF90aGluZyA9IDg7Ci0gICAgaW5zYW5lLnh0cnVjdHMucHVzaF9iYWNrKHRydWNrKTsKLSAgICBwcmludGYoInRlc3RJbnNhbml0eSgpIik7Ci0gICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsSW5zYW5pdHk+ID4gd2hvYTsKLSAgICB0ZXN0Q2xpZW50LnRlc3RJbnNhbml0eSh3aG9hLCBpbnNhbmUpOwotICAgIHByaW50ZigiID0geyIpOwotICAgIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6Ojp0eXBlLEluc2FuaXR5PiA+Ojpjb25zdF9pdGVyYXRvciBpX2l0ZXI7Ci0gICAgZm9yIChpX2l0ZXIgPSB3aG9hLmJlZ2luKCk7IGlfaXRlciAhPSB3aG9hLmVuZCgpOyArK2lfaXRlcikgewotICAgICAgcHJpbnRmKCIlIlBSSWQ2NCIgPT4geyIsIGlfaXRlci0+Zmlyc3QpOwotICAgICAgbWFwPE51bWJlcno6OnR5cGUsSW5zYW5pdHk+Ojpjb25zdF9pdGVyYXRvciBpMl9pdGVyOwotICAgICAgZm9yIChpMl9pdGVyID0gaV9pdGVyLT5zZWNvbmQuYmVnaW4oKTsKLSAgICAgICAgICAgaTJfaXRlciAhPSBpX2l0ZXItPnNlY29uZC5lbmQoKTsKLSAgICAgICAgICAgKytpMl9pdGVyKSB7Ci0gICAgICAgIHByaW50ZigiJWQgPT4geyIsIGkyX2l0ZXItPmZpcnN0KTsKLSAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIFVzZXJJZD4gdXNlck1hcCA9IGkyX2l0ZXItPnNlY29uZC51c2VyTWFwOwotICAgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgVXNlcklkPjo6Y29uc3RfaXRlcmF0b3IgdW07Ci0gICAgICAgIHByaW50ZigieyIpOwotICAgICAgICBmb3IgKHVtID0gdXNlck1hcC5iZWdpbigpOyB1bSAhPSB1c2VyTWFwLmVuZCgpOyArK3VtKSB7Ci0gICAgICAgICAgcHJpbnRmKCIlZCA9PiAlIlBSSWQ2NCIsICIsIHVtLT5maXJzdCwgdW0tPnNlY29uZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbnRmKCJ9LCAiKTsKKyAgICBpZiAoIW5vaW5zYW5lKSB7CisgICAgICBJbnNhbml0eSBpbnNhbmU7CisgICAgICBpbnNhbmUudXNlck1hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OkZJVkUsIDUpKTsKKyAgICAgIGluc2FuZS51c2VyTWFwLmluc2VydChtYWtlX3BhaXIoTnVtYmVyejo6RUlHSFQsIDgpKTsKKyAgICAgIFh0cnVjdCB0cnVjazsKKyAgICAgIHRydWNrLnN0cmluZ190aGluZyA9ICJHb29kYnllNCI7CisgICAgICB0cnVjay5ieXRlX3RoaW5nID0gNDsKKyAgICAgIHRydWNrLmkzMl90aGluZyA9IDQ7CisgICAgICB0cnVjay5pNjRfdGhpbmcgPSA0OworICAgICAgWHRydWN0IHRydWNrMjsKKyAgICAgIHRydWNrMi5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKKyAgICAgIHRydWNrMi5ieXRlX3RoaW5nID0gMjsKKyAgICAgIHRydWNrMi5pMzJfdGhpbmcgPSAyOworICAgICAgdHJ1Y2syLmk2NF90aGluZyA9IDI7CisgICAgICBpbnNhbmUueHRydWN0cy5wdXNoX2JhY2sodHJ1Y2spOworICAgICAgaW5zYW5lLnh0cnVjdHMucHVzaF9iYWNrKHRydWNrMik7CisgICAgICBjb3V0IDw8ICJ0ZXN0SW5zYW5pdHkoKSIgPDwgZmx1c2g7CisgICAgICBtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID4gd2hvYTsKKyAgICAgIHRlc3RDbGllbnQudGVzdEluc2FuaXR5KHdob2EsIGluc2FuZSk7CisgICAgICBjb3V0IDw8ICIgPSB7IjsKKyAgICAgIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gPjo6Y29uc3RfaXRlcmF0b3IgaV9pdGVyOworICAgICAgZm9yIChpX2l0ZXIgPSB3aG9hLmJlZ2luKCk7IGlfaXRlciAhPSB3aG9hLmVuZCgpOyArK2lfaXRlcikgeworICAgICAgICBwcmludGYoIiUiIFBSSWQ2NCAiID0+IHsiLCBpX2l0ZXItPmZpcnN0KTsKKyAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5Pjo6Y29uc3RfaXRlcmF0b3IgaTJfaXRlcjsKKyAgICAgICAgZm9yIChpMl9pdGVyID0gaV9pdGVyLT5zZWNvbmQuYmVnaW4oKTsgaTJfaXRlciAhPSBpX2l0ZXItPnNlY29uZC5lbmQoKTsgKytpMl9pdGVyKSB7CisgICAgICAgICAgcHJpbnRmKCIlZCA9PiB7IiwgaTJfaXRlci0+Zmlyc3QpOworICAgICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBVc2VySWQ+IHVzZXJNYXAgPSBpMl9pdGVyLT5zZWNvbmQudXNlck1hcDsKKyAgICAgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgVXNlcklkPjo6Y29uc3RfaXRlcmF0b3IgdW07CisgICAgICAgICAgY291dCA8PCAieyI7CisgICAgICAgICAgZm9yICh1bSA9IHVzZXJNYXAuYmVnaW4oKTsgdW0gIT0gdXNlck1hcC5lbmQoKTsgKyt1bSkgeworICAgICAgICAgICAgY291dCA8PCB1bS0+Zmlyc3QgPDwgIiA9PiAiIDw8IHVtLT5zZWNvbmQ7CisgICAgICAgICAgfQorICAgICAgICAgIGNvdXQgPDwgIn0sICI7CiAKLSAgICAgICAgdmVjdG9yPFh0cnVjdD4geHRydWN0cyA9IGkyX2l0ZXItPnNlY29uZC54dHJ1Y3RzOwotICAgICAgICB2ZWN0b3I8WHRydWN0Pjo6Y29uc3RfaXRlcmF0b3IgeDsKLSAgICAgICAgcHJpbnRmKCJ7Iik7Ci0gICAgICAgIGZvciAoeCA9IHh0cnVjdHMuYmVnaW4oKTsgeCAhPSB4dHJ1Y3RzLmVuZCgpOyArK3gpIHsKLSAgICAgICAgICBwcmludGYoIntcIiVzXCIsICVkLCAlZCwgJSJQUklkNjQifSwgIiwKLSAgICAgICAgICAgICAgICAgeC0+c3RyaW5nX3RoaW5nLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgIChpbnQpeC0+Ynl0ZV90aGluZywKLSAgICAgICAgICAgICAgICAgeC0+aTMyX3RoaW5nLAotICAgICAgICAgICAgICAgICB4LT5pNjRfdGhpbmcpOwotICAgICAgICB9Ci0gICAgICAgIHByaW50ZigifSIpOworICAgICAgICAgIHZlY3RvcjxYdHJ1Y3Q+IHh0cnVjdHMgPSBpMl9pdGVyLT5zZWNvbmQueHRydWN0czsKKyAgICAgICAgICB2ZWN0b3I8WHRydWN0Pjo6Y29uc3RfaXRlcmF0b3IgeDsKKyAgICAgICAgICBjb3V0IDw8ICJ7IjsKKyAgICAgICAgICBmb3IgKHggPSB4dHJ1Y3RzLmJlZ2luKCk7IHggIT0geHRydWN0cy5lbmQoKTsgKyt4KSB7CisgICAgICAgICAgICBwcmludGYoIntcIiVzXCIsICVkLCAlZCwgJSIgUFJJZDY0ICJ9LCAiLAorICAgICAgICAgICAgICAgICAgIHgtPnN0cmluZ190aGluZy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgIChpbnQpeC0+Ynl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICB4LT5pMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgeC0+aTY0X3RoaW5nKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY291dCA8PCAifSI7CiAKLSAgICAgICAgcHJpbnRmKCJ9LCAiKTsKKyAgICAgICAgICBjb3V0IDw8ICJ9LCAiOworICAgICAgICB9CisgICAgICAgIGNvdXQgPDwgIn0sICI7CiAgICAgICB9Ci0gICAgICBwcmludGYoIn0sICIpOworICAgICAgY291dCA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgICBtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID46OmNvbnN0X2l0ZXJhdG9yIGl0MSA9IHdob2EuZmluZChVc2VySWQoMSkpOworICAgICAgaWYgKHdob2Euc2l6ZSgpICE9IDIpIHsKKyAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGlmIChpdDEgPT0gd2hvYS5lbmQoKSkgeworICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5Pjo6Y29uc3RfaXRlcmF0b3IgaXQxMiA9IGl0MS0+c2Vjb25kLmZpbmQoTnVtYmVyejo6VFdPKTsKKyAgICAgICAgaWYgKGl0MTIgPT0gaXQxLT5zZWNvbmQuZW5kKCkgfHwgaXQxMi0+c2Vjb25kICE9IGluc2FuZSkgeworICAgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5Pjo6Y29uc3RfaXRlcmF0b3IgaXQxMyA9IGl0MS0+c2Vjb25kLmZpbmQoTnVtYmVyejo6VEhSRUUpOworICAgICAgICBpZiAoaXQxMyA9PSBpdDEtPnNlY29uZC5lbmQoKSB8fCBpdDEzLT5zZWNvbmQgIT0gaW5zYW5lKSB7CisgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+Ojpjb25zdF9pdGVyYXRvciBpdDIgPSB3aG9hLmZpbmQoVXNlcklkKDIpKTsKKyAgICAgIGlmIChpdDIgPT0gd2hvYS5lbmQoKSkgeworICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5Pjo6Y29uc3RfaXRlcmF0b3IgaXQyNiA9IGl0Mi0+c2Vjb25kLmZpbmQoTnVtYmVyejo6U0lYKTsKKyAgICAgICAgaWYgKGl0MjYgPT0gaXQyLT5zZWNvbmQuZW5kKCkgfHwgaXQyNi0+c2Vjb25kICE9IEluc2FuaXR5KCkpIHsKKyAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgIH0KICAgICB9Ci0gICAgcHJpbnRmKCJ9XG4iKTsKKworICAgIC8qKgorICAgICAqIE1VTFRJIFRFU1QKKyAgICAgKi8KKyAgICBjb3V0IDw8ICJ0ZXN0TXVsdGkoKSIgPDwgZW5kbDsKKyAgICB0cnkgeworICAgICAgbWFwPGludDE2X3QsIHN0cmluZz4gbXVsX21hcDsKKyAgICAgIFh0cnVjdCBtdWxfcmVzdWx0OworICAgICAgbXVsX21hcFsxXSA9ICJibGFoIjsKKyAgICAgIG11bF9tYXBbMl0gPSAidGhpbmciOworICAgICAgdGVzdENsaWVudC50ZXN0TXVsdGkobXVsX3Jlc3VsdCwgNDIsIDQyNDIsIDQyNDI0MiwgbXVsX21hcCwgTnVtYmVyejo6RUlHSFQsIFVzZXJJZCgyNCkpOworICAgICAgWHRydWN0IHh4czsKKyAgICAgIHh4cy5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKKyAgICAgIHh4cy5ieXRlX3RoaW5nID0gNDI7CisgICAgICB4eHMuaTMyX3RoaW5nID0gNDI0MjsKKyAgICAgIHh4cy5pNjRfdGhpbmcgPSA0MjQyNDI7CisgICAgICBpZiAobXVsX3Jlc3VsdCAhPSB4eHMpIHsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOworICAgIH0KIAogICAgIC8qIHRlc3QgZXhjZXB0aW9uICovCiAKICAgICB0cnkgewotICAgICAgcHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oXCJYY2VwdGlvblwiKSA9PiIpOworICAgICAgY291dCA8PCAidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiWGNlcHRpb25cIikgPT4iIDw8IGZsdXNoOwogICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpOwotICAgICAgcHJpbnRmKCIgIHZvaWRcbkZBSUxVUkVcbiIpOworICAgICAgY291dCA8PCAiICB2b2lkXG4qKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOwogCi0gICAgfSBjYXRjaChYY2VwdGlvbiYgZSkgeworICAgIH0gY2F0Y2ggKFhjZXB0aW9uJiBlKSB7CiAgICAgICBwcmludGYoIiAgeyV1LCBcIiVzXCJ9XG4iLCBlLmVycm9yQ29kZSwgZS5tZXNzYWdlLmNfc3RyKCkpOwogICAgIH0KIAogICAgIHRyeSB7Ci0gICAgICBwcmludGYoInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcInN1Y2Nlc3NcIikgPT4iKTsKKyAgICAgIGNvdXQgPDwgInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcIlRFeGNlcHRpb25cIikgPT4iIDw8IGZsdXNoOworICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIik7CisgICAgICBjb3V0IDw8ICIgIHZvaWRcbioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CisKKyAgICB9IGNhdGNoIChjb25zdCBURXhjZXB0aW9uJikgeworICAgICAgY291dCA8PCAiICBDYXVnaHQgVEV4Y2VwdGlvbiIgPDwgZW5kbDsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgY291dCA8PCAidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwic3VjY2Vzc1wiKSA9PiIgPDwgZmx1c2g7CiAgICAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oInN1Y2Nlc3MiKTsKLSAgICAgIHByaW50ZigiICB2b2lkXG4iKTsKLSAgICB9IGNhdGNoKC4uLikgewotICAgICAgcHJpbnRmKCIgIGV4Y2VwdGlvblxuRkFJTFVSRVxuIik7CisgICAgICBjb3V0IDw8ICIgIHZvaWQiIDw8IGVuZGw7CisgICAgfSBjYXRjaCAoZXhjZXB0aW9uICYgZXgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CiAgICAgfQogCiAgICAgLyogdGVzdCBtdWx0aSBleGNlcHRpb24gKi8KIAogICAgIHRyeSB7Ci0gICAgICBwcmludGYoInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb25cIiwgXCJ0ZXN0IDFcIikgPT4iKTsKKyAgICAgIGNvdXQgPDwgInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb25cIiwgXCJ0ZXN0IDFcIikgPT4iIDw8IGZsdXNoOwogICAgICAgWHRydWN0IHJlc3VsdDsKICAgICAgIHRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKHJlc3VsdCwgIlhjZXB0aW9uIiwgInRlc3QgMSIpOwotICAgICAgcHJpbnRmKCIgIHJlc3VsdFxuRkFJTFVSRVxuIik7Ci0gICAgfSBjYXRjaChYY2VwdGlvbiYgZSkgeworICAgICAgY291dCA8PCAiICByZXN1bHRcbioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CisgICAgfSBjYXRjaCAoWGNlcHRpb24mIGUpIHsKICAgICAgIHByaW50ZigiICB7JXUsIFwiJXNcIn1cbiIsIGUuZXJyb3JDb2RlLCBlLm1lc3NhZ2UuY19zdHIoKSk7CiAgICAgfQogCiAgICAgdHJ5IHsKLSAgICAgIHByaW50ZigidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvbjJcIiwgXCJ0ZXN0IDJcIikgPT4iKTsKKyAgICAgIGNvdXQgPDwgInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb24yXCIsIFwidGVzdCAyXCIpID0+IiA8PCBmbHVzaDsKICAgICAgIFh0cnVjdCByZXN1bHQ7CiAgICAgICB0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihyZXN1bHQsICJYY2VwdGlvbjIiLCAidGVzdCAyIik7Ci0gICAgICBwcmludGYoIiAgcmVzdWx0XG5GQUlMVVJFXG4iKTsKKyAgICAgIGNvdXQgPDwgIiAgcmVzdWx0XG4qKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOwogCi0gICAgfSBjYXRjaChYY2VwdGlvbjImIGUpIHsKKyAgICB9IGNhdGNoIChYY2VwdGlvbjImIGUpIHsKICAgICAgIHByaW50ZigiICB7JXUsIHtcIiVzXCJ9fVxuIiwgZS5lcnJvckNvZGUsIGUuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZy5jX3N0cigpKTsKICAgICB9CiAKICAgICB0cnkgewotICAgICAgcHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcInN1Y2Nlc3NcIiwgXCJ0ZXN0IDNcIikgPT4iKTsKKyAgICAgIGNvdXQgPDwgInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwic3VjY2Vzc1wiLCBcInRlc3QgM1wiKSA9PiIgPDwgZmx1c2g7CiAgICAgICBYdHJ1Y3QgcmVzdWx0OwogICAgICAgdGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24ocmVzdWx0LCAic3VjY2VzcyIsICJ0ZXN0IDMiKTsKICAgICAgIHByaW50ZigiICB7e1wiJXNcIn19XG4iLCByZXN1bHQuc3RyaW5nX3RoaW5nLmNfc3RyKCkpOwotICAgIH0gY2F0Y2goLi4uKSB7Ci0gICAgICBwcmludGYoIiAgZXhjZXB0aW9uXG5GQUlMVVJFXG4iKTsKKyAgICB9IGNhdGNoIChleGNlcHRpb24gJiBleCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKICAgICB9CiAKICAgICAvKiB0ZXN0IG9uZXdheSB2b2lkICovCiAgICAgewotICAgICAgICBwcmludGYoInRlc3RDbGllbnQudGVzdE9uZXdheSgzKSA9PiIpOwotICAgICAgICB1aW50NjRfdCBzdGFydE9uZXdheSA9IG5vdygpOwotICAgICAgICB0ZXN0Q2xpZW50LnRlc3RPbmV3YXkoMyk7Ci0gICAgICAgIHVpbnQ2NF90IGVsYXBzZWQgPSBub3coKSAtIHN0YXJ0T25ld2F5OwotICAgICAgICBpZiAoZWxhcHNlZCA+IDIwMCAqIDEwMDApIHsgLy8gMC4yIHNlY29uZHMKLSAgICAgICAgICAgIHByaW50ZigiICBGQUlMVVJFIC0gdG9vayAlLjJmIG1zXG4iLCAoZG91YmxlKWVsYXBzZWQvMTAwMC4wKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByaW50ZigiICBzdWNjZXNzIC0gdG9vayAlLjJmIG1zXG4iLCAoZG91YmxlKWVsYXBzZWQvMTAwMC4wKTsKLSAgICAgICAgfQorICAgICAgY291dCA8PCAidGVzdENsaWVudC50ZXN0T25ld2F5KDEpID0+IiA8PCBmbHVzaDsKKyAgICAgIHVpbnQ2NF90IHN0YXJ0T25ld2F5ID0gbm93KCk7CisgICAgICB0ZXN0Q2xpZW50LnRlc3RPbmV3YXkoMSk7CisgICAgICB1aW50NjRfdCBlbGFwc2VkID0gbm93KCkgLSBzdGFydE9uZXdheTsKKyAgICAgIGlmIChlbGFwc2VkID4gMjAwICogMTAwMCkgeyAvLyAwLjIgc2Vjb25kcworICAgICAgICBwcmludGYoIioqKiBGQUlMRUQgKioqIC0gdG9vayAlLjJmIG1zXG4iLCAoZG91YmxlKWVsYXBzZWQgLyAxMDAwLjApOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiICBzdWNjZXNzIC0gdG9vayAlLjJmIG1zXG4iLCAoZG91YmxlKWVsYXBzZWQgLyAxMDAwLjApOworICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtNTkzLDE1ICsxMDgxLDE4IEBACiAgICAgLyoqCiAgICAgICogSTMyIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInJlLXRlc3QgdGVzdEkzMigtMSkiKTsKLSAgICBpMzIgPSB0ZXN0Q2xpZW50LnRlc3RJMzIoLTEpOwotICAgIHByaW50ZigiID0gJWRcbiIsIGkzMik7CisgICAgY291dCA8PCAicmUtdGVzdCB0ZXN0STMyKC0xKSIgPDwgZmx1c2g7CisgICAgaW50IGkzMiA9IHRlc3RDbGllbnQudGVzdEkzMigtMSk7CisgICAgY291dCA8PCAiID0gIiA8PCBpMzIgPDwgZW5kbDsKKyAgICBpZiAoaTMyICE9IC0xKQorICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKIAorICAgIGNvdXQgPDwgZW5kbCA8PCAiQWxsIHRlc3RzIGRvbmUuIiA8PCBlbmRsIDw8IGZsdXNoOwogCiAgICAgdWludDY0X3Qgc3RvcCA9IG5vdygpOwotICAgIHVpbnQ2NF90IHRvdCA9IHN0b3Atc3RhcnQ7CisgICAgdWludDY0X3QgdG90ID0gc3RvcCAtIHN0YXJ0OwogCi0gICAgcHJpbnRmKCJUb3RhbCB0aW1lOiAlIlBSSXU2NCIgdXNcbiIsIHN0b3Atc3RhcnQpOworICAgIGNvdXQgPDwgIlRvdGFsIHRpbWU6ICIgPDwgc3RvcCAtIHN0YXJ0IDw8ICIgdXMiIDw8IGVuZGw7CiAKICAgICB0aW1lX3RvdCArPSB0b3Q7CiAgICAgaWYgKHRpbWVfbWluID09IDAgfHwgdG90IDwgdGltZV9taW4pIHsKQEAgLTYxMSwxNyArMTEwMiw3OSBAQAogICAgICAgdGltZV9tYXggPSB0b3Q7CiAgICAgfQogCisgICAgY291dCA8PCBmbHVzaDsKICAgICB0cmFuc3BvcnQtPmNsb3NlKCk7CiAgIH0KIAotICAvLyAgcHJpbnRmKCJcblNvY2tldCBzeXNjYWxsczogJXUiLCBnX3NvY2tldF9zeXNjYWxscyk7Ci0gIHByaW50ZigiXG5BbGwgdGVzdHMgZG9uZS5cbiIpOwogCiAgIHVpbnQ2NF90IHRpbWVfYXZnID0gdGltZV90b3QgLyBudW1UZXN0czsKIAotICBwcmludGYoIk1pbiB0aW1lOiAlIlBSSXU2NCIgdXNcbiIsIHRpbWVfbWluKTsKLSAgcHJpbnRmKCJNYXggdGltZTogJSJQUkl1NjQiIHVzXG4iLCB0aW1lX21heCk7Ci0gIHByaW50ZigiQXZnIHRpbWU6ICUiUFJJdTY0IiB1c1xuIiwgdGltZV9hdmcpOworICBjb3V0IDw8ICJNaW4gdGltZTogIiA8PCB0aW1lX21pbiA8PCAiIHVzIiA8PCBlbmRsOworICBjb3V0IDw8ICJNYXggdGltZTogIiA8PCB0aW1lX21heCA8PCAiIHVzIiA8PCBlbmRsOworICBjb3V0IDw8ICJBdmcgdGltZTogIiA8PCB0aW1lX2F2ZyA8PCAiIHVzIiA8PCBlbmRsOwogCi0gIHJldHVybiAwOworICByZXR1cm4gcmV0dXJuX2NvZGU7Cit9CisKK3ZvaWQgYmluYXJ5X2ZpbGwoc3RkOjpzdHJpbmcmIHN0ciwgc3RyaW5nOjpzaXplX3R5cGUgc2l6KQoreworICAgIHN0YXRpYyBjb25zdCBzaWduZWQgY2hhciBiaW5fZGF0YVsyNTZdCisgICAgICAgID0gey0xMjgsIC0xMjcsIC0xMjYsIC0xMjUsIC0xMjQsIC0xMjMsIC0xMjIsIC0xMjEsIC0xMjAsIC0xMTksIC0xMTgsIC0xMTcsIC0xMTYsIC0xMTUsIC0xMTQsCisgICAgICAgICAgIC0xMTMsIC0xMTIsIC0xMTEsIC0xMTAsIC0xMDksIC0xMDgsIC0xMDcsIC0xMDYsIC0xMDUsIC0xMDQsIC0xMDMsIC0xMDIsIC0xMDEsIC0xMDAsIC05OSwKKyAgICAgICAgICAgLTk4LCAgLTk3LCAgLTk2LCAgLTk1LCAgLTk0LCAgLTkzLCAgLTkyLCAgLTkxLCAgLTkwLCAgLTg5LCAgLTg4LCAgLTg3LCAgLTg2LCAgLTg1LCAgLTg0LAorICAgICAgICAgICAtODMsICAtODIsICAtODEsICAtODAsICAtNzksICAtNzgsICAtNzcsICAtNzYsICAtNzUsICAtNzQsICAtNzMsICAtNzIsICAtNzEsICAtNzAsICAtNjksCisgICAgICAgICAgIC02OCwgIC02NywgIC02NiwgIC02NSwgIC02NCwgIC02MywgIC02MiwgIC02MSwgIC02MCwgIC01OSwgIC01OCwgIC01NywgIC01NiwgIC01NSwgIC01NCwKKyAgICAgICAgICAgLTUzLCAgLTUyLCAgLTUxLCAgLTUwLCAgLTQ5LCAgLTQ4LCAgLTQ3LCAgLTQ2LCAgLTQ1LCAgLTQ0LCAgLTQzLCAgLTQyLCAgLTQxLCAgLTQwLCAgLTM5LAorICAgICAgICAgICAtMzgsICAtMzcsICAtMzYsICAtMzUsICAtMzQsICAtMzMsICAtMzIsICAtMzEsICAtMzAsICAtMjksICAtMjgsICAtMjcsICAtMjYsICAtMjUsICAtMjQsCisgICAgICAgICAgIC0yMywgIC0yMiwgIC0yMSwgIC0yMCwgIC0xOSwgIC0xOCwgIC0xNywgIC0xNiwgIC0xNSwgIC0xNCwgIC0xMywgIC0xMiwgIC0xMSwgIC0xMCwgIC05LAorICAgICAgICAgICAtOCwgICAtNywgICAtNiwgICAtNSwgICAtNCwgICAtMywgICAtMiwgICAtMSwgICAwLCAgICAxLCAgICAyLCAgICAzLCAgICA0LCAgICA1LCAgICA2LAorICAgICAgICAgICA3LCAgICA4LCAgICA5LCAgICAxMCwgICAxMSwgICAxMiwgICAxMywgICAxNCwgICAxNSwgICAxNiwgICAxNywgICAxOCwgICAxOSwgICAyMCwgICAyMSwKKyAgICAgICAgICAgMjIsICAgMjMsICAgMjQsICAgMjUsICAgMjYsICAgMjcsICAgMjgsICAgMjksICAgMzAsICAgMzEsICAgMzIsICAgMzMsICAgMzQsICAgMzUsICAgMzYsCisgICAgICAgICAgIDM3LCAgIDM4LCAgIDM5LCAgIDQwLCAgIDQxLCAgIDQyLCAgIDQzLCAgIDQ0LCAgIDQ1LCAgIDQ2LCAgIDQ3LCAgIDQ4LCAgIDQ5LCAgIDUwLCAgIDUxLAorICAgICAgICAgICA1MiwgICA1MywgICA1NCwgICA1NSwgICA1NiwgICA1NywgICA1OCwgICA1OSwgICA2MCwgICA2MSwgICA2MiwgICA2MywgICA2NCwgICA2NSwgICA2NiwKKyAgICAgICAgICAgNjcsICAgNjgsICAgNjksICAgNzAsICAgNzEsICAgNzIsICAgNzMsICAgNzQsICAgNzUsICAgNzYsICAgNzcsICAgNzgsICAgNzksICAgODAsICAgODEsCisgICAgICAgICAgIDgyLCAgIDgzLCAgIDg0LCAgIDg1LCAgIDg2LCAgIDg3LCAgIDg4LCAgIDg5LCAgIDkwLCAgIDkxLCAgIDkyLCAgIDkzLCAgIDk0LCAgIDk1LCAgIDk2LAorICAgICAgICAgICA5NywgICA5OCwgICA5OSwgICAxMDAsICAxMDEsICAxMDIsICAxMDMsICAxMDQsICAxMDUsICAxMDYsICAxMDcsICAxMDgsICAxMDksICAxMTAsICAxMTEsCisgICAgICAgICAgIDExMiwgIDExMywgIDExNCwgIDExNSwgIDExNiwgIDExNywgIDExOCwgIDExOSwgIDEyMCwgIDEyMSwgIDEyMiwgIDEyMywgIDEyNCwgIDEyNSwgIDEyNiwKKyAgICAgICAgICAgMTI3fTsKKworICAgIHN0ci5yZXNpemUoc2l6KTsKKyAgICBjaGFyICpwdHIgPSAmc3RyWzBdOworICAgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IDA7CisgICAgZm9yIChzdHJpbmc6OnNpemVfdHlwZSBpID0gMDsgaSA8IHNpejsgKytpKQorICAgIHsKKyAgICAgICAgaWYgKHBvcyA9PSAyNTUpIHsgcG9zID0gMDsgfSBlbHNlIHsgKytwb3M7IH0KKyAgICAgICAgKnB0cisrID0gYmluX2RhdGFbcG9zXTsKKyAgICB9Cit9CisKK2ludCBiaW5hcnlfdGVzdChUaHJpZnRUZXN0Q2xpZW50JiB0ZXN0Q2xpZW50LCBzdHJpbmc6OnNpemVfdHlwZSBzaXopCit7CisgICAgc3RyaW5nIGJpbl9yZXF1ZXN0OworICAgIHN0cmluZyBiaW5fcmVzdWx0OworCisgICAgY291dCA8PCAidGVzdEJpbmFyeShzaXogPSAiIDw8IHNpeiA8PCAiKSIgPDwgZW5kbDsKKyAgICBiaW5hcnlfZmlsbChiaW5fcmVxdWVzdCwgc2l6KTsKKyAgICB0cnkgeworICAgICAgICB0ZXN0Q2xpZW50LnRlc3RCaW5hcnkoYmluX3Jlc3VsdCwgYmluX3JlcXVlc3QpOworCisgICAgICAgIGlmIChiaW5fcmVxdWVzdC5zaXplKCkgIT0gYmluX3Jlc3VsdC5zaXplKCkpIHsKKyAgICAgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQ6IHJlcXVlc3Qgc2l6ZSAiIDw8IGJpbl9yZXF1ZXN0LnNpemUoKSA8PCAiOyByZXN1bHQgc2l6ZSAiIDw8IGJpbl9yZXN1bHQuc2l6ZSgpIDw8IGVuZGw7CisgICAgICAgICAgICByZXR1cm4gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoc3RyaW5nOjpzaXplX3R5cGUgaSA9IDA7IGkgPCBzaXo7ICsraSkgeworICAgICAgICAgICAgaWYgKGJpbl9yZXF1ZXN0LmF0KGkpICE9IGJpbl9yZXN1bHQuYXQoaSkpIHsKKyAgICAgICAgICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEOiBhdCBwb3NpdGlvbiAiIDw8IGkgPDwgIiByZXF1ZXN0W2ldIGlzIGgiIDw8IGhleCA8PCBiaW5fcmVxdWVzdC5hdChpKSA8PCAiIHJlc3VsdFtpXSBpcyBoIiA8PCBoZXggPDwgYmluX3Jlc3VsdC5hdChpKSA8PCBlbmRsOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJfQkFTRVRZUEVTOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgICAgdGhyb3c7CisgICAgfSBjYXRjaCAoZXhjZXB0aW9uJiBleCkgeworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgICAgcmV0dXJuIEVSUl9CQVNFVFlQRVM7CisgICAgfQorCisgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90ZXN0L2NwcC9zcmMvVGVzdFNlcnZlci5jcHAgYi90ZXN0L2NwcC9zcmMvVGVzdFNlcnZlci5jcHAKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA0YWZiZWY2Li42MjIyMDE3Ci0tLSBhL3Rlc3QvY3BwL3NyYy9UZXN0U2VydmVyLmNwcAorKysgYi90ZXN0L2NwcC9zcmMvVGVzdFNlcnZlci5jcHAKQEAgLTE3LDYxICsxNyw5MyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUwotI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb2Nlc3Nvci9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oPgogCi0jaW5jbHVkZSA8Y29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgotI2luY2x1ZGUgPHNlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KLSNpbmNsdWRlIDxhc3luYy9URXZodHRwU2VydmVyLmg+Ci0jaW5jbHVkZSA8YXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU1NMU29ja2V0Lmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RIdHRwU2VydmVyLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgorI2luY2x1ZGUgIlNlY29uZFNlcnZpY2UuaCIKICNpbmNsdWRlICJUaHJpZnRUZXN0LmgiCiAKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TSUdOQUxfSAorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCisKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxzdGRleGNlcHQ+CiAjaW5jbHVkZSA8c3N0cmVhbT4KIAorI2luY2x1ZGUgPGJvb3N0L2FsZ29yaXRobS9zdHJpbmcuaHBwPgogI2luY2x1ZGUgPGJvb3N0L3Byb2dyYW1fb3B0aW9ucy5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZmlsZXN5c3RlbS5ocHA+CiAKLSNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZiBfV0lOMzIKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgorI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgYm9vc3Q7CiAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6YXN5bmM7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmFzeW5jOwogCiB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OwogCisvLyB0byBoYW5kbGUgYSBjb250cm9sbGVkIHNodXRkb3duLCBzaWduYWwgaGFuZGxpbmcgaXMgbWFuZGF0b3J5CisjaWZkZWYgSEFWRV9TSUdOQUxfSAorYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yIGdNb25pdG9yOwordm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnbnVtKQoreworICBpZiAoc2lnbnVtID09IFNJR0lOVCkgeworICAgIGdNb25pdG9yLm5vdGlmeUFsbCgpOworICB9Cit9CisjZW5kaWYKKwogY2xhc3MgVGVzdEhhbmRsZXIgOiBwdWJsaWMgVGhyaWZ0VGVzdElmIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIFRlc3RIYW5kbGVyKCkge30KIAotICB2b2lkIHRlc3RWb2lkKCkgewotICAgIHByaW50ZigidGVzdFZvaWQoKVxuIik7Ci0gIH0KKyAgdm9pZCB0ZXN0Vm9pZCgpIHsgcHJpbnRmKCJ0ZXN0Vm9pZCgpXG4iKTsgfQogCi0gIHZvaWQgdGVzdFN0cmluZyhzdHJpbmcmIG91dCwgY29uc3Qgc3RyaW5nICZ0aGluZykgeworICB2b2lkIHRlc3RTdHJpbmcoc3RyaW5nJiBvdXQsIGNvbnN0IHN0cmluZyYgdGhpbmcpIHsKICAgICBwcmludGYoInRlc3RTdHJpbmcoXCIlc1wiKVxuIiwgdGhpbmcuY19zdHIoKSk7CiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAorICBib29sIHRlc3RCb29sKGNvbnN0IGJvb2wgdGhpbmcpIHsKKyAgICBwcmludGYoInRlc3RCb29sKCVzKVxuIiwgdGhpbmcgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKwogICBpbnQ4X3QgdGVzdEJ5dGUoY29uc3QgaW50OF90IHRoaW5nKSB7CiAgICAgcHJpbnRmKCJ0ZXN0Qnl0ZSglZClcbiIsIChpbnQpdGhpbmcpOwogICAgIHJldHVybiB0aGluZzsKQEAgLTgzLDcgKzExNSw3IEBACiAgIH0KIAogICBpbnQ2NF90IHRlc3RJNjQoY29uc3QgaW50NjRfdCB0aGluZykgewotICAgIHByaW50ZigidGVzdEk2NCglIlBSSWQ2NCIpXG4iLCB0aGluZyk7CisgICAgcHJpbnRmKCJ0ZXN0STY0KCUiIFBSSWQ2NCAiKVxuIiwgdGhpbmcpOwogICAgIHJldHVybiB0aGluZzsKICAgfQogCkBAIC05MiwxOCArMTI0LDM1IEBACiAgICAgcmV0dXJuIHRoaW5nOwogICB9CiAKLSAgdm9pZCB0ZXN0U3RydWN0KFh0cnVjdCYgb3V0LCBjb25zdCBYdHJ1Y3QgJnRoaW5nKSB7Ci0gICAgcHJpbnRmKCJ0ZXN0U3RydWN0KHtcIiVzXCIsICVkLCAlZCwgJSJQUklkNjQifSlcbiIsIHRoaW5nLnN0cmluZ190aGluZy5jX3N0cigpLCAoaW50KXRoaW5nLmJ5dGVfdGhpbmcsIHRoaW5nLmkzMl90aGluZywgdGhpbmcuaTY0X3RoaW5nKTsKKyAgdm9pZCB0ZXN0QmluYXJ5KHN0ZDo6c3RyaW5nJiBfcmV0dXJuLCBjb25zdCBzdGQ6OnN0cmluZyYgdGhpbmcpIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gaGV4c3RyOworICAgIGhleHN0ciA8PCBzdGQ6OmhleCA8PCB0aGluZzsKKyAgICBwcmludGYoInRlc3RCaW5hcnkoJWx1OiAlcylcbiIsIHNhZmVfbnVtZXJpY19jYXN0PHVuc2lnbmVkIGxvbmc+KHRoaW5nLnNpemUoKSksIGhleHN0ci5zdHIoKS5jX3N0cigpKTsKKyAgICBfcmV0dXJuID0gdGhpbmc7CisgIH0KKworICB2b2lkIHRlc3RTdHJ1Y3QoWHRydWN0JiBvdXQsIGNvbnN0IFh0cnVjdCYgdGhpbmcpIHsKKyAgICBwcmludGYoInRlc3RTdHJ1Y3Qoe1wiJXNcIiwgJWQsICVkLCAlIiBQUklkNjQgIn0pXG4iLAorICAgICAgICAgICB0aGluZy5zdHJpbmdfdGhpbmcuY19zdHIoKSwKKyAgICAgICAgICAgKGludCl0aGluZy5ieXRlX3RoaW5nLAorICAgICAgICAgICB0aGluZy5pMzJfdGhpbmcsCisgICAgICAgICAgIHRoaW5nLmk2NF90aGluZyk7CiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAogICB2b2lkIHRlc3ROZXN0KFh0cnVjdDImIG91dCwgY29uc3QgWHRydWN0MiYgbmVzdCkgewotICAgIGNvbnN0IFh0cnVjdCAmdGhpbmcgPSBuZXN0LnN0cnVjdF90aGluZzsKLSAgICBwcmludGYoInRlc3ROZXN0KHslZCwge1wiJXNcIiwgJWQsICVkLCAlIlBSSWQ2NCJ9LCAlZH0pXG4iLCAoaW50KW5lc3QuYnl0ZV90aGluZywgdGhpbmcuc3RyaW5nX3RoaW5nLmNfc3RyKCksIChpbnQpdGhpbmcuYnl0ZV90aGluZywgdGhpbmcuaTMyX3RoaW5nLCB0aGluZy5pNjRfdGhpbmcsIG5lc3QuaTMyX3RoaW5nKTsKKyAgICBjb25zdCBYdHJ1Y3QmIHRoaW5nID0gbmVzdC5zdHJ1Y3RfdGhpbmc7CisgICAgcHJpbnRmKCJ0ZXN0TmVzdCh7JWQsIHtcIiVzXCIsICVkLCAlZCwgJSIgUFJJZDY0ICJ9LCAlZH0pXG4iLAorICAgICAgICAgICAoaW50KW5lc3QuYnl0ZV90aGluZywKKyAgICAgICAgICAgdGhpbmcuc3RyaW5nX3RoaW5nLmNfc3RyKCksCisgICAgICAgICAgIChpbnQpdGhpbmcuYnl0ZV90aGluZywKKyAgICAgICAgICAgdGhpbmcuaTMyX3RoaW5nLAorICAgICAgICAgICB0aGluZy5pNjRfdGhpbmcsCisgICAgICAgICAgIG5lc3QuaTMyX3RoaW5nKTsKICAgICBvdXQgPSBuZXN0OwogICB9CiAKLSAgdm9pZCB0ZXN0TWFwKG1hcDxpbnQzMl90LCBpbnQzMl90PiAmb3V0LCBjb25zdCBtYXA8aW50MzJfdCwgaW50MzJfdD4gJnRoaW5nKSB7CisgIHZvaWQgdGVzdE1hcChtYXA8aW50MzJfdCwgaW50MzJfdD4mIG91dCwgY29uc3QgbWFwPGludDMyX3QsIGludDMyX3Q+JiB0aGluZykgewogICAgIHByaW50ZigidGVzdE1hcCh7Iik7CiAgICAgbWFwPGludDMyX3QsIGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CiAgICAgYm9vbCBmaXJzdCA9IHRydWU7CkBAIC0xMTksNyArMTY4LDggQEAKICAgICBvdXQgPSB0aGluZzsKICAgfQogCi0gIHZvaWQgdGVzdFN0cmluZ01hcChtYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiAmb3V0LCBjb25zdCBtYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiAmdGhpbmcpIHsKKyAgdm9pZCB0ZXN0U3RyaW5nTWFwKG1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBvdXQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgdGhpbmcpIHsKICAgICBwcmludGYoInRlc3RNYXAoeyIpOwogICAgIG1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CiAgICAgYm9vbCBmaXJzdCA9IHRydWU7CkBAIC0xMzUsNyArMTg1LDcgQEAKICAgICBvdXQgPSB0aGluZzsKICAgfQogCi0gIHZvaWQgdGVzdFNldChzZXQ8aW50MzJfdD4gJm91dCwgY29uc3Qgc2V0PGludDMyX3Q+ICZ0aGluZykgeworICB2b2lkIHRlc3RTZXQoc2V0PGludDMyX3Q+JiBvdXQsIGNvbnN0IHNldDxpbnQzMl90PiYgdGhpbmcpIHsKICAgICBwcmludGYoInRlc3RTZXQoeyIpOwogICAgIHNldDxpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOwogICAgIGJvb2wgZmlyc3QgPSB0cnVlOwpAQCAtMTUxLDcgKzIwMSw3IEBACiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAotICB2b2lkIHRlc3RMaXN0KHZlY3RvcjxpbnQzMl90PiAmb3V0LCBjb25zdCB2ZWN0b3I8aW50MzJfdD4gJnRoaW5nKSB7CisgIHZvaWQgdGVzdExpc3QodmVjdG9yPGludDMyX3Q+JiBvdXQsIGNvbnN0IHZlY3RvcjxpbnQzMl90PiYgdGhpbmcpIHsKICAgICBwcmludGYoInRlc3RMaXN0KHsiKTsKICAgICB2ZWN0b3I8aW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIGxfaXRlcjsKICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKQEAgLTE3Myw1NCArMjIzLDMzIEBACiAgIH0KIAogICBVc2VySWQgdGVzdFR5cGVkZWYoY29uc3QgVXNlcklkIHRoaW5nKSB7Ci0gICAgcHJpbnRmKCJ0ZXN0VHlwZWRlZiglIlBSSWQ2NCIpXG4iLCB0aGluZyk7CisgICAgcHJpbnRmKCJ0ZXN0VHlwZWRlZiglIiBQUklkNjQgIilcbiIsIHRoaW5nKTsKICAgICByZXR1cm4gdGhpbmc7CiAgIH0KIAotICB2b2lkIHRlc3RNYXBNYXAobWFwPGludDMyX3QsIG1hcDxpbnQzMl90LGludDMyX3Q+ID4gJm1hcG1hcCwgY29uc3QgaW50MzJfdCBoZWxsbykgeworICB2b2lkIHRlc3RNYXBNYXAobWFwPGludDMyX3QsIG1hcDxpbnQzMl90LCBpbnQzMl90PiA+JiBtYXBtYXAsIGNvbnN0IGludDMyX3QgaGVsbG8pIHsKICAgICBwcmludGYoInRlc3RNYXBNYXAoJWQpXG4iLCBoZWxsbyk7CiAKLSAgICBtYXA8aW50MzJfdCxpbnQzMl90PiBwb3M7Ci0gICAgbWFwPGludDMyX3QsaW50MzJfdD4gbmVnOworICAgIG1hcDxpbnQzMl90LCBpbnQzMl90PiBwb3M7CisgICAgbWFwPGludDMyX3QsIGludDMyX3Q+IG5lZzsKICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykgewotICAgICAgcG9zLmluc2VydChtYWtlX3BhaXIoaSxpKSk7Ci0gICAgICBuZWcuaW5zZXJ0KG1ha2VfcGFpcigtaSwtaSkpOworICAgICAgcG9zLmluc2VydChtYWtlX3BhaXIoaSwgaSkpOworICAgICAgbmVnLmluc2VydChtYWtlX3BhaXIoLWksIC1pKSk7CiAgICAgfQogCiAgICAgbWFwbWFwLmluc2VydChtYWtlX3BhaXIoNCwgcG9zKSk7CiAgICAgbWFwbWFwLmluc2VydChtYWtlX3BhaXIoLTQsIG5lZykpOwotCiAgIH0KIAotICB2b2lkIHRlc3RJbnNhbml0eShtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSxJbnNhbml0eT4gPiAmaW5zYW5lLCBjb25zdCBJbnNhbml0eSAmYXJndW1lbnQpIHsKLSAgICAodm9pZCkgYXJndW1lbnQ7CisgIHZvaWQgdGVzdEluc2FuaXR5KG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gPiYgaW5zYW5lLCBjb25zdCBJbnNhbml0eSYgYXJndW1lbnQpIHsKICAgICBwcmludGYoInRlc3RJbnNhbml0eSgpXG4iKTsKIAotICAgIFh0cnVjdCBoZWxsbzsKLSAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKLSAgICBoZWxsby5ieXRlX3RoaW5nID0gMjsKLSAgICBoZWxsby5pMzJfdGhpbmcgPSAyOwotICAgIGhlbGxvLmk2NF90aGluZyA9IDI7Ci0KLSAgICBYdHJ1Y3QgZ29vZGJ5ZTsKLSAgICBnb29kYnllLnN0cmluZ190aGluZyA9ICJHb29kYnllNCI7Ci0gICAgZ29vZGJ5ZS5ieXRlX3RoaW5nID0gNDsKLSAgICBnb29kYnllLmkzMl90aGluZyA9IDQ7Ci0gICAgZ29vZGJ5ZS5pNjRfdGhpbmcgPSA0OwotCi0gICAgSW5zYW5pdHkgY3Jhenk7Ci0gICAgY3JhenkudXNlck1hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OkVJR0hULCA4KSk7Ci0gICAgY3JhenkueHRydWN0cy5wdXNoX2JhY2soZ29vZGJ5ZSk7Ci0KICAgICBJbnNhbml0eSBsb29uZXk7Ci0gICAgY3JhenkudXNlck1hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OkZJVkUsIDUpKTsKLSAgICBjcmF6eS54dHJ1Y3RzLnB1c2hfYmFjayhoZWxsbyk7Ci0KICAgICBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+IGZpcnN0X21hcDsKICAgICBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+IHNlY29uZF9tYXA7CiAKLSAgICBmaXJzdF9tYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpUV08sIGNyYXp5KSk7Ci0gICAgZmlyc3RfbWFwLmluc2VydChtYWtlX3BhaXIoTnVtYmVyejo6VEhSRUUsIGNyYXp5KSk7CisgICAgZmlyc3RfbWFwLmluc2VydChtYWtlX3BhaXIoTnVtYmVyejo6VFdPLCBhcmd1bWVudCkpOworICAgIGZpcnN0X21hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OlRIUkVFLCBhcmd1bWVudCkpOwogCiAgICAgc2Vjb25kX21hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OlNJWCwgbG9vbmV5KSk7CiAKQEAgLTIyOSwxOSArMjU4LDE3IEBACiAKICAgICBwcmludGYoInJldHVybiIpOwogICAgIHByaW50ZigiID0geyIpOwotICAgIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6Ojp0eXBlLEluc2FuaXR5PiA+Ojpjb25zdF9pdGVyYXRvciBpX2l0ZXI7CisgICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+Ojpjb25zdF9pdGVyYXRvciBpX2l0ZXI7CiAgICAgZm9yIChpX2l0ZXIgPSBpbnNhbmUuYmVnaW4oKTsgaV9pdGVyICE9IGluc2FuZS5lbmQoKTsgKytpX2l0ZXIpIHsKLSAgICAgIHByaW50ZigiJSJQUklkNjQiID0+IHsiLCBpX2l0ZXItPmZpcnN0KTsKLSAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLEluc2FuaXR5Pjo6Y29uc3RfaXRlcmF0b3IgaTJfaXRlcjsKLSAgICAgIGZvciAoaTJfaXRlciA9IGlfaXRlci0+c2Vjb25kLmJlZ2luKCk7Ci0gICAgICAgICAgIGkyX2l0ZXIgIT0gaV9pdGVyLT5zZWNvbmQuZW5kKCk7Ci0gICAgICAgICAgICsraTJfaXRlcikgeworICAgICAgcHJpbnRmKCIlIiBQUklkNjQgIiA9PiB7IiwgaV9pdGVyLT5maXJzdCk7CisgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+Ojpjb25zdF9pdGVyYXRvciBpMl9pdGVyOworICAgICAgZm9yIChpMl9pdGVyID0gaV9pdGVyLT5zZWNvbmQuYmVnaW4oKTsgaTJfaXRlciAhPSBpX2l0ZXItPnNlY29uZC5lbmQoKTsgKytpMl9pdGVyKSB7CiAgICAgICAgIHByaW50ZigiJWQgPT4geyIsIGkyX2l0ZXItPmZpcnN0KTsKICAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIFVzZXJJZD4gdXNlck1hcCA9IGkyX2l0ZXItPnNlY29uZC51c2VyTWFwOwogICAgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgVXNlcklkPjo6Y29uc3RfaXRlcmF0b3IgdW07CiAgICAgICAgIHByaW50ZigieyIpOwogICAgICAgICBmb3IgKHVtID0gdXNlck1hcC5iZWdpbigpOyB1bSAhPSB1c2VyTWFwLmVuZCgpOyArK3VtKSB7Ci0gICAgICAgICAgcHJpbnRmKCIlZCA9PiAlIlBSSWQ2NCIsICIsIHVtLT5maXJzdCwgdW0tPnNlY29uZCk7CisgICAgICAgICAgcHJpbnRmKCIlZCA9PiAlIiBQUklkNjQgIiwgIiwgdW0tPmZpcnN0LCB1bS0+c2Vjb25kKTsKICAgICAgICAgfQogICAgICAgICBwcmludGYoIn0sICIpOwogCkBAIC0yNDksNyArMjc2LDExIEBACiAgICAgICAgIHZlY3RvcjxYdHJ1Y3Q+Ojpjb25zdF9pdGVyYXRvciB4OwogICAgICAgICBwcmludGYoInsiKTsKICAgICAgICAgZm9yICh4ID0geHRydWN0cy5iZWdpbigpOyB4ICE9IHh0cnVjdHMuZW5kKCk7ICsreCkgewotICAgICAgICAgIHByaW50Zigie1wiJXNcIiwgJWQsICVkLCAlIlBSSWQ2NCJ9LCAiLCB4LT5zdHJpbmdfdGhpbmcuY19zdHIoKSwgKGludCl4LT5ieXRlX3RoaW5nLCB4LT5pMzJfdGhpbmcsIHgtPmk2NF90aGluZyk7CisgICAgICAgICAgcHJpbnRmKCJ7XCIlc1wiLCAlZCwgJWQsICUiIFBSSWQ2NCAifSwgIiwKKyAgICAgICAgICAgICAgICAgeC0+c3RyaW5nX3RoaW5nLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIChpbnQpeC0+Ynl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgeC0+aTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICB4LT5pNjRfdGhpbmcpOwogICAgICAgICB9CiAgICAgICAgIHByaW50ZigifSIpOwogCkBAIC0yNTgsMTUgKzI4OSwxOSBAQAogICAgICAgcHJpbnRmKCJ9LCAiKTsKICAgICB9CiAgICAgcHJpbnRmKCJ9XG4iKTsKLQotCiAgIH0KIAotICB2b2lkIHRlc3RNdWx0aShYdHJ1Y3QgJmhlbGxvLCBjb25zdCBpbnQ4X3QgYXJnMCwgY29uc3QgaW50MzJfdCBhcmcxLCBjb25zdCBpbnQ2NF90IGFyZzIsIGNvbnN0IHN0ZDo6bWFwPGludDE2X3QsIHN0ZDo6c3RyaW5nPiAgJmFyZzMsIGNvbnN0IE51bWJlcno6OnR5cGUgYXJnNCwgY29uc3QgVXNlcklkIGFyZzUpIHsKLSAgICAodm9pZCkgYXJnMzsKLSAgICAodm9pZCkgYXJnNDsKLSAgICAodm9pZCkgYXJnNTsKLSAgICAKKyAgdm9pZCB0ZXN0TXVsdGkoWHRydWN0JiBoZWxsbywKKyAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90IGFyZzAsCisgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYXJnMSwKKyAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBhcmcyLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxpbnQxNl90LCBzdGQ6OnN0cmluZz4mIGFyZzMsCisgICAgICAgICAgICAgICAgIGNvbnN0IE51bWJlcno6OnR5cGUgYXJnNCwKKyAgICAgICAgICAgICAgICAgY29uc3QgVXNlcklkIGFyZzUpIHsKKyAgICAodm9pZClhcmczOworICAgICh2b2lkKWFyZzQ7CisgICAgKHZvaWQpYXJnNTsKKwogICAgIHByaW50ZigidGVzdE11bHRpKClcbiIpOwogCiAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CkBAIC0yNzUsMTYgKzMxMCwxNCBAQAogICAgIGhlbGxvLmk2NF90aGluZyA9IChpbnQ2NF90KWFyZzI7CiAgIH0KIAotICB2b2lkIHRlc3RFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcgJmFyZykKLSAgICB0aHJvdyhYY2VwdGlvbiwgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24pCi0gIHsKKyAgdm9pZCB0ZXN0RXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmcpIHsKICAgICBwcmludGYoInRlc3RFeGNlcHRpb24oJXMpXG4iLCBhcmcuY19zdHIoKSk7CiAgICAgaWYgKGFyZy5jb21wYXJlKCJYY2VwdGlvbiIpID09IDApIHsKICAgICAgIFhjZXB0aW9uIGU7CiAgICAgICBlLmVycm9yQ29kZSA9IDEwMDE7CiAgICAgICBlLm1lc3NhZ2UgPSBhcmc7CiAgICAgICB0aHJvdyBlOwotICAgIH0gZWxzZSBpZiAoYXJnLmNvbXBhcmUoIkFwcGxpY2F0aW9uRXhjZXB0aW9uIikgPT0gMCkgeworICAgIH0gZWxzZSBpZiAoYXJnLmNvbXBhcmUoIlRFeGNlcHRpb24iKSA9PSAwKSB7CiAgICAgICBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiBlOwogICAgICAgdGhyb3cgZTsKICAgICB9IGVsc2UgewpAQCAtMjk0LDcgKzMyNyw5IEBACiAgICAgfQogICB9CiAKLSAgdm9pZCB0ZXN0TXVsdGlFeGNlcHRpb24oWHRydWN0ICZyZXN1bHQsIGNvbnN0IHN0ZDo6c3RyaW5nICZhcmcwLCBjb25zdCBzdGQ6OnN0cmluZyAmYXJnMSkgdGhyb3coWGNlcHRpb24sIFhjZXB0aW9uMikgeworICB2b2lkIHRlc3RNdWx0aUV4Y2VwdGlvbihYdHJ1Y3QmIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFyZzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmcxKSB7CiAKICAgICBwcmludGYoInRlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpXG4iLCBhcmcwLmNfc3RyKCksIGFyZzEuY19zdHIoKSk7CiAKQEAgLTMxNCwzNSArMzQ5LDM1IEBACiAgICAgfQogICB9CiAKLSAgdm9pZCB0ZXN0T25ld2F5KGludCBzbGVlcEZvcikgewotICAgIHByaW50ZigidGVzdE9uZXdheSglZCk6IFNsZWVwaW5nLi4uXG4iLCBzbGVlcEZvcik7Ci0gICAgc2xlZXAoc2xlZXBGb3IpOwotICAgIHByaW50ZigidGVzdE9uZXdheSglZCk6IGRvbmUgc2xlZXBpbmchXG4iLCBzbGVlcEZvcik7CisgIHZvaWQgdGVzdE9uZXdheShjb25zdCBpbnQzMl90IGFOdW0pIHsKKyAgICBwcmludGYoInRlc3RPbmV3YXkoJWQpOiBjYWxsIHJlY2VpdmVkXG4iLCBhTnVtKTsKICAgfQogfTsKIAorY2xhc3MgU2Vjb25kSGFuZGxlciA6IHB1YmxpYyBTZWNvbmRTZXJ2aWNlSWYKK3sKKyAgcHVibGljOgorICAgIHZvaWQgc2Vjb25kdGVzdFN0cmluZyhzdGQ6OnN0cmluZyYgcmVzdWx0LCBjb25zdCBzdGQ6OnN0cmluZyYgdGhpbmcpCisgICAgeyByZXN1bHQgPSAidGVzdFN0cmluZyhcIiIgKyB0aGluZyArICJcIikiOyB9Cit9OwogCiBjbGFzcyBUZXN0UHJvY2Vzc29yRXZlbnRIYW5kbGVyIDogcHVibGljIFRQcm9jZXNzb3JFdmVudEhhbmRsZXIgewogICB2aXJ0dWFsIHZvaWQqIGdldENvbnRleHQoY29uc3QgY2hhciogZm5fbmFtZSwgdm9pZCogc2VydmVyQ29udGV4dCkgewotICAgICh2b2lkKSBzZXJ2ZXJDb250ZXh0OworICAgICh2b2lkKXNlcnZlckNvbnRleHQ7CiAgICAgcmV0dXJuIG5ldyBzdGQ6OnN0cmluZyhmbl9uYW1lKTsKICAgfQogICB2aXJ0dWFsIHZvaWQgZnJlZUNvbnRleHQodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7Ci0gICAgKHZvaWQpIGZuX25hbWU7CisgICAgKHZvaWQpZm5fbmFtZTsKICAgICBkZWxldGUgc3RhdGljX2Nhc3Q8c3RkOjpzdHJpbmcqPihjdHgpOwogICB9Ci0gIHZpcnR1YWwgdm9pZCBwcmVSZWFkKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgewotICAgIGNvbW11bmljYXRlKCJwcmVSZWFkIiwgY3R4LCBmbl9uYW1lKTsKLSAgfQorICB2aXJ0dWFsIHZvaWQgcHJlUmVhZCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsgY29tbXVuaWNhdGUoInByZVJlYWQiLCBjdHgsIGZuX25hbWUpOyB9CiAgIHZpcnR1YWwgdm9pZCBwb3N0UmVhZCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUsIHVpbnQzMl90IGJ5dGVzKSB7Ci0gICAgKHZvaWQpIGJ5dGVzOworICAgICh2b2lkKWJ5dGVzOwogICAgIGNvbW11bmljYXRlKCJwb3N0UmVhZCIsIGN0eCwgZm5fbmFtZSk7CiAgIH0KLSAgdmlydHVhbCB2b2lkIHByZVdyaXRlKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgewotICAgIGNvbW11bmljYXRlKCJwcmVXcml0ZSIsIGN0eCwgZm5fbmFtZSk7Ci0gIH0KKyAgdmlydHVhbCB2b2lkIHByZVdyaXRlKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgeyBjb21tdW5pY2F0ZSgicHJlV3JpdGUiLCBjdHgsIGZuX25hbWUpOyB9CiAgIHZpcnR1YWwgdm9pZCBwb3N0V3JpdGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lLCB1aW50MzJfdCBieXRlcykgewotICAgICh2b2lkKSBieXRlczsKKyAgICAodm9pZClieXRlczsKICAgICBjb21tdW5pY2F0ZSgicG9zdFdyaXRlIiwgY3R4LCBmbl9uYW1lKTsKICAgfQogICB2aXJ0dWFsIHZvaWQgYXN5bmNDb21wbGV0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKQEAgLTM1NywxNzUgKzM5MiwyMjAgQEAKICAgfQogfTsKIAotCiBjbGFzcyBUZXN0SGFuZGxlckFzeW5jIDogcHVibGljIFRocmlmdFRlc3RDb2JTdklmIHsKIHB1YmxpYzoKLSAgVGVzdEhhbmRsZXJBc3luYyhzaGFyZWRfcHRyPFRlc3RIYW5kbGVyPiYgaGFuZGxlcikgOiBfZGVsZWdhdGUoaGFuZGxlcikge30KKyAgVGVzdEhhbmRsZXJBc3luYyhzdGQ6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+JiBoYW5kbGVyKSA6IF9kZWxlZ2F0ZShoYW5kbGVyKSB7fQogICB2aXJ0dWFsIH5UZXN0SGFuZGxlckFzeW5jKCkge30KIAotICB2aXJ0dWFsIHZvaWQgdGVzdFZvaWQoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoKT4gY29iKSB7CisgIHZpcnR1YWwgdm9pZCB0ZXN0Vm9pZChzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY29iKSB7CiAgICAgX2RlbGVnYXRlLT50ZXN0Vm9pZCgpOwogICAgIGNvYigpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RTdHJpbmcoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzdHJpbmcgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0aGluZykgeworICB2aXJ0dWFsIHZvaWQgdGVzdFN0cmluZyhzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzdHJpbmcgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0aGluZykgewogICAgIHN0ZDo6c3RyaW5nIHJlczsKICAgICBfZGVsZWdhdGUtPnRlc3RTdHJpbmcocmVzLCB0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdEJ5dGUoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoaW50OF90IGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBpbnQ4X3QgdGhpbmcpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RCb29sKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBib29sIHRoaW5nKSB7CisgICAgYm9vbCByZXMgPSBfZGVsZWdhdGUtPnRlc3RCb29sKHRoaW5nKTsKKyAgICBjb2IocmVzKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCB0ZXN0Qnl0ZShzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50OF90IGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBpbnQ4X3QgdGhpbmcpIHsKICAgICBpbnQ4X3QgcmVzID0gX2RlbGVnYXRlLT50ZXN0Qnl0ZSh0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdEkzMihzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChpbnQzMl90IGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBpbnQzMl90IHRoaW5nKSB7CisgIHZpcnR1YWwgdm9pZCB0ZXN0STMyKHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQzMl90IGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBpbnQzMl90IHRoaW5nKSB7CiAgICAgaW50MzJfdCByZXMgPSBfZGVsZWdhdGUtPnRlc3RJMzIodGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RJNjQoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoaW50NjRfdCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgaW50NjRfdCB0aGluZykgeworICB2aXJ0dWFsIHZvaWQgdGVzdEk2NChzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50NjRfdCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgaW50NjRfdCB0aGluZykgewogICAgIGludDY0X3QgcmVzID0gX2RlbGVnYXRlLT50ZXN0STY0KHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0RG91YmxlKHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKGRvdWJsZSBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgZG91YmxlIHRoaW5nKSB7CisgIHZpcnR1YWwgdm9pZCB0ZXN0RG91YmxlKHN0ZDo6ZnVuY3Rpb248dm9pZChkb3VibGUgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGRvdWJsZSB0aGluZykgewogICAgIGRvdWJsZSByZXMgPSBfZGVsZWdhdGUtPnRlc3REb3VibGUodGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RTdHJ1Y3Qoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoWHRydWN0IGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBYdHJ1Y3QmIHRoaW5nKSB7CisgIHZpcnR1YWwgdm9pZCB0ZXN0QmluYXJ5KHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZyBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRoaW5nKSB7CisgICAgc3RkOjpzdHJpbmcgcmVzOworICAgIF9kZWxlZ2F0ZS0+dGVzdEJpbmFyeShyZXMsIHRoaW5nKTsKKyAgICBjb2IocmVzKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCB0ZXN0U3RydWN0KHN0ZDo6ZnVuY3Rpb248dm9pZChYdHJ1Y3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IFh0cnVjdCYgdGhpbmcpIHsKICAgICBYdHJ1Y3QgcmVzOwogICAgIF9kZWxlZ2F0ZS0+dGVzdFN0cnVjdChyZXMsIHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0TmVzdChzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChYdHJ1Y3QyIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBYdHJ1Y3QyJiB0aGluZykgeworICB2aXJ0dWFsIHZvaWQgdGVzdE5lc3Qoc3RkOjpmdW5jdGlvbjx2b2lkKFh0cnVjdDIgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IFh0cnVjdDImIHRoaW5nKSB7CiAgICAgWHRydWN0MiByZXM7CiAgICAgX2RlbGVnYXRlLT50ZXN0TmVzdChyZXMsIHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0TWFwKHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+ICBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3Qgc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4gJiB0aGluZykgeworICB2aXJ0dWFsIHZvaWQgdGVzdE1hcChzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+JiB0aGluZykgewogICAgIHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+IHJlczsKICAgICBfZGVsZWdhdGUtPnRlc3RNYXAocmVzLCB0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdFN0cmluZ01hcChzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ICBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiAmIHRoaW5nKSB7CisgIHZpcnR1YWwgdm9pZCB0ZXN0U3RyaW5nTWFwKAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiB0aGluZykgewogICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gcmVzOwogICAgIF9kZWxlZ2F0ZS0+dGVzdFN0cmluZ01hcChyZXMsIHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0U2V0KHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2V0PGludDMyX3Q+ICBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3Qgc3RkOjpzZXQ8aW50MzJfdD4gJiB0aGluZykgeworICB2aXJ0dWFsIHZvaWQgdGVzdFNldChzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzZXQ8aW50MzJfdD4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PGludDMyX3Q+JiB0aGluZykgewogICAgIHN0ZDo6c2V0PGludDMyX3Q+IHJlczsKICAgICBfZGVsZWdhdGUtPnRlc3RTZXQocmVzLCB0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdExpc3Qoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoc3RkOjp2ZWN0b3I8aW50MzJfdD4gIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiAmIHRoaW5nKSB7CisgIHZpcnR1YWwgdm9pZCB0ZXN0TGlzdChzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjp2ZWN0b3I8aW50MzJfdD4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgdGhpbmcpIHsKICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiByZXM7CiAgICAgX2RlbGVnYXRlLT50ZXN0TGlzdChyZXMsIHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0RW51bShzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChOdW1iZXJ6Ojp0eXBlIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBOdW1iZXJ6Ojp0eXBlIHRoaW5nKSB7CisgIHZpcnR1YWwgdm9pZCB0ZXN0RW51bShzdGQ6OmZ1bmN0aW9uPHZvaWQoTnVtYmVyejo6dHlwZSBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE51bWJlcno6OnR5cGUgdGhpbmcpIHsKICAgICBOdW1iZXJ6Ojp0eXBlIHJlcyA9IF9kZWxlZ2F0ZS0+dGVzdEVudW0odGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RUeXBlZGVmKHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKFVzZXJJZCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgVXNlcklkIHRoaW5nKSB7CisgIHZpcnR1YWwgdm9pZCB0ZXN0VHlwZWRlZihzdGQ6OmZ1bmN0aW9uPHZvaWQoVXNlcklkIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBVc2VySWQgdGhpbmcpIHsKICAgICBVc2VySWQgcmVzID0gX2RlbGVnYXRlLT50ZXN0VHlwZWRlZih0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdE1hcE1hcChzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChzdGQ6Om1hcDxpbnQzMl90LCBzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiA+ICBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgaW50MzJfdCBoZWxsbykgeworICB2aXJ0dWFsIHZvaWQgdGVzdE1hcE1hcCgKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Om1hcDxpbnQzMl90LCBzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiA+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgY29uc3QgaW50MzJfdCBoZWxsbykgewogICAgIHN0ZDo6bWFwPGludDMyX3QsIHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+ID4gcmVzOwogICAgIF9kZWxlZ2F0ZS0+dGVzdE1hcE1hcChyZXMsIGhlbGxvKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0SW5zYW5pdHkoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoc3RkOjptYXA8VXNlcklkLCBzdGQ6Om1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gPiAgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IEluc2FuaXR5JiBhcmd1bWVudCkgewotICAgIHN0ZDo6bWFwPFVzZXJJZCwgc3RkOjptYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID4gcmVzOyAKKyAgdmlydHVhbCB2b2lkIHRlc3RJbnNhbml0eSgKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Om1hcDxVc2VySWQsIHN0ZDo6bWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgY29uc3QgSW5zYW5pdHkmIGFyZ3VtZW50KSB7CisgICAgc3RkOjptYXA8VXNlcklkLCBzdGQ6Om1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gPiByZXM7CiAgICAgX2RlbGVnYXRlLT50ZXN0SW5zYW5pdHkocmVzLCBhcmd1bWVudCk7CiAgICAgY29iKHJlcyk7Ci0gfQorICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RNdWx0aShzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChYdHJ1Y3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGludDhfdCBhcmcwLCBjb25zdCBpbnQzMl90IGFyZzEsIGNvbnN0IGludDY0X3QgYXJnMiwgY29uc3Qgc3RkOjptYXA8aW50MTZfdCwgc3RkOjpzdHJpbmc+ICYgYXJnMywgY29uc3QgTnVtYmVyejo6dHlwZSBhcmc0LCBjb25zdCBVc2VySWQgYXJnNSkgeworICB2aXJ0dWFsIHZvaWQgdGVzdE11bHRpKHN0ZDo6ZnVuY3Rpb248dm9pZChYdHJ1Y3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90IGFyZzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxpbnQxNl90LCBzdGQ6OnN0cmluZz4mIGFyZzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTnVtYmVyejo6dHlwZSBhcmc0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVzZXJJZCBhcmc1KSB7CiAgICAgWHRydWN0IHJlczsKICAgICBfZGVsZWdhdGUtPnRlc3RNdWx0aShyZXMsIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RFeGNlcHRpb24oc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoKT4gY29iLCBzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZCg6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KT4gZXhuX2NvYiwgY29uc3Qgc3RkOjpzdHJpbmcmIGFyZykgeworICB2aXJ0dWFsIHZvaWQgdGVzdEV4Y2VwdGlvbigKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk+IGV4bl9jb2IsCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXJnKSB7CiAgICAgdHJ5IHsKICAgICAgIF9kZWxlZ2F0ZS0+dGVzdEV4Y2VwdGlvbihhcmcpOwotICAgIH0gY2F0Y2goY29uc3QgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24mIGUpIHsKKyAgICB9IGNhdGNoIChjb25zdCBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiYgZSkgewogICAgICAgZXhuX2NvYihhcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb246OmRlbGF5RXhjZXB0aW9uKGUpKTsKICAgICAgIHJldHVybjsKICAgICB9CiAgICAgY29iKCk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdE11bHRpRXhjZXB0aW9uKHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKFh0cnVjdCBjb25zdCYgX3JldHVybik+IGNvYiwgc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk+IGV4bl9jb2IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmcwLCBjb25zdCBzdGQ6OnN0cmluZyYgYXJnMSkgeworICB2aXJ0dWFsIHZvaWQgdGVzdE11bHRpRXhjZXB0aW9uKAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKFh0cnVjdCBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCg6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KT4gZXhuX2NvYiwKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmcwLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFyZzEpIHsKICAgICBYdHJ1Y3QgcmVzOwogICAgIHRyeSB7CiAgICAgICBfZGVsZWdhdGUtPnRlc3RNdWx0aUV4Y2VwdGlvbihyZXMsIGFyZzAsIGFyZzEpOwotICAgIH0gY2F0Y2goY29uc3QgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24mIGUpIHsKKyAgICB9IGNhdGNoIChjb25zdCBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiYgZSkgewogICAgICAgZXhuX2NvYihhcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb246OmRlbGF5RXhjZXB0aW9uKGUpKTsKICAgICAgIHJldHVybjsKICAgICB9CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdE9uZXdheShzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsIGNvbnN0IGludDMyX3Qgc2Vjb25kc1RvU2xlZXApIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RPbmV3YXkoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwgY29uc3QgaW50MzJfdCBzZWNvbmRzVG9TbGVlcCkgewogICAgIF9kZWxlZ2F0ZS0+dGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcCk7CiAgICAgY29iKCk7CiAgIH0KIAogcHJvdGVjdGVkOgotICBzaGFyZWRfcHRyPFRlc3RIYW5kbGVyPiBfZGVsZWdhdGU7CisgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0SGFuZGxlcj4gX2RlbGVnYXRlOwogfTsKIAorbmFtZXNwYWNlIHBvID0gYm9vc3Q6OnByb2dyYW1fb3B0aW9uczsKIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKworICBzdHJpbmcgdGVzdERpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpzeXN0ZW1fY29tcGxldGUoYXJndlswXSkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkuc3RyaW5nKCk7CisgIHN0cmluZyBjZXJ0UGF0aCA9IHRlc3REaXIgKyAiL2tleXMvc2VydmVyLmNydCI7CisgIHN0cmluZyBrZXlQYXRoID0gdGVzdERpciArICIva2V5cy9zZXJ2ZXIua2V5IjsKKworI2lmIF9XSU4zMgorICB0cmFuc3BvcnQ6OlRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUoKTsKKyNlbmRpZgogICBpbnQgcG9ydCA9IDkwOTA7CiAgIGJvb2wgc3NsID0gZmFsc2U7CisgIGJvb2wgemxpYiA9IGZhbHNlOwogICBzdHJpbmcgdHJhbnNwb3J0X3R5cGUgPSAiYnVmZmVyZWQiOwogICBzdHJpbmcgcHJvdG9jb2xfdHlwZSA9ICJiaW5hcnkiOwogICBzdHJpbmcgc2VydmVyX3R5cGUgPSAic2ltcGxlIjsKICAgc3RyaW5nIGRvbWFpbl9zb2NrZXQgPSAiIjsKKyAgYm9vbCBhYnN0cmFjdF9uYW1lc3BhY2UgPSBmYWxzZTsKICAgc2l6ZV90IHdvcmtlcnMgPSA0OworICBpbnQgc3RyaW5nX2xpbWl0ID0gMDsKKyAgaW50IGNvbnRhaW5lcl9saW1pdCA9IDA7CiAKLSAKLSAgcHJvZ3JhbV9vcHRpb25zOjpvcHRpb25zX2Rlc2NyaXB0aW9uIGRlc2MoIkFsbG93ZWQgb3B0aW9ucyIpOworICBwbzo6b3B0aW9uc19kZXNjcmlwdGlvbiBkZXNjKCJBbGxvd2VkIG9wdGlvbnMiKTsKICAgZGVzYy5hZGRfb3B0aW9ucygpCi0gICAgICAoImhlbHAsaCIsICJwcm9kdWNlIGhlbHAgbWVzc2FnZSIpCi0gICAgICAoInBvcnQiLCBwcm9ncmFtX29wdGlvbnM6OnZhbHVlPGludD4oJnBvcnQpLT5kZWZhdWx0X3ZhbHVlKHBvcnQpLCAiUG9ydCBudW1iZXIgdG8gbGlzdGVuIikKLQkgICgiZG9tYWluLXNvY2tldCIsIHByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmZG9tYWluX3NvY2tldCktPmRlZmF1bHRfdmFsdWUoZG9tYWluX3NvY2tldCksCi0JICAgICJVbml4IERvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCkiKQotICAgICAgKCJzZXJ2ZXItdHlwZSIsIHByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmc2VydmVyX3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHNlcnZlcl90eXBlKSwKLSAgICAgICAgInR5cGUgb2Ygc2VydmVyLCBcInNpbXBsZVwiLCBcInRocmVhZC1wb29sXCIsIFwidGhyZWFkZWRcIiwgb3IgXCJub25ibG9ja2luZ1wiIikKLSAgICAgICgidHJhbnNwb3J0IiwgcHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZ0cmFuc3BvcnRfdHlwZSktPmRlZmF1bHRfdmFsdWUodHJhbnNwb3J0X3R5cGUpLAotICAgICAgICAidHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwIikKLSAgICAgICgicHJvdG9jb2wiLCBwcm9ncmFtX29wdGlvbnM6OnZhbHVlPHN0cmluZz4oJnByb3RvY29sX3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHByb3RvY29sX3R5cGUpLAotICAgICAgICAicHJvdG9jb2w6IGJpbmFyeSwganNvbiIpCi0JICAoInNzbCIsICJFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTCIpCi0JICAoInByb2Nlc3Nvci1ldmVudHMiLCAicHJvY2Vzc29yLWV2ZW50cyIpCi0gICAgICAoIndvcmtlcnMsbiIsIHByb2dyYW1fb3B0aW9uczo6dmFsdWU8c2l6ZV90Pigmd29ya2VycyktPmRlZmF1bHRfdmFsdWUod29ya2VycyksCi0gICAgICAgICJOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuIE9ubHkgdmFsaWQgZm9yIHRocmVhZC1wb29sIHNlcnZlciB0eXBlIikKLSAgOworICAgICgiaGVscCxoIiwgInByb2R1Y2UgaGVscCBtZXNzYWdlIikKKyAgICAoInBvcnQiLCBwbzo6dmFsdWU8aW50PigmcG9ydCktPmRlZmF1bHRfdmFsdWUocG9ydCksICJQb3J0IG51bWJlciB0byBsaXN0ZW4iKQorICAgICgiZG9tYWluLXNvY2tldCIsIHBvOjp2YWx1ZTxzdHJpbmc+KCZkb21haW5fc29ja2V0KSAtPmRlZmF1bHRfdmFsdWUoZG9tYWluX3NvY2tldCksICJVbml4IERvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCkiKQorICAgICgiYWJzdHJhY3QtbmFtZXNwYWNlIiwgIkNyZWF0ZSB0aGUgZG9tYWluIHNvY2tldCBpbiB0aGUgQWJzdHJhY3QgTmFtZXNwYWNlIChubyBjb25uZWN0aW9uIHdpdGggZmlsZXN5c3RlbSBwYXRobmFtZXMpIikKKyAgICAoInNlcnZlci10eXBlIiwgcG86OnZhbHVlPHN0cmluZz4oJnNlcnZlcl90eXBlKS0+ZGVmYXVsdF92YWx1ZShzZXJ2ZXJfdHlwZSksICJ0eXBlIG9mIHNlcnZlciwgXCJzaW1wbGVcIiwgXCJ0aHJlYWQtcG9vbFwiLCBcInRocmVhZGVkXCIsIG9yIFwibm9uYmxvY2tpbmdcIiIpCisgICAgKCJ0cmFuc3BvcnQiLCBwbzo6dmFsdWU8c3RyaW5nPigmdHJhbnNwb3J0X3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHRyYW5zcG9ydF90eXBlKSwgInRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCwgemxpYiIpCisgICAgKCJwcm90b2NvbCIsIHBvOjp2YWx1ZTxzdHJpbmc+KCZwcm90b2NvbF90eXBlKS0+ZGVmYXVsdF92YWx1ZShwcm90b2NvbF90eXBlKSwgInByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGhlYWRlciwganNvbiwgbXVsdGksIG11bHRpYywgbXVsdGloLCBtdWx0aWoiKQorICAgICgic3NsIiwgIkVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMIikKKyAgICAoInpsaWIiLCAiV3JhcHBlZCBUcmFuc3BvcnQgdXNpbmcgWmxpYiIpCisgICAgKCJwcm9jZXNzb3ItZXZlbnRzIiwgInByb2Nlc3Nvci1ldmVudHMiKQorICAgICgid29ya2VycyxuIiwgcG86OnZhbHVlPHNpemVfdD4oJndvcmtlcnMpLT5kZWZhdWx0X3ZhbHVlKHdvcmtlcnMpLCAiTnVtYmVyIG9mIHRocmVhZCBwb29scyB3b3JrZXJzLiBPbmx5IHZhbGlkIGZvciB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZSIpCisgICAgKCJzdHJpbmctbGltaXQiLCBwbzo6dmFsdWU8aW50Pigmc3RyaW5nX2xpbWl0KSkKKyAgICAoImNvbnRhaW5lci1saW1pdCIsIHBvOjp2YWx1ZTxpbnQ+KCZjb250YWluZXJfbGltaXQpKTsKIAotICBwcm9ncmFtX29wdGlvbnM6OnZhcmlhYmxlc19tYXAgdm07Ci0gIHByb2dyYW1fb3B0aW9uczo6c3RvcmUocHJvZ3JhbV9vcHRpb25zOjpwYXJzZV9jb21tYW5kX2xpbmUoYXJnYywgYXJndiwgZGVzYyksIHZtKTsKLSAgcHJvZ3JhbV9vcHRpb25zOjpub3RpZnkodm0pOyAgICAKKyAgcG86OnZhcmlhYmxlc19tYXAgdm07CisgIHBvOjpzdG9yZShwbzo6cGFyc2VfY29tbWFuZF9saW5lKGFyZ2MsIGFyZ3YsIGRlc2MpLCB2bSk7CisgIHBvOjpub3RpZnkodm0pOwogCiAgIGlmICh2bS5jb3VudCgiaGVscCIpKSB7Ci0gICAgICBjb3V0IDw8IGRlc2MgPDwgIlxuIjsKLSAgICAgIHJldHVybiAxOworICAgIGNvdXQgPDwgZGVzYyA8PCAiXG4iOworICAgIHJldHVybiAxOwogICB9Ci0gIAorCiAgIHRyeSB7CiAgICAgaWYgKCFzZXJ2ZXJfdHlwZS5lbXB0eSgpKSB7CiAgICAgICBpZiAoc2VydmVyX3R5cGUgPT0gInNpbXBsZSIpIHsKQEAgLTUzMywyNCArNjEzLDMyIEBACiAgICAgICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlID09ICJ0aHJlYWRlZCIpIHsKICAgICAgIH0gZWxzZSBpZiAoc2VydmVyX3R5cGUgPT0gIm5vbmJsb2NraW5nIikgewogICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHNlcnZlciB0eXBlICIrc2VydmVyX3R5cGUpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoIXByb3RvY29sX3R5cGUuZW1wdHkoKSkgewotICAgICAgaWYgKHByb3RvY29sX3R5cGUgPT0gImJpbmFyeSIpIHsKLSAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAianNvbiIpIHsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBwcm90b2NvbCB0eXBlICIrcHJvdG9jb2xfdHlwZSk7CisgICAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gc2VydmVyIHR5cGUgIiArIHNlcnZlcl90eXBlKTsKICAgICAgIH0KICAgICB9CiAKLQlpZiAoIXRyYW5zcG9ydF90eXBlLmVtcHR5KCkpIHsKKyAgICBpZiAoIXByb3RvY29sX3R5cGUuZW1wdHkoKSkgeworICAgICAgaWYgKHByb3RvY29sX3R5cGUgPT0gImJpbmFyeSIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAiY29tcGFjdCIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAianNvbiIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAiaGVhZGVyIikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJtdWx0aSIpIHsgIC8vIG11bHRpcGxleGVkIGJpbmFyeQorICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJtdWx0aWMiKSB7IC8vIG11bHRpcGxleGVkIGNvbXBhY3QKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGloIikgeyAvLyBtdWx0aXBsZXhlZCBoZWFkZXIKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGlqIikgeyAvLyBtdWx0aXBsZXhlZCBqc29uCisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHByb3RvY29sIHR5cGUgIiArIHByb3RvY29sX3R5cGUpOworICAgICAgfQorICAgIH0KKworICAgIGlmICghdHJhbnNwb3J0X3R5cGUuZW1wdHkoKSkgewogICAgICAgaWYgKHRyYW5zcG9ydF90eXBlID09ICJidWZmZXJlZCIpIHsKICAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImZyYW1lZCIpIHsKICAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImh0dHAiKSB7CisgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJ6bGliIikgeworICAgICAgICAvLyBjcm9zc3Rlc3RlciB3aWxsIHBhc3MgemxpYiBhcyBhIGZsYWcgYW5kIGEgdHJhbnNwb3J0IHJpZ2h0IG5vdy4uLgogICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHRyYW5zcG9ydCB0eXBlICIrdHJhbnNwb3J0X3R5cGUpOworICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHRyYW5zcG9ydCB0eXBlICIgKyB0cmFuc3BvcnRfdHlwZSk7CiAgICAgICB9CiAgICAgfQogCkBAIC01NjIsMTIzICs2NTAsMTk2IEBACiAKICAgaWYgKHZtLmNvdW50KCJzc2wiKSkgewogICAgIHNzbCA9IHRydWU7Ci0gICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworICB9CisKKyAgaWYgKHZtLmNvdW50KCJ6bGliIikpIHsKKyAgICB6bGliID0gdHJ1ZTsKKyAgfQorCisjaWYgZGVmaW5lZChIQVZFX1NJR05BTF9IKSAmJiBkZWZpbmVkKFNJR1BJUEUpCisgIGlmIChzc2wpIHsKKyAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7IC8vIGZvciBPcGVuU1NMLCBvdGhlcndpc2Ugd2UgZW5kIGFicnVwdGx5CisgIH0KKyNlbmRpZgorCisgIGlmICh2bS5jb3VudCgiYWJzdHJhY3QtbmFtZXNwYWNlIikpIHsKKyAgICBhYnN0cmFjdF9uYW1lc3BhY2UgPSB0cnVlOwogICB9CiAKICAgLy8gRGlzcGF0Y2hlcgotICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeTsKLSAgaWYgKHByb3RvY29sX3R5cGUgPT0gImpzb24iKSB7Ci0gICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBqc29uUHJvdG9jb2xGYWN0b3J5KG5ldyBUSlNPTlByb3RvY29sRmFjdG9yeSgpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeTsKKyAgaWYgKHByb3RvY29sX3R5cGUgPT0gImpzb24iIHx8IHByb3RvY29sX3R5cGUgPT0gIm11bHRpaiIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4ganNvblByb3RvY29sRmFjdG9yeShuZXcgVEpTT05Qcm90b2NvbEZhY3RvcnkoKSk7CiAgICAgcHJvdG9jb2xGYWN0b3J5ID0ganNvblByb3RvY29sRmFjdG9yeTsKKyAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJjb21wYWN0IiB8fCBwcm90b2NvbF90eXBlID09ICJtdWx0aWMiKSB7CisgICAgVENvbXBhY3RQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPiAqY29tcGFjdFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeVQ8VEJ1ZmZlckJhc2U+KCk7CisgICAgY29tcGFjdFByb3RvY29sRmFjdG9yeS0+c2V0Q29udGFpbmVyU2l6ZUxpbWl0KGNvbnRhaW5lcl9saW1pdCk7CisgICAgY29tcGFjdFByb3RvY29sRmFjdG9yeS0+c2V0U3RyaW5nU2l6ZUxpbWl0KHN0cmluZ19saW1pdCk7CisgICAgcHJvdG9jb2xGYWN0b3J5LnJlc2V0KGNvbXBhY3RQcm90b2NvbEZhY3RvcnkpOworICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImhlYWRlciIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGloIikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBoZWFkZXJQcm90b2NvbEZhY3RvcnkobmV3IFRIZWFkZXJQcm90b2NvbEZhY3RvcnkoKSk7CisgICAgcHJvdG9jb2xGYWN0b3J5ID0gaGVhZGVyUHJvdG9jb2xGYWN0b3J5OwogICB9IGVsc2UgewotICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gYmluYXJ5UHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5VDxUQnVmZmVyQmFzZT4oKSk7Ci0gICAgcHJvdG9jb2xGYWN0b3J5ID0gYmluYXJ5UHJvdG9jb2xGYWN0b3J5OworICAgIFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPiogYmluYXJ5UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPigpOworICAgIGJpbmFyeVByb3RvY29sRmFjdG9yeS0+c2V0Q29udGFpbmVyU2l6ZUxpbWl0KGNvbnRhaW5lcl9saW1pdCk7CisgICAgYmluYXJ5UHJvdG9jb2xGYWN0b3J5LT5zZXRTdHJpbmdTaXplTGltaXQoc3RyaW5nX2xpbWl0KTsKKyAgICBwcm90b2NvbEZhY3RvcnkucmVzZXQoYmluYXJ5UHJvdG9jb2xGYWN0b3J5KTsKICAgfQogCi0gIC8vIFByb2Nlc3NvcgotICBzaGFyZWRfcHRyPFRlc3RIYW5kbGVyPiB0ZXN0SGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoKSk7Ci0gIHNoYXJlZF9wdHI8VGhyaWZ0VGVzdFByb2Nlc3Nvcj4gdGVzdFByb2Nlc3NvcihuZXcgVGhyaWZ0VGVzdFByb2Nlc3Nvcih0ZXN0SGFuZGxlcikpOwotICAKKyAgLy8gUHJvY2Vzc29ycworICBzdGQ6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+IHRlc3RIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHRlc3RQcm9jZXNzb3IobmV3IFRocmlmdFRlc3RQcm9jZXNzb3IodGVzdEhhbmRsZXIpKTsKKwogICBpZiAodm0uY291bnQoInByb2Nlc3Nvci1ldmVudHMiKSkgewotICAgIHRlc3RQcm9jZXNzb3ItPnNldEV2ZW50SGFuZGxlcihzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+KAotICAgICAgICAgIG5ldyBUZXN0UHJvY2Vzc29yRXZlbnRIYW5kbGVyKCkpKTsKKyAgICB0ZXN0UHJvY2Vzc29yLT5zZXRFdmVudEhhbmRsZXIoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPihuZXcgVGVzdFByb2Nlc3NvckV2ZW50SGFuZGxlcigpKSk7CiAgIH0KLSAgCisKICAgLy8gVHJhbnNwb3J0Ci0gIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHNzbFNvY2tldEZhY3Rvcnk7Ci0gIHNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc2VydmVyU29ja2V0OworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHNzbFNvY2tldEZhY3Rvcnk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzZXJ2ZXJTb2NrZXQ7CiAKICAgaWYgKHNzbCkgewotICAgIHNzbFNvY2tldEZhY3RvcnkgPSBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PihuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7Ci0gICAgc3NsU29ja2V0RmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKCIuL3NlcnZlci1jZXJ0aWZpY2F0ZS5wZW0iKTsKLSAgICBzc2xTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleSgiLi9zZXJ2ZXItcHJpdmF0ZS1rZXkucGVtIik7CisgICAgc3NsU29ja2V0RmFjdG9yeSA9IHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4obmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOworICAgIHNzbFNvY2tldEZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZShjZXJ0UGF0aC5jX3N0cigpKTsKKyAgICBzc2xTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShrZXlQYXRoLmNfc3RyKCkpOwogICAgIHNzbFNvY2tldEZhY3RvcnktPmNpcGhlcnMoIkFMTDohQURIOiFMT1c6IUVYUDohTUQ1OkBTVFJFTkdUSCIpOwotICAgIHNlcnZlclNvY2tldCA9IHNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4obmV3IFRTU0xTZXJ2ZXJTb2NrZXQocG9ydCwgc3NsU29ja2V0RmFjdG9yeSkpOworICAgIGlmIChzZXJ2ZXJfdHlwZSAhPSAibm9uYmxvY2tpbmciKSB7CisgICAgICBzZXJ2ZXJTb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4obmV3IFRTU0xTZXJ2ZXJTb2NrZXQocG9ydCwgc3NsU29ja2V0RmFjdG9yeSkpOworICAgIH0KICAgfSBlbHNlIHsKLQlpZiAoZG9tYWluX3NvY2tldCAhPSAiIikgewotCSAgdW5saW5rKGRvbWFpbl9zb2NrZXQuY19zdHIoKSk7Ci0JICBzZXJ2ZXJTb2NrZXQgPSBzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+KG5ldyBUU2VydmVyU29ja2V0KGRvbWFpbl9zb2NrZXQpKTsKLQkgIHBvcnQgPSAwOwotCX0KLQllbHNlIHsKLSAgICAgIHNlcnZlclNvY2tldCA9IHNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4obmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOwotCX0KKyAgICBpZiAoZG9tYWluX3NvY2tldCAhPSAiIikgeworICAgICAgaWYgKGFic3RyYWN0X25hbWVzcGFjZSkgeworICAgICAgICBzdGQ6OnN0cmluZyBhYnN0cmFjdF9zb2NrZXQoIlwwIiwgMSk7CisgICAgICAgIGFic3RyYWN0X3NvY2tldCArPSBkb21haW5fc29ja2V0OworICAgICAgICBzZXJ2ZXJTb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4obmV3IFRTZXJ2ZXJTb2NrZXQoYWJzdHJhY3Rfc29ja2V0KSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB1bmxpbmsoZG9tYWluX3NvY2tldC5jX3N0cigpKTsKKyAgICAgICAgc2VydmVyU29ja2V0ID0gc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+KG5ldyBUU2VydmVyU29ja2V0KGRvbWFpbl9zb2NrZXQpKTsKKyAgICAgIH0KKyAgICAgIHBvcnQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBzZXJ2ZXJTb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4obmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgIH0KICAgfQogCiAgIC8vIEZhY3RvcnkKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeTsKLSAgCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeTsKKwogICBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImh0dHAiICYmIHNlcnZlcl90eXBlICE9ICJub25ibG9ja2luZyIpIHsKLSAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBodHRwVHJhbnNwb3J0RmFjdG9yeShuZXcgVEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5KCkpOyAKLSAgICB0cmFuc3BvcnRGYWN0b3J5ID0gaHR0cFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgdHJhbnNwb3J0RmFjdG9yeSA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5PigpOwogICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJmcmFtZWQiKSB7Ci0gICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gZnJhbWVkVHJhbnNwb3J0RmFjdG9yeShuZXcgVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoKSk7IAotICAgIHRyYW5zcG9ydEZhY3RvcnkgPSBmcmFtZWRUcmFuc3BvcnRGYWN0b3J5OworICAgIHRyYW5zcG9ydEZhY3RvcnkgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5PigpOwogICB9IGVsc2UgewotICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsgCi0gICAgdHJhbnNwb3J0RmFjdG9yeSA9IGJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTsKKyAgICB0cmFuc3BvcnRGYWN0b3J5ID0gc3RkOjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5PigpOworICB9CisKKyAgaWYgKHpsaWIpIHsKKyAgICAvLyBobW0uLiBkb2Vzbid0IHNlZW0gdG8gYmUgYSB3YXkgdG8gbWFrZSBpdCB3cmFwIHRoZSBvdGhlcnMuLi4KKyAgICB0cmFuc3BvcnRGYWN0b3J5ID0gc3RkOjptYWtlX3NoYXJlZDxUWmxpYlRyYW5zcG9ydEZhY3Rvcnk+KCk7CiAgIH0KIAogICAvLyBTZXJ2ZXIgSW5mbwotICBjb3V0IDw8ICJTdGFydGluZyBcIiIgPDwgc2VydmVyX3R5cGUgPDwgIlwiIHNlcnZlciAoIgotICAgIDw8IHRyYW5zcG9ydF90eXBlIDw8ICIvIiA8PCBwcm90b2NvbF90eXBlIDw8ICIpIGxpc3RlbiBvbjogIiA8PCBkb21haW5fc29ja2V0OworICBjb3V0IDw8ICJTdGFydGluZyBcIiIgPDwgc2VydmVyX3R5cGUgPDwgIlwiIHNlcnZlciAoIiA8PCB0cmFuc3BvcnRfdHlwZSA8PCAiLyIgPDwgcHJvdG9jb2xfdHlwZQorICAgICAgIDw8ICIpIGxpc3RlbiBvbjogIjsKKyAgaWYgKGFic3RyYWN0X25hbWVzcGFjZSkgeworICAgIGNvdXQgPDwgJ0AnOworICB9CisgIGNvdXQgPDwgZG9tYWluX3NvY2tldDsKICAgaWYgKHBvcnQgIT0gMCkgewogICAgIGNvdXQgPDwgcG9ydDsKICAgfQogICBjb3V0IDw8IGVuZGw7CiAKKyAgLy8gTXVsdGlwbGV4ZWQgUHJvY2Vzc29yIGlmIG5lZWRlZAorICBpZiAoYm9vc3Q6OnN0YXJ0c193aXRoKHByb3RvY29sX3R5cGUsICJtdWx0aSIpKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFNlY29uZEhhbmRsZXI+IHNlY29uZEhhbmRsZXIobmV3IFNlY29uZEhhbmRsZXIoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFNlY29uZFNlcnZpY2VQcm9jZXNzb3I+IHNlY29uZFByb2Nlc3NvcihuZXcgU2Vjb25kU2VydmljZVByb2Nlc3NvcihzZWNvbmRIYW5kbGVyKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE11bHRpcGxleGVkUHJvY2Vzc29yPiBtdWx0aXBsZXhlZFByb2Nlc3NvcihuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCkpOworICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLT5yZWdpc3RlckRlZmF1bHQodGVzdFByb2Nlc3Nvcik7IC8vIG5vbi1tdWx0aSBjbGllbnRzIGdvIHRvIHRoZSBkZWZhdWx0IHByb2Nlc3NvciAobXVsdGk6YmluYXJ5LCBtdWx0aWM6Y29tcGFjdCwgLi4uKQorICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcigiVGhyaWZ0VGVzdCIsIHRlc3RQcm9jZXNzb3IpOworICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcigiU2Vjb25kU2VydmljZSIsIHNlY29uZFByb2Nlc3Nvcik7CisgICAgdGVzdFByb2Nlc3NvciA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VFByb2Nlc3Nvcj4obXVsdGlwbGV4ZWRQcm9jZXNzb3IpOworICB9CisKICAgLy8gU2VydmVyCisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyPiBzZXJ2ZXI7CisKICAgaWYgKHNlcnZlcl90eXBlID09ICJzaW1wbGUiKSB7Ci0gICAgVFNpbXBsZVNlcnZlciBzaW1wbGVTZXJ2ZXIodGVzdFByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJTb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnkpOwotCi0gICAgc2ltcGxlU2VydmVyLnNlcnZlKCk7Ci0KKyAgICBzZXJ2ZXIucmVzZXQobmV3IFRTaW1wbGVTZXJ2ZXIodGVzdFByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKTsKICAgfSBlbHNlIGlmIChzZXJ2ZXJfdHlwZSA9PSAidGhyZWFkLXBvb2wiKSB7CiAKLSAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPQotICAgICAgVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJzKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5CisgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKTsKIAotICAgIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5ID0KLSAgICAgIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KCkpOwotCisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlcnMpOwogICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7Ci0KICAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwogCi0gICAgVFRocmVhZFBvb2xTZXJ2ZXIgdGhyZWFkUG9vbFNlcnZlcih0ZXN0UHJvY2Vzc29yLAorICAgIHNlcnZlci5yZXNldChuZXcgVFRocmVhZFBvb2xTZXJ2ZXIodGVzdFByb2Nlc3NvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclNvY2tldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRNYW5hZ2VyKTsKLQotICAgIHRocmVhZFBvb2xTZXJ2ZXIuc2VydmUoKTsKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkTWFuYWdlcikpOwogICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlID09ICJ0aHJlYWRlZCIpIHsKLQotICAgIFRUaHJlYWRlZFNlcnZlciB0aHJlYWRlZFNlcnZlcih0ZXN0UHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJTb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSk7Ci0KLSAgICB0aHJlYWRlZFNlcnZlci5zZXJ2ZSgpOwotCisgICAgc2VydmVyLnJlc2V0KAorICAgICAgICBuZXcgVFRocmVhZGVkU2VydmVyKHRlc3RQcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSk7CiAgIH0gZWxzZSBpZiAoc2VydmVyX3R5cGUgPT0gIm5vbmJsb2NraW5nIikgewotICAgIGlmKHRyYW5zcG9ydF90eXBlID09ICJodHRwIikgewotICAgICAgc2hhcmVkX3B0cjxUZXN0SGFuZGxlckFzeW5jPiB0ZXN0SGFuZGxlckFzeW5jKG5ldyBUZXN0SGFuZGxlckFzeW5jKHRlc3RIYW5kbGVyKSk7Ci0gICAgICBzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gdGVzdFByb2Nlc3NvckFzeW5jKG5ldyBUaHJpZnRUZXN0QXN5bmNQcm9jZXNzb3IodGVzdEhhbmRsZXJBc3luYykpOwotICAgICAgc2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHRlc3RCdWZmZXJQcm9jZXNzb3IobmV3IFRBc3luY1Byb3RvY29sUHJvY2Vzc29yKHRlc3RQcm9jZXNzb3JBc3luYywgcHJvdG9jb2xGYWN0b3J5KSk7Ci0gICAgICAKKyAgICBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImh0dHAiKSB7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXJBc3luYz4gdGVzdEhhbmRsZXJBc3luYyhuZXcgVGVzdEhhbmRsZXJBc3luYyh0ZXN0SGFuZGxlcikpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gdGVzdFByb2Nlc3NvckFzeW5jKAorICAgICAgICAgIG5ldyBUaHJpZnRUZXN0QXN5bmNQcm9jZXNzb3IodGVzdEhhbmRsZXJBc3luYykpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gdGVzdEJ1ZmZlclByb2Nlc3NvcigKKyAgICAgICAgICBuZXcgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IodGVzdFByb2Nlc3NvckFzeW5jLCBwcm90b2NvbEZhY3RvcnkpKTsKKworICAgICAgLy8gbm90IGxvYWRpbmcgbm9uYmxvY2tpbmdTZXJ2ZXIgaW50byAic2VydmVyIiBiZWNhdXNlCisgICAgICAvLyBURXZodHRwU2VydmVyIGRvZXNuJ3QgaW5oZXJpdCBmcm9tIFRTZXJ2ZXIsIGFuZCBkb2Vzbid0CisgICAgICAvLyBwcm92aWRlIGEgc3RvcCBtZXRob2QuCiAgICAgICBURXZodHRwU2VydmVyIG5vbmJsb2NraW5nU2VydmVyKHRlc3RCdWZmZXJQcm9jZXNzb3IsIHBvcnQpOwogICAgICAgbm9uYmxvY2tpbmdTZXJ2ZXIuc2VydmUoKTsKLX0gZWxzZSB7Ci0gICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXIgbm9uYmxvY2tpbmdTZXJ2ZXIodGVzdFByb2Nlc3NvciwgcG9ydCk7Ci0gICAgICBub25ibG9ja2luZ1NlcnZlci5zZXJ2ZSgpOworICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImZyYW1lZCIpIHsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydD4gbmJTb2NrZXQ7CisgICAgICBuYlNvY2tldC5yZXNldCgKKyAgICAgICAgICBzc2wgPyBuZXcgdHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQocG9ydCwgc3NsU29ja2V0RmFjdG9yeSkKKyAgICAgICAgICAgICAgOiBuZXcgdHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgICAgc2VydmVyLnJlc2V0KG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIodGVzdFByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBuYlNvY2tldCkpOworICAgIH0gZWxzZSB7CisgICAgICBjZXJyIDw8ICJzZXJ2ZXItdHlwZSBub25ibG9ja2luZyByZXF1aXJlcyB0cmFuc3BvcnQgb2YgaHR0cCBvciBmcmFtZWQiIDw8IGVuZGw7CisgICAgICBleGl0KDEpOwogICAgIH0KICAgfQogCisgIGlmIChzZXJ2ZXIuZ2V0KCkgIT0gTlVMTCkgeworICAgIGlmIChwcm90b2NvbF90eXBlID09ICJoZWFkZXIiKSB7CisgICAgICAvLyBUZWxsIHRoZSBzZXJ2ZXIgdG8gdXNlIHRoZSBzYW1lIHByb3RvY29sIGZvciBpbnB1dCAvIG91dHB1dAorICAgICAgLy8gaWYgdXNpbmcgaGVhZGVyCisgICAgICBzZXJ2ZXItPnNldE91dHB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4oKSk7CisgICAgfQorICAgIAorICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5IGZhY3Rvcnk7CisgICAgZmFjdG9yeS5zZXREZXRhY2hlZChmYWxzZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UnVubmFibGU+IHNlcnZlclRocmVhZFJ1bm5lcihzZXJ2ZXIpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gdGhyZWFkCisgICAgICAgID0gZmFjdG9yeS5uZXdUaHJlYWQoc2VydmVyVGhyZWFkUnVubmVyKTsKKworI2lmZGVmIEhBVkVfU0lHTkFMX0gKKyAgICBzaWduYWwoU0lHSU5ULCBzaWduYWxfaGFuZGxlcik7CisjZW5kaWYKKworICAgIHRocmVhZC0+c3RhcnQoKTsKKyAgICBnTW9uaXRvci53YWl0Rm9yZXZlcigpOyAgICAgICAgIC8vIHdhaXQgZm9yIGEgc2h1dGRvd24gc2lnbmFsCisgICAgCisjaWZkZWYgSEFWRV9TSUdOQUxfSAorICAgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworI2VuZGlmCisKKyAgICBzZXJ2ZXItPnN0b3AoKTsKKyAgICB0aHJlYWQtPmpvaW4oKTsKKyAgICBzZXJ2ZXIucmVzZXQoKTsKKyAgfQorCiAgIGNvdXQgPDwgImRvbmUuIiA8PCBlbmRsOwogICByZXR1cm4gMDsKIH0KKwpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvc3JjL1RocmlmdFRlc3RfZXh0cmFzLmNwcCBiL3Rlc3QvY3BwL3NyYy9UaHJpZnRUZXN0X2V4dHJhcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY1NjA2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3BwL3NyYy9UaHJpZnRUZXN0X2V4dHJhcy5jcHAKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBFeHRyYSBmdW5jdGlvbnMgcmVxdWlyZWQgZm9yIFRocmlmdFRlc3RfdHlwZXMgdG8gd29yaworCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+CisjaW5jbHVkZSAiZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmgiCisKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRlc3QgeworCitib29sIEluc2FuaXR5OjpvcGVyYXRvcjwodGhyaWZ0Ojp0ZXN0OjpJbnNhbml0eSBjb25zdCYgb3RoZXIpIGNvbnN0IHsKKyAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nOworICByZXR1cm4gVGhyaWZ0RGVidWdTdHJpbmcoKnRoaXMpIDwgVGhyaWZ0RGVidWdTdHJpbmcob3RoZXIpOworfQorfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9jcm9zc3J1bm5lci9fX2luaXRfXy5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwYjgzYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvX19pbml0X18ucHkKQEAgLTAsMCArMSwyMyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gLnRlc3QgaW1wb3J0IHRlc3RfbmFtZSAgIyBub3FhCitmcm9tIC5jb2xsZWN0IGltcG9ydCBjb2xsZWN0X2Nyb3NzX3Rlc3RzLCBjb2xsZWN0X2ZlYXR1cmVfdGVzdHMgICMgbm9xYQorZnJvbSAucnVuIGltcG9ydCBUZXN0RGlzcGF0Y2hlciAgIyBub3FhCitmcm9tIC5yZXBvcnQgaW1wb3J0IGdlbmVyYXRlX2tub3duX2ZhaWx1cmVzLCBsb2FkX2tub3duX2ZhaWx1cmVzICAjIG5vcWEKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvY29sbGVjdC5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvY29sbGVjdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmQ4OTc4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcm9zc3J1bm5lci9jb2xsZWN0LnB5CkBAIC0wLDAgKzEsMTY0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IHBsYXRmb3JtCitpbXBvcnQgcmUKK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBwcm9kdWN0CisKK2Zyb20gLnV0aWwgaW1wb3J0IG1lcmdlX2RpY3QKK2Zyb20gLnRlc3QgaW1wb3J0IFRlc3RFbnRyeQorCisjIFRob3NlIGtleXMgYXJlIHBhc3NlZCB0byBleGVjdXRpb24gYXMgaXMuCisjIE5vdGUgdGhhdCB0aGVyZSBhcmUga2V5cyBvdGhlciB0aGFuIHRoZXNlLCBuYW1lbHk6CisjIGRlbGF5OiBBZnRlciBzZXJ2ZXIgaXMgc3RhcnRlZCwgY2xpZW50IHN0YXJ0IGlzIGRlbGF5ZWQgZm9yIHRoZSB2YWx1ZQorIyAoc2Vjb25kcykuCisjIHRpbWVvdXQ6IFRlc3QgdGltZW91dCBhZnRlciBjbGllbnQgaXMgc3RhcnRlZCAoc2Vjb25kcykuCisjIHBsYXRmb3JtczogU3VwcG9ydGVkIHBsYXRmb3Jtcy4gU2hvdWxkIG1hdGNoIHBsYXRmb3JtLnN5c3RlbSgpIHZhbHVlLgorIyBwcm90b2NvbHM6IGxpc3Qgb2Ygc3VwcG9ydGVkIHByb3RvY29scworIyB0cmFuc3BvcnRzOiBsaXN0IG9mIHN1cHBvcnRlZCB0cmFuc3BvcnRzCisjIHNvY2tldHM6IGxpc3Qgb2Ygc3VwcG9ydGVkIHNvY2tldHMKKyMKKyMgcHJvdG9jb2xzIGFuZCB0cmFuc3BvcnRzIGVudHJpZXMgY2FuIGJlIGNvbG9uIHNlcGFyYXRlZCAic3BlYzppbXBsIiBwYWlyCisjIChlLmcuIGJpbmFyeTphY2NlbCkgd2hlcmUgdGVzdCBpcyBydW4gZm9yIGFueSBtYXRjaGluZyAic3BlYyIgd2hpbGUgYWN0dWFsCisjIGFyZ3VtZW50IHBhc3NlZCB0byB0ZXN0IGV4ZWN1dGFibGUgaXMgImltcGwiLgorIyBPdGhlcndpc2UgInNwZWMiIGlzIGVxdWl2YWxlbnQgdG8gInNwZWM6c3BlYyIgcGFpci4KKyMgKGUuZy4gImJpbmFyeSIgaXMgZXF1aXZhbGVudCB0byAiYmluYXJ5OmJpbmFyeSIgaW4gdGVzdHMuanNvbikKKyMKK1ZBTElEX0pTT05fS0VZUyA9IFsKKyAgICAnbmFtZScsICAjIG5hbWUgb2YgdGhlIGxpYnJhcnksIHR5cGljYWxseSBhIGxhbmd1YWdlIG5hbWUKKyAgICAnd29ya2RpcicsICAjIHdvcmsgZGlyZWN0b3J5IHdoZXJlIGNvbW1hbmQgaXMgZXhlY3V0ZWQKKyAgICAnY29tbWFuZCcsICAjIHRlc3QgY29tbWFuZAorICAgICdleHRyYV9hcmdzJywgICMgYXJncyBhcHBlbmRlZCB0byBjb21tYW5kIGFmdGVyIG90aGVyIGFyZ3MgYXJlIGFwcGVuZGVkCisgICAgJ3JlbW90ZV9hcmdzJywgICMgYXJncyBhZGRlZCB0byB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgcHJvZ3JhbQorICAgICdqb2luX2FyZ3MnLCAgIyB3aGV0aGVyIGFyZ3Mgc2hvdWxkIGJlIHBhc3NlZCBhcyBzaW5nbGUgY29uY2F0ZW5hdGVkIHN0cmluZworICAgICdlbnYnLCAgIyBhZGRpdGlvbmFsIGVudmlyb25tZW50YWwgdmFyaWFibGUKK10KKworREVGQVVMVF9NQVhfREVMQVkgPSA1CitERUZBVUxUX1NJR05BTCA9IDEKK0RFRkFVTFRfVElNRU9VVCA9IDUKKworCitkZWYgX2NvbGxlY3RfdGVzdGxpYnMoY29uZmlnLCBzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaD1bTm9uZV0pOgorICAgICIiIkNvbGxlY3RzIHNlcnZlci9jbGllbnQgY29uZmlndXJhdGlvbnMgZnJvbSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb25zIiIiCisgICAgZGVmIGV4cGFuZF9saWJzKGNvbmZpZyk6CisgICAgICAgIGZvciBsaWIgaW4gY29uZmlnOgorICAgICAgICAgICAgc3YgPSBsaWIucG9wKCdzZXJ2ZXInLCBOb25lKQorICAgICAgICAgICAgY2wgPSBsaWIucG9wKCdjbGllbnQnLCBOb25lKQorICAgICAgICAgICAgeWllbGQgbGliLCBzdiwgY2wKKworICAgIGRlZiB5aWVsZF90ZXN0bGlicyhiYXNlX2NvbmZpZ3MsIGNvbmZpZ3MsIG1hdGNoKToKKyAgICAgICAgZm9yIGJhc2UsIGNvbmYgaW4gemlwKGJhc2VfY29uZmlncywgY29uZmlncyk6CisgICAgICAgICAgICBpZiBjb25mOgorICAgICAgICAgICAgICAgIGlmIG5vdCBtYXRjaCBvciBiYXNlWyduYW1lJ10gaW4gbWF0Y2g6CisgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtcyA9IGNvbmYuZ2V0KCdwbGF0Zm9ybXMnKSBvciBiYXNlLmdldCgncGxhdGZvcm1zJykKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHBsYXRmb3JtcyBvciBwbGF0Zm9ybS5zeXN0ZW0oKSBpbiBwbGF0Zm9ybXM6CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBtZXJnZV9kaWN0KGJhc2UsIGNvbmYpCisKKyAgICBsaWJzLCBzdnMsIGNscyA9IHppcCgqZXhwYW5kX2xpYnMoY29uZmlnKSkKKyAgICBzZXJ2ZXJzID0gbGlzdCh5aWVsZF90ZXN0bGlicyhsaWJzLCBzdnMsIHNlcnZlcl9tYXRjaCkpCisgICAgY2xpZW50cyA9IGxpc3QoeWllbGRfdGVzdGxpYnMobGlicywgY2xzLCBjbGllbnRfbWF0Y2gpKQorICAgIHJldHVybiBzZXJ2ZXJzLCBjbGllbnRzCisKKworZGVmIGNvbGxlY3RfZmVhdHVyZXMoY29uZmlnLCBtYXRjaCk6CisgICAgcmVzID0gbGlzdChtYXAocmUuY29tcGlsZSwgbWF0Y2gpKQorICAgIHJldHVybiBsaXN0KGZpbHRlcihsYW1iZGEgYzogYW55KG1hcChsYW1iZGEgcjogci5zZWFyY2goY1snbmFtZSddKSwgcmVzKSksIGNvbmZpZykpCisKKworZGVmIF9kb19jb2xsZWN0X3Rlc3RzKHNlcnZlcnMsIGNsaWVudHMpOgorICAgIGRlZiBpbnRlcnNlY3Rpb24oa2V5LCBvMSwgbzIpOgorICAgICAgICAiIiJpbnRlcnNlY3Rpb24gb2YgdHdvIGNvbGxlY3Rpb25zLgorICAgICAgICBjb2xsZWN0aW9ucyBhcmUgcmVwbGFjZWQgd2l0aCBzZXRzIHRoZSBmaXJzdCB0aW1lIiIiCisgICAgICAgIGRlZiBjYWNoZWRfc2V0KG8sIGtleSk6CisgICAgICAgICAgICB2ID0gb1trZXldCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2LCBzZXQpOgorICAgICAgICAgICAgICAgIHYgPSBzZXQodikKKyAgICAgICAgICAgICAgICBvW2tleV0gPSB2CisgICAgICAgICAgICByZXR1cm4gdgorICAgICAgICByZXR1cm4gY2FjaGVkX3NldChvMSwga2V5KSAmIGNhY2hlZF9zZXQobzIsIGtleSkKKworICAgIGRlZiBpbnRlcnNlY3Rfd2l0aF9zcGVjKGtleSwgbzEsIG8yKToKKyAgICAgICAgIyBzdG9yZSBhcyBzZXQgb2YgKHNwZWMsIGltcGwpIHR1cGxlCisgICAgICAgIGRlZiBjYWNoZWRfc2V0KG8pOgorICAgICAgICAgICAgZGVmIHRvX3NwZWNfaW1wbF90dXBsZXModmFsdWVzKToKKyAgICAgICAgICAgICAgICBmb3IgdiBpbiB2YWx1ZXM6CisgICAgICAgICAgICAgICAgICAgIHNwZWMsIF8sIGltcGwgPSB2LnBhcnRpdGlvbignOicpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHNwZWMsIGltcGwgb3Igc3BlYworICAgICAgICAgICAgdiA9IG9ba2V5XQorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uodiwgc2V0KToKKyAgICAgICAgICAgICAgICB2ID0gc2V0KHRvX3NwZWNfaW1wbF90dXBsZXMoc2V0KHYpKSkKKyAgICAgICAgICAgICAgICBvW2tleV0gPSB2CisgICAgICAgICAgICByZXR1cm4gdgorICAgICAgICBmb3Igc3BlYzEsIGltcGwxIGluIGNhY2hlZF9zZXQobzEpOgorICAgICAgICAgICAgZm9yIHNwZWMyLCBpbXBsMiBpbiBjYWNoZWRfc2V0KG8yKToKKyAgICAgICAgICAgICAgICBpZiBzcGVjMSA9PSBzcGVjMjoKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGltcGwxIGlmIGltcGwxID09IGltcGwyIGVsc2UgJyVzLSVzJyAlIChpbXBsMSwgaW1wbDIpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIG5hbWUsIGltcGwxLCBpbXBsMgorCisgICAgZGVmIG1heWJlX21heChrZXksIG8xLCBvMiwgZGVmYXVsdCk6CisgICAgICAgICIiIm1heGltdW0gb2YgdHdvIGlmIHByZXNlbnQsIG90aGVyd2lzZSBkZWZhdWx0IHZhbHVlIiIiCisgICAgICAgIHYxID0gbzEuZ2V0KGtleSkKKyAgICAgICAgdjIgPSBvMi5nZXQoa2V5KQorICAgICAgICByZXR1cm4gbWF4KHYxLCB2MikgaWYgdjEgYW5kIHYyIGVsc2UgdjEgb3IgdjIgb3IgZGVmYXVsdAorCisgICAgZGVmIGZpbHRlcl93aXRoX3ZhbGlka2V5cyhvKToKKyAgICAgICAgcmV0ID0ge30KKyAgICAgICAgZm9yIGtleSBpbiBWQUxJRF9KU09OX0tFWVM6CisgICAgICAgICAgICBpZiBrZXkgaW4gbzoKKyAgICAgICAgICAgICAgICByZXRba2V5XSA9IG9ba2V5XQorICAgICAgICByZXR1cm4gcmV0CisKKyAgICBkZWYgbWVyZ2VfbWV0YWRhdGEobywgKipyZXQpOgorICAgICAgICBmb3Iga2V5IGluIFZBTElEX0pTT05fS0VZUzoKKyAgICAgICAgICAgIGlmIGtleSBpbiBvOgorICAgICAgICAgICAgICAgIHJldFtrZXldID0gb1trZXldCisgICAgICAgIHJldHVybiByZXQKKworICAgIGZvciBzdiwgY2wgaW4gcHJvZHVjdChzZXJ2ZXJzLCBjbGllbnRzKToKKyAgICAgICAgZm9yIHByb3RvLCBwcm90bzEsIHByb3RvMiBpbiBpbnRlcnNlY3Rfd2l0aF9zcGVjKCdwcm90b2NvbHMnLCBzdiwgY2wpOgorICAgICAgICAgICAgZm9yIHRyYW5zLCB0cmFuczEsIHRyYW5zMiBpbiBpbnRlcnNlY3Rfd2l0aF9zcGVjKCd0cmFuc3BvcnRzJywgc3YsIGNsKToKKyAgICAgICAgICAgICAgICBmb3Igc29jayBpbiBpbnRlcnNlY3Rpb24oJ3NvY2tldHMnLCBzdiwgY2wpOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCB7CisgICAgICAgICAgICAgICAgICAgICAgICAnc2VydmVyJzogbWVyZ2VfbWV0YWRhdGEoc3YsICoqeydwcm90b2NvbCc6IHByb3RvMSwgJ3RyYW5zcG9ydCc6IHRyYW5zMX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2NsaWVudCc6IG1lcmdlX21ldGFkYXRhKGNsLCAqKnsncHJvdG9jb2wnOiBwcm90bzIsICd0cmFuc3BvcnQnOiB0cmFuczJ9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdkZWxheSc6IG1heWJlX21heCgnZGVsYXknLCBzdiwgY2wsIERFRkFVTFRfTUFYX0RFTEFZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdzdG9wX3NpZ25hbCc6IG1heWJlX21heCgnc3RvcF9zaWduYWwnLCBzdiwgY2wsIERFRkFVTFRfU0lHTkFMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICd0aW1lb3V0JzogbWF5YmVfbWF4KCd0aW1lb3V0Jywgc3YsIGNsLCBERUZBVUxUX1RJTUVPVVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3RvY29sJzogcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAndHJhbnNwb3J0JzogdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAnc29ja2V0Jzogc29jaworICAgICAgICAgICAgICAgICAgICB9CisKKworZGVmIF9maWx0ZXJfZW50cmllcyh0ZXN0cywgcmVnZXgpOgorICAgIGlmIHJlZ2V4OgorICAgICAgICByZXR1cm4gZmlsdGVyKGxhbWJkYSB0OiByZS5zZWFyY2gocmVnZXgsIFRlc3RFbnRyeS5nZXRfbmFtZSgqKnQpKSwgdGVzdHMpCisgICAgcmV0dXJuIHRlc3RzCisKKworZGVmIGNvbGxlY3RfY3Jvc3NfdGVzdHModGVzdHNfZGljdCwgc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2gsIHJlZ2V4KToKKyAgICBzdiwgY2wgPSBfY29sbGVjdF90ZXN0bGlicyh0ZXN0c19kaWN0LCBzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCkKKyAgICByZXR1cm4gbGlzdChfZmlsdGVyX2VudHJpZXMoX2RvX2NvbGxlY3RfdGVzdHMoc3YsIGNsKSwgcmVnZXgpKQorCisKK2RlZiBjb2xsZWN0X2ZlYXR1cmVfdGVzdHModGVzdHNfZGljdCwgZmVhdHVyZXNfZGljdCwgc2VydmVyX21hdGNoLCBmZWF0dXJlX21hdGNoLCByZWdleCk6CisgICAgc3YsIF8gPSBfY29sbGVjdF90ZXN0bGlicyh0ZXN0c19kaWN0LCBzZXJ2ZXJfbWF0Y2gpCisgICAgZnQgPSBjb2xsZWN0X2ZlYXR1cmVzKGZlYXR1cmVzX2RpY3QsIGZlYXR1cmVfbWF0Y2gpCisgICAgcmV0dXJuIGxpc3QoX2ZpbHRlcl9lbnRyaWVzKF9kb19jb2xsZWN0X3Rlc3RzKHN2LCBmdCksIHJlZ2V4KSkKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvY29tcGF0LnB5IGIvdGVzdC9jcm9zc3J1bm5lci9jb21wYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjYTkxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvY29tcGF0LnB5CkBAIC0wLDAgKzEsMjQgQEAKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CisgICAgX0VOQ09ERSA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKQorCisgICAgZGVmIHBhdGhfam9pbigqYXJncyk6CisgICAgICAgIGJpbl9hcmdzID0gbWFwKGxhbWJkYSBhOiBhLmRlY29kZShfRU5DT0RFKSwgYXJncykKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbigqYmluX2FyZ3MpLmVuY29kZShfRU5DT0RFKQorCisgICAgZGVmIHN0cl9qb2luKHMsIGwpOgorICAgICAgICBiaW5fYXJncyA9IG1hcChsYW1iZGEgYTogYS5kZWNvZGUoX0VOQ09ERSksIGwpCisgICAgICAgIGIgPSBzLmRlY29kZShfRU5DT0RFKQorICAgICAgICByZXR1cm4gYi5qb2luKGJpbl9hcmdzKS5lbmNvZGUoX0VOQ09ERSkKKworICAgIGxvZ2ZpbGVfb3BlbiA9IG9wZW4KKworZWxzZToKKworICAgIHBhdGhfam9pbiA9IG9zLnBhdGguam9pbgorICAgIHN0cl9qb2luID0gc3RyLmpvaW4KKworICAgIGRlZiBsb2dmaWxlX29wZW4oKmFyZ3MpOgorICAgICAgICByZXR1cm4gb3BlbigqYXJncywgZXJyb3JzPSdyZXBsYWNlJykKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvcmVwb3J0LnB5IGIvdGVzdC9jcm9zc3J1bm5lci9yZXBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhZjE2MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvcmVwb3J0LnB5CkBAIC0wLDAgKzEsNDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoraW1wb3J0IGRhdGV0aW1lCitpbXBvcnQganNvbgoraW1wb3J0IG11bHRpcHJvY2Vzc2luZworaW1wb3J0IG9zCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCByZQoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgdHJhY2ViYWNrCisKK2Zyb20gLmNvbXBhdCBpbXBvcnQgbG9nZmlsZV9vcGVuLCBwYXRoX2pvaW4sIHN0cl9qb2luCitmcm9tIC50ZXN0IGltcG9ydCBUZXN0RW50cnkKKworTE9HX0RJUiA9ICdsb2cnCitSRVNVTFRfSFRNTCA9ICdpbmRleC5odG1sJworUkVTVUxUX0pTT04gPSAncmVzdWx0cy5qc29uJworRkFJTF9KU09OID0gJ2tub3duX2ZhaWx1cmVzXyVzLmpzb24nCisKKworZGVmIGdlbmVyYXRlX2tub3duX2ZhaWx1cmVzKHRlc3RkaXIsIG92ZXJ3cml0ZSwgc2F2ZSwgb3V0KToKKyAgICBkZWYgY29sbGVjdF9mYWlsdXJlcyhyZXN1bHRzKToKKyAgICAgICAgc3VjY2Vzc19pbmRleCA9IDUKKyAgICAgICAgZm9yIHIgaW4gcmVzdWx0czoKKyAgICAgICAgICAgIGlmIG5vdCByW3N1Y2Nlc3NfaW5kZXhdOgorICAgICAgICAgICAgICAgIHlpZWxkIFRlc3RFbnRyeS5nZXRfbmFtZSgqcikKKyAgICB0cnk6CisgICAgICAgIHdpdGggbG9nZmlsZV9vcGVuKHBhdGhfam9pbih0ZXN0ZGlyLCBSRVNVTFRfSlNPTiksICdyJykgYXMgZnA6CisgICAgICAgICAgICByZXN1bHRzID0ganNvbi5sb2FkKGZwKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdVbmFibGUgdG8gbG9hZCBsYXN0IHJlc3VsdC4gRGlkIHlvdSBydW4gdGVzdHMgP1xuJykKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgZmFpbHMgPSBjb2xsZWN0X2ZhaWx1cmVzKHJlc3VsdHNbJ3Jlc3VsdHMnXSkKKyAgICBpZiBub3Qgb3ZlcndyaXRlOgorICAgICAgICBrbm93biA9IGxvYWRfa25vd25fZmFpbHVyZXModGVzdGRpcikKKyAgICAgICAga25vd24uZXh0ZW5kKGZhaWxzKQorICAgICAgICBmYWlscyA9IGtub3duCisgICAgZmFpbHNfanNvbiA9IGpzb24uZHVtcHMoc29ydGVkKHNldChmYWlscykpLCBpbmRlbnQ9Miwgc2VwYXJhdG9ycz0oJywnLCAnOiAnKSkKKyAgICBpZiBzYXZlOgorICAgICAgICB3aXRoIGxvZ2ZpbGVfb3Blbihvcy5wYXRoLmpvaW4odGVzdGRpciwgRkFJTF9KU09OICUgcGxhdGZvcm0uc3lzdGVtKCkpLCAndysnKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKGZhaWxzX2pzb24pCisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJ1N1Y2Nlc3NmdWxseSB1cGRhdGVkIGtub3duIGZhaWx1cmVzLlxuJykKKyAgICBpZiBvdXQ6CisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoZmFpbHNfanNvbikKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnXG4nKQorICAgIHJldHVybiBUcnVlCisKKworZGVmIGxvYWRfa25vd25fZmFpbHVyZXModGVzdGRpcik6CisgICAgdHJ5OgorICAgICAgICB3aXRoIGxvZ2ZpbGVfb3BlbihwYXRoX2pvaW4odGVzdGRpciwgRkFJTF9KU09OICUgcGxhdGZvcm0uc3lzdGVtKCkpLCAncicpIGFzIGZwOgorICAgICAgICAgICAgcmV0dXJuIGpzb24ubG9hZChmcCkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgcmV0dXJuIFtdCisKKworY2xhc3MgVGVzdFJlcG9ydGVyKG9iamVjdCk6CisgICAgIyBVbmZvcnR1bmF0ZWx5LCBzdGFuZGFyZCBsaWJyYXJ5IGRvZXNuJ3QgaGFuZGxlIHRpbWV6b25lIHdlbGwKKyAgICAjIERBVEVUSU1FX0ZPUk1BVCA9ICclYSAlYiAlZCAlSDolTTolUyAlWiAlWScKKyAgICBEQVRFVElNRV9GT1JNQVQgPSAnJWEgJWIgJWQgJUg6JU06JVMgJVknCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2xvZyA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICAgICAgc2VsZi5fbG9jayA9IG11bHRpcHJvY2Vzc2luZy5Mb2NrKCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZXN0X2xvZ2ZpbGUoY2xzLCB0ZXN0X25hbWUsIHByb2dfa2luZCwgZGlyPU5vbmUpOgorICAgICAgICByZWxwYXRoID0gcGF0aF9qb2luKCdsb2cnLCAnJXNfJXMubG9nJyAlICh0ZXN0X25hbWUsIHByb2dfa2luZCkpCisgICAgICAgIHJldHVybiByZWxwYXRoIGlmIG5vdCBkaXIgZWxzZSBvcy5wYXRoLnJlYWxwYXRoKHBhdGhfam9pbihkaXIsIHJlbHBhdGgpKQorCisgICAgZGVmIF9zdGFydChzZWxmKToKKyAgICAgICAgc2VsZi5fc3RhcnRfdGltZSA9IHRpbWUudGltZSgpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgX2VsYXBzZWQoc2VsZik6CisgICAgICAgIHJldHVybiB0aW1lLnRpbWUoKSAtIHNlbGYuX3N0YXJ0X3RpbWUKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfZm9ybWF0X2RhdGUoY2xzKToKKyAgICAgICAgcmV0dXJuICclcycgJSBkYXRldGltZS5kYXRldGltZS5ub3coKS5zdHJmdGltZShjbHMuREFURVRJTUVfRk9STUFUKQorCisgICAgZGVmIF9wcmludF9kYXRlKHNlbGYpOgorICAgICAgICBwcmludChzZWxmLl9mb3JtYXRfZGF0ZSgpLCBmaWxlPXNlbGYub3V0KQorCisgICAgZGVmIF9wcmludF9iYXIoc2VsZiwgb3V0PU5vbmUpOgorICAgICAgICBwcmludCgKKyAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09JywKKyAgICAgICAgICAgIGZpbGU9KG91dCBvciBzZWxmLm91dCkpCisKKyAgICBkZWYgX3ByaW50X2V4ZWNfdGltZShzZWxmKToKKyAgICAgICAgcHJpbnQoJ1Rlc3QgZXhlY3V0aW9uIHRvb2sgezouMWZ9IHNlY29uZHMuJy5mb3JtYXQoc2VsZi5fZWxhcHNlZCksIGZpbGU9c2VsZi5vdXQpCisKKworY2xhc3MgRXhlY1JlcG9ydGVyKFRlc3RSZXBvcnRlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RkaXIsIHRlc3QsIHByb2cpOgorICAgICAgICBzdXBlcihFeGVjUmVwb3J0ZXIsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5fdGVzdCA9IHRlc3QKKyAgICAgICAgc2VsZi5fcHJvZyA9IHByb2cKKyAgICAgICAgc2VsZi5sb2dwYXRoID0gc2VsZi50ZXN0X2xvZ2ZpbGUodGVzdC5uYW1lLCBwcm9nLmtpbmQsIHRlc3RkaXIpCisgICAgICAgIHNlbGYub3V0ID0gTm9uZQorCisgICAgZGVmIGJlZ2luKHNlbGYpOgorICAgICAgICBzZWxmLl9zdGFydCgpCisgICAgICAgIHNlbGYuX29wZW4oKQorICAgICAgICBpZiBzZWxmLm91dCBhbmQgbm90IHNlbGYub3V0LmNsb3NlZDoKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X2hlYWRlcigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ091dHB1dCBzdHJlYW0gaXMgbm90IGF2YWlsYWJsZS4nKQorCisgICAgZGVmIGVuZChzZWxmLCByZXR1cm5jb2RlKToKKyAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5vdXQgYW5kIG5vdCBzZWxmLm91dC5jbG9zZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5fcHJpbnRfZm9vdGVyKHJldHVybmNvZGUpCisgICAgICAgICAgICAgICAgc2VsZi5fY2xvc2UoKQorICAgICAgICAgICAgICAgIHNlbGYub3V0ID0gTm9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ091dHB1dCBzdHJlYW0gaXMgbm90IGF2YWlsYWJsZS4nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKKworICAgIGRlZiBraWxsZWQoc2VsZik6CisgICAgICAgIHByaW50KGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHByaW50KCdTZXJ2ZXIgcHJvY2VzcyBpcyBzdWNjZXNzZnVsbHkga2lsbGVkLicsIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHNlbGYuZW5kKE5vbmUpCisKKyAgICBkZWYgZGllZChzZWxmKToKKyAgICAgICAgcHJpbnQoZmlsZT1zZWxmLm91dCkKKyAgICAgICAgcHJpbnQoJyoqKiBTZXJ2ZXIgcHJvY2VzcyBoYXMgZGllZCB1bmV4cGVjdGVkbHkgKioqJywgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgc2VsZi5lbmQoTm9uZSkKKworICAgIF9pbml0X2ZhaWx1cmVfZXhwcnMgPSB7CisgICAgICAgICdzZXJ2ZXInOiBsaXN0KG1hcChyZS5jb21waWxlLCBbCisgICAgICAgICAgICAnW0FhXWRkcmVzcyBhbHJlYWR5IGluIHVzZScsCisgICAgICAgICAgICAnQ291bGQgbm90IGJpbmQnLAorICAgICAgICAgICAgJ0VBRERSSU5VU0UnLAorICAgICAgICBdKSksCisgICAgICAgICdjbGllbnQnOiBsaXN0KG1hcChyZS5jb21waWxlLCBbCisgICAgICAgICAgICAnW0NjXW9ubmVjdGlvbiByZWZ1c2VkJywKKyAgICAgICAgICAgICdDb3VsZCBub3QgY29ubmVjdCB0bycsCisgICAgICAgICAgICAnQ291bGQgbm90IG9wZW4gVU5JWCAnLCAgICAgICAjIGRvbWFpbiBzb2NrZXQgKHJiKQorICAgICAgICAgICAgJ0VDT05OUkVGVVNFRCcsCisgICAgICAgICAgICAnZWNvbm5yZWZ1c2VkJywgICAgICAgICAgICAgICAjIGVybAorICAgICAgICAgICAgJ0NPTk5FQ1RJT04tUkVGVVNFRC1FUlJPUicsICAgIyBjbAorICAgICAgICAgICAgJ2Nvbm5lY3QgRU5PRU5UJywgICAgICAgICAgICAgIyBub2RlanMgZG9tYWluIHNvY2tldAorICAgICAgICAgICAgJ05vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknLCAgIyBkb21haW4gc29ja2V0CisgICAgICAgICAgICAnU29ja2V0cy5UY3BDbGllbnQuQ29ubmVjdCcsICAjIGNzaGFycAorICAgICAgICBdKSksCisgICAgfQorCisgICAgZGVmIG1heWJlX2ZhbHNlX3Bvc2l0aXZlKHNlbGYpOgorICAgICAgICAiIiJTZWFyY2hlcyB0aHJvdWdoIGxvZyBmaWxlIGZvciBzb2NrZXQgYmluZCBlcnJvci4KKyAgICAgICAgUmV0dXJucyBUcnVlIGlmIHN1c3BpY2lvdXMgZXhwcmVzc2lvbiBpcyBmb3VuZCwgb3RoZXJ3aXNlIEZhbHNlIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYub3V0IGFuZCBub3Qgc2VsZi5vdXQuY2xvc2VkOgorICAgICAgICAgICAgICAgIHNlbGYub3V0LmZsdXNoKCkKKyAgICAgICAgICAgIGV4cHJzID0gc2VsZi5faW5pdF9mYWlsdXJlX2V4cHJzW3NlbGYuX3Byb2cua2luZF0KKworICAgICAgICAgICAgZGVmIG1hdGNoKGxpbmUpOgorICAgICAgICAgICAgICAgIGZvciBleHByIGluIGV4cHJzOgorICAgICAgICAgICAgICAgICAgICBpZiBleHByLnNlYXJjaChsaW5lKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCJtYXliZSBmYWxzZSBwb3NpdGl2ZTogJXMiICUgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgICAgIHdpdGggbG9nZmlsZV9vcGVuKHNlbGYubG9ncGF0aCwgJ3InKSBhcyBmcDoKKyAgICAgICAgICAgICAgICBpZiBhbnkobWFwKG1hdGNoLCBmcCkpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXg6CisgICAgICAgICAgICBzZWxmLl9sb2cud2FybignWyVzXTogRXJyb3Igd2hpbGUgZGV0ZWN0aW5nIGZhbHNlIHBvc2l0aXZlOiAlcycgJSAoc2VsZi5fdGVzdC5uYW1lLCBzdHIoZXgpKSkKKyAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKHRyYWNlYmFjay5wcmludF9leGMoKSkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX29wZW4oc2VsZik6CisgICAgICAgIHNlbGYub3V0ID0gbG9nZmlsZV9vcGVuKHNlbGYubG9ncGF0aCwgJ3crJykKKworICAgIGRlZiBfY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYub3V0LmNsb3NlKCkKKworICAgIGRlZiBfcHJpbnRfaGVhZGVyKHNlbGYpOgorICAgICAgICBzZWxmLl9wcmludF9kYXRlKCkKKyAgICAgICAgcHJpbnQoJ0V4ZWN1dGluZzogJXMnICUgc3RyX2pvaW4oJyAnLCBzZWxmLl9wcm9nLmNvbW1hbmQpLCBmaWxlPXNlbGYub3V0KQorICAgICAgICBwcmludCgnRGlyZWN0b3J5OiAlcycgJSBzZWxmLl9wcm9nLndvcmtkaXIsIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHByaW50KCdjb25maWc6ZGVsYXk6ICVzJyAlIHNlbGYuX3Rlc3QuZGVsYXksIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHByaW50KCdjb25maWc6dGltZW91dDogJXMnICUgc2VsZi5fdGVzdC50aW1lb3V0LCBmaWxlPXNlbGYub3V0KQorICAgICAgICBzZWxmLl9wcmludF9iYXIoKQorICAgICAgICBzZWxmLm91dC5mbHVzaCgpCisKKyAgICBkZWYgX3ByaW50X2Zvb3RlcihzZWxmLCByZXR1cm5jb2RlPU5vbmUpOgorICAgICAgICBzZWxmLl9wcmludF9iYXIoKQorICAgICAgICBpZiByZXR1cm5jb2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcHJpbnQoJ1JldHVybiBjb2RlOiAlZCAobmVnYXRpdmUgdmFsdWVzIGluZGljYXRlIGtpbGwgYnkgc2lnbmFsKScgJSByZXR1cm5jb2RlLCBmaWxlPXNlbGYub3V0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQoJ1Byb2Nlc3MgaXMga2lsbGVkLicsIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHNlbGYuX3ByaW50X2V4ZWNfdGltZSgpCisgICAgICAgIHNlbGYuX3ByaW50X2RhdGUoKQorCisKK2NsYXNzIFN1bW1hcnlSZXBvcnRlcihUZXN0UmVwb3J0ZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBiYXNlZGlyLCB0ZXN0ZGlyX3JlbGF0aXZlLCBjb25jdXJyZW50PVRydWUpOgorICAgICAgICBzdXBlcihTdW1tYXJ5UmVwb3J0ZXIsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5fYmFzZWRpciA9IGJhc2VkaXIKKyAgICAgICAgc2VsZi5fdGVzdGRpcl9yZWwgPSB0ZXN0ZGlyX3JlbGF0aXZlCisgICAgICAgIHNlbGYubG9nZGlyID0gcGF0aF9qb2luKHNlbGYudGVzdGRpciwgTE9HX0RJUikKKyAgICAgICAgc2VsZi5vdXRfcGF0aCA9IHBhdGhfam9pbihzZWxmLnRlc3RkaXIsIFJFU1VMVF9KU09OKQorICAgICAgICBzZWxmLmNvbmN1cnJlbnQgPSBjb25jdXJyZW50CisgICAgICAgIHNlbGYub3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBzZWxmLl9wbGF0Zm9ybSA9IHBsYXRmb3JtLnN5c3RlbSgpCisgICAgICAgIHNlbGYuX3JldmlzaW9uID0gc2VsZi5fZ2V0X3JldmlzaW9uKCkKKyAgICAgICAgc2VsZi5fdGVzdHMgPSBbXQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5sb2dkaXIpOgorICAgICAgICAgICAgb3MubWtkaXIoc2VsZi5sb2dkaXIpCisgICAgICAgIHNlbGYuX2tub3duX2ZhaWx1cmVzID0gbG9hZF9rbm93bl9mYWlsdXJlcyhzZWxmLnRlc3RkaXIpCisgICAgICAgIHNlbGYuX3VuZXhwZWN0ZWRfc3VjY2VzcyA9IFtdCisgICAgICAgIHNlbGYuX2ZsYWt5X3N1Y2Nlc3MgPSBbXQorICAgICAgICBzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUgPSBbXQorICAgICAgICBzZWxmLl9leHBlY3RlZF9mYWlsdXJlID0gW10KKyAgICAgICAgc2VsZi5fcHJpbnRfaGVhZGVyKCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB0ZXN0ZGlyKHNlbGYpOgorICAgICAgICByZXR1cm4gcGF0aF9qb2luKHNlbGYuX2Jhc2VkaXIsIHNlbGYuX3Rlc3RkaXJfcmVsKQorCisgICAgZGVmIF9yZXN1bHRfc3RyaW5nKHNlbGYsIHRlc3QpOgorICAgICAgICBpZiB0ZXN0LnN1Y2Nlc3M6CisgICAgICAgICAgICBpZiB0ZXN0LnJldHJ5X2NvdW50ID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuICdzdWNjZXNzJworICAgICAgICAgICAgZWxpZiB0ZXN0LnJldHJ5X2NvdW50ID09IDE6CisgICAgICAgICAgICAgICAgcmV0dXJuICdmbGFreSgxIHJldHJ5KScKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuICdmbGFreSglZCByZXRyaWVzKScgJSB0ZXN0LnJldHJ5X2NvdW50CisgICAgICAgIGVsaWYgdGVzdC5leHBpcmVkOgorICAgICAgICAgICAgcmV0dXJuICdmYWlsdXJlKHRpbWVvdXQpJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICdmYWlsdXJlKCVkKScgJSB0ZXN0LnJldHVybmNvZGUKKworICAgIGRlZiBfZ2V0X3JldmlzaW9uKHNlbGYpOgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihbJ2dpdCcsICdyZXYtcGFyc2UnLCAnLS1zaG9ydCcsICdIRUFEJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZD1zZWxmLnRlc3RkaXIsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIG91dCwgXyA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICByZXR1cm4gb3V0LnN0cmlwKCkKKworICAgIGRlZiBfZm9ybWF0X3Rlc3Qoc2VsZiwgdGVzdCwgd2l0aF9yZXN1bHQ9VHJ1ZSk6CisgICAgICAgIG5hbWUgPSAnJXMtJXMnICUgKHRlc3Quc2VydmVyLm5hbWUsIHRlc3QuY2xpZW50Lm5hbWUpCisgICAgICAgIHRyYW5zID0gJyVzLSVzJyAlICh0ZXN0LnRyYW5zcG9ydCwgdGVzdC5zb2NrZXQpCisgICAgICAgIGlmIG5vdCB3aXRoX3Jlc3VsdDoKKyAgICAgICAgICAgIHJldHVybiAnezoyNHN9ezoxOHN9ezoyNXN9Jy5mb3JtYXQobmFtZVs6MjNdLCB0ZXN0LnByb3RvY29sWzoxN10sIHRyYW5zWzoyNF0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJ3s6MjRzfXs6MThzfXs6MjVzfXs6c31cbicuZm9ybWF0KG5hbWVbOjIzXSwgdGVzdC5wcm90b2NvbFs6MTddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1s6MjRdLCBzZWxmLl9yZXN1bHRfc3RyaW5nKHRlc3QpKQorCisgICAgZGVmIF9wcmludF90ZXN0X2hlYWRlcihzZWxmKToKKyAgICAgICAgc2VsZi5fcHJpbnRfYmFyKCkKKyAgICAgICAgcHJpbnQoCisgICAgICAgICAgICAnezoyNHN9ezoxOHN9ezoyNXN9ezpzfScuZm9ybWF0KCdzZXJ2ZXItY2xpZW50OicsICdwcm90b2NvbDonLCAndHJhbnNwb3J0OicsICdyZXN1bHQ6JyksCisgICAgICAgICAgICBmaWxlPXNlbGYub3V0KQorCisgICAgZGVmIF9wcmludF9oZWFkZXIoc2VsZik6CisgICAgICAgIHNlbGYuX3N0YXJ0KCkKKyAgICAgICAgcHJpbnQoJ0FwYWNoZSBUaHJpZnQgLSBJbnRlZ3JhdGlvbiBUZXN0IFN1aXRlJywgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgc2VsZi5fcHJpbnRfZGF0ZSgpCisgICAgICAgIHNlbGYuX3ByaW50X3Rlc3RfaGVhZGVyKCkKKworICAgIGRlZiBfcHJpbnRfdW5leHBlY3RlZF9mYWlsdXJlKHNlbGYpOgorICAgICAgICBpZiBsZW4oc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlKSA+IDA6CisgICAgICAgICAgICBzZWxmLm91dC53cml0ZWxpbmVzKFsKKyAgICAgICAgICAgICAgICAnKioqIEZvbGxvd2luZyAlZCBmYWlsdXJlcyB3ZXJlIHVuZXhwZWN0ZWQgKioqOlxuJyAlIGxlbihzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUpLAorICAgICAgICAgICAgICAgICdJZiBpdCBpcyBpbnRyb2R1Y2VkIGJ5IHlvdSwgcGxlYXNlIGZpeCBpdCBiZWZvcmUgc3VibWl0dGluZyB0aGUgY29kZS5cbicsCisgICAgICAgICAgICAgICAgIyAnSWYgbm90LCBwbGVhc2UgcmVwb3J0IGF0IGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUXG4nLAorICAgICAgICAgICAgXSkKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X3Rlc3RfaGVhZGVyKCkKKyAgICAgICAgICAgIGZvciBpIGluIHNlbGYuX3VuZXhwZWN0ZWRfZmFpbHVyZToKKyAgICAgICAgICAgICAgICBzZWxmLm91dC53cml0ZShzZWxmLl9mb3JtYXRfdGVzdChzZWxmLl90ZXN0c1tpXSkpCisgICAgICAgICAgICBzZWxmLl9wcmludF9iYXIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQoJ05vIHVuZXhwZWN0ZWQgZmFpbHVyZXMuJywgZmlsZT1zZWxmLm91dCkKKworICAgIGRlZiBfcHJpbnRfZmxha3lfc3VjY2VzcyhzZWxmKToKKyAgICAgICAgaWYgbGVuKHNlbGYuX2ZsYWt5X3N1Y2Nlc3MpID4gMDoKKyAgICAgICAgICAgIHByaW50KAorICAgICAgICAgICAgICAgICdGb2xsb3dpbmcgJWQgdGVzdHMgd2VyZSBleHBlY3RlZCB0byBjbGVhbmx5IHN1Y2NlZWQgYnV0IG5lZWRlZCByZXRyeTonICUgbGVuKHNlbGYuX2ZsYWt5X3N1Y2Nlc3MpLAorICAgICAgICAgICAgICAgIGZpbGU9c2VsZi5vdXQpCisgICAgICAgICAgICBzZWxmLl9wcmludF90ZXN0X2hlYWRlcigpCisgICAgICAgICAgICBmb3IgaSBpbiBzZWxmLl9mbGFreV9zdWNjZXNzOgorICAgICAgICAgICAgICAgIHNlbGYub3V0LndyaXRlKHNlbGYuX2Zvcm1hdF90ZXN0KHNlbGYuX3Rlc3RzW2ldKSkKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X2JhcigpCisKKyAgICBkZWYgX3ByaW50X3VuZXhwZWN0ZWRfc3VjY2VzcyhzZWxmKToKKyAgICAgICAgaWYgbGVuKHNlbGYuX3VuZXhwZWN0ZWRfc3VjY2VzcykgPiAwOgorICAgICAgICAgICAgcHJpbnQoCisgICAgICAgICAgICAgICAgJ0ZvbGxvd2luZyAlZCB0ZXN0cyB3ZXJlIGtub3duIHRvIGZhaWwgYnV0IHN1Y2NlZWRlZCAobWF5YmUgZmxha3kpOicgJSBsZW4oc2VsZi5fdW5leHBlY3RlZF9zdWNjZXNzKSwKKyAgICAgICAgICAgICAgICBmaWxlPXNlbGYub3V0KQorICAgICAgICAgICAgc2VsZi5fcHJpbnRfdGVzdF9oZWFkZXIoKQorICAgICAgICAgICAgZm9yIGkgaW4gc2VsZi5fdW5leHBlY3RlZF9zdWNjZXNzOgorICAgICAgICAgICAgICAgIHNlbGYub3V0LndyaXRlKHNlbGYuX2Zvcm1hdF90ZXN0KHNlbGYuX3Rlc3RzW2ldKSkKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X2JhcigpCisKKyAgICBkZWYgX2h0dHBfc2VydmVyX2NvbW1hbmQoc2VsZiwgcG9ydCk6CisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgorICAgICAgICAgICAgcmV0dXJuICdweXRob24gLW0gU2ltcGxlSFRUUFNlcnZlciAlZCcgJSBwb3J0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJ3B5dGhvbiAtbSBodHRwLnNlcnZlciAlZCcgJSBwb3J0CisKKyAgICBkZWYgX3ByaW50X2Zvb3RlcihzZWxmKToKKyAgICAgICAgZmFpbF9jb3VudCA9IGxlbihzZWxmLl9leHBlY3RlZF9mYWlsdXJlKSArIGxlbihzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUpCisgICAgICAgIHNlbGYuX3ByaW50X2JhcigpCisgICAgICAgIHNlbGYuX3ByaW50X3VuZXhwZWN0ZWRfc3VjY2VzcygpCisgICAgICAgIHNlbGYuX3ByaW50X2ZsYWt5X3N1Y2Nlc3MoKQorICAgICAgICBzZWxmLl9wcmludF91bmV4cGVjdGVkX2ZhaWx1cmUoKQorICAgICAgICBzZWxmLl93cml0ZV9odG1sX2RhdGEoKQorICAgICAgICBzZWxmLl9hc3NlbWJsZV9sb2coJ3VuZXhwZWN0ZWQgZmFpbHVyZXMnLCBzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUpCisgICAgICAgIHNlbGYuX2Fzc2VtYmxlX2xvZygna25vd24gZmFpbHVyZXMnLCBzZWxmLl9leHBlY3RlZF9mYWlsdXJlKQorICAgICAgICBzZWxmLm91dC53cml0ZWxpbmVzKFsKKyAgICAgICAgICAgICdZb3UgY2FuIGJyb3dzZSByZXN1bHRzIGF0OlxuJywKKyAgICAgICAgICAgICdcdGZpbGU6Ly8lcy8lc1xuJyAlIChzZWxmLnRlc3RkaXIsIFJFU1VMVF9IVE1MKSwKKyAgICAgICAgICAgICcjIElmIHlvdSB1c2UgQ2hyb21lLCBydW46XG4nLAorICAgICAgICAgICAgJyMgXHRjZCAlc1xuI1x0JXNcbicgJSAoc2VsZi5fYmFzZWRpciwgc2VsZi5faHR0cF9zZXJ2ZXJfY29tbWFuZCg4MDAxKSksCisgICAgICAgICAgICAnIyB0aGVuIGJyb3dzZTpcbicsCisgICAgICAgICAgICAnIyBcdGh0dHA6Ly9sb2NhbGhvc3Q6JWQvJXMvXG4nICUgKDgwMDEsIHNlbGYuX3Rlc3RkaXJfcmVsKSwKKyAgICAgICAgICAgICdGdWxsIGxvZyBmb3IgZWFjaCB0ZXN0IGlzIGhlcmU6XG4nLAorICAgICAgICAgICAgJ1x0dGVzdC9sb2cvc2VydmVyX2NsaWVudF9wcm90b2NvbF90cmFuc3BvcnRfY2xpZW50LmxvZ1xuJywKKyAgICAgICAgICAgICdcdHRlc3QvbG9nL3NlcnZlcl9jbGllbnRfcHJvdG9jb2xfdHJhbnNwb3J0X3NlcnZlci5sb2dcbicsCisgICAgICAgICAgICAnJWQgZmFpbGVkIG9mICVkIHRlc3RzIGluIHRvdGFsLlxuJyAlIChmYWlsX2NvdW50LCBsZW4oc2VsZi5fdGVzdHMpKSwKKyAgICAgICAgXSkKKyAgICAgICAgc2VsZi5fcHJpbnRfZXhlY190aW1lKCkKKyAgICAgICAgc2VsZi5fcHJpbnRfZGF0ZSgpCisKKyAgICBkZWYgX3JlbmRlcl9yZXN1bHQoc2VsZiwgdGVzdCk6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICB0ZXN0LnNlcnZlci5uYW1lLAorICAgICAgICAgICAgdGVzdC5jbGllbnQubmFtZSwKKyAgICAgICAgICAgIHRlc3QucHJvdG9jb2wsCisgICAgICAgICAgICB0ZXN0LnRyYW5zcG9ydCwKKyAgICAgICAgICAgIHRlc3Quc29ja2V0LAorICAgICAgICAgICAgdGVzdC5zdWNjZXNzLAorICAgICAgICAgICAgdGVzdC5hc19leHBlY3RlZCwKKyAgICAgICAgICAgIHRlc3QucmV0dXJuY29kZSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAnc2VydmVyJzogc2VsZi50ZXN0X2xvZ2ZpbGUodGVzdC5uYW1lLCB0ZXN0LnNlcnZlci5raW5kKSwKKyAgICAgICAgICAgICAgICAnY2xpZW50Jzogc2VsZi50ZXN0X2xvZ2ZpbGUodGVzdC5uYW1lLCB0ZXN0LmNsaWVudC5raW5kKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgIF0KKworICAgIGRlZiBfd3JpdGVfaHRtbF9kYXRhKHNlbGYpOgorICAgICAgICAiIiJXcml0ZXMgSlNPTiBkYXRhIHRvIGJlIHJlYWQgYnkgcmVzdWx0IGh0bWwiIiIKKyAgICAgICAgcmVzdWx0cyA9IFtzZWxmLl9yZW5kZXJfcmVzdWx0KHIpIGZvciByIGluIHNlbGYuX3Rlc3RzXQorICAgICAgICB3aXRoIGxvZ2ZpbGVfb3BlbihzZWxmLm91dF9wYXRoLCAndysnKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKGpzb24uZHVtcHMoeworICAgICAgICAgICAgICAgICdkYXRlJzogc2VsZi5fZm9ybWF0X2RhdGUoKSwKKyAgICAgICAgICAgICAgICAncmV2aXNpb24nOiBzdHIoc2VsZi5fcmV2aXNpb24pLAorICAgICAgICAgICAgICAgICdwbGF0Zm9ybSc6IHNlbGYuX3BsYXRmb3JtLAorICAgICAgICAgICAgICAgICdkdXJhdGlvbic6ICd7Oi4xZn0nLmZvcm1hdChzZWxmLl9lbGFwc2VkKSwKKyAgICAgICAgICAgICAgICAncmVzdWx0cyc6IHJlc3VsdHMsCisgICAgICAgICAgICB9LCBpbmRlbnQ9MikpCisKKyAgICBkZWYgX2Fzc2VtYmxlX2xvZyhzZWxmLCB0aXRsZSwgaW5kZXhlcyk6CisgICAgICAgIGlmIGxlbihpbmRleGVzKSA+IDA6CisgICAgICAgICAgICBkZWYgYWRkX3Byb2dfbG9nKGZwLCB0ZXN0LCBwcm9nX2tpbmQpOgorICAgICAgICAgICAgICAgIHByaW50KCcqKioqKioqKioqKioqKioqKioqKioqKioqKiogJXMgbWVzc2FnZSAqKioqKioqKioqKioqKioqKioqKioqKioqKionICUgcHJvZ19raW5kLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGU9ZnApCisgICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYudGVzdF9sb2dmaWxlKHRlc3QubmFtZSwgcHJvZ19raW5kLCBzZWxmLnRlc3RkaXIpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICAgICAgICAgIHdpdGggbG9nZmlsZV9vcGVuKHBhdGgsICdyJykgYXMgcHJvZ19mcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KHByb2dfZnAucmVhZCgpLCBmaWxlPWZwKQorICAgICAgICAgICAgZmlsZW5hbWUgPSB0aXRsZS5yZXBsYWNlKCcgJywgJ18nKSArICcubG9nJworICAgICAgICAgICAgd2l0aCBsb2dmaWxlX29wZW4ob3MucGF0aC5qb2luKHNlbGYubG9nZGlyLCBmaWxlbmFtZSksICd3KycpIGFzIGZwOgorICAgICAgICAgICAgICAgIGZvciB0ZXN0IGluIG1hcChzZWxmLl90ZXN0cy5fX2dldGl0ZW1fXywgaW5kZXhlcyk6CisgICAgICAgICAgICAgICAgICAgIGZwLndyaXRlKCdURVNUOiBbJXNdXG4nICUgdGVzdC5uYW1lKQorICAgICAgICAgICAgICAgICAgICBhZGRfcHJvZ19sb2coZnAsIHRlc3QsIHRlc3Quc2VydmVyLmtpbmQpCisgICAgICAgICAgICAgICAgICAgIGFkZF9wcm9nX2xvZyhmcCwgdGVzdCwgdGVzdC5jbGllbnQua2luZCkKKyAgICAgICAgICAgICAgICAgICAgZnAud3JpdGUoJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuJykKKyAgICAgICAgICAgIHByaW50KCclcyBhcmUgbG9nZ2VkIHRvICVzLyVzLyVzJyAlICh0aXRsZS5jYXBpdGFsaXplKCksIHNlbGYuX3Rlc3RkaXJfcmVsLCBMT0dfRElSLCBmaWxlbmFtZSkpCisKKyAgICBkZWYgZW5kKHNlbGYpOgorICAgICAgICBzZWxmLl9wcmludF9mb290ZXIoKQorICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3VuZXhwZWN0ZWRfZmFpbHVyZSkgPT0gMAorCisgICAgZGVmIGFkZF90ZXN0KHNlbGYsIHRlc3RfZGljdCk6CisgICAgICAgIHRlc3QgPSBUZXN0RW50cnkoc2VsZi50ZXN0ZGlyLCAqKnRlc3RfZGljdCkKKyAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbm90IHNlbGYuY29uY3VycmVudDoKKyAgICAgICAgICAgICAgICBzZWxmLm91dC53cml0ZShzZWxmLl9mb3JtYXRfdGVzdCh0ZXN0LCBGYWxzZSkpCisgICAgICAgICAgICAgICAgc2VsZi5vdXQuZmx1c2goKQorICAgICAgICAgICAgc2VsZi5fdGVzdHMuYXBwZW5kKHRlc3QpCisgICAgICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3Rlc3RzKSAtIDEKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2xvY2sucmVsZWFzZSgpCisKKyAgICBkZWYgYWRkX3Jlc3VsdChzZWxmLCBpbmRleCwgcmV0dXJuY29kZSwgZXhwaXJlZCwgcmV0cnlfY291bnQpOgorICAgICAgICBzZWxmLl9sb2NrLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmYWlsZWQgPSByZXR1cm5jb2RlIGlzIE5vbmUgb3IgcmV0dXJuY29kZSAhPSAwCisgICAgICAgICAgICBmbGFreSA9IG5vdCBmYWlsZWQgYW5kIHJldHJ5X2NvdW50ICE9IDAKKyAgICAgICAgICAgIHRlc3QgPSBzZWxmLl90ZXN0c1tpbmRleF0KKyAgICAgICAgICAgIGtub3duID0gdGVzdC5uYW1lIGluIHNlbGYuX2tub3duX2ZhaWx1cmVzCisgICAgICAgICAgICBpZiBmYWlsZWQ6CisgICAgICAgICAgICAgICAgaWYga25vd246CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnJXMgZmFpbGVkIGFzIGV4cGVjdGVkJyAlIHRlc3QubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZXhwZWN0ZWRfZmFpbHVyZS5hcHBlbmQoaW5kZXgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fbG9nLmluZm8oJ3VuZXhwZWN0ZWQgZmFpbHVyZTogJXMnICUgdGVzdC5uYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUuYXBwZW5kKGluZGV4KQorICAgICAgICAgICAgZWxpZiBmbGFreSBhbmQgbm90IGtub3duOgorICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCd1bmV4cGVjdGVkIGZsYWt5IHN1Y2Nlc3M6ICVzJyAlIHRlc3QubmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9mbGFreV9zdWNjZXNzLmFwcGVuZChpbmRleCkKKyAgICAgICAgICAgIGVsaWYgbm90IGZsYWt5IGFuZCBrbm93bjoKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuaW5mbygndW5leHBlY3RlZCBzdWNjZXNzOiAlcycgJSB0ZXN0Lm5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5fdW5leHBlY3RlZF9zdWNjZXNzLmFwcGVuZChpbmRleCkKKyAgICAgICAgICAgIHRlc3Quc3VjY2VzcyA9IG5vdCBmYWlsZWQKKyAgICAgICAgICAgIHRlc3QucmV0dXJuY29kZSA9IHJldHVybmNvZGUKKyAgICAgICAgICAgIHRlc3QucmV0cnlfY291bnQgPSByZXRyeV9jb3VudAorICAgICAgICAgICAgdGVzdC5leHBpcmVkID0gZXhwaXJlZAorICAgICAgICAgICAgdGVzdC5hc19leHBlY3RlZCA9IGtub3duID09IGZhaWxlZAorICAgICAgICAgICAgaWYgbm90IHNlbGYuY29uY3VycmVudDoKKyAgICAgICAgICAgICAgICBzZWxmLm91dC53cml0ZShzZWxmLl9yZXN1bHRfc3RyaW5nKHRlc3QpICsgJ1xuJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5vdXQud3JpdGUoc2VsZi5fZm9ybWF0X3Rlc3QodGVzdCkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQpkaWZmIC0tZ2l0IGEvdGVzdC9jcm9zc3J1bm5lci9ydW4ucHkgYi90ZXN0L2Nyb3NzcnVubmVyL3J1bi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjhmYjYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcm9zc3J1bm5lci9ydW4ucHkKQEAgLTAsMCArMSw0MjUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgY29udGV4dGxpYgoraW1wb3J0IG11bHRpcHJvY2Vzc2luZworaW1wb3J0IG11bHRpcHJvY2Vzc2luZy5tYW5hZ2VycworaW1wb3J0IG9zCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCByYW5kb20KK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQorCitmcm9tIC5jb21wYXQgaW1wb3J0IHN0cl9qb2luCitmcm9tIC5yZXBvcnQgaW1wb3J0IEV4ZWNSZXBvcnRlciwgU3VtbWFyeVJlcG9ydGVyCitmcm9tIC50ZXN0IGltcG9ydCBUZXN0RW50cnkKK2Zyb20gLnV0aWwgaW1wb3J0IGRvbWFpbl9zb2NrZXRfcGF0aAorCitSRVNVTFRfRVJST1IgPSA2NAorUkVTVUxUX1RJTUVPVVQgPSAxMjgKK1NJR05PTkUgPSAwCitTSUdLSUxMID0gMTUKKworIyBnbG9iYWxzCitwb3J0cyA9IE5vbmUKK3N0b3AgPSBOb25lCisKKworY2xhc3MgRXhlY3V0aW9uQ29udGV4dChvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjbWQsIGN3ZCwgZW52LCBzdG9wX3NpZ25hbCwgaXNfc2VydmVyLCByZXBvcnQpOgorICAgICAgICBzZWxmLl9sb2cgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCisgICAgICAgIHNlbGYuY21kID0gY21kCisgICAgICAgIHNlbGYuY3dkID0gY3dkCisgICAgICAgIHNlbGYuZW52ID0gZW52CisgICAgICAgIHNlbGYuc3RvcF9zaWduYWwgPSBzdG9wX3NpZ25hbAorICAgICAgICBzZWxmLmlzX3NlcnZlciA9IGlzX3NlcnZlcgorICAgICAgICBzZWxmLnJlcG9ydCA9IHJlcG9ydAorICAgICAgICBzZWxmLmV4cGlyZWQgPSBGYWxzZQorICAgICAgICBzZWxmLmtpbGxlZCA9IEZhbHNlCisgICAgICAgIHNlbGYucHJvYyA9IE5vbmUKKworICAgIGRlZiBfcG9wZW5fYXJncyhzZWxmKToKKyAgICAgICAgYXJncyA9IHsKKyAgICAgICAgICAgICdjd2QnOiBzZWxmLmN3ZCwKKyAgICAgICAgICAgICdlbnYnOiBzZWxmLmVudiwKKyAgICAgICAgICAgICdzdGRvdXQnOiBzZWxmLnJlcG9ydC5vdXQsCisgICAgICAgICAgICAnc3RkZXJyJzogc3VicHJvY2Vzcy5TVERPVVQsCisgICAgICAgIH0KKyAgICAgICAgIyBtYWtlIHN1cmUgY2hpbGQgcHJvY2Vzc2VzIGRvZXNuJ3QgcmVtYWluIGFmdGVyIGtpbGxpbmcKKyAgICAgICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ1dpbmRvd3MnOgorICAgICAgICAgICAgREVUQUNIRURfUFJPQ0VTUyA9IDB4MDAwMDAwMDgKKyAgICAgICAgICAgIGFyZ3MudXBkYXRlKGNyZWF0aW9uZmxhZ3M9REVUQUNIRURfUFJPQ0VTUyB8IHN1YnByb2Nlc3MuQ1JFQVRFX05FV19QUk9DRVNTX0dST1VQKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXJncy51cGRhdGUocHJlZXhlY19mbj1vcy5zZXRzaWQpCisgICAgICAgIHJldHVybiBhcmdzCisKKyAgICBkZWYgc3RhcnQoc2VsZik6CisgICAgICAgIGpvaW5lZCA9IHN0cl9qb2luKCcgJywgc2VsZi5jbWQpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnQ09NTUFORDogJXMnLCBqb2luZWQpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnV09SS0RJUjogJXMnLCBzZWxmLmN3ZCkKKyAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdMT0dGSUxFOiAlcycsIHNlbGYucmVwb3J0LmxvZ3BhdGgpCisgICAgICAgIHNlbGYucmVwb3J0LmJlZ2luKCkKKyAgICAgICAgc2VsZi5wcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihzZWxmLmNtZCwgKipzZWxmLl9wb3Blbl9hcmdzKCkpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnICAgIFBJRDogJWQnLCBzZWxmLnByb2MucGlkKQorICAgICAgICBzZWxmLl9sb2cuZGVidWcoJyAgIFBHSUQ6ICVkJywgb3MuZ2V0cGdpZChzZWxmLnByb2MucGlkKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Njb3BlZCgpCisKKyAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorICAgIGRlZiBfc2NvcGVkKHNlbGYpOgorICAgICAgICB5aWVsZCBzZWxmCisgICAgICAgIGlmIHNlbGYuaXNfc2VydmVyOgorICAgICAgICAgICAgIyB0aGUgc2VydmVyIGlzIHN1cHBvc2VkIHRvIHJ1biB1bnRpbCB3ZSBzdG9wIGl0CisgICAgICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnQuZGllZCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuc3RvcF9zaWduYWwgIT0gU0lHTk9ORToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5zaWd3YWl0KHNlbGYuc3RvcF9zaWduYWwpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnQuZW5kKHNlbGYucmV0dXJuY29kZSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LmtpbGxlZCgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zaWd3YWl0KFNJR0tJTEwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHRoZSBjbGllbnQgaXMgc3VwcG9zZWQgdG8gZXhpdCBub3JtYWxseQorICAgICAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LmVuZChzZWxmLnJldHVybmNvZGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc2lnd2FpdChTSUdLSUxMKQorICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LmtpbGxlZCgpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnW3swfV0gZXhpdGVkIHdpdGggcmV0dXJuIGNvZGUgezF9Jy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgc2VsZi5yZXR1cm5jb2RlKSkKKworICAgICMgU2VuZCBhIHNpZ25hbCB0byB0aGUgcHJvY2VzcyBhbmQgdGhlbiB3YWl0IGZvciBpdCB0byBlbmQKKyAgICAjIElmIHRoZSBzaWduYWwgcmVxdWVzdGVkIGlzIFNJR05PTkUsIG5vIHNpZ25hbCBpcyBzZW50LCBhbmQKKyAgICAjIGluc3RlYWQgd2UganVzdCB3YWl0IGZvciB0aGUgcHJvY2VzcyB0byBlbmQ7IGZ1cnRoZXIgaWYgaXQKKyAgICAjIGRvZXMgbm90IGVuZCBub3JtYWxseSB3aXRoIFNJR05PTkUsIHdlIG1hcmsgaXQgYXMgZXhwaXJlZC4KKyAgICAjIElmIHRoZSBwcm9jZXNzIGZhaWxzIHRvIGVuZCBhbmQgdGhlIHNpZ25hbCBpcyBub3QgU0lHS0lMTCwKKyAgICAjIGl0IHJlLXJ1bnMgd2l0aCBTSUdLSUxMIHNvIHRoYXQgYSByZWFsIHByb2Nlc3Mga2lsbCBvY2N1cnMKKyAgICAjIHJldHVybnMgVHJ1ZSBpZiB0aGUgcHJvY2VzcyBlbmRlZCwgRmFsc2UgaWYgaXQgbWF5IG5vdCBoYXZlCisgICAgZGVmIHNpZ3dhaXQoc2VsZiwgc2lnPVNJR0tJTEwsIHRpbWVvdXQ9Mik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNpZyAhPSBTSUdOT05FOgorICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnW3swfV0gc2VuZCBzaWduYWwgezF9Jy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgc2lnKSkKKyAgICAgICAgICAgICAgICBpZiBzaWcgPT0gU0lHS0lMTDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5raWxsZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSAhPSAnV2luZG93cyc6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5raWxscGcob3MuZ2V0cGdpZChzZWxmLnByb2MucGlkKSwgc2lnKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9jLnNlbmRfc2lnbmFsKHNpZykKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2cuaW5mbygnW3swfV0gRmFpbGVkIHRvIGtpbGwgcHJvY2VzcycuZm9ybWF0KHNlbGYucHJvYy5waWQpLCBleGNfaW5mbz1zeXMuZXhjX2luZm8oKSkKKyAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnW3swfV0gd2FpdCBiZWdpbiwgdGltZW91dCB7MX0gc2VjKHMpJy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgdGltZW91dCkpCisgICAgICAgICAgICBzZWxmLnByb2MuY29tbXVuaWNhdGUodGltZW91dD10aW1lb3V0KQorICAgICAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdbezB9XSBwcm9jZXNzIGVuZGVkIHdpdGggcmV0dXJuIGNvZGUgezF9Jy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgc2VsZi5yZXR1cm5jb2RlKSkKKyAgICAgICAgICAgIHNlbGYucmVwb3J0LmVuZChzZWxmLnJldHVybmNvZGUpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBleGNlcHQgc3VicHJvY2Vzcy5UaW1lb3V0RXhwaXJlZDoKKyAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCdbezB9XSB0aW1lb3V0IHdhaXRpbmcgZm9yIHByb2Nlc3MgdG8gZW5kJy5mb3JtYXQoc2VsZi5wcm9jLnBpZCkpCisgICAgICAgICAgICBpZiBzaWcgPT0gU0lHTk9ORToKKyAgICAgICAgICAgICAgICBzZWxmLmV4cGlyZWQgPSBUcnVlCisgICAgICAgICAgICByZXR1cm4gRmFsc2UgaWYgc2lnID09IFNJR0tJTEwgZWxzZSBzZWxmLnNpZ3dhaXQoU0lHS0lMTCwgMSkKKworICAgICMgY2FsbGVkIG9uIHRoZSBjbGllbnQgcHJvY2VzcyB0byB3YWl0IGZvciBpdCB0byBlbmQgbmF0dXJhbGx5CisgICAgZGVmIHdhaXQoc2VsZiwgdGltZW91dCk6CisgICAgICAgIHNlbGYuc2lnd2FpdChTSUdOT05FLCB0aW1lb3V0KQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHJldHVybmNvZGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnByb2MucmV0dXJuY29kZSBpZiBzZWxmLnByb2MgZWxzZSBOb25lCisKKworZGVmIGV4ZWNfY29udGV4dChwb3J0LCBsb2dkaXIsIHRlc3QsIHByb2csIGlzX3NlcnZlcik6CisgICAgcmVwb3J0ID0gRXhlY1JlcG9ydGVyKGxvZ2RpciwgdGVzdCwgcHJvZykKKyAgICBwcm9nLmJ1aWxkX2NvbW1hbmQocG9ydCkKKyAgICByZXR1cm4gRXhlY3V0aW9uQ29udGV4dChwcm9nLmNvbW1hbmQsIHByb2cud29ya2RpciwgcHJvZy5lbnYsIHByb2cuc3RvcF9zaWduYWwsIGlzX3NlcnZlciwgcmVwb3J0KQorCisKK2RlZiBydW5fdGVzdCh0ZXN0ZGlyLCBsb2dkaXIsIHRlc3RfZGljdCwgbWF4X3JldHJ5LCBhc3luY19tb2RlPVRydWUpOgorICAgIGxvZ2dlciA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKworICAgIGRlZiBlbnN1cmVfc29ja2V0X29wZW4oc3YsIHBvcnQsIHRlc3QpOgorICAgICAgICBzbGVwdCA9IDAuMQorICAgICAgICB0aW1lLnNsZWVwKHNsZXB0KQorICAgICAgICBzbGVlcF9zdGVwID0gMC4xCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBpZiBzbGVwdCA+IHRlc3QuZGVsYXk6CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ1t7MH1dIHNsZXB0IGZvciB7MX0gc2Vjb25kcyBidXQgc2VydmVyIGlzIG5vdCBvcGVuJy5mb3JtYXQoc3YucHJvYy5waWQsIHNsZXB0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGlmIHRlc3Quc29ja2V0ID09ICdkb21haW4nOgorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhkb21haW5fc29ja2V0X3BhdGgocG9ydCkpOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1t7MH1dIGRvbWFpbih1bml4KSBzb2NrZXQgbm90IGF2YWlsYWJsZSB5ZXQuIHNsZXB0IGZvciB7MX0gc2Vjb25kcyBzbyBmYXInLmZvcm1hdChzdi5wcm9jLnBpZCwgc2xlcHQpKQorICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKHNsZWVwX3N0ZXApCisgICAgICAgICAgICAgICAgICAgIHNsZXB0ICs9IHNsZWVwX3N0ZXAKKyAgICAgICAgICAgIGVsaWYgdGVzdC5zb2NrZXQgPT0gJ2Fic3RyYWN0JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIENyZWF0ZSBzb2NrZXRzIGV2ZXJ5IGl0ZXJhdGlvbiBiZWNhdXNlIHJlZnVzZWQgc29ja2V0cyBjYW5ub3QgYmUKKyAgICAgICAgICAgICAgICAjIHJldXNlZCBvbiBzb21lIHN5c3RlbXMuCisgICAgICAgICAgICAgICAgc29jazQgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgICAgICAgICBzb2NrNiA9IHNvY2tldC5zb2NrZXQoZmFtaWx5PXNvY2tldC5BRl9JTkVUNikKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGlmIHNvY2s0LmNvbm5lY3RfZXgoKCcxMjcuMC4wLjEnLCBwb3J0KSkgPT0gMCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Igc29jazYuY29ubmVjdF9leCgoJzo6MScsIHBvcnQpKSA9PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICAgICAgaWYgc3YucHJvYy5wb2xsKCkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybignW3swfV0gc2VydmVyIHByb2Nlc3MgaXMgZXhpdGVkJy5mb3JtYXQoc3YucHJvYy5waWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnW3swfV0gc29ja2V0IG5vdCBhdmFpbGFibGUgeWV0LiBzbGVwdCBmb3IgezF9IHNlY29uZHMgc28gZmFyJy5mb3JtYXQoc3YucHJvYy5waWQsIHNsZXB0KSkKKyAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcChzbGVlcF9zdGVwKQorICAgICAgICAgICAgICAgICAgICBzbGVwdCArPSBzbGVlcF9zdGVwCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgc29jazQuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICBzb2NrNi5jbG9zZSgpCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1t7MH1dIHNlcnZlciByZWFkeSAtIHdhaXRlZCBmb3IgezF9IHNlY29uZHMnLmZvcm1hdChzdi5wcm9jLnBpZCwgc2xlcHQpKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIHRyeToKKyAgICAgICAgbWF4X2JpbmRfcmV0cnkgPSAzCisgICAgICAgIHJldHJ5X2NvdW50ID0gMAorICAgICAgICBiaW5kX3JldHJ5X2NvdW50ID0gMAorICAgICAgICB0ZXN0ID0gVGVzdEVudHJ5KHRlc3RkaXIsICoqdGVzdF9kaWN0KQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgaWYgc3RvcC5pc19zZXQoKToKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1NraXBwaW5nIGJlY2F1c2Ugc2h1dHRpbmcgZG93bicpCisgICAgICAgICAgICAgICAgcmV0dXJuIChyZXRyeV9jb3VudCwgTm9uZSkKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnU3RhcnQnKQorICAgICAgICAgICAgd2l0aCBQb3J0QWxsb2NhdG9yLmFsbG9jX3BvcnRfc2NvcGVkKHBvcnRzLCB0ZXN0LnNvY2tldCkgYXMgcG9ydDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1N0YXJ0IHdpdGggcG9ydCAlZCcgJSBwb3J0KQorICAgICAgICAgICAgICAgIHN2ID0gZXhlY19jb250ZXh0KHBvcnQsIGxvZ2RpciwgdGVzdCwgdGVzdC5zZXJ2ZXIsIFRydWUpCisgICAgICAgICAgICAgICAgY2wgPSBleGVjX2NvbnRleHQocG9ydCwgbG9nZGlyLCB0ZXN0LCB0ZXN0LmNsaWVudCwgRmFsc2UpCisKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1N0YXJ0aW5nIHNlcnZlcicpCisgICAgICAgICAgICAgICAgd2l0aCBzdi5zdGFydCgpOgorICAgICAgICAgICAgICAgICAgICBwb3J0X29rID0gZW5zdXJlX3NvY2tldF9vcGVuKHN2LCBwb3J0LCB0ZXN0KQorICAgICAgICAgICAgICAgICAgICBpZiBwb3J0X29rOgorICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdF9yZXRyeV9jb3VudCA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9jb25uZWN0X3JldHJ5ID0gMTIKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfcmV0cnlfd2FpdCA9IDAuMjUKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3YucHJvYy5wb2xsKCkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdub3Qgc3RhcnRpbmcgY2xpZW50IGJlY2F1c2Ugc2VydmVyIHByb2Nlc3MgaXMgYWJzZW50JykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1N0YXJ0aW5nIGNsaWVudCcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2wuc3RhcnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnV2FpdGluZyBjbGllbnQgKHVwIHRvICVkIHNlY3MpJyAlIHRlc3QudGltZW91dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbC53YWl0KHRlc3QudGltZW91dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgY2wucmVwb3J0Lm1heWJlX2ZhbHNlX3Bvc2l0aXZlKCkgb3IgY29ubmVjdF9yZXRyeV9jb3VudCA+PSBtYXhfY29ubmVjdF9yZXRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29ubmVjdF9yZXRyeV9jb3VudCA+IDAgYW5kIGNvbm5lY3RfcmV0cnlfY291bnQgPCBtYXhfY29ubmVjdF9yZXRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdbJXNdOiBDb25uZWN0ZWQgYWZ0ZXIgJWQgcmV0cnkgKCUuMmYgc2VjIGVhY2gpJyAlICh0ZXN0LnNlcnZlci5uYW1lLCBjb25uZWN0X3JldHJ5X2NvdW50LCBjb25uZWN0X3JldHJ5X3dhaXQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFdhaXQgZm9yIDUwbXMgdG8gc2VlIGlmIHNlcnZlciBkb2VzIG5vdCBkaWUgYXQgdGhlIGVuZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjA1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnU2VydmVyIG1heSBub3QgYmUgcmVhZHksIHdhaXRpbmcgJS4yZiBzZWNvbmQuLi4nICUgY29ubmVjdF9yZXRyeV93YWl0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoY29ubmVjdF9yZXRyeV93YWl0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfcmV0cnlfY291bnQgKz0gMQorCisgICAgICAgICAgICBpZiBzdi5yZXBvcnQubWF5YmVfZmFsc2VfcG9zaXRpdmUoKSBhbmQgYmluZF9yZXRyeV9jb3VudCA8IG1heF9iaW5kX3JldHJ5OgorICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdbJXNdOiBEZXRlY3RlZCBzb2NrZXQgYmluZCBmYWlsdXJlLCByZXRyeWluZy4uLicsIHRlc3Quc2VydmVyLm5hbWUpCisgICAgICAgICAgICAgICAgYmluZF9yZXRyeV9jb3VudCArPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJFU1VMVF9USU1FT1VUIGlmIGNsLmV4cGlyZWQgZWxzZSBjbC5yZXR1cm5jb2RlIGlmIChjbC5wcm9jIGFuZCBjbC5wcm9jLnBvbGwoKSkgaXMgbm90IE5vbmUgZWxzZSBSRVNVTFRfRVJST1IKKworICAgICAgICAgICAgICAgICMgRm9yIHNlcnZlcnMgdGhhdCBoYW5kbGUgYSBjb250cm9sbGVkIHNodXRkb3duIGJ5IHNpZ25hbAorICAgICAgICAgICAgICAgICMgaWYgdGhleSBhcmUga2lsbGVkLCBvciByZXR1cm4gYW4gZXJyb3IgY29kZSwgdGhhdCBpcyBhCisgICAgICAgICAgICAgICAgIyBwcm9ibGVtLiAgRm9yIHNlcnZlcnMgdGhhdCBhcmUgbm90IHNpZ25hbC1hd2FyZSwgd2Ugc2ltcGx5CisgICAgICAgICAgICAgICAgIyBraWxsIHRoZW0gb2ZmOyBpZiB3ZSBkaWRuJ3Qga2lsbCB0aGVtIG9mZiwgc29tZXRoaW5nIGVsc2UKKyAgICAgICAgICAgICAgICAjIGhhcHBlbmVkIChjcmFzaGVkPykKKyAgICAgICAgICAgICAgICBpZiB0ZXN0LnNlcnZlci5zdG9wX3NpZ25hbCAhPSAwOgorICAgICAgICAgICAgICAgICAgICBpZiBzdi5raWxsZWQgb3Igc3YucmV0dXJuY29kZSA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gUkVTVUxUX0VSUk9SCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHN2LmtpbGxlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBSRVNVTFRfRVJST1IKKworICAgICAgICAgICAgICAgIGlmIHJlc3VsdCA9PSAwIG9yIHJldHJ5X2NvdW50ID49IG1heF9yZXRyeToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXRyeV9jb3VudCwgcmVzdWx0KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdbJXMtJXNdOiB0ZXN0IGZhaWxlZCwgcmV0cnlpbmcuLi4nLCB0ZXN0LnNlcnZlci5uYW1lLCB0ZXN0LmNsaWVudC5uYW1lKQorICAgICAgICAgICAgICAgICAgICByZXRyeV9jb3VudCArPSAxCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgaWYgbm90IGFzeW5jX21vZGU6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBsb2dnZXIud2FybignRXJyb3IgZXhlY3V0aW5nIFslc10nLCB0ZXN0Lm5hbWUsIGV4Y19pbmZvPVRydWUpCisgICAgICAgIHJldHVybiAocmV0cnlfY291bnQsIFJFU1VMVF9FUlJPUikKKyAgICBleGNlcHQ6CisgICAgICAgIGxvZ2dlci5pbmZvKCdJbnRlcnJ1cHRlZCBleGVjdXRpb24nLCBleGNfaW5mbz1UcnVlKQorICAgICAgICBpZiBub3QgYXN5bmNfbW9kZToKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHN0b3Auc2V0KCkKKyAgICAgICAgcmV0dXJuIChyZXRyeV9jb3VudCwgUkVTVUxUX0VSUk9SKQorCisKK2NsYXNzIFBvcnRBbGxvY2F0b3Iob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2xvZyA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICAgICAgc2VsZi5fbG9jayA9IG11bHRpcHJvY2Vzc2luZy5Mb2NrKCkKKyAgICAgICAgc2VsZi5fcG9ydHMgPSBzZXQoKQorICAgICAgICBzZWxmLl9kb21fcG9ydHMgPSBzZXQoKQorICAgICAgICBzZWxmLl9sYXN0X2FsbG9jID0gMAorCisgICAgZGVmIF9nZXRfdGNwX3BvcnQoc2VsZik6CisgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1JFVVNFQUREUiwgMSkKKyAgICAgICAgc29jay5iaW5kKCgnJywgMCkpCisgICAgICAgIHBvcnQgPSBzb2NrLmdldHNvY2tuYW1lKClbMV0KKyAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb2sgPSBwb3J0IG5vdCBpbiBzZWxmLl9wb3J0cworICAgICAgICAgICAgaWYgb2s6CisgICAgICAgICAgICAgICAgc2VsZi5fcG9ydHMuYWRkKHBvcnQpCisgICAgICAgICAgICAgICAgc2VsZi5fbGFzdF9hbGxvYyA9IHRpbWUudGltZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorICAgICAgICAgICAgc29jay5jbG9zZSgpCisgICAgICAgIHJldHVybiBwb3J0IGlmIG9rIGVsc2Ugc2VsZi5fZ2V0X3RjcF9wb3J0KCkKKworICAgIGRlZiBfZ2V0X2RvbWFpbl9wb3J0KHNlbGYpOgorICAgICAgICBwb3J0ID0gcmFuZG9tLnJhbmRpbnQoMTAyNCwgNjU1MzYpCisgICAgICAgIHNlbGYuX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9rID0gcG9ydCBub3QgaW4gc2VsZi5fZG9tX3BvcnRzCisgICAgICAgICAgICBpZiBvazoKKyAgICAgICAgICAgICAgICBzZWxmLl9kb21fcG9ydHMuYWRkKHBvcnQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorICAgICAgICByZXR1cm4gcG9ydCBpZiBvayBlbHNlIHNlbGYuX2dldF9kb21haW5fcG9ydCgpCisKKyAgICBkZWYgYWxsb2NfcG9ydChzZWxmLCBzb2NrZXRfdHlwZSk6CisgICAgICAgIGlmIHNvY2tldF90eXBlIGluICgnZG9tYWluJywgJ2Fic3RyYWN0Jyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X2RvbWFpbl9wb3J0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRfdGNwX3BvcnQoKQorCisgICAgIyBzdGF0aWMgbWV0aG9kIGZvciBpbnRlci1wcm9jZXNzIGludm9rYXRpb24KKyAgICBAc3RhdGljbWV0aG9kCisgICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKKyAgICBkZWYgYWxsb2NfcG9ydF9zY29wZWQoYWxsb2NhdG9yLCBzb2NrZXRfdHlwZSk6CisgICAgICAgIHBvcnQgPSBhbGxvY2F0b3IuYWxsb2NfcG9ydChzb2NrZXRfdHlwZSkKKyAgICAgICAgeWllbGQgcG9ydAorICAgICAgICBhbGxvY2F0b3IuZnJlZV9wb3J0KHNvY2tldF90eXBlLCBwb3J0KQorCisgICAgZGVmIGZyZWVfcG9ydChzZWxmLCBzb2NrZXRfdHlwZSwgcG9ydCk6CisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnZnJlZV9wb3J0JykKKyAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc29ja2V0X3R5cGUgPT0gJ2RvbWFpbic6CisgICAgICAgICAgICAgICAgc2VsZi5fZG9tX3BvcnRzLnJlbW92ZShwb3J0KQorICAgICAgICAgICAgICAgIHBhdGggPSBkb21haW5fc29ja2V0X3BhdGgocG9ydCkKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHBhdGgpCisgICAgICAgICAgICBlbGlmIHNvY2tldF90eXBlID09ICdhYnN0cmFjdCc6CisgICAgICAgICAgICAgICAgc2VsZi5fZG9tX3BvcnRzLnJlbW92ZShwb3J0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9wb3J0cy5yZW1vdmUocG9ydCkKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBzZWxmLl9sb2cuaW5mbygnRXJyb3Igd2hpbGUgZnJlZWluZyBwb3J0JywgZXhjX2luZm89c3lzLmV4Y19pbmZvKCkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorCisKK2NsYXNzIE5vbkFzeW5jUmVzdWx0KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgc2VsZi5fdmFsdWUgPSB2YWx1ZQorCisgICAgZGVmIGdldChzZWxmLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICByZXR1cm4gc2VsZi5fdmFsdWUKKworICAgIGRlZiB3YWl0KHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiByZWFkeShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBzdWNjZXNzZnVsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdmFsdWUgPT0gMAorCisKK2NsYXNzIFRlc3REaXNwYXRjaGVyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RkaXIsIGJhc2VkaXIsIGxvZ2Rpcl9yZWwsIGNvbmN1cnJlbmN5KToKKyAgICAgICAgc2VsZi5fbG9nID0gbXVsdGlwcm9jZXNzaW5nLmdldF9sb2dnZXIoKQorICAgICAgICBzZWxmLnRlc3RkaXIgPSB0ZXN0ZGlyCisgICAgICAgIHNlbGYuX3JlcG9ydCA9IFN1bW1hcnlSZXBvcnRlcihiYXNlZGlyLCBsb2dkaXJfcmVsLCBjb25jdXJyZW5jeSA+IDEpCisgICAgICAgIHNlbGYubG9nZGlyID0gc2VsZi5fcmVwb3J0LnRlc3RkaXIKKyAgICAgICAgIyBzZWVtcyBuZWVkZWQgZm9yIHB5dGhvbiAyLnggdG8gaGFuZGxlIGtleWJvYXJkIGludGVycnVwdAorICAgICAgICBzZWxmLl9zdG9wID0gbXVsdGlwcm9jZXNzaW5nLkV2ZW50KCkKKyAgICAgICAgc2VsZi5fYXN5bmMgPSBjb25jdXJyZW5jeSA+IDEKKyAgICAgICAgaWYgbm90IHNlbGYuX2FzeW5jOgorICAgICAgICAgICAgc2VsZi5fcG9vbCA9IE5vbmUKKyAgICAgICAgICAgIGdsb2JhbCBzdG9wCisgICAgICAgICAgICBnbG9iYWwgcG9ydHMKKyAgICAgICAgICAgIHN0b3AgPSBzZWxmLl9zdG9wCisgICAgICAgICAgICBwb3J0cyA9IFBvcnRBbGxvY2F0b3IoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fbSA9IG11bHRpcHJvY2Vzc2luZy5tYW5hZ2Vycy5CYXNlTWFuYWdlcigpCisgICAgICAgICAgICBzZWxmLl9tLnJlZ2lzdGVyKCdwb3J0cycsIFBvcnRBbGxvY2F0b3IpCisgICAgICAgICAgICBzZWxmLl9tLnN0YXJ0KCkKKyAgICAgICAgICAgIHNlbGYuX3Bvb2wgPSBtdWx0aXByb2Nlc3NpbmcuUG9vbChjb25jdXJyZW5jeSwgc2VsZi5fcG9vbF9pbml0LCAoc2VsZi5fbS5hZGRyZXNzLCkpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygKKyAgICAgICAgICAgICdUZXN0RGlzcGF0Y2hlciBzdGFydGVkIHdpdGggJWQgY29uY3VycmVudCBqb2JzJyAlIGNvbmN1cnJlbmN5KQorCisgICAgZGVmIF9wb29sX2luaXQoc2VsZiwgYWRkcmVzcyk6CisgICAgICAgIGdsb2JhbCBzdG9wCisgICAgICAgIGdsb2JhbCBtCisgICAgICAgIGdsb2JhbCBwb3J0cworICAgICAgICBzdG9wID0gc2VsZi5fc3RvcAorICAgICAgICBtID0gbXVsdGlwcm9jZXNzaW5nLm1hbmFnZXJzLkJhc2VNYW5hZ2VyKGFkZHJlc3MpCisgICAgICAgIG0uY29ubmVjdCgpCisgICAgICAgIHBvcnRzID0gbS5wb3J0cygpCisKKyAgICBkZWYgX2Rpc3BhdGNoX3N5bmMoc2VsZiwgdGVzdCwgY29udCwgbWF4X3JldHJ5KToKKyAgICAgICAgciA9IHJ1bl90ZXN0KHNlbGYudGVzdGRpciwgc2VsZi5sb2dkaXIsIHRlc3QsIG1heF9yZXRyeSwgYXN5bmNfbW9kZT1GYWxzZSkKKyAgICAgICAgY29udChyKQorICAgICAgICByZXR1cm4gTm9uQXN5bmNSZXN1bHQocikKKworICAgIGRlZiBfZGlzcGF0Y2hfYXN5bmMoc2VsZiwgdGVzdCwgY29udCwgbWF4X3JldHJ5KToKKyAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdfZGlzcGF0Y2hfYXN5bmMnKQorICAgICAgICByZXR1cm4gc2VsZi5fcG9vbC5hcHBseV9hc3luYyhmdW5jPXJ1bl90ZXN0LCBhcmdzPShzZWxmLnRlc3RkaXIsIHNlbGYubG9nZGlyLCB0ZXN0LCBtYXhfcmV0cnkpLCBjYWxsYmFjaz1jb250KQorCisgICAgZGVmIGRpc3BhdGNoKHNlbGYsIHRlc3QsIG1heF9yZXRyeSk6CisgICAgICAgIGluZGV4ID0gc2VsZi5fcmVwb3J0LmFkZF90ZXN0KHRlc3QpCisKKyAgICAgICAgZGVmIGNvbnQocmVzdWx0KToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9zdG9wLmlzX3NldCgpOgorICAgICAgICAgICAgICAgIGlmIHJlc3VsdCBhbmQgbGVuKHJlc3VsdCkgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0cnlfY291bnQsIHJldHVybmNvZGUgPSByZXN1bHQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXRyeV9jb3VudCA9IDAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuY29kZSA9IFJFU1VMVF9FUlJPUgorICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnZnJlZWluZyBwb3J0JykKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ2FkZGluZyByZXN1bHQnKQorICAgICAgICAgICAgICAgIHNlbGYuX3JlcG9ydC5hZGRfcmVzdWx0KGluZGV4LCByZXR1cm5jb2RlLCByZXR1cm5jb2RlID09IFJFU1VMVF9USU1FT1VULCByZXRyeV9jb3VudCkKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ2ZpbmlzaCBjb250aW51YXRpb24nKQorICAgICAgICBmbiA9IHNlbGYuX2Rpc3BhdGNoX2FzeW5jIGlmIHNlbGYuX2FzeW5jIGVsc2Ugc2VsZi5fZGlzcGF0Y2hfc3luYworICAgICAgICByZXR1cm4gZm4odGVzdCwgY29udCwgbWF4X3JldHJ5KQorCisgICAgZGVmIHdhaXQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2FzeW5jOgorICAgICAgICAgICAgc2VsZi5fcG9vbC5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLl9wb29sLmpvaW4oKQorICAgICAgICAgICAgc2VsZi5fbS5zaHV0ZG93bigpCisgICAgICAgIHJldHVybiBzZWxmLl9yZXBvcnQuZW5kKCkKKworICAgIGRlZiB0ZXJtaW5hdGUoc2VsZik6CisgICAgICAgIHNlbGYuX3N0b3Auc2V0KCkKKyAgICAgICAgaWYgc2VsZi5fYXN5bmM6CisgICAgICAgICAgICBzZWxmLl9wb29sLnRlcm1pbmF0ZSgpCisgICAgICAgICAgICBzZWxmLl9wb29sLmpvaW4oKQorICAgICAgICAgICAgc2VsZi5fbS5zaHV0ZG93bigpCmRpZmYgLS1naXQgYS90ZXN0L2Nyb3NzcnVubmVyL3NldHVwLmNmZyBiL3Rlc3QvY3Jvc3NydW5uZXIvc2V0dXAuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYTFmOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Nyb3NzcnVubmVyL3NldHVwLmNmZwpAQCAtMCwwICsxLDIgQEAKK1tmbGFrZThdCittYXgtbGluZS1sZW5ndGggPSAxMDAKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvdGVzdC5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTkxMjg0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcm9zc3J1bm5lci90ZXN0LnB5CkBAIC0wLDAgKzEsMTQ5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGNvcHkKK2ltcG9ydCBtdWx0aXByb2Nlc3NpbmcKK2ltcG9ydCBvcworaW1wb3J0IHN5cworZnJvbSAuY29tcGF0IGltcG9ydCBwYXRoX2pvaW4KK2Zyb20gLnV0aWwgaW1wb3J0IG1lcmdlX2RpY3QsIGRvbWFpbl9zb2NrZXRfcGF0aAorCisKK2NsYXNzIFRlc3RQcm9ncmFtKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGtpbmQsIG5hbWUsIHByb3RvY29sLCB0cmFuc3BvcnQsIHNvY2tldCwgd29ya2Rpciwgc3RvcF9zaWduYWwsIGNvbW1hbmQsIGVudj1Ob25lLAorICAgICAgICAgICAgICAgICBleHRyYV9hcmdzPVtdLCBleHRyYV9hcmdzMj1bXSwgam9pbl9hcmdzPUZhbHNlLCAqKmt3YXJncyk6CisKKyAgICAgICAgc2VsZi5raW5kID0ga2luZAorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYucHJvdG9jb2wgPSBwcm90b2NvbAorICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IHRyYW5zcG9ydAorICAgICAgICBzZWxmLnNvY2tldCA9IHNvY2tldAorICAgICAgICBzZWxmLndvcmtkaXIgPSB3b3JrZGlyCisgICAgICAgIHNlbGYuc3RvcF9zaWduYWwgPSBzdG9wX3NpZ25hbAorICAgICAgICBzZWxmLmNvbW1hbmQgPSBOb25lCisgICAgICAgIHNlbGYuX2Jhc2VfY29tbWFuZCA9IHNlbGYuX2ZpeF9jbWRfcGF0aChjb21tYW5kKQorICAgICAgICBpZiBlbnY6CisgICAgICAgICAgICBzZWxmLmVudiA9IGNvcHkuY29weShvcy5lbnZpcm9uKQorICAgICAgICAgICAgc2VsZi5lbnYudXBkYXRlKGVudikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZW52ID0gb3MuZW52aXJvbgorICAgICAgICBzZWxmLl9leHRyYV9hcmdzID0gZXh0cmFfYXJncworICAgICAgICBzZWxmLl9leHRyYV9hcmdzMiA9IGV4dHJhX2FyZ3MyCisgICAgICAgIHNlbGYuX2pvaW5fYXJncyA9IGpvaW5fYXJncworCisgICAgZGVmIF9maXhfY21kX3BhdGgoc2VsZiwgY21kKToKKyAgICAgICAgIyBpZiB0aGUgYXJnIGlzIGEgZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIG1ha2UgaXQgcGF0aAorICAgICAgICBkZWYgYWJzX2lmX2V4aXN0cyhhcmcpOgorICAgICAgICAgICAgcCA9IHBhdGhfam9pbihzZWxmLndvcmtkaXIsIGFyZykKKyAgICAgICAgICAgIHJldHVybiBwIGlmIG9zLnBhdGguZXhpc3RzKHApIGVsc2UgYXJnCisKKyAgICAgICAgaWYgY21kWzBdID09ICdweXRob24nOgorICAgICAgICAgICAgY21kWzBdID0gc3lzLmV4ZWN1dGFibGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNtZFswXSA9IGFic19pZl9leGlzdHMoY21kWzBdKQorICAgICAgICByZXR1cm4gY21kCisKKyAgICBkZWYgX3NvY2tldF9hcmdzKHNlbGYsIHNvY2tldCwgcG9ydCk6CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAnaXAtc3NsJzogWyctLXNzbCddLAorICAgICAgICAgICAgJ2RvbWFpbic6IFsnLS1kb21haW4tc29ja2V0PSVzJyAlIGRvbWFpbl9zb2NrZXRfcGF0aChwb3J0KV0sCisgICAgICAgICAgICAnYWJzdHJhY3QnOiBbJy0tYWJzdHJhY3QtbmFtZXNwYWNlJywgJy0tZG9tYWluLXNvY2tldD0lcycgJSBkb21haW5fc29ja2V0X3BhdGgocG9ydCldLAorICAgICAgICB9LmdldChzb2NrZXQsIE5vbmUpCisKKyAgICBkZWYgX3RyYW5zcG9ydF9hcmdzKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAnemxpYic6IFsnLS16bGliJ10sCisgICAgICAgIH0uZ2V0KHRyYW5zcG9ydCwgTm9uZSkKKworICAgIGRlZiBidWlsZF9jb21tYW5kKHNlbGYsIHBvcnQpOgorICAgICAgICBjbWQgPSBjb3B5LmNvcHkoc2VsZi5fYmFzZV9jb21tYW5kKQorICAgICAgICBhcmdzID0gY29weS5jb3B5KHNlbGYuX2V4dHJhX2FyZ3MyKQorICAgICAgICBhcmdzLmFwcGVuZCgnLS1wcm90b2NvbD0nICsgc2VsZi5wcm90b2NvbCkKKyAgICAgICAgYXJncy5hcHBlbmQoJy0tdHJhbnNwb3J0PScgKyBzZWxmLnRyYW5zcG9ydCkKKyAgICAgICAgdHJhbnNwb3J0X2FyZ3MgPSBzZWxmLl90cmFuc3BvcnRfYXJncyhzZWxmLnRyYW5zcG9ydCkKKyAgICAgICAgaWYgdHJhbnNwb3J0X2FyZ3M6CisgICAgICAgICAgICBhcmdzICs9IHRyYW5zcG9ydF9hcmdzCisgICAgICAgIHNvY2tldF9hcmdzID0gc2VsZi5fc29ja2V0X2FyZ3Moc2VsZi5zb2NrZXQsIHBvcnQpCisgICAgICAgIGlmIHNvY2tldF9hcmdzOgorICAgICAgICAgICAgYXJncyArPSBzb2NrZXRfYXJncworICAgICAgICBhcmdzLmFwcGVuZCgnLS1wb3J0PSVkJyAlIHBvcnQpCisgICAgICAgIGlmIHNlbGYuX2pvaW5fYXJnczoKKyAgICAgICAgICAgIGNtZC5hcHBlbmQoJyVzJyAlICIgIi5qb2luKGFyZ3MpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY21kLmV4dGVuZChhcmdzKQorICAgICAgICBpZiBzZWxmLl9leHRyYV9hcmdzOgorICAgICAgICAgICAgY21kLmV4dGVuZChzZWxmLl9leHRyYV9hcmdzKQorICAgICAgICBzZWxmLmNvbW1hbmQgPSBjbWQKKyAgICAgICAgcmV0dXJuIHNlbGYuY29tbWFuZAorCisKK2NsYXNzIFRlc3RFbnRyeShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0ZGlyLCBzZXJ2ZXIsIGNsaWVudCwgZGVsYXksIHRpbWVvdXQsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi50ZXN0ZGlyID0gdGVzdGRpcgorICAgICAgICBzZWxmLl9sb2cgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCisgICAgICAgIHNlbGYuX2NvbmZpZyA9IGt3YXJncworICAgICAgICBzZWxmLnByb3RvY29sID0ga3dhcmdzWydwcm90b2NvbCddCisgICAgICAgIHNlbGYudHJhbnNwb3J0ID0ga3dhcmdzWyd0cmFuc3BvcnQnXQorICAgICAgICBzZWxmLnNvY2tldCA9IGt3YXJnc1snc29ja2V0J10KKyAgICAgICAgc3J2X2RpY3QgPSBzZWxmLl9maXhfd29ya2RpcihtZXJnZV9kaWN0KHNlbGYuX2NvbmZpZywgc2VydmVyKSkKKyAgICAgICAgY2xpX2RpY3QgPSBzZWxmLl9maXhfd29ya2RpcihtZXJnZV9kaWN0KHNlbGYuX2NvbmZpZywgY2xpZW50KSkKKyAgICAgICAgY2xpX2RpY3RbJ2V4dHJhX2FyZ3MyJ10gPSBzcnZfZGljdC5wb3AoJ3JlbW90ZV9hcmdzJywgW10pCisgICAgICAgIHNydl9kaWN0WydleHRyYV9hcmdzMiddID0gY2xpX2RpY3QucG9wKCdyZW1vdGVfYXJncycsIFtdKQorICAgICAgICBzZWxmLnNlcnZlciA9IFRlc3RQcm9ncmFtKCdzZXJ2ZXInLCAqKnNydl9kaWN0KQorICAgICAgICBzZWxmLmNsaWVudCA9IFRlc3RQcm9ncmFtKCdjbGllbnQnLCAqKmNsaV9kaWN0KQorICAgICAgICBzZWxmLmRlbGF5ID0gZGVsYXkKKyAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dAorICAgICAgICBzZWxmLl9uYW1lID0gTm9uZQorICAgICAgICAjIHJlc3VsdHMKKyAgICAgICAgc2VsZi5zdWNjZXNzID0gTm9uZQorICAgICAgICBzZWxmLmFzX2V4cGVjdGVkID0gTm9uZQorICAgICAgICBzZWxmLnJldHVybmNvZGUgPSBOb25lCisgICAgICAgIHNlbGYuZXhwaXJlZCA9IEZhbHNlCisgICAgICAgIHNlbGYucmV0cnlfY291bnQgPSAwCisKKyAgICBkZWYgX2ZpeF93b3JrZGlyKHNlbGYsIGNvbmZpZyk6CisgICAgICAgIGtleSA9ICd3b3JrZGlyJworICAgICAgICBwYXRoID0gY29uZmlnLmdldChrZXksIE5vbmUpCisgICAgICAgIGlmIG5vdCBwYXRoOgorICAgICAgICAgICAgcGF0aCA9IHNlbGYudGVzdGRpcgorICAgICAgICBpZiBvcy5wYXRoLmlzYWJzKHBhdGgpOgorICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgucmVhbHBhdGgocGF0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKHBhdGhfam9pbihzZWxmLnRlc3RkaXIsIHBhdGgpKQorICAgICAgICBjb25maWcudXBkYXRlKHtrZXk6IHBhdGh9KQorICAgICAgICByZXR1cm4gY29uZmlnCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZ2V0X25hbWUoY2xzLCBzZXJ2ZXIsIGNsaWVudCwgcHJvdG9jb2wsIHRyYW5zcG9ydCwgc29ja2V0LCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gJyVzLSVzXyVzXyVzLSVzJyAlIChzZXJ2ZXIsIGNsaWVudCwgcHJvdG9jb2wsIHRyYW5zcG9ydCwgc29ja2V0KQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9uYW1lOgorICAgICAgICAgICAgc2VsZi5fbmFtZSA9IHNlbGYuZ2V0X25hbWUoCisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIubmFtZSwgc2VsZi5jbGllbnQubmFtZSwgc2VsZi5wcm90b2NvbCwgc2VsZi50cmFuc3BvcnQsIHNlbGYuc29ja2V0KQorICAgICAgICByZXR1cm4gc2VsZi5fbmFtZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHRyYW5zcG9ydF9uYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gJyVzLSVzJyAlIChzZWxmLnRyYW5zcG9ydCwgc2VsZi5zb2NrZXQpCisKKworZGVmIHRlc3RfbmFtZShzZXJ2ZXIsIGNsaWVudCwgcHJvdG9jb2wsIHRyYW5zcG9ydCwgc29ja2V0LCAqKmt3YXJncyk6CisgICAgcmV0dXJuIFRlc3RFbnRyeS5nZXRfbmFtZShzZXJ2ZXJbJ25hbWUnXSwgY2xpZW50WyduYW1lJ10sIHByb3RvY29sLCB0cmFuc3BvcnQsIHNvY2tldCkKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvdXRpbC5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjE0ZGY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcm9zc3J1bm5lci91dGlsLnB5CkBAIC0wLDAgKzEsMzUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgY29weQorCisKK2RlZiBkb21haW5fc29ja2V0X3BhdGgocG9ydCk6CisgICAgcmV0dXJuICcvdG1wL1RocmlmdFRlc3QudGhyaWZ0LiVkJyAlIHBvcnQKKworCitkZWYgbWVyZ2VfZGljdChiYXNlLCB1cGRhdGUpOgorICAgICIiIlVwZGF0ZSBkaWN0IGNvbmNhdGVuYXRpbmcgbGlzdCB2YWx1ZXMiIiIKKyAgICByZXMgPSBjb3B5LmRlZXBjb3B5KGJhc2UpCisgICAgZm9yIGssIHYgaW4gbGlzdCh1cGRhdGUuaXRlbXMoKSk6CisgICAgICAgIGlmIGsgaW4gbGlzdChyZXMua2V5cygpKSBhbmQgaXNpbnN0YW5jZSh2LCBsaXN0KToKKyAgICAgICAgICAgIHJlc1trXS5leHRlbmQodikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlc1trXSA9IHYKKyAgICByZXR1cm4gcmVzCmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9NYWtlZmlsZS5hbSBiL3Rlc3QvY3NoYXJwL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMTY2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NzaGFycC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDk1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworR0VORVJBVEVEID0gXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvQm9uay5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9Cb29scy5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9Cb29sVGVzdC5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9DcmF6eU5lc3RpbmcuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvRW1wdHlTdHJ1Y3QuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvR3Vlc3NQcm90b2NvbFN0cnVjdC5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9JbnNhbml0eS5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9MYXJnZURlbHRhcy5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9MaXN0Qm9ua3MuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTGlzdFR5cGVWZXJzaW9uaW5nVjEuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTGlzdFR5cGVWZXJzaW9uaW5nVjIuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTmVzdGVkTGlzdHNCb25rLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L05lc3RlZExpc3RzSTMyeDIuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTmVzdGVkTGlzdHNJMzJ4My5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9OZXN0ZWRNaXhlZHgyLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L051bWJlcnouY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvT25lRmllbGQuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvU2Vjb25kU2VydmljZS5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9TdHJ1Y3RBLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1N0cnVjdEIuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvVGhyaWZ0VGVzdC5Db25zdGFudHMuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvVGhyaWZ0VGVzdC5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9WZXJzaW9uaW5nVGVzdFYxLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1ZlcnNpb25pbmdUZXN0VjIuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvWGNlcHRpb24uY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvWGNlcHRpb24yLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1h0cnVjdC5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9YdHJ1Y3QyLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1h0cnVjdDMuY3MKKworQlVJTFRfU09VUkNFUyA9ICQoR0VORVJBVEVEKQorCitpZiBNT05PX01DUworQ1NDID0gbWNzCitlbHNlCitDU0MgPSBnbWNzCitlbmRpZgorCitpZiBORVRfMl8wCitDU0NfREVGSU5FUyA9IC1kOk5FVF8yXzAKK2VuZGlmCisKK0xJQkRJUiA9ICQodG9wX2J1aWxkZGlyKS9saWIvY3NoYXJwCisKK1RIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisKKyQoR0VORVJBVEVEKTogJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0ICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtLWdlbiBjc2hhcnAgLW8gLiAkPAorCitwcmVjcm9zczogVGVzdENsaWVudFNlcnZlci5leGUKKworVGhyaWZ0SW1wbC5kbGw6ICQoR0VORVJBVEVEKSAkKExJQkRJUikvVGhyaWZ0LmRsbAorCSQoQ1NDKSAkKENTQ19ERUZJTkVTKSAtdDpsaWJyYXJ5IC1vdXQ6JEAgLXJlZmVyZW5jZTokKExJQkRJUikvVGhyaWZ0LmRsbCAkKEdFTkVSQVRFRCkKKworU1JDUyA9IFRlc3RDbGllbnQuY3MgVGVzdFNlcnZlci5jcyBQcm9ncmFtLmNzCisKK1Rlc3RDbGllbnRTZXJ2ZXIuZXhlOiAkKFNSQ1MpIFRocmlmdEltcGwuZGxsCisJJChDU0MpICQoQ1NDX0RFRklORVMpIC1vdXQ6JEAgLXJlZmVyZW5jZTokKExJQkRJUikvVGhyaWZ0LmRsbCAtcmVmZXJlbmNlOlRocmlmdEltcGwuZGxsICQoU1JDUykKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXJmIGdlbi1jc2hhcnAgKi5leGUgKi5kbGwKKworVEVTVFBPUlQgPSA5NTAwCitjaGVjay1sb2NhbDogVGVzdENsaWVudFNlcnZlci5leGUKKwlNT05PX1BBVEg9JChMSUJESVIpIHRpbWVvdXQgMTAgbW9ubyBUZXN0Q2xpZW50U2VydmVyLmV4ZSBzZXJ2ZXIgLS1wb3J0PSQoVEVTVFBPUlQpICYKKwlzbGVlcCAxCisJTU9OT19QQVRIPSQoTElCRElSKSBtb25vIFRlc3RDbGllbnRTZXJ2ZXIuZXhlIGNsaWVudCAtLXBvcnQ9JChURVNUUE9SVCkKKworRVhUUkFfRElTVCA9IFwKKwlQcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBcCisJVGhyaWZ0VGVzdC5jc3Byb2ogXAorCVRocmlmdFRlc3Quc2xuIFwKKwlQcm9ncmFtLmNzIFwKKwlUZXN0U2VydmVyLmNzIFwKKwlUZXN0Q2xpZW50LmNzCmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9Qcm9ncmFtLmNzIGIvdGVzdC9jc2hhcnAvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWMwMGUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jc2hhcnAvUHJvZ3JhbS5jcwpAQCAtMCwwICsxLDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZQorLy8KKy8vIFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFIG9yIHZpc2l0IHRoZSBUaHJpZnQgc2l0ZSBhdDoKKy8vIGh0dHA6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS90aHJpZnQvCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBUaHJpZnQuVGVzdDsgLy9nZW5lcmF0ZWQgY29kZQorCituYW1lc3BhY2UgVGVzdAoreworICAgIGNsYXNzIFByb2dyYW0KKyAgICB7CisgICAgICAgIHN0YXRpYyBpbnQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYXJncy5MZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgibXVzdCBwcm92aWRlICdzZXJ2ZXInIG9yICdjbGllbnQnIGFyZyIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5TZXRCdWZmZXJTaXplKENvbnNvbGUuQnVmZmVyV2lkdGgsIDQwOTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRmFpbGVkIHRvIGdyb3cgc2Nyb2xsLWJhY2sgYnVmZmVyIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0cmluZ1tdIHN1YkFyZ3MgPSBuZXcgc3RyaW5nW2FyZ3MuTGVuZ3RoIC0gMV07CisgICAgICAgICAgICBmb3IoaW50IGkgPSAxOyBpIDwgYXJncy5MZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdWJBcmdzW2ktMV0gPSBhcmdzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFyZ3NbMF0gPT0gImNsaWVudCIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRlc3RDbGllbnQuRXhlY3V0ZShzdWJBcmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbMF0gPT0gInNlcnZlciIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRlc3RTZXJ2ZXIuRXhlY3V0ZShzdWJBcmdzKSA/IDAgOiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJmaXJzdCBhcmd1bWVudCBtdXN0IGJlICdzZXJ2ZXInIG9yICdjbGllbnQnIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdGVzdC9jc2hhcnAvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjExMDFhMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3NoYXJwL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJUaHJpZnRUZXN0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiZjQxYjE5M2ItZjFhYi00OGVlLTg4NDMtZjg4ZTQzMDg0ZTI2IildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24KKy8vICAgICAgQnVpbGQgTnVtYmVyCisvLyAgICAgIFJldmlzaW9uCisvLworLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CisvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1Rlc3RDbGllbnQuY3MgYi90ZXN0L2NzaGFycC9UZXN0Q2xpZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OWMwNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NzaGFycC9UZXN0Q2xpZW50LmNzCkBAIC0wLDAgKzEsODcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKK3VzaW5nIFRocmlmdC5UZXN0OwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkF1dGhlbnRpY2F0aW9uOworCituYW1lc3BhY2UgVGVzdAoreworICAgIHB1YmxpYyBjbGFzcyBUZXN0Q2xpZW50CisgICAgeworICAgICAgICBwdWJsaWMgY2xhc3MgVGVzdFBhcmFtcworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgaW50IG51bUl0ZXJhdGlvbnMgPSAxOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBob3N0ID0gImxvY2FsaG9zdCI7CisgICAgICAgICAgICBwdWJsaWMgaW50IHBvcnQgPSA5MDkwOworICAgICAgICAgICAgcHVibGljIHN0cmluZyB1cmw7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIHBpcGU7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBidWZmZXJlZDsKKyAgICAgICAgICAgIHB1YmxpYyBib29sIGZyYW1lZDsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgcHJvdG9jb2w7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBlbmNyeXB0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHB1YmxpYyBib29sIG11bHRpcGxleGVkID0gZmFsc2U7CisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbCBfaXNGaXJzdFRyYW5zcG9ydCA9IHRydWU7CisKKworICAgICAgICAgICAgcHVibGljIFRUcmFuc3BvcnQgQ3JlYXRlVHJhbnNwb3J0KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodXJsID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBlbmRwb2ludCB0cmFuc3BvcnQKKyAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCB0cmFucyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChwaXBlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0KHBpcGUpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNyeXB0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNlcnRQYXRoID0gIi4uL2tleXMvY2xpZW50LnAxMiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnQgPSBuZXcgWDUwOUNlcnRpZmljYXRlMihjZXJ0UGF0aCwgInRocmlmdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRUTFNTb2NrZXQoaG9zdCwgcG9ydCwgMCwgY2VydCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvLCBjLCBjaGFpbiwgZXJyb3JzKSA9PiB0cnVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU3NsUHJvdG9jb2xzLlRscyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNvY2tldChob3N0LCBwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGxheWVyZWQgdHJhbnNwb3J0CisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXJlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoX2lzRmlyc3RUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vZW5zdXJlIHByb3BlciBvcGVuL2Nsb3NlIG9mIHRyYW5zcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuT3BlbigpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9pc0ZpcnN0VHJhbnNwb3J0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRIdHRwQ2xpZW50KG5ldyBVcmkodXJsKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVFByb3RvY29sIENyZWF0ZVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwcm90b2NvbCA9PSAiY29tcGFjdCIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3RvY29sID09ICJqc29uIikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUSlNPTlByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yQmFzZVR5cGVzID0gMTsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JTdHJ1Y3RzID0gMjsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JDb250YWluZXJzID0gNDsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JFeGNlcHRpb25zID0gODsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JQcm90b2NvbCA9IDE2OworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvclVua25vd24gPSA2NDsKKworICAgICAgICBwcml2YXRlIGNsYXNzIENsaWVudFRlc3QKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUZXN0UGFyYW1zIHBhcmFtOworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU2Vjb25kU2VydmljZS5DbGllbnQgc2Vjb25kOworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUaHJpZnRUZXN0LkNsaWVudCBjbGllbnQ7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBudW1JdGVyYXRpb25zOworICAgICAgICAgICAgcHJpdmF0ZSBib29sIGRvbmU7CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgUmV0dXJuQ29kZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgICAgIHB1YmxpYyBDbGllbnRUZXN0KFRlc3RQYXJhbXMgcGFyYW1pbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYXJhbSA9IHBhcmFtaW47CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gcGFyYW0uQ3JlYXRlVHJhbnNwb3J0KCk7CisgICAgICAgICAgICAgICAgVFByb3RvY29sIHByb3RvY29sID0gcGFyYW0uQ3JlYXRlUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0ubXVsdGlwbGV4ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZWNvbmQgPSBuZXcgU2Vjb25kU2VydmljZS5DbGllbnQobmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiU2Vjb25kU2VydmljZSIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2xpZW50ID0gbmV3IFRocmlmdFRlc3QuQ2xpZW50KHByb3RvY29sKTsKKyAgICAgICAgICAgICAgICBudW1JdGVyYXRpb25zID0gcGFyYW0ubnVtSXRlcmF0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIEV4ZWN1dGUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkb25lKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4ZWN1dGUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIik7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1JdGVyYXRpb25zOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc3BvcnQuSXNPcGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5PcGVuKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNvbm5lY3QgZmFpbGVkOiAiICsgZXguTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5Db2RlIHw9IEVycm9yVW5rbm93bjsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5Db2RlIHw9IEV4ZWN1dGVDbGllbnRUZXN0KGNsaWVudCwgc2Vjb25kLCBwYXJhbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFcnJvclVua25vd247CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkVycm9yIHdoaWxlIGNsb3NpbmcgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgRXhlY3V0ZShzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUZXN0UGFyYW1zIHBhcmFtID0gbmV3IFRlc3RQYXJhbXMoKTsKKyAgICAgICAgICAgICAgICBpbnQgbnVtVGhyZWFkcyA9IDE7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MuTGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldID09ICItdSIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0udXJsID0gYXJnc1srK2ldOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLW4iKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLm51bUl0ZXJhdGlvbnMgPSBDb252ZXJ0LlRvSW50MzIoYXJnc1srK2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1waXBlIikgIC8vIC1waXBlIDxuYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnBpcGUgPSBhcmdzWysraV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIG5hbWVkIHBpcGVzIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5Db250YWlucygiLS1ob3N0PSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmhvc3QgPSBhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5Db250YWlucygiLS1wb3J0PSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnBvcnQgPSBpbnQuUGFyc2UoYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikrMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWIiIHx8IGFyZ3NbaV0gPT0gIi0tYnVmZmVyZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWJ1ZmZlcmVkIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5idWZmZXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGJ1ZmZlcmVkIHNvY2tldHMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1mIiB8fCBhcmdzW2ldID09ICItLWZyYW1lZCIgIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWZyYW1lZCIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZnJhbWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgZnJhbWVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVRocmVhZHMgPSBDb252ZXJ0LlRvSW50MzIoYXJnc1srK2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tY29tcGFjdCIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1jb21wYWN0IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPW11bHRpYyIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0ucHJvdG9jb2wgPSAiY29tcGFjdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGNvbXBhY3QgcHJvdG9jb2wiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tanNvbiIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1qc29uIiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPW11bHRpaiIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0ucHJvdG9jb2wgPSAianNvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIEpTT04gcHJvdG9jb2wiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tc3NsIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5lbmNyeXB0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBlbmNyeXB0ZWQgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldLlN0YXJ0c1dpdGgoIi0tcHJvdG9jb2w9bXVsdGkiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5tdWx0aXBsZXhlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXJyb3Igd2hpbGUgIHBhcnNpbmcgYXJndW1lbnRzIik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFcnJvclVua25vd247CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIHRlc3RzID0gRW51bWVyYWJsZS5SYW5nZSgwLCBudW1UaHJlYWRzKS5TZWxlY3QoXyA9PiBuZXcgQ2xpZW50VGVzdChwYXJhbSkpLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAvL2lzc3VlIHRlc3RzIG9uIHNlcGFyYXRlIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkKKyAgICAgICAgICAgICAgICB2YXIgdGhyZWFkcyA9IHRlc3RzLlNlbGVjdCh0ZXN0ID0+IG5ldyBUaHJlYWQodGVzdC5FeGVjdXRlKSkuVG9BcnJheSgpOworICAgICAgICAgICAgICAgIERhdGVUaW1lIHN0YXJ0ID0gRGF0ZVRpbWUuTm93OworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIHRocmVhZHMpCisgICAgICAgICAgICAgICAgICAgIHQuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiB0aHJlYWRzKQorICAgICAgICAgICAgICAgICAgICB0LkpvaW4oKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVG90YWwgdGltZTogIiArIChEYXRlVGltZS5Ob3cgLSBzdGFydCkpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RzLlNlbGVjdCh0ID0+IHQuUmV0dXJuQ29kZSkuQWdncmVnYXRlKChyMSwgcjIpID0+IHIxIHwgcjIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBvdXRlckV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVbmV4cGVjdGVkIGVycm9yIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUob3V0ZXJFeC5NZXNzYWdlICsgIiBTVDogIiArIG91dGVyRXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yVW5rbm93bjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEJ5dGVzVG9IZXgoYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuVG9TdHJpbmcoZGF0YSkuUmVwbGFjZSgiLSIsIHN0cmluZy5FbXB0eSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBQcmVwYXJlVGVzdERhdGEoYm9vbCByYW5kb21EaXN0LCBib29sIGh1Z2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGh1Z2UgPSB0cnVlIHRlc3RzIGZvciBUSFJJRlQtNDM3MgorICAgICAgICAgICAgYnl0ZVtdIHJldHZhbCA9IG5ldyBieXRlW2h1Z2UgPyAweDEyMzQ1IDogMHgxMDBdOworICAgICAgICAgICAgaW50IGluaXRMZW4gPSByZXR2YWwuTGVuZ3RoOworCisgICAgICAgICAgICAvLyBsaW5lYXIgZGlzdHJpYnV0aW9uLCB1bmxlc3MgcmFuZG9tIGlzIHJlcXVlc3RlZAorICAgICAgICAgICAgaWYgKCFyYW5kb21EaXN0KSB7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0TGVuOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsW2ldID0gKGJ5dGUpaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcmFuZG9tIGRpc3RyaWJ1dGlvbgorICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0TGVuOyArK2kpIHsKKyAgICAgICAgICAgICAgICByZXR2YWxbaV0gPSAoYnl0ZSkwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHJuZCA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgaW5pdExlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgd2hpbGUoIHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5leHRQb3MgPSBybmQuTmV4dCgpICUgaW5pdExlbjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbFtuZXh0UG9zXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWxbbmV4dFBvc10gPSAoYnl0ZSlpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgRXhlY3V0ZUNsaWVudFRlc3QoVGhyaWZ0VGVzdC5DbGllbnQgY2xpZW50LCBTZWNvbmRTZXJ2aWNlLkNsaWVudCBzZWNvbmQsIFRlc3RQYXJhbXMgcGFyYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCByZXR1cm5Db2RlID0gMDsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFZvaWQoKSIpOworICAgICAgICAgICAgY2xpZW50LnRlc3RWb2lkKCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gdm9pZCIpOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0U3RyaW5nKFwiVGVzdFwiKSIpOworICAgICAgICAgICAgc3RyaW5nIHMgPSBjbGllbnQudGVzdFN0cmluZygiVGVzdCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IFwiIiArIHMgKyAiXCIiKTsKKyAgICAgICAgICAgIGlmICgiVGVzdCIgIT0gcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFyYW0ubXVsdGlwbGV4ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInNlY29uZFRlc3RTdHJpbmcoXCJUZXN0MlwiKSIpOworICAgICAgICAgICAgICAgIHMgPSBzZWNvbmQuc2Vjb25kdGVzdFN0cmluZygiVGVzdDIiKTsKKyAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IFwiIiArIHMgKyAiXCIiKTsKKyAgICAgICAgICAgICAgaWYgKCJ0ZXN0U3RyaW5nKFwiVGVzdDJcIikiICE9IHMpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclByb3RvY29sOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCb29sKHRydWUpIik7CisgICAgICAgICAgICBib29sIHQgPSBjbGllbnQudGVzdEJvb2woKGJvb2wpdHJ1ZSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHQpOworICAgICAgICAgICAgaWYgKCF0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0Qm9vbChmYWxzZSkiKTsKKyAgICAgICAgICAgIGJvb2wgZiA9IGNsaWVudC50ZXN0Qm9vbCgoYm9vbClmYWxzZSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGYpOworICAgICAgICAgICAgaWYgKGYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJ5dGUoMSkiKTsKKyAgICAgICAgICAgIHNieXRlIGk4ID0gY2xpZW50LnRlc3RCeXRlKChzYnl0ZSkxKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTgpOworICAgICAgICAgICAgaWYgKDEgIT0gaTgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEkzMigtMSkiKTsKKyAgICAgICAgICAgIGludCBpMzIgPSBjbGllbnQudGVzdEkzMigtMSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGkzMik7CisgICAgICAgICAgICBpZiAoLTEgIT0gaTMyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RJNjQoLTM0MzU5NzM4MzY4KSIpOworICAgICAgICAgICAgbG9uZyBpNjQgPSBjbGllbnQudGVzdEk2NCgtMzQzNTk3MzgzNjgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpNjQpOworICAgICAgICAgICAgaWYgKC0zNDM1OTczODM2OCAhPSBpNjQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdERvdWJsZSg1LjMyNTA5ODIzNSkiKTsKKyAgICAgICAgICAgIGRvdWJsZSBkdWIgPSBjbGllbnQudGVzdERvdWJsZSg1LjMyNTA5ODIzNSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGR1Yik7CisgICAgICAgICAgICBpZiAoNS4zMjUwOTgyMzUgIT0gZHViKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RG91YmxlKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSkiKTsKKyAgICAgICAgICAgIGR1YiA9IGNsaWVudC50ZXN0RG91YmxlKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGR1Yik7CisgICAgICAgICAgICBpZiAoLTAuMDAwMzQxMDEyNDM5NjM4NTk4Mjc5ICE9IGR1YikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkzMiA9IDA7IGkzMiA8IDI7ICsraTMyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBodWdlID0gKGkzMiA+IDApOworICAgICAgICAgICAgICAgIGJ5dGVbXSBiaW5PdXQgPSBQcmVwYXJlVGVzdERhdGEoZmFsc2UsaHVnZSk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJpbmFyeSgiICsgQnl0ZXNUb0hleChiaW5PdXQpICsgIikiKTsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBiaW5JbiA9IGNsaWVudC50ZXN0QmluYXJ5KGJpbk91dCk7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgQnl0ZXNUb0hleChiaW5JbikpOworICAgICAgICAgICAgICAgICAgICBpZiAoYmluSW4uTGVuZ3RoICE9IGJpbk91dC5MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBvZnMgPSAwOyBvZnMgPCBNYXRoLk1pbihiaW5Jbi5MZW5ndGgsIGJpbk91dC5MZW5ndGgpOyArK29mcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaW5JbltvZnNdICE9IGJpbk91dFtvZnNdKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBiaW5hcnkgZXF1YWxzPyBvbmx5IHdpdGggaGFzaGNvZGUgb3B0aW9uIGVuYWJsZWQgLi4uCisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVGVzdCBDcmF6eU5lc3RpbmciKTsKKyAgICAgICAgICAgIGlmKCB0eXBlb2YoQ3JhenlOZXN0aW5nKS5HZXRNZXRob2QoIkVxdWFscyIpLkRlY2xhcmluZ1R5cGUgPT0gdHlwZW9mKENyYXp5TmVzdGluZykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3JhenlOZXN0aW5nIG9uZSA9IG5ldyBDcmF6eU5lc3RpbmcoKTsKKyAgICAgICAgICAgICAgICBDcmF6eU5lc3RpbmcgdHdvID0gbmV3IENyYXp5TmVzdGluZygpOworICAgICAgICAgICAgICAgIG9uZS5TdHJpbmdfZmllbGQgPSAiY3JhenkiOworICAgICAgICAgICAgICAgIHR3by5TdHJpbmdfZmllbGQgPSAiY3JhenkiOworICAgICAgICAgICAgICAgIG9uZS5CaW5hcnlfZmllbGQgPSBuZXcgYnl0ZVsxMF0geyAweDAwLCAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLCAweEZGIH07CisgICAgICAgICAgICAgICAgdHdvLkJpbmFyeV9maWVsZCA9IG5ldyBieXRlWzEwXSB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4RkYgfTsKKyAgICAgICAgICAgICAgICBpZiAoIW9uZS5FcXVhbHModHdvKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQ29udGFpbmVyczsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ3JhenlOZXN0aW5nLkVxdWFscyBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RTdHJ1Y3Qoe1wiWmVyb1wiLCAxLCAtMywgLTV9KSIpOworICAgICAgICAgICAgWHRydWN0IG8gPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgICBvLlN0cmluZ190aGluZyA9ICJaZXJvIjsKKyAgICAgICAgICAgIG8uQnl0ZV90aGluZyA9IChzYnl0ZSkxOworICAgICAgICAgICAgby5JMzJfdGhpbmcgPSAtMzsKKyAgICAgICAgICAgIG8uSTY0X3RoaW5nID0gLTU7CisgICAgICAgICAgICBYdHJ1Y3QgaSA9IGNsaWVudC50ZXN0U3RydWN0KG8pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHtcIiIgKyBpLlN0cmluZ190aGluZyArICJcIiwgIiArIGkuQnl0ZV90aGluZyArICIsICIgKyBpLkkzMl90aGluZyArICIsICIgKyBpLkk2NF90aGluZyArICJ9Iik7CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3ROZXN0KHsxLCB7XCJaZXJvXCIsIDEsIC0zLCAtNX0sIDV9KSIpOworICAgICAgICAgICAgWHRydWN0MiBvMiA9IG5ldyBYdHJ1Y3QyKCk7CisgICAgICAgICAgICBvMi5CeXRlX3RoaW5nID0gKHNieXRlKTE7CisgICAgICAgICAgICBvMi5TdHJ1Y3RfdGhpbmcgPSBvOworICAgICAgICAgICAgbzIuSTMyX3RoaW5nID0gNTsKKyAgICAgICAgICAgIFh0cnVjdDIgaTIgPSBjbGllbnQudGVzdE5lc3QobzIpOworICAgICAgICAgICAgaSA9IGkyLlN0cnVjdF90aGluZzsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB7IiArIGkyLkJ5dGVfdGhpbmcgKyAiLCB7XCIiICsgaS5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyBpLkJ5dGVfdGhpbmcgKyAiLCAiICsgaS5JMzJfdGhpbmcgKyAiLCAiICsgaS5JNjRfdGhpbmcgKyAifSwgIiArIGkyLkkzMl90aGluZyArICJ9Iik7CisKKyAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBpbnQ+IG1hcG91dCA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWFwb3V0W2pdID0gaiAtIDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdE1hcCh7Iik7CisgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBrZXkgaW4gbWFwb3V0LktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBvdXRba2V5XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9KSIpOworCisgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBtYXBpbiA9IGNsaWVudC50ZXN0TWFwKG1hcG91dCk7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBrZXkgaW4gbWFwaW4uS2V5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4gIiArIG1hcGluW2tleV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgTGlzdDxpbnQ+IGxpc3RvdXQgPSBuZXcgTGlzdDxpbnQ+KCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gLTI7IGogPCAzOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGlzdG91dC5BZGQoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TGlzdCh7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQgaiBpbiBsaXN0b3V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9KSIpOworCisgICAgICAgICAgICBMaXN0PGludD4gbGlzdGluID0gY2xpZW50LnRlc3RMaXN0KGxpc3RvdXQpOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQgaiBpbiBsaXN0aW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIC8vc2V0CisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBUSGFzaFNldDxpbnQ+IHNldG91dCA9IG5ldyBUSGFzaFNldDxpbnQ+KCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gLTI7IGogPCAzOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2V0b3V0LkFkZChqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RTZXQoeyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGogaW4gc2V0b3V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9KSIpOworCisgICAgICAgICAgICBUSGFzaFNldDxpbnQ+IHNldGluID0gY2xpZW50LnRlc3RTZXQoc2V0b3V0KTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGogaW4gc2V0aW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oT05FKSIpOworICAgICAgICAgICAgTnVtYmVyeiByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5PTkUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouT05FICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oVFdPKSIpOworICAgICAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouVFdPKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6LlRXTyAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKFRIUkVFKSIpOworICAgICAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouVEhSRUUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouVEhSRUUgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShGSVZFKSIpOworICAgICAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouRklWRSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5GSVZFICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oRUlHSFQpIik7CisgICAgICAgICAgICByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5FSUdIVCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5FSUdIVCAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiKTsKKyAgICAgICAgICAgIGxvbmcgdWlkID0gY2xpZW50LnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyM0wpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyB1aWQpOworICAgICAgICAgICAgaWYgKDMwOTg1ODIzNTA4MjUyM0wgIT0gdWlkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TWFwTWFwKDEpIik7CisgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+IG1tID0gY2xpZW50LnRlc3RNYXBNYXAoMSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQga2V5IGluIG1tLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+IHsiKTsKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBtMiA9IG1tW2tleV07CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoaW50IGsyIGluIG0yLktleXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGsyICsgIiA9PiAiICsgbTJbazJdICsgIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgSW5zYW5pdHkgaW5zYW5lID0gbmV3IEluc2FuaXR5KCk7CisgICAgICAgICAgICBpbnNhbmUuVXNlck1hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIGxvbmc+KCk7CisgICAgICAgICAgICBpbnNhbmUuVXNlck1hcFtOdW1iZXJ6LkZJVkVdID0gNTAwMEw7CisgICAgICAgICAgICBYdHJ1Y3QgdHJ1Y2sgPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgICB0cnVjay5TdHJpbmdfdGhpbmcgPSAiVHJ1Y2siOworICAgICAgICAgICAgdHJ1Y2suQnl0ZV90aGluZyA9IChzYnl0ZSk4OworICAgICAgICAgICAgdHJ1Y2suSTMyX3RoaW5nID0gODsKKyAgICAgICAgICAgIHRydWNrLkk2NF90aGluZyA9IDg7CisgICAgICAgICAgICBpbnNhbmUuWHRydWN0cyA9IG5ldyBMaXN0PFh0cnVjdD4oKTsKKyAgICAgICAgICAgIGluc2FuZS5YdHJ1Y3RzLkFkZCh0cnVjayk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0SW5zYW5pdHkoKSIpOworICAgICAgICAgICAgRGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4gd2hvYSA9IGNsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5lKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGxvbmcga2V5IGluIHdob2EuS2V5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PiB2YWwgPSB3aG9hW2tleV07CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+IHsiKTsKKworICAgICAgICAgICAgICAgIGZvcmVhY2ggKE51bWJlcnogazIgaW4gdmFsLktleXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBJbnNhbml0eSB2MiA9IHZhbFtrMl07CisKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrMiArICIgPT4geyIpOworICAgICAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PE51bWJlcnosIGxvbmc+IHVzZXJNYXAgPSB2Mi5Vc2VyTWFwOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXJNYXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoTnVtYmVyeiBrMyBpbiB1c2VyTWFwLktleXMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrMyArICIgPT4gIiArIHVzZXJNYXBbazNdICsgIiwgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJudWxsIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSwgIik7CisKKyAgICAgICAgICAgICAgICAgICAgTGlzdDxYdHJ1Y3Q+IHh0cnVjdHMgPSB2Mi5YdHJ1Y3RzOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHh0cnVjdHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoWHRydWN0IHggaW4geHRydWN0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7XCIiICsgeC5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyB4LkJ5dGVfdGhpbmcgKyAiLCAiICsgeC5JMzJfdGhpbmcgKyAiLCAiICsgeC5JMzJfdGhpbmcgKyAifSwgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJudWxsIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSIpOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIHNieXRlIGFyZzAgPSAxOworICAgICAgICAgICAgaW50IGFyZzEgPSAyOworICAgICAgICAgICAgbG9uZyBhcmcyID0gbG9uZy5NYXhWYWx1ZTsKKyAgICAgICAgICAgIERpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4gbXVsdGlEaWN0ID0gbmV3IERpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4oKTsKKyAgICAgICAgICAgIG11bHRpRGljdFsxXSA9ICJvbmUiOworICAgICAgICAgICAgTnVtYmVyeiBhcmc0ID0gTnVtYmVyei5GSVZFOworICAgICAgICAgICAgbG9uZyBhcmc1ID0gNTAwMDAwMDsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIlRlc3QgTXVsdGkoIiArIGFyZzAgKyAiLCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIsIiArIG11bHRpRGljdCArICIsIiArIGFyZzQgKyAiLCIgKyBhcmc1ICsgIikiKTsKKyAgICAgICAgICAgIFh0cnVjdCBtdWx0aVJlc3BvbnNlID0gY2xpZW50LnRlc3RNdWx0aShhcmcwLCBhcmcxLCBhcmcyLCBtdWx0aURpY3QsIGFyZzQsIGFyZzUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0gWHRydWN0KGJ5dGVfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuQnl0ZV90aGluZyArICIsU3RyaW5nX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLlN0cmluZ190aGluZworICAgICAgICAgICAgICAgICAgICAgICAgKyAiLGkzMl90aGluZzoiICsgbXVsdGlSZXNwb25zZS5JMzJfdGhpbmcgKyAiLGk2NF90aGluZzoiICsgbXVsdGlSZXNwb25zZS5JNjRfdGhpbmcgKyAiKVxuIik7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0RXhjZXB0aW9uKFwiWGNlcHRpb25cIikiKTsKKyAgICAgICAgICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYY2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZXguRXJyb3JDb2RlICE9IDEwMDEgfHwgZXguTWVzc2FnZSAhPSAiWGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0RXhjZXB0aW9uKFwiVEV4Y2VwdGlvblwiKSIpOworICAgICAgICAgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVGhyaWZ0LlRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gT0sKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0RXhjZXB0aW9uKFwib2tcIikiKTsKKyAgICAgICAgICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigib2siKTsKKyAgICAgICAgICAgICAgICAvLyBPSworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb25cIiwgLi4uKSIpOworICAgICAgICAgICAgICAgIGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uIiwgImlnbm9yZSIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChleC5FcnJvckNvZGUgIT0gMTAwMSB8fCBleC5NZXNzYWdlICE9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb24yXCIsIC4uLikiKTsKKyAgICAgICAgICAgICAgICBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbjIiLCAiaWdub3JlIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoWGNlcHRpb24yIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChleC5FcnJvckNvZGUgIT0gMjAwMiB8fCBleC5TdHJ1Y3RfdGhpbmcuU3RyaW5nX3RoaW5nICE9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RNdWx0aUV4Y2VwdGlvbihcInN1Y2Nlc3NcIiwgXCJPS1wiKSIpOworICAgICAgICAgICAgICAgIGlmICgiT0siICE9IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oInN1Y2Nlc3MiLCAiT0siKS5TdHJpbmdfdGhpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdG9wd2F0Y2ggc3cgPSBuZXcgU3RvcHdhdGNoKCk7CisgICAgICAgICAgICBzdy5TdGFydCgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlRlc3QgT25ld2F5KDEpIik7CisgICAgICAgICAgICBjbGllbnQudGVzdE9uZXdheSgxKTsKKyAgICAgICAgICAgIHN3LlN0b3AoKTsKKyAgICAgICAgICAgIGlmIChzdy5FbGFwc2VkTWlsbGlzZWNvbmRzID4gMTAwMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJUZXN0IENhbGx0aW1lKCkiKTsKKyAgICAgICAgICAgIHZhciB0aW1lcyA9IDUwOworICAgICAgICAgICAgc3cuUmVzZXQoKTsKKyAgICAgICAgICAgIHN3LlN0YXJ0KCk7CisgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHRpbWVzOyArK2spCisgICAgICAgICAgICAgICAgY2xpZW50LnRlc3RWb2lkKCk7CisgICAgICAgICAgICBzdy5TdG9wKCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gezB9IG1zIGEgdGVzdFZvaWQoKSBjYWxsIiwgc3cuRWxhcHNlZE1pbGxpc2Vjb25kcyAvIHRpbWVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXR1cm5Db2RlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvVGVzdFNlcnZlci5jcyBiL3Rlc3QvY3NoYXJwL1Rlc3RTZXJ2ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY2NDVjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3NoYXJwL1Rlc3RTZXJ2ZXIuY3MKQEAgLTAsMCArMSw1MzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlCisvLworLy8gU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0Ugb3IgdmlzaXQgdGhlIFRocmlmdCBzaXRlIGF0OgorLy8gaHR0cDovL2RldmVsb3BlcnMuZmFjZWJvb2suY29tL3RocmlmdC8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwordXNpbmcgVGhyaWZ0LlRlc3Q7IC8vZ2VuZXJhdGVkIGNvZGUKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkF1dGhlbnRpY2F0aW9uOworCituYW1lc3BhY2UgVGVzdAoreworICAgIHB1YmxpYyBjbGFzcyBUZXN0U2VydmVyCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBfY2xpZW50SUQgPSAtMTsKKyAgICAgICAgcHVibGljIGRlbGVnYXRlIHZvaWQgVGVzdExvZ0RlbGVnYXRlKHN0cmluZyBtc2csIHBhcmFtcyBvYmplY3RbXSB2YWx1ZXMpOworCisgICAgICAgIHB1YmxpYyBjbGFzcyBUcmFkZVNlcnZlckV2ZW50SGFuZGxlciA6IFRTZXJ2ZXJFdmVudEhhbmRsZXIKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBjYWxsQ291bnQgPSAwOworICAgICAgICAgICAgcHVibGljIHZvaWQgcHJlU2VydmUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxDb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIE9iamVjdCBjcmVhdGVDb250ZXh0KFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgaW5wdXQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgb3V0cHV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxDb3VudCsrOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIHZvaWQgZGVsZXRlQ29udGV4dChPYmplY3Qgc2VydmVyQ29udGV4dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBpbnB1dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBvdXRwdXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsbENvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzQ29udGV4dChPYmplY3Qgc2VydmVyQ29udGV4dCwgVGhyaWZ0LlRyYW5zcG9ydC5UVHJhbnNwb3J0IHRyYW5zcG9ydCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworCisgICAgICAgIHB1YmxpYyBjbGFzcyBUZXN0SGFuZGxlciA6IFRocmlmdFRlc3QuSWZhY2UsIFRocmlmdC5UQ29udHJvbGxpbmdIYW5kbGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBUU2VydmVyIHNlcnZlciB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwcml2YXRlIGludCBoYW5kbGVySUQ7CisgICAgICAgICAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgcmV1c2FibGVTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHByaXZhdGUgVGVzdExvZ0RlbGVnYXRlIHRlc3RMb2dEZWxlZ2F0ZTsKKworICAgICAgICAgICAgcHVibGljIFRlc3RIYW5kbGVyKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVySUQgPSBJbnRlcmxvY2tlZC5JbmNyZW1lbnQocmVmIF9jbGllbnRJRCk7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlICs9IHRlc3RDb25zb2xlTG9nZ2VyOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoIk5ldyBUZXN0SGFuZGxlciBpbnN0YW5jZSBjcmVhdGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zb2xlTG9nZ2VyKHN0cmluZyBtc2csIHBhcmFtcyBvYmplY3RbXSB2YWx1ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZEZvcm1hdCgiaGFuZGxlcnswOkQzfToiLGhhbmRsZXJJRCk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZEZvcm1hdChtc2csIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZExpbmUoKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCByZXVzYWJsZVN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Vm9pZCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdFZvaWQoKSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIHRlc3RTdHJpbmcoc3RyaW5nIHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RTdHJpbmcoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sIHRlc3RCb29sKGJvb2wgdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdEJvb2woezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBzYnl0ZSB0ZXN0Qnl0ZShzYnl0ZSB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0Qnl0ZSh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludCB0ZXN0STMyKGludCB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0STMyKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgbG9uZyB0ZXN0STY0KGxvbmcgdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdEk2NCh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGRvdWJsZSB0ZXN0RG91YmxlKGRvdWJsZSB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0RG91YmxlKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYnl0ZVtdIHRlc3RCaW5hcnkoYnl0ZVtdIHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBoZXggPSBCaXRDb252ZXJ0ZXIuVG9TdHJpbmcodGhpbmcpLlJlcGxhY2UoIi0iLCBzdHJpbmcuRW1wdHkpOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RCaW5hcnkoezA6WH0pIiwgaGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBYdHJ1Y3QgdGVzdFN0cnVjdChYdHJ1Y3QgdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdFN0cnVjdCh7e1wiezB9XCIsIHsxfSwgezJ9LCB7M319fSkiLCB0aGluZy5TdHJpbmdfdGhpbmcsIHRoaW5nLkJ5dGVfdGhpbmcsIHRoaW5nLkkzMl90aGluZywgdGhpbmcuSTY0X3RoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBYdHJ1Y3QyIHRlc3ROZXN0KFh0cnVjdDIgbmVzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYdHJ1Y3QgdGhpbmcgPSBuZXN0LlN0cnVjdF90aGluZzsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0TmVzdCh7e3swfSwge3tcInsxfVwiLCB7Mn0sIHszfSwgezR9LCB7NX19fX19KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0LkJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluZy5TdHJpbmdfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluZy5CeXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuSTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuSTY0X3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdC5JMzJfdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXN0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxpbnQsIGludD4gdGVzdE1hcChEaWN0aW9uYXJ5PGludCwgaW50PiB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kKCJ0ZXN0TWFwKHt7Iik7CisgICAgICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoaW50IGtleSBpbiB0aGluZy5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kRm9ybWF0KCJ7MH0gPT4gezF9Iiwga2V5LCB0aGluZ1trZXldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgifX0pIik7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZShyZXVzYWJsZVN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gdGVzdFN0cmluZ01hcChEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kKCJ0ZXN0U3RyaW5nTWFwKHt7Iik7CisgICAgICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGtleSBpbiB0aGluZy5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kRm9ybWF0KCJ7MH0gPT4gezF9Iiwga2V5LCB0aGluZ1trZXldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgifX0pIik7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZShyZXVzYWJsZVN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVEhhc2hTZXQ8aW50PiB0ZXN0U2V0KFRIYXNoU2V0PGludD4gdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgidGVzdFNldCh7eyIpOworICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBlbGVtIGluIHRoaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kRm9ybWF0KCJ7MH0iLCBlbGVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgifX0pIik7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZShyZXVzYWJsZVN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgTGlzdDxpbnQ+IHRlc3RMaXN0KExpc3Q8aW50PiB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kKCJ0ZXN0TGlzdCh7eyIpOworICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBlbGVtIGluIHRoaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kRm9ybWF0KCJ7MH0iLCBlbGVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgifX0pIik7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZShyZXVzYWJsZVN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgTnVtYmVyeiB0ZXN0RW51bShOdW1iZXJ6IHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RFbnVtKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgbG9uZyB0ZXN0VHlwZWRlZihsb25nIHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RUeXBlZGVmKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+PiB0ZXN0TWFwTWFwKGludCBoZWxsbykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0TWFwTWFwKHswfSkiLCBoZWxsbyk7CisgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+PiBtYXBtYXAgPQorICAgICAgICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4oKTsKKworICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBpbnQ+IHBvcyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOworICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBpbnQ+IG5lZyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zW2ldID0gaTsKKyAgICAgICAgICAgICAgICAgICAgbmVnWy1pXSA9IC1pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1hcG1hcFs0XSA9IHBvczsKKyAgICAgICAgICAgICAgICBtYXBtYXBbLTRdID0gbmVnOworCisgICAgICAgICAgICAgICAgcmV0dXJuIG1hcG1hcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSW5zYW5pdHkKKyAgICAgICAgICAgIC8vIHJldHVybnM6CisgICAgICAgICAgICAvLyB7IDEgPT4geyAyID0+IGFyZ3VtZW50LAorICAgICAgICAgICAgLy8gICAgICAgICAgMyA9PiBhcmd1bWVudCwKKyAgICAgICAgICAgIC8vICAgICAgICB9LAorICAgICAgICAgICAgLy8gICAyID0+IHsgNiA9PiA8ZW1wdHkgSW5zYW5pdHkgc3RydWN0PiwgfSwKKyAgICAgICAgICAgIC8vIH0KKyAgICAgICAgICAgIHB1YmxpYyBEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PiB0ZXN0SW5zYW5pdHkoSW5zYW5pdHkgYXJndW1lbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdEluc2FuaXR5KCkiKTsKKworICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+IGZpcnN0X21hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PigpOworICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+IHNlY29uZF9tYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4oKTsgOworCisgICAgICAgICAgICAgICAgZmlyc3RfbWFwW051bWJlcnouVFdPXSA9IGFyZ3VtZW50OworICAgICAgICAgICAgICAgIGZpcnN0X21hcFtOdW1iZXJ6LlRIUkVFXSA9IGFyZ3VtZW50OworCisgICAgICAgICAgICAgICAgc2Vjb25kX21hcFtOdW1iZXJ6LlNJWF0gPSBuZXcgSW5zYW5pdHkoKTsKKworICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+IGluc2FuZSA9CisgICAgICAgICAgICAgICAgICBuZXcgRGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4oKTsKKyAgICAgICAgICAgICAgICBpbnNhbmVbKGxvbmcpMV0gPSBmaXJzdF9tYXA7CisgICAgICAgICAgICAgICAgaW5zYW5lWyhsb25nKTJdID0gc2Vjb25kX21hcDsKKworICAgICAgICAgICAgICAgIHJldHVybiBpbnNhbmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBYdHJ1Y3QgdGVzdE11bHRpKHNieXRlIGFyZzAsIGludCBhcmcxLCBsb25nIGFyZzIsIERpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4gYXJnMywgTnVtYmVyeiBhcmc0LCBsb25nIGFyZzUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdE11bHRpKCkiKTsKKworICAgICAgICAgICAgICAgIFh0cnVjdCBoZWxsbyA9IG5ldyBYdHJ1Y3QoKTsgOworICAgICAgICAgICAgICAgIGhlbGxvLlN0cmluZ190aGluZyA9ICJIZWxsbzIiOworICAgICAgICAgICAgICAgIGhlbGxvLkJ5dGVfdGhpbmcgPSBhcmcwOworICAgICAgICAgICAgICAgIGhlbGxvLkkzMl90aGluZyA9IGFyZzE7CisgICAgICAgICAgICAgICAgaGVsbG8uSTY0X3RoaW5nID0gYXJnMjsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGVsbG87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogUHJpbnQgJ3Rlc3RFeGNlcHRpb24oJXMpJyB3aXRoIGFyZyBhcyAnJXMnCisgICAgICAgICAgICAgKiBAcGFyYW0gc3RyaW5nIGFyZyAtIGEgc3RyaW5nIGluZGljYXRpb24gd2hhdCB0eXBlIG9mIGV4Y2VwdGlvbiB0byB0aHJvdworICAgICAgICAgICAgICogaWYgYXJnID09ICJYY2VwdGlvbiIgdGhyb3cgWGNlcHRpb24gd2l0aCBlcnJvckNvZGUgPSAxMDAxIGFuZCBtZXNzYWdlID0gYXJnCisgICAgICAgICAgICAgKiBlbHNlbiBpZiBhcmcgPT0gIlRFeGNlcHRpb24iIHRocm93IFRFeGNlcHRpb24KKyAgICAgICAgICAgICAqIGVsc2UgZG8gbm90IHRocm93IGFueXRoaW5nCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb24oc3RyaW5nIGFyZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0RXhjZXB0aW9uKHswfSkiLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChhcmcgPT0gIlhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhjZXB0aW9uIHggPSBuZXcgWGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgeC5FcnJvckNvZGUgPSAxMDAxOworICAgICAgICAgICAgICAgICAgICB4Lk1lc3NhZ2UgPSBhcmc7CisgICAgICAgICAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhcmcgPT0gIlRFeGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRocmlmdC5URXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFh0cnVjdCB0ZXN0TXVsdGlFeGNlcHRpb24oc3RyaW5nIGFyZzAsIHN0cmluZyBhcmcxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RNdWx0aUV4Y2VwdGlvbih7MH0sIHsxfSkiLCBhcmcwLGFyZzEpOworICAgICAgICAgICAgICAgIGlmIChhcmcwID09ICJYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYY2VwdGlvbiB4ID0gbmV3IFhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHguRXJyb3JDb2RlID0gMTAwMTsKKyAgICAgICAgICAgICAgICAgICAgeC5NZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iOworICAgICAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmcwID09ICJYY2VwdGlvbjIiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWGNlcHRpb24yIHggPSBuZXcgWGNlcHRpb24yKCk7CisgICAgICAgICAgICAgICAgICAgIHguRXJyb3JDb2RlID0gMjAwMjsKKyAgICAgICAgICAgICAgICAgICAgeC5TdHJ1Y3RfdGhpbmcgPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgICAgICAgICAgIHguU3RydWN0X3RoaW5nLlN0cmluZ190aGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiI7CisgICAgICAgICAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgWHRydWN0IHJlc3VsdCA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuU3RyaW5nX3RoaW5nID0gYXJnMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyLlN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RPbmV3YXkoaW50IGFyZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0T25ld2F5KHswfSksIHNsZWVwaW5nLi4uIiwgYXJnKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5TbGVlcChhcmcgKiAxMDAwKTsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0T25ld2F5IGZpbmlzaGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSAvLyBjbGFzcyBUZXN0SGFuZGxlcgorCisgICAgICAgIHByaXZhdGUgZW51bSBTZXJ2ZXJUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIFRTaW1wbGVTZXJ2ZXIsCisgICAgICAgICAgICBUVGhyZWFkZWRTZXJ2ZXIsCisgICAgICAgICAgICBUVGhyZWFkUG9vbFNlcnZlciwKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZW51bSBQcm9jZXNzb3JGYWN0b3J5VHlwZQorICAgICAgICB7CisgICAgICAgICAgICBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgIFRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIEV4ZWN1dGUoc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMgPSBmYWxzZSwgdXNlRnJhbWVkID0gZmFsc2UsIHVzZUVuY3J5cHRpb24gPSBmYWxzZSwgY29tcGFjdCA9IGZhbHNlLCBqc29uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyVHlwZS5UU2ltcGxlU2VydmVyOworICAgICAgICAgICAgICAgIFByb2Nlc3NvckZhY3RvcnlUeXBlIHByb2Nlc3NvckZhY3RvcnlUeXBlID0gUHJvY2Vzc29yRmFjdG9yeVR5cGUuVFNpbmdsZXRvblByb2Nlc3NvckZhY3Rvcnk7CisgICAgICAgICAgICAgICAgaW50IHBvcnQgPSA5MDkwOworICAgICAgICAgICAgICAgIHN0cmluZyBwaXBlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MuTGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXSA9PSAiLXBpcGUiKSAgLy8gLXBpcGUgbmFtZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXBlID0gYXJnc1srK2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uQ29udGFpbnMoIi0tcG9ydD0iKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCA9IGludC5QYXJzZShhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItYiIgfHwgYXJnc1tpXSA9PSAiLS1idWZmZXJlZCIgfHwgYXJnc1tpXSA9PSAiLS10cmFuc3BvcnQ9YnVmZmVyZWQiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2VCdWZmZXJlZFNvY2tldHMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1mIiB8fCBhcmdzW2ldID09ICItLWZyYW1lZCIgfHwgYXJnc1tpXSA9PSAiLS10cmFuc3BvcnQ9ZnJhbWVkIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNlRnJhbWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWNvbXBhY3QiIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9Y29tcGFjdCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhY3QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tanNvbiIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1qc29uIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAganNvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS10aHJlYWRlZCIgfHwgYXJnc1tpXSA9PSAiLS1zZXJ2ZXItdHlwZT10aHJlYWRlZCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclR5cGUgPSBTZXJ2ZXJUeXBlLlRUaHJlYWRlZFNlcnZlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXRocmVhZHBvb2wiIHx8IGFyZ3NbaV0gPT0gIi0tc2VydmVyLXR5cGU9dGhyZWFkcG9vbCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclR5cGUgPSBTZXJ2ZXJUeXBlLlRUaHJlYWRQb29sU2VydmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tcHJvdG90eXBlIiB8fCBhcmdzW2ldID09ICItLXByb2Nlc3Nvcj1wcm90b3R5cGUiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3JGYWN0b3J5VHlwZSA9IFByb2Nlc3NvckZhY3RvcnlUeXBlLlRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tc3NsIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNlRW5jcnlwdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUcmFuc3BvcnQKKyAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHRyYW5zOworICAgICAgICAgICAgICAgIGlmIChwaXBlICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0KHBpcGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodXNlRW5jcnlwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNlcnRQYXRoID0gIi4uL2tleXMvc2VydmVyLnAxMiI7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUVExTU2VydmVyU29ja2V0KHBvcnQsIDAsIHVzZUJ1ZmZlcmVkU29ja2V0cywgbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoY2VydFBhdGgsICJ0aHJpZnQiKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBTc2xQcm90b2NvbHMuVGxzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCwgMCwgdXNlQnVmZmVyZWRTb2NrZXRzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG87CisgICAgICAgICAgICAgICAgaWYgKGNvbXBhY3QpCisgICAgICAgICAgICAgICAgICAgIHByb3RvID0gbmV3IFRDb21wYWN0UHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpzb24pCisgICAgICAgICAgICAgICAgICAgIHByb3RvID0gbmV3IFRKU09OUHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8gPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKKworICAgICAgICAgICAgICAgIFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3Rvcnk7CisgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NvckZhY3RvcnlUeXBlID09IFByb2Nlc3NvckZhY3RvcnlUeXBlLlRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yRmFjdG9yeSA9IG5ldyBUUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeTxUaHJpZnRUZXN0LlByb2Nlc3NvciwgVGVzdEhhbmRsZXI+KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFByb2Nlc3NvcgorICAgICAgICAgICAgICAgICAgICBUZXN0SGFuZGxlciB0ZXN0SGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigpOworICAgICAgICAgICAgICAgICAgICBUaHJpZnRUZXN0LlByb2Nlc3NvciB0ZXN0UHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKHRlc3RIYW5kbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yRmFjdG9yeSA9IG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeSh0ZXN0UHJvY2Vzc29yKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc0ZhY3Rvcnk7CisgICAgICAgICAgICAgICAgaWYgKHVzZUZyYW1lZCkKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNGYWN0b3J5ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNGYWN0b3J5ID0gbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICBUU2VydmVyIHNlcnZlckVuZ2luZTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHNlcnZlclR5cGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFNlcnZlclR5cGUuVFRocmVhZFBvb2xTZXJ2ZXI6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSwgdHJhbnMsIHRyYW5zRmFjdG9yeSwgcHJvdG8pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2VydmVyVHlwZS5UVGhyZWFkZWRTZXJ2ZXI6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFRocmVhZGVkU2VydmVyKHByb2Nlc3NvckZhY3RvcnksIHRyYW5zLCB0cmFuc0ZhY3RvcnksIHByb3RvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSwgdHJhbnMsIHRyYW5zRmFjdG9yeSwgcHJvdG8pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy9TZXJ2ZXIgZXZlbnQgaGFuZGxlcgorICAgICAgICAgICAgICAgIFRyYWRlU2VydmVyRXZlbnRIYW5kbGVyIHNlcnZlckV2ZW50cyA9IG5ldyBUcmFkZVNlcnZlckV2ZW50SGFuZGxlcigpOworICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZS5zZXRFdmVudEhhbmRsZXIoc2VydmVyRXZlbnRzKTsKKworICAgICAgICAgICAgICAgIC8vIFJ1biBpdAorICAgICAgICAgICAgICAgIHN0cmluZyB3aGVyZSA9IChwaXBlICE9IG51bGwgPyAib24gcGlwZSAiICsgcGlwZSA6ICJvbiBwb3J0ICIgKyBwb3J0KTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU3RhcnRpbmcgdGhlICIgKyBzZXJ2ZXJUeXBlLlRvU3RyaW5nKCkgKyAiICIgKyB3aGVyZSArCisgICAgICAgICAgICAgICAgICAgIChwcm9jZXNzb3JGYWN0b3J5VHlwZSA9PSBQcm9jZXNzb3JGYWN0b3J5VHlwZS5UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeSA/ICIgd2l0aCBwcm9jZXNzb3IgcHJvdG90eXBlIGZhY3RvcnkgIiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICh1c2VCdWZmZXJlZFNvY2tldHMgPyAiIHdpdGggYnVmZmVyZWQgc29ja2V0IiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICh1c2VGcmFtZWQgPyAiIHdpdGggZnJhbWVkIHRyYW5zcG9ydCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAodXNlRW5jcnlwdGlvbiA/ICIgd2l0aCBlbmNyeXB0aW9uIiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgIChjb21wYWN0ID8gIiB3aXRoIGNvbXBhY3QgcHJvdG9jb2wiIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgKGpzb24gPyAiIHdpdGgganNvbiBwcm90b2NvbCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAiLi4uIik7CisgICAgICAgICAgICAgICAgc2VydmVyRW5naW5lLlNlcnZlKCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlKHgpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJkb25lLiIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0LmNzcHJvaiBiL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNjI5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NzaGFycC9UaHJpZnRUZXN0LmNzcHJvagpAQCAtMCwwICsxLDE0MSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjIxMDIyPC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPns0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPlRocmlmdFRlc3Q8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5UaHJpZnRUZXN0PC9Bc3NlbWJseU5hbWU+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+CisgICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4KKyAgICA8RmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8L0ZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4KKyAgICA8VXBncmFkZUJhY2t1cExvY2F0aW9uIC8+CisgICAgPFB1Ymxpc2hVcmw+cHVibGlzaFw8L1B1Ymxpc2hVcmw+CisgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8SW5zdGFsbEZyb20+RGlzazwvSW5zdGFsbEZyb20+CisgICAgPFVwZGF0ZUVuYWJsZWQ+ZmFsc2U8L1VwZGF0ZUVuYWJsZWQ+CisgICAgPFVwZGF0ZU1vZGU+Rm9yZWdyb3VuZDwvVXBkYXRlTW9kZT4KKyAgICA8VXBkYXRlSW50ZXJ2YWw+NzwvVXBkYXRlSW50ZXJ2YWw+CisgICAgPFVwZGF0ZUludGVydmFsVW5pdHM+RGF5czwvVXBkYXRlSW50ZXJ2YWxVbml0cz4KKyAgICA8VXBkYXRlUGVyaW9kaWNhbGx5PmZhbHNlPC9VcGRhdGVQZXJpb2RpY2FsbHk+CisgICAgPFVwZGF0ZVJlcXVpcmVkPmZhbHNlPC9VcGRhdGVSZXF1aXJlZD4KKyAgICA8TWFwRmlsZUV4dGVuc2lvbnM+dHJ1ZTwvTWFwRmlsZUV4dGVuc2lvbnM+CisgICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4KKyAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLjA8L0FwcGxpY2F0aW9uVmVyc2lvbj4KKyAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KKyAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlRocmlmdEltcGwsIFZlcnNpb249MC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+CisgICAgICA8SGludFBhdGg+LlxUaHJpZnRJbXBsLmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb2dyYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdENsaWVudC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0U2VydmVyLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkNsaWVudC4zLjUiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMSBDbGllbnQgUHJvZmlsZTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMi4wIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDIuMCAlMjh4ODYlMjk8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuMCI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjAgJTI4eDg2JTI5PC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41PC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0LldpbmRvd3MuSW5zdGFsbGVyLjMuMSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT5XaW5kb3dzIEluc3RhbGxlciAzLjE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXGxpYlxjc2hhcnBcVGhyaWZ0LmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPlRocmlmdDwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LgorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxQcmVCdWlsZEV2ZW50PnJtZGlyIC9zIC9xICIkKFByb2plY3REaXIpZ2VuLWNzaGFycCIKK2RlbCAvZiAvcSAiJChQcm9qZWN0RGlyKVRocmlmdEltcGwuZGxsIgorU0VUIE9VVFBVVF9ESVI9JChQcm9qZWN0RGlyKQorU0VUIFRIUklGVF9GSUxFPSQoUHJvamVjdERpcilcLi5cVGhyaWZ0VGVzdC50aHJpZnQKK2ZvciAlMjUlMjVJIGluICgiJTI1T1VUUFVUX0RJUiUyNSIpIGRvIHNldCBTSE9SVF9ESVI9JTI1JTI1fmZzSQorZm9yICUyNSUyNUkgaW4gKCIlMjVUSFJJRlRfRklMRSUyNSIpIGRvIHNldCBUSFJJRlRfU0hPUlQ9JTI1JTI1fmZzSQorIiQoUHJvamVjdERpcilcLi5cLi5cY29tcGlsZXJcY3BwXHRocmlmdC5leGUiIC0tZ2VuIGNzaGFycCAtbyAlMjVTSE9SVF9ESVIlMjUgJTI1VEhSSUZUX1NIT1JUJTI1CiskKE1TQnVpbGRUb29sc1BhdGgpXENzYy5leGUgL3Q6bGlicmFyeSAvb3V0OiIkKFByb2plY3REaXIpVGhyaWZ0SW1wbC5kbGwiIC9yZWN1cnNlOiIkKFByb2plY3REaXIpZ2VuLWNzaGFycCJcKiAvcmVmZXJlbmNlOiIkKFByb2plY3REaXIpLi5cLi5cbGliXGNzaGFycFxiaW5cRGVidWdcVGhyaWZ0LmRsbCI8L1ByZUJ1aWxkRXZlbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3Quc2xuIGIvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2NWEwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3Quc2xuCkBAIC0wLDAgKzEsMTcgQEAKK++7vworTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTEuMDAKKyMgVmlzdWFsIFN0dWRpbyAyMDEwCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRocmlmdFRlc3QiLCAiVGhyaWZ0VGVzdC5jc3Byb2oiLCAiezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9Qcm9ncmFtLmNzIGIvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9Qcm9ncmFtLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzYzY2E0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvUHJvZ3JhbS5jcworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlCi0vLwotLy8gU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0Ugb3IgdmlzaXQgdGhlIFRocmlmdCBzaXRlIGF0OgotLy8gaHR0cDovL2RldmVsb3BlcnMuZmFjZWJvb2suY29tL3RocmlmdC8KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKLXVzaW5nIFRocmlmdC5Qcm90b2NvbDsKLXVzaW5nIFRocmlmdC5UZXN0OyAvL2dlbmVyYXRlZCBjb2RlCi0KLW5hbWVzcGFjZSBUZXN0Ci17Ci0JY2xhc3MgUHJvZ3JhbQotCXsKLQkJc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQotCQl7Ci0JCQlpZiAoYXJncy5MZW5ndGggPT0gMCkKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgibXVzdCBwcm92aWRlICdzZXJ2ZXInIG9yICdjbGllbnQnIGFyZyIpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJc3RyaW5nW10gc3ViQXJncyA9IG5ldyBzdHJpbmdbYXJncy5MZW5ndGggLSAxXTsKLQkJCWZvcihpbnQgaSA9IDE7IGkgPCBhcmdzLkxlbmd0aDsgaSsrKQotCQkJewotCQkJCXN1YkFyZ3NbaS0xXSA9IGFyZ3NbaV07Ci0JCQl9Ci0JCQlpZiAoYXJnc1swXSA9PSAiY2xpZW50IikKLQkJCXsKLQkJCQlUZXN0Q2xpZW50LkV4ZWN1dGUoc3ViQXJncyk7Ci0JCQl9Ci0JCQllbHNlIGlmIChhcmdzWzBdID09ICJzZXJ2ZXIiKQotCQkJewotCQkJCVRlc3RTZXJ2ZXIuRXhlY3V0ZShzdWJBcmdzKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSAnc2VydmVyJyBvciAnY2xpZW50JyIpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNGNhOGQuLjAwMDAwMDAKLS0tIGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotdXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Ci11c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwotCi0vLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCi0vLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgotLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgotW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJUaHJpZnRUZXN0IildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdFRlc3QiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCDCqSAyMDA5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCi0KLS8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQotLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQotLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgotW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KLQotLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCi1bYXNzZW1ibHk6IEd1aWQoImY0MWIxOTNiLWYxYWItNDhlZS04ODQzLWY4OGU0MzA4NGUyNiIpXQotCi0vLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgotLy8KLS8vICAgICAgTWFqb3IgVmVyc2lvbgotLy8gICAgICBNaW5vciBWZXJzaW9uCi0vLyAgICAgIEJ1aWxkIE51bWJlcgotLy8gICAgICBSZXZpc2lvbgotLy8KLS8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCi0vLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgotLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L1Rlc3RDbGllbnQuY3MgYi90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L1Rlc3RDbGllbnQuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZmM5OTUuLjAwMDAwMDAKLS0tIGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9UZXN0Q2xpZW50LmNzCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwotdXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwotdXNpbmcgVGhyaWZ0LlByb3RvY29sOwotdXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKLXVzaW5nIFRocmlmdC5UZXN0OwotCi1uYW1lc3BhY2UgVGVzdAotewotCXB1YmxpYyBjbGFzcyBUZXN0Q2xpZW50Ci0JewotCQlwcml2YXRlIHN0YXRpYyBpbnQgbnVtSXRlcmF0aW9ucyA9IDE7Ci0KLQkJcHVibGljIHN0YXRpYyB2b2lkIEV4ZWN1dGUoc3RyaW5nW10gYXJncykKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJc3RyaW5nIGhvc3QgPSAibG9jYWxob3N0IjsKLQkJCQlpbnQgcG9ydCA9IDkwOTA7Ci0JCQkJc3RyaW5nIHVybCA9IG51bGw7Ci0JCQkJaW50IG51bVRocmVhZHMgPSAxOwotCQkJCWJvb2wgYnVmZmVyZWQgPSBmYWxzZSwgZnJhbWVkID0gZmFsc2U7Ci0KLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5MZW5ndGg7IGkrKykKLQkJCQkJewotCQkJCQkJaWYgKGFyZ3NbaV0gPT0gIi1oIikKLQkJCQkJCXsKLQkJCQkJCQlzdHJpbmdbXSBob3N0cG9ydCA9IGFyZ3NbKytpXS5TcGxpdCgnOicpOwotCQkJCQkJCWhvc3QgPSBob3N0cG9ydFswXTsKLQkJCQkJCQlpZiAoaG9zdHBvcnQuTGVuZ3RoID4gMSkKLQkJCQkJCQl7Ci0JCQkJCQkJCXBvcnQgPSBDb252ZXJ0LlRvSW50MzIoaG9zdHBvcnRbMV0pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGFyZ3NbaV0gPT0gIi11IikKLQkJCQkJCXsKLQkJCQkJCQl1cmwgPSBhcmdzWysraV07Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChhcmdzW2ldID09ICItbiIpCi0JCQkJCQl7Ci0JCQkJCQkJbnVtSXRlcmF0aW9ucyA9IENvbnZlcnQuVG9JbnQzMihhcmdzWysraV0pOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWIiIHx8IGFyZ3NbaV0gPT0gIi1idWZmZXJlZCIpCi0JCQkJCQl7Ci0JCQkJCQkJYnVmZmVyZWQgPSB0cnVlOwotCQkJCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBidWZmZXJlZCBzb2NrZXRzIik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChhcmdzW2ldID09ICItZiIgfHwgYXJnc1tpXSA9PSAiLWZyYW1lZCIpCi0JCQkJCQl7Ci0JCQkJCQkJZnJhbWVkID0gdHJ1ZTsKLQkJCQkJCQlDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgZnJhbWVkIHRyYW5zcG9ydCIpOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoYXJnc1tpXSA9PSAiLXQiKQotCQkJCQkJewotCQkJCQkJCW51bVRocmVhZHMgPSBDb252ZXJ0LlRvSW50MzIoYXJnc1srK2ldKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCQlDb25zb2xlLldyaXRlTGluZShlLlN0YWNrVHJhY2UpOwotCQkJCX0KLQotCi0KLQkJCQkvL2lzc3VlIHRlc3RzIG9uIHNlcGFyYXRlIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkKLQkJCQlUaHJlYWRbXSB0aHJlYWRzID0gbmV3IFRocmVhZFtudW1UaHJlYWRzXTsKLQkJCQlEYXRlVGltZSBzdGFydCA9IERhdGVUaW1lLk5vdzsKLQkJCQlmb3IgKGludCB0ZXN0ID0gMDsgdGVzdCA8IG51bVRocmVhZHM7IHRlc3QrKykKLQkJCQl7Ci0JCQkJCVRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUGFyYW1ldGVyaXplZFRocmVhZFN0YXJ0KENsaWVudFRocmVhZCkpOwotCQkJCQl0aHJlYWRzW3Rlc3RdID0gdDsKLQkJCQkJaWYgKHVybCA9PSBudWxsKQotCQkJCQl7Ci0JCQkJCQlUVHJhbnNwb3J0IHRyYW5zID0gbmV3IFRTb2NrZXQoaG9zdCwgcG9ydCk7Ci0JCQkJCQlpZiAoYnVmZmVyZWQpCi0JCQkJCQkJdHJhbnMgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zIGFzIFRTdHJlYW1UcmFuc3BvcnQpOwotCQkJCQkJaWYgKGZyYW1lZCkKLQkJCQkJCQl0cmFucyA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKTsKLQkJCQkJCQkKLQkJCQkJCXQuU3RhcnQodHJhbnMpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJVEh0dHBDbGllbnQgaHR0cCA9IG5ldyBUSHR0cENsaWVudChuZXcgVXJpKHVybCkpOwotCQkJCQkJdC5TdGFydChodHRwKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWZvciAoaW50IHRlc3QgPSAwOyB0ZXN0IDwgbnVtVGhyZWFkczsgdGVzdCsrKQotCQkJCXsKLQkJCQkJdGhyZWFkc1t0ZXN0XS5Kb2luKCk7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoIlRvdGFsIHRpbWU6ICIgKyAoRGF0ZVRpbWUuTm93IC0gc3RhcnQpKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gb3V0ZXJFeCkKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZShvdXRlckV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgb3V0ZXJFeC5TdGFja1RyYWNlKTsKLQkJCX0KLQotCQkJQ29uc29sZS5Xcml0ZUxpbmUoKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCk7Ci0JCX0KLQotCQlwdWJsaWMgc3RhdGljIHZvaWQgQ2xpZW50VGhyZWFkKG9iamVjdCBvYmopCi0JCXsKLQkJCVRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gKFRUcmFuc3BvcnQpb2JqOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1JdGVyYXRpb25zOyBpKyspCi0JCQl7Ci0JCQkJQ2xpZW50VGVzdCh0cmFuc3BvcnQpOwotCQkJfQotCQkJdHJhbnNwb3J0LkNsb3NlKCk7Ci0JCX0KLQotCQlwdWJsaWMgc3RhdGljIHZvaWQgQ2xpZW50VGVzdChUVHJhbnNwb3J0IHRyYW5zcG9ydCkKLQkJewotCQkJVEJpbmFyeVByb3RvY29sIGJpbmFyeVByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOwotCi0JCQlUaHJpZnRUZXN0LkNsaWVudCBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5DbGllbnQoYmluYXJ5UHJvdG9jb2wpOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJaWYgKCF0cmFuc3BvcnQuSXNPcGVuKQotCQkJCXsKLQkJCQkJdHJhbnNwb3J0Lk9wZW4oKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoIkNvbm5lY3QgZmFpbGVkOiAiICsgdHR4Lk1lc3NhZ2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJbG9uZyBzdGFydCA9IERhdGVUaW1lLk5vdy5Ub0ZpbGVUaW1lKCk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RWb2lkKCkiKTsKLQkJCWNsaWVudC50ZXN0Vm9pZCgpOwotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHZvaWQiKTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKLQkJCXN0cmluZyBzID0gY2xpZW50LnRlc3RTdHJpbmcoIlRlc3QiKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSBcIiIgKyBzICsgIlwiIik7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RCeXRlKDEpIik7Ci0JCQlieXRlIGk4ID0gY2xpZW50LnRlc3RCeXRlKChieXRlKTEpOwotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpOCk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RJMzIoLTEpIik7Ci0JCQlpbnQgaTMyID0gY2xpZW50LnRlc3RJMzIoLTEpOwotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpMzIpOwotCi0JCQlDb25zb2xlLldyaXRlKCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKLQkJCWxvbmcgaTY0ID0gY2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4KTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTY0KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdERvdWJsZSg1LjMyNTA5ODIzNSkiKTsKLQkJCWRvdWJsZSBkdWIgPSBjbGllbnQudGVzdERvdWJsZSg1LjMyNTA5ODIzNSk7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGR1Yik7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RTdHJ1Y3Qoe1wiWmVyb1wiLCAxLCAtMywgLTV9KSIpOwotCQkJWHRydWN0IG8gPSBuZXcgWHRydWN0KCk7Ci0JCQlvLlN0cmluZ190aGluZyA9ICJaZXJvIjsKLQkJCW8uQnl0ZV90aGluZyA9IChieXRlKTE7Ci0JCQlvLkkzMl90aGluZyA9IC0zOwotCQkJby5JNjRfdGhpbmcgPSAtNTsKLQkJCVh0cnVjdCBpID0gY2xpZW50LnRlc3RTdHJ1Y3Qobyk7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0ge1wiIiArIGkuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaS5CeXRlX3RoaW5nICsgIiwgIiArIGkuSTMyX3RoaW5nICsgIiwgIiArIGkuSTY0X3RoaW5nICsgIn0iKTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSwgNX0pIik7Ci0JCQlYdHJ1Y3QyIG8yID0gbmV3IFh0cnVjdDIoKTsKLQkJCW8yLkJ5dGVfdGhpbmcgPSAoYnl0ZSkxOwotCQkJbzIuU3RydWN0X3RoaW5nID0gbzsKLQkJCW8yLkkzMl90aGluZyA9IDU7Ci0JCQlYdHJ1Y3QyIGkyID0gY2xpZW50LnRlc3ROZXN0KG8yKTsKLQkJCWkgPSBpMi5TdHJ1Y3RfdGhpbmc7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0geyIgKyBpMi5CeXRlX3RoaW5nICsgIiwge1wiIiArIGkuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaS5CeXRlX3RoaW5nICsgIiwgIiArIGkuSTMyX3RoaW5nICsgIiwgIiArIGkuSTY0X3RoaW5nICsgIn0sICIgKyBpMi5JMzJfdGhpbmcgKyAifSIpOwotCi0JCQlEaWN0aW9uYXJ5PGludCwgaW50PiBtYXBvdXQgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgNTsgaisrKQotCQkJewotCQkJCW1hcG91dFtqXSA9IGogLSAxMDsKLQkJCX0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RNYXAoeyIpOwotCQkJYm9vbCBmaXJzdCA9IHRydWU7Ci0JCQlmb3JlYWNoIChpbnQga2V5IGluIG1hcG91dC5LZXlzKQotCQkJewotCQkJCWlmIChmaXJzdCkKLQkJCQl7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUNvbnNvbGUuV3JpdGUoIiwgIik7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiAiICsgbWFwb3V0W2tleV0pOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZSgifSkiKTsKLQotCQkJRGljdGlvbmFyeTxpbnQsIGludD4gbWFwaW4gPSBjbGllbnQudGVzdE1hcChtYXBvdXQpOwotCi0JCQlDb25zb2xlLldyaXRlKCIgPSB7Iik7Ci0JCQlmaXJzdCA9IHRydWU7Ci0JCQlmb3JlYWNoIChpbnQga2V5IGluIG1hcGluLktleXMpCi0JCQl7Ci0JCQkJaWYgKGZpcnN0KQotCQkJCXsKLQkJCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJQ29uc29sZS5Xcml0ZSgiLCAiKTsKLQkJCQl9Ci0JCQkJQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBpbltrZXldKTsKLQkJCX0KLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7Ci0KLQkJCUxpc3Q8aW50PiBsaXN0b3V0ID0gbmV3IExpc3Q8aW50PigpOwotCQkJZm9yIChpbnQgaiA9IC0yOyBqIDwgMzsgaisrKQotCQkJewotCQkJCWxpc3RvdXQuQWRkKGopOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdExpc3QoeyIpOwotCQkJZmlyc3QgPSB0cnVlOwotCQkJZm9yZWFjaCAoaW50IGogaW4gbGlzdG91dCkKLQkJCXsKLQkJCQlpZiAoZmlyc3QpCi0JCQkJewotCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlDb25zb2xlLldyaXRlKCIsICIpOwotCQkJCX0KLQkJCQlDb25zb2xlLldyaXRlKGopOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZSgifSkiKTsKLQotCQkJTGlzdDxpbnQ+IGxpc3RpbiA9IGNsaWVudC50ZXN0TGlzdChsaXN0b3V0KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgiID0geyIpOwotCQkJZmlyc3QgPSB0cnVlOwotCQkJZm9yZWFjaCAoaW50IGogaW4gbGlzdGluKQotCQkJewotCQkJCWlmIChmaXJzdCkKLQkJCQl7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUNvbnNvbGUuV3JpdGUoIiwgIik7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoaik7Ci0JCQl9Ci0JCQlDb25zb2xlLldyaXRlTGluZSgifSIpOwotCi0JCQkvL3NldAotCQkJVEhhc2hTZXQ8aW50PiBzZXRvdXQgPSBuZXcgVEhhc2hTZXQ8aW50PigpOwotCQkJZm9yIChpbnQgaiA9IC0yOyBqIDwgMzsgaisrKQotCQkJewotCQkJCXNldG91dC5BZGQoaik7Ci0JCQl9Ci0JCQlDb25zb2xlLldyaXRlKCJ0ZXN0U2V0KHsiKTsKLQkJCWZpcnN0ID0gdHJ1ZTsKLQkJCWZvcmVhY2ggKGludCBqIGluIHNldG91dCkKLQkJCXsKLQkJCQlpZiAoZmlyc3QpCi0JCQkJewotCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlDb25zb2xlLldyaXRlKCIsICIpOwotCQkJCX0KLQkJCQlDb25zb2xlLldyaXRlKGopOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZSgifSkiKTsKLQotCQkJVEhhc2hTZXQ8aW50PiBzZXRpbiA9IGNsaWVudC50ZXN0U2V0KHNldG91dCk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoIiA9IHsiKTsKLQkJCWZpcnN0ID0gdHJ1ZTsKLQkJCWZvcmVhY2ggKGludCBqIGluIHNldGluKQotCQkJewotCQkJCWlmIChmaXJzdCkKLQkJCQl7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUNvbnNvbGUuV3JpdGUoIiwgIik7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoaik7Ci0JCQl9Ci0JCQlDb25zb2xlLldyaXRlTGluZSgifSIpOwotCi0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RFbnVtKE9ORSkiKTsKLQkJCU51bWJlcnogcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouT05FKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oVFdPKSIpOwotCQkJcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouVFdPKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oVEhSRUUpIik7Ci0JCQlyZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5USFJFRSk7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RFbnVtKEZJVkUpIik7Ci0JCQlyZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5GSVZFKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oRUlHSFQpIik7Ci0JCQlyZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5FSUdIVCk7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiKTsKLQkJCWxvbmcgdWlkID0gY2xpZW50LnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyM0wpOwotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyB1aWQpOwotCi0JCQlDb25zb2xlLldyaXRlKCJ0ZXN0TWFwTWFwKDEpIik7Ci0JCQlEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+IG1tID0gY2xpZW50LnRlc3RNYXBNYXAoMSk7Ci0JCQlDb25zb2xlLldyaXRlKCIgPSB7Iik7Ci0JCQlmb3JlYWNoIChpbnQga2V5IGluIG1tLktleXMpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+IHsiKTsKLQkJCQlEaWN0aW9uYXJ5PGludCwgaW50PiBtMiA9IG1tW2tleV07Ci0JCQkJZm9yZWFjaCAoaW50IGsyIGluIG0yLktleXMpCi0JCQkJewotCQkJCQlDb25zb2xlLldyaXRlKGsyICsgIiA9PiAiICsgbTJbazJdICsgIiwgIik7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoIn0sICIpOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKLQotCQkJSW5zYW5pdHkgaW5zYW5lID0gbmV3IEluc2FuaXR5KCk7Ci0JCQlpbnNhbmUuVXNlck1hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIGxvbmc+KCk7Ci0JCQlpbnNhbmUuVXNlck1hcFtOdW1iZXJ6LkZJVkVdID0gNTAwMEw7Ci0JCQlYdHJ1Y3QgdHJ1Y2sgPSBuZXcgWHRydWN0KCk7Ci0JCQl0cnVjay5TdHJpbmdfdGhpbmcgPSAiVHJ1Y2siOwotCQkJdHJ1Y2suQnl0ZV90aGluZyA9IChieXRlKTg7Ci0JCQl0cnVjay5JMzJfdGhpbmcgPSA4OwotCQkJdHJ1Y2suSTY0X3RoaW5nID0gODsKLQkJCWluc2FuZS5YdHJ1Y3RzID0gbmV3IExpc3Q8WHRydWN0PigpOwotCQkJaW5zYW5lLlh0cnVjdHMuQWRkKHRydWNrKTsKLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RJbnNhbml0eSgpIik7Ci0JCQlEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PiB3aG9hID0gY2xpZW50LnRlc3RJbnNhbml0eShpbnNhbmUpOwotCQkJQ29uc29sZS5Xcml0ZSgiID0geyIpOwotCQkJZm9yZWFjaCAobG9uZyBrZXkgaW4gd2hvYS5LZXlzKQotCQkJewotCQkJCURpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+IHZhbCA9IHdob2Fba2V5XTsKLQkJCQlDb25zb2xlLldyaXRlKGtleSArICIgPT4geyIpOwotCi0JCQkJZm9yZWFjaCAoTnVtYmVyeiBrMiBpbiB2YWwuS2V5cykKLQkJCQl7Ci0JCQkJCUluc2FuaXR5IHYyID0gdmFsW2syXTsKLQotCQkJCQlDb25zb2xlLldyaXRlKGsyICsgIiA9PiB7Iik7Ci0JCQkJCURpY3Rpb25hcnk8TnVtYmVyeiwgbG9uZz4gdXNlck1hcCA9IHYyLlVzZXJNYXA7Ci0KLQkJCQkJQ29uc29sZS5Xcml0ZSgieyIpOwotCQkJCQlpZiAodXNlck1hcCAhPSBudWxsKQotCQkJCQl7Ci0JCQkJCQlmb3JlYWNoIChOdW1iZXJ6IGszIGluIHVzZXJNYXAuS2V5cykKLQkJCQkJCXsKLQkJCQkJCQlDb25zb2xlLldyaXRlKGszICsgIiA9PiAiICsgdXNlck1hcFtrM10gKyAiLCAiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCUNvbnNvbGUuV3JpdGUoIm51bGwiKTsKLQkJCQkJfQotCQkJCQlDb25zb2xlLldyaXRlKCJ9LCAiKTsKLQotCQkJCQlMaXN0PFh0cnVjdD4geHRydWN0cyA9IHYyLlh0cnVjdHM7Ci0KLQkJCQkJQ29uc29sZS5Xcml0ZSgieyIpOwotCQkJCQlpZiAoeHRydWN0cyAhPSBudWxsKQotCQkJCQl7Ci0JCQkJCQlmb3JlYWNoIChYdHJ1Y3QgeCBpbiB4dHJ1Y3RzKQotCQkJCQkJewotCQkJCQkJCUNvbnNvbGUuV3JpdGUoIntcIiIgKyB4LlN0cmluZ190aGluZyArICJcIiwgIiArIHguQnl0ZV90aGluZyArICIsICIgKyB4LkkzMl90aGluZyArICIsICIgKyB4LkkzMl90aGluZyArICJ9LCAiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCUNvbnNvbGUuV3JpdGUoIm51bGwiKTsKLQkJCQkJfQotCQkJCQlDb25zb2xlLldyaXRlKCJ9Iik7Ci0KLQkJCQkJQ29uc29sZS5Xcml0ZSgifSwgIik7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoIn0sICIpOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKLQotCi0JCQlieXRlIGFyZzAgPSAxOwotCQkJaW50IGFyZzEgPSAyOwotCQkJbG9uZyBhcmcyID0gbG9uZy5NYXhWYWx1ZTsKLQkJCURpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4gbXVsdGlEaWN0ID0gbmV3IERpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4oKTsKLQkJCW11bHRpRGljdFsxXSA9ICJvbmUiOwotCQkJTnVtYmVyeiBhcmc0ID0gTnVtYmVyei5GSVZFOwotCQkJbG9uZyBhcmc1ID0gNTAwMDAwMDsKLQkJCUNvbnNvbGUuV3JpdGUoIlRlc3QgTXVsdGkoIiArIGFyZzAgKyAiLCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIsIiArIG11bHRpRGljdCArICIsIiArIGFyZzQgKyAiLCIgKyBhcmc1ICsgIikiKTsKLQkJCVh0cnVjdCBtdWx0aVJlc3BvbnNlID0gY2xpZW50LnRlc3RNdWx0aShhcmcwLCBhcmcxLCBhcmcyLCBtdWx0aURpY3QsIGFyZzQsIGFyZzUpOwotCQkJQ29uc29sZS5Xcml0ZSgiID0gWHRydWN0KGJ5dGVfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuQnl0ZV90aGluZyArICIsU3RyaW5nX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLlN0cmluZ190aGluZwotCQkJCQkJKyAiLGkzMl90aGluZzoiICsgbXVsdGlSZXNwb25zZS5JMzJfdGhpbmcgKyAiLGk2NF90aGluZzoiICsgbXVsdGlSZXNwb25zZS5JNjRfdGhpbmcgKyAiKVxuIik7Ci0KLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJUZXN0IE9uZXdheSgxKSIpOwotCQkJY2xpZW50LnRlc3RPbmV3YXkoMSk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoIlRlc3QgQ2FsbHRpbWUoKSIpOwotCQkJdmFyIHN0YXJ0dCA9IERhdGVUaW1lLlV0Y05vdzsKLQkJCWZvciAoIGludCBrPTA7IGs8MTAwMDsgKytrICkKLQkJCQljbGllbnQudGVzdFZvaWQoKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgKERhdGVUaW1lLlV0Y05vdyAtIHN0YXJ0dCkuVG90YWxTZWNvbmRzLlRvU3RyaW5nKCkgKyAiIG1zIGEgdGVzdFZvaWQoKSBjYWxsIiApOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9UZXN0U2VydmVyLmNzIGIvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9UZXN0U2VydmVyLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTRlYzljLi4wMDAwMDAwCi0tLSBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvVGVzdFNlcnZlci5jcworKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZQotLy8KLS8vIFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFIG9yIHZpc2l0IHRoZSBUaHJpZnQgc2l0ZSBhdDoKLS8vIGh0dHA6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS90aHJpZnQvCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKLXVzaW5nIFRocmlmdC5UZXN0OyAvL2dlbmVyYXRlZCBjb2RlCi11c2luZyBUaHJpZnQuVHJhbnNwb3J0OwotdXNpbmcgVGhyaWZ0LlByb3RvY29sOwotdXNpbmcgVGhyaWZ0LlNlcnZlcjsKLQotbmFtZXNwYWNlIFRlc3QKLXsKLQlwdWJsaWMgY2xhc3MgVGVzdFNlcnZlcgotCXsKLQkJcHVibGljIGNsYXNzIFRlc3RIYW5kbGVyIDogVGhyaWZ0VGVzdC5JZmFjZQotCQl7Ci0JCQlwdWJsaWMgVFNlcnZlciBzZXJ2ZXI7Ci0KLQkJCXB1YmxpYyBUZXN0SGFuZGxlcigpIHsgfQotCi0JCQlwdWJsaWMgdm9pZCB0ZXN0Vm9pZCgpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RWb2lkKCkiKTsKLQkJCX0KLQotCQkJcHVibGljIHN0cmluZyB0ZXN0U3RyaW5nKHN0cmluZyB0aGluZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdHN0cmluZyhcIiIgKyB0aGluZyArICJcIikiKTsKLQkJCQlyZXR1cm4gdGhpbmc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBieXRlIHRlc3RCeXRlKGJ5dGUgdGhpbmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RCeXRlKCIgKyB0aGluZyArICIpIik7Ci0JCQkJcmV0dXJuIHRoaW5nOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IHRlc3RJMzIoaW50IHRoaW5nKQotCQkJewotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0STMyKCIgKyB0aGluZyArICIpIik7Ci0JCQkJcmV0dXJuIHRoaW5nOwotCQkJfQotCi0JCQlwdWJsaWMgbG9uZyB0ZXN0STY0KGxvbmcgdGhpbmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RJNjQoIiArIHRoaW5nICsgIikiKTsKLQkJCQlyZXR1cm4gdGhpbmc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBkb3VibGUgdGVzdERvdWJsZShkb3VibGUgdGhpbmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3REb3VibGUoIiArIHRoaW5nICsgIikiKTsKLQkJCQlyZXR1cm4gdGhpbmc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBYdHJ1Y3QgdGVzdFN0cnVjdChYdHJ1Y3QgdGhpbmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RTdHJ1Y3QoeyIgKwotCQkJCQkJCQkgIlwiIiArIHRoaW5nLlN0cmluZ190aGluZyArICJcIiwgIiArCi0JCQkJCQkJCSB0aGluZy5CeXRlX3RoaW5nICsgIiwgIiArCi0JCQkJCQkJCSB0aGluZy5JMzJfdGhpbmcgKyAiLCAiICsKLQkJCQkJCQkJIHRoaW5nLkk2NF90aGluZyArICJ9KSIpOwotCQkJCXJldHVybiB0aGluZzsKLQkJCX0KLQotCQkJcHVibGljIFh0cnVjdDIgdGVzdE5lc3QoWHRydWN0MiBuZXN0KQotCQkJewotCQkJCVh0cnVjdCB0aGluZyA9IG5lc3QuU3RydWN0X3RoaW5nOwotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TmVzdCh7IiArCi0JCQkJCQkJCSBuZXN0LkJ5dGVfdGhpbmcgKyAiLCB7IiArCi0JCQkJCQkJCSAiXCIiICsgdGhpbmcuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsKLQkJCQkJCQkJIHRoaW5nLkJ5dGVfdGhpbmcgKyAiLCAiICsKLQkJCQkJCQkJIHRoaW5nLkkzMl90aGluZyArICIsICIgKwotCQkJCQkJCQkgdGhpbmcuSTY0X3RoaW5nICsgIn0sICIgKwotCQkJCQkJCQkgbmVzdC5JMzJfdGhpbmcgKyAifSkiKTsKLQkJCQlyZXR1cm4gbmVzdDsKLQkJCX0KLQotCQkJcHVibGljIERpY3Rpb25hcnk8aW50LCBpbnQ+IHRlc3RNYXAoRGljdGlvbmFyeTxpbnQsIGludD4gdGhpbmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RNYXAoeyIpOwotCQkJCWJvb2wgZmlyc3QgPSB0cnVlOwotCQkJCWZvcmVhY2ggKGludCBrZXkgaW4gdGhpbmcuS2V5cykKLQkJCQl7Ci0JCQkJCWlmIChmaXJzdCkKLQkJCQkJewotCQkJCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIsICIpOwotCQkJCQl9Ci0JCQkJCUNvbnNvbGUuV3JpdGVMaW5lKGtleSArICIgPT4gIiArIHRoaW5nW2tleV0pOwotCQkJCX0KLQkJCQlDb25zb2xlLldyaXRlTGluZSgifSkiKTsKLQkJCQlyZXR1cm4gdGhpbmc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBUSGFzaFNldDxpbnQ+IHRlc3RTZXQoVEhhc2hTZXQ8aW50PiB0aGluZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdFNldCh7Iik7Ci0JCQkJYm9vbCBmaXJzdCA9IHRydWU7Ci0JCQkJZm9yZWFjaCAoaW50IGVsZW0gaW4gdGhpbmcpCi0JCQkJewotCQkJCQlpZiAoZmlyc3QpCi0JCQkJCXsKLQkJCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlDb25zb2xlLldyaXRlTGluZSgiLCAiKTsKLQkJCQkJfQotCQkJCQlDb25zb2xlLldyaXRlTGluZShlbGVtKTsKLQkJCQl9Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoIn0pIik7Ci0JCQkJcmV0dXJuIHRoaW5nOwotCQkJfQotCi0JCQlwdWJsaWMgTGlzdDxpbnQ+IHRlc3RMaXN0KExpc3Q8aW50PiB0aGluZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdExpc3QoeyIpOwotCQkJCWJvb2wgZmlyc3QgPSB0cnVlOwotCQkJCWZvcmVhY2ggKGludCBlbGVtIGluIHRoaW5nKQotCQkJCXsKLQkJCQkJaWYgKGZpcnN0KQotCQkJCQl7Ci0JCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiwgIik7Ci0JCQkJCX0KLQkJCQkJQ29uc29sZS5Xcml0ZUxpbmUoZWxlbSk7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ9KSIpOwotCQkJCXJldHVybiB0aGluZzsKLQkJCX0KLQotCQkJcHVibGljIE51bWJlcnogdGVzdEVudW0oTnVtYmVyeiB0aGluZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdEVudW0oIiArIHRoaW5nICsgIikiKTsKLQkJCQlyZXR1cm4gdGhpbmc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBsb25nIHRlc3RUeXBlZGVmKGxvbmcgdGhpbmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RUeXBlZGVmKCIgKyB0aGluZyArICIpIik7Ci0JCQkJcmV0dXJuIHRoaW5nOwotCQkJfQotCi0JCQlwdWJsaWMgRGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+PiB0ZXN0TWFwTWFwKGludCBoZWxsbykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdE1hcE1hcCgiICsgaGVsbG8gKyAiKSIpOwotCQkJCURpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4gbWFwbWFwID0KLQkJCQkgIG5ldyBEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+KCk7Ci0KLQkJCQlEaWN0aW9uYXJ5PGludCwgaW50PiBwb3MgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKLQkJCQlEaWN0aW9uYXJ5PGludCwgaW50PiBuZWcgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKLQkJCQlmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykKLQkJCQl7Ci0JCQkJCXBvc1tpXSA9IGk7Ci0JCQkJCW5lZ1staV0gPSAtaTsKLQkJCQl9Ci0KLQkJCQltYXBtYXBbNF0gPSBwb3M7Ci0JCQkJbWFwbWFwWy00XSA9IG5lZzsKLQotCQkJCXJldHVybiBtYXBtYXA7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PiB0ZXN0SW5zYW5pdHkoSW5zYW5pdHkgYXJndW1lbnQpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RJbnNhbml0eSgpIik7Ci0KLQkJCQlYdHJ1Y3QgaGVsbG8gPSBuZXcgWHRydWN0KCk7Ci0JCQkJaGVsbG8uU3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7Ci0JCQkJaGVsbG8uQnl0ZV90aGluZyA9IDI7Ci0JCQkJaGVsbG8uSTMyX3RoaW5nID0gMjsKLQkJCQloZWxsby5JNjRfdGhpbmcgPSAyOwotCi0JCQkJWHRydWN0IGdvb2RieWUgPSBuZXcgWHRydWN0KCk7Ci0JCQkJZ29vZGJ5ZS5TdHJpbmdfdGhpbmcgPSAiR29vZGJ5ZTQiOwotCQkJCWdvb2RieWUuQnl0ZV90aGluZyA9IChieXRlKTQ7Ci0JCQkJZ29vZGJ5ZS5JMzJfdGhpbmcgPSA0OwotCQkJCWdvb2RieWUuSTY0X3RoaW5nID0gKGxvbmcpNDsKLQotCQkJCUluc2FuaXR5IGNyYXp5ID0gbmV3IEluc2FuaXR5KCk7Ci0JCQkJY3JhenkuVXNlck1hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIGxvbmc+KCk7Ci0JCQkJY3JhenkuVXNlck1hcFtOdW1iZXJ6LkVJR0hUXSA9IChsb25nKTg7Ci0JCQkJY3JhenkuWHRydWN0cyA9IG5ldyBMaXN0PFh0cnVjdD4oKTsKLQkJCQljcmF6eS5YdHJ1Y3RzLkFkZChnb29kYnllKTsKLQotCQkJCUluc2FuaXR5IGxvb25leSA9IG5ldyBJbnNhbml0eSgpOwotCQkJCWNyYXp5LlVzZXJNYXBbTnVtYmVyei5GSVZFXSA9IChsb25nKTU7Ci0JCQkJY3JhenkuWHRydWN0cy5BZGQoaGVsbG8pOwotCi0JCQkJRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4gZmlyc3RfbWFwID0gbmV3IERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+KCk7Ci0JCQkJRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4gc2Vjb25kX21hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PigpOyA7Ci0KLQkJCQlmaXJzdF9tYXBbTnVtYmVyei5UV09dID0gY3Jhenk7Ci0JCQkJZmlyc3RfbWFwW051bWJlcnouVEhSRUVdID0gY3Jhenk7Ci0KLQkJCQlzZWNvbmRfbWFwW051bWJlcnouU0lYXSA9IGxvb25leTsKLQotCQkJCURpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+IGluc2FuZSA9Ci0JCQkJICBuZXcgRGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4oKTsKLQkJCQlpbnNhbmVbKGxvbmcpMV0gPSBmaXJzdF9tYXA7Ci0JCQkJaW5zYW5lWyhsb25nKTJdID0gc2Vjb25kX21hcDsKLQotCQkJCXJldHVybiBpbnNhbmU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBYdHJ1Y3QgdGVzdE11bHRpKGJ5dGUgYXJnMCwgaW50IGFyZzEsIGxvbmcgYXJnMiwgRGljdGlvbmFyeTxzaG9ydCwgc3RyaW5nPiBhcmczLCBOdW1iZXJ6IGFyZzQsIGxvbmcgYXJnNSkKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdE11bHRpKCkiKTsKLQotCQkJCVh0cnVjdCBoZWxsbyA9IG5ldyBYdHJ1Y3QoKTsgOwotCQkJCWhlbGxvLlN0cmluZ190aGluZyA9ICJIZWxsbzIiOwotCQkJCWhlbGxvLkJ5dGVfdGhpbmcgPSBhcmcwOwotCQkJCWhlbGxvLkkzMl90aGluZyA9IGFyZzE7Ci0JCQkJaGVsbG8uSTY0X3RoaW5nID0gYXJnMjsKLQkJCQlyZXR1cm4gaGVsbG87Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb24oc3RyaW5nIGFyZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdEV4Y2VwdGlvbigiICsgYXJnICsgIikiKTsKLQkJCQlpZiAoYXJnID09ICJYY2VwdGlvbiIpCi0JCQkJewotCQkJCQlYY2VwdGlvbiB4ID0gbmV3IFhjZXB0aW9uKCk7Ci0JCQkJCXguRXJyb3JDb2RlID0gMTAwMTsKLQkJCQkJeC5NZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iOwotCQkJCQl0aHJvdyB4OwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCXB1YmxpYyBYdHJ1Y3QgdGVzdE11bHRpRXhjZXB0aW9uKHN0cmluZyBhcmcwLCBzdHJpbmcgYXJnMSkKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdE11bHRpRXhjZXB0aW9uKCIgKyBhcmcwICsgIiwgIiArIGFyZzEgKyAiKSIpOwotCQkJCWlmIChhcmcwID09ICJYY2VwdGlvbiIpCi0JCQkJewotCQkJCQlYY2VwdGlvbiB4ID0gbmV3IFhjZXB0aW9uKCk7Ci0JCQkJCXguRXJyb3JDb2RlID0gMTAwMTsKLQkJCQkJeC5NZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iOwotCQkJCQl0aHJvdyB4OwotCQkJCX0KLQkJCQllbHNlIGlmIChhcmcwID09ICJYY2VwdGlvbjIiKQotCQkJCXsKLQkJCQkJWGNlcHRpb24yIHggPSBuZXcgWGNlcHRpb24yKCk7Ci0JCQkJCXguRXJyb3JDb2RlID0gMjAwMjsKLQkJCQkJeC5TdHJ1Y3RfdGhpbmcgPSBuZXcgWHRydWN0KCk7Ci0JCQkJCXguU3RydWN0X3RoaW5nLlN0cmluZ190aGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiI7Ci0JCQkJCXRocm93IHg7Ci0JCQkJfQotCi0JCQkJWHRydWN0IHJlc3VsdCA9IG5ldyBYdHJ1Y3QoKTsKLQkJCQlyZXN1bHQuU3RyaW5nX3RoaW5nID0gYXJnMTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB0ZXN0U3RvcCgpCi0JCQl7Ci0JCQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJCXsKLQkJCQkJc2VydmVyLlN0b3AoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHRlc3RPbmV3YXkoaW50IGFyZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdE9uZXdheSgiICsgYXJnICsgIiksIHNsZWVwaW5nLi4uIik7Ci0JCQkJU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoYXJnICogMTAwMCk7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RPbmV3YXkgZmluaXNoZWQiKTsKLQkJCX0KLQotCQl9IC8vIGNsYXNzIFRlc3RIYW5kbGVyCi0KLQkJcHVibGljIHN0YXRpYyB2b2lkIEV4ZWN1dGUoc3RyaW5nW10gYXJncykKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMgPSBmYWxzZSwgdXNlRnJhbWVkID0gZmFsc2U7Ci0JCQkJaW50IHBvcnQgPSA5MDkwOwotCQkJCWlmIChhcmdzLkxlbmd0aCA+IDApCi0JCQkJewotCQkJCQlwb3J0ID0gaW50LlBhcnNlKGFyZ3NbMF0pOwotCi0JCQkJCWlmIChhcmdzLkxlbmd0aCA+IDEpCi0JCQkJCXsKLQkJCQkJCWlmICggYXJnc1sxXSA9PSAicmF3IiApCi0JCQkJCQl7Ci0JCQkJCQkJLy8gYXMgZGVmYXVsdAotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoIGFyZ3NbMV0gPT0gImJ1ZmZlcmVkIiApCi0JCQkJCQl7Ci0JCQkJCQkJdXNlQnVmZmVyZWRTb2NrZXRzID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKCBhcmdzWzFdID09ICJmcmFtZWQiICkKLQkJCQkJCXsKLQkJCQkJCQl1c2VGcmFtZWQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCS8vIEZhbGwgYmFjayB0byB0aGUgb2xkZXIgYm9vbGVhbiBzeW50YXgKLQkJCQkJCQlib29sLlRyeVBhcnNlKGFyZ3NbMV0sIG91dCB1c2VCdWZmZXJlZFNvY2tldHMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gUHJvY2Vzc29yCi0JCQkJVGVzdEhhbmRsZXIgdGVzdEhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKLQkJCQlUaHJpZnRUZXN0LlByb2Nlc3NvciB0ZXN0UHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKHRlc3RIYW5kbGVyKTsKLQotCQkJCS8vIFRyYW5zcG9ydAotCQkJCVRTZXJ2ZXJTb2NrZXQgdFNlcnZlclNvY2tldCA9IG5ldyBUU2VydmVyU29ja2V0KHBvcnQsIDAsIHVzZUJ1ZmZlcmVkU29ja2V0cyk7Ci0KLQkJCQkvLyBTaW1wbGUgU2VydmVyCi0JCQkJVFNlcnZlciBzZXJ2ZXJFbmdpbmU7Ci0JCQkJaWYgKCB1c2VGcmFtZWQgKQotCQkJCQlzZXJ2ZXJFbmdpbmUgPSBuZXcgVFNpbXBsZVNlcnZlcih0ZXN0UHJvY2Vzc29yLCB0U2VydmVyU29ja2V0LCBuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCkpOwotCQkJCWVsc2UKLQkJCQkJc2VydmVyRW5naW5lID0gbmV3IFRTaW1wbGVTZXJ2ZXIodGVzdFByb2Nlc3NvciwgdFNlcnZlclNvY2tldCk7Ci0KLQkJCQkvLyBUaHJlYWRQb29sIFNlcnZlcgotCQkJCS8vIHNlcnZlckVuZ2luZSA9IG5ldyBUVGhyZWFkUG9vbFNlcnZlcih0ZXN0UHJvY2Vzc29yLCB0U2VydmVyU29ja2V0KTsKLQotCQkJCS8vIFRocmVhZGVkIFNlcnZlcgotCQkJCS8vIHNlcnZlckVuZ2luZSA9IG5ldyBUVGhyZWFkZWRTZXJ2ZXIodGVzdFByb2Nlc3NvciwgdFNlcnZlclNvY2tldCk7Ci0KLQkJCQl0ZXN0SGFuZGxlci5zZXJ2ZXIgPSBzZXJ2ZXJFbmdpbmU7Ci0KLQkJCQkvLyBSdW4gaXQKLQkJCQlDb25zb2xlLldyaXRlTGluZSgiU3RhcnRpbmcgdGhlIHNlcnZlciBvbiBwb3J0ICIgKyBwb3J0ICsgCi0JCQkJCSh1c2VCdWZmZXJlZFNvY2tldHMgPyAiIHdpdGggYnVmZmVyZWQgc29ja2V0IiA6ICIiKSArIAotCQkJCQkodXNlRnJhbWVkID8gIiB3aXRoIGZyYW1lZCB0cmFuc3BvcnQiIDogIiIpICsgCi0JCQkJCSIuLi4iKTsKLQkJCQlzZXJ2ZXJFbmdpbmUuU2VydmUoKTsKLQotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiB4KQotCQkJewotCQkJCUNvbnNvbGUuRXJyb3IuV3JpdGUoeCk7Ci0JCQl9Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiZG9uZS4iKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvVGhyaWZ0VGVzdC5jc3Byb2ogYi90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L1RocmlmdFRlc3QuY3Nwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTU1ODNhLi4wMDAwMDAwCi0tLSBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvVGhyaWZ0VGVzdC5jc3Byb2oKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KLSAgPFByb3BlcnR5R3JvdXA+Ci0gICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+Ci0gICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgotICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMjEwMjI8L1Byb2R1Y3RWZXJzaW9uPgotICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KLSAgICA8UHJvamVjdEd1aWQ+ezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ308L1Byb2plY3RHdWlkPgotICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KLSAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+Ci0gICAgPFJvb3ROYW1lc3BhY2U+VGhyaWZ0VGVzdDwvUm9vdE5hbWVzcGFjZT4KLSAgICA8QXNzZW1ibHlOYW1lPlRocmlmdFRlc3Q8L0Fzc2VtYmx5TmFtZT4KLSAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgotICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KLSAgICA8UHVibGlzaFVybD5wdWJsaXNoXDwvUHVibGlzaFVybD4KLSAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgotICAgIDxJbnN0YWxsRnJvbT5EaXNrPC9JbnN0YWxsRnJvbT4KLSAgICA8VXBkYXRlRW5hYmxlZD5mYWxzZTwvVXBkYXRlRW5hYmxlZD4KLSAgICA8VXBkYXRlTW9kZT5Gb3JlZ3JvdW5kPC9VcGRhdGVNb2RlPgotICAgIDxVcGRhdGVJbnRlcnZhbD43PC9VcGRhdGVJbnRlcnZhbD4KLSAgICA8VXBkYXRlSW50ZXJ2YWxVbml0cz5EYXlzPC9VcGRhdGVJbnRlcnZhbFVuaXRzPgotICAgIDxVcGRhdGVQZXJpb2RpY2FsbHk+ZmFsc2U8L1VwZGF0ZVBlcmlvZGljYWxseT4KLSAgICA8VXBkYXRlUmVxdWlyZWQ+ZmFsc2U8L1VwZGF0ZVJlcXVpcmVkPgotICAgIDxNYXBGaWxlRXh0ZW5zaW9ucz50cnVlPC9NYXBGaWxlRXh0ZW5zaW9ucz4KLSAgICA8QXBwbGljYXRpb25SZXZpc2lvbj4wPC9BcHBsaWNhdGlvblJldmlzaW9uPgotICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuJTJhPC9BcHBsaWNhdGlvblZlcnNpb24+Ci0gICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4KLSAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KLSAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgotICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgotICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgotICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+Ci0gICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+Ci0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+Ci0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KLSAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KLSAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+Ci0gICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgotICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KLSAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KLSAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iVGhyaWZ0SW1wbCwgVmVyc2lvbj0wLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KLSAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4KLSAgICAgIDxIaW50UGF0aD4uXFRocmlmdEltcGwuZGxsPC9IaW50UGF0aD4KLSAgICA8L1JlZmVyZW5jZT4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvZ3JhbS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0Q2xpZW50LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RTZXJ2ZXIuY3MiIC8+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjIuMCI+Ci0gICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KLSAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAyLjAgJTI4eDg2JTI5PC9Qcm9kdWN0TmFtZT4KLSAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgotICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KLSAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjAiPgotICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+Ci0gICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy4wICUyOHg4NiUyOTwvUHJvZHVjdE5hbWU+Ci0gICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+Ci0gICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41Ij4KLSAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgotICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNTwvUHJvZHVjdE5hbWU+Ci0gICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgotICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KLSAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2luZG93cy5JbnN0YWxsZXIuMy4xIj4KLSAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgotICAgICAgPFByb2R1Y3ROYW1lPldpbmRvd3MgSW5zdGFsbGVyIDMuMTwvUHJvZHVjdE5hbWU+Ci0gICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgotICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGNzaGFycFxzcmNcVGhyaWZ0LmNzcHJvaiI+Ci0gICAgICA8UHJvamVjdD57NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfTwvUHJvamVjdD4KLSAgICAgIDxOYW1lPlRocmlmdDwvTmFtZT4KLSAgICA8L1Byb2plY3RSZWZlcmVuY2U+Ci0gIDwvSXRlbUdyb3VwPgotICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgotICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LgotICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KLSAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+Ci0gIDwvVGFyZ2V0PgotICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgotICA8L1RhcmdldD4KLSAgLS0+Ci0gIDxQcm9wZXJ0eUdyb3VwPgotICAgIDxQcmVCdWlsZEV2ZW50PnJtZGlyIC9zIC9xICIkKFByb2plY3REaXIpZ2VuLWNzaGFycCIKLWRlbCAvZiAvcSAiJChQcm9qZWN0RGlyKVRocmlmdEltcGwuZGxsIgotU0VUIE9VVFBVVF9ESVI9JChQcm9qZWN0RGlyKQotU0VUIFRIUklGVF9GSUxFPSQoUHJvamVjdERpcilcLi5cLi5cVGhyaWZ0VGVzdC50aHJpZnQKLWZvciAlMjUlMjVJIGluICgiJTI1T1VUUFVUX0RJUiUyNSIpIGRvIHNldCBTSE9SVF9ESVI9JTI1JTI1fmZzSQotZm9yICUyNSUyNUkgaW4gKCIlMjVUSFJJRlRfRklMRSUyNSIpIGRvIHNldCBUSFJJRlRfU0hPUlQ9JTI1JTI1fmZzSQotIiQoUHJvamVjdERpcilcLi5cLi5cLi5cY29tcGlsZXJcY3BwXHRocmlmdC5leGUiIC0tZ2VuIGNzaGFycCAtbyAlMjVTSE9SVF9ESVIlMjUgJTI1VEhSSUZUX1NIT1JUJTI1Ci0kKE1TQnVpbGRUb29sc1BhdGgpXENzYy5leGUgL3Q6bGlicmFyeSAvb3V0OiIkKFByb2plY3REaXIpVGhyaWZ0SW1wbC5kbGwiIC9yZWN1cnNlOiIkKFByb2plY3REaXIpZ2VuLWNzaGFycCJcKiAvcmVmZXJlbmNlOiIkKFByb2plY3REaXIpLi5cLi5cLi5cbGliXGNzaGFycFxzcmNcYmluXERlYnVnXFRocmlmdC5kbGwiPC9QcmVCdWlsZEV2ZW50PgotICA8L1Byb3BlcnR5R3JvdXA+Ci08L1Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L21ha2V0ZXN0LnNoIGIvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9tYWtldGVzdC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTU4MGRlOC4uMDAwMDAwMAotLS0gYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L21ha2V0ZXN0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGNzaGFycCAtbyAuIC4uLy4uL1RocmlmdFRlc3QudGhyaWZ0Ci1nbWNzIC90OmxpYnJhcnkgL291dDouL1RocmlmdEltcGwuZGxsIC9yZWN1cnNlOi4vZ2VuLWNzaGFycC8qIC9yZWZlcmVuY2U6Li4vLi4vLi4vbGliL2NzaGFycC9UaHJpZnQuZGxsCmRpZmYgLS1naXQgYS90ZXN0L2RhcnQvTWFrZWZpbGUuYW0gYi90ZXN0L2RhcnQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc1MGVjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGFydC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZ2VuLWRhcnQvdGhyaWZ0X3Rlc3QvbGliL3RocmlmdF90ZXN0LmRhcnQ6IC4uL1RocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGRhcnQgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKworcHViLWdldC1nZW46IGdlbi1kYXJ0L3RocmlmdF90ZXN0L2xpYi90aHJpZnRfdGVzdC5kYXJ0CisJY2QgZ2VuLWRhcnQvdGhyaWZ0X3Rlc3Q7ICR7REFSVFBVQn0gZ2V0CisKK3B1Yi1nZXQ6IHB1Yi1nZXQtZ2VuCisJY2QgdGVzdF9jbGllbnQ7ICR7REFSVFBVQn0gZ2V0CisKK3N0dWJzOiBnZW4tZGFydC90aHJpZnRfdGVzdC9saWIvdGhyaWZ0X3Rlc3QuZGFydCBwdWItZ2V0CisKK3ByZWNyb3NzOiBzdHVicworCitjaGVjazogc3R1YnMKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLWRhcnQgdGVzdF9jbGllbnQvLnB1YgorCWZpbmQgLiAtdHlwZSBkIC1uYW1lICJwYWNrYWdlcyIgfCB4YXJncyAkKFJNKSAtcgorCWZpbmQgLiAtdHlwZSBmIC1uYW1lICIucGFja2FnZXMiIHwgeGFyZ3MgJChSTSkKKwlmaW5kIC4gLXR5cGUgZiAtbmFtZSAicHVic3BlYy5sb2NrIiB8IHhhcmdzICQoUk0pCisKK2NsaWVudDogc3R1YnMKKwkke0RBUlR9IHRlc3RfY2xpZW50L2Jpbi9tYWluLmRhcnQKZGlmZiAtLWdpdCBhL3Rlc3QvZGFydC90ZXN0X2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucyBiL3Rlc3QvZGFydC90ZXN0X2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50Ly5hbmFseXNpc19vcHRpb25zCkBAIC0wLDAgKzEsMiBAQAorYW5hbHl6ZXI6CisgIHN0cm9uZy1tb2RlOiB0cnVlCmRpZmYgLS1naXQgYS90ZXN0L2RhcnQvdGVzdF9jbGllbnQvYmluL21haW4uZGFydCBiL3Rlc3QvZGFydC90ZXN0X2NsaWVudC9iaW4vbWFpbi5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5Njg0NGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhcnQvdGVzdF9jbGllbnQvYmluL21haW4uZGFydApAQCAtMCwwICsxLDMzNyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCc7CitpbXBvcnQgJ2RhcnQ6aW8nOworCitpbXBvcnQgJ3BhY2thZ2U6YXJncy9hcmdzLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmNvbGxlY3Rpb24vY29sbGVjdGlvbi5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpodHRwL2h0dHAuZGFydCcgYXMgaHR0cDsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnRfY29uc29sZS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnRfdGVzdC90aHJpZnRfdGVzdC5kYXJ0JzsKKworY29uc3QgVEVTVF9CQVNFVFlQRVMgPSAxOyAvLyAwMDAwIDAwMDEKK2NvbnN0IFRFU1RfU1RSVUNUUyA9IDI7IC8vIDAwMDAgMDAxMAorY29uc3QgVEVTVF9DT05UQUlORVJTID0gNDsgLy8gMDAwMCAwMTAwCitjb25zdCBURVNUX0VYQ0VQVElPTlMgPSA4OyAvLyAwMDAwIDEwMDAKK2NvbnN0IFRFU1RfVU5LTk9XTiA9IDY0OyAvLyAwMTAwIDAwMDAgKEZhaWxlZCB0byBwcmVwYXJlIGVudmlyb25lbXQgZXRjLikKK2NvbnN0IFRFU1RfVElNRU9VVCA9IDEyODsgLy8gMTAwMCAwMDAwCitjb25zdCBURVNUX05PVFVTRUQgPSA0ODsgLy8gMDAxMSAwMDAwIChyZXNlcnZlZCBiaXRzKQorCit0eXBlZGVmIEZ1dHVyZSBGdXR1cmVGdW5jdGlvbigpOworCitjbGFzcyBUVGVzdCB7CisgIGZpbmFsIGludCBlcnJvckNvZGU7CisgIGZpbmFsIFN0cmluZyBuYW1lOworICBmaW5hbCBGdXR1cmVGdW5jdGlvbiBmdW5jOworCisgIFRUZXN0KHRoaXMuZXJyb3JDb2RlLCB0aGlzLm5hbWUsIHRoaXMuZnVuYyk7Cit9CisKK2NsYXNzIFRUZXN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7CisgIGZpbmFsIGFjdHVhbDsKKyAgZmluYWwgZXhwZWN0ZWQ7CisKKyAgVFRlc3RFcnJvcih0aGlzLmFjdHVhbCwgdGhpcy5leHBlY3RlZCk7CisKKyAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyRhY3R1YWwgIT0gJGV4cGVjdGVkJzsKK30KKworTGlzdDxUVGVzdD4gX3Rlc3RzOworVGhyaWZ0VGVzdENsaWVudCBjbGllbnQ7Citib29sIHZlcmJvc2U7CisKKy8vLyBBZGFwdGVkIGZyb20gVGVzdENsaWVudC5waHAKK21haW4oTGlzdDxTdHJpbmc+IGFyZ3MpIGFzeW5jIHsKKyAgQXJnUmVzdWx0cyByZXN1bHRzID0gX3BhcnNlQXJncyhhcmdzKTsKKworICBpZiAocmVzdWx0cyA9PSBudWxsKSB7CisgICAgZXhpdChURVNUX1VOS05PV04pOworICB9CisKKyAgdmVyYm9zZSA9IHJlc3VsdHNbJ3ZlcmJvc2UnXSA9PSB0cnVlOworCisgIGF3YWl0IF9pbml0VGVzdENsaWVudCgKKyAgICAgIGhvc3Q6IHJlc3VsdHNbJ2hvc3QnXSwKKyAgICAgIHBvcnQ6IGludC5wYXJzZShyZXN1bHRzWydwb3J0J10pLAorICAgICAgdHJhbnNwb3J0VHlwZTogcmVzdWx0c1sndHJhbnNwb3J0J10sCisgICAgICBwcm90b2NvbFR5cGU6IHJlc3VsdHNbJ3Byb3RvY29sJ10pLmNhdGNoRXJyb3IoKGUpIHsKKyAgICBzdGRvdXQud3JpdGVsbignRXJyb3I6Jyk7CisgICAgc3Rkb3V0LndyaXRlbG4oJyRlJyk7CisgICAgaWYgKGUgaXMgRXJyb3IpIHsKKyAgICAgIHN0ZG91dC53cml0ZWxuKCcke2Uuc3RhY2tUcmFjZX0nKTsKKyAgICB9CisgICAgZXhpdChURVNUX1VOS05PV04pOworICB9KTsKKworICAvLyBydW4gdGVzdHMKKyAgX3Rlc3RzID0gX2NyZWF0ZVRlc3RzKCk7CisKKyAgaW50IHJlc3VsdCA9IDA7CisKKyAgZm9yIChUVGVzdCB0ZXN0IGluIF90ZXN0cykgeworICAgIGlmICh2ZXJib3NlKSBzdGRvdXQud3JpdGUoJyR7dGVzdC5uYW1lfS4uLiAnKTsKKyAgICB0cnkgeworICAgICAgYXdhaXQgdGVzdC5mdW5jKCk7CisgICAgICBpZiAodmVyYm9zZSkgc3Rkb3V0LndyaXRlbG4oJ3N1Y2Nlc3MhJyk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgaWYgKHZlcmJvc2UpIHN0ZG91dC53cml0ZWxuKCckZScpOworICAgICAgcmVzdWx0ID0gcmVzdWx0IHwgdGVzdC5lcnJvckNvZGU7CisgICAgfQorICB9CisKKyAgZXhpdChyZXN1bHQpOworfQorCitBcmdSZXN1bHRzIF9wYXJzZUFyZ3MoTGlzdDxTdHJpbmc+IGFyZ3MpIHsKKyAgdmFyIHBhcnNlciA9IG5ldyBBcmdQYXJzZXIoKTsKKyAgcGFyc2VyLmFkZE9wdGlvbignaG9zdCcsIGRlZmF1bHRzVG86ICdsb2NhbGhvc3QnLCBoZWxwOiAnVGhlIHNlcnZlciBob3N0Jyk7CisgIHBhcnNlci5hZGRPcHRpb24oJ3BvcnQnLCBkZWZhdWx0c1RvOiAnOTA5MCcsIGhlbHA6ICdUaGUgcG9ydCB0byBjb25uZWN0IHRvJyk7CisgIHBhcnNlci5hZGRPcHRpb24oJ3RyYW5zcG9ydCcsCisgICAgICBkZWZhdWx0c1RvOiAnYnVmZmVyZWQnLAorICAgICAgYWxsb3dlZDogWydidWZmZXJlZCcsICdmcmFtZWQnLCAnaHR0cCddLAorICAgICAgaGVscDogJ1RoZSB0cmFuc3BvcnQgbmFtZScsCisgICAgICBhbGxvd2VkSGVscDogeworICAgICAgICAnYnVmZmVyZWQnOiAnVEJ1ZmZlcmVkVHJhbnNwb3J0JywKKyAgICAgICAgJ2ZyYW1lZCc6ICdURnJhbWVkVHJhbnNwb3J0JworICAgICAgfSk7CisgIHBhcnNlci5hZGRPcHRpb24oJ3Byb3RvY29sJywKKyAgICAgIGRlZmF1bHRzVG86ICdiaW5hcnknLAorICAgICAgYWxsb3dlZDogWydiaW5hcnknLCAnY29tcGFjdCcsICdqc29uJ10sCisgICAgICBoZWxwOiAnVGhlIHByb3RvY29sIG5hbWUnLAorICAgICAgYWxsb3dlZEhlbHA6IHsKKyAgICAgICAgJ2JpbmFyeSc6ICdUQmluYXJ5UHJvdG9jb2wnLAorICAgICAgICAnY29tcGFjdCc6ICdUQ29tcGFjdFByb3RvY29sJywKKyAgICAgICAgJ2pzb24nOiAnVEpzb25Qcm90b2NvbCcKKyAgICAgIH0pOworICBwYXJzZXIuYWRkRmxhZygndmVyYm9zZScsIGRlZmF1bHRzVG86IGZhbHNlKTsKKworICBBcmdSZXN1bHRzIHJlc3VsdHM7CisgIHRyeSB7CisgICAgcmVzdWx0cyA9IHBhcnNlci5wYXJzZShhcmdzKTsKKyAgfSBjYXRjaCAoZSkgeworICAgIHN0ZG91dC53cml0ZWxuKCckZVxuJyk7CisgIH0KKworICBpZiAocmVzdWx0cyA9PSBudWxsKSBzdGRvdXQud3JpdGUocGFyc2VyLnVzYWdlKTsKKworICByZXR1cm4gcmVzdWx0czsKK30KKworVFByb3RvY29sRmFjdG9yeSBnZXRQcm90b2NvbEZhY3RvcnkoU3RyaW5nIHByb3RvY29sVHlwZSkgeworICBpZiAocHJvdG9jb2xUeXBlID09ICdiaW5hcnknKSB7CisgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCk7CisgIH0gZWxzZSBpZiAocHJvdG9jb2xUeXBlID09ICdjb21wYWN0JykgeworICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKTsKKyAgfSBlbHNlIGlmIChwcm90b2NvbFR5cGUgPT0gJ2pzb24nKSB7CisgICAgcmV0dXJuIG5ldyBUSnNvblByb3RvY29sRmFjdG9yeSgpOworICB9CisKKyAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUocHJvdG9jb2xUeXBlKTsKK30KKworRnV0dXJlIF9pbml0VGVzdENsaWVudCgKKyAgICB7U3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgdHJhbnNwb3J0VHlwZSwgU3RyaW5nIHByb3RvY29sVHlwZX0pIGFzeW5jIHsKKyAgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgIHZhciBwcm90b2NvbEZhY3RvcnkgPSBnZXRQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xUeXBlKTsKKworICBpZiAodHJhbnNwb3J0VHlwZSA9PSAnaHR0cCcpIHsKKyAgICB2YXIgaHR0cENsaWVudCA9IG5ldyBodHRwLklPQ2xpZW50KCk7CisgICAgdmFyIHVyaSA9IFVyaS5wYXJzZSgnaHR0cDovLyRob3N0OiRwb3J0Jyk7CisgICAgdmFyIGNvbmZpZyA9IG5ldyBUSHR0cENvbmZpZyh1cmksIHt9KTsKKyAgICB0cmFuc3BvcnQgPSBuZXcgVEh0dHBDbGllbnRUcmFuc3BvcnQoaHR0cENsaWVudCwgY29uZmlnKTsKKyAgfSBlbHNlIHsKKyAgICB2YXIgc29ja2V0ID0gYXdhaXQgU29ja2V0LmNvbm5lY3QoaG9zdCwgcG9ydCk7CisgICAgdHJhbnNwb3J0ID0gbmV3IFRDbGllbnRTb2NrZXRUcmFuc3BvcnQobmV3IFRUY3BTb2NrZXQoc29ja2V0KSk7CisgICAgaWYgKHRyYW5zcG9ydFR5cGUgPT0gJ2ZyYW1lZCcpIHsKKyAgICAgIHRyYW5zcG9ydCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zcG9ydCk7CisgICAgfQorICB9CisKKyAgdmFyIHByb3RvY29sID0gcHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKHRyYW5zcG9ydCk7CisgIGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKworICBhd2FpdCB0cmFuc3BvcnQub3BlbigpOworfQorCitMaXN0PFRUZXN0PiBfY3JlYXRlVGVzdHMoKSB7CisgIExpc3Q8VFRlc3Q+IHRlc3RzID0gW107CisKKyAgdmFyIHh0cnVjdCA9IG5ldyBYdHJ1Y3QoKQorICAgIC4uc3RyaW5nX3RoaW5nID0gJ1plcm8nCisgICAgLi5ieXRlX3RoaW5nID0gMQorICAgIC4uaTMyX3RoaW5nID0gLTMKKyAgICAuLmk2NF90aGluZyA9IC01OworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0Vm9pZCcsICgpIGFzeW5jIHsKKyAgICBhd2FpdCBjbGllbnQudGVzdFZvaWQoKTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0U3RyaW5nJywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9ICdUZXN0JzsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RTdHJpbmcoaW5wdXQpOworICAgIGlmIChyZXN1bHQgIT0gaW5wdXQpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0JBU0VUWVBFUywgJ3Rlc3RCb29sJywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IHRydWU7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0Qm9vbChpbnB1dCk7CisgICAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdEJ5dGUnLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gNjQ7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0Qnl0ZShpbnB1dCk7CisgICAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdEkzMicsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSAyMTQ3NDgzNjQ3OworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdEkzMihpbnB1dCk7CisgICAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdEk2NCcsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3OworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdEk2NChpbnB1dCk7CisgICAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdERvdWJsZScsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSAzLjE0MTU5MjY7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0RG91YmxlKGlucHV0KTsKKyAgICBpZiAocmVzdWx0ICE9IGlucHV0KSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0QmluYXJ5JywgKCkgYXN5bmMgeworICAgIHZhciB1dGY4Q29kZWMgPSBjb25zdCBVdGY4Q29kZWMoKTsKKyAgICB2YXIgaW5wdXQgPSB1dGY4Q29kZWMuZW5jb2RlKCdmb28nKTsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RCaW5hcnkoaW5wdXQpOworICAgIHZhciBlcXVhbGl0eSA9IGNvbnN0IExpc3RFcXVhbGl0eSgpOworICAgIGlmICghZXF1YWxpdHkuZXF1YWxzKHJlc3VsdCwgaW5wdXQpKSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdFN0cnVjdCcsICgpIGFzeW5jIHsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RTdHJ1Y3QoeHRydWN0KTsKKyAgICBpZiAoJyRyZXN1bHQnICE9ICckeHRydWN0JykgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCB4dHJ1Y3QpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0TmVzdCcsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSBuZXcgWHRydWN0MigpCisgICAgICAuLmJ5dGVfdGhpbmcgPSAxCisgICAgICAuLnN0cnVjdF90aGluZyA9IHh0cnVjdAorICAgICAgLi5pMzJfdGhpbmcgPSAtMzsKKworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdE5lc3QoaW5wdXQpOworICAgIGlmICgnJHJlc3VsdCcgIT0gJyRpbnB1dCcpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0TWFwJywgKCkgYXN5bmMgeworICAgIE1hcDxpbnQsIGludD4gaW5wdXQgPSB7MTogLTEwLCAyOiAtOSwgMzogLTgsIDQ6IC03LCA1OiAtNn07CisKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RNYXAoaW5wdXQpOworICAgIHZhciBlcXVhbGl0eSA9IGNvbnN0IE1hcEVxdWFsaXR5KCk7CisgICAgaWYgKCFlcXVhbGl0eS5lcXVhbHMocmVzdWx0LCBpbnB1dCkpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0U2V0JywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IG5ldyBTZXQ8aW50Pi5mcm9tKFstMiwgLTEsIDAsIDEsIDJdKTsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RTZXQoaW5wdXQpOworICAgIHZhciBlcXVhbGl0eSA9IGNvbnN0IFNldEVxdWFsaXR5KCk7CisgICAgaWYgKCFlcXVhbGl0eS5lcXVhbHMocmVzdWx0LCBpbnB1dCkpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0TGlzdCcsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSBbLTIsIC0xLCAwLCAxLCAyXTsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RMaXN0KGlucHV0KTsKKyAgICB2YXIgZXF1YWxpdHkgPSBjb25zdCBMaXN0RXF1YWxpdHkoKTsKKyAgICBpZiAoIWVxdWFsaXR5LmVxdWFscyhyZXN1bHQsIGlucHV0KSkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQ09OVEFJTkVSUywgJ3Rlc3RFbnVtJywgKCkgYXN5bmMgeworICAgIGF3YWl0IF90ZXN0RW51bShOdW1iZXJ6Lk9ORSk7CisgICAgYXdhaXQgX3Rlc3RFbnVtKE51bWJlcnouVFdPKTsKKyAgICBhd2FpdCBfdGVzdEVudW0oTnVtYmVyei5USFJFRSk7CisgICAgYXdhaXQgX3Rlc3RFbnVtKE51bWJlcnouRklWRSk7CisgICAgYXdhaXQgX3Rlc3RFbnVtKE51bWJlcnouRUlHSFQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0JBU0VUWVBFUywgJ3Rlc3RUeXBlZGVmJywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IDMwOTg1ODIzNTA4MjUyMzsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RUeXBlZGVmKGlucHV0KTsKKyAgICBpZiAocmVzdWx0ICE9IGlucHV0KSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdE1hcE1hcCcsICgpIGFzeW5jIHsKKyAgICBNYXA8aW50LCBNYXA8aW50LCBpbnQ+PiByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdE1hcE1hcCgxKTsKKyAgICBpZiAocmVzdWx0LmlzRW1wdHkgfHwgcmVzdWx0W3Jlc3VsdC5rZXlzLmZpcnN0XS5pc0VtcHR5KSB7CisgICAgICB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsICdNYXA8aW50LCBNYXA8aW50LCBpbnQ+PicpOworICAgIH0KKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdEluc2FuaXR5JywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IG5ldyBJbnNhbml0eSgpOworICAgIGlucHV0LnVzZXJNYXAgPSB7TnVtYmVyei5GSVZFOiA1MDAwfTsKKyAgICBpbnB1dC54dHJ1Y3RzID0gW3h0cnVjdF07CisKKyAgICBNYXA8aW50LCBNYXA8aW50LCBJbnNhbml0eT4+IHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0SW5zYW5pdHkoaW5wdXQpOworICAgIGlmIChyZXN1bHQuaXNFbXB0eSB8fCByZXN1bHRbcmVzdWx0LmtleXMuZmlyc3RdLmlzRW1wdHkpIHsKKyAgICAgIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgJ01hcDxpbnQsIE1hcDxpbnQsIEluc2FuaXR5Pj4nKTsKKyAgICB9CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQ09OVEFJTkVSUywgJ3Rlc3RNdWx0aScsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSBuZXcgWHRydWN0KCkKKyAgICAgIC4uc3RyaW5nX3RoaW5nID0gJ0hlbGxvMicKKyAgICAgIC4uYnl0ZV90aGluZyA9IDEyMworICAgICAgLi5pMzJfdGhpbmcgPSA0NTYKKyAgICAgIC4uaTY0X3RoaW5nID0gNzg5OworCisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0TXVsdGkoaW5wdXQuYnl0ZV90aGluZywgaW5wdXQuaTMyX3RoaW5nLAorICAgICAgICBpbnB1dC5pNjRfdGhpbmcsIHsxOiAnb25lJ30sIE51bWJlcnouRUlHSFQsIDU2NzgpOworICAgIGlmICgnJHJlc3VsdCcgIT0gJyRpbnB1dCcpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0VYQ0VQVElPTlMsICd0ZXN0RXhjZXB0aW9uJywgKCkgYXN5bmMgeworICAgIHRyeSB7CisgICAgICBhd2FpdCBjbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKTsKKyAgICB9IG9uIFhjZXB0aW9uIGNhdGNoIChfKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhyb3cgbmV3IFRUZXN0RXJyb3IobnVsbCwgJ1hjZXB0aW9uJyk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfRVhDRVBUSU9OUywgJ3Rlc3RNdWx0aUV4Y2VwdGlvbicsICgpIGFzeW5jIHsKKyAgICB0cnkgeworICAgICAgYXdhaXQgY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbignWGNlcHRpb24yJywgJ2ZvbycpOworICAgIH0gb24gWGNlcHRpb24yIGNhdGNoIChfKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhyb3cgbmV3IFRUZXN0RXJyb3IobnVsbCwgJ1hjZXB0aW9uMicpOworICB9KSk7CisKKyAgcmV0dXJuIHRlc3RzOworfQorCitGdXR1cmUgX3Rlc3RFbnVtKGludCBpbnB1dCkgYXN5bmMgeworICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RFbnVtKGlucHV0KTsKKyAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2RhcnQvdGVzdF9jbGllbnQvcHVic3BlYy55YW1sIGIvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L3B1YnNwZWMueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTY0MmY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L3B1YnNwZWMueWFtbApAQCAtMCwwICsxLDM2IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWU6IHRocmlmdF90ZXN0X2NsaWVudAordmVyc2lvbjogMS4wLjAKK2Rlc2NyaXB0aW9uOiBBIGNsaWVudCBpbnRlZ3JhdGlvbiB0ZXN0IGZvciB0aGUgRGFydCBUaHJpZnQgbGlicmFyeQorYXV0aG9yOiBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK2hvbWVwYWdlOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKKworZW52aXJvbm1lbnQ6CisgIHNkazogIj49MS4xMy4wIDwyLjAuMCIKKworZGVwZW5kZW5jaWVzOgorICBhcmdzOiBeMC4xMy4wCisgIGh0dHA6IF4wLjExLjAKKyAgdGhyaWZ0OgorICAgIHBhdGg6IC4uLy4uLy4uL2xpYi9kYXJ0CisgIHRocmlmdF90ZXN0OgorICAgIHBhdGg6IC4uL2dlbi1kYXJ0L3RocmlmdF90ZXN0CisKK2Rldl9kZXBlbmRlbmNpZXM6CisgIHRlc3Q6ICJeMC4xMi4wIgpkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvTWFrZWZpbGUuYW0gYi90ZXN0L2VybC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjI1ZTg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9lcmwvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVF9GSUxFUyA9ICQod2lsZGNhcmQgLi4vKi50aHJpZnQpCisKK2lmIEVSTEFOR19PVFAxNgorRVJMX0ZMQUcgPSBlcmw6b3RwMTYKK2Vsc2UKK0VSTF9GTEFHID0gZXJsCitlbmRpZgorIyBtYWtlIHN1cmUgVGhyaWZ0VGVzdC50aHJpZnQgaXMgZ2VuZXJhdGVkIGxhc3QgdG8gcHJldmVudCBjb25mbGljdHMgd2l0aCBvdGhlciAqLnRocmlmdCBmaWxlcworLmdlbmVyYXRlZDogJChUSFJJRlRfRklMRVMpCisJZm9yIGYgaW4gJChUSFJJRlRfRklMRVMpIDsgZG8gXAorCSAgJChUSFJJRlQpIC0tZ2VuICQoRVJMX0ZMQUcpIC1vIHNyYyAkJGYgOyBcCisJZG9uZSA7IFwKKwkkKFRIUklGVCkgLS1nZW4gJChFUkxfRkxBRykgLW8gc3JjIC4uL1RocmlmdFRlc3QudGhyaWZ0CisJdG91Y2ggLmdlbmVyYXRlZAorCitwcmVjcm9zczogLmdlbmVyYXRlZAorCSQoUkVCQVIpIGNvbXBpbGUKKworY2xlYW46CisJcm0gLWYgLmdlbmVyYXRlZAorCXJtIC1yZiBzcmMvZ2VuLWVybAorCSQoUkVCQVIpIGNsZWFuCmRpZmYgLS1naXQgYS90ZXN0L2VybC9yZWJhci5jb25maWcgYi90ZXN0L2VybC9yZWJhci5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlhMDc4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZXJsL3JlYmFyLmNvbmZpZwpAQCAtMCwwICsxLDYgQEAKK3tzdWJfZGlycywgWyIuLi8uLi9saWIvZXJsIl19LgorCit7ZXJsX29wdHMsIFsKKyAgZGVidWdfaW5mbywKKyAge2ksICIuLi8uLi9saWIvZXJsL2luY2x1ZGUifQorXX0uCmRpZmYgLS1naXQgYS90ZXN0L2VybC9zcmMvdGVzdF9jbGllbnQuZXJsIGIvdGVzdC9lcmwvc3JjL3Rlc3RfY2xpZW50LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmFkNTkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9lcmwvc3JjL3Rlc3RfY2xpZW50LmVybApAQCAtMCwwICsxLDE3NCBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF9jbGllbnQpLgorCistZXhwb3J0KFtzdGFydC8wLCBzdGFydC8xXSkuCisKKy1pbmNsdWRlKCJnZW4tZXJsL3RocmlmdF90ZXN0X3R5cGVzLmhybCIpLgorCistcmVjb3JkKG9wdGlvbnMsIHtwb3J0ID0gOTA5MCwKKyAgICAgICAgICAgICAgICAgIGNsaWVudF9vcHRzID0gW119KS4KKworcGFyc2VfYXJncyhBcmdzKSAtPiBwYXJzZV9hcmdzKEFyZ3MsICNvcHRpb25ze30pLgorcGFyc2VfYXJncyhbXSwgT3B0cykgLT4KKyAgT3B0czsKK3BhcnNlX2FyZ3MoW0hlYWQgfCBSZXN0XSwgT3B0cykgLT4KKyAgICBOZXdPcHRzID0KKyAgICAgICAgY2FzZSBIZWFkIG9mCisgICAgICAgICAgICAiLS1wb3J0PSIgKysgUG9ydCAtPgorICAgICAgICAgICAgICAgIGNhc2Ugc3RyaW5nOnRvX2ludGVnZXIoUG9ydCkgb2YKKyAgICAgICAgICAgICAgICAgIHtJbnRQb3J0LF99IHdoZW4gaXNfaW50ZWdlcihJbnRQb3J0KSAtPgorICAgICAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7cG9ydCA9IEludFBvcnR9OworICAgICAgICAgICAgICAgICAgX0Vsc2UgLT4KKyAgICAgICAgICAgICAgICAgICAgZXJsYW5nOmVycm9yKHtiYWRfYXJnLCBIZWFkfSkKKyAgICAgICAgICAgICAgICBlbmQ7CisgICAgICAgICAgICAiLS10cmFuc3BvcnQ9IiArKyBUcmFucyAtPgorICAgICAgICAgICAgICAgICUgVE9ETzogRW5hYmxlIEJ1ZmZlcmVkIGFuZCBIVFRQIHRyYW5zcG9ydAorICAgICAgICAgICAgICAgIGNhc2UgVHJhbnMgb2YKKyAgICAgICAgICAgICAgICAgICAgImZyYW1lZCIgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tjbGllbnRfb3B0cyA9IFt7ZnJhbWVkLCB0cnVlfSB8IE9wdHMjb3B0aW9ucy5jbGllbnRfb3B0c119OworICAgICAgICAgICAgICAgICAgICBfRWxzZSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgT3B0cworICAgICAgICAgICAgICAgIGVuZDsKKyAgICAgICAgICAgICItLXNzbCIgLT4KKyAgICAgICAgICAgICAgICBzc2w6c3RhcnQoKSwKKyAgICAgICAgICAgICAgICBTc2xPcHRpb25zID0KKyAgICAgICAgICAgICAgICAgICAge3NzbG9wdGlvbnMsIFsKKyAgICAgICAgICAgICAgICAgICAgICAgIHtjYWNlcnRmaWxlLCAiLi4va2V5cy9DQS5wZW0ifSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHtjZXJ0ZmlsZSwgIi4uL2tleXMvY2xpZW50LnBlbSJ9LAorICAgICAgICAgICAgICAgICAgICAgICAge2tleWZpbGUsICIuLi9rZXlzL2NsaWVudC5rZXkifQorICAgICAgICAgICAgICAgICAgICBdfSwKKyAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7Y2xpZW50X29wdHMgPSBbe3NzbHRyYW5zcG9ydCwgdHJ1ZX0gfCBbU3NsT3B0aW9ucyB8IE9wdHMjb3B0aW9ucy5jbGllbnRfb3B0c11dfTsKKyAgICAgICAgICAgICItLXByb3RvY29sPSIgKysgUHJvdG8gLT4KKyAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7Y2xpZW50X29wdHMgPSBbe3Byb3RvY29sLCBsaXN0X3RvX2F0b20oUHJvdG8pfV19OworICAgICAgICAgICAgX0Vsc2UgLT4KKyAgICAgICAgICAgICAgICBlcmxhbmc6ZXJyb3Ioe2JhZF9hcmcsIEhlYWR9KQorICAgICAgICBlbmQsCisgICAgcGFyc2VfYXJncyhSZXN0LCBOZXdPcHRzKS4KKworc3RhcnQoKSAtPiBzdGFydChpbml0OmdldF9wbGFpbl9hcmd1bWVudHMoKSkuCitzdGFydChBcmdzKSAtPgorICAjb3B0aW9uc3twb3J0ID0gUG9ydCwgY2xpZW50X29wdHMgPSBDbGllbnRPcHRzfSA9IHBhcnNlX2FyZ3MoQXJncyksCisgIHtvaywgQ2xpZW50MH0gPSB0aHJpZnRfY2xpZW50X3V0aWw6bmV3KAorICAgICIxMjcuMC4wLjEiLCBQb3J0LCB0aHJpZnRfdGVzdF90aHJpZnQsIENsaWVudE9wdHMpLAorCisgIERlbW9YdHJ1Y3QgPSAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7CisgICAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmcgPSA8PCJaZXJvIj4+LAorICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyA9IDEsCisgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgPSA5MTI4MzYxLAorICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gOTIyMzM3MjAzNjg1NDc3NTgwN30sCisKKyAgRGVtb05lc3QgPSAjJ3RocmlmdC50ZXN0Llh0cnVjdDIneworICAgIGJ5dGVfdGhpbmcgPSA3LAorICAgIHN0cnVjdF90aGluZyA9IERlbW9YdHJ1Y3QsCisgICAgJSBOb3RlIHRoYXQgd2UgZG9uJ3Qgc2V0IGkzMl90aGluZywgaXQgd2lsbCBjb21lIGJhY2sgYXMgdW5kZWZpbmVkCisgICAgJSBmcm9tIHRoZSBQeXRob24gc2VydmVyLCBidXQgMCBmcm9tIHRoZSBDKysgc2VydmVyLCBzaW5jZSBpdCBpcyBub3QKKyAgICAlIG9wdGlvbmFsCisgICAgaTMyX3RoaW5nID0gMn0sCisKKyAgJSBJcyBpdCBzYWZlIHRvIG1hdGNoIHRoZXNlIHRoaW5ncz8KKyAgRGVtb0RpY3QgPSBkaWN0OmZyb21fbGlzdChbIHtLZXksIEtleS0xMH0gfHwgS2V5IDwtIGxpc3RzOnNlcSgwLDEwKSBdKSwKKyAgRGVtb1NldCA9IHNldHM6ZnJvbV9saXN0KFsgS2V5IHx8IEtleSA8LSBsaXN0czpzZXEoLTMsMykgXSksCisKKyAgRGVtb0luc2FuZSA9ICMndGhyaWZ0LnRlc3QuSW5zYW5pdHkneworICAgIHVzZXJNYXAgPSBkaWN0OmZyb21fbGlzdChbez9USFJJRlRfVEVTVF9OVU1CRVJaX0ZJVkUsIDUwMDB9XSksCisgICAgeHRydWN0cyA9IFsjJ3RocmlmdC50ZXN0Llh0cnVjdCd7IHN0cmluZ190aGluZyA9IDw8IlRydWNrIj4+LCBieXRlX3RoaW5nID0gOCwgaTMyX3RoaW5nID0gOCwgaTY0X3RoaW5nID0gOH1dfSwKKworICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RWb2lkIiksCisgIHtDbGllbnQwMSwge29rLCBva319ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAsIHRlc3RWb2lkLCBbXSksCisKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0U3RyaW5nIiksCisgIHtDbGllbnQwMiwge29rLCA8PCJUZXN0Ij4+fX0gICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwMSwgdGVzdFN0cmluZywgWyJUZXN0Il0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RTdHJpbmciKSwKKyAge0NsaWVudDAzLCB7b2ssIDw8IlRlc3QiPj59fSAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAyLCB0ZXN0U3RyaW5nLCBbPDwiVGVzdCI+Pl0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RCeXRlIiksCisgIHtDbGllbnQwNCwge29rLCA2M319ICAgICAgICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwMywgdGVzdEJ5dGUsIFs2M10pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RJMzIiKSwKKyAge0NsaWVudDA1LCB7b2ssIC0xfX0gICAgICAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA0LCB0ZXN0STMyLCBbLTFdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0STMyIiksCisgIHtDbGllbnQwNiwge29rLCAwfX0gICAgICAgICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwNSwgdGVzdEkzMiwgWzBdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0STY0IiksCisgIHtDbGllbnQwNywge29rLCAtMzQzNTk3MzgzNjh9fSAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwNiwgdGVzdEk2NCwgWy0zNDM1OTczODM2OF0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3REb3VibGUiKSwKKyAge0NsaWVudDA4LCB7b2ssIC01LjIwOTg1MjN9fSAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA3LCB0ZXN0RG91YmxlLCBbLTUuMjA5ODUyM10pLAorICAlJSBUT0RPOiBhZGQgdGVzdEJpbmFyeSgpIGNhbGwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0U3RydWN0IiksCisgIHtDbGllbnQwOSwge29rLCBEZW1vWHRydWN0fX0gICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwOCwgdGVzdFN0cnVjdCwgW0RlbW9YdHJ1Y3RdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0TmVzdCIpLAorICB7Q2xpZW50MTAsIHtvaywgRGVtb05lc3R9fSAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDksIHRlc3ROZXN0LCBbRGVtb05lc3RdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0TWFwIiksCisgIHtDbGllbnQxMSwge29rLCBEZW1vRGljdH19ICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxMCwgdGVzdE1hcCwgW0RlbW9EaWN0XSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdFNldCIpLAorICB7Q2xpZW50MTIsIHtvaywgRGVtb1NldH19ICAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTEsIHRlc3RTZXQsIFtEZW1vU2V0XSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdExpc3QiKSwKKyAge0NsaWVudDEzLCB7b2ssIFstMSwyLDNdfX0gICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDEyLCB0ZXN0TGlzdCwgW1stMSwyLDNdXSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdEVudW0iKSwKKyAge0NsaWVudDE0LCB7b2ssIDF9fSAgICAgICAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDEzLCB0ZXN0RW51bSwgWz9USFJJRlRfVEVTVF9OVU1CRVJaX09ORV0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RUeXBlZGVmIiksCisgIHtDbGllbnQxNSwge29rLCAzMDk4NTgyMzUwODI1MjN9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxNCwgdGVzdFR5cGVkZWYsIFszMDk4NTgyMzUwODI1MjNdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0SW5zYW5pdHkiKSwKKyAge0NsaWVudDE2LCB7b2ssIEluc2FuZVJlc3VsdH19ICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDE1LCB0ZXN0SW5zYW5pdHksIFtEZW1vSW5zYW5lXSksCisgIGlvOmZvcm1hdCgifnB+biIsIFtJbnNhbmVSZXN1bHRdKSwKKworICB7Q2xpZW50MTcsIHtvaywgIyd0aHJpZnQudGVzdC5YdHJ1Y3Qne3N0cmluZ190aGluZyA9IDw8Ik1lc3NhZ2UiPj59fX0gPQorICAgIHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxNiwgdGVzdE11bHRpRXhjZXB0aW9uLCBbIlNhZmUiLCAiTWVzc2FnZSJdKSwKKworICBDbGllbnQxOCA9CisgICAgdHJ5CisgICAgICB7Q2xpZW50UzEsIFJlc3VsdDF9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDE3LCB0ZXN0TXVsdGlFeGNlcHRpb24sIFsiWGNlcHRpb24iLCAiTWVzc2FnZSJdKSwKKyAgICAgIGlvOmZvcm1hdCgiVW5leHBlY3RlZCByZXR1cm4hIH5wfm4iLCBbUmVzdWx0MV0pLAorICAgICAgQ2xpZW50UzEKKyAgICBjYXRjaAorICAgICAgdGhyb3c6e0NsaWVudFMyLCB7ZXhjZXB0aW9uLCBFeG5TMSA9ICMndGhyaWZ0LnRlc3QuWGNlcHRpb24ne319fSAtPgorICAgICAgICAjJ3RocmlmdC50ZXN0LlhjZXB0aW9uJ3tlcnJvckNvZGUgPSAxMDAxLCBtZXNzYWdlID0gPDwiVGhpcyBpcyBhbiBYY2VwdGlvbiI+Pn0gPSBFeG5TMSwKKyAgICAgICAgQ2xpZW50UzI7CisgICAgICB0aHJvdzp7Q2xpZW50UzIsIHtleGNlcHRpb24sIF9FeG5TMSA9ICMndGhyaWZ0LnRlc3QuWGNlcHRpb24yJ3t9fX0gLT4KKyAgICAgICAgaW86Zm9ybWF0KCJXcm9uZyBleGNlcHRpb24gdHlwZSF+biIsIFtdKSwKKyAgICAgICAgQ2xpZW50UzIKKyAgICBlbmQsCisKKyAgQ2xpZW50MTkgPQorICAgIHRyeQorICAgICAge0NsaWVudFMzLCBSZXN1bHQyfSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxOCwgdGVzdE11bHRpRXhjZXB0aW9uLCBbIlhjZXB0aW9uMiIsICJNZXNzYWdlIl0pLAorICAgICAgaW86Zm9ybWF0KCJVbmV4cGVjdGVkIHJldHVybiEgfnB+biIsIFtSZXN1bHQyXSksCisgICAgICBDbGllbnRTMworICAgIGNhdGNoCisgICAgICB0aHJvdzp7Q2xpZW50UzQsIHtleGNlcHRpb24sIF9FeG5TMiA9ICMndGhyaWZ0LnRlc3QuWGNlcHRpb24ne319fSAtPgorICAgICAgICBpbzpmb3JtYXQoIldyb25nIGV4Y2VwdGlvbiB0eXBlIX5uIiwgW10pLAorICAgICAgICBDbGllbnRTNDsKKyAgICAgIHRocm93OntDbGllbnRTNCwge2V4Y2VwdGlvbiwgRXhuUzIgPSAjJ3RocmlmdC50ZXN0LlhjZXB0aW9uMid7fX19IC0+CisgICAgICAgICMndGhyaWZ0LnRlc3QuWGNlcHRpb24yJ3tlcnJvckNvZGUgPSAyMDAyLAorICAgICAgICAgICAgICAgICAgIHN0cnVjdF90aGluZyA9ICMndGhyaWZ0LnRlc3QuWHRydWN0J3sKKyAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190aGluZyA9IDw8IlRoaXMgaXMgYW4gWGNlcHRpb24yIj4+fX0gPSBFeG5TMiwKKyAgICAgICAgQ2xpZW50UzQKKyAgICBlbmQsCisKKyAgJSUgU3RhcnRlZCA9IGVybGFuZzptb25vdG9uaWNfdGltZShtaWxsaV9zZWNvbmRzKSwKKyAge18sIFN0YXJ0U2VjLCBTdGFydFVTZWN9ID0gZXJsYW5nOnRpbWVzdGFtcCgpLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RPbmV3YXkiKSwKKyAge0NsaWVudDIwLCB7b2ssIG9rfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTksIHRlc3RPbmV3YXksIFsxXSksCisgIHtfLCBFbmRTZWMsIEVuZFVTZWN9ID0gZXJsYW5nOnRpbWVzdGFtcCgpLAorICBFbGFwc2VkID0gKEVuZFNlYyAtIFN0YXJ0U2VjKSAqIDEwMDAgKyAoRW5kVVNlYyAtIFN0YXJ0VVNlYykgLyAxMDAwLAorICBpZgorICAgIEVsYXBzZWQgPiAxMDAwIC0+IGV4aXQoMSk7CisgICAgdHJ1ZSAtPiB0cnVlCisgIGVuZCwKKworICB0aHJpZnRfY2xpZW50OmNsb3NlKENsaWVudDIwKS4KZGlmZiAtLWdpdCBhL3Rlc3QvZXJsL3NyYy90ZXN0X3RocmlmdF9zZXJ2ZXIuZXJsIGIvdGVzdC9lcmwvc3JjL3Rlc3RfdGhyaWZ0X3NlcnZlci5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFkOGRlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZXJsL3NyYy90ZXN0X3RocmlmdF9zZXJ2ZXIuZXJsCkBAIC0wLDAgKzEsMjMzIEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3RocmlmdF9zZXJ2ZXIpLgorCistZXhwb3J0KFtzdGFydC8wLCBzdGFydC8xLCBzdGFydF9saW5rLzIsIGhhbmRsZV9mdW5jdGlvbi8yXSkuCisKKy1pbmNsdWRlKCJ0aHJpZnRfY29uc3RhbnRzLmhybCIpLgorLWluY2x1ZGUoImdlbi1lcmwvdGhyaWZ0X3Rlc3RfdHlwZXMuaHJsIikuCisKKy1yZWNvcmQob3B0aW9ucywge3BvcnQgPSA5MDkwLAorICAgICAgICAgICAgICAgICAgc2VydmVyX29wdHMgPSBbXX0pLgorCitwYXJzZV9hcmdzKEFyZ3MpIC0+IHBhcnNlX2FyZ3MoQXJncywgI29wdGlvbnN7fSkuCitwYXJzZV9hcmdzKFtdLCBPcHRzKSAtPgorICBPcHRzOworcGFyc2VfYXJncyhbSGVhZCB8IFJlc3RdLCBPcHRzKSAtPgorICAgIE5ld09wdHMgPQorICAgICAgICBjYXNlIEhlYWQgb2YKKyAgICAgICAgICAgICItLXBvcnQ9IiArKyBQb3J0IC0+CisgICAgICAgICAgICAgICAgY2FzZSBzdHJpbmc6dG9faW50ZWdlcihQb3J0KSBvZgorICAgICAgICAgICAgICAgICAge0ludFBvcnQsX30gd2hlbiBpc19pbnRlZ2VyKEludFBvcnQpIC0+CisgICAgICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3twb3J0ID0gSW50UG9ydH07CisgICAgICAgICAgICAgICAgICBfRWxzZSAtPgorICAgICAgICAgICAgICAgICAgICBlcmxhbmc6ZXJyb3Ioe2JhZF9hcmcsIEhlYWR9KQorICAgICAgICAgICAgICAgIGVuZDsKKyAgICAgICAgICAgICItLXRyYW5zcG9ydD0iICsrIFRyYW5zIC0+CisgICAgICAgICAgICAgICAgY2FzZSBUcmFucyBvZgorICAgICAgICAgICAgICAgICAgICAiZnJhbWVkIiAtPgorICAgICAgICAgICAgICAgICAgICAgICAgT3B0cyNvcHRpb25ze3NlcnZlcl9vcHRzID0gW3tmcmFtZWQsIHRydWV9IHwgT3B0cyNvcHRpb25zLnNlcnZlcl9vcHRzXX07CisgICAgICAgICAgICAgICAgICAgIF9FbHNlIC0+CisgICAgICAgICAgICAgICAgICAgICAgICBPcHRzCisgICAgICAgICAgICAgICAgZW5kOworICAgICAgICAgICAgIi0tc3NsIiAtPgorICAgICAgICAgICAgICAgIHNzbDpzdGFydCgpLAorICAgICAgICAgICAgICAgIFNzbE9wdGlvbnMgPQorICAgICAgICAgICAgICAgICAgICB7c3Nsb3B0aW9ucywgWworICAgICAgICAgICAgICAgICAgICAgICAgIHtjZXJ0ZmlsZSwgIi4uL2tleXMvc2VydmVyLnBlbSJ9CisgICAgICAgICAgICAgICAgICAgICAgICAse2tleWZpbGUsICAiLi4va2V5cy9zZXJ2ZXIua2V5In0KKyAgICAgICAgICAgICAgICAgICAgXX0sCisgICAgICAgICAgICAgICAgT3B0cyNvcHRpb25ze3NlcnZlcl9vcHRzID0gW3tzc2x0cmFuc3BvcnQsIHRydWV9IHwgW1NzbE9wdGlvbnMgfCBPcHRzI29wdGlvbnMuc2VydmVyX29wdHNdXX07CisgICAgICAgICAgICAiLS1wcm90b2NvbD0iICsrIFByb3RvIC0+CisgICAgICAgICAgICAgICAgT3B0cyNvcHRpb25ze3NlcnZlcl9vcHRzID0gW3twcm90b2NvbCwgbGlzdF90b19hdG9tKFByb3RvKX0gfCBPcHRzI29wdGlvbnMuc2VydmVyX29wdHNdfTsKKyAgICAgICAgICAgIF9FbHNlIC0+CisgICAgICAgICAgICAgICAgZXJsYW5nOmVycm9yKHtiYWRfYXJnLCBIZWFkfSkKKyAgICAgICAgZW5kLAorICAgIHBhcnNlX2FyZ3MoUmVzdCwgTmV3T3B0cykuCisKK3N0YXJ0KCkgLT4gc3RhcnQoaW5pdDpnZXRfcGxhaW5fYXJndW1lbnRzKCkpLgorc3RhcnQoQXJncykgLT4KKyAgICAjb3B0aW9uc3twb3J0ID0gUG9ydCwgc2VydmVyX29wdHMgPSBTZXJ2ZXJPcHRzfSA9IHBhcnNlX2FyZ3MoQXJncyksCisgICAgc3Bhd24oZnVuKCkgLT4gc3RhcnRfbGluayhQb3J0LCBTZXJ2ZXJPcHRzKSwgcmVjZWl2ZSBhZnRlciBpbmZpbml0eSAtPiBvayBlbmQgZW5kKS4KKworc3RhcnRfbGluayhQb3J0LCBTZXJ2ZXJPcHRzKSAtPgorICAgIHRocmlmdF9zb2NrZXRfc2VydmVyOnN0YXJ0KFt7aGFuZGxlciwgP01PRFVMRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZXJ2aWNlLCB0aHJpZnRfdGVzdF90aHJpZnR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cG9ydCwgUG9ydH1dICsrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmVyT3B0cykuCisKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RWb2lkLCB7fSkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RWb2lkfm4iKSwKKyAgICBvazsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RTdHJpbmcsIHtTfSkgd2hlbiBpc19iaW5hcnkoUykgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RTdHJpbmc6IH5wfm4iLCBbU10pLAorICAgIHtyZXBseSwgU307CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0Qm9vbCwge0J9KSB3aGVuIGlzX2Jvb2xlYW4oQikgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RCb29sOiB+cH5uIiwgW0JdKSwKKyAgICB7cmVwbHksIEJ9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdEJ5dGUsIHtJOH0pIHdoZW4gaXNfaW50ZWdlcihJOCkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RCeXRlOiB+cH5uIiwgW0k4XSksCisgICAge3JlcGx5LCBJOH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0STMyLCB7STMyfSkgd2hlbiBpc19pbnRlZ2VyKEkzMikgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RJMzI6IH5wfm4iLCBbSTMyXSksCisgICAge3JlcGx5LCBJMzJ9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdEk2NCwge0k2NH0pIHdoZW4gaXNfaW50ZWdlcihJNjQpIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0STY0OiB+cH5uIiwgW0k2NF0pLAorICAgIHtyZXBseSwgSTY0fTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3REb3VibGUsIHtEb3VibGV9KSB3aGVuIGlzX2Zsb2F0KERvdWJsZSkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3REb3VibGU6IH5wfm4iLCBbRG91YmxlXSksCisgICAge3JlcGx5LCBEb3VibGV9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdEJpbmFyeSwge1N9KSB3aGVuIGlzX2JpbmFyeShTKSAtPgorICAgIGlvOmZvcm1hdCgidGVzdEJpbmFyeTogfnB+biIsIFtTXSksCisgICAge3JlcGx5LCBTfTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RTdHJ1Y3QsCisgICAgICAgICAgICAgICAge1N0cnVjdCA9ICMndGhyaWZ0LnRlc3QuWHRydWN0J3tzdHJpbmdfdGhpbmcgPSBTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nID0gQnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZyA9IEkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZyA9IEk2NH19KQord2hlbiBpc19iaW5hcnkoU3RyaW5nKSwKKyAgICAgaXNfaW50ZWdlcihCeXRlKSwKKyAgICAgaXNfaW50ZWdlcihJMzIpLAorICAgICBpc19pbnRlZ2VyKEk2NCkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RTdHJ1Y3Q6IH5wfm4iLCBbU3RydWN0XSksCisgICAge3JlcGx5LCBTdHJ1Y3R9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdE5lc3QsCisgICAgICAgICAgICAgICAge05lc3R9KSB3aGVuIGlzX3JlY29yZChOZXN0LCAndGhyaWZ0LnRlc3QuWHRydWN0MicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19yZWNvcmQoTmVzdCMndGhyaWZ0LnRlc3QuWHRydWN0Micuc3RydWN0X3RoaW5nLCAndGhyaWZ0LnRlc3QuWHRydWN0JykgLT4KKyAgICBpbzpmb3JtYXQoInRlc3ROZXN0OiB+cH5uIiwgW05lc3RdKSwKKyAgICB7cmVwbHksIE5lc3R9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdE1hcCwge01hcH0pIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0TWFwOiB+cH5uIiwgW2RpY3Q6dG9fbGlzdChNYXApXSksCisgICAge3JlcGx5LCBNYXB9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdFN0cmluZ01hcCwge01hcH0pIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0U3RyaW5nTWFwOiB+cH5uIiwgW2RpY3Q6dG9fbGlzdChNYXApXSksCisgICAge3JlcGx5LCBNYXB9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdFNldCwge1NldH0pIC0+CisgICAgdHJ1ZSA9IHNldHM6aXNfc2V0KFNldCksCisgICAgaW86Zm9ybWF0KCJ0ZXN0U2V0OiB+cH5uIiwgW3NldHM6dG9fbGlzdChTZXQpXSksCisgICAge3JlcGx5LCBTZXR9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdExpc3QsIHtMaXN0fSkgd2hlbiBpc19saXN0KExpc3QpIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0TGlzdDogfnB+biIsIFtMaXN0XSksCisgICAge3JlcGx5LCBMaXN0fTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RFbnVtLCB7RW51bX0pIHdoZW4gaXNfaW50ZWdlcihFbnVtKSAtPgorICAgIGlvOmZvcm1hdCgidGVzdEVudW06IH5wfm4iLCBbRW51bV0pLAorICAgIHtyZXBseSwgRW51bX07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0VHlwZWRlZiwge1VzZXJJRH0pIHdoZW4gaXNfaW50ZWdlcihVc2VySUQpIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0VHlwZWRlZjogfnB+biIsIFtVc2VySURdKSwKKyAgICB7cmVwbHksIFVzZXJJRH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0TWFwTWFwLCB7SGVsbG99KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdE1hcE1hcDogfnB+biIsIFtIZWxsb10pLAorCisgICAgUG9zTGlzdCA9IFt7SSwgSX0gICB8fCBJIDwtIGxpc3RzOnNlcSgxLCA0KV0sCisgICAgTmVnTGlzdCA9IFt7LUksIC1JfSB8fCBJIDwtIGxpc3RzOnNlcSgxLCA0KV0sCisKKyAgICBNYXBNYXAgPSBkaWN0OmZyb21fbGlzdChbezQsICBkaWN0OmZyb21fbGlzdChQb3NMaXN0KX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstNCwgZGljdDpmcm9tX2xpc3QoTmVnTGlzdCl9XSksCisgICAge3JlcGx5LCBNYXBNYXB9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdEluc2FuaXR5LCB7SW5zYW5pdHl9KSB3aGVuIGlzX3JlY29yZChJbnNhbml0eSwgJ3RocmlmdC50ZXN0Lkluc2FuaXR5JykgLT4KKyAgICBIZWxsbyA9ICMndGhyaWZ0LnRlc3QuWHRydWN0J3tzdHJpbmdfdGhpbmcgPSA8PCJIZWxsbzIiPj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyA9IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nID0gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmcgPSAyfSwKKworICAgIEdvb2RieWUgPSAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7c3RyaW5nX3RoaW5nID0gPDwiR29vZGJ5ZTQiPj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcgPSA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nID0gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZyA9IDR9LAorICAgIENyYXp5ID0gIyd0aHJpZnQudGVzdC5JbnNhbml0eSd7CisgICAgICAgICAgICAgICB1c2VyTWFwID0gZGljdDpmcm9tX2xpc3QoW3s/VEhSSUZUX1RFU1RfTlVNQkVSWl9FSUdIVCwgOH1dKSwKKyAgICAgICAgICAgICAgIHh0cnVjdHMgPSBbR29vZGJ5ZV0KKyAgICAgICAgICAgICAgfSwKKworICAgIExvb25leSA9ICMndGhyaWZ0LnRlc3QuSW5zYW5pdHkne30sCisKKyAgICBGaXJzdE1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7P1RIUklGVF9URVNUX05VTUJFUlpfVFdPLCBJbnNhbml0eX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgez9USFJJRlRfVEVTVF9OVU1CRVJaX1RIUkVFLCBJbnNhbml0eX1dKSwKKworICAgIFNlY29uZE1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7P1RIUklGVF9URVNUX05VTUJFUlpfU0lYLCBMb29uZXl9XSksCisKKyAgICBJbnNhbmUgPSBkaWN0OmZyb21fbGlzdChbezEsIEZpcnN0TWFwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezIsIFNlY29uZE1hcH1dKSwKKworICAgIGlvOmZvcm1hdCgiUmV0dXJuID0gfnB+biIsIFtJbnNhbmVdKSwKKworICAgIHtyZXBseSwgSW5zYW5lfTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RNdWx0aSwgQXJncyA9IHtBcmcwLCBBcmcxLCBBcmcyLCBfQXJnMywgQXJnNCwgQXJnNX0pCisgIHdoZW4gaXNfaW50ZWdlcihBcmcwKSwKKyAgICAgICBpc19pbnRlZ2VyKEFyZzEpLAorICAgICAgIGlzX2ludGVnZXIoQXJnMiksCisgICAgICAgaXNfaW50ZWdlcihBcmc0KSwKKyAgICAgICBpc19pbnRlZ2VyKEFyZzUpIC0+CisKKyAgICBpbzpmb3JtYXQoInRlc3RNdWx0aSh+cCl+biIsIFtBcmdzXSksCisgICAge3JlcGx5LCAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7c3RyaW5nX3RoaW5nID0gPDwiSGVsbG8yIj4+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcgPSBBcmcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZyA9IEFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gQXJnMn19OworCitoYW5kbGVfZnVuY3Rpb24odGVzdEV4Y2VwdGlvbiwge1N0cmluZ30pIHdoZW4gaXNfYmluYXJ5KFN0cmluZykgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RFeGNlcHRpb24ofnApfm4iLCBbU3RyaW5nXSksCisgICAgY2FzZSBTdHJpbmcgb2YKKyAgICAgICAgPDwiWGNlcHRpb24iPj4gLT4KKyAgICAgICAgICAgIHRocm93KCMndGhyaWZ0LnRlc3QuWGNlcHRpb24ne2Vycm9yQ29kZSA9IDEwMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IFN0cmluZ30pOworICAgICAgICA8PCJURXhjZXB0aW9uIj4+IC0+CisgICAgICAgICAgICB0aHJvdyh7P1RBcHBsaWNhdGlvbkV4Y2VwdGlvbl9TdHJ1Y3R1cmV9KTsKKyAgICAgICAgXyAtPgorICAgICAgICAgICAgb2sKKyAgICBlbmQ7CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0TXVsdGlFeGNlcHRpb24sIHtBcmcwLCBBcmcxfSkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RNdWx0aUV4Y2VwdGlvbih+cCwgfnApfm4iLCBbQXJnMCwgQXJnMV0pLAorICAgIGNhc2UgQXJnMCBvZgorICAgICAgICA8PCJYY2VwdGlvbiI+PiAtPgorICAgICAgICAgICAgdGhyb3coIyd0aHJpZnQudGVzdC5YY2VwdGlvbid7ZXJyb3JDb2RlID0gMTAwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IDw8IlRoaXMgaXMgYW4gWGNlcHRpb24iPj59KTsKKyAgICAgICAgPDwiWGNlcHRpb24yIj4+IC0+CisgICAgICAgICAgICB0aHJvdygjJ3RocmlmdC50ZXN0LlhjZXB0aW9uMid7ZXJyb3JDb2RlID0gMjAwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF90aGluZyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7c3RyaW5nX3RoaW5nID0gPDwiVGhpcyBpcyBhbiBYY2VwdGlvbjIiPj59fSk7CisgICAgICAgIF8gLT4KKyAgICAgICAgICAgIHtyZXBseSwgIyd0aHJpZnQudGVzdC5YdHJ1Y3Qne3N0cmluZ190aGluZyA9IEFyZzF9fQorICAgIGVuZDsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RPbmV3YXksIHtTZWNvbmRzfSkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RPbmV3YXk6IH5wfm4iLCBbU2Vjb25kc10pLAorICAgIHRpbWVyOnNsZWVwKDEwMDAgKiBTZWNvbmRzKSwKKyAgICBvay4KZGlmZiAtLWdpdCBhL3Rlc3QvZXJsL3NyYy90aHJpZnRfdGVzdC5hcHAuc3JjIGIvdGVzdC9lcmwvc3JjL3RocmlmdF90ZXN0LmFwcC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlZjk5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZXJsL3NyYy90aHJpZnRfdGVzdC5hcHAuc3JjCkBAIC0wLDAgKzEsNTQgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorJSUlIC0qLSBtb2RlOmVybGFuZyAtKi0KK3thcHBsaWNhdGlvbiwgdGhyaWZ0X3Rlc3QsIFsKKyAgJSBBIHF1aWNrIGRlc2NyaXB0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbi4KKyAge2Rlc2NyaXB0aW9uLCAiVGhyaWZ0IGNyb3NzIGxhbmd1YWdlIHRlc3QifSwKKworICAlIFRoZSB2ZXJzaW9uIG9mIHRoZSBhcHBsaWNhdG9uCisgIHt2c24sICIxLjAuMCJ9LAorCisgICUgQWxsIG1vZHVsZXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uCisgIHttb2R1bGVzLCBbCisgICAgdGVzdF9jbGllbnQsCisgICAgdGVzdF90aHJpZnRfc2VydmVyCisgIF19LAorCisgICUgQWxsIG9mIHRoZSByZWdpc3RlcmVkIG5hbWVzIHRoZSBhcHBsaWNhdGlvbiB1c2VzLiBUaGlzIGNhbiBiZSBpZ25vcmVkLgorICB7cmVnaXN0ZXJlZCwgW119LAorCisgICUgQXBwbGljYXRpb25zIHRoYXQgYXJlIHRvIGJlIHN0YXJ0ZWQgcHJpb3IgdG8gdGhpcyBvbmUuIFRoaXMgY2FuIGJlIGlnbm9yZWQKKyAgJSBsZWF2ZSBpdCBhbG9uZSB1bmxlc3MgeW91IHVuZGVyc3RhbmQgaXQgd2VsbCBhbmQgbGV0IHRoZSAucmVsIGZpbGVzIGluCisgICUgeW91ciByZWxlYXNlIGhhbmRsZSB0aGlzLgorICB7YXBwbGljYXRpb25zLCBba2VybmVsLCBzdGRsaWJdfSwKKworICAlIE9UUCBhcHBsaWNhdGlvbiBsb2FkZXIgd2lsbCBsb2FkLCBidXQgbm90IHN0YXJ0LCBpbmNsdWRlZCBhcHBzLiBBZ2FpbgorICAlIHRoaXMgY2FuIGJlIGlnbm9yZWQgYXMgd2VsbC4gIFRvIGxvYWQgYnV0IG5vdCBzdGFydCBhbiBhcHBsaWNhdGlvbiBpdAorICAlIGlzIGVhc2llciB0byBpbmNsdWRlIGl0IGluIHRoZSAucmVsIGZpbGUgZm9sbG93ZWQgYnkgdGhlIGF0b20gJ25vbmUnCisgIHtpbmNsdWRlZF9hcHBsaWNhdGlvbnMsIFtdfSwKKworICAlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBzaW1pbGFyIHRvIHRob3NlIGluIHRoZSBjb25maWcgZmlsZSBzcGVjaWZpZWQKKyAgJSBvbiB0aGUgY29tbWFuZCBsaW5lLiBjYW4gYmUgZmV0Y2hlZCB3aXRoIGdhczpnZXRfZW52CisgIHtlbnYsIFsKKyAgICAlIElmIGFuIGVycm9yL2NyYXNoIG9jY3VycyBkdXJpbmcgcHJvY2Vzc2luZyBvZiBhIGZ1bmN0aW9uLAorICAgICUgc2hvdWxkIHRoZSBUQXBwbGljYXRpb25FeGNlcHRpb24gc2VyaWFsaXplZCBiYWNrIHRvIHRoZSBjbGllbnQKKyAgICAlIGluY2x1ZGUgdGhlIGVybGFuZyBiYWNrdHJhY2U/CisgICAge2V4Y2VwdGlvbnNfaW5jbHVkZV90cmFjZXMsIHRydWV9CisgIF19CitdfS4KZGlmZiAtLWdpdCBhL3Rlc3QvZmVhdHVyZXMvTWFrZWZpbGUuYW0gYi90ZXN0L2ZlYXR1cmVzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzN2Q3ODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzAgQEAKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworRVhUUkFfRElTVCA9IFwKKwlsb2NhbF90aHJpZnQgXAorCWluZGV4Lmh0bWwgXAorCWNvbnRhaW5lcl9saW1pdC5weSBcCisJaW5kZXguaHRtbCBcCisJa25vd25fZmFpbHVyZXNfTGludXguanNvbiBcCisJTWFrZWZpbGUuYW0gXAorICAgICAgICBub3NzbHYzLnNoIFwKKwlzdHJpbmdfbGltaXQucHkgXAorCXRlc3RzLmpzb24gXAorCXRoZWFkZXJfYmluYXJ5LnB5IFwKKwlzZXR1cC5jZmcgXAorICAgICAgICB0bHMuc2ggXAorCXV0aWwucHkKZGlmZiAtLWdpdCBhL3Rlc3QvZmVhdHVyZXMvY29udGFpbmVyX2xpbWl0LnB5IGIvdGVzdC9mZWF0dXJlcy9jb250YWluZXJfbGltaXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhmODQ4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMvY29udGFpbmVyX2xpbWl0LnB5CkBAIC0wLDAgKzEsNzIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBzeXMKKworZnJvbSB1dGlsIGltcG9ydCBhZGRfY29tbW9uX2FyZ3MsIGluaXRfcHJvdG9jb2wKK2Zyb20gbG9jYWxfdGhyaWZ0IGltcG9ydCB0aHJpZnQgICMgbm9xYQorZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUTWVzc2FnZVR5cGUsIFRUeXBlCisKKworIyBUT0RPOiBnZW5lcmF0ZSBmcm9tIFRocmlmdFRlc3QudGhyaWZ0CitkZWYgdGVzdF9saXN0KHByb3RvLCB2YWx1ZSk6CisgICAgbWV0aG9kX25hbWUgPSAndGVzdExpc3QnCisgICAgdHR5cGUgPSBUVHlwZS5MSVNUCisgICAgZXR5cGUgPSBUVHlwZS5JMzIKKyAgICBwcm90by53cml0ZU1lc3NhZ2VCZWdpbihtZXRob2RfbmFtZSwgVE1lc3NhZ2VUeXBlLkNBTEwsIDMpCisgICAgcHJvdG8ud3JpdGVTdHJ1Y3RCZWdpbihtZXRob2RfbmFtZSArICdfYXJncycpCisgICAgcHJvdG8ud3JpdGVGaWVsZEJlZ2luKCd0aGluZycsIHR0eXBlLCAxKQorICAgIHByb3RvLndyaXRlTGlzdEJlZ2luKGV0eXBlLCBsZW4odmFsdWUpKQorICAgIGZvciBlIGluIHZhbHVlOgorICAgICAgICBwcm90by53cml0ZUkzMihlKQorICAgIHByb3RvLndyaXRlTGlzdEVuZCgpCisgICAgcHJvdG8ud3JpdGVGaWVsZEVuZCgpCisgICAgcHJvdG8ud3JpdGVGaWVsZFN0b3AoKQorICAgIHByb3RvLndyaXRlU3RydWN0RW5kKCkKKyAgICBwcm90by53cml0ZU1lc3NhZ2VFbmQoKQorICAgIHByb3RvLnRyYW5zLmZsdXNoKCkKKworICAgIF8sIG10eXBlLCBfID0gcHJvdG8ucmVhZE1lc3NhZ2VCZWdpbigpCisgICAgYXNzZXJ0IG10eXBlID09IFRNZXNzYWdlVHlwZS5SRVBMWQorICAgIHByb3RvLnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgXywgZnR5cGUsIGZpZCA9IHByb3RvLnJlYWRGaWVsZEJlZ2luKCkKKyAgICBhc3NlcnQgZmlkID09IDAKKyAgICBhc3NlcnQgZnR5cGUgPT0gdHR5cGUKKyAgICBldHlwZTIsIGxlbjIgPSBwcm90by5yZWFkTGlzdEJlZ2luKCkKKyAgICBhc3NlcnQgZXR5cGUgPT0gZXR5cGUyCisgICAgYXNzZXJ0IGxlbjIgPT0gbGVuKHZhbHVlKQorICAgIGZvciBpIGluIHJhbmdlKGxlbjIpOgorICAgICAgICB2ID0gcHJvdG8ucmVhZEkzMigpCisgICAgICAgIGFzc2VydCB2ID09IHZhbHVlW2ldCisgICAgcHJvdG8ucmVhZExpc3RFbmQoKQorICAgIHByb3RvLnJlYWRGaWVsZEVuZCgpCisgICAgXywgZnR5cGUsIF8gPSBwcm90by5yZWFkRmllbGRCZWdpbigpCisgICAgYXNzZXJ0IGZ0eXBlID09IFRUeXBlLlNUT1AKKyAgICBwcm90by5yZWFkU3RydWN0RW5kKCkKKyAgICBwcm90by5yZWFkTWVzc2FnZUVuZCgpCisKKworZGVmIG1haW4oYXJndik6CisgICAgcCA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICBhZGRfY29tbW9uX2FyZ3MocCkKKyAgICBwLmFkZF9hcmd1bWVudCgnLS1saW1pdCcsIHR5cGU9aW50KQorICAgIGFyZ3MgPSBwLnBhcnNlX2FyZ3MoKQorICAgIHByb3RvID0gaW5pdF9wcm90b2NvbChhcmdzKQorICAgICMgVE9ETzogdGVzdCBzZXQgYW5kIG1hcAorICAgIHRlc3RfbGlzdChwcm90bywgbGlzdChyYW5nZShhcmdzLmxpbWl0IC0gMSkpKQorICAgIHRlc3RfbGlzdChwcm90bywgbGlzdChyYW5nZShhcmdzLmxpbWl0IC0gMSkpKQorICAgIHByaW50KCdbT0tdOiBsaW1pdCAtIDEnKQorICAgIHRlc3RfbGlzdChwcm90bywgbGlzdChyYW5nZShhcmdzLmxpbWl0KSkpCisgICAgdGVzdF9saXN0KHByb3RvLCBsaXN0KHJhbmdlKGFyZ3MubGltaXQpKSkKKyAgICBwcmludCgnW09LXToganVzdCBsaW1pdCcpCisgICAgdHJ5OgorICAgICAgICB0ZXN0X2xpc3QocHJvdG8sIGxpc3QocmFuZ2UoYXJncy5saW1pdCArIDEpKSkKKyAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICBwcmludCgnW09LXTogbGltaXQgKyAxJykKKyAgICBlbHNlOgorICAgICAgICBwcmludCgnW0VSUk9SXTogbGltaXQgKyAxJykKKyAgICAgICAgYXNzZXJ0IEZhbHNlCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBzeXMuZXhpdChtYWluKHN5cy5hcmd2WzE6XSkpCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL2luZGV4Lmh0bWwgYi90ZXN0L2ZlYXR1cmVzL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhMDAxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMvaW5kZXguaHRtbApAQCAtMCwwICsxLDUxIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzwhRE9DVFlQRSBIVE1MPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KKzx0aXRsZT5BcGFjaGUgVGhyaWZ0IC0gaW50ZWdyYXRpb24gdGVzdCBzdWl0ZTwvdGl0bGU+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJodHRwOi8vY2RuLmRhdGF0YWJsZXMubmV0LzEuMTAuNC9jc3MvanF1ZXJ5LmRhdGFUYWJsZXMuY3NzIj4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0yLjEuMy5taW4uanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9Imh0dHA6Ly9jZG4uZGF0YXRhYmxlcy5uZXQvMS4xMC40L2pzL2pxdWVyeS5kYXRhVGFibGVzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIuLi9yZXN1bHQuanMiPgorPC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMj5BcGFjaGUgVGhyaWZ0IC0gaW50ZWdyYXRpb24gdGVzdCBzdWl0ZTogUmVzdWx0czwvaDI+Cis8dGFibGUgaWQ9InRlc3RfcmVzdWx0cyIgY2xhc3M9ImRpc3BsYXkiPgorICAgIDx0aGVhZD4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlNlcnZlcjwvdGg+CisgICAgICAgICAgICA8dGg+Q2xpZW50PC90aD4KKyAgICAgICAgICAgIDx0aD5Qcm90b2NvbDwvdGg+CisgICAgICAgICAgICA8dGg+VHJhbnNwb3J0PC90aD4KKyAgICAgICAgICAgIDx0aD5SZXN1bHQgKGxvZyk8L3RoPgorICAgICAgICAgICAgPHRoPkV4cGVjdGVkPC90aD4KKyAgICAgICAgPC90cj4KKyAgICA8L3RoZWFkPgorPC90YWJsZT4KKzxoMj5UZXN0IEluZm9ybWF0aW9uPC9oMj4KKzxwcmUgaWQ9InRlc3RfaW5mbyI+PC9wcmU+CisKKzxhIGhyZWY9ImxvZyI+YnJvd3NlIHJhdyBsb2cgZmlsZXM8L2E+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3QvZmVhdHVyZXMva25vd25fZmFpbHVyZXNfTGludXguanNvbiBiL3Rlc3QvZmVhdHVyZXMva25vd25fZmFpbHVyZXNfTGludXguanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzc2OTY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy9rbm93bl9mYWlsdXJlc19MaW51eC5qc29uCkBAIC0wLDAgKzEsNTAgQEAKK1sKKyAgICAiY19nbGliLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiY19nbGliLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiY2wtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJjbC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImNwcC10aGVhZGVyX2ZyYW1lZF9iaW5hcnlfbXVsdGloLWhlYWRlcl9idWZmZXJlZC1pcCIsCisgICAgImNwcC10aGVhZGVyX2ZyYW1lZF9jb21wYWN0X211bHRpaC1oZWFkZXJfYnVmZmVyZWQtaXAiLAorICAgICJjcHAtdGhlYWRlcl91bmZyYW1lZF9iaW5hcnlfbXVsdGloLWhlYWRlcl9idWZmZXJlZC1pcCIsCisgICAgImNwcC10aGVhZGVyX3VuZnJhbWVkX2NvbXBhY3RfbXVsdGloLWhlYWRlcl9idWZmZXJlZC1pcCIsCisgICAgImNzaGFycC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImNzaGFycC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJjc2hhcnAtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJjc2hhcnAtbGltaXRfc3RyaW5nX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiZC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImQtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiZC1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImQtbGltaXRfc3RyaW5nX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiZXJsLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiZXJsLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImVybC1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImVybC1saW1pdF9zdHJpbmdfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJnby1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImdvLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImdvLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiZ28tbGltaXRfc3RyaW5nX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiaHMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJocy1saW1pdF9jb250YWluZXJfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJocy1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImhzLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgIm5vZGVqcy1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgIm5vZGVqcy1saW1pdF9jb250YWluZXJfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJub2RlanMtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJub2RlanMtbGltaXRfc3RyaW5nX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAicGVybC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgInBlcmwtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJyYi1saW1pdF9jb250YWluZXJfbGVuZ3RoX2FjY2VsLWJpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgInJiLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAicmItbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAicmItbGltaXRfc3RyaW5nX2xlbmd0aF9hY2NlbC1iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJyYi1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgInJiLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAicnMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAicnMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9tdWx0aWMtY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAicnMtbGltaXRfc3RyaW5nX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAicnMtbGltaXRfc3RyaW5nX2xlbmd0aF9tdWx0aWMtY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgIm5ldGNvcmUtbGltaXRfc3RyaW5nX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAibmV0Y29yZS1saW1pdF9jb250YWluZXJfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiCitdCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL2xvY2FsX3RocmlmdC9fX2luaXRfXy5weSBiL3Rlc3QvZmVhdHVyZXMvbG9jYWxfdGhyaWZ0L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NWNlYmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL2xvY2FsX3RocmlmdC9fX2luaXRfXy5weQpAQCAtMCwwICsxLDMyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGdsb2IKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitfU0NSSVBUX0RJUiA9IG9zLnBhdGgucmVhbHBhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKK19ST09UX0RJUiA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9TQ1JJUFRfRElSKSkpCitfTElCRElSID0gb3MucGF0aC5qb2luKF9ST09UX0RJUiwgJ2xpYicsICdweScsICdidWlsZCcsICdsaWIuKicpCisKK2ZvciBsaWJwYXRoIGluIGdsb2IuZ2xvYihfTElCRElSKToKKyAgICBpZiBsaWJwYXRoLmVuZHN3aXRoKCctJWQuJWQnICUgKHN5cy52ZXJzaW9uX2luZm9bMF0sIHN5cy52ZXJzaW9uX2luZm9bMV0pKToKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGxpYnBhdGgpCisgICAgICAgIHRocmlmdCA9IF9faW1wb3J0X18oJ3RocmlmdCcpCisgICAgICAgIGJyZWFrCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL25vc3NsdjMuc2ggYi90ZXN0L2ZlYXR1cmVzL25vc3NsdjMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzhjY2EwNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMvbm9zc2x2My5zaApAQCAtMCwwICsxLDU5IEBACisjIS9iaW4vYmFzaAorCisjCisjIENoZWNrcyB0byBtYWtlIHN1cmUgU1NMdjMgaXMgbm90IGFsbG93ZWQgYnkgYSBzZXJ2ZXIuCisjCisKK1RIUklGVEhPU1Q9bG9jYWxob3N0CitUSFJJRlRQT1JUPTkwOTAKKword2hpbGUgW1sgJCMgLWdlIDEgXV07IGRvCisgIGFyZz0iJDEiCisgIGFyZ0lOPSgke2FyZy8vPS8gfSkKKworICBjYXNlICR7YXJnSU5bMF19IGluCisgICAgLWh8LS1ob3N0KQorICAgIFRIUklGVEhPU1Q9JHthcmdJTlsxXX0KKyAgICBzaGlmdCAjIHBhc3QgYXJndW1lbnQKKyAgICA7OworICAgIC1wfC0tcG9ydCkKKyAgICBUSFJJRlRQT1JUPSR7YXJnSU5bMV19CisgICAgc2hpZnQgIyBwYXN0IGFyZ3VtZW50CisgICAgOzsKKyAgICAqKQorICAgICAgICAgICMgdW5rbm93biBvcHRpb24gaWdub3JlZAorICAgIDs7CisgIGVzYWMKKworICBzaGlmdCAgICMgcGFzdCBhcmd1bWVudCBvciB2YWx1ZQorZG9uZQorCitmdW5jdGlvbiBub3NzbHYzCit7CisgIGxvY2FsIG5lZ28KKyAgbG9jYWwgbmVnb2RlbmllZAorICBsb2NhbCBvcGVuc3NsdgorCisgIG9wZW5zc2x2PSQob3BlbnNzbCB2ZXJzaW9uIHwgY3V0IC1kJyAnIC1mMikKKyAgaWYgW1sgJG9wZW5zc2x2ID4gIjEuMCIgXV07IHRoZW4KKyAgICBlY2hvICJbcGFzc10gT3BlblNTTCAxLjEgb3IgbGF0ZXIgLSBubyBuZWVkIHRvIGNoZWNrIHNzbDMiCisgICAgcmV0dXJuIDAKKyAgZmkKKworICAjIGVjaG8gIm9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgJFRIUklGVEhPU1Q6JFRIUklGVFBPUlQgLUNBZmlsZSAuLi9rZXlzL0NBLnBlbSAtc3NsMyAyPiYxIDwgL2Rldi9udWxsIgorICBuZWdvPSQob3BlbnNzbCBzX2NsaWVudCAtY29ubmVjdCAkVEhSSUZUSE9TVDokVEhSSUZUUE9SVCAtQ0FmaWxlIC4uL2tleXMvQ0EucGVtIC1zc2wzIDI+JjEgPCAvZGV2L251bGwpCisgIG5lZ29kZW5pZWQ9JD8KKworICBpZiBbWyAkbmVnb2RlbmllZCAtbmUgMCBdXTsgdGhlbgorICAgIGVjaG8gIltwYXNzXSBTU0x2MyBuZWdvdGlhdGlvbiBkaXNhYmxlZCIKKyAgICBlY2hvICRuZWdvCisgICAgcmV0dXJuIDAKKyAgZmkKKworICBlY2hvICJbZmFpbF0gU1NMdjMgbmVnb3RpYXRpb24gZW5hYmxlZCEgIHN0ZG91dDoiCisgIGVjaG8gJG5lZ28KKyAgcmV0dXJuIDEKK30KKworbm9zc2x2MworZXhpdCAkPwpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy9zZXR1cC5jZmcgYi90ZXN0L2ZlYXR1cmVzL3NldHVwLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGExZjk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy9zZXR1cC5jZmcKQEAgLTAsMCArMSwyIEBACitbZmxha2U4XQorbWF4LWxpbmUtbGVuZ3RoID0gMTAwCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL3N0cmluZ19saW1pdC5weSBiL3Rlc3QvZmVhdHVyZXMvc3RyaW5nX2xpbWl0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OTkxZDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL3N0cmluZ19saW1pdC5weQpAQCAtMCwwICsxLDYyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgc3lzCisKK2Zyb20gdXRpbCBpbXBvcnQgYWRkX2NvbW1vbl9hcmdzLCBpbml0X3Byb3RvY29sCitmcm9tIGxvY2FsX3RocmlmdCBpbXBvcnQgdGhyaWZ0ICAjIG5vcWEKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVE1lc3NhZ2VUeXBlLCBUVHlwZQorCisKKyMgVE9ETzogZ2VuZXJhdGUgZnJvbSBUaHJpZnRUZXN0LnRocmlmdAorZGVmIHRlc3Rfc3RyaW5nKHByb3RvLCB2YWx1ZSk6CisgICAgbWV0aG9kX25hbWUgPSAndGVzdFN0cmluZycKKyAgICB0dHlwZSA9IFRUeXBlLlNUUklORworICAgIHByb3RvLndyaXRlTWVzc2FnZUJlZ2luKG1ldGhvZF9uYW1lLCBUTWVzc2FnZVR5cGUuQ0FMTCwgMykKKyAgICBwcm90by53cml0ZVN0cnVjdEJlZ2luKG1ldGhvZF9uYW1lICsgJ19hcmdzJykKKyAgICBwcm90by53cml0ZUZpZWxkQmVnaW4oJ3RoaW5nJywgdHR5cGUsIDEpCisgICAgcHJvdG8ud3JpdGVTdHJpbmcodmFsdWUpCisgICAgcHJvdG8ud3JpdGVGaWVsZEVuZCgpCisgICAgcHJvdG8ud3JpdGVGaWVsZFN0b3AoKQorICAgIHByb3RvLndyaXRlU3RydWN0RW5kKCkKKyAgICBwcm90by53cml0ZU1lc3NhZ2VFbmQoKQorICAgIHByb3RvLnRyYW5zLmZsdXNoKCkKKworICAgIF8sIG10eXBlLCBfID0gcHJvdG8ucmVhZE1lc3NhZ2VCZWdpbigpCisgICAgYXNzZXJ0IG10eXBlID09IFRNZXNzYWdlVHlwZS5SRVBMWQorICAgIHByb3RvLnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgXywgZnR5cGUsIGZpZCA9IHByb3RvLnJlYWRGaWVsZEJlZ2luKCkKKyAgICBhc3NlcnQgZmlkID09IDAKKyAgICBhc3NlcnQgZnR5cGUgPT0gdHR5cGUKKyAgICByZXN1bHQgPSBwcm90by5yZWFkU3RyaW5nKCkKKyAgICBwcm90by5yZWFkRmllbGRFbmQoKQorICAgIF8sIGZ0eXBlLCBfID0gcHJvdG8ucmVhZEZpZWxkQmVnaW4oKQorICAgIGFzc2VydCBmdHlwZSA9PSBUVHlwZS5TVE9QCisgICAgcHJvdG8ucmVhZFN0cnVjdEVuZCgpCisgICAgcHJvdG8ucmVhZE1lc3NhZ2VFbmQoKQorICAgIGFzc2VydCB2YWx1ZSA9PSByZXN1bHQKKworCitkZWYgbWFpbihhcmd2KToKKyAgICBwID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgIGFkZF9jb21tb25fYXJncyhwKQorICAgIHAuYWRkX2FyZ3VtZW50KCctLWxpbWl0JywgdHlwZT1pbnQpCisgICAgYXJncyA9IHAucGFyc2VfYXJncygpCisgICAgcHJvdG8gPSBpbml0X3Byb3RvY29sKGFyZ3MpCisgICAgdGVzdF9zdHJpbmcocHJvdG8sICdhJyAqIChhcmdzLmxpbWl0IC0gMSkpCisgICAgdGVzdF9zdHJpbmcocHJvdG8sICdhJyAqIChhcmdzLmxpbWl0IC0gMSkpCisgICAgcHJpbnQoJ1tPS106IGxpbWl0IC0gMScpCisgICAgdGVzdF9zdHJpbmcocHJvdG8sICdhJyAqIGFyZ3MubGltaXQpCisgICAgdGVzdF9zdHJpbmcocHJvdG8sICdhJyAqIGFyZ3MubGltaXQpCisgICAgcHJpbnQoJ1tPS106IGp1c3QgbGltaXQnKQorICAgIHRyeToKKyAgICAgICAgdGVzdF9zdHJpbmcocHJvdG8sICdhJyAqIChhcmdzLmxpbWl0ICsgMSkpCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgcHJpbnQoJ1tPS106IGxpbWl0ICsgMScpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQoJ1tFUlJPUl06IGxpbWl0ICsgMScpCisgICAgICAgIGFzc2VydCBGYWxzZQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbihzeXMuYXJndlsxOl0pCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL3Rlc3RzLmpzb24gYi90ZXN0L2ZlYXR1cmVzL3Rlc3RzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFlMDdkNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMvdGVzdHMuanNvbgpAQCAtMCwwICsxLDExNCBAQAorWworICB7CisgICAgImRlc2NyaXB0aW9uIjogIlRIZWFkZXIgZGV0ZWN0cyB1bmZyYW1lZCBiaW5hcnkgd2lyZSBmb3JtYXQiLAorICAgICJuYW1lIjogInRoZWFkZXJfdW5mcmFtZWRfYmluYXJ5IiwKKyAgICAiY29tbWFuZCI6IFsKKyAgICAgICJweXRob24iLAorICAgICAgInRoZWFkZXJfYmluYXJ5LnB5IiwKKyAgICAgICItLW92ZXJyaWRlLXByb3RvY29sPWJpbmFyeSIsCisgICAgICAiLS1vdmVycmlkZS10cmFuc3BvcnQ9YnVmZmVyZWQiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWyJoZWFkZXIiXSwKKyAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAic29ja2V0cyI6IFsiaXAiXSwKKyAgICAid29ya2RpciI6ICJmZWF0dXJlcyIKKyAgfSwKKyAgeworICAgICJkZXNjcmlwdGlvbiI6ICJUSGVhZGVyIGRldGVjdHMgZnJhbWVkIGJpbmFyeSB3aXJlIGZvcm1hdCIsCisgICAgIm5hbWUiOiAidGhlYWRlcl9mcmFtZWRfYmluYXJ5IiwKKyAgICAiY29tbWFuZCI6IFsKKyAgICAgICJweXRob24iLAorICAgICAgInRoZWFkZXJfYmluYXJ5LnB5IiwKKyAgICAgICItLW92ZXJyaWRlLXByb3RvY29sPWJpbmFyeSIsCisgICAgICAiLS1vdmVycmlkZS10cmFuc3BvcnQ9ZnJhbWVkIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsiaGVhZGVyIl0sCisgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgInNvY2tldHMiOiBbImlwIl0sCisgICAgIndvcmtkaXIiOiAiZmVhdHVyZXMiCisgIH0sCisgIHsKKyAgICAiZGVzY3JpcHRpb24iOiAiVEhlYWRlciBkZXRlY3RzIHVuZnJhbWVkIGNvbXBhY3Qgd2lyZSBmb3JtYXQiLAorICAgICJuYW1lIjogInRoZWFkZXJfdW5mcmFtZWRfY29tcGFjdCIsCisgICAgImNvbW1hbmQiOiBbCisgICAgICAicHl0aG9uIiwKKyAgICAgICJ0aGVhZGVyX2JpbmFyeS5weSIsCisgICAgICAiLS1vdmVycmlkZS1wcm90b2NvbD1jb21wYWN0IiwKKyAgICAgICItLW92ZXJyaWRlLXRyYW5zcG9ydD1idWZmZXJlZCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbImhlYWRlciJdLAorICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICJzb2NrZXRzIjogWyJpcCJdLAorICAgICJ3b3JrZGlyIjogImZlYXR1cmVzIgorICB9LAorICB7CisgICAgImRlc2NyaXB0aW9uIjogIlRIZWFkZXIgZGV0ZWN0cyBmcmFtZWQgY29tcGFjdCB3aXJlIGZvcm1hdCIsCisgICAgIm5hbWUiOiAidGhlYWRlcl9mcmFtZWRfY29tcGFjdCIsCisgICAgImNvbW1hbmQiOiBbCisgICAgICAicHl0aG9uIiwKKyAgICAgICJ0aGVhZGVyX2JpbmFyeS5weSIsCisgICAgICAiLS1vdmVycmlkZS1wcm90b2NvbD1jb21wYWN0IiwKKyAgICAgICItLW92ZXJyaWRlLXRyYW5zcG9ydD1mcmFtZWQiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWyJoZWFkZXIiXSwKKyAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAic29ja2V0cyI6IFsiaXAiXSwKKyAgICAid29ya2RpciI6ICJmZWF0dXJlcyIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImxpbWl0X3N0cmluZ19sZW5ndGgiLAorICAgICJjb21tYW5kIjogWworICAgICAgInB5dGhvbiIsCisgICAgICAic3RyaW5nX2xpbWl0LnB5IiwKKyAgICAgICItLWxpbWl0PTUwIgorICAgIF0sCisgICAgInJlbW90ZV9hcmdzIjogWworICAgICAgIi0tc3RyaW5nLWxpbWl0PTUwIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJjb21wYWN0IgorICAgIF0sCisgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgInNvY2tldHMiOiBbImlwIl0sCisgICAgIndvcmtkaXIiOiAiZmVhdHVyZXMiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJsaW1pdF9jb250YWluZXJfbGVuZ3RoIiwKKyAgICAiY29tbWFuZCI6IFsKKyAgICAgICJweXRob24iLAorICAgICAgImNvbnRhaW5lcl9saW1pdC5weSIsCisgICAgICAiLS1saW1pdD01MCIKKyAgICBdLAorICAgICJyZW1vdGVfYXJncyI6IFsKKyAgICAgICItLWNvbnRhaW5lci1saW1pdD01MCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiY29tcGFjdCIKKyAgICBdLAorICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICJzb2NrZXRzIjogWyJpcCJdLAorICAgICJ3b3JrZGlyIjogImZlYXR1cmVzIgorICB9LAorICB7CisgICAgIm5hbWUiOiAibm9zc2x2MyIsCisgICAgImNvbW1lbnQiOiAiY2hlY2sgdG8gbWFrZSBzdXJlIFNTTHYzIGlzIG5vdCBzdXBwb3J0ZWQiLAorICAgICJjb21tYW5kIjogWworICAgICAgIm5vc3NsdjMuc2giCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWyJiaW5hcnkiXSwKKyAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAic29ja2V0cyI6IFsiaXAtc3NsIl0sCisgICAgIndvcmtkaXIiOiAiZmVhdHVyZXMiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJ0bHMiLAorICAgICJjb21tZW50IjogImNoZWNrIHRvIG1ha2Ugc3VyZSBUTFN2MS4wIG9yIGxhdGVyIGlzIHN1cHBvcnRlZCIsCisgICAgImNvbW1hbmQiOiBbCisgICAgICAidGxzLnNoIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsiYmluYXJ5Il0sCisgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgInNvY2tldHMiOiBbImlwLXNzbCJdLAorICAgICJ3b3JrZGlyIjogImZlYXR1cmVzIgorICB9CitdCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL3RoZWFkZXJfYmluYXJ5LnB5IGIvdGVzdC9mZWF0dXJlcy90aGVhZGVyX2JpbmFyeS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTEzOTlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy90aGVhZGVyX2JpbmFyeS5weQpAQCAtMCwwICsxLDcwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgc29ja2V0CitpbXBvcnQgc3lzCisKK2Zyb20gdXRpbCBpbXBvcnQgYWRkX2NvbW1vbl9hcmdzCitmcm9tIGxvY2FsX3RocmlmdCBpbXBvcnQgdGhyaWZ0ICAjIG5vcWEKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVE1lc3NhZ2VUeXBlLCBUVHlwZQorZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRTb2NrZXQgaW1wb3J0IFRTb2NrZXQKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCBUQnVmZmVyZWRUcmFuc3BvcnQsIFRGcmFtZWRUcmFuc3BvcnQKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCitmcm9tIHRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sCisKKworZGVmIHRlc3Rfdm9pZChwcm90byk6CisgICAgcHJvdG8ud3JpdGVNZXNzYWdlQmVnaW4oJ3Rlc3RWb2lkJywgVE1lc3NhZ2VUeXBlLkNBTEwsIDMpCisgICAgcHJvdG8ud3JpdGVTdHJ1Y3RCZWdpbigndGVzdFZvaWRfYXJncycpCisgICAgcHJvdG8ud3JpdGVGaWVsZFN0b3AoKQorICAgIHByb3RvLndyaXRlU3RydWN0RW5kKCkKKyAgICBwcm90by53cml0ZU1lc3NhZ2VFbmQoKQorICAgIHByb3RvLnRyYW5zLmZsdXNoKCkKKworICAgIF8sIG10eXBlLCBfID0gcHJvdG8ucmVhZE1lc3NhZ2VCZWdpbigpCisgICAgYXNzZXJ0IG10eXBlID09IFRNZXNzYWdlVHlwZS5SRVBMWQorICAgIHByb3RvLnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgXywgZnR5cGUsIF8gPSBwcm90by5yZWFkRmllbGRCZWdpbigpCisgICAgYXNzZXJ0IGZ0eXBlID09IFRUeXBlLlNUT1AKKyAgICBwcm90by5yZWFkU3RydWN0RW5kKCkKKyAgICBwcm90by5yZWFkTWVzc2FnZUVuZCgpCisKKworIyBUSGVhZGVyIHN0YWNrIHNob3VsZCBhY2NlcHQgYmluYXJ5IHByb3RvY29sIHdpdGggb3B0aW9uYWxseSBmcmFtZWQgdHJhbnNwb3J0CitkZWYgbWFpbihhcmd2KToKKyAgICBwID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgIGFkZF9jb21tb25fYXJncyhwKQorICAgICMgU2luY2UgVEhlYWRlclRyYW5zcG9ydCBhY3RzIGFzIGZyYW1lZCB0cmFuc3BvcnQgd2hlbiBkZXRlY3RlZCBmcmFtZSwgd2UKKyAgICAjIGNhbm5vdCB1c2UgLS10cmFuc3BvcnQ9ZnJhbWVkIGFzIGl0IHdvdWxkIHJlc3VsdCBpbiAyIGxheWVyZWQgZnJhbWVzLgorICAgIHAuYWRkX2FyZ3VtZW50KCctLW92ZXJyaWRlLXRyYW5zcG9ydCcpCisgICAgcC5hZGRfYXJndW1lbnQoJy0tb3ZlcnJpZGUtcHJvdG9jb2wnKQorICAgIGFyZ3MgPSBwLnBhcnNlX2FyZ3MoKQorICAgIGFzc2VydCBhcmdzLnByb3RvY29sID09ICdoZWFkZXInCisgICAgYXNzZXJ0IGFyZ3MudHJhbnNwb3J0ID09ICdidWZmZXJlZCcKKyAgICBhc3NlcnQgbm90IGFyZ3Muc3NsCisKKyAgICBzb2NrID0gVFNvY2tldChhcmdzLmhvc3QsIGFyZ3MucG9ydCwgc29ja2V0X2ZhbWlseT1zb2NrZXQuQUZfSU5FVCkKKyAgICBpZiBub3QgYXJncy5vdmVycmlkZV90cmFuc3BvcnQgb3IgYXJncy5vdmVycmlkZV90cmFuc3BvcnQgPT0gJ2J1ZmZlcmVkJzoKKyAgICAgICAgdHJhbnMgPSBUQnVmZmVyZWRUcmFuc3BvcnQoc29jaykKKyAgICBlbGlmIGFyZ3Mub3ZlcnJpZGVfdHJhbnNwb3J0ID09ICdmcmFtZWQnOgorICAgICAgICBwcmludCgnVEZSQU1FRCcpCisgICAgICAgIHRyYW5zID0gVEZyYW1lZFRyYW5zcG9ydChzb2NrKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ludmFsaWQgdHJhbnNwb3J0JykKKyAgICB0cmFucy5vcGVuKCkKKworICAgIGlmIG5vdCBhcmdzLm92ZXJyaWRlX3Byb3RvY29sIG9yIGFyZ3Mub3ZlcnJpZGVfcHJvdG9jb2wgPT0gJ2JpbmFyeSc6CisgICAgICAgIHByb3RvID0gVEJpbmFyeVByb3RvY29sKHRyYW5zKQorICAgIGVsaWYgYXJncy5vdmVycmlkZV9wcm90b2NvbCA9PSAnY29tcGFjdCc6CisgICAgICAgIHByb3RvID0gVENvbXBhY3RQcm90b2NvbCh0cmFucykKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdpbnZhbGlkIHRyYW5zcG9ydCcpCisKKyAgICB0ZXN0X3ZvaWQocHJvdG8pCisgICAgdGVzdF92b2lkKHByb3RvKQorCisgICAgdHJhbnMuY2xvc2UoKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc3lzLmV4aXQobWFpbihzeXMuYXJndlsxOl0pKQpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy90bHMuc2ggYi90ZXN0L2ZlYXR1cmVzL3Rscy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYWRhNmFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy90bHMuc2gKQEAgLTAsMCArMSw3MSBAQAorIyEvYmluL2Jhc2gKKworIworIyBDaGVja3MgdG8gbWFrZSBzdXJlIFRMU3YxLjAgb3IgbGF0ZXIgaXMgYWxsb3dlZCBieSBhIHNlcnZlci4KKyMKKworVEhSSUZUSE9TVD1sb2NhbGhvc3QKK1RIUklGVFBPUlQ9OTA5MAorCit3aGlsZSBbWyAkIyAtZ2UgMSBdXTsgZG8KKyAgYXJnPSIkMSIKKyAgYXJnSU49KCR7YXJnLy89LyB9KQorCisgIGNhc2UgJHthcmdJTlswXX0gaW4KKyAgICAtaHwtLWhvc3QpCisgICAgVEhSSUZUSE9TVD0ke2FyZ0lOWzFdfQorICAgIHNoaWZ0ICMgcGFzdCBhcmd1bWVudAorICAgIDs7CisgICAgLXB8LS1wb3J0KQorICAgIFRIUklGVFBPUlQ9JHthcmdJTlsxXX0KKyAgICBzaGlmdCAjIHBhc3QgYXJndW1lbnQKKyAgICA7OworICAgICopCisgICAgICAgICAgIyB1bmtub3duIG9wdGlvbiBpZ25vcmVkCisgICAgOzsKKyAgZXNhYworCisgIHNoaWZ0ICAgIyBwYXN0IGFyZ3VtZW50IG9yIHZhbHVlCitkb25lCisKK2RlY2xhcmUgLUEgRVhQRUNUX05FR09USUFURQorRVhQRUNUX05FR09USUFURVt0bHMxXT0xCitFWFBFQ1RfTkVHT1RJQVRFW3RsczFfMV09MQorRVhQRUNUX05FR09USUFURVt0bHMxXzJdPTEKKworZmFpbHVyZXM9MAorCitmdW5jdGlvbiB0bHMKK3sKKyAgZm9yIFBST1RPIGluICIkeyFFWFBFQ1RfTkVHT1RJQVRFW0BdfSI7IGRvCisKKyAgICBsb2NhbCBuZWdvCisgICAgbG9jYWwgbmVnb2RlbmllZAorICAgIGxvY2FsIHJlcworCisgICAgZWNobyAib3BlbnNzbCBzX2NsaWVudCAtY29ubmVjdCAkVEhSSUZUSE9TVDokVEhSSUZUUE9SVCAtQ0FmaWxlIC4uL2tleXMvQ0EucGVtIC0kUFJPVE8gMj4mMSA8IC9kZXYvbnVsbCIKKyAgICBuZWdvPSQob3BlbnNzbCBzX2NsaWVudCAtY29ubmVjdCAkVEhSSUZUSE9TVDokVEhSSUZUUE9SVCAtQ0FmaWxlIC4uL2tleXMvQ0EucGVtIC0kUFJPVE8gMj4mMSA8IC9kZXYvbnVsbCkKKyAgICBuZWdvZGVuaWVkPSQ/CisgICAgZWNobyAicmVzdWx0IG9mIGNvbW1hbmQ6ICRuZWdvZGVuaWVkIgorCisgICAgcmVzPSJlbmFibGVkIjsgaWYgW1sgJHtFWFBFQ1RfTkVHT1RJQVRFWyRQUk9UT119IC1lcSAwIF1dOyB0aGVuIHJlcz0iZGlzYWJsZWQiOyBmaQorCisgICAgaWYgW1sgJG5lZ29kZW5pZWQgLW5lICR7RVhQRUNUX05FR09USUFURVskUFJPVE9dfSBdXTsgdGhlbgorICAgICAgZWNobyAiJFBST1RPIG5lZ290aWF0aW9uIGFsbG93ZWQiCisgICAgZWxzZQorICAgICAgZWNobyAiW3dhcm5dICRQUk9UTyBuZWdvdGlhdGlvbiBkaWQgbm90IHdvcmsiCisgICAgICBlY2hvICRuZWdvCisgICAgICAoKGZhaWx1cmVzKyspKQorICAgIGZpCisgIGRvbmUKK30KKwordGxzCisKK2lmIFtbICRmYWlsdXJlcyAtZXEgMyBdXTsgdGhlbgorICBlY2hvICJbZmFpbF0gQXQgbGVhc3Qgb25lIG9mIFRMU3YxLjAsIFRMU3YxLjEsIG9yIFRMU3YxLjIgbmVlZHMgdG8gd29yaywgYnV0IGRvZXMgbm90IgorICBleGl0ICRmYWlsdXJlcworZmkKKworZWNobyAiW3Bhc3NdIEF0IGxlYXN0IG9uZSBvZiBUTFN2MS4wLCBUTFN2MS4xLCBvciBUTFN2MS4yIHdvcmtlZCIKK2V4aXQgMApkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy91dGlsLnB5IGIvdGVzdC9mZWF0dXJlcy91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYmJiYmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL3V0aWwucHkKQEAgLTAsMCArMSw0MCBAQAoraW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgc29ja2V0CisKK2Zyb20gbG9jYWxfdGhyaWZ0IGltcG9ydCB0aHJpZnQgICMgbm9xYQorZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRTb2NrZXQgaW1wb3J0IFRTb2NrZXQKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCBUQnVmZmVyZWRUcmFuc3BvcnQsIFRGcmFtZWRUcmFuc3BvcnQKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5USHR0cENsaWVudCBpbXBvcnQgVEh0dHBDbGllbnQKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCitmcm9tIHRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sCitmcm9tIHRocmlmdC5wcm90b2NvbC5USlNPTlByb3RvY29sIGltcG9ydCBUSlNPTlByb3RvY29sCisKKworZGVmIGFkZF9jb21tb25fYXJncyhwKToKKyAgICBwLmFkZF9hcmd1bWVudCgnLS1ob3N0JywgZGVmYXVsdD0nbG9jYWxob3N0JykKKyAgICBwLmFkZF9hcmd1bWVudCgnLS1wb3J0JywgdHlwZT1pbnQsIGRlZmF1bHQ9OTA5MCkKKyAgICBwLmFkZF9hcmd1bWVudCgnLS1wcm90b2NvbCcsIGRlZmF1bHQ9J2JpbmFyeScpCisgICAgcC5hZGRfYXJndW1lbnQoJy0tdHJhbnNwb3J0JywgZGVmYXVsdD0nYnVmZmVyZWQnKQorICAgIHAuYWRkX2FyZ3VtZW50KCctLXNzbCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisKKworZGVmIHBhcnNlX2NvbW1vbl9hcmdzKGFyZ3YpOgorICAgIHAgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgYWRkX2NvbW1vbl9hcmdzKHApCisgICAgcmV0dXJuIHAucGFyc2VfYXJncyhhcmd2KQorCisKK2RlZiBpbml0X3Byb3RvY29sKGFyZ3MpOgorICAgIHNvY2sgPSBUU29ja2V0KGFyZ3MuaG9zdCwgYXJncy5wb3J0LCBzb2NrZXRfZmFtaWx5PXNvY2tldC5BRl9JTkVUKQorICAgIHNvY2suc2V0VGltZW91dCg1MDApCisgICAgdHJhbnMgPSB7CisgICAgICAgICdidWZmZXJlZCc6IFRCdWZmZXJlZFRyYW5zcG9ydCwKKyAgICAgICAgJ2ZyYW1lZCc6IFRGcmFtZWRUcmFuc3BvcnQsCisgICAgICAgICdodHRwJzogVEh0dHBDbGllbnQsCisgICAgfVthcmdzLnRyYW5zcG9ydF0oc29jaykKKyAgICB0cmFucy5vcGVuKCkKKyAgICByZXR1cm4geworICAgICAgICAnYmluYXJ5JzogVEJpbmFyeVByb3RvY29sLAorICAgICAgICAnY29tcGFjdCc6IFRDb21wYWN0UHJvdG9jb2wsCisgICAgICAgICdqc29uJzogVEpTT05Qcm90b2NvbCwKKyAgICB9W2FyZ3MucHJvdG9jb2xdKHRyYW5zKQpkaWZmIC0tZ2l0IGEvdGVzdC9nby9NYWtlZmlsZS5hbSBiL3Rlc3QvZ28vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhODMzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZ28vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw2NiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0JVSUxUX1NPVVJDRVMgPSBnb3BhdGgKKworVEhSSUZUQ01EID0gJChUSFJJRlQpIC1vdXQgc3JjL2dlbiAtLWdlbiBnbzp0aHJpZnRfaW1wb3J0PXRocmlmdCQoQ09NUElMRVJfRVhUUkFGTEFHKQorVEhSSUZUVEVTVCA9ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCitwcmVjcm9zczogYmluL3Rlc3RjbGllbnQgYmluL3Rlc3RzZXJ2ZXIKKworVGhyaWZ0VGVzdC50aHJpZnQ6ICQoVEhSSUZUVEVTVCkKKwlncmVwIC12IGxpc3QuKm1hcC4qbGlzdC4qbWFwICQoVEhSSUZUVEVTVCkgPiBUaHJpZnRUZXN0LnRocmlmdAorCisuUEhPTlk6IGdvcGF0aAorCisjIFRocmlmdCBmb3IgR08gaGFzIHByb2JsZW1zIHdpdGggY29tcGxleCBtYXAga2V5czogVEhSSUZULTIwNjMKK2dvcGF0aDogJChUSFJJRlQpIFRocmlmdFRlc3QudGhyaWZ0CisJbWtkaXIgLXAgc3JjL2dlbgorCSQoVEhSSUZUQ01EKSBUaHJpZnRUZXN0LnRocmlmdAorCSQoVEhSSUZUQ01EKSAuLi9TdHJlc3NUZXN0LnRocmlmdAorCUdPUEFUSD1gcHdkYCAkKEdPKSBnZXQgZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2sgfHwgdHJ1ZQorCXNlZCAtaSAncy9cImNvbnRleHRcIi9cImdvbGFuZy5vcmdcL3hcL25ldFwvY29udGV4dFwiL2cnIHNyYy9naXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jay9jb250cm9sbGVyLmdvIHx8IHRydWUKKwlHT1BBVEg9YHB3ZGAgJChHTykgZ2V0IGdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrCisJbG4gLW5mcyAuLi8uLi8uLi9saWIvZ28vdGhyaWZ0IHNyYy90aHJpZnQKKwl0b3VjaCBnb3BhdGgKKworYmluL3Rlc3RjbGllbnQ6IGdvcGF0aAorCUdPUEFUSD1gcHdkYCAkKEdPKSBpbnN0YWxsIGJpbi90ZXN0Y2xpZW50CisKK2Jpbi90ZXN0c2VydmVyOiBnb3BhdGgKKwlHT1BBVEg9YHB3ZGAgJChHTykgaW5zdGFsbCBiaW4vdGVzdHNlcnZlcgorCitiaW4vc3RyZXNzOiBnb3BhdGgKKwlHT1BBVEg9YHB3ZGAgJChHTykgaW5zdGFsbCBiaW4vc3RyZXNzCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIHNyYy9nZW4gc3JjL2dpdGh1Yi5jb20vZ29sYW5nIHNyYy90aHJpZnQgYmluIHBrZyBnb3BhdGggVGhyaWZ0VGVzdC50aHJpZnQKKworY2hlY2tfUFJPR1JBTVM6IGJpbi90ZXN0Y2xpZW50IGJpbi90ZXN0c2VydmVyIGJpbi9zdHJlc3MKKworY2hlY2s6IGdvcGF0aCBnZW5tb2NrCisJR09QQVRIPWBwd2RgICQoR08pIHRlc3QgLXYgY29tbW9uLy4uLgorCitnZW5tb2NrOiBnb3BhdGgKKwlHT1BBVEg9YHB3ZGAgJChHTykgaW5zdGFsbCBnaXRodWIuY29tL2dvbGFuZy9tb2NrL21vY2tnZW4KKwlHT1BBVEg9YHB3ZGAgYmluL21vY2tnZW4gLWRlc3RpbmF0aW9uPXNyYy9jb21tb24vbW9ja19oYW5kbGVyLmdvIC1wYWNrYWdlPWNvbW1vbiBnZW4vdGhyaWZ0dGVzdCBUaHJpZnRUZXN0CisKK0VYVFJBX0RJU1QgPSBcCisJc3JjL2JpbiBcCisJc3JjL2NvbW1vbgpkaWZmIC0tZ2l0IGEvdGVzdC9nby9zcmMvYmluL3N0cmVzcy9tYWluLmdvIGIvdGVzdC9nby9zcmMvYmluL3N0cmVzcy9tYWluLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZTBmMjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dvL3NyYy9iaW4vc3RyZXNzL21haW4uZ28KQEAgLTAsMCArMSwyNTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBtYWluCisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImZsYWciCisJImZtdCIKKwkiZ2VuL3N0cmVzcyIKKwkibG9nIgorCV8gIm5ldC9odHRwL3Bwcm9mIgorCSJvcyIKKwkicnVudGltZSIKKwkicnVudGltZS9wcHJvZiIKKwkic3luYyIKKwkic3luYy9hdG9taWMiCisJInRocmlmdCIKKwkidGltZSIKKykKKwordmFyIGNwdXByb2ZpbGUgPSBmbGFnLlN0cmluZygiY3B1cHJvZmlsZSIsICIiLCAid3JpdGUgY3B1IHByb2ZpbGUgdG8gdGhpcyBmaWxlIikKK3ZhciBtZW1wcm9maWxlID0gZmxhZy5TdHJpbmcoIm1lbXByb2ZpbGUiLCAiIiwgIndyaXRlIG1lbW9yeSBwcm9maWxlIHRvIHRoaXMgZmlsZSIpCisKK3ZhciAoCisJaG9zdCAgICAgID0gZmxhZy5TdHJpbmcoImhvc3QiLCAibG9jYWxob3N0IiwgIkhvc3QgdG8gY29ubmVjdCIpCisJcG9ydCAgICAgID0gZmxhZy5JbnQ2NCgicG9ydCIsIDkwOTEsICJQb3J0IG51bWJlciB0byBjb25uZWN0IikKKwlsb29wICAgICAgPSBmbGFnLkludCgibG9vcHMiLCA1MDAwMCwgIlRoZSBudW1iZXIgb2YgcmVtb3RlIHRocmlmdCBjYWxscyBlYWNoIGNsaWVudCBtYWtlcyIpCisJcnVuc2VydmVyID0gZmxhZy5JbnQoInNlcnZlciIsIDEsICJSdW4gdGhlIFRocmlmdCBzZXJ2ZXIgaW4gdGhpcyBwcm9jZXNzIikKKwljbGllbnRzICAgPSBmbGFnLkludCgiY2xpZW50cyIsIDIwLCAiTnVtYmVyIG9mIGNsaWVudCB0aHJlYWRzIHRvIGNyZWF0ZSAtIDAgaW1wbGllcyBubyBjbGllbnRzLCBpLmUuIHNlcnZlciBvbmx5IikKKwljYWxsTmFtZSAgPSBmbGFnLlN0cmluZygiY2FsbCIsICJlY2hvVm9pZCIsICJTZXJ2aWNlIG1ldGhvZCB0byBjYWxsLCBvbmUgb2YgZWNob1ZvaWQsIGVjaG9CeXRlLCBlY2hvSTMyLCBlY2hvSTY0LCBlY2hvU3RyaW5nLCBlY2hpTGlzdCwgZWNob1NldCwgZWNob01hcCIpCisJY29tcGFjdCAgID0gZmxhZy5Cb29sKCJjb21wYWN0IiwgZmFsc2UsICJVc2UgY29tcGFjdCBwcm90b2NvbCBpbnN0ZWFkIG9mIGJpbmFyeS4iKQorCWZyYW1lZCAgICA9IGZsYWcuQm9vbCgiZnJhbWVkIiwgZmFsc2UsICJVc2UgZnJhbWVkIHRyYW5zcG9ydCBpbnN0ZWFkIG9mIGJ1ZmZlcmVkLiIpCispCit2YXIgaG9zdFBvcnQgc3RyaW5nCisKK3R5cGUgY2FsbFQgaW50NjQKKworY29uc3QgKAorCWVjaG9Wb2lkIGNhbGxUID0gaW90YQorCWVjaG9CeXRlCisJZWNob0kzMgorCWVjaG9JNjQKKwllY2hvU3RyaW5nCisJZWNoaUxpc3QKKwllY2hvU2V0CisJZWNob01hcAorKQorCit2YXIgY2FsbFRNYXAgPSBtYXBbc3RyaW5nXWNhbGxUeworCSJlY2hvVm9pZCI6ICAgZWNob1ZvaWQsCisJImVjaG9CeXRlIjogICBlY2hvQnl0ZSwKKwkiZWNob0kzMiI6ICAgIGVjaG9JMzIsCisJImVjaG9JNjQiOiAgICBlY2hvSTY0LAorCSJlY2hvU3RyaW5nIjogZWNob1N0cmluZywKKwkiZWNoaUxpc3QiOiAgIGVjaGlMaXN0LAorCSJlY2hvU2V0IjogICAgZWNob1NldCwKKwkiZWNob01hcCI6ICAgIGVjaG9NYXAsCit9Cit2YXIgY2FsbFR5cGUgY2FsbFQKKwordmFyIHJlYWR5LCBkb25lIHN5bmMuV2FpdEdyb3VwCisKK3ZhciBjbGljb3VudGVyIGludDY0ID0gMAordmFyIGNvdW50ZXIgaW50NjQgPSAwCisKK2Z1bmMgbWFpbigpIHsKKwlmbGFnLlBhcnNlKCkKKwlpZiAqbWVtcHJvZmlsZSAhPSAiIiB7CisJCXJ1bnRpbWUuTWVtUHJvZmlsZVJhdGUgPSAxMDAKKwl9CisJdmFyIG9rIGJvb2wKKwlpZiBjYWxsVHlwZSwgb2sgPSBjYWxsVE1hcFsqY2FsbE5hbWVdOyAhb2sgeworCQlsb2cuRmF0YWwoIlVua25vd24gc2VydmljZSBjYWxsIiwgKmNhbGxOYW1lKQorCX0KKwlpZiAqY3B1cHJvZmlsZSAhPSAiIiB7CisJCWYsIGVyciA6PSBvcy5DcmVhdGUoKmNwdXByb2ZpbGUpCisJCWlmIGVyciAhPSBuaWwgeworCQkJbG9nLkZhdGFsKGVycikKKwkJfQorCQlwcHJvZi5TdGFydENQVVByb2ZpbGUoZikKKwkJZGVmZXIgcHByb2YuU3RvcENQVVByb2ZpbGUoKQorCX0KKwlob3N0UG9ydCA9IGZtdC5TcHJpbnRmKCIlczolZCIsICpob3N0LCAqcG9ydCkKKwl2YXIgcHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5CisJdmFyIHRyYW5zcG9ydEZhY3RvcnkgdGhyaWZ0LlRUcmFuc3BvcnRGYWN0b3J5CisKKwlpZiAqY29tcGFjdCB7CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpCisJfSBlbHNlIHsKKwkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKKwl9CisKKwlpZiAqZnJhbWVkIHsKKwkJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpCisJCXRyYW5zcG9ydEZhY3RvcnkgPSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkodHJhbnNwb3J0RmFjdG9yeSkKKwl9IGVsc2UgeworCQl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoODE5MikKKwl9CisKKwlpZiAqcnVuc2VydmVyID4gMCB7CisJCXNlcnZlclRyYW5zcG9ydCwgZXJyIDo9IHRocmlmdC5OZXdUU2VydmVyU29ja2V0KGhvc3RQb3J0KQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCWxvZy5GYXRhbGYoIlVuYWJsZSB0byBjcmVhdGUgc2VydmVyIHNvY2tldDogJXMiLCBlcnIpCisJCX0KKworCQlwcm9jZXNzb3IgOj0gc3RyZXNzLk5ld1NlcnZpY2VQcm9jZXNzb3IoJmhhbmRsZXJ7fSkKKwkJc2VydmVyIDo9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCQlpZiAqY2xpZW50cyA9PSAwIHsKKwkJCXNlcnZlci5TZXJ2ZSgpCisJCX0gZWxzZSB7CisJCQlnbyBzZXJ2ZXIuU2VydmUoKQorCQl9CisJfQorCS8vc3RhcnQgY2xpZW50cworCWlmICpjbGllbnRzICE9IDAgeworCQlyZWFkeS5BZGQoKmNsaWVudHMgKyAxKQorCQlkb25lLkFkZCgqY2xpZW50cykKKwkJZm9yIGkgOj0gMDsgaSA8ICpjbGllbnRzOyBpKysgeworCQkJZ28gY2xpZW50KHByb3RvY29sRmFjdG9yeSkKKwkJfQorCQlyZWFkeS5Eb25lKCkKKwkJcmVhZHkuV2FpdCgpCisJCS8vcnVuIQorCQlzdGFydFRpbWUgOj0gdGltZS5Ob3coKQorCQkvL3dhaXQgZm9yIGNvbXBsZXRpb24KKwkJZG9uZS5XYWl0KCkKKwkJZW5kVGltZSA6PSB0aW1lLk5vdygpCisJCWR1cmF0aW9uIDo9IGVuZFRpbWUuU3ViKHN0YXJ0VGltZSkKKwkJbG9nLlByaW50ZigiJWQgY2FsbHMgaW4gJXYgKCVmIGNhbGxzIHBlciBzZWNvbmQpXG4iLCBjbGljb3VudGVyLCBkdXJhdGlvbiwgZmxvYXQ2NChjbGljb3VudGVyKS9kdXJhdGlvbi5TZWNvbmRzKCkpCisJfQorCWlmICptZW1wcm9maWxlICE9ICIiIHsKKwkJZiwgZXJyIDo9IG9zLkNyZWF0ZSgqbWVtcHJvZmlsZSkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlsb2cuRmF0YWwoZXJyKQorCQl9CisJCXBwcm9mLldyaXRlSGVhcFByb2ZpbGUoZikKKwkJZi5DbG9zZSgpCisJCXJldHVybgorCX0KK30KKworZnVuYyBjbGllbnQocHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5KSB7CisJdHJhbnMsIGVyciA6PSB0aHJpZnQuTmV3VFNvY2tldChob3N0UG9ydCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJbG9nLkZhdGFsZigiVW5hYmxlIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0OiAlcyIsIGVycikKKwl9CisJYnRyYW5zIDo9IHRocmlmdC5OZXdUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMsIDIwNDgpCisJY2xpZW50IDo9IHN0cmVzcy5OZXdTZXJ2aWNlQ2xpZW50RmFjdG9yeShidHJhbnMsIHByb3RvY29sRmFjdG9yeSkKKwllcnIgPSB0cmFucy5PcGVuKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJbG9nLkZhdGFsZigiVW5hYmxlIHRvIG9wZW4gY29ubmVjdGlvbjogJXMiLCBlcnIpCisJfQorCXJlYWR5LkRvbmUoKQorCXJlYWR5LldhaXQoKQorCXN3aXRjaCBjYWxsVHlwZSB7CisJY2FzZSBlY2hvVm9pZDoKKwkJZm9yIGkgOj0gMDsgaSA8ICpsb29wOyBpKysgeworCQkJY2xpZW50LkVjaG9Wb2lkKCkKKwkJCWF0b21pYy5BZGRJbnQ2NCgmY2xpY291bnRlciwgMSkKKwkJfQorCWNhc2UgZWNob0J5dGU6CisJCWZvciBpIDo9IDA7IGkgPCAqbG9vcDsgaSsrIHsKKwkJCWNsaWVudC5FY2hvQnl0ZSg0MikKKwkJCWF0b21pYy5BZGRJbnQ2NCgmY2xpY291bnRlciwgMSkKKwkJfQorCWNhc2UgZWNob0kzMjoKKwkJZm9yIGkgOj0gMDsgaSA8ICpsb29wOyBpKysgeworCQkJY2xpZW50LkVjaG9JMzIoNDI0MikKKwkJCWF0b21pYy5BZGRJbnQ2NCgmY2xpY291bnRlciwgMSkKKwkJfQorCWNhc2UgZWNob0k2NDoKKwkJZm9yIGkgOj0gMDsgaSA8ICpsb29wOyBpKysgeworCQkJY2xpZW50LkVjaG9JNjQoNDI0MjQyKQorCQkJYXRvbWljLkFkZEludDY0KCZjbGljb3VudGVyLCAxKQorCQl9CisJY2FzZSBlY2hvU3RyaW5nOgorCQlmb3IgaSA6PSAwOyBpIDwgKmxvb3A7IGkrKyB7CisJCQljbGllbnQuRWNob1N0cmluZygiVGVzdFN0cmluZyIpCisJCQlhdG9taWMuQWRkSW50NjQoJmNsaWNvdW50ZXIsIDEpCisJCX0KKwljYXNlIGVjaGlMaXN0OgorCQlsIDo9IFtdaW50OHstMTAsIC05LCAtOCwgLTcsIC02LCAtNSwgLTQsIC0zLCAtMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDh9CisJCWZvciBpIDo9IDA7IGkgPCAqbG9vcDsgaSsrIHsKKwkJCWNsaWVudC5FY2hvTGlzdChsKQorCQkJYXRvbWljLkFkZEludDY0KCZjbGljb3VudGVyLCAxKQorCQl9CisJY2FzZSBlY2hvU2V0OgorCQlzIDo9IG1hcFtpbnQ4XXN0cnVjdHt9ey0xMDoge30sIC05OiB7fSwgLTg6IHt9LCAtNzoge30sIC02OiB7fSwgLTU6IHt9LCAtNDoge30sIC0zOiB7fSwgLTI6IHt9LCAtMToge30sIDA6IHt9LCAxOiB7fSwgMjoge30sIDM6IHt9LCA0OiB7fSwgNToge30sIDY6IHt9LCA3OiB7fSwgODoge319CisJCWZvciBpIDo9IDA7IGkgPCAqbG9vcDsgaSsrIHsKKwkJCWNsaWVudC5FY2hvU2V0KHMpCisJCQlhdG9taWMuQWRkSW50NjQoJmNsaWNvdW50ZXIsIDEpCisJCX0KKwljYXNlIGVjaG9NYXA6CisJCW0gOj0gbWFwW2ludDhdaW50OHstMTA6IDEwLCAtOTogOSwgLTg6IDgsIC03OiA3LCAtNjogNiwgLTU6IDUsIC00OiA0LCAtMzogMywgLTI6IDIsIC0xOiAxLCAwOiAwLCAxOiAxLCAyOiAyLCAzOiAzLCA0OiA0LCA1OiA1LCA2OiA2LCA3OiA3LCA4OiA4fQorCQlmb3IgaSA6PSAwOyBpIDwgKmxvb3A7IGkrKyB7CisJCQljbGllbnQuRWNob01hcChtKQorCQkJYXRvbWljLkFkZEludDY0KCZjbGljb3VudGVyLCAxKQorCQl9CisJfQorCisJZG9uZS5Eb25lKCkKK30KKwordHlwZSBoYW5kbGVyIHN0cnVjdHt9CisKK2Z1bmMgKGggKmhhbmRsZXIpIEVjaG9Wb2lkKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKKwlhdG9taWMuQWRkSW50NjQoJmNvdW50ZXIsIDEpCisJcmV0dXJuIG5pbAorfQorZnVuYyAoaCAqaGFuZGxlcikgRWNob0J5dGUoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIGludDgpIChyIGludDgsIGVyciBlcnJvcikgeworCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKKwlyZXR1cm4gYXJnLCBuaWwKK30KK2Z1bmMgKGggKmhhbmRsZXIpIEVjaG9JMzIoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIGludDMyKSAociBpbnQzMiwgZXJyIGVycm9yKSB7CisJYXRvbWljLkFkZEludDY0KCZjb3VudGVyLCAxKQorCXJldHVybiBhcmcsIG5pbAorfQorZnVuYyAoaCAqaGFuZGxlcikgRWNob0k2NChjdHggY29udGV4dC5Db250ZXh0LCBhcmcgaW50NjQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKKwlhdG9taWMuQWRkSW50NjQoJmNvdW50ZXIsIDEpCisJcmV0dXJuIGFyZywgbmlsCit9CitmdW5jIChoICpoYW5kbGVyKSBFY2hvU3RyaW5nKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZyBzdHJpbmcpIChyIHN0cmluZywgZXJyIGVycm9yKSB7CisJYXRvbWljLkFkZEludDY0KCZjb3VudGVyLCAxKQorCXJldHVybiBhcmcsIG5pbAorfQorZnVuYyAoaCAqaGFuZGxlcikgRWNob0xpc3QoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIFtdaW50OCkgKHIgW11pbnQ4LCBlcnIgZXJyb3IpIHsKKwlhdG9taWMuQWRkSW50NjQoJmNvdW50ZXIsIDEpCisJcmV0dXJuIGFyZywgbmlsCit9CitmdW5jIChoICpoYW5kbGVyKSBFY2hvU2V0KGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZyBtYXBbaW50OF1zdHJ1Y3R7fSkgKHIgbWFwW2ludDhdc3RydWN0e30sIGVyciBlcnJvcikgeworCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKKwlyZXR1cm4gYXJnLCBuaWwKK30KK2Z1bmMgKGggKmhhbmRsZXIpIEVjaG9NYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIG1hcFtpbnQ4XWludDgpIChyIG1hcFtpbnQ4XWludDgsIGVyciBlcnJvcikgeworCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKKwlyZXR1cm4gYXJnLCBuaWwKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2Jpbi90ZXN0Y2xpZW50L21haW4uZ28gYi90ZXN0L2dvL3NyYy9iaW4vdGVzdGNsaWVudC9tYWluLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNTdlZTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dvL3NyYy9iaW4vdGVzdGNsaWVudC9tYWluLmdvCkBAIC0wLDAgKzEsMzE2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgbWFpbgorCitpbXBvcnQgKAorCSJjb21tb24iCisJImNvbnRleHQiCisJImZsYWciCisJImdlbi90aHJpZnR0ZXN0IgorCXQgImxvZyIKKwkicmVmbGVjdCIKKwkidGhyaWZ0IgorKQorCit2YXIgaG9zdCA9IGZsYWcuU3RyaW5nKCJob3N0IiwgImxvY2FsaG9zdCIsICJIb3N0IHRvIGNvbm5lY3QiKQordmFyIHBvcnQgPSBmbGFnLkludDY0KCJwb3J0IiwgOTA5MCwgIlBvcnQgbnVtYmVyIHRvIGNvbm5lY3QiKQordmFyIGRvbWFpbl9zb2NrZXQgPSBmbGFnLlN0cmluZygiZG9tYWluLXNvY2tldCIsICIiLCAiRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL3RocmlmdHRlc3QudGhyaWZ0KSwgaW5zdGVhZCBvZiBob3N0IGFuZCBwb3J0IikKK3ZhciB0cmFuc3BvcnQgPSBmbGFnLlN0cmluZygidHJhbnNwb3J0IiwgImJ1ZmZlcmVkIiwgIlRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCwgemxpYiIpCit2YXIgcHJvdG9jb2wgPSBmbGFnLlN0cmluZygicHJvdG9jb2wiLCAiYmluYXJ5IiwgIlByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb24iKQordmFyIHNzbCA9IGZsYWcuQm9vbCgic3NsIiwgZmFsc2UsICJFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTCIpCit2YXIgemxpYiA9IGZsYWcuQm9vbCgiemxpYiIsIGZhbHNlLCAiV3JhcHBlZCBUcmFuc3BvcnQgdXNpbmcgWmxpYiIpCit2YXIgdGVzdGxvb3BzID0gZmxhZy5JbnQoInRlc3Rsb29wcyIsIDEsICJOdW1iZXIgb2YgVGVzdHMiKQorCitmdW5jIG1haW4oKSB7CisJZmxhZy5QYXJzZSgpCisJY2xpZW50LCBfLCBlcnIgOj0gY29tbW9uLlN0YXJ0Q2xpZW50KCpob3N0LCAqcG9ydCwgKmRvbWFpbl9zb2NrZXQsICp0cmFuc3BvcnQsICpwcm90b2NvbCwgKnNzbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byBzdGFydCBjbGllbnQ6ICIsIGVycikKKwl9CisJZm9yIGkgOj0gMDsgaSA8ICp0ZXN0bG9vcHM7IGkrKyB7CisJCWNhbGxFdmVyeXRoaW5nKGNsaWVudCkKKwl9Cit9CisKK3ZhciBybWFwbWFwID0gbWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMnsKKwktNDogbWFwW2ludDMyXWludDMyey00OiAtNCwgLTM6IC0zLCAtMjogLTIsIC0xOiAtMX0sCisJNDogIG1hcFtpbnQzMl1pbnQzMns0OiA0LCAzOiAzLCAyOiAyLCAxOiAxfSwKK30KKwordmFyIHh4cyA9ICZ0aHJpZnR0ZXN0Llh0cnVjdHsKKwlTdHJpbmdUaGluZzogIkhlbGxvMiIsCisJQnl0ZVRoaW5nOiAgIDQyLAorCUkzMlRoaW5nOiAgICA0MjQyLAorCUk2NFRoaW5nOiAgICA0MjQyNDIsCit9CisKK3ZhciB4Y2VwdCA9ICZ0aHJpZnR0ZXN0LlhjZXB0aW9ue0Vycm9yQ29kZTogMTAwMSwgTWVzc2FnZTogIlhjZXB0aW9uIn0KK3ZhciBkZWZhdWx0Q3R4ID0gY29udGV4dC5CYWNrZ3JvdW5kKCkKKworZnVuYyBjYWxsRXZlcnl0aGluZyhjbGllbnQgKnRocmlmdHRlc3QuVGhyaWZ0VGVzdENsaWVudCkgeworCXZhciBlcnIgZXJyb3IKKwlpZiBlcnIgPSBjbGllbnQuVGVzdFZvaWQoZGVmYXVsdEN0eCk7IGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Vm9pZCgpIGNhbGw6ICIsIGVycikKKwl9CisKKwl0aGluZywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0aGluZyIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RTdHJpbmcoKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmIHRoaW5nICE9ICJ0aGluZyIgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0U3RyaW5nKCkgcmVzdWx0LCBleHBlY3RlZCAndGhpbmcnIGdvdCAnJXMnICIsIHRoaW5nKQorCX0KKworCWJsLCBlcnIgOj0gY2xpZW50LlRlc3RCb29sKGRlZmF1bHRDdHgsIHRydWUpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RCb29sKCkgY2FsbDogIiwgZXJyKQorCX0KKwlpZiAhYmwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0Qm9vbCgpIHJlc3VsdCBleHBlY3RlZCB0cnVlLCBnb3QgJWYgIiwgYmwpCisJfQorCWJsLCBlcnIgPSBjbGllbnQuVGVzdEJvb2woZGVmYXVsdEN0eCwgZmFsc2UpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RCb29sKCkgY2FsbDogIiwgZXJyKQorCX0KKwlpZiBibCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RCb29sKCkgcmVzdWx0IGV4cGVjdGVkIGZhbHNlLCBnb3QgJWYgIiwgYmwpCisJfQorCisJYiwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZShkZWZhdWx0Q3R4LCA0MikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJ5dGUoKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmIGIgIT0gNDIgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0Qnl0ZSgpIHJlc3VsdCBleHBlY3RlZCA0MiwgZ290ICVkICIsIGIpCisJfQorCisJaTMyLCBlcnIgOj0gY2xpZW50LlRlc3RJMzIoZGVmYXVsdEN0eCwgNDI0MikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEkzMigpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgaTMyICE9IDQyNDIgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0STMyKCkgcmVzdWx0IGV4cGVjdGVkIDQyNDIsIGdvdCAlZCAiLCBpMzIpCisJfQorCisJaTY0LCBlcnIgOj0gY2xpZW50LlRlc3RJNjQoZGVmYXVsdEN0eCwgNDI0MjQyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0STY0KCkgY2FsbDogIiwgZXJyKQorCX0KKwlpZiBpNjQgIT0gNDI0MjQyIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEk2NCgpIHJlc3VsdCBleHBlY3RlZCA0MjQyNDIsIGdvdCAlZCAiLCBpNjQpCisJfQorCisJZCwgZXJyIDo9IGNsaWVudC5UZXN0RG91YmxlKGRlZmF1bHRDdHgsIDQyLjQyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0RG91YmxlKCkgY2FsbDogIiwgZXJyKQorCX0KKwlpZiBkICE9IDQyLjQyIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdERvdWJsZSgpIHJlc3VsdCBleHBlY3RlZCA0Mi40MiwgZ290ICVmICIsIGQpCisJfQorCisJYmlub3V0IDo9IG1ha2UoW11ieXRlLCAyNTYpCisJZm9yIGkgOj0gMDsgaSA8IDI1NjsgaSsrIHsKKwkJYmlub3V0W2ldID0gYnl0ZShpKQorCX0KKwliaW4sIGVyciA6PSBjbGllbnQuVGVzdEJpbmFyeShkZWZhdWx0Q3R4LCBiaW5vdXQpCisJZm9yIGkgOj0gMDsgaSA8IDI1NjsgaSsrIHsKKwkJaWYgYmlub3V0W2ldICE9IGJpbltpXSB7CisJCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0QmluYXJ5KCkgcmVzdWx0IGV4cGVjdGVkICVkLCBnb3QgJWQgIiwgYmlub3V0W2ldLCBiaW5baV0pCisJCX0KKwl9CisKKwl4cyA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCisJeHMuU3RyaW5nVGhpbmcgPSAidGhpbmciCisJeHMuQnl0ZVRoaW5nID0gNDIKKwl4cy5JMzJUaGluZyA9IDQyNDIKKwl4cy5JNjRUaGluZyA9IDQyNDI0MgorCXhzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoZGVmYXVsdEN0eCwgeHMpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RTdHJ1Y3QoKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmICp4cyAhPSAqeHNyZXQgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0U3RydWN0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB4cywgeHNyZXQpCisJfQorCisJeDIgOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QyKCkKKwl4Mi5TdHJ1Y3RUaGluZyA9IHhzCisJeDJyZXQsIGVyciA6PSBjbGllbnQuVGVzdE5lc3QoZGVmYXVsdEN0eCwgeDIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3ROZXN0KCkgY2FsbDogIiwgZXJyKQorCX0KKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoeDIsIHgycmV0KSB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3ROZXN0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB4MiwgeDJyZXQpCisJfQorCisJbSA6PSBtYXBbaW50MzJdaW50MzJ7MTogMiwgMzogNCwgNTogNDJ9CisJbXJldCwgZXJyIDo9IGNsaWVudC5UZXN0TWFwKGRlZmF1bHRDdHgsIG0pCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RNYXAoKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbChtLCBtcmV0KSB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RNYXAoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIG0sIG1yZXQpCisJfQorCisJc20gOj0gbWFwW3N0cmluZ11zdHJpbmd7ImEiOiAiMiIsICJiIjogImJsYWgiLCAic29tZSI6ICJ0aGluZyJ9CisJc21yZXQsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZ01hcChkZWZhdWx0Q3R4LCBzbSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cmluZ01hcCgpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKHNtLCBzbXJldCkgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0U3RyaW5nTWFwKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBzbSwgc21yZXQpCisJfQorCisJcyA6PSBbXWludDMyezEsIDIsIDQyfQorCXNyZXQsIGVyciA6PSBjbGllbnQuVGVzdFNldChkZWZhdWx0Q3R4LCBzKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0U2V0KCkgY2FsbDogIiwgZXJyKQorCX0KKwkvLyBTZXRzIGNhbiBiZSBpbiBhbnkgb3JkZXIsIGJ1dCBHbyBzbGljZXMgYXJlIG9yZGVyZWQsIHNvIHJlZmxlY3QuRGVlcEVxdWFsIHdvbid0IHdvcmsuCisJc3RlbXAgOj0gbWFwW2ludDMyXXN0cnVjdHt9e30KKwlmb3IgXywgdmFsIDo9IHJhbmdlIHMgeworCQlzdGVtcFt2YWxdID0gc3RydWN0e317fQorCX0KKwlmb3IgXywgdmFsIDo9IHJhbmdlIHNyZXQgeworCQlpZiBfLCBvayA6PSBzdGVtcFt2YWxdOyAhb2sgeworCQkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdFNldCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgcywgc3JldCkKKwkJfQorCX0KKworCWwgOj0gW11pbnQzMnsxLCAyLCA0Mn0KKwlscmV0LCBlcnIgOj0gY2xpZW50LlRlc3RMaXN0KGRlZmF1bHRDdHgsIGwpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RMaXN0KCkgY2FsbDogIiwgZXJyKQorCX0KKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwobCwgbHJldCkgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0TGlzdCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgbCwgbHJldCkKKwl9CisKKwllcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RFbnVtKGRlZmF1bHRDdHgsIHRocmlmdHRlc3QuTnVtYmVyel9UV08pCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RFbnVtKCkgY2FsbDogIiwgZXJyKQorCX0KKwlpZiBlcmV0ICE9IHRocmlmdHRlc3QuTnVtYmVyel9UV08geworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0RW51bSgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgdGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTywgZXJldCkKKwl9CisKKwl0cmV0LCBlcnIgOj0gY2xpZW50LlRlc3RUeXBlZGVmKGRlZmF1bHRDdHgsIHRocmlmdHRlc3QuVXNlcklkKDQyKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFR5cGVkZWYoKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmIHRyZXQgIT0gdGhyaWZ0dGVzdC5Vc2VySWQoNDIpIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdFR5cGVkZWYoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHRocmlmdHRlc3QuVXNlcklkKDQyKSwgdHJldCkKKwl9CisKKwltYXBtYXAsIGVyciA6PSBjbGllbnQuVGVzdE1hcE1hcChkZWZhdWx0Q3R4LCA0MikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE1hcE1hcCgpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKG1hcG1hcCwgcm1hcG1hcCkgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0TWFwTWFwKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBybWFwbWFwLCBtYXBtYXApCisJfQorCisJY3JhenkgOj0gdGhyaWZ0dGVzdC5OZXdJbnNhbml0eSgpCisJY3JhenkuVXNlck1hcCA9IG1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpddGhyaWZ0dGVzdC5Vc2VySWR7CisJCXRocmlmdHRlc3QuTnVtYmVyel9GSVZFOiAgNSwKKwkJdGhyaWZ0dGVzdC5OdW1iZXJ6X0VJR0hUOiA4LAorCX0KKwl0cnVjazEgOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQorCXRydWNrMS5TdHJpbmdUaGluZyA9ICJHb29kYnllNCIKKwl0cnVjazEuQnl0ZVRoaW5nID0gNAorCXRydWNrMS5JMzJUaGluZyA9IDQKKwl0cnVjazEuSTY0VGhpbmcgPSA0CisJdHJ1Y2syIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKKwl0cnVjazIuU3RyaW5nVGhpbmcgPSAiSGVsbG8yIgorCXRydWNrMi5CeXRlVGhpbmcgPSAyCisJdHJ1Y2syLkkzMlRoaW5nID0gMgorCXRydWNrMi5JNjRUaGluZyA9IDIKKwljcmF6eS5YdHJ1Y3RzID0gW10qdGhyaWZ0dGVzdC5YdHJ1Y3R7CisJCXRydWNrMSwKKwkJdHJ1Y2syLAorCX0KKwlpbnNhbml0eSwgZXJyIDo9IGNsaWVudC5UZXN0SW5zYW5pdHkoZGVmYXVsdEN0eCwgY3JhenkpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RJbnNhbml0eSgpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGNyYXp5LCBpbnNhbml0eVsxXVsyXSkgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0SW5zYW5pdHkoKSBmaXJzdCByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsCisJCQljcmF6eSwKKwkJCWluc2FuaXR5WzFdWzJdKQorCX0KKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoY3JhenksIGluc2FuaXR5WzFdWzNdKSB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RJbnNhbml0eSgpIHNlY29uZCByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsCisJCQljcmF6eSwKKwkJCWluc2FuaXR5WzFdWzNdKQorCX0KKwlpZiBsZW4oaW5zYW5pdHlbMl1bNl0uVXNlck1hcCkgPiAwIHx8IGxlbihpbnNhbml0eVsyXVs2XS5YdHJ1Y3RzKSA+IDAgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0SW5zYW5pdHkoKSBub24tZW1wdHkgcmVzdWx0IGdvdCAlI3YgIiwKKwkJCWluc2FuaXR5WzJdWzZdKQorCX0KKworCXh4c3JldCwgZXJyIDo9IGNsaWVudC5UZXN0TXVsdGkoZGVmYXVsdEN0eCwgNDIsIDQyNDIsIDQyNDI0MiwgbWFwW2ludDE2XXN0cmluZ3sxOiAiYmxhaCIsIDI6ICJ0aGluZyJ9LCB0aHJpZnR0ZXN0Lk51bWJlcnpfRUlHSFQsIHRocmlmdHRlc3QuVXNlcklkKDI0KSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE11bHRpKCkgY2FsbDogIiwgZXJyKQorCX0KKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoeHhzLCB4eHNyZXQpIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdE11bHRpKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB4eHMsIHh4c3JldCkKKwl9CisKKwllcnIgPSBjbGllbnQuVGVzdEV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiWGNlcHRpb24iKQorCWlmIGVyciA9PSBuaWwgeworCQl0LkZhdGFsZigiRXhwZWN0aW5nIGV4Y2VwdGlvbiBpbiBUZXN0RXhjZXB0aW9uKCkgY2FsbCIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbChlcnIsIHhjZXB0KSB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RFeGNlcHRpb24oKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHhjZXB0LCBlcnIpCisJfQorCisJZXJyID0gY2xpZW50LlRlc3RFeGNlcHRpb24oZGVmYXVsdEN0eCwgIlRFeGNlcHRpb24iKQorCV8sIG9rIDo9IGVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKwlpZiBlcnIgPT0gbmlsIHx8ICFvayB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RFeGNlcHRpb24oKSByZXN1bHQgZXhwZWN0ZWQgQXBwbGljYXRpb25FcnJvciwgZ290ICUjdiAiLCBlcnIpCisJfQorCisJaWduLCBlcnIgOj0gY2xpZW50LlRlc3RNdWx0aUV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiWGNlcHRpb24iLCAiaWdub3JlbWUiKQorCWlmIGlnbiAhPSBuaWwgfHwgZXJyID09IG5pbCB7CisJCXQuRmF0YWxmKCJFeHBlY3RpbmcgZXhjZXB0aW9uIGluIFRlc3RNdWx0aUV4Y2VwdGlvbigpIGNhbGwiKQorCX0KKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoZXJyLCAmdGhyaWZ0dGVzdC5YY2VwdGlvbntFcnJvckNvZGU6IDEwMDEsIE1lc3NhZ2U6ICJUaGlzIGlzIGFuIFhjZXB0aW9uIn0pIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdE11bHRpRXhjZXB0aW9uKCkgJSN2ICIsIGVycikKKwl9CisKKwlpZ24sIGVyciA9IGNsaWVudC5UZXN0TXVsdGlFeGNlcHRpb24oZGVmYXVsdEN0eCwgIlhjZXB0aW9uMiIsICJpZ25vcmVtZSIpCisJaWYgaWduICE9IG5pbCB8fCBlcnIgPT0gbmlsIHsKKwkJdC5GYXRhbGYoIkV4cGVjdGluZyBleGNlcHRpb24gaW4gVGVzdE11bHRpRXhjZXB0aW9uKCkgY2FsbCIpCisJfQorCWV4cGVjdGluZyA6PSAmdGhyaWZ0dGVzdC5YY2VwdGlvbjJ7RXJyb3JDb2RlOiAyMDAyLCBTdHJ1Y3RUaGluZzogJnRocmlmdHRlc3QuWHRydWN0e1N0cmluZ1RoaW5nOiAiVGhpcyBpcyBhbiBYY2VwdGlvbjIifX0KKworCWlmICFyZWZsZWN0LkRlZXBFcXVhbChlcnIsIGV4cGVjdGluZykgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0TXVsdGlFeGNlcHRpb24oKSAlI3YgIiwgZXJyKQorCX0KKworCWVyciA9IGNsaWVudC5UZXN0T25ld2F5KGRlZmF1bHRDdHgsIDIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RPbmV3YXkoKSBjYWxsOiAiLCBlcnIpCisJfQorCisJLy9NYWtlIHN1cmUgdGhlIGNvbm5lY3Rpb24gc3RpbGwgYWxpdmUKKwlpZiBlcnIgPSBjbGllbnQuVGVzdFZvaWQoZGVmYXVsdEN0eCk7IGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Vm9pZCgpIGNhbGw6ICIsIGVycikKKwl9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9iaW4vdGVzdHNlcnZlci9tYWluLmdvIGIvdGVzdC9nby9zcmMvYmluL3Rlc3RzZXJ2ZXIvbWFpbi5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTJkOTY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9nby9zcmMvYmluL3Rlc3RzZXJ2ZXIvbWFpbi5nbwpAQCAtMCwwICsxLDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgbWFpbgorCitpbXBvcnQgKAorCSJjb21tb24iCisJImZsYWciCisJImZtdCIKKwkibG9nIgorCSJuZXQvaHR0cCIKKwkidGhyaWZ0IgorKQorCit2YXIgaG9zdCA9IGZsYWcuU3RyaW5nKCJob3N0IiwgImxvY2FsaG9zdCIsICJIb3N0IHRvIGNvbm5lY3QiKQordmFyIHBvcnQgPSBmbGFnLkludDY0KCJwb3J0IiwgOTA5MCwgIlBvcnQgbnVtYmVyIHRvIGNvbm5lY3QiKQordmFyIGRvbWFpbl9zb2NrZXQgPSBmbGFnLlN0cmluZygiZG9tYWluLXNvY2tldCIsICIiLCAiRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KSwgaW5zdGVhZCBvZiBob3N0IGFuZCBwb3J0IikKK3ZhciB0cmFuc3BvcnQgPSBmbGFnLlN0cmluZygidHJhbnNwb3J0IiwgImJ1ZmZlcmVkIiwgIlRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCwgemxpYiIpCit2YXIgcHJvdG9jb2wgPSBmbGFnLlN0cmluZygicHJvdG9jb2wiLCAiYmluYXJ5IiwgIlByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb24iKQordmFyIHNzbCA9IGZsYWcuQm9vbCgic3NsIiwgZmFsc2UsICJFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTCIpCit2YXIgemxpYiA9IGZsYWcuQm9vbCgiemxpYiIsIGZhbHNlLCAiV3JhcHBlZCBUcmFuc3BvcnQgdXNpbmcgWmxpYiIpCit2YXIgY2VydFBhdGggPSBmbGFnLlN0cmluZygiY2VydFBhdGgiLCAia2V5cyIsICJEaXJlY3RvcnkgdGhhdCBjb250YWlucyBTU0wgY2VydGlmaWNhdGVzIikKKworZnVuYyBtYWluKCkgeworCWZsYWcuUGFyc2UoKQorCisJcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgZXJyIDo9IGNvbW1vbi5HZXRTZXJ2ZXJQYXJhbXMoKmhvc3QsICpwb3J0LCAqZG9tYWluX3NvY2tldCwgKnRyYW5zcG9ydCwgKnByb3RvY29sLCAqc3NsLCAqY2VydFBhdGgsIGNvbW1vbi5QcmludGluZ0hhbmRsZXIpCisKKwlpZiBlcnIgIT0gbmlsIHsKKwkJbG9nLkZhdGFsZigiVW5hYmxlIHRvIHByb2Nlc3Mgc2VydmVyIHBhcmFtczogIiwgZXJyKQorCX0KKworCWlmICp0cmFuc3BvcnQgPT0gImh0dHAiIHsKKwkJaHR0cC5IYW5kbGVGdW5jKCIvIiwgdGhyaWZ0Lk5ld1RocmlmdEhhbmRsZXJGdW5jKHByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKQorCisJCWlmICpzc2wgeworCQkJZXJyIDo9IGh0dHAuTGlzdGVuQW5kU2VydmVUTFMoZm10LlNwcmludGYoIjolZCIsICpwb3J0KSwKKwkJCQkqY2VydFBhdGgrIi9zZXJ2ZXIucGVtIiwgKmNlcnRQYXRoKyIvc2VydmVyLmtleSIsIG5pbCkKKworCQkJaWYgZXJyICE9IG5pbCB7CisJCQkJZm10LlByaW50bG4oZXJyKQorCQkJCXJldHVybgorCQkJfQorCQl9IGVsc2UgeworCQkJaHR0cC5MaXN0ZW5BbmRTZXJ2ZShmbXQuU3ByaW50ZigiOiVkIiwgKnBvcnQpLCBuaWwpCisJCX0KKwl9IGVsc2UgeworCQlzZXJ2ZXIgOj0gdGhyaWZ0Lk5ld1RTaW1wbGVTZXJ2ZXI0KHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisJCWlmIGVyciA9IHNlcnZlci5MaXN0ZW4oKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4KKwkJfQorCQlnbyBzZXJ2ZXIuQWNjZXB0TG9vcCgpCisJCXNlcnZlci5TZXJ2ZSgpCisJfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9nby9zcmMvY29tbW9uL2NsaWVudC5nbyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9jbGllbnQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM2Y2U0MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9jbGllbnQuZ28KQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb21tb24KKworaW1wb3J0ICgKKwkiY29tcHJlc3MvemxpYiIKKwkiY3J5cHRvL3RscyIKKwkiZmxhZyIKKwkiZm10IgorCSJnZW4vdGhyaWZ0dGVzdCIKKwkibmV0L2h0dHAiCisJInRocmlmdCIKKykKKwordmFyIGRlYnVnQ2xpZW50UHJvdG9jb2wgYm9vbAorCitmdW5jIGluaXQoKSB7CisJZmxhZy5Cb29sVmFyKCZkZWJ1Z0NsaWVudFByb3RvY29sLCAiZGVidWdfY2xpZW50X3Byb3RvY29sIiwgZmFsc2UsICJ0dXJuIGNsaWVudCBwcm90b2NvbCB0cmFjZSBvbiIpCit9CisKK2Z1bmMgU3RhcnRDbGllbnQoCisJaG9zdCBzdHJpbmcsCisJcG9ydCBpbnQ2NCwKKwlkb21haW5fc29ja2V0IHN0cmluZywKKwl0cmFuc3BvcnQgc3RyaW5nLAorCXByb3RvY29sIHN0cmluZywKKwlzc2wgYm9vbCkgKGNsaWVudCAqdGhyaWZ0dGVzdC5UaHJpZnRUZXN0Q2xpZW50LCB0cmFucyB0aHJpZnQuVFRyYW5zcG9ydCwgZXJyIGVycm9yKSB7CisKKwlob3N0UG9ydCA6PSBmbXQuU3ByaW50ZigiJXM6JWQiLCBob3N0LCBwb3J0KQorCisJdmFyIHByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeQorCXN3aXRjaCBwcm90b2NvbCB7CisJY2FzZSAiY29tcGFjdCI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpCisJY2FzZSAic2ltcGxlanNvbiI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSgpCisJY2FzZSAianNvbiI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUSlNPTlByb3RvY29sRmFjdG9yeSgpCisJY2FzZSAiYmluYXJ5IjoKKwkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKKwlkZWZhdWx0OgorCQlyZXR1cm4gbmlsLCBuaWwsIGZtdC5FcnJvcmYoIkludmFsaWQgcHJvdG9jb2wgc3BlY2lmaWVkICVzIiwgcHJvdG9jb2wpCisJfQorCWlmIGRlYnVnQ2xpZW50UHJvdG9jb2wgeworCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VERlYnVnUHJvdG9jb2xGYWN0b3J5KHByb3RvY29sRmFjdG9yeSwgImNsaWVudDoiKQorCX0KKwlpZiBzc2wgeworCQl0cmFucywgZXJyID0gdGhyaWZ0Lk5ld1RTU0xTb2NrZXQoaG9zdFBvcnQsICZ0bHMuQ29uZmlne0luc2VjdXJlU2tpcFZlcmlmeTogdHJ1ZX0pCisJfSBlbHNlIHsKKwkJaWYgZG9tYWluX3NvY2tldCAhPSAiIiB7CisJCQl0cmFucywgZXJyID0gdGhyaWZ0Lk5ld1RTb2NrZXQoZG9tYWluX3NvY2tldCkKKwkJfSBlbHNlIHsKKwkJCXRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VFNvY2tldChob3N0UG9ydCkKKwkJfQorCX0KKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgbmlsLCBlcnIKKwl9CisJc3dpdGNoIHRyYW5zcG9ydCB7CisJY2FzZSAiaHR0cCI6CisJCWlmIHNzbCB7CisJCQl0ciA6PSAmaHR0cC5UcmFuc3BvcnR7CisJCQkJVExTQ2xpZW50Q29uZmlnOiAmdGxzLkNvbmZpZ3tJbnNlY3VyZVNraXBWZXJpZnk6IHRydWV9LAorCQkJfQorCQkJY2xpZW50IDo9ICZodHRwLkNsaWVudHtUcmFuc3BvcnQ6IHRyfQorCQkJdHJhbnMsIGVyciA9IHRocmlmdC5OZXdUSHR0cFBvc3RDbGllbnRXaXRoT3B0aW9ucyhmbXQuU3ByaW50ZigiaHR0cHM6Ly8lcy8iLCBob3N0UG9ydCksIHRocmlmdC5USHR0cENsaWVudE9wdGlvbnN7Q2xpZW50OiBjbGllbnR9KQorCQkJZm10LlByaW50bG4oaG9zdFBvcnQpCisJCX0gZWxzZSB7CisJCQl0cmFucywgZXJyID0gdGhyaWZ0Lk5ld1RIdHRwUG9zdENsaWVudChmbXQuU3ByaW50ZigiaHR0cDovLyVzLyIsIGhvc3RQb3J0KSkKKwkJfQorCWNhc2UgImZyYW1lZCI6CisJCXRyYW5zID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnQodHJhbnMpCisJY2FzZSAiYnVmZmVyZWQiOgorCQl0cmFucyA9IHRocmlmdC5OZXdUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMsIDgxOTIpCisJY2FzZSAiemxpYiI6CisJCXRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VFpsaWJUcmFuc3BvcnQodHJhbnMsIHpsaWIuQmVzdENvbXByZXNzaW9uKQorCWNhc2UgIiI6CisJCXRyYW5zID0gdHJhbnMKKwlkZWZhdWx0OgorCQlyZXR1cm4gbmlsLCBuaWwsIGZtdC5FcnJvcmYoIkludmFsaWQgdHJhbnNwb3J0IHNwZWNpZmllZCAlcyIsIHRyYW5zcG9ydCkKKwl9CisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIG5pbCwgZXJyCisJfQorCWlmIGVyciA9IHRyYW5zLk9wZW4oKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIG5pbCwgZXJyCisJfQorCWlwcm90IDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykKKwlvcHJvdCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCisJY2xpZW50ID0gdGhyaWZ0dGVzdC5OZXdUaHJpZnRUZXN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQoaXByb3QsIG9wcm90KSkKKwlyZXR1cm4KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9jbGllbnRzZXJ2ZXJfdGVzdC5nbyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9jbGllbnRzZXJ2ZXJfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjkzYzRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9nby9zcmMvY29tbW9uL2NsaWVudHNlcnZlcl90ZXN0LmdvCkBAIC0wLDAgKzEsMzM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tbW9uCisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImVycm9ycyIKKwkiZ2VuL3RocmlmdHRlc3QiCisJInJlZmxlY3QiCisJInN5bmMiCisJInRlc3RpbmciCisJInRocmlmdCIKKworCSJnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jayIKKykKKwordHlwZSB0ZXN0X3VuaXQgc3RydWN0IHsKKwlob3N0ICAgICAgICAgIHN0cmluZworCXBvcnQgICAgICAgICAgaW50NjQKKwlkb21haW5fc29ja2V0IHN0cmluZworCXRyYW5zcG9ydCAgICAgc3RyaW5nCisJcHJvdG9jb2wgICAgICBzdHJpbmcKKwlzc2wgICAgICAgICAgIGJvb2wKK30KKwordmFyIHVuaXRzID0gW110ZXN0X3VuaXR7CisJeyIxMjcuMC4wLjEiLCA5MDk1LCAiIiwgIiIsICJiaW5hcnkiLCBmYWxzZX0sCisJeyIxMjcuMC4wLjEiLCA5MDkxLCAiIiwgIiIsICJjb21wYWN0IiwgZmFsc2V9LAorCXsiMTI3LjAuMC4xIiwgOTA5MiwgIiIsICIiLCAiYmluYXJ5IiwgdHJ1ZX0sCisJeyIxMjcuMC4wLjEiLCA5MDkzLCAiIiwgIiIsICJjb21wYWN0IiwgdHJ1ZX0sCit9CisKK2Z1bmMgVGVzdEFsbENvbm5lY3Rpb24odCAqdGVzdGluZy5UKSB7CisJY2VydFBhdGggPSAiLi4vLi4vLi4va2V5cyIKKwl3ZyA6PSAmc3luYy5XYWl0R3JvdXB7fQorCXdnLkFkZChsZW4odW5pdHMpKQorCWZvciBfLCB1bml0IDo9IHJhbmdlIHVuaXRzIHsKKwkJZ28gZnVuYyh1IHRlc3RfdW5pdCkgeworCQkJZGVmZXIgd2cuRG9uZSgpCisJCQlkb1VuaXQodCwgJnUpCisJCX0odW5pdCkKKwl9CisJd2cuV2FpdCgpCit9CisKK2Z1bmMgZG9Vbml0KHQgKnRlc3RpbmcuVCwgdW5pdCAqdGVzdF91bml0KSB7CisJY3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCWRlZmVyIGN0cmwuRmluaXNoKCkKKwloYW5kbGVyIDo9IE5ld01vY2tUaHJpZnRUZXN0KGN0cmwpCisKKwlwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCBlcnIgOj0gR2V0U2VydmVyUGFyYW1zKHVuaXQuaG9zdCwgdW5pdC5wb3J0LCB1bml0LmRvbWFpbl9zb2NrZXQsIHVuaXQudHJhbnNwb3J0LCB1bml0LnByb3RvY29sLCB1bml0LnNzbCwgIi4uLy4uLy4uL2tleXMiLCBoYW5kbGVyKQorCisJc2VydmVyIDo9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCWlmIGVyciA9IHNlcnZlci5MaXN0ZW4oKTsgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmFibGUgdG8gc3RhcnQgc2VydmVyOiAldiIsIGVycikKKwkJcmV0dXJuCisJfQorCWdvIHNlcnZlci5BY2NlcHRMb29wKCkKKwlkZWZlciBzZXJ2ZXIuU3RvcCgpCisJY2xpZW50LCB0cmFucywgZXJyIDo9IFN0YXJ0Q2xpZW50KHVuaXQuaG9zdCwgdW5pdC5wb3J0LCB1bml0LmRvbWFpbl9zb2NrZXQsIHVuaXQudHJhbnNwb3J0LCB1bml0LnByb3RvY29sLCB1bml0LnNzbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuYWJsZSB0byBzdGFydCBjbGllbnQ6ICV2IiwgZXJyKQorCQlyZXR1cm4KKwl9CisJZGVmZXIgdHJhbnMuQ2xvc2UoKQorCWNhbGxFdmVyeXRoaW5nV2l0aE1vY2sodCwgY2xpZW50LCBoYW5kbGVyKQorfQorCit2YXIgcm1hcG1hcCA9IG1hcFtpbnQzMl1tYXBbaW50MzJdaW50MzJ7CisJLTQ6IG1hcFtpbnQzMl1pbnQzMnstNDogLTQsIC0zOiAtMywgLTI6IC0yLCAtMTogLTF9LAorCTQ6ICBtYXBbaW50MzJdaW50MzJ7NDogNCwgMzogMywgMjogMiwgMTogMX0sCit9CisKK3ZhciB4eHMgPSAmdGhyaWZ0dGVzdC5YdHJ1Y3R7CisJU3RyaW5nVGhpbmc6ICJIZWxsbzIiLAorCUJ5dGVUaGluZzogICA0MiwKKwlJMzJUaGluZzogICAgNDI0MiwKKwlJNjRUaGluZzogICAgNDI0MjQyLAorfQorCit2YXIgeGNlcHQgPSAmdGhyaWZ0dGVzdC5YY2VwdGlvbntFcnJvckNvZGU6IDEwMDEsIE1lc3NhZ2U6ICJzb21lIn0KK3ZhciBkZWZhdWx0Q3R4ID0gY29udGV4dC5CYWNrZ3JvdW5kKCkKKworZnVuYyBjYWxsRXZlcnl0aGluZ1dpdGhNb2NrKHQgKnRlc3RpbmcuVCwgY2xpZW50ICp0aHJpZnR0ZXN0LlRocmlmdFRlc3RDbGllbnQsIGhhbmRsZXIgKk1vY2tUaHJpZnRUZXN0KSB7CisJZ29tb2NrLkluT3JkZXIoCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFZvaWQoZ29tb2NrLkFueSgpKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0U3RyaW5nKGdvbW9jay5BbnkoKSwgInRoaW5nIikuUmV0dXJuKCJ0aGluZyIsIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEJvb2woZ29tb2NrLkFueSgpLCB0cnVlKS5SZXR1cm4odHJ1ZSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0Qm9vbChnb21vY2suQW55KCksIGZhbHNlKS5SZXR1cm4oZmFsc2UsIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEJ5dGUoZ29tb2NrLkFueSgpLCBpbnQ4KDQyKSkuUmV0dXJuKGludDgoNDIpLCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RJMzIoZ29tb2NrLkFueSgpLCBpbnQzMig0MjQyKSkuUmV0dXJuKGludDMyKDQyNDIpLCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RJNjQoZ29tb2NrLkFueSgpLCBpbnQ2NCg0MjQyNDIpKS5SZXR1cm4oaW50NjQoNDI0MjQyKSwgbmlsKSwKKwkJLy8gVE9ETzogYWRkIFRlc3RCaW5hcnkoKQorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3REb3VibGUoZ29tb2NrLkFueSgpLCBmbG9hdDY0KDQyLjQyKSkuUmV0dXJuKGZsb2F0NjQoNDIuNDIpLCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RTdHJ1Y3QoZ29tb2NrLkFueSgpLCAmdGhyaWZ0dGVzdC5YdHJ1Y3R7U3RyaW5nVGhpbmc6ICJ0aGluZyIsIEJ5dGVUaGluZzogNDIsIEkzMlRoaW5nOiA0MjQyLCBJNjRUaGluZzogNDI0MjQyfSkuUmV0dXJuKCZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogInRoaW5nIiwgQnl0ZVRoaW5nOiA0MiwgSTMyVGhpbmc6IDQyNDIsIEk2NFRoaW5nOiA0MjQyNDJ9LCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3ROZXN0KGdvbW9jay5BbnkoKSwgJnRocmlmdHRlc3QuWHRydWN0MntTdHJ1Y3RUaGluZzogJnRocmlmdHRlc3QuWHRydWN0e1N0cmluZ1RoaW5nOiAidGhpbmciLCBCeXRlVGhpbmc6IDQyLCBJMzJUaGluZzogNDI0MiwgSTY0VGhpbmc6IDQyNDI0Mn19KS5SZXR1cm4oJnRocmlmdHRlc3QuWHRydWN0MntTdHJ1Y3RUaGluZzogJnRocmlmdHRlc3QuWHRydWN0e1N0cmluZ1RoaW5nOiAidGhpbmciLCBCeXRlVGhpbmc6IDQyLCBJMzJUaGluZzogNDI0MiwgSTY0VGhpbmc6IDQyNDI0Mn19LCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RNYXAoZ29tb2NrLkFueSgpLCBtYXBbaW50MzJdaW50MzJ7MTogMiwgMzogNCwgNTogNDJ9KS5SZXR1cm4obWFwW2ludDMyXWludDMyezE6IDIsIDM6IDQsIDU6IDQyfSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0U3RyaW5nTWFwKGdvbW9jay5BbnkoKSwgbWFwW3N0cmluZ11zdHJpbmd7ImEiOiAiMiIsICJiIjogImJsYWgiLCAic29tZSI6ICJ0aGluZyJ9KS5SZXR1cm4obWFwW3N0cmluZ11zdHJpbmd7ImEiOiAiMiIsICJiIjogImJsYWgiLCAic29tZSI6ICJ0aGluZyJ9LCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RTZXQoZ29tb2NrLkFueSgpLCBbXWludDMyezEsIDIsIDQyfSkuUmV0dXJuKFtdaW50MzJ7MSwgMiwgNDJ9LCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RMaXN0KGdvbW9jay5BbnkoKSwgW11pbnQzMnsxLCAyLCA0Mn0pLlJldHVybihbXWludDMyezEsIDIsIDQyfSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0RW51bShnb21vY2suQW55KCksIHRocmlmdHRlc3QuTnVtYmVyel9UV08pLlJldHVybih0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPLCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RUeXBlZGVmKGdvbW9jay5BbnkoKSwgdGhyaWZ0dGVzdC5Vc2VySWQoNDIpKS5SZXR1cm4odGhyaWZ0dGVzdC5Vc2VySWQoNDIpLCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RNYXBNYXAoZ29tb2NrLkFueSgpLCBpbnQzMig0MikpLlJldHVybihybWFwbWFwLCBuaWwpLAorCQkvLyBUT0RPOiBub3QgdGVzdGluZyBpbnNhbml0eQorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RNdWx0aShnb21vY2suQW55KCksIGludDgoNDIpLCBpbnQzMig0MjQyKSwgaW50NjQoNDI0MjQyKSwgbWFwW2ludDE2XXN0cmluZ3sxOiAiYmxhaCIsIDI6ICJ0aGluZyJ9LCB0aHJpZnR0ZXN0Lk51bWJlcnpfRUlHSFQsIHRocmlmdHRlc3QuVXNlcklkKDI0KSkuUmV0dXJuKHh4cywgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0RXhjZXB0aW9uKGdvbW9jay5BbnkoKSwgInNvbWUiKS5SZXR1cm4oeGNlcHQpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RFeGNlcHRpb24oZ29tb2NrLkFueSgpLCAiVEV4Y2VwdGlvbiIpLlJldHVybihlcnJvcnMuTmV3KCJKdXN0IHJhbmRvbSBleGNlcHRpb24iKSksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdE11bHRpRXhjZXB0aW9uKGdvbW9jay5BbnkoKSwgIlhjZXB0aW9uIiwgImlnbm9yZW1lIikuUmV0dXJuKG5pbCwgJnRocmlmdHRlc3QuWGNlcHRpb257RXJyb3JDb2RlOiAxMDAxLCBNZXNzYWdlOiAiVGhpcyBpcyBhbiBYY2VwdGlvbiJ9KSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TXVsdGlFeGNlcHRpb24oZ29tb2NrLkFueSgpLCAiWGNlcHRpb24yIiwgImlnbm9yZW1lIikuUmV0dXJuKG5pbCwgJnRocmlmdHRlc3QuWGNlcHRpb24ye0Vycm9yQ29kZTogMjAwMiwgU3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogIlRoaXMgaXMgYW4gWGNlcHRpb24yIn19KSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0T25ld2F5KGdvbW9jay5BbnkoKSwgaW50MzIoMikpLlJldHVybihuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RWb2lkKGdvbW9jay5BbnkoKSksCisJKQorCXZhciBlcnIgZXJyb3IKKwlpZiBlcnIgPSBjbGllbnQuVGVzdFZvaWQoZGVmYXVsdEN0eCk7IGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Vm9pZCgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKworCXRoaW5nLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRoaW5nIikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cmluZygpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwlpZiB0aGluZyAhPSAidGhpbmciIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdFN0cmluZygpIHJlc3VsdCwgZXhwZWN0ZWQgJ3RoaW5nJyBnb3QgJyVzJyAiLCB0aGluZykKKwl9CisKKwlibCwgZXJyIDo9IGNsaWVudC5UZXN0Qm9vbChkZWZhdWx0Q3R4LCB0cnVlKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Qm9vbCgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwlpZiAhYmwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0Qm9vbCgpIHJlc3VsdCBleHBlY3RlZCB0cnVlLCBnb3QgJXYgIiwgYmwpCisJfQorCWJsLCBlcnIgPSBjbGllbnQuVGVzdEJvb2woZGVmYXVsdEN0eCwgZmFsc2UpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RCb29sKCkgY2FsbDogJXMiLCBlcnIpCisJfQorCWlmIGJsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEJvb2woKSByZXN1bHQgZXhwZWN0ZWQgZmFsc2UsIGdvdCAldiAiLCBibCkKKwl9CisKKwliLCBlcnIgOj0gY2xpZW50LlRlc3RCeXRlKGRlZmF1bHRDdHgsIDQyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Qnl0ZSgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwlpZiBiICE9IDQyIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEJ5dGUoKSByZXN1bHQgZXhwZWN0ZWQgNDIsIGdvdCAlZCAiLCBiKQorCX0KKworCWkzMiwgZXJyIDo9IGNsaWVudC5UZXN0STMyKGRlZmF1bHRDdHgsIDQyNDIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RJMzIoKSBjYWxsOiAlcyIsIGVycikKKwl9CisJaWYgaTMyICE9IDQyNDIgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0STMyKCkgcmVzdWx0IGV4cGVjdGVkIDQyNDIsIGdvdCAlZCAiLCBpMzIpCisJfQorCisJaTY0LCBlcnIgOj0gY2xpZW50LlRlc3RJNjQoZGVmYXVsdEN0eCwgNDI0MjQyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0STY0KCkgY2FsbDogJXMiLCBlcnIpCisJfQorCWlmIGk2NCAhPSA0MjQyNDIgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0STY0KCkgcmVzdWx0IGV4cGVjdGVkIDQyNDI0MiwgZ290ICVkICIsIGk2NCkKKwl9CisKKwlkLCBlcnIgOj0gY2xpZW50LlRlc3REb3VibGUoZGVmYXVsdEN0eCwgNDIuNDIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3REb3VibGUoKSBjYWxsOiAlcyIsIGVycikKKwl9CisJaWYgZCAhPSA0Mi40MiB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3REb3VibGUoKSByZXN1bHQgZXhwZWN0ZWQgNDIuNDIsIGdvdCAlZiAiLCBkKQorCX0KKworCS8vIFRPRE86IGFkZCBUZXN0QmluYXJ5KCkgY2FsbAorCisJeHMgOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQorCXhzLlN0cmluZ1RoaW5nID0gInRoaW5nIgorCXhzLkJ5dGVUaGluZyA9IDQyCisJeHMuSTMyVGhpbmcgPSA0MjQyCisJeHMuSTY0VGhpbmcgPSA0MjQyNDIKKwl4c3JldCwgZXJyIDo9IGNsaWVudC5UZXN0U3RydWN0KGRlZmF1bHRDdHgsIHhzKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0U3RydWN0KCkgY2FsbDogJXMiLCBlcnIpCisJfQorCWlmICp4cyAhPSAqeHNyZXQgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0U3RydWN0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB4cywgeHNyZXQpCisJfQorCisJeDIgOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QyKCkKKwl4Mi5TdHJ1Y3RUaGluZyA9IHhzCisJeDJyZXQsIGVyciA6PSBjbGllbnQuVGVzdE5lc3QoZGVmYXVsdEN0eCwgeDIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3ROZXN0KCkgY2FsbDogJXMiLCBlcnIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbCh4MiwgeDJyZXQpIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdE5lc3QoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHgyLCB4MnJldCkKKwl9CisKKwltIDo9IG1hcFtpbnQzMl1pbnQzMnsxOiAyLCAzOiA0LCA1OiA0Mn0KKwltcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNYXAoZGVmYXVsdEN0eCwgbSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE1hcCgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwobSwgbXJldCkgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TWFwKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBtLCBtcmV0KQorCX0KKworCXNtIDo9IG1hcFtzdHJpbmddc3RyaW5neyJhIjogIjIiLCAiYiI6ICJibGFoIiwgInNvbWUiOiAidGhpbmcifQorCXNtcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmdNYXAoZGVmYXVsdEN0eCwgc20pCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RTdHJpbmdNYXAoKSBjYWxsOiAlcyIsIGVycikKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKHNtLCBzbXJldCkgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0U3RyaW5nTWFwKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBzbSwgc21yZXQpCisJfQorCisJcyA6PSBbXWludDMyezEsIDIsIDQyfQorCXNyZXQsIGVyciA6PSBjbGllbnQuVGVzdFNldChkZWZhdWx0Q3R4LCBzKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0U2V0KCkgY2FsbDogJXMiLCBlcnIpCisJfQorCS8vIFNldHMgY2FuIGJlIGluIGFueSBvcmRlciwgYnV0IEdvIHNsaWNlcyBhcmUgb3JkZXJlZCwgc28gcmVmbGVjdC5EZWVwRXF1YWwgd29uJ3Qgd29yay4KKwlzdGVtcCA6PSBtYXBbaW50MzJdc3RydWN0e317fQorCWZvciBfLCB2YWwgOj0gcmFuZ2UgcyB7CisJCXN0ZW1wW3ZhbF0gPSBzdHJ1Y3R7fXt9CisJfQorCWZvciBfLCB2YWwgOj0gcmFuZ2Ugc3JldCB7CisJCWlmIF8sIG9rIDo9IHN0ZW1wW3ZhbF07ICFvayB7CisJCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0U2V0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBzLCBzcmV0KQorCQl9CisJfQorCisJbCA6PSBbXWludDMyezEsIDIsIDQyfQorCWxyZXQsIGVyciA6PSBjbGllbnQuVGVzdExpc3QoZGVmYXVsdEN0eCwgbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdExpc3QoKSBjYWxsOiAlcyIsIGVycikKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGwsIGxyZXQpIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdExpc3QoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIGwsIGxyZXQpCisJfQorCisJZXJldCwgZXJyIDo9IGNsaWVudC5UZXN0RW51bShkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0RW51bSgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwlpZiBlcmV0ICE9IHRocmlmdHRlc3QuTnVtYmVyel9UV08geworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0RW51bSgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgdGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTywgZXJldCkKKwl9CisKKwl0cmV0LCBlcnIgOj0gY2xpZW50LlRlc3RUeXBlZGVmKGRlZmF1bHRDdHgsIHRocmlmdHRlc3QuVXNlcklkKDQyKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFR5cGVkZWYoKSBjYWxsOiAlcyIsIGVycikKKwl9CisJaWYgdHJldCAhPSB0aHJpZnR0ZXN0LlVzZXJJZCg0MikgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0VHlwZWRlZigpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgdGhyaWZ0dGVzdC5Vc2VySWQoNDIpLCB0cmV0KQorCX0KKworCW1hcG1hcCwgZXJyIDo9IGNsaWVudC5UZXN0TWFwTWFwKGRlZmF1bHRDdHgsIDQyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TWFwbWFwKCkgY2FsbDogJXMiLCBlcnIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbChtYXBtYXAsIHJtYXBtYXApIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdE1hcG1hcCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgcm1hcG1hcCwgbWFwbWFwKQorCX0KKworCXh4c3JldCwgZXJyIDo9IGNsaWVudC5UZXN0TXVsdGkoZGVmYXVsdEN0eCwgNDIsIDQyNDIsIDQyNDI0MiwgbWFwW2ludDE2XXN0cmluZ3sxOiAiYmxhaCIsIDI6ICJ0aGluZyJ9LCB0aHJpZnR0ZXN0Lk51bWJlcnpfRUlHSFQsIHRocmlmdHRlc3QuVXNlcklkKDI0KSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE11bHRpKCkgY2FsbDogJXMiLCBlcnIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbCh4eHMsIHh4c3JldCkgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TXVsdGkoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHh4cywgeHhzcmV0KQorCX0KKworCWVyciA9IGNsaWVudC5UZXN0RXhjZXB0aW9uKGRlZmF1bHRDdHgsICJzb21lIikKKwlpZiBlcnIgPT0gbmlsIHsKKwkJdC5FcnJvcmYoIkV4cGVjdGluZyBleGNlcHRpb24gaW4gVGVzdEV4Y2VwdGlvbigpIGNhbGwiKQorCX0KKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoZXJyLCB4Y2VwdCkgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0RXhjZXB0aW9uKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB4Y2VwdCwgZXJyKQorCX0KKworCS8vIFRPRE86IGNvbm5lY3Rpb24gaXMgYmVpbmcgY2xvc2VkIG9uIHRoaXMKKwllcnIgPSBjbGllbnQuVGVzdEV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiVEV4Y2VwdGlvbiIpCisJaWYgZXJyID09IG5pbCB7CisJCXQuRXJyb3IoImV4cGVjdGVkIGV4Y2VwdGlvbiBnb3QgbmlsIikKKwl9IGVsc2UgaWYgdGV4LCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pOyAhb2sgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0RXhjZXB0aW9uKCkgcmVzdWx0IGV4cGVjdGVkIEFwcGxpY2F0aW9uRXJyb3IsIGdvdCAlVCAiLCBlcnIpCisJfSBlbHNlIGlmIHRleC5UeXBlSWQoKSAhPSB0aHJpZnQuSU5URVJOQUxfRVJST1IgeworCQl0LkVycm9yZigiZXhwZWN0ZWQgaW50ZXJuYWxfZXJyb3IgZ290ICV2IiwgdGV4LlR5cGVJZCgpKQorCX0KKworCWlnbiwgZXJyIDo9IGNsaWVudC5UZXN0TXVsdGlFeGNlcHRpb24oZGVmYXVsdEN0eCwgIlhjZXB0aW9uIiwgImlnbm9yZW1lIikKKwlpZiBpZ24gIT0gbmlsIHx8IGVyciA9PSBuaWwgeworCQl0LkVycm9yZigiRXhwZWN0aW5nIGV4Y2VwdGlvbiBpbiBUZXN0TXVsdGlFeGNlcHRpb24oKSBjYWxsIikKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGVyciwgJnRocmlmdHRlc3QuWGNlcHRpb257RXJyb3JDb2RlOiAxMDAxLCBNZXNzYWdlOiAiVGhpcyBpcyBhbiBYY2VwdGlvbiJ9KSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RNdWx0aUV4Y2VwdGlvbigpICUjdiAiLCBlcnIpCisJfQorCisJaWduLCBlcnIgPSBjbGllbnQuVGVzdE11bHRpRXhjZXB0aW9uKGRlZmF1bHRDdHgsICJYY2VwdGlvbjIiLCAiaWdub3JlbWUiKQorCWlmIGlnbiAhPSBuaWwgfHwgZXJyID09IG5pbCB7CisJCXQuRXJyb3JmKCJFeHBlY3RpbmcgZXhjZXB0aW9uIGluIFRlc3RNdWx0aUV4Y2VwdGlvbigpIGNhbGwiKQorCX0KKwlleHBlY3RpbmcgOj0gJnRocmlmdHRlc3QuWGNlcHRpb24ye0Vycm9yQ29kZTogMjAwMiwgU3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogIlRoaXMgaXMgYW4gWGNlcHRpb24yIn19CisKKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoZXJyLCBleHBlY3RpbmcpIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdE11bHRpRXhjZXB0aW9uKCkgJSN2ICIsIGVycikKKwl9CisKKwllcnIgPSBjbGllbnQuVGVzdE9uZXdheShkZWZhdWx0Q3R4LCAyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0T25ld2F5KCkgY2FsbDogJXMiLCBlcnIpCisJfQorCisJLy9NYWtlIHN1cmUgdGhlIGNvbm5lY3Rpb24gc3RpbGwgYWxpdmUKKwlpZiBlcnIgPSBjbGllbnQuVGVzdFZvaWQoZGVmYXVsdEN0eCk7IGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Vm9pZCgpIGNhbGw6ICVzIiwgZXJyKQorCX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9jb250ZXh0X3Rlc3QuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vY29udGV4dF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NGRiYjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dvL3NyYy9jb21tb24vY29udGV4dF90ZXN0LmdvCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb21tb24KKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZm10IgorCSJuZXQiCisJIm5ldC9odHRwIgorCSJuZXQvdXJsIgorCSJvcyIKKwkic3lzY2FsbCIKKwkidGVzdGluZyIKKwkidGhyaWZ0IgorCSJ0aW1lIgorKQorCit0eXBlIHNsb3dIdHRwSGFuZGxlciBzdHJ1Y3R7fQorCitmdW5jIChzbG93SHR0cEhhbmRsZXIpIFNlcnZlSFRUUCh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCkgeworCXRpbWUuU2xlZXAoMSAqIHRpbWUuU2Vjb25kKQorfQorCitmdW5jIFRlc3RIdHRwQ29udGV4dFRpbWVvdXQodCAqdGVzdGluZy5UKSB7CisJY2VydFBhdGggPSAiLi4vLi4vLi4va2V5cyIKKworCXVuaXQgOj0gdGVzdF91bml0eyIxMjcuMC4wLjEiLCA5MDk2LCAiIiwgImh0dHAiLCAiYmluYXJ5IiwgZmFsc2V9CisKKwlzZXJ2ZXIgOj0gJmh0dHAuU2VydmVye0FkZHI6IHVuaXQuaG9zdCArIGZtdC5TcHJpbnRmKCI6JWQiLCB1bml0LnBvcnQpLCBIYW5kbGVyOiBzbG93SHR0cEhhbmRsZXJ7fX0KKwlnbyBzZXJ2ZXIuTGlzdGVuQW5kU2VydmUoKQorCisJY2xpZW50LCB0cmFucywgZXJyIDo9IFN0YXJ0Q2xpZW50KHVuaXQuaG9zdCwgdW5pdC5wb3J0LCB1bml0LmRvbWFpbl9zb2NrZXQsIHVuaXQudHJhbnNwb3J0LCB1bml0LnByb3RvY29sLCB1bml0LnNzbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuYWJsZSB0byBzdGFydCBjbGllbnQ6ICV2IiwgZXJyKQorCQlyZXR1cm4KKwl9CisJZGVmZXIgdHJhbnMuQ2xvc2UoKQorCisJdW53cmFwRXJyIDo9IGZ1bmMoZXJyIGVycm9yKSBlcnJvciB7CisJCWZvciB7CisJCQlzd2l0Y2ggZXJyLih0eXBlKSB7CisJCQljYXNlIHRocmlmdC5UVHJhbnNwb3J0RXhjZXB0aW9uOgorCQkJCWVyciA9IGVyci4odGhyaWZ0LlRUcmFuc3BvcnRFeGNlcHRpb24pLkVycigpCisJCQljYXNlICp1cmwuRXJyb3I6CisJCQkJZXJyID0gZXJyLigqdXJsLkVycm9yKS5FcnIKKwkJCWNhc2UgKm5ldC5PcEVycm9yOgorCQkJCWVyciA9IGVyci4oKm5ldC5PcEVycm9yKS5FcnIKKwkJCWNhc2UgKm9zLlN5c2NhbGxFcnJvcjoKKwkJCQllcnIgPSBlcnIuKCpvcy5TeXNjYWxsRXJyb3IpLkVycgorCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCX0KKwl9CisKKwlzZXJ2ZXJTdGFydHVwRGVhZGxpbmUgOj0gdGltZS5Ob3coKS5BZGQoNSAqIHRpbWUuU2Vjb25kKQorCWZvciB7CisJCWN0eCwgXyA6PSBjb250ZXh0LldpdGhUaW1lb3V0KGNvbnRleHQuQmFja2dyb3VuZCgpLCA1MCp0aW1lLk1pbGxpc2Vjb25kKQorCQllcnIgPSBjbGllbnQuVGVzdFZvaWQoY3R4KQorCQllcnIgPSB1bndyYXBFcnIoZXJyKQorCQlpZiBlcnIgIT0gc3lzY2FsbC5FQ09OTlJFRlVTRUQgfHwgdGltZS5Ob3coKS5BZnRlcihzZXJ2ZXJTdGFydHVwRGVhZGxpbmUpIHsKKwkJCWJyZWFrCisJCX0KKwkJdGltZS5TbGVlcCh0aW1lLk1pbGxpc2Vjb25kKQorCX0KKworCWlmIGVyciA9PSBuaWwgeworCQl0LkVycm9yZigiUmVxdWVzdCBjb21wbGV0ZWQgKHNob3VsZCBoYXZlIHRpbWVkIG91dCkiKQorCQlyZXR1cm4KKwl9CisKKwkvLyBXZSd2ZSBnb3QgdG8gc3dpdGNoIG9uIGBlcnIuRXJyb3IoKWAgaGVyZSBzaW5jZSBnbzEuNyBkb2Vzbid0IHByb3Blcmx5IHJldHVybgorCS8vIGBjb250ZXh0LkRlYWRsaW5lRXhjZWVkZWRgIGVycm9yIGFuZCBgaHR0cC5lcnJSZXF1ZXN0Q2FuY2VsZWRgIGlzIG5vdCBleHBvcnRlZC4KKwkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nby9pc3N1ZXMvMTc3MTEKKwlzd2l0Y2ggZXJyLkVycm9yKCkgeworCWNhc2UgY29udGV4dC5EZWFkbGluZUV4Y2VlZGVkLkVycm9yKCksICJuZXQvaHR0cDogcmVxdWVzdCBjYW5jZWxlZCI6CisJCS8vIEV4cGVjdGVkIGVycm9yCisJZGVmYXVsdDoKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3I6ICVzIiwgZXJyKQorCX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9wcmludGluZ19oYW5kbGVyLmdvIGIvdGVzdC9nby9zcmMvY29tbW9uL3ByaW50aW5nX2hhbmRsZXIuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyMmQwYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9wcmludGluZ19oYW5kbGVyLmdvCkBAIC0wLDAgKzEsMzg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tbW9uCisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImVuY29kaW5nL2hleCIKKwkiZXJyb3JzIgorCSJmbXQiCisJLiAiZ2VuL3RocmlmdHRlc3QiCisJInRpbWUiCispCisKK3ZhciBQcmludGluZ0hhbmRsZXIgPSAmcHJpbnRpbmdIYW5kbGVye30KKwordHlwZSBwcmludGluZ0hhbmRsZXIgc3RydWN0e30KKworLy8gUHJpbnRzICJ0ZXN0Vm9pZCgpIiBhbmQgcmV0dXJucyBub3RoaW5nLgorZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0Vm9pZChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJZm10LlByaW50bG4oInRlc3RWb2lkKCkiKQorCXJldHVybiBuaWwKK30KKworLy8gUHJpbnRzICd0ZXN0U3RyaW5nKCIlcyIpJyB3aXRoIHRoaW5nIGFzICclcycKKy8vIEBwYXJhbSBzdHJpbmcgdGhpbmcgLSB0aGUgc3RyaW5nIHRvIHByaW50CisvLyBAcmV0dXJuIHN0cmluZyAtIHJldHVybnMgdGhlIHN0cmluZyAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RTdHJpbmcoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgc3RyaW5nKSAociBzdHJpbmcsIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RTdHJpbmcoXCIlc1wiKVxuIiwgdGhpbmcpCisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworLy8gUHJpbnRzICd0ZXN0Qm9vbCgiJXQiKScgd2l0aCB0aGluZyBhcyAndHJ1ZScgb3IgJ2ZhbHNlJworLy8gQHBhcmFtIGJvb2wgdGhpbmcgLSB0aGUgYm9vbCB0byBwcmludAorLy8gQHJldHVybiBib29sIC0gcmV0dXJucyB0aGUgYm9vbCAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RCb29sKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGJvb2wpIChyIGJvb2wsIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RCb29sKCV0KVxuIiwgdGhpbmcpCisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworLy8gUHJpbnRzICd0ZXN0Qnl0ZSgiJWQiKScgd2l0aCB0aGluZyBhcyAnJWQnCisvLyBAcGFyYW0gYnl0ZSB0aGluZyAtIHRoZSBieXRlIHRvIHByaW50CisvLyBAcmV0dXJuIGJ5dGUgLSByZXR1cm5zIHRoZSBieXRlICd0aGluZycKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gVGhpbmcKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEJ5dGUoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgaW50OCkgKHIgaW50OCwgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdEJ5dGUoJWQpXG4iLCB0aGluZykKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCisvLyBQcmludHMgJ3Rlc3RJMzIoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJworLy8gQHBhcmFtIGkzMiB0aGluZyAtIHRoZSBpMzIgdG8gcHJpbnQKKy8vIEByZXR1cm4gaTMyIC0gcmV0dXJucyB0aGUgaTMyICd0aGluZycKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gVGhpbmcKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEkzMihjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBpbnQzMikgKHIgaW50MzIsIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RJMzIoJWQpXG4iLCB0aGluZykKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCisvLyBQcmludHMgJ3Rlc3RJNjQoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJworLy8gQHBhcmFtIGk2NCB0aGluZyAtIHRoZSBpNjQgdG8gcHJpbnQKKy8vIEByZXR1cm4gaTY0IC0gcmV0dXJucyB0aGUgaTY0ICd0aGluZycKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gVGhpbmcKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEk2NChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBpbnQ2NCkgKHIgaW50NjQsIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RJNjQoJWQpXG4iLCB0aGluZykKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCisvLyBQcmludHMgJ3Rlc3REb3VibGUoIiVmIiknIHdpdGggdGhpbmcgYXMgJyVmJworLy8gQHBhcmFtIGRvdWJsZSB0aGluZyAtIHRoZSBkb3VibGUgdG8gcHJpbnQKKy8vIEByZXR1cm4gZG91YmxlIC0gcmV0dXJucyB0aGUgZG91YmxlICd0aGluZycKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gVGhpbmcKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdERvdWJsZShjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBmbG9hdDY0KSAociBmbG9hdDY0LCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0RG91YmxlKCVmKVxuIiwgdGhpbmcpCisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworLy8gUHJpbnRzICd0ZXN0QmluYXJ5KCIlcyIpJyB3aGVyZSAnJXMnIGlzIGEgaGV4LWZvcm1hdHRlZCBzdHJpbmcgb2YgdGhpbmcncyBkYXRhCisvLyBAcGFyYW0gW11ieXRlIHRoaW5nIC0gdGhlIGJpbmFyeSB0byBwcmludAorLy8gQHJldHVybiBbXWJ5dGUgLSByZXR1cm5zIHRoZSBiaW5hcnkgJ3RoaW5nJworLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBUaGluZworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0QmluYXJ5KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIFtdYnl0ZSkgKHIgW11ieXRlLCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0QmluYXJ5KCVzKVxuIiwgaGV4LkVuY29kZVRvU3RyaW5nKHRoaW5nKSkKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCisvLyBQcmludHMgJ3Rlc3RTdHJ1Y3QoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgY29tbWEgc2VwYXJhdGVkIHZhbHVlcworLy8gQHBhcmFtIFh0cnVjdCB0aGluZyAtIHRoZSBYdHJ1Y3QgdG8gcHJpbnQKKy8vIEByZXR1cm4gWHRydWN0IC0gcmV0dXJucyB0aGUgWHRydWN0ICd0aGluZycKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gVGhpbmcKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFN0cnVjdChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyAqWHRydWN0KSAociAqWHRydWN0LCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0U3RydWN0KHtcIiVzXCIsICVkLCAlZCwgJWR9KVxuIiwgdGhpbmcuU3RyaW5nVGhpbmcsIHRoaW5nLkJ5dGVUaGluZywgdGhpbmcuSTMyVGhpbmcsIHRoaW5nLkk2NFRoaW5nKQorCXJldHVybiB0aGluZywgZXJyCit9CisKKy8vIFByaW50cyAndGVzdE5lc3QoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgdGhlIG5lc3RlZCBzdHJ1Y3QKKy8vIEBwYXJhbSBYdHJ1Y3QyIHRoaW5nIC0gdGhlIFh0cnVjdDIgdG8gcHJpbnQKKy8vIEByZXR1cm4gWHRydWN0MiAtIHJldHVybnMgdGhlIFh0cnVjdDIgJ3RoaW5nJworLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBUaGluZworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TmVzdChjdHggY29udGV4dC5Db250ZXh0LCBuZXN0ICpYdHJ1Y3QyKSAociAqWHRydWN0MiwgZXJyIGVycm9yKSB7CisJdGhpbmcgOj0gbmVzdC5TdHJ1Y3RUaGluZworCWZtdC5QcmludGYoInRlc3ROZXN0KHslZCwge1wiJXNcIiwgJWQsICVkLCAlZH0sICVkfSlcbiIsIG5lc3QuQnl0ZVRoaW5nLCB0aGluZy5TdHJpbmdUaGluZywgdGhpbmcuQnl0ZVRoaW5nLCB0aGluZy5JMzJUaGluZywgdGhpbmcuSTY0VGhpbmcsIG5lc3QuSTMyVGhpbmcpCisJcmV0dXJuIG5lc3QsIG5pbAorfQorCisvLyBQcmludHMgJ3Rlc3RNYXAoInslcyIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBhIHN0cmluZyBvZiAgJ2tleSA9PiB2YWx1ZScgcGFpcnMKKy8vICBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKKy8vIEBwYXJhbSBtYXA8aTMyLGkzMj4gdGhpbmcgLSB0aGUgbWFwPGkzMixpMzI+IHRvIHByaW50CisvLyBAcmV0dXJuIG1hcDxpMzIsaTMyPiAtIHJldHVybnMgdGhlIG1hcDxpMzIsaTMyPiAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RNYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgbWFwW2ludDMyXWludDMyKSAociBtYXBbaW50MzJdaW50MzIsIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RNYXAoeyIpCisJZmlyc3QgOj0gdHJ1ZQorCWZvciBrLCB2IDo9IHJhbmdlIHRoaW5nIHsKKwkJaWYgZmlyc3QgeworCQkJZmlyc3QgPSBmYWxzZQorCQl9IGVsc2UgeworCQkJZm10LlByaW50ZigiLCAiKQorCQl9CisJCWZtdC5QcmludGYoIiVkID0+ICVkIiwgaywgdikKKwl9CisJZm10LlByaW50ZigifSlcbiIpCisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworLy8gUHJpbnRzICd0ZXN0U3RyaW5nTWFwKCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nIG9mICAna2V5ID0+IHZhbHVlJyBwYWlycworLy8gIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kIG5ldyBsaW5lcworLy8gQHBhcmFtIG1hcDxzdHJpbmcsc3RyaW5nPiB0aGluZyAtIHRoZSBtYXA8c3RyaW5nLHN0cmluZz4gdG8gcHJpbnQKKy8vIEByZXR1cm4gbWFwPHN0cmluZyxzdHJpbmc+IC0gcmV0dXJucyB0aGUgbWFwPHN0cmluZyxzdHJpbmc+ICd0aGluZycKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gVGhpbmcKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFN0cmluZ01hcChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBtYXBbc3RyaW5nXXN0cmluZykgKHIgbWFwW3N0cmluZ11zdHJpbmcsIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RTdHJpbmdNYXAoeyIpCisJZmlyc3QgOj0gdHJ1ZQorCWZvciBrLCB2IDo9IHJhbmdlIHRoaW5nIHsKKwkJaWYgZmlyc3QgeworCQkJZmlyc3QgPSBmYWxzZQorCQl9IGVsc2UgeworCQkJZm10LlByaW50ZigiLCAiKQorCQl9CisJCWZtdC5QcmludGYoIiVzID0+ICVzIiwgaywgdikKKwl9CisJZm10LlByaW50ZigifSlcbiIpCisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworLy8gUHJpbnRzICd0ZXN0U2V0KCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nIG9mICB2YWx1ZXMKKy8vICBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKKy8vIEBwYXJhbSBzZXQ8aTMyPiB0aGluZyAtIHRoZSBzZXQ8aTMyPiB0byBwcmludAorLy8gQHJldHVybiBzZXQ8aTMyPiAtIHJldHVybnMgdGhlIHNldDxpMzI+ICd0aGluZycKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gVGhpbmcKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFNldChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBbXWludDMyKSAociBbXWludDMyLCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0U2V0KHsiKQorCWZpcnN0IDo9IHRydWUKKwlmb3IgaywgXyA6PSByYW5nZSB0aGluZyB7CisJCWlmIGZpcnN0IHsKKwkJCWZpcnN0ID0gZmFsc2UKKwkJfSBlbHNlIHsKKwkJCWZtdC5QcmludGYoIiwgIikKKwkJfQorCQlmbXQuUHJpbnRmKCIlZCIsIGspCisJfQorCWZtdC5QcmludGYoIn0pXG4iKQorCXJldHVybiB0aGluZywgbmlsCit9CisKKy8vIFByaW50cyAndGVzdExpc3QoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgIHZhbHVlcworLy8gIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kIG5ldyBsaW5lcworLy8gQHBhcmFtIGxpc3Q8aTMyPiB0aGluZyAtIHRoZSBsaXN0PGkzMj4gdG8gcHJpbnQKKy8vIEByZXR1cm4gbGlzdDxpMzI+IC0gcmV0dXJucyB0aGUgbGlzdDxpMzI+ICd0aGluZycKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gVGhpbmcKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdExpc3QoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgW11pbnQzMikgKHIgW11pbnQzMiwgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdExpc3QoeyIpCisJZm9yIGksIHYgOj0gcmFuZ2UgdGhpbmcgeworCQlpZiBpICE9IDAgeworCQkJZm10LlByaW50ZigiLCAiKQorCQl9CisJCWZtdC5QcmludGYoIiVkIiwgdikKKwl9CisJZm10LlByaW50ZigifSlcbiIpCisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworLy8gUHJpbnRzICd0ZXN0RW51bSgiJWQiKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gaXQncyBudW1lcmljIHZhbHVlCisvLyBAcGFyYW0gTnVtYmVyeiB0aGluZyAtIHRoZSBOdW1iZXJ6IHRvIHByaW50CisvLyBAcmV0dXJuIE51bWJlcnogLSByZXR1cm5zIHRoZSBOdW1iZXJ6ICd0aGluZycKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gVGhpbmcKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEVudW0oY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgTnVtYmVyeikgKHIgTnVtYmVyeiwgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdEVudW0oJWQpXG4iLCB0aGluZykKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCisvLyBQcmludHMgJ3Rlc3RUeXBlZGVmKCIlZCIpJyB3aXRoIHRoaW5nIGFzICclZCcKKy8vIEBwYXJhbSBVc2VySWQgdGhpbmcgLSB0aGUgVXNlcklkIHRvIHByaW50CisvLyBAcmV0dXJuIFVzZXJJZCAtIHJldHVybnMgdGhlIFVzZXJJZCAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RUeXBlZGVmKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIFVzZXJJZCkgKHIgVXNlcklkLCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0VHlwZWRlZiglZClcbiIsIHRoaW5nKQorCXJldHVybiB0aGluZywgbmlsCit9CisKKy8vIFByaW50cyAndGVzdE1hcE1hcCgiJWQiKScgd2l0aCBoZWxsbyBhcyAnJWQnCisvLyBAcGFyYW0gaTMyIGhlbGxvIC0gdGhlIGkzMiB0byBwcmludAorLy8gQHJldHVybiBtYXA8aTMyLG1hcDxpMzIsaTMyPj4gLSByZXR1cm5zIGEgZGljdGlvbmFyeSB3aXRoIHRoZXNlIHZhbHVlczoKKy8vICAgey00ID0+IHstNCA9PiAtNCwgLTMgPT4gLTMsIC0yID0+IC0yLCAtMSA9PiAtMSwgfSwgNCA9PiB7MSA9PiAxLCAyID0+IDIsIDMgPT4gMywgNCA9PiA0LCB9LCB9CisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIEhlbGxvCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RNYXBNYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgaGVsbG8gaW50MzIpIChyIG1hcFtpbnQzMl1tYXBbaW50MzJdaW50MzIsIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RNYXBNYXAoJWQpXG4iLCBoZWxsbykKKworCXIgPSBtYXBbaW50MzJdbWFwW2ludDMyXWludDMyeworCQktNDogbWFwW2ludDMyXWludDMyey00OiAtNCwgLTM6IC0zLCAtMjogLTIsIC0xOiAtMX0sCisJCTQ6ICBtYXBbaW50MzJdaW50MzJ7NDogNCwgMzogMywgMjogMiwgMTogMX0sCisJfQorCXJldHVybgorfQorCisvLyBTbyB5b3UgdGhpbmsgeW91J3ZlIGdvdCB0aGlzIGFsbCB3b3JrZWQsIG91dCBlaD8KKy8vCisvLyBDcmVhdGVzIGEgdGhlIHJldHVybmVkIG1hcCB3aXRoIHRoZXNlIHZhbHVlcyBhbmQgcHJpbnRzIGl0IG91dDoKKy8vICAgeyAxID0+IHsgMiA9PiBhcmd1bWVudCwKKy8vICAgICAgICAgICAgMyA9PiBhcmd1bWVudCwKKy8vICAgICAgICAgIH0sCisvLyAgICAgMiA9PiB7IDYgPT4gPGVtcHR5IEluc2FuaXR5IHN0cnVjdD4sIH0sCisvLyAgIH0KKy8vIEByZXR1cm4gbWFwPFVzZXJJZCwgbWFwPE51bWJlcnosSW5zYW5pdHk+PiAtIGEgbWFwIHdpdGggdGhlIGFib3ZlIHZhbHVlcworLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBBcmd1bWVudAorZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0SW5zYW5pdHkoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJndW1lbnQgKkluc2FuaXR5KSAociBtYXBbVXNlcklkXW1hcFtOdW1iZXJ6XSpJbnNhbml0eSwgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdEluc2FuaXR5KClcbiIpCisJciA9IG1ha2UobWFwW1VzZXJJZF1tYXBbTnVtYmVyel0qSW5zYW5pdHkpCisJclsxXSA9IG1hcFtOdW1iZXJ6XSpJbnNhbml0eXsKKwkJMjogYXJndW1lbnQsCisJCTM6IGFyZ3VtZW50LAorCX0KKwlyWzJdID0gbWFwW051bWJlcnpdKkluc2FuaXR5eworCQk2OiBOZXdJbnNhbml0eSgpLAorCX0KKwlyZXR1cm4KK30KKworLy8gUHJpbnRzICd0ZXN0TXVsdGkoKScKKy8vIEBwYXJhbSBieXRlIGFyZzAgLQorLy8gQHBhcmFtIGkzMiBhcmcxIC0KKy8vIEBwYXJhbSBpNjQgYXJnMiAtCisvLyBAcGFyYW0gbWFwPGkxNiwgc3RyaW5nPiBhcmczIC0KKy8vIEBwYXJhbSBOdW1iZXJ6IGFyZzQgLQorLy8gQHBhcmFtIFVzZXJJZCBhcmc1IC0KKy8vIEByZXR1cm4gWHRydWN0IC0gcmV0dXJucyBhbiBYdHJ1Y3Qgd2l0aCBTdHJpbmdUaGluZyA9ICJIZWxsbzIsIEJ5dGVUaGluZyA9IGFyZzAsIEkzMlRoaW5nID0gYXJnMQorLy8gICAgYW5kIEk2NFRoaW5nID0gYXJnMgorLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBBcmcwCisvLyAgLSBBcmcxCisvLyAgLSBBcmcyCisvLyAgLSBBcmczCisvLyAgLSBBcmc0CisvLyAgLSBBcmc1CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RNdWx0aShjdHggY29udGV4dC5Db250ZXh0LCBhcmcwIGludDgsIGFyZzEgaW50MzIsIGFyZzIgaW50NjQsIGFyZzMgbWFwW2ludDE2XXN0cmluZywgYXJnNCBOdW1iZXJ6LCBhcmc1IFVzZXJJZCkgKHIgKlh0cnVjdCwgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdE11bHRpKClcbiIpCisJciA9IE5ld1h0cnVjdCgpCisKKwlyLlN0cmluZ1RoaW5nID0gIkhlbGxvMiIKKwlyLkJ5dGVUaGluZyA9IGFyZzAKKwlyLkkzMlRoaW5nID0gYXJnMQorCXIuSTY0VGhpbmcgPSBhcmcyCisJcmV0dXJuCit9CisKKy8vIFByaW50ICd0ZXN0RXhjZXB0aW9uKCVzKScgd2l0aCBhcmcgYXMgJyVzJworLy8gQHBhcmFtIHN0cmluZyBhcmcgLSBhIHN0cmluZyBpbmRpY2F0aW9uIHdoYXQgdHlwZSBvZiBleGNlcHRpb24gdG8gdGhyb3cKKy8vIGlmIGFyZyA9PSAiWGNlcHRpb24iIHRocm93IFhjZXB0aW9uIHdpdGggZXJyb3JDb2RlID0gMTAwMSBhbmQgbWVzc2FnZSA9IGFyZworLy8gZWxzZW4gaWYgYXJnID09ICJURXhjZXB0aW9uIiB0aHJvdyBURXhjZXB0aW9uCisvLyBlbHNlIGRvIG5vdCB0aHJvdyBhbnl0aGluZworLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBBcmcKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEV4Y2VwdGlvbihjdHggY29udGV4dC5Db250ZXh0LCBhcmcgc3RyaW5nKSAoZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdEV4Y2VwdGlvbiglcylcbiIsIGFyZykKKwlzd2l0Y2ggYXJnIHsKKwljYXNlICJYY2VwdGlvbiI6CisJCWUgOj0gTmV3WGNlcHRpb24oKQorCQllLkVycm9yQ29kZSA9IDEwMDEKKwkJZS5NZXNzYWdlID0gYXJnCisJCXJldHVybiBlCisJY2FzZSAiVEV4Y2VwdGlvbiI6CisJCXJldHVybiBlcnJvcnMuTmV3KCJKdXN0IFRFeGNlcHRpb24iKQorCX0KKwlyZXR1cm4KK30KKworLy8gUHJpbnQgJ3Rlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpJyB3aXRoIGFyZzAgYXMgJyVzJyBhbmQgYXJnMSBhcyAnJXMnCisvLyBAcGFyYW0gc3RyaW5nIGFyZyAtIGEgc3RyaW5nIGluZGljYXRpb24gd2hhdCB0eXBlIG9mIGV4Y2VwdGlvbiB0byB0aHJvdworLy8gaWYgYXJnMCA9PSAiWGNlcHRpb24iIHRocm93IFhjZXB0aW9uIHdpdGggZXJyb3JDb2RlID0gMTAwMSBhbmQgbWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIgorLy8gZWxzZW4gaWYgYXJnMCA9PSAiWGNlcHRpb24yIiB0aHJvdyBYY2VwdGlvbjIgd2l0aCBlcnJvckNvZGUgPSAyMDAyIGFuZCBtZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIgorLy8gZWxzZSBkbyBub3QgdGhyb3cgYW55dGhpbmcKKy8vIEByZXR1cm4gWHRydWN0IC0gYW4gWHRydWN0IHdpdGggU3RyaW5nVGhpbmcgPSBhcmcxCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIEFyZzAKKy8vICAtIEFyZzEKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE11bHRpRXhjZXB0aW9uKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZzAgc3RyaW5nLCBhcmcxIHN0cmluZykgKHIgKlh0cnVjdCwgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcylcbiIsIGFyZzAsIGFyZzEpCisJc3dpdGNoIGFyZzAgeworCisJY2FzZSAiWGNlcHRpb24iOgorCQllIDo9IE5ld1hjZXB0aW9uKCkKKwkJZS5FcnJvckNvZGUgPSAxMDAxCisJCWUuTWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIgorCQlyZXR1cm4gbmlsLCBlCisJY2FzZSAiWGNlcHRpb24yIjoKKwkJZSA6PSBOZXdYY2VwdGlvbjIoKQorCQllLkVycm9yQ29kZSA9IDIwMDIKKwkJZS5TdHJ1Y3RUaGluZyA9IE5ld1h0cnVjdCgpCisJCWUuU3RydWN0VGhpbmcuU3RyaW5nVGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiCisJCXJldHVybiBuaWwsIGUKKwlkZWZhdWx0OgorCQlyID0gTmV3WHRydWN0KCkKKwkJci5TdHJpbmdUaGluZyA9IGFyZzEKKwkJcmV0dXJuCisJfQorfQorCisvLyBQcmludCAndGVzdE9uZXdheSglZCk6IFNsZWVwaW5nLi4uJyB3aXRoIHNlY29uZHNUb1NsZWVwIGFzICclZCcKKy8vIHNsZWVwICdzZWNvbmRzVG9TbGVlcCcKKy8vIFByaW50ICd0ZXN0T25ld2F5KCVkKTogZG9uZSBzbGVlcGluZyEnIHdpdGggc2Vjb25kc1RvU2xlZXAgYXMgJyVkJworLy8gQHBhcmFtIGkzMiBzZWNvbmRzVG9TbGVlcCAtIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byBzbGVlcAorLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBTZWNvbmRzVG9TbGVlcAorZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0T25ld2F5KGN0eCBjb250ZXh0LkNvbnRleHQsIHNlY29uZHNUb1NsZWVwIGludDMyKSAoZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdE9uZXdheSglZCk6IFNsZWVwaW5nLi4uXG4iLCBzZWNvbmRzVG9TbGVlcCkKKwl0aW1lLlNsZWVwKHRpbWUuU2Vjb25kICogdGltZS5EdXJhdGlvbihzZWNvbmRzVG9TbGVlcCkpCisJZm10LlByaW50ZigidGVzdE9uZXdheSglZCk6IGRvbmUgc2xlZXBpbmchXG4iLCBzZWNvbmRzVG9TbGVlcCkKKwlyZXR1cm4KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9zZXJ2ZXIuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vc2VydmVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYzQ0MDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dvL3NyYy9jb21tb24vc2VydmVyLmdvCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tbW9uCisKK2ltcG9ydCAoCisJImNvbXByZXNzL3psaWIiCisJImNyeXB0by90bHMiCisJImZsYWciCisJImZtdCIKKwkiZ2VuL3RocmlmdHRlc3QiCisJInRocmlmdCIKKykKKwordmFyICgKKwlkZWJ1Z1NlcnZlclByb3RvY29sIGJvb2wKKwljZXJ0UGF0aCAgICAgICAgICAgIHN0cmluZworKQorCitmdW5jIGluaXQoKSB7CisJZmxhZy5Cb29sVmFyKCZkZWJ1Z1NlcnZlclByb3RvY29sLCAiZGVidWdfc2VydmVyX3Byb3RvY29sIiwgZmFsc2UsICJ0dXJuIHNlcnZlciBwcm90b2NvbCB0cmFjZSBvbiIpCit9CisKK2Z1bmMgR2V0U2VydmVyUGFyYW1zKAorCWhvc3Qgc3RyaW5nLAorCXBvcnQgaW50NjQsCisJZG9tYWluX3NvY2tldCBzdHJpbmcsCisJdHJhbnNwb3J0IHN0cmluZywKKwlwcm90b2NvbCBzdHJpbmcsCisJc3NsIGJvb2wsCisJY2VydFBhdGggc3RyaW5nLAorCWhhbmRsZXIgdGhyaWZ0dGVzdC5UaHJpZnRUZXN0KSAodGhyaWZ0LlRQcm9jZXNzb3IsIHRocmlmdC5UU2VydmVyVHJhbnNwb3J0LCB0aHJpZnQuVFRyYW5zcG9ydEZhY3RvcnksIHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5LCBlcnJvcikgeworCisJdmFyIGVyciBlcnJvcgorCWhvc3RQb3J0IDo9IGZtdC5TcHJpbnRmKCIlczolZCIsIGhvc3QsIHBvcnQpCisKKwl2YXIgcHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5CisJc3dpdGNoIHByb3RvY29sIHsKKwljYXNlICJjb21wYWN0IjoKKwkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkKKwljYXNlICJzaW1wbGVqc29uIjoKKwkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KCkKKwljYXNlICJqc29uIjoKKwkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCkKKwljYXNlICJiaW5hcnkiOgorCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKQorCWRlZmF1bHQ6CisJCXJldHVybiBuaWwsIG5pbCwgbmlsLCBuaWwsIGZtdC5FcnJvcmYoIkludmFsaWQgcHJvdG9jb2wgc3BlY2lmaWVkICVzIiwgcHJvdG9jb2wpCisJfQorCWlmIGRlYnVnU2VydmVyUHJvdG9jb2wgeworCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VERlYnVnUHJvdG9jb2xGYWN0b3J5KHByb3RvY29sRmFjdG9yeSwgInNlcnZlcjoiKQorCX0KKworCXZhciBzZXJ2ZXJUcmFuc3BvcnQgdGhyaWZ0LlRTZXJ2ZXJUcmFuc3BvcnQKKwlpZiBzc2wgeworCQljZmcgOj0gbmV3KHRscy5Db25maWcpCisJCWlmIGNlcnQsIGVyciA6PSB0bHMuTG9hZFg1MDlLZXlQYWlyKGNlcnRQYXRoKyIvc2VydmVyLmNydCIsIGNlcnRQYXRoKyIvc2VydmVyLmtleSIpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBuaWwsIG5pbCwgbmlsLCBuaWwsIGVycgorCQl9IGVsc2UgeworCQkJY2ZnLkNlcnRpZmljYXRlcyA9IGFwcGVuZChjZmcuQ2VydGlmaWNhdGVzLCBjZXJ0KQorCQl9CisJCXNlcnZlclRyYW5zcG9ydCwgZXJyID0gdGhyaWZ0Lk5ld1RTU0xTZXJ2ZXJTb2NrZXQoaG9zdFBvcnQsIGNmZykKKwl9IGVsc2UgeworCQlpZiBkb21haW5fc29ja2V0ICE9ICIiIHsKKwkJCXNlcnZlclRyYW5zcG9ydCwgZXJyID0gdGhyaWZ0Lk5ld1RTZXJ2ZXJTb2NrZXQoZG9tYWluX3NvY2tldCkKKwkJfSBlbHNlIHsKKwkJCXNlcnZlclRyYW5zcG9ydCwgZXJyID0gdGhyaWZ0Lk5ld1RTZXJ2ZXJTb2NrZXQoaG9zdFBvcnQpCisJCX0KKwl9CisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIG5pbCwgbmlsLCBuaWwsIGVycgorCX0KKworCXZhciB0cmFuc3BvcnRGYWN0b3J5IHRocmlmdC5UVHJhbnNwb3J0RmFjdG9yeQorCisJc3dpdGNoIHRyYW5zcG9ydCB7CisJY2FzZSAiaHR0cCI6CisJCS8vIHRoZXJlIGlzIG5vIHN1Y2ggZmFjdG9yeSwgYW5kIHdlIGRvbid0IG5lZWQgYW55CisJCXRyYW5zcG9ydEZhY3RvcnkgPSBuaWwKKwljYXNlICJmcmFtZWQiOgorCQl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkKKwkJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0cmFuc3BvcnRGYWN0b3J5KQorCWNhc2UgImJ1ZmZlcmVkIjoKKwkJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KDgxOTIpCisJY2FzZSAiemxpYiI6CisJCXRyYW5zcG9ydEZhY3RvcnkgPSB0aHJpZnQuTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5KHpsaWIuQmVzdENvbXByZXNzaW9uKQorCWNhc2UgIiI6CisJCXRyYW5zcG9ydEZhY3RvcnkgPSB0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKQorCWRlZmF1bHQ6CisJCXJldHVybiBuaWwsIG5pbCwgbmlsLCBuaWwsIGZtdC5FcnJvcmYoIkludmFsaWQgdHJhbnNwb3J0IHNwZWNpZmllZCAlcyIsIHRyYW5zcG9ydCkKKwl9CisJcHJvY2Vzc29yIDo9IHRocmlmdHRlc3QuTmV3VGhyaWZ0VGVzdFByb2Nlc3NvcihoYW5kbGVyKQorCisJcmV0dXJuIHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksIG5pbAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9nby9zcmMvY29tbW9uL3NpbXBsZV9oYW5kbGVyLmdvIGIvdGVzdC9nby9zcmMvY29tbW9uL3NpbXBsZV9oYW5kbGVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOTQ2M2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dvL3NyYy9jb21tb24vc2ltcGxlX2hhbmRsZXIuZ28KQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb21tb24KKworaW1wb3J0ICgKKwkiZXJyb3JzIgorCS4gImdlbi90aHJpZnR0ZXN0IgorCSJ0aW1lIgorKQorCit2YXIgU2ltcGxlSGFuZGxlciA9ICZzaW1wbGVIYW5kbGVye30KKwordHlwZSBzaW1wbGVIYW5kbGVyIHN0cnVjdHt9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RWb2lkKCkgKGVyciBlcnJvcikgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdFN0cmluZyh0aGluZyBzdHJpbmcpIChyIHN0cmluZywgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdEJvb2wodGhpbmcgW11ieXRlKSAociBbXWJ5dGUsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RCeXRlKHRoaW5nIGludDgpIChyIGludDgsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RJMzIodGhpbmcgaW50MzIpIChyIGludDMyLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0STY0KHRoaW5nIGludDY0KSAociBpbnQ2NCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdERvdWJsZSh0aGluZyBmbG9hdDY0KSAociBmbG9hdDY0LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0QmluYXJ5KHRoaW5nIFtdYnl0ZSkgKHIgW11ieXRlLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0U3RydWN0KHRoaW5nICpYdHJ1Y3QpIChyICpYdHJ1Y3QsIGVyciBlcnJvcikgeworCXJldHVybiByLCBlcnIKK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdE5lc3QobmVzdCAqWHRydWN0MikgKHIgKlh0cnVjdDIsIGVyciBlcnJvcikgeworCXJldHVybiBuZXN0LCBuaWwKK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdE1hcCh0aGluZyBtYXBbaW50MzJdaW50MzIpIChyIG1hcFtpbnQzMl1pbnQzMiwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdFN0cmluZ01hcCh0aGluZyBtYXBbc3RyaW5nXXN0cmluZykgKHIgbWFwW3N0cmluZ11zdHJpbmcsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RTZXQodGhpbmcgW11pbnQzMikgKHIgW11pbnQzMiwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdExpc3QodGhpbmcgW11pbnQzMikgKHIgW11pbnQzMiwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdEVudW0odGhpbmcgTnVtYmVyeikgKHIgTnVtYmVyeiwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdFR5cGVkZWYodGhpbmcgVXNlcklkKSAociBVc2VySWQsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RNYXBNYXAoaGVsbG8gaW50MzIpIChyIG1hcFtpbnQzMl1tYXBbaW50MzJdaW50MzIsIGVyciBlcnJvcikgeworCisJciA9IG1hcFtpbnQzMl1tYXBbaW50MzJdaW50MzJ7CisJCS00OiBtYXBbaW50MzJdaW50MzJ7LTQ6IC00LCAtMzogLTMsIC0yOiAtMiwgLTE6IC0xfSwKKwkJNDogIG1hcFtpbnQzMl1pbnQzMns0OiA0LCAzOiAzLCAyOiAyLCAxOiAxfSwKKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RJbnNhbml0eShhcmd1bWVudCAqSW5zYW5pdHkpIChyIG1hcFtVc2VySWRdbWFwW051bWJlcnpdKkluc2FuaXR5LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gbmlsLCBlcnJvcnMuTmV3KCJObyBJbnNhbml0eSIpCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RNdWx0aShhcmcwIGludDgsIGFyZzEgaW50MzIsIGFyZzIgaW50NjQsIGFyZzMgbWFwW2ludDE2XXN0cmluZywgYXJnNCBOdW1iZXJ6LCBhcmc1IFVzZXJJZCkgKHIgKlh0cnVjdCwgZXJyIGVycm9yKSB7CisJciA9IE5ld1h0cnVjdCgpCisKKwlyLlN0cmluZ1RoaW5nID0gIkhlbGxvMiIKKwlyLkJ5dGVUaGluZyA9IGFyZzAKKwlyLkkzMlRoaW5nID0gYXJnMQorCXIuSTY0VGhpbmcgPSBhcmcyCisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RFeGNlcHRpb24oYXJnIHN0cmluZykgKGVyciBlcnJvcikgeworCXN3aXRjaCBhcmcgeworCWNhc2UgIlhjZXB0aW9uIjoKKwkJZSA6PSBOZXdYY2VwdGlvbigpCisJCWUuRXJyb3JDb2RlID0gMTAwMQorCQllLk1lc3NhZ2UgPSBhcmcKKwkJcmV0dXJuIGUKKwljYXNlICJURXhjZXB0aW9uIjoKKwkJcmV0dXJuIGVycm9ycy5OZXcoIkp1c3QgVEV4Y2VwdGlvbiIpCisJfQorCXJldHVybgorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0TXVsdGlFeGNlcHRpb24oYXJnMCBzdHJpbmcsIGFyZzEgc3RyaW5nKSAociAqWHRydWN0LCBlcnIgZXJyb3IpIHsKKwlzd2l0Y2ggYXJnMCB7CisKKwljYXNlICJYY2VwdGlvbiI6CisJCWUgOj0gTmV3WGNlcHRpb24oKQorCQllLkVycm9yQ29kZSA9IDEwMDEKKwkJZS5NZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iCisJCXJldHVybiBuaWwsIGUKKwljYXNlICJYY2VwdGlvbjIiOgorCQllIDo9IE5ld1hjZXB0aW9uMigpCisJCWUuRXJyb3JDb2RlID0gMjAwMgorCQllLlN0cnVjdFRoaW5nLlN0cmluZ1RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIgorCQlyZXR1cm4gbmlsLCBlCisJZGVmYXVsdDoKKwkJciA9IE5ld1h0cnVjdCgpCisJCXIuU3RyaW5nVGhpbmcgPSBhcmcxCisJCXJldHVybgorCX0KK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcCBpbnQzMikgKGVyciBlcnJvcikgeworCXRpbWUuU2xlZXAodGltZS5TZWNvbmQgKiB0aW1lLkR1cmF0aW9uKHNlY29uZHNUb1NsZWVwKSkKKwlyZXR1cm4KK30KZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9NYWtlZmlsZS5hbSBiL3Rlc3QvaGF4ZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzA0ODNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTA0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworVEhSSUZUQ01EID0gJChUSFJJRlQpIC0tZ2VuIGhheGUgLXIKK1RIUklGVFRFU1QgPSAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKworQklOX0NQUCA9IGJpbi9NYWluLWRlYnVnCitCSU5fUEhQID0gYmluL3BocC9NYWluLWRlYnVnLnBocAorQklOX1BIUF9XRUIgPSBiaW4vcGhwLXdlYi1zZXJ2ZXIvTWFpbi1kZWJ1Zy5waHAKKworZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvVGhyaWZ0VGVzdC5oeDogJChUSFJJRlRURVNUKQorCSQoVEhSSUZUQ01EKSAkKFRIUklGVFRFU1QpCisKK2FsbC1sb2NhbDogJChCSU5fQ1BQKSAkKEJJTl9QSFApICQoQklOX1BIUF9XRUIpCisKKyQoQklOX0NQUCk6IFwKKwkJc3JjLyouaHggXAorCQkuLi8uLi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvKiovKi5oeCBcCisJCWdlbi1oYXhlL3RocmlmdC90ZXN0L1RocmlmdFRlc3QuaHgKKwkkKEhBWEUpIC0tY3dkIC4gIGNwcC5oeG1sCisKKyQoQklOX1BIUCk6IFwKKwkJc3JjLyouaHggXAorCQkuLi8uLi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvKiovKi5oeCBcCisJCWdlbi1oYXhlL3RocmlmdC90ZXN0L1RocmlmdFRlc3QuaHgKKwkkKEhBWEUpIC0tY3dkIC4gIHBocC5oeG1sCisKKyQoQklOX1BIUF9XRUIpOiBcCisJCXNyYy8qLmh4IFwKKwkJLi4vLi4vbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0LyoqLyouaHggXAorCQlnZW4taGF4ZS90aHJpZnQvdGVzdC9UaHJpZnRUZXN0Lmh4CisJJChIQVhFKSAtLWN3ZCAuICBwaHAtd2ViLXNlcnZlci5oeG1sCisKKworCisjVE9ETzogb3RoZXIgaGF4ZSB0YXJnZXRzCisjICAgICQoSEFYRSkgIC0tY3dkIC4gIGNzaGFycAorIyAgICAkKEhBWEUpICAtLWN3ZCAuICBmbGFzaAorIyAgICAkKEhBWEUpICAtLWN3ZCAuICBqYXZhCisjICAgICQoSEFYRSkgIC0tY3dkIC4gIGphdmFzY3JpcHQKKyMgICAgJChIQVhFKSAgLS1jd2QgLiAgbmVrbworIyAgICAkKEhBWEUpICAtLWN3ZCAuICBweXRob24gICMgbmVlZHMgSGF4ZSAzLjIuMAorCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1oYXhlIGJpbgorCisuTk9UUEFSQUxMRUw6CisKK2NoZWNrOiBjaGVja19jcHAgXAorCWNoZWNrX3BocCBcCisJY2hlY2tfcGhwX3dlYiAKKworY2hlY2tfY3BwOiAkKEJJTl9DUFApIAorCXRpbWVvdXQgMjAgJChCSU5fQ1BQKSBzZXJ2ZXIgJgorCXNsZWVwIDEKKwkkKEJJTl9DUFApIGNsaWVudAorCXNsZWVwIDEwCisKK2NoZWNrX3BocDogJChCSU5fUEhQKSAKKwl0aW1lb3V0IDIwIHBocCAtZiAkKEJJTl9QSFApIHNlcnZlciAmCisJc2xlZXAgMQorCXBocCAtZiAkKEJJTl9QSFApIGNsaWVudAorCXNsZWVwIDEwCisKK2NoZWNrX3BocF93ZWI6ICQoQklOX1BIUF9XRUIpICQoQklOX0NQUCkKKwl0aW1lb3V0IDIwIHBocCAtUyAxMjcuMC4wLjE6OTA5MCByb3V0ZXIucGhwICYKKwlzbGVlcCAxCisJJChCSU5fQ1BQKSBjbGllbnQgLS10cmFuc3BvcnQgaHR0cAorCXNsZWVwIDEwCisKKworRVhUUkFfRElTVCA9IFwKKwlzcmMgXAorCWNwcC5oeG1sIFwKKwljc2hhcnAuaHhtbCBcCisJZmxhc2guaHhtbCBcCisJamF2YS5oeG1sIFwKKwlqYXZhc2NyaXB0Lmh4bWwgXAorCW5la28uaHhtbCBcCisJcGhwLmh4bWwgXAorCXB5dGhvbi5oeG1sIFwKKwlyb3V0ZXIucGhwIFwKKwlwcm9qZWN0LmhpZGUgXAorCXBocC13ZWItc2VydmVyLmh4bWwgXAorCVRlc3RDbGllbnRTZXJ2ZXIuaHhwcm9qIFwKKwltYWtlX2FsbC5iYXQgXAorCW1ha2VfYWxsLnNoCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvVGVzdENsaWVudFNlcnZlci5oeHByb2ogYi90ZXN0L2hheGUvVGVzdENsaWVudFNlcnZlci5oeHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY5NmQ4MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9UZXN0Q2xpZW50U2VydmVyLmh4cHJvagpAQCAtMCwwICsxLDY3IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHByb2plY3QgdmVyc2lvbj0iMiI+CisgIDwhLS0gT3V0cHV0IFNXRiBvcHRpb25zIC0tPgorICA8b3V0cHV0PgorICAgIDxtb3ZpZSBvdXRwdXRUeXBlPSJBcHBsaWNhdGlvbiIgLz4KKyAgICA8bW92aWUgaW5wdXQ9IiIgLz4KKyAgICA8bW92aWUgcGF0aD0iYmluL1Rlc3RDbGllbnRTZXJ2ZXIiIC8+CisgICAgPG1vdmllIGZwcz0iMzAiIC8+CisgICAgPG1vdmllIHdpZHRoPSI4MDAiIC8+CisgICAgPG1vdmllIGhlaWdodD0iNjAwIiAvPgorICAgIDxtb3ZpZSB2ZXJzaW9uPSIxIiAvPgorICAgIDxtb3ZpZSBtaW5vclZlcnNpb249IjAiIC8+CisgICAgPG1vdmllIHBsYXRmb3JtPSJDKysiIC8+CisgICAgPG1vdmllIGJhY2tncm91bmQ9IiNGRkZGRkYiIC8+CisgIDwvb3V0cHV0PgorICA8IS0tIE90aGVyIGNsYXNzZXMgdG8gYmUgY29tcGlsZWQgaW50byB5b3VyIFNXRiAtLT4KKyAgPGNsYXNzcGF0aHM+CisgICAgPGNsYXNzIHBhdGg9InNyYyIgLz4KKyAgICA8Y2xhc3MgcGF0aD0iZ2VuLWhheGUiIC8+CisgICAgPGNsYXNzIHBhdGg9Ii4uLy4uL2xpYi9oYXhlL3NyYyIgLz4KKyAgPC9jbGFzc3BhdGhzPgorICA8IS0tIEJ1aWxkIG9wdGlvbnMgLS0+CisgIDxidWlsZD4KKyAgICA8b3B0aW9uIGRpcmVjdGl2ZXM9IiIgLz4KKyAgICA8b3B0aW9uIGZsYXNoU3RyaWN0PSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIG5vSW5saW5lT25EZWJ1Zz0iRmFsc2UiIC8+CisgICAgPG9wdGlvbiBtYWluQ2xhc3M9Ik1haW4iIC8+CisgICAgPG9wdGlvbiBlbmFibGVkZWJ1Zz0iRmFsc2UiIC8+CisgICAgPG9wdGlvbiBhZGRpdGlvbmFsPSIiIC8+CisgIDwvYnVpbGQ+CisgIDwhLS0gaGF4ZWxpYiBsaWJyYXJpZXMgLS0+CisgIDxoYXhlbGliPgorICAgIDwhLS0gZXhhbXBsZTogPGxpYnJhcnkgbmFtZT0iLi4uIiAvPiAtLT4KKyAgPC9oYXhlbGliPgorICA8IS0tIENsYXNzIGZpbGVzIHRvIGNvbXBpbGUgKG90aGVyIHJlZmVyZW5jZWQgY2xhc3NlcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgaW5jbHVkZWQpIC0tPgorICA8Y29tcGlsZVRhcmdldHM+CisgICAgPCEtLSBleGFtcGxlOiA8Y29tcGlsZSBwYXRoPSIuLi4iIC8+IC0tPgorICA8L2NvbXBpbGVUYXJnZXRzPgorICA8IS0tIFBhdGhzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgUHJvamVjdCBFeHBsb3JlciB0cmVlIC0tPgorICA8aGlkZGVuUGF0aHM+CisgICAgPGhpZGRlbiBwYXRoPSJvYmoiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJjcHAuaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9ImNzaGFycC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iZmxhc2guaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9ImphdmEuaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9ImphdmFzY3JpcHQuaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9Im1ha2VfYWxsLmJhdCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9Im1ha2VfYWxsLnNoIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iTWFrZWZpbGUuYW0iIC8+CisgICAgPGhpZGRlbiBwYXRoPSJuZWtvLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJwaHAuaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9InByb2plY3QuaGlkZSIgLz4KKyAgICA8aGlkZGVuIHBhdGg9InB5dGhvbi5oeG1sIiAvPgorICA8L2hpZGRlblBhdGhzPgorICA8IS0tIEV4ZWN1dGVkIGJlZm9yZSBidWlsZCAtLT4KKyAgPHByZUJ1aWxkQ29tbWFuZD50aHJpZnQgLXIgLWdlbiBoYXhlICAuLi9UaHJpZnRUZXN0LnRocmlmdDwvcHJlQnVpbGRDb21tYW5kPgorICA8IS0tIEV4ZWN1dGVkIGFmdGVyIGJ1aWxkIC0tPgorICA8cG9zdEJ1aWxkQ29tbWFuZCBhbHdheXNSdW49IkZhbHNlIiAvPgorICA8IS0tIE90aGVyIHByb2plY3Qgb3B0aW9ucyAtLT4KKyAgPG9wdGlvbnM+CisgICAgPG9wdGlvbiBzaG93SGlkZGVuUGF0aHM9IkZhbHNlIiAvPgorICAgIDxvcHRpb24gdGVzdE1vdmllPSJVbmtub3duIiAvPgorICAgIDxvcHRpb24gdGVzdE1vdmllQ29tbWFuZD0iIiAvPgorICA8L29wdGlvbnM+CisgIDwhLS0gUGx1Z2luIHN0b3JhZ2UgLS0+CisgIDxzdG9yYWdlIC8+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL2NwcC5oeG1sIGIvdGVzdC9oYXhlL2NwcC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZGI1MmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvY3BwLmh4bWwKQEAgLTAsMCArMSw0MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI0NQUCB0YXJnZXQKKy1jcHAgYmluCisKKyNUbyBwcm9kdWNlIDY0IGJpdCBiaW5hcmllcyB0aGUgZmlsZSBzaG91bGQgZGVmaW5lIHRoZSBIWENQUF9NNjQgY29tcGlsZSB2YXJpYWJsZToKKyMtRCBIWENQUF9NNjQKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9jc2hhcnAuaHhtbCBiL3Rlc3QvaGF4ZS9jc2hhcnAuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTVjMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL2NzaGFycC5oeG1sCkBAIC0wLDAgKzEsMzggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNDU0hBUlAgdGFyZ2V0CistY3MgYmluL1R1dG9yaWFsLmV4ZQorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL2ZsYXNoLmh4bWwgYi90ZXN0L2hheGUvZmxhc2guaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWYwNTY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL2ZsYXNoLmh4bWwKQEAgLTAsMCArMSw0MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI0ZsYXNoIHRhcmdldAorLXN3ZiBiaW4vVHV0b3JpYWwuc3dmCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjIHdlIG5lZWQgc29tZSBnb29kaWVzIGZyb20gc3lzLm5ldAorIyAtLW1hY3JvIGFsbG93UGFja2FnZSgic3lzIikKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL2phdmEuaHhtbCBiL3Rlc3QvaGF4ZS9qYXZhLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxNTU2NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9qYXZhLmh4bWwKQEAgLTAsMCArMSwzOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjIAorCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNKYXZhIHRhcmdldAorLWphdmEgYmluL1R1dG9yaWFsLmphcgorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL2phdmFzY3JpcHQuaHhtbCBiL3Rlc3QvaGF4ZS9qYXZhc2NyaXB0Lmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJiMzg3NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9qYXZhc2NyaXB0Lmh4bWwKQEAgLTAsMCArMSw0NCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI0phdmFTY3JpcHQgdGFyZ2V0CistanMgYmluL1R1dG9yaWFsLmpzCisKKyNZb3UgY2FuIHVzZSAtRCBzb3VyY2UtbWFwLWNvbnRlbnQgKHJlcXVpcmVzIEhheGUgMy4xKykgdG8gaGF2ZSB0aGUgLmh4IAorI2ZpbGVzIGRpcmVjdGx5IGVtYmVkZGVkIGludG8gdGhlIG1hcCBmaWxlLCB0aGlzIHdheSB5b3Ugb25seSBoYXZlIHRvIAorI3VwbG9hZCBpdCwgYW5kIGl0IHdpbGwgYmUgYWx3YXlzIGluIHN5bmMgd2l0aCB0aGUgY29tcGlsZWQgLmpzIGV2ZW4gaWYgCisjeW91IG1vZGlmeSB5b3VyIC5oeCBmaWxlcy4KKy1EIHNvdXJjZS1tYXAtY29udGVudAorCisjR2VuZXJhdGUgc291cmNlIG1hcCBhbmQgYWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL21ha2VfYWxsLmJhdCBiL3Rlc3QvaGF4ZS9tYWtlX2FsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFlYmE4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9tYWtlX2FsbC5iYXQKQEAgLTAsMCArMSw2OCBAQAorQGVjaG8gb2ZmCityZW0gLyoKK3JlbSAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCityZW0gICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK3JlbSAgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVtICAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorcmVtICAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKK3JlbSAgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCityZW0gICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CityZW0gICoKK3JlbSAgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorcmVtICAqCityZW0gICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorcmVtICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCityZW0gICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCityZW0gICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3JlbSAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCityZW0gICogdW5kZXIgdGhlIExpY2Vuc2UuCityZW0gICovCisKK3NldGxvY2FsCitpZiAiJUhPTUVEUklWRSUiPT0iIiBnb3RvIE1JU1NJTkdWQVJTCitpZiAiJUhPTUVQQVRIJSI9PSIiIGdvdG8gTUlTU0lOR1ZBUlMKK2lmICIlSEFYRVBBVEglIj09IiIgZ290byBOT1RJTlNUQUxMRUQKKworc2V0IHBhdGg9JUhBWEVQQVRIJTslSEFYRVBBVEglXC4uXG5la287JXBhdGglCisKK3JlbSAjIGludm9rZSBUaHJpZnQgY29tbnBpbGVyCit0aHJpZnQgLXIgLWdlbiBoYXhlICAgLi5cVGhyaWZ0VGVzdC50aHJpZnQKK2lmIGVycm9ybGV2ZWwgMSBnb3RvIFNUT1AKKworcmVtICMgaW52b2tlIEhheGUgY29tcGlsZXIgZm9yIGFsbCB0YXJnZXRzCitmb3IgJSVhIGluICgqLmh4bWwpIGRvICgKKwlyZW0gKiBmaWx0ZXIgUHl0aG9uLCBhcyBpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IEhheGUgMy4xLjMgKGJ1dCB3aWxsIGJlIGluIDMuMS40KQorCWlmIG5vdCAiJSVhIj09InB5dGhvbi5oeG1sIiAoCisJCWVjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJZWNobyBCdWlsZGluZyAlJWEgLi4uCisJCWVjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJaGF4ZSAgLS1jd2QgLiAgJSVhCisJKQorKQorCisKK2VjaG8uCitlY2hvIGRvbmUuCitwYXVzZQorZ290byBlb2YKKworOk5PVElOU1RBTExFRAorZWNobyBGQVRBTDogRWl0aGVyIEhheGUgaXMgbm90IGluc3RhbGxlZCwgb3IgdGhlIEhBWEVQQVRIIHZhcmlhYmxlIGlzIG5vdCBzZXQuCitwYXVzZQorZ290byBlb2YKKworOk1JU1NJTkdWQVJTCitlY2hvIEZBVEFMOiBVbmFibGUgdG8gbG9jYXRlIGhvbWUgZm9sZGVyLgorZWNoby4KK2VjaG8gQm90aCBIT01FRFJJVkUgYW5kIEhPTUVQQVRIIG5lZWQgdG8gYmUgc2V0IHRvIHBvaW50IHRvIHlvdXIgSG9tZSBmb2xkZXIuCitlY2hvIFRoZSBjdXJyZW50IHZhbHVlcyBhcmU6CitlY2hvIEhPTUVEUklWRT0lSE9NRURSSVZFJQorZWNobyBIT01FUEFUSD0lSE9NRVBBVEglCitwYXVzZQorZ290byBlb2YKKworOlNUT1AKK3BhdXNlCitnb3RvIGVvZgorCis6ZW9mCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvbWFrZV9hbGwuc2ggYi90ZXN0L2hheGUvbWFrZV9hbGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWIyYzljMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9tYWtlX2FsbC5zaApAQCAtMCwwICsxLDQxIEBACisjIS9iaW4vc2gKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIGludm9rZSBUaHJpZnQgY29tbnBpbGVyCisuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKworIyBvdXRwdXQgZm9sZGVyCitpZiBbICEgLWQgYmluIF07IHRoZW4KKyAgbWtkaXIgIGJpbgorZmkKKworIyBpbnZva2UgSGF4ZSBjb21waWxlcgorZm9yIHRhcmdldCBpbiAqLmh4bWw7IGRvIAorICBlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGVjaG8gQnVpbGRpbmcgJHt0YXJnZXR9IC4uLgorICBlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGlmIFsgISAtZCBiaW4vJHt0YXJnZXR9IF07IHRoZW4KKyAgICBta2RpciAgYmluLyR7dGFyZ2V0fQorICBmaQorICBoYXhlICAtLWN3ZCAuICAke3RhcmdldH0gCitkb25lCisKKworI2VvZgpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL25la28uaHhtbCBiL3Rlc3QvaGF4ZS9uZWtvLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE2MWY2OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9uZWtvLmh4bWwKQEAgLTAsMCArMSwzOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI25la28gdGFyZ2V0CistbmVrbyBiaW4vVHV0b3JpYWwubgorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL3BocC13ZWItc2VydmVyLmh4bWwgYi90ZXN0L2hheGUvcGhwLXdlYi1zZXJ2ZXIuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTVhODUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL3BocC13ZWItc2VydmVyLmh4bWwKQEAgLTAsMCArMSw0MyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI1BIUCB0YXJnZXQKKy1waHAgYmluL3BocC13ZWItc2VydmVyLworLS1waHAtZnJvbnQgTWFpbi1kZWJ1Zy5waHAKKworI2RlZmluZXMKKy1EIHBocHdlYnNlcnZlcgorCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9waHAuaHhtbCBiL3Rlc3QvaGF4ZS9waHAuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjUxODk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL3BocC5oeG1sCkBAIC0wLDAgKzEsNDAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNQSFAgdGFyZ2V0CistcGhwIGJpbi9waHAvCistLXBocC1mcm9udCBNYWluLWRlYnVnLnBocAorCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9wcm9qZWN0LmhpZGUgYi90ZXN0L2hheGUvcHJvamVjdC5oaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYzA5YmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvcHJvamVjdC5oaWRlCkBAIC0wLDAgKzEsNzYgQEAKK3sKKyAgICAgInR5cGUiIDogMAorICAgICwidGFyZ2V0IiA6IDQKKyAgICAsIm5hbWUiIDogIkFwYWNoZSBUaHJpZnQgY3Jvc3MtcGxhdGZvcm0gdGVzdCBjbGllbnQvc2VydmVyIgorICAgICwibWFpbiIgOiBudWxsCisgICAgLCJwcm9qZWN0UGFja2FnZSIgOiAiIgorICAgICwiY29tcGFueSIgOiAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikiCisgICAgLCJsaWNlbnNlIiA6ICJBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAiCisgICAgLCJ1cmwiIDogImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCIKKyAgICAsInRhcmdldERhdGEiIDogWworICAgICAgICAgeworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJmbGFzaC5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDEKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAiYmluL1R1dG9yaWFsLnN3ZiIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJqYXZhc2NyaXB0Lmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMQorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJiaW5cXGluZGV4Lmh0bWwiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAibmVrby5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAibmVrbyBiaW4vVHV0b3JpYWwubiIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJwaHAuaHhtbCIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJjcHAuaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAyCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogImJpbi9NYWluLWRlYnVnLmV4ZSAgY2xpZW50IC0tcHJvdG9jb2wganNvbiIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJqYXZhLmh4bWwiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiY3NoYXJwLmh4bWwiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAicHl0aG9uLmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMgorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJweXRob24gYmluL1R1dG9yaWFsLnB5IgorICAgICAgICB9CisgICAgXQorICAgICwiZmlsZXMiIDogWworICAgICAgICAgeworICAgICAgICAgICAgICJwYXRoIiA6ICJzcmNcXFRlc3RDbGllbnQuaHgiCisgICAgICAgICAgICAsInVzZVRhYnMiIDogdHJ1ZQorICAgICAgICAgICAgLCJpbmRlbnRTaXplIiA6IDQKKyAgICAgICAgICAgICwiZm9sZGVkUmVnaW9ucyIgOiBbCisKKyAgICAgICAgICAgIF0KKyAgICAgICAgICAgICwiYWN0aXZlTGluZSIgOiAxODgKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoIiA6ICJzcmNcXFRlc3RTZXJ2ZXIuaHgiCisgICAgICAgICAgICAsInVzZVRhYnMiIDogdHJ1ZQorICAgICAgICAgICAgLCJpbmRlbnRTaXplIiA6IDQKKyAgICAgICAgICAgICwiZm9sZGVkUmVnaW9ucyIgOiBbCisKKyAgICAgICAgICAgIF0KKyAgICAgICAgICAgICwiYWN0aXZlTGluZSIgOiA4OAorICAgICAgICB9CisgICAgXQorICAgICwiYWN0aXZlRmlsZSIgOiAic3JjXFxUZXN0Q2xpZW50Lmh4IgorICAgICwib3BlbkZMVGFyZ2V0IiA6IG51bGwKKyAgICAsIm9wZW5GTEJ1aWxkTW9kZSIgOiAiRGVidWciCisgICAgLCJydW5BY3Rpb25UeXBlIiA6IG51bGwKKyAgICAsInJ1bkFjdGlvblRleHQiIDogbnVsbAorICAgICwiYnVpbGRBY3Rpb25Db21tYW5kIiA6IG51bGwKKyAgICAsImhpZGRlbkl0ZW1zIiA6IFsKKworICAgIF0KKyAgICAsInNob3dIaWRkZW5JdGVtcyIgOiBmYWxzZQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9weXRob24uaHhtbCBiL3Rlc3QvaGF4ZS9weXRob24uaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmMxOWZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL3B5dGhvbi5oeG1sCkBAIC0wLDAgKzEsMzggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNQeXRob24gdGFyZ2V0CistcHl0aG9uIGJpbi9UdXRvcmlhbC5weQorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL3JvdXRlci5waHAgYi90ZXN0L2hheGUvcm91dGVyLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzQxMzVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL3JvdXRlci5waHAKQEAgLTAsMCArMSwzMSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0CisgKi8KKworCisKKy8vcm91dGVyIGZpbGUgdG8gcnVuIHRlc3Rpbmcgd2ViIHNlcnZlcgorCisvL3NldF90aW1lX2xpbWl0KDEpOworCityZXF1aXJlX29uY2UgIGRpcm5hbWUoX19GSUxFX18pIC4gJy9iaW4vcGhwLXdlYi1zZXJ2ZXIvTWFpbi1kZWJ1Zy5waHAnOworCisKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9zcmMvQXJndW1lbnRzLmh4IGIvdGVzdC9oYXhlL3NyYy9Bcmd1bWVudHMuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MxMDc0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9zcmMvQXJndW1lbnRzLmh4CkBAIC0wLDAgKzEsMzM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7CitpbXBvcnQgaGF4ZS5pby5QYXRoOworCit1c2luZyBTdHJpbmdUb29sczsKKworCitlbnVtIFByb3RvY29sVHlwZSB7CisgICAgYmluYXJ5OworICAgIGpzb247CisgICAgY29tcGFjdDsKK30KKworZW51bSBFbmRwb2ludFRyYW5zcG9ydCB7CisgICAgc29ja2V0OworICAgIGh0dHA7Cit9CisKK2VudW0gU2VydmVyVHlwZSB7CisgICAgc2ltcGxlOworICAgIC8qCisgICAgdGhyZWFkcG9vbDsKKyAgICB0aHJlYWRlZDsKKyAgICBub25ibG9ja2luZzsKKyAgICAqLworfQorCisKK2NsYXNzIEFyZ3VtZW50cworeworICAgIHB1YmxpYyB2YXIgcHJpbnRIZWxwT25seShkZWZhdWx0LG51bGwpIDogQm9vbCA9IGZhbHNlOworCisgICAgcHVibGljIHZhciBzZXJ2ZXIoZGVmYXVsdCxudWxsKSA6IEJvb2wgPSBmYWxzZTsKKyAgICBwdWJsaWMgdmFyIHNlcnZlcnR5cGUoZGVmYXVsdCxudWxsKSA6IFNlcnZlclR5cGUgPSBzaW1wbGU7CisKKyAgICBwdWJsaWMgdmFyIGhvc3QoZGVmYXVsdCxudWxsKSA6IFN0cmluZyA9ICJsb2NhbGhvc3QiOworICAgIHB1YmxpYyB2YXIgcG9ydChkZWZhdWx0LG51bGwpIDogSW50ID0gOTA5MDsKKworICAgIHB1YmxpYyB2YXIgcHJvdG9jb2woZGVmYXVsdCxudWxsKSA6IFByb3RvY29sVHlwZSA9IGJpbmFyeTsKKyAgICBwdWJsaWMgdmFyIHRyYW5zcG9ydChkZWZhdWx0LG51bGwpIDogRW5kcG9pbnRUcmFuc3BvcnQgPSBzb2NrZXQ7CisgICAgcHVibGljIHZhciBmcmFtZWQoZGVmYXVsdCxudWxsKSA6IEJvb2wgPSBmYWxzZTsKKyAgICBwdWJsaWMgdmFyIGJ1ZmZlcmVkKGRlZmF1bHQsbnVsbCkgOiBCb29sID0gZmFsc2U7CisKKyAgICBwdWJsaWMgdmFyIG51bUl0ZXJhdGlvbnMoZGVmYXVsdCxudWxsKSA6IEludCA9IDE7CisgICAgcHVibGljIHZhciBudW1UaHJlYWRzKGRlZmF1bHQsbnVsbCkgOiBJbnQgPSAxOworICAgIHB1YmxpYyB2YXIgc2tpcFNwZWVkVGVzdChkZWZhdWx0LG51bGwpIDogQm9vbCA9IGZhbHNlOworCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCkgeworICAgICAgICAjaWYgc3lzCisgICAgICAgICAgI2lmICFwaHB3ZWJzZXJ2ZXIKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBQYXJzZUFyZ3MoKTsKKyAgICAgICAgICB9IGNhdGNoIChlIDogU3RyaW5nKSB7CisgICAgICAgICAgICB0cmFjZShHZXRIZWxwKCkpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICB9CisgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIC8vZm9yY2luZyBzZXJ2ZXIKKyAgICAgICAgICAgIHNlcnZlciA9IHRydWU7CisgICAgICAgICAgICB0cmFuc3BvcnQgPSBodHRwOworICAgICAgICAgICNlbmQKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgdHJhY2UoIldOOiBQbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IHByb2dyYW0gYXJndW1lbnRzLCB1c2luZyBkZWZhdWx0cy4iKTsKKyAgICAgICAgI2VuZAorICAgIH0KKworICAgICNpZiBzeXMKKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIEdldEhlbHAoKSA6IFN0cmluZyB7CisgICAgICAgIHZhciBzUHJvZyA9IFBhdGgud2l0aG91dERpcmVjdG9yeSggU3lzLmV4ZWN1dGFibGVQYXRoKCkpOworICAgICAgICByZXR1cm4gIlxuIgorICAgICAgICAgICAgK3NQcm9nKyIgIFtjbGllbnR8c2VydmVyXSAgW29wdGlvbnNdXG4iCisgICAgICAgICAgICArIlxuIgorICAgICAgICAgICAgKyJNb2R1czogRWl0aGVyIGNsaWVudCBvciBzZXJ2ZXIsIHRoZSBkZWZhdWx0IGlzIGNsaWVudC5cbiIKKyAgICAgICAgICAgICsiXG4iCisgICAgICAgICAgICArIkNvbW1vbiBvcHRpb25zOlxuIgorICAgICAgICAgICAgKyIgIC1oIFsgLS1oZWxwIF0gICAgICAgICAgICAgICBwcm9kdWNlIGhlbHAgbWVzc2FnZVxuIgorICAgICAgICAgICAgKyIgIC0tcG9ydCBhcmcgKD05MDkwKSAgICAgICAgICBQb3J0IG51bWJlciB0byBsaXN0ZW4gLyBjb25uZWN0IHRvXG4iCisgICAgICAgICAgICAvKiBub3Qgc3VwcG9ydGVkIHlldAorICAgICAgICAgICAgKyIgIC0tZG9tYWluLXNvY2tldCBhcmcgICAgICAgICBVbml4IERvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdClcbiIKKyAgICAgICAgICAgICsiICAtLW5hbWVkLXBpcGUgYXJnICAgICAgICAgICAgV2luZG93cyBOYW1lZCBQaXBlIChlLmcuIE15VGhyaWZ0UGlwZSlcbiIKKyAgICAgICAgICAgICovCisgICAgICAgICAgICArIiAgLS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpICAgIHByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb25cbiIKKyAgICAgICAgICAgIC8qIG5vdCBzdXBwb3J0ZWQgeWV0CisgICAgICAgICAgICArIiAgLS1zc2wgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMXG4iCisgICAgICAgICAgICAqLworICAgICAgICAgICAgKyJcbiIKKyAgICAgICAgICAgICsiU2VydmVyIG9ubHkgb3B0aW9uczpcbiIKKyAgICAgICAgICAgICsiICAtLXRyYW5zcG9ydCBhcmcgKD1zb2NrZXRzKSAgVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBhbm9ucGlwZVxuIgorICAgICAgICAgICAgLyogbm90IHN1cHBvcnRlZCB5ZXQKKyAgICAgICAgICAgICsiICAtLXByb2Nlc3Nvci1ldmVudHMgICAgICAgICAgcHJvY2Vzc29yLWV2ZW50c1xuIgorICAgICAgICAgICAgKyIgIC0tc2VydmVyLXR5cGUgYXJnICg9c2ltcGxlKSB0eXBlIG9mIHNlcnZlciwgXCJzaW1wbGVcIiwgXCJ0aHJlYWQtcG9vbFwiLCBcbiIKKyAgICAgICAgICAgICsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0aHJlYWRlZFwiLCBvciBcIm5vbmJsb2NraW5nXCJcbiIKKyAgICAgICAgICAgICsiICAtbiBbIC0td29ya2VycyBdIGFyZyAoPTQpICAgTnVtYmVyIG9mIHRocmVhZCBwb29scyB3b3JrZXJzLiBPbmx5IHZhbGlkIGZvciBcbiIKKyAgICAgICAgICAgICsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLXBvb2wgc2VydmVyIHR5cGVcbiIKKyAgICAgICAgICAgICovCisgICAgICAgICAgICArIlxuIgorICAgICAgICAgICAgKyJDbGllbnQgb25seSBvcHRpb25zOlxuIgorICAgICAgICAgICAgKyIgIC0taG9zdCBhcmcgKD1sb2NhbGhvc3QpICAgICBIb3N0IHRvIGNvbm5lY3RcbiIKKyAgICAgICAgICAgICsiICAtLXRyYW5zcG9ydCBhcmcgKD1zb2NrZXRzKSAgVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBldmh0dHBcbiIKKyAgICAgICAgICAgIC8qIG5vdCBzdXBwb3J0ZWQgeWV0CisgICAgICAgICAgICArIiAgLS1hbm9uLXBpcGVzIGhSZWFkIGhXcml0ZSAgIFdpbmRvd3MgQW5vbnltb3VzIFBpcGVzIHBhaXIgKGhhbmRsZXMpXG4iCisgICAgICAgICAgICAqLworICAgICAgICAgICAgKyIgIC1uIFsgLS10ZXN0bG9vcHMgXSBhcmcgKD0xKSBOdW1iZXIgb2YgVGVzdHNcbiIKKyAgICAgICAgICAgICsiICAtdCBbIC0tdGhyZWFkcyBdIGFyZyAoPTEpICAgTnVtYmVyIG9mIFRlc3QgdGhyZWFkc1xuIgorICAgICAgICAgICAgKyIgIC0tc2tpcC1zcGVlZC10ZXN0ICAgICAgICAgICBTa2lwIHRoZSBzcGVlZCB0ZXN0XG4iCisgICAgICAgICAgICArIlxuIgorICAgICAgICAgICAgKyJBbGwgYXJndW1lbnRzIGFyZSBvcHRpb25hbC5cbiIKKyAgICAgICAgICAgIDsKKyAgICB9CisKKworICAgIHByaXZhdGUgZnVuY3Rpb24gUGFyc2VBcmdzKCkgOiBWb2lkIHsKKworICAgICAgICB2YXIgYXJncyA9IFN5cy5hcmdzKCkuY29weSgpOworICAgICAgICBpZiggKGFyZ3MgPT0gbnVsbCkgfHwgKGFyZ3MubGVuZ3RoIDw9IDApKSB7CisgICAgICAgICAgICBzZXJ2ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIG51bVRocmVhZHMgPSAxOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGFyZyA9IGFyZ3Muc2hpZnQoKTsKKyAgICAgICAgaWYgKCBhcmcgPT0gImNsaWVudCIpIHsKKyAgICAgICAgICAgIHNlcnZlciA9IGZhbHNlOworICAgICAgICAgICAgbnVtVGhyZWFkcyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIGFyZyA9PSAic2VydmVyIikgeworICAgICAgICAgICAgc2VydmVyID0gdHJ1ZTsKKyAgICAgICAgICAgIG51bVRocmVhZHMgPSA0OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCAoYXJnID09ICItaCIpIHx8IChhcmcgPT0gIi0taGVscCIpKSB7CisgICAgICAgICAgICAvLyAtaCBbIC0taGVscCBdICAgICAgICAgICAgICAgcHJvZHVjZSBoZWxwIG1lc3NhZ2UKKyAgICAgICAgICAgIFN5cy5wcmludGxuKCBHZXRIZWxwKCkpOworICAgICAgICAgICAgcHJpbnRIZWxwT25seSA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0aHJvdyAiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSAnc2VydmVyJyBvciAnY2xpZW50JyI7CisgICAgICAgIH0KKworCisgICAgICAgIHdoaWxlKCBhcmdzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGFyZyA9IGFyZ3Muc2hpZnQoKTsKKworICAgICAgICAgICAgaWYgKCAoYXJnID09ICItaCIpIHx8IChhcmcgPT0gIi0taGVscCIpKSB7CisgICAgICAgICAgICAgICAgLy8gLWggWyAtLWhlbHAgXSAgICAgICAgICAgICAgIHByb2R1Y2UgaGVscCBtZXNzYWdlCisgICAgICAgICAgICAgICAgU3lzLnByaW50bG4oIEdldEhlbHAoKSk7CisgICAgICAgICAgICAgICAgcHJpbnRIZWxwT25seSA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYXJnID09ICItLXBvcnQiKSB7CisgICAgICAgICAgICAgICAgLy8gLS1wb3J0IGFyZyAoPTkwOTApICAgICAgICAgIFBvcnQgbnVtYmVyIHRvIGxpc3RlbgorICAgICAgICAgICAgICAgIGFyZyA9IGFyZ3Muc2hpZnQoKTsKKyAgICAgICAgICAgICAgICB2YXIgdG1wID0gU3RkLnBhcnNlSW50KGFyZyk7CisgICAgICAgICAgICAgICAgaWYoIHRtcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHBvcnQgPSB0bXA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgIkludmFsaWQgcG9ydCBudW1iZXIgIithcmc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYXJnID09ICItLWRvbWFpbi1zb2NrZXQiKSB7CisgICAgICAgICAgICAgICAgLy8gICAtLWRvbWFpbi1zb2NrZXQgYXJnICAgICAgICAgVW5peCBEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpCisgICAgICAgICAgICAgICAgdGhyb3cgImRvbWFpbiBzb2NrZXRzIG5vdCBzdXBwb3J0ZWQgeWV0IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZyA9PSAiLS1uYW1lZC1waXBlIikgeworICAgICAgICAgICAgICAgIC8vICAgLS1uYW1lZC1waXBlIGFyZyAgICAgICAgICAgIFdpbmRvd3MgTmFtZWQgUGlwZSAoZS5nLiBNeVRocmlmdFBpcGUpCisgICAgICAgICAgICAgICAgdGhyb3cgIm5hbWVkIHBpcGVzIG5vdCBzdXBwb3J0ZWQgeWV0IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZyA9PSAiLS1wcm90b2NvbCIpIHsKKyAgICAgICAgICAgICAgICAvLyAtLXByb3RvY29sIGFyZyAoPWJpbmFyeSkgICAgcHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbgorICAgICAgICAgICAgICAgIGFyZyA9IGFyZ3Muc2hpZnQoKTsKKyAgICAgICAgICAgICAgICBpZiggYXJnID09ICJiaW5hcnkiKSB7CisgICAgICAgICAgICAgICAgICAgIHByb3RvY29sID0gYmluYXJ5OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiggYXJnID09ICJjb21wYWN0IikgeworICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9IGNvbXBhY3Q7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKCBhcmcgPT0gImpzb24iKSB7CisgICAgICAgICAgICAgICAgICAgIHByb3RvY29sID0ganNvbjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBJbnZhbGlkQXJnKGFyZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYXJnID09ICItLXNzbCIpIHsKKyAgICAgICAgICAgICAgICAvLyAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wKKyAgICAgICAgICAgICAgICB0aHJvdyAiU1NMIG5vdCBzdXBwb3J0ZWQgeWV0IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vU2VydmVyIG9ubHkgb3B0aW9uczoKKyAgICAgICAgICAgICAgICBpZiggc2VydmVyKSB7CisgICAgICAgICAgICAgICAgICAgIFBhcnNlU2VydmVyQXJndW1lbnQoIGFyZywgYXJncyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgUGFyc2VDbGllbnRBcmd1bWVudCggYXJnLCBhcmdzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByaXZhdGUgZnVuY3Rpb24gUGFyc2VTZXJ2ZXJBcmd1bWVudCggYXJnIDogU3RyaW5nLCBhcmdzIDogQXJyYXk8U3RyaW5nPikgOiBWb2lkIHsKKyAgICAgICAgaWYgKGFyZyA9PSAiLS10cmFuc3BvcnQiKSB7CisgICAgICAgICAgICAvLyAgLS10cmFuc3BvcnQgYXJnICg9c29ja2V0cykgIFRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCwgYW5vbnBpcGUKKyAgICAgICAgICAgIGFyZyA9IGFyZ3Muc2hpZnQoKTsKKyAgICAgICAgICAgIGlmKCBhcmcgPT0gImJ1ZmZlcmVkIikgeworICAgICAgICAgICAgICAgIGJ1ZmZlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiggYXJnID09ICJmcmFtZWQiKSB7CisgICAgICAgICAgICAgICAgZnJhbWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiggYXJnID09ICJodHRwIikgeworICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IGh0dHA7CisgICAgICAgICAgICB9IGVsc2UgaWYoIGFyZyA9PSAiYW5vbnBpcGUiKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgIkFub24gcGlwZXMgdHJhbnNwb3J0IG5vdCBzdXBwb3J0ZWQgeWV0IjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgSW52YWxpZEFyZyhhcmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGFyZyA9PSAiLS1wcm9jZXNzb3ItZXZlbnRzIikgeworICAgICAgICAgICAgdGhyb3cgIlByb2Nlc3NvciBldmVudHMgbm90IHN1cHBvcnRlZCB5ZXQiOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGFyZyA9PSAiLS1zZXJ2ZXItdHlwZSIpIHsKKyAgICAgICAgICAgIC8vICAtLXNlcnZlci10eXBlIGFyZyAoPXNpbXBsZSkgdHlwZSBvZiBzZXJ2ZXIsCisgICAgICAgICAgICAvLyBvbmUgb2YgInNpbXBsZSIsICJ0aHJlYWQtcG9vbCIsICJ0aHJlYWRlZCIsICJub25ibG9ja2luZyIKKyAgICAgICAgICAgIGFyZyA9IGFyZ3Muc2hpZnQoKTsKKyAgICAgICAgICAgIGlmKCBhcmcgPT0gInNpbXBsZSIpIHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJ0eXBlID0gc2ltcGxlOworICAgICAgICAgICAgfSBlbHNlIGlmKCBhcmcgPT0gInRocmVhZC1wb29sIikgeworICAgICAgICAgICAgICAgIHRocm93IGFyZysiIHNlcnZlciBub3Qgc3VwcG9ydGVkIHlldCI7CisgICAgICAgICAgICB9IGVsc2UgaWYoIGFyZyA9PSAidGhyZWFkZWQiKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgYXJnKyIgc2VydmVyIG5vdCBzdXBwb3J0ZWQgeWV0IjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiggYXJnID09ICJub25ibG9ja2luZyIpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBhcmcrIiBzZXJ2ZXIgbm90IHN1cHBvcnRlZCB5ZXQiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBJbnZhbGlkQXJnKGFyZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKGFyZyA9PSAiLW4iKSB8fCAoYXJnID09ICItLXdvcmtlcnMiKSkgeworICAgICAgICAgICAgLy8gIC1uIFsgLS13b3JrZXJzIF0gYXJnICg9NCkgICBOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuIE9ubHkgdmFsaWQgZm9yCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC1wb29sIHNlcnZlciB0eXBlCisgICAgICAgICAgICBhcmcgPSBhcmdzLnNoaWZ0KCk7CisgICAgICAgICAgICB2YXIgdG1wID0gU3RkLnBhcnNlSW50KGFyZyk7CisgICAgICAgICAgICBpZiggdG1wICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBudW1UaHJlYWRzID0gdG1wOworICAgICAgICAgICAgfSBlbHNleworICAgICAgICAgICAgICAgIHRocm93ICJJbnZhbGlkIG51bWJlciAiK2FyZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEludmFsaWRBcmcoYXJnKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBQYXJzZUNsaWVudEFyZ3VtZW50KCBhcmcgOiBTdHJpbmcsIGFyZ3MgOiBBcnJheTxTdHJpbmc+KSA6IFZvaWQgeworICAgICAgICBpZiAoYXJnID09ICItLWhvc3QiKSB7CisgICAgICAgICAgICAvLyAgLS1ob3N0IGFyZyAoPWxvY2FsaG9zdCkgICAgIEhvc3QgdG8gY29ubmVjdAorICAgICAgICAgICAgaG9zdCA9IGFyZ3Muc2hpZnQoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhcmcgPT0gIi0tdHJhbnNwb3J0IikgeworICAgICAgICAgICAgLy8gIC0tdHJhbnNwb3J0IGFyZyAoPXNvY2tldHMpICBUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIGV2aHR0cAorICAgICAgICAgICAgYXJnID0gYXJncy5zaGlmdCgpOworICAgICAgICAgICAgaWYoIGFyZyA9PSAiYnVmZmVyZWQiKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmKCBhcmcgPT0gImZyYW1lZCIpIHsKKyAgICAgICAgICAgICAgICBmcmFtZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmKCBhcmcgPT0gImh0dHAiKSB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gaHR0cDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiggYXJnID09ICJldmh0dHAiKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgImV2aHR0cCB0cmFuc3BvcnQgbm90IHN1cHBvcnRlZCB5ZXQiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBJbnZhbGlkQXJnKGFyZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXJnID09ICItLWFub24tcGlwZXMiKSB7CisgICAgICAgICAgICAvLyAgLS1hbm9uLXBpcGVzIGhSZWFkIGhXcml0ZSAgIFdpbmRvd3MgQW5vbnltb3VzIFBpcGVzIHBhaXIgKGhhbmRsZXMpCisgICAgICAgICAgICB0aHJvdyAiQW5vbiBwaXBlcyB0cmFuc3BvcnQgbm90IHN1cHBvcnRlZCB5ZXQiOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChhcmcgPT0gIi1uIikgfHwgKGFyZyA9PSAiLS10ZXN0bG9vcHMiKSkgeworICAgICAgICAgICAgLy8gIC1uIFsgLS10ZXN0bG9vcHMgXSBhcmcgKD0xKSBOdW1iZXIgb2YgVGVzdHMKKyAgICAgICAgICAgIGFyZyA9IGFyZ3Muc2hpZnQoKTsKKyAgICAgICAgICAgIHZhciB0bXAgPSBTdGQucGFyc2VJbnQoYXJnKTsKKyAgICAgICAgICAgIGlmKCB0bXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG51bUl0ZXJhdGlvbnMgPSB0bXA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93ICJJbnZhbGlkIG51bWJlciAiK2FyZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoYXJnID09ICItdCIpIHx8IChhcmcgPT0gIi0tdGhyZWFkcyIpKSB7CisgICAgICAgICAgICAvLyAgLXQgWyAtLXRocmVhZHMgXSBhcmcgKD0xKSAgIE51bWJlciBvZiBUZXN0IHRocmVhZHMKKyAgICAgICAgICAgIGFyZyA9IGFyZ3Muc2hpZnQoKTsKKyAgICAgICAgICAgIHZhciB0bXAgPSBTdGQucGFyc2VJbnQoYXJnKTsKKyAgICAgICAgICAgIGlmKCB0bXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG51bVRocmVhZHMgPSB0bXA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93ICJJbnZhbGlkIG51bWJlciAiK2FyZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhcmcgPT0gIi0tc2tpcC1zcGVlZC10ZXN0IikgeworICAgICAgICAgICAgLy8gIC0tc2tpcC1zcGVlZC10ZXN0ICAgICAgICAgICAgICBTa2lwIHRoZSBzcGVlZCB0ZXN0CisgICAgICAgICAgICBza2lwU3BlZWRUZXN0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEludmFsaWRBcmcoYXJnKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgI2VuZAorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIEludmFsaWRBcmcoIGFyZyA6IFN0cmluZykgOiBWb2lkIHsKKyAgICAgICAgdGhyb3cgJ0ludmFsaWQgYXJndW1lbnQgJGFyZyc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL3NyYy9NYWluLmh4IGIvdGVzdC9oYXhlL3NyYy9NYWluLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYjgyOGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvc3JjL01haW4uaHgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7CisKK2ltcG9ydCB0aHJpZnQudGVzdC4qOyAgLy8gZ2VuZXJhdGVkIGNvZGUKKworY2xhc3MgTWFpbgoreworICAgIHN0YXRpYyBmdW5jdGlvbiBtYWluKCkgeworICAgICAgICAjaWYgcGhwd2Vic2VydmVyCisgICAgICAgIGluaXRQaHBXZWJTZXJ2ZXIoKTsKKyAgICAgICAgLy9jaGVjayBtZXRob2QKKyAgICAgICAgaWYocGhwLldlYi5nZXRNZXRob2QoKSAhPSAnUE9TVCcpIHsKKyAgICAgICAgICBTeXMucHJpbnRsbignaHR0cCBlbmRwb2ludCBmb3IgdGhyaWZ0IHRlc3Qgc2VydmVyJyk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICNlbmQKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIGFyZ3MgPSBuZXcgQXJndW1lbnRzKCk7CisKKyAgICAgICAgICAgIGlmKCBhcmdzLnByaW50SGVscE9ubHkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpZiAoYXJncy5zZXJ2ZXIpCisgICAgICAgICAgICAgICAgVGVzdFNlcnZlci5FeGVjdXRlKGFyZ3MpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFRlc3RDbGllbnQuRXhlY3V0ZShhcmdzKTsKKworICAgICAgICAgICAgdHJhY2UoIkNvbXBsZXRlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoZSA6IFN0cmluZykgeworICAgICAgICAgICAgdHJhY2UoZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjaWYgcGhwd2Vic2VydmVyCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaW5pdFBocFdlYlNlcnZlcigpCisgICAgeworICAgICAgICAvL3JlbWFwIHRyYWNlIHRvIGVycm9yIGxvZworICAgICAgICBoYXhlLkxvZy50cmFjZSA9IGZ1bmN0aW9uKHY6RHluYW1pYywgP2luZm9zOmhheGUuUG9zSW5mb3MpCisgICAgICAgIHsKKyAgICAgICAgICAvLyBoYW5kbGUgdHJhY2UKKyAgICAgICAgICB2YXIgbmV3VmFsdWUgOiBEeW5hbWljOworICAgICAgICAgIGlmIChpbmZvcyAhPSBudWxsICYmIGluZm9zLmN1c3RvbVBhcmFtcyE9bnVsbCkgeworICAgICAgICAgICAgdmFyIGV4dHJhOlN0cmluZyA9ICIiOworICAgICAgICAgICAgZm9yKCB2IGluIGluZm9zLmN1c3RvbVBhcmFtcyApCisgICAgICAgICAgICAgIGV4dHJhICs9ICIsIiArIHY7CisgICAgICAgICAgICBuZXdWYWx1ZSA9IHYgKyBleHRyYTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBuZXdWYWx1ZSA9IHY7CisgICAgICAgICAgfQorICAgICAgICAgIHZhciBtc2cgPSBpbmZvcyAhPSBudWxsID8gaW5mb3MuZmlsZU5hbWUgKyAnOicgKyBpbmZvcy5saW5lTnVtYmVyICsgJzogJyA6ICcnOworICAgICAgICAgIFN5cy5zdGRlcnIoKS53cml0ZVN0cmluZygnJHttc2d9JHtuZXdWYWx1ZX1cbicpOworICAgICAgICB9CisgICAgfQorICAgICNlbmQKKworfQpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL3NyYy9UZXN0Q2xpZW50Lmh4IGIvdGVzdC9oYXhlL3NyYy9UZXN0Q2xpZW50Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MzMxOWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvc3JjL1Rlc3RDbGllbnQuaHgKQEAgLTAsMCArMSw5MzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZTsKKworaW1wb3J0IGhheGUuSW50MzI7CitpbXBvcnQgaGF4ZS5JbnQ2NDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuVGltZXI7CitpbXBvcnQgaGF4ZS5kcy5JbnRNYXA7CitpbXBvcnQgaGF4ZS5kcy5TdHJpbmdNYXA7CitpbXBvcnQgaGF4ZS5kcy5PYmplY3RNYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlci4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7CisKKyNpZiBjcHAKK2ltcG9ydCBjcHAudm0uVGhyZWFkOworI2Vsc2UKKy8vIG5vIHRocmVhZCBzdXBwb3J0ICh5ZXQpCisjZW5kCisKK2ltcG9ydCB0aHJpZnQudGVzdC4qOyAgLy8gZ2VuZXJhdGVkIGNvZGUKKworCit1c2luZyBTdHJpbmdUb29sczsKKworY2xhc3MgVGVzdFJlc3VsdHMgeworICAgIHByaXZhdGUgdmFyIHN1Y2Nlc3NDbnQgOiBJbnQgPSAwOworICAgIHByaXZhdGUgdmFyIGVycm9yQ250IDogSW50ID0gMDsKKyAgICBwcml2YXRlIHZhciBmYWlsZWRUZXN0cyA6IFN0cmluZyA9ICIiOworICAgIHByaXZhdGUgdmFyIHByaW50X2RpcmVjdCA6IEJvb2wgPSBmYWxzZTsKKworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEVYSVRDT0RFX1NVQ0NFU1MgICAgICAgICAgICA9IDB4MDA7ICAvLyBubyBlcnJvcnMgYml0cyBzZXQKKyAgICAvLworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEVYSVRDT0RFX0ZBSUxCSVRfQkFTRVRZUEVTICA9IDB4MDE7CisgICAgcHVibGljIHN0YXRpYyB2YXIgRVhJVENPREVfRkFJTEJJVF9TVFJVQ1RTICAgID0gMHgwMjsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBFWElUQ09ERV9GQUlMQklUX0NPTlRBSU5FUlMgPSAweDA0OworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEVYSVRDT0RFX0ZBSUxCSVRfRVhDRVBUSU9OUyA9IDB4MDg7CisgICAgLy8KKyAgICBwdWJsaWMgc3RhdGljIHZhciBFWElUQ09ERV9BTExfRkFJTEJJVFMgICAgICAgPSAweDBGOworICAgIC8vCisgICAgcHJpdmF0ZSB2YXIgdGVzdHNFeGVjdXRlZCA6IEludCA9IDA7CisgICAgcHJpdmF0ZSB2YXIgdGVzdHNGYWlsZWQgOiBJbnQgPSAwOworICAgIHByaXZhdGUgdmFyIGN1cnJlbnRUZXN0IDogSW50ID0gMDsKKworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhkaXJlY3QgOiBCb29sKSB7CisgICAgICAgIHByaW50X2RpcmVjdCA9IGRpcmVjdDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gU3RhcnRUZXN0R3JvdXAoIGdyb3VwQml0IDogSW50KSA6IFZvaWQgeworICAgICAgICBjdXJyZW50VGVzdCA9IGdyb3VwQml0OworICAgICAgICB0ZXN0c0V4ZWN1dGVkIHw9IGdyb3VwQml0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBFeHBlY3QoIGV4cHIgOiBCb29sLCBtc2cgOiBTdHJpbmcpIDogVm9pZCB7CisgICAgICAgIGlmICggZXhwcikgeworICAgICAgICAgICAgKytzdWNjZXNzQ250OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKytlcnJvckNudDsKKyAgICAgICAgICAgIHRlc3RzRmFpbGVkIHw9IGN1cnJlbnRUZXN0OworICAgICAgICAgICAgZmFpbGVkVGVzdHMgKz0gIlxuICAiICsgbXNnOworICAgICAgICAgICAgaWYoIHByaW50X2RpcmVjdCkgeworICAgICAgICAgICAgICAgIHRyYWNlKCdGQUlMOiAkbXNnJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gQ2FsY3VsYXRlRXhpdENvZGUoKSA6IEludCB7CisgICAgICAgIHZhciBub3RFeGVjdXRlZCA6IEludCA9IEVYSVRDT0RFX0FMTF9GQUlMQklUUyAmICh+dGVzdHNFeGVjdXRlZCk7CisgICAgICAgIHJldHVybiB0ZXN0c0ZhaWxlZCB8IG5vdEV4ZWN1dGVkOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBQcmludFN1bW1hcnkoKSA6IFZvaWQgeworICAgICAgICB2YXIgdG90YWwgPSBzdWNjZXNzQ250ICsgZXJyb3JDbnQ7CisgICAgICAgIHZhciBzcCA9IE1hdGgucm91bmQoKDEwMDAgKiBzdWNjZXNzQ250KSAvIHRvdGFsKSAvIDEwOworICAgICAgICB2YXIgZXAgPSBNYXRoLnJvdW5kKCgxMDAwICogZXJyb3JDbnQpIC8gdG90YWwpIC8gMTA7CisKKyAgICAgICAgdHJhY2UoJz09PT09PT09PT09PT09PT09PT09PT09PT09PScpOworICAgICAgICB0cmFjZSgnVGVzdHMgZXhlY3V0ZWQgICAgJHRvdGFsJyk7CisgICAgICAgIHRyYWNlKCdUZXN0cyBzdWNjZWVkZWQgICAkc3VjY2Vzc0NudCAoJHNwJSknKTsKKyAgICAgICAgdHJhY2UoJ1Rlc3RzIGZhaWxlZCAgICAgICRlcnJvckNudCAoJGVwJSknKTsKKyAgICAgICAgaWYgKCBlcnJvckNudCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCc9PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTsKKyAgICAgICAgICAgIHRyYWNlKCdGQUlMRUQgVEVTVFM6ICRmYWlsZWRUZXN0cycpOworICAgICAgICB9CisgICAgICAgIHRyYWNlKCc9PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTsKKyAgICB9Cit9CisKKworY2xhc3MgVGVzdENsaWVudCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEV4ZWN1dGUoYXJncyA6IEFyZ3VtZW50cykgOiAgVm9pZAorICAgIHsKKyAgICAgICAgdmFyIGV4aXRDb2RlID0gMHhGRjsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBkaWZmdCA9IFRpbWVyLnN0YW1wKCk7CisKKyAgICAgICAgICAgIGlmICggYXJncy5udW1UaHJlYWRzID4gMSkgeworICAgICAgICAgICAgICAgICNpZiBjcHAKKyAgICAgICAgICAgICAgICBleGl0Q29kZSA9IE11bHRpVGhyZWFkQ2xpZW50KGFyZ3MpOworICAgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgdHJhY2UoJ1RocmVhZHMgbm90IHN1cHBvcnRlZC9pbXBsZW1lbnRlZCBmb3IgdGhpcyBwbGF0Zm9ybS4nKTsKKyAgICAgICAgICAgICAgICBleGl0Q29kZSA9IFNpbmdsZVRocmVhZENsaWVudChhcmdzKTsKKyAgICAgICAgICAgICAgICAjZW5kCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV4aXRDb2RlID0gU2luZ2xlVGhyZWFkQ2xpZW50KGFyZ3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkaWZmdCA9IE1hdGgucm91bmQoIDEwMDAgKiAoVGltZXIuc3RhbXAoKSAtIGRpZmZ0KSkgLyAxMDAwOworICAgICAgICAgICAgdHJhY2UoJ3RvdGFsIHRlc3QgdGltZTogJGRpZmZ0IHNlY29uZHMnKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IFRFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCdURXhjZXB0aW9uOiAkZScpOworICAgICAgICAgICAgZXhpdENvZGUgPSAweEZGOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoJ0V4Y2VwdGlvbjogJGUnKTsKKyAgICAgICAgICAgIGV4aXRDb2RlID0gMHhGRjsKKyAgICAgICAgfQorCisgICAgICAgICNpZiBzeXMKKyAgICAgICAgU3lzLmV4aXQoIGV4aXRDb2RlKTsKKyAgICAgICAgI2VuZAorICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBTaW5nbGVUaHJlYWRDbGllbnQoYXJncyA6IEFyZ3VtZW50cykgOiAgSW50CisgICAgeworICAgICAgICB2YXIgcnNsdCA9IG5ldyBUZXN0UmVzdWx0cyh0cnVlKTsKKyAgICAgICAgUnVuQ2xpZW50KGFyZ3MscnNsdCk7CisgICAgICAgIHJzbHQuUHJpbnRTdW1tYXJ5KCk7CisgICAgICAgIHJldHVybiByc2x0LkNhbGN1bGF0ZUV4aXRDb2RlKCk7CisgICAgfQorCisKKyAgICAjaWYgY3BwCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBNdWx0aVRocmVhZENsaWVudChhcmdzIDogQXJndW1lbnRzKSA6ICBJbnQKKyAgICB7CisgICAgICAgIHZhciB0aHJlYWRzID0gbmV3IExpc3Q8VGhyZWFkPigpOworICAgICAgICBmb3IoIHRlc3QgaW4gMCAuLi4gYXJncy5udW1UaHJlYWRzKSB7CisgICAgICAgICAgICB0aHJlYWRzLmFkZCggU3RhcnRUaHJlYWQoIGFyZ3MpKTsKKyAgICAgICAgfQorICAgICAgICB2YXIgZXhpdENvZGUgOiBJbnQgPSAwOworICAgICAgICBmb3IoIHRocmVhZCBpbiB0aHJlYWRzKSB7CisgICAgICAgICAgICBleGl0Q29kZSB8PSBUaHJlYWQucmVhZE1lc3NhZ2UodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV4aXRDb2RlOworICAgIH0KKyAgICAjZW5kCisKKyAgICAjaWYgY3BwCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gU3RhcnRUaHJlYWQoYXJncyA6IEFyZ3VtZW50cykgOiBUaHJlYWQgeworICAgICAgICB2YXIgdGhyZWFkID0gVGhyZWFkLmNyZWF0ZSgKKyAgICAgICAgICAgIGZ1bmN0aW9uKCkgOiBWb2lkIHsKKyAgICAgICAgICAgICAgICB2YXIgcnNsdCA9IG5ldyBUZXN0UmVzdWx0cyhmYWxzZSk7CisgICAgICAgICAgICAgICAgdmFyIG1haW4gOiBUaHJlYWQgPSBUaHJlYWQucmVhZE1lc3NhZ2UodHJ1ZSk7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSdW5DbGllbnQoYXJncyxyc2x0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKGUgOiBURXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGZhbHNlLCAnJGUnKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2UoJyRlJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJyRlJyk7CisgICAgICAgICAgICAgICAgICAgIHRyYWNlKCckZScpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtYWluLnNlbmRNZXNzYWdlKCByc2x0LkNhbGN1bGF0ZUV4aXRDb2RlKCkpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgdGhyZWFkLnNlbmRNZXNzYWdlKFRocmVhZC5jdXJyZW50KCkpOworICAgICAgICByZXR1cm4gdGhyZWFkOworICAgIH0KKyAgICAjZW5kCisKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gUnVuQ2xpZW50KGFyZ3MgOiBBcmd1bWVudHMsIHJzbHQgOiBUZXN0UmVzdWx0cykKKyAgICB7CisgICAgICAgIHZhciB0cmFuc3BvcnQgOiBUVHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgc3dpdGNoIChhcmdzLnRyYW5zcG9ydCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBzb2NrZXQ6CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRTb2NrZXQoYXJncy5ob3N0LCBhcmdzLnBvcnQpOworICAgICAgICAgICAgY2FzZSBodHRwOgorICAgICAgICAgICAgICAgIHZhciB1cmkgPSAnaHR0cDovLyR7YXJncy5ob3N0fToke2FyZ3MucG9ydH0nOworICAgICAgICAgICAgICAgIHRyYWNlKCctIGh0dHAgY2xpZW50IDogJHt1cml9Jyk7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRIdHRwQ2xpZW50KHVyaSk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93ICJVbmhhbmRsZWQgdHJhbnNwb3J0IjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG9wdGlvbmFsOiBsYXllcmVkIHRyYW5zcG9ydAorICAgICAgICBpZiAoIGFyZ3MuZnJhbWVkKSB7CisgICAgICAgICAgICB0cmFjZSgiLSBmcmFtZWQgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFuc3BvcnQpOworICAgICAgICB9CisgICAgICAgIGlmICggYXJncy5idWZmZXJlZCkgeworICAgICAgICAgICAgdHJhY2UoIi0gYnVmZmVyZWQgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zcG9ydCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm90b2NvbAorICAgICAgICB2YXIgcHJvdG9jb2wgOiBUUHJvdG9jb2wgPSBudWxsOworICAgICAgICBzd2l0Y2goIGFyZ3MucHJvdG9jb2wpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBiaW5hcnk6CisgICAgICAgICAgICB0cmFjZSgiLSBiaW5hcnkgcHJvdG9jb2wiKTsKKyAgICAgICAgICAgIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICBjYXNlIGpzb246CisgICAgICAgICAgICB0cmFjZSgiLSBqc29uIHByb3RvY29sIik7CisgICAgICAgICAgICBwcm90b2NvbCA9IG5ldyBUSlNPTlByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgIGNhc2UgY29tcGFjdDoKKyAgICAgICAgICAgIHRyYWNlKCItIGNvbXBhY3QgcHJvdG9jb2wiKTsKKyAgICAgICAgICAgIHByb3RvY29sID0gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNvbWUgcXVpY2sgYW5kIGJhc2ljIHVuaXQgdGVzdHMKKyAgICAgICAgSGF4ZUJhc2ljc1Rlc3QoIGFyZ3MsIHJzbHQpOworICAgICAgICBNb2R1bGVVbml0VGVzdHMoIGFyZ3MsIHJzbHQpOworCisgICAgICAgIC8vIG5vdyBydW4gdGhlIHRlc3QgY29kZQorICAgICAgICB0cmFjZSgnLSAke2FyZ3MubnVtSXRlcmF0aW9uc30gaXRlcmF0aW9ucycpOworICAgICAgICBmb3IoIGkgaW4gMCAuLi4gYXJncy5udW1JdGVyYXRpb25zKSB7CisgICAgICAgICAgICBDbGllbnRUZXN0KCB0cmFuc3BvcnQsIHByb3RvY29sLCBhcmdzLCByc2x0KTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBIYXhlQmFzaWNzVGVzdCggYXJncyA6IEFyZ3VtZW50cywgcnNsdCA6IFRlc3RSZXN1bHRzKSA6IFZvaWQKKyAgICB7CisgICAgICAgIC8vIFdlIG5lZWQgdG8gdGVzdCBhIGZldyBiYXNpYyB0aGluZ3MgdXNlZCBpbiB0aGUgQ2xpZW50VGVzdAorICAgICAgICAvLyBBbnl0aGluZyBlbHNlIGJleW9uZCB0aGlzIHNjb3BlIHNob3VsZCBnbyBpbnRvIC9saWIvaGF4ZS8gaW5zdGVhZAorICAgICAgICByc2x0LlN0YXJ0VGVzdEdyb3VwKCBUZXN0UmVzdWx0cy5FWElUQ09ERV9GQUlMQklUX0JBU0VUWVBFUyk7CisKKyAgICAgICAgdmFyIG1hcDMyID0gbmV3IEludE1hcDxJbnQzMj4oKTsKKyAgICAgICAgdmFyIG1hcDY0ID0gbmV3IEludDY0TWFwPEludDMyPigpOworCisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5rZXlzKCkuaGFzTmV4dCgpID09IG1hcDY0LmtleXMoKS5oYXNOZXh0KCksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMSIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZXhpc3RzKCA0NzExKSA9PSBtYXA2NC5leGlzdHMoIEludDY0Lm1ha2UoNDcsMTEpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMyIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5yZW1vdmUoIDQ3MTEpID09IG1hcDY0LnJlbW92ZSggSW50NjQubWFrZSg0NywxMSkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzMiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmdldCggNDcxMSkgPT0gbWFwNjQuZ2V0KCBJbnQ2NC5tYWtlKDQ3LDExKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjNCIpOworCisgICAgICAgIG1hcDMyLnNldCggNDIsIDgxNSk7CisgICAgICAgIG1hcDY0LnNldCggSW50NjQubWFrZSgwLDQyKSwgODE1KTsKKyAgICAgICAgbWFwMzIuc2V0KCAtNTE3LCAyMyk7CisgICAgICAgIG1hcDY0LnNldCggSW50NjQubmVnKEludDY0Lm1ha2UoMCw1MTcpKSwgMjMpOworICAgICAgICBtYXAzMi5zZXQoIDAsIC0xMjMpOworICAgICAgICBtYXA2NC5zZXQoIEludDY0Lm1ha2UoMCwwKSwgLTEyMyk7CisKKyAgICAgICAgLy90cmFjZSgnbWFwMzIgPSAkbWFwMzInKTsKKyAgICAgICAgLy90cmFjZSgnbWFwNjQgPSAkbWFwNjQnKTsKKworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIua2V5cygpLmhhc05leHQoKSA9PSBtYXA2NC5rZXlzKCkuaGFzTmV4dCgpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzEwIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5leGlzdHMoIDQ3MTEpID09IG1hcDY0LmV4aXN0cyggSW50NjQubWFrZSg0NywxMSkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzExIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5leGlzdHMoIC01MTcpID09IG1hcDY0LmV4aXN0cyggSW50NjQubmVnKEludDY0Lm1ha2UoMCw1MTcpKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMTIiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmV4aXN0cyggNDIpID09IG1hcDY0LmV4aXN0cyggSW50NjQubWFrZSgwLDQyKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMTMiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmV4aXN0cyggMCkgPT0gbWFwNjQuZXhpc3RzKCBJbnQ2NC5tYWtlKDAsMCkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzE0Iik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5nZXQoIDQ3MTEpID09IG1hcDY0LmdldCggSW50NjQubWFrZSg0NywxMSkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzE1Iik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5nZXQoIC01MTcpID09IG1hcDY0LmdldCggSW50NjQubmVnKEludDY0Lm1ha2UoMCw1MTcpKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMTYiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmdldCggNDIpID09IG1hcDY0LmdldCggSW50NjQubWFrZSgwLDQyKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjSW50NjQubWFrZSgtNSwxNykiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmdldCggMCkgPT0gbWFwNjQuZ2V0KCBJbnQ2NC5tYWtlKDAsMCkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzE4Iik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5yZW1vdmUoIDQ3MTEpID09IG1hcDY0LnJlbW92ZSggSW50NjQubWFrZSg0NywxMSkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzE5Iik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5yZW1vdmUoIC01MTcpID09IG1hcDY0LnJlbW92ZSggSW50NjQubmVnKEludDY0Lm1ha2UoMCw1MTcpKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMjAiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmV4aXN0cyggNDcxMSkgPT0gbWFwNjQuZXhpc3RzKCBJbnQ2NC5tYWtlKDQ3LDExKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMjEiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmV4aXN0cyggLTUxNykgPT0gbWFwNjQuZXhpc3RzKCBJbnQ2NC5uZWcoSW50NjQubWFrZSgwLDUxNykpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMyMiIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZXhpc3RzKCA0MikgPT0gbWFwNjQuZXhpc3RzKCBJbnQ2NC5tYWtlKDAsNDIpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMyMyIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZXhpc3RzKCAwKSA9PSBtYXA2NC5leGlzdHMoIEludDY0Lm1ha2UoMCwwKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMjQiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmdldCggNDcxMSkgPT0gbWFwNjQuZ2V0KCBJbnQ2NC5tYWtlKDQ3LDExKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMjUiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmdldCggLTUxNykgPT0gbWFwNjQuZ2V0KCBJbnQ2NC5uZWcoSW50NjQubWFrZSgwLDUxNykpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMyNiIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZ2V0KCA0MikgPT0gbWFwNjQuZ2V0KCBJbnQ2NC5tYWtlKDAsNDIpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMyNyIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZ2V0KCAwKSA9PSBtYXA2NC5nZXQoIEludDY0Lm1ha2UoMCwwKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMjgiKTsKKworICAgICAgICBtYXAzMi5zZXQoIDQyLCAxKTsKKyAgICAgICAgbWFwNjQuc2V0KCBJbnQ2NC5tYWtlKDAsNDIpLCAxKTsKKyAgICAgICAgbWFwMzIuc2V0KCAtNTE3LCAtMik7CisgICAgICAgIG1hcDY0LnNldCggSW50NjQubmVnKEludDY0Lm1ha2UoMCw1MTcpKSwgLTIpOworICAgICAgICBtYXAzMi5zZXQoIDAsIDMpOworICAgICAgICBtYXA2NC5zZXQoIEludDY0Lm1ha2UoMCwwKSwgMyk7CisKKyAgICAgICAgdmFyIGMzMiA9IDA7CisgICAgICAgIHZhciBrc3VtMzIgPSAwOworICAgICAgICBmb3IgKGtleSBpbiBtYXAzMi5rZXlzKCkpIHsKKyAgICAgICAgICAgICsrYzMyOworICAgICAgICAgICAga3N1bTMyICs9IGtleTsKKyAgICAgICAgfQorICAgICAgICB2YXIgYzY0ID0gMDsKKyAgICAgICAgdmFyIGtzdW02NCA9IEludDY0Lm1ha2UoMCwwKTsKKyAgICAgICAgZm9yIChrZXkgaW4gbWFwNjQua2V5cygpKSB7CisgICAgICAgICAgICArK2M2NDsKKyAgICAgICAgICAgIGtzdW02NCA9IEludDY0LmFkZCgga3N1bTY0LCBrZXkpOworICAgICAgICB9CisgICAgICAgIHJzbHQuRXhwZWN0KCBjMzIgPT0gYzY0LCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzMwIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCAnJGtzdW02NCcgPT0gJyRrc3VtMzInLCAnJGtzdW02NCA9PSAka3N1bTMyICAgVGVzdCAjMzEnKTsKKworICAgICAgICAvL2NvbXBhcmUgd2l0aG91dCBzcGFjZXMgYmVjYXVzZSBkaWZmZXIgaW4gcGhwIGFuZCBjcHAKKyAgICAgICAgdmFyIHMzMiA9IG1hcDMyLnRvU3RyaW5nKCkucmVwbGFjZSgnICcsICcnKTsKKyAgICAgICAgdmFyIHM2NCA9IG1hcDY0LnRvU3RyaW5nKCkucmVwbGFjZSgnICcsICcnKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIHMzMiA9PSBzNjQsICJJbnQ2NE1hcDxJbnQzMj4udG9TdHJpbmcoKTogIiArICcgKCIkczMyIiA9PSAiJHM2NCIpIFRlc3QgIzMyJyk7CisKKyAgICAgICAgbWFwMzIucmVtb3ZlKCA0Mik7CisgICAgICAgIG1hcDY0LnJlbW92ZSggSW50NjQubWFrZSgwLDQyKSk7CisgICAgICAgIG1hcDMyLnJlbW92ZSggLTUxNyk7CisgICAgICAgIG1hcDY0LnJlbW92ZSggSW50NjQubmVnKEludDY0Lm1ha2UoMCw1MTcpKSk7CisgICAgICAgIG1hcDMyLnJlbW92ZSggMCk7CisgICAgICAgIG1hcDY0LnJlbW92ZSggSW50NjQubWFrZSgwLDApKTsKKworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIua2V5cygpLmhhc05leHQoKSA9PSBtYXA2NC5rZXlzKCkuaGFzTmV4dCgpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzkwIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5leGlzdHMoIDQ3MTEpID09IG1hcDY0LmV4aXN0cyggSW50NjQubWFrZSg0NywxMSkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzkxIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5leGlzdHMoIC01MTcpID09IG1hcDY0LmV4aXN0cyggSW50NjQubmVnKEludDY0Lm1ha2UoMCw1MTcpKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjOTIiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmV4aXN0cyggNDIpID09IG1hcDY0LmV4aXN0cyggSW50NjQubWFrZSgwLDQyKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjOTMiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmV4aXN0cyggMCkgPT0gbWFwNjQuZXhpc3RzKCBJbnQ2NC5tYWtlKDAsMCkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzk0Iik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5nZXQoIDQ3MTEpID09IG1hcDY0LmdldCggSW50NjQubWFrZSg0NywxMSkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzk1Iik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5nZXQoIC01MTcpID09IG1hcDY0LmdldCggSW50NjQubWFrZSgtNSwxNykpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzk2Iik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5nZXQoIDQyKSA9PSBtYXA2NC5nZXQoIEludDY0Lm1ha2UoMCw0MikpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzk3Iik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5nZXQoIDApID09IG1hcDY0LmdldCggSW50NjQubWFrZSgwLCAwKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjOTgiKTsKKyAgICB9CisKKworICAgIC8vIGNvcmUgbW9kdWxlIHVuaXQgdGVzdHMKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIE1vZHVsZVVuaXRUZXN0cyggYXJncyA6IEFyZ3VtZW50cywgcnNsdCA6IFRlc3RSZXN1bHRzKSA6IFZvaWQgeworICAgICAgICAjaWYgZGVidWcKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgQml0Q29udmVydGVyLlVuaXRUZXN0KCk7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggdHJ1ZSwgJ0JpdENvbnZlcnRlci5Vbml0VGVzdCAgVGVzdCAjMTAwJyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goIGUgOiBEeW5hbWljKSB7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggZmFsc2UsICdCaXRDb252ZXJ0ZXIuVW5pdFRlc3Q6ICRlICBUZXN0ICMxMDAnKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBaaWdaYWcuVW5pdFRlc3QoKTsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCB0cnVlLCAnWmlnWmFnLlVuaXRUZXN0ICBUZXN0ICMxMDEnKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggZSA6IER5bmFtaWMpIHsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJ1ppZ1phZy5Vbml0VGVzdDogJGUgIFRlc3QgIzEwMScpOworICAgICAgICB9CisKKyAgICAgICAgI2VuZAorICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBCeXRlc1RvSGV4KGRhdGEgOiBCeXRlcykgOiBTdHJpbmcgeworICAgICAgICB2YXIgaGV4ID0gIiI7CisgICAgICAgIGZvciAoIGkgaW4gMCAuLi4gZGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgIGhleCArPSBTdHJpbmdUb29scy5oZXgoIGRhdGEuZ2V0KGkpLCAyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGV4OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gUHJlcGFyZVRlc3REYXRhKHJhbmRvbURpc3QgOiBCb29sKSA6IEJ5dGVzICAgIHsKKyAgICAgICAgdmFyIHJldHZhbCA9IEJ5dGVzLmFsbG9jKDB4MTAwKTsKKyAgICAgICAgdmFyIGluaXRMZW4gOiBJbnQgPSAocmV0dmFsLmxlbmd0aCA+IDB4MTAwID8gMHgxMDAgOiByZXR2YWwubGVuZ3RoKTsKKworICAgICAgICAvLyBsaW5lYXIgZGlzdHJpYnV0aW9uLCB1bmxlc3MgcmFuZG9tIGlzIHJlcXVlc3RlZAorICAgICAgICBpZiAoIXJhbmRvbURpc3QpIHsKKyAgICAgICAgICAgIGZvciAoaSBpbiAwIC4uLiBpbml0TGVuKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsLnNldChpLCBpICUgMHgxMDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJhbmRvbSBkaXN0cmlidXRpb24KKyAgICAgICAgZm9yIChpIGluIDAgLi4uIGluaXRMZW4pIHsKKyAgICAgICAgICAgIHJldHZhbC5zZXQoaSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpIGluIDEgLi4uIGluaXRMZW4pIHsKKyAgICAgICAgICAgIHdoaWxlKCB0cnVlKSB7CisgICAgICAgICAgICAgICAgdmFyIG5leHRQb3MgPSBTdGQucmFuZG9tKGluaXRMZW4pOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwuZ2V0KG5leHRQb3MpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsLnNldCggbmV4dFBvcywgaSAlIDB4MTAwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIENsaWVudFRlc3QoIHRyYW5zcG9ydCA6IFRUcmFuc3BvcnQsIHByb3RvY29sIDogVFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA6IEFyZ3VtZW50cywgcnNsdCA6IFRlc3RSZXN1bHRzKSA6IFZvaWQKKyAgICB7CisgICAgICAgIHZhciBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdEltcGwocHJvdG9jb2wscHJvdG9jb2wpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCF0cmFuc3BvcnQuaXNPcGVuKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IFRFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJ3VuYWJsZSB0byBvcGVuIHRyYW5zcG9ydDogJGUnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJ3VuYWJsZSB0byBvcGVuIHRyYW5zcG9ydDogJGUnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBzdGFydCA9IERhdGUubm93KCk7CisKKyAgICAgICAgcnNsdC5TdGFydFRlc3RHcm91cCggVGVzdFJlc3VsdHMuRVhJVENPREVfRkFJTEJJVF9FWENFUFRJT05TKTsKKworICAgICAgICAvLyBpZiBhcmcgPT0gIlhjZXB0aW9uIiB0aHJvdyBYY2VwdGlvbiB3aXRoIGVycm9yQ29kZSA9IDEwMDEgYW5kIG1lc3NhZ2UgPSBhcmcKKyAgICAgICAgdHJhY2UoJ3Rlc3RFeGNlcHRpb24oIlhjZXB0aW9uIiknKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpOworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGZhbHNlLCAndGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKSBzaG91bGQgdGhyb3cnKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IFhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggZS5tZXNzYWdlID09ICJYY2VwdGlvbiIsICd0ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpICAtICBlLm1lc3NhZ2UgPT0gIlhjZXB0aW9uIicpOworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGUuZXJyb3JDb2RlID09IDEwMDEsICd0ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpICAtICBlLmVycm9yQ29kZSA9PSAxMDAxJyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBURXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggZmFsc2UsICd0ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpICAtICAke2V9IDogJHtlLmVycm9yTXNnfScpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGZhbHNlLCAndGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKSAgLSAgJGUnKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIGFyZyA9PSAiVEV4Y2VwdGlvbiIgdGhyb3cgVEV4Y2VwdGlvbgorICAgICAgICB0cmFjZSgndGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpJyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpOworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGZhbHNlLCAndGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpIHNob3VsZCB0aHJvdycpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIHRydWUsICd0ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIikgIC0gICRlIDogJHtlLmVycm9yTXNnfScpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGZhbHNlLCAndGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpICAtICAkZScpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmVvcGVuIHRoZSB0cmFuc3BvcnQsIGp1c3QgaW4gY2FzZSB0aGUgc2VydmVyIGNsb3NlZCBoaXMgZW5kCisgICAgICAgIGlmICh0cmFuc3BvcnQuaXNPcGVuKCkpCisgICAgICAgICAgICB0cmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKworICAgICAgICAvLyBlbHNlIGRvIG5vdCB0aHJvdyBhbnl0aGluZworICAgICAgICB0cmFjZSgndGVzdEV4Y2VwdGlvbigiYmxhIiknKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJibGEiKTsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCB0cnVlLCAndGVzdEV4Y2VwdGlvbigiYmxhIikgc2hvdWxkIG5vdCB0aHJvdycpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGZhbHNlLCAndGVzdEV4Y2VwdGlvbigiYmxhIikgIC0gICR7ZX0gOiAke2UuZXJyb3JNc2d9Jyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKQorICAgICAgICB7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggZmFsc2UsICd0ZXN0RXhjZXB0aW9uKCJibGEiKSAgLSAgJGUnKTsKKyAgICAgICAgfQorCisgICAgICAgIHJzbHQuU3RhcnRUZXN0R3JvdXAoIFRlc3RSZXN1bHRzLkVYSVRDT0RFX0ZBSUxCSVRfQkFTRVRZUEVTKTsKKworICAgICAgICB0cmFjZSgndGVzdFZvaWQoKScpOworICAgICAgICBjbGllbnQudGVzdFZvaWQoKTsKKyAgICAgICAgdHJhY2UoJyA9IHZvaWQnKTsKKyAgICAgICAgcnNsdC5FeHBlY3QodHJ1ZSwidGVzdFZvaWQoKSIpOyAgLy8gYnVtcCBjb3VudGVyCisKKyAgICAgICAgdHJhY2UoJ3Rlc3RCb29sKCR7dHJ1ZX0pJyk7CisgICAgICAgIHZhciBiID0gY2xpZW50LnRlc3RCb29sKHRydWUpOworICAgICAgICB0cmFjZSgnID0gJGInKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoYiwgJyRiID09ICIke3RydWV9IicpOworICAgICAgICB0cmFjZSgndGVzdEJvb2woJHtmYWxzZX0pJyk7CisgICAgICAgIGIgPSBjbGllbnQudGVzdEJvb2woZmFsc2UpOworICAgICAgICB0cmFjZSgnID0gJGInKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoICEgYiwgJyRiID09ICIke2ZhbHNlfSInKTsKKworICAgICAgICB0cmFjZSgndGVzdFN0cmluZygiVGVzdCIpJyk7CisgICAgICAgIHZhciBzID0gY2xpZW50LnRlc3RTdHJpbmcoIlRlc3QiKTsKKyAgICAgICAgdHJhY2UoJyA9ICIkcyInKTsKKyAgICAgICAgcnNsdC5FeHBlY3QocyA9PSAiVGVzdCIsICckcyA9PSAiVGVzdCInKTsKKworICAgICAgICB0cmFjZSgndGVzdEJ5dGUoMSknKTsKKyAgICAgICAgdmFyIGk4ID0gY2xpZW50LnRlc3RCeXRlKDEpOworICAgICAgICB0cmFjZSgnID0gJGk4Jyk7CisgICAgICAgIHJzbHQuRXhwZWN0KGk4ID09IDEsICckaTggPT0gMScpOworCisgICAgICAgIHRyYWNlKCd0ZXN0STMyKC0xKScpOworICAgICAgICB2YXIgaTMyID0gY2xpZW50LnRlc3RJMzIoLTEpOworICAgICAgICB0cmFjZSgnID0gJGkzMicpOworICAgICAgICByc2x0LkV4cGVjdChpMzIgPT0gLTEsICckaTMyID09IC0xJyk7CisKKyAgICAgICAgdHJhY2UoJ3Rlc3RJNjQoLTM0MzU5NzM4MzY4KScpOworICAgICAgICB2YXIgaTY0ID0gY2xpZW50LnRlc3RJNjQoIEludDY0Lm1ha2UoIDB4RkZGRkZGRjgsIDB4MDAwMDAwMDApKTsgLy8gLTM0MzU5NzM4MzY4CisgICAgICAgIHRyYWNlKCcgPSAkaTY0Jyk7CisgICAgICAgIHJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCBpNjQsIEludDY0Lm1ha2UoIDB4RkZGRkZGRjgsIDB4MDAwMDAwMDApKSA9PSAwLAorICAgICAgICAgICAgICAgICAgICAgSW50NjQudG9TdHIoaTY0KSArIiA9PSAiK0ludDY0LnRvU3RyKEludDY0Lm1ha2UoIDB4RkZGRkZGRjgsIDB4MDAwMDAwMDApKSk7CisKKyAgICAgICAgLy8gZWRnZSBjYXNlOiB0aGUgbGFyZ2VzdCBuZWdhdGl2ZSBJbnQ2NCBoYXMgbm8gcG9zaXRpdmUgSW50NjQgZXF1aXZhbGVudAorICAgICAgICB0cmFjZSgndGVzdEk2NCgtOTIyMzM3MjAzNjg1NDc3NTgwOCknKTsKKyAgICAgICAgaTY0ID0gY2xpZW50LnRlc3RJNjQoIEludDY0Lm1ha2UoIDB4ODAwMDAwMDAsIDB4MDAwMDAwMDApKTsgLy8gLTkyMjMzNzIwMzY4NTQ3NzU4MDgKKyAgICAgICAgdHJhY2UoJyA9ICRpNjQnKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIEludDY0LmNvbXBhcmUoIGk2NCwgSW50NjQubWFrZSggMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCkpID09IDAsCisgICAgICAgICAgICAgICAgICAgICBJbnQ2NC50b1N0cihpNjQpICsiID09ICIrSW50NjQudG9TdHIoSW50NjQubWFrZSggMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCkpKTsKKworICAgICAgICB0cmFjZSgndGVzdERvdWJsZSg1LjMyNTA5ODIzNSknKTsKKyAgICAgICAgdmFyIGR1YiA9IGNsaWVudC50ZXN0RG91YmxlKDUuMzI1MDk4MjM1KTsKKyAgICAgICAgdHJhY2UoJyA9ICRkdWInKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoZHViID09IDUuMzI1MDk4MjM1LCAnJGR1YiA9PSA1LjMyNTA5ODIzNScpOworCisgICAgICAgIHZhciBiaW5PdXQgPSBQcmVwYXJlVGVzdERhdGEodHJ1ZSk7CisgICAgICAgIHRyYWNlKCd0ZXN0QmluYXJ5KCcrQnl0ZXNUb0hleChiaW5PdXQpKycpJyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgYmluSW4gPSBjbGllbnQudGVzdEJpbmFyeShiaW5PdXQpOworICAgICAgICAgICAgdHJhY2UoJ3Rlc3RCaW5hcnkoKSA9ICcrQnl0ZXNUb0hleChiaW5JbikpOworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGJpbkluLmxlbmd0aCA9PSBiaW5PdXQubGVuZ3RoLCAnJHtiaW5Jbi5sZW5ndGh9ID09ICR7YmluT3V0Lmxlbmd0aH0nKTsKKyAgICAgICAgICAgIHZhciBsZW4gPSAoKGJpbkluLmxlbmd0aCA8IGJpbk91dC5sZW5ndGgpICA/ICBiaW5Jbi5sZW5ndGggIDogYmluT3V0Lmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKG9mcyBpbiAwIC4uLiBsZW4pIHsKKyAgICAgICAgICAgICAgICBpZiAoYmluSW4uZ2V0KG9mcykgIT0gYmluT3V0LmdldChvZnMpKSB7CisgICAgICAgICAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJ3Rlc3RCaW5hcnkoJytCeXRlc1RvSGV4KGJpbk91dCkrJyk6IGNvbnRlbnQgbWlzbWF0Y2ggYXQgb2Zmc2V0ICRvZnMnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBUQXBwbGljYXRpb25FeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRyYWNlKCd0ZXN0QmluYXJ5KCcrQnl0ZXNUb0hleChiaW5PdXQpKycpOiAnK2UuZXJyb3JNc2cpOyAgLy8gbWF5IG5vdCBiZSBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlcgorICAgICAgICB9CisKKworICAgICAgICByc2x0LlN0YXJ0VGVzdEdyb3VwKCBUZXN0UmVzdWx0cy5FWElUQ09ERV9GQUlMQklUX1NUUlVDVFMpOworCisgICAgICAgIHRyYWNlKCd0ZXN0U3RydWN0KHsiWmVybyIsIDEsIC0zLCAtNX0pJyk7CisgICAgICAgIHZhciBvID0gbmV3IFh0cnVjdCgpOworICAgICAgICBvLnN0cmluZ190aGluZyA9ICJaZXJvIjsKKyAgICAgICAgby5ieXRlX3RoaW5nID0gMTsKKyAgICAgICAgby5pMzJfdGhpbmcgPSAtMzsKKyAgICAgICAgby5pNjRfdGhpbmcgPSBJbnQ2NC5tYWtlKDAsLTUpOworICAgICAgICB2YXIgaSA9IGNsaWVudC50ZXN0U3RydWN0KG8pOworICAgICAgICB0cmFjZSgnID0geyInICsgaS5zdHJpbmdfdGhpbmcgKyAnIiwgJyArIGkuYnl0ZV90aGluZyArJywgJworICAgICAgICAgICAgICAgICAgICAgICsgaS5pMzJfdGhpbmcgKycsICcrIEludDY0LnRvU3RyKGkuaTY0X3RoaW5nKSArICd9Jyk7CisgICAgICAgIHJzbHQuRXhwZWN0KCBpLnN0cmluZ190aGluZyA9PSBvLnN0cmluZ190aGluZywgImkuc3RyaW5nX3RoaW5nID09IG8uc3RyaW5nX3RoaW5nIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBpLmJ5dGVfdGhpbmcgPT0gby5ieXRlX3RoaW5nLCAiaS5ieXRlX3RoaW5nID09IG8uYnl0ZV90aGluZyIpOworICAgICAgICByc2x0LkV4cGVjdCggaS5pMzJfdGhpbmcgPT0gby5pMzJfdGhpbmcsICJpLmk2NF90aGluZyA9PSBvLmk2NF90aGluZyIpOworICAgICAgICByc2x0LkV4cGVjdCggaS5pMzJfdGhpbmcgPT0gby5pMzJfdGhpbmcsICJpLmk2NF90aGluZyA9PSBvLmk2NF90aGluZyIpOworCisgICAgICAgIHRyYWNlKCd0ZXN0TmVzdCh7MSwge1wiWmVyb1wiLCAxLCAtMywgLTV9LCA1fSknKTsKKyAgICAgICAgdmFyIG8yID0gbmV3IFh0cnVjdDIoKTsKKyAgICAgICAgbzIuYnl0ZV90aGluZyA9IDE7CisgICAgICAgIG8yLnN0cnVjdF90aGluZyA9IG87CisgICAgICAgIG8yLmkzMl90aGluZyA9IDU7CisgICAgICAgIHZhciBpMiA9IGNsaWVudC50ZXN0TmVzdChvMik7CisgICAgICAgIGkgPSBpMi5zdHJ1Y3RfdGhpbmc7CisgICAgICAgIHRyYWNlKCIgPSB7IiArIGkyLmJ5dGVfdGhpbmcgKyAiLCB7XCIiICsgaS5zdHJpbmdfdGhpbmcgKyAiXCIsICIKKyAgICAgICAgICAgICAgKyBpLmJ5dGVfdGhpbmcgKyAiLCAiICsgaS5pMzJfdGhpbmcgKyAiLCAiICsgSW50NjQudG9TdHIoaS5pNjRfdGhpbmcpICsgIn0sICIKKyAgICAgICAgICAgICAgKyBpMi5pMzJfdGhpbmcgKyAifSIpOworICAgICAgICByc2x0LkV4cGVjdCggaTIuYnl0ZV90aGluZyA9PSBvMi5ieXRlX3RoaW5nLCAiaTIuYnl0ZV90aGluZyA9PSBvMi5ieXRlX3RoaW5nIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBpMi5pMzJfdGhpbmcgPT0gbzIuaTMyX3RoaW5nLCAiaTIuaTMyX3RoaW5nID09IG8yLmkzMl90aGluZyIpOworICAgICAgICByc2x0LkV4cGVjdCggaS5zdHJpbmdfdGhpbmcgPT0gby5zdHJpbmdfdGhpbmcsICJpLnN0cmluZ190aGluZyA9PSBvLnN0cmluZ190aGluZyIpOworICAgICAgICByc2x0LkV4cGVjdCggaS5ieXRlX3RoaW5nID09IG8uYnl0ZV90aGluZywgImkuYnl0ZV90aGluZyA9PSBvLmJ5dGVfdGhpbmciKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIGkuaTMyX3RoaW5nID09IG8uaTMyX3RoaW5nLCAiaS5pMzJfdGhpbmcgPT0gby5pMzJfdGhpbmciKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIEludDY0LmNvbXBhcmUoIGkuaTY0X3RoaW5nLCBvLmk2NF90aGluZykgPT0gMCwgImkuaTY0X3RoaW5nID09IG8uaTY0X3RoaW5nIik7CisKKworICAgICAgICByc2x0LlN0YXJ0VGVzdEdyb3VwKCBUZXN0UmVzdWx0cy5FWElUQ09ERV9GQUlMQklUX0NPTlRBSU5FUlMpOworCisgICAgICAgIHZhciBtYXBvdXQgPSBuZXcgSW50TWFwPCBoYXhlLkludDMyPigpOworICAgICAgICBmb3IgKCBqIGluIDAgLi4uIDUpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1hcG91dC5zZXQoaiwgaiAtIDEwKTsKKyAgICAgICAgfQorICAgICAgICB0cmFjZSgidGVzdE1hcCh7Iik7CisgICAgICAgIHZhciBmaXJzdCA6IEJvb2wgPSB0cnVlOworICAgICAgICBmb3IoIGtleSBpbiBtYXBvdXQua2V5cygpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyYWNlKGtleSArICIgPT4gIiArIG1hcG91dC5nZXQoa2V5KSk7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2UoIn0pIik7CisKKyAgICAgICAgdmFyIG1hcGluID0gY2xpZW50LnRlc3RNYXAobWFwb3V0KTsKKworICAgICAgICB0cmFjZSgiID0geyIpOworICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgIGZvcigga2V5IGluIG1hcGluLmtleXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhY2UoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFjZShrZXkgKyAiID0+ICIgKyBtYXBpbi5nZXQoa2V5KSk7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggbWFwaW4uZ2V0KGtleSkgPT0gbWFwb3V0LmdldChrZXkpLCAnIG1hcGluLmdldCgka2V5KSA9PSBtYXBvdXQuZ2V0KCRrZXkpJyk7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2UoIn0iKTsKKyAgICAgICAgZm9yKCBrZXkgaW4gbWFwb3V0LmtleXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcnNsdC5FeHBlY3QobWFwaW4uZXhpc3RzKGtleSksICdtYXBpbi5leGlzdHMoJGtleSknKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBsaXN0b3V0ID0gbmV3IExpc3Q8SW50PigpOworICAgICAgICBmb3IgKGogaW4gLTIgLi4uIDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpc3RvdXQuYWRkKGopOworICAgICAgICB9CisgICAgICAgIHRyYWNlKCJ0ZXN0TGlzdCh7Iik7CisgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yKCBqIGluIGxpc3RvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhY2Uoaik7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2UoIn0pIik7CisKKyAgICAgICAgdmFyIGxpc3RpbiA9IGNsaWVudC50ZXN0TGlzdChsaXN0b3V0KTsKKworICAgICAgICB0cmFjZSgiID0geyIpOworICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgIGZvciggaiBpbiBsaXN0aW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhY2Uoaik7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2UoIn0iKTsKKworICAgICAgICByc2x0LkV4cGVjdChsaXN0aW4ubGVuZ3RoID09IGxpc3RvdXQubGVuZ3RoLCAibGlzdGluLmxlbmd0aCA9PSBsaXN0b3V0Lmxlbmd0aCIpOworICAgICAgICB2YXIgbGl0ZXJvdXQgPSBsaXN0b3V0Lml0ZXJhdG9yKCk7CisgICAgICAgIHZhciBsaXRlcmluID0gbGlzdGluLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlKCBsaXRlcmluLmhhc05leHQoKSkgeworICAgICAgICAgICAgcnNsdC5FeHBlY3QobGl0ZXJpbi5uZXh0KCkgPT0gbGl0ZXJvdXQubmV4dCgpLCAibGl0ZXJpbltpXSA9PSBsaXRlcm91dFtpXSIpOworICAgICAgICB9CisKKyAgICAgICAgLy9zZXQKKyAgICAgICAgdmFyIHNldG91dCA9IG5ldyBJbnRTZXQoKTsKKyAgICAgICAgZm9yIChqIGluIC0yIC4uLiAzKQorICAgICAgICB7CisgICAgICAgICAgICBzZXRvdXQuYWRkKGopOworICAgICAgICB9CisgICAgICAgIHRyYWNlKCJ0ZXN0U2V0KHsiKTsKKyAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IoIGogaW4gc2V0b3V0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyYWNlKGopOworICAgICAgICB9CisgICAgICAgIHRyYWNlKCJ9KSIpOworCisgICAgICAgIHZhciBzZXRpbiA9IGNsaWVudC50ZXN0U2V0KHNldG91dCk7CisKKyAgICAgICAgdHJhY2UoIiA9IHsiKTsKKyAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IoIGogaW4gc2V0aW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhY2Uoaik7CisgICAgICAgICAgICByc2x0LkV4cGVjdChzZXRvdXQuY29udGFpbnMoaiksICdzZXRvdXQuY29udGFpbnMoJGopJyk7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2UoIn0iKTsKKyAgICAgICAgcnNsdC5FeHBlY3Qoc2V0aW4uc2l6ZSA9PSBzZXRvdXQuc2l6ZSwgInNldGluLmxlbmd0aCA9PSBzZXRvdXQubGVuZ3RoIik7CisKKworICAgICAgICByc2x0LlN0YXJ0VGVzdEdyb3VwKCBUZXN0UmVzdWx0cy5FWElUQ09ERV9GQUlMQklUX0JBU0VUWVBFUyk7CisKKyAgICAgICAgdHJhY2UoInRlc3RFbnVtKE9ORSkiKTsKKyAgICAgICAgdmFyIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6Lk9ORSk7CisgICAgICAgIHRyYWNlKCIgPSAiICsgcmV0KTsKKyAgICAgICAgcnNsdC5FeHBlY3QocmV0ID09IE51bWJlcnouT05FLCAnJHJldCA9PSBOdW1iZXJ6Lk9ORScpOworCisgICAgICAgIHRyYWNlKCJ0ZXN0RW51bShUV08pIik7CisgICAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LlRXTyk7CisgICAgICAgIHRyYWNlKCIgPSAiICsgcmV0KTsKKyAgICAgICAgcnNsdC5FeHBlY3QocmV0ID09IE51bWJlcnouVFdPLCAnJHJldCA9PSBOdW1iZXJ6LlRXTycpOworCisgICAgICAgIHRyYWNlKCJ0ZXN0RW51bShUSFJFRSkiKTsKKyAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouVEhSRUUpOworICAgICAgICB0cmFjZSgiID0gIiArIHJldCk7CisgICAgICAgIHJzbHQuRXhwZWN0KHJldCA9PSBOdW1iZXJ6LlRIUkVFLCAnJHJldCA9PSBOdW1iZXJ6LlRIUkVFJyk7CisKKyAgICAgICAgdHJhY2UoInRlc3RFbnVtKEZJVkUpIik7CisgICAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LkZJVkUpOworICAgICAgICB0cmFjZSgiID0gIiArIHJldCk7CisgICAgICAgIHJzbHQuRXhwZWN0KHJldCA9PSBOdW1iZXJ6LkZJVkUsICckcmV0ID09IE51bWJlcnouRklWRScpOworCisgICAgICAgIHRyYWNlKCJ0ZXN0RW51bShFSUdIVCkiKTsKKyAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouRUlHSFQpOworICAgICAgICB0cmFjZSgiID0gIiArIHJldCk7CisgICAgICAgIHJzbHQuRXhwZWN0KHJldCA9PSBOdW1iZXJ6LkVJR0hULCAnJHJldCA9PSBOdW1iZXJ6LkVJR0hUJyk7CisKKyAgICAgICAgdHJhY2UoInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiKTsKKyAgICAgICAgdmFyIHVpZCA9IGNsaWVudC50ZXN0VHlwZWRlZiggSW50NjQubWFrZSggMHgxMTlEMCwgMHg3RTA4NjcxQikpOyAgLy8gMzA5ODU4MjM1MDgyNTIzCisgICAgICAgIHRyYWNlKCIgPSAiICsgdWlkKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIEludDY0LmNvbXBhcmUoIHVpZCwgSW50NjQubWFrZSggMHgxMTlEMCwgMHg3RTA4NjcxQikpID09IDAsCisgICAgICAgICAgICAgICAgICAgICBJbnQ2NC50b1N0cih1aWQpKyIgPT0gIitJbnQ2NC50b1N0cihJbnQ2NC5tYWtlKCAweDExOUQwLCAweDdFMDg2NzFCKSkpOworCisKKyAgICAgICAgcnNsdC5TdGFydFRlc3RHcm91cCggVGVzdFJlc3VsdHMuRVhJVENPREVfRkFJTEJJVF9DT05UQUlORVJTKTsKKworICAgICAgICB0cmFjZSgidGVzdE1hcE1hcCgxKSIpOworICAgICAgICB2YXIgbW0gPSBjbGllbnQudGVzdE1hcE1hcCgxKTsKKyAgICAgICAgdHJhY2UoIiA9IHsiKTsKKyAgICAgICAgZm9yKCBrZXkgaW4gbW0ua2V5cygpKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZShrZXkgKyAiID0+IHsiKTsKKyAgICAgICAgICAgIHZhciBtMiA9IG1tLmdldChrZXkpOworICAgICAgICAgICAgZm9yKCBrMiBpbiBtMi5rZXlzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhY2UoazIgKyAiID0+ICIgKyBtMi5nZXQoazIpICsgIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFjZSgifSwgIik7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2UoIn0iKTsKKworICAgICAgICB2YXIgcG9zID0gbW0uZ2V0KDQpOworICAgICAgICB2YXIgbmVnID0gbW0uZ2V0KC00KTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIChwb3MgIT0gbnVsbCkgJiYgKG5lZyAhPSBudWxsKSwgIihwb3MgIT0gbnVsbCkgJiYgKG5lZyAhPSBudWxsKSIpOworICAgICAgICBmb3IgKGkgaW4gMSAuLi4gNSkgeworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIHBvcy5nZXQoaSkgPT0gaSwgJ3Bvcy5nZXQoJGkpID09ICRpJyk7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggbmVnLmdldCgtaSkgPT0gLWksICduZWcuZ2V0KC0kaSkgPT0gLSRpJyk7CisgICAgICAgIH0KKyAgICAgICAgcnNsdC5FeHBlY3QoICEgcG9zLmV4aXN0cygwKSwgJyFwb3MuZXhpc3RzKDApJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KCAhIG5lZy5leGlzdHMoLTApLCAnIW5lZy5leGlzdHMoLTApJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KCAhIHBvcy5leGlzdHMoNDIpLCAnIXBvcy5leGlzdHMoNDIpJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KCAhIG5lZy5leGlzdHMoLTQyKSwgJyFuZWcuZXhpc3RzKC00MiknKTsKKworCisgICAgICAgIHJzbHQuU3RhcnRUZXN0R3JvdXAoIFRlc3RSZXN1bHRzLkVYSVRDT0RFX0ZBSUxCSVRfU1RSVUNUUyk7CisKKyAgICAgICAgdmFyIGluc2FuZSA9IG5ldyBJbnNhbml0eSgpOworICAgICAgICBpbnNhbmUudXNlck1hcCA9IG5ldyBJbnRNYXA8IEludDY0PigpOworICAgICAgICBpbnNhbmUudXNlck1hcC5zZXQoIE51bWJlcnouRklWRSwgSW50NjQubWFrZSgwLDUwMDApKTsKKyAgICAgICAgdmFyIHRydWNrID0gbmV3IFh0cnVjdCgpOworICAgICAgICB0cnVjay5zdHJpbmdfdGhpbmcgPSAiVHJ1Y2siOworICAgICAgICB0cnVjay5ieXRlX3RoaW5nID0gODsKKyAgICAgICAgdHJ1Y2suaTMyX3RoaW5nID0gODsKKyAgICAgICAgdHJ1Y2suaTY0X3RoaW5nID0gSW50NjQubWFrZSgwLDgpOworICAgICAgICBpbnNhbmUueHRydWN0cyA9IG5ldyBMaXN0PFh0cnVjdD4oKTsKKyAgICAgICAgaW5zYW5lLnh0cnVjdHMuYWRkKHRydWNrKTsKKyAgICAgICAgdHJhY2UoInRlc3RJbnNhbml0eSgpIik7CisgICAgICAgIHZhciB3aG9hID0gY2xpZW50LnRlc3RJbnNhbml0eShpbnNhbmUpOworICAgICAgICB0cmFjZSgiID0geyIpOworICAgICAgICBmb3IoIGtleSBpbiB3aG9hLmtleXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHZhbCA9IHdob2EuZ2V0KGtleSk7CisgICAgICAgICAgICB0cmFjZShrZXkgKyAiID0+IHsiKTsKKworICAgICAgICAgICAgZm9yKCBrMiBpbiB2YWwua2V5cygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB2MiA9IHZhbC5nZXQoazIpOworCisgICAgICAgICAgICAgICAgdHJhY2UoazIgKyAiID0+IHsiKTsKKyAgICAgICAgICAgICAgICB2YXIgdXNlck1hcCA9IHYyLnVzZXJNYXA7CisKKyAgICAgICAgICAgICAgICB0cmFjZSgieyIpOworICAgICAgICAgICAgICAgIGlmICh1c2VyTWFwICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIGszIGluIHVzZXJNYXAua2V5cygpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZShrMyArICIgPT4gIiArIHVzZXJNYXAuZ2V0KGszKSArICIsICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYWNlKCJudWxsIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYWNlKCJ9LCAiKTsKKworICAgICAgICAgICAgICAgIHZhciB4dHJ1Y3RzID0gdjIueHRydWN0czsKKworICAgICAgICAgICAgICAgIHRyYWNlKCJ7Iik7CisgICAgICAgICAgICAgICAgaWYgKHh0cnVjdHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggeCBpbiB4dHJ1Y3RzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZSgie1wiIiArIHguc3RyaW5nX3RoaW5nICsgIlwiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHguYnl0ZV90aGluZyArICIsICIgKyB4LmkzMl90aGluZyArICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgeC5pMzJfdGhpbmcgKyAifSwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2UoIm51bGwiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhY2UoIn0iKTsKKworICAgICAgICAgICAgICAgIHRyYWNlKCJ9LCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyYWNlKCJ9LCAiKTsKKyAgICAgICAgfQorICAgICAgICB0cmFjZSgifSIpOworCisKKwkJLyoqCisJCSogU28geW91IHRoaW5rIHlvdSd2ZSBnb3QgdGhpcyBhbGwgd29ya2VkLCBvdXQgZWg/CisJCSoKKwkJKiBDcmVhdGVzIGEgdGhlIHJldHVybmVkIG1hcCB3aXRoIHRoZXNlIHZhbHVlcyBhbmQgcHJpbnRzIGl0IG91dDoKKwkJKiAgIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisJCSogICAgICAgICAgICAzID0+IGFyZ3VtZW50LAorCQkqICAgICAgICAgIH0sCisJCSogICAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAorCQkqICAgfQorCQkqIEByZXR1cm4gbWFwPFVzZXJJZCwgbWFwPE51bWJlcnosSW5zYW5pdHk+PiAtIGEgbWFwIHdpdGggdGhlIGFib3ZlIHZhbHVlcworCQkqLworCQkKKyAgICAgICAgdmFyIGZpcnN0X21hcCA9IHdob2EuZ2V0KEludDY0Lm1ha2UoMCwxKSk7CisgICAgICAgIHZhciBzZWNvbmRfbWFwID0gd2hvYS5nZXQoSW50NjQubWFrZSgwLDIpKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIChmaXJzdF9tYXAgIT0gbnVsbCkgJiYgKHNlY29uZF9tYXAgIT0gbnVsbCksICIoZmlyc3RfbWFwICE9IG51bGwpICYmIChzZWNvbmRfbWFwICE9IG51bGwpIik7CisgICAgICAgIGlmICgoZmlyc3RfbWFwICE9IG51bGwpICYmIChzZWNvbmRfbWFwICE9IG51bGwpKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY3JhenkyID0gZmlyc3RfbWFwLmdldChOdW1iZXJ6LlRXTyk7CisgICAgICAgICAgICB2YXIgY3JhenkzID0gZmlyc3RfbWFwLmdldChOdW1iZXJ6LlRIUkVFKTsKKyAgICAgICAgICAgIHZhciBsb29uZXkgPSBzZWNvbmRfbWFwLmdldChOdW1iZXJ6LlNJWCk7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggKGNyYXp5MiAhPSBudWxsKSAmJiAoY3JhenkzICE9IG51bGwpICYmIChsb29uZXkgIT0gbnVsbCksCisgICAgICAgICAgICAgICAgICAgICAgICAiKGNyYXp5MiAhPSBudWxsKSAmJiAoY3JhenkzICE9IG51bGwpICYmIChsb29uZXkgIT0gbnVsbCkiKTsKKworICAgICAgICAgICAgdmFyIGNyejJpdGVyID0gY3JhenkyLnh0cnVjdHMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHZhciBjcnozaXRlciA9IGNyYXp5My54dHJ1Y3RzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggY3J6Mml0ZXIuaGFzTmV4dCgpICYmIGNyejNpdGVyLmhhc05leHQoKSwgImNyejJpdGVyLmhhc05leHQoKSAmJiBjcnozaXRlci5oYXNOZXh0KCkiKTsKKyAgICAgICAgICAgIHZhciBnb29kYnllMiA9IGNyejJpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIHZhciBnb29kYnllMyA9IGNyejNpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCAhIChjcnoyaXRlci5oYXNOZXh0KCkgfHwgY3J6M2l0ZXIuaGFzTmV4dCgpKSwgIiEgKGNyejJpdGVyLmhhc05leHQoKSB8fCBjcnozaXRlci5oYXNOZXh0KCkpIik7CisKKwkJCXJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCBjcmF6eTIudXNlck1hcC5nZXQoTnVtYmVyei5GSVZFKSwgaW5zYW5lLnVzZXJNYXAuZ2V0KE51bWJlcnouRklWRSkpID09IDAsICJjcmF6eTIudXNlck1hcFs1XSA9PSBpbnNhbmUudXNlck1hcFs1XSIpOworCQkJcnNsdC5FeHBlY3QoIHRydWNrLnN0cmluZ190aGluZyA9PSBnb29kYnllMi5zdHJpbmdfdGhpbmcsICJ0cnVjay5zdHJpbmdfdGhpbmcgPT0gZ29vZGJ5ZTIuc3RyaW5nX3RoaW5nIik7CisJCQlyc2x0LkV4cGVjdCggdHJ1Y2suYnl0ZV90aGluZyAgPT0gZ29vZGJ5ZTIuYnl0ZV90aGluZywgInRydWNrLmJ5dGVfdGhpbmcgID09IGdvb2RieWUyLmJ5dGVfdGhpbmciKTsKKwkJCXJzbHQuRXhwZWN0KCB0cnVjay5pMzJfdGhpbmcgID09IGdvb2RieWUyLmkzMl90aGluZywgInRydWNrLmkzMl90aGluZyAgPT0gZ29vZGJ5ZTIuaTMyX3RoaW5nIik7CisJCQlyc2x0LkV4cGVjdCggSW50NjQuY29tcGFyZSggdHJ1Y2suaTY0X3RoaW5nLCBnb29kYnllMi5pNjRfdGhpbmcpID09IDAsICJ0cnVjay5pNjRfdGhpbmcgID09IGdvb2RieWUyLmk2NF90aGluZyIpOworCisJCQlyc2x0LkV4cGVjdCggSW50NjQuY29tcGFyZSggY3JhenkzLnVzZXJNYXAuZ2V0KE51bWJlcnouRklWRSksIGluc2FuZS51c2VyTWFwLmdldChOdW1iZXJ6LkZJVkUpKSA9PSAwLCAiY3JhenkzLnVzZXJNYXBbNV0gPT0gaW5zYW5lLnVzZXJNYXBbNV0iKTsKKwkJCXJzbHQuRXhwZWN0KCB0cnVjay5zdHJpbmdfdGhpbmcgPT0gZ29vZGJ5ZTMuc3RyaW5nX3RoaW5nLCAidHJ1Y2suc3RyaW5nX3RoaW5nID09IGdvb2RieWUzLnN0cmluZ190aGluZyIpOworCQkJcnNsdC5FeHBlY3QoIHRydWNrLmJ5dGVfdGhpbmcgID09IGdvb2RieWUzLmJ5dGVfdGhpbmcsICJ0cnVjay5ieXRlX3RoaW5nICA9PSBnb29kYnllMy5ieXRlX3RoaW5nIik7CisJCQlyc2x0LkV4cGVjdCggdHJ1Y2suaTMyX3RoaW5nICA9PSBnb29kYnllMy5pMzJfdGhpbmcsICJ0cnVjay5pMzJfdGhpbmcgID09IGdvb2RieWUzLmkzMl90aGluZyIpOworCQkJcnNsdC5FeHBlY3QoIEludDY0LmNvbXBhcmUoIHRydWNrLmk2NF90aGluZywgZ29vZGJ5ZTMuaTY0X3RoaW5nKSA9PSAwLCAidHJ1Y2suaTY0X3RoaW5nICA9PSBnb29kYnllMy5pNjRfdGhpbmciKTsKKwkJCQorCQkJcnNsdC5FeHBlY3QoICEgbG9vbmV5LmlzU2V0KDEpLCAiISBsb29uZXkuaXNTZXQoMSkiKTsKKwkJCXJzbHQuRXhwZWN0KCAhIGxvb25leS5pc1NldCgyKSwgIiEgbG9vbmV5LmlzU2V0KDIpIik7CisgICAgICAgIH0KKworICAgICAgICB2YXIgYXJnMCA9IDE7CisgICAgICAgIHZhciBhcmcxID0gMjsKKyAgICAgICAgdmFyIGFyZzIgPSBJbnQ2NC5tYWtlKCAweDdGRkZGRkZGLDB4RkZGRkZGRkYpOworICAgICAgICB2YXIgbXVsdGlEaWN0ID0gbmV3IEludE1hcDwgU3RyaW5nPigpOworICAgICAgICBtdWx0aURpY3Quc2V0KDEsICJvbmUiKTsKKyAgICAgICAgdmFyIGFyZzQgPSBOdW1iZXJ6LkZJVkU7CisgICAgICAgIHZhciBhcmc1ID0gSW50NjQubWFrZSgwLDUwMDAwMDApOworICAgICAgICB0cmFjZSgiVGVzdCBNdWx0aSgiICsgYXJnMCArICIsIiArIGFyZzEgKyAiLCIgKyBhcmcyICsgIiwiICsgbXVsdGlEaWN0ICsgIiwiICsgYXJnNCArICIsIiArIGFyZzUgKyAiKSIpOworICAgICAgICB2YXIgbXVsdGlSZXNwb25zZSA9IGNsaWVudC50ZXN0TXVsdGkoYXJnMCwgYXJnMSwgYXJnMiwgbXVsdGlEaWN0LCBhcmc0LCBhcmc1KTsKKyAgICAgICAgdHJhY2UoIiA9IFh0cnVjdChieXRlX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLmJ5dGVfdGhpbmcgKyAiLHN0cmluZ190aGluZzoiICsgbXVsdGlSZXNwb25zZS5zdHJpbmdfdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgKyAiLGkzMl90aGluZzoiICsgbXVsdGlSZXNwb25zZS5pMzJfdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgKyAiLGk2NF90aGluZzoiICsgSW50NjQudG9TdHIobXVsdGlSZXNwb25zZS5pNjRfdGhpbmcpICsgIikiKTsKKworICAgICAgICByc2x0LkV4cGVjdCggbXVsdGlSZXNwb25zZS5zdHJpbmdfdGhpbmcgPT0gIkhlbGxvMiIsICdtdWx0aVJlc3BvbnNlLlN0cmluZ190aGluZyA9PSAiSGVsbG8yIicpOworICAgICAgICByc2x0LkV4cGVjdCggbXVsdGlSZXNwb25zZS5ieXRlX3RoaW5nID09IGFyZzAsICdtdWx0aVJlc3BvbnNlLkJ5dGVfdGhpbmcgPT0gYXJnMCcpOworICAgICAgICByc2x0LkV4cGVjdCggbXVsdGlSZXNwb25zZS5pMzJfdGhpbmcgPT0gYXJnMSwgJ211bHRpUmVzcG9uc2UuSTMyX3RoaW5nID09IGFyZzEnKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIEludDY0LmNvbXBhcmUoIG11bHRpUmVzcG9uc2UuaTY0X3RoaW5nLCBhcmcyKSA9PSAwLCAnbXVsdGlSZXNwb25zZS5JNjRfdGhpbmcgPT0gYXJnMicpOworCisKKyAgICAgICAgcnNsdC5TdGFydFRlc3RHcm91cCggMCk7CisKKyAgICAgICAgdHJhY2UoIlRlc3QgT25ld2F5KDEpIik7CisgICAgICAgIGNsaWVudC50ZXN0T25ld2F5KDEpOworCisgICAgICAgIGlmKCAhIGFyZ3Muc2tpcFNwZWVkVGVzdCkgeworICAgICAgICAgICAgdHJhY2UoIlRlc3QgQ2FsbHRpbWUoKSIpOworICAgICAgICAgICAgdmFyIGRpZmZ0ID0gVGltZXIuc3RhbXAoKTsKKyAgICAgICAgICAgIGZvciAoIGsgaW4gMCAuLi4gMTAwMCkgeworICAgICAgICAgICAgICAgIGNsaWVudC50ZXN0Vm9pZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGlmZnQgPSBNYXRoLnJvdW5kKCAxMDAwICogKFRpbWVyLnN0YW1wKCkgLSBkaWZmdCkpIC8gMTAwMDsKKyAgICAgICAgICAgIHRyYWNlKCckZGlmZnQgbXMgcGVyIHRlc3RWb2lkKCkgY2FsbCcpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL3NyYy9UZXN0TWFjcm8uaHggYi90ZXN0L2hheGUvc3JjL1Rlc3RNYWNyby5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjIwNzYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL3NyYy9UZXN0TWFjcm8uaHgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIDsKKworaW1wb3J0IGhheGUubWFjcm8uQ29udGV4dDsKK2ltcG9ydCBoYXhlLm1hY3JvLkV4cHI7CisKKy8qKioqCisgKiBJZiB5b3UgY2FsbCB0aGUgVGhyaWZ0IGNvbXBpbGVyIHRoaXMgd2F5IChlLmcuIGJ5IGNoYW5naW5nIHRoZSBwcmVidWlsZCBjb21tYW5kKQorICoKKyAqICAgICB0aHJpZnQgLXIgLWdlbiBoYXhlOmJ1aWxkbWFjcm89VGVzdE1hY3JvLmhhbmRsZSgpICAgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKyAqCisgKiB0aGUgVGVzdE1hY3JvLmhhbmRsZSgpIGZ1bmN0aW9uIGltcGxlbWVudGVkIGJlbG93IGlzIGNhbGxlZCBmb3IgZWFjaCBnZW5lcmF0ZWQgY2xhc3MKKyAqIGFuZCBpbnRlcmZhY2UuIFVzZSAidGhyaWZ0IC0taGVscCIgdG8gZ2V0IG1vcmUgaW5mbyBhYm91dCBvdGhlciBhdmFpbGFibGUgb3B0aW9ucy4KKyAqLworY2xhc3MgVGVzdE1hY3JvCit7CisgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaGFuZGxlKCApIDogQXJyYXk8IEZpZWxkPiB7CisgICAgdHJhY2UoJ1Rlc3RNYWNybyBjYWxsZWQgZm9yICcgKyBDb250ZXh0LmdldExvY2FsVHlwZSgpKTsKKyAgICByZXR1cm4gQ29udGV4dC5nZXRCdWlsZEZpZWxkcygpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9zcmMvVGVzdFNlcnZlci5oeCBiL3Rlc3QvaGF4ZS9zcmMvVGVzdFNlcnZlci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTBjOGYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL3NyYy9UZXN0U2VydmVyLmh4CkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7CisKK2ltcG9ydCB0aHJpZnQudGVzdC4qOyAgLy8gZ2VuZXJhdGVkIGNvZGUKKworCitjbGFzcyBUZXN0U2VydmVyCit7CisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBFeGVjdXRlKGFyZ3MgOiBBcmd1bWVudHMpIDogIFZvaWQKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUcmFuc3BvcnQKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgOiBUU2VydmVyVHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgIHN3aXRjaCggYXJncy50cmFuc3BvcnQpIHsKKyAgICAgICAgICAgIGNhc2Ugc29ja2V0OgorICAgICAgICAgICAgICAgIHRyYWNlKCItIHNvY2tldCBwb3J0ICIrYXJncy5wb3J0KTsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldCggYXJncy5wb3J0KTsKKyAgICAgICAgICAgIGNhc2UgaHR0cDoKKyAgICAgICAgICAgICAgICB0cmFjZSgiLSBodHRwIik7CisgICAgICAgICAgICAgICAgI2lmICFwaHB3ZWJzZXJ2ZXIKKyAgICAgICAgICAgICAgICAgIHRocm93ICJIVFRQIHNlcnZlciBub3QgaW1wbGVtZW50ZWQgeWV0IjsKKyAgICAgICAgICAgICAgICAgLy90cmFuc3BvcnQgPSBuZXcgVEh0dHBTZXJ2ZXIoIHRhcmdldEhvc3QpOworICAgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gICAgbmV3IFRXcmFwcGluZ1NlcnZlclRyYW5zcG9ydCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUU3RyZWFtVHJhbnNwb3J0KAorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVEZpbGVTdHJlYW0oInBocDovL2lucHV0IiwgUmVhZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBURmlsZVN0cmVhbSgicGhwOi8vb3V0cHV0IiwgQXBwZW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgI2VuZAorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyAiVW5oYW5kbGVkIHRyYW5zcG9ydCI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG9wdGlvbmFsOiBsYXllcmVkIHRyYW5zcG9ydAorICAgICAgICAgICAgdmFyIHRyYW5zZmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgICAgIGlmICggYXJncy5mcmFtZWQpIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgiLSBmcmFtZWQgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgICAgdHJhbnNmYWN0b3J5ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGFyZ3MuYnVmZmVyZWQpIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgiLSBidWZmZXJlZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICB0cmFuc2ZhY3RvcnkgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBwcm90b2NvbAorICAgICAgICAgICAgdmFyIHByb3RmYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeSA9IG51bGw7CisgICAgICAgICAgICBzd2l0Y2goIGFyZ3MucHJvdG9jb2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIGJpbmFyeToKKyAgICAgICAgICAgICAgICB0cmFjZSgiLSBiaW5hcnkgcHJvdG9jb2wiKTsKKyAgICAgICAgICAgICAgICBwcm90ZmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCk7CisgICAgICAgICAgICBjYXNlIGpzb246CisgICAgICAgICAgICAgICAgdHJhY2UoIi0ganNvbiBwcm90b2NvbCIpOworICAgICAgICAgICAgICAgIHByb3RmYWN0b3J5ID0gbmV3IFRKU09OUHJvdG9jb2xGYWN0b3J5KCk7CisgICAgICAgICAgICBjYXNlIGNvbXBhY3Q6CisgICAgICAgICAgICAgICAgdHJhY2UoIi0gY29tcGFjdCBwcm90b2NvbCIpOworICAgICAgICAgICAgICAgIHByb3RmYWN0b3J5ID0gbmV3IFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCk7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gUHJvY2Vzc29yCisgICAgICAgICAgICB2YXIgaGFuZGxlciA9IG5ldyBUZXN0U2VydmVySGFuZGxlcigpOworICAgICAgICAgICAgdmFyIHByb2Nlc3NvciA9IG5ldyBUaHJpZnRUZXN0UHJvY2Vzc29yKGhhbmRsZXIpOworCisgICAgICAgICAgICAvLyBTaW1wbGUgU2VydmVyCisgICAgICAgICAgICB2YXIgc2VydmVyIDogVFNlcnZlciA9IG51bGw7CisgICAgICAgICAgICBzd2l0Y2goIGFyZ3Muc2VydmVydHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2Ugc2ltcGxlOgorICAgICAgICAgICAgICAgIHZhciBzaW1wbGVTZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlciggcHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRyYW5zZmFjdG9yeSwgcHJvdGZhY3RvcnkpOworICAgICAgICAgICAgICAgICNpZiBwaHB3ZWJzZXJ2ZXIKKyAgICAgICAgICAgICAgICBzaW1wbGVTZXJ2ZXIucnVuT25jZSA9IHRydWU7CisgICAgICAgICAgICAgICAgI2VuZAorICAgICAgICAgICAgICAgIHNlcnZlciA9IHNpbXBsZVNlcnZlcjsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyAiVW5oYW5kbGVkIHNlcnZlciB0eXBlIjsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgLy8gU2VydmVyIGV2ZW50IGhhbmRsZXIKKyAgICAgICAgICAgIGlmKCBhcmdzLnNlcnZlckV2ZW50cykgeworICAgICAgICAgICAgICAgIHZhciBldmVudHMgPSBuZXcgVGVzdFNlcnZlckV2ZW50SGFuZGxlcigpOworICAgICAgICAgICAgICAgIHNlcnZlci5zZXRFdmVudEhhbmRsZXIoc2VydmVyRXZlbnRzKTsKKyAgICAgICAgICAgICAgICBoYW5kbGVyLnNlcnZlciA9IHNlcnZlckVuZ2luZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIC8vIFJ1biBpdAorICAgICAgICAgICAgc2VydmVyLlNlcnZlKCk7CisgICAgICAgICAgICB0cmFjZSgiZG9uZS4iKTsKKworICAgICAgICB9CisgICAgICAgIGNhdGNoICh4IDogVEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoJyR4ICR7eC5lcnJvcklEfSAke3guZXJyb3JNc2d9Jyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKHggOiBEeW5hbWljKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgnJHgnKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9zcmMvVGVzdFNlcnZlckV2ZW50SGFuZGxlci5oeCBiL3Rlc3QvaGF4ZS9zcmMvVGVzdFNlcnZlckV2ZW50SGFuZGxlci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTc1NjdjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL3NyYy9UZXN0U2VydmVyRXZlbnRIYW5kbGVyLmh4CkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworaW1wb3J0IHRocmlmdC50ZXN0Lio7ICAvLyBnZW5lcmF0ZWQgY29kZQorCisKK2NsYXNzIFRlc3RTZXJ2ZXJFdmVudEhhbmRsZXIgOiBUU2VydmVyRXZlbnRIYW5kbGVyCit7CisgICAgcHVibGljIGludCBjYWxsQ291bnQgPSAwOworICAgIHB1YmxpYyB2b2lkIHByZVNlcnZlKCkKKyAgICB7CisgICAgICAgIGNhbGxDb3VudCsrOworICAgIH0KKyAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZUNvbnRleHQoVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBpbnB1dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBvdXRwdXQpCisgICAgeworICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUNvbnRleHQoT2JqZWN0IHNlcnZlckNvbnRleHQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgaW5wdXQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgb3V0cHV0KQorICAgIHsKKyAgICAgICAgY2FsbENvdW50Kys7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NDb250ZXh0KE9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUaHJpZnQuVHJhbnNwb3J0LlRUcmFuc3BvcnQgdHJhbnNwb3J0KQorICAgIHsKKyAgICAgICAgY2FsbENvdW50Kys7CisgICAgfQorfQorCisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL3NyYy9UZXN0U2VydmVySGFuZGxlci5oeCBiL3Rlc3QvaGF4ZS9zcmMvVGVzdFNlcnZlckhhbmRsZXIuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhhMjU5MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9zcmMvVGVzdFNlcnZlckhhbmRsZXIuaHgKQEAgLTAsMCArMSw0NzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXIuKjsKKworaW1wb3J0IGhheGUuSW50MzI7CitpbXBvcnQgaGF4ZS5JbnQ2NDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuZHMuSW50TWFwOworaW1wb3J0IGhheGUuZHMuU3RyaW5nTWFwOworaW1wb3J0IGhheGUuZHMuT2JqZWN0TWFwOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuKjsgIC8vIGdlbmVyYXRlZCBjb2RlCisKKworY2xhc3MgVGVzdFNlcnZlckhhbmRsZXIgaW1wbGVtZW50cyBUaHJpZnRUZXN0IHsKKworICAgIHB1YmxpYyB2YXIgc2VydmVyOlRTZXJ2ZXI7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCkgeworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICJ0ZXN0Vm9pZCgpIiBhbmQgcmV0dXJucyBub3RoaW5nLgorICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RWb2lkKCk6Vm9pZAorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RWb2lkKCkiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAndGVzdEJvb2woIiVzIiknIHdoZXJlICclcycgd2l0aCB0aGluZyBhcyAndHJ1ZScgb3IgJ2ZhbHNlJworICAgICogQHBhcmFtIGJvb2wgIHRoaW5nIC0gdGhlIGJvb2wgZGF0YSB0byBwcmludAorICAgICogQHJldHVybiBib29sICAtIHJldHVybnMgdGhlIGJvb2wgJ3RoaW5nJworICAgICoKKyAgICAqIEBwYXJhbSB0aGluZworICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RCb29sKHRoaW5nIDogQm9vbCkgOiBCb29sCisgICAgeworICAgICAgICB0cmFjZSgndGVzdEJvb2woJHRoaW5nKScpOworICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludHMgJ3Rlc3RTdHJpbmcoIiVzIiknIHdpdGggdGhpbmcgYXMgJyVzJworICAgICogQHBhcmFtIHN0cmluZyB0aGluZyAtIHRoZSBzdHJpbmcgdG8gcHJpbnQKKyAgICAqIEByZXR1cm4gc3RyaW5nIC0gcmV0dXJucyB0aGUgc3RyaW5nICd0aGluZycKKyAgICAqCisgICAgKiBAcGFyYW0gdGhpbmcKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nKHRoaW5nOlN0cmluZyk6U3RyaW5nCisgICAgeworICAgICAgICB0cmFjZSgidGVzdHN0cmluZyhcIiIgKyB0aGluZyArICJcIikiKTsKKyAgICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICd0ZXN0Qnl0ZSgiJWQiKScgd2l0aCB0aGluZyBhcyAnJWQnCisgICAgKiBAcGFyYW0gYnl0ZSB0aGluZyAtIHRoZSBieXRlIHRvIHByaW50CisgICAgKiBAcmV0dXJuIGJ5dGUgLSByZXR1cm5zIHRoZSBieXRlICd0aGluZycKKyAgICAqCisgICAgKiBAcGFyYW0gdGhpbmcKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Qnl0ZSh0aGluZzpoYXhlLkludDMyKTpoYXhlLkludDMyCisgICAgeworICAgICAgICB0cmFjZSgidGVzdEJ5dGUoIiArIHRoaW5nICsgIikiKTsKKyAgICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICd0ZXN0STMyKCIlZCIpJyB3aXRoIHRoaW5nIGFzICclZCcKKyAgICAqIEBwYXJhbSBpMzIgdGhpbmcgLSB0aGUgaTMyIHRvIHByaW50CisgICAgKiBAcmV0dXJuIGkzMiAtIHJldHVybnMgdGhlIGkzMiAndGhpbmcnCisgICAgKgorICAgICogQHBhcmFtIHRoaW5nCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEkzMih0aGluZzpoYXhlLkludDMyKTpoYXhlLkludDMyCisgICAgeworICAgICAgICB0cmFjZSgidGVzdEkzMigiICsgdGhpbmcgKyAiKSIpOworICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludHMgJ3Rlc3RJNjQoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJworICAgICogQHBhcmFtIGk2NCB0aGluZyAtIHRoZSBpNjQgdG8gcHJpbnQKKyAgICAqIEByZXR1cm4gaTY0IC0gcmV0dXJucyB0aGUgaTY0ICd0aGluZycKKyAgICAqCisgICAgKiBAcGFyYW0gdGhpbmcKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STY0KHRoaW5nOmhheGUuSW50NjQpOmhheGUuSW50NjQKKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0STY0KCIgKyB0aGluZyArICIpIik7CisgICAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAndGVzdERvdWJsZSgiJWYiKScgd2l0aCB0aGluZyBhcyAnJWYnCisgICAgKiBAcGFyYW0gZG91YmxlIHRoaW5nIC0gdGhlIGRvdWJsZSB0byBwcmludAorICAgICogQHJldHVybiBkb3VibGUgLSByZXR1cm5zIHRoZSBkb3VibGUgJ3RoaW5nJworICAgICoKKyAgICAqIEBwYXJhbSB0aGluZworICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3REb3VibGUodGhpbmc6RmxvYXQpOkZsb2F0CisgICAgeworICAgICAgICB0cmFjZSgidGVzdERvdWJsZSgiICsgdGhpbmcgKyAiKSIpOworICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnRzICd0ZXN0QmluYXJ5KCIlcyIpJyB3aGVyZSAnJXMnIGlzIGEgaGV4LWZvcm1hdHRlZCBzdHJpbmcgb2YgdGhpbmcncyBkYXRhCisgICAgICogQHBhcmFtIGJpbmFyeSAgdGhpbmcgLSB0aGUgYmluYXJ5IGRhdGEgdG8gcHJpbnQKKyAgICAgKiBAcmV0dXJuIGJpbmFyeSAgLSByZXR1cm5zIHRoZSBiaW5hcnkgJ3RoaW5nJworICAgICAqCisgICAgICogQHBhcmFtIHRoaW5nCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RCaW5hcnkodGhpbmcgOiBoYXhlLmlvLkJ5dGVzKSA6IGhheGUuaW8uQnl0ZXMKKyAgICB7CisgICAgICAgIHZhciBoZXggPSAiIjsKKyAgICAgICAgZm9yICggaSBpbiAwIC4uLiB0aGluZy5sZW5ndGgpIHsKKyAgICAgICAgICAgIGhleCArPSBTdHJpbmdUb29scy5oZXgoIHRoaW5nLmdldChpKSwgMik7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2UoJ3Rlc3RCaW5hcnkoJGhleCknKTsKKyAgICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICd0ZXN0U3RydWN0KCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZAorICAgICogIGludG8gYSBzdHJpbmcgb2YgY29tbWEgc2VwYXJhdGVkIHZhbHVlcworICAgICogQHBhcmFtIFh0cnVjdCB0aGluZyAtIHRoZSBYdHJ1Y3QgdG8gcHJpbnQKKyAgICAqIEByZXR1cm4gWHRydWN0IC0gcmV0dXJucyB0aGUgWHRydWN0ICd0aGluZycKKyAgICAqCisgICAgKiBAcGFyYW0gdGhpbmcKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RydWN0KHRoaW5nOlh0cnVjdCk6WHRydWN0CisgICAgeworICAgICAgICB0cmFjZSgidGVzdFN0cnVjdCh7IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyB0aGluZy5zdHJpbmdfdGhpbmcgKyAiXCIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluZy5ieXRlX3RoaW5nICsgIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLmkzMl90aGluZyArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQ2NC50b1N0cih0aGluZy5pNjRfdGhpbmcpICsgIn0pIik7CisgICAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAndGVzdE5lc3QoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkCisgICAgKiAgaW50byBhIHN0cmluZyBvZiB0aGUgbmVzdGVkIHN0cnVjdAorICAgICogQHBhcmFtIFh0cnVjdDIgdGhpbmcgLSB0aGUgWHRydWN0MiB0byBwcmludAorICAgICogQHJldHVybiBYdHJ1Y3QyIC0gcmV0dXJucyB0aGUgWHRydWN0MiAndGhpbmcnCisgICAgKgorICAgICogQHBhcmFtIHRoaW5nCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE5lc3QobmVzdDpYdHJ1Y3QyKTpYdHJ1Y3QyCisgICAgeworICAgICAgICB2YXIgdGhpbmc6WHRydWN0ID0gbmVzdC5zdHJ1Y3RfdGhpbmc7CisgICAgICAgIHRyYWNlKCJ0ZXN0TmVzdCh7IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3QuYnl0ZV90aGluZyArICIsIHsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIHRoaW5nLnN0cmluZ190aGluZyArICJcIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLmJ5dGVfdGhpbmcgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuaTMyX3RoaW5nICsgIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIEludDY0LnRvU3RyKHRoaW5nLmk2NF90aGluZykgKyAifSwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3QuaTMyX3RoaW5nICsgIn0pIik7CisgICAgICAgIHJldHVybiBuZXN0OworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICd0ZXN0TWFwKCJ7JXMiKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkCisgICAgKiAgaW50byBhIHN0cmluZyBvZiAgJ2tleSA9PiB2YWx1ZScgcGFpcnMKKyAgICAqICBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKKyAgICAqIEBwYXJhbSBtYXA8aTMyLGkzMj4gdGhpbmcgLSB0aGUgbWFwPGkzMixpMzI+IHRvIHByaW50CisgICAgKiBAcmV0dXJuIG1hcDxpMzIsaTMyPiAtIHJldHVybnMgdGhlIG1hcDxpMzIsaTMyPiAndGhpbmcnCisgICAgKgorICAgICogQHBhcmFtIHRoaW5nCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE1hcCh0aGluZzpJbnRNYXA8aGF4ZS5JbnQzMj4pOkludE1hcDxoYXhlLkludDMyPgorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RNYXAoeyIpOworICAgICAgICB2YXIgZmlyc3Q6Qm9vbCA9IHRydWU7CisgICAgICAgIGZvciAoa2V5IGluIHRoaW5nLmtleXMoKSkgeworICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHJhY2UoIiwgIik7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdHJhY2Uoa2V5ICsgIiA9PiAiICsgdGhpbmcuZ2V0KGtleSkpOworICAgICAgICB9OworICAgICAgICB0cmFjZSgifSkiKTsKKyAgICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICd0ZXN0U3RyaW5nTWFwKCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZAorICAgICogIGludG8gYSBzdHJpbmcgb2YgICdrZXkgPT4gdmFsdWUnIHBhaXJzCisgICAgKiAgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCisgICAgKiBAcGFyYW0gbWFwPHN0cmluZyxzdHJpbmc+IHRoaW5nIC0gdGhlIG1hcDxzdHJpbmcsc3RyaW5nPiB0byBwcmludAorICAgICogQHJldHVybiBtYXA8c3RyaW5nLHN0cmluZz4gLSByZXR1cm5zIHRoZSBtYXA8c3RyaW5nLHN0cmluZz4gJ3RoaW5nJworICAgICoKKyAgICAqIEBwYXJhbSB0aGluZworICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmdNYXAodGhpbmc6U3RyaW5nTWFwPFN0cmluZz4pOlN0cmluZ01hcDxTdHJpbmc+CisgICAgeworICAgICAgICB0cmFjZSgidGVzdFN0cmluZ01hcCh7Iik7CisgICAgICAgIHZhciBmaXJzdDpCb29sID0gdHJ1ZTsKKyAgICAgICAgZm9yIChrZXkgaW4gdGhpbmcua2V5cygpKSB7CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgiLCAiKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0cmFjZShrZXkgKyAiID0+ICIgKyB0aGluZy5nZXQoa2V5KSk7CisgICAgICAgIH07CisgICAgICAgIHRyYWNlKCJ9KSIpOworICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludHMgJ3Rlc3RTZXQoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkCisgICAgKiAgaW50byBhIHN0cmluZyBvZiAgdmFsdWVzCisgICAgKiAgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCisgICAgKiBAcGFyYW0gc2V0PGkzMj4gdGhpbmcgLSB0aGUgc2V0PGkzMj4gdG8gcHJpbnQKKyAgICAqIEByZXR1cm4gc2V0PGkzMj4gLSByZXR1cm5zIHRoZSBzZXQ8aTMyPiAndGhpbmcnCisgICAgKgorICAgICogQHBhcmFtIHRoaW5nCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFNldCh0aGluZzpJbnRTZXQpOkludFNldAorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RTZXQoeyIpOworICAgICAgICB2YXIgZmlyc3Q6Qm9vbCA9IHRydWU7CisgICAgICAgIGZvciAoZWxlbSBpbiB0aGluZykgeworICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHJhY2UoIiwgIik7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdHJhY2UoZWxlbSk7CisgICAgICAgIH07CisgICAgICAgIHRyYWNlKCJ9KSIpOworICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludHMgJ3Rlc3RMaXN0KCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZAorICAgICogIGludG8gYSBzdHJpbmcgb2YgIHZhbHVlcworICAgICogIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kIG5ldyBsaW5lcworICAgICogQHBhcmFtIGxpc3Q8aTMyPiB0aGluZyAtIHRoZSBsaXN0PGkzMj4gdG8gcHJpbnQKKyAgICAqIEByZXR1cm4gbGlzdDxpMzI+IC0gcmV0dXJucyB0aGUgbGlzdDxpMzI+ICd0aGluZycKKyAgICAqCisgICAgKiBAcGFyYW0gdGhpbmcKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TGlzdCh0aGluZzpMaXN0PGhheGUuSW50MzI+KTpMaXN0PGhheGUuSW50MzI+CisgICAgeworICAgICAgICB0cmFjZSgidGVzdExpc3QoeyIpOworICAgICAgICB2YXIgZmlyc3Q6Qm9vbCA9IHRydWU7CisgICAgICAgIGZvciAoZWxlbSBpbiB0aGluZykgeworICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHJhY2UoIiwgIik7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdHJhY2UoZWxlbSk7CisgICAgICAgIH07CisgICAgICAgIHRyYWNlKCJ9KSIpOworICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludHMgJ3Rlc3RFbnVtKCIlZCIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBpdCdzIG51bWVyaWMgdmFsdWUKKyAgICAqIEBwYXJhbSBOdW1iZXJ6IHRoaW5nIC0gdGhlIE51bWJlcnogdG8gcHJpbnQKKyAgICAqIEByZXR1cm4gTnVtYmVyeiAtIHJldHVybnMgdGhlIE51bWJlcnogJ3RoaW5nJworICAgICoKKyAgICAqIEBwYXJhbSB0aGluZworICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbnVtKHRoaW5nOkludCk6SW50CisgICAgeworICAgICAgICB0cmFjZSgidGVzdEVudW0oIiArIHRoaW5nICsgIikiKTsKKyAgICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICd0ZXN0VHlwZWRlZigiJWQiKScgd2l0aCB0aGluZyBhcyAnJWQnCisgICAgKiBAcGFyYW0gVXNlcklkIHRoaW5nIC0gdGhlIFVzZXJJZCB0byBwcmludAorICAgICogQHJldHVybiBVc2VySWQgLSByZXR1cm5zIHRoZSBVc2VySWQgJ3RoaW5nJworICAgICoKKyAgICAqIEBwYXJhbSB0aGluZworICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RUeXBlZGVmKHRoaW5nOmhheGUuSW50NjQpOmhheGUuSW50NjQKKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0VHlwZWRlZigiICsgdGhpbmcgKyAiKSIpOworICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludHMgJ3Rlc3RNYXBNYXAoIiVkIiknIHdpdGggaGVsbG8gYXMgJyVkJworICAgICogQHBhcmFtIGkzMiBoZWxsbyAtIHRoZSBpMzIgdG8gcHJpbnQKKyAgICAqIEByZXR1cm4gbWFwPGkzMixtYXA8aTMyLGkzMj4+IC0gcmV0dXJucyBhIGRpY3Rpb25hcnkgd2l0aCB0aGVzZSB2YWx1ZXM6CisgICAgKiAgIHstNCA9PiB7LTQgPT4gLTQsIC0zID0+IC0zLCAtMiA9PiAtMiwgLTEgPT4gLTEsIH0sCisgICAgKiAgICAgNCA9PiB7MSA9PiAxLCAyID0+IDIsIDMgPT4gMywgNCA9PiA0LCB9LCB9CisgICAgKgorICAgICogQHBhcmFtIGhlbGxvCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE1hcE1hcChoZWxsbzpoYXhlLkludDMyKTpJbnRNYXA8SW50TWFwPGhheGUuSW50MzI+PgorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RNYXBNYXAoIiArIGhlbGxvICsgIikiKTsKKyAgICAgICAgdmFyIG1hcG1hcCA9IG5ldyBJbnRNYXA8SW50TWFwPEludD4+KCk7CisgICAgICAgIHZhciBwb3MgPSBuZXcgSW50TWFwPEludD4oKTsKKyAgICAgICAgdmFyIG5lZyA9IG5ldyBJbnRNYXA8SW50PigpOworICAgICAgICBmb3IgKGkgaW4gMSAuLi4gNSkgeworICAgICAgICAgICAgcG9zLnNldChpLCBpKTsKKyAgICAgICAgICAgIG5lZy5zZXQoLWksIC1pKTsKKyAgICAgICAgfTsKKyAgICAgICAgbWFwbWFwLnNldCg0LCBwb3MpOworICAgICAgICBtYXBtYXAuc2V0KC00LCBuZWcpOworICAgICAgICByZXR1cm4gbWFwbWFwOworICAgIH0KKworICAgIC8qKgorICAgICogU28geW91IHRoaW5rIHlvdSd2ZSBnb3QgdGhpcyBhbGwgd29ya2VkLCBvdXQgZWg/CisgICAgKgorICAgICogQ3JlYXRlcyBhIHRoZSByZXR1cm5lZCBtYXAgd2l0aCB0aGVzZSB2YWx1ZXMgYW5kIHByaW50cyBpdCBvdXQ6CisgICAgKiAgIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisgICAgKiAgICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisgICAgKiAgICAgICAgICB9LAorICAgICogICAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAorICAgICogICB9CisgICAgKiBAcmV0dXJuIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gLSBhIG1hcCB3aXRoIHRoZSBhYm92ZSB2YWx1ZXMKKyAgICAqCisgICAgKiBAcGFyYW0gYXJndW1lbnQKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0SW5zYW5pdHkoYXJndW1lbnQgOiBJbnNhbml0eSkgOiBJbnQ2NE1hcDwgSW50TWFwPCBJbnNhbml0eT4+CisgICAgeworICAgICAgICB0cmFjZSgidGVzdEluc2FuaXR5KCkiKTsKKworICAgICAgICB2YXIgZmlyc3RfbWFwID0gbmV3IEludE1hcDwgSW5zYW5pdHk+KCk7CisgICAgICAgIGZpcnN0X21hcC5zZXQoTnVtYmVyei5UV08sIGFyZ3VtZW50KTsKKyAgICAgICAgZmlyc3RfbWFwLnNldChOdW1iZXJ6LlRIUkVFLCBhcmd1bWVudCk7CisKKyAgICAgICAgdmFyIHNlY29uZF9tYXAgPSBuZXcgSW50TWFwPCBJbnNhbml0eT4oKTsKKyAgICAgICAgdmFyIGxvb25leSA9IG5ldyBJbnNhbml0eSgpOworICAgICAgICBzZWNvbmRfbWFwLnNldChOdW1iZXJ6LlNJWCwgbG9vbmV5KTsKKworICAgICAgICB2YXIgaW5zYW5lID0gbmV3IEludDY0TWFwPCBJbnRNYXA8IEluc2FuaXR5Pj4oKTsKKyAgICAgICAgaW5zYW5lLnNldCggSW50NjQubWFrZSgwLDEpLCBmaXJzdF9tYXApOworICAgICAgICBpbnNhbmUuc2V0KCBJbnQ2NC5tYWtlKDAsMiksIHNlY29uZF9tYXApOworCisgICAgICAgIHJldHVybiBpbnNhbmU7CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludHMgJ3Rlc3RNdWx0aSgpJworICAgICogQHBhcmFtIGJ5dGUgYXJnMCAtCisgICAgKiBAcGFyYW0gaTMyIGFyZzEgLQorICAgICogQHBhcmFtIGk2NCBhcmcyIC0KKyAgICAqIEBwYXJhbSBtYXA8aTE2LCBzdHJpbmc+IGFyZzMgLQorICAgICogQHBhcmFtIE51bWJlcnogYXJnNCAtCisgICAgKiBAcGFyYW0gVXNlcklkIGFyZzUgLQorICAgICogQHJldHVybiBYdHJ1Y3QgLSByZXR1cm5zIGFuIFh0cnVjdAorICAgICogICAgd2l0aCBzdHJpbmdfdGhpbmcgPSAiSGVsbG8yLCBieXRlX3RoaW5nID0gYXJnMCwgaTMyX3RoaW5nID0gYXJnMQorICAgICogICAgYW5kIGk2NF90aGluZyA9IGFyZzIKKyAgICAqCisgICAgKiBAcGFyYW0gYXJnMAorICAgICogQHBhcmFtIGFyZzEKKyAgICAqIEBwYXJhbSBhcmcyCisgICAgKiBAcGFyYW0gYXJnMworICAgICogQHBhcmFtIGFyZzQKKyAgICAqIEBwYXJhbSBhcmc1CisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE11bHRpKGFyZzA6aGF4ZS5JbnQzMiwgYXJnMTpoYXhlLkludDMyLCBhcmcyOmhheGUuSW50NjQsCisgICAgICAgIGFyZzM6SW50TWFwPFN0cmluZz4sIGFyZzQ6SW50LCBhcmc1OmhheGUuSW50NjQpOlh0cnVjdAorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RNdWx0aSgpIik7CisgICAgICAgIHZhciBoZWxsbyA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CisgICAgICAgIGhlbGxvLmJ5dGVfdGhpbmcgPSBhcmcwOworICAgICAgICBoZWxsby5pMzJfdGhpbmcgPSBhcmcxOworICAgICAgICBoZWxsby5pNjRfdGhpbmcgPSBhcmcyOworICAgICAgICByZXR1cm4gaGVsbG87CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludCAndGVzdEV4Y2VwdGlvbiglcyknIHdpdGggYXJnIGFzICclcycKKyAgICAqIEBwYXJhbSBzdHJpbmcgYXJnIC0gYSBzdHJpbmcgaW5kaWNhdGlvbiB3aGF0IHR5cGUgb2YgZXhjZXB0aW9uIHRvIHRocm93CisgICAgKiBpZiBhcmcgPT0gIlhjZXB0aW9uIiB0aHJvdyBYY2VwdGlvbiB3aXRoIGVycm9yQ29kZSA9IDEwMDEgYW5kIG1lc3NhZ2UgPSBhcmcKKyAgICAqIGVsc2VuIGlmIGFyZyA9PSAiVEV4Y2VwdGlvbiIgdGhyb3cgVEV4Y2VwdGlvbgorICAgICogZWxzZSBkbyBub3QgdGhyb3cgYW55dGhpbmcKKyAgICAqCisgICAgKiBAcGFyYW0gYXJnCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEV4Y2VwdGlvbihhcmc6U3RyaW5nKTpWb2lkCisgICAgeworICAgICAgICB0cmFjZSgidGVzdEV4Y2VwdGlvbigiICsgYXJnICsgIikiKTsKKyAgICAgICAgaWYgKGFyZyA9PSAiWGNlcHRpb24iKSB7CisgICAgICAgICAgICB2YXIgeCA9IG5ldyBYY2VwdGlvbigpOworICAgICAgICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgICAgICAgICAgeC5tZXNzYWdlID0gYXJnOworICAgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKGFyZyA9PSAiVEV4Y2VwdGlvbiIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCk7CisgICAgICAgIH07CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50ICd0ZXN0TXVsdGlFeGNlcHRpb24oJXMsICVzKScgd2l0aCBhcmcwIGFzICclcycgYW5kIGFyZzEgYXMgJyVzJworICAgICogQHBhcmFtIHN0cmluZyBhcmcgLSBhIHN0cmluZyBpbmRpY2F0aW9uIHdoYXQgdHlwZSBvZiBleGNlcHRpb24gdG8gdGhyb3cKKyAgICAqIGlmIGFyZzAgPT0gIlhjZXB0aW9uIgorICAgICogdGhyb3cgWGNlcHRpb24gd2l0aCBlcnJvckNvZGUgPSAxMDAxIGFuZCBtZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iCisgICAgKiBlbHNlIGlmIGFyZzAgPT0gIlhjZXB0aW9uMiIKKyAgICAqIHRocm93IFhjZXB0aW9uMiB3aXRoIGVycm9yQ29kZSA9IDIwMDIgYW5kIG1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiCisgICAgKiBlbHNlIGRvIG5vdCB0aHJvdyBhbnl0aGluZworICAgICogQHJldHVybiBYdHJ1Y3QgLSBhbiBYdHJ1Y3Qgd2l0aCBzdHJpbmdfdGhpbmcgPSBhcmcxCisgICAgKgorICAgICogQHBhcmFtIGFyZzAKKyAgICAqIEBwYXJhbSBhcmcxCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE11bHRpRXhjZXB0aW9uKGFyZzA6U3RyaW5nLCBhcmcxOlN0cmluZyk6WHRydWN0CisgICAgeworICAgICAgICB0cmFjZSgidGVzdE11bHRpRXhjZXB0aW9uKCIgKyBhcmcwICsgIiwgIiArIGFyZzEgKyAiKSIpOworICAgICAgICBpZiAoYXJnMCA9PSAiWGNlcHRpb24iKSB7CisgICAgICAgICAgICB2YXIgeCA9IG5ldyBYY2VwdGlvbigpOworICAgICAgICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgICAgICAgICAgeC5tZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iOworICAgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgfSBlbHNlIGlmIChhcmcwID09ICJYY2VwdGlvbjIiKSB7CisgICAgICAgICAgICB2YXIgeCA9IG5ldyBYY2VwdGlvbjIoKTsKKyAgICAgICAgICAgIHguZXJyb3JDb2RlID0gMjAwMjsKKyAgICAgICAgICAgIHguc3RydWN0X3RoaW5nID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgICAgeC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIjsKKyAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgIH07CisgICAgICAgIHZhciByZXN1bHQgPSBuZXcgWHRydWN0KCk7CisgICAgICAgIHJlc3VsdC5zdHJpbmdfdGhpbmcgPSBhcmcxOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnQgJ3Rlc3RPbmV3YXkoJWQpOiBTbGVlcGluZy4uLicgd2l0aCBzZWNvbmRzVG9TbGVlcCBhcyAnJWQnCisgICAgKiBzbGVlcCAnc2Vjb25kc1RvU2xlZXAnCisgICAgKiBQcmludCAndGVzdE9uZXdheSglZCk6IGRvbmUgc2xlZXBpbmchJyB3aXRoIHNlY29uZHNUb1NsZWVwIGFzICclZCcKKyAgICAqIEBwYXJhbSBpMzIgc2Vjb25kc1RvU2xlZXAgLSB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gc2xlZXAKKyAgICAqCisgICAgKiBAcGFyYW0gc2Vjb25kc1RvU2xlZXAKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0T25ld2F5KHNlY29uZHNUb1NsZWVwOmhheGUuSW50MzIpOlZvaWQKKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0T25ld2F5KCIgKyBzZWNvbmRzVG9TbGVlcCArICIpLCBzbGVlcGluZy4uLiIpOworICAgICAgICBTeXMuc2xlZXAoc2Vjb25kc1RvU2xlZXApOworICAgICAgICB0cmFjZSgidGVzdE9uZXdheSBmaW5pc2hlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RvcCgpOlZvaWQKKyAgICB7CisgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VydmVyLlN0b3AoKTsKKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2hzL0NNYWtlTGlzdHMudHh0IGIvdGVzdC9ocy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWNhM2ZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ocy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDExNCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3NldChoc190ZXN0X2dlbgorICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvQ29uc3RhbnRzRGVtb19Db25zdHMuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0NvbnN0YW50c0RlbW9fVHlwZXMuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0RlYnVnUHJvdG9UZXN0X0NvbnN0cy5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvRGVidWdQcm90b1Rlc3RfVHlwZXMuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0VtcHR5U2VydmljZV9DbGllbnQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0VtcHR5U2VydmljZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvRW1wdHlTZXJ2aWNlX0lmYWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9JbmNsdWRlX0NvbnN0cy5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvSW5jbHVkZV9UeXBlcy5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvSW5oZXJpdGVkX0NsaWVudC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvSW5oZXJpdGVkLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9Jbmhlcml0ZWRfSWZhY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1JldmVyc2VPcmRlclNlcnZpY2VfQ2xpZW50LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9SZXZlcnNlT3JkZXJTZXJ2aWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9SZXZlcnNlT3JkZXJTZXJ2aWNlX0lmYWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TZWNvbmRTZXJ2aWNlX0NsaWVudC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvU2Vjb25kU2VydmljZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvU2Vjb25kU2VydmljZV9JZmFjZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvU2VydmljZUZvckV4Y2VwdGlvbldpdGhBTWFwX0NsaWVudC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvU2VydmljZUZvckV4Y2VwdGlvbldpdGhBTWFwLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TZXJ2aWNlRm9yRXhjZXB0aW9uV2l0aEFNYXBfSWZhY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1Nydl9DbGllbnQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1Nydi5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvU3J2X0lmYWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9UaHJpZnRUZXN0X0NsaWVudC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvVGhyaWZ0VGVzdF9Db25zdHMuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1RocmlmdFRlc3QuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1RocmlmdFRlc3RfSWZhY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1RocmlmdFRlc3RfVHlwZXMuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1lvd3phX0NsaWVudC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvWW93emEuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1lvd3phX0lmYWNlLmhzCispCisKK3NldChoc19jcm9zc3Rlc3RfYXBwcworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9UZXN0U2VydmVyCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L1Rlc3RDbGllbnQKKykKK3NldChoc19jcm9zc3Rlc3RfYXJncworICAgIC1pZ2VuLWhzCisgICAgLW9kaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CisgICAgLWhpZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfQorKQorCitpZiAoQ01BS0VfQlVJTERfVFlQRSBTVFJFUVVBTCAiRGVidWciKQorICBzZXQoaHNfb3B0aW1pemUgLU8wKQorZWxzZSgpCisgIHNldChoc19vcHRpbWl6ZSAtTzEpCitlbmRpZigpCisKK2FkZF9jdXN0b21fY29tbWFuZCgKKyAgICBPVVRQVVQgJHtoc19jcm9zc3Rlc3RfYXBwc30KKyAgICBDT01NQU5EICR7R0hDfSAke2hzX29wdGltaXplfSAke2hzX2Nyb3NzdGVzdF9hcmdzfSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vVGVzdFNlcnZlci5ocyAtbyBUZXN0U2VydmVyCisgICAgQ09NTUFORCAke0dIQ30gJHtoc19vcHRpbWl6ZX0gJHtoc19jcm9zc3Rlc3RfYXJnc30gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L1Rlc3RDbGllbnQuaHMgLW8gVGVzdENsaWVudAorICAgIERFUEVORFMgJHtoc190ZXN0X2dlbn0gaGFza2VsbF9saWJyYXJ5IFRlc3RTZXJ2ZXIuaHMgVGVzdENsaWVudC5ocworKQorYWRkX2N1c3RvbV90YXJnZXQoaGFza2VsbF9jcm9zc3Rlc3QgQUxMCisgICAgQ09NTUVOVCAiQnVpbGRpbmcgSGFza2VsbCBjcm9zcyB0ZXN0IGV4ZWN1dGFibGVzIgorICAgIERFUEVORFMgJHtoc19jcm9zc3Rlc3RfYXBwc30KKykKKworc2V0KGhzX3Rlc3Rfc291cmNlcworICAgIENvbnN0YW50c0RlbW9fTWFpbi5ocworICAgIERlYnVnUHJvdG9UZXN0X01haW4uaHMKKyAgICBJbmNsdWRlX01haW4uaHMKKyAgICBUaHJpZnRUZXN0X01haW4uaHMKKykKK3NldChoc190ZXN0X2FyZ3MKKyAgICAtV2FsbAorICAgIC1YU2NvcGVkVHlwZVZhcmlhYmxlcworICAgIC1pJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2xpYi9ocy9zcmMKKyAgICAtaSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMKKykKK2FkZF9jdXN0b21fdGFyZ2V0KGhhc2tlbGxfdGVzdHMgQUxMIERFUEVORFMgJHtoc190ZXN0X2dlbn0pCitmb3JlYWNoKFNSQyAke2hzX3Rlc3Rfc291cmNlc30pCisgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChCQVNFICR7U1JDfSBOQU1FX1dFKQorICAgIGFkZF90ZXN0KE5BTUUgSGFza2VsbFRlc3RzLSR7QkFTRX0KKyAgICAgICAgQ09NTUFORCAke1JVTl9IQVNLRUxMfSAke2hzX3Rlc3RfYXJnc30gJHtTUkN9CisgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSkKK2VuZGZvcmVhY2goKQorCitzZXQoaHNfdGVzdF9nZW5fc291cmNlcworICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0NvbnN0YW50c0RlbW8udGhyaWZ0CisgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0CisgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9JbmNsdWRlLnRocmlmdAorKQorYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCAke2hzX3Rlc3RfZ2VufQorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGhzICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0NvbnN0YW50c0RlbW8udGhyaWZ0CisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gaHMgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0CisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gaHMgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBocyAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9JbmNsdWRlLnRocmlmdAorICAgIERFUEVORFMgJHtoc190ZXN0X2dlbl9zb3VyY2VzfQorKQpkaWZmIC0tZ2l0IGEvdGVzdC9ocy9EZWJ1Z1Byb3RvVGVzdF9NYWluLmhzIGIvdGVzdC9ocy9EZWJ1Z1Byb3RvVGVzdF9NYWluLmhzCmluZGV4IDgxNmVlZTMuLmZiMjg5NjMgMTAwNjQ0Ci0tLSBhL3Rlc3QvaHMvRGVidWdQcm90b1Rlc3RfTWFpbi5ocworKysgYi90ZXN0L2hzL0RlYnVnUHJvdG9UZXN0X01haW4uaHMKQEAgLTE3LDEyICsxNywxNiBAQAogLS0gdW5kZXIgdGhlIExpY2Vuc2UuCiAtLQogCit7LSMgTEFOR1VBR0UgT3ZlcmxvYWRlZFN0cmluZ3MgIy19CisKIG1vZHVsZSBNYWluIHdoZXJlCiAKIAogaW1wb3J0IHF1YWxpZmllZCBDb250cm9sLkV4Y2VwdGlvbgogaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBEQkwKLWltcG9ydCBxdWFsaWZpZWQgTWF5YmUKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoU2V0IGFzIFNldAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLlZlY3RvciBhcyBWZWN0b3IKIGltcG9ydCBxdWFsaWZpZWQgTmV0d29yawogCiBpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkJpbmFyeQpAQCAtNTksNjEgKzYzLDYxIEBACiAgICAgc3RydWN0TWV0aG9kIF8gPSBkbwogICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICJHb3Qgc3RydWN0TWV0aG9kIGNhbGwiCiAgICAgICAgIHJldHVybiAkIFR5cGVzLkNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QgewotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2FfYnl0ZSA9IEp1c3QgMHgwMSwKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9hX2kxNiA9IEp1c3QgMHgwMiwKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9hX2kzMiA9IEp1c3QgMHgwMywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9hX2k2NCA9IEp1c3QgMHgwNCwKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9hX2RvdWJsZSA9IEp1c3QgMC4xLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2Ffc3RyaW5nID0gSnVzdCAiYWJjZGVmIiwKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9hX2JpbmFyeSA9IEp1c3QgREJMLmVtcHR5LAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X3RydWVfZmllbGQgPSBKdXN0IFRydWUsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfZmFsc2VfZmllbGQgPSBKdXN0IEZhbHNlLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2VtcHR5X3N0cnVjdF9maWVsZCA9IEp1c3QgVHlwZXMuRW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2FfYnl0ZSA9IDB4MDEsCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2FfaTE2ID0gMHgwMiwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYV9pMzIgPSAweDAzLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9hX2k2NCA9IDB4MDQsCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2FfZG91YmxlID0gMC4xLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9hX3N0cmluZyA9ICJhYmNkZWYiLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9hX2JpbmFyeSA9IERCTC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfdHJ1ZV9maWVsZCA9IFRydWUsCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2ZhbHNlX2ZpZWxkID0gRmFsc2UsCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2VtcHR5X3N0cnVjdF9maWVsZCA9IFR5cGVzLkVtcHR5LAogICAgICAgICAgICAgCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9saXN0ID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9pMTZfbGlzdCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTMyX2xpc3QgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2k2NF9saXN0ID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9kb3VibGVfbGlzdCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Rfc3RyaW5nX2xpc3QgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2JpbmFyeV9saXN0ID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9ib29sZWFuX2xpc3QgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X3N0cnVjdF9saXN0ID0gSnVzdCBbVHlwZXMuRW1wdHldLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2xpc3QgPSBWZWN0b3IuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2kxNl9saXN0ID0gVmVjdG9yLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9pMzJfbGlzdCA9IFZlY3Rvci5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTY0X2xpc3QgPSBWZWN0b3IuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2RvdWJsZV9saXN0ID0gVmVjdG9yLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9zdHJpbmdfbGlzdCA9IFZlY3Rvci5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYmluYXJ5X2xpc3QgPSBWZWN0b3IuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2Jvb2xlYW5fbGlzdCA9IFZlY3Rvci5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Rfc3RydWN0X2xpc3QgPSBWZWN0b3IuZW1wdHksCiAKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX3NldCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTE2X3NldCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTMyX3NldCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTY0X3NldCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfZG91YmxlX3NldCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Rfc3RyaW5nX3NldCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYmluYXJ5X3NldCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYm9vbGVhbl9zZXQgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X3N0cnVjdF9zZXQgPSBOb3RoaW5nLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTE2X3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTMyX3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTY0X3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfZG91YmxlX3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Rfc3RyaW5nX3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYmluYXJ5X3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYm9vbGVhbl9zZXQgPSBTZXQuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X3N0cnVjdF9zZXQgPSBTZXQuZW1wdHksCiAKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2J5dGVfbWFwID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9pMTZfYnl0ZV9tYXAgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2kzMl9ieXRlX21hcCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTY0X2J5dGVfbWFwID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9kb3VibGVfYnl0ZV9tYXAgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X3N0cmluZ19ieXRlX21hcCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYmluYXJ5X2J5dGVfbWFwID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9ib29sZWFuX2J5dGVfbWFwID0gTm90aGluZywKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9ieXRlX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTE2X2J5dGVfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9pMzJfYnl0ZV9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2k2NF9ieXRlX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfZG91YmxlX2J5dGVfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9zdHJpbmdfYnl0ZV9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2JpbmFyeV9ieXRlX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYm9vbGVhbl9ieXRlX21hcCA9IE1hcC5lbXB0eSwKIAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfaTE2X21hcCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9pMzJfbWFwID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2k2NF9tYXAgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfZG91YmxlX21hcCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9zdHJpbmdfbWFwID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2JpbmFyeV9tYXAgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfYm9vbGVhbl9tYXAgPSBOb3RoaW5nLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2kxNl9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfaTMyX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9pNjRfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2RvdWJsZV9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfc3RyaW5nX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9iaW5hcnlfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2Jvb2xlYW5fbWFwID0gTWFwLmVtcHR5LAogCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfbGlzdF9ieXRlX21hcCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Rfc2V0X2J5dGVfbWFwID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9tYXBfYnl0ZV9tYXAgPSBOb3RoaW5nLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9saXN0X2J5dGVfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9zZXRfYnl0ZV9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X21hcF9ieXRlX21hcCA9IE1hcC5lbXB0eSwKIAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfbWFwX21hcCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9zZXRfbWFwID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2xpc3RfbWFwID0gTm90aGluZyB9CisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfbWFwX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9zZXRfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2xpc3RfbWFwID0gTWFwLmVtcHR5IH0KIAogICAgIG1ldGhvZFdpdGhEZWZhdWx0QXJncyBfIGFyZyA9IGRvCiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCAiR290IG1ldGhvZFdpdGhEZWZhdWx0QXJnczogIiArKyBzaG93IGFyZwpAQCAtMTI1LDcgKzEyOSw3IEBACiBpbnN0YW5jZSBJSWZhY2UuSW5oZXJpdGVkX0lmYWNlIEluaGVyaXRlZEhhbmRsZXIgd2hlcmUKICAgICBpZGVudGl0eSBfIGFyZyA9IGRvCiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCAiR290IGlkZW50aXR5IG1ldGhvZDogIiArKyBzaG93IGFyZwotICAgICAgICByZXR1cm4gJCBNYXliZS5mcm9tSnVzdCBhcmcKKyAgICAgICAgcmV0dXJuIGFyZwogCiBjbGllbnQgOjogKFN0cmluZywgTmV0d29yay5Qb3J0SUQpIC0+IElPICgpCiBjbGllbnQgYWRkciA9IGRvCmRpZmYgLS1naXQgYS90ZXN0L2hzL0luY2x1ZGVfTWFpbi5ocyBiL3Rlc3QvaHMvSW5jbHVkZV9NYWluLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTc3YTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hzL0luY2x1ZGVfTWFpbi5ocwpAQCAtMCwwICsxLDcgQEAKK21vZHVsZSBNYWluIHdoZXJlCisKK2ltcG9ydCBJbmNsdWRlX1R5cGVzCitpbXBvcnQgVGhyaWZ0VGVzdF9UeXBlcworCittYWluIDo6IElPICgpCittYWluID0gcHV0U3RyTG4gKCJJbmNsdWRlcyB3b3JrOiAiICsrIChzaG93IChJbmNsdWRlVGVzdCAkIEJvb2xzIFRydWUgRmFsc2UpKSkKZGlmZiAtLWdpdCBhL3Rlc3QvaHMvTWFrZWZpbGUuYW0gYi90ZXN0L2hzL01ha2VmaWxlLmFtCmluZGV4IGQ2ZDhmZjQuLjE3NDg5MDYgMTAwNjQ0Ci0tLSBhL3Rlc3QvaHMvTWFrZWZpbGUuYW0KKysrIGIvdGVzdC9ocy9NYWtlZmlsZS5hbQpAQCAtMTcsMTQgKzE3LDI1IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9zcmNkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQotc3R1YnM6IC4uL0NvbnN0YW50c0RlbW8udGhyaWZ0IC4uL0RlYnVnUHJvdG9UZXN0LnRocmlmdCAuLi9UaHJpZnRUZXN0LnRocmlmdAorc3R1YnM6ICQoVEhSSUZUKSAuLi9Db25zdGFudHNEZW1vLnRocmlmdCAuLi9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgLi4vVGhyaWZ0VGVzdC50aHJpZnQgLi4vSW5jbHVkZS50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gaHMgLi4vQ29uc3RhbnRzRGVtby50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gaHMgLi4vRGVidWdQcm90b1Rlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIGhzIC4uL1RocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGhzIC4uL0luY2x1ZGUudGhyaWZ0CiAKIGNoZWNrOiBzdHVicwogCXNoIHJ1bi10ZXN0LnNoIENvbnN0YW50c0RlbW8KIAlzaCBydW4tdGVzdC5zaCBEZWJ1Z1Byb3RvVGVzdAogCXNoIHJ1bi10ZXN0LnNoIFRocmlmdFRlc3QKKwlzaCBydW4tdGVzdC5zaCBJbmNsdWRlCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1ocworCSQoUk0pICouaGkKKwkkKFJNKSAqLm8KKworYWxsLWxvY2FsOiBzdHVicworCWdoYyAtaWdlbi1ocyBUZXN0U2VydmVyLmhzCisJZ2hjIC1pZ2VuLWhzIFRlc3RDbGllbnQuaHMKKworcHJlY3Jvc3M6IGFsbC1sb2NhbApkaWZmIC0tZ2l0IGEvdGVzdC9ocy9UZXN0Q2xpZW50LmhzIGIvdGVzdC9ocy9UZXN0Q2xpZW50LmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZmI1OTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hzL1Rlc3RDbGllbnQuaHMKQEAgLTAsMCArMSwzMDYgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCit7LSMgTEFOR1VBR0UgT3ZlcmxvYWRlZFN0cmluZ3MsIFJlY29yZFdpbGRDYXJkcywgU2NvcGVkVHlwZVZhcmlhYmxlcyAjLX0KK21vZHVsZSBNYWluIHdoZXJlCisKK2ltcG9ydCBDb250cm9sLkV4Y2VwdGlvbgoraW1wb3J0IENvbnRyb2wuTW9uYWQKK2ltcG9ydCBEYXRhLkZ1bmN0b3IKK2ltcG9ydCBEYXRhLkxpc3QuU3BsaXQKK2ltcG9ydCBEYXRhLlN0cmluZworaW1wb3J0IE5ldHdvcmsKK2ltcG9ydCBOZXR3b3JrLlVSSQoraW1wb3J0IFN5c3RlbS5FbnZpcm9ubWVudAoraW1wb3J0IFN5c3RlbS5FeGl0CitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIE1hcAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hTZXQgYXMgU2V0CitpbXBvcnQgcXVhbGlmaWVkIERhdGEuVmVjdG9yIGFzIFZlY3RvcgoraW1wb3J0IHF1YWxpZmllZCBTeXN0ZW0uSU8gYXMgSU8KKworaW1wb3J0IFRocmlmdFRlc3RfSWZhY2UKK2ltcG9ydCBUaHJpZnRUZXN0X1R5cGVzCitpbXBvcnQgcXVhbGlmaWVkIFRocmlmdFRlc3RfQ2xpZW50IGFzIENsaWVudAorCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuRnJhbWVkCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5IYW5kbGUKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0Lkh0dHBDbGllbnQKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuSGVhZGVyCitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkpTT04KKworZGF0YSBPcHRpb25zID0gT3B0aW9ucworICB7IGhvc3QgICAgICAgICA6OiBTdHJpbmcKKyAgLCBwb3J0ICAgICAgICAgOjogSW50CisgICwgZG9tYWluU29ja2V0IDo6IFN0cmluZworICAsIHRyYW5zcG9ydCAgICA6OiBTdHJpbmcKKyAgLCBwcm90b2NvbCAgICAgOjogUHJvdG9jb2xUeXBlCisgIC0tIFRPRE86IEhhc2tlbGwgbGliIGRvZXMgbm90IGhhdmUgU1NMIHN1cHBvcnQKKyAgLCBzc2wgICAgICAgICAgOjogQm9vbAorICAsIHRlc3RMb29wcyAgICA6OiBJbnQKKyAgfQorICBkZXJpdmluZyAoU2hvdywgRXEpCisKK2RhdGEgVHJhbnNwb3J0VHlwZSA9IEJ1ZmZlcmVkIElPLkhhbmRsZQorICAgICAgICAgICAgICAgICAgIHwgRnJhbWVkIChGcmFtZWRUcmFuc3BvcnQgSU8uSGFuZGxlKQorICAgICAgICAgICAgICAgICAgIHwgSHR0cCBIdHRwQ2xpZW50CisgICAgICAgICAgICAgICAgICAgfCBOb1RyYW5zcG9ydCBTdHJpbmcKKworZ2V0VHJhbnNwb3J0IDo6IFN0cmluZyAtPiBTdHJpbmcgLT4gSW50IC0+IChJTyBUcmFuc3BvcnRUeXBlKQorZ2V0VHJhbnNwb3J0ICJidWZmZXJlZCIgaG9zdCBwb3J0ID0gZG8KKyAgaCA8LSBoT3BlbiAoaG9zdCwgUG9ydE51bWJlciAkIGZyb21JbnRlZ3JhbCBwb3J0KQorICBJTy5oU2V0QnVmZmVyaW5nIGggJCBJTy5CbG9ja0J1ZmZlcmluZyBOb3RoaW5nCisgIHJldHVybiAkIEJ1ZmZlcmVkIGgKK2dldFRyYW5zcG9ydCAiZnJhbWVkIiBob3N0IHBvcnQgPSBkbworICBoIDwtIGhPcGVuIChob3N0LCBQb3J0TnVtYmVyICQgZnJvbUludGVncmFsIHBvcnQpCisgIHQgPC0gb3BlbkZyYW1lZFRyYW5zcG9ydCBoCisgIHJldHVybiAkIEZyYW1lZCB0CitnZXRUcmFuc3BvcnQgImh0dHAiIGhvc3QgcG9ydCA9IGxldCB1cmlTdHIgPSAiaHR0cDovLyIgKysgaG9zdCArKyAiOiIgKysgc2hvdyBwb3J0IGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgcGFyc2VVUkkgdXJpU3RyIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aGluZyAtPiBkbyByZXR1cm4gKE5vVHJhbnNwb3J0ICQgIkZhaWxlZCB0byBwYXJzZSBVUkk6ICIgKysgdXJpU3RyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEp1c3QodXJpKSAtPiBkbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA8LSBvcGVuSHR0cENsaWVudCB1cmkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkIEh0dHAgdAorZ2V0VHJhbnNwb3J0IHQgaG9zdCBwb3J0ID0gZG8gcmV0dXJuIChOb1RyYW5zcG9ydCAkICJVbnN1cHBvcnRlZCB0cmFuc3BvcnQ6ICIgKysgdCkKKworZGF0YSBQcm90b2NvbFR5cGUgPSBCaW5hcnkKKyAgICAgICAgICAgICAgICAgIHwgQ29tcGFjdAorICAgICAgICAgICAgICAgICAgfCBKU09OCisgICAgICAgICAgICAgICAgICB8IEhlYWRlcgorICAgICAgICAgICAgICAgICAgZGVyaXZpbmcgKFNob3csIEVxKQorCitnZXRQcm90b2NvbCA6OiBTdHJpbmcgLT4gUHJvdG9jb2xUeXBlCitnZXRQcm90b2NvbCAiYmluYXJ5IiAgPSBCaW5hcnkKK2dldFByb3RvY29sICJjb21wYWN0IiA9IENvbXBhY3QKK2dldFByb3RvY29sICJqc29uIiAgICA9IEpTT04KK2dldFByb3RvY29sICJoZWFkZXIiID0gSGVhZGVyCitnZXRQcm90b2NvbCBwID0gZXJyb3IgJCAiVW5zdXBwb3J0ZWQgUHJvdG9jb2w6ICIgKysgcAorCitkZWZhdWx0T3B0aW9ucyA6OiBPcHRpb25zCitkZWZhdWx0T3B0aW9ucyA9IE9wdGlvbnMKKyAgeyBwb3J0ICAgICAgICAgPSA5MDkwCisgICwgZG9tYWluU29ja2V0ID0gIiIKKyAgLCBob3N0ICAgICAgICAgPSAibG9jYWxob3N0IgorICAsIHRyYW5zcG9ydCAgICA9ICJidWZmZXJlZCIKKyAgLCBwcm90b2NvbCAgICAgPSBCaW5hcnkKKyAgLCBzc2wgICAgICAgICAgPSBGYWxzZQorICAsIHRlc3RMb29wcyAgICA9IDEKKyAgfQorCitydW5DbGllbnQgOjogUHJvdG9jb2wgcCA9PiBwIC0+IElPICgpCitydW5DbGllbnQgcCA9IGRvCisgIGxldCBwcm90ID0gKHAscCkKKyAgcHV0U3RyTG4gIlN0YXJ0aW5nIFRlc3RzIgorCisgIC0tIFZPSUQgVGVzdAorICBwdXRTdHJMbiAidGVzdFZvaWQiCisgIENsaWVudC50ZXN0Vm9pZCBwcm90CisKKyAgLS0gU3RyaW5nIFRlc3QKKyAgcHV0U3RyTG4gInRlc3RTdHJpbmciCisgIHMgPC0gQ2xpZW50LnRlc3RTdHJpbmcgcHJvdCAiVGVzdCIKKyAgd2hlbiAocyAvPSAiVGVzdCIpIGV4aXRGYWlsdXJlCisKKyAgLS0gQm9vbCBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0Qm9vbCIKKyAgYm9vbCA8LSBDbGllbnQudGVzdEJvb2wgcHJvdCBUcnVlCisgIHdoZW4gKG5vdCBib29sKSBleGl0RmFpbHVyZQorICBwdXRTdHJMbiAidGVzdEJvb2wiCisgIGJvb2wgPC0gQ2xpZW50LnRlc3RCb29sIHByb3QgRmFsc2UKKyAgd2hlbiAoYm9vbCkgZXhpdEZhaWx1cmUKKworICAtLSBCeXRlIFRlc3QKKyAgcHV0U3RyTG4gInRlc3RCeXRlIgorICBieXRlIDwtIENsaWVudC50ZXN0Qnl0ZSBwcm90IDEKKyAgd2hlbiAoYnl0ZSAvPSAxKSBleGl0RmFpbHVyZQorCisgIC0tIEkzMiBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0STMyIgorICBpMzIgPC0gQ2xpZW50LnRlc3RJMzIgcHJvdCAoLTEpCisgIHdoZW4gKGkzMiAvPSAtMSkgZXhpdEZhaWx1cmUKKworICAtLSBJNjQgVGVzdAorICBwdXRTdHJMbiAidGVzdEk2NCIKKyAgaTY0IDwtIENsaWVudC50ZXN0STY0IHByb3QgKC0zNDM1OTczODM2OCkKKyAgd2hlbiAoaTY0IC89IC0zNDM1OTczODM2OCkgZXhpdEZhaWx1cmUKKworICAtLSBEb3VibGUgVGVzdAorICBwdXRTdHJMbiAidGVzdERvdWJsZSIKKyAgZHViIDwtIENsaWVudC50ZXN0RG91YmxlIHByb3QgKC01LjIwOTg1MjMpCisgIHdoZW4gKGFicyAoZHViICsgNS4yMDk4NTIzKSA+IDAuMDAxKSBleGl0RmFpbHVyZQorCisgIC0tIEJpbmFyeSBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0QmluYXJ5IgorICBiaW4gPC0gQ2xpZW50LnRlc3RCaW5hcnkgcHJvdCAoTEJTLnBhY2sgLiByZXZlcnNlICQgWy0xMjguLjEyN10pCisgIHdoZW4gKChyZXZlcnNlIFstMTI4Li4xMjddKSAvPSBMQlMudW5wYWNrIGJpbikgZXhpdEZhaWx1cmUKKyAgCisgIC0tIFN0cnVjdCBUZXN0CisgIGxldCBzdHJ1Y3RJbiA9IFh0cnVjdHsgeHRydWN0X3N0cmluZ190aGluZyA9ICJaZXJvIgorICAgICAgICAgICAgICAgICAgICAgICAsIHh0cnVjdF9ieXRlX3RoaW5nICAgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICwgeHRydWN0X2kzMl90aGluZyAgICA9IC0zCisgICAgICAgICAgICAgICAgICAgICAgICwgeHRydWN0X2k2NF90aGluZyAgICA9IC01CisgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgcHV0U3RyTG4gInRlc3RTdHJ1Y3QiCisgIHN0cnVjdE91dCA8LSBDbGllbnQudGVzdFN0cnVjdCBwcm90IHN0cnVjdEluCisgIHdoZW4gKHN0cnVjdEluIC89IHN0cnVjdE91dCkgZXhpdEZhaWx1cmUKKworICAtLSBOZXN0ZWQgU3RydWN0IFRlc3QKKyAgbGV0IG5lc3RJbiA9IFh0cnVjdDJ7IHh0cnVjdDJfYnl0ZV90aGluZyAgID0gMQorICAgICAgICAgICAgICAgICAgICAgICwgeHRydWN0Ml9zdHJ1Y3RfdGhpbmcgPSBzdHJ1Y3RJbgorICAgICAgICAgICAgICAgICAgICAgICwgeHRydWN0Ml9pMzJfdGhpbmcgICAgPSA1CisgICAgICAgICAgICAgICAgICAgICAgfQorICBwdXRTdHJMbiAidGVzdE5lc3QiCisgIG5lc3RPdXQgPC0gQ2xpZW50LnRlc3ROZXN0IHByb3QgbmVzdEluCisgIHdoZW4gKG5lc3RJbiAvPSBuZXN0T3V0KSBleGl0RmFpbHVyZQorCisgIC0tIE1hcCBUZXN0CisgIGxldCBtYXBJbiA9IE1hcC5mcm9tTGlzdCAkIG1hcCAoXGkgLT4gKGksIGktMTApKSBbMS4uNV0KKyAgcHV0U3RyTG4gInRlc3RNYXAiCisgIG1hcE91dCA8LSBDbGllbnQudGVzdE1hcCBwcm90IG1hcEluCisgIHdoZW4gKG1hcEluIC89IG1hcE91dCkgZXhpdEZhaWx1cmUKKworICAtLSBTZXQgVGVzdAorICBsZXQgc2V0SW4gPSBTZXQuZnJvbUxpc3QgWy0yLi4zXQorICBwdXRTdHJMbiAidGVzdFNldCIKKyAgc2V0T3V0IDwtIENsaWVudC50ZXN0U2V0IHByb3Qgc2V0SW4KKyAgd2hlbiAoc2V0SW4gLz0gc2V0T3V0KSBleGl0RmFpbHVyZQorCisgIC0tIExpc3QgVGVzdAorICBsZXQgbGlzdEluID0gVmVjdG9yLmZyb21MaXN0IFstMi4uM10KKyAgcHV0U3RyTG4gInRlc3RMaXN0IgorICBsaXN0T3V0IDwtIENsaWVudC50ZXN0TGlzdCBwcm90IGxpc3RJbgorICB3aGVuIChsaXN0SW4gLz0gbGlzdE91dCkgZXhpdEZhaWx1cmUKKworICAtLSBFbnVtIFRlc3QKKyAgcHV0U3RyTG4gInRlc3RFbnVtIgorICBudW16MSA8LSBDbGllbnQudGVzdEVudW0gcHJvdCBPTkUKKyAgd2hlbiAobnVtejEgLz0gT05FKSBleGl0RmFpbHVyZQorCisgIHB1dFN0ckxuICJ0ZXN0RW51bSIKKyAgbnVtejIgPC0gQ2xpZW50LnRlc3RFbnVtIHByb3QgVFdPCisgIHdoZW4gKG51bXoyIC89IFRXTykgZXhpdEZhaWx1cmUKKworICBwdXRTdHJMbiAidGVzdEVudW0iCisgIG51bXo1IDwtIENsaWVudC50ZXN0RW51bSBwcm90IEZJVkUKKyAgd2hlbiAobnVtejUgLz0gRklWRSkgZXhpdEZhaWx1cmUKKworICAtLSBUeXBlZGVmIFRlc3QKKyAgcHV0U3RyTG4gInRlc3RUeXBlZGVmIgorICB1aWQgPC0gQ2xpZW50LnRlc3RUeXBlZGVmIHByb3QgMzA5ODU4MjM1MDgyNTIzCisgIHdoZW4gKHVpZCAvPSAzMDk4NTgyMzUwODI1MjMpIGV4aXRGYWlsdXJlCisKKyAgLS0gTmVzdGVkIE1hcCBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0TWFwTWFwIgorICBfIDwtIENsaWVudC50ZXN0TWFwTWFwIHByb3QgMQorCisgIC0tIEV4Y2VwdGlvbiBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0RXhjZXB0aW9uIgorICBleG4xIDwtIHRyeSAkIENsaWVudC50ZXN0RXhjZXB0aW9uIHByb3QgIlhjZXB0aW9uIgorICBjYXNlIGV4bjEgb2YKKyAgICBMZWZ0IChYY2VwdGlvbiBfIF8pIC0+IHJldHVybiAoKQorICAgIF8gLT4gcHV0U3RyTG4gKHNob3cgZXhuMSkgPj4gZXhpdEZhaWx1cmUKKworICBwdXRTdHJMbiAidGVzdEV4Y2VwdGlvbiIKKyAgZXhuMiA8LSB0cnkgJCBDbGllbnQudGVzdEV4Y2VwdGlvbiBwcm90ICJURXhjZXB0aW9uIgorICBjYXNlIGV4bjIgb2YKKyAgICBMZWZ0IChfIDo6IFNvbWVFeGNlcHRpb24pIC0+IHJldHVybiAoKQorICAgIFJpZ2h0IF8gLT4gZXhpdEZhaWx1cmUKKworICBwdXRTdHJMbiAidGVzdEV4Y2VwdGlvbiIKKyAgZXhuMyA8LSB0cnkgJCBDbGllbnQudGVzdEV4Y2VwdGlvbiBwcm90ICJzdWNjZXNzIgorICBjYXNlIGV4bjMgb2YKKyAgICBMZWZ0IChfIDo6IFNvbWVFeGNlcHRpb24pIC0+IGV4aXRGYWlsdXJlCisgICAgUmlnaHQgXyAtPiByZXR1cm4gKCkKKworICAtLSBNdWx0aSBFeGNlcHRpb24gVGVzdAorICBwdXRTdHJMbiAidGVzdE11bHRpRXhjZXB0aW9uIgorICBtdWx0aTEgPC0gdHJ5ICQgQ2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbiBwcm90ICJYY2VwdGlvbiIgInRlc3QgMSIKKyAgY2FzZSBtdWx0aTEgb2YKKyAgICBMZWZ0IChYY2VwdGlvbiBfIF8pIC0+IHJldHVybiAoKQorICAgIF8gLT4gZXhpdEZhaWx1cmUKKworICBwdXRTdHJMbiAidGVzdE11bHRpRXhjZXB0aW9uIgorICBtdWx0aTIgPC0gdHJ5ICQgQ2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbiBwcm90ICJYY2VwdGlvbjIiICJ0ZXN0IDIiCisgIGNhc2UgbXVsdGkyIG9mCisgICAgTGVmdCAoWGNlcHRpb24yIF8gXykgLT4gcmV0dXJuICgpCisgICAgXyAtPiBleGl0RmFpbHVyZQorCisgIHB1dFN0ckxuICJ0ZXN0TXVsdGlFeGNlcHRpb24iCisgIG11bHRpMyA8LSB0cnkgJCBDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uIHByb3QgInN1Y2Nlc3MiICJ0ZXN0IDMiCisgIGNhc2UgbXVsdGkzIG9mCisgICAgTGVmdCAoXyA6OiBTb21lRXhjZXB0aW9uKSAtPiBleGl0RmFpbHVyZQorICAgIFJpZ2h0IF8gLT4gcmV0dXJuICgpCisKKworbWFpbiA6OiBJTyAoKQorbWFpbiA9IGRvCisgIG9wdGlvbnMgPC0gZmxpcCBwYXJzZUZsYWdzIGRlZmF1bHRPcHRpb25zIDwkPiBnZXRBcmdzCisgIGNhc2Ugb3B0aW9ucyBvZgorICAgIE5vdGhpbmcgLT4gc2hvd0hlbHAKKyAgICBKdXN0IE9wdGlvbnN7Li59IC0+IGRvCisgICAgICB0cmFucyA8LSBNYWluLmdldFRyYW5zcG9ydCB0cmFuc3BvcnQgaG9zdCBwb3J0CisgICAgICBjYXNlIHRyYW5zIG9mCisgICAgICAgIEJ1ZmZlcmVkIHQgLT4gcnVuVGVzdCB0ZXN0TG9vcHMgcHJvdG9jb2wgdAorICAgICAgICBGcmFtZWQgdCAgIC0+IHJ1blRlc3QgdGVzdExvb3BzIHByb3RvY29sIHQKKyAgICAgICAgSHR0cCB0ICAgICAtPiBydW5UZXN0IHRlc3RMb29wcyBwcm90b2NvbCB0CisgICAgICAgIE5vVHJhbnNwb3J0IGVyciAtPiBwdXRTdHJMbiBlcnIKKyAgd2hlcmUKKyAgICBtYWtlQ2xpZW50IHAgdCA9IGNhc2UgcCBvZgorICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnkgIC0+IHJ1bkNsaWVudCAkIEJpbmFyeVByb3RvY29sIHQKKyAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFjdCAtPiBydW5DbGllbnQgJCBDb21wYWN0UHJvdG9jb2wgdAorICAgICAgICAgICAgICAgICAgICAgICBKU09OICAgIC0+IHJ1bkNsaWVudCAkIEpTT05Qcm90b2NvbCB0CisgICAgICAgICAgICAgICAgICAgICAgIEhlYWRlciAgLT4gY3JlYXRlSGVhZGVyUHJvdG9jb2wgdCB0ID4+PSBydW5DbGllbnQKKyAgICBydW5UZXN0IGxvb3BzIHAgdCA9IGRvCisgICAgICBsZXQgY2xpZW50ID0gbWFrZUNsaWVudCBwIHQKKyAgICAgIHJlcGxpY2F0ZU1fIGxvb3BzIGNsaWVudAorICAgICAgcHV0U3RyTG4gIkNPTVBMRVRFRCBTVUNDRVNTRlVMTFkiCisKK3BhcnNlRmxhZ3MgOjogW1N0cmluZ10gLT4gT3B0aW9ucyAtPiBNYXliZSBPcHRpb25zCitwYXJzZUZsYWdzIChmbGFnIDogZmxhZ3MpIG9wdHMgPSBkbworICBsZXQgcGllY2VzID0gc3BsaXRPbiAiPSIgZmxhZworICBjYXNlIHBpZWNlcyBvZgorICAgICItLXBvcnQiIDogYXJnIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IHBvcnQgPSByZWFkIGFyZyB9CisgICAgIi0tZG9tYWluLXNvY2tldCIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgZG9tYWluU29ja2V0ID0gcmVhZCBhcmcgfQorICAgICItLWhvc3QiIDogYXJnIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IGhvc3QgPSBhcmcgfQorICAgICItLXRyYW5zcG9ydCIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgdHJhbnNwb3J0ID0gYXJnIH0KKyAgICAiLS1wcm90b2NvbCIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgcHJvdG9jb2wgPSBnZXRQcm90b2NvbCBhcmcgfQorICAgICItbiIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgdGVzdExvb3BzID0gcmVhZCBhcmcgfQorICAgICItLWgiIDogXyAtPiBOb3RoaW5nCisgICAgIi0taGVscCIgOiBfIC0+IE5vdGhpbmcKKyAgICAiLS1zc2wiIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IHNzbCA9IFRydWUgfQorICAgICItLXByb2Nlc3Nvci1ldmVudHMiIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHMKKyAgICBfIC0+IE5vdGhpbmcKK3BhcnNlRmxhZ3MgW10gb3B0cyA9IEp1c3Qgb3B0cworCitzaG93SGVscCA6OiBJTyAoKQorc2hvd0hlbHAgPSBwdXRTdHJMbgorICAiQWxsb3dlZCBvcHRpb25zOlxuXAorICBcICAtaCBbIC0taGVscCBdICAgICAgICAgICAgICAgcHJvZHVjZSBoZWxwIG1lc3NhZ2VcblwKKyAgXCAgLS1ob3N0IGFyZyAoPWxvY2FsaG9zdCkgICAgIEhvc3QgdG8gY29ubmVjdFxuXAorICBcICAtLXBvcnQgYXJnICg9OTA5MCkgICAgICAgICAgUG9ydCBudW1iZXIgdG8gY29ubmVjdFxuXAorICBcICAtLWRvbWFpbi1zb2NrZXQgYXJnICAgICAgICAgRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KSxcblwKKyAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgaG9zdCBhbmQgcG9ydFxuXAorICBcICAtLXRyYW5zcG9ydCBhcmcgKD1idWZmZXJlZCkgVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwXG5cCisgIFwgIC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSAgICBQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uXG5cCisgIFwgIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTFxuXAorICBcICAtbiBbIC0tdGVzdGxvb3BzIF0gYXJnICg9MSkgTnVtYmVyIG9mIFRlc3RzIgpkaWZmIC0tZ2l0IGEvdGVzdC9ocy9UZXN0U2VydmVyLmhzIGIvdGVzdC9ocy9UZXN0U2VydmVyLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NzMxYWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hzL1Rlc3RTZXJ2ZXIuaHMKQEAgLTAsMCArMSwzMTIgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCit7LSMgTEFOR1VBR0UgT3ZlcmxvYWRlZFN0cmluZ3MsUmVjb3JkV2lsZENhcmRzICMtfQorbW9kdWxlIE1haW4gd2hlcmUKKworaW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uCitpbXBvcnQgQ29udHJvbC5Nb25hZAoraW1wb3J0IERhdGEuRnVuY3RvcgoraW1wb3J0IERhdGEuSGFzaE1hcC5TdHJpY3QgKEhhc2hNYXApCitpbXBvcnQgRGF0YS5MaXN0CitpbXBvcnQgRGF0YS5MaXN0LlNwbGl0CitpbXBvcnQgRGF0YS5TdHJpbmcKK2ltcG9ydCBOZXR3b3JrCitpbXBvcnQgU3lzdGVtLkVudmlyb25tZW50CitpbXBvcnQgU3lzdGVtLkV4aXQKK2ltcG9ydCBTeXN0ZW0uSU8KK2ltcG9ydCBDb250cm9sLkNvbmN1cnJlbnQgKHRocmVhZERlbGF5KQoraW1wb3J0IHF1YWxpZmllZCBTeXN0ZW0uSU8gYXMgSU8KK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoU2V0IGFzIFNldAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLlRleHQuTGF6eSBhcyBUZXh0CitpbXBvcnQgcXVhbGlmaWVkIERhdGEuVmVjdG9yIGFzIFZlY3RvcgorCitpbXBvcnQgVGhyaWZ0VGVzdAoraW1wb3J0IFRocmlmdFRlc3RfSWZhY2UKK2ltcG9ydCBUaHJpZnRUZXN0X1R5cGVzCisKK2ltcG9ydCBUaHJpZnQKK2ltcG9ydCBUaHJpZnQuU2VydmVyCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5GcmFtZWQKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LkhhbmRsZQoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5CaW5hcnkKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5IZWFkZXIKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuSlNPTgorCitkYXRhIE9wdGlvbnMgPSBPcHRpb25zCisgIHsgcG9ydCAgICAgICAgIDo6IEludAorICAsIGRvbWFpblNvY2tldCA6OiBTdHJpbmcKKyAgLCBzZXJ2ZXJUeXBlICAgOjogU2VydmVyVHlwZQorICAsIHRyYW5zcG9ydCAgICA6OiBTdHJpbmcKKyAgLCBwcm90b2NvbCAgICAgOjogUHJvdG9jb2xUeXBlCisgICwgc3NsICAgICAgICAgIDo6IEJvb2wKKyAgLCB3b3JrZXJzICAgICAgOjogSW50CisgIH0KKworZGF0YSBTZXJ2ZXJUeXBlID0gU2ltcGxlCisgICAgICAgICAgICAgICAgfCBUaHJlYWRQb29sCisgICAgICAgICAgICAgICAgfCBUaHJlYWRlZAorICAgICAgICAgICAgICAgIHwgTm9uQmxvY2tpbmcKKyAgICAgICAgICAgICAgICBkZXJpdmluZyAoU2hvdywgRXEpCisKK2luc3RhbmNlIElzU3RyaW5nIFNlcnZlclR5cGUgd2hlcmUKKyAgZnJvbVN0cmluZyAic2ltcGxlIiAgICAgID0gU2ltcGxlCisgIGZyb21TdHJpbmcgInRocmVhZC1wb29sIiA9IFRocmVhZFBvb2wKKyAgZnJvbVN0cmluZyAidGhyZWFkZWQiICAgID0gVGhyZWFkZWQKKyAgZnJvbVN0cmluZyAibm9uYmxvY2tpbmciID0gTm9uQmxvY2tpbmcKKyAgZnJvbVN0cmluZyBfID0gZXJyb3IgIm5vdCBhIHZhbGlkIHNlcnZlciB0eXBlIgorCitkYXRhIFRyYW5zcG9ydFR5cGUgPSBCdWZmZXJlZCAoU29ja2V0IC0+IChJTyBJTy5IYW5kbGUpKQorICAgICAgICAgICAgICAgICAgIHwgRnJhbWVkIChTb2NrZXQgLT4gKElPIChGcmFtZWRUcmFuc3BvcnQgSU8uSGFuZGxlKSkpCisgICAgICAgICAgICAgICAgICAgfCBOb1RyYW5zcG9ydCBTdHJpbmcKKworZ2V0VHJhbnNwb3J0IDo6IFN0cmluZyAtPiBUcmFuc3BvcnRUeXBlCitnZXRUcmFuc3BvcnQgImJ1ZmZlcmVkIiA9IEJ1ZmZlcmVkICQgXHMgLT4gZG8KKyAgKGgsIF8sIF8pIDwtIChhY2NlcHQgcykKKyAgSU8uaFNldEJ1ZmZlcmluZyBoICQgSU8uQmxvY2tCdWZmZXJpbmcgTm90aGluZworICByZXR1cm4gaAorZ2V0VHJhbnNwb3J0ICJmcmFtZWQiID0gRnJhbWVkICQgXHMgLT4gZG8KKyAgKGgsIF8sIF8pIDwtIChhY2NlcHQgcykKKyAgb3BlbkZyYW1lZFRyYW5zcG9ydCBoCitnZXRUcmFuc3BvcnQgdCA9IE5vVHJhbnNwb3J0ICQgIlVuc3VwcG9ydGVkIHRyYW5zcG9ydDogIiArKyB0CisKK2RhdGEgUHJvdG9jb2xUeXBlID0gQmluYXJ5CisgICAgICAgICAgICAgICAgICB8IENvbXBhY3QKKyAgICAgICAgICAgICAgICAgIHwgSlNPTgorICAgICAgICAgICAgICAgICAgfCBIZWFkZXIKKworZ2V0UHJvdG9jb2wgOjogU3RyaW5nIC0+IFByb3RvY29sVHlwZQorZ2V0UHJvdG9jb2wgImJpbmFyeSIgID0gQmluYXJ5CitnZXRQcm90b2NvbCAiY29tcGFjdCIgPSBDb21wYWN0CitnZXRQcm90b2NvbCAianNvbiIgICAgPSBKU09OCitnZXRQcm90b2NvbCAiaGVhZGVyIiAgPSBIZWFkZXIKK2dldFByb3RvY29sIHAgPSBlcnJvciAkIlVuc3VwcG9ydGVkIFByb3RvY29sOiAiICsrIHAKKworZGVmYXVsdE9wdGlvbnMgOjogT3B0aW9ucworZGVmYXVsdE9wdGlvbnMgPSBPcHRpb25zCisgIHsgcG9ydCAgICAgICAgID0gOTA5MAorICAsIGRvbWFpblNvY2tldCA9ICIiCisgICwgc2VydmVyVHlwZSAgID0gVGhyZWFkZWQKKyAgLCB0cmFuc3BvcnQgICAgPSAiYnVmZmVyZWQiCisgICwgcHJvdG9jb2wgICAgID0gQmluYXJ5CisgIC0tIFRPRE86IEhhc2tlbGwgbGliIGRvZXMgbm90IGhhdmUgU1NMIHN1cHBvcnQKKyAgLCBzc2wgICAgICAgICAgPSBGYWxzZQorICAsIHdvcmtlcnMgICAgICA9IDQKKyAgfQorCitzdHJpbmdpZnlNYXAgOjogKFNob3cgYSwgU2hvdyBiKSA9PiBNYXAuSGFzaE1hcCBhIGIgLT4gU3RyaW5nCitzdHJpbmdpZnlNYXAgPSBEYXRhLkxpc3QuaW50ZXJjYWxhdGUgIiwgIiAuIERhdGEuTGlzdC5tYXAgam9pbktWIC4gTWFwLnRvTGlzdAorICB3aGVyZSBqb2luS1YgKGssIHYpID0gc2hvdyBrICsrICIgPT4gIiArKyBzaG93IHYKKworc3RyaW5naWZ5U2V0IDo6IFNob3cgYSA9PiBTZXQuSGFzaFNldCBhIC0+IFN0cmluZworc3RyaW5naWZ5U2V0ID0gRGF0YS5MaXN0LmludGVyY2FsYXRlICIsICIgLiBEYXRhLkxpc3QubWFwIHNob3cgLiBTZXQudG9MaXN0CisKK3N0cmluZ2lmeUxpc3QgOjogU2hvdyBhID0+IFZlY3Rvci5WZWN0b3IgYSAtPiBTdHJpbmcKK3N0cmluZ2lmeUxpc3QgPSBEYXRhLkxpc3QuaW50ZXJjYWxhdGUgIiwgIiAuIERhdGEuTGlzdC5tYXAgc2hvdyAuIFZlY3Rvci50b0xpc3QKKworZGF0YSBUZXN0SGFuZGxlciA9IFRlc3RIYW5kbGVyCitpbnN0YW5jZSBUaHJpZnRUZXN0X0lmYWNlIFRlc3RIYW5kbGVyIHdoZXJlCisgIHRlc3RWb2lkIF8gPSBTeXN0ZW0uSU8ucHV0U3RyTG4gInRlc3RWb2lkKCkiCisKKyAgdGVzdFN0cmluZyBfIHMgPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0U3RyaW5nKCIgKysgc2hvdyBzICsrICIpIgorICAgIHJldHVybiBzCisKKyAgdGVzdEJvb2wgXyB4ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdEJvb2woIiArKyBzaG93IHggKysgIikiCisgICAgcmV0dXJuIHgKKworICB0ZXN0Qnl0ZSBfIHggPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0Qnl0ZSgiICsrIHNob3cgeCArKyAiKSIKKyAgICByZXR1cm4geAorCisgIHRlc3RJMzIgXyB4ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdEkzMigiICsrIHNob3cgeCArKyAiKSIKKyAgICByZXR1cm4geAorCisgIHRlc3RJNjQgXyB4ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdEk2NCgiICsrIHNob3cgeCArKyAiKSIKKyAgICByZXR1cm4geAorCisgIHRlc3REb3VibGUgXyB4ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdERvdWJsZSgiICsrIHNob3cgeCArKyAiKSIKKyAgICByZXR1cm4geAorCisgIHRlc3RCaW5hcnkgXyB4ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdEJpbmFyeSgiICsrIHNob3cgeCArKyAiKSIKKyAgICByZXR1cm4geAorCisgIHRlc3RTdHJ1Y3QgXyBzdHJ1Y3RAWHRydWN0ey4ufSA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RTdHJ1Y3QoeyIgKysgc2hvdyB4dHJ1Y3Rfc3RyaW5nX3RoaW5nCisgICAgICAgICAgICAgICAgICAgICAgKysgIiwgIiArKyBzaG93IHh0cnVjdF9ieXRlX3RoaW5nCisgICAgICAgICAgICAgICAgICAgICAgKysgIiwgIiArKyBzaG93IHh0cnVjdF9pMzJfdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICArKyAiLCAiICsrIHNob3cgeHRydWN0X2k2NF90aGluZworICAgICAgICAgICAgICAgICAgICAgICsrICJ9KSIKKyAgICByZXR1cm4gc3RydWN0CisKKyAgdGVzdE5lc3QgXyBuZXN0QFh0cnVjdDJ7Li59ID0gZG8KKyAgICBsZXQgWHRydWN0ey4ufSA9IHh0cnVjdDJfc3RydWN0X3RoaW5nCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3ROZXN0KHsiICsrIHNob3cgeHRydWN0Ml9ieXRlX3RoaW5nCisgICAgICAgICAgICAgICAgICAgKysgInssICIgKysgc2hvdyB4dHJ1Y3Rfc3RyaW5nX3RoaW5nCisgICAgICAgICAgICAgICAgICAgKysgICIsICIgKysgc2hvdyB4dHJ1Y3RfYnl0ZV90aGluZworICAgICAgICAgICAgICAgICAgICsrICAiLCAiICsrIHNob3cgeHRydWN0X2kzMl90aGluZworICAgICAgICAgICAgICAgICAgICsrICAiLCAiICsrIHNob3cgeHRydWN0X2k2NF90aGluZworICAgICAgICAgICAgICAgICAgICsrICJ9LCAiICsrIHNob3cgeHRydWN0Ml9pMzJfdGhpbmcKKyAgICByZXR1cm4gbmVzdAorCisgIHRlc3RNYXAgXyBtID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdE1hcCh7IiArKyBzdHJpbmdpZnlNYXAgbSArKyAifSkiCisgICAgcmV0dXJuIG0KKworICB0ZXN0U3RyaW5nTWFwIF8gbSA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RTdHJpbmdNYXAoIiArKyBzdHJpbmdpZnlNYXAgbSArKyAifSkiCisgICAgcmV0dXJuIG0KKworICB0ZXN0U2V0IF8geCA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RTZXQoeyIgKysgc3RyaW5naWZ5U2V0IHggKysgIn0pIgorICAgIHJldHVybiB4CisKKyAgdGVzdExpc3QgXyB4ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdExpc3QoIiArKyBzdHJpbmdpZnlMaXN0IHggKysgIn0pIgorICAgIHJldHVybiB4CisKKyAgdGVzdEVudW0gXyB4ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdEVudW0oIiArKyBzaG93IHggKysgIikiCisgICAgcmV0dXJuIHgKKworICB0ZXN0VHlwZWRlZiBfIHggPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0VHlwZWRlZigiICsrIHNob3cgeCArKyAiKSIKKyAgICByZXR1cm4geAorCisgIHRlc3RNYXBNYXAgXyB4ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdE1hcE1hcCgiICsrIHNob3cgeCArKyAiKSIKKyAgICByZXR1cm4gJCBNYXAuZnJvbUxpc3QgWyAoLTQsIE1hcC5mcm9tTGlzdCBbICgtNCwgLTQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAoLTMsIC0zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgKC0yLCAtMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICgtMSwgLTEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLCAoNCwgIE1hcC5mcm9tTGlzdCBbICgxLCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgKDIsIDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAoMywgMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICg0LCA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgIF0KKworICB0ZXN0SW5zYW5pdHkgXyB4ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gInRlc3RJbnNhbml0eSgpIgorICAgIHJldHVybiAkIE1hcC5mcm9tTGlzdCBbICgxLCBNYXAuZnJvbUxpc3QgWyAoVFdPICAsIHgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIChUSFJFRSwgeCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICwgKDIsIE1hcC5mcm9tTGlzdCBbIChTSVgsIGRlZmF1bHRfSW5zYW5pdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICBdCisKKyAgdGVzdE11bHRpIF8gYnl0ZSBpMzIgaTY0IF8gXyBfID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gInRlc3RNdWx0aSgpIgorICAgIHJldHVybiBYdHJ1Y3R7IHh0cnVjdF9zdHJpbmdfdGhpbmcgPSBUZXh0LnBhY2sgIkhlbGxvMiIKKyAgICAgICAgICAgICAgICAgLCB4dHJ1Y3RfYnl0ZV90aGluZyAgID0gYnl0ZQorICAgICAgICAgICAgICAgICAsIHh0cnVjdF9pMzJfdGhpbmcgICAgPSBpMzIKKyAgICAgICAgICAgICAgICAgLCB4dHJ1Y3RfaTY0X3RoaW5nICAgID0gaTY0CisgICAgICAgICAgICAgICAgIH0KKworICB0ZXN0RXhjZXB0aW9uIF8gcyA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RFeGNlcHRpb24oIiArKyBzaG93IHMgKysgIikiCisgICAgY2FzZSBzIG9mCisgICAgICAiWGNlcHRpb24iICAgLT4gdGhyb3cgJCBYY2VwdGlvbiAxMDAxIHMKKyAgICAgICJURXhjZXB0aW9uIiAtPiB0aHJvdyBUaHJpZnRFeGNlcHRpb24KKyAgICAgIF8gLT4gcmV0dXJuICgpCisKKyAgdGVzdE11bHRpRXhjZXB0aW9uIF8gczEgczIgPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0TXVsdGlFeGNlcHRpb24oIiArKyBzaG93IHMxICsrICIsICIgKysgc2hvdyBzMiArKyAgIikiCisgICAgY2FzZSBzMSBvZgorICAgICAgIlhjZXB0aW9uIiAgIC0+IHRocm93ICQgWGNlcHRpb24gMTAwMSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIKKyAgICAgICJYY2VwdGlvbjIiICAtPiB0aHJvdyAkIFhjZXB0aW9uMiAyMDAyICQgWHRydWN0ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIgMCAwIDAKKyAgICAgICJURXhjZXB0aW9uIiAtPiB0aHJvdyBUaHJpZnRFeGNlcHRpb24KKyAgICAgIF8gLT4gcmV0dXJuIGRlZmF1bHRfWHRydWN0eyB4dHJ1Y3Rfc3RyaW5nX3RoaW5nID0gczIgfQorCisgIHRlc3RPbmV3YXkgXyBpID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdE9uZXdheSgiICsrIHNob3cgaSArKyAiKTogU2xlZXBpbmcuLi4iCisgICAgdGhyZWFkRGVsYXkgJCAoZnJvbUludGVncmFsIGkpICogMTAwMDAwMAorICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0T25ld2F5KCIgKysgc2hvdyBpICsrICIpOiBkb25lIHNsZWVwaW5nISIKKworbWFpbiA6OiBJTyAoKQorbWFpbiA9IGRvCisgIG9wdGlvbnMgPC0gZmxpcCBwYXJzZUZsYWdzIGRlZmF1bHRPcHRpb25zIDwkPiBnZXRBcmdzCisgIGNhc2Ugb3B0aW9ucyBvZgorICAgIE5vdGhpbmcgLT4gc2hvd0hlbHAKKyAgICBKdXN0IE9wdGlvbnN7Li59IC0+IGRvCisgICAgICBjYXNlIE1haW4uZ2V0VHJhbnNwb3J0IHRyYW5zcG9ydCBvZgorICAgICAgICBCdWZmZXJlZCBmIC0+IHJ1blNlcnZlciBwcm90b2NvbCBmIHBvcnQKKyAgICAgICAgRnJhbWVkICAgZiAtPiBydW5TZXJ2ZXIgcHJvdG9jb2wgZiBwb3J0CisgICAgICAgIE5vVHJhbnNwb3J0IGVyciAtPiBwdXRTdHJMbiBlcnIKKyAgICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJTdGFydGluZyBcIiIgKysgc2hvdyBzZXJ2ZXJUeXBlICsrICJcIiBzZXJ2ZXIgKCIgKysKKyAgICAgICAgc2hvdyB0cmFuc3BvcnQgKysgIikgbGlzdGVuIG9uOiAiICsrIGRvbWFpblNvY2tldCArKyBzaG93IHBvcnQKKyAgICAgIHdoZXJlCisgICAgICAgIGFjY2VwdG9yIHAgZiBzb2NrZXQgPSBkbworICAgICAgICAgIHQgPC0gZiBzb2NrZXQKKyAgICAgICAgICByZXR1cm4gKHAgdCwgcCB0KQorCisgICAgICAgIGhlYWRlckFjY2VwdG9yIGYgc29ja2V0ID0gZG8KKyAgICAgICAgICB0IDwtIGYgc29ja2V0CisgICAgICAgICAgcCA8LSBjcmVhdGVIZWFkZXJQcm90b2NvbDEgdAorICAgICAgICAgIHJldHVybiAocCwgcCkKKworICAgICAgICBkb1J1blNlcnZlciBwIGYgPSBkbworICAgICAgICAgIHJ1blRocmVhZGVkU2VydmVyIChhY2NlcHRvciBwIGYpIFRlc3RIYW5kbGVyIFRocmlmdFRlc3QucHJvY2VzcyAuIFBvcnROdW1iZXIgLiBmcm9tSW50ZWdyYWwKKworICAgICAgICBydW5TZXJ2ZXIgcCBmIHBvcnQgPSBjYXNlIHAgb2YKKyAgICAgICAgICBCaW5hcnkgIC0+IGRvUnVuU2VydmVyIEJpbmFyeVByb3RvY29sIGYgcG9ydAorICAgICAgICAgIENvbXBhY3QgLT4gZG9SdW5TZXJ2ZXIgQ29tcGFjdFByb3RvY29sIGYgcG9ydAorICAgICAgICAgIEpTT04gICAgLT4gZG9SdW5TZXJ2ZXIgSlNPTlByb3RvY29sIGYgcG9ydAorICAgICAgICAgIEhlYWRlciAgLT4gcnVuVGhyZWFkZWRTZXJ2ZXIgKGhlYWRlckFjY2VwdG9yIGYpIFRlc3RIYW5kbGVyIFRocmlmdFRlc3QucHJvY2VzcyAoUG9ydE51bWJlciAkIGZyb21JbnRlZ3JhbCBwb3J0KQorCitwYXJzZUZsYWdzIDo6IFtTdHJpbmddIC0+IE9wdGlvbnMgLT4gTWF5YmUgT3B0aW9ucworcGFyc2VGbGFncyAoZmxhZyA6IGZsYWdzKSBvcHRzID0gZG8KKyAgbGV0IHBpZWNlcyA9IHNwbGl0T24gIj0iIGZsYWcKKyAgY2FzZSBwaWVjZXMgb2YKKyAgICAiLS1wb3J0IiA6IGFyZyA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyBwb3J0ID0gcmVhZCBhcmcgfQorICAgICItLWRvbWFpbi1zb2NrZXQiIDogYXJnIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IGRvbWFpblNvY2tldCA9IHJlYWQgYXJnIH0KKyAgICAiLS1zZXJ2ZXItdHlwZSIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgc2VydmVyVHlwZSA9IGZyb21TdHJpbmcgYXJnIH0KKyAgICAiLS10cmFuc3BvcnQiIDogYXJnIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IHRyYW5zcG9ydCA9IGFyZyB9CisgICAgIi0tcHJvdG9jb2wiIDogYXJnIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IHByb3RvY29sID0gZ2V0UHJvdG9jb2wgYXJnIH0KKyAgICAiLS13b3JrZXJzIiA6IGFyZyA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyB3b3JrZXJzID0gcmVhZCBhcmcgfQorICAgICItbiIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgd29ya2VycyA9IHJlYWQgYXJnIH0KKyAgICAiLS1oIiA6IF8gLT4gTm90aGluZworICAgICItLWhlbHAiIDogXyAtPiBOb3RoaW5nCisgICAgIi0tc3NsIiA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyBzc2wgPSBUcnVlIH0KKyAgICAiLS1wcm9jZXNzb3ItZXZlbnRzIiA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzCisgICAgXyAtPiBOb3RoaW5nCitwYXJzZUZsYWdzIFtdIG9wdHMgPSBKdXN0IG9wdHMKKworc2hvd0hlbHAgOjogSU8gKCkKK3Nob3dIZWxwID0gU3lzdGVtLklPLnB1dFN0ckxuCisgICJBbGxvd2VkIG9wdGlvbnM6XG5cCisgIFwgIC1oIFsgLS1oZWxwIF0gICAgICAgICAgICAgICBwcm9kdWNlIGhlbHAgbWVzc2FnZVxuXAorICBcICAtLXBvcnQgYXJnICg9OTA5MCkgICAgICAgICAgUG9ydCBudW1iZXIgdG8gbGlzdGVuXG5cCisgIFwgIC0tZG9tYWluLXNvY2tldCBhcmcgICAgICAgICBVbml4IERvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdClcblwKKyAgXCAgLS1zZXJ2ZXItdHlwZSBhcmcgKD1zaW1wbGUpIHR5cGUgb2Ygc2VydmVyLCBcInNpbXBsZVwiLCBcInRocmVhZC1wb29sXCIsXG5cCisgIFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInRocmVhZGVkXCIsIG9yIFwibm9uYmxvY2tpbmdcIlxuXAorICBcICAtLXRyYW5zcG9ydCBhcmcgKD1idWZmZXJlZCkgdHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkXG5cCisgIFwgIC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSAgICBwcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uXG5cCisgIFwgIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTFxuXAorICBcICAtLXByb2Nlc3Nvci1ldmVudHMgICAgICAgICAgcHJvY2Vzc29yLWV2ZW50c1xuXAorICBcICAtbiBbIC0td29ya2VycyBdIGFyZyAoPTQpICAgTnVtYmVyIG9mIHRocmVhZCBwb29scyB3b3JrZXJzLiBPbmx5IHZhbGlkIGZvclxuXAorICBcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLXBvb2wgc2VydmVyIHR5cGUiCmRpZmYgLS1naXQgYS90ZXN0L2hzL1RocmlmdFRlc3RVdGlscy5ocyBiL3Rlc3QvaHMvVGhyaWZ0VGVzdFV0aWxzLmhzCmluZGV4IDkzZmExMjIuLjljMTliNTYgMTAwNjQ0Ci0tLSBhL3Rlc3QvaHMvVGhyaWZ0VGVzdFV0aWxzLmhzCisrKyBiL3Rlc3QvaHMvVGhyaWZ0VGVzdFV0aWxzLmhzCkBAIC02MCw2ICs2MCw2IEBACiAgICAgQ29udHJvbC5Db25jdXJyZW50LnRocmVhZERlbGF5ICQgNTAwICogMTAwMCAtLSB1bml0IGlzIGluIF9taWNyb19zZWNvbmRzCiAgICAgQ29udHJvbC5Db25jdXJyZW50LnlpZWxkCiAKLSAgICBfIDwtIGNsaWVudCBzZXJ2ZXJBZGRyZXNzCisgICAgY2xpZW50IHNlcnZlckFkZHJlc3MKIAogICAgIHRlc3RMb2cgIlNVQ0NFU1MiCmRpZmYgLS1naXQgYS90ZXN0L2hzL1RocmlmdFRlc3RfTWFpbi5ocyBiL3Rlc3QvaHMvVGhyaWZ0VGVzdF9NYWluLmhzCmluZGV4IDJmOWZjNGEuLjY3MDAyM2UgMTAwNjQ0Ci0tLSBhL3Rlc3QvaHMvVGhyaWZ0VGVzdF9NYWluLmhzCisrKyBiL3Rlc3QvaHMvVGhyaWZ0VGVzdF9NYWluLmhzCkBAIC0xOCwxMiArMTgsMTYgQEAKIC0tIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0KIAorey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzICMtfQorCiBtb2R1bGUgTWFpbiB3aGVyZQogCiAKIGltcG9ydCBxdWFsaWZpZWQgQ29udHJvbC5FeGNlcHRpb24KLWltcG9ydCBxdWFsaWZpZWQgRGF0YS5NYXAgYXMgTWFwCi1pbXBvcnQgcXVhbGlmaWVkIERhdGEuU2V0IGFzIFNldAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIE1hcAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hTZXQgYXMgU2V0CitpbXBvcnQgcXVhbGlmaWVkIERhdGEuVmVjdG9yIGFzIFZlY3RvcgorCiBpbXBvcnQgcXVhbGlmaWVkIE5ldHdvcmsKIAogaW1wb3J0IFRocmlmdApAQCAtNDMsMTI0ICs0Nyw4MCBAQAogaW5zdGFuY2UgSWZhY2UuVGhyaWZ0VGVzdF9JZmFjZSBUZXN0SGFuZGxlciB3aGVyZQogICAgIHRlc3RWb2lkIF8gPSByZXR1cm4gKCkKIAotICAgIHRlc3RTdHJpbmcgXyAoSnVzdCBzKSA9IGRvCi0gICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgcworICAgIHRlc3RTdHJpbmcgXyBzID0gZG8KKyAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgcwogICAgICAgICByZXR1cm4gcwogCi0gICAgdGVzdFN0cmluZyBfIE5vdGhpbmcgPSBkbwotICAgICAgICBlcnJvciAkICJVbnN1cHBvcnRlZCB0ZXN0U3RyaW5nIGZvcm0iCi0KLSAgICB0ZXN0Qnl0ZSBfIChKdXN0IHgpID0gZG8KKyAgICB0ZXN0Qnl0ZSBfIHggPSBkbwogICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgc2hvdyB4CiAgICAgICAgIHJldHVybiB4CiAKLSAgICB0ZXN0Qnl0ZSBfIE5vdGhpbmcgPSBkbwotICAgICAgICBlcnJvciAkICJVbnN1cHBvcnRlZCB0ZXN0Qnl0ZSBmb3JtIgotCi0gICAgdGVzdEkzMiBfIChKdXN0IHgpID0gZG8KKyAgICB0ZXN0STMyIF8geCA9IGRvCiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKICAgICAgICAgcmV0dXJuIHgKIAotICAgIHRlc3RJMzIgXyBOb3RoaW5nID0gZG8KLSAgICAgICAgZXJyb3IgJCAiVW5zdXBwb3J0ZWQgdGVzdEkzMiBmb3JtIgotCi0gICAgdGVzdEk2NCBfIChKdXN0IHgpID0gZG8KKyAgICB0ZXN0STY0IF8geCA9IGRvCiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKICAgICAgICAgcmV0dXJuIHgKIAotICAgIHRlc3RJNjQgXyBOb3RoaW5nID0gZG8KLSAgICAgICAgZXJyb3IgJCAiVW5zdXBwb3J0ZWQgdGVzdEk2NCBmb3JtIgotCi0gICAgdGVzdERvdWJsZSBfIChKdXN0IHgpID0gZG8KKyAgICB0ZXN0RG91YmxlIF8geCA9IGRvCiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKICAgICAgICAgcmV0dXJuIHgKIAotICAgIHRlc3REb3VibGUgXyBOb3RoaW5nID0gZG8KLSAgICAgICAgZXJyb3IgJCAiVW5zdXBwb3J0ZWQgdGVzdERvdWJsZSBmb3JtIgotCi0gICAgdGVzdFN0cnVjdCBfIChKdXN0IHgpID0gZG8KKyAgICB0ZXN0QmluYXJ5IF8geCA9IGRvCiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKICAgICAgICAgcmV0dXJuIHgKIAotICAgIHRlc3RTdHJ1Y3QgXyBOb3RoaW5nID0gZG8KLSAgICAgICAgZXJyb3IgJCAiVW5zdXBwb3J0ZWQgdGVzdFN0cnVjdCBmb3JtIgotCi0gICAgdGVzdE5lc3QgXyAoSnVzdCB4KSA9IGRvCisgICAgdGVzdFN0cnVjdCBfIHggPSBkbwogICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgc2hvdyB4CiAgICAgICAgIHJldHVybiB4CiAKLSAgICB0ZXN0TmVzdCBfIE5vdGhpbmcgPSBkbwotICAgICAgICBlcnJvciAkICJVbnN1cHBvcnRlZCB0ZXN0TmVzdCBmb3JtIgotCi0gICAgdGVzdE1hcCBfIChKdXN0IHgpID0gZG8KKyAgICB0ZXN0TmVzdCBfIHggPSBkbwogICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgc2hvdyB4CiAgICAgICAgIHJldHVybiB4CiAKLSAgICB0ZXN0TWFwIF8gTm90aGluZyA9IGRvCi0gICAgICAgIGVycm9yICQgIlVuc3VwcG9ydGVkIHRlc3RNYXAgZm9ybSIKLQotICAgIHRlc3RTdHJpbmdNYXAgXyAoSnVzdCB4KSA9IGRvCisgICAgdGVzdE1hcCBfIHggPSBkbwogICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgc2hvdyB4CiAgICAgICAgIHJldHVybiB4CiAKLSAgICB0ZXN0U3RyaW5nTWFwIF8gTm90aGluZyA9IGRvCi0gICAgICAgIGVycm9yICQgIlVuc3VwcG9ydGVkIHRlc3RNYXAgZm9ybSIKLQotICAgIHRlc3RTZXQgXyAoSnVzdCB4KSA9IGRvCisgICAgdGVzdFN0cmluZ01hcCBfIHggPSBkbwogICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgc2hvdyB4CiAgICAgICAgIHJldHVybiB4CiAKLSAgICB0ZXN0U2V0IF8gTm90aGluZyA9IGRvCi0gICAgICAgIGVycm9yICQgIlVuc3VwcG9ydGVkIHRlc3RTZXQgZm9ybSIKLQotICAgIHRlc3RMaXN0IF8gKEp1c3QgeCkgPSBkbworICAgIHRlc3RTZXQgXyB4ID0gZG8KICAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgeAogICAgICAgICByZXR1cm4geAogCi0gICAgdGVzdExpc3QgXyBOb3RoaW5nID0gZG8KLSAgICAgICAgZXJyb3IgJCAiVW5zdXBwb3J0ZWQgdGVzdExpc3QgZm9ybSIKLQotICAgIHRlc3RFbnVtIF8gKEp1c3QgeCkgPSBkbworICAgIHRlc3RMaXN0IF8geCA9IGRvCiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKICAgICAgICAgcmV0dXJuIHgKIAotICAgIHRlc3RFbnVtIF8gTm90aGluZyA9IGRvCi0gICAgICAgIGVycm9yICQgIlVuc3VwcG9ydGVkIHRlc3RFbnVtIGZvcm0iCi0KLSAgICB0ZXN0VHlwZWRlZiBfIChKdXN0IHgpID0gZG8KKyAgICB0ZXN0RW51bSBfIHggPSBkbwogICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgc2hvdyB4CiAgICAgICAgIHJldHVybiB4CiAKLSAgICB0ZXN0VHlwZWRlZiBfIE5vdGhpbmcgPSBkbwotICAgICAgICBlcnJvciAkICJVbnN1cHBvcnRlZCB0ZXN0VHlwZWRlZiBmb3JtIgorICAgIHRlc3RUeXBlZGVmIF8geCA9IGRvCisgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKKyAgICAgICAgcmV0dXJuIHgKIAotICAgIHRlc3RNYXBNYXAgXyAoSnVzdCBfKSA9IGRvCisgICAgdGVzdE1hcE1hcCBfIF8gPSBkbwogICAgICAgICByZXR1cm4gKE1hcC5mcm9tTGlzdCBbKDEsIE1hcC5mcm9tTGlzdCBbKDIsIDIpXSldKQogCi0gICAgdGVzdE1hcE1hcCBfIE5vdGhpbmcgPSBkbwotICAgICAgICBlcnJvciAkICJVbnN1cHBvcnRlZCB0ZXN0TWFwTWFwIGZvcm0iCi0KLSAgICB0ZXN0SW5zYW5pdHkgXyAoSnVzdCB4KSA9IGRvCisgICAgdGVzdEluc2FuaXR5IF8geCA9IGRvCiAgICAgICAgIHJldHVybiAoTWFwLmZyb21MaXN0IFsoMSwgTWFwLmZyb21MaXN0IFsoVHlwZXMuT05FLCB4KV0pXSkKIAotICAgIHRlc3RJbnNhbml0eSBfIE5vdGhpbmcgPSBkbwotICAgICAgICBlcnJvciAkICJVbnN1cHBvcnRlZCB0ZXN0SW5zYW5pdHkgZm9ybSIKLQogICAgIHRlc3RNdWx0aSBfIF8gXyBfIF8gXyBfID0gZG8KLSAgICAgICAgcmV0dXJuIChUeXBlcy5YdHJ1Y3QgTm90aGluZyBOb3RoaW5nIE5vdGhpbmcgTm90aGluZykKKyAgICAgICAgcmV0dXJuIChUeXBlcy5YdHJ1Y3QgIiIgMCAwIDApCiAKICAgICB0ZXN0RXhjZXB0aW9uIF8gXyA9IGRvCi0gICAgICAgIENvbnRyb2wuRXhjZXB0aW9uLnRocm93IChUeXBlcy5YY2VwdGlvbiAoSnVzdCAxKSAoSnVzdCAiYnlhIikpCisgICAgICAgIENvbnRyb2wuRXhjZXB0aW9uLnRocm93IChUeXBlcy5YY2VwdGlvbiAxICJieWEiKQogCiAgICAgdGVzdE11bHRpRXhjZXB0aW9uIF8gXyBfID0gZG8KLSAgICAgICAgQ29udHJvbC5FeGNlcHRpb24udGhyb3cgKFR5cGVzLlhjZXB0aW9uIChKdXN0IDEpIChKdXN0ICJ4eXoiKSkKKyAgICAgICAgQ29udHJvbC5FeGNlcHRpb24udGhyb3cgKFR5cGVzLlhjZXB0aW9uIDEgInh5eiIpCiAKLSAgICB0ZXN0T25ld2F5IF8gKEp1c3QgaSkgPSBkbworICAgIHRlc3RPbmV3YXkgXyBpID0gZG8KICAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgaQogCi0gICAgdGVzdE9uZXdheSBfIE5vdGhpbmcgPSBkbwotICAgICAgICBlcnJvciAkICJVbnN1cHBvcnRlZCB0ZXN0T25ld2F5IGZvcm0iCi0KIAogY2xpZW50IDo6IChTdHJpbmcsIE5ldHdvcmsuUG9ydElEKSAtPiBJTyAoKQogY2xpZW50IGFkZHIgPSBkbwpAQCAtMTY4LDcgKzEyOCw3IEBACiAgICAgbGV0IHBzID0gKEJpbmFyeVByb3RvY29sIHRvLCBCaW5hcnlQcm90b2NvbCB0bykKIAogICAgIHYxIDwtIENsaWVudC50ZXN0U3RyaW5nIHBzICJieWEiCi0gICAgVGhyaWZ0VGVzdFV0aWxzLmNsaWVudExvZyB2MQorICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgJCBzaG93IHYxCiAKICAgICB2MiA8LSBDbGllbnQudGVzdEJ5dGUgcHMgOAogICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgJCBzaG93IHYyCkBAIC0xOTQsMTkgKzE1NCwyMSBAQAogICAgIHY5IDwtIENsaWVudC50ZXN0RG91YmxlIHBzICgtMy4xNCkKICAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2OQogCisgICAgLS0gVE9ETzogQ2xpZW50LnRlc3RCaW5hcnkgLi4uCisJCiAgICAgdjEwIDwtIENsaWVudC50ZXN0TWFwIHBzIChNYXAuZnJvbUxpc3QgWygxLDEpLCgyLDIpLCgzLDMpXSkKICAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2MTAKIAogICAgIHYxMSA8LSBDbGllbnQudGVzdFN0cmluZ01hcCBwcyAoTWFwLmZyb21MaXN0IFsoImEiLCIxMjMiKSwoImEgYiIsIndpdGggc3BhY2VzICIpLCgic2FtZSIsInNhbWUiKSwoIjAiLCJudW1lcmljIGtleSIpXSkKICAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2MTEKIAotICAgIHYxMiA8LSBDbGllbnQudGVzdExpc3QgcHMgWzEsMiwzLDQsNV0KKyAgICB2MTIgPC0gQ2xpZW50LnRlc3RMaXN0IHBzIChWZWN0b3IuZnJvbUxpc3QgWzEsMiwzLDQsNV0pCiAgICAgVGhyaWZ0VGVzdFV0aWxzLmNsaWVudExvZyAkIHNob3cgdjEyCiAKICAgICB2MTMgPC0gQ2xpZW50LnRlc3RTZXQgcHMgKFNldC5mcm9tTGlzdCBbMSwyLDMsNCw1XSkKICAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2MTMKIAotICAgIHYxNCA8LSBDbGllbnQudGVzdFN0cnVjdCBwcyAoVHlwZXMuWHRydWN0IChKdXN0ICJoaSIpIChKdXN0IDQpIChKdXN0IDUpIE5vdGhpbmcpCisgICAgdjE0IDwtIENsaWVudC50ZXN0U3RydWN0IHBzIChUeXBlcy5YdHJ1Y3QgImhpIiA0IDUgMCkKICAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2MTQKIAogICAgICh0ZXN0RXhjZXB0aW9uIHBzICJiYWQiKSBgQ29udHJvbC5FeGNlcHRpb24uY2F0Y2hgIHRlc3RFeGNlcHRpb25IYW5kbGVyCkBAIC0yMTgsNyArMTgwLDcgQEAKIAogICAgIHRDbG9zZSB0bwogICB3aGVyZSB0ZXN0RXhjZXB0aW9uIHBzIG1zZyA9IGRvCi0gICAgICAgICAgICBDbGllbnQudGVzdEV4Y2VwdGlvbiBwcyAiZSIKKyAgICAgICAgICAgIF8gPC0gQ2xpZW50LnRlc3RFeGNlcHRpb24gcHMgImUiCiAgICAgICAgICAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nIG1zZwogICAgICAgICAgICAgcmV0dXJuICgpCiAKZGlmZiAtLWdpdCBhL3Rlc3QvaHMvcnVuLXRlc3Quc2ggYi90ZXN0L2hzL3J1bi10ZXN0LnNoCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggNDc4OGZmMi4uZWNhZmMxOAotLS0gYS90ZXN0L2hzL3J1bi10ZXN0LnNoCisrKyBiL3Rlc3QvaHMvcnVuLXRlc3Quc2gKQEAgLTI5LDMwICsyOSw2IEBACiAgICAgQkFTRT0uLi8uLgogZmkKIAotaWYgWyAteiAkVEhSSUZUX0JJTiBdOyB0aGVuCi0gICAgVEhSSUZUX0JJTj0kQkFTRS9jb21waWxlci9jcHAvdGhyaWZ0IAotZmkKLQotaWYgWyAhIC14ICIkVEhSSUZUX0JJTiIgXTsgdGhlbgotICAgIHByaW50ZiAiQ291bGQgbm90IGZpbmQgdGhyaWZ0IGJpbmFyeTsgcGFzcyBpdCBhcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBUSFJJRlRfQklOXG4iCi0gICAgZXhpdCAxCi1maQotCi0jIEZpZ3VyZSBvdXQgd2hhdCBmaWxlIHRvIGdlbmVyYXRlIGJpbmRpbmdzIGZyb20KLWlmIFsgLXogJFRIUklGVF9GSUxFIF07IHRoZW4KLSAgICBUSFJJRlRfRklMRT0kQkFTRS90ZXN0LyQxLnRocmlmdAotZmkKLQotaWYgWyAhIC1lICRUSFJJRlRfRklMRSBdOyB0aGVuCi0gICAgcHJpbnRmICJNaXNzaW5nIHRocmlmdCBmaWxlICRUSFJJRlRfRklMRSBcbiIKLSAgICBleGl0IDIKLWZpCi0KLWlmIFsgISAtZSAiJFRIUklGVF9GSUxFIiBdOyB0aGVuCi0gICAgcHJpbnRmICJDb3VsZCBub3QgZmluZCB0aHJpZnQgZmlsZSB0byBydW47IHBhc3MgaXQgYXMgZW52aXJvbm1lbnQgdmFyaWFibGUgVEhSSUZUX0ZJTEVcbiIKLSAgICBleGl0IDEKLWZpCi0KICMgRmlndXJlIG91dCB3aGF0IGZpbGUgdG8gcnVuIGhhcyBhIHNlcnZlcgogaWYgWyAteiAkVEVTVF9TT1VSQ0VfRklMRSBdOyB0aGVuCiAgICAgVEVTVF9TT1VSQ0VfRklMRT0kQkFTRS90ZXN0L2hzLyQxX01haW4uaHMKQEAgLTYzLDkgKzM5LDUgQEAKICAgICBleGl0IDMKIGZpCiAKLSMgQWN0dWFsbHkgcnVuIHRoZSBzZXJ2ZXIgYml0cwotcHJpbnRmICJHZW5lcmF0aW5nIGJpbmRpbmdzLi4uIFxuIgotJFRIUklGVF9CSU4gLS1nZW4gaHMgJFRIUklGVF9GSUxFCi0KIHByaW50ZiAiUnVubmluZyB0ZXN0Li4uIFxuIgotcnVuaGFza2VsbCAtV2FsbCAtV2Vycm9yIC1pJEJBU0UvbGliL2hzL3NyYyAtaWdlbi1ocyAkVEVTVF9TT1VSQ0VfRklMRQorcnVuaGFza2VsbCAtV2FsbCAtWFNjb3BlZFR5cGVWYXJpYWJsZXMgLWkkQkFTRS9saWIvaHMvc3JjIC1pZ2VuLWhzICRURVNUX1NPVVJDRV9GSUxFCmRpZmYgLS1naXQgYS90ZXN0L2luZGV4Lmh0bWwgYi90ZXN0L2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYxMWE5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaW5kZXguaHRtbApAQCAtMCwwICsxLDUxIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzwhRE9DVFlQRSBIVE1MPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KKzx0aXRsZT5BcGFjaGUgVGhyaWZ0IC0gaW50ZWdyYXRpb24gdGVzdCBzdWl0ZTwvdGl0bGU+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJodHRwOi8vY2RuLmRhdGF0YWJsZXMubmV0LzEuMTAuNC9jc3MvanF1ZXJ5LmRhdGFUYWJsZXMuY3NzIj4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0yLjEuMy5taW4uanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9Imh0dHA6Ly9jZG4uZGF0YXRhYmxlcy5uZXQvMS4xMC40L2pzL2pxdWVyeS5kYXRhVGFibGVzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJyZXN1bHQuanMiPgorPC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMj5BcGFjaGUgVGhyaWZ0IC0gaW50ZWdyYXRpb24gdGVzdCBzdWl0ZTogUmVzdWx0czwvaDI+Cis8dGFibGUgaWQ9InRlc3RfcmVzdWx0cyIgY2xhc3M9ImRpc3BsYXkiPgorICAgIDx0aGVhZD4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlNlcnZlcjwvdGg+CisgICAgICAgICAgICA8dGg+Q2xpZW50PC90aD4KKyAgICAgICAgICAgIDx0aD5Qcm90b2NvbDwvdGg+CisgICAgICAgICAgICA8dGg+VHJhbnNwb3J0PC90aD4KKyAgICAgICAgICAgIDx0aD5SZXN1bHQgKGxvZyk8L3RoPgorICAgICAgICAgICAgPHRoPkV4cGVjdGVkPC90aD4KKyAgICAgICAgPC90cj4KKyAgICA8L3RoZWFkPgorPC90YWJsZT4KKzxoMj5UZXN0IEluZm9ybWF0aW9uPC9oMj4KKzxwcmUgaWQ9InRlc3RfaW5mbyI+PC9wcmU+CisKKzxhIGhyZWY9ImxvZyI+YnJvd3NlIHJhdyBsb2c8L2E+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9DQS5wZW0gYi90ZXN0L2tleXMvQ0EucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NDdiOWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tleXMvQ0EucGVtCkBAIC0wLDAgKzEsODIgQEAKK0NlcnRpZmljYXRlOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMTY1ODIwODAwODg5NTQzODEyMTIgKDB4ZTYxZjYxZmMzYjM0MjM5YykKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBTVD1NYXJ5bGFuZCwgTD1Gb3Jlc3QgSGlsbCwgTz1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIE9VPUFwYWNoZSBUaHJpZnQsIENOPWxvY2FsaG9zdC9lbWFpbEFkZHJlc3M9ZGV2QHRocmlmdC5hcGFjaGUub3JnCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBBcHIgIDcgMTg6NTg6MDAgMjAxNCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEp1biAyNCAxODo1ODowMCAyMDIyIEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBTVD1NYXJ5bGFuZCwgTD1Gb3Jlc3QgSGlsbCwgTz1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIE9VPUFwYWNoZSBUaHJpZnQsIENOPWxvY2FsaG9zdC9lbWFpbEFkZHJlc3M9ZGV2QHRocmlmdC5hcGFjaGUub3JnCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgICAgICBQdWJsaWMtS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1czoKKyAgICAgICAgICAgICAgICAgICAgMDA6YWE6MTM6ZDQ6YzQ6Zjc6MDE6MTc6YTc6OTI6ZDE6YjQ6YjQ6MTU6MGQ6CisgICAgICAgICAgICAgICAgICAgIDIxOjkwOjE5OjVlOmZjOmZiOmI2OjZkOjNmOmYyOjNmOjY1OmEyOjdhOjQzOgorICAgICAgICAgICAgICAgICAgICBhNjo0Njo5NTpmYzo0MzoxNjpmNjo2MzoxNDo1ZTpmNzpiMTplMzo2MTowMjoKKyAgICAgICAgICAgICAgICAgICAgZjk6NGE6OTU6ODk6YmY6OGQ6Zjk6NDg6MWQ6ODI6ZTc6MzQ6ZTA6YjI6NDg6CisgICAgICAgICAgICAgICAgICAgIGRmOjA4OmQ5OjdjOjNhOjJmOmQzOjFiOjBiOmU4OmVmOmMyOjQxOjBhOjdkOgorICAgICAgICAgICAgICAgICAgICAwYTozODo3ODozYTozMTo2Njo3Mzo5OTo4YzpkMTo3OToyNzo1ZjplNTo2NjoKKyAgICAgICAgICAgICAgICAgICAgZDA6NWU6M2E6OGM6MGM6OTI6MTg6NzM6MDQ6YzE6ZjU6NDU6ZGI6Mzc6ZTc6CisgICAgICAgICAgICAgICAgICAgIDVmOmM3OjhjOmEzOjYwOmU5OjkyOmEwOmQ4OjI5OjVkOjc3OjQ4OmZiOjFkOgorICAgICAgICAgICAgICAgICAgICBiMDplZDoxMjoyYzo0ZToyZTowMjpkYjozZDoxYTo0MTo3MTphNjoyYjoyZToKKyAgICAgICAgICAgICAgICAgICAgYjM6NGM6NmE6Yzc6Zjc6MWQ6YTk6N2U6Yzc6Y2Y6ZGI6ZjI6ZTc6YjY6ZjM6CisgICAgICAgICAgICAgICAgICAgIDFmOjc3OjFkOjI0OjAxOjFhOjY2OjY2OjMwOjg1OjMwOjAyOjI5OmM0OmJiOgorICAgICAgICAgICAgICAgICAgICBmNzpjZDozZjo4OTo0YjoxYTo1ZjpmNDo5MTo5NjpmYjplOTozOTpmMjo0NjoKKyAgICAgICAgICAgICAgICAgICAgOTY6MTI6M2Q6OGE6MjM6YjU6MmU6ODI6OWU6NDE6ZmU6NDA6YjY6Mjc6YjE6CisgICAgICAgICAgICAgICAgICAgIDE0OjQ0OjVjOjk2OjMwOjBmOjU1OmU0OmJiOmFkOjhiOjhhOjk5OjE3OmMwOgorICAgICAgICAgICAgICAgICAgICAyOToxMTo0ZTo3Njo3OTo5ZDo0YjowMzozMTo3ZTo4NTozYzphODoyMzo0MDoKKyAgICAgICAgICAgICAgICAgICAgNTQ6MDI6NTg6MzU6YzY6ZmM6ZGQ6M2Q6ZWI6ZTM6ZDE6NTE6MDA6MDI6ODY6CisgICAgICAgICAgICAgICAgICAgIDFhOmQ3OmIwOjlmOmEwOjE3OjczOjZhOjVhOmQwOmU2OmI2OmI4OjU1OjQwOgorICAgICAgICAgICAgICAgICAgICA1ZToyNworICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgMjg6RjI6RkQ6MzA6Q0Q6MDM6RjE6REM6NDE6MUU6QzQ6OTM6QzY6OTc6MTM6Q0E6RDQ6RkE6NjA6MkEKKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOjI4OkYyOkZEOjMwOkNEOjAzOkYxOkRDOjQxOjFFOkM0OjkzOkM2Ojk3OjEzOkNBOkQ0OkZBOjYwOjJBCisKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogCisgICAgICAgICAgICAgICAgQ0E6VFJVRQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICAgNDY6MTU6MTg6ODk6YjI6NTc6MTc6ZDE6YTI6NjQ6YzE6OWE6NzM6NGY6MDQ6OTQ6NzY6MDc6CisgICAgICAgICAxZjoyOTpiYTo2ZjozNDo0NjpjMjozNjpkNTo2ODo4NTpmNDoxNTo0Yzo4ZToxYTpmZTo4MzoKKyAgICAgICAgIDc5OjUzOmVjOmFhOjBkOjkyOjYwOmRlOmYzOjlhOjNhOmU4OjgwOjY2OmFjOjg3OjcwOjg5OgorICAgICAgICAgNTk6ZjI6YWM6OWU6YjA6Mjg6MTE6Mzc6N2Q6Nzg6NGU6NWU6M2Y6MjU6MGY6YmU6MDk6NmY6CisgICAgICAgICAyNjoyYTozZDo2Njo3OTozODoyODplNTo4MTo3MTo3MTo5NjoyNjo0ZjpkYjplYzoyMzo3MDoKKyAgICAgICAgIGJlOjM3OjM5OmZjOmUwOjMyOjBkOjgwOjhmOjY2OmM3OmFjOmE0OmI0OjhiOjc3OjQwOmUyOgorICAgICAgICAgOTk6NDQ6M2E6NzM6Yzg6Zjk6MTQ6Y2Y6MWI6MzI6Mjc6YzI6Nzg6ZGI6YjA6ZGE6OGE6NjA6CisgICAgICAgICBlYjo4ZDozNDo3ZTo3ZDozYzowMzpkNDozODo3NDpmNzoxNzo5ZTozMjo3NDo5YTplNzozNzoKKyAgICAgICAgIDk1OmQ0OjcxOjAzOmM4Ojk0OmVhOjA5OjdiOmFkOjJkOmViOjcwOjQzOmYyOjMyOjdlOjYzOgorICAgICAgICAgMDE6ODQ6OGM6N2U6OWU6ZjA6Nzk6N2Y6YWU6ZTk6Y2Y6Zjk6YmU6MGU6ZmU6OTU6ZDI6YmQ6CisgICAgICAgICBjODphNzo4MTpjMjo3MTpkOTpjMzo1MDozMTo4OTo2ZDpmYTphZDphMjphYjowMDowMTozNDoKKyAgICAgICAgIDEwOjU4OmVmOjk2OjVhOmViOjMwOjA3OmE5OjhlOjg0OjM2OmVmOjNkOjNjOjYxOjQ2Ojk2OgorICAgICAgICAgNmE6ZTg6MDk6MjA6NWE6YWI6Zjg6NGI6ZWI6Yjc6MzM6NjE6OGU6YWY6OWE6N2Q6MTY6YjA6CisgICAgICAgICA2MDo2YTpmMDozMDplNTpiMjo4ZTplNzo4MDpiNDphMTowMjphOTozNzpmZTo1ZjpiNTphZToKKyAgICAgICAgIDY1OmU5OjZiOjM0CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVOekNDQXgrZ0F3SUJBZ0lKQU9ZZllmdzdOQ09jTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUd4TVFzd0NRWUQKK1ZRUUdFd0pWVXpFUk1BOEdBMVVFQ0F3SVRXRnllV3hoYm1ReEZEQVNCZ05WQkFjTUMwWnZjbVZ6ZENCSWFXeHMKK01TY3dKUVlEVlFRS0RCNVVhR1VnUVhCaFkyaGxJRk52Wm5SM1lYSmxJRVp2ZFc1a1lYUnBiMjR4RmpBVUJnTlYKK0JBc01EVUZ3WVdOb1pTQlVhSEpwWm5ReEVqQVFCZ05WQkFNTUNXeHZZMkZzYUc5emRERWtNQ0lHQ1NxR1NJYjMKK0RRRUpBUllWWkdWMlFIUm9jbWxtZEM1aGNHRmphR1V1YjNKbk1CNFhEVEUwTURRd056RTROVGd3TUZvWERUSXkKK01EWXlOREU0TlRnd01Gb3dnYkV4Q3pBSkJnTlZCQVlUQWxWVE1SRXdEd1lEVlFRSURBaE5ZWEo1YkdGdVpERVUKK01CSUdBMVVFQnd3TFJtOXlaWE4wSUVocGJHd3hKekFsQmdOVkJBb01IbFJvWlNCQmNHRmphR1VnVTI5bWRIZGgKK2NtVWdSbTkxYm1SaGRHbHZiakVXTUJRR0ExVUVDd3dOUVhCaFkyaGxJRlJvY21sbWRERVNNQkFHQTFVRUF3d0oKK2JHOWpZV3hvYjNOME1TUXdJZ1lKS29aSWh2Y05BUWtCRmhWa1pYWkFkR2h5YVdaMExtRndZV05vWlM1dmNtY3cKK2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNxRTlURTl3RVhwNUxSdExRVkRTR1EKK0dWNzgrN1p0UC9JL1phSjZRNlpHbGZ4REZ2WmpGRjczc2VOaEF2bEtsWW0vamZsSUhZTG5OT0N5U044STJYdzYKK0w5TWJDK2p2d2tFS2ZRbzRlRG94Wm5PWmpORjVKMS9sWnRCZU9vd01raGh6Qk1IMVJkczM1MS9IaktOZzZaS2cKKzJDbGRkMGo3SGJEdEVpeE9MZ0xiUFJwQmNhWXJMck5NYXNmM0hhbCt4OC9iOHVlMjh4OTNIU1FCR21abU1JVXcKK0FpbkV1L2ZOUDRsTEdsLzBrWmI3NlRueVJwWVNQWW9qdFM2Q25rSCtRTFluc1JSRVhKWXdEMVhrdTYyTGlwa1gKK3dDa1JUblo1blVzRE1YNkZQS2dqUUZRQ1dEWEcvTjA5NitQUlVRQUNoaHJYc0orZ0YzTnFXdERtdHJoVlFGNG4KK0FnTUJBQUdqVURCT01CMEdBMVVkRGdRV0JCUW84djB3elFQeDNFRWV4SlBHbHhQSzFQcGdLakFmQmdOVkhTTUUKK0dEQVdnQlFvOHYwd3pRUHgzRUVleEpQR2x4UEsxUHBnS2pBTUJnTlZIUk1FQlRBREFRSC9NQTBHQ1NxR1NJYjMKK0RRRUJCUVVBQTRJQkFRQkdGUmlKc2xjWDBhSmt3WnB6VHdTVWRnY2ZLYnB2TkViQ050Vm9oZlFWVEk0YS9vTjUKK1UreXFEWkpnM3ZPYU91aUFacXlIY0lsWjhxeWVzQ2dSTjMxNFRsNC9KUSsrQ1c4bUtqMW1lVGdvNVlGeGNaWW0KK1Q5dnNJM0MrTnpuODRESU5nSTlteDZ5a3RJdDNRT0taUkRwenlQa1V6eHN5SjhKNDI3RGFpbURyalRSK2ZUd0QKKzFEaDA5eGVlTW5TYTV6ZVYxSEVEeUpUcUNYdXRMZXR3US9JeWZtTUJoSXgrbnZCNWY2N3B6L20rRHY2VjByM0kKK3A0SENjZG5EVURHSmJmcXRvcXNBQVRRUVdPK1dXdXN3QjZtT2hEYnZQVHhoUnBacTZBa2dXcXY0Uyt1M00yR08KK3I1cDlGckJnYXZBdzViS081NEMwb1FLcE4vNWZ0YTVsNldzMAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL1JFQURNRS5tZCBiL3Rlc3Qva2V5cy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDEwODM1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9SRUFETUUubWQKQEAgLTAsMCArMSwxMDIgQEAKKyMgVGVzdCBLZXlzIGFuZCBDZXJ0aWZpY2F0ZXMKK1RoaXMgZm9sZGVyIGlzIGRlZGljYXRlZCB0byB0ZXN0IGtleXMgYW5kIGNlcnRpZmljYXRlcyBwcm92aWRlZCBpbiBtdWx0aXBsZSBmb3JtYXRzLgorUHJpbWFyeSB1c2UgYXJlIHVuaXQgdGVzdCBzdWl0ZXMgYW5kIGNyb3NzIGxhbmd1YWdlIHRlc3RzLgorCisgICAgdGVzdC9rZXlzCisKKyoqVGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IG11c3QgbmV2ZXIgYmUgdXNlZCBvbiBwcm9kdWN0aW9uIHN5c3RlbXMuKioKKworIyMgU1NMIEtleXMgYW5kIENlcnRpZmljYXRlcworCisKKyMjIGNyZWF0ZSBjZXJ0aWZpY2F0ZXMKKword2UgdXNlIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBmb3IgdGVzdCBrZXkgYW5kIGNlcnRpZmljYXRlIGNyZWF0aW9uCisKKyAgICBDPVVTLAorICAgIFNUPU1hcnlsYW5kLAorICAgIEw9Rm9yZXN0IEhpbGwsCisgICAgTz1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICAgT1U9QXBhY2hlIFRocmlmdCwKKyAgICBDTj1sb2NhbGhvc3QvZW1haWxBZGRyZXNzPWRldkB0aHJpZnQuYXBhY2hlLm9yZworCisjIyMgY3JlYXRlIHNlbGYtc2lnbmVkIHNlcnZlciBrZXkgYW5kIGNlcnRpZmljYXRlCisKKyAgICBvcGVuc3NsIHJlcSAtbmV3IC14NTA5IC1ub2RlcyAgLWRheXMgMzAwMCAtb3V0IHNlcnZlci5jcnQgLWtleW91dCBzZXJ2ZXIua2V5CisgICAgb3BlbnNzbCB4NTA5IC1pbiBzZXJ2ZXIuY3J0IC10ZXh0ID4gQ0EucGVtCisgICAgY2F0IHNlcnZlci5jcnQgc2VydmVyLmtleSA+IHNlcnZlci5wZW0KKworRXhwb3J0IHBhc3N3b3JkIGlzICJ0aHJpZnQiIHdpdGhvdXQgdGhlIHF1b3RlcworCisgICAgb3BlbnNzbCBwa2NzMTIgLWV4cG9ydCAtY2xjZXJ0cyAtaW4gc2VydmVyLmNydCAtaW5rZXkgc2VydmVyLmtleSAtb3V0IHNlcnZlci5wMTIKKworIyMjIGNyZWF0ZSBjbGllbnQga2V5IGFuZCBjZXJ0aWZpY2F0ZQorCisgICAgb3BlbnNzbCBnZW5yc2EgLW91dCBjbGllbnQua2V5CisKK2NyZWF0ZSBhIHNpZ25pbmcgcmVxdWVzdDoKKworICAgIG9wZW5zc2wgcmVxIC1uZXcgLWtleSBjbGllbnQua2V5IC1vdXQgY2xpZW50LmNzcgorCitzaWduIHRoZSBjbGllbnQgY2VydGlmaWNhdGUgd2l0aCB0aGUgc2VydmVyLmtleQorCisgICAgb3BlbnNzbCB4NTA5IC1yZXEgLWRheXMgMzAwMCAtaW4gY2xpZW50LmNzciAtQ0EgQ0EucGVtIC1DQWtleSBzZXJ2ZXIua2V5IC1zZXRfc2VyaWFsIDAxIC1vdXQgY2xpZW50LmNydAorCitleHBvcnQgY2VydGlmaWNhdGUgaW4gUEtDUzEyIGZvcm1hdCAoRXhwb3J0IHBhc3N3b3JkIGlzICJ0aHJpZnQiIHdpdGhvdXQgdGhlIHF1b3RlcykKKworICAgIG9wZW5zc2wgcGtjczEyIC1leHBvcnQgLWNsY2VydHMgLWluIGNsaWVudC5jcnQgLWlua2V5IGNsaWVudC5rZXkgLW91dCBjbGllbnQucDEyCisKK2V4cG9ydCBjZXJ0aWZpY2F0ZSBpbiBQRU0gZm9ybWF0IGZvciBPcGVuU1NMIHVzYWdlCisKKyAgICBvcGVuc3NsIHBrY3MxMiAtaW4gY2xpZW50LnAxMiAtb3V0IGNsaWVudC5wZW0gLWNsY2VydHMKKworIyMjIGNyZWF0ZSBjbGllbnQga2V5IGFuZCBjZXJ0aWZpY2F0ZSB3aXRoIGFsdG5hbWVzCisKK2NvcHkgb3BlbnNzbC5jbmYgZnJvbSB5b3VyIHN5c3RlbSBlLmcuIC9ldGMvc3NsL29wZW5zc2wuY25mIGFuZCBhcHBlbmQgZm9sbG93aW5nIHRvIHRoZSBlbmQgb2YgWyB2M19yZXEgXQorCisgICAgc3ViamVjdEFsdE5hbWU9QGFsdGVybmF0ZV9uYW1lcworCisgICAgWyBhbHRlcm5hdGVfbmFtZXMgXQorICAgIElQLjE9MTI3LjAuMC4xCisgICAgSVAuMj06OjEKKyAgICBJUC4zPTo6ZmZmZjoxMjcuMC4wLjEKKworY3JlYXRlIGEgc2lnbmluZyByZXF1ZXN0OgorCisgICAgb3BlbnNzbCByZXEgLW5ldyAta2V5IGNsaWVudF92My5rZXkgLW91dCBjbGllbnRfdjMuY3NyIC1jb25maWcgb3BlbnNzbC5jbmYgXAorICAgICAgICAtc3ViaiAiL0M9VVMvU1Q9TWFyeWxhbmQvTD1Gb3Jlc3QgSGlsbC9PPVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi9PVT1BcGFjaGUgVGhyaWZ0L0NOPWxvY2FsaG9zdCIgLWV4dGVuc2lvbnMgdjNfcmVxCisKK3NpZ24gdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZSB3aXRoIHRoZSBzZXJ2ZXIua2V5CisKKyAgICBvcGVuc3NsIHg1MDkgLXJlcSAtZGF5cyAzMDAwIC1pbiBjbGllbnRfdjMuY3NyIC1DQSBDQS5wZW0gLUNBa2V5IHNlcnZlci5rZXkgLXNldF9zZXJpYWwgMDEgLW91dCBjbGllbnRfdjMuY3J0IC1leHRlbnNpb25zIHYzX3JlcSAtZXh0ZmlsZSBvcGVuc3NsLmNuZgorCisjIyBKYXZhIGtleSBhbmQgY2VydGlmaWNhdGUgaW1wb3J0CitKYXZhIFRlc3QgRW52aXJvbm1lbnQgdXNlcyBrZXkgYW5kIHRydXN0IHN0b3JlIHBhc3N3b3JkICJ0aHJpZnQiIHdpdGhvdXQgdGhlIHF1b3RlcworCitsaXN0IGtleXN0b3JlIGVudHJpZXMKKworICAgIGtleXRvb2wgLWxpc3QgLXN0b3JlcGFzcyB0aHJpZnQgLWtleXN0b3JlIC4uLy4uL2xpYi9qYXZhL3Rlc3QvLmtleXN0b3JlCisKK2xpc3QgdHJ1c3RzdG9yZSBlbnRyaWVzCisKKyAgICBrZXl0b29sIC1saXN0IC1zdG9yZXBhc3MgdGhyaWZ0IC1rZXlzdG9yZSAuLi8uLi9saWIvamF2YS90ZXN0Ly50cnVzdHN0b3JlCisKKworZGVsZXRlIGFuIGVudHJ5CisKKyAgICBrZXl0b29sIC1kZWxldGUgLXN0b3JlcGFzcyB0aHJpZnQgLWtleXN0b3JlIC4uLy4uL2xpYi9qYXZhL3Rlc3QvLnRydXN0c3RvcmUgLWFsaWFzIHNzbHRlc3QKKworCitpbXBvcnQgY2VydGlmaWNhdGUgaW50byB0cnVzdHN0b3JlCisKKyAgICBrZXl0b29sIC1pbXBvcnRjZXJ0IC1zdG9yZXBhc3MgdGhyaWZ0IC1rZXlzdG9yZSAuLi8uLi9saWIvamF2YS90ZXN0Ly50cnVzdHN0b3JlIC1hbGlhcyBsb2NhbGhvc3QgLS1maWxlIHNlcnZlci5jcnQKKworaW1wb3J0IGtleSBpbnRvIGtleXN0b3JlCisKKyAgICBrZXl0b29sIC1pbXBvcnRrZXlzdG9yZSAtc3RvcmVwYXNzIHRocmlmdCAta2V5c3RvcmUgLi4vLi4vbGliL2phdmEvdGVzdC8ua2V5c3RvcmUgLXNyY3N0b3JldHlwZSBwa2NzMTIgLXNyY2tleXN0b3JlIHNlcnZlci5wMTIKKworIyBUZXN0IFNTTCBzZXJ2ZXIgYW5kIGNsaWVudHMKKworICAgIG9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgbG9jYWxob3N0OjkwOTAKKyAgICBvcGVuc3NsIHNfc2VydmVyIC1hY2NlcHQgOTA5MCAtd3d3CisKZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9jbGllbnQuY3J0IGIvdGVzdC9rZXlzL2NsaWVudC5jcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhOWFkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9jbGllbnQuY3J0CkBAIC0wLDAgKzEsMjMgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRDJEQ0NBc0FDQVFFd0RRWUpLb1pJaHZjTkFRRUxCUUF3Z2JFeEN6QUpCZ05WQkFZVEFsVlRNUkV3RHdZRAorVlFRSURBaE5ZWEo1YkdGdVpERVVNQklHQTFVRUJ3d0xSbTl5WlhOMElFaHBiR3d4SnpBbEJnTlZCQW9NSGxSbworWlNCQmNHRmphR1VnVTI5bWRIZGhjbVVnUm05MWJtUmhkR2x2YmpFV01CUUdBMVVFQ3d3TlFYQmhZMmhsSUZSbworY21sbWRERVNNQkFHQTFVRUF3d0piRzlqWVd4b2IzTjBNU1F3SWdZSktvWklodmNOQVFrQkZoVmtaWFpBZEdoeQorYVdaMExtRndZV05vWlM1dmNtY3dIaGNOTVRVeE1qSXpNRGN3TnpVd1doY05NalF3TXpFd01EY3dOelV3V2pDQgorc1RFTE1Ba0dBMVVFQmhNQ1ZWTXhFVEFQQmdOVkJBZ01DRTFoY25sc1lXNWtNUlF3RWdZRFZRUUhEQXRHYjNKbAorYzNRZ1NHbHNiREVuTUNVR0ExVUVDZ3dlVkdobElFRndZV05vWlNCVGIyWjBkMkZ5WlNCR2IzVnVaR0YwYVc5dQorTVJZd0ZBWURWUVFMREExQmNHRmphR1VnVkdoeWFXWjBNUkl3RUFZRFZRUUREQWxzYjJOaGJHaHZjM1F4SkRBaQorQmdrcWhraUc5dzBCQ1FFV0ZXUmxka0IwYUhKcFpuUXVZWEJoWTJobExtOXlaekNDQVNJd0RRWUpLb1pJaHZjTgorQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxsL2JKaGcxN1B1MXQ3ODVKSXV3bGg3ZTJFNTFlb1dGdnV4TVdmSAorZHNVQVZxRGFPejk5TzVzdjhwZ1dLWHJrUEJ0dEU5OFQrTXgvUHd6NUpIczRRY3JlM0E1YWRtNmNkYWIwQUt1ZworZVZHMVB2SHJXelY0YWhlZzRLVWZWU2lNejhCRzJLM1ExVkd2WmtnTVJhL1E0MDlGS2pVNlo0RDl2Qkc0UGFzMworUE41RnhuQUw2UDcweVdDRXIyVnUvdFdKbENOK3FyUkRmU2FFMmhxbVQxaXJ4YW9QYTYxR3Z1UlZzR1EzVGVvRQorbUdmRU50dkZxQzZxUVd1U0NiRzVhSTQ3UnY2NnBxb1dXeHFrcmNvbE5jNyt2aHg2clcrd2RGTzNJbHFJVDhJRworc2RRVnArWTRpci9kR3AyZWp6cUdaQ3JlbVBKMXVFS2pMTXBJdWtkZzI1eW1IQzBDQXdFQUFUQU5CZ2txaGtpRworOXcwQkFRc0ZBQU9DQVFFQUJjUmR3YzltZFk5ek92VGl4dFRoSHJjaVZ2cXdwNlJhaVFxTUVWb21vellpbFpEUgorSjkwTTNINktubEFESmJDdjBGWHVqc2FBcEI1M2F3cTVJN3NPYkFZV0ZoREpaOUxLbHcwbERGN0tjaExYaUFsaworWFZ5dkwybkpqdUpjeFBDRlBXa3R3cnc1YlRndVJDQnpHMTJIemlrbit4czZ1UHVyN1ZRWU0zM2piWEVkYTVQUworVUVxdkFWV2FPTkpDWDhNRFlPc2NWb0pGMEVTeUkrZk45MmlwRmFYUjdmR2Fqb2QvcmMwQWZlTjJHVk1aRVR2ZQorMjFwa1V5RHd3Q0dBNDR1dk5VQ2QxZTMyTnhFM2FoOVVBcENSbjVzR0o2NFI2dXJwRlRYVDNJQUxGM2thT083VQorVnNNaEZyVWlaNytCdzVuSWVpSzBRT0Y2RWlwaitiSnZyTFpwU2c9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL2NsaWVudC5rZXkgYi90ZXN0L2tleXMvY2xpZW50LmtleQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWRjZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9rZXlzL2NsaWVudC5rZXkKQEAgLTAsMCArMSwyNyBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJRW93SUJBQUtDQVFFQXVYOXNtR0RYcys3VzN2emtraTdDV0h0N1lUblY2aFlXKzdFeFo4ZDJ4UUJXb05vNworUDMwN215L3ltQllwZXVROEcyMFQzeFA0ekg4L0RQa2tlemhCeXQ3Y0RscDJicHgxcHZRQXE2QjVVYlUrOGV0YgorTlhocUY2RGdwUjlWS0l6UHdFYllyZERWVWE5bVNBeEZyOURqVDBVcU5UcG5nUDI4RWJnOXF6Yzgza1hHY0F2bworL3ZUSllJU3ZaVzcrMVltVUkzNnF0RU45Sm9UYUdxWlBXS3ZGcWc5cnJVYSs1Rld3WkRkTjZnU1laOFEyMjhXbworTHFwQmE1SUpzYmxvamp0Ry9ycW1xaFpiR3FTdHlpVTF6djYrSEhxdGI3QjBVN2NpV29oUHdnYXgxQlduNWppSwordjkwYW5aNlBPb1prS3Q2WThuVzRRcU1zeWtpNlIyRGJuS1ljTFFJREFRQUJBb0lCQUZvdGJDbVh5c1VhY3pMcworVm1JS2dVaHFuMHhneFhHTFU1a0FSemhnYTRqUjVVdEZURkJOSFZFUU9pdGRlc1RYZDdFTmtmOTh3aE1JT1NxaAorWSs3VEpvanRWcVZUclFlUTRGRk5oWlhwNlpDalAvcHpwRitXTGwxV1JGK0JuL0NhbzlTaG5HekRmVEM4eUVoMgorVHRwdC9sTm5HR0hRQnNsYWtMYzhqaDVTT0RFRmZidWdYOFNkVEN3WllzZXNLTnJYbTFwUy81SUV1blBxYVJpMAorSUkwRWNucUhFc2dxU28rQ2xqcFc3dU54U3J5QTJ2U0FWZGxQZWo2KzlGWmpkSUhMUDVBRUtZdms3ZTlEMkNNVgorMStnck5lL1FrUXBwU2hpelBpcmJiOTN0SG04NnY1YmtERkNNOXlXcmhjTWNqdklMTVhFVHhJcHBNR1BtYWNSdQoranF0WWNBRUNnWUVBOFZEenlsVHo0a1MzK0QzbjNoVGdiNDFYVllhN2ZlVXNoOTlHV1JPMXdYSUZwSGpDSVJqQQorOXIvQlhXOStSeDNwdVZQaFM4aHdMUTRCTGRBN2xGcFYxQzhhZzBlMyt2bjZ6VmlybnoxanRJK3VITXZTdHpoTworZDZpMG5mK3c0SFlYbzdtTjZvOVpkSEVmQzhTRk5ieW1oQ29WS2gyRElMRHdiNEVYOVJYTnB5MENnWUVBeE1qNAorK3Zya2xKL2lsSCtSeTF6c3Q0elFZSXdtbTNRV2phckRyeXBHdWNIZ2Q0amc1djlBL0NKSUtVaTh4ME1qcmN1Tgord1ZiN1I4WEp5WXpGUVJYSVVYUjZHbkxlZVNuZnB4enQ0WWxpZkN2WHhuT2k4dzRmdjdLZUdCVjVucDFFZ3BvOAorbldOeVpGeGR2UUR1Q29wcjNTVW9TOUpJOEpQd1ZnQTdUKzdEYVFFQ2dZQUdvYXZoYm80NU5KdzlwUzNmQzRIVAorYnZYc2NzUnFSRWNDQU4vRkNPYWd4MHBpWjdNbUI3RWQxczB3alNUU1BYOHp5WnRTWXRLNldqMHNEaUhsQk1xQgorQno1YVJ6bEdHMktLREJyRFNJT1o3YXppTzdPeHQwbG92bWtnUW11UTc0M2N3UGVtYjRRTTBDTURSc1pHWU1YTworc2YxYzUreTNsRVUzT3p2MlQwQVVqUUtCZ0JsbnpPVXlNUUtUSmNDQU84VmlpTmtsbjkxbkdyRGxLdWc5VEtnMworc0F2WllPNXR5SU5xSHV5dVRGeXdIRmNwYnRqSU45UG5NK2ZQUEQ3K0lwVkZoNmdrZm9NZG8yVkhKNjIraVdPZAoreGc0NzVzNmpMVDF0N0dGbVlRekE4UU91VUNNQVlLVDlLczZVTWpIdGhjM3Nrd0pwQXF2UFNVVnVCQkJHVldINworZEZVQkFvR0JBTDY3QVJMdWppQUVWTkh0NXJhaml4QjZuY2w3L1IrWjJ1YXdJMUpmbWRuQ1pvbkFLVlpZSHVYVQorLzRqMitvNFFoSklQTHRXSW9heEFrTWlnUXRBa2VzcWlybjNLay9jN2taUklvTjU0OUhUSnV3WnFZcU5wN0NCLwora1ZpNVIzMzUrTTl6NDlpNnFBMFJac0pHU29TQms3UHVmRzRSbUxpbWNSYkd3clk5M3NQRAorLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9jbGllbnQucDEyIGIvdGVzdC9rZXlzL2NsaWVudC5wMTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQyNjY5YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9jbGllbnQucDEyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9jbGllbnQucGVtIGIvdGVzdC9rZXlzL2NsaWVudC5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZlZjYyNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9jbGllbnQucGVtCkBAIC0wLDAgKzEsNjAgQEAKK0JhZyBBdHRyaWJ1dGVzCisgICAgbG9jYWxLZXlJRDogMzkgRUMgM0QgNUIgMjggMTcgREEgREQgMDkgN0EgNjIgNjggRDUgNDQgMUYgQzcgRTIgRjggRTAgQ0QgCitzdWJqZWN0PS9DPVVTL1NUPU1hcnlsYW5kL0w9Rm9yZXN0IEhpbGwvTz1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vT1U9QXBhY2hlIFRocmlmdC9DTj1sb2NhbGhvc3QvZW1haWxBZGRyZXNzPWRldkB0aHJpZnQuYXBhY2hlLm9yZworaXNzdWVyPS9DPVVTL1NUPU1hcnlsYW5kL0w9Rm9yZXN0IEhpbGwvTz1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vT1U9QXBhY2hlIFRocmlmdC9DTj1sb2NhbGhvc3QvZW1haWxBZGRyZXNzPWRldkB0aHJpZnQuYXBhY2hlLm9yZworLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEMkRDQ0FzQUNBUUV3RFFZSktvWklodmNOQVFFTEJRQXdnYkV4Q3pBSkJnTlZCQVlUQWxWVE1SRXdEd1lECitWUVFJREFoTllYSjViR0Z1WkRFVU1CSUdBMVVFQnd3TFJtOXlaWE4wSUVocGJHd3hKekFsQmdOVkJBb01IbFJvCitaU0JCY0dGamFHVWdVMjltZEhkaGNtVWdSbTkxYm1SaGRHbHZiakVXTUJRR0ExVUVDd3dOUVhCaFkyaGxJRlJvCitjbWxtZERFU01CQUdBMVVFQXd3SmJHOWpZV3hvYjNOME1TUXdJZ1lKS29aSWh2Y05BUWtCRmhWa1pYWkFkR2h5CithV1owTG1Gd1lXTm9aUzV2Y21jd0hoY05NVFV4TWpJek1EY3dOelV3V2hjTk1qUXdNekV3TURjd056VXdXakNCCitzVEVMTUFrR0ExVUVCaE1DVlZNeEVUQVBCZ05WQkFnTUNFMWhjbmxzWVc1a01SUXdFZ1lEVlFRSERBdEdiM0psCitjM1FnU0dsc2JERW5NQ1VHQTFVRUNnd2VWR2hsSUVGd1lXTm9aU0JUYjJaMGQyRnlaU0JHYjNWdVpHRjBhVzl1CitNUll3RkFZRFZRUUxEQTFCY0dGamFHVWdWR2h5YVdaME1SSXdFQVlEVlFRRERBbHNiMk5oYkdodmMzUXhKREFpCitCZ2txaGtpRzl3MEJDUUVXRldSbGRrQjBhSEpwWm5RdVlYQmhZMmhsTG05eVp6Q0NBU0l3RFFZSktvWklodmNOCitBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGwvYkpoZzE3UHUxdDc4NUpJdXdsaDdlMkU1MWVvV0Z2dXhNV2ZICitkc1VBVnFEYU96OTlPNXN2OHBnV0tYcmtQQnR0RTk4VCtNeC9Qd3o1SkhzNFFjcmUzQTVhZG02Y2RhYjBBS3VnCitlVkcxUHZIcld6VjRhaGVnNEtVZlZTaU16OEJHMkszUTFWR3Zaa2dNUmEvUTQwOUZLalU2WjREOXZCRzRQYXMzCitQTjVGeG5BTDZQNzB5V0NFcjJWdS90V0psQ04rcXJSRGZTYUUyaHFtVDFpcnhhb1BhNjFHdnVSVnNHUTNUZW9FCittR2ZFTnR2RnFDNnFRV3VTQ2JHNWFJNDdSdjY2cHFvV1d4cWtyY29sTmM3K3ZoeDZyVyt3ZEZPM0lscUlUOElHCitzZFFWcCtZNGlyL2RHcDJlanpxR1pDcmVtUEoxdUVLakxNcEl1a2RnMjV5bUhDMENBd0VBQVRBTkJna3Foa2lHCis5dzBCQVFzRkFBT0NBUUVBQmNSZHdjOW1kWTl6T3ZUaXh0VGhIcmNpVnZxd3A2UmFpUXFNRVZvbW96WWlsWkRSCitKOTBNM0g2S25sQURKYkN2MEZYdWpzYUFwQjUzYXdxNUk3c09iQVlXRmhESlo5TEtsdzBsREY3S2NoTFhpQWxrCitYVnl2TDJuSmp1SmN4UENGUFdrdHdydzViVGd1UkNCekcxMkh6aWtuK3hzNnVQdXI3VlFZTTMzamJYRWRhNVBTCitVRXF2QVZXYU9OSkNYOE1EWU9zY1ZvSkYwRVN5SStmTjkyaXBGYVhSN2ZHYWpvZC9yYzBBZmVOMkdWTVpFVHZlCisyMXBrVXlEd3dDR0E0NHV2TlVDZDFlMzJOeEUzYWg5VUFwQ1JuNXNHSjY0UjZ1cnBGVFhUM0lBTEYza2FPTzdVCitWc01oRnJVaVo3K0J3NW5JZWlLMFFPRjZFaXBqK2JKdnJMWnBTZz09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitCYWcgQXR0cmlidXRlcworICAgIGxvY2FsS2V5SUQ6IDM5IEVDIDNEIDVCIDI4IDE3IERBIEREIDA5IDdBIDYyIDY4IEQ1IDQ0IDFGIEM3IEUyIEY4IEUwIENEIAorS2V5IEF0dHJpYnV0ZXM6IDxObyBBdHRyaWJ1dGVzPgorLS0tLS1CRUdJTiBFTkNSWVBURUQgUFJJVkFURSBLRVktLS0tLQorTUlJRkRqQkFCZ2txaGtpRzl3MEJCUTB3TXpBYkJna3Foa2lHOXcwQkJRd3dEZ1FJUktvbDQyYkFTM0FDQWdnQQorTUJRR0NDcUdTSWIzRFFNSEJBak91bGN5SE1hV3NRU0NCTWdiZVhROHBJWVRFTkttMDhVUGVxeGtDUjJuTHhTTworZ3RSbUJ4RFlqcVl2MzV5NEs4S2h5YkJ2U0JsSVBnRTVqRVd4VUNjYzFRdnk1eWRVUS9YOXBta1U4ZG5tQW1EQworbzB6d2QzbHQyZU5QeSs0V2xpcUZEVm1IckxmWVFGT29JckhqdXpDMGxJNEMyaVBPanhoZmExekZ1bWVkZ3dHUworR3gxMFg1dUVWSDVONjRmVzZCM0J2elFNMHJuMnFyME9OdVNSbXRlUnRJOE5zem5ma2dlSjlhNENJQUY3RTVaMgorSlRHSTEyZWROenpVSjFKaFg0N1pXNG1pUXdDVTVMY3kwMVVacVRGdVVwbUs3RlVRZWd0THkzZTVlREtxK2JJZworWllxNkh4N2x1OGhqVDVrV1pHS3k3MWFZbUhLRWpJMGY3MjdjQWJxRFRHNXVaQkhCandLLzNwL3puUVZRWHhCYgorMStFOUNpS2VGZFhqMkVscHRzbkR5b1R2clN3Si9KcXUxd2tYQmNINUVtYmc3YUpNb2QxSU9zNk9RQjFyUER2ZAorRkZhODR6YnFSTldIU3h4eFlaeGNCOFlaaW5MNi9kUUpuaXNLdTlMTVFkM0JCR3NHV3FIOFp6NXRFdlhqUzVLdgorM2c5SlJhN1FEa1NGMDA1eDZVK3EvNjc4RzJNRytXK05XcWplM05aeDlQc2gvUHRtK2grcTluMkdTdm5pYmlLNQorbUVqOUZJd0dxdUdwYlpVVEs1YVhIY0tONjU3ZEtpSUNzRUplTmFyMWlaem5SbXpyTWJaSitEeHFKblR3K0dBdgorN1liNjMvQ05BdHFTeGl5TkhHWjZOTTJaQTl2QUtZMUhYbjBSVkMweTErOUZtTnBTUnd2M3UvK3lkU0NuSm9uUgorR0VLanpPcU05RG43cXhkK2g0VW5uQTdoWFd4SVRhZ2VCNkc2S21maVhSeGhpV3lxdE9JQ2RDbmVDd3BxOFVaNAorZTBmbTA1TlJXNk0ybXFHUUhzTU5TdlRXZGR3ejViOHdndzRlVnNiK3hReXR4VmRqOWxwQnVCOUt5alFqeFVnVQorM29aeDRLeVdMb0VXamt6dFBBaUszdXY1R2ZvdE5JTWR6blJmT04xK3htMU01c3d0bjN5M1J1MWY2U1RaQzdTcAorcXZiRzdqUG1wQjVnTEVVcmkrY2h3K2FLVVliSjBiODIwT2Q0RkxRWW53TFdyNDZWZWxZbVY0NHh1UjA2d2dxUAorMUhjaE1Tc0h0UytabElpUVFVOWpoZHlUcmw4NkVRSEgzM2RoK1N1YThBaGZld1BSeTJWRnAzWmszNEFVc1djWAorRWZJWUdlbWhxVUQzZHJHMFNNVmJGRk5PYUZHcDllMHRRb3VZT0M2L3FGQnYvU05nUXozbUFFa2NpSlliVXVVWgorVjRZUVB2dGR2U3JJU1YwZTdiakZnZFNFakc3UDdGNkNGcldUcmpVbEhadVdqNi9ySjMrLzFQSGVKVml5aHNySgorWllGZTE0Vy80OFBEeEJSbDRJRUFteGNOMUViMkV6OWVDcXYwSFc3N0h2aUc2eklnbmtQcmhXSGpGR1VweEtrNAorakxmdUIyVGZxOUY3b3p2NEwyUUFuK0YveUt0MVJtMkhoNUo2MWVVSnRBVDYwcGFqZytnSnRqbXB1NVByNEhEbgorYjZwM3htWXdhTDVMZXQxekNBYmJNZmRsREsxNFlqZE9kTS9CRUtwWGI5eTRFSXViWDVBTVk0bGpYZUc5Z3grVAorQjFUdVFWZEowUDV3SUsvRDEwVFF6QVdES2FtMGt2M1JYaWRselJ4cFozc25Sbk4vTDNFVmQ1OFJudGoxT2MweQorRmlJaVNLUnN6RGJQektEeFFFMnNOZ1FjZE8yNEpOTFNhL3NaWXRxMmdSZ3NwbC9ZcUlEbzRaWXFpOXg4RjVPUworcmRQVTVEL0g4TFdSNHZwSkxMOERZckhoNXFGRzNCWDJPSkloUFJTKzQ4cERZdHJSanA3Uy8xWlU2NE9KQXl0aworOTloRHFTcm4xajJhNnlGRThMMlB0eis0VUNGMk9RWEVjOVJxcWViOFFFVXVNU2tOSDRvUStBMkY2dXpMcFppMAorWEg2NFIybmlOQzU2THhWMmkrM1Q1S1JFRkxhaHlrOGVwTFpsdjhZZHhZUjRTYjdKLzV5aW9vSzNnOWhtWVZLTworekxjPQorLS0tLS1FTkQgRU5DUllQVEVEIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9jbGllbnRfdjMuY3J0IGIvdGVzdC9rZXlzL2NsaWVudF92My5jcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ3ZjE1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9jbGllbnRfdjMuY3J0CkBAIC0wLDAgKzEsMjQgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRUNEQ0NBdkNnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0JzVEVMTUFrR0ExVUVCaE1DVlZNeAorRVRBUEJnTlZCQWdNQ0UxaGNubHNZVzVrTVJRd0VnWURWUVFIREF0R2IzSmxjM1FnU0dsc2JERW5NQ1VHQTFVRQorQ2d3ZVZHaGxJRUZ3WVdOb1pTQlRiMlowZDJGeVpTQkdiM1Z1WkdGMGFXOXVNUll3RkFZRFZRUUxEQTFCY0dGagorYUdVZ1ZHaHlhV1owTVJJd0VBWURWUVFEREFsc2IyTmhiR2h2YzNReEpEQWlCZ2txaGtpRzl3MEJDUUVXRldSbAorZGtCMGFISnBablF1WVhCaFkyaGxMbTl5WnpBZUZ3MHhOakF5TWpJeE1UVTROREZhRncweU5EQTFNVEF4TVRVNAorTkRGYU1JR0xNUXN3Q1FZRFZRUUdFd0pWVXpFUk1BOEdBMVVFQ0F3SVRXRnllV3hoYm1ReEZEQVNCZ05WQkFjTQorQzBadmNtVnpkQ0JJYVd4c01TY3dKUVlEVlFRS0RCNVVhR1VnUVhCaFkyaGxJRk52Wm5SM1lYSmxJRVp2ZFc1aworWVhScGIyNHhGakFVQmdOVkJBc01EVUZ3WVdOb1pTQlVhSEpwWm5ReEVqQVFCZ05WQkFNTUNXeHZZMkZzYUc5egorZERDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTFowd2lRblhnNVFNWlpXdWdkLworTzN3b2F0eUh1Y3pKdUZTbVlpUkdXTHIzUHVnQit4dHZqeTByVGNFMk1OeC9iZHNWeHJhcENLQSt0TUZPUmJFbAorc0Y2amswSCtCN0J6R29Jd0hyNk44R1AxVk9vQTJlc3Joc05FejIyYUpJMDBWYUZURkU4Ry9xZ0ZjaWh5YVZXSAorWnNMYTNNYWtPekZVbU9CYVYydExCakNqYXpucVh3M2VvM1h3VUkwQmtnUzliOXZxWGpTY21mV1hEdzUrMWlzNAorYkNndW1HMnpqOUVwTHlwYzlxQ0dOS0ZCTzJZSWcwWHNJSUo4UnBybGlhbmpMNlA0TWZDNkdQT3lXNE5iWmFMZAorRVN2L2J1bXBWeXVWL0MveHFrUGFodk93QnVQRTFsb3haWlB4NlF2MzY4cW43U1ZOVlpPTHlYNzIyc3Bvb0E1RworNmNzQ0F3RUFBYU5QTUUwd0NRWURWUjBUQkFJd0FEQUxCZ05WSFE4RUJBTUNCZUF3TXdZRFZSMFJCQ3d3S29jRQorZndBQUFZY1FBQUFBQUFBQUFBQUFBQUFBQUFBQUFZY1FBQUFBQUFBQUFBQUFBUC8vZndBQUFUQU5CZ2txaGtpRworOXcwQkFRc0ZBQU9DQVFFQUJVRW1lUWtHL1BTOTM1ak1IRHJnLzV6bTRYMnhybkZ0bVR3YjBqZHhmYXU2ei83aAorQWJ4RDVpb3lZN0ZVVE5Dekk2U3lNbzl2Skp0WUNUQ3VFR3I4NEpqVDJSNzIzMno2MGs0YzF6L2F2MDFXM09ydgorRXhIZkFaOGxsaGtmdTAyMDlUNVRhSVlDQjdoREZqNUtEYnRhOGM2ZkVjd3RtbEhRV2ozTTMxbFNOc3I0WnRXVword09iaEszc3FUc09sdUhiaEtOd2xORWF0NDhsYk9RVUMxOUkxV2kzZEFTNm44bHIwbEVoZkdLdnF4dTBWaUFTUworTjFuTGZka1JFR3AzOWJZcEtnMG42RUZ3NWJZeVY0cUUzY25JZWRGSnA3TklPTS82eG5kSk1oL2M1bDZOMnV5WgordXBBclJRcHcvM2orSGtMMXg5YnMrOTAwUUswR0k2QXhnamJvcEE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL2NsaWVudF92My5rZXkgYi90ZXN0L2tleXMvY2xpZW50X3YzLmtleQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTg5ZjczCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9rZXlzL2NsaWVudF92My5rZXkKQEAgLTAsMCArMSwyNyBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJRXBBSUJBQUtDQVFFQXRuVENKQ2RlRGxBeGxsYTZCMzg3ZkNocTNJZTV6TW00VktaaUpFWll1dmMrNkFINworRzIrUExTdE53VFl3M0g5dDJ4WEd0cWtJb0Q2MHdVNUZzU1d3WHFPVFFmNEhzSE1hZ2pBZXZvM3dZL1ZVNmdEWgorNnl1R3cwVFBiWm9ralRSVm9WTVVUd2IrcUFWeUtISnBWWWRtd3RyY3hxUTdNVlNZNEZwWGEwc0dNS05yT2VwZgorRGQ2amRmQlFqUUdTQkwxdjIrcGVOSnlaOVpjUERuN1dLemhzS0M2WWJiT1AwU2t2S2x6Mm9JWTBvVUU3WmdpRAorUmV3Z2dueEdtdVdKcWVNdm8vZ3g4TG9ZODdKYmcxdGxvdDBSSy85dTZhbFhLNVg4TC9HcVE5cUc4N0FHNDhUVworV2pGbGsvSHBDL2ZyeXFmdEpVMVZrNHZKZnZiYXltaWdEa2JweXdJREFRQUJBb0lCQVFDSnB5VWhhYUlJWW5CRworNEQrUmtHZ3NqOEd2aDZhaDNqNTNmdC9rUmo2RE1DNEJsQjBDNGZPL1BFQjVXSTBjamZjdnB3bzRuT2FwSHlYNAorQVRtTElNZ2pYbjJtK0NTTTl3bzAxbUVibXJLV2QyME03bjk2Y1doR3dnOU12VkorUmRHazJLMGx3ajAyUG9XVworQmx0NTc2R1R1Tk4vK2orK1Evamlxc1h4YUxUTzAvV2orNGIyZ1FoM244STB1NmJrb2xETG9FUktJZHJMR0hIKworRlUzc2s4YnBVaEhtZWlVVGZ3d2NpK2p1aHRPWTllMzBBRXN0Nnhha0NIYnExbFJSeUVZUHRXTDdvTGRzNnl2MAorVUFLUDd3UzlZbDZkY2VrWFNGMVJacEIrZm92VFcrcVBZbjhhRXVrc2FNejB3Szk2RkNPalZOR1l4TXArWG52bAorc0t4NjNVWkJBb0dCQU9DYkNiSnRPMEhzZ0lhdXZDdkdaNTBhWjF2RHZRUmVDd3JpNGlvdXRFZzRKQ0FYSEVzWAorK2F4ejJKNWozVUVRaEdLcjBFWDlCRzZZYnhHVzBNbWpmM1F4ZVJCKzBXTHBNTVkyU0Z0OTNvQzJSMUFYOWwwSQoraDUwTzZ0WXY1U1htOTZwS3h3UnowMWQ4NG1DSmd3bi9HK2NaL0VKajRyZlpzTmJRc3Q2SlFGdnpBb0dCQU0vMQorZ0xWUXQ1bCtJSys2czY4RW5BREk2Nmk3Y0tlNnNqM3JGUlRhaFpKeEwydlkyOEo5RUIybUYvWEVnQVJTTkpRVgorWC9IOXpEcndLbTlNWDg3L2VDSDJuRWJjKzVxU0dwRFBRbTQ4MkM5RHFzTWl0eENLRDhiYmxlMUJscGpGYjhocgorUjBRM3Y1cTh1NXVvbUxCZHM1ZVVCZVJLTXR1OXRPTUE5S1JTREdqSkFvR0FGNDRLMlV4OVQyK1hGd2pTTVNFUQora3JoSEtLZUJkaWpLcmF5WG5XYmlmMFJyL1hXUEFRMFZvUkZSSVdORnUrSVlrQ1NHcGlCZnk1MXU0SUJaaXh2NworYk5zWFlEUjhqd3Yza29IMDJxdDduekgranBiRXZvTDdmZXdua3FqWk5qMWZzZHMvdmViTHZqd1puWmd1UnVrYgorS3dSZG9UVEtmUTkyYlVEYjBWekJoQ01DZ1lCN0grM09iRFhvQ1FjdFJDc3lpbFliR05wK0VreEc0b0M1ckQvVgorRXZSV21mRHJ0MytWalJwSGs1bElCOG1MeFdnZjdPL2JoTnF3WXBXZFErak4wKys2bkJvMjBvdWRIcmZmMlBhSgorOGpoRTg1bGM0MmJqd2ZwSlVLVlp6YVZ1V2ljdTBHVm5mR0pUS1Q4aWtCV25Cak5Zb1dsRG1ySzE2NEgzalE5TAorWXRDNkVRS0JnUUNhYkZYWEh4NWNJSjJYT200Sy9uVE9HN0NsdkQ4MHhhcHF5R3JvUWQ5RS9jSlVISFBwL3dRNAorYzFkTU81RVZpTTdKUnNLZnhrbDl2TTVvOUlNN3N3bFloNEVNRlNMSk5qemdPWTlYVmt2UWgwdUdiaUpPQk80ZgoraW5VdVduMVlXVWovSEZ0clQrME5vK2NZdlpWY01LckZBeTNLL0F3cFRiZktDazZyb3VsbE5BPT0KKy0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvc2VydmVyLmNydCBiL3Rlc3Qva2V5cy9zZXJ2ZXIuY3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNWVmM2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tleXMvc2VydmVyLmNydApAQCAtMCwwICsxLDI1IEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVOekNDQXgrZ0F3SUJBZ0lKQU9ZZllmdzdOQ09jTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUd4TVFzd0NRWUQKK1ZRUUdFd0pWVXpFUk1BOEdBMVVFQ0F3SVRXRnllV3hoYm1ReEZEQVNCZ05WQkFjTUMwWnZjbVZ6ZENCSWFXeHMKK01TY3dKUVlEVlFRS0RCNVVhR1VnUVhCaFkyaGxJRk52Wm5SM1lYSmxJRVp2ZFc1a1lYUnBiMjR4RmpBVUJnTlYKK0JBc01EVUZ3WVdOb1pTQlVhSEpwWm5ReEVqQVFCZ05WQkFNTUNXeHZZMkZzYUc5emRERWtNQ0lHQ1NxR1NJYjMKK0RRRUpBUllWWkdWMlFIUm9jbWxtZEM1aGNHRmphR1V1YjNKbk1CNFhEVEUwTURRd056RTROVGd3TUZvWERUSXkKK01EWXlOREU0TlRnd01Gb3dnYkV4Q3pBSkJnTlZCQVlUQWxWVE1SRXdEd1lEVlFRSURBaE5ZWEo1YkdGdVpERVUKK01CSUdBMVVFQnd3TFJtOXlaWE4wSUVocGJHd3hKekFsQmdOVkJBb01IbFJvWlNCQmNHRmphR1VnVTI5bWRIZGgKK2NtVWdSbTkxYm1SaGRHbHZiakVXTUJRR0ExVUVDd3dOUVhCaFkyaGxJRlJvY21sbWRERVNNQkFHQTFVRUF3d0oKK2JHOWpZV3hvYjNOME1TUXdJZ1lKS29aSWh2Y05BUWtCRmhWa1pYWkFkR2h5YVdaMExtRndZV05vWlM1dmNtY3cKK2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNxRTlURTl3RVhwNUxSdExRVkRTR1EKK0dWNzgrN1p0UC9JL1phSjZRNlpHbGZ4REZ2WmpGRjczc2VOaEF2bEtsWW0vamZsSUhZTG5OT0N5U044STJYdzYKK0w5TWJDK2p2d2tFS2ZRbzRlRG94Wm5PWmpORjVKMS9sWnRCZU9vd01raGh6Qk1IMVJkczM1MS9IaktOZzZaS2cKKzJDbGRkMGo3SGJEdEVpeE9MZ0xiUFJwQmNhWXJMck5NYXNmM0hhbCt4OC9iOHVlMjh4OTNIU1FCR21abU1JVXcKK0FpbkV1L2ZOUDRsTEdsLzBrWmI3NlRueVJwWVNQWW9qdFM2Q25rSCtRTFluc1JSRVhKWXdEMVhrdTYyTGlwa1gKK3dDa1JUblo1blVzRE1YNkZQS2dqUUZRQ1dEWEcvTjA5NitQUlVRQUNoaHJYc0orZ0YzTnFXdERtdHJoVlFGNG4KK0FnTUJBQUdqVURCT01CMEdBMVVkRGdRV0JCUW84djB3elFQeDNFRWV4SlBHbHhQSzFQcGdLakFmQmdOVkhTTUUKK0dEQVdnQlFvOHYwd3pRUHgzRUVleEpQR2x4UEsxUHBnS2pBTUJnTlZIUk1FQlRBREFRSC9NQTBHQ1NxR1NJYjMKK0RRRUJCUVVBQTRJQkFRQkdGUmlKc2xjWDBhSmt3WnB6VHdTVWRnY2ZLYnB2TkViQ050Vm9oZlFWVEk0YS9vTjUKK1UreXFEWkpnM3ZPYU91aUFacXlIY0lsWjhxeWVzQ2dSTjMxNFRsNC9KUSsrQ1c4bUtqMW1lVGdvNVlGeGNaWW0KK1Q5dnNJM0MrTnpuODRESU5nSTlteDZ5a3RJdDNRT0taUkRwenlQa1V6eHN5SjhKNDI3RGFpbURyalRSK2ZUd0QKKzFEaDA5eGVlTW5TYTV6ZVYxSEVEeUpUcUNYdXRMZXR3US9JeWZtTUJoSXgrbnZCNWY2N3B6L20rRHY2VjByM0kKK3A0SENjZG5EVURHSmJmcXRvcXNBQVRRUVdPK1dXdXN3QjZtT2hEYnZQVHhoUnBacTZBa2dXcXY0Uyt1M00yR08KK3I1cDlGckJnYXZBdzViS081NEMwb1FLcE4vNWZ0YTVsNldzMAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL3NlcnZlci5rZXkgYi90ZXN0L2tleXMvc2VydmVyLmtleQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjNjZmNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9rZXlzL3NlcnZlci5rZXkKQEAgLTAsMCArMSwyOCBAQAorLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCitNSUlFdkFJQkFEQU5CZ2txaGtpRzl3MEJBUUVGQUFTQ0JLWXdnZ1NpQWdFQUFvSUJBUUNxRTlURTl3RVhwNUxSCit0TFFWRFNHUUdWNzgrN1p0UC9JL1phSjZRNlpHbGZ4REZ2WmpGRjczc2VOaEF2bEtsWW0vamZsSUhZTG5OT0N5CitTTjhJMlh3Nkw5TWJDK2p2d2tFS2ZRbzRlRG94Wm5PWmpORjVKMS9sWnRCZU9vd01raGh6Qk1IMVJkczM1MS9ICitqS05nNlpLZzJDbGRkMGo3SGJEdEVpeE9MZ0xiUFJwQmNhWXJMck5NYXNmM0hhbCt4OC9iOHVlMjh4OTNIU1FCCitHbVptTUlVd0FpbkV1L2ZOUDRsTEdsLzBrWmI3NlRueVJwWVNQWW9qdFM2Q25rSCtRTFluc1JSRVhKWXdEMVhrCit1NjJMaXBrWHdDa1JUblo1blVzRE1YNkZQS2dqUUZRQ1dEWEcvTjA5NitQUlVRQUNoaHJYc0orZ0YzTnFXdERtCit0cmhWUUY0bkFnTUJBQUVDZ2dFQVcveTUyWVlXNnlwUk9HYlo5NERRcEZWMGtMTzdxVDhxMEtzeHc1c1BOYUl0CitmRVBSSXltRGE4aWt5SFdKUzVPeG13ODR3bzVqbkpWMjZqYUxtd2UyTHVwcTdYZjFscWVqOGY1TEp0dXY3Y1FSCit4ZnpwMXZNNjVLSkZGSkhwNldxakdxSjZIU1NaT3BWRHNuUVljWFFqUUNkcHlBbWFTV2QzcCtGcVlTWjFtUW1ECitiRk5JN2pxcGN6V1NaaFRkb3RRN3A3SG45VFZDZWhmbFAzeUdJQjNiUSt3Q2NDQjg1ZE9CejIwMUwrWWdhSWNrCitTejQzQTROdldhUUlSTFJEdzdzOUdXNGpZNVQwSnYyODJXSWVBbFZwVnhMSXd1NDhyNFI0eUdUSXg5WWRvd3ZxCis1NytZNWlQUGpBWHh1MFY5dDAwb1MzYll4RGFLaDJEVWZjLzV6b3dxOFFLQmdRRFlOVlBYbWFHMGFJSDR2alE5Cis3ZlJkdy9VRGtZY1FibjZDbmdsUU91NzcvUzhvZ1F6cEtDVkpnSmdrWk5xT1Z0UU1FUHpla0dFY0xUYmplMWdVCis4Qmt5MmsrUEw5VXdiRnkwZW1uT1ZoNHJxck5YSHNSdkpjZWhOVC9QUmI1aGpGM01VTUZWLzBpRDRiK25hRmFFCitqclNXaVoyWlhqMnFmd0FLNTJHRmJ0T3VCUUtCZ1FESllRdUdpWTByMjJFNHdhSm1DU0tjem9CVDNjd2xWeldqCitWMmxqZ0E5UkhMTlRWa3ZOTllRTEd1MnFuZ0ZydHdwZWFTbnNNRGVyVkc0d0tBUVd5Q25ZenhWcmxuQzR1RHJKCitIWHVGRWx0QldpOUZmYmdmc25kMzc0OUFUMG9CUDFOVDJ0TWxlZ3V5ZjVERmdqQ1IzVlJKTGRyVmFhWjhyb3cvCitMcUtjRk1xbk93S0JnQitPSU85OWw3RTU4NFkzVkc2WmRTbmVPTHRObVJYWDJwVDd0Y1pFNDY1WmRIR0g3RGQzCitTWUhoeDlLLytYbit5REgrcExsaS94bGFyQUVsZG1TUDZrMld1VGZmdGxDNzhBZlRPZkFJZDV6TjdDRFI5NzkxCitGeDY3STlYL2l0cTMzdFM4RUl1Wmw1N1A2dVhtLzRHWFJsb1dPYTh4cHZSa1ZzQkFwdVlQbDh0MUFvR0FUUURTCit5MnNsbERPYkJYemxnR2JWMldnTklnU1ozMTF0b1R2M2pKaVhRc2phdVc4eUpSSGxuK2w0SDltemFXRGdraUZjCithbmcxa1VvRHFGNWswZUZRUHh0UWNZZGhLd0VuV1dmd3AzM1JiemZ4QTMyRFBudWJ1enpiWmhmcmtIYUtnbklXCitjeW9yOXVGWWxtMmw3T0RaTGZKZXoyUkt5VHBsWG5PU3NtUXc2YWtDZ1lBejNkajlIc2t5aitIVkoraHQxT2NFCitjN2FpL0VTa1NBN1ZhanAwdGpKcDBFS2pXL3pxOER2VVNYT3RjZG5KZ2tLeWNGbHVMd2JtbmFONHR4QmRzMUMxCitRcjhSdDJzVUNDQk5aZTFMNkRIZTNYQmRia0plOXNnWlZOVGp0VVNRcnp5OFVodnNDcUc0WVdlQ3UwN1N6Y2JjCityZFBVVjkvdVFrZHg4VnJTaHhsRDhBPT0KKy0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9zZXJ2ZXIucDEyIGIvdGVzdC9rZXlzL3NlcnZlci5wMTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5MDhhNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9zZXJ2ZXIucDEyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9zZXJ2ZXIucGVtIGIvdGVzdC9rZXlzL3NlcnZlci5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1YTlmOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9zZXJ2ZXIucGVtCkBAIC0wLDAgKzEsNTMgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRU56Q0NBeCtnQXdJQkFnSUpBT1lmWWZ3N05DT2NNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JR3hNUXN3Q1FZRAorVlFRR0V3SlZVekVSTUE4R0ExVUVDQXdJVFdGeWVXeGhibVF4RkRBU0JnTlZCQWNNQzBadmNtVnpkQ0JJYVd4cworTVNjd0pRWURWUVFLREI1VWFHVWdRWEJoWTJobElGTnZablIzWVhKbElFWnZkVzVrWVhScGIyNHhGakFVQmdOVgorQkFzTURVRndZV05vWlNCVWFISnBablF4RWpBUUJnTlZCQU1NQ1d4dlkyRnNhRzl6ZERFa01DSUdDU3FHU0liMworRFFFSkFSWVZaR1YyUUhSb2NtbG1kQzVoY0dGamFHVXViM0puTUI0WERURTBNRFF3TnpFNE5UZ3dNRm9YRFRJeQorTURZeU5ERTROVGd3TUZvd2diRXhDekFKQmdOVkJBWVRBbFZUTVJFd0R3WURWUVFJREFoTllYSjViR0Z1WkRFVQorTUJJR0ExVUVCd3dMUm05eVpYTjBJRWhwYkd3eEp6QWxCZ05WQkFvTUhsUm9aU0JCY0dGamFHVWdVMjltZEhkaAorY21VZ1JtOTFibVJoZEdsdmJqRVdNQlFHQTFVRUN3d05RWEJoWTJobElGUm9jbWxtZERFU01CQUdBMVVFQXd3SgorYkc5allXeG9iM04wTVNRd0lnWUpLb1pJaHZjTkFRa0JGaFZrWlhaQWRHaHlhV1owTG1Gd1lXTm9aUzV2Y21jdworZ2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3FFOVRFOXdFWHA1TFJ0TFFWRFNHUQorR1Y3OCs3WnRQL0kvWmFKNlE2WkdsZnhERnZaakZGNzNzZU5oQXZsS2xZbS9qZmxJSFlMbk5PQ3lTTjhJMlh3NgorTDlNYkMranZ3a0VLZlFvNGVEb3habk9aak5GNUoxL2xadEJlT293TWtoaHpCTUgxUmRzMzUxL0hqS05nNlpLZworMkNsZGQwajdIYkR0RWl4T0xnTGJQUnBCY2FZckxyTk1hc2YzSGFsK3g4L2I4dWUyOHg5M0hTUUJHbVptTUlVdworQWluRXUvZk5QNGxMR2wvMGtaYjc2VG55UnBZU1BZb2p0UzZDbmtIK1FMWW5zUlJFWEpZd0QxWGt1NjJMaXBrWAord0NrUlRuWjVuVXNETVg2RlBLZ2pRRlFDV0RYRy9OMDk2K1BSVVFBQ2hoclhzSitnRjNOcVd0RG10cmhWUUY0bgorQWdNQkFBR2pVREJPTUIwR0ExVWREZ1FXQkJRbzh2MHd6UVB4M0VFZXhKUEdseFBLMVBwZ0tqQWZCZ05WSFNNRQorR0RBV2dCUW84djB3elFQeDNFRWV4SlBHbHhQSzFQcGdLakFNQmdOVkhSTUVCVEFEQVFIL01BMEdDU3FHU0liMworRFFFQkJRVUFBNElCQVFCR0ZSaUpzbGNYMGFKa3dacHpUd1NVZGdjZkticHZORWJDTnRWb2hmUVZUSTRhL29ONQorVSt5cURaSmczdk9hT3VpQVpxeUhjSWxaOHF5ZXNDZ1JOMzE0VGw0L0pRKytDVzhtS2oxbWVUZ281WUZ4Y1pZbQorVDl2c0kzQytOem44NERJTmdJOW14NnlrdEl0M1FPS1pSRHB6eVBrVXp4c3lKOEo0MjdEYWltRHJqVFIrZlR3RAorMURoMDl4ZWVNblNhNXplVjFIRUR5SlRxQ1h1dExldHdRL0l5Zm1NQmhJeCtudkI1ZjY3cHovbStEdjZWMHIzSQorcDRIQ2NkbkRVREdKYmZxdG9xc0FBVFFRV08rV1d1c3dCNm1PaERidlBUeGhScFpxNkFrZ1dxdjRTK3UzTTJHTworcjVwOUZyQmdhdkF3NWJLTzU0QzBvUUtwTi81ZnRhNWw2V3MwCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCistLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS0KK01JSUV2QUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktZd2dnU2lBZ0VBQW9JQkFRQ3FFOVRFOXdFWHA1TFIKK3RMUVZEU0dRR1Y3OCs3WnRQL0kvWmFKNlE2WkdsZnhERnZaakZGNzNzZU5oQXZsS2xZbS9qZmxJSFlMbk5PQ3kKK1NOOEkyWHc2TDlNYkMranZ3a0VLZlFvNGVEb3habk9aak5GNUoxL2xadEJlT293TWtoaHpCTUgxUmRzMzUxL0gKK2pLTmc2WktnMkNsZGQwajdIYkR0RWl4T0xnTGJQUnBCY2FZckxyTk1hc2YzSGFsK3g4L2I4dWUyOHg5M0hTUUIKK0dtWm1NSVV3QWluRXUvZk5QNGxMR2wvMGtaYjc2VG55UnBZU1BZb2p0UzZDbmtIK1FMWW5zUlJFWEpZd0QxWGsKK3U2MkxpcGtYd0NrUlRuWjVuVXNETVg2RlBLZ2pRRlFDV0RYRy9OMDk2K1BSVVFBQ2hoclhzSitnRjNOcVd0RG0KK3RyaFZRRjRuQWdNQkFBRUNnZ0VBVy95NTJZWVc2eXBST0diWjk0RFFwRlYwa0xPN3FUOHEwS3N4dzVzUE5hSXQKK2ZFUFJJeW1EYThpa3lIV0pTNU94bXc4NHdvNWpuSlYyNmphTG13ZTJMdXBxN1hmMWxxZWo4ZjVMSnR1djdjUVIKK3hmenAxdk02NUtKRkZKSHA2V3FqR3FKNkhTU1pPcFZEc25RWWNYUWpRQ2RweUFtYVNXZDNwK0ZxWVNaMW1RbUQKK2JGTkk3anFwY3pXU1poVGRvdFE3cDdIbjlUVkNlaGZsUDN5R0lCM2JRK3dDY0NCODVkT0J6MjAxTCtZZ2FJY2sKK1N6NDNBNE52V2FRSVJMUkR3N3M5R1c0alk1VDBKdjI4MldJZUFsVnBWeExJd3U0OHI0UjR5R1RJeDlZZG93dnEKKzU3K1k1aVBQakFYeHUwVjl0MDBvUzNiWXhEYUtoMkRVZmMvNXpvd3E4UUtCZ1FEWU5WUFhtYUcwYUlINHZqUTkKKzdmUmR3L1VEa1ljUWJuNkNuZ2xRT3U3Ny9TOG9nUXpwS0NWSmdKZ2taTnFPVnRRTUVQemVrR0VjTFRiamUxZ1UKKzhCa3kyaytQTDlVd2JGeTBlbW5PVmg0cnFyTlhIc1J2SmNlaE5UL1BSYjVoakYzTVVNRlYvMGlENGIrbmFGYUUKK2pyU1dpWjJaWGoycWZ3QUs1MkdGYnRPdUJRS0JnUURKWVF1R2lZMHIyMkU0d2FKbUNTS2N6b0JUM2N3bFZ6V2oKK1YybGpnQTlSSExOVFZrdk5OWVFMR3UycW5nRnJ0d3BlYVNuc01EZXJWRzR3S0FRV3lDbll6eFZybG5DNHVEckoKK0hYdUZFbHRCV2k5RmZiZ2ZzbmQzNzQ5QVQwb0JQMU5UMnRNbGVndXlmNURGZ2pDUjNWUkpMZHJWYWFaOHJvdy8KK0xxS2NGTXFuT3dLQmdCK09JTzk5bDdFNTg0WTNWRzZaZFNuZU9MdE5tUlhYMnBUN3RjWkU0NjVaZEhHSDdEZDMKK1NZSGh4OUsvK1huK3lESCtwTGxpL3hsYXJBRWxkbVNQNmsyV3VUZmZ0bEM3OEFmVE9mQUlkNXpON0NEUjk3OTEKK0Z4NjdJOVgvaXRxMzN0UzhFSXVabDU3UDZ1WG0vNEdYUmxvV09hOHhwdlJrVnNCQXB1WVBsOHQxQW9HQVRRRFMKK3kyc2xsRE9iQlh6bGdHYlYyV2dOSWdTWjMxMXRvVHYzakppWFFzamF1Vzh5SlJIbG4rbDRIOW16YVdEZ2tpRmMKK2FuZzFrVW9EcUY1azBlRlFQeHRRY1lkaEt3RW5XV2Z3cDMzUmJ6ZnhBMzJEUG51YnV6emJaaGZya0hhS2duSVcKK2N5b3I5dUZZbG0ybDdPRFpMZkplejJSS3lUcGxYbk9Tc21RdzZha0NnWUF6M2RqOUhza3lqK0hWSitodDFPY0UKK2M3YWkvRVNrU0E3VmFqcDB0akpwMEVLalcvenE4RHZVU1hPdGNkbkpna0t5Y0ZsdUx3Ym1uYU40dHhCZHMxQzEKK1FyOFJ0MnNVQ0NCTlplMUw2REhlM1hCZGJrSmU5c2daVk5UanRVU1Fyenk4VWh2c0NxRzRZV2VDdTA3U3pjYmMKK3JkUFVWOS91UWtkeDhWclNoeGxEOEE9PQorLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdC9rbm93bl9mYWlsdXJlc19MaW51eC5qc29uIGIvdGVzdC9rbm93bl9mYWlsdXJlc19MaW51eC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYjJhZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24KQEAgLTAsMCArMSw0OTQgQEAKK1sKKyAgImNfZ2xpYi1yc19tdWx0aV9idWZmZXJlZC1pcCIsCisgICJjX2dsaWItcnNfbXVsdGlfZnJhbWVkLWlwIiwKKyAgImNfZ2xpYi1yc19tdWx0aWNfYnVmZmVyZWQtaXAiLAorICAiY19nbGliLXJzX211bHRpY19mcmFtZWQtaXAiLAorICAiY2wtY19nbGliX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJjbC1jX2dsaWJfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJjbC1jX2dsaWJfbXVsdGktYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImNsLWNfZ2xpYl9tdWx0aS1iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImNsLWNfZ2xpYl9tdWx0aV9idWZmZXJlZC1pcCIsCisgICJjbC1jX2dsaWJfbXVsdGlfZnJhbWVkLWlwIiwKKyAgImNsLWdvX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJjbC1nb19iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImNsLXJiX2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcCIsCisgICJjbC1yYl9iaW5hcnktYWNjZWxfZnJhbWVkLWlwIiwKKyAgImNsLXJiX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJjbC1yYl9iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImNsLXJzX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJjbC1yc19iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImNsLXJzX211bHRpLWJpbmFyeV9idWZmZXJlZC1pcCIsCisgICJjbC1yc19tdWx0aS1iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImNsLXJzX211bHRpX2J1ZmZlcmVkLWlwIiwKKyAgImNsLXJzX211bHRpX2ZyYW1lZC1pcCIsCisgICJjcHAtZGFydF9iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtZGFydF9jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLWRhcnRfanNvbl9odHRwLWlwIiwKKyAgImNwcC1kYXJ0X211bHRpLWJpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1kYXJ0X211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLWRhcnRfbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJjcHAtZ29fYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLWdvX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtZ29fY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1nb19jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1nb19qc29uX2h0dHAtaXAiLAorICAiY3BwLWdvX2pzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLWdvX211bHRpLWJpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1nb19tdWx0aS1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLWdvX211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLWdvX211bHRpYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1nb19tdWx0aWotanNvbl9odHRwLWlwIiwKKyAgImNwcC1nb19tdWx0aWotanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtamF2YV9iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtamF2YV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1qYXZhX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfanNvbl9odHRwLWlwIiwKKyAgImNwcC1qYXZhX2pzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfbXVsdGktYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGktYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1qYXZhX211bHRpX2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGlfaHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfbXVsdGljLWNvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtamF2YV9tdWx0aWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtamF2YV9tdWx0aWNfaHR0cC1pcCIsCisgICJjcHAtamF2YV9tdWx0aWNfaHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJjcHAtamF2YV9tdWx0aWotanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtamF2YV9tdWx0aWpfaHR0cC1pcCIsCisgICJjcHAtamF2YV9tdWx0aWpfaHR0cC1pcC1zc2wiLAorICAiY3BwLW5vZGVqc19iaW5hcnlfaHR0cC1kb21haW4iLAorICAiY3BwLW5vZGVqc19iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtbm9kZWpzX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtbm9kZWpzX2NvbXBhY3RfaHR0cC1kb21haW4iLAorICAiY3BwLW5vZGVqc19jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLW5vZGVqc19jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1ub2RlanNfanNvbl9odHRwLWRvbWFpbiIsCisgICJjcHAtbm9kZWpzX2pzb25faHR0cC1pcCIsCisgICJjcHAtbm9kZWpzX2pzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLW5vZGVqc19tdWx0aS1iaW5hcnlfaHR0cC1kb21haW4iLAorICAiY3BwLW5vZGVqc19tdWx0aS1iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtbm9kZWpzX211bHRpLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtbm9kZWpzX211bHRpYy1jb21wYWN0X2h0dHAtZG9tYWluIiwKKyAgImNwcC1ub2RlanNfbXVsdGljLWNvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtbm9kZWpzX211bHRpYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1ub2RlanNfbXVsdGlqLWpzb25faHR0cC1kb21haW4iLAorICAiY3BwLW5vZGVqc19tdWx0aWotanNvbl9odHRwLWlwIiwKKyAgImNwcC1ub2RlanNfbXVsdGlqLWpzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19iaW5hcnktYWNjZWxfaHR0cC1pcCIsCisgICJjcHAtcHkzX2JpbmFyeS1hY2NlbF9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX2JpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1weTNfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfY29tcGFjdC1hY2NlbGNfaHR0cC1pcCIsCisgICJjcHAtcHkzX2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1weTNfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX2hlYWRlcl9odHRwLWlwIiwKKyAgImNwcC1weTNfaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfanNvbl9odHRwLWlwIiwKKyAgImNwcC1weTNfanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpLWFjY2VsX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aS1hY2NlbF9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpLWJpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGktYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGktbXVsdGlhX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aS1tdWx0aWFfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aV9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGlfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aWMtYWNjZWxjX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWMtYWNjZWxjX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGljLWNvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGljLW11bHRpYWNfaHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpYy1tdWx0aWFjX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGljX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWNfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aWgtaGVhZGVyX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWgtaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpai1qc29uX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGlqX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWpfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X2JpbmFyeS1hY2NlbF9odHRwLWlwIiwKKyAgImNwcC1weV9iaW5hcnktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X2JpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1weV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAiLAorICAiY3BwLXB5X2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLXB5X2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X2hlYWRlcl9odHRwLWlwIiwKKyAgImNwcC1weV9oZWFkZXJfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X2pzb25faHR0cC1pcCIsCisgICJjcHAtcHlfanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGktYWNjZWxfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpLWJpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aS1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpLW11bHRpYV9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aS1tdWx0aWFfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpX2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aWMtYWNjZWxjX2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpYy1hY2NlbGNfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aWMtbXVsdGlhY19odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWMtbXVsdGlhY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGljX2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGloLWhlYWRlcl9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWgtaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aWotanNvbl9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWotanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGlqX2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpal9odHRwLWlwLXNzbCIsCisgICJjcHAtcnNfbXVsdGlfYnVmZmVyZWQtaXAiLAorICAiY3BwLXJzX211bHRpX2ZyYW1lZC1pcCIsCisgICJjcHAtcnNfbXVsdGljX2J1ZmZlcmVkLWlwIiwKKyAgImNwcC1yc19tdWx0aWNfZnJhbWVkLWlwIiwKKyAgImNzaGFycC1yYl9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImNzaGFycC1yYl9iaW5hcnktYWNjZWxfZnJhbWVkLWlwLXNzbCIsCisgICJjc2hhcnAtcmJfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJjc2hhcnAtcmJfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAorICAiY3NoYXJwLXJiX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImNzaGFycC1yYl9jb21wYWN0X2ZyYW1lZC1pcC1zc2wiLAorICAiY3NoYXJwLXJiX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKKyAgImNzaGFycC1yYl9qc29uX2ZyYW1lZC1pcC1zc2wiLAorICAiZC1jbF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZC1jbF9iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImQtY3BwX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJkLWNwcF9iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtY3BwX2JpbmFyeV9mcmFtZWQtaXAiLAorICAiZC1jcHBfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAorICAiZC1jcHBfYmluYXJ5X2h0dHAtaXAiLAorICAiZC1jcHBfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImQtY3BwX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiZC1jcHBfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1jcHBfY29tcGFjdF9mcmFtZWQtaXAiLAorICAiZC1jcHBfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKKyAgImQtY3BwX2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLWNwcF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImQtY3BwX2pzb25fYnVmZmVyZWQtaXAiLAorICAiZC1jcHBfanNvbl9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1jcHBfanNvbl9mcmFtZWQtaXAiLAorICAiZC1jcHBfanNvbl9mcmFtZWQtaXAtc3NsIiwKKyAgImQtY3BwX2pzb25faHR0cC1pcCIsCisgICJkLWNwcF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgImQtZF9iaW5hcnlfaHR0cC1pcCIsCisgICJkLWRfY29tcGFjdF9odHRwLWlwIiwKKyAgImQtZF9qc29uX2h0dHAtaXAiLAorICAiZC1kYXJ0X2JpbmFyeV9odHRwLWlwIiwKKyAgImQtZGFydF9jb21wYWN0X2h0dHAtaXAiLAorICAiZC1kYXJ0X2pzb25faHR0cC1pcCIsCisgICJkLWdvX2JpbmFyeV9odHRwLWlwIiwKKyAgImQtZ29fYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImQtZ29fY29tcGFjdF9odHRwLWlwIiwKKyAgImQtZ29fY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJkLWdvX2pzb25faHR0cC1pcCIsCisgICJkLWdvX2pzb25faHR0cC1pcC1zc2wiLAorICAiZC1qYXZhX2JpbmFyeV9odHRwLWlwIiwKKyAgImQtamF2YV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiZC1qYXZhX2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLWphdmFfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJkLWphdmFfanNvbl9odHRwLWlwIiwKKyAgImQtamF2YV9qc29uX2h0dHAtaXAtc3NsIiwKKyAgImQtanNfanNvbl9odHRwLWlwIiwKKyAgImQtbm9kZWpzX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJkLW5vZGVqc19iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2JpbmFyeV9mcmFtZWQtaXAiLAorICAiZC1ub2RlanNfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAorICAiZC1ub2RlanNfYmluYXJ5X2h0dHAtaXAiLAorICAiZC1ub2RlanNfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiZC1ub2RlanNfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1ub2RlanNfY29tcGFjdF9mcmFtZWQtaXAiLAorICAiZC1ub2RlanNfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLW5vZGVqc19jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2pzb25fYnVmZmVyZWQtaXAiLAorICAiZC1ub2RlanNfanNvbl9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1ub2RlanNfanNvbl9mcmFtZWQtaXAiLAorICAiZC1ub2RlanNfanNvbl9mcmFtZWQtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2pzb25faHR0cC1pcCIsCisgICJkLW5vZGVqc19qc29uX2h0dHAtaXAtc3NsIiwKKyAgImQtbm9kZXRzX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJkLXB5M19iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAiLAorICAiZC1weTNfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5M19iaW5hcnktYWNjZWxfZnJhbWVkLWlwIiwKKyAgImQtcHkzX2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHkzX2JpbmFyeS1hY2NlbF9odHRwLWlwIiwKKyAgImQtcHkzX2JpbmFyeS1hY2NlbF9odHRwLWlwLXNzbCIsCisgICJkLXB5M19iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZC1weTNfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5M19iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImQtcHkzX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHkzX2JpbmFyeV9odHRwLWlwIiwKKyAgImQtcHkzX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJkLXB5M19jb21wYWN0LWFjY2VsY19idWZmZXJlZC1pcCIsCisgICJkLXB5M19jb21wYWN0LWFjY2VsY19idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weTNfY29tcGFjdC1hY2NlbGNfZnJhbWVkLWlwIiwKKyAgImQtcHkzX2NvbXBhY3QtYWNjZWxjX2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weTNfY29tcGFjdC1hY2NlbGNfaHR0cC1pcCIsCisgICJkLXB5M19jb21wYWN0LWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJkLXB5M19jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImQtcHkzX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHkzX2NvbXBhY3RfZnJhbWVkLWlwIiwKKyAgImQtcHkzX2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5M19jb21wYWN0X2h0dHAtaXAiLAorICAiZC1weTNfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJkLXB5M19qc29uX2J1ZmZlcmVkLWlwIiwKKyAgImQtcHkzX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHkzX2pzb25fZnJhbWVkLWlwIiwKKyAgImQtcHkzX2pzb25fZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5M19qc29uX2h0dHAtaXAiLAorICAiZC1weTNfanNvbl9odHRwLWlwLXNzbCIsCisgICJkLXB5X2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcCIsCisgICJkLXB5X2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weV9iaW5hcnktYWNjZWxfZnJhbWVkLWlwIiwKKyAgImQtcHlfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weV9iaW5hcnktYWNjZWxfaHR0cC1pcCIsCisgICJkLXB5X2JpbmFyeS1hY2NlbF9odHRwLWlwLXNzbCIsCisgICJkLXB5X2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJkLXB5X2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weV9iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImQtcHlfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weV9iaW5hcnlfaHR0cC1pcCIsCisgICJkLXB5X2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJkLXB5X2NvbXBhY3QtYWNjZWxjX2J1ZmZlcmVkLWlwIiwKKyAgImQtcHlfY29tcGFjdC1hY2NlbGNfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHlfY29tcGFjdC1hY2NlbGNfZnJhbWVkLWlwIiwKKyAgImQtcHlfY29tcGFjdC1hY2NlbGNfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5X2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAiLAorICAiZC1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJkLXB5X2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiZC1weV9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5X2NvbXBhY3RfZnJhbWVkLWlwIiwKKyAgImQtcHlfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHlfY29tcGFjdF9odHRwLWlwIiwKKyAgImQtcHlfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJkLXB5X2pzb25fYnVmZmVyZWQtaXAiLAorICAiZC1weV9qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5X2pzb25fZnJhbWVkLWlwIiwKKyAgImQtcHlfanNvbl9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHlfanNvbl9odHRwLWlwIiwKKyAgImQtcHlfanNvbl9odHRwLWlwLXNzbCIsCisgICJlcmwtY3BwX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJlcmwtY3BwX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiZXJsLWNzaGFycF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZXJsLWNzaGFycF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImVybC1ub2RlanNfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImVybC1ub2RlanNfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICJlcmwtbm9kZXRzX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJlcmwtcmJfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwIiwKKyAgImVybC1yYl9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImVybC1yYl9iaW5hcnktYWNjZWxfZnJhbWVkLWlwIiwKKyAgImVybC1yYl9iaW5hcnktYWNjZWxfZnJhbWVkLWlwLXNzbCIsCisgICJlcmwtcmJfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImVybC1yYl9iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImVybC1yYl9iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImVybC1yYl9iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCisgICJlcmwtcmJfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICJlcmwtcmJfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAorICAiZXJsLXJiX2NvbXBhY3RfZnJhbWVkLWlwIiwKKyAgImVybC1yYl9jb21wYWN0X2ZyYW1lZC1pcC1zc2wiLAorICAiZ28tY3BwX2JpbmFyeV9odHRwLWlwIiwKKyAgImdvLWNwcF9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiZ28tY3BwX2NvbXBhY3RfaHR0cC1pcCIsCisgICJnby1jcHBfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJnby1jcHBfanNvbl9odHRwLWlwIiwKKyAgImdvLWNwcF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgImdvLWRfYmluYXJ5X2h0dHAtaXAiLAorICAiZ28tZF9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiZ28tZF9jb21wYWN0X2h0dHAtaXAiLAorICAiZ28tZF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImdvLWRfanNvbl9odHRwLWlwIiwKKyAgImdvLWRfanNvbl9odHRwLWlwLXNzbCIsCisgICJnby1kYXJ0X2JpbmFyeV9odHRwLWlwIiwKKyAgImdvLWRhcnRfY29tcGFjdF9odHRwLWlwIiwKKyAgImdvLWRhcnRfanNvbl9odHRwLWlwIiwKKyAgImdvLWphdmFfYmluYXJ5X2h0dHAtaXAiLAorICAiZ28tamF2YV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiZ28tamF2YV9jb21wYWN0X2h0dHAtaXAiLAorICAiZ28tamF2YV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImdvLWphdmFfanNvbl9odHRwLWlwIiwKKyAgImdvLWphdmFfanNvbl9odHRwLWlwLXNzbCIsCisgICJnby1weTNfYmluYXJ5LWFjY2VsX3psaWItaXAtc3NsIiwKKyAgImdvLXB5M19jb21wYWN0LWFjY2VsY196bGliLWlwLXNzbCIsCisgICJnby1weV9iaW5hcnktYWNjZWxfemxpYi1pcC1zc2wiLAorICAiZ28tcHlfY29tcGFjdC1hY2NlbGNfemxpYi1pcC1zc2wiLAorICAiaHMtY3NoYXJwX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJocy1jc2hhcnBfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJocy1jc2hhcnBfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICJocy1jc2hhcnBfY29tcGFjdF9mcmFtZWQtaXAiLAorICAibm9kZWpzLWNwcF9iaW5hcnlfaHR0cC1kb21haW4iLAorICAibm9kZWpzLWNwcF9iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtY3BwX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJub2RlanMtY3BwX2NvbXBhY3RfaHR0cC1kb21haW4iLAorICAibm9kZWpzLWNwcF9jb21wYWN0X2h0dHAtaXAiLAorICAibm9kZWpzLWNwcF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1jcHBfanNvbl9idWZmZXJlZC1pcC1zc2wiLAorICAibm9kZWpzLWNwcF9qc29uX2h0dHAtZG9tYWluIiwKKyAgIm5vZGVqcy1jcHBfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1jcHBfanNvbl9odHRwLWlwLXNzbCIsCisgICJub2RlanMtZF9iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtZF9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWRfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1kX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWRfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1kX2pzb25faHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWRhcnRfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLWRhcnRfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1kYXJ0X2pzb25faHR0cC1pcCIsCisgICJub2RlanMtZ29fYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLWdvX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJub2RlanMtZ29fY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1nb19jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1nb19qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLWdvX2pzb25faHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWhzX2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1oc19jb21wYWN0X2h0dHAtaXAiLAorICAibm9kZWpzLWhzX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtamF2YV9iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtamF2YV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWphdmFfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1qYXZhX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWphdmFfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1qYXZhX2pzb25faHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWpzX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtbHVhX2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1sdWFfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1sdWFfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1weTNfYmluYXJ5LWFjY2VsX2h0dHAtaXAiLAorICAibm9kZWpzLXB5M19iaW5hcnktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5M19iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtcHkzX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHkzX2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAiLAorICAibm9kZWpzLXB5M19jb21wYWN0LWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHkzX2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtcHkzX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5M19qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLXB5M19qc29uX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weV9iaW5hcnktYWNjZWxfaHR0cC1pcCIsCisgICJub2RlanMtcHlfYmluYXJ5LWFjY2VsX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weV9iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtcHlfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwIiwKKyAgIm5vZGVqcy1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHlfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1weV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weV9qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLXB5X2pzb25faHR0cC1pcC1zc2wiLAorICAicGVybC1yc19tdWx0aV9idWZmZXJlZC1pcCIsCisgICJwZXJsLXJzX211bHRpX2ZyYW1lZC1pcCIsCisgICJweS1jcHBfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHktY3BwX2FjY2VsLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweS1jcHBfYWNjZWwtYmluYXJ5X3psaWItaXAiLAorICAicHktY3BwX2FjY2VsLWJpbmFyeV96bGliLWlwLXNzbCIsCisgICJweS1jcHBfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweS1jcHBfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHktY3BwX2FjY2VsYy1jb21wYWN0X3psaWItaXAiLAorICAicHktY3BwX2FjY2VsYy1jb21wYWN0X3psaWItaXAtc3NsIiwKKyAgInB5LWNwcF9iaW5hcnlfaHR0cC1pcCIsCisgICJweS1jcHBfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5LWNwcF9jb21wYWN0X2h0dHAtaXAiLAorICAicHktY3BwX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHktY3BwX2hlYWRlcl9odHRwLWlwIiwKKyAgInB5LWNwcF9oZWFkZXJfaHR0cC1pcC1zc2wiLAorICAicHktY3BwX2pzb25faHR0cC1pcCIsCisgICJweS1jcHBfanNvbl9odHRwLWlwLXNzbCIsCisgICJweS1kX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5LWRfYWNjZWwtYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5LWRfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweS1kX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5LWRfYmluYXJ5X2h0dHAtaXAiLAorICAicHktZF9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHktZF9jb21wYWN0X2h0dHAtaXAiLAorICAicHktZF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5LWRfanNvbl9odHRwLWlwIiwKKyAgInB5LWRfanNvbl9odHRwLWlwLXNzbCIsCisgICJweS1kYXJ0X2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5LWRhcnRfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweS1kYXJ0X2JpbmFyeV9odHRwLWlwIiwKKyAgInB5LWRhcnRfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWRhcnRfanNvbl9odHRwLWlwIiwKKyAgInB5LWhzX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5LWhzX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHktaHNfYmluYXJ5X2h0dHAtaXAiLAorICAicHktaHNfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWhzX2hlYWRlcl9odHRwLWlwIiwKKyAgInB5LWhzX2pzb25faHR0cC1pcCIsCisgICJweS1qYXZhX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5LWphdmFfYWNjZWwtYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5LWphdmFfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweS1qYXZhX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5LWphdmFfYmluYXJ5X2h0dHAtaXAiLAorICAicHktamF2YV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHktamF2YV9jb21wYWN0X2h0dHAtaXAiLAorICAicHktamF2YV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5LWphdmFfanNvbl9odHRwLWlwIiwKKyAgInB5LWphdmFfanNvbl9odHRwLWlwLXNzbCIsCisgICJweS1sdWFfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHktbHVhX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHktbHVhX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5LWx1YV9jb21wYWN0X2h0dHAtaXAiLAorICAicHktbHVhX2pzb25faHR0cC1pcCIsCisgICJweTMtY3BwX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5My1jcHBfYWNjZWwtYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5My1jcHBfYWNjZWwtYmluYXJ5X3psaWItaXAiLAorICAicHkzLWNwcF9hY2NlbC1iaW5hcnlfemxpYi1pcC1zc2wiLAorICAicHkzLWNwcF9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1jcHBfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHkzLWNwcF9hY2NlbGMtY29tcGFjdF96bGliLWlwIiwKKyAgInB5My1jcHBfYWNjZWxjLWNvbXBhY3RfemxpYi1pcC1zc2wiLAorICAicHkzLWNwcF9iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtY3BwX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweTMtY3BwX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtY3BwX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHkzLWNwcF9oZWFkZXJfaHR0cC1pcCIsCisgICJweTMtY3BwX2hlYWRlcl9odHRwLWlwLXNzbCIsCisgICJweTMtY3BwX2pzb25faHR0cC1pcCIsCisgICJweTMtY3BwX2pzb25faHR0cC1pcC1zc2wiLAorICAicHkzLWRfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWRfYWNjZWwtYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5My1kX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWRfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHkzLWRfYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWRfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5My1kX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtZF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5My1kX2pzb25faHR0cC1pcCIsCisgICJweTMtZF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgInB5My1kYXJ0X2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5My1kYXJ0X2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWRhcnRfYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWRhcnRfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1kYXJ0X2pzb25faHR0cC1pcCIsCisgICJweTMtaHNfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWhzX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWhzX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5My1oc19jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWhzX2hlYWRlcl9odHRwLWlwIiwKKyAgInB5My1oc19qc29uX2h0dHAtaXAiLAorICAicHkzLWphdmFfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWphdmFfYWNjZWwtYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5My1qYXZhX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWphdmFfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHkzLWphdmFfYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWphdmFfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5My1qYXZhX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtamF2YV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5My1qYXZhX2pzb25faHR0cC1pcCIsCisgICJweTMtamF2YV9qc29uX2h0dHAtaXAtc3NsIiwKKyAgInB5My1sdWFfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWx1YV9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1sdWFfYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWx1YV9jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWx1YV9qc29uX2h0dHAtaXAiLAorICAicmItY3BwX2pzb25fYnVmZmVyZWQtZG9tYWluIiwKKyAgInJiLWNwcF9qc29uX2J1ZmZlcmVkLWlwIiwKKyAgInJiLWNwcF9qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJyYi1jcHBfanNvbl9mcmFtZWQtZG9tYWluIiwKKyAgInJiLWNwcF9qc29uX2ZyYW1lZC1pcCIsCisgICJyYi1jcHBfanNvbl9mcmFtZWQtaXAtc3NsIgorXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvbHVhL01ha2VmaWxlLmFtIGIvdGVzdC9sdWEvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4YzVhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbHVhL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCisjIFJlbW92ZSAiTWFwVHlwZSA9IiBsaW5lIHRvIGlnbm9yZSBzb21lIG1hcCBidWcgZm9yIG5vdworc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0ICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtLWdlbiBsdWEgJDwKKwkkKFNFRCkgLWkuYmFrICdzL01hcFR5cGUgPS8vZycgZ2VuLWx1YS9UaHJpZnRUZXN0X3R0eXBlcy5sdWEKKwkkKFJNKSBnZW4tbHVhL1RocmlmdFRlc3RfdHR5cGVzLmx1YS5iYWsKKworcHJlY3Jvc3M6IHN0dWJzCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1sdWEKZGlmZiAtLWdpdCBhL3Rlc3QvbHVhL3Rlc3RfYmFzaWNfY2xpZW50Lmx1YSBiL3Rlc3QvbHVhL3Rlc3RfYmFzaWNfY2xpZW50Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2Q4ZDA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9sdWEvdGVzdF9iYXNpY19jbGllbnQubHVhCkBAIC0wLDAgKzEsMTc5IEBACistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKworCityZXF1aXJlKCdUU29ja2V0JykKK3JlcXVpcmUoJ1RCdWZmZXJlZFRyYW5zcG9ydCcpCityZXF1aXJlKCdURnJhbWVkVHJhbnNwb3J0JykKK3JlcXVpcmUoJ1RIdHRwVHJhbnNwb3J0JykKK3JlcXVpcmUoJ1RDb21wYWN0UHJvdG9jb2wnKQorcmVxdWlyZSgnVEpzb25Qcm90b2NvbCcpCityZXF1aXJlKCdUQmluYXJ5UHJvdG9jb2wnKQorcmVxdWlyZSgnVGhyaWZ0VGVzdF9UaHJpZnRUZXN0JykKK3JlcXVpcmUoJ2xpYmx1YWxvbmdudW1iZXInKQorCitsb2NhbCBjbGllbnQKKworZnVuY3Rpb24gdGVhcmRvd24oKQorICBpZiBjbGllbnQgdGhlbgorICAgIC0tIGNsb3NlIHRoZSBjb25uZWN0aW9uCisgICAgY2xpZW50OmNsb3NlKCkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gcGFyc2VBcmdzKHJhd0FyZ3MpCisgIGxvY2FsIG9wdCA9IHsKKyAgICBwcm90b2NvbD0nYmluYXJ5JywKKyAgICB0cmFuc3BvcnQ9J2J1ZmZlcmVkJywKKyAgICBwb3J0PSc5MDkwJywKKyAgfQorICBmb3IgaSwgc3RyIGluIHBhaXJzKHJhd0FyZ3MpIGRvCisgICAgaWYgaSA+IDAgdGhlbgorICAgICAgaywgdiA9IHN0cmluZy5tYXRjaChzdHIsICctLSgldyspPSgldyspJykKKyAgICAgIGFzc2VydChvcHRba10gfj0gbmlsLCAnVW5rbm93biBhcmd1bWVudCcpCisgICAgICBvcHRba10gPSB2CisgICAgZW5kCisgIGVuZAorICByZXR1cm4gb3B0CitlbmQKKworZnVuY3Rpb24gYXNzZXJ0RXF1YWwodmFsMSwgdmFsMiwgbXNnKQorICBhc3NlcnQodmFsMSA9PSB2YWwyLCBtc2cpCitlbmQKKworZnVuY3Rpb24gdGVzdEJhc2ljQ2xpZW50KHJhd0FyZ3MpCisgIGxvY2FsIG9wdCA9IHBhcnNlQXJncyhyYXdBcmdzKQorICBsb2NhbCBzb2NrZXQgPSBUU29ja2V0Om5ld3sKKyAgICBwb3J0ID0gdG9udW1iZXIob3B0LnBvcnQpCisgIH0KKyAgYXNzZXJ0KHNvY2tldCwgJ0ZhaWxlZCB0byBjcmVhdGUgY2xpZW50IHNvY2tldCcpCisgIHNvY2tldDpzZXRUaW1lb3V0KDUwMDApCisKKyAgbG9jYWwgdHJhbnNwb3J0cyA9IHsKKyAgICBidWZmZXJlZCA9IFRCdWZmZXJlZFRyYW5zcG9ydCwKKyAgICBmcmFtZWQgPSBURnJhbWVkVHJhbnNwb3J0LAorICAgIGh0dHAgPSBUSHR0cFRyYW5zcG9ydCwKKyAgfQorICBhc3NlcnQodHJhbnNwb3J0c1tvcHQudHJhbnNwb3J0XSB+PSBuaWwpCisgIGxvY2FsIHRyYW5zcG9ydCA9IHRyYW5zcG9ydHNbb3B0LnRyYW5zcG9ydF06bmV3eworICAgIHRyYW5zID0gc29ja2V0LAorICAgIGlzU2VydmVyID0gZmFsc2UKKyAgfQorCisgIGxvY2FsIHByb3RvY29scyA9IHsKKyAgICBiaW5hcnkgPSBUQmluYXJ5UHJvdG9jb2wsCisgICAgY29tcGFjdCA9IFRDb21wYWN0UHJvdG9jb2wsCisgICAganNvbiA9IFRKU09OUHJvdG9jb2wsCisgIH0KKyAgYXNzZXJ0KHByb3RvY29sc1tvcHQucHJvdG9jb2xdIH49IG5pbCkKKyAgbG9jYWwgcHJvdG9jb2wgPSBwcm90b2NvbHNbb3B0LnByb3RvY29sXTpuZXd7CisgICAgdHJhbnMgPSB0cmFuc3BvcnQKKyAgfQorICBhc3NlcnQocHJvdG9jb2wsICdGYWlsZWQgdG8gY3JlYXRlIGJpbmFyeSBwcm90b2NvbCcpCisKKyAgY2xpZW50ID0gVGhyaWZ0VGVzdENsaWVudDpuZXd7CisgICAgcHJvdG9jb2wgPSBwcm90b2NvbAorICB9CisgIGFzc2VydChjbGllbnQsICdGYWlsZWQgdG8gY3JlYXRlIGNsaWVudCcpCisKKyAgLS0gT3BlbiB0aGUgdHJhbnNwb3J0CisgIGxvY2FsIHN0YXR1cywgXyA9IHBjYWxsKHRyYW5zcG9ydC5vcGVuLCB0cmFuc3BvcnQpCisgIGFzc2VydChzdGF0dXMsICdGYWlsZWQgdG8gY29ubmVjdCB0byBzZXJ2ZXInKQorCisgIC0tIFN0cmluZworICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdFN0cmluZygnbGFsYScpLCAgJ2xhbGEnLCAgJ0ZhaWxlZCB0ZXN0U3RyaW5nJykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RTdHJpbmcoJ3dhaG9vJyksICd3YWhvbycsICdGYWlsZWQgdGVzdFN0cmluZycpCisKKyAgLS0gQm9vbAorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEJvb2wodHJ1ZSksIHRydWUsICdGYWlsZWQgdGVzdEJvb2wgdHJ1ZScpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0Qm9vbChmYWxzZSksIGZhbHNlLCAnRmFpbGVkIHRlc3RCb29sIGZhbHNlJykKKworICAtLSBCeXRlCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0Qnl0ZSgweDAxKSwgMSwgICAgJ0ZhaWxlZCB0ZXN0Qnl0ZSAxJykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RCeXRlKDB4NDApLCA2NCwgICAnRmFpbGVkIHRlc3RCeXRlIDInKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEJ5dGUoMHg3ZiksIDEyNywgICdGYWlsZWQgdGVzdEJ5dGUgMycpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0Qnl0ZSgweDgwKSwgLTEyOCwgJ0ZhaWxlZCB0ZXN0Qnl0ZSA0JykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RCeXRlKDB4YmYpLCAtNjUsICAnRmFpbGVkIHRlc3RCeXRlIDUnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEJ5dGUoMHhmZiksIC0xLCAgICdGYWlsZWQgdGVzdEJ5dGUgNicpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0Qnl0ZSgxMjgpLCAtMTI4LCAgJ0ZhaWxlZCB0ZXN0Qnl0ZSA3JykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RCeXRlKDI1NSksIC0xLCAgICAnRmFpbGVkIHRlc3RCeXRlIDgnKQorCisgIC0tIEkzMgorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEkzMigweDAwMDAwMDAxKSwgMSwgICAgICAgICAgICdGYWlsZWQgdGVzdEkzMiAxJykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJMzIoMHg0MDAwMDAwMCksIDEwNzM3NDE4MjQsICAnRmFpbGVkIHRlc3RJMzIgMicpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STMyKDB4N2ZmZmZmZmYpLCAyMTQ3NDgzNjQ3LCAgJ0ZhaWxlZCB0ZXN0STMyIDMnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEkzMigweDgwMDAwMDAwKSwgLTIxNDc0ODM2NDgsICdGYWlsZWQgdGVzdEkzMiA0JykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJMzIoMHhiZmZmZmZmZiksIC0xMDczNzQxODI1LCAnRmFpbGVkIHRlc3RJMzIgNScpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STMyKDB4ZmZmZmZmZmYpLCAtMSwgICAgICAgICAgJ0ZhaWxlZCB0ZXN0STMyIDYnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEkzMigyMTQ3NDgzNjQ4KSwgLTIxNDc0ODM2NDgsICdGYWlsZWQgdGVzdEkzMiA3JykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJMzIoNDI5NDk2NzI5NSksIC0xLCAgICAgICAgICAnRmFpbGVkIHRlc3RJMzIgOCcpCisKKyAgLS0gSTY0IChsdWEgb25seSBzdXBwb3J0cyAxNiBkZWNpbWFsIHByZWNpc2lvbiBzbyBsYXJnZXIgbnVtYmVycyBhcmUKKyAgLS0gaW5pdGlhbGl6ZWQgYnkgdGhlaXIgc3RyaW5nIHZhbHVlKQorICBsb2NhbCBsb25nID0gbGlibHVhbG9uZ251bWJlci5uZXcKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJNjQobG9uZygweDAwMDAwMDAwMDAwMDAwMDEpKSwKKyAgICAgICAgICAgICAgICAgICBsb25nKDEpLAorICAgICAgICAgICAgICAgICAgICdGYWlsZWQgdGVzdEk2NCAxJykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJNjQobG9uZygweDQwMDAwMDAwMDAwMDAwMDApKSwKKyAgICAgICAgICAgICAgICAgICBsb25nKDQ2MTE2ODYwMTg0MjczODc5MDQpLAorICAgICAgICAgICAgICAgICAgICdGYWlsZWQgdGVzdEk2NCAyJykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJNjQobG9uZygnMHg3ZmZmZmZmZmZmZmZmZmZmJykpLAorICAgICAgICAgICAgICAgICAgIGxvbmcoJzkyMjMzNzIwMzY4NTQ3NzU4MDcnKSwKKyAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRlc3RJNjQgMycpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STY0KGxvbmcoMHg4MDAwMDAwMDAwMDAwMDAwKSksCisgICAgICAgICAgICAgICAgICAgbG9uZygtOTIyMzM3MjAzNjg1NDc3NTgwOCksCisgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0ZXN0STY0IDQnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEk2NChsb25nKCcweGJmZmZmZmZmZmZmZmZmZmYnKSksCisgICAgICAgICAgICAgICAgICAgbG9uZygnLTQ2MTE2ODYwMTg0MjczODc5MDUnKSwKKyAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRlc3RJNjQgNScpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STY0KGxvbmcoJzB4ZmZmZmZmZmZmZmZmZmZmZicpKSwKKyAgICAgICAgICAgICAgICAgICBsb25nKC0xKSwKKyAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRlc3RJNjQgNicpCisKKyAgLS0gRG91YmxlCisgIGFzc2VydEVxdWFsKAorICAgICAgY2xpZW50OnRlc3REb3VibGUoMS4yMzQ1Njc4OSksIDEuMjM0NTY3ODksICdGYWlsZWQgdGVzdERvdWJsZSAxJykKKyAgYXNzZXJ0RXF1YWwoCisgICAgICBjbGllbnQ6dGVzdERvdWJsZSgwLjEyMzQ1Njc4OSksIDAuMTIzNDU2Nzg5LCAnRmFpbGVkIHRlc3REb3VibGUgMicpCisgIGFzc2VydEVxdWFsKAorICAgICAgY2xpZW50OnRlc3REb3VibGUoMC4xMjM0NTY3ODkpLCAwLjEyMzQ1Njc4OSwgJ0ZhaWxlZCB0ZXN0RG91YmxlIDMnKQorCisgIC0tIFRPRE8gdGVzdEJpbmFyeSgpIC4uLgorCSAgCisgIC0tIEFjY3VyYWN5IG9mIDE2IGRlY2ltYWwgZGlnaXRzIChyb3VuZHMpCisgIGxvY2FsIGEsIGIgPSAxLjEyMzQ1Njc4OTA2NjY2NjYzLCAxLjEyMzQ1Njc4OTA2NjY2NjYxCisgIGFzc2VydEVxdWFsKGEsIGIpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0RG91YmxlKGEpLCBiLCAnRmFpbGVkIHRlc3REb3VibGUgNScpCisKKyAgLS0gU3RydWN0CisgIGxvY2FsIG8gPSBYdHJ1Y3Q6bmV3eworICAgIHN0cmluZ190aGluZyA9ICdaZXJvJywKKyAgICBieXRlX3RoaW5nID0gMSwKKyAgICBpMzJfdGhpbmcgPSAtMywKKyAgICBpNjRfdGhpbmcgPSBsb25nKC01KQorICB9CisgIGxvY2FsIHIgPSBjbGllbnQ6dGVzdFN0cnVjdChvKQorICBhc3NlcnRFcXVhbChvLnN0cmluZ190aGluZywgci5zdHJpbmdfdGhpbmcsICdGYWlsZWQgdGVzdFN0cnVjdCAxJykKKyAgYXNzZXJ0RXF1YWwoby5ieXRlX3RoaW5nLCByLmJ5dGVfdGhpbmcsICdGYWlsZWQgdGVzdFN0cnVjdCAyJykKKyAgYXNzZXJ0RXF1YWwoby5pMzJfdGhpbmcsIHIuaTMyX3RoaW5nLCAnRmFpbGVkIHRlc3RTdHJ1Y3QgMycpCisgIGFzc2VydEVxdWFsKG8uaTY0X3RoaW5nLCByLmk2NF90aGluZywgJ0ZhaWxlZCB0ZXN0U3RydWN0IDQnKQorCisgIC0tIFRPRE8gYWRkIGxpc3QgbWFwIHNldCBleGNlcHRpb24gZXRjIGV0YworZW5kCisKK3Rlc3RCYXNpY0NsaWVudChhcmcpCit0ZWFyZG93bigpCmRpZmYgLS1naXQgYS90ZXN0L2x1YS90ZXN0X2Jhc2ljX3NlcnZlci5sdWEgYi90ZXN0L2x1YS90ZXN0X2Jhc2ljX3NlcnZlci5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNkMmQ3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbHVhL3Rlc3RfYmFzaWNfc2VydmVyLmx1YQpAQCAtMCwwICsxLDE0MiBAQAorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3JlcXVpcmUoJ1RocmlmdFRlc3RfVGhyaWZ0VGVzdCcpCityZXF1aXJlKCdUU29ja2V0JykKK3JlcXVpcmUoJ1RCdWZmZXJlZFRyYW5zcG9ydCcpCityZXF1aXJlKCdURnJhbWVkVHJhbnNwb3J0JykKK3JlcXVpcmUoJ1RIdHRwVHJhbnNwb3J0JykKK3JlcXVpcmUoJ1RDb21wYWN0UHJvdG9jb2wnKQorcmVxdWlyZSgnVEpzb25Qcm90b2NvbCcpCityZXF1aXJlKCdUQmluYXJ5UHJvdG9jb2wnKQorcmVxdWlyZSgnVFNlcnZlcicpCityZXF1aXJlKCdsaWJsdWFsb25nbnVtYmVyJykKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIEhhbmRsZXIKK1Rlc3RIYW5kbGVyID0gVGhyaWZ0VGVzdElmYWNlOm5ld3t9CisKKy0tIFN0b3BzIHRoZSBzZXJ2ZXIKK2Z1bmN0aW9uIFRlc3RIYW5kbGVyOnRlc3RWb2lkKCkKK2VuZAorCitmdW5jdGlvbiBUZXN0SGFuZGxlcjp0ZXN0U3RyaW5nKHN0cikKKyAgcmV0dXJuIHN0cgorZW5kCisKK2Z1bmN0aW9uIFRlc3RIYW5kbGVyOnRlc3RCb29sKGJvb2wpCisgIHJldHVybiBib29sCitlbmQKKworZnVuY3Rpb24gVGVzdEhhbmRsZXI6dGVzdEJ5dGUoYnl0ZSkKKyAgcmV0dXJuIGJ5dGUKK2VuZAorCitmdW5jdGlvbiBUZXN0SGFuZGxlcjp0ZXN0STMyKGkzMikKKyAgcmV0dXJuIGkzMgorZW5kCisKK2Z1bmN0aW9uIFRlc3RIYW5kbGVyOnRlc3RJNjQoaTY0KQorICByZXR1cm4gaTY0CitlbmQKKworZnVuY3Rpb24gVGVzdEhhbmRsZXI6dGVzdERvdWJsZShkKQorICByZXR1cm4gZAorZW5kCisKK2Z1bmN0aW9uIFRlc3RIYW5kbGVyOnRlc3RCaW5hcnkoYnkpCisgIHJldHVybiBieQorZW5kCisKK2Z1bmN0aW9uIFRlc3RIYW5kbGVyOnRlc3RTdHJ1Y3QodGhpbmcpCisgIHJldHVybiB0aGluZworZW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBUZXN0Citsb2NhbCBzZXJ2ZXIKKworZnVuY3Rpb24gdGVhcmRvd24oKQorICBpZiBzZXJ2ZXIgdGhlbgorICAgIHNlcnZlcjpjbG9zZSgpCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIHBhcnNlQXJncyhyYXdBcmdzKQorICBsb2NhbCBvcHQgPSB7CisgICAgcHJvdG9jb2w9J2JpbmFyeScsCisgICAgdHJhbnNwb3J0PSdidWZmZXJlZCcsCisgICAgcG9ydD0nOTA5MCcsCisgIH0KKyAgZm9yIGksIHN0ciBpbiBwYWlycyhyYXdBcmdzKSBkbworICAgIGlmIGkgPiAwIHRoZW4KKyAgICAgIGssIHYgPSBzdHJpbmcubWF0Y2goc3RyLCAnLS0oJXcrKT0oJXcrKScpCisgICAgICBhc3NlcnQob3B0W2tdIH49IG5pbCwgJ1Vua25vd24gYXJndW1lbnQnKQorICAgICAgb3B0W2tdID0gdgorICAgIGVuZAorICBlbmQKKyAgcmV0dXJuIG9wdAorZW5kCisKK2Z1bmN0aW9uIHRlc3RCYXNpY1NlcnZlcihyYXdBcmdzKQorICBsb2NhbCBvcHQgPSBwYXJzZUFyZ3MocmF3QXJncykKKyAgLS0gSGFuZGxlciAmIFByb2Nlc3NvcgorICBsb2NhbCBoYW5kbGVyID0gVGVzdEhhbmRsZXI6bmV3e30KKyAgYXNzZXJ0KGhhbmRsZXIsICdGYWlsZWQgdG8gY3JlYXRlIGhhbmRsZXInKQorICBsb2NhbCBwcm9jZXNzb3IgPSBUaHJpZnRUZXN0UHJvY2Vzc29yOm5ld3sKKyAgICBoYW5kbGVyID0gaGFuZGxlcgorICB9CisgIGFzc2VydChwcm9jZXNzb3IsICdGYWlsZWQgdG8gY3JlYXRlIHByb2Nlc3NvcicpCisKKyAgLS0gU2VydmVyIFNvY2tldAorICBsb2NhbCBzb2NrZXQgPSBUU2VydmVyU29ja2V0Om5ld3sKKyAgICBwb3J0ID0gb3B0LnBvcnQKKyAgfQorICBhc3NlcnQoc29ja2V0LCAnRmFpbGVkIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0JykKKworICAtLSBUcmFuc3BvcnQgJiBGYWN0b3J5CisgIGxvY2FsIHRyYW5zcG9ydHMgPSB7CisgICAgYnVmZmVyZWQgPSBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5LAorICAgIGZyYW1lZCA9IFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5LAorICAgIGh0dHAgPSBUSHR0cFRyYW5zcG9ydEZhY3RvcnksCisgIH0KKyAgYXNzZXJ0KHRyYW5zcG9ydHNbb3B0LnRyYW5zcG9ydF0sICdGYWlsZWQgdG8gY3JlYXRlIGZyYW1lZCB0cmFuc3BvcnQgZmFjdG9yeScpCisgIGxvY2FsIHRyYW5zX2ZhY3RvcnkgPSB0cmFuc3BvcnRzW29wdC50cmFuc3BvcnRdOm5ld3t9CisgIGxvY2FsIHByb3RvY29scyA9IHsKKyAgICBiaW5hcnkgPSBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5LAorICAgIGNvbXBhY3QgPSBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSwKKyAgICBqc29uID0gVEpTT05Qcm90b2NvbEZhY3RvcnksCisgIH0KKyAgbG9jYWwgcHJvdF9mYWN0b3J5ID0gcHJvdG9jb2xzW29wdC5wcm90b2NvbF06bmV3e30KKyAgYXNzZXJ0KHByb3RfZmFjdG9yeSwgJ0ZhaWxlZCB0byBjcmVhdGUgYmluYXJ5IHByb3RvY29sIGZhY3RvcnknKQorCisgIC0tIFNpbXBsZSBTZXJ2ZXIKKyAgc2VydmVyID0gVFNpbXBsZVNlcnZlcjpuZXd7CisgICAgcHJvY2Vzc29yID0gcHJvY2Vzc29yLAorICAgIHNlcnZlclRyYW5zcG9ydCA9IHNvY2tldCwKKyAgICB0cmFuc3BvcnRGYWN0b3J5ID0gdHJhbnNfZmFjdG9yeSwKKyAgICBwcm90b2NvbEZhY3RvcnkgPSBwcm90X2ZhY3RvcnkKKyAgfQorICBhc3NlcnQoc2VydmVyLCAnRmFpbGVkIHRvIGNyZWF0ZSBzZXJ2ZXInKQorCisgIC0tIFNlcnZlCisgIHNlcnZlcjpzZXJ2ZSgpCisgIHNlcnZlciA9IG5pbAorZW5kCisKK3Rlc3RCYXNpY1NlcnZlcihhcmcpCit0ZWFyZG93bigpCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvQ2xpZW50Ly5naXRpZ25vcmUgYi90ZXN0L25ldGNvcmUvQ2xpZW50Ly5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkNTUxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDIgQEAKKyMgaWdub3JlIGZvciBhdXRvZ2VuZXJhdGVkIGZpbGVzCisvVGhyaWZ0VGVzdApkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL0NsaWVudC9DbGllbnQuY3Nwcm9qIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9DbGllbnQuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNmFmMzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvQ2xpZW50L0NsaWVudC5jc3Byb2oKQEAgLTAsMCArMSwzMSBAQAorPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+Q2xpZW50PC9Bc3NlbWJseU5hbWU+CisgICAgPFBhY2thZ2VJZD5DbGllbnQ8L1BhY2thZ2VJZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVRpdGxlQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlEZXNjcmlwdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5OZXQuSHR0cC5XaW5IdHRwSGFuZGxlciIgVmVyc2lvbj0iWzQuNCwpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uUHJpbWl0aXZlcyIgVmVyc2lvbj0iWzQuMywpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5TZXJ2aWNlTW9kZWwuUHJpbWl0aXZlcyIgVmVyc2lvbj0iWzQuNCwpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5UaHJlYWRpbmciIFZlcnNpb249Ils0LjMsKSIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXG5ldGNvcmVcVGhyaWZ0XFRocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8VGFyZ2V0IE5hbWU9IlByZUJ1aWxkIiBCZWZvcmVUYXJnZXRzPSJfR2VuZXJhdGVSZXN0b3JlUHJvamVjdFNwZWM7UmVzdG9yZTtDb21waWxlIj4KKyAgICA8RXhlYyBDb25kaXRpb249IickKE9TKScgPT0gJ1dpbmRvd3NfTlQnIiBDb21tYW5kPSJ3aGVyZSB0aHJpZnQiIENvbnNvbGVUb01TQnVpbGQ9InRydWUiPgorICAgICAgPE91dHB1dCBUYXNrUGFyYW1ldGVyPSJDb25zb2xlT3V0cHV0IiBQcm9wZXJ0eU5hbWU9IlBhdGhUb1RocmlmdCIgLz4KKyAgICA8L0V4ZWM+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUGF0aFRvVGhyaWZ0KScpIiBDb21tYW5kPSImcXVvdDskKFBhdGhUb1RocmlmdCkmcXVvdDsgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJ3RocmlmdCcpIiBDb21tYW5kPSJ0aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCcpIiBDb21tYW5kPSIkKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgIDwvVGFyZ2V0PgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL0NsaWVudC9Qcm9ncmFtLmNzIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9Qcm9ncmFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMTM5ZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvQ2xpZW50L1Byb2dyYW0uY3MKQEAgLTAsMCArMSw3MiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgVGhyaWZ0VGVzdDsKKworbmFtZXNwYWNlIENsaWVudAoreworICAgIHB1YmxpYyBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuU2V0QnVmZmVyU2l6ZShDb25zb2xlLkJ1ZmZlcldpZHRoLCA0MDk2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkZhaWxlZCB0byBncm93IHNjcm9sbC1iYWNrIGJ1ZmZlciIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzcGxpdCBtb2RlIGFuZCBvcHRpb25zCisgICAgICAgICAgICB2YXIgc3ViQXJncyA9IG5ldyBMaXN0PHN0cmluZz4oYXJncyk7CisgICAgICAgICAgICB2YXIgZmlyc3RBcmcgPSBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICBpZiAoc3ViQXJncy5Db3VudCA+IDApCisgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgIGZpcnN0QXJnID0gc3ViQXJnc1swXTsKKyAgICAgICAgICAgICAgICBzdWJBcmdzLlJlbW92ZUF0KDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBydW4gd2hhdGV2ZXIgbW9kZSBpcyBjaG9vc2VuCisgICAgICAgICAgICBzd2l0Y2goZmlyc3RBcmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAiY2xpZW50IjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRlc3RDbGllbnQuRXhlY3V0ZShzdWJBcmdzKTsKKyAgICAgICAgICAgICAgICBjYXNlICItLWhlbHAiOgorICAgICAgICAgICAgICAgICAgICBQcmludEhlbHAoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRIZWxwKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgUHJpbnRIZWxwKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzYWdlOiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgQ2xpZW50ICBjbGllbnQgIFtvcHRpb25zXSciKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIENsaWVudCAgLS1oZWxwIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiIik7CisKKyAgICAgICAgICAgIFRlc3RDbGllbnQuUHJpbnRPcHRpb25zSGVscCgpOworICAgICAgICB9CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90ZXN0L25ldGNvcmUvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NzE1MmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNDMgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIkNsaWVudCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KKworW2Fzc2VtYmx5OiBHdWlkKCJCMEMxM0RBMC0zMTE3LTQ4NDQtOEFFOC1CMTc3NUU0NjIyM0QiKV0KKwpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL0NsaWVudC9UZXN0Q2xpZW50LmNzIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9UZXN0Q2xpZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZTE5OGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvQ2xpZW50L1Rlc3RDbGllbnQuY3MKQEAgLTAsMCArMSw5NDMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkF1dGhlbnRpY2F0aW9uOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgU3lzdGVtLlNlcnZpY2VNb2RlbDsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7CisKK25hbWVzcGFjZSBUaHJpZnRUZXN0Cit7CisgICAgcHVibGljIGNsYXNzIFRlc3RDbGllbnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgY2xhc3MgVGVzdFBhcmFtcworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgaW50IG51bUl0ZXJhdGlvbnMgPSAxOworICAgICAgICAgICAgcHVibGljIElQQWRkcmVzcyBob3N0ID0gSVBBZGRyZXNzLkFueTsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgcG9ydCA9IDkwOTA7CisgICAgICAgICAgICBwdWJsaWMgaW50IG51bVRocmVhZHMgPSAxOworICAgICAgICAgICAgcHVibGljIHN0cmluZyB1cmw7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIHBpcGU7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBidWZmZXJlZDsKKyAgICAgICAgICAgIHB1YmxpYyBib29sIGZyYW1lZDsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgcHJvdG9jb2w7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBlbmNyeXB0ZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgaW50ZXJuYWwgdm9pZCBQYXJzZSggTGlzdDxzdHJpbmc+IGFyZ3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLkNvdW50OyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXSA9PSAiLXUiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBhcmdzWysraV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLW4iKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBudW1JdGVyYXRpb25zID0gQ29udmVydC5Ub0ludDMyKGFyZ3NbKytpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5TdGFydHNXaXRoKCItLXBpcGU9IikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpcGUgPSBhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIG5hbWVkIHBpcGVzIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uU3RhcnRzV2l0aCgiLS1ob3N0PSIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGVyZSBmb3IgaXBhZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICBob3N0ID0gbmV3IElQQWRkcmVzcyhFbmNvZGluZy5Vbmljb2RlLkdldEJ5dGVzKGFyZ3NbaV0uU3Vic3RyaW5nKGFyZ3NbaV0uSW5kZXhPZigiPSIpICsgMSkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLlN0YXJ0c1dpdGgoIi0tcG9ydD0iKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCA9IGludC5QYXJzZShhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItYiIgfHwgYXJnc1tpXSA9PSAiLS1idWZmZXJlZCIgfHwgYXJnc1tpXSA9PSAiLS10cmFuc3BvcnQ9YnVmZmVyZWQiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgYnVmZmVyZWQgc29ja2V0cyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1mIiB8fCBhcmdzW2ldID09ICItLWZyYW1lZCIgfHwgYXJnc1tpXSA9PSAiLS10cmFuc3BvcnQ9ZnJhbWVkIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBmcmFtZWQgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLXQiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBudW1UaHJlYWRzID0gQ29udmVydC5Ub0ludDMyKGFyZ3NbKytpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1iaW5hcnkiIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9YmluYXJ5IikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgPSAiYmluYXJ5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBiaW5hcnkgcHJvdG9jb2wiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWNvbXBhY3QiIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9Y29tcGFjdCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sID0gImNvbXBhY3QiOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGNvbXBhY3QgcHJvdG9jb2wiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWpzb24iIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9anNvbiIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sID0gImpzb24iOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIEpTT04gcHJvdG9jb2wiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXNzbCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgZW5jcnlwdGVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy90aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oYXJnc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIFg1MDlDZXJ0aWZpY2F0ZTIgR2V0Q2xpZW50Q2VydCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNsaWVudENlcnROYW1lID0gImNsaWVudC5wMTIiOworICAgICAgICAgICAgICAgIHZhciBwb3NzaWJsZVBhdGhzID0gbmV3IExpc3Q8c3RyaW5nPgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIi4uLy4uLy4uL2tleXMvIiwKKyAgICAgICAgICAgICAgICAgICAgIi4uLy4uL2tleXMvIiwKKyAgICAgICAgICAgICAgICAgICAgIi4uL2tleXMvIiwKKyAgICAgICAgICAgICAgICAgICAgImtleXMvIiwKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgc3RyaW5nIGV4aXN0aW5nUGF0aCA9IG51bGw7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBvc3NpYmxlUGF0aCBpbiBwb3NzaWJsZVBhdGhzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHBhdGggPSBQYXRoLkdldEZ1bGxQYXRoKHBvc3NpYmxlUGF0aCArIGNsaWVudENlcnROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEZpbGUuRXhpc3RzKHBhdGgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1BhdGggPSBwYXRoOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoZXhpc3RpbmdQYXRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oJCJDYW5ub3QgZmluZCBmaWxlOiB7Y2xpZW50Q2VydE5hbWV9Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdmFyIGNlcnQgPSBuZXcgWDUwOUNlcnRpZmljYXRlMihleGlzdGluZ1BhdGgsICJ0aHJpZnQiKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBjZXJ0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBwdWJsaWMgVENsaWVudFRyYW5zcG9ydCBDcmVhdGVUcmFuc3BvcnQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGVuZHBvaW50IHRyYW5zcG9ydAorICAgICAgICAgICAgICAgICAgICBUQ2xpZW50VHJhbnNwb3J0IHRyYW5zID0gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICBpZiAocGlwZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0KHBpcGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuY3J5cHRlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjZXJ0ID0gR2V0Q2xpZW50Q2VydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNlcnQgPT0gbnVsbCB8fCAhY2VydC5IYXNQcml2YXRlS2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkNlcnRpZmljYXRlIGRvZXNuJ3QgY29udGFpbiBwcml2YXRlIGtleSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0KGhvc3QsIHBvcnQsIDAsIGNlcnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VuZGVyLCBjZXJ0aWZpY2F0ZSwgY2hhaW4sIGVycm9ycykgPT4gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU3NsUHJvdG9jb2xzLlRscyB8IFNzbFByb3RvY29scy5UbHMxMSB8IFNzbFByb3RvY29scy5UbHMxMik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNvY2tldENsaWVudFRyYW5zcG9ydChob3N0LCBwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGxheWVyZWQgdHJhbnNwb3J0CisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXJlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVEJ1ZmZlcmVkQ2xpZW50VHJhbnNwb3J0KHRyYW5zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRGcmFtZWRDbGllbnRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEh0dHBDbGllbnRUcmFuc3BvcnQobmV3IFVyaSh1cmwpLCBudWxsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRQcm90b2NvbCBDcmVhdGVQcm90b2NvbChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zcG9ydCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2wgPT0gImNvbXBhY3QiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHByb3RvY29sID09ICJqc29uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEpzb25Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yQmFzZVR5cGVzID0gMTsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JTdHJ1Y3RzID0gMjsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JDb250YWluZXJzID0gNDsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JFeGNlcHRpb25zID0gODsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JVbmtub3duID0gNjQ7CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBDbGllbnRUZXN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVENsaWVudFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRocmlmdFRlc3QuQ2xpZW50IGNsaWVudDsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IG51bUl0ZXJhdGlvbnM7CisgICAgICAgICAgICBwcml2YXRlIGJvb2wgZG9uZTsKKworICAgICAgICAgICAgcHVibGljIGludCBSZXR1cm5Db2RlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICAgICAgcHVibGljIENsaWVudFRlc3QoVGVzdFBhcmFtcyBwYXJhbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBwYXJhbS5DcmVhdGVUcmFuc3BvcnQoKTsKKyAgICAgICAgICAgICAgICBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5DbGllbnQocGFyYW0uQ3JlYXRlUHJvdG9jb2wodHJhbnNwb3J0KSk7CisgICAgICAgICAgICAgICAgbnVtSXRlcmF0aW9ucyA9IHBhcmFtLm51bUl0ZXJhdGlvbnM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIEV4ZWN1dGUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLk5vbmU7CisKKyAgICAgICAgICAgICAgICBpZiAoZG9uZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFeGVjdXRlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSIpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtSXRlcmF0aW9uczsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNwb3J0LklzT3BlbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuT3BlbkFzeW5jKHRva2VuKS5HZXRBd2FpdGVyKCkuR2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNvbm5lY3QgZmFpbGVkOiAiICsgZXguTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5Db2RlIHw9IEVycm9yVW5rbm93bjsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDb25uZWN0IGZhaWxlZDogIiArIGV4Lk1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFcnJvclVua25vd247CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFeGVjdXRlQ2xpZW50VGVzdEFzeW5jKGNsaWVudCkuR2V0QXdhaXRlcigpLkdldFJlc3VsdCgpOyA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFcnJvclVua25vd247CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFcnJvciB3aGlsZSBjbG9zaW5nIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIFByaW50T3B0aW9uc0hlbHAoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQ2xpZW50IG9wdGlvbnM6Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtdSA8VVJMPiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLXQgPCMgb2YgdGhyZWFkcyB0byBydW4+ICAgICAgICBkZWZhdWx0ID0gMSIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLW4gPCMgb2YgaXRlcmF0aW9ucz4gICAgICAgICAgICBwZXIgdGhyZWFkIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXBpcGU9PHBpcGUgbmFtZT4iKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0taG9zdD08SVAgYWRkcmVzcz4iKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tcG9ydD08cG9ydCBudW1iZXI+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXRyYW5zcG9ydD08dHJhbnNwb3J0IG5hbWU+ICAgIG9uZSBvZiBidWZmZXJlZCxmcmFtZWQgIChkZWZhdWx0cyB0byBub25lKSIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1wcm90b2NvbD08cHJvdG9jb2wgbmFtZT4gICAgICBvbmUgb2YgY29tcGFjdCxqc29uICAoZGVmYXVsdHMgdG8gYmluYXJ5KSIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1zc2wiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBFeGVjdXRlKExpc3Q8c3RyaW5nPiBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcGFyYW0gPSBuZXcgVGVzdFBhcmFtcygpOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwYXJhbS5QYXJzZShhcmdzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXJyb3Igd2hpbGUgIHBhcnNpbmcgYXJndW1lbnRzIik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFcnJvclVua25vd247CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIHRlc3RzID0gRW51bWVyYWJsZS5SYW5nZSgwLCBwYXJhbS5udW1UaHJlYWRzKS5TZWxlY3QoXyA9PiBuZXcgQ2xpZW50VGVzdChwYXJhbSkpLlRvQXJyYXkoKTsKKworICAgICAgICAgICAgICAgIC8vaXNzdWUgdGVzdHMgb24gc2VwYXJhdGUgdGhyZWFkcyBzaW11bHRhbmVvdXNseQorICAgICAgICAgICAgICAgIHZhciB0aHJlYWRzID0gdGVzdHMuU2VsZWN0KHRlc3QgPT4gbmV3IFRhc2sodGVzdC5FeGVjdXRlKSkuVG9BcnJheSgpOworICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IERhdGVUaW1lLk5vdzsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiB0aHJlYWRzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdC5TdGFydCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFRhc2suV2FpdEFsbCh0aHJlYWRzKTsKKworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJUb3RhbCB0aW1lOiAiICsgKERhdGVUaW1lLk5vdyAtIHN0YXJ0KSk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGVzdHMuU2VsZWN0KHQgPT4gdC5SZXR1cm5Db2RlKS5BZ2dyZWdhdGUoKHIxLCByMikgPT4gcjEgfCByMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIG91dGVyRXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVuZXhwZWN0ZWQgZXJyb3IiKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShvdXRlckV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgb3V0ZXJFeC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JVbmtub3duOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgQnl0ZXNUb0hleChieXRlW10gZGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5Ub1N0cmluZyhkYXRhKS5SZXBsYWNlKCItIiwgc3RyaW5nLkVtcHR5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIFByZXBhcmVUZXN0RGF0YShib29sIHJhbmRvbURpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXR2YWwgPSBuZXcgYnl0ZVsweDEwMF07CisgICAgICAgICAgICB2YXIgaW5pdExlbiA9IE1hdGguTWluKDB4MTAwLCByZXR2YWwuTGVuZ3RoKTsKKworICAgICAgICAgICAgLy8gbGluZWFyIGRpc3RyaWJ1dGlvbiwgdW5sZXNzIHJhbmRvbSBpcyByZXF1ZXN0ZWQKKyAgICAgICAgICAgIGlmICghcmFuZG9tRGlzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRMZW47ICsraSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbFtpXSA9IChieXRlKWk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJhbmRvbSBkaXN0cmlidXRpb24KKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdExlbjsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHZhbFtpXSA9IChieXRlKTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgcm5kID0gbmV3IFJhbmRvbSgpOworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBpbml0TGVuOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dFBvcyA9IHJuZC5OZXh0KCkgJSBpbml0TGVuOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsW25leHRQb3NdID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbFtuZXh0UG9zXSA9IChieXRlKWk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIFRhc2s8aW50PiBFeGVjdXRlQ2xpZW50VGVzdEFzeW5jKFRocmlmdFRlc3QuQ2xpZW50IGNsaWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTsKKyAgICAgICAgICAgIHZhciByZXR1cm5Db2RlID0gMDsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFZvaWQoKSIpOworICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RWb2lkQXN5bmModG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHZvaWQiKTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKKyAgICAgICAgICAgIHZhciBzID0gYXdhaXQgY2xpZW50LnRlc3RTdHJpbmdBc3luYygiVGVzdCIsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSBcIiIgKyBzICsgIlwiIik7CisgICAgICAgICAgICBpZiAoIlRlc3QiICE9IHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJvb2wodHJ1ZSkiKTsKKyAgICAgICAgICAgIHZhciB0ID0gYXdhaXQgY2xpZW50LnRlc3RCb29sQXN5bmMoKGJvb2wpdHJ1ZSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyB0KTsKKyAgICAgICAgICAgIGlmICghdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJvb2woZmFsc2UpIik7CisgICAgICAgICAgICB2YXIgZiA9IGF3YWl0IGNsaWVudC50ZXN0Qm9vbEFzeW5jKChib29sKWZhbHNlLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGYpOworICAgICAgICAgICAgaWYgKGYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJ5dGUoMSkiKTsKKyAgICAgICAgICAgIHZhciBpOCA9IGF3YWl0IGNsaWVudC50ZXN0Qnl0ZUFzeW5jKChzYnl0ZSkxLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGk4KTsKKyAgICAgICAgICAgIGlmICgxICE9IGk4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RJMzIoLTEpIik7CisgICAgICAgICAgICB2YXIgaTMyID0gYXdhaXQgY2xpZW50LnRlc3RJMzJBc3luYygtMSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpMzIpOworICAgICAgICAgICAgaWYgKC0xICE9IGkzMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKKyAgICAgICAgICAgIHZhciBpNjQgPSBhd2FpdCBjbGllbnQudGVzdEk2NEFzeW5jKC0zNDM1OTczODM2OCwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpNjQpOworICAgICAgICAgICAgaWYgKC0zNDM1OTczODM2OCAhPSBpNjQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdERvdWJsZSg1LjMyNTA5ODIzNSkiKTsKKyAgICAgICAgICAgIHZhciBkdWIgPSBhd2FpdCBjbGllbnQudGVzdERvdWJsZUFzeW5jKDUuMzI1MDk4MjM1LCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGR1Yik7CisgICAgICAgICAgICBpZiAoNS4zMjUwOTgyMzUgIT0gZHViKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RG91YmxlKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSkiKTsKKyAgICAgICAgICAgIGR1YiA9IGF3YWl0IGNsaWVudC50ZXN0RG91YmxlQXN5bmMoLTAuMDAwMzQxMDEyNDM5NjM4NTk4Mjc5LCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGR1Yik7CisgICAgICAgICAgICBpZiAoLTAuMDAwMzQxMDEyNDM5NjM4NTk4Mjc5ICE9IGR1YikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYmluT3V0ID0gUHJlcGFyZVRlc3REYXRhKHRydWUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJpbmFyeSgiICsgQnl0ZXNUb0hleChiaW5PdXQpICsgIikiKTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBiaW5JbiA9IGF3YWl0IGNsaWVudC50ZXN0QmluYXJ5QXN5bmMoYmluT3V0LCB0b2tlbik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBCeXRlc1RvSGV4KGJpbkluKSk7CisgICAgICAgICAgICAgICAgaWYgKGJpbkluLkxlbmd0aCAhPSBiaW5PdXQuTGVuZ3RoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAodmFyIG9mcyA9IDA7IG9mcyA8IE1hdGguTWluKGJpbkluLkxlbmd0aCwgYmluT3V0Lkxlbmd0aCk7ICsrb2ZzKQorICAgICAgICAgICAgICAgICAgICBpZiAoYmluSW5bb2ZzXSAhPSBiaW5PdXRbb2ZzXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGJpbmFyeSBlcXVhbHM/IG9ubHkgd2l0aCBoYXNoY29kZSBvcHRpb24gZW5hYmxlZCAuLi4KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJUZXN0IENyYXp5TmVzdGluZyIpOworICAgICAgICAgICAgdmFyIG9uZSA9IG5ldyBDcmF6eU5lc3RpbmcoKTsKKyAgICAgICAgICAgIHZhciB0d28gPSBuZXcgQ3JhenlOZXN0aW5nKCk7CisgICAgICAgICAgICBvbmUuU3RyaW5nX2ZpZWxkID0gImNyYXp5IjsKKyAgICAgICAgICAgIHR3by5TdHJpbmdfZmllbGQgPSAiY3JhenkiOworICAgICAgICAgICAgb25lLkJpbmFyeV9maWVsZCA9IG5ldyBieXRlW10geyAweDAwLCAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLCAweEZGIH07CisgICAgICAgICAgICB0d28uQmluYXJ5X2ZpZWxkID0gbmV3IGJ5dGVbMTBdIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHhGRiB9OworICAgICAgICAgICAgaWYgKHR5cGVvZihDcmF6eU5lc3RpbmcpLkdldE1ldGhvZCgiRXF1YWxzIik/LkRlY2xhcmluZ1R5cGUgPT0gdHlwZW9mKENyYXp5TmVzdGluZykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFvbmUuRXF1YWxzKHR3bykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckNvbnRhaW5lcnM7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkNyYXp5TmVzdGluZy5FcXVhbHMgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0U3RydWN0KHtcIlplcm9cIiwgMSwgLTMsIC01fSkiKTsKKyAgICAgICAgICAgIHZhciBvID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgICAgby5TdHJpbmdfdGhpbmcgPSAiWmVybyI7CisgICAgICAgICAgICBvLkJ5dGVfdGhpbmcgPSAoc2J5dGUpMTsKKyAgICAgICAgICAgIG8uSTMyX3RoaW5nID0gLTM7CisgICAgICAgICAgICBvLkk2NF90aGluZyA9IC01OworICAgICAgICAgICAgdmFyIGkgPSBhd2FpdCBjbGllbnQudGVzdFN0cnVjdEFzeW5jKG8sIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB7XCIiICsgaS5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyBpLkJ5dGVfdGhpbmcgKyAiLCAiICsgaS5JMzJfdGhpbmcgKyAiLCAiICsgaS5JNjRfdGhpbmcgKyAifSIpOworCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TmVzdCh7MSwge1wiWmVyb1wiLCAxLCAtMywgLTV9LCA1fSkiKTsKKyAgICAgICAgICAgIHZhciBvMiA9IG5ldyBYdHJ1Y3QyKCk7CisgICAgICAgICAgICBvMi5CeXRlX3RoaW5nID0gKHNieXRlKTE7CisgICAgICAgICAgICBvMi5TdHJ1Y3RfdGhpbmcgPSBvOworICAgICAgICAgICAgbzIuSTMyX3RoaW5nID0gNTsKKyAgICAgICAgICAgIHZhciBpMiA9IGF3YWl0IGNsaWVudC50ZXN0TmVzdEFzeW5jKG8yLCB0b2tlbik7CisgICAgICAgICAgICBpID0gaTIuU3RydWN0X3RoaW5nOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHsiICsgaTIuQnl0ZV90aGluZyArICIsIHtcIiIgKyBpLlN0cmluZ190aGluZyArICJcIiwgIiArIGkuQnl0ZV90aGluZyArICIsICIgKyBpLkkzMl90aGluZyArICIsICIgKyBpLkk2NF90aGluZyArICJ9LCAiICsgaTIuSTMyX3RoaW5nICsgIn0iKTsKKworICAgICAgICAgICAgdmFyIG1hcG91dCA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOworICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCA1OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWFwb3V0W2pdID0gaiAtIDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdE1hcCh7Iik7CisgICAgICAgICAgICB2YXIgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGtleSBpbiBtYXBvdXQuS2V5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4gIiArIG1hcG91dFtrZXldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0pIik7CisKKyAgICAgICAgICAgIHZhciBtYXBpbiA9IGF3YWl0IGNsaWVudC50ZXN0TWFwQXN5bmMobWFwb3V0LCB0b2tlbik7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrZXkgaW4gbWFwaW4uS2V5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4gIiArIG1hcGluW2tleV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgdmFyIGxpc3RvdXQgPSBuZXcgTGlzdDxpbnQ+KCk7CisgICAgICAgICAgICBmb3IgKHZhciBqID0gLTI7IGogPCAzOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGlzdG91dC5BZGQoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TGlzdCh7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgaiBpbiBsaXN0b3V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9KSIpOworCisgICAgICAgICAgICB2YXIgbGlzdGluID0gYXdhaXQgY2xpZW50LnRlc3RMaXN0QXN5bmMobGlzdG91dCwgdG9rZW4pOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgaiBpbiBsaXN0aW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIC8vc2V0CisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICB2YXIgc2V0b3V0ID0gbmV3IFRIYXNoU2V0PGludD4oKTsKKyAgICAgICAgICAgIGZvciAodmFyIGogPSAtMjsgaiA8IDM7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXRvdXQuQWRkKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFNldCh7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQgaiBpbiBzZXRvdXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0pIik7CisKKyAgICAgICAgICAgIHZhciBzZXRpbiA9IGF3YWl0IGNsaWVudC50ZXN0U2V0QXN5bmMoc2V0b3V0LCB0b2tlbik7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBqIGluIHNldGluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKE9ORSkiKTsKKyAgICAgICAgICAgIHZhciByZXQgPSBhd2FpdCBjbGllbnQudGVzdEVudW1Bc3luYyhOdW1iZXJ6Lk9ORSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouT05FICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oVFdPKSIpOworICAgICAgICAgICAgcmV0ID0gYXdhaXQgY2xpZW50LnRlc3RFbnVtQXN5bmMoTnVtYmVyei5UV08sIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6LlRXTyAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKFRIUkVFKSIpOworICAgICAgICAgICAgcmV0ID0gYXdhaXQgY2xpZW50LnRlc3RFbnVtQXN5bmMoTnVtYmVyei5USFJFRSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouVEhSRUUgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShGSVZFKSIpOworICAgICAgICAgICAgcmV0ID0gYXdhaXQgY2xpZW50LnRlc3RFbnVtQXN5bmMoTnVtYmVyei5GSVZFLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5GSVZFICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oRUlHSFQpIik7CisgICAgICAgICAgICByZXQgPSBhd2FpdCBjbGllbnQudGVzdEVudW1Bc3luYyhOdW1iZXJ6LkVJR0hULCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5FSUdIVCAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiKTsKKyAgICAgICAgICAgIHZhciB1aWQgPSBhd2FpdCBjbGllbnQudGVzdFR5cGVkZWZBc3luYygzMDk4NTgyMzUwODI1MjNMLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHVpZCk7CisgICAgICAgICAgICBpZiAoMzA5ODU4MjM1MDgyNTIzTCAhPSB1aWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RNYXBNYXAoMSkiKTsKKyAgICAgICAgICAgIHZhciBtbSA9IGF3YWl0IGNsaWVudC50ZXN0TWFwTWFwQXN5bmMoMSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGtleSBpbiBtbS5LZXlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiB7Iik7CisgICAgICAgICAgICAgICAgdmFyIG0yID0gbW1ba2V5XTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgazIgaW4gbTIuS2V5cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoazIgKyAiID0+ICIgKyBtMltrMl0gKyAiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICB2YXIgaW5zYW5lID0gbmV3IEluc2FuaXR5KCk7CisgICAgICAgICAgICBpbnNhbmUuVXNlck1hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIGxvbmc+KCk7CisgICAgICAgICAgICBpbnNhbmUuVXNlck1hcFtOdW1iZXJ6LkZJVkVdID0gNTAwMEw7CisgICAgICAgICAgICB2YXIgdHJ1Y2sgPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgICB0cnVjay5TdHJpbmdfdGhpbmcgPSAiVHJ1Y2siOworICAgICAgICAgICAgdHJ1Y2suQnl0ZV90aGluZyA9IChzYnl0ZSk4OworICAgICAgICAgICAgdHJ1Y2suSTMyX3RoaW5nID0gODsKKyAgICAgICAgICAgIHRydWNrLkk2NF90aGluZyA9IDg7CisgICAgICAgICAgICBpbnNhbmUuWHRydWN0cyA9IG5ldyBMaXN0PFh0cnVjdD4oKTsKKyAgICAgICAgICAgIGluc2FuZS5YdHJ1Y3RzLkFkZCh0cnVjayk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0SW5zYW5pdHkoKSIpOworICAgICAgICAgICAgdmFyIHdob2EgPSBhd2FpdCBjbGllbnQudGVzdEluc2FuaXR5QXN5bmMoaW5zYW5lLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIga2V5IGluIHdob2EuS2V5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdmFsID0gd2hvYVtrZXldOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiB7Iik7CisKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgazIgaW4gdmFsLktleXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgdjIgPSB2YWxbazJdOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoazIgKyAiID0+IHsiKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHVzZXJNYXAgPSB2Mi5Vc2VyTWFwOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXJNYXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGszIGluIHVzZXJNYXAuS2V5cykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGszICsgIiA9PiAiICsgdXNlck1hcFtrM10gKyAiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIm51bGwiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgeHRydWN0cyA9IHYyLlh0cnVjdHM7CisKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgieyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoeHRydWN0cyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgeCBpbiB4dHJ1Y3RzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIntcIiIgKyB4LlN0cmluZ190aGluZyArICJcIiwgIiArIHguQnl0ZV90aGluZyArICIsICIgKyB4LkkzMl90aGluZyArICIsICIgKyB4LkkzMl90aGluZyArICJ9LCAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIm51bGwiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9Iik7CisKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworICAgICAgICAgICAgc2J5dGUgYXJnMCA9IDE7CisgICAgICAgICAgICB2YXIgYXJnMSA9IDI7CisgICAgICAgICAgICB2YXIgYXJnMiA9IGxvbmcuTWF4VmFsdWU7CisgICAgICAgICAgICB2YXIgbXVsdGlEaWN0ID0gbmV3IERpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4oKTsKKyAgICAgICAgICAgIG11bHRpRGljdFsxXSA9ICJvbmUiOworCisgICAgICAgICAgICB2YXIgdG1wTXVsdGlEaWN0ID0gbmV3IExpc3Q8c3RyaW5nPigpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhaXIgaW4gbXVsdGlEaWN0KQorICAgICAgICAgICAgICAgIHRtcE11bHRpRGljdC5BZGQocGFpci5LZXkgKyIgPT4gIisgcGFpci5WYWx1ZSk7CisKKyAgICAgICAgICAgIHZhciBhcmc0ID0gTnVtYmVyei5GSVZFOworICAgICAgICAgICAgbG9uZyBhcmc1ID0gNTAwMDAwMDsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIlRlc3QgTXVsdGkoIiArIGFyZzAgKyAiLCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIseyIgKyBzdHJpbmcuSm9pbigiLCIsIHRtcE11bHRpRGljdCkgKyAifSwiICsgYXJnNCArICIsIiArIGFyZzUgKyAiKSIpOworICAgICAgICAgICAgdmFyIG11bHRpUmVzcG9uc2UgPSBhd2FpdCBjbGllbnQudGVzdE11bHRpQXN5bmMoYXJnMCwgYXJnMSwgYXJnMiwgbXVsdGlEaWN0LCBhcmc0LCBhcmc1LCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSBYdHJ1Y3QoYnl0ZV90aGluZzoiICsgbXVsdGlSZXNwb25zZS5CeXRlX3RoaW5nICsgIixTdHJpbmdfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuU3RyaW5nX3RoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgIixpMzJfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuSTMyX3RoaW5nICsgIixpNjRfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuSTY0X3RoaW5nICsgIilcbiIpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEV4Y2VwdGlvbihcIlhjZXB0aW9uXCIpIik7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RFeGNlcHRpb25Bc3luYygiWGNlcHRpb24iLCB0b2tlbik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoWGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4LkVycm9yQ29kZSAhPSAxMDAxIHx8IGV4Lk1lc3NhZ2UgIT0gIlhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEV4Y2VwdGlvbihcIlRFeGNlcHRpb25cIikiKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQudGVzdEV4Y2VwdGlvbkFzeW5jKCJURXhjZXB0aW9uIiwgdG9rZW4pOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRocmlmdC5URXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE9LCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEV4Y2VwdGlvbihcIm9rXCIpIik7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RFeGNlcHRpb25Bc3luYygib2siLCB0b2tlbik7CisgICAgICAgICAgICAgICAgLy8gT0sKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uXCIsIC4uLikiKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uQXN5bmMoIlhjZXB0aW9uIiwgImlnbm9yZSIsIHRva2VuKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYY2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZXguRXJyb3JDb2RlICE9IDEwMDEgfHwgZXguTWVzc2FnZSAhPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uMlwiLCAuLi4pIik7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbkFzeW5jKCJYY2VwdGlvbjIiLCAiaWdub3JlIiwgdG9rZW4pOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFhjZXB0aW9uMiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZXguRXJyb3JDb2RlICE9IDIwMDIgfHwgZXguU3RydWN0X3RoaW5nLlN0cmluZ190aGluZyAhPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oXCJzdWNjZXNzXCIsIFwiT0tcIikiKTsKKyAgICAgICAgICAgICAgICBpZiAoIk9LIiAhPSAoYXdhaXQgY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbkFzeW5jKCJzdWNjZXNzIiwgIk9LIiwgdG9rZW4pKS5TdHJpbmdfdGhpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgc3cgPSBuZXcgU3RvcHdhdGNoKCk7CisgICAgICAgICAgICBzdy5TdGFydCgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlRlc3QgT25ld2F5KDEpIik7CisgICAgICAgICAgICBhd2FpdCBjbGllbnQudGVzdE9uZXdheUFzeW5jKDEsIHRva2VuKTsKKyAgICAgICAgICAgIHN3LlN0b3AoKTsKKyAgICAgICAgICAgIGlmIChzdy5FbGFwc2VkTWlsbGlzZWNvbmRzID4gMTAwMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJUZXN0IENhbGx0aW1lKCkiKTsKKyAgICAgICAgICAgIHZhciB0aW1lcyA9IDUwOworICAgICAgICAgICAgc3cuUmVzZXQoKTsKKyAgICAgICAgICAgIHN3LlN0YXJ0KCk7CisgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRpbWVzOyArK2spCisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RWb2lkQXN5bmModG9rZW4pOworICAgICAgICAgICAgc3cuU3RvcCgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHswfSBtcyBhIHRlc3RWb2lkKCkgY2FsbCIsIHN3LkVsYXBzZWRNaWxsaXNlY29uZHMgLyB0aW1lcyk7CisgICAgICAgICAgICByZXR1cm4gcmV0dXJuQ29kZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9NYWtlZmlsZS5hbSBiL3Rlc3QvbmV0Y29yZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzZmZmI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0gLiAKKworYWxsLWxvY2FsOgorCSQoRE9UTkVUQ09SRSkgYnVpbGQKKworcHJlY3Jvc3M6CisJJChET1RORVRDT1JFKSBidWlsZAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBDbGllbnQvYmluCisJJChSTSkgLXIgU2VydmVyL2JpbgorCSQoUk0pIC1yIENsaWVudC9vYmoKKwkkKFJNKSAtciBTZXJ2ZXIvb2JqCisJJChSTSkgLXIgVGhyaWZ0VGVzdC9UaHJpZnRUZXN0CisKK0VYVFJBX0RJU1QgPSBcCisJQ2xpZW50IFwKKwlSRUFETUUubWQgXAorCVNlcnZlciBcCisJVGhyaWZ0VGVzdC5zbG4gXAorCWJ1aWxkLmNtZCBcCisJYnVpbGQuc2gKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9SRUFETUUubWQgYi90ZXN0L25ldGNvcmUvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNzI4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjAgQEAKKyMgQXBhY2hlIFRocmlmdCBuZXQtY29yZS1saWIgdGVzdHMKKworVGVzdHMgZm9yIFRocmlmdCBjbGllbnQgbGlicmFyeSBwb3J0ZWQgdG8gTWljcm9zb2Z0IC5OZXQgQ29yZSAKKworIyBDb250ZW50CistIFRocmlmdFRlc3QgLSB0ZXN0cyBmb3IgVGhyaWZ0IGxpYnJhcnkgCisKKyMgUmV1c2VkIGNvbXBvbmVudHMgCistIE5FVCBDb3JlIFN0YW5kYXJkIDEuNiAoU0RLIDIuMC4wKQorCisjIEhvdyB0byBidWlsZCBvbiBXaW5kb3dzCistIEdldCBUaHJpZnQgSURMIGNvbXBpbGVyIGV4ZWN1dGFibGUsIGFkZCB0byBzb21lIGZvbGRlciBhbmQgYWRkIHBhdGggdG8gdGhpcyBmb2xkZXIgaW50byBQQVRIIHZhcmlhYmxlCistIE9wZW4gVGhyaWZ0VGVzdC5zbG4gaW4gVmlzdWFsIFN0dWRpbyBhbmQgYnVpbGQKK29yIAorLSBCdWlsZCB3aXRoIHNjcmlwdHMKKworIyBIb3cgdG8gYnVpbGQgb24gVW5peAorLSBFbnN1cmUgeW91IGhhdmUgLk5FVCBDb3JlIDIuMC4wIFNESyBpbnN0YWxsZWQgb3IgdXNlIHRoZSBVYnVudHUgWGVuaWFsIGRvY2tlciBpbWFnZQorLSBGb2xsb3cgY29tbW9uIGJ1aWxkIHByYWN0aWNlIGZvciBUaHJpZnQ6IGJvb3RzdHJhcCwgY29uZmlndXJlLCBhbmQgbWFrZSBwcmVjcm9zcworCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvU2VydmVyLy5naXRpZ25vcmUgYi90ZXN0L25ldGNvcmUvU2VydmVyLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkNTUxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDIgQEAKKyMgaWdub3JlIGZvciBhdXRvZ2VuZXJhdGVkIGZpbGVzCisvVGhyaWZ0VGVzdApkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL1NlcnZlci9Qcm9ncmFtLmNzIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9Qcm9ncmFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NDdlNWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvU2VydmVyL1Byb2dyYW0uY3MKQEAgLTAsMCArMSw3MiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgVGhyaWZ0VGVzdDsKKworbmFtZXNwYWNlIFNlcnZlcgoreworICAgIHB1YmxpYyBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuU2V0QnVmZmVyU2l6ZShDb25zb2xlLkJ1ZmZlcldpZHRoLCA0MDk2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkZhaWxlZCB0byBncm93IHNjcm9sbC1iYWNrIGJ1ZmZlciIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzcGxpdCBtb2RlIGFuZCBvcHRpb25zCisgICAgICAgICAgICB2YXIgc3ViQXJncyA9IG5ldyBMaXN0PHN0cmluZz4oYXJncyk7CisgICAgICAgICAgICB2YXIgZmlyc3RBcmcgPSBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICBpZiAoc3ViQXJncy5Db3VudCA+IDApCisgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgIGZpcnN0QXJnID0gc3ViQXJnc1swXTsKKyAgICAgICAgICAgICAgICBzdWJBcmdzLlJlbW92ZUF0KDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBydW4gd2hhdGV2ZXIgbW9kZSBpcyBjaG9vc2VuCisgICAgICAgICAgICBzd2l0Y2goZmlyc3RBcmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAic2VydmVyIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRlc3RTZXJ2ZXIuRXhlY3V0ZShzdWJBcmdzKTsKKyAgICAgICAgICAgICAgICBjYXNlICItLWhlbHAiOgorICAgICAgICAgICAgICAgICAgICBQcmludEhlbHAoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRIZWxwKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgUHJpbnRIZWxwKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzYWdlOiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgU2VydmVyICBzZXJ2ZXIgIFtvcHRpb25zXSciKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIFNlcnZlciAgLS1oZWxwIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiIik7CisKKyAgICAgICAgICAgIFRlc3RTZXJ2ZXIuUHJpbnRPcHRpb25zSGVscCgpOworICAgICAgICB9CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90ZXN0L25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NTQ5NWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNDMgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlNlcnZlciIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KKworW2Fzc2VtYmx5OiBHdWlkKCJCMEMxM0RBMC0zMTE3LTQ4NDQtOEFFOC1CMTc3NUU0NjIyM0QiKV0KKwpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL1NlcnZlci9TZXJ2ZXIuY3Nwcm9qIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9TZXJ2ZXIuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmOWI0YjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvU2VydmVyL1NlcnZlci5jc3Byb2oKQEAgLTAsMCArMSwzMSBAQAor77u/PFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+U2VydmVyPC9Bc3NlbWJseU5hbWU+CisgICAgPFBhY2thZ2VJZD5TZXJ2ZXI8L1BhY2thZ2VJZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVRpdGxlQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlEZXNjcmlwdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5OZXQuSHR0cC5XaW5IdHRwSGFuZGxlciIgVmVyc2lvbj0iWzQuNCwpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uUHJpbWl0aXZlcyIgVmVyc2lvbj0iWzQuMywpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5TZXJ2aWNlTW9kZWwuUHJpbWl0aXZlcyIgVmVyc2lvbj0iWzQuNCwpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5UaHJlYWRpbmciIFZlcnNpb249Ils0LjMsKSIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXG5ldGNvcmVcVGhyaWZ0XFRocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8VGFyZ2V0IE5hbWU9IlByZUJ1aWxkIiBCZWZvcmVUYXJnZXRzPSJfR2VuZXJhdGVSZXN0b3JlUHJvamVjdFNwZWM7UmVzdG9yZTtDb21waWxlIj4KKyAgICA8RXhlYyBDb25kaXRpb249IickKE9TKScgPT0gJ1dpbmRvd3NfTlQnIiBDb21tYW5kPSJ3aGVyZSB0aHJpZnQiIENvbnNvbGVUb01TQnVpbGQ9InRydWUiPgorICAgICAgPE91dHB1dCBUYXNrUGFyYW1ldGVyPSJDb25zb2xlT3V0cHV0IiBQcm9wZXJ0eU5hbWU9IlBhdGhUb1RocmlmdCIgLz4KKyAgICA8L0V4ZWM+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUGF0aFRvVGhyaWZ0KScpIiBDb21tYW5kPSImcXVvdDskKFBhdGhUb1RocmlmdCkmcXVvdDsgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJ3RocmlmdCcpIiBDb21tYW5kPSJ0aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCcpIiBDb21tYW5kPSIkKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgIDwvVGFyZ2V0PgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvVGVzdFNlcnZlci5jcyBiL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvVGVzdFNlcnZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmQzMzM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9UZXN0U2VydmVyLmNzCkBAIC0wLDAgKzEsNTk0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nOwordXNpbmcgVGhyaWZ0OwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzLlNlcnZlcjsKKworbmFtZXNwYWNlIFRocmlmdFRlc3QKK3sKKyAgICBpbnRlcm5hbCBjbGFzcyBTZXJ2ZXJQYXJhbQorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMgPSBmYWxzZTsKKyAgICAgICAgaW50ZXJuYWwgYm9vbCB1c2VGcmFtZWQgPSBmYWxzZTsKKyAgICAgICAgaW50ZXJuYWwgYm9vbCB1c2VFbmNyeXB0aW9uID0gZmFsc2U7CisgICAgICAgIGludGVybmFsIGJvb2wgY29tcGFjdCA9IGZhbHNlOworICAgICAgICBpbnRlcm5hbCBib29sIGpzb24gPSBmYWxzZTsKKyAgICAgICAgaW50ZXJuYWwgaW50IHBvcnQgPSA5MDkwOworICAgICAgICBpbnRlcm5hbCBzdHJpbmcgcGlwZSA9IG51bGw7CisKKyAgICAgICAgaW50ZXJuYWwgdm9pZCBQYXJzZShMaXN0PHN0cmluZz4gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLkNvdW50OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0uU3RhcnRzV2l0aCgiLS1waXBlPSIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGlwZSA9IGFyZ3NbaV0uU3Vic3RyaW5nKGFyZ3NbaV0uSW5kZXhPZigiPSIpICsgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uU3RhcnRzV2l0aCgiLS1wb3J0PSIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG9ydCA9IGludC5QYXJzZShhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWIiIHx8IGFyZ3NbaV0gPT0gIi0tYnVmZmVyZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWJ1ZmZlcmVkIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVzZUJ1ZmZlcmVkU29ja2V0cyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1mIiB8fCBhcmdzW2ldID09ICItLWZyYW1lZCIgfHwgYXJnc1tpXSA9PSAiLS10cmFuc3BvcnQ9ZnJhbWVkIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVzZUZyYW1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tYmluYXJ5IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWJpbmFyeSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIG5lZWRlZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWNvbXBhY3QiIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9Y29tcGFjdCIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb21wYWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1qc29uIiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWpzb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAganNvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tdGhyZWFkZWQiIHx8IGFyZ3NbaV0gPT0gIi0tc2VydmVyLXR5cGU9dGhyZWFkZWQiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKGFyZ3NbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXRocmVhZHBvb2wiIHx8IGFyZ3NbaV0gPT0gIi0tc2VydmVyLXR5cGU9dGhyZWFkcG9vbCIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oYXJnc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tcHJvdG90eXBlIiB8fCBhcmdzW2ldID09ICItLXByb2Nlc3Nvcj1wcm90b3R5cGUiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKGFyZ3NbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXNzbCIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1c2VFbmNyeXB0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy90aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oYXJnc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgVGVzdFNlcnZlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgX2NsaWVudElEID0gLTE7CisgICAgICAgIHB1YmxpYyBkZWxlZ2F0ZSB2b2lkIFRlc3RMb2dEZWxlZ2F0ZShzdHJpbmcgbXNnLCBwYXJhbXMgb2JqZWN0W10gdmFsdWVzKTsKKworICAgICAgICBwdWJsaWMgY2xhc3MgTXlTZXJ2ZXJFdmVudEhhbmRsZXIgOiBUU2VydmVyRXZlbnRIYW5kbGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgY2FsbENvdW50ID0gMDsKKworICAgICAgICAgICAgcHVibGljIFRhc2sgUHJlU2VydmVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Db21wbGV0ZWRUYXNrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxvYmplY3Q+IENyZWF0ZUNvbnRleHRBc3luYyhUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxDb3VudCsrOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQ8b2JqZWN0PihudWxsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2sgRGVsZXRlQ29udGV4dEFzeW5jKG9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxDb3VudCsrOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkNvbXBsZXRlZFRhc2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrIFByb2Nlc3NDb250ZXh0QXN5bmMob2JqZWN0IHNlcnZlckNvbnRleHQsIFRDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Db21wbGV0ZWRUYXNrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIFRlc3RIYW5kbGVyQXN5bmMgOiBUaHJpZnRUZXN0LklBc3luYworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgVEJhc2VTZXJ2ZXIgc2VydmVyIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHByaXZhdGUgaW50IGhhbmRsZXJJRDsKKyAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBwcml2YXRlIFRlc3RMb2dEZWxlZ2F0ZSBsb2dnZXI7CisKKyAgICAgICAgICAgIHB1YmxpYyBUZXN0SGFuZGxlckFzeW5jKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVySUQgPSBJbnRlcmxvY2tlZC5JbmNyZW1lbnQocmVmIF9jbGllbnRJRCk7CisgICAgICAgICAgICAgICAgbG9nZ2VyICs9IHRlc3RDb25zb2xlTG9nZ2VyOworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoIk5ldyBUZXN0SGFuZGxlciBpbnN0YW5jZSBjcmVhdGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zb2xlTG9nZ2VyKHN0cmluZyBtc2csIHBhcmFtcyBvYmplY3RbXSB2YWx1ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoImhhbmRsZXJ7MDpEM306IiwgaGFuZGxlcklEKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQobXNnLCB2YWx1ZXMpOworICAgICAgICAgICAgICAgIHNiLkFwcGVuZExpbmUoKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKHNiLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzayB0ZXN0Vm9pZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RWb2lkKCkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Db21wbGV0ZWRUYXNrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxzdHJpbmc+IHRlc3RTdHJpbmdBc3luYyhzdHJpbmcgdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RTdHJpbmcoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8Ym9vbD4gdGVzdEJvb2xBc3luYyhib29sIHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0Qm9vbCh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxzYnl0ZT4gdGVzdEJ5dGVBc3luYyhzYnl0ZSB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEJ5dGUoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8aW50PiB0ZXN0STMyQXN5bmMoaW50IHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0STMyKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPGxvbmc+IHRlc3RJNjRBc3luYyhsb25nIHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0STY0KHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPGRvdWJsZT4gdGVzdERvdWJsZUFzeW5jKGRvdWJsZSB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdERvdWJsZSh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxieXRlW10+IHRlc3RCaW5hcnlBc3luYyhieXRlW10gdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBoZXggPSBCaXRDb252ZXJ0ZXIuVG9TdHJpbmcodGhpbmcpLlJlcGxhY2UoIi0iLCBzdHJpbmcuRW1wdHkpOworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RCaW5hcnkoezA6WH0pIiwgaGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8WHRydWN0PiB0ZXN0U3RydWN0QXN5bmMoWHRydWN0IHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0U3RydWN0KHt7XCJ7MH1cIiwgezF9LCB7Mn0sIHszfX19KSIsIHRoaW5nLlN0cmluZ190aGluZywgdGhpbmcuQnl0ZV90aGluZywgdGhpbmcuSTMyX3RoaW5nLCB0aGluZy5JNjRfdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxYdHJ1Y3QyPiB0ZXN0TmVzdEFzeW5jKFh0cnVjdDIgbmVzdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHRoaW5nID0gbmVzdC5TdHJ1Y3RfdGhpbmc7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdE5lc3Qoe3t7MH0sIHt7XCJ7MX1cIiwgezJ9LCB7M30sIHs0fSwgezV9fX19fSkiLAorICAgICAgICAgICAgICAgICAgICBuZXN0LkJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgIHRoaW5nLlN0cmluZ190aGluZywKKyAgICAgICAgICAgICAgICAgICAgdGhpbmcuQnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICAgdGhpbmcuSTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICB0aGluZy5JNjRfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgIG5lc3QuSTMyX3RoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5lc3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxEaWN0aW9uYXJ5PGludCwgaW50Pj4gdGVzdE1hcEFzeW5jKERpY3Rpb25hcnk8aW50LCBpbnQ+IHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5DbGVhcigpOworICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgidGVzdE1hcCh7eyIpOworICAgICAgICAgICAgICAgIHZhciBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGtleSBpbiB0aGluZy5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiezB9ID0+IHsxfSIsIGtleSwgdGhpbmdba2V5XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgifX0pIik7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZShzYi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8RGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4+IHRlc3RTdHJpbmdNYXBBc3luYyhEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoInRlc3RTdHJpbmdNYXAoe3siKTsKKyAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrZXkgaW4gdGhpbmcuS2V5cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoInswfSA9PiB7MX0iLCBrZXksIHRoaW5nW2tleV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2Uoc2IuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPFRIYXNoU2V0PGludD4+IHRlc3RTZXRBc3luYyhUSGFzaFNldDxpbnQ+IHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5DbGVhcigpOworICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgidGVzdFNldCh7eyIpOworICAgICAgICAgICAgICAgIHZhciBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoaW50IGVsZW0gaW4gdGhpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJ7MH0iLCBlbGVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ9fSkiKTsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKHNiLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxMaXN0PGludD4+IHRlc3RMaXN0QXN5bmMoTGlzdDxpbnQ+IHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5DbGVhcigpOworICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgidGVzdExpc3Qoe3siKTsKKyAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBlbGVtIGluIHRoaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiezB9IiwgZWxlbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgifX0pIik7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZShzYi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8TnVtYmVyej4gdGVzdEVudW1Bc3luYyhOdW1iZXJ6IHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0RW51bSh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxsb25nPiB0ZXN0VHlwZWRlZkFzeW5jKGxvbmcgdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RUeXBlZGVmKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPERpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4+IHRlc3RNYXBNYXBBc3luYyhpbnQgaGVsbG8sIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RNYXBNYXAoezB9KSIsIGhlbGxvKTsKKyAgICAgICAgICAgICAgICB2YXIgbWFwbWFwID0gbmV3IERpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4oKTsKKworICAgICAgICAgICAgICAgIHZhciBwb3MgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgICAgICB2YXIgbmVnID0gbmV3IERpY3Rpb25hcnk8aW50LCBpbnQ+KCk7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCA1OyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwb3NbaV0gPSBpOworICAgICAgICAgICAgICAgICAgICBuZWdbLWldID0gLWk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWFwbWFwWzRdID0gcG9zOworICAgICAgICAgICAgICAgIG1hcG1hcFstNF0gPSBuZWc7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG1hcG1hcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+PiB0ZXN0SW5zYW5pdHlBc3luYyhJbnNhbml0eSBhcmd1bWVudCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEluc2FuaXR5KCkiKTsKKworICAgICAgICAgICAgICAgIC8qKiBmcm9tIFRocmlmdFRlc3QudGhyaWZ0OgorICAgICAgICAgICAgICAgICAqIFNvIHlvdSB0aGluayB5b3UndmUgZ290IHRoaXMgYWxsIHdvcmtlZCwgb3V0IGVoPworICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogQ3JlYXRlcyBhIHRoZSByZXR1cm5lZCBtYXAgd2l0aCB0aGVzZSB2YWx1ZXMgYW5kIHByaW50cyBpdCBvdXQ6CisgICAgICAgICAgICAgICAgICogICB7IDEgPT4geyAyID0+IGFyZ3VtZW50LAorICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgMyA9PiBhcmd1bWVudCwKKyAgICAgICAgICAgICAgICAgKiAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAqICAgICAyID0+IHsgNiA9PiA8ZW1wdHkgSW5zYW5pdHkgc3RydWN0PiwgfSwKKyAgICAgICAgICAgICAgICAgKiAgIH0KKyAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gLSBhIG1hcCB3aXRoIHRoZSBhYm92ZSB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIHZhciBmaXJzdF9tYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4oKTsKKyAgICAgICAgICAgICAgICB2YXIgc2Vjb25kX21hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PigpOyA7CisKKyAgICAgICAgICAgICAgICBmaXJzdF9tYXBbTnVtYmVyei5UV09dID0gYXJndW1lbnQ7CisgICAgICAgICAgICAgICAgZmlyc3RfbWFwW051bWJlcnouVEhSRUVdID0gYXJndW1lbnQ7CisKKyAgICAgICAgICAgICAgICBzZWNvbmRfbWFwW051bWJlcnouU0lYXSA9IG5ldyBJbnNhbml0eSgpOworCisgICAgICAgICAgICAgICAgdmFyIGluc2FuZSA9IG5ldyBEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWzFdID0gZmlyc3RfbWFwLAorICAgICAgICAgICAgICAgICAgICBbMl0gPSBzZWNvbmRfbWFwCisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQoaW5zYW5lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8WHRydWN0PiB0ZXN0TXVsdGlBc3luYyhzYnl0ZSBhcmcwLCBpbnQgYXJnMSwgbG9uZyBhcmcyLCBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+IGFyZzMsIE51bWJlcnogYXJnNCwgbG9uZyBhcmc1LAorICAgICAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RNdWx0aSgpIik7CisKKyAgICAgICAgICAgICAgICB2YXIgaGVsbG8gPSBuZXcgWHRydWN0KCk7IDsKKyAgICAgICAgICAgICAgICBoZWxsby5TdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKKyAgICAgICAgICAgICAgICBoZWxsby5CeXRlX3RoaW5nID0gYXJnMDsKKyAgICAgICAgICAgICAgICBoZWxsby5JMzJfdGhpbmcgPSBhcmcxOworICAgICAgICAgICAgICAgIGhlbGxvLkk2NF90aGluZyA9IGFyZzI7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChoZWxsbyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrIHRlc3RFeGNlcHRpb25Bc3luYyhzdHJpbmcgYXJnLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0RXhjZXB0aW9uKHswfSkiLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChhcmcgPT0gIlhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gbmV3IFhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9IDEwMDEsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0gYXJnCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhcmcgPT0gIlRFeGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8WHRydWN0PiB0ZXN0TXVsdGlFeGNlcHRpb25Bc3luYyhzdHJpbmcgYXJnMCwgc3RyaW5nIGFyZzEsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RNdWx0aUV4Y2VwdGlvbih7MH0sIHsxfSkiLCBhcmcwLCBhcmcxKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJnMCA9PSAiWGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBuZXcgWGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0gMTAwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYXJnMCA9PSAiWGNlcHRpb24yIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gbmV3IFhjZXB0aW9uMgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPSAyMDAyLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RydWN0X3RoaW5nID0gbmV3IFh0cnVjdCB7IFN0cmluZ190aGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIgfQorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgWHRydWN0IHsgU3RyaW5nX3RoaW5nID0gYXJnMSB9OworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQocmVzdWx0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2sgdGVzdE9uZXdheUFzeW5jKGludCBzZWNvbmRzVG9TbGVlcCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdE9uZXdheSh7MH0pLCBzbGVlcGluZy4uLiIsIHNlY29uZHNUb1NsZWVwKTsKKyAgICAgICAgICAgICAgICBUYXNrLkRlbGF5KHNlY29uZHNUb1NsZWVwICogMTAwMCwgY2FuY2VsbGF0aW9uVG9rZW4pLkdldEF3YWl0ZXIoKS5HZXRSZXN1bHQoKTsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0T25ld2F5IGZpbmlzaGVkIik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Db21wbGV0ZWRUYXNrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgUHJpbnRPcHRpb25zSGVscCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTZXJ2ZXIgb3B0aW9uczoiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tcGlwZT08cGlwZSBuYW1lPiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1wb3J0PTxwb3J0IG51bWJlcj4iKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tdHJhbnNwb3J0PTx0cmFuc3BvcnQgbmFtZT4gICAgb25lIG9mIGJ1ZmZlcmVkLGZyYW1lZCAgKGRlZmF1bHRzIHRvIG5vbmUpIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXByb3RvY29sPTxwcm90b2NvbCBuYW1lPiAgICAgIG9uZSBvZiBjb21wYWN0LGpzb24gIChkZWZhdWx0cyB0byBiaW5hcnkpIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXNlcnZlci10eXBlPTx0eXBlPiAgICAgICAgICAgIG9uZSBvZiB0aHJlYWRlZCx0aHJlYWRwb29sICAoZGVmYXVsdHMgdG8gc2ltcGxlKSIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1wcm9jZXNzb3I9PHByb3RvdHlwZT4iKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tc3NsIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWDUwOUNlcnRpZmljYXRlMiBHZXRTZXJ2ZXJDZXJ0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHNlcnZlckNlcnROYW1lID0gInNlcnZlci5wMTIiOworICAgICAgICAgICAgdmFyIHBvc3NpYmxlUGF0aHMgPSBuZXcgTGlzdDxzdHJpbmc+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIi4uLy4uLy4uL2tleXMvIiwKKyAgICAgICAgICAgICAgICAiLi4vLi4va2V5cy8iLAorICAgICAgICAgICAgICAgICIuLi9rZXlzLyIsCisgICAgICAgICAgICAgICAgImtleXMvIiwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHN0cmluZyBleGlzdGluZ1BhdGggPSBudWxsOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBvc3NpYmxlUGF0aCBpbiBwb3NzaWJsZVBhdGhzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBwYXRoID0gUGF0aC5HZXRGdWxsUGF0aChwb3NzaWJsZVBhdGggKyBzZXJ2ZXJDZXJ0TmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKEZpbGUuRXhpc3RzKHBhdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdQYXRoID0gcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoZXhpc3RpbmdQYXRoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCQiQ2Fubm90IGZpbmQgZmlsZToge3NlcnZlckNlcnROYW1lfSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB2YXIgY2VydCA9IG5ldyBYNTA5Q2VydGlmaWNhdGUyKGV4aXN0aW5nUGF0aCwgInRocmlmdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gY2VydDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEV4ZWN1dGUoTGlzdDxzdHJpbmc+IGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBsb2dnZXJGYWN0b3J5ID0gbmV3IExvZ2dlckZhY3RvcnkoKTsvLy5BZGRDb25zb2xlKCkuQWRkRGVidWcoKTsKKyAgICAgICAgICAgIHZhciBsb2dnZXIgPSBuZXcgTG9nZ2VyRmFjdG9yeSgpLkNyZWF0ZUxvZ2dlcigiVGVzdCIpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcGFyYW0gPSBuZXcgU2VydmVyUGFyYW0oKTsKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0uUGFyc2UoYXJncyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkVycm9yIHdoaWxlICBwYXJzaW5nIGFyZ3VtZW50cyIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIC8vIFRyYW5zcG9ydAorICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgdHJhbnM7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtLnBpcGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQocGFyYW0ucGlwZSk7CisgICAgICAgICAgICAgICAgfQorLy8gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0udXNlRnJhbWVkKQorLy8gICAgICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQocGFyYW0ucG9ydCk7CisvLyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtLnVzZUVuY3J5cHRpb24pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjZXJ0ID0gR2V0U2VydmVyQ2VydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2VydCA9PSBudWxsIHx8ICFjZXJ0Lkhhc1ByaXZhdGVLZXkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkNlcnRpZmljYXRlIGRvZXNuJ3QgY29udGFpbiBwcml2YXRlIGtleSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0KHBhcmFtLnBvcnQsIHBhcmFtLnVzZUJ1ZmZlcmVkU29ja2V0cywgcGFyYW0udXNlRnJhbWVkLCBjZXJ0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VuZGVyLCBjZXJ0aWZpY2F0ZSwgY2hhaW4sIGVycm9ycykgPT4gdHJ1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU3NsUHJvdG9jb2xzLlRscyB8IFNzbFByb3RvY29scy5UbHMxMSB8IFNzbFByb3RvY29scy5UbHMxMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KHBhcmFtLnBvcnQsIDAsIHBhcmFtLnVzZUJ1ZmZlcmVkU29ja2V0cywgcGFyYW0udXNlRnJhbWVkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIElUUHJvdG9jb2xGYWN0b3J5IHByb3RvOworICAgICAgICAgICAgICAgIGlmIChwYXJhbS5jb21wYWN0KQorICAgICAgICAgICAgICAgICAgICBwcm90byA9IG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS5qc29uKQorICAgICAgICAgICAgICAgICAgICBwcm90byA9IG5ldyBUSnNvblByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHByb3RvID0gbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICBJVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeTsKKworICAgICAgICAgICAgICAgIC8vIFByb2Nlc3NvcgorICAgICAgICAgICAgICAgIHZhciB0ZXN0SGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlckFzeW5jKCk7CisgICAgICAgICAgICAgICAgdmFyIHRlc3RQcm9jZXNzb3IgPSBuZXcgVGhyaWZ0VGVzdC5Bc3luY1Byb2Nlc3Nvcih0ZXN0SGFuZGxlcik7CisgICAgICAgICAgICAgICAgcHJvY2Vzc29yRmFjdG9yeSA9IG5ldyBTaW5nbGV0b25UUHJvY2Vzc29yRmFjdG9yeSh0ZXN0UHJvY2Vzc29yKTsKKworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zRmFjdG9yeSA9IG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpOyAKKworICAgICAgICAgICAgICAgIFRCYXNlU2VydmVyIHNlcnZlckVuZ2luZSA9IG5ldyBBc3luY0Jhc2VTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSwgdHJhbnMsIHRyYW5zRmFjdG9yeSwgdHJhbnNGYWN0b3J5LCBwcm90bywgcHJvdG8sIGxvZ2dlcik7CisKKyAgICAgICAgICAgICAgICAvL1NlcnZlciBldmVudCBoYW5kbGVyCisgICAgICAgICAgICAgICAgdmFyIHNlcnZlckV2ZW50cyA9IG5ldyBNeVNlcnZlckV2ZW50SGFuZGxlcigpOworICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZS5TZXRFdmVudEhhbmRsZXIoc2VydmVyRXZlbnRzKTsKKworICAgICAgICAgICAgICAgIC8vIFJ1biBpdAorICAgICAgICAgICAgICAgIHZhciB3aGVyZSA9ICghIHN0cmluZy5Jc051bGxPckVtcHR5KHBhcmFtLnBpcGUpKSA/ICJvbiBwaXBlICIgKyBwYXJhbS5waXBlIDogIm9uIHBvcnQgIiArIHBhcmFtLnBvcnQ7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlN0YXJ0aW5nIHRoZSBBc3luY0Jhc2VTZXJ2ZXIgIiArIHdoZXJlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggcHJvY2Vzc29yIFRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5IHByb3RvdHlwZSBmYWN0b3J5ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbS51c2VCdWZmZXJlZFNvY2tldHMgPyAiIHdpdGggYnVmZmVyZWQgc29ja2V0IiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtLnVzZUZyYW1lZCA/ICIgd2l0aCBmcmFtZWQgdHJhbnNwb3J0IiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtLnVzZUVuY3J5cHRpb24gPyAiIHdpdGggZW5jcnlwdGlvbiIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbS5jb21wYWN0ID8gIiB3aXRoIGNvbXBhY3QgcHJvdG9jb2wiIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyYW0uanNvbiA/ICIgd2l0aCBqc29uIHByb3RvY29sIiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uLiIpOworICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZS5TZXJ2ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpLkdldEF3YWl0ZXIoKS5HZXRSZXN1bHQoKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLlJlYWRMaW5lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZSh4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJkb25lLiIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9UaHJpZnRUZXN0LnNsbiBiL3Rlc3QvbmV0Y29yZS9UaHJpZnRUZXN0LnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWIyNDFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL1RocmlmdFRlc3Quc2xuCkBAIC0wLDAgKzEsNjQgQEAKK++7v01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEyLjAwCisjIFZpc3VhbCBTdHVkaW8gMTUKK1Zpc3VhbFN0dWRpb1ZlcnNpb24gPSAxNS4wLjI2NzMwLjEyCitNaW5pbXVtVmlzdWFsU3R1ZGlvVmVyc2lvbiA9IDEwLjAuNDAyMTkuMQorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJUaHJpZnQiLCAiLi5cLi5cbGliXG5ldGNvcmVcVGhyaWZ0XFRocmlmdC5jc3Byb2oiLCAie0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIkNsaWVudCIsICJDbGllbnRcQ2xpZW50LmNzcHJvaiIsICJ7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiU2VydmVyIiwgIlNlcnZlclxTZXJ2ZXIuY3Nwcm9qIiwgInswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUKKwkJRGVidWd8eDY0ID0gRGVidWd8eDY0CisJCURlYnVnfHg4NiA9IERlYnVnfHg4NgorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKKwkJUmVsZWFzZXx4NjQgPSBSZWxlYXNlfHg2NAorCQlSZWxlYXNlfHg4NiA9IFJlbGVhc2V8eDg2CisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlHbG9iYWxzKSA9IHBvc3RTb2x1dGlvbgorCQlTb2x1dGlvbkd1aWQgPSB7NTJDRTlBMTItRjZDQi00RjBDLUJCNDItMDEwNTYxMkY1RkY0fQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL2J1aWxkLmNtZCBiL3Rlc3QvbmV0Y29yZS9idWlsZC5jbWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4NGVmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9idWlsZC5jbWQKQEAgLTAsMCArMSwyNSBAQAorQGVjaG8gb2ZmCityZW0gLyoKK3JlbSAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCityZW0gICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK3JlbSAgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVtICAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorcmVtICAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKK3JlbSAgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCityZW0gICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CityZW0gICoKK3JlbSAgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorcmVtICAqCityZW0gICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorcmVtICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCityZW0gICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCityZW0gICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3JlbSAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCityZW0gICogdW5kZXIgdGhlIExpY2Vuc2UuCityZW0gICovCitzZXRsb2NhbAorCitkb3RuZXQgLS1pbmZvCitkb3RuZXQgYnVpbGQKKworOmVvZgpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL2J1aWxkLnNoIGIvdGVzdC9uZXRjb3JlL2J1aWxkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM5N2UzMTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvYnVpbGQuc2gKQEAgLTAsMCArMSwyNiBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworI2V4aXQgaWYgYW55IGNvbW1hbmQgZmFpbHMKK3NldCAtZQorCitkb3RuZXQgLS1pbmZvCitkb3RuZXQgYnVpbGQKZGlmZiAtLWdpdCBhL3Rlc3Qvb2NhbWwvc2VydmVyL1Rlc3RTZXJ2ZXIubWwgYi90ZXN0L29jYW1sL3NlcnZlci9UZXN0U2VydmVyLm1sCmluZGV4IDNmNWM5ZWUuLmVmZTBmNGIgMTAwNjQ0Ci0tLSBhL3Rlc3Qvb2NhbWwvc2VydmVyL1Rlc3RTZXJ2ZXIubWwKKysrIGIvdGVzdC9vY2FtbC9zZXJ2ZXIvVGVzdFNlcnZlci5tbApAQCAtMzYsNiArMzYsNyBAQAogICBtZXRob2QgdGVzdEkzMiB4ID0gcCAidGVzdEkzMiglZClcbiIgKHNvZCB4KTsgKHNvZCB4KQogICBtZXRob2QgdGVzdEk2NCB4ID0gcCAidGVzdEk2NCglcylcbiIgKEludDY0LnRvX3N0cmluZyAoc29kIHgpKTsgKHNvZCB4KQogICBtZXRob2QgdGVzdERvdWJsZSB4ID0gcCAidGVzdERvdWJsZSglZilcbiIgKHNvZCB4KTsgKHNvZCB4KQorICBtZXRob2QgdGVzdEJpbmFyeSB4ID0gcCAidGVzdEJpbmFyeSglcylcbiIgKHNvZCB4KTsgKHNvZCB4KQogICBtZXRob2QgdGVzdFN0cnVjdCB4ID0gcCAidGVzdFN0cnVjdCgtLS0pXG4iOyAoc29kIHgpCiAgIG1ldGhvZCB0ZXN0TmVzdCB4ID0gcCAidGVzdE5lc3QoLS0tKVxuIjsgKHNvZCB4KQogICBtZXRob2QgdGVzdE1hcCB4ID0gcCAidGVzdE1hcCgtLS0pXG4iOyAoc29kIHgpCmRpZmYgLS1naXQgYS90ZXN0L3BlcmwvTWFrZWZpbGUgYi90ZXN0L3BlcmwvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZDgxZDQuLjAwMDAwMDAKLS0tIGEvdGVzdC9wZXJsL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgRGVmYXVsdCB0YXJnZXQgaXMgZXZlcnl0aGluZwotdGFyZ2V0OiBhbGwKLQotIyBUb29scwotVEhSSUZUID0gLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdAotCi1hbGw6IC4uL1RocmlmdFRlc3QudGhyaWZ0Ci0JJChUSFJJRlQpIC0tZ2VuIHBlcmwgLi4vVGhyaWZ0VGVzdC50aHJpZnQKLQotY2xlYW46Ci0JJChSTSkgLXIgZ2VuLXBlcmwKZGlmZiAtLWdpdCBhL3Rlc3QvcGVybC9NYWtlZmlsZS5hbSBiL3Rlc3QvcGVybC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjViOWE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9wZXJsL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzdHViczogLi4vVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gcGVybCAuLi9UaHJpZnRUZXN0LnRocmlmdAorCitwcmVjcm9zczogc3R1YnMKKworY2hlY2s6IHN0dWJzCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1wZXJsCisKZGlmZiAtLWdpdCBhL3Rlc3QvcGVybC9UZXN0Q2xpZW50LnBsIGIvdGVzdC9wZXJsL1Rlc3RDbGllbnQucGwKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBhZjgwZDQ2Li45NmUzYmVjCi0tLSBhL3Rlc3QvcGVybC9UZXN0Q2xpZW50LnBsCisrKyBiL3Rlc3QvcGVybC9UZXN0Q2xpZW50LnBsCkBAIC0xOSwxMCArMTksMTEgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIHVzZSBEYXRhOjpEdW1wZXI7Cit1c2UgR2V0b3B0OjpMb25nIHF3KEdldE9wdGlvbnMpOwogdXNlIFRpbWU6OkhpUmVzIHF3KGdldHRpbWVvZmRheSk7CiAKIHVzZSBsaWIgJy4uLy4uL2xpYi9wZXJsL2xpYic7CkBAIC0zMCwxMDQgKzMxLDIyNyBAQAogCiB1c2UgVGhyaWZ0OwogdXNlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7Ci11c2UgVGhyaWZ0OjpTb2NrZXQ7CiB1c2UgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpTU0xTb2NrZXQ7Cit1c2UgVGhyaWZ0OjpTb2NrZXQ7Cit1c2UgVGhyaWZ0OjpVbml4U29ja2V0OwogCit1c2UgVGhyaWZ0VGVzdDo6U2Vjb25kU2VydmljZTsKIHVzZSBUaHJpZnRUZXN0OjpUaHJpZnRUZXN0OwogdXNlIFRocmlmdFRlc3Q6OlR5cGVzOwogCiAkfCsrOwogCi1teSAkaG9zdCA9ICdsb2NhbGhvc3QnOwotbXkgJHBvcnQgPSA5MDkwOworc3ViIHVzYWdlIHsKKyAgICBwcmludCA8PCJFT0YiOworVXNhZ2U6ICQwIFtPUFRJT05TXQogCitPcHRpb25zOiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQpCisgIC0tY2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBIHRvIHZhbGlkYXRlIHNlcnZlciB3aXRoLgorICAtLWNlcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSB0byB1c2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkIGlmIHVzaW5nIC0tc3NsLgorICAtLWNpcGhlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2NlcHRhYmxlIGNpcGhlciBsaXN0LgorICAtLWRvbWFpbi1zb2NrZXQgPGZpbGU+ICAgICAgICAgICAgICAgICAgICAgICBVc2UgYSB1bml4IGRvbWFpbiBzb2NrZXQuCisgIC0taGVscCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3cgdXNhZ2UuCisgIC0ta2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIGtleS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgaWYgdXNpbmcgLS1zc2wuCisgIC0tcG9ydCA8cG9ydG51bT4gICAgICAgICAgICAgICAgOTA5MCAgICAgICAgIFBvcnQgdG8gdXNlLgorICAtLXByb3RvY29sIHtiaW5hcnl9ICAgICAgICAgICAgIGJpbmFyeSAgICAgICBQcm90b2NvbCB0byB1c2UuCisgIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHByZXNlbnQsIHVzZSBTU0wuCisgIC0tdHJhbnNwb3J0IHtidWZmZXJlZHxmcmFtZWR9ICAgYnVmZmVyZWQgICAgIFRyYW5zcG9ydCB0byB1c2UuCiAKLW15ICRzb2NrZXQgPSBuZXcgVGhyaWZ0OjpTb2NrZXQoJGhvc3QsICRwb3J0KTsKK0VPRgorfQogCi1teSAkYnVmZmVyZWRTb2NrZXQgPSBuZXcgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydCgkc29ja2V0LCAxMDI0LCAxMDI0KTsKLW15ICR0cmFuc3BvcnQgPSAkYnVmZmVyZWRTb2NrZXQ7Ci1teSAkcHJvdG9jb2wgPSBuZXcgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKLW15ICR0ZXN0Q2xpZW50ID0gbmV3IFRocmlmdFRlc3Q6OlRocmlmdFRlc3RDbGllbnQoJHByb3RvY29sKTsKK215ICVvcHRzID0gKAorICAgICdwb3J0JyA9PiA5MDkwLAorICAgICdwcm90b2NvbCcgPT4gJ2JpbmFyeScsCisgICAgJ3RyYW5zcG9ydCcgPT4gJ2J1ZmZlcmVkJworKTsKIAotZXZhbHsKLSR0cmFuc3BvcnQtPm9wZW4oKTsKLX07IGlmKCRAKXsKK0dldE9wdGlvbnMoXCVvcHRzLCBxdyAoCisgICAgY2E9cworICAgIGNlcnQ9cworICAgIGNpcGhlcnM9cworICAgIGtleT1zCisgICAgZG9tYWluLXNvY2tldD1zCisgICAgaGVscAorICAgIGhvc3Q9cworICAgIHBvcnQ9aQorICAgIHByb3RvY29sPXMKKyAgICBzc2wKKyAgICB0cmFuc3BvcnQ9cworKSkgfHwgZXhpdCAxOworCitpZiAoJG9wdHN7aGVscH0pIHsKKyAgICB1c2FnZSgpOworICAgIGV4aXQgMDsKK30KKworbXkgJHNvY2tldCA9IHVuZGVmOworaWYgKCRvcHRzeydkb21haW4tc29ja2V0J30pIHsKKyAgICAkc29ja2V0ID0gVGhyaWZ0OjpVbml4U29ja2V0LT5uZXcoJG9wdHN7J2RvbWFpbi1zb2NrZXQnfSk7Cit9CitlbHNpZiAoJG9wdHN7c3NsfSkgeworICAkc29ja2V0ID0gVGhyaWZ0OjpTU0xTb2NrZXQtPm5ldyhcJW9wdHMpOworfQorZWxzZSB7CisgICRzb2NrZXQgPSBUaHJpZnQ6OlNvY2tldC0+bmV3KCRvcHRze2hvc3R9LCAkb3B0c3twb3J0fSk7Cit9CisKK215ICR0cmFuc3BvcnQ7CitpZiAoJG9wdHN7dHJhbnNwb3J0fSBlcSAnYnVmZmVyZWQnKSB7CisgICAgJHRyYW5zcG9ydCA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQtPm5ldygkc29ja2V0LCAxMDI0LCAxMDI0KTsKK30KK2Vsc2lmICgkb3B0c3t0cmFuc3BvcnR9IGVxICdmcmFtZWQnKSB7CisgICAgJHRyYW5zcG9ydCA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0LT5uZXcoJHNvY2tldCk7Cit9CitlbHNlIHsKKyAgICB1c2FnZSgpOworICAgIGV4aXQgMTsKK30KKworbXkgJHByb3RvY29sOworbXkgJHByb3RvY29sMjsKK2lmICgkb3B0c3twcm90b2NvbH0gZXEgJ2JpbmFyeScgfHwgJG9wdHN7cHJvdG9jb2x9IGVxICdtdWx0aScpIHsKKyAgICAkcHJvdG9jb2wgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLT5uZXcoJHRyYW5zcG9ydCk7Cit9CitlbHNlIHsKKyAgICB1c2FnZSgpOworICAgIGV4aXQgMTsKK30KKworbXkgJHNlY29uZFNlcnZpY2UgPSB1bmRlZjsKK2lmIChpbmRleCgkb3B0c3twcm90b2NvbH0sICdtdWx0aScpID09IDApIHsKKyAgJHByb3RvY29sMiAgICAgPSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2wtPm5ldygkcHJvdG9jb2wsICdTZWNvbmRTZXJ2aWNlJyk7CisgICRwcm90b2NvbCAgICAgID0gVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sLT5uZXcoJHByb3RvY29sLCAnVGhyaWZ0VGVzdCcpOworICAkc2Vjb25kU2VydmljZSA9IFRocmlmdFRlc3Q6OlNlY29uZFNlcnZpY2VDbGllbnQtPm5ldygkcHJvdG9jb2wyKTsKK30KKworbXkgJHRlc3RDbGllbnQgPSBUaHJpZnRUZXN0OjpUaHJpZnRUZXN0Q2xpZW50LT5uZXcoJHByb3RvY29sKTsKKworZXZhbCB7CisgICR0cmFuc3BvcnQtPm9wZW4oKTsKK307CitpZigkQCl7CiAgICAgZGllKER1bXBlcigkQCkpOwogfQorCit1c2UgY29uc3RhbnQgRVJSX0JBU0VUWVBFUyA9PiAxOwordXNlIGNvbnN0YW50IEVSUl9TVFJVQ1RTID0+IDI7Cit1c2UgY29uc3RhbnQgRVJSX0NPTlRBSU5FUlMgPT4gNDsKK3VzZSBjb25zdGFudCBFUlJfRVhDRVBUSU9OUyA9PiA4OwordXNlIGNvbnN0YW50IEVSUl9QUk9UT0NPTCA9PiAxNjsKK3VzZSBjb25zdGFudCBFUlJfVU5LTk9XTiA9PiA2NDsKKwogbXkgJHN0YXJ0ID0gZ2V0dGltZW9mZGF5KCk7CiAKICMKICMgVk9JRCBURVNUCiAjCi1wcmludCgidGVzdFZvaWQoKSIpOworcHJpbnQoJ3Rlc3RWb2lkKCknKTsKICR0ZXN0Q2xpZW50LT50ZXN0Vm9pZCgpOwogcHJpbnQoIiA9IHZvaWRcbiIpOwogCiAjCiAjIFNUUklORyBURVNUCiAjCi1wcmludCgidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKLW15ICRzID0gJHRlc3RDbGllbnQtPnRlc3RTdHJpbmcoIlRlc3QiKTsKLXByaW50KCIgPSBcIiRzXCJcbiIpOworcHJpbnQoJ3Rlc3RTdHJpbmcoIlRlc3QiKScpOworbXkgJHMgPSAkdGVzdENsaWVudC0+dGVzdFN0cmluZygnVGVzdCcpOworcHJpbnQocXF8ID0gIiRzIlxufCk7CitleGl0KEVSUl9CQVNFVFlQRVMpIGlmICgkcyBuZSAnVGVzdCcpOworCisjCisjIE1VTFRJUExFWEVEIFRFU1QKKyMKK2lmIChpbmRleCgkb3B0c3twcm90b2NvbH0sICdtdWx0aScpID09IDApIHsKKyAgICBwcmludCgnc2Vjb25kdGVzdFN0cmluZygiVGVzdDIiKScpOworICAgICRzID0gJHNlY29uZFNlcnZpY2UtPnNlY29uZHRlc3RTdHJpbmcoJ1Rlc3QyJyk7CisgICAgcHJpbnQocXF8ID0gIiRzIlxufCk7CisgICAgZXhpdChFUlJfUFJPVE9DT0wpIGlmICgkcyBuZSAndGVzdFN0cmluZygiVGVzdDIiKScpOworfQorCisjCisjIEJPT0wgVEVTVAorIworcHJpbnQoJ3Rlc3RCb29sKDEpJyk7CitteSAkdCA9ICR0ZXN0Q2xpZW50LT50ZXN0Qm9vbCgxKTsKK3ByaW50KCIgPSAkdFxuIik7CitleGl0KEVSUl9CQVNFVFlQRVMpIGlmICgkdCBuZSAxKTsKK3ByaW50KCd0ZXN0Qm9vbCgwKScpOworbXkgJGYgPSAkdGVzdENsaWVudC0+dGVzdEJvb2woMCk7CitwcmludCgiID0gJGZcbiIpOworZXhpdChFUlJfQkFTRVRZUEVTKSBpZiAoJGYgbmUgcXx8KTsKKwogCiAjCiAjIEJZVEUgVEVTVAogIwotcHJpbnQoInRlc3RCeXRlKDEpIik7CitwcmludCgndGVzdEJ5dGUoMSknKTsKIG15ICR1OCA9ICR0ZXN0Q2xpZW50LT50ZXN0Qnl0ZSgxKTsKIHByaW50KCIgPSAkdThcbiIpOwogCiAjCiAjIEkzMiBURVNUCiAjCi1wcmludCgidGVzdEkzMigtMSkiKTsKK3ByaW50KCd0ZXN0STMyKC0xKScpOwogbXkgJGkzMiA9ICR0ZXN0Q2xpZW50LT50ZXN0STMyKC0xKTsKIHByaW50KCIgPSAkaTMyXG4iKTsKK2V4aXQoRVJSX0JBU0VUWVBFUykgaWYgKCRpMzIgbmUgLTEpOwogCiAjCi0jSTY0IFRFU1QKKyMgSTY0IFRFU1QKICMKLXByaW50KCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKK3ByaW50KCd0ZXN0STY0KC0zNDM1OTczODM2OCknKTsKIG15ICRpNjQgPSAkdGVzdENsaWVudC0+dGVzdEk2NCgtMzQzNTk3MzgzNjgpOwogcHJpbnQoIiA9ICRpNjRcbiIpOworZXhpdChFUlJfQkFTRVRZUEVTKSBpZiAoJGk2NCBuZSAtMzQzNTk3MzgzNjgpOwogCiAjCiAjIERPVUJMRSBURVNUCiAjCi1wcmludCgidGVzdERvdWJsZSgtODUyLjIzNDIzNDIzNCkiKTsKK3ByaW50KCd0ZXN0RG91YmxlKC04NTIuMjM0MjM0MjM0KScpOwogbXkgJGR1YiA9ICR0ZXN0Q2xpZW50LT50ZXN0RG91YmxlKC04NTIuMjM0MjM0MjM0KTsKIHByaW50KCIgPSAkZHViXG4iKTsKK2V4aXQoRVJSX0JBU0VUWVBFUykgaWYgKCRkdWIgbmUgLTg1Mi4yMzQyMzQyMzQpOworCisjCisjIEJJTkFSWSBURVNUICAgLS0tICBUT0RPCisjCisKIAogIwogIyBTVFJVQ1QgVEVTVAogIwotcHJpbnQoInRlc3RTdHJ1Y3Qoe1wiWmVyb1wiLCAxLCAtMywgLTV9KSIpOwotbXkgJG91dCA9IG5ldyBUaHJpZnRUZXN0OjpYdHJ1Y3QoKTsKLSRvdXQtPnN0cmluZ190aGluZygiWmVybyIpOworcHJpbnQoJ3Rlc3RTdHJ1Y3QoeyJaZXJvIiwgMSwgLTMsIC01fSknKTsKK215ICRvdXQgPSBUaHJpZnRUZXN0OjpYdHJ1Y3QtPm5ldygpOworJG91dC0+c3RyaW5nX3RoaW5nKCdaZXJvJyk7CiAkb3V0LT5ieXRlX3RoaW5nKDEpOwogJG91dC0+aTMyX3RoaW5nKC0zKTsKICRvdXQtPmk2NF90aGluZygtNSk7CiBteSAkaW4gPSAkdGVzdENsaWVudC0+dGVzdFN0cnVjdCgkb3V0KTsKLXByaW50KCIgPSB7XCIiLiRpbi0+c3RyaW5nX3RoaW5nLiJcIiwgIi4KLSAgICAgICAgJGluLT5ieXRlX3RoaW5nLiIsICIuCi0gICAgICAgICRpbi0+aTMyX3RoaW5nLiIsICIuCitwcmludCgnID0geyInLiRpbi0+c3RyaW5nX3RoaW5nLiciLCAnLgorICAgICAgICAkaW4tPmJ5dGVfdGhpbmcuJywgJy4KKyAgICAgICAgJGluLT5pMzJfdGhpbmcuJywgJy4KICAgICAgICAgJGluLT5pNjRfdGhpbmcuIn1cbiIpOwogCiAjCiAjIE5FU1RFRCBTVFJVQ1QgVEVTVAogIwotcHJpbnQoInRlc3ROZXN0KHsxLCB7XCJaZXJvXCIsIDEsIC0zLCAtNX0sIDV9Iik7Ci1teSAkb3V0MiA9IG5ldyBUaHJpZnRUZXN0OjpYdHJ1Y3QyKCk7CitwcmludCgndGVzdE5lc3QoezEsIHsiWmVybyIsIDEsIC0zLCAtNX0sIDV9Jyk7CitteSAkb3V0MiA9IFRocmlmdFRlc3Q6Olh0cnVjdDItPm5ldygpOwogJG91dDItPmJ5dGVfdGhpbmcoMSk7CiAkb3V0Mi0+c3RydWN0X3RoaW5nKCRvdXQpOwogJG91dDItPmkzMl90aGluZyg1KTsKIG15ICRpbjIgPSAkdGVzdENsaWVudC0+dGVzdE5lc3QoJG91dDIpOwogJGluID0gJGluMi0+c3RydWN0X3RoaW5nOwotcHJpbnQoIiA9IHsiLiRpbjItPmJ5dGVfdGhpbmcuIiwge1wiIi4KLSAgICAgICRpbi0+c3RyaW5nX3RoaW5nLiJcIiwgIi4KLSAgICAgICRpbi0+Ynl0ZV90aGluZy4iLCAiLgotICAgICAgJGluLT5pMzJfdGhpbmcuIiwgIi4KLSAgICAgICRpbi0+aTY0X3RoaW5nLiJ9LCAiLgorcHJpbnQoJyA9IHsnLiRpbjItPmJ5dGVfdGhpbmcuJywgeyInLgorICAgICAgJGluLT5zdHJpbmdfdGhpbmcuJyIsICcuCisgICAgICAkaW4tPmJ5dGVfdGhpbmcuJywgJy4KKyAgICAgICRpbi0+aTMyX3RoaW5nLicsICcuCisgICAgICAkaW4tPmk2NF90aGluZy4nfSwgJy4KICAgICAgICRpbjItPmkzMl90aGluZy4ifVxuIik7CiAKICMKQEAgLTEzNywyOCArMjYxLDMwIEBACiBmb3IgKG15ICRpID0gMDsgJGkgPCA1OyArKyRpKSB7CiAgICRtYXBvdXQtPnskaX0gPSAkaS0xMDsKIH0KLXByaW50KCJ0ZXN0TWFwKHsiKTsKK3ByaW50KCd0ZXN0TWFwKHsnKTsKIG15ICRmaXJzdCA9IDE7CiB3aGlsZSggbXkoJGtleSwkdmFsKSA9IGVhY2ggJSRtYXBvdXQpIHsKICAgICBpZiAoJGZpcnN0KSB7CiAgICAgICAgICRmaXJzdCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnQoIiwgIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwcmludCgnLCAnKTsKICAgICB9CiAgICAgcHJpbnQoIiRrZXkgPT4gJHZhbCIpOwogfQotcHJpbnQoIn0pIik7CitwcmludCgnfSknKTsKIAogCiBteSAkbWFwaW4gPSAkdGVzdENsaWVudC0+dGVzdE1hcCgkbWFwb3V0KTsKLXByaW50KCIgPSB7Iik7CitwcmludCgnID0geycpOwogCiAkZmlyc3QgPSAxOwogd2hpbGUoIG15KCRrZXksJHZhbCkgPSBlYWNoICUkbWFwaW4pewogICAgIGlmICgkZmlyc3QpIHsKICAgICAgICAgJGZpcnN0ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludCgiLCAiKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHByaW50KCcsICcpOwogICAgIH0KICAgICBwcmludCgiJGtleSA9PiAkdmFsIik7CiB9CkBAIC0xNzIsMTEgKzI5OCwxMSBAQAogICAgIHB1c2goQCRzZXRvdXQsICRpKTsKIH0KIAotcHJpbnQoInRlc3RTZXQoeyIuam9pbigiLCIsQCRzZXRvdXQpLiJ9KSIpOworcHJpbnQoJ3Rlc3RTZXQoeycuam9pbignLCcsQCRzZXRvdXQpLid9KScpOwogCiBteSAkc2V0aW4gPSAkdGVzdENsaWVudC0+dGVzdFNldCgkc2V0b3V0KTsKIAotcHJpbnQoIiA9IHsiLmpvaW4oIiwiLEAkc2V0b3V0KS4ifVxuIik7CitwcmludCgnID0geycuam9pbignLCcsQCRzZXRvdXQpLiJ9XG4iKTsKIAogIwogIyBMSVNUIFRFU1QKQEAgLTE4NiwxMDUgKzMxMiwxMTEgQEAKICAgICBwdXNoKEAkbGlzdG91dCwgJGkpOwogfQogCi1wcmludCgidGVzdExpc3QoeyIuam9pbigiLCIsQCRsaXN0b3V0KS4ifSkiKTsKK3ByaW50KCd0ZXN0TGlzdCh7Jy5qb2luKCcsJyxAJGxpc3RvdXQpLid9KScpOwogCiBteSAkbGlzdGluID0gJHRlc3RDbGllbnQtPnRlc3RMaXN0KCRsaXN0b3V0KTsKIAotcHJpbnQoIiA9IHsiLmpvaW4oIiwiLEAkbGlzdGluKS4ifVxuIik7CitwcmludCgnID0geycuam9pbignLCcsQCRsaXN0aW4pLiJ9XG4iKTsKIAogIwogIyBFTlVNIFRFU1QKICMKLXByaW50KCJ0ZXN0RW51bShPTkUpIik7CitwcmludCgndGVzdEVudW0oT05FKScpOwogbXkgJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShUaHJpZnRUZXN0OjpOdW1iZXJ6OjpPTkUpOwogcHJpbnQoIiA9ICRyZXRcbiIpOwogCi1wcmludCgidGVzdEVudW0oVFdPKSIpOworcHJpbnQoJ3Rlc3RFbnVtKFRXTyknKTsKICRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oVGhyaWZ0VGVzdDo6TnVtYmVyejo6VFdPKTsKIHByaW50KCIgPSAkcmV0XG4iKTsKIAotcHJpbnQoInRlc3RFbnVtKFRIUkVFKSIpOworcHJpbnQoJ3Rlc3RFbnVtKFRIUkVFKScpOwogJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShUaHJpZnRUZXN0OjpOdW1iZXJ6OjpUSFJFRSk7CiBwcmludCgiID0gJHJldFxuIik7CiAKLXByaW50KCJ0ZXN0RW51bShGSVZFKSIpOworcHJpbnQoJ3Rlc3RFbnVtKEZJVkUpJyk7CiAkcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFRocmlmdFRlc3Q6Ok51bWJlcno6OkZJVkUpOwogcHJpbnQoIiA9ICRyZXRcbiIpOwogCi1wcmludCgidGVzdEVudW0oRUlHSFQpIik7CitwcmludCgndGVzdEVudW0oRUlHSFQpJyk7CiAkcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFRocmlmdFRlc3Q6Ok51bWJlcno6OkVJR0hUKTsKIHByaW50KCIgPSAkcmV0XG4iKTsKIAogIwogIyBUWVBFREVGIFRFU1QKICMKLXByaW50KCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CitwcmludCgndGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKScpOwogbXkgJHVpZCA9ICR0ZXN0Q2xpZW50LT50ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpOwogcHJpbnQoIiA9ICR1aWRcbiIpOwogCiAjCiAjIE5FU1RFRCBNQVAgVEVTVAogIwotcHJpbnQoInRlc3RNYXBNYXAoMSkiKTsKK3ByaW50KCd0ZXN0TWFwTWFwKDEpJyk7CiBteSAkbW0gPSAkdGVzdENsaWVudC0+dGVzdE1hcE1hcCgxKTsKLXByaW50KCIgPSB7Iik7CitwcmludCgnID0geycpOwogd2hpbGUoIG15ICgka2V5LCR2YWwpID0gZWFjaCAlJG1tKSB7CiAgICAgcHJpbnQoIiRrZXkgPT4geyIpOwogICAgIHdoaWxlKCBteSgkazIsJHYyKSA9IGVhY2ggJSR2YWwpIHsKICAgICAgICAgcHJpbnQoIiRrMiA9PiAkdjIsICIpOwogICAgIH0KLSAgICBwcmludCgifSwgIik7CisgICAgcHJpbnQoJ30sICcpOwogfQogcHJpbnQoIn1cbiIpOwogCiAjCiAjIElOU0FOSVRZIFRFU1QKICMKLW15ICRpbnNhbmUgPSBuZXcgVGhyaWZ0VGVzdDo6SW5zYW5pdHkoKTsKK215ICRpbnNhbmUgPSBUaHJpZnRUZXN0OjpJbnNhbml0eS0+bmV3KCk7CiAkaW5zYW5lLT57dXNlck1hcH0tPntUaHJpZnRUZXN0OjpOdW1iZXJ6OjpGSVZFfSA9IDUwMDA7Ci1teSAkdHJ1Y2sgPSBuZXcgVGhyaWZ0VGVzdDo6WHRydWN0KCk7Ci0kdHJ1Y2stPnN0cmluZ190aGluZygiVHJ1Y2siKTsKLSR0cnVjay0+Ynl0ZV90aGluZyg4KTsKLSR0cnVjay0+aTMyX3RoaW5nKDgpOwotJHRydWNrLT5pNjRfdGhpbmcoOCk7CitteSAkdHJ1Y2sgPSBUaHJpZnRUZXN0OjpYdHJ1Y3QtPm5ldygpOworJHRydWNrLT5zdHJpbmdfdGhpbmcoJ0hlbGxvMicpOworJHRydWNrLT5ieXRlX3RoaW5nKDIpOworJHRydWNrLT5pMzJfdGhpbmcoMik7CiskdHJ1Y2stPmk2NF90aGluZygyKTsKK215ICR0cnVjazIgPSBUaHJpZnRUZXN0OjpYdHJ1Y3QtPm5ldygpOworJHRydWNrMi0+c3RyaW5nX3RoaW5nKCdHb29kYnllNCcpOworJHRydWNrMi0+Ynl0ZV90aGluZyg0KTsKKyR0cnVjazItPmkzMl90aGluZyg0KTsKKyR0cnVjazItPmk2NF90aGluZyg0KTsKIHB1c2goQHskaW5zYW5lLT57eHRydWN0c319LCAkdHJ1Y2spOworcHVzaChAeyRpbnNhbmUtPnt4dHJ1Y3RzfX0sICR0cnVjazIpOwogCi1wcmludCgidGVzdEluc2FuaXR5KCkiKTsKK3ByaW50KCd0ZXN0SW5zYW5pdHkoKScpOwogbXkgJHdob2EgPSAkdGVzdENsaWVudC0+dGVzdEluc2FuaXR5KCRpbnNhbmUpOwotcHJpbnQoIiA9IHsiKTsKK3ByaW50KCcgPSB7Jyk7CiB3aGlsZSggbXkgKCRrZXksJHZhbCkgPSBlYWNoICUkd2hvYSkgewogICAgIHByaW50KCIka2V5ID0+IHsiKTsKICAgICB3aGlsZSggbXkoJGsyLCR2MikgPSBlYWNoICUkdmFsKSB7CiAgICAgICAgIHByaW50KCIkazIgPT4geyIpOwogICAgICAgICBteSAkdXNlck1hcCA9ICR2Mi0+e3VzZXJNYXB9OwotICAgICAgICBwcmludCgieyIpOwotICAgICAgICBpZiAocmVmKCR1c2VyTWFwKSBlcSAiSEFTSCIpIHsKKyAgICAgICAgcHJpbnQoJ3snKTsKKyAgICAgICAgaWYgKHJlZigkdXNlck1hcCkgZXEgJ0hBU0gnKSB7CiAgICAgICAgICAgICB3aGlsZSggbXkoJGszLCR2MykgPSBlYWNoICUkdXNlck1hcCkgewogICAgICAgICAgICAgICAgIHByaW50KCIkazMgPT4gJHYzLCAiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBwcmludCgifSwgIik7CisgICAgICAgIHByaW50KCd9LCAnKTsKIAogICAgICAgICBteSAkeHRydWN0cyA9ICR2Mi0+e3h0cnVjdHN9OwotICAgICAgICBwcmludCgieyIpOwotICAgICAgICBpZiAocmVmKCR4dHJ1Y3RzKSBlcSAiQVJSQVkiKSB7CisgICAgICAgIHByaW50KCd7Jyk7CisgICAgICAgIGlmIChyZWYoJHh0cnVjdHMpIGVxICdBUlJBWScpIHsKICAgICAgICAgICAgIGZvcmVhY2ggbXkgJHggKEAkeHRydWN0cykgewotICAgICAgICAgICAgICAgIHByaW50KCJ7XCIiLiR4LT57c3RyaW5nX3RoaW5nfS4iXCIsICIuCi0gICAgICAgICAgICAgICAgICAgICAgJHgtPntieXRlX3RoaW5nfS4iLCAiLiR4LT57aTMyX3RoaW5nfS4iLCAiLiR4LT57aTY0X3RoaW5nfS4ifSwgIik7CisgICAgICAgICAgICAgICAgcHJpbnQoJ3siJy4keC0+e3N0cmluZ190aGluZ30uJyIsICcuCisgICAgICAgICAgICAgICAgICAgICAgJHgtPntieXRlX3RoaW5nfS4nLCAnLiR4LT57aTMyX3RoaW5nfS4nLCAnLiR4LT57aTY0X3RoaW5nfS4nfSwgJyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcHJpbnQoIn0iKTsKKyAgICAgICAgcHJpbnQoJ30nKTsKIAotICAgICAgICBwcmludCgifSwgIik7CisgICAgICAgIHByaW50KCd9LCAnKTsKICAgICB9Ci0gICAgcHJpbnQoIn0sICIpOworICAgIHByaW50KCd9LCAnKTsKIH0KIHByaW50KCJ9XG4iKTsKIAogIwogIyBFWENFUFRJT04gVEVTVAogIwotcHJpbnQoInRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJykiKTsKK3ByaW50KHF8dGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKXwpOwogZXZhbCB7CiAgICAgJHRlc3RDbGllbnQtPnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJyk7CiAgICAgcHJpbnQoIiAgdm9pZFxuRkFJTFVSRVxuIik7CkBAIC0yOTcsNyArNDI5LDcgQEAKICMgTm9ybWFsIHRlc3RzIGRvbmUuCiAjCiBteSAkc3RvcCA9IGdldHRpbWVvZmRheSgpOwotbXkgJGVscCAgPSBzcHJpbnRmKCIlZCIsMTAwMCooJHN0b3AgLSAkc3RhcnQpLCAwKTsKK215ICRlbHAgID0gc3ByaW50ZignJWQnLDEwMDAqKCRzdG9wIC0gJHN0YXJ0KSwgMCk7CiBwcmludCgiVG90YWwgdGltZTogJGVscCBtc1xuIik7CiAKICMKZGlmZiAtLWdpdCBhL3Rlc3QvcGVybC9UZXN0U2VydmVyLnBsIGIvdGVzdC9wZXJsL1Rlc3RTZXJ2ZXIucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJiOWEzOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcGVybC9UZXN0U2VydmVyLnBsCkBAIC0wLDAgKzEsNDExIEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBEYXRhOjpEdW1wZXI7Cit1c2UgR2V0b3B0OjpMb25nIHF3KEdldE9wdGlvbnMpOwordXNlIFRpbWU6OkhpUmVzIHF3KGdldHRpbWVvZmRheSk7CisKKyRTSUd7SU5UfSA9IFwmc2lnaW50X2hhbmRsZXI7CisKK3VzZSBsaWIgJy4uLy4uL2xpYi9wZXJsL2xpYic7Cit1c2UgbGliICdnZW4tcGVybCc7CisKK3VzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbDsKK3VzZSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0OwordXNlIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0OwordXNlIFRocmlmdDo6TXVsdGlwbGV4ZWRQcm9jZXNzb3I7Cit1c2UgVGhyaWZ0OjpTU0xTZXJ2ZXJTb2NrZXQ7Cit1c2UgVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQ7Cit1c2UgVGhyaWZ0OjpTZXJ2ZXI7Cit1c2UgVGhyaWZ0OjpVbml4U2VydmVyU29ja2V0OworCit1c2UgVGhyaWZ0VGVzdDo6U2Vjb25kU2VydmljZTsKK3VzZSBUaHJpZnRUZXN0OjpUaHJpZnRUZXN0OwordXNlIFRocmlmdFRlc3Q6OlR5cGVzOworCiskfCsrOworCitzdWIgdXNhZ2UgeworICAgIHByaW50IDw8IkVPRiI7CitVc2FnZTogJDAgW09QVElPTlNdCisKK09wdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCkKKyAgLS1jYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgYXV0aG9yaXR5IGZpbGUgKG9wdGlvbmFsKS4KKyAgLS1jZXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgZmlsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgaWYgdXNpbmcgLS1zc2wuCisgIC0tY2lwaGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2VwdGFibGUgY2lwaGVyIGxpc3QuCisgIC0tZG9tYWluLXNvY2tldCA8ZmlsZT4gICAgICAgICAgICAgICAgICAgICAgIFVzZSBhIHVuaXggZG9tYWluIHNvY2tldC4KKyAgLS1oZWxwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvdyB1c2FnZS4KKyAgLS1rZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpdmF0ZSBrZXkgZmlsZSBmb3IgY2VydGlmaWNhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkIGlmIHVzaW5nIC0tc3NsIGFuZCBwcml2YXRlIGtleSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgaW4gdGhlIGNlcnRpZmljYXRlIGZpbGUuCisgIC0tcG9ydCA8cG9ydG51bT4gICAgICAgICAgICAgICAgOTA5MCAgICAgICAgIFBvcnQgdG8gdXNlLgorICAtLXByb3RvY29sIHtiaW5hcnl9ICAgICAgICAgICAgIGJpbmFyeSAgICAgICBQcm90b2NvbCB0byB1c2UuCisgIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHByZXNlbnQsIHVzZSBTU0wvVExTLgorICAtLXRyYW5zcG9ydCB7YnVmZmVyZWR8ZnJhbWVkfSAgIGJ1ZmZlcmVkICAgICBUcmFuc3BvcnQgdG8gdXNlLgorCitFT0YKK30KKworbXkgJW9wdHMgPSAoCisgICAgJ3BvcnQnID0+IDkwOTAsCisgICAgJ3Byb3RvY29sJyA9PiAnYmluYXJ5JywKKyAgICAndHJhbnNwb3J0JyA9PiAnYnVmZmVyZWQnCispOworCitHZXRPcHRpb25zKFwlb3B0cywgcXcgKAorICAgIGNhPXMKKyAgICBjZXJ0PXMKKyAgICBjaXBoZXJzPXMKKyAgICBkb21haW4tc29ja2V0PXMKKyAgICBoZWxwCisgICAgaG9zdD1zCisgICAga2V5PXMKKyAgICBwb3J0PWkKKyAgICBwcm90b2NvbD1zCisgICAgc3NsCisgICAgdHJhbnNwb3J0PXMKKykpIHx8IGV4aXQgMTsKKworaWYgKCRvcHRze2hlbHB9KSB7CisgICAgdXNhZ2UoKTsKKyAgICBleGl0IDA7Cit9CisKK2lmICgkb3B0c3tzc2x9IGFuZCBub3QgZGVmaW5lZCAkb3B0c3tjZXJ0fSkgeworICAgIHVzYWdlKCk7CisgICAgZXhpdCAxOworfQorCitteSAkaGFuZGxlciAgICA9IFRocmlmdFRlc3RIYW5kbGVyLT5uZXcoKTsKK215ICRoYW5kbGVyMiAgID0gU2Vjb25kU2VydmljZUhhbmRsZXItPm5ldygpOworbXkgJHByb2Nlc3NvciAgPSBUaHJpZnRUZXN0OjpUaHJpZnRUZXN0UHJvY2Vzc29yLT5uZXcoJGhhbmRsZXIpOworbXkgJHByb2Nlc3NvcjIgPSBUaHJpZnRUZXN0OjpTZWNvbmRTZXJ2aWNlUHJvY2Vzc29yLT5uZXcoJGhhbmRsZXIyKTsKKworbXkgJHNlcnZlcnNvY2tldDsKK2lmICgkb3B0c3snZG9tYWluLXNvY2tldCd9KSB7CisgICAgdW5saW5rKCRvcHRzeydkb21haW4tc29ja2V0J30pOworICAgICRzZXJ2ZXJzb2NrZXQgPSBUaHJpZnQ6OlVuaXhTZXJ2ZXJTb2NrZXQtPm5ldygkb3B0c3snZG9tYWluLXNvY2tldCd9KTsKK30KK2Vsc2lmICgkb3B0c3tzc2x9KSB7CisgICAgJHNlcnZlcnNvY2tldCA9IFRocmlmdDo6U1NMU2VydmVyU29ja2V0LT5uZXcoXCVvcHRzKTsKK30KK2Vsc2UgeworICAgICRzZXJ2ZXJzb2NrZXQgPSBUaHJpZnQ6OlNlcnZlclNvY2tldC0+bmV3KFwlb3B0cyk7Cit9CitteSAkdHJhbnNwb3J0OworaWYgKCRvcHRze3RyYW5zcG9ydH0gZXEgJ2J1ZmZlcmVkJykgeworICAgICR0cmFuc3BvcnQgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS0+bmV3KCk7Cit9CitlbHNpZiAoJG9wdHN7dHJhbnNwb3J0fSBlcSAnZnJhbWVkJykgeworICAgICR0cmFuc3BvcnQgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydEZhY3RvcnktPm5ldygpOworfQorZWxzZSB7CisgICAgdXNhZ2UoKTsKKyAgICBleGl0IDE7Cit9CitteSAkcHJvdG9jb2w7CitpZiAoJG9wdHN7cHJvdG9jb2x9IGVxICdiaW5hcnknIHx8ICRvcHRze3Byb3RvY29sfSBlcSAnbXVsdGknKSB7CisgICAgJHByb3RvY29sID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnktPm5ldygpOworfQorZWxzZSB7CisgICAgdXNhZ2UoKTsKKyAgICBleGl0IDE7Cit9CisKK2lmIChpbmRleCgkb3B0c3twcm90b2NvbH0sICdtdWx0aScpID09IDApIHsKKyAgbXkgJG5ld1Byb2Nlc3NvciA9IFRocmlmdDo6TXVsdGlwbGV4ZWRQcm9jZXNzb3ItPm5ldygkcHJvdG9jb2wpOworICAkbmV3UHJvY2Vzc29yLT5kZWZhdWx0UHJvY2Vzc29yKCRwcm9jZXNzb3IpOworICAkbmV3UHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcignVGhyaWZ0VGVzdCcsICRwcm9jZXNzb3IpOworICAkbmV3UHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcignU2Vjb25kU2VydmljZScsICRwcm9jZXNzb3IyKTsKKyAgJHByb2Nlc3NvciA9ICRuZXdQcm9jZXNzb3I7Cit9CisKK215ICRzc2x0YWcgPSAnJzsKK2lmICgkb3B0c3tzc2x9KSB7CisgICAgJHNzbHRhZyA9ICcoU1NMKSc7Cit9CitteSAkbGlzdGVuaW5nX29uID0gIiRvcHRze3BvcnR9ICRzc2x0YWciOworaWYgKCRvcHRzeydkb21haW4tc29ja2V0J30pIHsKKyAgICAkbGlzdGVuaW5nX29uID0gJG9wdHN7J2RvbWFpbi1zb2NrZXQnfTsKK30KK215ICRzZXJ2ZXIgPSBUaHJpZnQ6OlNpbXBsZVNlcnZlci0+bmV3KCRwcm9jZXNzb3IsICRzZXJ2ZXJzb2NrZXQsICR0cmFuc3BvcnQsICRwcm90b2NvbCk7CitwcmludCBxcXxTdGFydGluZyAic2ltcGxlIiBzZXJ2ZXIgKCRvcHRze3RyYW5zcG9ydH0vJG9wdHN7cHJvdG9jb2x9KSBsaXN0ZW4gb246ICRsaXN0ZW5pbmdfb25cbnw7Ciskc2VydmVyLT5zZXJ2ZSgpOworcHJpbnQgImRvbmUuXG4iOworCitzdWIgc2lnaW50X2hhbmRsZXIgeworICBwcmludCAicmVjZWl2ZWQgU0lHSU5ULCBzdG9wcGluZy4uLlxuIjsKKyAgJHNlcnZlci0+c3RvcCgpOworfQorCisjIyMKKyMjIyBUZXN0IHNlcnZlciBpbXBsZW1lbnRhdGlvbgorIyMjCisKK3BhY2thZ2UgVGhyaWZ0VGVzdEhhbmRsZXI7CisKK3VzZSBiYXNlIHF3KCBUaHJpZnRUZXN0OjpUaHJpZnRUZXN0SWYgKTsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRzZWxmID0ge307CisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCAkY2xhc3NuYW1lKTsKK30KKworc3ViIHRlc3RWb2lkIHsKKyAgcHJpbnQoInRlc3RWb2lkKClcbiIpOworfQorCitzdWIgdGVzdFN0cmluZyB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludCgidGVzdFN0cmluZygkdGhpbmcpXG4iKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RCb29sIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIG15ICRzdHIgPSAkdGhpbmcgPyAndHJ1ZScgOiAnZmFsc2UnOworICBwcmludCgidGVzdEJvb2woJHN0cilcbiIpOworICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdEJ5dGUgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgcHJpbnQoInRlc3RCeXRlKCR0aGluZylcbiIpOworICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdEkzMiB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludCgidGVzdEkzMigkdGhpbmcpXG4iKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RJNjQgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgcHJpbnQoInRlc3RJNjQoJHRoaW5nKVxuIik7CisgIHJldHVybiAkdGhpbmc7Cit9CisKK3N1YiB0ZXN0RG91YmxlIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0RG91YmxlKCR0aGluZylcbiIpOworICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdEJpbmFyeSB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgICBteSBAYnl0ZXMgPSBzcGxpdCAvLywgJHRoaW5nOworICAgIHByaW50ICd0ZXN0QmluYXJ5KCc7CisgICAgcHJpbnRmKCAnJTAybHgnLCBvcmQgJF8gKSBmb3JlYWNoIChAYnl0ZXMpOworICAgIHByaW50ICIpXG4iOworICAgIHJldHVybiAkdGhpbmc7Cit9CisKK3N1YiB0ZXN0U3RydWN0IHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50ZihxcXx0ZXN0U3RydWN0KHsiJXMiLCAlZCwgJWQsICVsbGR9KVxufCwKKyAgICAgICAgICAgJHRoaW5nLT57c3RyaW5nX3RoaW5nfSwKKyAgICAgICAgICAgJHRoaW5nLT57Ynl0ZV90aGluZ30sCisgICAgICAgICAgICR0aGluZy0+e2kzMl90aGluZ30sCisgICAgICAgICAgICR0aGluZy0+e2k2NF90aGluZ30pOworICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdE5lc3QgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkbmVzdCA9IHNoaWZ0OworICBteSAkdGhpbmcgPSAkbmVzdC0+e3N0cnVjdF90aGluZ307CisgIHByaW50ZihxcXx0ZXN0TmVzdCh7JWQsIHsiJXMiLCAlZCwgJWQsICVsbGR9LCAlZH0pXG58LAorICAgICAgICAgICAkbmVzdC0+e2J5dGVfdGhpbmd9LAorICAgICAgICAgICAkdGhpbmctPntzdHJpbmdfdGhpbmd9LAorICAgICAgICAgICAkdGhpbmctPntieXRlX3RoaW5nfSwKKyAgICAgICAgICAgJHRoaW5nLT57aTMyX3RoaW5nfSwKKyAgICAgICAgICAgJHRoaW5nLT57aTY0X3RoaW5nfSwKKyAgICAgICAgICAgJG5lc3QtPntpMzJfdGhpbmd9KTsKKyAgcmV0dXJuICRuZXN0OworfQorCitzdWIgdGVzdE1hcCB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludGYgInRlc3RNYXAoeyVzfSlcbiIsCisgICAgam9pbiggJywgJywKKyAgICAgICAgICBtYXAgeyAkXyAuICcgPT4gJyAuICR0aGluZy0+eyRffSB9CisgICAgICAgICAgc29ydCBrZXlzICUkdGhpbmcKKyAgICApOworICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdFN0cmluZ01hcCB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludGYgInRlc3RTdHJpbmdNYXAoeyVzfSlcbiIsCisgICAgam9pbiggJywgJywKKyAgICAgICAgICBtYXAgeyAkXyAuICcgPT4gJyAuICR0aGluZy0+eyRffSB9CisgICAgICAgICAgc29ydCBrZXlzICUkdGhpbmcKKyAgICApOworICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdFNldCB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBteSBAcmVzdWx0ID0gc29ydCBrZXlzICUkdGhpbmc7CisgIHByaW50ZiAidGVzdFNldCh7JXN9KVxuIiwgam9pbignLCAnLCBAcmVzdWx0ICk7CisgIHJldHVybiBcQHJlc3VsdDsKK30KKworc3ViIHRlc3RMaXN0IHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50ICJ0ZXN0TGlzdCh7JXN9KVxuIiwgam9pbignLCAnLCBAJHRoaW5nKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RFbnVtIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50ICJ0ZXN0RW51bSgkdGhpbmcpXG4iOworICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdFR5cGVkZWYgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgcHJpbnQoInRlc3RUeXBlZGVmKCR0aGluZylcbiIpOworICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdE1hcE1hcCB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICRoZWxsbyA9IHNoaWZ0OworCisgIHByaW50ZigidGVzdE1hcE1hcCglZClcbiIsICRoZWxsbyk7CisgIG15ICRyZXN1bHQgPSB7IDQgPT4geyAxID0+IDEsIDIgPT4gMiwgMyA9PiAzLCA0ID0+IDQgfSwgLTQgPT4geyAtMSA9PiAtMSwgLTIgPT4gLTIsIC0zID0+IC0zLCAtNCA9PiAtNCB9IH07CisgIHJldHVybiAkcmVzdWx0OworfQorCitzdWIgdGVzdEluc2FuaXR5IHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJGFyZ3VtZW50ID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0SW5zYW5pdHkoKVxuIik7CisKKyAgbXkgJGhlbGxvID0gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoe3N0cmluZ190aGluZyA9PiAnSGVsbG8yJywgYnl0ZV90aGluZyA9PiAyLCBpMzJfdGhpbmcgPT4gMiwgaTY0X3RoaW5nID0+IDJ9KTsKKyAgbXkgQGhlbGxvczsKKyAgcHVzaChAaGVsbG9zLCAkaGVsbG8pOworICBteSAkZ29vZGJ5ZSA9IFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KHtzdHJpbmdfdGhpbmcgPT4gJ0dvb2RieWU0JywgYnl0ZV90aGluZyA9PiA0LCBpMzJfdGhpbmcgPT4gNCwgaTY0X3RoaW5nID0+IDR9KTsKKyAgbXkgQGdvb2RieWVzOworICBwdXNoKEBnb29kYnllcywgJGdvb2RieWUpOworICBteSAkY3JhenkgPSBUaHJpZnRUZXN0OjpJbnNhbml0eS0+bmV3KHt1c2VyTWFwID0+IHsgVGhyaWZ0VGVzdDo6TnVtYmVyejo6RUlHSFQgPT4gOCB9LCB4dHJ1Y3RzID0+IFxAZ29vZGJ5ZXN9KTsKKyAgbXkgJGxvb255ID0gVGhyaWZ0VGVzdDo6SW5zYW5pdHktPm5ldygpOworICBteSAkcmVzdWx0ID0geyAxID0+IHsgVGhyaWZ0VGVzdDo6TnVtYmVyejo6VFdPID0+ICRhcmd1bWVudCwgVGhyaWZ0VGVzdDo6TnVtYmVyejo6VEhSRUUgPT4gJGFyZ3VtZW50IH0sCisgICAgICAgICAgICAgICAgIDIgPT4geyBUaHJpZnRUZXN0OjpOdW1iZXJ6OjpTSVggPT4gJGxvb255IH0gfTsKKyAgcmV0dXJuICRyZXN1bHQ7Cit9CisKK3N1YiB0ZXN0TXVsdGkgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkYXJnMCA9IHNoaWZ0OworICBteSAkYXJnMSA9IHNoaWZ0OworICBteSAkYXJnMiA9IHNoaWZ0OworICBteSAkYXJnMyA9IHNoaWZ0OworICBteSAkYXJnNCA9IHNoaWZ0OworICBteSAkYXJnNSA9IHNoaWZ0OworCisgIHByaW50KCJ0ZXN0TXVsdGkoKVxuIik7CisgIHJldHVybiBUaHJpZnRUZXN0OjpYdHJ1Y3QtPm5ldyh7c3RyaW5nX3RoaW5nID0+ICdIZWxsbzInLCBieXRlX3RoaW5nID0+ICRhcmcwLCBpMzJfdGhpbmcgPT4gJGFyZzEsIGk2NF90aGluZyA9PiAkYXJnMn0pOworfQorCitzdWIgdGVzdEV4Y2VwdGlvbiB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICRhcmcgPSBzaGlmdDsKKyAgcHJpbnQoInRlc3RFeGNlcHRpb24oJGFyZylcbiIpOworICBpZiAoJGFyZyBlcSAnWGNlcHRpb24nKSB7CisgICAgICBkaWUgVGhyaWZ0VGVzdDo6WGNlcHRpb24tPm5ldyh7ZXJyb3JDb2RlID0+IDEwMDEsIG1lc3NhZ2UgPT4gJGFyZ30pOworICB9CisgIGVsc2lmICgkYXJnIGVxICdURXhjZXB0aW9uJykgeworICAgICAgZGllICdhc3RyaW5nJzsgIyBhbGwgdW5oYW5kbGVkIGV4Y2VwdGlvbnMgYmVjb21lIFRFeGNlcHRpb25zCisgIH0KKyAgZWxzZSB7CisgICAgICByZXR1cm4gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoe3N0cmluZ190aGluZyA9PiAkYXJnfSk7CisgIH0KK30KKworc3ViIHRlc3RNdWx0aUV4Y2VwdGlvbiB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICRhcmcwID0gc2hpZnQ7CisgIG15ICRhcmcxID0gc2hpZnQ7CisKKyAgcHJpbnRmKCJ0ZXN0TXVsdGlFeGNlcHRpb24oJXMsICVzKVxuIiwgJGFyZzAsICRhcmcxKTsKKyAgaWYgKCRhcmcwIGVxICdYY2VwdGlvbicpIHsKKyAgICBkaWUgVGhyaWZ0VGVzdDo6WGNlcHRpb24tPm5ldyh7ZXJyb3JDb2RlID0+IDEwMDEsIG1lc3NhZ2UgPT4gJ1RoaXMgaXMgYW4gWGNlcHRpb24nfSk7CisgIH0KKyAgZWxzaWYgKCRhcmcwIGVxICdYY2VwdGlvbjInKSB7CisgICAgbXkgJHN0cnVjdF90aGluZyA9IFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KHtzdHJpbmdfdGhpbmcgPT4gJ1RoaXMgaXMgYW4gWGNlcHRpb24yJ30pOworICAgIGRpZSBUaHJpZnRUZXN0OjpYY2VwdGlvbjItPm5ldyh7ZXJyb3JDb2RlID0+IDIwMDIsIHN0cnVjdF90aGluZyA9PiAkc3RydWN0X3RoaW5nfSk7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KHtzdHJpbmdfdGhpbmcgPT4gJGFyZzF9KTsKKyAgfQorfQorCitzdWIgdGVzdE9uZXdheSB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICRudW0gPSBzaGlmdDsKKyAgcHJpbnQoInRlc3RPbmV3YXkoJG51bSk6IHJlY2VpdmVkXG4iKTsKK30KKworIyMjCisjIyMgVGVzdCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyMjIworCitwYWNrYWdlIFNlY29uZFNlcnZpY2VIYW5kbGVyOworCit1c2UgYmFzZSBxdyggVGhyaWZ0VGVzdDo6U2Vjb25kU2VydmljZUlmICk7CisKK3N1YiBuZXcgeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiA9IHt9OworICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7Cit9CisKK3N1YiBzZWNvbmR0ZXN0U3RyaW5nIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0U3RyaW5nKCR0aGluZylcbiIpOworICByZXR1cm4gcXF8dGVzdFN0cmluZygiJHRoaW5nIil8OworfQorCisxOwpkaWZmIC0tZ2l0IGEvdGVzdC9waHAvTWFrZWZpbGUgYi90ZXN0L3BocC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEzNWM2ZS4uMDAwMDAwMAotLS0gYS90ZXN0L3BocC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIERlZmF1bHQgdGFyZ2V0IGlzIGV2ZXJ5dGhpbmcKLXRhcmdldDogYWxsCi0KLSMgVG9vbHMKLVRIUklGVCA9IC4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQKLQotYWxsOiBub3JtYWwgaW5saW5lCi0KLW5vcm1hbDogc3R1YnMKLQotaW5saW5lOiBzdHVicy1pbmxpbmUKLQotc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0Ci0JJChUSFJJRlQpIC0tZ2VuIHBocCAuLi9UaHJpZnRUZXN0LnRocmlmdAotCi1zdHVicy1pbmxpbmU6IC4uL1RocmlmdFRlc3QudGhyaWZ0Ci0JJChUSFJJRlQpIC0tZ2VuIHBocDppbmxpbmVkIC4uL1RocmlmdFRlc3QudGhyaWZ0Ci0KLWNsZWFuOgotCSQoUk0pIC1yIGdlbi1waHAgZ2VuLXBocGkKZGlmZiAtLWdpdCBhL3Rlc3QvcGhwL01ha2VmaWxlLmFtIGIvdGVzdC9waHAvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzJmN2ZjNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcGhwL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzdHViczogLi4vVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gcGhwIC4uL1RocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIHBocDppbmxpbmVkIC4uL1RocmlmdFRlc3QudGhyaWZ0CisJJChNS0RJUl9QKSBnZW4tcGhwLWNsYXNzbWFwCisJJChUSFJJRlQpIC1vdXQgZ2VuLXBocC1jbGFzc21hcCAtLWdlbiBwaHAgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKworcGhwX2V4dF9kaXI6CisJbWtkaXIgLXAgcGhwX2V4dF9kaXIKKwlsbiAtcyAuLi8uLi8uLi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL21vZHVsZXMvdGhyaWZ0X3Byb3RvY29sLnNvIHBocF9leHRfZGlyLworCWxuIC1zICIkJChwaHAtY29uZmlnIC0tZXh0ZW5zaW9uLWRpcikvc29ja2V0cy5zbyIgcGhwX2V4dF9kaXIvCisKK3ByZWNyb3NzOiBzdHVicyBwaHBfZXh0X2RpcgorCitjaGVjazogc3R1YnMgcGhwX2V4dF9kaXIKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLXBocCBnZW4tcGhwaSBnZW4tcGhwLWNsYXNzbWFwIHBocF9leHRfZGlyCisKK2NsaWVudDogc3R1YnMgcGhwX2V4dF9kaXIKKwlwaHAgVGVzdENsaWVudC5waHAKZGlmZiAtLWdpdCBhL3Rlc3QvcGhwL1Rlc3RDbGFzc21hcC5waHAgYi90ZXN0L3BocC9UZXN0Q2xhc3NtYXAucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZDE1OTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3BocC9UZXN0Q2xhc3NtYXAucGhwCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworPD9waHAKKyRHRU5fRElSID0gJ2dlbi1waHAtY2xhc3NtYXAnOworaW5jbHVkZV9vbmNlKCdUZXN0Q2xpZW50LnBocCcpOworPz4KZGlmZiAtLWdpdCBhL3Rlc3QvcGhwL1Rlc3RDbGllbnQucGhwIGIvdGVzdC9waHAvVGVzdENsaWVudC5waHAKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA2NTNiODY1Li5hY2Q5MDFkCi0tLSBhL3Rlc3QvcGhwL1Rlc3RDbGllbnQucGhwCisrKyBiL3Rlc3QvcGhwL1Rlc3RDbGllbnQucGhwCkBAIC0xLDQgKzEsMjggQEAKIDw/cGhwCisKK25hbWVzcGFjZSB0ZXN0XHBocDsKKworLyoqIEB2YXIgXENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyICRsb2FkZXIgKi8KKyRsb2FkZXIgPSByZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworCit1c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOworCitpZiAoIWlzc2V0KCRHRU5fRElSKSkgeworICAkR0VOX0RJUiA9ICdnZW4tcGhwJzsKK30KK2lmICghaXNzZXQoJE1PREUpKSB7CisgICRNT0RFID0gJ25vcm1hbCc7Cit9CisKKworaWYgKCRHRU5fRElSID09ICdnZW4tcGhwJykgeworICAkbG9hZGVyLT5hZGRQc3I0KCcnLCAkR0VOX0RJUik7Cit9IGVsc2UgeworICAkbG9hZGVyID0gbmV3IFRocmlmdENsYXNzTG9hZGVyKCk7CisgICRsb2FkZXItPnJlZ2lzdGVyRGVmaW5pdGlvbignVGhyaWZ0VGVzdCcsICRHRU5fRElSKTsKKyAgJGxvYWRlci0+cmVnaXN0ZXIoKTsKK30KKwogLyoKICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0xOCw0MCArNDIsNDAgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLWlmICghaXNzZXQoJEdFTl9ESVIpKSB7Ci0gICRHRU5fRElSID0gJ2dlbi1waHAnOwotfQotaWYgKCFpc3NldCgkTU9ERSkpIHsKLSAgJE1PREUgPSAnbm9ybWFsJzsKLX0KLQotLyoqIFNldCB0aGUgVGhyaWZ0IHJvb3QgKi8KLSRHTE9CQUxTWydUSFJJRlRfUk9PVCddID0gJy4uLy4uL2xpYi9waHAvc3JjJzsKLQogLyoqIEluY2x1ZGUgdGhlIFRocmlmdCBiYXNlICovCi1yZXF1aXJlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9UaHJpZnQucGhwJzsKLQotLyoqIEluY2x1ZGUgdGhlIGJpbmFyeSBwcm90b2NvbCAqLwotcmVxdWlyZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocCc7CisvKiogSW5jbHVkZSB0aGUgcHJvdG9jb2xzICovCit1c2UgVGhyaWZ0XFByb3RvY29sXFRCaW5hcnlQcm90b2NvbDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQ7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRDb21wYWN0UHJvdG9jb2w7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRKU09OUHJvdG9jb2w7CiAKIC8qKiBJbmNsdWRlIHRoZSBzb2NrZXQgbGF5ZXIgKi8KLXJlcXVpcmVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3RyYW5zcG9ydC9UU29ja2V0UG9vbC5waHAnOwordXNlIFRocmlmdFxUcmFuc3BvcnRcVFNvY2tldDsKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRTb2NrZXRQb29sOwogCiAvKiogSW5jbHVkZSB0aGUgc29ja2V0IGxheWVyICovCi1yZXF1aXJlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAnOwotcmVxdWlyZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvdHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAnOwordXNlIFRocmlmdFxUcmFuc3BvcnRcVEZyYW1lZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRCdWZmZXJlZFRyYW5zcG9ydDsKIAotZWNobyAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PScuIlxuIjsKLWVjaG8gJyBTQUZFIFRPIElHTk9SRSBUSEVTRSBJTiBURVNUJy4iXG4iOwotZWNobyAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PScuIlxuIjsKK2Z1bmN0aW9uIG1ha2VQcm90b2NvbCgkdHJhbnNwb3J0LCAkUFJPVE8pCit7CisgIGlmICgkUFJPVE8gPT0gJ2JpbmFyeScpIHsKKyAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKKyAgfSBlbHNlIGlmICgkUFJPVE8gPT0gJ2NvbXBhY3QnKSB7CisgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sKCR0cmFuc3BvcnQpOworICB9IGVsc2UgaWYgKCRQUk9UTyA9PSAnanNvbicpIHsKKyAgICByZXR1cm4gbmV3IFRKU09OUHJvdG9jb2woJHRyYW5zcG9ydCk7CisgIH0gZWxzZSBpZiAoJFBST1RPID09ICdhY2NlbCcpIHsKKyAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeScpKSB7CisgICAgICBlY2hvICJBY2NlbGVyYXRpb24gZXh0ZW5zaW9uIGlzIG5vdCBsb2FkZWRcbiI7CisgICAgICBleGl0KDEpOworICAgIH0KKyAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKCR0cmFuc3BvcnQpOworICB9CiAKLS8qKiBJbmNsdWRlIHRoZSBnZW5lcmF0ZWQgY29kZSAqLwotcmVxdWlyZV9vbmNlICRHRU5fRElSLicvVGhyaWZ0VGVzdC9UaHJpZnRUZXN0LnBocCc7Ci1yZXF1aXJlX29uY2UgJEdFTl9ESVIuJy9UaHJpZnRUZXN0L1RocmlmdFRlc3RfdHlwZXMucGhwJzsKLQotZWNobyAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PScuIlxuIjsKLWVjaG8gJyBFTkQgT0YgU0FGRSBFUlJPUlMgU0VDVElPTicuIlxuIjsKLWVjaG8gJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nLiJcblxuIjsKKyAgZWNobyAiLS1wcm90b2NvbCBtdXN0IGJlIG9uZSBvZiB7YmluYXJ5fGNvbXBhY3R8anNvbnxhY2NlbH1cbiI7CisgIGV4aXQoMSk7Cit9CiAKICRob3N0ID0gJ2xvY2FsaG9zdCc7CiAkcG9ydCA9IDkwOTA7CkBAIC02NCw2ICs4OCwxNiBAQAogICAkaG9zdCA9ICRhcmd2WzFdOwogfQogCitmb3JlYWNoICgkYXJndiBhcyAkYXJnKSB7CisgIGlmIChzdWJzdHIoJGFyZywgMCwgNykgPT0gJy0tcG9ydD0nKSB7CisgICAgJHBvcnQgPSBzdWJzdHIoJGFyZywgNyk7CisgIH0gZWxzZSBpZiAoc3Vic3RyKCRhcmcsIDAsIDEyKSA9PSAnLS10cmFuc3BvcnQ9JykgeworICAgICRNT0RFID0gc3Vic3RyKCRhcmcsIDEyKTsKKyAgfSBlbHNlIGlmIChzdWJzdHIoJGFyZywgMCwgMTEpID09ICctLXByb3RvY29sPScpIHsKKyAgICAkUFJPVE8gPSBzdWJzdHIoJGFyZywgMTEpOworICB9Cit9CisKICRob3N0cyA9IGFycmF5KCdsb2NhbGhvc3QnKTsKIAogJHNvY2tldCA9IG5ldyBUU29ja2V0KCRob3N0LCAkcG9ydCk7CkBAIC03MiwyMyArMTA2LDI5IEBACiAKIGlmICgkTU9ERSA9PSAnaW5saW5lJykgewogICAkdHJhbnNwb3J0ID0gJHNvY2tldDsKLSAgJHRlc3RDbGllbnQgPSBuZXcgVGhyaWZ0VGVzdENsaWVudCgkdHJhbnNwb3J0KTsKKyAgJHRlc3RDbGllbnQgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdENsaWVudCgkdHJhbnNwb3J0KTsKIH0gZWxzZSBpZiAoJE1PREUgPT0gJ2ZyYW1lZCcpIHsKICAgJGZyYW1lZFNvY2tldCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KCRzb2NrZXQpOwogICAkdHJhbnNwb3J0ID0gJGZyYW1lZFNvY2tldDsKLSAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKLSAgJHRlc3RDbGllbnQgPSBuZXcgVGhyaWZ0VGVzdENsaWVudCgkcHJvdG9jb2wpOworICAkcHJvdG9jb2wgPSBtYWtlUHJvdG9jb2woJHRyYW5zcG9ydCwgJFBST1RPKTsKKyAgJHRlc3RDbGllbnQgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdENsaWVudCgkcHJvdG9jb2wpOwogfSBlbHNlIHsKICAgJGJ1ZmZlcmVkU29ja2V0ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgkc29ja2V0LCAxMDI0LCAxMDI0KTsKICAgJHRyYW5zcG9ydCA9ICRidWZmZXJlZFNvY2tldDsKLSAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKLSAgJHRlc3RDbGllbnQgPSBuZXcgVGhyaWZ0VGVzdENsaWVudCgkcHJvdG9jb2wpOworICAkcHJvdG9jb2wgPSBtYWtlUHJvdG9jb2woJHRyYW5zcG9ydCwgJFBST1RPKTsKKyAgJHRlc3RDbGllbnQgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdENsaWVudCgkcHJvdG9jb2wpOwogfQogCiAkdHJhbnNwb3J0LT5vcGVuKCk7CiAKICRzdGFydCA9IG1pY3JvdGltZSh0cnVlKTsKIAorZGVmaW5lKCdFUlJfQkFTRVRZUEVTJywgMSk7CitkZWZpbmUoJ0VSUl9TVFJVQ1RTJywgMik7CitkZWZpbmUoJ0VSUl9DT05UQUlORVJTJywgNCk7CitkZWZpbmUoJ0VSUl9FWENFUFRJT05TJywgOCk7CitkZWZpbmUoJ0VSUl9VTktOT1dOJywgNjQpOworJGV4aXRjb2RlID0gMDsKIC8qKgogICogVk9JRCBURVNUCiAgKi8KQEAgLTk2LDQ2ICsxMzYsNjMgQEAKICR0ZXN0Q2xpZW50LT50ZXN0Vm9pZCgpOwogcHJpbnRfcigiID0gdm9pZFxuIik7CiAKK2Z1bmN0aW9uIHJvdW5kdHJpcCgkdGVzdENsaWVudCwgJG1ldGhvZCwgJHZhbHVlKSB7CisgIGdsb2JhbCAkZXhpdGNvZGU7CisgIHByaW50X3IoIiRtZXRob2QoJHZhbHVlKSIpOworICAkcmV0ID0gJHRlc3RDbGllbnQtPiRtZXRob2QoJHZhbHVlKTsKKyAgcHJpbnRfcigiID0gXCIkcmV0XCJcbiIpOworICBpZiAoJHZhbHVlICE9PSAkcmV0KSB7CisgICAgcHJpbnRfcigiKioqIEZBSUxFRCAqKipcbiIpOworICAgICRleGl0Y29kZSB8PSBFUlJfQkFTRVRZUEVTOworICB9Cit9CisKIC8qKgogICogU1RSSU5HIFRFU1QKICAqLwotcHJpbnRfcigidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKLSRzID0gJHRlc3RDbGllbnQtPnRlc3RTdHJpbmcoIlRlc3QiKTsKLXByaW50X3IoIiA9IFwiJHNcIlxuIik7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0U3RyaW5nJywgIlRlc3QiKTsKKworLyoqCisgKiBCT09MIFRFU1QKKyAqLworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEJvb2wnLCB0cnVlKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RCb29sJywgZmFsc2UpOwogCiAvKioKICAqIEJZVEUgVEVTVAogICovCi1wcmludF9yKCJ0ZXN0Qnl0ZSgxKSIpOwotJHU4ID0gJHRlc3RDbGllbnQtPnRlc3RCeXRlKDEpOwotcHJpbnRfcigiID0gJHU4XG4iKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RCeXRlJywgMSk7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0Qnl0ZScsIC0xKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RCeXRlJywgMTI3KTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RCeXRlJywgLTEyOCk7CiAKIC8qKgogICogSTMyIFRFU1QKICAqLwotcHJpbnRfcigidGVzdEkzMigtMSkiKTsKLSRpMzIgPSAkdGVzdENsaWVudC0+dGVzdEkzMigtMSk7Ci1wcmludF9yKCIgPSAkaTMyXG4iKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJMzInLCAtMSk7CiAKIC8qKgogICogSTY0IFRFU1QKICAqLwotcHJpbnRfcigidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7Ci0kaTY0ID0gJHRlc3RDbGllbnQtPnRlc3RJNjQoLTM0MzU5NzM4MzY4KTsKLXByaW50X3IoIiA9ICRpNjRcbiIpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEk2NCcsIDApOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEk2NCcsIDEpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEk2NCcsIC0xKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJNjQnLCAtMzQzNTk3MzgzNjgpOwogCiAvKioKICAqIERPVUJMRSBURVNUCiAgKi8KLXByaW50X3IoInRlc3REb3VibGUoLTg1Mi4yMzQyMzQyMzQpIik7Ci0kZHViID0gJHRlc3RDbGllbnQtPnRlc3REb3VibGUoLTg1Mi4yMzQyMzQyMzQpOwotcHJpbnRfcigiID0gJGR1YlxuIik7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0RG91YmxlJywgLTg1Mi4yMzQyMzQyMzQpOworCisvKioKKyAqIEJJTkFSWSBURVNUICAtLSAgVE9ETworICovCiAKIC8qKgogICogU1RSVUNUIFRFU1QKICAqLwogcHJpbnRfcigidGVzdFN0cnVjdCh7XCJaZXJvXCIsIDEsIC0zLCAtNX0pIik7Ci0kb3V0ID0gbmV3IFRocmlmdFRlc3RfWHRydWN0KCk7Ciskb3V0ID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdCgpOwogJG91dC0+c3RyaW5nX3RoaW5nID0gIlplcm8iOwogJG91dC0+Ynl0ZV90aGluZyA9IDE7CiAkb3V0LT5pMzJfdGhpbmcgPSAtMzsKQEAgLTE0NiwxMSArMjAzLDE2IEBACiAgICAgICAgICRpbi0+aTMyX3RoaW5nLiIsICIuCiAgICAgICAgICRpbi0+aTY0X3RoaW5nLiJ9XG4iKTsKIAoraWYgKCRpbiAhPSAkb3V0KSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CisKIC8qKgogICogTkVTVEVEIFNUUlVDVCBURVNUCiAgKi8KIHByaW50X3IoInRlc3ROZXN0KHsxLCB7XCJaZXJvXCIsIDEsIC0zLCAtNX0pLCA1fSIpOwotJG91dDIgPSBuZXcgVGhyaWZ0VGVzdF9YdHJ1Y3QyKCk7Ciskb3V0MiA9IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QyKCk7CiAkb3V0Mi0+Ynl0ZV90aGluZyA9IDE7CiAkb3V0Mi0+c3RydWN0X3RoaW5nID0gJG91dDsKICRvdXQyLT5pMzJfdGhpbmcgPSA1OwpAQCAtMTYzLDYgKzIyNSwxMSBAQAogICAgICAgICAkaW4tPmk2NF90aGluZy4ifSwgIi4KICAgICAgICAgJGluMi0+aTMyX3RoaW5nLiJ9XG4iKTsKIAoraWYgKCRpbjIgIT0gJG91dDIpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30KKwogLyoqCiAgKiBNQVAgVEVTVAogICovCkBAIC0xOTUsMzYgKzI2Miw2OSBAQAogfQogcHJpbnRfcigifVxuIik7CiAKK2lmICgkbWFwaW4gIT0gJG1hcG91dCkgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9DT05UQUlORVJTOworfQorCiskbWFwb3V0ID0gYXJyYXkoKTsKK2ZvciAoJGkgPSAwOyAkaSA8IDEwOyAkaSsrKSB7CisgICAgJG1hcG91dFsia2V5JGkiXSA9ICJ2YWwkaSI7Cit9CitwcmludF9yKCd0ZXN0U3RyaW5nTWFwKHsnKTsKKyRmaXJzdCA9IHRydWU7Citmb3JlYWNoICgkbWFwb3V0IGFzICRrZXkgPT4gJHZhbCkgeworICBpZiAoJGZpcnN0KSB7CisgICAgJGZpcnN0ID0gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgcHJpbnRfcigiLCAiKTsKKyAgfQorICBwcmludF9yKCJcIiRrZXlcIiA9PiBcIiR2YWxcIiIpOworfQorcHJpbnRfcigifSkiKTsKKyRtYXBpbiA9ICR0ZXN0Q2xpZW50LT50ZXN0U3RyaW5nTWFwKCRtYXBvdXQpOworcHJpbnRfcigiID0geyIpOworJGZpcnN0ID0gdHJ1ZTsKK2ZvcmVhY2ggKCRtYXBpbiBhcyAka2V5ID0+ICR2YWwpIHsKKyAgaWYgKCRmaXJzdCkgeworICAgICRmaXJzdCA9IGZhbHNlOworICB9IGVsc2UgeworICAgIHByaW50X3IoIiwgIik7CisgIH0KKyAgcHJpbnRfcigiXCIka2V5XCIgPT4gXCIkdmFsXCIiKTsKK30KK3ByaW50X3IoIn1cbiIpOwora3NvcnQoJG1hcGluKTsKK2lmICgkbWFwaW4gIT0gJG1hcG91dCkgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9DT05UQUlORVJTOworfQorCiAvKioKICAqIFNFVCBURVNUCiAgKi8KICRzZXRvdXQgPSBhcnJheSgpOzsKIGZvciAoJGkgPSAtMjsgJGkgPCAzOyArKyRpKSB7Ci0gICRzZXRvdXQgW109ICRpOworICAkc2V0b3V0WyRpXT0gdHJ1ZTsKIH0KIHByaW50X3IoInRlc3RTZXQoeyIpOwotJGZpcnN0ID0gdHJ1ZTsKLWZvcmVhY2ggKCRzZXRvdXQgYXMgJHZhbCkgewotICBpZiAoJGZpcnN0KSB7Ci0gICAgJGZpcnN0ID0gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRfcigiLCAiKTsKLSAgfQotICBwcmludF9yKCR2YWwpOwotfQorZWNobyBpbXBsb2RlKCcsJywgYXJyYXlfa2V5cygkc2V0b3V0KSk7CiBwcmludF9yKCJ9KSIpOwogJHNldGluID0gJHRlc3RDbGllbnQtPnRlc3RTZXQoJHNldG91dCk7CiBwcmludF9yKCIgPSB7Iik7Ci0kZmlyc3QgPSB0cnVlOwotZm9yZWFjaCAoJHNldGluIGFzICR2YWwpIHsKLSAgaWYgKCRmaXJzdCkgewotICAgICRmaXJzdCA9IGZhbHNlOwotICB9IGVsc2UgewotICAgIHByaW50X3IoIiwgIik7Ci0gIH0KLSAgcHJpbnRfcigkdmFsKTsKLX0KK2VjaG8gaW1wbG9kZSgnLCAnLCBhcnJheV9rZXlzKCRzZXRpbikpOwogcHJpbnRfcigifVxuIik7CisvLyBPcmRlciBvZiBrZXlzIGluIHNldCBkb2VzIG5vdCBtYXR0ZXIKK2tzb3J0KCRzZXRpbik7CitpZiAoJHNldG91dCAhPT0gJHNldGluKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7Cit9CisvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGNvcnJ1cHRlZCBhcnJheQoraWYgKCRzZXRpblsyXSAhPT0gJHNldG91dFsyXSB8fCBpc19pbnQoJHNldGluWzJdKSkgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9DT05UQUlORVJTOworfQogCiAvKioKICAqIExJU1QgVEVTVApAQCAtMjU2LDI5ICszNTYsNTMgQEAKICAgcHJpbnRfcigkdmFsKTsKIH0KIHByaW50X3IoIn1cbiIpOworaWYgKCRsaXN0aW4gIT09ICRsaXN0b3V0KSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7Cit9CiAKIC8qKgogICogRU5VTSBURVNUCiAgKi8KIHByaW50X3IoInRlc3RFbnVtKE9ORSkiKTsKLSRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oVGhyaWZ0VGVzdF9OdW1iZXJ6OjpPTkUpOworJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpPTkUpOwogcHJpbnRfcigiID0gJHJldFxuIik7CitpZiAoJHJldCAhPSBcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpPTkUpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30KIAogcHJpbnRfcigidGVzdEVudW0oVFdPKSIpOwotJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShUaHJpZnRUZXN0X051bWJlcno6OlRXTyk7CiskcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFxUaHJpZnRUZXN0XE51bWJlcno6OlRXTyk7CiBwcmludF9yKCIgPSAkcmV0XG4iKTsKK2lmICgkcmV0ICE9IFxUaHJpZnRUZXN0XE51bWJlcno6OlRXTykgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9TVFJVQ1RTOworfQogCiBwcmludF9yKCJ0ZXN0RW51bShUSFJFRSkiKTsKLSRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oVGhyaWZ0VGVzdF9OdW1iZXJ6OjpUSFJFRSk7CiskcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFxUaHJpZnRUZXN0XE51bWJlcno6OlRIUkVFKTsKIHByaW50X3IoIiA9ICRyZXRcbiIpOworaWYgKCRyZXQgIT0gXFRocmlmdFRlc3RcTnVtYmVyejo6VEhSRUUpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30KIAogcHJpbnRfcigidGVzdEVudW0oRklWRSkiKTsKLSRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oVGhyaWZ0VGVzdF9OdW1iZXJ6OjpGSVZFKTsKKyRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oXFRocmlmdFRlc3RcTnVtYmVyejo6RklWRSk7CiBwcmludF9yKCIgPSAkcmV0XG4iKTsKK2lmICgkcmV0ICE9IFxUaHJpZnRUZXN0XE51bWJlcno6OkZJVkUpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30KIAogcHJpbnRfcigidGVzdEVudW0oRUlHSFQpIik7Ci0kcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFRocmlmdFRlc3RfTnVtYmVyejo6RUlHSFQpOworJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpFSUdIVCk7CiBwcmludF9yKCIgPSAkcmV0XG4iKTsKK2lmICgkcmV0ICE9IFxUaHJpZnRUZXN0XE51bWJlcno6OkVJR0hUKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CiAKIC8qKgogICogVFlQRURFRiBURVNUCkBAIC0yODYsNiArNDEwLDEwIEBACiBwcmludF9yKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CiAkdWlkID0gJHRlc3RDbGllbnQtPnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMyk7CiBwcmludF9yKCIgPSAkdWlkXG4iKTsKK2lmICgkdWlkICE9PSAzMDk4NTgyMzUwODI1MjMpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30KIAogLyoqCiAgKiBORVNURUQgTUFQIFRFU1QKQEAgLTMwMSwxMyArNDI5LDIxIEBACiAgIHByaW50X3IoIn0sICIpOwogfQogcHJpbnRfcigifVxuIik7CiskZXhwZWN0ZWRfbW0gPSBbCisgIC00ID0+IFstNCA9PiAtNCwgLTMgPT4gLTMsIC0yID0+IC0yLCAtMSA9PiAtMV0sCisgIDQgPT4gWzQgPT4gNCwgMyA9PiAzLCAyID0+IDIsIDEgPT4gMV0sCitdOworaWYgKCRtbSAhPSAkZXhwZWN0ZWRfbW0pIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKK30KIAogLyoqCiAgKiBJTlNBTklUWSBURVNUCiAgKi8KLSRpbnNhbmUgPSBuZXcgVGhyaWZ0VGVzdF9JbnNhbml0eSgpOwotJGluc2FuZS0+dXNlck1hcFtUaHJpZnRUZXN0X051bWJlcno6OkZJVkVdID0gNTAwMDsKLSR0cnVjayA9IG5ldyBUaHJpZnRUZXN0X1h0cnVjdCgpOworJGluc2FuZSA9IG5ldyBcVGhyaWZ0VGVzdFxJbnNhbml0eSgpOworJGluc2FuZS0+dXNlck1hcFtcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpGSVZFXSA9IDUwMDA7CiskdHJ1Y2sgPSBuZXcgXFRocmlmdFRlc3RcWHRydWN0KCk7CiAkdHJ1Y2stPnN0cmluZ190aGluZyA9ICJUcnVjayI7CiAkdHJ1Y2stPmJ5dGVfdGhpbmcgPSA4OwogJHRydWNrLT5pMzJfdGhpbmcgPSA4OwpAQCAtMzUyLDEwICs0ODgsMjkgQEAKIHRyeSB7CiAgICR0ZXN0Q2xpZW50LT50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpOwogICBwcmludF9yKCIgIHZvaWRcbkZBSUxVUkVcbiIpOwotfSBjYXRjaCAoVGhyaWZ0VGVzdF9YY2VwdGlvbiAkeCkgeworICAkZXhpdGNvZGUgfD0gRVJSX0VYQ0VQVElPTlM7Cit9IGNhdGNoIChcVGhyaWZ0VGVzdFxYY2VwdGlvbiAkeCkgewogICBwcmludF9yKCcgY2F1Z2h0IHhjZXB0aW9uICcuJHgtPmVycm9yQ29kZS4nOiAnLiR4LT5tZXNzYWdlLiJcbiIpOwogfQogCisvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIFRIUklGVC00MjYzCitwcmludF9yKCJ0ZXN0QmluYXJ5U2VyaWFsaXplcl9EZXNlcmlhbGl6ZSgnZm9vJykiKTsKK3RyeSB7CisgIFxUaHJpZnRcU2VyaWFsaXplclxUQmluYXJ5U2VyaWFsaXplcjo6ZGVzZXJpYWxpemUoYmFzZTY0X2RlY29kZSgnZm9vJyksIFxUaHJpZnRUZXN0XFh0cnVjdDI6OmNsYXNzKTsKKyAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgJGV4aXRjb2RlIHw9IEVSUl9TVFJVQ1RTOworfSBjYXRjaCAoXFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbiAkaGFwcHlfZXhjZXB0aW9uKSB7CisgIC8vIFdlIGV4cGVjdGVkIHRoaXMgZHVlIHRvIGJpbmFyeSBkYXRhIG9mIGJhc2U2NF9kZWNvZGUoJ2ZvbycpIGlzIGxlc3MgdGhlbiA0CisgIC8vIGJ5dGVzIGFuZCBpdCB0cmllcyB0byBmaW5kIHRocmlmdCB2ZXJzaW9uIG51bWJlciBpbiB0aGUgdHJhbnNwb3J0IGJ5CisgIC8vIHJlYWRpbmcgaTMyKCkgYXQgdGhlIGJlZ2lubmluZy4gIENhc3RpbmcgdG8gc3RyaW5nIHZhbGlkYXRlcyB0aGF0CisgIC8vIGV4Y2VwdGlvbiBpcyBzdGlsbCBhY2Nlc3NpYmxlIGluIG1lbW9yeSBhbmQgbm90IGNvcnJ1cHRlZC4gIFdpdGhvdXQgcGF0Y2gsCisgIC8vIFBIUCB3aWxsIGVycm9yIGxvZyB0aGF0IHRoZSBleGNlcHRpb24gZG9lc24ndCBoYXZlIGFueSB0b3N0cmluZyBtZXRob2QsCisgIC8vIHdoaWNoIGlzIGEgbGllIGR1ZSB0byBjb3JydXB0ZWQgbWVtb3J5LgorICBmb3IoJGk9OTk7ICRpID4gMDsgJGktLSkgeworICAgIChzdHJpbmcpJGhhcHB5X2V4Y2VwdGlvbjsKKyAgfQorICBwcmludF9yKCIgIFNVQ0NFU1NcbiIpOworfQogCiAvKioKICAqIE5vcm1hbCB0ZXN0cyBkb25lLgpAQCAtMzY5LDM0ICs1MjQsMzQgQEAKICAqIEV4dHJhbmVvdXMgIkkgZG9uJ3QgdHJ1c3QgUEhQIHRvIHBhY2svdW5wYWNrIGludGVnZXIiIHRlc3RzCiAgKi8KIAoraWYgKCRwcm90b2NvbCBpbnN0YW5jZW9mIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKSB7CisgICAgLy8gUmVncmVzc2lvbiBjaGVjazogY2hlY2sgdGhhdCBtZXRob2QgbmFtZSBpcyBub3QgZG91YmxlLWZyZWVkCisgICAgLy8gTWV0aG9kIG5hbWUgc2hvdWxkIG5vdCBiZSBhbiBpbnRlcm5lZCBzdHJpbmcuCisgICAgJG1ldGhvZF9uYW1lID0gIlZvaWQiOworICAgICRtZXRob2RfbmFtZSA9ICJ0ZXN0JG1ldGhvZF9uYW1lIjsKKworICAgICRzZXFpZCA9IDA7CisgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Vm9pZF9hcmdzKCk7CisgICAgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgkcHJvdG9jb2wsICRtZXRob2RfbmFtZSwgXFRocmlmdFxUeXBlXFRNZXNzYWdlVHlwZTo6Q0FMTCwgJGFyZ3MsICRzZXFpZCwgJHByb3RvY29sLT5pc1N0cmljdFdyaXRlKCkpOworICAgICR0ZXN0Q2xpZW50LT5yZWN2X3Rlc3RWb2lkKCk7CisKK30KKwogLy8gTWF4IEkzMgogJG51bSA9IHBvdygyLCAzMCkgKyAocG93KDIsIDMwKSAtIDEpOwotJG51bTIgPSAkdGVzdENsaWVudC0+dGVzdEkzMigkbnVtKTsKLWlmICgkbnVtICE9ICRudW0yKSB7Ci0gIHByaW50ICJNaXNzZWQgJG51bSA9ICRudW0yXG4iOwotfQorcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEkzMicsICRudW0pOwogCiAvLyBNaW4gSTMyCiAkbnVtID0gMCAtIHBvdygyLCAzMSk7Ci0kbnVtMiA9ICR0ZXN0Q2xpZW50LT50ZXN0STMyKCRudW0pOwotaWYgKCRudW0gIT0gJG51bTIpIHsKLSAgcHJpbnQgIk1pc3NlZCAkbnVtID0gJG51bTJcbiI7Ci19Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STMyJywgJG51bSk7CiAKIC8vIE1heCBJNjQKICRudW0gPSBwb3coMiwgNjIpICsgKHBvdygyLCA2MikgLSAxKTsKLSRudW0yID0gJHRlc3RDbGllbnQtPnRlc3RJNjQoJG51bSk7Ci1pZiAoJG51bSAhPSAkbnVtMikgewotICBwcmludCAiTWlzc2VkICRudW0gPSAkbnVtMlxuIjsKLX0KK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJNjQnLCAkbnVtKTsKIAogLy8gTWluIEk2NAotJG51bSA9IDAgLSBwb3coMiwgNjMpOwotJG51bTIgPSAkdGVzdENsaWVudC0+dGVzdEk2NCgkbnVtKTsKLWlmICgkbnVtICE9ICRudW0yKSB7Ci0gIHByaW50ICJNaXNzZWQgJG51bSA9ICRudW0yXG4iOwotfQorJG51bSA9IDAgLSBwb3coMiwgNjIpIC0gcG93KDIsIDYyKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJNjQnLCAkbnVtKTsKIAogJHRyYW5zcG9ydC0+Y2xvc2UoKTsKLXJldHVybjsKLQorZXhpdCgkZXhpdGNvZGUpOwpkaWZmIC0tZ2l0IGEvdGVzdC9waHAvdGVzdF9waHAuaW5pIGIvdGVzdC9waHAvdGVzdF9waHAuaW5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOWJiMjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3BocC90ZXN0X3BocC5pbmkKQEAgLTAsMCArMSwyIEBACitleHRlbnNpb249dGhyaWZ0X3Byb3RvY29sLnNvCitleHRlbnNpb249c29ja2V0cy5zbwpkaWZmIC0tZ2l0IGEvdGVzdC9weS50b3JuYWRvL01ha2VmaWxlLmFtIGIvdGVzdC9weS50b3JuYWRvL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZTY4MGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5LnRvcm5hZG8vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVCA9ICQodG9wX3NyY2RpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCit0aHJpZnRfZ2VuOiAuLi9UaHJpZnRUZXN0LnRocmlmdCAuLi9TbWFsbFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIHB5OnRvcm5hZG8gLi4vVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gcHk6dG9ybmFkbyAuLi9TbWFsbFRlc3QudGhyaWZ0CisKK2NoZWNrOiB0aHJpZnRfZ2VuCisJLi90ZXN0X3N1aXRlLnB5CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1weS50b3JuYWRvCmRpZmYgLS1naXQgYS90ZXN0L3B5LnRvcm5hZG8vc2V0dXAuY2ZnIGIvdGVzdC9weS50b3JuYWRvL3NldHVwLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTU4N2M0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS50b3JuYWRvL3NldHVwLmNmZwpAQCAtMCwwICsxLDMgQEAKK1tmbGFrZThdCitpZ25vcmUgPSBFNDAyCittYXgtbGluZS1sZW5ndGggPSAxMDAKZGlmZiAtLWdpdCBhL3Rlc3QvcHkudG9ybmFkby90ZXN0X3N1aXRlLnB5IGIvdGVzdC9weS50b3JuYWRvL3Rlc3Rfc3VpdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDQ3ZmRlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkudG9ybmFkby90ZXN0X3N1aXRlLnB5CkBAIC0wLDAgKzEsMjM2IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBkYXRldGltZQoraW1wb3J0IGdsb2IKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCB1bml0dGVzdAorCitiYXNlcGF0aCA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorc3lzLnBhdGguaW5zZXJ0KDAsIGJhc2VwYXRoICsgJy9nZW4tcHkudG9ybmFkbycpCitzeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKG9zLnBhdGguam9pbihiYXNlcGF0aCwgJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJykpWzBdKQorCit0cnk6CisgICAgX19pbXBvcnRfXygndG9ybmFkbycpCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcHJpbnQoIm1vZHVsZSBgdG9ybmFkb2Agbm90IGZvdW5kLCBza2lwcGluZyB0ZXN0IikKKyAgICBzeXMuZXhpdCgwKQorCitmcm9tIHRvcm5hZG8gaW1wb3J0IGdlbgorZnJvbSB0b3JuYWRvLnRlc3RpbmcgaW1wb3J0IEFzeW5jVGVzdENhc2UsIGdldF91bnVzZWRfcG9ydCwgZ2VuX3Rlc3QKKworZnJvbSB0aHJpZnQgaW1wb3J0IFRUb3JuYWRvCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorCitmcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKK2Zyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0IFhjZXB0aW9uLCBYdHJ1Y3QKKworCitjbGFzcyBUZXN0SGFuZGxlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0X2luc3RhbmNlKToKKyAgICAgICAgc2VsZi50ZXN0X2luc3RhbmNlID0gdGVzdF9pbnN0YW5jZQorCisgICAgZGVmIHRlc3RWb2lkKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdFN0cmluZyhzZWxmLCBzKToKKyAgICAgICAgaWYgcyA9PSAndW5leHBlY3RlZF9lcnJvcic6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24ocykKKyAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiB0ZXN0Qnl0ZShzZWxmLCBiKToKKyAgICAgICAgcmV0dXJuIGIKKworICAgIGRlZiB0ZXN0STE2KHNlbGYsIGkxNik6CisgICAgICAgIHJldHVybiBpMTYKKworICAgIGRlZiB0ZXN0STMyKHNlbGYsIGkzMik6CisgICAgICAgIHJldHVybiBpMzIKKworICAgIGRlZiB0ZXN0STY0KHNlbGYsIGk2NCk6CisgICAgICAgIHJldHVybiBpNjQKKworICAgIGRlZiB0ZXN0RG91YmxlKHNlbGYsIGR1Yik6CisgICAgICAgIHJldHVybiBkdWIKKworICAgIGRlZiB0ZXN0QmluYXJ5KHNlbGYsIHRoaW5nKToKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKyAgICBkZWYgdGVzdFN0cnVjdChzZWxmLCB0aGluZyk6CisgICAgICAgIHJldHVybiB0aGluZworCisgICAgZGVmIHRlc3RFeGNlcHRpb24oc2VsZiwgcyk6CisgICAgICAgIGlmIHMgPT0gJ1hjZXB0aW9uJzoKKyAgICAgICAgICAgIHggPSBYY2VwdGlvbigpCisgICAgICAgICAgICB4LmVycm9yQ29kZSA9IDEwMDEKKyAgICAgICAgICAgIHgubWVzc2FnZSA9IHMKKyAgICAgICAgICAgIHJhaXNlIHgKKyAgICAgICAgZWxpZiBzID09ICd0aHJvd191bmRlY2xhcmVkJzoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3Rlc3RpbmcgdW5kZWNsYXJlZCBleGNlcHRpb24nKQorCisgICAgZGVmIHRlc3RPbmV3YXkoc2VsZiwgc2Vjb25kcyk6CisgICAgICAgIHN0YXJ0ID0gdGltZS50aW1lKCkKKworICAgICAgICBkZWYgZmlyZV9vbmV3YXkoKToKKyAgICAgICAgICAgIGVuZCA9IHRpbWUudGltZSgpCisgICAgICAgICAgICBzZWxmLnRlc3RfaW5zdGFuY2Uuc3RvcCgoc3RhcnQsIGVuZCwgc2Vjb25kcykpCisKKyAgICAgICAgc2VsZi50ZXN0X2luc3RhbmNlLmlvX2xvb3AuYWRkX3RpbWVvdXQoCisgICAgICAgICAgICBkYXRldGltZS50aW1lZGVsdGEoc2Vjb25kcz1zZWNvbmRzKSwKKyAgICAgICAgICAgIGZpcmVfb25ld2F5KQorICAgICAgICByYWlzZSBFeGNlcHRpb24oJ3Rlc3RpbmcgZXhjZXB0aW9uIGluIG9uZXdheSBtZXRob2QnKQorCisgICAgZGVmIHRlc3ROZXN0KHNlbGYsIHRoaW5nKToKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKyAgICBAZ2VuLmNvcm91dGluZQorICAgIGRlZiB0ZXN0TWFwKHNlbGYsIHRoaW5nKToKKyAgICAgICAgeWllbGQgZ2VuLm1vbWVudAorICAgICAgICByYWlzZSBnZW4uUmV0dXJuKHRoaW5nKQorCisgICAgZGVmIHRlc3RTZXQoc2VsZiwgdGhpbmcpOgorICAgICAgICByZXR1cm4gdGhpbmcKKworICAgIGRlZiB0ZXN0TGlzdChzZWxmLCB0aGluZyk6CisgICAgICAgIHJldHVybiB0aGluZworCisgICAgZGVmIHRlc3RFbnVtKHNlbGYsIHRoaW5nKToKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKyAgICBkZWYgdGVzdFR5cGVkZWYoc2VsZiwgdGhpbmcpOgorICAgICAgICByZXR1cm4gdGhpbmcKKworCitjbGFzcyBUaHJpZnRUZXN0Q2FzZShBc3luY1Rlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFRocmlmdFRlc3RDYXNlLCBzZWxmKS5zZXRVcCgpCisKKyAgICAgICAgc2VsZi5wb3J0ID0gZ2V0X3VudXNlZF9wb3J0KCkKKworICAgICAgICAjIHNlcnZlcgorICAgICAgICBzZWxmLmhhbmRsZXIgPSBUZXN0SGFuZGxlcihzZWxmKQorICAgICAgICBzZWxmLnByb2Nlc3NvciA9IFRocmlmdFRlc3QuUHJvY2Vzc29yKHNlbGYuaGFuZGxlcikKKyAgICAgICAgc2VsZi5wZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKKworICAgICAgICBzZWxmLnNlcnZlciA9IFRUb3JuYWRvLlRUb3JuYWRvU2VydmVyKHNlbGYucHJvY2Vzc29yLCBzZWxmLnBmYWN0b3J5LCBpb19sb29wPXNlbGYuaW9fbG9vcCkKKyAgICAgICAgc2VsZi5zZXJ2ZXIuYmluZChzZWxmLnBvcnQpCisgICAgICAgIHNlbGYuc2VydmVyLnN0YXJ0KDEpCisKKyAgICAgICAgIyBjbGllbnQKKyAgICAgICAgdHJhbnNwb3J0ID0gVFRvcm5hZG8uVFRvcm5hZG9TdHJlYW1UcmFuc3BvcnQoJ2xvY2FsaG9zdCcsIHNlbGYucG9ydCwgaW9fbG9vcD1zZWxmLmlvX2xvb3ApCisgICAgICAgIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQorICAgICAgICBzZWxmLmlvX2xvb3AucnVuX3N5bmModHJhbnNwb3J0Lm9wZW4pCisgICAgICAgIHNlbGYuY2xpZW50ID0gVGhyaWZ0VGVzdC5DbGllbnQodHJhbnNwb3J0LCBwZmFjdG9yeSkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X3ZvaWQoc2VsZik6CisgICAgICAgIHYgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0Vm9pZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgTm9uZSkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X3N0cmluZyhzZWxmKToKKyAgICAgICAgdiA9IHlpZWxkIHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJ1B5dGhvbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgJ1B5dGhvbicpCisKKyAgICBAZ2VuX3Rlc3QKKyAgICBkZWYgdGVzdF9ieXRlKHNlbGYpOgorICAgICAgICB2ID0geWllbGQgc2VsZi5jbGllbnQudGVzdEJ5dGUoNjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgNjMpCisKKyAgICBAZ2VuX3Rlc3QKKyAgICBkZWYgdGVzdF9pMzIoc2VsZik6CisgICAgICAgIHYgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0STMyKC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIC0xKQorCisgICAgICAgIHYgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0STMyKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgMCkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X2k2NChzZWxmKToKKyAgICAgICAgdiA9IHlpZWxkIHNlbGYuY2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIC0zNDM1OTczODM2OCkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X2RvdWJsZShzZWxmKToKKyAgICAgICAgdiA9IHlpZWxkIHNlbGYuY2xpZW50LnRlc3REb3VibGUoLTUuMjM1MDk4MjM1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIC01LjIzNTA5ODIzNSkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X3N0cnVjdChzZWxmKToKKyAgICAgICAgeCA9IFh0cnVjdCgpCisgICAgICAgIHguc3RyaW5nX3RoaW5nID0gIlplcm8iCisgICAgICAgIHguYnl0ZV90aGluZyA9IDEKKyAgICAgICAgeC5pMzJfdGhpbmcgPSAtMworICAgICAgICB4Lmk2NF90aGluZyA9IC01CisgICAgICAgIHkgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0U3RydWN0KHgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LnN0cmluZ190aGluZywgIlplcm8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuYnl0ZV90aGluZywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LmkzMl90aGluZywgLTMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5pNjRfdGhpbmcsIC01KQorCisgICAgQGdlbl90ZXN0CisgICAgZGVmIHRlc3Rfb25ld2F5KHNlbGYpOgorICAgICAgICBzZWxmLmNsaWVudC50ZXN0T25ld2F5KDEpCisgICAgICAgIHYgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0STMyKC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIC0xKQorCisgICAgQGdlbl90ZXN0CisgICAgZGVmIHRlc3RfbWFwKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGVzdEhhbmRsZXIudGVzdE1hcCBpcyBhIGNvcm91dGluZSwgdGhpcyB0ZXN0IGNoZWNrcyBpZiBnZW4uUmV0dXJuKCkgZnJvbSBhIGNvcm91dGluZSB3b3Jrcy4KKyAgICAgICAgIiIiCisgICAgICAgIGV4cGVjdGVkID0gezE6IDF9CisgICAgICAgIHJlcyA9IHlpZWxkIHNlbGYuY2xpZW50LnRlc3RNYXAoZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBleHBlY3RlZCkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeWllbGQgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKQorICAgICAgICBleGNlcHQgWGNlcHRpb24gYXMgZXg6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4LmVycm9yQ29kZSwgMTAwMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXgubWVzc2FnZSwgJ1hjZXB0aW9uJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgZ290dGVuIGV4Y2VwdGlvbiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ3Rocm93X3VuZGVjbGFyZWQnKQorICAgICAgICBleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSBnb3R0ZW4gZXhjZXB0aW9uIikKKworICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdTYWZlJykKKworCitkZWYgc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRocmlmdFRlc3RDYXNlKSkKKyAgICByZXR1cm4gc3VpdGUKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0LlRlc3RQcm9ncmFtKGRlZmF1bHRUZXN0PSdzdWl0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MSkpCmRpZmYgLS1naXQgYS90ZXN0L3B5LnR3aXN0ZWQvTWFrZWZpbGUuYW0gYi90ZXN0L3B5LnR3aXN0ZWQvTWFrZWZpbGUuYW0KaW5kZXggNDcyM2I3ZC4uZDExOTA4YyAxMDA2NDQKLS0tIGEvdGVzdC9weS50d2lzdGVkL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvcHkudHdpc3RlZC9NYWtlZmlsZS5hbQpAQCAtMTcsMTQgKzE3LDE0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9zcmNkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKK1RSSUFMID89IHRyaWFsCiAKIHN0dWJzOiAuLi9UaHJpZnRUZXN0LnRocmlmdCAuLi9TbWFsbFRlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHB5OnR3aXN0ZWQgLi4vVGhyaWZ0VGVzdC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gcHk6dHdpc3RlZCAuLi9TbWFsbFRlc3QudGhyaWZ0CiAKIGNoZWNrOiBzdHVicwotCSQoVFJJQUwpIHRlc3Rfc3VpdGUucHkKKwkkKFRSSUFMKSAuL3Rlc3Rfc3VpdGUucHkKIAogY2xlYW4tbG9jYWw6CiAJJChSTSkgLXIgZ2VuLXB5LnR3aXN0ZWQKZGlmZiAtLWdpdCBhL3Rlc3QvcHkudHdpc3RlZC9zZXR1cC5jZmcgYi90ZXN0L3B5LnR3aXN0ZWQvc2V0dXAuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNTg3YzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5LnR3aXN0ZWQvc2V0dXAuY2ZnCkBAIC0wLDAgKzEsMyBAQAorW2ZsYWtlOF0KK2lnbm9yZSA9IEU0MDIKK21heC1saW5lLWxlbmd0aCA9IDEwMApkaWZmIC0tZ2l0IGEvdGVzdC9weS50d2lzdGVkL3Rlc3Rfc3VpdGUucHkgYi90ZXN0L3B5LnR3aXN0ZWQvdGVzdF9zdWl0ZS5weQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDAyODlkZTUuLjAyZWI3ZjEKLS0tIGEvdGVzdC9weS50d2lzdGVkL3Rlc3Rfc3VpdGUucHkKKysrIGIvdGVzdC9weS50d2lzdGVkL3Rlc3Rfc3VpdGUucHkKQEAgLTEsMyArMSw1IEBACisjIS91c3IvYmluL2VudiBweXRob24KKwogIwogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0xNywxMiArMTksMTkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBzeXMsIGdsb2IsIHRpbWUKLXN5cy5wYXRoLmluc2VydCgwLCAnLi9nZW4tcHkudHdpc3RlZCcpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKK2ltcG9ydCBnbG9iCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCisKK2Jhc2VwYXRoID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCitzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKGJhc2VwYXRoLCAnZ2VuLXB5LnR3aXN0ZWQnKSkKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2Iob3MucGF0aC5qb2luKGJhc2VwYXRoLCAnLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJykpWzBdKQorCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgogCiBmcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKK2Zyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0IFhjZXB0aW9uLCBYdHJ1Y3QKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFR3aXN0ZWQKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKIApAQCAtMzAsNDAgKzM5LDQxIEBACiBmcm9tIHR3aXN0ZWQuaW50ZXJuZXQgaW1wb3J0IGRlZmVyLCByZWFjdG9yCiBmcm9tIHR3aXN0ZWQuaW50ZXJuZXQucHJvdG9jb2wgaW1wb3J0IENsaWVudENyZWF0b3IKIAotZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgaW1wbGVtZW50cworZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgaW1wbGVtZW50ZXIKIAotaW1wb3J0IHJhbmRvbQogCitAaW1wbGVtZW50ZXIoVGhyaWZ0VGVzdC5JZmFjZSkKIGNsYXNzIFRlc3RIYW5kbGVyOgotICAgIGltcGxlbWVudHMoVGhyaWZ0VGVzdC5JZmFjZSkKLQogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgc2VsZi5vbmV3YXlzUXVldWUgPSBkZWZlci5EZWZlcnJlZFF1ZXVlKCkKIAogICAgIGRlZiB0ZXN0Vm9pZChzZWxmKToKICAgICAgICAgcGFzcwotIAorCiAgICAgZGVmIHRlc3RTdHJpbmcoc2VsZiwgcyk6CiAgICAgICAgIHJldHVybiBzCi0gCisKICAgICBkZWYgdGVzdEJ5dGUoc2VsZiwgYik6CiAgICAgICAgIHJldHVybiBiCi0gCisKICAgICBkZWYgdGVzdEkxNihzZWxmLCBpMTYpOgogICAgICAgICByZXR1cm4gaTE2Ci0gCisKICAgICBkZWYgdGVzdEkzMihzZWxmLCBpMzIpOgogICAgICAgICByZXR1cm4gaTMyCi0gCisKICAgICBkZWYgdGVzdEk2NChzZWxmLCBpNjQpOgogICAgICAgICByZXR1cm4gaTY0Ci0gCisKICAgICBkZWYgdGVzdERvdWJsZShzZWxmLCBkdWIpOgogICAgICAgICByZXR1cm4gZHViCi0gCisKKyAgICBkZWYgdGVzdEJpbmFyeShzZWxmLCB0aGluZyk6CisgICAgICAgIHJldHVybiB0aGluZworCiAgICAgZGVmIHRlc3RTdHJ1Y3Qoc2VsZiwgdGhpbmcpOgogICAgICAgICByZXR1cm4gdGhpbmcKLSAKKwogICAgIGRlZiB0ZXN0RXhjZXB0aW9uKHNlbGYsIHMpOgogICAgICAgICBpZiBzID09ICdYY2VwdGlvbic6CiAgICAgICAgICAgICB4ID0gWGNlcHRpb24oKQpAQCAtNzIsMzEgKzgyLDMyIEBACiAgICAgICAgICAgICByYWlzZSB4CiAgICAgICAgIGVsaWYgcyA9PSAidGhyb3dfdW5kZWNsYXJlZCI6CiAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJmb28iKQotIAorCiAgICAgZGVmIHRlc3RPbmV3YXkoc2VsZiwgc2Vjb25kcyk6CiAgICAgICAgIGRlZiBmaXJlT25ld2F5KHQpOgogICAgICAgICAgICAgc2VsZi5vbmV3YXlzUXVldWUucHV0KCh0LCB0aW1lLnRpbWUoKSwgc2Vjb25kcykpCiAgICAgICAgIHJlYWN0b3IuY2FsbExhdGVyKHNlY29uZHMsIGZpcmVPbmV3YXksIHRpbWUudGltZSgpKQotICAgICAgICByZXR1cm4gZAotIAorICAgICAgICByYWlzZSBFeGNlcHRpb24oJycpCisKICAgICBkZWYgdGVzdE5lc3Qoc2VsZiwgdGhpbmcpOgogICAgICAgICByZXR1cm4gdGhpbmcKLSAKKwogICAgIGRlZiB0ZXN0TWFwKHNlbGYsIHRoaW5nKToKICAgICAgICAgcmV0dXJuIHRoaW5nCi0gCisKICAgICBkZWYgdGVzdFNldChzZWxmLCB0aGluZyk6CiAgICAgICAgIHJldHVybiB0aGluZwotIAorCiAgICAgZGVmIHRlc3RMaXN0KHNlbGYsIHRoaW5nKToKICAgICAgICAgcmV0dXJuIHRoaW5nCi0gCisKICAgICBkZWYgdGVzdEVudW0oc2VsZiwgdGhpbmcpOgogICAgICAgICByZXR1cm4gdGhpbmcKLSAKKwogICAgIGRlZiB0ZXN0VHlwZWRlZihzZWxmLCB0aGluZyk6CiAgICAgICAgIHJldHVybiB0aGluZwogCisKIGNsYXNzIFRocmlmdFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIEBkZWZlci5pbmxpbmVDYWxsYmFja3MKQEAgLTEwNSwxNiArMTE2LDE1IEBACiAgICAgICAgIHNlbGYucHJvY2Vzc29yID0gVGhyaWZ0VGVzdC5Qcm9jZXNzb3Ioc2VsZi5oYW5kbGVyKQogICAgICAgICBzZWxmLnBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQogCi0gICAgICAgIHNlbGYuc2VydmVyID0gcmVhY3Rvci5saXN0ZW5UQ1AoMCwKLSAgICAgICAgICAgIFRUd2lzdGVkLlRocmlmdFNlcnZlckZhY3Rvcnkoc2VsZi5wcm9jZXNzb3IsCi0gICAgICAgICAgICBzZWxmLnBmYWN0b3J5KSwgaW50ZXJmYWNlPSIxMjcuMC4wLjEiKQorICAgICAgICBzZWxmLnNlcnZlciA9IHJlYWN0b3IubGlzdGVuVENQKAorICAgICAgICAgICAgMCwgVFR3aXN0ZWQuVGhyaWZ0U2VydmVyRmFjdG9yeShzZWxmLnByb2Nlc3Nvciwgc2VsZi5wZmFjdG9yeSksIGludGVyZmFjZT0iMTI3LjAuMC4xIikKIAogICAgICAgICBzZWxmLnBvcnRObyA9IHNlbGYuc2VydmVyLmdldEhvc3QoKS5wb3J0CiAKICAgICAgICAgc2VsZi50eGNsaWVudCA9IHlpZWxkIENsaWVudENyZWF0b3IocmVhY3RvciwKLSAgICAgICAgICAgIFRUd2lzdGVkLlRocmlmdENsaWVudFByb3RvY29sLAotICAgICAgICAgICAgVGhyaWZ0VGVzdC5DbGllbnQsCi0gICAgICAgICAgICBzZWxmLnBmYWN0b3J5KS5jb25uZWN0VENQKCIxMjcuMC4wLjEiLCBzZWxmLnBvcnRObykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR3aXN0ZWQuVGhyaWZ0Q2xpZW50UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRlc3QuQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBmYWN0b3J5KS5jb25uZWN0VENQKCIxMjcuMC4wLjEiLCBzZWxmLnBvcnRObykKICAgICAgICAgc2VsZi5jbGllbnQgPSBzZWxmLnR4Y2xpZW50LmNsaWVudAogCiAgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcwpAQCAtMTI5LDcgKzEzOSw3IEBACiAgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcwogICAgIGRlZiB0ZXN0U3RyaW5nKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFscygoeWllbGQgc2VsZi5jbGllbnQudGVzdFN0cmluZygnUHl0aG9uJykpLCAnUHl0aG9uJykKLSAKKwogICAgIEBkZWZlci5pbmxpbmVDYWxsYmFja3MKICAgICBkZWYgdGVzdEJ5dGUoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCh5aWVsZCBzZWxmLmNsaWVudC50ZXN0Qnl0ZSg2MykpLCA2MykKQEAgLTE0Nyw3ICsxNTcsOSBAQAogICAgIGRlZiB0ZXN0RG91YmxlKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFscygoeWllbGQgc2VsZi5jbGllbnQudGVzdERvdWJsZSgtNS4yMzUwOTgyMzUpKSwgLTUuMjM1MDk4MjM1KQogCi0gICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcyAKKyAgICAjIFRPRE86IGRlZiB0ZXN0QmluYXJ5KHNlbGYpIC4uLgorCisgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcwogICAgIGRlZiB0ZXN0U3RydWN0KHNlbGYpOgogICAgICAgICB4ID0gWHRydWN0KCkKICAgICAgICAgeC5zdHJpbmdfdGhpbmcgPSAiWmVybyIKQEAgLTE1NSwzMCArMTY3LDMyIEBACiAgICAgICAgIHguaTMyX3RoaW5nID0gLTMKICAgICAgICAgeC5pNjRfdGhpbmcgPSAtNQogICAgICAgICB5ID0geWllbGQgc2VsZi5jbGllbnQudGVzdFN0cnVjdCh4KQotIAorCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHkuc3RyaW5nX3RoaW5nLCAiWmVybyIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHkuYnl0ZV90aGluZywgMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeS5pMzJfdGhpbmcsIC0zKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh5Lmk2NF90aGluZywgLTUpCi0gCisKICAgICBAZGVmZXIuaW5saW5lQ2FsbGJhY2tzCiAgICAgZGVmIHRlc3RFeGNlcHRpb24oc2VsZik6Ci0gICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1NhZmUnKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpCiAgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQotICAgICAgICBleGNlcHQgWGNlcHRpb24sIHg6CisgICAgICAgIGV4Y2VwdCBYY2VwdGlvbiBhcyB4OgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC5lcnJvckNvZGUsIDEwMDEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4Lm1lc3NhZ2UsICdYY2VwdGlvbicpCiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgeWllbGQgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbigidGhyb3dfdW5kZWNsYXJlZCIpCi0gICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24iKQotICAgICAgICBleGNlcHQgRXhjZXB0aW9uOiAjIHR5cGUgaXMgdW5kZWZpbmVkCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQorICAgICAgICBleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOgogICAgICAgICAgICAgcGFzcwotIAorCisgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1NhZmUnKQorCiAgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcwogICAgIGRlZiB0ZXN0T25ld2F5KHNlbGYpOgotICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0T25ld2F5KDIpCisgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RPbmV3YXkoMSkKICAgICAgICAgc3RhcnQsIGVuZCwgc2Vjb25kcyA9IHlpZWxkIHNlbGYuaGFuZGxlci5vbmV3YXlzUXVldWUuZ2V0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbHMoc2Vjb25kcywgKGVuZCAtIHN0YXJ0KSwgcGxhY2VzPTIpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWxzKHNlY29uZHMsIChlbmQgLSBzdGFydCksIHBsYWNlcz0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygoeWllbGQgc2VsZi5jbGllbnQudGVzdEkzMigtMSkpLCAtMSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvQ01ha2VMaXN0cy50eHQgYi90ZXN0L3B5L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzIyMTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCithZGRfdGVzdChOQU1FIHB5dGhvbl90ZXN0X2dlbmVyYXRlCisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9CisgICAgICAgICAgICAtRFRIUklGVENPTVBJTEVSPSQ8VEFSR0VUX0ZJTEU6dGhyaWZ0LWNvbXBpbGVyPgorICAgICAgICAgICAgLURNWV9QUk9KRUNUX0RJUj0ke1BST0pFQ1RfU09VUkNFX0RJUn0KKyAgICAgICAgICAgIC1ETVlfQ1VSUkVOVF9TT1VSQ0VfRElSPSR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQorICAgICAgICAgICAgLURNWV9DVVJSRU5UX0JJTkFSWV9ESVI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CisgICAgLVAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2dlbmVyYXRlLmNtYWtlCispCisKK2FkZF90ZXN0KE5BTUUgcHl0aG9uX3Rlc3QKKyAgICBDT01NQU5EICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9SdW5DbGllbnRTZXJ2ZXIucHkgLS1nZW4tYmFzZT0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICBERVBFTkRTIHB5dGhvbl90ZXN0X2dlbmVyYXRlCisgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CispCisKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvRmFzdGJpbmFyeVRlc3QucHkgYi90ZXN0L3B5L0Zhc3RiaW5hcnlUZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA1YzBiYjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L0Zhc3RiaW5hcnlUZXN0LnB5CkBAIC0wLDAgKzEsMjU2IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3IiIiIKK1BZVEhPTlBBVEg9Li9nZW4tcHk6Li4vLi4vbGliL3B5L2J1aWxkL2xpYi4uLiAuL0Zhc3RiaW5hcnlUZXN0LnB5CisiIiIKKworIyBUT0RPKGRyZWlzcyk6IFRlc3QgZXJyb3IgY2FzZXMuICBDaGVjayBmb3IgbWVtb3J5IGxlYWtzLgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK2ltcG9ydCBtYXRoCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1laXQKKworZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQorZnJvbSBwcHJpbnQgaW1wb3J0IHBwcmludAorCitmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sLCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbCwgVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkCisKK2Zyb20gRGVidWdQcm90b1Rlc3QgaW1wb3J0IFNydgorZnJvbSBEZWJ1Z1Byb3RvVGVzdC50dHlwZXMgaW1wb3J0IEJhY2t3YXJkcywgQm9uaywgRW1wdHksIEhvbHlNb2xleSwgT25lT2ZFYWNoLCBSYW5kb21TdHVmZiwgV3JhcHBlcgorCisKK2NsYXNzIFREZXZOdWxsVHJhbnNwb3J0KFRUcmFuc3BvcnQuVFRyYW5zcG9ydEJhc2UpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworCitvb2UxID0gT25lT2ZFYWNoKCkKK29vZTEuaW1fdHJ1ZSA9IFRydWUKK29vZTEuaW1fZmFsc2UgPSBGYWxzZQorb29lMS5hX2JpdGUgPSAweGQ2Citvb2UxLmludGVnZXIxNiA9IDI3MDAwCitvb2UxLmludGVnZXIzMiA9IDEgPDwgMjQKK29vZTEuaW50ZWdlcjY0ID0gNjAwMCAqIDEwMDAgKiAxMDAwCitvb2UxLmRvdWJsZV9wcmVjaXNpb24gPSBtYXRoLnBpCitvb2UxLnNvbWVfY2hhcmFjdGVycyA9ICJEZWJ1ZyBUSElTISIKK29vZTEuem9tZ191bmljb2RlID0gdSJceGQ3XG5cYVx0IgorCitvb2UyID0gT25lT2ZFYWNoKCkKK29vZTIuaW50ZWdlcjE2ID0gMTYKK29vZTIuaW50ZWdlcjMyID0gMzIKK29vZTIuaW50ZWdlcjY0ID0gNjQKK29vZTIuZG91YmxlX3ByZWNpc2lvbiA9IChtYXRoLnNxcnQoNSkgKyAxKSAvIDIKK29vZTIuc29tZV9jaGFyYWN0ZXJzID0gIjpSIChtZSBnb2luZyBcInJycnJcIikiCitvb2UyLnpvbWdfdW5pY29kZSA9IHUiXHhkM1x4ODBceGUyXHg4NVx4YWVceGNlXHg5ZFx4MjAiXAorICAgICAgICAgICAgICAgICAgICB1Ilx4ZDBceDlkXHhjZVx4YmZceGUyXHg4NVx4YmZceGQwXHhiZSJcCisgICAgICAgICAgICAgICAgICAgIHUiXHhjOVx4YTFceGQwXHhiM1x4ZDBceGIwXHhjZlx4ODFceGUyXHg4NFx4OGUiXAorICAgICAgICAgICAgICAgICAgICB1Ilx4MjBceGNlXHg5MVx4NzRceDc0XHhjZVx4YjFceGUyXHg4NVx4YmRceGNlXHhiYSJcCisgICAgICAgICAgICAgICAgICAgIHUiXHhjN1x4ODNceGUyXHg4MFx4YmMiCisKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgb3MuZW52aXJvbi5nZXQoJ1RIUklGVF9URVNUX1BZX05PX1VURjhTVFJJTkdTJyk6CisgICAgb29lMS56b21nX3VuaWNvZGUgPSBvb2UxLnpvbWdfdW5pY29kZS5lbmNvZGUoJ3V0ZjgnKQorICAgIG9vZTIuem9tZ191bmljb2RlID0gb29lMi56b21nX3VuaWNvZGUuZW5jb2RlKCd1dGY4JykKKworaG0gPSBIb2x5TW9sZXkoKip7ImJpZyI6IFtdLCAiY29udGFpbiI6IHNldCgpLCAiYm9ua3MiOiB7fX0pCitobS5iaWcuYXBwZW5kKG9vZTEpCitobS5iaWcuYXBwZW5kKG9vZTIpCitobS5iaWdbMF0uYV9iaXRlID0gMHgyMgoraG0uYmlnWzFdLmFfYml0ZSA9IDB4MjIKKworaG0uY29udGFpbi5hZGQoKCJhbmQgYSBvbmUiLCAiYW5kIGEgdHdvIikpCitobS5jb250YWluLmFkZCgoInRoZW4gYSBvbmUsIHR3byIsICJ0aHJlZSEiLCAiRk9VUiEiKSkKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgb3MuZW52aXJvbi5nZXQoJ1RIUklGVF9URVNUX1BZX05PX1VURjhTVFJJTkdTJyk6CisgICAgaG0uY29udGFpbi5hZGQoKHUiXHhkN1xuXGFcdCIuZW5jb2RlKCd1dGY4JyksKSkKK2Vsc2U6CisgICAgaG0uY29udGFpbi5hZGQoKHUiXHhkN1xuXGFcdCIsKSkKK2htLmNvbnRhaW4uYWRkKCgpKQorCitobS5ib25rc1sibm90aGluZyJdID0gW10KK2htLmJvbmtzWyJzb21ldGhpbmciXSA9IFsKKyAgICBCb25rKCoqeyJ0eXBlIjogMSwgIm1lc3NhZ2UiOiAiV2FpdC4ifSksCisgICAgQm9uaygqKnsidHlwZSI6IDIsICJtZXNzYWdlIjogIldoYXQ/In0pLAorXQoraG0uYm9ua3NbInBvZSJdID0gWworICAgIEJvbmsoKip7InR5cGUiOiAzLCAibWVzc2FnZSI6ICJxdW90aCJ9KSwKKyAgICBCb25rKCoqeyJ0eXBlIjogNCwgIm1lc3NhZ2UiOiAidGhlIHJhdmVuIn0pLAorICAgIEJvbmsoKip7InR5cGUiOiA1LCAibWVzc2FnZSI6ICJuZXZlcm1vcmUifSksCitdCisKK3JzID0gUmFuZG9tU3R1ZmYoKQorcnMuYSA9IDEKK3JzLmIgPSAyCitycy5jID0gMworcnMubXlpbnRsaXN0ID0gbGlzdChyYW5nZSgyMCkpCitycy5tYXBzID0gezE6IFdyYXBwZXIoKip7ImZvbyI6IEVtcHR5KCl9KSwgMjogV3JhcHBlcigqKnsiZm9vIjogRW1wdHkoKX0pfQorcnMuYmlnaW50ID0gMTI0NTIzNDUyNDM1Citycy50cmlwbGUgPSAzLjE0CisKKyMgbWFrZSBzdXJlIHRoaXMgc3BsaXRzIHR3byBidWZmZXJzIGluIGEgYnVmZmVyZWQgcHJvdG9jb2wKK3JzaHVnZSA9IFJhbmRvbVN0dWZmKCkKK3JzaHVnZS5teWludGxpc3QgPSBsaXN0KHJhbmdlKDEwMDAwKSkKKworbXlfemVybyA9IFNydi5KYW5reV9yZXN1bHQoKip7InN1Y2Nlc3MiOiA1fSkKKworCitjbGFzcyBUZXN0KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZhc3QsIHNsb3cpOgorICAgICAgICBzZWxmLl9mYXN0ID0gZmFzdAorICAgICAgICBzZWxmLl9zbG93ID0gc2xvdworCisgICAgZGVmIF9jaGVja193cml0ZShzZWxmLCBvKToKKyAgICAgICAgdHJhbnNfZmFzdCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIHRyYW5zX3Nsb3cgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICBwcm90X2Zhc3QgPSBzZWxmLl9mYXN0KHRyYW5zX2Zhc3QsIGZhbGxiYWNrPUZhbHNlKQorICAgICAgICBwcm90X3Nsb3cgPSBzZWxmLl9zbG93KHRyYW5zX3Nsb3cpCisKKyAgICAgICAgby53cml0ZShwcm90X2Zhc3QpCisgICAgICAgIG8ud3JpdGUocHJvdF9zbG93KQorICAgICAgICBPUklHID0gdHJhbnNfc2xvdy5nZXR2YWx1ZSgpCisgICAgICAgIE1JTkUgPSB0cmFuc19mYXN0LmdldHZhbHVlKCkKKyAgICAgICAgaWYgT1JJRyAhPSBNSU5FOgorICAgICAgICAgICAgcHJpbnQoImFjdHVhbCAgOiAlc1xuZXhwZWN0ZWQ6ICVzIiAlIChyZXByKE1JTkUpLCByZXByKE9SSUcpKSkKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignd3JpdGUgdmFsdWUgbWlzbWF0Y2gnKQorCisgICAgZGVmIF9jaGVja19yZWFkKHNlbGYsIG8pOgorICAgICAgICBwcm90ID0gc2VsZi5fc2xvdyhUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKSkKKyAgICAgICAgby53cml0ZShwcm90KQorCisgICAgICAgIHNsb3dfdmVyc2lvbl9iaW5hcnkgPSBwcm90LnRyYW5zLmdldHZhbHVlKCkKKworICAgICAgICBwcm90ID0gc2VsZi5fZmFzdCgKKyAgICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzbG93X3ZlcnNpb25fYmluYXJ5KSwgZmFsbGJhY2s9RmFsc2UpCisgICAgICAgIGMgPSBvLl9fY2xhc3NfXygpCisgICAgICAgIGMucmVhZChwcm90KQorICAgICAgICBpZiBjICE9IG86CisgICAgICAgICAgICBwcmludCgiYWN0dWFsICA6ICIpCisgICAgICAgICAgICBwcHJpbnQocmVwcihjKSkKKyAgICAgICAgICAgIHByaW50KCJleHBlY3RlZDogIikKKyAgICAgICAgICAgIHBwcmludChyZXByKG8pKQorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdyZWFkIHZhbHVlIG1pc21hdGNoJykKKworICAgICAgICBwcm90ID0gc2VsZi5fZmFzdCgKKyAgICAgICAgICAgIFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzbG93X3ZlcnNpb25fYmluYXJ5KSksIGZhbGxiYWNrPUZhbHNlKQorICAgICAgICBjID0gby5fX2NsYXNzX18oKQorICAgICAgICBjLnJlYWQocHJvdCkKKyAgICAgICAgaWYgYyAhPSBvOgorICAgICAgICAgICAgcHJpbnQoImFjdHVhbCAgOiAiKQorICAgICAgICAgICAgcHByaW50KHJlcHIoYykpCisgICAgICAgICAgICBwcmludCgiZXhwZWN0ZWQ6ICIpCisgICAgICAgICAgICBwcHJpbnQocmVwcihvKSkKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigncmVhZCB2YWx1ZSBtaXNtYXRjaCcpCisKKyAgICBkZWYgZG9fdGVzdChzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfd3JpdGUoSG9seU1vbGV5KCkpCisgICAgICAgIHNlbGYuX2NoZWNrX3JlYWQoSG9seU1vbGV5KCkpCisKKyAgICAgICAgc2VsZi5fY2hlY2tfd3JpdGUoaG0pCisgICAgICAgIG5vX3NldCA9IGRlZXBjb3B5KGhtKQorICAgICAgICBub19zZXQuY29udGFpbiA9IHNldCgpCisgICAgICAgIHNlbGYuX2NoZWNrX3JlYWQobm9fc2V0KQorICAgICAgICBzZWxmLl9jaGVja19yZWFkKGhtKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3dyaXRlKHJzKQorICAgICAgICBzZWxmLl9jaGVja19yZWFkKHJzKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3dyaXRlKHJzaHVnZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfcmVhZChyc2h1Z2UpCisKKyAgICAgICAgc2VsZi5fY2hlY2tfd3JpdGUobXlfemVybykKKyAgICAgICAgc2VsZi5fY2hlY2tfcmVhZChteV96ZXJvKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3JlYWQoQmFja3dhcmRzKCoqeyJmaXJzdF90YWcyIjogNCwgInNlY29uZF90YWcxIjogMn0pKQorCisgICAgICAgICMgT25lIGNhc2Ugd2hlcmUgdGhlIHNlcmlhbGl6ZWQgZm9ybSBjaGFuZ2VzLCBidXQgb25seSBzdXBlcmZpY2lhbGx5LgorICAgICAgICBvID0gQmFja3dhcmRzKCoqeyJmaXJzdF90YWcyIjogNCwgInNlY29uZF90YWcxIjogMn0pCisgICAgICAgIHRyYW5zX2Zhc3QgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICB0cmFuc19zbG93ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgcHJvdF9mYXN0ID0gc2VsZi5fZmFzdCh0cmFuc19mYXN0LCBmYWxsYmFjaz1GYWxzZSkKKyAgICAgICAgcHJvdF9zbG93ID0gc2VsZi5fc2xvdyh0cmFuc19zbG93KQorCisgICAgICAgIG8ud3JpdGUocHJvdF9mYXN0KQorICAgICAgICBvLndyaXRlKHByb3Rfc2xvdykKKyAgICAgICAgT1JJRyA9IHRyYW5zX3Nsb3cuZ2V0dmFsdWUoKQorICAgICAgICBNSU5FID0gdHJhbnNfZmFzdC5nZXR2YWx1ZSgpCisgICAgICAgIGFzc2VydCBpZChPUklHKSAhPSBpZChNSU5FKQorCisgICAgICAgIHByb3QgPSBzZWxmLl9mYXN0KFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpLCBmYWxsYmFjaz1GYWxzZSkKKyAgICAgICAgby53cml0ZShwcm90KQorICAgICAgICBwcm90ID0gc2VsZi5fc2xvdygKKyAgICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihwcm90LnRyYW5zLmdldHZhbHVlKCkpKQorICAgICAgICBjID0gby5fX2NsYXNzX18oKQorICAgICAgICBjLnJlYWQocHJvdCkKKyAgICAgICAgaWYgYyAhPSBvOgorICAgICAgICAgICAgcHJpbnQoImNvcHk6ICIpCisgICAgICAgICAgICBwcHJpbnQocmVwcihjKSkKKyAgICAgICAgICAgIHByaW50KCJvcmlnOiAiKQorICAgICAgICAgICAgcHByaW50KHJlcHIobykpCisKKworZGVmIGRvX3Rlc3QoZmFzdCwgc2xvdyk6CisgICAgVGVzdChmYXN0LCBzbG93KS5kb190ZXN0KCkKKworCitkZWYgZG9fYmVuY2htYXJrKHByb3RvY29sLCBpdGVycz01MDAwLCBza2lwX3Nsb3c9RmFsc2UpOgorICAgIHNldHVwID0gIiIiCitmcm9tIF9fbWFpbl9fIGltcG9ydCBobSwgcnMsIFREZXZOdWxsVHJhbnNwb3J0Citmcm9tIHRocmlmdC5wcm90b2NvbC57MH0gaW1wb3J0IHswfXsxfQordHJhbnMgPSBURGV2TnVsbFRyYW5zcG9ydCgpCitwcm90ID0gezB9ezF9KHRyYW5zezJ9KQorIiIiCisKKyAgICBzZXR1cF9mYXN0ID0gc2V0dXAuZm9ybWF0KHByb3RvY29sLCAnQWNjZWxlcmF0ZWQnLCAnLCBmYWxsYmFjaz1GYWxzZScpCisgICAgaWYgbm90IHNraXBfc2xvdzoKKyAgICAgICAgc2V0dXBfc2xvdyA9IHNldHVwLmZvcm1hdChwcm90b2NvbCwgJycsICcnKQorCisgICAgcHJpbnQoIlN0YXJ0aW5nIEJlbmNobWFya3MiKQorCisgICAgaWYgbm90IHNraXBfc2xvdzoKKyAgICAgICAgcHJpbnQoIkhvbHlNb2xleSBTdGFuZGFyZCA9ICVmIiAlCisgICAgICAgICAgICAgIHRpbWVpdC5UaW1lcignaG0ud3JpdGUocHJvdCknLCBzZXR1cF9zbG93KS50aW1laXQobnVtYmVyPWl0ZXJzKSkKKworICAgIHByaW50KCJIb2x5TW9sZXkgQWNjZWxlci4gPSAlZiIgJQorICAgICAgICAgIHRpbWVpdC5UaW1lcignaG0ud3JpdGUocHJvdCknLCBzZXR1cF9mYXN0KS50aW1laXQobnVtYmVyPWl0ZXJzKSkKKworICAgIGlmIG5vdCBza2lwX3Nsb3c6CisgICAgICAgIHByaW50KCJGYXN0U3RydWN0IFN0YW5kYXJkID0gJWYiICUKKyAgICAgICAgICAgICAgdGltZWl0LlRpbWVyKCdycy53cml0ZShwcm90KScsIHNldHVwX3Nsb3cpLnRpbWVpdChudW1iZXI9aXRlcnMpKQorCisgICAgcHJpbnQoIkZhc3RTdHJ1Y3QgQWNjZWxlci4gPSAlZiIgJQorICAgICAgICAgIHRpbWVpdC5UaW1lcigncnMud3JpdGUocHJvdCknLCBzZXR1cF9mYXN0KS50aW1laXQobnVtYmVyPWl0ZXJzKSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHByaW50KCdUZXN0aW5nIFRCaW5hcnlBY2NlbGVyYXRlZCcpCisgICAgZG9fdGVzdChUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCwgVEJpbmFyeVByb3RvY29sKQorICAgIGRvX2JlbmNobWFyaygnVEJpbmFyeVByb3RvY29sJykKKyAgICBwcmludCgnVGVzdGluZyBUQ29tcGFjdEFjY2VsZXJhdGVkJykKKyAgICBkb190ZXN0KFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZCwgVENvbXBhY3RQcm90b2NvbCkKKyAgICBkb19iZW5jaG1hcmsoJ1RDb21wYWN0UHJvdG9jb2wnKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9NYWtlZmlsZS5hbSBiL3Rlc3QvcHkvTWFrZWZpbGUuYW0KaW5kZXggNjNiN2E4OS4uODI5NjIwMCAxMDA2NDQKLS0tIGEvdGVzdC9weS9NYWtlZmlsZS5hbQorKysgYi90ZXN0L3B5L01ha2VmaWxlLmFtCkBAIC0xNiwzMyArMTYsODIgQEAKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKK0FVVE9NQUtFX09QVElPTlMgPSBzZXJpYWwtdGVzdHMKIAotVEhSSUZUID0gJCh0b3Bfc3JjZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KLXB5X3VuaXRfdGVzdHMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgU2VyaWFsaXphdGlvblRlc3QucHkgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgVGVzdEVvZi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgVGVzdFN5bnRheC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgUnVuQ2xpZW50U2VydmVyLnB5CitweV91bml0X3Rlc3RzID0gUnVuQ2xpZW50U2VydmVyLnB5CiAKIHRocmlmdF9nZW4gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgZ2VuLXB5L1RocmlmdFRlc3QvX19pbml0X18ucHkgICAgICAgICAgIFwKLSAgICAgICAgZ2VuLXB5L0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5CisgICAgICAgIGdlbi1weS9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS9Eb3VibGVDb25zdGFudHNUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5L1JlY3Vyc2l2ZS9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1kZWZhdWx0L1RocmlmdFRlc3QvX19pbml0X18ucHkgICAgICAgICAgIFwKKyAgICAgICAgZ2VuLXB5LWRlZmF1bHQvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktZGVmYXVsdC9Eb3VibGVDb25zdGFudHNUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LWRlZmF1bHQvUmVjdXJzaXZlL19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LXNsb3RzL1RocmlmdFRlc3QvX19pbml0X18ucHkgICAgICAgICAgIFwKKyAgICAgICAgZ2VuLXB5LXNsb3RzL0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LXNsb3RzL0RvdWJsZUNvbnN0YW50c1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktc2xvdHMvUmVjdXJzaXZlL19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LW9sZHN0eWxlL1RocmlmdFRlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktb2xkc3R5bGUvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktb2xkc3R5bGUvRG91YmxlQ29uc3RhbnRzVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1vbGRzdHlsZS9SZWN1cnNpdmUvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktbm9fdXRmOHN0cmluZ3MvVGhyaWZ0VGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1ub191dGY4c3RyaW5ncy9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1ub191dGY4c3RyaW5ncy9Eb3VibGVDb25zdGFudHNUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzL1JlY3Vyc2l2ZS9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1keW5hbWljL1RocmlmdFRlc3QvX19pbml0X18ucHkgICAgICAgICAgIFwKKyAgICAgICAgZ2VuLXB5LWR5bmFtaWMvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktZHluYW1pYy9Eb3VibGVDb25zdGFudHNUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LWR5bmFtaWMvUmVjdXJzaXZlL19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LWR5bmFtaWNzbG90cy9UaHJpZnRUZXN0L19faW5pdF9fLnB5ICAgICAgICAgICBcCisgICAgICAgIGdlbi1weS1keW5hbWljc2xvdHMvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktZHluYW1pY3Nsb3RzL0RvdWJsZUNvbnN0YW50c1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktZHluYW1pY3Nsb3RzL1JlY3Vyc2l2ZS9fX2luaXRfXy5weQorCisKK3ByZWNyb3NzOiAkKHRocmlmdF9nZW4pCitCVUlMVF9TT1VSQ0VTID0gJCh0aHJpZnRfZ2VuKQogCiBoZWxwZXJfc2NyaXB0cz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIFRlc3RDbGllbnQucHkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIFRlc3RTZXJ2ZXIucHkKIAogY2hlY2tfU0NSSVBUUz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAkKHRocmlmdF9nZW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAkKHRocmlmdF9nZW4pIFwKICAgICAgICAgJChweV91bml0X3Rlc3RzKSAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgJChoZWxwZXJfc2NyaXB0cykKIAogVEVTVFM9ICQocHlfdW5pdF90ZXN0cykKIAogCi1nZW4tcHkvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQKLQkkKFRIUklGVCkgLS1nZW4gcHkgJDwKK2dlbi1weS8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdCAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gcHkgICQ8CisKK2dlbi1weS1kZWZhdWx0LyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0ICQoVEhSSUZUKQorCXRlc3QgLWQgZ2VuLXB5LWRlZmF1bHQgfHwgJChNS0RJUl9QKSBnZW4tcHktZGVmYXVsdAorCSQoVEhSSUZUKSAtLWdlbiBweSAtb3V0IGdlbi1weS1kZWZhdWx0ICQ8CisKK2dlbi1weS1zbG90cy8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdCAkKFRIUklGVCkKKwl0ZXN0IC1kIGdlbi1weS1zbG90cyB8fCAkKE1LRElSX1ApIGdlbi1weS1zbG90cworCSQoVEhSSUZUKSAtLWdlbiBweTpzbG90cyAtb3V0IGdlbi1weS1zbG90cyAkPAorCitnZW4tcHktb2xkc3R5bGUvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQgJChUSFJJRlQpCisJdGVzdCAtZCBnZW4tcHktb2xkc3R5bGUgfHwgJChNS0RJUl9QKSBnZW4tcHktb2xkc3R5bGUKKwkkKFRIUklGVCkgLS1nZW4gcHk6b2xkX3N0eWxlIC1vdXQgZ2VuLXB5LW9sZHN0eWxlICQ8CisKK2dlbi1weS1ub191dGY4c3RyaW5ncy8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdCAkKFRIUklGVCkKKwl0ZXN0IC1kIGdlbi1weS1ub191dGY4c3RyaW5ncyB8fCAkKE1LRElSX1ApIGdlbi1weS1ub191dGY4c3RyaW5ncworCSQoVEhSSUZUKSAtLWdlbiBweTpub191dGY4c3RyaW5ncyAtb3V0IGdlbi1weS1ub191dGY4c3RyaW5ncyAkPAorCitnZW4tcHktZHluYW1pYy8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdCAkKFRIUklGVCkKKwl0ZXN0IC1kIGdlbi1weS1keW5hbWljIHx8ICQoTUtESVJfUCkgZ2VuLXB5LWR5bmFtaWMKKwkkKFRIUklGVCkgLS1nZW4gcHk6ZHluYW1pYyAtb3V0IGdlbi1weS1keW5hbWljICQ8CisKK2dlbi1weS1keW5hbWljc2xvdHMvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQgJChUSFJJRlQpCisJdGVzdCAtZCBnZW4tcHktZHluYW1pY3Nsb3RzIHx8ICQoTUtESVJfUCkgZ2VuLXB5LWR5bmFtaWNzbG90cworCSQoVEhSSUZUKSAtLWdlbiBweTpkeW5hbWljLHNsb3RzIC1vdXQgZ2VuLXB5LWR5bmFtaWNzbG90cyAkPAogCiBjbGVhbi1sb2NhbDoKLQkkKFJNKSAtciBnZW4tcHkKKwkkKFJNKSAtciBnZW4tcHkgZ2VuLXB5LXNsb3RzIGdlbi1weS1kZWZhdWx0IGdlbi1weS1vbGRzdHlsZSBnZW4tcHktbm9fdXRmOHN0cmluZ3MgZ2VuLXB5LWR5bmFtaWMgZ2VuLXB5LWR5bmFtaWNzbG90cwpkaWZmIC0tZ2l0IGEvdGVzdC9weS9SdW5DbGllbnRTZXJ2ZXIucHkgYi90ZXN0L3B5L1J1bkNsaWVudFNlcnZlci5weQppbmRleCA2MzM4NTZmLi41NmE0MDhlIDEwMDc1NQotLS0gYS90ZXN0L3B5L1J1bkNsaWVudFNlcnZlci5weQorKysgYi90ZXN0L3B5L1J1bkNsaWVudFNlcnZlci5weQpAQCAtMjAsMTMzICsyMCwzMDQgQEAKICMKIAogZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgotaW1wb3J0IHRpbWUKLWltcG9ydCBzdWJwcm9jZXNzCi1pbXBvcnQgc3lzCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBjb3B5CiBpbXBvcnQgb3MKIGltcG9ydCBzaWduYWwKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQogZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCiAKLXBhcnNlciA9IE9wdGlvblBhcnNlcigpCi1wYXJzZXIuYWRkX29wdGlvbigiLS1wb3J0IiwgdHlwZT0iaW50IiwgZGVzdD0icG9ydCIsIGRlZmF1bHQ9OTA5MCwKLSAgICBoZWxwPSJwb3J0IG51bWJlciBmb3Igc2VydmVyIHRvIGxpc3RlbiBvbiIpCi1wYXJzZXIuYWRkX29wdGlvbignLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSJzdG9yZV9jb25zdCIsIAotICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0yLAotICAgIGhlbHA9InZlcmJvc2Ugb3V0cHV0IikKLXBhcnNlci5hZGRfb3B0aW9uKCctcScsICctLXF1aWV0JywgYWN0aW9uPSJzdG9yZV9jb25zdCIsIAotICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0wLAotICAgIGhlbHA9Im1pbmltYWwgb3V0cHV0IikKLXBhcnNlci5zZXRfZGVmYXVsdHModmVyYm9zZT0xKQotb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKK2Zyb20gdXRpbCBpbXBvcnQgbG9jYWxfbGlicGF0aAogCitTQ1JJUFRfRElSID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCisKK1NDUklQVFMgPSBbCisgICAgJ0Zhc3RiaW5hcnlUZXN0LnB5JywKKyAgICAnVGVzdEZyb3plbi5weScsCisgICAgJ1Rlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5weScsCisgICAgJ1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnB5JywKKyAgICAnU2VyaWFsaXphdGlvblRlc3QucHknLAorICAgICdUZXN0RW9mLnB5JywKKyAgICAnVGVzdFN5bnRheC5weScsCisgICAgJ1Rlc3RTb2NrZXQucHknLAorXQogRlJBTUVEID0gWyJUTm9uYmxvY2tpbmdTZXJ2ZXIiXQogU0tJUF9aTElCID0gWydUTm9uYmxvY2tpbmdTZXJ2ZXInLCAnVEh0dHBTZXJ2ZXInXQotU0tJUF9TU0wgPSBbJ1ROb25ibG9ja2luZ1NlcnZlcicsICdUSHR0cFNlcnZlciddCi1FWFRSQV9ERUxBWSA9IFsnVFByb2Nlc3NQb29sU2VydmVyJ10KLUVYVFJBX1NMRUVQID0gMy41CitTS0lQX1NTTCA9IFsnVEh0dHBTZXJ2ZXInXQorRVhUUkFfREVMQVkgPSBkaWN0KFRQcm9jZXNzUG9vbFNlcnZlcj01LjUpCiAKLVBST1RPUz0gWworUFJPVE9TID0gWwogICAgICdhY2NlbCcsCisgICAgJ2FjY2VsYycsCiAgICAgJ2JpbmFyeScsCi0gICAgJ2NvbXBhY3QnIF0KKyAgICAnY29tcGFjdCcsCisgICAgJ2pzb24nLAorICAgICdoZWFkZXInLAorXQogCi1TRVJWRVJTID0gWwotICAiVFNpbXBsZVNlcnZlciIsCi0gICJUVGhyZWFkZWRTZXJ2ZXIiLAotICAiVFRocmVhZFBvb2xTZXJ2ZXIiLAotICAiVFByb2Nlc3NQb29sU2VydmVyIiwgIyBuZXchCi0gICJURm9ya2luZ1NlcnZlciIsCi0gICJUTm9uYmxvY2tpbmdTZXJ2ZXIiLAotICAiVEh0dHBTZXJ2ZXIiIF0KIAotIyBUZXN0IGZvciBwcmVzZW5jZSBvZiBtdWx0aXByb2Nlc3NpbmcgbW9kdWxlLCBhbmQgaWYgaXQgaXMgbm90IHByZXNlbnQsIHRoZW4KLSMgcmVtb3ZlIGl0IGZyb20gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHNlcnZlcnMuCi10cnk6Ci0gIGltcG9ydCBtdWx0aXByb2Nlc3NpbmcKLWV4Y2VwdDoKLSAgcHJpbnQgJ1dhcm5pbmc6IHRoZSBtdWx0aXByb2Nlc3NpbmcgbW9kdWxlIGlzIHVuYXZhaWxhYmxlLiBTa2lwcGluZyB0ZXN0cyBmb3IgVFByb2Nlc3NQb29sU2VydmVyJwotICBTRVJWRVJTLnJlbW92ZSgnVFByb2Nlc3NQb29sU2VydmVyJykKLQotdHJ5OgotICBpbXBvcnQgc3NsCi1leGNlcHQ6Ci0gIHByaW50ICdXYXJuaW5nLCBubyBzc2wgbW9kdWxlIGF2YWlsYWJsZS4gU2tpcHBpbmcgYWxsIFNTTCB0ZXN0cy4nCi0gIFNLSVBfU1NMLmV4dGVuZChTRVJWRVJTKQotCi0jIGNvbW1hbmRsaW5lIHBlcm1pdHMgYSBzaW5nbGUgY2xhc3MgbmFtZSB0byBiZSBzcGVjaWZpZWQgdG8gb3ZlcnJpZGUgU0VSVkVSUz1bLi4uXQotaWYgbGVuKGFyZ3MpID09IDE6Ci0gIGlmIGFyZ3NbMF0gaW4gU0VSVkVSUzoKLSAgICBTRVJWRVJTID0gYXJncwotICBlbHNlOgotICAgIHByaW50ICdVbmF2YWlsYWJsZSBzZXJ2ZXIgdHlwZSAiJXMiLCBwbGVhc2UgY2hvb3NlIG9uZSBvZjogJXMnICUgKGFyZ3NbMF0sIFNFUlZFUlMpCi0gICAgc3lzLmV4aXQoMCkKK2RlZiBkZWZhdWx0X3NlcnZlcnMoKToKKyAgICBzZXJ2ZXJzID0gWworICAgICAgICAnVFNpbXBsZVNlcnZlcicsCisgICAgICAgICdUVGhyZWFkZWRTZXJ2ZXInLAorICAgICAgICAnVFRocmVhZFBvb2xTZXJ2ZXInLAorICAgICAgICAnVE5vbmJsb2NraW5nU2VydmVyJywKKyAgICAgICAgJ1RIdHRwU2VydmVyJywKKyAgICBdCisgICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgIT0gJ1dpbmRvd3MnOgorICAgICAgICBzZXJ2ZXJzLmFwcGVuZCgnVFByb2Nlc3NQb29sU2VydmVyJykKKyAgICAgICAgc2VydmVycy5hcHBlbmQoJ1RGb3JraW5nU2VydmVyJykKKyAgICByZXR1cm4gc2VydmVycwogCiAKIGRlZiByZWxmaWxlKGZuYW1lKToKLSAgICByZXR1cm4gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksIGZuYW1lKQorICAgIHJldHVybiBvcy5wYXRoLmpvaW4oU0NSSVBUX0RJUiwgZm5hbWUpCiAKLWRlZiBydW5UZXN0KHNlcnZlcl9jbGFzcywgcHJvdG8sIHBvcnQsIHVzZV96bGliLCB1c2Vfc3NsKToKLSAgIyBCdWlsZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzCi0gIHNlcnZlcl9hcmdzID0gW3N5cy5leGVjdXRhYmxlLCByZWxmaWxlKCdUZXN0U2VydmVyLnB5JykgXQotICBjbGlfYXJncyA9IFtzeXMuZXhlY3V0YWJsZSwgcmVsZmlsZSgnVGVzdENsaWVudC5weScpIF0KLSAgZm9yIHdoaWNoIGluIChzZXJ2ZXJfYXJncywgY2xpX2FyZ3MpOgotICAgIHdoaWNoLmFwcGVuZCgnLS1wcm90bz0lcycgJSBwcm90bykgIyBhY2NlbCwgYmluYXJ5IG9yIGNvbXBhY3QKLSAgICB3aGljaC5hcHBlbmQoJy0tcG9ydD0lZCcgJSBwb3J0KSAjIGRlZmF1bHQgdG8gOTA5MAotICAgIGlmIHVzZV96bGliOgotICAgICAgd2hpY2guYXBwZW5kKCctLXpsaWInKQotICAgIGlmIHVzZV9zc2w6Ci0gICAgICB3aGljaC5hcHBlbmQoJy0tc3NsJykKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPT0gMDoKLSAgICAgIHdoaWNoLmFwcGVuZCgnLXEnKQotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA9PSAyOgotICAgICAgd2hpY2guYXBwZW5kKCctdicpCi0gICMgc2VydmVyLXNwZWNpZmljIG9wdGlvbiB0byBzZWxlY3Qgc2VydmVyIGNsYXNzCi0gIHNlcnZlcl9hcmdzLmFwcGVuZChzZXJ2ZXJfY2xhc3MpCi0gICMgY2xpZW50LXNwZWNpZmljIGNtZGxpbmUgb3B0aW9ucwotICBpZiBzZXJ2ZXJfY2xhc3MgaW4gRlJBTUVEOgotICAgIGNsaV9hcmdzLmFwcGVuZCgnLS1mcmFtZWQnKQotICBpZiBzZXJ2ZXJfY2xhc3MgPT0gJ1RIdHRwU2VydmVyJzoKLSAgICBjbGlfYXJncy5hcHBlbmQoJy0taHR0cD0vJykKLSAgaWYgb3B0aW9ucy52ZXJib3NlID4gMDoKLSAgICBwcmludCAnVGVzdGluZyBzZXJ2ZXIgJXM6ICVzJyAlIChzZXJ2ZXJfY2xhc3MsICcgJy5qb2luKHNlcnZlcl9hcmdzKSkKLSAgc2VydmVycHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oc2VydmVyX2FyZ3MpCi0gIHRpbWUuc2xlZXAoMC4yKQotICB0cnk6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMDoKLSAgICAgIHByaW50ICdUZXN0aW5nIGNsaWVudDogJXMnICUgKCcgJy5qb2luKGNsaV9hcmdzKSkKLSAgICByZXQgPSBzdWJwcm9jZXNzLmNhbGwoY2xpX2FyZ3MpCisKK2RlZiBzZXR1cF9weXBhdGgobGliZGlyLCBnZW5kaXIpOgorICAgIGRpcnMgPSBbbGliZGlyLCBnZW5kaXJdCisgICAgZW52ID0gY29weS5kZWVwY29weShvcy5lbnZpcm9uKQorICAgIHB5cGF0aCA9IGVudi5nZXQoJ1BZVEhPTlBBVEgnLCBOb25lKQorICAgIGlmIHB5cGF0aDoKKyAgICAgICAgZGlycy5hcHBlbmQocHlwYXRoKQorICAgIGVudlsnUFlUSE9OUEFUSCddID0gb3MucGF0aHNlcC5qb2luKGRpcnMpCisgICAgaWYgZ2VuZGlyLmVuZHN3aXRoKCdnZW4tcHktbm9fdXRmOHN0cmluZ3MnKToKKyAgICAgICAgZW52WydUSFJJRlRfVEVTVF9QWV9OT19VVEY4U1RSSU5HUyddID0gJzEnCisgICAgcmV0dXJuIGVudgorCisKK2RlZiBydW5TY3JpcHRUZXN0KGxpYmRpciwgZ2VuYmFzZSwgZ2VucHlkaXIsIHNjcmlwdCk6CisgICAgZW52ID0gc2V0dXBfcHlwYXRoKGxpYmRpciwgb3MucGF0aC5qb2luKGdlbmJhc2UsIGdlbnB5ZGlyKSkKKyAgICBzY3JpcHRfYXJncyA9IFtzeXMuZXhlY3V0YWJsZSwgcmVsZmlsZShzY3JpcHQpXQorICAgIHByaW50KCdcblRlc3Rpbmcgc2NyaXB0OiAlc1xuLS0tLScgJSAoJyAnLmpvaW4oc2NyaXB0X2FyZ3MpKSkKKyAgICByZXQgPSBzdWJwcm9jZXNzLmNhbGwoc2NyaXB0X2FyZ3MsIGVudj1lbnYpCiAgICAgaWYgcmV0ICE9IDA6Ci0gICAgICByYWlzZSBFeGNlcHRpb24oIkNsaWVudCBzdWJwcm9jZXNzIGZhaWxlZCwgcmV0Y29kZT0lZCwgYXJnczogJXMiICUgKHJldCwgJyAnLmpvaW4oY2xpX2FyZ3MpKSkKLSAgZmluYWxseToKLSAgICAjIGNoZWNrIHRoYXQgc2VydmVyIGRpZG4ndCBkaWUKLSAgICBzZXJ2ZXJwcm9jLnBvbGwoKQotICAgIGlmIHNlcnZlcnByb2MucmV0dXJuY29kZSBpcyBub3QgTm9uZToKLSAgICAgIHByaW50ICdGQUlMOiBTZXJ2ZXIgcHJvY2VzcyAoJXMpIGZhaWxlZCB3aXRoIHJldGNvZGUgJWQnICUgKCcgJy5qb2luKHNlcnZlcl9hcmdzKSwgc2VydmVycHJvYy5yZXR1cm5jb2RlKQotICAgICAgcmFpc2UgRXhjZXB0aW9uKCdTZXJ2ZXIgc3VicHJvY2VzcyAlcyBkaWVkLCBhcmdzOiAlcycgJSAoc2VydmVyX2NsYXNzLCAnICcuam9pbihzZXJ2ZXJfYXJncykpKQotICAgIGVsc2U6Ci0gICAgICBpZiBzZXJ2ZXJfY2xhc3MgaW4gRVhUUkFfREVMQVk6Ci0gICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDA6Ci0gICAgICAgICAgcHJpbnQgJ0dpdmluZyAlcyAocHJvdG89JXMsemxpYj0lcyxzc2w9JXMpIGFuIGV4dHJhICVkIHNlY29uZHMgZm9yIGNoaWxkIHByb2Nlc3NlcyB0byB0ZXJtaW5hdGUgdmlhIGFsYXJtJyAlIChzZXJ2ZXJfY2xhc3MsCi0gICAgICAgICAgICAgICAgcHJvdG8sIHVzZV96bGliLCB1c2Vfc3NsLCBFWFRSQV9TTEVFUCkKLSAgICAgICAgdGltZS5zbGVlcChFWFRSQV9TTEVFUCkKLSAgICAgIG9zLmtpbGwoc2VydmVycHJvYy5waWQsIHNpZ25hbC5TSUdLSUxMKQotICAjIHdhaXQgZm9yIHNodXRkb3duCi0gIHRpbWUuc2xlZXAoMC4xKQorICAgICAgICBwcmludCgnKioqIEZBSUxFRCAqKionLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHByaW50KCdMSUJESVI6ICVzJyAlIGxpYmRpciwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBwcmludCgnUFlfR0VOOiAlcycgJSBnZW5weWRpciwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBwcmludCgnU0NSSVBUOiAlcycgJSBzY3JpcHQsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJTY3JpcHQgc3VicHJvY2VzcyBmYWlsZWQsIHJldGNvZGU9JWQsIGFyZ3M6ICVzIiAlIChyZXQsICcgJy5qb2luKHNjcmlwdF9hcmdzKSkpCiAKLXRlc3RfY291bnQgPSAwCi1mb3IgdHJ5X3NlcnZlciBpbiBTRVJWRVJTOgotICBmb3IgdHJ5X3Byb3RvIGluIFBST1RPUzoKLSAgICBmb3Igd2l0aF96bGliIGluIChGYWxzZSwgVHJ1ZSk6Ci0gICAgICAjIHNraXAgYW55IHNlcnZlcnMgdGhhdCBkb24ndCB3b3JrIHdpdGggdGhlIFpsaWIgdHJhbnNwb3J0Ci0gICAgICBpZiB3aXRoX3psaWIgYW5kIHRyeV9zZXJ2ZXIgaW4gU0tJUF9aTElCOgotICAgICAgICBjb250aW51ZQotICAgICAgZm9yIHdpdGhfc3NsIGluIChGYWxzZSwgVHJ1ZSk6CisKK2RlZiBydW5TZXJ2aWNlVGVzdChsaWJkaXIsIGdlbmJhc2UsIGdlbnB5ZGlyLCBzZXJ2ZXJfY2xhc3MsIHByb3RvLCBwb3J0LCB1c2VfemxpYiwgdXNlX3NzbCwgdmVyYm9zZSk6CisgICAgZW52ID0gc2V0dXBfcHlwYXRoKGxpYmRpciwgb3MucGF0aC5qb2luKGdlbmJhc2UsIGdlbnB5ZGlyKSkKKyAgICAjIEJ1aWxkIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICBzZXJ2ZXJfYXJncyA9IFtzeXMuZXhlY3V0YWJsZSwgcmVsZmlsZSgnVGVzdFNlcnZlci5weScpXQorICAgIGNsaV9hcmdzID0gW3N5cy5leGVjdXRhYmxlLCByZWxmaWxlKCdUZXN0Q2xpZW50LnB5JyldCisgICAgZm9yIHdoaWNoIGluIChzZXJ2ZXJfYXJncywgY2xpX2FyZ3MpOgorICAgICAgICB3aGljaC5hcHBlbmQoJy0tcHJvdG9jb2w9JXMnICUgcHJvdG8pICAjIGFjY2VsLCBiaW5hcnksIGNvbXBhY3Qgb3IganNvbgorICAgICAgICB3aGljaC5hcHBlbmQoJy0tcG9ydD0lZCcgJSBwb3J0KSAgIyBkZWZhdWx0IHRvIDkwOTAKKyAgICAgICAgaWYgdXNlX3psaWI6CisgICAgICAgICAgICB3aGljaC5hcHBlbmQoJy0temxpYicpCisgICAgICAgIGlmIHVzZV9zc2w6CisgICAgICAgICAgICB3aGljaC5hcHBlbmQoJy0tc3NsJykKKyAgICAgICAgaWYgdmVyYm9zZSA9PSAwOgorICAgICAgICAgICAgd2hpY2guYXBwZW5kKCctcScpCisgICAgICAgIGlmIHZlcmJvc2UgPT0gMjoKKyAgICAgICAgICAgIHdoaWNoLmFwcGVuZCgnLXYnKQorICAgICMgc2VydmVyLXNwZWNpZmljIG9wdGlvbiB0byBzZWxlY3Qgc2VydmVyIGNsYXNzCisgICAgc2VydmVyX2FyZ3MuYXBwZW5kKHNlcnZlcl9jbGFzcykKKyAgICAjIGNsaWVudC1zcGVjaWZpYyBjbWRsaW5lIG9wdGlvbnMKKyAgICBpZiBzZXJ2ZXJfY2xhc3MgaW4gRlJBTUVEOgorICAgICAgICBjbGlfYXJncy5hcHBlbmQoJy0tdHJhbnNwb3J0PWZyYW1lZCcpCisgICAgZWxzZToKKyAgICAgICAgY2xpX2FyZ3MuYXBwZW5kKCctLXRyYW5zcG9ydD1idWZmZXJlZCcpCisgICAgaWYgc2VydmVyX2NsYXNzID09ICdUSHR0cFNlcnZlcic6CisgICAgICAgIGNsaV9hcmdzLmFwcGVuZCgnLS1odHRwPS8nKQorICAgIGlmIHZlcmJvc2UgPiAwOgorICAgICAgICBwcmludCgnVGVzdGluZyBzZXJ2ZXIgJXM6ICVzJyAlIChzZXJ2ZXJfY2xhc3MsICcgJy5qb2luKHNlcnZlcl9hcmdzKSkpCisgICAgc2VydmVycHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oc2VydmVyX2FyZ3MsIGVudj1lbnYpCisKKyAgICBkZWYgZW5zdXJlU2VydmVyQWxpdmUoKToKKyAgICAgICAgaWYgc2VydmVycHJvYy5wb2xsKCkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwcmludCgoJ0ZBSUw6IFNlcnZlciBwcm9jZXNzICglcykgZmFpbGVkIHdpdGggcmV0Y29kZSAlZCcpCisgICAgICAgICAgICAgICAgICAlICgnICcuam9pbihzZXJ2ZXJfYXJncyksIHNlcnZlcnByb2MucmV0dXJuY29kZSkpCisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ1NlcnZlciBzdWJwcm9jZXNzICVzIGRpZWQsIGFyZ3M6ICVzJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHNlcnZlcl9jbGFzcywgJyAnLmpvaW4oc2VydmVyX2FyZ3MpKSkKKworICAgICMgV2FpdCBmb3IgdGhlIHNlcnZlciB0byBzdGFydCBhY2NlcHRpbmcgY29ubmVjdGlvbnMgb24gdGhlIGdpdmVuIHBvcnQuCisgICAgc2xlZXBfdGltZSA9IDAuMSAgIyBTZWNvbmRzCisgICAgbWF4X2F0dGVtcHRzID0gMTAwCisgICAgYXR0ZW1wdCA9IDAKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBzb2NrNCA9IHNvY2tldC5zb2NrZXQoKQorICAgICAgICBzb2NrNiA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQ2KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzb2NrNC5jb25uZWN0X2V4KCgnMTI3LjAuMC4xJywgcG9ydCkpID09IDAgXAorICAgICAgICAgICAgICAgICAgICBvciBzb2NrNi5jb25uZWN0X2V4KCgnOjoxJywgcG9ydCkpID09IDA6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGF0dGVtcHQgKz0gMQorICAgICAgICAgICAgaWYgYXR0ZW1wdCA+PSBtYXhfYXR0ZW1wdHM6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJUZXN0U2VydmVyIG5vdCByZWFkeSBvbiBwb3J0ICVkIGFmdGVyICUuMmYgc2Vjb25kcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAocG9ydCwgc2xlZXBfdGltZSAqIGF0dGVtcHQpKQorICAgICAgICAgICAgZW5zdXJlU2VydmVyQWxpdmUoKQorICAgICAgICAgICAgdGltZS5zbGVlcChzbGVlcF90aW1lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc29jazQuY2xvc2UoKQorICAgICAgICAgICAgc29jazYuY2xvc2UoKQorCisgICAgdHJ5OgorICAgICAgICBpZiB2ZXJib3NlID4gMDoKKyAgICAgICAgICAgIHByaW50KCdUZXN0aW5nIGNsaWVudDogJXMnICUgKCcgJy5qb2luKGNsaV9hcmdzKSkpCisgICAgICAgIHJldCA9IHN1YnByb2Nlc3MuY2FsbChjbGlfYXJncywgZW52PWVudikKKyAgICAgICAgaWYgcmV0ICE9IDA6CisgICAgICAgICAgICBwcmludCgnKioqIEZBSUxFRCAqKionLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICBwcmludCgnTElCRElSOiAlcycgJSBsaWJkaXIsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgICAgIHByaW50KCdQWV9HRU46ICVzJyAlIGdlbnB5ZGlyLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkNsaWVudCBzdWJwcm9jZXNzIGZhaWxlZCwgcmV0Y29kZT0lZCwgYXJnczogJXMiICUgKHJldCwgJyAnLmpvaW4oY2xpX2FyZ3MpKSkKKyAgICBmaW5hbGx5OgorICAgICAgICAjIGNoZWNrIHRoYXQgc2VydmVyIGRpZG4ndCBkaWUKKyAgICAgICAgZW5zdXJlU2VydmVyQWxpdmUoKQorICAgICAgICBleHRyYV9zbGVlcCA9IEVYVFJBX0RFTEFZLmdldChzZXJ2ZXJfY2xhc3MsIDApCisgICAgICAgIGlmIGV4dHJhX3NsZWVwID4gMCBhbmQgdmVyYm9zZSA+IDA6CisgICAgICAgICAgICBwcmludCgnR2l2aW5nICVzIChwcm90bz0lcyx6bGliPSVzLHNzbD0lcykgYW4gZXh0cmEgJWQgc2Vjb25kcyBmb3IgY2hpbGQnCisgICAgICAgICAgICAgICAgICAncHJvY2Vzc2VzIHRvIHRlcm1pbmF0ZSB2aWEgYWxhcm0nCisgICAgICAgICAgICAgICAgICAlIChzZXJ2ZXJfY2xhc3MsIHByb3RvLCB1c2VfemxpYiwgdXNlX3NzbCwgZXh0cmFfc2xlZXApKQorICAgICAgICAgICAgdGltZS5zbGVlcChleHRyYV9zbGVlcCkKKyAgICAgICAgc2lnID0gc2lnbmFsLlNJR0tJTEwgaWYgcGxhdGZvcm0uc3lzdGVtKCkgIT0gJ1dpbmRvd3MnIGVsc2Ugc2lnbmFsLlNJR0FCUlQKKyAgICAgICAgb3Mua2lsbChzZXJ2ZXJwcm9jLnBpZCwgc2lnKQorICAgICAgICBzZXJ2ZXJwcm9jLndhaXQoKQorCisKK2NsYXNzIFRlc3RDYXNlcyhvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBnZW5iYXNlLCBsaWJkaXIsIHBvcnQsIGdlbmRpcnMsIHNlcnZlcnMsIHZlcmJvc2UpOgorICAgICAgICBzZWxmLmdlbmJhc2UgPSBnZW5iYXNlCisgICAgICAgIHNlbGYubGliZGlyID0gbGliZGlyCisgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi52ZXJib3NlID0gdmVyYm9zZQorICAgICAgICBzZWxmLmdlbmRpcnMgPSBnZW5kaXJzCisgICAgICAgIHNlbGYuc2VydmVycyA9IHNlcnZlcnMKKworICAgIGRlZiBkZWZhdWx0X2NvbmYoc2VsZik6CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAnZ2VuZGlyJzogc2VsZi5nZW5kaXJzWzBdLAorICAgICAgICAgICAgJ3NlcnZlcic6IHNlbGYuc2VydmVyc1swXSwKKyAgICAgICAgICAgICdwcm90byc6IFBST1RPU1swXSwKKyAgICAgICAgICAgICd6bGliJzogRmFsc2UsCisgICAgICAgICAgICAnc3NsJzogRmFsc2UsCisgICAgICAgIH0KKworICAgIGRlZiBydW4oc2VsZiwgY29uZiwgdGVzdF9jb3VudCk6CisgICAgICAgIHdpdGhfemxpYiA9IGNvbmZbJ3psaWInXQorICAgICAgICB3aXRoX3NzbCA9IGNvbmZbJ3NzbCddCisgICAgICAgIHRyeV9zZXJ2ZXIgPSBjb25mWydzZXJ2ZXInXQorICAgICAgICB0cnlfcHJvdG8gPSBjb25mWydwcm90byddCisgICAgICAgIGdlbnB5ZGlyID0gY29uZlsnZ2VuZGlyJ10KKyAgICAgICAgIyBza2lwIGFueSBzZXJ2ZXJzIHRoYXQgZG9uJ3Qgd29yayB3aXRoIHRoZSBabGliIHRyYW5zcG9ydAorICAgICAgICBpZiB3aXRoX3psaWIgYW5kIHRyeV9zZXJ2ZXIgaW4gU0tJUF9aTElCOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICMgc2tpcCBhbnkgc2VydmVycyB0aGF0IGRvbid0IHdvcmsgd2l0aCBTU0wKICAgICAgICAgaWYgd2l0aF9zc2wgYW5kIHRyeV9zZXJ2ZXIgaW4gU0tJUF9TU0w6Ci0gICAgICAgICAgY29udGludWUKLSAgICAgICAgdGVzdF9jb3VudCArPSAxCi0gICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDA6Ci0gICAgICAgICAgcHJpbnQgJ1xuVGVzdCBydW4gIyVkOiAgU2VydmVyPSVzLCAgUHJvdG89JXMsICB6bGliPSVzLCAgU1NMPSVzJyAlICh0ZXN0X2NvdW50LCB0cnlfc2VydmVyLCB0cnlfcHJvdG8sIHdpdGhfemxpYiwgd2l0aF9zc2wpCi0gICAgICAgIHJ1blRlc3QodHJ5X3NlcnZlciwgdHJ5X3Byb3RvLCBvcHRpb25zLnBvcnQsIHdpdGhfemxpYiwgd2l0aF9zc2wpCi0gICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDA6Ci0gICAgICAgICAgcHJpbnQgJ09LOiBGaW5pc2hlZCAgJXMgLyAlcyBwcm90byAvIHpsaWI9JXMgLyBTU0w9JXMuICAgJWQgY29tYmluYXRpb25zIHRlc3RlZC4nICUgKHRyeV9zZXJ2ZXIsIHRyeV9wcm90bywgd2l0aF96bGliLCB3aXRoX3NzbCwgdGVzdF9jb3VudCkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBzZWxmLnZlcmJvc2UgPiAwOgorICAgICAgICAgICAgcHJpbnQoJ1xuVGVzdCBydW4gIyVkOiAgKGluY2x1ZGVzICVzKSBTZXJ2ZXI9JXMsICBQcm90bz0lcywgIHpsaWI9JXMsICBTU0w9JXMnCisgICAgICAgICAgICAgICAgICAlICh0ZXN0X2NvdW50LCBnZW5weWRpciwgdHJ5X3NlcnZlciwgdHJ5X3Byb3RvLCB3aXRoX3psaWIsIHdpdGhfc3NsKSkKKyAgICAgICAgcnVuU2VydmljZVRlc3Qoc2VsZi5saWJkaXIsIHNlbGYuZ2VuYmFzZSwgZ2VucHlkaXIsIHRyeV9zZXJ2ZXIsIHRyeV9wcm90bywgc2VsZi5wb3J0LCB3aXRoX3psaWIsIHdpdGhfc3NsLCBzZWxmLnZlcmJvc2UpCisgICAgICAgIGlmIHNlbGYudmVyYm9zZSA+IDA6CisgICAgICAgICAgICBwcmludCgnT0s6IEZpbmlzaGVkIChpbmNsdWRlcyAlcykgICVzIC8gJXMgcHJvdG8gLyB6bGliPSVzIC8gU1NMPSVzLiAgICVkIGNvbWJpbmF0aW9ucyB0ZXN0ZWQuJworICAgICAgICAgICAgICAgICAgJSAoZ2VucHlkaXIsIHRyeV9zZXJ2ZXIsIHRyeV9wcm90bywgd2l0aF96bGliLCB3aXRoX3NzbCwgdGVzdF9jb3VudCkpCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgdGVzdF9mZWF0dXJlKHNlbGYsIG5hbWUsIHZhbHVlcyk6CisgICAgICAgIHRlc3RfY291bnQgPSAwCisgICAgICAgIGNvbmYgPSBzZWxmLmRlZmF1bHRfY29uZigpCisgICAgICAgIGZvciB0cnlfc2VydmVyIGluIHZhbHVlczoKKyAgICAgICAgICAgIGNvbmZbbmFtZV0gPSB0cnlfc2VydmVyCisgICAgICAgICAgICBpZiBzZWxmLnJ1bihjb25mLCB0ZXN0X2NvdW50KToKKyAgICAgICAgICAgICAgICB0ZXN0X2NvdW50ICs9IDEKKyAgICAgICAgcmV0dXJuIHRlc3RfY291bnQKKworICAgIGRlZiBydW5fYWxsX3Rlc3RzKHNlbGYpOgorICAgICAgICB0ZXN0X2NvdW50ID0gMAorICAgICAgICBmb3IgdHJ5X3NlcnZlciBpbiBzZWxmLnNlcnZlcnM6CisgICAgICAgICAgICBmb3IgZ2VucHlkaXIgaW4gc2VsZi5nZW5kaXJzOgorICAgICAgICAgICAgICAgIGZvciB0cnlfcHJvdG8gaW4gUFJPVE9TOgorICAgICAgICAgICAgICAgICAgICBmb3Igd2l0aF96bGliIGluIChGYWxzZSwgVHJ1ZSk6CisgICAgICAgICAgICAgICAgICAgICAgICAjIHNraXAgYW55IHNlcnZlcnMgdGhhdCBkb24ndCB3b3JrIHdpdGggdGhlIFpsaWIgdHJhbnNwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB3aXRoX3psaWIgYW5kIHRyeV9zZXJ2ZXIgaW4gU0tJUF9aTElCOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBmb3Igd2l0aF9zc2wgaW4gKEZhbHNlLCBUcnVlKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNraXAgYW55IHNlcnZlcnMgdGhhdCBkb24ndCB3b3JrIHdpdGggU1NMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgd2l0aF9zc2wgYW5kIHRyeV9zZXJ2ZXIgaW4gU0tJUF9TU0w6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9jb3VudCArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi52ZXJib3NlID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ1xuVGVzdCBydW4gIyVkOiAgKGluY2x1ZGVzICVzKSBTZXJ2ZXI9JXMsICBQcm90bz0lcywgIHpsaWI9JXMsICBTU0w9JXMnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHRlc3RfY291bnQsIGdlbnB5ZGlyLCB0cnlfc2VydmVyLCB0cnlfcHJvdG8sIHdpdGhfemxpYiwgd2l0aF9zc2wpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blNlcnZpY2VUZXN0KHNlbGYubGliZGlyLCBzZWxmLmdlbmJhc2UsIGdlbnB5ZGlyLCB0cnlfc2VydmVyLCB0cnlfcHJvdG8sIHNlbGYucG9ydCwgd2l0aF96bGliLCB3aXRoX3NzbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2UgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgnT0s6IEZpbmlzaGVkIChpbmNsdWRlcyAlcykgICVzIC8gJXMgcHJvdG8gLyB6bGliPSVzIC8gU1NMPSVzLiAgICVkIGNvbWJpbmF0aW9ucyB0ZXN0ZWQuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChnZW5weWRpciwgdHJ5X3NlcnZlciwgdHJ5X3Byb3RvLCB3aXRoX3psaWIsIHdpdGhfc3NsLCB0ZXN0X2NvdW50KSkKKyAgICAgICAgcmV0dXJuIHRlc3RfY291bnQKKworCitkZWYgbWFpbigpOgorICAgIHBhcnNlciA9IE9wdGlvblBhcnNlcigpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tYWxsJywgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0nYWxsJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1nZW5weWRpcnMnLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdnZW5weWRpcnMnLAorICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9J2RlZmF1bHQsc2xvdHMsb2xkc3R5bGUsbm9fdXRmOHN0cmluZ3MsZHluYW1pYyxkeW5hbWljc2xvdHMnLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2RpcmVjdG9yeSBleHRlbnNpb25zIGZvciBnZW5lcmF0ZWQgY29kZSwgdXNlZCBhcyBzdWZmaXhlcyBmb3IgXCJnZW4tcHktKlwiIGFkZGVkIHN5cy5wYXRoIGZvciBpbmRpdmlkdWFsIHRlc3RzJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1wb3J0IiwgdHlwZT0iaW50IiwgZGVzdD0icG9ydCIsIGRlZmF1bHQ9OTA5MCwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJwb3J0IG51bWJlciBmb3Igc2VydmVyIHRvIGxpc3RlbiBvbiIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy12JywgJy0tdmVyYm9zZScsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0yLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InZlcmJvc2Ugb3V0cHV0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0wLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Im1pbmltYWwgb3V0cHV0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLUwnLCAnLS1saWJkaXInLCBkZXN0PSJsaWJkaXIiLCBkZWZhdWx0PWxvY2FsX2xpYnBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJkaXJlY3RvcnkgcGF0aCB0aGF0IGNvbnRhaW5zIFRocmlmdCBQeXRob24gbGlicmFyeSIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tZ2VuLWJhc2UnLCBkZXN0PSJnZW5fYmFzZSIsIGRlZmF1bHQ9U0NSSVBUX0RJUiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJkaXJlY3RvcnkgcGF0aCB0aGF0IGNvbnRhaW5zIFRocmlmdCBQeXRob24gbGlicmFyeSIpCisgICAgcGFyc2VyLnNldF9kZWZhdWx0cyh2ZXJib3NlPTEpCisgICAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICAgIGdlbmVyYXRlZF9kaXJzID0gW10KKyAgICBmb3IgZ3BfZGlyIGluIG9wdGlvbnMuZ2VucHlkaXJzLnNwbGl0KCcsJyk6CisgICAgICAgIGdlbmVyYXRlZF9kaXJzLmFwcGVuZCgnZ2VuLXB5LSVzJyAlIChncF9kaXIpKQorCisgICAgIyBjb21tYW5kbGluZSBwZXJtaXRzIGEgc2luZ2xlIGNsYXNzIG5hbWUgdG8gYmUgc3BlY2lmaWVkIHRvIG92ZXJyaWRlIFNFUlZFUlM9Wy4uLl0KKyAgICBzZXJ2ZXJzID0gZGVmYXVsdF9zZXJ2ZXJzKCkKKyAgICBpZiBsZW4oYXJncykgPT0gMToKKyAgICAgICAgaWYgYXJnc1swXSBpbiBzZXJ2ZXJzOgorICAgICAgICAgICAgc2VydmVycyA9IGFyZ3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50KCdVbmF2YWlsYWJsZSBzZXJ2ZXIgdHlwZSAiJXMiLCBwbGVhc2UgY2hvb3NlIG9uZSBvZjogJXMnICUgKGFyZ3NbMF0sIHNlcnZlcnMpKQorICAgICAgICAgICAgc3lzLmV4aXQoMCkKKworICAgIHRlc3RzID0gVGVzdENhc2VzKG9wdGlvbnMuZ2VuX2Jhc2UsIG9wdGlvbnMubGliZGlyLCBvcHRpb25zLnBvcnQsIGdlbmVyYXRlZF9kaXJzLCBzZXJ2ZXJzLCBvcHRpb25zLnZlcmJvc2UpCisKKyAgICAjIHJ1biB0ZXN0cyB3aXRob3V0IGEgY2xpZW50L3NlcnZlciBmaXJzdAorICAgIHByaW50KCctLS0tLS0tLS0tLS0tLS0tJykKKyAgICBwcmludCgnIEV4ZWN1dGluZyBpbmRpdmlkdWFsIHRlc3Qgc2NyaXB0cyB3aXRoIHZhcmlvdXMgZ2VuZXJhdGVkIGNvZGUgZGlyZWN0b3JpZXMnKQorICAgIHByaW50KCcgRGlyZWN0b3JpZXMgdG8gYmUgdGVzdGVkOiAnICsgJywgJy5qb2luKGdlbmVyYXRlZF9kaXJzKSkKKyAgICBwcmludCgnIFNjcmlwdHMgdG8gYmUgdGVzdGVkOiAnICsgJywgJy5qb2luKFNDUklQVFMpKQorICAgIHByaW50KCctLS0tLS0tLS0tLS0tLS0tJykKKyAgICBmb3IgZ2VucHlkaXIgaW4gZ2VuZXJhdGVkX2RpcnM6CisgICAgICAgIGZvciBzY3JpcHQgaW4gU0NSSVBUUzoKKyAgICAgICAgICAgIHJ1blNjcmlwdFRlc3Qob3B0aW9ucy5saWJkaXIsIG9wdGlvbnMuZ2VuX2Jhc2UsIGdlbnB5ZGlyLCBzY3JpcHQpCisKKyAgICBwcmludCgnLS0tLS0tLS0tLS0tLS0tLScpCisgICAgcHJpbnQoJyBFeGVjdXRpbmcgQ2xpZW50L1NlcnZlciB0ZXN0cyB3aXRoIHZhcmlvdXMgZ2VuZXJhdGVkIGNvZGUgZGlyZWN0b3JpZXMnKQorICAgIHByaW50KCcgU2VydmVycyB0byBiZSB0ZXN0ZWQ6ICcgKyAnLCAnLmpvaW4oc2VydmVycykpCisgICAgcHJpbnQoJyBEaXJlY3RvcmllcyB0byBiZSB0ZXN0ZWQ6ICcgKyAnLCAnLmpvaW4oZ2VuZXJhdGVkX2RpcnMpKQorICAgIHByaW50KCcgUHJvdG9jb2xzIHRvIGJlIHRlc3RlZDogJyArICcsICcuam9pbihQUk9UT1MpKQorICAgIHByaW50KCcgT3B0aW9ucyB0byBiZSB0ZXN0ZWQ6IFpMSUIoeWVzL25vKSwgU1NMKHllcy9ubyknKQorICAgIHByaW50KCctLS0tLS0tLS0tLS0tLS0tJykKKworICAgIGlmIG9wdGlvbnMuYWxsOgorICAgICAgICB0ZXN0cy5ydW5fYWxsX3Rlc3RzKCkKKyAgICBlbHNlOgorICAgICAgICB0ZXN0cy50ZXN0X2ZlYXR1cmUoJ2dlbmRpcicsIGdlbmVyYXRlZF9kaXJzKQorICAgICAgICB0ZXN0cy50ZXN0X2ZlYXR1cmUoJ3NlcnZlcicsIHNlcnZlcnMpCisgICAgICAgIHRlc3RzLnRlc3RfZmVhdHVyZSgncHJvdG8nLCBQUk9UT1MpCisgICAgICAgIHRlc3RzLnRlc3RfZmVhdHVyZSgnemxpYicsIFtGYWxzZSwgVHJ1ZV0pCisgICAgICAgIHRlc3RzLnRlc3RfZmVhdHVyZSgnc3NsJywgW0ZhbHNlLCBUcnVlXSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHN5cy5leGl0KG1haW4oKSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvU2VyaWFsaXphdGlvblRlc3QucHkgYi90ZXN0L3B5L1NlcmlhbGl6YXRpb25UZXN0LnB5CmluZGV4IDNiYTc2ZmIuLmVmNzk4MzUgMTAwNzU1Ci0tLSBhL3Rlc3QvcHkvU2VyaWFsaXphdGlvblRlc3QucHkKKysrIGIvdGVzdC9weS9TZXJpYWxpemF0aW9uVGVzdC5weQpAQCAtMTksMjM5ICsxOSw0MzkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBzeXMsIGdsb2IKLXN5cy5wYXRoLmluc2VydCgwLCAnLi9nZW4tcHknKQotc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJylbMF0pCitmcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCAoCisgICAgQm9uaywKKyAgICBCb29scywKKyAgICBMYXJnZURlbHRhcywKKyAgICBMaXN0Qm9ua3MsCisgICAgTmVzdGVkTGlzdHNCb25rLAorICAgIE5lc3RlZExpc3RzSTMyeDIsCisgICAgTmVzdGVkTGlzdHNJMzJ4MywKKyAgICBOZXN0ZWRNaXhlZHgyLAorICAgIE51bWJlcnosCisgICAgVmVyc2lvbmluZ1Rlc3RWMSwKKyAgICBWZXJzaW9uaW5nVGVzdFYyLAorICAgIFh0cnVjdCwKKyAgICBYdHJ1Y3QyLAorKQogCi1mcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCAqCitmcm9tIFJlY3Vyc2l2ZS50dHlwZXMgaW1wb3J0IFJlY1RyZWUKK2Zyb20gUmVjdXJzaXZlLnR0eXBlcyBpbXBvcnQgUmVjTGlzdAorZnJvbSBSZWN1cnNpdmUudHR5cGVzIGltcG9ydCBDb1JlYworZnJvbSBSZWN1cnNpdmUudHR5cGVzIGltcG9ydCBDb1JlYzIKK2Zyb20gUmVjdXJzaXZlLnR0eXBlcyBpbXBvcnQgVmVjdG9yVGVzdAogZnJvbSBEZWJ1Z1Byb3RvVGVzdC50dHlwZXMgaW1wb3J0IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QsIEVtcHR5CiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAotZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbCwgVENvbXBhY3RQcm90b2NvbAorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbCwgVENvbXBhY3RQcm90b2NvbCwgVEpTT05Qcm90b2NvbAogZnJvbSB0aHJpZnQuVFNlcmlhbGl6YXRpb24gaW1wb3J0IHNlcmlhbGl6ZSwgZGVzZXJpYWxpemUKK2ltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IHRpbWUKKwogCiBjbGFzcyBBYnN0cmFjdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCi0gIGRlZiBzZXRVcChzZWxmKToKLSAgICAgIHNlbGYudjFvYmogPSBWZXJzaW9uaW5nVGVzdFYxKAotICAgICAgICAgIGJlZ2luX2luX2JvdGg9MTIzNDUsCi0gICAgICAgICAgb2xkX3N0cmluZz0nYWFhJywKLSAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSwKLSAgICAgICAgICApCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnYxb2JqID0gVmVyc2lvbmluZ1Rlc3RWMSgKKyAgICAgICAgICAgIGJlZ2luX2luX2JvdGg9MTIzNDUsCisgICAgICAgICAgICBvbGRfc3RyaW5nPSdhYWEnLAorICAgICAgICAgICAgZW5kX2luX2JvdGg9NTQzMjEsCisgICAgICAgICkKIAotICAgICAgc2VsZi52Mm9iaiA9IFZlcnNpb25pbmdUZXN0VjIoCi0gICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKLSAgICAgICAgICBuZXdpbnQ9MSwKLSAgICAgICAgICBuZXdieXRlPTIsCi0gICAgICAgICAgbmV3c2hvcnQ9MywKLSAgICAgICAgICBuZXdsb25nPTQsCi0gICAgICAgICAgbmV3ZG91YmxlPTUuMCwKLSAgICAgICAgICBuZXdzdHJ1Y3Q9Qm9uayhtZXNzYWdlPSJIZWxsbyEiLCB0eXBlPTEyMyksCi0gICAgICAgICAgbmV3bGlzdD1bNyw4LDldLAotICAgICAgICAgIG5ld3NldD1zZXQoWzQyLDEsOF0pLAotICAgICAgICAgIG5ld21hcD17MToyLDI6M30sCi0gICAgICAgICAgbmV3c3RyaW5nPSJIb2xhISIsCi0gICAgICAgICAgZW5kX2luX2JvdGg9NTQzMjEsCi0gICAgICAgICAgKQorICAgICAgICBzZWxmLnYyb2JqID0gVmVyc2lvbmluZ1Rlc3RWMigKKyAgICAgICAgICAgIGJlZ2luX2luX2JvdGg9MTIzNDUsCisgICAgICAgICAgICBuZXdpbnQ9MSwKKyAgICAgICAgICAgIG5ld2J5dGU9MiwKKyAgICAgICAgICAgIG5ld3Nob3J0PTMsCisgICAgICAgICAgICBuZXdsb25nPTQsCisgICAgICAgICAgICBuZXdkb3VibGU9NS4wLAorICAgICAgICAgICAgbmV3c3RydWN0PUJvbmsobWVzc2FnZT0iSGVsbG8hIiwgdHlwZT0xMjMpLAorICAgICAgICAgICAgbmV3bGlzdD1bNywgOCwgOV0sCisgICAgICAgICAgICBuZXdzZXQ9c2V0KFs0MiwgMSwgOF0pLAorICAgICAgICAgICAgbmV3bWFwPXsxOiAyLCAyOiAzfSwKKyAgICAgICAgICAgIG5ld3N0cmluZz0iSG9sYSEiLAorICAgICAgICAgICAgZW5kX2luX2JvdGg9NTQzMjEsCisgICAgICAgICkKIAotICAgICAgc2VsZi5ib29scyA9IEJvb2xzKGltX3RydWU9VHJ1ZSwgaW1fZmFsc2U9RmFsc2UpCi0gICAgICBzZWxmLmJvb2xzX2ZsaXBwZWQgPSBCb29scyhpbV90cnVlPUZhbHNlLCBpbV9mYWxzZT1UcnVlKQorICAgICAgICBzZWxmLmJvb2xzID0gQm9vbHMoaW1fdHJ1ZT1UcnVlLCBpbV9mYWxzZT1GYWxzZSkKKyAgICAgICAgc2VsZi5ib29sc19mbGlwcGVkID0gQm9vbHMoaW1fdHJ1ZT1GYWxzZSwgaW1fZmFsc2U9VHJ1ZSkKIAotICAgICAgc2VsZi5sYXJnZV9kZWx0YXMgPSBMYXJnZURlbHRhcyAoCi0gICAgICAgICAgYjE9c2VsZi5ib29scywKLSAgICAgICAgICBiMTA9c2VsZi5ib29sc19mbGlwcGVkLAotICAgICAgICAgIGIxMDA9c2VsZi5ib29scywKLSAgICAgICAgICBjaGVja190cnVlPVRydWUsCi0gICAgICAgICAgYjEwMDA9c2VsZi5ib29sc19mbGlwcGVkLAotICAgICAgICAgIGNoZWNrX2ZhbHNlPUZhbHNlLAotICAgICAgICAgIHZlcnR3bzIwMDA9VmVyc2lvbmluZ1Rlc3RWMihuZXdzdHJ1Y3Q9Qm9uayhtZXNzYWdlPSdXb3JsZCEnLCB0eXBlPTMxNCkpLAotICAgICAgICAgIGFfc2V0MjUwMD1zZXQoWydsYXp5JywgJ2Jyb3duJywgJ2NvdyddKSwKLSAgICAgICAgICB2ZXJ0d28zMDAwPVZlcnNpb25pbmdUZXN0VjIobmV3c2V0PXNldChbMiwgMywgNSwgNywgMTFdKSksCi0gICAgICAgICAgYmlnX251bWJlcnM9WzIqKjgsIDIqKjE2LCAyKiozMS0xLCAtKDIqKjMxLTEpXQotICAgICAgICAgICkKKyAgICAgICAgc2VsZi5sYXJnZV9kZWx0YXMgPSBMYXJnZURlbHRhcygKKyAgICAgICAgICAgIGIxPXNlbGYuYm9vbHMsCisgICAgICAgICAgICBiMTA9c2VsZi5ib29sc19mbGlwcGVkLAorICAgICAgICAgICAgYjEwMD1zZWxmLmJvb2xzLAorICAgICAgICAgICAgY2hlY2tfdHJ1ZT1UcnVlLAorICAgICAgICAgICAgYjEwMDA9c2VsZi5ib29sc19mbGlwcGVkLAorICAgICAgICAgICAgY2hlY2tfZmFsc2U9RmFsc2UsCisgICAgICAgICAgICB2ZXJ0d28yMDAwPVZlcnNpb25pbmdUZXN0VjIobmV3c3RydWN0PUJvbmsobWVzc2FnZT0nV29ybGQhJywgdHlwZT0zMTQpKSwKKyAgICAgICAgICAgIGFfc2V0MjUwMD1zZXQoWydsYXp5JywgJ2Jyb3duJywgJ2NvdyddKSwKKyAgICAgICAgICAgIHZlcnR3bzMwMDA9VmVyc2lvbmluZ1Rlc3RWMihuZXdzZXQ9c2V0KFsyLCAzLCA1LCA3LCAxMV0pKSwKKyAgICAgICAgICAgIGJpZ19udW1iZXJzPVsyICoqIDgsIDIgKiogMTYsIDIgKiogMzEgLSAxLCAtKDIgKiogMzEgLSAxKV0KKyAgICAgICAgKQogCi0gICAgICBzZWxmLmNvbXBhY3Rfc3RydWN0ID0gQ29tcGFjdFByb3RvVGVzdFN0cnVjdCgKLSAgICAgICAgICBhX2J5dGUgPSAxMjcsCi0gICAgICAgICAgYV9pMTY9MzIwMDAsCi0gICAgICAgICAgYV9pMzI9MTAwMDAwMDAwMCwKLSAgICAgICAgICBhX2k2ND0weGZmZmZmZmZmZmYsCi0gICAgICAgICAgYV9kb3VibGU9NS42Nzg5LAotICAgICAgICAgIGFfc3RyaW5nPSJteSBzdHJpbmciLAotICAgICAgICAgIHRydWVfZmllbGQ9VHJ1ZSwKLSAgICAgICAgICBmYWxzZV9maWVsZD1GYWxzZSwKLSAgICAgICAgICBlbXB0eV9zdHJ1Y3RfZmllbGQ9RW1wdHkoKSwKLSAgICAgICAgICBieXRlX2xpc3Q9Wy0xMjcsIC0xLCAwLCAxLCAxMjddLAotICAgICAgICAgIGkxNl9saXN0PVstMSwgMCwgMSwgMHg3ZmZmXSwKLSAgICAgICAgICBpMzJfbGlzdD0gWy0xLCAwLCAweGZmLCAweGZmZmYsIDB4ZmZmZmZmLCAweDdmZmZmZmZmXSwKLSAgICAgICAgICBpNjRfbGlzdD1bLTEsIDAsIDB4ZmYsIDB4ZmZmZiwgMHhmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZmZmZmYsIDB4N2ZmZmZmZmZmZmZmZmZmZl0sCi0gICAgICAgICAgZG91YmxlX2xpc3Q9WzAuMSwgMC4yLCAwLjNdLAotICAgICAgICAgIHN0cmluZ19saXN0PVsiZmlyc3QiLCAic2Vjb25kIiwgInRoaXJkIl0sCi0gICAgICAgICAgYm9vbGVhbl9saXN0PVtUcnVlLCBUcnVlLCBUcnVlLCBGYWxzZSwgRmFsc2UsIEZhbHNlXSwKLSAgICAgICAgICBzdHJ1Y3RfbGlzdD1bRW1wdHkoKSwgRW1wdHkoKV0sCi0gICAgICAgICAgYnl0ZV9zZXQ9c2V0KFstMTI3LCAtMSwgMCwgMSwgMTI3XSksCi0gICAgICAgICAgaTE2X3NldD1zZXQoWy0xLCAwLCAxLCAweDdmZmZdKSwKLSAgICAgICAgICBpMzJfc2V0PXNldChbMSwgMiwgM10pLAotICAgICAgICAgIGk2NF9zZXQ9c2V0KFstMSwgMCwgMHhmZiwgMHhmZmZmLCAweGZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZmZmLCAweGZmZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmZmZiwgMHg3ZmZmZmZmZmZmZmZmZmZmXSksCi0gICAgICAgICAgZG91YmxlX3NldD1zZXQoWzAuMSwgMC4yLCAwLjNdKSwKLSAgICAgICAgICBzdHJpbmdfc2V0PXNldChbImZpcnN0IiwgInNlY29uZCIsICJ0aGlyZCJdKSwKLSAgICAgICAgICBib29sZWFuX3NldD1zZXQoW1RydWUsIEZhbHNlXSksCi0gICAgICAgICAgI3N0cnVjdF9zZXQ9c2V0KFtFbXB0eSgpXSksICMgdW5oYXNoYWJsZSBpbnN0YW5jZQotICAgICAgICAgIGJ5dGVfYnl0ZV9tYXA9ezEgOiAyfSwKLSAgICAgICAgICBpMTZfYnl0ZV9tYXA9ezEgOiAxLCAtMSA6IDEsIDB4N2ZmZiA6IDF9LAotICAgICAgICAgIGkzMl9ieXRlX21hcD17MSA6IDEsIC0xIDogMSwgMHg3ZmZmZmZmZiA6IDF9LAotICAgICAgICAgIGk2NF9ieXRlX21hcD17MCA6IDEsICAxIDogMSwgLTEgOiAxLCAweDdmZmZmZmZmZmZmZmZmZmYgOiAxfSwKLSAgICAgICAgICBkb3VibGVfYnl0ZV9tYXA9ey0xLjEgOiAxLCAxLjEgOiAxfSwKLSAgICAgICAgICBzdHJpbmdfYnl0ZV9tYXA9eyJmaXJzdCIgOiAxLCAic2Vjb25kIiA6IDIsICJ0aGlyZCIgOiAzLCAiIiA6IDB9LAotICAgICAgICAgIGJvb2xlYW5fYnl0ZV9tYXA9e1RydWUgOiAxLCBGYWxzZTogMH0sCi0gICAgICAgICAgYnl0ZV9pMTZfbWFwPXsxIDogMSwgMiA6IC0xLCAzIDogMHg3ZmZmfSwKLSAgICAgICAgICBieXRlX2kzMl9tYXA9ezEgOiAxLCAyIDogLTEsIDMgOiAweDdmZmZmZmZmfSwKLSAgICAgICAgICBieXRlX2k2NF9tYXA9ezEgOiAxLCAyIDogLTEsIDMgOiAweDdmZmZmZmZmZmZmZmZmZmZ9LAotICAgICAgICAgIGJ5dGVfZG91YmxlX21hcD17MSA6IDAuMSwgMiA6IC0wLjEsIDMgOiAxMDAwMDAwLjF9LAotICAgICAgICAgIGJ5dGVfc3RyaW5nX21hcD17MSA6ICIiLCAyIDogImJsYWgiLCAzIDogImxvb29vb29vb29vb29vb25nIHN0cmluZyJ9LAotICAgICAgICAgIGJ5dGVfYm9vbGVhbl9tYXA9ezEgOiBUcnVlLCAyIDogRmFsc2V9LAotICAgICAgICAgICNsaXN0X2J5dGVfbWFwICMgdW5oYXNoYWJsZQotICAgICAgICAgICNzZXRfYnl0ZV9tYXA9e3NldChbMSwgMiwgM10pIDogMSwgc2V0KFswLCAxXSkgOiAyLCBzZXQoW10pIDogMH0sICMgdW5oYXNoYWJsZQotICAgICAgICAgICNtYXBfYnl0ZV9tYXAgIyB1bmhhc2hhYmxlCi0gICAgICAgICAgYnl0ZV9tYXBfbWFwPXswIDoge30sIDEgOiB7MSA6IDF9LCAyIDogezEgOiAxLCAyIDogMn19LAotICAgICAgICAgIGJ5dGVfc2V0X21hcD17MCA6IHNldChbXSksIDEgOiBzZXQoWzFdKSwgMiA6IHNldChbMSwgMl0pfSwKLSAgICAgICAgICBieXRlX2xpc3RfbWFwPXswIDogW10sIDEgOiBbMV0sIDIgOiBbMSwgMl19LAotICAgICAgICAgICkKKyAgICAgICAgc2VsZi5jb21wYWN0X3N0cnVjdCA9IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoCisgICAgICAgICAgICBhX2J5dGU9MTI3LAorICAgICAgICAgICAgYV9pMTY9MzIwMDAsCisgICAgICAgICAgICBhX2kzMj0xMDAwMDAwMDAwLAorICAgICAgICAgICAgYV9pNjQ9MHhmZmZmZmZmZmZmLAorICAgICAgICAgICAgYV9kb3VibGU9NS42Nzg5LAorICAgICAgICAgICAgYV9zdHJpbmc9Im15IHN0cmluZyIsCisgICAgICAgICAgICB0cnVlX2ZpZWxkPVRydWUsCisgICAgICAgICAgICBmYWxzZV9maWVsZD1GYWxzZSwKKyAgICAgICAgICAgIGVtcHR5X3N0cnVjdF9maWVsZD1FbXB0eSgpLAorICAgICAgICAgICAgYnl0ZV9saXN0PVstMTI3LCAtMSwgMCwgMSwgMTI3XSwKKyAgICAgICAgICAgIGkxNl9saXN0PVstMSwgMCwgMSwgMHg3ZmZmXSwKKyAgICAgICAgICAgIGkzMl9saXN0PVstMSwgMCwgMHhmZiwgMHhmZmZmLCAweGZmZmZmZiwgMHg3ZmZmZmZmZl0sCisgICAgICAgICAgICBpNjRfbGlzdD1bLTEsIDAsIDB4ZmYsIDB4ZmZmZiwgMHhmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZmZmZmYsIDB4N2ZmZmZmZmZmZmZmZmZmZl0sCisgICAgICAgICAgICBkb3VibGVfbGlzdD1bMC4xLCAwLjIsIDAuM10sCisgICAgICAgICAgICBzdHJpbmdfbGlzdD1bImZpcnN0IiwgInNlY29uZCIsICJ0aGlyZCJdLAorICAgICAgICAgICAgYm9vbGVhbl9saXN0PVtUcnVlLCBUcnVlLCBUcnVlLCBGYWxzZSwgRmFsc2UsIEZhbHNlXSwKKyAgICAgICAgICAgIHN0cnVjdF9saXN0PVtFbXB0eSgpLCBFbXB0eSgpXSwKKyAgICAgICAgICAgIGJ5dGVfc2V0PXNldChbLTEyNywgLTEsIDAsIDEsIDEyN10pLAorICAgICAgICAgICAgaTE2X3NldD1zZXQoWy0xLCAwLCAxLCAweDdmZmZdKSwKKyAgICAgICAgICAgIGkzMl9zZXQ9c2V0KFsxLCAyLCAzXSksCisgICAgICAgICAgICBpNjRfc2V0PXNldChbLTEsIDAsIDB4ZmYsIDB4ZmZmZiwgMHhmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZmZmZmYsIDB4N2ZmZmZmZmZmZmZmZmZmZl0pLAorICAgICAgICAgICAgZG91YmxlX3NldD1zZXQoWzAuMSwgMC4yLCAwLjNdKSwKKyAgICAgICAgICAgIHN0cmluZ19zZXQ9c2V0KFsiZmlyc3QiLCAic2Vjb25kIiwgInRoaXJkIl0pLAorICAgICAgICAgICAgYm9vbGVhbl9zZXQ9c2V0KFtUcnVlLCBGYWxzZV0pLAorICAgICAgICAgICAgIyBzdHJ1Y3Rfc2V0PXNldChbRW1wdHkoKV0pLCAjIHVuaGFzaGFibGUgaW5zdGFuY2UKKyAgICAgICAgICAgIGJ5dGVfYnl0ZV9tYXA9ezE6IDJ9LAorICAgICAgICAgICAgaTE2X2J5dGVfbWFwPXsxOiAxLCAtMTogMSwgMHg3ZmZmOiAxfSwKKyAgICAgICAgICAgIGkzMl9ieXRlX21hcD17MTogMSwgLTE6IDEsIDB4N2ZmZmZmZmY6IDF9LAorICAgICAgICAgICAgaTY0X2J5dGVfbWFwPXswOiAxLCAxOiAxLCAtMTogMSwgMHg3ZmZmZmZmZmZmZmZmZmZmOiAxfSwKKyAgICAgICAgICAgIGRvdWJsZV9ieXRlX21hcD17LTEuMTogMSwgMS4xOiAxfSwKKyAgICAgICAgICAgIHN0cmluZ19ieXRlX21hcD17ImZpcnN0IjogMSwgInNlY29uZCI6IDIsICJ0aGlyZCI6IDMsICIiOiAwfSwKKyAgICAgICAgICAgIGJvb2xlYW5fYnl0ZV9tYXA9e1RydWU6IDEsIEZhbHNlOiAwfSwKKyAgICAgICAgICAgIGJ5dGVfaTE2X21hcD17MTogMSwgMjogLTEsIDM6IDB4N2ZmZn0sCisgICAgICAgICAgICBieXRlX2kzMl9tYXA9ezE6IDEsIDI6IC0xLCAzOiAweDdmZmZmZmZmfSwKKyAgICAgICAgICAgIGJ5dGVfaTY0X21hcD17MTogMSwgMjogLTEsIDM6IDB4N2ZmZmZmZmZmZmZmZmZmZn0sCisgICAgICAgICAgICBieXRlX2RvdWJsZV9tYXA9ezE6IDAuMSwgMjogLTAuMSwgMzogMTAwMDAwMC4xfSwKKyAgICAgICAgICAgIGJ5dGVfc3RyaW5nX21hcD17MTogIiIsIDI6ICJibGFoIiwgMzogImxvb29vb29vb29vb29vb25nIHN0cmluZyJ9LAorICAgICAgICAgICAgYnl0ZV9ib29sZWFuX21hcD17MTogVHJ1ZSwgMjogRmFsc2V9LAorICAgICAgICAgICAgIyBsaXN0X2J5dGVfbWFwICMgdW5oYXNoYWJsZQorICAgICAgICAgICAgIyBzZXRfYnl0ZV9tYXA9e3NldChbMSwgMiwgM10pIDogMSwgc2V0KFswLCAxXSkgOiAyLCBzZXQoW10pIDogMH0sICMgdW5oYXNoYWJsZQorICAgICAgICAgICAgIyBtYXBfYnl0ZV9tYXAgIyB1bmhhc2hhYmxlCisgICAgICAgICAgICBieXRlX21hcF9tYXA9ezA6IHt9LCAxOiB7MTogMX0sIDI6IHsxOiAxLCAyOiAyfX0sCisgICAgICAgICAgICBieXRlX3NldF9tYXA9ezA6IHNldChbXSksIDE6IHNldChbMV0pLCAyOiBzZXQoWzEsIDJdKX0sCisgICAgICAgICAgICBieXRlX2xpc3RfbWFwPXswOiBbXSwgMTogWzFdLCAyOiBbMSwgMl19LAorICAgICAgICApCiAKKyAgICAgICAgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDIgPSBOZXN0ZWRMaXN0c0kzMngyKAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgIFsxLCAxLCAyXSwKKyAgICAgICAgICAgICAgICBbMiwgNywgOV0sCisgICAgICAgICAgICAgICAgWzMsIDUsIDhdCisgICAgICAgICAgICBdCisgICAgICAgICkKIAotICBkZWYgX3NlcmlhbGl6ZShzZWxmLCBvYmopOgotICAgICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICAgICAgcHJvdCA9IHNlbGYucHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKLSAgICAgIG9iai53cml0ZShwcm90KQotICAgICAgcmV0dXJuIHRyYW5zLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDMgPSBOZXN0ZWRMaXN0c0kzMngzKAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAgICAgWzIsIDcsIDldLAorICAgICAgICAgICAgICAgICAgICBbMywgNSwgOF0KKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAgICAgWzEsIDEsIDJdLAorICAgICAgICAgICAgICAgICAgICBbMSwgNCwgOV0KKyAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICBdCisgICAgICAgICkKIAotICBkZWYgX2Rlc2VyaWFsaXplKHNlbGYsIG9ianR5cGUsIGRhdGEpOgotICAgICAgcHJvdCA9IHNlbGYucHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZGF0YSkpCi0gICAgICByZXQgPSBvYmp0eXBlKCkKLSAgICAgIHJldC5yZWFkKHByb3QpCi0gICAgICByZXR1cm4gcmV0CisgICAgICAgIHNlbGYubmVzdGVkX21peGVkeDIgPSBOZXN0ZWRNaXhlZHgyKGludF9zZXRfbGlzdD1bCisgICAgICAgICAgICBzZXQoWzEsIDIsIDNdKSwKKyAgICAgICAgICAgIHNldChbMSwgNCwgOV0pLAorICAgICAgICAgICAgc2V0KFsxLCAyLCAzLCA1LCA4LCAxMywgMjFdKSwKKyAgICAgICAgICAgIHNldChbLTEsIDAsIDFdKQorICAgICAgICBdLAorICAgICAgICAgICAgIyBub3RlLCB0aGUgc2V0cyBiZWxvdyBhcmUgc2V0cyBvZiBjaGFycywgc2luY2UgdGhlIHN0cmluZ3MgYXJlIGl0ZXJhdGVkCisgICAgICAgICAgICBtYXBfaW50X3N0cnNldD17MTA6IHNldCgnYWJjJyksIDIwOiBzZXQoJ2RlZicpLCAzMDogc2V0KCdHSEknKX0sCisgICAgICAgICAgICBtYXBfaW50X3N0cnNldF9saXN0PVsKKyAgICAgICAgICAgICAgICB7MTA6IHNldCgnYWJjJyksIDIwOiBzZXQoJ2RlZicpLCAzMDogc2V0KCdHSEknKX0sCisgICAgICAgICAgICAgICAgezEwMDogc2V0KCdsbW4nKSwgMjAwOiBzZXQoJ29wcScpLCAzMDA6IHNldCgnUlNUJyl9LAorICAgICAgICAgICAgICAgIHsxMDAwOiBzZXQoJ3V2dycpLCAyMDAwOiBzZXQoJ3d4eScpLCAzMDAwOiBzZXQoJ1hZWicpfV0KKyAgICAgICAgKQogCi0gIGRlZiB0ZXN0Rm9yd2FyZHMoc2VsZik6Ci0gICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShWZXJzaW9uaW5nVGVzdFYyLCBzZWxmLl9zZXJpYWxpemUoc2VsZi52MW9iaikpCi0gICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmouYmVnaW5faW5fYm90aCwgc2VsZi52MW9iai5iZWdpbl9pbl9ib3RoKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLmVuZF9pbl9ib3RoLCBzZWxmLnYxb2JqLmVuZF9pbl9ib3RoKQorICAgICAgICBzZWxmLm5lc3RlZF9saXN0c19ib25rID0gTmVzdGVkTGlzdHNCb25rKAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBBIGZpcnN0JywgdHlwZT0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQSBzZWNvbmQnLCB0eXBlPTEpCisgICAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQiBmaXJzdCcsIHR5cGU9MiksCisgICAgICAgICAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEIgc2Vjb25kJywgdHlwZT0yKQorICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgXQorICAgICAgICApCiAKLSAgZGVmIHRlc3RCYWNrd2FyZHMoc2VsZik6Ci0gICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShWZXJzaW9uaW5nVGVzdFYxLCBzZWxmLl9zZXJpYWxpemUoc2VsZi52Mm9iaikpCi0gICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmouYmVnaW5faW5fYm90aCwgc2VsZi52Mm9iai5iZWdpbl9pbl9ib3RoKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLmVuZF9pbl9ib3RoLCBzZWxmLnYyb2JqLmVuZF9pbl9ib3RoKQorICAgICAgICBzZWxmLmxpc3RfYm9ua3MgPSBMaXN0Qm9ua3MoCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBBJywgdHlwZT0xKSwKKyAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEInLCB0eXBlPTIpLAorICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQycsIHR5cGU9MCkKKyAgICAgICAgICAgIF0KKyAgICAgICAgKQogCi0gIGRlZiB0ZXN0U2VyaWFsaXplVjEoc2VsZik6Ci0gICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoVmVyc2lvbmluZ1Rlc3RWMSwgc2VsZi5fc2VyaWFsaXplKHNlbGYudjFvYmopKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi52MW9iaikKKyAgICBkZWYgX3NlcmlhbGl6ZShzZWxmLCBvYmopOgorICAgICAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIHByb3QgPSBzZWxmLnByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCisgICAgICAgIG9iai53cml0ZShwcm90KQorICAgICAgICByZXR1cm4gdHJhbnMuZ2V0dmFsdWUoKQogCi0gIGRlZiB0ZXN0U2VyaWFsaXplVjIoc2VsZik6Ci0gICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoVmVyc2lvbmluZ1Rlc3RWMiwgc2VsZi5fc2VyaWFsaXplKHNlbGYudjJvYmopKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi52Mm9iaikKKyAgICBkZWYgX2Rlc2VyaWFsaXplKHNlbGYsIG9ianR5cGUsIGRhdGEpOgorICAgICAgICBwcm90ID0gc2VsZi5wcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihkYXRhKSkKKyAgICAgICAgcmV0ID0gb2JqdHlwZSgpCisgICAgICAgIHJldC5yZWFkKHByb3QpCisgICAgICAgIHJldHVybiByZXQKIAotICBkZWYgdGVzdEJvb2xzKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWxzKHNlbGYuYm9vbHMsIHNlbGYuYm9vbHNfZmxpcHBlZCkKLSAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShCb29scywgc2VsZi5fc2VyaWFsaXplKHNlbGYuYm9vbHMpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5ib29scykKLSAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShCb29scywgc2VsZi5fc2VyaWFsaXplKHNlbGYuYm9vbHNfZmxpcHBlZCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLmJvb2xzX2ZsaXBwZWQpCisgICAgZGVmIHRlc3RGb3J3YXJkcyhzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoVmVyc2lvbmluZ1Rlc3RWMiwgc2VsZi5fc2VyaWFsaXplKHNlbGYudjFvYmopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmouYmVnaW5faW5fYm90aCwgc2VsZi52MW9iai5iZWdpbl9pbl9ib3RoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmouZW5kX2luX2JvdGgsIHNlbGYudjFvYmouZW5kX2luX2JvdGgpCiAKLSAgZGVmIHRlc3RMYXJnZURlbHRhcyhzZWxmKToKLSAgICAjIHRlc3QgbGFyZ2UgZmllbGQgZGVsdGFzIChtZWFuaW5nZnVsIGluIENvbXBhY3RQcm90byBvbmx5KQotICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKExhcmdlRGVsdGFzLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5sYXJnZV9kZWx0YXMpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5sYXJnZV9kZWx0YXMpCisgICAgZGVmIHRlc3RCYWNrd2FyZHMoc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKFZlcnNpb25pbmdUZXN0VjEsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLnYyb2JqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLmJlZ2luX2luX2JvdGgsIHNlbGYudjJvYmouYmVnaW5faW5fYm90aCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLmVuZF9pbl9ib3RoLCBzZWxmLnYyb2JqLmVuZF9pbl9ib3RoKQogCi0gIGRlZiB0ZXN0Q29tcGFjdFN0cnVjdChzZWxmKToKLSAgICAjIHRlc3QgbGFyZ2UgZmllbGQgZGVsdGFzIChtZWFuaW5nZnVsIGluIENvbXBhY3RQcm90byBvbmx5KQotICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLmNvbXBhY3Rfc3RydWN0KSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYuY29tcGFjdF9zdHJ1Y3QpCisgICAgZGVmIHRlc3RTZXJpYWxpemVWMShzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoVmVyc2lvbmluZ1Rlc3RWMSwgc2VsZi5fc2VyaWFsaXplKHNlbGYudjFvYmopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYudjFvYmopCisKKyAgICBkZWYgdGVzdFNlcmlhbGl6ZVYyKHNlbGYpOgorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShWZXJzaW9uaW5nVGVzdFYyLCBzZWxmLl9zZXJpYWxpemUoc2VsZi52Mm9iaikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi52Mm9iaikKKworICAgIGRlZiB0ZXN0Qm9vbHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWxzKHNlbGYuYm9vbHMsIHNlbGYuYm9vbHNfZmxpcHBlZCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbHMoc2VsZi5ib29scywgc2VsZi52MW9iaikKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoQm9vbHMsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLmJvb2xzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLmJvb2xzKQorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShCb29scywgc2VsZi5fc2VyaWFsaXplKHNlbGYuYm9vbHNfZmxpcHBlZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5ib29sc19mbGlwcGVkKQorICAgICAgICByZXAgPSByZXByKHNlbGYuYm9vbHMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisKKyAgICBkZWYgdGVzdExhcmdlRGVsdGFzKHNlbGYpOgorICAgICAgICAjIHRlc3QgbGFyZ2UgZmllbGQgZGVsdGFzIChtZWFuaW5nZnVsIGluIENvbXBhY3RQcm90byBvbmx5KQorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShMYXJnZURlbHRhcywgc2VsZi5fc2VyaWFsaXplKHNlbGYubGFyZ2VfZGVsdGFzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLmxhcmdlX2RlbHRhcykKKyAgICAgICAgcmVwID0gcmVwcihzZWxmLmxhcmdlX2RlbHRhcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKKworICAgIGRlZiB0ZXN0TmVzdGVkTGlzdHNJMzJ4MihzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoTmVzdGVkTGlzdHNJMzJ4Miwgc2VsZi5fc2VyaWFsaXplKHNlbGYubmVzdGVkX2xpc3RzX2kzMngyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLm5lc3RlZF9saXN0c19pMzJ4MikKKyAgICAgICAgcmVwID0gcmVwcihzZWxmLm5lc3RlZF9saXN0c19pMzJ4MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKKworICAgIGRlZiB0ZXN0TmVzdGVkTGlzdHNJMzJ4MyhzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoTmVzdGVkTGlzdHNJMzJ4Mywgc2VsZi5fc2VyaWFsaXplKHNlbGYubmVzdGVkX2xpc3RzX2kzMngzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLm5lc3RlZF9saXN0c19pMzJ4MykKKyAgICAgICAgcmVwID0gcmVwcihzZWxmLm5lc3RlZF9saXN0c19pMzJ4MykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKKworICAgIGRlZiB0ZXN0TmVzdGVkTWl4ZWR4MihzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoTmVzdGVkTWl4ZWR4Miwgc2VsZi5fc2VyaWFsaXplKHNlbGYubmVzdGVkX21peGVkeDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYubmVzdGVkX21peGVkeDIpCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5uZXN0ZWRfbWl4ZWR4MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKKworICAgIGRlZiB0ZXN0TmVzdGVkTGlzdHNCb25rKHNlbGYpOgorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShOZXN0ZWRMaXN0c0JvbmssIHNlbGYuX3NlcmlhbGl6ZShzZWxmLm5lc3RlZF9saXN0c19ib25rKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLm5lc3RlZF9saXN0c19ib25rKQorICAgICAgICByZXAgPSByZXByKHNlbGYubmVzdGVkX2xpc3RzX2JvbmspCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisKKyAgICBkZWYgdGVzdExpc3RCb25rcyhzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoTGlzdEJvbmtzLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5saXN0X2JvbmtzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLmxpc3RfYm9ua3MpCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5saXN0X2JvbmtzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQorCisgICAgZGVmIHRlc3RDb21wYWN0U3RydWN0KHNlbGYpOgorICAgICAgICAjIHRlc3QgbGFyZ2UgZmllbGQgZGVsdGFzIChtZWFuaW5nZnVsIGluIENvbXBhY3RQcm90byBvbmx5KQorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShDb21wYWN0UHJvdG9UZXN0U3RydWN0LCBzZWxmLl9zZXJpYWxpemUoc2VsZi5jb21wYWN0X3N0cnVjdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5jb21wYWN0X3N0cnVjdCkKKyAgICAgICAgcmVwID0gcmVwcihzZWxmLmNvbXBhY3Rfc3RydWN0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQorCisgICAgZGVmIHRlc3RJbnRlZ2VyTGltaXRzKHNlbGYpOgorICAgICAgICBpZiAoc3lzLnZlcnNpb25faW5mb1swXSA9PSAyIGFuZCBzeXMudmVyc2lvbl9pbmZvWzFdIDw9IDYpOgorICAgICAgICAgICAgcHJpbnQoJ1NraXBwaW5nIHRlc3RJbnRlZ2VyTGltaXRzIGZvciBQeXRob24gMi42JykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBiYWRfdmFsdWVzID0gW0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9ieXRlPTEyOCksIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9ieXRlPS0xMjkpLAorICAgICAgICAgICAgICAgICAgICAgIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pMTY9MzI3NjgpLCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfaTE2PS0zMjc2OSksCisgICAgICAgICAgICAgICAgICAgICAgQ29tcGFjdFByb3RvVGVzdFN0cnVjdChhX2kzMj0yMTQ3NDgzNjQ4KSwgQ29tcGFjdFByb3RvVGVzdFN0cnVjdChhX2kzMj0tMjE0NzQ4MzY0OSksCisgICAgICAgICAgICAgICAgICAgICAgQ29tcGFjdFByb3RvVGVzdFN0cnVjdChhX2k2ND05MjIzMzcyMDM2ODU0Nzc1ODA4KSwgQ29tcGFjdFByb3RvVGVzdFN0cnVjdChhX2k2ND0tOTIyMzM3MjAzNjg1NDc3NTgwOSkKKyAgICAgICAgICAgICAgICAgICAgICBdCisKKyAgICAgICAgZm9yIHZhbHVlIGluIGJhZF92YWx1ZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRpb24sIHNlbGYuX3NlcmlhbGl6ZSwgdmFsdWUpCisKKyAgICBkZWYgdGVzdFJlY1RyZWUoc2VsZik6CisgICAgICAgICIiIkVuc3VyZSByZWN1cnNpdmUgdHJlZSBub2RlIGNhbiBiZSBjcmVhdGVkLiIiIgorICAgICAgICBjaGlsZHJlbiA9IFtdCisgICAgICAgIGZvciBpZHggaW4gcmFuZ2UoMSwgNSk6CisgICAgICAgICAgICBub2RlID0gUmVjVHJlZShpdGVtPWlkeCwgY2hpbGRyZW49Tm9uZSkKKyAgICAgICAgICAgIGNoaWxkcmVuLmFwcGVuZChub2RlKQorCisgICAgICAgIHBhcmVudCA9IFJlY1RyZWUoaXRlbT0wLCBjaGlsZHJlbj1jaGlsZHJlbikKKyAgICAgICAgc2VyZGVfcGFyZW50ID0gc2VsZi5fZGVzZXJpYWxpemUoUmVjVHJlZSwgc2VsZi5fc2VyaWFsaXplKHBhcmVudCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDAsIHNlcmRlX3BhcmVudC5pdGVtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyg0LCBsZW4oc2VyZGVfcGFyZW50LmNoaWxkcmVuKSkKKyAgICAgICAgZm9yIGNoaWxkIGluIHNlcmRlX3BhcmVudC5jaGlsZHJlbjoKKyAgICAgICAgICAgICMgQ2Fubm90IHVzZSBhc3NlcnRJc0luc3RhbmNlIGluIHB5dGhvbiAyLjY/CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShjaGlsZCwgUmVjVHJlZSkpCisKKyAgICBkZWYgX2J1aWxkTGlua2VkTGlzdChzZWxmKToKKyAgICAgICAgaGVhZCA9IGN1ciA9IFJlY0xpc3QoaXRlbT0wKQorICAgICAgICBmb3IgaWR4IGluIHJhbmdlKDEsIDUpOgorICAgICAgICAgICAgbm9kZSA9IFJlY0xpc3QoaXRlbT1pZHgpCisgICAgICAgICAgICBjdXIubmV4dGl0ZW0gPSBub2RlCisgICAgICAgICAgICBjdXIgPSBub2RlCisgICAgICAgIHJldHVybiBoZWFkCisKKyAgICBkZWYgX2NvbGxhcHNlTGlua2VkTGlzdChzZWxmLCBoZWFkKToKKyAgICAgICAgb3V0X2xpc3QgPSBbXQorICAgICAgICBjdXIgPSBoZWFkCisgICAgICAgIHdoaWxlIGN1ciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG91dF9saXN0LmFwcGVuZChjdXIuaXRlbSkKKyAgICAgICAgICAgIGN1ciA9IGN1ci5uZXh0aXRlbQorICAgICAgICByZXR1cm4gb3V0X2xpc3QKKworICAgIGRlZiB0ZXN0UmVjTGlzdChzZWxmKToKKyAgICAgICAgIiIiRW5zdXJlIHJlY3Vyc2l2ZSBsaW5rZWQgbGlzdCBjYW4gYmUgY3JlYXRlZC4iIiIKKyAgICAgICAgcmVjX2xpc3QgPSBzZWxmLl9idWlsZExpbmtlZExpc3QoKQorICAgICAgICBzZXJkZV9saXN0ID0gc2VsZi5fZGVzZXJpYWxpemUoUmVjTGlzdCwgc2VsZi5fc2VyaWFsaXplKHJlY19saXN0KSkKKyAgICAgICAgb3V0X2xpc3QgPSBzZWxmLl9jb2xsYXBzZUxpbmtlZExpc3Qoc2VyZGVfbGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoWzAsIDEsIDIsIDMsIDRdLCBvdXRfbGlzdCkKKworICAgIGRlZiB0ZXN0Q29SZWMoc2VsZik6CisgICAgICAgICIiIkVuc3VyZSBjby1yZWN1cnNpdmUgc3RydWN0dXJlcyBjYW4gYmUgY3JlYXRlZC4iIiIKKyAgICAgICAgaXRlbTEgPSBDb1JlYygpCisgICAgICAgIGl0ZW0yID0gQ29SZWMyKCkKKworICAgICAgICBpdGVtMS5vdGhlciA9IGl0ZW0yCisgICAgICAgIGl0ZW0yLm90aGVyID0gaXRlbTEKKworICAgICAgICAjIE5PVEUgW2Vjb25uZXI3MjQsMjAxNy0wNi0yMV06IFRoZXNlIG9iamVjdHMgY2Fubm90IGJlIHNlcmlhbGl6ZWQgYXMgc2VyaWFsaXphdGlvbgorICAgICAgICAjIHJlc3VsdHMgaW4gYW4gaW5maW5pdGUgbG9vcC4gZmJ0aHJpZnQgYWxzbyBzdWZmZXJzIGZyb20gdGhpcworICAgICAgICAjIHByb2JsZW0uCisKKyAgICBkZWYgdGVzdFJlY1ZlY3RvcihzZWxmKToKKyAgICAgICAgIiIiRW5zdXJlIGEgbGlzdCBvZiByZWN1cnNpdmUgbm9kZXMgY2FuIGJlIGNyZWF0ZWQuIiIiCisgICAgICAgIG15bGlzdCA9IFtzZWxmLl9idWlsZExpbmtlZExpc3QoKSwgc2VsZi5fYnVpbGRMaW5rZWRMaXN0KCldCisgICAgICAgIG15dmVjID0gVmVjdG9yVGVzdChsaXN0ZXI9bXlsaXN0KQorCisgICAgICAgIHNlcmRlX3ZlYyA9IHNlbGYuX2Rlc2VyaWFsaXplKFZlY3RvclRlc3QsIHNlbGYuX3NlcmlhbGl6ZShteXZlYykpCisgICAgICAgIGdvbGRlbl9saXN0ID0gWzAsIDEsIDIsIDMsIDRdCisgICAgICAgIGZvciBjdXJfbGlzdCBpbiBzZXJkZV92ZWMubGlzdGVyOgorICAgICAgICAgICAgb3V0X2xpc3QgPSBzZWxmLl9jb2xsYXBzZUxpbmtlZExpc3QoY3VyX2xpc3QpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9saXN0LCBvdXRfbGlzdCkKKwogCiBjbGFzcyBOb3JtYWxCaW5hcnlUZXN0KEFic3RyYWN0VGVzdCk6Ci0gIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCisgICAgcHJvdG9jb2xfZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKKwogCiBjbGFzcyBBY2NlbGVyYXRlZEJpbmFyeVRlc3QoQWJzdHJhY3RUZXN0KToKLSAgcHJvdG9jb2xfZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoKQorICAgIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKQorCiAKIGNsYXNzIENvbXBhY3RQcm90b2NvbFRlc3QoQWJzdHJhY3RUZXN0KToKLSAgcHJvdG9jb2xfZmFjdG9yeSA9IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKQorICAgIHByb3RvY29sX2ZhY3RvcnkgPSBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkKKworCitjbGFzcyBBY2NlbGVyYXRlZENvbXBhY3RUZXN0KEFic3RyYWN0VGVzdCk6CisgICAgcHJvdG9jb2xfZmFjdG9yeSA9IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkKKworCitjbGFzcyBKU09OUHJvdG9jb2xUZXN0KEFic3RyYWN0VGVzdCk6CisgICAgcHJvdG9jb2xfZmFjdG9yeSA9IFRKU09OUHJvdG9jb2wuVEpTT05Qcm90b2NvbEZhY3RvcnkoKQorCiAKIGNsYXNzIEFjY2VsZXJhdGVkRnJhbWVkVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gIGRlZiB0ZXN0U3BsaXQoc2VsZik6Ci0gICAgIiIiVGVzdCBGcmFtZWRUcmFuc3BvcnQgYW5kIEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQKKyAgICBkZWYgdGVzdFNwbGl0KHNlbGYpOgorICAgICAgICAiIiJUZXN0IEZyYW1lZFRyYW5zcG9ydCBhbmQgQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZAogCi0gICAgVGVzdHMgdGhhdCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgVEZyYW1lZFRyYW5zcG9ydAotICAgIHBsYXkgbmljZWx5IHRvZ2V0aGVyIHdoZW4gYSByZWFkIHNwYW5zIGEgZnJhbWUiIiIKKyAgICAgICAgVGVzdHMgdGhhdCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgVEZyYW1lZFRyYW5zcG9ydAorICAgICAgICBwbGF5IG5pY2VseSB0b2dldGhlciB3aGVuIGEgcmVhZCBzcGFucyBhIGZyYW1lIiIiCiAKLSAgICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpCi0gICAgYmlnc3RyaW5nID0gIiIuam9pbihjaHIoYnl0ZSkgZm9yIGJ5dGUgaW4gcmFuZ2Uob3JkKCJhIiksIG9yZCgieiIpKzEpKQorICAgICAgICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpCisgICAgICAgIGJpZ3N0cmluZyA9ICIiLmpvaW4oY2hyKGJ5dGUpIGZvciBieXRlIGluIHJhbmdlKG9yZCgiYSIpLCBvcmQoInoiKSArIDEpKQogCi0gICAgZGF0YWJ1ZiA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gICAgcHJvdCA9IHByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woZGF0YWJ1ZikKLSAgICBwcm90LndyaXRlSTMyKDQyKQotICAgIHByb3Qud3JpdGVTdHJpbmcoYmlnc3RyaW5nKQotICAgIHByb3Qud3JpdGVJMTYoMjQpCi0gICAgZGF0YSA9IGRhdGFidWYuZ2V0dmFsdWUoKQotICAgIGN1dHBvaW50ID0gbGVuKGRhdGEpLzIKLSAgICBwYXJ0cyA9IFsgZGF0YVs6Y3V0cG9pbnRdLCBkYXRhW2N1dHBvaW50Ol0gXQorICAgICAgICBkYXRhYnVmID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgcHJvdCA9IHByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woZGF0YWJ1ZikKKyAgICAgICAgcHJvdC53cml0ZUkzMig0MikKKyAgICAgICAgcHJvdC53cml0ZVN0cmluZyhiaWdzdHJpbmcpCisgICAgICAgIHByb3Qud3JpdGVJMTYoMjQpCisgICAgICAgIGRhdGEgPSBkYXRhYnVmLmdldHZhbHVlKCkKKyAgICAgICAgY3V0cG9pbnQgPSBsZW4oZGF0YSkgLy8gMgorICAgICAgICBwYXJ0cyA9IFtkYXRhWzpjdXRwb2ludF0sIGRhdGFbY3V0cG9pbnQ6XV0KIAotICAgIGZyYW1lZF9idWZmZXIgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICAgIGZyYW1lZF93cml0ZXIgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQoZnJhbWVkX2J1ZmZlcikKLSAgICBmb3IgcGFydCBpbiBwYXJ0czoKLSAgICAgIGZyYW1lZF93cml0ZXIud3JpdGUocGFydCkKLSAgICAgIGZyYW1lZF93cml0ZXIuZmx1c2goKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihmcmFtZWRfYnVmZmVyLmdldHZhbHVlKCkpLCBsZW4oZGF0YSkgKyA4KQorICAgICAgICBmcmFtZWRfYnVmZmVyID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgZnJhbWVkX3dyaXRlciA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydChmcmFtZWRfYnVmZmVyKQorICAgICAgICBmb3IgcGFydCBpbiBwYXJ0czoKKyAgICAgICAgICAgIGZyYW1lZF93cml0ZXIud3JpdGUocGFydCkKKyAgICAgICAgICAgIGZyYW1lZF93cml0ZXIuZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oZnJhbWVkX2J1ZmZlci5nZXR2YWx1ZSgpKSwgbGVuKGRhdGEpICsgOCkKIAotICAgICMgUmVjcmVhdGUgZnJhbWVkX2J1ZmZlciBzbyB3ZSBjYW4gcmVhZCBmcm9tIGl0LgotICAgIGZyYW1lZF9idWZmZXIgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZnJhbWVkX2J1ZmZlci5nZXR2YWx1ZSgpKQotICAgIGZyYW1lZF9yZWFkZXIgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQoZnJhbWVkX2J1ZmZlcikKLSAgICBwcm90ID0gcHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChmcmFtZWRfcmVhZGVyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdC5yZWFkSTMyKCksIDQyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdC5yZWFkU3RyaW5nKCksIGJpZ3N0cmluZykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHByb3QucmVhZEkxNigpLCAyNCkKKyAgICAgICAgIyBSZWNyZWF0ZSBmcmFtZWRfYnVmZmVyIHNvIHdlIGNhbiByZWFkIGZyb20gaXQuCisgICAgICAgIGZyYW1lZF9idWZmZXIgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZnJhbWVkX2J1ZmZlci5nZXR2YWx1ZSgpKQorICAgICAgICBmcmFtZWRfcmVhZGVyID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0KGZyYW1lZF9idWZmZXIpCisgICAgICAgIHByb3QgPSBwcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKGZyYW1lZF9yZWFkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdC5yZWFkSTMyKCksIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3QucmVhZFN0cmluZygpLCBiaWdzdHJpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdC5yZWFkSTE2KCksIDI0KQorCiAKIGNsYXNzIFNlcmlhbGl6ZXJzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLSAgZGVmIHRlc3RTZXJpYWxpemVUaGVuRGVzZXJpYWxpemUoc2VsZik6Ci0gICAgb2JqID0gWHRydWN0MihpMzJfdGhpbmc9MSwKLSAgICAgICAgICAgICAgICAgIHN0cnVjdF90aGluZz1YdHJ1Y3Qoc3RyaW5nX3RoaW5nPSJmb28iKSkKKyAgICBkZWYgdGVzdFNlcmlhbGl6ZVRoZW5EZXNlcmlhbGl6ZShzZWxmKToKKyAgICAgICAgb2JqID0gWHRydWN0MihpMzJfdGhpbmc9MSwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RfdGhpbmc9WHRydWN0KHN0cmluZ190aGluZz0iZm9vIikpCiAKLSAgICBzMSA9IHNlcmlhbGl6ZShvYmopCi0gICAgZm9yIGkgaW4gcmFuZ2UoMTApOgotICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoczEsIHNlcmlhbGl6ZShvYmopKQotICAgICAgb2JqY29weSA9IFh0cnVjdDIoKQotICAgICAgZGVzZXJpYWxpemUob2JqY29weSwgc2VyaWFsaXplKG9iaikpCi0gICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCisgICAgICAgIHMxID0gc2VyaWFsaXplKG9iaikKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoczEsIHNlcmlhbGl6ZShvYmopKQorICAgICAgICAgICAgb2JqY29weSA9IFh0cnVjdDIoKQorICAgICAgICAgICAgZGVzZXJpYWxpemUob2JqY29weSwgc2VyaWFsaXplKG9iaikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCiAKLSAgICBvYmogPSBYdHJ1Y3Qoc3RyaW5nX3RoaW5nPSJiYXIiKQotICAgIG9iamNvcHkgPSBYdHJ1Y3QoKQotICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgb2JqY29weSkKKyAgICAgICAgb2JqID0gWHRydWN0KHN0cmluZ190aGluZz0iYmFyIikKKyAgICAgICAgb2JqY29weSA9IFh0cnVjdCgpCisgICAgICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCiAKLSAgICAjIHRlc3QgYm9vbGVhbnMKLSAgICBvYmogPSBCb29scyhpbV90cnVlPVRydWUsIGltX2ZhbHNlPUZhbHNlKQotICAgIG9iamNvcHkgPSBCb29scygpCi0gICAgZGVzZXJpYWxpemUob2JqY29weSwgc2VyaWFsaXplKG9iaikpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBvYmpjb3B5KQotICAgIAotICAgICMgdGVzdCBlbnVtcwotICAgIGZvciBudW0sIG5hbWUgaW4gTnVtYmVyei5fVkFMVUVTX1RPX05BTUVTLml0ZXJpdGVtcygpOgotICAgICAgb2JqID0gQm9uayhtZXNzYWdlPSdlbnVtIE51bWJlcnogdmFsdWUgJWQgaXMgc3RyaW5nICVzJyAlIChudW0sIG5hbWUpLCB0eXBlPW51bSkKLSAgICAgIG9iamNvcHkgPSBCb25rKCkKLSAgICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBvYmpjb3B5KQotICAKKyAgICAgICAgIyB0ZXN0IGJvb2xlYW5zCisgICAgICAgIG9iaiA9IEJvb2xzKGltX3RydWU9VHJ1ZSwgaW1fZmFsc2U9RmFsc2UpCisgICAgICAgIG9iamNvcHkgPSBCb29scygpCisgICAgICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCisKKyAgICAgICAgIyB0ZXN0IGVudW1zCisgICAgICAgIGZvciBudW0sIG5hbWUgaW4gTnVtYmVyei5fVkFMVUVTX1RPX05BTUVTLml0ZW1zKCk6CisgICAgICAgICAgICBvYmogPSBCb25rKG1lc3NhZ2U9J2VudW0gTnVtYmVyeiB2YWx1ZSAlZCBpcyBzdHJpbmcgJXMnICUgKG51bSwgbmFtZSksIHR5cGU9bnVtKQorICAgICAgICAgICAgb2JqY29weSA9IEJvbmsoKQorICAgICAgICAgICAgZGVzZXJpYWxpemUob2JqY29weSwgc2VyaWFsaXplKG9iaikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCisKIAogZGVmIHN1aXRlKCk6Ci0gIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKLSAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQogCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShOb3JtYWxCaW5hcnlUZXN0KSkKLSAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkQmluYXJ5VGVzdCkpCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShDb21wYWN0UHJvdG9jb2xUZXN0KSkKLSAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkRnJhbWVkVGVzdCkpCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShTZXJpYWxpemVyc1Rlc3QpKQotICByZXR1cm4gc3VpdGUKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTm9ybWFsQmluYXJ5VGVzdCkpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkQmluYXJ5VGVzdCkpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkQ29tcGFjdFRlc3QpKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShDb21wYWN0UHJvdG9jb2xUZXN0KSkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoSlNPTlByb3RvY29sVGVzdCkpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkRnJhbWVkVGVzdCkpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFNlcmlhbGl6ZXJzVGVzdCkpCisgICAgcmV0dXJuIHN1aXRlCisKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9UU2ltcGxlSlNPTlByb3RvY29sVGVzdC5weSBiL3Rlc3QvcHkvVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5ODc2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkvVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucHkKQEAgLTAsMCArMSwxMDggQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgQm9uaywgVmVyc2lvbmluZ1Rlc3RWMSwgVmVyc2lvbmluZ1Rlc3RWMgorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRKU09OUHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorCitpbXBvcnQganNvbgoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgU2ltcGxlSlNPTlByb3RvY29sVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgcHJvdG9jb2xfZmFjdG9yeSA9IFRKU09OUHJvdG9jb2wuVFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkoKQorCisgICAgZGVmIF9hc3NlcnREaWN0RXF1YWwoc2VsZiwgYSwgYiwgbXNnPU5vbmUpOgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICdhc3NlcnREaWN0RXF1YWwnKToKKyAgICAgICAgICAgICMgYXNzZXJ0RGljdEVxdWFsIG9ubHkgaW4gUHl0aG9uIDIuNy4gRGVwZW5kcyBvbiB5b3VyIG1hY2hpbmUuCisgICAgICAgICAgICBzZWxmLmFzc2VydERpY3RFcXVhbChhLCBiLCBtc2cpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIFN1YnN0aXR1dGUgaW1wbGVtZW50YXRpb24gbm90IGFzIGdvb2QgYXMgdW5pdHRlc3QgbGlicmFyeSdzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihhKSwgbGVuKGIpLCBtc2cpCisgICAgICAgIGZvciBrLCB2IGluIGEuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoayBpbiBiLCBtc2cpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhiLmdldChrKSwgdiwgbXNnKQorCisgICAgZGVmIF9zZXJpYWxpemUoc2VsZiwgb2JqKToKKyAgICAgICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICBwcm90ID0gc2VsZi5wcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQorICAgICAgICBvYmoud3JpdGUocHJvdCkKKyAgICAgICAgcmV0dXJuIHRyYW5zLmdldHZhbHVlKCkKKworICAgIGRlZiBfZGVzZXJpYWxpemUoc2VsZiwgb2JqdHlwZSwgZGF0YSk6CisgICAgICAgIHByb3QgPSBzZWxmLnByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGRhdGEpKQorICAgICAgICByZXQgPSBvYmp0eXBlKCkKKyAgICAgICAgcmV0LnJlYWQocHJvdCkKKyAgICAgICAgcmV0dXJuIHJldAorCisgICAgZGVmIHRlc3RXcml0ZU9ubHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Rlc2VyaWFsaXplLCBWZXJzaW9uaW5nVGVzdFYxLCBiJ3t9JykKKworICAgIGRlZiB0ZXN0U2ltcGxlTWVzc2FnZShzZWxmKToKKyAgICAgICAgdjFvYmogPSBWZXJzaW9uaW5nVGVzdFYxKAorICAgICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKKyAgICAgICAgICAgIG9sZF9zdHJpbmc9J2FhYScsCisgICAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSkKKyAgICAgICAgZXhwZWN0ZWQgPSBkaWN0KGJlZ2luX2luX2JvdGg9djFvYmouYmVnaW5faW5fYm90aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9zdHJpbmc9djFvYmoub2xkX3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9pbl9ib3RoPXYxb2JqLmVuZF9pbl9ib3RoKQorICAgICAgICBhY3R1YWwgPSBqc29uLmxvYWRzKHNlbGYuX3NlcmlhbGl6ZSh2MW9iaikuZGVjb2RlKCdhc2NpaScpKQorCisgICAgICAgIHNlbGYuX2Fzc2VydERpY3RFcXVhbChleHBlY3RlZCwgYWN0dWFsKQorCisgICAgZGVmIHRlc3RDb21wbGljYXRlZChzZWxmKToKKyAgICAgICAgdjJvYmogPSBWZXJzaW9uaW5nVGVzdFYyKAorICAgICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKKyAgICAgICAgICAgIG5ld2ludD0xLAorICAgICAgICAgICAgbmV3Ynl0ZT0yLAorICAgICAgICAgICAgbmV3c2hvcnQ9MywKKyAgICAgICAgICAgIG5ld2xvbmc9NCwKKyAgICAgICAgICAgIG5ld2RvdWJsZT01LjAsCisgICAgICAgICAgICBuZXdzdHJ1Y3Q9Qm9uayhtZXNzYWdlPSJIZWxsbyEiLCB0eXBlPTEyMyksCisgICAgICAgICAgICBuZXdsaXN0PVs3LCA4LCA5XSwKKyAgICAgICAgICAgIG5ld3NldD1zZXQoWzQyLCAxLCA4XSksCisgICAgICAgICAgICBuZXdtYXA9ezE6IDIsIDI6IDN9LAorICAgICAgICAgICAgbmV3c3RyaW5nPSJIb2xhISIsCisgICAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSkKKyAgICAgICAgZXhwZWN0ZWQgPSBkaWN0KGJlZ2luX2luX2JvdGg9djJvYmouYmVnaW5faW5fYm90aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2ludD12Mm9iai5uZXdpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdieXRlPXYyb2JqLm5ld2J5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdzaG9ydD12Mm9iai5uZXdzaG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2xvbmc9djJvYmoubmV3bG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2RvdWJsZT12Mm9iai5uZXdkb3VibGUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdzdHJ1Y3Q9ZGljdChtZXNzYWdlPXYyb2JqLm5ld3N0cnVjdC5tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT12Mm9iai5uZXdzdHJ1Y3QudHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdsaXN0PXYyb2JqLm5ld2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdzZXQ9bGlzdCh2Mm9iai5uZXdzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3bWFwPXYyb2JqLm5ld21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld3N0cmluZz12Mm9iai5uZXdzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBlbmRfaW5fYm90aD12Mm9iai5lbmRfaW5fYm90aCkKKworICAgICAgICAjIE5lZWQgdG8gbG9hZC9kdW1wIGJlY2F1c2UgbWFwIGtleXMgZ2V0IGVzY2FwZWQuCisgICAgICAgIGV4cGVjdGVkID0ganNvbi5sb2Fkcyhqc29uLmR1bXBzKGV4cGVjdGVkKSkKKyAgICAgICAgYWN0dWFsID0ganNvbi5sb2FkcyhzZWxmLl9zZXJpYWxpemUodjJvYmopLmRlY29kZSgnYXNjaWknKSkKKyAgICAgICAgc2VsZi5fYXNzZXJ0RGljdEVxdWFsKGV4cGVjdGVkLCBhY3R1YWwpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVGVzdENsaWVudC5weSBiL3Rlc3QvcHkvVGVzdENsaWVudC5weQppbmRleCA2NDI5ZWMzLi5kZGNjZThkIDEwMDc1NQotLS0gYS90ZXN0L3B5L1Rlc3RDbGllbnQucHkKKysrIGIvdGVzdC9weS9UZXN0Q2xpZW50LnB5CkBAIC0xLDUgKzEsNSBAQAogIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KKyMgLSotIGNvZGluZzogdXRmLTggLSotCiAjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTE5LDIxMCArMTksNDI4IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBnbG9iCi1zeXMucGF0aC5pbnNlcnQoMCwgJy4vZ2VuLXB5JykKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQotCi1mcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0Ci1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRIdHRwQ2xpZW50Ci1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRabGliVHJhbnNwb3J0Ci1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCi1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbAotaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKIGltcG9ydCB0aW1lCitpbXBvcnQgdW5pdHRlc3QKIGZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgogCitmcm9tIHV0aWwgaW1wb3J0IGxvY2FsX2xpYnBhdGgKIAotcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKLXBhcnNlci5hZGRfb3B0aW9uKCItLXBvcnQiLCB0eXBlPSJpbnQiLCBkZXN0PSJwb3J0IiwKLSAgICBoZWxwPSJjb25uZWN0IHRvIHNlcnZlciBhdCBwb3J0IikKLXBhcnNlci5hZGRfb3B0aW9uKCItLWhvc3QiLCB0eXBlPSJzdHJpbmciLCBkZXN0PSJob3N0IiwKLSAgICBoZWxwPSJjb25uZWN0IHRvIHNlcnZlciIpCi1wYXJzZXIuYWRkX29wdGlvbigiLS16bGliIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0iemxpYiIsCi0gICAgaGVscD0idXNlIHpsaWIgd3JhcHBlciBmb3IgY29tcHJlc3NlZCB0cmFuc3BvcnQiKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tc3NsIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0ic3NsIiwKLSAgICBoZWxwPSJ1c2UgU1NMIGZvciBlbmNyeXB0ZWQgdHJhbnNwb3J0IikKLXBhcnNlci5hZGRfb3B0aW9uKCItLWZyYW1lZCIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9ImZyYW1lZCIsCi0gICAgaGVscD0idXNlIGZyYW1lZCB0cmFuc3BvcnQiKQotcGFyc2VyLmFkZF9vcHRpb24oIi0taHR0cCIsIGRlc3Q9Imh0dHBfcGF0aCIsCi0gICAgaGVscD0iVXNlIHRoZSBIVFRQIHRyYW5zcG9ydCB3aXRoIHRoZSBzcGVjaWZpZWQgcGF0aCIpCi1wYXJzZXIuYWRkX29wdGlvbignLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSJzdG9yZV9jb25zdCIsIAotICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0yLAotICAgIGhlbHA9InZlcmJvc2Ugb3V0cHV0IikKLXBhcnNlci5hZGRfb3B0aW9uKCctcScsICctLXF1aWV0JywgYWN0aW9uPSJzdG9yZV9jb25zdCIsIAotICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0wLAotICAgIGhlbHA9Im1pbmltYWwgb3V0cHV0IikKLXBhcnNlci5hZGRfb3B0aW9uKCctLXByb3RvJywgIGRlc3Q9InByb3RvIiwgdHlwZT0ic3RyaW5nIiwKLSAgICBoZWxwPSJwcm90b2NvbCB0byB1c2UsIG9uZSBvZjogYWNjZWwsIGJpbmFyeSwgY29tcGFjdCIpCi1wYXJzZXIuc2V0X2RlZmF1bHRzKGZyYW1lZD1GYWxzZSwgaHR0cF9wYXRoPU5vbmUsIHZlcmJvc2U9MSwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCBwcm90bz0nYmluYXJ5JykKLW9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCitTQ1JJUFRfRElSID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCisKIAogY2xhc3MgQWJzdHJhY3RUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgZGVmIHNldFVwKHNlbGYpOgotICAgIGlmIG9wdGlvbnMuaHR0cF9wYXRoOgotICAgICAgc2VsZi50cmFuc3BvcnQgPSBUSHR0cENsaWVudC5USHR0cENsaWVudChvcHRpb25zLmhvc3QsIHBvcnQ9b3B0aW9ucy5wb3J0LCBwYXRoPW9wdGlvbnMuaHR0cF9wYXRoKQotICAgIGVsc2U6Ci0gICAgICBpZiBvcHRpb25zLnNzbDoKLSAgICAgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU1NMU29ja2V0Ci0gICAgICAgIHNvY2tldCA9IFRTU0xTb2NrZXQuVFNTTFNvY2tldChvcHRpb25zLmhvc3QsIG9wdGlvbnMucG9ydCwgdmFsaWRhdGU9RmFsc2UpCi0gICAgICBlbHNlOgotICAgICAgICBzb2NrZXQgPSBUU29ja2V0LlRTb2NrZXQob3B0aW9ucy5ob3N0LCBvcHRpb25zLnBvcnQpCi0gICAgICAjIGZyYW1lIG9yIGJ1ZmZlciBkZXBlbmRpbmcgdXBvbiBhcmdzCi0gICAgICBpZiBvcHRpb25zLmZyYW1lZDoKLSAgICAgICAgc2VsZi50cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQoc29ja2V0KQotICAgICAgZWxzZToKLSAgICAgICAgc2VsZi50cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpCi0gICAgICBpZiBvcHRpb25zLnpsaWI6Ci0gICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVFpsaWJUcmFuc3BvcnQuVFpsaWJUcmFuc3BvcnQoc2VsZi50cmFuc3BvcnQsIDkpCi0gICAgc2VsZi50cmFuc3BvcnQub3BlbigpCi0gICAgcHJvdG9jb2wgPSBzZWxmLnByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woc2VsZi50cmFuc3BvcnQpCi0gICAgc2VsZi5jbGllbnQgPSBUaHJpZnRUZXN0LkNsaWVudChwcm90b2NvbCkKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGlmIG9wdGlvbnMudHJhbnMgPT0gJ2h0dHAnOgorICAgICAgICAgICAgdXJpID0gJ3swfTovL3sxfTp7Mn17M30nLmZvcm1hdCgoJ2h0dHBzJyBpZiBvcHRpb25zLnNzbCBlbHNlICdodHRwJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9ucy5odHRwX3BhdGggaWYgb3B0aW9ucy5odHRwX3BhdGggZWxzZSAnLycpKQorICAgICAgICAgICAgaWYgb3B0aW9ucy5zc2w6CisgICAgICAgICAgICAgICAgX19jYWZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpLCAia2V5cyIsICJDQS5wZW0iKQorICAgICAgICAgICAgICAgIF9fY2VydGZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpLCAia2V5cyIsICJjbGllbnQuY3J0IikKKyAgICAgICAgICAgICAgICBfX2tleWZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpLCAia2V5cyIsICJjbGllbnQua2V5IikKKyAgICAgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRIdHRwQ2xpZW50LlRIdHRwQ2xpZW50KHVyaSwgY2FmaWxlPV9fY2FmaWxlLCBjZXJ0X2ZpbGU9X19jZXJ0ZmlsZSwga2V5X2ZpbGU9X19rZXlmaWxlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRIdHRwQ2xpZW50LlRIdHRwQ2xpZW50KHVyaSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIG9wdGlvbnMuc3NsOgorICAgICAgICAgICAgICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNTTFNvY2tldAorICAgICAgICAgICAgICAgIHNvY2tldCA9IFRTU0xTb2NrZXQuVFNTTFNvY2tldChvcHRpb25zLmhvc3QsIG9wdGlvbnMucG9ydCwgdmFsaWRhdGU9RmFsc2UpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNvY2tldCA9IFRTb2NrZXQuVFNvY2tldChvcHRpb25zLmhvc3QsIG9wdGlvbnMucG9ydCkKKyAgICAgICAgICAgICMgZnJhbWUgb3IgYnVmZmVyIGRlcGVuZGluZyB1cG9uIGFyZ3MKKyAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KQorICAgICAgICAgICAgaWYgb3B0aW9ucy50cmFucyA9PSAnZnJhbWVkJzoKKyAgICAgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpCisgICAgICAgICAgICBlbGlmIG9wdGlvbnMudHJhbnMgPT0gJ2J1ZmZlcmVkJzoKKyAgICAgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkKKyAgICAgICAgICAgIGVsaWYgb3B0aW9ucy50cmFucyA9PSAnJzoKKyAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcignVW5rbm93biAtLXRyYW5zcG9ydCBvcHRpb246ICVzJyAlIG9wdGlvbnMudHJhbnMpCisgICAgICAgICAgICBpZiBvcHRpb25zLnpsaWI6CisgICAgICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQgPSBUWmxpYlRyYW5zcG9ydC5UWmxpYlRyYW5zcG9ydChzZWxmLnRyYW5zcG9ydCwgOSkKKyAgICAgICAgc2VsZi50cmFuc3BvcnQub3BlbigpCisgICAgICAgIHByb3RvY29sID0gc2VsZi5nZXRfcHJvdG9jb2woc2VsZi50cmFuc3BvcnQpCisgICAgICAgIHNlbGYuY2xpZW50ID0gVGhyaWZ0VGVzdC5DbGllbnQocHJvdG9jb2wpCisgICAgICAgICMgZm9yIG11bHRpcGxleGVkIHNlcnZpY2VzOgorICAgICAgICBwcm90b2NvbDIgPSBzZWxmLmdldF9wcm90b2NvbDIoc2VsZi50cmFuc3BvcnQpCisgICAgICAgIHNlbGYuY2xpZW50MiA9IFNlY29uZFNlcnZpY2UuQ2xpZW50KHByb3RvY29sMikgaWYgcHJvdG9jb2wyIGlzIG5vdCBOb25lIGVsc2UgTm9uZQogCi0gIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAjIENsb3NlIQotICAgIHNlbGYudHJhbnNwb3J0LmNsb3NlKCkKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYudHJhbnNwb3J0LmNsb3NlKCkKIAotICBkZWYgdGVzdFZvaWQoc2VsZik6Ci0gICAgc2VsZi5jbGllbnQudGVzdFZvaWQoKQorICAgIGRlZiB0ZXN0Vm9pZChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RWb2lkJykKKyAgICAgICAgc2VsZi5jbGllbnQudGVzdFZvaWQoKQogCi0gIGRlZiB0ZXN0U3RyaW5nKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZygnUHl0aG9uJyAqIDIwKSwgJ1B5dGhvbicgKiAyMCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJycpLCAnJykKKyAgICBkZWYgdGVzdFN0cmluZyhzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RTdHJpbmcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJ1B5dGhvbicgKiAyMCksICdQeXRob24nICogMjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZygnJyksICcnKQorICAgICAgICBzMSA9IHUnXGJcdFxuL1xcXFxccnt9OuODkeOCpOOCveODsyInCisgICAgICAgIHMyID0gdSIiIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLAorICAgICAgICBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwKKyAgICAgICAg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLAorICAgICAgICDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sCisgICAgICAgIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywKKyAgICAgICAgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLAorICAgICAgICBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsCisgICAgICAgIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywKKyAgICAgICAgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwKKyAgICAgICAgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwKKyAgICAgICAgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLAorICAgICAgICDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsCisgICAgICAgIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywKKyAgICAgICAgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EKKyAgICAgICAgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhCisgICAgICAgIE1lbGF5dSwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqgorICAgICAgICBOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsCisgICAgICAgIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILAorICAgICAgICBOb3JmdWsgLyBQaXRrZXJuLCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7EgywKKyAgICAgICAg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZQorICAgICAgICBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssCisgICAgICAgIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywKKyAgICAgICAgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywKKyAgICAgICAgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywKKyAgICAgICAgQsOibi1sw6JtLWfDuiwg57K16KqeIiIiCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgb3MuZW52aXJvbi5nZXQoJ1RIUklGVF9URVNUX1BZX05PX1VURjhTVFJJTkdTJyk6CisgICAgICAgICAgICBzMSA9IHMxLmVuY29kZSgndXRmOCcpCisgICAgICAgICAgICBzMiA9IHMyLmVuY29kZSgndXRmOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZyhzMSksIHMxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoczIpLCBzMikKIAotICBkZWYgdGVzdEJ5dGUoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0Qnl0ZSg2MyksIDYzKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEJ5dGUoLTEyNyksIC0xMjcpCisgICAgZGVmIHRlc3RNdWx0aXBsZXhlZChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jbGllbnQyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcHJpbnQoJ3Rlc3RNdWx0aXBsZXhlZCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50Mi5zZWNvbmR0ZXN0U3RyaW5nKCdmb29iYXInKSwgJ3Rlc3RTdHJpbmcoImZvb2JhciIpJykKIAotICBkZWYgdGVzdEkzMihzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RJMzIoLTEpLCAtMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RJMzIoMCksIDApCisgICAgZGVmIHRlc3RCb29sKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdEJvb2wnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RCb29sKFRydWUpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RCb29sKEZhbHNlKSwgRmFsc2UpCiAKLSAgZGVmIHRlc3RJNjQoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0STY0KDEpLCAxKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEk2NCgtMzQzNTk3MzgzNjgpLCAtMzQzNTk3MzgzNjgpCisgICAgZGVmIHRlc3RCeXRlKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdEJ5dGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RCeXRlKDYzKSwgNjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEJ5dGUoLTEyNyksIC0xMjcpCiAKLSAgZGVmIHRlc3REb3VibGUoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0RG91YmxlKC01LjIzNTA5ODIzNSksIC01LjIzNTA5ODIzNSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3REb3VibGUoMCksIDApCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0RG91YmxlKC0xKSwgLTEpCisgICAgZGVmIHRlc3RJMzIoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0STMyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0STMyKC0xKSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEkzMigwKSwgMCkKIAotICBkZWYgdGVzdFN0cnVjdChzZWxmKToKLSAgICB4ID0gWHRydWN0KCkKLSAgICB4LnN0cmluZ190aGluZyA9ICJaZXJvIgotICAgIHguYnl0ZV90aGluZyA9IDEKLSAgICB4LmkzMl90aGluZyA9IC0zCi0gICAgeC5pNjRfdGhpbmcgPSAtNQotICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0U3RydWN0KHgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorICAgIGRlZiB0ZXN0STY0KHNlbGYpOgorICAgICAgICBwcmludCgndGVzdEk2NCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEk2NCgxKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0STY0KC0zNDM1OTczODM2OCksIC0zNDM1OTczODM2OCkKIAotICBkZWYgdGVzdE5lc3Qoc2VsZik6Ci0gICAgaW5uZXIgPSBYdHJ1Y3Qoc3RyaW5nX3RoaW5nPSJaZXJvIiwgYnl0ZV90aGluZz0xLCBpMzJfdGhpbmc9LTMsCi0gICAgICBpNjRfdGhpbmc9LTUpCi0gICAgeCA9IFh0cnVjdDIoc3RydWN0X3RoaW5nPWlubmVyKQotICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0TmVzdCh4KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKyAgICBkZWYgdGVzdERvdWJsZShzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3REb3VibGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3REb3VibGUoLTUuMjM1MDk4MjM1KSwgLTUuMjM1MDk4MjM1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3REb3VibGUoMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdERvdWJsZSgtMSksIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3REb3VibGUoLTAuMDAwMzQxMDEyNDM5NjM4NTk4Mjc5KSwgLTAuMDAwMzQxMDEyNDM5NjM4NTk4Mjc5KQogCi0gIGRlZiB0ZXN0TWFwKHNlbGYpOgotICAgIHggPSB7MDoxLCAxOjIsIDI6MywgMzo0LCAtMTotMn0KLSAgICB5ID0gc2VsZi5jbGllbnQudGVzdE1hcCh4KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKyAgICBkZWYgdGVzdEJpbmFyeShzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RCaW5hcnknKQorICAgICAgICB2YWwgPSBieXRlYXJyYXkoW2kgZm9yIGkgaW4gcmFuZ2UoMCwgMjU2KV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnl0ZWFycmF5KHNlbGYuY2xpZW50LnRlc3RCaW5hcnkoYnl0ZXModmFsKSkpLCB2YWwpCiAKLSAgZGVmIHRlc3RTZXQoc2VsZik6Ci0gICAgeCA9IHNldChbOCwgMSwgNDJdKQotICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0U2V0KHgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorICAgIGRlZiB0ZXN0U3RydWN0KHNlbGYpOgorICAgICAgICBwcmludCgndGVzdFN0cnVjdCcpCisgICAgICAgIHggPSBYdHJ1Y3QoKQorICAgICAgICB4LnN0cmluZ190aGluZyA9ICJaZXJvIgorICAgICAgICB4LmJ5dGVfdGhpbmcgPSAxCisgICAgICAgIHguaTMyX3RoaW5nID0gLTMKKyAgICAgICAgeC5pNjRfdGhpbmcgPSAtNQorICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdFN0cnVjdCh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCiAKLSAgZGVmIHRlc3RMaXN0KHNlbGYpOgotICAgIHggPSBbMSwgNCwgOSwgLTQyXQotICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0TGlzdCh4KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKyAgICBkZWYgdGVzdE5lc3Qoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0TmVzdCcpCisgICAgICAgIGlubmVyID0gWHRydWN0KHN0cmluZ190aGluZz0iWmVybyIsIGJ5dGVfdGhpbmc9MSwgaTMyX3RoaW5nPS0zLCBpNjRfdGhpbmc9LTUpCisgICAgICAgIHggPSBYdHJ1Y3QyKHN0cnVjdF90aGluZz1pbm5lciwgYnl0ZV90aGluZz0wLCBpMzJfdGhpbmc9MCkKKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3ROZXN0KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKIAotICBkZWYgdGVzdEVudW0oc2VsZik6Ci0gICAgeCA9IE51bWJlcnouRklWRQotICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0RW51bSh4KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKyAgICBkZWYgdGVzdE1hcChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RNYXAnKQorICAgICAgICB4ID0gezA6IDEsIDE6IDIsIDI6IDMsIDM6IDQsIC0xOiAtMn0KKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RNYXAoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQogCi0gIGRlZiB0ZXN0VHlwZWRlZihzZWxmKToKLSAgICB4ID0gMHhmZmZmZmZmZmZmZmZmZiAjIDcgYnl0ZXMgb2YgMHhmZgotICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0VHlwZWRlZih4KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKyAgICBkZWYgdGVzdFNldChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RTZXQnKQorICAgICAgICB4ID0gc2V0KFs4LCAxLCA0Ml0pCisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0U2V0KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKIAotICBkZWYgdGVzdE1hcE1hcChzZWxmKToKLSAgICAjIGRvZXMgbm90IHdvcms6IGRpY3QoKSBpcyBub3QgYSBoYXNoYWJsZSB0eXBlLCBzbyBhIGRpY3QoKSBjYW5ub3QgYmUgdXNlZCBhcyBhIGtleSBpbiBhbm90aGVyIGRpY3QoKQotICAgICN4ID0geyB7MToxMCwgMjoyMH0sIHsxOjEwMCwgMjoyMDAsIDM6MzAwfSwgezE6MTAwMCwgMjoyMDAwLCAzOjMwMDAsIDQ6NDAwMH0gfQotICAgIHRyeToKLSAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0TWFwTWFwKCkKLSAgICBleGNlcHQ6Ci0gICAgICBwYXNzCisgICAgZGVmIHRlc3RMaXN0KHNlbGYpOgorICAgICAgICBwcmludCgndGVzdExpc3QnKQorICAgICAgICB4ID0gWzEsIDQsIDksIC00Ml0KKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RMaXN0KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKIAotICBkZWYgdGVzdE11bHRpKHNlbGYpOgotICAgIHhwZWN0ZWQgPSBYdHJ1Y3QoYnl0ZV90aGluZz03NCwgaTMyX3RoaW5nPTB4ZmYwMGZmLCBpNjRfdGhpbmc9MHhmZmZmZmZmZmQwZDApCi0gICAgeSA9IHNlbGYuY2xpZW50LnRlc3RNdWx0aSh4cGVjdGVkLmJ5dGVfdGhpbmcsCi0gICAgICAgICAgeHBlY3RlZC5pMzJfdGhpbmcsCi0gICAgICAgICAgeHBlY3RlZC5pNjRfdGhpbmcsCi0gICAgICAgICAgeyAwOidhYmMnIH0sCi0gICAgICAgICAgTnVtYmVyei5GSVZFLAotICAgICAgICAgIDB4ZjBmMGYwKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeHBlY3RlZCkKKyAgICBkZWYgdGVzdEVudW0oc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0RW51bScpCisgICAgICAgIHggPSBOdW1iZXJ6LkZJVkUKKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RFbnVtKHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKIAotICBkZWYgdGVzdEV4Y2VwdGlvbihzZWxmKToKLSAgICBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdTYWZlJykKLSAgICB0cnk6Ci0gICAgICBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpCi0gICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQotICAgIGV4Y2VwdCBYY2VwdGlvbiwgeDoKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5lcnJvckNvZGUsIDEwMDEpCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKHgubWVzc2FnZSwgJ1hjZXB0aW9uJykKKyAgICBkZWYgdGVzdFR5cGVkZWYoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0VHlwZWRlZicpCisgICAgICAgIHggPSAweGZmZmZmZmZmZmZmZmZmICAjIDcgYnl0ZXMgb2YgMHhmZgorICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdFR5cGVkZWYoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQogCi0gICAgdHJ5OgotICAgICAgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbigidGhyb3dfdW5kZWNsYXJlZCIpCi0gICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24iKQotICAgIGV4Y2VwdCBFeGNlcHRpb246ICMgdHlwZSBpcyB1bmRlZmluZWQKLSAgICAgIHBhc3MKKyAgICBkZWYgdGVzdE1hcE1hcChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RNYXBNYXAnKQorICAgICAgICB4ID0geworICAgICAgICAgICAgLTQ6IHstNDogLTQsIC0zOiAtMywgLTI6IC0yLCAtMTogLTF9LAorICAgICAgICAgICAgNDogezQ6IDQsIDM6IDMsIDI6IDIsIDE6IDF9LAorICAgICAgICB9CisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0TWFwTWFwKDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCiAKLSAgZGVmIHRlc3RPbmV3YXkoc2VsZik6Ci0gICAgc3RhcnQgPSB0aW1lLnRpbWUoKQotICAgIHNlbGYuY2xpZW50LnRlc3RPbmV3YXkoMSkgIyB0eXBlIGlzIGludCwgbm90IGZsb2F0Ci0gICAgZW5kID0gdGltZS50aW1lKCkKLSAgICBzZWxmLmFzc2VydFRydWUoZW5kIC0gc3RhcnQgPCAzLAotICAgICAgICAgICAgICAgICAgICAib25ld2F5IHNsZWVwIHRvb2sgJWYgc2VjIiAlIChlbmQgLSBzdGFydCkpCi0gIAotICBkZWYgdGVzdE9uZXdheVRoZW5Ob3JtYWwoc2VsZik6Ci0gICAgc2VsZi5jbGllbnQudGVzdE9uZXdheSgxKSAjIHR5cGUgaXMgaW50LCBub3QgZmxvYXQKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJ1B5dGhvbicpLCAnUHl0aG9uJykKKyAgICBkZWYgdGVzdE11bHRpKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdE11bHRpJykKKyAgICAgICAgeHBlY3RlZCA9IFh0cnVjdChzdHJpbmdfdGhpbmc9J0hlbGxvMicsIGJ5dGVfdGhpbmc9NzQsIGkzMl90aGluZz0weGZmMDBmZiwgaTY0X3RoaW5nPTB4ZmZmZmZmZmZkMGQwKQorICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdE11bHRpKHhwZWN0ZWQuYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4cGVjdGVkLmkzMl90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4cGVjdGVkLmk2NF90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MDogJ2FiYyd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlcnouRklWRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGYwZjBmMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4cGVjdGVkKQogCi1jbGFzcyBOb3JtYWxCaW5hcnlUZXN0KEFic3RyYWN0VGVzdCk6Ci0gIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCisgICAgZGVmIHRlc3RFeGNlcHRpb24oc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0RXhjZXB0aW9uJykKKyAgICAgICAgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignU2FmZScpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJykKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgZ290dGVuIGV4Y2VwdGlvbiIpCisgICAgICAgIGV4Y2VwdCBYY2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmVycm9yQ29kZSwgMTAwMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5tZXNzYWdlLCAnWGNlcHRpb24nKQorICAgICAgICAgICAgIyBUT0RPIGVuc3VyZSBzYW1lIGJlaGF2aW9yIGZvciByZXByIHdpdGhpbiBnZW5lcmF0ZWQgcHl0aG9uIHZhcmlhbnRzCisgICAgICAgICAgICAjIGVuc3VyZSBleGNlcHRpb24ncyByZXByIG1ldGhvZCB3b3JrcworICAgICAgICAgICAgIyB4X3JlcHIgPSByZXByKHgpCisgICAgICAgICAgICAjIHNlbGYuYXNzZXJ0RXF1YWwoeF9yZXByLCAnWGNlcHRpb24oZXJyb3JDb2RlPTEwMDEsIG1lc3NhZ2U9XCdYY2VwdGlvblwnKScpCiAKLWNsYXNzIENvbXBhY3RUZXN0KEFic3RyYWN0VGVzdCk6Ci0gIHByb3RvY29sX2ZhY3RvcnkgPSBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignVEV4Y2VwdGlvbicpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQorICAgICAgICBleGNlcHQgVEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgcGFzcwogCi1jbGFzcyBBY2NlbGVyYXRlZEJpbmFyeVRlc3QoQWJzdHJhY3RUZXN0KToKLSAgcHJvdG9jb2xfZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoKQorICAgICAgICAjIFNob3VsZCBub3QgdGhyb3cKKyAgICAgICAgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignc3VjY2VzcycpCisKKyAgICBkZWYgdGVzdE11bHRpRXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdE11bHRpRXhjZXB0aW9uJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCdYY2VwdGlvbicsICdpZ25vcmUnKQorICAgICAgICBleGNlcHQgWGNlcHRpb24gYXMgZXg6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4LmVycm9yQ29kZSwgMTAwMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXgubWVzc2FnZSwgJ1RoaXMgaXMgYW4gWGNlcHRpb24nKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbignWGNlcHRpb24yJywgJ2lnbm9yZScpCisgICAgICAgIGV4Y2VwdCBYY2VwdGlvbjIgYXMgZXg6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4LmVycm9yQ29kZSwgMjAwMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXguc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgJ1RoaXMgaXMgYW4gWGNlcHRpb24yJykKKworICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCdzdWNjZXNzJywgJ2Zvb2JhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5zdHJpbmdfdGhpbmcsICdmb29iYXInKQorCisgICAgZGVmIHRlc3RPbmV3YXkoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0T25ld2F5JykKKyAgICAgICAgc3RhcnQgPSB0aW1lLnRpbWUoKQorICAgICAgICBzZWxmLmNsaWVudC50ZXN0T25ld2F5KDEpICAjIHR5cGUgaXMgaW50LCBub3QgZmxvYXQKKyAgICAgICAgZW5kID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVuZCAtIHN0YXJ0IDwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICJvbmV3YXkgc2xlZXAgdG9vayAlZiBzZWMiICUgKGVuZCAtIHN0YXJ0KSkKKworICAgIGRlZiB0ZXN0T25ld2F5VGhlbk5vcm1hbChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RPbmV3YXlUaGVuTm9ybWFsJykKKyAgICAgICAgc2VsZi5jbGllbnQudGVzdE9uZXdheSgxKSAgIyB0eXBlIGlzIGludCwgbm90IGZsb2F0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZygnUHl0aG9uJyksICdQeXRob24nKQorCisKK2NsYXNzIE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KEFic3RyYWN0VGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbDIoc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworCitjbGFzcyBCaW5hcnlUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKworCitjbGFzcyBNdWx0aXBsZXhlZEJpbmFyeVRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlRocmlmdFRlc3QiKQorCisgICAgZGVmIGdldF9wcm90b2NvbDIoc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlNlY29uZFNlcnZpY2UiKQorCisKK2NsYXNzIEFjY2VsZXJhdGVkQmluYXJ5VGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICByZXR1cm4gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCisKK2NsYXNzIE11bHRpcGxleGVkQWNjZWxlcmF0ZWRCaW5hcnlUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiVGhyaWZ0VGVzdCIpCisKKyAgICBkZWYgZ2V0X3Byb3RvY29sMihzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlNlY29uZFNlcnZpY2UiKQorCisKK2NsYXNzIENvbXBhY3RUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCisKK2NsYXNzIE11bHRpcGxleGVkQ29tcGFjdFRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiVGhyaWZ0VGVzdCIpCisKKyAgICBkZWYgZ2V0X3Byb3RvY29sMihzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJTZWNvbmRTZXJ2aWNlIikKKworCitjbGFzcyBBY2NlbGVyYXRlZENvbXBhY3RUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKworCitjbGFzcyBNdWx0aXBsZXhlZEFjY2VsZXJhdGVkQ29tcGFjdFRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlRocmlmdFRlc3QiKQorCisgICAgZGVmIGdldF9wcm90b2NvbDIoc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlNlY29uZFNlcnZpY2UiKQorCisKK2NsYXNzIEpTT05UZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sLlRKU09OUHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCisKK2NsYXNzIE11bHRpcGxleGVkSlNPTlRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRKU09OUHJvdG9jb2wuVEpTT05Qcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiVGhyaWZ0VGVzdCIpCisKKyAgICBkZWYgZ2V0X3Byb3RvY29sMihzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVEpTT05Qcm90b2NvbC5USlNPTlByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJTZWNvbmRTZXJ2aWNlIikKKworCitjbGFzcyBIZWFkZXJUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIGZhY3RvcnkgPSBUSGVhZGVyUHJvdG9jb2wuVEhlYWRlclByb3RvY29sRmFjdG9yeSgpCisgICAgICAgIHJldHVybiBmYWN0b3J5LmdldFByb3RvY29sKHRyYW5zcG9ydCkKKwogCiBkZWYgc3VpdGUoKToKLSAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQotICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKLSAgaWYgb3B0aW9ucy5wcm90byA9PSAnYmluYXJ5JzogIyBsb29rIGZvciAtLXByb3RvIG9uIGNtZGxpbmUKLSAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTm9ybWFsQmluYXJ5VGVzdCkpCi0gIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnYWNjZWwnOgotICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShBY2NlbGVyYXRlZEJpbmFyeVRlc3QpKQotICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ2NvbXBhY3QnOgotICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShDb21wYWN0VGVzdCkpCi0gIGVsc2U6Ci0gICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ1Vua25vd24gcHJvdG9jb2wgZ2l2ZW4gd2l0aCAtLXByb3RvOiAlcycgJSBvcHRpb25zLnByb3RvKQotICByZXR1cm4gc3VpdGUKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgaWYgb3B0aW9ucy5wcm90byA9PSAnYmluYXJ5JzogICMgbG9vayBmb3IgLS1wcm90byBvbiBjbWRsaW5lCisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShCaW5hcnlUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ2FjY2VsJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkQmluYXJ5VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdhY2NlbGMnOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQWNjZWxlcmF0ZWRDb21wYWN0VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdjb21wYWN0JzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKENvbXBhY3RUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ2hlYWRlcic6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShIZWFkZXJUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ2pzb24nOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoSlNPTlRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnbXVsdGknOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTXVsdGlwbGV4ZWRCaW5hcnlUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ211bHRpYSc6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShNdWx0aXBsZXhlZEFjY2VsZXJhdGVkQmluYXJ5VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdtdWx0aWFjJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKE11bHRpcGxleGVkQWNjZWxlcmF0ZWRDb21wYWN0VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdtdWx0aWMnOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTXVsdGlwbGV4ZWRDb21wYWN0VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdtdWx0aWonOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTXVsdGlwbGV4ZWRKU09OVGVzdCkpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ1Vua25vd24gcHJvdG9jb2wgZ2l2ZW4gd2l0aCAtLXByb3RvY29sOiAlcycgJSBvcHRpb25zLnByb3RvKQorICAgIHJldHVybiBzdWl0ZQorCiAKIGNsYXNzIE93bkFyZ3NUZXN0UHJvZ3JhbSh1bml0dGVzdC5UZXN0UHJvZ3JhbSk6CiAgICAgZGVmIHBhcnNlQXJncyhzZWxmLCBhcmd2KToKICAgICAgICAgaWYgYXJnczoKICAgICAgICAgICAgIHNlbGYudGVzdE5hbWVzID0gYXJncwogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi50ZXN0TmFtZXMgPSAoc2VsZi5kZWZhdWx0VGVzdCwpCisgICAgICAgICAgICBzZWxmLnRlc3ROYW1lcyA9IChbc2VsZi5kZWZhdWx0VGVzdF0pCiAgICAgICAgIHNlbGYuY3JlYXRlVGVzdHMoKQogCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gIE93bkFyZ3NUZXN0UHJvZ3JhbShkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKKyAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIoKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLWxpYnB5ZGlyJywgdHlwZT0nc3RyaW5nJywgZGVzdD0nbGlicHlkaXInLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2luY2x1ZGUgdGhpcyBkaXJlY3RvcnkgaW4gc3lzLnBhdGggZm9yIGxvY2F0aW5nIGxpYnJhcnkgY29kZScpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tZ2VucHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdnZW5weWRpcicsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0naW5jbHVkZSB0aGlzIGRpcmVjdG9yeSBpbiBzeXMucGF0aCBmb3IgbG9jYXRpbmcgZ2VuZXJhdGVkIGNvZGUnKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLXBvcnQiLCB0eXBlPSJpbnQiLCBkZXN0PSJwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJjb25uZWN0IHRvIHNlcnZlciBhdCBwb3J0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1ob3N0IiwgdHlwZT0ic3RyaW5nIiwgZGVzdD0iaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iY29ubmVjdCB0byBzZXJ2ZXIiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLXpsaWIiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJ6bGliIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJ1c2UgemxpYiB3cmFwcGVyIGZvciBjb21wcmVzc2VkIHRyYW5zcG9ydCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0tc3NsIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0ic3NsIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJ1c2UgU1NMIGZvciBlbmNyeXB0ZWQgdHJhbnNwb3J0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1odHRwIiwgZGVzdD0iaHR0cF9wYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJVc2UgdGhlIEhUVFAgdHJhbnNwb3J0IHdpdGggdGhlIHNwZWNpZmllZCBwYXRoIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSJzdG9yZV9jb25zdCIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idmVyYm9zZSBvdXRwdXQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctcScsICctLXF1aWV0JywgYWN0aW9uPSJzdG9yZV9jb25zdCIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTAsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0ibWluaW1hbCBvdXRwdXQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLXByb3RvY29sJywgZGVzdD0icHJvdG8iLCB0eXBlPSJzdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InByb3RvY29sIHRvIHVzZSwgb25lIG9mOiBhY2NlbCwgYWNjZWxjLCBiaW5hcnksIGNvbXBhY3QsIGhlYWRlciwganNvbiwgbXVsdGksIG11bHRpYSwgbXVsdGlhYywgbXVsdGljLCBtdWx0aWoiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLXRyYW5zcG9ydCcsIGRlc3Q9InRyYW5zIiwgdHlwZT0ic3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJ0cmFuc3BvcnQgdG8gdXNlLCBvbmUgb2Y6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAiKQorICAgIHBhcnNlci5zZXRfZGVmYXVsdHMoZnJhbWVkPUZhbHNlLCBodHRwX3BhdGg9Tm9uZSwgdmVyYm9zZT0xLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsIHByb3RvPSdiaW5hcnknKQorICAgIG9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisKKyAgICBpZiBvcHRpb25zLmdlbnB5ZGlyOgorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKFNDUklQVF9ESVIsIG9wdGlvbnMuZ2VucHlkaXIpKQorICAgIHN5cy5wYXRoLmluc2VydCgwLCBsb2NhbF9saWJwYXRoKCkpCisKKyAgICBpZiBvcHRpb25zLmh0dHBfcGF0aDoKKyAgICAgICAgb3B0aW9ucy50cmFucyA9ICdodHRwJworCisgICAgZnJvbSBUaHJpZnRUZXN0IGltcG9ydCBTZWNvbmRTZXJ2aWNlCisgICAgZnJvbSBUaHJpZnRUZXN0IGltcG9ydCBUaHJpZnRUZXN0CisgICAgZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgWHRydWN0LCBYdHJ1Y3QyLCBOdW1iZXJ6LCBYY2VwdGlvbiwgWGNlcHRpb24yCisgICAgZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBURXhjZXB0aW9uCisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0CisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUSHR0cENsaWVudAorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFpsaWJUcmFuc3BvcnQKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCisgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEhlYWRlclByb3RvY29sCisgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRKU09OUHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVE11bHRpcGxleGVkUHJvdG9jb2wKKworICAgIE93bkFyZ3NUZXN0UHJvZ3JhbShkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0xKSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVGVzdEVvZi5weSBiL3Rlc3QvcHkvVGVzdEVvZi5weQppbmRleCA3ZmYwYjQyLi4wYjRhODI5IDEwMDc1NQotLS0gYS90ZXN0L3B5L1Rlc3RFb2YucHkKKysrIGIvdGVzdC9weS9UZXN0RW9mLnB5CkBAIC0xOSwxMTMgKzE5LDExNCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHN5cywgZ2xvYgotc3lzLnBhdGguaW5zZXJ0KDAsICcuL2dlbi1weScpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKLQotZnJvbSBUaHJpZnRUZXN0IGltcG9ydCBUaHJpZnRUZXN0Ci1mcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCAqCitmcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCBYdHJ1Y3QKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0CiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbAogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgdGltZQorCiAKIGNsYXNzIFRlc3RFb2YodW5pdHRlc3QuVGVzdENhc2UpOgogCi0gIGRlZiBtYWtlX2RhdGEoc2VsZiwgcGZhY3Rvcnk9Tm9uZSk6Ci0gICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICAgIGlmIHBmYWN0b3J5OgotICAgICAgcHJvdCA9IHBmYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQotICAgIGVsc2U6Ci0gICAgICBwcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFucykKKyAgICBkZWYgbWFrZV9kYXRhKHNlbGYsIHBmYWN0b3J5PU5vbmUpOgorICAgICAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIGlmIHBmYWN0b3J5OgorICAgICAgICAgICAgcHJvdCA9IHBmYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJvdCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wodHJhbnMpCiAKLSAgICB4ID0gWHRydWN0KCkKLSAgICB4LnN0cmluZ190aGluZyA9ICJaZXJvIgotICAgIHguYnl0ZV90aGluZyA9IDAKKyAgICAgICAgeCA9IFh0cnVjdCgpCisgICAgICAgIHguc3RyaW5nX3RoaW5nID0gIlplcm8iCisgICAgICAgIHguYnl0ZV90aGluZyA9IDAKIAotICAgIHgud3JpdGUocHJvdCkKKyAgICAgICAgeC53cml0ZShwcm90KQogCi0gICAgeCA9IFh0cnVjdCgpCi0gICAgeC5zdHJpbmdfdGhpbmcgPSAiT25lIgotICAgIHguYnl0ZV90aGluZyA9IDEKKyAgICAgICAgeCA9IFh0cnVjdCgpCisgICAgICAgIHguc3RyaW5nX3RoaW5nID0gIk9uZSIKKyAgICAgICAgeC5ieXRlX3RoaW5nID0gMQogCi0gICAgeC53cml0ZShwcm90KQorICAgICAgICB4LndyaXRlKHByb3QpCiAKLSAgICByZXR1cm4gdHJhbnMuZ2V0dmFsdWUoKQorICAgICAgICByZXR1cm4gdHJhbnMuZ2V0dmFsdWUoKQogCi0gIGRlZiB0ZXN0VHJhbnNwb3J0UmVhZEFsbChzZWxmKToKLSAgICAiIiJUZXN0IHRoYXQgcmVhZEFsbCBvbiBhbnkgdHlwZSBvZiB0cmFuc3BvcnQgdGhyb3dzIGFuIEVPRkVycm9yIiIiCi0gICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoc2VsZi5tYWtlX2RhdGEoKSkKLSAgICB0cmFucy5yZWFkQWxsKDEpCisgICAgZGVmIHRlc3RUcmFuc3BvcnRSZWFkQWxsKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgcmVhZEFsbCBvbiBhbnkgdHlwZSBvZiB0cmFuc3BvcnQgdGhyb3dzIGFuIEVPRkVycm9yIiIiCisgICAgICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKHNlbGYubWFrZV9kYXRhKCkpCisgICAgICAgIHRyYW5zLnJlYWRBbGwoMSkKIAotICAgIHRyeToKLSAgICAgIHRyYW5zLnJlYWRBbGwoMTAwMDApCi0gICAgZXhjZXB0IEVPRkVycm9yOgotICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRyYW5zLnJlYWRBbGwoMTAwMDApCisgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgogCi0gICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gRU9GRXJyb3IiKQorICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIGdvdHRlbiBFT0ZFcnJvciIpCiAKLSAgZGVmIGVvZlRlc3RIZWxwZXIoc2VsZiwgcGZhY3RvcnkpOgotICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKHNlbGYubWFrZV9kYXRhKHBmYWN0b3J5KSkKLSAgICBwcm90ID0gcGZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCisgICAgZGVmIGVvZlRlc3RIZWxwZXIoc2VsZiwgcGZhY3RvcnkpOgorICAgICAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzZWxmLm1ha2VfZGF0YShwZmFjdG9yeSkpCisgICAgICAgIHByb3QgPSBwZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKIAotICAgIHggPSBYdHJ1Y3QoKQotICAgIHgucmVhZChwcm90KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5zdHJpbmdfdGhpbmcsICJaZXJvIikKLSAgICBzZWxmLmFzc2VydEVxdWFsKHguYnl0ZV90aGluZywgMCkKLQotICAgIHggPSBYdHJ1Y3QoKQotICAgIHgucmVhZChwcm90KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5zdHJpbmdfdGhpbmcsICJPbmUiKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5ieXRlX3RoaW5nLCAxKQotCi0gICAgdHJ5OgotICAgICAgeCA9IFh0cnVjdCgpCi0gICAgICB4LnJlYWQocHJvdCkKLSAgICBleGNlcHQgRU9GRXJyb3I6Ci0gICAgICByZXR1cm4KLQotICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIEVPRkVycm9yIikKLQotICBkZWYgZW9mVGVzdEhlbHBlclN0cmVzcyhzZWxmLCBwZmFjdG9yeSk6Ci0gICAgIiIiVGVlc3QgdGhlIGFiaWxpdHkgb2YgVEJpbmFyeVByb3RvY29sIHRvIGRlYWwgd2l0aCB0aGUgcmVtb3ZhbCBvZiBldmVyeSBieXRlIGluIHRoZSBmaWxlIiIiCi0gICAgIyBUT0RPOiB3ZSBzaG91bGQgbWFrZSBzdXJlIHRoaXMgY292ZXJzIG1vcmUgb2YgdGhlIGNvZGUgcGF0aHMKLQotICAgIGRhdGEgPSBzZWxmLm1ha2VfZGF0YShwZmFjdG9yeSkKLSAgICBmb3IgaSBpbiB4cmFuZ2UoMCwgbGVuKGRhdGEpICsgMSk6Ci0gICAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihkYXRhWzA6aV0pCi0gICAgICBwcm90ID0gcGZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCi0gICAgICB0cnk6CiAgICAgICAgIHggPSBYdHJ1Y3QoKQogICAgICAgICB4LnJlYWQocHJvdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnN0cmluZ190aGluZywgIlplcm8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYnl0ZV90aGluZywgMCkKKworICAgICAgICB4ID0gWHRydWN0KCkKICAgICAgICAgeC5yZWFkKHByb3QpCi0gICAgICAgIHgucmVhZChwcm90KQotICAgICAgZXhjZXB0IEVPRkVycm9yOgotICAgICAgICBjb250aW51ZQotICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gYW4gRU9GRXJyb3IiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguc3RyaW5nX3RoaW5nLCAiT25lIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmJ5dGVfdGhpbmcsIDEpCiAKLSAgZGVmIHRlc3RCaW5hcnlQcm90b2NvbEVvZihzZWxmKToKLSAgICAiIiJUZXN0IHRoYXQgVEJpbmFyeVByb3RvY29sIHRocm93cyBhbiBFT0ZFcnJvciB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIiIiCi0gICAgc2VsZi5lb2ZUZXN0SGVscGVyKFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpCi0gICAgc2VsZi5lb2ZUZXN0SGVscGVyU3RyZXNzKFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHggPSBYdHJ1Y3QoKQorICAgICAgICAgICAgeC5yZWFkKHByb3QpCisgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgogCi0gIGRlZiB0ZXN0QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEVvZihzZWxmKToKLSAgICAiIiJUZXN0IHRoYXQgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgdGhyb3dzIGFuIEVPRkVycm9yIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0iIiIKLSAgICBzZWxmLmVvZlRlc3RIZWxwZXIoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpKQotICAgIHNlbGYuZW9mVGVzdEhlbHBlclN0cmVzcyhUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KCkpCisgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIEVPRkVycm9yIikKIAotICBkZWYgdGVzdENvbXBhY3RQcm90b2NvbEVvZihzZWxmKToKLSAgICAiIiJUZXN0IHRoYXQgVENvbXBhY3RQcm90b2NvbCB0aHJvd3MgYW4gRU9GRXJyb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSIiIgotICAgIHNlbGYuZW9mVGVzdEhlbHBlcihUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkpCi0gICAgc2VsZi5lb2ZUZXN0SGVscGVyU3RyZXNzKFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSkKKyAgICBkZWYgZW9mVGVzdEhlbHBlclN0cmVzcyhzZWxmLCBwZmFjdG9yeSk6CisgICAgICAgICIiIlRlc3QgdGhlIGFiaWxpdHkgb2YgVEJpbmFyeVByb3RvY29sIHRvIGRlYWwgd2l0aCB0aGUgcmVtb3ZhbCBvZiBldmVyeSBieXRlIGluIHRoZSBmaWxlIiIiCisgICAgICAgICMgVE9ETzogd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGlzIGNvdmVycyBtb3JlIG9mIHRoZSBjb2RlIHBhdGhzCisKKyAgICAgICAgZGF0YSA9IHNlbGYubWFrZV9kYXRhKHBmYWN0b3J5KQorICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oZGF0YSkgKyAxKToKKyAgICAgICAgICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGRhdGFbMDppXSkKKyAgICAgICAgICAgIHByb3QgPSBwZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB4ID0gWHRydWN0KCkKKyAgICAgICAgICAgICAgICB4LnJlYWQocHJvdCkKKyAgICAgICAgICAgICAgICB4LnJlYWQocHJvdCkKKyAgICAgICAgICAgICAgICB4LnJlYWQocHJvdCkKKyAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gYW4gRU9GRXJyb3IiKQorCisgICAgZGVmIHRlc3RCaW5hcnlQcm90b2NvbEVvZihzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IFRCaW5hcnlQcm90b2NvbCB0aHJvd3MgYW4gRU9GRXJyb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSIiIgorICAgICAgICBzZWxmLmVvZlRlc3RIZWxwZXIoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKKyAgICAgICAgc2VsZi5lb2ZUZXN0SGVscGVyU3RyZXNzKFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpCisKKyAgICBkZWYgdGVzdEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRCaW5hcnlFb2Yoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCB0aHJvd3MgYW4gRU9GRXJyb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSIiIgorICAgICAgICBzZWxmLmVvZlRlc3RIZWxwZXIoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkpCisgICAgICAgIHNlbGYuZW9mVGVzdEhlbHBlclN0cmVzcyhUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKSkKKworICAgIGRlZiB0ZXN0Q29tcGFjdFByb3RvY29sRW9mKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgVENvbXBhY3RQcm90b2NvbCB0aHJvd3MgYW4gRU9GRXJyb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSIiIgorICAgICAgICBzZWxmLmVvZlRlc3RIZWxwZXIoVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpKQorICAgICAgICBzZWxmLmVvZlRlc3RIZWxwZXJTdHJlc3MoVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpKQorCisgICAgZGVmIHRlc3RDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZENvbXBhY3RFb2Yoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBUQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWQgdGhyb3dzIGFuIEVPRkVycm9yIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0iIiIKKyAgICAgICAgc2VsZi5lb2ZUZXN0SGVscGVyKFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkpCisgICAgICAgIHNlbGYuZW9mVGVzdEhlbHBlclN0cmVzcyhUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpKQorCiAKIGRlZiBzdWl0ZSgpOgotICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCi0gIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQotICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGVzdEVvZikpCi0gIHJldHVybiBzdWl0ZQorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGVzdEVvZikpCisgICAgcmV0dXJuIHN1aXRlCisKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9UZXN0RnJvemVuLnB5IGIvdGVzdC9weS9UZXN0RnJvemVuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZkMjU5NWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L1Rlc3RGcm96ZW4ucHkKQEAgLTAsMCArMSwxMjMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZnJvbSBEZWJ1Z1Byb3RvVGVzdC50dHlwZXMgaW1wb3J0IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QsIEVtcHR5LCBXcmFwcGVyCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRGcm96ZW5EaWN0Citmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wsIFRDb21wYWN0UHJvdG9jb2wKK2ltcG9ydCBjb2xsZWN0aW9ucworaW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgVGVzdEZyb3plbkJhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBfcm91bmR0cmlwKHNlbGYsIHNyYywgZHN0KToKKyAgICAgICAgb3RyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgb3B0b3JvID0gc2VsZi5wcm90b2NvbChvdHJhbnMpCisgICAgICAgIHNyYy53cml0ZShvcHRvcm8pCisgICAgICAgIGl0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihvdHJhbnMuZ2V0dmFsdWUoKSkKKyAgICAgICAgaXByb3RvID0gc2VsZi5wcm90b2NvbChpdHJhbnMpCisgICAgICAgIHJldHVybiBkc3QucmVhZChpcHJvdG8pIG9yIGRzdAorCisgICAgZGVmIHRlc3RfZGljdF9pc19oYXNoYWJsZV9vbmx5X2FmdGVyX2Zyb3plbihzZWxmKToKKyAgICAgICAgZDAgPSB7fQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzaW5zdGFuY2UoZDAsIGNvbGxlY3Rpb25zLkhhc2hhYmxlKSkKKyAgICAgICAgZDEgPSBURnJvemVuRGljdChkMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoZDEsIGNvbGxlY3Rpb25zLkhhc2hhYmxlKSkKKworICAgIGRlZiB0ZXN0X3N0cnVjdF93aXRoX2NvbGxlY3Rpb25fZmllbGRzKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9zZXQoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBhbm5vdGF0ZWQgc2V0IGZpZWxkIGNhbiBiZSBzZXJpYWxpemVkIGFuZCBkZXNlcmlhbGl6ZWQiIiIKKyAgICAgICAgeCA9IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Qoc2V0X2J5dGVfbWFwPXsKKyAgICAgICAgICAgIGZyb3plbnNldChbNDIsIDEwMCwgLTEwMF0pOiA5OSwKKyAgICAgICAgICAgIGZyb3plbnNldChbMF0pOiAxMDAsCisgICAgICAgICAgICBmcm96ZW5zZXQoW10pOiAwLAorICAgICAgICB9KQorICAgICAgICB4MiA9IHNlbGYuX3JvdW5kdHJpcCh4LCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIuc2V0X2J5dGVfbWFwW2Zyb3plbnNldChbNDIsIDEwMCwgLTEwMF0pXSwgOTkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIuc2V0X2J5dGVfbWFwW2Zyb3plbnNldChbMF0pXSwgMTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLnNldF9ieXRlX21hcFtmcm96ZW5zZXQoW10pXSwgMCkKKworICAgIGRlZiB0ZXN0X21hcChzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IGFubm90YXRlZCBtYXAgZmllbGQgY2FuIGJlIHNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsaXplZCIiIgorICAgICAgICB4ID0gQ29tcGFjdFByb3RvVGVzdFN0cnVjdChtYXBfYnl0ZV9tYXA9eworICAgICAgICAgICAgVEZyb3plbkRpY3QoezQyOiA0MiwgMTAwOiAtMTAwfSk6IDk5LAorICAgICAgICAgICAgVEZyb3plbkRpY3QoezA6IDB9KTogMTAwLAorICAgICAgICAgICAgVEZyb3plbkRpY3Qoe30pOiAwLAorICAgICAgICB9KQorICAgICAgICB4MiA9IHNlbGYuX3JvdW5kdHJpcCh4LCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIubWFwX2J5dGVfbWFwW1RGcm96ZW5EaWN0KHs0MjogNDIsIDEwMDogLTEwMH0pXSwgOTkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIubWFwX2J5dGVfbWFwW1RGcm96ZW5EaWN0KHswOiAwfSldLCAxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIubWFwX2J5dGVfbWFwW1RGcm96ZW5EaWN0KHt9KV0sIDApCisKKyAgICBkZWYgdGVzdF9saXN0KHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgYW5ub3RhdGVkIGxpc3QgZmllbGQgY2FuIGJlIHNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsaXplZCIiIgorICAgICAgICB4ID0gQ29tcGFjdFByb3RvVGVzdFN0cnVjdChsaXN0X2J5dGVfbWFwPXsKKyAgICAgICAgICAgICg0MiwgMTAwLCAtMTAwKTogOTksCisgICAgICAgICAgICAoMCwpOiAxMDAsCisgICAgICAgICAgICAoKTogMCwKKyAgICAgICAgfSkKKyAgICAgICAgeDIgPSBzZWxmLl9yb3VuZHRyaXAoeCwgQ29tcGFjdFByb3RvVGVzdFN0cnVjdCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLmxpc3RfYnl0ZV9tYXBbKDQyLCAxMDAsIC0xMDApXSwgOTkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIubGlzdF9ieXRlX21hcFsoMCwpXSwgMTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLmxpc3RfYnl0ZV9tYXBbKCldLCAwKQorCisgICAgZGVmIHRlc3RfZW1wdHlfc3RydWN0KHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgYW5ub3RhdGVkIGVtcHR5IHN0cnVjdCBjYW4gYmUgc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkIiIiCisgICAgICAgIHggPSBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGVtcHR5X3N0cnVjdF9maWVsZD1FbXB0eSgpKQorICAgICAgICB4MiA9IHNlbGYuX3JvdW5kdHJpcCh4LCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIuZW1wdHlfc3RydWN0X2ZpZWxkLCBFbXB0eSgpKQorCisgICAgZGVmIHRlc3Rfc3RydWN0KHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgYW5ub3RhdGVkIHN0cnVjdCBjYW4gYmUgc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkIiIiCisgICAgICAgIHggPSBXcmFwcGVyKGZvbz1FbXB0eSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguZm9vLCBFbXB0eSgpKQorICAgICAgICB4MiA9IHNlbGYuX3JvdW5kdHJpcCh4LCBXcmFwcGVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLmZvbywgRW1wdHkoKSkKKworCitjbGFzcyBUZXN0RnJvemVuKFRlc3RGcm96ZW5CYXNlKToKKyAgICBkZWYgcHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFucykKKworCitjbGFzcyBUZXN0RnJvemVuQWNjZWxlcmF0ZWRCaW5hcnkoVGVzdEZyb3plbkJhc2UpOgorICAgIGRlZiBwcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKS5nZXRQcm90b2NvbCh0cmFucykKKworCitjbGFzcyBUZXN0RnJvemVuQWNjZWxlcmF0ZWRDb21wYWN0KFRlc3RGcm96ZW5CYXNlKToKKyAgICBkZWYgcHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKS5nZXRQcm90b2NvbCh0cmFucykKKworCitkZWYgc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRlc3RGcm96ZW4pKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0RnJvemVuQWNjZWxlcmF0ZWRCaW5hcnkpKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0RnJvemVuQWNjZWxlcmF0ZWRDb21wYWN0KSkKKyAgICByZXR1cm4gc3VpdGUKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9InN1aXRlIiwgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1Rlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5weSBiL3Rlc3QvcHkvVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOTAzZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L1Rlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5weQpAQCAtMCwwICsxLDE3NyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIERvdWJsZUNvbnN0YW50c1Rlc3QgaW1wb3J0IGNvbnN0YW50cworCisjCisjIEluIG9yZGVyIHRvIHJ1biB0aGUgdGVzdCB1bmRlciBXaW5kb3dzLiBXZSBuZWVkIHRvIGNyZWF0ZSBzeW1ib2xpYyBsaW5rCisjIG5hbWUgJ3RocmlmdCcgdG8gJy4uL3NyYycgZm9sZGVyIGJ5IHVzaW5nOgorIworIyBta2xpbmsgL0QgdGhyaWZ0IC4uXHNyYworIworCisKK2NsYXNzIFRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCA9IFwKKyAgICAgICAgImZhaWxlZCB0byB2ZXJpZnkgYSBkb3VibGUgY29uc3RhbnQgZ2VuZXJhdGVkIGJ5IFRocmlmdCAoZXhwZWN0ZWQgPSAlZiwgZ290ID0gJWYpIgorICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfTElTVF9URVNUID1cCisgICAgICAgICJmYWlsZWQgdG8gdmVyaWZ5IGEgbGlzdCBpdGVtIGJ5IFRocmlmdCAoZXhwZWN0ZWQgPSAlZiwgZ290ID0gJWYpIgorICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyA9ICJ0aGUgcmVuZGVyZWQgdmFyaWFibGUgd2l0aCBuYW1lICVzIGlzIG5vdCBvZiBkb3VibGUgdHlwZSIKKworICAgICMgdG8gbWFrZSBzdXJlIHRoZSB2YXJpYWJsZXMgaW5zaWRlIFRocmlmdCBmaWxlcyBhcmUgZ2VuZXJhdGVkIGNvcnJlY3RseQorICAgIGRlZiB0ZXN0X3JlbmRlcmVkX2RvdWJsZV9jb25zdGFudHMoc2VsZik6CisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQgPSAxLjAKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCA9IC0xMDAuMAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3LjAKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCA9IC05MjIzMzcyMDM2ODU0Nzc1ODA3LjAKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMgPSAzLjE0MTU5MjY1MzU5CisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSA9IDEwMDAwMDAuMQorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUgPSAtMTAwMDAwMC4xCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUgPSAxLjdlKzMwOAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgPSA5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUgPSAtMS43ZSszMDgKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNULCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5ULCBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5ULCBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNULCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QsCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUywgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNULCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSwgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNULCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFLCBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFLAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLCBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUsIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUIikKKworICAgICMgdG8gbWFrZSBzdXJlIHRoZSB2YXJpYWJsZXMgaW5zaWRlIFRocmlmdCBmaWxlcyBhcmUgZ2VuZXJhdGVkIGNvcnJlY3RseQorICAgIGRlZiB0ZXN0X3JlbmRlcmVkX2RvdWJsZV9saXN0KHNlbGYpOgorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfTElTVCA9IFsxLjAsIC0xMDAuMCwgMTAwLjAsIDkyMjMzNzIwMzY4NTQ3NzU4MDcuMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDcuMCwgMy4xNDE1OTI2NTM1OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMC4xLCAtMTAwMDAwMC4xLCAxLjdlKzMwOCwgLTEuN2UrMzA4LCA5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOTIyMzM3MjAzNjg1NDc3NTgxNi40M10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oY29uc3RhbnRzLkRPVUJMRV9MSVNUX1RFU1QpLCBsZW4oRVhQRUNURURfRE9VQkxFX0xJU1QpKQorICAgICAgICBmb3IgaSwgZXhwZWN0ZWRWYWx1ZSBpbiBlbnVtZXJhdGUoRVhQRUNURURfRE9VQkxFX0xJU1QpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb25zdGFudHMuRE9VQkxFX0xJU1RfVEVTVFtpXSwgZXhwZWN0ZWRWYWx1ZSwgcGxhY2VzPTcpCisKKworZGVmIHN1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMpKQorICAgIHJldHVybiBzdWl0ZQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVGVzdFNlcnZlci5weSBiL3Rlc3QvcHkvVGVzdFNlcnZlci5weQppbmRleCBmYTYyNzY1Li5hYmEwZDQyIDEwMDc1NQotLS0gYS90ZXN0L3B5L1Rlc3RTZXJ2ZXIucHkKKysrIGIvdGVzdC9weS9UZXN0U2VydmVyLnB5CkBAIC0xOSwyMDAgKzE5LDMyNCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KLWltcG9ydCBzeXMsIGdsb2IsIHRpbWUKLXN5cy5wYXRoLmluc2VydCgwLCAnLi9nZW4tcHknKQotc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJylbMF0pCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQogZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCiAKLWZyb20gVGhyaWZ0VGVzdCBpbXBvcnQgVGhyaWZ0VGVzdAotZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgKgotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Ci1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFpsaWJUcmFuc3BvcnQKLWZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKLWZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sCi1mcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIsIFROb25ibG9ja2luZ1NlcnZlciwgVEh0dHBTZXJ2ZXIKK2Zyb20gdXRpbCBpbXBvcnQgbG9jYWxfbGlicGF0aAogCi1QUk9UX0ZBQ1RPUklFUyA9IHsnYmluYXJ5JzogVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnksCi0gICAgJ2FjY2VsJzogVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSwKLSAgICAnY29tcGFjdCc6IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3Rvcnl9CitTQ1JJUFRfRElSID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCiAKLXBhcnNlciA9IE9wdGlvblBhcnNlcigpCi1wYXJzZXIuYWRkX29wdGlvbigiLS1wb3J0IiwgdHlwZT0iaW50IiwgZGVzdD0icG9ydCIsCi0gICAgaGVscD0icG9ydCBudW1iZXIgZm9yIHNlcnZlciB0byBsaXN0ZW4gb24iKQotcGFyc2VyLmFkZF9vcHRpb24oIi0temxpYiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9InpsaWIiLAotICAgIGhlbHA9InVzZSB6bGliIHdyYXBwZXIgZm9yIGNvbXByZXNzZWQgdHJhbnNwb3J0IikKLXBhcnNlci5hZGRfb3B0aW9uKCItLXNzbCIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9InNzbCIsCi0gICAgaGVscD0idXNlIFNTTCBmb3IgZW5jcnlwdGVkIHRyYW5zcG9ydCIpCi1wYXJzZXIuYWRkX29wdGlvbignLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSJzdG9yZV9jb25zdCIsIAotICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0yLAotICAgIGhlbHA9InZlcmJvc2Ugb3V0cHV0IikKLXBhcnNlci5hZGRfb3B0aW9uKCctcScsICctLXF1aWV0JywgYWN0aW9uPSJzdG9yZV9jb25zdCIsIAotICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0wLAotICAgIGhlbHA9Im1pbmltYWwgb3V0cHV0IikKLXBhcnNlci5hZGRfb3B0aW9uKCctLXByb3RvJywgIGRlc3Q9InByb3RvIiwgdHlwZT0ic3RyaW5nIiwKLSAgICBoZWxwPSJwcm90b2NvbCB0byB1c2UsIG9uZSBvZjogYWNjZWwsIGJpbmFyeSwgY29tcGFjdCIpCi1wYXJzZXIuc2V0X2RlZmF1bHRzKHBvcnQ9OTA5MCwgdmVyYm9zZT0xLCBwcm90bz0nYmluYXJ5JykKLW9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCiAKLWNsYXNzIFRlc3RIYW5kbGVyOgorY2xhc3MgVGVzdEhhbmRsZXIob2JqZWN0KToKKyAgICBkZWYgdGVzdFZvaWQoc2VsZik6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RWb2lkKCknKQogCi0gIGRlZiB0ZXN0Vm9pZChzZWxmKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQgJ3Rlc3RWb2lkKCknCisgICAgZGVmIHRlc3RTdHJpbmcoc2VsZiwgc3RyKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdFN0cmluZyglcyknICUgc3RyKQorICAgICAgICByZXR1cm4gc3RyCiAKLSAgZGVmIHRlc3RTdHJpbmcoc2VsZiwgc3RyKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQgJ3Rlc3RTdHJpbmcoJXMpJyAlIHN0cgotICAgIHJldHVybiBzdHIKKyAgICBkZWYgdGVzdEJvb2woc2VsZiwgYm9vbGVhbik6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RCb29sKCVzKScgJSBzdHIoYm9vbGVhbikubG93ZXIoKSkKKyAgICAgICAgcmV0dXJuIGJvb2xlYW4KIAotICBkZWYgdGVzdEJ5dGUoc2VsZiwgYnl0ZSk6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50ICd0ZXN0Qnl0ZSglZCknICUgYnl0ZQotICAgIHJldHVybiBieXRlCisgICAgZGVmIHRlc3RCeXRlKHNlbGYsIGJ5dGUpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0Qnl0ZSglZCknICUgYnl0ZSkKKyAgICAgICAgcmV0dXJuIGJ5dGUKIAotICBkZWYgdGVzdEkxNihzZWxmLCBpMTYpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCAndGVzdEkxNiglZCknICUgaTE2Ci0gICAgcmV0dXJuIGkxNgorICAgIGRlZiB0ZXN0STE2KHNlbGYsIGkxNik6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RJMTYoJWQpJyAlIGkxNikKKyAgICAgICAgcmV0dXJuIGkxNgogCi0gIGRlZiB0ZXN0STMyKHNlbGYsIGkzMik6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50ICd0ZXN0STMyKCVkKScgJSBpMzIKLSAgICByZXR1cm4gaTMyCisgICAgZGVmIHRlc3RJMzIoc2VsZiwgaTMyKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEkzMiglZCknICUgaTMyKQorICAgICAgICByZXR1cm4gaTMyCiAKLSAgZGVmIHRlc3RJNjQoc2VsZiwgaTY0KToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQgJ3Rlc3RJNjQoJWQpJyAlIGk2NAotICAgIHJldHVybiBpNjQKKyAgICBkZWYgdGVzdEk2NChzZWxmLCBpNjQpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0STY0KCVkKScgJSBpNjQpCisgICAgICAgIHJldHVybiBpNjQKIAotICBkZWYgdGVzdERvdWJsZShzZWxmLCBkdWIpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCAndGVzdERvdWJsZSglZiknICUgZHViCi0gICAgcmV0dXJuIGR1YgorICAgIGRlZiB0ZXN0RG91YmxlKHNlbGYsIGR1Yik6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3REb3VibGUoJWYpJyAlIGR1YikKKyAgICAgICAgcmV0dXJuIGR1YgogCi0gIGRlZiB0ZXN0U3RydWN0KHNlbGYsIHRoaW5nKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQgJ3Rlc3RTdHJ1Y3QoeyVzLCAlZCwgJWQsICVkfSknICUgKHRoaW5nLnN0cmluZ190aGluZywgdGhpbmcuYnl0ZV90aGluZywgdGhpbmcuaTMyX3RoaW5nLCB0aGluZy5pNjRfdGhpbmcpCi0gICAgcmV0dXJuIHRoaW5nCisgICAgZGVmIHRlc3RCaW5hcnkoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0QmluYXJ5KCknKSAgIyBUT0RPOiBoZXggb3V0cHV0CisgICAgICAgIHJldHVybiB0aGluZwogCi0gIGRlZiB0ZXN0RXhjZXB0aW9uKHNlbGYsIHN0cik6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50ICd0ZXN0RXhjZXB0aW9uKCVzKScgJSBzdHIKLSAgICBpZiBzdHIgPT0gJ1hjZXB0aW9uJzoKLSAgICAgIHggPSBYY2VwdGlvbigpCi0gICAgICB4LmVycm9yQ29kZSA9IDEwMDEKLSAgICAgIHgubWVzc2FnZSA9IHN0cgotICAgICAgcmFpc2UgeAotICAgIGVsaWYgc3RyID09ICJ0aHJvd191bmRlY2xhcmVkIjoKLSAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZvbyIpCisgICAgZGVmIHRlc3RTdHJ1Y3Qoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0U3RydWN0KHslcywgJXMsICVzLCAlc30pJyAlICh0aGluZy5zdHJpbmdfdGhpbmcsIHRoaW5nLmJ5dGVfdGhpbmcsIHRoaW5nLmkzMl90aGluZywgdGhpbmcuaTY0X3RoaW5nKSkKKyAgICAgICAgcmV0dXJuIHRoaW5nCiAKLSAgZGVmIHRlc3RPbmV3YXkoc2VsZiwgc2Vjb25kcyk6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50ICd0ZXN0T25ld2F5KCVkKSA9PiBzbGVlcGluZy4uLicgJSBzZWNvbmRzCi0gICAgdGltZS5zbGVlcChzZWNvbmRzIC8gMykgIyBiZSBxdWljawotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCAnZG9uZSBzbGVlcGluZycKKyAgICBkZWYgdGVzdEV4Y2VwdGlvbihzZWxmLCBhcmcpOgorICAgICAgICAjIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEV4Y2VwdGlvbiglcyknICUgYXJnKQorICAgICAgICBpZiBhcmcgPT0gJ1hjZXB0aW9uJzoKKyAgICAgICAgICAgIHJhaXNlIFhjZXB0aW9uKGVycm9yQ29kZT0xMDAxLCBtZXNzYWdlPWFyZykKKyAgICAgICAgZWxpZiBhcmcgPT0gJ1RFeGNlcHRpb24nOgorICAgICAgICAgICAgcmFpc2UgVEV4Y2VwdGlvbihtZXNzYWdlPSdUaGlzIGlzIGEgVEV4Y2VwdGlvbicpCiAKLSAgZGVmIHRlc3ROZXN0KHNlbGYsIHRoaW5nKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQgJ3Rlc3ROZXN0KCVzKScgJSB0aGluZwotICAgIHJldHVybiB0aGluZworICAgIGRlZiB0ZXN0TXVsdGlFeGNlcHRpb24oc2VsZiwgYXJnMCwgYXJnMSk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpJyAlIChhcmcwLCBhcmcxKSkKKyAgICAgICAgaWYgYXJnMCA9PSAnWGNlcHRpb24nOgorICAgICAgICAgICAgcmFpc2UgWGNlcHRpb24oZXJyb3JDb2RlPTEwMDEsIG1lc3NhZ2U9J1RoaXMgaXMgYW4gWGNlcHRpb24nKQorICAgICAgICBlbGlmIGFyZzAgPT0gJ1hjZXB0aW9uMic6CisgICAgICAgICAgICByYWlzZSBYY2VwdGlvbjIoCisgICAgICAgICAgICAgICAgZXJyb3JDb2RlPTIwMDIsCisgICAgICAgICAgICAgICAgc3RydWN0X3RoaW5nPVh0cnVjdChzdHJpbmdfdGhpbmc9J1RoaXMgaXMgYW4gWGNlcHRpb24yJykpCisgICAgICAgIHJldHVybiBYdHJ1Y3Qoc3RyaW5nX3RoaW5nPWFyZzEpCiAKLSAgZGVmIHRlc3RNYXAoc2VsZiwgdGhpbmcpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCAndGVzdE1hcCglcyknICUgdGhpbmcKLSAgICByZXR1cm4gdGhpbmcKKyAgICBkZWYgdGVzdE9uZXdheShzZWxmLCBzZWNvbmRzKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdE9uZXdheSglZCkgPT4gc2xlZXBpbmcuLi4nICUgc2Vjb25kcykKKyAgICAgICAgdGltZS5zbGVlcChzZWNvbmRzIC8gMykgICMgYmUgcXVpY2sKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygnZG9uZSBzbGVlcGluZycpCiAKLSAgZGVmIHRlc3RTZXQoc2VsZiwgdGhpbmcpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCAndGVzdFNldCglcyknICUgdGhpbmcKLSAgICByZXR1cm4gdGhpbmcKKyAgICBkZWYgdGVzdE5lc3Qoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0TmVzdCglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZwogCi0gIGRlZiB0ZXN0TGlzdChzZWxmLCB0aGluZyk6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50ICd0ZXN0TGlzdCglcyknICUgdGhpbmcKLSAgICByZXR1cm4gdGhpbmcKKyAgICBkZWYgdGVzdE1hcChzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RNYXAoJXMpJyAlIHRoaW5nKQorICAgICAgICByZXR1cm4gdGhpbmcKIAotICBkZWYgdGVzdEVudW0oc2VsZiwgdGhpbmcpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCAndGVzdEVudW0oJXMpJyAlIHRoaW5nCi0gICAgcmV0dXJuIHRoaW5nCisgICAgZGVmIHRlc3RTdHJpbmdNYXAoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0U3RyaW5nTWFwKCVzKScgJSB0aGluZykKKyAgICAgICAgcmV0dXJuIHRoaW5nCiAKLSAgZGVmIHRlc3RUeXBlZGVmKHNlbGYsIHRoaW5nKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQgJ3Rlc3RUeXBlZGVmKCVzKScgJSB0aGluZwotICAgIHJldHVybiB0aGluZworICAgIGRlZiB0ZXN0U2V0KHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdFNldCglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZwogCi0gIGRlZiB0ZXN0TWFwTWFwKHNlbGYsIHRoaW5nKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQgJ3Rlc3RNYXBNYXAoJXMpJyAlIHRoaW5nCi0gICAgcmV0dXJuIHRoaW5nCisgICAgZGVmIHRlc3RMaXN0KHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdExpc3QoJXMpJyAlIHRoaW5nKQorICAgICAgICByZXR1cm4gdGhpbmcKIAotICBkZWYgdGVzdE11bHRpKHNlbGYsIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCAndGVzdE11bHRpKCVzKScgJSBbYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNV0KLSAgICB4ID0gWHRydWN0KGJ5dGVfdGhpbmc9YXJnMCwgaTMyX3RoaW5nPWFyZzEsIGk2NF90aGluZz1hcmcyKQotICAgIHJldHVybiB4CisgICAgZGVmIHRlc3RFbnVtKHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEVudW0oJXMpJyAlIHRoaW5nKQorICAgICAgICByZXR1cm4gdGhpbmcKIAotIyBzZXQgdXAgdGhlIHByb3RvY29sIGZhY3RvcnkgZm9ybSB0aGUgLS1wcm90byBvcHRpb24KLXBmYWN0b3J5X2NscyA9IFBST1RfRkFDVE9SSUVTLmdldChvcHRpb25zLnByb3RvLCBOb25lKQotaWYgcGZhY3RvcnlfY2xzIGlzIE5vbmU6Ci0gIHJhaXNlIEFzc2VydGlvbkVycm9yKCdVbmtub3duIC0tcHJvdG8gb3B0aW9uOiAlcycgJSBvcHRpb25zLnByb3RvKQotcGZhY3RvcnkgPSBwZmFjdG9yeV9jbHMoKQorICAgIGRlZiB0ZXN0VHlwZWRlZihzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RUeXBlZGVmKCVzKScgJSB0aGluZykKKyAgICAgICAgcmV0dXJuIHRoaW5nCiAKLSMgZ2V0IHRoZSBzZXJ2ZXIgdHlwZSAoVFNpbXBsZVNlcnZlciwgVE5vbmJsb2NraW5nU2VydmVyLCBldGMuLi4pCi1pZiBsZW4oYXJncykgPiAxOgotICByYWlzZSBBc3NlcnRpb25FcnJvcignT25seSBvbmUgc2VydmVyIHR5cGUgbWF5IGJlIHNwZWNpZmllZCwgbm90IG11bHRpcGxlIHR5cGVzLicpCi1zZXJ2ZXJfdHlwZSA9IGFyZ3NbMF0KKyAgICBkZWYgdGVzdE1hcE1hcChzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RNYXBNYXAoJXMpJyAlIHRoaW5nKQorICAgICAgICByZXR1cm4geworICAgICAgICAgICAgLTQ6IHsKKyAgICAgICAgICAgICAgICAtNDogLTQsCisgICAgICAgICAgICAgICAgLTM6IC0zLAorICAgICAgICAgICAgICAgIC0yOiAtMiwKKyAgICAgICAgICAgICAgICAtMTogLTEsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgNDogeworICAgICAgICAgICAgICAgIDQ6IDQsCisgICAgICAgICAgICAgICAgMzogMywKKyAgICAgICAgICAgICAgICAyOiAyLAorICAgICAgICAgICAgICAgIDE6IDEsCisgICAgICAgICAgICB9LAorICAgICAgICB9CiAKLSMgU2V0IHVwIHRoZSBoYW5kbGVyIGFuZCBwcm9jZXNzb3Igb2JqZWN0cwotaGFuZGxlciA9IFRlc3RIYW5kbGVyKCkKLXByb2Nlc3NvciA9IFRocmlmdFRlc3QuUHJvY2Vzc29yKGhhbmRsZXIpCisgICAgZGVmIHRlc3RJbnNhbml0eShzZWxmLCBhcmd1bWVudCk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RJbnNhbml0eSglcyknICUgYXJndW1lbnQpCisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAxOiB7CisgICAgICAgICAgICAgICAgMjogYXJndW1lbnQsCisgICAgICAgICAgICAgICAgMzogYXJndW1lbnQsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgMjogezY6IEluc2FuaXR5KCl9LAorICAgICAgICB9CiAKLSMgSGFuZGxlIFRIdHRwU2VydmVyIGFzIGEgc3BlY2lhbCBjYXNlCi1pZiBzZXJ2ZXJfdHlwZSA9PSAnVEh0dHBTZXJ2ZXInOgotICBzZXJ2ZXIgPVRIdHRwU2VydmVyLlRIdHRwU2VydmVyKHByb2Nlc3NvciwgKCcnLCBvcHRpb25zLnBvcnQpLCBwZmFjdG9yeSkKLSAgc2VydmVyLnNlcnZlKCkKLSAgc3lzLmV4aXQoMCkKKyAgICBkZWYgdGVzdE11bHRpKHNlbGYsIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0TXVsdGkoJXMpJyAlIFthcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1XSkKKyAgICAgICAgcmV0dXJuIFh0cnVjdChzdHJpbmdfdGhpbmc9J0hlbGxvMicsCisgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZz1hcmcwLCBpMzJfdGhpbmc9YXJnMSwgaTY0X3RoaW5nPWFyZzIpCiAKLSMgc2V0IHVwIHNlcnZlciB0cmFuc3BvcnQgYW5kIHRyYW5zcG9ydCBmYWN0b3J5Ci1ob3N0ID0gTm9uZQotaWYgb3B0aW9ucy5zc2w6Ci0gIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNTTFNvY2tldAotICB0cmFuc3BvcnQgPSBUU1NMU29ja2V0LlRTU0xTZXJ2ZXJTb2NrZXQoaG9zdCwgb3B0aW9ucy5wb3J0LCBjZXJ0ZmlsZT0ndGVzdF9jZXJ0LnBlbScpCi1lbHNlOgotICB0cmFuc3BvcnQgPSBUU29ja2V0LlRTZXJ2ZXJTb2NrZXQoaG9zdCwgb3B0aW9ucy5wb3J0KQotdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQogCi0jIGlmIC0temxpYiwgdGhlbiB3cmFwIHNlcnZlciB0cmFuc3BvcnQsIGFuZCB1c2UgYSBkaWZmZXJlbnQgdHJhbnNwb3J0IGZhY3RvcnkKLWlmIG9wdGlvbnMuemxpYjoKLSAgdHJhbnNwb3J0ID0gVFpsaWJUcmFuc3BvcnQuVFpsaWJUcmFuc3BvcnQodHJhbnNwb3J0KSAjIHdyYXAgIHdpdGggemxpYgotICB0ZmFjdG9yeSA9IFRabGliVHJhbnNwb3J0LlRabGliVHJhbnNwb3J0RmFjdG9yeSgpCitkZWYgbWFpbihvcHRpb25zKToKKyAgICAjIHNldCB1cCB0aGUgcHJvdG9jb2wgZmFjdG9yeSBmb3JtIHRoZSAtLXByb3RvY29sIG9wdGlvbgorICAgIHByb3RfZmFjdG9yaWVzID0geworICAgICAgICAnYWNjZWwnOiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KCksCisgICAgICAgICdhY2NlbGMnOiBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoKSwKKyAgICAgICAgJ2JpbmFyeSc6IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCksCisgICAgICAgICdjb21wYWN0JzogVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpLAorICAgICAgICAnaGVhZGVyJzogVEhlYWRlclByb3RvY29sLlRIZWFkZXJQcm90b2NvbEZhY3RvcnkoYWxsb3dlZF9jbGllbnRfdHlwZXM9WworICAgICAgICAgICAgVEhlYWRlclRyYW5zcG9ydC5USGVhZGVyQ2xpZW50VHlwZS5IRUFERVJTLAorICAgICAgICAgICAgVEhlYWRlclRyYW5zcG9ydC5USGVhZGVyQ2xpZW50VHlwZS5GUkFNRURfQklOQVJZLAorICAgICAgICAgICAgVEhlYWRlclRyYW5zcG9ydC5USGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9CSU5BUlksCisgICAgICAgICAgICBUSGVhZGVyVHJhbnNwb3J0LlRIZWFkZXJDbGllbnRUeXBlLkZSQU1FRF9DT01QQUNULAorICAgICAgICAgICAgVEhlYWRlclRyYW5zcG9ydC5USGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9DT01QQUNULAorICAgICAgICBdKSwKKyAgICAgICAgJ2pzb24nOiBUSlNPTlByb3RvY29sLlRKU09OUHJvdG9jb2xGYWN0b3J5KCksCisgICAgfQorICAgIHBmYWN0b3J5ID0gcHJvdF9mYWN0b3JpZXMuZ2V0KG9wdGlvbnMucHJvdG8sIE5vbmUpCisgICAgaWYgcGZhY3RvcnkgaXMgTm9uZToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ1Vua25vd24gLS1wcm90b2NvbCBvcHRpb246ICVzJyAlIG9wdGlvbnMucHJvdG8pCisgICAgdHJ5OgorICAgICAgICBwZmFjdG9yeS5zdHJpbmdfbGVuZ3RoX2xpbWl0ID0gb3B0aW9ucy5zdHJpbmdfbGltaXQKKyAgICAgICAgcGZhY3RvcnkuY29udGFpbmVyX2xlbmd0aF9saW1pdCA9IG9wdGlvbnMuY29udGFpbmVyX2xpbWl0CisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgIyBJZ25vcmUgZXJyb3JzIGZvciB0aG9zZSBwcm90b2NvbHMgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IGxlbmd0aCBsaW1pdAorICAgICAgICBwYXNzCiAKLSMgZG8gc2VydmVyLXNwZWNpZmljIHNldHVwIGhlcmU6Ci1pZiBzZXJ2ZXJfdHlwZSA9PSAiVE5vbmJsb2NraW5nU2VydmVyIjoKLSAgc2VydmVyID0gVE5vbmJsb2NraW5nU2VydmVyLlROb25ibG9ja2luZ1NlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgaW5wdXRQcm90b2NvbEZhY3Rvcnk9cGZhY3RvcnkpCi1lbGlmIHNlcnZlcl90eXBlID09ICJUUHJvY2Vzc1Bvb2xTZXJ2ZXIiOgotICBpbXBvcnQgc2lnbmFsCi0gIGZyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVFByb2Nlc3NQb29sU2VydmVyCi0gIHNlcnZlciA9IFRQcm9jZXNzUG9vbFNlcnZlci5UUHJvY2Vzc1Bvb2xTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKLSAgc2VydmVyLnNldE51bVdvcmtlcnMoNSkKLSAgZGVmIHNldF9hbGFybSgpOgotICAgIGRlZiBjbGVhbl9zaHV0ZG93bihzaWdudW0sIGZyYW1lKToKLSAgICAgIGZvciB3b3JrZXIgaW4gc2VydmVyLndvcmtlcnM6Ci0gICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDA6Ci0gICAgICAgICAgcHJpbnQgJ1Rlcm1pbmF0aW5nIHdvcmtlcjogJXMnICUgd29ya2VyCi0gICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKQotICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMDoKLSAgICAgICAgcHJpbnQgJ1JlcXVlc3Rpbmcgc2VydmVyIHRvIHN0b3AoKScKLSAgICAgIHNlcnZlci5zdG9wKCkKLSAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBjbGVhbl9zaHV0ZG93bikKLSAgICBzaWduYWwuYWxhcm0oMikKLSAgc2V0X2FsYXJtKCkKLWVsc2U6Ci0gICMgbG9vayB1cCBzZXJ2ZXIgY2xhc3MgZHluYW1pY2FsbHkgdG8gaW5zdGFudGlhdGUgc2VydmVyCi0gIFNlcnZlckNsYXNzID0gZ2V0YXR0cihUU2VydmVyLCBzZXJ2ZXJfdHlwZSkKLSAgc2VydmVyID0gU2VydmVyQ2xhc3MocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKLSMgZW50ZXIgc2VydmVyIG1haW4gbG9vcAotc2VydmVyLnNlcnZlKCkKKyAgICAjIGdldCB0aGUgc2VydmVyIHR5cGUgKFRTaW1wbGVTZXJ2ZXIsIFROb25ibG9ja2luZ1NlcnZlciwgZXRjLi4uKQorICAgIGlmIGxlbihhcmdzKSA+IDE6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdPbmx5IG9uZSBzZXJ2ZXIgdHlwZSBtYXkgYmUgc3BlY2lmaWVkLCBub3QgbXVsdGlwbGUgdHlwZXMuJykKKyAgICBzZXJ2ZXJfdHlwZSA9IGFyZ3NbMF0KKyAgICBpZiBvcHRpb25zLnRyYW5zID09ICdodHRwJzoKKyAgICAgICAgc2VydmVyX3R5cGUgPSAnVEh0dHBTZXJ2ZXInCisKKyAgICAjIFNldCB1cCB0aGUgaGFuZGxlciBhbmQgcHJvY2Vzc29yIG9iamVjdHMKKyAgICBoYW5kbGVyID0gVGVzdEhhbmRsZXIoKQorICAgIHByb2Nlc3NvciA9IFRocmlmdFRlc3QuUHJvY2Vzc29yKGhhbmRsZXIpCisKKyAgICBnbG9iYWwgc2VydmVyCisKKyAgICAjIEhhbmRsZSBUSHR0cFNlcnZlciBhcyBhIHNwZWNpYWwgY2FzZQorICAgIGlmIHNlcnZlcl90eXBlID09ICdUSHR0cFNlcnZlcic6CisgICAgICAgIGlmIG9wdGlvbnMuc3NsOgorICAgICAgICAgICAgX19jZXJ0ZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUiksICJrZXlzIiwgInNlcnZlci5jcnQiKQorICAgICAgICAgICAgX19rZXlmaWxlID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShTQ1JJUFRfRElSKSwgImtleXMiLCAic2VydmVyLmtleSIpCisgICAgICAgICAgICBzZXJ2ZXIgPSBUSHR0cFNlcnZlci5USHR0cFNlcnZlcihwcm9jZXNzb3IsICgnJywgb3B0aW9ucy5wb3J0KSwgcGZhY3RvcnksIGNlcnRfZmlsZT1fX2NlcnRmaWxlLCBrZXlfZmlsZT1fX2tleWZpbGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXJ2ZXIgPSBUSHR0cFNlcnZlci5USHR0cFNlcnZlcihwcm9jZXNzb3IsICgnJywgb3B0aW9ucy5wb3J0KSwgcGZhY3RvcnkpCisgICAgICAgIHNlcnZlci5zZXJ2ZSgpCisgICAgICAgIHN5cy5leGl0KDApCisKKyAgICAjIHNldCB1cCBzZXJ2ZXIgdHJhbnNwb3J0IGFuZCB0cmFuc3BvcnQgZmFjdG9yeQorCisgICAgYWJzX2tleV9wYXRoID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShTQ1JJUFRfRElSKSwgJ2tleXMnLCAnc2VydmVyLnBlbScpCisKKyAgICBob3N0ID0gTm9uZQorICAgIGlmIG9wdGlvbnMuc3NsOgorICAgICAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTU0xTb2NrZXQKKyAgICAgICAgdHJhbnNwb3J0ID0gVFNTTFNvY2tldC5UU1NMU2VydmVyU29ja2V0KGhvc3QsIG9wdGlvbnMucG9ydCwgY2VydGZpbGU9YWJzX2tleV9wYXRoKQorICAgIGVsc2U6CisgICAgICAgIHRyYW5zcG9ydCA9IFRTb2NrZXQuVFNlcnZlclNvY2tldChob3N0LCBvcHRpb25zLnBvcnQpCisgICAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQorICAgIGlmIG9wdGlvbnMudHJhbnMgPT0gJ2J1ZmZlcmVkJzoKKyAgICAgICAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQorICAgIGVsaWYgb3B0aW9ucy50cmFucyA9PSAnZnJhbWVkJzoKKyAgICAgICAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KCkKKyAgICBlbGlmIG9wdGlvbnMudHJhbnMgPT0gJyc6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdVbmtub3duIC0tdHJhbnNwb3J0IG9wdGlvbjogJXMnICUgb3B0aW9ucy50cmFucykKKyAgICBlbHNlOgorICAgICAgICB0ZmFjdG9yeSA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpCisgICAgIyBpZiAtLXpsaWIsIHRoZW4gd3JhcCBzZXJ2ZXIgdHJhbnNwb3J0LCBhbmQgdXNlIGEgZGlmZmVyZW50IHRyYW5zcG9ydCBmYWN0b3J5CisgICAgaWYgb3B0aW9ucy56bGliOgorICAgICAgICB0cmFuc3BvcnQgPSBUWmxpYlRyYW5zcG9ydC5UWmxpYlRyYW5zcG9ydCh0cmFuc3BvcnQpICAjIHdyYXAgIHdpdGggemxpYgorICAgICAgICB0ZmFjdG9yeSA9IFRabGliVHJhbnNwb3J0LlRabGliVHJhbnNwb3J0RmFjdG9yeSgpCisKKyAgICAjIGRvIHNlcnZlci1zcGVjaWZpYyBzZXR1cCBoZXJlOgorICAgIGlmIHNlcnZlcl90eXBlID09ICJUTm9uYmxvY2tpbmdTZXJ2ZXIiOgorICAgICAgICBzZXJ2ZXIgPSBUTm9uYmxvY2tpbmdTZXJ2ZXIuVE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCBpbnB1dFByb3RvY29sRmFjdG9yeT1wZmFjdG9yeSkKKyAgICBlbGlmIHNlcnZlcl90eXBlID09ICJUUHJvY2Vzc1Bvb2xTZXJ2ZXIiOgorICAgICAgICBpbXBvcnQgc2lnbmFsCisgICAgICAgIGZyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVFByb2Nlc3NQb29sU2VydmVyCisgICAgICAgIHNlcnZlciA9IFRQcm9jZXNzUG9vbFNlcnZlci5UUHJvY2Vzc1Bvb2xTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKyAgICAgICAgc2VydmVyLnNldE51bVdvcmtlcnMoNSkKKworICAgICAgICBkZWYgc2V0X2FsYXJtKCk6CisgICAgICAgICAgICBkZWYgY2xlYW5fc2h1dGRvd24oc2lnbnVtLCBmcmFtZSk6CisgICAgICAgICAgICAgICAgZm9yIHdvcmtlciBpbiBzZXJ2ZXIud29ya2VyczoKKyAgICAgICAgICAgICAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygnVGVybWluYXRpbmcgd29ya2VyOiAlcycgJSB3b3JrZXIpCisgICAgICAgICAgICAgICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKQorICAgICAgICAgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDA6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygnUmVxdWVzdGluZyBzZXJ2ZXIgdG8gc3RvcCgpJykKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5zdG9wKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBjbGVhbl9zaHV0ZG93bikKKyAgICAgICAgICAgIHNpZ25hbC5hbGFybSg0KQorICAgICAgICBzZXRfYWxhcm0oKQorICAgIGVsc2U6CisgICAgICAgICMgbG9vayB1cCBzZXJ2ZXIgY2xhc3MgZHluYW1pY2FsbHkgdG8gaW5zdGFudGlhdGUgc2VydmVyCisgICAgICAgIFNlcnZlckNsYXNzID0gZ2V0YXR0cihUU2VydmVyLCBzZXJ2ZXJfdHlwZSkKKyAgICAgICAgc2VydmVyID0gU2VydmVyQ2xhc3MocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKyAgICAjIGVudGVyIHNlcnZlciBtYWluIGxvb3AKKyAgICBzZXJ2ZXIuc2VydmUoKQorCisKK2RlZiBleGl0X2dyYWNlZnVsbHkoc2lnbnVtLCBmcmFtZSk6CisgICAgcHJpbnQoIlNJR0lOVCByZWNlaXZlZFxuIikKKyAgICBzZXJ2ZXIuc2h1dGRvd24oKSAgICMgZG9lc24ndCB3b3JrIHByb3Blcmx5LCB5ZXQKKyAgICBzeXMuZXhpdCgwKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSU5ULCBleGl0X2dyYWNlZnVsbHkpCisKKyAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIoKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLWxpYnB5ZGlyJywgdHlwZT0nc3RyaW5nJywgZGVzdD0nbGlicHlkaXInLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2luY2x1ZGUgdGhpcyBkaXJlY3RvcnkgdG8gc3lzLnBhdGggZm9yIGxvY2F0aW5nIGxpYnJhcnkgY29kZScpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tZ2VucHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdnZW5weWRpcicsCisgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0nZ2VuLXB5JywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdpbmNsdWRlIHRoaXMgZGlyZWN0b3J5IHRvIHN5cy5wYXRoIGZvciBsb2NhdGluZyBnZW5lcmF0ZWQgY29kZScpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0tcG9ydCIsIHR5cGU9ImludCIsIGRlc3Q9InBvcnQiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InBvcnQgbnVtYmVyIGZvciBzZXJ2ZXIgdG8gbGlzdGVuIG9uIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS16bGliIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0iemxpYiIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idXNlIHpsaWIgd3JhcHBlciBmb3IgY29tcHJlc3NlZCB0cmFuc3BvcnQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLXNzbCIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9InNzbCIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idXNlIFNTTCBmb3IgZW5jcnlwdGVkIHRyYW5zcG9ydCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy12JywgJy0tdmVyYm9zZScsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0yLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InZlcmJvc2Ugb3V0cHV0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0wLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Im1pbmltYWwgb3V0cHV0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1wcm90b2NvbCcsIGRlc3Q9InByb3RvIiwgdHlwZT0ic3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJwcm90b2NvbCB0byB1c2UsIG9uZSBvZjogYWNjZWwsIGFjY2VsYywgYmluYXJ5LCBjb21wYWN0LCBqc29uIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS10cmFuc3BvcnQnLCBkZXN0PSJ0cmFucyIsIHR5cGU9InN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idHJhbnNwb3J0IHRvIHVzZSwgb25lIG9mOiBidWZmZXJlZCwgZnJhbWVkLCBodHRwIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1jb250YWluZXItbGltaXQnLCBkZXN0PSdjb250YWluZXJfbGltaXQnLCB0eXBlPSdpbnQnLCBkZWZhdWx0PU5vbmUpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tc3RyaW5nLWxpbWl0JywgZGVzdD0nc3RyaW5nX2xpbWl0JywgdHlwZT0naW50JywgZGVmYXVsdD1Ob25lKQorICAgIHBhcnNlci5zZXRfZGVmYXVsdHMocG9ydD05MDkwLCB2ZXJib3NlPTEsIHByb3RvPSdiaW5hcnknLCB0cmFuc3BvcnQ9J2J1ZmZlcmVkJykKKyAgICBvcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgIyBQcmludCBUU2VydmVyIGxvZyB0byBzdGRvdXQgc28gdGhhdCB0aGUgdGVzdC1ydW5uZXIgY2FuIHJlZGlyZWN0IGl0IHRvIGxvZyBmaWxlcworICAgIGxvZ2dpbmcuYmFzaWNDb25maWcobGV2ZWw9b3B0aW9ucy52ZXJib3NlKQorCisgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguam9pbihTQ1JJUFRfRElSLCBvcHRpb25zLmdlbnB5ZGlyKSkKKyAgICBzeXMucGF0aC5pbnNlcnQoMCwgbG9jYWxfbGlicGF0aCgpKQorCisgICAgZnJvbSBUaHJpZnRUZXN0IGltcG9ydCBUaHJpZnRUZXN0CisgICAgZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgWHRydWN0LCBYY2VwdGlvbiwgWGNlcHRpb24yLCBJbnNhbml0eQorICAgIGZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEV4Y2VwdGlvbgorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVEhlYWRlclRyYW5zcG9ydAorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFpsaWJUcmFuc3BvcnQKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCisgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEhlYWRlclByb3RvY29sCisgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRKU09OUHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIsIFROb25ibG9ja2luZ1NlcnZlciwgVEh0dHBTZXJ2ZXIKKworICAgIHN5cy5leGl0KG1haW4ob3B0aW9ucykpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1Rlc3RTb2NrZXQucHkgYi90ZXN0L3B5L1Rlc3RTb2NrZXQucHkKaW5kZXggMmY3MzUzZi4uNjE5ZWIxMCAxMDA3NTUKLS0tIGEvdGVzdC9weS9UZXN0U29ja2V0LnB5CisrKyBiL3Rlc3QvcHkvVGVzdFNvY2tldC5weQpAQCAtMTksMjQgKzE5LDE2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBnbG9iCi1zeXMucGF0aC5pbnNlcnQoMCwgJy4vZ2VuLXB5JykKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQotCi1mcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0Ci1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB0aW1lCiBpbXBvcnQgc29ja2V0CiBpbXBvcnQgcmFuZG9tCi1mcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKKwogCiBjbGFzcyBUaW1lb3V0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoNTApOgorICAgICAgICBmb3IgaSBpbiByYW5nZSg1MCk6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgIyBmaW5kIGEgcG9ydCB3ZSBjYW4gdXNlCiAgICAgICAgICAgICAgICAgc2VsZi5saXN0ZW5fc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKQEAgLTQ0LDcgKzM2LDcgQEAKICAgICAgICAgICAgICAgICBzZWxmLmxpc3Rlbl9zb2NrLmJpbmQoKCdsb2NhbGhvc3QnLCBzZWxmLnBvcnQpKQogICAgICAgICAgICAgICAgIHNlbGYubGlzdGVuX3NvY2subGlzdGVuKDUpCiAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgaWYgaSA9PSA0OToKICAgICAgICAgICAgICAgICAgICAgcmFpc2UKIApAQCAtNTMsMTIgKzQ1LDEyIEBACiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgbGVha3kgPSBbXQotICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMCk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxMDApOgogICAgICAgICAgICAgICAgIHNvY2tldCA9IFRTb2NrZXQuVFNvY2tldCgnbG9jYWxob3N0Jywgc2VsZi5wb3J0KQogICAgICAgICAgICAgICAgIHNvY2tldC5zZXRUaW1lb3V0KDEwKQogICAgICAgICAgICAgICAgIHNvY2tldC5vcGVuKCkKICAgICAgICAgICAgICAgICBsZWFreS5hcHBlbmQoc29ja2V0KQotICAgICAgICBleGNlcHQ6CisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICBzZWxmLmFzc2VydF8odGltZS50aW1lKCkgLSBzdGFydHRpbWUgPCA1LjApCiAKICAgICBkZWYgdGVzdFdyaXRlVGltZW91dChzZWxmKToKQEAgLTcwLDE1ICs2MiwxNyBAQAogICAgICAgICAgICAgc29ja2V0Lm9wZW4oKQogICAgICAgICAgICAgbHNvY2sgPSBzZWxmLmxpc3Rlbl9zb2NrLmFjY2VwdCgpCiAgICAgICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgICAgIHNvY2tldC53cml0ZSgiaGkiICogMTAwKQorICAgICAgICAgICAgICAgIGxzb2NrLndyaXRlKCJoaSIgKiAxMDApCiAKLSAgICAgICAgZXhjZXB0OgorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHRpbWUudGltZSgpIC0gc3RhcnR0aW1lIDwgNS4wKQogCi1zdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCi1sb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKIAotc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRpbWVvdXRUZXN0KSkKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQogCi10ZXN0UnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpCi10ZXN0UnVubmVyLnJ1bihzdWl0ZSkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGltZW91dFRlc3QpKQorCisgICAgdGVzdFJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKQorICAgIHRlc3RSdW5uZXIucnVuKHN1aXRlKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9UZXN0U3ludGF4LnB5IGIvdGVzdC9weS9UZXN0U3ludGF4LnB5CmluZGV4IGRmNjdkNDguLmRiZTc5NzUgMTAwNzU1Ci0tLSBhL3Rlc3QvcHkvVGVzdFN5bnRheC5weQorKysgYi90ZXN0L3B5L1Rlc3RTeW50YXgucHkKQEAgLTE5LDEwICsxOSw2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBnbG9iCi1zeXMucGF0aC5pbnNlcnQoMCwgJy4vZ2VuLXB5JykKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQotCiAjIEp1c3QgaW1wb3J0IHRoZXNlIGdlbmVyYXRlZCBmaWxlcyB0byBtYWtlIHN1cmUgdGhleSBhcmUgc3ludGFjdGljYWxseSB2YWxpZAotZnJvbSBEZWJ1Z1Byb3RvVGVzdCBpbXBvcnQgRW1wdHlTZXJ2aWNlCi1mcm9tIERlYnVnUHJvdG9UZXN0IGltcG9ydCBJbmhlcml0ZWQKK2Zyb20gRGVidWdQcm90b1Rlc3QgaW1wb3J0IEVtcHR5U2VydmljZSAgIyBub3FhCitmcm9tIERlYnVnUHJvdG9UZXN0IGltcG9ydCBJbmhlcml0ZWQgICMgbm9xYQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9leHBsaWNpdF9tb2R1bGUvcnVudGVzdC5zaCBiL3Rlc3QvcHkvZXhwbGljaXRfbW9kdWxlL3J1bnRlc3Quc2gKaW5kZXggMmU1YTRmMS4uNmQ3MzQ2MiAxMDA3NTUKLS0tIGEvdGVzdC9weS9leHBsaWNpdF9tb2R1bGUvcnVudGVzdC5zaAorKysgYi90ZXN0L3B5L2V4cGxpY2l0X21vZHVsZS9ydW50ZXN0LnNoCkBAIC0yMiw2ICsyMiw3IEBACiBybSAtcmYgZ2VuLXB5CiAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIHB5IHRlc3QxLnRocmlmdCB8fCBleGl0IDEKIC4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gcHkgdGVzdDIudGhyaWZ0IHx8IGV4aXQgMQorLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBweSB0ZXN0My50aHJpZnQgJiYgZXhpdCAxICAjIEZhaWwgc2luY2UgdGVzdDMudGhyaWZ0IGhhcyBweXRob24ga2V5d29yZHMKIFBZVEhPTlBBVEg9Li9nZW4tcHkgcHl0aG9uIC1jICdpbXBvcnQgZm9vLmJhci5iYXonIHx8IGV4aXQgMQogUFlUSE9OUEFUSD0uL2dlbi1weSBweXRob24gLWMgJ2ltcG9ydCB0ZXN0MicgfHwgZXhpdCAxCiBQWVRIT05QQVRIPS4vZ2VuLXB5IHB5dGhvbiAtYyAnaW1wb3J0IHRlc3QxJyAmPi9kZXYvbnVsbCAmJiBleGl0IDEgICMgU2hvdWxkIGZhaWwuCmRpZmYgLS1naXQgYS90ZXN0L3B5L2V4cGxpY2l0X21vZHVsZS90ZXN0My50aHJpZnQgYi90ZXN0L3B5L2V4cGxpY2l0X21vZHVsZS90ZXN0My50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0Nzg2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkvZXhwbGljaXRfbW9kdWxlL3Rlc3QzLnRocmlmdApAQCAtMCwwICsxLDI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBweSB2YWxpZGF0aW9ucworCitzdHJ1Y3QgZnJvbSB7CisgIDE6IGkzMiBkZWY7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvZ2VuZXJhdGUuY21ha2UgYi90ZXN0L3B5L2dlbmVyYXRlLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZDE0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L2dlbmVyYXRlLmNtYWtlCkBAIC0wLDAgKzEsMzYgQEAKK21hY3JvKEdFTkVSQVRFIEZJTEVOQU1FIEdFTkVSQVRPUiBPVVRQVVRESVIpCisgIGZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtNWV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7T1VUUFVURElSfSkKKyAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtUSFJJRlRDT01QSUxFUn0gLS1nZW4gJHtHRU5FUkFUT1J9IC1vdXQgJHtNWV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7T1VUUFVURElSfSAke0ZJTEVOQU1FfQorICAgICAgICAgICAgICAgICAgUkVTVUxUX1ZBUklBQkxFIENNRF9SRVNVTFQpCisgIGlmKENNRF9SRVNVTFQpCisgICAgICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkVycm9yIGdlbmVyYXRpbmcgJHtGSUxFTkFNRX0gd2l0aCBnZW5lcmF0b3IgJHtHRU5FUkFUT1J9IikKKyAgZW5kaWYoKQorZW5kbWFjcm8oR0VORVJBVEUpCisKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgcHkgZ2VuLXB5LWRlZmF1bHQpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IHB5OnNsb3RzIGdlbi1weS1zbG90cykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgcHk6b2xkX3N0eWxlIGdlbi1weS1vbGRzdHlsZSkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgcHk6bm9fdXRmOHN0cmluZ3MgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCBweTpkeW5hbWljIGdlbi1weS1keW5hbWljKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCBweTpkeW5hbWljLHNsb3RzIGdlbi1weS1keW5hbWljc2xvdHMpCisKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IHB5IGdlbi1weS1kZWZhdWx0KQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgcHk6c2xvdHMgZ2VuLXB5LXNsb3RzKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgcHk6b2xkX3N0eWxlIGdlbi1weS1vbGRzdHlsZSkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IHB5Om5vX3V0ZjhzdHJpbmdzIGdlbi1weS1ub191dGY4c3RyaW5ncykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IHB5OmR5bmFtaWMgZ2VuLXB5LWR5bmFtaWMpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCBweTpkeW5hbWljLHNsb3RzIGdlbi1weS1keW5hbWljc2xvdHMpCisKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgcHkgZ2VuLXB5LWRlZmF1bHQpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IHB5OnNsb3RzIGdlbi1weS1zbG90cykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgcHk6b2xkX3N0eWxlIGdlbi1weS1vbGRzdHlsZSkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgcHk6bm9fdXRmOHN0cmluZ3MgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBweTpkeW5hbWljIGdlbi1weS1keW5hbWljKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBweTpkeW5hbWljLHNsb3RzIGdlbi1weS1keW5hbWljc2xvdHMpCisKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdCBweSBnZW4tcHktZGVmYXVsdCkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdCBweTpzbG90cyBnZW4tcHktc2xvdHMpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgcHk6b2xkX3N0eWxlIGdlbi1weS1vbGRzdHlsZSkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdCBweTpub191dGY4c3RyaW5ncyBnZW4tcHktbm9fdXRmOHN0cmluZ3MpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgcHk6ZHluYW1pYyBnZW4tcHktZHluYW1pYykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdCBweTpkeW5hbWljLHNsb3RzIGdlbi1weS1keW5hbWljc2xvdHMpCmRpZmYgLS1naXQgYS90ZXN0L3B5L3NldHVwLmNmZyBiL3Rlc3QvcHkvc2V0dXAuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYTFmOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L3NldHVwLmNmZwpAQCAtMCwwICsxLDIgQEAKK1tmbGFrZThdCittYXgtbGluZS1sZW5ndGggPSAxMDAKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvdGVzdF9jZXJ0LnBlbSBiL3Rlc3QvcHkvdGVzdF9jZXJ0LnBlbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIxYTUxZi4uMDAwMDAwMAotLS0gYS90ZXN0L3B5L3Rlc3RfY2VydC5wZW0KKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0tLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KLU1JSUIrekNDQVdRQ0NRRHlxKytvN0swcnBUQU5CZ2txaGtpRzl3MEJBUVVGQURCQ01Rc3dDUVlEVlFRR0V3SlYKLVV6RVZNQk1HQTFVRUJ3d01SR1ZtWVhWc2RDQkRhWFI1TVJ3d0dnWURWUVFLREJORVpXWmhkV3gwSUVOdmJYQmgKLWJua2dUSFJrTUI0WERURXhNRE14TmpFek1UUTFOVm9YRFRJeE1ETXhNekV6TVRRMU5Wb3dRakVMTUFrR0ExVUUKLUJoTUNWVk14RlRBVEJnTlZCQWNNREVSbFptRjFiSFFnUTJsMGVURWNNQm9HQTFVRUNnd1RSR1ZtWVhWc2RDQkQKLWIyMXdZVzU1SUV4MFpEQ0JuekFOQmdrcWhraUc5dzBCQVFFRkFBT0JqUUF3Z1lrQ2dZRUE5bG1DdVZRUnFSQlIKLU9ZVkgrRk1DaFNvRjhJak13ZnJwbkM2NUo5UlI4OGRVSVpiakMyYitKUFQ1cWlVVlFmdDJOelBQd2lCblhJMnMKLWo2QW1IWVZLb1dHQjI0aE5YOGJqMmNqdHhkUHBUMnJ2ZkFsSUswcGF0MUMra0N4Z1JISWcrK1M3bzZHRUpPa3cKLU9RaW9wc1Vyb0FzSWJTUlQvSXJkL0EwK0tlU3FRMHNDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUVVGQUFPQmdRRGYKLVdzZUVoNi8zZ1dsL0c0NE15amxqQnZnUkFhMGMrZXFGTC9jVmw3WmZoMDMvS09YTWxQVjUvc25WVVlCT0pDQ0kKLXFQdVF3V1RvVCtRMzZrTlF5TW5HNGU0Z2grRG1zaUloZ1FnQTNsVlNORGhQUGZSckcxdkRlZVhYdHlicEVva2UKLWZJNm85YTlvbHpyS1dOdlcrLzhQOXhJRGxQMFNSWnhMNjY0NjRMQVFudz09Ci0tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCi1NSUlDWHdJQkFBS0JnUUQyV1lLNVZCR3BFRkU1aFVmNFV3S0ZLZ1h3aU16Qit1bWNMcmtuMUZIengxUWhsdU1MCi1adjRrOVBtcUpSVkIrM1kzTTgvQ0lHZGNqYXlQb0NZZGhVcWhZWUhiaUUxZnh1UFp5TzNGMCtsUGF1OThDVWdyCi1TbHEzVUw2UUxHQkVjaUQ3NUx1am9ZUWs2VEE1Q0tpbXhTdWdDd2h0SkZQOGl0MzhEVDRwNUtwRFN3SURBUUFCCi1Bb0dCQU1jbkE3UTVUM0dpZkZlSTlPNitoTG9NaC9LMVZQcTRrbVN0clFlUzhKR29JYzVwd2JDMUdWM2RJWHk0Ci1MK0JBbm9mdi9kUU5DQ0pkY2hSR1BxbjgySi9hT0Evc01zSko2VnpUU3I5Tk5WbDlsZ1FIZExqRURvWjE1eXhUCi12VlNjNG5HMnhCczd1Wi8yNGZOL1NKWlZGTzMrRWRwaE92cnA3dUVYTGlYbHF2b3BBa0VBL2g3WEdsclVMQklOCi1la2pBekVKRWNobFpiNHhKZFBySDNQNExaczkyWmxjTzg4R0ZyNXdmT3oxeXRhZkxpWkE5RXpZd0xJUVRQZHNrCi1ISHluSmVaV3R3SkJBUGdyOVBZVUpPZGtoVWVXVlNOMlB5cXZXS3JkUVZLdk0xVndOZ1JGYVNQWGdCZDBXR0lOCi1FeW0xYjd3dDZuZ3dOdGZMeDlGVU9SNm5sN01rbHNGTEJBMENRUURuU2lpYnF5bkx4czZQaXlJM2h1VUhPSDFICi1ZdGNFNnEvNE94MGpnUllSaFpGdFdLa1ZzYkpYVjlGTTl5RHczdUJIMlIwMWx5eHdNMEdGMEFyT0d2eTNBa0VBCi03ZUVjamgvaSs5V3psMW4zUStXZFNLb0pBTWJTVFpKWVQwWWUwTnREbTdKK09uMHdGdFJYa1B3MEhSbWFEUmlTCi1DU2x3NENxdUViOHRQdThNZmowTXBRSkJBS3dUTFNkSHN5MHZ4UVFKWG0wbFRJK0NrOUtKVU05dkp6RnVDTC94Ci1HNmZtc3FFdHR4amh5TG56ZStpSUlSQXUvSVYrQTVVclduSTFoNzI4eS93UmVqdz0KLS0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0L3B5L3Rlc3RfY2VydC5yZWFkbWUgYi90ZXN0L3B5L3Rlc3RfY2VydC5yZWFkbWUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YmJiYzkuLjAwMDAwMDAKLS0tIGEvdGVzdC9weS90ZXN0X2NlcnQucmVhZG1lCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1OT1RFOgotVGhlIHRlc3RfY2VydC5wZW0gZmlsZSBpbiB0aGlzIGRpcmVjdG9yeSBtdXN0IG5ldmVyIGJlIHVzZWQgb24gcHJvZHVjdGlvbiBzeXN0ZW1zLgotCi1UaGUga2V5IGl0IHJlcHJlc2VudHMgaXMgYSBzZWxmLXNpZ25lZCBrZXkgaW50ZW5kZWQgb25seSBmb3IgdXNlIGJ5IHRoZSB1bml0Ci10ZXN0aW5nIGZyYW1ld29yay4gIEl0IGlzIGEgcHVibGljbHkgZXhwb3NlZCBwcml2YXRlIGtleS4KLQotRG8gbm90IHVzZSB0ZXN0X2NlcnQucGVtIGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIHVuZGVyIGFueSBjaXJjdW1zdGFuY2VzLgpkaWZmIC0tZ2l0IGEvdGVzdC9weS91dGlsLnB5IGIvdGVzdC9weS91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYjNmNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L3V0aWwucHkKQEAgLTAsMCArMSwzMiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBnbG9iCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworX1NDUklQVF9ESVIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKK19ST09UX0RJUiA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX1NDUklQVF9ESVIpKQorCisKK2RlZiBsb2NhbF9saWJwYXRoKCk6CisgICAgZ2xvYmRpciA9IG9zLnBhdGguam9pbihfUk9PVF9ESVIsICdsaWInLCAncHknLCAnYnVpbGQnLCAnbGliLionKQorICAgIGZvciBsaWJwYXRoIGluIGdsb2IuZ2xvYihnbG9iZGlyKToKKyAgICAgICAgaWYgbGlicGF0aC5lbmRzd2l0aCgnLSVkLiVkJyAlIChzeXMudmVyc2lvbl9pbmZvWzBdLCBzeXMudmVyc2lvbl9pbmZvWzFdKSk6CisgICAgICAgICAgICByZXR1cm4gbGlicGF0aApkaWZmIC0tZ2l0IGEvdGVzdC9yYi9HZW1maWxlIGIvdGVzdC9yYi9HZW1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZjA1MzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3JiL0dlbWZpbGUKQEAgLTAsMCArMSw3IEBACitzb3VyY2UgImh0dHA6Ly9ydWJ5Z2Vtcy5vcmciCisKK3JlcXVpcmUgInJ1YnlnZW1zIgorCitnZW0gJ3JhY2snLCAnfj4gMi4wJywgJz49IDIuMC40JworZ2VtICd0aGluJywgJ34+IDEuNycsICc+PSAxLjcuMicKK2dlbSAndGVzdC11bml0JywgJ34+IDMuMicsICc+PSAzLjIuNycKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvTWFrZWZpbGUuYW0gYi90ZXN0L3JiL01ha2VmaWxlLmFtCmluZGV4IGE2ZjQzMWMuLmNmZGMxNDkgMTAwNjQ0Ci0tLSBhL3Rlc3QvcmIvTWFrZWZpbGUuYW0KKysrIGIvdGVzdC9yYi9NYWtlZmlsZS5hbQpAQCAtMTcsMTIgKzE3LDE2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9zcmNkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQotc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0IC4uL1NtYWxsVGVzdC50aHJpZnQKK3N0dWJzOiAkKFRIUklGVCkgLi4vVGhyaWZ0VGVzdC50aHJpZnQgLi4vU21hbGxUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiByYiAuLi9UaHJpZnRUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiByYiAuLi9TbWFsbFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIHJiIC4uL1JlY3Vyc2l2ZS50aHJpZnQKKworcHJlY3Jvc3M6IHN0dWJzCiAKIGNoZWNrOiBzdHVicwotCSQoUlVCWSkgdGVzdF9zdWl0ZS5yYgoraWYgSEFWRV9CVU5ETEVSCisJJChCVU5ETEVSKSBpbnN0YWxsCisJJChCVU5ETEVSKSBleGVjICQoUlVCWSkgLUkuIHRlc3Rfc3VpdGUucmIKK2VuZGlmCiAKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvY29yZS90cmFuc3BvcnQvdGVzdF90cmFuc3BvcnQucmIgYi90ZXN0L3JiL2NvcmUvdHJhbnNwb3J0L3Rlc3RfdHJhbnNwb3J0LnJiCmluZGV4IDUyNzU1YzEuLjM3YWZhODUgMTAwNjQ0Ci0tLSBhL3Rlc3QvcmIvY29yZS90cmFuc3BvcnQvdGVzdF90cmFuc3BvcnQucmIKKysrIGIvdGVzdC9yYi9jb3JlL3RyYW5zcG9ydC90ZXN0X3RyYW5zcG9ydC5yYgpAQCAtNTEsNyArNTEsNyBAQAogICAKICAgIyBUT0RPOgogICAjIFRoaXMgZG9lc24ndCBuZWNlc3NhcmlseSB0ZXN0IGhlIHJpZ2h0IHRoaW5nLgotICAjIEl0IF9sb29rc18gbGlrZSByZWFkIGlzbid0IGd1YXJlbnRlZWQgdG8gcmV0dXJuIHRoZSBsZW5ndGgKKyAgIyBJdCBfbG9va3NfIGxpa2UgcmVhZCBpc24ndCBndWFyYW50ZWVkIHRvIHJldHVybiB0aGUgbGVuZ3RoCiAgICMgeW91IGFzayBmb3IgYW5kIHJlYWRfYWxsIGlzLiBUaGlzIG1lYW5zIG91ciB0ZXN0IG5lZWRzIHRvIGNoZWNrCiAgICMgZm9yIGJsb2NraW5nLiAtLSBLZXZpbiBDbGFyayAzLzI3LzA4CiAgIGRlZiB0ZXN0X3JlYWRfYWxsCmRpZmYgLS1naXQgYS90ZXN0L3JiL2dlbmVyYXRpb24vdGVzdF9yZWN1cnNpdmUucmIgYi90ZXN0L3JiL2dlbmVyYXRpb24vdGVzdF9yZWN1cnNpdmUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkxMmY3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcmIvZ2VuZXJhdGlvbi90ZXN0X3JlY3Vyc2l2ZS5yYgpAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgJy4uL3Rlc3RfaGVscGVyJykKK3JlcXVpcmUgJ3JlY3Vyc2l2ZV90eXBlcycKKworY2xhc3MgVGVzdFJlY3Vyc2l2ZUdlbmVyYXRpb24gPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQorICBDSElMRF9JVEVNID0gImNoaWxkIGl0ZW0iCisgIFBBUkVOVF9JVEVNID0gInBhcmVudCBpdGVtIgorCisgIGRlZiB0ZXN0X2Nhbl9jcmVhdGVfcmVjdXJzaXZlX3RyZWUKKworICAgIGNoaWxkX3RyZWUgPSBSZWNUcmVlLm5ldworICAgIGNoaWxkX3RyZWUuaXRlbSA9IENISUxEX0lURU0KKworICAgIHBhcmVudF90cmVlID0gUmVjVHJlZS5uZXcKKyAgICBwYXJlbnRfdHJlZS5pdGVtID0gUEFSRU5UX0lURU0KKyAgICBwYXJlbnRfdHJlZS5jaGlsZHJlbiA9IFtjaGlsZF90cmVlXQorCisgICAgYXNzZXJ0X2VxdWFsKFBBUkVOVF9JVEVNLCBwYXJlbnRfdHJlZS5pdGVtKQorICAgIGFzc2VydF9lcXVhbCgxLCBwYXJlbnRfdHJlZS5jaGlsZHJlbi5sZW5ndGgpCisgICAgYXNzZXJ0X2VxdWFsKENISUxEX0lURU0sIHBhcmVudF90cmVlLmNoaWxkcmVuLmZpcnN0Lml0ZW0pCisgICAgYXNzZXJ0X25pbChwYXJlbnRfdHJlZS5jaGlsZHJlbi5maXJzdC5jaGlsZHJlbikKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vVGVzdENsaWVudC5yYiBiL3Rlc3QvcmIvaW50ZWdyYXRpb24vVGVzdENsaWVudC5yYgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MzlhY2E5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9yYi9pbnRlZ3JhdGlvbi9UZXN0Q2xpZW50LnJiCkBAIC0wLDAgKzEsMzgxIEBACisjIS91c3IvYmluL2VudiBydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworJDoucHVzaCBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy8uLicKKworcmVxdWlyZSAndGVzdF9oZWxwZXInCityZXF1aXJlICd0aHJpZnQnCityZXF1aXJlICd0aHJpZnRfdGVzdCcKKworJGRvbWFpbl9zb2NrZXQgPSBuaWwKKyRob3N0ID0gImxvY2FsaG9zdCIKKyRwb3J0ID0gOTA5MAorJHByb3RvY29sVHlwZSA9ICJiaW5hcnkiCiskc3NsID0gZmFsc2UKKyR0cmFuc3BvcnQgPSAiYnVmZmVyZWQiCisKK0FSR1YuZWFjaCBkb3xhfAorICBpZiBhID09ICItLWhlbHAiCisgICAgcHV0cyAiQWxsb3dlZCBvcHRpb25zOiIKKyAgICBwdXRzICJcdCAtaCBbIC0taGVscCBdIFx0IHByb2R1Y2UgaGVscCBtZXNzYWdlIgorICAgIHB1dHMgIlx0LS1kb21haW4tc29ja2V0IGFyZyAoPSkgXHQgVW5peCBkb21haW4gc29ja2V0IHBhdGgiCisgICAgcHV0cyAiXHQtLWhvc3QgYXJnICg9bG9jYWxob3N0KSBcdCBIb3N0IHRvIGNvbm5lY3QgXHQgbm90IHZhbGlkIHdpdGggZG9tYWluLXNvY2tldCIKKyAgICBwdXRzICJcdC0tcG9ydCBhcmcgKD05MDkwKSBcdCBQb3J0IG51bWJlciB0byBsaXN0ZW4gXHQgbm90IHZhbGlkIHdpdGggZG9tYWluLXNvY2tldCIKKyAgICBwdXRzICJcdC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSBcdCBwcm90b2NvbDogYWNjZWwsIGJpbmFyeSwgY29tcGFjdCwganNvbiIKKyAgICBwdXRzICJcdC0tc3NsIFx0IHVzZSBzc2wgXHQgbm90IHZhbGlkIHdpdGggZG9tYWluLXNvY2tldCIKKyAgICBwdXRzICJcdC0tdHJhbnNwb3J0IGFyZyAoPWJ1ZmZlcmVkKSB0cmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAiCisgICAgZXhpdAorICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLWRvbWFpbi1zb2NrZXQiKQorICAgICRkb21haW5fc29ja2V0ID0gYS5zcGxpdCgiPSIpWzFdCisgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0taG9zdCIpCisgICAgJGhvc3QgPSBhLnNwbGl0KCI9IilbMV0KKyAgZWxzaWYgYS5zdGFydF93aXRoPygiLS1wcm90b2NvbCIpCisgICAgJHByb3RvY29sVHlwZSA9IGEuc3BsaXQoIj0iKVsxXQorICBlbHNpZiBhID09ICItLXNzbCIKKyAgICAkc3NsID0gdHJ1ZQorICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLXRyYW5zcG9ydCIpCisgICAgJHRyYW5zcG9ydCA9IGEuc3BsaXQoIj0iKVsxXQorICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLXBvcnQiKQorICAgICRwb3J0ID0gYS5zcGxpdCgiPSIpWzFdLnRvX2kKKyAgZW5kCitlbmQKKworY2xhc3MgU2ltcGxlQ2xpZW50VGVzdCA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCisgIGRlZiBzZXR1cAorICAgIHVubGVzcyBAc29ja2V0CisgICAgICBpZiAkZG9tYWluX3NvY2tldC50b19zLnN0cmlwLmVtcHR5PworICAgICAgICBpZiAkc3NsCisgICAgICAgICAgIyB0aGUgd29ya2luZyBkaXJlY3RvcnkgZm9yIHJ1YnkgY3Jvc3N0ZXN0IGlzIHRlc3QvcmIvZ2VuLXJiCisgICAgICAgICAga2V5c0RpciA9IEZpbGUuam9pbihGaWxlLmRpcm5hbWUoRmlsZS5kaXJuYW1lKERpci5wd2QpKSwgImtleXMiKQorICAgICAgICAgIGN0eCA9IE9wZW5TU0w6OlNTTDo6U1NMQ29udGV4dC5uZXcKKyAgICAgICAgICBjdHguY2FfZmlsZSA9IEZpbGUuam9pbihrZXlzRGlyLCAiQ0EucGVtIikKKyAgICAgICAgICBjdHguY2VydCA9IE9wZW5TU0w6Olg1MDk6OkNlcnRpZmljYXRlLm5ldyhGaWxlLm9wZW4oRmlsZS5qb2luKGtleXNEaXIsICJjbGllbnQuY3J0IikpKQorICAgICAgICAgIGN0eC5jZXJ0X3N0b3JlID0gT3BlblNTTDo6WDUwOTo6U3RvcmUubmV3CisgICAgICAgICAgY3R4LmNlcnRfc3RvcmUuYWRkX2ZpbGUoRmlsZS5qb2luKGtleXNEaXIsICdzZXJ2ZXIucGVtJykpCisgICAgICAgICAgY3R4LmtleSA9IE9wZW5TU0w6OlBLZXk6OlJTQS5uZXcoRmlsZS5vcGVuKEZpbGUuam9pbihrZXlzRGlyLCAiY2xpZW50LmtleSIpKSkKKyAgICAgICAgICBjdHgub3B0aW9ucyA9IE9wZW5TU0w6OlNTTDo6T1BfTk9fU1NMdjIgfCBPcGVuU1NMOjpTU0w6Ok9QX05PX1NTTHYzCisgICAgICAgICAgY3R4LnNzbF92ZXJzaW9uID0gOlNTTHYyMworICAgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IE9wZW5TU0w6OlNTTDo6VkVSSUZZX1BFRVIKKyAgICAgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpTU0xTb2NrZXQubmV3KCRob3N0LCAkcG9ydCwgbmlsLCBjdHgpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpTb2NrZXQubmV3KCRob3N0LCAkcG9ydCkKKyAgICAgICAgZW5kCisgICAgICBlbHNlCisgICAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlVOSVhTb2NrZXQubmV3KCRkb21haW5fc29ja2V0KQorICAgICAgZW5kCisgICAgICAKKyAgICAgIGlmICR0cmFuc3BvcnQgPT0gImJ1ZmZlcmVkIgorICAgICAgICB0cmFuc3BvcnRGYWN0b3J5ID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcoQHNvY2tldCkKKyAgICAgIGVsc2lmICR0cmFuc3BvcnQgPT0gImZyYW1lZCIKKyAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAc29ja2V0KQorICAgICAgZWxzZQorICAgICAgICByYWlzZSAnVW5rbm93biB0cmFuc3BvcnQgdHlwZScKKyAgICAgIGVuZAorCisgICAgICBpZiAkcHJvdG9jb2xUeXBlID09ICJiaW5hcnkiCisgICAgICAgIEBwcm90b2NvbCA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2wubmV3KHRyYW5zcG9ydEZhY3RvcnkpCisgICAgICBlbHNpZiAkcHJvdG9jb2xUeXBlID09ICJjb21wYWN0IgorICAgICAgICBAcHJvdG9jb2wgPSBUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbC5uZXcodHJhbnNwb3J0RmFjdG9yeSkKKyAgICAgIGVsc2lmICRwcm90b2NvbFR5cGUgPT0gImpzb24iCisgICAgICAgIEBwcm90b2NvbCA9IFRocmlmdDo6SnNvblByb3RvY29sLm5ldyh0cmFuc3BvcnRGYWN0b3J5KQorICAgICAgZWxzaWYgJHByb3RvY29sVHlwZSA9PSAiYWNjZWwiCisgICAgICAgIEBwcm90b2NvbCA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5uZXcodHJhbnNwb3J0RmFjdG9yeSkKKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgJ1Vua25vd24gcHJvdG9jb2wgdHlwZScKKyAgICAgIGVuZAorICAgICAgQGNsaWVudCA9IFRocmlmdDo6VGVzdDo6VGhyaWZ0VGVzdDo6Q2xpZW50Lm5ldyhAcHJvdG9jb2wpCisgICAgICBAc29ja2V0Lm9wZW4KKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlYXJkb3duCisgICAgQHNvY2tldC5jbG9zZQorICBlbmQKKworICBkZWYgdGVzdF92b2lkCisgICAgcCAndGVzdF92b2lkJworICAgIEBjbGllbnQudGVzdFZvaWQoKQorICBlbmQKKworICBkZWYgdGVzdF9zdHJpbmcKKyAgICBwICd0ZXN0X3N0cmluZycKKyAgICB0ZXN0X3N0cmluZyA9CisgICAgICAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKKyAgICAgICcgZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFwvICcgKworICAgICAgJyBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogJyArCisgICAgICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcXC9cYlxuXHJcdCcgKworICAgICAgJyBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48JyArCisgICAgICAnIGNoYXItdG8tdGVzdC1qc29uLXBhcnNpbmc6IF1dIFwiXV0gXFwiIH19fXsgW1tbICcKKyAgICB0ZXN0X3N0cmluZyA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgIiArCisgICAgICAiQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsICIgKworICAgICAgItCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwgIiArCisgICAgICAi4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCAiICsKKyAgICAgICJDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsICIgKworICAgICAgIkRhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgIiArCisgICAgICAiRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCAiICsKKyAgICAgICJGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sICIgKworICAgICAgIkF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksICIgKworICAgICAgIktyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsICIgKworICAgICAgIklsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwgIiArCisgICAgICAi4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCAiICsKKyAgICAgICJSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sICIgKworICAgICAgIkzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhICIgKworICAgICAgIkJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsINmF2KfYstmQ2LHZiNmG24wsIEJhaGFzYSAiICsKKyAgICAgICJNZWxheXUsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKoiICsKKyAgICAgICJOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsICIgKworICAgICAgIk9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCAiICsKKyAgICAgICJOb3JmdWsgLyBQaXRrZXJuLCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7EgywgIiArCisgICAgICAi0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSAiICsKKyAgICAgICJFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssICIgKworICAgICAgIlN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgIiArCisgICAgICAiVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgIiArCisgICAgICAiV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgIiArCisgICAgICAiQsOibi1sw6JtLWfDuiwg57K16KqeIgorCisgICAgcmVzdWx0X3N0cmluZyA9IEBjbGllbnQudGVzdFN0cmluZyh0ZXN0X3N0cmluZykKKyAgICBhc3NlcnRfZXF1YWwodGVzdF9zdHJpbmcsIHJlc3VsdF9zdHJpbmcuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OlVURl84KSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfYm9vbAorICAgIHAgJ3Rlc3RfYm9vbCcKKyAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0Qm9vbCh0cnVlKSwgdHJ1ZSkKKyAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0Qm9vbChmYWxzZSksIGZhbHNlKQorICBlbmQKKworICBkZWYgdGVzdF9ieXRlCisgICAgcCAndGVzdF9ieXRlJworICAgIHZhbCA9IDEyMAorICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RCeXRlKHZhbCksIHZhbCkKKyAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0Qnl0ZSgtdmFsKSwgLXZhbCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfaTMyCisgICAgcCAndGVzdF9pMzInCisgICAgdmFsID0gMjAwMDAwMDAzMgorICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJMzIodmFsKSwgdmFsKQorICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJMzIoLXZhbCksIC12YWwpCisgIGVuZAorCisgIGRlZiB0ZXN0X2k2NAorICAgIHAgJ3Rlc3RfaTY0JworICAgIHZhbCA9IDkwMDAwMDAwMDAwMDAwMDAwNjQKKyAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STY0KHZhbCksIHZhbCkKKyAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STY0KC12YWwpLCAtdmFsKQorICBlbmQKKworICBkZWYgdGVzdF9kb3VibGUKKyAgICBwICd0ZXN0X2RvdWJsZScKKyAgICB2YWwgPSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CisgICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdERvdWJsZSh2YWwpLCB2YWwpCisgICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdERvdWJsZSgtdmFsKSwgLXZhbCkKKyAgICBhc3NlcnRfa2luZF9vZihGbG9hdCwgQGNsaWVudC50ZXN0RG91YmxlKHZhbCkpCisgIGVuZAorCisgIGRlZiB0ZXN0X2JpbmFyeQorICAgIHAgJ3Rlc3RfYmluYXJ5JworICAgIHZhbCA9ICgwLi4uMjU2KS5yZXZlcnNlX2VhY2gudG9fYQorICAgIHJldCA9IEBjbGllbnQudGVzdEJpbmFyeSh2YWwucGFjaygnQyonKSkKKyAgICBhc3NlcnRfZXF1YWwodmFsLCByZXQuYnl0ZXMudG9fYSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWFwCisgICAgcCAndGVzdF9tYXAnCisgICAgdmFsID0gezEgPT4gMSwgMiA9PiAyLCAzID0+IDN9CisgICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdE1hcCh2YWwpLCB2YWwpCisgICAgYXNzZXJ0X2tpbmRfb2YoSGFzaCwgQGNsaWVudC50ZXN0TWFwKHZhbCkpCisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cmluZ19tYXAKKyAgICBwICd0ZXN0X3N0cmluZ19tYXAnCisgICAgdmFsID0geydhJyA9PiAnMicsICdiJyA9PiAnYmxhaCcsICdzb21lJyA9PiAndGhpbmcnfQorICAgIHJldCA9IEBjbGllbnQudGVzdFN0cmluZ01hcCh2YWwpCisgICAgYXNzZXJ0X2VxdWFsKHZhbCwgcmV0KQorICAgIGFzc2VydF9raW5kX29mKEhhc2gsIHJldCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfbGlzdAorICAgIHAgJ3Rlc3RfbGlzdCcKKyAgICB2YWwgPSBbMSwyLDMsNCw1XQorICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RMaXN0KHZhbCksIHZhbCkKKyAgICBhc3NlcnRfa2luZF9vZihBcnJheSwgQGNsaWVudC50ZXN0TGlzdCh2YWwpKQorICBlbmQKKworICBkZWYgdGVzdF9lbnVtCisgICAgcCAndGVzdF9lbnVtJworICAgIHZhbCA9IFRocmlmdDo6VGVzdDo6TnVtYmVyejo6U0lYCisgICAgcmV0ID0gQGNsaWVudC50ZXN0RW51bSh2YWwpCisKKyAgICBhc3NlcnRfZXF1YWwocmV0LCA2KQorICAgIGFzc2VydF9raW5kX29mKEZpeG51bSwgcmV0KQorICBlbmQKKworICBkZWYgdGVzdF90eXBlZGVmCisgICAgcCAndGVzdF90eXBlZGVmJworICAgICNVc2VySWQgIHRlc3RUeXBlZGVmKDE6IFVzZXJJZCB0aGluZyksCisgICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSwgMzA5ODU4MjM1MDgyNTIzKQorICAgIGFzc2VydF9raW5kX29mKEZpeG51bSwgQGNsaWVudC50ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpKQorICAgIHRydWUKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc2V0CisgICAgcCAndGVzdF9zZXQnCisgICAgdmFsID0gU2V0Lm5ldyhbMSwyLDNdKQorICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RTZXQodmFsKSwgdmFsKQorICAgIGFzc2VydF9raW5kX29mKFNldCwgQGNsaWVudC50ZXN0U2V0KHZhbCkpCisgIGVuZAorCisgIGRlZiBnZXRfc3RydWN0CisgICAgVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QubmV3KHsnc3RyaW5nX3RoaW5nJyA9PiAnaGkhJywgJ2kzMl90aGluZycgPT4gNCB9KQorICBlbmQKKworICBkZWYgdGVzdF9zdHJ1Y3QKKyAgICBwICd0ZXN0X3N0cnVjdCcKKyAgICByZXQgPSBAY2xpZW50LnRlc3RTdHJ1Y3QoZ2V0X3N0cnVjdCkKKworICAgICMgVE9ETzogbm90IHN1cmUgd2hhdCB1bnNwZWNpZmllZCAiZGVmYXVsdCIgcmVxdWlyZWRuZXNzIHZhbHVlcyBzaG91bGQgYmUKKyAgICBhc3NlcnQocmV0LmJ5dGVfdGhpbmcgPT0gbmlsIHx8IHJldC5ieXRlX3RoaW5nID09IDApCisgICAgYXNzZXJ0KHJldC5pNjRfdGhpbmcgPT0gbmlsIHx8IHJldC5pNjRfdGhpbmcgPT0gMCkKKworICAgIGFzc2VydF9lcXVhbChyZXQuc3RyaW5nX3RoaW5nLCAnaGkhJykKKyAgICBhc3NlcnRfZXF1YWwocmV0LmkzMl90aGluZywgNCkKKyAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Olh0cnVjdCwgcmV0KQorICBlbmQKKworICBkZWYgdGVzdF9uZXN0CisgICAgcCAndGVzdF9uZXN0JworICAgIHN0cnVjdDIgPSBUaHJpZnQ6OlRlc3Q6Olh0cnVjdDIubmV3KHsnc3RydWN0X3RoaW5nJyA9PiBnZXRfc3RydWN0LCAnaTMyX3RoaW5nJyA9PiAxMH0pCisKKyAgICByZXQgPSBAY2xpZW50LnRlc3ROZXN0KHN0cnVjdDIpCisKKyAgICAjIFRPRE86IG5vdCBzdXJlIHdoYXQgdW5zcGVjaWZpZWQgImRlZmF1bHQiIHJlcXVpcmVkbmVzcyB2YWx1ZXMgc2hvdWxkIGJlCisgICAgYXNzZXJ0KHJldC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZyA9PSBuaWwgfHwgcmV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nID09IDApCisgICAgYXNzZXJ0KHJldC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nID09IG5pbCB8fCByZXQuc3RydWN0X3RoaW5nLmk2NF90aGluZyA9PSAwKQorCisgICAgYXNzZXJ0X2VxdWFsKHJldC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCAnaGkhJykKKyAgICBhc3NlcnRfZXF1YWwocmV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcsIDQpCisgICAgYXNzZXJ0X2VxdWFsKHJldC5pMzJfdGhpbmcsIDEwKQorCisgICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QsIHJldC5zdHJ1Y3RfdGhpbmcpCisgICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QyLCByZXQpCisgIGVuZAorCisgIGRlZiB0ZXN0X2luc2FuaXR5CisgICAgcCAndGVzdF9pbnNhbml0eScKKyAgICBpbnNhbmUgPSBUaHJpZnQ6OlRlc3Q6Okluc2FuaXR5Lm5ldyh7CisgICAgICAndXNlck1hcCcgPT4geworICAgICAgICBUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6OkZJVkUgPT4gNSwKKyAgICAgICAgVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpFSUdIVCA9PiA4LAorICAgICAgfSwKKyAgICAgICd4dHJ1Y3RzJyA9PiBbCisgICAgICAgIFRocmlmdDo6VGVzdDo6WHRydWN0Lm5ldyh7CisgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ0dvb2RieWU0JywKKyAgICAgICAgICAnYnl0ZV90aGluZycgPT4gNCwKKyAgICAgICAgICAnaTMyX3RoaW5nJyA9PiA0LAorICAgICAgICAgICdpNjRfdGhpbmcnID0+IDQsCisgICAgICAgIH0pLAorICAgICAgICBUaHJpZnQ6OlRlc3Q6Olh0cnVjdC5uZXcoeworICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICdIZWxsbzInLAorICAgICAgICAgICdieXRlX3RoaW5nJyA9PiAyLAorICAgICAgICAgICdpMzJfdGhpbmcnID0+IDIsCisgICAgICAgICAgJ2k2NF90aGluZycgPT4gMiwKKyAgICAgICAgfSkKKyAgICAgIF0KKyAgICB9KQorCisgICAgcmV0ID0gQGNsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5lKQorCisgICAgYXNzZXJ0X2VxdWFsKGluc2FuZSwgcmV0WzFdWzJdKQorICAgIGFzc2VydF9lcXVhbChpbnNhbmUsIHJldFsxXVszXSkKKworICAgIGFzc2VydChyZXRbMl1bNl0udXNlck1hcCA9PSBuaWwgfHwgcmV0WzJdWzZdLnVzZXJNYXAubGVuZ3RoID09IDApCisgICAgYXNzZXJ0KHJldFsyXVs2XS54dHJ1Y3RzID09IG5pbCB8fCByZXRbMl1bNl0ueHRydWN0cy5sZW5ndGggPT0gMCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWFwX21hcAorICAgIHAgJ3Rlc3RfbWFwX21hcCcKKyAgICByZXQgPSBAY2xpZW50LnRlc3RNYXBNYXAoNCkKKyAgICBhc3NlcnRfa2luZF9vZihIYXNoLCByZXQpCisgICAgZXhwZWN0ZWQgPSB7CisgICAgICAtNCA9PiB7CisgICAgICAgIC00ID0+IC00LAorICAgICAgICAtMyA9PiAtMywKKyAgICAgICAgLTIgPT4gLTIsCisgICAgICAgIC0xID0+IC0xLAorICAgICAgfSwKKyAgICAgIDQgPT4geworICAgICAgICA0ID0+IDQsCisgICAgICAgIDMgPT4gMywKKyAgICAgICAgMiA9PiAyLAorICAgICAgICAxID0+IDEsCisgICAgICB9CisgICAgfQorICAgIGFzc2VydF9lcXVhbChleHBlY3RlZCwgcmV0KQorICBlbmQKKworICBkZWYgdGVzdF9tdWx0aQorICAgIHAgJ3Rlc3RfbXVsdGknCisgICAgcmV0ID0gQGNsaWVudC50ZXN0TXVsdGkoNDIsIDQyNDIsIDQyNDI0MiwgezEgPT4gJ2JsYWgnLCAyID0+ICd0aGluZyd9LCBUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6OkVJR0hULCAyNCkKKyAgICBleHBlY3RlZCA9IFRocmlmdDo6VGVzdDo6WHRydWN0Lm5ldyh7CisgICAgICA6c3RyaW5nX3RoaW5nID0+ICdIZWxsbzInLAorICAgICAgOmJ5dGVfdGhpbmcgPT4gICA0MiwKKyAgICAgIDppMzJfdGhpbmcgPT4gICAgNDI0MiwKKyAgICAgIDppNjRfdGhpbmcgPT4gICAgNDI0MjQyCisgICAgfSkKKyAgICBhc3NlcnRfZXF1YWwoZXhwZWN0ZWQsIHJldCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfZXhjZXB0aW9uCisgICAgcCAndGVzdF9leGNlcHRpb24nCisgICAgYXNzZXJ0X3JhaXNlIFRocmlmdDo6VGVzdDo6WGNlcHRpb24gZG8KKyAgICAgIEBjbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKQorICAgIGVuZAorICAgIGJlZ2luCisgICAgICBAY2xpZW50LnRlc3RFeGNlcHRpb24oJ1RFeGNlcHRpb24nKQorICAgIHJlc2N1ZSA9PiBlCisgICAgICBhc3NlcnQgZS5jbGFzcy5hbmNlc3RvcnMuaW5jbHVkZT8oVGhyaWZ0OjpFeGNlcHRpb24pCisgICAgZW5kCisgICAgYXNzZXJ0X25vdGhpbmdfcmFpc2VkIGRvCisgICAgICBAY2xpZW50LnRlc3RFeGNlcHRpb24oJ3Rlc3QnKQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdF9tdWx0aV9leGNlcHRpb24KKyAgICBwICd0ZXN0X211bHRpX2V4Y2VwdGlvbicKKyAgICBhc3NlcnRfcmFpc2UgVGhyaWZ0OjpUZXN0OjpYY2VwdGlvbiBkbworICAgICAgQGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uIiwgInRlc3QgMSIpCisgICAgZW5kCisgICAgYXNzZXJ0X3JhaXNlIFRocmlmdDo6VGVzdDo6WGNlcHRpb24yIGRvCisgICAgICBAY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbigiWGNlcHRpb24yIiwgInRlc3QgMiIpCisgICAgZW5kCisgICAgYXNzZXJ0X2VxdWFsKCBAY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbigiU3VjY2VzcyIsICJ0ZXN0IDMiKS5zdHJpbmdfdGhpbmcsICJ0ZXN0IDMiKQorICBlbmQKKworICBkZWYgdGVzdF9vbmV3YXkKKyAgICBwICd0ZXN0X29uZXdheScKKyAgICB0aW1lMSA9IFRpbWUubm93LnRvX2YKKyAgICBAY2xpZW50LnRlc3RPbmV3YXkoMSkKKyAgICB0aW1lMiA9IFRpbWUubm93LnRvX2YKKyAgICBhc3NlcnRfb3BlcmF0b3IgKHRpbWUyLXRpbWUxKSwgOjwsIDAuMQorICBlbmQKKworZW5kCisKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vVGVzdFNlcnZlci5yYiBiL3Rlc3QvcmIvaW50ZWdyYXRpb24vVGVzdFNlcnZlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43Y2FmNmE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9yYi9pbnRlZ3JhdGlvbi9UZXN0U2VydmVyLnJiCkBAIC0wLDAgKzEsMTg4IEBACisjIS91c3IvYmluL2VudiBydWJ5CisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCiskOi5wdXNoIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnLy4uJworCityZXF1aXJlICd0ZXN0X2hlbHBlcicKK3JlcXVpcmUgJ3RocmlmdCcKK3JlcXVpcmUgJ3RocmlmdF90ZXN0JworcmVxdWlyZSAndGhyaWZ0X3Rlc3RfdHlwZXMnCisKK2NsYXNzIFNpbXBsZUhhbmRsZXIKKyAgWzp0ZXN0Vm9pZCwgOnRlc3RTdHJpbmcsIDp0ZXN0Qm9vbCwgOnRlc3RCeXRlLCA6dGVzdEkzMiwgOnRlc3RJNjQsIDp0ZXN0RG91YmxlLCA6dGVzdEJpbmFyeSwKKyAgIDp0ZXN0U3RydWN0LCA6dGVzdE1hcCwgOnRlc3RTdHJpbmdNYXAsIDp0ZXN0U2V0LCA6dGVzdExpc3QsIDp0ZXN0TmVzdCwgOnRlc3RFbnVtLCA6dGVzdFR5cGVkZWYsCisgICA6dGVzdEVudW0sIDp0ZXN0VHlwZWRlZiwgOnRlc3RNdWx0aUV4Y2VwdGlvbl0uZWFjaCBkbyB8bWV0aHwKKworICAgIGRlZmluZV9tZXRob2QobWV0aCkgZG8gfHRoaW5nfAorICAgICAgcCBtZXRoCisgICAgICBwIHRoaW5nCisgICAgICB0aGluZworICAgIGVuZAorCisgIGVuZAorCisgIGRlZiB0ZXN0Vm9pZCgpCisgIGVuZAorCisgIGRlZiB0ZXN0SW5zYW5pdHkodGhpbmcpCisgICAgcmV0dXJuIHsKKyAgICAgIDEgPT4geworICAgICAgICAyID0+IHRoaW5nLAorICAgICAgICAzID0+IHRoaW5nCisgICAgICB9LAorICAgICAgMiA9PiB7CisgICAgICAgIDYgPT4gVGhyaWZ0OjpUZXN0OjpJbnNhbml0eTo6bmV3KCkKKyAgICAgIH0KKyAgICB9CisgIGVuZAorCisgIGRlZiB0ZXN0TWFwTWFwKHRoaW5nKQorICAgIHJldHVybiB7CisgICAgICAtNCA9PiB7CisgICAgICAgIC00ID0+IC00LAorICAgICAgICAtMyA9PiAtMywKKyAgICAgICAgLTIgPT4gLTIsCisgICAgICAgIC0xID0+IC0xLAorICAgICAgfSwKKyAgICAgIDQgPT4geworICAgICAgICA0ID0+IDQsCisgICAgICAgIDMgPT4gMywKKyAgICAgICAgMiA9PiAyLAorICAgICAgICAxID0+IDEsCisgICAgICB9CisgICAgfQorICBlbmQKKworICBkZWYgdGVzdE11bHRpKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpCisgICAgcmV0dXJuIFRocmlmdDo6VGVzdDo6WHRydWN0Lm5ldyh7CisgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnSGVsbG8yJywKKyAgICAgICdieXRlX3RoaW5nJyA9PiBhcmcwLAorICAgICAgJ2kzMl90aGluZycgPT4gYXJnMSwKKyAgICAgICdpNjRfdGhpbmcnID0+IGFyZzIsCisgICAgfSkKKyAgZW5kCisKKyAgZGVmIHRlc3RFeGNlcHRpb24odGhpbmcpCisgICAgaWYgdGhpbmcgPT0gIlhjZXB0aW9uIgorICAgICAgcmFpc2UgVGhyaWZ0OjpUZXN0OjpYY2VwdGlvbiwgOmVycm9yQ29kZSA9PiAxMDAxLCA6bWVzc2FnZSA9PiB0aGluZworICAgIGVsc2lmIHRoaW5nID09ICJURXhjZXB0aW9uIgorICAgICAgcmFpc2UgVGhyaWZ0OjpFeGNlcHRpb24sIDptZXNzYWdlID0+IHRoaW5nCisgICAgZWxzZQorICAgICAgIyBuby1vcAorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdE11bHRpRXhjZXB0aW9uKGFyZzAsIGFyZzEpCisgICAgaWYgYXJnMCA9PSAiWGNlcHRpb24yIgorICAgICAgcmFpc2UgVGhyaWZ0OjpUZXN0OjpYY2VwdGlvbjIsIDplcnJvckNvZGUgPT4gMjAwMiwgOnN0cnVjdF90aGluZyA9PiA6OlRocmlmdDo6VGVzdDo6WHRydWN0Lm5ldyh7IDpzdHJpbmdfdGhpbmcgPT4gJ1RoaXMgaXMgYW4gWGNlcHRpb24yJyB9KQorICAgIGVsc2lmIGFyZzAgPT0gIlhjZXB0aW9uIgorICAgICAgcmFpc2UgVGhyaWZ0OjpUZXN0OjpYY2VwdGlvbiwgOmVycm9yQ29kZSA9PiAxMDAxLCA6bWVzc2FnZSA9PiAnVGhpcyBpcyBhbiBYY2VwdGlvbicKKyAgICBlbHNlCisgICAgICByZXR1cm4gOjpUaHJpZnQ6OlRlc3Q6Olh0cnVjdC5uZXcoeydzdHJpbmdfdGhpbmcnID0+IGFyZzF9KQorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVzdE9uZXdheShhcmcwKQorICAgIHNsZWVwKGFyZzApCisgIGVuZAorCitlbmQKKworZG9tYWluX3NvY2tldCA9IG5pbAorcG9ydCA9IDkwOTAKK3Byb3RvY29sID0gImJpbmFyeSIKK0Bwcm90b2NvbEZhY3RvcnkgPSBuaWwKK3NzbCA9IGZhbHNlCit0cmFuc3BvcnQgPSAiYnVmZmVyZWQiCitAdHJhbnNwb3J0RmFjdG9yeSA9IG5pbAorCitBUkdWLmVhY2ggZG98YXwKKyAgaWYgYSA9PSAiLS1oZWxwIgorICAgIHB1dHMgIkFsbG93ZWQgb3B0aW9uczoiCisgICAgcHV0cyAiXHQgLWggWyAtLWhlbHAgXSBcdCBwcm9kdWNlIGhlbHAgbWVzc2FnZSIKKyAgICBwdXRzICJcdC0tZG9tYWluLXNvY2tldCBhcmcgKD0pIFx0IFVuaXggZG9tYWluIHNvY2tldCBwYXRoIgorICAgIHB1dHMgIlx0LS1wb3J0IGFyZyAoPTkwOTApIFx0IFBvcnQgbnVtYmVyIHRvIGxpc3RlbiBcdCBub3QgdmFsaWQgd2l0aCBkb21haW4tc29ja2V0IgorICAgIHB1dHMgIlx0LS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpIFx0IHByb3RvY29sOiBhY2NlbCwgYmluYXJ5LCBjb21wYWN0LCBqc29uIgorICAgIHB1dHMgIlx0LS1zc2wgXHQgdXNlIHNzbCBcdCBub3QgdmFsaWQgd2l0aCBkb21haW4tc29ja2V0IgorICAgIHB1dHMgIlx0LS10cmFuc3BvcnQgYXJnICg9YnVmZmVyZWQpIHRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCIKKyAgICBleGl0CisgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0tZG9tYWluLXNvY2tldCIpCisgICAgZG9tYWluX3NvY2tldCA9IGEuc3BsaXQoIj0iKVsxXQorICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLXByb3RvY29sIikKKyAgICBwcm90b2NvbCA9IGEuc3BsaXQoIj0iKVsxXQorICBlbHNpZiBhID09ICItLXNzbCIKKyAgICBzc2wgPSB0cnVlCisgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0tdHJhbnNwb3J0IikKKyAgICB0cmFuc3BvcnQgPSBhLnNwbGl0KCI9IilbMV0KKyAgZWxzaWYgYS5zdGFydF93aXRoPygiLS1wb3J0IikKKyAgICBwb3J0ID0gYS5zcGxpdCgiPSIpWzFdLnRvX2kgCisgIGVuZAorZW5kCisKK2lmIHByb3RvY29sID09ICJiaW5hcnkiIHx8IHByb3RvY29sLnRvX3Muc3RyaXAuZW1wdHk/CisgIEBwcm90b2NvbEZhY3RvcnkgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeS5uZXcKK2Vsc2lmIHByb3RvY29sID09ICJjb21wYWN0IgorICBAcHJvdG9jb2xGYWN0b3J5ID0gVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lm5ldworZWxzaWYgcHJvdG9jb2wgPT0gImpzb24iCisgIEBwcm90b2NvbEZhY3RvcnkgPSBUaHJpZnQ6Okpzb25Qcm90b2NvbEZhY3RvcnkubmV3CitlbHNpZiBwcm90b2NvbCA9PSAiYWNjZWwiCisgIEBwcm90b2NvbEZhY3RvcnkgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5Lm5ldworZWxzZQorICByYWlzZSAnVW5rbm93biBwcm90b2NvbCB0eXBlJworZW5kCisKK2lmIHRyYW5zcG9ydCA9PSAiYnVmZmVyZWQiIHx8IHRyYW5zcG9ydC50b19zLnN0cmlwLmVtcHR5PworICBAdHJhbnNwb3J0RmFjdG9yeSA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldworZWxzaWYgdHJhbnNwb3J0ID09ICJmcmFtZWQiCisgIEB0cmFuc3BvcnRGYWN0b3J5ID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldworZWxzZQorICByYWlzZSAnVW5rbm93biB0cmFuc3BvcnQgdHlwZScKK2VuZAorCitAaGFuZGxlciA9IFNpbXBsZUhhbmRsZXIubmV3CitAcHJvY2Vzc29yID0gVGhyaWZ0OjpUZXN0OjpUaHJpZnRUZXN0OjpQcm9jZXNzb3IubmV3KEBoYW5kbGVyKQorQHRyYW5zcG9ydCA9IG5pbAoraWYgZG9tYWluX3NvY2tldC50b19zLnN0cmlwLmVtcHR5PworICBpZiBzc2wKKyAgICAjIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgcnVieSBjcm9zc3Rlc3QgaXMgdGVzdC9yYi9nZW4tcmIKKyAgICBrZXlzRGlyID0gRmlsZS5qb2luKEZpbGUuZGlybmFtZShGaWxlLmRpcm5hbWUoRGlyLnB3ZCkpLCAia2V5cyIpCisgICAgY3R4ID0gT3BlblNTTDo6U1NMOjpTU0xDb250ZXh0Lm5ldworICAgIGN0eC5jYV9maWxlID0gRmlsZS5qb2luKGtleXNEaXIsICJDQS5wZW0iKQorICAgIGN0eC5jZXJ0ID0gT3BlblNTTDo6WDUwOTo6Q2VydGlmaWNhdGUubmV3KEZpbGUub3BlbihGaWxlLmpvaW4oa2V5c0RpciwgInNlcnZlci5jcnQiKSkpCisgICAgY3R4LmNlcnRfc3RvcmUgPSBPcGVuU1NMOjpYNTA5OjpTdG9yZS5uZXcKKyAgICBjdHguY2VydF9zdG9yZS5hZGRfZmlsZShGaWxlLmpvaW4oa2V5c0RpciwgJ2NsaWVudC5wZW0nKSkKKyAgICBjdHgua2V5ID0gT3BlblNTTDo6UEtleTo6UlNBLm5ldyhGaWxlLm9wZW4oRmlsZS5qb2luKGtleXNEaXIsICJzZXJ2ZXIua2V5IikpKQorICAgIGN0eC5vcHRpb25zID0gT3BlblNTTDo6U1NMOjpPUF9OT19TU0x2MiB8IE9wZW5TU0w6OlNTTDo6T1BfTk9fU1NMdjMKKyAgICBjdHguc3NsX3ZlcnNpb24gPSA6U1NMdjIzCisgICAgY3R4LnZlcmlmeV9tb2RlID0gT3BlblNTTDo6U1NMOjpWRVJJRllfUEVFUgorICAgIEB0cmFuc3BvcnQgPSBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldC5uZXcobmlsLCBwb3J0LCBjdHgpCisgIGVsc2UKKyAgICBAdHJhbnNwb3J0ID0gVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQubmV3KHBvcnQpCisgIGVuZAorZWxzZQorICBAdHJhbnNwb3J0ID0gVGhyaWZ0OjpVTklYU2VydmVyU29ja2V0Lm5ldyhkb21haW5fc29ja2V0KQorZW5kCisKK0BzZXJ2ZXIgPSBUaHJpZnQ6OlRocmVhZGVkU2VydmVyLm5ldyhAcHJvY2Vzc29yLCBAdHJhbnNwb3J0LCBAdHJhbnNwb3J0RmFjdG9yeSwgQHByb3RvY29sRmFjdG9yeSkKKworcHV0cyAiU3RhcnRpbmcgVGVzdFNlcnZlciAje0BzZXJ2ZXIudG9fc30iCitAc2VydmVyLnNlcnZlCitwdXRzICJkb25lLiIKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vYWNjZWxlcmF0ZWRfYnVmZmVyZWRfY2xpZW50LnJiIGIvdGVzdC9yYi9pbnRlZ3JhdGlvbi9hY2NlbGVyYXRlZF9idWZmZXJlZF9jbGllbnQucmIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZWMxZGYuLjAwMDAwMDAKLS0tIGEvdGVzdC9yYi9pbnRlZ3JhdGlvbi9hY2NlbGVyYXRlZF9idWZmZXJlZF9jbGllbnQucmIKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLXJlcXVpcmUgRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICcuLi90ZXN0X2hlbHBlcicpCi0KLXJlcXVpcmUgJ3RocmlmdCcKLXJlcXVpcmUgJ1RocmlmdFRlc3QnCi0KLWNsYXNzIEFjY2VsZXJhdGVkQnVmZmVyZWRDbGllbnRUZXN0IDwgVGVzdDo6VW5pdDo6VGVzdENhc2UKLSAgZGVmIHNldHVwCi0gICAgdW5sZXNzIEBzb2NrZXQKLSAgICAgIEBzb2NrZXQgICA9IFRocmlmdDo6U29ja2V0Lm5ldygnbG9jYWxob3N0JywgOTA5MCkKLSAgICAgIEBwcm90b2NvbCA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5uZXcoVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcoQHNvY2tldCkpCi0gICAgICBAY2xpZW50ICAgPSBUaHJpZnQ6OlRlc3Q6OlRocmlmdFRlc3Q6OkNsaWVudC5uZXcoQHByb3RvY29sKQotICAgICAgQHNvY2tldC5vcGVuCi0gICAgZW5kCi0gIGVuZAotICAKLSAgZGVmIHRlc3Rfc3RyaW5nCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdFN0cmluZygnc3RyaW5nJyksICdzdHJpbmcnKQotICBlbmQKLQotICBkZWYgdGVzdF9ieXRlCi0gICAgdmFsID0gOAotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RCeXRlKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0Qnl0ZSgtdmFsKSwgLXZhbCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfaTMyCi0gICAgdmFsID0gMzIKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STMyKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STMyKC12YWwpLCAtdmFsKQotICBlbmQKLQotICBkZWYgdGVzdF9pNjQKLSAgICB2YWwgPSA2NAotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJNjQodmFsKSwgdmFsKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJNjQoLXZhbCksIC12YWwpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2RvdWJsZQotICAgIHZhbCA9IDMuMTQKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0RG91YmxlKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0RG91YmxlKC12YWwpLCAtdmFsKQotICAgIGFzc2VydF9raW5kX29mKEZsb2F0LCBAY2xpZW50LnRlc3REb3VibGUodmFsKSkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfbWFwCi0gICAgdmFsID0gezEgPT4gMSwgMiA9PiAyLCAzID0+IDN9Ci0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdE1hcCh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2tpbmRfb2YoSGFzaCwgQGNsaWVudC50ZXN0TWFwKHZhbCkpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2xpc3QKLSAgICB2YWwgPSBbMSwyLDMsNCw1XQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RMaXN0KHZhbCksIHZhbCkKLSAgICBhc3NlcnRfa2luZF9vZihBcnJheSwgQGNsaWVudC50ZXN0TGlzdCh2YWwpKQotICBlbmQKLQotICBkZWYgdGVzdF9lbnVtCi0gICAgdmFsID0gVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpTSVgKLSAgICByZXQgPSBAY2xpZW50LnRlc3RFbnVtKHZhbCkKLQotICAgIGFzc2VydF9lcXVhbChyZXQsIDYpCi0gICAgYXNzZXJ0X2tpbmRfb2YoRml4bnVtLCByZXQpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X3R5cGVkZWYKLSAgICAjVXNlcklkICB0ZXN0VHlwZWRlZigxOiBVc2VySWQgdGhpbmcpLAotICAgIHRydWUKLSAgZW5kCi0KLSAgZGVmIHRlc3Rfc2V0Ci0gICAgdmFsID0gU2V0Lm5ldyhbMSwyLDNdKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RTZXQodmFsKSwgdmFsKQotICAgIGFzc2VydF9raW5kX29mKFNldCwgQGNsaWVudC50ZXN0U2V0KHZhbCkpCi0gIGVuZAotCi0gIGRlZiBnZXRfc3RydWN0Ci0gICAgVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QubmV3KHsnc3RyaW5nX3RoaW5nJyA9PiAnaGkhJywgJ2kzMl90aGluZycgPT4gNCB9KQotICBlbmQKLQotICBkZWYgdGVzdF9zdHJ1Y3QKLSAgICByZXQgPSBAY2xpZW50LnRlc3RTdHJ1Y3QoZ2V0X3N0cnVjdCkKLQotICAgIGFzc2VydF9uaWwocmV0LmJ5dGVfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfbmlsKHJldC5pNjRfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfZXF1YWwocmV0LnN0cmluZ190aGluZywgJ2hpIScpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5pMzJfdGhpbmcsIDQpCi0gICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QsIHJldCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfbmVzdAotICAgIHN0cnVjdDIgPSBUaHJpZnQ6OlRlc3Q6Olh0cnVjdDIubmV3KHsnc3RydWN0X3RoaW5nJyA9PiBnZXRfc3RydWN0LCAnaTMyX3RoaW5nJyA9PiAxMH0pCi0KLSAgICByZXQgPSBAY2xpZW50LnRlc3ROZXN0KHN0cnVjdDIpCi0KLSAgICBhc3NlcnRfbmlsKHJldC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZywgbmlsKQotICAgIGFzc2VydF9uaWwocmV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfZXF1YWwocmV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsICdoaSEnKQotICAgIGFzc2VydF9lcXVhbChyZXQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgNCkKLSAgICBhc3NlcnRfZXF1YWwocmV0LmkzMl90aGluZywgMTApCi0KLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Olh0cnVjdCwgcmV0LnN0cnVjdF90aGluZykKLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Olh0cnVjdDIsIHJldCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfaW5zYW5lCi0gICAgaW5zYW5lID0gVGhyaWZ0OjpUZXN0OjpJbnNhbml0eS5uZXcoewotICAgICAgJ3VzZXJNYXAnID0+IHsgVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpPTkUgPT4gNDQgfSwKLSAgICAgICd4dHJ1Y3RzJyA9PiBbZ2V0X3N0cnVjdCwKLSAgICAgICAgVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QubmV3KHsKLSAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnaGkgYWdhaW4nLAotICAgICAgICAgICdpMzJfdGhpbmcnID0+IDEyCi0gICAgICAgIH0pCi0gICAgICBdCi0gICAgfSkKLQotICAgIHJldCA9IEBjbGllbnQudGVzdEluc2FuaXR5KGluc2FuZSkKLQotICAgIGFzc2VydF9ub3RfbmlsKHJldFs0NF0pCi0gICAgYXNzZXJ0X25vdF9uaWwocmV0WzQ0XVsxXSkKLQotICAgIHN0cnVjdCA9IHJldFs0NF1bMV0KLQotICAgIGFzc2VydF9lcXVhbChzdHJ1Y3QudXNlck1hcFtUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6Ok9ORV0sIDQ0KQotICAgIGFzc2VydF9lcXVhbChzdHJ1Y3QueHRydWN0c1sxXS5zdHJpbmdfdGhpbmcsICdoaSBhZ2FpbicpCi0gICAgYXNzZXJ0X2VxdWFsKHN0cnVjdC54dHJ1Y3RzWzFdLmkzMl90aGluZywgMTIpCi0KLSAgICBhc3NlcnRfa2luZF9vZihIYXNoLCBzdHJ1Y3QudXNlck1hcCkKLSAgICBhc3NlcnRfa2luZF9vZihBcnJheSwgc3RydWN0Lnh0cnVjdHMpCi0gICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpJbnNhbml0eSwgc3RydWN0KQotICBlbmQKLQotICBkZWYgdGVzdF9tYXBfbWFwCi0gICAgcmV0ID0gQGNsaWVudC50ZXN0TWFwTWFwKDQpCi0gICAgYXNzZXJ0X2tpbmRfb2YoSGFzaCwgcmV0KQotICAgIGFzc2VydF9lcXVhbChyZXQsIHsgNCA9PiB7IDQgPT4gNH19KQotICBlbmQKLQotICBkZWYgdGVzdF9leGNlcHRpb24KLSAgICBhc3NlcnRfcmFpc2UgVGhyaWZ0OjpUZXN0OjpYY2VwdGlvbiBkbwotICAgICAgQGNsaWVudC50ZXN0RXhjZXB0aW9uKCdmb28nKQotICAgIGVuZAotICBlbmQKLWVuZAotCmRpZmYgLS1naXQgYS90ZXN0L3JiL2ludGVncmF0aW9uL2FjY2VsZXJhdGVkX2J1ZmZlcmVkX3NlcnZlci5yYiBiL3Rlc3QvcmIvaW50ZWdyYXRpb24vYWNjZWxlcmF0ZWRfYnVmZmVyZWRfc2VydmVyLnJiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2E2NmU1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vYWNjZWxlcmF0ZWRfYnVmZmVyZWRfc2VydmVyLnJiCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSQ6LnB1c2ggRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvLi4vZ2VuLXJiJwotJDoucHVzaCBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgJy4uLy4uLy4uL2xpYi9yYi9saWInKQotJDoucHVzaCBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgJy4uLy4uLy4uL2xpYi9yYi9leHQnKQotCi1yZXF1aXJlICd0aHJpZnQnCi1yZXF1aXJlICdUaHJpZnRUZXN0JwotCi1jbGFzcyBTaW1wbGVIYW5kbGVyCi0gIFs6dGVzdFN0cmluZywgOnRlc3RCeXRlLCA6dGVzdEkzMiwgOnRlc3RJNjQsIDp0ZXN0RG91YmxlLAotICAgOnRlc3RTdHJ1Y3QsIDp0ZXN0TWFwLCA6dGVzdFNldCwgOnRlc3RMaXN0LCA6dGVzdE5lc3QsCi0gICA6dGVzdEVudW0sIDp0ZXN0VHlwZWRlZl0uZWFjaCBkbyB8bWV0aHwKLQotICAgIGRlZmluZV9tZXRob2QobWV0aCkgZG8gfHRoaW5nfAotICAgICAgdGhpbmcKLSAgICBlbmQKLQotICBlbmQKLQotICBkZWYgdGVzdEluc2FuaXR5KHRoaW5nKQotICAgIG51bSwgdWlkID0gdGhpbmcudXNlck1hcC5maW5kIHsgdHJ1ZSB9Ci0gICAgcmV0dXJuIHt1aWQgPT4ge251bSA9PiB0aGluZ319Ci0gIGVuZAotCi0gIGRlZiB0ZXN0TWFwTWFwKHRoaW5nKQotICAgIHJldHVybiB7dGhpbmcgPT4ge3RoaW5nID0+IHRoaW5nfX0KLSAgZW5kCi0KLSAgZGVmIHRlc3RFbnVtKHRoaW5nKQotICAgIHJldHVybiB0aGluZwotICBlbmQKLQotICBkZWYgdGVzdFR5cGVkZWYodGhpbmcpCi0gICAgcmV0dXJuIHRoaW5nCi0gIGVuZAotCi0gIGRlZiB0ZXN0RXhjZXB0aW9uKHRoaW5nKQotICAgIHJhaXNlIFRocmlmdDo6VGVzdDo6WGNlcHRpb24sIDptZXNzYWdlID0+ICdlcnJvcicKLSAgZW5kCi1lbmQKLQotQGhhbmRsZXIgICA9IFNpbXBsZUhhbmRsZXIubmV3Ci1AcHJvY2Vzc29yID0gVGhyaWZ0OjpUZXN0OjpUaHJpZnRUZXN0OjpQcm9jZXNzb3IubmV3KEBoYW5kbGVyKQotQHRyYW5zcG9ydCA9IFRocmlmdDo6U2VydmVyU29ja2V0Lm5ldyg5MDkwKQotQHNlcnZlciAgICA9IFRocmlmdDo6VGhyZWFkZWRTZXJ2ZXIubmV3KEBwcm9jZXNzb3IsIEB0cmFuc3BvcnQsIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldywgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeS5uZXcpCi0KLUBzZXJ2ZXIuc2VydmUKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vYnVmZmVyZWRfY2xpZW50LnJiIGIvdGVzdC9yYi9pbnRlZ3JhdGlvbi9idWZmZXJlZF9jbGllbnQucmIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhOTI1Y2MuLjAwMDAwMDAKLS0tIGEvdGVzdC9yYi9pbnRlZ3JhdGlvbi9idWZmZXJlZF9jbGllbnQucmIKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLXJlcXVpcmUgRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICcuLi90ZXN0X2hlbHBlcicpCi0KLXJlcXVpcmUgJ3RocmlmdCcKLXJlcXVpcmUgJ1RocmlmdFRlc3QnCi0KLWNsYXNzIEJ1ZmZlcmVkQ2xpZW50VGVzdCA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCi0gIGRlZiBzZXR1cAotICAgIHVubGVzcyBAc29ja2V0Ci0gICAgICBAc29ja2V0ICAgPSBUaHJpZnQ6OlNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDkwOTApCi0gICAgICBAcHJvdG9jb2wgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLm5ldyhUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyhAc29ja2V0KSkKLSAgICAgIEBjbGllbnQgICA9IFRocmlmdDo6VGVzdDo6VGhyaWZ0VGVzdDo6Q2xpZW50Lm5ldyhAcHJvdG9jb2wpCi0gICAgICBAc29ja2V0Lm9wZW4KLSAgICBlbmQKLSAgZW5kCi0gIAotICBkZWYgdGVzdF9zdHJpbmcKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0U3RyaW5nKCdzdHJpbmcnKSwgJ3N0cmluZycpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2J5dGUKLSAgICB2YWwgPSA4Ci0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEJ5dGUodmFsKSwgdmFsKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RCeXRlKC12YWwpLCAtdmFsKQotICBlbmQKLQotICBkZWYgdGVzdF9pMzIKLSAgICB2YWwgPSAzMgotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJMzIodmFsKSwgdmFsKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJMzIoLXZhbCksIC12YWwpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2k2NAotICAgIHZhbCA9IDY0Ci0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEk2NCh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEk2NCgtdmFsKSwgLXZhbCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfZG91YmxlCi0gICAgdmFsID0gMy4xNAotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3REb3VibGUodmFsKSwgdmFsKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3REb3VibGUoLXZhbCksIC12YWwpCi0gICAgYXNzZXJ0X2tpbmRfb2YoRmxvYXQsIEBjbGllbnQudGVzdERvdWJsZSh2YWwpKQotICBlbmQKLQotICBkZWYgdGVzdF9tYXAKLSAgICB2YWwgPSB7MSA9PiAxLCAyID0+IDIsIDMgPT4gM30KLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0TWFwKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfa2luZF9vZihIYXNoLCBAY2xpZW50LnRlc3RNYXAodmFsKSkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfbGlzdAotICAgIHZhbCA9IFsxLDIsMyw0LDVdCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdExpc3QodmFsKSwgdmFsKQotICAgIGFzc2VydF9raW5kX29mKEFycmF5LCBAY2xpZW50LnRlc3RMaXN0KHZhbCkpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2VudW0KLSAgICB2YWwgPSBUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6OlNJWAotICAgIHJldCA9IEBjbGllbnQudGVzdEVudW0odmFsKQotCi0gICAgYXNzZXJ0X2VxdWFsKHJldCwgNikKLSAgICBhc3NlcnRfa2luZF9vZihGaXhudW0sIHJldCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfdHlwZWRlZgotICAgICNVc2VySWQgIHRlc3RUeXBlZGVmKDE6IFVzZXJJZCB0aGluZyksCi0gICAgdHJ1ZQotICBlbmQKLQotICBkZWYgdGVzdF9zZXQKLSAgICB2YWwgPSBTZXQubmV3KFsxLDIsM10pCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdFNldCh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2tpbmRfb2YoU2V0LCBAY2xpZW50LnRlc3RTZXQodmFsKSkKLSAgZW5kCi0KLSAgZGVmIGdldF9zdHJ1Y3QKLSAgICBUaHJpZnQ6OlRlc3Q6Olh0cnVjdC5uZXcoeydzdHJpbmdfdGhpbmcnID0+ICdoaSEnLCAnaTMyX3RoaW5nJyA9PiA0IH0pCi0gIGVuZAotCi0gIGRlZiB0ZXN0X3N0cnVjdAotICAgIHJldCA9IEBjbGllbnQudGVzdFN0cnVjdChnZXRfc3RydWN0KQotCi0gICAgYXNzZXJ0X25pbChyZXQuYnl0ZV90aGluZywgbmlsKQotICAgIGFzc2VydF9uaWwocmV0Lmk2NF90aGluZywgbmlsKQotICAgIGFzc2VydF9lcXVhbChyZXQuc3RyaW5nX3RoaW5nLCAnaGkhJykKLSAgICBhc3NlcnRfZXF1YWwocmV0LmkzMl90aGluZywgNCkKLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Olh0cnVjdCwgcmV0KQotICBlbmQKLQotICBkZWYgdGVzdF9uZXN0Ci0gICAgc3RydWN0MiA9IFRocmlmdDo6VGVzdDo6WHRydWN0Mi5uZXcoeydzdHJ1Y3RfdGhpbmcnID0+IGdldF9zdHJ1Y3QsICdpMzJfdGhpbmcnID0+IDEwfSkKLQotICAgIHJldCA9IEBjbGllbnQudGVzdE5lc3Qoc3RydWN0MikKLQotICAgIGFzc2VydF9uaWwocmV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuaWwpCi0gICAgYXNzZXJ0X25pbChyZXQuc3RydWN0X3RoaW5nLmk2NF90aGluZywgbmlsKQotICAgIGFzc2VydF9lcXVhbChyZXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgJ2hpIScpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCA0KQotICAgIGFzc2VydF9lcXVhbChyZXQuaTMyX3RoaW5nLCAxMCkKLQotICAgIGFzc2VydF9raW5kX29mKFRocmlmdDo6VGVzdDo6WHRydWN0LCByZXQuc3RydWN0X3RoaW5nKQotICAgIGFzc2VydF9raW5kX29mKFRocmlmdDo6VGVzdDo6WHRydWN0MiwgcmV0KQotICBlbmQKLQotICBkZWYgdGVzdF9pbnNhbmUKLSAgICBpbnNhbmUgPSBUaHJpZnQ6OlRlc3Q6Okluc2FuaXR5Lm5ldyh7Ci0gICAgICAndXNlck1hcCcgPT4geyBUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6Ok9ORSA9PiA0NCB9LAotICAgICAgJ3h0cnVjdHMnID0+IFtnZXRfc3RydWN0LAotICAgICAgICBUaHJpZnQ6OlRlc3Q6Olh0cnVjdC5uZXcoewotICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICdoaSBhZ2FpbicsCi0gICAgICAgICAgJ2kzMl90aGluZycgPT4gMTIKLSAgICAgICAgfSkKLSAgICAgIF0KLSAgICB9KQotCi0gICAgcmV0ID0gQGNsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5lKQotCi0gICAgYXNzZXJ0X25vdF9uaWwocmV0WzQ0XSkKLSAgICBhc3NlcnRfbm90X25pbChyZXRbNDRdWzFdKQotCi0gICAgc3RydWN0ID0gcmV0WzQ0XVsxXQotCi0gICAgYXNzZXJ0X2VxdWFsKHN0cnVjdC51c2VyTWFwW1RocmlmdDo6VGVzdDo6TnVtYmVyejo6T05FXSwgNDQpCi0gICAgYXNzZXJ0X2VxdWFsKHN0cnVjdC54dHJ1Y3RzWzFdLnN0cmluZ190aGluZywgJ2hpIGFnYWluJykKLSAgICBhc3NlcnRfZXF1YWwoc3RydWN0Lnh0cnVjdHNbMV0uaTMyX3RoaW5nLCAxMikKLQotICAgIGFzc2VydF9raW5kX29mKEhhc2gsIHN0cnVjdC51c2VyTWFwKQotICAgIGFzc2VydF9raW5kX29mKEFycmF5LCBzdHJ1Y3QueHRydWN0cykKLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Okluc2FuaXR5LCBzdHJ1Y3QpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X21hcF9tYXAKLSAgICByZXQgPSBAY2xpZW50LnRlc3RNYXBNYXAoNCkKLSAgICBhc3NlcnRfa2luZF9vZihIYXNoLCByZXQpCi0gICAgYXNzZXJ0X2VxdWFsKHJldCwgeyA0ID0+IHsgNCA9PiA0fX0pCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2V4Y2VwdGlvbgotICAgIGFzc2VydF9yYWlzZSBUaHJpZnQ6OlRlc3Q6OlhjZXB0aW9uIGRvCi0gICAgICBAY2xpZW50LnRlc3RFeGNlcHRpb24oJ2ZvbycpCi0gICAgZW5kCi0gIGVuZAotZW5kCi0KZGlmZiAtLWdpdCBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vc2ltcGxlX2NsaWVudC5yYiBiL3Rlc3QvcmIvaW50ZWdyYXRpb24vc2ltcGxlX2NsaWVudC5yYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA2NDgyMi4uMDAwMDAwMAotLS0gYS90ZXN0L3JiL2ludGVncmF0aW9uL3NpbXBsZV9jbGllbnQucmIKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLXJlcXVpcmUgRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICcuLi90ZXN0X2hlbHBlcicpCi0KLXJlcXVpcmUgJ3RocmlmdCcKLXJlcXVpcmUgJ1RocmlmdFRlc3QnCi0KLWNsYXNzIFNpbXBsZUNsaWVudFRlc3QgPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQotICBkZWYgc2V0dXAgICAgCi0gICAgdW5sZXNzIEBzb2NrZXQKLSAgICAgIEBzb2NrZXQgICA9IFRocmlmdDo6U29ja2V0Lm5ldygnbG9jYWxob3N0JywgOTA5MCkKLSAgICAgIEBwcm90b2NvbCA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2wubmV3KEBzb2NrZXQpCi0gICAgICBAY2xpZW50ICAgPSBUaHJpZnQ6OlRlc3Q6OlRocmlmdFRlc3Q6OkNsaWVudC5uZXcoQHByb3RvY29sKQotICAgICAgQHNvY2tldC5vcGVuCi0gICAgZW5kCi0gIGVuZAotICAKLSAgZGVmIHRlc3Rfc3RyaW5nCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdFN0cmluZygnc3RyaW5nJyksICdzdHJpbmcnKQotICBlbmQKLQotICBkZWYgdGVzdF9ieXRlCi0gICAgdmFsID0gOAotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RCeXRlKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0Qnl0ZSgtdmFsKSwgLXZhbCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfaTMyCi0gICAgdmFsID0gMzIKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STMyKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STMyKC12YWwpLCAtdmFsKQotICBlbmQKLQotICBkZWYgdGVzdF9pNjQKLSAgICB2YWwgPSA2NAotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJNjQodmFsKSwgdmFsKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJNjQoLXZhbCksIC12YWwpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2RvdWJsZQotICAgIHZhbCA9IDMuMTQKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0RG91YmxlKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0RG91YmxlKC12YWwpLCAtdmFsKQotICAgIGFzc2VydF9raW5kX29mKEZsb2F0LCBAY2xpZW50LnRlc3REb3VibGUodmFsKSkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfbWFwCi0gICAgdmFsID0gezEgPT4gMSwgMiA9PiAyLCAzID0+IDN9Ci0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdE1hcCh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2tpbmRfb2YoSGFzaCwgQGNsaWVudC50ZXN0TWFwKHZhbCkpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2xpc3QKLSAgICB2YWwgPSBbMSwyLDMsNCw1XQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RMaXN0KHZhbCksIHZhbCkKLSAgICBhc3NlcnRfa2luZF9vZihBcnJheSwgQGNsaWVudC50ZXN0TGlzdCh2YWwpKQotICBlbmQKLQotICBkZWYgdGVzdF9lbnVtCi0gICAgdmFsID0gVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpTSVgKLSAgICByZXQgPSBAY2xpZW50LnRlc3RFbnVtKHZhbCkKLQotICAgIGFzc2VydF9lcXVhbChyZXQsIDYpCi0gICAgYXNzZXJ0X2tpbmRfb2YoRml4bnVtLCByZXQpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X3R5cGVkZWYKLSAgICAjVXNlcklkICB0ZXN0VHlwZWRlZigxOiBVc2VySWQgdGhpbmcpLAotICAgIHRydWUKLSAgZW5kCi0KLSAgZGVmIHRlc3Rfc2V0Ci0gICAgdmFsID0gU2V0Lm5ldyhbMSwyLDNdKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RTZXQodmFsKSwgdmFsKQotICAgIGFzc2VydF9raW5kX29mKFNldCwgQGNsaWVudC50ZXN0U2V0KHZhbCkpCi0gIGVuZAotCi0gIGRlZiBnZXRfc3RydWN0Ci0gICAgVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QubmV3KHsnc3RyaW5nX3RoaW5nJyA9PiAnaGkhJywgJ2kzMl90aGluZycgPT4gNCB9KQotICBlbmQKLQotICBkZWYgdGVzdF9zdHJ1Y3QKLSAgICByZXQgPSBAY2xpZW50LnRlc3RTdHJ1Y3QoZ2V0X3N0cnVjdCkKLQotICAgIGFzc2VydF9uaWwocmV0LmJ5dGVfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfbmlsKHJldC5pNjRfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfZXF1YWwocmV0LnN0cmluZ190aGluZywgJ2hpIScpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5pMzJfdGhpbmcsIDQpCi0gICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QsIHJldCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfbmVzdAotICAgIHN0cnVjdDIgPSBUaHJpZnQ6OlRlc3Q6Olh0cnVjdDIubmV3KHsnc3RydWN0X3RoaW5nJyA9PiBnZXRfc3RydWN0LCAnaTMyX3RoaW5nJyA9PiAxMH0pCi0KLSAgICByZXQgPSBAY2xpZW50LnRlc3ROZXN0KHN0cnVjdDIpCi0KLSAgICBhc3NlcnRfbmlsKHJldC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZywgbmlsKQotICAgIGFzc2VydF9uaWwocmV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfZXF1YWwocmV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsICdoaSEnKQotICAgIGFzc2VydF9lcXVhbChyZXQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgNCkKLSAgICBhc3NlcnRfZXF1YWwocmV0LmkzMl90aGluZywgMTApCi0KLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Olh0cnVjdCwgcmV0LnN0cnVjdF90aGluZykKLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Olh0cnVjdDIsIHJldCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfaW5zYW5lCi0gICAgaW5zYW5lID0gVGhyaWZ0OjpUZXN0OjpJbnNhbml0eS5uZXcoewotICAgICAgJ3VzZXJNYXAnID0+IHsgVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpPTkUgPT4gNDQgfSwKLSAgICAgICd4dHJ1Y3RzJyA9PiBbZ2V0X3N0cnVjdCwKLSAgICAgICAgVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QubmV3KHsKLSAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnaGkgYWdhaW4nLAotICAgICAgICAgICdpMzJfdGhpbmcnID0+IDEyCi0gICAgICAgIH0pCi0gICAgICBdCi0gICAgfSkKLQotICAgIHJldCA9IEBjbGllbnQudGVzdEluc2FuaXR5KGluc2FuZSkKLQotICAgIGFzc2VydF9ub3RfbmlsKHJldFs0NF0pCi0gICAgYXNzZXJ0X25vdF9uaWwocmV0WzQ0XVsxXSkKLQotICAgIHN0cnVjdCA9IHJldFs0NF1bMV0KLQotICAgIGFzc2VydF9lcXVhbChzdHJ1Y3QudXNlck1hcFtUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6Ok9ORV0sIDQ0KQotICAgIGFzc2VydF9lcXVhbChzdHJ1Y3QueHRydWN0c1sxXS5zdHJpbmdfdGhpbmcsICdoaSBhZ2FpbicpCi0gICAgYXNzZXJ0X2VxdWFsKHN0cnVjdC54dHJ1Y3RzWzFdLmkzMl90aGluZywgMTIpCi0KLSAgICBhc3NlcnRfa2luZF9vZihIYXNoLCBzdHJ1Y3QudXNlck1hcCkKLSAgICBhc3NlcnRfa2luZF9vZihBcnJheSwgc3RydWN0Lnh0cnVjdHMpCi0gICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpJbnNhbml0eSwgc3RydWN0KQotICBlbmQKLQotICBkZWYgdGVzdF9tYXBfbWFwCi0gICAgcmV0ID0gQGNsaWVudC50ZXN0TWFwTWFwKDQpCi0gICAgYXNzZXJ0X2tpbmRfb2YoSGFzaCwgcmV0KQotICAgIGFzc2VydF9lcXVhbChyZXQsIHsgNCA9PiB7IDQgPT4gNH19KQotICBlbmQKLQotICBkZWYgdGVzdF9leGNlcHRpb24KLSAgICBhc3NlcnRfcmFpc2UgVGhyaWZ0OjpUZXN0OjpYY2VwdGlvbiBkbwotICAgICAgQGNsaWVudC50ZXN0RXhjZXB0aW9uKCdmb28nKQotICAgIGVuZAotICBlbmQKLWVuZAotCmRpZmYgLS1naXQgYS90ZXN0L3JiL2ludGVncmF0aW9uL3NpbXBsZV9zZXJ2ZXIucmIgYi90ZXN0L3JiL2ludGVncmF0aW9uL3NpbXBsZV9zZXJ2ZXIucmIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MThkMmUuLjAwMDAwMDAKLS0tIGEvdGVzdC9yYi9pbnRlZ3JhdGlvbi9zaW1wbGVfc2VydmVyLnJiCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSQ6LnB1c2ggRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvLi4vZ2VuLXJiJwotJDoucHVzaCBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgJy4uLy4uLy4uL2xpYi9yYi9saWInKQotCi1yZXF1aXJlICd0aHJpZnQnCi1yZXF1aXJlICdUaHJpZnRUZXN0JwotCi1jbGFzcyBTaW1wbGVIYW5kbGVyCi0gIFs6dGVzdFN0cmluZywgOnRlc3RCeXRlLCA6dGVzdEkzMiwgOnRlc3RJNjQsIDp0ZXN0RG91YmxlLAotICAgOnRlc3RTdHJ1Y3QsIDp0ZXN0TWFwLCA6dGVzdFNldCwgOnRlc3RMaXN0LCA6dGVzdE5lc3QsCi0gICA6dGVzdEVudW0sIDp0ZXN0VHlwZWRlZl0uZWFjaCBkbyB8bWV0aHwKLQotICAgIGRlZmluZV9tZXRob2QobWV0aCkgZG8gfHRoaW5nfAotICAgICAgdGhpbmcKLSAgICBlbmQKLQotICBlbmQKLQotICBkZWYgdGVzdEluc2FuaXR5KHRoaW5nKQotICAgIG51bSwgdWlkID0gdGhpbmcudXNlck1hcC5maW5kIHsgdHJ1ZSB9Ci0gICAgcmV0dXJuIHt1aWQgPT4ge251bSA9PiB0aGluZ319Ci0gIGVuZAotCi0gIGRlZiB0ZXN0TWFwTWFwKHRoaW5nKQotICAgIHJldHVybiB7dGhpbmcgPT4ge3RoaW5nID0+IHRoaW5nfX0KLSAgZW5kCi0KLSAgZGVmIHRlc3RFbnVtKHRoaW5nKQotICAgIHJldHVybiB0aGluZwotICBlbmQKLQotICBkZWYgdGVzdFR5cGVkZWYodGhpbmcpCi0gICAgcmV0dXJuIHRoaW5nCi0gIGVuZAotCi0gIGRlZiB0ZXN0RXhjZXB0aW9uKHRoaW5nKQotICAgIHJhaXNlIFRocmlmdDo6VGVzdDo6WGNlcHRpb24sIDptZXNzYWdlID0+ICdlcnJvcicKLSAgZW5kCi1lbmQKLQotQGhhbmRsZXIgICA9IFNpbXBsZUhhbmRsZXIubmV3Ci1AcHJvY2Vzc29yID0gVGhyaWZ0OjpUZXN0OjpUaHJpZnRUZXN0OjpQcm9jZXNzb3IubmV3KEBoYW5kbGVyKQotQHRyYW5zcG9ydCA9IFRocmlmdDo6U2VydmVyU29ja2V0Lm5ldyg5MDkwKQotQHNlcnZlciAgICA9IFRocmlmdDo6VGhyZWFkZWRTZXJ2ZXIubmV3KEBwcm9jZXNzb3IsIEB0cmFuc3BvcnQpCi0KLUBzZXJ2ZXIuc2VydmUKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vdGVzdF9zaW1wbGVfaGFuZGxlci5yYiBiL3Rlc3QvcmIvaW50ZWdyYXRpb24vdGVzdF9zaW1wbGVfaGFuZGxlci5yYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0YWE3ZS4uMDAwMDAwMAotLS0gYS90ZXN0L3JiL2ludGVncmF0aW9uL3Rlc3Rfc2ltcGxlX2hhbmRsZXIucmIKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLXJlcXVpcmUgRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICcuLi90ZXN0X2hlbHBlcicpCi0KLXJlcXVpcmUgJ3RocmlmdCcKLXJlcXVpcmUgJ1RocmlmdFRlc3QnCi0KLWNsYXNzIFRlc3RIYW5kbGVyCi0gIFs6dGVzdFN0cmluZywgOnRlc3RCeXRlLCA6dGVzdEkzMiwgOnRlc3RJNjQsIDp0ZXN0RG91YmxlLAotICAgOnRlc3RTdHJ1Y3QsIDp0ZXN0TWFwLCA6dGVzdFNldCwgOnRlc3RMaXN0LCA6dGVzdE5lc3QsCi0gICA6dGVzdEVudW0sIDp0ZXN0VHlwZWRlZl0uZWFjaCBkbyB8bWV0aHwKLQotICAgIGRlZmluZV9tZXRob2QobWV0aCkgZG8gfHRoaW5nfAotICAgICAgdGhpbmcKLSAgICBlbmQKLQotICBlbmQKLQotICBkZWYgdGVzdEluc2FuaXR5KHRoaW5nKQotICAgIG51bSwgdWlkID0gdGhpbmcudXNlck1hcC5maW5kIHsgdHJ1ZSB9Ci0gICAgcmV0dXJuIHt1aWQgPT4ge251bSA9PiB0aGluZ319Ci0gIGVuZAotCi0gIGRlZiB0ZXN0TWFwTWFwKHRoaW5nKQotICAgIHJldHVybiB7dGhpbmcgPT4ge3RoaW5nID0+IHRoaW5nfX0KLSAgZW5kCi0KLSAgZGVmIHRlc3RFbnVtKHRoaW5nKQotICAgIHJldHVybiB0aGluZwotICBlbmQKLQotICBkZWYgdGVzdFR5cGVkZWYodGhpbmcpCi0gICAgcmV0dXJuIHRoaW5nCi0gIGVuZAotCi0gIGRlZiB0ZXN0RXhjZXB0aW9uKHRoaW5nKQotICAgIHJhaXNlIFRocmlmdDo6VGVzdDo6WGNlcHRpb24sIDptZXNzYWdlID0+ICdlcnJvcicKLSAgZW5kCi0KLWVuZAotY2xhc3MgVGVzdFRocmlmdCA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCi0KLSAgQEBJTklUID0gbmlsCi0KLSAgZGVmIHNldHVwCi0gICAgaWYgQEBJTklULm5pbD8KLSAgICAgICMgSW5pdGlhbGl6ZSB0aGUgc2VydmVyCi0gICAgICBAaGFuZGxlciAgID0gVGVzdEhhbmRsZXIubmV3KCkKLSAgICAgIEBwcm9jZXNzb3IgPSBUaHJpZnQ6OlRlc3Q6OlRocmlmdFRlc3Q6OlByb2Nlc3Nvci5uZXcoQGhhbmRsZXIpCi0gICAgICBAdHJhbnNwb3J0ID0gVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQubmV3KDkwOTApCi0gICAgICBAc2VydmVyICAgID0gVGhyaWZ0OjpUaHJlYWRlZFNlcnZlci5uZXcoQHByb2Nlc3NvciwgQHRyYW5zcG9ydCkKLQotICAgICAgQHRocmVhZCAgICA9IFRocmVhZC5uZXcgeyBAc2VydmVyLnNlcnZlIH0KLQotICAgICAgIyBBbmQgdGhlIENsaWVudAotICAgICAgQHNvY2tldCAgID0gVGhyaWZ0OjpTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCA5MDkwKQotICAgICAgQHByb3RvY29sID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC5uZXcoQHNvY2tldCkKLSAgICAgIEBjbGllbnQgICA9IFRocmlmdDo6VGVzdDo6VGhyaWZ0VGVzdDo6Q2xpZW50Lm5ldyhAcHJvdG9jb2wpCi0gICAgICBAc29ja2V0Lm9wZW4KLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHRlc3Rfc3RyaW5nCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdFN0cmluZygnc3RyaW5nJyksICdzdHJpbmcnKQotICBlbmQKLQotICBkZWYgdGVzdF9ieXRlCi0gICAgdmFsID0gOAotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RCeXRlKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0Qnl0ZSgtdmFsKSwgLXZhbCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfaTMyCi0gICAgdmFsID0gMzIKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STMyKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STMyKC12YWwpLCAtdmFsKQotICBlbmQKLQotICBkZWYgdGVzdF9pNjQKLSAgICB2YWwgPSA2NAotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJNjQodmFsKSwgdmFsKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJNjQoLXZhbCksIC12YWwpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2RvdWJsZQotICAgIHZhbCA9IDMuMTQKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0RG91YmxlKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0RG91YmxlKC12YWwpLCAtdmFsKQotICAgIGFzc2VydF9raW5kX29mKEZsb2F0LCBAY2xpZW50LnRlc3REb3VibGUodmFsKSkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfbWFwCi0gICAgdmFsID0gezEgPT4gMSwgMiA9PiAyLCAzID0+IDN9Ci0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdE1hcCh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2tpbmRfb2YoSGFzaCwgQGNsaWVudC50ZXN0TWFwKHZhbCkpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2xpc3QKLSAgICB2YWwgPSBbMSwyLDMsNCw1XQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RMaXN0KHZhbCksIHZhbCkKLSAgICBhc3NlcnRfa2luZF9vZihBcnJheSwgQGNsaWVudC50ZXN0TGlzdCh2YWwpKQotICBlbmQKLQotICBkZWYgdGVzdF9lbnVtCi0gICAgdmFsID0gVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpTSVgKLSAgICByZXQgPSBAY2xpZW50LnRlc3RFbnVtKHZhbCkKLQotICAgIGFzc2VydF9lcXVhbChyZXQsIDYpCi0gICAgYXNzZXJ0X2tpbmRfb2YoRml4bnVtLCByZXQpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X3R5cGVkZWYKLSAgICAjVXNlcklkICB0ZXN0VHlwZWRlZigxOiBVc2VySWQgdGhpbmcpLAotICAgIHRydWUKLSAgZW5kCi0KLSAgZGVmIHRlc3Rfc2V0Ci0gICAgdmFsID0gU2V0Lm5ldyhbMSwgMiwgM10pCi0gICAgYXNzZXJ0X2VxdWFsKHZhbCwgQGNsaWVudC50ZXN0U2V0KHZhbCkpCi0gICAgYXNzZXJ0X2tpbmRfb2YoU2V0LCBAY2xpZW50LnRlc3RTZXQodmFsKSkKLSAgZW5kCi0KLSAgZGVmIGdldF9zdHJ1Y3QKLSAgICBUaHJpZnQ6OlRlc3Q6Olh0cnVjdC5uZXcoeydzdHJpbmdfdGhpbmcnID0+ICdoaSEnLCAnaTMyX3RoaW5nJyA9PiA0IH0pCi0gIGVuZAotCi0gIGRlZiB0ZXN0X3N0cnVjdAotICAgIHJldCA9IEBjbGllbnQudGVzdFN0cnVjdChnZXRfc3RydWN0KQotCi0gICAgYXNzZXJ0X25pbChyZXQuYnl0ZV90aGluZywgbmlsKQotICAgIGFzc2VydF9uaWwocmV0Lmk2NF90aGluZywgbmlsKQotICAgIGFzc2VydF9lcXVhbChyZXQuc3RyaW5nX3RoaW5nLCAnaGkhJykKLSAgICBhc3NlcnRfZXF1YWwocmV0LmkzMl90aGluZywgNCkKLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Olh0cnVjdCwgcmV0KQotICBlbmQKLQotICBkZWYgdGVzdF9uZXN0Ci0gICAgc3RydWN0MiA9IFRocmlmdDo6VGVzdDo6WHRydWN0Mi5uZXcoeydzdHJ1Y3RfdGhpbmcnID0+IGdldF9zdHJ1Y3QsICdpMzJfdGhpbmcnID0+IDEwfSkKLQotICAgIHJldCA9IEBjbGllbnQudGVzdE5lc3Qoc3RydWN0MikKLQotICAgIGFzc2VydF9uaWwocmV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuaWwpCi0gICAgYXNzZXJ0X25pbChyZXQuc3RydWN0X3RoaW5nLmk2NF90aGluZywgbmlsKQotICAgIGFzc2VydF9lcXVhbChyZXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgJ2hpIScpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCA0KQotICAgIGFzc2VydF9lcXVhbChyZXQuaTMyX3RoaW5nLCAxMCkKLQotICAgIGFzc2VydF9raW5kX29mKFRocmlmdDo6VGVzdDo6WHRydWN0LCByZXQuc3RydWN0X3RoaW5nKQotICAgIGFzc2VydF9raW5kX29mKFRocmlmdDo6VGVzdDo6WHRydWN0MiwgcmV0KQotICBlbmQKLQotICBkZWYgdGVzdF9pbnNhbmUKLSAgICBpbnNhbmUgPSBUaHJpZnQ6OlRlc3Q6Okluc2FuaXR5Lm5ldyh7Ci0gICAgICAndXNlck1hcCcgPT4geyBUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6Ok9ORSA9PiA0NCB9LAotICAgICAgJ3h0cnVjdHMnID0+IFtnZXRfc3RydWN0LAotICAgICAgICBUaHJpZnQ6OlRlc3Q6Olh0cnVjdC5uZXcoewotICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICdoaSBhZ2FpbicsCi0gICAgICAgICAgJ2kzMl90aGluZycgPT4gMTIKLSAgICAgICAgfSkKLSAgICAgIF0KLSAgICB9KQotCi0gICAgcmV0ID0gQGNsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5lKQotCi0gICAgYXNzZXJ0X25vdF9uaWwocmV0WzQ0XSkKLSAgICBhc3NlcnRfbm90X25pbChyZXRbNDRdWzFdKQotCi0gICAgc3RydWN0ID0gcmV0WzQ0XVsxXQotCi0gICAgYXNzZXJ0X2VxdWFsKHN0cnVjdC51c2VyTWFwW1RocmlmdDo6VGVzdDo6TnVtYmVyejo6T05FXSwgNDQpCi0gICAgYXNzZXJ0X2VxdWFsKHN0cnVjdC54dHJ1Y3RzWzFdLnN0cmluZ190aGluZywgJ2hpIGFnYWluJykKLSAgICBhc3NlcnRfZXF1YWwoc3RydWN0Lnh0cnVjdHNbMV0uaTMyX3RoaW5nLCAxMikKLQotICAgIGFzc2VydF9raW5kX29mKEhhc2gsIHN0cnVjdC51c2VyTWFwKQotICAgIGFzc2VydF9raW5kX29mKEFycmF5LCBzdHJ1Y3QueHRydWN0cykKLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Okluc2FuaXR5LCBzdHJ1Y3QpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X21hcF9tYXAKLSAgICByZXQgPSBAY2xpZW50LnRlc3RNYXBNYXAoNCkKLSAgICBhc3NlcnRfa2luZF9vZihIYXNoLCByZXQpCi0gICAgYXNzZXJ0X2VxdWFsKHJldCwgeyA0ID0+IHsgNCA9PiA0fX0pCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2V4Y2VwdGlvbgotICAgIGFzc2VydF9yYWlzZSBUaHJpZnQ6OlRlc3Q6OlhjZXB0aW9uIGRvCi0gICAgICBAY2xpZW50LnRlc3RFeGNlcHRpb24oJ2ZvbycpCi0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiB0ZWFyZG93bgotICBlbmQKLQotZW5kCmRpZmYgLS1naXQgYS90ZXN0L3JlYnVpbGRfa25vd25fZmFpbHVyZXMuc2ggYi90ZXN0L3JlYnVpbGRfa25vd25fZmFpbHVyZXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg4NjlmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcmVidWlsZF9rbm93bl9mYWlsdXJlcy5zaApAQCAtMCwwICsxLDI0IEBACisjIS9iaW4vYmFzaAorCitpZiBbIC16ICQxIF07IHRoZW4KKyAgZWNobyBVc2FnZTogJDAgTEFOR1VBR0UKKyAgZWNobyBSZS1saXN0IGFsbCBmYWlsdXJlcyBvZiBhIHNwZWNpZmljIExBTkdVQUdFIGludG8ga25vd25fZmFpbHVyZXNfTGludXguanNvbgorICBlY2hvIExBTkdVQUdFIHNob3VsZCBiZSBsaWJyYXJ5IG5hbWUgbGlrZSBjcHAsIGphdmEsIHB5IGV0YworICBleGl0IDEKK2ZpCisKK2lmIFsgLXogJFBZVEhPTl07IHRoZW4KKyAgUFlUSE9OPXB5dGhvbgorZmkKKworVEFSR0VUX0xBTkc9JDEKK09VVF9GSUxFPWtub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24KK2VjaG8gUmVidWlsZGluZyBrbm93biBmYWlsdXJlcyBmb3IgJFRBUkdFVF9MQU5HCisKK1RNUEZJTEU9Ll9fdG1wX19yZWJ1aWxkX18KK2dyZXAgLXYgLWUgIlwiJDEtIiAtZSAiXC0kMV8iICRPVVRfRklMRSA+ICRUTVBGSUxFCittdiAkVE1QRklMRSAkT1VUX0ZJTEUKKyRQWVRIT04gdGVzdC5weSAtLWNsaWVudCAkMQorJFBZVEhPTiB0ZXN0LnB5IC1VIG1lcmdlCiskUFlUSE9OIHRlc3QucHkgLS1zZXJ2ZXIgJDEKKyRQWVRIT04gdGVzdC5weSAtVSBtZXJnZQpkaWZmIC0tZ2l0IGEvdGVzdC9yZXN1bHQuanMgYi90ZXN0L3Jlc3VsdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGIxYTU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9yZXN1bHQuanMKQEAgLTAsMCArMSw2NCBAQAorLyoKKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyovCisKKyQuZ2V0SlNPTigncmVzdWx0cy5qc29uJywgZnVuY3Rpb24ocmVzdWx0cykgeworICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgdHJhbnNwb3J0ID0gMzsKKyAgICAgICAgdmFyIHNvY2tldCA9IDQ7CisgICAgICAgIHZhciBzdWNjZXNzID0gNTsKKyAgICAgICAgdmFyIGV4cGVjdGVkID0gNjsKKyAgICAgICAgdmFyIHJldHVybkNvZGUgPSA3OworICAgICAgICB2YXIgbG9nRmlsZSA9IDg7CisgICAgICAgIHRlc3RUYWJsZSA9ICQoJyN0ZXN0X3Jlc3VsdHMnKS5EYXRhVGFibGUoeworICAgICAgICAgICAgZGF0YTogcmVzdWx0c1sncmVzdWx0cyddLAorICAgICAgICAgICAgY29sdW1uRGVmczogWworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0czogMywKKyAgICAgICAgICAgICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbihkYXRhLCB0eXBlLCByb3cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByb3dbdHJhbnNwb3J0XSArICctJyArIHJvd1tzb2NrZXRdOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0YXJnZXRzOiA0LAorICAgICAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGRhdGEsIHR5cGUsIHJvdykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyb3dbc3VjY2Vzc10gPyAnc3VjY2VzcycgOiAnZmFpbHVyZScpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJygnICsgKHJvd1tyZXR1cm5Db2RlXSA9PSAxMjggPyAndGltZW91dCcgOiByb3dbcmV0dXJuQ29kZV0pICsgJyknCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyg8YSBocmVmPSInICsgcm93W2xvZ0ZpbGVdLnNlcnZlciArICciPlNlcnZlcjwvYT4sICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnPGEgaHJlZj0iJyArIHJvd1tsb2dGaWxlXS5jbGllbnQgKyAnIj5DbGllbnQ8L2E+KSc7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldHM6IDUsCisgICAgICAgICAgICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24oZGF0YSwgdHlwZSwgcm93KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAneWVzJyByYXRoZXIgdGhhbiAnZXhwZWN0ZWQnIHRvIGVhc2Ugc2VhcmNoCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm93W2V4cGVjdGVkXSA/ICd5ZXMnIDogJ3VuZXhwZWN0ZWQnOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF0sCisgICAgICAgIH0pOworICAgICAgICAkKCcjdGVzdF9yZXN1bHRzX2ZpbHRlciBsYWJlbCBpbnB1dCcpLmZvY3VzKCkudmFsKCd1bmV4cGVjdGVkIGZhaWx1cmUnKTsKKyAgICAgICAgJCgnI3Rlc3RfaW5mbycpLnRleHQoCisgICAgICAgICAgICAiVGVzdCBEYXRlOiAgICAgIiArIHJlc3VsdHNbJ2RhdGUnXSArICJcbiIgKworICAgICAgICAgICAgIlJldmlzaW9uOiAgICAgICIgKyByZXN1bHRzWydyZXZpc2lvbiddICsgIlxuIiArCisgICAgICAgICAgICAiUGxhdGZvcm06ICAgICAgIiArIHJlc3VsdHNbJ3BsYXRmb3JtJ10gKyAiXG4iICsKKyAgICAgICAgICAgICJUZXN0IGR1cmF0aW9uOiAiICsgcmVzdWx0c1snZHVyYXRpb24nXSkgKyAiIHNlY29uZHMiOworICAgIH0pOworfSk7CisKZGlmZiAtLWdpdCBhL3Rlc3QvcnMvQ2FyZ28udG9tbCBiL3Rlc3QvcnMvQ2FyZ28udG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjM1ZTNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ycy9DYXJnby50b21sCkBAIC0wLDAgKzEsMTcgQEAKK1twYWNrYWdlXQorbmFtZSA9ICJ0aHJpZnQtdGVzdCIKK3ZlcnNpb24gPSAiMC4xLjAiCitsaWNlbnNlID0gIkFwYWNoZS0yLjAiCithdXRob3JzID0gWyJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iXQorcHVibGlzaCA9IGZhbHNlCisKK1tkZXBlbmRlbmNpZXNdCitjbGFwID0gIjwyLjI4LjAiCitlbnZfbG9nZ2VyID0gIjAuNC4wIgorbG9nID0gIjAuMy43Igorb3JkZXJlZC1mbG9hdCA9ICIwLjMuMCIKK3RyeV9mcm9tID0gIjAuMi4wIgorCitbZGVwZW5kZW5jaWVzLnRocmlmdF0KK3BhdGggPSAiLi4vLi4vbGliL3JzIgorCmRpZmYgLS1naXQgYS90ZXN0L3JzL01ha2VmaWxlLmFtIGIvdGVzdC9ycy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDkwNWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ycy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC1JIC4vdGhyaWZ0cyAtb3V0IHNyYyAtLWdlbiBycyAuLi9UaHJpZnRUZXN0LnRocmlmdAorCitwcmVjcm9zczogc3R1YnMKKwkkKENBUkdPKSBidWlsZAorCVsgLWQgYmluIF0gfHwgbWtkaXIgYmluCisJY3AgdGFyZ2V0L2RlYnVnL3Rlc3Rfc2VydmVyIGJpbi90ZXN0X3NlcnZlcgorCWNwIHRhcmdldC9kZWJ1Zy90ZXN0X2NsaWVudCBiaW4vdGVzdF9jbGllbnQKKworY2xlYW4tbG9jYWw6CisJJChDQVJHTykgY2xlYW4KKwktJChSTSkgQ2FyZ28ubG9jaworCS0kKFJNKSBzcmMvdGhyaWZ0X3Rlc3QucnMKKwktJChSTSkgLXIgYmluCisKK0VYVFJBX0RJU1QgPSBcCisJQ2FyZ28udG9tbCBcCisgICAgICAgIHNyYy9saWIucnMgXAorCXNyYy9iaW4vdGVzdF9zZXJ2ZXIucnMgXAorCXNyYy9iaW4vdGVzdF9jbGllbnQucnMKKwpkaWZmIC0tZ2l0IGEvdGVzdC9ycy9zcmMvYmluL3Rlc3RfY2xpZW50LnJzIGIvdGVzdC9ycy9zcmMvYmluL3Rlc3RfY2xpZW50LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YjViODgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3JzL3NyYy9iaW4vdGVzdF9jbGllbnQucnMKQEAgLTAsMCArMSw2MDUgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI1ttYWNyb191c2VdCitleHRlcm4gY3JhdGUgbG9nOworZXh0ZXJuIGNyYXRlIGVudl9sb2dnZXI7CisKKyNbbWFjcm9fdXNlXQorZXh0ZXJuIGNyYXRlIGNsYXA7CitleHRlcm4gY3JhdGUgb3JkZXJlZF9mbG9hdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0X3Rlc3Q7IC8vIGh1aC4gSSBoYXZlIHRvIGRvIHRoaXMgdG8gdXNlIG15IGxpYgorCit1c2Ugb3JkZXJlZF9mbG9hdDo6T3JkZXJlZEZsb2F0OwordXNlIHN0ZDo6Y29sbGVjdGlvbnM6OntCVHJlZU1hcCwgQlRyZWVTZXR9OwordXNlIHN0ZDo6Zm10OjpEZWJ1ZzsKKwordXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbCwgVEJpbmFyeU91dHB1dFByb3RvY29sLCBUQ29tcGFjdElucHV0UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgIFRDb21wYWN0T3V0cHV0UHJvdG9jb2wsIFRJbnB1dFByb3RvY29sLCBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgVE91dHB1dFByb3RvY29sfTsKK3VzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1JlYWRIYWxmLCBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0LCBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0LCBURnJhbWVkV3JpdGVUcmFuc3BvcnQsIFRJb0NoYW5uZWwsIFRSZWFkVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgVFRjcENoYW5uZWwsIFRXcml0ZVRyYW5zcG9ydCwgV3JpdGVIYWxmfTsKK3VzZSB0aHJpZnRfdGVzdDo6KjsKKworZm4gbWFpbigpIHsKKyAgICBlbnZfbG9nZ2VyOjppbml0KCkuZXhwZWN0KCJsb2dnZXIgc2V0dXAgZmFpbGVkIik7CisKKyAgICBkZWJ1ZyEoImluaXRpYWxpemVkIGxvZ2dlciAtIHJ1bm5pbmcgY3Jvc3MtdGVzdCBjbGllbnQiKTsKKworICAgIG1hdGNoIHJ1bigpIHsKKyAgICAgICAgT2soKCkpID0+IGluZm8hKCJjcm9zcy10ZXN0IGNsaWVudCBzdWNjZWVkZWQiKSwKKyAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgIGluZm8hKCJjcm9zcy10ZXN0IGNsaWVudCBmYWlsZWQgd2l0aCBlcnJvciB7Oj99IiwgZSk7CisgICAgICAgICAgICBzdGQ6OnByb2Nlc3M6OmV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ZuIHJ1bigpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgLy8gdW5zdXBwb3J0ZWQgb3B0aW9uczoKKyAgICAvLyAtLWRvbWFpbi1zb2NrZXQKKyAgICAvLyAtLW5hbWVkLXBpcGUKKyAgICAvLyAtLWFub24tcGlwZXMKKyAgICAvLyAtLXNzbAorICAgIC8vIC0tdGhyZWFkcworICAgIGxldCBtYXRjaGVzID0gY2xhcF9hcHAhKHJ1c3RfdGVzdF9jbGllbnQgPT4KKyAgICAgICAgKHZlcnNpb246ICIxLjAiKQorICAgICAgICAoYXV0aG9yOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IikKKyAgICAgICAgKGFib3V0OiAiUnVzdCBUaHJpZnQgdGVzdCBjbGllbnQiKQorICAgICAgICAoQGFyZyBob3N0OiAtLWhvc3QgK3Rha2VzX3ZhbHVlICJIb3N0IG9uIHdoaWNoIHRoZSBUaHJpZnQgdGVzdCBzZXJ2ZXIgaXMgbG9jYXRlZCIpCisgICAgICAgIChAYXJnIHBvcnQ6IC0tcG9ydCArdGFrZXNfdmFsdWUgIlBvcnQgb24gd2hpY2ggdGhlIFRocmlmdCB0ZXN0IHNlcnZlciBpcyBsaXN0ZW5pbmciKQorICAgICAgICAoQGFyZyB0cmFuc3BvcnQ6IC0tdHJhbnNwb3J0ICt0YWtlc192YWx1ZSAiVGhyaWZ0IHRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbiB0byB1c2UgKFwiYnVmZmVyZWRcIiwgXCJmcmFtZWRcIikiKQorICAgICAgICAoQGFyZyBwcm90b2NvbDogLS1wcm90b2NvbCArdGFrZXNfdmFsdWUgIlRocmlmdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiB0byB1c2UgKFwiYmluYXJ5XCIsIFwiY29tcGFjdFwiKSIpCisgICAgICAgIChAYXJnIHRlc3Rsb29wczogLW4gLS10ZXN0bG9vcHMgK3Rha2VzX3ZhbHVlICJOdW1iZXIgb2YgdGltZXMgdG8gcnVuIHRlc3RzIikKKyAgICApCisgICAgICAgIC5nZXRfbWF0Y2hlcygpOworCisgICAgbGV0IGhvc3QgPSBtYXRjaGVzLnZhbHVlX29mKCJob3N0IikudW53cmFwX29yKCIxMjcuMC4wLjEiKTsKKyAgICBsZXQgcG9ydCA9IHZhbHVlX3QhKG1hdGNoZXMsICJwb3J0IiwgdTE2KS51bndyYXBfb3IoOTA5MCk7CisgICAgbGV0IHRlc3Rsb29wcyA9IHZhbHVlX3QhKG1hdGNoZXMsICJ0ZXN0bG9vcHMiLCB1OCkudW53cmFwX29yKDEpOworICAgIGxldCB0cmFuc3BvcnQgPSBtYXRjaGVzLnZhbHVlX29mKCJ0cmFuc3BvcnQiKS51bndyYXBfb3IoImJ1ZmZlcmVkIik7CisgICAgbGV0IHByb3RvY29sID0gbWF0Y2hlcy52YWx1ZV9vZigicHJvdG9jb2wiKS51bndyYXBfb3IoImJpbmFyeSIpOworCisKKyAgICBsZXQgbXV0IHRocmlmdF90ZXN0X2NsaWVudCA9IHsKKyAgICAgICAgbGV0IChpX3Byb3QsIG9fcHJvdCkgPSBidWlsZF9wcm90b2NvbHMoaG9zdCwgcG9ydCwgdHJhbnNwb3J0LCBwcm90b2NvbCwgIlRocmlmdFRlc3QiKT87CisgICAgICAgIFRocmlmdFRlc3RTeW5jQ2xpZW50OjpuZXcoaV9wcm90LCBvX3Byb3QpCisgICAgfTsKKworICAgIGxldCBtdXQgc2Vjb25kX3NlcnZpY2VfY2xpZW50ID0gaWYgcHJvdG9jb2wuc3RhcnRzX3dpdGgoIm11bHRpIikgeworICAgICAgICBsZXQgKGlfcHJvdCwgb19wcm90KSA9IGJ1aWxkX3Byb3RvY29scyhob3N0LCBwb3J0LCB0cmFuc3BvcnQsIHByb3RvY29sLCAiU2Vjb25kU2VydmljZSIpPzsKKyAgICAgICAgU29tZShTZWNvbmRTZXJ2aWNlU3luY0NsaWVudDo6bmV3KGlfcHJvdCwgb19wcm90KSkKKyAgICB9IGVsc2UgeworICAgICAgICBOb25lCisgICAgfTsKKworICAgIGluZm8hKAorICAgICAgICAiY29ubmVjdGluZyB0byB7fTp7fSB3aXRoIHt9K3t9IHN0YWNrIiwKKyAgICAgICAgaG9zdCwKKyAgICAgICAgcG9ydCwKKyAgICAgICAgcHJvdG9jb2wsCisgICAgICAgIHRyYW5zcG9ydAorICAgICk7CisKKyAgICBmb3IgXyBpbiAwLi50ZXN0bG9vcHMgeworICAgICAgICBtYWtlX3RocmlmdF9jYWxscygmbXV0IHRocmlmdF90ZXN0X2NsaWVudCwgJm11dCBzZWNvbmRfc2VydmljZV9jbGllbnQpPworICAgIH0KKworICAgIE9rKCgpKQorfQorCitmbiBidWlsZF9wcm90b2NvbHMoCisgICAgaG9zdDogJnN0ciwKKyAgICBwb3J0OiB1MTYsCisgICAgdHJhbnNwb3J0OiAmc3RyLAorICAgIHByb3RvY29sOiAmc3RyLAorICAgIHNlcnZpY2VfbmFtZTogJnN0ciwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KEJveDxUSW5wdXRQcm90b2NvbD4sIEJveDxUT3V0cHV0UHJvdG9jb2w+KT4geworICAgIGxldCAoaV9jaGFuLCBvX2NoYW4pID0gdGNwX2NoYW5uZWwoaG9zdCwgcG9ydCk/OworCisgICAgbGV0IChpX3RyYW4sIG9fdHJhbik6IChCb3g8VFJlYWRUcmFuc3BvcnQ+LCBCb3g8VFdyaXRlVHJhbnNwb3J0PikgPSBtYXRjaCB0cmFuc3BvcnQgeworICAgICAgICAiYnVmZmVyZWQiID0+IHsKKyAgICAgICAgICAgIChCb3g6Om5ldyhUQnVmZmVyZWRSZWFkVHJhbnNwb3J0OjpuZXcoaV9jaGFuKSksCisgICAgICAgICAgICAgQm94OjpuZXcoVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhvX2NoYW4pKSkKKyAgICAgICAgfQorICAgICAgICAiZnJhbWVkIiA9PiB7CisgICAgICAgICAgICAoQm94OjpuZXcoVEZyYW1lZFJlYWRUcmFuc3BvcnQ6Om5ldyhpX2NoYW4pKSwKKyAgICAgICAgICAgICBCb3g6Om5ldyhURnJhbWVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhvX2NoYW4pKSkKKyAgICAgICAgfQorICAgICAgICB1bm1hdGNoZWQgPT4gcmV0dXJuIEVycihmb3JtYXQhKCJ1bnN1cHBvcnRlZCB0cmFuc3BvcnQge30iLCB1bm1hdGNoZWQpLmludG8oKSksCisgICAgfTsKKworICAgIGxldCAoaV9wcm90LCBvX3Byb3QpOiAoQm94PFRJbnB1dFByb3RvY29sPiwgQm94PFRPdXRwdXRQcm90b2NvbD4pID0gbWF0Y2ggcHJvdG9jb2wgeworICAgICAgICAiYmluYXJ5IiA9PiB7CisgICAgICAgICAgICAoQm94OjpuZXcoVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhpX3RyYW4sIHRydWUpKSwKKyAgICAgICAgICAgICBCb3g6Om5ldyhUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyhvX3RyYW4sIHRydWUpKSkKKyAgICAgICAgfQorICAgICAgICAibXVsdGkiID0+IHsKKyAgICAgICAgICAgIChCb3g6Om5ldyhUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KGlfdHJhbiwgdHJ1ZSkpLAorICAgICAgICAgICAgIEJveDo6bmV3KAorICAgICAgICAgICAgICAgIFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sOjpuZXcoCisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcob190cmFuLCB0cnVlKSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgKSkKKyAgICAgICAgfQorICAgICAgICAiY29tcGFjdCIgPT4geworICAgICAgICAgICAgKEJveDo6bmV3KFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KGlfdHJhbikpLAorICAgICAgICAgICAgIEJveDo6bmV3KFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldyhvX3RyYW4pKSkKKyAgICAgICAgfQorICAgICAgICAibXVsdGljIiA9PiB7CisgICAgICAgICAgICAoQm94OjpuZXcoVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcoaV90cmFuKSksCisgICAgICAgICAgICAgQm94OjpuZXcoVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w6Om5ldyhzZXJ2aWNlX25hbWUsIFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldyhvX3RyYW4pKSwpKQorICAgICAgICB9CisgICAgICAgIHVubWF0Y2hlZCA9PiByZXR1cm4gRXJyKGZvcm1hdCEoInVuc3VwcG9ydGVkIHByb3RvY29sIHt9IiwgdW5tYXRjaGVkKS5pbnRvKCkpLAorICAgIH07CisKKyAgICBPaygoaV9wcm90LCBvX3Byb3QpKQorfQorCisvLyBGSVhNRTogZXhwb3NlICJvcGVuIiB0aHJvdWdoIHRoZSBjbGllbnQgaW50ZXJmYWNlIHNvIEkgZG9uJ3QgaGF2ZSB0byBlYXJseQorLy8gb3BlbgorZm4gdGNwX2NoYW5uZWwoCisgICAgaG9zdDogJnN0ciwKKyAgICBwb3J0OiB1MTYsCispIC0+IHRocmlmdDo6UmVzdWx0PChSZWFkSGFsZjxUVGNwQ2hhbm5lbD4sIFdyaXRlSGFsZjxUVGNwQ2hhbm5lbD4pPiB7CisgICAgbGV0IG11dCBjID0gVFRjcENoYW5uZWw6Om5ldygpOworICAgIGMub3BlbigmZm9ybWF0ISgie306e30iLCBob3N0LCBwb3J0KSk/OworICAgIGMuc3BsaXQoKQorfQorCit0eXBlIEJ1aWxkVGhyaWZ0VGVzdENsaWVudCA9IFRocmlmdFRlc3RTeW5jQ2xpZW50PEJveDxUSW5wdXRQcm90b2NvbD4sIEJveDxUT3V0cHV0UHJvdG9jb2w+PjsKK3R5cGUgQnVpbHRTZWNvbmRTZXJ2aWNlQ2xpZW50ID0gU2Vjb25kU2VydmljZVN5bmNDbGllbnQ8Qm94PFRJbnB1dFByb3RvY29sPiwgQm94PFRPdXRwdXRQcm90b2NvbD4+OworCisjW2NmZ19hdHRyKGZlYXR1cmUgPSAiY2FyZ28tY2xpcHB5IiwgYWxsb3coY3ljbG9tYXRpY19jb21wbGV4aXR5KSldCitmbiBtYWtlX3RocmlmdF9jYWxscygKKyAgICB0aHJpZnRfdGVzdF9jbGllbnQ6ICZtdXQgQnVpbGRUaHJpZnRUZXN0Q2xpZW50LAorICAgIHNlY29uZF9zZXJ2aWNlX2NsaWVudDogJm11dCBPcHRpb248QnVpbHRTZWNvbmRTZXJ2aWNlQ2xpZW50PiwKKykgLT4gUmVzdWx0PCgpLCB0aHJpZnQ6OkVycm9yPiB7CisgICAgaW5mbyEoInRlc3RWb2lkIik7CisgICAgdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3Rfdm9pZCgpPzsKKworICAgIGluZm8hKCJ0ZXN0U3RyaW5nIik7CisgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCgKKyAgICAgICAgdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3Rfc3RyaW5nKCJ0aGluZyIudG9fb3duZWQoKSksCisgICAgICAgICJ0aGluZyIudG9fb3duZWQoKSwKKyAgICApPzsKKworICAgIGluZm8hKCJ0ZXN0Qm9vbCIpOworICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfYm9vbCh0cnVlKSwgdHJ1ZSk/OworCisgICAgaW5mbyEoInRlc3RCb29sIik7CisgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9ib29sKGZhbHNlKSwgZmFsc2UpPzsKKworICAgIGluZm8hKCJ0ZXN0Qnl0ZSIpOworICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfYnl0ZSg0MiksIDQyKT87CisKKyAgICBpbmZvISgidGVzdGkzMiIpOworICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfaTMyKDExNTkzNDgzNzQpLCAxMTU5MzQ4Mzc0KT87CisKKyAgICBpbmZvISgidGVzdGk2NCIpOworICAgIC8vIHRyeSEodmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9pNjQoLTg2NTE4Mjk4Nzk0MzgyOTQ1NjUpLAorICAgIC8vIC04NjUxODI5ODc5NDM4Mjk0NTY1KSk7CisgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCgKKyAgICAgICAgdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfaTY0KGk2NDo6bWluX3ZhbHVlKCkpLAorICAgICAgICBpNjQ6Om1pbl92YWx1ZSgpLAorICAgICk/OworCisgICAgaW5mbyEoInRlc3REb3VibGUiKTsKKyAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KAorICAgICAgICB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9kb3VibGUoT3JkZXJlZEZsb2F0Ojpmcm9tKDQyLjQyKSksCisgICAgICAgIE9yZGVyZWRGbG9hdDo6ZnJvbSg0Mi40MiksCisgICAgKT87CisKKyAgICBpbmZvISgidGVzdFR5cGVkZWYiKTsKKyAgICB7CisgICAgICAgIGxldCB1X3NuZDogVXNlcklkID0gMjM0ODsKKyAgICAgICAgbGV0IHVfY21wOiBVc2VySWQgPSAyMzQ4OworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X3R5cGVkZWYodV9zbmQpLCB1X2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0RW51bSIpOworICAgIHsKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9lbnVtKE51bWJlcno6OlR3byksIE51bWJlcno6OlR3byk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0QmluYXJ5Iik7CisgICAgeworICAgICAgICBsZXQgYl9zbmQgPSB2ZWMhWzB4NzcsIDB4MzAsIDB4MzAsIDB4NzQsIDB4MjEsIDB4MjAsIDB4NTIsIDB4NzUsIDB4NzMsIDB4NzRdOworICAgICAgICBsZXQgYl9jbXAgPSB2ZWMhWzB4NzcsIDB4MzAsIDB4MzAsIDB4NzQsIDB4MjEsIDB4MjAsIDB4NTIsIDB4NzUsIDB4NzMsIDB4NzRdOworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2JpbmFyeShiX3NuZCksIGJfY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RTdHJ1Y3QiKTsKKyAgICB7CisgICAgICAgIGxldCB4X3NuZCA9IFh0cnVjdCB7CisgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoImZvbyIudG9fb3duZWQoKSksCisgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDEyKSwKKyAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgyMTkxMjkpLAorICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKDEyOTM4NDkyODE4KSwKKyAgICAgICAgfTsKKyAgICAgICAgbGV0IHhfY21wID0gWHRydWN0IHsKKyAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiZm9vIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoMTIpLAorICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDIxOTEyOSksCisgICAgICAgICAgICBpNjRfdGhpbmc6IFNvbWUoMTI5Mzg0OTI4MTgpLAorICAgICAgICB9OworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X3N0cnVjdCh4X3NuZCksIHhfY21wKT87CisgICAgfQorCisgICAgLy8gWHRydWN0IGFnYWluLCB3aXRoIG9wdGlvbmFsIHZhbHVlcworICAgIC8vIEZJWE1FOiBhcHBhcmVudGx5IHRoZSBlcmxhbmcgdGhyaWZ0IHNlcnZlciBkb2VzIG5vdCBsaWtlIG9wdC1pbi1yZXEtb3V0CisgICAgLy8gcGFyYW1ldGVycyB0aGF0IGFyZSB1bmRlZmluZWQuIEpveS4KKyAgICAvLyB7CisgICAgLy8gbGV0IHhfc25kID0gWHRydWN0IHsgc3RyaW5nX3RoaW5nOiBTb21lKCJmb28iLnRvX293bmVkKCkpLCBieXRlX3RoaW5nOiBOb25lLAorICAgIC8vIGkzMl90aGluZzogTm9uZSwgaTY0X3RoaW5nOiBTb21lKDEyOTM4NDkyODE4KSB9OworICAgIC8vIGxldCB4X2NtcCA9IFh0cnVjdCB7IHN0cmluZ190aGluZzogU29tZSgiZm9vIi50b19vd25lZCgpKSwgYnl0ZV90aGluZzoKKyAgICAvLyBTb21lKDApLCBpMzJfdGhpbmc6IFNvbWUoMCksIGk2NF90aGluZzogU29tZSgxMjkzODQ5MjgxOCkgfTsgLy8gdGhlIEMrKworICAgIC8vIHNlcnZlciBpcyByZXNwb25kaW5nIGNvcnJlY3RseQorICAgIC8vIHRyeSEodmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9zdHJ1Y3QoeF9zbmQpLCB4X2NtcCkpOworICAgIC8vIH0KKyAgICAvLworCisgICAgaW5mbyEoInRlc3ROZXN0Iik7IC8vIChGSVhNRTogdHJ5IFh0cnVjdDIgd2l0aCBvcHRpb25hbCB2YWx1ZXMpCisgICAgeworICAgICAgICBsZXQgeF9zbmQgPSBYdHJ1Y3QyIHsKKyAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoMzIpLAorICAgICAgICAgICAgc3RydWN0X3RoaW5nOiBTb21lKAorICAgICAgICAgICAgICAgIFh0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiZm9vIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgxKSwKKyAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDMyNDM4MjA5OCksCisgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZzogU29tZSgxMjkzODQ5MjgxOCksCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoMjkzNDgxMDk4KSwKKyAgICAgICAgfTsKKyAgICAgICAgbGV0IHhfY21wID0gWHRydWN0MiB7CisgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDMyKSwKKyAgICAgICAgICAgIHN0cnVjdF90aGluZzogU29tZSgKKyAgICAgICAgICAgICAgICBYdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoImZvbyIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoMSksCisgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgzMjQzODIwOTgpLAorICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmc6IFNvbWUoMTI5Mzg0OTI4MTgpLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICApLAorICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDI5MzQ4MTA5OCksCisgICAgICAgIH07CisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfbmVzdCh4X3NuZCksIHhfY21wKT87CisgICAgfQorCisgICAgLy8gZG8gdGhlIG11bHRpcGxleGVkIGNhbGxzIHdoaWxlIG1ha2luZyB0aGUgbWFpbiBUaHJpZnRUZXN0IGNhbGxzCisgICAgaWYgbGV0IFNvbWUocmVmIG11dCBjbGllbnQpID0gc2Vjb25kX3NlcnZpY2VfY2xpZW50LmFzX211dCgpIHsKKyAgICAgICAgaW5mbyEoIlNlY29uZFNlcnZpY2Ugc2Vjb25kdGVzdFN0cmluZyIpOworICAgICAgICB7CisgICAgICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KAorICAgICAgICAgICAgICAgIGNsaWVudC5zZWNvbmR0ZXN0X3N0cmluZygidGVzdF9zdHJpbmciLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgICJ0ZXN0U3RyaW5nKFwidGVzdF9zdHJpbmdcIikiLnRvX293bmVkKCksCisgICAgICAgICAgICApPzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGluZm8hKCJ0ZXN0TGlzdCIpOworICAgIHsKKyAgICAgICAgbGV0IG11dCB2X3NuZDogVmVjPGkzMj4gPSBWZWM6Om5ldygpOworICAgICAgICB2X3NuZC5wdXNoKDI5Mzg0KTsKKyAgICAgICAgdl9zbmQucHVzaCgyMzgpOworICAgICAgICB2X3NuZC5wdXNoKDMyNDk4KTsKKworICAgICAgICBsZXQgbXV0IHZfY21wOiBWZWM8aTMyPiA9IFZlYzo6bmV3KCk7CisgICAgICAgIHZfY21wLnB1c2goMjkzODQpOworICAgICAgICB2X2NtcC5wdXNoKDIzOCk7CisgICAgICAgIHZfY21wLnB1c2goMzI0OTgpOworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfbGlzdCh2X3NuZCksIHZfY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RTZXQiKTsKKyAgICB7CisgICAgICAgIGxldCBtdXQgc19zbmQ6IEJUcmVlU2V0PGkzMj4gPSBCVHJlZVNldDo6bmV3KCk7CisgICAgICAgIHNfc25kLmluc2VydCgyOTM0ODEpOworICAgICAgICBzX3NuZC5pbnNlcnQoMjMpOworICAgICAgICBzX3NuZC5pbnNlcnQoMzIzNCk7CisKKyAgICAgICAgbGV0IG11dCBzX2NtcDogQlRyZWVTZXQ8aTMyPiA9IEJUcmVlU2V0OjpuZXcoKTsKKyAgICAgICAgc19jbXAuaW5zZXJ0KDI5MzQ4MSk7CisgICAgICAgIHNfY21wLmluc2VydCgyMyk7CisgICAgICAgIHNfY21wLmluc2VydCgzMjM0KTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X3NldChzX3NuZCksIHNfY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RNYXAiKTsKKyAgICB7CisgICAgICAgIGxldCBtdXQgbV9zbmQ6IEJUcmVlTWFwPGkzMiwgaTMyPiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbV9zbmQuaW5zZXJ0KDIsIDQpOworICAgICAgICBtX3NuZC5pbnNlcnQoNCwgNik7CisgICAgICAgIG1fc25kLmluc2VydCg4LCA3KTsKKworICAgICAgICBsZXQgbXV0IG1fY21wOiBCVHJlZU1hcDxpMzIsIGkzMj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIG1fY21wLmluc2VydCgyLCA0KTsKKyAgICAgICAgbV9jbXAuaW5zZXJ0KDQsIDYpOworICAgICAgICBtX2NtcC5pbnNlcnQoOCwgNyk7CisKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9tYXAobV9zbmQpLCBtX2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0U3RyaW5nTWFwIik7CisgICAgeworICAgICAgICBsZXQgbXV0IG1fc25kOiBCVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIG1fc25kLmluc2VydCgiMiIudG9fb3duZWQoKSwgIjRfc3RyaW5nIi50b19vd25lZCgpKTsKKyAgICAgICAgbV9zbmQuaW5zZXJ0KCI0Ii50b19vd25lZCgpLCAiNl9zdHJpbmciLnRvX293bmVkKCkpOworICAgICAgICBtX3NuZC5pbnNlcnQoIjgiLnRvX293bmVkKCksICI3X3N0cmluZyIudG9fb3duZWQoKSk7CisKKyAgICAgICAgbGV0IG11dCBtX3JjdjogQlRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBtX3Jjdi5pbnNlcnQoIjIiLnRvX293bmVkKCksICI0X3N0cmluZyIudG9fb3duZWQoKSk7CisgICAgICAgIG1fcmN2Lmluc2VydCgiNCIudG9fb3duZWQoKSwgIjZfc3RyaW5nIi50b19vd25lZCgpKTsKKyAgICAgICAgbV9yY3YuaW5zZXJ0KCI4Ii50b19vd25lZCgpLCAiN19zdHJpbmciLnRvX293bmVkKCkpOworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3Rfc3RyaW5nX21hcChtX3NuZCksIG1fcmN2KT87CisgICAgfQorCisgICAgLy8gbmVzdGVkIG1hcAorICAgIC8vIGV4cGVjdCA6IHstNCA9PiB7LTQgPT4gLTQsIC0zID0+IC0zLCAtMiA9PiAtMiwgLTEgPT4gLTEsIH0sIDQgPT4gezEgPT4gMSwgMgorICAgIC8vID0+IDIsIDMgPT4gMywgNCA9PiA0LCB9LCB9CisgICAgaW5mbyEoInRlc3RNYXBNYXAiKTsKKyAgICB7CisgICAgICAgIGxldCBtdXQgbV9jbXBfbmVzdGVkXzA6IEJUcmVlTWFwPGkzMiwgaTMyPiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgZm9yIGkgaW4gKC00IGFzIGkzMikuLjAgeworICAgICAgICAgICAgbV9jbXBfbmVzdGVkXzAuaW5zZXJ0KGksIGkpOworICAgICAgICB9CisgICAgICAgIGxldCBtdXQgbV9jbXBfbmVzdGVkXzE6IEJUcmVlTWFwPGkzMiwgaTMyPiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgZm9yIGkgaW4gMS4uNSB7CisgICAgICAgICAgICBtX2NtcF9uZXN0ZWRfMS5pbnNlcnQoaSwgaSk7CisgICAgICAgIH0KKworICAgICAgICBsZXQgbXV0IG1fY21wOiBCVHJlZU1hcDxpMzIsIEJUcmVlTWFwPGkzMiwgaTMyPj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIG1fY21wLmluc2VydCgtNCwgbV9jbXBfbmVzdGVkXzApOworICAgICAgICBtX2NtcC5pbnNlcnQoNCwgbV9jbXBfbmVzdGVkXzEpOworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfbWFwX21hcCg0MiksIG1fY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RNdWx0aSIpOworICAgIHsKKyAgICAgICAgbGV0IG11dCBtX3NuZDogQlRyZWVNYXA8aTE2LCBTdHJpbmc+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBtX3NuZC5pbnNlcnQoMTI5OCwgImZpenoiLnRvX293bmVkKCkpOworICAgICAgICBtX3NuZC5pbnNlcnQoLTE0OCwgImJ1enoiLnRvX293bmVkKCkpOworCisgICAgICAgIGxldCBzX2NtcCA9IFh0cnVjdCB7CisgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoIkhlbGxvMiIudG9fb3duZWQoKSksCisgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDEpLAorICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKC0xMjM5NDgpLAorICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKC0xOTIzNDEyMzk4MSksCisgICAgICAgIH07CisKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCgKKyAgICAgICAgICAgIHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X211bHRpKDEsIC0xMjM5NDgsIC0xOTIzNDEyMzk4MSwgbV9zbmQsIE51bWJlcno6OkVpZ2h0LCA4MSksCisgICAgICAgICAgICBzX2NtcCwKKyAgICAgICAgKT87CisgICAgfQorCisgICAgLy8gSW5zYW5pdHkKKyAgICAvLyByZXR1cm5zOgorICAgIC8vIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisgICAgLy8gICAgICAgICAgMyA9PiBhcmd1bWVudCwKKyAgICAvLyAgICAgICAgfSwKKyAgICAvLyAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAorICAgIC8vIH0KKyAgICB7CisgICAgICAgIGxldCBtdXQgYXJnX21hcF91c2VybWFwOiBCVHJlZU1hcDxOdW1iZXJ6LCBpNjQ+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBhcmdfbWFwX3VzZXJtYXAuaW5zZXJ0KE51bWJlcno6Ok9uZSwgNDI4OSk7CisgICAgICAgIGFyZ19tYXBfdXNlcm1hcC5pbnNlcnQoTnVtYmVyejo6RWlnaHQsIDE5KTsKKworICAgICAgICBsZXQgbXV0IGFyZ192ZWNfeHRydWN0czogVmVjPFh0cnVjdD4gPSBWZWM6Om5ldygpOworICAgICAgICBhcmdfdmVjX3h0cnVjdHMucHVzaCgKKyAgICAgICAgICAgIFh0cnVjdCB7CisgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJmb28iLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoOCksCisgICAgICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDI5KSwKKyAgICAgICAgICAgICAgICBpNjRfdGhpbmc6IFNvbWUoOTIzODQpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKTsKKyAgICAgICAgYXJnX3ZlY194dHJ1Y3RzLnB1c2goCisgICAgICAgICAgICBYdHJ1Y3QgeworICAgICAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiYmFyIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDI4KSwKKyAgICAgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoMiksCisgICAgICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKC0xMjgxKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICk7CisgICAgICAgIGFyZ192ZWNfeHRydWN0cy5wdXNoKAorICAgICAgICAgICAgWHRydWN0IHsKKyAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoImJheiIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgwKSwKKyAgICAgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoMzk0ODUzOSksCisgICAgICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKC0xMjkzODQ5MiksCisgICAgICAgICAgICB9LAorICAgICAgICApOworCisgICAgICAgIGxldCBtdXQgc19jbXBfbmVzdGVkXzE6IEJUcmVlTWFwPE51bWJlcnosIEluc2FuaXR5PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbGV0IGluc2FuaXR5ID0gSW5zYW5pdHkgeworICAgICAgICAgICAgdXNlcl9tYXA6IFNvbWUoYXJnX21hcF91c2VybWFwKSwKKyAgICAgICAgICAgIHh0cnVjdHM6IFNvbWUoYXJnX3ZlY194dHJ1Y3RzKSwKKyAgICAgICAgfTsKKyAgICAgICAgc19jbXBfbmVzdGVkXzEuaW5zZXJ0KE51bWJlcno6OlR3bywgaW5zYW5pdHkuY2xvbmUoKSk7CisgICAgICAgIHNfY21wX25lc3RlZF8xLmluc2VydChOdW1iZXJ6OjpUaHJlZSwgaW5zYW5pdHkuY2xvbmUoKSk7CisKKyAgICAgICAgbGV0IG11dCBzX2NtcF9uZXN0ZWRfMjogQlRyZWVNYXA8TnVtYmVyeiwgSW5zYW5pdHk+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBsZXQgZW1wdHlfaW5zYW5pdHkgPSBJbnNhbml0eSB7CisgICAgICAgICAgICB1c2VyX21hcDogU29tZShCVHJlZU1hcDo6bmV3KCkpLAorICAgICAgICAgICAgeHRydWN0czogU29tZShWZWM6Om5ldygpKSwKKyAgICAgICAgfTsKKyAgICAgICAgc19jbXBfbmVzdGVkXzIuaW5zZXJ0KE51bWJlcno6OlNpeCwgZW1wdHlfaW5zYW5pdHkpOworCisgICAgICAgIGxldCBtdXQgc19jbXA6IEJUcmVlTWFwPFVzZXJJZCwgQlRyZWVNYXA8TnVtYmVyeiwgSW5zYW5pdHk+PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgc19jbXAuaW5zZXJ0KDEgYXMgVXNlcklkLCBzX2NtcF9uZXN0ZWRfMSk7CisgICAgICAgIHNfY21wLmluc2VydCgyIGFzIFVzZXJJZCwgc19jbXBfbmVzdGVkXzIpOworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfaW5zYW5pdHkoaW5zYW5pdHkuY2xvbmUoKSksIHNfY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RFeGNlcHRpb24gLSByZW1vdGUgdGhyb3dzIFhjZXB0aW9uIik7CisgICAgeworICAgICAgICBsZXQgciA9IHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2V4Y2VwdGlvbigiWGNlcHRpb24iLnRvX293bmVkKCkpOworICAgICAgICBsZXQgeCA9IG1hdGNoIHIgeworICAgICAgICAgICAgRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIocmVmIGUpKSA9PiB7CisgICAgICAgICAgICAgICAgbWF0Y2ggZS5kb3duY2FzdF9yZWY6OjxYY2VwdGlvbj4oKSB7CisgICAgICAgICAgICAgICAgICAgIFNvbWUoeCkgPT4gT2soeCksCisgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoImRpZCBub3QgZ2V0IGV4cGVjdGVkIFhjZXB0aW9uIHN0cnVjdCIuaW50bygpKSwpLAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF8gPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoImRpZCBub3QgZ2V0IGV4Y2VwdGlvbiIuaW50bygpKSksCisgICAgICAgIH0/OworCisgICAgICAgIGxldCB4X2NtcCA9IFhjZXB0aW9uIHsKKyAgICAgICAgICAgIGVycm9yX2NvZGU6IFNvbWUoMTAwMSksCisgICAgICAgICAgICBtZXNzYWdlOiBTb21lKCJYY2VwdGlvbiIudG9fb3duZWQoKSksCisgICAgICAgIH07CisKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdChPayh4KSwgJnhfY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RFeGNlcHRpb24gLSByZW1vdGUgdGhyb3dzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpOworICAgIHsKKyAgICAgICAgbGV0IHIgPSB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9leGNlcHRpb24oIlRFeGNlcHRpb24iLnRvX293bmVkKCkpOworICAgICAgICBtYXRjaCByIHsKKyAgICAgICAgICAgIEVycih0aHJpZnQ6OkVycm9yOjpBcHBsaWNhdGlvbihyZWYgZSkpID0+IHsKKyAgICAgICAgICAgICAgICBpbmZvISgicmVjZWl2ZWQgYW4gezo/fSIsIGUpOworICAgICAgICAgICAgICAgIE9rKCgpKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgXyA9PiBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcigiZGlkIG5vdCBnZXQgZXhjZXB0aW9uIi5pbnRvKCkpKSwKKyAgICAgICAgfT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RFeGNlcHRpb24gLSByZW1vdGUgc3VjY2VlZHMiKTsKKyAgICB7CisgICAgICAgIGxldCByID0gdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfZXhjZXB0aW9uKCJmb28iLnRvX293bmVkKCkpOworICAgICAgICBtYXRjaCByIHsKKyAgICAgICAgICAgIE9rKF8pID0+IE9rKCgpKSwKKyAgICAgICAgICAgIF8gPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoInJlY2VpdmVkIGFuIGV4Y2VwdGlvbiIuaW50bygpKSksCisgICAgICAgIH0/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0TXVsdGlFeGNlcHRpb24gLSByZW1vdGUgdGhyb3dzIFhjZXB0aW9uIik7CisgICAgeworICAgICAgICBsZXQgciA9CisgICAgICAgICAgICB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9tdWx0aV9leGNlcHRpb24oIlhjZXB0aW9uIi50b19vd25lZCgpLCAiaWdub3JlZCIudG9fb3duZWQoKSk7CisgICAgICAgIGxldCB4ID0gbWF0Y2ggciB7CisgICAgICAgICAgICBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcihyZWYgZSkpID0+IHsKKyAgICAgICAgICAgICAgICBtYXRjaCBlLmRvd25jYXN0X3JlZjo6PFhjZXB0aW9uPigpIHsKKyAgICAgICAgICAgICAgICAgICAgU29tZSh4KSA9PiBPayh4KSwKKyAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcigiZGlkIG5vdCBnZXQgZXhwZWN0ZWQgWGNlcHRpb24gc3RydWN0Ii5pbnRvKCkpLCksCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgXyA9PiBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcigiZGlkIG5vdCBnZXQgZXhjZXB0aW9uIi5pbnRvKCkpKSwKKyAgICAgICAgfT87CisKKyAgICAgICAgbGV0IHhfY21wID0gWGNlcHRpb24geworICAgICAgICAgICAgZXJyb3JfY29kZTogU29tZSgxMDAxKSwKKyAgICAgICAgICAgIG1lc3NhZ2U6IFNvbWUoIlRoaXMgaXMgYW4gWGNlcHRpb24iLnRvX293bmVkKCkpLAorICAgICAgICB9OworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQoT2soeCksICZ4X2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0TXVsdGlFeGNlcHRpb24gLSByZW1vdGUgdGhyb3dzIFhjZXB0aW9uMiIpOworICAgIHsKKyAgICAgICAgbGV0IHIgPQorICAgICAgICAgICAgdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfbXVsdGlfZXhjZXB0aW9uKCJYY2VwdGlvbjIiLnRvX293bmVkKCksICJpZ25vcmVkIi50b19vd25lZCgpKTsKKyAgICAgICAgbGV0IHggPSBtYXRjaCByIHsKKyAgICAgICAgICAgIEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKHJlZiBlKSkgPT4geworICAgICAgICAgICAgICAgIG1hdGNoIGUuZG93bmNhc3RfcmVmOjo8WGNlcHRpb24yPigpIHsKKyAgICAgICAgICAgICAgICAgICAgU29tZSh4KSA9PiBPayh4KSwKKyAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcigiZGlkIG5vdCBnZXQgZXhwZWN0ZWQgWGNlcHRpb24gc3RydWN0Ii5pbnRvKCkpLCksCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgXyA9PiBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcigiZGlkIG5vdCBnZXQgZXhjZXB0aW9uIi5pbnRvKCkpKSwKKyAgICAgICAgfT87CisKKyAgICAgICAgbGV0IHhfY21wID0gWGNlcHRpb24yIHsKKyAgICAgICAgICAgIGVycm9yX2NvZGU6IFNvbWUoMjAwMiksCisgICAgICAgICAgICBzdHJ1Y3RfdGhpbmc6IFNvbWUoCisgICAgICAgICAgICAgICAgWHRydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJUaGlzIGlzIGFuIFhjZXB0aW9uMiIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgYW4gT1BUX0lOX1JFUV9PVVQgZmllbGQgdGhlIHNlbmRlciBzZXRzIGEgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDApLAorICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGFuIE9QVF9JTl9SRVFfT1VUIGZpZWxkIHRoZSBzZW5kZXIgc2V0cyBhIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDApLAorICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGFuIE9QVF9JTl9SRVFfT1VUIGZpZWxkIHRoZSBzZW5kZXIgc2V0cyBhIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKDApLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICApLAorICAgICAgICB9OworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQoT2soeCksICZ4X2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0TXVsdGlFeGNlcHRpb24gLSByZW1vdGUgc3VjY2VlZHMiKTsKKyAgICB7CisgICAgICAgIGxldCByID0gdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfbXVsdGlfZXhjZXB0aW9uKCJoYWhhIi50b19vd25lZCgpLCAiUkVUVVJORUQiLnRvX293bmVkKCkpOworICAgICAgICBsZXQgeCA9IG1hdGNoIHIgeworICAgICAgICAgICAgRXJyKGUpID0+IEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKGZvcm1hdCEoInJlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIHs6P30iLCBlKS5pbnRvKCksKSwpLAorICAgICAgICAgICAgXyA9PiByLAorICAgICAgICB9PzsKKworICAgICAgICBsZXQgeF9jbXAgPSBYdHJ1Y3QgeworICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJSRVRVUk5FRCIudG9fb3duZWQoKSksCisgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGFuIE9QVF9JTl9SRVFfT1VUIGZpZWxkIHRoZSBzZW5kZXIgc2V0cyBhIGRlZmF1bHQKKyAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoMCksCisgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGFuIE9QVF9JTl9SRVFfT1VUIGZpZWxkIHRoZSBzZW5kZXIgc2V0cyBhIGRlZmF1bHQKKyAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgwKSwKKyAgICAgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgYW4gT1BUX0lOX1JFUV9PVVQgZmllbGQgdGhlIHNlbmRlciBzZXRzIGEgZGVmYXVsdAorICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKDApLAorICAgICAgICB9OworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQoT2soeCksIHhfY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RPbmVXYXkgLSByZW1vdGUgc2xlZXBzIGZvciAxIHNlY29uZCIpOworICAgIHsKKyAgICAgICAgdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3Rfb25ld2F5KDEpPzsKKyAgICB9CisKKyAgICAvLyBmaW5hbCB0ZXN0IHRvIHZlcmlmeSB0aGF0IHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIHdyaXRhYmxlIGFmdGVyIHRoZSBvbmUtd2F5CisgICAgLy8gY2FsbAorICAgIHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X3ZvaWQoKQorfQorCisjW2NmZ19hdHRyKGZlYXR1cmUgPSAiY2FyZ28tY2xpcHB5IiwgYWxsb3cobmVlZGxlc3NfcGFzc19ieV92YWx1ZSkpXQorZm4gdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdDxUOiBEZWJ1ZyArIFBhcnRpYWxFcSArIFNpemVkPigKKyAgICBhY3R1YWw6IFJlc3VsdDxULCB0aHJpZnQ6OkVycm9yPiwKKyAgICBleHBlY3RlZDogVCwKKykgLT4gUmVzdWx0PCgpLCB0aHJpZnQ6OkVycm9yPiB7CisgICAgaW5mbyEoIioqKiBFWFBFQ1RFRDogT2soezo/fSkiLCBleHBlY3RlZCk7CisgICAgaW5mbyEoIioqKiBBQ1RVQUwgIDogezo/fSIsIGFjdHVhbCk7CisgICAgbWF0Y2ggYWN0dWFsIHsKKyAgICAgICAgT2sodikgPT4geworICAgICAgICAgICAgaWYgdiA9PSBleHBlY3RlZCB7CisgICAgICAgICAgICAgICAgaW5mbyEoIioqKiBPSyAqKioiKTsKKyAgICAgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5mbyEoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoZm9ybWF0ISgiZXhwZWN0ZWQgezo/fSBidXQgZ290IHs6P30iLCAmZXhwZWN0ZWQsICZ2KS5pbnRvKCkpLCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBFcnIoZSkgPT4gRXJyKGUpLAorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvcnMvc3JjL2Jpbi90ZXN0X3NlcnZlci5ycyBiL3Rlc3QvcnMvc3JjL2Jpbi90ZXN0X3NlcnZlci5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWMxZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ycy9zcmMvYmluL3Rlc3Rfc2VydmVyLnJzCkBAIC0wLDAgKzEsMzk4IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNbbWFjcm9fdXNlXQorZXh0ZXJuIGNyYXRlIGxvZzsKK2V4dGVybiBjcmF0ZSBlbnZfbG9nZ2VyOworCisjW21hY3JvX3VzZV0KK2V4dGVybiBjcmF0ZSBjbGFwOworZXh0ZXJuIGNyYXRlIG9yZGVyZWRfZmxvYXQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0OworZXh0ZXJuIGNyYXRlIHRocmlmdF90ZXN0OworCit1c2Ugb3JkZXJlZF9mbG9hdDo6T3JkZXJlZEZsb2F0OwordXNlIHN0ZDo6Y29sbGVjdGlvbnM6OntCVHJlZU1hcCwgQlRyZWVTZXR9OwordXNlIHN0ZDo6dGhyZWFkOwordXNlIHN0ZDo6dGltZTo6RHVyYXRpb247CisKK3VzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5LCBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5LCBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgVElucHV0UHJvdG9jb2xGYWN0b3J5LCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5fTsKK3VzZSB0aHJpZnQ6OnNlcnZlcjo6e1RNdWx0aXBsZXhlZFByb2Nlc3NvciwgVFNlcnZlcn07Cit1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntUQnVmZmVyZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgVFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5fTsKK3VzZSB0aHJpZnRfdGVzdDo6KjsKKworZm4gbWFpbigpIHsKKyAgICBlbnZfbG9nZ2VyOjppbml0KCkuZXhwZWN0KCJsb2dnZXIgc2V0dXAgZmFpbGVkIik7CisKKyAgICBkZWJ1ZyEoImluaXRpYWxpemVkIGxvZ2dlciAtIHJ1bm5pbmcgY3Jvc3MtdGVzdCBzZXJ2ZXIiKTsKKworICAgIG1hdGNoIHJ1bigpIHsKKyAgICAgICAgT2soKCkpID0+IGluZm8hKCJjcm9zcy10ZXN0IHNlcnZlciBzdWNjZWVkZWQiKSwKKyAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgIGluZm8hKCJjcm9zcy10ZXN0IHNlcnZlciBmYWlsZWQgd2l0aCBlcnJvciB7Oj99IiwgZSk7CisgICAgICAgICAgICBzdGQ6OnByb2Nlc3M6OmV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ZuIHJ1bigpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisKKyAgICAvLyB1bnN1cHBvcnRlZCBvcHRpb25zOgorICAgIC8vIC0tZG9tYWluLXNvY2tldAorICAgIC8vIC0tbmFtZWQtcGlwZQorICAgIC8vIC0tc3NsCisgICAgbGV0IG1hdGNoZXMgPSBjbGFwX2FwcCEocnVzdF90ZXN0X2NsaWVudCA9PgorICAgICAgICAodmVyc2lvbjogIjEuMCIpCisgICAgICAgIChhdXRob3I6ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iKQorICAgICAgICAoYWJvdXQ6ICJSdXN0IFRocmlmdCB0ZXN0IHNlcnZlciIpCisgICAgICAgIChAYXJnIHBvcnQ6IC0tcG9ydCArdGFrZXNfdmFsdWUgInBvcnQgb24gd2hpY2ggdGhlIHRlc3Qgc2VydmVyIGxpc3RlbnMiKQorICAgICAgICAoQGFyZyB0cmFuc3BvcnQ6IC0tdHJhbnNwb3J0ICt0YWtlc192YWx1ZSAidHJhbnNwb3J0IGltcGxlbWVudGF0aW9uIHRvIHVzZSAoXCJidWZmZXJlZFwiLCBcImZyYW1lZFwiKSIpCisgICAgICAgIChAYXJnIHByb3RvY29sOiAtLXByb3RvY29sICt0YWtlc192YWx1ZSAicHJvdG9jb2wgaW1wbGVtZW50YXRpb24gdG8gdXNlIChcImJpbmFyeVwiLCBcImNvbXBhY3RcIikiKQorICAgICAgICAoQGFyZyBzZXJ2ZXJfdHlwZTogLS1zZXJ2ZXJfdHlwZSArdGFrZXNfdmFsdWUgInR5cGUgb2Ygc2VydmVyIGluc3RhbnRpYXRlZCAoXCJzaW1wbGVcIiwgXCJ0aHJlYWQtcG9vbFwiKSIpCisgICAgICAgIChAYXJnIHdvcmtlcnM6IC1uIC0td29ya2VycyArdGFrZXNfdmFsdWUgIm51bWJlciBvZiB0aHJlYWQtcG9vbCB3b3JrZXJzIChcIjRcIikiKQorICAgICkKKyAgICAgICAgICAgIC5nZXRfbWF0Y2hlcygpOworCisgICAgbGV0IHBvcnQgPSB2YWx1ZV90IShtYXRjaGVzLCAicG9ydCIsIHUxNikudW53cmFwX29yKDkwOTApOworICAgIGxldCB0cmFuc3BvcnQgPSBtYXRjaGVzLnZhbHVlX29mKCJ0cmFuc3BvcnQiKS51bndyYXBfb3IoImJ1ZmZlcmVkIik7CisgICAgbGV0IHByb3RvY29sID0gbWF0Y2hlcy52YWx1ZV9vZigicHJvdG9jb2wiKS51bndyYXBfb3IoImJpbmFyeSIpOworICAgIGxldCBzZXJ2ZXJfdHlwZSA9IG1hdGNoZXMudmFsdWVfb2YoInNlcnZlcl90eXBlIikudW53cmFwX29yKCJ0aHJlYWQtcG9vbCIpOworICAgIGxldCB3b3JrZXJzID0gdmFsdWVfdCEobWF0Y2hlcywgIndvcmtlcnMiLCB1c2l6ZSkudW53cmFwX29yKDQpOworICAgIGxldCBsaXN0ZW5fYWRkcmVzcyA9IGZvcm1hdCEoIjEyNy4wLjAuMTp7fSIsIHBvcnQpOworCisgICAgaW5mbyEoImJpbmRpbmcgdG8ge30iLCBsaXN0ZW5fYWRkcmVzcyk7CisKKyAgICBsZXQgKGlfdHJhbnNwb3J0X2ZhY3RvcnksIG9fdHJhbnNwb3J0X2ZhY3RvcnkpOiAoQm94PFRSZWFkVHJhbnNwb3J0RmFjdG9yeT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJveDxUV3JpdGVUcmFuc3BvcnRGYWN0b3J5PikgPQorICAgICAgICBtYXRjaCAmKnRyYW5zcG9ydCB7CisgICAgICAgICAgICAiYnVmZmVyZWQiID0+IHsKKyAgICAgICAgICAgICAgICAoQm94OjpuZXcoVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpKSwKKyAgICAgICAgICAgICAgICAgQm94OjpuZXcoVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5OjpuZXcoKSkpCisgICAgICAgICAgICB9CisgICAgICAgICAgICAiZnJhbWVkIiA9PiB7CisgICAgICAgICAgICAgICAgKEJveDo6bmV3KFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCkpLAorICAgICAgICAgICAgICAgICBCb3g6Om5ldyhURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5OjpuZXcoKSkpCisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bmtub3duID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXJyKGZvcm1hdCEoInVuc3VwcG9ydGVkIHRyYW5zcG9ydCB0eXBlIHt9IiwgdW5rbm93bikuaW50bygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIGxldCAoaV9wcm90b2NvbF9mYWN0b3J5LCBvX3Byb3RvY29sX2ZhY3RvcnkpOiAoQm94PFRJbnB1dFByb3RvY29sRmFjdG9yeT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3g8VE91dHB1dFByb3RvY29sRmFjdG9yeT4pID0KKyAgICAgICAgbWF0Y2ggJipwcm90b2NvbCB7CisgICAgICAgICAgICAiYmluYXJ5IiB8ICJtdWx0aSIgfCAibXVsdGk6YmluYXJ5IiA9PiB7CisgICAgICAgICAgICAgICAgKEJveDo6bmV3KFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCkpLAorICAgICAgICAgICAgICAgICBCb3g6Om5ldyhUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSkpCisgICAgICAgICAgICB9CisgICAgICAgICAgICAiY29tcGFjdCIgfCAibXVsdGljIiB8ICJtdWx0aTpjb21wYWN0IiA9PiB7CisgICAgICAgICAgICAgICAgKEJveDo6bmV3KFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKSwKKyAgICAgICAgICAgICAgICAgQm94OjpuZXcoVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVua25vd24gPT4geworICAgICAgICAgICAgICAgIHJldHVybiBFcnIoZm9ybWF0ISgidW5zdXBwb3J0ZWQgdHJhbnNwb3J0IHR5cGUge30iLCB1bmtub3duKS5pbnRvKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgbGV0IHRlc3RfcHJvY2Vzc29yID0gVGhyaWZ0VGVzdFN5bmNQcm9jZXNzb3I6Om5ldyhUaHJpZnRUZXN0U3luY0hhbmRsZXJJbXBsIHt9KTsKKworICAgIG1hdGNoICYqc2VydmVyX3R5cGUgeworICAgICAgICAic2ltcGxlIiB8ICJ0aHJlYWQtcG9vbCIgPT4geworICAgICAgICAgICAgaWYgcHJvdG9jb2wgPT0gIm11bHRpIiB8fCBwcm90b2NvbCA9PSAibXVsdGljIiB7CisgICAgICAgICAgICAgICAgbGV0IHNlY29uZF9zZXJ2aWNlX3Byb2Nlc3NvciA9IFNlY29uZFNlcnZpY2VTeW5jUHJvY2Vzc29yOjpuZXcoU2Vjb25kU2VydmljZVN5bmNIYW5kbGVySW1wbCB7fSwpOworCisgICAgICAgICAgICAgICAgbGV0IG11dCBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgPSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6Om5ldygpOworICAgICAgICAgICAgICAgIG11bHRpcGxleGVkX3Byb2Nlc3NvcgorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIoIlRocmlmdFRlc3QiLCBCb3g6Om5ldyh0ZXN0X3Byb2Nlc3NvciksIHRydWUpPzsKKyAgICAgICAgICAgICAgICBtdWx0aXBsZXhlZF9wcm9jZXNzb3IKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKCJTZWNvbmRTZXJ2aWNlIiwgQm94OjpuZXcoc2Vjb25kX3NlcnZpY2VfcHJvY2Vzc29yKSwgZmFsc2UpPzsKKworICAgICAgICAgICAgICAgIGxldCBtdXQgc2VydmVyID0gVFNlcnZlcjo6bmV3KAorICAgICAgICAgICAgICAgICAgICBpX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBpX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIG9fdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIG9fcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICB3b3JrZXJzLAorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICBzZXJ2ZXIubGlzdGVuKCZsaXN0ZW5fYWRkcmVzcykKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGV0IG11dCBzZXJ2ZXIgPSBUU2VydmVyOjpuZXcoCisgICAgICAgICAgICAgICAgICAgIGlfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIGlfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgb190cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgb19wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICB0ZXN0X3Byb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgd29ya2VycywKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgc2VydmVyLmxpc3RlbigmbGlzdGVuX2FkZHJlc3MpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdW5rbm93biA9PiBFcnIoZm9ybWF0ISgidW5zdXBwb3J0ZWQgc2VydmVyIHR5cGUge30iLCB1bmtub3duKS5pbnRvKCkpLAorICAgIH0KK30KKworc3RydWN0IFRocmlmdFRlc3RTeW5jSGFuZGxlckltcGw7CitpbXBsIFRocmlmdFRlc3RTeW5jSGFuZGxlciBmb3IgVGhyaWZ0VGVzdFN5bmNIYW5kbGVySW1wbCB7CisgICAgZm4gaGFuZGxlX3Rlc3Rfdm9pZCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgaW5mbyEoInRlc3RWb2lkKCkiKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3Rfc3RyaW5nKCZzZWxmLCB0aGluZzogU3RyaW5nKSAtPiB0aHJpZnQ6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgaW5mbyEoInRlc3RTdHJpbmcoe30pIiwgJnRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfYm9vbCgmc2VsZiwgdGhpbmc6IGJvb2wpIC0+IHRocmlmdDo6UmVzdWx0PGJvb2w+IHsKKyAgICAgICAgaW5mbyEoInRlc3RCb29sKHt9KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfYnl0ZSgmc2VsZiwgdGhpbmc6IGk4KSAtPiB0aHJpZnQ6OlJlc3VsdDxpOD4geworICAgICAgICBpbmZvISgidGVzdEJ5dGUoe30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9pMzIoJnNlbGYsIHRoaW5nOiBpMzIpIC0+IHRocmlmdDo6UmVzdWx0PGkzMj4geworICAgICAgICBpbmZvISgidGVzdGkzMih7fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X2k2NCgmc2VsZiwgdGhpbmc6IGk2NCkgLT4gdGhyaWZ0OjpSZXN1bHQ8aTY0PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0aTY0KHt9KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfZG91YmxlKCZzZWxmLCB0aGluZzogT3JkZXJlZEZsb2F0PGY2ND4pIC0+IHRocmlmdDo6UmVzdWx0PE9yZGVyZWRGbG9hdDxmNjQ+PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0RG91YmxlKHt9KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfYmluYXJ5KCZzZWxmLCB0aGluZzogVmVjPHU4PikgLT4gdGhyaWZ0OjpSZXN1bHQ8VmVjPHU4Pj4geworICAgICAgICBpbmZvISgidGVzdEJpbmFyeSh7Oj99KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3Rfc3RydWN0KCZzZWxmLCB0aGluZzogWHRydWN0KSAtPiB0aHJpZnQ6OlJlc3VsdDxYdHJ1Y3Q+IHsKKyAgICAgICAgaW5mbyEoInRlc3RTdHJ1Y3Qoezo/fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X25lc3QoJnNlbGYsIHRoaW5nOiBYdHJ1Y3QyKSAtPiB0aHJpZnQ6OlJlc3VsdDxYdHJ1Y3QyPiB7CisgICAgICAgIGluZm8hKCJ0ZXN0TmVzdCh7Oj99KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfbWFwKCZzZWxmLCB0aGluZzogQlRyZWVNYXA8aTMyLCBpMzI+KSAtPiB0aHJpZnQ6OlJlc3VsdDxCVHJlZU1hcDxpMzIsIGkzMj4+IHsKKyAgICAgICAgaW5mbyEoInRlc3RNYXAoezo/fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X3N0cmluZ19tYXAoCisgICAgICAgICZzZWxmLAorICAgICAgICB0aGluZzogQlRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+LAorICAgICkgLT4gdGhyaWZ0OjpSZXN1bHQ8QlRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0U3RyaW5nTWFwKHs6P30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9zZXQoJnNlbGYsIHRoaW5nOiBCVHJlZVNldDxpMzI+KSAtPiB0aHJpZnQ6OlJlc3VsdDxCVHJlZVNldDxpMzI+PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0U2V0KHs6P30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9saXN0KCZzZWxmLCB0aGluZzogVmVjPGkzMj4pIC0+IHRocmlmdDo6UmVzdWx0PFZlYzxpMzI+PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0TGlzdCh7Oj99KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfZW51bSgmc2VsZiwgdGhpbmc6IE51bWJlcnopIC0+IHRocmlmdDo6UmVzdWx0PE51bWJlcno+IHsKKyAgICAgICAgaW5mbyEoInRlc3RFbnVtKHs6P30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF90eXBlZGVmKCZzZWxmLCB0aGluZzogVXNlcklkKSAtPiB0aHJpZnQ6OlJlc3VsdDxVc2VySWQ+IHsKKyAgICAgICAgaW5mbyEoInRlc3RUeXBlZGVmKHt9KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgLy8vIEByZXR1cm4gbWFwPGkzMixtYXA8aTMyLGkzMj4+IC0gcmV0dXJucyBhIGRpY3Rpb25hcnkgd2l0aCB0aGVzZSB2YWx1ZXM6CisgICAgLy8vIHstNCA9PiB7LTQgPT4gLTQsIC0zID0+IC0zLCAtMiA9PiAtMiwgLTEgPT4gLTEsIH0sIDQgPT4gezEgPT4gMSwgMiA9PgorICAgIC8vLyAyLCAzID0+IDMsIDQgPT4gNCwgfSwgfQorICAgIGZuIGhhbmRsZV90ZXN0X21hcF9tYXAoJnNlbGYsIGhlbGxvOiBpMzIpIC0+IHRocmlmdDo6UmVzdWx0PEJUcmVlTWFwPGkzMiwgQlRyZWVNYXA8aTMyLCBpMzI+Pj4geworICAgICAgICBpbmZvISgidGVzdE1hcE1hcCh7fSkiLCBoZWxsbyk7CisKKyAgICAgICAgbGV0IG11dCBpbm5lcl9tYXBfMDogQlRyZWVNYXA8aTMyLCBpMzI+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBmb3IgaSBpbiAtNC4uKDAgYXMgaTMyKSB7CisgICAgICAgICAgICBpbm5lcl9tYXBfMC5pbnNlcnQoaSwgaSk7CisgICAgICAgIH0KKworICAgICAgICBsZXQgbXV0IGlubmVyX21hcF8xOiBCVHJlZU1hcDxpMzIsIGkzMj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIGZvciBpIGluIDEuLjUgeworICAgICAgICAgICAgaW5uZXJfbWFwXzEuaW5zZXJ0KGksIGkpOworICAgICAgICB9CisKKyAgICAgICAgbGV0IG11dCByZXRfbWFwOiBCVHJlZU1hcDxpMzIsIEJUcmVlTWFwPGkzMiwgaTMyPj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIHJldF9tYXAuaW5zZXJ0KC00LCBpbm5lcl9tYXBfMCk7CisgICAgICAgIHJldF9tYXAuaW5zZXJ0KDQsIGlubmVyX21hcF8xKTsKKworICAgICAgICBPayhyZXRfbWFwKQorICAgIH0KKworICAgIC8vLyBDcmVhdGVzIGEgdGhlIHJldHVybmVkIG1hcCB3aXRoIHRoZXNlIHZhbHVlcyBhbmQgcHJpbnRzIGl0IG91dDoKKyAgICAvLy8gICAgIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisgICAgLy8vICAgICAgICAgICAgICAzID0+IGFyZ3VtZW50LAorICAgIC8vLyAgICAgICAgICAgIH0sCisgICAgLy8vICAgICAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAorICAgIC8vLyAgICAgfQorICAgIC8vLyByZXR1cm4gbWFwPFVzZXJJZCwgbWFwPE51bWJlcnosSW5zYW5pdHk+PiAtIGEgbWFwIHdpdGggdGhlIGFib3ZlIHZhbHVlcworICAgIGZuIGhhbmRsZV90ZXN0X2luc2FuaXR5KAorICAgICAgICAmc2VsZiwKKyAgICAgICAgYXJndW1lbnQ6IEluc2FuaXR5LAorICAgICkgLT4gdGhyaWZ0OjpSZXN1bHQ8QlRyZWVNYXA8VXNlcklkLCBCVHJlZU1hcDxOdW1iZXJ6LCBJbnNhbml0eT4+PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0SW5zYW5pdHkoezo/fSkiLCBhcmd1bWVudCk7CisgICAgICAgIGxldCBtdXQgbWFwXzA6IEJUcmVlTWFwPE51bWJlcnosIEluc2FuaXR5PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbWFwXzAuaW5zZXJ0KE51bWJlcno6OlR3bywgYXJndW1lbnQuY2xvbmUoKSk7CisgICAgICAgIG1hcF8wLmluc2VydChOdW1iZXJ6OjpUaHJlZSwgYXJndW1lbnQuY2xvbmUoKSk7CisKKyAgICAgICAgbGV0IG11dCBtYXBfMTogQlRyZWVNYXA8TnVtYmVyeiwgSW5zYW5pdHk+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBsZXQgaW5zYW5pdHkgPSBJbnNhbml0eSB7CisgICAgICAgICAgICB1c2VyX21hcDogTm9uZSwKKyAgICAgICAgICAgIHh0cnVjdHM6IE5vbmUsCisgICAgICAgIH07CisgICAgICAgIG1hcF8xLmluc2VydChOdW1iZXJ6OjpTaXgsIGluc2FuaXR5KTsKKworICAgICAgICBsZXQgbXV0IHJldDogQlRyZWVNYXA8VXNlcklkLCBCVHJlZU1hcDxOdW1iZXJ6LCBJbnNhbml0eT4+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICByZXQuaW5zZXJ0KDEsIG1hcF8wKTsKKyAgICAgICAgcmV0Lmluc2VydCgyLCBtYXBfMSk7CisKKyAgICAgICAgT2socmV0KQorICAgIH0KKworICAgIC8vLyByZXR1cm5zIGFuIFh0cnVjdCB3aXRoOgorICAgIC8vLyBzdHJpbmdfdGhpbmcgPSAiSGVsbG8yIiwgYnl0ZV90aGluZyA9IGFyZzAsIGkzMl90aGluZyA9IGFyZzEgYW5kCisgICAgLy8vIGk2NF90aGluZyA9IGFyZzIKKyAgICBmbiBoYW5kbGVfdGVzdF9tdWx0aSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIGFyZzA6IGk4LAorICAgICAgICBhcmcxOiBpMzIsCisgICAgICAgIGFyZzI6IGk2NCwKKyAgICAgICAgXzogQlRyZWVNYXA8aTE2LCBTdHJpbmc+LAorICAgICAgICBfOiBOdW1iZXJ6LAorICAgICAgICBfOiBVc2VySWQsCisgICAgKSAtPiB0aHJpZnQ6OlJlc3VsdDxYdHJ1Y3Q+IHsKKyAgICAgICAgbGV0IHhfcmV0ID0gWHRydWN0IHsKKyAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiSGVsbG8yIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoYXJnMCksCisgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoYXJnMSksCisgICAgICAgICAgICBpNjRfdGhpbmc6IFNvbWUoYXJnMiksCisgICAgICAgIH07CisKKyAgICAgICAgT2soeF9yZXQpCisgICAgfQorCisgICAgLy8vIGlmIGFyZyA9PSAiWGNlcHRpb24iIHRocm93IFhjZXB0aW9uIHdpdGggZXJyb3JDb2RlID0gMTAwMSBhbmQgbWVzc2FnZSA9CisgICAgLy8vIGFyZworICAgIC8vLyBlbHNlIGlmIGFyZyA9PSAiVEV4Y2VwdGlvbiIgdGhyb3cgVEV4Y2VwdGlvbgorICAgIC8vLyBlbHNlIGRvIG5vdCB0aHJvdyBhbnl0aGluZworICAgIGZuIGhhbmRsZV90ZXN0X2V4Y2VwdGlvbigmc2VsZiwgYXJnOiBTdHJpbmcpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGluZm8hKCJ0ZXN0RXhjZXB0aW9uKHt9KSIsIGFyZyk7CisKKyAgICAgICAgbWF0Y2ggJiphcmcgeworICAgICAgICAgICAgIlhjZXB0aW9uIiA9PiB7CisgICAgICAgICAgICAgICAgRXJyKAorICAgICAgICAgICAgICAgICAgICAoWGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlOiBTb21lKDEwMDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBTb21lKGFyZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pbnRvKCksCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgIlRFeGNlcHRpb24iID0+IEVycigidGhpcyBpcyBhIHJhbmRvbSBlcnJvciIuaW50bygpKSwKKyAgICAgICAgICAgIF8gPT4gT2soKCkpLAorICAgICAgICB9CisgICAgfQorCisgICAgLy8vIGlmIGFyZzAgPT0gIlhjZXB0aW9uIjoKKyAgICAvLy8gdGhyb3cgWGNlcHRpb24gd2l0aCBlcnJvckNvZGUgPSAxMDAxIGFuZCBtZXNzYWdlID0gIlRoaXMgaXMgYW4KKyAgICAvLy8gWGNlcHRpb24iCisgICAgLy8vIGVsc2UgaWYgYXJnMCA9PSAiWGNlcHRpb24yIjoKKyAgICAvLy8gdGhyb3cgWGNlcHRpb24yIHdpdGggZXJyb3JDb2RlID0gMjAwMiBhbmQgc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9CisgICAgLy8vICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIKKyAgICAvLyBlbHNlOgorICAgIC8vICAgZG8gbm90IHRocm93IGFueXRoaW5nIGFuZCByZXR1cm4gWHRydWN0IHdpdGggc3RyaW5nX3RoaW5nID0gYXJnMQorICAgIGZuIGhhbmRsZV90ZXN0X211bHRpX2V4Y2VwdGlvbigmc2VsZiwgYXJnMDogU3RyaW5nLCBhcmcxOiBTdHJpbmcpIC0+IHRocmlmdDo6UmVzdWx0PFh0cnVjdD4geworICAgICAgICBtYXRjaCAmKmFyZzAgeworICAgICAgICAgICAgIlhjZXB0aW9uIiA9PiB7CisgICAgICAgICAgICAgICAgRXJyKAorICAgICAgICAgICAgICAgICAgICAoWGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlOiBTb21lKDEwMDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBTb21lKCJUaGlzIGlzIGFuIFhjZXB0aW9uIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgLmludG8oKSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9CisgICAgICAgICAgICAiWGNlcHRpb24yIiA9PiB7CisgICAgICAgICAgICAgICAgRXJyKAorICAgICAgICAgICAgICAgICAgICAoWGNlcHRpb24yIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZTogU29tZSgyMDAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3RoaW5nOiBTb21lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFh0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiVGhpcyBpcyBhbiBYY2VwdGlvbjIiLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nOiBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmc6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZzogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgLmludG8oKSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9CisgICAgICAgICAgICBfID0+IHsKKyAgICAgICAgICAgICAgICBPaygKKyAgICAgICAgICAgICAgICAgICAgWHRydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZShhcmcxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmc6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmc6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmc6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3Rfb25ld2F5KCZzZWxmLCBzZWNvbmRzX3RvX3NsZWVwOiBpMzIpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHRocmVhZDo6c2xlZXAoRHVyYXRpb246OmZyb21fc2VjcyhzZWNvbmRzX3RvX3NsZWVwIGFzIHU2NCkpOworICAgICAgICBPaygoKSkKKyAgICB9Cit9CisKK3N0cnVjdCBTZWNvbmRTZXJ2aWNlU3luY0hhbmRsZXJJbXBsOworaW1wbCBTZWNvbmRTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIFNlY29uZFNlcnZpY2VTeW5jSGFuZGxlckltcGwgeworICAgIGZuIGhhbmRsZV9zZWNvbmR0ZXN0X3N0cmluZygmc2VsZiwgdGhpbmc6IFN0cmluZykgLT4gdGhyaWZ0OjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgIGluZm8hKCIoc2Vjb25kKXRlc3RTdHJpbmcoe30pIiwgJnRoaW5nKTsKKyAgICAgICAgbGV0IHJldCA9IGZvcm1hdCEoInRlc3RTdHJpbmcoXCJ7fVwiKSIsICZ0aGluZyk7CisgICAgICAgIE9rKHJldCkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3JzL3NyYy9saWIucnMgYi90ZXN0L3JzL3NyYy9saWIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc5YmY5MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcnMvc3JjL2xpYi5ycwpAQCAtMCwwICsxLDIzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2V4dGVybiBjcmF0ZSBvcmRlcmVkX2Zsb2F0OworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0cnlfZnJvbTsKKworbW9kIHRocmlmdF90ZXN0OworcHViIHVzZSB0aHJpZnRfdGVzdDo6KjsKZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdC5weSBiL3Rlc3QvdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNTkyNTZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC90ZXN0LnB5CkBAIC0wLDAgKzEsMTkyIEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyBBcGFjaGUgVGhyaWZ0IC0gaW50ZWdyYXRpb24gKGNyb3NzKSB0ZXN0IHN1aXRlCisjCisjIHRlc3RzIGRpZmZlcmVudCBzZXJ2ZXItY2xpZW50LCBwcm90b2NvbCBhbmQgdHJhbnNwb3J0IGNvbWJpbmF0aW9ucworIworIyBUaGlzIHNjcmlwdCByZXF1aXJlcyBweXRob24gMy54IGR1ZSB0byB0aGUgaW1wcm92ZW1lbnRzIGluCisjIHN1YnByb2Nlc3MgbWFuYWdlbWVudCB0aGF0IGFyZSBuZWVkZWQgZm9yIHJlbGlhYmlsaXR5LgorIworCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY2hhaW4KK2ltcG9ydCBqc29uCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG11bHRpcHJvY2Vzc2luZworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworaW1wb3J0IGNyb3NzcnVubmVyCitmcm9tIGNyb3NzcnVubmVyLmNvbXBhdCBpbXBvcnQgcGF0aF9qb2luCisKKyMgMy4zIGludHJvZHVjZWQgc3VicHJvY2VzcyB0aW1lb3V0cyBvbiB3YWl0aW5nIGZvciBjaGlsZAorcmVxX3ZlcnNpb24gPSAoMywgMykKK2N1cl92ZXJzaW9uID0gc3lzLnZlcnNpb25faW5mbworYXNzZXJ0IChjdXJfdmVyc2lvbiA+PSByZXFfdmVyc2lvbiksICJQeXRob24gMy4zIG9yIGxhdGVyIGlzIHJlcXVpcmVkIGZvciBwcm9wZXIgb3BlcmF0aW9uLiIKKworCitST09UX0RJUiA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLnJlYWxwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpKQorVEVTVF9ESVJfUkVMQVRJVkUgPSAndGVzdCcKK1RFU1RfRElSID0gcGF0aF9qb2luKFJPT1RfRElSLCBURVNUX0RJUl9SRUxBVElWRSkKK0ZFQVRVUkVfRElSX1JFTEFUSVZFID0gcGF0aF9qb2luKFRFU1RfRElSX1JFTEFUSVZFLCAnZmVhdHVyZXMnKQorQ09ORklHX0ZJTEUgPSAndGVzdHMuanNvbicKKworCitkZWYgcnVuX2Nyb3NzX3Rlc3RzKHNlcnZlcl9tYXRjaCwgY2xpZW50X21hdGNoLCBqb2JzLCBza2lwX2tub3duX2ZhaWx1cmVzLCBvbmx5X2tub3duX2ZhaWx1cmVzLCByZXRyeV9jb3VudCwgcmVnZXgpOgorICAgIGxvZ2dlciA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICBsb2dnZXIuZGVidWcoJ0NvbGxlY3RpbmcgdGVzdHMnKQorICAgIHdpdGggb3BlbihwYXRoX2pvaW4oVEVTVF9ESVIsIENPTkZJR19GSUxFKSwgJ3InKSBhcyBmcDoKKyAgICAgICAgaiA9IGpzb24ubG9hZChmcCkKKyAgICB0ZXN0cyA9IGNyb3NzcnVubmVyLmNvbGxlY3RfY3Jvc3NfdGVzdHMoaiwgc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2gsIHJlZ2V4KQorICAgIGlmIG5vdCB0ZXN0czoKKyAgICAgICAgcHJpbnQoJ05vIHRlc3QgZm91bmQgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYScsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcHJpbnQoJyAgc2VydmVyczogJXMnICUgc2VydmVyX21hdGNoLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHByaW50KCcgIGNsaWVudHM6ICVzJyAlIGNsaWVudF9tYXRjaCwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBpZiBvbmx5X2tub3duX2ZhaWx1cmVzOgorICAgICAgICBsb2dnZXIuZGVidWcoJ09ubHkgcnVubmluZyBrbm93biBmYWlsdXJlcycpCisgICAgICAgIGtub3duID0gY3Jvc3NydW5uZXIubG9hZF9rbm93bl9mYWlsdXJlcyhURVNUX0RJUikKKyAgICAgICAgdGVzdHMgPSBsaXN0KGZpbHRlcihsYW1iZGEgdDogY3Jvc3NydW5uZXIudGVzdF9uYW1lKCoqdCkgaW4ga25vd24sIHRlc3RzKSkKKyAgICBpZiBza2lwX2tub3duX2ZhaWx1cmVzOgorICAgICAgICBsb2dnZXIuZGVidWcoJ1NraXBwaW5nIGtub3duIGZhaWx1cmVzJykKKyAgICAgICAga25vd24gPSBjcm9zc3J1bm5lci5sb2FkX2tub3duX2ZhaWx1cmVzKFRFU1RfRElSKQorICAgICAgICB0ZXN0cyA9IGxpc3QoZmlsdGVyKGxhbWJkYSB0OiBjcm9zc3J1bm5lci50ZXN0X25hbWUoKip0KSBub3QgaW4ga25vd24sIHRlc3RzKSkKKworICAgIGRpc3BhdGNoZXIgPSBjcm9zc3J1bm5lci5UZXN0RGlzcGF0Y2hlcihURVNUX0RJUiwgUk9PVF9ESVIsIFRFU1RfRElSX1JFTEFUSVZFLCBqb2JzKQorICAgIGxvZ2dlci5kZWJ1ZygnRXhlY3V0aW5nICVkIHRlc3RzJyAlIGxlbih0ZXN0cykpCisgICAgdHJ5OgorICAgICAgICBmb3IgciBpbiBbZGlzcGF0Y2hlci5kaXNwYXRjaCh0ZXN0LCByZXRyeV9jb3VudCkgZm9yIHRlc3QgaW4gdGVzdHNdOgorICAgICAgICAgICAgci53YWl0KCkKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdXYWl0aW5nIGZvciBjb21wbGV0aW9uJykKKyAgICAgICAgcmV0dXJuIGRpc3BhdGNoZXIud2FpdCgpCisgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICAgIGxvZ2dlci5kZWJ1ZygnSW50ZXJydXB0ZWQsIHNodXR0aW5nIGRvd24nKQorICAgICAgICBkaXNwYXRjaGVyLnRlcm1pbmF0ZSgpCisgICAgICAgIHJldHVybiBGYWxzZQorCisKK2RlZiBydW5fZmVhdHVyZV90ZXN0cyhzZXJ2ZXJfbWF0Y2gsIGZlYXR1cmVfbWF0Y2gsIGpvYnMsIHNraXBfa25vd25fZmFpbHVyZXMsIG9ubHlfa25vd25fZmFpbHVyZXMsIHJldHJ5X2NvdW50LCByZWdleCk6CisgICAgYmFzZWRpciA9IHBhdGhfam9pbihST09UX0RJUiwgRkVBVFVSRV9ESVJfUkVMQVRJVkUpCisgICAgbG9nZ2VyID0gbXVsdGlwcm9jZXNzaW5nLmdldF9sb2dnZXIoKQorICAgIGxvZ2dlci5kZWJ1ZygnQ29sbGVjdGluZyB0ZXN0cycpCisgICAgd2l0aCBvcGVuKHBhdGhfam9pbihURVNUX0RJUiwgQ09ORklHX0ZJTEUpLCAncicpIGFzIGZwOgorICAgICAgICBqID0ganNvbi5sb2FkKGZwKQorICAgIHdpdGggb3BlbihwYXRoX2pvaW4oYmFzZWRpciwgQ09ORklHX0ZJTEUpLCAncicpIGFzIGZwOgorICAgICAgICBqMiA9IGpzb24ubG9hZChmcCkKKyAgICB0ZXN0cyA9IGNyb3NzcnVubmVyLmNvbGxlY3RfZmVhdHVyZV90ZXN0cyhqLCBqMiwgc2VydmVyX21hdGNoLCBmZWF0dXJlX21hdGNoLCByZWdleCkKKyAgICBpZiBub3QgdGVzdHM6CisgICAgICAgIHByaW50KCdObyB0ZXN0IGZvdW5kIHRoYXQgbWF0Y2hlcyB0aGUgY3JpdGVyaWEnLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHByaW50KCcgIHNlcnZlcnM6ICVzJyAlIHNlcnZlcl9tYXRjaCwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBwcmludCgnICBmZWF0dXJlczogJXMnICUgZmVhdHVyZV9tYXRjaCwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBpZiBvbmx5X2tub3duX2ZhaWx1cmVzOgorICAgICAgICBsb2dnZXIuZGVidWcoJ09ubHkgcnVubmluZyBrbm93biBmYWlsdXJlcycpCisgICAgICAgIGtub3duID0gY3Jvc3NydW5uZXIubG9hZF9rbm93bl9mYWlsdXJlcyhiYXNlZGlyKQorICAgICAgICB0ZXN0cyA9IGxpc3QoZmlsdGVyKGxhbWJkYSB0OiBjcm9zc3J1bm5lci50ZXN0X25hbWUoKip0KSBpbiBrbm93biwgdGVzdHMpKQorICAgIGlmIHNraXBfa25vd25fZmFpbHVyZXM6CisgICAgICAgIGxvZ2dlci5kZWJ1ZygnU2tpcHBpbmcga25vd24gZmFpbHVyZXMnKQorICAgICAgICBrbm93biA9IGNyb3NzcnVubmVyLmxvYWRfa25vd25fZmFpbHVyZXMoYmFzZWRpcikKKyAgICAgICAgdGVzdHMgPSBsaXN0KGZpbHRlcihsYW1iZGEgdDogY3Jvc3NydW5uZXIudGVzdF9uYW1lKCoqdCkgbm90IGluIGtub3duLCB0ZXN0cykpCisKKyAgICBkaXNwYXRjaGVyID0gY3Jvc3NydW5uZXIuVGVzdERpc3BhdGNoZXIoVEVTVF9ESVIsIFJPT1RfRElSLCBGRUFUVVJFX0RJUl9SRUxBVElWRSwgam9icykKKyAgICBsb2dnZXIuZGVidWcoJ0V4ZWN1dGluZyAlZCB0ZXN0cycgJSBsZW4odGVzdHMpKQorICAgIHRyeToKKyAgICAgICAgZm9yIHIgaW4gW2Rpc3BhdGNoZXIuZGlzcGF0Y2godGVzdCwgcmV0cnlfY291bnQpIGZvciB0ZXN0IGluIHRlc3RzXToKKyAgICAgICAgICAgIHIud2FpdCgpCisgICAgICAgIGxvZ2dlci5kZWJ1ZygnV2FpdGluZyBmb3IgY29tcGxldGlvbicpCisgICAgICAgIHJldHVybiBkaXNwYXRjaGVyLndhaXQoKQorICAgIGV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgorICAgICAgICBsb2dnZXIuZGVidWcoJ0ludGVycnVwdGVkLCBzaHV0dGluZyBkb3duJykKKyAgICAgICAgZGlzcGF0Y2hlci50ZXJtaW5hdGUoKQorICAgICAgICByZXR1cm4gRmFsc2UKKworCitkZWYgZGVmYXVsdF9jb25jdXJyZW50eSgpOgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIGludChvcy5lbnZpcm9uLmdldCgnVEhSSUZUX0NST1NTVEVTVF9DT05DVVJSRU5DWScpKQorICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgIyBTaW5jZSBtdWNoIHRpbWUgaXMgc3BlbnQgc2xlZXBpbmcsIHVzZSBtYW55IHRocmVhZHMKKyAgICAgICAgcmV0dXJuIGludChtdWx0aXByb2Nlc3NpbmcuY3B1X2NvdW50KCkgKiAxLjI1KSArIDEKKworCitkZWYgbWFpbihhcmd2KToKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zZXJ2ZXInLCBkZWZhdWx0PScnLCBuYXJncz0nKicsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdsaXN0IG9mIHNlcnZlcnMgdG8gdGVzdCcpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1jbGllbnQnLCBkZWZhdWx0PScnLCBuYXJncz0nKicsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdsaXN0IG9mIGNsaWVudHMgdG8gdGVzdCcpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLUYnLCAnLS1mZWF0dXJlcycsIG5hcmdzPScqJywgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncnVuIHNlcnZlciBmZWF0dXJlIHRlc3RzIGluc3RlYWQgb2YgY3Jvc3MgbGFuZ3VhZ2UgdGVzdHMnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1SJywgJy0tcmVnZXgnLCBoZWxwPSd0ZXN0IG5hbWUgcGF0dGVybiB0byBydW4nKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1vJywgJy0tb25seS1rbm93bl9mYWlsdXJlcycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlc3Q9J29ubHlfa25vd25fZmFpbHVyZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nb25seSBleGVjdXRlIHRlc3RzIHRoYXQgYXJlIGtub3duIHRvIGZhaWwnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1zJywgJy0tc2tpcC1rbm93bi1mYWlsdXJlcycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlc3Q9J3NraXBfa25vd25fZmFpbHVyZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZG8gbm90IGV4ZWN1dGUgdGVzdHMgdGhhdCBhcmUga25vd24gdG8gZmFpbCcpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXInLCAnLS1yZXRyeS1jb3VudCcsIHR5cGU9aW50LAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0wLCBoZWxwPSdtYXhpbXVtIHJldHJ5IG9uIGZhaWx1cmUnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1qJywgJy0tam9icycsIHR5cGU9aW50LAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1kZWZhdWx0X2NvbmN1cnJlbnR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdudW1iZXIgb2YgY29uY3VycmVudCB0ZXN0IGV4ZWN1dGlvbnMnKQorCisgICAgZyA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAodGl0bGU9J0FkdmFuY2VkJykKKyAgICBnLmFkZF9hcmd1bWVudCgnLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSdzdG9yZV9jb25zdCcsCisgICAgICAgICAgICAgICAgICAgZGVzdD0nbG9nX2xldmVsJywgY29uc3Q9bG9nZ2luZy5ERUJVRywgZGVmYXVsdD1sb2dnaW5nLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgaGVscD0nc2hvdyBkZWJ1ZyBvdXRwdXQgZm9yIHRlc3QgcnVubmVyJykKKyAgICBnLmFkZF9hcmd1bWVudCgnLVAnLCAnLS1wcmludC1leHBlY3RlZC1mYWlsdXJlcycsIGNob2ljZXM9WydtZXJnZScsICdvdmVyd3JpdGUnXSwKKyAgICAgICAgICAgICAgICAgICBkZXN0PSdwcmludF9mYWlsdXJlcycsCisgICAgICAgICAgICAgICAgICAgaGVscD0iZ2VuZXJhdGUgZXhwZWN0ZWQgZmFpbHVyZXMgYmFzZWQgb24gbGFzdCByZXN1bHQgYW5kIHByaW50IHRvIHN0ZG91dCIpCisgICAgZy5hZGRfYXJndW1lbnQoJy1VJywgJy0tdXBkYXRlLWV4cGVjdGVkLWZhaWx1cmVzJywgY2hvaWNlcz1bJ21lcmdlJywgJ292ZXJ3cml0ZSddLAorICAgICAgICAgICAgICAgICAgIGRlc3Q9J3VwZGF0ZV9mYWlsdXJlcycsCisgICAgICAgICAgICAgICAgICAgaGVscD0iZ2VuZXJhdGUgZXhwZWN0ZWQgZmFpbHVyZXMgYmFzZWQgb24gbGFzdCByZXN1bHQgYW5kIHNhdmUgdG8gZGVmYXVsdCBmaWxlIGxvY2F0aW9uIikKKyAgICBvcHRpb25zID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJndikKKworICAgIGxvZ2dlciA9IG11bHRpcHJvY2Vzc2luZy5sb2dfdG9fc3RkZXJyKCkKKyAgICBsb2dnZXIuc2V0TGV2ZWwob3B0aW9ucy5sb2dfbGV2ZWwpCisKKyAgICBpZiBvcHRpb25zLmZlYXR1cmVzIGlzIG5vdCBOb25lIGFuZCBvcHRpb25zLmNsaWVudDoKKyAgICAgICAgcHJpbnQoJ0Nhbm5vdCBzcGVjaWZ5IGJvdGggLS1mZWF0dXJlcyBhbmQgLS1jbGllbnQgJywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICByZXR1cm4gMQorCisgICAgIyBBbGxvdyBtdWx0aXBsZSBhcmdzIHNlcGFyYXRlZCB3aXRoICcsJyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICAgIHNlcnZlcl9tYXRjaCA9IGxpc3QoY2hhaW4oKlt4LnNwbGl0KCcsJykgZm9yIHggaW4gb3B0aW9ucy5zZXJ2ZXJdKSkKKyAgICBjbGllbnRfbWF0Y2ggPSBsaXN0KGNoYWluKCpbeC5zcGxpdCgnLCcpIGZvciB4IGluIG9wdGlvbnMuY2xpZW50XSkpCisKKyAgICBpZiBvcHRpb25zLnVwZGF0ZV9mYWlsdXJlcyBvciBvcHRpb25zLnByaW50X2ZhaWx1cmVzOgorICAgICAgICBkaXJlID0gcGF0aF9qb2luKFJPT1RfRElSLCBGRUFUVVJFX0RJUl9SRUxBVElWRSkgaWYgb3B0aW9ucy5mZWF0dXJlcyBpcyBub3QgTm9uZSBlbHNlIFRFU1RfRElSCisgICAgICAgIHJlcyA9IGNyb3NzcnVubmVyLmdlbmVyYXRlX2tub3duX2ZhaWx1cmVzKAorICAgICAgICAgICAgZGlyZSwgb3B0aW9ucy51cGRhdGVfZmFpbHVyZXMgPT0gJ292ZXJ3cml0ZScsCisgICAgICAgICAgICBvcHRpb25zLnVwZGF0ZV9mYWlsdXJlcywgb3B0aW9ucy5wcmludF9mYWlsdXJlcykKKyAgICBlbGlmIG9wdGlvbnMuZmVhdHVyZXMgaXMgbm90IE5vbmU6CisgICAgICAgIGZlYXR1cmVzID0gb3B0aW9ucy5mZWF0dXJlcyBvciBbJy4qJ10KKyAgICAgICAgcmVzID0gcnVuX2ZlYXR1cmVfdGVzdHMoc2VydmVyX21hdGNoLCBmZWF0dXJlcywgb3B0aW9ucy5qb2JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNraXBfa25vd25fZmFpbHVyZXMsIG9wdGlvbnMub25seV9rbm93bl9mYWlsdXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5yZXRyeV9jb3VudCwgb3B0aW9ucy5yZWdleCkKKyAgICBlbHNlOgorICAgICAgICByZXMgPSBydW5fY3Jvc3NfdGVzdHMoc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2gsIG9wdGlvbnMuam9icywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2tpcF9rbm93bl9mYWlsdXJlcywgb3B0aW9ucy5vbmx5X2tub3duX2ZhaWx1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5yZXRyeV9jb3VudCwgb3B0aW9ucy5yZWdleCkKKyAgICByZXR1cm4gMCBpZiByZXMgZWxzZSAxCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBzeXMuZXhpdChtYWluKHN5cy5hcmd2WzE6XSkpCmRpZmYgLS1naXQgYS90ZXN0L3Rlc3RzLmpzb24gYi90ZXN0L3Rlc3RzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkNmRlZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdGVzdHMuanNvbgpAQCAtMCwwICsxLDc0OSBAQAorWworICB7CisgICAgIm5hbWUiOiAiY19nbGliIiwKKyAgICAicGxhdGZvcm1zIjogWworICAgICAgIkxpbnV4IgorICAgIF0sCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAidGVzdF9zZXJ2ZXIiLAorICAgICAgICAiLS1sdC1kZWJ1ZyIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAiYmluYXJ5Om11bHRpIiwKKyAgICAgICAgImNvbXBhY3Q6bXVsdGljIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAidGVzdF9jbGllbnQiLAorICAgICAgICAiLS1sdC1kZWJ1ZyIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAibXVsdGk6YmluYXJ5IiwKKyAgICAgICAgIm11bHRpYzpjb21wYWN0IgorICAgICAgXSwKKyAgICAgICJzb2NrZXRzIjogWworICAgICAgICAiaXAtc3NsIgorICAgICAgXQorICAgIH0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiLAorICAgICAgImNvbXBhY3QiLAorICAgICAgIm11bHRpIiwKKyAgICAgICJtdWx0aWMiCisgICAgXSwKKyAgICAid29ya2RpciI6ICJjX2dsaWIiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJjbCIsCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWyJUZXN0U2VydmVyIl0sCisgICAgICAid29ya2RpciI6ICJjbCIsCisgICAgICAicHJvdG9jb2xzIjogWyJiaW5hcnkiLCAibXVsdGkiXSwKKyAgICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCIsICJmcmFtZWQiXSwKKyAgICAgICJzb2NrZXRzIjogWyJpcCJdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgImNvbW1hbmQiOiBbIlRlc3RDbGllbnQiXSwKKyAgICAgICJ3b3JrZGlyIjogImNsIiwKKyAgICAgICJwcm90b2NvbHMiOiBbImJpbmFyeSIsICJtdWx0aSJdLAorICAgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIiwgImZyYW1lZCJdLAorICAgICAgInNvY2tldHMiOiBbImlwIl0KKyAgICB9CisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJkIiwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJ0aHJpZnRfdGVzdF9zZXJ2ZXIiLAorICAgICAgICAiLS10cmFjZSIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInRocmlmdF90ZXN0X2NsaWVudCIKKyAgICAgIF0KKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImh0dHAiLAorICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiLAorICAgICAgImNvbXBhY3QiLAorICAgICAgImpzb24iCisgICAgXSwKKyAgICAid29ya2RpciI6ICIuLi9saWIvZC90ZXN0IgorICB9LAorICB7CisgICAgIm5hbWUiOiAiZ28iLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInRlc3RzZXJ2ZXIiLAorICAgICAgICAiLS1jZXJ0UGF0aD0uLi8uLi9rZXlzIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogNiwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAidGVzdGNsaWVudCIKKyAgICAgIF0KKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiLAorICAgICAgImh0dHAiLAorICAgICAgInpsaWIiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiLAorICAgICAgImNvbXBhY3QiLAorICAgICAgImpzb24iCisgICAgXSwKKyAgICAid29ya2RpciI6ICJnby9iaW4iCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJqYXZhIiwKKyAgICAiam9pbl9hcmdzIjogZmFsc2UsCisgICAgInNlcnZlciI6IHsKKyAgICAgICJkZWxheSI6IDE1LAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJidWlsZC9ydW5zZXJ2ZXIiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeTptdWx0aSIsCisgICAgICAgICJjb21wYWN0Om11bHRpYyIsCisgICAgICAgICJqc29uOm11bHRpaiIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDEzLAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJidWlsZC9ydW5jbGllbnQiCisgICAgICBdLAorICAgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAgICJodHRwIgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aTpiaW5hcnkiLAorICAgICAgICAibXVsdGljOmNvbXBhY3QiLAorICAgICAgICAibXVsdGlqOmpzb24iCisgICAgICBdCisgICAgfSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIiwKKyAgICAgICJmcmFtZWQ6ZmFzdGZyYW1lZCIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIsCisgICAgICAiY29tcGFjdCIsCisgICAgICAianNvbiIsCisgICAgICAibXVsdGkiLAorICAgICAgIm11bHRpYyIsCisgICAgICAibXVsdGlqIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAiLi4vbGliL2phdmEiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJub2RlanMiLAorICAgICJlbnYiOiB7CisgICAgICAiTk9ERV9QQVRIIjogIi4uL2xpYiIKKyAgICB9LAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIm5vZGUiLAorICAgICAgICAic2VydmVyLmpzIiwKKyAgICAgICAgIi0tdHlwZT10Y3AiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiA2LAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJub2RlIiwKKyAgICAgICAgImNsaWVudC5qcyIsCisgICAgICAgICItLXR5cGU9dGNwIgorICAgICAgXQorICAgIH0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIsCisgICAgICAiaHR0cCIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiLAorICAgICAgImRvbWFpbiIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiY29tcGFjdCIsCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJqc29uIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAiLi4vbGliL25vZGVqcy90ZXN0IgorICB9LAorICB7CisgICAgIm5hbWUiOiAiaHMiLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIlRlc3RTZXJ2ZXIiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiA2LAorICAgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAgICJodHRwIgorICAgICAgXSwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiVGVzdENsaWVudCIKKyAgICAgIF0KKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiaGVhZGVyIiwKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJiaW5hcnkiLAorICAgICAgImpzb24iCisgICAgXSwKKyAgICAid29ya2RpciI6ICJocyIKKyAgfSwKKyAgeworICAgICJuYW1lIjogInB5IiwKKyAgICAic2VydmVyIjogeworICAgICAgImV4dHJhX2FyZ3MiOiBbIlRTaW1wbGVTZXJ2ZXIiXSwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiVGVzdFNlcnZlci5weSIsCisgICAgICAgICItLXZlcmJvc2UiLAorICAgICAgICAiLS1nZW5weWRpcj1nZW4tcHkiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiAxMCwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiVGVzdENsaWVudC5weSIsCisgICAgICAgICItLXZlcmJvc2UiLAorICAgICAgICAiLS1ob3N0PWxvY2FsaG9zdCIsCisgICAgICAgICItLWdlbnB5ZGlyPWdlbi1weSIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAibXVsdGkiLAorICAgICAgICAibXVsdGk6bXVsdGlhIiwKKyAgICAgICAgIm11bHRpYyIsCisgICAgICAgICJtdWx0aWM6bXVsdGlhYyIsCisgICAgICAgICJtdWx0aWoiCisgICAgICBdCisgICAgfSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIiwKKyAgICAgICJodHRwIiwKKyAgICAgICJ6bGliIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiY29tcGFjdCIsCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJqc29uIiwKKyAgICAgICJiaW5hcnk6YWNjZWwiLAorICAgICAgImNvbXBhY3Q6YWNjZWxjIiwKKyAgICAgICJoZWFkZXIiCisgICAgXSwKKyAgICAid29ya2RpciI6ICJweSIKKyAgfSwKKyAgeworICAgICJjb21tZW50IjogIlVzaW5nICdweXRob24zJyBleGVjdXRhYmxlIHRvIHRlc3QgcHkyIGFuZCAzIGF0IG9uY2UiLAorICAgICJuYW1lIjogInB5MyIsCisgICAgInNlcnZlciI6IHsKKyAgICAgICJleHRyYV9hcmdzIjogWyJUU2ltcGxlU2VydmVyIl0sCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInB5dGhvbjMiLAorICAgICAgICAiVGVzdFNlcnZlci5weSIsCisgICAgICAgICItLXZlcmJvc2UiLAorICAgICAgICAiLS1nZW5weWRpcj1nZW4tcHkiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiAxMCwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicHl0aG9uMyIsCisgICAgICAgICJUZXN0Q2xpZW50LnB5IiwKKyAgICAgICAgIi0taG9zdD1sb2NhbGhvc3QiLAorICAgICAgICAiLS1nZW5weWRpcj1nZW4tcHkiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgIm11bHRpIiwKKyAgICAgICAgIm11bHRpOm11bHRpYSIsCisgICAgICAgICJtdWx0aWMiLAorICAgICAgICAibXVsdGljOm11bHRpYWMiLAorICAgICAgICAibXVsdGlqIgorICAgICAgXQorICAgIH0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIsCisgICAgICAiaHR0cCIsCisgICAgICAiemxpYiIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImNvbXBhY3QiLAorICAgICAgImJpbmFyeSIsCisgICAgICAianNvbiIsCisgICAgICAiYmluYXJ5OmFjY2VsIiwKKyAgICAgICJjb21wYWN0OmFjY2VsYyIsCisgICAgICAiaGVhZGVyIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAicHkiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJjcHAiLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIlRlc3RTZXJ2ZXIiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeTptdWx0aSIsCisgICAgICAgICJjb21wYWN0Om11bHRpYyIsCisgICAgICAgICJoZWFkZXI6bXVsdGloIiwKKyAgICAgICAgImpzb246bXVsdGlqIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogOCwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiVGVzdENsaWVudCIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAibXVsdGk6YmluYXJ5IiwKKyAgICAgICAgIm11bHRpYzpjb21wYWN0IiwKKyAgICAgICAgIm11bHRpaDpoZWFkZXIiLAorICAgICAgICAibXVsdGlqOmpzb24iCisgICAgICBdCisgICAgfSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiaHR0cCIsCisgICAgICAiZnJhbWVkIiwKKyAgICAgICJ6bGliIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIsCisgICAgICAiZG9tYWluIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJiaW5hcnkiLAorICAgICAgImpzb24iLAorICAgICAgImhlYWRlciIsCisgICAgICAibXVsdGkiLAorICAgICAgIm11bHRpYyIsCisgICAgICAibXVsdGloIiwKKyAgICAgICJtdWx0aWoiCisgICAgXSwKKyAgICAid29ya2RpciI6ICJjcHAiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJyYiIsCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicnVieSIsCisgICAgICAgICIuLi9pbnRlZ3JhdGlvbi9UZXN0U2VydmVyLnJiIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogNSwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicnVieSIsCisgICAgICAgICIuLi9pbnRlZ3JhdGlvbi9UZXN0Q2xpZW50LnJiIiwKKyAgICAgICAgIi0tIgorICAgICAgXQorICAgIH0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImRvbWFpbiIsCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJiaW5hcnk6YWNjZWwiLAorICAgICAgImNvbXBhY3QiLAorICAgICAgImpzb24iCisgICAgXSwKKyAgICAid29ya2RpciI6ICJyYi9nZW4tcmIiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJjc2hhcnAiLAorICAgICJlbnYiOiB7CisgICAgICAiTU9OT19QQVRIIjogIi4uLy4uL2xpYi9jc2hhcnAvIgorICAgIH0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIsCisgICAgICAiY29tcGFjdCIsCisgICAgICAianNvbiIKKyAgICBdLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIm1vbm8iLAorICAgICAgICAiVGVzdENsaWVudFNlcnZlci5leGUiLAorICAgICAgICAic2VydmVyIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogOSwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAibW9ubyIsCisgICAgICAgICJUZXN0Q2xpZW50U2VydmVyLmV4ZSIsCisgICAgICAgICJjbGllbnQiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgIm11bHRpIiwKKyAgICAgICAgIm11bHRpYyIsCisgICAgICAgICJtdWx0aTpiaW5hcnkiLAorICAgICAgICAibXVsdGljOmNvbXBhY3QiCisgICAgICBdCisgICAgfSwKKyAgICAid29ya2RpciI6ICJjc2hhcnAiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJuZXRjb3JlIiwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJqc29uIgorICAgIF0sCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiZG90bmV0IiwKKyAgICAgICAgInJ1biIsCisgICAgICAgICItLW5vLWJ1aWxkIiwKKyAgICAgICAgIi0tcHJvamVjdD1TZXJ2ZXIvU2VydmVyLmNzcHJvaiIsCisgICAgICAgICJzZXJ2ZXIiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiAxMCwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiZG90bmV0IiwKKyAgICAgICAgInJ1biIsCisgICAgICAgICItLW5vLWJ1aWxkIiwKKyAgICAgICAgIi0tcHJvamVjdD1DbGllbnQvQ2xpZW50LmNzcHJvaiIsCisgICAgICAgICJjbGllbnQiCisgICAgICBdCisgICAgfSwKKyAgICAgICAgIndvcmtkaXIiOiAibmV0Y29yZSIKKyAgfSwKKyAgeworICAgICJuYW1lIjogInBlcmwiLAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIiwKKyAgICAgICJkb21haW4iCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIsCisgICAgICAibXVsdGkiCisgICAgXSwKKyAgICAiY2xpZW50IjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJwZXJsIiwKKyAgICAgICAgIi1JZ2VuLXBlcmwvIiwKKyAgICAgICAgIi1JLi4vLi4vbGliL3BlcmwvbGliLyIsCisgICAgICAgICJUZXN0Q2xpZW50LnBsIiwKKyAgICAgICAgIi0tY2E9Li4va2V5cy9DQS5wZW0iLAorICAgICAgICAiLS1jZXJ0PS4uL2tleXMvY2xpZW50LmNydCIsCisgICAgICAgICItLWtleT0uLi9rZXlzL2NsaWVudC5rZXkiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgIm11bHRpOmJpbmFyeSIKKyAgICAgIF0KKyAgICB9LAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInBlcmwiLAorICAgICAgICAiLUlnZW4tcGVybC8iLAorICAgICAgICAiLUkuLi8uLi9saWIvcGVybC9saWIvIiwKKyAgICAgICAgIlRlc3RTZXJ2ZXIucGwiLAorICAgICAgICAiLS1jZXJ0PS4uL2tleXMvc2VydmVyLmNydCIsCisgICAgICAgICItLWtleT0uLi9rZXlzL3NlcnZlci5rZXkiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeTptdWx0aSIKKyAgICAgIF0KKyAgICB9LAorICAgICJ3b3JrZGlyIjogInBlcmwiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJwaHAiLAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDYsCisgICAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICAgImZyYW1lZCIKKyAgICAgIF0sCisgICAgICAic29ja2V0cyI6IFsKKyAgICAgICAgImlwIgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJiaW5hcnkiLAorICAgICAgICAiY29tcGFjdCIsCisgICAgICAgICJiaW5hcnk6YWNjZWwiCisgICAgICBdLAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJwaHAiLAorICAgICAgICAiLWRleHRlbnNpb25fZGlyPXBocF9leHRfZGlyIiwKKyAgICAgICAgIi0tcGhwLWluaT10ZXN0X3BocC5pbmkiLAorICAgICAgICAiLS1uby1waHAtaW5pIiwKKyAgICAgICAgIi1kZGlzcGxheV9lcnJvcnM9c3RkZXJyIiwKKyAgICAgICAgIi1kbG9nX2Vycm9ycz0wIiwKKyAgICAgICAgIi1kZXJyb3JfcmVwb3J0aW5nPUVfQUxMIiwKKyAgICAgICAgIlRlc3RDbGllbnQucGhwIgorICAgICAgXQorICAgIH0sCisgICAgIndvcmtkaXIiOiAicGhwIgorICB9LAorICB7CisgICAgIm5hbWUiOiAiZGFydCIsCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgICAiYnVmZmVyZWQiLAorICAgICAgICAiZnJhbWVkIiwKKyAgICAgICAgImh0dHAiCisgICAgICBdLAorICAgICAgInNvY2tldHMiOiBbCisgICAgICAgICJpcCIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAiYmluYXJ5IiwKKyAgICAgICAgImNvbXBhY3QiLAorICAgICAgICAianNvbiIKKyAgICAgIF0sCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgImRhcnQiLAorICAgICAgICAidGVzdF9jbGllbnQvYmluL21haW4uZGFydCIKKyAgICAgIF0KKyAgICB9LAorICAgICJ3b3JrZGlyIjogImRhcnQiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJlcmwiLAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiLAorICAgICAgImNvbXBhY3QiCisgICAgXSwKKyAgICAiY2xpZW50IjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJlcmwiLAorICAgICAgICAiK0siLAorICAgICAgICAidHJ1ZSIsCisgICAgICAgICItbm9zaGVsbCIsCisgICAgICAgICItcGEiLAorICAgICAgICAiLi4vLi4vbGliL2VybC9lYmluLyIsCisgICAgICAgICItcGEiLAorICAgICAgICAiLi9lYmluIiwKKyAgICAgICAgIi1zIiwKKyAgICAgICAgInRlc3RfY2xpZW50IiwKKyAgICAgICAgIi1zIiwKKyAgICAgICAgImluaXQiLAorICAgICAgICAic3RvcCIsCisgICAgICAgICItZXh0cmEiCisgICAgICBdCisgICAgfSwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJlcmwiLAorICAgICAgICAiK0siLAorICAgICAgICAidHJ1ZSIsCisgICAgICAgICItbm9zaGVsbCIsCisgICAgICAgICItcGEiLAorICAgICAgICAiLi4vLi4vbGliL2VybC9lYmluLyIsCisgICAgICAgICItcGEiLAorICAgICAgICAiLi9lYmluIiwKKyAgICAgICAgIi1zIiwKKyAgICAgICAgInRlc3RfdGhyaWZ0X3NlcnZlciIsCisgICAgICAgICItZXh0cmEiCisgICAgICBdCisgICAgfSwKKyAgICAid29ya2RpciI6ICJlcmwiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJqcyIsCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiaHR0cCIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJqc29uIgorICAgIF0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicGhhbnRvbWpzIiwKKyAgICAgICAgInRlc3QvcGhhbnRvbS1jbGllbnQuanMiCisgICAgICBdCisgICAgfSwKKyAgICAid29ya2RpciI6ICIuLi9saWIvanMiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJsdWEiLAorICAgICJUT0RPIjogIkFkZCBkbGwgdG8gTFVBX0NQQVRIIiwKKyAgICAiZW52IjogeworICAgICAgIkxVQV9QQVRIIjogIjs7Z2VuLWx1YS8/Lmx1YTsuLi8uLi9saWIvbHVhLz8ubHVhIiwKKyAgICAgICJMVUFfQ1BBVEgiOiAiOzsuLi8uLi9saWIvbHVhLy5saWJzLz8uc28iCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiA1LAorICAgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAgICJidWZmZXJlZCIsCisgICAgICAgICJmcmFtZWQiLAorICAgICAgICAiaHR0cCIKKyAgICAgIF0sCisgICAgICAic29ja2V0cyI6IFsKKyAgICAgICAgImlwIgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJiaW5hcnkiLAorICAgICAgICAiY29tcGFjdCIsCisgICAgICAgICJqc29uIgorICAgICAgXSwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAibHVhIiwKKyAgICAgICAgInRlc3RfYmFzaWNfY2xpZW50Lmx1YSIKKyAgICAgIF0KKyAgICB9LAorICAgICJ3b3JrZGlyIjogImx1YSIKKyAgfSwKKyAgeworICAgICJuYW1lIjogInJzIiwKKyAgICAiZW52IjogeworICAgICAgIlJVU1RfQkFDS1RSQUNFIjogIjEiLAorICAgICAgIlJVU1RfTE9HIjogImluZm8iCisgICAgfSwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJ0ZXN0X3NlcnZlciIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAiYmluYXJ5Om11bHRpIiwKKyAgICAgICAgImNvbXBhY3Q6bXVsdGljIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogNiwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAidGVzdF9jbGllbnQiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgIm11bHRpOmJpbmFyeSIsCisgICAgICAgICJtdWx0aWM6Y29tcGFjdCIKKyAgICAgIF0KKyAgICB9LAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIgorICAgIF0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJtdWx0aSIsCisgICAgICAibXVsdGljIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAicnMvYmluIgorICB9LAorICB7CisgICAgIm5hbWUiOiAibm9kZXRzIiwKKyAgICAiZW52IjogeworICAgICAgIk5PREVfUEFUSCI6ICIuLi9saWIiCisgICAgfSwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJydW5TZXJ2ZXIuc2giCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiA2LAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJydW5DbGllbnQuc2giCisgICAgICBdCisgICAgfSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIgorICAgIF0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiCisgICAgXSwKKyAgICAid29ya2RpciI6ICIuLi9saWIvbm9kZXRzL3Rlc3QiCisgIH0KK10KZGlmZiAtLWdpdCBhL3Rlc3QvdGhyZWFkcy9UaHJlYWRzQ2xpZW50LmNwcCBiL3Rlc3QvdGhyZWFkcy9UaHJlYWRzQ2xpZW50LmNwcAppbmRleCA4NTI3NGE2Li45MzA2YTNmIDEwMDY0NAotLS0gYS90ZXN0L3RocmVhZHMvVGhyZWFkc0NsaWVudC5jcHAKKysrIGIvdGVzdC90aHJlYWRzL1RocmVhZHNDbGllbnQuY3BwCkBAIC0yMSwxMyArMjEsMTYgQEAKIC8vIFlvdSBzaG91bGQgY29weSBpdCB0byBhbm90aGVyIGZpbGVuYW1lIHRvIGF2b2lkIG92ZXJ3cml0aW5nIGl0LgogCiAjaW5jbHVkZSAiVGhyZWFkc1Rlc3QuaCIKLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNvY2tldC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaWYgX1dJTjMyCisgICAjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaD4KKyNlbmRpZgogCiB1c2luZyBib29zdDo6c2hhcmVkX3B0cjsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKQEAgLTM3LDYgKzQwLDkgQEAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworI2lmIF9XSU4zMgorICB0cmFuc3BvcnQ6OlRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUoKTsKKyNlbmRpZgogICBpbnQgcG9ydCA9IDkwOTA7CiAgIHN0ZDo6c3RyaW5nIGhvc3QgPSAibG9jYWxob3N0IjsKIApkaWZmIC0tZ2l0IGEvdGVzdC90aHJlYWRzL1RocmVhZHNTZXJ2ZXIuY3BwIGIvdGVzdC90aHJlYWRzL1RocmVhZHNTZXJ2ZXIuY3BwCmluZGV4IDg3MzRlZTguLmEyNjdjM2IgMTAwNjQ0Ci0tLSBhL3Rlc3QvdGhyZWFkcy9UaHJlYWRzU2VydmVyLmNwcAorKysgYi90ZXN0L3RocmVhZHMvVGhyZWFkc1NlcnZlci5jcHAKQEAgLTIxLDE0ICsyMSwxNyBAQAogLy8gWW91IHNob3VsZCBjb3B5IGl0IHRvIGFub3RoZXIgZmlsZW5hbWUgdG8gYXZvaWQgb3ZlcndyaXRpbmcgaXQuCiAKICNpbmNsdWRlICJUaHJlYWRzVGVzdC5oIgotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgotI2luY2x1ZGUgPHNlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgotI2luY2x1ZGUgPHNlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpZiBfV0lOMzIKKyAgICNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgorI2VuZGlmCiAKIHVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwpAQCAtODUsMTEgKzg4LDEyIEBACiBwcm90ZWN0ZWQ6CiAgIHZvaWQgZ28yc2xlZXAoaW50IHRocmVhZCwgaW50IHNlY29uZHMpIHsKICAgICBNb25pdG9yIG07CisgICAgU3luY2hyb25pemVkIHMobSk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWNvbmRzOyArK2kpIHsKICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhyZWFkICVkOiBzbGVlcCAlZFxuIiwgdGhyZWFkLCBpKTsKICAgICAgIHRyeSB7CiAgICAgICAgIG0ud2FpdCgxMDAwKTsKLSAgICAgIH0gY2F0Y2goVGltZWRPdXRFeGNlcHRpb24mIGUpIHsKKyAgICAgIH0gY2F0Y2goY29uc3QgVGltZWRPdXRFeGNlcHRpb24mKSB7CiAgICAgICB9CiAgICAgfQogICAgIGZwcmludGYoc3RkZXJyLCAiVEhSRUFEICVkIERPTkVcbiIsIHRocmVhZCk7CkBAIC0xMDEsNiArMTA1LDkgQEAKIH07CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworI2lmIF9XSU4zMgorICB0cmFuc3BvcnQ6OlRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUoKTsKKyNlbmRpZgogICBpbnQgcG9ydCA9IDkwOTA7CiAgIHNoYXJlZF9wdHI8VGhyZWFkc1Rlc3RIYW5kbGVyPiBoYW5kbGVyKG5ldyBUaHJlYWRzVGVzdEhhbmRsZXIoKSk7CiAgIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKG5ldyBUaHJlYWRzVGVzdFByb2Nlc3NvcihoYW5kbGVyKSk7CkBAIC0xMTEsOCArMTE4LDggQEAKICAgLyoKICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0KICAgICBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKDEwKTsKLSAgc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkgPQotICAgIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KCkpOworICBzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSA9CisgICAgc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSk7CiAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CiAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdmFsZ3JpbmQuc3VwcHJlc3MgYi90ZXN0L3ZhbGdyaW5kLnN1cHByZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMTdjYjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3ZhbGdyaW5kLnN1cHByZXNzCkBAIC0wLDAgKzEsNTMgQEAKK3sKKyAgIGJvb3N0L2dldF9vbmNlX3Blcl90aHJlYWRfZXBvY2gvaWdub3JlCisgICBNZW1jaGVjazpMZWFrCisgICBtYXRjaC1sZWFrLWtpbmRzOiByZWFjaGFibGUKKyAgIGZ1bjptYWxsb2MKKyAgIGZ1bjpfWk41Ym9vc3Q2ZGV0YWlsMjVnZXRfb25jZV9wZXJfdGhyZWFkX2Vwb2NoRXYKK30KK3sKKyAgIGJvb3N0dGhyZWFkcy9vbmNlL2lnbm9yZQorICAgSGVsZ3JpbmQ6UmFjZQorICAgZnVuOl9aTjVib29zdDEzdGhyZWFkX2RldGFpbDE3ZW50ZXJfb25jZV9yZWdpb25FUk5TXzlvbmNlX2ZsYWdFCisgICBmdW46X1pONWJvb3N0NmRldGFpbDIzZ2V0X2N1cnJlbnRfdGhyZWFkX2RhdGFFdgorICAgZnVuOl9aTjVib29zdDZkZXRhaWwyMGludGVycnVwdGlvbl9jaGVja2VyQzFFUDE1cHRocmVhZF9tdXRleF90UDE0cHRocmVhZF9jb25kX3QKKyAgIGZ1bjpfWk41Ym9vc3QyMmNvbmRpdGlvbl92YXJpYWJsZV9hbnk0d2FpdElOU18xMXVuaXF1ZV9sb2NrSU5TXzExdGltZWRfbXV0ZXhFRUVFRXZSVF8KKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3k3TW9uaXRvcjRJbXBsMTF3YWl0Rm9yZXZlckV2CisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5N01vbml0b3I0SW1wbDE5d2FpdEZvclRpbWVSZWxhdGl2ZUVsCisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5N01vbml0b3I0SW1wbDR3YWl0RWwKKyAgIGZ1bjpfWk5LNmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5N01vbml0b3I0d2FpdEVsCisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5MTFCb29zdFRocmVhZDVzdGFydEV2CisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5NHRlc3QxOFRocmVhZEZhY3RvcnlUZXN0czEycmVhcE5UaHJlYWRzRWlpCisgICBmdW46bWFpbgorfQoreworICAgcHRocmVhZC9jcmVhdGlvbi10bHMvaWdub3JlCisgICBIZWxncmluZDpSYWNlCisgICBmdW46bWVtcGNweQorICAgZnVuOl9kbF9hbGxvY2F0ZV90bHNfaW5pdAorICAgZnVuOmdldF9jYWNoZWRfc3RhY2sKKyAgIGZ1bjphbGxvY2F0ZV9zdGFjaworICAgZnVuOnB0aHJlYWRfY3JlYXRlQEBHTElCQ18yLjIqCisgICBvYmo6L3Vzci9saWIvdmFsZ3JpbmQvdmdwcmVsb2FkX2hlbGdyaW5kLWFtZDY0LWxpbnV4LnNvCisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5MTNQdGhyZWFkVGhyZWFkNXN0YXJ0RXYKKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3k0dGVzdDE4VGhyZWFkRmFjdG9yeVRlc3RzMTJyZWFwTlRocmVhZHNFaWkKKyAgIGZ1bjptYWluCit9Cit7CisgICBib29zdC10aHJlYWQvY3JlYXRpb24tdGxzL2lnbm9yZQorICAgSGVsZ3JpbmQ6UmFjZQorICAgZnVuOm1lbXBjcHkKKyAgIGZ1bjpfZGxfYWxsb2NhdGVfdGxzX2luaXQKKyAgIGZ1bjpnZXRfY2FjaGVkX3N0YWNrCisgICBmdW46YWxsb2NhdGVfc3RhY2sKKyAgIGZ1bjpwdGhyZWFkX2NyZWF0ZUBAR0xJQkNfMi4yLjUKKyAgIG9iajovdXNyL2xpYi92YWxncmluZC92Z3ByZWxvYWRfaGVsZ3JpbmQtYW1kNjQtbGludXguc28KKyAgIGZ1bjpfWk41Ym9vc3Q2dGhyZWFkMjFzdGFydF90aHJlYWRfbm9leGNlcHRFdgorICAgZnVuOl9aTjVib29zdDZ0aHJlYWQxMnN0YXJ0X3RocmVhZEV2CisgICBmdW46X1pONWJvb3N0NnRocmVhZEMxSVN0NV9CaW5kSUZQRlB2UzNfRVMzX0VFRUVPVF8KKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3kxMUJvb3N0VGhyZWFkNXN0YXJ0RXYKKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3k0dGVzdDE4VGhyZWFkRmFjdG9yeVRlc3RzMTJyZWFwTlRocmVhZHNFaWkKKyAgIGZ1bjptYWluCit9CisKKwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNDk5NDYwCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMTAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0KKworaWYgTUlOR1cKKyMgZG8gbm90aGluZywganVzdCBidWlsZCB0aGUgY29tcGlsZXIKK2Vsc2UKKworaWYgV0lUSF9DX0dMSUIKK1NVQkRJUlMgKz0gY19nbGliCitlbmRpZgorCitpZiBXSVRIX0NQUAorU1VCRElSUyArPSBjcHAKK2VuZGlmCisKK2lmIFdJVEhfRAorU1VCRElSUyArPSBkCitlbmRpZgorCitpZiBXSVRIX0pBVkEKK1NVQkRJUlMgKz0gamF2YQorU1VCRElSUyArPSBqcworZW5kaWYKKworaWYgV0lUSF9QWVRIT04KK1NVQkRJUlMgKz0gcHkKK1NVQkRJUlMgKz0gcHkudHdpc3RlZAorU1VCRElSUyArPSBweS50b3JuYWRvCitlbmRpZgorCitpZiBXSVRIX1JVQlkKK1NVQkRJUlMgKz0gcmIKK2VuZGlmCisKK2lmIFdJVEhfSEFTS0VMTAorU1VCRElSUyArPSBocworZW5kaWYKKworaWYgV0lUSF9IQVhFCitTVUJESVJTICs9IGhheGUKK2VuZGlmCisKK2lmIFdJVEhfRE9UTkVUQ09SRQorU1VCRElSUyArPSBuZXRjb3JlCitlbmRpZgorCitpZiBXSVRIX0dPCitTVUJESVJTICs9IGdvCitlbmRpZgorCitpZiBXSVRIX05PREVKUworU1VCRElSUyArPSBub2RlanMKK2VuZGlmCisKK2lmIFdJVEhfREFSVAorU1VCRElSUyArPSBkYXJ0CitlbmRpZgorCitpZiBXSVRIX1JTCitTVUJESVJTICs9IHJzCitlbmRpZgorCitpZiBXSVRIX0NMCitTVUJESVJTICs9IGNsCitlbmRpZgorCisjCisjIGdlbmVyYXRlIGh0bWwgZm9yIFRocmlmdFRlc3QudGhyaWZ0CisjCithbGwtbG9jYWw6CisJJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gaHRtbCAtciAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCitjbGVhbi1sb2NhbDoKKwlybSAtcmYgJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC9nZW4taHRtbAorCitlbmRpZgorCisjIEFueSBmb2xkZXJzIG9yIGZpbGVzIG5vdCBsaXN0ZWQgYWJvdmUgYmVpbmcgYWRkZWQgdG8gU1VCRElSIG5lZWQgdG8gYmUgcGxhY2VkIGhlcmUgaW4KKyMgRVhUUkFfRElTVCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcmVsZWFzZQorRVhUUkFfRElTVCA9IFwKKwlhczMgXAorCWNzaGFycCBcCisJZCBcCisJZGVscGhpIFwKKwllcmwgXAorCWhzIFwKKwlvY2FtbCBcCisJcGVybCBcCisJcGhwIFwKKwlzaGFyZWQudGhyaWZ0IFwKKwl0dXRvcmlhbC50aHJpZnQgXAorCVJFQURNRS5tZApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvUkVBRE1FIGIvdHV0b3JpYWwvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjlmOTc3Li4wMDAwMDAwCi0tLSBhL3R1dG9yaWFsL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLVRocmlmdCBUdXRvcmlhbAotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1UdXRvcmlhbAotPT09PT09PT0KLQotMSkgRmlyc3QgdGhpbmdzIGZpcnN0LCB5b3UnbGwgbmVlZCB0byBpbnN0YWxsIHRoZSBUaHJpZnQgY29tcGlsZXIgYW5kIHRoZQotICAgbGFuZ3VhZ2UgbGlicmFyaWVzLiBEbyB0aGF0IHVzaW5nIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIHRvcCBsZXZlbAotICAgUkVBRE1FIGZpbGUuCi0KLTIpIFJlYWQgdHV0b3JpYWwudGhyaWZ0IHRvIGxlYXJuIGFib3V0IHRoZSBzeW50YXggb2YgYSBUaHJpZnQgZmlsZQotCi0zKSBDb21waWxlIHRoZSBjb2RlIGZvciB0aGUgbGFuZ3VhZ2Ugb2YgeW91ciBjaG9pY2U6Ci0KLSAgICAgJCB0aHJpZnQKLSAgICAgJCB0aHJpZnQgLXIgLS1nZW4gY3BwIHR1dG9yaWFsLnRocmlmdAotCi00KSBUYWtlIGEgbG9vayBhdCB0aGUgZ2VuZXJhdGVkIGNvZGUuCi0KLTUpIExvb2sgaW4gdGhlIGxhbmd1YWdlIGRpcmVjdG9yaWVzIGZvciBzYW1wbGUgY2xpZW50L3NlcnZlciBjb2RlLgotCi02KSBUaGF0J3MgYWJvdXQgaXQgZm9yIG5vdy4gVGhpcyB0dXRvcmlhbCBpcyBpbnRlbnRpb25hbGx5IGJyaWVmLiBJdCBzaG91bGQgYmUKLSAgIGp1c3QgZW5vdWdoIHRvIGdldCB5b3Ugc3RhcnRlZCBhbmQgcmVhZHkgdG8gYnVpbGQgeW91ciBvd24gcHJvamVjdC4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL1JFQURNRS5tZCBiL3R1dG9yaWFsL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzcyYmYzCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNDIgQEAKK1RocmlmdCBUdXRvcmlhbAorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitUdXRvcmlhbAorPT09PT09PT0KKworMSkgRmlyc3QgdGhpbmdzIGZpcnN0LCB5b3UnbGwgbmVlZCB0byBpbnN0YWxsIHRoZSBUaHJpZnQgY29tcGlsZXIgYW5kIHRoZQorICAgbGFuZ3VhZ2UgbGlicmFyaWVzLiBEbyB0aGF0IHVzaW5nIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIHRvcCBsZXZlbAorICAgUkVBRE1FLm1kIGZpbGUuCisKKzIpIFJlYWQgdHV0b3JpYWwudGhyaWZ0IHRvIGxlYXJuIGFib3V0IHRoZSBzeW50YXggb2YgYSBUaHJpZnQgZmlsZQorCiszKSBDb21waWxlIHRoZSBjb2RlIGZvciB0aGUgbGFuZ3VhZ2Ugb2YgeW91ciBjaG9pY2U6CisKKyAgICAgJCB0aHJpZnQKKyAgICAgJCB0aHJpZnQgLXIgLS1nZW4gY3BwIHR1dG9yaWFsLnRocmlmdAorCis0KSBUYWtlIGEgbG9vayBhdCB0aGUgZ2VuZXJhdGVkIGNvZGUuCisKKzUpIExvb2sgaW4gdGhlIGxhbmd1YWdlIGRpcmVjdG9yaWVzIGZvciBzYW1wbGUgY2xpZW50L3NlcnZlciBjb2RlLgorCis2KSBUaGF0J3MgYWJvdXQgaXQgZm9yIG5vdy4gVGhpcyB0dXRvcmlhbCBpcyBpbnRlbnRpb25hbGx5IGJyaWVmLiBJdCBzaG91bGQgYmUKKyAgIGp1c3QgZW5vdWdoIHRvIGdldCB5b3Ugc3RhcnRlZCBhbmQgcmVhZHkgdG8gYnVpbGQgeW91ciBvd24gcHJvamVjdC4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2FzMy9idWlsZC54bWwgYi90dXRvcmlhbC9hczMvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZWQzMmQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9hczMvYnVpbGQueG1sCkBAIC0wLDAgKzEsNTAgQEAKKzxwcm9qZWN0IG5hbWU9InR1dG9yaWFsIiBkZWZhdWx0PSJkaXN0IiBiYXNlZGlyPSIuIj4KKworICA8ZGVzY3JpcHRpb24+VGhyaWZ0IGFjdGlvbnNjcmlwdCAzLjAgdHV0b3JpYWwuPC9kZXNjcmlwdGlvbj4KKworICA8cHJvcGVydHkgbmFtZT0iZ2VuIiBsb2NhdGlvbj0iZ2VuLWFzMyIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249InNyYyIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5zcmMiIGxvY2F0aW9uPSIuLi8uLi9saWIvYXMzL3NyYy8iIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJkaXN0IiBsb2NhdGlvbj0iZGlzdCIgLz4KKworICA8cHJvcGVydHkgbmFtZT0iZmluYWwubmFtZSIgdmFsdWU9ImFzMy10dXRvcmlhbCIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InN3Zi5uYW1lIiB2YWx1ZT0iJHtkaXN0fS8ke2ZpbmFsLm5hbWV9LnN3ZiIgLz4KKworICA8dGFyZ2V0IG5hbWU9ImZsZXguY2hlY2siIHVubGVzcz0iRkxFWF9IT01FIj4KKyAgICA8ZmFpbCBtZXNzYWdlPSdZb3UgbXVzdCBzZXQgdGhlIEZMRVhfSE9NRSBwcm9wZXJ0eSBwb2ludGluZyB0byB5b3VyIGZsZXggU0RLLCBlZy4gYW50IC1ERkxFWF9IT01FPSIvQXBwbGljYXRpb25zL0Fkb2JlIEZsZXggQnVpbGRlciAzL3Nka3MvMy4yLjAiJy8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZmxleC5pbml0IiBkZXBlbmRzPSJmbGV4LmNoZWNrIiB1bmxlc3M9ImZsZXguZmluaXNoZWQiPgorICAgIDx0YXNrZGVmIHJlc291cmNlPSJmbGV4VGFza3MudGFza3MiIGNsYXNzcGF0aD0iJHtGTEVYX0hPTUV9L2FudC9saWIvZmxleFRhc2tzLmphciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZmxleC5maW5pc2hlZCIgdmFsdWU9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKyAgICA8dHN0YW1wIC8+CisgICAgPG1rZGlyIGRpcj0iJHtkaXN0fSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImdlbmVyYXRlLCBmbGV4LmluaXQsIGluaXQiPgorICAgIDxteG1sYyBvdXRwdXQ9IiR7c3dmLm5hbWV9IiBmaWxlPSIke3NyY30vQ2FsY3VsYXRvclVJLmFzIj4KKyAgICAgIDxzb3VyY2UtcGF0aCBwYXRoLWVsZW1lbnQ9IiR7Z2VufSIgLz4KKyAgICAgIDxzb3VyY2UtcGF0aCBwYXRoLWVsZW1lbnQ9IiR7c3JjfSIgLz4KKyAgICAgIDxzb3VyY2UtcGF0aCBwYXRoLWVsZW1lbnQ9IiR7dGhyaWZ0LnNyY30iIC8+CisgICAgPC9teG1sYz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZSI+CisgICAgPCEtLSBHZW5lcmF0ZSB0aGUgdGhyaWZ0IGdlbi1qYXZhIHNvdXJjZSAtLT4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGFzMyAuLi9zaGFyZWQudGhyaWZ0Ii8+CisgICAgPC9leGVjPgorICAgIDxleGVjIGV4ZWN1dGFibGU9Ii4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxhcmcgbGluZT0iLS1nZW4gYXMzIC4uL3R1dG9yaWFsLnRocmlmdCIvPgorICAgIDwvZXhlYz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7Z2VufSIvPgorICAgIDxkZWxldGUgZGlyPSIke2Rpc3R9IiAvPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvYXMzL3NyYy9DYWxjdWxhdG9yVUkuYXMgYi90dXRvcmlhbC9hczMvc3JjL0NhbGN1bGF0b3JVSS5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTk2ZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvYXMzL3NyYy9DYWxjdWxhdG9yVUkuYXMKQEAgLTAsMCArMSwxNDIgQEAKK3BhY2thZ2UgeworICBpbXBvcnQgZmxhc2guZGlzcGxheS5TcHJpdGU7CisgIGltcG9ydCBmbGFzaC50ZXh0LlRleHRGaWVsZDsKKyAgaW1wb3J0IGZsYXNoLnRleHQuVGV4dEZpZWxkVHlwZTsKKyAgaW1wb3J0IGZsYXNoLmV2ZW50cy5Nb3VzZUV2ZW50OworICBpbXBvcnQgZmxhc2guc3lzdGVtLlNlY3VyaXR5OworCisgIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNvY2tldDsKKyAgaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworICBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworICBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOworCisgIC8qKgorICAgKiBTaW1wbGUgaW50ZXJmYWNlIGFuZCBjb25uZWN0aW9uIGxvZ2ljIGltcGxlbWVudGF0aW9uIGZvciB0dXRvcmlhbC4KKyAgICovCisgIHB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yVUkgZXh0ZW5kcyBTcHJpdGUgeworICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgQlVUVE9OX1BBRERJTkc6dWludCA9IDU7CisKKyAgICBwcml2YXRlIHZhciBtQ2FsY3VsYXRvckNsaWVudDpDYWxjdWxhdG9yOyAvLyB3ZSB1c2UgY2FsY3VsYXRvciB0aHJvdWdoIGludGVyZmFjZQorICAgIHByaXZhdGUgdmFyIG1UcmFuc3BvcnQ6VFRyYW5zcG9ydDsgLy8gVHJhbnNwb3J0LCB1c2VkIHRvIGNvbXVuaWNhdGUgd2l0aCBzZXJ2ZXIKKworICAgIHByaXZhdGUgdmFyIG1BZGRCdXR0b246U3ByaXRlOworICAgIHByaXZhdGUgdmFyIG1MZWZ0OlRleHRGaWVsZDsKKyAgICBwcml2YXRlIHZhciBtUmlnaHQ6VGV4dEZpZWxkOworICAgIHByaXZhdGUgdmFyIG1SZXN1bHQ6VGV4dEZpZWxkOworCisgICAgcHJpdmF0ZSB2YXIgcGluZ0J1dHRvbjpTcHJpdGU7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gQ2FsY3VsYXRvclVJKCkgeworICAgICAgYnVpbGRJbnRlcmZhY2UoKTsKKyAgICAgIGluaXRTZWN1cml0eSgpOworICAgICAgaW5pdENvbm5lY3Rpb24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGluaXRTZWN1cml0eSgpOnZvaWQgeworICAgICAgU2VjdXJpdHkubG9hZFBvbGljeUZpbGUoInhtbHNvY2tldDovLzEyNy4wLjAuMTo5MDkyIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhhbXBsZSBvZiBpbml0aWFsaXppbmcgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIGluaXRDb25uZWN0aW9uKCk6dm9pZCB7CisgICAgICBtVHJhbnNwb3J0ID0gbmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIDkwOTApOyAvLyB3ZSBjb25uZWN0IHRvIHNlcnZlcgorICAgICAgbVRyYW5zcG9ydC5vcGVuKCk7CisgICAgICAvLyBpbml0aWFsaXplIHByb3RvY29sOgorICAgICAgdmFyIHByb3RvY29sOlRQcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wobVRyYW5zcG9ydCwgZmFsc2UsIGZhbHNlKTsKKyAgICAgIG1DYWxjdWxhdG9yQ2xpZW50ID0gbmV3IENhbGN1bGF0b3JJbXBsKHByb3RvY29sKTsgLy8gZmluYWxseSwgd2UgY3JlYXRlIGNhbGN1bGF0b3IgY2xpZW50IGluc3RhbmNlCisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBvblBpbmdDbGljayhtZTpNb3VzZUV2ZW50KTp2b2lkIHsKKyAgICAgIGlmKCFtVHJhbnNwb3J0LmlzT3BlbigpKSByZXR1cm47CisgICAgICBtQ2FsY3VsYXRvckNsaWVudC5waW5nKG9uUGluZ0Vycm9yLCBvblBpbmdTdWNjZXNzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIG9uUGluZ0Vycm9yKGVycm9yOkVycm9yKTp2b2lkIHsKKyAgICAgIHRyYWNlKCJFcnJvciwgd2hpbGUgcmVxdWVzdGluZyBwaW5nLiIpOworICAgICAgdGhyb3cgZXJyb3I7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBvblBpbmdTdWNjZXNzKCk6dm9pZCB7CisgICAgICB0cmFjZSgiUGluZyByZXR1cm5lZCBzdWNjZXNzZnVsbHkiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIG9uQWRkQ2xpY2sobWU6TW91c2VFdmVudCk6dm9pZCB7CisgICAgICBpZighbVRyYW5zcG9ydC5pc09wZW4oKSkgcmV0dXJuOworICAgICAgdmFyIG51bTE6TnVtYmVyID0gTnVtYmVyKG1MZWZ0LnRleHQpOworICAgICAgdmFyIG51bTI6TnVtYmVyID0gTnVtYmVyKG1SaWdodC50ZXh0KTsKKyAgICAgIG1SZXN1bHQudGV4dCA9ICJQcm9jZXNzaW5nLi4uIjsKKyAgICAgIG1DYWxjdWxhdG9yQ2xpZW50LmFkZChudW0xLCBudW0yLCBvbkFkZEVycm9yLCBvbkFkZFN1Y2Nlc3MpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gb25BZGRFcnJvcihlcnJvcjpFcnJvcik6dm9pZCB7CisgICAgICB0cmFjZSgiRXJyb3IsIHdoaWxlIHJlcXVlc3RpbmcgYWRkLiIpOworICAgICAgdGhyb3cgZXJyb3I7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBvbkFkZFN1Y2Nlc3MocmVzOk51bWJlcik6dm9pZCB7CisgICAgICBtUmVzdWx0LnRleHQgPSBTdHJpbmcocmVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGJ1aWxkSW50ZXJmYWNlKCk6dm9pZCB7CisgICAgICBhZGRDaGlsZChwaW5nQnV0dG9uID0gYnVpbGRCdXR0b24oIlBJTkciKSk7CisgICAgICBwaW5nQnV0dG9uLnggPSAoc3RhZ2Uuc3RhZ2VXaWR0aCAtIHBpbmdCdXR0b24ud2lkdGgpIC8gMjsKKyAgICAgIHBpbmdCdXR0b24ueSA9IDEwOworICAgICAgcGluZ0J1dHRvbi5hZGRFdmVudExpc3RlbmVyKE1vdXNlRXZlbnQuQ0xJQ0ssIG9uUGluZ0NsaWNrKTsKKworICAgICAgdmFyIHRvcDpOdW1iZXIgPSBwaW5nQnV0dG9uLnkgKyBwaW5nQnV0dG9uLmhlaWdodCArIDIwOworICAgICAgYWRkQ2hpbGQobUxlZnQgPSBidWlsZERpZ2l0SW5wdXQoKSk7CisgICAgICBtTGVmdC54ID0gMTU7CisgICAgICBtTGVmdC55ID0gdG9wICsgQlVUVE9OX1BBRERJTkc7CisgICAgICBhZGRDaGlsZChtUmlnaHQgPSBidWlsZERpZ2l0SW5wdXQoKSk7CisgICAgICBtUmlnaHQueCA9IG1MZWZ0LnggKyBtTGVmdC53aWR0aCArIDE1OworICAgICAgbVJpZ2h0LnkgPSB0b3AgKyBCVVRUT05fUEFERElORzsKKyAgICAgIGFkZENoaWxkKG1BZGRCdXR0b24gPSBidWlsZEJ1dHRvbigiQUREIikpOworICAgICAgbUFkZEJ1dHRvbi54ID0gbVJpZ2h0LnggKyBtUmlnaHQud2lkdGggKyAxNTsKKyAgICAgIG1BZGRCdXR0b24ueSA9IHRvcDsKKyAgICAgIG1BZGRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihNb3VzZUV2ZW50LkNMSUNLLCBvbkFkZENsaWNrKTsKKyAgICAgIGFkZENoaWxkKG1SZXN1bHQgPSBidWlsZERpZ2l0SW5wdXQoKSk7CisgICAgICBtUmVzdWx0LnggPSBtQWRkQnV0dG9uLnggKyBtQWRkQnV0dG9uLndpZHRoICsgMTU7CisgICAgICBtUmVzdWx0LnkgPSB0b3AgKyBCVVRUT05fUEFERElORzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW1wbGUgZGlnaXQtb25seSBpbnB1dCBmaWVsZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIGJ1aWxkRGlnaXRJbnB1dCgpOlRleHRGaWVsZCB7CisgICAgICB2YXIgdGV4dEZpZWxkOlRleHRGaWVsZCA9IG5ldyBUZXh0RmllbGQ7CisgICAgICB0ZXh0RmllbGQud2lkdGggPSA3NTsKKyAgICAgIHRleHRGaWVsZC5oZWlnaHQgPSAyMDsKKyAgICAgIHRleHRGaWVsZC5yZXN0cmljdCA9ICIwOTg3NjU0MzIxLiI7CisgICAgICB0ZXh0RmllbGQudHlwZSA9IFRleHRGaWVsZFR5cGUuSU5QVVQ7CisgICAgICB0ZXh0RmllbGQuYmFja2dyb3VuZCA9IHRydWU7CisgICAgICB0ZXh0RmllbGQuYmFja2dyb3VuZENvbG9yID0gMHhhYWFhZmY7CisgICAgICB0ZXh0RmllbGQudGV4dENvbG9yID0gMHhmZmZmMDA7CisgICAgICByZXR1cm4gdGV4dEZpZWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbXBsZSBidXR0b24gZHJhd2luZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIGJ1aWxkQnV0dG9uKHRleHQ6U3RyaW5nKTpTcHJpdGUgeworICAgICAgdmFyIGJ1dHRvbjpTcHJpdGUgPSBuZXcgU3ByaXRlOworICAgICAgdmFyIHRleHRGaWVsZDpUZXh0RmllbGQgPSBuZXcgVGV4dEZpZWxkOworICAgICAgdGV4dEZpZWxkLndpZHRoID0gNDAwMDsKKyAgICAgIHRleHRGaWVsZC50ZXh0ID0gdGV4dDsKKyAgICAgIHRleHRGaWVsZC50ZXh0Q29sb3IgPSAweGZmZmYwMDsKKyAgICAgIHRleHRGaWVsZC53aWR0aCA9IHRleHRGaWVsZC50ZXh0V2lkdGggKyA0OworICAgICAgdGV4dEZpZWxkLmhlaWdodCA9IHRleHRGaWVsZC50ZXh0SGVpZ2h0ICsgNDsKKyAgICAgIHRleHRGaWVsZC5tb3VzZUVuYWJsZWQgPSBmYWxzZTsKKyAgICAgIGJ1dHRvbi5ncmFwaGljcy5iZWdpbkZpbGwoMHgwMDAwZmYpOworICAgICAgYnV0dG9uLmdyYXBoaWNzLmxpbmVTdHlsZSgwLCAweDAwMDAwMCk7CisgICAgICBidXR0b24uZ3JhcGhpY3MuZHJhd1JvdW5kUmVjdCgwLCAwLCB0ZXh0RmllbGQud2lkdGggKyBCVVRUT05fUEFERElORyAqIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RmllbGQuaGVpZ2h0ICsgQlVUVE9OX1BBRERJTkcgKiAyLCBCVVRUT05fUEFERElORyk7CisgICAgICBidXR0b24uZ3JhcGhpY3MuZW5kRmlsbCgpOworICAgICAgYnV0dG9uLmFkZENoaWxkKHRleHRGaWVsZCk7CisgICAgICB0ZXh0RmllbGQueCA9IEJVVFRPTl9QQURESU5HOworICAgICAgdGV4dEZpZWxkLnkgPSBCVVRUT05fUEFERElORzsKKyAgICAgIGJ1dHRvbi51c2VIYW5kQ3Vyc29yID0gYnV0dG9uLmJ1dHRvbk1vZGUgPSB0cnVlOworICAgICAgcmV0dXJuIGJ1dHRvbjsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NfZ2xpYi9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL2NfZ2xpYi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZGJlNjU1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY19nbGliL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsODQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzIHNlcmlhbC10ZXN0cworCitCVUlMVF9TT1VSQ0VTID0gXAorCWdlbi1jX2dsaWIvY2FsY3VsYXRvci5oIFwKKwlnZW4tY19nbGliL3NoYXJlZF9zZXJ2aWNlLmggXAorCWdlbi1jX2dsaWIvc2hhcmVkX3R5cGVzLmggXAorCWdlbi1jX2dsaWIvdHV0b3JpYWxfdHlwZXMuaAorCitBTV9DRkxBR1MgPSAtZyAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYyAkKEdMSUJfQ0ZMQUdTKSAkKEdPQkpFQ1RfQ0ZMQUdTKSAkKE9QRU5TU0xfSU5DTFVERVMpIEBHQ09WX0NGTEFHU0AKK0FNX0NQUEZMQUdTID0gLUkkKHRvcF9zcmNkaXIpL2xpYi9jX2dsaWIvc3JjIC1JZ2VuLWNfZ2xpYgorQU1fTERGTEFHUyA9ICQoR0xJQl9MSUJTKSAkKEdPQkpFQ1RfTElCUykgJChPUEVOU1NMX0xERkxBR1MpICQoT1BFTlNTTF9MSUJTKSBAR0NPVl9MREZMQUdTQAorCitub2luc3RfTFRMSUJSQVJJRVMgPSBcCisJbGlidHV0b3JpYWxnZW5jZ2xpYi5sYQorCitub2Rpc3RfbGlidHV0b3JpYWxnZW5jZ2xpYl9sYV9TT1VSQ0VTID0gXAorCWdlbi1jX2dsaWIvY2FsY3VsYXRvci5jIFwKKwlnZW4tY19nbGliL2NhbGN1bGF0b3IuaCBcCisJZ2VuLWNfZ2xpYi9zaGFyZWRfc2VydmljZS5jIFwKKwlnZW4tY19nbGliL3NoYXJlZF9zZXJ2aWNlLmggXAorCWdlbi1jX2dsaWIvc2hhcmVkX3R5cGVzLmMgXAorCWdlbi1jX2dsaWIvc2hhcmVkX3R5cGVzLmggXAorCWdlbi1jX2dsaWIvdHV0b3JpYWxfdHlwZXMuYyBcCisJZ2VuLWNfZ2xpYi90dXRvcmlhbF90eXBlcy5oCisKK2xpYnR1dG9yaWFsZ2VuY2dsaWJfbGFfTElCQUREID0gXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL2xpYnRocmlmdF9jX2dsaWIubGEKKworbGlidHV0b3JpYWxnZW5jZ2xpYl9sYV9DRkxBR1MgPSBcCisJJChBTV9DRkxBR1MpIC1Xbm8tdW51c2VkLWZ1bmN0aW9uCisKK25vaW5zdF9QUk9HUkFNUyA9IFwKKwl0dXRvcmlhbF9zZXJ2ZXIgXAorCXR1dG9yaWFsX2NsaWVudAorCit0dXRvcmlhbF9zZXJ2ZXJfU09VUkNFUyA9IFwKKwljX2dsaWJfc2VydmVyLmMKK3R1dG9yaWFsX3NlcnZlcl9MREZMQUdTID0gJChPUEVOU1NMX0xJQlMpCisKK3R1dG9yaWFsX3NlcnZlcl9MREFERCA9IFwKKwlsaWJ0dXRvcmlhbGdlbmNnbGliLmxhIFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9saWJ0aHJpZnRfY19nbGliLmxhCisKK3R1dG9yaWFsX2NsaWVudF9TT1VSQ0VTID0gXAorCWNfZ2xpYl9jbGllbnQuYworCit0dXRvcmlhbF9jbGllbnRfTERBREQgPSBcCisJbGlidHV0b3JpYWxnZW5jZ2xpYi5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvbGlidGhyaWZ0X2NfZ2xpYi5sYQorCisKK2dlbi1jX2dsaWIvY2FsY3VsYXRvci5jIGdlbi1jX2dsaWIvY2FsY3VsYXRvci5oIGdlbi1jX2dsaWIvc2hhcmVkX3NlcnZpY2UuYyBnZW4tY19nbGliL3NoYXJlZF9zZXJ2aWNlLmggZ2VuLWNfZ2xpYi9zaGFyZWRfdHlwZXMuYyBnZW4tY19nbGliL3NoYXJlZF90eXBlcy5oIGdlbi1jX2dsaWIvdHV0b3JpYWxfdHlwZXMuYyBnZW4tY19nbGliL3R1dG9yaWFsX3R5cGVzLmg6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNfZ2xpYiAtciAkPAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSBnZW4tY19nbGliLyoKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCS4vdHV0b3JpYWxfc2VydmVyCisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwkuL3R1dG9yaWFsX2NsaWVudAorCitFWFRSQV9ESVNUID0gXAorCWNfZ2xpYl9zZXJ2ZXIuYyBcCisJY19nbGliX2NsaWVudC5jCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jX2dsaWIvY19nbGliX2NsaWVudC5jIGIvdHV0b3JpYWwvY19nbGliL2NfZ2xpYl9jbGllbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODZkNTE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY19nbGliL2NfZ2xpYl9jbGllbnQuYwpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKworI2luY2x1ZGUgImdlbi1jX2dsaWIvY2FsY3VsYXRvci5oIgorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQ7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0OworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2w7CisgIENhbGN1bGF0b3JJZiAqY2xpZW50OworCisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworICBJbnZhbGlkT3BlcmF0aW9uICppbnZhbGlkX29wZXJhdGlvbiA9IE5VTEw7CisKKyAgV29yayAqd29yazsKKworICBnaW50MzIgc3VtOworICBnaW50MzIgZGlmZjsKKworICBpbnQgZXhpdF9zdGF0dXMgPSAwOworCisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQgKCk7CisjZW5kaWYKKworICBzb2NrZXQgICAgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUiLCAgImxvY2FsaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCAgICAgIDkwOTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCBzb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIHByb3RvY29sICA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsICZlcnJvcik7CisKKworICAvKiBJbiB0aGUgQyAoR0xpYikgaW1wbGVtZW50YXRpb24gb2YgVGhyaWZ0LCBzZXJ2aWNlIG1ldGhvZHMgb24gdGhlCisgICAgIHNlcnZlciBhcmUgYWNjZXNzZWQgdmlhIGEgZ2VuZXJhdGVkIGNsaWVudCBjbGFzcyB0aGF0IGltcGxlbWVudHMKKyAgICAgdGhlIHNlcnZpY2UgaW50ZXJmYWNlLiBJbiB0aGlzIHR1dG9yaWFsLCB3ZSBhY2Nlc3MgYSBDYWxjdWxhdG9yCisgICAgIHNlcnZpY2UgdGhyb3VnaCBhbiBpbnN0YW5jZSBvZiBDYWxjdWxhdG9yQ2xpZW50LCB3aGljaCBpbXBsZW1lbnRzCisgICAgIENhbGN1bGF0b3JJZi4gKi8KKyAgY2xpZW50ID0gZ19vYmplY3RfbmV3IChUWVBFX0NBTENVTEFUT1JfQ0xJRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dF9wcm90b2NvbCIsICBwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0X3Byb3RvY29sIiwgcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgLyogRWFjaCBvZiB0aGUgY2xpZW50IG1ldGhvZHMgcmVxdWlyZXMgYXQgbGVhc3QgdHdvIHBhcmFtZXRlcnM6IEEKKyAgICAgcG9pbnRlciB0byB0aGUgY2xpZW50LWludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiAodGhlIGNsaWVudAorICAgICBvYmplY3QpLCBhbmQgYSBoYW5kbGUgdG8gYSBHRXJyb3Igc3RydWN0dXJlIHRvIHJlY2VpdmUKKyAgICAgaW5mb3JtYXRpb24gYWJvdXQgYW55IGVycm9yIHRoYXQgb2NjdXJzLgorCisgICAgIE9uIHN1Y2Nlc3MsIGNsaWVudCBtZXRob2RzIHJldHVybiBUUlVFLiBBIHJldHVybiB2YWx1ZSBvZiBGQUxTRQorICAgICBpbmRpY2F0ZXMgYW4gZXJyb3Igb2NjdXJyZWQgYW5kIHRoZSBlcnJvciBwYXJhbWV0ZXIgaGFzIGJlZW4KKyAgICAgc2V0LiAqLworICBpZiAoIWVycm9yICYmIGNhbGN1bGF0b3JfaWZfcGluZyAoY2xpZW50LCAmZXJyb3IpKSB7CisgICAgcHV0cyAoInBpbmcoKSIpOworICB9CisKKyAgLyogU2VydmljZSBtZXRob2RzIHRoYXQgcmV0dXJuIGEgdmFsdWUgZG8gc28gYnkgcGFzc2luZyB0aGUgcmVzdWx0CisgICAgIGJhY2sgdmlhIGFuIG91dHB1dCBwYXJhbWV0ZXIgKGhlcmUsICJzdW0iKS4gKi8KKyAgaWYgKCFlcnJvciAmJiBjYWxjdWxhdG9yX2lmX2FkZCAoY2xpZW50LCAmc3VtLCAxLCAxLCAmZXJyb3IpKSB7CisgICAgcHJpbnRmICgiMSsxPSVkXG4iLCBzdW0pOworICB9CisKKyAgLyogVGhyaWZ0IHN0cnVjdHMgYXJlIGltcGxlbWVudGVkIGFzIEdPYmplY3RzLCB3aXRoIGVhY2ggb2YgdGhlCisgICAgIHN0cnVjdCdzIG1lbWJlcnMgZXhwb3NlZCBhcyBhbiBvYmplY3QgcHJvcGVydHkuICovCisgIHdvcmsgPSBnX29iamVjdF9uZXcgKFRZUEVfV09SSywgTlVMTCk7CisKKyAgaWYgKCFlcnJvcikgeworICAgIGdfb2JqZWN0X3NldCAod29yaywKKyAgICAgICAgICAgICAgICAgICJudW0xIiwgMSwKKyAgICAgICAgICAgICAgICAgICJudW0yIiwgMCwKKyAgICAgICAgICAgICAgICAgICJvcCIsICAgT1BFUkFUSU9OX0RJVklERSwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgLyogRXhjZXB0aW9ucyBhcmUgcGFzc2VkIGJhY2sgZnJvbSBzZXJ2aWNlIG1ldGhvZHMgaW4gYSBtYW5uZXIKKyAgICAgICBzaW1pbGFyIHRvIHJldHVybiB2YWx1ZXMuICovCisgICAgaWYgKGNhbGN1bGF0b3JfaWZfY2FsY3VsYXRlIChjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW52YWxpZF9vcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICBwdXRzICgiV2hvYT8gV2UgY2FuIGRpdmlkZSBieSB6ZXJvISIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmIChpbnZhbGlkX29wZXJhdGlvbikgeworICAgICAgICBnY2hhciAqd2h5OworCisgICAgICAgIC8qIExpa2Ugc3RydWN0cywgZXhjZXB0aW9ucyBhcmUgaW1wbGVtZW50ZWQgYXMgb2JqZWN0cyB3aXRoCisgICAgICAgICAgIHByb3BlcnRpZXMuICovCisgICAgICAgIGdfb2JqZWN0X2dldCAoaW52YWxpZF9vcGVyYXRpb24sICJ3aHkiLCAmd2h5LCBOVUxMKTsKKworICAgICAgICBwcmludGYgKCJJbnZhbGlkT3BlcmF0aW9uOiAlc1xuIiwgd2h5KTsKKworICAgICAgICBpZiAod2h5ICE9IE5VTEwpCisgICAgICAgICAgZ19mcmVlICh3aHkpOworICAgICAgICBnX29iamVjdF91bnJlZiAoaW52YWxpZF9vcGVyYXRpb24pOworICAgICAgICBpbnZhbGlkX29wZXJhdGlvbiA9IE5VTEw7CisgICAgICB9CisKKyAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnJvcik7CisgICAgfQorICB9CisKKyAgaWYgKCFlcnJvcikgeworICAgIC8qIFN0cnVjdCBvYmplY3RzIGNhbiBiZSByZXVzZWQgYWNyb3NzIG1ldGhvZCBpbnZvY2F0aW9ucy4gKi8KKyAgICBnX29iamVjdF9zZXQgKHdvcmssCisgICAgICAgICAgICAgICAgICAibnVtMSIsIDE1LAorICAgICAgICAgICAgICAgICAgIm51bTIiLCAxMCwKKyAgICAgICAgICAgICAgICAgICJvcCIsICAgT1BFUkFUSU9OX1NVQlRSQUNULAorICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICBpZiAoY2FsY3VsYXRvcl9pZl9jYWxjdWxhdGUgKGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW52YWxpZF9vcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICBwcmludGYgKCIxNS0xMD0lZFxuIiwgZGlmZik7CisgICAgfQorICB9CisKKyAgZ19vYmplY3RfdW5yZWYgKHdvcmspOworCisgIGlmICghZXJyb3IpIHsKKyAgICBTaGFyZWRTdHJ1Y3QgKnNoYXJlZF9zdHJ1Y3Q7CisgICAgZ2NoYXIgKnZhbHVlOworCisgICAgc2hhcmVkX3N0cnVjdCA9IGdfb2JqZWN0X25ldyAoVFlQRV9TSEFSRURfU1RSVUNULCBOVUxMKTsKKworICAgIC8qIEFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBmaWxlLCB0aGUgQ2FsY3VsYXRvciBzZXJ2aWNlIGV4dGVuZHMKKyAgICAgICB0aGUgU2hhcmVkU2VydmljZSBzZXJ2aWNlLiBDb3JyZXNwb25kaW5nbHksIGluIHRoZSBnZW5lcmF0ZWQKKyAgICAgICBjb2RlIENhbGN1bGF0b3JJZiBpbmhlcml0cyBmcm9tIFNoYXJlZFNlcnZpY2VJZiwgYW5kIHRoZSBwYXJlbnQKKyAgICAgICBzZXJ2aWNlJ3MgbWV0aG9kcyBhcmUgYWNjZXNzaWJsZSB0aHJvdWdoIGEgc2ltcGxlIGNhc3QuICovCisgICAgaWYgKHNoYXJlZF9zZXJ2aWNlX2NsaWVudF9nZXRfc3RydWN0IChTSEFSRURfU0VSVklDRV9JRiAoY2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaGFyZWRfc3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgIGdfb2JqZWN0X2dldCAoc2hhcmVkX3N0cnVjdCwgInZhbHVlIiwgJnZhbHVlLCBOVUxMKTsKKyAgICAgIHByaW50ZiAoIkNoZWNrIGxvZzogJXNcbiIsIHZhbHVlKTsKKyAgICAgIGdfZnJlZSAodmFsdWUpOworICAgIH0KKworICAgIGdfb2JqZWN0X3VucmVmIChzaGFyZWRfc3RydWN0KTsKKyAgfQorCisgIGlmIChlcnJvcikgeworICAgIHByaW50ZiAoIkVSUk9SOiAlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgIGdfY2xlYXJfZXJyb3IgKCZlcnJvcik7CisKKyAgICBleGl0X3N0YXR1cyA9IDE7CisgIH0KKworICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICBnX29iamVjdF91bnJlZiAocHJvdG9jb2wpOworICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKyAgZ19vYmplY3RfdW5yZWYgKHNvY2tldCk7CisKKyAgcmV0dXJuIGV4aXRfc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY19nbGliL2NfZ2xpYl9zZXJ2ZXIuYyBiL3R1dG9yaWFsL2NfZ2xpYi9jX2dsaWJfc2VydmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdiZjQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NfZ2xpYi9jX2dsaWJfc2VydmVyLmMKQEAgLTAsMCArMSw1MjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgorCisjaW5jbHVkZSAiZ2VuLWNfZ2xpYi9jYWxjdWxhdG9yLmgiCisKK0dfQkVHSU5fREVDTFMKKworLyogSW4gdGhlIEMgKEdMaWIpIGltcGxlbWVudGF0aW9uIG9mIFRocmlmdCwgdGhlIGFjdHVhbCB3b3JrIGRvbmUgYnkgYQorICAgc2VydmVyLS0tdGhhdCBpcywgdGhlIGNvZGUgdGhhdCBydW5zIHdoZW4gYSBjbGllbnQgaW52b2tlcyBhCisgICBzZXJ2aWNlIG1ldGhvZC0tLWlzIGRlZmluZWQgaW4gYSBzZXBhcmF0ZSAiaGFuZGxlciIgY2xhc3MgdGhhdAorICAgaW1wbGVtZW50cyB0aGUgc2VydmljZSBpbnRlcmZhY2UuIEhlcmUgd2UgZGVmaW5lIHRoZQorICAgVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlciBjbGFzcywgd2hpY2ggaW1wbGVtZW50cyB0aGUgQ2FsY3VsYXRvcklmCisgICBpbnRlcmZhY2UgYW5kIHByb3ZpZGVzIHRoZSBiZWhhdmlvciBleHBlY3RlZCBieSB0dXRvcmlhbCBjbGllbnRzLgorICAgKFR5cGljYWxseSB0aGlzIGNvZGUgd291bGQgYmUgcGxhY2VkIGluIGl0cyBvd24gbW9kdWxlIGJ1dCBmb3IKKyAgIGNsYXJpdHkgdGhpcyB0dXRvcmlhbCBpcyBwcmVzZW50ZWQgZW50aXJlbHkgaW4gYSBzaW5nbGUgZmlsZS4pCisKKyAgIEZvciBlYWNoIHNlcnZpY2UgdGhlIFRocmlmdCBjb21waWxlciBnZW5lcmF0ZXMgYW4gYWJzdHJhY3QgYmFzZQorICAgY2xhc3MgZnJvbSB3aGljaCBoYW5kbGVyIGltcGxlbWVudGF0aW9ucyBzaG91bGQgaW5oZXJpdC4gSW4gb3VyCisgICBjYXNlIFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXIgaW5oZXJpdHMgZnJvbSBDYWxjdWxhdG9ySGFuZGxlciwKKyAgIGRlZmluZWQgaW4gZ2VuLWNfZ2xpYi9jYWxjdWxhdG9yLmguCisKKyAgIElmIHlvdSdyZSBuZXcgdG8gR09iamVjdCwgdHJ5IG5vdCB0byBiZSBpbnRpbWlkYXRlZCBieSB0aGUgcXVhbnRpdHkKKyAgIG9mIGNvZGUgaGVyZS0tLW11Y2ggb2YgaXQgaXMgYm9pbGVycGxhdGUgYW5kIGNhbiBtb3N0bHkgYmUKKyAgIGNvcGllZC1hbmQtcGFzdGVkIGZyb20gZXhpc3Rpbmcgd29yay4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVmZXIgdG8KKyAgIHRoZSBHT2JqZWN0IFJlZmVyZW5jZSBNYW51YWwsIGF2YWlsYWJsZSBvbmxpbmUgYXQKKyAgIGh0dHBzOi8vZGV2ZWxvcGVyLmdub21lLm9yZy9nb2JqZWN0Ly4gKi8KKworI2RlZmluZSBUWVBFX1RVVE9SSUFMX0NBTENVTEFUT1JfSEFORExFUiBcCisgICh0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfZ2V0X3R5cGUgKCkpCisKKyNkZWZpbmUgVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1RVVE9SSUFMX0NBTENVTEFUT1JfSEFORExFUiwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyKSkKKyNkZWZpbmUgVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSX0NMQVNTKGMpICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyQ2xhc3MpKQorI2RlZmluZSBJU19UVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVIob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSKSkKKyNkZWZpbmUgSVNfVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSX0NMQVNTKGMpICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSKSkKKyNkZWZpbmUgVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSX0dFVF9DTEFTUyhvYmopICAgICAgICAgICAgICBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9UVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXJDbGFzcykpCisKK3N0cnVjdCBfVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlciB7CisgIENhbGN1bGF0b3JIYW5kbGVyIHBhcmVudF9pbnN0YW5jZTsKKworICAvKiBwcml2YXRlICovCisgIEdIYXNoVGFibGUgKmxvZzsKK307Cit0eXBlZGVmIHN0cnVjdCBfVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlciBUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyOworCitzdHJ1Y3QgX1R1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXJDbGFzcyB7CisgIENhbGN1bGF0b3JIYW5kbGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKK3R5cGVkZWYgc3RydWN0IF9UdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyQ2xhc3MgVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlckNsYXNzOworCitHVHlwZSB0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyIGZvbGxvd3MuICovCisKK0dfREVGSU5FX1RZUEUgKFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXIsCisgICAgICAgICAgICAgICB0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXIsCisgICAgICAgICAgICAgICBUWVBFX0NBTENVTEFUT1JfSEFORExFUikKKworLyogRWFjaCBvZiBhIGhhbmRsZXIncyBtZXRob2RzIGFjY2VwdHMgYXQgbGVhc3QgdHdvIHBhcmFtZXRlcnM6IEEKKyAgIHBvaW50ZXIgdG8gdGhlIHNlcnZpY2UtaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uICh0aGUgaGFuZGxlciBvYmplY3QKKyAgIGl0c2VsZikgYW5kIGEgaGFuZGxlIHRvIGEgR0Vycm9yIHN0cnVjdHVyZSB0byByZWNlaXZlIGluZm9ybWF0aW9uCisgICBhYm91dCBhbnkgZXJyb3IgdGhhdCBvY2N1cnMuCisKKyAgIE9uIHN1Y2Nlc3MsIGEgaGFuZGxlciBtZXRob2QgcmV0dXJucyBUUlVFLiBBIHJldHVybiB2YWx1ZSBvZiBGQUxTRQorICAgaW5kaWNhdGVzIGFuIGVycm9yIG9jY3VycmVkIGFuZCB0aGUgZXJyb3IgcGFyYW1ldGVyIGhhcyBiZWVuCisgICBzZXQuIChNZXRob2RzIHNob3VsZCBub3QgcmV0dXJuIEZBTFNFIHdpdGhvdXQgZmlyc3Qgc2V0dGluZyB0aGUKKyAgIGVycm9yIHBhcmFtZXRlci4pICovCitzdGF0aWMgZ2Jvb2xlYW4KK3R1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlcl9waW5nIChDYWxjdWxhdG9ySWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwdXRzICgicGluZygpIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIFNlcnZpY2UtbWV0aG9kIHBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0aHJvdWdoIGFzIHBhcmFtZXRlcnMgdG8gdGhlCisgICBoYW5kbGVyIG1ldGhvZC4KKworICAgSWYgdGhlIHNlcnZpY2UgbWV0aG9kIHJldHVybnMgYSB2YWx1ZSBhbiBvdXRwdXQgcGFyYW1ldGVyLCBfcmV0dXJuLAorICAgaXMgYWRkaXRpb25hbGx5IHBhc3NlZCB0byB0aGUgaGFuZGxlciBtZXRob2QuIFRoaXMgcGFyYW1ldGVyIHNob3VsZAorICAgYmUgc2V0IGFwcHJvcHJpYXRlbHkgYmVmb3JlIHRoZSBtZXRob2QgcmV0dXJucywgd2hlbmV2ZXIgaXQKKyAgIHN1Y2NlZWRzLgorCisgICBUaGUgcmV0dXJuIHZhbHVlIGZyb20gdGhpcyBtZXRob2QgaGFwcGVucyB0byBiZSBvZiBhIGJhc2UgdHlwZSwKKyAgIGkzMiwgYnV0IG5vdGUgaWYgYSBtZXRob2QgcmV0dXJucyBhIGNvbXBsZXggdHlwZSBzdWNoIGFzIGEgbWFwIG9yCisgICBsaXN0ICpfcmV0dXJuIHdpbGwgcG9pbnQgdG8gYSBwcmUtYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlIHRoYXQKKyAgIGRvZXMgbm90IG5lZWQgdG8gYmUgcmUtYWxsb2NhdGVkIGFuZCBzaG91bGQgbm90IGJlIGRlc3Ryb3llZC4gKi8KK3N0YXRpYyBnYm9vbGVhbgordHV0b3JpYWxfY2FsY3VsYXRvcl9oYW5kbGVyX2FkZCAoQ2FsY3VsYXRvcklmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgICAgICAgICpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyICAgbnVtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgIG51bTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJhZGQoJWQsJWQpXG4iLCBudW0xLCBudW0yKTsKKyAgKl9yZXR1cm4gPSBudW0xICsgbnVtMjsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogQW55IGhhbmRsZXIgbWV0aG9kIGNhbiByZXR1cm4gYSBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB0byB0aGUKKyAgIGNsaWVudCBieSBzZXR0aW5nIGl0cyBlcnJvciBwYXJhbWV0ZXIgYXBwcm9wcmlhdGVseSBhbmQgcmV0dXJuaW5nCisgICBGQUxTRS4gU2VlIHRoZSBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbkVycm9yIGVudW1lcmF0aW9uIGRlZmluZWQKKyAgIGluIHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaCBmb3IgYSBsaXN0IG9mIHJlY29nbml6ZWQKKyAgIGV4Y2VwdGlvbiB0eXBlcyAoR0Vycm9yIGNvZGVzKS4KKworICAgSWYgYSBzZXJ2aWNlIG1ldGhvZCBjYW4gYWxzbyB0aHJvdyBhIGN1c3RvbSBleGNlcHRpb24gKHRoYXQgaXMsIG9uZQorICAgZGVmaW5lZCBpbiB0aGUgLnRocmlmdCBmaWxlKSBhbiBhZGRpdGlvbmFsIG91dHB1dCBwYXJhbWV0ZXIgd2lsbCBiZQorICAgcHJvdmlkZWQgKGhlcmUsICJvdWNoIikgdG8gaG9sZCBhbiBpbnN0YW5jZSBvZiB0aGUgZXhjZXB0aW9uLCB3aGVuCisgICBuZWNlc3NhcnkuIE5vdGUgdGhlcmUgd2lsbCBiZSBhIHNlcGFyYXRlIHBhcmFtZXRlciBhZGRlZCBmb3IgZWFjaAorICAgdHlwZSBvZiBleGNlcHRpb24gdGhlIG1ldGhvZCBjYW4gdGhyb3cuCisKKyAgIFVubGlrZSByZXR1cm4gdmFsdWVzLCBleGNlcHRpb24gb2JqZWN0cyBhcmUgbmV2ZXIgcHJlLWNyZWF0ZWQ7IHRoaXMKKyAgIGlzIGFsd2F5cyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGhhbmRsZXIgbWV0aG9kLiAqLworc3RhdGljIGdib29sZWFuCit0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfY2FsY3VsYXRlIChDYWxjdWxhdG9ySWYgICAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgICAgICAgICAgICAqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgICAgICBsb2dpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmsgICAgICAgICp3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZE9wZXJhdGlvbiAqKm91Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICoqZXJyb3IpCit7CisgIFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXIgKnNlbGY7CisKKyAgZ2ludCAqbG9nX2tleTsKKyAgZ2NoYXIgbG9nX3ZhbHVlWzEyXTsKKyAgU2hhcmVkU3RydWN0ICpsb2dfc3RydWN0OworCisgIGdpbnQgbnVtMTsKKyAgZ2ludCBudW0yOworICBPcGVyYXRpb24gb3A7CisgIGdib29sZWFuIHJlc3VsdCA9IFRSVUU7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoSVNfVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSIChpZmFjZSksCisgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisgIHNlbGYgPSBUVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVIgKGlmYWNlKTsKKworICAvKiBSZW1lbWJlcjogRXhjZXB0aW9uIG9iamVjdHMgYXJlIG5ldmVyIHByZS1jcmVhdGVkICovCisgIGdfYXNzZXJ0ICgqb3VjaCA9PSBOVUxMKTsKKworICAvKiBGZXRjaCB0aGUgY29udGVudHMgb2Ygb3VyIFdvcmsgcGFyYW1ldGVyLgorCisgICAgIE5vdGUgdGhhdCBpbnRlZ2VyIHByb3BlcnRpZXMgb2YgdGhpcnR5LXR3byBiaXRzIG9yIGZld2VyIGluIHdpZHRoCisgICAgIGFyZSBfYWx3YXlzXyBvZiB0eXBlIGdpbnQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHJhbmdlIG9mIHZhbHVlcyB0aGV5CisgICAgIGhvbGQuIEEgY29tbW9uIGVycm9yIGlzIHRyeWluZyB0byByZXRyaWV2ZSwgc2F5LCBhIHN0cnVjdHVyZQorICAgICBtZW1iZXIgZGVmaW5lZCBpbiB0aGUgLnRocmlmdCBmaWxlIGFzIHR5cGUgaTE2IGludG8gYSB2YXJpYWJsZSBvZgorICAgICB0eXBlIGdpbnQxNiwgd2hpY2ggd2lsbCBjbG9iYmVyIHZhcmlhYmxlcyBhZGphY2VudCBvbiB0aGUKKyAgICAgc3RhY2suIFJlbWVtYmVyOiBJZiB5b3UncmUgcmV0cmlldmluZyBhbiBpbnRlZ2VyIHByb3BlcnR5IHRoZQorICAgICByZWNlaXZpbmcgdmFyaWFibGUgbXVzdCBiZSBvZiBlaXRoZXIgdHlwZSBnaW50IG9yIGdpbnQ2NCwgYXMKKyAgICAgYXBwcm9wcmlhdGUuICovCisgIGdfb2JqZWN0X2dldCAoKFdvcmsgKil3LAorICAgICAgICAgICAgICAgICJudW0xIiwgJm51bTEsCisgICAgICAgICAgICAgICAgIm51bTIiLCAmbnVtMiwKKyAgICAgICAgICAgICAgICAib3AiLCAgICZvcCwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBwcmludGYgKCJjYWxjdWxhdGUoJWQseyVkLCVkLCVkfSlcbiIsIGxvZ2lkLCBvcCwgbnVtMSwgbnVtMik7CisKKyAgc3dpdGNoIChvcCkgeworICBjYXNlIE9QRVJBVElPTl9BREQ6CisgICAgKl9yZXR1cm4gPSBudW0xICsgbnVtMjsKKyAgICBicmVhazsKKworICBjYXNlIE9QRVJBVElPTl9TVUJUUkFDVDoKKyAgICAqX3JldHVybiA9IG51bTEgLSBudW0yOworICAgIGJyZWFrOworCisgIGNhc2UgT1BFUkFUSU9OX01VTFRJUExZOgorICAgICpfcmV0dXJuID0gbnVtMSAqIG51bTI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBPUEVSQVRJT05fRElWSURFOgorICAgIGlmIChudW0yID09IDApIHsKKyAgICAgIC8qIEZvciBlYWNoIGN1c3RvbSBleGNlcHRpb24gdHlwZSBhIHN1YmNsYXNzIG9mIFRocmlmdFN0cnVjdCBpcworICAgICAgICAgZ2VuZXJhdGVkIGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIuIFRocm93IGFuIGV4Y2VwdGlvbiBieQorICAgICAgICAgc2V0dGluZyB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQgcGFyYW1ldGVyIHRvIGEgbmV3IGluc3RhbmNlCisgICAgICAgICBvZiBpdHMgdHlwZSBhbmQgcmV0dXJuaW5nIEZBTFNFLiAqLworICAgICAgKm91Y2ggPSBnX29iamVjdF9uZXcgKFRZUEVfSU5WQUxJRF9PUEVSQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndoYXRPcCIsIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aHkiLCAgZ19zdHJkdXAgKCJDYW5ub3QgZGl2aWRlIGJ5IDAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIHJlc3VsdCA9IEZBTFNFOworCisgICAgICAvKiBOb3RlIHRoZSBjYWxsIHRvIGdfc3RyZHVwIGFib3ZlOiBBbGwgdGhlIG1lbW9yeSB1c2VkIGJ5IGEKKyAgICAgICAgIFRocmlmdFN0cnVjdCdzIHByb3BlcnRpZXMgYmVsb25ncyB0byB0aGUgb2JqZWN0IGl0c2VsZiBhbmQKKyAgICAgICAgIHdpbGwgYmUgZnJlZWQgb24gZGVzdHJ1Y3Rpb24uIFJlbW92aW5nIHRoaXMgY2FsbCB0byBnX3N0cmR1cAorICAgICAgICAgd2lsbCBsZWFkIHRvIGEgc2VnbWVudGF0aW9uIGZhdWx0IGFzIHRoZSBvYmplY3QgdHJpZXMgdG8KKyAgICAgICAgIHJlbGVhc2UgbWVtb3J5IGFsbG9jYXRlZCBzdGF0aWNhbGx5IHRvIHRoZSBwcm9ncmFtLiAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICpfcmV0dXJuID0gbnVtMSAvIG51bTI7CisgICAgfQorICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgKm91Y2ggPSBnX29iamVjdF9uZXcgKFRZUEVfSU5WQUxJRF9PUEVSQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGF0T3AiLCBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIndoeSIsICBnX3N0cmR1cCAoIkludmFsaWQgT3BlcmF0aW9uIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIHJlc3VsdCA9IEZBTFNFOworICB9CisKKyAgLyogT24gc3VjY2VzcywgbG9nIGEgcmVjb3JkIG9mIHRoZSByZXN1bHQgdG8gb3VyIGhhc2ggdGFibGUgKi8KKyAgaWYgKHJlc3VsdCkgeworICAgIGxvZ19rZXkgPSBnX21hbGxvYyAoc2l6ZW9mICpsb2dfa2V5KTsKKyAgICAqbG9nX2tleSA9IGxvZ2lkOworCisgICAgc25wcmludGYgKGxvZ192YWx1ZSwgc2l6ZW9mIGxvZ192YWx1ZSwgIiVkIiwgKl9yZXR1cm4pOworCisgICAgbG9nX3N0cnVjdCA9IGdfb2JqZWN0X25ldyAoVFlQRV9TSEFSRURfU1RSVUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrZXkiLCAgICpsb2dfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIsICBnX3N0cmR1cCAobG9nX3ZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBnX2hhc2hfdGFibGVfcmVwbGFjZSAoc2VsZi0+bG9nLCBsb2dfa2V5LCBsb2dfc3RydWN0KTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIEEgb25lLXdheSBtZXRob2QgaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyBhbiBlcXVpdmFsZW50LCByZWd1bGFyCisgICBtZXRob2QgdGhhdCByZXR1cm5zIG5vIHZhbHVlLiAqLworc3RhdGljIGdib29sZWFuCit0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfemlwIChDYWxjdWxhdG9ySWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHB1dHMgKCJ6aXAoKSIpOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBBcyBzcGVjaWZpZWQgaW4gdGhlIC50aHJpZnQgZmlsZSAodHV0b3JpYWwudGhyaWZ0KSwgdGhlIENhbGN1bGF0b3IKKyAgIHNlcnZpY2UgZXh0ZW5kcyB0aGUgU2hhcmVkU2VydmljZSBzZXJ2aWNlLiBDb3JyZXNwb25kaW5nbHksIGluIHRoZQorICAgZ2VuZXJhdGVkIGNvZGUgdGhlIENhbGN1bGF0b3IgaW50ZXJmYWNlLCBDYWxjdWxhdG9ySWYsIGV4dGVuZHMgdGhlCisgICBTaGFyZWRTZXJ2aWNlIGludGVyZmFjZSwgU2hhcmVkU2VydmljZUlmLCBhbmQgc3ViY2xhc3NlcyBvZgorICAgQ2FsY3VsYXRvckhhbmRsZXIgc2hvdWxkIGltcGxlbWVudCBpdHMgbWV0aG9kcyBhcyB3ZWxsLgorCisgICBIZXJlIHdlIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gZm9yIHRoZSBnZXRTdHJ1Y3QgbWV0aG9kIGZyb20gdGhlCisgICBwYXJlbnQgc2VydmljZS4gKi8KK3N0YXRpYyBnYm9vbGVhbgordHV0b3JpYWxfY2FsY3VsYXRvcl9oYW5kbGVyX2dldF9zdHJ1Y3QgKFNoYXJlZFNlcnZpY2VJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoYXJlZFN0cnVjdCAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyICAgICAga2V5MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICoqZXJyb3IpCit7CisgIGdpbnQga2V5ID0gKGdpbnQpa2V5MzI7CisgIFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXIgKnNlbGY7CisgIFNoYXJlZFN0cnVjdCAqbG9nX3N0cnVjdDsKKyAgZ2ludCBsb2dfa2V5OworICBnY2hhciAqbG9nX3ZhbHVlOworCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKElTX1RVVE9SSUFMX0NBTENVTEFUT1JfSEFORExFUiAoaWZhY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOworICBzZWxmID0gVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSIChpZmFjZSk7CisKKyAgLyogUmVtZW1iZXI6IENvbXBsZXggcmV0dXJuIHR5cGVzIGFyZSBhbHdheXMgcHJlLWNyZWF0ZWQgYW5kIG5lZWQKKyAgICAgb25seSBiZSBwb3B1bGF0ZWQgKi8KKyAgZ19hc3NlcnQgKCpfcmV0dXJuICE9IE5VTEwpOworCisgIHByaW50ZiAoImdldFN0cnVjdCglZClcbiIsIGtleSk7CisKKyAgLyogSWYgdGhlIGtleSBleGlzdHMgaW4gb3VyIGxvZywgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGxvZ2dlZAorICAgICBkYXRhIChvciBhbiBlbXB0eSBTaGFyZWRTdHJ1Y3Qgc3RydWN0dXJlIGlmIGl0IGRvZXMgbm90KS4KKworICAgICBJbmNpZGVudGFsbHksIG5vdGUgd2UgX211c3RfIGhlcmUgY29weSB0aGUgdmFsdWVzIGZyb20gdGhlIGhhc2gKKyAgICAgdGFibGUgaW50byB0aGUgcmV0dXJuIHN0cnVjdHVyZS4gQWxsIG1lbW9yeSB1c2VkIGJ5IHRoZSByZXR1cm4KKyAgICAgc3RydWN0dXJlIGJlbG9uZ3MgdG8gdGhlIHN0cnVjdHVyZSBpdHNlbGYgYW5kIHdpbGwgYmUgZnJlZWQgb25jZQorICAgICBhIHJlc3BvbnNlIGlzIHNlbnQgdG8gdGhlIGNsaWVudC4gSWYgd2UgbWVyZWx5IGZyZWVkICpfcmV0dXJuIGFuZAorICAgICBzZXQgaXQgdG8gcG9pbnQgdG8gb3VyIGhhc2gtdGFibGUgZW50cnksIHRoYXQgd291bGQgbWVhbiBtZW1vcnkKKyAgICAgd291bGQgYmUgcmVsZWFzZWQgKGVmZmVjdGl2ZWx5LCBkYXRhIGVyYXNlZCkgb3V0IG9mIHRoZSBoYXNoCisgICAgIHRhYmxlISAqLworICBsb2dfc3RydWN0ID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAoc2VsZi0+bG9nLCAma2V5KTsKKyAgaWYgKGxvZ19zdHJ1Y3QgIT0gTlVMTCkgeworICAgIGdfb2JqZWN0X2dldCAobG9nX3N0cnVjdCwKKyAgICAgICAgICAgICAgICAgICJrZXkiLCAgICZsb2dfa2V5LAorICAgICAgICAgICAgICAgICAgInZhbHVlIiwgJmxvZ192YWx1ZSwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGdfb2JqZWN0X3NldCAoKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAia2V5IiwgICBsb2dfa2V5LAorICAgICAgICAgICAgICAgICAgInZhbHVlIiwgZ19zdHJkdXAgKGxvZ192YWx1ZSksCisgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKiBUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyJ3MgaW5zdGFuY2UgZmluYWxpemVyIChkZXN0cnVjdG9yKSAqLworc3RhdGljIHZvaWQKK3R1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlcl9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQoreworICBUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyICpzZWxmID0KKyAgICBUVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVIgKG9iamVjdCk7CisKKyAgLyogRnJlZSBvdXIgY2FsY3VsYXRpb24tbG9nIGhhc2ggdGFibGUgKi8KKyAgZ19oYXNoX3RhYmxlX3VucmVmIChzZWxmLT5sb2cpOworICBzZWxmLT5sb2cgPSBOVUxMOworCisgIC8qIENoYWluIHVwIHRvIHRoZSBwYXJlbnQgY2xhc3MgKi8KKyAgR19PQkpFQ1RfQ0xBU1MgKHR1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlcl9wYXJlbnRfY2xhc3MpLT4KKyAgICBmaW5hbGl6ZSAob2JqZWN0KTsKK30KKworLyogVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlcidzIGluc3RhbmNlIGluaXRpYWxpemVyIChjb25zdHJ1Y3RvcikgKi8KK3N0YXRpYyB2b2lkCit0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfaW5pdCAoVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlciAqc2VsZikKK3sKKyAgLyogQ3JlYXRlIG91ciBjYWxjdWxhdGlvbi1sb2cgaGFzaCB0YWJsZSAqLworICBzZWxmLT5sb2cgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfaW50X2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19pbnRfZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfb2JqZWN0X3VucmVmKTsKK30KKworLyogVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlcidzIGNsYXNzIGluaXRpYWxpemVyICovCitzdGF0aWMgdm9pZAordHV0b3JpYWxfY2FsY3VsYXRvcl9oYW5kbGVyX2NsYXNzX2luaXQgKFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXJDbGFzcyAqa2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIFNoYXJlZFNlcnZpY2VIYW5kbGVyQ2xhc3MgKnNoYXJlZF9zZXJ2aWNlX2hhbmRsZXJfY2xhc3MgPQorICAgIFNIQVJFRF9TRVJWSUNFX0hBTkRMRVJfQ0xBU1MgKGtsYXNzKTsKKyAgQ2FsY3VsYXRvckhhbmRsZXJDbGFzcyAqY2FsY3VsYXRvcl9oYW5kbGVyX2NsYXNzID0KKyAgICBDQUxDVUxBVE9SX0hBTkRMRVJfQ0xBU1MgKGtsYXNzKTsKKworICAvKiBSZWdpc3RlciBvdXIgZGVzdHJ1Y3RvciAqLworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHR1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlcl9maW5hbGl6ZTsKKworICAvKiBSZWdpc3RlciBvdXIgaW1wbGVtZW50YXRpb25zIG9mIENhbGN1bGF0b3JIYW5kbGVyJ3MgbWV0aG9kcyAqLworICBjYWxjdWxhdG9yX2hhbmRsZXJfY2xhc3MtPnBpbmcgPQorICAgIHR1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlcl9waW5nOworICBjYWxjdWxhdG9yX2hhbmRsZXJfY2xhc3MtPmFkZCA9CisgICAgdHV0b3JpYWxfY2FsY3VsYXRvcl9oYW5kbGVyX2FkZDsKKyAgY2FsY3VsYXRvcl9oYW5kbGVyX2NsYXNzLT5jYWxjdWxhdGUgPQorICAgIHR1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlcl9jYWxjdWxhdGU7CisgIGNhbGN1bGF0b3JfaGFuZGxlcl9jbGFzcy0+emlwID0KKyAgICB0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfemlwOworCisgIC8qIFJlZ2lzdGVyIG91ciBpbXBsZW1lbnRhdGlvbiBvZiBTaGFyZWRTZXJ2aWNlSGFuZGxlcidzIG1ldGhvZCAqLworICBzaGFyZWRfc2VydmljZV9oYW5kbGVyX2NsYXNzLT5nZXRfc3RydWN0ID0KKyAgICB0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfZ2V0X3N0cnVjdDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBUaGF0IGVuZHMgdGhlIGltcGxlbWVudGF0aW9uIG9mIFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXIuCisgICBFdmVyeXRoaW5nIGJlbG93IGlzIGZhaXJseSBnZW5lcmljIGNvZGUgdGhhdCBzZXRzIHVwIGEgbWluaW1hbAorICAgVGhyaWZ0IHNlcnZlciBmb3IgdHV0b3JpYWwgY2xpZW50cy4gKi8KKworCisvKiBPdXIgc2VydmVyIG9iamVjdCwgZGVjbGFyZWQgZ2xvYmFsbHkgc28gaXQgaXMgYWNjZXNzaWJsZSB3aXRoaW4gdGhlCisgICBTSUdJTlQgc2lnbmFsIGhhbmRsZXIgKi8KK1RocmlmdFNlcnZlciAqc2VydmVyID0gTlVMTDsKKworLyogQSBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNlcnZlciB3YXMgaW50ZXJydXB0ZWQgd2l0aAorICAgU0lHSU5UIChpLmUuIEN0cmwtQykgc28gd2UgY2FuIHRlbGwgd2hldGhlciBpdHMgdGVybWluYXRpb24gd2FzCisgICBhYm5vcm1hbCAqLworZ2Jvb2xlYW4gc2lnaW50X3JlY2VpdmVkID0gRkFMU0U7CisKKy8qIEhhbmRsZSBTSUdJTlQgKCJDdHJsLUMiKSBzaWduYWxzIGJ5IGdyYWNlZnVsbHkgc3RvcHBpbmcgdGhlCisgICBzZXJ2ZXIgKi8KK3N0YXRpYyB2b2lkCitzaWdpbnRfaGFuZGxlciAoaW50IHNpZ25hbF9udW1iZXIpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChzaWduYWxfbnVtYmVyKTsKKworICAvKiBUYWtlIG5vdGUgd2Ugd2VyZSBjYWxsZWQgKi8KKyAgc2lnaW50X3JlY2VpdmVkID0gVFJVRTsKKworICAvKiBTaHV0IGRvd24gdGhlIHNlcnZlciBncmFjZWZ1bGx5ICovCisgIGlmIChzZXJ2ZXIgIT0gTlVMTCkKKyAgICB0aHJpZnRfc2VydmVyX3N0b3AgKHNlcnZlcik7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyICpoYW5kbGVyOworICBDYWxjdWxhdG9yUHJvY2Vzc29yICpwcm9jZXNzb3I7CisKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICpzZXJ2ZXJfdHJhbnNwb3J0OworICBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICp0cmFuc3BvcnRfZmFjdG9yeTsKKyAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpwcm90b2NvbF9mYWN0b3J5OworCisgIHN0cnVjdCBzaWdhY3Rpb24gc2lnaW50X2FjdGlvbjsKKworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKyAgaW50IGV4aXRfc3RhdHVzID0gMDsKKworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0ICgpOworI2VuZGlmCisKKyAgLyogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIG91ciBoYW5kbGVyLCB3aGljaCBwcm92aWRlcyB0aGUgc2VydmljZSdzCisgICAgIG1ldGhvZHMnIGltcGxlbWVudGF0aW9uICovCisgIGhhbmRsZXIgPQorICAgIGdfb2JqZWN0X25ldyAoVFlQRV9UVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVIsCisgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHNlcnZpY2UncyBwcm9jZXNzb3IsIGF1dG9tYXRpY2FsbHkKKyAgICAgZ2VuZXJhdGVkIGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIsIHdoaWNoIHBhcnNlcyBpbmNvbWluZyBtZXNzYWdlcworICAgICBhbmQgZGlzcGF0Y2hlcyB0aGVtIHRvIHRoZSBhcHByb3ByaWF0ZSBtZXRob2QgaW4gdGhlIGhhbmRsZXIgKi8KKyAgcHJvY2Vzc29yID0KKyAgICBnX29iamVjdF9uZXcgKFRZUEVfQ0FMQ1VMQVRPUl9QUk9DRVNTT1IsCisgICAgICAgICAgICAgICAgICAiaGFuZGxlciIsIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiBDcmVhdGUgb3VyIHNlcnZlciBzb2NrZXQsIHdoaWNoIGJpbmRzIHRvIHRoZSBzcGVjaWZpZWQgcG9ydCBhbmQKKyAgICAgbGlzdGVucyBmb3IgY2xpZW50IGNvbm5lY3Rpb25zICovCisgIHNlcnZlcl90cmFuc3BvcnQgPQorICAgIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICJwb3J0IiwgOTA5MCwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIC8qIENyZWF0ZSBvdXIgdHJhbnNwb3J0IGZhY3RvcnksIHVzZWQgYnkgdGhlIHNlcnZlciB0byB3cmFwICJyYXciCisgICAgIGluY29taW5nIGNvbm5lY3Rpb25zIGZyb20gdGhlIGNsaWVudCAoaW4gdGhpcyBjYXNlIHdpdGggYQorICAgICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlKSAqLworICB0cmFuc3BvcnRfZmFjdG9yeSA9CisgICAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWSwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIC8qIENyZWF0ZSBvdXIgcHJvdG9jb2wgZmFjdG9yeSwgd2hpY2ggZGV0ZXJtaW5lcyB3aGljaCB3aXJlIHByb3RvY29sCisgICAgIHRoZSBzZXJ2ZXIgd2lsbCB1c2UgKGluIHRoaXMgY2FzZSwgVGhyaWZ0J3MgYmluYXJ5IHByb3RvY29sKSAqLworICBwcm90b2NvbF9mYWN0b3J5ID0KKyAgICBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZLAorICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgLyogQ3JlYXRlIHRoZSBzZXJ2ZXIgaXRzZWxmICovCisgIHNlcnZlciA9CisgICAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSLAorICAgICAgICAgICAgICAgICAgInByb2Nlc3NvciIsICAgICAgICAgICAgICAgIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICJzZXJ2ZXJfdHJhbnNwb3J0IiwgICAgICAgICBzZXJ2ZXJfdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgImlucHV0X3RyYW5zcG9ydF9mYWN0b3J5IiwgIHRyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgIm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSIsIHRyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgImlucHV0X3Byb3RvY29sX2ZhY3RvcnkiLCAgIHByb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAib3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkiLCAgcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIC8qIEluc3RhbGwgb3VyIFNJR0lOVCBoYW5kbGVyLCB3aGljaCBoYW5kbGVzIEN0cmwtQyBiZWluZyBwcmVzc2VkIGJ5CisgICAgIHN0b3BwaW5nIHRoZSBzZXJ2ZXIgZ3JhY2VmdWxseSAobm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgYnV0IGEKKyAgICAgbmljZSB0b3VjaCkgKi8KKyAgbWVtc2V0ICgmc2lnaW50X2FjdGlvbiwgMCwgc2l6ZW9mIChzaWdpbnRfYWN0aW9uKSk7CisgIHNpZ2ludF9hY3Rpb24uc2FfaGFuZGxlciA9IHNpZ2ludF9oYW5kbGVyOworICBzaWdpbnRfYWN0aW9uLnNhX2ZsYWdzID0gU0FfUkVTRVRIQU5EOworICBzaWdhY3Rpb24gKFNJR0lOVCwgJnNpZ2ludF9hY3Rpb24sIE5VTEwpOworCisgIC8qIFN0YXJ0IHRoZSBzZXJ2ZXIsIHdoaWNoIHdpbGwgcnVuIHVudGlsIGl0cyBzdG9wIG1ldGhvZCBpcyBpbnZva2VkCisgICAgIChmcm9tIHdpdGhpbiB0aGUgU0lHSU5UIGhhbmRsZXIsIGluIHRoaXMgY2FzZSkgKi8KKyAgcHV0cyAoIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4iKTsKKyAgdGhyaWZ0X3NlcnZlcl9zZXJ2ZSAoc2VydmVyLCAmZXJyb3IpOworCisgIC8qIElmIHRoZSBzZXJ2ZXIgc3RvcHBlZCBmb3IgYW55IHJlYXNvbiBvdGhlciB0aGFuIGhhdmluZyBiZWVuCisgICAgIGludGVycnVwdGVkIGJ5IHRoZSB1c2VyLCByZXBvcnQgdGhlIGVycm9yICovCisgIGlmICghc2lnaW50X3JlY2VpdmVkKSB7CisgICAgZ19tZXNzYWdlICgidGhyaWZ0X3NlcnZlcl9zZXJ2ZTogJXMiLAorICAgICAgICAgICAgICAgZXJyb3IgIT0gTlVMTCA/IGVycm9yLT5tZXNzYWdlIDogIihudWxsKSIpOworICAgIGdfY2xlYXJfZXJyb3IgKCZlcnJvcik7CisgIH0KKworICBwdXRzICgiZG9uZS4iKTsKKworICBnX29iamVjdF91bnJlZiAoc2VydmVyKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydF9mYWN0b3J5KTsKKyAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sX2ZhY3RvcnkpOworICBnX29iamVjdF91bnJlZiAoc2VydmVyX3RyYW5zcG9ydCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHByb2Nlc3Nvcik7CisgIGdfb2JqZWN0X3VucmVmIChoYW5kbGVyKTsKKworICByZXR1cm4gZXhpdF9zdGF0dXM7Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9jbC9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL2NsL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJiMjAxM2EKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jbC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDY1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworc2V0dXAtbG9jYWwtbGlzcC1lbnY6IGVuc3VyZS1leHRlcm5hbHMuc2gKKwliYXNoIGVuc3VyZS1leHRlcm5hbHMuc2gKKworZ2VuLWNsOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjbCAtciAkPAorCitBTExfRklMRV9QUkVSRVFTID0gXAorCQkgICBsb2FkLWxvY2FsbHkubGlzcCBcCisJCSAgIG1ha2UtdHV0b3JpYWwtc2VydmVyLmxpc3AgXAorCQkgICBtYWtlLXR1dG9yaWFsLWNsaWVudC5saXNwIFwKKwkJICAgc2hhcmVkLWltcGxlbWVudGF0aW9uLmxpc3AgXAorCQkgICB0aHJpZnQtdHV0b3JpYWwuYXNkIFwKKwkJICAgdHV0b3JpYWwtaW1wbGVtZW50YXRpb24ubGlzcAorCisjIE5PVEU6IHRoZSBzZXJ2ZXIgYW5kIGNsaWVudCBjYW5ub3QgYmUgYnVpbHQgaW4gcGFyYWxsZWwKKyMgYmVjYXVzZSBvbiBsb2FkaW5nIHRoZSBtYWtlLXR1dG9yaWFsLSogc2NyaXB0cyBTQkNMIHdpbGwKKyMgYXR0ZW1wdCB0byBjb21waWxlIHRoZWlyIGRlcGVuZGVuY2llcy4gVW5mb3J0dW5hdGVseSwKKyMgYmVjYXVzZSB0aGVpciBkZXBlbmRlbmNpZXMgYXJlIHNoYXJlZCwgcGFyYWxsZWwgam9icyBjYW4KKyMgZW5kIHVwIG92ZXJ3cml0aW5nIG9yIGNvcnJ1cHRpbmcgdGhlIGNvbXBpbGVkIGZpbGVzCithbGwtbG9jYWw6IGdlbi1jbCBzZXR1cC1sb2NhbC1saXNwLWVudiAkKEFMTF9GSUxFX1BSRVJFUVMpCisJJChTQkNMKSAtLXNjcmlwdCBtYWtlLXR1dG9yaWFsLXNlcnZlci5saXNwCisJJChTQkNMKSAtLXNjcmlwdCBtYWtlLXR1dG9yaWFsLWNsaWVudC5saXNwCisKK3R1dG9yaWFsc2VydmVyOiBhbGwKKwkuL1R1dG9yaWFsU2VydmVyCisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwkuL1R1dG9yaWFsQ2xpZW50CisKK2NsZWFuLWxvY2FsOgorCS0kKFJNKSAtciBnZW4tKgorCS0kKFJNKSAtciBleHRlcm5hbHMKKwktJChSTSkgLXIgcXVpY2tsaXNwCisJLSQoUk0pIC1yIGxpYgorCS0kKFJNKSBxdWlja2xpc3AubGlzcAorCS0kKFJNKSBiYWNrcG9ydC11cGRhdGUuemlwCisJLSQoUk0pIHNoYXJlZC1pbXBsZW1lbnRhdGlvbi5mYXNsCisJLSQoUk0pIHR1dG9yaWFsLWltcGxlbWVudGF0aW9uLmZhc2wKKwktJChSTSkgVHV0b3JpYWxTZXJ2ZXIKKwktJChSTSkgVHV0b3JpYWxDbGllbnQKKworRVhUUkFfRElTVCA9IFwKKwl0dXRvcmlhbC1pbXBsZW1lbnRhdGlvbi5saXNwIFwKKwlzaGFyZWQtaW1wbGVtZW50YXRpb24ubGlzcCBcCisJdGhyaWZ0LXR1dG9yaWFsLmFzZCBcCisJbWFrZS10dXRvcmlhbC1zZXJ2ZXIubGlzcCBcCisJbWFrZS10dXRvcmlhbC1jbGllbnQubGlzcApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY2wvZW5zdXJlLWV4dGVybmFscy5zaCBiL3R1dG9yaWFsL2NsL2Vuc3VyZS1leHRlcm5hbHMuc2gKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNWFlOGM1NgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NsL2Vuc3VyZS1leHRlcm5hbHMuc2gKQEAgLTAsMCArMSBAQAorLi4vLi4vbGliL2NsL2Vuc3VyZS1leHRlcm5hbHMuc2gKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jbC9sb2FkLWxvY2FsbHkubGlzcCBiL3R1dG9yaWFsL2NsL2xvYWQtbG9jYWxseS5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MmEwYTIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jbC9sb2FkLWxvY2FsbHkubGlzcApAQCAtMCwwICsxLDIyIEBACisoaW4tcGFja2FnZSAjOmNsLXVzZXIpCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOzs7OyBKdXN0IGEgc2NyaXB0IGZvciBsb2FkaW5nIHRoZSBsaWJyYXJ5IGl0c2VsZiwgdXNpbmcgYnVuZGxlZCBkZXBlbmRlbmNpZXMuCis7Ozs7IFRoaXMgaXMgYW4gaWRlbnRpY2FsIGNvcHkgb2YgdGhlIGZpbGUgaW4gbGliL2NsLgorCisocmVxdWlyZSAiYXNkZiIpCisKKyhsb2FkIChtZXJnZS1wYXRobmFtZXMgImV4dGVybmFscy9idW5kbGUubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgImxpYi9kZS5zZXRmLnRocmlmdC1iYWNrcG9ydC11cGRhdGUvdGhyaWZ0LmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDp0aHJpZnQpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jbC9tYWtlLXR1dG9yaWFsLWNsaWVudC5saXNwIGIvdHV0b3JpYWwvY2wvbWFrZS10dXRvcmlhbC1jbGllbnQubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTZkODYxCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY2wvbWFrZS10dXRvcmlhbC1jbGllbnQubGlzcApAQCAtMCwwICsxLDUxIEBACisoaW4tcGFja2FnZSAjOmNsLXVzZXIpCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKHJlcXVpcmUgImFzZGYiKQorKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAibG9hZC1sb2NhbGx5Lmxpc3AiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6bmV0LmRpZGllcnZlcm5hLmNsb24pCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICJnZW4tY2wvc2hhcmVkL3RocmlmdC1nZW4tc2hhcmVkLmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgImdlbi1jbC90dXRvcmlhbC90aHJpZnQtZ2VuLXR1dG9yaWFsLmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgInRocmlmdC10dXRvcmlhbC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6dGhyaWZ0LXR1dG9yaWFsKQorCisobmV0LmRpZGllcnZlcm5hLmNsb246bmlja25hbWUtcGFja2FnZSkKKworKGRlZnVuIG1haW4gKCkKKyAgIkVudHJ5IHBvaW50IGZvciB0aGUgYmluYXJ5LiIKKyAgKHRocmlmdDp3aXRoLWNsaWVudCAocHJvdCAjdSJ0aHJpZnQ6Ly8xMjcuMC4wLjE6OTA5MCIpCisgICAgKHR1dG9yaWFsLmNhbGN1bGF0b3I6cGluZyBwcm90KQorICAgIChmb3JtYXQgdCAicGluZygpfiUiKQorICAgIChmb3JtYXQgdCAiMSArIDEgPSB+YX4lIiAodHV0b3JpYWwuY2FsY3VsYXRvcjphZGQgcHJvdCAxIDEpKQorICAgIChsZXQgKCh3b3JrLWluc3RhbmNlICh0dXRvcmlhbDptYWtlLXdvcmsgOm51bTEgNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm51bTIgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm9wIHR1dG9yaWFsOm9wZXJhdGlvbi5kaXZpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjb21tZW50ICJCb295YSEiKSkpCisgICAgICAoaGFuZGxlci1jYXNlIChmb3JtYXQgdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1IC8gMCA9IH5hIC0gT2gsIHJlYWxseT8gQW4gZXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIGhlcmUufiUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR1dG9yaWFsLmNhbGN1bGF0b3I6Y2FsY3VsYXRlIHByb3QgMSB3b3JrLWluc3RhbmNlKSkKKyAgICAgICAgKHR1dG9yaWFsOmludmFsaWRvcGVyYXRpb24gKGUpCisgICAgICAgICAgKGZvcm1hdCB0ICItLS1+JShFeHBlY3RlZCkgSW52YWxpZCBPcGVyYXRpb24gY2F1Z2h0OiB+JX5hfiUtLS1+JSIgZSkpKSkKKyAgICAobGV0ICgod29yay1pbnN0YW5jZSAodHV0b3JpYWw6bWFrZS13b3JrIDpudW0xIDE1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bnVtMiAxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm9wIHR1dG9yaWFsOm9wZXJhdGlvbi5zdWJ0cmFjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNvbW1lbnQgIlBsYXlpbmcgbmljZSB0aGlzIHRpbWUuIikpKQorICAgICAgKGhhbmRsZXItY2FzZSAoZm9ybWF0IHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTUgLSAxMCA9IH5hfiUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR1dG9yaWFsLmNhbGN1bGF0b3I6Y2FsY3VsYXRlIHByb3QgMSB3b3JrLWluc3RhbmNlKSkKKyAgICAgICAgKHR1dG9yaWFsOmludmFsaWRvcGVyYXRpb24gKGUpCisgICAgICAgICAgKGZvcm1hdCB0ICItLS1+JShVbmV4cGVjdGVkKSBJbnZhbGlkIE9wZXJhdGlvbiBjYXVnaHQ6IH4lfmF+JS0tLX4lIiBlKSkpKQorICAgIChmb3JtYXQgdCAiQ2hlY2sgbG9nOiB+YX4lIiAoc2hhcmVkLnNoYXJlZC1zZXJ2aWNlOmdldC1zdHJ1Y3QgcHJvdCAxKSkpKQorCisoY2xvbjpkdW1wICJUdXRvcmlhbENsaWVudCIgbWFpbikKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NsL21ha2UtdHV0b3JpYWwtc2VydmVyLmxpc3AgYi90dXRvcmlhbC9jbC9tYWtlLXR1dG9yaWFsLXNlcnZlci5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZjFhOTAKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jbC9tYWtlLXR1dG9yaWFsLXNlcnZlci5saXNwCkBAIC0wLDAgKzEsMjkgQEAKKyhpbi1wYWNrYWdlICM6Y2wtdXNlcikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisocmVxdWlyZSAiYXNkZiIpCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICJsb2FkLWxvY2FsbHkubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDpuZXQuZGlkaWVydmVybmEuY2xvbikKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgImdlbi1jbC9zaGFyZWQvdGhyaWZ0LWdlbi1zaGFyZWQuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAiZ2VuLWNsL3R1dG9yaWFsL3RocmlmdC1nZW4tdHV0b3JpYWwuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAidGhyaWZ0LXR1dG9yaWFsLmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDp0aHJpZnQtdHV0b3JpYWwpCisKKyhuZXQuZGlkaWVydmVybmEuY2xvbjpuaWNrbmFtZS1wYWNrYWdlKQorCisoZGVmdW4gbWFpbiAoKQorICAiRW50cnkgcG9pbnQgZm9yIHRoZSBiaW5hcnkuIgorICAodGhyaWZ0OnNlcnZlICN1InRocmlmdDovLzEyNy4wLjAuMTo5MDkwIiB0dXRvcmlhbDpjYWxjdWxhdG9yKSkKKworKGNsb246ZHVtcCAiVHV0b3JpYWxTZXJ2ZXIiIG1haW4pCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jbC9zaGFyZWQtaW1wbGVtZW50YXRpb24ubGlzcCBiL3R1dG9yaWFsL2NsL3NoYXJlZC1pbXBsZW1lbnRhdGlvbi5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOTc2MjYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jbC9zaGFyZWQtaW1wbGVtZW50YXRpb24ubGlzcApAQCAtMCwwICsxLDI1IEBACisoaW4tcGFja2FnZSAjOnNoYXJlZC1pbXBsZW1lbnRhdGlvbikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisoZGVmdmFyICpzdHJ1Y3RzKiAobWFrZS1oYXNoLXRhYmxlKSkKKworKGRlZnVuIHNoYXJlZC5zaGFyZWQtc2VydmljZS1pbXBsZW1lbnRhdGlvbjpnZXQtc3RydWN0IChrZXkpCisgIChmb3JtYXQgdCAiZ2V0U3RydWN0KH5hKX4lIiBrZXkpCisgIChnZXRoYXNoIGtleSAqc3RydWN0cyopKQorCisoZGVmdW4gYWRkLWxvZyAoa2V5IHZhbHVlKQorICAoc2V0ZiAoZ2V0aGFzaCBrZXkgKnN0cnVjdHMqKQorICAgICAgICAobWFrZS1pbnN0YW5jZSAnc2hhcmVkOnNoYXJlZHN0cnVjdAorICAgICAgICAgICAgICAgICAgICAgICA6a2V5IGtleQorICAgICAgICAgICAgICAgICAgICAgICA6dmFsdWUgKHdyaXRlLXRvLXN0cmluZyB2YWx1ZSkpKSkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NsL3RocmlmdC10dXRvcmlhbC5hc2QgYi90dXRvcmlhbC9jbC90aHJpZnQtdHV0b3JpYWwuYXNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMDM1MzcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jbC90aHJpZnQtdHV0b3JpYWwuYXNkCkBAIC0wLDAgKzEsMTcgQEAKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKGFzZGY6ZGVmc3lzdGVtICM6dGhyaWZ0LXR1dG9yaWFsCisgIDpkZXBlbmRzLW9uICgjOnRocmlmdC1nZW4tdHV0b3JpYWwpCisgIDpzZXJpYWwgdAorICA6Y29tcG9uZW50cyAoKDpmaWxlICJzaGFyZWQtaW1wbGVtZW50YXRpb24iKQorICAgICAgICAgICAgICAgKDpmaWxlICJ0dXRvcmlhbC1pbXBsZW1lbnRhdGlvbiIpKSkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NsL3R1dG9yaWFsLWltcGxlbWVudGF0aW9uLmxpc3AgYi90dXRvcmlhbC9jbC90dXRvcmlhbC1pbXBsZW1lbnRhdGlvbi5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOTJmZTQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jbC90dXRvcmlhbC1pbXBsZW1lbnRhdGlvbi5saXNwCkBAIC0wLDAgKzEsNDEgQEAKKyhpbi1wYWNrYWdlICM6dHV0b3JpYWwtaW1wbGVtZW50YXRpb24pCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKGRlZnVuIHR1dG9yaWFsLmNhbGN1bGF0b3ItaW1wbGVtZW50YXRpb246cGluZyAoKQorICAoZm9ybWF0IHQgInBpbmcoKX4lIikpCisKKyhkZWZ1biB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uOmFkZCAobnVtMSBudW0yKQorICAoZm9ybWF0IHQgImFkZCh+YSwgfmEpfiUiIG51bTEgbnVtMikKKyAgKCsgbnVtMSBudW0yKSkKKworKGRlZnVuIHR1dG9yaWFsLmNhbGN1bGF0b3ItaW1wbGVtZW50YXRpb246Y2FsY3VsYXRlIChsb2dpZCB3b3JrKQorICAoZm9ybWF0IHQgImNhbGN1bGF0ZSh+YSwgfmEpfiUiIGxvZ2lkIHdvcmspCisgIChoYW5kbGVyLWNhc2UKKyAgICAgIChsZXQqICgobnVtMSAodHV0b3JpYWw6d29yay1udW0xIHdvcmspKQorICAgICAgICAgICAgIChudW0yICh0dXRvcmlhbDp3b3JrLW51bTIgd29yaykpCisgICAgICAgICAgICAgKG9wICh0dXRvcmlhbDp3b3JrLW9wIHdvcmspKQorICAgICAgICAgICAgIChyZXN1bHQKKyAgICAgICAgICAgICAgKGNvbmQKKyAgICAgICAgICAgICAgICAoKD0gb3AgdHV0b3JpYWw6b3BlcmF0aW9uLmFkZCkgKCsgbnVtMSBudW0yKSkKKyAgICAgICAgICAgICAgICAoKD0gb3AgdHV0b3JpYWw6b3BlcmF0aW9uLnN1YnRyYWN0KSAoLSBudW0xIG51bTIpKQorICAgICAgICAgICAgICAgICgoPSBvcCB0dXRvcmlhbDpvcGVyYXRpb24ubXVsdGlwbHkpICgqIG51bTEgbnVtMikpCisgICAgICAgICAgICAgICAgKCg9IG9wIHR1dG9yaWFsOm9wZXJhdGlvbi5kaXZpZGUpICgvIG51bTEgbnVtMikpKSkpCisgICAgICAgIChzaGFyZWQtaW1wbGVtZW50YXRpb246OmFkZC1sb2cgbG9naWQgcmVzdWx0KQorICAgICAgICByZXN1bHQpCisgICAgKGRpdmlzaW9uLWJ5LXplcm8gKCkgKGVycm9yICd0dXRvcmlhbDppbnZhbGlkb3BlcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp3aHkgIkRpdmlzaW9uIGJ5IHplcm8uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6d2hhdC1vcCAodHV0b3JpYWw6d29yay1vcCB3b3JrKSkpKSkKKworKGRlZnVuIHR1dG9yaWFsLmNhbGN1bGF0b3ItaW1wbGVtZW50YXRpb246emlwICgpCisgIChmb3JtYXQgdCAiemlwKCl+JSIpKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3BwL0NNYWtlTGlzdHMudHh0IGIvdHV0b3JpYWwvY3BwL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MzRiNDEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jcHAvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw1NiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICIke0Jvb3N0X0lOQ0xVREVfRElSU30iKQorCisjTWFrZSBzdXJlIGdlbi1jcHAgZmlsZXMgY2FuIGJlIGluY2x1ZGVkCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iKQoraW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1jcHAiKQoraW5jbHVkZV9kaXJlY3RvcmllcygiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2xpYi9jcHAvc3JjIikKKworaW5jbHVkZShUaHJpZnRNYWNyb3MpCisKK3NldCh0dXRvcmlhbGdlbmNwcF9TT1VSQ0VTCisgICAgZ2VuLWNwcC9DYWxjdWxhdG9yLmNwcAorICAgIGdlbi1jcHAvU2hhcmVkU2VydmljZS5jcHAKKyAgICBnZW4tY3BwL3NoYXJlZF9jb25zdGFudHMuY3BwCisgICAgZ2VuLWNwcC9zaGFyZWRfdHlwZXMuY3BwCisgICAgZ2VuLWNwcC90dXRvcmlhbF9jb25zdGFudHMuY3BwCisgICAgZ2VuLWNwcC90dXRvcmlhbF90eXBlcy5jcHAKKykKK2FkZF9saWJyYXJ5KHR1dG9yaWFsZ2VuY3BwIFNUQVRJQyAke3R1dG9yaWFsZ2VuY3BwX1NPVVJDRVN9KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHR1dG9yaWFsZ2VuY3BwIHRocmlmdCkKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL0NhbGN1bGF0b3IuY3BwIGdlbi1jcHAvU2hhcmVkU2VydmljZS5jcHAgZ2VuLWNwcC9zaGFyZWRfY29uc3RhbnRzLmNwcCBnZW4tY3BwL3NoYXJlZF90eXBlcy5jcHAgZ2VuLWNwcC90dXRvcmlhbF9jb25zdGFudHMuY3BwIGdlbi1jcHAvdHV0b3JpYWxfdHlwZXMuY3BwCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwIC1yICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKykKKworYWRkX2V4ZWN1dGFibGUoVHV0b3JpYWxTZXJ2ZXIgQ3BwU2VydmVyLmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUdXRvcmlhbFNlcnZlciB0dXRvcmlhbGdlbmNwcCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUdXRvcmlhbFNlcnZlciB0aHJpZnQpCitpZiAoWkxJQl9GT1VORCkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKFR1dG9yaWFsU2VydmVyICR7WkxJQl9MSUJSQVJJRVN9KQorZW5kaWYgKCkKKworYWRkX2V4ZWN1dGFibGUoVHV0b3JpYWxDbGllbnQgQ3BwQ2xpZW50LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUdXRvcmlhbENsaWVudCB0dXRvcmlhbGdlbmNwcCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUdXRvcmlhbENsaWVudCB0aHJpZnQpCitpZiAoWkxJQl9GT1VORCkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKFR1dG9yaWFsQ2xpZW50ICR7WkxJQl9MSUJSQVJJRVN9KQorZW5kaWYgKCkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NwcC9DcHBDbGllbnQuY3BwIGIvdHV0b3JpYWwvY3BwL0NwcENsaWVudC5jcHAKaW5kZXggNGRhYzkwYy4uNTIwODQxMSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvY3BwL0NwcENsaWVudC5jcHAKKysrIGIvdHV0b3JpYWwvY3BwL0NwcENsaWVudC5jcHAKQEAgLTE3LDEzICsxNywxMSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KIAotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU29ja2V0Lmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgogCiAjaW5jbHVkZSAiLi4vZ2VuLWNwcC9DYWxjdWxhdG9yLmgiCiAKQEAgLTM1LDIyICszMywxOSBAQAogdXNpbmcgbmFtZXNwYWNlIHR1dG9yaWFsOwogdXNpbmcgbmFtZXNwYWNlIHNoYXJlZDsKIAotdXNpbmcgbmFtZXNwYWNlIGJvb3N0OwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzb2NrZXQobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApKTsKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpKTsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSk7CitpbnQgbWFpbigpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNvY2tldChuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCkpOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSk7CiAgIENhbGN1bGF0b3JDbGllbnQgY2xpZW50KHByb3RvY29sKTsKIAogICB0cnkgewogICAgIHRyYW5zcG9ydC0+b3BlbigpOwogCiAgICAgY2xpZW50LnBpbmcoKTsKLSAgICBwcmludGYoInBpbmcoKVxuIik7CisgICAgY291dCA8PCAicGluZygpIiA8PCBlbmRsOwogCi0gICAgaW50MzJfdCBzdW0gPSBjbGllbnQuYWRkKDEsMSk7Ci0gICAgcHJpbnRmKCIxKzE9JWRcbiIsIHN1bSk7CisgICAgY291dCA8PCAiMSArIDEgPSAiIDw8IGNsaWVudC5hZGQoMSwgMSkgPDwgZW5kbDsKIAogICAgIFdvcmsgd29yazsKICAgICB3b3JrLm9wID0gT3BlcmF0aW9uOjpESVZJREU7CkBAIC01OCwyNyArNTMsMjggQEAKICAgICB3b3JrLm51bTIgPSAwOwogCiAgICAgdHJ5IHsKLSAgICAgIGludDMyX3QgcXVvdGllbnQgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspOwotICAgICAgcHJpbnRmKCJXaG9hPyBXZSBjYW4gZGl2aWRlIGJ5IHplcm8hXG4iKTsKLSAgICB9IGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uICZpbykgewotICAgICAgcHJpbnRmKCJJbnZhbGlkT3BlcmF0aW9uOiAlc1xuIiwgaW8ud2h5LmNfc3RyKCkpOworICAgICAgY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKKyAgICAgIGNvdXQgPDwgIldob2E/IFdlIGNhbiBkaXZpZGUgYnkgemVybyEiIDw8IGVuZGw7CisgICAgfSBjYXRjaCAoSW52YWxpZE9wZXJhdGlvbiYgaW8pIHsKKyAgICAgIGNvdXQgPDwgIkludmFsaWRPcGVyYXRpb246ICIgPDwgaW8ud2h5IDw8IGVuZGw7CisgICAgICAvLyBvciB1c2luZyBnZW5lcmF0ZWQgb3BlcmF0b3I8PDogY291dCA8PCBpbyA8PCBlbmRsOworICAgICAgLy8gb3IgYnkgdXNpbmcgc3RkOjpleGNlcHRpb24gbmF0aXZlIG1ldGhvZCB3aGF0KCk6IGNvdXQgPDwgaW8ud2hhdCgpIDw8IGVuZGw7CiAgICAgfQogCiAgICAgd29yay5vcCA9IE9wZXJhdGlvbjo6U1VCVFJBQ1Q7CiAgICAgd29yay5udW0xID0gMTU7CiAgICAgd29yay5udW0yID0gMTA7CiAgICAgaW50MzJfdCBkaWZmID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKLSAgICBwcmludGYoIjE1LTEwPSVkXG4iLCBkaWZmKTsKKyAgICBjb3V0IDw8ICIxNSAtIDEwID0gIiA8PCBkaWZmIDw8IGVuZGw7CiAKICAgICAvLyBOb3RlIHRoYXQgQysrIHVzZXMgcmV0dXJuIGJ5IHJlZmVyZW5jZSBmb3IgY29tcGxleCB0eXBlcyB0byBhdm9pZAogICAgIC8vIGNvc3RseSBjb3B5IGNvbnN0cnVjdGlvbgogICAgIFNoYXJlZFN0cnVjdCBzczsKICAgICBjbGllbnQuZ2V0U3RydWN0KHNzLCAxKTsKLSAgICBwcmludGYoIkNoZWNrIGxvZzogJXNcbiIsIHNzLnZhbHVlLmNfc3RyKCkpOworICAgIGNvdXQgPDwgIlJlY2VpdmVkIGxvZzogIiA8PCBzcyA8PCBlbmRsOwogCiAgICAgdHJhbnNwb3J0LT5jbG9zZSgpOwotICB9IGNhdGNoIChURXhjZXB0aW9uICZ0eCkgewotICAgIHByaW50ZigiRVJST1I6ICVzXG4iLCB0eC53aGF0KCkpOworICB9IGNhdGNoIChURXhjZXB0aW9uJiB0eCkgeworICAgIGNvdXQgPDwgIkVSUk9SOiAiIDw8IHR4LndoYXQoKSA8PCBlbmRsOwogICB9Ci0KIH0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NwcC9DcHBTZXJ2ZXIuY3BwIGIvdHV0b3JpYWwvY3BwL0NwcFNlcnZlci5jcHAKaW5kZXggODYwMzgxZS4uZjczNzlkNSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvY3BwL0NwcFNlcnZlci5jcHAKKysrIGIvdHV0b3JpYWwvY3BwL0NwcFNlcnZlci5jcHAKQEAgLTE3LDE0ICsxNywxNiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgotI2luY2x1ZGUgPHNlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgotI2luY2x1ZGUgPHNlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVFRvU3RyaW5nLmg+CiAKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxzdGRleGNlcHQ+CkBAIC0zNCw2ICszNiw3IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7CkBAIC00MSwyMyArNDQsMTkgQEAKIHVzaW5nIG5hbWVzcGFjZSB0dXRvcmlhbDsKIHVzaW5nIG5hbWVzcGFjZSBzaGFyZWQ7CiAKLXVzaW5nIG5hbWVzcGFjZSBib29zdDsKLQogY2xhc3MgQ2FsY3VsYXRvckhhbmRsZXIgOiBwdWJsaWMgQ2FsY3VsYXRvcklmIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIENhbGN1bGF0b3JIYW5kbGVyKCkge30KIAotICB2b2lkIHBpbmcoKSB7Ci0gICAgcHJpbnRmKCJwaW5nKClcbiIpOwotICB9CisgIHZvaWQgcGluZygpIHsgY291dCA8PCAicGluZygpIiA8PCBlbmRsOyB9CiAKICAgaW50MzJfdCBhZGQoY29uc3QgaW50MzJfdCBuMSwgY29uc3QgaW50MzJfdCBuMikgewotICAgIHByaW50ZigiYWRkKCVkLCVkKVxuIiwgbjEsIG4yKTsKKyAgICBjb3V0IDw8ICJhZGQoIiA8PCBuMSA8PCAiLCAiIDw8IG4yIDw8ICIpIiA8PCBlbmRsOwogICAgIHJldHVybiBuMSArIG4yOwogICB9CiAKLSAgaW50MzJfdCBjYWxjdWxhdGUoY29uc3QgaW50MzJfdCBsb2dpZCwgY29uc3QgV29yayAmd29yaykgewotICAgIHByaW50ZigiY2FsY3VsYXRlKCVkLHslZCwlZCwlZH0pXG4iLCBsb2dpZCwgd29yay5vcCwgd29yay5udW0xLCB3b3JrLm51bTIpOworICBpbnQzMl90IGNhbGN1bGF0ZShjb25zdCBpbnQzMl90IGxvZ2lkLCBjb25zdCBXb3JrJiB3b3JrKSB7CisgICAgY291dCA8PCAiY2FsY3VsYXRlKCIgPDwgbG9naWQgPDwgIiwgIiA8PCB3b3JrIDw8ICIpIiA8PCBlbmRsOwogICAgIGludDMyX3QgdmFsOwogCiAgICAgc3dpdGNoICh3b3JrLm9wKSB7CkBAIC03Myw3ICs3Miw3IEBACiAgICAgY2FzZSBPcGVyYXRpb246OkRJVklERToKICAgICAgIGlmICh3b3JrLm51bTIgPT0gMCkgewogICAgICAgICBJbnZhbGlkT3BlcmF0aW9uIGlvOwotICAgICAgICBpby53aGF0ID0gd29yay5vcDsKKyAgICAgICAgaW8ud2hhdE9wID0gd29yay5vcDsKICAgICAgICAgaW8ud2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCI7CiAgICAgICAgIHRocm93IGlvOwogICAgICAgfQpAQCAtODEsNzQgKzgwLDEwMCBAQAogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIEludmFsaWRPcGVyYXRpb24gaW87Ci0gICAgICBpby53aGF0ID0gd29yay5vcDsKKyAgICAgIGlvLndoYXRPcCA9IHdvcmsub3A7CiAgICAgICBpby53aHkgPSAiSW52YWxpZCBPcGVyYXRpb24iOwogICAgICAgdGhyb3cgaW87CiAgICAgfQogCiAgICAgU2hhcmVkU3RydWN0IHNzOwogICAgIHNzLmtleSA9IGxvZ2lkOwotICAgIGNoYXIgYnVmZmVyWzEyXTsKLSAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJWQiLCB2YWwpOwotICAgIHNzLnZhbHVlID0gYnVmZmVyOworICAgIHNzLnZhbHVlID0gdG9fc3RyaW5nKHZhbCk7CiAKICAgICBsb2dbbG9naWRdID0gc3M7CiAKICAgICByZXR1cm4gdmFsOwogICB9CiAKLSAgdm9pZCBnZXRTdHJ1Y3QoU2hhcmVkU3RydWN0ICZyZXQsIGNvbnN0IGludDMyX3QgbG9naWQpIHsKLSAgICBwcmludGYoImdldFN0cnVjdCglZClcbiIsIGxvZ2lkKTsKKyAgdm9pZCBnZXRTdHJ1Y3QoU2hhcmVkU3RydWN0JiByZXQsIGNvbnN0IGludDMyX3QgbG9naWQpIHsKKyAgICBjb3V0IDw8ICJnZXRTdHJ1Y3QoIiA8PCBsb2dpZCA8PCAiKSIgPDwgZW5kbDsKICAgICByZXQgPSBsb2dbbG9naWRdOwogICB9CiAKLSAgdm9pZCB6aXAoKSB7Ci0gICAgcHJpbnRmKCJ6aXAoKVxuIik7Ci0gIH0KKyAgdm9pZCB6aXAoKSB7IGNvdXQgPDwgInppcCgpIiA8PCBlbmRsOyB9CiAKIHByb3RlY3RlZDoKICAgbWFwPGludDMyX3QsIFNoYXJlZFN0cnVjdD4gbG9nOwotCiB9OwogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKy8qCisgIENhbGN1bGF0b3JJZkZhY3RvcnkgaXMgY29kZSBnZW5lcmF0ZWQuCisgIENhbGN1bGF0b3JDbG9uZUZhY3RvcnkgaXMgdXNlZnVsIGZvciBnZXR0aW5nIGFjY2VzcyB0byB0aGUgc2VydmVyIHNpZGUgb2YgdGhlCisgIHRyYW5zcG9ydC4gIEl0IGlzIGFsc28gdXNlZnVsIGZvciBtYWtpbmcgcGVyLWNvbm5lY3Rpb24gc3RhdGUuICBXaXRob3V0IHRoaXMKKyAgQ2xvbmVGYWN0b3J5LCBhbGwgY29ubmVjdGlvbnMgd2lsbCBlbmQgdXAgc2hhcmluZyB0aGUgc2FtZSBoYW5kbGVyIGluc3RhbmNlLgorKi8KK2NsYXNzIENhbGN1bGF0b3JDbG9uZUZhY3RvcnkgOiB2aXJ0dWFsIHB1YmxpYyBDYWxjdWxhdG9ySWZGYWN0b3J5IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkNhbGN1bGF0b3JDbG9uZUZhY3RvcnkoKSB7fQorICB2aXJ0dWFsIENhbGN1bGF0b3JJZiogZ2V0SGFuZGxlcihjb25zdCA6OmFwYWNoZTo6dGhyaWZ0OjpUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKQorICB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2sgPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRTb2NrZXQ+KGNvbm5JbmZvLnRyYW5zcG9ydCk7CisgICAgY291dCA8PCAiSW5jb21pbmcgY29ubmVjdGlvblxuIjsKKyAgICBjb3V0IDw8ICJcdFNvY2tldEluZm86ICIgIDw8IHNvY2stPmdldFNvY2tldEluZm8oKSA8PCAiXG4iOworICAgIGNvdXQgPDwgIlx0UGVlckhvc3Q6ICIgICAgPDwgc29jay0+Z2V0UGVlckhvc3QoKSA8PCAiXG4iOworICAgIGNvdXQgPDwgIlx0UGVlckFkZHJlc3M6ICIgPDwgc29jay0+Z2V0UGVlckFkZHJlc3MoKSA8PCAiXG4iOworICAgIGNvdXQgPDwgIlx0UGVlclBvcnQ6ICIgICAgPDwgc29jay0+Z2V0UGVlclBvcnQoKSA8PCAiXG4iOworICAgIHJldHVybiBuZXcgQ2FsY3VsYXRvckhhbmRsZXI7CisgIH0KKyAgdmlydHVhbCB2b2lkIHJlbGVhc2VIYW5kbGVyKCA6OnNoYXJlZDo6U2hhcmVkU2VydmljZUlmKiBoYW5kbGVyKSB7CisgICAgZGVsZXRlIGhhbmRsZXI7CisgIH0KK307CiAKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7Ci0gIHNoYXJlZF9wdHI8Q2FsY3VsYXRvckhhbmRsZXI+IGhhbmRsZXIobmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpOwotICBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcihuZXcgQ2FsY3VsYXRvclByb2Nlc3NvcihoYW5kbGVyKSk7Ci0gIHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0KG5ldyBUU2VydmVyU29ja2V0KDkwOTApKTsKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsKK2ludCBtYWluKCkgeworICBUVGhyZWFkZWRTZXJ2ZXIgc2VydmVyKAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvclByb2Nlc3NvckZhY3Rvcnk+KHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvckNsb25lRmFjdG9yeT4oKSksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwgLy9wb3J0CisgICAgc3RkOjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5PigpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJpbmFyeVByb3RvY29sRmFjdG9yeT4oKSk7CiAKLSAgVFNpbXBsZVNlcnZlciBzZXJ2ZXIocHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSk7Ci0KLQotICAvKioKLSAgICogT3IgeW91IGNvdWxkIGRvIG9uZSBvZiB0aGVzZQotCi0gIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9Ci0gICAgVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCk7Ci0gIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5ID0KLSAgICBzaGFyZWRfcHRyPFBvc2l4VGhyZWFkRmFjdG9yeT4obmV3IFBvc2l4VGhyZWFkRmFjdG9yeSgpKTsKLSAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKLSAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKLSAgVFRocmVhZFBvb2xTZXJ2ZXIgc2VydmVyKHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRNYW5hZ2VyKTsKLQotICBUVGhyZWFkZWRTZXJ2ZXIgc2VydmVyKHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnkpOwotCisgIC8qCisgIC8vIGlmIHlvdSBkb24ndCBuZWVkIHBlci1jb25uZWN0aW9uIHN0YXRlLCBkbyB0aGUgZm9sbG93aW5nIGluc3RlYWQKKyAgVFRocmVhZGVkU2VydmVyIHNlcnZlcigKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JQcm9jZXNzb3I+KHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvckhhbmRsZXI+KCkpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VFNlcnZlclNvY2tldD4oOTA5MCksIC8vcG9ydAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeT4oKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRCaW5hcnlQcm90b2NvbEZhY3Rvcnk+KCkpOwogICAqLwogCi0gIHByaW50ZigiU3RhcnRpbmcgdGhlIHNlcnZlci4uLlxuIik7CisgIC8qKgorICAgKiBIZXJlIGFyZSBzb21lIGFsdGVybmF0ZSBzZXJ2ZXIgdHlwZXMuLi4KKworICAvLyBUaGlzIHNlcnZlciBvbmx5IGFsbG93cyBvbmUgY29ubmVjdGlvbiBhdCBhIHRpbWUsIGJ1dCBzcGF3bnMgbm8gdGhyZWFkcworICBUU2ltcGxlU2VydmVyIHNlcnZlcigKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JQcm9jZXNzb3I+KHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvckhhbmRsZXI+KCkpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VFNlcnZlclNvY2tldD4oOTA5MCksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5PigpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJpbmFyeVByb3RvY29sRmFjdG9yeT4oKSk7CisKKyAgY29uc3QgaW50IHdvcmtlckNvdW50ID0gNDsKKworICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9CisgICAgVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCk7CisgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkoCisgICAgc3RkOjptYWtlX3NoYXJlZDxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KCkpOworICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOworCisgIC8vIFRoaXMgc2VydmVyIGFsbG93cyAid29ya2VyQ291bnQiIGNvbm5lY3Rpb24gYXQgYSB0aW1lLCBhbmQgcmV1c2VzIHRocmVhZHMKKyAgVFRocmVhZFBvb2xTZXJ2ZXIgc2VydmVyKAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvclByb2Nlc3NvckZhY3Rvcnk+KHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvckNsb25lRmFjdG9yeT4oKSksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk+KCksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUQmluYXJ5UHJvdG9jb2xGYWN0b3J5PigpLAorICAgIHRocmVhZE1hbmFnZXIpOworICAqLworCisgIGNvdXQgPDwgIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4iIDw8IGVuZGw7CiAgIHNlcnZlci5zZXJ2ZSgpOwotICBwcmludGYoImRvbmUuXG4iKTsKKyAgY291dCA8PCAiRG9uZS4iIDw8IGVuZGw7CiAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3BwL01ha2VmaWxlIGIvdHV0b3JpYWwvY3BwL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODM0ZGVlLi4wMDAwMDAwCi0tLSBhL3R1dG9yaWFsL2NwcC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1CT09TVF9ESVIgPSAvdXNyL2xvY2FsL2Jvb3N0L2luY2x1ZGUvYm9vc3QtMV8zM18xLwotVEhSSUZUX0RJUiA9IC91c3IvbG9jYWwvaW5jbHVkZS90aHJpZnQKLUxJQl9ESVIgPSAvdXNyL2xvY2FsL2xpYgotCi1HRU5fU1JDID0gLi4vZ2VuLWNwcC9TaGFyZWRTZXJ2aWNlLmNwcCAuLi9nZW4tY3BwL3NoYXJlZF90eXBlcy5jcHAgLi4vZ2VuLWNwcC90dXRvcmlhbF90eXBlcy5jcHAgLi4vZ2VuLWNwcC9DYWxjdWxhdG9yLmNwcAotCi1kZWZhdWx0OiBzZXJ2ZXIgY2xpZW50Ci0KLXNlcnZlcjogQ3BwU2VydmVyLmNwcAotCWcrKyAtbyBDcHBTZXJ2ZXIgLUkke1RIUklGVF9ESVJ9IC1JJHtCT09TVF9ESVJ9ICAtSS4uL2dlbi1jcHAgLUwke0xJQl9ESVJ9IC1sdGhyaWZ0IENwcFNlcnZlci5jcHAgJHtHRU5fU1JDfQotCi1jbGllbnQ6IENwcENsaWVudC5jcHAKLQlnKysgLW8gQ3BwQ2xpZW50IC1JJHtUSFJJRlRfRElSfSAtSSR7Qk9PU1RfRElSfSAgLUkuLi9nZW4tY3BwIC1MJHtMSUJfRElSfSAtbHRocmlmdCBDcHBDbGllbnQuY3BwICR7R0VOX1NSQ30KLQotY2xlYW46Ci0JJChSTSkgLXIgQ3BwQ2xpZW50IENwcFNlcnZlcgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3BwL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvY3BwL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ5Y2YzYmUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jcHAvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4NiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMgc2VyaWFsLXRlc3RzCisKK0JVSUxUX1NPVVJDRVMgPSBnZW4tY3BwL3NoYXJlZF90eXBlcy5jcHAgXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvdHV0b3JpYWxfdHlwZXMuY3BwCisKK25vaW5zdF9MVExJQlJBUklFUyA9IGxpYnR1dG9yaWFsZ2VuY3BwLmxhCitub2Rpc3RfbGlidHV0b3JpYWxnZW5jcHBfbGFfU09VUkNFUyA9IFwKKwlnZW4tY3BwL0NhbGN1bGF0b3IuY3BwIFwKKwlnZW4tY3BwL0NhbGN1bGF0b3IuaCBcCisJZ2VuLWNwcC9TaGFyZWRTZXJ2aWNlLmNwcCBcCisJZ2VuLWNwcC9TaGFyZWRTZXJ2aWNlLmggXAorCWdlbi1jcHAvc2hhcmVkX2NvbnN0YW50cy5jcHAgXAorCWdlbi1jcHAvc2hhcmVkX2NvbnN0YW50cy5oIFwKKwlnZW4tY3BwL3NoYXJlZF90eXBlcy5jcHAgXAorCWdlbi1jcHAvc2hhcmVkX3R5cGVzLmggXAorCWdlbi1jcHAvdHV0b3JpYWxfY29uc3RhbnRzLmNwcCBcCisJZ2VuLWNwcC90dXRvcmlhbF9jb25zdGFudHMuaCBcCisJZ2VuLWNwcC90dXRvcmlhbF90eXBlcy5jcHAgXAorCWdlbi1jcHAvdHV0b3JpYWxfdHlwZXMuaAorCisKKworbGlidHV0b3JpYWxnZW5jcHBfbGFfTElCQUREID0gJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhCisKK25vaW5zdF9QUk9HUkFNUyA9IFwKKwlUdXRvcmlhbFNlcnZlciBcCisJVHV0b3JpYWxDbGllbnQKKworVHV0b3JpYWxTZXJ2ZXJfU09VUkNFUyA9IFwKKwlDcHBTZXJ2ZXIuY3BwCisKK1R1dG9yaWFsU2VydmVyX0xEQUREID0gXAorCWxpYnR1dG9yaWFsZ2VuY3BwLmxhIFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEKKworVHV0b3JpYWxDbGllbnRfU09VUkNFUyA9IFwKKwlDcHBDbGllbnQuY3BwCisKK1R1dG9yaWFsQ2xpZW50X0xEQUREID0gXAorCWxpYnR1dG9yaWFsZ2VuY3BwLmxhIFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEKKworIworIyBDb21tb24gdGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBydWxlcworIworZ2VuLWNwcC9DYWxjdWxhdG9yLmNwcCBnZW4tY3BwL1NoYXJlZFNlcnZpY2UuY3BwIGdlbi1jcHAvc2hhcmVkX2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9zaGFyZWRfdHlwZXMuY3BwIGdlbi1jcHAvdHV0b3JpYWxfY29uc3RhbnRzLmNwcCBnZW4tY3BwL3R1dG9yaWFsX3R5cGVzLmNwcDogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3BwIC1yICQ8CisKK0FNX0NQUEZMQUdTID0gJChCT09TVF9DUFBGTEFHUykgJChMSUJFVkVOVF9DUFBGTEFHUykgLUkkKHRvcF9zcmNkaXIpL2xpYi9jcHAvc3JjIC1JZ2VuLWNwcAorQU1fQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYworQU1fTERGTEFHUyA9ICQoQk9PU1RfTERGTEFHUykgJChMSUJFVkVOVF9MREZMQUdTKQorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSBnZW4tY3BwLyoKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCS4vVHV0b3JpYWxTZXJ2ZXIKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCS4vVHV0b3JpYWxDbGllbnQKKworc3R5bGUtbG9jYWw6CisJJChDUFBTVFlMRV9DTUQpCisKK0VYVFJBX0RJU1QgPSBcCisJQ01ha2VMaXN0cy50eHQgXAorCUNwcENsaWVudC5jcHAgXAorCUNwcFNlcnZlci5jcHAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvQ3NoYXJwQ2xpZW50LmNzIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Dc2hhcnBDbGllbnQuY3MKaW5kZXggOGNlMTA4NS4uMTEzYTQ3MiAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Dc2hhcnBDbGllbnQuY3MKKysrIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Dc2hhcnBDbGllbnQuY3MKQEAgLTM3LDQ1ICszNyw1MCBAQAogICAgICAgICAgICAgICAgIENhbGN1bGF0b3IuQ2xpZW50IGNsaWVudCA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChwcm90b2NvbCk7CiAKICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuT3BlbigpOwotCi0gICAgICAgICAgICAgICAgY2xpZW50LnBpbmcoKTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgicGluZygpIik7Ci0KLSAgICAgICAgICAgICAgICBpbnQgc3VtID0gY2xpZW50LmFkZCgxLCAxKTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiMSsxPXswfSIsIHN1bSk7Ci0KLSAgICAgICAgICAgICAgICBXb3JrIHdvcmsgPSBuZXcgV29yaygpOwotCi0gICAgICAgICAgICAgICAgd29yay5PcCA9IE9wZXJhdGlvbi5ESVZJREU7Ci0gICAgICAgICAgICAgICAgd29yay5OdW0xID0gMTsKLSAgICAgICAgICAgICAgICB3b3JrLk51bTIgPSAwOwogICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHF1b3RpZW50ID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIldob2Egd2UgY2FuIGRpdmlkZSBieSAwIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uIGlvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkludmFsaWQgb3BlcmF0aW9uOiAiICsgaW8uV2h5KTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNsaWVudC5waW5nKCk7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJwaW5nKCkiKTsKIAotICAgICAgICAgICAgICAgIHdvcmsuT3AgPSBPcGVyYXRpb24uU1VCVFJBQ1Q7Ci0gICAgICAgICAgICAgICAgd29yay5OdW0xID0gMTU7Ci0gICAgICAgICAgICAgICAgd29yay5OdW0yID0gMTA7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgZGlmZiA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIxNS0xMD17MH0iLCBkaWZmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEludmFsaWRPcGVyYXRpb24gaW8pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiSW52YWxpZCBvcGVyYXRpb246ICIgKyBpby5XaHkpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50IHN1bSA9IGNsaWVudC5hZGQoMSwgMSk7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIxKzE9ezB9Iiwgc3VtKTsKIAotICAgICAgICAgICAgICAgIFNoYXJlZFN0cnVjdCBsb2cgPSBjbGllbnQuZ2V0U3RydWN0KDEpOwotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDaGVjayBsb2c6IHswfSIsIGxvZy5WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIFdvcmsgd29yayA9IG5ldyBXb3JrKCk7CiAKLSAgICAgICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay5PcCA9IE9wZXJhdGlvbi5ESVZJREU7CisgICAgICAgICAgICAgICAgICAgIHdvcmsuTnVtMSA9IDE7CisgICAgICAgICAgICAgICAgICAgIHdvcmsuTnVtMiA9IDA7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVvdGllbnQgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIldob2Egd2UgY2FuIGRpdmlkZSBieSAwIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEludmFsaWRPcGVyYXRpb24gaW8pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJJbnZhbGlkIG9wZXJhdGlvbjogIiArIGlvLldoeSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB3b3JrLk9wID0gT3BlcmF0aW9uLlNVQlRSQUNUOworICAgICAgICAgICAgICAgICAgICB3b3JrLk51bTEgPSAxNTsKKyAgICAgICAgICAgICAgICAgICAgd29yay5OdW0yID0gMTA7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlmZiA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiMTUtMTA9ezB9IiwgZGlmZik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEludmFsaWRPcGVyYXRpb24gaW8pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJJbnZhbGlkIG9wZXJhdGlvbjogIiArIGlvLldoeSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBTaGFyZWRTdHJ1Y3QgbG9nID0gY2xpZW50LmdldFN0cnVjdCgxKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNoZWNrIGxvZzogezB9IiwgbG9nLlZhbHVlKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHgpCiAgICAgICAgICAgICB7CmRpZmYgLS1naXQgYS90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L0NzaGFycENsaWVudC5jc3Byb2ogYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L0NzaGFycENsaWVudC5jc3Byb2oKaW5kZXggNTE3YWQ4My4uMWVhN2ZmNiAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Dc2hhcnBDbGllbnQuY3Nwcm9qCisrKyBiL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvQ3NoYXJwQ2xpZW50LmNzcHJvagpAQCAtMSw4OCArMSwxMTAgQEAKLe+7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCi0gIDxQcm9wZXJ0eUdyb3VwPg0KLSAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCi0gICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KLSAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCi0gICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KLSAgICA8UHJvamVjdEd1aWQ+ezE4RjI0MDg3LTQ3NjAtNDNEQS1BQ0FCLTdCOUYwRTA5NkIxMX08L1Byb2plY3RHdWlkPg0KLSAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+DQotICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4NCi0gICAgPFJvb3ROYW1lc3BhY2U+Q3NoYXJwQ2xpZW50PC9Sb290TmFtZXNwYWNlPg0KLSAgICA8QXNzZW1ibHlOYW1lPkNzaGFycENsaWVudDwvQXNzZW1ibHlOYW1lPg0KLSAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KLSAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCi0gICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQotICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KLSAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KLSAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPg0KLSAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+DQotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KLSAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQotICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KLSAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQotICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4NCi0gICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPg0KLSAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCi0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8SXRlbUdyb3VwPg0KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4NCi0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSI+DQotICAgICAgPFJlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPjMuNTwvUmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+DQotICAgIDwvUmVmZXJlbmNlPg0KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwuTGlucSI+DQotICAgICAgPFJlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPjMuNTwvUmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+DQotICAgIDwvUmVmZXJlbmNlPg0KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhLkRhdGFTZXRFeHRlbnNpb25zIj4NCi0gICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4NCi0gICAgPC9SZWZlcmVuY2U+DQotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEiIC8+DQotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCi0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJUaHJpZnQsIFZlcnNpb249MC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+DQotICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KLSAgICAgIDxIaW50UGF0aD4uLlwuLlwuLlxsaWJcY3NoYXJwXHNyY1xiaW5cUmVsZWFzZVxUaHJpZnQuZGxsPC9IaW50UGF0aD4NCi0gICAgPC9SZWZlcmVuY2U+DQotICA8L0l0ZW1Hcm91cD4NCi0gIDxJdGVtR3JvdXA+DQotICAgIDxDb21waWxlIEluY2x1ZGU9IkNzaGFycENsaWVudC5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQotICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGdlbi1jc2hhcnBcQ2FsY3VsYXRvci5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxDb25zdGFudHMuY3MiIC8+DQotICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGdlbi1jc2hhcnBcSW52YWxpZE9wZXJhdGlvbi5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxPcGVyYXRpb24uY3MiIC8+DQotICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGdlbi1jc2hhcnBcU2hhcmVkU2VydmljZS5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxTaGFyZWRTdHJ1Y3QuY3MiIC8+DQotICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGdlbi1jc2hhcnBcV29yay5jcyIgLz4NCi0gIDwvSXRlbUdyb3VwPg0KLSAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4NCi0gIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KLSAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQotICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCi0gIDwvVGFyZ2V0Pg0KLSAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCi0gIDwvVGFyZ2V0Pg0KLSAgLS0+DQor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPnsxOEYyNDA4Ny00NzYwLTQzREEtQUNBQi03QjlGMEUwOTZCMTF9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPkNzaGFycENsaWVudDwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPkNzaGFycENsaWVudDwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiPgorICAgICAgPFJlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPjMuNTwvUmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sLkxpbnEiPgorICAgICAgPFJlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPjMuNTwvUmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YS5EYXRhU2V0RXh0ZW5zaW9ucyI+CisgICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxDYWxjdWxhdG9yLmNzIj4KKyAgICAgIDxMaW5rPkNhbGN1bGF0b3IuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcSW52YWxpZE9wZXJhdGlvbi5jcyI+CisgICAgICA8TGluaz5JbnZhbGlkT3BlcmF0aW9uLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXE9wZXJhdGlvbi5jcyI+CisgICAgICA8TGluaz5PcGVyYXRpb24uY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcU2hhcmVkU2VydmljZS5jcyI+CisgICAgICA8TGluaz5TaGFyZWRTZXJ2aWNlLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXFNoYXJlZFN0cnVjdC5jcyI+CisgICAgICA8TGluaz5TaGFyZWRTdHJ1Y3QuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcdHV0b3JpYWwuQ29uc3RhbnRzLmNzIj4KKyAgICAgIDxMaW5rPnR1dG9yaWFsLkNvbnN0YW50cy5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxXb3JrLmNzIj4KKyAgICAgIDxMaW5rPldvcmsuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNzaGFycENsaWVudC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGNzaGFycFxzcmNcVGhyaWZ0LmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57NDk5ZWI2M2MtZDc0Yy00N2U4LWFlNDgtYTJmYzk0NTM4ZTlkfTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPlRocmlmdDwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8UHJlQnVpbGRFdmVudD5wdXNoZCAiJChTb2x1dGlvbkRpcikiCit0aHJpZnQgIC1nZW4gY3NoYXJwICAgLXIgIC4uL3R1dG9yaWFsLnRocmlmdAorcG9wZAorPC9QcmVCdWlsZEV2ZW50PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PgorICAtLT4KIDwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwppbmRleCBmZmJjNDBkLi4xZmY2NThjIDEwMDY0NAotLS0gYS90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisrKyBiL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTEsNTUgKzEsNTUgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXVzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOw0KLXVzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7DQotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOw0KLQ0KLS8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcNCi0vLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbg0KLS8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4NCi1bYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIkNzaGFycENsaWVudCIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCIiKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiQ3NoYXJwQ2xpZW50IildDQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IMKpIDIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQ0KLQ0KLS8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQ0KLS8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20NCi0vLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuDQotW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0NCi0NCi0vLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00NCi1bYXNzZW1ibHk6IEd1aWQoIjFhNDYxMjE0LWZhMjgtNDUyYS1iZDFkLWQyM2NhOGU5NDdlMyIpXQ0KLQ0KLS8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6DQotLy8NCi0vLyAgICAgIE1ham9yIFZlcnNpb24NCi0vLyAgICAgIE1pbm9yIFZlcnNpb24NCi0vLyAgICAgIEJ1aWxkIE51bWJlcg0KLS8vICAgICAgUmV2aXNpb24NCi0vLw0KLS8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzDQotLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoNCi0vLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQ0KKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJDc2hhcnBDbGllbnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorW2Fzc2VtYmx5OiBHdWlkKCIxYTQ2MTIxNC1mYTI4LTQ1MmEtYmQxZC1kMjNjYThlOTQ3ZTMiKV0KKworLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKKy8vCisvLyAgICAgIE1ham9yIFZlcnNpb24KKy8vICAgICAgTWlub3IgVmVyc2lvbgorLy8gICAgICBCdWlsZCBOdW1iZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCisvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycworLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKKy8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Dc2hhcnBTZXJ2ZXIuY3MgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL0NzaGFycFNlcnZlci5jcwppbmRleCAwZDM3Yzk5Li40Mzk3OTBhIDEwMDY0NAotLS0gYS90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL0NzaGFycFNlcnZlci5jcworKysgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL0NzaGFycFNlcnZlci5jcwpAQCAtMTUsMTE1ICsxNSwxMTUgQEAKICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLw0KLQ0KLXVzaW5nIFN5c3RlbTsNCi11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCi11c2luZyBUaHJpZnQuU2VydmVyOw0KLXVzaW5nIFRocmlmdC5UcmFuc3BvcnQ7DQotDQotbmFtZXNwYWNlIENTaGFycFR1dG9yaWFsDQotew0KLSAgICBwdWJsaWMgY2xhc3MgQ2FsY3VsYXRvckhhbmRsZXIgOiBDYWxjdWxhdG9yLklmYWNlDQotICAgIHsNCi0gICAgICAgIERpY3Rpb25hcnk8aW50LCBTaGFyZWRTdHJ1Y3Q+IGxvZzsNCi0NCi0gICAgICAgIHB1YmxpYyBDYWxjdWxhdG9ySGFuZGxlcigpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nID0gbmV3IERpY3Rpb25hcnk8aW50LCBTaGFyZWRTdHJ1Y3Q+KCk7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBwaW5nKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgicGluZygpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgaW50IGFkZChpbnQgbjEsIGludCBuMikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiYWRkKHswfSx7MX0pIiwgbjEsIG4yKTsNCi0gICAgICAgICAgICByZXR1cm4gbjEgKyBuMjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBpbnQgY2FsY3VsYXRlKGludCBsb2dpZCwgV29yayB3b3JrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJjYWxjdWxhdGUoezB9LCBbezF9LHsyfSx7M31dKSIsIGxvZ2lkLCB3b3JrLk9wLCB3b3JrLk51bTEsIHdvcmsuTnVtMik7DQotICAgICAgICAgICAgaW50IHZhbCA9IDA7DQotICAgICAgICAgICAgc3dpdGNoICh3b3JrLk9wKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uQUREOg0KLSAgICAgICAgICAgICAgICAgICAgdmFsID0gd29yay5OdW0xICsgd29yay5OdW0yOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLlNVQlRSQUNUOg0KLSAgICAgICAgICAgICAgICAgICAgdmFsID0gd29yay5OdW0xIC0gd29yay5OdW0yOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLk1VTFRJUExZOg0KLSAgICAgICAgICAgICAgICAgICAgdmFsID0gd29yay5OdW0xICogd29yay5OdW0yOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLkRJVklERToNCi0gICAgICAgICAgICAgICAgICAgIGlmICh3b3JrLk51bTIgPT0gMCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkT3BlcmF0aW9uIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpby5XaGF0ID0gKGludCl3b3JrLk9wOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlvLldoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGlvOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgdmFsID0gd29yay5OdW0xIC8gd29yay5OdW0yOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZE9wZXJhdGlvbiBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW8uV2hhdCA9IChpbnQpd29yay5PcDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpby5XaHkgPSAiVW5rbm93biBvcGVyYXRpb24iOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGlvOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBTaGFyZWRTdHJ1Y3QgZW50cnkgPSBuZXcgU2hhcmVkU3RydWN0KCk7DQotICAgICAgICAgICAgZW50cnkuS2V5ID0gbG9naWQ7DQotICAgICAgICAgICAgZW50cnkuVmFsdWUgPSB2YWwuVG9TdHJpbmcoKTsNCi0gICAgICAgICAgICBsb2dbbG9naWRdID0gZW50cnk7DQotDQotICAgICAgICAgICAgcmV0dXJuIHZhbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTaGFyZWRTdHJ1Y3QgZ2V0U3RydWN0KGludCBrZXkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImdldFN0cnVjdCh7MH0pIiwga2V5KTsNCi0gICAgICAgICAgICByZXR1cm4gbG9nW2tleV07DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCB6aXAoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ6aXAoKSIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBjbGFzcyBDU2hhcnBTZXJ2ZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgQ2FsY3VsYXRvckhhbmRsZXIgaGFuZGxlciA9IG5ldyBDYWxjdWxhdG9ySGFuZGxlcigpOw0KLSAgICAgICAgICAgICAgICBDYWxjdWxhdG9yLlByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvci5Qcm9jZXNzb3IoaGFuZGxlcik7DQotICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCk7DQotICAgICAgICAgICAgICAgIFRTZXJ2ZXIgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQpOw0KLQ0KLSAgICAgICAgICAgICAgICAvLyBVc2UgdGhpcyBmb3IgYSBtdWx0aXRocmVhZGVkIHNlcnZlcg0KLSAgICAgICAgICAgICAgICAvLyBzZXJ2ZXIgPSBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQpOw0KLQ0KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU3RhcnRpbmcgdGhlIHNlcnZlci4uLiIpOw0KLSAgICAgICAgICAgICAgICBzZXJ2ZXIuU2VydmUoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoeC5TdGFja1RyYWNlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImRvbmUuIik7DQotICAgICAgICB9DQotICAgIH0NCi19DQorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBDU2hhcnBUdXRvcmlhbAoreworICAgIHB1YmxpYyBjbGFzcyBDYWxjdWxhdG9ySGFuZGxlciA6IENhbGN1bGF0b3IuSWZhY2UKKyAgICB7CisgICAgICAgIERpY3Rpb25hcnk8aW50LCBTaGFyZWRTdHJ1Y3Q+IGxvZzsKKworICAgICAgICBwdWJsaWMgQ2FsY3VsYXRvckhhbmRsZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBsb2cgPSBuZXcgRGljdGlvbmFyeTxpbnQsIFNoYXJlZFN0cnVjdD4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHBpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgicGluZygpIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkZChpbnQgbjEsIGludCBuMikKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImFkZCh7MH0sezF9KSIsIG4xLCBuMik7CisgICAgICAgICAgICByZXR1cm4gbjEgKyBuMjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgY2FsY3VsYXRlKGludCBsb2dpZCwgV29yayB3b3JrKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiY2FsY3VsYXRlKHswfSwgW3sxfSx7Mn0sezN9XSkiLCBsb2dpZCwgd29yay5PcCwgd29yay5OdW0xLCB3b3JrLk51bTIpOworICAgICAgICAgICAgaW50IHZhbCA9IDA7CisgICAgICAgICAgICBzd2l0Y2ggKHdvcmsuT3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uQUREOgorICAgICAgICAgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgKyB3b3JrLk51bTI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uU1VCVFJBQ1Q6CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IHdvcmsuTnVtMSAtIHdvcmsuTnVtMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5NVUxUSVBMWToKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gd29yay5OdW0xICogd29yay5OdW0yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLkRJVklERToKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmsuTnVtMiA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkT3BlcmF0aW9uIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvLldoYXRPcCA9IChpbnQpd29yay5PcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvLldoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaW87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdmFsID0gd29yay5OdW0xIC8gd29yay5OdW0yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRPcGVyYXRpb24gaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgaW8uV2hhdE9wID0gKGludCl3b3JrLk9wOworICAgICAgICAgICAgICAgICAgICAgICAgaW8uV2h5ID0gIlVua25vd24gb3BlcmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGlvOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNoYXJlZFN0cnVjdCBlbnRyeSA9IG5ldyBTaGFyZWRTdHJ1Y3QoKTsKKyAgICAgICAgICAgIGVudHJ5LktleSA9IGxvZ2lkOworICAgICAgICAgICAgZW50cnkuVmFsdWUgPSB2YWwuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGxvZ1tsb2dpZF0gPSBlbnRyeTsKKworICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTaGFyZWRTdHJ1Y3QgZ2V0U3RydWN0KGludCBrZXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJnZXRTdHJ1Y3QoezB9KSIsIGtleSk7CisgICAgICAgICAgICByZXR1cm4gbG9nW2tleV07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB6aXAoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiemlwKCkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBDU2hhcnBTZXJ2ZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2FsY3VsYXRvckhhbmRsZXIgaGFuZGxlciA9IG5ldyBDYWxjdWxhdG9ySGFuZGxlcigpOworICAgICAgICAgICAgICAgIENhbGN1bGF0b3IuUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKTsKKyAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0KDkwOTApOworICAgICAgICAgICAgICAgIFRTZXJ2ZXIgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQpOworCisgICAgICAgICAgICAgICAgLy8gVXNlIHRoaXMgZm9yIGEgbXVsdGl0aHJlYWRlZCBzZXJ2ZXIKKyAgICAgICAgICAgICAgICAvLyBzZXJ2ZXIgPSBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQpOworCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4iKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIuU2VydmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSh4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImRvbmUuIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL0NzaGFycFNlcnZlci5jc3Byb2ogYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL0NzaGFycFNlcnZlci5jc3Byb2oKaW5kZXggYWEyYWMxNS4uMDc0ODE4MCAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Dc2hhcnBTZXJ2ZXIuY3Nwcm9qCisrKyBiL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvQ3NoYXJwU2VydmVyLmNzcHJvagpAQCAtMSw4OCArMSwxMTEgQEAKLe+7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCi0gIDxQcm9wZXJ0eUdyb3VwPg0KLSAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCi0gICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KLSAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4NCi0gICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KLSAgICA8UHJvamVjdEd1aWQ+ezY2NzA3QkFFLUJCRjktNEYwMy1CNTNFLUJFM0FENTgzMjJGOH08L1Byb2plY3RHdWlkPg0KLSAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+DQotICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4NCi0gICAgPFJvb3ROYW1lc3BhY2U+Q3NoYXJwU2VydmVyPC9Sb290TmFtZXNwYWNlPg0KLSAgICA8QXNzZW1ibHlOYW1lPkNzaGFycFNlcnZlcjwvQXNzZW1ibHlOYW1lPg0KLSAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPg0KLSAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCi0gICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQotICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KLSAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KLSAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPg0KLSAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+DQotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KLSAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQotICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KLSAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQotICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4NCi0gICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPg0KLSAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCi0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8SXRlbUdyb3VwPg0KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4NCi0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSI+DQotICAgICAgPFJlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPjMuNTwvUmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+DQotICAgIDwvUmVmZXJlbmNlPg0KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwuTGlucSI+DQotICAgICAgPFJlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPjMuNTwvUmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+DQotICAgIDwvUmVmZXJlbmNlPg0KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhLkRhdGFTZXRFeHRlbnNpb25zIj4NCi0gICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4NCi0gICAgPC9SZWZlcmVuY2U+DQotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEiIC8+DQotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4NCi0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJUaHJpZnQsIFZlcnNpb249MC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+DQotICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPg0KLSAgICAgIDxIaW50UGF0aD4uLlwuLlwuLlxsaWJcY3NoYXJwXHNyY1xiaW5cUmVsZWFzZVxUaHJpZnQuZGxsPC9IaW50UGF0aD4NCi0gICAgPC9SZWZlcmVuY2U+DQotICA8L0l0ZW1Hcm91cD4NCi0gIDxJdGVtR3JvdXA+DQotICAgIDxDb21waWxlIEluY2x1ZGU9IkNzaGFycFNlcnZlci5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQotICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGdlbi1jc2hhcnBcQ2FsY3VsYXRvci5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxDb25zdGFudHMuY3MiIC8+DQotICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGdlbi1jc2hhcnBcSW52YWxpZE9wZXJhdGlvbi5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxPcGVyYXRpb24uY3MiIC8+DQotICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGdlbi1jc2hhcnBcU2hhcmVkU2VydmljZS5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxTaGFyZWRTdHJ1Y3QuY3MiIC8+DQotICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGdlbi1jc2hhcnBcV29yay5jcyIgLz4NCi0gIDwvSXRlbUdyb3VwPg0KLSAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4NCi0gIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIA0KLSAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuDQotICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4NCi0gIDwvVGFyZ2V0Pg0KLSAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4NCi0gIDwvVGFyZ2V0Pg0KLSAgLS0+DQor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPns2NjcwN0JBRS1CQkY5LTRGMDMtQjUzRS1CRTNBRDU4MzIyRjh9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPkNzaGFycFNlcnZlcjwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPkNzaGFycFNlcnZlcjwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiPgorICAgICAgPFJlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPjMuNTwvUmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sLkxpbnEiPgorICAgICAgPFJlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPjMuNTwvUmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YS5EYXRhU2V0RXh0ZW5zaW9ucyI+CisgICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxDYWxjdWxhdG9yLmNzIj4KKyAgICAgIDxMaW5rPkNhbGN1bGF0b3IuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcSW52YWxpZE9wZXJhdGlvbi5jcyI+CisgICAgICA8TGluaz5JbnZhbGlkT3BlcmF0aW9uLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXE9wZXJhdGlvbi5jcyI+CisgICAgICA8TGluaz5PcGVyYXRpb24uY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcU2hhcmVkU2VydmljZS5jcyI+CisgICAgICA8TGluaz5TaGFyZWRTZXJ2aWNlLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXFNoYXJlZFN0cnVjdC5jcyI+CisgICAgICA8TGluaz5TaGFyZWRTdHJ1Y3QuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcdHV0b3JpYWwuQ29uc3RhbnRzLmNzIj4KKyAgICAgIDxMaW5rPnR1dG9yaWFsLkNvbnN0YW50cy5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxXb3JrLmNzIj4KKyAgICAgIDxMaW5rPldvcmsuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNzaGFycFNlcnZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGNzaGFycFxzcmNcVGhyaWZ0LmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57NDk5ZWI2M2MtZDc0Yy00N2U4LWFlNDgtYTJmYzk0NTM4ZTlkfTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPlRocmlmdDwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8UHJlQnVpbGRFdmVudD5wdXNoZCAiJChTb2x1dGlvbkRpcikiCit0aHJpZnQgIC1nZW4gY3NoYXJwICAgLXIgIC4uL3R1dG9yaWFsLnRocmlmdAorcG9wZAorCis8L1ByZUJ1aWxkRXZlbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgogPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmluZGV4IDk5ODExNjMuLjc0ZmE0NzYgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMSw1NSArMSw1NSBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotdXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247DQotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsNCi11c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7DQotDQotLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZw0KLS8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uDQotLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5Lg0KLVthc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiQ3NoYXJwU2VydmVyIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJDc2hhcnBTZXJ2ZXIiKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildDQotDQotLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlDQotLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQ0KLS8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4NCi1bYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQ0KLQ0KLS8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQ0KLVthc3NlbWJseTogR3VpZCgiZTNiNDI4ZjQtYjJlOS00ZmMxLThhMzQtODRhYmM0MzM5ODYwIildDQotDQotLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoNCi0vLw0KLS8vICAgICAgTWFqb3IgVmVyc2lvbg0KLS8vICAgICAgTWlub3IgVmVyc2lvbg0KLS8vICAgICAgQnVpbGQgTnVtYmVyDQotLy8gICAgICBSZXZpc2lvbg0KLS8vDQotLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMNCi0vLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93Og0KLS8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildDQorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIkNzaGFycFNlcnZlciIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCitbYXNzZW1ibHk6IEd1aWQoImUzYjQyOGY0LWIyZTktNGZjMS04YTM0LTg0YWJjNDMzOTg2MCIpXQorCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgorLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jc2hhcnAvdHV0b3JpYWwuc2xuIGIvdHV0b3JpYWwvY3NoYXJwL3R1dG9yaWFsLnNsbgppbmRleCAwNWU0OTUxLi5lYzU3YTE4IDEwMDY0NAotLS0gYS90dXRvcmlhbC9jc2hhcnAvdHV0b3JpYWwuc2xuCisrKyBiL3R1dG9yaWFsL2NzaGFycC90dXRvcmlhbC5zbG4KQEAgLTEsMzkgKzEsMzkgQEAKLe+7vw0KLU1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEwLjAwDQotIyBWaXN1YWwgQyMgRXhwcmVzcyAyMDA4DQotUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnQiLCAiLi5cLi5cbGliXGNzaGFycFxzcmNcVGhyaWZ0LmNzcHJvaiIsICJ7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfSINCi1FbmRQcm9qZWN0DQotUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJDc2hhcnBDbGllbnQiLCAiQ3NoYXJwQ2xpZW50XENzaGFycENsaWVudC5jc3Byb2oiLCAiezE4RjI0MDg3LTQ3NjAtNDNEQS1BQ0FCLTdCOUYwRTA5NkIxMX0iDQotCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCi0JCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9ID0gezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0NCi0JCXs2NjcwN0JBRS1CQkY5LTRGMDMtQjUzRS1CRTNBRDU4MzIyRjh9ID0gezY2NzA3QkFFLUJCRjktNEYwMy1CNTNFLUJFM0FENTgzMjJGOH0NCi0JRW5kUHJvamVjdFNlY3Rpb24NCi1FbmRQcm9qZWN0DQotUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJDc2hhcnBTZXJ2ZXIiLCAiQ3NoYXJwU2VydmVyXENzaGFycFNlcnZlci5jc3Byb2oiLCAiezY2NzA3QkFFLUJCRjktNEYwMy1CNTNFLUJFM0FENTgzMjJGOH0iDQotCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCi0JCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9ID0gezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0NCi0JRW5kUHJvamVjdFNlY3Rpb24NCi1FbmRQcm9qZWN0DQotR2xvYmFsDQotCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uDQotCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQ0KLQkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVDQotCUVuZEdsb2JhbFNlY3Rpb24NCi0JR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24NCi0JCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KLQkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KLQkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KLQkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCi0JCXsxOEYyNDA4Ny00NzYwLTQzREEtQUNBQi03QjlGMEUwOTZCMTF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KLQkJezE4RjI0MDg3LTQ3NjAtNDNEQS1BQ0FCLTdCOUYwRTA5NkIxMX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KLQkJezE4RjI0MDg3LTQ3NjAtNDNEQS1BQ0FCLTdCOUYwRTA5NkIxMX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KLQkJezE4RjI0MDg3LTQ3NjAtNDNEQS1BQ0FCLTdCOUYwRTA5NkIxMX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCi0JCXs2NjcwN0JBRS1CQkY5LTRGMDMtQjUzRS1CRTNBRDU4MzIyRjh9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KLQkJezY2NzA3QkFFLUJCRjktNEYwMy1CNTNFLUJFM0FENTgzMjJGOH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQ0KLQkJezY2NzA3QkFFLUJCRjktNEYwMy1CNTNFLUJFM0FENTgzMjJGOH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KLQkJezY2NzA3QkFFLUJCRjktNEYwMy1CNTNFLUJFM0FENTgzMjJGOH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCi0JRW5kR2xvYmFsU2VjdGlvbg0KLQlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbg0KLQkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFDQotCUVuZEdsb2JhbFNlY3Rpb24NCi1FbmRHbG9iYWwNCivvu78KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDExLjAwCisjIFZpc3VhbCBTdHVkaW8gMjAxMAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnQiLCAiLi5cLi5cbGliXGNzaGFycFxzcmNcVGhyaWZ0LmNzcHJvaiIsICJ7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiQ3NoYXJwQ2xpZW50IiwgIkNzaGFycENsaWVudFxDc2hhcnBDbGllbnQuY3Nwcm9qIiwgInsxOEYyNDA4Ny00NzYwLTQzREEtQUNBQi03QjlGMEUwOTZCMTF9IgorICAgIFByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QKKyAgICAgICAgezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0gPSB7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfQorICAgICAgICB7NjY3MDdCQUUtQkJGOS00RjAzLUI1M0UtQkUzQUQ1ODMyMkY4fSA9IHs2NjcwN0JBRS1CQkY5LTRGMDMtQjUzRS1CRTNBRDU4MzIyRjh9CisgICAgRW5kUHJvamVjdFNlY3Rpb24KK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiQ3NoYXJwU2VydmVyIiwgIkNzaGFycFNlcnZlclxDc2hhcnBTZXJ2ZXIuY3Nwcm9qIiwgIns2NjcwN0JBRS1CQkY5LTRGMDMtQjUzRS1CRTNBRDU4MzIyRjh9IgorICAgIFByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QKKyAgICAgICAgezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0gPSB7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfQorICAgIEVuZFByb2plY3RTZWN0aW9uCitFbmRQcm9qZWN0CitHbG9iYWwKKyAgICBHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorICAgICAgICBEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQorICAgICAgICBSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKKyAgICBFbmRHbG9iYWxTZWN0aW9uCisgICAgR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKyAgICAgICAgezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisgICAgICAgIHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKyAgICAgICAgezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorICAgICAgICB7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorICAgICAgICB7MThGMjQwODctNDc2MC00M0RBLUFDQUItN0I5RjBFMDk2QjExfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKyAgICAgICAgezE4RjI0MDg3LTQ3NjAtNDNEQS1BQ0FCLTdCOUYwRTA5NkIxMX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorICAgICAgICB7MThGMjQwODctNDc2MC00M0RBLUFDQUItN0I5RjBFMDk2QjExfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisgICAgICAgIHsxOEYyNDA4Ny00NzYwLTQzREEtQUNBQi03QjlGMEUwOTZCMTF9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisgICAgICAgIHs2NjcwN0JBRS1CQkY5LTRGMDMtQjUzRS1CRTNBRDU4MzIyRjh9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorICAgICAgICB7NjY3MDdCQUUtQkJGOS00RjAzLUI1M0UtQkUzQUQ1ODMyMkY4fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisgICAgICAgIHs2NjcwN0JBRS1CQkY5LTRGMDMtQjUzRS1CRTNBRDU4MzIyRjh9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKyAgICAgICAgezY2NzA3QkFFLUJCRjktNEYwMy1CNTNFLUJFM0FENTgzMjJGOH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKyAgICBFbmRHbG9iYWxTZWN0aW9uCisgICAgR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKyAgICAgICAgSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisgICAgRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvZC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGM4YjI5Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworTElCX0RfRElSID0gJCh0b3Bfc3JjZGlyKS9saWIvZAorCitHRU5fU1JDID0gZ2VuLWQvc2hhcmUvU2hhcmVkU2VydmljZS5kIGdlbi1kL3NoYXJlL3NoYXJlZF90eXBlcy5kIFwKKwlnZW4tZC90dXRvcmlhbC90dXRvcmlhbF90eXBlcy5kIGdlbi1kL3R1dG9yaWFsL0NhbGN1bGF0b3IuZAorCiskKEdFTl9TUkMpOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGQgLXIgJDwKKworc2VydmVyOiBzZXJ2ZXIuZCAkKEdFTl9TUkMpCisJJChETUQpIC1JJHtMSUJfRF9ESVJ9L3NyYyAtTC1MJHtMSUJfRF9ESVJ9IC1MLWx0aHJpZnRkIHNlcnZlci5kICR7R0VOX1NSQ30KKworY2xpZW50OiBjbGllbnQuZCAkKEdFTl9TUkMpCisJJChETUQpIC1JJHtMSUJfRF9ESVJ9L3NyYyAtTC1MJHtMSUJfRF9ESVJ9IC1MLWx0aHJpZnRkIGNsaWVudC5kICR7R0VOX1NSQ30KKworUFJPR1MgPSBzZXJ2ZXIgY2xpZW50CisKK2lmIFdJVEhfRF9FVkVOVF9URVNUUworYXN5bmNfY2xpZW50OiBhc3luY19jbGllbnQuZCAkKEdFTl9TUkMpCisJJChETUQpIC1JJHtMSUJfRF9ESVJ9L3NyYyAtTC1MJHtMSUJfRF9ESVJ9IC1MLWx0aHJpZnRkLWV2ZW50IC1MLWx0aHJpZnRkIC1MLWxldmVudCBhc3luY19jbGllbnQuZCAke0dFTl9TUkN9CisKK1BST0dTICs9IGFzeW5jX2NsaWVudAorZW5kaWYKKworYWxsLWxvY2FsOiAkKFBST0dTKQorCitjbGVhbjoKKwkkKFJNKSAtZiAkKFBST0dTKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZC9hc3luY19jbGllbnQuZCBiL3R1dG9yaWFsL2QvYXN5bmNfY2xpZW50LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRlZmNlMAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2QvYXN5bmNfY2xpZW50LmQKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIGFzeW5jX2NsaWVudDsKKworaW1wb3J0IHN0ZC5leGNlcHRpb247CitpbXBvcnQgc3RkLnN0ZGlvOworaW1wb3J0IHRocmlmdC5hc3luYy5saWJldmVudDsKK2ltcG9ydCB0aHJpZnQuYXN5bmMuc29ja2V0OworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmFzeW5jX2NsaWVudDsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYnVmZmVyZWQ7CisKK2ltcG9ydCB0dXRvcmlhbC5DYWxjdWxhdG9yOworaW1wb3J0IHR1dG9yaWFsLnR1dG9yaWFsX3R5cGVzOworCit2b2lkIG1haW4oKSB7CisgIGF1dG8gYXN5bmNNYW5hZ2VyID0gbmV3IFRMaWJldmVudEFzeW5jTWFuYWdlcjsKKworICAvLyBJZiB3ZSBhcmUgZG9uZSwgZ3JhY2VmdWxseSBzdG9wIHRoZSBhc3luYyBtYW5hZ2VyIHRvIGF2b2lkIGhhbmdpbmcgb24KKyAgLy8gYXBwcGxpY2F0aW9uIHNodXRkb3duLgorICBzY29wZSAoZXhpdCkgYXN5bmNNYW5hZ2VyLnN0b3AoKTsKKworICBhdXRvIHNvY2tldCA9IG5ldyBUQXN5bmNTb2NrZXQoYXN5bmNNYW5hZ2VyLCAibG9jYWxob3N0IiwgOTA5MCk7CisgIGF1dG8gY2xpZW50ID0gbmV3IFRBc3luY0NsaWVudCFDYWxjdWxhdG9yKAorICAgIHNvY2tldCwKKyAgICBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSwKKyAgICBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSFUQnVmZmVyZWRUcmFuc3BvcnQKKyAgKTsKKworICBzb2NrZXQub3BlbigpOworCisgIC8vIEludm9rZSBhbGwgdGhlIG1ldGhvZHMuCisgIGF1dG8gcGluZ1Jlc3VsdCA9IGNsaWVudC5waW5nKCk7CisKKyAgYXV0byBhZGRSZXN1bHQgPSBjbGllbnQuYWRkKDEsIDEpOworCisgIGF1dG8gd29yayA9IFdvcmsoKTsKKyAgd29yay5vcCA9IE9wZXJhdGlvbi5ESVZJREU7CisgIHdvcmsubnVtMSA9IDE7CisgIHdvcmsubnVtMiA9IDA7CisgIGF1dG8gcXVvdGllbnRSZXN1bHQgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspOworCisgIHdvcmsub3AgPSBPcGVyYXRpb24uU1VCVFJBQ1Q7CisgIHdvcmsubnVtMSA9IDE1OworICB3b3JrLm51bTIgPSAxMDsKKyAgYXV0byBkaWZmUmVzdWx0ID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKKworICBhdXRvIGxvZ1Jlc3VsdCA9IGNsaWVudC5nZXRTdHJ1Y3QoMSk7CisKKyAgLy8gQXdhaXQgdGhlIHJlc3BvbnNlcy4KKyAgcGluZ1Jlc3VsdC53YWl0R2V0KCk7CisgIHdyaXRlbG4oInBpbmcoKSIpOworCisgIGludCBzdW0gPSBhZGRSZXN1bHQud2FpdEdldCgpOworICB3cml0ZWZsbigiMSArIDEgPSAlcyIsIHN1bSk7CisKKyAgdHJ5IHsKKyAgICBxdW90aWVudFJlc3VsdC53YWl0R2V0KCk7CisgICAgd3JpdGVsbigiV2hvYSB3ZSBjYW4gZGl2aWRlIGJ5IDAiKTsKKyAgfSBjYXRjaCAoSW52YWxpZE9wZXJhdGlvbiBpbykgeworICAgIHdyaXRlbG4oIkludmFsaWQgb3BlcmF0aW9uOiAiIH4gaW8ud2h5KTsKKyAgfQorCisgIHdyaXRlZmxuKCIxNSAtIDEwID0gJXMiLCBkaWZmUmVzdWx0LndhaXRHZXQoKSk7CisKKyAgLy8gVEZ1dHVyZSBpcyBpbXBsaWNpdGx5IGNvbnZlcnRpYmxlIHRvIHRoZSByZXN1bHQgdHlwZSB2aWEgwrthbGlhcyB0aGlzwqssCisgIC8vIGZvciB3aGljaCBpdCAoZWFnZXJseSwgb2YgY291cnNlKSBhd2FpdHMgY29tcGxldGlvbi4KKyAgd3JpdGVmbG4oIkNoZWNrIGxvZzogJXMiLCBsb2dSZXN1bHQudmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZC9jbGllbnQuZCBiL3R1dG9yaWFsL2QvY2xpZW50LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg2N2ExNwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2QvY2xpZW50LmQKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIGNsaWVudDsKKworaW1wb3J0IHN0ZC5zdGRpbzsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5jbGllbnQ7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJpbmFyeTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJ1ZmZlcmVkOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc29ja2V0OworCitpbXBvcnQgdHV0b3JpYWwuQ2FsY3VsYXRvcjsKK2ltcG9ydCB0dXRvcmlhbC50dXRvcmlhbF90eXBlczsKKwordm9pZCBtYWluKCkgeworICBhdXRvIHNvY2tldCA9IG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKTsKKyAgYXV0byB0cmFuc3BvcnQgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCk7CisgIGF1dG8gcHJvdG9jb2wgPSB0QmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgYXV0byBjbGllbnQgPSB0Q2xpZW50IUNhbGN1bGF0b3IocHJvdG9jb2wpOworCisgIHRyYW5zcG9ydC5vcGVuKCk7CisKKyAgY2xpZW50LnBpbmcoKTsKKyAgd3JpdGVsbigicGluZygpIik7CisKKyAgaW50IHN1bSA9IGNsaWVudC5hZGQoMSwgMSk7CisgIHdyaXRlZmxuKCIxICsgMSA9ICVzIiwgc3VtKTsKKworICBhdXRvIHdvcmsgPSBXb3JrKCk7CisgIHdvcmsub3AgPSBPcGVyYXRpb24uRElWSURFOworICB3b3JrLm51bTEgPSAxOworICB3b3JrLm51bTIgPSAwOworICB0cnkgeworICAgIGludCBxdW90aWVudCA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7CisgICAgd3JpdGVsbigiV2hvYSB3ZSBjYW4gZGl2aWRlIGJ5IDAiKTsKKyAgfSBjYXRjaCAoSW52YWxpZE9wZXJhdGlvbiBpbykgeworICAgIHdyaXRlbG4oIkludmFsaWQgb3BlcmF0aW9uOiAiIH4gaW8ud2h5KTsKKyAgfQorCisgIHdvcmsub3AgPSBPcGVyYXRpb24uU1VCVFJBQ1Q7CisgIHdvcmsubnVtMSA9IDE1OworICB3b3JrLm51bTIgPSAxMDsKKyAgaW50IGRpZmYgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspOworICB3cml0ZWZsbigiMTUgLSAxMCA9ICVzIiwgZGlmZik7CisKKyAgYXV0byBsb2cgPSBjbGllbnQuZ2V0U3RydWN0KDEpOworICB3cml0ZWZsbigiQ2hlY2sgbG9nOiAlcyIsIGxvZy52YWx1ZSk7Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9kL3NlcnZlci5kIGIvdHV0b3JpYWwvZC9zZXJ2ZXIuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmNlZGNjCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZC9zZXJ2ZXIuZApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHNlcnZlcjsKKworaW1wb3J0IHN0ZC5jb252IDogdG87CitpbXBvcnQgc3RkLnN0ZGlvOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLnByb2Nlc3NvcjsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OworaW1wb3J0IHRocmlmdC5zZXJ2ZXIuc2ltcGxlOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LnNvY2tldDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJ1ZmZlcmVkOworCitpbXBvcnQgc2hhcmUuU2hhcmVkU2VydmljZTsKK2ltcG9ydCBzaGFyZS5zaGFyZWRfdHlwZXM7CitpbXBvcnQgdHV0b3JpYWwuQ2FsY3VsYXRvcjsKK2ltcG9ydCB0dXRvcmlhbC50dXRvcmlhbF90eXBlczsKKworLyoqCisgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDYWxjdWxhdG9yIGludGVyZmFjZSB0aGF0IGlzIGNhbGxlZCBieQorICogdGhlIHNlcnZlciB0byBhbnN3ZXIgdGhlIHJlcXVlc3RzLgorICovCitjbGFzcyBDYWxjdWxhdG9ySGFuZGxlciA6IENhbGN1bGF0b3IgeworICB2b2lkIHBpbmcoKSB7CisgICAgd3JpdGVsbigicGluZygpIik7CisgIH0KKworICBpbnQgYWRkKGludCBuMSwgaW50IG4yKSB7CisgICAgd3JpdGVmbG4oImFkZCglcywlcykiLCBuMSwgbjIpOworICAgIHJldHVybiBuMSArIG4yOworICB9CisKKyAgaW50IGNhbGN1bGF0ZShpbnQgbG9naWQsIHJlZiBjb25zdChXb3JrKSB3b3JrKSB7CisgICAgd3JpdGVmbG4oImNhbGN1bGF0ZSglcywgeyVzLCAlcywgJXN9KSIsIGxvZ2lkLCB3b3JrLm9wLCB3b3JrLm51bTEsIHdvcmsubnVtMik7CisgICAgaW50IHZhbDsKKworICAgIHN3aXRjaCAod29yay5vcCkgeworICAgIGNhc2UgT3BlcmF0aW9uLkFERDoKKyAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT3BlcmF0aW9uLlNVQlRSQUNUOgorICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPcGVyYXRpb24uTVVMVElQTFk6CisgICAgICB2YWwgPSB3b3JrLm51bTEgKiB3b3JrLm51bTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9wZXJhdGlvbi5ESVZJREU6CisgICAgICBpZiAod29yay5udW0yID09IDApIHsKKyAgICAgICAgYXV0byBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uKCk7CisgICAgICAgIGlvLndoYXRPcCA9IHdvcmsub3A7CisgICAgICAgIGlvLndoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiOworICAgICAgICB0aHJvdyBpbzsKKyAgICAgIH0KKyAgICAgIHZhbCA9IHdvcmsubnVtMSAvIHdvcmsubnVtMjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhdXRvIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24oKTsKKyAgICAgIGlvLndoYXRPcCA9IHdvcmsub3A7CisgICAgICBpby53aHkgPSAiSW52YWxpZCBPcGVyYXRpb24iOworICAgICAgdGhyb3cgaW87CisgICAgfQorCisgICAgYXV0byBzcyA9IFNoYXJlZFN0cnVjdCgpOworICAgIHNzLmtleSA9IGxvZ2lkOworICAgIHNzLnZhbHVlID0gdG8hc3RyaW5nKHZhbCk7CisgICAgbG9nW2xvZ2lkXSA9IHNzOworCisgICAgcmV0dXJuIHZhbDsKKyAgfQorCisgIFNoYXJlZFN0cnVjdCBnZXRTdHJ1Y3QoaW50IGxvZ2lkKSB7CisgICAgd3JpdGVmbG4oImdldFN0cnVjdCglcykiLCBsb2dpZCk7CisgICAgcmV0dXJuIGxvZ1tsb2dpZF07CisgIH0KKworICB2b2lkIHppcCgpIHsKKyAgICB3cml0ZWxuKCJ6aXAoKSIpOworICB9CisKK3Byb3RlY3RlZDoKKyAgU2hhcmVkU3RydWN0W2ludF0gbG9nOworfQorCit2b2lkIG1haW4oKSB7CisgIGF1dG8gcHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkhKCk7CisgIGF1dG8gcHJvY2Vzc29yID0gbmV3IFRTZXJ2aWNlUHJvY2Vzc29yIUNhbGN1bGF0b3IobmV3IENhbGN1bGF0b3JIYW5kbGVyKTsKKyAgYXV0byBzZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsKKyAgYXV0byB0cmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk7CisKKyAgYXV0byBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcigKKyAgICBwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKworICB3cml0ZWxuKCJTdGFydGluZyB0aGUgc2VydmVyIG9uIHBvcnQgOTA5MC4uLiIpOworICBzZXJ2ZXIuc2VydmUoKTsKKyAgd3JpdGVsbigiZG9uZS4iKTsKK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9kYXJ0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OTVhY2EKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNzMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitCVUlMVF9TT1VSQ0VTID0gZ2VuLWRhcnQvdHV0b3JpYWwvbGliL3R1dG9yaWFsLmRhcnQgZ2VuLWRhcnQvc2hhcmVkL2xpYi9zaGFyZWQuZGFydAorCitnZW4tZGFydC90dXRvcmlhbC9saWIvdHV0b3JpYWwuZGFydCBnZW4tZGFydC9zaGFyZWQvbGliL3NoYXJlZC5kYXJ0OiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBkYXJ0IC1yICQ8CisKK2FsbC1sb2NhbDogZ2VuLWRhcnQvdHV0b3JpYWwvbGliL3R1dG9yaWFsLmRhcnQgcHViLWdldAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tKgorCWZpbmQgLiAtdHlwZSBkIC1uYW1lICJwYWNrYWdlcyIgfCB4YXJncyAkKFJNKSAtcgorCWZpbmQgLiAtdHlwZSBmIC1uYW1lICIucGFja2FnZXMiIHwgeGFyZ3MgJChSTSkKKwlmaW5kIC4gLXR5cGUgZiAtbmFtZSAicHVic3BlYy5sb2NrIiB8IHhhcmdzICQoUk0pCisKK3B1Yi1nZXQ6IHB1Yi1nZXQtZ2VuIHB1Yi1nZXQtY2xpZW50IHB1Yi1nZXQtY29uc29sZS1jbGllbnQgcHViLWdldC1zZXJ2ZXIKKworcHViLWdldC1nZW46IHB1Yi1nZXQtdHV0b3JpYWwgcHViLWdldC1zaGFyZWQKKworcHViLWdldC10dXRvcmlhbDogZ2VuLWRhcnQvdHV0b3JpYWwvbGliL3R1dG9yaWFsLmRhcnQKKwljZCBnZW4tZGFydC90dXRvcmlhbDsgJHtEQVJUUFVCfSBnZXQKKworcHViLWdldC1zaGFyZWQ6IGdlbi1kYXJ0L3NoYXJlZC9saWIvc2hhcmVkLmRhcnQKKwljZCBnZW4tZGFydC9zaGFyZWQ7ICR7REFSVFBVQn0gZ2V0CisKK3B1Yi1nZXQtY2xpZW50OgorCWNkIGNsaWVudDsgJHtEQVJUUFVCfSBnZXQKKworcHViLWdldC1jb25zb2xlLWNsaWVudDoKKwljZCBjb25zb2xlX2NsaWVudDsgJHtEQVJUUFVCfSBnZXQKKworcHViLWdldC1zZXJ2ZXI6CisJY2Qgc2VydmVyOyAke0RBUlRQVUJ9IGdldAorCit0dXRvcmlhbHNlcnZlcjogcHViLWdldC1nZW4gcHViLWdldC1zZXJ2ZXIKKwkke0RBUlR9IHNlcnZlci9iaW4vbWFpbi5kYXJ0CisKK3R1dG9yaWFsY2xpZW50OiBwdWItZ2V0LWdlbiBwdWItZ2V0LWNsaWVudAorCWNkIGNsaWVudDsgJHtEQVJUUFVCfSBzZXJ2ZQorCit0dXRvcmlhbGNvbnNvbGVjbGllbnQ6IHB1Yi1nZXQtY29uc29sZS1jbGllbnQKKwkke0RBUlR9IGNvbnNvbGVfY2xpZW50L2Jpbi9tYWluLmRhcnQKKworRVhUUkFfRElTVCA9IFwKKwljbGllbnQvd2ViL2NsaWVudC5kYXJ0IFwKKwljbGllbnQvd2ViL2luZGV4Lmh0bWwgXAorCWNsaWVudC93ZWIvc3R5bGVzLmNzcyBcCisJY2xpZW50L3B1YnNwZWMueWFtbCBcCisJY29uc29sZV9jbGllbnQvYmluL21haW4uZGFydCBcCisJY29uc29sZV9jbGllbnQvcHVic3BlYy55YW1sIFwKKwlzZXJ2ZXIvYmluL21haW4uZGFydCBcCisJc2VydmVyL3B1YnNwZWMueWFtbCBcCisJY29uc29sZV9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMgXAorCWNsaWVudC8uYW5hbHlzaXNfb3B0aW9ucyBcCisJc2VydmVyLy5hbmFseXNpc19vcHRpb25zIFwKKwlidWlsZC5zaApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9idWlsZC5zaCBiL3R1dG9yaWFsL2RhcnQvYnVpbGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFiZTA0YQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvYnVpbGQuc2gKQEAgLTAsMCArMSw1NiBAQAorIyEvYmluL3NoCisKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworc2V0IC1lOworcm0gLXIgZ2VuLWRhcnQgfHwgdHJ1ZTsKKwordGhyaWZ0IC0tZ2VuIGRhcnQgLi4vc2hhcmVkLnRocmlmdDsKK2NkIGdlbi1kYXJ0L3NoYXJlZDsKK3B1YiBnZXQ7CitjZCAuLi8uLjsKKwordGhyaWZ0IC0tZ2VuIGRhcnQgLi4vdHV0b3JpYWwudGhyaWZ0OworY2QgZ2VuLWRhcnQvdHV0b3JpYWw7CitwdWIgZ2V0OworY2QgLi4vLi47CisKK2NkIGNsaWVudDsKK3B1YiBnZXQ7CitjZCAuLjsKKworY2QgY29uc29sZV9jbGllbnQ7CitwdWIgZ2V0OworY2QgLi47CisKK2NkIHNlcnZlcjsKK3B1YiBnZXQ7CitjZCAuLjsKKworZGFydGZtdCAtdyBnZW4tZGFydDsKKworZWNobyAiXG5FbmpveSB0aGUgRGFydCB0dXRvcmlhbCEiOworZWNobyAiXG5UbyBydW4gdGhlIHNlcnZlcjoiOworZWNobyAiPiBkYXJ0IHNlcnZlci9iaW4vbWFpbi5kYXJ0IjsKK2VjaG8gIlxuVG8gcnVuIHRoZSBjbGllbnQ6IjsKK2VjaG8gIiMgU2VydmUgdGhlIGFwcCBmcm9tIHRoZSBjbGllbnQgZGlyZWN0b3J5IGFuZCB2aWV3IGluIGEgYnJvd3NlciI7CitlY2hvICI+IGNkIGNsaWVudDsiOworZWNobyAiPiBwdWIgc2VydmU7IjsKK2VjaG8gIlxuVG8gcnVuIHRoZSBjb25zb2xlIGNsaWVudDoiOworZWNobyAiPiBkYXJ0IGNvbnNvbGVfY2xpZW50L2Jpbi9tYWluLmRhcnQiOworZWNobyAiIjsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvY2xpZW50Ly5hbmFseXNpc19vcHRpb25zIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwZDRjNQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvY2xpZW50Ly5hbmFseXNpc19vcHRpb25zCkBAIC0wLDAgKzEsMiBAQAorYW5hbHl6ZXI6CisgIHN0cm9uZy1tb2RlOiB0cnVlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L2NsaWVudC9wdWJzcGVjLnlhbWwgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC9wdWJzcGVjLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhlZGUxNAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvY2xpZW50L3B1YnNwZWMueWFtbApAQCAtMCwwICsxLDM0IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWU6IHR1dG9yaWFsX2NsaWVudAordmVyc2lvbjogMS4wLjAKK2Rlc2NyaXB0aW9uOiBBIERhcnQgY2xpZW50IGltcGxlbWVudGF0aW9uIG9mIHRoZSBBcGFjaGUgVGhyaWZ0IHR1dG9yaWFsCithdXRob3I6IEFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgoraG9tZXBhZ2U6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworCitlbnZpcm9ubWVudDoKKyAgc2RrOiAiPj0xLjEzLjAgPDIuMC4wIgorCitkZXBlbmRlbmNpZXM6CisgIGJyb3dzZXI6IF4wLjEwLjAKKyAgc2hhcmVkOgorICAgIHBhdGg6IC4uL2dlbi1kYXJ0L3NoYXJlZAorICB0aHJpZnQ6CisgICAgcGF0aDogLi4vLi4vLi4vbGliL2RhcnQKKyAgdHV0b3JpYWw6CisgICAgcGF0aDogLi4vZ2VuLWRhcnQvdHV0b3JpYWwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvY2xpZW50L3dlYi9jbGllbnQuZGFydCBiL3R1dG9yaWFsL2RhcnQvY2xpZW50L3dlYi9jbGllbnQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjAyZDBkCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL2NsaWVudC5kYXJ0CkBAIC0wLDAgKzEsMjc4IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0ICdkYXJ0Omh0bWwnOworCitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0X2Jyb3dzZXIuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6c2hhcmVkL3NoYXJlZC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0dXRvcmlhbC90dXRvcmlhbC5kYXJ0JzsKKworLy8vIEFkYXB0ZWQgZnJvbSB0aGUgQVMzIHR1dG9yaWFsCit2b2lkIG1haW4oKSB7CisgIG5ldyBDYWxjdWxhdG9yVUkocXVlcnlTZWxlY3RvcignI291dHB1dCcpKS5zdGFydCgpOworfQorCitjbGFzcyBDYWxjdWxhdG9yVUkgeworICBmaW5hbCBEaXZFbGVtZW50IG91dHB1dDsKKworICBDYWxjdWxhdG9yVUkodGhpcy5vdXRwdXQpOworCisgIFRUcmFuc3BvcnQgX3RyYW5zcG9ydDsKKyAgQ2FsY3VsYXRvciBfY2FsY3VsYXRvckNsaWVudDsKKworICB2b2lkIHN0YXJ0KCkgeworICAgIF9idWlsZEludGVyZmFjZSgpOworICAgIF9pbml0Q29ubmVjdGlvbigpOworICB9CisKKyAgdm9pZCBfdmFsaWRhdGUoKSB7CisgICAgaWYgKCFfdHJhbnNwb3J0LmlzT3BlbikgeworICAgICAgd2luZG93LmFsZXJ0KCJUaGUgdHJhbnNwb3J0IGlzIG5vdCBvcGVuISIpOworICAgIH0KKyAgfQorCisgIHZvaWQgX2luaXRDb25uZWN0aW9uKCkgeworICAgIF90cmFuc3BvcnQgPSBuZXcgVEFzeW5jQ2xpZW50U29ja2V0VHJhbnNwb3J0KAorICAgICAgICBuZXcgVFdlYlNvY2tldChVcmkucGFyc2UoJ3dzOi8vMTI3LjAuMC4xOjkwOTAvd3MnKSksCisgICAgICAgIG5ldyBUTWVzc2FnZVJlYWRlcihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgICAgVFByb3RvY29sIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbChfdHJhbnNwb3J0KTsKKyAgICBfdHJhbnNwb3J0Lm9wZW4oKTsKKworICAgIF9jYWxjdWxhdG9yQ2xpZW50ID0gbmV3IENhbGN1bGF0b3JDbGllbnQocHJvdG9jb2wpOworICB9CisKKyAgdm9pZCBfYnVpbGRJbnRlcmZhY2UoKSB7CisgICAgb3V0cHV0LmNoaWxkcmVuLmZvckVhY2goKGUpIHsKKyAgICAgIGUucmVtb3ZlKCk7CisgICAgfSk7CisKKyAgICBfYnVpbGRQaW5nQ29tcG9uZW50KCk7CisKKyAgICBfYnVpbGRBZGRDb21wb25lbnQoKTsKKworICAgIF9idWlsZENhbGN1bGF0b3JDb21wb25lbnQoKTsKKworICAgIF9idWlsZEdldFN0cnVjdENvbXBvbmVudCgpOworICB9CisKKyAgdm9pZCBfYnVpbGRQaW5nQ29tcG9uZW50KCkgeworICAgIG91dHB1dC5hcHBlbmQobmV3IEhlYWRpbmdFbGVtZW50LmgzKCkuLnRleHQgPSAiUGluZyIpOworICAgIEJ1dHRvbkVsZW1lbnQgcGluZ0J1dHRvbiA9IG5ldyBCdXR0b25FbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICJQSU5HIgorICAgICAgLi5vbkNsaWNrLmxpc3Rlbihfb25QaW5nQ2xpY2spOworICAgIG91dHB1dC5hcHBlbmQocGluZ0J1dHRvbik7CisgIH0KKworICB2b2lkIF9vblBpbmdDbGljayhNb3VzZUV2ZW50IGUpIHsKKyAgICBfdmFsaWRhdGUoKTsKKworICAgIF9jYWxjdWxhdG9yQ2xpZW50LnBpbmcoKTsKKyAgfQorCisgIHZvaWQgX2J1aWxkQWRkQ29tcG9uZW50KCkgeworICAgIG91dHB1dC5hcHBlbmQobmV3IEhlYWRpbmdFbGVtZW50LmgzKCkuLnRleHQgPSAiQWRkIik7CisgICAgSW5wdXRFbGVtZW50IG51bTEgPSBuZXcgSW5wdXRFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiYWRkMSIKKyAgICAgIC4udHlwZSA9ICJudW1iZXIiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjUwcHgiOworICAgIG91dHB1dC5hcHBlbmQobnVtMSk7CisgICAgU3BhbkVsZW1lbnQgb3AgPSBuZXcgU3BhbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIisiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChvcCk7CisgICAgSW5wdXRFbGVtZW50IG51bTIgPSBuZXcgSW5wdXRFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiYWRkMiIKKyAgICAgIC4udHlwZSA9ICJudW1iZXIiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjUwcHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChudW0yKTsKKyAgICBCdXR0b25FbGVtZW50IGFkZEJ1dHRvbiA9IG5ldyBCdXR0b25FbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICI9IgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiCisgICAgICAuLm9uQ2xpY2subGlzdGVuKF9vbkFkZENsaWNrKTsKKyAgICBvdXRwdXQuYXBwZW5kKGFkZEJ1dHRvbik7CisgICAgU3BhbkVsZW1lbnQgcmVzdWx0ID0gbmV3IFNwYW5FbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiYWRkUmVzdWx0IgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiOworICAgIG91dHB1dC5hcHBlbmQocmVzdWx0KTsKKyAgfQorCisgIHZvaWQgX29uQWRkQ2xpY2soTW91c2VFdmVudCBlKSB7CisgICAgX3ZhbGlkYXRlKCk7CisKKyAgICBJbnB1dEVsZW1lbnQgbnVtMSA9IHF1ZXJ5U2VsZWN0b3IoIiNhZGQxIik7CisgICAgSW5wdXRFbGVtZW50IG51bTIgPSBxdWVyeVNlbGVjdG9yKCIjYWRkMiIpOworICAgIFNwYW5FbGVtZW50IHJlc3VsdCA9IHF1ZXJ5U2VsZWN0b3IoIiNhZGRSZXN1bHQiKTsKKworICAgIF9jYWxjdWxhdG9yQ2xpZW50CisgICAgICAgIC5hZGQoaW50LnBhcnNlKG51bTEudmFsdWUpLCBpbnQucGFyc2UobnVtMi52YWx1ZSkpCisgICAgICAgIC50aGVuKChpbnQgbikgeworICAgICAgcmVzdWx0LnRleHQgPSAiJG4iOworICAgIH0pOworICB9CisKKyAgdm9pZCBfYnVpbGRDYWxjdWxhdG9yQ29tcG9uZW50KCkgeworICAgIG91dHB1dC5hcHBlbmQobmV3IEhlYWRpbmdFbGVtZW50LmgzKCkuLnRleHQgPSAiQ2FsY3VsYXRvciIpOworICAgIElucHV0RWxlbWVudCBudW0xID0gbmV3IElucHV0RWxlbWVudCgpCisgICAgICAuLmlkID0gImNhbGMxIgorICAgICAgLi50eXBlID0gIm51bWJlciIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiNTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChudW0xKTsKKyAgICBTZWxlY3RFbGVtZW50IG9wID0gbmV3IFNlbGVjdEVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJjYWxjT3AiCisgICAgICAuLm11bHRpcGxlID0gZmFsc2UKKyAgICAgIC4uc2VsZWN0ZWRJbmRleCA9IDAKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTZweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IgorICAgICAgLi5zdHlsZS53aWR0aCA9ICI1MHB4IjsKKyAgICBPcHRpb25FbGVtZW50IGFkZE9wID0gbmV3IE9wdGlvbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIisiCisgICAgICAuLnZhbHVlID0gT3BlcmF0aW9uLkFERC50b1N0cmluZygpOworICAgIG9wLmFkZChhZGRPcCwgMCk7CisgICAgT3B0aW9uRWxlbWVudCBzdWJ0cmFjdE9wID0gbmV3IE9wdGlvbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIi0iCisgICAgICAuLnZhbHVlID0gT3BlcmF0aW9uLlNVQlRSQUNULnRvU3RyaW5nKCk7CisgICAgb3AuYWRkKHN1YnRyYWN0T3AsIDEpOworICAgIE9wdGlvbkVsZW1lbnQgbXVsdGlwbHlPcCA9IG5ldyBPcHRpb25FbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICIqIgorICAgICAgLi52YWx1ZSA9IE9wZXJhdGlvbi5NVUxUSVBMWS50b1N0cmluZygpOworICAgIG9wLmFkZChtdWx0aXBseU9wLCAyKTsKKyAgICBPcHRpb25FbGVtZW50IGRpdmlkZU9wID0gbmV3IE9wdGlvbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIi8iCisgICAgICAuLnZhbHVlID0gT3BlcmF0aW9uLkRJVklERS50b1N0cmluZygpOworICAgIG9wLmFkZChkaXZpZGVPcCwgMyk7CisgICAgb3V0cHV0LmFwcGVuZChvcCk7CisgICAgSW5wdXRFbGVtZW50IG51bTIgPSBuZXcgSW5wdXRFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiY2FsYzIiCisgICAgICAuLnR5cGUgPSAibnVtYmVyIgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS53aWR0aCA9ICI1MHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiOworICAgIG91dHB1dC5hcHBlbmQobnVtMik7CisgICAgQnV0dG9uRWxlbWVudCBjYWxjQnV0dG9uID0gbmV3IEJ1dHRvbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIj0iCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCIKKyAgICAgIC4ub25DbGljay5saXN0ZW4oX29uQ2FsY0NsaWNrKTsKKyAgICBvdXRwdXQuYXBwZW5kKGNhbGNCdXR0b24pOworICAgIFNwYW5FbGVtZW50IHJlc3VsdCA9IG5ldyBTcGFuRWxlbWVudCgpCisgICAgICAuLmlkID0gImNhbGNSZXN1bHQiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChyZXN1bHQpOworICAgIG91dHB1dC5hcHBlbmQobmV3IEJSRWxlbWVudCgpKTsKKyAgICBvdXRwdXQuYXBwZW5kKG5ldyBCUkVsZW1lbnQoKSk7CisgICAgTGFiZWxFbGVtZW50IGxvZ0lkTGFiZWwgPSBuZXcgTGFiZWxFbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICJMb2cgSUQ6IgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKGxvZ0lkTGFiZWwpOworICAgIElucHV0RWxlbWVudCBsb2dJZCA9IG5ldyBJbnB1dEVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJsb2dJZCIKKyAgICAgIC4udHlwZSA9ICJudW1iZXIiCisgICAgICAuLnZhbHVlID0gIjEiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjUwcHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChsb2dJZCk7CisgICAgTGFiZWxFbGVtZW50IGNvbW1lbnRMYWJlbCA9IG5ldyBMYWJlbEVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIkNvbW1lbnQ6IgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiOworICAgIG91dHB1dC5hcHBlbmQoY29tbWVudExhYmVsKTsKKyAgICBJbnB1dEVsZW1lbnQgY29tbWVudCA9IG5ldyBJbnB1dEVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJjb21tZW50IgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS53aWR0aCA9ICIxMDBweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKGNvbW1lbnQpOworICB9CisKKyAgdm9pZCBfb25DYWxjQ2xpY2soTW91c2VFdmVudCBlKSB7CisgICAgX3ZhbGlkYXRlKCk7CisKKyAgICBJbnB1dEVsZW1lbnQgbnVtMSA9IHF1ZXJ5U2VsZWN0b3IoIiNjYWxjMSIpOworICAgIElucHV0RWxlbWVudCBudW0yID0gcXVlcnlTZWxlY3RvcigiI2NhbGMyIik7CisgICAgU2VsZWN0RWxlbWVudCBvcCA9IHF1ZXJ5U2VsZWN0b3IoIiNjYWxjT3AiKTsKKyAgICBTcGFuRWxlbWVudCByZXN1bHQgPSBxdWVyeVNlbGVjdG9yKCIjY2FsY1Jlc3VsdCIpOworICAgIElucHV0RWxlbWVudCBsb2dJZCA9IHF1ZXJ5U2VsZWN0b3IoIiNsb2dJZCIpOworICAgIElucHV0RWxlbWVudCBjb21tZW50ID0gcXVlcnlTZWxlY3RvcigiI2NvbW1lbnQiKTsKKworICAgIGludCBsb2dJZFZhbHVlID0gaW50LnBhcnNlKGxvZ0lkLnZhbHVlKTsKKyAgICBsb2dJZC52YWx1ZSA9IChsb2dJZFZhbHVlICsgMSkudG9TdHJpbmcoKTsKKworICAgIFdvcmsgd29yayA9IG5ldyBXb3JrKCk7CisgICAgd29yay5udW0xID0gaW50LnBhcnNlKG51bTEudmFsdWUpOworICAgIHdvcmsubnVtMiA9IGludC5wYXJzZShudW0yLnZhbHVlKTsKKyAgICB3b3JrLm9wID0gaW50LnBhcnNlKG9wLm9wdGlvbnNbb3Auc2VsZWN0ZWRJbmRleF0udmFsdWUpOworICAgIHdvcmsuY29tbWVudCA9IGNvbW1lbnQudmFsdWU7CisKKyAgICBfY2FsY3VsYXRvckNsaWVudC5jYWxjdWxhdGUobG9nSWRWYWx1ZSwgd29yaykudGhlbigoaW50IG4pIHsKKyAgICAgIHJlc3VsdC50ZXh0ID0gIiRuIjsKKyAgICB9KTsKKyAgfQorCisgIHZvaWQgX2J1aWxkR2V0U3RydWN0Q29tcG9uZW50KCkgeworICAgIG91dHB1dC5hcHBlbmQobmV3IEhlYWRpbmdFbGVtZW50LmgzKCkuLnRleHQgPSAiR2V0IFN0cnVjdCIpOworICAgIExhYmVsRWxlbWVudCBsb2dJZExhYmVsID0gbmV3IExhYmVsRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiU3RydWN0IEtleToiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiOworICAgIG91dHB1dC5hcHBlbmQobG9nSWRMYWJlbCk7CisgICAgSW5wdXRFbGVtZW50IGxvZ0lkID0gbmV3IElucHV0RWxlbWVudCgpCisgICAgICAuLmlkID0gInN0cnVjdEtleSIKKyAgICAgIC4udHlwZSA9ICJudW1iZXIiCisgICAgICAuLnZhbHVlID0gIjEiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjUwcHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChsb2dJZCk7CisgICAgQnV0dG9uRWxlbWVudCBnZXRTdHJ1Y3RCdXR0b24gPSBuZXcgQnV0dG9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiR0VUIgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiCisgICAgICAuLm9uQ2xpY2subGlzdGVuKF9vbkdldFN0cnVjdENsaWNrKTsKKyAgICBvdXRwdXQuYXBwZW5kKGdldFN0cnVjdEJ1dHRvbik7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgQlJFbGVtZW50KCkpOworICAgIG91dHB1dC5hcHBlbmQobmV3IEJSRWxlbWVudCgpKTsKKyAgICBUZXh0QXJlYUVsZW1lbnQgcmVzdWx0ID0gbmV3IFRleHRBcmVhRWxlbWVudCgpCisgICAgICAuLmlkID0gImdldFN0cnVjdFJlc3VsdCIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiMzAwcHgiCisgICAgICAuLnN0eWxlLmhlaWdodCA9ICI1MHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiOworICAgIG91dHB1dC5hcHBlbmQocmVzdWx0KTsKKyAgfQorCisgIHZvaWQgX29uR2V0U3RydWN0Q2xpY2soTW91c2VFdmVudCBlKSB7CisgICAgX3ZhbGlkYXRlKCk7CisKKyAgICBJbnB1dEVsZW1lbnQgc3RydWN0S2V5ID0gcXVlcnlTZWxlY3RvcigiI3N0cnVjdEtleSIpOworICAgIFRleHRBcmVhRWxlbWVudCByZXN1bHQgPSBxdWVyeVNlbGVjdG9yKCIjZ2V0U3RydWN0UmVzdWx0Iik7CisKKyAgICBfY2FsY3VsYXRvckNsaWVudAorICAgICAgICAuZ2V0U3RydWN0KGludC5wYXJzZShzdHJ1Y3RLZXkudmFsdWUpKQorICAgICAgICAudGhlbigoU2hhcmVkU3RydWN0IHMpIHsKKyAgICAgIHJlc3VsdC50ZXh0ID0gIiR7cy50b1N0cmluZygpfSI7CisgICAgfSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvY2xpZW50L3dlYi9pbmRleC5odG1sIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRiMTg0ZQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvY2xpZW50L3dlYi9pbmRleC5odG1sCkBAIC0wLDAgKzEsMzYgQEAKKzwhLS0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCFET0NUWVBFIGh0bWw+Cis8aHRtbD4KKzxoZWFkPgorICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KKyAgICA8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiPgorICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIj4KKyAgICA8dGl0bGU+VGhyaWZ0IFR1dG9yaWFsPC90aXRsZT4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InN0eWxlcy5jc3MiPgorICAgIDxzY3JpcHQgYXN5bmMgc3JjPSJjbGllbnQuZGFydCIgdHlwZT0iYXBwbGljYXRpb24vZGFydCI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBhc3luYyBzcmM9InBhY2thZ2VzL2Jyb3dzZXIvZGFydC5qcyI+PC9zY3JpcHQ+Cis8L2hlYWQ+CisKKzxib2R5PgorCisgIDxkaXYgaWQ9Im91dHB1dCI+PC9kaXY+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvY2xpZW50L3dlYi9zdHlsZXMuY3NzIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL3N0eWxlcy5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAzMTUwMgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvY2xpZW50L3dlYi9zdHlsZXMuY3NzCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK0BpbXBvcnQgdXJsKGh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Sb2JvdG8pOworCitodG1sLCBib2R5IHsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBoZWlnaHQ6IDEwMCU7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDEwcHg7CisgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8nLCBzYW5zLXNlcmlmOworfQorCitoMyB7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQ7CisgICAgYm9yZGVyLXdpZHRoOiB0aGluOworICAgIHBhZGRpbmctdG9wOiAyMHB4OworfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucyBiL3R1dG9yaWFsL2RhcnQvY29uc29sZV9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwZDRjNQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvY29uc29sZV9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMKQEAgLTAsMCArMSwyIEBACithbmFseXplcjoKKyAgc3Ryb25nLW1vZGU6IHRydWUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvY29uc29sZV9jbGllbnQvYmluL21haW4uZGFydCBiL3R1dG9yaWFsL2RhcnQvY29uc29sZV9jbGllbnQvYmluL21haW4uZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGEyMDZhCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9iaW4vbWFpbi5kYXJ0CkBAIC0wLDAgKzEsMTQ5IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDppbyc7CisKK2ltcG9ydCAncGFja2FnZTphcmdzL2FyZ3MuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6bG9nZ2luZy9sb2dnaW5nLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdF9jb25zb2xlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnR1dG9yaWFsL3R1dG9yaWFsLmRhcnQnOworCitUVHJhbnNwb3J0IF90cmFuc3BvcnQ7CitDYWxjdWxhdG9yIF9jYWxjdWxhdG9yOworaW50IGxvZ2lkID0gMDsKKworY29uc3QgTWFwPFN0cmluZywgaW50PiBvcGVyYXRpb25Mb29rdXAgPSBjb25zdCB7CisgICcrJzogT3BlcmF0aW9uLkFERCwKKyAgJy0nOiBPcGVyYXRpb24uU1VCVFJBQ1QsCisgICcqJzogT3BlcmF0aW9uLk1VTFRJUExZLAorICAnLyc6IE9wZXJhdGlvbi5ESVZJREUKK307CisKK21haW4oTGlzdDxTdHJpbmc+IGFyZ3MpIHsKKyAgTG9nZ2VyLnJvb3QubGV2ZWwgPSBMZXZlbC5BTEw7CisgIExvZ2dlci5yb290Lm9uUmVjb3JkLmxpc3RlbigoTG9nUmVjb3JkIHJlYykgeworICAgIHByaW50KCcke3JlYy5sZXZlbC5uYW1lfTogJHtyZWMudGltZX06ICR7cmVjLm1lc3NhZ2V9Jyk7CisgIH0pOworCisgIHZhciBwYXJzZXIgPSBuZXcgQXJnUGFyc2VyKCk7CisgIHBhcnNlci5hZGRPcHRpb24oJ3BvcnQnLCBkZWZhdWx0c1RvOiAnOTA5MCcsIGhlbHA6ICdUaGUgcG9ydCB0byBjb25uZWN0IHRvJyk7CisKKyAgQXJnUmVzdWx0cyByZXN1bHRzOworICB0cnkgeworICAgIHJlc3VsdHMgPSBwYXJzZXIucGFyc2UoYXJncyk7CisgIH0gY2F0Y2ggKGUpIHsKKyAgICByZXN1bHRzID0gbnVsbDsKKyAgfQorCisgIGlmIChyZXN1bHRzID09IG51bGwpIHsKKyAgICBwcmludChwYXJzZXIudXNhZ2UpOworICAgIGV4aXQoMCk7CisgIH0KKworICBpbnQgcG9ydCA9IGludC5wYXJzZShyZXN1bHRzWydwb3J0J10pOworCisgIF9pbml0Q29ubmVjdGlvbihwb3J0KS50aGVuKChfKSA9PiBfcnVuKCkpOworfQorCitGdXR1cmUgX2luaXRDb25uZWN0aW9uKGludCBwb3J0KSBhc3luYyB7CisgIHZhciBzb2NrZXQgPSBhd2FpdCBTb2NrZXQuY29ubmVjdCgnMTI3LjAuMC4xJywgcG9ydCk7CisgIF90cmFuc3BvcnQgPSBuZXcgVEFzeW5jQ2xpZW50U29ja2V0VHJhbnNwb3J0KAorICAgICAgbmV3IFRUY3BTb2NrZXQoc29ja2V0KSwgbmV3IFRNZXNzYWdlUmVhZGVyKG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgVFByb3RvY29sIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbChfdHJhbnNwb3J0KTsKKyAgYXdhaXQgX3RyYW5zcG9ydC5vcGVuKCk7CisKKyAgX2NhbGN1bGF0b3IgPSBuZXcgQ2FsY3VsYXRvckNsaWVudChwcm90b2NvbCk7Cit9CisKK0Z1dHVyZSBfcnVuKCkgYXN5bmMgeworICBfaGVscCgpOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgc3Rkb3V0LndyaXRlKCI+ICIpOworICAgIHZhciBpbnB1dCA9IHN0ZGluLnJlYWRMaW5lU3luYygpOworICAgIHZhciBwYXJ0cyA9IGlucHV0LnNwbGl0KCcgJyk7CisgICAgdmFyIGNvbW1hbmQgPSBwYXJ0c1swXTsKKyAgICB2YXIgYXJncyA9IHBhcnRzLmxlbmd0aCA+IDEgPyBwYXJ0cy5zdWJsaXN0KDEpIDogW107CisKKyAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKKyAgICAgIGNhc2UgJ3BpbmcnOgorICAgICAgICBhd2FpdCBfcGluZygpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAnYWRkJzoKKyAgICAgICAgYXdhaXQgX2FkZChpbnQucGFyc2UoYXJnc1swXSksIGludC5wYXJzZShhcmdzWzFdKSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdjYWxjJzoKKyAgICAgICAgaW50IG9wID0gb3BlcmF0aW9uTG9va3VwW2FyZ3NbMV1dOworICAgICAgICBpZiAoIU9wZXJhdGlvbi5WQUxJRF9WQUxVRVMuY29udGFpbnMob3ApKSB7CisgICAgICAgICAgc3Rkb3V0LndyaXRlbG4oJ1Vua25vd24gb3BlcmF0b3IgJHthcmdzWzFdfScpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHdvcmsgPSBuZXcgV29yaygpCisgICAgICAgICAgLi5udW0xID0gaW50LnBhcnNlKGFyZ3NbMF0pCisgICAgICAgICAgLi5vcCA9IG9wCisgICAgICAgICAgLi5udW0yID0gaW50LnBhcnNlKGFyZ3NbMl0pCisgICAgICAgICAgLi5jb21tZW50ID0gYXJncy5sZW5ndGggPiAzID8gYXJnc1szXSA6ICcnOworCisgICAgICAgIGF3YWl0IF9jYWxjKHdvcmspOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAnc3RydWN0JzoKKyAgICAgICAgYXdhaXQgX3N0cnVjdChpbnQucGFyc2UoYXJnc1swXSkpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAnaGVscCc6CisgICAgICBkZWZhdWx0OgorICAgICAgICBfaGVscCgpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKwordm9pZCBfaGVscCgpIHsKKyAgc3Rkb3V0LndyaXRlbG4oJ0NvbW1hbmRzOicpOworICBzdGRvdXQud3JpdGVsbignICBoZWxwJyk7CisgIHN0ZG91dC53cml0ZWxuKCcgIHBpbmcnKTsKKyAgc3Rkb3V0LndyaXRlbG4oJyAgYWRkIHggeScpOworICBzdGRvdXQud3JpdGVsbignICBjYWxjIHggb3AgeSBbY29tbWVudF0nKTsKKyAgc3Rkb3V0LndyaXRlbG4oJyAgc3RydWN0IGlkJyk7CisgIHN0ZG91dC53cml0ZWxuKCcnKTsKK30KKworRnV0dXJlIF9waW5nKCkgYXN5bmMgeworICBhd2FpdCBfY2FsY3VsYXRvci5waW5nKCk7CisgIHN0ZG91dC53cml0ZWxuKCdwaW5nIHN1Y2NlZWRlZCcpOworfQorCitGdXR1cmUgX2FkZChpbnQgeCwgaW50IHkpIGFzeW5jIHsKKyAgaW50IHJlc3VsdCA9IGF3YWl0IF9jYWxjdWxhdG9yLmFkZCh4LCB5KTsKKyAgc3Rkb3V0LndyaXRlbG4oJz0gJHJlc3VsdCcpOworfQorCitGdXR1cmUgX2NhbGMoV29yayB3b3JrKSBhc3luYyB7CisgIGludCByZXN1bHQgPSBhd2FpdCBfY2FsY3VsYXRvci5jYWxjdWxhdGUobG9naWQrKywgd29yayk7CisgIHN0ZG91dC53cml0ZWxuKCc9ICRyZXN1bHQnKTsKK30KKworRnV0dXJlIF9zdHJ1Y3QoaW50IGtleSkgYXN5bmMgeworICB2YXIgc3RydWN0ID0gYXdhaXQgX2NhbGN1bGF0b3IuZ2V0U3RydWN0KGtleSk7CisgIHN0ZG91dC53cml0ZWxuKHN0cnVjdC50b1N0cmluZygpKTsKK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvY29uc29sZV9jbGllbnQvcHVic3BlYy55YW1sIGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM0ZTI2ZgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvY29uc29sZV9jbGllbnQvcHVic3BlYy55YW1sCkBAIC0wLDAgKzEsMzYgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZTogdHV0b3JpYWxfY29uc29sZV9jbGllbnQKK3ZlcnNpb246IDEuMC4wCitkZXNjcmlwdGlvbjogPgorICBBIERhcnQgY29uc29sZSBjbGllbnQgdG8gaW1wbGVtZW50YXRpb24gb2YgdGhlIEFwYWNoZSBUaHJpZnQgdHV0b3JpYWwKK2F1dGhvcjogQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Citob21lcGFnZTogaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCisKK2Vudmlyb25tZW50OgorICBzZGs6ICI+PTEuMTMuMCA8Mi4wLjAiCisKK2RlcGVuZGVuY2llczoKKyAgYXJnczogXjAuMTMuMAorICBjb2xsZWN0aW9uOiBeMS4xLjAKKyAgc2hhcmVkOgorICAgIHBhdGg6IC4uL2dlbi1kYXJ0L3NoYXJlZAorICB0aHJpZnQ6CisgICAgcGF0aDogLi4vLi4vLi4vbGliL2RhcnQKKyAgdHV0b3JpYWw6CisgICAgcGF0aDogLi4vZ2VuLWRhcnQvdHV0b3JpYWwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvc2VydmVyLy5hbmFseXNpc19vcHRpb25zIGIvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvLmFuYWx5c2lzX29wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwZDRjNQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvc2VydmVyLy5hbmFseXNpc19vcHRpb25zCkBAIC0wLDAgKzEsMiBAQAorYW5hbHl6ZXI6CisgIHN0cm9uZy1tb2RlOiB0cnVlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L3NlcnZlci9iaW4vbWFpbi5kYXJ0IGIvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvYmluL21haW4uZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGFjMzBkCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvYmluL21haW4uZGFydApAQCAtMCwwICsxLDE2MyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6aW8nOworCitpbXBvcnQgJ3BhY2thZ2U6YXJncy9hcmdzLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmxvZ2dpbmcvbG9nZ2luZy5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnRfY29uc29sZS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0dXRvcmlhbC90dXRvcmlhbC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpzaGFyZWQvc2hhcmVkLmRhcnQnOworCitUUHJvdG9jb2wgX3Byb3RvY29sOworVFByb2Nlc3NvciBfcHJvY2Vzc29yOworV2ViU29ja2V0IF93ZWJTb2NrZXQ7CisKK21haW4oTGlzdDxTdHJpbmc+IGFyZ3MpIHsKKyAgTG9nZ2VyLnJvb3QubGV2ZWwgPSBMZXZlbC5BTEw7CisgIExvZ2dlci5yb290Lm9uUmVjb3JkLmxpc3RlbigoTG9nUmVjb3JkIHJlYykgeworICAgIHByaW50KCcke3JlYy5sZXZlbC5uYW1lfTogJHtyZWMudGltZX06ICR7cmVjLm1lc3NhZ2V9Jyk7CisgIH0pOworCisgIHZhciBwYXJzZXIgPSBuZXcgQXJnUGFyc2VyKCk7CisgIHBhcnNlci5hZGRPcHRpb24oJ3BvcnQnLCBkZWZhdWx0c1RvOiAnOTA5MCcsIGhlbHA6ICdUaGUgcG9ydCB0byBsaXN0ZW4gb24nKTsKKyAgcGFyc2VyLmFkZE9wdGlvbigndHlwZScsCisgICAgICBkZWZhdWx0c1RvOiAnd3MnLAorICAgICAgYWxsb3dlZDogWyd3cycsICd0Y3AnXSwKKyAgICAgIGhlbHA6ICdUaGUgdHlwZSBvZiBzb2NrZXQnLAorICAgICAgYWxsb3dlZEhlbHA6IHsnd3MnOiAnV2ViU29ja2V0JywgJ3RjcCc6ICdUQ1AgU29ja2V0J30pOworCisgIEFyZ1Jlc3VsdHMgcmVzdWx0czsKKyAgdHJ5IHsKKyAgICByZXN1bHRzID0gcGFyc2VyLnBhcnNlKGFyZ3MpOworICB9IGNhdGNoIChlKSB7CisgICAgcmVzdWx0cyA9IG51bGw7CisgIH0KKworICBpZiAocmVzdWx0cyA9PSBudWxsKSB7CisgICAgcHJpbnQocGFyc2VyLnVzYWdlKTsKKyAgICBleGl0KDApOworICB9CisKKyAgaW50IHBvcnQgPSBpbnQucGFyc2UocmVzdWx0c1sncG9ydCddKTsKKyAgU3RyaW5nIHNvY2tldFR5cGUgPSByZXN1bHRzWyd0eXBlJ107CisKKyAgaWYgKHNvY2tldFR5cGUgPT0gJ3RjcCcpIHsKKyAgICBfcnVuVGNwU2VydmVyKHBvcnQpOworICB9IGVsc2UgaWYgKHNvY2tldFR5cGUgPT0gJ3dzJykgeworICAgIF9ydW5XZWJTb2NrZXRTZXJ2ZXIocG9ydCk7CisgIH0KK30KKworRnV0dXJlIF9ydW5XZWJTb2NrZXRTZXJ2ZXIoaW50IHBvcnQpIGFzeW5jIHsKKyAgdmFyIGh0dHBTZXJ2ZXIgPSBhd2FpdCBIdHRwU2VydmVyLmJpbmQoJzEyNy4wLjAuMScsIHBvcnQpOworICBwcmludCgnbGlzdGVuaW5nIGZvciBXZWJTb2NrZXQgY29ubmVjdGlvbnMgb24gJHBvcnQnKTsKKworICBodHRwU2VydmVyLmxpc3RlbigoSHR0cFJlcXVlc3QgcmVxdWVzdCkgYXN5bmMgeworICAgIGlmIChyZXF1ZXN0LnVyaS5wYXRoID09ICcvd3MnKSB7CisgICAgICBfd2ViU29ja2V0ID0gYXdhaXQgV2ViU29ja2V0VHJhbnNmb3JtZXIudXBncmFkZShyZXF1ZXN0KTsKKyAgICAgIGF3YWl0IF9pbml0UHJvY2Vzc29yKG5ldyBUV2ViU29ja2V0KF93ZWJTb2NrZXQpKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnQoJ0ludmFsaWQgcGF0aDogJHtyZXF1ZXN0LnVyaS5wYXRofScpOworICAgIH0KKyAgfSk7Cit9CisKK0Z1dHVyZSBfcnVuVGNwU2VydmVyKGludCBwb3J0KSBhc3luYyB7CisgIHZhciBzZXJ2ZXJTb2NrZXQgPSBhd2FpdCBTZXJ2ZXJTb2NrZXQuYmluZCgnMTI3LjAuMC4xJywgcG9ydCk7CisgIHByaW50KCdsaXN0ZW5pbmcgZm9yIFRDUCBjb25uZWN0aW9ucyBvbiAkcG9ydCcpOworCisgIFNvY2tldCBzb2NrZXQgPSBhd2FpdCBzZXJ2ZXJTb2NrZXQuZmlyc3Q7CisgIGF3YWl0IF9pbml0UHJvY2Vzc29yKG5ldyBUVGNwU29ja2V0KHNvY2tldCkpOworfQorCitGdXR1cmUgX2luaXRQcm9jZXNzb3IoVFNvY2tldCBzb2NrZXQpIGFzeW5jIHsKKyAgVFNlcnZlclNvY2tldFRyYW5zcG9ydCB0cmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldFRyYW5zcG9ydChzb2NrZXQpOworICB0cmFuc3BvcnQub25JbmNvbWluZ01lc3NhZ2UubGlzdGVuKF9wcm9jZXNzTWVzc2FnZSk7CisgIF9wcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvclByb2Nlc3NvcihuZXcgQ2FsY3VsYXRvclNlcnZlcigpKTsKKyAgX3Byb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICBhd2FpdCBfcHJvdG9jb2wudHJhbnNwb3J0Lm9wZW4oKTsKKworICBwcmludCgnY29ubmVjdGVkJyk7Cit9CisKK0Z1dHVyZSBfcHJvY2Vzc01lc3NhZ2UoXykgYXN5bmMgeworICBfcHJvY2Vzc29yLnByb2Nlc3MoX3Byb3RvY29sLCBfcHJvdG9jb2wpOworfQorCitjbGFzcyBDYWxjdWxhdG9yU2VydmVyIGltcGxlbWVudHMgQ2FsY3VsYXRvciB7CisgIGZpbmFsIE1hcDxpbnQsIFNoYXJlZFN0cnVjdD4gX2xvZyA9IHt9OworCisgIEZ1dHVyZSBwaW5nKCkgYXN5bmMgeworICAgIHByaW50KCdwaW5nKCknKTsKKyAgfQorCisgIEZ1dHVyZTxpbnQ+IGFkZChpbnQgbnVtMSwgaW50IG51bTIpIGFzeW5jIHsKKyAgICBwcmludCgnYWRkKCRudW0xLCAkbnVtMiknKTsKKworICAgIHJldHVybiBudW0xICsgbnVtMjsKKyAgfQorCisgIEZ1dHVyZTxpbnQ+IGNhbGN1bGF0ZShpbnQgbG9naWQsIFdvcmsgd29yaykgYXN5bmMgeworICAgIHByaW50KCdjYWx1bGF0ZSgkbG9naWQsICR7d29yay50b1N0cmluZygpfSknKTsKKworICAgIGludCB2YWw7CisKKyAgICBzd2l0Y2ggKHdvcmsub3ApIHsKKyAgICAgIGNhc2UgT3BlcmF0aW9uLkFERDoKKyAgICAgICAgdmFsID0gd29yay5udW0xICsgd29yay5udW0yOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBPcGVyYXRpb24uU1VCVFJBQ1Q6CisgICAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgT3BlcmF0aW9uLk1VTFRJUExZOgorICAgICAgICB2YWwgPSB3b3JrLm51bTEgKiB3b3JrLm51bTI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE9wZXJhdGlvbi5ESVZJREU6CisgICAgICAgIGlmICh3b3JrLm51bTIgPT0gMCkgeworICAgICAgICAgIHZhciB4ID0gbmV3IEludmFsaWRPcGVyYXRpb24oKTsKKyAgICAgICAgICB4LndoYXRPcCA9IHdvcmsub3A7CisgICAgICAgICAgeC53aHkgPSAnQ2Fubm90IGRpdmlkZSBieSAwJzsKKyAgICAgICAgICB0aHJvdyB4OworICAgICAgICB9CisgICAgICAgIHZhbCA9ICh3b3JrLm51bTEgLyB3b3JrLm51bTIpLmZsb29yKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHZhciBsb2cgPSBuZXcgU2hhcmVkU3RydWN0KCk7CisgICAgbG9nLmtleSA9IGxvZ2lkOworICAgIGxvZy52YWx1ZSA9ICckdmFsICIke3dvcmsuY29tbWVudH0iJzsKKyAgICB0aGlzLl9sb2dbbG9naWRdID0gbG9nOworCisgICAgcmV0dXJuIHZhbDsKKyAgfQorCisgIEZ1dHVyZSB6aXAoKSBhc3luYyB7CisgICAgcHJpbnQoJ3ppcCgpJyk7CisgIH0KKworICBGdXR1cmU8U2hhcmVkU3RydWN0PiBnZXRTdHJ1Y3QoaW50IGtleSkgYXN5bmMgeworICAgIHByaW50KCdnZXRTdHJ1Y3QoJGtleSknKTsKKworICAgIHJldHVybiBfbG9nW2tleV07CisgIH0KK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvc2VydmVyL3B1YnNwZWMueWFtbCBiL3R1dG9yaWFsL2RhcnQvc2VydmVyL3B1YnNwZWMueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGQwNzM3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvcHVic3BlYy55YW1sCkBAIC0wLDAgKzEsMzQgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZTogdHV0b3JpYWxfc2VydmVyCit2ZXJzaW9uOiAxLjAuMAorZGVzY3JpcHRpb246IEEgRGFydCBzZXJ2ZXIgdG8gc3VwcG9ydCB0aGUgQXBhY2hlIFRocmlmdCB0dXRvcmlhbAorYXV0aG9yOiBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK2hvbWVwYWdlOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKKworZW52aXJvbm1lbnQ6CisgIHNkazogIj49MS4xMy4wIDwyLjAuMCIKKworZGVwZW5kZW5jaWVzOgorICBhcmdzOiBeMC4xMy4wCisgIHNoYXJlZDoKKyAgICBwYXRoOiAuLi9nZW4tZGFydC9zaGFyZWQKKyAgdGhyaWZ0OgorICAgIHBhdGg6IC4uLy4uLy4uL2xpYi9kYXJ0CisgIHR1dG9yaWFsOgorICAgIHBhdGg6IC4uL2dlbi1kYXJ0L3R1dG9yaWFsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHIgYi90dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRkMGQ0NQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwcgpAQCAtMCwwICsxLDExNCBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKK3Byb2dyYW0gRGVscGhpQ2xpZW50OworCit7JEFQUFRZUEUgQ09OU09MRX0KK3skRCAnQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbid9CisKK3VzZXMKKyAgU3lzVXRpbHMsCisgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAorICBUaHJpZnQgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5wYXMnLAorICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlV0aWxzLnBhcycsCisgIFRocmlmdC5TdHJlYW0gaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5TdHJlYW0ucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKKyAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAorICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCisgIFNoYXJlZCBpbiAnLi5cLi5cZ2VuLWRlbHBoaVxTaGFyZWQucGFzJywKKyAgVHV0b3JpYWwgaW4gJy4uXC4uXGdlbi1kZWxwaGlcVHV0b3JpYWwucGFzJzsKKworCit0eXBlCisgIERlbHBoaVR1dG9yaWFsQ2xpZW50ID0gY2xhc3MKKyAgcHVibGljCisgICAgY2xhc3MgcHJvY2VkdXJlIE1haW47CisgIGVuZDsKKworCisvLy0tLSBEZWxwaGlUdXRvcmlhbENsaWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitjbGFzcyBwcm9jZWR1cmUgRGVscGhpVHV0b3JpYWxDbGllbnQuTWFpbjsKK3ZhciB0cmFuc3BvcnQgOiBJVHJhbnNwb3J0OworICAgIHByb3RvY29sICA6IElQcm90b2NvbDsKKyAgICBjbGllbnQgICAgOiBUQ2FsY3VsYXRvci5JZmFjZTsKKyAgICB3b3JrICAgICAgOiBJV29yazsKKyAgICBzdW0sIHF1b3RpZW50LCBkaWZmIDogSW50ZWdlcjsKKyAgICBsb2cgICAgICAgOiBJU2hhcmVkU3RydWN0OworYmVnaW4KKyAgdHJ5CisgICAgdHJhbnNwb3J0IDo9IFRTb2NrZXRJbXBsLkNyZWF0ZSggJ2xvY2FsaG9zdCcsIDkwOTApOworICAgIHByb3RvY29sICA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLkNyZWF0ZSggdHJhbnNwb3J0KTsKKyAgICBjbGllbnQgICAgOj0gVENhbGN1bGF0b3IuVENsaWVudC5DcmVhdGUoIHByb3RvY29sKTsKKworICAgIHRyYW5zcG9ydC5PcGVuOworCisgICAgY2xpZW50LnBpbmc7CisgICAgV3JpdGVMbigncGluZygpJyk7CisKKyAgICBzdW0gOj0gY2xpZW50LmFkZCggMSwgMSk7CisgICAgV3JpdGVMbiggRm9ybWF0KCAnMSsxPSVkJywgW3N1bV0pKTsKKworICAgIHdvcmsgOj0gVFdvcmtJbXBsLkNyZWF0ZTsKKworICAgIHdvcmsuT3AgICA6PSBUT3BlcmF0aW9uLkRJVklERTsKKyAgICB3b3JrLk51bTEgOj0gMTsKKyAgICB3b3JrLk51bTIgOj0gMDsKKyAgICB0cnkKKyAgICAgIHF1b3RpZW50IDo9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7CisgICAgICBXcml0ZUxuKCAnV2hvYSB3ZSBjYW4gZGl2aWRlIGJ5IDAnKTsKKyAgICAgIFdyaXRlTG4oIEZvcm1hdCgnMS8wPSVkJyxbcXVvdGllbnRdKSk7CisgICAgZXhjZXB0CisgICAgICBvbiBpbzogVEludmFsaWRPcGVyYXRpb24KKyAgICAgIGRvIFdyaXRlTG4oICdJbnZhbGlkIG9wZXJhdGlvbjogJyArIGlvLldoeSk7CisgICAgZW5kOworCisgICAgd29yay5PcCAgIDo9IFRPcGVyYXRpb24uU1VCVFJBQ1Q7CisgICAgd29yay5OdW0xIDo9IDE1OworICAgIHdvcmsuTnVtMiA6PSAxMDsKKyAgICB0cnkKKyAgICAgIGRpZmYgOj0gY2xpZW50LmNhbGN1bGF0ZSggMSwgd29yayk7CisgICAgICBXcml0ZUxuKCBGb3JtYXQoJzE1LTEwPSVkJywgW2RpZmZdKSk7CisgICAgZXhjZXB0CisgICAgICBvbiBpbzogVEludmFsaWRPcGVyYXRpb24KKyAgICAgIGRvIFdyaXRlTG4oICdJbnZhbGlkIG9wZXJhdGlvbjogJyArIGlvLldoeSk7CisgICAgZW5kOworCisgICAgbG9nIDo9IGNsaWVudC5nZXRTdHJ1Y3QoMSk7CisgICAgV3JpdGVMbiggRm9ybWF0KCAnQ2hlY2sgbG9nOiAlcycsIFtsb2cuVmFsdWVdKSk7CisKKyAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKKworICBleGNlcHQKKyAgICBvbiBlIDogRXhjZXB0aW9uCisgICAgZG8gV3JpdGVMbiggZS5DbGFzc05hbWUrJzogJytlLk1lc3NhZ2UpOworICBlbmQ7CitlbmQ7CisKKworYmVnaW4KKyAgdHJ5CisgICAgRGVscGhpVHV0b3JpYWxDbGllbnQuTWFpbjsKKyAgZXhjZXB0CisgICAgb24gRTogRXhjZXB0aW9uIGRvCisgICAgICBXcml0ZWxuKEUuQ2xhc3NOYW1lLCAnOiAnLCBFLk1lc3NhZ2UpOworICBlbmQ7CitlbmQuCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHJvaiBiL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNjc5OTIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHJvagpAQCAtMCwwICsxLDExOSBAQAor77u/CTxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorCQk8UHJvcGVydHlHcm91cD4KKwkJCTxQcm9qZWN0R3VpZD57MkI4RkIzQTEtMkY5RS00ODgzLThDNTMtMEY1NjIyMEIzNEY2fTwvUHJvamVjdEd1aWQ+CisJCQk8TWFpblNvdXJjZT5EZWxwaGlDbGllbnQuZHByPC9NYWluU291cmNlPgorCQkJPFByb2plY3RWZXJzaW9uPjEyLjM8L1Byb2plY3RWZXJzaW9uPgorCQkJPEJhc2lzPlRydWU8L0Jhc2lzPgorCQkJPENvbmZpZyBDb25kaXRpb249IickKENvbmZpZyknPT0nJyI+RGVidWc8L0NvbmZpZz4KKwkJCTxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisJCQk8QXBwVHlwZT5Db25zb2xlPC9BcHBUeXBlPgorCQkJPEZyYW1ld29ya1R5cGU+Tm9uZTwvRnJhbWV3b3JrVHlwZT4KKwkJCTxEQ0NfRENDQ29tcGlsZXI+RENDMzI8L0RDQ19EQ0NDb21waWxlcj4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nQmFzaXMnIG9yICckKEJhc2UpJyE9JyciPgorCQkJPEJhc2U+dHJ1ZTwvQmFzZT4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nRGVidWcnIG9yICckKENmZ18xKSchPScnIj4KKwkJCTxDZmdfMT50cnVlPC9DZmdfMT4KKwkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPEJhc2U+dHJ1ZTwvQmFzZT4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nUmVsZWFzZScgb3IgJyQoQ2ZnXzIpJyE9JyciPgorCQkJPENmZ18yPnRydWU8L0NmZ18yPgorCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQmFzZSknIT0nJyI+CisJCQk8RENDX1VuaXRTZWFyY2hQYXRoPi4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjOyQoRENDX1VuaXRTZWFyY2hQYXRoKTwvRENDX1VuaXRTZWFyY2hQYXRoPgorCQkJPERDQ19JbWFnZUJhc2U+MDA0MDAwMDA8L0RDQ19JbWFnZUJhc2U+CisJCQk8RENDX0RjdU91dHB1dD4uXGRjdVwkKENvbmZpZylcJChQbGF0Zm9ybSk8L0RDQ19EY3VPdXRwdXQ+CisJCQk8RENDX1VuaXRBbGlhcz5XaW5UeXBlcz1XaW5kb3dzO1dpblByb2NzPVdpbmRvd3M7RGJpVHlwZXM9QkRFO0RiaVByb2NzPUJERTskKERDQ19Vbml0QWxpYXMpPC9EQ0NfVW5pdEFsaWFzPgorCQkJPERDQ19FeGVPdXRwdXQ+Li5cYmluXCQoQ29uZmlnKVwkKFBsYXRmb3JtKTwvRENDX0V4ZU91dHB1dD4KKwkJCTxEQ0NfRT5mYWxzZTwvRENDX0U+CisJCQk8RENDX04+ZmFsc2U8L0RDQ19OPgorCQkJPERDQ19TPmZhbHNlPC9EQ0NfUz4KKwkJCTxEQ0NfRj5mYWxzZTwvRENDX0Y+CisJCQk8RENDX0s+ZmFsc2U8L0RDQ19LPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzEpJyE9JyciPgorCQkJPERDQ19EZWZpbmU+REVCVUc7JChEQ0NfRGVmaW5lKTwvRENDX0RlZmluZT4KKwkJCTxEQ0NfT3B0aW1pemU+ZmFsc2U8L0RDQ19PcHRpbWl6ZT4KKwkJCTxEQ0NfR2VuZXJhdGVTdGFja0ZyYW1lcz50cnVlPC9EQ0NfR2VuZXJhdGVTdGFja0ZyYW1lcz4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18yKSchPScnIj4KKwkJCTxEQ0NfTG9jYWxEZWJ1Z1N5bWJvbHM+ZmFsc2U8L0RDQ19Mb2NhbERlYnVnU3ltYm9scz4KKwkJCTxEQ0NfRGVmaW5lPlJFTEVBU0U7JChEQ0NfRGVmaW5lKTwvRENDX0RlZmluZT4KKwkJCTxEQ0NfU3ltYm9sUmVmZXJlbmNlSW5mbz4wPC9EQ0NfU3ltYm9sUmVmZXJlbmNlSW5mbz4KKwkJCTxEQ0NfRGVidWdJbmZvcm1hdGlvbj5mYWxzZTwvRENDX0RlYnVnSW5mb3JtYXRpb24+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPEl0ZW1Hcm91cD4KKwkJCTxEZWxwaGlDb21waWxlIEluY2x1ZGU9IkRlbHBoaUNsaWVudC5kcHIiPgorCQkJCTxNYWluU291cmNlPk1haW5Tb3VyY2U8L01haW5Tb3VyY2U+CisJCQk8L0RlbHBoaUNvbXBpbGU+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVXRpbHMucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5TdHJlYW0ucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlNlcnZlci5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cZ2VuLWRlbHBoaVxTaGFyZWQucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXGdlbi1kZWxwaGlcVHV0b3JpYWwucGFzIi8+CisJCQk8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2UiPgorCQkJCTxLZXk+Q2ZnXzI8L0tleT4KKwkJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTwvQnVpbGRDb25maWd1cmF0aW9uPgorCQkJPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJCYXNpcyI+CisJCQkJPEtleT5CYXNlPC9LZXk+CisJCQk8L0J1aWxkQ29uZmlndXJhdGlvbj4KKwkJCTxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWciPgorCQkJCTxLZXk+Q2ZnXzE8L0tleT4KKwkJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTwvQnVpbGRDb25maWd1cmF0aW9uPgorCQk8L0l0ZW1Hcm91cD4KKwkJPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChCRFMpXEJpblxDb2RlR2Vhci5EZWxwaGkuVGFyZ2V0cycpIiBQcm9qZWN0PSIkKEJEUylcQmluXENvZGVHZWFyLkRlbHBoaS5UYXJnZXRzIi8+CisJCTxJbXBvcnQgQ29uZGl0aW9uPSJFeGlzdHMoJyQoQVBQREFUQSlcRW1iYXJjYWRlcm9cJChCRFNBUFBEQVRBQkFTRURJUilcJChQUk9EVUNUVkVSU0lPTilcVXNlclRvb2xzLnByb2onKSIgUHJvamVjdD0iJChBUFBEQVRBKVxFbWJhcmNhZGVyb1wkKEJEU0FQUERBVEFCQVNFRElSKVwkKFBST0RVQ1RWRVJTSU9OKVxVc2VyVG9vbHMucHJvaiIvPgorCQk8UHJvamVjdEV4dGVuc2lvbnM+CisJCQk8Qm9ybGFuZC5QZXJzb25hbGl0eT5EZWxwaGkuUGVyc29uYWxpdHkuMTI8L0JvcmxhbmQuUGVyc29uYWxpdHk+CisJCQk8Qm9ybGFuZC5Qcm9qZWN0VHlwZS8+CisJCQk8Qm9ybGFuZFByb2plY3Q+CisJCQkJPERlbHBoaS5QZXJzb25hbGl0eT4KKwkJCQkJPFZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkluY2x1ZGVWZXJJbmZvIj5UcnVlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJBdXRvSW5jQnVpbGQiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJNYWpvclZlciI+MDwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iTWlub3JWZXIiPjEyPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJSZWxlYXNlIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJCdWlsZCI+MDwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iRGVidWciPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJQcmVSZWxlYXNlIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iU3BlY2lhbCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlByaXZhdGUiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJETEwiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJMb2NhbGUiPjEwMzM8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkNvZGVQYWdlIj4xMjUyPC9WZXJzaW9uSW5mbz4KKwkJCQkJPC9WZXJzaW9uSW5mbz4KKwkJCQkJPFZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tcGFueU5hbWUiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZURlc2NyaXB0aW9uIj5UaHJpZnQgVHV0b3JpYWw8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZVZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iSW50ZXJuYWxOYW1lIj5EZWxwaGlDbGllbnQ8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxDb3B5cmlnaHQiPkNvcHlyaWdodCDCqSAyMDEyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJMZWdhbFRyYWRlbWFya3MiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iT3JpZ2luYWxGaWxlbmFtZSI+RGVscGhpQ2xpZW50LmV4ZTwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJQcm9kdWN0TmFtZSI+VGhyaWZ0PC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3RWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbW1lbnRzIi8+CisJCQkJCTwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQk8U291cmNlPgorCQkJCQkJPFNvdXJjZSBOYW1lPSJNYWluU291cmNlIj5EZWxwaGlDbGllbnQuZHByPC9Tb3VyY2U+CisJCQkJCTwvU291cmNlPgorCQkJCTwvRGVscGhpLlBlcnNvbmFsaXR5PgorCQkJCTxQbGF0Zm9ybXM+CisJCQkJCTxQbGF0Zm9ybSB2YWx1ZT0iV2luMzIiPlRydWU8L1BsYXRmb3JtPgorCQkJCTwvUGxhdGZvcm1zPgorCQkJPC9Cb3JsYW5kUHJvamVjdD4KKwkJCTxQcm9qZWN0RmlsZVZlcnNpb24+MTI8L1Byb2plY3RGaWxlVmVyc2lvbj4KKwkJPC9Qcm9qZWN0RXh0ZW5zaW9ucz4KKwk8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHIgYi90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY0MmU3ZQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvRGVscGhpU2VydmVyLmRwcgpAQCAtMCwwICsxLDE3MyBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKK3Byb2dyYW0gRGVscGhpU2VydmVyOworCit7JEFQUFRZUEUgQ09OU09MRX0KK3skRCAnQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbid9CisKK3skUSt9ICAgICAvLyB0aHJvd3MgZXhjZXB0aW9ucyBvbiBudW1lcmljIG92ZXJmbG93cworCit1c2VzCisgIFN5c1V0aWxzLAorICBHZW5lcmljcy5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0IGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQucGFzJywKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAorICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5VdGlscy5wYXMnLAorICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU3RyZWFtLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcycsCisgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKKyAgVGhyaWZ0LlRyYW5zcG9ydCBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAorICBTaGFyZWQgaW4gJy4uXC4uXGdlbi1kZWxwaGlcU2hhcmVkLnBhcycsCisgIFR1dG9yaWFsIGluICcuLlwuLlxnZW4tZGVscGhpXFR1dG9yaWFsLnBhcyc7CisKKwordHlwZQorICBUQ2FsY3VsYXRvckhhbmRsZXIgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIFRDYWxjdWxhdG9yLklmYWNlKQorICBwcm90ZWN0ZWQKKyAgICBGTG9nIDogVERpY3Rpb25hcnk8IEludGVnZXIsIElTaGFyZWRTdHJ1Y3Q+OworCisgICAgLy8gVFNoYXJlZFNlcnZpY2UuSWZhY2UKKyAgICBmdW5jdGlvbiAgZ2V0U3RydWN0KGtleTogSW50ZWdlcik6IElTaGFyZWRTdHJ1Y3Q7CisKKyAgICAvLyBUQ2FsY3VsYXRvci5JZmFjZQorICAgIHByb2NlZHVyZSBwaW5nKCk7CisgICAgZnVuY3Rpb24gIGFkZChudW0xOiBJbnRlZ2VyOyBudW0yOiBJbnRlZ2VyKTogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiAgY2FsY3VsYXRlKGxvZ2lkOiBJbnRlZ2VyOyBjb25zdCB3OiBJV29yayk6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIHppcCgpOworCisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKworICBlbmQ7CisKKyAgRGVscGhpVHV0b3JpYWxTZXJ2ZXIgPSBjbGFzcworICBwdWJsaWMKKyAgICBjbGFzcyBwcm9jZWR1cmUgTWFpbjsKKyAgZW5kOworCisKKy8vLS0tIFRDYWxjdWxhdG9ySGFuZGxlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitjb25zdHJ1Y3RvciBUQ2FsY3VsYXRvckhhbmRsZXIuQ3JlYXRlOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRkxvZyA6PSBURGljdGlvbmFyeTwgSW50ZWdlciwgSVNoYXJlZFN0cnVjdD4uQ3JlYXRlKCk7CitlbmQ7CisKKworZGVzdHJ1Y3RvciBUQ2FsY3VsYXRvckhhbmRsZXIuRGVzdHJveTsKK2JlZ2luCisgIHRyeQorICAgIEZyZWVBbmROaWwoIEZMb2cpOworICBmaW5hbGx5CisgICAgaW5oZXJpdGVkIERlc3Ryb3k7CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVENhbGN1bGF0b3JIYW5kbGVyLnBpbmc7CitiZWdpbgorICBXcml0ZUxuKCAncGluZygpJyk7CitlbmQ7CisKKworZnVuY3Rpb24gVENhbGN1bGF0b3JIYW5kbGVyLmFkZChudW0xOiBJbnRlZ2VyOyBudW0yOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIFdyaXRlTG4oIEZvcm1hdCggJ2FkZCggJWQsICVkKScsIFtudW0xLCBudW0yXSkpOworICByZXN1bHQgOj0gbnVtMSArIG51bTI7CitlbmQ7CisKKworZnVuY3Rpb24gVENhbGN1bGF0b3JIYW5kbGVyLmNhbGN1bGF0ZShsb2dpZDogSW50ZWdlcjsgY29uc3QgdzogSVdvcmspOiBJbnRlZ2VyOwordmFyIGVudHJ5IDogSVNoYXJlZFN0cnVjdDsKK2JlZ2luCisgIHRyeQorICAgIFdyaXRlTG4oIEZvcm1hdCgnY2FsY3VsYXRlKCAlZCwgWyVkLCVkLCVkXSknLCBbbG9naWQsIE9yZCh3Lk9wKSwgdy5OdW0xLCB3Lk51bTJdKSk7CisKKyAgICBjYXNlIHcuT3Agb2YKKyAgICAgIFRPcGVyYXRpb24uQUREICAgICAgOiAgcmVzdWx0IDo9IHcuTnVtMSArIHcuTnVtMjsKKyAgICAgIFRPcGVyYXRpb24uU1VCVFJBQ1QgOiAgcmVzdWx0IDo9IHcuTnVtMSAtIHcuTnVtMjsKKyAgICAgIFRPcGVyYXRpb24uTVVMVElQTFkgOiAgcmVzdWx0IDo9IHcuTnVtMSAqIHcuTnVtMjsKKyAgICAgIFRPcGVyYXRpb24uRElWSURFICAgOiAgcmVzdWx0IDo9IFJvdW5kKCB3Lk51bTEgLyB3Lk51bTIpOworICAgIGVsc2UKKyAgICAgIHJhaXNlIFRJbnZhbGlkT3BlcmF0aW9uLkNyZWF0ZSggT3JkKHcuT3ApLCAnVW5rbm93biBvcGVyYXRpb24nKTsKKyAgICBlbmQ7CisKKyAgZXhjZXB0CisgICAgb24gZTpUaHJpZnQuVEV4Y2VwdGlvbiBkbyByYWlzZTsgIC8vIGxldCBUaHJpZnQgRXhjZXB0aW9ucyBwYXNzIHRocm91Z2gKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyByYWlzZSBUSW52YWxpZE9wZXJhdGlvbi5DcmVhdGUoIE9yZCh3Lk9wKSwgZS5NZXNzYWdlKTsgIC8vIHJlcGFja2FnZSBhbGwgb3RoZXIKKyAgZW5kOworCisgIGVudHJ5IDo9IFRTaGFyZWRTdHJ1Y3RJbXBsLkNyZWF0ZTsKKyAgZW50cnkuS2V5ICAgOj0gbG9naWQ7CisgIGVudHJ5LlZhbHVlIDo9IEludFRvU3RyKCByZXN1bHQpOworICBGTG9nLkFkZE9yU2V0VmFsdWUoIGxvZ2lkLCBlbnRyeSk7CitlbmQ7CisKKworZnVuY3Rpb24gVENhbGN1bGF0b3JIYW5kbGVyLmdldFN0cnVjdChrZXk6IEludGVnZXIpOiBJU2hhcmVkU3RydWN0OworYmVnaW4KKyAgV3JpdGVMbiggRm9ybWF0KCAnZ2V0U3RydWN0KCVkKScsIFtrZXldKSk7CisgIHJlc3VsdCA6PSBGTG9nW2tleV07CitlbmQ7CisKKworcHJvY2VkdXJlIFRDYWxjdWxhdG9ySGFuZGxlci56aXA7CitiZWdpbgorICBXcml0ZUxuKCAnemlwKCknKTsKK2VuZDsKKworCisvLy0tLSBEZWxwaGlUdXRvcmlhbFNlcnZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworY2xhc3MgcHJvY2VkdXJlIERlbHBoaVR1dG9yaWFsU2VydmVyLk1haW47Cit2YXIgaGFuZGxlciAgIDogVENhbGN1bGF0b3IuSWZhY2U7CisgICAgcHJvY2Vzc29yIDogSVByb2Nlc3NvcjsKKyAgICB0cmFuc3BvcnQgOiBJU2VydmVyVHJhbnNwb3J0OworICAgIHNlcnZlciAgICA6IElTZXJ2ZXI7CitiZWdpbgorICB0cnkKKyAgICBoYW5kbGVyICAgOj0gVENhbGN1bGF0b3JIYW5kbGVyLkNyZWF0ZTsKKyAgICBwcm9jZXNzb3IgOj0gVENhbGN1bGF0b3IuVFByb2Nlc3NvckltcGwuQ3JlYXRlKCBoYW5kbGVyKTsKKyAgICB0cmFuc3BvcnQgOj0gVFNlcnZlclNvY2tldEltcGwuQ3JlYXRlKCA5MDkwKTsKKyAgICBzZXJ2ZXIgICAgOj0gVFNpbXBsZVNlcnZlci5DcmVhdGUoIHByb2Nlc3NvciwgdHJhbnNwb3J0KTsKKworICAgIFdyaXRlTG4oICdTdGFydGluZyB0aGUgc2VydmVyLi4uJyk7CisgICAgc2VydmVyLlNlcnZlKCk7CisKKyAgZXhjZXB0CisgICAgb24gZTogRXhjZXB0aW9uIGRvIFdyaXRlTG4oIGUuTWVzc2FnZSk7CisgIGVuZDsKKworICBXcml0ZUxuKCdkb25lLicpOworZW5kOworCisKK2JlZ2luCisgIHRyeQorICAgIERlbHBoaVR1dG9yaWFsU2VydmVyLk1haW47CisgIGV4Y2VwdAorICAgIG9uIEU6IEV4Y2VwdGlvbiBkbworICAgICAgV3JpdGVsbihFLkNsYXNzTmFtZSwgJzogJywgRS5NZXNzYWdlKTsKKyAgZW5kOworZW5kLgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByb2ogYi90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzRhNmExCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByb2oKQEAgLTAsMCArMSwxMTggQEAKK++7vwk8UHJvamVjdCB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKwkJPFByb3BlcnR5R3JvdXA+CisJCQk8UHJvamVjdEd1aWQ+ezJCOEZCM0ExLTJGOUUtNDg4My04QzUzLTBGNTYyMjBCMzRGNn08L1Byb2plY3RHdWlkPgorCQkJPE1haW5Tb3VyY2U+RGVscGhpU2VydmVyLmRwcjwvTWFpblNvdXJjZT4KKwkJCTxQcm9qZWN0VmVyc2lvbj4xMi4zPC9Qcm9qZWN0VmVyc2lvbj4KKwkJCTxCYXNpcz5UcnVlPC9CYXNpcz4KKwkJCTxDb25maWcgQ29uZGl0aW9uPSInJChDb25maWcpJz09JyciPkRlYnVnPC9Db25maWc+CisJCQk8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorCQkJPEFwcFR5cGU+Q29uc29sZTwvQXBwVHlwZT4KKwkJCTxGcmFtZXdvcmtUeXBlPk5vbmU8L0ZyYW1ld29ya1R5cGU+CisJCQk8RENDX0RDQ0NvbXBpbGVyPkRDQzMyPC9EQ0NfRENDQ29tcGlsZXI+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0Jhc2lzJyBvciAnJChCYXNlKSchPScnIj4KKwkJCTxCYXNlPnRydWU8L0Jhc2U+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0RlYnVnJyBvciAnJChDZmdfMSknIT0nJyI+CisJCQk8Q2ZnXzE+dHJ1ZTwvQ2ZnXzE+CisJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTxCYXNlPnRydWU8L0Jhc2U+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J1JlbGVhc2UnIG9yICckKENmZ18yKSchPScnIj4KKwkJCTxDZmdfMj50cnVlPC9DZmdfMj4KKwkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPEJhc2U+dHJ1ZTwvQmFzZT4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKEJhc2UpJyE9JyciPgorCQkJPERDQ19JbWFnZUJhc2U+MDA0MDAwMDA8L0RDQ19JbWFnZUJhc2U+CisJCQk8RENDX0RjdU91dHB1dD4uXGRjdVwkKENvbmZpZylcJChQbGF0Zm9ybSk8L0RDQ19EY3VPdXRwdXQ+CisJCQk8RENDX1VuaXRBbGlhcz5XaW5UeXBlcz1XaW5kb3dzO1dpblByb2NzPVdpbmRvd3M7RGJpVHlwZXM9QkRFO0RiaVByb2NzPUJERTskKERDQ19Vbml0QWxpYXMpPC9EQ0NfVW5pdEFsaWFzPgorCQkJPERDQ19FeGVPdXRwdXQ+Li5cYmluXCQoQ29uZmlnKVwkKFBsYXRmb3JtKTwvRENDX0V4ZU91dHB1dD4KKwkJCTxEQ0NfRT5mYWxzZTwvRENDX0U+CisJCQk8RENDX04+ZmFsc2U8L0RDQ19OPgorCQkJPERDQ19TPmZhbHNlPC9EQ0NfUz4KKwkJCTxEQ0NfRj5mYWxzZTwvRENDX0Y+CisJCQk8RENDX0s+ZmFsc2U8L0RDQ19LPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzEpJyE9JyciPgorCQkJPERDQ19EZWZpbmU+REVCVUc7JChEQ0NfRGVmaW5lKTwvRENDX0RlZmluZT4KKwkJCTxEQ0NfT3B0aW1pemU+ZmFsc2U8L0RDQ19PcHRpbWl6ZT4KKwkJCTxEQ0NfR2VuZXJhdGVTdGFja0ZyYW1lcz50cnVlPC9EQ0NfR2VuZXJhdGVTdGFja0ZyYW1lcz4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18yKSchPScnIj4KKwkJCTxEQ0NfTG9jYWxEZWJ1Z1N5bWJvbHM+ZmFsc2U8L0RDQ19Mb2NhbERlYnVnU3ltYm9scz4KKwkJCTxEQ0NfRGVmaW5lPlJFTEVBU0U7JChEQ0NfRGVmaW5lKTwvRENDX0RlZmluZT4KKwkJCTxEQ0NfU3ltYm9sUmVmZXJlbmNlSW5mbz4wPC9EQ0NfU3ltYm9sUmVmZXJlbmNlSW5mbz4KKwkJCTxEQ0NfRGVidWdJbmZvcm1hdGlvbj5mYWxzZTwvRENDX0RlYnVnSW5mb3JtYXRpb24+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPEl0ZW1Hcm91cD4KKwkJCTxEZWxwaGlDb21waWxlIEluY2x1ZGU9IkRlbHBoaVNlcnZlci5kcHIiPgorCQkJCTxNYWluU291cmNlPk1haW5Tb3VyY2U8L01haW5Tb3VyY2U+CisJCQk8L0RlbHBoaUNvbXBpbGU+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVXRpbHMucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5TdHJlYW0ucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlNlcnZlci5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cZ2VuLWRlbHBoaVxTaGFyZWQucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXGdlbi1kZWxwaGlcVHV0b3JpYWwucGFzIi8+CisJCQk8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2UiPgorCQkJCTxLZXk+Q2ZnXzI8L0tleT4KKwkJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTwvQnVpbGRDb25maWd1cmF0aW9uPgorCQkJPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJCYXNpcyI+CisJCQkJPEtleT5CYXNlPC9LZXk+CisJCQk8L0J1aWxkQ29uZmlndXJhdGlvbj4KKwkJCTxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWciPgorCQkJCTxLZXk+Q2ZnXzE8L0tleT4KKwkJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTwvQnVpbGRDb25maWd1cmF0aW9uPgorCQk8L0l0ZW1Hcm91cD4KKwkJPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChCRFMpXEJpblxDb2RlR2Vhci5EZWxwaGkuVGFyZ2V0cycpIiBQcm9qZWN0PSIkKEJEUylcQmluXENvZGVHZWFyLkRlbHBoaS5UYXJnZXRzIi8+CisJCTxJbXBvcnQgQ29uZGl0aW9uPSJFeGlzdHMoJyQoQVBQREFUQSlcRW1iYXJjYWRlcm9cJChCRFNBUFBEQVRBQkFTRURJUilcJChQUk9EVUNUVkVSU0lPTilcVXNlclRvb2xzLnByb2onKSIgUHJvamVjdD0iJChBUFBEQVRBKVxFbWJhcmNhZGVyb1wkKEJEU0FQUERBVEFCQVNFRElSKVwkKFBST0RVQ1RWRVJTSU9OKVxVc2VyVG9vbHMucHJvaiIvPgorCQk8UHJvamVjdEV4dGVuc2lvbnM+CisJCQk8Qm9ybGFuZC5QZXJzb25hbGl0eT5EZWxwaGkuUGVyc29uYWxpdHkuMTI8L0JvcmxhbmQuUGVyc29uYWxpdHk+CisJCQk8Qm9ybGFuZC5Qcm9qZWN0VHlwZS8+CisJCQk8Qm9ybGFuZFByb2plY3Q+CisJCQkJPERlbHBoaS5QZXJzb25hbGl0eT4KKwkJCQkJPFZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkluY2x1ZGVWZXJJbmZvIj5UcnVlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJBdXRvSW5jQnVpbGQiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJNYWpvclZlciI+MDwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iTWlub3JWZXIiPjEyPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJSZWxlYXNlIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJCdWlsZCI+MDwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iRGVidWciPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJQcmVSZWxlYXNlIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iU3BlY2lhbCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlByaXZhdGUiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJETEwiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJMb2NhbGUiPjEwMzM8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkNvZGVQYWdlIj4xMjUyPC9WZXJzaW9uSW5mbz4KKwkJCQkJPC9WZXJzaW9uSW5mbz4KKwkJCQkJPFZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tcGFueU5hbWUiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZURlc2NyaXB0aW9uIj5UaHJpZnQgVHV0b3JpYWw8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZVZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iSW50ZXJuYWxOYW1lIj5EZWxwaGlTZXJ2ZXI8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxDb3B5cmlnaHQiPkNvcHlyaWdodCDCqSAyMDEyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJMZWdhbFRyYWRlbWFya3MiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iT3JpZ2luYWxGaWxlbmFtZSI+RGVscGhpU2VydmVyLmV4ZTwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJQcm9kdWN0TmFtZSI+VGhyaWZ0PC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3RWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbW1lbnRzIi8+CisJCQkJCTwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQk8U291cmNlPgorCQkJCQkJPFNvdXJjZSBOYW1lPSJNYWluU291cmNlIj5EZWxwaGlTZXJ2ZXIuZHByPC9Tb3VyY2U+CisJCQkJCTwvU291cmNlPgorCQkJCTwvRGVscGhpLlBlcnNvbmFsaXR5PgorCQkJCTxQbGF0Zm9ybXM+CisJCQkJCTxQbGF0Zm9ybSB2YWx1ZT0iV2luMzIiPlRydWU8L1BsYXRmb3JtPgorCQkJCTwvUGxhdGZvcm1zPgorCQkJPC9Cb3JsYW5kUHJvamVjdD4KKwkJCTxQcm9qZWN0RmlsZVZlcnNpb24+MTI8L1Byb2plY3RGaWxlVmVyc2lvbj4KKwkJPC9Qcm9qZWN0RXh0ZW5zaW9ucz4KKwk8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS90dXRvcmlhbC9kZWxwaGkvVHV0b3JpYWwuZ3JvdXBwcm9qIGIvdHV0b3JpYWwvZGVscGhpL1R1dG9yaWFsLmdyb3VwcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTJhMjM3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGVscGhpL1R1dG9yaWFsLmdyb3VwcHJvagpAQCAtMCwwICsxLDQ4IEBACivvu78gICAgPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgICAgICAgIDxQcm9wZXJ0eUdyb3VwPgorICAgICAgICAgICAgPFByb2plY3RHdWlkPnszRDA0MkM3Ri0zRUYyLTQ1NzQtODMwNC1BQjdGQjc5RjgxNEN9PC9Qcm9qZWN0R3VpZD4KKyAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgorICAgICAgICA8SXRlbUdyb3VwPgorICAgICAgICAgICAgPFByb2plY3RzIEluY2x1ZGU9IkRlbHBoaVNlcnZlclxEZWxwaGlTZXJ2ZXIuZHByb2oiPgorICAgICAgICAgICAgICAgIDxEZXBlbmRlbmNpZXMvPgorICAgICAgICAgICAgPC9Qcm9qZWN0cz4KKyAgICAgICAgICAgIDxQcm9qZWN0cyBJbmNsdWRlPSJEZWxwaGlDbGllbnRcRGVscGhpQ2xpZW50LmRwcm9qIj4KKyAgICAgICAgICAgICAgICA8RGVwZW5kZW5jaWVzLz4KKyAgICAgICAgICAgIDwvUHJvamVjdHM+CisgICAgICAgIDwvSXRlbUdyb3VwPgorICAgICAgICA8UHJvamVjdEV4dGVuc2lvbnM+CisgICAgICAgICAgICA8Qm9ybGFuZC5QZXJzb25hbGl0eT5EZWZhdWx0LlBlcnNvbmFsaXR5LjEyPC9Cb3JsYW5kLlBlcnNvbmFsaXR5PgorICAgICAgICAgICAgPEJvcmxhbmQuUHJvamVjdFR5cGUvPgorICAgICAgICAgICAgPEJvcmxhbmRQcm9qZWN0PgorICAgICAgICAgICAgICAgIDxEZWZhdWx0LlBlcnNvbmFsaXR5Lz4KKyAgICAgICAgICAgIDwvQm9ybGFuZFByb2plY3Q+CisgICAgICAgIDwvUHJvamVjdEV4dGVuc2lvbnM+CisgICAgICAgIDxUYXJnZXQgTmFtZT0iRGVscGhpU2VydmVyIj4KKyAgICAgICAgICAgIDxNU0J1aWxkIFByb2plY3RzPSJEZWxwaGlTZXJ2ZXJcRGVscGhpU2VydmVyLmRwcm9qIi8+CisgICAgICAgIDwvVGFyZ2V0PgorICAgICAgICA8VGFyZ2V0IE5hbWU9IkRlbHBoaVNlcnZlcjpDbGVhbiI+CisgICAgICAgICAgICA8TVNCdWlsZCBQcm9qZWN0cz0iRGVscGhpU2VydmVyXERlbHBoaVNlcnZlci5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKyAgICAgICAgPC9UYXJnZXQ+CisgICAgICAgIDxUYXJnZXQgTmFtZT0iRGVscGhpU2VydmVyOk1ha2UiPgorICAgICAgICAgICAgPE1TQnVpbGQgUHJvamVjdHM9IkRlbHBoaVNlcnZlclxEZWxwaGlTZXJ2ZXIuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKyAgICAgICAgPC9UYXJnZXQ+CisgICAgICAgIDxUYXJnZXQgTmFtZT0iRGVscGhpQ2xpZW50Ij4KKyAgICAgICAgICAgIDxNU0J1aWxkIFByb2plY3RzPSJEZWxwaGlDbGllbnRcRGVscGhpQ2xpZW50LmRwcm9qIi8+CisgICAgICAgIDwvVGFyZ2V0PgorICAgICAgICA8VGFyZ2V0IE5hbWU9IkRlbHBoaUNsaWVudDpDbGVhbiI+CisgICAgICAgICAgICA8TVNCdWlsZCBQcm9qZWN0cz0iRGVscGhpQ2xpZW50XERlbHBoaUNsaWVudC5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKyAgICAgICAgPC9UYXJnZXQ+CisgICAgICAgIDxUYXJnZXQgTmFtZT0iRGVscGhpQ2xpZW50Ok1ha2UiPgorICAgICAgICAgICAgPE1TQnVpbGQgUHJvamVjdHM9IkRlbHBoaUNsaWVudFxEZWxwaGlDbGllbnQuZHByb2oiIFRhcmdldHM9Ik1ha2UiLz4KKyAgICAgICAgPC9UYXJnZXQ+CisgICAgICAgIDxUYXJnZXQgTmFtZT0iQnVpbGQiPgorICAgICAgICAgICAgPENhbGxUYXJnZXQgVGFyZ2V0cz0iRGVscGhpU2VydmVyO0RlbHBoaUNsaWVudCIvPgorICAgICAgICA8L1RhcmdldD4KKyAgICAgICAgPFRhcmdldCBOYW1lPSJDbGVhbiI+CisgICAgICAgICAgICA8Q2FsbFRhcmdldCBUYXJnZXRzPSJEZWxwaGlTZXJ2ZXI6Q2xlYW47RGVscGhpQ2xpZW50OkNsZWFuIi8+CisgICAgICAgIDwvVGFyZ2V0PgorICAgICAgICA8VGFyZ2V0IE5hbWU9Ik1ha2UiPgorICAgICAgICAgICAgPENhbGxUYXJnZXQgVGFyZ2V0cz0iRGVscGhpU2VydmVyOk1ha2U7RGVscGhpQ2xpZW50Ok1ha2UiLz4KKyAgICAgICAgPC9UYXJnZXQ+CisgICAgICAgIDxJbXBvcnQgQ29uZGl0aW9uPSJFeGlzdHMoJyQoQkRTKVxCaW5cQ29kZUdlYXIuR3JvdXAuVGFyZ2V0cycpIiBQcm9qZWN0PSIkKEJEUylcQmluXENvZGVHZWFyLkdyb3VwLlRhcmdldHMiLz4KKyAgICA8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS90dXRvcmlhbC9lcmwvUkVBRE1FIGIvdHV0b3JpYWwvZXJsL1JFQURNRS5tZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdHV0b3JpYWwvZXJsL1JFQURNRQpyZW5hbWUgdG8gdHV0b3JpYWwvZXJsL1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZXJsL2NsaWVudC5lcmwgYi90dXRvcmlhbC9lcmwvY2xpZW50LmVybAppbmRleCA1ZDQwOTE2Li4wMzc0MjIwIDEwMDY0NAotLS0gYS90dXRvcmlhbC9lcmwvY2xpZW50LmVybAorKysgYi90dXRvcmlhbC9lcmwvY2xpZW50LmVybApAQCAtMjgsNyArMjgsNyBAQAogICAgIG9rLgogCiB0KCkgLT4KLSAgICBQb3J0ID0gOTk5OSwKKyAgICBQb3J0ID0gOTA5MCwKIAogICAgIHtvaywgQ2xpZW50MH0gPSB0aHJpZnRfY2xpZW50X3V0aWw6bmV3KCIxMjcuMC4wLjEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnQsCkBAIC00NCw3ICs0NCw3IEBACiAgICAge0NsaWVudDMsIHtvaywgU3VtMX19ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDIsIGFkZCwgWzEsIDRdKSwKICAgICBpbzpmb3JtYXQoIjErND1+cH5uIiwgW1N1bTFdKSwKIAotICAgIFdvcmsgPSAjd29ya3tvcD0/dHV0b3JpYWxfT3BlcmF0aW9uX1NVQlRSQUNULAorICAgIFdvcmsgPSAjJ1dvcmsne29wPT9UVVRPUklBTF9PUEVSQVRJT05fU1VCVFJBQ1QsCiAgICAgICAgICAgICAgICAgIG51bTE9MTUsCiAgICAgICAgICAgICAgICAgIG51bTI9MTB9LAogICAgIHtDbGllbnQ0LCB7b2ssIERpZmZ9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQzLCBjYWxjdWxhdGUsIFsxLCBXb3JrXSksCkBAIC01NSw3ICs1NSw3IEBACiAKICAgICBDbGllbnQ2ID0KICAgICAgICAgdHJ5Ci0gICAgICAgICAgICBXb3JrMSA9ICN3b3Jre29wPT90dXRvcmlhbF9PcGVyYXRpb25fRElWSURFLAorICAgICAgICAgICAgV29yazEgPSAjJ1dvcmsne29wPT9UVVRPUklBTF9PUEVSQVRJT05fRElWSURFLAogICAgICAgICAgICAgICAgICAgICAgICAgICBudW0xPTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bTI9MH0sCiAgICAgICAgICAgICB7Q2xpZW50UzEsIHtvaywgX1F1b3R9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQ1LCBjYWxjdWxhdGUsIFsyLCBXb3JrMV0pLApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZXJsL2NsaWVudC5zaCBiL3R1dG9yaWFsL2VybC9jbGllbnQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IGE0MTdlMGQuLjAwMDAwMDAKLS0tIGEvdHV0b3JpYWwvZXJsL2NsaWVudC5zaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXNlcnZlci5zaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2VybC9jbGllbnQuc2ggYi90dXRvcmlhbC9lcmwvY2xpZW50LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc3NWFmYjYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9lcmwvY2xpZW50LnNoCkBAIC0wLDAgKzEsMzcgQEAKKyMhL2Jpbi9zaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworRVJMX1RIUklGVD0uLi8uLi9saWIvZXJsCisKK2lmICEgWyAtZCAke0VSTF9USFJJRlR9L2ViaW4gXTsgdGhlbgorICAgIGVjaG8gIlBsZWFzZSBidWlsZCB0aGUgVGhyaWZ0IGxpYnJhcnkgYnkgcnVubmluZyBcYG1ha2UnIGluICR7RVJMX1RIUklGVH0iCisgICAgZXhpdCAxCitmaQorCitpZiAhIFsgLWQgZ2VuLWVybCBdOyB0aGVuCisgIC4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLXIgLS1nZW4gZXJsIC4uL3R1dG9yaWFsLnRocmlmdAorZmkKKworCitlcmxjIC1JICR7RVJMX1RIUklGVH0vaW5jbHVkZSAtSSAke0VSTF9USFJJRlR9L2ViaW4gXAorICAgICAtSSBnZW4tZXJsIC1vIGdlbi1lcmwgZ2VuLWVybC8qLmVybCAmJgorICBlcmxjIC1JICR7RVJMX1RIUklGVH0vaW5jbHVkZSAtSSBnZW4tZXJsICouZXJsICYmCisgIGVybCArSyB0cnVlIC1wYSAke0VSTF9USFJJRlR9L2ViaW4gLXBhIGdlbi1lcmwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2VybC9qc29uX2NsaWVudC5lcmwgYi90dXRvcmlhbC9lcmwvanNvbl9jbGllbnQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMzljZWQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9lcmwvanNvbl9jbGllbnQuZXJsCkBAIC0wLDAgKzEsODkgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorJSUgVGhlIEpTT04gcHJvdG9jb2wgb3ZlciBIVFRQIGltcGxlbWVudGF0aW9uIHdhcyBjcmVhdGVkIGJ5CislJSBQZXRlciBOZXVtYXJrIDxuZXVtYXJrLnBldGVyQGdtYWlsLmNvbT4gYmFzZWQgb24KKyUlIHRoZSBiaW5hcnkgcHJvdG9jb2wgKyBzb2NrZXQgdHV0b3JpYWwuIFVzZSB3aXRoIHRoZSBzYW1lIHNlcnZlcgorJSUgdGhhdCB0aGUgSmF2YXNjcmlwdCB0dXRvcmlhbCB1c2VzIQorCistbW9kdWxlKGpzb25fY2xpZW50KS4KKworLWluY2x1ZGUoImNhbGN1bGF0b3JfdGhyaWZ0LmhybCIpLgorCistZXhwb3J0KFt0LzBdKS4KKworJSUgQ2xpZW50IGNvbnN0cnVjdG9yIGZvciB0aGUgaHR0cCB0cmFuc3BvcnRzCislJSB3aXRoIHRoZSBqc29uIHByb3RvY29sCituZXdfY2xpZW50KEhvc3QsIFBhdGgsIFNlcnZpY2UsIF9PcHRpb25zKSAtPgorICAgIHtQcm90b09wdHMsIFRyYW5zT3B0c30gPSB7W10sW119LAorICAgIFRyYW5zcG9ydEZhY3RvcnkgPSBmdW4oKSAtPiB0aHJpZnRfaHR0cF90cmFuc3BvcnQ6bmV3KEhvc3QsIFBhdGgsIFRyYW5zT3B0cykgZW5kLAorICAgIHtvaywgUHJvdG9jb2xGYWN0b3J5fSA9IHRocmlmdF9qc29uX3Byb3RvY29sOm5ld19wcm90b2NvbF9mYWN0b3J5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0RmFjdG9yeSwgUHJvdG9PcHRzKSwKKyAgICB7b2ssIFByb3RvY29sfSA9IFByb3RvY29sRmFjdG9yeSgpLAorICAgIHRocmlmdF9jbGllbnQ6bmV3KFByb3RvY29sLCBTZXJ2aWNlKS4KKworcChYKSAtPgorICAgIGlvOmZvcm1hdCgifnB+biIsIFtYXSksCisgICAgb2suCisKK3QoKSAtPgorICAgIGluZXRzOnN0YXJ0KCksCisgICAge29rLCBDbGllbnQwfSA9IG5ld19jbGllbnQoIjEyNy4wLjAuMTo4MDg4IiwgIi90aHJpZnQvc2VydmljZS90dXRvcmlhbC8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0b3JfdGhyaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKSwKKyAgICB7Q2xpZW50MSwge29rLCBva319ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAsIHBpbmcsIFtdKSwKKyAgICBpbzpmb3JtYXQoInBpbmd+biIsIFtdKSwKKworICAgIHtDbGllbnQyLCB7b2ssIFN1bX19ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDEsIGFkZCwgIFsxLCAxXSksCisgICAgaW86Zm9ybWF0KCIxKzE9fnB+biIsIFtTdW1dKSwKKworICAgIHtDbGllbnQzLCB7b2ssIFN1bTF9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQyLCBhZGQsIFsxLCA0XSksCisgICAgaW86Zm9ybWF0KCIxKzQ9fnB+biIsIFtTdW0xXSksCisKKyAgICBXb3JrID0gIydXb3JrJ3tvcD0/VFVUT1JJQUxfT1BFUkFUSU9OX1NVQlRSQUNULAorICAgICAgICAgICAgICAgICBudW0xPTE1LAorICAgICAgICAgICAgICAgICBudW0yPTEwfSwKKyAgICB7Q2xpZW50NCwge29rLCBEaWZmfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MywgY2FsY3VsYXRlLCBbMSwgV29ya10pLAorICAgIGlvOmZvcm1hdCgiMTUtMTA9fnB+biIsIFtEaWZmXSksCisKKyAgICB7Q2xpZW50NSwge29rLCBMb2d9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQ0LCBnZXRTdHJ1Y3QsIFsxXSksCisgICAgaW86Zm9ybWF0KCJMb2c6IH5wfm4iLCBbTG9nXSksCisKKyAgICBDbGllbnQ2ID0KKyAgICAgICAgdHJ5CisgICAgICAgICAgICBXb3JrMSA9ICMnV29yayd7b3A9P1RVVE9SSUFMX09QRVJBVElPTl9ESVZJREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG51bTE9MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtMj0wfSwKKyAgICAgICAgICAgIHtDbGllbnRTMSwge29rLCBfUXVvdH19ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDUsIGNhbGN1bGF0ZSwgWzIsIFdvcmsxXSksCisKKyAgICAgICAgICAgIGlvOmZvcm1hdCgiTEFNRTogZXhjZXB0aW9uIGhhbmRsaW5nIGlzIGJyb2tlbn5uIiwgW10pLAorICAgICAgICAgICAgQ2xpZW50UzEKKyAgICAgICAgY2F0Y2gKKyAgICAgICAgICAgIHRocm93OntDbGllbnRTMiwgWn0gLT4KKyAgICAgICAgICAgICAgICBpbzpmb3JtYXQoIkdvdCBleGNlcHRpb24gd2hlcmUgZXhwZWN0aW5nIC0gdGhlICIgKysKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZvbGxvd2luZyBpcyBOT1QgYSBwcm9ibGVtISEhfm4iKSwKKyAgICAgICAgICAgICAgICBwKFopLAorICAgICAgICAgICAgICAgIENsaWVudFMyCisgICAgICAgIGVuZCwKKworCisgICAge0NsaWVudDcsIHtvaywgb2t9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQ2LCB6aXAsIFtdKSwKKyAgICBpbzpmb3JtYXQoInppcH5uIiwgW10pLAorCisgICAge19DbGllbnQ4LCBva30gPSB0aHJpZnRfY2xpZW50OmNsb3NlKENsaWVudDcpLAorICAgIG9rLgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZXJsL3NlcnZlci5lcmwgYi90dXRvcmlhbC9lcmwvc2VydmVyLmVybAppbmRleCA0OTE1NjA2Li42NDdjYzI0IDEwMDY0NAotLS0gYS90dXRvcmlhbC9lcmwvc2VydmVyLmVybAorKysgYi90dXRvcmlhbC9lcmwvc2VydmVyLmVybApAQCAtMzYsMjUgKzM2LDI1IEBACiAgICAgTjErTjIuCiAKIGNhbGN1bGF0ZShMb2dpZCwgV29yaykgLT4KLSAgICB7IE9wLCBOdW0xLCBOdW0yIH0gPSB7IFdvcmsjd29yay5vcCwgV29yayN3b3JrLm51bTEsIFdvcmsjd29yay5udW0yIH0sCisgICAgeyBPcCwgTnVtMSwgTnVtMiB9ID0geyBXb3JrIydXb3JrJy5vcCwgV29yayMnV29yaycubnVtMSwgV29yayMnV29yaycubnVtMiB9LAogICAgIGRlYnVnKCJjYWxjdWxhdGUofnAsIHt+cCx+cCx+cH0pIiwgW0xvZ2lkLCBPcCwgTnVtMSwgTnVtMl0pLAogICAgIGNhc2UgT3Agb2YKLSAgICAgICAgP3R1dG9yaWFsX09wZXJhdGlvbl9BREQgICAgICAtPiBOdW0xICsgTnVtMjsKLSAgICAgICAgP3R1dG9yaWFsX09wZXJhdGlvbl9TVUJUUkFDVCAtPiBOdW0xIC0gTnVtMjsKLSAgICAgICAgP3R1dG9yaWFsX09wZXJhdGlvbl9NVUxUSVBMWSAtPiBOdW0xICogTnVtMjsKKyAgICAgICAgP1RVVE9SSUFMX09QRVJBVElPTl9BREQgICAgICAtPiBOdW0xICsgTnVtMjsKKyAgICAgICAgP1RVVE9SSUFMX09QRVJBVElPTl9TVUJUUkFDVCAtPiBOdW0xIC0gTnVtMjsKKyAgICAgICAgP1RVVE9SSUFMX09QRVJBVElPTl9NVUxUSVBMWSAtPiBOdW0xICogTnVtMjsKIAotICAgICAgICA/dHV0b3JpYWxfT3BlcmF0aW9uX0RJVklERSB3aGVuIE51bTIgPT0gMCAtPgotICAgICAgICAgIHRocm93KCNpbnZhbGlkT3BlcmF0aW9ue3doYXQ9T3AsIHdoeT0iQ2Fubm90IGRpdmlkZSBieSAwIn0pOwotICAgICAgICA/dHV0b3JpYWxfT3BlcmF0aW9uX0RJVklERSAtPgorICAgICAgICA/VFVUT1JJQUxfT1BFUkFUSU9OX0RJVklERSB3aGVuIE51bTIgPT0gMCAtPgorICAgICAgICAgIHRocm93KCMnSW52YWxpZE9wZXJhdGlvbid7d2hhdE9wPU9wLCB3aHk9IkNhbm5vdCBkaXZpZGUgYnkgMCJ9KTsKKyAgICAgICAgP1RVVE9SSUFMX09QRVJBVElPTl9ESVZJREUgLT4KICAgICAgICAgICBOdW0xIGRpdiBOdW0yOwogCiAgICAgICAgIF9FbHNlIC0+Ci0gICAgICAgICAgdGhyb3coI2ludmFsaWRPcGVyYXRpb257d2hhdD1PcCwgd2h5PSJJbnZhbGlkIG9wZXJhdGlvbiJ9KQorICAgICAgICAgIHRocm93KCMnSW52YWxpZE9wZXJhdGlvbid7d2hhdE9wPU9wLCB3aHk9IkludmFsaWQgb3BlcmF0aW9uIn0pCiAgICAgZW5kLgogCiBnZXRTdHJ1Y3QoS2V5KSAtPgogICAgIGRlYnVnKCJnZXRTdHJ1Y3QofnApIiwgW0tleV0pLAotICAgICNzaGFyZWRTdHJ1Y3R7a2V5PUtleSwgdmFsdWU9IlJBUkcifS4KKyAgICAjJ1NoYXJlZFN0cnVjdCd7a2V5PUtleSwgdmFsdWU9IlJBUkcifS4KIAogemlwKCkgLT4KICAgICBkZWJ1ZygiemlwIiwgW10pLApAQCAtNjMsNyArNjMsNyBAQAogJSUKIAogc3RhcnQoKSAtPgotICAgIHN0YXJ0KDk5OTkpLgorICAgIHN0YXJ0KDkwOTApLgogCiBzdGFydChQb3J0KSAtPgogICAgIEhhbmRsZXIgICA9ID9NT0RVTEUsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9NYWtlLmRlcHMgYi90dXRvcmlhbC9nby9NYWtlLmRlcHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YzJiMjAuLjAwMDAwMDAKLS0tIGEvdHV0b3JpYWwvZ28vTWFrZS5kZXBzCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLXNyYy5pbnN0YWxsOiBmbXQuaW5zdGFsbCBuZXQuaW5zdGFsbCBvcy5pbnN0YWxsIHN0cmNvbnYuaW5zdGFsbCB0aHJpZnQuaW5zdGFsbAotYXJjaGl2ZS90YXIuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9hcmNoaXZlL3Rhci5hCi1hcmNoaXZlL3ppcC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2FyY2hpdmUvemlwLmEKLWFzbjEuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9hc24xLmEKLWJpZy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2JpZy5hCi1idWZpby5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2J1ZmlvLmEKLWJ5dGVzLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vYnl0ZXMuYQotY21hdGguaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jbWF0aC5hCi1jb21wcmVzcy9mbGF0ZS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NvbXByZXNzL2ZsYXRlLmEKLWNvbXByZXNzL2d6aXAuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jb21wcmVzcy9nemlwLmEKLWNvbXByZXNzL3psaWIuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jb21wcmVzcy96bGliLmEKLWNvbnRhaW5lci9oZWFwLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY29udGFpbmVyL2hlYXAuYQotY29udGFpbmVyL2xpc3QuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jb250YWluZXIvbGlzdC5hCi1jb250YWluZXIvcmluZy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NvbnRhaW5lci9yaW5nLmEKLWNvbnRhaW5lci92ZWN0b3IuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jb250YWluZXIvdmVjdG9yLmEKLWNyeXB0by5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by5hCi1jcnlwdG8vYWVzLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL2Flcy5hCi1jcnlwdG8vYmxvY2suaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vYmxvY2suYQotY3J5cHRvL2Jsb3dmaXNoLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL2Jsb3dmaXNoLmEKLWNyeXB0by9jYXN0NS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by9jYXN0NS5hCi1jcnlwdG8vY2lwaGVyLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL2NpcGhlci5hCi1jcnlwdG8vZHNhLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL2RzYS5hCi1jcnlwdG8vZWxsaXB0aWMuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vZWxsaXB0aWMuYQotY3J5cHRvL2htYWMuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vaG1hYy5hCi1jcnlwdG8vbWQ0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL21kNC5hCi1jcnlwdG8vbWQ1Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL21kNS5hCi1jcnlwdG8vb2NzcC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by9vY3NwLmEKLWNyeXB0by9yYW5kLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL3JhbmQuYQotY3J5cHRvL3JjNC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by9yYzQuYQotY3J5cHRvL3JpcGVtZDE2MC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by9yaXBlbWQxNjAuYQotY3J5cHRvL3JzYS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by9yc2EuYQotY3J5cHRvL3NoYTEuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vc2hhMS5hCi1jcnlwdG8vc2hhMjU2Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL3NoYTI1Ni5hCi1jcnlwdG8vc2hhNTEyLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL3NoYTUxMi5hCi1jcnlwdG8vc3VidGxlLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL3N1YnRsZS5hCi1jcnlwdG8vdGxzLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL3Rscy5hCi1jcnlwdG8vdHdvZmlzaC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by90d29maXNoLmEKLWNyeXB0by94NTA5Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL3g1MDkuYQotY3J5cHRvL3h0ZWEuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8veHRlYS5hCi1kZWJ1Zy9kd2FyZi5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2RlYnVnL2R3YXJmLmEKLWRlYnVnL21hY2hvLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZGVidWcvbWFjaG8uYQotZGVidWcvZWxmLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZGVidWcvZWxmLmEKLWRlYnVnL2dvc3ltLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZGVidWcvZ29zeW0uYQotZGVidWcvcGUuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9kZWJ1Zy9wZS5hCi1kZWJ1Zy9wcm9jLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZGVidWcvcHJvYy5hCi1lYm5mLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZWJuZi5hCi1lbmNvZGluZy9hc2NpaTg1Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZW5jb2RpbmcvYXNjaWk4NS5hCi1lbmNvZGluZy9iYXNlMzIuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9lbmNvZGluZy9iYXNlMzIuYQotZW5jb2RpbmcvYmFzZTY0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZW5jb2RpbmcvYmFzZTY0LmEKLWVuY29kaW5nL2JpbmFyeS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2VuY29kaW5nL2JpbmFyeS5hCi1lbmNvZGluZy9naXQ4NS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2VuY29kaW5nL2dpdDg1LmEKLWVuY29kaW5nL2hleC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2VuY29kaW5nL2hleC5hCi1lbmNvZGluZy9saW5lLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZW5jb2RpbmcvbGluZS5hCi1lbmNvZGluZy9wZW0uaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9lbmNvZGluZy9wZW0uYQotZXhlYy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2V4ZWMuYQotZXhwL2RhdGFmbXQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9leHAvZGF0YWZtdC5hCi1leHAvZHJhdy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2V4cC9kcmF3LmEKLWV4cC9kcmF3L3gxMS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2V4cC9kcmF3L3gxMS5hCi1leHAvZXZhbC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2V4cC9ldmFsLmEKLWV4cHZhci5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2V4cHZhci5hCi1mbGFnLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZmxhZy5hCi1mbXQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9mbXQuYQotZ28vYXN0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZ28vYXN0LmEKLWdvL2RvYy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2dvL2RvYy5hCi1nby9wYXJzZXIuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9nby9wYXJzZXIuYQotZ28vcHJpbnRlci5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2dvL3ByaW50ZXIuYQotZ28vc2Nhbm5lci5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2dvL3NjYW5uZXIuYQotZ28vdG9rZW4uaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9nby90b2tlbi5hCi1nby90eXBlY2hlY2tlci5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2dvL3R5cGVjaGVja2VyLmEKLWdvYi5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2dvYi5hCi1oYXNoLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vaGFzaC5hCi1oYXNoL2FkbGVyMzIuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9oYXNoL2FkbGVyMzIuYQotaGFzaC9jcmMzMi5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2hhc2gvY3JjMzIuYQotaGFzaC9jcmM2NC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2hhc2gvY3JjNjQuYQotaHRtbC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2h0bWwuYQotaHR0cC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2h0dHAuYQotaHR0cC9wcHJvZi5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2h0dHAvcHByb2YuYQotaW1hZ2UuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9pbWFnZS5hCi1pbWFnZS9qcGVnLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vaW1hZ2UvanBlZy5hCi1pbWFnZS9wbmcuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9pbWFnZS9wbmcuYQotaW5kZXgvc3VmZml4YXJyYXkuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9pbmRleC9zdWZmaXhhcnJheS5hCi1pby5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2lvLmEKLWlvL2lvdXRpbC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2lvL2lvdXRpbC5hCi1qc29uLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vanNvbi5hCi1sb2cuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9sb2cuYQotbWF0aC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L21hdGguYQotbWltZS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L21pbWUuYQotbWltZS9tdWx0aXBhcnQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9taW1lL211bHRpcGFydC5hCi1uZXQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9uZXQuYQotbmV0L2RpY3QuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9uZXQvZGljdC5hCi1uZXQvdGV4dHByb3RvLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vbmV0L3RleHRwcm90by5hCi1uZXRjaGFuLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vbmV0Y2hhbi5hCi1vcy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L29zLmEKLW9zL3NpZ25hbC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L29zL3NpZ25hbC5hCi1wYXRjaC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3BhdGNoLmEKLXBhdGguaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9wYXRoLmEKLXJhbmQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9yYW5kLmEKLXJlZmxlY3QuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9yZWZsZWN0LmEKLXJlZ2V4cC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3JlZ2V4cC5hCi1ycGMuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9ycGMuYQotcnBjL2pzb25ycGMuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9ycGMvanNvbnJwYy5hCi1ydW50aW1lLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vcnVudGltZS5hCi1ydW50aW1lL2Nnby5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3J1bnRpbWUvY2dvLmEKLXJ1bnRpbWUvZGVidWcuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9ydW50aW1lL2RlYnVnLmEKLXJ1bnRpbWUvcHByb2YuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9ydW50aW1lL3Bwcm9mLmEKLXNjYW5uZXIuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9zY2FubmVyLmEKLXNtdHAuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9zbXRwLmEKLXNvcnQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9zb3J0LmEKLXN0cmNvbnYuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9zdHJjb252LmEKLXN0cmluZ3MuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9zdHJpbmdzLmEKLXN5bmMuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9zeW5jLmEKLXN5c2NhbGwuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9zeXNjYWxsLmEKLXN5c2xvZy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3N5c2xvZy5hCi10YWJ3cml0ZXIuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS90YWJ3cml0ZXIuYQotdGVtcGxhdGUuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS90ZW1wbGF0ZS5hCi10ZXN0aW5nLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vdGVzdGluZy5hCi10ZXN0aW5nL2lvdGVzdC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3Rlc3RpbmcvaW90ZXN0LmEKLXRlc3RpbmcvcXVpY2suaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS90ZXN0aW5nL3F1aWNrLmEKLXRlc3Rpbmcvc2NyaXB0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vdGVzdGluZy9zY3JpcHQuYQotdGltZS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3RpbWUuYQotdHJ5Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vdHJ5LmEKLXVuaWNvZGUuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS91bmljb2RlLmEKLXV0ZjE2Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vdXRmMTYuYQotdXRmOC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3V0ZjguYQotd2Vic29ja2V0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vd2Vic29ja2V0LmEKLXhtbC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3htbC5hCi0uLi9jbWQvY2dvLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vLi4vY21kL2Nnby5hCi0uLi9jbWQvZWJuZmxpbnQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS8uLi9jbWQvZWJuZmxpbnQuYQotLi4vY21kL2dvZG9jLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vLi4vY21kL2dvZG9jLmEKLS4uL2NtZC9nb2ZtdC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9Ly4uL2NtZC9nb2ZtdC5hCi0uLi9jbWQvZ29pbnN0YWxsLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vLi4vY21kL2dvaW5zdGFsbC5hCi0uLi9jbWQvZ292ZXQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS8uLi9jbWQvZ292ZXQuYQotLi4vY21kL2dveWFjYy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9Ly4uL2NtZC9nb3lhY2MuYQotLi4vY21kL2hncGF0Y2guaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS8uLi9jbWQvaGdwYXRjaC5hCi10aHJpZnQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS90aHJpZnQuYQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZ28vTWFrZWZpbGUgYi90dXRvcmlhbC9nby9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBjNWRmZS4uMDAwMDAwMAotLS0gYS90dXRvcmlhbC9nby9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMDkgVGhlIEdvIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlCi0jIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotaW5jbHVkZSAkKEdPUk9PVCkvc3JjL01ha2UuaW5jCi0KLWFsbDogTWFrZS5kZXBzIGluc3RhbGwKLQotVEFSRz10aHJpZnRsaWIvdHV0b3JpYWxjYWxjdWxhdG9yCi0KLURJUlM9XAotICBzcmMvXAotCi1HT0ZJTEVTPVwKLQotCi1jbGVhbi5kaXJzOiAkKGFkZHN1ZmZpeCAuY2xlYW4sICQoRElSUykpCi1pbnN0YWxsLmRpcnM6ICQoYWRkc3VmZml4IC5pbnN0YWxsLCAkKERJUlMpKQotdGVzdC5kaXJzOiAkKGFkZHN1ZmZpeCAudGVzdCwgJChESVJTKSkKLQotCi0lLmNsZWFuOgotCStjZCAkKiAmJiAkKE1BS0UpIGNsZWFuCi0KLSUuaW5zdGFsbDoKLQkrY2QgJCogJiYgJChNQUtFKSBpbnN0YWxsCi0KLSUudGVzdDoKLQkrY2QgJCogJiYgJChNQUtFKSB0ZXN0Ci0KLQotCi1NYWtlLmRlcHM6Ci0JLi9kZXBzLmJhc2gKLQotZGVwczoKLQkuL2RlcHMuYmFzaAotCi1jbGVhbjogY2xlYW4uZGlycwotCi1pbnN0YWxsOiBpbnN0YWxsLmRpcnMKLQotdGVzdDoJdGVzdC5kaXJzCi0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2dvL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvZ28vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ1N2Q2NQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2dvL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNTkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitnZW4tZ28vdHV0b3JpYWwvY2FsY3VsYXRvci5nbyBnZW4tZ28vc2hhcmVkL3NoYXJlZF9zZXJ2aWNlLmdvOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBnbyQoQ09NUElMRVJfRVhUUkFGTEFHKSAtciAkPAorCithbGwtbG9jYWw6IGdlbi1nby90dXRvcmlhbC9jYWxjdWxhdG9yLmdvCisKK2NoZWNrOiBzcmMvZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQgdGhpcmRwYXJ0eS1kZXAKKwkkKFRIUklGVCkgLXIgLS1nZW4gZ28kKENPTVBJTEVSX0VYVFJBRkxBRykgJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKwljcCAtciBnZW4tZ28vKiBzcmMvCisJR09QQVRIPWBwd2RgICQoR08pIGJ1aWxkIC1vIGdvLXR1dG9yaWFsIC4vc3JjCisJR09QQVRIPWBwd2RgICQoR08pIGJ1aWxkIC1vIGNhbGN1bGF0b3ItcmVtb3RlIHNyYy90dXRvcmlhbC9jYWxjdWxhdG9yLXJlbW90ZS9jYWxjdWxhdG9yLXJlbW90ZS5nbworCitzcmMvZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQ6CisJbWtkaXIgLXAgc3JjL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28KKwlsbiAtc2YgJChyZWFscGF0aCAkKHRvcF9zcmNkaXIpL2xpYi9nby90aHJpZnQpIHNyYy9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvbGliL2dvL3RocmlmdAorCit0aGlyZHBhcnR5LWRlcDoKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCUdPUEFUSD1gcHdkYCAkKEdPKSBydW4gc3JjLyouZ28gLXNlcnZlcj10cnVlCisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwlHT1BBVEg9YHB3ZGAgJChHTykgcnVuIHNyYy8qLmdvCisKK3R1dG9yaWFsc2VjdXJlc2VydmVyOiBhbGwKKwlHT1BBVEg9YHB3ZGAgJChHTykgcnVuIHNyYy8qLmdvIC1zZXJ2ZXI9dHJ1ZSAtc2VjdXJlPXRydWUKKwordHV0b3JpYWxzZWN1cmVjbGllbnQ6IGFsbAorCUdPUEFUSD1gcHdkYCAkKEdPKSBydW4gc3JjLyouZ28gLXNlY3VyZT10cnVlCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi0qIHNyYy9zaGFyZWQgc3JjL3R1dG9yaWFsIHNyYy9naXQuYXBhY2hlLm9yZyBnby10dXRvcmlhbCBjYWxjdWxhdG9yLXJlbW90ZQorCitFWFRSQV9ESVNUID0gXAorCXNyYy9jbGllbnQuZ28gXAorCXNyYy9oYW5kbGVyLmdvIFwKKwlzcmMvc2VydmVyLmdvIFwKKwlzcmMvbWFpbi5nbyBcCisJc2VydmVyLmNydCBcCisJc2VydmVyLmtleQorCmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9kZXBzLmJhc2ggYi90dXRvcmlhbC9nby9kZXBzLmJhc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYzZlYzIuLjAwMDAwMDAKLS0tIGEvdHV0b3JpYWwvZ28vZGVwcy5iYXNoCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgYmFzaAotIyBDb3B5cmlnaHQgMjAwOSBUaGUgR28gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUKLSMgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi1PVVQ9Ik1ha2UuZGVwcyIKLVRNUD0iTWFrZS5kZXBzLnRtcCIKLQotaWYgWyAtZiAkT1VUIF0gJiYgISBbIC13ICRPVVQgXTsgdGhlbgotCWVjaG8gIiQwOiAkT1VUIGlzIHJlYWQtb25seTsgYWJvcnRpbmcuIiAxPiYyCi0JZXhpdCAxCi1maQotCi0jIEdldCBsaXN0IG9mIGRpcmVjdG9yaWVzIGZyb20gTWFrZWZpbGUKLWRpcnM9JChzZWQgJzEsL15ESVJTPS9kOyAvXiQvLCRkOyBzL1xcLy9nJyBNYWtlZmlsZSkKLWRpcnMyPSQoc2VkICcxLC9eRElSUz0vZDsgL14kLywkZDsgcy9cXC8vZycgJEdPUk9PVC9zcmMvcGtnL01ha2VmaWxlKQotZGlyczM9InRocmlmdCIKLWRpcnBhdD0kKGVjaG8gJGRpcnMgJGRpcnMyICRkaXJzMyB8IHNlZCAncy8gL3wvZzsgcy8uKi9eKCYpJC8nKQotCi1mb3IgZGlyIGluICRkaXJzOyBkbyAoCi0JY2QgJGRpciB8fCBleGl0IDEKLQotCXNvdXJjZXM9JChzZWQgLW4gJ3MvXC5nb1xcLy5nby9wJyBNYWtlZmlsZSkKLQlzb3VyY2VzPSQobHMgJHNvdXJjZXMgMj4gL2Rldi9udWxsKSAgIyByZW1vdmUgLnMsIC5jLCBldGMuCi0KLQlkZXBzPSQoCi0JCXNlZCAtbiAnL15pbXBvcnQuKiIvcDsgL15pbXBvcnRbIFx0XSooLywvXikvcCcgJHNvdXJjZXMgL2Rldi9udWxsIHwKLQkJY3V0IC1kICciJyAtZjIgfAotCQllZ3JlcCAiJGRpcnBhdCIgfAotCQlncmVwIC12ICJeJGRpclwkIiB8Ci0JCXNlZCAncy8kLy5pbnN0YWxsLycgfAotCQlzb3J0IC11Ci0JKQotCi0JZWNobyAkZGlyLmluc3RhbGw6ICRkZXBzCi0pIGRvbmUgPiAkVE1QCi0KLWZvciBkaXIgaW4gJGRpcnMyOyBkbyAoCi0gIGVjaG8gJGRpci5pbnN0YWxsOiBcJHtHT1JPT1R9L3BrZy9cJHtHT09TfV9cJHtHT0FSQ0h9LyR7ZGlyfS5hCi0pIGRvbmUgPj4gJFRNUAotZm9yIGRpciBpbiAkZGlyczM7IGRvICgKLSAgZWNobyAkZGlyLmluc3RhbGw6IFwke0dPUk9PVH0vcGtnL1wke0dPT1N9X1wke0dPQVJDSH0vJHtkaXJ9LmEKLSkgZG9uZSA+PiAkVE1QCi0KLW12ICRUTVAgJE9VVApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZ28vc2VydmVyLmNydCBiL3R1dG9yaWFsL2dvL3NlcnZlci5jcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE1ZWYzYwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2dvL3NlcnZlci5jcnQKQEAgLTAsMCArMSwyNSBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFTnpDQ0F4K2dBd0lCQWdJSkFPWWZZZnc3TkNPY01BMEdDU3FHU0liM0RRRUJCUVVBTUlHeE1Rc3dDUVlECitWUVFHRXdKVlV6RVJNQThHQTFVRUNBd0lUV0Z5ZVd4aGJtUXhGREFTQmdOVkJBY01DMFp2Y21WemRDQklhV3hzCitNU2N3SlFZRFZRUUtEQjVVYUdVZ1FYQmhZMmhsSUZOdlpuUjNZWEpsSUVadmRXNWtZWFJwYjI0eEZqQVVCZ05WCitCQXNNRFVGd1lXTm9aU0JVYUhKcFpuUXhFakFRQmdOVkJBTU1DV3h2WTJGc2FHOXpkREVrTUNJR0NTcUdTSWIzCitEUUVKQVJZVlpHVjJRSFJvY21sbWRDNWhjR0ZqYUdVdWIzSm5NQjRYRFRFME1EUXdOekU0TlRnd01Gb1hEVEl5CitNRFl5TkRFNE5UZ3dNRm93Z2JFeEN6QUpCZ05WQkFZVEFsVlRNUkV3RHdZRFZRUUlEQWhOWVhKNWJHRnVaREVVCitNQklHQTFVRUJ3d0xSbTl5WlhOMElFaHBiR3d4SnpBbEJnTlZCQW9NSGxSb1pTQkJjR0ZqYUdVZ1UyOW1kSGRoCitjbVVnUm05MWJtUmhkR2x2YmpFV01CUUdBMVVFQ3d3TlFYQmhZMmhsSUZSb2NtbG1kREVTTUJBR0ExVUVBd3dKCitiRzlqWVd4b2IzTjBNU1F3SWdZSktvWklodmNOQVFrQkZoVmtaWFpBZEdoeWFXWjBMbUZ3WVdOb1pTNXZjbWN3CitnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDcUU5VEU5d0VYcDVMUnRMUVZEU0dRCitHVjc4KzdadFAvSS9aYUo2UTZaR2xmeERGdlpqRkY3M3NlTmhBdmxLbFltL2pmbElIWUxuTk9DeVNOOEkyWHc2CitMOU1iQytqdndrRUtmUW80ZURveFpuT1pqTkY1SjEvbFp0QmVPb3dNa2hoekJNSDFSZHMzNTEvSGpLTmc2WktnCisyQ2xkZDBqN0hiRHRFaXhPTGdMYlBScEJjYVlyTHJOTWFzZjNIYWwreDgvYjh1ZTI4eDkzSFNRQkdtWm1NSVV3CitBaW5FdS9mTlA0bExHbC8wa1piNzZUbnlScFlTUFlvanRTNkNua0grUUxZbnNSUkVYSll3RDFYa3U2MkxpcGtYCit3Q2tSVG5aNW5Vc0RNWDZGUEtnalFGUUNXRFhHL04wOTYrUFJVUUFDaGhyWHNKK2dGM05xV3REbXRyaFZRRjRuCitBZ01CQUFHalVEQk9NQjBHQTFVZERnUVdCQlFvOHYwd3pRUHgzRUVleEpQR2x4UEsxUHBnS2pBZkJnTlZIU01FCitHREFXZ0JRbzh2MHd6UVB4M0VFZXhKUEdseFBLMVBwZ0tqQU1CZ05WSFJNRUJUQURBUUgvTUEwR0NTcUdTSWIzCitEUUVCQlFVQUE0SUJBUUJHRlJpSnNsY1gwYUprd1pwelR3U1VkZ2NmS2Jwdk5FYkNOdFZvaGZRVlRJNGEvb041CitVK3lxRFpKZzN2T2FPdWlBWnF5SGNJbFo4cXllc0NnUk4zMTRUbDQvSlErK0NXOG1LajFtZVRnbzVZRnhjWlltCitUOXZzSTNDK056bjg0RElOZ0k5bXg2eWt0SXQzUU9LWlJEcHp5UGtVenhzeUo4SjQyN0RhaW1EcmpUUitmVHdECisxRGgwOXhlZU1uU2E1emVWMUhFRHlKVHFDWHV0TGV0d1EvSXlmbU1CaEl4K252QjVmNjdwei9tK0R2NlYwcjNJCitwNEhDY2RuRFVER0piZnF0b3FzQUFUUVFXTytXV3Vzd0I2bU9oRGJ2UFR4aFJwWnE2QWtnV3F2NFMrdTNNMkdPCityNXA5RnJCZ2F2QXc1YktPNTRDMG9RS3BOLzVmdGE1bDZXczAKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2dvL3NlcnZlci5rZXkgYi90dXRvcmlhbC9nby9zZXJ2ZXIua2V5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2M2NmY2UKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9nby9zZXJ2ZXIua2V5CkBAIC0wLDAgKzEsMjggQEAKKy0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLQorTUlJRXZBSUJBREFOQmdrcWhraUc5dzBCQVFFRkFBU0NCS1l3Z2dTaUFnRUFBb0lCQVFDcUU5VEU5d0VYcDVMUgordExRVkRTR1FHVjc4KzdadFAvSS9aYUo2UTZaR2xmeERGdlpqRkY3M3NlTmhBdmxLbFltL2pmbElIWUxuTk9DeQorU044STJYdzZMOU1iQytqdndrRUtmUW80ZURveFpuT1pqTkY1SjEvbFp0QmVPb3dNa2hoekJNSDFSZHMzNTEvSAoraktOZzZaS2cyQ2xkZDBqN0hiRHRFaXhPTGdMYlBScEJjYVlyTHJOTWFzZjNIYWwreDgvYjh1ZTI4eDkzSFNRQgorR21abU1JVXdBaW5FdS9mTlA0bExHbC8wa1piNzZUbnlScFlTUFlvanRTNkNua0grUUxZbnNSUkVYSll3RDFYawordTYyTGlwa1h3Q2tSVG5aNW5Vc0RNWDZGUEtnalFGUUNXRFhHL04wOTYrUFJVUUFDaGhyWHNKK2dGM05xV3REbQordHJoVlFGNG5BZ01CQUFFQ2dnRUFXL3k1MllZVzZ5cFJPR2JaOTREUXBGVjBrTE83cVQ4cTBLc3h3NXNQTmFJdAorZkVQUkl5bURhOGlreUhXSlM1T3htdzg0d281am5KVjI2amFMbXdlMkx1cHE3WGYxbHFlajhmNUxKdHV2N2NRUgoreGZ6cDF2TTY1S0pGRkpIcDZXcWpHcUo2SFNTWk9wVkRzblFZY1hRalFDZHB5QW1hU1dkM3ArRnFZU1oxbVFtRAorYkZOSTdqcXBjeldTWmhUZG90UTdwN0huOVRWQ2VoZmxQM3lHSUIzYlErd0NjQ0I4NWRPQnoyMDFMK1lnYUljaworU3o0M0E0TnZXYVFJUkxSRHc3czlHVzRqWTVUMEp2MjgyV0llQWxWcFZ4TEl3dTQ4cjRSNHlHVEl4OVlkb3d2cQorNTcrWTVpUFBqQVh4dTBWOXQwMG9TM2JZeERhS2gyRFVmYy81em93cThRS0JnUURZTlZQWG1hRzBhSUg0dmpROQorN2ZSZHcvVURrWWNRYm42Q25nbFFPdTc3L1M4b2dRenBLQ1ZKZ0pna1pOcU9WdFFNRVB6ZWtHRWNMVGJqZTFnVQorOEJreTJrK1BMOVV3YkZ5MGVtbk9WaDRycXJOWEhzUnZKY2VoTlQvUFJiNWhqRjNNVU1GVi8waUQ0YituYUZhRQoranJTV2laMlpYajJxZndBSzUyR0ZidE91QlFLQmdRREpZUXVHaVkwcjIyRTR3YUptQ1NLY3pvQlQzY3dsVnpXagorVjJsamdBOVJITE5UVmt2Tk5ZUUxHdTJxbmdGcnR3cGVhU25zTURlclZHNHdLQVFXeUNuWXp4VnJsbkM0dURySgorSFh1RkVsdEJXaTlGZmJnZnNuZDM3NDlBVDBvQlAxTlQydE1sZWd1eWY1REZnakNSM1ZSSkxkclZhYVo4cm93LworTHFLY0ZNcW5Pd0tCZ0IrT0lPOTlsN0U1ODRZM1ZHNlpkU25lT0x0Tm1SWFgycFQ3dGNaRTQ2NVpkSEdIN0RkMworU1lIaHg5Sy8rWG4reURIK3BMbGkveGxhckFFbGRtU1A2azJXdVRmZnRsQzc4QWZUT2ZBSWQ1ek43Q0RSOTc5MQorRng2N0k5WC9pdHEzM3RTOEVJdVpsNTdQNnVYbS80R1hSbG9XT2E4eHB2UmtWc0JBcHVZUGw4dDFBb0dBVFFEUworeTJzbGxET2JCWHpsZ0diVjJXZ05JZ1NaMzExdG9UdjNqSmlYUXNqYXVXOHlKUkhsbitsNEg5bXphV0Rna2lGYworYW5nMWtVb0RxRjVrMGVGUVB4dFFjWWRoS3dFbldXZndwMzNSYnpmeEEzMkRQbnVidXp6YlpoZnJrSGFLZ25JVworY3lvcjl1RllsbTJsN09EWkxmSmV6MlJLeVRwbFhuT1NzbVF3NmFrQ2dZQXozZGo5SHNreWorSFZKK2h0MU9jRQorYzdhaS9FU2tTQTdWYWpwMHRqSnAwRUtqVy96cThEdlVTWE90Y2RuSmdrS3ljRmx1THdibW5hTjR0eEJkczFDMQorUXI4UnQyc1VDQ0JOWmUxTDZESGUzWEJkYmtKZTlzZ1pWTlRqdFVTUXJ6eThVaHZzQ3FHNFlXZUN1MDdTemNiYworcmRQVVY5L3VRa2R4OFZyU2h4bEQ4QT09CistLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9zcmMvQ2FsY3VsYXRvckhhbmRsZXIuZ28gYi90dXRvcmlhbC9nby9zcmMvQ2FsY3VsYXRvckhhbmRsZXIuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYjI4MzguLjAwMDAwMDAKLS0tIGEvdHV0b3JpYWwvZ28vc3JjL0NhbGN1bGF0b3JIYW5kbGVyLmdvCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLXBhY2thZ2UgbWFpbjsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgKAotICAiZm10IgotICAib3MiCi0gICJzdHJjb252IgotICAidGhyaWZ0bGliL3R1dG9yaWFsIgotICAidGhyaWZ0bGliL3NoYXJlZCIKLSkKLQotdHlwZSBDYWxjdWxhdG9ySGFuZGxlciBzdHJ1Y3QgewotICBsb2cgbWFwW2ludF0qc2hhcmVkLlNoYXJlZFN0cnVjdAotfQotCi1mdW5jIE5ld0NhbGN1bGF0b3JIYW5kbGVyKCkgKkNhbGN1bGF0b3JIYW5kbGVyIHsKLSAgcmV0dXJuICZDYWxjdWxhdG9ySGFuZGxlcntsb2c6bWFrZShtYXBbaW50XSpzaGFyZWQuU2hhcmVkU3RydWN0KX0KLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRvckhhbmRsZXIpIFBpbmcoKSAoZXJyIG9zLkVycm9yKSB7Ci0gIGZtdC5QcmludCgicGluZygpXG4iKQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0b3JIYW5kbGVyKSBBZGQobnVtMSBpbnQzMiwgbnVtMiBpbnQzMikgKHJldHZhbDE3IGludDMyLCBlcnIgb3MuRXJyb3IpIHsKLSAgZm10LlByaW50KCJhZGQoIiwgbnVtMSwgIiwiLCBudW0yLCAiKVxuIikKLSAgcmV0dXJuIG51bTEgKyBudW0yLCBuaWwKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRvckhhbmRsZXIpIENhbGN1bGF0ZShsb2dpZCBpbnQzMiwgdyAqdHV0b3JpYWwuV29yaykgKHZhbCBpbnQzMiwgb3VjaCAqdHV0b3JpYWwuSW52YWxpZE9wZXJhdGlvbiwgZXJyIG9zLkVycm9yKSB7Ci0gIGZtdC5QcmludCgiY2FsY3VsYXRlKCIsIGxvZ2lkLCAiLCB7Iiwgdy5PcCwgIiwiLCB3Lk51bTEsICIsIiwgdy5OdW0yLCAifSlcbiIpCi0gIHN3aXRjaCh3Lk9wKSB7Ci0gIGNhc2UgdHV0b3JpYWwuQUREOgotICAgIHZhbCA9IHcuTnVtMSArIHcuTnVtMgotICAgIGJyZWFrCi0gIGNhc2UgdHV0b3JpYWwuU1VCVFJBQ1Q6Ci0gICAgdmFsID0gdy5OdW0xIC0gdy5OdW0yCi0gICAgYnJlYWsKLSAgY2FzZSB0dXRvcmlhbC5NVUxUSVBMWToKLSAgICB2YWwgPSB3Lk51bTEgKiB3Lk51bTIKLSAgICBicmVhawotICBjYXNlIHR1dG9yaWFsLkRJVklERToKLSAgICBpZiB3Lk51bTIgPT0gMCB7Ci0gICAgICBvdWNoID0gdHV0b3JpYWwuTmV3SW52YWxpZE9wZXJhdGlvbigpCi0gICAgICBvdWNoLldoYXQgPSBpbnQzMih3Lk9wKQotICAgICAgb3VjaC5XaHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIgotICAgICAgcmV0dXJuCi0gICAgfQotICAgIHZhbCA9IHcuTnVtMSAvIHcuTnVtMgotICAgIGJyZWFrCi0gIGRlZmF1bHQ6Ci0gICAgb3VjaCA9IHR1dG9yaWFsLk5ld0ludmFsaWRPcGVyYXRpb24oKQotICAgIG91Y2guV2hhdCA9IGludDMyKHcuT3ApCi0gICAgb3VjaC5XaHkgPSAiVW5rbm93biBvcGVyYXRpb24iCi0gICAgcmV0dXJuCi0gIH0KLSAgZW50cnkgOj0gc2hhcmVkLk5ld1NoYXJlZFN0cnVjdCgpCi0gIGVudHJ5LktleSA9IGxvZ2lkCi0gIGVudHJ5LlZhbHVlID0gc3RyY29udi5JdG9hKGludCh2YWwpKQotICBrIDo9IGludChsb2dpZCkKLSAgLyoKLSAgb2xkdmFsdWUsIGV4aXN0cyA6PSBwLmxvZ1trXQotICBpZiBleGlzdHMgewotICAgIGZtdC5QcmludCgiUmVwbGFjaW5nICIsIG9sZHZhbHVlLCAiIHdpdGggIiwgZW50cnksICIgZm9yIGtleSAiLCBrLCAiXG4iKQotICB9IGVsc2UgewotICAgIGZtdC5QcmludCgiQWRkaW5nICIsIGVudHJ5LCAiIGZvciBrZXkgIiwgaywgIlxuIikKLSAgfQotICAqLwotICBwLmxvZ1trXSA9IGVudHJ5LCB0cnVlCi0gIHJldHVybiB2YWwsIG91Y2gsIGVycgotfQotCi1mdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgR2V0U3RydWN0KGtleSBpbnQzMikgKCpzaGFyZWQuU2hhcmVkU3RydWN0LCBvcy5FcnJvcikgewotICBmbXQuUHJpbnQoImdldFN0cnVjdCgiLCBrZXksICIpXG4iKQotICB2LCBfIDo9IHAubG9nW2ludChrZXkpXQotICByZXR1cm4gdiwgbmlsCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0b3JIYW5kbGVyKSBaaXAoKSAoZXJyIG9zLkVycm9yKSB7Ci0gIGZtdC5QcmludCgiemlwKClcbiIpCi0gIHJldHVybiBuaWwKLX0KLQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZ28vc3JjL0dvQ2xpZW50LmdvIGIvdHV0b3JpYWwvZ28vc3JjL0dvQ2xpZW50LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDQwNTMwLi4wMDAwMDAwCi0tLSBhL3R1dG9yaWFsL2dvL3NyYy9Hb0NsaWVudC5nbworKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLXBhY2thZ2UgbWFpbjsKLQotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0ICgKLSAgImZtdCIKLSAgIm5ldCIKLSAgIm9zIgotICAidGhyaWZ0IgotICAidGhyaWZ0bGliL3R1dG9yaWFsIgotKQotCi1mdW5jIFBlcmZvcm0oY2xpZW50ICp0dXRvcmlhbC5DYWxjdWxhdG9yQ2xpZW50KSAoZXJyIG9zLkVycm9yKSB7Ci0gIGNsaWVudC5QaW5nKCkKLSAgZm10LlByaW50KCJwaW5nKClcbiIpCi0gIAotICBzdW0sIF8gOj0gY2xpZW50LkFkZCgxLCAxKQotICBmbXQuUHJpbnQoIjErMT0iLCBzdW0sICJcbiIpCi0gIAotICB3b3JrIDo9IHR1dG9yaWFsLk5ld1dvcmsoKQotICB3b3JrLk9wID0gdHV0b3JpYWwuRElWSURFCi0gIHdvcmsuTnVtMSA9IDEKLSAgd29yay5OdW0yID0gMAotICBxdW90aWVudCwgb3VjaCwgZXJyIDo9IGNsaWVudC5DYWxjdWxhdGUoMSwgd29yaykKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgZm10LlByaW50KCJFcnJvciBkdXJpbmcgb3BlcmF0aW9uOiAiLCBlcnIuU3RyaW5nKCksICJcbiIpCi0gICAgcmV0dXJuIGVycgotICB9IGVsc2UgaWYgb3VjaCAhPSBuaWwgewotICAgIGZtdC5QcmludCgiSW52YWxpZCBvcGVyYXRpb246ICIsIG91Y2guU3RyaW5nKCksICJcbiIpCi0gIH0gZWxzZSB7Ci0gICAgZm10LlByaW50KCJXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCB3aXRoIG5ldyB2YWx1ZTogIiwgcXVvdGllbnQsICJcbiIpCi0gIH0KLSAgCi0gIHdvcmsuT3AgPSB0dXRvcmlhbC5TVUJUUkFDVAotICB3b3JrLk51bTEgPSAxNQotICB3b3JrLk51bTIgPSAxMAotICBkaWZmLCBvdWNoLCBlcnIgOj0gY2xpZW50LkNhbGN1bGF0ZSgxLCB3b3JrKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICBmbXQuUHJpbnQoIkVycm9yIGR1cmluZyBvcGVyYXRpb246ICIsIGVyci5TdHJpbmcoKSwgIlxuIikKLSAgICByZXR1cm4gZXJyCi0gIH0gZWxzZSBpZiBvdWNoICE9IG5pbCB7Ci0gICAgZm10LlByaW50KCJJbnZhbGlkIG9wZXJhdGlvbjogIiwgb3VjaC5TdHJpbmcoKSwgIlxuIikKLSAgfSBlbHNlIHsKLSAgICBmbXQuUHJpbnQoIjE1LTEwPSIsIGRpZmYsICJcbiIpCi0gIH0KLSAgCi0gIGxvZywgZXJyIDo9IGNsaWVudC5HZXRTdHJ1Y3QoMSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgZm10LlByaW50KCJVbmFibGUgdG8gZ2V0IHN0cnVjdDogIiwgZXJyLlN0cmluZygpLCAiXG4iKQotICAgIHJldHVybiBlcnIKLSAgfSBlbHNlIHsKLSAgICBmbXQuUHJpbnQoIkNoZWNrIGxvZzogIiwgbG9nLlZhbHVlLCAiXG4iKQotICB9Ci0gIHJldHVybiBlcnIKLX0KLQotCi1mdW5jIFJ1bkNsaWVudCh0cmFuc3BvcnRGYWN0b3J5IHRocmlmdC5UVHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5KSBvcy5FcnJvciB7Ci0gIGFkZHIsIGVyciA6PSBuZXQuUmVzb2x2ZVRDUEFkZHIoImxvY2FsaG9zdDo5MDkwIikKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgZm10LlByaW50KCJFcnJvciByZXNvbHZpbmcgYWRkcmVzczogIiwgZXJyLlN0cmluZygpLCAiXG4iKQotICAgIHJldHVybiBlcnIKLSAgfQotICB0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RTb2NrZXRBZGRyKGFkZHIpCi0gIGlmIGVyciA9IHRyYW5zcG9ydC5PcGVuKCk7IGVyciAhPSBuaWwgewotICAgIGZtdC5QcmludCgiRXJyb3Igb3BlbmluZyBjb25uZWN0aW9uIGZvciBwcm90b2NvbCAiLCBhZGRyLk5ldHdvcmsoKSwgIiB0byAiLCBhZGRyLlN0cmluZygpLCAiOiAiLCBlcnIuU3RyaW5nKCksICJcbiIpCi0gICAgcmV0dXJuIGVycgotICB9Ci0gIHVzZVRyYW5zcG9ydCA6PSB0cmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydCh0cmFuc3BvcnQpCi0gIGNsaWVudCA6PSB0dXRvcmlhbC5OZXdDYWxjdWxhdG9yQ2xpZW50RmFjdG9yeSh1c2VUcmFuc3BvcnQsIHByb3RvY29sRmFjdG9yeSkKLSAgUGVyZm9ybShjbGllbnQpCi0gIHJldHVybiB0cmFuc3BvcnQuQ2xvc2UoKQotfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZ28vc3JjL0dvU2VydmVyLmdvIGIvdHV0b3JpYWwvZ28vc3JjL0dvU2VydmVyLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzBhMmE5Li4wMDAwMDAwCi0tLSBhL3R1dG9yaWFsL2dvL3NyYy9Hb1NlcnZlci5nbworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLXBhY2thZ2UgbWFpbjsKLQotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0ICgKLSAgImZtdCIKLSAgIm5ldCIKLSAgInRocmlmdCIKLSAgInRocmlmdGxpYi90dXRvcmlhbCIKLSkKLQotCi10eXBlIEdvU2VydmVyIHN0cnVjdCB7Ci0gIGhhbmRsZXIgdHV0b3JpYWwuSUNhbGN1bGF0b3IKLSAgcHJvY2Vzc29yICp0dXRvcmlhbC5DYWxjdWxhdG9yUHJvY2Vzc29yCi19Ci0KLWZ1bmMgTmV3R29TZXJ2ZXIoKSAqR29TZXJ2ZXIgewotICBoYW5kbGVyIDo9IE5ld0NhbGN1bGF0b3JIYW5kbGVyKCkKLSAgcHJvY2Vzc29yIDo9IHR1dG9yaWFsLk5ld0NhbGN1bGF0b3JQcm9jZXNzb3IoaGFuZGxlcikKLSAgcmV0dXJuICZHb1NlcnZlcntoYW5kbGVyOmhhbmRsZXIsIHByb2Nlc3Nvcjpwcm9jZXNzb3J9Ci19Ci0KLWZ1bmMgU2ltcGxlKHByb2Nlc3NvciAqdHV0b3JpYWwuQ2FsY3VsYXRvclByb2Nlc3NvciwgdHJhbnNwb3J0RmFjdG9yeSB0aHJpZnQuVFRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSwgY2ggY2hhbiBpbnQpIHsKLSAgYWRkciwgZXJyIDo9IG5ldC5SZXNvbHZlVENQQWRkcigibG9jYWxob3N0OjkwOTAiKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICBmbXQuUHJpbnQoIkVycm9yIHJlc29sdmluZyBhZGRyZXNzOiAiLCBlcnIuU3RyaW5nKCksICJcbiIpCi0gICAgcmV0dXJuCi0gIH0KLSAgc2VydmVyVHJhbnNwb3J0LCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJ2ZXJTb2NrZXRBZGRyKGFkZHIpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIGZtdC5QcmludCgiRXJyb3IgY3JlYXRpbmcgc2VydmVyIHNvY2tldDogIiwgZXJyLlN0cmluZygpLCAiXG4iKQotICAgIHJldHVybgotICB9Ci0gIHNlcnZlciA6PSB0aHJpZnQuTmV3VFNpbXBsZVNlcnZlcjQocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkKLSAgLy8gVXNlIHRoaXMgZm9yIGEgbXVsdGl0aHJlYWRlZCBzZXJ2ZXIKLSAgLy8gVFNlcnZlciBzZXJ2ZXIgPSBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIobmV3IFRUaHJlYWRQb29sU2VydmVyLkFyZ3Moc2VydmVyVHJhbnNwb3J0KS5wcm9jZXNzb3IocHJvY2Vzc29yKSk7Ci0gIAotICBmbXQuUHJpbnQoIlN0YXJ0aW5nIHRoZSBzaW1wbGUgc2VydmVyLi4uIG9uICIsIGFkZHIsICJcbiIpCi0gIGZvciB7Ci0gICAgZXJyID0gc2VydmVyLlNlcnZlKCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIGZtdC5QcmludCgiRXJyb3IgZHVyaW5nIHNpbXBsZSBzZXJ2ZXI6ICIsIGVyci5TdHJpbmcoKSwgIlxuIikKLSAgICAgIHJldHVybgotICAgIH0KLSAgfQotICBmbXQuUHJpbnQoIkRvbmUgd2l0aCB0aGUgc2ltcGxlIHNlcnZlclxuIikKLSAgY2ggPC0gMQotfQotCi1mdW5jIFNlY3VyZShwcm9jZXNzb3IgKnR1dG9yaWFsLkNhbGN1bGF0b3JQcm9jZXNzb3IpIHsKLSAgYWRkciwgXyA6PSBuZXQuUmVzb2x2ZVRDUEFkZHIoImxvY2FsaG9zdDo5MDkxIikKLSAgc2VydmVyVHJhbnNwb3J0LCBfIDo9IHRocmlmdC5OZXdUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXRBZGRyKGFkZHIpCi0gIHNlcnZlciA6PSB0aHJpZnQuTmV3VFNpbXBsZVNlcnZlcjIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQpCi0gIGZtdC5QcmludCgiU3RhcnRpbmcgdGhlIHNlY3VyZSBzZXJ2ZXIuLi4gb24gIiwgYWRkciwgIlxuIikKLSAgc2VydmVyLlNlcnZlKCkKLSAgZm10LlByaW50KCJEb25lIHdpdGggdGhlIHNlY3VyZSBzZXJ2ZXJcbiIpCi19Ci0KLWZ1bmMgUnVuU2VydmVyKHRyYW5zcG9ydEZhY3RvcnkgdGhyaWZ0LlRUcmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkgdGhyaWZ0LlRQcm90b2NvbEZhY3RvcnkpIHsKLSAgc2VydmVyIDo9IE5ld0dvU2VydmVyKCkKLSAgY2ggOj0gbWFrZShjaGFuIGludCkKLSAgZ28gU2ltcGxlKHNlcnZlci5wcm9jZXNzb3IsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgY2gpCi0gIC8vZ28gU2VjdXJlKHNlcnZlci5wcm9jZXNzb3IpCi0gIF8gPSA8LSBjaAotfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZ28vc3JjL01ha2VmaWxlIGIvdHV0b3JpYWwvZ28vc3JjL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2FjYmNhLi4wMDAwMDAwCi0tLSBhL3R1dG9yaWFsL2dvL3NyYy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMDkgVGhlIEdvIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlCi0jIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotaW5jbHVkZSAkKEdPUk9PVCkvc3JjL01ha2UuaW5jCi0KLWFsbDogaW5zdGFsbAotCi1UQVJHPVR1dG9yaWFsU2VydmVyQ2xpZW50Ci0KLURJUlM9XAotCi1HT0ZJTEVTPVwKLSAgQ2FsY3VsYXRvckhhbmRsZXIuZ29cCi0gIEdvQ2xpZW50LmdvXAotICBHb1NlcnZlci5nb1wKLSAgbWFpbi5nbwotCi0taW5jbHVkZSAuLi9NYWtlLmRlcHMKLQotaW5jbHVkZSAkKEdPUk9PVCkvc3JjL01ha2UuY21kCi0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2dvL3NyYy9jbGllbnQuZ28gYi90dXRvcmlhbC9nby9zcmMvY2xpZW50LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZWJlMDAKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9nby9zcmMvY2xpZW50LmdvCkBAIC0wLDAgKzEsMTA4IEBACitwYWNrYWdlIG1haW4KKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJjcnlwdG8vdGxzIgorCSJmbXQiCisJInR1dG9yaWFsIgorCisJImdpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28vdGhyaWZ0IgorKQorCit2YXIgZGVmYXVsdEN0eCA9IGNvbnRleHQuQmFja2dyb3VuZCgpCisKK2Z1bmMgaGFuZGxlQ2xpZW50KGNsaWVudCAqdHV0b3JpYWwuQ2FsY3VsYXRvckNsaWVudCkgKGVyciBlcnJvcikgeworCWNsaWVudC5QaW5nKGRlZmF1bHRDdHgpCisJZm10LlByaW50bG4oInBpbmcoKSIpCisKKwlzdW0sIF8gOj0gY2xpZW50LkFkZChkZWZhdWx0Q3R4LCAxLCAxKQorCWZtdC5QcmludCgiMSsxPSIsIHN1bSwgIlxuIikKKworCXdvcmsgOj0gdHV0b3JpYWwuTmV3V29yaygpCisJd29yay5PcCA9IHR1dG9yaWFsLk9wZXJhdGlvbl9ESVZJREUKKwl3b3JrLk51bTEgPSAxCisJd29yay5OdW0yID0gMAorCXF1b3RpZW50LCBlcnIgOj0gY2xpZW50LkNhbGN1bGF0ZShkZWZhdWx0Q3R4LCAxLCB3b3JrKQorCWlmIGVyciAhPSBuaWwgeworCQlzd2l0Y2ggdiA6PSBlcnIuKHR5cGUpIHsKKwkJY2FzZSAqdHV0b3JpYWwuSW52YWxpZE9wZXJhdGlvbjoKKwkJCWZtdC5QcmludGxuKCJJbnZhbGlkIG9wZXJhdGlvbjoiLCB2KQorCQlkZWZhdWx0OgorCQkJZm10LlByaW50bG4oIkVycm9yIGR1cmluZyBvcGVyYXRpb246IiwgZXJyKQorCQl9CisJCXJldHVybiBlcnIKKwl9IGVsc2UgeworCQlmbXQuUHJpbnRsbigiV2hvYSB3ZSBjYW4gZGl2aWRlIGJ5IDAgd2l0aCBuZXcgdmFsdWU6IiwgcXVvdGllbnQpCisJfQorCisJd29yay5PcCA9IHR1dG9yaWFsLk9wZXJhdGlvbl9TVUJUUkFDVAorCXdvcmsuTnVtMSA9IDE1CisJd29yay5OdW0yID0gMTAKKwlkaWZmLCBlcnIgOj0gY2xpZW50LkNhbGN1bGF0ZShkZWZhdWx0Q3R4LCAxLCB3b3JrKQorCWlmIGVyciAhPSBuaWwgeworCQlzd2l0Y2ggdiA6PSBlcnIuKHR5cGUpIHsKKwkJY2FzZSAqdHV0b3JpYWwuSW52YWxpZE9wZXJhdGlvbjoKKwkJCWZtdC5QcmludGxuKCJJbnZhbGlkIG9wZXJhdGlvbjoiLCB2KQorCQlkZWZhdWx0OgorCQkJZm10LlByaW50bG4oIkVycm9yIGR1cmluZyBvcGVyYXRpb246IiwgZXJyKQorCQl9CisJCXJldHVybiBlcnIKKwl9IGVsc2UgeworCQlmbXQuUHJpbnQoIjE1LTEwPSIsIGRpZmYsICJcbiIpCisJfQorCisJbG9nLCBlcnIgOj0gY2xpZW50LkdldFN0cnVjdChkZWZhdWx0Q3R4LCAxKQorCWlmIGVyciAhPSBuaWwgeworCQlmbXQuUHJpbnRsbigiVW5hYmxlIHRvIGdldCBzdHJ1Y3Q6IiwgZXJyKQorCQlyZXR1cm4gZXJyCisJfSBlbHNlIHsKKwkJZm10LlByaW50bG4oIkNoZWNrIGxvZzoiLCBsb2cuVmFsdWUpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyBydW5DbGllbnQodHJhbnNwb3J0RmFjdG9yeSB0aHJpZnQuVFRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSwgYWRkciBzdHJpbmcsIHNlY3VyZSBib29sKSBlcnJvciB7CisJdmFyIHRyYW5zcG9ydCB0aHJpZnQuVFRyYW5zcG9ydAorCXZhciBlcnIgZXJyb3IKKwlpZiBzZWN1cmUgeworCQljZmcgOj0gbmV3KHRscy5Db25maWcpCisJCWNmZy5JbnNlY3VyZVNraXBWZXJpZnkgPSB0cnVlCisJCXRyYW5zcG9ydCwgZXJyID0gdGhyaWZ0Lk5ld1RTU0xTb2NrZXQoYWRkciwgY2ZnKQorCX0gZWxzZSB7CisJCXRyYW5zcG9ydCwgZXJyID0gdGhyaWZ0Lk5ld1RTb2NrZXQoYWRkcikKKwl9CisJaWYgZXJyICE9IG5pbCB7CisJCWZtdC5QcmludGxuKCJFcnJvciBvcGVuaW5nIHNvY2tldDoiLCBlcnIpCisJCXJldHVybiBlcnIKKwl9CisJdHJhbnNwb3J0LCBlcnIgPSB0cmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydCh0cmFuc3BvcnQpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJZGVmZXIgdHJhbnNwb3J0LkNsb3NlKCkKKwlpZiBlcnIgOj0gdHJhbnNwb3J0Lk9wZW4oKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaXByb3QgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCkKKwlvcHJvdCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCXJldHVybiBoYW5kbGVDbGllbnQodHV0b3JpYWwuTmV3Q2FsY3VsYXRvckNsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KGlwcm90LCBvcHJvdCkpKQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZ28vc3JjL2hhbmRsZXIuZ28gYi90dXRvcmlhbC9nby9zcmMvaGFuZGxlci5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzBlZWQwCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZ28vc3JjL2hhbmRsZXIuZ28KQEAgLTAsMCArMSwxMDIgQEAKK3BhY2thZ2UgbWFpbgorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImZtdCIKKwkic2hhcmVkIgorCSJzdHJjb252IgorCSJ0dXRvcmlhbCIKKykKKwordHlwZSBDYWxjdWxhdG9ySGFuZGxlciBzdHJ1Y3QgeworCWxvZyBtYXBbaW50XSpzaGFyZWQuU2hhcmVkU3RydWN0Cit9CisKK2Z1bmMgTmV3Q2FsY3VsYXRvckhhbmRsZXIoKSAqQ2FsY3VsYXRvckhhbmRsZXIgeworCXJldHVybiAmQ2FsY3VsYXRvckhhbmRsZXJ7bG9nOiBtYWtlKG1hcFtpbnRdKnNoYXJlZC5TaGFyZWRTdHJ1Y3QpfQorfQorCitmdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgUGluZyhjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJZm10LlByaW50KCJwaW5nKClcbiIpCisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgQWRkKGN0eCBjb250ZXh0LkNvbnRleHQsIG51bTEgaW50MzIsIG51bTIgaW50MzIpIChyZXR2YWwxNyBpbnQzMiwgZXJyIGVycm9yKSB7CisJZm10LlByaW50KCJhZGQoIiwgbnVtMSwgIiwiLCBudW0yLCAiKVxuIikKKwlyZXR1cm4gbnVtMSArIG51bTIsIG5pbAorfQorCitmdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgQ2FsY3VsYXRlKGN0eCBjb250ZXh0LkNvbnRleHQsIGxvZ2lkIGludDMyLCB3ICp0dXRvcmlhbC5Xb3JrKSAodmFsIGludDMyLCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnQoImNhbGN1bGF0ZSgiLCBsb2dpZCwgIiwgeyIsIHcuT3AsICIsIiwgdy5OdW0xLCAiLCIsIHcuTnVtMiwgIn0pXG4iKQorCXN3aXRjaCB3Lk9wIHsKKwljYXNlIHR1dG9yaWFsLk9wZXJhdGlvbl9BREQ6CisJCXZhbCA9IHcuTnVtMSArIHcuTnVtMgorCQlicmVhaworCWNhc2UgdHV0b3JpYWwuT3BlcmF0aW9uX1NVQlRSQUNUOgorCQl2YWwgPSB3Lk51bTEgLSB3Lk51bTIKKwkJYnJlYWsKKwljYXNlIHR1dG9yaWFsLk9wZXJhdGlvbl9NVUxUSVBMWToKKwkJdmFsID0gdy5OdW0xICogdy5OdW0yCisJCWJyZWFrCisJY2FzZSB0dXRvcmlhbC5PcGVyYXRpb25fRElWSURFOgorCQlpZiB3Lk51bTIgPT0gMCB7CisJCQlvdWNoIDo9IHR1dG9yaWFsLk5ld0ludmFsaWRPcGVyYXRpb24oKQorCQkJb3VjaC5XaGF0T3AgPSBpbnQzMih3Lk9wKQorCQkJb3VjaC5XaHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIgorCQkJZXJyID0gb3VjaAorCQkJcmV0dXJuCisJCX0KKwkJdmFsID0gdy5OdW0xIC8gdy5OdW0yCisJCWJyZWFrCisJZGVmYXVsdDoKKwkJb3VjaCA6PSB0dXRvcmlhbC5OZXdJbnZhbGlkT3BlcmF0aW9uKCkKKwkJb3VjaC5XaGF0T3AgPSBpbnQzMih3Lk9wKQorCQlvdWNoLldoeSA9ICJVbmtub3duIG9wZXJhdGlvbiIKKwkJZXJyID0gb3VjaAorCQlyZXR1cm4KKwl9CisJZW50cnkgOj0gc2hhcmVkLk5ld1NoYXJlZFN0cnVjdCgpCisJZW50cnkuS2V5ID0gbG9naWQKKwllbnRyeS5WYWx1ZSA9IHN0cmNvbnYuSXRvYShpbnQodmFsKSkKKwlrIDo9IGludChsb2dpZCkKKwkvKgorCSAgIG9sZHZhbHVlLCBleGlzdHMgOj0gcC5sb2dba10KKwkgICBpZiBleGlzdHMgeworCSAgICAgZm10LlByaW50KCJSZXBsYWNpbmcgIiwgb2xkdmFsdWUsICIgd2l0aCAiLCBlbnRyeSwgIiBmb3Iga2V5ICIsIGssICJcbiIpCisJICAgfSBlbHNlIHsKKwkgICAgIGZtdC5QcmludCgiQWRkaW5nICIsIGVudHJ5LCAiIGZvciBrZXkgIiwgaywgIlxuIikKKwkgICB9CisJKi8KKwlwLmxvZ1trXSA9IGVudHJ5CisJcmV0dXJuIHZhbCwgZXJyCit9CisKK2Z1bmMgKHAgKkNhbGN1bGF0b3JIYW5kbGVyKSBHZXRTdHJ1Y3QoY3R4IGNvbnRleHQuQ29udGV4dCwga2V5IGludDMyKSAoKnNoYXJlZC5TaGFyZWRTdHJ1Y3QsIGVycm9yKSB7CisJZm10LlByaW50KCJnZXRTdHJ1Y3QoIiwga2V5LCAiKVxuIikKKwl2LCBfIDo9IHAubG9nW2ludChrZXkpXQorCXJldHVybiB2LCBuaWwKK30KKworZnVuYyAocCAqQ2FsY3VsYXRvckhhbmRsZXIpIFppcChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJZm10LlByaW50KCJ6aXAoKVxuIikKKwlyZXR1cm4gbmlsCit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9zcmMvbWFpbi5nbyBiL3R1dG9yaWFsL2dvL3NyYy9tYWluLmdvCmluZGV4IDMwYjVkNTIuLjc3MzBkN2IgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2dvL3NyYy9tYWluLmdvCisrKyBiL3R1dG9yaWFsL2dvL3NyYy9tYWluLmdvCkBAIC0xLDUgKzEsNCBAQAotcGFja2FnZSBtYWluOwotCitwYWNrYWdlIG1haW4KIAogLyoKICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKQEAgLTIwLDY3ICsxOSw2NCBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotCiBpbXBvcnQgKAotICAiZmxhZyIKLSAgImZtdCIKLSAgIm9zIgotICAidGhyaWZ0IgorCSJmbGFnIgorCSJmbXQiCisJImdpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28vdGhyaWZ0IgorCSJvcyIKICkKIAogZnVuYyBVc2FnZSgpIHsKLSAgZm10LkZwcmludChvcy5TdGRlcnIsICJVc2FnZSBvZiAiLCBvcy5BcmdzWzBdLCAiIDwtLXNlcnZlciB8IC0tY2xpZW50PjpcbiIpCi0gIGZsYWcuUHJpbnREZWZhdWx0cygpCi0gIGZtdC5GcHJpbnQob3MuU3RkZXJyLCAiXG4iKQotICBvcy5FeGl0KDApCisJZm10LkZwcmludChvcy5TdGRlcnIsICJVc2FnZSBvZiAiLCBvcy5BcmdzWzBdLCAiOlxuIikKKwlmbGFnLlByaW50RGVmYXVsdHMoKQorCWZtdC5GcHJpbnQob3MuU3RkZXJyLCAiXG4iKQogfQogCiBmdW5jIG1haW4oKSB7Ci0gIGZsYWcuVXNhZ2UgPSBVc2FnZQotICB2YXIgY2xpZW50IGJvb2wKLSAgdmFyIHNlcnZlciBib29sCi0gIHZhciBwcm90b2NvbCBzdHJpbmcKLSAgdmFyIGZyYW1lZCBib29sCi0gIHZhciB1c2VIdHRwIGJvb2wKLSAgdmFyIGhlbHAgYm9vbAotICAKLSAgZmxhZy5Cb29sVmFyKCZjbGllbnQsICJjbGllbnQiLCBmYWxzZSwgIlJ1biBjbGllbnQiKQotICBmbGFnLkJvb2xWYXIoJnNlcnZlciwgInNlcnZlciIsIGZhbHNlLCAiUnVuIHNlcnZlciIpCi0gIGZsYWcuU3RyaW5nVmFyKCZwcm90b2NvbCwgIlAiLCAiYmluYXJ5IiwgIlNwZWNpZnkgdGhlIHByb3RvY29sIChiaW5hcnksIGNvbXBhY3QsIHNpbXBsZWpzb24pIikKLSAgZmxhZy5Cb29sVmFyKCZmcmFtZWQsICJmcmFtZWQiLCBmYWxzZSwgIlVzZSBmcmFtZWQgdHJhbnNwb3J0IikKLSAgZmxhZy5Cb29sVmFyKCZ1c2VIdHRwLCAiaHR0cCIsIGZhbHNlLCAiVXNlIGh0dHAiKQotICBmbGFnLkJvb2xWYXIoJmhlbHAsICJoZWxwIiwgZmFsc2UsICJTZWUgdXNhZ2Ugc3RyaW5nIikKLSAgZmxhZy5QYXJzZSgpCi0gIGlmIGhlbHAgfHwgKGNsaWVudCAmJiBzZXJ2ZXIpIHx8ICEoY2xpZW50IHx8IHNlcnZlcikgewotICAgIGZtdC5QcmludCgiZmxhZy5OQXJnKCkgPT0gIiwgZmxhZy5OQXJnKCksICJcbiIpCi0gICAgZmxhZy5Vc2FnZSgpCi0gIH0KLSAgdmFyIHByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeQotICBzd2l0Y2ggcHJvdG9jb2wgewotICBjYXNlICJjb21wYWN0IjoKLSAgICBwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKQotICBjYXNlICJzaW1wbGVqc29uIjoKLSAgICBwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkoKQotICBjYXNlICJqc29uIjoKLSAgICBwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKQotICBjYXNlICJiaW5hcnkiLCAiIjoKLSAgICBwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKQotICBkZWZhdWx0OgotICAgIGZtdC5GcHJpbnQob3MuU3RkZXJyLCAiSW52YWxpZCBwcm90b2NvbCBzcGVjaWZpZWQiLCBwcm90b2NvbCwgIlxuIikKLSAgICBVc2FnZSgpCi0gICAgb3MuRXhpdCgxKQotICB9Ci0gIHRyYW5zcG9ydEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkKLSAgaWYgZnJhbWVkIHsKLSAgICB0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRyYW5zcG9ydEZhY3RvcnkpCi0gIH0KLSAgCi0gIGlmKGNsaWVudCkgewotICAgIFJ1bkNsaWVudCh0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCi0gIH0gZWxzZSBpZihzZXJ2ZXIpIHsKLSAgICBSdW5TZXJ2ZXIodHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQotICB9IGVsc2UgewotICAgIGZsYWcuVXNhZ2UoKQotICB9Ci0gIG9zLkV4aXQoMCkKKwlmbGFnLlVzYWdlID0gVXNhZ2UKKwlzZXJ2ZXIgOj0gZmxhZy5Cb29sKCJzZXJ2ZXIiLCBmYWxzZSwgIlJ1biBzZXJ2ZXIiKQorCXByb3RvY29sIDo9IGZsYWcuU3RyaW5nKCJQIiwgImJpbmFyeSIsICJTcGVjaWZ5IHRoZSBwcm90b2NvbCAoYmluYXJ5LCBjb21wYWN0LCBqc29uLCBzaW1wbGVqc29uKSIpCisJZnJhbWVkIDo9IGZsYWcuQm9vbCgiZnJhbWVkIiwgZmFsc2UsICJVc2UgZnJhbWVkIHRyYW5zcG9ydCIpCisJYnVmZmVyZWQgOj0gZmxhZy5Cb29sKCJidWZmZXJlZCIsIGZhbHNlLCAiVXNlIGJ1ZmZlcmVkIHRyYW5zcG9ydCIpCisJYWRkciA6PSBmbGFnLlN0cmluZygiYWRkciIsICJsb2NhbGhvc3Q6OTA5MCIsICJBZGRyZXNzIHRvIGxpc3RlbiB0byIpCisJc2VjdXJlIDo9IGZsYWcuQm9vbCgic2VjdXJlIiwgZmFsc2UsICJVc2UgdGxzIHNlY3VyZSB0cmFuc3BvcnQiKQorCisJZmxhZy5QYXJzZSgpCisKKwl2YXIgcHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5CisJc3dpdGNoICpwcm90b2NvbCB7CisJY2FzZSAiY29tcGFjdCI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpCisJY2FzZSAic2ltcGxlanNvbiI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSgpCisJY2FzZSAianNvbiI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUSlNPTlByb3RvY29sRmFjdG9yeSgpCisJY2FzZSAiYmluYXJ5IiwgIiI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpCisJZGVmYXVsdDoKKwkJZm10LkZwcmludChvcy5TdGRlcnIsICJJbnZhbGlkIHByb3RvY29sIHNwZWNpZmllZCIsIHByb3RvY29sLCAiXG4iKQorCQlVc2FnZSgpCisJCW9zLkV4aXQoMSkKKwl9CisKKwl2YXIgdHJhbnNwb3J0RmFjdG9yeSB0aHJpZnQuVFRyYW5zcG9ydEZhY3RvcnkKKwlpZiAqYnVmZmVyZWQgeworCQl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoODE5MikKKwl9IGVsc2UgeworCQl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkKKwl9CisKKwlpZiAqZnJhbWVkIHsKKwkJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0cmFuc3BvcnRGYWN0b3J5KQorCX0KKworCWlmICpzZXJ2ZXIgeworCQlpZiBlcnIgOj0gcnVuU2VydmVyKHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgKmFkZHIsICpzZWN1cmUpOyBlcnIgIT0gbmlsIHsKKwkJCWZtdC5QcmludGxuKCJlcnJvciBydW5uaW5nIHNlcnZlcjoiLCBlcnIpCisJCX0KKwl9IGVsc2UgeworCQlpZiBlcnIgOj0gcnVuQ2xpZW50KHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgKmFkZHIsICpzZWN1cmUpOyBlcnIgIT0gbmlsIHsKKwkJCWZtdC5QcmludGxuKCJlcnJvciBydW5uaW5nIGNsaWVudDoiLCBlcnIpCisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9zcmMvc2VydmVyLmdvIGIvdHV0b3JpYWwvZ28vc3JjL3NlcnZlci5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTcwOGViCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZ28vc3JjL3NlcnZlci5nbwpAQCAtMCwwICsxLDU0IEBACitwYWNrYWdlIG1haW4KKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgKAorCSJjcnlwdG8vdGxzIgorCSJmbXQiCisJImdpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28vdGhyaWZ0IgorCSJ0dXRvcmlhbCIKKykKKworZnVuYyBydW5TZXJ2ZXIodHJhbnNwb3J0RmFjdG9yeSB0aHJpZnQuVFRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSwgYWRkciBzdHJpbmcsIHNlY3VyZSBib29sKSBlcnJvciB7CisJdmFyIHRyYW5zcG9ydCB0aHJpZnQuVFNlcnZlclRyYW5zcG9ydAorCXZhciBlcnIgZXJyb3IKKwlpZiBzZWN1cmUgeworCQljZmcgOj0gbmV3KHRscy5Db25maWcpCisJCWlmIGNlcnQsIGVyciA6PSB0bHMuTG9hZFg1MDlLZXlQYWlyKCJzZXJ2ZXIuY3J0IiwgInNlcnZlci5rZXkiKTsgZXJyID09IG5pbCB7CisJCQljZmcuQ2VydGlmaWNhdGVzID0gYXBwZW5kKGNmZy5DZXJ0aWZpY2F0ZXMsIGNlcnQpCisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwkJdHJhbnNwb3J0LCBlcnIgPSB0aHJpZnQuTmV3VFNTTFNlcnZlclNvY2tldChhZGRyLCBjZmcpCisJfSBlbHNlIHsKKwkJdHJhbnNwb3J0LCBlcnIgPSB0aHJpZnQuTmV3VFNlcnZlclNvY2tldChhZGRyKQorCX0KKwkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlmbXQuUHJpbnRmKCIlVFxuIiwgdHJhbnNwb3J0KQorCWhhbmRsZXIgOj0gTmV3Q2FsY3VsYXRvckhhbmRsZXIoKQorCXByb2Nlc3NvciA6PSB0dXRvcmlhbC5OZXdDYWxjdWxhdG9yUHJvY2Vzc29yKGhhbmRsZXIpCisJc2VydmVyIDo9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCisJZm10LlByaW50bG4oIlN0YXJ0aW5nIHRoZSBzaW1wbGUgc2VydmVyLi4uIG9uICIsIGFkZHIpCisJcmV0dXJuIHNlcnZlci5TZXJ2ZSgpCit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9oYXhlL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvaGF4ZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmYyNzEzCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaGF4ZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDk3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworQklOX0NQUCA9IGJpbi9NYWluLWRlYnVnCitCSU5fUEhQID0gYmluL3BocC9NYWluLWRlYnVnLnBocAorQklOX1BIUF9XRUIgPSBiaW4vcGhwLXdlYi1zZXJ2ZXIvTWFpbi1kZWJ1Zy5waHAKKworZ2VuLWhheGUvdHV0b3JpYWwvY2FsY3VsYXRvci5oeCBnZW4taGF4ZS9zaGFyZWQvc2hhcmVkX3NlcnZpY2UuaHg6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGhheGUgLXIgJDwKKworYWxsLWxvY2FsOiAkKEJJTl9DUFApICQoQklOX1BIUCkgJChCSU5fUEhQX1dFQikKKworY2hlY2s6IGdlbi1oYXhlL3R1dG9yaWFsL2NhbGN1bGF0b3IuaHgKKworJChCSU5fQ1BQKTogXAorCQlzcmMvKi5oeCBcCisJCS4uLy4uL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC8qKi8qLmh4IFwKKwkJZ2VuLWhheGUvdHV0b3JpYWwvY2FsY3VsYXRvci5oeAorCSQoSEFYRSkgLS1jd2QgLiAgY3BwLmh4bWwKKworJChCSU5fUEhQKTogXAorCQlzcmMvKi5oeCBcCisJCS4uLy4uL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC8qKi8qLmh4IFwKKwkJZ2VuLWhheGUvdHV0b3JpYWwvY2FsY3VsYXRvci5oeAorCSQoSEFYRSkgLS1jd2QgLiAgcGhwLmh4bWwKKworJChCSU5fUEhQX1dFQik6IFwKKwkJc3JjLyouaHggXAorCQkuLi8uLi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvKiovKi5oeCBcCisJCWdlbi1oYXhlL3R1dG9yaWFsL2NhbGN1bGF0b3IuaHgKKwkkKEhBWEUpIC0tY3dkIC4gIHBocC13ZWItc2VydmVyLmh4bWwKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCSQoQklOX0NQUCkgc2VydmVyCisKK3R1dG9yaWFsc2VydmVyX3BocDogYWxsCisJcGhwIC1mICQoQklOX1BIUCkgc2VydmVyCisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwkkKEJJTl9DUFApCisKK3R1dG9yaWFsY2xpZW50X3BocDogYWxsCisJcGhwIC1mICQoQklOX1BIUCkgCisKK3R1dG9yaWFsc2VjdXJlc2VydmVyOiBhbGwKKwkkKEJJTl9DUFApIHNlcnZlciBzZWN1cmUKKwordHV0b3JpYWxzZWN1cmVzZXJ2ZXJfcGhwOiBhbGwKKwlwaHAgLWYgJChCSU5fUEhQKSBzZXJ2ZXIgc2VjdXJlCisKK3R1dG9yaWFsc2VjdXJlY2xpZW50OiBhbGwKKwkkKEJJTl9DUFApIHNlY3VyZQorCit0dXRvcmlhbHNlY3VyZWNsaWVudF9waHA6IGFsbAorCXBocCAtZiAkKEJJTl9QSFApIHNlY3VyZQorCit0dXRvcmlhbHNlcnZlcl9waHBfaHR0cDogYWxsCisJcGhwIC1TIDEyNy4wLjAuMTo5MDkwIHJvdXRlci5waHAKKwordHV0b3JpYWxjbGllbnRfaHR0cDogYWxsCisJJChCSU5fQ1BQKSBjbGllbnQgaHR0cAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4taGF4ZSBiaW4KKworRVhUUkFfRElTVCA9IFwKKwlzcmMgXAorCWNwcC5oeG1sIFwKKwljc2hhcnAuaHhtbCBcCisJZmxhc2guaHhtbCBcCisJamF2YS5oeG1sIFwKKwlqYXZhc2NyaXB0Lmh4bWwgXAorCXBocC13ZWItc2VydmVyLmh4bWwgXAorCW5la28uaHhtbCBcCisJcGhwLmh4bWwgXAorCXB5dGhvbi5oeG1sIFwKKwlyb3V0ZXIucGhwIFwKKwlwcm9qZWN0LmhpZGUgXAorCVR1dG9yaWFsLmh4cHJvaiBcCisJbWFrZV9hbGwuYmF0IFwKKwltYWtlX2FsbC5zaApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9UdXRvcmlhbC5oeHByb2ogYi90dXRvcmlhbC9oYXhlL1R1dG9yaWFsLmh4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTZmNjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaGF4ZS9UdXRvcmlhbC5oeHByb2oKQEAgLTAsMCArMSw2NyBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxwcm9qZWN0IHZlcnNpb249IjIiPgorICA8IS0tIE91dHB1dCBTV0Ygb3B0aW9ucyAtLT4KKyAgPG91dHB1dD4KKyAgICA8bW92aWUgb3V0cHV0VHlwZT0iQXBwbGljYXRpb24iIC8+CisgICAgPG1vdmllIGlucHV0PSIiIC8+CisgICAgPG1vdmllIHBhdGg9ImJpbi9IYXhlVHV0b3JpYWwiIC8+CisgICAgPG1vdmllIGZwcz0iMzAiIC8+CisgICAgPG1vdmllIHdpZHRoPSI4MDAiIC8+CisgICAgPG1vdmllIGhlaWdodD0iNjAwIiAvPgorICAgIDxtb3ZpZSB2ZXJzaW9uPSIxIiAvPgorICAgIDxtb3ZpZSBtaW5vclZlcnNpb249IjAiIC8+CisgICAgPG1vdmllIHBsYXRmb3JtPSJDKysiIC8+CisgICAgPG1vdmllIGJhY2tncm91bmQ9IiNGRkZGRkYiIC8+CisgIDwvb3V0cHV0PgorICA8IS0tIE90aGVyIGNsYXNzZXMgdG8gYmUgY29tcGlsZWQgaW50byB5b3VyIFNXRiAtLT4KKyAgPGNsYXNzcGF0aHM+CisgICAgPGNsYXNzIHBhdGg9InNyYyIgLz4KKyAgICA8Y2xhc3MgcGF0aD0iZ2VuLWhheGUiIC8+CisgICAgPGNsYXNzIHBhdGg9Ii4uLy4uL2xpYi9oYXhlL3NyYyIgLz4KKyAgPC9jbGFzc3BhdGhzPgorICA8IS0tIEJ1aWxkIG9wdGlvbnMgLS0+CisgIDxidWlsZD4KKyAgICA8b3B0aW9uIGRpcmVjdGl2ZXM9IiIgLz4KKyAgICA8b3B0aW9uIGZsYXNoU3RyaWN0PSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIG5vSW5saW5lT25EZWJ1Zz0iRmFsc2UiIC8+CisgICAgPG9wdGlvbiBtYWluQ2xhc3M9Ik1haW4iIC8+CisgICAgPG9wdGlvbiBlbmFibGVkZWJ1Zz0iRmFsc2UiIC8+CisgICAgPG9wdGlvbiBhZGRpdGlvbmFsPSIiIC8+CisgIDwvYnVpbGQ+CisgIDwhLS0gaGF4ZWxpYiBsaWJyYXJpZXMgLS0+CisgIDxoYXhlbGliPgorICAgIDwhLS0gZXhhbXBsZTogPGxpYnJhcnkgbmFtZT0iLi4uIiAvPiAtLT4KKyAgPC9oYXhlbGliPgorICA8IS0tIENsYXNzIGZpbGVzIHRvIGNvbXBpbGUgKG90aGVyIHJlZmVyZW5jZWQgY2xhc3NlcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgaW5jbHVkZWQpIC0tPgorICA8Y29tcGlsZVRhcmdldHM+CisgICAgPCEtLSBleGFtcGxlOiA8Y29tcGlsZSBwYXRoPSIuLi4iIC8+IC0tPgorICA8L2NvbXBpbGVUYXJnZXRzPgorICA8IS0tIFBhdGhzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgUHJvamVjdCBFeHBsb3JlciB0cmVlIC0tPgorICA8aGlkZGVuUGF0aHM+CisgICAgPGhpZGRlbiBwYXRoPSJvYmoiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJjcHAuaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9ImNzaGFycC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iZmxhc2guaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9ImphdmEuaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9ImphdmFzY3JpcHQuaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9Im1ha2VfYWxsLmJhdCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9Im1ha2VfYWxsLnNoIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iTWFrZWZpbGUuYW0iIC8+CisgICAgPGhpZGRlbiBwYXRoPSJuZWtvLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJwaHAuaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9InByb2plY3QuaGlkZSIgLz4KKyAgICA8aGlkZGVuIHBhdGg9InB5dGhvbi5oeG1sIiAvPgorICA8L2hpZGRlblBhdGhzPgorICA8IS0tIEV4ZWN1dGVkIGJlZm9yZSBidWlsZCAtLT4KKyAgPHByZUJ1aWxkQ29tbWFuZD50aHJpZnQgLXIgLWdlbiBoYXhlICAuLi90dXRvcmlhbC50aHJpZnQ8L3ByZUJ1aWxkQ29tbWFuZD4KKyAgPCEtLSBFeGVjdXRlZCBhZnRlciBidWlsZCAtLT4KKyAgPHBvc3RCdWlsZENvbW1hbmQgYWx3YXlzUnVuPSJGYWxzZSIgLz4KKyAgPCEtLSBPdGhlciBwcm9qZWN0IG9wdGlvbnMgLS0+CisgIDxvcHRpb25zPgorICAgIDxvcHRpb24gc2hvd0hpZGRlblBhdGhzPSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIHRlc3RNb3ZpZT0iVW5rbm93biIgLz4KKyAgICA8b3B0aW9uIHRlc3RNb3ZpZUNvbW1hbmQ9IiIgLz4KKyAgPC9vcHRpb25zPgorICA8IS0tIFBsdWdpbiBzdG9yYWdlIC0tPgorICA8c3RvcmFnZSAvPgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvY3BwLmh4bWwgYi90dXRvcmlhbC9oYXhlL2NwcC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZGI1MmQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL2NwcC5oeG1sCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNDUFAgdGFyZ2V0CistY3BwIGJpbgorCisjVG8gcHJvZHVjZSA2NCBiaXQgYmluYXJpZXMgdGhlIGZpbGUgc2hvdWxkIGRlZmluZSB0aGUgSFhDUFBfTTY0IGNvbXBpbGUgdmFyaWFibGU6CisjLUQgSFhDUFBfTTY0CisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9oYXhlL2NzaGFycC5oeG1sIGIvdHV0b3JpYWwvaGF4ZS9jc2hhcnAuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTVjMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaGF4ZS9jc2hhcnAuaHhtbApAQCAtMCwwICsxLDM4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgZ2VuLWhheGUKKy1jcCAuLi8uLi9saWIvaGF4ZS9zcmMKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjQ1NIQVJQIHRhcmdldAorLWNzIGJpbi9UdXRvcmlhbC5leGUKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvZmxhc2guaHhtbCBiL3R1dG9yaWFsL2hheGUvZmxhc2guaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWYwNTY4Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaGF4ZS9mbGFzaC5oeG1sCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNGbGFzaCB0YXJnZXQKKy1zd2YgYmluL1R1dG9yaWFsLnN3ZgorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworIyB3ZSBuZWVkIHNvbWUgZ29vZGllcyBmcm9tIHN5cy5uZXQKKyMgLS1tYWNybyBhbGxvd1BhY2thZ2UoInN5cyIpCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvamF2YS5oeG1sIGIvdHV0b3JpYWwvaGF4ZS9qYXZhLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxNTU2NQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvamF2YS5oeG1sCkBAIC0wLDAgKzEsMzggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYyAKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjSmF2YSB0YXJnZXQKKy1qYXZhIGJpbi9UdXRvcmlhbC5qYXIKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvamF2YXNjcmlwdC5oeG1sIGIvdHV0b3JpYWwvaGF4ZS9qYXZhc2NyaXB0Lmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJiMzg3NgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvamF2YXNjcmlwdC5oeG1sCkBAIC0wLDAgKzEsNDQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNKYXZhU2NyaXB0IHRhcmdldAorLWpzIGJpbi9UdXRvcmlhbC5qcworCisjWW91IGNhbiB1c2UgLUQgc291cmNlLW1hcC1jb250ZW50IChyZXF1aXJlcyBIYXhlIDMuMSspIHRvIGhhdmUgdGhlIC5oeCAKKyNmaWxlcyBkaXJlY3RseSBlbWJlZGRlZCBpbnRvIHRoZSBtYXAgZmlsZSwgdGhpcyB3YXkgeW91IG9ubHkgaGF2ZSB0byAKKyN1cGxvYWQgaXQsIGFuZCBpdCB3aWxsIGJlIGFsd2F5cyBpbiBzeW5jIHdpdGggdGhlIGNvbXBpbGVkIC5qcyBldmVuIGlmIAorI3lvdSBtb2RpZnkgeW91ciAuaHggZmlsZXMuCistRCBzb3VyY2UtbWFwLWNvbnRlbnQKKworI0dlbmVyYXRlIHNvdXJjZSBtYXAgYW5kIGFkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvbWFrZV9hbGwuYmF0IGIvdHV0b3JpYWwvaGF4ZS9tYWtlX2FsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU2ZGQxNQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvbWFrZV9hbGwuYmF0CkBAIC0wLDAgKzEsNjggQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworCitzZXRsb2NhbAoraWYgIiVIT01FRFJJVkUlIj09IiIgZ290byBNSVNTSU5HVkFSUworaWYgIiVIT01FUEFUSCUiPT0iIiBnb3RvIE1JU1NJTkdWQVJTCitpZiAiJUhBWEVQQVRIJSI9PSIiIGdvdG8gTk9USU5TVEFMTEVECisKK3NldCBwYXRoPSVIQVhFUEFUSCU7JUhBWEVQQVRIJVwuLlxuZWtvOyVwYXRoJQorCityZW0gIyBpbnZva2UgVGhyaWZ0IGNvbW5waWxlcgordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgIC4uXHR1dG9yaWFsLnRocmlmdAoraWYgZXJyb3JsZXZlbCAxIGdvdG8gU1RPUAorCityZW0gIyBpbnZva2UgSGF4ZSBjb21waWxlciBmb3IgYWxsIHRhcmdldHMKK2ZvciAlJWEgaW4gKCouaHhtbCkgZG8gKAorCXJlbSAqIGZpbHRlciBQeXRob24sIGFzIGl0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgSGF4ZSAzLjEuMyAoYnV0IHdpbGwgYmUgaW4gMy4xLjQpCisJaWYgbm90ICIlJWEiPT0icHl0aG9uLmh4bWwiICgKKwkJZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQllY2hvIEJ1aWxkaW5nICUlYSAuLi4KKwkJZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQloYXhlICAtLWN3ZCAuICAlJWEKKwkpCispCisKKworZWNoby4KK2VjaG8gZG9uZS4KK3BhdXNlCitnb3RvIGVvZgorCis6Tk9USU5TVEFMTEVECitlY2hvIEZBVEFMOiBFaXRoZXIgSGF4ZSBpcyBub3QgaW5zdGFsbGVkLCBvciB0aGUgSEFYRVBBVEggdmFyaWFibGUgaXMgbm90IHNldC4KK3BhdXNlCitnb3RvIGVvZgorCis6TUlTU0lOR1ZBUlMKK2VjaG8gRkFUQUw6IFVuYWJsZSB0byBsb2NhdGUgaG9tZSBmb2xkZXIuCitlY2hvLgorZWNobyBCb3RoIEhPTUVEUklWRSBhbmQgSE9NRVBBVEggbmVlZCB0byBiZSBzZXQgdG8gcG9pbnQgdG8geW91ciBIb21lIGZvbGRlci4KK2VjaG8gVGhlIGN1cnJlbnQgdmFsdWVzIGFyZToKK2VjaG8gSE9NRURSSVZFPSVIT01FRFJJVkUlCitlY2hvIEhPTUVQQVRIPSVIT01FUEFUSCUKK3BhdXNlCitnb3RvIGVvZgorCis6U1RPUAorcGF1c2UKK2dvdG8gZW9mCisKKzplb2YKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvbWFrZV9hbGwuc2ggYi90dXRvcmlhbC9oYXhlL21ha2VfYWxsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZTY1MGQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL21ha2VfYWxsLnNoCkBAIC0wLDAgKzEsNDEgQEAKKyMhL2Jpbi9zaAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgaW52b2tlIFRocmlmdCBjb21ucGlsZXIKK3RocmlmdCAtciAtZ2VuIGhheGUgIC4uL3R1dG9yaWFsLnRocmlmdAorCisjIG91dHB1dCBmb2xkZXIKK2lmIFsgISAtZCBiaW4gXTsgdGhlbgorICBta2RpciAgYmluCitmaQorCisjIGludm9rZSBIYXhlIGNvbXBvaWxlcgorZm9yIHRhcmdldCBpbiAqLmh4bWw7IGRvIAorICBlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGVjaG8gQnVpbGRpbmcgJHt0YXJnZXR9IC4uLgorICBlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGlmIFsgISAtZCBiaW4vJHt0YXJnZXR9IF07IHRoZW4KKyAgICBta2RpciAgYmluLyR7dGFyZ2V0fQorICBmaQorICBoYXhlICAtLWN3ZCAuICAke3RhcmdldH0gCitkb25lCisKKworI2VvZgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9uZWtvLmh4bWwgYi90dXRvcmlhbC9oYXhlL25la28uaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTYxZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaGF4ZS9uZWtvLmh4bWwKQEAgLTAsMCArMSwzOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI25la28gdGFyZ2V0CistbmVrbyBiaW4vVHV0b3JpYWwubgorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9waHAtd2ViLXNlcnZlci5oeG1sIGIvdHV0b3JpYWwvaGF4ZS9waHAtd2ViLXNlcnZlci5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NWE4NTIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL3BocC13ZWItc2VydmVyLmh4bWwKQEAgLTAsMCArMSw0MyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI1BIUCB0YXJnZXQKKy1waHAgYmluL3BocC13ZWItc2VydmVyLworLS1waHAtZnJvbnQgTWFpbi1kZWJ1Zy5waHAKKworI2RlZmluZXMKKy1EIHBocHdlYnNlcnZlcgorCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvcGhwLmh4bWwgYi90dXRvcmlhbC9oYXhlL3BocC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZjY4ODcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL3BocC5oeG1sCkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNQSFAgdGFyZ2V0CistcGhwIGJpbi9waHAvCistLXBocC1mcm9udCBNYWluLWRlYnVnLnBocAorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9oYXhlL3Byb2plY3QuaGlkZSBiL3R1dG9yaWFsL2hheGUvcHJvamVjdC5oaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNWQ0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL3Byb2plY3QuaGlkZQpAQCAtMCwwICsxLDEwNSBAQAoreworICAgICAidHlwZSIgOiAwCisgICAgLCJ0YXJnZXQiIDogNAorICAgICwibmFtZSIgOiAiQXBhY2hlIFRocmlmdCBUdXRvcmlhbCIKKyAgICAsIm1haW4iIDogbnVsbAorICAgICwicHJvamVjdFBhY2thZ2UiIDogIiIKKyAgICAsImNvbXBhbnkiIDogIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIgorICAgICwibGljZW5zZSIgOiAiQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIgorICAgICwidXJsIiA6ICJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiCisgICAgLCJ0YXJnZXREYXRhIiA6IFsKKyAgICAgICAgIHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiZmxhc2guaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAxCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogImJpbi9UdXRvcmlhbC5zd2YiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiamF2YXNjcmlwdC5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDEKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAiYmluXFxpbmRleC5odG1sIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogIm5la28uaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAyCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogIm5la28gYmluL1R1dG9yaWFsLm4iCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAicGhwLmh4bWwiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiY3BwLmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMgorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJiaW4vTWFpbi1kZWJ1Zy5leGUiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiamF2YS5oeG1sIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogImNzaGFycC5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAiYmluXFxUdXRvcmlhbC5leGVcXGJpblxcTWFpbi1EZWJ1Zy5leGUiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAicHl0aG9uLmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMgorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJweXRob24gYmluL1R1dG9yaWFsLnB5IgorICAgICAgICB9CisgICAgXQorICAgICwiZmlsZXMiIDogWworICAgICAgICAgeworICAgICAgICAgICAgICJwYXRoIiA6ICJzcmNcXG9yZ1xcYXBhY2hlXFx0aHJpZnRcXHNlcnZlclxcVFNlcnZlci5oeCIKKyAgICAgICAgICAgICwidXNlVGFicyIgOiB0cnVlCisgICAgICAgICAgICAsImluZGVudFNpemUiIDogNAorICAgICAgICAgICAgLCJmb2xkZWRSZWdpb25zIiA6IFsKKworICAgICAgICAgICAgXQorICAgICAgICAgICAgLCJhY3RpdmVMaW5lIiA6IDc2CisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aCIgOiAic3JjXFxvcmdcXGFwYWNoZVxcdGhyaWZ0XFxzZXJ2ZXJcXFRTaW1wbGVTZXJ2ZXIuaHgiCisgICAgICAgICAgICAsInVzZVRhYnMiIDogdHJ1ZQorICAgICAgICAgICAgLCJpbmRlbnRTaXplIiA6IDQKKyAgICAgICAgICAgICwiZm9sZGVkUmVnaW9ucyIgOiBbCisKKyAgICAgICAgICAgIF0KKyAgICAgICAgICAgICwiYWN0aXZlTGluZSIgOiAxMDAKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoIiA6ICJzcmNcXHNoYXJlZFxcU2hhcmVkU2VydmljZVByb2Nlc3Nvci5oeCIKKyAgICAgICAgICAgICwidXNlVGFicyIgOiB0cnVlCisgICAgICAgICAgICAsImluZGVudFNpemUiIDogNAorICAgICAgICAgICAgLCJmb2xkZWRSZWdpb25zIiA6IFsKKworICAgICAgICAgICAgXQorICAgICAgICAgICAgLCJhY3RpdmVMaW5lIiA6IDIwCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aCIgOiAic3JjXFx0dXRvcmlhbFxcQ2FsY3VsYXRvclByb2Nlc3Nvci5oeCIKKyAgICAgICAgICAgICwidXNlVGFicyIgOiB0cnVlCisgICAgICAgICAgICAsImluZGVudFNpemUiIDogNAorICAgICAgICAgICAgLCJmb2xkZWRSZWdpb25zIiA6IFsKKworICAgICAgICAgICAgXQorICAgICAgICAgICAgLCJhY3RpdmVMaW5lIiA6IDc5CisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aCIgOiAic3JjXFxNYWluLmh4IgorICAgICAgICAgICAgLCJ1c2VUYWJzIiA6IHRydWUKKyAgICAgICAgICAgICwiaW5kZW50U2l6ZSIgOiA0CisgICAgICAgICAgICAsImZvbGRlZFJlZ2lvbnMiIDogWworCisgICAgICAgICAgICBdCisgICAgICAgICAgICAsImFjdGl2ZUxpbmUiIDogMAorICAgICAgICB9CisgICAgXQorICAgICwiYWN0aXZlRmlsZSIgOiAic3JjXFxNYWluLmh4IgorICAgICwib3BlbkZMVGFyZ2V0IiA6IG51bGwKKyAgICAsIm9wZW5GTEJ1aWxkTW9kZSIgOiAiRGVidWciCisgICAgLCJydW5BY3Rpb25UeXBlIiA6IG51bGwKKyAgICAsInJ1bkFjdGlvblRleHQiIDogbnVsbAorICAgICwiYnVpbGRBY3Rpb25Db21tYW5kIiA6IG51bGwKKyAgICAsImhpZGRlbkl0ZW1zIiA6IFsKKworICAgIF0KKyAgICAsInNob3dIaWRkZW5JdGVtcyIgOiBmYWxzZQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvcHl0aG9uLmh4bWwgYi90dXRvcmlhbC9oYXhlL3B5dGhvbi5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYzE5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL3B5dGhvbi5oeG1sCkBAIC0wLDAgKzEsMzggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNQeXRob24gdGFyZ2V0CistcHl0aG9uIGJpbi9UdXRvcmlhbC5weQorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9yb3V0ZXIucGhwIGIvdHV0b3JpYWwvaGF4ZS9yb3V0ZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNDEzNWMKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL3JvdXRlci5waHAKQEAgLTAsMCArMSwzMSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0CisgKi8KKworCisKKy8vcm91dGVyIGZpbGUgdG8gcnVuIHRlc3Rpbmcgd2ViIHNlcnZlcgorCisvL3NldF90aW1lX2xpbWl0KDEpOworCityZXF1aXJlX29uY2UgIGRpcm5hbWUoX19GSUxFX18pIC4gJy9iaW4vcGhwLXdlYi1zZXJ2ZXIvTWFpbi1kZWJ1Zy5waHAnOworCisKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvc3JjL0NhbGN1bGF0b3JIYW5kbGVyLmh4IGIvdHV0b3JpYWwvaGF4ZS9zcmMvQ2FsY3VsYXRvckhhbmRsZXIuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk3NTJkYgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvc3JjL0NhbGN1bGF0b3JIYW5kbGVyLmh4CkBAIC0wLDAgKzEsMTAxIEBACivvu78vKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2U7CisKK2ltcG9ydCBoYXhlLmRzLkludE1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworaW1wb3J0IHR1dG9yaWFsLio7CitpbXBvcnQgc2hhcmVkLio7CisKKworY2xhc3MgQ2FsY3VsYXRvckhhbmRsZXIgaW1wbGVtZW50cyBDYWxjdWxhdG9yIHsKKworICAgIHByaXZhdGUgdmFyIGxvZyA9IG5ldyBJbnRNYXA8U2hhcmVkU3RydWN0PigpOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcGluZygpIDogVm9pZCB7CisgICAgICAgIHRyYWNlKCJwaW5nKCkiKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBmdW5jdGlvbiBhZGQoIG51bTEgOiBoYXhlLkludDMyLCBudW0yIDogaGF4ZS5JbnQzMikgOiBoYXhlLkludDMyIHsKKyAgICAgICAgdHJhY2UoJ2FkZCggJG51bTEsICRudW0yKScpOworICAgICAgICByZXR1cm4gbnVtMSArIG51bTI7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNhbGN1bGF0ZSggbG9naWQgOiBoYXhlLkludDMyLCB3b3JrIDogV29yaykgOiBoYXhlLkludDMyICB7CisgICAgICAgIHRyYWNlKCdjYWxjdWxhdGUoICRsb2dpZCwgJyt3b3JrLm9wKyIsIit3b3JrLm51bTErIiwiK3dvcmsubnVtMisiKSIpOworCisgICAgICAgIHZhciB2YWwgOiBoYXhlLkludDMyID0gMDsKKyAgICAgICAgc3dpdGNoICh3b3JrLm9wKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5BREQ6CisgICAgICAgICAgICAgICAgdmFsID0gd29yay5udW0xICsgd29yay5udW0yOworCisgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5TVUJUUkFDVDoKKyAgICAgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgLSB3b3JrLm51bTI7CisKKyAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLk1VTFRJUExZOgorICAgICAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAqIHdvcmsubnVtMjsKKworICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uRElWSURFOgorICAgICAgICAgICAgICAgIGlmICh3b3JrLm51bTIgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGlvLndoYXRPcCA9IHdvcmsub3A7CisgICAgICAgICAgICAgICAgICAgIGlvLndoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBpbzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFsID0gU3RkLmludCggd29yay5udW0xIC8gd29yay5udW0yKTsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB2YXIgaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgICAgICAgICAgIGlvLndoYXRPcCA9IHdvcmsub3A7CisgICAgICAgICAgICAgICAgaW8ud2h5ID0gIlVua25vd24gb3BlcmF0aW9uIjsKKyAgICAgICAgICAgICAgICB0aHJvdyBpbzsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBlbnRyeSA9IG5ldyBTaGFyZWRTdHJ1Y3QoKTsKKyAgICAgICAgZW50cnkua2V5ID0gbG9naWQ7CisgICAgICAgIGVudHJ5LnZhbHVlID0gJyR2YWwnOworICAgICAgICBsb2cuc2V0KGxvZ2lkLCBlbnRyeSk7CisKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3RydWN0KCBrZXkgOiBoYXhlLkludDMyKSA6IFNoYXJlZFN0cnVjdCB7CisgICAgICAgIHRyYWNlKCdnZXRTdHJ1Y3QoJGtleSknKTsKKyAgICAgICAgcmV0dXJuIGxvZy5nZXQoa2V5KTsKKyAgICB9CisKKyAgICAvLyBvbmV3YXkgbWV0aG9kLCAgbm8gYXJncworICAgIHB1YmxpYyBmdW5jdGlvbiB6aXAoKSA6IFZvaWQgeworICAgICAgICB0cmFjZSgiemlwKCkiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvc3JjL01haW4uaHggYi90dXRvcmlhbC9oYXhlL3NyYy9NYWluLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZWJlNzEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL3NyYy9NYWluLmh4CkBAIC0wLDAgKzEsMzc1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7CisKK2ltcG9ydCB0dXRvcmlhbC4qOworaW1wb3J0IHNoYXJlZC4qOworCisKK2VudW0gUHJvdCB7CisgICAgYmluYXJ5OworICAgIGpzb247Cit9CisKK2VudW0gVHJucyB7CisgICAgc29ja2V0OworICAgIGh0dHA7Cit9CisKK2NsYXNzIE1haW4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIHNlcnZlciA6IEJvb2wgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgZnJhbWVkIDogQm9vbCA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIHZhciBidWZmZXJlZCA6IEJvb2wgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgcHJvdCA6IFByb3QgPSBiaW5hcnk7CisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIHRybnMgOiBUcm5zID0gc29ja2V0OworCisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIHRhcmdldEhvc3QgOiBTdHJpbmcgPSAibG9jYWxob3N0IjsKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgdGFyZ2V0UG9ydCA6IEludCA9IDkwOTA7CisKKyAgICBzdGF0aWMgZnVuY3Rpb24gbWFpbigpIHsKKworICAgICAgICAjaWYgISAoZmxhc2ggfHwganMgfHwgcGhwd2Vic2VydmVyKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgICBQYXJzZUFyZ3MoKTsKKyAgICAgICAgfSBjYXRjaCAoZSA6IFN0cmluZykgeworICAgICAgICAgICAgdHJhY2UoZSk7CisgICAgICAgICAgICB0cmFjZShHZXRIZWxwKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgI2Vsc2VpZiAgcGhwd2Vic2VydmVyCisgICAgICAgIC8vZm9yY2luZyBzZXJ2ZXIKKyAgICAgICAgc2VydmVyID0gdHJ1ZTsKKyAgICAgICAgdHJucyA9IGh0dHA7CisgICAgICAgIGluaXRQaHBXZWJTZXJ2ZXIoKTsKKyAgICAgICAgLy9jaGVjayBtZXRob2QKKyAgICAgICAgaWYocGhwLldlYi5nZXRNZXRob2QoKSAhPSAnUE9TVCcpIHsKKyAgICAgICAgICBTeXMucHJpbnRsbignaHR0cCBlbmRwb2ludCBmb3IgdGhyaWZ0IHRlc3Qgc2VydmVyJyk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICNlbmQKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHNlcnZlcikKKyAgICAgICAgICAgICAgICBSdW5TZXJ2ZXIoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBSdW5DbGllbnQoKTsKKyAgICAgICAgfSBjYXRjaCAoZSA6IFN0cmluZykgeworICAgICAgICAgICAgdHJhY2UoZSk7CisgICAgICAgIH0KKworICAgICAgICB0cmFjZSgiQ29tcGxldGVkLiIpOworICAgIH0KKworICAgICNpZiBwaHB3ZWJzZXJ2ZXIKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpbml0UGhwV2ViU2VydmVyKCkKKyAgICB7CisgICAgICAgIC8vcmVtYXAgdHJhY2UgdG8gZXJyb3IgbG9nCisgICAgICAgIGhheGUuTG9nLnRyYWNlID0gZnVuY3Rpb24odjpEeW5hbWljLCA/aW5mb3M6aGF4ZS5Qb3NJbmZvcykKKyAgICAgICAgeworICAgICAgICAgIC8vIGhhbmRsZSB0cmFjZQorICAgICAgICAgIHZhciBuZXdWYWx1ZSA6IER5bmFtaWM7CisgICAgICAgICAgaWYgKGluZm9zICE9IG51bGwgJiYgaW5mb3MuY3VzdG9tUGFyYW1zIT1udWxsKSB7CisgICAgICAgICAgICB2YXIgZXh0cmE6U3RyaW5nID0gIiI7CisgICAgICAgICAgICBmb3IoIHYgaW4gaW5mb3MuY3VzdG9tUGFyYW1zICkKKyAgICAgICAgICAgICAgZXh0cmEgKz0gIiwiICsgdjsKKyAgICAgICAgICAgIG5ld1ZhbHVlID0gdiArIGV4dHJhOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG5ld1ZhbHVlID0gdjsKKyAgICAgICAgICB9CisgICAgICAgICAgdmFyIG1zZyA9IGluZm9zICE9IG51bGwgPyBpbmZvcy5maWxlTmFtZSArICc6JyArIGluZm9zLmxpbmVOdW1iZXIgKyAnOiAnIDogJyc7CisgICAgICAgICAgU3lzLnN0ZGVycigpLndyaXRlU3RyaW5nKCcke21zZ30ke25ld1ZhbHVlfVxuJyk7CisgICAgICAgIH0KKyAgICB9CisgICAgI2VuZAorCisKKyAgICAjaWYgISAoZmxhc2ggfHwganMpCisKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBHZXRIZWxwKCkgOiBTdHJpbmcgeworICAgICAgICByZXR1cm4gU3lzLmV4ZWN1dGFibGVQYXRoKCkrIiAgbW9kdXMgIHRybnNPcHRpb24gIHRyYW5zcG9ydCAgcHJvdG9jb2xcbiIKKyAgICAgICAgKyJPcHRpb25zOlxuIgorICAgICAgICArIiAgbW9kdXM6ICAgICAgIGNsaWVudCwgc2VydmVyICAgKGRlZmF1bHQ6IGNsaWVudClcbiIKKyAgICAgICAgKyIgIHRybnNPcHRpb246ICBmcmFtZWQsIGJ1ZmZlcmVkIChkZWZhdWx0OiBub25lKVxuIgorICAgICAgICArIiAgdHJhbnNwb3J0OiAgIHNvY2tldCwgaHR0cCAgICAgKGRlZmF1bHQ6IHNvY2tldClcbiIKKyAgICAgICAgKyIgIHByb3RvY29sOiAgICBiaW5hcnksIGpzb24gICAgIChkZWZhdWx0OiBiaW5hcnkpXG4iCisgICAgICAgICsiXG4iCisgICAgICAgICsiQWxsIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwuXG4iOworICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gUGFyc2VBcmdzKCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIHN0ZXAgPSAwOworICAgICAgICBmb3IgKGFyZyBpbiBTeXMuYXJncygpKSB7CisKKyAgICAgICAgICAgIC8vIHNlcnZlcnxjbGllbnQKKyAgICAgICAgICAgIHN3aXRjaChzdGVwKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgKytzdGVwOworICAgICAgICAgICAgICAgIGlmICggYXJnID09ICJjbGllbnQiKQorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggYXJnID09ICJzZXJ2ZXIiKQorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgJ3NlcnZlcicgb3IgJ2NsaWVudCciOworCisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgaWYgKCBhcmcgPT0gImZyYW1lZCIpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBhcmcgPT0gImJ1ZmZlcmVkIikgeworICAgICAgICAgICAgICAgICAgICBidWZmZXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggYXJnID09ICJzb2NrZXQiKSB7CisgICAgICAgICAgICAgICAgICAgIHRybnMgPSBzb2NrZXQ7CisgICAgICAgICAgICAgICAgICAgICsrc3RlcDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBhcmcgPT0gImh0dHAiKSB7CisgICAgICAgICAgICAgICAgICAgIHRybnMgPSBodHRwOworICAgICAgICAgICAgICAgICAgICArK3N0ZXA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgIlVua25vd24gdHJhbnNwb3J0ICIrYXJnOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGlmICggYXJnID09ICJiaW5hcnkiKSB7CisgICAgICAgICAgICAgICAgICAgIHByb3QgPSBiaW5hcnk7CisgICAgICAgICAgICAgICAgICAgICsrc3RlcDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBhcmcgPT0gImpzb24iKSB7CisgICAgICAgICAgICAgICAgICAgIHByb3QgPSBqc29uOworICAgICAgICAgICAgICAgICAgICArK3N0ZXA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgIlVua25vd24gcHJvdG9jb2wgIithcmc7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93ICJVbmV4cGVjdGVkIGFyZ3VtZW50ICIrYXJnOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGZyYW1lZCAmJiBidWZmZXJlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgiV046IGZyYW1lZCBzdXBlcnNlZGVzIGJ1ZmZlcmVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKworICAgICNlbmQKKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIENsaWVudFNldHVwKCkgOiBDYWxjdWxhdG9yIHsKKyAgICAgICAgIHRyYWNlKCJDbGllbnQgY29uZmlndXJhdGlvbjoiKTsKKworICAgICAgICAvLyBlbmRwb2ludCB0cmFuc3BvcnQKKyAgICAgICAgdmFyIHRyYW5zcG9ydCA6IFRUcmFuc3BvcnQ7CisgICAgICAgIHN3aXRjaCh0cm5zKQorICAgICAgICB7CisgICAgICAgIGNhc2Ugc29ja2V0OgorICAgICAgICAgICAgIHRyYWNlKCctIHNvY2tldCB0cmFuc3BvcnQgJHRhcmdldEhvc3Q6JHRhcmdldFBvcnQnKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUU29ja2V0KCB0YXJnZXRIb3N0LCB0YXJnZXRQb3J0KTsKKyAgICAgICAgY2FzZSBodHRwOgorICAgICAgICAgICAgdmFyIHVyaSA9ICdodHRwOi8vJHt0YXJnZXRIb3N0fToke3RhcmdldFBvcnR9JzsKKyAgICAgICAgICAgIHRyYWNlKCctIEhUVFAgdHJhbnNwb3J0ICR1cmknKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUSHR0cENsaWVudCh1cmkpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgIlVuaGFuZGxlZCB0cmFuc3BvcnQiOworICAgICAgICB9CisKKworICAgICAgICAvLyBvcHRpbmFsIGxheWVyZWQgdHJhbnNwb3J0CisgICAgICAgIGlmICggZnJhbWVkKSB7CisgICAgICAgICAgICB0cmFjZSgiLSBmcmFtZWQgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFuc3BvcnQpOworICAgICAgICB9IGVsc2UgaWYgKCBidWZmZXJlZCkgeworICAgICAgICAgICAgdHJhY2UoIi0gYnVmZmVyZWQgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zcG9ydCk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIHByb3RvY29sCisgICAgICAgIHZhciBwcm90b2NvbCA6IFRQcm90b2NvbDsKKyAgICAgICAgc3dpdGNoKHByb3QpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBiaW5hcnk6CisgICAgICAgICAgICAgdHJhY2UoIi0gYmluYXJ5IHByb3RvY29sIik7CisgICAgICAgICAgICAgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCB0cmFuc3BvcnQpOworICAgICAgICBjYXNlIGpzb246CisgICAgICAgICAgICAgdHJhY2UoIi0gSlNPTiBwcm90b2NvbCIpOworICAgICAgICAgICAgIHByb3RvY29sID0gbmV3IFRKU09OUHJvdG9jb2woIHRyYW5zcG9ydCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiVW5oYW5kbGVkIHByb3RvY29sIjsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gcHV0IGV2ZXJ5dGhpbmcgdG9nZXRoZXIKKyAgICAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDYWxjdWxhdG9ySW1wbChwcm90b2NvbCxwcm90b2NvbCk7CisgICAgfQorCisKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBSdW5DbGllbnQoKSA6IFZvaWQgeworICAgICAgICB2YXIgY2xpZW50ID0gQ2xpZW50U2V0dXAoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgICBjbGllbnQucGluZygpOworICAgICAgICAgICAgdHJhY2UoInBpbmcoKSBzdWNjZXNzZnVsIik7CisgICAgICAgIH0gY2F0Y2goZXJyb3IgOiBURXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0cmFjZSgncGluZygpIGZhaWxlZDogJGVycm9yJyk7CisgICAgICAgIH0gY2F0Y2goZXJyb3IgOiBEeW5hbWljKSB7CisgICAgICAgICAgICB0cmFjZSgncGluZygpIGZhaWxlZDogJGVycm9yJyk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIHN1bSA9IGNsaWVudC5hZGQoIDEsIDEpOworICAgICAgICAgICAgdHJhY2UoJzErMT0kc3VtJyk7CisgICAgICAgIH0gY2F0Y2goZXJyb3IgOiBURXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0cmFjZSgnYWRkKCkgZmFpbGVkOiAkZXJyb3InKTsKKyAgICAgICAgfSBjYXRjaChlcnJvciA6IER5bmFtaWMpIHsKKyAgICAgICAgICAgIHRyYWNlKCdhZGQoKSBmYWlsZWQ6ICRlcnJvcicpOworICAgICAgICB9CisKKworICAgICAgICB2YXIgd29yayA9IG5ldyB0dXRvcmlhbC5Xb3JrKCk7CisgICAgICAgIHdvcmsub3AgPSB0dXRvcmlhbC5PcGVyYXRpb24uRElWSURFOworICAgICAgICB3b3JrLm51bTEgPSAxOworICAgICAgICB3b3JrLm51bTIgPSAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIHF1b3RpZW50ID0gY2xpZW50LmNhbGN1bGF0ZSggMSwgd29yayk7CisgICAgICAgICAgICB0cmFjZSgnV2hvYSB3ZSBjYW4gZGl2aWRlIGJ5IDAhIFJlc3VsdCA9ICRxdW90aWVudCcpOworICAgICAgICB9IGNhdGNoKGVycm9yIDogVEV4Y2VwdGlvbikgeworICAgICAgICAgICAgdHJhY2UoJ2NhbGN1bGF0ZSgpIGZhaWxlZDogJGVycm9yJyk7CisgICAgICAgIH0gY2F0Y2goZXJyb3IgOiBEeW5hbWljKSB7CisgICAgICAgICAgICB0cmFjZSgnY2FsY3VsYXRlKCkgZmFpbGVkOiAkZXJyb3InKTsKKyAgICAgICAgfQorCisgICAgICAgIHdvcmsub3AgPSB0dXRvcmlhbC5PcGVyYXRpb24uU1VCVFJBQ1Q7CisgICAgICAgIHdvcmsubnVtMSA9IDE1OworICAgICAgICB3b3JrLm51bTIgPSAxMDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciBkaWZmID0gY2xpZW50LmNhbGN1bGF0ZSggMSwgd29yayk7CisgICAgICAgICAgICB0cmFjZSgnMTUtMTA9JGRpZmYnKTsKKyAgICAgICAgfSBjYXRjaChlcnJvciA6IFRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRyYWNlKCdjYWxjdWxhdGUoKSBmYWlsZWQ6ICRlcnJvcicpOworICAgICAgICB9IGNhdGNoKGVycm9yIDogRHluYW1pYykgeworICAgICAgICAgICAgdHJhY2UoJ2NhbGN1bGF0ZSgpIGZhaWxlZDogJGVycm9yJyk7CisgICAgICAgIH0KKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgbG9nIDogU2hhcmVkU3RydWN0ID0gY2xpZW50LmdldFN0cnVjdCggMSk7CisgICAgICAgICAgICB2YXIgbG9ndmFsID0gbG9nLnZhbHVlOworICAgICAgICAgICAgdHJhY2UoJ0NoZWNrIGxvZzogJGxvZ3ZhbCcpOworICAgICAgICB9IGNhdGNoKGVycm9yIDogVEV4Y2VwdGlvbikgeworICAgICAgICAgICAgdHJhY2UoJ2dldFN0cnVjdCgpIGZhaWxlZDogJGVycm9yJyk7CisgICAgICAgIH0gY2F0Y2goZXJyb3IgOiBEeW5hbWljKSB7CisgICAgICAgICAgICB0cmFjZSgnZ2V0U3RydWN0KCkgZmFpbGVkOiAkZXJyb3InKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gU2VydmVyU2V0dXAoKSA6IFRTZXJ2ZXIgeworICAgICAgICAgdHJhY2UoIlNlcnZlciBjb25maWd1cmF0aW9uOiIpOworCisgICAgICAgIC8vIGVuZHBvaW50IHRyYW5zcG9ydAorICAgICAgICB2YXIgdHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgIHN3aXRjaCh0cm5zKQorICAgICAgICB7CisgICAgICAgIGNhc2Ugc29ja2V0OgorICAgICAgICAgICAgI2lmIChmbGFzaCB8fCBqcykKKyAgICAgICAgICAgIHRocm93ICdjdXJyZW50IHBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgc29ja2V0IHNlcnZlcnMnOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICB0cmFjZSgnLSBzb2NrZXQgdHJhbnNwb3J0IHBvcnQgJHRhcmdldFBvcnQnKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0KCB0YXJnZXRQb3J0KTsKKyAgICAgICAgICAgICNlbmQKKyAgICAgICAgY2FzZSBodHRwOgorICAgICAgICAgICAgI2lmICFwaHB3ZWJzZXJ2ZXIKKyAgICAgICAgICAgICAgdGhyb3cgIkhUVFAgc2VydmVyIG5vdCBpbXBsZW1lbnRlZCB5ZXQiOworICAgICAgICAgICAgICAvL3RyYWNlKCItIGh0dHAgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgIC8vdHJhbnNwb3J0ID0gbmV3IFRIdHRwQ2xpZW50KCB0YXJnZXRIb3N0KTsKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgIHRyYWNlKCItIGh0dHAgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUV3JhcHBpbmdTZXJ2ZXJUcmFuc3BvcnQoCisgICAgICAgICAgICAgICAgICAgICAgbmV3IFRTdHJlYW1UcmFuc3BvcnQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVEZpbGVTdHJlYW0oInBocDovL2lucHV0IiwgUmVhZCksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVEZpbGVTdHJlYW0oInBocDovL291dHB1dCIsIEFwcGVuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAjZW5kCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiVW5oYW5kbGVkIHRyYW5zcG9ydCI7CisgICAgICAgIH0KKworICAgICAgICAvLyBvcHRpb25hbDogbGF5ZXJlZCB0cmFuc3BvcnQKKyAgICAgICAgdmFyIHRyYW5zZmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgaWYgKCBmcmFtZWQpIHsKKyAgICAgICAgICAgIHRyYWNlKCItIGZyYW1lZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgIHRyYW5zZmFjdG9yeSA9IG5ldyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSgpOworICAgICAgICB9IGVsc2UgaWYgKCBidWZmZXJlZCkgeworICAgICAgICAgICAgdHJhY2UoIi0gYnVmZmVyZWQgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICB0cmFuc2ZhY3RvcnkgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcHJvdG9jb2wKKyAgICAgICAgdmFyIHByb3RmYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeSA9IG51bGw7CisgICAgICAgIHN3aXRjaChwcm90KQorICAgICAgICB7CisgICAgICAgIGNhc2UgYmluYXJ5OgorICAgICAgICAgICAgIHRyYWNlKCItIGJpbmFyeSBwcm90b2NvbCIpOworICAgICAgICAgICAgIHByb3RmYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKTsKKyAgICAgICAgY2FzZSBqc29uOgorICAgICAgICAgICAgdHJhY2UoIi0gSlNPTiBwcm90b2NvbCIpOworICAgICAgICAgICAgIHByb3RmYWN0b3J5ID0gbmV3IFRKU09OUHJvdG9jb2xGYWN0b3J5KCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiVW5oYW5kbGVkIHByb3RvY29sIjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBoYW5kbGVyID0gbmV3IENhbGN1bGF0b3JIYW5kbGVyKCk7CisgICAgICAgIHZhciBwcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvclByb2Nlc3NvcihoYW5kbGVyKTsKKyAgICAgICAgdmFyIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKCBwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdHJhbnNmYWN0b3J5LCBwcm90ZmFjdG9yeSk7CisgICAgICAgICNpZiBwaHB3ZWJzZXJ2ZXIKKyAgICAgICAgc2VydmVyLnJ1bk9uY2UgPSB0cnVlOworICAgICAgICAjZW5kCisKKyAgICAgICAgcmV0dXJuIHNlcnZlcjsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIFJ1blNlcnZlcigpIDogVm9pZCB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc2VydmVyID0gU2VydmVyU2V0dXAoKTsKKworICAgICAgICAgICAgdHJhY2UoIlxuU3RhcnRpbmcgdGhlIHNlcnZlci4uLiIpOworICAgICAgICAgICAgc2VydmVyLlNlcnZlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goIGUgOiBEeW5hbWljKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgnUnVuU2VydmVyKCkgZmFpbGVkOiAkZScpOworICAgICAgICB9CisgICAgICAgIHRyYWNlKCJkb25lLiIpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ocy9IYXNrZWxsQ2xpZW50LmhzIGIvdHV0b3JpYWwvaHMvSGFza2VsbENsaWVudC5ocwppbmRleCBhNTYxODdiLi5iZDI5ZGYwIDEwMDY0NAotLS0gYS90dXRvcmlhbC9ocy9IYXNrZWxsQ2xpZW50LmhzCisrKyBiL3R1dG9yaWFsL2hzL0hhc2tlbGxDbGllbnQuaHMKQEAgLTMwLDcgKzMwLDkgQEAKIGltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LkhhbmRsZQogaW1wb3J0IFRocmlmdC5TZXJ2ZXIKIAoraW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uCiBpbXBvcnQgRGF0YS5NYXliZQoraW1wb3J0IERhdGEuVGV4dC5MYXp5CiBpbXBvcnQgVGV4dC5QcmludGYKIGltcG9ydCBOZXR3b3JrCiAKQEAgLTQ2LDI4ICs0OCwyNyBAQAogICBwcmludGYgIjErMT0lZFxuIiBzdW0KIAogCi0gIGxldCB3b3JrID0gV29yayB7IGZfV29ya19vcCA9IEp1c3QgRElWSURFLAotICAgICAgICAgICAgICAgICAgICBmX1dvcmtfbnVtMSA9IEp1c3QgMSwKLSAgICAgICAgICAgICAgICAgICAgZl9Xb3JrX251bTIgPSBKdXN0IDAsCi0gICAgICAgICAgICAgICAgICAgIGZfV29ya19jb21tZW50ID0gTm90aGluZworICBsZXQgd29yayA9IFdvcmsgeyB3b3JrX29wID0gRElWSURFLAorICAgICAgICAgICAgICAgICAgICB3b3JrX251bTEgPSAxLAorICAgICAgICAgICAgICAgICAgICB3b3JrX251bTIgPSAwLAorICAgICAgICAgICAgICAgICAgICB3b3JrX2NvbW1lbnQgPSBOb3RoaW5nCiAgICAgICAgICAgICAgICAgICB9CiAKLSAgLS0gVE9ETyAtIGdldCB0aGlzIG9uZSB3b3JraW5nCi0gIC0tY2F0Y2ggKENsaWVudC5jYWxjdWxhdGUgY2xpZW50IDEgd29yaykgKFxleGNlcHQgLT4KLSAgLS0gICAgIHByaW50ZiAiSW52YWxpZE9wICVzIiAoc2hvdyBleGNlcHQpKQorICBDb250cm9sLkV4Y2VwdGlvbi5jYXRjaCAocHJpbnRmICIxLzA9JWRcbiIgPTw8IENsaWVudC5jYWxjdWxhdGUgY2xpZW50IDEgd29yaykKKyAgICAgICAgKFxlIC0+IHByaW50ZiAiSW52YWxpZE9wZXJhdGlvbiAlc1xuIiAoc2hvdyAoZSA6OiBJbnZhbGlkT3BlcmF0aW9uKSkpCiAKIAotICBsZXQgd29yayA9IFdvcmsgeyBmX1dvcmtfb3AgPSBKdXN0IFNVQlRSQUNULAotICAgICAgICAgICAgICAgICAgICBmX1dvcmtfbnVtMSA9IEp1c3QgMTUsCi0gICAgICAgICAgICAgICAgICAgIGZfV29ya19udW0yID0gSnVzdCAxMCwKLSAgICAgICAgICAgICAgICAgICAgZl9Xb3JrX2NvbW1lbnQgPSBOb3RoaW5nCisgIGxldCB3b3JrID0gV29yayB7IHdvcmtfb3AgPSBTVUJUUkFDVCwKKyAgICAgICAgICAgICAgICAgICAgd29ya19udW0xID0gMTUsCisgICAgICAgICAgICAgICAgICAgIHdvcmtfbnVtMiA9IDEwLAorICAgICAgICAgICAgICAgICAgICB3b3JrX2NvbW1lbnQgPSBOb3RoaW5nCiAgICAgICAgICAgICAgICAgICB9CiAKICAgZGlmZiA8LSBDbGllbnQuY2FsY3VsYXRlIGNsaWVudCAxIHdvcmsKICAgcHJpbnRmICIxNS0xMD0lZFxuIiBkaWZmCiAKICAgbG9nIDwtIFNDbGllbnQuZ2V0U3RydWN0IGNsaWVudCAxCi0gIHByaW50ZiAiQ2hlY2sgbG9nOiAlc1xuIiAgJCBmcm9tSnVzdCAkIGZfU2hhcmVkU3RydWN0X3ZhbHVlIGxvZworICBwcmludGYgIkNoZWNrIGxvZzogJXNcbiIgJCB1bnBhY2sgJCBzaGFyZWRTdHJ1Y3RfdmFsdWUgbG9nCiAKICAgLS0gQ2xvc2UhCiAgIHRDbG9zZSB0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hzL0hhc2tlbGxTZXJ2ZXIuaHMgYi90dXRvcmlhbC9ocy9IYXNrZWxsU2VydmVyLmhzCmluZGV4IDRmOWFiN2MuLmNmZTEzNDQgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2hzL0hhc2tlbGxTZXJ2ZXIuaHMKKysrIGIvdHV0b3JpYWwvaHMvSGFza2VsbFNlcnZlci5ocwpAQCAtMTcsNiArMTcsOCBAQAogLS0gdW5kZXIgdGhlIExpY2Vuc2UuCiAtLQogCit7LSMgTEFOR1VBR0UgT3ZlcmxvYWRlZFN0cmluZ3MgIy19CisKIGltcG9ydCBxdWFsaWZpZWQgQ2FsY3VsYXRvcgogaW1wb3J0IENhbGN1bGF0b3JfSWZhY2UKIGltcG9ydCBUdXRvcmlhbF9UeXBlcwpAQCAtMjgsNiArMzAsOCBAQAogaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKIGltcG9ydCBUaHJpZnQuU2VydmVyCiAKK2ltcG9ydCBEYXRhLkludAoraW1wb3J0IERhdGEuU3RyaW5nCiBpbXBvcnQgRGF0YS5NYXliZQogaW1wb3J0IFRleHQuUHJpbnRmCiBpbXBvcnQgQ29udHJvbC5FeGNlcHRpb24gKHRocm93KQpAQCAtMzYsNyArNDAsNyBAQAogaW1wb3J0IERhdGEuTWFwICgoISkpCiBpbXBvcnQgRGF0YS5Nb25vaWQKIAotZGF0YSBDYWxjdWxhdG9ySGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyIHttYXRoTG9nIDo6IE1WYXIgKE0uTWFwIEludCBTaGFyZWRTdHJ1Y3QpfQorZGF0YSBDYWxjdWxhdG9ySGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyIHttYXRoTG9nIDo6IE1WYXIgKE0uTWFwIEludDMyIFNoYXJlZFN0cnVjdCl9CiAKIG5ld0NhbGN1bGF0b3JIYW5kbGVyID0gZG8KICAgbG9nIDwtIG5ld01WYXIgbWVtcHR5CkBAIC00NSw3ICs0OSw3IEBACiBpbnN0YW5jZSBTaGFyZWRTZXJ2aWNlX0lmYWNlIENhbGN1bGF0b3JIYW5kbGVyIHdoZXJlCiAgIGdldFN0cnVjdCBzZWxmIGsgPSBkbwogICAgIG15TG9nIDwtIHJlYWRNVmFyIChtYXRoTG9nIHNlbGYpCi0gICAgcmV0dXJuICQgKG15TG9nICEgKGZyb21KdXN0IGspKQorICAgIHJldHVybiAkIChteUxvZyAhIGspCiAKIAogaW5zdGFuY2UgQ2FsY3VsYXRvcl9JZmFjZSBDYWxjdWxhdG9ySGFuZGxlciB3aGVyZQpAQCAtNTMsOCArNTcsOCBAQAogICAgIHByaW50ICJwaW5nKCkiCiAKICAgYWRkIF8gbjEgbjIgPSBkbwotICAgIHByaW50ZiAiYWRkKCVkLCVkKVxuIiAoZnJvbUp1c3QgbjEpIChmcm9tSnVzdCBuMikKLSAgICByZXR1cm4gKChmcm9tSnVzdCBuMSkrKGZyb21KdXN0IG4yKSkKKyAgICBwcmludGYgImFkZCglZCwlZClcbiIgbjEgbjIKKyAgICByZXR1cm4gKG4xICsgbjIpCiAKICAgY2FsY3VsYXRlIHNlbGYgbWxvZ2lkIG13b3JrID0gZG8KICAgICBwcmludGYgImNhbGN1bGF0ZSglZCwgJXMpXG4iIGxvZ2lkIChzaG93IHdvcmspCkBAIC03MCwyNyArNzQsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgbnVtMiB3b3JrID09IDAgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgJAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZE9wZXJhdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmX0ludmFsaWRPcGVyYXRpb25fd2hhdCA9IEp1c3QgJCBmcm9tRW51bSAkIG9wIHdvcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmX0ludmFsaWRPcGVyYXRpb25fd2h5ID0gSnVzdCAiQ2Fubm90IGRpdmlkZSBieSAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZE9wZXJhdGlvbl93aGF0T3AgPSBmcm9tSW50ZWdyYWwgJCBmcm9tRW51bSAkIG9wIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkT3BlcmF0aW9uX3doeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgbnVtMSB3b3JrIGBkaXZgIG51bTIgd29yawogCi0gICAgbGV0IGxvZ0VudHJ5ID0gU2hhcmVkU3RydWN0IChKdXN0IGxvZ2lkKSAoSnVzdCAoc2hvdyB2YWwpKQorICAgIGxldCBsb2dFbnRyeSA9IFNoYXJlZFN0cnVjdCBsb2dpZCAoZnJvbVN0cmluZyAkIHNob3cgJCB2YWwpCiAgICAgbW9kaWZ5TVZhcl8gKG1hdGhMb2cgc2VsZikgJCByZXR1cm4gLihNLmluc2VydCBsb2dpZCBsb2dFbnRyeSkKIAotICAgIHJldHVybiB2YWwKKyAgICByZXR1cm4gJCEgdmFsCiAKICAgIHdoZXJlCiAgICAgIC0tIHN0dXBpZCBkeW5hbWljIGxhbmd1YWdlcyBmJ2luZyBpdCB1cAotICAgICBudW0xID0gZnJvbUp1c3QgLiBmX1dvcmtfbnVtMQotICAgICBudW0yID0gZnJvbUp1c3QgLiBmX1dvcmtfbnVtMgotICAgICBvcCA9IGZyb21KdXN0IC4gZl9Xb3JrX29wCi0gICAgIGxvZ2lkID0gZnJvbUp1c3QgbWxvZ2lkCi0gICAgIHdvcmsgPSBmcm9tSnVzdCBtd29yawotCi0KLSAgICAtLXJldHVybiB2YWwKKyAgICAgbnVtMSA9IHdvcmtfbnVtMQorICAgICBudW0yID0gd29ya19udW0yCisgICAgIG9wID0gd29ya19vcAorICAgICBsb2dpZCA9IG1sb2dpZAorICAgICB3b3JrID0gbXdvcmsKIAogICB6aXAgXyA9CiAgICAgcHJpbnQgInppcCgpIgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaHMvTElDRU5TRSBiL3R1dG9yaWFsL2hzL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I2ZDdkNwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hzL0xJQ0VOU0UKQEAgLTAsMCArMSwyMzkgQEAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKworICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKworICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTT0ZUV0FSRSBESVNUUklCVVRFRCBXSVRIIFRIUklGVDoKKworVGhlIEFwYWNoZSBUaHJpZnQgc29mdHdhcmUgaW5jbHVkZXMgYSBudW1iZXIgb2Ygc3ViY29tcG9uZW50cyB3aXRoCitzZXBhcmF0ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgbGljZW5zZSB0ZXJtcy4gWW91ciB1c2Ugb2YgdGhlIHNvdXJjZQorY29kZSBmb3IgdGhlIHRoZXNlIHN1YmNvbXBvbmVudHMgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQb3J0aW9ucyBvZiB0aGUgZm9sbG93aW5nIGZpbGVzIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2U6CisKKyAgbGliL2VybC9zcmMvTWFrZWZpbGUuYW0KKworUGxlYXNlIHNlZSBkb2Mvb3RwLWJhc2UtbGljZW5zZS50eHQgZm9yIHRoZSBmdWxsIHRlcm1zIG9mIHRoaXMgbGljZW5zZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZvciB0aGUgYWNsb2NhbC9heF9ib29zdF9iYXNlLm00IGFuZCBjb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNCBjb21wb25lbnRzOgorCisjICAgQ29weXJpZ2h0IChjKSAyMDA3IFRob21hcyBQb3JzY2hiZXJnIDx0aG9tYXNAcmFuZHNwcmluZ2VyLmRlPgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dAorIyAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZAorIyAgIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRm9yIHRoZSBsaWIvbm9kZWpzL2xpYi90aHJpZnQvanNvbl9wYXJzZS5qczoKKworLyoKKyAgICBqc29uX3BhcnNlLmpzCisgICAgMjAxNS0wNS0wMgorICAgIFB1YmxpYyBEb21haW4uCisgICAgTk8gV0FSUkFOVFkgRVhQUkVTU0VEIE9SIElNUExJRUQuIFVTRSBBVCBZT1VSIE9XTiBSSVNLLgorCisqLworKEJ5IERvdWdsYXMgQ3JvY2tmb3JkIDxkb3VnbGFzQGNyb2NrZm9yZC5jb20+KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hzL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvaHMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTNlY2NjMgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCithbGwtbG9jYWw6CisJJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gaHMgLXIgJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKwkkKENBQkFMKSBpbnN0YWxsCisKK2luc3RhbGwtZXhlYy1ob29rOgorCSQoQ0FCQUwpIGluc3RhbGwKKworIyBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGZhaWwgaWYgSGFza2VsbCBpcyBub3QgY29uZmlndXJlZC4KK2NsZWFuLWxvY2FsOgorCSQoQ0FCQUwpIGNsZWFuCisJJChSTSkgLXIgZ2VuLSoKKworY2hlY2stbG9jYWw6CisJJChDQUJBTCkgY2hlY2sKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCWRpc3QvYnVpbGQvSGFza2VsbFNlcnZlci9IYXNrZWxsU2VydmVyCisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwlkaXN0L2J1aWxkL0hhc2tlbGxDbGllbnQvSGFza2VsbENsaWVudAorCitFWFRSQV9ESVNUID0gXAorCUxJQ0VOU0UKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hzL1NldHVwLmxocyBiL3R1dG9yaWFsL2hzL1NldHVwLmxocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RmMTgyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaHMvU2V0dXAubGhzCkBAIC0wLDAgKzEsMjEgQEAKKyMhL3Vzci9iaW4vZW52IHJ1bmhhc2tlbGwKKworPiAtLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCis+IC0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCis+IC0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCis+IC0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorPiAtLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCis+IC0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKz4gLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis+IC0tCis+IC0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis+IC0tCis+IC0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKz4gLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKz4gLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCis+IC0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCis+IC0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKz4gLS0gdW5kZXIgdGhlIExpY2Vuc2UuCisKKz4gaW1wb3J0IERpc3RyaWJ1dGlvbi5TaW1wbGUKKz4gbWFpbiA9IGRlZmF1bHRNYWluCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ocy9UaHJpZnRUdXRvcmlhbC5jYWJhbCBiL3R1dG9yaWFsL2hzL1RocmlmdFR1dG9yaWFsLmNhYmFsCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMTY1NWNlNy4uNjJlNjgyZgotLS0gYS90dXRvcmlhbC9ocy9UaHJpZnRUdXRvcmlhbC5jYWJhbAorKysgYi90dXRvcmlhbC9ocy9UaHJpZnRUdXRvcmlhbC5jYWJhbApAQCAtMTgsMzEgKzE4LDU2IEBACiAtLQogCiBOYW1lOiAgICAgICAgICAgVGhyaWZ0VHV0b3JpYWwKLVZlcnNpb246ICAgICAgICAwLjEuMAotQ2FiYWwtVmVyc2lvbjogID49IDEuMgotTGljZW5zZTogICAgICAgIEFwYWNoZTIKK1ZlcnNpb246ICAgICAgICAxLjAuMAorQ2FiYWwtVmVyc2lvbjogID49IDEuNAorTGljZW5zZTogICAgICAgIE90aGVyTGljZW5zZQogQ2F0ZWdvcnk6ICAgICAgIEZvcmVpZ24KIEJ1aWxkLVR5cGU6ICAgICBTaW1wbGUKIFN5bm9wc2lzOiAgICAgICBUaHJpZnQgVHV0b3JpYWwgbGlicmFyeSBwYWNrYWdlCitIb21lcGFnZTogICAgICAgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCitCdWctUmVwb3J0czogICAgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQKK01haW50YWluZXI6ICAgICBkZXZAdGhyaWZ0LmFwYWNoZS5vcmcKK0xpY2Vuc2UtRmlsZTogICBMSUNFTlNFCisKK0Rlc2NyaXB0aW9uOgorICBIYXNrZWxsIHR1dG9yaWFsIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtLiBSZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSB0aHJpZnQgY29kZSBnZW5lcmF0b3IuCisKK2ZsYWcgbmV0d29yay11cmkKKyAgIGRlc2NyaXB0aW9uOiBHZXQgTmV0d29yay5VUkkgZnJvbSB0aGUgbmV0d29yay11cmkgcGFja2FnZQorICAgZGVmYXVsdDogVHJ1ZQogCiBFeGVjdXRhYmxlIEhhc2tlbGxTZXJ2ZXIKICAgTWFpbi1pczogSGFza2VsbFNlcnZlci5ocwogICBIcy1Tb3VyY2UtRGlyczoKLSAgICAuLCAuLi9nZW4taHMvCisgICAgLiwgZ2VuLWhzLwogICBCdWlsZC1EZXBlbmRzOgotICAgIGJhc2UgPj00LCBuZXR3b3JrLCBnaGMtcHJpbSwgY29udGFpbmVycywgVGhyaWZ0Ci0gIGdoYy1vcHRpb25zOgotICAgIC1mZ2xhc2dvdy1leHRzCisgICAgYmFzZSA+PSA0LCBiYXNlIDwgNSwgZ2hjLXByaW0sIGNvbnRhaW5lcnMsIHRocmlmdCwgdmVjdG9yLCB1bm9yZGVyZWQtY29udGFpbmVycywgdGV4dCwgaGFzaGFibGUsIGJ5dGVzdHJpbmcsIFF1aWNrQ2hlY2sKICAgRXh0ZW5zaW9uczoKLSAgICBEZXJpdmVEYXRhVHlwZWFibGUKKyAgICBEZXJpdmVEYXRhVHlwZWFibGUsCisgICAgRXhpc3RlbnRpYWxRdWFudGlmaWNhdGlvbiwKKyAgICBGbGV4aWJsZUluc3RhbmNlcywKKyAgICBLaW5kU2lnbmF0dXJlcywKKyAgICBNYWdpY0hhc2gsCisgICAgUmFua05UeXBlcywKKyAgICBTY29wZWRUeXBlVmFyaWFibGVzLAorICAgIFR5cGVTeW5vbnltSW5zdGFuY2VzCiAKIEV4ZWN1dGFibGUgSGFza2VsbENsaWVudAogICBNYWluLWlzOiBIYXNrZWxsQ2xpZW50LmhzCiAgIEhzLVNvdXJjZS1EaXJzOgotICAgIC4sIC4uL2dlbi1ocy8KKyAgICAuLCBnZW4taHMvCiAgIEJ1aWxkLURlcGVuZHM6Ci0gICAgYmFzZSA+PTQsIG5ldHdvcmssIGdoYy1wcmltLCBjb250YWluZXJzLCBUaHJpZnQKLSAgZ2hjLW9wdGlvbnM6Ci0gICAgLWZnbGFzZ293LWV4dHMKKyAgICBiYXNlID49IDQsIGJhc2UgPCA1LCBnaGMtcHJpbSwgY29udGFpbmVycywgdGhyaWZ0LCB2ZWN0b3IsIFF1aWNrQ2hlY2sKKyAgaWYgZmxhZyhuZXR3b3JrLXVyaSkKKyAgICAgYnVpbGQtZGVwZW5kczogbmV0d29yay11cmkgPj0gMi42LCBuZXR3b3JrID49IDIuNgorICBlbHNlCisgICAgIGJ1aWxkLWRlcGVuZHM6IG5ldHdvcmsgPCAyLjYKICAgRXh0ZW5zaW9uczoKLSAgICBEZXJpdmVEYXRhVHlwZWFibGUKKyAgICBEZXJpdmVEYXRhVHlwZWFibGUsCisgICAgRXhpc3RlbnRpYWxRdWFudGlmaWNhdGlvbiwKKyAgICBGbGV4aWJsZUluc3RhbmNlcywKKyAgICBLaW5kU2lnbmF0dXJlcywKKyAgICBNYWdpY0hhc2gsCisgICAgUmFua05UeXBlcywKKyAgICBTY29wZWRUeXBlVmFyaWFibGVzLAorICAgIFR5cGVTeW5vbnltSW5zdGFuY2VzCmRpZmYgLS1naXQgYS90dXRvcmlhbC9qYXZhL0phdmFDbGllbnQgYi90dXRvcmlhbC9qYXZhL0phdmFDbGllbnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhZTUxNWUuLjAwMDAwMDAKLS0tIGEvdHV0b3JpYWwvamF2YS9KYXZhQ2xpZW50CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1qYXZhIC1jcCAuLi8uLi9saWIvamF2YS9idWlsZC9saWIvKjouLi8uLi9saWIvamF2YS9idWlsZC8qOnR1dG9yaWFsLmphciBKYXZhQ2xpZW50ICQxCmRpZmYgLS1naXQgYS90dXRvcmlhbC9qYXZhL0phdmFTZXJ2ZXIgYi90dXRvcmlhbC9qYXZhL0phdmFTZXJ2ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNmOTc3Y2EuLjAwMDAwMDAKLS0tIGEvdHV0b3JpYWwvamF2YS9KYXZhU2VydmVyCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIE9wdGlvbmFsbHkgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGNvdWxkIGJlIHNldCBmb3IgU1NMIGluc3RlYWQKLSMgb2YgY29uZmlndXJpbmcgaXQgaW4gdGhlIGNvZGUKLSMgLURqYXZheC5uZXQuc3NsLnRydXN0U3RvcmU9Li4vLi4vbGliL2phdmEvdGVzdC8udHJ1c3RzdG9yZQotIyAtRGphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkPXRocmlmdAotIyAtRGphdmF4Lm5ldC5zc2wua2V5U3RvcmU9Li4vLi4vbGliL2phdmEvdGVzdC8ua2V5c3RvcmUKLSMgLURqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQ9dGhyaWZ0Ci0KLWphdmEgLWNwIC4uLy4uL2xpYi9qYXZhL2J1aWxkL2xpYi8qOi4uLy4uL2xpYi9qYXZhL2J1aWxkLyo6dHV0b3JpYWwuamFyIEphdmFTZXJ2ZXIKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2phdmEvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9qYXZhL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk1OTA4YjEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9qYXZhL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitleHBvcnQgQ0xBU1NQQVRICisKKyMgTWFrZSBzdXJlIHRoaXMgZG9lc24ndCBmYWlsIGlmIGFudCBpcyBub3QgY29uZmlndXJlZC4KK2NsZWFuLWxvY2FsOgorCUFOVD0kKEFOVCkgOyBpZiB0ZXN0IC16ICIkJEFOVCIgOyB0aGVuIEFOVD06IDsgZmkgOyBcCisJJCRBTlQgJChBTlRfRkxBR1MpIGNsZWFuCisKK2FsbC1sb2NhbDoKKwkkKEFOVCkgJChBTlRfRkxBR1MpIGNvbXBpbGUKKworY2hlY2stbG9jYWw6IGFsbAorCSQoQU5UKSAkKEFOVF9GTEFHUykgdGVzdAorCit0dXRvcmlhbDogYWxsCisJJChBTlQpICQoQU5UX0ZMQUdTKSB0dXRvcmlhbAorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJJChBTlQpICQoQU5UX0ZMQUdTKSB0dXRvcmlhbHNlcnZlcgorCit0dXRvcmlhbGNsaWVudDogYWxsCisJJChBTlQpICQoQU5UX0ZMQUdTKSB0dXRvcmlhbGNsaWVudAorCitFWFRSQV9ESVNUID0gXAorCWJ1aWxkLnhtbCBcCisJc3JjIFwKKwlSRUFETUUubWQKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2phdmEvUkVBRE1FIGIvdHV0b3JpYWwvamF2YS9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMDNiYTcuLjAwMDAwMDAKLS0tIGEvdHV0b3JpYWwvamF2YS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1TdGVwcyBmb3IgSmF2YSB0dXRvcmlhbAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotMSkgTWFrZSBzdXJlIHRocmlmdCBpcyBjb21waWxlZCwgYm90aCB0aGUgY29tcGlsZXIgYW5kIHRoZSBKYXZhIGxpYnJhcnkuIFlvdSBzaG91bGQKLWJlIGFibGUgdG8gdmVyaWZ5IHRoZSBmb2xsb3dpbmc6Ci0KLXRocmlmdC90dXRvcmlhbC9qYXZhJCBmaWxlIC4uLy4uL2xpYi9qYXZhL2J1aWxkL2xpYnRocmlmdC0ke3ZlcnNpb259LSR7cmVsZWFzZX0uamFyIAotLi4vLi4vbGliL2phdmEvbGlidGhyaWZ0LmphcjogWmlwIGFyY2hpdmUgZGF0YSwgYXQgbGVhc3QgdjEuMCB0byBleHRyYWN0Ci0KLXRocmlmdC90dXRvcmlhbC9qYXZhJCBmaWxlIC4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQKLS4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQ6IEVMRiA2NC1iaXQgTFNCIGV4ZWN1dGFibGUsIHg4Ni02NCwgdmVyc2lvbiAxIChTWVNWKSwgZHluYW1pY2FsbHkgbGlua2VkICh1c2VzIHNoYXJlZCBsaWJzKSwgZm9yIEdOVS9MaW51eCAyLjYuMTUsIG5vdCBzdHJpcHBlZAotCi10aHJpZnQvdHV0b3JpYWwvamF2YSQgbHMgLi4vLi4vbGliL2phdmEvYnVpbGQvaXZ5L2xpYi8KLWNvbW1vbnMtbGFuZy0yLjUuamFyICBqdW5pdC00LjQuamFyICBzZXJ2bGV0LWFwaS0yLjUuamFyICBzbGY0ai1hcGktMS41LjguamFyICBzbGY0ai1zaW1wbGUtMS41LjguamFyCi0KLQotMikgR2VuZXJhdGUgY29kZSBmb3IgamF2YToKLQotdGhyaWZ0L3R1dG9yaWFsL2phdmEkIGNkIC4uCi10aHJpZnQvdHV0b3JpYWwkIHRocmlmdCAtciAtZ2VuIGphdmEgdHV0b3JpYWwudGhyaWZ0Ci0KLTMpIENvbXBpbGUgZXhhbXBsZQotCi10aHJpZnQvdHV0b3JpYWwvamF2YSQgYW50Ci0KLTQpIFJ1biBleGFtcGxlOgotCi10aHJpZnQvdHV0b3JpYWwvamF2YSQgLi9KYXZhU2VydmVyICYKLXRocmlmdC90dXRvcmlhbC9qYXZhJCAuL0phdmFDbGllbnQKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2phdmEvUkVBRE1FLm1kIGIvdHV0b3JpYWwvamF2YS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwOWZlYQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2phdmEvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjQgQEAKK1RocmlmdCBKYXZhIFR1dG9yaWFsCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorMSkgQ29tcGlsZSB0aGUgSmF2YSBsaWJyYXJ5CisKKyAgICB0aHJpZnQvbGliL2phdmEkIG1ha2UKK29yOgorCisgICAgdGhyaWZ0L2xpYi9qYXZhJCBhbnQKKworNCkgUnVuIHRoZSB0dXRvcmlhbDoKKworc3RhcnQgc2VydmVyIGFuZCBjbGllbnQgd2l0aCBvbmUgc3RlcDoKKworICAgIHRocmlmdC90dXRvcmlhbC9qYXZhJCBtYWtlIHR1dG9yaWFsCisKK29yOgorCisgICAgdGhyaWZ0L3R1dG9yaWFsL2phdmEkIG1ha2UgdHV0b3JpYWxzZXJ2ZXIKKyAgICB0aHJpZnQvdHV0b3JpYWwvamF2YSQgbWFrZSB0dXRvcmlhbGNsaWVudAorCitvcjoKKworICAgIHRocmlmdC90dXRvcmlhbC9qYXZhJCBhbnQgdHV0b3JpYWxzZXJ2ZXIKKyAgICB0aHJpZnQvdHV0b3JpYWwvamF2YSQgYW50IHR1dG9yaWFsY2xpZW50CmRpZmYgLS1naXQgYS90dXRvcmlhbC9qYXZhL2J1aWxkLnhtbCBiL3R1dG9yaWFsL2phdmEvYnVpbGQueG1sCmluZGV4IDJlZTExYzAuLjU1Y2RiOGYgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2phdmEvYnVpbGQueG1sCisrKyBiL3R1dG9yaWFsL2phdmEvYnVpbGQueG1sCkBAIC0xOCwxOCArMTgsMjAgQEAKIC0tPgogPHByb2plY3QgbmFtZT0idHV0b3JpYWwiIGRlZmF1bHQ9InR1dG9yaWFsIiBiYXNlZGlyPSIuIj4KIAotICA8ZGVzY3JpcHRpb24+VGhyaWZ0IFR1dG9yaWFsPC9kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPlRocmlmdCBKYXZhIFR1dG9yaWFsPC9kZXNjcmlwdGlvbj4KIAogICA8cHJvcGVydHkgbmFtZT0ic3JjIiBsb2NhdGlvbj0ic3JjIiAvPgotICA8cHJvcGVydHkgbmFtZT0iZ2VuIiBsb2NhdGlvbj0iLi4vZ2VuLWphdmEiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJnZW4iIGxvY2F0aW9uPSJnZW4tamF2YSIgLz4KICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkIiBsb2NhdGlvbj0iYnVpbGQiIC8+CiAKICAgPHBhdGggaWQ9ImxpYnMuY2xhc3NwYXRoIj4KLSAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uL2xpYi9qYXZhL2J1aWxkIj4KLSAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0iLXRlc3QuamFyIiAvPgorICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vbGliL2phdmEvYnVpbGQvbGlicyI+CisgICAgICA8aW5jbHVkZSBuYW1lPSJsaWJ0aHJpZnQqLmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCp0ZXN0LmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpqYXZhZG9jLmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpzb3VyY2VzLmphciIgLz4KICAgICA8L2ZpbGVzZXQ+Ci0gICAgPGZpbGVzZXQgZGlyPSIuLi8uLi9saWIvamF2YS9idWlsZC9saWIiPgorICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vbGliL2phdmEvYnVpbGQvZGVwcyI+CiAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KICAgICA8L2ZpbGVzZXQ+CiAgIDwvcGF0aD4KQEAgLTM3LDIzICszOSw3NiBAQAogICAgIDxwYXRoIHJlZmlkPSJsaWJzLmNsYXNzcGF0aCIgLz4KICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtnZW59IiAvPgogICA8L3BhdGg+CisgIDxwYXRoIGlkPSJ0dXRvcmlhbC5jbGFzc3BhdGgiPgorICAgIDxwYXRoIHJlZmlkPSJidWlsZC5jbGFzc3BhdGgiIC8+CisgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7YnVpbGR9IiAvPgorICAgIDxwYXRoZWxlbWVudCBwYXRoPSJ0dXRvcmlhbC5qYXIiIC8+CisgIDwvcGF0aD4KIAogICA8dGFyZ2V0IG5hbWU9ImluaXQiPgogICAgIDx0c3RhbXAgLz4KICAgICA8bWtkaXIgZGlyPSIke2J1aWxkfSIvPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGR9L2xvZyIvPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9ImluaXQiPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7Z2VufSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiIC8+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJidWlsZC5jbGFzc3BhdGgiIC8+CisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iaW5pdCwgZ2VuZXJhdGUiPgorICAgIDxqYXZhYyBjb21waWxlcj0ibW9kZXJuIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtnZW59IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJsaWJzLmNsYXNzcGF0aCIgLz4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7c3JjfSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0iYnVpbGQuY2xhc3NwYXRoIiAvPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9InR1dG9yaWFsIiBkZXBlbmRzPSJjb21waWxlIj4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXBlbmRzPSJ0dXRvcmlhbCIgLz4KKworICA8dGFyZ2V0IG5hbWU9InR1dG9yaWFsIiBkZXNjcmlwdGlvbj0iUnVuIHRoZSB0dXRvcmlhbCIgZGVwZW5kcz0iY29tcGlsZSI+CiAgICAgPGphciBqYXJmaWxlPSJ0dXRvcmlhbC5qYXIiIGJhc2VkaXI9IiR7YnVpbGR9Ii8+CisgICAgPHBhcmFsbGVsPgorICAgICAgPGphdmEgY2xhc3NuYW1lPSJKYXZhU2VydmVyIiBmb3JrPSJ0cnVlIiB0aW1lb3V0PSIxMDAwMCIKKyAgICAgICAgY2xhc3NwYXRocmVmPSJ0dXRvcmlhbC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJmYWxzZSIgb3V0cHV0PSIke2J1aWxkfS9sb2cvdHV0b3JpYWwubG9nIj4KKyAgICAgIDwvamF2YT4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8c2xlZXAgc2Vjb25kcz0iMiIvPgorICAgICAgICA8ZWNobz50dXRvcmlhbCBjbGllbnQgc2ltcGxlOjwvZWNobz4KKyAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJKYXZhQ2xpZW50IgorICAgICAgICAgIGNsYXNzcGF0aHJlZj0idHV0b3JpYWwuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICAgICAgPGFyZyBsaW5lPSJzaW1wbGUiLz4KKyAgICAgICAgPC9qYXZhPgorICAgICAgICA8ZWNobz50dXRvcmlhbCBjbGllbnQgc2VjdXJlOjwvZWNobz4KKyAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJKYXZhQ2xpZW50IgorICAgICAgICAgIGNsYXNzcGF0aHJlZj0idHV0b3JpYWwuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICAgICAgPGFyZyBsaW5lPSJzZWN1cmUiLz4KKyAgICAgICAgPC9qYXZhPgorICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvcGFyYWxsZWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUiPgorICAgIDwhLS0gR2VuZXJhdGUgdGhlIHRocmlmdCBnZW4tamF2YSBzb3VyY2UgLS0+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyBsaW5lPSItLWdlbiBqYXZhIC1yICAuLi90dXRvcmlhbC50aHJpZnQiLz4KKyAgICA8L2V4ZWM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idHV0b3JpYWxjbGllbnQiIGRlc2NyaXB0aW9uPSJSdW4gYSB0dXRvcmlhbCBjbGllbnQiIGRlcGVuZHM9ImNvbXBpbGUiPgorICAgIDxlY2hvPnR1dG9yaWFsIGNsaWVudCBzaW1wbGU6PC9lY2hvPgorICAgIDxqYXZhIGNsYXNzbmFtZT0iSmF2YUNsaWVudCIKKyAgICAgIGNsYXNzcGF0aHJlZj0idHV0b3JpYWwuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9InNpbXBsZSIvPgorICAgIDwvamF2YT4KKyAgICA8ZWNobz50dXRvcmlhbCBjbGllbnQgc2VjdXJlOjwvZWNobz4KKyAgICA8amF2YSBjbGFzc25hbWU9IkphdmFDbGllbnQiCisgICAgICBjbGFzc3BhdGhyZWY9InR1dG9yaWFsLmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyBsaW5lPSJzZWN1cmUiLz4KKyAgICA8L2phdmE+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idHV0b3JpYWxzZXJ2ZXIiIGRlc2NyaXB0aW9uPSJSdW4gYSB0dXRvcmlhbCBzZXJ2ZXIiIGRlcGVuZHM9ImNvbXBpbGUiPgorICAgICAgPGphdmEgY2xhc3NuYW1lPSJKYXZhU2VydmVyIiBmb3JrPSJ0cnVlIgorICAgICAgICBjbGFzc3BhdGhyZWY9InR1dG9yaWFsLmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9ImZhbHNlIiBvdXRwdXQ9IiR7YnVpbGR9L2xvZy90dXRvcmlhbC5sb2ciPgorICAgICAgPC9qYXZhPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZH0iIC8+CisgICAgPGRlbGV0ZSBkaXI9IiR7Z2VufSIvPgogICAgIDxkZWxldGUgZmlsZT0idHV0b3JpYWwuamFyIiAvPgogICA8L3RhcmdldD4KIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvamF2YS9zcmMvQ2FsY3VsYXRvckhhbmRsZXIuamF2YSBiL3R1dG9yaWFsL2phdmEvc3JjL0NhbGN1bGF0b3JIYW5kbGVyLmphdmEKaW5kZXggNDIxNmJlNS4uOTI5NDRiMCAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvamF2YS9zcmMvQ2FsY3VsYXRvckhhbmRsZXIuamF2YQorKysgYi90dXRvcmlhbC9qYXZhL3NyYy9DYWxjdWxhdG9ySGFuZGxlci5qYXZhCkBAIC01OCw3ICs1OCw3IEBACiAgICAgY2FzZSBESVZJREU6CiAgICAgICBpZiAod29yay5udW0yID09IDApIHsKICAgICAgICAgSW52YWxpZE9wZXJhdGlvbiBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uKCk7Ci0gICAgICAgIGlvLndoYXQgPSB3b3JrLm9wLmdldFZhbHVlKCk7CisgICAgICAgIGlvLndoYXRPcCA9IHdvcmsub3AuZ2V0VmFsdWUoKTsKICAgICAgICAgaW8ud2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCI7CiAgICAgICAgIHRocm93IGlvOwogICAgICAgfQpAQCAtNjYsNyArNjYsNyBAQAogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIEludmFsaWRPcGVyYXRpb24gaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOwotICAgICAgaW8ud2hhdCA9IHdvcmsub3AuZ2V0VmFsdWUoKTsKKyAgICAgIGlvLndoYXRPcCA9IHdvcmsub3AuZ2V0VmFsdWUoKTsKICAgICAgIGlvLndoeSA9ICJVbmtub3duIG9wZXJhdGlvbiI7CiAgICAgICB0aHJvdyBpbzsKICAgICB9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9qcy9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL2pzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNmZTA4ODgKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9qcy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDM5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZXhwb3J0IENMQVNTUEFUSAorCisjIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBhbnQgaXMgbm90IGNvbmZpZ3VyZWQuCitjbGVhbi1sb2NhbDoKKwlBTlQ9JChBTlQpIDsgaWYgdGVzdCAteiAiJCRBTlQiIDsgdGhlbiBBTlQ9OiA7IGZpIDsgXAorCSQkQU5UICQoQU5UX0ZMQUdTKSBjbGVhbgorCithbGwtbG9jYWw6CisJJChBTlQpICQoQU5UX0ZMQUdTKSBjb21waWxlCisKK2NoZWNrLWxvY2FsOiBhbGwKKwkkKEFOVCkgJChBTlRfRkxBR1MpIHRlc3QKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCSQoQU5UKSAkKEFOVF9GTEFHUykgdHV0b3JpYWxzZXJ2ZXIKKworRVhUUkFfRElTVCA9IFwKKwlidWlsZC54bWwgXAorCXNyYyBcCisJdHV0b3JpYWwuaHRtbApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvanMvYnVpbGQueG1sIGIvdHV0b3JpYWwvanMvYnVpbGQueG1sCmluZGV4IGY3NTc3ODkuLjAzYTZlN2MgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2pzL2J1aWxkLnhtbAorKysgYi90dXRvcmlhbC9qcy9idWlsZC54bWwKQEAgLTIyLDE5ICsyMiwyMiBAQAogCiAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIGxvY2F0aW9uPSJzcmMiIC8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhc3JjIiBsb2NhdGlvbj0iLi4vamF2YS9zcmMiIC8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJnZW4iIGxvY2F0aW9uPSIuLi9nZW4tamF2YSIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImdlbiIgbG9jYXRpb249Ii4uL2phdmEvZ2VuLWphdmEiIC8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZCIgbG9jYXRpb249ImJ1aWxkIiAvPgogCiAgIDwhLS0gdGhlIHJvb3QgZGlyZWN0b3J5LCB3aGVyZSB5b3UgdW5wYWNrIHRocmlmdCBkaXN0aWJ1dGlvbiAoZS5nLiB0aHJpZnQtMC54LngudGFyLmd6KSAtLT4KICAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5kaXIiIGxvY2F0aW9uPSIuLi8uLi8iIC8+CisgIDwhLS0gSmF2YVNjcmlwdCB0dXRvcmlhbCBkZXBlbmRzIG9uIHRoZSBqYXZhIHR1dG9yaWFsIHRocmlmdCBoYW5kbGVyIGFuZCBzZXJ2ZXIgaW5mcmFzdHJ1Y3R1cmUgLS0+CiAgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuamF2YS5kaXIiIGxvY2F0aW9uPSIke3RocmlmdC5kaXJ9L2xpYi9qYXZhIiAvPgogCiAgIDxwYXRoIGlkPSJsaWJzLmNsYXNzcGF0aCI+Ci0gICAgPGZpbGVzZXQgZGlyPSIuLi8uLi9saWIvamF2YS9idWlsZCI+Ci0gICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KLSAgICAgIDxleGNsdWRlIG5hbWU9Ii10ZXN0LmphciIgLz4KKyAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9saWJzIj4KKyAgICAgIDxpbmNsdWRlIG5hbWU9ImxpYnRocmlmdCouamFyIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KnRlc3QuamFyIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KmphdmFkb2MuamFyIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KnNvdXJjZXMuamFyIiAvPgogICAgIDwvZmlsZXNldD4KLSAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uL2xpYi9qYXZhL2J1aWxkL2xpYiI+CisgICAgPGZpbGVzZXQgZGlyPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvZGVwcyI+CiAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KICAgICA8L2ZpbGVzZXQ+CiAgIDwvcGF0aD4KQEAgLTUwLDMwICs1MywzOSBAQAogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9ImluaXQiPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7Z2VufSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiIC8+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtqYXZhc3JjfSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0iYnVpbGQuY2xhc3NwYXRoIj4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7Z2VufSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiIC8+CisgICAgPGphdmFjIGNvbXBpbGVyPSJtb2Rlcm4iIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke2phdmFzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJidWlsZC5jbGFzc3BhdGgiPgogICAgICAgPGV4Y2x1ZGUgbmFtZT0iSmF2YUNsaWVudC5qYXZhIi8+CiAgICAgICA8ZXhjbHVkZSBuYW1lPSJKYXZhU2VydmVyLmphdmEiLz4KICAgICAgIDxpbmNsdWRlIG5hbWU9IkNhbGN1bGF0b3JIYW5kbGVyLmphdmEiLz4KICAgICA8L2phdmFjPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7c3JjfSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0iYnVpbGQuY2xhc3NwYXRoIj4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7c3JjfSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0iYnVpbGQuY2xhc3NwYXRoIj4KICAgICAgIDxjb21waWxlcmFyZyB2YWx1ZT0iLVhsaW50OmFsbCIvPgogICAgIDwvamF2YWM+CiAgIDwvdGFyZ2V0PgogCisgIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVwZW5kcz0idHV0b3JpYWwiIC8+CisKICAgPHRhcmdldCBuYW1lPSJ0dXRvcmlhbCIgZGVwZW5kcz0iY29tcGlsZSI+CiAgICAgPGphciBqYXJmaWxlPSJ0dXRvcmlhbC1qcy5qYXIiIGJhc2VkaXI9IiR7YnVpbGR9Ii8+CiAgIDwvdGFyZ2V0PgogCi0gIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249InJ1biB0aGUgdGVzdCBzZXJ2ZXIiIGRlcGVuZHM9InR1dG9yaWFsIj4KKyAgPHRhcmdldCBuYW1lPSJ0dXRvcmlhbHNlcnZlciIgZGVzY3JpcHRpb249InJ1biB0aGUgdGVzdCBzZXJ2ZXIiIGRlcGVuZHM9InR1dG9yaWFsLCBnZW5lcmF0ZSI+CiAgICAgPGphdmEgY2xhc3NuYW1lPSJIdHRwZCIgZm9yaz0idHJ1ZSIKICAgICAgIGNsYXNzcGF0aHJlZj0iYnVpbGQuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSI+CiAgICAgICA8YXJnIHZhbHVlPSIuLi8uLi8iIC8+CiAgICAgPC9qYXZhPgogICA8L3RhcmdldD4KIAorICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlIj4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGpzIC1yICAuLi90dXRvcmlhbC50aHJpZnQiLz4KKyAgICA8L2V4ZWM+CisgIDwvdGFyZ2V0PgorCiAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgogICAgIDxkZWxldGUgZGlyPSIke2J1aWxkfSIgLz4KKyAgICA8ZGVsZXRlIGRpcj0iZ2VuLWpzIi8+CiAgICAgPGRlbGV0ZSBmaWxlPSJ0dXRvcmlhbC1qcy5qYXIiIC8+CiAgIDwvdGFyZ2V0PgogCmRpZmYgLS1naXQgYS90dXRvcmlhbC9qcy90dXRvcmlhbC5odG1sIGIvdHV0b3JpYWwvanMvdHV0b3JpYWwuaHRtbApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGEzNGM5ZjMuLmQwMjBiZWQKLS0tIGEvdHV0b3JpYWwvanMvdHV0b3JpYWwuaHRtbAorKysgYi90dXRvcmlhbC9qcy90dXRvcmlhbC5odG1sCkBAIC0yMiwxMSArMjIsMTEgQEAKICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CiAgIDx0aXRsZT5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5ncyAtIFR1dG9yaWFsIEV4YW1wbGU8L3RpdGxlPgogCi0gIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvanMvdGhyaWZ0LmpzIiAgICAgICAgICAgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgotICA8c2NyaXB0IHNyYz0iLi4vZ2VuLWpzL3R1dG9yaWFsX3R5cGVzLmpzIiAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgotICA8c2NyaXB0IHNyYz0iLi4vZ2VuLWpzL3NoYXJlZF90eXBlcy5qcyIgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgotICA8c2NyaXB0IHNyYz0iLi4vZ2VuLWpzL1NoYXJlZFNlcnZpY2UuanMiICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgotICA8c2NyaXB0IHNyYz0iLi4vZ2VuLWpzL0NhbGN1bGF0b3IuanMiICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2pzL3NyYy90aHJpZnQuanMiICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzL3R1dG9yaWFsX3R5cGVzLmpzIiAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzL3NoYXJlZF90eXBlcy5qcyIgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1NoYXJlZFNlcnZpY2UuanMiICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzL0NhbGN1bGF0b3IuanMiICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogCiAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvMS40LjIvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAKQEAgLTQ5LDcgKzQ5LDcgQEAKICAgICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOwogICAgIHZhciBjbGllbnQgICAgPSBuZXcgQ2FsY3VsYXRvckNsaWVudChwcm90b2NvbCk7CiAKLSAgICB2YXIgd29yayA9IG5ldyBXb3JrKCkKKyAgICB2YXIgd29yayA9IG5ldyBXb3JrKCk7CiAgICAgd29yay5udW0xID0gJCgiI251bTEiKS52YWwoKTsKICAgICB3b3JrLm51bTIgPSAkKCIjbnVtMiIpLnZhbCgpOwogICAgIHdvcmsub3AgPSAkKCIjb3AiKS52YWwoKTsKQEAgLTk4LDcgKzk4LDcgQEAKICAgPC90YWJsZT4KICAgPC9mb3JtPgogICAKLSAgPHA+VGhpcyBKYXZhIFNjcmlwdCBleGFtcGxlIHVzZXMgPGEgaHJlZj0iaHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0L3RydW5rL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdCI+dHV0b3JpYWwudGhyaWZ0PC9hPiBhbmQgYSBUaHJpZnQgc2VydmVyIHVzaW5nIEpTT04gcHJvdG9jb2wgYW5kIEhUVFAgdHJhbnNwb3J0LgorICA8cD5UaGlzIEphdmEgU2NyaXB0IGV4YW1wbGUgdXNlcyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iL21hc3Rlci90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQiPnR1dG9yaWFsLnRocmlmdDwvYT4gYW5kIGEgVGhyaWZ0IHNlcnZlciB1c2luZyBKU09OIHByb3RvY29sIGFuZCBIVFRQIHRyYW5zcG9ydC4KICAgPC9wPgogICAgIDxwPgogICAgICAgICA8YSBocmVmPSJodHRwOi8vdmFsaWRhdG9yLnczLm9yZy9jaGVjay9yZWZlcmVyIj48aW1nCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlLy5naXRpZ25vcmUgYi90dXRvcmlhbC9uZXRjb3JlLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzOGJiMgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACishKiovKi5wZngKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9DbGllbnQuY3Nwcm9qIGIvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvQ2xpZW50LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTEyNzJkCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvQ2xpZW50LmNzcHJvagpAQCAtMCwwICsxLDE5IEBACis8UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKworICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldGNvcmVhcHAyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgICA8QXNzZW1ibHlOYW1lPkNsaWVudDwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+Q2xpZW50PC9QYWNrYWdlSWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxJbnRlcmZhY2VzXEludGVyZmFjZXMuY3Nwcm9qIiAvPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxuZXRjb3JlXFRocmlmdFxUaHJpZnQuY3Nwcm9qIiAvPgorICA8L0l0ZW1Hcm91cD4KKworPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvZ3JhbS5jcyBiL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L1Byb2dyYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1ZDhjNwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L1Byb2dyYW0uY3MKQEAgLTAsMCArMSwzNTUgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLk5ldC5TZWN1cml0eTsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgTWljcm9zb2Z0LkV4dGVuc2lvbnMuTG9nZ2luZzsKK3VzaW5nIFRocmlmdDsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudDsKK3VzaW5nIHR1dG9yaWFsOwordXNpbmcgc2hhcmVkOworCituYW1lc3BhY2UgQ2xpZW50Cit7CisgICAgcHVibGljIGNsYXNzIFByb2dyYW0KKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IElMb2dnZXIgTG9nZ2VyID0gbmV3IExvZ2dlckZhY3RvcnkoKS5BZGRDb25zb2xlKCkuQWRkRGVidWcoKS5DcmVhdGVMb2dnZXIobmFtZW9mKENsaWVudCkpOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRGlzcGxheUhlbHAoKQorICAgICAgICB7CisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oQCIKK1VzYWdlOiAKKyAgICBDbGllbnQuZXhlIC1oZWxwCisgICAgICAgIHdpbGwgZGlwbGF5IGhlbHAgaW5mb3JtYXRpb24gCisKKyAgICBDbGllbnQuZXhlIC10cjo8dHJhbnNwb3J0PiAtcHI6PHByb3RvY29sPiAtbWM6PG51bUNsaWVudHM+CisgICAgICAgIHdpbGwgcnVuIGNsaWVudCB3aXRoIHNwZWNpZmllZCBhcmd1bWVudHMgKHRjcCB0cmFuc3BvcnQgYW5kIGJpbmFyeSBwcm90b2NvbCBieSBkZWZhdWx0KSBhbmQgd2l0aCAxIGNsaWVudAorCitPcHRpb25zOgorICAgIC10ciAodHJhbnNwb3J0KTogCisgICAgICAgIHRjcCAtIChkZWZhdWx0KSB0Y3AgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICB0Y3BidWZmZXJlZCAtIGJ1ZmZlcmVkIHRyYW5zcG9ydCBvdmVyIHRjcCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgbmFtZWRwaXBlIC0gbmFtZWRwaXBlIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKHBpcGUgYWRkcmVzcyAtICIiLnRlc3QiIikKKyAgICAgICAgaHR0cCAtIGh0dHAgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoYWRkcmVzcyAtICIiaHR0cDovL2xvY2FsaG9zdDo5MDkwIiIpICAgICAgICAKKyAgICAgICAgdGNwdGxzIC0gdGNwIHRscyB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIGZyYW1lZCAtIHRjcCBmcmFtZWQgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorCisgICAgLXByIChwcm90b2NvbCk6IAorICAgICAgICBiaW5hcnkgLSAoZGVmYXVsdCkgYmluYXJ5IHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBjb21wYWN0IC0gY29tcGFjdCBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAganNvbiAtIGpzb24gcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIG11bHRpcGxleGVkIC0gbXVsdGlwbGV4ZWQgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisKKyAgICAtbWMgKG11bHRpcGxlIGNsaWVudHMpOgorICAgICAgICA8bnVtQ2xpZW50cz4gLSBudW1iZXIgb2YgbXVsdGlwbGUgY2xpZW50cyB0byBjb25uZWN0IHRvIHNlcnZlciAobWF4IDEwMCwgZGVmYXVsdCAxKQorCitTYW1wbGU6CisgICAgQ2xpZW50LmV4ZSAtdHI6dGNwIC1wOmJpbmFyeQorIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBhcmdzID0gYXJncyA/PyBuZXcgc3RyaW5nWzBdOworCisgICAgICAgICAgICBpZiAoYXJncy5BbnkoeCA9PiB4LlN0YXJ0c1dpdGgoIi1oZWxwIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERpc3BsYXlIZWxwKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oIlN0YXJ0aW5nIGNsaWVudC4uLiIpOworCisgICAgICAgICAgICB1c2luZyAodmFyIHNvdXJjZSA9IG5ldyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJ1bkFzeW5jKGFyZ3MsIHNvdXJjZS5Ub2tlbikuR2V0QXdhaXRlcigpLkdldFJlc3VsdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgVGFzayBSdW5Bc3luYyhzdHJpbmdbXSBhcmdzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG51bUNsaWVudHMgPSBHZXROdW1iZXJPZkNsaWVudHMoYXJncyk7CisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIlNlbGVjdGVkICMgb2YgY2xpZW50czoge251bUNsaWVudHN9Iik7CisKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnRzID0gbmV3IFRDbGllbnRUcmFuc3BvcnRbbnVtQ2xpZW50c107CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNsaWVudHM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdCA9IEdldFRyYW5zcG9ydChhcmdzKTsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnRzW2ldID0gdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQiU2VsZWN0ZWQgY2xpZW50IHRyYW5zcG9ydDoge3RyYW5zcG9ydHNbMF19Iik7CisKKyAgICAgICAgICAgIHZhciBwcm90b2NvbHMgPSBuZXcgVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD5bbnVtQ2xpZW50c107CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNsaWVudHM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcCA9IEdldFByb3RvY29sKGFyZ3MsIHRyYW5zcG9ydHNbaV0pOworICAgICAgICAgICAgICAgIHByb3RvY29sc1tpXSA9IHA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIlNlbGVjdGVkIGNsaWVudCBwcm90b2NvbDoge3Byb3RvY29sc1swXS5JdGVtMX0iKTsKKworICAgICAgICAgICAgdmFyIHRhc2tzID0gbmV3IFRhc2tbbnVtQ2xpZW50c107CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNsaWVudHM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdGFzayA9IFJ1bkNsaWVudEFzeW5jKHByb3RvY29sc1tpXSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIHRhc2tzW2ldID0gdGFzazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVGFzay5XYWl0QWxsKHRhc2tzKTsKKworICAgICAgICAgICAgYXdhaXQgVGFzay5Db21wbGV0ZWRUYXNrOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVENsaWVudFRyYW5zcG9ydCBHZXRUcmFuc3BvcnQoc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRyYW5zcG9ydCA9IGFyZ3MuRmlyc3RPckRlZmF1bHQoeCA9PiB4LlN0YXJ0c1dpdGgoIi10ciIpKT8uU3BsaXQoJzonKT9bMV07CisKKyAgICAgICAgICAgIFRyYW5zcG9ydCBzZWxlY3RlZFRyYW5zcG9ydDsKKyAgICAgICAgICAgIGlmIChFbnVtLlRyeVBhcnNlKHRyYW5zcG9ydCwgdHJ1ZSwgb3V0IHNlbGVjdGVkVHJhbnNwb3J0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHNlbGVjdGVkVHJhbnNwb3J0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuVGNwOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcy5Mb29wYmFjaywgOTA5MCk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0Lk5hbWVkUGlwZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydCgiLnRlc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuSHR0cDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEh0dHBDbGllbnRUcmFuc3BvcnQobmV3IFVyaSgiaHR0cDovL2xvY2FsaG9zdDo5MDkwIiksIG51bGwpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5UY3BCdWZmZXJlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEJ1ZmZlcmVkQ2xpZW50VHJhbnNwb3J0KG5ldyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcy5Mb29wYmFjaywgOTA5MCkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5UY3BUbHM6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQoSVBBZGRyZXNzLkxvb3BiYWNrLCA5MDkwLCBHZXRDZXJ0aWZpY2F0ZSgpLCBDZXJ0VmFsaWRhdG9yLCBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2spOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5GcmFtZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRGcmFtZWRDbGllbnRUcmFuc3BvcnQobmV3IFRTb2NrZXRDbGllbnRUcmFuc3BvcnQoSVBBZGRyZXNzLkxvb3BiYWNrLCA5MDkwKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IFRTb2NrZXRDbGllbnRUcmFuc3BvcnQoSVBBZGRyZXNzLkxvb3BiYWNrLCA5MDkwKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBHZXROdW1iZXJPZkNsaWVudHMoc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG51bUNsaWVudHMgPSBhcmdzLkZpcnN0T3JEZWZhdWx0KHggPT4geC5TdGFydHNXaXRoKCItbWMiKSk/LlNwbGl0KCc6Jyk/WzFdOworCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJTZWxlY3RlZCAjIG9mIGNsaWVudHM6IHtudW1DbGllbnRzfSIpOworCisgICAgICAgICAgICBpbnQgYzsKKyAgICAgICAgICAgIGlmKCBpbnQuVHJ5UGFyc2UobnVtQ2xpZW50cywgb3V0IGMpICYmICgwIDwgYykgJiYgKGMgPD0gMTAwKSkKKwkJCQlyZXR1cm4gYzsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFg1MDlDZXJ0aWZpY2F0ZTIgR2V0Q2VydGlmaWNhdGUoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkdWUgdG8gZmlsZXMgbG9jYXRpb24gaW4gbmV0IGNvcmUgYmV0dGVyIHRvIHRha2UgY2VydHMgZnJvbSB0b3AgZm9sZGVyCisgICAgICAgICAgICB2YXIgY2VydEZpbGUgPSBHZXRDZXJ0UGF0aChEaXJlY3RvcnkuR2V0UGFyZW50KERpcmVjdG9yeS5HZXRDdXJyZW50RGlyZWN0b3J5KCkpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgWDUwOUNlcnRpZmljYXRlMihjZXJ0RmlsZSwgIlRocmlmdFRlc3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBHZXRDZXJ0UGF0aChEaXJlY3RvcnlJbmZvIGRpLCBpbnQgbWF4Q291bnQgPSA2KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdG9wRGlyID0gZGk7CisgICAgICAgICAgICB2YXIgY2VydEZpbGUgPQorICAgICAgICAgICAgICAgIHRvcERpci5FbnVtZXJhdGVGaWxlcygiVGhyaWZ0VGVzdC5wZngiLCBTZWFyY2hPcHRpb24uQWxsRGlyZWN0b3JpZXMpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKGNlcnRGaWxlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1heENvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkNhbm5vdCBmaW5kIGZpbGUgaW4gZGlyZWN0b3JpZXMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0Q2VydFBhdGgoZGkuUGFyZW50LCBtYXhDb3VudCAtIDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gY2VydEZpbGUuRnVsbE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYNTA5Q2VydGlmaWNhdGUgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrKG9iamVjdCBzZW5kZXIsCisgICAgICAgICAgICBzdHJpbmcgdGFyZ2V0SG9zdCwgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbiBsb2NhbENlcnRpZmljYXRlcywKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSByZW1vdGVDZXJ0aWZpY2F0ZSwgc3RyaW5nW10gYWNjZXB0YWJsZUlzc3VlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXRDZXJ0aWZpY2F0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBDZXJ0VmFsaWRhdG9yKG9iamVjdCBzZW5kZXIsIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgIFg1MDlDaGFpbiBjaGFpbiwgU3NsUG9saWN5RXJyb3JzIHNzbFBvbGljeUVycm9ycykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBUdXBsZTxQcm90b2NvbCwgVFByb3RvY29sPiBHZXRQcm90b2NvbChzdHJpbmdbXSBhcmdzLCBUQ2xpZW50VHJhbnNwb3J0IHRyYW5zcG9ydCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHByb3RvY29sID0gYXJncy5GaXJzdE9yRGVmYXVsdCh4ID0+IHguU3RhcnRzV2l0aCgiLXByIikpPy5TcGxpdCgnOicpP1sxXTsKKworICAgICAgICAgICAgUHJvdG9jb2wgc2VsZWN0ZWRQcm90b2NvbDsKKyAgICAgICAgICAgIGlmIChFbnVtLlRyeVBhcnNlKHByb3RvY29sLCB0cnVlLCBvdXQgc2VsZWN0ZWRQcm90b2NvbCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzZWxlY3RlZFByb3RvY29sKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQcm90b2NvbC5CaW5hcnk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+KHNlbGVjdGVkUHJvdG9jb2wsIG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUHJvdG9jb2wuQ29tcGFjdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4oc2VsZWN0ZWRQcm90b2NvbCwgbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnNwb3J0KSk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUHJvdG9jb2wuSnNvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4oc2VsZWN0ZWRQcm90b2NvbCwgbmV3IFRKc29uUHJvdG9jb2wodHJhbnNwb3J0KSk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUHJvdG9jb2wuTXVsdGlwbGV4ZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCByZXR1cm5zIEJpbmFyeVByb3RvY29sIHRvIGF2b2lkIG1ha2luZyB3cmFwcGVkIHByb3RvY29sIGFzIHB1YmxpYyBpbiBUUHJvdG9jb2xEZWNvcmF0b3IgKGluIFJ1bkNsaWVudEFzeW5jIGl0IHdpbGwgYmUgd3JhcHBlZCBpbnRvIE11bHRpcGxleGVkIHByb3RvY29sKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUdXBsZTxQcm90b2NvbCwgVFByb3RvY29sPihzZWxlY3RlZFByb3RvY29sLCBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBUdXBsZTxQcm90b2NvbCwgVFByb3RvY29sPihzZWxlY3RlZFByb3RvY29sLCBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgVGFzayBSdW5DbGllbnRBc3luYyhUdXBsZTxQcm90b2NvbCwgVFByb3RvY29sPiBwcm90b2NvbFR1cGxlLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gcHJvdG9jb2xUdXBsZS5JdGVtMjsKKyAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2xUeXBlID0gcHJvdG9jb2xUdXBsZS5JdGVtMTsKKworICAgICAgICAgICAgICAgIFRCYXNlQ2xpZW50IGNsaWVudCA9IG51bGw7CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm90b2NvbFR5cGUgIT0gUHJvdG9jb2wuTXVsdGlwbGV4ZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50ID0gbmV3IENhbGN1bGF0b3IuQ2xpZW50KHByb3RvY29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IEV4ZWN1dGVDYWxjdWxhdG9yQ2xpZW50T3BlcmF0aW9ucyhjYW5jZWxsYXRpb25Ub2tlbiwgKENhbGN1bGF0b3IuQ2xpZW50KWNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCB1c2VzIGJpbmFyeSBwcm90b2NvbCB0aGVyZSAgdG8gY3JlYXRlIE11bHRpcGxleGVkIHByb3RvY29scworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG11bHRpcGxleCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgbmFtZW9mKENhbGN1bGF0b3IpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChtdWx0aXBsZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgRXhlY3V0ZUNhbGN1bGF0b3JDbGllbnRPcGVyYXRpb25zKGNhbmNlbGxhdGlvblRva2VuLCAoQ2FsY3VsYXRvci5DbGllbnQpY2xpZW50KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGV4ID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCBuYW1lb2YoU2hhcmVkU2VydmljZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50ID0gbmV3IFNoYXJlZFNlcnZpY2UuQ2xpZW50KG11bHRpcGxleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBFeGVjdXRlU2hhcmVkU2VydmljZUNsaWVudE9wZXJhdGlvbnMoY2FuY2VsbGF0aW9uVG9rZW4sIChTaGFyZWRTZXJ2aWNlLkNsaWVudCljbGllbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMb2dnZXIuTG9nRXJyb3IoJCJ7Y2xpZW50Py5DbGllbnRJZH0gIiArIGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wuVHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dFcnJvcih4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgVGFzayBFeGVjdXRlQ2FsY3VsYXRvckNsaWVudE9wZXJhdGlvbnMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4sIENhbGN1bGF0b3IuQ2xpZW50IGNsaWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgY2xpZW50Lk9wZW5UcmFuc3BvcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIC8vIEFzeW5jIHZlcnNpb24KKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gUGluZ0FzeW5jKCkiKTsKKyAgICAgICAgICAgIGF3YWl0IGNsaWVudC5waW5nQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBBZGRBc3luYygxLDEpIik7CisgICAgICAgICAgICB2YXIgc3VtID0gYXdhaXQgY2xpZW50LmFkZEFzeW5jKDEsIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IEFkZEFzeW5jKDEsMSk9e3N1bX0iKTsKKworICAgICAgICAgICAgdmFyIHdvcmsgPSBuZXcgV29yaworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE9wID0gT3BlcmF0aW9uLkRJVklERSwKKyAgICAgICAgICAgICAgICBOdW0xID0gMSwKKyAgICAgICAgICAgICAgICBOdW0yID0gMAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gQ2FsY3VsYXRlQXN5bmMoMSkiKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQuY2FsY3VsYXRlQXN5bmMoMSwgd29yaywgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IFdob2Egd2UgY2FuIGRpdmlkZSBieSAwIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSW52YWxpZE9wZXJhdGlvbiBpbykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBJbnZhbGlkIG9wZXJhdGlvbjogIiArIGlvKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd29yay5PcCA9IE9wZXJhdGlvbi5TVUJUUkFDVDsKKyAgICAgICAgICAgIHdvcmsuTnVtMSA9IDE1OworICAgICAgICAgICAgd29yay5OdW0yID0gMTA7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IENhbGN1bGF0ZUFzeW5jKDEpIik7CisgICAgICAgICAgICAgICAgdmFyIGRpZmYgPSBhd2FpdCBjbGllbnQuY2FsY3VsYXRlQXN5bmMoMSwgd29yaywgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IDE1LTEwPXtkaWZmfSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEludmFsaWRPcGVyYXRpb24gaW8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gSW52YWxpZCBvcGVyYXRpb246ICIgKyBpbyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IEdldFN0cnVjdEFzeW5jKDEpIik7CisgICAgICAgICAgICB2YXIgbG9nID0gYXdhaXQgY2xpZW50LmdldFN0cnVjdEFzeW5jKDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IENoZWNrIGxvZzoge2xvZy5WYWx1ZX0iKTsKKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gWmlwQXN5bmMoKSB3aXRoIGRlbGF5IDEwMG1jIG9uIHNlcnZlciBzaWRlIik7CisgICAgICAgICAgICBhd2FpdCBjbGllbnQuemlwQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgRXhlY3V0ZVNoYXJlZFNlcnZpY2VDbGllbnRPcGVyYXRpb25zKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuLCBTaGFyZWRTZXJ2aWNlLkNsaWVudCBjbGllbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IGNsaWVudC5PcGVuVHJhbnNwb3J0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICAvLyBBc3luYyB2ZXJzaW9uCisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IFNoYXJlZFNlcnZpY2UgR2V0U3RydWN0QXN5bmMoMSkiKTsKKyAgICAgICAgICAgIHZhciBsb2cgPSBhd2FpdCBjbGllbnQuZ2V0U3RydWN0QXN5bmMoMSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gU2hhcmVkU2VydmljZSBWYWx1ZToge2xvZy5WYWx1ZX0iKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBlbnVtIFRyYW5zcG9ydAorICAgICAgICB7CisgICAgICAgICAgICBUY3AsCisgICAgICAgICAgICBOYW1lZFBpcGUsCisgICAgICAgICAgICBIdHRwLAorICAgICAgICAgICAgVGNwQnVmZmVyZWQsCisgICAgICAgICAgICBGcmFtZWQsCisgICAgICAgICAgICBUY3BUbHMKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZW51bSBQcm90b2NvbAorICAgICAgICB7CisgICAgICAgICAgICBCaW5hcnksCisgICAgICAgICAgICBDb21wYWN0LAorICAgICAgICAgICAgSnNvbiwKKyAgICAgICAgICAgIE11bHRpcGxleGVkCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ODM4MmUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDQwIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCisKK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KKworW2Fzc2VtYmx5OiBHdWlkKCJkZTc4YTAxYi1mN2M2LTQ5ZDEtOTdkYS02NjlkMmVkMzc2NDEiKV0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9Qcm9wZXJ0aWVzL2xhdW5jaFNldHRpbmdzLmpzb24gYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9Qcm9wZXJ0aWVzL2xhdW5jaFNldHRpbmdzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI3YjYwZAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L1Byb3BlcnRpZXMvbGF1bmNoU2V0dGluZ3MuanNvbgpAQCAtMCwwICsxLDggQEAKK3sKKyAgInByb2ZpbGVzIjogeworICAgICJDbGllbnQiOiB7CisgICAgICAiY29tbWFuZE5hbWUiOiAiUHJvamVjdCIsCisgICAgICAiY29tbWFuZExpbmVBcmdzIjogIi1wOm11bHRpcGxleGVkIgorICAgIH0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L1RocmlmdFRlc3QucGZ4IGIvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvVGhyaWZ0VGVzdC5wZngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBkZWQyOAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L1RocmlmdFRlc3QucGZ4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy8uZ2l0aWdub3JlIGIvdHV0b3JpYWwvbmV0Y29yZS9JbnRlcmZhY2VzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3NDQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMyBAQAorIyBpZ25vcmUgZm9yIGF1dG9nZW5lcmF0ZWQgZmlsZXMKKy9zaGFyZWQKKy90dXRvcmlhbApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9JbnRlcmZhY2VzL0ludGVyZmFjZXMuY3Nwcm9qIGIvdHV0b3JpYWwvbmV0Y29yZS9JbnRlcmZhY2VzL0ludGVyZmFjZXMuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOTdhMDYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL0ludGVyZmFjZXMvSW50ZXJmYWNlcy5jc3Byb2oKQEAgLTAsMCArMSwzMCBAQAorPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisKKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXRzdGFuZGFyZDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+SW50ZXJmYWNlczwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+SW50ZXJmYWNlczwvUGFja2FnZUlkPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLi8uLi8uLi9saWIvbmV0Y29yZS9UaHJpZnQvVGhyaWZ0LmNzcHJvaiIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uU2VydmljZU1vZGVsLlByaW1pdGl2ZXMiIFZlcnNpb249Ils0LjQsKSIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKyAgPFRhcmdldCBOYW1lPSJQcmVCdWlsZCIgQmVmb3JlVGFyZ2V0cz0iX0dlbmVyYXRlUmVzdG9yZVByb2plY3RTcGVjO1Jlc3RvcmU7Q29tcGlsZSI+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSInJChPUyknID09ICdXaW5kb3dzX05UJyIgQ29tbWFuZD0id2hlcmUgdGhyaWZ0IiBDb25zb2xlVG9NU0J1aWxkPSJ0cnVlIj4KKyAgICAgIDxPdXRwdXQgVGFza1BhcmFtZXRlcj0iQ29uc29sZU91dHB1dCIgUHJvcGVydHlOYW1lPSJQYXRoVG9UaHJpZnQiIC8+CisgICAgPC9FeGVjPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFBhdGhUb1RocmlmdCknKSIgQ29tbWFuZD0iJChQYXRoVG9UaHJpZnQpIC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL3R1dG9yaWFsLnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygndGhyaWZ0JykiIENvbW1hbmQ9InRocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi90dXRvcmlhbC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJy4vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCcpIiBDb21tYW5kPSIuLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vdHV0b3JpYWwudGhyaWZ0IiAvPgorICA8L1RhcmdldD4KKworPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9JbnRlcmZhY2VzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdHV0b3JpYWwvbmV0Y29yZS9JbnRlcmZhY2VzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMjZiMTcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL0ludGVyZmFjZXMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw0MCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KKworW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCisKK1thc3NlbWJseTogR3VpZCgiNGQxMzE2M2QtOTA2Ny00YzljLThhZjAtNjRlMDg0NTEzOTdkIildClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL25ldGNvcmUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMwNTU1NgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0MiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1NVQkRJUlMgPSAuIAorCithbGwtbG9jYWw6CisJJChET1RORVRDT1JFKSBidWlsZAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSBJbnRlcmZhY2VzLmRsbAorCSQoUk0pIC1yIENsaWVudC9iaW4KKwkkKFJNKSAtciBDbGllbnQvb2JqCisJJChSTSkgLXIgU2VydmVyL2JpbgorCSQoUk0pIC1yIFNlcnZlci9vYmoKKwkkKFJNKSAtciBJbnRlcmZhY2VzL2JpbgorCSQoUk0pIC1yIEludGVyZmFjZXMvb2JqCisKK0VYVFJBX0RJU1QgPSBcCisJQ2xpZW50IFwKKwlJbnRlcmZhY2VzIFwKKwlSRUFETUUubWQgXAorCVNlcnZlciBcCisJVHV0b3JpYWwuc2xuIFwKKwlidWlsZC5jbWQgXAorCWJ1aWxkLnNoCisJCQkgCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL1JFQURNRS5tZCBiL3R1dG9yaWFsL25ldGNvcmUvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNmVmOTIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL1JFQURNRS5tZApAQCAtMCwwICsxLDI3OCBAQAorIyBCdWlsZGluZyBvZiBzYW1wbGVzIGZvciBkaWZmZXJlbnQgcGxhdGZvcm1zIAorCisjIFJldXNlZCBjb21wb25lbnRzIAorLSBORVQgQ29yZSBTdGFuZGFyZCAyLjAKKy0gTkVUIENvcmUgQXBwIDIuMAorCisjIEhvdyB0byBidWlsZAorLSBEb3dubG9hZCBhbmQgaW5zdGFsbCB0aGUgbGF0ZXN0IC5ORVQgQ29yZSBTREsgZm9yIHlvdXIgcGxhdGZvcm0gaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS9uZXQvY29yZSN3aW5kb3dzdnMyMDE1IChhcmNoaXZlIGZvciBTREsgMS4wLjAtcHJldmlldzItMDAzMTIxIGxvY2F0ZWQgYnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9kb3RuZXQvY29yZS9ibG9iL21hc3Rlci9yZWxlYXNlLW5vdGVzL2Rvd25sb2FkLWFyY2hpdmUubWQpCistIEVuc3VyZSB0aGF0IHlvdSBoYXZlIHRocmlmdC5leGUgd2hpY2ggc3VwcG9ydHMgbmV0Y29yZSBsaWIgYW5kIGl0IGFkZGVkIHRvIFBBVEggCistIEdvIHRvIGN1cnJlbnQgZm9sZGVyIAorLSBSdW4gKipidWlsZC5zaCoqIG9yICoqYnVpbGQuY21kKiogZnJvbSB0aGUgcm9vdCBvZiBjbG9uZWQgcmVwb3NpdG9yeQorLSBDaGVjayB0ZXN0cyBpbiAqKnNyYy9UZXN0cyoqIGZvbGRlcgorLSBDb250aW51ZSB3aXRoIC90dXRvcmlhbHMvbmV0Y29yZSAKKworIyBIb3cgdG8gcnVuIAorCitOb3RlczogZG90bmV0IHJ1biBzdXBwb3J0cyBwYXNzaW5nIGFyZ3VtZW50cyB0byBhcHAgYWZ0ZXIgLS0gc3ltYm9scyAoaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvZG90bmV0L2FydGljbGVzL2NvcmUvdG9vbHMvZG90bmV0LXJ1bikgLSBleGFtcGxlOiAqKmRvdG5ldCBydW4gLS0gLWgqKiB3aWxsIHNob3cgaGVscCBmb3IgYXBwCisKKy0gYnVpbGQgCistIGdvIHRvIGZvbGRlciAoQ2xpZW50L1NlcnZlcikgCistIHJ1biB3aXRoIHNwZWNpZnlpbmcgb2YgY29ycmVjdCBwYXJhbWV0ZXJzICoqZG90bmV0IHJ1biAtdHI6dGNwIC1wcjptdWx0aXBsZXhlZCoqLCAqKmRvdG5ldCBydW4gLWhlbHAqKiAobGF0ZXIsIGFmdGVyIG1pZ3JhdGlvbiB0byBjc3Byb2ogYW5kIGxhdGVzdCBTREsgd2lsbCBiZSBwb3NzaWJpbGl0eSB0byB1c2UgbW9yZSB1c2FibGUgZm9ybSAqKmRvdG5ldCBydW4gLS0gYXJndW1lbnRzKiopCisKKyNOb3RlcworLSBQb3NzaWJsZSBhZGRpbmcgYWRkaXRpb25hbCBwbGF0Zm9ybXMgYWZ0ZXIgc3RhYmlsaXphdGlvbiBvZiAuTkVUIENvcmUgKHJ1bnRpbWVzLCBwbGF0Zm9ybXMgKFJlZCBIYXQgTGludXgsIE9wZW5TdXNlLCBldGMuKSAKKworI0tub3duIGlzc3VlcworLSBJbiB0cmFjZSBsb2dnaW5nIG1vZGUgeW91IGNhbiBzZWUgc29tZSBub3QgaW1wb3J0YW50IGludGVybmFsIGV4Y2VwdGlvbnMKKworIyBSdW5uaW5nIG9mIHNhbXBsZXMgCitQbGVhc2UgaW5zdGFsbCBUaHJpZnQgQyMgLk5FVCBDb3JlIGxpYnJhcnkgb3IgY29weSBzb3VyY2VzIGFuZCBidWlsZCB0aGVtIHRvIGNvcnJlY2x5IGJ1aWxkIGFuZCBydW4gc2FtcGxlcyAKKworIyBOZXRDb3JlIFNlcnZlcgorCitVc2FnZTogCisKKyAgICBTZXJ2ZXIuZXhlIC1oCisgICAgICAgIHdpbGwgZGlwbGF5IGhlbHAgaW5mb3JtYXRpb24gCisKKyAgICBTZXJ2ZXIuZXhlIC10cjo8dHJhbnNwb3J0PiAtcHI6PHByb3RvY29sPiAKKyAgICAgICAgd2lsbCBydW4gc2VydmVyIHdpdGggc3BlY2lmaWVkIGFyZ3VtZW50cyAodGNwIHRyYW5zcG9ydCBhbmQgYmluYXJ5IHByb3RvY29sIGJ5IGRlZmF1bHQpCisKK09wdGlvbnM6CisKKyAgICAtdHIgKHRyYW5zcG9ydCk6IAorICAgICAgICB0Y3AgLSAoZGVmYXVsdCkgdGNwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgdGNwYnVmZmVyZWQgLSB0Y3AgYnVmZmVyZWQgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBuYW1lZHBpcGUgLSBuYW1lZHBpcGUgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAocGlwZSBhZGRyZXNzIC0gIiIudGVzdCIiKQorICAgICAgICBodHRwIC0gaHR0cCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChodHRwIGFkZHJlc3MgLSAiImxvY2FsaG9zdDo5MDkwIiIpCisgICAgICAgIHRjcHRscyAtIHRjcCB0cmFuc3BvcnQgd2l0aCB0bHMgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIGZyYW1lZCAtIHRjcCBmcmFtZWQgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorCisgICAgLXByIChwcm90b2NvbCk6IAorICAgICAgICBiaW5hcnkgLSAoZGVmYXVsdCkgYmluYXJ5IHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBjb21wYWN0IC0gY29tcGFjdCBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAganNvbiAtIGpzb24gcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisJCQorU2FtcGxlOgorCisgICAgU2VydmVyLmV4ZSAtdHI6dGNwCisKKyoqUmVtYXJrcyoqOgorCisgICAgRm9yIFRjcFRscyBtb2RlIGNlcnRpZmljYXRlJ3MgZmlsZSBUaHJpZnRUZXN0LnBmeCBzaG91bGQgYmUgaW4gZGlyZWN0b3J5IHdpdGggYmluYXJpZXMgaW4gY2FzZSBvZiBjb21tYW5kIGxpbmUgdXNhZ2UgKG9yIGF0IHByb2plY3QgbGV2ZWwgaW4gY2FzZSBvZiBkZWJ1Z2dpbmcgZnJvbSBJREUpLgorICAgIFBhc3N3b3JkIGZvciBjZXJ0aWZpY2F0ZSAtICJUaHJpZnRUZXN0Ii4KKworCisKKyMgTmV0Q29yZSBDbGllbnQKKworVXNhZ2U6IAorCisgICAgQ2xpZW50LmV4ZSAtaAorICAgICAgICB3aWxsIGRpcGxheSBoZWxwIGluZm9ybWF0aW9uIAorCisgICAgQ2xpZW50LmV4ZSAtdHI6PHRyYW5zcG9ydD4gLXByOjxwcm90b2NvbD4gLW1jOjxudW1DbGllbnRzPgorICAgICAgICB3aWxsIHJ1biBjbGllbnQgd2l0aCBzcGVjaWZpZWQgYXJndW1lbnRzICh0Y3AgdHJhbnNwb3J0IGFuZCBiaW5hcnkgcHJvdG9jb2wgYnkgZGVmYXVsdCkKKworT3B0aW9uczoKKworICAgIC10ciAodHJhbnNwb3J0KTogCisgICAgICAgIHRjcCAtIChkZWZhdWx0KSB0Y3AgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICB0Y3BidWZmZXJlZCAtIGJ1ZmZlcmVkIHRyYW5zcG9ydCBvdmVyIHRjcCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgbmFtZWRwaXBlIC0gbmFtZWRwaXBlIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKHBpcGUgYWRkcmVzcyAtICIiLnRlc3QiIikKKyAgICAgICAgaHR0cCAtIGh0dHAgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoYWRkcmVzcyAtICIiaHR0cDovL2xvY2FsaG9zdDo5MDkwIiIpICAgICAgICAKKyAgICAgICAgdGNwdGxzIC0gdGNwIHRscyB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIGZyYW1lZCAtIHRjcCBmcmFtZWQgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorCisgICAgLXByIChwcm90b2NvbCk6IAorICAgICAgICBiaW5hcnkgLSAoZGVmYXVsdCkgYmluYXJ5IHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBjb21wYWN0IC0gY29tcGFjdCBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAganNvbiAtIGpzb24gcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIAorICAgIC1tYyAobXVsdGlwbGUgY2xpZW50cyk6CisgICAgICAgIDxudW1DbGllbnRzPiAtIG51bWJlciBvZiBtdWx0aXBsZSBjbGllbnRzIHRvIGNvbm5lY3QgdG8gc2VydmVyIChtYXggMTAwLCBkZWZhdWx0IDEpCisKK1NhbXBsZToKKworICAgIENsaWVudC5leGUgLXRyOnRjcCAtcHI6YmluYXJ5IC1tYzoxMAorCitSZW1hcmtzOgorCisgICAgRm9yIFRjcFRscyBtb2RlIGNlcnRpZmljYXRlJ3MgZmlsZSBUaHJpZnRUZXN0LnBmeCBzaG91bGQgYmUgaW4gZGlyZWN0b3J5IAorCXdpdGggYmluYXJpZXMgaW4gY2FzZSBvZiBjb21tYW5kIGxpbmUgdXNhZ2UgKG9yIGF0IHByb2plY3QgbGV2ZWwgaW4gY2FzZSBvZiBkZWJ1Z2dpbmcgZnJvbSBJREUpLgorICAgIFBhc3N3b3JkIGZvciBjZXJ0aWZpY2F0ZSAtICJUaHJpZnRUZXN0Ii4KKworIyBIb3cgdG8gdGVzdCBjb21tdW5pY2F0aW9uIGJldHdlZW4gTmV0Q29yZSBhbmQgUHl0aG9uCisKKyogR2VuZXJhdGUgY29kZSB3aXRoIHRoZSBsYXRlc3QgKip0aHJpZnQuZXhlKiogdXRpbAorKiBFbnN1cmUgdGhhdCAqKnRocmlmdC5leGUqKiB1dGlsIGdlbmVyYXRlZCBmb2xkZXIgKipnZW4tcHkqKiB3aXRoIGdlbmVyYXRlZCBjb2RlIGZvciBQeXRob24KKyogQ3JlYXRlICoqY2xpZW50LnB5KiogYW5kICoqc2VydmVyLnB5KiogZnJvbSB0aGUgY29kZSBleGFtcGxlcyBiZWxvdyBhbmQgc2F2ZSB0aGVtIHRvIHRoZSBmb2xkZXIgd2l0aCBwcmV2aW9zbHkgZ2VuZXJhdGVkIGZvbGRlciAqKmdlbi1weSoqCisqIFJ1biBuZXRjb3JlIHNhbXBsZXMgKGNsaWVudCBhbmQgc2VydmVyKSBhbmQgcHl0aG9uIHNhbXBsZXMgKGNsaWVudCBhbmQgc2VydmVyKQorCitSZW1hcmtzOgorCitTYW1wbGVzIG9mIGNsaWVudCBhbmQgc2VydmVyIGNvZGUgYmVsb3cgdXNlIGNvcnJlY3QgbWV0aG9kcyAob3BlcmF0aW9ucykgCithbmQgZmllbGRzIChwcm9wZXJ0aWVzKSBhY2NvcmRpbmcgdG8gZ2VuZXJhdGVkIGNvbnRyYWN0cyBmcm9tICoudGhyaWZ0IGZpbGVzCisKK0F0IFdpbmRvd3MgMTAgYWRkIHJlY29yZCAqKjEyNy4wLjAuMSB0ZXN0c2VydmVyKiogdG8gKipDOlxXaW5kb3dzXFN5c3RlbTMyXGRyaXZlcnNcZXRjXGhvc3RzKiogZmlsZQorZm9yIGNvcnJlY3Qgd29yayBvZiBweXRob24gc2VydmVyCisKKworKipQeXRob24gQ2xpZW50OioqCisJCitgYGBweXRob24KK2ltcG9ydCBzeXMKK2ltcG9ydCBnbG9iCitzeXMucGF0aC5hcHBlbmQoJ2dlbi1weScpCisKK2Zyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKK2Zyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCBJbnZhbGlkT3BlcmF0aW9uLCBPcGVyYXRpb24sIFdvcmsKKworZnJvbSB0aHJpZnQgaW1wb3J0IFRocmlmdAorZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0Citmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKKworCitkZWYgbWFpbigpOgorICAgICMgTWFrZSBzb2NrZXQKKyAgICB0cmFuc3BvcnQgPSBUU29ja2V0LlRTb2NrZXQoJzEyNy4wLjAuMScsIDkwOTApCisKKyAgICAjIEJ1ZmZlcmluZyBpcyBjcml0aWNhbC4gUmF3IHNvY2tldHMgYXJlIHZlcnkgc2xvdworICAgIHRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zcG9ydCkKKworICAgICMgV3JhcCBpbiBhIHByb3RvY29sCisgICAgcHJvdG9jb2wgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkKKworICAgICMgQ3JlYXRlIGEgY2xpZW50IHRvIHVzZSB0aGUgcHJvdG9jb2wgZW5jb2RlcgorICAgIGNsaWVudCA9IENhbGN1bGF0b3IuQ2xpZW50KHByb3RvY29sKQorCisgICAgIyBDb25uZWN0IQorICAgIHRyYW5zcG9ydC5vcGVuKCkKKworICAgIGNsaWVudC5QaW5nKCkKKyAgICBwcmludCgncGluZygpJykKKworICAgIHN1bSA9IGNsaWVudC5BZGQoMSwgMSkKKyAgICBwcmludCgoJzErMT0lZCcgJSAoc3VtKSkpCisKKyAgICB3b3JrID0gV29yaygpCisKKyAgICB3b3JrLk9wID0gT3BlcmF0aW9uLkRpdmlkZQorICAgIHdvcmsuTnVtMSA9IDEKKyAgICB3b3JrLk51bTIgPSAwCisKKyAgICB0cnk6CisgICAgICAgIHF1b3RpZW50ID0gY2xpZW50LkNhbGN1bGF0ZSgxLCB3b3JrKQorICAgICAgICBwcmludCgnV2hvYT8gWW91IGtub3cgaG93IHRvIGRpdmlkZSBieSB6ZXJvPycpCisgICAgICAgIHByaW50KCdGWUkgdGhlIGFuc3dlciBpcyAlZCcgJSBxdW90aWVudCkKKyAgICBleGNlcHQgSW52YWxpZE9wZXJhdGlvbiBhcyBlOgorICAgICAgICBwcmludCgoJ0ludmFsaWRPcGVyYXRpb246ICVyJyAlIGUpKQorCisgICAgd29yay5PcCA9IE9wZXJhdGlvbi5TdWJzdHJhY3QKKyAgICB3b3JrLk51bTEgPSAxNQorICAgIHdvcmsuTnVtMiA9IDEwCisKKyAgICBkaWZmID0gY2xpZW50LkNhbGN1bGF0ZSgxLCB3b3JrKQorICAgIHByaW50KCgnMTUtMTA9JWQnICUgKGRpZmYpKSkKKworICAgIGxvZyA9IGNsaWVudC5HZXRTdHJ1Y3QoMSkKKyAgICBwcmludCgoJ0NoZWNrIGxvZzogJXMnICUgKGxvZy5WYWx1ZSkpKQorCisgICAgY2xpZW50LlppcCgpCisgICAgcHJpbnQoJ3ppcCgpJykKKworICAgICMgQ2xvc2UhCisgICAgdHJhbnNwb3J0LmNsb3NlKCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgdHJ5OgorICAgIG1haW4oKQorICBleGNlcHQgVGhyaWZ0LlRFeGNlcHRpb24gYXMgdHg6CisgICAgcHJpbnQoJyVzJyAlIHR4Lm1lc3NhZ2UpCitgYGAKKworCisqKlB5dGhvbiBTZXJ2ZXI6KioKKworCitgYGBweXRob24KK2ltcG9ydCBnbG9iCitpbXBvcnQgc3lzCitzeXMucGF0aC5hcHBlbmQoJ2dlbi1weScpCisKK2Zyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKK2Zyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCBJbnZhbGlkT3BlcmF0aW9uLCBPcGVyYXRpb24KKworZnJvbSBzaGFyZWQudHR5cGVzIGltcG9ydCBTaGFyZWRTdHJ1Y3QKKworZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0Citmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVFNlcnZlcgorCisKK2NsYXNzIENhbGN1bGF0b3JIYW5kbGVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5sb2cgPSB7fQorCisgICAgZGVmIFBpbmcoc2VsZik6CisgICAgICAgIHByaW50KCdwaW5nKCknKQorCisgICAgZGVmIEFkZChzZWxmLCBuMSwgbjIpOgorICAgICAgICBwcmludCgnYWRkKCVkLCVkKScgJSAobjEsIG4yKSkKKyAgICAgICAgcmV0dXJuIG4xICsgbjIKKworICAgIGRlZiBDYWxjdWxhdGUoc2VsZiwgbG9naWQsIHdvcmspOgorICAgICAgICBwcmludCgnY2FsY3VsYXRlKCVkLCAlciknICUgKGxvZ2lkLCB3b3JrKSkKKworICAgICAgICBpZiB3b3JrLk9wID09IE9wZXJhdGlvbi5BZGQ6CisgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgKyB3b3JrLk51bTIKKyAgICAgICAgZWxpZiB3b3JrLk9wID09IE9wZXJhdGlvbi5TdWJzdHJhY3Q6CisgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgLSB3b3JrLk51bTIKKyAgICAgICAgZWxpZiB3b3JrLk9wID09IE9wZXJhdGlvbi5NdWx0aXBseToKKyAgICAgICAgICAgIHZhbCA9IHdvcmsuTnVtMSAqIHdvcmsuTnVtMgorICAgICAgICBlbGlmIHdvcmsuT3AgPT0gT3BlcmF0aW9uLkRpdmlkZToKKyAgICAgICAgICAgIGlmIHdvcmsuTnVtMiA9PSAwOgorICAgICAgICAgICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKKyAgICAgICAgICAgICAgICB4LldoYXRPcCA9IHdvcmsuT3AKKyAgICAgICAgICAgICAgICB4LldoeSA9ICdDYW5ub3QgZGl2aWRlIGJ5IDAnCisgICAgICAgICAgICAgICAgcmFpc2UgeAorICAgICAgICAgICAgdmFsID0gd29yay5OdW0xIC8gd29yay5OdW0yCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCisgICAgICAgICAgICB4LldoYXRPcCA9IHdvcmsuT3AKKyAgICAgICAgICAgIHguV2h5ID0gJ0ludmFsaWQgb3BlcmF0aW9uJworICAgICAgICAgICAgcmFpc2UgeAorCisgICAgICAgIGxvZyA9IFNoYXJlZFN0cnVjdCgpCisgICAgICAgIGxvZy5LZXkgPSBsb2dpZAorICAgICAgICBsb2cuVmFsdWUgPSAnJWQnICUgKHZhbCkKKyAgICAgICAgc2VsZi5sb2dbbG9naWRdID0gbG9nCisKKyAgICAgICAgcmV0dXJuIHZhbAorCisgICAgZGVmIEdldFN0cnVjdChzZWxmLCBrZXkpOgorICAgICAgICBwcmludCgnZ2V0U3RydWN0KCVkKScgJSAoa2V5KSkKKyAgICAgICAgcmV0dXJuIHNlbGYubG9nW2tleV0KKworICAgIGRlZiBaaXAoc2VsZik6CisgICAgICAgIHByaW50KCd6aXAoKScpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyKCkKKyAgICBwcm9jZXNzb3IgPSBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKQorICAgIHRyYW5zcG9ydCA9IFRTb2NrZXQuVFNlcnZlclNvY2tldChob3N0PSJ0ZXN0c2VydmVyIiwgcG9ydD05MDkwKQorICAgIHRmYWN0b3J5ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkKKyAgICBwZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKKworICAgIHNlcnZlciA9IFRTZXJ2ZXIuVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorICAgIHByaW50KCdTdGFydGluZyB0aGUgc2VydmVyLi4uJykKKyAgICBzZXJ2ZXIuc2VydmUoKQorICAgIHByaW50KCdkb25lLicpCisKKyAgICAjIFlvdSBjb3VsZCBkbyBvbmUgb2YgdGhlc2UgZm9yIGEgbXVsdGl0aHJlYWRlZCBzZXJ2ZXIKKyAgICAjIHNlcnZlciA9IFRTZXJ2ZXIuVFRocmVhZGVkU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpCisgICAgIyBzZXJ2ZXIgPSBUU2VydmVyLlRUaHJlYWRQb29sU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpCitgYGAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1Byb2dyYW0uY3MgYi90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9Qcm9ncmFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMTgxYmEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsNDI4IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLk5ldC5TZWN1cml0eTsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgTWljcm9zb2Z0LkFzcE5ldENvcmUuQnVpbGRlcjsKK3VzaW5nIE1pY3Jvc29mdC5Bc3BOZXRDb3JlLkhvc3Rpbmc7Cit1c2luZyBNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Db25maWd1cmF0aW9uOwordXNpbmcgTWljcm9zb2Z0LkV4dGVuc2lvbnMuRGVwZW5kZW5jeUluamVjdGlvbjsKK3VzaW5nIE1pY3Jvc29mdC5FeHRlbnNpb25zLkxvZ2dpbmc7Cit1c2luZyBUaHJpZnQ7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuU2VydmVyOwordXNpbmcgdHV0b3JpYWw7Cit1c2luZyBzaGFyZWQ7CisKK25hbWVzcGFjZSBTZXJ2ZXIKK3sKKyAgICBwdWJsaWMgY2xhc3MgUHJvZ3JhbQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSUxvZ2dlciBMb2dnZXIgPSBuZXcgTG9nZ2VyRmFjdG9yeSgpLkFkZENvbnNvbGUoTG9nTGV2ZWwuVHJhY2UpLkFkZERlYnVnKExvZ0xldmVsLlRyYWNlKS5DcmVhdGVMb2dnZXIobmFtZW9mKFNlcnZlcikpOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFyZ3MgPSBhcmdzID8/IG5ldyBzdHJpbmdbMF07CisKKyAgICAgICAgICAgIGlmIChhcmdzLkFueSh4ID0+IHguU3RhcnRzV2l0aCgiLWhlbHAiLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGlzcGxheUhlbHAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVzaW5nICh2YXIgc291cmNlID0gbmV3IENhbmNlbGxhdGlvblRva2VuU291cmNlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUnVuQXN5bmMoYXJncywgc291cmNlLlRva2VuKS5HZXRBd2FpdGVyKCkuR2V0UmVzdWx0KCk7CisKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oIlByZXNzIGFueSBrZXkgdG8gc3RvcC4uLiIpOworCisgICAgICAgICAgICAgICAgQ29uc29sZS5SZWFkTGluZSgpOworICAgICAgICAgICAgICAgIHNvdXJjZS5DYW5jZWwoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJTZXJ2ZXIgc3RvcHBlZCIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBEaXNwbGF5SGVscCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbihAIgorVXNhZ2U6IAorICAgIFNlcnZlci5leGUgLWhlbHAKKyAgICAgICAgd2lsbCBkaXBsYXkgaGVscCBpbmZvcm1hdGlvbiAKKworICAgIFNlcnZlci5leGUgLXRyOjx0cmFuc3BvcnQ+IC1wcjo8cHJvdG9jb2w+CisgICAgICAgIHdpbGwgcnVuIHNlcnZlciB3aXRoIHNwZWNpZmllZCBhcmd1bWVudHMgKHRjcCB0cmFuc3BvcnQgYW5kIGJpbmFyeSBwcm90b2NvbCBieSBkZWZhdWx0KQorCitPcHRpb25zOgorICAgIC10ciAodHJhbnNwb3J0KTogCisgICAgICAgIHRjcCAtIChkZWZhdWx0KSB0Y3AgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICB0Y3BidWZmZXJlZCAtIHRjcCBidWZmZXJlZCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIG5hbWVkcGlwZSAtIG5hbWVkcGlwZSB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChwaXBlIGFkZHJlc3MgLSAiIi50ZXN0IiIpCisgICAgICAgIGh0dHAgLSBodHRwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGh0dHAgYWRkcmVzcyAtICIibG9jYWxob3N0OjkwOTAiIikKKyAgICAgICAgdGNwdGxzIC0gdGNwIHRyYW5zcG9ydCB3aXRoIHRscyB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgZnJhbWVkIC0gdGNwIGZyYW1lZCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisKKyAgICAtcHIgKHByb3RvY29sKTogCisgICAgICAgIGJpbmFyeSAtIChkZWZhdWx0KSBiaW5hcnkgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGNvbXBhY3QgLSBjb21wYWN0IHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBqc29uIC0ganNvbiBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAgbXVsdGlwbGV4ZWQgLSBtdWx0aXBsZXhlZCBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKworU2FtcGxlOgorICAgIFNlcnZlci5leGUgLXRyOnRjcCAKKyIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgVGFzayBSdW5Bc3luYyhzdHJpbmdbXSBhcmdzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHJhbnNwb3J0ID0gR2V0VHJhbnNwb3J0KGFyZ3MpOworICAgICAgICAgICAgdmFyIHNlbGVjdGVkUHJvdG9jb2wgPSBHZXRQcm90b2NvbChhcmdzKTsKKworICAgICAgICAgICAgaWYgKHNlbGVjdGVkVHJhbnNwb3J0ID09IFRyYW5zcG9ydC5IdHRwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ldyBIdHRwU2VydmVyU2FtcGxlKCkuUnVuKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBSdW5TZWxlY3RlZENvbmZpZ3VyYXRpb25Bc3luYyhzZWxlY3RlZFRyYW5zcG9ydCwgc2VsZWN0ZWRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgUHJvdG9jb2wgR2V0UHJvdG9jb2woc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRyYW5zcG9ydCA9IGFyZ3MuRmlyc3RPckRlZmF1bHQoeCA9PiB4LlN0YXJ0c1dpdGgoIi1wciIpKT8uU3BsaXQoJzonKT9bMV07CisKKyAgICAgICAgICAgIEVudW0uVHJ5UGFyc2UodHJhbnNwb3J0LCB0cnVlLCBvdXQgUHJvdG9jb2wgc2VsZWN0ZWRQcm90b2NvbCk7CisKKyAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFByb3RvY29sOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVHJhbnNwb3J0IEdldFRyYW5zcG9ydChzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdHJhbnNwb3J0ID0gYXJncy5GaXJzdE9yRGVmYXVsdCh4ID0+IHguU3RhcnRzV2l0aCgiLXRyIikpPy5TcGxpdCgnOicpP1sxXTsKKworICAgICAgICAgICAgRW51bS5UcnlQYXJzZSh0cmFuc3BvcnQsIHRydWUsIG91dCBUcmFuc3BvcnQgc2VsZWN0ZWRUcmFuc3BvcnQpOworCisgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRUcmFuc3BvcnQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBUYXNrIFJ1blNlbGVjdGVkQ29uZmlndXJhdGlvbkFzeW5jKFRyYW5zcG9ydCB0cmFuc3BvcnQsIFByb3RvY29sIHByb3RvY29sLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZhYnJpYyA9IG5ldyBMb2dnZXJGYWN0b3J5KCkuQWRkQ29uc29sZShMb2dMZXZlbC5UcmFjZSkuQWRkRGVidWcoTG9nTGV2ZWwuVHJhY2UpOworICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBuZXcgQ2FsY3VsYXRvckFzeW5jSGFuZGxlcigpOworICAgICAgICAgICAgSVRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IgPSBudWxsOworCisgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCA9IG51bGw7CisKKyAgICAgICAgICAgIHN3aXRjaCAodHJhbnNwb3J0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0LlRjcDoKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoOTA5MCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0LlRjcEJ1ZmZlcmVkOgorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldFRyYW5zcG9ydChwb3J0OiA5MDkwLCBjbGllbnRUaW1lb3V0OiAxMDAwMCwgdXNlQnVmZmVyZWRTb2NrZXRzOiB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuTmFtZWRQaXBlOgorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydCgiLnRlc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuVGNwVGxzOgorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydCg5MDkwLCBmYWxzZSwgR2V0Q2VydGlmaWNhdGUoKSwgQ2xpZW50Q2VydFZhbGlkYXRvciwgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuRnJhbWVkOgorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVFNlcnZlckZyYW1lZFRyYW5zcG9ydCg5MDkwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIElUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICAgICAgSVRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworCisgICAgICAgICAgICBzd2l0Y2ggKHByb3RvY29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgUHJvdG9jb2wuQmluYXJ5OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yLkFzeW5jUHJvY2Vzc29yKGhhbmRsZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQcm90b2NvbC5Db21wYWN0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVENvbXBhY3RQcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yID0gbmV3IENhbGN1bGF0b3IuQXN5bmNQcm9jZXNzb3IoaGFuZGxlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLkpzb246CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUSnNvblByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRKc29uUHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvci5Bc3luY1Byb2Nlc3NvcihoYW5kbGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUHJvdG9jb2wuTXVsdGlwbGV4ZWQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgY2FsY0hhbmRsZXIgPSBuZXcgQ2FsY3VsYXRvckFzeW5jSGFuZGxlcigpOworICAgICAgICAgICAgICAgICAgICB2YXIgY2FsY1Byb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yLkFzeW5jUHJvY2Vzc29yKGNhbGNIYW5kbGVyKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgc2hhcmVkU2VydmljZUhhbmRsZXIgPSBuZXcgU2hhcmVkU2VydmljZUFzeW5jSGFuZGxlcigpOworICAgICAgICAgICAgICAgICAgICB2YXIgc2hhcmVkU2VydmljZVByb2Nlc3NvciA9IG5ldyBTaGFyZWRTZXJ2aWNlLkFzeW5jUHJvY2Vzc29yKHNoYXJlZFNlcnZpY2VIYW5kbGVyKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgbXVsdGlwbGV4ZWRQcm9jZXNzb3IgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgICAgICAgICAgICAgICAgICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKG5hbWVvZihDYWxjdWxhdG9yKSwgY2FsY1Byb2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKG5hbWVvZihTaGFyZWRTZXJ2aWNlKSwgc2hhcmVkU2VydmljZVByb2Nlc3Nvcik7CisKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yID0gbXVsdGlwbGV4ZWRQcm9jZXNzb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKG5hbWVvZihwcm90b2NvbCksIHByb3RvY29sLCBudWxsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKAorICAgICAgICAgICAgICAgICAgICAkIlNlbGVjdGVkIFRBc3luY1NlcnZlciB3aXRoIHtzZXJ2ZXJUcmFuc3BvcnR9IHRyYW5zcG9ydCwge3Byb2Nlc3Nvcn0gcHJvY2Vzc29yIGFuZCB7aW5wdXRQcm90b2NvbEZhY3Rvcnl9IHByb3RvY29sIGZhY3RvcmllcyIpOworCisgICAgICAgICAgICAgICAgdmFyIHNlcnZlciA9IG5ldyBBc3luY0Jhc2VTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksIGZhYnJpYyk7CisKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4iKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBzZXJ2ZXIuU2VydmVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKHguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYNTA5Q2VydGlmaWNhdGUyIEdldENlcnRpZmljYXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZHVlIHRvIGZpbGVzIGxvY2F0aW9uIGluIG5ldCBjb3JlIGJldHRlciB0byB0YWtlIGNlcnRzIGZyb20gdG9wIGZvbGRlcgorICAgICAgICAgICAgdmFyIGNlcnRGaWxlID0gR2V0Q2VydFBhdGgoRGlyZWN0b3J5LkdldFBhcmVudChEaXJlY3RvcnkuR2V0Q3VycmVudERpcmVjdG9yeSgpKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoY2VydEZpbGUsICJUaHJpZnRUZXN0Iik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgR2V0Q2VydFBhdGgoRGlyZWN0b3J5SW5mbyBkaSwgaW50IG1heENvdW50ID0gNikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRvcERpciA9IGRpOworICAgICAgICAgICAgdmFyIGNlcnRGaWxlID0KKyAgICAgICAgICAgICAgICB0b3BEaXIuRW51bWVyYXRlRmlsZXMoIlRocmlmdFRlc3QucGZ4IiwgU2VhcmNoT3B0aW9uLkFsbERpcmVjdG9yaWVzKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChjZXJ0RmlsZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtYXhDb3VudCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJDYW5ub3QgZmluZCBmaWxlIGluIGRpcmVjdG9yaWVzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldENlcnRQYXRoKGRpLlBhcmVudCwgbWF4Q291bnQgLSAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGNlcnRGaWxlLkZ1bGxOYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWDUwOUNlcnRpZmljYXRlIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayhvYmplY3Qgc2VuZGVyLAorICAgICAgICAgICAgc3RyaW5nIHRhcmdldEhvc3QsIFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24gbG9jYWxDZXJ0aWZpY2F0ZXMsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgcmVtb3RlQ2VydGlmaWNhdGUsIHN0cmluZ1tdIGFjY2VwdGFibGVJc3N1ZXJzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gR2V0Q2VydGlmaWNhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgQ2xpZW50Q2VydFZhbGlkYXRvcihvYmplY3Qgc2VuZGVyLCBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBYNTA5Q2hhaW4gY2hhaW4sIFNzbFBvbGljeUVycm9ycyBzc2xQb2xpY3lFcnJvcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBlbnVtIFRyYW5zcG9ydAorICAgICAgICB7CisgICAgICAgICAgICBUY3AsCisgICAgICAgICAgICBUY3BCdWZmZXJlZCwKKyAgICAgICAgICAgIE5hbWVkUGlwZSwKKyAgICAgICAgICAgIEh0dHAsCisgICAgICAgICAgICBUY3BUbHMsCisgICAgICAgICAgICBGcmFtZWQKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZW51bSBQcm90b2NvbAorICAgICAgICB7CisgICAgICAgICAgICBCaW5hcnksCisgICAgICAgICAgICBDb21wYWN0LAorICAgICAgICAgICAgSnNvbiwKKyAgICAgICAgICAgIE11bHRpcGxleGVkCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgSHR0cFNlcnZlclNhbXBsZQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBSdW4oQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5BZGRFbnZpcm9ubWVudFZhcmlhYmxlcyhwcmVmaXg6ICJBU1BORVRDT1JFXyIpCisgICAgICAgICAgICAgICAgICAgIC5CdWlsZCgpOworCisgICAgICAgICAgICAgICAgdmFyIGhvc3QgPSBuZXcgV2ViSG9zdEJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuVXNlQ29uZmlndXJhdGlvbihjb25maWcpCisgICAgICAgICAgICAgICAgICAgIC5Vc2VLZXN0cmVsKCkKKyAgICAgICAgICAgICAgICAgICAgLlVzZVVybHMoImh0dHA6Ly9sb2NhbGhvc3Q6OTA5MCIpCisgICAgICAgICAgICAgICAgICAgIC5Vc2VDb250ZW50Um9vdChEaXJlY3RvcnkuR2V0Q3VycmVudERpcmVjdG9yeSgpKQorICAgICAgICAgICAgICAgICAgICAuVXNlU3RhcnR1cDxTdGFydHVwPigpCisgICAgICAgICAgICAgICAgICAgIC5CdWlsZCgpOworCisgICAgICAgICAgICAgICAgaG9zdC5SdW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbikuR2V0QXdhaXRlcigpLkdldFJlc3VsdCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgY2xhc3MgU3RhcnR1cAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHB1YmxpYyBTdGFydHVwKElIb3N0aW5nRW52aXJvbm1lbnQgZW52KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgQ29uZmlndXJhdGlvbkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLlNldEJhc2VQYXRoKGVudi5Db250ZW50Um9vdFBhdGgpCisgICAgICAgICAgICAgICAgICAgICAgICAuQWRkRW52aXJvbm1lbnRWYXJpYWJsZXMoKTsKKworICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uID0gYnVpbGRlci5CdWlsZCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBJQ29uZmlndXJhdGlvblJvb3QgQ29uZmlndXJhdGlvbiB7IGdldDsgfQorCisgICAgICAgICAgICAgICAgLy8gVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgYnkgdGhlIHJ1bnRpbWUuIFVzZSB0aGlzIG1ldGhvZCB0byBhZGQgc2VydmljZXMgdG8gdGhlIGNvbnRhaW5lci4KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBDb25maWd1cmVTZXJ2aWNlcyhJU2VydmljZUNvbGxlY3Rpb24gc2VydmljZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlcy5BZGRUcmFuc2llbnQ8Q2FsY3VsYXRvci5JQXN5bmMsIENhbGN1bGF0b3JBc3luY0hhbmRsZXI+KCk7CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzLkFkZFRyYW5zaWVudDxJVEFzeW5jUHJvY2Vzc29yLCBDYWxjdWxhdG9yLkFzeW5jUHJvY2Vzc29yPigpOworICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlcy5BZGRUcmFuc2llbnQ8VEh0dHBTZXJ2ZXJUcmFuc3BvcnQsIFRIdHRwU2VydmVyVHJhbnNwb3J0PigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIGJ5IHRoZSBydW50aW1lLiBVc2UgdGhpcyBtZXRob2QgdG8gY29uZmlndXJlIHRoZSBIVFRQIHJlcXVlc3QgcGlwZWxpbmUuCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgQ29uZmlndXJlKElBcHBsaWNhdGlvbkJ1aWxkZXIgYXBwLCBJSG9zdGluZ0Vudmlyb25tZW50IGVudiwKKyAgICAgICAgICAgICAgICAgICAgSUxvZ2dlckZhY3RvcnkgbG9nZ2VyRmFjdG9yeSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwcC5Vc2VNaWRkbGV3YXJlPFRIdHRwU2VydmVyVHJhbnNwb3J0PigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yQXN5bmNIYW5kbGVyIDogQ2FsY3VsYXRvci5JQXN5bmMKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBEaWN0aW9uYXJ5PGludCwgU2hhcmVkU3RydWN0PiBfbG9nID0gbmV3IERpY3Rpb25hcnk8aW50LCBTaGFyZWRTdHJ1Y3Q+KCk7CisKKyAgICAgICAgICAgIHB1YmxpYyBDYWxjdWxhdG9yQXN5bmNIYW5kbGVyKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8U2hhcmVkU3RydWN0PiBnZXRTdHJ1Y3RBc3luYyhpbnQga2V5LAorICAgICAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigiR2V0U3RydWN0QXN5bmMoezB9KSIsIGtleSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbVJlc3VsdChfbG9nW2tleV0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBwaW5nQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJQaW5nQXN5bmMoKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8aW50PiBhZGRBc3luYyhpbnQgbnVtMSwgaW50IG51bTIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIkFkZEFzeW5jKHtudW0xfSx7bnVtMn0pIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbVJlc3VsdChudW0xICsgbnVtMik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPGludD4gY2FsY3VsYXRlQXN5bmMoaW50IGxvZ2lkLCBXb3JrIHcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIkNhbGN1bGF0ZUFzeW5jKHtsb2dpZH0sIFt7dy5PcH0se3cuTnVtMX0se3cuTnVtMn1dKSIpOworCisgICAgICAgICAgICAgICAgdmFyIHZhbCA9IDA7CisgICAgICAgICAgICAgICAgc3dpdGNoICh3Lk9wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uQUREOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdy5OdW0xICsgdy5OdW0yOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uU1VCVFJBQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB3Lk51bTEgLSB3Lk51bTI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5NVUxUSVBMWToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHcuTnVtMSAqIHcuTnVtMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLkRJVklERToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3Lk51bTIgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hhdE9wID0gKGludCkgdy5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaW87CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB3Lk51bTEgLyB3Lk51bTI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoYXRPcCA9IChpbnQpIHcuT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2h5ID0gIlVua25vd24gb3BlcmF0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaW87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBuZXcgU2hhcmVkU3RydWN0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLZXkgPSBsb2dpZCwKKyAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSB2YWwuVG9TdHJpbmcoKQorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBfbG9nW2xvZ2lkXSA9IGVudHJ5OworCisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbVJlc3VsdCh2YWwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayB6aXBBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oIlppcEFzeW5jKCkgd2l0aCBkZWxheSAxMDBtYyIpOworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRGVsYXkoMTAwLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBTaGFyZWRTZXJ2aWNlQXN5bmNIYW5kbGVyIDogU2hhcmVkU2VydmljZS5JQXN5bmMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8U2hhcmVkU3RydWN0PiBnZXRTdHJ1Y3RBc3luYyhpbnQga2V5LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oIkdldFN0cnVjdEFzeW5jKHswfSkiLCBrZXkpOworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21SZXN1bHQobmV3IFNoYXJlZFN0cnVjdCgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLZXkgPSBrZXksCisgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gIkdldFN0cnVjdEFzeW5jIgorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDQ0MjM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw0MCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KKworW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCisKK1thc3NlbWJseTogR3VpZCgiZTIxMGZjMTAtNWFmZi00YjA0LWFjMjEtNThhZmM3Yjc0YjBjIildClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvUHJvcGVydGllcy9sYXVuY2hTZXR0aW5ncy5qc29uIGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvUHJvcGVydGllcy9sYXVuY2hTZXR0aW5ncy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MDc2ZmYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9Qcm9wZXJ0aWVzL2xhdW5jaFNldHRpbmdzLmpzb24KQEAgLTAsMCArMSw4IEBACit7CisgICJwcm9maWxlcyI6IHsKKyAgICAiU2VydmVyIjogeworICAgICAgImNvbW1hbmROYW1lIjogIlByb2plY3QiLAorICAgICAgImNvbW1hbmRMaW5lQXJncyI6ICItcDptdWx0aXBsZXhlZCIKKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9TZXJ2ZXIuY3Nwcm9qIGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvU2VydmVyLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmJkMzAzCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvU2VydmVyLmNzcHJvagpAQCAtMCwwICsxLDI2IEBACis8UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrLldlYiI+CisKKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXRjb3JlYXBwMi4wPC9UYXJnZXRGcmFtZXdvcms+CisgICAgPEFzc2VtYmx5TmFtZT5TZXJ2ZXI8L0Fzc2VtYmx5TmFtZT4KKyAgICA8UGFja2FnZUlkPlNlcnZlcjwvUGFja2FnZUlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi4vSW50ZXJmYWNlcy9JbnRlcmZhY2VzLmNzcHJvaiIgLz4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLi8uLi8uLi9saWIvbmV0Y29yZS9UaHJpZnQvVGhyaWZ0LmNzcHJvaiIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQXNwTmV0Q29yZSIgVmVyc2lvbj0iWzIuMCwpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5Bc3BOZXRDb3JlLlNlcnZlci5JSVNJbnRlZ3JhdGlvbiIgVmVyc2lvbj0iWzIuMCwpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5Bc3BOZXRDb3JlLlNlcnZlci5LZXN0cmVsIiBWZXJzaW9uPSJbMi4wLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkV4dGVuc2lvbnMuQ29uZmlndXJhdGlvbi5GaWxlRXh0ZW5zaW9ucyIgVmVyc2lvbj0iWzIuMCwpIiAvPgorICA8L0l0ZW1Hcm91cD4KKworPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvVGhyaWZ0VGVzdC5wZnggYi90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9UaHJpZnRUZXN0LnBmeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGRlZDI4Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvVGhyaWZ0VGVzdC5wZngKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9UdXRvcmlhbC5zbG4gYi90dXRvcmlhbC9uZXRjb3JlL1R1dG9yaWFsLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGRjZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9UdXRvcmlhbC5zbG4KQEAgLTAsMCArMSw3OCBAQAorTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTIuMDAKKyMgVmlzdWFsIFN0dWRpbyAxNQorVmlzdWFsU3R1ZGlvVmVyc2lvbiA9IDE1LjAuMjYxMTQuMgorTWluaW11bVZpc3VhbFN0dWRpb1ZlcnNpb24gPSAxMC4wLjQwMjE5LjEKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiVGhyaWZ0IiwgIi4uXC4uXGxpYlxuZXRjb3JlXFRocmlmdFxUaHJpZnQuY3Nwcm9qIiwgIntDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJJbnRlcmZhY2VzIiwgIkludGVyZmFjZXNcSW50ZXJmYWNlcy5jc3Byb2oiLCAie0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIkNsaWVudCIsICJDbGllbnRcQ2xpZW50LmNzcHJvaiIsICJ7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiU2VydmVyIiwgIlNlcnZlclxTZXJ2ZXIuY3Nwcm9qIiwgIntFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUKKwkJRGVidWd8eDY0ID0gRGVidWd8eDY0CisJCURlYnVnfHg4NiA9IERlYnVnfHg4NgorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKKwkJUmVsZWFzZXx4NjQgPSBSZWxlYXNlfHg2NAorCQlSZWxlYXNlfHg4NiA9IFJlbGVhc2V8eDg2CisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5R2xvYmFscykgPSBwb3N0U29sdXRpb24KKwkJU29sdXRpb25HdWlkID0gezA3MEE1RDFELUIyOUQtNDYwMy05OTlELTY5M0RCNDQ0QUQwRH0KKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvYnVpbGQuY21kIGIvdHV0b3JpYWwvbmV0Y29yZS9idWlsZC5jbWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4NGVmMgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvYnVpbGQuY21kCkBAIC0wLDAgKzEsMjUgQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworc2V0bG9jYWwKKworZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkCisKKzplb2YKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvYnVpbGQuc2ggYi90dXRvcmlhbC9uZXRjb3JlL2J1aWxkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM5N2UzMTAKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL2J1aWxkLnNoCkBAIC0wLDAgKzEsMjYgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyNleGl0IGlmIGFueSBjb21tYW5kIGZhaWxzCitzZXQgLWUKKworZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ub2RlanMvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9ub2RlanMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUxNmZlYwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25vZGVqcy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZ2VuLW5vZGVqcy9DYWxjdWxhdG9yLmpzIGdlbi1ub2RlanMvU2hhcmVkU2VydmljZS5qczogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4ganM6bm9kZSAtciAkPAorCithbGwtbG9jYWw6IGdlbi1ub2RlanMvQ2FsY3VsYXRvci5qcworCit0dXRvcmlhbHNlcnZlcjogYWxsCisJTk9ERV9QQVRIPSIkKHRvcF9idWlsZGRpcikvbGliL25vZGVqczokKHRvcF9idWlsZGRpcikvbGliL25vZGVqcy9saWI6JChOT0RFUEFUSCkiICQoTk9ERUpTKSBOb2RlU2VydmVyLmpzCisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwlOT0RFX1BBVEg9IiQodG9wX2J1aWxkZGlyKS9saWIvbm9kZWpzOiQodG9wX2J1aWxkZGlyKS9saWIvbm9kZWpzL2xpYjokKE5PREVQQVRIKSIgJChOT0RFSlMpIE5vZGVDbGllbnQuanMKKwordHV0b3JpYWxzZXJ2ZXJfcHJvbWlzZTogYWxsCisJTk9ERV9QQVRIPSIkKHRvcF9idWlsZGRpcikvbGliL25vZGVqczokKHRvcF9idWlsZGRpcikvbGliL25vZGVqcy9saWI6JChOT0RFUEFUSCkiICQoTk9ERUpTKSBOb2RlU2VydmVyUHJvbWlzZS5qcworCit0dXRvcmlhbGNsaWVudF9wcm9taXNlOiBhbGwKKwlOT0RFX1BBVEg9IiQodG9wX2J1aWxkZGlyKS9saWIvbm9kZWpzOiQodG9wX2J1aWxkZGlyKS9saWIvbm9kZWpzL2xpYjokKE5PREVQQVRIKSIgJChOT0RFSlMpIE5vZGVDbGllbnRQcm9taXNlLmpzCisKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLSoKKworRVhUUkFfRElTVCA9IFwKKwlOb2RlU2VydmVyLmpzIFwKKwlOb2RlQ2xpZW50LmpzIFwKKwlOb2RlU2VydmVyUHJvbWlzZS5qcyBcCisJTm9kZUNsaWVudFByb21pc2UuanMKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25vZGVqcy9Ob2RlQ2xpZW50LmpzIGIvdHV0b3JpYWwvbm9kZWpzL05vZGVDbGllbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ4ODZlOAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25vZGVqcy9Ob2RlQ2xpZW50LmpzCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOwordmFyIENhbGN1bGF0b3IgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvQ2FsY3VsYXRvcicpOwordmFyIHR0eXBlcyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy90dXRvcmlhbF90eXBlcycpOworY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7CisKK3ZhciB0cmFuc3BvcnQgPSB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0OwordmFyIHByb3RvY29sID0gdGhyaWZ0LlRCaW5hcnlQcm90b2NvbDsKKwordmFyIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlQ29ubmVjdGlvbigibG9jYWxob3N0IiwgOTA5MCwgeworICB0cmFuc3BvcnQgOiB0cmFuc3BvcnQsCisgIHByb3RvY29sIDogcHJvdG9jb2wKK30pOworCitjb25uZWN0aW9uLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikgeworICBhc3NlcnQoZmFsc2UsIGVycik7Cit9KTsKKworLy8gQ3JlYXRlIGEgQ2FsY3VsYXRvciBjbGllbnQgd2l0aCB0aGUgY29ubmVjdGlvbgordmFyIGNsaWVudCA9IHRocmlmdC5jcmVhdGVDbGllbnQoQ2FsY3VsYXRvciwgY29ubmVjdGlvbik7CisKKworY2xpZW50LnBpbmcoZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICBjb25zb2xlLmxvZygncGluZygpJyk7Cit9KTsKKworCitjbGllbnQuYWRkKDEsMSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICBjb25zb2xlLmxvZygiMSsxPSIgKyByZXNwb25zZSk7Cit9KTsKKworCit3b3JrID0gbmV3IHR0eXBlcy5Xb3JrKCk7Cit3b3JrLm9wID0gdHR5cGVzLk9wZXJhdGlvbi5ESVZJREU7Cit3b3JrLm51bTEgPSAxOword29yay5udW0yID0gMDsKKworY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrLCBmdW5jdGlvbihlcnIsIG1lc3NhZ2UpIHsKKyAgaWYgKGVycikgeworICAgIGNvbnNvbGUubG9nKCJJbnZhbGlkT3BlcmF0aW9uICIgKyBlcnIpOworICB9IGVsc2UgeworICAgIGNvbnNvbGUubG9nKCdXaG9hPyBZb3Uga25vdyBob3cgdG8gZGl2aWRlIGJ5IHplcm8/Jyk7CisgIH0KK30pOworCit3b3JrLm9wID0gdHR5cGVzLk9wZXJhdGlvbi5TVUJUUkFDVDsKK3dvcmsubnVtMSA9IDE1Oword29yay5udW0yID0gMTA7CisKK2NsaWVudC5jYWxjdWxhdGUoMSwgd29yaywgZnVuY3Rpb24oZXJyLCBtZXNzYWdlKSB7CisgIGNvbnNvbGUubG9nKCcxNS0xMD0nICsgbWVzc2FnZSk7CisKKyAgY2xpZW50LmdldFN0cnVjdCgxLCBmdW5jdGlvbihlcnIsIG1lc3NhZ2UpeworICAgIGNvbnNvbGUubG9nKCdDaGVjayBsb2c6ICcgKyBtZXNzYWdlLnZhbHVlKTsKKworICAgIC8vY2xvc2UgdGhlIGNvbm5lY3Rpb24gb25jZSB3ZSdyZSBkb25lCisgICAgY29ubmVjdGlvbi5lbmQoKTsKKyAgfSk7Cit9KTsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25vZGVqcy9Ob2RlQ2xpZW50UHJvbWlzZS5qcyBiL3R1dG9yaWFsL25vZGVqcy9Ob2RlQ2xpZW50UHJvbWlzZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2RjMTg0Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbm9kZWpzL05vZGVDbGllbnRQcm9taXNlLmpzCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOwordmFyIENhbGN1bGF0b3IgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvQ2FsY3VsYXRvcicpOwordmFyIHR0eXBlcyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy90dXRvcmlhbF90eXBlcycpOworY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7CisKK3ZhciB0cmFuc3BvcnQgPSB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0OwordmFyIHByb3RvY29sID0gdGhyaWZ0LlRCaW5hcnlQcm90b2NvbDsKKwordmFyIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlQ29ubmVjdGlvbigibG9jYWxob3N0IiwgOTA5MCwgeworICB0cmFuc3BvcnQgOiB0cmFuc3BvcnQsCisgIHByb3RvY29sIDogcHJvdG9jb2wKK30pOworCitjb25uZWN0aW9uLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikgeworICBhc3NlcnQoZmFsc2UsIGVycik7Cit9KTsKKworLy8gQ3JlYXRlIGEgQ2FsY3VsYXRvciBjbGllbnQgd2l0aCB0aGUgY29ubmVjdGlvbgordmFyIGNsaWVudCA9IHRocmlmdC5jcmVhdGVDbGllbnQoQ2FsY3VsYXRvciwgY29ubmVjdGlvbik7CisKKworY2xpZW50LnBpbmcoKQorICAudGhlbihmdW5jdGlvbigpIHsKKyAgICBjb25zb2xlLmxvZygncGluZygpJyk7CisgIH0pOworCitjbGllbnQuYWRkKDEsMSkKKyAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKwkgIGNvbnNvbGUubG9nKCIxKzE9IiArIHJlc3BvbnNlKTsKKyAgfSk7CisKK3dvcmsgPSBuZXcgdHR5cGVzLldvcmsoKTsKK3dvcmsub3AgPSB0dHlwZXMuT3BlcmF0aW9uLkRJVklERTsKK3dvcmsubnVtMSA9IDE7Cit3b3JrLm51bTIgPSAwOworCitjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspCisgIC50aGVuKGZ1bmN0aW9uKG1lc3NhZ2UpIHsKKwljb25zb2xlLmxvZygnV2hvYT8gWW91IGtub3cgaG93IHRvIGRpdmlkZSBieSB6ZXJvPycpOworICB9KQorICAuZmFpbChmdW5jdGlvbihlcnIpIHsKKyAgICBjb25zb2xlLmxvZygiSW52YWxpZE9wZXJhdGlvbiAiICsgZXJyKTsKKyAgfSk7CisKKword29yay5vcCA9IHR0eXBlcy5PcGVyYXRpb24uU1VCVFJBQ1Q7Cit3b3JrLm51bTEgPSAxNTsKK3dvcmsubnVtMiA9IDEwOworCitjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspCisgIC50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7CisJICBjb25zb2xlLmxvZygnMTUtMTA9JyArIHZhbHVlKTsKKwkgIHJldHVybiBjbGllbnQuZ2V0U3RydWN0KDEpOworICB9KQorICAudGhlbihmdW5jdGlvbihtZXNzYWdlKSB7CisgICAgICBjb25zb2xlLmxvZygnQ2hlY2sgbG9nOiAnICsgbWVzc2FnZS52YWx1ZSk7CisgIH0pCisgIC5maW4oZnVuY3Rpb24oKSB7CisJICAvL2Nsb3NlIHRoZSBjb25uZWN0aW9uIG9uY2Ugd2UncmUgZG9uZQorICAgICAgY29ubmVjdGlvbi5lbmQoKTsKKyAgfSk7CmRpZmYgLS1naXQgYS90dXRvcmlhbC9ub2RlanMvTm9kZVNlcnZlci5qcyBiL3R1dG9yaWFsL25vZGVqcy9Ob2RlU2VydmVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZDM4MTcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9ub2RlanMvTm9kZVNlcnZlci5qcwpAQCAtMCwwICsxLDg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciB0aHJpZnQgPSByZXF1aXJlKCJ0aHJpZnQiKTsKK3ZhciBDYWxjdWxhdG9yID0gcmVxdWlyZSgiLi9nZW4tbm9kZWpzL0NhbGN1bGF0b3IiKTsKK3ZhciB0dHlwZXMgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvdHV0b3JpYWxfdHlwZXMiKTsKK3ZhciBTaGFyZWRTdHJ1Y3QgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvc2hhcmVkX3R5cGVzIikuU2hhcmVkU3RydWN0OworCit2YXIgZGF0YSA9IHt9OworCit2YXIgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVNlcnZlcihDYWxjdWxhdG9yLCB7CisgIHBpbmc6IGZ1bmN0aW9uKHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCJwaW5nKCkiKTsKKyAgICByZXN1bHQobnVsbCk7CisgIH0sCisKKyAgYWRkOiBmdW5jdGlvbihuMSwgbjIsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCJhZGQoIiwgbjEsICIsIiwgbjIsICIpIik7CisgICAgcmVzdWx0KG51bGwsIG4xICsgbjIpOworICB9LAorCisgIGNhbGN1bGF0ZTogZnVuY3Rpb24obG9naWQsIHdvcmssIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCJjYWxjdWxhdGUoIiwgbG9naWQsICIsIiwgd29yaywgIikiKTsKKworICAgIHZhciB2YWwgPSAwOworICAgIGlmICh3b3JrLm9wID09IHR0eXBlcy5PcGVyYXRpb24uQUREKSB7CisgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTI7CisgICAgfSBlbHNlIGlmICh3b3JrLm9wID09PSB0dHlwZXMuT3BlcmF0aW9uLlNVQlRSQUNUKSB7CisgICAgICB2YWwgPSB3b3JrLm51bTEgLSB3b3JrLm51bTI7CisgICAgfSBlbHNlIGlmICh3b3JrLm9wID09PSB0dHlwZXMuT3BlcmF0aW9uLk1VTFRJUExZKSB7CisgICAgICB2YWwgPSB3b3JrLm51bTEgKiB3b3JrLm51bTI7CisgICAgfSBlbHNlIGlmICh3b3JrLm9wID09PSB0dHlwZXMuT3BlcmF0aW9uLkRJVklERSkgeworICAgICAgaWYgKHdvcmsubnVtMiA9PT0gMCkgeworICAgICAgICB2YXIgeCA9IG5ldyB0dHlwZXMuSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgICB4LndoYXRPcCA9IHdvcmsub3A7CisgICAgICAgIHgud2h5ID0gJ0Nhbm5vdCBkaXZpZGUgYnkgMCc7CisgICAgICAgIHJlc3VsdCh4KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdmFsID0gd29yay5udW0xIC8gd29yay5udW0yOworICAgIH0gZWxzZSB7CisgICAgICB2YXIgeCA9IG5ldyB0dHlwZXMuSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgeC53aGF0T3AgPSB3b3JrLm9wOworICAgICAgeC53aHkgPSAnSW52YWxpZCBvcGVyYXRpb24nOworICAgICAgcmVzdWx0KHgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBlbnRyeSA9IG5ldyBTaGFyZWRTdHJ1Y3QoKTsKKyAgICBlbnRyeS5rZXkgPSBsb2dpZDsKKyAgICBlbnRyeS52YWx1ZSA9ICIiK3ZhbDsKKyAgICBkYXRhW2xvZ2lkXSA9IGVudHJ5OworCisgICAgcmVzdWx0KG51bGwsIHZhbCk7CisgIH0sCisKKyAgZ2V0U3RydWN0OiBmdW5jdGlvbihrZXksIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCJnZXRTdHJ1Y3QoIiwga2V5LCAiKSIpOworICAgIHJlc3VsdChudWxsLCBkYXRhW2tleV0pOworICB9LAorCisgIHppcDogZnVuY3Rpb24oKSB7CisgICAgY29uc29sZS5sb2coInppcCgpIik7CisgICAgcmVzdWx0KG51bGwpOworICB9CisKK30pOworCitzZXJ2ZXIubGlzdGVuKDkwOTApOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbm9kZWpzL05vZGVTZXJ2ZXJQcm9taXNlLmpzIGIvdHV0b3JpYWwvbm9kZWpzL05vZGVTZXJ2ZXJQcm9taXNlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZjI4N2IKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9ub2RlanMvTm9kZVNlcnZlclByb21pc2UuanMKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgidGhyaWZ0Iik7Cit2YXIgQ2FsY3VsYXRvciA9IHJlcXVpcmUoIi4vZ2VuLW5vZGVqcy9DYWxjdWxhdG9yIik7Cit2YXIgdHR5cGVzID0gcmVxdWlyZSgiLi9nZW4tbm9kZWpzL3R1dG9yaWFsX3R5cGVzIik7Cit2YXIgU2hhcmVkU3RydWN0ID0gcmVxdWlyZSgiLi9nZW4tbm9kZWpzL3NoYXJlZF90eXBlcyIpLlNoYXJlZFN0cnVjdDsKKwordmFyIGRhdGEgPSB7fTsKKwordmFyIHNlcnZlciA9IHRocmlmdC5jcmVhdGVTZXJ2ZXIoQ2FsY3VsYXRvciwgeworICBwaW5nOiBmdW5jdGlvbigpIHsKKyAgICBjb25zb2xlLmxvZygicGluZygpIik7CisgIH0sCisKKyAgYWRkOiBmdW5jdGlvbihuMSwgbjIpIHsKKyAgICBjb25zb2xlLmxvZygiYWRkKCIsIG4xLCAiLCIsIG4yLCAiKSIpOworICAgIHJldHVybiBuMSArIG4yOworICB9LAorCisgIGNhbGN1bGF0ZTogZnVuY3Rpb24obG9naWQsIHdvcmspIHsKKyAgICBjb25zb2xlLmxvZygiY2FsY3VsYXRlKCIsIGxvZ2lkLCAiLCIsIHdvcmssICIpIik7CisKKyAgICB2YXIgdmFsID0gMDsKKyAgICBpZiAod29yay5vcCA9PSB0dHlwZXMuT3BlcmF0aW9uLkFERCkgeworICAgICAgdmFsID0gd29yay5udW0xICsgd29yay5udW0yOworICAgIH0gZWxzZSBpZiAod29yay5vcCA9PT0gdHR5cGVzLk9wZXJhdGlvbi5TVUJUUkFDVCkgeworICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yOworICAgIH0gZWxzZSBpZiAod29yay5vcCA9PT0gdHR5cGVzLk9wZXJhdGlvbi5NVUxUSVBMWSkgeworICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yOworICAgIH0gZWxzZSBpZiAod29yay5vcCA9PT0gdHR5cGVzLk9wZXJhdGlvbi5ESVZJREUpIHsKKyAgICAgIGlmICh3b3JrLm51bTIgPT09IDApIHsKKyAgICAgICAgdmFyIHggPSBuZXcgdHR5cGVzLkludmFsaWRPcGVyYXRpb24oKTsKKyAgICAgICAgeC53aGF0T3AgPSB3b3JrLm9wOworICAgICAgICB4LndoeSA9ICdDYW5ub3QgZGl2aWRlIGJ5IDAnOworCQl0aHJvdyB4OworICAgICAgfQorICAgICAgdmFsID0gd29yay5udW0xIC8gd29yay5udW0yOworICAgIH0gZWxzZSB7CisgICAgICB2YXIgeCA9IG5ldyB0dHlwZXMuSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgeC53aGF0T3AgPSB3b3JrLm9wOworICAgICAgeC53aHkgPSAnSW52YWxpZCBvcGVyYXRpb24nOworICAgICAgdGhyb3cgeDsKKyAgICB9CisKKyAgICB2YXIgZW50cnkgPSBuZXcgU2hhcmVkU3RydWN0KCk7CisgICAgZW50cnkua2V5ID0gbG9naWQ7CisgICAgZW50cnkudmFsdWUgPSAiIit2YWw7CisgICAgZGF0YVtsb2dpZF0gPSBlbnRyeTsKKyAgICByZXR1cm4gdmFsOworICB9LAorCisgIGdldFN0cnVjdDogZnVuY3Rpb24oa2V5KSB7CisgICAgY29uc29sZS5sb2coImdldFN0cnVjdCgiLCBrZXksICIpIik7CisgICAgcmV0dXJuIGRhdGFba2V5XTsKKyAgfSwKKworICB6aXA6IGZ1bmN0aW9uKCkgeworICAgIGNvbnNvbGUubG9nKCJ6aXAoKSIpOworICB9CisKK30pOworCitzZXJ2ZXIubGlzdGVuKDkwOTApOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvb2NhbWwvQ2FsY0NsaWVudC5tbCBiL3R1dG9yaWFsL29jYW1sL0NhbGNDbGllbnQubWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWE4NDY3YgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL29jYW1sL0NhbGNDbGllbnQubWwKQEAgLTAsMCArMSw3NCBAQAorKCoKKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuCisqKQorCitvcGVuIEFyZworb3BlbiBUaHJpZnQKK29wZW4gVHV0b3JpYWxfdHlwZXMKK29wZW4gU2hhcmVkX3R5cGVzCisKK2V4Y2VwdGlvbiBEaWU7OworbGV0IHNvZCA9IGZ1bmN0aW9uCisgICAgU29tZSB2IC0+IHYKKyAgfCBOb25lIC0+IHJhaXNlIERpZTs7CisKK3R5cGUgY29ubmVjdGlvbiA9IHsKKyAgdHJhbnMgOiBUcmFuc3BvcnQudCA7CisgIHByb3RvIDogVGhyaWZ0LlByb3RvY29sLnQ7CisgIGNhbGMgOiBDYWxjdWxhdG9yLmNsaWVudCA7Cit9CisKK2xldCBjb25uZWN0IH5ob3N0IHBvcnQgPQorICBsZXQgdHggPSBuZXcgVFNvY2tldC50IGhvc3QgcG9ydCBpbgorICBsZXQgcHJvdG8gPSBuZXcgVEJpbmFyeVByb3RvY29sLnQgdHggaW4KKyAgbGV0IGNhbGMgPSBuZXcgQ2FsY3VsYXRvci5jbGllbnQgcHJvdG8gcHJvdG8gaW4KKyAgICB0eCNvcG47CisgICAgeyB0cmFucyA9IHR4IDsgcHJvdG8gPSBwcm90bzsgY2FsYyA9IGNhbGMgfQorOzsKKworbGV0IGRvY2xpZW50ICgpID0KKyAgbGV0IGNsaSA9IGNvbm5lY3Qgfmhvc3Q6IjEyNy4wLjAuMSIgOTA5MCBpbgorICB0cnkKKyAgICBjbGkuY2FsYyNwaW5nIDsKKyAgICBQcmludGYucHJpbnRmICJwaW5nKClcbiIgOyBmbHVzaCBzdGRvdXQgOworICAgIChsZXQgc3VtID0gY2xpLmNhbGMjYWRkIChJbnQzMi5vZl9pbnQgMSkgKEludDMyLm9mX2ludCAxKSBpbgorICAgICAgIFByaW50Zi5wcmludGYgIjErMT0lbGRcbiIgc3VtIDsKKyAgICAgICBmbHVzaCBzdGRvdXQpIDsKKyAgICAobGV0IHcgPSBuZXcgd29yayBpbgorICAgICAgIHcjc2V0X29wIE9wZXJhdGlvbi5ESVZJREUgOworICAgICAgIHcjc2V0X251bTEgKEludDMyLm9mX2ludCAxKSA7CisgICAgICAgdyNzZXRfbnVtMiAoSW50MzIub2ZfaW50IDApIDsKKyAgICAgICB0cnkKKwkgbGV0IHF1b3RpZW50ID0gY2xpLmNhbGMjY2FsY3VsYXRlIChJbnQzMi5vZl9pbnQgMSkgdyBpbgorCSAgIFByaW50Zi5wcmludGYgIldob2E/IFdlIGNhbiBkaXZpZGUgYnkgemVybyFcbiIgOyBmbHVzaCBzdGRvdXQKKyAgICAgICB3aXRoIEludmFsaWRPcGVyYXRpb24gaW8gLT4KKwkgUHJpbnRmLnByaW50ZiAiSW52YWxpZE9wZXJhdGlvbjogJXNcbiIgaW8jZ3JhYl93aHkgOyBmbHVzaCBzdGRvdXQpIDsKKyAgICAobGV0IHcgPSBuZXcgd29yayBpbgorICAgICAgIHcjc2V0X29wIE9wZXJhdGlvbi5TVUJUUkFDVCA7CisgICAgICAgdyNzZXRfbnVtMSAoSW50MzIub2ZfaW50IDE1KSA7CisgICAgICAgdyNzZXRfbnVtMiAoSW50MzIub2ZfaW50IDEwKSA7CisgICAgICAgbGV0IGRpZmYgPSBjbGkuY2FsYyNjYWxjdWxhdGUgKEludDMyLm9mX2ludCAxKSB3IGluCisJIFByaW50Zi5wcmludGYgIjE1LTEwPSVsZFxuIiBkaWZmIDsgZmx1c2ggc3Rkb3V0KSA7CisgICAgKGxldCBzcyA9IGNsaS5jYWxjI2dldFN0cnVjdCAoSW50MzIub2ZfaW50IDEpIGluCisgICAgICAgUHJpbnRmLnByaW50ZiAiQ2hlY2sgbG9nOiAlc1xuIiBzcyNncmFiX3ZhbHVlIDsgZmx1c2ggc3Rkb3V0KSA7CisgICAgY2xpLnRyYW5zI2Nsb3NlCisgIHdpdGggVHJhbnNwb3J0LkUgKF8sd2hhdCkgLT4KKyAgICBQcmludGYucHJpbnRmICJFUlJPUjogJXNcbiIgd2hhdCA7IGZsdXNoIHN0ZG91dAorOzsKKworZG9jbGllbnQoKTs7CmRpZmYgLS1naXQgYS90dXRvcmlhbC9vY2FtbC9DYWxjU2VydmVyLm1sIGIvdHV0b3JpYWwvb2NhbWwvQ2FsY1NlcnZlci5tbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNWZhY2I3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvb2NhbWwvQ2FsY1NlcnZlci5tbApAQCAtMCwwICsxLDg5IEBACisoKgorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKyopCisKK29wZW4gQXJnCitvcGVuIFRocmlmdAorb3BlbiBUdXRvcmlhbF90eXBlcworb3BlbiBTaGFyZWRfdHlwZXMKKworZXhjZXB0aW9uIERpZTs7CitsZXQgc29kID0gZnVuY3Rpb24KKyAgICBTb21lIHYgLT4gdgorICB8IE5vbmUgLT4gcmFpc2UgRGllOzsKKworY2xhc3MgY2FsY19oYW5kbGVyID0KK29iamVjdCAoc2VsZikKKyAgaW5oZXJpdCBDYWxjdWxhdG9yLmlmYWNlCisgIHZhbCBsb2cgPSBIYXNodGJsLmNyZWF0ZSAyMworICBtZXRob2QgcGluZyAgPSBQcmludGYucHJpbnRmICJwaW5nKClcbiIgOyBmbHVzaCBzdGRvdXQKKyAgbWV0aG9kIGFkZCBhIGIgPQorICAgIFByaW50Zi5wcmludGYiYWRkKCVsZCwlbGQpXG4iIChzb2QgYSkgKHNvZCBiKTsgZmx1c2ggc3Rkb3V0IDsKKyAgICBJbnQzMi5hZGQgKHNvZCBhKSAoc29kIGIpCisgIG1ldGhvZCBjYWxjdWxhdGUgbG9naWQgdyA9CisgICAgbGV0IHcgPSBzb2QgdyBpbgorICAgICAgUHJpbnRmLnByaW50ZiAiY2FsY3VsYXRlKCVsZCx7JWxkLCVsZCwlbGR9KVxuIiAoc29kIGxvZ2lkKSAoT3BlcmF0aW9uLnRvX2kgdyNncmFiX29wKSB3I2dyYWJfbnVtMSB3I2dyYWJfbnVtMjsgZmx1c2ggc3Rkb3V0IDsKKyAgICBsZXQgcnYgPQorICAgICAgbWF0Y2ggdyNncmFiX29wIHdpdGgKKwkgIE9wZXJhdGlvbi5BREQgLT4KKwkgICAgSW50MzIuYWRkIHcjZ3JhYl9udW0xIHcjZ3JhYl9udW0yCisJfCBPcGVyYXRpb24uU1VCVFJBQ1QgLT4KKwkgICAgSW50MzIuc3ViIHcjZ3JhYl9udW0xIHcjZ3JhYl9udW0yCisJfCBPcGVyYXRpb24uTVVMVElQTFkgLT4KKwkgICAgSW50MzIubXVsIHcjZ3JhYl9udW0xIHcjZ3JhYl9udW0yCisJfCBPcGVyYXRpb24uRElWSURFIC0+CisJICAgIGlmIHcjZ3JhYl9udW0yID0gSW50MzIuemVybyB0aGVuCisJICAgICAgbGV0IGlvID0gbmV3IGludmFsaWRPcGVyYXRpb24gaW4KKwkJaW8jc2V0X3doYXRPcCAoT3BlcmF0aW9uLnRvX2kgdyNncmFiX29wKSA7CisJCWlvI3NldF93aHkgIkNhbm5vdCBkaXZpZGUgYnkgMCIgOworCQlyYWlzZSAoSW52YWxpZE9wZXJhdGlvbiBpbykKKwkgICAgZWxzZQorCSAgICAgIEludDMyLmRpdiB3I2dyYWJfbnVtMSB3I2dyYWJfbnVtMiBpbgorCisgICAgbGV0IHNzID0gbmV3IHNoYXJlZFN0cnVjdCBpbgorICAgICAgc3Mjc2V0X2tleSAoc29kIGxvZ2lkKSA7CisgICAgbGV0IGJ1ZmZlciA9IEludDMyLnRvX3N0cmluZyBydiBpbgorICAgICAgc3Mjc2V0X3ZhbHVlIGJ1ZmZlciA7CisgICAgICBIYXNodGJsLmFkZCBsb2cgKHNvZCBsb2dpZCkgc3MgOworICAgICAgcnYKKworICBtZXRob2QgemlwID0KKyAgICBQcmludGYucHJpbnRmICJ6aXAoKVxuIjsgZmx1c2ggc3Rkb3V0CisKKyAgbWV0aG9kIGdldFN0cnVjdCBsb2dpZCA9CisgICAgUHJpbnRmLnByaW50ZiAiZ2V0U3RydWN0KCVsZClcbiIgKHNvZCBsb2dpZCkgOyBmbHVzaCBzdGRvdXQgOworICAgIEhhc2h0YmwuZmluZCBsb2cgKHNvZCBsb2dpZCkKKworZW5kCisKK2xldCBkb3NlcnZlciAoKSA9CisgIGxldCBoID0gbmV3IGNhbGNfaGFuZGxlciBpbgorICBsZXQgcHJvYyA9IG5ldyBDYWxjdWxhdG9yLnByb2Nlc3NvciBoIGluCisgIGxldCBwb3J0ID0gOTA5MCBpbgorICBsZXQgcGYgPSBuZXcgVEJpbmFyeVByb3RvY29sLmZhY3RvcnkgaW4KKyAgbGV0IHNlcnZlciA9IG5ldyBUVGhyZWFkZWRTZXJ2ZXIudAorCQkgcHJvYworCQkgKG5ldyBUU2VydmVyU29ja2V0LnQgcG9ydCkKKwkJIChuZXcgVHJhbnNwb3J0LmZhY3RvcnkpCisJCSBwZgorCQkgcGYKKyAgaW4KKyAgICBzZXJ2ZXIjc2VydmUKKzs7CisKK2Rvc2VydmVyKCk7OwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvb2NhbWwvUkVBRE1FLm1kIGIvdHV0b3JpYWwvb2NhbWwvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2OGU4MzUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9vY2FtbC9SRUFETUUubWQKQEAgLTAsMCArMSwxNSBAQAorCitUaGlzIGlzIHRoZSBvY2FtbCB0dXRvcmlhbCBleGFtcGxlLiAgSXQgYXNzdW1lcyB0aGF0IHlvdSd2ZSBhbHJlYWR5CitidWlsdCBhbmQgaW5zdGFsbGVkIHRoZSB0aHJpZnQgb2NhbWwgcnVudGltZSBsaWJyYXJpZXMgaW4gbGliL29jYW1sLgorCitUbyBjb21waWxlIHRoaXMsIHlvdSB3aWxsIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIFRocmlmdCBzb3VyY2VzIGZvcgorb2NhbWwgaW4gdGhpcyBkaXJlY3RvcnkgKGR1ZSB0byBsaW1pdGF0aW9ucyBpbiB0aGUgT0FTSVMgYnVpbGQtdG9vbCk6CisKKyAgJSB0aHJpZnQgLXIgLS1nZW4gb2NhbWwgLi4vdHV0b3JpYWwudGhyaWZ0CisgICUgb2FzaXMgc2V0dXAKKyAgJSBtYWtlCisKK1RoaXMgd2lsbCBwcm9kdWNlIHR3byBleGVjdXRhYmxlcyBDYWxje1NlcnZlcixDbGllbnR9Ljx0eXBlPiB3aGVyZQorPHR5cGU+IGlzIG9uZSBvZiAiYnl0ZSIgb3IgIm5hdGl2ZSIsIGRlcGVuZGluZyBvbiB5b3VyIG9jYW1sCitpbnN0YWxsYXRpb24uICBKdXN0IHJ1biB0aGUgc2VydmVyIGluIHRoZSBiYWNrZ3JvdW5kLCB0aGVuIHRoZSBjbGllbnQKKyhhcyB5b3Ugd291bGQgZG8gZm9yIHRoZSBDKysgZXhhbXBsZSkuCmRpZmYgLS1naXQgYS90dXRvcmlhbC9vY2FtbC9fb2FzaXMgYi90dXRvcmlhbC9vY2FtbC9fb2FzaXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ1YzA5NgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL29jYW1sL19vYXNpcwpAQCAtMCwwICsxLDMyIEBACitOYW1lOiB0dXRvcmlhbAorVmVyc2lvbjogMS4wLjAKK09BU0lTRm9ybWF0OiAwLjMKK1N5bm9wc2lzOiBPQ2FtbCBUdXRvcmlhbCBleGFtcGxlCitBdXRob3JzOiBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK0xpY2Vuc2U6IEFwYWNoZS0yLjAKK0hvbWVwYWdlOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKK0J1aWxkVG9vbHM6IG9jYW1sYnVpbGQKK1BsdWdpbnM6ICAgICBNRVRBICgwLjMpLAorICBEZXZGaWxlcyAoMC4zKQorCitMaWJyYXJ5IHR1dG9yaWFsX3RocmlmdAorICBQYXRoOiBnZW4tb2NhbWwKKyAgRmluZGxpYk5hbWU6IHR1dG9yaWFsX3RocmlmdAorICBidWlsZFRvb2xzOiBvY2FtbGJ1aWxkCisgIEJ1aWxkRGVwZW5kczogdGhyZWFkcyx0aHJpZnQKKyAgTW9kdWxlczogQ2FsY3VsYXRvcixTaGFyZWRfY29uc3RzLFR1dG9yaWFsX2NvbnN0cyxTaGFyZWRTZXJ2aWNlLFNoYXJlZF90eXBlcyxUdXRvcmlhbF90eXBlcworICBYTUVUQVJlcXVpcmVzOiB0aHJlYWRzCisKK0V4ZWN1dGFibGUgQ2FsY0NsaWVudAorICBQYXRoOiAuCisgIE1haW5JczogQ2FsY0NsaWVudC5tbAorICBCdWlsZCQ6IHRydWUKKyAgQ29tcGlsZWRPYmplY3Q6IGJlc3QKKyAgQnVpbGREZXBlbmRzOiB0aHJpZnQsIHR1dG9yaWFsX3RocmlmdCwgdGhyZWFkcworCitFeGVjdXRhYmxlIENhbGNTZXJ2ZXIKKyAgUGF0aDogLgorICBNYWluSXM6IENhbGNTZXJ2ZXIubWwKKyAgQnVpbGQkOiB0cnVlCisgIENvbXBpbGVkT2JqZWN0OiBiZXN0CisgIEJ1aWxkRGVwZW5kczogdGhyaWZ0LCB0dXRvcmlhbF90aHJpZnQsIHRocmVhZHMKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3BlcmwvUGVybENsaWVudC5wbCBiL3R1dG9yaWFsL3BlcmwvUGVybENsaWVudC5wbAppbmRleCAxZDU5NjU2Li43YzIzMjg5IDEwMDY0NAotLS0gYS90dXRvcmlhbC9wZXJsL1BlcmxDbGllbnQucGwKKysrIGIvdHV0b3JpYWwvcGVybC9QZXJsQ2xpZW50LnBsCkBAIC0zNywxMCArMzcsMTAgQEAKIAogdXNlIERhdGE6OkR1bXBlcjsKIAotbXkgJHNvY2tldCAgICA9IG5ldyBUaHJpZnQ6OlNvY2tldCgnbG9jYWxob3N0Jyw5MDkwKTsKLW15ICR0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydCgkc29ja2V0LDEwMjQsMTAyNCk7Ci1teSAkcHJvdG9jb2wgID0gbmV3IFRocmlmdDo6QmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7Ci1teSAkY2xpZW50ICAgID0gbmV3IHR1dG9yaWFsOjpDYWxjdWxhdG9yQ2xpZW50KCRwcm90b2NvbCk7CitteSAkc29ja2V0ICAgID0gVGhyaWZ0OjpTb2NrZXQtPm5ldygnbG9jYWxob3N0Jyw5MDkwKTsKK215ICR0cmFuc3BvcnQgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0LT5uZXcoJHNvY2tldCwxMDI0LDEwMjQpOworbXkgJHByb3RvY29sICA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2wtPm5ldygkdHJhbnNwb3J0KTsKK215ICRjbGllbnQgICAgPSB0dXRvcmlhbDo6Q2FsY3VsYXRvckNsaWVudC0+bmV3KCRwcm90b2NvbCk7CiAKIAogZXZhbHsKQEAgLTUzLDcgKzUzLDcgQEAKICAgICBteSAkc3VtID0gJGNsaWVudC0+YWRkKDEsMSk7CiAgICAgcHJpbnQgIjErMT0kc3VtXG4iOwogCi0gICAgbXkgJHdvcmsgPSBuZXcgdHV0b3JpYWw6OldvcmsoKTsKKyAgICBteSAkd29yayA9IHR1dG9yaWFsOjpXb3JrLT5uZXcoKTsKIAogICAgICR3b3JrLT5vcCh0dXRvcmlhbDo6T3BlcmF0aW9uOjpESVZJREUpOwogICAgICR3b3JrLT5udW0xKDEpOwpAQCAtNjMsNyArNjMsNyBAQAogICAgICAgICAkY2xpZW50LT5jYWxjdWxhdGUoMSwgJHdvcmspOwogICAgICAgICBwcmludCAiV2hvYSEgV2UgY2FuIGRpdmlkZSBieSB6ZXJvP1xuIjsKICAgICB9OyBpZigkQCkgewotICAgICAgICB3YXJuICJJbnZhbGlkT3BlcmF0aW9uOiAiLkR1bXBlcigkQCk7CisgICAgICAgIHdhcm4gJ0ludmFsaWRPcGVyYXRpb246ICcuRHVtcGVyKCRAKTsKICAgICB9CiAKICAgICAkd29yay0+b3AodHV0b3JpYWw6Ok9wZXJhdGlvbjo6U1VCVFJBQ1QpOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcGVybC9QZXJsU2VydmVyLnBsIGIvdHV0b3JpYWwvcGVybC9QZXJsU2VydmVyLnBsCmluZGV4IGE0MGVjNjkuLmRmZTZiODkgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL3BlcmwvUGVybFNlcnZlci5wbAorKysgYi90dXRvcmlhbC9wZXJsL1BlcmxTZXJ2ZXIucGwKQEAgLTEsNCArMSw0IEBACi0jIS91c3IvYmluL3BlcmwKKyMhL3Vzci9iaW4vZW52IHBlcmwKIAogIwogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCkBAIC02NywyMCArNjcsMjAgQEAKICAgfSBlbHNpZiAoJG9wID09IHR1dG9yaWFsOjpPcGVyYXRpb246OkRJVklERSkgewogICAgIGlmICgkbnVtMiA9PSAwKQogICAgIHsKLSAgICAgIG15ICR4ID0gbmV3IHR1dG9yaWFsOjpJbnZhbGlkT3BlcmF0aW9uOwotICAgICAgJHgtPndoYXQoJG9wKTsKKyAgICAgIG15ICR4ID0gdHV0b3JpYWw6OkludmFsaWRPcGVyYXRpb24tPm5ldygpOworICAgICAgJHgtPndoYXRPcCgkb3ApOwogICAgICAgJHgtPndoeSgnQ2Fubm90IGRpdmlkZSBieSAwJyk7CiAgICAgICBkaWUgJHg7CiAgICAgfQogICAgICR2YWwgPSAkbnVtMSAvICRudW0yOwogICB9IGVsc2UgewotICAgIG15ICR4ID0gbmV3IHR1dG9yaWFsOjpJbnZhbGlkT3BlcmF0aW9uOwotICAgICR4LT53aGF0KCRvcCk7CisgICAgbXkgJHggPSB0dXRvcmlhbDo6SW52YWxpZE9wZXJhdGlvbi0+bmV3KCk7CisgICAgJHgtPndoYXRPcCgkb3ApOwogICAgICR4LT53aHkoJ0ludmFsaWQgb3BlcmF0aW9uJyk7CiAgICAgZGllICR4OwogICB9CiAKLSAgbXkgJGxvZyA9IG5ldyBzaGFyZWQ6OlNoYXJlZFN0cnVjdDsKKyAgbXkgJGxvZyA9IHNoYXJlZDo6U2hhcmVkU3RydWN0LT5uZXcoKTsKICAgJGxvZy0+a2V5KCRsb2dpZCk7CiAgICRsb2ctPnZhbHVlKGludCgkdmFsKSk7CiAgICRzZWxmLT57bG9nfS0+eyRsb2dpZH0gPSAkbG9nOwpAQCAtMTA0LDEwICsxMDQsMTAgQEAKIAogCiBldmFsIHsKLSAgbXkgJGhhbmRsZXIgICAgICAgPSBuZXcgQ2FsY3VsYXRvckhhbmRsZXI7Ci0gIG15ICRwcm9jZXNzb3IgICAgID0gbmV3IHR1dG9yaWFsOjpDYWxjdWxhdG9yUHJvY2Vzc29yKCRoYW5kbGVyKTsKLSAgbXkgJHNlcnZlcnNvY2tldCAgPSBuZXcgVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQoOTA5MCk7Ci0gIG15ICRmb3JraW5nc2VydmVyID0gbmV3IFRocmlmdDo6Rm9ya2luZ1NlcnZlcigkcHJvY2Vzc29yLCAkc2VydmVyc29ja2V0KTsKKyAgbXkgJGhhbmRsZXIgICAgICAgPSBDYWxjdWxhdG9ySGFuZGxlci0+bmV3KCk7CisgIG15ICRwcm9jZXNzb3IgICAgID0gdHV0b3JpYWw6OkNhbGN1bGF0b3JQcm9jZXNzb3ItPm5ldygkaGFuZGxlcik7CisgIG15ICRzZXJ2ZXJzb2NrZXQgID0gVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQtPm5ldyg5MDkwKTsKKyAgbXkgJGZvcmtpbmdzZXJ2ZXIgPSBUaHJpZnQ6OkZvcmtpbmdTZXJ2ZXItPm5ldygkcHJvY2Vzc29yLCAkc2VydmVyc29ja2V0KTsKICAgcHJpbnQgIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi5cbiI7CiAgICRmb3JraW5nc2VydmVyLT5zZXJ2ZSgpOwogICBwcmludCAiZG9uZS5cbiI7CmRpZmYgLS1naXQgYS90dXRvcmlhbC9waHAvUGhwQ2xpZW50LnBocCBiL3R1dG9yaWFsL3BocC9QaHBDbGllbnQucGhwCmluZGV4IGE2NjM5ZDUuLjkyZGMzY2IgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3BocC9QaHBDbGllbnQucGhwCisrKyBiL3R1dG9yaWFsL3BocC9QaHBDbGllbnQucGhwCkBAIC0xLDUgKzEsMjIgQEAKICMhL3Vzci9iaW4vZW52IHBocAogPD9waHAKKworbmFtZXNwYWNlIHR1dG9yaWFsXHBocDsKKworZXJyb3JfcmVwb3J0aW5nKEVfQUxMKTsKKworcmVxdWlyZV9vbmNlIF9fRElSX18uJy8uLi8uLi9saWIvcGhwL2xpYi9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAnOworCit1c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOworCiskR0VOX0RJUiA9IHJlYWxwYXRoKGRpcm5hbWUoX19GSUxFX18pLicvLi4nKS4nL2dlbi1waHAnOworCiskbG9hZGVyID0gbmV3IFRocmlmdENsYXNzTG9hZGVyKCk7CiskbG9hZGVyLT5yZWdpc3Rlck5hbWVzcGFjZSgnVGhyaWZ0JywgX19ESVJfXyAuICcvLi4vLi4vbGliL3BocC9saWInKTsKKyRsb2FkZXItPnJlZ2lzdGVyRGVmaW5pdGlvbignc2hhcmVkJywgJEdFTl9ESVIpOworJGxvYWRlci0+cmVnaXN0ZXJEZWZpbml0aW9uKCd0dXRvcmlhbCcsICRHRU5fRElSKTsKKyRsb2FkZXItPnJlZ2lzdGVyKCk7CisKIC8qCiAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtMTksMjkgKzM2LDExIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0kR0xPQkFMU1snVEhSSUZUX1JPT1QnXSA9ICcuLi8uLi9saWIvcGhwL3NyYyc7Ci0KLXJlcXVpcmVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL1RocmlmdC5waHAnOwotcmVxdWlyZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocCc7Ci1yZXF1aXJlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy90cmFuc3BvcnQvVFNvY2tldC5waHAnOwotcmVxdWlyZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocCc7Ci1yZXF1aXJlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocCc7Ci0KLS8qKgotICogU3VwcHJlc3MgZXJyb3JzIGluIGhlcmUsIHdoaWNoIGhhcHBlbiBiZWNhdXNlIHdlIGhhdmUgbm90IGluc3RhbGxlZCBpbnRvCi0gKiAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3BhY2thZ2VzL3R1dG9yaWFsJyBsaWtlIHdlIGFyZSBzdXBwb3NlZCB0byEKLSAqCi0gKiBOb3JtYWxseSB3ZSB3b3VsZCBvbmx5IGhhdmUgdG8gaW5jbHVkZSBDYWxjdWxhdG9yLnBocCB3aGljaCB3b3VsZCBwcm9wZXJseQotICogaW5jbHVkZSB0aGUgb3RoZXIgZmlsZXMgZnJvbSB0aGVpciBwYWNrYWdlcy8gZm9sZGVyIGxvY2F0aW9ucywgYnV0IHdlCi0gKiBpbmNsdWRlIGV2ZXJ5dGhpbmcgaGVyZSBkdWUgdG8gdGhlIGJvZ3VzIHBhdGggc2V0dXAuCi0gKi8KLWVycm9yX3JlcG9ydGluZyhFX05PTkUpOwotJEdFTl9ESVIgPSAnLi4vZ2VuLXBocCc7Ci1yZXF1aXJlX29uY2UgJEdFTl9ESVIuJy9zaGFyZWQvU2hhcmVkU2VydmljZS5waHAnOwotcmVxdWlyZV9vbmNlICRHRU5fRElSLicvc2hhcmVkL3NoYXJlZF90eXBlcy5waHAnOwotcmVxdWlyZV9vbmNlICRHRU5fRElSLicvdHV0b3JpYWwvQ2FsY3VsYXRvci5waHAnOwotcmVxdWlyZV9vbmNlICRHRU5fRElSLicvdHV0b3JpYWwvdHV0b3JpYWxfdHlwZXMucGhwJzsKLWVycm9yX3JlcG9ydGluZyhFX0FMTCk7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRCaW5hcnlQcm90b2NvbDsKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRTb2NrZXQ7Cit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUSHR0cENsaWVudDsKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRCdWZmZXJlZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247CiAKIHRyeSB7CiAgIGlmIChhcnJheV9zZWFyY2goJy0taHR0cCcsICRhcmd2KSkgewpAQCAtNTEsNyArNTAsNyBAQAogICB9CiAgICR0cmFuc3BvcnQgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCRzb2NrZXQsIDEwMjQsIDEwMjQpOwogICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOwotICAkY2xpZW50ID0gbmV3IENhbGN1bGF0b3JDbGllbnQoJHByb3RvY29sKTsKKyAgJGNsaWVudCA9IG5ldyBcdHV0b3JpYWxcQ2FsY3VsYXRvckNsaWVudCgkcHJvdG9jb2wpOwogCiAgICR0cmFuc3BvcnQtPm9wZW4oKTsKIApAQCAtNjEsMjAgKzYwLDIwIEBACiAgICRzdW0gPSAkY2xpZW50LT5hZGQoMSwxKTsKICAgcHJpbnQgIjErMT0kc3VtXG4iOwogCi0gICR3b3JrID0gbmV3IHR1dG9yaWFsX1dvcmsoKTsKKyAgJHdvcmsgPSBuZXcgXHR1dG9yaWFsXFdvcmsoKTsKIAotICAkd29yay0+b3AgPSB0dXRvcmlhbF9PcGVyYXRpb246OkRJVklERTsKKyAgJHdvcmstPm9wID0gXHR1dG9yaWFsXE9wZXJhdGlvbjo6RElWSURFOwogICAkd29yay0+bnVtMSA9IDE7CiAgICR3b3JrLT5udW0yID0gMDsKIAogICB0cnkgewogICAgICRjbGllbnQtPmNhbGN1bGF0ZSgxLCAkd29yayk7CiAgICAgcHJpbnQgIldob2EhIFdlIGNhbiBkaXZpZGUgYnkgemVybz9cbiI7Ci0gIH0gY2F0Y2ggKHR1dG9yaWFsX0ludmFsaWRPcGVyYXRpb24gJGlvKSB7CisgIH0gY2F0Y2ggKFx0dXRvcmlhbFxJbnZhbGlkT3BlcmF0aW9uICRpbykgewogICAgIHByaW50ICJJbnZhbGlkT3BlcmF0aW9uOiAkaW8tPndoeVxuIjsKICAgfQogCi0gICR3b3JrLT5vcCA9IHR1dG9yaWFsX09wZXJhdGlvbjo6U1VCVFJBQ1Q7CisgICR3b3JrLT5vcCA9IFx0dXRvcmlhbFxPcGVyYXRpb246OlNVQlRSQUNUOwogICAkd29yay0+bnVtMSA9IDE1OwogICAkd29yay0+bnVtMiA9IDEwOwogICAkZGlmZiA9ICRjbGllbnQtPmNhbGN1bGF0ZSgxLCAkd29yayk7CmRpZmYgLS1naXQgYS90dXRvcmlhbC9waHAvUGhwU2VydmVyLnBocCBiL3R1dG9yaWFsL3BocC9QaHBTZXJ2ZXIucGhwCmluZGV4IDIzNWIxNWIuLjVhOWI0OWIgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3BocC9QaHBTZXJ2ZXIucGhwCisrKyBiL3R1dG9yaWFsL3BocC9QaHBTZXJ2ZXIucGhwCkBAIC0xLDUgKzEsMjIgQEAKICMhL3Vzci9iaW4vZW52IHBocAogPD9waHAKKworbmFtZXNwYWNlIHR1dG9yaWFsXHBocDsKKworZXJyb3JfcmVwb3J0aW5nKEVfQUxMKTsKKworcmVxdWlyZV9vbmNlIF9fRElSX18uJy8uLi8uLi9saWIvcGhwL2xpYi9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAnOworCit1c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOworCiskR0VOX0RJUiA9IHJlYWxwYXRoKGRpcm5hbWUoX19GSUxFX18pLicvLi4nKS4nL2dlbi1waHAnOworCiskbG9hZGVyID0gbmV3IFRocmlmdENsYXNzTG9hZGVyKCk7CiskbG9hZGVyLT5yZWdpc3Rlck5hbWVzcGFjZSgnVGhyaWZ0JywgX19ESVJfXyAuICcvLi4vLi4vbGliL3BocC9saWInKTsKKyRsb2FkZXItPnJlZ2lzdGVyRGVmaW5pdGlvbignc2hhcmVkJywgJEdFTl9ESVIpOworJGxvYWRlci0+cmVnaXN0ZXJEZWZpbml0aW9uKCd0dXRvcmlhbCcsICRHRU5fRElSKTsKKyRsb2FkZXItPnJlZ2lzdGVyKCk7CisKIC8qCiAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtMzEsMzAgKzQ4LDExIEBACiAgIGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwgInN0ZGVyciIpOwogfQogCi0kR0xPQkFMU1snVEhSSUZUX1JPT1QnXSA9IHJlYWxwYXRoKGRpcm5hbWUoX19GSUxFX18pLicvLi4vLi4nKS4nL2xpYi9waHAvc3JjJzsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sOwordXNlIFRocmlmdFxUcmFuc3BvcnRcVFBocFN0cmVhbTsKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRCdWZmZXJlZFRyYW5zcG9ydDsKIAotcmVxdWlyZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvVGhyaWZ0LnBocCc7Ci1yZXF1aXJlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwJzsKLXJlcXVpcmVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocCc7Ci1yZXF1aXJlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocCc7Ci0KLS8qKgotICogU3VwcHJlc3MgZXJyb3JzIGluIGhlcmUsIHdoaWNoIGhhcHBlbiBiZWNhdXNlIHdlIGhhdmUgbm90IGluc3RhbGxlZCBpbnRvCi0gKiAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3BhY2thZ2VzL3R1dG9yaWFsJyBsaWtlIHdlIGFyZSBzdXBwb3NlZCB0byEKLSAqCi0gKiBOb3JtYWxseSB3ZSB3b3VsZCBvbmx5IGhhdmUgdG8gaW5jbHVkZSBDYWxjdWxhdG9yLnBocCB3aGljaCB3b3VsZCBwcm9wZXJseQotICogaW5jbHVkZSB0aGUgb3RoZXIgZmlsZXMgZnJvbSB0aGVpciBwYWNrYWdlcy8gZm9sZGVyIGxvY2F0aW9ucywgYnV0IHdlCi0gKiBpbmNsdWRlIGV2ZXJ5dGhpbmcgaGVyZSBkdWUgdG8gdGhlIGJvZ3VzIHBhdGggc2V0dXAuCi0gKi8KLWVycm9yX3JlcG9ydGluZyhFX05PTkUpOwotJEdFTl9ESVIgPSByZWFscGF0aChkaXJuYW1lKF9fRklMRV9fKS4nLy4uJykuJy9nZW4tcGhwJzsKLXJlcXVpcmVfb25jZSAkR0VOX0RJUi4nL3NoYXJlZC9TaGFyZWRTZXJ2aWNlLnBocCc7Ci1yZXF1aXJlX29uY2UgJEdFTl9ESVIuJy9zaGFyZWQvc2hhcmVkX3R5cGVzLnBocCc7Ci1yZXF1aXJlX29uY2UgJEdFTl9ESVIuJy90dXRvcmlhbC9DYWxjdWxhdG9yLnBocCc7Ci1yZXF1aXJlX29uY2UgJEdFTl9ESVIuJy90dXRvcmlhbC90dXRvcmlhbF90eXBlcy5waHAnOwotZXJyb3JfcmVwb3J0aW5nKEVfQUxMKTsKLQotY2xhc3MgQ2FsY3VsYXRvckhhbmRsZXIgaW1wbGVtZW50cyBDYWxjdWxhdG9ySWYgeworY2xhc3MgQ2FsY3VsYXRvckhhbmRsZXIgaW1wbGVtZW50cyBcdHV0b3JpYWxcQ2FsY3VsYXRvcklmIHsKICAgcHJvdGVjdGVkICRsb2cgPSBhcnJheSgpOwogCiAgIHB1YmxpYyBmdW5jdGlvbiBwaW5nKCkgewpAQCAtNjYsMzUgKzY0LDM1IEBACiAgICAgcmV0dXJuICRudW0xICsgJG51bTI7CiAgIH0KIAotICBwdWJsaWMgZnVuY3Rpb24gY2FsY3VsYXRlKCRsb2dpZCwgJHcpIHsKKyAgcHVibGljIGZ1bmN0aW9uIGNhbGN1bGF0ZSgkbG9naWQsIFx0dXRvcmlhbFxXb3JrICR3KSB7CiAgICAgZXJyb3JfbG9nKCJjYWxjdWxhdGUoeyRsb2dpZH0sIHt7JHctPm9wfSwgeyR3LT5udW0xfSwgeyR3LT5udW0yfX0pIik7CiAgICAgc3dpdGNoICgkdy0+b3ApIHsKLSAgICAgIGNhc2UgdHV0b3JpYWxfT3BlcmF0aW9uOjpBREQ6CisgICAgICBjYXNlIFx0dXRvcmlhbFxPcGVyYXRpb246OkFERDoKICAgICAgICAgJHZhbCA9ICR3LT5udW0xICsgJHctPm51bTI7CiAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0dXRvcmlhbF9PcGVyYXRpb246OlNVQlRSQUNUOgorICAgICAgY2FzZSBcdHV0b3JpYWxcT3BlcmF0aW9uOjpTVUJUUkFDVDoKICAgICAgICAgJHZhbCA9ICR3LT5udW0xIC0gJHctPm51bTI7CiAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0dXRvcmlhbF9PcGVyYXRpb246Ok1VTFRJUExZOgorICAgICAgY2FzZSBcdHV0b3JpYWxcT3BlcmF0aW9uOjpNVUxUSVBMWToKICAgICAgICAgJHZhbCA9ICR3LT5udW0xICogJHctPm51bTI7CiAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0dXRvcmlhbF9PcGVyYXRpb246OkRJVklERToKKyAgICAgIGNhc2UgXHR1dG9yaWFsXE9wZXJhdGlvbjo6RElWSURFOgogICAgICAgICBpZiAoJHctPm51bTIgPT0gMCkgewotICAgICAgICAgICRpbyA9IG5ldyB0dXRvcmlhbF9JbnZhbGlkT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgJGlvLT53aGF0ID0gJHctPm9wOworICAgICAgICAgICRpbyA9IG5ldyBcdHV0b3JpYWxcSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgICAgICRpby0+d2hhdE9wID0gJHctPm9wOwogICAgICAgICAgICRpby0+d2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCI7CiAgICAgICAgICAgdGhyb3cgJGlvOwogICAgICAgICB9CiAgICAgICAgICR2YWwgPSAkdy0+bnVtMSAvICR3LT5udW0yOwogICAgICAgICBicmVhazsKICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICRpbyA9IG5ldyB0dXRvcmlhbF9JbnZhbGlkT3BlcmF0aW9uKCk7Ci0gICAgICAgICRpby0+d2hhdCA9ICR3LT5vcDsKKyAgICAgICAgJGlvID0gbmV3IFx0dXRvcmlhbFxJbnZhbGlkT3BlcmF0aW9uKCk7CisgICAgICAgICRpby0+d2hhdE9wID0gJHctPm9wOwogICAgICAgICAkaW8tPndoeSA9ICJJbnZhbGlkIE9wZXJhdGlvbiI7CiAgICAgICAgIHRocm93ICRpbzsKICAgICB9CiAKLSAgICAkbG9nID0gbmV3IFNoYXJlZFN0cnVjdCgpOworICAgICRsb2cgPSBuZXcgXHNoYXJlZFxTaGFyZWRTdHJ1Y3QoKTsKICAgICAkbG9nLT5rZXkgPSAkbG9naWQ7CiAgICAgJGxvZy0+dmFsdWUgPSAoc3RyaW5nKSR2YWw7CiAgICAgJHRoaXMtPmxvZ1skbG9naWRdID0gJGxvZzsKQEAgLTEwNyw3ICsxMDUsNyBAQAogICAgIC8vIFRoaXMgYWN0dWFsbHkgZG9lc24ndCB3b3JrIGJlY2F1c2UgdGhlIFBIUCBpbnRlcnByZXRlciBpcwogICAgIC8vIHJlc3RhcnRlZCBmb3IgZXZlcnkgcmVxdWVzdC4KICAgICAvL3JldHVybiAkdGhpcy0+bG9nWyRrZXldOwotICAgIHJldHVybiBuZXcgU2hhcmVkU3RydWN0KGFycmF5KCJrZXkiID0+ICRrZXksICJ2YWx1ZSIgPT4gIlBIUCBpcyBzdGF0ZWxlc3MhIikpOworICAgIHJldHVybiBuZXcgXHNoYXJlZFxTaGFyZWRTdHJ1Y3QoYXJyYXkoImtleSIgPT4gJGtleSwgInZhbHVlIiA9PiAiUEhQIGlzIHN0YXRlbGVzcyEiKSk7CiAgIH0KIAogICBwdWJsaWMgZnVuY3Rpb24gemlwKCkgewpAQCAtMTIyLDcgKzEyMCw3IEBACiB9CiAKICRoYW5kbGVyID0gbmV3IENhbGN1bGF0b3JIYW5kbGVyKCk7Ci0kcHJvY2Vzc29yID0gbmV3IENhbGN1bGF0b3JQcm9jZXNzb3IoJGhhbmRsZXIpOworJHByb2Nlc3NvciA9IG5ldyBcdHV0b3JpYWxcQ2FsY3VsYXRvclByb2Nlc3NvcigkaGFuZGxlcik7CiAKICR0cmFuc3BvcnQgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KG5ldyBUUGhwU3RyZWFtKFRQaHBTdHJlYW06Ok1PREVfUiB8IFRQaHBTdHJlYW06Ok1PREVfVykpOwogJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0LCB0cnVlLCB0cnVlKTsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3BocC9ydW5zZXJ2ZXIucHkgYi90dXRvcmlhbC9waHAvcnVuc2VydmVyLnB5CmluZGV4IGFlMjlmZWQuLjA3N2RhYTEgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3BocC9ydW5zZXJ2ZXIucHkKKysrIGIvdHV0b3JpYWwvcGhwL3J1bnNlcnZlci5weQpAQCAtMjYsNyArMjYsOCBAQAogIyBjaGRpcigyKSBpbnRvIHRoZSB0dXRvcmlhbCBkaXJlY3RvcnkuCiBvcy5jaGRpcihvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgoX19maWxlX18pKSkpCiAKKwogY2xhc3MgSGFuZGxlcihDR0lIVFRQU2VydmVyLkNHSUhUVFBSZXF1ZXN0SGFuZGxlcik6Ci0gIGNnaV9kaXJlY3RvcmllcyAgPSBbJy9waHAnXQorICAgIGNnaV9kaXJlY3RvcmllcyA9IFsnL3BocCddCiAKIEJhc2VIVFRQU2VydmVyLkhUVFBTZXJ2ZXIoKCcnLCA4MDgwKSwgSGFuZGxlcikuc2VydmVfZm9yZXZlcigpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS50b3JuYWRvL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvcHkudG9ybmFkby9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YjczYzFlCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcHkudG9ybmFkby9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDM2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZ2VuLXB5LnRvcm5hZG8vdHV0b3JpYWwvQ2FsY3VsYXRvci5weSBnZW4tcHkudG9ybmFkby9zaGFyZWQvU2hhcmVkU2VydmljZS5weTogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gcHk6dG9ybmFkbyAtciAkPAorCithbGwtbG9jYWw6IGdlbi1weS50b3JuYWRvL3R1dG9yaWFsL0NhbGN1bGF0b3IucHkKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCSR7UFlUSE9OfSBQeXRob25TZXJ2ZXIucHkKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCSR7UFlUSE9OfSBQeXRob25DbGllbnQucHkKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLSoKKworRVhUUkFfRElTVCA9IFwKKwlQeXRob25TZXJ2ZXIucHkgXAorCVB5dGhvbkNsaWVudC5weQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkudG9ybmFkby9QeXRob25DbGllbnQucHkgYi90dXRvcmlhbC9weS50b3JuYWRvL1B5dGhvbkNsaWVudC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MjYxNDZmCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcHkudG9ybmFkby9QeXRob25DbGllbnQucHkKQEAgLTAsMCArMSwxMDggQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGdsb2IKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgc3lzCisKK3N5cy5wYXRoLmFwcGVuZCgnZ2VuLXB5LnRvcm5hZG8nKQorc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYionKVswXSkKKworZnJvbSB0dXRvcmlhbCBpbXBvcnQgQ2FsY3VsYXRvcgorZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0IE9wZXJhdGlvbiwgV29yaywgSW52YWxpZE9wZXJhdGlvbgorCitmcm9tIHRocmlmdCBpbXBvcnQgVFRvcm5hZG8KK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorCitmcm9tIHRvcm5hZG8gaW1wb3J0IGdlbgorZnJvbSB0b3JuYWRvIGltcG9ydCBpb2xvb3AKKworCitAZ2VuLmNvcm91dGluZQorZGVmIGNvbW11bmljYXRlKCk6CisgICAgIyBjcmVhdGUgY2xpZW50CisgICAgdHJhbnNwb3J0ID0gVFRvcm5hZG8uVFRvcm5hZG9TdHJlYW1UcmFuc3BvcnQoJ2xvY2FsaG9zdCcsIDkwOTApCisgICAgIyBvcGVuIHRoZSB0cmFuc3BvcnQsIGJhaWwgb24gZXJyb3IKKyAgICB0cnk6CisgICAgICAgIHlpZWxkIHRyYW5zcG9ydC5vcGVuKCkKKyAgICAgICAgcHJpbnQoJ1RyYW5zcG9ydCBpcyBvcGVuZWQnKQorICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24gYXMgZXg6CisgICAgICAgIGxvZ2dpbmcuZXJyb3IoZXgpCisgICAgICAgIHJhaXNlIGdlbi5SZXR1cm4oKQorCisgICAgcGZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCisgICAgY2xpZW50ID0gQ2FsY3VsYXRvci5DbGllbnQodHJhbnNwb3J0LCBwZmFjdG9yeSkKKworICAgICMgcGluZworICAgIHlpZWxkIGNsaWVudC5waW5nKCkKKyAgICBwcmludCgicGluZygpIikKKworICAgICMgYWRkCisgICAgc3VtXyA9IHlpZWxkIGNsaWVudC5hZGQoMSwgMSkKKyAgICBwcmludCgiMSArIDEgPSB7MH0iLmZvcm1hdChzdW1fKSkKKworICAgICMgbWFrZSBhIG9uZXdheSBjYWxsIHdpdGhvdXQgYSBjYWxsYmFjayAoc2NoZWR1bGUgdGhlIHdyaXRlIGFuZCBjb250aW51ZQorICAgICMgd2l0aG91dCBibG9ja2luZykKKyAgICBjbGllbnQuemlwKCkKKyAgICBwcmludCgiemlwKCkgd2l0aG91dCBjYWxsYmFjayIpCisKKyAgICAjIG1ha2UgYSBvbmV3YXkgY2FsbCB3aXRoIGEgY2FsbGJhY2sgKHdlJ2xsIHdhaXQgZm9yIHRoZSBzdHJlYW0gd3JpdGUgdG8KKyAgICAjIGNvbXBsZXRlIGJlZm9yZSBjb250aW51aW5nKQorICAgIGNsaWVudC56aXAoKQorICAgIHByaW50KCJ6aXAoKSB3aXRoIGNhbGxiYWNrIikKKworICAgICMgY2FsY3VsYXRlIDEvMAorICAgIHdvcmsgPSBXb3JrKCkKKyAgICB3b3JrLm9wID0gT3BlcmF0aW9uLkRJVklERQorICAgIHdvcmsubnVtMSA9IDEKKyAgICB3b3JrLm51bTIgPSAwCisKKyAgICB0cnk6CisgICAgICAgIHF1b3RpZW50ID0geWllbGQgY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQorICAgICAgICBwcmludCgiV2hvYT8gWW91IGtub3cgaG93IHRvIGRpdmlkZSBieSB6ZXJvID8gLT4gezB9Ii5mb3JtYXQocXVvdGllbnQpKQorICAgIGV4Y2VwdCBJbnZhbGlkT3BlcmF0aW9uIGFzIGlvOgorICAgICAgICBwcmludCgiSW52YWxpZE9wZXJhdGlvbjogezB9Ii5mb3JtYXQoaW8pKQorCisgICAgIyBjYWxjdWxhdGUgMTUtMTAKKyAgICB3b3JrLm9wID0gT3BlcmF0aW9uLlNVQlRSQUNUCisgICAgd29yay5udW0xID0gMTUKKyAgICB3b3JrLm51bTIgPSAxMAorCisgICAgZGlmZiA9IHlpZWxkIGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgICBwcmludCgiMTUgLSAxMCA9IHswfSIuZm9ybWF0KGRpZmYpKQorCisgICAgIyBnZXRTdHJ1Y3QKKyAgICBsb2cgPSB5aWVsZCBjbGllbnQuZ2V0U3RydWN0KDEpCisgICAgcHJpbnQoIkNoZWNrIGxvZzogezB9Ii5mb3JtYXQobG9nLnZhbHVlKSkKKworICAgICMgY2xvc2UgdGhlIHRyYW5zcG9ydAorICAgIGNsaWVudC5fdHJhbnNwb3J0LmNsb3NlKCkKKyAgICByYWlzZSBnZW4uUmV0dXJuKCkKKworCitkZWYgbWFpbigpOgorICAgICMgY3JlYXRlIGFuIGlvbG9vcCwgZG8gdGhlIGFib3ZlLCB0aGVuIHN0b3AKKyAgICBpb2xvb3AuSU9Mb29wLmN1cnJlbnQoKS5ydW5fc3luYyhjb21tdW5pY2F0ZSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkudG9ybmFkby9QeXRob25TZXJ2ZXIucHkgYi90dXRvcmlhbC9weS50b3JuYWRvL1B5dGhvblNlcnZlci5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMDIyOWEyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcHkudG9ybmFkby9QeXRob25TZXJ2ZXIucHkKQEAgLTAsMCArMSwxMDAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGdsb2IKK2ltcG9ydCBzeXMKKworc3lzLnBhdGguYXBwZW5kKCdnZW4tcHkudG9ybmFkbycpCitzeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliKicpWzBdKQorCitmcm9tIHR1dG9yaWFsIGltcG9ydCBDYWxjdWxhdG9yCitmcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgT3BlcmF0aW9uLCBJbnZhbGlkT3BlcmF0aW9uCisKK2Zyb20gc2hhcmVkLnR0eXBlcyBpbXBvcnQgU2hhcmVkU3RydWN0CisKK2Zyb20gdGhyaWZ0IGltcG9ydCBUVG9ybmFkbworZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorCitmcm9tIHRvcm5hZG8gaW1wb3J0IGlvbG9vcAorCisKK2NsYXNzIENhbGN1bGF0b3JIYW5kbGVyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmxvZyA9IHt9CisKKyAgICBkZWYgcGluZyhzZWxmKToKKyAgICAgICAgcHJpbnQoInBpbmcoKSIpCisKKyAgICBkZWYgYWRkKHNlbGYsIG4xLCBuMik6CisgICAgICAgIHByaW50KCJhZGQoe30sIHt9KSIuZm9ybWF0KG4xLCBuMikpCisgICAgICAgIHJldHVybiBuMSArIG4yCisKKyAgICBkZWYgY2FsY3VsYXRlKHNlbGYsIGxvZ2lkLCB3b3JrKToKKyAgICAgICAgcHJpbnQoImNhbGN1bGF0ZSh7fSwge30pIi5mb3JtYXQobG9naWQsIHdvcmspKQorCisgICAgICAgIGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLkFERDoKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMgorICAgICAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLlNVQlRSQUNUOgorICAgICAgICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yCisgICAgICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uTVVMVElQTFk6CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgKiB3b3JrLm51bTIKKyAgICAgICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5ESVZJREU6CisgICAgICAgICAgICBpZiB3b3JrLm51bTIgPT0gMDoKKyAgICAgICAgICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCisgICAgICAgICAgICAgICAgeC53aGF0T3AgPSB3b3JrLm9wCisgICAgICAgICAgICAgICAgeC53aHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIgorICAgICAgICAgICAgICAgIHJhaXNlIHgKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAvIHdvcmsubnVtMgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQorICAgICAgICAgICAgeC53aGF0T3AgPSB3b3JrLm9wCisgICAgICAgICAgICB4LndoeSA9ICJJbnZhbGlkIG9wZXJhdGlvbiIKKyAgICAgICAgICAgIHJhaXNlIHgKKworICAgICAgICBsb2cgPSBTaGFyZWRTdHJ1Y3QoKQorICAgICAgICBsb2cua2V5ID0gbG9naWQKKyAgICAgICAgbG9nLnZhbHVlID0gJyVkJyAlICh2YWwpCisgICAgICAgIHNlbGYubG9nW2xvZ2lkXSA9IGxvZworICAgICAgICByZXR1cm4gdmFsCisKKyAgICBkZWYgZ2V0U3RydWN0KHNlbGYsIGtleSk6CisgICAgICAgIHByaW50KCJnZXRTdHJ1Y3Qoe30pIi5mb3JtYXQoa2V5KSkKKyAgICAgICAgcmV0dXJuIHNlbGYubG9nW2tleV0KKworICAgIGRlZiB6aXAoc2VsZik6CisgICAgICAgIHByaW50KCJ6aXAoKSIpCisKKworZGVmIG1haW4oKToKKyAgICBoYW5kbGVyID0gQ2FsY3VsYXRvckhhbmRsZXIoKQorICAgIHByb2Nlc3NvciA9IENhbGN1bGF0b3IuUHJvY2Vzc29yKGhhbmRsZXIpCisgICAgcGZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCisgICAgc2VydmVyID0gVFRvcm5hZG8uVFRvcm5hZG9TZXJ2ZXIocHJvY2Vzc29yLCBwZmFjdG9yeSkKKworICAgIHByaW50KCJTdGFydGluZyB0aGUgc2VydmVyLi4uIikKKyAgICBzZXJ2ZXIuYmluZCg5MDkwKQorICAgIHNlcnZlci5zdGFydCgxKQorICAgIGlvbG9vcC5JT0xvb3AuaW5zdGFuY2UoKS5zdGFydCgpCisgICAgcHJpbnQoImRvbmUuIikKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkudHdpc3RlZC9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL3B5LnR3aXN0ZWQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTBjZDM0MgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3B5LnR3aXN0ZWQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzNyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2dlbi1weS90dXRvcmlhbC9DYWxjdWxhdG9yLnB5IGdlbi1weS9zaGFyZWQvU2hhcmVkU2VydmljZS5weTogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gcHk6dHdpc3RlZCAtciAkPAorCithbGwtbG9jYWw6IGdlbi1weS90dXRvcmlhbC9DYWxjdWxhdG9yLnB5CisKK3R1dG9yaWFsc2VydmVyOiBhbGwKKwkke1BZVEhPTn0gUHl0aG9uU2VydmVyLnB5CisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwkke1BZVEhPTn0gUHl0aG9uQ2xpZW50LnB5CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi0qCisKK0VYVFJBX0RJU1QgPSBcCisJUHl0aG9uQ2xpZW50LnB5IFwKKwlQeXRob25TZXJ2ZXIucHkgXAorCVB5dGhvblNlcnZlci50YWMKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5LnR3aXN0ZWQvUHl0aG9uQ2xpZW50LnB5IGIvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25DbGllbnQucHkKaW5kZXggMjdhM2Q1My4uNjNkZGU3ZSAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25DbGllbnQucHkKKysrIGIvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25DbGllbnQucHkKQEAgLTE5LDUwICsxOSw1MyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAoraW1wb3J0IGdsb2IKIGltcG9ydCBzeXMKLXN5cy5wYXRoLmFwcGVuZCgnLi4vZ2VuLXB5JykKK3N5cy5wYXRoLmFwcGVuZCgnZ2VuLXB5LnR3aXN0ZWQnKQorc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYionKVswXSkKIAogZnJvbSB0dXRvcmlhbCBpbXBvcnQgQ2FsY3VsYXRvcgotZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0ICoKK2Zyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCBJbnZhbGlkT3BlcmF0aW9uLCBPcGVyYXRpb24sIFdvcmsKIAogZnJvbSB0d2lzdGVkLmludGVybmV0LmRlZmVyIGltcG9ydCBpbmxpbmVDYWxsYmFja3MKIGZyb20gdHdpc3RlZC5pbnRlcm5ldCBpbXBvcnQgcmVhY3RvcgogZnJvbSB0d2lzdGVkLmludGVybmV0LnByb3RvY29sIGltcG9ydCBDbGllbnRDcmVhdG9yCiAKLWZyb20gdGhyaWZ0IGltcG9ydCBUaHJpZnQKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFR3aXN0ZWQKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKIAorCiBAaW5saW5lQ2FsbGJhY2tzCiBkZWYgbWFpbihjbGllbnQpOgotICB5aWVsZCBjbGllbnQucGluZygpCi0gIHByaW50ICdwaW5nKCknCisgICAgeWllbGQgY2xpZW50LnBpbmcoKQorICAgIHByaW50KCdwaW5nKCknKQogCi0gIHN1bSA9IHlpZWxkIGNsaWVudC5hZGQoMSwxKQotICBwcmludCAnMSsxPSVkJyAlIChzdW0pCisgICAgc3VtID0geWllbGQgY2xpZW50LmFkZCgxLCAxKQorICAgIHByaW50KCgnMSsxPSVkJyAlIChzdW0pKSkKIAotICB3b3JrID0gV29yaygpCisgICAgd29yayA9IFdvcmsoKQogCi0gIHdvcmsub3AgPSBPcGVyYXRpb24uRElWSURFCi0gIHdvcmsubnVtMSA9IDEKLSAgd29yay5udW0yID0gMAorICAgIHdvcmsub3AgPSBPcGVyYXRpb24uRElWSURFCisgICAgd29yay5udW0xID0gMQorICAgIHdvcmsubnVtMiA9IDAKIAotICB0cnk6Ci0gICAgcXVvdGllbnQgPSB5aWVsZCBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspCi0gICAgcHJpbnQgJ1dob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybz8nCi0gIGV4Y2VwdCBJbnZhbGlkT3BlcmF0aW9uLCBpbzoKLSAgICBwcmludCAnSW52YWxpZE9wZXJhdGlvbjogJXInICUgaW8KKyAgICB0cnk6CisgICAgICAgIHF1b3RpZW50ID0geWllbGQgY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQorICAgICAgICBwcmludCgnV2hvYT8gWW91IGtub3cgaG93IHRvIGRpdmlkZSBieSB6ZXJvPycpCisgICAgICAgIHByaW50KCdGWUkgdGhlIGFuc3dlciBpcyAlZCcgJSBxdW90aWVudCkKKyAgICBleGNlcHQgSW52YWxpZE9wZXJhdGlvbiBhcyBlOgorICAgICAgICBwcmludCgoJ0ludmFsaWRPcGVyYXRpb246ICVyJyAlIGUpKQogCi0gIHdvcmsub3AgPSBPcGVyYXRpb24uU1VCVFJBQ1QKLSAgd29yay5udW0xID0gMTUKLSAgd29yay5udW0yID0gMTAKKyAgICB3b3JrLm9wID0gT3BlcmF0aW9uLlNVQlRSQUNUCisgICAgd29yay5udW0xID0gMTUKKyAgICB3b3JrLm51bTIgPSAxMAogCi0gIGRpZmYgPSB5aWVsZCBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspCi0gIHByaW50ICcxNS0xMD0lZCcgJSAoZGlmZikKKyAgICBkaWZmID0geWllbGQgY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQorICAgIHByaW50KCgnMTUtMTA9JWQnICUgKGRpZmYpKSkKIAotICBsb2cgPSB5aWVsZCBjbGllbnQuZ2V0U3RydWN0KDEpCi0gIHByaW50ICdDaGVjayBsb2c6ICVzJyAlIChsb2cudmFsdWUpCi0gIHJlYWN0b3Iuc3RvcCgpCisgICAgbG9nID0geWllbGQgY2xpZW50LmdldFN0cnVjdCgxKQorICAgIHByaW50KCgnQ2hlY2sgbG9nOiAlcycgJSAobG9nLnZhbHVlKSkpCisgICAgcmVhY3Rvci5zdG9wKCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBkID0gQ2xpZW50Q3JlYXRvcihyZWFjdG9yLApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25TZXJ2ZXIucHkgYi90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvblNlcnZlci5weQppbmRleCA2MTMwYjkyLi4xYjBlMmQ1IDEwMDc1NQotLS0gYS90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvblNlcnZlci5weQorKysgYi90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvblNlcnZlci5weQpAQCAtMTksMTEgKzE5LDEzIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCitpbXBvcnQgZ2xvYgogaW1wb3J0IHN5cwotc3lzLnBhdGguYXBwZW5kKCcuLi9nZW4tcHkudHdpc3RlZCcpCitzeXMucGF0aC5hcHBlbmQoJ2dlbi1weS50d2lzdGVkJykKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJylbMF0pCiAKIGZyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKLWZyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCAqCitmcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgSW52YWxpZE9wZXJhdGlvbiwgT3BlcmF0aW9uCiAKIGZyb20gc2hhcmVkLnR0eXBlcyBpbXBvcnQgU2hhcmVkU3RydWN0CiAKQEAgLTMyLDYxICszNCw2MyBAQAogCiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUd2lzdGVkCiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCi1mcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIKKwogCiBjbGFzcyBDYWxjdWxhdG9ySGFuZGxlcjoKLSAgaW1wbGVtZW50cyhDYWxjdWxhdG9yLklmYWNlKSAgCi0gIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICBzZWxmLmxvZyA9IHt9CisgICAgaW1wbGVtZW50cyhDYWxjdWxhdG9yLklmYWNlKQogCi0gIGRlZiBwaW5nKHNlbGYpOgotICAgIHByaW50ICdwaW5nKCknCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmxvZyA9IHt9CiAKLSAgZGVmIGFkZChzZWxmLCBuMSwgbjIpOgotICAgIHByaW50ICdhZGQoJWQsJWQpJyAlIChuMSwgbjIpCi0gICAgcmV0dXJuIG4xK24yCisgICAgZGVmIHBpbmcoc2VsZik6CisgICAgICAgIHByaW50KCdwaW5nKCknKQogCi0gIGRlZiBjYWxjdWxhdGUoc2VsZiwgbG9naWQsIHdvcmspOgotICAgIHByaW50ICdjYWxjdWxhdGUoJWQsICVyKScgJSAobG9naWQsIHdvcmspCisgICAgZGVmIGFkZChzZWxmLCBuMSwgbjIpOgorICAgICAgICBwcmludCgnYWRkKCVkLCVkKScgJSAobjEsIG4yKSkKKyAgICAgICAgcmV0dXJuIG4xICsgbjIKIAotICAgIGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLkFERDoKLSAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMgotICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uU1VCVFJBQ1Q6Ci0gICAgICB2YWwgPSB3b3JrLm51bTEgLSB3b3JrLm51bTIKLSAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLk1VTFRJUExZOgotICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yCi0gICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5ESVZJREU6Ci0gICAgICBpZiB3b3JrLm51bTIgPT0gMDoKLSAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQotICAgICAgICB4LndoYXQgPSB3b3JrLm9wCi0gICAgICAgIHgud2h5ID0gJ0Nhbm5vdCBkaXZpZGUgYnkgMCcKLSAgICAgICAgcmFpc2UgeAotICAgICAgdmFsID0gd29yay5udW0xIC8gd29yay5udW0yCi0gICAgZWxzZToKLSAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKLSAgICAgIHgud2hhdCA9IHdvcmsub3AKLSAgICAgIHgud2h5ID0gJ0ludmFsaWQgb3BlcmF0aW9uJwotICAgICAgcmFpc2UgeAorICAgIGRlZiBjYWxjdWxhdGUoc2VsZiwgbG9naWQsIHdvcmspOgorICAgICAgICBwcmludCgnY2FsY3VsYXRlKCVkLCAlciknICUgKGxvZ2lkLCB3b3JrKSkKIAotICAgIGxvZyA9IFNoYXJlZFN0cnVjdCgpCi0gICAgbG9nLmtleSA9IGxvZ2lkCi0gICAgbG9nLnZhbHVlID0gJyVkJyAlICh2YWwpCi0gICAgc2VsZi5sb2dbbG9naWRdID0gbG9nCisgICAgICAgIGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLkFERDoKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMgorICAgICAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLlNVQlRSQUNUOgorICAgICAgICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yCisgICAgICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uTVVMVElQTFk6CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgKiB3b3JrLm51bTIKKyAgICAgICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5ESVZJREU6CisgICAgICAgICAgICBpZiB3b3JrLm51bTIgPT0gMDoKKyAgICAgICAgICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCisgICAgICAgICAgICAgICAgeC53aGF0T3AgPSB3b3JrLm9wCisgICAgICAgICAgICAgICAgeC53aHkgPSAnQ2Fubm90IGRpdmlkZSBieSAwJworICAgICAgICAgICAgICAgIHJhaXNlIHgKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAvIHdvcmsubnVtMgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQorICAgICAgICAgICAgeC53aGF0T3AgPSB3b3JrLm9wCisgICAgICAgICAgICB4LndoeSA9ICdJbnZhbGlkIG9wZXJhdGlvbicKKyAgICAgICAgICAgIHJhaXNlIHgKIAotICAgIHJldHVybiB2YWwKKyAgICAgICAgbG9nID0gU2hhcmVkU3RydWN0KCkKKyAgICAgICAgbG9nLmtleSA9IGxvZ2lkCisgICAgICAgIGxvZy52YWx1ZSA9ICclZCcgJSAodmFsKQorICAgICAgICBzZWxmLmxvZ1tsb2dpZF0gPSBsb2cKIAotICBkZWYgZ2V0U3RydWN0KHNlbGYsIGtleSk6Ci0gICAgcHJpbnQgJ2dldFN0cnVjdCglZCknICUgKGtleSkKLSAgICByZXR1cm4gc2VsZi5sb2dba2V5XQorICAgICAgICByZXR1cm4gdmFsCiAKLSAgZGVmIHppcChzZWxmKToKLSAgICBwcmludCAnemlwKCknCisgICAgZGVmIGdldFN0cnVjdChzZWxmLCBrZXkpOgorICAgICAgICBwcmludCgnZ2V0U3RydWN0KCVkKScgJSAoa2V5KSkKKyAgICAgICAgcmV0dXJuIHNlbGYubG9nW2tleV0KKworICAgIGRlZiB6aXAoc2VsZik6CisgICAgICAgIHByaW50KCd6aXAoKScpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgaGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyKCkKICAgICBwcm9jZXNzb3IgPSBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKQogICAgIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQotICAgIHNlcnZlciA9IHJlYWN0b3IubGlzdGVuVENQKDkwOTAsCi0gICAgICAgICAgICAgICAgVFR3aXN0ZWQuVGhyaWZ0U2VydmVyRmFjdG9yeShwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgcGZhY3RvcnkpLCBpbnRlcmZhY2U9IjEyNy4wLjAuMSIpCisgICAgc2VydmVyID0gcmVhY3Rvci5saXN0ZW5UQ1AoCisgICAgICAgIDkwOTAsCisgICAgICAgIFRUd2lzdGVkLlRocmlmdFNlcnZlckZhY3RvcnkocHJvY2Vzc29yLCBwZmFjdG9yeSksCisgICAgICAgIGludGVyZmFjZT0iMTI3LjAuMC4xIikKICAgICByZWFjdG9yLnJ1bigpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvblNlcnZlci50YWMgYi90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvblNlcnZlci50YWMKaW5kZXggMTFmMGY4Zi4uMDQ3OTYzNiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25TZXJ2ZXIudGFjCisrKyBiL3R1dG9yaWFsL3B5LnR3aXN0ZWQvUHl0aG9uU2VydmVyLnRhYwpAQCAtMjIsMTEgKzIyLDE0IEBACiBmcm9tIHR3aXN0ZWQuYXBwbGljYXRpb24gaW1wb3J0IGludGVybmV0LCBzZXJ2aWNlCiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUd2lzdGVkCiAKK2ltcG9ydCBnbG9iCiBpbXBvcnQgc3lzCi1zeXMucGF0aC5hcHBlbmQoJy4uL2dlbi1weS50d2lzdGVkJykKK3N5cy5wYXRoLmFwcGVuZCgnZ2VuLXB5LnR3aXN0ZWQnKQorc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYionKVswXSkKIGZyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKLWZyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCAqCiBmcm9tIFB5dGhvblNlcnZlciBpbXBvcnQgQ2FsY3VsYXRvckhhbmRsZXIKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKKwogCiBkZWYgbWFrZV9hcHBsaWNhdGlvbigpOgogICAgIGFwcGxpY2F0aW9uID0gc2VydmljZS5BcHBsaWNhdGlvbignQ2FsY1NlcnZlcicpCkBAIC0zNCw4ICszNyw5IEBACiAgICAgaGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyKCkKICAgICBwcm9jZXNzb3IgPSBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKQogCi0gICAgc2VydmVyRmFjdG9yeSA9IFRUd2lzdGVkLlRocmlmdFNlcnZlckZhY3RvcnkocHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKKyAgICBzZXJ2ZXJGYWN0b3J5ID0gVFR3aXN0ZWQuVGhyaWZ0U2VydmVyRmFjdG9yeSgKKyAgICAgICAgcHJvY2Vzc29yLAorICAgICAgICBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKQogCiAgICAgY2FsY1NlcnZpY2UgPSBpbnRlcm5ldC5UQ1BTZXJ2ZXIoOTA5MCwgc2VydmVyRmFjdG9yeSkKIApAQCAtNDUsNCArNDksNSBAQAogCiAgICAgcmV0dXJuIGFwcGxpY2F0aW9uCiAKLWFwcGxpY2F0aW9uID0gbWFrZV9hcHBsaWNhdGlvbigpCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGFwcGxpY2F0aW9uID0gbWFrZV9hcHBsaWNhdGlvbigpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL3B5L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdkYjgxNmQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9weS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDM3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZ2VuLXB5L3R1dG9yaWFsL0NhbGN1bGF0b3IucHkgZ2VuLXB5L3NoYXJlZC9TaGFyZWRTZXJ2aWNlLnB5OiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBweSAtciAkPAorCithbGwtbG9jYWw6IGdlbi1weS90dXRvcmlhbC9DYWxjdWxhdG9yLnB5CisKK3R1dG9yaWFsc2VydmVyOiBhbGwKKwkke1BZVEhPTn0gUHl0aG9uU2VydmVyLnB5CisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwkke1BZVEhPTn0gUHl0aG9uQ2xpZW50LnB5CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi0qCisKK0VYVFJBX0RJU1QgPSBcCisJc2V0dXAuY2ZnIFwKKwlQeXRob25TZXJ2ZXIucHkgXAorCVB5dGhvbkNsaWVudC5weQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkvUHl0aG9uQ2xpZW50LnB5IGIvdHV0b3JpYWwvcHkvUHl0aG9uQ2xpZW50LnB5CmluZGV4IDkxNmU5MTUuLmE2YzE5NjYgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3B5L1B5dGhvbkNsaWVudC5weQorKysgYi90dXRvcmlhbC9weS9QeXRob25DbGllbnQucHkKQEAgLTIwLDYzICsyMCw3MCBAQAogIwogCiBpbXBvcnQgc3lzCi1zeXMucGF0aC5hcHBlbmQoJy4uL2dlbi1weScpCitpbXBvcnQgZ2xvYgorc3lzLnBhdGguYXBwZW5kKCdnZW4tcHknKQorc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYionKVswXSkKIAogZnJvbSB0dXRvcmlhbCBpbXBvcnQgQ2FsY3VsYXRvcgotZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0ICoKK2Zyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCBJbnZhbGlkT3BlcmF0aW9uLCBPcGVyYXRpb24sIFdvcmsKIAogZnJvbSB0aHJpZnQgaW1wb3J0IFRocmlmdAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0CiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKIAotdHJ5OgogCi0gICMgTWFrZSBzb2NrZXQKLSAgdHJhbnNwb3J0ID0gVFNvY2tldC5UU29ja2V0KCdsb2NhbGhvc3QnLCA5MDkwKQorZGVmIG1haW4oKToKKyAgICAjIE1ha2Ugc29ja2V0CisgICAgdHJhbnNwb3J0ID0gVFNvY2tldC5UU29ja2V0KCdsb2NhbGhvc3QnLCA5MDkwKQogCi0gICMgQnVmZmVyaW5nIGlzIGNyaXRpY2FsLiBSYXcgc29ja2V0cyBhcmUgdmVyeSBzbG93Ci0gIHRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zcG9ydCkKKyAgICAjIEJ1ZmZlcmluZyBpcyBjcml0aWNhbC4gUmF3IHNvY2tldHMgYXJlIHZlcnkgc2xvdworICAgIHRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zcG9ydCkKIAotICAjIFdyYXAgaW4gYSBwcm90b2NvbAotICBwcm90b2NvbCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICMgV3JhcCBpbiBhIHByb3RvY29sCisgICAgcHJvdG9jb2wgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkKIAotICAjIENyZWF0ZSBhIGNsaWVudCB0byB1c2UgdGhlIHByb3RvY29sIGVuY29kZXIKLSAgY2xpZW50ID0gQ2FsY3VsYXRvci5DbGllbnQocHJvdG9jb2wpCisgICAgIyBDcmVhdGUgYSBjbGllbnQgdG8gdXNlIHRoZSBwcm90b2NvbCBlbmNvZGVyCisgICAgY2xpZW50ID0gQ2FsY3VsYXRvci5DbGllbnQocHJvdG9jb2wpCiAKLSAgIyBDb25uZWN0IQotICB0cmFuc3BvcnQub3BlbigpCisgICAgIyBDb25uZWN0IQorICAgIHRyYW5zcG9ydC5vcGVuKCkKIAotICBjbGllbnQucGluZygpCi0gIHByaW50ICdwaW5nKCknCisgICAgY2xpZW50LnBpbmcoKQorICAgIHByaW50KCdwaW5nKCknKQogCi0gIHN1bSA9IGNsaWVudC5hZGQoMSwxKQotICBwcmludCAnMSsxPSVkJyAlIChzdW0pCisgICAgc3VtXyA9IGNsaWVudC5hZGQoMSwgMSkKKyAgICBwcmludCgnMSsxPSVkJyAlIHN1bV8pCiAKLSAgd29yayA9IFdvcmsoKQorICAgIHdvcmsgPSBXb3JrKCkKIAotICB3b3JrLm9wID0gT3BlcmF0aW9uLkRJVklERQotICB3b3JrLm51bTEgPSAxCi0gIHdvcmsubnVtMiA9IDAKKyAgICB3b3JrLm9wID0gT3BlcmF0aW9uLkRJVklERQorICAgIHdvcmsubnVtMSA9IDEKKyAgICB3b3JrLm51bTIgPSAwCiAKLSAgdHJ5OgotICAgIHF1b3RpZW50ID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQotICAgIHByaW50ICdXaG9hPyBZb3Uga25vdyBob3cgdG8gZGl2aWRlIGJ5IHplcm8/JwotICBleGNlcHQgSW52YWxpZE9wZXJhdGlvbiwgaW86Ci0gICAgcHJpbnQgJ0ludmFsaWRPcGVyYXRpb246ICVyJyAlIGlvCisgICAgdHJ5OgorICAgICAgICBxdW90aWVudCA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgICAgICAgcHJpbnQoJ1dob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybz8nKQorICAgICAgICBwcmludCgnRllJIHRoZSBhbnN3ZXIgaXMgJWQnICUgcXVvdGllbnQpCisgICAgZXhjZXB0IEludmFsaWRPcGVyYXRpb24gYXMgZToKKyAgICAgICAgcHJpbnQoJ0ludmFsaWRPcGVyYXRpb246ICVyJyAlIGUpCiAKLSAgd29yay5vcCA9IE9wZXJhdGlvbi5TVUJUUkFDVAotICB3b3JrLm51bTEgPSAxNQotICB3b3JrLm51bTIgPSAxMAorICAgIHdvcmsub3AgPSBPcGVyYXRpb24uU1VCVFJBQ1QKKyAgICB3b3JrLm51bTEgPSAxNQorICAgIHdvcmsubnVtMiA9IDEwCiAKLSAgZGlmZiA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKLSAgcHJpbnQgJzE1LTEwPSVkJyAlIChkaWZmKQorICAgIGRpZmYgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspCisgICAgcHJpbnQoJzE1LTEwPSVkJyAlIGRpZmYpCiAKLSAgbG9nID0gY2xpZW50LmdldFN0cnVjdCgxKQotICBwcmludCAnQ2hlY2sgbG9nOiAlcycgJSAobG9nLnZhbHVlKQorICAgIGxvZyA9IGNsaWVudC5nZXRTdHJ1Y3QoMSkKKyAgICBwcmludCgnQ2hlY2sgbG9nOiAlcycgJSBsb2cudmFsdWUpCiAKLSAgIyBDbG9zZSEKLSAgdHJhbnNwb3J0LmNsb3NlKCkKKyAgICAjIENsb3NlIQorICAgIHRyYW5zcG9ydC5jbG9zZSgpCiAKLWV4Y2VwdCBUaHJpZnQuVEV4Y2VwdGlvbiwgdHg6Ci0gIHByaW50ICclcycgJSAodHgubWVzc2FnZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0cnk6CisgICAgICAgIG1haW4oKQorICAgIGV4Y2VwdCBUaHJpZnQuVEV4Y2VwdGlvbiBhcyB0eDoKKyAgICAgICAgcHJpbnQoJyVzJyAlIHR4Lm1lc3NhZ2UpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS9QeXRob25TZXJ2ZXIucHkgYi90dXRvcmlhbC9weS9QeXRob25TZXJ2ZXIucHkKaW5kZXggNjNmOTkzYi4uZTY0MjFlZiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcHkvUHl0aG9uU2VydmVyLnB5CisrKyBiL3R1dG9yaWFsL3B5L1B5dGhvblNlcnZlci5weQpAQCAtMTksMTEgKzE5LDEzIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCitpbXBvcnQgZ2xvYgogaW1wb3J0IHN5cwotc3lzLnBhdGguYXBwZW5kKCcuLi9nZW4tcHknKQorc3lzLnBhdGguYXBwZW5kKCdnZW4tcHknKQorc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYionKVswXSkKIAogZnJvbSB0dXRvcmlhbCBpbXBvcnQgQ2FsY3VsYXRvcgotZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0ICoKK2Zyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCBJbnZhbGlkT3BlcmF0aW9uLCBPcGVyYXRpb24KIAogZnJvbSBzaGFyZWQudHR5cGVzIGltcG9ydCBTaGFyZWRTdHJ1Y3QKIApAQCAtMzIsNjUgKzM0LDcwIEBACiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCiBmcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIKIAorCiBjbGFzcyBDYWxjdWxhdG9ySGFuZGxlcjoKLSAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgIHNlbGYubG9nID0ge30KKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYubG9nID0ge30KIAotICBkZWYgcGluZyhzZWxmKToKLSAgICBwcmludCAncGluZygpJworICAgIGRlZiBwaW5nKHNlbGYpOgorICAgICAgICBwcmludCgncGluZygpJykKIAotICBkZWYgYWRkKHNlbGYsIG4xLCBuMik6Ci0gICAgcHJpbnQgJ2FkZCglZCwlZCknICUgKG4xLCBuMikKLSAgICByZXR1cm4gbjErbjIKKyAgICBkZWYgYWRkKHNlbGYsIG4xLCBuMik6CisgICAgICAgIHByaW50KCdhZGQoJWQsJWQpJyAlIChuMSwgbjIpKQorICAgICAgICByZXR1cm4gbjEgKyBuMgogCi0gIGRlZiBjYWxjdWxhdGUoc2VsZiwgbG9naWQsIHdvcmspOgotICAgIHByaW50ICdjYWxjdWxhdGUoJWQsICVyKScgJSAobG9naWQsIHdvcmspCisgICAgZGVmIGNhbGN1bGF0ZShzZWxmLCBsb2dpZCwgd29yayk6CisgICAgICAgIHByaW50KCdjYWxjdWxhdGUoJWQsICVyKScgJSAobG9naWQsIHdvcmspKQogCi0gICAgaWYgd29yay5vcCA9PSBPcGVyYXRpb24uQUREOgotICAgICAgdmFsID0gd29yay5udW0xICsgd29yay5udW0yCi0gICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5TVUJUUkFDVDoKLSAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMgotICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uTVVMVElQTFk6Ci0gICAgICB2YWwgPSB3b3JrLm51bTEgKiB3b3JrLm51bTIKLSAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLkRJVklERToKLSAgICAgIGlmIHdvcmsubnVtMiA9PSAwOgotICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCi0gICAgICAgIHgud2hhdCA9IHdvcmsub3AKLSAgICAgICAgeC53aHkgPSAnQ2Fubm90IGRpdmlkZSBieSAwJwotICAgICAgICByYWlzZSB4Ci0gICAgICB2YWwgPSB3b3JrLm51bTEgLyB3b3JrLm51bTIKLSAgICBlbHNlOgotICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQotICAgICAgeC53aGF0ID0gd29yay5vcAotICAgICAgeC53aHkgPSAnSW52YWxpZCBvcGVyYXRpb24nCi0gICAgICByYWlzZSB4CisgICAgICAgIGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLkFERDoKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMgorICAgICAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLlNVQlRSQUNUOgorICAgICAgICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yCisgICAgICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uTVVMVElQTFk6CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgKiB3b3JrLm51bTIKKyAgICAgICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5ESVZJREU6CisgICAgICAgICAgICBpZiB3b3JrLm51bTIgPT0gMDoKKyAgICAgICAgICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCisgICAgICAgICAgICAgICAgeC53aGF0T3AgPSB3b3JrLm9wCisgICAgICAgICAgICAgICAgeC53aHkgPSAnQ2Fubm90IGRpdmlkZSBieSAwJworICAgICAgICAgICAgICAgIHJhaXNlIHgKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAvIHdvcmsubnVtMgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQorICAgICAgICAgICAgeC53aGF0T3AgPSB3b3JrLm9wCisgICAgICAgICAgICB4LndoeSA9ICdJbnZhbGlkIG9wZXJhdGlvbicKKyAgICAgICAgICAgIHJhaXNlIHgKIAotICAgIGxvZyA9IFNoYXJlZFN0cnVjdCgpCi0gICAgbG9nLmtleSA9IGxvZ2lkCi0gICAgbG9nLnZhbHVlID0gJyVkJyAlICh2YWwpCi0gICAgc2VsZi5sb2dbbG9naWRdID0gbG9nCisgICAgICAgIGxvZyA9IFNoYXJlZFN0cnVjdCgpCisgICAgICAgIGxvZy5rZXkgPSBsb2dpZAorICAgICAgICBsb2cudmFsdWUgPSAnJWQnICUgKHZhbCkKKyAgICAgICAgc2VsZi5sb2dbbG9naWRdID0gbG9nCiAKLSAgICByZXR1cm4gdmFsCisgICAgICAgIHJldHVybiB2YWwKIAotICBkZWYgZ2V0U3RydWN0KHNlbGYsIGtleSk6Ci0gICAgcHJpbnQgJ2dldFN0cnVjdCglZCknICUgKGtleSkKLSAgICByZXR1cm4gc2VsZi5sb2dba2V5XQorICAgIGRlZiBnZXRTdHJ1Y3Qoc2VsZiwga2V5KToKKyAgICAgICAgcHJpbnQoJ2dldFN0cnVjdCglZCknICUgKGtleSkpCisgICAgICAgIHJldHVybiBzZWxmLmxvZ1trZXldCiAKLSAgZGVmIHppcChzZWxmKToKLSAgICBwcmludCAnemlwKCknCisgICAgZGVmIHppcChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3ppcCgpJykKIAotaGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyKCkKLXByb2Nlc3NvciA9IENhbGN1bGF0b3IuUHJvY2Vzc29yKGhhbmRsZXIpCi10cmFuc3BvcnQgPSBUU29ja2V0LlRTZXJ2ZXJTb2NrZXQoOTA5MCkKLXRmYWN0b3J5ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkKLXBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQogCi1zZXJ2ZXIgPSBUU2VydmVyLlRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyKCkKKyAgICBwcm9jZXNzb3IgPSBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKQorICAgIHRyYW5zcG9ydCA9IFRTb2NrZXQuVFNlcnZlclNvY2tldChob3N0PScxMjcuMC4wLjEnLCBwb3J0PTkwOTApCisgICAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQorICAgIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQogCi0jIFlvdSBjb3VsZCBkbyBvbmUgb2YgdGhlc2UgZm9yIGEgbXVsdGl0aHJlYWRlZCBzZXJ2ZXIKLSNzZXJ2ZXIgPSBUU2VydmVyLlRUaHJlYWRlZFNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQotI3NlcnZlciA9IFRTZXJ2ZXIuVFRocmVhZFBvb2xTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKyAgICBzZXJ2ZXIgPSBUU2VydmVyLlRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKIAotcHJpbnQgJ1N0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4nCi1zZXJ2ZXIuc2VydmUoKQotcHJpbnQgJ2RvbmUuJworICAgICMgWW91IGNvdWxkIGRvIG9uZSBvZiB0aGVzZSBmb3IgYSBtdWx0aXRocmVhZGVkIHNlcnZlcgorICAgICMgc2VydmVyID0gVFNlcnZlci5UVGhyZWFkZWRTZXJ2ZXIoCisgICAgIyAgICAgcHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKyAgICAjIHNlcnZlciA9IFRTZXJ2ZXIuVFRocmVhZFBvb2xTZXJ2ZXIoCisgICAgIyAgICAgcHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKworICAgIHByaW50KCdTdGFydGluZyB0aGUgc2VydmVyLi4uJykKKyAgICBzZXJ2ZXIuc2VydmUoKQorICAgIHByaW50KCdkb25lLicpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS9zZXR1cC5jZmcgYi90dXRvcmlhbC9weS9zZXR1cC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE3MTIwYQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3B5L3NldHVwLmNmZwpAQCAtMCwwICsxLDIgQEAKK1tmbGFrZThdCitpZ25vcmUgPSBFNDAyCmRpZmYgLS1naXQgYS90dXRvcmlhbC9yYi9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL3JiL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkzNzI0MTMKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9yYi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDM2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZ2VuLXB5L2NhbGN1bGF0b3IucmIgZ2VuLXB5L3NoYXJlZF9zZXJ2aWNlLnJiOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiByYiAtciAkPAorCithbGwtbG9jYWw6IGdlbi1weS9jYWxjdWxhdG9yLnJiCisKK3R1dG9yaWFsc2VydmVyOiBhbGwKKwkke1JVQll9IFJ1YnlTZXJ2ZXIucmIKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCSR7UlVCWX0gUnVieUNsaWVudC5yYgorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tKgorCitFWFRSQV9ESVNUID0gXAorCVJ1YnlTZXJ2ZXIucmIgXAorCVJ1YnlDbGllbnQucmIKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3JiL1J1YnlDbGllbnQucmIgYi90dXRvcmlhbC9yYi9SdWJ5Q2xpZW50LnJiCmluZGV4IGZkNzI2OTkuLjlhNWFhNDMgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3JiL1J1YnlDbGllbnQucmIKKysrIGIvdHV0b3JpYWwvcmIvUnVieUNsaWVudC5yYgpAQCAtMTksNyArMTksNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotJDoucHVzaCgnLi4vZ2VuLXJiJykKKyQ6LnB1c2goJ2dlbi1yYicpCiAkOi51bnNoaWZ0ICcuLi8uLi9saWIvcmIvbGliJwogCiByZXF1aXJlICd0aHJpZnQnCmRpZmYgLS1naXQgYS90dXRvcmlhbC9yYi9SdWJ5U2VydmVyLnJiIGIvdHV0b3JpYWwvcmIvUnVieVNlcnZlci5yYgppbmRleCAzMGFhN2YyLi4xZDcwN2Q3IDEwMDc1NQotLS0gYS90dXRvcmlhbC9yYi9SdWJ5U2VydmVyLnJiCisrKyBiL3R1dG9yaWFsL3JiL1J1YnlTZXJ2ZXIucmIKQEAgLTE5LDcgKzE5LDcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLSQ6LnB1c2goJy4uL2dlbi1yYicpCiskOi5wdXNoKCdnZW4tcmInKQogJDoudW5zaGlmdCAnLi4vLi4vbGliL3JiL2xpYicKIAogcmVxdWlyZSAndGhyaWZ0JwpAQCAtNTIsMTQgKzUyLDE0IEBACiAgICAgZWxzaWYgd29yay5vcCA9PSBPcGVyYXRpb246OkRJVklERQogICAgICAgaWYgd29yay5udW0yID09IDAKICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24ubmV3KCkKLSAgICAgICAgeC53aGF0ID0gd29yay5vcAorICAgICAgICB4LndoYXRPcCA9IHdvcmsub3AKICAgICAgICAgeC53aHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIgogICAgICAgICByYWlzZSB4CiAgICAgICBlbmQKICAgICAgIHZhbCA9IHdvcmsubnVtMSAvIHdvcmsubnVtMgogICAgIGVsc2UKICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uLm5ldygpCi0gICAgICB4LndoYXQgPSB3b3JrLm9wCisgICAgICB4LndoYXRPcCA9IHdvcmsub3AKICAgICAgIHgud2h5ID0gIkludmFsaWQgb3BlcmF0aW9uIgogICAgICAgcmFpc2UgeAogICAgIGVuZApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcnMvQ2FyZ28udG9tbCBiL3R1dG9yaWFsL3JzL0NhcmdvLnRvbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEwYTBkYQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3JzL0NhcmdvLnRvbWwKQEAgLTAsMCArMSwxNiBAQAorW3BhY2thZ2VdCituYW1lID0gInRocmlmdC10dXRvcmlhbCIKK3ZlcnNpb24gPSAiMC4xLjAiCitsaWNlbnNlID0gIkFwYWNoZS0yLjAiCithdXRob3JzID0gWyJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iXQorZXhjbHVkZSA9IFsiTWFrZWZpbGUqIiwgInNoYXJlZC5ycyIsICJ0dXRvcmlhbC5ycyJdCitwdWJsaXNoID0gZmFsc2UKKworW2RlcGVuZGVuY2llc10KK2NsYXAgPSAiPDIuMjguMCIKK29yZGVyZWQtZmxvYXQgPSAiMC4zLjAiCit0cnlfZnJvbSA9ICIwLjIuMCIKKworW2RlcGVuZGVuY2llcy50aHJpZnRdCitwYXRoID0gIi4uLy4uL2xpYi9ycyIKKwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcnMvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9ycy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjYzMzFlCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcnMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw1MiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisKK2dlbi1ycy90dXRvcmlhbC5ycyBnZW4tcnMvc2hhcmVkLnJzOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtb3V0IHNyYyAtLWdlbiBycyAtciAkPAorCithbGwtbG9jYWw6IGdlbi1ycy90dXRvcmlhbC5ycworCSQoQ0FSR08pIGJ1aWxkCisJWyAtZCBiaW4gXSB8fCBta2RpciBiaW4KKwljcCB0YXJnZXQvZGVidWcvdHV0b3JpYWxfc2VydmVyIGJpbi90dXRvcmlhbF9zZXJ2ZXIKKwljcCB0YXJnZXQvZGVidWcvdHV0b3JpYWxfY2xpZW50IGJpbi90dXRvcmlhbF9jbGllbnQKKworY2hlY2s6IGFsbAorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJYmluL3R1dG9yaWFsX3NlcnZlcgkKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCWJpbi90dXRvcmlhbF9jbGllbnQKKworY2xlYW4tbG9jYWw6CisJJChDQVJHTykgY2xlYW4KKwktJChSTSkgQ2FyZ28ubG9jaworCS0kKFJNKSBzcmMvc2hhcmVkLnJzCisJLSQoUk0pIHNyYy90dXRvcmlhbC5ycworCS0kKFJNKSAtciBiaW4KKworRVhUUkFfRElTVCA9IFwKKwlDYXJnby50b21sIFwKKwlzcmMvbGliLnJzIFwKKwlzcmMvYmluL3R1dG9yaWFsX3NlcnZlci5ycyBcCisJc3JjL2Jpbi90dXRvcmlhbF9jbGllbnQucnMgXAorCVJFQURNRS5tZAorCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ycy9SRUFETUUubWQgYi90dXRvcmlhbC9ycy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0ZTlmOAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3JzL1JFQURNRS5tZApAQCAtMCwwICsxLDMxNyBAQAorIyBSdXN0IExhbmd1YWdlIEJpbmRpbmdzIGZvciBUaHJpZnQKKworIyMgR2V0dGluZyBTdGFydGVkCisKKzEuIEdldCB0aGUgW1RocmlmdCBjb21waWxlcl0oaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZykuCisKKzIuIEFkZCB0aGUgZm9sbG93aW5nIGNyYXRlcyB0byB5b3VyIGBDYXJnby50b21sYC4KKworYGBgdG9tbAordGhyaWZ0ID0gIngueS56IiAjIHgueS56IGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSB0aHJpZnQgY29tcGlsZXIKK29yZGVyZWRfZmxvYXQgPSAiMC4zLjAiCit0cnlfZnJvbSA9ICIwLjIuMCIKK2BgYAorCiszLiBBZGQgdGhlIHNhbWUgY3JhdGVzIHRvIHlvdXIgYGxpYi5yc2Agb3IgYG1haW4ucnNgLgorCitgYGBydXN0CitleHRlcm4gY3JhdGUgb3JkZXJlZF9mbG9hdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CitleHRlcm4gY3JhdGUgdHJ5X2Zyb207CitgYGAKKworNC4gR2VuZXJhdGUgUnVzdCBzb3VyY2VzIGZvciB5b3VyIElETCAoZm9yIGV4YW1wbGUsIGBUdXRvcmlhbC50aHJpZnRgKS4KKworYGBgc2hlbGwKK3RocmlmdCAtb3V0IG15X3J1c3RfcHJvZ3JhbS9zcmMgLS1nZW4gcnMgLXIgVHV0b3JpYWwudGhyaWZ0CitgYGAKKworNS4gVXNlIHRoZSBnZW5lcmF0ZWQgc291cmNlIGluIHlvdXIgY29kZS4KKworYGBgcnVzdAorLy8gYWRkIGV4dGVybiBjcmF0ZXMgaGVyZSwgb3IgaW4geW91ciBsaWIucnMKK2V4dGVybiBjcmF0ZSBvcmRlcmVkX2Zsb2F0OworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0cnlfZnJvbTsKKworLy8gZ2VuZXJhdGVkIFJ1c3QgbW9kdWxlCit1c2UgdHV0b3JpYWw7CisKK3VzZSB0aHJpZnQ6OnByb3RvY29sOjp7VENvbXBhY3RJbnB1dFByb3RvY29sLCBUQ29tcGFjdE91dHB1dFByb3RvY29sfTsKK3VzZSB0aHJpZnQ6OnByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbH07Cit1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntURnJhbWVkUmVhZFRyYW5zcG9ydCwgVEZyYW1lZFdyaXRlVHJhbnNwb3J0fTsKK3VzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1RJb0NoYW5uZWwsIFRUY3BDaGFubmVsfTsKK3VzZSB0dXRvcmlhbDo6e0NhbGN1bGF0b3JTeW5jQ2xpZW50LCBUQ2FsY3VsYXRvclN5bmNDbGllbnR9OwordXNlIHR1dG9yaWFsOjp7T3BlcmF0aW9uLCBXb3JrfTsKKworZm4gbWFpbigpIHsKKyAgICBtYXRjaCBydW4oKSB7CisgICAgICAgIE9rKCgpKSA9PiBwcmludGxuISgiY2xpZW50IHJhbiBzdWNjZXNzZnVsbHkiKSwKKyAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgIHByaW50bG4hKCJjbGllbnQgZmFpbGVkIHdpdGggezo/fSIsIGUpOworICAgICAgICAgICAgc3RkOjpwcm9jZXNzOjpleGl0KDEpOworICAgICAgICB9CisgICAgfQorfQorCitmbiBydW4oKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIC8vCisgICAgLy8gYnVpbGQgY2xpZW50CisgICAgLy8KKworICAgIHByaW50bG4hKCJjb25uZWN0IHRvIHNlcnZlciBvbiAxMjcuMC4wLjE6OTA5MCIpOworICAgIGxldCBtdXQgYyA9IFRUY3BUcmFuc3BvcnQ6Om5ldygpOworICAgIGMub3BlbigiMTI3LjAuMC4xOjkwOTAiKT87CisKKyAgICBsZXQgKGlfY2hhbiwgb19jaGFuKSA9IGMuc3BsaXQoKT87CisgICAgCisgICAgbGV0IGlfcHJvdCA9IFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KAorICAgICAgICBURnJhbWVkUmVhZFRyYW5zcG9ydDo6bmV3KGlfY2hhbikKKyAgICApOworICAgIGxldCBvX3Byb3QgPSBUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcoCisgICAgICAgIFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6bmV3KG9fY2hhbikKKyAgICApOworCisgICAgbGV0IGNsaWVudCA9IENhbGN1bGF0b3JTeW5jQ2xpZW50OjpuZXcoaV9wcm90LCBvX3Byb3QpOworCisgICAgLy8KKyAgICAvLyBhbHJpZ2h0ISAtIGxldCdzIG1ha2Ugc29tZSBjYWxscworICAgIC8vCisKKyAgICAvLyB0d28td2F5LCB2b2lkIHJldHVybgorICAgIGNsaWVudC5waW5nKCk/OworCisgICAgLy8gdHdvLXdheSB3aXRoIHNvbWUgcmV0dXJuCisgICAgbGV0IHJlcyA9IGNsaWVudC5jYWxjdWxhdGUoCisgICAgICAgIDcyLAorICAgICAgICBXb3JrOjpuZXcoNywgOCwgT3BlcmF0aW9uOjpNVUxUSVBMWSwgTm9uZSkKKyAgICApPzsKKyAgICBwcmludGxuISgibXVsdGlwbGllZCA3IGFuZCA4LCBnb3Qge30iLCByZXMpOworCisgICAgLy8gdHdvLXdheSBhbmQgcmV0dXJucyBhIFRocmlmdC1kZWZpbmVkIGV4Y2VwdGlvbgorICAgIGxldCByZXMgPSBjbGllbnQuY2FsY3VsYXRlKAorICAgICAgICA3NywKKyAgICAgICAgV29yazo6bmV3KDIsIDAsIE9wZXJhdGlvbjo6RElWSURFLCBOb25lKQorICAgICk7CisgICAgbWF0Y2ggcmVzIHsKKyAgICAgICAgT2sodikgPT4gcGFuaWMhKCJzaG91bGRuJ3QgaGF2ZSBzdWNjZWVkZWQgd2l0aCByZXN1bHQge30iLCB2KSwKKyAgICAgICAgRXJyKGUpID0+IHByaW50bG4hKCJkaXZpZGUgYnkgemVybyBmYWlsZWQgd2l0aCB7Oj99IiwgZSksCisgICAgfQorCisgICAgLy8gb25lLXdheQorICAgIGNsaWVudC56aXAoKT87CisKKyAgICAvLyBkb25lIQorICAgIE9rKCgpKQorfQorYGBgCisKKyMjIENvZGUgR2VuZXJhdGlvbgorCisjIyMgVGhyaWZ0IEZpbGVzIGFuZCBHZW5lcmF0ZWQgTW9kdWxlcworCitUaGUgVGhyaWZ0IGNvZGUgZ2VuZXJhdG9yIHRha2VzIGVhY2ggVGhyaWZ0IGZpbGUgYW5kIGdlbmVyYXRlcyBhIFJ1c3QgbW9kdWxlCit3aXRoIHRoZSBzYW1lIG5hbWUgc25ha2UtY2FzZWQuIEZvciBleGFtcGxlLCBydW5uaW5nIHRoZSBjb21waWxlciBvbgorYFRocmlmdFRlc3QudGhyaWZ0YCBjcmVhdGVzIGB0aHJpZnRfdGVzdC5yc2AuIFRvIHVzZSB0aGVzZSBnZW5lcmF0ZWQgZmlsZXMgYWRkCitgbW9kIC4uLmAgYW5kIGB1c2UgLi4uYCBkZWNsYXJhdGlvbnMgdG8geW91ciBgbGliLnJzYCBvciBgbWFpbi5yc2AgLSBvbmUgZm9yCitlYWNoIGdlbmVyYXRlZCBmaWxlLgorCisjIyMgUmVzdWx0cyBhbmQgRXJyb3JzCisKK1RoZSBUaHJpZnQgcnVudGltZSBsaWJyYXJ5IGRlZmluZXMgYSBgdGhyaWZ0OjpSZXN1bHRgIGFuZCBhIGB0aHJpZnQ6OkVycm9yYCB0eXBlLAorYm90aCBvZiB3aGljaCBhcmUgdXNlZCB0aHJvdWdodCB0aGUgcnVudGltZSBsaWJyYXJ5IGFuZCBpbiBhbGwgZ2VuZXJhdGVkIGNvZGUuCitDb252ZXJzaW9ucyBhcmUgZGVmaW5lZCBmcm9tIGBzdGQ6OmlvOjpFcnJvcmAsIGBzdHJgIGFuZCBgU3RyaW5nYCBpbnRvCitgdGhyaWZ0OjpFcnJvcmAuCisKKyMjIyBUaHJpZnQgVHlwZSBhbmQgdGhlaXIgUnVzdCBFcXVpdmFsZW50cworCitUaHJpZnQgZGVmaW5lcyBhIG51bWJlciBvZiB0eXBlcywgZWFjaCBvZiB3aGljaCBpcyB0cmFuc2xhdGVkIGludG8gaXRzIFJ1c3QKK2VxdWl2YWxlbnQgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yLgorCisqIFByaW1pdGl2ZXMgKGJvb2wsIGk4LCBpMTYsIGkzMiwgaTY0LCBkb3VibGUsIHN0cmluZywgYmluYXJ5KQorKiBUeXBlZGVmcworKiBFbnVtcworKiBDb250YWluZXJzCisqIFN0cnVjdHMKKyogVW5pb25zCisqIEV4Y2VwdGlvbnMKKyogU2VydmljZXMKKyogQ29uc3RhbnRzIChwcmltaXRpdmVzLCBjb250YWluZXJzLCBzdHJ1Y3RzKQorCitJbiBhZGRpdGlvbiwgdW5sZXNzIG90aGVyd2lzZSBub3RlZCwgdGhyaWZ0IGluY2x1ZGVzIGFyZSB0cmFuc2xhdGVkIGludG8KK2B1c2UgLi4uYCBzdGF0ZW1lbnRzIGluIHRoZSBnZW5lcmF0ZWQgY29kZSwgYW5kIGFsbCBkZWNsYXJhdGlvbnMsIHBhcmFtZXRlcnMsCit0cmFpdHMgYW5kIHR5cGVzIGluIHRoZSBnZW5lcmF0ZWQgY29kZSBhcmUgbmFtZXNwYWNlZCBhcHByb3ByaWF0ZWx5LgorCitUaGUgZm9sbG93aW5nIHN1YnNlY3Rpb25zIGNvdmVyIGVhY2ggdHlwZSBhbmQgdGhlaXIgZ2VuZXJhdGVkIFJ1c3QgZXF1aXZhbGVudC4KKworIyMjIFByaW1pdGl2ZXMKKworVGhyaWZ0IHByaW1pdGl2ZXMgaGF2ZSBzdHJhaWdodGZvcndhcmQgUnVzdCBlcXVpdmFsZW50cy4KKworKiBib29sOiBgYm9vbGAKKyogaTg6IGBpOGAKKyogaTE2OiBgaTE2YAorKiBpMzI6IGBpMzJgCisqIGk2NDogYGk2NGAKKyogZG91YmxlOiBgT3JkZXJlZEZsb2F0PGY2ND5gCisqIHN0cmluZzogYFN0cmluZ2AKKyogYmluYXJ5OiBgVmVjPHU4PmAKKworIyMjIFR5cGVkZWZzCisKK0EgdHlwZWRlZiBpcyB0cmFuc2xhdGVkIHRvIGEgYHB1YiB0eXBlYCBkZWNsYXJhdGlvbi4KKworYGBgdGhyaWZ0Cit0eXBlZGVmIGk2NCBVc2VySWQKKwordHlwZWRlZiBtYXA8c3RyaW5nLCBVc2VySWQ+IE1hcFR5cGUKK2BgYAorYGBgcnVzdAorcHViIHR5cGUgVXNlcklkID0gaTY0OworCitwdWIgdHlwZSBNYXBUeXBlID0gQlRyZWVNYXA8U3RyaW5nLCBCb25rPjsKK2BgYAorCisjIyMgRW51bXMKKworQSBUaHJpZnQgZW51bSBpcyByZXByZXNlbnRlZCBhcyBhIFJ1c3QgZW51bSwgYW5kIGVhY2ggdmFyaWFudCBpcyB0cmFuc2NyaWJlZCAxOjEuCisKK2BgYHRocmlmdAorZW51bSBOdW1iZXJ6Cit7CisgICAgT05FID0gMSwKKyAgICBUV08sCisgICAgVEhSRUUsCisgICAgRklWRSA9IDUsCisgICAgU0lYLAorICAgIEVJR0hUID0gOAorfQorYGBgCisKK2BgYHJ1c3QKKyNbZGVyaXZlKENvcHksIENsb25lLCBEZWJ1ZywgRXEsIE9yZCwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0KK3B1YiBlbnVtIE51bWJlcnogeworICAgIE9ORSA9IDEsCisgICAgVFdPID0gMiwKKyAgICBUSFJFRSA9IDMsCisgICAgRklWRSA9IDUsCisgICAgU0lYID0gNiwKKyAgICBFSUdIVCA9IDgsCit9CisKK2ltcGwgVHJ5RnJvbTxpMzI+IGZvciBOdW1iZXJ6IHsKKyAgICAvLyAuLi4KK30KKworYGBgCisKKyMjIyBDb250YWluZXJzCisKK1RocmlmdCBoYXMgdGhyZWUgY29udGFpbmVyIHR5cGVzOiBsaXN0LCBzZXQgYW5kIG1hcC4gVGhleSBhcmUgdHJhbnNsYXRlZCBpbnRvCitSdXN0IGBWZWNgLCBgQlRyZWVTZXRgIGFuZCBgQlRyZWVNYXBgIHJlc3BlY3RpdmVseS4gQW55IFRocmlmdCB0eXBlICh0aGlzCitpbmNsdWRlcyBzdHJ1Y3RzLCBlbnVtcyBhbmQgdHlwZWRlZnMpIGNhbiBiZSBhIGxpc3Qvc2V0IGVsZW1lbnQgb3IgYSBtYXAKK2tleS92YWx1ZS4KKworIyMjIyBMaXN0CisKK2BgYHRocmlmdAorbGlzdCA8aTMyPiBudW1iZXJzCitgYGAKKworYGBgcnVzdAorbnVtYmVyczogVmVjPGkzMj4KK2BgYAorCisjIyMjIFNldAorCitgYGB0aHJpZnQKK3NldCA8aTMyPiBudW1iZXJzCitgYGAKKworYGBgcnVzdAorbnVtYmVyczogQlRyZWVTZXQ8aTMyPgorYGBgCisKKyMjIyMgTWFwCisKK2BgYHRocmlmdAorbWFwIDxzdHJpbmcsIGkzMj4gbnVtYmVycworYGBgCisKK2BgYHJ1c3QKK251bWJlcnM6IEJUcmVlTWFwPFN0cmluZywgaTMyPgorYGBgCisKKyMjIyBTdHJ1Y3RzCisKK0EgVGhyaWZ0IHN0cnVjdCBpcyByZXByZXNlbnRlZCBhcyBhIFJ1c3Qgc3RydWN0LCBhbmQgZWFjaCBmaWVsZCB0cmFuc2NyaWJlZCAxOjEuCisKK2BgYHRocmlmdAorc3RydWN0IENyYXp5TmVzdGluZyB7CisgICAgMTogc3RyaW5nIHN0cmluZ19maWVsZCwKKyAgICAyOiBvcHRpb25hbCBzZXQ8SW5zYW5pdHk+IHNldF9maWVsZCwKKyAgICAzOiByZXF1aXJlZCBsaXN0PAorICAgICAgICAgbWFwPHNldDxpMzI+LCBtYXA8aTMyLHNldDxsaXN0PG1hcDxJbnNhbml0eSxzdHJpbmc+Pj4+PgorICAgICAgID4KKyAgICA0OiBiaW5hcnkgYmluYXJ5X2ZpZWxkCit9CitgYGAKK2BgYHJ1c3QKKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIE9yZCwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0KK3B1YiBzdHJ1Y3QgQ3JhenlOZXN0aW5nIHsKKyAgICBwdWIgc3RyaW5nX2ZpZWxkOiBPcHRpb248U3RyaW5nPiwKKyAgICBwdWIgc2V0X2ZpZWxkOiBPcHRpb248QlRyZWVTZXQ8SW5zYW5pdHk+PiwKKyAgICBwdWIgbGlzdF9maWVsZDogVmVjPAorICAgICAgICBCVHJlZU1hcDwKKyAgICAgICAgICAgIEJUcmVlU2V0PGkzMj4sCisgICAgICAgICAgICBCVHJlZU1hcDxpMzIsIEJUcmVlU2V0PFZlYzxCVHJlZU1hcDxJbnNhbml0eSwgU3RyaW5nPj4+PgorICAgICAgICA+CisgICAgPiwKKyAgICBwdWIgYmluYXJ5X2ZpZWxkOiBPcHRpb248VmVjPHU4Pj4sCit9CisKK2ltcGwgQ3JhenlOZXN0aW5nIHsKKyAgICBwdWIgZm4gcmVhZF9mcm9tX2luX3Byb3RvY29sKGlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCkKKyAgICAtPgorICAgIHRocmlmdDo6UmVzdWx0PENyYXp5TmVzdGluZz4geworICAgICAgICAvLyAuLi4KKyAgICB9CisgICAgcHViIGZuIHdyaXRlX3RvX291dF9wcm90b2NvbCgmc2VsZiwgb19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCkKKyAgICAtPgorICAgIHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgICAgIC8vIC4uLgorICAgIH0KK30KKworYGBgCisjIyMjIyBPcHRpb25hbGl0eQorCitUaHJpZnQgaGFzIDMgIm9wdGlvbmFsaXR5IiB0eXBlczoKKworMS4gUmVxdWlyZWQKKzIuIE9wdGlvbmFsCiszLiBEZWZhdWx0CisKK1RoZSBSdXN0IGNvZGUgZ2VuZXJhdG9yIGVuY29kZXMgKlJlcXVpcmVkKiBmaWVsZHMgYXMgdGhlIGJhcmUgdHlwZSBpdHNlbGYsIHdoaWxlCisqT3B0aW9uYWwqIGFuZCAqRGVmYXVsdCogZmllbGRzIGFyZSBlbmNvZGVkIGFzIGBPcHRpb248VHlwZU5hbWU+YC4KKworYGBgdGhyaWZ0CitzdHJ1Y3QgRm9vIHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcgYmFyICAvLyAxLiByZXF1aXJlZAorICAgIDI6IG9wdGlvbmFsIHN0cmluZyBiYXogIC8vIDIuIG9wdGlvbmFsCisgICAgMzogc3RyaW5nIHF1eCAgICAgICAgICAgLy8gMy4gZGVmYXVsdAorfQorYGBgCisKK2BgYHJ1c3QKK3B1YiBzdHJ1Y3QgRm9vIHsKKyAgICBiYXI6IFN0cmluZywgICAgICAgICAgICAvLyAxLiByZXF1aXJlZAorICAgIGJhejogT3B0aW9uPFN0cmluZz4sICAgIC8vIDIuIG9wdGlvbmFsCisgICAgcXV4OiBPcHRpb248U3RyaW5nPiwgICAgLy8gMy4gZGVmYXVsdAorfQorYGBgCisKKyMjIEtub3duIElzc3VlcworCisqIFN0cnVjdCBjb25zdGFudHMgYXJlIG5vdCBzdXBwb3J0ZWQKKyogTWFwLCBsaXN0IGFuZCBzZXQgY29uc3RhbnRzIHJlcXVpcmUgYSBjb25zdCBob2xkZXIgc3RydWN0CmRpZmYgLS1naXQgYS90dXRvcmlhbC9ycy9zcmMvYmluL3R1dG9yaWFsX2NsaWVudC5ycyBiL3R1dG9yaWFsL3JzL3NyYy9iaW4vdHV0b3JpYWxfY2xpZW50LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MGZhZmMKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9ycy9zcmMvYmluL3R1dG9yaWFsX2NsaWVudC5ycwpAQCAtMCwwICsxLDEzMCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjW21hY3JvX3VzZV0KK2V4dGVybiBjcmF0ZSBjbGFwOworCitleHRlcm4gY3JhdGUgdGhyaWZ0OworZXh0ZXJuIGNyYXRlIHRocmlmdF90dXRvcmlhbDsKKwordXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQ29tcGFjdElucHV0UHJvdG9jb2wsIFRDb21wYWN0T3V0cHV0UHJvdG9jb2x9OwordXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7CisgICAgUmVhZEhhbGYsIFRGcmFtZWRSZWFkVHJhbnNwb3J0LCBURnJhbWVkV3JpdGVUcmFuc3BvcnQsIFRJb0NoYW5uZWwsIFRUY3BDaGFubmVsLCBXcml0ZUhhbGYsCit9OworCit1c2UgdGhyaWZ0X3R1dG9yaWFsOjpzaGFyZWQ6OlRTaGFyZWRTZXJ2aWNlU3luY0NsaWVudDsKK3VzZSB0aHJpZnRfdHV0b3JpYWw6OnR1dG9yaWFsOjp7Q2FsY3VsYXRvclN5bmNDbGllbnQsIE9wZXJhdGlvbiwgVENhbGN1bGF0b3JTeW5jQ2xpZW50LCBXb3JrfTsKKworZm4gbWFpbigpIHsKKyAgICBtYXRjaCBydW4oKSB7CisgICAgICAgIE9rKCgpKSA9PiBwcmludGxuISgidHV0b3JpYWwgY2xpZW50IHJhbiBzdWNjZXNzZnVsbHkiKSwKKyAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgIHByaW50bG4hKCJ0dXRvcmlhbCBjbGllbnQgZmFpbGVkIHdpdGggZXJyb3Igezo/fSIsIGUpOworICAgICAgICAgICAgc3RkOjpwcm9jZXNzOjpleGl0KDEpOworICAgICAgICB9CisgICAgfQorfQorCitmbiBydW4oKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIGxldCBvcHRpb25zID0gY2xhcF9hcHAhKHJ1c3RfdHV0b3JpYWxfY2xpZW50ID0+CisgICAgICAgICh2ZXJzaW9uOiAiMC4xLjAiKQorICAgICAgICAoYXV0aG9yOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IikKKyAgICAgICAgKGFib3V0OiAiVGhyaWZ0IFJ1c3QgdHV0b3JpYWwgY2xpZW50IikKKyAgICAgICAgKEBhcmcgaG9zdDogLS1ob3N0ICt0YWtlc192YWx1ZSAiaG9zdCBvbiB3aGljaCB0aGUgdHV0b3JpYWwgc2VydmVyIGxpc3RlbnMiKQorICAgICAgICAoQGFyZyBwb3J0OiAtLXBvcnQgK3Rha2VzX3ZhbHVlICJwb3J0IG9uIHdoaWNoIHRoZSB0dXRvcmlhbCBzZXJ2ZXIgbGlzdGVucyIpCisgICAgKTsKKyAgICBsZXQgbWF0Y2hlcyA9IG9wdGlvbnMuZ2V0X21hdGNoZXMoKTsKKworICAgIC8vIGdldCBhbnkgcGFzc2VkLWluIGFyZ3Mgb3IgdGhlIGRlZmF1bHRzCisgICAgbGV0IGhvc3QgPSBtYXRjaGVzLnZhbHVlX29mKCJob3N0IikudW53cmFwX29yKCIxMjcuMC4wLjEiKTsKKyAgICBsZXQgcG9ydCA9IHZhbHVlX3QhKG1hdGNoZXMsICJwb3J0IiwgdTE2KS51bndyYXBfb3IoOTA5MCk7CisKKyAgICAvLyBidWlsZCBvdXIgY2xpZW50IGFuZCBjb25uZWN0IHRvIHRoZSBob3N0OnBvcnQKKyAgICBsZXQgbXV0IGNsaWVudCA9IG5ld19jbGllbnQoaG9zdCwgcG9ydCk/OworCisgICAgLy8gYWxyaWdodCEKKyAgICAvLyBsZXQncyBzdGFydCBtYWtpbmcgc29tZSBjYWxscworCisgICAgLy8gbGV0J3Mgc3RhcnQgd2l0aCBhIHBpbmc7IHRoZSBzZXJ2ZXIgc2hvdWxkIHJlc3BvbmQKKyAgICBwcmludGxuISgicGluZyEiKTsKKyAgICBjbGllbnQucGluZygpPzsKKworICAgIC8vIHNpbXBsZSBhZGQKKyAgICBwcmludGxuISgiYWRkIik7CisgICAgbGV0IHJlcyA9IGNsaWVudC5hZGQoMSwgMik/OworICAgIHByaW50bG4hKCJhZGRlZCAxLCAyIGFuZCBnb3Qge30iLCByZXMpOworCisgICAgbGV0IGxvZ2lkID0gMzI7CisKKyAgICAvLyBsZXQncyBkby4uLmEgbXVsdGlwbHkhCisgICAgbGV0IHJlcyA9IGNsaWVudC5jYWxjdWxhdGUobG9naWQsIFdvcms6Om5ldyg3LCA4LCBPcGVyYXRpb246Ok11bHRpcGx5LCBOb25lKSk/OworICAgIHByaW50bG4hKCJtdWx0aXBsaWVkIDcgYW5kIDggYW5kIGdvdCB7fSIsIHJlcyk7CisKKyAgICAvLyBsZXQncyBnZXQgdGhlIGxvZyBmb3IgaXQKKyAgICBsZXQgcmVzID0gY2xpZW50LmdldF9zdHJ1Y3QoMzIpPzsKKyAgICBwcmludGxuISgiZ290IGxvZyB7Oj99IGZvciBvcGVyYXRpb24ge30iLCByZXMsIGxvZ2lkKTsKKworICAgIC8vIG9rIC0gbGV0J3MgYmUgYmFkIDooCisgICAgLy8gZG8gYSBkaXZpZGUgYnkgMAorICAgIC8vIGxvZ2lkIGRvZXNuJ3QgbWF0dGVyOyB3b24ndCBiZSByZWNvcmRlZAorICAgIGxldCByZXMgPSBjbGllbnQuY2FsY3VsYXRlKDc3LCBXb3JrOjpuZXcoMiwgMCwgT3BlcmF0aW9uOjpEaXZpZGUsICJ3ZSBiYWQiLnRvX293bmVkKCkpKTsKKworICAgIC8vIHdlIHNob3VsZCBoYXZlIGdvdHRlbiBhbiBleGNlcHRpb24gYmFjaworICAgIG1hdGNoIHJlcyB7CisgICAgICAgIE9rKHYpID0+IHBhbmljISgic2hvdWxkIG5vdCBoYXZlIHN1Y2NlZWRlZCB3aXRoIHJlc3VsdCB7fSIsIHYpLAorICAgICAgICBFcnIoZSkgPT4gcHJpbnRsbiEoImRpdmlkZSBieSB6ZXJvIGZhaWxlZCB3aXRoIGVycm9yIHs6P30iLCBlKSwKKyAgICB9CisKKyAgICAvLyBsZXQncyBkbyBhIG9uZS13YXkgY2FsbAorICAgIHByaW50bG4hKCJ6aXAiKTsKKyAgICBjbGllbnQuemlwKCk/OworCisgICAgLy8gYW5kIHRoZW4gY2xvc2Ugb3V0IHdpdGggYSBmaW5hbCBwaW5nCisgICAgcHJpbnRsbiEoInBpbmchIik7CisgICAgY2xpZW50LnBpbmcoKT87CisKKyAgICBPaygoKSkKK30KKwordHlwZSBDbGllbnRJbnB1dFByb3RvY29sID0gVENvbXBhY3RJbnB1dFByb3RvY29sPFRGcmFtZWRSZWFkVHJhbnNwb3J0PFJlYWRIYWxmPFRUY3BDaGFubmVsPj4+OwordHlwZSBDbGllbnRPdXRwdXRQcm90b2NvbCA9IFRDb21wYWN0T3V0cHV0UHJvdG9jb2w8VEZyYW1lZFdyaXRlVHJhbnNwb3J0PFdyaXRlSGFsZjxUVGNwQ2hhbm5lbD4+PjsKKworZm4gbmV3X2NsaWVudCgKKyAgICBob3N0OiAmc3RyLAorICAgIHBvcnQ6IHUxNiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8Q2FsY3VsYXRvclN5bmNDbGllbnQ8Q2xpZW50SW5wdXRQcm90b2NvbCwgQ2xpZW50T3V0cHV0UHJvdG9jb2w+PiB7CisgICAgbGV0IG11dCBjID0gVFRjcENoYW5uZWw6Om5ldygpOworCisgICAgLy8gb3BlbiB0aGUgdW5kZXJseWluZyBUQ1Agc3RyZWFtCisgICAgcHJpbnRsbiEoImNvbm5lY3RpbmcgdG8gdHV0b3JpYWwgc2VydmVyIG9uIHt9Ont9IiwgaG9zdCwgcG9ydCk7CisgICAgYy5vcGVuKCZmb3JtYXQhKCJ7fTp7fSIsIGhvc3QsIHBvcnQpKT87CisKKyAgICAvLyBjbG9uZSB0aGUgVENQIGNoYW5uZWwgaW50byB0d28gaGFsdmVzLCBvbmUgd2hpY2gKKyAgICAvLyB3ZSdsbCB1c2UgZm9yIHJlYWRpbmcsIHRoZSBvdGhlciBmb3Igd3JpdGluZworICAgIGxldCAoaV9jaGFuLCBvX2NoYW4pID0gYy5zcGxpdCgpPzsKKworICAgIC8vIHdyYXAgdGhlIHJhdyBzb2NrZXRzIChzbG93KSB3aXRoIGEgYnVmZmVyZWQgdHJhbnNwb3J0IG9mIHNvbWUga2luZAorICAgIGxldCBpX3RyYW4gPSBURnJhbWVkUmVhZFRyYW5zcG9ydDo6bmV3KGlfY2hhbik7CisgICAgbGV0IG9fdHJhbiA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6bmV3KG9fY2hhbik7CisKKyAgICAvLyBub3cgY3JlYXRlIHRoZSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbnMKKyAgICBsZXQgaV9wcm90ID0gVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcoaV90cmFuKTsKKyAgICBsZXQgb19wcm90ID0gVENvbXBhY3RPdXRwdXRQcm90b2NvbDo6bmV3KG9fdHJhbik7CisKKyAgICAvLyB3ZSdyZSBkb25lIQorICAgIE9rKENhbGN1bGF0b3JTeW5jQ2xpZW50OjpuZXcoaV9wcm90LCBvX3Byb3QpKQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcnMvc3JjL2Jpbi90dXRvcmlhbF9zZXJ2ZXIucnMgYi90dXRvcmlhbC9ycy9zcmMvYmluL3R1dG9yaWFsX3NlcnZlci5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWIxYTJiCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcnMvc3JjL2Jpbi90dXRvcmlhbF9zZXJ2ZXIucnMKQEAgLTAsMCArMSwxNzkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI1ttYWNyb191c2VdCitleHRlcm4gY3JhdGUgY2xhcDsKKworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnRfdHV0b3JpYWw7CisKK3VzZSBzdGQ6OmNvbGxlY3Rpb25zOjpIYXNoTWFwOwordXNlIHN0ZDo6Y29udmVydDo6e0Zyb20sIEludG99OwordXNlIHN0ZDo6ZGVmYXVsdDo6RGVmYXVsdDsKK3VzZSBzdGQ6OnN5bmM6Ok11dGV4OworCit1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RDb21wYWN0SW5wdXRQcm90b2NvbEZhY3RvcnksIFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5fTsKK3VzZSB0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlcjsKKwordXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5fTsKK3VzZSB0aHJpZnRfdHV0b3JpYWw6OnNoYXJlZDo6e1NoYXJlZFNlcnZpY2VTeW5jSGFuZGxlciwgU2hhcmVkU3RydWN0fTsKK3VzZSB0aHJpZnRfdHV0b3JpYWw6OnR1dG9yaWFsOjp7Q2FsY3VsYXRvclN5bmNIYW5kbGVyLCBDYWxjdWxhdG9yU3luY1Byb2Nlc3Nvcn07Cit1c2UgdGhyaWZ0X3R1dG9yaWFsOjp0dXRvcmlhbDo6e0ludmFsaWRPcGVyYXRpb24sIE9wZXJhdGlvbiwgV29ya307CisKK2ZuIG1haW4oKSB7CisgICAgbWF0Y2ggcnVuKCkgeworICAgICAgICBPaygoKSkgPT4gcHJpbnRsbiEoInR1dG9yaWFsIHNlcnZlciByYW4gc3VjY2Vzc2Z1bGx5IiksCisgICAgICAgIEVycihlKSA9PiB7CisgICAgICAgICAgICBwcmludGxuISgidHV0b3JpYWwgc2VydmVyIGZhaWxlZCB3aXRoIGVycm9yIHs6P30iLCBlKTsKKyAgICAgICAgICAgIHN0ZDo6cHJvY2Vzczo6ZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworZm4gcnVuKCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgb3B0aW9ucyA9IGNsYXBfYXBwIShydXN0X3R1dG9yaWFsX3NlcnZlciA9PgorICAgICAgICAodmVyc2lvbjogIjAuMS4wIikKKyAgICAgICAgKGF1dGhvcjogIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiIpCisgICAgICAgIChhYm91dDogIlRocmlmdCBSdXN0IHR1dG9yaWFsIHNlcnZlciIpCisgICAgICAgIChAYXJnIHBvcnQ6IC0tcG9ydCArdGFrZXNfdmFsdWUgInBvcnQgb24gd2hpY2ggdGhlIHR1dG9yaWFsIHNlcnZlciBsaXN0ZW5zIikKKyAgICApOworICAgIGxldCBtYXRjaGVzID0gb3B0aW9ucy5nZXRfbWF0Y2hlcygpOworCisgICAgbGV0IHBvcnQgPSB2YWx1ZV90IShtYXRjaGVzLCAicG9ydCIsIHUxNikudW53cmFwX29yKDkwOTApOworICAgIGxldCBsaXN0ZW5fYWRkcmVzcyA9IGZvcm1hdCEoIjEyNy4wLjAuMTp7fSIsIHBvcnQpOworCisgICAgcHJpbnRsbiEoImJpbmRpbmcgdG8ge30iLCBsaXN0ZW5fYWRkcmVzcyk7CisKKyAgICBsZXQgaV90cmFuX2ZhY3QgPSBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpOworICAgIGxldCBpX3Byb3RfZmFjdCA9IFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpOworCisgICAgbGV0IG9fdHJhbl9mYWN0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCk7CisgICAgbGV0IG9fcHJvdF9mYWN0ID0gVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpOworCisgICAgLy8gZGVtdXggaW5jb21pbmcgbWVzc2FnZXMKKyAgICBsZXQgcHJvY2Vzc29yID0gQ2FsY3VsYXRvclN5bmNQcm9jZXNzb3I6Om5ldyhDYWxjdWxhdG9yU2VydmVyIHsKKyAgICAgICAgLi5EZWZhdWx0OjpkZWZhdWx0KCkKKyAgICB9KTsKKworICAgIC8vIGNyZWF0ZSB0aGUgc2VydmVyIGFuZCBzdGFydCBsaXN0ZW5pbmcKKyAgICBsZXQgbXV0IHNlcnZlciA9IFRTZXJ2ZXI6Om5ldygKKyAgICAgICAgaV90cmFuX2ZhY3QsCisgICAgICAgIGlfcHJvdF9mYWN0LAorICAgICAgICBvX3RyYW5fZmFjdCwKKyAgICAgICAgb19wcm90X2ZhY3QsCisgICAgICAgIHByb2Nlc3NvciwKKyAgICAgICAgMTAsCisgICAgKTsKKworICAgIHNlcnZlci5saXN0ZW4oJmxpc3Rlbl9hZGRyZXNzKQorfQorCisvLy8gSGFuZGxlcyBpbmNvbWluZyBDYWxjdWxhdG9yIHNlcnZpY2UgY2FsbHMuCitzdHJ1Y3QgQ2FsY3VsYXRvclNlcnZlciB7CisgICAgbG9nOiBNdXRleDxIYXNoTWFwPGkzMiwgU2hhcmVkU3RydWN0Pj4sCit9CisKK2ltcGwgRGVmYXVsdCBmb3IgQ2FsY3VsYXRvclNlcnZlciB7CisgICAgZm4gZGVmYXVsdCgpIC0+IENhbGN1bGF0b3JTZXJ2ZXIgeworICAgICAgICBDYWxjdWxhdG9yU2VydmVyIHsKKyAgICAgICAgICAgIGxvZzogTXV0ZXg6Om5ldyhIYXNoTWFwOjpuZXcoKSksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIHNpbmNlIENhbGN1bGF0b3IgZXh0ZW5kcyBTaGFyZWRTZXJ2aWNlIHdlIGhhdmUgdG8gaW1wbGVtZW50IHRoZQorLy8gaGFuZGxlciBmb3IgYm90aCB0cmFpdHMuCisvLworCisvLyBTaGFyZWRTZXJ2aWNlIGhhbmRsZXIKK2ltcGwgU2hhcmVkU2VydmljZVN5bmNIYW5kbGVyIGZvciBDYWxjdWxhdG9yU2VydmVyIHsKKyAgICBmbiBoYW5kbGVfZ2V0X3N0cnVjdCgmc2VsZiwga2V5OiBpMzIpIC0+IHRocmlmdDo6UmVzdWx0PFNoYXJlZFN0cnVjdD4geworICAgICAgICBsZXQgbG9nID0gc2VsZi5sb2cubG9jaygpLnVud3JhcCgpOworICAgICAgICBsb2cuZ2V0KCZrZXkpCisgICAgICAgICAgICAuY2xvbmVkKCkKKyAgICAgICAgICAgIC5va19vcl9lbHNlKHx8IGZvcm1hdCEoImNvdWxkIG5vdCBmaW5kIGxvZyBmb3Iga2V5IHt9Iiwga2V5KS5pbnRvKCkpCisgICAgfQorfQorCisvLyBDYWxjdWxhdG9yIGhhbmRsZXIKK2ltcGwgQ2FsY3VsYXRvclN5bmNIYW5kbGVyIGZvciBDYWxjdWxhdG9yU2VydmVyIHsKKyAgICBmbiBoYW5kbGVfcGluZygmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgcHJpbnRsbiEoInBvbmchIik7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIGhhbmRsZV9hZGQoJnNlbGYsIG51bTE6IGkzMiwgbnVtMjogaTMyKSAtPiB0aHJpZnQ6OlJlc3VsdDxpMzI+IHsKKyAgICAgICAgcHJpbnRsbiEoImhhbmRsaW5nIGFkZDogbjE6e30gbjI6e30iLCBudW0xLCBudW0yKTsKKyAgICAgICAgT2sobnVtMSArIG51bTIpCisgICAgfQorCisgICAgZm4gaGFuZGxlX2NhbGN1bGF0ZSgmc2VsZiwgbG9naWQ6IGkzMiwgdzogV29yaykgLT4gdGhyaWZ0OjpSZXN1bHQ8aTMyPiB7CisgICAgICAgIHByaW50bG4hKCJoYW5kbGluZyBjYWxjdWxhdGU6IGw6e30sIHc6ezo/fSIsIGxvZ2lkLCB3KTsKKworICAgICAgICBsZXQgcmVzID0gaWYgbGV0IFNvbWUocmVmIG9wKSA9IHcub3AgeworICAgICAgICAgICAgaWYgdy5udW0xLmlzX25vbmUoKSB8fCB3Lm51bTIuaXNfbm9uZSgpIHsKKyAgICAgICAgICAgICAgICBFcnIoSW52YWxpZE9wZXJhdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHdoYXRfb3A6IFNvbWUoKm9wIGFzIGkzMiksCisgICAgICAgICAgICAgICAgICAgIHdoeTogU29tZSgibm8gb3BlcmFuZHMgc3BlY2lmaWVkIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IEkgZG9uJ3QgaGF2ZSB0byBjYWxsIHVud3JhcCgpIG11bHRpcGxlIHRpbWVzIGJlbG93CisgICAgICAgICAgICAgICAgbGV0IG51bTEgPSB3Lm51bTEuYXNfcmVmKCkuZXhwZWN0KCJvcGVyYW5kcyBjaGVja2VkIik7CisgICAgICAgICAgICAgICAgbGV0IG51bTIgPSB3Lm51bTIuYXNfcmVmKCkuZXhwZWN0KCJvcGVyYW5kcyBjaGVja2VkIik7CisKKyAgICAgICAgICAgICAgICBtYXRjaCAqb3AgeworICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb246OkFkZCA9PiBPayhudW0xICsgbnVtMiksCisgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbjo6U3VidHJhY3QgPT4gT2sobnVtMSAtIG51bTIpLAorICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb246Ok11bHRpcGx5ID0+IE9rKG51bTEgKiBudW0yKSwKKyAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uOjpEaXZpZGUgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKm51bTIgPT0gMCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyKEludmFsaWRPcGVyYXRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGF0X29wOiBTb21lKCpvcCBhcyBpMzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aHk6IFNvbWUoImRpdmlkZSBieSAwIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPayhudW0xIC8gbnVtMikKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEVycihJbnZhbGlkT3BlcmF0aW9uOjpuZXcoCisgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICAibm8gb3BlcmF0aW9uIHNwZWNpZmllZCIudG9fb3duZWQoKSwKKyAgICAgICAgICAgICkpCisgICAgICAgIH07CisKKyAgICAgICAgLy8gaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBsb2cgaXQKKyAgICAgICAgaWYgbGV0IE9rKHJlZiB2KSA9IHJlcyB7CisgICAgICAgICAgICBsZXQgbXV0IGxvZyA9IHNlbGYubG9nLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgICAgIGxvZy5pbnNlcnQobG9naWQsIFNoYXJlZFN0cnVjdDo6bmV3KGxvZ2lkLCBmb3JtYXQhKCJ7fSIsIHYpKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGUgdHJ5ISBtYWNybyBhdXRvbWF0aWNhbGx5IG1hcHMgZXJyb3JzCisgICAgICAgIC8vIGJ1dCwgc2luY2Ugd2UgYXJlbid0IHVzaW5nIHRoYXQgaGVyZSB3ZSBoYXZlIHRvIG1hcCBlcnJvcnMgbWFudWFsbHkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gZXhjZXB0aW9uIHN0cnVjdHMgZGVmaW5lZCBpbiB0aGUgSURMIGhhdmUgYW4gYXV0by1nZW5lcmF0ZWQKKyAgICAgICAgLy8gaW1wbCBvZiBGcm9tOjpmcm9tCisgICAgICAgIHJlcy5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gaGFuZGxlX3ppcCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgcHJpbnRsbiEoImhhbmRsaW5nIHppcCIpOworICAgICAgICBPaygoKSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9ycy9zcmMvbGliLnJzIGIvdHV0b3JpYWwvcnMvc3JjL2xpYi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDAwN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcnMvc3JjL2xpYi5ycwpAQCAtMCwwICsxLDIzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2V4dGVybiBjcmF0ZSBvcmRlcmVkX2Zsb2F0OworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0cnlfZnJvbTsKKworcHViIG1vZCBzaGFyZWQ7CitwdWIgbW9kIHR1dG9yaWFsOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvc2hhcmVkLnRocmlmdCBiL3R1dG9yaWFsL3NoYXJlZC50aHJpZnQKaW5kZXggNDc1ZTdmOC4uZjE2ODViZCAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvc2hhcmVkLnRocmlmdAorKysgYi90dXRvcmlhbC9zaGFyZWQudGhyaWZ0CkBAIC0yMiw5ICsyMiwxNSBAQAogICogdGhlc2UgZGVmaW5pdGlvbnMuCiAgKi8KIAorbmFtZXNwYWNlIGNsIHNoYXJlZAogbmFtZXNwYWNlIGNwcCBzaGFyZWQKK25hbWVzcGFjZSBkIHNoYXJlIC8vICJzaGFyZWQiIHdvdWxkIGNvbGxpZGUgd2l0aCB0aGUgZXBvbnltb3VzIEQga2V5d29yZC4KK25hbWVzcGFjZSBkYXJ0IHNoYXJlZAogbmFtZXNwYWNlIGphdmEgc2hhcmVkCiBuYW1lc3BhY2UgcGVybCBzaGFyZWQKK25hbWVzcGFjZSBwaHAgc2hhcmVkCituYW1lc3BhY2UgaGF4ZSBzaGFyZWQKK25hbWVzcGFjZSBuZXRjb3JlIHNoYXJlZAogCiBzdHJ1Y3QgU2hhcmVkU3RydWN0IHsKICAgMTogaTMyIGtleQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0IGIvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CmluZGV4IDNlYTQ5NmMuLmUwMjc1NDYgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorKysgYi90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKQEAgLTMyLDcgKzMyLDcgQEAKICAqIFRoZSBmaXJzdCB0aGluZyB0byBrbm93IGFib3V0IGFyZSB0eXBlcy4gVGhlIGF2YWlsYWJsZSB0eXBlcyBpbiBUaHJpZnQgYXJlOgogICoKICAqICBib29sICAgICAgICBCb29sZWFuLCBvbmUgYnl0ZQotICogIGJ5dGUgICAgICAgIFNpZ25lZCBieXRlCisgKiAgaTggKGJ5dGUpICAgU2lnbmVkIDgtYml0IGludGVnZXIKICAqICBpMTYgICAgICAgICBTaWduZWQgMTYtYml0IGludGVnZXIKICAqICBpMzIgICAgICAgICBTaWduZWQgMzItYml0IGludGVnZXIKICAqICBpNjQgICAgICAgICBTaWduZWQgNjQtYml0IGludGVnZXIKQEAgLTYyLDEwICs2MiwxNiBAQAogICogVGhyaWZ0IGZpbGVzIGNhbiBuYW1lc3BhY2UsIHBhY2thZ2UsIG9yIHByZWZpeCB0aGVpciBvdXRwdXQgaW4gdmFyaW91cwogICogdGFyZ2V0IGxhbmd1YWdlcy4KICAqLworCituYW1lc3BhY2UgY2wgdHV0b3JpYWwKIG5hbWVzcGFjZSBjcHAgdHV0b3JpYWwKK25hbWVzcGFjZSBkIHR1dG9yaWFsCituYW1lc3BhY2UgZGFydCB0dXRvcmlhbAogbmFtZXNwYWNlIGphdmEgdHV0b3JpYWwKIG5hbWVzcGFjZSBwaHAgdHV0b3JpYWwKIG5hbWVzcGFjZSBwZXJsIHR1dG9yaWFsCituYW1lc3BhY2UgaGF4ZSB0dXRvcmlhbAorbmFtZXNwYWNlIG5ldGNvcmUgdHV0b3JpYWwKIAogLyoqCiAgKiBUaHJpZnQgbGV0cyB5b3UgZG8gdHlwZWRlZnMgdG8gZ2V0IHByZXR0eSBuYW1lcyBmb3IgeW91ciB0eXBlcy4gU3RhbmRhcmQKQEAgLTExMSw3ICsxMTcsNyBAQAogICogU3RydWN0cyBjYW4gYWxzbyBiZSBleGNlcHRpb25zLCBpZiB0aGV5IGFyZSBuYXN0eS4KICAqLwogZXhjZXB0aW9uIEludmFsaWRPcGVyYXRpb24gewotICAxOiBpMzIgd2hhdCwKKyAgMTogaTMyIHdoYXRPcCwKICAgMjogc3RyaW5nIHdoeQogfQogCg==